From 56b1993a2f5bba4758982bf1e2950ddc4702f6f1 Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Fri, 1 Dec 2023 13:15:58 +0100 Subject: [PATCH 001/345] chore(p256): adjust p256 precompile address (#2110) * adjust p256 precompile address * address linter * add changelog entry --- CHANGELOG.md | 1 + precompiles/p256/p256.go | 5 ++--- x/evm/types/params.go | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ef36c6825..dbe4408ce6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -132,6 +132,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (bank) [#2096](https://github.com/evmos/evmos/pull/2096) Add `bank` precompile integration tests. - (osmosis-outpost) [#2077](https://github.com/evmos/evmos/pull/2077) Update Osmosis outpost to use cross-chain swap contract V1. - (app) [#2104](https://github.com/evmos/evmos/pull/2104) Refactor code to use `sdkmath.Int` and `sdkmath.LegacyDec` instead of the SDK types +- (p256-precompile) [#2110](https://github.com/evmos/evmos/pull/2110) Adjust `p256` precompile address. ### Bug Fixes diff --git a/precompiles/p256/p256.go b/precompiles/p256/p256.go index 71a412209e..46fda76579 100644 --- a/precompiles/p256/p256.go +++ b/precompiles/p256/p256.go @@ -33,7 +33,7 @@ const ( ) // PrecompileAddress defines the hex address of the p256 precompiled contract. -const PrecompileAddress = "0x0000000000000000000000000000000000000013" +const PrecompileAddress = "0x000000000000000000000000000000000000000b" // Precompile secp256r1 (P256) signature verification // implemented as a native contract as per EIP-7212. @@ -41,9 +41,8 @@ const PrecompileAddress = "0x0000000000000000000000000000000000000013" type Precompile struct{} // Address defines the address of the p256 precompiled contract. -// address: 0x0000000000000000000000000000000000000013 func (Precompile) Address() common.Address { - return common.BytesToAddress([]byte{19}) + return common.HexToAddress(PrecompileAddress) } // RequiredGas returns the static gas required to execute the precompiled contract. diff --git a/x/evm/types/params.go b/x/evm/types/params.go index 1f7089c2c1..63d74db09d 100644 --- a/x/evm/types/params.go +++ b/x/evm/types/params.go @@ -16,6 +16,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/params" + "github.com/evmos/evmos/v16/precompiles/p256" "github.com/evmos/evmos/v16/types" "github.com/evmos/evmos/v16/utils" "golang.org/x/exp/slices" @@ -32,7 +33,7 @@ var ( DefaultEnableCall = true // AvailableEVMExtensions defines the default active precompiles AvailableEVMExtensions = []string{ - "0x0000000000000000000000000000000000000013", // P256 precompile + p256.PrecompileAddress, // P256 precompile "0x0000000000000000000000000000000000000400", // Bech32 precompile "0x0000000000000000000000000000000000000800", // Staking precompile "0x0000000000000000000000000000000000000801", // Distribution precompile From 836a6d7cf112b74c0e8fa216d9b1d69616a1c0fc Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Fri, 1 Dec 2023 13:27:24 +0100 Subject: [PATCH 002/345] chore(proto): run make proto-all (#2111) run make proto-all Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- crypto/ethsecp256k1/keys.pb.go | 6 +- types/account.pb.go | 4 +- types/dynamic_fee.pb.go | 4 +- types/indexer.pb.go | 34 ++--- types/web3.pb.go | 4 +- x/epochs/types/genesis.pb.go | 56 +++---- x/epochs/types/query.pb.go | 4 +- x/erc20/types/erc20.pb.go | 60 ++++---- x/erc20/types/events.pb.go | 40 ++--- x/erc20/types/genesis.pb.go | 4 +- x/erc20/types/query.pb.go | 62 ++++---- x/erc20/types/tx.pb.go | 14 +- x/evm/types/events.pb.go | 44 +++--- x/evm/types/evm.pb.go | 152 +++++++++--------- x/evm/types/genesis.pb.go | 34 ++--- x/evm/types/query.pb.go | 186 +++++++++++------------ x/evm/types/tx.pb.go | 118 +++++++------- x/feemarket/types/events.pb.go | 6 +- x/feemarket/types/feemarket.pb.go | 4 +- x/feemarket/types/genesis.pb.go | 6 +- x/feemarket/types/query.pb.go | 52 +++---- x/feemarket/types/tx.pb.go | 4 +- x/inflation/v1/types/genesis.pb.go | 4 +- x/inflation/v1/types/inflation.pb.go | 46 +++--- x/inflation/v1/types/query.pb.go | 6 +- x/inflation/v1/types/tx.pb.go | 4 +- x/revenue/v1/types/events.pb.go | 38 ++--- x/revenue/v1/types/genesis.pb.go | 44 +++--- x/revenue/v1/types/query.pb.go | 26 ++-- x/revenue/v1/types/revenue.pb.go | 4 +- x/revenue/v1/types/tx.pb.go | 66 ++++---- x/vesting/migrations/types/vesting.pb.go | 54 +++---- x/vesting/types/events.pb.go | 38 ++--- x/vesting/types/query.pb.go | 44 +++--- x/vesting/types/tx.pb.go | 102 ++++++------- x/vesting/types/vesting.pb.go | 62 ++++---- 36 files changed, 718 insertions(+), 718 deletions(-) diff --git a/crypto/ethsecp256k1/keys.pb.go b/crypto/ethsecp256k1/keys.pb.go index c23021774d..93ec272866 100644 --- a/crypto/ethsecp256k1/keys.pb.go +++ b/crypto/ethsecp256k1/keys.pb.go @@ -138,9 +138,9 @@ var fileDescriptor_0c10cadcf35beb64 = []byte{ 0x33, 0x28, 0x49, 0x73, 0xb1, 0x07, 0x14, 0x65, 0x96, 0x61, 0x55, 0xe2, 0xe4, 0x71, 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, 0x7a, 0xe9, 0x99, 0x25, 0x19, 0xa5, 0x49, 0x7a, - 0xc9, 0xf9, 0xb9, 0xfa, 0xa9, 0x65, 0xb9, 0xf9, 0xc5, 0x50, 0xb2, 0xcc, 0xd0, 0x14, 0xe6, 0x1d, - 0x64, 0xe7, 0x25, 0xb1, 0x81, 0xdd, 0x63, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, 0x6f, 0x02, 0xe3, - 0x1e, 0xf6, 0x00, 0x00, 0x00, + 0xc9, 0xf9, 0xb9, 0xfa, 0xa9, 0x65, 0xb9, 0xf9, 0xc5, 0x50, 0xb2, 0xcc, 0xd0, 0x0c, 0xe6, 0x1d, + 0x64, 0xe7, 0x25, 0xb1, 0x81, 0xdd, 0x63, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, 0x03, 0x69, 0xeb, + 0xbb, 0xf6, 0x00, 0x00, 0x00, } func (m *PubKey) Marshal() (dAtA []byte, err error) { diff --git a/types/account.pb.go b/types/account.pb.go index 907a9c1c0b..4774422c02 100644 --- a/types/account.pb.go +++ b/types/account.pb.go @@ -92,8 +92,8 @@ var fileDescriptor_4edc057d42a619ef = []byte{ 0xa5, 0x74, 0x8b, 0x53, 0xb2, 0xf5, 0x2b, 0x20, 0x81, 0x03, 0x09, 0x32, 0x6c, 0xee, 0x86, 0xba, 0xc4, 0xd3, 0xc9, 0xea, 0xc4, 0x23, 0x39, 0xc6, 0x0b, 0x8f, 0xe4, 0x18, 0x1f, 0x3c, 0x92, 0x63, 0x9c, 0xf0, 0x58, 0x8e, 0xe1, 0xc2, 0x63, 0x39, 0x86, 0x1b, 0x8f, 0xe5, 0x18, 0xa2, 0x14, 0x90, - 0x6c, 0x48, 0x2d, 0x03, 0x59, 0x00, 0x21, 0xcb, 0x0c, 0x4d, 0x21, 0x06, 0x27, 0xb1, 0x81, 0x83, - 0xcf, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0x2b, 0xbc, 0xb4, 0x5b, 0xc7, 0x01, 0x00, 0x00, + 0x6c, 0x48, 0x2d, 0x03, 0x59, 0x00, 0x21, 0xcb, 0x0c, 0xcd, 0x20, 0x06, 0x27, 0xb1, 0x81, 0x83, + 0xcf, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0x52, 0xd6, 0xc9, 0x4a, 0xc7, 0x01, 0x00, 0x00, } func (m *EthAccount) Marshal() (dAtA []byte, err error) { diff --git a/types/dynamic_fee.pb.go b/types/dynamic_fee.pb.go index 529bb832eb..5c2b093b37 100644 --- a/types/dynamic_fee.pb.go +++ b/types/dynamic_fee.pb.go @@ -86,8 +86,8 @@ var fileDescriptor_9d7cf05c9992c480 = []byte{ 0x08, 0x80, 0xea, 0x0b, 0x00, 0x69, 0x73, 0xb2, 0x3a, 0xf1, 0x48, 0x8e, 0xf1, 0xc2, 0x23, 0x39, 0xc6, 0x07, 0x8f, 0xe4, 0x18, 0x27, 0x3c, 0x96, 0x63, 0xb8, 0xf0, 0x58, 0x8e, 0xe1, 0xc6, 0x63, 0x39, 0x86, 0x28, 0x85, 0xf4, 0xcc, 0x92, 0x8c, 0xd2, 0x24, 0xbd, 0xe4, 0xfc, 0x5c, 0xfd, 0xd4, - 0xb2, 0xdc, 0xfc, 0x62, 0x28, 0x59, 0x66, 0x68, 0x0a, 0xf1, 0x66, 0x12, 0x1b, 0xd8, 0xb9, 0xc6, - 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xcf, 0xe6, 0x98, 0x39, 0x00, 0x01, 0x00, 0x00, + 0xb2, 0xdc, 0xfc, 0x62, 0x28, 0x59, 0x66, 0x68, 0x06, 0xf1, 0x66, 0x12, 0x1b, 0xd8, 0xb9, 0xc6, + 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb6, 0x8c, 0xe5, 0x28, 0x00, 0x01, 0x00, 0x00, } func (m *ExtensionOptionDynamicFeeTx) Marshal() (dAtA []byte, err error) { diff --git a/types/indexer.pb.go b/types/indexer.pb.go index b2a32b7cff..1a224fcb1e 100644 --- a/types/indexer.pb.go +++ b/types/indexer.pb.go @@ -87,23 +87,23 @@ var fileDescriptor_1197e10a8be8ed28 = []byte{ // 298 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x44, 0x90, 0x31, 0x4b, 0xc3, 0x40, 0x18, 0x86, 0x73, 0xb6, 0x4d, 0xe3, 0xa1, 0x83, 0x51, 0x4a, 0x54, 0x88, 0x87, 0x53, 0xa6, 0x84, - 0x22, 0x2e, 0x1d, 0x5d, 0xc4, 0xf5, 0xa8, 0x8b, 0x4b, 0x48, 0x9b, 0xcf, 0xbb, 0x83, 0x5e, 0xaf, - 0xf4, 0xbe, 0x84, 0xf8, 0x0f, 0x1c, 0xfd, 0x09, 0xfe, 0x1c, 0xc7, 0x8e, 0x8e, 0xd2, 0xe2, 0xff, - 0x90, 0x5e, 0x42, 0x5d, 0x8e, 0x7b, 0x79, 0x9e, 0x8f, 0x17, 0x5e, 0xca, 0x00, 0x25, 0xac, 0xb5, - 0x5a, 0x62, 0x86, 0x6f, 0x2b, 0xb0, 0x59, 0x3d, 0xce, 0xd4, 0xb2, 0x84, 0x06, 0xd6, 0xe9, 0x6a, - 0x6d, 0xd0, 0x84, 0xe1, 0xc1, 0x48, 0x9d, 0x91, 0xd6, 0xe3, 0xab, 0x0b, 0x61, 0x84, 0x71, 0x38, - 0xdb, 0xff, 0x5a, 0xf3, 0xf6, 0x97, 0xd0, 0x60, 0xda, 0x70, 0xb0, 0xd5, 0x02, 0xc3, 0x11, 0xf5, - 0x25, 0x28, 0x21, 0x31, 0x22, 0x8c, 0x24, 0x3d, 0xde, 0xa5, 0xf0, 0x92, 0x06, 0xd8, 0xe4, 0xae, - 0x22, 0x3a, 0x62, 0x24, 0x39, 0xe5, 0x43, 0x6c, 0x9e, 0xf6, 0x31, 0xbc, 0xa6, 0xc7, 0xda, 0x8a, - 0x8e, 0xf5, 0x1c, 0x0b, 0xb4, 0x15, 0x2d, 0x64, 0xf4, 0x04, 0x50, 0xe6, 0x87, 0xdb, 0x3e, 0x23, - 0xc9, 0x80, 0x53, 0x40, 0x39, 0xed, 0xce, 0x47, 0xd4, 0x7f, 0x2d, 0xd4, 0x02, 0xca, 0x68, 0xc0, - 0x48, 0x12, 0xf0, 0x2e, 0xed, 0x1b, 0x45, 0x61, 0xf3, 0xca, 0x42, 0x19, 0xf9, 0x8c, 0x24, 0x7d, - 0x3e, 0x14, 0x85, 0x7d, 0xb6, 0x50, 0x86, 0x29, 0x3d, 0x9f, 0x57, 0xba, 0x5a, 0x14, 0xa8, 0x6a, - 0xc8, 0x0f, 0xd6, 0xd0, 0x59, 0x67, 0xff, 0xe8, 0xb1, 0xf5, 0x27, 0xfd, 0xf7, 0xcf, 0x1b, 0xef, - 0x61, 0xf2, 0xb5, 0x8d, 0xc9, 0x66, 0x1b, 0x93, 0x9f, 0x6d, 0x4c, 0x3e, 0x76, 0xb1, 0xb7, 0xd9, - 0xc5, 0xde, 0xf7, 0x2e, 0xf6, 0x5e, 0x98, 0x50, 0x28, 0xab, 0x59, 0x3a, 0x37, 0x3a, 0x83, 0x5a, - 0x1b, 0xdb, 0xbd, 0xf5, 0xf8, 0xbe, 0x9d, 0x77, 0xe6, 0xbb, 0xa9, 0xee, 0xfe, 0x02, 0x00, 0x00, - 0xff, 0xff, 0x82, 0xe4, 0x15, 0x73, 0x78, 0x01, 0x00, 0x00, + 0x22, 0x38, 0x74, 0x74, 0x11, 0xd7, 0xa3, 0x2e, 0x2e, 0x21, 0x6d, 0x3e, 0xef, 0x0e, 0x7a, 0xbd, + 0xd2, 0xfb, 0x12, 0xe2, 0x3f, 0x70, 0xf4, 0x27, 0xf8, 0x73, 0x1c, 0x3b, 0x3a, 0x4a, 0x8b, 0xff, + 0x43, 0x7a, 0x09, 0x75, 0x39, 0xee, 0xe5, 0x79, 0x3e, 0x5e, 0x78, 0x29, 0x03, 0x94, 0xb0, 0xd6, + 0x6a, 0x89, 0x19, 0xbe, 0xad, 0xc0, 0x66, 0xf5, 0x38, 0x53, 0xcb, 0x12, 0x1a, 0x58, 0xa7, 0xab, + 0xb5, 0x41, 0x13, 0x86, 0x07, 0x23, 0x75, 0x46, 0x5a, 0x8f, 0xaf, 0x2e, 0x84, 0x11, 0xc6, 0xe1, + 0x6c, 0xff, 0x6b, 0xcd, 0xdb, 0x5f, 0x42, 0x83, 0x69, 0xc3, 0xc1, 0x56, 0x0b, 0x0c, 0x47, 0xd4, + 0x97, 0xa0, 0x84, 0xc4, 0x88, 0x30, 0x92, 0xf4, 0x78, 0x97, 0xc2, 0x4b, 0x1a, 0x60, 0x93, 0xbb, + 0x8a, 0xe8, 0x88, 0x91, 0xe4, 0x94, 0x0f, 0xb1, 0x79, 0xda, 0xc7, 0xf0, 0x9a, 0x1e, 0x6b, 0x2b, + 0x3a, 0xd6, 0x73, 0x2c, 0xd0, 0x56, 0xb4, 0x90, 0xd1, 0x13, 0x40, 0x99, 0x1f, 0x6e, 0xfb, 0x8c, + 0x24, 0x03, 0x4e, 0x01, 0xe5, 0xb4, 0x3b, 0x1f, 0x51, 0xff, 0xb5, 0x50, 0x0b, 0x28, 0xa3, 0x01, + 0x23, 0x49, 0xc0, 0xbb, 0xb4, 0x6f, 0x14, 0x85, 0xcd, 0x2b, 0x0b, 0x65, 0xe4, 0x33, 0x92, 0xf4, + 0xf9, 0x50, 0x14, 0xf6, 0xd9, 0x42, 0x19, 0xa6, 0xf4, 0x7c, 0x5e, 0xe9, 0x6a, 0x51, 0xa0, 0xaa, + 0x21, 0x3f, 0x58, 0x43, 0x67, 0x9d, 0xfd, 0xa3, 0xc7, 0xd6, 0x9f, 0xf4, 0xdf, 0x3f, 0x6f, 0xbc, + 0x87, 0xc9, 0xd7, 0x36, 0x26, 0x9b, 0x6d, 0x4c, 0x7e, 0xb6, 0x31, 0xf9, 0xd8, 0xc5, 0xde, 0x66, + 0x17, 0x7b, 0xdf, 0xbb, 0xd8, 0x7b, 0x61, 0x42, 0xa1, 0xac, 0x66, 0xe9, 0xdc, 0xe8, 0x0c, 0x6a, + 0x6d, 0x6c, 0xf7, 0xd6, 0xe3, 0xfb, 0x76, 0xde, 0x99, 0xef, 0xa6, 0xba, 0xfb, 0x0b, 0x00, 0x00, + 0xff, 0xff, 0xfb, 0x8e, 0x68, 0x62, 0x78, 0x01, 0x00, 0x00, } func (m *TxResult) Marshal() (dAtA []byte, err error) { diff --git a/types/web3.pb.go b/types/web3.pb.go index d33535a254..a7cab8b794 100644 --- a/types/web3.pb.go +++ b/types/web3.pb.go @@ -95,8 +95,8 @@ var fileDescriptor_9eb7cd56e3c92bc3 = []byte{ 0x1b, 0x49, 0xd8, 0x8a, 0xa5, 0x63, 0x81, 0x3c, 0x83, 0x93, 0xd5, 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, 0x29, 0xa4, 0x67, 0x96, 0x64, 0x94, 0x26, 0xe9, 0x25, 0xe7, 0xe7, - 0xea, 0xa7, 0x96, 0xe5, 0xe6, 0x17, 0x43, 0xc9, 0x32, 0x43, 0x53, 0x48, 0x58, 0x27, 0xb1, 0x81, - 0x83, 0xce, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0x11, 0xc9, 0x9d, 0x0b, 0x85, 0x01, 0x00, 0x00, + 0xea, 0xa7, 0x96, 0xe5, 0xe6, 0x17, 0x43, 0xc9, 0x32, 0x43, 0x33, 0x48, 0x58, 0x27, 0xb1, 0x81, + 0x83, 0xce, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0x68, 0xa3, 0xe0, 0x1a, 0x85, 0x01, 0x00, 0x00, } func (m *ExtensionOptionsWeb3Tx) Marshal() (dAtA []byte, err error) { diff --git a/x/epochs/types/genesis.pb.go b/x/epochs/types/genesis.pb.go index a6376dd874..5ea4a89492 100644 --- a/x/epochs/types/genesis.pb.go +++ b/x/epochs/types/genesis.pb.go @@ -184,35 +184,35 @@ func init() { proto.RegisterFile("evmos/epochs/v1/genesis.proto", fileDescriptor var fileDescriptor_c74bc0b3e7fa01c2 = []byte{ // 463 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x53, 0xbf, 0x8f, 0xd3, 0x30, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x53, 0x31, 0x8f, 0xd3, 0x30, 0x14, 0xae, 0x69, 0x29, 0x57, 0x73, 0xe8, 0x84, 0x75, 0x40, 0xa8, 0x74, 0x4e, 0x14, 0x96, 0x22, - 0x90, 0xad, 0xf2, 0x43, 0x42, 0xb0, 0xf5, 0x40, 0x1c, 0x6b, 0xca, 0x80, 0x58, 0xaa, 0xb4, 0x75, - 0x1d, 0x4b, 0x97, 0x38, 0x4a, 0x5e, 0x2a, 0xba, 0x31, 0x33, 0xdd, 0xc8, 0x9f, 0x74, 0xe3, 0x8d, - 0x4c, 0x05, 0xb5, 0x1b, 0xe3, 0xfd, 0x05, 0x28, 0x76, 0x52, 0xca, 0x15, 0xc4, 0x12, 0xc5, 0xef, - 0xfb, 0xde, 0xf7, 0xf9, 0x7b, 0x7a, 0xc6, 0x47, 0x62, 0x1e, 0xeb, 0x9c, 0x8b, 0x54, 0x4f, 0xa2, - 0x9c, 0xcf, 0xfb, 0x5c, 0x8a, 0x44, 0xe4, 0x2a, 0x67, 0x69, 0xa6, 0x41, 0x93, 0x03, 0x03, 0x33, - 0x0b, 0xb3, 0x79, 0xbf, 0x7b, 0x28, 0xb5, 0xd4, 0x06, 0xe3, 0xe5, 0x9f, 0xa5, 0x75, 0xa9, 0xd4, - 0x5a, 0x9e, 0x0a, 0x6e, 0x4e, 0xe3, 0x62, 0xc6, 0xa7, 0x45, 0x16, 0x82, 0xd2, 0x49, 0x85, 0xbb, - 0x57, 0x71, 0x50, 0xb1, 0xc8, 0x21, 0x8c, 0x53, 0x4b, 0xf0, 0xbf, 0xb4, 0x70, 0xe7, 0x4d, 0x69, - 0xf2, 0x2e, 0x99, 0x69, 0x42, 0x31, 0x56, 0x53, 0x91, 0x80, 0x9a, 0x29, 0x91, 0x39, 0xc8, 0x43, - 0xbd, 0x4e, 0xb0, 0x55, 0x21, 0x1f, 0x30, 0xce, 0x21, 0xcc, 0x60, 0x54, 0xca, 0x38, 0xd7, 0x3c, - 0xd4, 0xbb, 0xf9, 0xa4, 0xcb, 0xac, 0x07, 0xab, 0x3d, 0xd8, 0xfb, 0xda, 0x63, 0x70, 0x74, 0xbe, - 0x74, 0x1b, 0x97, 0x4b, 0xf7, 0xf6, 0x22, 0x8c, 0x4f, 0x5f, 0xfa, 0xbf, 0x7b, 0xfd, 0xb3, 0xef, - 0x2e, 0x0a, 0x3a, 0xa6, 0x50, 0xd2, 0x49, 0x84, 0xf7, 0xea, 0xab, 0x3b, 0x4d, 0xa3, 0x7b, 0x7f, - 0x47, 0xf7, 0x75, 0x45, 0x18, 0xf4, 0x4b, 0xd9, 0x9f, 0x4b, 0x97, 0xd4, 0x2d, 0x8f, 0x75, 0xac, - 0x40, 0xc4, 0x29, 0x2c, 0x2e, 0x97, 0xee, 0x81, 0x35, 0xab, 0x31, 0xff, 0x6b, 0x69, 0xb5, 0x51, - 0x27, 0x0f, 0xf0, 0xad, 0x49, 0x91, 0x65, 0x22, 0x81, 0x91, 0x99, 0xae, 0xd3, 0xf2, 0x50, 0xaf, - 0x19, 0xec, 0x57, 0x45, 0x33, 0x0c, 0xf2, 0x19, 0x61, 0xe7, 0x0f, 0xd6, 0x68, 0x2b, 0xf7, 0xf5, - 0xff, 0xe6, 0x7e, 0x54, 0xe5, 0x76, 0xed, 0x55, 0xfe, 0xa5, 0x64, 0xa7, 0x70, 0x67, 0xdb, 0x79, - 0xb8, 0x99, 0xc8, 0x33, 0x7c, 0xd7, 0xf2, 0x27, 0xba, 0x48, 0x40, 0x25, 0xd2, 0x36, 0x8a, 0xa9, - 0xd3, 0xf6, 0x50, 0x6f, 0x2f, 0x38, 0x34, 0xe8, 0x71, 0x05, 0x0e, 0x2d, 0x46, 0x5e, 0xe1, 0xee, - 0xdf, 0xdc, 0x22, 0xa1, 0x64, 0x04, 0xce, 0x0d, 0x13, 0xf5, 0xde, 0x8e, 0xe1, 0x89, 0x81, 0xfd, - 0x13, 0xbc, 0xff, 0xd6, 0x6e, 0xe1, 0x10, 0x42, 0x10, 0xe4, 0x05, 0x6e, 0xdb, 0x05, 0x74, 0x90, - 0xd7, 0x34, 0x91, 0xaf, 0x6c, 0x25, 0xdb, 0xac, 0xce, 0xa0, 0x55, 0x46, 0x0e, 0x2a, 0xfe, 0xe0, - 0xf8, 0x7c, 0x45, 0xd1, 0xc5, 0x8a, 0xa2, 0x1f, 0x2b, 0x8a, 0xce, 0xd6, 0xb4, 0x71, 0xb1, 0xa6, - 0x8d, 0x6f, 0x6b, 0xda, 0xf8, 0xf8, 0x50, 0x2a, 0x88, 0x8a, 0x31, 0x9b, 0xe8, 0x98, 0x57, 0x4f, - 0xc0, 0x7c, 0xe7, 0xfd, 0xe7, 0xfc, 0x53, 0xfd, 0x1c, 0x60, 0x91, 0x8a, 0x7c, 0xdc, 0x36, 0x93, - 0x7d, 0xfa, 0x2b, 0x00, 0x00, 0xff, 0xff, 0x34, 0x0f, 0x27, 0x6e, 0x2b, 0x03, 0x00, 0x00, + 0x90, 0xad, 0x02, 0x42, 0x08, 0xb6, 0x1e, 0x88, 0x63, 0x4d, 0x19, 0x10, 0x4b, 0x95, 0xb6, 0xae, + 0x63, 0xe9, 0x12, 0x47, 0xc9, 0x4b, 0x45, 0x37, 0x66, 0xa6, 0x1b, 0xf9, 0x49, 0x37, 0xde, 0xc8, + 0x54, 0x50, 0xbb, 0x31, 0xde, 0x2f, 0x40, 0xb1, 0x93, 0x52, 0xae, 0x20, 0x96, 0x28, 0x7e, 0xdf, + 0xf7, 0xbe, 0xcf, 0xdf, 0xd3, 0x33, 0x3e, 0x12, 0xf3, 0x58, 0xe7, 0x5c, 0xa4, 0x7a, 0x12, 0xe5, + 0x7c, 0xde, 0xe7, 0x52, 0x24, 0x22, 0x57, 0x39, 0x4b, 0x33, 0x0d, 0x9a, 0x1c, 0x18, 0x98, 0x59, + 0x98, 0xcd, 0xfb, 0xdd, 0x43, 0xa9, 0xa5, 0x36, 0x18, 0x2f, 0xff, 0x2c, 0xad, 0x4b, 0xa5, 0xd6, + 0xf2, 0x54, 0x70, 0x73, 0x1a, 0x17, 0x33, 0x3e, 0x2d, 0xb2, 0x10, 0x94, 0x4e, 0x2a, 0xdc, 0xbd, + 0x8a, 0x83, 0x8a, 0x45, 0x0e, 0x61, 0x9c, 0x5a, 0x82, 0xff, 0xa5, 0x85, 0x3b, 0x6f, 0x4a, 0x93, + 0x77, 0xc9, 0x4c, 0x13, 0x8a, 0xb1, 0x9a, 0x8a, 0x04, 0xd4, 0x4c, 0x89, 0xcc, 0x41, 0x1e, 0xea, + 0x75, 0x82, 0xad, 0x0a, 0xf9, 0x80, 0x71, 0x0e, 0x61, 0x06, 0xa3, 0x52, 0xc6, 0xb9, 0xe6, 0xa1, + 0xde, 0xcd, 0x27, 0x5d, 0x66, 0x3d, 0x58, 0xed, 0xc1, 0xde, 0xd7, 0x1e, 0x83, 0xa3, 0xf3, 0xa5, + 0xdb, 0xb8, 0x5c, 0xba, 0xb7, 0x17, 0x61, 0x7c, 0xfa, 0xd2, 0xff, 0xdd, 0xeb, 0x9f, 0x7d, 0x77, + 0x51, 0xd0, 0x31, 0x85, 0x92, 0x4e, 0x22, 0xbc, 0x57, 0x5f, 0xdd, 0x69, 0x1a, 0xdd, 0xfb, 0x3b, + 0xba, 0xaf, 0x2b, 0xc2, 0xa0, 0x5f, 0xca, 0xfe, 0x5c, 0xba, 0xa4, 0x6e, 0x79, 0xac, 0x63, 0x05, + 0x22, 0x4e, 0x61, 0x71, 0xb9, 0x74, 0x0f, 0xac, 0x59, 0x8d, 0xf9, 0x5f, 0x4b, 0xab, 0x8d, 0x3a, + 0x79, 0x80, 0x6f, 0x4d, 0x8a, 0x2c, 0x13, 0x09, 0x8c, 0xcc, 0x74, 0x9d, 0x96, 0x87, 0x7a, 0xcd, + 0x60, 0xbf, 0x2a, 0x9a, 0x61, 0x90, 0xcf, 0x08, 0x3b, 0x7f, 0xb0, 0x46, 0x5b, 0xb9, 0xaf, 0xff, + 0x37, 0xf7, 0xa3, 0x2a, 0xb7, 0x6b, 0xaf, 0xf2, 0x2f, 0x25, 0x3b, 0x85, 0x3b, 0xdb, 0xce, 0xc3, + 0xcd, 0x44, 0x9e, 0xe1, 0xbb, 0x96, 0x3f, 0xd1, 0x45, 0x02, 0x2a, 0x91, 0xb6, 0x51, 0x4c, 0x9d, + 0xb6, 0x87, 0x7a, 0x7b, 0xc1, 0xa1, 0x41, 0x8f, 0x2b, 0x70, 0x68, 0x31, 0xf2, 0x0a, 0x77, 0xff, + 0xe6, 0x16, 0x09, 0x25, 0x23, 0x70, 0x6e, 0x98, 0xa8, 0xf7, 0x76, 0x0c, 0x4f, 0x0c, 0xec, 0x9f, + 0xe0, 0xfd, 0xb7, 0x76, 0x0b, 0x87, 0x10, 0x82, 0x20, 0x2f, 0x70, 0xdb, 0x2e, 0xa0, 0x83, 0xbc, + 0xa6, 0x89, 0x7c, 0x65, 0x2b, 0xd9, 0x66, 0x75, 0x06, 0xad, 0x32, 0x72, 0x50, 0xf1, 0x07, 0xc7, + 0xe7, 0x2b, 0x8a, 0x2e, 0x56, 0x14, 0xfd, 0x58, 0x51, 0x74, 0xb6, 0xa6, 0x8d, 0x8b, 0x35, 0x6d, + 0x7c, 0x5b, 0xd3, 0xc6, 0xc7, 0x87, 0x52, 0x41, 0x54, 0x8c, 0xd9, 0x44, 0xc7, 0xbc, 0x7a, 0x02, + 0xe6, 0x3b, 0xef, 0x3f, 0xe7, 0x9f, 0xea, 0xe7, 0x00, 0x8b, 0x54, 0xe4, 0xe3, 0xb6, 0x99, 0xec, + 0xd3, 0x5f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x1c, 0xa6, 0x39, 0x36, 0x2b, 0x03, 0x00, 0x00, } func (m *EpochInfo) Marshal() (dAtA []byte, err error) { diff --git a/x/epochs/types/query.pb.go b/x/epochs/types/query.pb.go index dcf6c2983a..64ef03bf04 100644 --- a/x/epochs/types/query.pb.go +++ b/x/epochs/types/query.pb.go @@ -240,7 +240,7 @@ var fileDescriptor_d13f5778acd937ff = []byte{ // 449 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0xc1, 0x6b, 0x14, 0x31, 0x14, 0xc6, 0x37, 0x5b, 0x2d, 0x98, 0x56, 0x84, 0x20, 0x76, 0x3b, 0x6a, 0xba, 0xac, 0xd0, 0x6e, - 0x7b, 0x48, 0x98, 0x15, 0x41, 0x3c, 0x49, 0x8b, 0x8a, 0x37, 0x9d, 0xa3, 0x17, 0x9d, 0x1d, 0x5f, + 0x7b, 0x48, 0x98, 0x15, 0x44, 0x3c, 0x49, 0x8b, 0x8a, 0x37, 0x9d, 0xa3, 0x17, 0x9d, 0x1d, 0x5f, 0xd3, 0x80, 0x4d, 0xa6, 0x93, 0xcc, 0x60, 0x6f, 0xe2, 0x5d, 0x10, 0xbc, 0x89, 0x7f, 0x50, 0x8f, 0x05, 0x2f, 0x9e, 0x44, 0x76, 0xfd, 0x43, 0x64, 0x92, 0xac, 0xce, 0xee, 0x0e, 0xac, 0x97, 0x21, 0xe4, 0xbd, 0xef, 0x7b, 0xbf, 0xf7, 0x4d, 0xf0, 0x6d, 0xa8, 0x4e, 0xb5, 0xe1, 0x90, 0xeb, 0xec, @@ -265,7 +265,7 @@ var fileDescriptor_d13f5778acd937ff = []byte{ 0x05, 0x76, 0x78, 0x74, 0x31, 0xa1, 0xe8, 0x72, 0x42, 0xd1, 0xaf, 0x09, 0x45, 0x9f, 0xa7, 0xb4, 0x73, 0x39, 0xa5, 0x9d, 0x1f, 0x53, 0xda, 0x79, 0xb5, 0x2f, 0xa4, 0x3d, 0x29, 0xc7, 0x2c, 0xd3, 0xa7, 0x33, 0x0f, 0xf7, 0xad, 0xe2, 0x07, 0xfc, 0xfd, 0xcc, 0xcf, 0x9e, 0xe7, 0x60, 0xc6, 0xeb, - 0xee, 0x9d, 0xdf, 0xff, 0x13, 0x00, 0x00, 0xff, 0xff, 0x27, 0x9f, 0x8e, 0xec, 0x96, 0x03, 0x00, + 0xee, 0x9d, 0xdf, 0xff, 0x13, 0x00, 0x00, 0xff, 0xff, 0x0f, 0x36, 0x90, 0xb4, 0x96, 0x03, 0x00, 0x00, } diff --git a/x/erc20/types/erc20.pb.go b/x/erc20/types/erc20.pb.go index 187eda2b42..81c439455f 100644 --- a/x/erc20/types/erc20.pb.go +++ b/x/erc20/types/erc20.pb.go @@ -388,36 +388,36 @@ var fileDescriptor_668d5dc537f45142 = []byte{ // 504 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x53, 0xcf, 0x6b, 0xd4, 0x40, 0x14, 0xce, 0x74, 0xb7, 0xda, 0x9d, 0xb6, 0x21, 0x0e, 0xbb, 0x10, 0x16, 0x9a, 0x86, 0x15, 0x24, - 0x78, 0x48, 0x9a, 0x15, 0x2f, 0x22, 0x48, 0x77, 0x1b, 0xa1, 0xd2, 0xee, 0x2e, 0xe9, 0x16, 0xc5, - 0xcb, 0x32, 0x49, 0x86, 0x18, 0xba, 0x9b, 0x59, 0x66, 0xc6, 0xa8, 0x07, 0xef, 0x1e, 0xbd, 0x78, - 0x17, 0xf4, 0x8f, 0xe9, 0xb1, 0x47, 0x4f, 0x22, 0xbb, 0x17, 0xff, 0x0c, 0xc9, 0x4c, 0x22, 0xd6, - 0x63, 0x7b, 0x09, 0xef, 0xfb, 0xde, 0x8f, 0x7c, 0xf3, 0x3d, 0x1e, 0xec, 0x92, 0x62, 0x41, 0xb9, - 0x47, 0x58, 0xdc, 0x3f, 0xf0, 0x0a, 0x5f, 0x05, 0xee, 0x92, 0x51, 0x41, 0x91, 0x2e, 0x73, 0xae, - 0xa2, 0x0a, 0xbf, 0x6b, 0xc5, 0x94, 0x97, 0xc5, 0x11, 0xce, 0x2f, 0xbc, 0xc2, 0x8f, 0x88, 0xc0, - 0xbe, 0x04, 0xaa, 0xbe, 0xdb, 0x4e, 0x69, 0x4a, 0x65, 0xe8, 0x95, 0x91, 0x62, 0x7b, 0xdf, 0x01, - 0x6c, 0x4d, 0xe9, 0x05, 0xc9, 0x27, 0x38, 0x63, 0xe8, 0x3e, 0xdc, 0x95, 0xf3, 0x66, 0x38, 0x49, - 0x18, 0xe1, 0xdc, 0x04, 0x36, 0x70, 0x5a, 0xe1, 0x8e, 0x24, 0x0f, 0x15, 0x87, 0xda, 0x70, 0x33, - 0x21, 0x39, 0x5d, 0x98, 0x1b, 0x32, 0xa9, 0x00, 0x32, 0xe1, 0x5d, 0x92, 0xe3, 0x68, 0x4e, 0x12, - 0xb3, 0x61, 0x03, 0x67, 0x2b, 0xac, 0x21, 0x7a, 0x0a, 0xf5, 0x98, 0xe6, 0x82, 0xe1, 0x58, 0xcc, - 0xe8, 0xbb, 0x9c, 0x30, 0xb3, 0x69, 0x03, 0x47, 0xef, 0x77, 0xdc, 0xeb, 0x2f, 0x70, 0xc7, 0x65, - 0x32, 0xdc, 0xad, 0x8b, 0x25, 0x7c, 0xd2, 0xfc, 0xfd, 0x75, 0x1f, 0xf4, 0xbe, 0x00, 0xd8, 0x0e, - 0x49, 0x9a, 0x71, 0x41, 0xd8, 0x90, 0x66, 0xf9, 0x84, 0xd1, 0x25, 0xe5, 0x78, 0x5e, 0x8a, 0x11, - 0x99, 0x98, 0x93, 0x4a, 0xa9, 0x02, 0xc8, 0x86, 0xdb, 0x09, 0xe1, 0x31, 0xcb, 0x96, 0x22, 0xa3, - 0x79, 0x25, 0xf4, 0x5f, 0x0a, 0x3d, 0x83, 0x5b, 0x0b, 0x22, 0x70, 0x82, 0x05, 0x36, 0x1b, 0x76, - 0xc3, 0xd9, 0xee, 0xef, 0xb9, 0xca, 0x40, 0x57, 0x7a, 0x56, 0x19, 0xe8, 0x9e, 0x56, 0x45, 0x83, - 0xe6, 0xe5, 0xcf, 0x7d, 0x2d, 0xfc, 0xdb, 0x24, 0x75, 0x69, 0xbd, 0x8f, 0xb0, 0x53, 0xcb, 0x0a, - 0xc2, 0x61, 0xff, 0xe0, 0xd6, 0xba, 0x1e, 0x40, 0x5d, 0xfa, 0x51, 0x2d, 0x80, 0x70, 0xa9, 0xae, - 0x15, 0xfe, 0xc7, 0x56, 0xbf, 0xe7, 0x70, 0x6f, 0x4a, 0xd3, 0x74, 0x4e, 0xe4, 0x0a, 0x87, 0x34, - 0x2f, 0x08, 0xe3, 0x19, 0xbd, 0xbd, 0x3d, 0x65, 0x5f, 0x39, 0x52, 0xee, 0xb2, 0xec, 0x2b, 0x41, - 0xb5, 0x8b, 0x33, 0x68, 0xd4, 0xf3, 0x6b, 0x77, 0xae, 0xd9, 0x09, 0x6e, 0x60, 0xe7, 0xc3, 0x17, - 0x70, 0x53, 0xee, 0x1b, 0x75, 0xe0, 0xbd, 0xf1, 0xcb, 0x51, 0x10, 0xce, 0xce, 0x47, 0x67, 0x93, - 0x60, 0x78, 0xfc, 0xfc, 0x38, 0x38, 0x32, 0x34, 0x64, 0xc0, 0x1d, 0x45, 0x9f, 0x8e, 0x8f, 0xce, - 0x4f, 0x02, 0x03, 0x20, 0x04, 0x75, 0xc5, 0x04, 0xaf, 0xa6, 0x41, 0x38, 0x3a, 0x3c, 0x31, 0x36, - 0xba, 0xcd, 0x4f, 0xdf, 0x2c, 0x6d, 0x30, 0xb8, 0x5c, 0x59, 0xe0, 0x6a, 0x65, 0x81, 0x5f, 0x2b, - 0x0b, 0x7c, 0x5e, 0x5b, 0xda, 0xd5, 0xda, 0xd2, 0x7e, 0xac, 0x2d, 0xed, 0xb5, 0x93, 0x66, 0xe2, - 0xcd, 0xdb, 0xc8, 0x8d, 0xe9, 0xc2, 0xab, 0x4e, 0x4b, 0x7e, 0x0b, 0xff, 0xb1, 0xf7, 0xbe, 0x3a, - 0x33, 0xf1, 0x61, 0x49, 0x78, 0x74, 0x47, 0x9e, 0xc7, 0xa3, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, - 0x2a, 0x87, 0xd6, 0xd7, 0x82, 0x03, 0x00, 0x00, + 0x78, 0x48, 0x9a, 0x15, 0x3c, 0x88, 0x20, 0xdd, 0x6d, 0x84, 0x4a, 0xbb, 0xbb, 0xa4, 0x5b, 0x14, + 0x2f, 0xcb, 0x24, 0x19, 0x62, 0xe8, 0x6e, 0x66, 0x99, 0x19, 0xa3, 0x1e, 0xbc, 0x7b, 0xf4, 0xe2, + 0x5d, 0xd0, 0x3f, 0xa6, 0xc7, 0x1e, 0x3d, 0x89, 0xec, 0x5e, 0xfc, 0x33, 0x24, 0x33, 0x89, 0x58, + 0x8f, 0xed, 0x25, 0xbc, 0xef, 0x7b, 0x3f, 0xf2, 0xcd, 0xf7, 0x78, 0xb0, 0x4b, 0x8a, 0x05, 0xe5, + 0x1e, 0x61, 0x71, 0xff, 0xc0, 0x2b, 0x7c, 0x15, 0xb8, 0x4b, 0x46, 0x05, 0x45, 0xba, 0xcc, 0xb9, + 0x8a, 0x2a, 0xfc, 0xae, 0x15, 0x53, 0x5e, 0x16, 0x47, 0x38, 0xbf, 0xf0, 0x0a, 0x3f, 0x22, 0x02, + 0xfb, 0x12, 0xa8, 0xfa, 0x6e, 0x3b, 0xa5, 0x29, 0x95, 0xa1, 0x57, 0x46, 0x8a, 0xed, 0x7d, 0x07, + 0xb0, 0x35, 0xa5, 0x17, 0x24, 0x9f, 0xe0, 0x8c, 0xa1, 0xfb, 0x70, 0x57, 0xce, 0x9b, 0xe1, 0x24, + 0x61, 0x84, 0x73, 0x13, 0xd8, 0xc0, 0x69, 0x85, 0x3b, 0x92, 0x3c, 0x54, 0x1c, 0x6a, 0xc3, 0xcd, + 0x84, 0xe4, 0x74, 0x61, 0x6e, 0xc8, 0xa4, 0x02, 0xc8, 0x84, 0x77, 0x49, 0x8e, 0xa3, 0x39, 0x49, + 0xcc, 0x86, 0x0d, 0x9c, 0xad, 0xb0, 0x86, 0xe8, 0x29, 0xd4, 0x63, 0x9a, 0x0b, 0x86, 0x63, 0x31, + 0xa3, 0xef, 0x72, 0xc2, 0xcc, 0xa6, 0x0d, 0x1c, 0xbd, 0xdf, 0x71, 0xaf, 0xbf, 0xc0, 0x1d, 0x97, + 0xc9, 0x70, 0xb7, 0x2e, 0x96, 0xf0, 0x49, 0xf3, 0xf7, 0xd7, 0x7d, 0xd0, 0xfb, 0x02, 0x60, 0x3b, + 0x24, 0x69, 0xc6, 0x05, 0x61, 0x43, 0x9a, 0xe5, 0x13, 0x46, 0x97, 0x94, 0xe3, 0x79, 0x29, 0x46, + 0x64, 0x62, 0x4e, 0x2a, 0xa5, 0x0a, 0x20, 0x1b, 0x6e, 0x27, 0x84, 0xc7, 0x2c, 0x5b, 0x8a, 0x8c, + 0xe6, 0x95, 0xd0, 0x7f, 0x29, 0xf4, 0x0c, 0x6e, 0x2d, 0x88, 0xc0, 0x09, 0x16, 0xd8, 0x6c, 0xd8, + 0x0d, 0x67, 0xbb, 0xbf, 0xe7, 0x2a, 0x03, 0x5d, 0xe9, 0x59, 0x65, 0xa0, 0x7b, 0x5a, 0x15, 0x0d, + 0x9a, 0x97, 0x3f, 0xf7, 0xb5, 0xf0, 0x6f, 0x93, 0xd4, 0xa5, 0xf5, 0x3e, 0xc2, 0x4e, 0x2d, 0x2b, + 0x08, 0x87, 0xfd, 0x83, 0x5b, 0xeb, 0x7a, 0x00, 0x75, 0xe9, 0x47, 0xb5, 0x00, 0xc2, 0xa5, 0xba, + 0x56, 0xf8, 0x1f, 0x5b, 0xfd, 0x9e, 0xc3, 0xbd, 0x29, 0x4d, 0xd3, 0x39, 0x91, 0x2b, 0x1c, 0xd2, + 0xbc, 0x20, 0x8c, 0x67, 0xf4, 0xf6, 0xf6, 0x94, 0x7d, 0xe5, 0x48, 0xb9, 0xcb, 0xb2, 0xaf, 0x04, + 0xd5, 0x2e, 0xce, 0xa0, 0x51, 0xcf, 0xaf, 0xdd, 0xb9, 0x66, 0x27, 0xb8, 0x81, 0x9d, 0x0f, 0x5f, + 0xc0, 0x4d, 0xb9, 0x6f, 0xd4, 0x81, 0xf7, 0xc6, 0x2f, 0x47, 0x41, 0x38, 0x3b, 0x1f, 0x9d, 0x4d, + 0x82, 0xe1, 0xf1, 0xf3, 0xe3, 0xe0, 0xc8, 0xd0, 0x90, 0x01, 0x77, 0x14, 0x7d, 0x3a, 0x3e, 0x3a, + 0x3f, 0x09, 0x0c, 0x80, 0x10, 0xd4, 0x15, 0x13, 0xbc, 0x9a, 0x06, 0xe1, 0xe8, 0xf0, 0xc4, 0xd8, + 0xe8, 0x36, 0x3f, 0x7d, 0xb3, 0xb4, 0xc1, 0xe0, 0x72, 0x65, 0x81, 0xab, 0x95, 0x05, 0x7e, 0xad, + 0x2c, 0xf0, 0x79, 0x6d, 0x69, 0x57, 0x6b, 0x4b, 0xfb, 0xb1, 0xb6, 0xb4, 0xd7, 0x4e, 0x9a, 0x89, + 0x37, 0x6f, 0x23, 0x37, 0xa6, 0x0b, 0xaf, 0x3a, 0x2d, 0xf9, 0x2d, 0xfc, 0xc7, 0xde, 0xfb, 0xea, + 0xcc, 0xc4, 0x87, 0x25, 0xe1, 0xd1, 0x1d, 0x79, 0x1e, 0x8f, 0xfe, 0x04, 0x00, 0x00, 0xff, 0xff, + 0x17, 0xbe, 0x33, 0xa1, 0x82, 0x03, 0x00, 0x00, } func (this *TokenPair) Equal(that interface{}) bool { diff --git a/x/erc20/types/events.pb.go b/x/erc20/types/events.pb.go index cf47053078..4029909d7d 100644 --- a/x/erc20/types/events.pb.go +++ b/x/erc20/types/events.pb.go @@ -307,26 +307,26 @@ func init() { proto.RegisterFile("evmos/erc20/v1/events.proto", fileDescriptor_b var fileDescriptor_b8091384ab031e64 = []byte{ // 311 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x92, 0xcf, 0x4a, 0xc3, 0x40, - 0x10, 0xc6, 0xbb, 0x6a, 0x8b, 0x2e, 0xfe, 0xa9, 0x41, 0xa4, 0x54, 0x58, 0xa4, 0x5e, 0xea, 0x25, - 0x69, 0x2a, 0x3e, 0x80, 0x0d, 0xbd, 0x8a, 0x84, 0x82, 0xe0, 0x45, 0xd2, 0x64, 0x88, 0x8b, 0x66, - 0xa7, 0xec, 0x6e, 0x17, 0x7d, 0x0b, 0xaf, 0xde, 0x7c, 0x1c, 0x8f, 0x3d, 0x7a, 0x94, 0xe4, 0x45, - 0xa4, 0x9b, 0x55, 0x41, 0xc4, 0x8b, 0xe0, 0x65, 0xe1, 0x9b, 0x8f, 0xf9, 0xf1, 0x63, 0x19, 0x7a, - 0x00, 0xa6, 0x40, 0x15, 0x80, 0x4c, 0x87, 0x83, 0xc0, 0x84, 0x01, 0x18, 0x10, 0x5a, 0xf9, 0x33, - 0x89, 0x1a, 0xbd, 0x6d, 0x5b, 0xfa, 0xb6, 0xf4, 0x4d, 0xd8, 0x3b, 0xa7, 0xbb, 0xe3, 0x65, 0x1f, - 0x43, 0xce, 0x95, 0x06, 0x79, 0x91, 0x70, 0xe9, 0xed, 0xd1, 0x66, 0x06, 0x02, 0x8b, 0x0e, 0x39, - 0x24, 0xfd, 0x8d, 0xb8, 0x0e, 0xde, 0x11, 0xdd, 0xb2, 0x6b, 0xd7, 0x49, 0x96, 0x49, 0x50, 0xaa, - 0xb3, 0x62, 0xdb, 0x4d, 0x3b, 0x3c, 0xab, 0x67, 0xbd, 0x4b, 0xda, 0xb5, 0xbc, 0x09, 0xe6, 0xf9, - 0x1d, 0x4c, 0xf0, 0x16, 0x44, 0x84, 0xc2, 0x80, 0x54, 0x1c, 0xc5, 0x5f, 0xc0, 0x4f, 0x84, 0xb6, - 0x2d, 0xb9, 0xc6, 0xe9, 0x08, 0xb9, 0xf0, 0xf6, 0x69, 0x4b, 0x81, 0xc8, 0x40, 0x3a, 0xa0, 0x4b, - 0x5e, 0x97, 0xae, 0x4b, 0x48, 0x81, 0x1b, 0x90, 0x0e, 0xf6, 0x99, 0x97, 0x3b, 0x49, 0x81, 0x73, - 0xa1, 0x3b, 0xab, 0xf5, 0x4e, 0x9d, 0xbe, 0xdc, 0xd6, 0x7e, 0x75, 0x6b, 0xfe, 0xe0, 0xf6, 0x4c, - 0xdc, 0x2f, 0x3a, 0xb7, 0x71, 0x1c, 0x0d, 0x07, 0xff, 0x20, 0x77, 0x4c, 0xdb, 0x29, 0x0a, 0x2d, - 0x93, 0x54, 0x7f, 0xf3, 0xdb, 0xf9, 0x98, 0x3b, 0xc5, 0xd1, 0xe8, 0xa5, 0x64, 0x64, 0x51, 0x32, - 0xf2, 0x56, 0x32, 0xf2, 0x58, 0xb1, 0xc6, 0xa2, 0x62, 0x8d, 0xd7, 0x8a, 0x35, 0xae, 0xfa, 0x39, - 0xd7, 0x37, 0xf3, 0xa9, 0x9f, 0x62, 0x11, 0xb8, 0xcb, 0xb1, 0xaf, 0x09, 0x4f, 0x83, 0x7b, 0x77, - 0x45, 0xfa, 0x61, 0x06, 0x6a, 0xda, 0xb2, 0x27, 0x74, 0xf2, 0x1e, 0x00, 0x00, 0xff, 0xff, 0x41, - 0xc9, 0x84, 0x0c, 0x61, 0x02, 0x00, 0x00, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x92, 0xcf, 0x4b, 0xc3, 0x30, + 0x14, 0xc7, 0x17, 0x75, 0x43, 0x83, 0x3f, 0x66, 0x11, 0x19, 0x13, 0x82, 0xcc, 0xcb, 0xbc, 0xb4, + 0xeb, 0x04, 0xef, 0xae, 0xec, 0x2a, 0x52, 0x06, 0x82, 0x17, 0xe9, 0xda, 0x47, 0x0d, 0xda, 0xbc, + 0x91, 0x64, 0x41, 0xff, 0x0b, 0xaf, 0xde, 0xfc, 0x73, 0x3c, 0xee, 0xe8, 0x51, 0xda, 0x7f, 0x44, + 0x96, 0x46, 0x05, 0x11, 0x2f, 0x82, 0x97, 0xc0, 0xf7, 0x7d, 0x79, 0x1f, 0x3e, 0x84, 0x47, 0x0f, + 0xc0, 0x14, 0xa8, 0x02, 0x90, 0xe9, 0x70, 0x10, 0x98, 0x30, 0x00, 0x03, 0x42, 0x2b, 0x7f, 0x26, + 0x51, 0xa3, 0xb7, 0x6d, 0x4b, 0xdf, 0x96, 0xbe, 0x09, 0x7b, 0xe7, 0x74, 0x77, 0xbc, 0xec, 0x63, + 0xc8, 0xb9, 0xd2, 0x20, 0x2f, 0x12, 0x2e, 0xbd, 0x3d, 0xda, 0xcc, 0x40, 0x60, 0xd1, 0x21, 0x87, + 0xa4, 0xbf, 0x11, 0xd7, 0xc1, 0x3b, 0xa2, 0x5b, 0x76, 0xed, 0x3a, 0xc9, 0x32, 0x09, 0x4a, 0x75, + 0x56, 0x6c, 0xbb, 0x69, 0x87, 0x67, 0xf5, 0xac, 0x77, 0x49, 0xbb, 0x96, 0x37, 0xc1, 0x3c, 0xbf, + 0x83, 0x09, 0xde, 0x82, 0x88, 0x50, 0x18, 0x90, 0x8a, 0xa3, 0xf8, 0x0b, 0xf8, 0x89, 0xd0, 0xb6, + 0x25, 0xd7, 0x38, 0x1d, 0x21, 0x17, 0xde, 0x3e, 0x6d, 0x29, 0x10, 0x19, 0x48, 0x07, 0x74, 0xc9, + 0xeb, 0xd2, 0x75, 0x09, 0x29, 0x70, 0x03, 0xd2, 0xc1, 0x3e, 0xf3, 0x72, 0x27, 0x29, 0x70, 0x2e, + 0x74, 0x67, 0xb5, 0xde, 0xa9, 0xd3, 0x97, 0xdb, 0xda, 0xaf, 0x6e, 0xcd, 0x1f, 0xdc, 0x9e, 0x89, + 0xfb, 0x45, 0xe7, 0x36, 0x8e, 0xa3, 0xe1, 0xe0, 0x1f, 0xe4, 0x8e, 0x69, 0x3b, 0x45, 0xa1, 0x65, + 0x92, 0xea, 0x6f, 0x7e, 0x3b, 0x1f, 0x73, 0xa7, 0x38, 0x1a, 0xbd, 0x94, 0x8c, 0x2c, 0x4a, 0x46, + 0xde, 0x4a, 0x46, 0x1e, 0x2b, 0xd6, 0x58, 0x54, 0xac, 0xf1, 0x5a, 0xb1, 0xc6, 0x55, 0x3f, 0xe7, + 0xfa, 0x66, 0x3e, 0xf5, 0x53, 0x2c, 0x02, 0x77, 0x39, 0xf6, 0x35, 0xe1, 0x69, 0x70, 0xef, 0xae, + 0x48, 0x3f, 0xcc, 0x40, 0x4d, 0x5b, 0xf6, 0x84, 0x4e, 0xde, 0x03, 0x00, 0x00, 0xff, 0xff, 0x7c, + 0xf0, 0x61, 0x7a, 0x61, 0x02, 0x00, 0x00, } func (m *EventRegisterPair) Marshal() (dAtA []byte, err error) { diff --git a/x/erc20/types/genesis.pb.go b/x/erc20/types/genesis.pb.go index 77f1c8ba83..ebc3435665 100644 --- a/x/erc20/types/genesis.pb.go +++ b/x/erc20/types/genesis.pb.go @@ -160,8 +160,8 @@ var fileDescriptor_2f4674601b0d6987 = []byte{ 0x05, 0x71, 0x9d, 0x9c, 0x4e, 0x3c, 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, 0x39, 0xc6, 0x09, 0x8f, 0xe5, 0x18, 0x2e, 0x3c, 0x96, 0x63, 0xb8, 0xf1, 0x58, 0x8e, 0x21, 0x4a, 0x23, 0x3d, 0xb3, 0x24, 0xa3, 0x34, 0x49, 0x2f, 0x39, 0x3f, 0x57, 0x1f, 0x1a, 0x8e, 0x60, 0xb2, 0xcc, - 0xd0, 0x54, 0xbf, 0x02, 0x1a, 0xa6, 0x25, 0x95, 0x05, 0xa9, 0xc5, 0x49, 0x6c, 0xe0, 0xb0, 0x33, - 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x8f, 0x8e, 0x7d, 0x15, 0x9d, 0x01, 0x00, 0x00, + 0xd0, 0x4c, 0xbf, 0x02, 0x1a, 0xa6, 0x25, 0x95, 0x05, 0xa9, 0xc5, 0x49, 0x6c, 0xe0, 0xb0, 0x33, + 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0xb2, 0xb7, 0x98, 0x63, 0x9d, 0x01, 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { diff --git a/x/erc20/types/query.pb.go b/x/erc20/types/query.pb.go index 81de48f8dd..731056eeeb 100644 --- a/x/erc20/types/query.pb.go +++ b/x/erc20/types/query.pb.go @@ -323,39 +323,39 @@ func init() { func init() { proto.RegisterFile("evmos/erc20/v1/query.proto", fileDescriptor_fba814bce17cabdf) } var fileDescriptor_fba814bce17cabdf = []byte{ - // 501 bytes of a gzipped FileDescriptorProto + // 502 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x53, 0x4f, 0x8b, 0xd3, 0x40, 0x14, 0xef, 0xec, 0xba, 0x85, 0xbe, 0x82, 0x87, 0xb1, 0xd6, 0x1a, 0x35, 0x2e, 0x29, 0xdb, 0x2d, - 0x8a, 0x33, 0xa6, 0xea, 0x55, 0xa4, 0x07, 0x3d, 0x78, 0xa9, 0xc5, 0x83, 0x78, 0xd1, 0x69, 0x19, - 0x62, 0xd0, 0x66, 0xd2, 0xcc, 0x34, 0xb8, 0x88, 0x97, 0xbd, 0x88, 0x37, 0xc1, 0xaf, 0xe0, 0x87, - 0xd9, 0xe3, 0x82, 0x17, 0x4f, 0x22, 0xad, 0x1f, 0x44, 0x32, 0x33, 0x49, 0x37, 0xb1, 0xb4, 0x97, - 0x92, 0xbc, 0xf7, 0x7e, 0xff, 0xde, 0x4b, 0xc1, 0xe1, 0xe9, 0x4c, 0x48, 0xca, 0x93, 0xe9, 0xe0, - 0x3e, 0x4d, 0x7d, 0x3a, 0x5f, 0xf0, 0xe4, 0x84, 0xc4, 0x89, 0x50, 0x02, 0x5f, 0xd6, 0x3d, 0xa2, - 0x7b, 0x24, 0xf5, 0x9d, 0x3b, 0x53, 0x21, 0xb3, 0xe1, 0x09, 0x93, 0xdc, 0x0c, 0xd2, 0xd4, 0x9f, - 0x70, 0xc5, 0x7c, 0x1a, 0xb3, 0x20, 0x8c, 0x98, 0x0a, 0x45, 0x64, 0xb0, 0x4e, 0x95, 0xd7, 0x90, - 0x98, 0xde, 0xcd, 0x4a, 0x2f, 0xe0, 0x11, 0x97, 0xa1, 0xb4, 0xdd, 0x56, 0x20, 0x02, 0xa1, 0x1f, - 0x69, 0xf6, 0x94, 0x63, 0x02, 0x21, 0x82, 0x0f, 0x9c, 0xb2, 0x38, 0xa4, 0x2c, 0x8a, 0x84, 0xd2, - 0x62, 0x16, 0xe3, 0xbd, 0x85, 0xf6, 0x8b, 0xcc, 0xcf, 0x4b, 0xf1, 0x9e, 0x47, 0x23, 0x16, 0x26, - 0x72, 0xcc, 0xe7, 0x0b, 0x2e, 0x15, 0x7e, 0x0a, 0xb0, 0xf6, 0xd6, 0x41, 0x87, 0xa8, 0xdf, 0x1c, - 0xf4, 0x88, 0x09, 0x42, 0xb2, 0x20, 0xc4, 0x24, 0xb6, 0x41, 0xc8, 0x88, 0x05, 0xdc, 0x62, 0xc7, - 0x17, 0x90, 0xde, 0x0f, 0x04, 0xd7, 0xfe, 0x93, 0x90, 0xb1, 0x88, 0x24, 0xc7, 0x4f, 0xa0, 0xa9, - 0xb2, 0xea, 0x9b, 0x38, 0x2b, 0x77, 0xd0, 0xe1, 0x7e, 0xbf, 0x39, 0xb8, 0x4e, 0xca, 0xdb, 0x23, - 0x05, 0x70, 0x78, 0xe9, 0xec, 0xf7, 0xed, 0xda, 0x18, 0x54, 0xc1, 0x84, 0x9f, 0x95, 0x5c, 0xee, - 0x69, 0x97, 0xc7, 0x3b, 0x5d, 0x1a, 0xf9, 0x92, 0xcd, 0x7b, 0x70, 0xb5, 0xec, 0x32, 0xdf, 0x43, - 0x0b, 0x0e, 0xb4, 0x9e, 0x5e, 0x41, 0x63, 0x6c, 0x5e, 0xbc, 0x57, 0xd5, 0xbd, 0x15, 0x99, 0x1e, - 0x03, 0xac, 0x33, 0xd9, 0xbd, 0xed, 0x8c, 0xd4, 0x28, 0x22, 0x79, 0x2d, 0xc0, 0x9a, 0x79, 0xc4, - 0x12, 0x36, 0xcb, 0xaf, 0xe1, 0x3d, 0x87, 0x2b, 0xa5, 0xaa, 0x15, 0x7b, 0x08, 0xf5, 0x58, 0x57, - 0xac, 0x50, 0xbb, 0x2a, 0x64, 0xe6, 0xad, 0x8a, 0x9d, 0x1d, 0x7c, 0xdd, 0x87, 0x03, 0xcd, 0x86, - 0x4f, 0x11, 0xc0, 0xfa, 0x2e, 0xb8, 0x57, 0x85, 0x6f, 0xfe, 0x36, 0x9c, 0xe3, 0x9d, 0x73, 0xc6, - 0x9f, 0xd7, 0x3d, 0xfd, 0xf9, 0xf7, 0xfb, 0xde, 0x2d, 0x7c, 0x83, 0x56, 0xbe, 0xdc, 0x0b, 0x67, - 0xc7, 0x5f, 0x10, 0x34, 0x0a, 0x2c, 0x3e, 0xda, 0xce, 0x9d, 0x5b, 0xe8, 0xed, 0x1a, 0xb3, 0x0e, - 0xee, 0x6a, 0x07, 0x47, 0xb8, 0xbb, 0xc5, 0x01, 0xfd, 0xa4, 0x5f, 0x3e, 0xe3, 0x39, 0xd4, 0xcd, - 0xc2, 0xb0, 0xb7, 0x91, 0xbe, 0x74, 0x13, 0xa7, 0xbb, 0x75, 0xc6, 0xea, 0xbb, 0x5a, 0xbf, 0x83, - 0xdb, 0x55, 0x7d, 0x73, 0x8b, 0xe1, 0xf0, 0x6c, 0xe9, 0xa2, 0xf3, 0xa5, 0x8b, 0xfe, 0x2c, 0x5d, - 0xf4, 0x6d, 0xe5, 0xd6, 0xce, 0x57, 0x6e, 0xed, 0xd7, 0xca, 0xad, 0xbd, 0xee, 0x07, 0xa1, 0x7a, - 0xb7, 0x98, 0x90, 0xa9, 0x98, 0xe5, 0x58, 0xfd, 0x9b, 0xfa, 0x8f, 0xe8, 0x47, 0xcb, 0xa3, 0x4e, - 0x62, 0x2e, 0x27, 0x75, 0xfd, 0x5f, 0x7e, 0xf0, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x47, 0xce, 0x99, - 0xc0, 0x93, 0x04, 0x00, 0x00, + 0x8a, 0x33, 0xa6, 0x8a, 0x47, 0x91, 0x1e, 0xf4, 0xe0, 0xa5, 0x16, 0x0f, 0xe2, 0x45, 0xa7, 0x65, + 0x88, 0x41, 0x9b, 0x49, 0x33, 0xd3, 0xe0, 0x22, 0x5e, 0xf6, 0x22, 0xde, 0x04, 0xbf, 0x82, 0x1f, + 0x66, 0x8f, 0x0b, 0x5e, 0x3c, 0x89, 0xb4, 0x7e, 0x10, 0xc9, 0xcc, 0x24, 0xdd, 0xc4, 0xd2, 0x5e, + 0x4a, 0xf2, 0xde, 0xfb, 0xfd, 0x7b, 0x2f, 0x05, 0x87, 0xa7, 0x33, 0x21, 0x29, 0x4f, 0xa6, 0x83, + 0xfb, 0x34, 0xf5, 0xe9, 0x7c, 0xc1, 0x93, 0x13, 0x12, 0x27, 0x42, 0x09, 0x7c, 0x59, 0xf7, 0x88, + 0xee, 0x91, 0xd4, 0x77, 0xee, 0x4c, 0x85, 0xcc, 0x86, 0x27, 0x4c, 0x72, 0x33, 0x48, 0x53, 0x7f, + 0xc2, 0x15, 0xf3, 0x69, 0xcc, 0x82, 0x30, 0x62, 0x2a, 0x14, 0x91, 0xc1, 0x3a, 0x55, 0x5e, 0x43, + 0x62, 0x7a, 0x37, 0x2b, 0xbd, 0x80, 0x47, 0x5c, 0x86, 0xd2, 0x76, 0x5b, 0x81, 0x08, 0x84, 0x7e, + 0xa4, 0xd9, 0x53, 0x8e, 0x09, 0x84, 0x08, 0x3e, 0x70, 0xca, 0xe2, 0x90, 0xb2, 0x28, 0x12, 0x4a, + 0x8b, 0x59, 0x8c, 0xf7, 0x16, 0xda, 0x2f, 0x32, 0x3f, 0x2f, 0xc5, 0x7b, 0x1e, 0x8d, 0x58, 0x98, + 0xc8, 0x31, 0x9f, 0x2f, 0xb8, 0x54, 0xf8, 0x29, 0xc0, 0xda, 0x5b, 0x07, 0x1d, 0xa2, 0x7e, 0x73, + 0xd0, 0x23, 0x26, 0x08, 0xc9, 0x82, 0x10, 0x93, 0xd8, 0x06, 0x21, 0x23, 0x16, 0x70, 0x8b, 0x1d, + 0x5f, 0x40, 0x7a, 0x3f, 0x10, 0x5c, 0xfb, 0x4f, 0x42, 0xc6, 0x22, 0x92, 0x1c, 0x3f, 0x81, 0xa6, + 0xca, 0xaa, 0x6f, 0xe2, 0xac, 0xdc, 0x41, 0x87, 0xfb, 0xfd, 0xe6, 0xe0, 0x3a, 0x29, 0x6f, 0x8f, + 0x14, 0xc0, 0xe1, 0xa5, 0xb3, 0xdf, 0xb7, 0x6b, 0x63, 0x50, 0x05, 0x13, 0x7e, 0x56, 0x72, 0xb9, + 0xa7, 0x5d, 0x1e, 0xef, 0x74, 0x69, 0xe4, 0x4b, 0x36, 0xef, 0xc1, 0xd5, 0xb2, 0xcb, 0x7c, 0x0f, + 0x2d, 0x38, 0xd0, 0x7a, 0x7a, 0x05, 0x8d, 0xb1, 0x79, 0xf1, 0x5e, 0x55, 0xf7, 0x56, 0x64, 0x7a, + 0x0c, 0xb0, 0xce, 0x64, 0xf7, 0xb6, 0x33, 0x52, 0xa3, 0x88, 0xe4, 0xb5, 0x00, 0x6b, 0xe6, 0x11, + 0x4b, 0xd8, 0x2c, 0xbf, 0x86, 0xf7, 0x1c, 0xae, 0x94, 0xaa, 0x56, 0xec, 0x21, 0xd4, 0x63, 0x5d, + 0xb1, 0x42, 0xed, 0xaa, 0x90, 0x99, 0xb7, 0x2a, 0x76, 0x76, 0xf0, 0x75, 0x1f, 0x0e, 0x34, 0x1b, + 0x3e, 0x45, 0x00, 0xeb, 0xbb, 0xe0, 0x5e, 0x15, 0xbe, 0xf9, 0xdb, 0x70, 0x8e, 0x77, 0xce, 0x19, + 0x7f, 0x5e, 0xf7, 0xf4, 0xe7, 0xdf, 0xef, 0x7b, 0xb7, 0xf0, 0x0d, 0x5a, 0xf9, 0x72, 0x2f, 0x9c, + 0x1d, 0x7f, 0x41, 0xd0, 0x28, 0xb0, 0xf8, 0x68, 0x3b, 0x77, 0x6e, 0xa1, 0xb7, 0x6b, 0xcc, 0x3a, + 0xb8, 0xab, 0x1d, 0x1c, 0xe1, 0xee, 0x16, 0x07, 0xf4, 0x93, 0x7e, 0xf9, 0x8c, 0xe7, 0x50, 0x37, + 0x0b, 0xc3, 0xde, 0x46, 0xfa, 0xd2, 0x4d, 0x9c, 0xee, 0xd6, 0x19, 0xab, 0xef, 0x6a, 0xfd, 0x0e, + 0x6e, 0x57, 0xf5, 0xcd, 0x2d, 0x86, 0xc3, 0xb3, 0xa5, 0x8b, 0xce, 0x97, 0x2e, 0xfa, 0xb3, 0x74, + 0xd1, 0xb7, 0x95, 0x5b, 0x3b, 0x5f, 0xb9, 0xb5, 0x5f, 0x2b, 0xb7, 0xf6, 0xba, 0x1f, 0x84, 0xea, + 0xdd, 0x62, 0x42, 0xa6, 0x62, 0x96, 0x63, 0xf5, 0x6f, 0xea, 0x3f, 0xa2, 0x1f, 0x2d, 0x8f, 0x3a, + 0x89, 0xb9, 0x9c, 0xd4, 0xf5, 0x7f, 0xf9, 0xc1, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7a, 0xf7, + 0x7c, 0xb6, 0x93, 0x04, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/erc20/types/tx.pb.go b/x/erc20/types/tx.pb.go index 8cd72a4531..6a7f95e0a0 100644 --- a/x/erc20/types/tx.pb.go +++ b/x/erc20/types/tx.pb.go @@ -350,7 +350,7 @@ var fileDescriptor_f8926fc6cb676914 = []byte{ // 574 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x93, 0xcd, 0x6e, 0x13, 0x3f, 0x14, 0xc5, 0x33, 0x6d, 0x14, 0xfd, 0xe3, 0x54, 0xe9, 0x5f, 0x56, 0xc9, 0x97, 0x60, 0x12, 0xb2, - 0xa0, 0x01, 0x89, 0x71, 0x93, 0x52, 0x16, 0xec, 0x48, 0xc4, 0x82, 0x45, 0x25, 0x34, 0x08, 0x09, + 0xa0, 0x01, 0x89, 0x71, 0x93, 0x42, 0x17, 0xec, 0x48, 0xc4, 0x82, 0x45, 0x25, 0x34, 0x08, 0x09, 0xb1, 0x89, 0x9c, 0x89, 0x35, 0x19, 0xc1, 0xd8, 0x23, 0xdb, 0x19, 0x35, 0x1b, 0x16, 0x79, 0x01, 0x90, 0x78, 0x08, 0xb6, 0x2c, 0x78, 0x88, 0x2e, 0x2b, 0xd8, 0x20, 0x16, 0x15, 0x4a, 0x2a, 0xf1, 0x1a, 0x68, 0x6c, 0xe7, 0x63, 0x42, 0x5a, 0x36, 0x51, 0xec, 0x73, 0x7c, 0xef, 0xef, 0xf8, 0x7a, @@ -367,11 +367,11 @@ var fileDescriptor_f8926fc6cb676914 = []byte{ 0x0e, 0x09, 0xaf, 0xec, 0x2a, 0xc5, 0xac, 0x9a, 0x15, 0x50, 0x4a, 0xb7, 0x76, 0x89, 0x88, 0x18, 0x15, 0xa4, 0xf9, 0xd9, 0x02, 0xfb, 0x2b, 0xe9, 0x99, 0xdb, 0xeb, 0x1c, 0xc1, 0xfb, 0xe0, 0x7f, 0x8f, 0x51, 0xc9, 0xb1, 0x27, 0xfb, 0x78, 0x38, 0xe4, 0x44, 0x08, 0x85, 0x98, 0x77, 0xf7, 0x17, - 0xfb, 0x4f, 0xf5, 0x36, 0x3c, 0x01, 0x39, 0x1c, 0xb2, 0x31, 0x95, 0x1a, 0xa5, 0x7b, 0x27, 0x01, - 0xfd, 0x79, 0x59, 0xbf, 0xa5, 0xa3, 0x88, 0xe1, 0x5b, 0x27, 0x60, 0x28, 0xc4, 0x72, 0xe4, 0x3c, - 0xa7, 0xd2, 0x35, 0xe6, 0x54, 0x86, 0xdd, 0x6b, 0x33, 0x64, 0x53, 0x19, 0xaa, 0xa0, 0xbc, 0x01, - 0xba, 0x0c, 0xf1, 0x41, 0x87, 0x78, 0x15, 0x0d, 0xb1, 0x24, 0x2f, 0x30, 0xc7, 0xa1, 0x80, 0x8f, - 0x41, 0x1e, 0x8f, 0xe5, 0x88, 0xf1, 0x40, 0x4e, 0x34, 0x7d, 0xb7, 0xf2, 0xed, 0xeb, 0xc3, 0x03, + 0xfb, 0x4f, 0xf5, 0x36, 0x7c, 0x0c, 0x72, 0x38, 0x64, 0x63, 0x2a, 0x35, 0x4a, 0xf7, 0x4e, 0x02, + 0xfa, 0xf3, 0xb2, 0x7e, 0x4b, 0x47, 0x11, 0xc3, 0xb7, 0x4e, 0xc0, 0x50, 0x88, 0xe5, 0xc8, 0x79, + 0x4e, 0xa5, 0x6b, 0xcc, 0xa9, 0x0c, 0xbb, 0xd7, 0x66, 0xc8, 0xa6, 0x32, 0x54, 0x41, 0x79, 0x03, + 0x74, 0x19, 0xe2, 0x83, 0x0e, 0xf1, 0x2a, 0x1a, 0x62, 0x49, 0x5e, 0x60, 0x8e, 0x43, 0x01, 0x4f, + 0x40, 0x1e, 0x8f, 0xe5, 0x88, 0xf1, 0x40, 0x4e, 0x34, 0x7d, 0xb7, 0xf2, 0xed, 0xeb, 0xc3, 0x03, 0x73, 0xc7, 0x26, 0xc0, 0x4b, 0xc9, 0x03, 0xea, 0xbb, 0x2b, 0x2b, 0x7c, 0x04, 0x72, 0x91, 0xaa, 0xa0, 0x12, 0x15, 0x3a, 0x25, 0x27, 0xfd, 0xd8, 0x1c, 0x5d, 0xdf, 0x8c, 0xc4, 0x78, 0x9f, 0x14, 0xa7, 0xbf, 0xbf, 0x3c, 0x58, 0x55, 0x31, 0xb0, 0xeb, 0x40, 0x0b, 0xd8, 0xce, 0xd5, 0x0e, 0xd8, @@ -383,7 +383,7 @@ var fileDescriptor_f8926fc6cb676914 = []byte{ 0x7c, 0x66, 0x5b, 0x17, 0x33, 0xdb, 0xfa, 0x35, 0xb3, 0xad, 0x8f, 0x73, 0x3b, 0x73, 0x31, 0xb7, 0x33, 0x3f, 0xe6, 0x76, 0xe6, 0x4d, 0xcb, 0x0f, 0xe4, 0x68, 0x3c, 0x70, 0x3c, 0x16, 0x2e, 0xf8, 0xd4, 0x6f, 0xdc, 0x3e, 0x41, 0x67, 0x86, 0x55, 0x4e, 0x22, 0x22, 0x06, 0x39, 0xf5, 0xe1, 0x1e, - 0xff, 0x09, 0x00, 0x00, 0xff, 0xff, 0x1a, 0xca, 0x10, 0x87, 0x89, 0x04, 0x00, 0x00, + 0xff, 0x09, 0x00, 0x00, 0xff, 0xff, 0x27, 0xf3, 0xf5, 0xf1, 0x89, 0x04, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/evm/types/events.pb.go b/x/evm/types/events.pb.go index 588971b074..832c2fde06 100644 --- a/x/evm/types/events.pb.go +++ b/x/evm/types/events.pb.go @@ -288,30 +288,30 @@ func init() { func init() { proto.RegisterFile("ethermint/evm/v1/events.proto", fileDescriptor_432e0d592184bde3) } var fileDescriptor_432e0d592184bde3 = []byte{ - // 364 bytes of a gzipped FileDescriptorProto + // 365 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x44, 0x51, 0x4d, 0x6b, 0xdb, 0x40, 0x14, 0xb4, 0x6a, 0x5b, 0xae, 0xb7, 0x2d, 0x2d, 0x4b, 0x69, 0x55, 0x68, 0x85, 0x11, 0x34, 0xc9, - 0x49, 0xc2, 0x84, 0xdc, 0x83, 0xc1, 0x21, 0x87, 0xe4, 0x12, 0x14, 0x02, 0xb9, 0x08, 0xd9, 0x7a, - 0xd1, 0x8a, 0x68, 0xb5, 0x42, 0xfb, 0x24, 0xd6, 0xff, 0x22, 0x3f, 0x2b, 0x90, 0x8b, 0x8f, 0x39, - 0x06, 0xfb, 0x8f, 0x84, 0x5d, 0x6d, 0x92, 0xcb, 0xb2, 0x33, 0xf3, 0x3e, 0x98, 0x37, 0xe4, 0x1f, - 0x20, 0x83, 0x86, 0x17, 0x15, 0x46, 0xd0, 0xf1, 0xa8, 0x9b, 0x47, 0xd0, 0x41, 0x85, 0x32, 0xac, - 0x1b, 0x81, 0x82, 0xfe, 0x78, 0x97, 0x43, 0xe8, 0x78, 0xd8, 0xcd, 0x83, 0x27, 0x87, 0x7c, 0x5f, - 0xea, 0x92, 0xa5, 0x56, 0xa0, 0xe5, 0xb1, 0xa2, 0xbf, 0x88, 0x9b, 0x72, 0xd1, 0x56, 0xe8, 0x39, - 0x33, 0xe7, 0x68, 0x7a, 0x65, 0x11, 0xfd, 0x43, 0x3e, 0x03, 0xb2, 0x84, 0xa5, 0x92, 0x79, 0x9f, - 0x8c, 0x32, 0x01, 0x64, 0xe7, 0xa9, 0x64, 0xf4, 0x27, 0x19, 0x17, 0x55, 0x06, 0xca, 0x1b, 0x1a, - 0xbe, 0x07, 0xba, 0x21, 0x4f, 0x65, 0xd2, 0x4a, 0xc8, 0xbc, 0x51, 0xdf, 0x90, 0xa7, 0xf2, 0x5a, - 0x42, 0x46, 0x29, 0x19, 0x99, 0x39, 0x63, 0x43, 0x9b, 0x3f, 0xfd, 0x4b, 0xa6, 0x0d, 0xac, 0x8b, - 0xba, 0x80, 0x0a, 0x3d, 0xd7, 0x08, 0x1f, 0x04, 0x0d, 0xc8, 0x37, 0xbd, 0x1d, 0x55, 0x72, 0x97, - 0x16, 0x25, 0x64, 0xde, 0xc4, 0x54, 0x7c, 0x01, 0x64, 0xb1, 0x3a, 0x33, 0x54, 0xf0, 0x9f, 0x10, - 0x63, 0x26, 0x56, 0x17, 0x22, 0xa7, 0xbf, 0xc9, 0x04, 0x55, 0x52, 0x8a, 0x5c, 0x7a, 0xce, 0x6c, - 0xa8, 0x8d, 0xa0, 0xe6, 0x65, 0x70, 0x43, 0xbe, 0x9a, 0xb2, 0x4b, 0x90, 0x32, 0xcd, 0x41, 0x1b, - 0xe6, 0x22, 0x6b, 0x4b, 0x78, 0x33, 0xdc, 0x23, 0xcd, 0x4b, 0xa8, 0x32, 0x68, 0xac, 0x5d, 0x8b, - 0xec, 0x60, 0xdc, 0xd4, 0x60, 0xfd, 0xba, 0xa8, 0xe2, 0x4d, 0x0d, 0xc1, 0xa1, 0x3d, 0xe6, 0xa2, - 0x14, 0xeb, 0xfb, 0x45, 0x29, 0x04, 0xd7, 0x97, 0x59, 0xe9, 0x8f, 0x1d, 0xdd, 0x83, 0xc5, 0xe9, - 0xe3, 0xce, 0x77, 0xb6, 0x3b, 0xdf, 0x79, 0xd9, 0xf9, 0xce, 0xc3, 0xde, 0x1f, 0x6c, 0xf7, 0xfe, - 0xe0, 0x79, 0xef, 0x0f, 0x6e, 0x0f, 0xf2, 0x02, 0x59, 0xbb, 0x0a, 0xd7, 0x82, 0xeb, 0x08, 0x85, - 0xb4, 0x6f, 0x37, 0x3f, 0x89, 0x94, 0x09, 0x55, 0xef, 0x95, 0x2b, 0xd7, 0x24, 0x7a, 0xfc, 0x1a, - 0x00, 0x00, 0xff, 0xff, 0x7b, 0x1e, 0x1b, 0x62, 0xf2, 0x01, 0x00, 0x00, + 0x49, 0xc2, 0x04, 0x72, 0x0e, 0x06, 0x87, 0x1c, 0x92, 0x4b, 0x50, 0x08, 0xe4, 0x22, 0x64, 0xeb, + 0x45, 0x2b, 0xa2, 0xd5, 0x0a, 0xed, 0x93, 0x58, 0xff, 0x8b, 0xfc, 0xac, 0x40, 0x2e, 0x3e, 0xe6, + 0x18, 0xec, 0x3f, 0x12, 0x76, 0xb5, 0x49, 0x2e, 0xcb, 0xce, 0xcc, 0xfb, 0x60, 0xde, 0x90, 0x7f, + 0x80, 0x0c, 0x1a, 0x5e, 0x54, 0x18, 0x41, 0xc7, 0xa3, 0x6e, 0x1e, 0x41, 0x07, 0x15, 0xca, 0xb0, + 0x6e, 0x04, 0x0a, 0xfa, 0xe3, 0x5d, 0x0e, 0xa1, 0xe3, 0x61, 0x37, 0x0f, 0x9e, 0x1c, 0xf2, 0x7d, + 0xa9, 0x4b, 0x96, 0x5a, 0x81, 0x96, 0xc7, 0x8a, 0xfe, 0x22, 0x6e, 0xca, 0x45, 0x5b, 0xa1, 0xe7, + 0xcc, 0x9c, 0xa3, 0xe9, 0x95, 0x45, 0xf4, 0x0f, 0xf9, 0x0c, 0xc8, 0x12, 0x96, 0x4a, 0xe6, 0x7d, + 0x32, 0xca, 0x04, 0x90, 0x9d, 0xa7, 0x92, 0xd1, 0x9f, 0x64, 0x5c, 0x54, 0x19, 0x28, 0x6f, 0x68, + 0xf8, 0x1e, 0xe8, 0x86, 0x3c, 0x95, 0x49, 0x2b, 0x21, 0xf3, 0x46, 0x7d, 0x43, 0x9e, 0xca, 0x6b, + 0x09, 0x19, 0xa5, 0x64, 0x64, 0xe6, 0x8c, 0x0d, 0x6d, 0xfe, 0xf4, 0x2f, 0x99, 0x36, 0xb0, 0x2e, + 0xea, 0x02, 0x2a, 0xf4, 0x5c, 0x23, 0x7c, 0x10, 0x34, 0x20, 0xdf, 0xf4, 0x76, 0x54, 0xc9, 0x5d, + 0x5a, 0x94, 0x90, 0x79, 0x13, 0x53, 0xf1, 0x05, 0x90, 0xc5, 0xea, 0xcc, 0x50, 0xc1, 0x7f, 0x42, + 0x8c, 0x99, 0x58, 0x5d, 0x88, 0x9c, 0xfe, 0x26, 0x13, 0x54, 0x49, 0x29, 0x72, 0xe9, 0x39, 0xb3, + 0xa1, 0x36, 0x82, 0x9a, 0x97, 0xc1, 0x0d, 0xf9, 0x6a, 0xca, 0x2e, 0x41, 0xca, 0x34, 0x07, 0x6d, + 0x98, 0x8b, 0xac, 0x2d, 0xe1, 0xcd, 0x70, 0x8f, 0x34, 0x2f, 0xa1, 0xca, 0xa0, 0xb1, 0x76, 0x2d, + 0xb2, 0x83, 0x71, 0x53, 0x83, 0xf5, 0xeb, 0xa2, 0x8a, 0x37, 0x35, 0x04, 0x87, 0xf6, 0x98, 0x8b, + 0x52, 0xac, 0xef, 0x17, 0xa5, 0x10, 0x5c, 0x5f, 0x66, 0xa5, 0x3f, 0x76, 0x74, 0x0f, 0x16, 0xa7, + 0x8f, 0x3b, 0xdf, 0xd9, 0xee, 0x7c, 0xe7, 0x65, 0xe7, 0x3b, 0x0f, 0x7b, 0x7f, 0xb0, 0xdd, 0xfb, + 0x83, 0xe7, 0xbd, 0x3f, 0xb8, 0x3d, 0xc8, 0x0b, 0x64, 0xed, 0x2a, 0x5c, 0x0b, 0xae, 0x23, 0x14, + 0xd2, 0xbe, 0xdd, 0xfc, 0x24, 0x52, 0x26, 0x54, 0xbd, 0x57, 0xae, 0x5c, 0x93, 0xe8, 0xf1, 0x6b, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x98, 0x9c, 0x05, 0x19, 0xf2, 0x01, 0x00, 0x00, } func (m *EventEthereumTx) Marshal() (dAtA []byte, err error) { diff --git a/x/evm/types/evm.pb.go b/x/evm/types/evm.pb.go index 3495ef0ef7..2ac9867d75 100644 --- a/x/evm/types/evm.pb.go +++ b/x/evm/types/evm.pb.go @@ -708,111 +708,111 @@ func init() { func init() { proto.RegisterFile("ethermint/evm/v1/evm.proto", fileDescriptor_d21ecc92c8c8583e) } var fileDescriptor_d21ecc92c8c8583e = []byte{ - // 1661 bytes of a gzipped FileDescriptorProto + // 1662 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x57, 0xcd, 0x4f, 0x23, 0xc9, 0x15, 0x07, 0x6c, 0xa0, 0x5d, 0x36, 0x76, 0x53, 0x18, 0xd6, 0x3b, 0xa3, 0xd0, 0xa4, 0x0f, 0x11, - 0x91, 0x76, 0x61, 0x60, 0x42, 0x76, 0xb4, 0xab, 0x7c, 0x4c, 0xcf, 0xb0, 0x09, 0x64, 0x76, 0x83, - 0x0a, 0x36, 0x51, 0xa2, 0x44, 0xad, 0x72, 0x77, 0x6d, 0xbb, 0x97, 0xee, 0x2e, 0xab, 0xaa, 0xda, - 0x63, 0xe7, 0x2f, 0x88, 0x94, 0x4b, 0xfe, 0x84, 0xfd, 0x73, 0x56, 0x39, 0xcd, 0x31, 0xca, 0xa1, - 0x15, 0x31, 0x37, 0x94, 0x13, 0xf7, 0x48, 0x51, 0x7d, 0xb8, 0xfd, 0x01, 0x61, 0x7d, 0x81, 0xfa, + 0x91, 0x76, 0x61, 0x60, 0xc2, 0xee, 0x68, 0x57, 0xf9, 0x98, 0x9e, 0x61, 0x13, 0xc8, 0xec, 0x06, + 0x15, 0x6c, 0xa2, 0x44, 0x89, 0x5a, 0xe5, 0xee, 0xda, 0x76, 0x2f, 0xdd, 0x5d, 0x56, 0x55, 0xb5, + 0xc7, 0xce, 0x5f, 0x10, 0x29, 0x97, 0xfc, 0x09, 0xfb, 0xe7, 0xac, 0x72, 0x9a, 0x63, 0x94, 0x43, + 0x2b, 0x62, 0x6e, 0x28, 0x27, 0xee, 0x91, 0xa2, 0xfa, 0x70, 0xfb, 0x03, 0x42, 0x7c, 0x81, 0xfa, 0xbd, 0x8f, 0xdf, 0xab, 0xf7, 0xea, 0xb5, 0x5f, 0x15, 0x78, 0x42, 0x44, 0x8f, 0xb0, 0x34, 0xce, 0xc4, 0x21, 0x19, 0xa4, 0x87, 0x83, 0x23, 0xf9, 0xef, 0xa0, 0xcf, 0xa8, 0xa0, 0xd0, 0x2e, 0x75, 0x07, 0x52, 0x38, 0x38, 0x7a, 0xd2, 0x8e, 0x68, 0x44, 0x95, 0xf2, 0x50, 0xae, 0xb4, 0x9d, 0xfb, - 0x9f, 0x0a, 0x58, 0xbb, 0xc0, 0x0c, 0xa7, 0x1c, 0x1e, 0x81, 0x1a, 0x19, 0xa4, 0x7e, 0x48, 0x32, - 0x9a, 0x76, 0x96, 0xf7, 0x96, 0xf7, 0x6b, 0x5e, 0xfb, 0xae, 0x70, 0xec, 0x11, 0x4e, 0x93, 0x4f, - 0xdd, 0x52, 0xe5, 0x22, 0x8b, 0x0c, 0xd2, 0xd7, 0x72, 0x09, 0x7f, 0x06, 0x36, 0x48, 0x86, 0xbb, + 0xef, 0x0a, 0x58, 0xbb, 0xc0, 0x0c, 0xa7, 0x1c, 0x1e, 0x81, 0x1a, 0x19, 0xa4, 0x7e, 0x48, 0x32, + 0x9a, 0x76, 0x96, 0xf7, 0x96, 0xf7, 0x6b, 0x5e, 0xfb, 0xae, 0x70, 0xec, 0x11, 0x4e, 0x93, 0xcf, + 0xdc, 0x52, 0xe5, 0x22, 0x8b, 0x0c, 0xd2, 0xd7, 0x72, 0x09, 0x7f, 0x0a, 0x36, 0x48, 0x86, 0xbb, 0x09, 0xf1, 0x03, 0x46, 0xb0, 0x20, 0x9d, 0x95, 0xbd, 0xe5, 0x7d, 0xcb, 0xeb, 0xdc, 0x15, 0x4e, - 0xdb, 0xb8, 0x4d, 0xab, 0x5d, 0xd4, 0xd0, 0xf8, 0x95, 0x82, 0xf0, 0x13, 0x50, 0x1f, 0xeb, 0x71, + 0xdb, 0xb8, 0x4d, 0xab, 0x5d, 0xd4, 0xd0, 0xf8, 0x95, 0x82, 0xf0, 0x53, 0x50, 0x1f, 0xeb, 0x71, 0x92, 0x74, 0x2a, 0xca, 0x79, 0xe7, 0xae, 0x70, 0xe0, 0xac, 0x33, 0x4e, 0x12, 0x17, 0x01, 0xe3, 0x8a, 0x93, 0x04, 0xbe, 0x04, 0x80, 0x0c, 0x05, 0xc3, 0x3e, 0x89, 0xfb, 0xbc, 0x53, 0xdd, 0xab, 0xec, 0x57, 0x3c, 0xf7, 0xa6, 0x70, 0x6a, 0xa7, 0x52, 0x7a, 0x7a, 0x76, 0xc1, 0xef, 0x0a, 0x67, - 0xd3, 0x90, 0x94, 0x86, 0x2e, 0xaa, 0x29, 0x70, 0x1a, 0xf7, 0x39, 0xfc, 0x33, 0x68, 0x04, 0x3d, - 0x1c, 0x67, 0x7e, 0x40, 0xb3, 0xaf, 0xe3, 0xa8, 0xb3, 0xba, 0xb7, 0xbc, 0x5f, 0x3f, 0xfe, 0xc1, - 0xc1, 0x7c, 0xdd, 0x0e, 0x5e, 0x49, 0xab, 0x57, 0xca, 0xc8, 0x7b, 0xfa, 0x5d, 0xe1, 0x2c, 0xdd, + 0xd3, 0x90, 0x94, 0x86, 0x2e, 0xaa, 0x29, 0x70, 0x1a, 0xf7, 0x39, 0xfc, 0x13, 0x68, 0x04, 0x3d, + 0x1c, 0x67, 0x7e, 0x40, 0xb3, 0x6f, 0xe2, 0xa8, 0xb3, 0xba, 0xb7, 0xbc, 0x5f, 0x3f, 0xfe, 0xc1, + 0xc1, 0x7c, 0xdd, 0x0e, 0x5e, 0x49, 0xab, 0x57, 0xca, 0xc8, 0x7b, 0xfa, 0x7d, 0xe1, 0x2c, 0xdd, 0x15, 0xce, 0x96, 0xa6, 0x9e, 0x26, 0x70, 0x51, 0x3d, 0x98, 0x58, 0xc2, 0x63, 0xb0, 0x8d, 0x93, 0x84, 0xbe, 0xf5, 0xf3, 0x4c, 0x16, 0x9a, 0x04, 0x82, 0x84, 0xbe, 0x18, 0xf2, 0xce, 0x9a, 0x4c, - 0x12, 0x6d, 0x29, 0xe5, 0x57, 0x13, 0xdd, 0xd5, 0x90, 0xc3, 0x8f, 0x01, 0xc4, 0x81, 0x88, 0x07, + 0x12, 0x6d, 0x29, 0xe5, 0xd7, 0x13, 0xdd, 0xd5, 0x90, 0xc3, 0x8f, 0x01, 0xc4, 0x81, 0x88, 0x07, 0xc4, 0xef, 0x33, 0x12, 0xd0, 0xb4, 0x1f, 0x27, 0x84, 0x77, 0xd6, 0xf7, 0x2a, 0xfb, 0x35, 0xb4, 0xa9, 0x35, 0x17, 0x13, 0x05, 0x3c, 0x06, 0x0d, 0x79, 0x28, 0x41, 0x0f, 0x67, 0x19, 0x49, 0x78, - 0xc7, 0x92, 0x86, 0x5e, 0xeb, 0xa6, 0x70, 0xea, 0xa7, 0xbf, 0xfb, 0xe2, 0x95, 0x11, 0xa3, 0x3a, - 0x19, 0xa4, 0x63, 0xe0, 0xfe, 0xb7, 0x09, 0xea, 0x53, 0x09, 0xc1, 0x3f, 0x81, 0x56, 0x8f, 0xa6, - 0x84, 0x0b, 0x82, 0x43, 0xbf, 0x9b, 0xd0, 0xe0, 0xda, 0x9c, 0xfc, 0xf3, 0x7f, 0x15, 0xce, 0x76, + 0xc7, 0x92, 0x86, 0x5e, 0xeb, 0xa6, 0x70, 0xea, 0xa7, 0xbf, 0xfd, 0xf2, 0x95, 0x11, 0xa3, 0x3a, + 0x19, 0xa4, 0x63, 0xe0, 0xfe, 0xa7, 0x09, 0xea, 0x53, 0x09, 0xc1, 0x3f, 0x82, 0x56, 0x8f, 0xa6, + 0x84, 0x0b, 0x82, 0x43, 0xbf, 0x9b, 0xd0, 0xe0, 0xda, 0x9c, 0xfc, 0xf3, 0x7f, 0x16, 0xce, 0x76, 0x40, 0x79, 0x4a, 0x39, 0x0f, 0xaf, 0x0f, 0x62, 0x7a, 0x98, 0x62, 0xd1, 0x3b, 0x38, 0xcb, 0xc4, 0x5d, 0xe1, 0xec, 0xe8, 0xf4, 0xe7, 0x3c, 0x5d, 0xd4, 0x2c, 0x25, 0x9e, 0x14, 0xc0, 0x1e, 0x68, - 0x86, 0x98, 0xfa, 0x5f, 0x53, 0x76, 0x6d, 0xc8, 0x57, 0x14, 0xb9, 0xf7, 0x7f, 0xc9, 0x6f, 0x0a, - 0xa7, 0xf1, 0xfa, 0xe5, 0x6f, 0x3f, 0xa7, 0xec, 0x5a, 0x51, 0xdc, 0x15, 0xce, 0xb6, 0x0e, 0x36, - 0x4b, 0xe4, 0xa2, 0x46, 0x88, 0x69, 0x69, 0x06, 0x7f, 0x0f, 0xec, 0xd2, 0x80, 0xe7, 0xfd, 0x3e, + 0x86, 0x98, 0xfa, 0xdf, 0x50, 0x76, 0x6d, 0xc8, 0x57, 0x14, 0xb9, 0xf7, 0x3f, 0xc9, 0x6f, 0x0a, + 0xa7, 0xf1, 0xfa, 0xe5, 0x6f, 0xbe, 0xa0, 0xec, 0x5a, 0x51, 0xdc, 0x15, 0xce, 0xb6, 0x0e, 0x36, + 0x4b, 0xe4, 0xa2, 0x46, 0x88, 0x69, 0x69, 0x06, 0x7f, 0x07, 0xec, 0xd2, 0x80, 0xe7, 0xfd, 0x3e, 0x65, 0xc2, 0xb4, 0xd3, 0xc7, 0x37, 0x85, 0xd3, 0x34, 0x94, 0x97, 0x5a, 0x73, 0x57, 0x38, 0x1f, 0xcc, 0x91, 0x1a, 0x1f, 0x17, 0x35, 0x0d, 0xad, 0x31, 0x85, 0x5d, 0xd0, 0x20, 0x71, 0xff, 0xe8, - 0xe4, 0x99, 0x49, 0xa0, 0xaa, 0x12, 0xf8, 0xc5, 0x63, 0x09, 0xd4, 0x4f, 0xcf, 0x2e, 0x8e, 0x4e, + 0xe4, 0x99, 0x49, 0xa0, 0xaa, 0x12, 0xf8, 0xf9, 0x63, 0x09, 0xd4, 0x4f, 0xcf, 0x2e, 0x8e, 0x4e, 0x9e, 0x8d, 0xf7, 0x6f, 0x7a, 0x65, 0x9a, 0xc5, 0x45, 0x75, 0x0d, 0xf5, 0xe6, 0xcf, 0x80, 0x81, - 0x7e, 0x0f, 0xf3, 0x9e, 0xea, 0xc4, 0x9a, 0xb7, 0x7f, 0x53, 0x38, 0x40, 0x33, 0xfd, 0x1a, 0xf3, - 0xde, 0xa4, 0xea, 0xdd, 0xd1, 0x5f, 0x70, 0x26, 0xe2, 0x3c, 0x1d, 0x73, 0x01, 0xed, 0x2c, 0xad, + 0x7e, 0x0f, 0xf3, 0x9e, 0xea, 0xc4, 0x9a, 0xb7, 0x7f, 0x53, 0x38, 0x40, 0x33, 0xfd, 0x0a, 0xf3, + 0xde, 0xa4, 0xea, 0xdd, 0xd1, 0x9f, 0x71, 0x26, 0xe2, 0x3c, 0x1d, 0x73, 0x01, 0xed, 0x2c, 0xad, 0xca, 0xed, 0x9e, 0x98, 0xed, 0xae, 0x2d, 0xba, 0xdd, 0x93, 0x87, 0xb6, 0x7b, 0x32, 0xbb, 0x5d, 0x6d, 0x53, 0xc6, 0x78, 0x61, 0x62, 0xac, 0x2f, 0x1a, 0xe3, 0xc5, 0x43, 0x31, 0x5e, 0xcc, 0xc6, 0xd0, 0x36, 0xb2, 0x2f, 0xe7, 0xf2, 0xec, 0x58, 0x0b, 0xf7, 0xe5, 0xbd, 0x0a, 0x35, 0x4b, 0x89, 0x66, 0xbf, 0x06, 0xed, 0x80, 0x66, 0x5c, 0x48, 0x59, 0x46, 0xfb, 0x09, 0x31, 0x21, 0x6a, 0x2a, 0xc4, 0x8b, 0xc7, 0x42, 0x3c, 0x35, 0x5f, 0xfe, 0x03, 0xee, 0x2e, 0xda, 0x9a, 0x15, 0xeb, 0x60, 0x3e, 0xb0, 0xfb, 0x44, 0x10, 0xc6, 0xbb, 0x39, 0x8b, 0x4c, 0x20, 0xa0, 0x02, 0xfd, 0xe4, 0xb1, - 0x40, 0xa6, 0x43, 0xe7, 0x5d, 0x5d, 0xd4, 0x9a, 0x88, 0x74, 0x80, 0x3f, 0x80, 0x66, 0x2c, 0xa3, + 0x40, 0xa6, 0x43, 0xe7, 0x5d, 0x5d, 0xd4, 0x9a, 0x88, 0x74, 0x80, 0xdf, 0x83, 0x66, 0x2c, 0xa3, 0x76, 0xf3, 0xc4, 0xd0, 0xd7, 0x15, 0xfd, 0xf1, 0x63, 0xf4, 0xe6, 0xab, 0x9a, 0x75, 0x74, 0xd1, 0xc6, 0x58, 0xa0, 0xa9, 0x43, 0x00, 0xd3, 0x3c, 0x66, 0x7e, 0x94, 0xe0, 0x20, 0x26, 0xcc, 0xd0, - 0x37, 0x14, 0xfd, 0x4f, 0x1f, 0xa3, 0xff, 0x50, 0xd3, 0xdf, 0x77, 0x76, 0x91, 0x2d, 0x85, 0xbf, - 0xd2, 0x32, 0x1d, 0xe5, 0x12, 0x34, 0xba, 0x84, 0x25, 0x71, 0x66, 0xf8, 0x37, 0x14, 0xff, 0xb3, - 0xc7, 0xf8, 0x4d, 0x07, 0x4d, 0xbb, 0xb9, 0xa8, 0xae, 0x61, 0x49, 0x9a, 0xd0, 0x2c, 0xa4, 0x63, - 0xd2, 0xcd, 0x85, 0x49, 0xa7, 0xdd, 0x5c, 0x54, 0xd7, 0x50, 0x93, 0x46, 0x60, 0x0b, 0x33, 0x46, - 0xdf, 0xce, 0x15, 0x04, 0x2a, 0xee, 0x4f, 0x1e, 0xe3, 0x7e, 0xa2, 0xb9, 0x1f, 0xf0, 0x76, 0xd1, - 0xa6, 0x92, 0xce, 0x94, 0x24, 0x04, 0x30, 0x62, 0x78, 0x34, 0x17, 0xa7, 0xbd, 0x70, 0xe1, 0xef, - 0x3b, 0xbb, 0xc8, 0x96, 0xc2, 0x99, 0x28, 0xdf, 0x80, 0x76, 0x4a, 0x58, 0x44, 0xfc, 0x8c, 0x08, - 0xde, 0x4f, 0x62, 0x61, 0xe2, 0x6c, 0x2f, 0xfc, 0x1d, 0x3c, 0xe4, 0xee, 0x22, 0xa8, 0xc4, 0x5f, - 0x1a, 0x69, 0xd9, 0xa5, 0xbc, 0x87, 0xb3, 0xa8, 0x87, 0x63, 0x13, 0x65, 0x67, 0xe1, 0x2e, 0x9d, - 0x75, 0x74, 0xd1, 0xc6, 0x58, 0x50, 0x1e, 0x75, 0x80, 0xb3, 0x20, 0x1f, 0x1f, 0xf5, 0x07, 0x0b, - 0x1f, 0xf5, 0xb4, 0x9b, 0x1c, 0xe0, 0x0a, 0x2a, 0xd2, 0xf3, 0xaa, 0xd5, 0xb4, 0x5b, 0xe7, 0x55, - 0xab, 0x65, 0xdb, 0xe7, 0x55, 0xcb, 0xb6, 0x37, 0xcf, 0xab, 0xd6, 0x96, 0xdd, 0x46, 0x1b, 0x23, - 0x9a, 0x50, 0x7f, 0xf0, 0x5c, 0x3b, 0xa1, 0x3a, 0x79, 0x8b, 0xb9, 0xf9, 0xa1, 0x41, 0xcd, 0x00, - 0x0b, 0x9c, 0x8c, 0xb8, 0x29, 0x04, 0xb2, 0x75, 0x79, 0xa6, 0xc6, 0xd6, 0x21, 0x58, 0xbd, 0x14, - 0xf2, 0xea, 0x63, 0x83, 0xca, 0x35, 0x19, 0xe9, 0x61, 0x8b, 0xe4, 0x12, 0xb6, 0xc1, 0xea, 0x00, - 0x27, 0xb9, 0xbe, 0x43, 0xd5, 0x90, 0x06, 0xee, 0x05, 0x68, 0x5d, 0x31, 0x9c, 0x71, 0x39, 0xfe, - 0x69, 0xf6, 0x86, 0x46, 0x1c, 0x42, 0x50, 0x55, 0x73, 0x42, 0xfb, 0xaa, 0x35, 0xfc, 0x31, 0xa8, - 0x26, 0x34, 0xe2, 0x9d, 0x95, 0xbd, 0xca, 0x7e, 0xfd, 0x78, 0xfb, 0xfe, 0x2d, 0xe6, 0x0d, 0x8d, - 0x90, 0x32, 0x71, 0xff, 0xb1, 0x02, 0x2a, 0x6f, 0x68, 0x04, 0x3b, 0x60, 0x1d, 0x87, 0x21, 0x23, - 0x9c, 0x1b, 0xa6, 0x31, 0x84, 0x3b, 0x60, 0x4d, 0xd0, 0x7e, 0x1c, 0x68, 0xba, 0x1a, 0x32, 0x48, - 0x06, 0x0e, 0xb1, 0xc0, 0x6a, 0xb0, 0x36, 0x90, 0x5a, 0xcb, 0x4b, 0x88, 0xca, 0xcc, 0xcf, 0xf2, - 0xb4, 0x4b, 0x98, 0x9a, 0x8f, 0x55, 0xaf, 0x75, 0x5b, 0x38, 0x75, 0x25, 0xff, 0x52, 0x89, 0xd1, - 0x34, 0x80, 0x1f, 0x81, 0x75, 0x31, 0x9c, 0x9e, 0x75, 0x5b, 0xb7, 0x85, 0xd3, 0x12, 0x93, 0x34, - 0xe5, 0x28, 0x43, 0x6b, 0x62, 0xa8, 0x46, 0xda, 0x21, 0xb0, 0xc4, 0xd0, 0x8f, 0xb3, 0x90, 0x0c, - 0xd5, 0x38, 0xab, 0x7a, 0xed, 0xdb, 0xc2, 0xb1, 0xa7, 0xcc, 0xcf, 0xa4, 0x0e, 0xad, 0x8b, 0xa1, - 0x5a, 0xc0, 0x8f, 0x00, 0xd0, 0x5b, 0x52, 0x11, 0xf4, 0x74, 0xda, 0xb8, 0x2d, 0x9c, 0x9a, 0x92, - 0x2a, 0xee, 0xc9, 0x12, 0xba, 0x60, 0x55, 0x73, 0x5b, 0x8a, 0xbb, 0x71, 0x5b, 0x38, 0x56, 0x42, - 0x23, 0xcd, 0xa9, 0x55, 0xb2, 0x54, 0x8c, 0xa4, 0x74, 0x40, 0x42, 0x35, 0x22, 0x2c, 0x34, 0x86, - 0xee, 0xdf, 0x56, 0x80, 0x75, 0x35, 0x44, 0x84, 0xe7, 0x89, 0x80, 0x9f, 0x03, 0x3b, 0xa0, 0x99, - 0x60, 0x38, 0x10, 0xfe, 0x4c, 0x69, 0xbd, 0xa7, 0x93, 0x1f, 0xf4, 0x79, 0x0b, 0x17, 0xb5, 0xc6, - 0xa2, 0x97, 0xa6, 0xfe, 0x6d, 0xb0, 0xda, 0x4d, 0x28, 0x4d, 0x55, 0x27, 0x34, 0x90, 0x06, 0x10, - 0xa9, 0xaa, 0xa9, 0x53, 0xae, 0xa8, 0xbb, 0xea, 0x0f, 0xef, 0x9f, 0xf2, 0x5c, 0xab, 0x78, 0x3b, - 0xe6, 0xbe, 0xda, 0xd4, 0xb1, 0x8d, 0xbf, 0x2b, 0x6b, 0xab, 0x5a, 0xc9, 0x06, 0x15, 0x46, 0x84, - 0x3a, 0xb4, 0x06, 0x92, 0x4b, 0xf8, 0x04, 0x58, 0x8c, 0x0c, 0x08, 0x13, 0x24, 0x54, 0x87, 0x63, - 0xa1, 0x12, 0xc3, 0x0f, 0x81, 0x15, 0x61, 0xee, 0xe7, 0x9c, 0x84, 0xfa, 0x24, 0xd0, 0x7a, 0x84, - 0xf9, 0x57, 0x9c, 0x84, 0x9f, 0x56, 0xff, 0xfa, 0xad, 0xb3, 0xe4, 0x62, 0x50, 0x7f, 0x19, 0x04, - 0x84, 0xf3, 0xab, 0xbc, 0x9f, 0x90, 0x47, 0x3a, 0xec, 0x18, 0x34, 0xb8, 0xa0, 0x0c, 0x47, 0xc4, - 0xbf, 0x26, 0x23, 0xd3, 0x67, 0xba, 0x6b, 0x8c, 0xfc, 0x37, 0x64, 0xc4, 0xd1, 0x34, 0x30, 0x21, - 0xbe, 0xad, 0x82, 0xfa, 0x15, 0xc3, 0x01, 0x31, 0x17, 0x58, 0xd9, 0xab, 0x12, 0x32, 0x13, 0xc2, - 0x20, 0x19, 0x5b, 0xc4, 0x29, 0xa1, 0xb9, 0x30, 0xdf, 0xd3, 0x18, 0x4a, 0x0f, 0x46, 0xc8, 0x90, - 0x04, 0xaa, 0x8c, 0x55, 0x64, 0x10, 0x3c, 0x01, 0x1b, 0x61, 0xcc, 0xd5, 0x83, 0x83, 0x0b, 0x1c, - 0x5c, 0xeb, 0xf4, 0x3d, 0xfb, 0xb6, 0x70, 0x1a, 0x46, 0x71, 0x29, 0xe5, 0x68, 0x06, 0xc1, 0xcf, - 0x40, 0x6b, 0xe2, 0xa6, 0x76, 0xab, 0xaf, 0xf8, 0x1e, 0xbc, 0x2d, 0x9c, 0x66, 0x69, 0xaa, 0x34, - 0x68, 0x0e, 0xcb, 0x93, 0x0e, 0x49, 0x37, 0x8f, 0x54, 0xf3, 0x59, 0x48, 0x03, 0x29, 0x4d, 0xe2, - 0x34, 0x16, 0xaa, 0xd9, 0x56, 0x91, 0x06, 0xf0, 0x33, 0x50, 0xa3, 0x03, 0xc2, 0x58, 0x1c, 0x12, - 0xae, 0x2e, 0x10, 0xdf, 0xf7, 0x5a, 0x41, 0x13, 0x7b, 0x99, 0x9c, 0x79, 0x4c, 0xa5, 0x24, 0xa5, - 0x6c, 0xa4, 0xae, 0x08, 0x26, 0x39, 0xad, 0xf8, 0x42, 0xc9, 0xd1, 0x0c, 0x82, 0x1e, 0x80, 0xc6, + 0x37, 0x14, 0xfd, 0x27, 0x8f, 0xd1, 0x7f, 0xa8, 0xe9, 0xef, 0x3b, 0xbb, 0xc8, 0x96, 0xc2, 0x5f, + 0x6a, 0x99, 0x8e, 0x72, 0x09, 0x1a, 0x5d, 0xc2, 0x92, 0x38, 0x33, 0xfc, 0x1b, 0x8a, 0xff, 0xd9, + 0x63, 0xfc, 0xa6, 0x83, 0xa6, 0xdd, 0x5c, 0x54, 0xd7, 0xb0, 0x24, 0x4d, 0x68, 0x16, 0xd2, 0x31, + 0xe9, 0xe6, 0xc2, 0xa4, 0xd3, 0x6e, 0x2e, 0xaa, 0x6b, 0xa8, 0x49, 0x23, 0xb0, 0x85, 0x19, 0xa3, + 0x6f, 0xe7, 0x0a, 0x02, 0x15, 0xf7, 0xa7, 0x8f, 0x71, 0x3f, 0xd1, 0xdc, 0x0f, 0x78, 0xbb, 0x68, + 0x53, 0x49, 0x67, 0x4a, 0x12, 0x02, 0x18, 0x31, 0x3c, 0x9a, 0x8b, 0xd3, 0x5e, 0xb8, 0xf0, 0xf7, + 0x9d, 0x5d, 0x64, 0x4b, 0xe1, 0x4c, 0x94, 0x6f, 0x41, 0x3b, 0x25, 0x2c, 0x22, 0x7e, 0x46, 0x04, + 0xef, 0x27, 0xb1, 0x30, 0x71, 0xb6, 0x17, 0xfe, 0x0e, 0x1e, 0x72, 0x77, 0x11, 0x54, 0xe2, 0xaf, + 0x8c, 0xb4, 0xec, 0x52, 0xde, 0xc3, 0x59, 0xd4, 0xc3, 0xb1, 0x89, 0xb2, 0xb3, 0x70, 0x97, 0xce, + 0x3a, 0xba, 0x68, 0x63, 0x2c, 0x28, 0x8f, 0x3a, 0xc0, 0x59, 0x90, 0x8f, 0x8f, 0xfa, 0x83, 0x85, + 0x8f, 0x7a, 0xda, 0x4d, 0x0e, 0x70, 0x05, 0x15, 0xe9, 0x79, 0xd5, 0x6a, 0xda, 0xad, 0xf3, 0xaa, + 0xd5, 0xb2, 0xed, 0xf3, 0xaa, 0x65, 0xdb, 0x9b, 0xe7, 0x55, 0x6b, 0xcb, 0x6e, 0xa3, 0x8d, 0x11, + 0x4d, 0xa8, 0x3f, 0x78, 0xae, 0x9d, 0x50, 0x9d, 0xbc, 0xc5, 0xdc, 0xfc, 0xd0, 0xa0, 0x66, 0x80, + 0x05, 0x4e, 0x46, 0xdc, 0x14, 0x02, 0xd9, 0xba, 0x3c, 0x53, 0x63, 0xeb, 0x10, 0xac, 0x5e, 0x0a, + 0x79, 0xf5, 0xb1, 0x41, 0xe5, 0x9a, 0x8c, 0xf4, 0xb0, 0x45, 0x72, 0x09, 0xdb, 0x60, 0x75, 0x80, + 0x93, 0x5c, 0xdf, 0xa1, 0x6a, 0x48, 0x03, 0xf7, 0x02, 0xb4, 0xae, 0x18, 0xce, 0xb8, 0x1c, 0xff, + 0x34, 0x7b, 0x43, 0x23, 0x0e, 0x21, 0xa8, 0xaa, 0x39, 0xa1, 0x7d, 0xd5, 0x1a, 0xfe, 0x18, 0x54, + 0x13, 0x1a, 0xf1, 0xce, 0xca, 0x5e, 0x65, 0xbf, 0x7e, 0xbc, 0x7d, 0xff, 0x16, 0xf3, 0x86, 0x46, + 0x48, 0x99, 0xb8, 0x7f, 0x5f, 0x01, 0x95, 0x37, 0x34, 0x82, 0x1d, 0xb0, 0x8e, 0xc3, 0x90, 0x11, + 0xce, 0x0d, 0xd3, 0x18, 0xc2, 0x1d, 0xb0, 0x26, 0x68, 0x3f, 0x0e, 0x34, 0x5d, 0x0d, 0x19, 0x24, + 0x03, 0x87, 0x58, 0x60, 0x35, 0x58, 0x1b, 0x48, 0xad, 0xe5, 0x25, 0x44, 0x65, 0xe6, 0x67, 0x79, + 0xda, 0x25, 0x4c, 0xcd, 0xc7, 0xaa, 0xd7, 0xba, 0x2d, 0x9c, 0xba, 0x92, 0x7f, 0xa5, 0xc4, 0x68, + 0x1a, 0xc0, 0x8f, 0xc0, 0xba, 0x18, 0x4e, 0xcf, 0xba, 0xad, 0xdb, 0xc2, 0x69, 0x89, 0x49, 0x9a, + 0x72, 0x94, 0xa1, 0x35, 0x31, 0x54, 0x23, 0xed, 0x10, 0x58, 0x62, 0xe8, 0xc7, 0x59, 0x48, 0x86, + 0x6a, 0x9c, 0x55, 0xbd, 0xf6, 0x6d, 0xe1, 0xd8, 0x53, 0xe6, 0x67, 0x52, 0x87, 0xd6, 0xc5, 0x50, + 0x2d, 0xe0, 0x47, 0x00, 0xe8, 0x2d, 0xa9, 0x08, 0x7a, 0x3a, 0x6d, 0xdc, 0x16, 0x4e, 0x4d, 0x49, + 0x15, 0xf7, 0x64, 0x09, 0x5d, 0xb0, 0xaa, 0xb9, 0x2d, 0xc5, 0xdd, 0xb8, 0x2d, 0x1c, 0x2b, 0xa1, + 0x91, 0xe6, 0xd4, 0x2a, 0x59, 0x2a, 0x46, 0x52, 0x3a, 0x20, 0xa1, 0x1a, 0x11, 0x16, 0x1a, 0x43, + 0xf7, 0xaf, 0x2b, 0xc0, 0xba, 0x1a, 0x22, 0xc2, 0xf3, 0x44, 0xc0, 0x2f, 0x80, 0x1d, 0xd0, 0x4c, + 0x30, 0x1c, 0x08, 0x7f, 0xa6, 0xb4, 0xde, 0xd3, 0xc9, 0x0f, 0xfa, 0xbc, 0x85, 0x8b, 0x5a, 0x63, + 0xd1, 0x4b, 0x53, 0xff, 0x36, 0x58, 0xed, 0x26, 0x94, 0xa6, 0xaa, 0x13, 0x1a, 0x48, 0x03, 0x88, + 0x54, 0xd5, 0xd4, 0x29, 0x57, 0xd4, 0x5d, 0xf5, 0x87, 0xf7, 0x4f, 0x79, 0xae, 0x55, 0xbc, 0x1d, + 0x73, 0x5f, 0x6d, 0xea, 0xd8, 0xc6, 0xdf, 0x95, 0xb5, 0x55, 0xad, 0x64, 0x83, 0x0a, 0x23, 0x42, + 0x1d, 0x5a, 0x03, 0xc9, 0x25, 0x7c, 0x02, 0x2c, 0x46, 0x06, 0x84, 0x09, 0x12, 0xaa, 0xc3, 0xb1, + 0x50, 0x89, 0xe1, 0x87, 0xc0, 0x8a, 0x30, 0xf7, 0x73, 0x4e, 0x42, 0x7d, 0x12, 0x68, 0x3d, 0xc2, + 0xfc, 0x6b, 0x4e, 0xc2, 0xcf, 0xaa, 0x7f, 0xf9, 0xce, 0x59, 0x72, 0x31, 0xa8, 0xbf, 0x0c, 0x02, + 0xc2, 0xf9, 0x55, 0xde, 0x4f, 0xc8, 0x23, 0x1d, 0x76, 0x0c, 0x1a, 0x5c, 0x50, 0x86, 0x23, 0xe2, + 0x5f, 0x93, 0x91, 0xe9, 0x33, 0xdd, 0x35, 0x46, 0xfe, 0x6b, 0x32, 0xe2, 0x68, 0x1a, 0x98, 0x10, + 0xdf, 0x55, 0x41, 0xfd, 0x8a, 0xe1, 0x80, 0x98, 0x0b, 0xac, 0xec, 0x55, 0x09, 0x99, 0x09, 0x61, + 0x90, 0x8c, 0x2d, 0xe2, 0x94, 0xd0, 0x5c, 0x98, 0xef, 0x69, 0x0c, 0xa5, 0x07, 0x23, 0x64, 0x48, + 0x02, 0x55, 0xc6, 0x2a, 0x32, 0x08, 0x9e, 0x80, 0x8d, 0x30, 0xe6, 0xea, 0xc1, 0xc1, 0x05, 0x0e, + 0xae, 0x75, 0xfa, 0x9e, 0x7d, 0x5b, 0x38, 0x0d, 0xa3, 0xb8, 0x94, 0x72, 0x34, 0x83, 0xe0, 0xe7, + 0xa0, 0x35, 0x71, 0x53, 0xbb, 0xd5, 0x57, 0x7c, 0x0f, 0xde, 0x16, 0x4e, 0xb3, 0x34, 0x55, 0x1a, + 0x34, 0x87, 0xe5, 0x49, 0x87, 0xa4, 0x9b, 0x47, 0xaa, 0xf9, 0x2c, 0xa4, 0x81, 0x94, 0x26, 0x71, + 0x1a, 0x0b, 0xd5, 0x6c, 0xab, 0x48, 0x03, 0xf8, 0x39, 0xa8, 0xd1, 0x01, 0x61, 0x2c, 0x0e, 0x09, + 0x57, 0x17, 0x88, 0xff, 0xf7, 0x5a, 0x41, 0x13, 0x7b, 0x99, 0x9c, 0x79, 0x4c, 0xa5, 0x24, 0xa5, + 0x6c, 0xa4, 0xae, 0x08, 0x26, 0x39, 0xad, 0xf8, 0x52, 0xc9, 0xd1, 0x0c, 0x82, 0x1e, 0x80, 0xc6, 0x8d, 0x11, 0x91, 0xb3, 0xcc, 0x57, 0xdf, 0x7f, 0x43, 0xf9, 0xaa, 0xaf, 0x50, 0x6b, 0x91, 0x52, - 0xbe, 0xc6, 0x02, 0xa3, 0x7b, 0x12, 0xf8, 0x73, 0x00, 0xf5, 0x99, 0xf8, 0xdf, 0x70, 0x5a, 0x3e, + 0xbe, 0xc6, 0x02, 0xa3, 0x7b, 0x12, 0xf8, 0x33, 0x00, 0xf5, 0x99, 0xf8, 0xdf, 0x72, 0x5a, 0x3e, 0xb7, 0xf4, 0x8c, 0x57, 0xf1, 0xb5, 0xd6, 0xec, 0xd9, 0xd6, 0xe8, 0x9c, 0x53, 0x93, 0xc5, 0x79, 0xd5, 0xaa, 0xda, 0xab, 0xe7, 0x55, 0x6b, 0xdd, 0xb6, 0xca, 0xfa, 0x99, 0x2c, 0xd0, 0xd6, 0x18, - 0x4f, 0x6d, 0xcf, 0xfb, 0xe5, 0x77, 0x37, 0xbb, 0xcb, 0xef, 0x6e, 0x76, 0x97, 0xff, 0x7d, 0xb3, - 0xbb, 0xfc, 0xf7, 0xf7, 0xbb, 0x4b, 0xef, 0xde, 0xef, 0x2e, 0xfd, 0xf3, 0xfd, 0xee, 0xd2, 0x1f, - 0x7f, 0x14, 0xc5, 0xa2, 0x97, 0x77, 0x0f, 0x02, 0x9a, 0xca, 0xa7, 0x32, 0xe5, 0xe6, 0xef, 0xe0, - 0xe8, 0xe4, 0x70, 0xa8, 0xde, 0xd0, 0x62, 0xd4, 0x27, 0xbc, 0xbb, 0xa6, 0xde, 0xc6, 0xcf, 0xff, - 0x17, 0x00, 0x00, 0xff, 0xff, 0x90, 0x8e, 0x98, 0x1a, 0x61, 0x0f, 0x00, 0x00, + 0x4f, 0x6d, 0xcf, 0xfb, 0xc5, 0xf7, 0x37, 0xbb, 0xcb, 0xef, 0x6e, 0x76, 0x97, 0xff, 0x75, 0xb3, + 0xbb, 0xfc, 0xb7, 0xf7, 0xbb, 0x4b, 0xef, 0xde, 0xef, 0x2e, 0xfd, 0xe3, 0xfd, 0xee, 0xd2, 0x1f, + 0x7e, 0x14, 0xc5, 0xa2, 0x97, 0x77, 0x0f, 0x02, 0x9a, 0xca, 0xa7, 0x32, 0xe5, 0xe6, 0xef, 0xe0, + 0xe8, 0x93, 0xc3, 0xa1, 0x7a, 0x43, 0x8b, 0x51, 0x9f, 0xf0, 0xee, 0x9a, 0x7a, 0x1b, 0x3f, 0xff, + 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x73, 0x0c, 0x86, 0x61, 0x61, 0x0f, 0x00, 0x00, } func (m *Params) Marshal() (dAtA []byte, err error) { diff --git a/x/evm/types/genesis.pb.go b/x/evm/types/genesis.pb.go index 360bc56a0c..a4a49704fb 100644 --- a/x/evm/types/genesis.pb.go +++ b/x/evm/types/genesis.pb.go @@ -155,23 +155,23 @@ var fileDescriptor_9bcdec50cc9d156d = []byte{ // 300 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x50, 0xbf, 0x4e, 0x83, 0x40, 0x18, 0xe7, 0x6c, 0xd3, 0xda, 0xab, 0x51, 0x73, 0x31, 0x91, 0x30, 0x5c, 0x49, 0x07, 0xc3, 0x74, - 0x84, 0x1a, 0x9d, 0x95, 0xc5, 0xd5, 0xd0, 0xcd, 0xed, 0x0a, 0x5f, 0x28, 0x03, 0x1c, 0xe1, 0xae, - 0x44, 0x57, 0x47, 0x27, 0x9f, 0xc3, 0x27, 0xe9, 0xd8, 0xd1, 0x49, 0x0d, 0xbc, 0x88, 0xe1, 0xa0, - 0x4d, 0x94, 0xe5, 0xf2, 0xdd, 0xfd, 0xfe, 0x7d, 0xf7, 0xc3, 0x14, 0xd4, 0x1a, 0x8a, 0x34, 0xc9, - 0x94, 0x0b, 0x65, 0xea, 0x96, 0x9e, 0x1b, 0x43, 0x06, 0x32, 0x91, 0x2c, 0x2f, 0x84, 0x12, 0xe4, - 0xfc, 0x80, 0x33, 0x28, 0x53, 0x56, 0x7a, 0x96, 0xd5, 0x53, 0x34, 0x80, 0x66, 0x5b, 0x17, 0xb1, - 0x88, 0x85, 0x1e, 0xdd, 0x66, 0x6a, 0x5f, 0xe7, 0x6f, 0x08, 0x9f, 0x3c, 0xb4, 0xae, 0x4b, 0xc5, - 0x15, 0x10, 0x1f, 0x1f, 0xf3, 0x30, 0x14, 0x9b, 0x4c, 0x49, 0x13, 0xd9, 0x03, 0x67, 0xba, 0xb0, - 0xd9, 0xff, 0x1c, 0xd6, 0x29, 0xee, 0x5b, 0xa2, 0x3f, 0xdc, 0x7e, 0xcd, 0x8c, 0xe0, 0xa0, 0x23, - 0xb7, 0x78, 0x94, 0xf3, 0x82, 0xa7, 0xd2, 0x3c, 0xb2, 0x91, 0x33, 0x5d, 0x98, 0x7d, 0x87, 0x47, - 0x8d, 0x77, 0xca, 0x8e, 0x3d, 0x7f, 0x45, 0xf8, 0xf4, 0xaf, 0x35, 0x31, 0xf1, 0x98, 0x47, 0x51, - 0x01, 0xb2, 0xd9, 0x06, 0x39, 0x93, 0x60, 0x7f, 0x25, 0x04, 0x0f, 0x43, 0x11, 0x81, 0x8e, 0x98, - 0x04, 0x7a, 0x26, 0x3e, 0x1e, 0x4b, 0x25, 0x0a, 0x1e, 0x83, 0x39, 0xd0, 0xbb, 0x5f, 0xf6, 0x93, - 0xf5, 0x37, 0xfd, 0xb3, 0x26, 0xf8, 0xe3, 0x7b, 0x36, 0x5e, 0xb6, 0xfc, 0x60, 0x2f, 0xf4, 0xef, - 0xb6, 0x15, 0x45, 0xbb, 0x8a, 0xa2, 0x9f, 0x8a, 0xa2, 0xf7, 0x9a, 0x1a, 0xbb, 0x9a, 0x1a, 0x9f, - 0x35, 0x35, 0x9e, 0xae, 0xe2, 0x44, 0xad, 0x37, 0x2b, 0x16, 0x8a, 0xb4, 0xe9, 0x55, 0xc8, 0xee, - 0x2c, 0xbd, 0x1b, 0xf7, 0x59, 0x17, 0xae, 0x5e, 0x72, 0x90, 0xab, 0x91, 0xae, 0xf6, 0xfa, 0x37, - 0x00, 0x00, 0xff, 0xff, 0xd7, 0xc9, 0x33, 0x2a, 0xc0, 0x01, 0x00, 0x00, + 0x84, 0x9a, 0x74, 0x56, 0x16, 0x57, 0x43, 0x37, 0xb7, 0x2b, 0x7c, 0xa1, 0x0c, 0x70, 0x84, 0xbb, + 0x12, 0x5d, 0x1d, 0x9d, 0x7c, 0x0e, 0x9f, 0xa4, 0x63, 0x47, 0x27, 0x35, 0xf0, 0x22, 0x86, 0x83, + 0x36, 0x51, 0x96, 0xcb, 0x77, 0xf7, 0xfb, 0xf7, 0xdd, 0x0f, 0x53, 0x50, 0x1b, 0x28, 0xd2, 0x24, + 0x53, 0x2e, 0x94, 0xa9, 0x5b, 0x7a, 0x6e, 0x0c, 0x19, 0xc8, 0x44, 0xb2, 0xbc, 0x10, 0x4a, 0x90, + 0xcb, 0x23, 0xce, 0xa0, 0x4c, 0x59, 0xe9, 0x59, 0x56, 0x4f, 0xd1, 0x00, 0x9a, 0x6d, 0x5d, 0xc5, + 0x22, 0x16, 0x7a, 0x74, 0x9b, 0xa9, 0x7d, 0x9d, 0xbf, 0x21, 0x7c, 0xf6, 0xd0, 0xba, 0xae, 0x14, + 0x57, 0x40, 0x7c, 0x7c, 0xca, 0xc3, 0x50, 0x6c, 0x33, 0x25, 0x4d, 0x64, 0x0f, 0x9c, 0xe9, 0xc2, + 0x66, 0xff, 0x73, 0x58, 0xa7, 0xb8, 0x6f, 0x89, 0xfe, 0x70, 0xf7, 0x35, 0x33, 0x82, 0xa3, 0x8e, + 0x2c, 0xf1, 0x28, 0xe7, 0x05, 0x4f, 0xa5, 0x79, 0x62, 0x23, 0x67, 0xba, 0x30, 0xfb, 0x0e, 0x8f, + 0x1a, 0xef, 0x94, 0x1d, 0x7b, 0xfe, 0x8a, 0xf0, 0xf9, 0x5f, 0x6b, 0x62, 0xe2, 0x31, 0x8f, 0xa2, + 0x02, 0x64, 0xb3, 0x0d, 0x72, 0x26, 0xc1, 0xe1, 0x4a, 0x08, 0x1e, 0x86, 0x22, 0x02, 0x1d, 0x31, + 0x09, 0xf4, 0x4c, 0x7c, 0x3c, 0x96, 0x4a, 0x14, 0x3c, 0x06, 0x73, 0xa0, 0x77, 0xbf, 0xee, 0x27, + 0xeb, 0x6f, 0xfa, 0x17, 0x4d, 0xf0, 0xc7, 0xf7, 0x6c, 0xbc, 0x6a, 0xf9, 0xc1, 0x41, 0xe8, 0xdf, + 0xed, 0x2a, 0x8a, 0xf6, 0x15, 0x45, 0x3f, 0x15, 0x45, 0xef, 0x35, 0x35, 0xf6, 0x35, 0x35, 0x3e, + 0x6b, 0x6a, 0x3c, 0xdd, 0xc4, 0x89, 0xda, 0x6c, 0xd7, 0x2c, 0x14, 0x69, 0xd3, 0xab, 0x90, 0xdd, + 0x59, 0x7a, 0x4b, 0xf7, 0x59, 0x17, 0xae, 0x5e, 0x72, 0x90, 0xeb, 0x91, 0xae, 0xf6, 0xf6, 0x37, + 0x00, 0x00, 0xff, 0xff, 0x34, 0x4b, 0x2d, 0x51, 0xc0, 0x01, 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { diff --git a/x/evm/types/query.pb.go b/x/evm/types/query.pb.go index d52619822e..d8c59c5949 100644 --- a/x/evm/types/query.pb.go +++ b/x/evm/types/query.pb.go @@ -1333,99 +1333,99 @@ func init() { func init() { proto.RegisterFile("ethermint/evm/v1/query.proto", fileDescriptor_e15a877459347994) } var fileDescriptor_e15a877459347994 = []byte{ - // 1466 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x56, 0xcf, 0x6f, 0x1b, 0x45, - 0x14, 0xce, 0xc6, 0x4e, 0xec, 0x8c, 0x93, 0xd6, 0x4c, 0xd3, 0xd6, 0xd9, 0x26, 0x76, 0xba, 0x90, - 0xd8, 0x2d, 0xed, 0x6e, 0x13, 0xa0, 0x12, 0x5c, 0x68, 0x6d, 0xb5, 0xa5, 0xb4, 0x45, 0xc5, 0x44, - 0x1c, 0x90, 0x90, 0x35, 0x5e, 0x4f, 0xd7, 0x56, 0xbc, 0x3b, 0xee, 0xce, 0xd8, 0x72, 0x5a, 0xf5, - 0x40, 0x55, 0xf1, 0x43, 0x5c, 0x2a, 0x71, 0xe3, 0xd4, 0x3b, 0x37, 0x2e, 0x1c, 0xb9, 0xf6, 0x58, - 0x89, 0x0b, 0xe2, 0x50, 0x50, 0xc3, 0x81, 0xbf, 0x81, 0x13, 0x9a, 0x1f, 0x6b, 0xef, 0xda, 0xde, - 0x38, 0x45, 0xe5, 0xc6, 0x69, 0x77, 0x66, 0xde, 0xbc, 0xef, 0x9b, 0xf7, 0xde, 0xcc, 0xfb, 0xc0, - 0x2a, 0x66, 0x4d, 0xec, 0xbb, 0x2d, 0x8f, 0x59, 0xb8, 0xe7, 0x5a, 0xbd, 0x2d, 0xeb, 0x6e, 0x17, - 0xfb, 0x7b, 0x66, 0xc7, 0x27, 0x8c, 0xc0, 0xec, 0x60, 0xd5, 0xc4, 0x3d, 0xd7, 0xec, 0x6d, 0xe9, - 0x67, 0x6d, 0x42, 0x5d, 0x42, 0xad, 0x3a, 0xa2, 0x58, 0x9a, 0x5a, 0xbd, 0xad, 0x3a, 0x66, 0x68, - 0xcb, 0xea, 0x20, 0xa7, 0xe5, 0x21, 0xd6, 0x22, 0x9e, 0xdc, 0xad, 0xeb, 0x63, 0xbe, 0xb9, 0x13, - 0xb9, 0xb6, 0x32, 0xb6, 0xc6, 0xfa, 0x6a, 0x69, 0xd9, 0x21, 0x0e, 0x11, 0xbf, 0x16, 0xff, 0x53, - 0xb3, 0xab, 0x0e, 0x21, 0x4e, 0x1b, 0x5b, 0xa8, 0xd3, 0xb2, 0x90, 0xe7, 0x11, 0x26, 0x90, 0xa8, - 0x5a, 0x2d, 0xa8, 0x55, 0x31, 0xaa, 0x77, 0xef, 0x58, 0xac, 0xe5, 0x62, 0xca, 0x90, 0xdb, 0x91, - 0x06, 0xc6, 0xbb, 0xe0, 0xd8, 0xc7, 0x9c, 0xed, 0x65, 0xdb, 0x26, 0x5d, 0x8f, 0x55, 0xf1, 0xdd, - 0x2e, 0xa6, 0x0c, 0xe6, 0x40, 0x0a, 0x35, 0x1a, 0x3e, 0xa6, 0x34, 0xa7, 0xad, 0x6b, 0xa5, 0x85, - 0x6a, 0x30, 0x7c, 0x2f, 0xfd, 0xf5, 0x93, 0xc2, 0xcc, 0x5f, 0x4f, 0x0a, 0x33, 0x86, 0x0d, 0x96, - 0xa3, 0x5b, 0x69, 0x87, 0x78, 0x14, 0xf3, 0xbd, 0x75, 0xd4, 0x46, 0x9e, 0x8d, 0x83, 0xbd, 0x6a, - 0x08, 0x4f, 0x81, 0x05, 0x9b, 0x34, 0x70, 0xad, 0x89, 0x68, 0x33, 0x37, 0x2b, 0xd6, 0xd2, 0x7c, - 0xe2, 0x03, 0x44, 0x9b, 0x70, 0x19, 0xcc, 0x79, 0x84, 0x6f, 0x4a, 0xac, 0x6b, 0xa5, 0x64, 0x55, - 0x0e, 0x8c, 0xf7, 0xc1, 0x8a, 0x00, 0xa9, 0x88, 0xf0, 0xfe, 0x0b, 0x96, 0x5f, 0x6a, 0x40, 0x9f, - 0xe4, 0x41, 0x91, 0xdd, 0x00, 0x47, 0x64, 0xe6, 0x6a, 0x51, 0x4f, 0x4b, 0x72, 0xf6, 0xb2, 0x9c, - 0x84, 0x3a, 0x48, 0x53, 0x0e, 0xca, 0xf9, 0xcd, 0x0a, 0x7e, 0x83, 0x31, 0x77, 0x81, 0xa4, 0xd7, - 0x9a, 0xd7, 0x75, 0xeb, 0xd8, 0x57, 0x27, 0x58, 0x52, 0xb3, 0x1f, 0x89, 0x49, 0xe3, 0x06, 0x58, - 0x15, 0x3c, 0x3e, 0x45, 0xed, 0x56, 0x03, 0x31, 0xe2, 0x8f, 0x1c, 0xe6, 0x34, 0x58, 0xb4, 0x89, - 0x37, 0xca, 0x23, 0xc3, 0xe7, 0x2e, 0x8f, 0x9d, 0xea, 0x5b, 0x0d, 0xac, 0xc5, 0x78, 0x53, 0x07, - 0x2b, 0x82, 0xa3, 0x01, 0xab, 0xa8, 0xc7, 0x80, 0xec, 0x2b, 0x3c, 0x5a, 0x50, 0x44, 0x65, 0x99, - 0xe7, 0x97, 0x49, 0xcf, 0x05, 0x55, 0x44, 0x83, 0xad, 0xd3, 0x8a, 0xc8, 0xb8, 0xa1, 0xc0, 0x3e, - 0x61, 0xc4, 0x47, 0xce, 0x74, 0x30, 0x98, 0x05, 0x89, 0x5d, 0xbc, 0xa7, 0xea, 0x8d, 0xff, 0x86, - 0xe0, 0xcf, 0x29, 0xf8, 0x81, 0x33, 0x05, 0xbf, 0x0c, 0xe6, 0x7a, 0xa8, 0xdd, 0x0d, 0xc0, 0xe5, - 0xc0, 0xb8, 0x08, 0xb2, 0xaa, 0x94, 0x1a, 0x2f, 0x75, 0xc8, 0x22, 0x78, 0x2d, 0xb4, 0x4f, 0x41, - 0x40, 0x90, 0xe4, 0xb5, 0x2f, 0x76, 0x2d, 0x56, 0xc5, 0xbf, 0x71, 0x0f, 0x40, 0x61, 0xb8, 0xd3, - 0xbf, 0x49, 0x1c, 0x1a, 0x40, 0x40, 0x90, 0x14, 0x37, 0x46, 0xfa, 0x17, 0xff, 0xf0, 0x2a, 0x00, - 0xc3, 0x77, 0x45, 0x9c, 0x2d, 0xb3, 0xbd, 0x69, 0xca, 0xa2, 0x35, 0xf9, 0x23, 0x64, 0xca, 0xf7, - 0x4a, 0x3d, 0x42, 0xe6, 0xed, 0x61, 0xa8, 0xaa, 0xa1, 0x9d, 0x21, 0x92, 0xdf, 0x68, 0x2a, 0xb0, - 0x01, 0xb8, 0xe2, 0x79, 0x06, 0x24, 0xdb, 0xc4, 0xe1, 0xa7, 0x4b, 0x94, 0x32, 0xdb, 0xc7, 0xcd, - 0xd1, 0xa7, 0xcf, 0xbc, 0x49, 0x9c, 0xaa, 0x30, 0x81, 0xd7, 0x26, 0x90, 0x2a, 0x4e, 0x25, 0x25, - 0x71, 0xc2, 0xac, 0x8c, 0x65, 0x15, 0x87, 0xdb, 0xc8, 0x47, 0x6e, 0x10, 0x07, 0xe3, 0x96, 0x22, - 0x18, 0xcc, 0x2a, 0x82, 0x17, 0xc1, 0x7c, 0x47, 0xcc, 0x88, 0x00, 0x65, 0xb6, 0x73, 0xe3, 0x14, - 0xe5, 0x8e, 0x72, 0xf2, 0xe9, 0xf3, 0xc2, 0x4c, 0x55, 0x59, 0x1b, 0x3f, 0x69, 0xe0, 0xc8, 0x15, - 0xd6, 0xac, 0xa0, 0x76, 0x3b, 0x14, 0x69, 0xe4, 0x3b, 0x34, 0xc8, 0x09, 0xff, 0x87, 0x27, 0x41, - 0xca, 0x41, 0xb4, 0x66, 0xa3, 0x8e, 0xba, 0x1e, 0xf3, 0x0e, 0xa2, 0x15, 0xd4, 0x81, 0x9f, 0x83, - 0x6c, 0xc7, 0x27, 0x1d, 0x42, 0xb1, 0x3f, 0xb8, 0x62, 0xfc, 0x7a, 0x2c, 0x96, 0xb7, 0xff, 0x7e, - 0x5e, 0x30, 0x9d, 0x16, 0x6b, 0x76, 0xeb, 0xa6, 0x4d, 0x5c, 0x4b, 0xf5, 0x06, 0xf9, 0x39, 0x4f, - 0x1b, 0xbb, 0x16, 0xdb, 0xeb, 0x60, 0x6a, 0x56, 0x86, 0x77, 0xbb, 0x7a, 0x34, 0xf0, 0x15, 0xdc, - 0xcb, 0x15, 0x90, 0xb6, 0x9b, 0xa8, 0xe5, 0xd5, 0x5a, 0x8d, 0x5c, 0x72, 0x5d, 0x2b, 0x25, 0xaa, - 0x29, 0x31, 0xbe, 0xde, 0x30, 0x8a, 0xe0, 0xd8, 0x15, 0xca, 0x5a, 0x2e, 0x62, 0xf8, 0x1a, 0x1a, - 0x06, 0x22, 0x0b, 0x12, 0x0e, 0x92, 0xe4, 0x93, 0x55, 0xfe, 0x6b, 0x3c, 0x4a, 0x06, 0x39, 0xf5, - 0x91, 0x8d, 0x77, 0xfa, 0xc1, 0x39, 0xb7, 0x40, 0xc2, 0xa5, 0x8e, 0x8a, 0x57, 0x61, 0x3c, 0x5e, - 0xb7, 0xa8, 0x73, 0x85, 0xcf, 0xe1, 0xae, 0xbb, 0xd3, 0xaf, 0x72, 0x5b, 0x78, 0x09, 0x2c, 0x32, - 0xee, 0xa4, 0x66, 0x13, 0xef, 0x4e, 0xcb, 0x11, 0x27, 0xcd, 0x6c, 0xaf, 0x8d, 0xef, 0x15, 0x50, - 0x15, 0x61, 0x54, 0xcd, 0xb0, 0xe1, 0x00, 0x56, 0xc0, 0x62, 0xc7, 0xc7, 0x0d, 0x6c, 0x63, 0x4a, - 0x89, 0x4f, 0x73, 0x49, 0x51, 0x50, 0x53, 0xd1, 0x23, 0x9b, 0xf8, 0x2b, 0x59, 0x6f, 0x13, 0x7b, - 0x37, 0x78, 0x8f, 0xe6, 0x44, 0x64, 0x32, 0x62, 0x4e, 0xbe, 0x46, 0x70, 0x0d, 0x00, 0x69, 0x22, - 0x2e, 0xcd, 0xbc, 0xb8, 0x34, 0x0b, 0x62, 0x46, 0xf4, 0x99, 0x4a, 0xb0, 0xcc, 0x5b, 0x61, 0x2e, - 0x25, 0x8e, 0xa1, 0x9b, 0xb2, 0x4f, 0x9a, 0x41, 0x9f, 0x34, 0x77, 0x82, 0x3e, 0x59, 0x4e, 0xf3, - 0xa2, 0x79, 0xfc, 0x7b, 0x41, 0x53, 0x4e, 0xf8, 0xca, 0xc4, 0xdc, 0xa7, 0xff, 0x9b, 0xdc, 0x2f, - 0x44, 0x72, 0x0f, 0x0d, 0xb0, 0x24, 0xe9, 0xbb, 0xa8, 0x5f, 0xe3, 0xe9, 0x06, 0xa1, 0x08, 0xdc, - 0x42, 0xfd, 0x6b, 0x88, 0x7e, 0x98, 0x4c, 0xcf, 0x66, 0x13, 0xd5, 0x34, 0xeb, 0xd7, 0x5a, 0x5e, - 0x03, 0xf7, 0x8d, 0xb3, 0xea, 0x95, 0x1b, 0x54, 0xc1, 0xf0, 0x09, 0x6a, 0x20, 0x86, 0x82, 0x72, - 0xe7, 0xff, 0xc6, 0x8f, 0x09, 0x70, 0x62, 0x68, 0x5c, 0xe6, 0x5e, 0x43, 0x55, 0xc3, 0xfa, 0xc1, - 0x43, 0x30, 0xbd, 0x6a, 0x58, 0x9f, 0xbe, 0x82, 0xaa, 0xf9, 0x3f, 0xe1, 0xd3, 0x13, 0x6e, 0x9c, - 0x07, 0x27, 0xc7, 0x72, 0x76, 0x40, 0x8e, 0x8f, 0x0f, 0xfa, 0x35, 0xc5, 0x57, 0x71, 0xd0, 0x17, - 0x8c, 0x9b, 0x83, 0x5e, 0xac, 0xa6, 0x95, 0x8b, 0xb7, 0x41, 0x9a, 0x3f, 0xde, 0xb5, 0x3b, 0x58, - 0xf5, 0xc3, 0xf2, 0xca, 0x6f, 0xcf, 0x0b, 0xc7, 0xe5, 0x09, 0x69, 0x63, 0xd7, 0x6c, 0x11, 0xcb, - 0x45, 0xac, 0x69, 0x5e, 0xf7, 0x18, 0xef, 0xd3, 0x62, 0xf7, 0xf6, 0xcf, 0x8b, 0x60, 0x4e, 0xb8, - 0x83, 0x5f, 0x68, 0x20, 0xa5, 0xe4, 0x09, 0xdc, 0x18, 0x4f, 0xfd, 0x04, 0xfd, 0xa9, 0x6f, 0x4e, - 0x33, 0x93, 0xd4, 0x8c, 0xe2, 0xc3, 0x5f, 0xfe, 0xfc, 0x6e, 0xf6, 0x34, 0x2c, 0x70, 0xb5, 0x4c, - 0x68, 0xa0, 0x99, 0x95, 0x3c, 0xb1, 0xee, 0xab, 0x54, 0x3d, 0x80, 0xdf, 0x6b, 0x60, 0x29, 0xa2, - 0x00, 0xe1, 0x9b, 0x31, 0x10, 0x93, 0x94, 0xa6, 0x7e, 0xee, 0x70, 0xc6, 0x8a, 0x95, 0x29, 0x58, - 0x95, 0xe0, 0x66, 0x94, 0x55, 0x20, 0x34, 0xc7, 0xc8, 0xfd, 0xa0, 0x81, 0xec, 0xa8, 0x90, 0x83, - 0x66, 0x0c, 0x64, 0x8c, 0x7e, 0xd4, 0xad, 0x43, 0xdb, 0x2b, 0x96, 0x17, 0x05, 0xcb, 0x0b, 0xd0, - 0x8c, 0xb2, 0xec, 0x05, 0xf6, 0x43, 0xa2, 0x61, 0x5d, 0xfa, 0x00, 0x3e, 0xd4, 0x40, 0x4a, 0xc9, - 0xb5, 0xd8, 0x74, 0x46, 0x95, 0x60, 0x6c, 0x3a, 0x47, 0x54, 0x9f, 0x51, 0x12, 0x94, 0x0c, 0xb8, - 0x1e, 0xa5, 0xa4, 0xa4, 0x1f, 0x0d, 0x85, 0xec, 0x2b, 0x0d, 0xa4, 0x94, 0x68, 0x8b, 0x25, 0x11, - 0x55, 0x88, 0xb1, 0x24, 0x46, 0xb4, 0x9f, 0x71, 0x5e, 0x90, 0x28, 0xc2, 0x8d, 0x28, 0x09, 0x2a, - 0xcd, 0x86, 0x1c, 0xac, 0xfb, 0xbb, 0x78, 0xef, 0x01, 0xec, 0x81, 0x24, 0xd7, 0x75, 0xd0, 0x88, - 0x2d, 0x91, 0x81, 0x58, 0xd4, 0x5f, 0x3f, 0xd0, 0x46, 0xe1, 0x6f, 0x08, 0xfc, 0x02, 0x5c, 0x1b, - 0xad, 0x9e, 0x46, 0x24, 0x02, 0x14, 0xcc, 0x4b, 0x59, 0x03, 0xdf, 0x88, 0xf1, 0x1a, 0x51, 0x4f, - 0xfa, 0xc6, 0x14, 0x2b, 0x85, 0xbe, 0x2a, 0xd0, 0x4f, 0xc0, 0xe5, 0x28, 0xba, 0xd4, 0x4c, 0x90, - 0x81, 0x94, 0x92, 0x4c, 0x70, 0x7d, 0xdc, 0x5f, 0x54, 0x4d, 0xe9, 0xc5, 0x69, 0x2d, 0x22, 0xc0, - 0xcc, 0x0b, 0xcc, 0x1c, 0x3c, 0x11, 0xc5, 0xc4, 0xac, 0x59, 0xb3, 0x39, 0xd4, 0x3d, 0x90, 0x09, - 0xe9, 0x9d, 0x43, 0x20, 0x4f, 0x38, 0xeb, 0x04, 0xc1, 0x64, 0x18, 0x02, 0x77, 0x15, 0xea, 0x23, - 0xb8, 0xca, 0x94, 0xbf, 0xb6, 0xb0, 0x0f, 0x52, 0xaa, 0x6d, 0xc6, 0xd6, 0x59, 0x54, 0x5c, 0xc5, - 0xd6, 0xd9, 0x48, 0xf7, 0x8d, 0x3b, 0xb5, 0xec, 0x97, 0xac, 0x0f, 0x1f, 0x69, 0x00, 0x0c, 0x1f, - 0x74, 0x58, 0x3a, 0xc8, 0x6d, 0xb8, 0x4f, 0xeb, 0x67, 0x0e, 0x61, 0xa9, 0x38, 0x9c, 0x16, 0x1c, - 0x4e, 0xc1, 0x95, 0x49, 0x1c, 0x44, 0x87, 0xe1, 0x01, 0x50, 0x0d, 0xe1, 0x80, 0xdb, 0x1e, 0xee, - 0x23, 0x07, 0xdc, 0xf6, 0x48, 0x5f, 0x89, 0x0b, 0x40, 0xd0, 0x6b, 0xca, 0x97, 0x9e, 0xbe, 0xc8, - 0x6b, 0xcf, 0x5e, 0xe4, 0xb5, 0x3f, 0x5e, 0xe4, 0xb5, 0xc7, 0xfb, 0xf9, 0x99, 0x67, 0xfb, 0xf9, - 0x99, 0x5f, 0xf7, 0xf3, 0x33, 0x9f, 0x6d, 0x86, 0xfa, 0xed, 0x60, 0x2f, 0xa1, 0x56, 0x6f, 0xeb, - 0x1d, 0xab, 0x2f, 0xfc, 0x88, 0x9e, 0x5b, 0x9f, 0x17, 0xed, 0xfd, 0xad, 0x7f, 0x02, 0x00, 0x00, - 0xff, 0xff, 0x25, 0x45, 0x27, 0x6d, 0xce, 0x11, 0x00, 0x00, + // 1467 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x56, 0xcf, 0x6f, 0x13, 0xc7, + 0x17, 0xcf, 0xc6, 0x4e, 0xec, 0x8c, 0x13, 0xf0, 0x77, 0x08, 0xe0, 0x2c, 0x89, 0x1d, 0xf6, 0xdb, + 0xc4, 0x86, 0xc2, 0x2e, 0x49, 0xab, 0x48, 0xed, 0xa5, 0x60, 0x0b, 0x28, 0x05, 0x2a, 0xea, 0x46, + 0x3d, 0x54, 0xaa, 0xac, 0xf1, 0x7a, 0x58, 0x5b, 0xf1, 0xee, 0x98, 0x9d, 0xb1, 0xe5, 0x80, 0x38, + 0x14, 0xa1, 0xfe, 0x50, 0x2f, 0x48, 0xbd, 0xf5, 0xc4, 0xbd, 0xb7, 0x5e, 0x7a, 0xec, 0x95, 0x23, + 0x52, 0x2f, 0x55, 0x0f, 0xb4, 0x22, 0x3d, 0xf4, 0x6f, 0xe8, 0xa9, 0x9a, 0x1f, 0x6b, 0xef, 0xda, + 0xde, 0x38, 0x54, 0xf4, 0xd6, 0xd3, 0xee, 0xcc, 0xbc, 0x79, 0x9f, 0xcf, 0xbc, 0xf7, 0x66, 0xde, + 0x07, 0xac, 0x62, 0xd6, 0xc4, 0xbe, 0xdb, 0xf2, 0x98, 0x85, 0x7b, 0xae, 0xd5, 0xdb, 0xb2, 0xee, + 0x75, 0xb1, 0xbf, 0x6f, 0x76, 0x7c, 0xc2, 0x08, 0xcc, 0x0e, 0x56, 0x4d, 0xdc, 0x73, 0xcd, 0xde, + 0x96, 0x7e, 0xde, 0x26, 0xd4, 0x25, 0xd4, 0xaa, 0x23, 0x8a, 0xa5, 0xa9, 0xd5, 0xdb, 0xaa, 0x63, + 0x86, 0xb6, 0xac, 0x0e, 0x72, 0x5a, 0x1e, 0x62, 0x2d, 0xe2, 0xc9, 0xdd, 0xba, 0x3e, 0xe6, 0x9b, + 0x3b, 0x91, 0x6b, 0x2b, 0x63, 0x6b, 0xac, 0xaf, 0x96, 0x96, 0x1d, 0xe2, 0x10, 0xf1, 0x6b, 0xf1, + 0x3f, 0x35, 0xbb, 0xea, 0x10, 0xe2, 0xb4, 0xb1, 0x85, 0x3a, 0x2d, 0x0b, 0x79, 0x1e, 0x61, 0x02, + 0x89, 0xaa, 0xd5, 0x82, 0x5a, 0x15, 0xa3, 0x7a, 0xf7, 0xae, 0xc5, 0x5a, 0x2e, 0xa6, 0x0c, 0xb9, + 0x1d, 0x69, 0x60, 0xbc, 0x03, 0x4e, 0x7c, 0xc4, 0xd9, 0x5e, 0xb1, 0x6d, 0xd2, 0xf5, 0x58, 0x15, + 0xdf, 0xeb, 0x62, 0xca, 0x60, 0x0e, 0xa4, 0x50, 0xa3, 0xe1, 0x63, 0x4a, 0x73, 0xda, 0xba, 0x56, + 0x5a, 0xa8, 0x06, 0xc3, 0x77, 0xd3, 0x5f, 0x3d, 0x2d, 0xcc, 0xfc, 0xf9, 0xb4, 0x30, 0x63, 0xd8, + 0x60, 0x39, 0xba, 0x95, 0x76, 0x88, 0x47, 0x31, 0xdf, 0x5b, 0x47, 0x6d, 0xe4, 0xd9, 0x38, 0xd8, + 0xab, 0x86, 0xf0, 0x0c, 0x58, 0xb0, 0x49, 0x03, 0xd7, 0x9a, 0x88, 0x36, 0x73, 0xb3, 0x62, 0x2d, + 0xcd, 0x27, 0xde, 0x47, 0xb4, 0x09, 0x97, 0xc1, 0x9c, 0x47, 0xf8, 0xa6, 0xc4, 0xba, 0x56, 0x4a, + 0x56, 0xe5, 0xc0, 0x78, 0x0f, 0xac, 0x08, 0x90, 0x8a, 0x08, 0xef, 0x3f, 0x60, 0xf9, 0x85, 0x06, + 0xf4, 0x49, 0x1e, 0x14, 0xd9, 0x0d, 0x70, 0x4c, 0x66, 0xae, 0x16, 0xf5, 0xb4, 0x24, 0x67, 0xaf, + 0xc8, 0x49, 0xa8, 0x83, 0x34, 0xe5, 0xa0, 0x9c, 0xdf, 0xac, 0xe0, 0x37, 0x18, 0x73, 0x17, 0x48, + 0x7a, 0xad, 0x79, 0x5d, 0xb7, 0x8e, 0x7d, 0x75, 0x82, 0x25, 0x35, 0xfb, 0xa1, 0x98, 0x34, 0x6e, + 0x82, 0x55, 0xc1, 0xe3, 0x13, 0xd4, 0x6e, 0x35, 0x10, 0x23, 0xfe, 0xc8, 0x61, 0xce, 0x82, 0x45, + 0x9b, 0x78, 0xa3, 0x3c, 0x32, 0x7c, 0xee, 0xca, 0xd8, 0xa9, 0xbe, 0xd1, 0xc0, 0x5a, 0x8c, 0x37, + 0x75, 0xb0, 0x22, 0x38, 0x1e, 0xb0, 0x8a, 0x7a, 0x0c, 0xc8, 0xbe, 0xc6, 0xa3, 0x05, 0x45, 0x54, + 0x96, 0x79, 0x7e, 0x95, 0xf4, 0x5c, 0x52, 0x45, 0x34, 0xd8, 0x3a, 0xad, 0x88, 0x8c, 0x9b, 0x0a, + 0xec, 0x63, 0x46, 0x7c, 0xe4, 0x4c, 0x07, 0x83, 0x59, 0x90, 0xd8, 0xc3, 0xfb, 0xaa, 0xde, 0xf8, + 0x6f, 0x08, 0xfe, 0x82, 0x82, 0x1f, 0x38, 0x53, 0xf0, 0xcb, 0x60, 0xae, 0x87, 0xda, 0xdd, 0x00, + 0x5c, 0x0e, 0x8c, 0x1d, 0x90, 0x55, 0xa5, 0xd4, 0x78, 0xa5, 0x43, 0x16, 0xc1, 0xff, 0x42, 0xfb, + 0x14, 0x04, 0x04, 0x49, 0x5e, 0xfb, 0x62, 0xd7, 0x62, 0x55, 0xfc, 0x1b, 0xf7, 0x01, 0x14, 0x86, + 0xbb, 0xfd, 0x5b, 0xc4, 0xa1, 0x01, 0x04, 0x04, 0x49, 0x71, 0x63, 0xa4, 0x7f, 0xf1, 0x0f, 0xaf, + 0x01, 0x30, 0x7c, 0x57, 0xc4, 0xd9, 0x32, 0xdb, 0x9b, 0xa6, 0x2c, 0x5a, 0x93, 0x3f, 0x42, 0xa6, + 0x7c, 0xaf, 0xd4, 0x23, 0x64, 0xde, 0x19, 0x86, 0xaa, 0x1a, 0xda, 0x19, 0x22, 0xf9, 0xb5, 0xa6, + 0x02, 0x1b, 0x80, 0x2b, 0x9e, 0xe7, 0x40, 0xb2, 0x4d, 0x1c, 0x7e, 0xba, 0x44, 0x29, 0xb3, 0x7d, + 0xd2, 0x1c, 0x7d, 0xfa, 0xcc, 0x5b, 0xc4, 0xa9, 0x0a, 0x13, 0x78, 0x7d, 0x02, 0xa9, 0xe2, 0x54, + 0x52, 0x12, 0x27, 0xcc, 0xca, 0x58, 0x56, 0x71, 0xb8, 0x83, 0x7c, 0xe4, 0x06, 0x71, 0x30, 0x6e, + 0x2b, 0x82, 0xc1, 0xac, 0x22, 0xb8, 0x03, 0xe6, 0x3b, 0x62, 0x46, 0x04, 0x28, 0xb3, 0x9d, 0x1b, + 0xa7, 0x28, 0x77, 0x94, 0x93, 0xcf, 0x5e, 0x14, 0x66, 0xaa, 0xca, 0xda, 0xf8, 0x51, 0x03, 0xc7, + 0xae, 0xb2, 0x66, 0x05, 0xb5, 0xdb, 0xa1, 0x48, 0x23, 0xdf, 0xa1, 0x41, 0x4e, 0xf8, 0x3f, 0x3c, + 0x0d, 0x52, 0x0e, 0xa2, 0x35, 0x1b, 0x75, 0xd4, 0xf5, 0x98, 0x77, 0x10, 0xad, 0xa0, 0x0e, 0xfc, + 0x0c, 0x64, 0x3b, 0x3e, 0xe9, 0x10, 0x8a, 0xfd, 0xc1, 0x15, 0xe3, 0xd7, 0x63, 0xb1, 0xbc, 0xfd, + 0xd7, 0x8b, 0x82, 0xe9, 0xb4, 0x58, 0xb3, 0x5b, 0x37, 0x6d, 0xe2, 0x5a, 0xaa, 0x37, 0xc8, 0xcf, + 0x45, 0xda, 0xd8, 0xb3, 0xd8, 0x7e, 0x07, 0x53, 0xb3, 0x32, 0xbc, 0xdb, 0xd5, 0xe3, 0x81, 0xaf, + 0xe0, 0x5e, 0xae, 0x80, 0xb4, 0xdd, 0x44, 0x2d, 0xaf, 0xd6, 0x6a, 0xe4, 0x92, 0xeb, 0x5a, 0x29, + 0x51, 0x4d, 0x89, 0xf1, 0x8d, 0x86, 0x51, 0x04, 0x27, 0xae, 0x52, 0xd6, 0x72, 0x11, 0xc3, 0xd7, + 0xd1, 0x30, 0x10, 0x59, 0x90, 0x70, 0x90, 0x24, 0x9f, 0xac, 0xf2, 0x5f, 0xe3, 0x71, 0x32, 0xc8, + 0xa9, 0x8f, 0x6c, 0xbc, 0xdb, 0x0f, 0xce, 0xb9, 0x05, 0x12, 0x2e, 0x75, 0x54, 0xbc, 0x0a, 0xe3, + 0xf1, 0xba, 0x4d, 0x9d, 0xab, 0x7c, 0x0e, 0x77, 0xdd, 0xdd, 0x7e, 0x95, 0xdb, 0xc2, 0xcb, 0x60, + 0x91, 0x71, 0x27, 0x35, 0x9b, 0x78, 0x77, 0x5b, 0x8e, 0x38, 0x69, 0x66, 0x7b, 0x6d, 0x7c, 0xaf, + 0x80, 0xaa, 0x08, 0xa3, 0x6a, 0x86, 0x0d, 0x07, 0xb0, 0x02, 0x16, 0x3b, 0x3e, 0x6e, 0x60, 0x1b, + 0x53, 0x4a, 0x7c, 0x9a, 0x4b, 0x8a, 0x82, 0x9a, 0x8a, 0x1e, 0xd9, 0xc4, 0x5f, 0xc9, 0x7a, 0x9b, + 0xd8, 0x7b, 0xc1, 0x7b, 0x34, 0x27, 0x22, 0x93, 0x11, 0x73, 0xf2, 0x35, 0x82, 0x6b, 0x00, 0x48, + 0x13, 0x71, 0x69, 0xe6, 0xc5, 0xa5, 0x59, 0x10, 0x33, 0xa2, 0xcf, 0x54, 0x82, 0x65, 0xde, 0x0a, + 0x73, 0x29, 0x71, 0x0c, 0xdd, 0x94, 0x7d, 0xd2, 0x0c, 0xfa, 0xa4, 0xb9, 0x1b, 0xf4, 0xc9, 0x72, + 0x9a, 0x17, 0xcd, 0x93, 0xdf, 0x0a, 0x9a, 0x72, 0xc2, 0x57, 0x26, 0xe6, 0x3e, 0xfd, 0xef, 0xe4, + 0x7e, 0x21, 0x92, 0x7b, 0x68, 0x80, 0x25, 0x49, 0xdf, 0x45, 0xfd, 0x1a, 0x4f, 0x37, 0x08, 0x45, + 0xe0, 0x36, 0xea, 0x5f, 0x47, 0xf4, 0x83, 0x64, 0x7a, 0x36, 0x9b, 0xa8, 0xa6, 0x59, 0xbf, 0xd6, + 0xf2, 0x1a, 0xb8, 0x6f, 0x9c, 0x57, 0xaf, 0xdc, 0xa0, 0x0a, 0x86, 0x4f, 0x50, 0x03, 0x31, 0x14, + 0x94, 0x3b, 0xff, 0x37, 0x7e, 0x48, 0x80, 0x53, 0x43, 0xe3, 0x32, 0xf7, 0x1a, 0xaa, 0x1a, 0xd6, + 0x0f, 0x1e, 0x82, 0xe9, 0x55, 0xc3, 0xfa, 0xf4, 0x35, 0x54, 0xcd, 0x7f, 0x09, 0x9f, 0x9e, 0x70, + 0xe3, 0x22, 0x38, 0x3d, 0x96, 0xb3, 0x43, 0x72, 0x7c, 0x72, 0xd0, 0xaf, 0x29, 0xbe, 0x86, 0x83, + 0xbe, 0x60, 0xdc, 0x1a, 0xf4, 0x62, 0x35, 0xad, 0x5c, 0xbc, 0x0d, 0xd2, 0xfc, 0xf1, 0xae, 0xdd, + 0xc5, 0xaa, 0x1f, 0x96, 0x57, 0x7e, 0x7d, 0x51, 0x38, 0x29, 0x4f, 0x48, 0x1b, 0x7b, 0x66, 0x8b, + 0x58, 0x2e, 0x62, 0x4d, 0xf3, 0x86, 0xc7, 0x78, 0x9f, 0x16, 0xbb, 0xb7, 0x7f, 0x5a, 0x04, 0x73, + 0xc2, 0x1d, 0xfc, 0x5c, 0x03, 0x29, 0x25, 0x4f, 0xe0, 0xc6, 0x78, 0xea, 0x27, 0xe8, 0x4f, 0x7d, + 0x73, 0x9a, 0x99, 0xa4, 0x66, 0x14, 0x1f, 0xfd, 0xfc, 0xc7, 0xb7, 0xb3, 0x67, 0x61, 0x81, 0xab, + 0x65, 0x42, 0x03, 0xcd, 0xac, 0xe4, 0x89, 0xf5, 0x40, 0xa5, 0xea, 0x21, 0xfc, 0x4e, 0x03, 0x4b, + 0x11, 0x05, 0x08, 0xdf, 0x8c, 0x81, 0x98, 0xa4, 0x34, 0xf5, 0x0b, 0x47, 0x33, 0x56, 0xac, 0x4c, + 0xc1, 0xaa, 0x04, 0x37, 0xa3, 0xac, 0x02, 0xa1, 0x39, 0x46, 0xee, 0x7b, 0x0d, 0x64, 0x47, 0x85, + 0x1c, 0x34, 0x63, 0x20, 0x63, 0xf4, 0xa3, 0x6e, 0x1d, 0xd9, 0x5e, 0xb1, 0xdc, 0x11, 0x2c, 0x2f, + 0x41, 0x33, 0xca, 0xb2, 0x17, 0xd8, 0x0f, 0x89, 0x86, 0x75, 0xe9, 0x43, 0xf8, 0x48, 0x03, 0x29, + 0x25, 0xd7, 0x62, 0xd3, 0x19, 0x55, 0x82, 0xb1, 0xe9, 0x1c, 0x51, 0x7d, 0x46, 0x49, 0x50, 0x32, + 0xe0, 0x7a, 0x94, 0x92, 0x92, 0x7e, 0x34, 0x14, 0xb2, 0x2f, 0x35, 0x90, 0x52, 0xa2, 0x2d, 0x96, + 0x44, 0x54, 0x21, 0xc6, 0x92, 0x18, 0xd1, 0x7e, 0xc6, 0x45, 0x41, 0xa2, 0x08, 0x37, 0xa2, 0x24, + 0xa8, 0x34, 0x1b, 0x72, 0xb0, 0x1e, 0xec, 0xe1, 0xfd, 0x87, 0xb0, 0x07, 0x92, 0x5c, 0xd7, 0x41, + 0x23, 0xb6, 0x44, 0x06, 0x62, 0x51, 0xff, 0xff, 0xa1, 0x36, 0x0a, 0x7f, 0x43, 0xe0, 0x17, 0xe0, + 0xda, 0x68, 0xf5, 0x34, 0x22, 0x11, 0xa0, 0x60, 0x5e, 0xca, 0x1a, 0xf8, 0x46, 0x8c, 0xd7, 0x88, + 0x7a, 0xd2, 0x37, 0xa6, 0x58, 0x29, 0xf4, 0x55, 0x81, 0x7e, 0x0a, 0x2e, 0x47, 0xd1, 0xa5, 0x66, + 0x82, 0x0c, 0xa4, 0x94, 0x64, 0x82, 0xeb, 0xe3, 0xfe, 0xa2, 0x6a, 0x4a, 0x2f, 0x4e, 0x6b, 0x11, + 0x01, 0x66, 0x5e, 0x60, 0xe6, 0xe0, 0xa9, 0x28, 0x26, 0x66, 0xcd, 0x9a, 0xcd, 0xa1, 0xee, 0x83, + 0x4c, 0x48, 0xef, 0x1c, 0x01, 0x79, 0xc2, 0x59, 0x27, 0x08, 0x26, 0xc3, 0x10, 0xb8, 0xab, 0x50, + 0x1f, 0xc1, 0x55, 0xa6, 0xfc, 0xb5, 0x85, 0x7d, 0x90, 0x52, 0x6d, 0x33, 0xb6, 0xce, 0xa2, 0xe2, + 0x2a, 0xb6, 0xce, 0x46, 0xba, 0x6f, 0xdc, 0xa9, 0x65, 0xbf, 0x64, 0x7d, 0xf8, 0x58, 0x03, 0x60, + 0xf8, 0xa0, 0xc3, 0xd2, 0x61, 0x6e, 0xc3, 0x7d, 0x5a, 0x3f, 0x77, 0x04, 0x4b, 0xc5, 0xe1, 0xac, + 0xe0, 0x70, 0x06, 0xae, 0x4c, 0xe2, 0x20, 0x3a, 0x0c, 0x0f, 0x80, 0x6a, 0x08, 0x87, 0xdc, 0xf6, + 0x70, 0x1f, 0x39, 0xe4, 0xb6, 0x47, 0xfa, 0x4a, 0x5c, 0x00, 0x82, 0x5e, 0x53, 0xbe, 0xfc, 0xec, + 0x65, 0x5e, 0x7b, 0xfe, 0x32, 0xaf, 0xfd, 0xfe, 0x32, 0xaf, 0x3d, 0x39, 0xc8, 0xcf, 0x3c, 0x3f, + 0xc8, 0xcf, 0xfc, 0x72, 0x90, 0x9f, 0xf9, 0x74, 0x33, 0xd4, 0x6f, 0x07, 0x7b, 0x09, 0xb5, 0x7a, + 0x5b, 0x3b, 0x56, 0x5f, 0xf8, 0x11, 0x3d, 0xb7, 0x3e, 0x2f, 0xda, 0xfb, 0x5b, 0x7f, 0x07, 0x00, + 0x00, 0xff, 0xff, 0xc6, 0xc7, 0x39, 0x16, 0xce, 0x11, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/evm/types/tx.pb.go b/x/evm/types/tx.pb.go index 49016b2356..691790f6cf 100644 --- a/x/evm/types/tx.pb.go +++ b/x/evm/types/tx.pb.go @@ -456,65 +456,65 @@ func init() { proto.RegisterFile("ethermint/evm/v1/tx.proto", fileDescriptor_f75 var fileDescriptor_f75ac0a12d075f21 = []byte{ // 963 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x55, 0xcf, 0x6f, 0xe3, 0x44, - 0x14, 0x8e, 0x13, 0xe7, 0xd7, 0x24, 0x2c, 0x2b, 0xab, 0xd5, 0x3a, 0x01, 0xe2, 0x6c, 0x90, 0x20, - 0x8b, 0x54, 0x5b, 0x2d, 0x62, 0xa5, 0xed, 0x89, 0x66, 0xdb, 0x45, 0x8b, 0x5a, 0xb1, 0x32, 0xd9, - 0x0b, 0x20, 0x45, 0x53, 0x7b, 0x3a, 0x19, 0x11, 0x7b, 0x2c, 0xcf, 0xc4, 0x4a, 0x38, 0xee, 0x89, - 0x1b, 0x20, 0xfe, 0x01, 0x0e, 0x9c, 0x38, 0x71, 0xd8, 0x33, 0xe7, 0x15, 0xa7, 0x15, 0x5c, 0x10, - 0x07, 0x83, 0x52, 0x24, 0xa4, 0x1e, 0x39, 0x73, 0x40, 0x33, 0xe3, 0x34, 0xcd, 0x86, 0xb4, 0xb0, - 0x12, 0xdc, 0xe6, 0xf9, 0x7d, 0xef, 0xc7, 0x7c, 0xdf, 0xf8, 0x3d, 0xd0, 0x40, 0x7c, 0x88, 0xe2, - 0x80, 0x84, 0xdc, 0x41, 0x49, 0xe0, 0x24, 0xdb, 0x0e, 0x9f, 0xd8, 0x51, 0x4c, 0x39, 0x35, 0xae, - 0x9f, 0xbb, 0x6c, 0x94, 0x04, 0x76, 0xb2, 0xdd, 0xbc, 0xe1, 0x51, 0x16, 0x50, 0xe6, 0x04, 0x0c, - 0x0b, 0x64, 0xc0, 0xb0, 0x82, 0x36, 0x1b, 0xca, 0x31, 0x90, 0x96, 0xa3, 0x8c, 0xcc, 0xd5, 0x5c, - 0x29, 0x20, 0x92, 0x29, 0xdf, 0x06, 0xa6, 0x98, 0xaa, 0x18, 0x71, 0xca, 0xbe, 0xbe, 0x8c, 0x29, - 0xc5, 0x23, 0xe4, 0xc0, 0x88, 0x38, 0x30, 0x0c, 0x29, 0x87, 0x9c, 0xd0, 0x70, 0x9e, 0xaf, 0x91, - 0x79, 0xa5, 0x75, 0x3c, 0x3e, 0x71, 0x60, 0x38, 0x55, 0xae, 0xce, 0x67, 0x1a, 0x78, 0xe1, 0x88, - 0xe1, 0x03, 0x51, 0x10, 0x8d, 0x83, 0xfe, 0xc4, 0xe8, 0x02, 0xdd, 0x87, 0x1c, 0x9a, 0x5a, 0x5b, - 0xeb, 0xd6, 0x76, 0x36, 0x6c, 0x15, 0x6b, 0xcf, 0x63, 0xed, 0xbd, 0x70, 0xea, 0x4a, 0x84, 0xd1, - 0x00, 0x3a, 0x23, 0x9f, 0x20, 0x33, 0xdf, 0xd6, 0xba, 0x5a, 0xaf, 0x78, 0x96, 0x5a, 0xda, 0x96, - 0x2b, 0x3f, 0x19, 0x16, 0xd0, 0x87, 0x90, 0x0d, 0xcd, 0x42, 0x5b, 0xeb, 0x56, 0x7b, 0xb5, 0x3f, - 0x52, 0xab, 0x1c, 0x8f, 0xa2, 0xdd, 0xce, 0x56, 0xc7, 0x95, 0x0e, 0xc3, 0x00, 0xfa, 0x49, 0x4c, - 0x03, 0x53, 0x17, 0x00, 0x57, 0x9e, 0x77, 0xf5, 0x4f, 0xbf, 0xb2, 0x72, 0x9d, 0x2f, 0xf2, 0xa0, - 0x72, 0x88, 0x30, 0xf4, 0xa6, 0xfd, 0x89, 0xb1, 0x01, 0x8a, 0x21, 0x0d, 0x3d, 0x24, 0xbb, 0xd1, - 0x5d, 0x65, 0x18, 0xb7, 0x41, 0x15, 0x43, 0xc1, 0x1c, 0xf1, 0x54, 0xf5, 0x6a, 0xaf, 0xf1, 0x73, - 0x6a, 0x6d, 0x2a, 0x12, 0x99, 0xff, 0xb1, 0x4d, 0xa8, 0x13, 0x40, 0x3e, 0xb4, 0xef, 0x87, 0xdc, - 0xad, 0x60, 0xc8, 0x1e, 0x08, 0xa8, 0xd1, 0x02, 0x05, 0x0c, 0x99, 0x6c, 0x4a, 0xef, 0xd5, 0x67, - 0xa9, 0x55, 0x79, 0x07, 0xb2, 0x43, 0x12, 0x10, 0xee, 0x0a, 0x87, 0x71, 0x0d, 0xe4, 0x39, 0xcd, - 0x5a, 0xca, 0x73, 0x6a, 0xdc, 0x01, 0xc5, 0x04, 0x8e, 0xc6, 0xc8, 0x2c, 0xca, 0x1a, 0xaf, 0xae, - 0xad, 0x31, 0x4b, 0xad, 0xd2, 0x5e, 0x40, 0xc7, 0x21, 0x77, 0x55, 0x84, 0xb8, 0x9f, 0x64, 0xb1, - 0xd4, 0xd6, 0xba, 0xf5, 0x8c, 0xaf, 0x3a, 0xd0, 0x12, 0xb3, 0x2c, 0x3f, 0x68, 0x89, 0xb0, 0x62, - 0xb3, 0xa2, 0xac, 0x58, 0x58, 0xcc, 0xac, 0x2a, 0x8b, 0xed, 0x5e, 0x13, 0x4c, 0x7c, 0xff, 0x78, - 0xab, 0xd4, 0x9f, 0xec, 0x43, 0x0e, 0x3b, 0xdf, 0x15, 0x40, 0x7d, 0xcf, 0xf3, 0x10, 0x63, 0x87, - 0x84, 0xf1, 0xfe, 0xc4, 0x78, 0x17, 0x54, 0xbc, 0x21, 0x24, 0xe1, 0x80, 0xf8, 0x92, 0x9a, 0x6a, - 0xcf, 0xb9, 0xac, 0xb9, 0xf2, 0x5d, 0x01, 0xbe, 0xbf, 0x7f, 0x96, 0x5a, 0x65, 0x4f, 0x1d, 0xdd, - 0xec, 0xe0, 0x2f, 0x38, 0xce, 0xaf, 0xe5, 0xb8, 0xf0, 0xaf, 0x39, 0xd6, 0x2f, 0xe7, 0xb8, 0xb8, - 0xca, 0x71, 0xe9, 0xb9, 0x39, 0x2e, 0x5f, 0xe0, 0xf8, 0x43, 0x50, 0x81, 0x92, 0x28, 0xc4, 0xcc, - 0x4a, 0xbb, 0xd0, 0xad, 0xed, 0xbc, 0x62, 0x3f, 0xfb, 0x4f, 0xda, 0x8a, 0xca, 0xfe, 0x38, 0x1a, - 0xa1, 0x5e, 0xfb, 0x49, 0x6a, 0xe5, 0xce, 0x52, 0x0b, 0xc0, 0x73, 0x7e, 0xbf, 0xf9, 0xc5, 0x02, - 0x0b, 0xb6, 0xdd, 0xf3, 0x84, 0x4a, 0xc0, 0xea, 0x92, 0x80, 0x60, 0x49, 0xc0, 0xda, 0x3a, 0x01, - 0xff, 0x2c, 0x80, 0xfa, 0xfe, 0x34, 0x84, 0x01, 0xf1, 0xee, 0x21, 0xf4, 0xbf, 0x08, 0x78, 0x07, - 0xd4, 0x84, 0x80, 0x9c, 0x44, 0x03, 0x0f, 0x46, 0x57, 0x4b, 0x28, 0xe4, 0xee, 0x93, 0xe8, 0x2e, - 0x8c, 0xe6, 0xa1, 0x27, 0x08, 0xc9, 0x50, 0xfd, 0x9f, 0x84, 0xde, 0x43, 0x48, 0x84, 0x66, 0xf2, - 0x17, 0x2f, 0x97, 0xbf, 0xb4, 0x2a, 0x7f, 0xf9, 0xb9, 0xe5, 0xaf, 0xac, 0x91, 0xbf, 0xfa, 0x9f, - 0xc8, 0x0f, 0x96, 0xe4, 0xaf, 0x2d, 0xc9, 0x5f, 0x5f, 0x27, 0x7f, 0x07, 0x34, 0x0f, 0x26, 0x1c, - 0x85, 0x8c, 0xd0, 0xf0, 0xbd, 0x48, 0x8e, 0xe6, 0xc5, 0xc4, 0xcd, 0xe6, 0xde, 0xd7, 0x1a, 0xd8, - 0x5c, 0x9a, 0xc4, 0x2e, 0x62, 0x11, 0x0d, 0x99, 0xbc, 0xa8, 0x1c, 0xa6, 0x9a, 0x9a, 0x95, 0x72, - 0x7e, 0xde, 0x02, 0xfa, 0x88, 0x62, 0x66, 0xe6, 0xe5, 0x25, 0x37, 0x57, 0x2f, 0x79, 0x48, 0xb1, - 0x2b, 0x21, 0xc6, 0x75, 0x50, 0x88, 0x11, 0x97, 0x0f, 0xa0, 0xee, 0x8a, 0xa3, 0xd1, 0x00, 0x95, - 0x24, 0x18, 0xa0, 0x38, 0xa6, 0x71, 0x36, 0xed, 0xca, 0x49, 0x70, 0x20, 0x4c, 0xe1, 0x12, 0xd2, - 0x8f, 0x19, 0xf2, 0x95, 0x88, 0x6e, 0x19, 0x43, 0xf6, 0x90, 0x21, 0x7f, 0x3e, 0x9e, 0x35, 0xf0, - 0xe2, 0x11, 0xc3, 0x0f, 0x23, 0x1f, 0x72, 0xf4, 0x00, 0xc6, 0x30, 0x60, 0x62, 0x56, 0xc0, 0x31, - 0x1f, 0xd2, 0x98, 0xf0, 0x69, 0xf6, 0x9a, 0xcd, 0x1f, 0x1e, 0x6f, 0x6d, 0x64, 0x4b, 0x6d, 0xcf, - 0xf7, 0x63, 0xc4, 0xd8, 0xfb, 0x3c, 0x26, 0x21, 0x76, 0x17, 0x50, 0xe3, 0x36, 0x28, 0x45, 0x32, - 0x83, 0x7c, 0xb9, 0xb5, 0x1d, 0x73, 0xf5, 0x1a, 0xaa, 0x42, 0x4f, 0x17, 0x32, 0xb9, 0x19, 0x7a, - 0xf7, 0xda, 0xa3, 0xdf, 0xbf, 0x7d, 0x63, 0x91, 0xa7, 0xd3, 0x00, 0x37, 0x9e, 0x69, 0x69, 0xce, - 0xdd, 0x4e, 0xaa, 0x81, 0xc2, 0x11, 0xc3, 0xc6, 0x14, 0x80, 0x0b, 0x3b, 0xce, 0x5a, 0x2d, 0xb4, - 0x44, 0x7d, 0xf3, 0xf5, 0x2b, 0x00, 0xf3, 0xfc, 0x9d, 0x9b, 0x8f, 0x7e, 0xfc, 0xed, 0xcb, 0xfc, - 0x4b, 0x9d, 0x86, 0x58, 0xd1, 0x94, 0x9d, 0xef, 0xeb, 0x0c, 0x39, 0xe0, 0x13, 0xe3, 0x23, 0x50, - 0x5f, 0x62, 0xeb, 0xe6, 0xdf, 0xe6, 0xbe, 0x08, 0x69, 0xde, 0xba, 0x12, 0x32, 0x6f, 0xa0, 0xf7, - 0xf6, 0x93, 0x59, 0x4b, 0x7b, 0x3a, 0x6b, 0x69, 0xbf, 0xce, 0x5a, 0xda, 0xe7, 0xa7, 0xad, 0xdc, - 0xd3, 0xd3, 0x56, 0xee, 0xa7, 0xd3, 0x56, 0xee, 0x83, 0xd7, 0x30, 0xe1, 0xc3, 0xf1, 0xb1, 0xed, - 0xd1, 0x60, 0xd1, 0x1c, 0x65, 0x4e, 0xb2, 0xfd, 0x96, 0x33, 0x91, 0x8d, 0xf2, 0x69, 0x84, 0xd8, - 0x71, 0x49, 0xae, 0xf6, 0x37, 0xff, 0x0a, 0x00, 0x00, 0xff, 0xff, 0xbd, 0x12, 0x0c, 0xae, 0xd7, + 0x14, 0xae, 0x13, 0xe7, 0xd7, 0x24, 0x94, 0x95, 0xd5, 0x6a, 0x9d, 0x00, 0x71, 0x36, 0x48, 0x90, + 0x45, 0xaa, 0xad, 0x16, 0xa9, 0xd2, 0xf6, 0x44, 0xb3, 0xed, 0xa2, 0x45, 0xad, 0x58, 0x99, 0xec, + 0x05, 0x90, 0xa2, 0xa9, 0x3d, 0x9d, 0x8c, 0x88, 0x3d, 0x96, 0x67, 0x62, 0x25, 0x1c, 0xf7, 0xc4, + 0x0d, 0x10, 0xff, 0x00, 0x07, 0x4e, 0x9c, 0x38, 0xec, 0x99, 0xf3, 0x8a, 0xd3, 0x0a, 0x2e, 0x88, + 0x83, 0x41, 0x29, 0x12, 0x52, 0x8f, 0x9c, 0x39, 0xa0, 0x99, 0x71, 0x9a, 0x66, 0x43, 0x5a, 0x58, + 0x89, 0xbd, 0xcd, 0xf3, 0xfb, 0xde, 0x8f, 0xf9, 0xbe, 0xf1, 0x7b, 0xa0, 0x8e, 0xf8, 0x00, 0xc5, + 0x01, 0x09, 0xb9, 0x83, 0x92, 0xc0, 0x49, 0xb6, 0x1d, 0x3e, 0xb6, 0xa3, 0x98, 0x72, 0x6a, 0xdc, + 0xb8, 0x70, 0xd9, 0x28, 0x09, 0xec, 0x64, 0xbb, 0x71, 0xd3, 0xa3, 0x2c, 0xa0, 0xcc, 0x09, 0x18, + 0x16, 0xc8, 0x80, 0x61, 0x05, 0x6d, 0xd4, 0x95, 0xa3, 0x2f, 0x2d, 0x47, 0x19, 0x99, 0xab, 0xb1, + 0x54, 0x40, 0x24, 0x53, 0xbe, 0x0d, 0x4c, 0x31, 0x55, 0x31, 0xe2, 0x94, 0x7d, 0x7d, 0x15, 0x53, + 0x8a, 0x87, 0xc8, 0x81, 0x11, 0x71, 0x60, 0x18, 0x52, 0x0e, 0x39, 0xa1, 0xe1, 0x2c, 0x5f, 0x3d, + 0xf3, 0x4a, 0xeb, 0x64, 0x74, 0xea, 0xc0, 0x70, 0xa2, 0x5c, 0xed, 0xcf, 0x35, 0xf0, 0xd2, 0x31, + 0xc3, 0x87, 0xa2, 0x20, 0x1a, 0x05, 0xbd, 0xb1, 0xd1, 0x01, 0xba, 0x0f, 0x39, 0x34, 0xb5, 0x96, + 0xd6, 0xa9, 0xee, 0x6c, 0xd8, 0x2a, 0xd6, 0x9e, 0xc5, 0xda, 0xfb, 0xe1, 0xc4, 0x95, 0x08, 0xa3, + 0x0e, 0x74, 0x46, 0x3e, 0x45, 0x66, 0xae, 0xa5, 0x75, 0xb4, 0x6e, 0xe1, 0x3c, 0xb5, 0xb4, 0x2d, + 0x57, 0x7e, 0x32, 0x2c, 0xa0, 0x0f, 0x20, 0x1b, 0x98, 0xf9, 0x96, 0xd6, 0xa9, 0x74, 0xab, 0x7f, + 0xa6, 0x56, 0x29, 0x1e, 0x46, 0x7b, 0xed, 0xad, 0xb6, 0x2b, 0x1d, 0x86, 0x01, 0xf4, 0xd3, 0x98, + 0x06, 0xa6, 0x2e, 0x00, 0xae, 0x3c, 0xef, 0xe9, 0x9f, 0x7d, 0x6d, 0xad, 0xb5, 0xbf, 0xcc, 0x81, + 0xf2, 0x11, 0xc2, 0xd0, 0x9b, 0xf4, 0xc6, 0xc6, 0x06, 0x28, 0x84, 0x34, 0xf4, 0x90, 0xec, 0x46, + 0x77, 0x95, 0x61, 0xec, 0x82, 0x0a, 0x86, 0x82, 0x39, 0xe2, 0xa9, 0xea, 0x95, 0x6e, 0xfd, 0x97, + 0xd4, 0xda, 0x54, 0x24, 0x32, 0xff, 0x13, 0x9b, 0x50, 0x27, 0x80, 0x7c, 0x60, 0xdf, 0x0f, 0xb9, + 0x5b, 0xc6, 0x90, 0x3d, 0x10, 0x50, 0xa3, 0x09, 0xf2, 0x18, 0x32, 0xd9, 0x94, 0xde, 0xad, 0x4d, + 0x53, 0xab, 0xfc, 0x2e, 0x64, 0x47, 0x24, 0x20, 0xdc, 0x15, 0x0e, 0x63, 0x1d, 0xe4, 0x38, 0xcd, + 0x5a, 0xca, 0x71, 0x6a, 0xdc, 0x01, 0x85, 0x04, 0x0e, 0x47, 0xc8, 0x2c, 0xc8, 0x1a, 0xaf, 0xaf, + 0xac, 0x31, 0x4d, 0xad, 0xe2, 0x7e, 0x40, 0x47, 0x21, 0x77, 0x55, 0x84, 0xb8, 0x9f, 0x64, 0xb1, + 0xd8, 0xd2, 0x3a, 0xb5, 0x8c, 0xaf, 0x1a, 0xd0, 0x12, 0xb3, 0x24, 0x3f, 0x68, 0x89, 0xb0, 0x62, + 0xb3, 0xac, 0xac, 0x58, 0x58, 0xcc, 0xac, 0x28, 0x8b, 0xed, 0xad, 0x0b, 0x26, 0x7e, 0x78, 0xbc, + 0x55, 0xec, 0x8d, 0x0f, 0x20, 0x87, 0xed, 0xef, 0xf3, 0xa0, 0xb6, 0xef, 0x79, 0x88, 0xb1, 0x23, + 0xc2, 0x78, 0x6f, 0x6c, 0xbc, 0x07, 0xca, 0xde, 0x00, 0x92, 0xb0, 0x4f, 0x7c, 0x49, 0x4d, 0xa5, + 0xeb, 0x5c, 0xd5, 0x5c, 0xe9, 0xae, 0x00, 0xdf, 0x3f, 0x38, 0x4f, 0xad, 0x92, 0xa7, 0x8e, 0x6e, + 0x76, 0xf0, 0xe7, 0x1c, 0xe7, 0x56, 0x72, 0x9c, 0xff, 0xcf, 0x1c, 0xeb, 0x57, 0x73, 0x5c, 0x58, + 0xe6, 0xb8, 0xf8, 0xdc, 0x1c, 0x97, 0x2e, 0x71, 0xfc, 0x11, 0x28, 0x43, 0x49, 0x14, 0x62, 0x66, + 0xb9, 0x95, 0xef, 0x54, 0x77, 0x5e, 0xb3, 0x9f, 0xfd, 0x27, 0x6d, 0x45, 0x65, 0x6f, 0x14, 0x0d, + 0x51, 0xb7, 0xf5, 0x24, 0xb5, 0xd6, 0xce, 0x53, 0x0b, 0xc0, 0x0b, 0x7e, 0xbf, 0xfd, 0xd5, 0x02, + 0x73, 0xb6, 0xdd, 0x8b, 0x84, 0x4a, 0xc0, 0xca, 0x82, 0x80, 0x60, 0x41, 0xc0, 0xea, 0x2a, 0x01, + 0xff, 0xca, 0x83, 0xda, 0xc1, 0x24, 0x84, 0x01, 0xf1, 0xee, 0x21, 0xf4, 0x42, 0x04, 0xbc, 0x03, + 0xaa, 0x42, 0x40, 0x4e, 0xa2, 0xbe, 0x07, 0xa3, 0xeb, 0x25, 0x14, 0x72, 0xf7, 0x48, 0x74, 0x17, + 0x46, 0xb3, 0xd0, 0x53, 0x84, 0x64, 0xa8, 0xfe, 0x6f, 0x42, 0xef, 0x21, 0x24, 0x42, 0x33, 0xf9, + 0x0b, 0x57, 0xcb, 0x5f, 0x5c, 0x96, 0xbf, 0xf4, 0xdc, 0xf2, 0x97, 0x57, 0xc8, 0x5f, 0xf9, 0x5f, + 0xe4, 0x07, 0x0b, 0xf2, 0x57, 0x17, 0xe4, 0xaf, 0xad, 0x92, 0xbf, 0x0d, 0x1a, 0x87, 0x63, 0x8e, + 0x42, 0x46, 0x68, 0xf8, 0x7e, 0x24, 0x47, 0xf3, 0x7c, 0xe2, 0x66, 0x73, 0xef, 0x1b, 0x0d, 0x6c, + 0x2e, 0x4c, 0x62, 0x17, 0xb1, 0x88, 0x86, 0x4c, 0x5e, 0x54, 0x0e, 0x53, 0x4d, 0xcd, 0x4a, 0x39, + 0x3f, 0x6f, 0x03, 0x7d, 0x48, 0x31, 0x33, 0x73, 0xf2, 0x92, 0x9b, 0xcb, 0x97, 0x3c, 0xa2, 0xd8, + 0x95, 0x10, 0xe3, 0x06, 0xc8, 0xc7, 0x88, 0xcb, 0x07, 0x50, 0x73, 0xc5, 0xd1, 0xa8, 0x83, 0x72, + 0x12, 0xf4, 0x51, 0x1c, 0xd3, 0x38, 0x9b, 0x76, 0xa5, 0x24, 0x38, 0x14, 0xa6, 0x70, 0x09, 0xe9, + 0x47, 0x0c, 0xf9, 0x4a, 0x44, 0xb7, 0x84, 0x21, 0x7b, 0xc8, 0x90, 0x3f, 0x1b, 0xcf, 0x1a, 0x78, + 0xf9, 0x98, 0xe1, 0x87, 0x91, 0x0f, 0x39, 0x7a, 0x00, 0x63, 0x18, 0x30, 0x31, 0x2b, 0xe0, 0x88, + 0x0f, 0x68, 0x4c, 0xf8, 0x24, 0x7b, 0xcd, 0xe6, 0x8f, 0x8f, 0xb7, 0x36, 0xb2, 0xa5, 0xb6, 0xef, + 0xfb, 0x31, 0x62, 0xec, 0x03, 0x1e, 0x93, 0x10, 0xbb, 0x73, 0xa8, 0xb1, 0x0b, 0x8a, 0x91, 0xcc, + 0x20, 0x5f, 0x6e, 0x75, 0xc7, 0x5c, 0xbe, 0x86, 0xaa, 0xd0, 0xd5, 0x85, 0x4c, 0x6e, 0x86, 0xde, + 0x5b, 0x7f, 0xf4, 0xc7, 0x77, 0x6f, 0xcd, 0xf3, 0xb4, 0xeb, 0xe0, 0xe6, 0x33, 0x2d, 0xcd, 0xb8, + 0xdb, 0x49, 0x35, 0x90, 0x3f, 0x66, 0xd8, 0x98, 0x00, 0x70, 0x69, 0xc7, 0x59, 0xcb, 0x85, 0x16, + 0xa8, 0x6f, 0xbc, 0x79, 0x0d, 0x60, 0x96, 0xbf, 0x7d, 0xeb, 0xd1, 0x4f, 0xbf, 0x7f, 0x95, 0x7b, + 0xa5, 0x5d, 0x17, 0x2b, 0x9a, 0xb2, 0x8b, 0x7d, 0x9d, 0x21, 0xfb, 0x7c, 0x6c, 0x7c, 0x0c, 0x6a, + 0x0b, 0x6c, 0xdd, 0xfa, 0xc7, 0xdc, 0x97, 0x21, 0x8d, 0xdb, 0xd7, 0x42, 0x66, 0x0d, 0x74, 0xdf, + 0x79, 0x32, 0x6d, 0x6a, 0x4f, 0xa7, 0x4d, 0xed, 0xb7, 0x69, 0x53, 0xfb, 0xe2, 0xac, 0xb9, 0xf6, + 0xf4, 0xac, 0xb9, 0xf6, 0xf3, 0x59, 0x73, 0xed, 0xc3, 0x37, 0x30, 0xe1, 0x83, 0xd1, 0x89, 0xed, + 0xd1, 0x60, 0xde, 0x1c, 0x65, 0x4e, 0xb2, 0xbd, 0xeb, 0x8c, 0x65, 0xa3, 0x7c, 0x12, 0x21, 0x76, + 0x52, 0x94, 0xab, 0xfd, 0xed, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0x5e, 0x90, 0x12, 0xd5, 0xd7, 0x08, 0x00, 0x00, } diff --git a/x/feemarket/types/events.pb.go b/x/feemarket/types/events.pb.go index 9ec57eb183..a210af19c0 100644 --- a/x/feemarket/types/events.pb.go +++ b/x/feemarket/types/events.pb.go @@ -145,9 +145,9 @@ var fileDescriptor_c6edce8d670faff7 = []byte{ 0x34, 0xaf, 0x44, 0x82, 0x09, 0x22, 0x0e, 0xe1, 0x39, 0xb9, 0x9d, 0x78, 0x24, 0xc7, 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x13, 0x1e, 0xcb, 0x31, 0x5c, 0x78, 0x2c, 0xc7, 0x70, 0xe3, 0xb1, 0x1c, 0x43, 0x94, 0x4e, 0x7a, 0x66, 0x49, 0x46, 0x69, 0x92, 0x5e, 0x72, 0x7e, 0xae, - 0x7e, 0x6a, 0x59, 0x6e, 0x7e, 0x31, 0x94, 0x2c, 0x33, 0x34, 0xd5, 0xaf, 0x40, 0xf2, 0x57, 0x49, - 0x65, 0x41, 0x6a, 0x71, 0x12, 0x1b, 0xd8, 0x53, 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x36, - 0xbe, 0x12, 0x40, 0xfb, 0x00, 0x00, 0x00, + 0x7e, 0x6a, 0x59, 0x6e, 0x7e, 0x31, 0x94, 0x2c, 0x33, 0x34, 0xd3, 0xaf, 0x40, 0xf2, 0x57, 0x49, + 0x65, 0x41, 0x6a, 0x71, 0x12, 0x1b, 0xd8, 0x53, 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf5, + 0x93, 0x86, 0xf3, 0xfb, 0x00, 0x00, 0x00, } func (m *EventFeeMarket) Marshal() (dAtA []byte, err error) { diff --git a/x/feemarket/types/feemarket.pb.go b/x/feemarket/types/feemarket.pb.go index 1b4351d6c6..ca32b6b6da 100644 --- a/x/feemarket/types/feemarket.pb.go +++ b/x/feemarket/types/feemarket.pb.go @@ -118,7 +118,7 @@ var fileDescriptor_4feb8b20cf98e6e1 = []byte{ // 404 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0x41, 0x6b, 0xdb, 0x30, 0x14, 0xc7, 0xad, 0xa5, 0x4d, 0x5d, 0x75, 0x81, 0x20, 0xda, 0x61, 0x56, 0xe6, 0x9a, 0x15, 0x86, - 0x0f, 0xc3, 0x26, 0x94, 0xc1, 0x2e, 0xbb, 0x64, 0xa5, 0xdd, 0xc6, 0x06, 0x9d, 0x8f, 0xbb, 0x08, + 0x0f, 0xc3, 0x26, 0x14, 0xc6, 0x2e, 0xbb, 0x64, 0xa5, 0xdd, 0xc6, 0x06, 0x9d, 0x8f, 0xbb, 0x08, 0xd9, 0x7d, 0xb1, 0x45, 0x2c, 0xc9, 0x58, 0x8a, 0x59, 0xbe, 0xc5, 0xbe, 0xc9, 0xbe, 0x46, 0x8e, 0x39, 0x8e, 0x1d, 0xc2, 0x48, 0xbe, 0xc8, 0x88, 0x9d, 0xd8, 0x81, 0x5d, 0x76, 0x11, 0xd2, 0xfb, 0xff, 0x7f, 0x7f, 0xde, 0x43, 0x0f, 0xbf, 0x02, 0x93, 0x41, 0x29, 0xb8, 0x34, 0xe1, 0x04, 0x40, @@ -140,7 +140,7 @@ var fileDescriptor_4feb8b20cf98e6e1 = []byte{ 0xed, 0xbf, 0x8c, 0xef, 0x16, 0x6b, 0x17, 0x2d, 0xd7, 0x2e, 0xfa, 0xb3, 0x76, 0xd1, 0x8f, 0x8d, 0x6b, 0x2d, 0x37, 0xae, 0xf5, 0x6b, 0xe3, 0x5a, 0xdf, 0x5e, 0xa7, 0xdc, 0x64, 0xb3, 0x38, 0x48, 0x94, 0x08, 0xa1, 0x12, 0x4a, 0xef, 0xce, 0x6a, 0xf4, 0x26, 0xfc, 0x7e, 0xb0, 0x34, 0x66, 0x5e, - 0x80, 0x8e, 0xfb, 0xf5, 0x02, 0xdc, 0xfc, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x75, 0x9b, 0x83, 0x41, + 0x80, 0x8e, 0xfb, 0xf5, 0x02, 0xdc, 0xfc, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xb6, 0xb6, 0x17, 0xf2, 0x58, 0x02, 0x00, 0x00, } diff --git a/x/feemarket/types/genesis.pb.go b/x/feemarket/types/genesis.pb.go index ac79b4aa03..3fbee66987 100644 --- a/x/feemarket/types/genesis.pb.go +++ b/x/feemarket/types/genesis.pb.go @@ -102,9 +102,9 @@ var fileDescriptor_6241c21661288629 = []byte{ 0x29, 0xb1, 0x38, 0x35, 0x3e, 0x2d, 0x35, 0xd5, 0xc9, 0xed, 0xc4, 0x23, 0x39, 0xc6, 0x0b, 0x8f, 0xe4, 0x18, 0x1f, 0x3c, 0x92, 0x63, 0x9c, 0xf0, 0x58, 0x8e, 0xe1, 0xc2, 0x63, 0x39, 0x86, 0x1b, 0x8f, 0xe5, 0x18, 0xa2, 0x74, 0xd2, 0x33, 0x4b, 0x32, 0x4a, 0x93, 0xf4, 0x92, 0xf3, 0x73, 0xf5, - 0x53, 0xcb, 0x72, 0xf3, 0x8b, 0xa1, 0x64, 0x99, 0xa1, 0xa9, 0x7e, 0x05, 0x92, 0x2f, 0x4b, 0x2a, - 0x0b, 0x52, 0x8b, 0x93, 0xd8, 0xc0, 0x3e, 0x31, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x31, 0xd6, - 0x95, 0xec, 0x47, 0x01, 0x00, 0x00, + 0x53, 0xcb, 0x72, 0xf3, 0x8b, 0xa1, 0x64, 0x99, 0xa1, 0x99, 0x7e, 0x05, 0x92, 0x2f, 0x4b, 0x2a, + 0x0b, 0x52, 0x8b, 0x93, 0xd8, 0xc0, 0x3e, 0x31, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0xf2, 0xfb, + 0x01, 0x5f, 0x47, 0x01, 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { diff --git a/x/feemarket/types/query.pb.go b/x/feemarket/types/query.pb.go index b71f6d01cb..1f1927a1e7 100644 --- a/x/feemarket/types/query.pb.go +++ b/x/feemarket/types/query.pb.go @@ -291,32 +291,32 @@ var fileDescriptor_71a07c1ffd85fde2 = []byte{ // 446 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x53, 0x4d, 0x6f, 0xd3, 0x40, 0x10, 0xcd, 0x12, 0x48, 0xcb, 0x72, 0x41, 0x4b, 0x52, 0x81, 0x15, 0x36, 0xc8, 0x02, 0xc4, 0x47, - 0xd9, 0x55, 0x0a, 0xdc, 0x38, 0xf9, 0x50, 0x84, 0xc4, 0x01, 0xcc, 0x8d, 0x4b, 0xb5, 0x0e, 0x53, - 0xc7, 0x4a, 0xed, 0x75, 0xbd, 0x1b, 0x8b, 0x5e, 0x91, 0xb8, 0x70, 0x40, 0x48, 0xfc, 0x0e, 0xfe, - 0x47, 0x8f, 0x95, 0xb8, 0x20, 0x0e, 0x15, 0x4a, 0xf8, 0x21, 0xc8, 0xbb, 0xeb, 0x80, 0x21, 0xa1, - 0xb9, 0x58, 0xa3, 0xf1, 0x9b, 0xf7, 0xde, 0xbc, 0xd1, 0x62, 0x1f, 0xf4, 0x18, 0x8a, 0x34, 0xc9, - 0x34, 0xdf, 0x07, 0x48, 0x45, 0x31, 0x01, 0xcd, 0xcb, 0x21, 0x3f, 0x9c, 0x42, 0x71, 0xc4, 0xf2, - 0x42, 0x6a, 0x49, 0xb6, 0x16, 0x18, 0xb6, 0xc0, 0xb0, 0x72, 0xe8, 0xdd, 0x5e, 0x31, 0xfb, 0x1b, - 0x64, 0xe6, 0xbd, 0x6e, 0x2c, 0x63, 0x69, 0x4a, 0x5e, 0x55, 0xae, 0xdb, 0x8f, 0xa5, 0x8c, 0x0f, - 0x80, 0x8b, 0x3c, 0xe1, 0x22, 0xcb, 0xa4, 0x16, 0x3a, 0x91, 0x99, 0xb2, 0x7f, 0xfd, 0x2e, 0x26, - 0x2f, 0x2b, 0x0b, 0x2f, 0x44, 0x21, 0x52, 0x15, 0xc2, 0xe1, 0x14, 0x94, 0xf6, 0x5f, 0xe1, 0x2b, - 0x8d, 0xae, 0xca, 0x65, 0xa6, 0x80, 0x3c, 0xc1, 0x9d, 0xdc, 0x74, 0xae, 0xa2, 0x1b, 0xe8, 0xce, - 0xa5, 0x1d, 0xca, 0x96, 0x3b, 0x66, 0x76, 0x2e, 0x38, 0x7f, 0x7c, 0x3a, 0x68, 0x85, 0x6e, 0xc6, - 0xef, 0x39, 0xd2, 0x40, 0x28, 0xd8, 0x05, 0xa8, 0xb5, 0x9e, 0xe3, 0x6e, 0xb3, 0xed, 0xc4, 0x1e, - 0xe1, 0xcd, 0x48, 0x28, 0xd8, 0xdb, 0x07, 0x30, 0x72, 0x17, 0x83, 0x6b, 0xdf, 0x4f, 0x07, 0xbd, - 0x91, 0x54, 0xa9, 0x54, 0xea, 0xcd, 0x84, 0x25, 0x92, 0xa7, 0x42, 0x8f, 0xd9, 0xb3, 0x4c, 0x87, - 0x1b, 0x91, 0x9d, 0xf6, 0xb7, 0x6a, 0xb6, 0x03, 0x39, 0x9a, 0x3c, 0x15, 0x8b, 0x8d, 0xee, 0xe2, - 0xde, 0x5f, 0x7d, 0x27, 0x73, 0x19, 0xb7, 0x63, 0x61, 0x17, 0x6a, 0x87, 0x55, 0xb9, 0xf3, 0xa5, - 0x8d, 0x2f, 0x18, 0x2c, 0x79, 0x8f, 0x70, 0xc7, 0xae, 0x42, 0xee, 0xad, 0x5a, 0xf5, 0xdf, 0xf4, - 0xbc, 0xfb, 0x6b, 0x61, 0xad, 0xbe, 0xef, 0xbf, 0xfb, 0xfa, 0xf3, 0xf3, 0xb9, 0x3e, 0xf1, 0x38, - 0x94, 0xa9, 0x54, 0xcd, 0x0b, 0xdb, 0xe4, 0xc8, 0x07, 0x84, 0x37, 0x5c, 0x3c, 0xe4, 0xff, 0xe4, - 0xcd, 0x6c, 0xbd, 0xed, 0xf5, 0xc0, 0xce, 0xca, 0x4d, 0x63, 0x85, 0x92, 0xfe, 0x32, 0x2b, 0xf5, - 0x2d, 0xc8, 0x47, 0x84, 0x37, 0xeb, 0x14, 0xc9, 0x19, 0x02, 0xcd, 0x23, 0x78, 0x0f, 0xd6, 0x44, - 0x3b, 0x3f, 0xb7, 0x8c, 0x9f, 0x01, 0xb9, 0xbe, 0xd4, 0x4f, 0x85, 0xde, 0x8b, 0x85, 0x0a, 0x76, - 0x8f, 0x67, 0x14, 0x9d, 0xcc, 0x28, 0xfa, 0x31, 0xa3, 0xe8, 0xd3, 0x9c, 0xb6, 0x4e, 0xe6, 0xb4, - 0xf5, 0x6d, 0x4e, 0x5b, 0xaf, 0xb7, 0xe3, 0x44, 0x8f, 0xa7, 0x11, 0x1b, 0xc9, 0xd4, 0x51, 0xd8, - 0x6f, 0x39, 0x7c, 0xcc, 0xdf, 0xfe, 0x41, 0xa7, 0x8f, 0x72, 0x50, 0x51, 0xc7, 0xbc, 0x88, 0x87, - 0xbf, 0x02, 0x00, 0x00, 0xff, 0xff, 0x02, 0xfe, 0x6e, 0x21, 0xab, 0x03, 0x00, 0x00, + 0xd9, 0x55, 0x0a, 0xe2, 0xc4, 0xc9, 0x87, 0x22, 0x24, 0x0e, 0x60, 0x6e, 0x5c, 0xaa, 0x75, 0x98, + 0x3a, 0x56, 0x6a, 0xaf, 0xeb, 0xdd, 0x58, 0xf4, 0x8a, 0xc4, 0x85, 0x03, 0x42, 0xe2, 0x77, 0xf0, + 0x3f, 0x7a, 0xac, 0xc4, 0x05, 0x71, 0xa8, 0x50, 0xc2, 0x0f, 0x41, 0xde, 0x5d, 0x07, 0x0c, 0x09, + 0xcd, 0xc5, 0x1a, 0x8d, 0xdf, 0xbc, 0xf7, 0xe6, 0x8d, 0x16, 0xfb, 0xa0, 0xc7, 0x50, 0xa4, 0x49, + 0xa6, 0xf9, 0x3e, 0x40, 0x2a, 0x8a, 0x09, 0x68, 0x5e, 0x0e, 0xf9, 0xe1, 0x14, 0x8a, 0x23, 0x96, + 0x17, 0x52, 0x4b, 0xb2, 0xb5, 0xc0, 0xb0, 0x05, 0x86, 0x95, 0x43, 0xef, 0xf6, 0x8a, 0xd9, 0xdf, + 0x20, 0x33, 0xef, 0x75, 0x63, 0x19, 0x4b, 0x53, 0xf2, 0xaa, 0x72, 0xdd, 0x7e, 0x2c, 0x65, 0x7c, + 0x00, 0x5c, 0xe4, 0x09, 0x17, 0x59, 0x26, 0xb5, 0xd0, 0x89, 0xcc, 0x94, 0xfd, 0xeb, 0x77, 0x31, + 0x79, 0x59, 0x59, 0x78, 0x21, 0x0a, 0x91, 0xaa, 0x10, 0x0e, 0xa7, 0xa0, 0xb4, 0xff, 0x0a, 0x5f, + 0x69, 0x74, 0x55, 0x2e, 0x33, 0x05, 0xe4, 0x09, 0xee, 0xe4, 0xa6, 0x73, 0x15, 0xdd, 0x40, 0x77, + 0x2e, 0xed, 0x50, 0xb6, 0xdc, 0x31, 0xb3, 0x73, 0xc1, 0xf9, 0xe3, 0xd3, 0x41, 0x2b, 0x74, 0x33, + 0x7e, 0xcf, 0x91, 0x06, 0x42, 0xc1, 0x2e, 0x40, 0xad, 0xf5, 0x1c, 0x77, 0x9b, 0x6d, 0x27, 0xf6, + 0x08, 0x6f, 0x46, 0x42, 0xc1, 0xde, 0x3e, 0x80, 0x91, 0xbb, 0x18, 0x5c, 0xfb, 0x7e, 0x3a, 0xe8, + 0x8d, 0xa4, 0x4a, 0xa5, 0x52, 0x6f, 0x26, 0x2c, 0x91, 0x3c, 0x15, 0x7a, 0xcc, 0x9e, 0x65, 0x3a, + 0xdc, 0x88, 0xec, 0xb4, 0xbf, 0x55, 0xb3, 0x1d, 0xc8, 0xd1, 0xe4, 0xa9, 0x58, 0x6c, 0x74, 0x17, + 0xf7, 0xfe, 0xea, 0x3b, 0x99, 0xcb, 0xb8, 0x1d, 0x0b, 0xbb, 0x50, 0x3b, 0xac, 0xca, 0x9d, 0x2f, + 0x6d, 0x7c, 0xc1, 0x60, 0xc9, 0x7b, 0x84, 0x3b, 0x76, 0x15, 0x72, 0x6f, 0xd5, 0xaa, 0xff, 0xa6, + 0xe7, 0xdd, 0x5f, 0x0b, 0x6b, 0xf5, 0x7d, 0xff, 0xdd, 0xd7, 0x9f, 0x9f, 0xcf, 0xf5, 0x89, 0xc7, + 0xa1, 0x4c, 0xa5, 0x6a, 0x5e, 0xd8, 0x26, 0x47, 0x3e, 0x20, 0xbc, 0xe1, 0xe2, 0x21, 0xff, 0x27, + 0x6f, 0x66, 0xeb, 0x6d, 0xaf, 0x07, 0x76, 0x56, 0x6e, 0x1a, 0x2b, 0x94, 0xf4, 0x97, 0x59, 0xa9, + 0x6f, 0x41, 0x3e, 0x22, 0xbc, 0x59, 0xa7, 0x48, 0xce, 0x10, 0x68, 0x1e, 0xc1, 0x7b, 0xb0, 0x26, + 0xda, 0xf9, 0xb9, 0x65, 0xfc, 0x0c, 0xc8, 0xf5, 0xa5, 0x7e, 0x2a, 0xf4, 0x5e, 0x2c, 0x54, 0xb0, + 0x7b, 0x3c, 0xa3, 0xe8, 0x64, 0x46, 0xd1, 0x8f, 0x19, 0x45, 0x9f, 0xe6, 0xb4, 0x75, 0x32, 0xa7, + 0xad, 0x6f, 0x73, 0xda, 0x7a, 0xbd, 0x1d, 0x27, 0x7a, 0x3c, 0x8d, 0xd8, 0x48, 0xa6, 0x8e, 0xc2, + 0x7e, 0xcb, 0xe1, 0x63, 0xfe, 0xf6, 0x0f, 0x3a, 0x7d, 0x94, 0x83, 0x8a, 0x3a, 0xe6, 0x45, 0x3c, + 0xfc, 0x15, 0x00, 0x00, 0xff, 0xff, 0xc1, 0xd3, 0xfa, 0x92, 0xab, 0x03, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/feemarket/types/tx.pb.go b/x/feemarket/types/tx.pb.go index ae1f8da366..5cf1839029 100644 --- a/x/feemarket/types/tx.pb.go +++ b/x/feemarket/types/tx.pb.go @@ -151,8 +151,8 @@ var fileDescriptor_78aff2584dbf2838 = []byte{ 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, 0x83, 0x90, 0x65, 0x86, 0xa6, 0xfa, 0x15, 0x48, 0x11, 0x52, 0x52, 0x59, 0x90, 0x5a, 0x9c, - 0xc4, 0x06, 0x0e, 0x74, 0x63, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0x37, 0x3a, 0xae, 0x40, 0x21, + 0xb8, 0x83, 0x90, 0x65, 0x86, 0x66, 0xfa, 0x15, 0x48, 0x11, 0x52, 0x52, 0x59, 0x90, 0x5a, 0x9c, + 0xc4, 0x06, 0x0e, 0x74, 0x63, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf4, 0x17, 0x3a, 0xf3, 0x21, 0x02, 0x00, 0x00, } diff --git a/x/inflation/v1/types/genesis.pb.go b/x/inflation/v1/types/genesis.pb.go index 3ed32d52fa..6473d462f4 100644 --- a/x/inflation/v1/types/genesis.pb.go +++ b/x/inflation/v1/types/genesis.pb.go @@ -189,7 +189,7 @@ var fileDescriptor_1cb8eee530db1235 = []byte{ // 415 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x52, 0x4d, 0x6f, 0xd3, 0x40, 0x10, 0xcd, 0x36, 0xc1, 0x22, 0x5b, 0xa0, 0xb0, 0x82, 0x60, 0x45, 0xc2, 0x58, 0x91, 0x90, 0xdc, - 0x1e, 0x6c, 0xa5, 0x08, 0x89, 0x73, 0x69, 0x85, 0x72, 0x8b, 0xcc, 0x8d, 0xcb, 0xca, 0x1f, 0x13, + 0x1e, 0x6c, 0xa5, 0x48, 0x88, 0x73, 0x69, 0x85, 0x72, 0x8b, 0xcc, 0x8d, 0xcb, 0xca, 0x1f, 0x13, 0x77, 0x85, 0xbd, 0xbb, 0xf2, 0x6e, 0xac, 0xf2, 0x2f, 0xf8, 0x13, 0xfc, 0x97, 0x1e, 0x7b, 0xe4, 0x54, 0xa1, 0xe4, 0x8f, 0x20, 0xef, 0x1a, 0x07, 0x54, 0x5f, 0x2c, 0xef, 0x7b, 0x6f, 0xde, 0x9b, 0x19, 0x0d, 0xf6, 0xa1, 0xa9, 0x84, 0x8a, 0x18, 0xdf, 0x94, 0x89, 0x66, 0x82, 0x47, 0xcd, 0x32, @@ -212,7 +212,7 @@ var fileDescriptor_1cb8eee530db1235 = []byte{ 0x9d, 0x87, 0xee, 0x76, 0x1e, 0xfa, 0xbd, 0xf3, 0xd0, 0x8f, 0xbd, 0x37, 0xba, 0xdb, 0x7b, 0xa3, 0x5f, 0x7b, 0x6f, 0xf4, 0x35, 0x2a, 0x98, 0xbe, 0xde, 0xa6, 0x61, 0x26, 0xaa, 0xc8, 0x5e, 0x94, 0xfd, 0x36, 0xcb, 0x0f, 0xd1, 0xcd, 0xff, 0xd7, 0xa5, 0xbf, 0x4b, 0x50, 0xa9, 0x63, 0x4e, 0xeb, - 0xfd, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3a, 0x46, 0x28, 0xc5, 0xcc, 0x02, 0x00, 0x00, + 0xfd, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x22, 0x63, 0x89, 0x81, 0xcc, 0x02, 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { diff --git a/x/inflation/v1/types/inflation.pb.go b/x/inflation/v1/types/inflation.pb.go index 62743ac2c3..ccf7b5bd53 100644 --- a/x/inflation/v1/types/inflation.pb.go +++ b/x/inflation/v1/types/inflation.pb.go @@ -137,31 +137,31 @@ func init() { } var fileDescriptor_d064cb35c3ff7df8 = []byte{ - // 378 bytes of a gzipped FileDescriptorProto + // 379 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x92, 0x4f, 0x6b, 0xdb, 0x30, 0x18, 0xc6, 0xad, 0xec, 0x0f, 0x4c, 0xdb, 0x92, 0x61, 0xb6, 0x61, 0x36, 0x70, 0x46, 0xc6, 0x60, - 0x27, 0x1b, 0x33, 0xf6, 0x05, 0xb2, 0x6c, 0x90, 0x91, 0x43, 0x08, 0xa5, 0x87, 0x5e, 0x8c, 0xac, - 0xa8, 0x8e, 0x88, 0xa5, 0xd7, 0x48, 0xb2, 0xeb, 0x9c, 0xfb, 0x05, 0xfa, 0xa5, 0x0a, 0x39, 0xe6, - 0x58, 0x7a, 0x08, 0x25, 0xf9, 0x22, 0xc5, 0x7f, 0x9a, 0xd0, 0x9b, 0x73, 0x11, 0xaf, 0xa4, 0xf7, - 0xf7, 0xf0, 0x3e, 0xd2, 0x83, 0x07, 0x2c, 0x17, 0xa0, 0x7d, 0x2e, 0x2f, 0x13, 0x62, 0x38, 0x48, - 0x3f, 0x0f, 0x8e, 0x1b, 0x2f, 0x55, 0x60, 0xc0, 0xb6, 0xab, 0x1e, 0xef, 0x78, 0x9c, 0x07, 0x5f, - 0x3e, 0xc6, 0x10, 0x43, 0x75, 0xed, 0x97, 0x55, 0xdd, 0x39, 0xb8, 0xee, 0xe0, 0x4f, 0xe3, 0xa7, - 0xb6, 0x11, 0xd7, 0x46, 0xf1, 0x28, 0x2b, 0x6b, 0x7b, 0x82, 0x7b, 0xda, 0x90, 0x25, 0x97, 0x71, - 0xa8, 0xd8, 0x15, 0x51, 0x73, 0xed, 0xa0, 0x6f, 0xe8, 0xe7, 0x9b, 0xe1, 0xf7, 0xf5, 0xb6, 0x6f, - 0xdd, 0x6f, 0xfb, 0x5f, 0x29, 0x68, 0x01, 0x5a, 0xcf, 0x97, 0x1e, 0x07, 0x5f, 0x10, 0xb3, 0xf0, - 0x26, 0x2c, 0x26, 0x74, 0x35, 0x62, 0x74, 0xd6, 0x6d, 0xd8, 0x59, 0x8d, 0xda, 0x53, 0xfc, 0x21, - 0xd3, 0x24, 0x66, 0x21, 0x97, 0x94, 0x49, 0xc3, 0x73, 0xa6, 0x9d, 0x4e, 0x25, 0xf7, 0xa3, 0x85, - 0x9c, 0x83, 0x66, 0xbd, 0x0a, 0x1f, 0x1f, 0x68, 0xfb, 0x3f, 0xee, 0x52, 0x10, 0x22, 0x93, 0xdc, - 0xac, 0xc2, 0x14, 0x20, 0x71, 0x5e, 0xb4, 0x1f, 0xef, 0xfd, 0x01, 0x9d, 0x02, 0x24, 0x83, 0xdb, - 0x0e, 0xfe, 0xfc, 0xb7, 0x48, 0x41, 0x96, 0xe2, 0x24, 0xf9, 0x43, 0x12, 0x9a, 0xd5, 0x4f, 0x62, - 0x07, 0x18, 0x91, 0x53, 0x8c, 0x23, 0x52, 0x22, 0xaa, 0x31, 0xd7, 0x0e, 0x51, 0x25, 0x42, 0x4f, - 0x99, 0x1f, 0xd1, 0xd2, 0x7f, 0x04, 0x72, 0x5e, 0xfe, 0x8f, 0x21, 0x2a, 0x66, 0xc6, 0x79, 0x79, - 0x82, 0xff, 0x06, 0x3d, 0xab, 0x48, 0xfb, 0x1f, 0x7e, 0x27, 0x48, 0x11, 0xe6, 0x44, 0x71, 0x22, - 0x29, 0x73, 0x5e, 0xb5, 0x57, 0x7a, 0x2b, 0x48, 0x71, 0xde, 0x70, 0xc3, 0xf1, 0x7a, 0xe7, 0xa2, - 0xcd, 0xce, 0x45, 0x0f, 0x3b, 0x17, 0xdd, 0xec, 0x5d, 0x6b, 0xb3, 0x77, 0xad, 0xbb, 0xbd, 0x6b, - 0x5d, 0xf8, 0x31, 0x37, 0x8b, 0x2c, 0xf2, 0x28, 0x08, 0xbf, 0x0e, 0x70, 0xbd, 0xe6, 0xc1, 0x6f, - 0xbf, 0x78, 0x1e, 0x66, 0xb3, 0x4a, 0x99, 0x8e, 0x5e, 0x57, 0xf9, 0xfc, 0xf5, 0x18, 0x00, 0x00, - 0xff, 0xff, 0xa0, 0xf9, 0x03, 0x13, 0xef, 0x02, 0x00, 0x00, + 0x27, 0x1b, 0x33, 0xd8, 0x07, 0xc8, 0xb2, 0x41, 0x46, 0x0e, 0x21, 0x94, 0x1e, 0x7a, 0x31, 0xb2, + 0xa2, 0x3a, 0x22, 0x96, 0x5e, 0x23, 0xc9, 0xae, 0x73, 0xee, 0x17, 0xe8, 0x97, 0x2a, 0xe4, 0x98, + 0x63, 0xe9, 0x21, 0x94, 0xe4, 0x8b, 0x14, 0xff, 0x69, 0x42, 0x6f, 0xce, 0x45, 0xbc, 0x92, 0xde, + 0xdf, 0xc3, 0xfb, 0x48, 0x0f, 0x1e, 0xb0, 0x5c, 0x80, 0xf6, 0xb9, 0xbc, 0x4c, 0x88, 0xe1, 0x20, + 0xfd, 0x3c, 0x38, 0x6e, 0xbc, 0x54, 0x81, 0x01, 0xdb, 0xae, 0x7a, 0xbc, 0xe3, 0x71, 0x1e, 0x7c, + 0xf9, 0x18, 0x43, 0x0c, 0xd5, 0xb5, 0x5f, 0x56, 0x75, 0xe7, 0xe0, 0xba, 0x83, 0x3f, 0x8d, 0x9f, + 0xda, 0x46, 0x5c, 0x1b, 0xc5, 0xa3, 0xac, 0xac, 0xed, 0x09, 0xee, 0x69, 0x43, 0x96, 0x5c, 0xc6, + 0xa1, 0x62, 0x57, 0x44, 0xcd, 0xb5, 0x83, 0xbe, 0xa1, 0x9f, 0x6f, 0x86, 0xdf, 0xd7, 0xdb, 0xbe, + 0x75, 0xbf, 0xed, 0x7f, 0xa5, 0xa0, 0x05, 0x68, 0x3d, 0x5f, 0x7a, 0x1c, 0x7c, 0x41, 0xcc, 0xc2, + 0x9b, 0xb0, 0x98, 0xd0, 0xd5, 0x88, 0xd1, 0x59, 0xb7, 0x61, 0x67, 0x35, 0x6a, 0x4f, 0xf1, 0x87, + 0x4c, 0x93, 0x98, 0x85, 0x5c, 0x52, 0x26, 0x0d, 0xcf, 0x99, 0x76, 0x3a, 0x95, 0xdc, 0x8f, 0x16, + 0x72, 0x0e, 0x9a, 0xf5, 0x2a, 0x7c, 0x7c, 0xa0, 0xed, 0xff, 0xb8, 0x4b, 0x41, 0x88, 0x4c, 0x72, + 0xb3, 0x0a, 0x53, 0x80, 0xc4, 0x79, 0xd1, 0x7e, 0xbc, 0xf7, 0x07, 0x74, 0x0a, 0x90, 0x0c, 0x6e, + 0x3b, 0xf8, 0xf3, 0xdf, 0x22, 0x05, 0x59, 0x8a, 0x93, 0xe4, 0x0f, 0x49, 0x68, 0x56, 0x3f, 0x89, + 0x1d, 0x60, 0x44, 0x4e, 0x31, 0x8e, 0x48, 0x89, 0xa8, 0xc6, 0x5c, 0x3b, 0x44, 0x95, 0x08, 0x3d, + 0x65, 0x7e, 0x44, 0x4b, 0xff, 0x11, 0xc8, 0x79, 0xf9, 0x3f, 0x86, 0xa8, 0x98, 0x19, 0xe7, 0xe5, + 0x09, 0xfe, 0x1b, 0xf4, 0xac, 0x22, 0xed, 0x7f, 0xf8, 0x9d, 0x20, 0x45, 0x98, 0x13, 0xc5, 0x89, + 0xa4, 0xcc, 0x79, 0xd5, 0x5e, 0xe9, 0xad, 0x20, 0xc5, 0x79, 0xc3, 0x0d, 0xc7, 0xeb, 0x9d, 0x8b, + 0x36, 0x3b, 0x17, 0x3d, 0xec, 0x5c, 0x74, 0xb3, 0x77, 0xad, 0xcd, 0xde, 0xb5, 0xee, 0xf6, 0xae, + 0x75, 0xe1, 0xc7, 0xdc, 0x2c, 0xb2, 0xc8, 0xa3, 0x20, 0xfc, 0x3a, 0xc0, 0xf5, 0x9a, 0x07, 0xbf, + 0xfd, 0xe2, 0x79, 0x98, 0xcd, 0x2a, 0x65, 0x3a, 0x7a, 0x5d, 0xe5, 0xf3, 0xd7, 0x63, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xb8, 0xdc, 0xa2, 0x57, 0xef, 0x02, 0x00, 0x00, } func (m *InflationDistribution) Marshal() (dAtA []byte, err error) { diff --git a/x/inflation/v1/types/query.pb.go b/x/inflation/v1/types/query.pb.go index a7f94b6e0a..760d1d7d20 100644 --- a/x/inflation/v1/types/query.pb.go +++ b/x/inflation/v1/types/query.pb.go @@ -551,7 +551,7 @@ var fileDescriptor_91b9f1b5d47c7fd7 = []byte{ // 679 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x95, 0xc1, 0x6a, 0x13, 0x41, 0x18, 0xc7, 0xb3, 0x52, 0x23, 0x8e, 0xb4, 0xd0, 0xb1, 0x88, 0x6e, 0xeb, 0x26, 0xac, 0x5a, 0x43, - 0xa1, 0x33, 0x26, 0x45, 0xf0, 0xdc, 0xea, 0xa1, 0xa2, 0x58, 0xd3, 0x9b, 0x97, 0xb0, 0xd9, 0x8e, + 0xa1, 0x33, 0x26, 0x05, 0xf1, 0xdc, 0xea, 0xa1, 0xa2, 0x58, 0xd3, 0x9b, 0x97, 0xb0, 0xd9, 0x8e, 0x9b, 0xa1, 0xcd, 0xcc, 0x74, 0x67, 0x12, 0x9a, 0x83, 0x17, 0x9f, 0x40, 0xf0, 0x20, 0x28, 0xf8, 0x00, 0xbd, 0xf8, 0x1a, 0x3d, 0x16, 0xbc, 0x88, 0x87, 0x2a, 0xad, 0x0f, 0x22, 0x3b, 0x3b, 0x9b, 0x76, 0x9b, 0xd9, 0xad, 0x05, 0x2f, 0x61, 0x33, 0xdf, 0xff, 0xfb, 0xbe, 0x3f, 0xff, 0x9d, 0x1f, @@ -590,8 +590,8 @@ var fileDescriptor_91b9f1b5d47c7fd7 = []byte{ 0x72, 0xd8, 0x5e, 0xc0, 0x45, 0x8a, 0xeb, 0xfa, 0xc1, 0xb1, 0xe7, 0x1c, 0x1e, 0x7b, 0xce, 0xef, 0x63, 0xcf, 0xf9, 0x70, 0xe2, 0x55, 0x0e, 0x4f, 0xbc, 0xca, 0x8f, 0x13, 0xaf, 0xf2, 0x06, 0x47, 0x54, 0xf5, 0x06, 0x5d, 0x14, 0xf2, 0xbe, 0xe9, 0x4f, 0x7f, 0x87, 0xcd, 0xc7, 0x78, 0x2f, 0x3f, - 0x4b, 0x8d, 0x04, 0x91, 0xdd, 0xaa, 0xfe, 0x04, 0xae, 0xfc, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x5a, - 0x7f, 0xbc, 0x82, 0xae, 0x07, 0x00, 0x00, + 0x4b, 0x8d, 0x04, 0x91, 0xdd, 0xaa, 0xfe, 0x04, 0xae, 0xfc, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x42, + 0x5a, 0x1d, 0xc6, 0xae, 0x07, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/inflation/v1/types/tx.pb.go b/x/inflation/v1/types/tx.pb.go index 1f2552f500..7eb7e4d9ba 100644 --- a/x/inflation/v1/types/tx.pb.go +++ b/x/inflation/v1/types/tx.pb.go @@ -151,8 +151,8 @@ var fileDescriptor_2f254d33a26438a9 = []byte{ 0x98, 0x45, 0x4e, 0x9e, 0x27, 0x1e, 0xc9, 0x31, 0x5e, 0x78, 0x24, 0xc7, 0xf8, 0xe0, 0x91, 0x1c, 0xe3, 0x84, 0xc7, 0x72, 0x0c, 0x17, 0x1e, 0xcb, 0x31, 0xdc, 0x78, 0x2c, 0xc7, 0x10, 0xa5, 0x9f, 0x9e, 0x59, 0x92, 0x51, 0x9a, 0xa4, 0x97, 0x9c, 0x9f, 0xab, 0x0f, 0x09, 0x76, 0x08, 0x59, 0x66, - 0x68, 0xaa, 0x5f, 0x81, 0x16, 0xcf, 0x95, 0x05, 0xa9, 0xc5, 0x49, 0x6c, 0xe0, 0xb0, 0x36, 0x06, - 0x04, 0x00, 0x00, 0xff, 0xff, 0x48, 0x98, 0xc8, 0xae, 0x0a, 0x02, 0x00, 0x00, + 0x68, 0xa6, 0x5f, 0x81, 0x16, 0xcf, 0x95, 0x05, 0xa9, 0xc5, 0x49, 0x6c, 0xe0, 0xb0, 0x36, 0x06, + 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0xbd, 0x69, 0xea, 0x0a, 0x02, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/revenue/v1/types/events.pb.go b/x/revenue/v1/types/events.pb.go index 83bfc4e404..6a7066dfa7 100644 --- a/x/revenue/v1/types/events.pb.go +++ b/x/revenue/v1/types/events.pb.go @@ -297,25 +297,25 @@ var fileDescriptor_56d63fc43f5946c2 = []byte{ // 337 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x92, 0xcf, 0x4a, 0xc3, 0x40, 0x10, 0xc6, 0xbb, 0x55, 0x8a, 0xee, 0xc5, 0x1a, 0x4b, 0x29, 0x82, 0x41, 0x72, 0xd2, 0x43, 0x13, - 0x82, 0xf8, 0x00, 0xfe, 0xc3, 0x7b, 0x41, 0x04, 0x2f, 0x25, 0xcd, 0x4e, 0xdb, 0x95, 0x36, 0x1b, - 0x76, 0x27, 0x5b, 0xfb, 0x16, 0x82, 0x27, 0x4f, 0xbe, 0x8e, 0xc7, 0x1e, 0x3d, 0x4a, 0xfb, 0x22, - 0x92, 0xec, 0x26, 0x2d, 0xd8, 0x8b, 0x07, 0x2f, 0x21, 0x33, 0xdf, 0x8f, 0xfd, 0xbe, 0x19, 0x86, - 0x9e, 0x80, 0x9e, 0x0a, 0x15, 0x48, 0xd0, 0x90, 0x64, 0x10, 0xe8, 0x30, 0xc8, 0xff, 0x50, 0xf9, - 0xa9, 0x14, 0x28, 0x9c, 0x66, 0x21, 0xfb, 0x56, 0xf6, 0x75, 0xe8, 0x7d, 0x10, 0xda, 0xba, 0xcb, - 0x91, 0x1e, 0x8c, 0xb8, 0x42, 0x90, 0x3d, 0xa3, 0x39, 0xe7, 0xb4, 0xc9, 0x20, 0x9d, 0x88, 0x39, - 0xc8, 0x7e, 0xc4, 0x98, 0x04, 0xa5, 0x3a, 0xe4, 0x94, 0x9c, 0xed, 0xf7, 0x0e, 0xca, 0xfe, 0x95, - 0x69, 0xe7, 0x68, 0x2c, 0x12, 0x94, 0x51, 0x8c, 0x15, 0x5a, 0x37, 0x68, 0xd9, 0x2f, 0xd1, 0x90, - 0xb6, 0x60, 0x38, 0x84, 0x18, 0xb9, 0x86, 0xfe, 0x8c, 0xe3, 0x98, 0xc9, 0x68, 0x06, 0xb2, 0xb3, - 0x53, 0xe0, 0x47, 0x95, 0xf6, 0x58, 0x49, 0xde, 0x3b, 0xa1, 0x4e, 0x91, 0xf0, 0x21, 0x65, 0x11, - 0xc2, 0x46, 0xbe, 0x5f, 0xa6, 0x64, 0xbb, 0xe9, 0xb6, 0x51, 0xea, 0xdb, 0x47, 0xe9, 0x52, 0x67, - 0x9d, 0xaa, 0x82, 0x4d, 0xba, 0xc3, 0xb5, 0x62, 0x71, 0xef, 0xd9, 0x46, 0xbb, 0x89, 0x92, 0x18, - 0x26, 0xff, 0xba, 0x3a, 0xef, 0x8d, 0xd0, 0x76, 0x61, 0x76, 0xcb, 0x15, 0x4a, 0x3e, 0xc8, 0xd6, - 0xbb, 0x68, 0xd3, 0x86, 0x82, 0x84, 0x81, 0xb4, 0x36, 0xb6, 0x72, 0x8e, 0xe9, 0x5e, 0xf9, 0x8a, - 0x7d, 0xb5, 0xaa, 0xff, 0x38, 0x69, 0x6e, 0x11, 0x4d, 0x45, 0x96, 0x60, 0x67, 0xd7, 0x58, 0x98, - 0xea, 0xfa, 0xfe, 0x73, 0xe9, 0x92, 0xc5, 0xd2, 0x25, 0xdf, 0x4b, 0x97, 0xbc, 0xae, 0xdc, 0xda, - 0x62, 0xe5, 0xd6, 0xbe, 0x56, 0x6e, 0xed, 0xa9, 0x3b, 0xe2, 0x38, 0xce, 0x06, 0x7e, 0x2c, 0xa6, - 0x81, 0xb9, 0x4a, 0xf3, 0xd5, 0xe1, 0x65, 0xf0, 0xb2, 0x79, 0xa1, 0x38, 0x4f, 0x41, 0x0d, 0x1a, - 0xc5, 0x85, 0x5e, 0xfc, 0x04, 0x00, 0x00, 0xff, 0xff, 0x19, 0x0e, 0x32, 0x90, 0xc2, 0x02, 0x00, + 0x82, 0xe0, 0xdd, 0x7f, 0x78, 0x2f, 0x88, 0xe0, 0xa5, 0xa4, 0xd9, 0x69, 0xbb, 0xd2, 0x66, 0xc3, + 0xee, 0x64, 0x6b, 0xdf, 0x42, 0xf0, 0xe4, 0xc9, 0xd7, 0xf1, 0xd8, 0xa3, 0x47, 0x69, 0x5f, 0x44, + 0x92, 0xdd, 0xa4, 0x05, 0x7b, 0xf1, 0xe0, 0x25, 0x64, 0xe6, 0xfb, 0xb1, 0xdf, 0x37, 0xc3, 0xd0, + 0x13, 0xd0, 0x53, 0xa1, 0x02, 0x09, 0x1a, 0x92, 0x0c, 0x02, 0x1d, 0x06, 0xf9, 0x1f, 0x2a, 0x3f, + 0x95, 0x02, 0x85, 0xd3, 0x2c, 0x64, 0xdf, 0xca, 0xbe, 0x0e, 0xbd, 0x0f, 0x42, 0x5b, 0x77, 0x39, + 0xd2, 0x83, 0x11, 0x57, 0x08, 0xb2, 0x67, 0x34, 0xe7, 0x9c, 0x36, 0x19, 0xa4, 0x13, 0x31, 0x07, + 0xd9, 0x8f, 0x18, 0x93, 0xa0, 0x54, 0x87, 0x9c, 0x92, 0xb3, 0xfd, 0xde, 0x41, 0xd9, 0xbf, 0x32, + 0xed, 0x1c, 0x8d, 0x45, 0x82, 0x32, 0x8a, 0xb1, 0x42, 0xeb, 0x06, 0x2d, 0xfb, 0x25, 0x1a, 0xd2, + 0x16, 0x0c, 0x87, 0x10, 0x23, 0xd7, 0xd0, 0x9f, 0x71, 0x1c, 0x33, 0x19, 0xcd, 0x40, 0x76, 0x76, + 0x0a, 0xfc, 0xa8, 0xd2, 0x1e, 0x2b, 0xc9, 0x7b, 0x27, 0xd4, 0x29, 0x12, 0x3e, 0xa4, 0x2c, 0x42, + 0xd8, 0xc8, 0xf7, 0xcb, 0x94, 0x6c, 0x37, 0xdd, 0x36, 0x4a, 0x7d, 0xfb, 0x28, 0x5d, 0xea, 0xac, + 0x53, 0x55, 0xb0, 0x49, 0x77, 0xb8, 0x56, 0x2c, 0xee, 0x3d, 0xdb, 0x68, 0x37, 0x51, 0x12, 0xc3, + 0xe4, 0x5f, 0x57, 0xe7, 0xbd, 0x11, 0xda, 0x2e, 0xcc, 0x6e, 0xb9, 0x42, 0xc9, 0x07, 0xd9, 0x7a, + 0x17, 0x6d, 0xda, 0x50, 0x90, 0x30, 0x90, 0xd6, 0xc6, 0x56, 0xce, 0x31, 0xdd, 0x2b, 0x5f, 0xb1, + 0xaf, 0x56, 0xf5, 0x1f, 0x27, 0xcd, 0x2d, 0xa2, 0xa9, 0xc8, 0x12, 0xec, 0xec, 0x1a, 0x0b, 0x53, + 0x5d, 0xdf, 0x7f, 0x2e, 0x5d, 0xb2, 0x58, 0xba, 0xe4, 0x7b, 0xe9, 0x92, 0xd7, 0x95, 0x5b, 0x5b, + 0xac, 0xdc, 0xda, 0xd7, 0xca, 0xad, 0x3d, 0x75, 0x47, 0x1c, 0xc7, 0xd9, 0xc0, 0x8f, 0xc5, 0x34, + 0x30, 0x57, 0x69, 0xbe, 0x3a, 0xbc, 0x0c, 0x5e, 0x36, 0x2f, 0x14, 0xe7, 0x29, 0xa8, 0x41, 0xa3, + 0xb8, 0xd0, 0x8b, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3e, 0x09, 0xec, 0x92, 0xc2, 0x02, 0x00, 0x00, } diff --git a/x/revenue/v1/types/genesis.pb.go b/x/revenue/v1/types/genesis.pb.go index 42f176d062..8cf1e9ab64 100644 --- a/x/revenue/v1/types/genesis.pb.go +++ b/x/revenue/v1/types/genesis.pb.go @@ -146,30 +146,30 @@ func init() { func init() { proto.RegisterFile("evmos/revenue/v1/genesis.proto", fileDescriptor_649d64d9c3438055) } var fileDescriptor_649d64d9c3438055 = []byte{ - // 355 bytes of a gzipped FileDescriptorProto + // 354 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x91, 0x41, 0x6b, 0xea, 0x40, 0x14, 0x85, 0x33, 0x4f, 0x11, 0xdf, 0xf8, 0x5e, 0x2b, 0xa1, 0x8b, 0x54, 0x21, 0x8a, 0xa5, 0x90, - 0x4d, 0x27, 0x68, 0x69, 0x37, 0xa5, 0x1b, 0x15, 0xdc, 0x94, 0x52, 0xe2, 0xae, 0x9b, 0x30, 0x26, - 0x97, 0x18, 0x6a, 0x32, 0x61, 0x66, 0x0c, 0x75, 0xdd, 0x3f, 0xd0, 0x5f, 0xd4, 0xb5, 0x4b, 0x97, - 0xa5, 0x0b, 0x29, 0xfa, 0x47, 0x8a, 0x33, 0xa9, 0x94, 0xba, 0x19, 0x2e, 0xf7, 0x9c, 0xef, 0xdc, - 0x81, 0x83, 0x6d, 0xc8, 0x13, 0x26, 0x5c, 0x0e, 0x39, 0xa4, 0x73, 0x70, 0xf3, 0xae, 0x1b, 0x41, - 0x0a, 0x22, 0x16, 0x24, 0xe3, 0x4c, 0x32, 0xb3, 0xae, 0x74, 0x52, 0xe8, 0x24, 0xef, 0x36, 0x0e, - 0x89, 0x6f, 0x51, 0x11, 0x8d, 0x93, 0x88, 0x45, 0x4c, 0x8d, 0xee, 0x6e, 0xd2, 0xdb, 0xce, 0x0b, - 0xc2, 0xff, 0x46, 0x3a, 0x79, 0x2c, 0xa9, 0x04, 0xf3, 0x1a, 0x57, 0x32, 0xca, 0x69, 0x22, 0x2c, - 0xd4, 0x46, 0x4e, 0xad, 0x67, 0x91, 0xdf, 0x97, 0xc8, 0x83, 0xd2, 0xfb, 0xe5, 0xe5, 0xba, 0x65, - 0x78, 0x85, 0xdb, 0xbc, 0xc1, 0xd5, 0xc2, 0x22, 0xac, 0x3f, 0xed, 0x92, 0x53, 0xeb, 0x9d, 0x1e, - 0x92, 0x9e, 0x1e, 0x0b, 0x74, 0x0f, 0x74, 0xde, 0x10, 0xae, 0xe8, 0x54, 0xf3, 0x1c, 0x1f, 0x41, - 0x4a, 0x27, 0x33, 0xf0, 0x0b, 0x55, 0xfd, 0xa3, 0xea, 0xfd, 0xd7, 0xdb, 0x22, 0xc1, 0xbc, 0xc7, - 0xf5, 0x10, 0x72, 0x98, 0xb1, 0x0c, 0xb8, 0x2f, 0xa6, 0x94, 0xab, 0xb3, 0xc8, 0xf9, 0xdb, 0x3f, - 0xdb, 0x65, 0x7f, 0xac, 0x5b, 0xcd, 0x80, 0x89, 0x84, 0x09, 0x11, 0x3e, 0x91, 0x98, 0xb9, 0x09, - 0x95, 0x53, 0x72, 0x07, 0x11, 0x0d, 0x16, 0x43, 0x08, 0xbc, 0xe3, 0x3d, 0x3c, 0x56, 0xac, 0x79, - 0x8b, 0x9b, 0x34, 0x0c, 0xb9, 0x1f, 0x02, 0x8f, 0x73, 0x2a, 0x63, 0x96, 0xfa, 0x01, 0x13, 0xd2, - 0x0f, 0x38, 0x50, 0x09, 0x56, 0xa9, 0x8d, 0x9c, 0xb2, 0x67, 0xed, 0x2c, 0xc3, 0xbd, 0x63, 0xc0, - 0x84, 0x1c, 0x28, 0xbd, 0x3f, 0x5a, 0x6e, 0x6c, 0xb4, 0xda, 0xd8, 0xe8, 0x73, 0x63, 0xa3, 0xd7, - 0xad, 0x6d, 0xac, 0xb6, 0xb6, 0xf1, 0xbe, 0xb5, 0x8d, 0xc7, 0x8b, 0x28, 0x96, 0xd3, 0xf9, 0x84, - 0x04, 0x2c, 0x71, 0x75, 0x43, 0xfa, 0xcd, 0xbb, 0x57, 0xee, 0xf3, 0xcf, 0xb6, 0xe4, 0x22, 0x03, - 0x31, 0xa9, 0xa8, 0x5a, 0x2e, 0xbf, 0x02, 0x00, 0x00, 0xff, 0xff, 0xd5, 0xbe, 0xdd, 0xfb, 0x00, - 0x02, 0x00, 0x00, + 0x4d, 0x27, 0x68, 0xc1, 0x4d, 0xe9, 0x46, 0x05, 0x37, 0xa5, 0x94, 0xb8, 0xeb, 0x26, 0x8c, 0xc9, + 0x25, 0x86, 0x9a, 0x4c, 0x98, 0x19, 0x43, 0x5d, 0xf7, 0x0f, 0xf4, 0x17, 0x75, 0xed, 0xd2, 0x65, + 0xe9, 0x42, 0x8a, 0xfe, 0x91, 0xe2, 0x4c, 0x2a, 0xa5, 0x6e, 0x86, 0xcb, 0x3d, 0xe7, 0x3b, 0x77, + 0xe0, 0x60, 0x1b, 0xf2, 0x84, 0x09, 0x97, 0x43, 0x0e, 0xe9, 0x02, 0xdc, 0xbc, 0xeb, 0x46, 0x90, + 0x82, 0x88, 0x05, 0xc9, 0x38, 0x93, 0xcc, 0xac, 0x2b, 0x9d, 0x14, 0x3a, 0xc9, 0xbb, 0x8d, 0x63, + 0xe2, 0x5b, 0x54, 0x44, 0xe3, 0x2c, 0x62, 0x11, 0x53, 0xa3, 0xbb, 0x9f, 0xf4, 0xb6, 0xf3, 0x82, + 0xf0, 0xbf, 0xb1, 0x4e, 0x9e, 0x48, 0x2a, 0xc1, 0xec, 0xe3, 0x4a, 0x46, 0x39, 0x4d, 0x84, 0x85, + 0xda, 0xc8, 0xa9, 0xf5, 0x2c, 0xf2, 0xfb, 0x12, 0x79, 0x50, 0xfa, 0xa0, 0xbc, 0xda, 0xb4, 0x0c, + 0xaf, 0x70, 0x9b, 0x37, 0xb8, 0x5a, 0x58, 0x84, 0xf5, 0xa7, 0x5d, 0x72, 0x6a, 0xbd, 0xf3, 0x63, + 0xd2, 0xd3, 0x63, 0x81, 0x1e, 0x80, 0xce, 0x1b, 0xc2, 0x15, 0x9d, 0x6a, 0x5e, 0xe2, 0x13, 0x48, + 0xe9, 0x74, 0x0e, 0x7e, 0xa1, 0xaa, 0x7f, 0x54, 0xbd, 0xff, 0x7a, 0x5b, 0x24, 0x98, 0xf7, 0xb8, + 0x1e, 0x42, 0x0e, 0x73, 0x96, 0x01, 0xf7, 0xc5, 0x8c, 0x72, 0x75, 0x16, 0x39, 0x7f, 0x07, 0x17, + 0xfb, 0xec, 0x8f, 0x4d, 0xab, 0x19, 0x30, 0x91, 0x30, 0x21, 0xc2, 0x27, 0x12, 0x33, 0x37, 0xa1, + 0x72, 0x46, 0xee, 0x20, 0xa2, 0xc1, 0x72, 0x04, 0x81, 0x77, 0x7a, 0x80, 0x27, 0x8a, 0x35, 0x6f, + 0x71, 0x93, 0x86, 0x21, 0xf7, 0x43, 0xe0, 0x71, 0x4e, 0x65, 0xcc, 0x52, 0x3f, 0x60, 0x42, 0xfa, + 0x01, 0x07, 0x2a, 0xc1, 0x2a, 0xb5, 0x91, 0x53, 0xf6, 0xac, 0xbd, 0x65, 0x74, 0x70, 0x0c, 0x99, + 0x90, 0x43, 0xa5, 0x0f, 0xc6, 0xab, 0xad, 0x8d, 0xd6, 0x5b, 0x1b, 0x7d, 0x6e, 0x6d, 0xf4, 0xba, + 0xb3, 0x8d, 0xf5, 0xce, 0x36, 0xde, 0x77, 0xb6, 0xf1, 0x78, 0x15, 0xc5, 0x72, 0xb6, 0x98, 0x92, + 0x80, 0x25, 0xae, 0x6e, 0x48, 0xbf, 0x79, 0xb7, 0xef, 0x3e, 0xff, 0x6c, 0x4b, 0x2e, 0x33, 0x10, + 0xd3, 0x8a, 0xaa, 0xe5, 0xfa, 0x2b, 0x00, 0x00, 0xff, 0xff, 0xf2, 0xb9, 0x03, 0xf9, 0x00, 0x02, + 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { diff --git a/x/revenue/v1/types/query.pb.go b/x/revenue/v1/types/query.pb.go index d1393ded9a..f028c7a172 100644 --- a/x/revenue/v1/types/query.pb.go +++ b/x/revenue/v1/types/query.pb.go @@ -549,7 +549,7 @@ var fileDescriptor_5e4b17cda6e8e927 = []byte{ // 662 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x55, 0x4d, 0x6b, 0x13, 0x4f, 0x18, 0xcf, 0xf4, 0xff, 0xef, 0xdb, 0xd3, 0x83, 0xe9, 0x58, 0x21, 0x2e, 0x71, 0x5b, 0x16, 0xfb, - 0x26, 0x64, 0xc7, 0xad, 0x54, 0x11, 0x2f, 0x5a, 0xc4, 0x9e, 0x84, 0x76, 0x2f, 0x82, 0x07, 0x65, + 0x26, 0x64, 0xc7, 0xad, 0x58, 0x11, 0x2f, 0x5a, 0xc4, 0x9e, 0x84, 0x76, 0x2f, 0x82, 0x07, 0x65, 0x92, 0x0c, 0xdb, 0x85, 0x76, 0x67, 0xbb, 0xb3, 0xd9, 0x5a, 0x24, 0x08, 0x7e, 0x01, 0x15, 0x0f, 0xc5, 0x83, 0x5f, 0xc0, 0xa3, 0x9f, 0xa2, 0xc7, 0x82, 0x17, 0x4f, 0x22, 0x89, 0x5f, 0xc1, 0xbb, 0x64, 0x66, 0x36, 0x4d, 0x76, 0xdd, 0xc6, 0x4a, 0xc1, 0x4b, 0x58, 0x9e, 0xb7, 0xdf, 0xef, 0xf9, @@ -569,16 +569,16 @@ var fileDescriptor_5e4b17cda6e8e927 = []byte{ 0x39, 0x6d, 0x36, 0x23, 0x26, 0x84, 0x14, 0x61, 0xda, 0xbd, 0x94, 0xda, 0x1f, 0x28, 0xb3, 0xb5, 0x3d, 0xac, 0x60, 0xbf, 0xbf, 0xbb, 0x30, 0xa9, 0xe9, 0x6a, 0xf9, 0x46, 0xb6, 0x97, 0xc6, 0x5b, 0x73, 0x80, 0x65, 0xc9, 0x2d, 0x1a, 0xd1, 0xbd, 0xf4, 0x49, 0xac, 0xc7, 0x9a, 0x6a, 0x6a, 0xd5, - 0x38, 0xb7, 0x61, 0x22, 0x94, 0x16, 0x0d, 0x53, 0xc9, 0xc3, 0xa8, 0x0c, 0x8d, 0xa2, 0xa3, 0xad, - 0x77, 0x08, 0xaa, 0xb2, 0xde, 0x43, 0x16, 0xee, 0xf2, 0x43, 0x16, 0x65, 0x47, 0x60, 0x15, 0xca, - 0x4d, 0xed, 0xca, 0x6a, 0x90, 0xda, 0xb5, 0x06, 0x99, 0x69, 0x19, 0xfb, 0xeb, 0x69, 0x39, 0x42, - 0x70, 0xad, 0x80, 0x93, 0xee, 0xb6, 0x06, 0x38, 0xfb, 0x30, 0x7a, 0x7e, 0xa6, 0xdd, 0xd9, 0xcc, - 0xd3, 0x5c, 0xe4, 0x9c, 0x1c, 0x21, 0x30, 0x25, 0xb3, 0x27, 0x7e, 0xbc, 0xd3, 0x8c, 0xe8, 0x41, - 0x5e, 0xaf, 0x1a, 0xe0, 0x83, 0xbe, 0x33, 0xa3, 0xd8, 0xec, 0xa9, 0xe7, 0xa2, 0x35, 0xfb, 0x80, - 0x60, 0xbe, 0x90, 0xd9, 0xbf, 0x55, 0x6d, 0xed, 0xe7, 0x38, 0x8c, 0x4b, 0x6e, 0xf8, 0x15, 0x4c, - 0xa5, 0xac, 0xf0, 0x52, 0x7e, 0x42, 0x7f, 0x77, 0x83, 0x8c, 0xe5, 0x91, 0x71, 0x0a, 0xd2, 0xb2, - 0x5e, 0x7f, 0xf9, 0xf1, 0x7e, 0xac, 0x8a, 0x0d, 0x52, 0x74, 0x21, 0x05, 0x7e, 0x83, 0x60, 0x52, - 0x27, 0xe2, 0xc5, 0xb3, 0x0b, 0xa7, 0xf8, 0x4b, 0xa3, 0xc2, 0x34, 0xfc, 0xba, 0x84, 0x27, 0xb8, + 0x38, 0xeb, 0x30, 0x11, 0x4a, 0x8b, 0x86, 0xa9, 0xe4, 0x61, 0x54, 0x86, 0x46, 0xd1, 0xd1, 0xd6, + 0x3b, 0x04, 0x55, 0x59, 0xef, 0x21, 0x0b, 0x77, 0xf9, 0x21, 0x8b, 0xb2, 0x23, 0xb0, 0x0a, 0xe5, + 0xa6, 0x76, 0x65, 0x35, 0x48, 0xed, 0x5a, 0x83, 0xcc, 0xb4, 0x8c, 0xfd, 0xf5, 0xb4, 0x1c, 0x21, + 0xb8, 0x56, 0xc0, 0x49, 0x77, 0x5b, 0x03, 0x9c, 0x7d, 0x18, 0x3d, 0x3f, 0xd3, 0xee, 0x6c, 0xe6, + 0x69, 0x2e, 0x72, 0x4e, 0x8e, 0x10, 0x98, 0x92, 0xd9, 0x13, 0x3f, 0xde, 0x69, 0x46, 0xf4, 0x20, + 0xaf, 0x57, 0x0d, 0xf0, 0x41, 0xdf, 0x99, 0x51, 0x6c, 0xf6, 0xd4, 0x73, 0xd1, 0x9a, 0x7d, 0x40, + 0x30, 0x5f, 0xc8, 0xec, 0xdf, 0xaa, 0xb6, 0xf6, 0x73, 0x1c, 0xc6, 0x25, 0x37, 0xfc, 0x0a, 0xa6, + 0x52, 0x56, 0x78, 0x29, 0x3f, 0xa1, 0xbf, 0xbb, 0x41, 0xc6, 0xf2, 0xc8, 0x38, 0x05, 0x69, 0x59, + 0xaf, 0xbf, 0xfc, 0x78, 0x3f, 0x56, 0xc5, 0x06, 0x29, 0xba, 0x90, 0x02, 0xbf, 0x41, 0x30, 0xa9, + 0x13, 0xf1, 0xe2, 0xd9, 0x85, 0x53, 0xfc, 0xa5, 0x51, 0x61, 0x1a, 0xfe, 0xb6, 0x84, 0x27, 0xb8, 0x56, 0x0c, 0x4f, 0x5e, 0x66, 0xf5, 0x6f, 0xe3, 0x03, 0x98, 0x50, 0x8b, 0x89, 0xaf, 0x17, 0x00, 0x0d, 0xed, 0xbf, 0xb1, 0x38, 0x22, 0x4a, 0xb3, 0x59, 0x90, 0x6c, 0x0c, 0x5c, 0xc9, 0xb3, 0x51, 0x9b, 0x8f, 0x3f, 0x21, 0x28, 0x67, 0x17, 0x0c, 0xdb, 0x05, 0xd5, 0x0b, 0xae, 0x83, 0x41, 0xfe, @@ -587,8 +587,8 @@ var fileDescriptor_5e4b17cda6e8e927 = []byte{ 0x39, 0xbf, 0xf3, 0xed, 0x8d, 0xcd, 0xe3, 0x8e, 0x89, 0x4e, 0x3a, 0x26, 0xfa, 0xde, 0x31, 0xd1, 0xdb, 0xae, 0x59, 0x3a, 0xe9, 0x9a, 0xa5, 0xaf, 0x5d, 0xb3, 0xf4, 0xb4, 0xe6, 0xf9, 0xf1, 0x4e, 0xab, 0x6e, 0x37, 0xf8, 0x9e, 0x2e, 0xaa, 0x7e, 0x13, 0x67, 0x9d, 0xbc, 0x18, 0x04, 0x88, 0x0f, - 0x43, 0x26, 0xea, 0x13, 0xf2, 0x5f, 0xfa, 0xd6, 0xaf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x8a, 0x70, - 0x7e, 0x47, 0x77, 0x08, 0x00, 0x00, + 0x43, 0x26, 0xea, 0x13, 0xf2, 0x5f, 0xfa, 0xd6, 0xaf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xad, 0x77, + 0xa0, 0x45, 0x77, 0x08, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/revenue/v1/types/revenue.pb.go b/x/revenue/v1/types/revenue.pb.go index c312c29595..e5dc50c0c5 100644 --- a/x/revenue/v1/types/revenue.pb.go +++ b/x/revenue/v1/types/revenue.pb.go @@ -107,9 +107,9 @@ var fileDescriptor_33d087165192e447 = []byte{ 0x14, 0x25, 0x96, 0x23, 0x29, 0x66, 0x06, 0x2b, 0x16, 0x44, 0xc8, 0x40, 0x95, 0x3b, 0xb9, 0x9f, 0x78, 0x24, 0xc7, 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x13, 0x1e, 0xcb, 0x31, 0x5c, 0x78, 0x2c, 0xc7, 0x70, 0xe3, 0xb1, 0x1c, 0x43, 0x94, 0x6e, 0x7a, 0x66, 0x49, 0x46, 0x69, - 0x92, 0x5e, 0x72, 0x7e, 0xae, 0x3e, 0xc4, 0x9f, 0x10, 0xb2, 0xcc, 0xd0, 0x54, 0xbf, 0x02, 0xd9, + 0x92, 0x5e, 0x72, 0x7e, 0xae, 0x3e, 0xc4, 0x9f, 0x10, 0xb2, 0xcc, 0xd0, 0x4c, 0xbf, 0x02, 0xd9, 0xcf, 0x25, 0x95, 0x05, 0xa9, 0xc5, 0x49, 0x6c, 0x60, 0x2f, 0x1b, 0x03, 0x02, 0x00, 0x00, 0xff, - 0xff, 0xd2, 0xdf, 0xe3, 0xe3, 0x14, 0x01, 0x00, 0x00, + 0xff, 0xf5, 0xd8, 0x3d, 0xe1, 0x14, 0x01, 0x00, 0x00, } func (m *Revenue) Marshal() (dAtA []byte, err error) { diff --git a/x/revenue/v1/types/tx.pb.go b/x/revenue/v1/types/tx.pb.go index 2af700ffb4..869f125d9f 100644 --- a/x/revenue/v1/types/tx.pb.go +++ b/x/revenue/v1/types/tx.pb.go @@ -448,43 +448,43 @@ func init() { func init() { proto.RegisterFile("evmos/revenue/v1/tx.proto", fileDescriptor_2a6d23524264890a) } var fileDescriptor_2a6d23524264890a = []byte{ - // 567 bytes of a gzipped FileDescriptorProto + // 566 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x94, 0x4f, 0x6b, 0x13, 0x41, 0x14, 0xc0, 0x33, 0x4d, 0x08, 0x74, 0xfc, 0x93, 0xb8, 0x14, 0x9b, 0x2c, 0x65, 0x5b, 0x57, 0x8b, - 0x6d, 0x35, 0xbb, 0xa4, 0x62, 0x0f, 0xbd, 0x19, 0x0f, 0x9e, 0x02, 0xb2, 0xe2, 0x45, 0x84, 0x30, + 0x6d, 0x35, 0xbb, 0xa4, 0x42, 0x0e, 0xbd, 0x19, 0x0f, 0x9e, 0x02, 0xb2, 0xe2, 0x45, 0x84, 0x30, 0xdd, 0x0c, 0x93, 0x85, 0x64, 0x66, 0x99, 0x99, 0xa4, 0xcd, 0xb5, 0x67, 0x0f, 0x8a, 0x1e, 0xbc, 0x08, 0x7e, 0x04, 0x0f, 0x82, 0x5f, 0xa1, 0xc7, 0xa2, 0x17, 0x4f, 0x22, 0x89, 0xa0, 0x1f, 0x43, - 0x32, 0x33, 0xbb, 0x71, 0x93, 0xd8, 0x7a, 0x11, 0x7a, 0x09, 0x99, 0xf7, 0x7e, 0xef, 0xbd, 0xdf, - 0x84, 0x37, 0x81, 0x55, 0x3c, 0xe8, 0x31, 0xe1, 0x73, 0x3c, 0xc0, 0xb4, 0x8f, 0xfd, 0x41, 0xdd, - 0x97, 0x47, 0x5e, 0xcc, 0x99, 0x64, 0x56, 0x59, 0xa5, 0x3c, 0x93, 0xf2, 0x06, 0x75, 0x7b, 0x35, - 0x64, 0x62, 0x42, 0xf7, 0x04, 0x99, 0x90, 0x3d, 0x41, 0x34, 0x6a, 0x57, 0x75, 0xa2, 0xa5, 0x4e, - 0xbe, 0x3e, 0x98, 0x94, 0x33, 0x37, 0x80, 0x60, 0x8a, 0x45, 0x94, 0xe4, 0x57, 0x08, 0x23, 0x4c, - 0xd7, 0x4d, 0xbe, 0x99, 0xe8, 0x1a, 0x61, 0x8c, 0x74, 0xb1, 0x8f, 0xe2, 0xc8, 0x47, 0x94, 0x32, - 0x89, 0x64, 0xc4, 0xa8, 0xa9, 0x71, 0x3f, 0x01, 0x68, 0x35, 0x05, 0x09, 0x30, 0x89, 0x84, 0xc4, - 0x3c, 0xd0, 0xbd, 0xad, 0x6d, 0x58, 0x0e, 0x19, 0x95, 0x1c, 0x85, 0xb2, 0x85, 0xda, 0x6d, 0x8e, - 0x85, 0xa8, 0x80, 0x0d, 0xb0, 0xb5, 0x1c, 0x94, 0x92, 0xf8, 0x03, 0x1d, 0x9e, 0xa0, 0x6d, 0x1c, - 0x77, 0xd9, 0x10, 0xf3, 0x14, 0x5d, 0xd2, 0x68, 0x12, 0x4f, 0xd0, 0x1a, 0xb4, 0x0e, 0x23, 0xd9, - 0x69, 0x73, 0x74, 0xf8, 0x07, 0x9c, 0x57, 0xf0, 0xb5, 0x69, 0x26, 0xc1, 0xaf, 0xc3, 0x22, 0x65, - 0x34, 0xc4, 0xa2, 0x52, 0xd8, 0xc8, 0x6f, 0x15, 0x02, 0x73, 0xda, 0x2f, 0xfc, 0x7a, 0xbf, 0x9e, - 0x73, 0xd7, 0xa0, 0x3d, 0x2f, 0x1e, 0x60, 0x11, 0x33, 0x2a, 0xb0, 0xfb, 0x0e, 0xc0, 0x72, 0x53, - 0x90, 0xa7, 0x71, 0x1b, 0x49, 0x7c, 0x91, 0x6e, 0x65, 0xec, 0x6d, 0x58, 0x99, 0xd5, 0x4b, 0xdd, - 0xa9, 0x52, 0x7f, 0x88, 0x68, 0x88, 0xbb, 0xff, 0x55, 0x3d, 0xe3, 0x92, 0x99, 0x97, 0xba, 0xbc, - 0x02, 0xb0, 0x94, 0x8a, 0x3e, 0x46, 0x1c, 0xf5, 0x84, 0xb5, 0x07, 0x97, 0x51, 0x5f, 0x76, 0x18, - 0x8f, 0xe4, 0x50, 0x4b, 0x34, 0x2a, 0x9f, 0x3f, 0xd6, 0x56, 0xcc, 0xb2, 0x9a, 0xe6, 0x4f, 0x24, - 0x8f, 0x28, 0x09, 0xa6, 0xa8, 0xb5, 0x07, 0x8b, 0xb1, 0xea, 0xa0, 0x74, 0x2e, 0xed, 0x56, 0xbc, - 0xd9, 0x67, 0xe1, 0xe9, 0x09, 0x8d, 0xc2, 0xc9, 0xb7, 0xf5, 0x5c, 0x60, 0xe8, 0xfd, 0xab, 0xc7, - 0x3f, 0x3f, 0xec, 0x4c, 0xfb, 0xb8, 0x55, 0xb8, 0x3a, 0xa3, 0x94, 0xe8, 0xee, 0xbe, 0x2d, 0xc0, - 0x7c, 0x53, 0x10, 0xeb, 0x0d, 0x80, 0xa5, 0xd9, 0x9d, 0xbe, 0x35, 0x3f, 0x6e, 0x7e, 0x81, 0xec, - 0xbb, 0xff, 0x42, 0xa5, 0x3f, 0x4f, 0xed, 0xf8, 0xcb, 0x8f, 0xd7, 0x4b, 0xb7, 0xdd, 0x4d, 0x7f, - 0xc1, 0xe3, 0xf7, 0xb9, 0xa9, 0x6a, 0x99, 0xb0, 0xf5, 0x02, 0xc0, 0x2b, 0xd9, 0x95, 0x74, 0x17, - 0x8e, 0xcb, 0x30, 0xf6, 0xce, 0xf9, 0x4c, 0x2a, 0x74, 0x47, 0x09, 0x6d, 0xba, 0x37, 0x17, 0x0a, - 0xf5, 0x55, 0x4d, 0x46, 0x27, 0xbb, 0x66, 0x8b, 0x75, 0x32, 0xcc, 0x5f, 0x74, 0x16, 0xaf, 0xcf, - 0xd9, 0x3a, 0xa1, 0xaa, 0x49, 0x75, 0x9e, 0xc3, 0xcb, 0x99, 0x3d, 0xbb, 0x71, 0xc6, 0xbd, 0x35, - 0x62, 0x6f, 0x9f, 0x8b, 0x24, 0x2a, 0x8d, 0x47, 0x27, 0x23, 0x07, 0x9c, 0x8e, 0x1c, 0xf0, 0x7d, - 0xe4, 0x80, 0x97, 0x63, 0x27, 0x77, 0x3a, 0x76, 0x72, 0x5f, 0xc7, 0x4e, 0xee, 0x59, 0x8d, 0x44, - 0xb2, 0xd3, 0x3f, 0xf0, 0x42, 0xd6, 0x33, 0x9a, 0xfa, 0x73, 0x50, 0xbf, 0xef, 0x1f, 0x65, 0x94, - 0x87, 0x31, 0x16, 0x07, 0x45, 0xf5, 0xcf, 0x79, 0xef, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0x73, - 0x16, 0x33, 0x54, 0xf0, 0x05, 0x00, 0x00, + 0x32, 0x33, 0xbb, 0x71, 0x93, 0xd8, 0x7a, 0x11, 0xbc, 0x84, 0xcc, 0x7b, 0xbf, 0xf7, 0xde, 0x6f, + 0xc2, 0x9b, 0xc0, 0x2a, 0x1e, 0xf6, 0x99, 0xf0, 0x39, 0x1e, 0x62, 0x3a, 0xc0, 0xfe, 0xb0, 0xee, + 0xcb, 0x63, 0x2f, 0xe6, 0x4c, 0x32, 0xab, 0xac, 0x52, 0x9e, 0x49, 0x79, 0xc3, 0xba, 0xbd, 0x1e, + 0x32, 0x31, 0xa5, 0xfb, 0x82, 0x4c, 0xc9, 0xbe, 0x20, 0x1a, 0xb5, 0xab, 0x3a, 0xd1, 0x56, 0x27, + 0x5f, 0x1f, 0x4c, 0xca, 0x59, 0x18, 0x40, 0x30, 0xc5, 0x22, 0x4a, 0xf2, 0x6b, 0x84, 0x11, 0xa6, + 0xeb, 0xa6, 0xdf, 0x4c, 0x74, 0x83, 0x30, 0x46, 0x7a, 0xd8, 0x47, 0x71, 0xe4, 0x23, 0x4a, 0x99, + 0x44, 0x32, 0x62, 0xd4, 0xd4, 0xb8, 0x1f, 0x01, 0xb4, 0x5a, 0x82, 0x04, 0x98, 0x44, 0x42, 0x62, + 0x1e, 0xe8, 0xde, 0xd6, 0x2e, 0x2c, 0x87, 0x8c, 0x4a, 0x8e, 0x42, 0xd9, 0x46, 0x9d, 0x0e, 0xc7, + 0x42, 0x54, 0xc0, 0x16, 0xd8, 0x59, 0x0d, 0x4a, 0x49, 0xfc, 0xbe, 0x0e, 0x4f, 0xd1, 0x0e, 0x8e, + 0x7b, 0x6c, 0x84, 0x79, 0x8a, 0xae, 0x68, 0x34, 0x89, 0x27, 0x68, 0x0d, 0x5a, 0x47, 0x91, 0xec, + 0x76, 0x38, 0x3a, 0xfa, 0x0d, 0xce, 0x2b, 0xf8, 0xda, 0x2c, 0x93, 0xe0, 0xd7, 0x61, 0x91, 0x32, + 0x1a, 0x62, 0x51, 0x29, 0x6c, 0xe5, 0x77, 0x0a, 0x81, 0x39, 0x1d, 0x14, 0x7e, 0xbe, 0xdb, 0xcc, + 0xb9, 0x1b, 0xd0, 0x5e, 0x14, 0x0f, 0xb0, 0x88, 0x19, 0x15, 0xd8, 0x7d, 0x0b, 0x60, 0xb9, 0x25, + 0xc8, 0x93, 0xb8, 0x83, 0x24, 0xfe, 0x9f, 0x6e, 0x65, 0xec, 0x6d, 0x58, 0x99, 0xd7, 0x4b, 0xdd, + 0xa9, 0x52, 0x7f, 0x80, 0x68, 0x88, 0x7b, 0xff, 0x54, 0x3d, 0xe3, 0x92, 0x99, 0x97, 0xba, 0xbc, + 0x04, 0xb0, 0x94, 0x8a, 0x3e, 0x42, 0x1c, 0xf5, 0x85, 0xd5, 0x80, 0xab, 0x68, 0x20, 0xbb, 0x8c, + 0x47, 0x72, 0xa4, 0x25, 0x9a, 0x95, 0x4f, 0x1f, 0x6a, 0x6b, 0x66, 0x59, 0x4d, 0xf3, 0xc7, 0x92, + 0x47, 0x94, 0x04, 0x33, 0xd4, 0x6a, 0xc0, 0x62, 0xac, 0x3a, 0x28, 0x9d, 0x4b, 0xfb, 0x15, 0x6f, + 0xfe, 0x59, 0x78, 0x7a, 0x42, 0xb3, 0x70, 0xfa, 0x75, 0x33, 0x17, 0x18, 0xfa, 0xe0, 0xea, 0xc9, + 0x8f, 0xf7, 0x7b, 0xb3, 0x3e, 0x6e, 0x15, 0xae, 0xcf, 0x29, 0x25, 0xba, 0xfb, 0x6f, 0x0a, 0x30, + 0xdf, 0x12, 0xc4, 0x7a, 0x0d, 0x60, 0x69, 0x7e, 0xa7, 0x6f, 0x2d, 0x8e, 0x5b, 0x5c, 0x20, 0xfb, + 0xee, 0xdf, 0x50, 0xe9, 0xcf, 0x53, 0x3b, 0xf9, 0xfc, 0xfd, 0xd5, 0xca, 0x6d, 0x77, 0xdb, 0x5f, + 0xf2, 0xf8, 0x7d, 0x6e, 0xaa, 0xda, 0x26, 0x6c, 0x3d, 0x07, 0xf0, 0x4a, 0x76, 0x25, 0xdd, 0xa5, + 0xe3, 0x32, 0x8c, 0xbd, 0x77, 0x31, 0x93, 0x0a, 0xdd, 0x51, 0x42, 0xdb, 0xee, 0xcd, 0xa5, 0x42, + 0x03, 0x55, 0x93, 0xd1, 0xc9, 0xae, 0xd9, 0x72, 0x9d, 0x0c, 0xf3, 0x07, 0x9d, 0xe5, 0xeb, 0x73, + 0xbe, 0x4e, 0xa8, 0x6a, 0x52, 0x9d, 0x67, 0xf0, 0x72, 0x66, 0xcf, 0x6e, 0x9c, 0x73, 0x6f, 0x8d, + 0xd8, 0xbb, 0x17, 0x22, 0x89, 0x4a, 0xf3, 0xe1, 0xe9, 0xd8, 0x01, 0x67, 0x63, 0x07, 0x7c, 0x1b, + 0x3b, 0xe0, 0xc5, 0xc4, 0xc9, 0x9d, 0x4d, 0x9c, 0xdc, 0x97, 0x89, 0x93, 0x7b, 0x5a, 0x23, 0x91, + 0xec, 0x0e, 0x0e, 0xbd, 0x90, 0xf5, 0x8d, 0xa6, 0xfe, 0x1c, 0xd6, 0x1b, 0xfe, 0x71, 0x46, 0x79, + 0x14, 0x63, 0x71, 0x58, 0x54, 0xff, 0x9c, 0xf7, 0x7e, 0x05, 0x00, 0x00, 0xff, 0xff, 0x54, 0x11, + 0xed, 0x56, 0xf0, 0x05, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/vesting/migrations/types/vesting.pb.go b/x/vesting/migrations/types/vesting.pb.go index def6d0fc73..fd3ba3d4d3 100644 --- a/x/vesting/migrations/types/vesting.pb.go +++ b/x/vesting/migrations/types/vesting.pb.go @@ -87,33 +87,33 @@ func init() { proto.RegisterFile("evmos/vesting/v1/vesting.proto", fileDescripto var fileDescriptor_5f1a3c86c0cebe5f = []byte{ // 421 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x52, 0x41, 0x6f, 0xd3, 0x30, - 0x14, 0x8e, 0x59, 0x41, 0x9b, 0xa7, 0x15, 0x14, 0x4d, 0x28, 0xea, 0xc1, 0xa9, 0x10, 0x48, 0x15, - 0x12, 0xb6, 0x3a, 0xb4, 0x03, 0xdc, 0x9a, 0xfd, 0x00, 0x50, 0x84, 0x38, 0x70, 0x89, 0xec, 0xc4, - 0xcb, 0xa2, 0x36, 0x71, 0x14, 0x3b, 0x61, 0xfc, 0x83, 0x69, 0xa7, 0x1d, 0x39, 0xf6, 0xcc, 0x2f, - 0xe9, 0xb1, 0x47, 0x4e, 0x2d, 0x6a, 0xff, 0x08, 0x8a, 0xed, 0x54, 0x2d, 0x88, 0x2b, 0xa7, 0xbc, - 0xf7, 0x3d, 0xbf, 0xf7, 0x7d, 0x5f, 0xde, 0x83, 0x88, 0x37, 0xb9, 0x90, 0xa4, 0xe1, 0x52, 0x65, - 0x45, 0x4a, 0x9a, 0x71, 0x17, 0xe2, 0xb2, 0x12, 0x4a, 0xb8, 0xcf, 0x74, 0x1d, 0x77, 0x60, 0x33, - 0x1e, 0xbc, 0x8c, 0x85, 0x3c, 0x6c, 0x61, 0x5c, 0xd1, 0x3f, 0xfa, 0x06, 0xe7, 0xa9, 0x48, 0x85, - 0x0e, 0x49, 0x1b, 0x59, 0xd4, 0x4f, 0x85, 0x48, 0x67, 0x9c, 0xe8, 0x8c, 0xd5, 0xd7, 0x44, 0x65, - 0x39, 0x97, 0x8a, 0xe6, 0xa5, 0x79, 0xf0, 0xe2, 0xbe, 0x07, 0x9f, 0x5f, 0xcd, 0xe8, 0x57, 0x46, - 0xe3, 0xe9, 0x67, 0x33, 0x70, 0x12, 0xc7, 0xa2, 0x2e, 0x94, 0xcb, 0xe0, 0x39, 0xa3, 0x92, 0x47, - 0x96, 0x27, 0xa2, 0x06, 0xf7, 0xc0, 0x10, 0x8c, 0x4e, 0x2f, 0x5e, 0x63, 0x23, 0x6b, 0x4f, 0xa9, - 0x96, 0x85, 0x03, 0x2a, 0xf9, 0xe1, 0xa4, 0xa0, 0xb7, 0x5c, 0xf9, 0x20, 0x74, 0xd9, 0x5f, 0x15, - 0xf7, 0x15, 0xec, 0x5f, 0xd7, 0x45, 0xc2, 0xab, 0x88, 0x26, 0x49, 0xc5, 0xa5, 0xf4, 0x1e, 0x0d, - 0xc1, 0xe8, 0x24, 0x3c, 0x33, 0xe8, 0xc4, 0x80, 0xee, 0x15, 0x84, 0x52, 0xd1, 0x4a, 0x45, 0xad, - 0x7c, 0xef, 0x48, 0x0b, 0x18, 0x60, 0xe3, 0x0d, 0x77, 0xde, 0xf0, 0xa7, 0xce, 0x5b, 0x70, 0xbc, - 0x58, 0xf9, 0xce, 0xc3, 0xda, 0x07, 0xe1, 0x89, 0xee, 0x6b, 0x2b, 0xee, 0x1d, 0x80, 0xfd, 0x99, - 0x88, 0xa7, 0x75, 0x19, 0x95, 0xbc, 0xca, 0x44, 0x22, 0xbd, 0xde, 0xf0, 0x68, 0x74, 0x7a, 0x81, - 0xfe, 0x65, 0xe5, 0xa3, 0x7e, 0x16, 0x4c, 0xda, 0x69, 0x3f, 0xd6, 0xfe, 0xbb, 0x34, 0x53, 0x37, - 0x35, 0xc3, 0xb1, 0xc8, 0x89, 0xdd, 0x89, 0xf9, 0xbc, 0x91, 0xc9, 0x94, 0xdc, 0x12, 0x5a, 0xab, - 0x9b, 0xdd, 0x96, 0xd4, 0xb7, 0x92, 0x4b, 0x3b, 0x41, 0x86, 0x67, 0x86, 0xd8, 0xa6, 0xee, 0x3d, - 0x80, 0x4f, 0xbb, 0xdf, 0xda, 0x69, 0x79, 0xfc, 0xbf, 0xb4, 0xf4, 0x2d, 0x6c, 0xf3, 0xf7, 0xc7, - 0x77, 0x73, 0xdf, 0xf9, 0x3e, 0xf7, 0x9d, 0xe0, 0xc3, 0x62, 0x83, 0xc0, 0x72, 0x83, 0xc0, 0xaf, - 0x0d, 0x02, 0x0f, 0x5b, 0xe4, 0x2c, 0xb7, 0xc8, 0xf9, 0xb9, 0x45, 0xce, 0x97, 0xcb, 0x3d, 0x3a, - 0x73, 0xc0, 0xf6, 0x8c, 0xc7, 0x97, 0xe4, 0x76, 0xc7, 0x93, 0x67, 0x69, 0x45, 0x55, 0x26, 0x0a, - 0x69, 0x28, 0xd9, 0x13, 0xbd, 0x9b, 0xb7, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0xa7, 0x5b, 0x31, - 0x03, 0xf5, 0x02, 0x00, 0x00, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x52, 0xc1, 0x8e, 0xd3, 0x30, + 0x10, 0x8d, 0xd9, 0x82, 0x76, 0xbd, 0xda, 0x82, 0xa2, 0x15, 0x8a, 0x7a, 0x70, 0x2a, 0x04, 0x52, + 0x85, 0x84, 0xad, 0x2e, 0x02, 0x09, 0x6e, 0xcd, 0x7e, 0x00, 0x28, 0x42, 0x1c, 0xb8, 0x44, 0x76, + 0xe2, 0xcd, 0x46, 0x6d, 0xe2, 0x28, 0x76, 0xc2, 0xf2, 0x07, 0xab, 0x3d, 0xed, 0x91, 0x63, 0xcf, + 0x7c, 0x49, 0x8f, 0x3d, 0x72, 0x6a, 0x51, 0xfb, 0x23, 0x28, 0xb6, 0x53, 0xb5, 0x20, 0xae, 0x9c, + 0x32, 0xf3, 0xc6, 0x33, 0xef, 0xbd, 0xcc, 0x40, 0xc4, 0x9b, 0x5c, 0x48, 0xd2, 0x70, 0xa9, 0xb2, + 0x22, 0x25, 0xcd, 0xb8, 0x0b, 0x71, 0x59, 0x09, 0x25, 0xdc, 0x27, 0xba, 0x8e, 0x3b, 0xb0, 0x19, + 0x0f, 0x9e, 0xc7, 0x42, 0x1e, 0xb6, 0x30, 0xae, 0xe8, 0x1f, 0x7d, 0x83, 0xf3, 0x54, 0xa4, 0x42, + 0x87, 0xa4, 0x8d, 0x2c, 0xea, 0xa7, 0x42, 0xa4, 0x33, 0x4e, 0x74, 0xc6, 0xea, 0x2b, 0xa2, 0xb2, + 0x9c, 0x4b, 0x45, 0xf3, 0xd2, 0x3c, 0x78, 0x76, 0xd7, 0x83, 0x4f, 0x2f, 0x67, 0xf4, 0x2b, 0xa3, + 0xf1, 0xf4, 0xb3, 0x19, 0x38, 0x89, 0x63, 0x51, 0x17, 0xca, 0x65, 0xf0, 0x9c, 0x51, 0xc9, 0x23, + 0xcb, 0x13, 0x51, 0x83, 0x7b, 0x60, 0x08, 0x46, 0xa7, 0x17, 0x2f, 0xb1, 0x91, 0xb5, 0xa7, 0x54, + 0xcb, 0xc2, 0x01, 0x95, 0xfc, 0x70, 0x52, 0xd0, 0x5b, 0xae, 0x7c, 0x10, 0xba, 0xec, 0xaf, 0x8a, + 0xfb, 0x02, 0xf6, 0xaf, 0xea, 0x22, 0xe1, 0x55, 0x44, 0x93, 0xa4, 0xe2, 0x52, 0x7a, 0x0f, 0x86, + 0x60, 0x74, 0x12, 0x9e, 0x19, 0x74, 0x62, 0x40, 0xf7, 0x12, 0x42, 0xa9, 0x68, 0xa5, 0xa2, 0x56, + 0xbe, 0x77, 0xa4, 0x05, 0x0c, 0xb0, 0xf1, 0x86, 0x3b, 0x6f, 0xf8, 0x53, 0xe7, 0x2d, 0x38, 0x5e, + 0xac, 0x7c, 0xe7, 0x7e, 0xed, 0x83, 0xf0, 0x44, 0xf7, 0xb5, 0x15, 0xf7, 0x16, 0xc0, 0xfe, 0x4c, + 0xc4, 0xd3, 0xba, 0x8c, 0x4a, 0x5e, 0x65, 0x22, 0x91, 0x5e, 0x6f, 0x78, 0x34, 0x3a, 0xbd, 0x40, + 0xff, 0xb2, 0xf2, 0x51, 0x3f, 0x0b, 0x26, 0xed, 0xb4, 0x1f, 0x6b, 0xff, 0x5d, 0x9a, 0xa9, 0xeb, + 0x9a, 0xe1, 0x58, 0xe4, 0xc4, 0xee, 0xc4, 0x7c, 0x5e, 0xc9, 0x64, 0x4a, 0x6e, 0x08, 0xad, 0xd5, + 0xf5, 0x6e, 0x4b, 0xea, 0x5b, 0xc9, 0xa5, 0x9d, 0x20, 0xc3, 0x33, 0x43, 0x6c, 0x53, 0xf7, 0x0e, + 0xc0, 0xc7, 0xdd, 0x6f, 0xed, 0xb4, 0x3c, 0xfc, 0x5f, 0x5a, 0xfa, 0x16, 0xb6, 0xf9, 0xfb, 0xe3, + 0xdb, 0xb9, 0xef, 0x7c, 0x9f, 0xfb, 0x4e, 0xf0, 0x61, 0xb1, 0x41, 0x60, 0xb9, 0x41, 0xe0, 0xd7, + 0x06, 0x81, 0xfb, 0x2d, 0x72, 0x96, 0x5b, 0xe4, 0xfc, 0xdc, 0x22, 0xe7, 0xcb, 0x9b, 0x3d, 0x3a, + 0x73, 0xc0, 0xf6, 0x8c, 0xc7, 0x6f, 0xc9, 0xcd, 0x8e, 0x27, 0xcf, 0xd2, 0x8a, 0xaa, 0x4c, 0x14, + 0xd2, 0x50, 0xb2, 0x47, 0x7a, 0x37, 0xaf, 0x7f, 0x07, 0x00, 0x00, 0xff, 0xff, 0x59, 0x20, 0xd1, + 0x67, 0xf5, 0x02, 0x00, 0x00, } func (m *ClawbackVestingAccount) Marshal() (dAtA []byte, err error) { diff --git a/x/vesting/types/events.pb.go b/x/vesting/types/events.pb.go index d2dc69e8eb..bb1a30e79b 100644 --- a/x/vesting/types/events.pb.go +++ b/x/vesting/types/events.pb.go @@ -289,27 +289,27 @@ func init() { func init() { proto.RegisterFile("evmos/vesting/v2/events.proto", fileDescriptor_7a6fa6478193a613) } var fileDescriptor_7a6fa6478193a613 = []byte{ - // 318 bytes of a gzipped FileDescriptorProto + // 317 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x92, 0xcf, 0x4a, 0x33, 0x31, 0x14, 0xc5, 0x3b, 0xdf, 0x47, 0x2b, 0xbd, 0xe2, 0x1f, 0x06, 0xd1, 0xd9, 0x74, 0xa8, 0xdd, 0x28, - 0x2e, 0x66, 0xb0, 0xe2, 0x03, 0x68, 0xb5, 0x0f, 0x20, 0xea, 0xc2, 0x4d, 0x49, 0x33, 0xd7, 0x1a, - 0xea, 0x24, 0x65, 0x72, 0x27, 0xd5, 0xa7, 0xd0, 0xc7, 0x72, 0xd9, 0xa5, 0x4b, 0xe9, 0xbc, 0x88, - 0x98, 0x44, 0xb1, 0x50, 0x41, 0x97, 0x37, 0xf7, 0xe4, 0x77, 0xcf, 0x81, 0x03, 0x2d, 0x34, 0xb9, - 0xd2, 0xa9, 0x41, 0x4d, 0x42, 0x8e, 0x52, 0xd3, 0x4d, 0xd1, 0xa0, 0x24, 0x9d, 0x4c, 0x0a, 0x45, - 0x2a, 0xdc, 0xb4, 0xeb, 0xc4, 0xaf, 0x13, 0xd3, 0xed, 0x64, 0xb0, 0x7b, 0xfe, 0xa1, 0xe8, 0x15, - 0xc8, 0x08, 0x7b, 0xf7, 0x6c, 0x3a, 0x64, 0x7c, 0x7c, 0xed, 0x04, 0x27, 0x9c, 0xab, 0x52, 0x52, - 0xb8, 0x0d, 0x8d, 0xdb, 0x52, 0x66, 0x58, 0x44, 0x41, 0x3b, 0xd8, 0x6f, 0x5e, 0xf8, 0x29, 0xdc, - 0x83, 0x0d, 0x8f, 0x1a, 0x30, 0x27, 0x8d, 0xfe, 0x59, 0xc1, 0xba, 0x59, 0x00, 0x74, 0x9e, 0x02, - 0xd8, 0xb1, 0x67, 0xfa, 0xa5, 0xcc, 0x7e, 0x09, 0xdf, 0x82, 0x3a, 0x57, 0x42, 0x6a, 0x8f, 0x74, - 0x43, 0xd8, 0x02, 0xd0, 0xc4, 0x0a, 0x1a, 0x90, 0xc8, 0x31, 0xfa, 0x6f, 0x57, 0x4d, 0xfb, 0x72, - 0x29, 0x72, 0x5c, 0xe6, 0xa8, 0xbe, 0xd4, 0x11, 0x87, 0x35, 0x97, 0xdb, 0x27, 0xfe, 0xd1, 0x46, - 0x04, 0x2b, 0x8b, 0xd9, 0x3e, 0xc7, 0xb0, 0x0d, 0xab, 0x99, 0x85, 0x32, 0x12, 0x4a, 0x7a, 0x2f, - 0xdf, 0x9f, 0x3a, 0x63, 0x88, 0xec, 0x91, 0xab, 0x49, 0xc6, 0x08, 0x7d, 0xee, 0xbe, 0xe3, 0xfe, - 0xfd, 0x5e, 0x0b, 0x40, 0xe2, 0x74, 0xe0, 0x7f, 0xf9, 0xe8, 0x12, 0xa7, 0x0e, 0x78, 0x7a, 0xf6, - 0x32, 0x8f, 0x83, 0xd9, 0x3c, 0x0e, 0xde, 0xe6, 0x71, 0xf0, 0x5c, 0xc5, 0xb5, 0x59, 0x15, 0xd7, - 0x5e, 0xab, 0xb8, 0x76, 0x73, 0x30, 0x12, 0x74, 0x57, 0x0e, 0x13, 0xae, 0xf2, 0xd4, 0xf5, 0xc3, - 0xb7, 0xe4, 0xf0, 0x38, 0x7d, 0xf8, 0xea, 0x0a, 0x3d, 0x4e, 0x50, 0x0f, 0x1b, 0xb6, 0x28, 0x47, - 0xef, 0x01, 0x00, 0x00, 0xff, 0xff, 0x90, 0x9f, 0x0b, 0xba, 0x49, 0x02, 0x00, 0x00, + 0x2e, 0x66, 0xb0, 0x82, 0x7b, 0xad, 0xf6, 0x01, 0x44, 0x5d, 0xb8, 0x29, 0x69, 0xe6, 0x5a, 0x43, + 0x9d, 0xa4, 0x4c, 0xee, 0xa4, 0xfa, 0x14, 0xfa, 0x58, 0x2e, 0xbb, 0x74, 0x29, 0x9d, 0x17, 0x11, + 0x93, 0x28, 0x16, 0x2a, 0xe8, 0xf2, 0xe6, 0x9e, 0xfc, 0xee, 0x39, 0x70, 0xa0, 0x85, 0x26, 0x57, + 0x3a, 0x35, 0xa8, 0x49, 0xc8, 0x51, 0x6a, 0xba, 0x29, 0x1a, 0x94, 0xa4, 0x93, 0x49, 0xa1, 0x48, + 0x85, 0x9b, 0x76, 0x9d, 0xf8, 0x75, 0x62, 0xba, 0x9d, 0x0c, 0x76, 0xcf, 0x3f, 0x14, 0xbd, 0x02, + 0x19, 0x61, 0xef, 0x9e, 0x4d, 0x87, 0x8c, 0x8f, 0xaf, 0x9d, 0xe0, 0x84, 0x73, 0x55, 0x4a, 0x0a, + 0xb7, 0xa1, 0x71, 0x5b, 0xca, 0x0c, 0x8b, 0x28, 0x68, 0x07, 0xfb, 0xcd, 0x0b, 0x3f, 0x85, 0x7b, + 0xb0, 0xe1, 0x51, 0x03, 0xe6, 0xa4, 0xd1, 0x3f, 0x2b, 0x58, 0x37, 0x0b, 0x80, 0xce, 0x53, 0x00, + 0x3b, 0xf6, 0x4c, 0xbf, 0x94, 0xd9, 0x2f, 0xe1, 0x5b, 0x50, 0xe7, 0x4a, 0x48, 0xed, 0x91, 0x6e, + 0x08, 0x5b, 0x00, 0x9a, 0x58, 0x41, 0x03, 0x12, 0x39, 0x46, 0xff, 0xed, 0xaa, 0x69, 0x5f, 0x2e, + 0x45, 0x8e, 0xcb, 0x1c, 0xd5, 0x97, 0x3a, 0xe2, 0xb0, 0xe6, 0x72, 0xfb, 0xc4, 0x3f, 0xda, 0x88, + 0x60, 0x65, 0x31, 0xdb, 0xe7, 0x18, 0xb6, 0x61, 0x35, 0xb3, 0x50, 0x46, 0x42, 0x49, 0xef, 0xe5, + 0xfb, 0x53, 0x67, 0x0c, 0x91, 0x3d, 0x72, 0x35, 0xc9, 0x18, 0xa1, 0xcf, 0xdd, 0x77, 0xdc, 0xbf, + 0xdf, 0x6b, 0x01, 0x48, 0x9c, 0x0e, 0xfc, 0x2f, 0x1f, 0x5d, 0xe2, 0xd4, 0x01, 0x4f, 0xcf, 0x5e, + 0xe6, 0x71, 0x30, 0x9b, 0xc7, 0xc1, 0xdb, 0x3c, 0x0e, 0x9e, 0xab, 0xb8, 0x36, 0xab, 0xe2, 0xda, + 0x6b, 0x15, 0xd7, 0x6e, 0x0e, 0x46, 0x82, 0xee, 0xca, 0x61, 0xc2, 0x55, 0x9e, 0xba, 0x7e, 0xf8, + 0x96, 0x1c, 0x1e, 0xa7, 0x0f, 0x5f, 0x5d, 0xa1, 0xc7, 0x09, 0xea, 0x61, 0xc3, 0x16, 0xe5, 0xe8, + 0x3d, 0x00, 0x00, 0xff, 0xff, 0xc3, 0x29, 0xe6, 0x8f, 0x49, 0x02, 0x00, 0x00, } func (m *EventCreateClawbackVestingAccount) Marshal() (dAtA []byte, err error) { diff --git a/x/vesting/types/query.pb.go b/x/vesting/types/query.pb.go index 90f0de1769..ad0032f7ea 100644 --- a/x/vesting/types/query.pb.go +++ b/x/vesting/types/query.pb.go @@ -153,28 +153,28 @@ var fileDescriptor_e31744b0ce27e85a = []byte{ // 383 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x52, 0xc1, 0x4e, 0xea, 0x40, 0x14, 0xed, 0x40, 0x1e, 0x8f, 0x37, 0x6f, 0xf3, 0xd2, 0xf0, 0x92, 0x3e, 0x42, 0x0a, 0x21, 0x2f, - 0x48, 0x8c, 0xce, 0x40, 0x8d, 0x3f, 0x80, 0xfe, 0x80, 0x2c, 0xdd, 0x4d, 0xdb, 0x49, 0x6d, 0x80, - 0xb9, 0x85, 0x99, 0x36, 0x12, 0xe3, 0xc6, 0x9d, 0x3b, 0x13, 0xfe, 0xc2, 0x2f, 0x21, 0xae, 0x48, - 0xdc, 0xb8, 0x52, 0x03, 0x7e, 0x88, 0x69, 0x3b, 0x10, 0x83, 0x26, 0x6e, 0x74, 0xd5, 0xdb, 0xb9, - 0xf7, 0x9c, 0x7b, 0xcf, 0x3d, 0x17, 0xd7, 0x78, 0x32, 0x02, 0x49, 0x13, 0x2e, 0x55, 0x28, 0x02, - 0x9a, 0x38, 0x74, 0x1c, 0xf3, 0xc9, 0x94, 0x44, 0x13, 0x50, 0x60, 0xfe, 0xc9, 0xb2, 0x44, 0x67, - 0x49, 0xe2, 0x54, 0x6d, 0x0f, 0x64, 0x0a, 0x70, 0x99, 0xe4, 0x34, 0xe9, 0xba, 0x5c, 0xb1, 0x2e, - 0xf5, 0x20, 0x14, 0x39, 0xa2, 0x5a, 0x09, 0x20, 0x80, 0x2c, 0xa4, 0x69, 0xa4, 0x5f, 0x6b, 0x01, - 0x40, 0x30, 0xe4, 0x94, 0x45, 0x21, 0x65, 0x42, 0x80, 0x62, 0x2a, 0x04, 0x21, 0xf3, 0x6c, 0xb3, - 0x83, 0x2b, 0x27, 0x69, 0xd3, 0x1e, 0x1b, 0x32, 0xe1, 0x71, 0xd9, 0xe7, 0xe3, 0x98, 0x4b, 0x65, - 0x5a, 0xf8, 0x27, 0xf3, 0xfd, 0x09, 0x97, 0xd2, 0x42, 0x0d, 0xd4, 0xfe, 0xd5, 0x5f, 0xff, 0x36, - 0xef, 0x0a, 0xf8, 0xef, 0x16, 0x44, 0x46, 0x20, 0x24, 0x37, 0x3d, 0x5c, 0x1a, 0x82, 0x37, 0xe0, - 0xbe, 0x85, 0x1a, 0xc5, 0xf6, 0x6f, 0xe7, 0x1f, 0xc9, 0x07, 0x26, 0xe9, 0xc0, 0x44, 0x0f, 0x4c, - 0x8e, 0x20, 0x14, 0xbd, 0xce, 0xfc, 0xb1, 0x6e, 0xdc, 0x3e, 0xd5, 0xdb, 0x41, 0xa8, 0xce, 0x62, - 0x97, 0x78, 0x30, 0xa2, 0x5a, 0x5d, 0xfe, 0xd9, 0x97, 0xfe, 0x80, 0xaa, 0x69, 0xc4, 0x65, 0x06, - 0x90, 0x7d, 0x4d, 0x6d, 0x06, 0xb8, 0x1c, 0x8b, 0x74, 0x29, 0xdc, 0xb7, 0x0a, 0x5f, 0xdf, 0x66, - 0x43, 0x9e, 0xaa, 0xd1, 0x6d, 0x8a, 0xdf, 0xa0, 0x26, 0xa7, 0x76, 0x66, 0x08, 0xff, 0xc8, 0x96, - 0x69, 0x5e, 0x23, 0x5c, 0x5e, 0x6f, 0xd4, 0x6c, 0x91, 0x6d, 0xf3, 0xc9, 0x47, 0x2e, 0x55, 0x77, - 0x3e, 0xad, 0xcb, 0xad, 0x69, 0xee, 0x5d, 0xdd, 0xbf, 0xcc, 0x0a, 0x2d, 0xf3, 0x3f, 0x7d, 0x77, - 0x73, 0xae, 0xae, 0xa5, 0x17, 0xda, 0xe1, 0xcb, 0xde, 0xf1, 0x7c, 0x69, 0xa3, 0xc5, 0xd2, 0x46, - 0xcf, 0x4b, 0x1b, 0xdd, 0xac, 0x6c, 0x63, 0xb1, 0xb2, 0x8d, 0x87, 0x95, 0x6d, 0x9c, 0xee, 0xbe, - 0x51, 0x98, 0x33, 0x69, 0xbe, 0xee, 0x21, 0x3d, 0xdf, 0xb0, 0x66, 0x4a, 0xdd, 0x52, 0x76, 0x61, - 0x07, 0xaf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x0c, 0x4b, 0xbb, 0xd9, 0xe7, 0x02, 0x00, 0x00, + 0x48, 0x8c, 0xce, 0x40, 0x4d, 0xfc, 0x00, 0xf4, 0x07, 0x64, 0xe9, 0x6e, 0xda, 0x4e, 0x6a, 0x03, + 0xcc, 0x2d, 0xcc, 0xb4, 0x91, 0x18, 0x37, 0xee, 0xdc, 0x99, 0xf0, 0x17, 0x7e, 0x09, 0x71, 0x45, + 0xe2, 0xc6, 0x95, 0x1a, 0xf0, 0x43, 0x4c, 0xdb, 0x81, 0x18, 0x34, 0x71, 0xa3, 0xab, 0xde, 0xce, + 0xbd, 0xe7, 0xdc, 0x7b, 0xee, 0xb9, 0xb8, 0xc6, 0x93, 0x11, 0x48, 0x9a, 0x70, 0xa9, 0x42, 0x11, + 0xd0, 0xc4, 0xa1, 0xe3, 0x98, 0x4f, 0xa6, 0x24, 0x9a, 0x80, 0x02, 0xf3, 0x4f, 0x96, 0x25, 0x3a, + 0x4b, 0x12, 0xa7, 0x6a, 0x7b, 0x20, 0x53, 0x80, 0xcb, 0x24, 0xa7, 0x49, 0xd7, 0xe5, 0x8a, 0x75, + 0xa9, 0x07, 0xa1, 0xc8, 0x11, 0xd5, 0x4a, 0x00, 0x01, 0x64, 0x21, 0x4d, 0x23, 0xfd, 0x5a, 0x0b, + 0x00, 0x82, 0x21, 0xa7, 0x2c, 0x0a, 0x29, 0x13, 0x02, 0x14, 0x53, 0x21, 0x08, 0x99, 0x67, 0x9b, + 0x1d, 0x5c, 0x39, 0x49, 0x9b, 0xf6, 0xd8, 0x90, 0x09, 0x8f, 0xcb, 0x3e, 0x1f, 0xc7, 0x5c, 0x2a, + 0xd3, 0xc2, 0x3f, 0x99, 0xef, 0x4f, 0xb8, 0x94, 0x16, 0x6a, 0xa0, 0xf6, 0xaf, 0xfe, 0xfa, 0xb7, + 0x79, 0x57, 0xc0, 0x7f, 0xb7, 0x20, 0x32, 0x02, 0x21, 0xb9, 0xe9, 0xe1, 0xd2, 0x10, 0xbc, 0x01, + 0xf7, 0x2d, 0xd4, 0x28, 0xb6, 0x7f, 0x3b, 0xff, 0x48, 0x3e, 0x30, 0x49, 0x07, 0x26, 0x7a, 0x60, + 0x72, 0x04, 0xa1, 0xe8, 0x75, 0xe6, 0x8f, 0x75, 0xe3, 0xf6, 0xa9, 0xde, 0x0e, 0x42, 0x75, 0x16, + 0xbb, 0xc4, 0x83, 0x11, 0xd5, 0xea, 0xf2, 0xcf, 0xbe, 0xf4, 0x07, 0x54, 0x4d, 0x23, 0x2e, 0x33, + 0x80, 0xec, 0x6b, 0x6a, 0x33, 0xc0, 0xe5, 0x58, 0xa4, 0x4b, 0xe1, 0xbe, 0x55, 0xf8, 0xfa, 0x36, + 0x1b, 0xf2, 0x54, 0x8d, 0x6e, 0x53, 0xfc, 0x06, 0x35, 0x39, 0xb5, 0x33, 0x43, 0xf8, 0x47, 0xb6, + 0x4c, 0xf3, 0x1a, 0xe1, 0xf2, 0x7a, 0xa3, 0x66, 0x8b, 0x6c, 0x9b, 0x4f, 0x3e, 0x72, 0xa9, 0xba, + 0xf3, 0x69, 0x5d, 0x6e, 0x4d, 0x73, 0xef, 0xea, 0xfe, 0x65, 0x56, 0x68, 0x99, 0xff, 0xe9, 0xbb, + 0x9b, 0x73, 0x75, 0x2d, 0xbd, 0xd0, 0x0e, 0x5f, 0xf6, 0x8e, 0xe7, 0x4b, 0x1b, 0x2d, 0x96, 0x36, + 0x7a, 0x5e, 0xda, 0xe8, 0x66, 0x65, 0x1b, 0x8b, 0x95, 0x6d, 0x3c, 0xac, 0x6c, 0xe3, 0x74, 0xf7, + 0x8d, 0xc2, 0x9c, 0x49, 0xf3, 0x75, 0x0f, 0xe9, 0xf9, 0x86, 0x35, 0x53, 0xea, 0x96, 0xb2, 0x0b, + 0x3b, 0x78, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x5f, 0xfd, 0x56, 0xec, 0xe7, 0x02, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/vesting/types/tx.pb.go b/x/vesting/types/tx.pb.go index 6ce6ee905d..1fd8b6b634 100644 --- a/x/vesting/types/tx.pb.go +++ b/x/vesting/types/tx.pb.go @@ -583,57 +583,57 @@ var fileDescriptor_a372bb0b868e4c86 = []byte{ // 848 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x55, 0xbf, 0x6f, 0x23, 0x45, 0x14, 0xf6, 0x9c, 0xb9, 0x53, 0x6e, 0xcc, 0x85, 0x63, 0xcd, 0x81, 0x6f, 0x75, 0xd9, 0x35, 0x16, - 0x51, 0x7c, 0x26, 0xec, 0x9c, 0xcd, 0x81, 0x74, 0x11, 0x4d, 0x6c, 0x14, 0x2a, 0x4b, 0xc8, 0x02, - 0x0a, 0x1a, 0x6b, 0xbc, 0x3b, 0xd9, 0xac, 0x62, 0xef, 0xac, 0x3c, 0xb3, 0x6b, 0xd3, 0xa6, 0x42, - 0x54, 0x91, 0x10, 0x3d, 0x14, 0x34, 0x20, 0x24, 0x7a, 0xfe, 0x00, 0x22, 0xaa, 0x48, 0x34, 0xd0, - 0x10, 0x94, 0x20, 0xc1, 0x9f, 0x81, 0xe6, 0xc7, 0x6e, 0x82, 0x33, 0x24, 0x4e, 0x01, 0x95, 0xbd, - 0xf3, 0xbe, 0xf7, 0xde, 0x37, 0xdf, 0xfb, 0x31, 0xf0, 0x21, 0xc9, 0x26, 0x94, 0xa1, 0x8c, 0x30, - 0x1e, 0xc5, 0x21, 0xca, 0x3a, 0x88, 0xcf, 0xbd, 0x64, 0x4a, 0x39, 0xb5, 0xee, 0x4b, 0x93, 0xa7, - 0x4d, 0x5e, 0xd6, 0xb1, 0x1d, 0x9f, 0x32, 0x81, 0x1e, 0x61, 0x46, 0x50, 0xd6, 0x1e, 0x11, 0x8e, - 0xdb, 0xc8, 0xa7, 0x51, 0xac, 0x3c, 0xec, 0x57, 0xb4, 0x7d, 0xc2, 0x42, 0x94, 0xb5, 0xc5, 0x8f, - 0x36, 0xbc, 0xa6, 0x0d, 0x45, 0x1a, 0xed, 0x9b, 0xc7, 0x56, 0xa8, 0x97, 0x42, 0x1a, 0x52, 0xf9, - 0x17, 0x89, 0x7f, 0xfa, 0xf4, 0x51, 0x48, 0x69, 0x38, 0x26, 0x08, 0x27, 0x11, 0xc2, 0x71, 0x4c, - 0x39, 0xe6, 0x11, 0x8d, 0x99, 0xb6, 0xba, 0xda, 0x2a, 0xbf, 0x46, 0xe9, 0x2e, 0xe2, 0xd1, 0x84, - 0x30, 0x8e, 0x27, 0x89, 0x02, 0x34, 0x7e, 0x00, 0xd0, 0xed, 0xb3, 0xb0, 0x37, 0x25, 0x98, 0x93, - 0xde, 0x18, 0xcf, 0x46, 0xd8, 0xdf, 0xff, 0x48, 0xe5, 0xdd, 0xf6, 0x7d, 0x9a, 0xc6, 0xdc, 0x5a, - 0x87, 0xab, 0xbb, 0x69, 0x1c, 0x90, 0xe9, 0x10, 0x07, 0xc1, 0x94, 0x30, 0x56, 0x03, 0x75, 0xd0, - 0xbc, 0x3b, 0xb8, 0xa7, 0x4e, 0xb7, 0xd5, 0xa1, 0xb5, 0x01, 0x5f, 0xd0, 0x84, 0x0b, 0xdc, 0x2d, - 0x89, 0x5b, 0xd5, 0xc7, 0x39, 0xd0, 0x83, 0x55, 0x12, 0xe3, 0xd1, 0x98, 0x0c, 0x43, 0x9a, 0x0d, - 0x7d, 0x9d, 0xb4, 0x56, 0xae, 0x83, 0xe6, 0xca, 0xe0, 0x45, 0x65, 0x7a, 0x8f, 0x66, 0x39, 0x9b, - 0xad, 0xda, 0x5f, 0x5f, 0xba, 0xa5, 0x83, 0x3f, 0xbf, 0x6f, 0x2d, 0xc6, 0x6f, 0x3c, 0x86, 0x1b, - 0xd7, 0x90, 0x1f, 0x10, 0x96, 0xd0, 0x98, 0x91, 0xc6, 0xaf, 0x65, 0xf8, 0xa0, 0xcf, 0xc2, 0x9d, - 0x34, 0x0e, 0xfe, 0xe3, 0xeb, 0xf5, 0x20, 0x64, 0x1c, 0x4f, 0xf9, 0x50, 0x68, 0x2d, 0x6f, 0x55, - 0xe9, 0xd8, 0x9e, 0x2a, 0x84, 0x97, 0x17, 0xc2, 0xfb, 0x20, 0x2f, 0x44, 0x77, 0xe5, 0xe8, 0x37, - 0xb7, 0x74, 0x78, 0xe2, 0x82, 0xc1, 0x5d, 0xe9, 0x27, 0x2c, 0xd6, 0xa7, 0x00, 0xae, 0x8e, 0xa9, - 0xbf, 0x9f, 0x26, 0xc3, 0x84, 0x4c, 0x23, 0x1a, 0xb0, 0xda, 0x73, 0xf5, 0x72, 0xb3, 0xd2, 0x71, - 0x3c, 0xd5, 0x2c, 0xe7, 0x8d, 0xa7, 0x9a, 0xc5, 0x7b, 0x5f, 0xc2, 0xba, 0xdb, 0x22, 0xda, 0x37, - 0x27, 0xee, 0xb3, 0x30, 0xe2, 0x7b, 0xe9, 0xc8, 0xf3, 0xe9, 0x04, 0xe9, 0xf6, 0x52, 0x3f, 0x6f, - 0xb0, 0x60, 0x1f, 0xcd, 0x11, 0x4e, 0xf9, 0x5e, 0xd1, 0x70, 0xfc, 0x93, 0x84, 0x30, 0x1d, 0x81, - 0x0d, 0xee, 0xa9, 0xc4, 0xfa, 0xd3, 0xfa, 0x0c, 0x9c, 0xdf, 0x3c, 0xe7, 0x72, 0xfb, 0xff, 0xe2, - 0x92, 0x8b, 0xab, 0xbf, 0xb7, 0xaa, 0xa2, 0x0f, 0x16, 0xea, 0xd5, 0x70, 0xe1, 0x9a, 0xb1, 0xb4, - 0x45, 0xf1, 0xbf, 0x00, 0xb0, 0x22, 0x1a, 0x45, 0xb7, 0xc8, 0x0d, 0x4a, 0x8e, 0x55, 0xa4, 0xc5, - 0x92, 0xeb, 0xe3, 0x1c, 0xf8, 0x2a, 0x7c, 0x3e, 0x20, 0xec, 0x1c, 0x55, 0x96, 0xa8, 0x8a, 0x38, - 0xd3, 0x10, 0x33, 0xf1, 0x39, 0xac, 0x5e, 0xa0, 0x95, 0xd3, 0xb5, 0x30, 0xbc, 0x2d, 0xd6, 0x86, - 0x60, 0x25, 0x64, 0x7e, 0x98, 0xcb, 0x2c, 0x16, 0x4b, 0xa1, 0x71, 0x8f, 0x46, 0x71, 0xf7, 0x89, - 0x56, 0xb8, 0x79, 0xa5, 0xc2, 0x4a, 0x52, 0xe1, 0xc0, 0x06, 0x2a, 0x72, 0xe3, 0x5b, 0x00, 0x5f, - 0xee, 0xb3, 0xf0, 0xc3, 0x24, 0xc0, 0x9c, 0x68, 0xd5, 0x76, 0x24, 0xb9, 0x65, 0xc5, 0xd9, 0x84, - 0x56, 0x4c, 0x66, 0xc3, 0x05, 0xa8, 0xd2, 0xe7, 0x7e, 0x4c, 0x66, 0x3b, 0xd7, 0x4d, 0x4f, 0xd9, - 0x34, 0x3d, 0x66, 0x9d, 0xea, 0xd0, 0x31, 0x93, 0x2d, 0x2a, 0xdc, 0x83, 0x35, 0xa1, 0x24, 0x8d, - 0x33, 0x32, 0xe5, 0x0b, 0x03, 0x6e, 0xc8, 0x0d, 0x4c, 0xb9, 0x1b, 0x0d, 0x58, 0xff, 0xb7, 0x20, - 0x79, 0xa2, 0xce, 0x8f, 0x77, 0x60, 0xb9, 0xcf, 0x42, 0xeb, 0x27, 0x00, 0x1f, 0x5d, 0xb9, 0x35, - 0xdb, 0xde, 0xe2, 0x03, 0xe1, 0x5d, 0xb3, 0xab, 0xec, 0x67, 0x37, 0x76, 0x29, 0xee, 0xff, 0xce, - 0xc1, 0xcf, 0x7f, 0x7c, 0x7e, 0xeb, 0x6d, 0xeb, 0x29, 0x32, 0xbc, 0x58, 0xc8, 0x97, 0x21, 0x8a, - 0x55, 0x3b, 0x2c, 0xe4, 0xd0, 0x5c, 0xbf, 0x02, 0xd0, 0x32, 0x6c, 0xc6, 0x0d, 0x23, 0x9f, 0xcb, - 0x40, 0x1b, 0x2d, 0x09, 0x2c, 0xe8, 0xb6, 0x25, 0xdd, 0xd7, 0xad, 0xc7, 0x46, 0xba, 0xa2, 0xfa, - 0x97, 0x38, 0xce, 0xe0, 0x4a, 0x31, 0xbf, 0x6b, 0x66, 0xa1, 0xb4, 0xd9, 0x5e, 0xbf, 0xd2, 0x5c, - 0x90, 0x58, 0x97, 0x24, 0x5c, 0x6b, 0xcd, 0xac, 0x59, 0x9e, 0xec, 0x6b, 0x00, 0xab, 0xa6, 0x39, - 0x69, 0x1a, 0xb3, 0x18, 0x90, 0xf6, 0x93, 0x65, 0x91, 0x05, 0xb5, 0x8e, 0xa4, 0xb6, 0x69, 0xb5, - 0x8c, 0xd4, 0x52, 0xe9, 0x59, 0x28, 0xa4, 0x86, 0xc5, 0xfa, 0x0e, 0xc0, 0x07, 0xe6, 0x01, 0x68, - 0x99, 0xf5, 0x30, 0x61, 0xed, 0xce, 0xf2, 0xd8, 0x82, 0xed, 0x53, 0xc9, 0xd6, 0xb3, 0x36, 0xcd, - 0x42, 0x2a, 0xdf, 0xc5, 0x82, 0x76, 0xdf, 0x3d, 0x3a, 0x75, 0xc0, 0xf1, 0xa9, 0x03, 0x7e, 0x3f, - 0x75, 0xc0, 0xe1, 0x99, 0x53, 0x3a, 0x3e, 0x73, 0x4a, 0xbf, 0x9c, 0x39, 0xa5, 0x8f, 0x5b, 0x17, - 0xb6, 0x99, 0x8a, 0xa8, 0xe3, 0xb6, 0xdf, 0x42, 0xf3, 0x7f, 0x3e, 0x14, 0xa3, 0x3b, 0xf2, 0x45, - 0x7d, 0xf3, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfb, 0x59, 0xff, 0x11, 0xaa, 0x09, 0x00, 0x00, + 0x51, 0x7c, 0x26, 0xec, 0x9c, 0xcd, 0xe9, 0xa4, 0x8b, 0x68, 0x62, 0xa3, 0x50, 0x59, 0x42, 0x16, + 0x50, 0xd0, 0x58, 0xe3, 0xdd, 0xc9, 0x66, 0x15, 0x7b, 0x67, 0xe5, 0x99, 0x5d, 0x9b, 0x36, 0x15, + 0xa2, 0x8a, 0x84, 0xe8, 0xa1, 0xa0, 0x01, 0x21, 0xd1, 0xf3, 0x07, 0x10, 0x51, 0x45, 0xa2, 0x81, + 0x86, 0xa0, 0x04, 0x09, 0xfe, 0x0c, 0x34, 0x3f, 0x76, 0x13, 0x9c, 0x21, 0x71, 0x0a, 0xa8, 0xec, + 0x9d, 0xf7, 0xbd, 0xf7, 0xbe, 0xf9, 0xde, 0x8f, 0x81, 0x0f, 0x49, 0x36, 0xa1, 0x0c, 0x65, 0x84, + 0xf1, 0x28, 0x0e, 0x51, 0xd6, 0x41, 0x7c, 0xee, 0x25, 0x53, 0xca, 0xa9, 0x75, 0x5f, 0x9a, 0x3c, + 0x6d, 0xf2, 0xb2, 0x8e, 0xed, 0xf8, 0x94, 0x09, 0xf4, 0x08, 0x33, 0x82, 0xb2, 0xf6, 0x88, 0x70, + 0xdc, 0x46, 0x3e, 0x8d, 0x62, 0xe5, 0x61, 0xbf, 0xa6, 0xed, 0x13, 0x16, 0xa2, 0xac, 0x2d, 0x7e, + 0xb4, 0xe1, 0x0d, 0x6d, 0x28, 0xd2, 0x68, 0xdf, 0x3c, 0xb6, 0x42, 0xbd, 0x12, 0xd2, 0x90, 0xca, + 0xbf, 0x48, 0xfc, 0xd3, 0xa7, 0x8f, 0x42, 0x4a, 0xc3, 0x31, 0x41, 0x38, 0x89, 0x10, 0x8e, 0x63, + 0xca, 0x31, 0x8f, 0x68, 0xcc, 0xb4, 0xd5, 0xd5, 0x56, 0xf9, 0x35, 0x4a, 0x77, 0x11, 0x8f, 0x26, + 0x84, 0x71, 0x3c, 0x49, 0x14, 0xa0, 0xf1, 0x03, 0x80, 0x6e, 0x9f, 0x85, 0xbd, 0x29, 0xc1, 0x9c, + 0xf4, 0xc6, 0x78, 0x36, 0xc2, 0xfe, 0xfe, 0x47, 0x2a, 0xef, 0xb6, 0xef, 0xd3, 0x34, 0xe6, 0xd6, + 0x3a, 0x5c, 0xdd, 0x4d, 0xe3, 0x80, 0x4c, 0x87, 0x38, 0x08, 0xa6, 0x84, 0xb1, 0x1a, 0xa8, 0x83, + 0xe6, 0xdd, 0xc1, 0x3d, 0x75, 0xba, 0xad, 0x0e, 0xad, 0x0d, 0xf8, 0x92, 0x26, 0x5c, 0xe0, 0x6e, + 0x49, 0xdc, 0xaa, 0x3e, 0xce, 0x81, 0x1e, 0xac, 0x92, 0x18, 0x8f, 0xc6, 0x64, 0x18, 0xd2, 0x6c, + 0xe8, 0xeb, 0xa4, 0xb5, 0x72, 0x1d, 0x34, 0x57, 0x06, 0x2f, 0x2b, 0xd3, 0x7b, 0x34, 0xcb, 0xd9, + 0x6c, 0xd5, 0xfe, 0xfa, 0xd2, 0x2d, 0x1d, 0xfc, 0xf9, 0x7d, 0x6b, 0x31, 0x7e, 0xe3, 0x31, 0xdc, + 0xb8, 0x86, 0xfc, 0x80, 0xb0, 0x84, 0xc6, 0x8c, 0x34, 0x7e, 0x2d, 0xc3, 0x07, 0x7d, 0x16, 0xee, + 0xa4, 0x71, 0xf0, 0x1f, 0x5f, 0xaf, 0x07, 0x21, 0xe3, 0x78, 0xca, 0x87, 0x42, 0x6b, 0x79, 0xab, + 0x4a, 0xc7, 0xf6, 0x54, 0x21, 0xbc, 0xbc, 0x10, 0xde, 0x07, 0x79, 0x21, 0xba, 0x2b, 0x47, 0xbf, + 0xb9, 0xa5, 0xc3, 0x13, 0x17, 0x0c, 0xee, 0x4a, 0x3f, 0x61, 0xb1, 0x3e, 0x05, 0x70, 0x75, 0x4c, + 0xfd, 0xfd, 0x34, 0x19, 0x26, 0x64, 0x1a, 0xd1, 0x80, 0xd5, 0x5e, 0xa8, 0x97, 0x9b, 0x95, 0x8e, + 0xe3, 0xa9, 0x66, 0x39, 0x6f, 0x3c, 0xd5, 0x2c, 0xde, 0xfb, 0x12, 0xd6, 0xdd, 0x16, 0xd1, 0xbe, + 0x39, 0x71, 0x9f, 0x87, 0x11, 0xdf, 0x4b, 0x47, 0x9e, 0x4f, 0x27, 0x48, 0xb7, 0x97, 0xfa, 0x79, + 0x8b, 0x05, 0xfb, 0x68, 0x8e, 0x70, 0xca, 0xf7, 0x8a, 0x86, 0xe3, 0x9f, 0x24, 0x84, 0xe9, 0x08, + 0x6c, 0x70, 0x4f, 0x25, 0xd6, 0x9f, 0xd6, 0x67, 0xe0, 0xfc, 0xe6, 0x39, 0x97, 0xdb, 0xff, 0x17, + 0x97, 0x5c, 0x5c, 0xfd, 0xbd, 0x55, 0x15, 0x7d, 0xb0, 0x50, 0xaf, 0x86, 0x0b, 0xd7, 0x8c, 0xa5, + 0x2d, 0x8a, 0xff, 0x05, 0x80, 0x15, 0xd1, 0x28, 0xba, 0x45, 0x6e, 0x50, 0x72, 0xac, 0x22, 0x2d, + 0x96, 0x5c, 0x1f, 0xe7, 0xc0, 0xd7, 0xe1, 0x8b, 0x01, 0x61, 0xe7, 0xa8, 0xb2, 0x44, 0x55, 0xc4, + 0x99, 0x86, 0x98, 0x89, 0xcf, 0x61, 0xf5, 0x02, 0xad, 0x9c, 0xae, 0x85, 0xe1, 0x6d, 0xb1, 0x36, + 0x04, 0x2b, 0x21, 0xf3, 0xc3, 0x5c, 0x66, 0xb1, 0x58, 0x0a, 0x8d, 0x7b, 0x34, 0x8a, 0xbb, 0x4f, + 0xb4, 0xc2, 0xcd, 0x2b, 0x15, 0x56, 0x92, 0x0a, 0x07, 0x36, 0x50, 0x91, 0x1b, 0xdf, 0x02, 0xf8, + 0x6a, 0x9f, 0x85, 0x1f, 0x26, 0x01, 0xe6, 0x44, 0xab, 0xb6, 0x23, 0xc9, 0x2d, 0x2b, 0xce, 0x26, + 0xb4, 0x62, 0x32, 0x1b, 0x2e, 0x40, 0x95, 0x3e, 0xf7, 0x63, 0x32, 0xdb, 0xb9, 0x6e, 0x7a, 0xca, + 0xa6, 0xe9, 0x31, 0xeb, 0x54, 0x87, 0x8e, 0x99, 0x6c, 0x51, 0xe1, 0x1e, 0xac, 0x09, 0x25, 0x69, + 0x9c, 0x91, 0x29, 0x5f, 0x18, 0x70, 0x43, 0x6e, 0x60, 0xca, 0xdd, 0x68, 0xc0, 0xfa, 0xbf, 0x05, + 0xc9, 0x13, 0x75, 0x7e, 0xbc, 0x03, 0xcb, 0x7d, 0x16, 0x5a, 0x3f, 0x01, 0xf8, 0xe8, 0xca, 0xad, + 0xd9, 0xf6, 0x16, 0x1f, 0x08, 0xef, 0x9a, 0x5d, 0x65, 0x3f, 0xbf, 0xb1, 0x4b, 0x71, 0xff, 0x77, + 0x0e, 0x7e, 0xfe, 0xe3, 0xf3, 0x5b, 0xcf, 0xac, 0xa7, 0xc8, 0xf0, 0x62, 0x21, 0x5f, 0x86, 0x28, + 0x56, 0xed, 0xb0, 0x90, 0x43, 0x73, 0xfd, 0x0a, 0x40, 0xcb, 0xb0, 0x19, 0x37, 0x8c, 0x7c, 0x2e, + 0x03, 0x6d, 0xb4, 0x24, 0xb0, 0xa0, 0xdb, 0x96, 0x74, 0xdf, 0xb4, 0x1e, 0x1b, 0xe9, 0x8a, 0xea, + 0x5f, 0xe2, 0x38, 0x83, 0x2b, 0xc5, 0xfc, 0xae, 0x99, 0x85, 0xd2, 0x66, 0x7b, 0xfd, 0x4a, 0x73, + 0x41, 0x62, 0x5d, 0x92, 0x70, 0xad, 0x35, 0xb3, 0x66, 0x79, 0xb2, 0xaf, 0x01, 0xac, 0x9a, 0xe6, + 0xa4, 0x69, 0xcc, 0x62, 0x40, 0xda, 0x4f, 0x96, 0x45, 0x16, 0xd4, 0x3a, 0x92, 0xda, 0xa6, 0xd5, + 0x32, 0x52, 0x4b, 0xa5, 0x67, 0xa1, 0x90, 0x1a, 0x16, 0xeb, 0x3b, 0x00, 0x1f, 0x98, 0x07, 0xa0, + 0x65, 0xd6, 0xc3, 0x84, 0xb5, 0x3b, 0xcb, 0x63, 0x0b, 0xb6, 0x4f, 0x25, 0x5b, 0xcf, 0xda, 0x34, + 0x0b, 0xa9, 0x7c, 0x17, 0x0b, 0xda, 0x7d, 0xf7, 0xe8, 0xd4, 0x01, 0xc7, 0xa7, 0x0e, 0xf8, 0xfd, + 0xd4, 0x01, 0x87, 0x67, 0x4e, 0xe9, 0xf8, 0xcc, 0x29, 0xfd, 0x72, 0xe6, 0x94, 0x3e, 0x6e, 0x5d, + 0xd8, 0x66, 0x2a, 0xa2, 0x8e, 0xdb, 0x7e, 0x86, 0xe6, 0xff, 0x7c, 0x28, 0x46, 0x77, 0xe4, 0x8b, + 0xfa, 0xf6, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xa8, 0xef, 0x12, 0x24, 0xaa, 0x09, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/vesting/types/vesting.pb.go b/x/vesting/types/vesting.pb.go index 9d5c6a66ed..a847f4c5dd 100644 --- a/x/vesting/types/vesting.pb.go +++ b/x/vesting/types/vesting.pb.go @@ -166,37 +166,37 @@ func init() { proto.RegisterFile("evmos/vesting/v2/vesting.proto", fileDescripto var fileDescriptor_0001d894a8ee0c72 = []byte{ // 488 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x53, 0x3f, 0x6f, 0xd3, 0x40, - 0x14, 0xf7, 0x11, 0x17, 0x9a, 0x8b, 0x1a, 0xaa, 0x23, 0x42, 0x56, 0x06, 0x3b, 0xaa, 0x40, 0x8a, - 0x2a, 0xe1, 0x53, 0x82, 0x18, 0xe8, 0x16, 0x97, 0x0f, 0x50, 0x59, 0x88, 0x81, 0xc5, 0x3a, 0xdb, - 0x57, 0xd7, 0x8a, 0x93, 0xb3, 0x7c, 0xe7, 0x50, 0xbe, 0x41, 0xd5, 0xa9, 0x23, 0x12, 0x4b, 0x66, - 0x3e, 0x49, 0xc7, 0x8c, 0x4c, 0x2d, 0x4a, 0x16, 0x3e, 0x06, 0xf2, 0xfd, 0x29, 0x89, 0x10, 0x6b, - 0xa7, 0x7b, 0xef, 0xf7, 0xfe, 0xdc, 0xef, 0xbd, 0xdf, 0x1d, 0x74, 0xe9, 0x62, 0xc6, 0x38, 0x5e, - 0x50, 0x2e, 0xf2, 0x79, 0x86, 0x17, 0x63, 0x63, 0xfa, 0x65, 0xc5, 0x04, 0x43, 0x87, 0x32, 0xee, - 0x1b, 0x70, 0x31, 0xee, 0xbf, 0x4a, 0x18, 0xdf, 0x29, 0x19, 0xc5, 0x54, 0x90, 0xd1, 0x6e, 0x5d, - 0xbf, 0x97, 0xb1, 0x8c, 0x49, 0x13, 0x37, 0x96, 0x46, 0xbd, 0x8c, 0xb1, 0xac, 0xa0, 0x58, 0x7a, - 0x71, 0x7d, 0x8e, 0x45, 0x3e, 0xa3, 0x5c, 0x90, 0x59, 0xa9, 0x12, 0x8e, 0xae, 0x6d, 0xf8, 0xf2, - 0xb4, 0x20, 0x5f, 0x62, 0x92, 0x4c, 0x3f, 0xa9, 0x86, 0x93, 0x24, 0x61, 0xf5, 0x5c, 0xa0, 0x18, - 0xf6, 0x62, 0xc2, 0x69, 0xa4, 0xef, 0x89, 0x88, 0xc2, 0x1d, 0x30, 0x00, 0xc3, 0xce, 0xf8, 0xd8, - 0x57, 0xb4, 0xfe, 0x32, 0x55, 0xb4, 0xfc, 0x80, 0x70, 0xba, 0xdb, 0x29, 0xb0, 0x57, 0x77, 0x1e, - 0x08, 0x51, 0xfc, 0x4f, 0x04, 0xbd, 0x86, 0xdd, 0xf3, 0x7a, 0x9e, 0xd2, 0x2a, 0x22, 0x69, 0x5a, - 0x51, 0xce, 0x9d, 0x27, 0x03, 0x30, 0x6c, 0x87, 0x07, 0x0a, 0x9d, 0x28, 0x10, 0x9d, 0x42, 0xc8, - 0x05, 0xa9, 0x44, 0xd4, 0xd0, 0x77, 0x5a, 0x92, 0x40, 0xdf, 0x57, 0xb3, 0xf9, 0x66, 0x36, 0xff, - 0xa3, 0x99, 0x2d, 0xd8, 0xbf, 0xbd, 0xf3, 0xac, 0x9b, 0x7b, 0x0f, 0x84, 0x6d, 0x59, 0xd7, 0x44, - 0xd0, 0x15, 0x80, 0xdd, 0x82, 0x25, 0xd3, 0xba, 0x8c, 0x4a, 0x5a, 0xe5, 0x2c, 0xe5, 0x8e, 0x3d, - 0x68, 0x0d, 0x3b, 0x63, 0xf7, 0x7f, 0xa3, 0x9c, 0xc9, 0xb4, 0x60, 0xd2, 0x74, 0xfb, 0x71, 0xef, - 0xbd, 0xcf, 0x72, 0x71, 0x51, 0xc7, 0x7e, 0xc2, 0x66, 0x58, 0x6b, 0xa2, 0x8e, 0x37, 0x3c, 0x9d, - 0xe2, 0x4b, 0x4c, 0x6a, 0x71, 0xf1, 0xa0, 0x92, 0xf8, 0x5a, 0x52, 0xae, 0x3b, 0xf0, 0xf0, 0x40, - 0x5d, 0xac, 0x5d, 0x74, 0x0d, 0xe0, 0x73, 0xb3, 0x56, 0xc3, 0x65, 0xef, 0xb1, 0xb8, 0x74, 0x35, - 0xac, 0xfd, 0x93, 0xfd, 0xab, 0xa5, 0x67, 0x7d, 0x5b, 0x7a, 0xd6, 0xd1, 0x77, 0x00, 0x0f, 0xcd, - 0x63, 0x38, 0xab, 0x58, 0xc9, 0x38, 0x29, 0x50, 0x0f, 0xee, 0x89, 0x5c, 0x14, 0x54, 0xea, 0xde, - 0x0e, 0x95, 0x83, 0x06, 0xb0, 0x93, 0x52, 0x9e, 0x54, 0x79, 0x29, 0x72, 0x36, 0xd7, 0xaa, 0x6d, - 0x43, 0xc8, 0x81, 0xcf, 0x8c, 0xa6, 0x2d, 0x19, 0x35, 0x2e, 0xc2, 0xf0, 0x45, 0x2a, 0x29, 0x90, - 0x26, 0xf1, 0x41, 0x79, 0x5b, 0x66, 0xa1, 0xad, 0x90, 0x96, 0xff, 0xc4, 0xfe, 0xbd, 0xf4, 0xac, - 0xe0, 0xc3, 0xed, 0xda, 0x05, 0xab, 0xb5, 0x0b, 0x7e, 0xad, 0x5d, 0x70, 0xb3, 0x71, 0xad, 0xd5, - 0xc6, 0xb5, 0x7e, 0x6e, 0x5c, 0xeb, 0xf3, 0xf1, 0xd6, 0x32, 0xd4, 0xf7, 0xd2, 0x9f, 0x6c, 0xf4, - 0x0e, 0x5f, 0xee, 0x6e, 0x21, 0x7e, 0x2a, 0x9f, 0xcb, 0xdb, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, - 0xa9, 0x3c, 0xc6, 0xe9, 0x88, 0x03, 0x00, 0x00, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x53, 0x3f, 0x6b, 0xdb, 0x40, + 0x14, 0xd7, 0xd5, 0x4a, 0x1b, 0x9f, 0x89, 0x1b, 0xae, 0xa6, 0x08, 0x0f, 0x92, 0x09, 0x2d, 0x98, + 0x40, 0x75, 0xd8, 0x85, 0x42, 0xb3, 0x59, 0xe9, 0x07, 0x08, 0xa2, 0x74, 0xe8, 0x22, 0x4e, 0xd2, + 0x45, 0x11, 0x96, 0x7d, 0x42, 0x77, 0x72, 0xd3, 0x6f, 0x10, 0x32, 0x65, 0x2c, 0x74, 0xf1, 0xdc, + 0x4f, 0x92, 0xd1, 0x63, 0xa7, 0xa4, 0xd8, 0x4b, 0x3f, 0x46, 0xd1, 0xfd, 0x49, 0x6d, 0x4a, 0xd7, + 0x4c, 0xf7, 0xde, 0xef, 0xfd, 0xb9, 0xdf, 0x7b, 0xbf, 0x3b, 0xe8, 0xd2, 0xc5, 0x8c, 0x71, 0xbc, + 0xa0, 0x5c, 0xe4, 0xf3, 0x0c, 0x2f, 0xc6, 0xc6, 0xf4, 0xcb, 0x8a, 0x09, 0x86, 0x0e, 0x65, 0xdc, + 0x37, 0xe0, 0x62, 0xdc, 0x7f, 0x95, 0x30, 0xbe, 0x53, 0x32, 0x8a, 0xa9, 0x20, 0xa3, 0xdd, 0xba, + 0x7e, 0x2f, 0x63, 0x19, 0x93, 0x26, 0x6e, 0x2c, 0x8d, 0x7a, 0x19, 0x63, 0x59, 0x41, 0xb1, 0xf4, + 0xe2, 0xfa, 0x1c, 0x8b, 0x7c, 0x46, 0xb9, 0x20, 0xb3, 0x52, 0x25, 0x1c, 0x5d, 0xdb, 0xf0, 0xe5, + 0x69, 0x41, 0xbe, 0xc4, 0x24, 0x99, 0x7e, 0x52, 0x0d, 0x27, 0x49, 0xc2, 0xea, 0xb9, 0x40, 0x31, + 0xec, 0xc5, 0x84, 0xd3, 0x48, 0xdf, 0x13, 0x11, 0x85, 0x3b, 0x60, 0x00, 0x86, 0x9d, 0xf1, 0xb1, + 0xaf, 0x68, 0xfd, 0x65, 0xaa, 0x68, 0xf9, 0x01, 0xe1, 0x74, 0xb7, 0x53, 0x60, 0xaf, 0xee, 0x3c, + 0x10, 0xa2, 0xf8, 0x9f, 0x08, 0x7a, 0x0d, 0xbb, 0xe7, 0xf5, 0x3c, 0xa5, 0x55, 0x44, 0xd2, 0xb4, + 0xa2, 0x9c, 0x3b, 0x4f, 0x06, 0x60, 0xd8, 0x0e, 0x0f, 0x14, 0x3a, 0x51, 0x20, 0x3a, 0x85, 0x90, + 0x0b, 0x52, 0x89, 0xa8, 0xa1, 0xef, 0xb4, 0x24, 0x81, 0xbe, 0xaf, 0x66, 0xf3, 0xcd, 0x6c, 0xfe, + 0x47, 0x33, 0x5b, 0xb0, 0x7f, 0x7b, 0xe7, 0x59, 0x37, 0xf7, 0x1e, 0x08, 0xdb, 0xb2, 0xae, 0x89, + 0xa0, 0x2b, 0x00, 0xbb, 0x05, 0x4b, 0xa6, 0x75, 0x19, 0x95, 0xb4, 0xca, 0x59, 0xca, 0x1d, 0x7b, + 0xd0, 0x1a, 0x76, 0xc6, 0xee, 0xff, 0x46, 0x39, 0x93, 0x69, 0xc1, 0xa4, 0xe9, 0xf6, 0xe3, 0xde, + 0x7b, 0x9f, 0xe5, 0xe2, 0xa2, 0x8e, 0xfd, 0x84, 0xcd, 0xb0, 0xd6, 0x44, 0x1d, 0x6f, 0x78, 0x3a, + 0xc5, 0x97, 0x98, 0xd4, 0xe2, 0xe2, 0x41, 0x25, 0xf1, 0xb5, 0xa4, 0x5c, 0x77, 0xe0, 0xe1, 0x81, + 0xba, 0x58, 0xbb, 0xe8, 0x1a, 0xc0, 0xe7, 0x66, 0xad, 0x86, 0xcb, 0xde, 0x63, 0x71, 0xe9, 0x6a, + 0x58, 0xfb, 0x27, 0xfb, 0x57, 0x4b, 0xcf, 0xfa, 0xb6, 0xf4, 0xac, 0xa3, 0xef, 0x00, 0x1e, 0x9a, + 0xc7, 0x70, 0x56, 0xb1, 0x92, 0x71, 0x52, 0xa0, 0x1e, 0xdc, 0x13, 0xb9, 0x28, 0xa8, 0xd4, 0xbd, + 0x1d, 0x2a, 0x07, 0x0d, 0x60, 0x27, 0xa5, 0x3c, 0xa9, 0xf2, 0x52, 0xe4, 0x6c, 0xae, 0x55, 0xdb, + 0x86, 0x90, 0x03, 0x9f, 0x19, 0x4d, 0x5b, 0x32, 0x6a, 0x5c, 0x84, 0xe1, 0x8b, 0x54, 0x52, 0x20, + 0x4d, 0xe2, 0x83, 0xf2, 0xb6, 0xcc, 0x42, 0x5b, 0x21, 0x2d, 0xff, 0x89, 0xfd, 0x7b, 0xe9, 0x59, + 0xc1, 0x87, 0xdb, 0xb5, 0x0b, 0x56, 0x6b, 0x17, 0xfc, 0x5a, 0xbb, 0xe0, 0x66, 0xe3, 0x5a, 0xab, + 0x8d, 0x6b, 0xfd, 0xdc, 0xb8, 0xd6, 0xe7, 0xe3, 0xad, 0x65, 0xa8, 0xef, 0xa5, 0x3f, 0xd9, 0xe8, + 0x1d, 0xbe, 0xdc, 0xdd, 0x42, 0xfc, 0x54, 0x3e, 0x97, 0xb7, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, + 0xfa, 0x8a, 0x2b, 0xdc, 0x88, 0x03, 0x00, 0x00, } func (m *ClawbackVestingAccount) Marshal() (dAtA []byte, err error) { From 303aa87fc859b62645cd94e8e68bba4cba0f8a95 Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Fri, 1 Dec 2023 15:16:39 +0100 Subject: [PATCH 003/345] feat(stride,osmosis): enable stride and osmosis outposts during upgrade (#2117) * enable stride and osmosis outposts during upgrade * add changelog entry --- CHANGELOG.md | 1 + app/upgrades/v16/upgrades.go | 12 +++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dbe4408ce6..4364da4a1d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -133,6 +133,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (osmosis-outpost) [#2077](https://github.com/evmos/evmos/pull/2077) Update Osmosis outpost to use cross-chain swap contract V1. - (app) [#2104](https://github.com/evmos/evmos/pull/2104) Refactor code to use `sdkmath.Int` and `sdkmath.LegacyDec` instead of the SDK types - (p256-precompile) [#2110](https://github.com/evmos/evmos/pull/2110) Adjust `p256` precompile address. +- (upgrade) [#2117](https://github.com/evmos/evmos/pull/2117) Enable Stride and Osmosis outposts in v16 upgrade handler. ### Bug Fixes diff --git a/app/upgrades/v16/upgrades.go b/app/upgrades/v16/upgrades.go index af5735da43..4345ce1908 100644 --- a/app/upgrades/v16/upgrades.go +++ b/app/upgrades/v16/upgrades.go @@ -7,6 +7,8 @@ import ( "github.com/cosmos/cosmos-sdk/types/module" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" + osmosisoutpost "github.com/evmos/evmos/v16/precompiles/outposts/osmosis" + strideoutpost "github.com/evmos/evmos/v16/precompiles/outposts/stride" "github.com/evmos/evmos/v16/precompiles/p256" "github.com/evmos/evmos/v16/utils" evmkeeper "github.com/evmos/evmos/v16/x/evm/keeper" @@ -24,14 +26,22 @@ func CreateUpgradeHandler( return func(ctx sdk.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { logger := ctx.Logger().With("upgrade", UpgradeName) - p256Address := p256.Precompile{}.Address() // enable secp256r1 precompile on testnet if utils.IsTestnet(ctx.ChainID()) { + p256Address := p256.Precompile{}.Address() + if err := ek.EnablePrecompiles(ctx, p256Address); err != nil { logger.Error("failed to enable precompiles", "error", err.Error()) } } + // enable stride and osmosis outposts + strideAddress := strideoutpost.Precompile{}.Address() + osmosisAddress := osmosisoutpost.Precompile{}.Address() + if err := ek.EnablePrecompiles(ctx, strideAddress, osmosisAddress); err != nil { + logger.Error("failed to enable outposts", "error", err.Error()) + } + if err := BurnUsageIncentivesPool(ctx, bankKeeper); err != nil { logger.Error("failed to burn inflation pool", "error", err.Error()) } From 7761a2551083ef6edf459f30f685277379aeeffb Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Fri, 1 Dec 2023 20:00:01 +0100 Subject: [PATCH 004/345] chore(osmosis): add osmosis outpost to available EVM extensions (#2109) * adjust call signature to match other precompiles * add osmosis outpost to available extensions * update channel ID for osmosis outpost * adjust expected gas values * add changelog entry --- CHANGELOG.md | 1 + precompiles/outposts/osmosis/osmosis.go | 2 +- precompiles/outposts/osmosis/osmosis_test.go | 2 +- precompiles/outposts/osmosis/setup_test.go | 2 +- x/evm/keeper/grpc_query_test.go | 6 +++--- x/evm/keeper/precompiles.go | 12 ++++++++++++ x/evm/types/params.go | 1 + 7 files changed, 20 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4364da4a1d..02d1fe40cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -134,6 +134,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (app) [#2104](https://github.com/evmos/evmos/pull/2104) Refactor code to use `sdkmath.Int` and `sdkmath.LegacyDec` instead of the SDK types - (p256-precompile) [#2110](https://github.com/evmos/evmos/pull/2110) Adjust `p256` precompile address. - (upgrade) [#2117](https://github.com/evmos/evmos/pull/2117) Enable Stride and Osmosis outposts in v16 upgrade handler. +- (osmosis-outpost) [#2109](https://github.com/evmos/evmos/pull/2109) Add Osmosis outpost to available EVM extensions. ### Bug Fixes diff --git a/precompiles/outposts/osmosis/osmosis.go b/precompiles/outposts/osmosis/osmosis.go index 84ec3b486a..74ee0d6a7e 100644 --- a/precompiles/outposts/osmosis/osmosis.go +++ b/precompiles/outposts/osmosis/osmosis.go @@ -66,9 +66,9 @@ type Precompile struct { // NewPrecompile creates a new Osmosis outpost Precompile instance as a // PrecompiledContract interface. func NewPrecompile( - authzKeeper authzkeeper.Keeper, portID, channelID string, osmosisXCSContract string, + authzKeeper authzkeeper.Keeper, bankKeeper bankkeeper.Keeper, transferKeeper transferkeeper.Keeper, stakingKeeper stakingkeeper.Keeper, diff --git a/precompiles/outposts/osmosis/osmosis_test.go b/precompiles/outposts/osmosis/osmosis_test.go index b7230dec7a..2ad404f7c2 100644 --- a/precompiles/outposts/osmosis/osmosis_test.go +++ b/precompiles/outposts/osmosis/osmosis_test.go @@ -55,10 +55,10 @@ func TestNewPrecompile(t *testing.T) { t.Run(tc.name, func(t *testing.T) { _, err := osmosis.NewPrecompile( - unitNetwork.App.AuthzKeeper, portID, channelID, tc.contractAddress, + unitNetwork.App.AuthzKeeper, unitNetwork.App.BankKeeper, unitNetwork.App.TransferKeeper, unitNetwork.App.StakingKeeper, diff --git a/precompiles/outposts/osmosis/setup_test.go b/precompiles/outposts/osmosis/setup_test.go index c41fe6ce9c..c53db336de 100644 --- a/precompiles/outposts/osmosis/setup_test.go +++ b/precompiles/outposts/osmosis/setup_test.go @@ -39,10 +39,10 @@ func (s *PrecompileTestSuite) SetupTest() { ) precompile, err := osmosis.NewPrecompile( - unitNetwork.App.AuthzKeeper, PortID, ChannelID, osmosis.XCSContractTestnet, + unitNetwork.App.AuthzKeeper, unitNetwork.App.BankKeeper, unitNetwork.App.TransferKeeper, unitNetwork.App.StakingKeeper, diff --git a/x/evm/keeper/grpc_query_test.go b/x/evm/keeper/grpc_query_test.go index 372c1d469e..9a9f1d3869 100644 --- a/x/evm/keeper/grpc_query_test.go +++ b/x/evm/keeper/grpc_query_test.go @@ -25,10 +25,10 @@ import ( const invalidAddress = "0x0000" // expGasConsumed is the gas consumed in traceTx setup (GetProposerAddr + CalculateBaseFee) -const expGasConsumed = 7568 +const expGasConsumed = 7700 // expGasConsumedWithFeeMkt is the gas consumed in traceTx setup (GetProposerAddr + CalculateBaseFee) with enabled feemarket -const expGasConsumedWithFeeMkt = 7562 +const expGasConsumedWithFeeMkt = 7694 func (suite *KeeperTestSuite) TestQueryAccount() { var ( @@ -937,7 +937,7 @@ func (suite *KeeperTestSuite) TestTraceTx() { }, expPass: true, traceResponse: "{\"gas\":34828,\"failed\":false,\"returnValue\":\"0000000000000000000000000000000000000000000000000000000000000001\",\"structLogs\":[{\"pc\":0,\"op\":\"PUSH1\",\"gas\":", - expFinalGas: 28124, // gas consumed in traceTx setup (GetProposerAddr + CalculateBaseFee) + gas consumed in malleate func + expFinalGas: 29708, // gas consumed in traceTx setup (GetProposerAddr + CalculateBaseFee) + gas consumed in malleate func }, { msg: "invalid chain id", diff --git a/x/evm/keeper/precompiles.go b/x/evm/keeper/precompiles.go index 701ee6b889..b0aa3202a6 100644 --- a/x/evm/keeper/precompiles.go +++ b/x/evm/keeper/precompiles.go @@ -25,6 +25,7 @@ import ( bankprecompile "github.com/evmos/evmos/v16/precompiles/bank" distprecompile "github.com/evmos/evmos/v16/precompiles/distribution" ics20precompile "github.com/evmos/evmos/v16/precompiles/ics20" + osmosisoutpost "github.com/evmos/evmos/v16/precompiles/outposts/osmosis" strideoutpost "github.com/evmos/evmos/v16/precompiles/outposts/stride" "github.com/evmos/evmos/v16/precompiles/p256" stakingprecompile "github.com/evmos/evmos/v16/precompiles/staking" @@ -87,6 +88,15 @@ func AvailablePrecompiles( panic(fmt.Errorf("failed to instantiate stride outpost: %w", err)) } + osmosisOutpost, err := osmosisoutpost.NewPrecompile( + transfertypes.PortID, "channel-215", + osmosisoutpost.XCSContractTestnet, + authzKeeper, bankKeeper, transferKeeper, stakingKeeper, erc20Keeper, channelKeeper, + ) + if err != nil { + panic(fmt.Errorf("failed to instantiate osmosis outpost: %w", err)) + } + // Stateless precompiles precompiles[bech32Precompile.Address()] = bech32Precompile precompiles[p256Precompile.Address()] = p256Precompile @@ -100,6 +110,8 @@ func AvailablePrecompiles( // Outposts precompiles[strideOutpost.Address()] = strideOutpost + precompiles[osmosisOutpost.Address()] = osmosisOutpost + return precompiles } diff --git a/x/evm/types/params.go b/x/evm/types/params.go index 63d74db09d..00fabca922 100644 --- a/x/evm/types/params.go +++ b/x/evm/types/params.go @@ -41,6 +41,7 @@ var ( "0x0000000000000000000000000000000000000803", // Vesting precompile "0x0000000000000000000000000000000000000804", // Bank precompile "0x0000000000000000000000000000000000000900", // Stride outpost + "0x0000000000000000000000000000000000000901", // Osmosis outpost } // DefaultExtraEIPs defines the default extra EIPs to be included // On v15, EIP 3855 was enabled From 5de9abfa3630609c8f6b7261ead6fa1e4fb37e4f Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Fri, 1 Dec 2023 21:07:14 +0100 Subject: [PATCH 005/345] imp(changelog): Changelog clean up (#2107) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * wip clean up * wip clean up 2 * add precompile suffix to make distinction between modules and precompiles clear * move some more state breaking changes to section * Update CHANGELOG.md Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> * adjust entry --------- Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> --- CHANGELOG.md | 110 ++++++++++++++++++++++++--------------------------- 1 file changed, 52 insertions(+), 58 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 02d1fe40cf..d05f4ae6a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,29 +39,23 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### State Machine Breaking +- (p256-precompile) [#1922](https://github.com/evmos/evmos/pull/1922) [EIP-7212](https://eips.ethereum.org/EIPS/eip-7212) `secp256r1` curve precompile. +- (distribution-precompile) [#1949](https://github.com/evmos/evmos/pull/1949) Add `ClaimRewards` custom transaction. +- (bech32-precompile) [#2038](https://github.com/evmos/evmos/pull/2038) Add `bech32` conversion precompile. +- (staking-precompile) [#2030](https://github.com/evmos/evmos/pull/2030) Implement the `CreateValidator` function for staking precompiled contract. +- (fees) [#1998](https://github.com/evmos/evmos/pull/1998) Restrict transaction fee tokens. +- (staking-precompile) [#2053](https://github.com/evmos/evmos/pull/2053) Change the validator address in the events from string type to address type. +- (distribution-precompile) [#2055](https://github.com/evmos/evmos/pull/2055) Change the validator address in the events from string type to address type. +- (recovery) [#2087](https://github.com/evmos/evmos/pull/2087) Remove `x/recovery` module. +- (bank-precompile) [#2095](https://github.com/evmos/evmos/pull/2095) Add `bank` precompile. +- (incentives) [#2070](https://github.com/evmos/evmos/pull/2070) Remove `x/incentives` module and burn incentives pool balance. +- (evm) [#2084](https://github.com/evmos/evmos/pull/2084) Remove `x/claims` params and migrate the `EVMChannels` param to the `x/evm` module params. - (post) [#2013](https://github.com/evmos/evmos/pull/2013) Add `BurnDecorator` to `PostHandler` to burn cosmos transaction fees. ### API Breaking - (inflation) [#2015](https://github.com/evmos/evmos/pull/2015) Rename `inflation` module to `inflation/v1`. -- (ante) [#2078](https://github.com/evmos/evmos/pull/2078) depecrate legacy EIP712 ante handler - -### State Machine Breaking - -- (evm) [#2084](https://github.com/evmos/evmos/pull/2084) Remove `x/claims` params and migrate the `EVMChannels` param to the `x/evm` module params. -- (recovery) [#2087](https://github.com/evmos/evmos/pull/2087) Remove `x/recovery` module. -- (incentives) [#2070](https://github.com/evmos/evmos/pull/2070) Remove `x/incentives` module and burn incentives pool balance. - -### Features - -- (p256) [#1922](https://github.com/evmos/evmos/pull/1922) [EIP-7212](https://eips.ethereum.org/EIPS/eip-7212) `secp256r1` curve precompile -- (werc20) [#1991](https://github.com/evmos/evmos/pull/1991) Add WERC-20 Precompile transactions. -- (erc20) [#1993](https://github.com/evmos/evmos/pull/1993) Add ERC-20 Precompile transactions. -- (erc20) [#1995](https://github.com/evmos/evmos/pull/1995) Add ERC-20 precompile approvals and authorizations. -- (osmosis-outpost) [#1986](https://github.com/evmos/evmos/pull/1986) Add Osmosis outpost transaction. -- (erc20) [#1997](https://github.com/evmos/evmos/pull/1997) Add logic for ERC-20 precompile registration. -- (bech32) [#2038](https://github.com/evmos/evmos/pull/2038) Add `bech32` conversion precompile. -- (bank) [#2095](https://github.com/evmos/evmos/pull/2095) Add 'bank' precompile. +- (ante) [#2078](https://github.com/evmos/evmos/pull/2078) deprecate legacy EIP712 ante handler ### Improvements @@ -70,66 +64,66 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (stride-outpost) [#1913](https://github.com/evmos/evmos/pull/1913) Add Run function, Precompile struct and tx definitions. - (stride-outpost) [#1914](https://github.com/evmos/evmos/pull/1914) Add types, events and common util function. - (osmosis-outpost) [#1915](https://github.com/evmos/evmos/pull/1915) Add Osmosis Outpost interface and ABI. -- (ics20) [#1916](https://github.com/evmos/evmos/pull/1916) Make ICS20 Transfer event a common function. -- (ics20) [#1917](https://github.com/evmos/evmos/pull/1917) Make timeout height a const in the ics20 precompile. +- (ics20-precompile) [#1916](https://github.com/evmos/evmos/pull/1916) Make ICS20 Transfer event a common function. +- (ics20-precompile) [#1917](https://github.com/evmos/evmos/pull/1917) Make timeout height a const in the ics20 precompile. - (stride-outpost) [#1926](https://github.com/evmos/evmos/pull/1926) Refactor event names and definitions. - (stride-outpost) [#1931](https://github.com/evmos/evmos/pull/1931) Add Stride unit testing setup. - (stride-outpost) [#1932](https://github.com/evmos/evmos/pull/1932) Add transaction implementation and events unit tests. - (stride-outpost) [#1935](https://github.com/evmos/evmos/pull/1935) Refactor RedeemStake method. - (osmosis-outpost) [#1921](https://github.com/evmos/evmos/pull/1921) Add Osmosis outpost types and errors. -- (distribution) [#1949](https://github.com/evmos/evmos/pull/1949) Add `ClaimRewards` custom transaction. - (rpc) [#1952](https://github.com/evmos/evmos/pull/1952) Add tests for EVM extensions transactions gas estimation (related to changes in [#1943](https://github.com/evmos/evmos/pull/1943)). -- (distribution) [#1954](https://github.com/evmos/evmos/pull/1954) Add `ClaimRewards` unit and event tests. +- (distribution-precompile) [#1954](https://github.com/evmos/evmos/pull/1954) Add `ClaimRewards` unit and event tests. - (osmosis-outpost) [#1944](https://github.com/evmos/evmos/pull/1944) Add more validation to Osmosis outpost. - (precompiles) [#1973](https://github.com/evmos/evmos/pull/1973) Use `LoadABI` from precompiles common package in outposts. -- (erc20) [#1983](https://github.com/evmos/evmos/pull/1983) Add ERC-20 Precompile queries. -- (erc20) [#1984](https://github.com/evmos/evmos/pull/1984) Add tests for ERC20 precompile events. +- (erc20-precompile) [#1983](https://github.com/evmos/evmos/pull/1983) Add ERC-20 Precompile queries. +- (erc20-precompile) [#1984](https://github.com/evmos/evmos/pull/1984) Add tests for ERC20 precompile events. - (ci) [#1985](https://github.com/evmos/evmos/pull/1985) Add CI action to check for a Changelog entry on PRs to `main`. -- (erc20) [#1983](https://github.com/evmos/evmos/pull/1983) Add ERC-20 Precompile queries. -- (werc20) [#1990](https://github.com/evmos/evmos/pull/1990) Add WERC-20 Precompile events. -- (distribution) [#1992](https://github.com/evmos/evmos/pull/1992) Remove outdated check utility for distribution approval. -- (erc20) [#1994](https://github.com/evmos/evmos/pull/1994) Add tests for ERC20 precompile type utilities. -- (fees) [#1998](https://github.com/evmos/evmos/pull/1998) Only allow user to pass in aevmos native token as transaction fees. -- (erc20) [#2005](https://github.com/evmos/evmos/pull/2005) Add tests for ERC20 precompile approvals. +- (erc20-precompile) [#1983](https://github.com/evmos/evmos/pull/1983) Add ERC-20 Precompile queries. +- (osmosis-outpost) [#1986](https://github.com/evmos/evmos/pull/1986) Add Osmosis outpost transaction. +- (werc20-precompile) [#1990](https://github.com/evmos/evmos/pull/1990) Add WERC-20 Precompile events. +- (werc20-precompile) [#1991](https://github.com/evmos/evmos/pull/1991) Add WERC-20 Precompile transactions. +- (distribution-precompile) [#1992](https://github.com/evmos/evmos/pull/1992) Remove outdated check utility for distribution approval. +- (erc20-precompile) [#1993](https://github.com/evmos/evmos/pull/1993) Add ERC-20 Precompile transactions. +- (erc20-precompile) [#1994](https://github.com/evmos/evmos/pull/1994) Add tests for ERC20 precompile type utilities. +- (erc20-precompile) [#1995](https://github.com/evmos/evmos/pull/1995) Add ERC-20 precompile approvals and authorizations. +- (erc20-precompile) [#1997](https://github.com/evmos/evmos/pull/1997) Add logic for ERC-20 precompile registration. +- (erc20-precompile) [#2005](https://github.com/evmos/evmos/pull/2005) Add tests for ERC20 precompile approvals. - (bin) [#2007](https://github.com/evmos/evmos/pull/2007) Add commands in Makefile for building binary with rocksDB and pebbleDB -- (erc20) [#2009](https://github.com/evmos/evmos/pull/2009) Add ERC20 precompile transaction unit tests. +- (erc20-precompile) [#2009](https://github.com/evmos/evmos/pull/2009) Add ERC20 precompile transaction unit tests. - (osmosis-outpost) [#2011](https://github.com/evmos/evmos/pull/2011) Update outpost swap ABI to return IBC next sequence. - (utils) [#2010](https://github.com/evmos/evmos/pull/2010) Add utils function to create ibc denom trace. -- (erc20) [#2012](https://github.com/evmos/evmos/pull/2012) Adjust ERC20 extension approvals to handle multiple denominations. +- (erc20-precompile) [#2012](https://github.com/evmos/evmos/pull/2012) Adjust ERC20 extension approvals to handle multiple denominations. - (osmosis-outpost) [#2017](https://github.com/evmos/evmos/pull/2017) Refactor types, errors and precompile struct. -- (erc20) [#2023](https://github.com/evmos/evmos/pull/2023) Add tests for ERC20 precompile queries. +- (erc20-precompile) [#2023](https://github.com/evmos/evmos/pull/2023) Add tests for ERC20 precompile queries. - (osmosis-outpost) [#2025](https://github.com/evmos/evmos/pull/2025) Use a struct to wrap parsed parameters from Solidity. - (ante) [#2028](https://github.com/evmos/evmos/pull/2028) MonoAnteHandler for EVM transaction. -- (staking) [#2030](https://github.com/evmos/evmos/pull/2030) Implement the `CreateValidator` function for staking precompiled contract. -- (erc20) [#2037](https://github.com/evmos/evmos/pull/2037) Add IsTransactions and RequiredGas tests for the ERC20 extension. -- (bank) [#2040](https://github.com/evmos/evmos/pull/2040) Add bank extension unit tests for queries. -- (bank) [#2041](https://github.com/evmos/evmos/pull/2041) Add `supplyOf` query to bank extension. -- (staking) [#2046](https://github.com/evmos/evmos/pull/2046) Format any type ConsensusPubkey into a base64 string. -- (bank) [#2045](https://github.com/evmos/evmos/pull/2045) Add unit tests for `supplyOf` query. +- (erc20-precompile) [#2037](https://github.com/evmos/evmos/pull/2037) Add IsTransactions and RequiredGas tests for the ERC20 extension. +- (bank-precompile) [#2040](https://github.com/evmos/evmos/pull/2040) Add bank extension unit tests for queries. +- (bank-precompile) [#2041](https://github.com/evmos/evmos/pull/2041) Add `supplyOf` query to bank extension. +- (staking-precompile) [#2046](https://github.com/evmos/evmos/pull/2046) Format any type ConsensusPubkey into a base64 string. +- (bank-precompile) [#2045](https://github.com/evmos/evmos/pull/2045) Add unit tests for `supplyOf` query. - (osmosis-outpost) [#2042](https://github.com/evmos/evmos/pull/2042) Add Osmosis's wasm hook validation functions to test -- (staking) [#2050](https://github.com/evmos/evmos/pull/2050) Add CreateValidator unit test for precompiled contract staking. +- (staking-precompile) [#2050](https://github.com/evmos/evmos/pull/2050) Add CreateValidator unit test for precompiled contract staking. - (make) [#2052](https://github.com/evmos/evmos/pull/2052) Fix Makefile targets to compile ERC20 contracts. -- (distribution) [#2054](https://github.com/evmos/evmos/pull/2054) Change the validator address in the events from string type to address type. -- (staking) [#2053](https://github.com/evmos/evmos/pull/2053) Change the validator address in the events from string type to address type. -- (werc20) [#2057](https://github.com/evmos/evmos/pull/2057) WERC20 refactors and handling of fallback and receive functions. -- (werc20) [#2059](https://github.com/evmos/evmos/pull/2059) Add WERC20 base integration tests. -- (werc20) [#2062](https://github.com/evmos/evmos/pull/2062) Remove name checking for `fallback` and `receive` functions. +- (werc20-precompile) [#2057](https://github.com/evmos/evmos/pull/2057) WERC20 refactors and handling of fallback and receive functions. +- (werc20-precompile) [#2059](https://github.com/evmos/evmos/pull/2059) Add WERC20 base integration tests. +- (werc20-precompile) [#2062](https://github.com/evmos/evmos/pull/2062) Remove name checking for `fallback` and `receive` functions. - (osmosis-outpost) [#2063](https://github.com/evmos/evmos/pull/2063) Check that receiver address is bech32 with "evmos" as human readable part. - (cmn-precompile) [#2064](https://github.com/evmos/evmos/pull/2064) Handle all `fallback` and `receive` function cases -- (erc20) [#2066](https://github.com/evmos/evmos/pull/2066) Adjust ERC20 EVM extension allowance behavior to align with standard ERC20 smart contracts. -- (erc20) [#2067](https://github.com/evmos/evmos/pull/2067) Further alignments between ERC20 smart contracts and EVM extension. +- (erc20-precompile) [#2066](https://github.com/evmos/evmos/pull/2066) Adjust ERC20 EVM extension allowance behavior to align with standard ERC20 smart contracts. +- (erc20-precompile) [#2067](https://github.com/evmos/evmos/pull/2067) Further alignments between ERC20 smart contracts and EVM extension. - (stride-outpost) [#2069](https://github.com/evmos/evmos/pull/2069) Refactor `osmosis` and `stride` testing. -- (erc20) [#2073](https://github.com/evmos/evmos/pull/2073) Align metadata query errors with ERC20 contracts. -- (werc20) [#2074](https://github.com/evmos/evmos/pull/2074) Add `werc20` EVM Extension acceptance tests with `WEVMOS` contract. -- (erc20) [#2075](https://github.com/evmos/evmos/pull/2075) Align allowance adjustment errors with ERC20 contracts. -- (erc20) [#2080](https://github.com/evmos/evmos/pull/2080) Add ERC20 integration test setup. -- (erc20) [#2081](https://github.com/evmos/evmos/pull/2081) Add ERC20 query integration tests. -- (erc20) [#2083](https://github.com/evmos/evmos/pull/2083) Add integration tests for ERC20 allowance transactions. -- (erc20) [#2085](https://github.com/evmos/evmos/pull/2085) Add ERC20 transfer integration tests. -- (erc20) [#2086](https://github.com/evmos/evmos/pull/2086) Add ERC20 metadata query integration tests. -- (erc20) [#2088](https://github.com/evmos/evmos/pull/2088) Emit additional approval event in case of `transferFrom`. -- (erc20) [#2097](https://github.com/evmos/evmos/pull/2097) Adjust ERC20 allowance behavior for same spender. -- (bank) [#2096](https://github.com/evmos/evmos/pull/2096) Add `bank` precompile integration tests. +- (erc20-precompile) [#2073](https://github.com/evmos/evmos/pull/2073) Align metadata query errors with ERC20 contracts. +- (werc20-precompile) [#2074](https://github.com/evmos/evmos/pull/2074) Add `werc20` EVM Extension acceptance tests with `WEVMOS` contract. +- (erc20-precompile) [#2075](https://github.com/evmos/evmos/pull/2075) Align allowance adjustment errors with ERC20 contracts. +- (erc20-precompile) [#2080](https://github.com/evmos/evmos/pull/2080) Add ERC20 integration test setup. +- (erc20-precompile) [#2081](https://github.com/evmos/evmos/pull/2081) Add ERC20 query integration tests. +- (erc20-precompile) [#2083](https://github.com/evmos/evmos/pull/2083) Add integration tests for ERC20 allowance transactions. +- (erc20-precompile) [#2085](https://github.com/evmos/evmos/pull/2085) Add ERC20 transfer integration tests. +- (erc20-precompile) [#2086](https://github.com/evmos/evmos/pull/2086) Add ERC20 metadata query integration tests. +- (erc20-precompile) [#2088](https://github.com/evmos/evmos/pull/2088) Emit additional approval event in case of `transferFrom`. +- (erc20-precompile) [#2097](https://github.com/evmos/evmos/pull/2097) Adjust ERC20 allowance behavior for same spender. +- (bank-precompile) [#2096](https://github.com/evmos/evmos/pull/2096) Add `bank` precompile integration tests. - (osmosis-outpost) [#2077](https://github.com/evmos/evmos/pull/2077) Update Osmosis outpost to use cross-chain swap contract V1. - (app) [#2104](https://github.com/evmos/evmos/pull/2104) Refactor code to use `sdkmath.Int` and `sdkmath.LegacyDec` instead of the SDK types - (p256-precompile) [#2110](https://github.com/evmos/evmos/pull/2110) Adjust `p256` precompile address. From a5d84cceecffdb6d7e42e14ee6566c154a680d9a Mon Sep 17 00:00:00 2001 From: Chenqun Lu Date: Sun, 3 Dec 2023 23:58:07 +0800 Subject: [PATCH 006/345] imp(staking): replace bech32 address with evm hex address for query alidator (#2076) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * imp(staking): replace bech32 address with evm hex address for query validator * imp(staking): use DefaultValidatorOutput when has a error * imp(staking): add key is []byte{0} for TestValidators * imp(staking): remove ByteNil * imp(staking): remove ByteNil --------- Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> Co-authored-by: Vladislav Varadinov --- CHANGELOG.md | 1 + precompiles/common/errors.go | 2 + precompiles/staking/StakingI.sol | 2 +- precompiles/staking/abi.json | 4 +- precompiles/staking/integration_test.go | 16 +++--- precompiles/staking/query_test.go | 49 ++++++++++++++++--- precompiles/staking/staking_test.go | 11 +++-- .../staking/testdata/StakingCaller.json | 4 +- .../staking/testdata/StakingCaller.sol | 2 +- precompiles/staking/types.go | 49 +++++++++++++------ precompiles/staking/utils_test.go | 11 +++-- 11 files changed, 108 insertions(+), 43 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d05f4ae6a0..b86149d539 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -143,6 +143,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (vesting) [#1862](https://github.com/evmos/evmos/pull/1862) Add Authorization Grants to the Vesting extension. - (ics20) [#1848](https://github.com/evmos/evmos/pull/1848) Refactor ICS20 Authorization and remove Revoke Event. +- (staking) [#2076](https://github.com/evmos/evmos/pull/2076) Replace bech32 address with evm hex address for query validator. ### State Machine Breaking diff --git a/precompiles/common/errors.go b/precompiles/common/errors.go index e67ad4f1c3..d7cf66119c 100644 --- a/precompiles/common/errors.go +++ b/precompiles/common/errors.go @@ -14,6 +14,8 @@ const ( ErrInvalidAmount = "invalid amount: %v" // ErrInvalidDelegator is raised when the delegator address is not valid. ErrInvalidDelegator = "invalid delegator address: %s" + // ErrInvalidValidator is raised when the Validator address is not valid. + ErrInvalidValidator = "invalid validator address: %s" // ErrInvalidDenom is raised when the denom is not valid. ErrInvalidDenom = "invalid denom: %s" // ErrInvalidMsgType is raised when the transaction type is not valid for the given precompile. diff --git a/precompiles/staking/StakingI.sol b/precompiles/staking/StakingI.sol index a2c1bff4dc..10107b8a43 100644 --- a/precompiles/staking/StakingI.sol +++ b/precompiles/staking/StakingI.sol @@ -218,7 +218,7 @@ interface StakingI is authorization.AuthorizationI { /// @param validatorAddress The address of the validator. /// @return validator The validator info for the given validator address. function validator( - string memory validatorAddress + address validatorAddress ) external view returns (Validator calldata validator); /// @dev Queries all validators that match the given status. diff --git a/precompiles/staking/abi.json b/precompiles/staking/abi.json index 0e67804dd3..ce886071fb 100644 --- a/precompiles/staking/abi.json +++ b/precompiles/staking/abi.json @@ -958,9 +958,9 @@ { "inputs": [ { - "internalType": "string", + "internalType": "address", "name": "validatorAddress", - "type": "string" + "type": "address" } ], "name": "validator", diff --git a/precompiles/staking/integration_test.go b/precompiles/staking/integration_test.go index c76b90f1b2..478f4e7f8c 100644 --- a/precompiles/staking/integration_test.go +++ b/precompiles/staking/integration_test.go @@ -793,8 +793,9 @@ var _ = Describe("Calling staking precompile directly", func() { }) It("should return validator", func() { + varHexAddr := common.BytesToAddress(valAddr.Bytes()) validatorArgs := defaultValidatorArgs.WithArgs( - valAddr.String(), + varHexAddr, ) _, ethRes, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, validatorArgs, passCheck) @@ -803,14 +804,14 @@ var _ = Describe("Calling staking precompile directly", func() { var valOut staking.ValidatorOutput err = s.precompile.UnpackIntoInterface(&valOut, staking.ValidatorMethod, ethRes.Ret) Expect(err).To(BeNil(), "error while unpacking the validator output: %v", err) - Expect(valOut.Validator.OperatorAddress).To(Equal(valAddr.String()), "expected validator address to match") + Expect(valOut.Validator.OperatorAddress).To(Equal(varHexAddr.String()), "expected validator address to match") Expect(valOut.Validator.DelegatorShares).To(Equal(big.NewInt(1e18)), "expected different delegator shares") }) It("should return an empty validator if the validator is not found", func() { - newValAddr := sdk.ValAddress(testutiltx.GenerateAddress().Bytes()) + newValHexAddr := testutiltx.GenerateAddress() validatorArgs := defaultValidatorArgs.WithArgs( - newValAddr.String(), + newValHexAddr, ) _, ethRes, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, validatorArgs, passCheck) @@ -2073,7 +2074,7 @@ var _ = Describe("Calling staking precompile via Solidity", func() { It("with non-existing address should return an empty validator", func() { validatorArgs := defaultValidatorArgs.WithArgs( - nonExistingVal.String(), + nonExistingAddr, ) _, ethRes, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, validatorArgs, passCheck) @@ -2087,8 +2088,9 @@ var _ = Describe("Calling staking precompile via Solidity", func() { }) It("with existing address should return the validator", func() { + varHexAddr := common.BytesToAddress(valAddr.Bytes()) validatorArgs := defaultValidatorArgs.WithArgs( - valAddr.String(), + varHexAddr, ) _, ethRes, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, validatorArgs, passCheck) @@ -2097,7 +2099,7 @@ var _ = Describe("Calling staking precompile via Solidity", func() { var valOut staking.ValidatorOutput err = s.precompile.UnpackIntoInterface(&valOut, staking.ValidatorMethod, ethRes.Ret) Expect(err).To(BeNil(), "error while unpacking the validator output: %v", err) - Expect(valOut.Validator.OperatorAddress).To(Equal(valAddr.String()), "expected validator address to match") + Expect(valOut.Validator.OperatorAddress).To(Equal(varHexAddr.String()), "expected validator address to match") Expect(valOut.Validator.DelegatorShares).To(Equal(big.NewInt(1e18)), "expected different delegator shares") }) diff --git a/precompiles/staking/query_test.go b/precompiles/staking/query_test.go index 0291ba3420..5ac4675f8f 100644 --- a/precompiles/staking/query_test.go +++ b/precompiles/staking/query_test.go @@ -223,7 +223,7 @@ func (s *PrecompileTestSuite) TestValidator() { testCases := []struct { name string - malleate func(operatorAddress string) []interface{} + malleate func(operatorAddress common.Address) []interface{} postCheck func(bz []byte) gas uint64 expErr bool @@ -231,7 +231,7 @@ func (s *PrecompileTestSuite) TestValidator() { }{ { "fail - empty input args", - func(operatorAddress string) []interface{} { + func(operatorAddress common.Address) []interface{} { return []interface{}{} }, func(_ []byte) {}, @@ -241,7 +241,7 @@ func (s *PrecompileTestSuite) TestValidator() { }, { "success", - func(operatorAddress string) []interface{} { + func(operatorAddress common.Address) []interface{} { return []interface{}{ operatorAddress, } @@ -250,7 +250,11 @@ func (s *PrecompileTestSuite) TestValidator() { var valOut staking.ValidatorOutput err := s.precompile.UnpackIntoInterface(&valOut, staking.ValidatorMethod, data) s.Require().NoError(err, "failed to unpack output") - s.Require().Equal(valOut.Validator.OperatorAddress, s.validators[0].OperatorAddress) + + operatorAddress, err := sdk.ValAddressFromBech32(s.validators[0].OperatorAddress) + s.Require().NoError(err) + + s.Require().Equal(common.HexToAddress(valOut.Validator.OperatorAddress), common.BytesToAddress(operatorAddress.Bytes())) }, 100000, false, @@ -258,11 +262,11 @@ func (s *PrecompileTestSuite) TestValidator() { }, { name: "success - empty validator", - malleate: func(operatorAddress string) []interface{} { + malleate: func(_ common.Address) []interface{} { newAddr, _ := testutiltx.NewAccAddressAndKey() newValAddr := sdk.ValAddress(newAddr) return []interface{}{ - newValAddr.String(), + common.BytesToAddress(newValAddr.Bytes()), } }, postCheck: func(data []byte) { @@ -281,7 +285,10 @@ func (s *PrecompileTestSuite) TestValidator() { s.SetupTest() // reset contract := vm.NewContract(vm.AccountRef(s.address), s.precompile, big.NewInt(0), tc.gas) - bz, err := s.precompile.Validator(s.ctx, &method, contract, tc.malleate(s.validators[0].OperatorAddress)) + operatorAddress, err := sdk.ValAddressFromBech32(s.validators[0].OperatorAddress) + s.Require().NoError(err) + + bz, err := s.precompile.Validator(s.ctx, &method, contract, tc.malleate(common.BytesToAddress(operatorAddress.Bytes()))) if tc.expErr { s.Require().Error(err) @@ -355,6 +362,34 @@ func (s *PrecompileTestSuite) TestValidators() { false, "", }, + { + "success - bonded status & pagination w/countTotal & key is []byte{0}", + func() []interface{} { + return []interface{}{ + stakingtypes.Bonded.String(), + query.PageRequest{ + Key: []byte{0}, + Limit: 1, + CountTotal: true, + }, + } + }, + func(data []byte) { + const expLen = 1 + var valOut staking.ValidatorsOutput + err := s.precompile.UnpackIntoInterface(&valOut, staking.ValidatorsMethod, data) + s.Require().NoError(err, "failed to unpack output") + + s.Require().Len(valOut.Validators, expLen) + // passed CountTotal = true + s.Require().Equal(len(s.validators), int(valOut.PageResponse.Total)) + s.Require().NotEmpty(valOut.PageResponse.NextKey) + s.assertValidatorsResponse(valOut.Validators, expLen) + }, + 100000, + false, + "", + }, } for _, tc := range testCases { diff --git a/precompiles/staking/staking_test.go b/precompiles/staking/staking_test.go index e5c032f2a3..548f1188f5 100644 --- a/precompiles/staking/staking_test.go +++ b/precompiles/staking/staking_test.go @@ -5,15 +5,15 @@ import ( "time" "cosmossdk.io/math" - "github.com/evmos/evmos/v16/app" - - "github.com/evmos/evmos/v16/precompiles/authorization" + "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + "github.com/evmos/evmos/v16/app" + "github.com/evmos/evmos/v16/precompiles/authorization" "github.com/evmos/evmos/v16/precompiles/staking" "github.com/evmos/evmos/v16/utils" evmtypes "github.com/evmos/evmos/v16/x/evm/types" @@ -281,9 +281,12 @@ func (s *PrecompileTestSuite) TestRun() { { "pass - validator query", func() []byte { + valAddr, err := sdk.ValAddressFromBech32(s.validators[0].OperatorAddress) + s.Require().NoError(err) + input, err := s.precompile.Pack( staking.ValidatorMethod, - s.validators[0].OperatorAddress, + common.BytesToAddress(valAddr.Bytes()), ) s.Require().NoError(err, "failed to pack input") return input diff --git a/precompiles/staking/testdata/StakingCaller.json b/precompiles/staking/testdata/StakingCaller.json index cbbeee53e2..b6932839d5 100644 --- a/precompiles/staking/testdata/StakingCaller.json +++ b/precompiles/staking/testdata/StakingCaller.json @@ -1,4 +1,4 @@ { - "abi": "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"}],\"name\":\"approveDepositAndDelegate\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"}],\"name\":\"approveDepositAndDelegateExceedingAllowance\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"}],\"name\":\"approveDepositDelegateAndFailCustomLogic\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"callERC20AndDelegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"counter\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_grantee\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"method\",\"type\":\"string\"}],\"name\":\"getAllowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"}],\"name\":\"getDelegation\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"struct Coin\",\"name\":\"balance\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_validatorSrcAddr\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_validatorDstAddr\",\"type\":\"string\"}],\"name\":\"getRedelegation\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"delegatorAddress\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"validatorSrcAddress\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"validatorDstAddress\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"int64\",\"name\":\"creationHeight\",\"type\":\"int64\"},{\"internalType\":\"int64\",\"name\":\"completionTime\",\"type\":\"int64\"},{\"internalType\":\"uint256\",\"name\":\"initialBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sharesDst\",\"type\":\"uint256\"}],\"internalType\":\"struct RedelegationEntry[]\",\"name\":\"entries\",\"type\":\"tuple[]\"}],\"internalType\":\"struct RedelegationOutput\",\"name\":\"redelegation\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_delegatorAddr\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_validatorSrcAddr\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_validatorDstAddr\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"key\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"offset\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"limit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"countTotal\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"reverse\",\"type\":\"bool\"}],\"internalType\":\"struct PageRequest\",\"name\":\"_pageRequest\",\"type\":\"tuple\"}],\"name\":\"getRedelegations\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"delegatorAddress\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"validatorSrcAddress\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"validatorDstAddress\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"int64\",\"name\":\"creationHeight\",\"type\":\"int64\"},{\"internalType\":\"int64\",\"name\":\"completionTime\",\"type\":\"int64\"},{\"internalType\":\"uint256\",\"name\":\"initialBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sharesDst\",\"type\":\"uint256\"}],\"internalType\":\"struct RedelegationEntry[]\",\"name\":\"entries\",\"type\":\"tuple[]\"}],\"internalType\":\"struct Redelegation\",\"name\":\"redelegation\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"internalType\":\"int64\",\"name\":\"creationHeight\",\"type\":\"int64\"},{\"internalType\":\"int64\",\"name\":\"completionTime\",\"type\":\"int64\"},{\"internalType\":\"uint256\",\"name\":\"initialBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sharesDst\",\"type\":\"uint256\"}],\"internalType\":\"struct RedelegationEntry\",\"name\":\"redelegationEntry\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"internalType\":\"struct RedelegationEntryResponse[]\",\"name\":\"entries\",\"type\":\"tuple[]\"}],\"internalType\":\"struct RedelegationResponse[]\",\"name\":\"response\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nextKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"total\",\"type\":\"uint64\"}],\"internalType\":\"struct PageResponse\",\"name\":\"pageResponse\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"}],\"name\":\"getUnbondingDelegation\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"delegatorAddress\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"validatorAddress\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"int64\",\"name\":\"creationHeight\",\"type\":\"int64\"},{\"internalType\":\"int64\",\"name\":\"completionTime\",\"type\":\"int64\"},{\"internalType\":\"uint256\",\"name\":\"initialBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"unbondingId\",\"type\":\"uint64\"},{\"internalType\":\"int64\",\"name\":\"unbondingOnHoldRefCount\",\"type\":\"int64\"}],\"internalType\":\"struct UnbondingDelegationEntry[]\",\"name\":\"entries\",\"type\":\"tuple[]\"}],\"internalType\":\"struct UnbondingDelegationOutput\",\"name\":\"unbondingDelegation\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"}],\"name\":\"getValidator\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"operatorAddress\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"consensusPubkey\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"jailed\",\"type\":\"bool\"},{\"internalType\":\"enum BondStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"delegatorShares\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"int64\",\"name\":\"unbondingHeight\",\"type\":\"int64\"},{\"internalType\":\"int64\",\"name\":\"unbondingTime\",\"type\":\"int64\"},{\"internalType\":\"uint256\",\"name\":\"commission\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minSelfDelegation\",\"type\":\"uint256\"}],\"internalType\":\"struct Validator\",\"name\":\"validator\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_status\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"key\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"offset\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"limit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"countTotal\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"reverse\",\"type\":\"bool\"}],\"internalType\":\"struct PageRequest\",\"name\":\"_pageRequest\",\"type\":\"tuple\"}],\"name\":\"getValidators\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"operatorAddress\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"consensusPubkey\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"jailed\",\"type\":\"bool\"},{\"internalType\":\"enum BondStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"delegatorShares\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"int64\",\"name\":\"unbondingHeight\",\"type\":\"int64\"},{\"internalType\":\"int64\",\"name\":\"unbondingTime\",\"type\":\"int64\"},{\"internalType\":\"uint256\",\"name\":\"commission\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minSelfDelegation\",\"type\":\"uint256\"}],\"internalType\":\"struct Validator[]\",\"name\":\"validators\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nextKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"total\",\"type\":\"uint64\"}],\"internalType\":\"struct PageResponse\",\"name\":\"pageResponse\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"},{\"internalType\":\"string[]\",\"name\":\"_methods\",\"type\":\"string[]\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"testApprove\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_approveAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_undelegateAmount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"}],\"name\":\"testApproveAndThenUndelegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_calltype\",\"type\":\"string\"}],\"name\":\"testCallDelegation\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"struct Coin\",\"name\":\"coin\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_calltype\",\"type\":\"string\"}],\"name\":\"testCallUndelegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_creationHeight\",\"type\":\"uint256\"}],\"name\":\"testCancelUnbonding\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"testDelegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"testDelegateIncrementCounter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_validatorSrcAddr\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_validatorDstAddr\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"testRedelegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_grantee\",\"type\":\"address\"},{\"internalType\":\"string[]\",\"name\":\"_methods\",\"type\":\"string[]\"}],\"name\":\"testRevoke\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"testUndelegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - "bin": "6080604052604051806020016040528060405180606001604052806023815260200162005c026023913981525060019060016200003e92919062000053565b503480156200004c57600080fd5b50620004a1565b828054828255906000526020600020908101928215620000a0579160200282015b828111156200009f5782518290816200008e9190620003ba565b509160200191906001019062000074565b5b509050620000af9190620000b3565b5090565b5b80821115620000d75760008181620000cd9190620000db565b50600101620000b4565b5090565b508054620000e990620001a9565b6000825580601f10620000fd57506200011e565b601f0160209004906000526020600020908101906200011d919062000121565b5b50565b5b808211156200013c57600081600090555060010162000122565b5090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620001c257607f821691505b602082108103620001d857620001d76200017a565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620002427fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000203565b6200024e868362000203565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200029b620002956200028f8462000266565b62000270565b62000266565b9050919050565b6000819050919050565b620002b7836200027a565b620002cf620002c682620002a2565b84845462000210565b825550505050565b600090565b620002e6620002d7565b620002f3818484620002ac565b505050565b5b818110156200031b576200030f600082620002dc565b600181019050620002f9565b5050565b601f8211156200036a576200033481620001de565b6200033f84620001f3565b810160208510156200034f578190505b620003676200035e85620001f3565b830182620002f8565b50505b505050565b600082821c905092915050565b60006200038f600019846008026200036f565b1980831691505092915050565b6000620003aa83836200037c565b9150826002028217905092915050565b620003c58262000140565b67ffffffffffffffff811115620003e157620003e06200014b565b5b620003ed8254620001a9565b620003fa8282856200031f565b600060209050601f8311600181146200043257600084156200041d578287015190505b6200042985826200039c565b86555062000499565b601f1984166200044286620001de565b60005b828110156200046c5784890151825560018201915060208501945060208101905062000445565b868310156200048c578489015162000488601f8916826200037c565b8355505b6001600288020188555050505b505050505050565b61575180620004b16000396000f3fe6080604052600436106101355760003560e01c80638939e783116100ab578063cf2753cf1161006f578063cf2753cf14610418578063ec9485df14610456578063f40a214614610493578063f5714e64146104bc578063f700dbd2146104d8578063f732b0651461050157610135565b80638939e7831461032f5780638edb3f8b146103585780638fa111a5146103745780639eab6711146103b1578063b13d4242146103da57610135565b806355dc4b22116100fd57806355dc4b2214610230578063570467ac146102595780635e269bfe1461029657806360deaa2a146102bf57806361bc221a146102db5780637e51b8111461030657610135565b80630a4433e21461013a57806319b16c4c1461016357806331bcbcb3146101a15780633566cb95146101ca578063455b8551146101f3575b600080fd5b34801561014657600080fd5b50610161600480360381019061015c919061221e565b61053f565b005b34801561016f57600080fd5b5061018a600480360381019061018591906123d3565b61060e565b604051610198929190612538565b60405180910390f35b3480156101ad57600080fd5b506101c860048036038101906101c39190612568565b610b0d565b005b3480156101d657600080fd5b506101f160048036038101906101ec91906125d7565b610d9a565b005b3480156101ff57600080fd5b5061021a60048036038101906102159190612633565b610f02565b6040516102279190612856565b60405180910390f35b34801561023c57600080fd5b5061025760048036038101906102529190612878565b610f95565b005b34801561026557600080fd5b50610280600480360381019061027b91906123d3565b611387565b60405161028d9190612a93565b60405180910390f35b3480156102a257600080fd5b506102bd60048036038101906102b89190612ab5565b61141d565b005b6102d960048036038101906102d49190612b38565b6114a8565b005b3480156102e757600080fd5b506102f06115f6565b6040516102fd9190612b81565b60405180910390f35b34801561031257600080fd5b5061032d60048036038101906103289190612568565b6115fc565b005b34801561033b57600080fd5b5061035660048036038101906103519190612568565b611684565b005b610372600480360381019061036d9190612b38565b61170c565b005b34801561038057600080fd5b5061039b60048036038101906103969190612b38565b6118a1565b6040516103a89190612d2b565b60405180910390f35b3480156103bd57600080fd5b506103d860048036038101906103d39190612d4d565b611931565b005b3480156103e657600080fd5b5061040160048036038101906103fc9190612e10565b6119bc565b60405161040f9291906130d9565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a9190612633565b611a54565b60405161044d929190612538565b60405180910390f35b34801561046257600080fd5b5061047d60048036038101906104789190612633565b611aec565b60405161048a9190612b81565b60405180910390f35b34801561049f57600080fd5b506104ba60048036038101906104b59190613110565b611b76565b005b6104d660048036038101906104d19190612b38565b611d52565b005b3480156104e457600080fd5b506104ff60048036038101906104fa9190613193565b611eac565b005b34801561050d57600080fd5b506105286004803603810190610523919061339e565b611f78565b6040516105369291906136b5565b60405180910390f35b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895868487876040518563ffffffff1660e01b8152600401610582949392919061384e565b6020604051808303816000875af11580156105a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c591906138a3565b905080610607576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105fe90613953565b60405180910390fd5b5050505050565b6000610618612016565b60006108009050600086866040516024016106349291906139ac565b6040516020818303038152906040527f241774e6000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000856040516020016106c69190613a18565b6040516020818303038152906040528051906020012090506040516020016106ed90613a7b565b6040516020818303038152906040528051906020012081036107d9576000808473ffffffffffffffffffffffffffffffffffffffff16846040516107319190613acc565b600060405180830381855af49150503d806000811461076c576040519150601f19603f3d011682016040523d82523d6000602084013e610771565b606091505b5091509150816107b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ad90613b55565b60405180910390fd5b808060200190518101906107ca9190613c66565b80975081985050505050610b02565b6040516020016107e890613d0e565b6040516020818303038152906040528051906020012081036108d4576000808473ffffffffffffffffffffffffffffffffffffffff168460405161082c9190613acc565b600060405180830381855afa9150503d8060008114610867576040519150601f19603f3d011682016040523d82523d6000602084013e61086c565b606091505b5091509150816108b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a890613d6f565b60405180910390fd5b808060200190518101906108c59190613c66565b80975081985050505050610b01565b6040516020016108e390613ddb565b6040516020818303038152906040528051906020012081036109d1576000808473ffffffffffffffffffffffffffffffffffffffff16846040516109279190613acc565b6000604051808303816000865af19150503d8060008114610964576040519150601f19603f3d011682016040523d82523d6000602084013e610969565b606091505b5091509150816109ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a590613e3c565b60405180910390fd5b808060200190518101906109c29190613c66565b80975081985050505050610b00565b6040516020016109e090613ea8565b604051602081830303815290604052805190602001208103610ac45760006040518060400160405280601a81526020017f64656c65676174696f6e28616464726573732c737472696e6729000000000000815250805190602001209050600060a490506060600060208b01516020808d0101516040518681528e6004820152604060248201526033604482015282606482015281608482015260c081878360008e5af281519c5060608201519450610100820160405280610aa057600080fd5b50505050604051806040016040528083815260200182815250975050505050610aff565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af690613f09565b60405180910390fd5b5b5b5b505050935093915050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610b4f939291906140d7565b6020604051808303816000875af1158015610b6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9291906138a3565b905080610bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcb90614161565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff163384604051602401610c00929190614181565b6040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610c8a9190613acc565b6000604051808303816000865af19150503d8060008114610cc7576040519150601f19603f3d011682016040523d82523d6000602084013e610ccc565b606091505b5050905080610d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d07906141f6565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3386866040518463ffffffff1660e01b8152600401610d4f93929190614216565b6020604051808303816000875af1158015610d6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9291906138a3565b505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610ddc939291906140d7565b6020604051808303816000875af1158015610dfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1f91906138a3565b905080610e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e58906142a0565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3085856040518463ffffffff1660e01b8152600401610ea093929190614216565b6020604051808303816000875af1158015610ebf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee391906138a3565b506001600080828254610ef691906142ef565b92505081905550505050565b610f0a612030565b61080073ffffffffffffffffffffffffffffffffffffffff1663a03ffee184846040518363ffffffff1660e01b8152600401610f479291906139ac565b600060405180830381865afa158015610f64573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610f8d919061457f565b905092915050565b600061080090506000858585604051602401610fb393929190614216565b6040516020818303038152906040527f3edab33c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000836040516020016110459190613a18565b60405160208183030381529060405280519060200120905060405160200161106c90613a7b565b6040516020818303038152906040528051906020012081036111395760008373ffffffffffffffffffffffffffffffffffffffff16836040516110af9190613acc565b600060405180830381855af49150503d80600081146110ea576040519150601f19603f3d011682016040523d82523d6000602084013e6110ef565b606091505b5050905080611133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112a90613b55565b60405180910390fd5b5061137e565b60405160200161114890613d0e565b6040516020818303038152906040528051906020012081036112155760008373ffffffffffffffffffffffffffffffffffffffff168360405161118b9190613acc565b600060405180830381855afa9150503d80600081146111c6576040519150601f19603f3d011682016040523d82523d6000602084013e6111cb565b606091505b505090508061120f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120690613d6f565b60405180910390fd5b5061137d565b60405160200161122490613ddb565b6040516020818303038152906040528051906020012081036112f35760008373ffffffffffffffffffffffffffffffffffffffff16836040516112679190613acc565b6000604051808303816000865af19150503d80600081146112a4576040519150601f19603f3d011682016040523d82523d6000602084013e6112a9565b606091505b50509050806112ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e490613e3c565b60405180910390fd5b5061137c565b60405160200161130290613ea8565b6040516020818303038152906040528051906020012081036113405760208201825160008082846000895af28061133857600080fd5b50505061137b565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137290613f09565b60405180910390fd5b5b5b5b50505050505050565b61138f612051565b61080073ffffffffffffffffffffffffffffffffffffffff16637d9f939c8585856040518463ffffffff1660e01b81526004016113ce939291906145c8565b600060405180830381865afa1580156113eb573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906114149190614830565b90509392505050565b61080073ffffffffffffffffffffffffffffffffffffffff166312d58dfe858585856040518563ffffffff1660e01b815260040161145e9493929190614879565b6020604051808303816000875af115801561147d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a191906138a3565b5050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895303460016040518463ffffffff1660e01b81526004016114ea939291906140d7565b6020604051808303816000875af1158015611509573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152d91906138a3565b90508061156f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156690614911565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b81526004016115ae93929190614216565b6020604051808303816000875af11580156115cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f191906138a3565b505050565b60005481565b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c8484846040518463ffffffff1660e01b815260040161163b93929190614216565b6020604051808303816000875af115801561165a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167e9190614931565b50505050565b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb8484846040518463ffffffff1660e01b81526004016116c393929190614216565b6020604051808303816000875af11580156116e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170691906138a3565b50505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b815260040161174e939291906140d7565b6020604051808303816000875af115801561176d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179191906138a3565b9050806117d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ca90614911565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b815260040161181293929190614216565b6020604051808303816000875af1158015611831573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061185591906138a3565b503373ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f1935050505015801561189c573d6000803e3d6000fd5b505050565b6118a9612079565b61080073ffffffffffffffffffffffffffffffffffffffff16630bc82a17836040518263ffffffff1660e01b81526004016118e4919061495e565b600060405180830381865afa158015611901573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061192a9190614b05565b9050919050565b61080073ffffffffffffffffffffffffffffffffffffffff166354b826f5858585856040518563ffffffff1660e01b81526004016119729493929190614b4e565b6020604051808303816000875af1158015611991573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b59190614931565b5050505050565b60606119c66120ed565b61080073ffffffffffffffffffffffffffffffffffffffff1663186b216785856040518363ffffffff1660e01b8152600401611a03929190614cff565b600060405180830381865afa158015611a20573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611a499190614ef3565b915091509250929050565b6000611a5e612016565b61080073ffffffffffffffffffffffffffffffffffffffff1663241774e685856040518363ffffffff1660e01b8152600401611a9b9291906139ac565b600060405180830381865afa158015611ab8573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611ae19190613c66565b915091509250929050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663fc08930c8433856040518463ffffffff1660e01b8152600401611b2d93929190614f6b565b602060405180830381865afa158015611b4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6e9190614fa9565b905092915050565b6000600167ffffffffffffffff811115611b9357611b926122a8565b5b604051908082528060200260200182016040528015611bc657816020015b6060815260200190600190039081611bb15790505b5090506040518060600160405280602581526020016156f76025913981600081518110611bf657611bf5614fd6565b5b6020026020010181905250600061080073ffffffffffffffffffffffffffffffffffffffff1663b60398958787856040518463ffffffff1660e01b8152600401611c42939291906150b6565b6020604051808303816000875af1158015611c61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8591906138a3565b905080611cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbe90615166565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c3285876040518463ffffffff1660e01b8152600401611d0693929190614216565b6020604051808303816000875af1158015611d25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d499190614931565b50505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b8152600401611d94939291906140d7565b6020604051808303816000875af1158015611db3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd791906138a3565b905080611e19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1090614911565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084600134611e4691906142ef565b6040518463ffffffff1660e01b8152600401611e6493929190614216565b6020604051808303816000875af1158015611e83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea791906138a3565b505050565b600061080073ffffffffffffffffffffffffffffffffffffffff166361dc5c3b8585856040518463ffffffff1660e01b8152600401611eed93929190615186565b6020604051808303816000875af1158015611f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f3091906138a3565b905080611f72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f699061522a565b60405180910390fd5b50505050565b6060611f826120ed565b61080073ffffffffffffffffffffffffffffffffffffffff166310a2851c878787876040518563ffffffff1660e01b8152600401611fc394939291906152c0565b600060405180830381865afa158015611fe0573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612009919061567e565b9150915094509492505050565b604051806040016040528060608152602001600081525090565b60405180606001604052806060815260200160608152602001606081525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b6040518061016001604052806060815260200160608152602001600015158152602001600060038111156120b0576120af612bb7565b5b8152602001600081526020016000815260200160608152602001600060070b8152602001600060070b815260200160008152602001600081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061215082612125565b9050919050565b61216081612145565b811461216b57600080fd5b50565b60008135905061217d81612157565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126121a8576121a7612183565b5b8235905067ffffffffffffffff8111156121c5576121c4612188565b5b6020830191508360208202830111156121e1576121e061218d565b5b9250929050565b6000819050919050565b6121fb816121e8565b811461220657600080fd5b50565b600081359050612218816121f2565b92915050565b600080600080606085870312156122385761223761211b565b5b60006122468782880161216e565b945050602085013567ffffffffffffffff81111561226757612266612120565b5b61227387828801612192565b9350935050604061228687828801612209565b91505092959194509250565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6122e082612297565b810181811067ffffffffffffffff821117156122ff576122fe6122a8565b5b80604052505050565b6000612312612111565b905061231e82826122d7565b919050565b600067ffffffffffffffff82111561233e5761233d6122a8565b5b61234782612297565b9050602081019050919050565b82818337600083830152505050565b600061237661237184612323565b612308565b90508281526020810184848401111561239257612391612292565b5b61239d848285612354565b509392505050565b600082601f8301126123ba576123b9612183565b5b81356123ca848260208601612363565b91505092915050565b6000806000606084860312156123ec576123eb61211b565b5b60006123fa8682870161216e565b935050602084013567ffffffffffffffff81111561241b5761241a612120565b5b612427868287016123a5565b925050604084013567ffffffffffffffff81111561244857612447612120565b5b612454868287016123a5565b9150509250925092565b612467816121e8565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156124a757808201518184015260208101905061248c565b60008484015250505050565b60006124be8261246d565b6124c88185612478565b93506124d8818560208601612489565b6124e181612297565b840191505092915050565b6124f5816121e8565b82525050565b6000604083016000830151848203600086015261251882826124b3565b915050602083015161252d60208601826124ec565b508091505092915050565b600060408201905061254d600083018561245e565b818103602083015261255f81846124fb565b90509392505050565b6000806000606084860312156125815761258061211b565b5b600061258f8682870161216e565b935050602084013567ffffffffffffffff8111156125b0576125af612120565b5b6125bc868287016123a5565b92505060406125cd86828701612209565b9150509250925092565b600080604083850312156125ee576125ed61211b565b5b600083013567ffffffffffffffff81111561260c5761260b612120565b5b612618858286016123a5565b925050602061262985828601612209565b9150509250929050565b6000806040838503121561264a5761264961211b565b5b60006126588582860161216e565b925050602083013567ffffffffffffffff81111561267957612678612120565b5b612685858286016123a5565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60008160070b9050919050565b6126d1816126bb565b82525050565b600067ffffffffffffffff82169050919050565b6126f4816126d7565b82525050565b60c08201600082015161271060008501826126c8565b50602082015161272360208501826126c8565b50604082015161273660408501826124ec565b50606082015161274960608501826124ec565b50608082015161275c60808501826126eb565b5060a082015161276f60a08501826126c8565b50505050565b600061278183836126fa565b60c08301905092915050565b6000602082019050919050565b60006127a58261268f565b6127af818561269a565b93506127ba836126ab565b8060005b838110156127eb5781516127d28882612775565b97506127dd8361278d565b9250506001810190506127be565b5085935050505092915050565b6000606083016000830151848203600086015261281582826124b3565b9150506020830151848203602086015261282f82826124b3565b91505060408301518482036040860152612849828261279a565b9150508091505092915050565b6000602082019050818103600083015261287081846127f8565b905092915050565b600080600080608085870312156128925761289161211b565b5b60006128a08782880161216e565b945050602085013567ffffffffffffffff8111156128c1576128c0612120565b5b6128cd878288016123a5565b93505060406128de87828801612209565b925050606085013567ffffffffffffffff8111156128ff576128fe612120565b5b61290b878288016123a5565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60808201600082015161295960008501826126c8565b50602082015161296c60208501826126c8565b50604082015161297f60408501826124ec565b50606082015161299260608501826124ec565b50505050565b60006129a48383612943565b60808301905092915050565b6000602082019050919050565b60006129c882612917565b6129d28185612922565b93506129dd83612933565b8060005b83811015612a0e5781516129f58882612998565b9750612a00836129b0565b9250506001810190506129e1565b5085935050505092915050565b60006080830160008301518482036000860152612a3882826124b3565b91505060208301518482036020860152612a5282826124b3565b91505060408301518482036040860152612a6c82826124b3565b91505060608301518482036060860152612a8682826129bd565b9150508091505092915050565b60006020820190508181036000830152612aad8184612a1b565b905092915050565b60008060008060808587031215612acf57612ace61211b565b5b6000612add8782880161216e565b945050602085013567ffffffffffffffff811115612afe57612afd612120565b5b612b0a878288016123a5565b9350506040612b1b87828801612209565b9250506060612b2c87828801612209565b91505092959194509250565b600060208284031215612b4e57612b4d61211b565b5b600082013567ffffffffffffffff811115612b6c57612b6b612120565b5b612b78848285016123a5565b91505092915050565b6000602082019050612b96600083018461245e565b92915050565b60008115159050919050565b612bb181612b9c565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110612bf757612bf6612bb7565b5b50565b6000819050612c0882612be6565b919050565b6000612c1882612bfa565b9050919050565b612c2881612c0d565b82525050565b6000610160830160008301518482036000860152612c4c82826124b3565b91505060208301518482036020860152612c6682826124b3565b9150506040830151612c7b6040860182612ba8565b506060830151612c8e6060860182612c1f565b506080830151612ca160808601826124ec565b5060a0830151612cb460a08601826124ec565b5060c083015184820360c0860152612ccc82826124b3565b91505060e0830151612ce160e08601826126c8565b50610100830151612cf66101008601826126c8565b50610120830151612d0b6101208601826124ec565b50610140830151612d206101408601826124ec565b508091505092915050565b60006020820190508181036000830152612d458184612c2e565b905092915050565b60008060008060808587031215612d6757612d6661211b565b5b6000612d758782880161216e565b945050602085013567ffffffffffffffff811115612d9657612d95612120565b5b612da2878288016123a5565b935050604085013567ffffffffffffffff811115612dc357612dc2612120565b5b612dcf878288016123a5565b9250506060612de087828801612209565b91505092959194509250565b600080fd5b600060a08284031215612e0757612e06612dec565b5b81905092915050565b60008060408385031215612e2757612e2661211b565b5b600083013567ffffffffffffffff811115612e4557612e44612120565b5b612e51858286016123a5565b925050602083013567ffffffffffffffff811115612e7257612e71612120565b5b612e7e85828601612df1565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000610160830160008301518482036000860152612ed282826124b3565b91505060208301518482036020860152612eec82826124b3565b9150506040830151612f016040860182612ba8565b506060830151612f146060860182612c1f565b506080830151612f2760808601826124ec565b5060a0830151612f3a60a08601826124ec565b5060c083015184820360c0860152612f5282826124b3565b91505060e0830151612f6760e08601826126c8565b50610100830151612f7c6101008601826126c8565b50610120830151612f916101208601826124ec565b50610140830151612fa66101408601826124ec565b508091505092915050565b6000612fbd8383612eb4565b905092915050565b6000602082019050919050565b6000612fdd82612e88565b612fe78185612e93565b935083602082028501612ff985612ea4565b8060005b8581101561303557848403895281516130168582612fb1565b945061302183612fc5565b925060208a01995050600181019050612ffd565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b600061306e82613047565b6130788185613052565b9350613088818560208601612489565b61309181612297565b840191505092915050565b600060408301600083015184820360008601526130b98282613063565b91505060208301516130ce60208601826126eb565b508091505092915050565b600060408201905081810360008301526130f38185612fd2565b90508181036020830152613107818461309c565b90509392505050565b6000806000806080858703121561312a5761312961211b565b5b60006131388782880161216e565b945050602061314987828801612209565b935050604061315a87828801612209565b925050606085013567ffffffffffffffff81111561317b5761317a612120565b5b613187878288016123a5565b91505092959194509250565b6000806000604084860312156131ac576131ab61211b565b5b60006131ba8682870161216e565b935050602084013567ffffffffffffffff8111156131db576131da612120565b5b6131e786828701612192565b92509250509250925092565b600080fd5b600080fd5b600067ffffffffffffffff821115613218576132176122a8565b5b61322182612297565b9050602081019050919050565b600061324161323c846131fd565b612308565b90508281526020810184848401111561325d5761325c612292565b5b613268848285612354565b509392505050565b600082601f83011261328557613284612183565b5b813561329584826020860161322e565b91505092915050565b6132a7816126d7565b81146132b257600080fd5b50565b6000813590506132c48161329e565b92915050565b6132d381612b9c565b81146132de57600080fd5b50565b6000813590506132f0816132ca565b92915050565b600060a0828403121561330c5761330b6131f3565b5b61331660a0612308565b9050600082013567ffffffffffffffff811115613336576133356131f8565b5b61334284828501613270565b6000830152506020613356848285016132b5565b602083015250604061336a848285016132b5565b604083015250606061337e848285016132e1565b6060830152506080613392848285016132e1565b60808301525092915050565b600080600080608085870312156133b8576133b761211b565b5b60006133c68782880161216e565b945050602085013567ffffffffffffffff8111156133e7576133e6612120565b5b6133f3878288016123a5565b935050604085013567ffffffffffffffff81111561341457613413612120565b5b613420878288016123a5565b925050606085013567ffffffffffffffff81111561344157613440612120565b5b61344d878288016132f6565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060808301600083015184820360008601526134a282826124b3565b915050602083015184820360208601526134bc82826124b3565b915050604083015184820360408601526134d682826124b3565b915050606083015184820360608601526134f082826129bd565b9150508091505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60a08201600082015161353f6000850182612943565b50602082015161355260808501826124ec565b50505050565b60006135648383613529565b60a08301905092915050565b6000602082019050919050565b6000613588826134fd565b6135928185613508565b935061359d83613519565b8060005b838110156135ce5781516135b58882613558565b97506135c083613570565b9250506001810190506135a1565b5085935050505092915050565b600060408301600083015184820360008601526135f88282613485565b91505060208301518482036020860152613612828261357d565b9150508091505092915050565b600061362b83836135db565b905092915050565b6000602082019050919050565b600061364b82613459565b6136558185613464565b93508360208202850161366785613475565b8060005b858110156136a35784840389528151613684858261361f565b945061368f83613633565b925060208a0199505060018101905061366b565b50829750879550505050505092915050565b600060408201905081810360008301526136cf8185613640565b905081810360208301526136e3818461309c565b90509392505050565b6136f581612145565b82525050565b600082825260208201905092915050565b6000819050919050565b60006137228385612478565b935061372f838584612354565b61373883612297565b840190509392505050565b6000613750848484613716565b90509392505050565b600080fd5b600080fd5b600080fd5b6000808335600160200384360303811261378557613784613763565b5b83810192508235915060208301925067ffffffffffffffff8211156137ad576137ac613759565b5b6001820236038313156137c3576137c261375e565b5b509250929050565b6000602082019050919050565b60006137e483856136fb565b9350836020840285016137f68461370c565b8060005b8781101561383c5784840389526138118284613768565b61381c868284613743565b9550613827846137cb565b935060208b019a5050506001810190506137fa565b50829750879450505050509392505050565b600060608201905061386360008301876136ec565b613870602083018661245e565b81810360408301526138838184866137d8565b905095945050505050565b60008151905061389d816132ca565b92915050565b6000602082840312156138b9576138b861211b565b5b60006138c78482850161388e565b91505092915050565b600082825260208201905092915050565b7f4661696c656420746f20617070726f7665207374616b696e67206d6574686f6460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061393d6021836138d0565b9150613948826138e1565b604082019050919050565b6000602082019050818103600083015261396c81613930565b9050919050565b600061397e8261246d565b61398881856138d0565b9350613998818560208601612489565b6139a181612297565b840191505092915050565b60006040820190506139c160008301856136ec565b81810360208301526139d38184613973565b90509392505050565b600081905092915050565b60006139f28261246d565b6139fc81856139dc565b9350613a0c818560208601612489565b80840191505092915050565b6000613a2482846139e7565b915081905092915050565b7f64656c656761746563616c6c0000000000000000000000000000000000000000600082015250565b6000613a65600c836139dc565b9150613a7082613a2f565b600c82019050919050565b6000613a8682613a58565b9150819050919050565b600081905092915050565b6000613aa682613047565b613ab08185613a90565b9350613ac0818560208601612489565b80840191505092915050565b6000613ad88284613a9b565b915081905092915050565b7f6661696c65642064656c656761746563616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000613b3f6021836138d0565b9150613b4a82613ae3565b604082019050919050565b60006020820190508181036000830152613b6e81613b32565b9050919050565b600081519050613b84816121f2565b92915050565b6000613b9d613b9884612323565b612308565b905082815260208101848484011115613bb957613bb8612292565b5b613bc4848285612489565b509392505050565b600082601f830112613be157613be0612183565b5b8151613bf1848260208601613b8a565b91505092915050565b600060408284031215613c1057613c0f6131f3565b5b613c1a6040612308565b9050600082015167ffffffffffffffff811115613c3a57613c396131f8565b5b613c4684828501613bcc565b6000830152506020613c5a84828501613b75565b60208301525092915050565b60008060408385031215613c7d57613c7c61211b565b5b6000613c8b85828601613b75565b925050602083015167ffffffffffffffff811115613cac57613cab612120565b5b613cb885828601613bfa565b9150509250929050565b7f73746174696363616c6c00000000000000000000000000000000000000000000600082015250565b6000613cf8600a836139dc565b9150613d0382613cc2565b600a82019050919050565b6000613d1982613ceb565b9150819050919050565b7f6661696c65642073746174696363616c6c20746f20707265636f6d70696c6500600082015250565b6000613d59601f836138d0565b9150613d6482613d23565b602082019050919050565b60006020820190508181036000830152613d8881613d4c565b9050919050565b7f63616c6c00000000000000000000000000000000000000000000000000000000600082015250565b6000613dc56004836139dc565b9150613dd082613d8f565b600482019050919050565b6000613de682613db8565b9150819050919050565b7f6661696c65642063616c6c20746f20707265636f6d70696c6500000000000000600082015250565b6000613e266019836138d0565b9150613e3182613df0565b602082019050919050565b60006020820190508181036000830152613e5581613e19565b9050919050565b7f63616c6c636f6465000000000000000000000000000000000000000000000000600082015250565b6000613e926008836139dc565b9150613e9d82613e5c565b600882019050919050565b6000613eb382613e85565b9150819050919050565b7f696e76616c69642063616c6c7479706500000000000000000000000000000000600082015250565b6000613ef36010836138d0565b9150613efe82613ebd565b602082019050919050565b60006020820190508181036000830152613f2281613ee6565b9050919050565b600081549050919050565b60008190508160005260206000209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613f9057607f821691505b602082108103613fa357613fa2613f49565b5b50919050565b60008190508160005260206000209050919050565b60008154613fcb81613f78565b613fd58186612478565b94506001821660008114613ff0576001811461400657614039565b60ff198316865281151560200286019350614039565b61400f85613fa9565b60005b8381101561403157815481890152600182019150602081019050614012565b808801955050505b50505092915050565b600061404e8383613fbe565b905092915050565b6000600182019050919050565b600061406e82613f29565b61407881856136fb565b93508360208202850161408a85613f34565b8060005b858110156140c5578484038952816140a68582614042565b94506140b183614056565b925060208a0199505060018101905061408e565b50829750879550505050505092915050565b60006060820190506140ec60008301866136ec565b6140f9602083018561245e565b818103604083015261410b8184614063565b9050949350505050565b7f64656c65676174696f6e20617070726f76616c206661696c6564000000000000600082015250565b600061414b601a836138d0565b915061415682614115565b602082019050919050565b6000602082019050818103600083015261417a8161413e565b9050919050565b600060408201905061419660008301856136ec565b6141a3602083018461245e565b9392505050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b60006141e0600f836138d0565b91506141eb826141aa565b602082019050919050565b6000602082019050818103600083015261420f816141d3565b9050919050565b600060608201905061422b60008301866136ec565b818103602083015261423d8185613973565b905061424c604083018461245e565b949350505050565b7f5374616b696e6720417070726f7665206661696c656400000000000000000000600082015250565b600061428a6016836138d0565b915061429582614254565b602082019050919050565b600060208201905081810360008301526142b98161427d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006142fa826121e8565b9150614305836121e8565b925082820190508082111561431d5761431c6142c0565b5b92915050565b600067ffffffffffffffff82111561433e5761433d6122a8565b5b602082029050602081019050919050565b614358816126bb565b811461436357600080fd5b50565b6000815190506143758161434f565b92915050565b60008151905061438a8161329e565b92915050565b600060c082840312156143a6576143a56131f3565b5b6143b060c0612308565b905060006143c084828501614366565b60008301525060206143d484828501614366565b60208301525060406143e884828501613b75565b60408301525060606143fc84828501613b75565b60608301525060806144108482850161437b565b60808301525060a061442484828501614366565b60a08301525092915050565b600061444361443e84614323565b612308565b90508083825260208201905060c084028301858111156144665761446561218d565b5b835b8181101561448f578061447b8882614390565b84526020840193505060c081019050614468565b5050509392505050565b600082601f8301126144ae576144ad612183565b5b81516144be848260208601614430565b91505092915050565b6000606082840312156144dd576144dc6131f3565b5b6144e76060612308565b9050600082015167ffffffffffffffff811115614507576145066131f8565b5b61451384828501613bcc565b600083015250602082015167ffffffffffffffff811115614537576145366131f8565b5b61454384828501613bcc565b602083015250604082015167ffffffffffffffff811115614567576145666131f8565b5b61457384828501614499565b60408301525092915050565b6000602082840312156145955761459461211b565b5b600082015167ffffffffffffffff8111156145b3576145b2612120565b5b6145bf848285016144c7565b91505092915050565b60006060820190506145dd60008301866136ec565b81810360208301526145ef8185613973565b905081810360408301526146038184613973565b9050949350505050565b600067ffffffffffffffff821115614628576146276122a8565b5b602082029050602081019050919050565b60006080828403121561464f5761464e6131f3565b5b6146596080612308565b9050600061466984828501614366565b600083015250602061467d84828501614366565b602083015250604061469184828501613b75565b60408301525060606146a584828501613b75565b60608301525092915050565b60006146c46146bf8461460d565b612308565b905080838252602082019050608084028301858111156146e7576146e661218d565b5b835b8181101561471057806146fc8882614639565b8452602084019350506080810190506146e9565b5050509392505050565b600082601f83011261472f5761472e612183565b5b815161473f8482602086016146b1565b91505092915050565b60006080828403121561475e5761475d6131f3565b5b6147686080612308565b9050600082015167ffffffffffffffff811115614788576147876131f8565b5b61479484828501613bcc565b600083015250602082015167ffffffffffffffff8111156147b8576147b76131f8565b5b6147c484828501613bcc565b602083015250604082015167ffffffffffffffff8111156147e8576147e76131f8565b5b6147f484828501613bcc565b604083015250606082015167ffffffffffffffff811115614818576148176131f8565b5b6148248482850161471a565b60608301525092915050565b6000602082840312156148465761484561211b565b5b600082015167ffffffffffffffff81111561486457614863612120565b5b61487084828501614748565b91505092915050565b600060808201905061488e60008301876136ec565b81810360208301526148a08186613973565b90506148af604083018561245e565b6148bc606083018461245e565b95945050505050565b7f44656c656761746520417070726f7665206661696c6564000000000000000000600082015250565b60006148fb6017836138d0565b9150614906826148c5565b602082019050919050565b6000602082019050818103600083015261492a816148ee565b9050919050565b6000602082840312156149475761494661211b565b5b600061495584828501614366565b91505092915050565b600060208201905081810360008301526149788184613973565b905092915050565b6004811061498d57600080fd5b50565b60008151905061499f81614980565b92915050565b600061016082840312156149bc576149bb6131f3565b5b6149c7610160612308565b9050600082015167ffffffffffffffff8111156149e7576149e66131f8565b5b6149f384828501613bcc565b600083015250602082015167ffffffffffffffff811115614a1757614a166131f8565b5b614a2384828501613bcc565b6020830152506040614a378482850161388e565b6040830152506060614a4b84828501614990565b6060830152506080614a5f84828501613b75565b60808301525060a0614a7384828501613b75565b60a08301525060c082015167ffffffffffffffff811115614a9757614a966131f8565b5b614aa384828501613bcc565b60c08301525060e0614ab784828501614366565b60e083015250610100614acc84828501614366565b61010083015250610120614ae284828501613b75565b61012083015250610140614af884828501613b75565b6101408301525092915050565b600060208284031215614b1b57614b1a61211b565b5b600082015167ffffffffffffffff811115614b3957614b38612120565b5b614b45848285016149a5565b91505092915050565b6000608082019050614b6360008301876136ec565b8181036020830152614b758186613973565b90508181036040830152614b898185613973565b9050614b98606083018461245e565b95945050505050565b60008083356001602003843603038112614bbe57614bbd613763565b5b83810192508235915060208301925067ffffffffffffffff821115614be657614be5613759565b5b600182023603831315614bfc57614bfb61375e565b5b509250929050565b6000614c108385613052565b9350614c1d838584612354565b614c2683612297565b840190509392505050565b6000614c4060208401846132b5565b905092915050565b6000614c5760208401846132e1565b905092915050565b600060a08301614c726000840184614ba1565b8583036000870152614c85838284614c04565b92505050614c966020840184614c31565b614ca360208601826126eb565b50614cb16040840184614c31565b614cbe60408601826126eb565b50614ccc6060840184614c48565b614cd96060860182612ba8565b50614ce76080840184614c48565b614cf46080860182612ba8565b508091505092915050565b60006040820190508181036000830152614d198185613973565b90508181036020830152614d2d8184614c5f565b90509392505050565b600067ffffffffffffffff821115614d5157614d506122a8565b5b602082029050602081019050919050565b6000614d75614d7084614d36565b612308565b90508083825260208201905060208402830185811115614d9857614d9761218d565b5b835b81811015614ddf57805167ffffffffffffffff811115614dbd57614dbc612183565b5b808601614dca89826149a5565b85526020850194505050602081019050614d9a565b5050509392505050565b600082601f830112614dfe57614dfd612183565b5b8151614e0e848260208601614d62565b91505092915050565b6000614e2a614e25846131fd565b612308565b905082815260208101848484011115614e4657614e45612292565b5b614e51848285612489565b509392505050565b600082601f830112614e6e57614e6d612183565b5b8151614e7e848260208601614e17565b91505092915050565b600060408284031215614e9d57614e9c6131f3565b5b614ea76040612308565b9050600082015167ffffffffffffffff811115614ec757614ec66131f8565b5b614ed384828501614e59565b6000830152506020614ee78482850161437b565b60208301525092915050565b60008060408385031215614f0a57614f0961211b565b5b600083015167ffffffffffffffff811115614f2857614f27612120565b5b614f3485828601614de9565b925050602083015167ffffffffffffffff811115614f5557614f54612120565b5b614f6185828601614e87565b9150509250929050565b6000606082019050614f8060008301866136ec565b614f8d60208301856136ec565b8181036040830152614f9f8184613973565b9050949350505050565b600060208284031215614fbf57614fbe61211b565b5b6000614fcd84828501613b75565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b6000819050602082019050919050565b600061502c83836124b3565b905092915050565b6000602082019050919050565b600061504c82615005565b61505681856136fb565b93508360208202850161506885615010565b8060005b858110156150a457848403895281516150858582615020565b945061509083615034565b925060208a0199505060018101905061506c565b50829750879550505050505092915050565b60006060820190506150cb60008301866136ec565b6150d8602083018561245e565b81810360408301526150ea8184615041565b9050949350505050565b7f6661696c656420746f20617070726f766520756e64656c65676174696f6e206d60008201527f6574686f64000000000000000000000000000000000000000000000000000000602082015250565b60006151506025836138d0565b915061515b826150f4565b604082019050919050565b6000602082019050818103600083015261517f81615143565b9050919050565b600060408201905061519b60008301866136ec565b81810360208301526151ae8184866137d8565b9050949350505050565b7f4661696c656420746f207265766f6b6520617070726f76616c20666f7220737460008201527f616b696e67206d6574686f647300000000000000000000000000000000000000602082015250565b6000615214602d836138d0565b915061521f826151b8565b604082019050919050565b6000602082019050818103600083015261524381615207565b9050919050565b600060a08301600083015184820360008601526152678282613063565b915050602083015161527c60208601826126eb565b50604083015161528f60408601826126eb565b5060608301516152a26060860182612ba8565b5060808301516152b56080860182612ba8565b508091505092915050565b60006080820190506152d560008301876136ec565b81810360208301526152e78186613973565b905081810360408301526152fb8185613973565b9050818103606083015261530f818461524a565b905095945050505050565b600067ffffffffffffffff821115615335576153346122a8565b5b602082029050602081019050919050565b60006080828403121561535c5761535b6131f3565b5b6153666080612308565b9050600082015167ffffffffffffffff811115615386576153856131f8565b5b61539284828501613bcc565b600083015250602082015167ffffffffffffffff8111156153b6576153b56131f8565b5b6153c284828501613bcc565b602083015250604082015167ffffffffffffffff8111156153e6576153e56131f8565b5b6153f284828501613bcc565b604083015250606082015167ffffffffffffffff811115615416576154156131f8565b5b6154228482850161471a565b60608301525092915050565b600067ffffffffffffffff821115615449576154486122a8565b5b602082029050602081019050919050565b600060a082840312156154705761546f6131f3565b5b61547a6040612308565b9050600061548a84828501614639565b600083015250608061549e84828501613b75565b60208301525092915050565b60006154bd6154b88461542e565b612308565b90508083825260208201905060a084028301858111156154e0576154df61218d565b5b835b8181101561550957806154f5888261545a565b84526020840193505060a0810190506154e2565b5050509392505050565b600082601f83011261552857615527612183565b5b81516155388482602086016154aa565b91505092915050565b600060408284031215615557576155566131f3565b5b6155616040612308565b9050600082015167ffffffffffffffff811115615581576155806131f8565b5b61558d84828501615346565b600083015250602082015167ffffffffffffffff8111156155b1576155b06131f8565b5b6155bd84828501615513565b60208301525092915050565b60006155dc6155d78461531a565b612308565b905080838252602082019050602084028301858111156155ff576155fe61218d565b5b835b8181101561564657805167ffffffffffffffff81111561562457615623612183565b5b8086016156318982615541565b85526020850194505050602081019050615601565b5050509392505050565b600082601f83011261566557615664612183565b5b81516156758482602086016155c9565b91505092915050565b600080604083850312156156955761569461211b565b5b600083015167ffffffffffffffff8111156156b3576156b2612120565b5b6156bf85828601615650565b925050602083015167ffffffffffffffff8111156156e0576156df612120565b5b6156ec85828601614e87565b915050925092905056fe2f636f736d6f732e7374616b696e672e763162657461312e4d7367556e64656c6567617465a26469706673582212209f5ff7a1cd36ef190a842d0328bc0ab39b30a165eafcd11a415c09348da2a2d464736f6c634300081200332f636f736d6f732e7374616b696e672e763162657461312e4d736744656c6567617465" + "abi": "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"}],\"name\":\"approveDepositAndDelegate\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"}],\"name\":\"approveDepositAndDelegateExceedingAllowance\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"}],\"name\":\"approveDepositDelegateAndFailCustomLogic\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"callERC20AndDelegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"counter\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_grantee\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"method\",\"type\":\"string\"}],\"name\":\"getAllowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"}],\"name\":\"getDelegation\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"struct Coin\",\"name\":\"balance\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_validatorSrcAddr\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_validatorDstAddr\",\"type\":\"string\"}],\"name\":\"getRedelegation\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"delegatorAddress\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"validatorSrcAddress\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"validatorDstAddress\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"int64\",\"name\":\"creationHeight\",\"type\":\"int64\"},{\"internalType\":\"int64\",\"name\":\"completionTime\",\"type\":\"int64\"},{\"internalType\":\"uint256\",\"name\":\"initialBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sharesDst\",\"type\":\"uint256\"}],\"internalType\":\"struct RedelegationEntry[]\",\"name\":\"entries\",\"type\":\"tuple[]\"}],\"internalType\":\"struct RedelegationOutput\",\"name\":\"redelegation\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_delegatorAddr\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_validatorSrcAddr\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_validatorDstAddr\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"key\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"offset\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"limit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"countTotal\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"reverse\",\"type\":\"bool\"}],\"internalType\":\"struct PageRequest\",\"name\":\"_pageRequest\",\"type\":\"tuple\"}],\"name\":\"getRedelegations\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"delegatorAddress\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"validatorSrcAddress\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"validatorDstAddress\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"int64\",\"name\":\"creationHeight\",\"type\":\"int64\"},{\"internalType\":\"int64\",\"name\":\"completionTime\",\"type\":\"int64\"},{\"internalType\":\"uint256\",\"name\":\"initialBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sharesDst\",\"type\":\"uint256\"}],\"internalType\":\"struct RedelegationEntry[]\",\"name\":\"entries\",\"type\":\"tuple[]\"}],\"internalType\":\"struct Redelegation\",\"name\":\"redelegation\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"internalType\":\"int64\",\"name\":\"creationHeight\",\"type\":\"int64\"},{\"internalType\":\"int64\",\"name\":\"completionTime\",\"type\":\"int64\"},{\"internalType\":\"uint256\",\"name\":\"initialBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sharesDst\",\"type\":\"uint256\"}],\"internalType\":\"struct RedelegationEntry\",\"name\":\"redelegationEntry\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"internalType\":\"struct RedelegationEntryResponse[]\",\"name\":\"entries\",\"type\":\"tuple[]\"}],\"internalType\":\"struct RedelegationResponse[]\",\"name\":\"response\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nextKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"total\",\"type\":\"uint64\"}],\"internalType\":\"struct PageResponse\",\"name\":\"pageResponse\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"}],\"name\":\"getUnbondingDelegation\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"delegatorAddress\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"validatorAddress\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"int64\",\"name\":\"creationHeight\",\"type\":\"int64\"},{\"internalType\":\"int64\",\"name\":\"completionTime\",\"type\":\"int64\"},{\"internalType\":\"uint256\",\"name\":\"initialBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"unbondingId\",\"type\":\"uint64\"},{\"internalType\":\"int64\",\"name\":\"unbondingOnHoldRefCount\",\"type\":\"int64\"}],\"internalType\":\"struct UnbondingDelegationEntry[]\",\"name\":\"entries\",\"type\":\"tuple[]\"}],\"internalType\":\"struct UnbondingDelegationOutput\",\"name\":\"unbondingDelegation\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_validatorAddr\",\"type\":\"address\"}],\"name\":\"getValidator\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"operatorAddress\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"consensusPubkey\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"jailed\",\"type\":\"bool\"},{\"internalType\":\"enum BondStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"delegatorShares\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"int64\",\"name\":\"unbondingHeight\",\"type\":\"int64\"},{\"internalType\":\"int64\",\"name\":\"unbondingTime\",\"type\":\"int64\"},{\"internalType\":\"uint256\",\"name\":\"commission\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minSelfDelegation\",\"type\":\"uint256\"}],\"internalType\":\"struct Validator\",\"name\":\"validator\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_status\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"key\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"offset\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"limit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"countTotal\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"reverse\",\"type\":\"bool\"}],\"internalType\":\"struct PageRequest\",\"name\":\"_pageRequest\",\"type\":\"tuple\"}],\"name\":\"getValidators\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"operatorAddress\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"consensusPubkey\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"jailed\",\"type\":\"bool\"},{\"internalType\":\"enum BondStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"delegatorShares\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"int64\",\"name\":\"unbondingHeight\",\"type\":\"int64\"},{\"internalType\":\"int64\",\"name\":\"unbondingTime\",\"type\":\"int64\"},{\"internalType\":\"uint256\",\"name\":\"commission\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minSelfDelegation\",\"type\":\"uint256\"}],\"internalType\":\"struct Validator[]\",\"name\":\"validators\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nextKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"total\",\"type\":\"uint64\"}],\"internalType\":\"struct PageResponse\",\"name\":\"pageResponse\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"},{\"internalType\":\"string[]\",\"name\":\"_methods\",\"type\":\"string[]\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"testApprove\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_approveAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_undelegateAmount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"}],\"name\":\"testApproveAndThenUndelegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_calltype\",\"type\":\"string\"}],\"name\":\"testCallDelegation\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"struct Coin\",\"name\":\"coin\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_calltype\",\"type\":\"string\"}],\"name\":\"testCallUndelegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_creationHeight\",\"type\":\"uint256\"}],\"name\":\"testCancelUnbonding\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"testDelegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"testDelegateIncrementCounter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_validatorSrcAddr\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_validatorDstAddr\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"testRedelegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_grantee\",\"type\":\"address\"},{\"internalType\":\"string[]\",\"name\":\"_methods\",\"type\":\"string[]\"}],\"name\":\"testRevoke\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"testUndelegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + "bin": "6080604052604051806020016040528060405180606001604052806023815260200162005c286023913981525060019060016200003e92919062000053565b503480156200004c57600080fd5b50620004a1565b828054828255906000526020600020908101928215620000a0579160200282015b828111156200009f5782518290816200008e9190620003ba565b509160200191906001019062000074565b5b509050620000af9190620000b3565b5090565b5b80821115620000d75760008181620000cd9190620000db565b50600101620000b4565b5090565b508054620000e990620001a9565b6000825580601f10620000fd57506200011e565b601f0160209004906000526020600020908101906200011d919062000121565b5b50565b5b808211156200013c57600081600090555060010162000122565b5090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620001c257607f821691505b602082108103620001d857620001d76200017a565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620002427fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000203565b6200024e868362000203565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200029b620002956200028f8462000266565b62000270565b62000266565b9050919050565b6000819050919050565b620002b7836200027a565b620002cf620002c682620002a2565b84845462000210565b825550505050565b600090565b620002e6620002d7565b620002f3818484620002ac565b505050565b5b818110156200031b576200030f600082620002dc565b600181019050620002f9565b5050565b601f8211156200036a576200033481620001de565b6200033f84620001f3565b810160208510156200034f578190505b620003676200035e85620001f3565b830182620002f8565b50505b505050565b600082821c905092915050565b60006200038f600019846008026200036f565b1980831691505092915050565b6000620003aa83836200037c565b9150826002028217905092915050565b620003c58262000140565b67ffffffffffffffff811115620003e157620003e06200014b565b5b620003ed8254620001a9565b620003fa8282856200031f565b600060209050601f8311600181146200043257600084156200041d578287015190505b6200042985826200039c565b86555062000499565b601f1984166200044286620001de565b60005b828110156200046c5784890151825560018201915060208501945060208101905062000445565b868310156200048c578489015162000488601f8916826200037c565b8355505b6001600288020188555050505b505050505050565b61577780620004b16000396000f3fe6080604052600436106101355760003560e01c80637e51b811116100ab578063cf2753cf1161006f578063cf2753cf14610418578063ec9485df14610456578063f40a214614610493578063f5714e64146104bc578063f700dbd2146104d8578063f732b0651461050157610135565b80637e51b811146103435780638939e7831461036c5780638edb3f8b146103955780639eab6711146103b1578063b13d4242146103da57610135565b8063455b8551116100fd578063455b85511461023057806355dc4b221461026d578063570467ac146102965780635e269bfe146102d357806360deaa2a146102fc57806361bc221a1461031857610135565b80630a4433e21461013a5780631904bb2e1461016357806319b16c4c146101a057806331bcbcb3146101de5780633566cb9514610207575b600080fd5b34801561014657600080fd5b50610161600480360381019061015c919061221e565b61053f565b005b34801561016f57600080fd5b5061018a60048036038101906101859190612292565b61060e565b6040516101979190612509565b60405180910390f35b3480156101ac57600080fd5b506101c760048036038101906101c2919061265b565b61069e565b6040516101d5929190612732565b60405180910390f35b3480156101ea57600080fd5b5061020560048036038101906102009190612762565b610b9d565b005b34801561021357600080fd5b5061022e600480360381019061022991906127d1565b610e2a565b005b34801561023c57600080fd5b506102576004803603810190610252919061282d565b610f92565b6040516102649190612a34565b60405180910390f35b34801561027957600080fd5b50610294600480360381019061028f9190612a56565b611025565b005b3480156102a257600080fd5b506102bd60048036038101906102b8919061265b565b611417565b6040516102ca9190612c71565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f59190612c93565b6114ad565b005b61031660048036038101906103119190612d16565b611538565b005b34801561032457600080fd5b5061032d611686565b60405161033a9190612d5f565b60405180910390f35b34801561034f57600080fd5b5061036a60048036038101906103659190612762565b61168c565b005b34801561037857600080fd5b50610393600480360381019061038e9190612762565b611714565b005b6103af60048036038101906103aa9190612d16565b61179c565b005b3480156103bd57600080fd5b506103d860048036038101906103d39190612d7a565b611931565b005b3480156103e657600080fd5b5061040160048036038101906103fc9190612e3d565b6119bc565b60405161040f929190613106565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a919061282d565b611a54565b60405161044d929190612732565b60405180910390f35b34801561046257600080fd5b5061047d6004803603810190610478919061282d565b611aec565b60405161048a9190612d5f565b60405180910390f35b34801561049f57600080fd5b506104ba60048036038101906104b5919061313d565b611b76565b005b6104d660048036038101906104d19190612d16565b611d52565b005b3480156104e457600080fd5b506104ff60048036038101906104fa91906131c0565b611eac565b005b34801561050d57600080fd5b50610528600480360381019061052391906133cb565b611f78565b6040516105369291906136e2565b60405180910390f35b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895868487876040518563ffffffff1660e01b8152600401610582949392919061387b565b6020604051808303816000875af11580156105a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c591906138d0565b905080610607576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105fe90613980565b60405180910390fd5b5050505050565b610616612016565b61080073ffffffffffffffffffffffffffffffffffffffff1663223b3b7a836040518263ffffffff1660e01b815260040161065191906139a0565b600060405180830381865afa15801561066e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906106979190613bf1565b9050919050565b60006106a861208a565b60006108009050600086866040516024016106c4929190613c73565b6040516020818303038152906040527f241774e6000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000856040516020016107569190613cdf565b60405160208183030381529060405280519060200120905060405160200161077d90613d42565b604051602081830303815290604052805190602001208103610869576000808473ffffffffffffffffffffffffffffffffffffffff16846040516107c19190613d93565b600060405180830381855af49150503d80600081146107fc576040519150601f19603f3d011682016040523d82523d6000602084013e610801565b606091505b509150915081610846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083d90613e1c565b60405180910390fd5b8080602001905181019061085a9190613ea8565b80975081985050505050610b92565b60405160200161087890613f50565b604051602081830303815290604052805190602001208103610964576000808473ffffffffffffffffffffffffffffffffffffffff16846040516108bc9190613d93565b600060405180830381855afa9150503d80600081146108f7576040519150601f19603f3d011682016040523d82523d6000602084013e6108fc565b606091505b509150915081610941576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093890613fb1565b60405180910390fd5b808060200190518101906109559190613ea8565b80975081985050505050610b91565b6040516020016109739061401d565b604051602081830303815290604052805190602001208103610a61576000808473ffffffffffffffffffffffffffffffffffffffff16846040516109b79190613d93565b6000604051808303816000865af19150503d80600081146109f4576040519150601f19603f3d011682016040523d82523d6000602084013e6109f9565b606091505b509150915081610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a359061407e565b60405180910390fd5b80806020019051810190610a529190613ea8565b80975081985050505050610b90565b604051602001610a70906140ea565b604051602081830303815290604052805190602001208103610b545760006040518060400160405280601a81526020017f64656c65676174696f6e28616464726573732c737472696e6729000000000000815250805190602001209050600060a490506060600060208b01516020808d0101516040518681528e6004820152604060248201526033604482015282606482015281608482015260c081878360008e5af281519c5060608201519450610100820160405280610b3057600080fd5b50505050604051806040016040528083815260200182815250975050505050610b8f565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b869061414b565b60405180910390fd5b5b5b5b505050935093915050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610bdf93929190614319565b6020604051808303816000875af1158015610bfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2291906138d0565b905080610c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5b906143a3565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff163384604051602401610c909291906143c3565b6040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610d1a9190613d93565b6000604051808303816000865af19150503d8060008114610d57576040519150601f19603f3d011682016040523d82523d6000602084013e610d5c565b606091505b5050905080610da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9790614438565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3386866040518463ffffffff1660e01b8152600401610ddf93929190614458565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906138d0565b505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610e6c93929190614319565b6020604051808303816000875af1158015610e8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eaf91906138d0565b905080610ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee8906144e2565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3085856040518463ffffffff1660e01b8152600401610f3093929190614458565b6020604051808303816000875af1158015610f4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7391906138d0565b506001600080828254610f869190614531565b92505081905550505050565b610f9a6120a4565b61080073ffffffffffffffffffffffffffffffffffffffff1663a03ffee184846040518363ffffffff1660e01b8152600401610fd7929190613c73565b600060405180830381865afa158015610ff4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061101d9190614795565b905092915050565b60006108009050600085858560405160240161104393929190614458565b6040516020818303038152906040527f3edab33c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000836040516020016110d59190613cdf565b6040516020818303038152906040528051906020012090506040516020016110fc90613d42565b6040516020818303038152906040528051906020012081036111c95760008373ffffffffffffffffffffffffffffffffffffffff168360405161113f9190613d93565b600060405180830381855af49150503d806000811461117a576040519150601f19603f3d011682016040523d82523d6000602084013e61117f565b606091505b50509050806111c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ba90613e1c565b60405180910390fd5b5061140e565b6040516020016111d890613f50565b6040516020818303038152906040528051906020012081036112a55760008373ffffffffffffffffffffffffffffffffffffffff168360405161121b9190613d93565b600060405180830381855afa9150503d8060008114611256576040519150601f19603f3d011682016040523d82523d6000602084013e61125b565b606091505b505090508061129f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129690613fb1565b60405180910390fd5b5061140d565b6040516020016112b49061401d565b6040516020818303038152906040528051906020012081036113835760008373ffffffffffffffffffffffffffffffffffffffff16836040516112f79190613d93565b6000604051808303816000865af19150503d8060008114611334576040519150601f19603f3d011682016040523d82523d6000602084013e611339565b606091505b505090508061137d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113749061407e565b60405180910390fd5b5061140c565b604051602001611392906140ea565b6040516020818303038152906040528051906020012081036113d05760208201825160008082846000895af2806113c857600080fd5b50505061140b565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114029061414b565b60405180910390fd5b5b5b5b50505050505050565b61141f6120c5565b61080073ffffffffffffffffffffffffffffffffffffffff16637d9f939c8585856040518463ffffffff1660e01b815260040161145e939291906147de565b600060405180830381865afa15801561147b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906114a49190614a46565b90509392505050565b61080073ffffffffffffffffffffffffffffffffffffffff166312d58dfe858585856040518563ffffffff1660e01b81526004016114ee9493929190614a8f565b6020604051808303816000875af115801561150d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153191906138d0565b5050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895303460016040518463ffffffff1660e01b815260040161157a93929190614319565b6020604051808303816000875af1158015611599573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115bd91906138d0565b9050806115ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f690614b27565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b815260040161163e93929190614458565b6020604051808303816000875af115801561165d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168191906138d0565b505050565b60005481565b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c8484846040518463ffffffff1660e01b81526004016116cb93929190614458565b6020604051808303816000875af11580156116ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170e9190614b47565b50505050565b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb8484846040518463ffffffff1660e01b815260040161175393929190614458565b6020604051808303816000875af1158015611772573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179691906138d0565b50505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b81526004016117de93929190614319565b6020604051808303816000875af11580156117fd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182191906138d0565b905080611863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185a90614b27565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b81526004016118a293929190614458565b6020604051808303816000875af11580156118c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e591906138d0565b503373ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f1935050505015801561192c573d6000803e3d6000fd5b505050565b61080073ffffffffffffffffffffffffffffffffffffffff166354b826f5858585856040518563ffffffff1660e01b81526004016119729493929190614b74565b6020604051808303816000875af1158015611991573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b59190614b47565b5050505050565b60606119c66120ed565b61080073ffffffffffffffffffffffffffffffffffffffff1663186b216785856040518363ffffffff1660e01b8152600401611a03929190614d25565b600060405180830381865afa158015611a20573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611a499190614f19565b915091509250929050565b6000611a5e61208a565b61080073ffffffffffffffffffffffffffffffffffffffff1663241774e685856040518363ffffffff1660e01b8152600401611a9b929190613c73565b600060405180830381865afa158015611ab8573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611ae19190613ea8565b915091509250929050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663fc08930c8433856040518463ffffffff1660e01b8152600401611b2d93929190614f91565b602060405180830381865afa158015611b4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6e9190614fcf565b905092915050565b6000600167ffffffffffffffff811115611b9357611b92612530565b5b604051908082528060200260200182016040528015611bc657816020015b6060815260200190600190039081611bb15790505b50905060405180606001604052806025815260200161571d6025913981600081518110611bf657611bf5614ffc565b5b6020026020010181905250600061080073ffffffffffffffffffffffffffffffffffffffff1663b60398958787856040518463ffffffff1660e01b8152600401611c42939291906150dc565b6020604051808303816000875af1158015611c61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8591906138d0565b905080611cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbe9061518c565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c3285876040518463ffffffff1660e01b8152600401611d0693929190614458565b6020604051808303816000875af1158015611d25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d499190614b47565b50505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b8152600401611d9493929190614319565b6020604051808303816000875af1158015611db3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd791906138d0565b905080611e19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1090614b27565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084600134611e469190614531565b6040518463ffffffff1660e01b8152600401611e6493929190614458565b6020604051808303816000875af1158015611e83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea791906138d0565b505050565b600061080073ffffffffffffffffffffffffffffffffffffffff166361dc5c3b8585856040518463ffffffff1660e01b8152600401611eed939291906151ac565b6020604051808303816000875af1158015611f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f3091906138d0565b905080611f72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6990615250565b60405180910390fd5b50505050565b6060611f826120ed565b61080073ffffffffffffffffffffffffffffffffffffffff166310a2851c878787876040518563ffffffff1660e01b8152600401611fc394939291906152e6565b600060405180830381865afa158015611fe0573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061200991906156a4565b9150915094509492505050565b60405180610160016040528060608152602001606081526020016000151581526020016000600381111561204d5761204c61236a565b5b8152602001600081526020016000815260200160608152602001600060070b8152602001600060070b815260200160008152602001600081525090565b604051806040016040528060608152602001600081525090565b60405180606001604052806060815260200160608152602001606081525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061215082612125565b9050919050565b61216081612145565b811461216b57600080fd5b50565b60008135905061217d81612157565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126121a8576121a7612183565b5b8235905067ffffffffffffffff8111156121c5576121c4612188565b5b6020830191508360208202830111156121e1576121e061218d565b5b9250929050565b6000819050919050565b6121fb816121e8565b811461220657600080fd5b50565b600081359050612218816121f2565b92915050565b600080600080606085870312156122385761223761211b565b5b60006122468782880161216e565b945050602085013567ffffffffffffffff81111561226757612266612120565b5b61227387828801612192565b9350935050604061228687828801612209565b91505092959194509250565b6000602082840312156122a8576122a761211b565b5b60006122b68482850161216e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156122f95780820151818401526020810190506122de565b60008484015250505050565b6000601f19601f8301169050919050565b6000612321826122bf565b61232b81856122ca565b935061233b8185602086016122db565b61234481612305565b840191505092915050565b60008115159050919050565b6123648161234f565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106123aa576123a961236a565b5b50565b60008190506123bb82612399565b919050565b60006123cb826123ad565b9050919050565b6123db816123c0565b82525050565b6123ea816121e8565b82525050565b60008160070b9050919050565b612406816123f0565b82525050565b600061016083016000830151848203600086015261242a8282612316565b915050602083015184820360208601526124448282612316565b9150506040830151612459604086018261235b565b50606083015161246c60608601826123d2565b50608083015161247f60808601826123e1565b5060a083015161249260a08601826123e1565b5060c083015184820360c08601526124aa8282612316565b91505060e08301516124bf60e08601826123fd565b506101008301516124d46101008601826123fd565b506101208301516124e96101208601826123e1565b506101408301516124fe6101408601826123e1565b508091505092915050565b60006020820190508181036000830152612523818461240c565b905092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61256882612305565b810181811067ffffffffffffffff8211171561258757612586612530565b5b80604052505050565b600061259a612111565b90506125a6828261255f565b919050565b600067ffffffffffffffff8211156125c6576125c5612530565b5b6125cf82612305565b9050602081019050919050565b82818337600083830152505050565b60006125fe6125f9846125ab565b612590565b90508281526020810184848401111561261a5761261961252b565b5b6126258482856125dc565b509392505050565b600082601f83011261264257612641612183565b5b81356126528482602086016125eb565b91505092915050565b6000806000606084860312156126745761267361211b565b5b60006126828682870161216e565b935050602084013567ffffffffffffffff8111156126a3576126a2612120565b5b6126af8682870161262d565b925050604084013567ffffffffffffffff8111156126d0576126cf612120565b5b6126dc8682870161262d565b9150509250925092565b6126ef816121e8565b82525050565b600060408301600083015184820360008601526127128282612316565b915050602083015161272760208601826123e1565b508091505092915050565b600060408201905061274760008301856126e6565b818103602083015261275981846126f5565b90509392505050565b60008060006060848603121561277b5761277a61211b565b5b60006127898682870161216e565b935050602084013567ffffffffffffffff8111156127aa576127a9612120565b5b6127b68682870161262d565b92505060406127c786828701612209565b9150509250925092565b600080604083850312156127e8576127e761211b565b5b600083013567ffffffffffffffff81111561280657612805612120565b5b6128128582860161262d565b925050602061282385828601612209565b9150509250929050565b600080604083850312156128445761284361211b565b5b60006128528582860161216e565b925050602083013567ffffffffffffffff81111561287357612872612120565b5b61287f8582860161262d565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600067ffffffffffffffff82169050919050565b6128d2816128b5565b82525050565b60c0820160008201516128ee60008501826123fd565b50602082015161290160208501826123fd565b50604082015161291460408501826123e1565b50606082015161292760608501826123e1565b50608082015161293a60808501826128c9565b5060a082015161294d60a08501826123fd565b50505050565b600061295f83836128d8565b60c08301905092915050565b6000602082019050919050565b600061298382612889565b61298d8185612894565b9350612998836128a5565b8060005b838110156129c95781516129b08882612953565b97506129bb8361296b565b92505060018101905061299c565b5085935050505092915050565b600060608301600083015184820360008601526129f38282612316565b91505060208301518482036020860152612a0d8282612316565b91505060408301518482036040860152612a278282612978565b9150508091505092915050565b60006020820190508181036000830152612a4e81846129d6565b905092915050565b60008060008060808587031215612a7057612a6f61211b565b5b6000612a7e8782880161216e565b945050602085013567ffffffffffffffff811115612a9f57612a9e612120565b5b612aab8782880161262d565b9350506040612abc87828801612209565b925050606085013567ffffffffffffffff811115612add57612adc612120565b5b612ae98782880161262d565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b608082016000820151612b3760008501826123fd565b506020820151612b4a60208501826123fd565b506040820151612b5d60408501826123e1565b506060820151612b7060608501826123e1565b50505050565b6000612b828383612b21565b60808301905092915050565b6000602082019050919050565b6000612ba682612af5565b612bb08185612b00565b9350612bbb83612b11565b8060005b83811015612bec578151612bd38882612b76565b9750612bde83612b8e565b925050600181019050612bbf565b5085935050505092915050565b60006080830160008301518482036000860152612c168282612316565b91505060208301518482036020860152612c308282612316565b91505060408301518482036040860152612c4a8282612316565b91505060608301518482036060860152612c648282612b9b565b9150508091505092915050565b60006020820190508181036000830152612c8b8184612bf9565b905092915050565b60008060008060808587031215612cad57612cac61211b565b5b6000612cbb8782880161216e565b945050602085013567ffffffffffffffff811115612cdc57612cdb612120565b5b612ce88782880161262d565b9350506040612cf987828801612209565b9250506060612d0a87828801612209565b91505092959194509250565b600060208284031215612d2c57612d2b61211b565b5b600082013567ffffffffffffffff811115612d4a57612d49612120565b5b612d568482850161262d565b91505092915050565b6000602082019050612d7460008301846126e6565b92915050565b60008060008060808587031215612d9457612d9361211b565b5b6000612da28782880161216e565b945050602085013567ffffffffffffffff811115612dc357612dc2612120565b5b612dcf8782880161262d565b935050604085013567ffffffffffffffff811115612df057612def612120565b5b612dfc8782880161262d565b9250506060612e0d87828801612209565b91505092959194509250565b600080fd5b600060a08284031215612e3457612e33612e19565b5b81905092915050565b60008060408385031215612e5457612e5361211b565b5b600083013567ffffffffffffffff811115612e7257612e71612120565b5b612e7e8582860161262d565b925050602083013567ffffffffffffffff811115612e9f57612e9e612120565b5b612eab85828601612e1e565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000610160830160008301518482036000860152612eff8282612316565b91505060208301518482036020860152612f198282612316565b9150506040830151612f2e604086018261235b565b506060830151612f4160608601826123d2565b506080830151612f5460808601826123e1565b5060a0830151612f6760a08601826123e1565b5060c083015184820360c0860152612f7f8282612316565b91505060e0830151612f9460e08601826123fd565b50610100830151612fa96101008601826123fd565b50610120830151612fbe6101208601826123e1565b50610140830151612fd36101408601826123e1565b508091505092915050565b6000612fea8383612ee1565b905092915050565b6000602082019050919050565b600061300a82612eb5565b6130148185612ec0565b93508360208202850161302685612ed1565b8060005b8581101561306257848403895281516130438582612fde565b945061304e83612ff2565b925060208a0199505060018101905061302a565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b600061309b82613074565b6130a5818561307f565b93506130b58185602086016122db565b6130be81612305565b840191505092915050565b600060408301600083015184820360008601526130e68282613090565b91505060208301516130fb60208601826128c9565b508091505092915050565b600060408201905081810360008301526131208185612fff565b9050818103602083015261313481846130c9565b90509392505050565b600080600080608085870312156131575761315661211b565b5b60006131658782880161216e565b945050602061317687828801612209565b935050604061318787828801612209565b925050606085013567ffffffffffffffff8111156131a8576131a7612120565b5b6131b48782880161262d565b91505092959194509250565b6000806000604084860312156131d9576131d861211b565b5b60006131e78682870161216e565b935050602084013567ffffffffffffffff81111561320857613207612120565b5b61321486828701612192565b92509250509250925092565b600080fd5b600080fd5b600067ffffffffffffffff82111561324557613244612530565b5b61324e82612305565b9050602081019050919050565b600061326e6132698461322a565b612590565b90508281526020810184848401111561328a5761328961252b565b5b6132958482856125dc565b509392505050565b600082601f8301126132b2576132b1612183565b5b81356132c284826020860161325b565b91505092915050565b6132d4816128b5565b81146132df57600080fd5b50565b6000813590506132f1816132cb565b92915050565b6133008161234f565b811461330b57600080fd5b50565b60008135905061331d816132f7565b92915050565b600060a0828403121561333957613338613220565b5b61334360a0612590565b9050600082013567ffffffffffffffff81111561336357613362613225565b5b61336f8482850161329d565b6000830152506020613383848285016132e2565b6020830152506040613397848285016132e2565b60408301525060606133ab8482850161330e565b60608301525060806133bf8482850161330e565b60808301525092915050565b600080600080608085870312156133e5576133e461211b565b5b60006133f38782880161216e565b945050602085013567ffffffffffffffff81111561341457613413612120565b5b6134208782880161262d565b935050604085013567ffffffffffffffff81111561344157613440612120565b5b61344d8782880161262d565b925050606085013567ffffffffffffffff81111561346e5761346d612120565b5b61347a87828801613323565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060808301600083015184820360008601526134cf8282612316565b915050602083015184820360208601526134e98282612316565b915050604083015184820360408601526135038282612316565b9150506060830151848203606086015261351d8282612b9b565b9150508091505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60a08201600082015161356c6000850182612b21565b50602082015161357f60808501826123e1565b50505050565b60006135918383613556565b60a08301905092915050565b6000602082019050919050565b60006135b58261352a565b6135bf8185613535565b93506135ca83613546565b8060005b838110156135fb5781516135e28882613585565b97506135ed8361359d565b9250506001810190506135ce565b5085935050505092915050565b6000604083016000830151848203600086015261362582826134b2565b9150506020830151848203602086015261363f82826135aa565b9150508091505092915050565b60006136588383613608565b905092915050565b6000602082019050919050565b600061367882613486565b6136828185613491565b935083602082028501613694856134a2565b8060005b858110156136d057848403895281516136b1858261364c565b94506136bc83613660565b925060208a01995050600181019050613698565b50829750879550505050505092915050565b600060408201905081810360008301526136fc818561366d565b9050818103602083015261371081846130c9565b90509392505050565b61372281612145565b82525050565b600082825260208201905092915050565b6000819050919050565b600061374f83856122ca565b935061375c8385846125dc565b61376583612305565b840190509392505050565b600061377d848484613743565b90509392505050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126137b2576137b1613790565b5b83810192508235915060208301925067ffffffffffffffff8211156137da576137d9613786565b5b6001820236038313156137f0576137ef61378b565b5b509250929050565b6000602082019050919050565b60006138118385613728565b93508360208402850161382384613739565b8060005b8781101561386957848403895261383e8284613795565b613849868284613770565b9550613854846137f8565b935060208b019a505050600181019050613827565b50829750879450505050509392505050565b60006060820190506138906000830187613719565b61389d60208301866126e6565b81810360408301526138b0818486613805565b905095945050505050565b6000815190506138ca816132f7565b92915050565b6000602082840312156138e6576138e561211b565b5b60006138f4848285016138bb565b91505092915050565b600082825260208201905092915050565b7f4661696c656420746f20617070726f7665207374616b696e67206d6574686f6460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061396a6021836138fd565b91506139758261390e565b604082019050919050565b600060208201905081810360008301526139998161395d565b9050919050565b60006020820190506139b56000830184613719565b92915050565b60006139ce6139c9846125ab565b612590565b9050828152602081018484840111156139ea576139e961252b565b5b6139f58482856122db565b509392505050565b600082601f830112613a1257613a11612183565b5b8151613a228482602086016139bb565b91505092915050565b60048110613a3857600080fd5b50565b600081519050613a4a81613a2b565b92915050565b600081519050613a5f816121f2565b92915050565b613a6e816123f0565b8114613a7957600080fd5b50565b600081519050613a8b81613a65565b92915050565b60006101608284031215613aa857613aa7613220565b5b613ab3610160612590565b9050600082015167ffffffffffffffff811115613ad357613ad2613225565b5b613adf848285016139fd565b600083015250602082015167ffffffffffffffff811115613b0357613b02613225565b5b613b0f848285016139fd565b6020830152506040613b23848285016138bb565b6040830152506060613b3784828501613a3b565b6060830152506080613b4b84828501613a50565b60808301525060a0613b5f84828501613a50565b60a08301525060c082015167ffffffffffffffff811115613b8357613b82613225565b5b613b8f848285016139fd565b60c08301525060e0613ba384828501613a7c565b60e083015250610100613bb884828501613a7c565b61010083015250610120613bce84828501613a50565b61012083015250610140613be484828501613a50565b6101408301525092915050565b600060208284031215613c0757613c0661211b565b5b600082015167ffffffffffffffff811115613c2557613c24612120565b5b613c3184828501613a91565b91505092915050565b6000613c45826122bf565b613c4f81856138fd565b9350613c5f8185602086016122db565b613c6881612305565b840191505092915050565b6000604082019050613c886000830185613719565b8181036020830152613c9a8184613c3a565b90509392505050565b600081905092915050565b6000613cb9826122bf565b613cc38185613ca3565b9350613cd38185602086016122db565b80840191505092915050565b6000613ceb8284613cae565b915081905092915050565b7f64656c656761746563616c6c0000000000000000000000000000000000000000600082015250565b6000613d2c600c83613ca3565b9150613d3782613cf6565b600c82019050919050565b6000613d4d82613d1f565b9150819050919050565b600081905092915050565b6000613d6d82613074565b613d778185613d57565b9350613d878185602086016122db565b80840191505092915050565b6000613d9f8284613d62565b915081905092915050565b7f6661696c65642064656c656761746563616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e066021836138fd565b9150613e1182613daa565b604082019050919050565b60006020820190508181036000830152613e3581613df9565b9050919050565b600060408284031215613e5257613e51613220565b5b613e5c6040612590565b9050600082015167ffffffffffffffff811115613e7c57613e7b613225565b5b613e88848285016139fd565b6000830152506020613e9c84828501613a50565b60208301525092915050565b60008060408385031215613ebf57613ebe61211b565b5b6000613ecd85828601613a50565b925050602083015167ffffffffffffffff811115613eee57613eed612120565b5b613efa85828601613e3c565b9150509250929050565b7f73746174696363616c6c00000000000000000000000000000000000000000000600082015250565b6000613f3a600a83613ca3565b9150613f4582613f04565b600a82019050919050565b6000613f5b82613f2d565b9150819050919050565b7f6661696c65642073746174696363616c6c20746f20707265636f6d70696c6500600082015250565b6000613f9b601f836138fd565b9150613fa682613f65565b602082019050919050565b60006020820190508181036000830152613fca81613f8e565b9050919050565b7f63616c6c00000000000000000000000000000000000000000000000000000000600082015250565b6000614007600483613ca3565b915061401282613fd1565b600482019050919050565b600061402882613ffa565b9150819050919050565b7f6661696c65642063616c6c20746f20707265636f6d70696c6500000000000000600082015250565b60006140686019836138fd565b915061407382614032565b602082019050919050565b600060208201905081810360008301526140978161405b565b9050919050565b7f63616c6c636f6465000000000000000000000000000000000000000000000000600082015250565b60006140d4600883613ca3565b91506140df8261409e565b600882019050919050565b60006140f5826140c7565b9150819050919050565b7f696e76616c69642063616c6c7479706500000000000000000000000000000000600082015250565b60006141356010836138fd565b9150614140826140ff565b602082019050919050565b6000602082019050818103600083015261416481614128565b9050919050565b600081549050919050565b60008190508160005260206000209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806141d257607f821691505b6020821081036141e5576141e461418b565b5b50919050565b60008190508160005260206000209050919050565b6000815461420d816141ba565b61421781866122ca565b9450600182166000811461423257600181146142485761427b565b60ff19831686528115156020028601935061427b565b614251856141eb565b60005b8381101561427357815481890152600182019150602081019050614254565b808801955050505b50505092915050565b60006142908383614200565b905092915050565b6000600182019050919050565b60006142b08261416b565b6142ba8185613728565b9350836020820285016142cc85614176565b8060005b85811015614307578484038952816142e88582614284565b94506142f383614298565b925060208a019950506001810190506142d0565b50829750879550505050505092915050565b600060608201905061432e6000830186613719565b61433b60208301856126e6565b818103604083015261434d81846142a5565b9050949350505050565b7f64656c65676174696f6e20617070726f76616c206661696c6564000000000000600082015250565b600061438d601a836138fd565b915061439882614357565b602082019050919050565b600060208201905081810360008301526143bc81614380565b9050919050565b60006040820190506143d86000830185613719565b6143e560208301846126e6565b9392505050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000614422600f836138fd565b915061442d826143ec565b602082019050919050565b6000602082019050818103600083015261445181614415565b9050919050565b600060608201905061446d6000830186613719565b818103602083015261447f8185613c3a565b905061448e60408301846126e6565b949350505050565b7f5374616b696e6720417070726f7665206661696c656400000000000000000000600082015250565b60006144cc6016836138fd565b91506144d782614496565b602082019050919050565b600060208201905081810360008301526144fb816144bf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061453c826121e8565b9150614547836121e8565b925082820190508082111561455f5761455e614502565b5b92915050565b600067ffffffffffffffff8211156145805761457f612530565b5b602082029050602081019050919050565b6000815190506145a0816132cb565b92915050565b600060c082840312156145bc576145bb613220565b5b6145c660c0612590565b905060006145d684828501613a7c565b60008301525060206145ea84828501613a7c565b60208301525060406145fe84828501613a50565b604083015250606061461284828501613a50565b606083015250608061462684828501614591565b60808301525060a061463a84828501613a7c565b60a08301525092915050565b600061465961465484614565565b612590565b90508083825260208201905060c0840283018581111561467c5761467b61218d565b5b835b818110156146a5578061469188826145a6565b84526020840193505060c08101905061467e565b5050509392505050565b600082601f8301126146c4576146c3612183565b5b81516146d4848260208601614646565b91505092915050565b6000606082840312156146f3576146f2613220565b5b6146fd6060612590565b9050600082015167ffffffffffffffff81111561471d5761471c613225565b5b614729848285016139fd565b600083015250602082015167ffffffffffffffff81111561474d5761474c613225565b5b614759848285016139fd565b602083015250604082015167ffffffffffffffff81111561477d5761477c613225565b5b614789848285016146af565b60408301525092915050565b6000602082840312156147ab576147aa61211b565b5b600082015167ffffffffffffffff8111156147c9576147c8612120565b5b6147d5848285016146dd565b91505092915050565b60006060820190506147f36000830186613719565b81810360208301526148058185613c3a565b905081810360408301526148198184613c3a565b9050949350505050565b600067ffffffffffffffff82111561483e5761483d612530565b5b602082029050602081019050919050565b60006080828403121561486557614864613220565b5b61486f6080612590565b9050600061487f84828501613a7c565b600083015250602061489384828501613a7c565b60208301525060406148a784828501613a50565b60408301525060606148bb84828501613a50565b60608301525092915050565b60006148da6148d584614823565b612590565b905080838252602082019050608084028301858111156148fd576148fc61218d565b5b835b818110156149265780614912888261484f565b8452602084019350506080810190506148ff565b5050509392505050565b600082601f83011261494557614944612183565b5b81516149558482602086016148c7565b91505092915050565b60006080828403121561497457614973613220565b5b61497e6080612590565b9050600082015167ffffffffffffffff81111561499e5761499d613225565b5b6149aa848285016139fd565b600083015250602082015167ffffffffffffffff8111156149ce576149cd613225565b5b6149da848285016139fd565b602083015250604082015167ffffffffffffffff8111156149fe576149fd613225565b5b614a0a848285016139fd565b604083015250606082015167ffffffffffffffff811115614a2e57614a2d613225565b5b614a3a84828501614930565b60608301525092915050565b600060208284031215614a5c57614a5b61211b565b5b600082015167ffffffffffffffff811115614a7a57614a79612120565b5b614a868482850161495e565b91505092915050565b6000608082019050614aa46000830187613719565b8181036020830152614ab68186613c3a565b9050614ac560408301856126e6565b614ad260608301846126e6565b95945050505050565b7f44656c656761746520417070726f7665206661696c6564000000000000000000600082015250565b6000614b116017836138fd565b9150614b1c82614adb565b602082019050919050565b60006020820190508181036000830152614b4081614b04565b9050919050565b600060208284031215614b5d57614b5c61211b565b5b6000614b6b84828501613a7c565b91505092915050565b6000608082019050614b896000830187613719565b8181036020830152614b9b8186613c3a565b90508181036040830152614baf8185613c3a565b9050614bbe60608301846126e6565b95945050505050565b60008083356001602003843603038112614be457614be3613790565b5b83810192508235915060208301925067ffffffffffffffff821115614c0c57614c0b613786565b5b600182023603831315614c2257614c2161378b565b5b509250929050565b6000614c36838561307f565b9350614c438385846125dc565b614c4c83612305565b840190509392505050565b6000614c6660208401846132e2565b905092915050565b6000614c7d602084018461330e565b905092915050565b600060a08301614c986000840184614bc7565b8583036000870152614cab838284614c2a565b92505050614cbc6020840184614c57565b614cc960208601826128c9565b50614cd76040840184614c57565b614ce460408601826128c9565b50614cf26060840184614c6e565b614cff606086018261235b565b50614d0d6080840184614c6e565b614d1a608086018261235b565b508091505092915050565b60006040820190508181036000830152614d3f8185613c3a565b90508181036020830152614d538184614c85565b90509392505050565b600067ffffffffffffffff821115614d7757614d76612530565b5b602082029050602081019050919050565b6000614d9b614d9684614d5c565b612590565b90508083825260208201905060208402830185811115614dbe57614dbd61218d565b5b835b81811015614e0557805167ffffffffffffffff811115614de357614de2612183565b5b808601614df08982613a91565b85526020850194505050602081019050614dc0565b5050509392505050565b600082601f830112614e2457614e23612183565b5b8151614e34848260208601614d88565b91505092915050565b6000614e50614e4b8461322a565b612590565b905082815260208101848484011115614e6c57614e6b61252b565b5b614e778482856122db565b509392505050565b600082601f830112614e9457614e93612183565b5b8151614ea4848260208601614e3d565b91505092915050565b600060408284031215614ec357614ec2613220565b5b614ecd6040612590565b9050600082015167ffffffffffffffff811115614eed57614eec613225565b5b614ef984828501614e7f565b6000830152506020614f0d84828501614591565b60208301525092915050565b60008060408385031215614f3057614f2f61211b565b5b600083015167ffffffffffffffff811115614f4e57614f4d612120565b5b614f5a85828601614e0f565b925050602083015167ffffffffffffffff811115614f7b57614f7a612120565b5b614f8785828601614ead565b9150509250929050565b6000606082019050614fa66000830186613719565b614fb36020830185613719565b8181036040830152614fc58184613c3a565b9050949350505050565b600060208284031215614fe557614fe461211b565b5b6000614ff384828501613a50565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b6000819050602082019050919050565b60006150528383612316565b905092915050565b6000602082019050919050565b60006150728261502b565b61507c8185613728565b93508360208202850161508e85615036565b8060005b858110156150ca57848403895281516150ab8582615046565b94506150b68361505a565b925060208a01995050600181019050615092565b50829750879550505050505092915050565b60006060820190506150f16000830186613719565b6150fe60208301856126e6565b81810360408301526151108184615067565b9050949350505050565b7f6661696c656420746f20617070726f766520756e64656c65676174696f6e206d60008201527f6574686f64000000000000000000000000000000000000000000000000000000602082015250565b60006151766025836138fd565b91506151818261511a565b604082019050919050565b600060208201905081810360008301526151a581615169565b9050919050565b60006040820190506151c16000830186613719565b81810360208301526151d4818486613805565b9050949350505050565b7f4661696c656420746f207265766f6b6520617070726f76616c20666f7220737460008201527f616b696e67206d6574686f647300000000000000000000000000000000000000602082015250565b600061523a602d836138fd565b9150615245826151de565b604082019050919050565b600060208201905081810360008301526152698161522d565b9050919050565b600060a083016000830151848203600086015261528d8282613090565b91505060208301516152a260208601826128c9565b5060408301516152b560408601826128c9565b5060608301516152c8606086018261235b565b5060808301516152db608086018261235b565b508091505092915050565b60006080820190506152fb6000830187613719565b818103602083015261530d8186613c3a565b905081810360408301526153218185613c3a565b905081810360608301526153358184615270565b905095945050505050565b600067ffffffffffffffff82111561535b5761535a612530565b5b602082029050602081019050919050565b60006080828403121561538257615381613220565b5b61538c6080612590565b9050600082015167ffffffffffffffff8111156153ac576153ab613225565b5b6153b8848285016139fd565b600083015250602082015167ffffffffffffffff8111156153dc576153db613225565b5b6153e8848285016139fd565b602083015250604082015167ffffffffffffffff81111561540c5761540b613225565b5b615418848285016139fd565b604083015250606082015167ffffffffffffffff81111561543c5761543b613225565b5b61544884828501614930565b60608301525092915050565b600067ffffffffffffffff82111561546f5761546e612530565b5b602082029050602081019050919050565b600060a0828403121561549657615495613220565b5b6154a06040612590565b905060006154b08482850161484f565b60008301525060806154c484828501613a50565b60208301525092915050565b60006154e36154de84615454565b612590565b90508083825260208201905060a084028301858111156155065761550561218d565b5b835b8181101561552f578061551b8882615480565b84526020840193505060a081019050615508565b5050509392505050565b600082601f83011261554e5761554d612183565b5b815161555e8482602086016154d0565b91505092915050565b60006040828403121561557d5761557c613220565b5b6155876040612590565b9050600082015167ffffffffffffffff8111156155a7576155a6613225565b5b6155b38482850161536c565b600083015250602082015167ffffffffffffffff8111156155d7576155d6613225565b5b6155e384828501615539565b60208301525092915050565b60006156026155fd84615340565b612590565b905080838252602082019050602084028301858111156156255761562461218d565b5b835b8181101561566c57805167ffffffffffffffff81111561564a57615649612183565b5b8086016156578982615567565b85526020850194505050602081019050615627565b5050509392505050565b600082601f83011261568b5761568a612183565b5b815161569b8482602086016155ef565b91505092915050565b600080604083850312156156bb576156ba61211b565b5b600083015167ffffffffffffffff8111156156d9576156d8612120565b5b6156e585828601615676565b925050602083015167ffffffffffffffff81111561570657615705612120565b5b61571285828601614ead565b915050925092905056fe2f636f736d6f732e7374616b696e672e763162657461312e4d7367556e64656c6567617465a2646970667358221220e656b9b6229ff8e67e677d7173ae54f1b8a22f82708ce4c11af73361ed5cf47264736f6c634300081200332f636f736d6f732e7374616b696e672e763162657461312e4d736744656c6567617465" } diff --git a/precompiles/staking/testdata/StakingCaller.sol b/precompiles/staking/testdata/StakingCaller.sol index a1f0856297..b61e77cfd8 100644 --- a/precompiles/staking/testdata/StakingCaller.sol +++ b/precompiles/staking/testdata/StakingCaller.sol @@ -118,7 +118,7 @@ contract StakingCaller { /// @param _validatorAddr The validator address to query. /// @return validator The validator. function getValidator( - string memory _validatorAddr + address _validatorAddr ) public view returns (staking.Validator memory validator) { return staking.STAKING_CONTRACT.validator(_validatorAddr); } diff --git a/precompiles/staking/types.go b/precompiles/staking/types.go index 4edd40b49e..d0514e5680 100644 --- a/precompiles/staking/types.go +++ b/precompiles/staking/types.go @@ -4,6 +4,7 @@ package staking import ( + "bytes" "encoding/base64" "errors" "fmt" @@ -324,11 +325,13 @@ func NewValidatorRequest(args []interface{}) (*stakingtypes.QueryValidatorReques return nil, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 1, len(args)) } - validatorAddress, ok := args[0].(string) - if !ok { - return nil, fmt.Errorf(cmn.ErrInvalidType, "validatorAddress", "string", args[0]) + validatorHexAddr, ok := args[0].(common.Address) + if !ok || validatorHexAddr == (common.Address{}) { + return nil, fmt.Errorf(cmn.ErrInvalidValidator, args[0]) } + validatorAddress := sdk.ValAddress(validatorHexAddr.Bytes()).String() + return &stakingtypes.QueryValidatorRequest{ValidatorAddr: validatorAddress}, nil } @@ -344,6 +347,10 @@ func NewValidatorsRequest(method *abi.Method, args []interface{}) (*stakingtypes return nil, fmt.Errorf("error while unpacking args to ValidatorsInput struct: %s", err) } + if bytes.Equal(input.PageRequest.Key, []byte{0}) { + input.PageRequest.Key = nil + } + return &stakingtypes.QueryValidatorsRequest{ Status: input.Status, Pagination: &input.PageRequest, @@ -545,9 +552,14 @@ func DefaultValidatorOutput() ValidatorOutput { // FromResponse populates the ValidatorOutput from a QueryValidatorResponse. func (vo *ValidatorOutput) FromResponse(res *stakingtypes.QueryValidatorResponse) ValidatorOutput { + operatorAddress, err := sdk.ValAddressFromBech32(res.Validator.OperatorAddress) + if err != nil { + return DefaultValidatorOutput() + } + return ValidatorOutput{ Validator: ValidatorInfo{ - OperatorAddress: res.Validator.OperatorAddress, + OperatorAddress: common.BytesToAddress(operatorAddress.Bytes()).String(), ConsensusPubkey: FormatConsensusPubkey(res.Validator.ConsensusPubkey), Jailed: res.Validator.Jailed, Status: uint8(stakingtypes.BondStatus_value[res.Validator.Status.String()]), @@ -581,18 +593,23 @@ type ValidatorsOutput struct { func (vo *ValidatorsOutput) FromResponse(res *stakingtypes.QueryValidatorsResponse) *ValidatorsOutput { vo.Validators = make([]ValidatorInfo, len(res.Validators)) for i, v := range res.Validators { - vo.Validators[i] = ValidatorInfo{ - OperatorAddress: v.OperatorAddress, - ConsensusPubkey: FormatConsensusPubkey(v.ConsensusPubkey), - Jailed: v.Jailed, - Status: uint8(stakingtypes.BondStatus_value[v.Status.String()]), - Tokens: v.Tokens.BigInt(), - DelegatorShares: v.DelegatorShares.BigInt(), - Description: v.Description.Details, - UnbondingHeight: v.UnbondingHeight, - UnbondingTime: v.UnbondingTime.UTC().Unix(), - Commission: v.Commission.CommissionRates.Rate.BigInt(), - MinSelfDelegation: v.MinSelfDelegation.BigInt(), + operatorAddress, err := sdk.ValAddressFromBech32(v.OperatorAddress) + if err != nil { + vo.Validators[i] = DefaultValidatorOutput().Validator + } else { + vo.Validators[i] = ValidatorInfo{ + OperatorAddress: common.BytesToAddress(operatorAddress.Bytes()).String(), + ConsensusPubkey: FormatConsensusPubkey(v.ConsensusPubkey), + Jailed: v.Jailed, + Status: uint8(stakingtypes.BondStatus_value[v.Status.String()]), + Tokens: v.Tokens.BigInt(), + DelegatorShares: v.DelegatorShares.BigInt(), + Description: v.Description.Details, + UnbondingHeight: v.UnbondingHeight, + UnbondingTime: v.UnbondingTime.UTC().Unix(), + Commission: v.Commission.CommissionRates.Rate.BigInt(), + MinSelfDelegation: v.MinSelfDelegation.BigInt(), + } } } diff --git a/precompiles/staking/utils_test.go b/precompiles/staking/utils_test.go index 98d40462d3..2db11ff178 100644 --- a/precompiles/staking/utils_test.go +++ b/precompiles/staking/utils_test.go @@ -403,12 +403,14 @@ func (s *PrecompileTestSuite) ExpectAuthorization(authorizationType stakingtypes func (s *PrecompileTestSuite) assertValidatorsResponse(validators []staking.ValidatorInfo, expLen int) { // returning order can change valOrder := []int{0, 1} - if validators[0].OperatorAddress != s.validators[0].OperatorAddress { + varAddr := sdk.ValAddress(common.HexToAddress(validators[0].OperatorAddress).Bytes()).String() + if varAddr != s.validators[0].OperatorAddress { valOrder = []int{1, 0} } for i := 0; i < expLen; i++ { j := valOrder[i] - s.Require().Equal(s.validators[j].OperatorAddress, validators[i].OperatorAddress) + + s.Require().Equal(s.validators[j].OperatorAddress, sdk.ValAddress(common.HexToAddress(validators[i].OperatorAddress).Bytes()).String()) s.Require().Equal(uint8(s.validators[j].Status), validators[i].Status) s.Require().Equal(s.validators[j].Tokens.Uint64(), validators[i].Tokens.Uint64()) s.Require().Equal(s.validators[j].DelegatorShares.BigInt(), validators[i].DelegatorShares) @@ -511,6 +513,9 @@ func (s *PrecompileTestSuite) CheckValidatorOutput(valOut staking.ValidatorInfo) for i, v := range s.validators { validatorAddrs[i] = v.OperatorAddress } - Expect(slices.Contains(validatorAddrs, valOut.OperatorAddress)).To(BeTrue(), "operator address not found in test suite validators") + + operatorAddress := sdk.ValAddress(common.HexToAddress(valOut.OperatorAddress).Bytes()).String() + + Expect(slices.Contains(validatorAddrs, operatorAddress)).To(BeTrue(), "operator address not found in test suite validators") Expect(valOut.DelegatorShares).To(Equal(big.NewInt(1e18)), "expected different delegator shares") } From e0d41fed02ca673133aebf2d8adba5f601e64233 Mon Sep 17 00:00:00 2001 From: Chenqun Lu Date: Mon, 4 Dec 2023 00:28:04 +0800 Subject: [PATCH 007/345] imp(precompile): how to handle panic when call precompiled contracts (#2105) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * imp(percompile): processing of evm transactions leads to panic receipt issues * imp(staking): detect the length of the ed25519 pubkey in precompile CreateValidator to prevent panic --------- Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> --- CHANGELOG.md | 1 + precompiles/staking/tx_test.go | 18 ++++++++++++++++++ precompiles/staking/types.go | 5 +++++ 3 files changed, 24 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b86149d539..99db6443c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -126,6 +126,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (bank-precompile) [#2096](https://github.com/evmos/evmos/pull/2096) Add `bank` precompile integration tests. - (osmosis-outpost) [#2077](https://github.com/evmos/evmos/pull/2077) Update Osmosis outpost to use cross-chain swap contract V1. - (app) [#2104](https://github.com/evmos/evmos/pull/2104) Refactor code to use `sdkmath.Int` and `sdkmath.LegacyDec` instead of the SDK types +- (staking) [#2105](https://github.com/evmos/evmos/pull/2105) Detect the length of the ed25519 pubkey in precompile CreateValidator to prevent panic. - (p256-precompile) [#2110](https://github.com/evmos/evmos/pull/2110) Adjust `p256` precompile address. - (upgrade) [#2117](https://github.com/evmos/evmos/pull/2117) Enable Stride and Osmosis outposts in v16 upgrade handler. - (osmosis-outpost) [#2109](https://github.com/evmos/evmos/pull/2109) Add Osmosis outpost to available EVM extensions. diff --git a/precompiles/staking/tx_test.go b/precompiles/staking/tx_test.go index 187f727338..b8de9a406f 100644 --- a/precompiles/staking/tx_test.go +++ b/precompiles/staking/tx_test.go @@ -201,6 +201,24 @@ func (s *PrecompileTestSuite) TestCreateValidator() { true, "illegal base64 data", }, + { + "fail - consensus pubkey len is invalid", + func() []interface{} { + return []interface{}{ + description, + commission, + minSelfDelegation, + delegatorAddress, + validatorAddress, + "bHVrZQ==", + value, + } + }, + 200000, + func(data []byte) {}, + true, + "consensus pubkey len is invalid", + }, { "fail - invalid value", func() []interface{} { diff --git a/precompiles/staking/types.go b/precompiles/staking/types.go index d0514e5680..2d6950eed0 100644 --- a/precompiles/staking/types.go +++ b/precompiles/staking/types.go @@ -131,6 +131,11 @@ func NewMsgCreateValidator(args []interface{}, denom string) (*stakingtypes.MsgC return nil, common.Address{}, err } + // more details see https://github.com/cosmos/cosmos-sdk/pull/18506 + if len(pubkeyBytes) != ed25519.PubKeySize { + return nil, common.Address{}, fmt.Errorf("consensus pubkey len is invalid, got: %d, expected: %d", len(pubkeyBytes), ed25519.PubKeySize) + } + var ed25519pk cryptotypes.PubKey = &ed25519.PubKey{Key: pubkeyBytes} pubkey, err := codectypes.NewAnyWithValue(ed25519pk) if err != nil { From b73f2ddcbb7448a323d97b6c01164fd94eeb3f7c Mon Sep 17 00:00:00 2001 From: Vladislav Varadinov Date: Mon, 4 Dec 2023 12:49:50 +0200 Subject: [PATCH 008/345] chore(bech32): Activate bech32 precompile (#2125) --- CHANGELOG.md | 1 + app/upgrades/v16/upgrades.go | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 99db6443c1..5a4b354dae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,6 +42,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (p256-precompile) [#1922](https://github.com/evmos/evmos/pull/1922) [EIP-7212](https://eips.ethereum.org/EIPS/eip-7212) `secp256r1` curve precompile. - (distribution-precompile) [#1949](https://github.com/evmos/evmos/pull/1949) Add `ClaimRewards` custom transaction. - (bech32-precompile) [#2038](https://github.com/evmos/evmos/pull/2038) Add `bech32` conversion precompile. +- (bech32-precompile) [#2124](https://github.com/evmos/evmos/pull/2124) Activate `bech32` precompile. - (staking-precompile) [#2030](https://github.com/evmos/evmos/pull/2030) Implement the `CreateValidator` function for staking precompiled contract. - (fees) [#1998](https://github.com/evmos/evmos/pull/1998) Restrict transaction fee tokens. - (staking-precompile) [#2053](https://github.com/evmos/evmos/pull/2053) Change the validator address in the events from string type to address type. diff --git a/app/upgrades/v16/upgrades.go b/app/upgrades/v16/upgrades.go index 4345ce1908..41c1b1fbb0 100644 --- a/app/upgrades/v16/upgrades.go +++ b/app/upgrades/v16/upgrades.go @@ -7,6 +7,7 @@ import ( "github.com/cosmos/cosmos-sdk/types/module" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" + "github.com/evmos/evmos/v16/precompiles/bech32" osmosisoutpost "github.com/evmos/evmos/v16/precompiles/outposts/osmosis" strideoutpost "github.com/evmos/evmos/v16/precompiles/outposts/stride" "github.com/evmos/evmos/v16/precompiles/p256" @@ -26,11 +27,11 @@ func CreateUpgradeHandler( return func(ctx sdk.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { logger := ctx.Logger().With("upgrade", UpgradeName) - // enable secp256r1 precompile on testnet + // enable secp256r1 and bech32 precompile on testnet if utils.IsTestnet(ctx.ChainID()) { p256Address := p256.Precompile{}.Address() - - if err := ek.EnablePrecompiles(ctx, p256Address); err != nil { + bech32Address := bech32.Precompile{}.Address() + if err := ek.EnablePrecompiles(ctx, p256Address, bech32Address); err != nil { logger.Error("failed to enable precompiles", "error", err.Error()) } } From 079394d1e990269ca62ec62dc6b6fa1fe2651637 Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Mon, 4 Dec 2023 09:37:13 -0300 Subject: [PATCH 009/345] Revert "feat(post): burn cosmos transaction fees (#2013)" (#2127) This reverts commit 3dd60c0a4ffaba9a78ba6b70e6933d041b1694ea. --- CHANGELOG.md | 1 - app/app.go | 14 ++-- app/post/burn.go | 60 --------------- app/post/burn_test.go | 170 ----------------------------------------- app/post/post.go | 38 --------- app/post/post_test.go | 69 ----------------- app/post/setup_test.go | 147 ----------------------------------- 7 files changed, 6 insertions(+), 493 deletions(-) delete mode 100644 app/post/burn.go delete mode 100644 app/post/burn_test.go delete mode 100644 app/post/post.go delete mode 100644 app/post/post_test.go delete mode 100644 app/post/setup_test.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a4b354dae..4b90234650 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -51,7 +51,6 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (bank-precompile) [#2095](https://github.com/evmos/evmos/pull/2095) Add `bank` precompile. - (incentives) [#2070](https://github.com/evmos/evmos/pull/2070) Remove `x/incentives` module and burn incentives pool balance. - (evm) [#2084](https://github.com/evmos/evmos/pull/2084) Remove `x/claims` params and migrate the `EVMChannels` param to the `x/evm` module params. -- (post) [#2013](https://github.com/evmos/evmos/pull/2013) Add `BurnDecorator` to `PostHandler` to burn cosmos transaction fees. ### API Breaking diff --git a/app/app.go b/app/app.go index ef321b8ff5..7149d5f67a 100644 --- a/app/app.go +++ b/app/app.go @@ -50,6 +50,7 @@ import ( "github.com/cosmos/cosmos-sdk/version" "github.com/cosmos/cosmos-sdk/x/auth" authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" + "github.com/cosmos/cosmos-sdk/x/auth/posthandler" authsims "github.com/cosmos/cosmos-sdk/x/auth/simulation" authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" @@ -124,7 +125,6 @@ import ( "github.com/evmos/evmos/v16/app/ante" ethante "github.com/evmos/evmos/v16/app/ante/evm" - "github.com/evmos/evmos/v16/app/post" v10 "github.com/evmos/evmos/v16/app/upgrades/v10" v11 "github.com/evmos/evmos/v16/app/upgrades/v11" v12 "github.com/evmos/evmos/v16/app/upgrades/v12" @@ -873,16 +873,14 @@ func (app *Evmos) setAnteHandler(txConfig client.TxConfig, maxGasWanted uint64) } func (app *Evmos) setPostHandler() { - options := post.HandlerOptions{ - FeeCollectorName: authtypes.FeeCollectorName, - BankKeeper: app.BankKeeper, - } - - if err := options.Validate(); err != nil { + postHandler, err := posthandler.NewPostHandler( + posthandler.HandlerOptions{}, + ) + if err != nil { panic(err) } - app.SetPostHandler(post.NewPostHandler(options)) + app.SetPostHandler(postHandler) } // BeginBlocker runs the Tendermint ABCI BeginBlock logic. It executes state changes at the beginning diff --git a/app/post/burn.go b/app/post/burn.go deleted file mode 100644 index 929db61dda..0000000000 --- a/app/post/burn.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package post - -import ( - errorsmod "cosmossdk.io/errors" - sdk "github.com/cosmos/cosmos-sdk/types" - errortypes "github.com/cosmos/cosmos-sdk/types/errors" - bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" -) - -var _ sdk.PostDecorator = &BurnDecorator{} - -// BurnDecorator is the decorator that burns all the transaction fees from Cosmos transactions. -type BurnDecorator struct { - feeCollectorName string - bankKeeper bankkeeper.Keeper -} - -// NewBurnDecorator creates a new instance of the BurnDecorator. -func NewBurnDecorator(feeCollector string, bankKeeper bankkeeper.Keeper) sdk.PostDecorator { - return &BurnDecorator{ - feeCollectorName: feeCollector, - bankKeeper: bankKeeper, - } -} - -// PostHandle burns all the transaction fees from Cosmos transactions. If an Ethereum transaction is present, this logic -// is skipped. -func (bd BurnDecorator) PostHandle(ctx sdk.Context, tx sdk.Tx, simulate, success bool, next sdk.PostHandler) (newCtx sdk.Context, err error) { - feeTx, ok := tx.(sdk.FeeTx) - if !ok { - return ctx, errorsmod.Wrapf(errortypes.ErrInvalidType, "invalid transaction type %T, expected sdk.FeeTx", tx) - } - - // skip logic if there is an Ethereum transaction - for _, msg := range tx.GetMsgs() { - if _, ok := msg.(*evmtypes.MsgEthereumTx); ok { - return next(ctx, tx, simulate, success) - } - } - - fees := feeTx.GetFee() - - // safety check: ensure the fees are not empty and with positive amounts - // before burning - if len(fees) == 0 || !fees.IsAllPositive() { - return next(ctx, tx, simulate, success) - } - - // NOTE: since all Cosmos tx fees are pooled by the fee collector module account, - // we burn them directly from it - if err := bd.bankKeeper.BurnCoins(ctx, bd.feeCollectorName, fees); err != nil { - return ctx, err - } - - return next(ctx, tx, simulate, success) -} diff --git a/app/post/burn_test.go b/app/post/burn_test.go deleted file mode 100644 index bea61bb7ba..0000000000 --- a/app/post/burn_test.go +++ /dev/null @@ -1,170 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package post_test - -import ( - sdkmath "cosmossdk.io/math" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/evmos/evmos/v16/app/post" - - // "github.com/evmos/evmos/v16/testutil/integration/evmos/factory" - sdk "github.com/cosmos/cosmos-sdk/types" -) - -func (s *PostTestSuite) TestPostHandle() { - testCases := []struct { - name string - tx func() sdk.Tx - expPass bool - errContains string - postChecks func() - }{ - { - name: "pass - noop with Ethereum message", - tx: func() sdk.Tx { - return s.BuildEthTx() - }, - expPass: true, - postChecks: func() {}, - }, - { - name: "pass - burn fees of a single token with empty end balance", - tx: func() sdk.Tx { - feeAmount := sdk.Coins{sdk.Coin{Amount: sdkmath.NewInt(10), Denom: "btc"}} - amount := feeAmount - s.MintCoinsForFeeCollector(amount) - - return s.BuildCosmosTxWithNSendMsg(1, feeAmount) - }, - expPass: true, - postChecks: func() { - expected := sdk.Coins{} - balance := s.GetFeeCollectorBalance() - s.Require().Equal(expected, balance) - }, - }, - { - name: "pass - burn fees of a single token with non-empty end balance", - tx: func() sdk.Tx { - feeAmount := sdk.Coins{sdk.Coin{Amount: sdkmath.NewInt(10), Denom: "evmos"}} - amount := sdk.Coins{sdk.Coin{Amount: sdkmath.NewInt(20), Denom: "evmos"}} - s.MintCoinsForFeeCollector(amount) - - return s.BuildCosmosTxWithNSendMsg(1, feeAmount) - }, - expPass: true, - postChecks: func() { - expected := sdk.Coins{sdk.Coin{Amount: sdkmath.NewInt(10), Denom: "evmos"}} - balance := s.GetFeeCollectorBalance() - s.Require().Equal(expected, balance) - }, - }, - { - name: "pass - burn fees of multiple tokens with empty end balance", - tx: func() sdk.Tx { - feeAmount := sdk.Coins{ - sdk.Coin{Amount: sdkmath.NewInt(10), Denom: "eth"}, - sdk.Coin{Amount: sdkmath.NewInt(10), Denom: "evmos"}, - } - amount := feeAmount - s.MintCoinsForFeeCollector(amount) - - return s.BuildCosmosTxWithNSendMsg(1, feeAmount) - }, - expPass: true, - postChecks: func() { - balance := s.GetFeeCollectorBalance() - s.Require().Equal(sdk.Coins{}, balance) - }, - }, - { //nolint:dupl - name: "pass - burn fees of multiple tokens with non-empty end balance", - tx: func() sdk.Tx { - feeAmount := sdk.Coins{ - sdk.Coin{Amount: sdkmath.NewInt(10), Denom: "btc"}, - sdk.Coin{Amount: sdkmath.NewInt(10), Denom: "evmos"}, - } - amount := sdk.Coins{ - sdk.Coin{Amount: sdkmath.NewInt(20), Denom: "btc"}, - sdk.Coin{Amount: sdkmath.NewInt(10), Denom: "evmos"}, - sdk.Coin{Amount: sdkmath.NewInt(3), Denom: "osmo"}, - } - s.MintCoinsForFeeCollector(amount) - - return s.BuildCosmosTxWithNSendMsg(1, feeAmount) - }, - expPass: true, - postChecks: func() { - expected := sdk.Coins{ - sdk.Coin{Amount: sdkmath.NewInt(10), Denom: "btc"}, - sdk.Coin{Amount: sdkmath.NewInt(3), Denom: "osmo"}, - } - balance := s.GetFeeCollectorBalance() - s.Require().Equal(expected, balance) - }, - }, - { //nolint:dupl - name: "pass - burn fees of multiple tokens, non-empty end balance, and multiple messages", - tx: func() sdk.Tx { - feeAmount := sdk.Coins{ - sdk.Coin{Amount: sdkmath.NewInt(10), Denom: "btc"}, - sdk.Coin{Amount: sdkmath.NewInt(10), Denom: "evmos"}, - } - amount := sdk.Coins{ - sdk.Coin{Amount: sdkmath.NewInt(20), Denom: "btc"}, - sdk.Coin{Amount: sdkmath.NewInt(10), Denom: "evmos"}, - sdk.Coin{Amount: sdkmath.NewInt(3), Denom: "osmo"}, - } - s.MintCoinsForFeeCollector(amount) - - return s.BuildCosmosTxWithNSendMsg(100, feeAmount) - }, - expPass: true, - postChecks: func() { - expected := sdk.Coins{ - sdk.Coin{Amount: sdkmath.NewInt(10), Denom: "btc"}, - sdk.Coin{Amount: sdkmath.NewInt(3), Denom: "osmo"}, - } - balance := s.GetFeeCollectorBalance() - s.Require().Equal(expected, balance) - }, - }, - } - - for _, tc := range testCases { - // Be sure to have a fresh new network before each test. It is not required for following - // test but it is still a good practice. - s.SetupTest() - s.Run(tc.name, func() { - // start each test with a fresh new block. - err := s.unitNetwork.NextBlock() - s.Require().NoError(err) - - burnDecorator := post.NewBurnDecorator( - authtypes.FeeCollectorName, - s.unitNetwork.App.BankKeeper, - ) - - // In the execution of the PostHandle method, simulate, success, and next have been - // hard-coded because they are not influencing the behavior of the BurnDecorator. - terminator := sdk.ChainPostDecorators(sdk.Terminator{}) - _, err = burnDecorator.PostHandle( - s.unitNetwork.GetContext(), - tc.tx(), - false, - false, - terminator, - ) - - if tc.expPass { - s.Require().NoError(err) - } else { - s.Require().Error(err, "expected error during HandlerOptions validation") - s.Require().Contains(err.Error(), tc.errContains, "expected a different error") - } - - tc.postChecks() - }) - } -} diff --git a/app/post/post.go b/app/post/post.go deleted file mode 100644 index 302f0959e1..0000000000 --- a/app/post/post.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package post - -import ( - "errors" - - sdk "github.com/cosmos/cosmos-sdk/types" - bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" -) - -// HandlerOptions are the options required for constructing a PostHandler. -type HandlerOptions struct { - FeeCollectorName string - BankKeeper bankkeeper.Keeper -} - -func (h HandlerOptions) Validate() error { - if h.FeeCollectorName == "" { - return errors.New("fee collector name cannot be empty") - } - - if h.BankKeeper == nil { - return errors.New("bank keeper cannot be nil") - } - - return nil -} - -// NewPostHandler returns a new PostHandler decorators chain. -func NewPostHandler(ho HandlerOptions) sdk.PostHandler { - postDecorators := []sdk.PostDecorator{ - NewBurnDecorator(ho.FeeCollectorName, ho.BankKeeper), - } - - return sdk.ChainPostDecorators(postDecorators...) -} diff --git a/app/post/post_test.go b/app/post/post_test.go deleted file mode 100644 index 065732c862..0000000000 --- a/app/post/post_test.go +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package post_test - -import ( - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - "github.com/evmos/evmos/v16/app/post" -) - -func (s *PostTestSuite) TestPostHandlerOptions() { - validBankKeeper := s.unitNetwork.App.BankKeeper - validFeeCollector := authtypes.FeeCollectorName - - testCases := []struct { - name string - feeCollector string - bankKeeper bankkeeper.Keeper - expPass bool - errContains string - }{ - { - name: "fail - empty fee collector name", - feeCollector: "", - bankKeeper: validBankKeeper, - expPass: false, - errContains: "fee collector name cannot be empty", - }, - { - name: "fail - nil bank keeper", - feeCollector: validFeeCollector, - bankKeeper: nil, - expPass: false, - errContains: "bank keeper cannot be nil", - }, - { - name: "pass - correct inputs", - feeCollector: validFeeCollector, - bankKeeper: validBankKeeper, - expPass: true, - }, - } - - for _, tc := range testCases { - // Be sure to have a fresh new network before each test. It is not required for following - // test but it is still a good practice. - s.SetupTest() - s.Run(tc.name, func() { - // start each test with a fresh new block. - err := s.unitNetwork.NextBlock() - s.Require().NoError(err) - - handlerOptions := post.HandlerOptions{ - FeeCollectorName: tc.feeCollector, - BankKeeper: tc.bankKeeper, - } - - err = handlerOptions.Validate() - - if tc.expPass { - s.Require().NoError(err) - } else { - s.Require().Error(err, "expected error during HandlerOptions validation") - s.Require().Contains(err.Error(), tc.errContains, "expected a different error") - } - }) - } -} diff --git a/app/post/setup_test.go b/app/post/setup_test.go deleted file mode 100644 index 52eeb450c3..0000000000 --- a/app/post/setup_test.go +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package post_test - -import ( - "math/big" - "testing" - - "github.com/cosmos/cosmos-sdk/codec" - codectypes "github.com/cosmos/cosmos-sdk/codec/types" - sdk "github.com/cosmos/cosmos-sdk/types" - authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v16/testutil/integration/evmos/network" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - inflationtypes "github.com/evmos/evmos/v16/x/inflation/v1/types" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/stretchr/testify/suite" -) - -const ( - gasLimit = 100_000 -) - -type PostTestSuite struct { - suite.Suite - - unitNetwork *network.UnitTestNetwork - grpcHandler grpc.Handler - keyring testkeyring.Keyring - - txBuilder client.TxBuilder - - from common.Address - to common.Address -} - -func (s *PostTestSuite) SetupTest() { - keyring := testkeyring.New(2) - unitNetwork := network.NewUnitTestNetwork( - network.WithPreFundedAccounts(keyring.GetAllAccAddrs()...), - ) - grpcHandler := grpc.NewIntegrationHandler(unitNetwork) - - // TxBuilder is used to create Ethereum and Cosmos Tx to test - // the fee burner. - interfaceRegistry := codectypes.NewInterfaceRegistry() - codec := codec.NewProtoCodec(interfaceRegistry) - txConfig := authtx.NewTxConfig(codec, authtx.DefaultSignModes) - txBuilder := txConfig.NewTxBuilder() - - s.from = keyring.GetAddr(0) - s.to = keyring.GetAddr(1) - s.unitNetwork = unitNetwork - s.grpcHandler = grpcHandler - s.keyring = keyring - s.txBuilder = txBuilder -} - -func TestPostTestSuite(t *testing.T) { - suite.Run(t, new(PostTestSuite)) -} - -func (s *PostTestSuite) BuildEthTx() sdk.Tx { - chainID := s.unitNetwork.App.EvmKeeper.ChainID() - nonce := s.unitNetwork.App.EvmKeeper.GetNonce( - s.unitNetwork.GetContext(), - common.BytesToAddress(s.from.Bytes()), - ) - - ethTxParams := &evmtypes.EvmTxArgs{ - ChainID: chainID, - Nonce: nonce, - To: &s.to, - GasLimit: gasLimit, - GasPrice: big.NewInt(1), - GasTipCap: big.NewInt(1), - } - - msgEthereumTx := evmtypes.NewTx(ethTxParams) - msgEthereumTx.From = s.from.String() - tx, err := msgEthereumTx.BuildTx(s.txBuilder, "evmos") - s.Require().NoError(err) - return tx -} - -// BuildCosmosTxWithSendMsg is an utils function to create an sdk.Tx containing -// a single message of type MsgSend from the bank module. -func (s *PostTestSuite) BuildCosmosTxWithNSendMsg(n int, feeAmount sdk.Coins) sdk.Tx { - messages := make([]sdk.Msg, n) - - sendMsg := banktypes.MsgSend{ - FromAddress: s.from.String(), - ToAddress: s.to.String(), - Amount: feeAmount, - } - - for i := range messages { - messages[i] = &sendMsg - } - - s.txBuilder.SetGasLimit(gasLimit) - s.txBuilder.SetFeeAmount(feeAmount) - err := s.txBuilder.SetMsgs(messages...) - s.Require().NoError(err) - return s.txBuilder.GetTx() -} - -// MintCoinForFeeCollector allows to mint a specific amount of coins from the bank -// and to transfer them to the FeeCollector. -func (s *PostTestSuite) MintCoinsForFeeCollector(amount sdk.Coins) { - // Minting tokens for the FeeCollector to simulate fee accrued. - err := s.unitNetwork.App.BankKeeper.MintCoins( - s.unitNetwork.GetContext(), - inflationtypes.ModuleName, - amount, - ) - s.Require().NoError(err) - - err = s.unitNetwork.App.BankKeeper.SendCoinsFromModuleToModule( - s.unitNetwork.GetContext(), - inflationtypes.ModuleName, - authtypes.FeeCollectorName, - amount, - ) - s.Require().NoError(err) - - balance := s.GetFeeCollectorBalance() - s.Require().Equal(amount, balance) -} - -// GetFeeCollectorBalance is an utility function to query the balance -// of the FeeCollector module. -func (s *PostTestSuite) GetFeeCollectorBalance() sdk.Coins { - address := s.unitNetwork.App.AccountKeeper.GetModuleAddress(authtypes.FeeCollectorName) - balance := s.unitNetwork.App.BankKeeper.GetAllBalances( - s.unitNetwork.GetContext(), - address, - ) - return balance -} From f4ede8dabc29033a6746373ec35fe491785d569c Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Mon, 4 Dec 2023 10:54:02 -0300 Subject: [PATCH 010/345] feat(post): burn cosmos transaction fees (#2128) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(post): burn cosmos transaction fees * changelog * handler options * tests(post): unit test for burn cosmos transaction fees. (#2027) * add posthandler unit test suite * add HandlerOptions validation tests * add Burner auth to FeeCollectorName * add test setup + post handler test * add burn tests * run make format * add tests with balance check for post burn * fix * run make format * linter --------- Co-authored-by: 0xstepit <0xstepit@users.noreply.github.com> * Update app/post/post.go Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> * format test * add safety check * check for zero len coins * fix(post): fix post handler * update imports * update changelog --------- Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: 0xstepit <0xstepit@users.noreply.github.com> Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> --- CHANGELOG.md | 1 + app/app.go | 14 ++-- app/post/burn.go | 76 ++++++++++++++++++ app/post/burn_test.go | 170 +++++++++++++++++++++++++++++++++++++++++ app/post/post.go | 38 +++++++++ app/post/post_test.go | 69 +++++++++++++++++ app/post/setup_test.go | 147 +++++++++++++++++++++++++++++++++++ 7 files changed, 509 insertions(+), 6 deletions(-) create mode 100644 app/post/burn.go create mode 100644 app/post/burn_test.go create mode 100644 app/post/post.go create mode 100644 app/post/post_test.go create mode 100644 app/post/setup_test.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b90234650..0146cde25a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -51,6 +51,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (bank-precompile) [#2095](https://github.com/evmos/evmos/pull/2095) Add `bank` precompile. - (incentives) [#2070](https://github.com/evmos/evmos/pull/2070) Remove `x/incentives` module and burn incentives pool balance. - (evm) [#2084](https://github.com/evmos/evmos/pull/2084) Remove `x/claims` params and migrate the `EVMChannels` param to the `x/evm` module params. +- (post) [#2128](https://github.com/evmos/evmos/pull/2128) Add `BurnDecorator` to `PostHandler` to burn cosmos transaction fees. ### API Breaking diff --git a/app/app.go b/app/app.go index 7149d5f67a..ef321b8ff5 100644 --- a/app/app.go +++ b/app/app.go @@ -50,7 +50,6 @@ import ( "github.com/cosmos/cosmos-sdk/version" "github.com/cosmos/cosmos-sdk/x/auth" authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" - "github.com/cosmos/cosmos-sdk/x/auth/posthandler" authsims "github.com/cosmos/cosmos-sdk/x/auth/simulation" authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" @@ -125,6 +124,7 @@ import ( "github.com/evmos/evmos/v16/app/ante" ethante "github.com/evmos/evmos/v16/app/ante/evm" + "github.com/evmos/evmos/v16/app/post" v10 "github.com/evmos/evmos/v16/app/upgrades/v10" v11 "github.com/evmos/evmos/v16/app/upgrades/v11" v12 "github.com/evmos/evmos/v16/app/upgrades/v12" @@ -873,14 +873,16 @@ func (app *Evmos) setAnteHandler(txConfig client.TxConfig, maxGasWanted uint64) } func (app *Evmos) setPostHandler() { - postHandler, err := posthandler.NewPostHandler( - posthandler.HandlerOptions{}, - ) - if err != nil { + options := post.HandlerOptions{ + FeeCollectorName: authtypes.FeeCollectorName, + BankKeeper: app.BankKeeper, + } + + if err := options.Validate(); err != nil { panic(err) } - app.SetPostHandler(postHandler) + app.SetPostHandler(post.NewPostHandler(options)) } // BeginBlocker runs the Tendermint ABCI BeginBlock logic. It executes state changes at the beginning diff --git a/app/post/burn.go b/app/post/burn.go new file mode 100644 index 0000000000..ca80a21692 --- /dev/null +++ b/app/post/burn.go @@ -0,0 +1,76 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package post + +import ( + errorsmod "cosmossdk.io/errors" + sdkmath "cosmossdk.io/math" + + sdk "github.com/cosmos/cosmos-sdk/types" + errortypes "github.com/cosmos/cosmos-sdk/types/errors" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" + evmtypes "github.com/evmos/evmos/v16/x/evm/types" +) + +var _ sdk.PostDecorator = &BurnDecorator{} + +// BurnDecorator is the decorator that burns all the transaction fees from Cosmos transactions. +type BurnDecorator struct { + feeCollectorName string + bankKeeper bankkeeper.Keeper +} + +// NewBurnDecorator creates a new instance of the BurnDecorator. +func NewBurnDecorator(feeCollector string, bankKeeper bankkeeper.Keeper) sdk.PostDecorator { + return &BurnDecorator{ + feeCollectorName: feeCollector, + bankKeeper: bankKeeper, + } +} + +// PostHandle burns all the transaction fees from Cosmos transactions. If an Ethereum transaction is present, this logic +// is skipped. +func (bd BurnDecorator) PostHandle(ctx sdk.Context, tx sdk.Tx, simulate, success bool, next sdk.PostHandler) (newCtx sdk.Context, err error) { + feeTx, ok := tx.(sdk.FeeTx) + if !ok { + return ctx, errorsmod.Wrapf(errortypes.ErrInvalidType, "invalid transaction type %T, expected sdk.FeeTx", tx) + } + + // skip logic if there is an Ethereum transaction + for _, msg := range tx.GetMsgs() { + if _, ok := msg.(*evmtypes.MsgEthereumTx); ok { + return next(ctx, tx, simulate, success) + } + } + + fees := feeTx.GetFee() + + // safety check: ensure the fees are not empty and with positive amounts + // before burning + if len(fees) == 0 || !fees.IsAllPositive() { + return next(ctx, tx, simulate, success) + } + + // burn min(balance, fee) + var burnedCoins sdk.Coins + for _, fee := range fees { + balance := bd.bankKeeper.GetBalance(ctx, authtypes.NewModuleAddress(bd.feeCollectorName), fee.Denom) + if !balance.IsPositive() { + continue + } + + amount := sdkmath.MinInt(fee.Amount, balance.Amount) + + burnedCoins = append(burnedCoins, sdk.Coin{Denom: fee.Denom, Amount: amount}) + } + + // NOTE: since all Cosmos tx fees are pooled by the fee collector module account, + // we burn them directly from it + if err := bd.bankKeeper.BurnCoins(ctx, bd.feeCollectorName, burnedCoins); err != nil { + return ctx, err + } + + return next(ctx, tx, simulate, success) +} diff --git a/app/post/burn_test.go b/app/post/burn_test.go new file mode 100644 index 0000000000..bea61bb7ba --- /dev/null +++ b/app/post/burn_test.go @@ -0,0 +1,170 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package post_test + +import ( + sdkmath "cosmossdk.io/math" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + "github.com/evmos/evmos/v16/app/post" + + // "github.com/evmos/evmos/v16/testutil/integration/evmos/factory" + sdk "github.com/cosmos/cosmos-sdk/types" +) + +func (s *PostTestSuite) TestPostHandle() { + testCases := []struct { + name string + tx func() sdk.Tx + expPass bool + errContains string + postChecks func() + }{ + { + name: "pass - noop with Ethereum message", + tx: func() sdk.Tx { + return s.BuildEthTx() + }, + expPass: true, + postChecks: func() {}, + }, + { + name: "pass - burn fees of a single token with empty end balance", + tx: func() sdk.Tx { + feeAmount := sdk.Coins{sdk.Coin{Amount: sdkmath.NewInt(10), Denom: "btc"}} + amount := feeAmount + s.MintCoinsForFeeCollector(amount) + + return s.BuildCosmosTxWithNSendMsg(1, feeAmount) + }, + expPass: true, + postChecks: func() { + expected := sdk.Coins{} + balance := s.GetFeeCollectorBalance() + s.Require().Equal(expected, balance) + }, + }, + { + name: "pass - burn fees of a single token with non-empty end balance", + tx: func() sdk.Tx { + feeAmount := sdk.Coins{sdk.Coin{Amount: sdkmath.NewInt(10), Denom: "evmos"}} + amount := sdk.Coins{sdk.Coin{Amount: sdkmath.NewInt(20), Denom: "evmos"}} + s.MintCoinsForFeeCollector(amount) + + return s.BuildCosmosTxWithNSendMsg(1, feeAmount) + }, + expPass: true, + postChecks: func() { + expected := sdk.Coins{sdk.Coin{Amount: sdkmath.NewInt(10), Denom: "evmos"}} + balance := s.GetFeeCollectorBalance() + s.Require().Equal(expected, balance) + }, + }, + { + name: "pass - burn fees of multiple tokens with empty end balance", + tx: func() sdk.Tx { + feeAmount := sdk.Coins{ + sdk.Coin{Amount: sdkmath.NewInt(10), Denom: "eth"}, + sdk.Coin{Amount: sdkmath.NewInt(10), Denom: "evmos"}, + } + amount := feeAmount + s.MintCoinsForFeeCollector(amount) + + return s.BuildCosmosTxWithNSendMsg(1, feeAmount) + }, + expPass: true, + postChecks: func() { + balance := s.GetFeeCollectorBalance() + s.Require().Equal(sdk.Coins{}, balance) + }, + }, + { //nolint:dupl + name: "pass - burn fees of multiple tokens with non-empty end balance", + tx: func() sdk.Tx { + feeAmount := sdk.Coins{ + sdk.Coin{Amount: sdkmath.NewInt(10), Denom: "btc"}, + sdk.Coin{Amount: sdkmath.NewInt(10), Denom: "evmos"}, + } + amount := sdk.Coins{ + sdk.Coin{Amount: sdkmath.NewInt(20), Denom: "btc"}, + sdk.Coin{Amount: sdkmath.NewInt(10), Denom: "evmos"}, + sdk.Coin{Amount: sdkmath.NewInt(3), Denom: "osmo"}, + } + s.MintCoinsForFeeCollector(amount) + + return s.BuildCosmosTxWithNSendMsg(1, feeAmount) + }, + expPass: true, + postChecks: func() { + expected := sdk.Coins{ + sdk.Coin{Amount: sdkmath.NewInt(10), Denom: "btc"}, + sdk.Coin{Amount: sdkmath.NewInt(3), Denom: "osmo"}, + } + balance := s.GetFeeCollectorBalance() + s.Require().Equal(expected, balance) + }, + }, + { //nolint:dupl + name: "pass - burn fees of multiple tokens, non-empty end balance, and multiple messages", + tx: func() sdk.Tx { + feeAmount := sdk.Coins{ + sdk.Coin{Amount: sdkmath.NewInt(10), Denom: "btc"}, + sdk.Coin{Amount: sdkmath.NewInt(10), Denom: "evmos"}, + } + amount := sdk.Coins{ + sdk.Coin{Amount: sdkmath.NewInt(20), Denom: "btc"}, + sdk.Coin{Amount: sdkmath.NewInt(10), Denom: "evmos"}, + sdk.Coin{Amount: sdkmath.NewInt(3), Denom: "osmo"}, + } + s.MintCoinsForFeeCollector(amount) + + return s.BuildCosmosTxWithNSendMsg(100, feeAmount) + }, + expPass: true, + postChecks: func() { + expected := sdk.Coins{ + sdk.Coin{Amount: sdkmath.NewInt(10), Denom: "btc"}, + sdk.Coin{Amount: sdkmath.NewInt(3), Denom: "osmo"}, + } + balance := s.GetFeeCollectorBalance() + s.Require().Equal(expected, balance) + }, + }, + } + + for _, tc := range testCases { + // Be sure to have a fresh new network before each test. It is not required for following + // test but it is still a good practice. + s.SetupTest() + s.Run(tc.name, func() { + // start each test with a fresh new block. + err := s.unitNetwork.NextBlock() + s.Require().NoError(err) + + burnDecorator := post.NewBurnDecorator( + authtypes.FeeCollectorName, + s.unitNetwork.App.BankKeeper, + ) + + // In the execution of the PostHandle method, simulate, success, and next have been + // hard-coded because they are not influencing the behavior of the BurnDecorator. + terminator := sdk.ChainPostDecorators(sdk.Terminator{}) + _, err = burnDecorator.PostHandle( + s.unitNetwork.GetContext(), + tc.tx(), + false, + false, + terminator, + ) + + if tc.expPass { + s.Require().NoError(err) + } else { + s.Require().Error(err, "expected error during HandlerOptions validation") + s.Require().Contains(err.Error(), tc.errContains, "expected a different error") + } + + tc.postChecks() + }) + } +} diff --git a/app/post/post.go b/app/post/post.go new file mode 100644 index 0000000000..302f0959e1 --- /dev/null +++ b/app/post/post.go @@ -0,0 +1,38 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package post + +import ( + "errors" + + sdk "github.com/cosmos/cosmos-sdk/types" + bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" +) + +// HandlerOptions are the options required for constructing a PostHandler. +type HandlerOptions struct { + FeeCollectorName string + BankKeeper bankkeeper.Keeper +} + +func (h HandlerOptions) Validate() error { + if h.FeeCollectorName == "" { + return errors.New("fee collector name cannot be empty") + } + + if h.BankKeeper == nil { + return errors.New("bank keeper cannot be nil") + } + + return nil +} + +// NewPostHandler returns a new PostHandler decorators chain. +func NewPostHandler(ho HandlerOptions) sdk.PostHandler { + postDecorators := []sdk.PostDecorator{ + NewBurnDecorator(ho.FeeCollectorName, ho.BankKeeper), + } + + return sdk.ChainPostDecorators(postDecorators...) +} diff --git a/app/post/post_test.go b/app/post/post_test.go new file mode 100644 index 0000000000..065732c862 --- /dev/null +++ b/app/post/post_test.go @@ -0,0 +1,69 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package post_test + +import ( + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" + "github.com/evmos/evmos/v16/app/post" +) + +func (s *PostTestSuite) TestPostHandlerOptions() { + validBankKeeper := s.unitNetwork.App.BankKeeper + validFeeCollector := authtypes.FeeCollectorName + + testCases := []struct { + name string + feeCollector string + bankKeeper bankkeeper.Keeper + expPass bool + errContains string + }{ + { + name: "fail - empty fee collector name", + feeCollector: "", + bankKeeper: validBankKeeper, + expPass: false, + errContains: "fee collector name cannot be empty", + }, + { + name: "fail - nil bank keeper", + feeCollector: validFeeCollector, + bankKeeper: nil, + expPass: false, + errContains: "bank keeper cannot be nil", + }, + { + name: "pass - correct inputs", + feeCollector: validFeeCollector, + bankKeeper: validBankKeeper, + expPass: true, + }, + } + + for _, tc := range testCases { + // Be sure to have a fresh new network before each test. It is not required for following + // test but it is still a good practice. + s.SetupTest() + s.Run(tc.name, func() { + // start each test with a fresh new block. + err := s.unitNetwork.NextBlock() + s.Require().NoError(err) + + handlerOptions := post.HandlerOptions{ + FeeCollectorName: tc.feeCollector, + BankKeeper: tc.bankKeeper, + } + + err = handlerOptions.Validate() + + if tc.expPass { + s.Require().NoError(err) + } else { + s.Require().Error(err, "expected error during HandlerOptions validation") + s.Require().Contains(err.Error(), tc.errContains, "expected a different error") + } + }) + } +} diff --git a/app/post/setup_test.go b/app/post/setup_test.go new file mode 100644 index 0000000000..52eeb450c3 --- /dev/null +++ b/app/post/setup_test.go @@ -0,0 +1,147 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package post_test + +import ( + "math/big" + "testing" + + "github.com/cosmos/cosmos-sdk/codec" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + sdk "github.com/cosmos/cosmos-sdk/types" + authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + "github.com/ethereum/go-ethereum/common" + "github.com/evmos/evmos/v16/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v16/testutil/integration/evmos/network" + evmtypes "github.com/evmos/evmos/v16/x/evm/types" + inflationtypes "github.com/evmos/evmos/v16/x/inflation/v1/types" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/stretchr/testify/suite" +) + +const ( + gasLimit = 100_000 +) + +type PostTestSuite struct { + suite.Suite + + unitNetwork *network.UnitTestNetwork + grpcHandler grpc.Handler + keyring testkeyring.Keyring + + txBuilder client.TxBuilder + + from common.Address + to common.Address +} + +func (s *PostTestSuite) SetupTest() { + keyring := testkeyring.New(2) + unitNetwork := network.NewUnitTestNetwork( + network.WithPreFundedAccounts(keyring.GetAllAccAddrs()...), + ) + grpcHandler := grpc.NewIntegrationHandler(unitNetwork) + + // TxBuilder is used to create Ethereum and Cosmos Tx to test + // the fee burner. + interfaceRegistry := codectypes.NewInterfaceRegistry() + codec := codec.NewProtoCodec(interfaceRegistry) + txConfig := authtx.NewTxConfig(codec, authtx.DefaultSignModes) + txBuilder := txConfig.NewTxBuilder() + + s.from = keyring.GetAddr(0) + s.to = keyring.GetAddr(1) + s.unitNetwork = unitNetwork + s.grpcHandler = grpcHandler + s.keyring = keyring + s.txBuilder = txBuilder +} + +func TestPostTestSuite(t *testing.T) { + suite.Run(t, new(PostTestSuite)) +} + +func (s *PostTestSuite) BuildEthTx() sdk.Tx { + chainID := s.unitNetwork.App.EvmKeeper.ChainID() + nonce := s.unitNetwork.App.EvmKeeper.GetNonce( + s.unitNetwork.GetContext(), + common.BytesToAddress(s.from.Bytes()), + ) + + ethTxParams := &evmtypes.EvmTxArgs{ + ChainID: chainID, + Nonce: nonce, + To: &s.to, + GasLimit: gasLimit, + GasPrice: big.NewInt(1), + GasTipCap: big.NewInt(1), + } + + msgEthereumTx := evmtypes.NewTx(ethTxParams) + msgEthereumTx.From = s.from.String() + tx, err := msgEthereumTx.BuildTx(s.txBuilder, "evmos") + s.Require().NoError(err) + return tx +} + +// BuildCosmosTxWithSendMsg is an utils function to create an sdk.Tx containing +// a single message of type MsgSend from the bank module. +func (s *PostTestSuite) BuildCosmosTxWithNSendMsg(n int, feeAmount sdk.Coins) sdk.Tx { + messages := make([]sdk.Msg, n) + + sendMsg := banktypes.MsgSend{ + FromAddress: s.from.String(), + ToAddress: s.to.String(), + Amount: feeAmount, + } + + for i := range messages { + messages[i] = &sendMsg + } + + s.txBuilder.SetGasLimit(gasLimit) + s.txBuilder.SetFeeAmount(feeAmount) + err := s.txBuilder.SetMsgs(messages...) + s.Require().NoError(err) + return s.txBuilder.GetTx() +} + +// MintCoinForFeeCollector allows to mint a specific amount of coins from the bank +// and to transfer them to the FeeCollector. +func (s *PostTestSuite) MintCoinsForFeeCollector(amount sdk.Coins) { + // Minting tokens for the FeeCollector to simulate fee accrued. + err := s.unitNetwork.App.BankKeeper.MintCoins( + s.unitNetwork.GetContext(), + inflationtypes.ModuleName, + amount, + ) + s.Require().NoError(err) + + err = s.unitNetwork.App.BankKeeper.SendCoinsFromModuleToModule( + s.unitNetwork.GetContext(), + inflationtypes.ModuleName, + authtypes.FeeCollectorName, + amount, + ) + s.Require().NoError(err) + + balance := s.GetFeeCollectorBalance() + s.Require().Equal(amount, balance) +} + +// GetFeeCollectorBalance is an utility function to query the balance +// of the FeeCollector module. +func (s *PostTestSuite) GetFeeCollectorBalance() sdk.Coins { + address := s.unitNetwork.App.AccountKeeper.GetModuleAddress(authtypes.FeeCollectorName) + balance := s.unitNetwork.App.BankKeeper.GetAllBalances( + s.unitNetwork.GetContext(), + address, + ) + return balance +} From b587e58a9e31c05d5167b324beddd21f3ddaf514 Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Mon, 4 Dec 2023 18:32:46 +0100 Subject: [PATCH 011/345] fix(incentives): remove incentives burning logic from upgrade handler (#2131) * remove incentives burning logic from upgrade handler * add changelog entry --- CHANGELOG.md | 1 + app/app.go | 1 - app/upgrades/v16/upgrades.go | 6 ------ 3 files changed, 1 insertion(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0146cde25a..d79c5626c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -131,6 +131,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (p256-precompile) [#2110](https://github.com/evmos/evmos/pull/2110) Adjust `p256` precompile address. - (upgrade) [#2117](https://github.com/evmos/evmos/pull/2117) Enable Stride and Osmosis outposts in v16 upgrade handler. - (osmosis-outpost) [#2109](https://github.com/evmos/evmos/pull/2109) Add Osmosis outpost to available EVM extensions. +- (upgrade) [#2131](https://github.com/evmos/evmos/pull/2131) Remove incentives pool burning logic from upgrade handler. ### Bug Fixes diff --git a/app/app.go b/app/app.go index ef321b8ff5..6b0b8391a6 100644 --- a/app/app.go +++ b/app/app.go @@ -1255,7 +1255,6 @@ func (app *Evmos) setupUpgradeHandlers() { v16.CreateUpgradeHandler( app.mm, app.configurator, app.EvmKeeper, - app.BankKeeper, app.InflationKeeper, ), ) diff --git a/app/upgrades/v16/upgrades.go b/app/upgrades/v16/upgrades.go index 41c1b1fbb0..2c19b56c4b 100644 --- a/app/upgrades/v16/upgrades.go +++ b/app/upgrades/v16/upgrades.go @@ -5,7 +5,6 @@ package v16 import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" - bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" "github.com/evmos/evmos/v16/precompiles/bech32" osmosisoutpost "github.com/evmos/evmos/v16/precompiles/outposts/osmosis" @@ -21,7 +20,6 @@ func CreateUpgradeHandler( mm *module.Manager, configurator module.Configurator, ek *evmkeeper.Keeper, - bankKeeper bankkeeper.Keeper, inflationKeeper inflationkeeper.Keeper, ) upgradetypes.UpgradeHandler { return func(ctx sdk.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { @@ -43,10 +41,6 @@ func CreateUpgradeHandler( logger.Error("failed to enable outposts", "error", err.Error()) } - if err := BurnUsageIncentivesPool(ctx, bankKeeper); err != nil { - logger.Error("failed to burn inflation pool", "error", err.Error()) - } - if err := UpdateInflationParams(ctx, inflationKeeper); err != nil { logger.Error("failed to update inflation params", "error", err.Error()) } From cfad1eea461f417f53cd51af8328e83499f68898 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Dec 2023 17:49:30 +0000 Subject: [PATCH 012/345] build(deps): bump github.com/linxGnu/grocksdb from 1.8.5 to 1.8.6 (#2108) * build(deps): bump github.com/linxGnu/grocksdb from 1.8.5 to 1.8.6 Bumps [github.com/linxGnu/grocksdb](https://github.com/linxGnu/grocksdb) from 1.8.5 to 1.8.6. - [Release notes](https://github.com/linxGnu/grocksdb/releases) - [Commits](https://github.com/linxGnu/grocksdb/compare/v1.8.5...v1.8.6) --- updated-dependencies: - dependency-name: github.com/linxGnu/grocksdb dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * gomod2nix generate --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: tom --- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 730f0f9d2a..925dc63909 100644 --- a/go.mod +++ b/go.mod @@ -29,7 +29,7 @@ require ( github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/hashicorp/go-version v1.6.0 github.com/improbable-eng/grpc-web v0.15.0 - github.com/linxGnu/grocksdb v1.8.5 + github.com/linxGnu/grocksdb v1.8.6 github.com/onsi/ginkgo/v2 v2.13.2 github.com/onsi/gomega v1.30.0 github.com/ory/dockertest/v3 v3.10.0 diff --git a/go.sum b/go.sum index c3c1b568e4..6eed761d05 100644 --- a/go.sum +++ b/go.sum @@ -834,8 +834,8 @@ github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6 github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/linxGnu/grocksdb v1.8.5 h1:Okfk5B1h0ikCYdDM7Tc5yJUS8LTwAmMBq5IPWTmOLPs= -github.com/linxGnu/grocksdb v1.8.5/go.mod h1:xZCIb5Muw+nhbDK4Y5UJuOrin5MceOuiXkVUR7vp4WY= +github.com/linxGnu/grocksdb v1.8.6 h1:O7I6SIGPrypf3f/gmrrLUBQDKfO8uOoYdWf4gLS06tc= +github.com/linxGnu/grocksdb v1.8.6/go.mod h1:xZCIb5Muw+nhbDK4Y5UJuOrin5MceOuiXkVUR7vp4WY= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= diff --git a/gomod2nix.toml b/gomod2nix.toml index d455b44d37..eb2cc1aa66 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -426,8 +426,8 @@ schema = 3 version = "v0.1.0" hash = "sha256-wQqGTtRWsfR9n0O/SXHVgECebbnNmHddxJIbG63OJBQ=" [mod."github.com/linxGnu/grocksdb"] - version = "v1.8.5" - hash = "sha256-LDqE1VMd6z4eD47tlzhIOQ3vUySoli4MKUsihmi1g2I=" + version = "v1.8.6" + hash = "sha256-QOiVB6QU3AKNuuw1dbslszl+CwCF52f0hfb3YXDvLq8=" [mod."github.com/magiconair/properties"] version = "v1.8.7" hash = "sha256-XQ2bnc2s7/IH3WxEO4GishZurMyKwEclZy1DXg+2xXc=" From 8a890e22ff2d71bc7e72eb565752045218501b0a Mon Sep 17 00:00:00 2001 From: Freddy Caceres Date: Tue, 5 Dec 2023 03:29:23 +0800 Subject: [PATCH 013/345] tests(e2e): Osmosis e2e tests (#2029) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * cosmoswasm artifacts * first pass * run make format * add comments * run make format * fix lint * fix wrong params * lint code * lint code * refactor utils func * update osmosis ver * update compile contracts script * enable osmosis outpost * update bins & add contract patch * remove unnecessary dump to file * update app.go with bank keeper in availablePrecompiles * refactor * update test setup for contract v1 * remove unnecessary changes * make format * fix lint issues * fix lint issues * add channel patch * update comment * fix lint issues * fix lint issues * Apply suggestions from code review Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> * address review comments * fix onFailDelivery unit test * fix gosec issues * Update precompiles/outposts/osmosis/types.go --------- Co-authored-by: facs95 Co-authored-by: tom Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> --- CHANGELOG.md | 1 + nix/default.nix | 6 +- precompiles/outposts/osmosis/types.go | 33 +- precompiles/outposts/osmosis/types_test.go | 38 +- scripts/compile-cosmwasm-contracts.sh | 27 ++ tests/nix_tests/configs/osmosis-channel.patch | 16 + .../nix_tests/configs/osmosis-outpost.jsonnet | 79 +---- tests/nix_tests/configs/osmosis-outpost.nix | 15 + .../configs/xcs-osmosis-contract.patch | 16 + tests/nix_tests/cosmoscli.py | 170 +++++++++ .../cosmwasm/artifacts/checksums.txt | 7 + .../cosmwasm/artifacts/crosschain_swaps.wasm | Bin 0 -> 334003 bytes .../cosmwasm/artifacts/swaprouter.wasm | Bin 0 -> 241899 bytes tests/nix_tests/ibc_utils.py | 12 +- tests/nix_tests/osmosis/evmosOsmosisPool.json | 8 + tests/nix_tests/test_osmosis_outpost.py | 326 ++++++++++++++++-- tests/nix_tests/utils.py | 47 +++ 17 files changed, 672 insertions(+), 129 deletions(-) create mode 100755 scripts/compile-cosmwasm-contracts.sh create mode 100644 tests/nix_tests/configs/osmosis-channel.patch create mode 100644 tests/nix_tests/configs/osmosis-outpost.nix create mode 100644 tests/nix_tests/configs/xcs-osmosis-contract.patch create mode 100644 tests/nix_tests/cosmwasm/artifacts/checksums.txt create mode 100644 tests/nix_tests/cosmwasm/artifacts/crosschain_swaps.wasm create mode 100644 tests/nix_tests/cosmwasm/artifacts/swaprouter.wasm create mode 100644 tests/nix_tests/osmosis/evmosOsmosisPool.json diff --git a/CHANGELOG.md b/CHANGELOG.md index d79c5626c6..8d193be2b5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -131,6 +131,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (p256-precompile) [#2110](https://github.com/evmos/evmos/pull/2110) Adjust `p256` precompile address. - (upgrade) [#2117](https://github.com/evmos/evmos/pull/2117) Enable Stride and Osmosis outposts in v16 upgrade handler. - (osmosis-outpost) [#2109](https://github.com/evmos/evmos/pull/2109) Add Osmosis outpost to available EVM extensions. +- (osmosis-outpost) [#2029](https://github.com/evmos/evmos/pull/2029) Add Osmosis outpost end-to-end tests. - (upgrade) [#2131](https://github.com/evmos/evmos/pull/2131) Remove incentives pool burning logic from upgrade handler. ### Bug Fixes diff --git a/nix/default.nix b/nix/default.nix index 1baef87493..0be206799c 100644 --- a/nix/default.nix +++ b/nix/default.nix @@ -34,9 +34,9 @@ import sources.nixpkgs { # cause it is faster than building from source osmosisd = pkgs.callPackage ./bin.nix { appName = "osmosisd"; - version = "v19.2.0"; - binUrl = "https://github.com/osmosis-labs/osmosis/releases/download/v19.2.0/osmosisd-19.2.0-linux-amd64"; - sha256 = "sha256-cj/xxTSes8A5w9xfVYlbveLhSZ/nwKlpYMxvre7IFMQ="; + version = "v20.2.1"; + binUrl = "https://github.com/osmosis-labs/osmosis/releases/download/v20.2.1/osmosisd-20.2.1-linux-amd64"; + sha256 = "sha256-TmCocIYcoXgZ+8tJ//mBtXMewRIdfLq0OYfF8E/wmfo="; }; # Using gaia v11 (includes the PFM) cause after this version the '--min-self-delegation' flag is removed # from the 'gentx' cmd. diff --git a/precompiles/outposts/osmosis/types.go b/precompiles/outposts/osmosis/types.go index a7dcc5da08..1f0116c9ba 100644 --- a/precompiles/outposts/osmosis/types.go +++ b/precompiles/outposts/osmosis/types.go @@ -7,6 +7,7 @@ import ( "encoding/json" "fmt" "math/big" + "strconv" "golang.org/x/exp/slices" @@ -75,7 +76,7 @@ func NewIBCChannel( // TWAP represents a Time-Weighted Average Price configuration. type TWAP struct { // SlippagePercentage specifies the acceptable slippage percentage for a transaction. - SlippagePercentage uint8 `json:"slippage_percentage"` + SlippagePercentage string `json:"slippage_percentage"` // WindowSeconds defines the duration for which the TWAP is calculated. WindowSeconds uint64 `json:"window_seconds"` } @@ -98,7 +99,7 @@ type OsmosisSwap struct { // OnFailedDelivery specifies the action to be taken in case the swap delivery fails. // This can be "do_nothing" or the address on the Osmosis chain that can recover funds // in case of errors. - OnFailedDelivery string `json:"on_failed_delivery"` + OnFailedDelivery interface{} `json:"on_failed_delivery"` // NextMemo contains any additional memo information for the next operation in a PFM setting. NextMemo string `json:"next_memo,omitempty"` } @@ -123,6 +124,12 @@ type RawPacketMetadata struct { Wasm *WasmMemo `json:"wasm"` } +// RecoveryAddress is the address to send the funds in case of failed delivery. +type RecoveryAddress struct { + // The recovery address in Osmosis chain. + Address string `json:"local_recovery_addr"` +} + // Validate performs basic validation of the IBC memo for the Osmosis outpost. // This function assumes that memo field is parsed with ParseSwapPacketData, which // performs data casting ensuring outputDenom cannot be an empty string. @@ -142,7 +149,11 @@ func (r RawPacketMetadata) Validate() error { return fmt.Errorf(ErrReceiverAddress, "not a valid evmos address") } - if osmosisSwap.Slippage.TWAP.SlippagePercentage == 0 || osmosisSwap.Slippage.TWAP.SlippagePercentage > MaxSlippagePercentage { + slippagePercNum, err := strconv.ParseUint(osmosisSwap.Slippage.TWAP.SlippagePercentage, 10, 8) + if err != nil { + return fmt.Errorf(ErrSlippagePercentage, "not valid slippage percentage") + } + if slippagePercNum == 0 || slippagePercNum > uint64(MaxSlippagePercentage) { return fmt.Errorf(ErrSlippagePercentage) } @@ -159,8 +170,10 @@ func CreatePacketWithMemo( outputDenom, receiver, contract string, slippagePercentage uint8, windowSeconds uint64, - onFailedDelivery, nextMemo string, + onFailedDelivery interface{}, nextMemo string, ) *RawPacketMetadata { + // slippage percentage is a string in the memo field + slippagePercStr := strconv.FormatUint(uint64(slippagePercentage), 10) return &RawPacketMetadata{ &WasmMemo{ Contract: contract, @@ -169,7 +182,7 @@ func CreatePacketWithMemo( OutputDenom: outputDenom, Slippage: &Slippage{ &TWAP{ - SlippagePercentage: slippagePercentage, + SlippagePercentage: slippagePercStr, WindowSeconds: windowSeconds, }, }, @@ -186,7 +199,7 @@ func CreatePacketWithMemo( // string. func (r RawPacketMetadata) String() string { // Convert the struct to a JSON string - jsonBytes, err := json.MarshalIndent(r, "", " ") + jsonBytes, err := json.Marshal(r) if err != nil { return "" } @@ -196,20 +209,20 @@ func (r RawPacketMetadata) String() string { // CreateOnFailedDeliveryField is an utility function to create the memo field // onFailedDelivery. The returned string is the bech32 of the input or "do_nothing". -func CreateOnFailedDeliveryField(address string) string { - onFailedDelivery := address +func CreateOnFailedDeliveryField(address string) interface{} { + recoveryAddress := address bech32Prefix, addressBytes, err := cosmosbech32.DecodeAndConvert(address) if err != nil { return DefaultOnFailedDelivery } if bech32Prefix != OsmosisPrefix { - onFailedDelivery, err = sdk.Bech32ifyAddressBytes(OsmosisPrefix, addressBytes) + recoveryAddress, err = sdk.Bech32ifyAddressBytes(OsmosisPrefix, addressBytes) if err != nil { return DefaultOnFailedDelivery } } - return onFailedDelivery + return RecoveryAddress{Address: recoveryAddress} } // ValidateInputOutput validates the input and output tokens used in the Osmosis swap. diff --git a/precompiles/outposts/osmosis/types_test.go b/precompiles/outposts/osmosis/types_test.go index e396bb28cf..72192c2283 100644 --- a/precompiles/outposts/osmosis/types_test.go +++ b/precompiles/outposts/osmosis/types_test.go @@ -27,9 +27,9 @@ func TestCreatePacketWithMemo(t *testing.T) { contract string slippagePercentage uint8 windowSeconds uint64 - onFailedDelivery string + onFailedDelivery interface{} nextMemo string - expNextMemo bool + expMemo string }{ { name: "pass - correct string without memo", @@ -40,7 +40,7 @@ func TestCreatePacketWithMemo(t *testing.T) { windowSeconds: 30, onFailedDelivery: doNothing, nextMemo: "", - expNextMemo: false, + expMemo: "{\"wasm\":{\"contract\":\"evmos1vl0x3xr0zwgrllhdzxxlkal7txnnk56q3552x7\",\"msg\":{\"osmosis_swap\":{\"output_denom\":\"aevmos\",\"slippage\":{\"twap\":{\"slippage_percentage\":\"10\",\"window_seconds\":30}},\"receiver\":\"evmos1vl0x3xr0zwgrllhdzxxlkal7txnnk56q3552x7\",\"on_failed_delivery\":\"do_nothing\"}}}}", }, { name: "pass - correct string with memo", @@ -51,7 +51,18 @@ func TestCreatePacketWithMemo(t *testing.T) { windowSeconds: 30, onFailedDelivery: doNothing, nextMemo: "a next memo", - expNextMemo: true, + expMemo: "{\"wasm\":{\"contract\":\"evmos1vl0x3xr0zwgrllhdzxxlkal7txnnk56q3552x7\",\"msg\":{\"osmosis_swap\":{\"output_denom\":\"aevmos\",\"slippage\":{\"twap\":{\"slippage_percentage\":\"10\",\"window_seconds\":30}},\"receiver\":\"evmos1vl0x3xr0zwgrllhdzxxlkal7txnnk56q3552x7\",\"on_failed_delivery\":\"do_nothing\",\"next_memo\":\"a next memo\"}}}}", + }, + { + name: "pass - correct string with memo and recovery address", + outputDenom: utils.BaseDenom, + receiver: receiver, + contract: contract, + slippagePercentage: 10, + windowSeconds: 30, + onFailedDelivery: osmosisoutpost.RecoveryAddress{"osmo1g8j7tgfam7kmj86zks5rcfxruf9lzp87u8mwdf"}, + nextMemo: "a next memo", + expMemo: "{\"wasm\":{\"contract\":\"evmos1vl0x3xr0zwgrllhdzxxlkal7txnnk56q3552x7\",\"msg\":{\"osmosis_swap\":{\"output_denom\":\"aevmos\",\"slippage\":{\"twap\":{\"slippage_percentage\":\"10\",\"window_seconds\":30}},\"receiver\":\"evmos1vl0x3xr0zwgrllhdzxxlkal7txnnk56q3552x7\",\"on_failed_delivery\":{\"local_recovery_addr\":\"osmo1g8j7tgfam7kmj86zks5rcfxruf9lzp87u8mwdf\"},\"next_memo\":\"a next memo\"}}}}", }, } @@ -64,15 +75,10 @@ func TestCreatePacketWithMemo(t *testing.T) { packet := osmosisoutpost.CreatePacketWithMemo( tc.outputDenom, tc.receiver, tc.contract, tc.slippagePercentage, tc.windowSeconds, tc.onFailedDelivery, tc.nextMemo, ) - packetString := packet.String() - err := ValidateAndParseWasmRoutedMemo(packetString, tc.receiver) + memo := packet.String() + require.Equal(t, tc.expMemo, memo) + err := ValidateAndParseWasmRoutedMemo(memo, tc.receiver) require.NoError(t, err, "memo is not a valid wasm routed JSON formatted string") - - if tc.expNextMemo { - require.Contains(t, packetString, fmt.Sprintf("\"next_memo\": \"%s\"", tc.nextMemo)) - } else { - require.NotContains(t, packetString, fmt.Sprintf("next_memo: %s", tc.nextMemo)) - } }) } @@ -448,12 +454,12 @@ func TestCreateOnFailedDeliveryField(t *testing.T) { testCases := []struct { name string address string - expRes string + expRes interface{} }{ { name: "receiver osmo bech32", address: address, - expRes: address, + expRes: osmosisoutpost.RecoveryAddress{address}, }, { name: "use default do_nothing", @@ -463,7 +469,7 @@ func TestCreateOnFailedDeliveryField(t *testing.T) { { name: "convert receiver to osmo bech32", address: "cosmos1c2m73hdt6f37w9jqpqps5t3ha3st99dcsp7lf5", - expRes: address, + expRes: osmosisoutpost.RecoveryAddress{address}, }, } @@ -474,7 +480,7 @@ func TestCreateOnFailedDeliveryField(t *testing.T) { t.Parallel() onFailedDelivery := osmosisoutpost.CreateOnFailedDeliveryField(tc.address) - require.Contains(t, onFailedDelivery, tc.expRes) + require.Equal(t, onFailedDelivery, tc.expRes) }) } } diff --git a/scripts/compile-cosmwasm-contracts.sh b/scripts/compile-cosmwasm-contracts.sh new file mode 100755 index 0000000000..398eed0c7f --- /dev/null +++ b/scripts/compile-cosmwasm-contracts.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash + +echo "Compiling CosmWasm contracts" + +# For the osmosis outpost we're using the v1 of the +# crosschain swap contract. This is available in v15.x +OSMOSIS_VERSION=v15.2.0 +# For this script to work properly +# We need to copy the contents of the cosmwasm folder of the +# Osmosis repo (https://github.com/osmosis-labs/osmosis/tree/v20.2.1/cosmwasm) +# into the ./tests/nix_tests/cosmwasm folder + +git clone -b $OSMOSIS_VERSION --single-branch https://github.com/osmosis-labs/osmosis.git /tmp/osmosis + +cp -r /tmp/osmosis/cosmwasm/* ./tests/nix_tests/cosmwasm +rm -rf /tmp/osmosis + +cd ./tests/nix_tests/cosmwasm || exit +# This command compiles the contracts for x86-64 (amd64) arch +docker run --rm -v "$(pwd)":/code \ + --mount type=volume,source="$(basename "$(pwd)")_cache",target=/target \ + --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ + cosmwasm/workspace-optimizer:0.15.0 + +# Remove all files and subdirectories except 'artifacts' +# where the compiled contracts are located +find . -mindepth 1 -maxdepth 1 ! -name 'artifacts' -exec rm -r {} \; diff --git a/tests/nix_tests/configs/osmosis-channel.patch b/tests/nix_tests/configs/osmosis-channel.patch new file mode 100644 index 0000000000..940ddca95d --- /dev/null +++ b/tests/nix_tests/configs/osmosis-channel.patch @@ -0,0 +1,16 @@ +diff --git a/x/evm/keeper/precompiles.go b/x/evm/keeper/precompiles.go +index b0aa3202..39668025 100644 +--- a/x/evm/keeper/precompiles.go ++++ b/x/evm/keeper/precompiles.go +@@ -88,8 +88,10 @@ func AvailablePrecompiles( + panic(fmt.Errorf("failed to instantiate stride outpost: %w", err)) + } + ++ // Update the channel for the corresponding one in the ++ // Nix testing setup + osmosisOutpost, err := osmosisoutpost.NewPrecompile( +- transfertypes.PortID, "channel-215", ++ transfertypes.PortID, "channel-0", + osmosisoutpost.XCSContractTestnet, + authzKeeper, bankKeeper, transferKeeper, stakingKeeper, erc20Keeper, channelKeeper, + ) diff --git a/tests/nix_tests/configs/osmosis-outpost.jsonnet b/tests/nix_tests/configs/osmosis-outpost.jsonnet index ce48b6fa48..76aa98f214 100644 --- a/tests/nix_tests/configs/osmosis-outpost.jsonnet +++ b/tests/nix_tests/configs/osmosis-outpost.jsonnet @@ -10,79 +10,6 @@ config { }, }, }, - 'cosmoshub-1': { - cmd: 'gaiad', - 'account-prefix': 'cosmos', - 'app-config': { - 'minimum-gas-prices': '0.0025uatom', - }, - validators: [ - { - coins: '2234240000000000000uatom', - staked: '10000000000000uatom', - mnemonic: '${VALIDATOR1_MNEMONIC}', - base_port: 26800, - }, - { - coins: '987870000000000000uatom', - staked: '20000000000000uatom', - mnemonic: '${VALIDATOR2_MNEMONIC}', - base_port: 26810, - }, - ], - accounts: [ - { - name: 'community', - coins: '10000000000000uatom', - mnemonic: '${COMMUNITY_MNEMONIC}', - }, - { - name: 'relayer', - coins: '10000000000000uatom', - mnemonic: '${SIGNER1_MNEMONIC}', - }, - { - name: 'signer2', - coins: '10000000000000uatom', - mnemonic: '${SIGNER2_MNEMONIC}', - }, - ], - genesis: { - app_state: { - staking: { - params: { - unbonding_time: '1814400s', - bond_denom: 'uatom', - }, - }, - gov: { - voting_params: { - voting_period: '1814400s', - }, - deposit_params: { - max_deposit_period: '1814400s', - min_deposit: [ - { - denom: 'uatom', - amount: '10000000', - }, - ], - }, - }, - mint: { - params: { - mint_denom: 'uatom', - }, - }, - transfer: { - params: { - receive_enabled: true, - send_enabled: true, - }, - }, - }, - }, - }, 'osmosis-1': { cmd: 'osmosisd', 'account-prefix': 'osmo', @@ -153,7 +80,7 @@ config { denom: 'uosmo', amount: '50000000', }, - ], + ], }, }, poolincentives: { @@ -165,7 +92,7 @@ config { params: { mint_denom: 'uosmo', }, - }, + }, transfer: { params: { receive_enabled: true, @@ -174,7 +101,7 @@ config { }, }, }, - }, + }, relayer: { mode: { clients: { diff --git a/tests/nix_tests/configs/osmosis-outpost.nix b/tests/nix_tests/configs/osmosis-outpost.nix new file mode 100644 index 0000000000..98bb8c115d --- /dev/null +++ b/tests/nix_tests/configs/osmosis-outpost.nix @@ -0,0 +1,15 @@ +{ pkgs ? import ../../../nix { } }: +let evmosd = (pkgs.callPackage ../../../. { }); +in +evmosd.overrideAttrs (oldAttrs: { + # Patch the evmos binary to: + # - allow to register WEVMOS token pair + # - use the CrossChainSwap contract address in the testing setup + # - update the corresponding IBC channel to match the tests setup + patches = oldAttrs.patches or [ ] ++ [ + ./allow-wevmos-register.patch + ./xcs-osmosis-contract.patch + ./osmosis-channel.patch + ]; +}) + diff --git a/tests/nix_tests/configs/xcs-osmosis-contract.patch b/tests/nix_tests/configs/xcs-osmosis-contract.patch new file mode 100644 index 0000000000..32aac8684b --- /dev/null +++ b/tests/nix_tests/configs/xcs-osmosis-contract.patch @@ -0,0 +1,16 @@ +diff --git a/precompiles/outposts/osmosis/osmosis.go b/precompiles/outposts/osmosis/osmosis.go +index 84ec3b48..bee61b7e 100644 +--- a/precompiles/outposts/osmosis/osmosis.go ++++ b/precompiles/outposts/osmosis/osmosis.go +@@ -29,8 +29,10 @@ const ( + // OsmosisOutpostAddress is the address of the Osmosis outpost precompile. + OsmosisOutpostAddress = "0x0000000000000000000000000000000000000901" + ++ // Update the XCSContractTestnet to match the contract ++ // address in the testing setup + // XCSContract address for Osmosis testnet. +- XCSContractTestnet = "osmo18rj46qcpr57m3qncrj9cuzm0gn3km08w5jxxlnw002c9y7xex5xsu74ytz" ++ XCSContractTestnet = "osmo14sfz9e7t6nfxlfyqtdq3zngn5aryn9900gwzdjsp4u334pn089hs9lqdwx" + // XCSContract address for Osmosis mainnet. + XCSContractMainnet = "" + ) diff --git a/tests/nix_tests/cosmoscli.py b/tests/nix_tests/cosmoscli.py index a1f6aa150d..859c3e4be8 100644 --- a/tests/nix_tests/cosmoscli.py +++ b/tests/nix_tests/cosmoscli.py @@ -167,6 +167,10 @@ def make_multisig(self, name, signer1, signer2): # ========================== # TX utils # ========================== + def block_results_rpc(self): + rsp = requests.get(f"{self.node_rpc_http}/block_results").json() + assert "error" not in rsp, rsp["error"] + return rsp["result"] def tx_search(self, events: str): "/tx_search" @@ -836,6 +840,7 @@ def ibc_transfer( channel, # src channel target_version, # chain version number of target chain i=0, + fees="0aevmos", ): return json.loads( self.raw( @@ -856,6 +861,7 @@ def ibc_transfer( chain_id=self.chain_id, packet_timeout_height=f"{target_version}-10000000000", packet_timeout_timestamp=0, + fees=fees, ) ) @@ -1169,3 +1175,167 @@ def get_host_zones(self, **kwargs): ) ) return res["host_zone"] + + # TODO: create different classes for each chains CLI + # ========================== + # Osmosis specific + # ========================== + def wasm_store_binary( + self, + from_, + contract_path, + **kwargs, + ): + """ + Store wasm binary contract. + """ + return json.loads( + self.raw( + "tx", + "wasm", + "store", + contract_path, + "-y", + from_=from_, + home=self.data_dir, + node=self.node_rpc, + gas_adjustment=1.3, + gas=4000000, + gas_prices="0.25uosmo", + keyring_backend="test", + chain_id=self.chain_id, + **kwargs, + ) + ) + + def wasm_instante2( + self, + from_, + contract_code, + init_args, + label, + **kwargs, + ): + """ + Store instantiate wasm contract with reproducible address. + """ + # This could be any constant number. + # Its only meant to guarantee determinism. + salt = 74657374 + return json.loads( + self.raw( + "tx", + "wasm", + "instantiate2", + contract_code, + init_args, + salt, + "--label", + label, + "--no-admin", + "-y", + "--fix-msg", + from_=from_, + home=self.data_dir, + node=self.node_rpc, + gas_adjustment=1.3, + gas=2000000, + gas_prices="0.25uosmo", + keyring_backend="test", + chain_id=self.chain_id, + **kwargs, + ) + ) + + def wasm_execute( + self, + from_, + contract_address, + execute_args, + **kwargs, + ): + """ + Execute a wasm contract. + """ + # This could be any constant number. + return json.loads( + self.raw( + "tx", + "wasm", + "execute", + contract_address, + execute_args, + "-y", + from_=from_, + home=self.data_dir, + node=self.node_rpc, + gas_adjustment=1.3, + gas=2000000, + gas_prices="0.25uosmo", + keyring_backend="test", + chain_id=self.chain_id, + **kwargs, + ) + ) + + def get_wasm_contract_by_code(self, code, **kwargs): + """ + Queries all wasm instances associated with a code ID. + """ + default_kwargs = {"output": "json", "home": self.data_dir} + res = json.loads( + self.raw( + "q", + "wasm", + "list-contract-by-code", + code, + **(default_kwargs | kwargs), + ) + ) + return res["contracts"] + + def get_wasm_contract_state(self, contract_addr, query_args, **kwargs): + """ + Queries the wasm contract state. + """ + default_kwargs = {"output": "json", "home": self.data_dir} + res = json.loads( + self.raw( + "q", + "wasm", + "contract-state", + "smart", + contract_addr, + query_args, + **(default_kwargs | kwargs), + ) + ) + return res["contracts"] + + def gamm_create_pool( + self, + from_, + pool_file_path, + **kwargs, + ): + """ + Create Osmosis pools in gamm. + """ + return json.loads( + self.raw( + "tx", + "gamm", + "create-pool", + "-y", + pool_file=pool_file_path, + from_=from_, + home=self.data_dir, + node=self.node_rpc, + gas_adjustment=1.3, + gas=2000000, + gas_prices="0.25uosmo", + keyring_backend="test", + chain_id=self.chain_id, + **kwargs, + ) + ) diff --git a/tests/nix_tests/cosmwasm/artifacts/checksums.txt b/tests/nix_tests/cosmwasm/artifacts/checksums.txt new file mode 100644 index 0000000000..92d3cf2d0b --- /dev/null +++ b/tests/nix_tests/cosmwasm/artifacts/checksums.txt @@ -0,0 +1,7 @@ +e5072805ae37064ec470a46715c99577518fba6144971c67d8a2dc73f51c24b6 crosschain_registry-aarch64.wasm +353401d8cb472dac181be9d8697aed1a0ac14f593bbb98c19f9650399e16dbbf crosschain_registry.wasm +fde49646e4089213f3f297a4b0aa309b2a27004fda0c38da23e7df7f9d704185 crosschain_swaps-aarch64.wasm +545fe15e9254c6407d1e158cc9fb89eab64c25ae720575255fd9f008018896e5 crosschain_swaps.wasm +bf790a16b6bc54238a88218b6163c6c59b9f170f8b5a24e28b5859a6ca716525 outpost.wasm +6ddb28f6cb9737895f6f7f9fcd67c86f8e5bd83c2c5c46581ff421c74a3445d2 swaprouter-aarch64.wasm +df52097d7da82a56eeedcb719c6017da159229d6d4d5ca5eb12ae8ea0ad86a0f swaprouter.wasm diff --git a/tests/nix_tests/cosmwasm/artifacts/crosschain_swaps.wasm b/tests/nix_tests/cosmwasm/artifacts/crosschain_swaps.wasm new file mode 100644 index 0000000000000000000000000000000000000000..30a24f45f7e1487fbc5fe348459a3e7f59715421 GIT binary patch literal 334003 zcmeFa3$$g`S?9YR`+4@>=j^IF1w~Z>YwwiZr@Wk|=!;ZAuv6;{ipMavBu%`C+yNw2 z2I^D@6a}|(2cb?vB`FhBqG(7&Q+b#oCPWfR8{d_vEt+VfVnR$>OQj>NG1iFK;%zkd z_y4}R)?WKO>H)Dwk6}~ES$nND=Qrp4=J%f8oGZHNj@QLe6vclTpL1h!;6Qvpf1?}I z1NK{&=*Ajx1(Z|t~-?EJ;_wM>(;yKH@*7xd-p|k z{ci4j^$mM>-Lx}m=&r@x|Fid&eY>Jqw{3g*y4T;eYgG7-*W7e#loVBO-L-$8SMA-j zbLZY0?z(BuEjw?bzJXh1VFTW@&{Z~ot1QKXt)_U1cZchjxqv;G~sUUS>O{kDtd zFSy~ZU3+i&zBhOy>qd|F?s^S9*?YrncfNXl*BheMf;72n=fC~7Z@b{)u{zVm!&l$5 z?=?4%y{hlr_3Arc>!a!1e&?>eZ@A$#H{W#2t@QW9>5;SZ5nV^QT6rPny9T! z<7SdZ3HYIS%70OhIfz7~OaH6UKmJ?#!k)x2O~=$egX%y`Qo2iFYtLKd#bg>c>a}Lt zo?w`rcBhlpqDBB&uT#5Dd4@|5Ym70ipBdBTn!xbCsX9OETpCe4p+e25;s05UDBMv< zZ|N4}Oc`L*jFNSXF-^NsliQ?`q>Zz9ZzJy})T{N^Z|KHJGl^)dPsxp8oQ=k+$yESJ z&aO4%+u~p0AGnWJHO@*8#QDO)(WrAE%0K*x&)D@*U7LRpPc>e*>vgZ+`-UXy+;Zz3 z`);~*-z}og`{L&7Zh7rq{rthWxoiKf*WAg^AByWn6w&>0?T$NlzCLuaNXlU3Dcdta++)rYVc zZNGjm57*psD>vVF(`$B#Qt!Cs^|#)zjmHx=+yEopbi=M&ccyXYh8u3)b<=G(y!xg) zcBM)Cvq>D~ap#xgSN%xxQ2aph$@snL-^U-0eS$)V)?leZ`DNbXBs{=GNv`koJ`*S&V<_x=0t{H~imp1ktv zAB`W2|3`A|b?=R@dpLf7{Am2a_yh5g_(Sn4emee{_~Y>-@kitL#Xl8)EdEG*-Ouvi z_u}7;e=WZDbMdSGGX977cjC{+*E|vb=lHt6jlUj$@6++0$A1uC_owk6$H(GN$G;uF z;y2^({fp$6;?KuFoIDx-Vf<(Dm*QWH|0w=4kp5Hr>+yBJPjkN#KOTQ3zV4mLZ^XY9 zAB}%Gek%T}_*dgs{b)kBUiFFORo6Y1{479zExGQszmWW5^1c6&o8L?xPkui6jpRQi z*Zo}LEhg`eultkad%u!AlYI9-C4ZMZlMZNWY%^bUN|S->*87 zegPIe5a08XD9`4H%}r4j&m_^Ho@~$J*{D|Ap4DfP)}YaiJN9eX(xrB}USzF)-(RjFR+jMe6X|*?rT{6MuVsz-JpN9vm?ujs=I?(tdTD4d*{x1DGy2$Hokdv_ z4Ac%}&3xT%{&aV9JB%+%c#$;pvzUMBRU3v}^VWB67^eAwJMwey8pPDm6eL;g zqGV&1r-!U2ro!d98@jT9I zm7&xsLrLfe9n?@#A4*ysN*ace`cP^VvZ16t6fR*XAmhYCNtX;I^`X2eiQ~~wXrRA4 zOZq>P*zC|iU${y$eoc!c_yrBjM$m893#)JWXYM^3<#jPiA3UxztWB#@A8Z;-EB3WF zQLK^0eTExAGYyO)OJ}2Q|AR?4?Py{)C)3am1m)Bux=Qnnf*R)Pq-CIkla=WJ(`NJe zlHa%d3+MNI)9$R+|L-w84)4^(_M2cqF6Z@sD$#WYYKZ$sVHXn$EfWfvgu?V9q0p63 zSa(99uth@Qk4o$#ZCi!3Z6vhg(zYRK+Z1Q(*RZXNN!v!&MrhjWHZQZbWJyz0$}>dJ zB5A8?SyR%sku{5oO@qoy=iTVydn%I0Y)NLxXav|UuO zkhb>Pq%GYxc?+UZ6^sDfwj^*{Re{^eS`xSuiv{k)n80m0Wq&@2Yk|4{W$UpzWc?B0 z^<;{ywivIqF}yY%uYWXwg^jlxKBchd18`MO!`Za_)0?|TL(4M_UXLBcV zLwq9wMYL%BF%v=6GNbmCA%u!GgBoSEK(xH7LZQNZ-jJr(izc*Z&5ddeCyo|7~<{l}3FsXl6I)g(!Iuw1SfDwNY|CKNcaegBAfP*he=?k8s^Nz=+A8 ziKIi+L&p>HM8A+VT*7eUVz@#gy&S_+?07O84ABF~uSP*XAh+t9lbu_WZb1JFLtw2y zV14P3LEw*|@k#_T5%1#O)FNsJJk?(e0>N0aIgPFs#`4Dvl^;zs7#SqI7&P_1HNdQ_ zV0wgQ!}CSSwZcR|^(E2up>REaD%zbtN_R22TK%jUC*DSd&?pJ7&f=2+oavaB1tEY2AKI$_?Vl_s|cdii+$p@Xm*)nWYe<1UM^rW0hs2H?x?*{ zc`;*GrN(Um8b@di5K71~`3QAnsqBG;U|VnBJ;b(FpRnt*bS|d1+^qwdT)MmSgAW{y z`uE9IsP*5Q2CC>|;YU)+Sjai45R z3cTmB@;_QH{6G5eFWMr>nf?YY;K$4zNVdx?*&1J5h-M~h%tn((SM(pYaYjA!Ph^e(=F&plm_>FWfgD{gzJz6vo5N&-@yw1ME-Kv58{|Ojwx-n$51ISo@lcb@Z9Q+^KCG#FeUPdw z7v>|SEv5($`%y8XQ+&(MkHZa&yw@w zuOwH|Zer~^z+=fU)hJ{HF@z+4I@x`G98o+ST7~Zlec*MI-do30M-WDPp6uJ5Ka&^& z5}SMLctiAz!84DVZP<8g+i4GbZGHf0EFEJjZ=U)X8yaK7$0+~bG4B(r*^tze@~Y>x zeY=NA{wRHS-`G8Usz``EgUrhRkNoj>Bf7qZ=qesOTs-*fwOgyUp>fCbX7XXd&;EzlVHPD%XAc)Je_`8IOO{k4(STqG~>4T zM!y_)d@ArDiDKOE6|mZAj$8GMal^j=E5?0UIqvQA`3D4hf<9)u`%@}^sx(mcFGX18 zqwz|jVAvvaiUFS*{seC(*=}r1$mlX^;nB66m-P$dfQxw$L@)6m>^0NNojeHmhPWo} z%6W3FlPVZ{nN`aYDJ!h&q9Vqt6;6Vu#j7e5gw1^3lyRsREsR5JZd7aTZ=d?9d*Al4 zr+)UonssQUMxC(g=3426T&qRZ3)jkCd%c2l{hCeAC9kA;CxT{vNCY|}f*siPY5uf4 zh`eM>O|$dU^r0ky-)t*ME;$*sxt z)+g+xat=;ZYYVeumAsR|T_G?84!!#!U{(13ysCDV3iEkS6sZ@Jkkq1D=#u-Gx!|rO zIRS?s9^G4|(a;T=5vX32Q7n*bc%ctr&A?u3T9fVBq)e*D3Fbn5PKz`Bt;s>X1Mb~c>G{a;zte7r09}+Q%%PBpd9A}*|7r7QuN+Lst$q2R zr_0rlgEc^5`IXmX_>lQCzvcd9T_$|oe`~6s2=NX)N?X6X23qC*`u-245_S-I%{)q6 zmFfK7m?e*}U|C~T6!kENlkKuwv&5FSXklXauq%r=!EqY4^L6|3b$1SNHm(FxCx6-P z$$_kkxw-iL_J7a&c7E>dva`!_=}P6M%5p%fc`2;dys>X@r~E_n3k$yF=xj5_ossxDV#6-HY#K*51G0AQ@VNJv%v@VB{)ZL4+N<7P96{Fa9sjjA=jQo zRWGE2W=10M5dB+*rjWK3UVq|V{|qLmxjTw}VZ=xM4_mowQIS#zX}(}`{Q)yymzU7@ z#bSj0g@i_u;fWa}7xBa|fOB%qaC3m5Rv|T0A5czcRLc2!HI!x51yz(nVQTwg<%~Hj z=u>>Y0j`eBpcwJ1l{6408#VZVE@pXPVpic27U}ew*%aXyW)aU8n?+`v2J;{`v&i9^ z4UD@V%pzV@p_pCMmYmg#3FPdeTCDQ^C?;i4LN)n2Kf(R^ku5-5rC=pd(V&?U(hDh} zMbHYlYOf(QNl=;Wm=I;;BH1p~$Z&Nka5ERW=b5Ypd*56d!f?GII|iSx(80{Sf&*^H zm~aOXg)ym?8-%{SHQX2esSTN)SNr@NmhixX3@Zfsh1lm}6GW_mhU_)Q2zRCG<5_8p zhiXo40&D<;TZhY3QwFTl7GByf~zKE?HG!Odim{)nc4$6#nGq+8z=D;$SUMp(jG6 z`MNy>4*;-k_n?JhWY$~sK}N-?5=ZD&g*NDDppE)CZK$)(y!z#O$J!A}LV}4zafNv) zxR`m-tHwR*Afc0@BGhYz3+Clj$-G`6tRCrwXoH9JrmO|?R%oNPh&HTJVBP|n(S}}# zHWooEXv1EwOdCwg7;V5Vq79p^yT!)RN{o`p+Yi3DIBh7w!nFvG4#hU(?#@?eqlEx6 z)>=d!D3le*1F=t|3f{rE%_}U9BeTuq0wK^4G^EWfXeo4+tBF>p3rnZO4*9c;Lw2Dn z5_i}hLN15EoX3LV%}FGGf~iOqEa&gZ)m5QvWIde771Uc>YLdGMG71$)S4WSfGwdsaNCjzly~?9++Q|rj22qgOKSDs6DuSw*_6ddgioaS{WV`Ps!6qUxr0X~C`T(sG()0K zOfv^W43R7XB`wXtU1C+}U0FGF2 z#K_V#EUr8;2$p*P!Q=%D9z1LCtH6_e}*9?VEMZ4`X*f@J-HhGOXV<8~24 z2ki3*XF^Qi?>(lP%;ui@=T`p!oG5EDeZg2$8Lk-Pu$uSl;WS9)$*UW!e6KnRW|J9=h5Y?m;a->o~_oyUXr)vHf_ik z?zx@CnHtglydU1h@TL#xm<{RuHl#mQ*XZ>z>$P~+!N>XVa=?k>XrLFZ&)0P5{f0rW zyDF3!^uXcjZeMERsS3!a3Iy;LO!utBZ1hDyI+CqU=*ts{(EC36GLw8ckvTb&Je8+_RM63`QJ^clD3f8_Q4W7r@xU6bOD^Dn*q zDC+}yNY8kvk~leYfBwfm|A8YPd+OuQMz172l*YB}o^pvhqe)%TNY9c?%0>jOH{OIy zf!;C=05?xNjL{NVd*(YwLaL^#lhyVPH-xFJfhdhK>)9p%Tk~;D9X3pXkvLz=1cCbd zQfd1y+e(>ajs-iPOo++I$$)i8d@&Dl%E0hFK5Q1ilc@kT+oGn^`Emjq5F=%%;qK}L*TDfLAvv+WPpLZLG zfje_-pXZm4ITtz3M%&d-afY`L$e3DzH((7QtQRH;Cl{5sl?ZFw==6Rzy13v0s}P!8 zUMB^m4KY^0RcP%U*29F>E{7UhlMJecytYXgumB4R$gfFr z$DUI!STeqV^7H4RYU2)UiIOi4rdyL|A!zZ%aSNPfEUaE`4oCqAv^v74VKL(xJP0FP z1rC|SE#=fs(}lb@m{yh9=mMr_c7C#UW)x|eb|SxEUPH*+-(|W*g@J=snZVL{WbPaB zy@PXcS}okv?0+DciwBwD%sBk)+`-v_&o&Py@b9*0i9I~5v#i@YW2M;@51>9bBj02gZj`Y#KF>b4ETW;kX}Q@Ss&~f|=@9hy zO!9m(u$;~3k^u|JGf>1}(p^9=|B|9SlqV?O|L2n3a`i(0foJ_+-N~{e3RgnuCQ1vQ z$XqjmpW?};5n7F*ja0$L3`3E#oSnTjeM(ns$0q}kf}yDn&l4vLZ`c%qDmAq=z=AgAaXwsZRr+>(!{0m7*r_kSK zSqq?GHo{t1m34RYR%erFR<(Eb+{~dPh|{y@GOnw#vyTj>v+m%GE_vxEp42H75J3i9 zXWg!z^he@-m6&8U>cgt=QPx6#wKY#*mcJc2FAm`=PSS=&44gF@6kWFU`ig<0K@wBz z4T$rnS?i_Ik7}&%f_z(f|1MjM)jT~Y#ICv|dO+7T7bTzKx;gz+B39j;Jdg~|r4~w_ zzu3Y7hleWG!VeYL6TzJy{eYQVo0Izk67Q4Abq1Xm4i)CC?WN$<4unWYST%|JAn<7$ zTFW2c=am1vpPxM!v@qa(306_-uI!8*y|wFoMy7?rqaamDy4X*k#Oh-nz*$I!V7#P9 zF<$OVO!QU8@(>+HFWOi{59Vbt==&%gamVBsyddr|=+qgMi=2?rkQmDuJ{DwOlugsg zVf@ml&2Q*`3m3+79v8Mq&2Y)KrWuzrv>7N8O_MO0ohu)f%9lhfE^9schu|beesaYI zYd7x@q6t$MW#>SG|Bj7NNIMsqN#BIbLMk&39bBM7LQ?T0kgFL*ND37_)|iZxqh;{)EgdL7k0$Z{z{hB?yBd_qdgI-{*6& zt=bb063oZr!j$Wyx9R?DbX4HnxiS-*N1v9hGR5OTcZmTflg%~!gqv&=!DQ=}CR<-4 ztC`8h;-Unsy)%=oFPsFm_bK{Rm|Z`wCTaRp)*FjKm>E%8ZG}hE#cJz2TR&Q<|7bCa z+CU?#S&7-`eNh45N7NPE$1tP2@V?chTwpkh8meJ^%`?BIz!kyXPo((OR+V81f^ z$6>zEjFC=Hqq9knvq;xWF#4#f?tnJmt;@~|gt<-{_bhkeOMb`6C=?(lDJvV{$!B(; zLt$hYDF^|L=(H<4(z&ErS}L=;dquEitu^Ro=seoJf|y)&}>ii?r{dw*#Z0R z)nczitHHuBF$M8lP!P{1;w{-OSi@2f+y!^7RFAwcM{o?Wh5wA~hI$;n7#Mg0v9biW zjiCg5B*Ddg5@=P)6MX5Q5H+h6p<{tNd{cGFDzTo&d-tXe7o6q6mpV9-e435k7w2D# zRK9Q@1vEeOe%K-HzZb-fNF#J&2l`7(U@4Ph&dB`KIwLl<#`NgBeU5oV$3Y#L;A zt<7V#<+3gS%xu1lZ{m??!frj8T!Ue&a!r**vIRXljcduLn4sGNQX`ayuueRw#};)X z2~8a7+2$eEq9{hD)E0S&Mp%Y)oIUd$2ep(2mB2$AA1DKvH>({f^x5c^VHaV)MPb#6 z{F1AjC|Y-!FD?qIJu)|O&+uIAkE@k0a_*7g1gLiCMD?=?rC}GPA>&#eb?}aiu(E#M z!W}%5X^sXbvp(LA7vJI-ZiUcvchFmRcxAIv*8$NDOf5AaONY~ zfPAclh1>2uI5b&f%yX?19;X`TY`%P&%mI>x$RKw4qx|4nbVC2ViYBB11u%3xT!Txce0RC)Znr8@m1y zoGSDdTg;y@{q<7wz@QCzBwuh>F(bPFWxZV$+&=nbwHVqHj9_vHg21$#yA;8Vo29;^s?0{ju{DwSN8tASvVC4?6gIDF1`}y;j{J(mT?%tP z3Rgrf0fRPg&Q^{!?{nB!l{1|z!{k>dld-pqurj>_jaOwm7f`BB(3W-`=GZN!O zNyt`ywb2joq{%3T67&LzC4B|nuE5GnJYya-B`lEPjQQ4+Y1^10pc!eF1j(XyJC?ag zc2WK}pC<$tjIb}>A9MskzbMDGinx${STp~6R9(mYAVJIOCOd2SsCv4nI;EqWOr|;) zqYJEUHgte^iM1%lwTooZB^+~rT@FfSl8r(<3xAg7CHzO?5Y_-0#4&X=>0c#kD?17} zi8-0u%5M;pi(*e$Iw3ifN&j4O@+tWyPlkn$rGqsFY^y7K_0d8uHii~*S)~Lim>oi?I0}O`gK$xCnIubtuBo|F;%@nFL zY%WYDZ71+2*bDBfgGA?-qws>#{VK_+*nL=l;qGFT_Lrjh$(PjPMtq|G>T$!A`fz@- zlSIXTbz^Mft`8u!N^as89wF+zmY;VyfBs8!`CcxVZ+jtqH@&!conZLE2@>hTk0Fsb z)k-w21sZ2iH@_9Bk^w-otHi{tYL^Qhg>kptnb=~amysX~&pTy%h=D{D@w1k6ZCW9X z9#9~2eDM^#bK{L=));VRqXD?na#CoG5Or*;sjPU*Q=duJk-$Z{jZ_)bSj|Q1xj>?* zMcs=$K*Y~Fg9~fUMrSGE%j8K*3K5&o)-Bkzhsz9sM*wbu zxvV|}P>e>;+y2^gv|`8d!-Z6FVm)h1Op)Iv@xysVlKc4bb~uqT3Xn+1F6?U4CF-5! zCxFcD&?;hBYGV65nEnYUPEQqT9?d4xg;d&{T;|!Uc8<&EY;v8MP0(4ybIWK>w;1k$ z%tD8j{d%l_IR(uWbE;9>WS*zVv>|AuR5p$!i4937xWZqE|s`G~zrU3>(R`MsAZJo7;pc7zISk#W&4Z zP>kkFZjF0QHPaWa6?r&Gmyms-c~EDuA!uQnCfj!8>axXsd1!M-*4nXGT-FFqj?!d^ z^bh zwqemE%na5P3E@)89_tu>f*fJ=TifYYL_U*T3hah5n8_Z#t21nfj@t@=bh#KEx1EmL z3NaAC5*;^2bgW(APO(PEMADp&-E3b>$B^jB>DZ*D!Wtr%AkH9?mEZGle37LcM_L5G>OVI~F0IAJGci%3MQ1W6`@8z)TPNg+uPlS6s>M&$iJdD=$g zlW}>D&C-Lz&=RCLLB;XngTrceaM-#%1G(v+|LH&c)~nd-YX`Ym%CL+xogGGs*d9Af zOn{W4a zhP|?S*0u+lo@0my! zk%n`*M#fg_=)_em=PQ&%)DzFEGqd`iq;ac8ZNU|%J?ep5P zljgr}KJb6lPn<&Q#y0v-Z!UB+sWaQmr0i|Wtvlf;5O&KzdZ>hi6MTxJKv*Wq(=@l)VA_hCxIq|TQ-mB*q57js zq4$^TC)$wGdR4_clJ^wb`P_?Y2f4lsW{xj~dD8hs{x1XR&_|2eI&~bQE(&}yt4oRa z;Swe~Mf0{I^~#P7GqWtD$4?oOH2R4kJ#)&CP+=#8bm)-+V<#J(ESMAZ>F}vS>I@?A zY-V%R`JDvGyIANfzIP#nNS6?bgAkGgV!f)6K}aA8J~Y9O9s-HG{KTDFy1P^0L# ztwogYY#UyArxQ8N=QKEUNH^X!|J7F~e@eN|EB!MxPIf0I;$$M=&9G*%q8&IDLB|4U zYyhpXyQU(VWw#n*gEJ$%e5V}PqU5rOtd4%!0#$@8TObC$?_hF-6qrN{hG|uWx9;;$k7Uj3}Vyk{CVC@)yafpL1Hp>0l5lfGge1U+f^*bC+iW9J){Q>YP zKMy9pVc+%!Vy`hM5^-4FvzRKSYTCtQYsdOU@-`RSQ-yoPFzq#B*4EiLdP<%!&q%cJ zt$nfyyYhMtqLXSYY{+%xf=kPe`XVPbSdKazRp7H!sN_;KfTS~^>25#Vmsi?*RkX%! zI8Q<^be@EDYgB9QuYdb@e*9fu{o*J7*3Of#Qj4nFW-GnWW~)Wji_KQ{8l{MOG_>lN zUq9nXs0>)m9d(1$s3ehlF9tj9{f-auE+Dmqh!DiPx5LFPmsv zRQ|ltAp6=^u{%poNcrI;yV1yIlH1hj*=QeK!=%(cO!}c;L%SGVq^xFJ@?OhRrC75G zdmbrB)=r=csT^%!=5I*`>X}o@P6-TuuOrr|D6(Puxf!cF&Hq(sc%NDi=NhnnUo?!4 zwZ@8loV=>`!uD|{->FgXLWe!tj_NR)2cKYlR-1` z(F>8!B4`Eq*lVx1lJI@u&vPA{-RC4#W^FhC zaAYeOnkP`_2bVaBr1>X)@F@1AHjWxa5HZv+hwwz8PKH;-{}ON}s#=&%fFHUiDcO|f zZwIx0`ies)h*uEnN8=H-KFn`pyCf$OB>ytDc|O6QO)+uJ1ekMiN+6ZO;RI#UmWjxy z7!K@+V~;DxU?x!mv(ZPjv#$HEI^CCu0=&FXYHA9Scz~p(09&b{!Vae8;1+=5Tsz z`YGi~DVi>hoyhQfqwc>}oq*+oVRE%+nC6bN*J7a8+M%MhL>*R_l~lSQkWVZF@>^aw zCI6C8*Bnu@h0{-$l7)6deVAT(yGiT|98NUf5Ye=BvXo&}fx=TD>%;0Cp*UZq<7)g; zk~JWfl68yaL=Kn=lb87vc_-c`p*}I{MEuR@1VB#KiE~_~dnewxs1uUpK^vWb!GBz} zdMjcAAeBx$Toj%W0a0nom^2tKTr%di3fkCxvLeyb6eM{(?y_|JLgnYLX=1xClIj?k z+u`W0z_$6{{s4fdM^miW+{v-)X@)Cd*X+ZBV;^R|3%R(V)3xYcpe~K+tWncvo>J2% zCh;A;b(Y2a0@c*h>Qee5(JaQ+zifIgdE;=J9VjeB>*gBMrsI76+fqcQ&F8;gs4s$g zPO*gDq?rl@HqPm#w)1V~%p11T%EgzVa9gO*w3+&3@!*U?V4PVM7=NvPbw*Rl+@At9 zm801{?}PEB$Z{}1sW9tvYD2o1sAqpo5RYR;jLt_rTw9eU&#N})HqkGsa1udItB1>) z3p;viPKEuI9sUC8@-IY}74zvuDIF-YqIPNuvRZ7_x$@moJk1h8h>8^jTbE&%*n86E zT0S9}L8Iw-0^&a`kSogKleQ4%UXWy0=cEWpWre9fo$3qkpt?-m3j^2K+FEJO_12tV ztn4@`Wagvl#fZvx^f)GNMT>{MFGao2od#-Etzeyh9@Lf{OSEqw{{tHoxY<^9-A;(z zMG%&moE^Q%6QG8@#RY2qSgm(Yjp|hGpBFV{#~d}ksLqLOmNgG{^tvY)Be9`kjDKku zKD9Bb+KV3JjvmXkD-tFtByxLjOR=CO5b*ujLG?mK)L#{<^PA*QfwaiYofa~_BauJ zu#cPYEXsNz`oQAL%4oHfnMYUla2{U99bp1i251W>E}Q?e1~)Pm7z!us1y9S|ri!PP zRVe7$3ciky@O2z~eZfH5{JZWQbA+vh5LHnIGM-r_;?h+cK{^Z8p9q%tWK$`fcaVuR zQN(4IfpD%MoTfjB8GYJy&VB)Pu<1{`9d?>0IyZVH|8}|AXYY8DAES;rw4%~y6-ChP zG5p(g-Ls5P!*_JJ6f{bd%jl9sNBe3Suc`#g?R=gpP^A~OA~IR2_22*a_de3NC?Z~? z0wYqlnjxm?AJQ?NsMHLnYN}qMm}U}eUYMVd-8|)bd}IgO&Clv9sKrWNP_m z^f1vwiwcOuYx%G1VN(xdp~WA5Ru8*8^c#2l6jV^|$^fR<$-v8UC7MOqvzoTch>E%hz;oS>=E zh6mptkB#5pUG^3Qzu!)32L2&Ch)coAj+0y0}!_dshazl0lCehIy;_)@*}h)Btl<2*qDi|xVZFNi(Oev?)?4feD;fju8K zoO&$RWYaRwt6i^@f3aP+q>|H&W>RNGTrZ32Z(@HfedILzYju`E>HlO@o8Udou2bg) zQRImj>7RRwj8ac?oYc_)jqVb(bg{L(+eiRL+Gq*S4wtu+cJymVVr(#?o3?~!uaWcI zm5XOQ8!h2kuNL4@S(Us9I^0(EOmB0LN>JzfQFyEb*utG!@fD9npBfNsw1;V-@ZAB# zoPBq|*4XTGQhK4!Nm=iZeAXijpEUm`OpML`IVtU`$=~|UQVUt7uwv)U&-*uB^+H-` z5wt=J*=skBvb8#&-6ec;Obaz}RdhZ(0*`2vj<;kRr+hL@E8&%IrIdKp`mMDEHF3pu zafbvXk5;r*+?T+4x=e+Dpv4u+Pb&Bl_@ZX!zW&>v{_`LEn=ky_*TN?igd<-;_x4JR z_!9V{>LZNsdXc%v+Ug>6v6(*r@>!m$nv2b1?@!fSZ07G#$#HYBnZHjD>x<0A!?L`> zYVk6(W=@W5N6tYXQ5$wSi_AK2+Si+IWD8BqGWKfDJ%DzHQ#yq-CkvW`waMoWCy+9i z+u4gzD0D4nk>^2Hk$s}8|8IPPxwT{8H%1xKW6OG=#8{3+lHY%d*f~^U$AmSOAzK(qiUSW&oVuYD18W5mHHza^ zwRuQ%KCjC+(TfI5w5S%lFpk5LGj15N%XxSHEcfBGYO6FFj6pNQP%p%ii=Y(*Xs;_d z7?@b)Y1KX}ZvKTV43a7o(DZDK#Dn@R?aZ}Znks6_z@o7sePQW`Cd)e`n#>|@b@!yeZ~aV;&HoN_F^$A(JN@tP+ILlF>1? z7d$$pw+LCn0o}69x+McdCl%K4;sN?thAbC|Q-%6tP`bVVI>xTYVlom$Gss&mfqj-E zX8SaT$f&|gLEiH8RH#2DJTkDa92nV}gD!w_&=-^K)1UdhcbJ221zr@vD>`aqTj- zTt+#G`kIiQYu`3kHpuQ~OO?`@bWEazKo?2US3+0Y4wh_J52$XFj^O=nXKfu-ZT)Tw zjnkSucDi|%p%k1p-x{0uuTWEcpsGAgY4r_byo>U3~(qR$Cukq*KoXH&_8 zZEt~lhs`vqk0su$o73uM<`oR-tl>H!yAyuwkRG~hG~W(eA3onm_%`4@mI;fNCP|c! zGS;@IWrWNX3GRIzG1TNsb9^+ZKWr)Ms(mDDE9;75PaD4ZLFyl2OrnmEv&mAQ__2|R zg6G1P6n1?LwP}T|`xGSuFhO7Pwpu8`ieQfmf~(k}68m}vhubM`KygfqU~9Y(XmrXq z6Dzlu(_hMzYa0RJLxxLeg1%`ShB|(nr+e>E@#y6{*y(7WEE8RYYWliXsHeFrpGL(~ zp0QC)apxF$({UVW3t?H5z0TgSfpuI8$zD_iZJkG(^C-AU!zqG9SxZa$t+1re%{3c} zQQ7dd7rX!zpkHqT^L2V3nM4h3IRbW8MoW7l^U!4&gXS-@>J|nHwTVMfBH-cW>Yd?% z-7T*n4j{e6M}%G5DM6X~b*sq@{0lw%hhjx9@yf(fZe9w^Xj0uMu}VTAGg_dEHr81i znfho{6x!(jD~M8rJYLfXPDas<4yY}HClNI z{0Ttp_;Jxvd7tS$-J)CX*=xlt`Fl*h1wgO@I3<-f#z=@L+B)F*=$TmnvY zS_*CC67brr*qTDT@<&RS0K{NX+jqBWQfus(*sTShs;r1VBdemJ(&o8{PAncD zO`Y2K_|OZkR%Lw3fnGAchD#`D#@(JUM4gVe><}Ab&XJI0z}lA$`$=PryaLeC>e*%! z7NrcQd|Rt(BqJq^-!7G)FUow`gtIuBF>X$-*_vD`3r8*)f0n-0x4=(SSufeAU@6n>RVmadIk>QN~+4cmkqC_K92Kus|f`rv)NC zl$mMwMoc_`#f1AGzxUHcL_j-p^Y?O3b2{WjHL5Vptr85mRaKbU_GkO`1v7v4=|8j; zP;DZTeW;WsooSOJlEVKG8f-p-yR8 z51WM@4M_GNy84*#Iu+MCe}0@S>b%ChOy|2f$CnXSSf=|O1k94|hoN!&B=4TlrLqd_&25EJ^&<^IH)aL9^XMAnY zHa2tZe1gGq-rdrI|H}~yAbX(E=%|3v$jzODU<_^4}n&Y zk_I+qs0C6G|Hh`A^KSs+y=F$Phc5z~F2W0$SFu=B=iwk3KwGExR# z6EavMaTsxx%;}?uyoy?ZsSx`Fw<7f_VhdP$;gqGrGsm&4g(WRrjIfNEeL7e+0EA{_ ztS^IQ?PNk2lEGzCp}truyfj8T2dMxW7Z&y-bnE%K1#bCDfgT3zj-hpegK1JwI|0g; z2>fSxJ+cV6;JzW>LhD872_t&O``UuT#d1 zb%8;wlyGF9OOQ|o!pe2rur*Z`D5_)PghC}L6c2ATLnyS!5|j%TN>Qn))`OQ$k&r)|_VE{yRY0 z+Qi(;-ZpH%C2PNtpT&!X1FzV?3BhXyHJLy%iAB!HLe3hTn^+jOIgs;>M@;BIW^&WD z!ZjczWo|;BOKA`25Ke=vp^3TZdra)Gano2az%th8e~nE?b{;JXbbbB=kMf!Px#Eq>Z`oBvQ0}LE-!?uu z5o98>#$vI>S4;(CTyG)_S(G2fI8(CWH?bhbAzoo=lLs^ILK!YVkxoMb73N=H1Odyv z$FVOc;>J|`3-(pI(`ijgAfN9oiOSStb7FK%nhd(Uh76q_#F{bLou}7`53ACKv~2*4 z2#;-X0ZYwC;_HA4t2Jx^vEdtv+#1LK*qqD^+gsCX(GZw*A-LEc1sAnLHH72ox`t=t zv9M^4-3oSw^$ie{lrlO%I$P+{x7>*{$bzPA3`?CRQ7g2Ne0H+~`!ki6Rn##DPua|LQ6>&Qk!Wx%S0%f&LcMMxYywD45@dD?0ff??2 zw~0F<6&h0iEWxm|CFwdprY#y}#crlFo!>)2#lag2AU7;T-%v=r4{UufRL7;ld=5>I zbczobyb2~nzczxn#%z=gaI@r-C7PNK+R4!kb0r%{Xp2?ZEZE#!uerH$#ks)-(gdt8 zNWA2lLk9yt`2<-Pz;Re=iEP?ObL{W~WyteDMxU&V=;^qfuk*m>q~#vkf>dV_%7N-< zqna2=?kkkR#V7;84rS<}Q$|S(fdZ=0o8?@)^aQS-kNN;dpL3p7HZtbvd4O+J&b0WJgrkW`IRhnMj_RubH?l0hYkU7=0GLW`S|~UtnCm zW{GhjxMDKO*DNva$S(~p`I;k)>t)qUl&=|=zNX$*4Mh2xap`O7ZPhePjRs0zQ?Hl! znmj6eO?$uC*W`WaYg&OtzGjsknt|^atJ6ctaK@TYhXVN=CCC9MRbpro6B32P?#nYB zB9#bz$#lL_sV`C&OqVz@5H~R!vFkRXh(Tor6HXIOxZZ?TLPaPFQJIY~%9=+`DWqhv z?Ib@_d>tYGX(Et?nV1ZsJ2&xWw-7gAN5+!3dUl-_31trnUr2SR9m?9RR|~_*vQET< zr=x3-Nt1&vM@-7}z*M9Hhc7yVjS#A2w<>2XMyMDJPpTaRSrY`mFq}@f6iXHxnfJfB zFft20kT}P2A`WhXq4w0cj$uRyk77FUD-}9uD|A49NeCTGD0I-cgQWx>S?ECTFfNCQ z7?LG|5Vlk3fJg4%#vVH0BLpZ|LI)hBLg*j~p#!8|BB9nUf(Fcvjs$1O3L0oJIg3Nk zfYmMq4LCn1NIU3uF?C0UI&sA#>P7%-2^v7j-iow?z=ObPI`wHSMR+J7c-2Cy6k2^m z;96Qos}PAXtrBowYL$~vwk_}kya&q0p_CRaA{B*>!DYV3rokf>6N*%{@5tIV4Hl`e zc~GPRQF!aHQ%;0ODtH()5pO(xs<|y96cbtln8z` zBVti^%|1fZiRM^yFmX>^mXbDr>fPsP{3zkCAXY`r$DrFGzhcu>w&!`ZV zssJ)3Sjwq2nTKLAaU$O-cs`}<3W`ioHL1?_B7@=dr`CEY3k#pXB^Dk%|LrHKqCEMN0VoTPgl8obCTJ8Mi9I}`GF9zIJZ}^pVb!5%s;UF!DvZJ-75Z~csCA++F59^w zU1;Hvk^re*)rrDYB|K6gLVG$2j|2)tyh*sgYgO{Yhg~wXitGmg1dv>H&Jh{litKFU930fM0NJxfvlJH6q@P2CF{PCpT!Fc&FITtrc%+R z(w|aq-BO2+LNn;u*z_#&3=KP`PtnIc56v(eBq70jFg|2{yzF+~YIV!*x_9Nrbf@G6cPbLHK6^ zqyRI7CL@+|#=4PhrgJ@X7B^2#D-s$E1tmf0i07RV;v!R2Z~8|Pox=$ClehvA1W`*` z1SbfnHLpRC>q8b!x{x4Ooy<4ZB+<}>nYJl$3u>~|$d>$ai`dXF8WiuTLm^^=z~?TA zd5g?o>bPI7=A`@xZ~^o}4!swAXj7~7;zhP)6alV==w6--++8*zt5pwWwF={|ORN#p zn;NkpRohTJ*8mf+VGY;Xw=!7AC5`IoUSsZcT6I zcXw-&Q4))NqatHPd<(>lAv2FmpRsT=Y*f)|=#)8hp5Qu?hpkJZE!<+KT*C#Sb~P7T zcsV7IB3J58Q7H;s<^{HUflIx>Htu+LA$Ld$b;P1lHcpQc>d-yKm159pEoiZT7Vf6B zQbzd#nEpIxKcBbI6y14J@=?&X+u#e z$V77(Gn@GXZ~Amprrl(Go2hz_z&=>L?{gU7LZv)<(@H-oOh~y&`p8mo>LVUu@o3UyhUwg! zpuxW2vp6JdOElYFv|)E{+gs7r3;&efJ2&&zgZjDfeDmJ9b@p^&;kl`M=UQ()s28n6 zvI}^??{)f3IX$1@H`V#I?a;x42e(EhCpTinPVa#!k%{XD2uX#bn>xC{vZoZKc4J?( zVGFmcCB>T}lkRwp8L4OKcl21uwaH|umV@z0E#P1Kstqiwv)0PN_-!@9qx>&E_wN7m zDjkg9Ks(f#J;b+;G1pS`v>l9Z_B%4n4#r1_*}?e21C1#}X9wfM?p@$BKo@70NbHuC;WKNK&8Uo8BXx)3V5bK2O_J zhNs3$k8Ql_w$Q_B*l&F7GZ9K}J-tu&ksM=FOlq8#yI6lB2wxvGrI=8{KhMa>lJ_qH zEAfiA8V&{VU+0HSiAd0Fxsv%Wen^K$w}d6V)G%>D&17%oUjd8X!Pe;(ouyTBJ5vgp zVDmDgj)gweNetFk#F{pQ+`fL<%J1QGCiKvHN-u#VYNQHAL`b+)4~xg}i27Z=nNi;@ z_gW^0PDB`n1YG-|2zb|mEcjF(4Kfqa1XB)z++?Nanb@HunI{a0mqVtNULYI#oF~u% z+aZxxdkjcLk6=i-l^7}%6r-dvZZuc+A#Y=-4cZb=Q?@|&Xp-O&ax&TWOqr1NJ?pbZPSp)>Y#H?xDXMj2_jmj z6nUq?cG;rgsGufWN)z%CXxOUYEqd|#{xAGd^2j&^cpEOL`pD?cXJUbr6s|Pk&-%HzA;h?D~mES zAtk=9shvw$hW1fNg)hfQNhaqQDPj61vcYWmgnCOzsR626p06!Z+E^haJ1^2?uGz^* z!3s5PIW1~BSc{v1nwI;{9jkyEdH)yUKn0M>x}mzpkN%)S1sXv?1z=n<1sfC;^C=oo z%=Am9Kw^OkBqVt&o}!>u--k6(L7MXsLq4FFKl_1#3P38WXD(ALoKP>RKv-Tv1uCkQ#!xe9!0$J&p-wcuwKm|3Y0%+Q( zfY9MM6%co-Qh~k@!bqV4s0d0h5*ZgL65l4%GXzJK3Q`tlgFq3LXg)?%kg}A0Ix^*d zK`KB;iVEKH!T(JK2+98`RPeAf0M-@{@JL#J^oTTM7D;d=+2`k?^-6lW^opHI$gj~~d2;_cAu&G?SO&jN$ z7`yrLdr^&Ry{Z1$sF6rDLa*pk|2>kP$Fv8szm;DcA;G&^*zagcLgvxav7NC@jbnt!CCruG|4_ow zJ~e%Vx0e436(_mA*FFm%1BeX@0vm9H&3u0J6Uj^CUjjTJ(go|r^ z>MCUEq1{KQAVK%Jk>!L<3Ng;yJwPuJDn3@ zpIWDd!`kiJ`M`!`-GPS0h7yQ8I4o%!KA~D}-ZXyZ(15G`n-ctbg?%0}rX=4VPi$YV zee;u7FP8(Yo%+bID+%AdKgnZ`l;jPOCi}7?`J>@moH-(2?h*XW7c8RPtYs&njR9h# z`1t2&52?Db(m%$e1>On&MCgRR^+@=QoMyhJ8q3#H(r%Yi_UsX#HkA9vZnwPej~hM^ zCP_V3Z!e~AT=bz>x%6lyxszv^_ZwQPTRkDUhp-~kM5-A-`jRJ`$%__p|NU`h7lHcRzLSCk}*G7x126) zXgQZ0F$R&p$Yw4#4sDEK za4`v0gSDEjr3E`+qeDx~UuRGUp&gy6K3Raz{UGVFKAiy^&mrs|HpF@}RDs?$C)dmO z>EbX@$`b(*fj$tSGW6GwcSX<6yuN#2m;Hk?)xmvykDOs|IHFiQClW7h$_Jl0Nf_yY z)@(!;WPIhl;)D^Qd_XS$ET7OmBZ^`$&Q^tak#gQx8TuEW!^bD__V{%_FnClx9azHc0? zSIf||HY=TT1Oh5>mJ6TPimZDG#lg9Pf8*e6x_?ervnWClnVG;qP#}gyMq%0tJ~0-Y z0*F)TXJp>h$0$OFRxh0(%T+VU-2?k5$Ns@tP7zZ|;%m9_1?zak;j*M>G*_8lL-WsUfW@(4*N~9 zqniMl|1%_;ETA6pm$R3Ww1$F1EG(U{l2s*#1Ud`I>;Kq@nJ(|GURv7^4xtm{C7JHU z?U+8$gp8L2wM$BBsc~sZrfo?{A-D2+{v8z0wj5}9?`?}M(q5^v3GueSOIBB&(h*Cdw- zEN+DN+&_}w<#ytHNItm`x)wI%?s`{>&}=}L$Ur!+mJNj%b(b{g55%=4||FEu>lUda_M%kyIW*2z%=^Qq`hnVyOzIe`a56nk(K9) zRocvKv;Ek~@u1KDW9_6Hqxq~t-pC;*s(&c5fusBzMlHK(@EFEW`}XoEQ)R+F_O7Ia1@IoODvXC=%y8}r7x#Q z?$yIdxU`I6=jRs506jW6_g+>DkEd*eb0QTDTNof#I`flntsK6=D*x|P?^)&ljq3d` zmp4)qsRDIG0{H46Q?9^L8XQNPQ*LLYD@!A%CfkrFSGjqE(d$nfh`hB_PNsRC6uS)k zrt-0Yy?t1h564qEZyG6qA=?Vdt>=a5<;7UOiTjHQ{^Av!fdnzc<`Xu$q_x$(6+F2D z-UW~xHRaG@ht~!TXfaXI7#FckBX;zH98p2Myf=Y+DLE!L(Tc)F7LYFh&ZvW69iW>F zZ?GYi8`{>9jCFZ~4C^7b&*=If@g`j#h&5)yVVra0@hbwS7TrPhT$CJA2oE81P~Ueg zoM;WNpb$x{`ALqL;=c$Mj`I&n?e+SPrRq`6r^Xj_C9Mk>DzG_<=KkW3zxa_4{qC23 z?(3NUh{LiJ+(jvLSSq^BVxT|%7~qor#n7_l*})$a@a7jco>Ut*n`6AOSLkpa2Q9aL z1R4Y^I088B2{ay5PM?Z8>hSj*MKw9iqvyj#j}5&&Jp{cIx`JNJJRi|=uyieg0T!i^Z3LBO=v(=CkoaWE!kr>f_I3Ub<7OO&-DzSG=CeJhSI|{6}>cii^)*> zb3Q+L#M{}3(B{6ql5m?rKLLJ2n;R9@zdVd&)1rRC{bMpQ5yOj<+P+hxW%JDd3#1nS zmY^;WEE2vL0T>^n)f&KUT&S=|DWjSdUOg~s~FB4`yb1{+_mga#P48VL+q&dw$?r06U;$B6}{4JBsv z+UPAjZG(p=l=Oju0Tlv41ISwD-KLGM7|ytR$T4Kd4nKu#bQ&lWd+w3l+Ll-GB48N1 zk-4!30my=7($SU*i&?9qpW?Q~k2!>h2a$w?7?pyEXzU}KMC z<7RLwODjK@EvNG5iw@M zm7+MuYKD9pUQcs*{3o?i&hc-`6ZG`kncX-_QjnIs%fgb1Q<3jD6UJP<6iTKz zyG;useux@HaZZplcDP#QFfo@b!kZzlJW@?-I!`e7w(u3ihe}B%SI-**b0<0jj7eSo zII<9CIZ<7R^F*(i1Uq)7mS3otsHQ>-N6C4tNNa|)utWl)fvCQ}bZeRkF zHS`!33OHIEyPDd8%nTbWlv9K3uDpkwRTFk}FmaF4GvR#=gI_%pO7ZV(QQJ&G0Mv4wU58JHl{!Wt>xBX!+i_Is%F`HDT(zsPauS=hfUXj zlOx(wA#-QMiTE){x`fsSt5qZoHjou}Yl*+X;3J(}0o}TcJ+7;JN#2%8%uzsOmXXDS z#gq4W&N4}}^n}y{HI%#Mx7}?xnf3BV;(W-$54GHcjMnFCI)h1qGi~48Kp7Ne4L{qo z7mic`ukfLGXHr-1ah?jh&?)dw?`%+JC^kkWOqmY zzqcdQ8s?7Ba$P83f66;}Sl7b{X-)%vZOWnp#+b5Ez}}QL>%$`@lw;KV%sIVkGi^ zH{(@o)uOz4W()GnY&Fe|!O+*t?Qut@t)YzoLk>lQL$!zHXD74cU<75zqJCK%z9btL z(#DQnws40SpQ~My-md=Ks4@G-4HzlzJz%9HAG%>(knI}qxTw3Kbs0}q67N}*#56-S za-8*4YoA}THB-6u*aD{PaHnhBVx$CmVg;lb*zLT5ojE^aD}Go!%7vD7KF9fm3tS7g z3YtI=5xu63%vb+oQs~Yw`YjYO~6S~vo>T~);=;% zh?r)p$VBIAndqzX`aZVb``0EgSDVVK}9kVrId*=0+` zbf9INP0LClM+Xx{Bp?IHkl<8Ob#7O=d=xcU#K&0UU~u|rv!N&u&B9v7(v^5X!x+gN z&}RQ7DzsqSjtB0nlPcFHj%!%wC?l ze?oe}$R#Kp8A`}drL!_rWv}am0vSt^X;nvt@%2hirif>O_(F4#<^?f&nsUOg1`}!d zzBRIFp+_ExEQ8g;+2+t%u2dF0PqAa+{!FnDh~J{`RaE-m?vLYGiq?FUAfqGhh=^3> zcVv5OGKkKodTGbvRE$$}Oc_MhG3~7Yr;|}_HivZ{o}kq==0-?#sB*xWGD!-oH2Xhc!~sU6qCJd;cVAcn zRnK0kt6&ogc|p21YYKH`}agXICn+|VwCuzQEe~AW+F=+d&N_{R;8gc!ElrP>q%UxYveT8zwN^QoiO{CJu`0q zwq@Of1%69&!TzOJXGsWz$fr`B3YfwEHK?3CAp4gjDHe?&Gb=Ml(dTtvyn^+M>@6t@ z*Y!#^O6`3mE@~CV(hS~5H?+jt)TLZ`29a8=Y`eH?TSJUk$+uxnnr62~vGqAD`YIGp zt4$e-wPLwB*uG7-eYG8-w0$cu(tHet^lv&2A=tj;!HJeFqnNhZWRl=#V1(@*PMGb> zQ9$FiZyIc0n_Ccd*hYMnLG?A5qMKQ{#8`pY za&$pPAx(?Suf?FTRBn^en2hD-NPtZU=XYa8aM_Om$z>mFq3HM3M=bM0+Oz2XZG~Sl zm34v&pHgFL5q6avvCdy#=BiNjE}K<$pRJN*NAB0=^v1#T9ErvX%NIR*iAvoj3Zt~>rapf| zmc6xjH5XD*aadIX3|x)>WZ(HI7U{PY3D%5hb8@Ng8ntzC8VzyPZj45RB^}%=Y!1k#0^lRY=2{GPGNu$LpfJ`{qe#KG`}Dn z;e|a8;(kF)*TEy~?Ql4Ck%}o<-Vkikl$tmxf=xoIwl;Ns@~mV7-|q>T(Z1-;K8|WI zNui%2m?RI-Vm;;)`l4ZV={hVU3WA|G6|Ihzt|5nV=~^H$FwREF#-sUT25G`VF(w#L zu?-XY)s;5=4)-d3@o>@VHgw&fgMDlzEa6(Yx~(Qv;R38KE;0;kbz7RJp`tRDF#cRX zm#f?6zpqKL{S{zl>-Src5GgW2XHD$1(R`#*H$dwJaoJ zwG{}nQJN(p9eMW@NObh8dI6TL~26C}j0FWv= zm%Q4+S#x$MZ&Bqm8|M=PQkxre**BQV!)9_H`WP$)k)%qO4n!urRIs@S`v)5hmh6tG zGa!SwGdPE;h#I4Mod5~4&8%dRo1X*Gfo}*vzZ7S2VL{qwIcbmLHnHa;Ix$;%2Gm;uoERhoaIB0ij2B?c7G$N?I;W-a-kKGt*^K)e z5k3qbYIai6Up;V*EyIrmqLO^sjnjYGh-f+I5NbxJMn=ts$O`#t6G8E>N}?pC)^G@H zkC^2smih4N3ABn&44OA51<|xbDb~+xm2kE!u@HM(VS<&Uvt)w#TpP2X1Z;zrfBDTv z`M3nB&!^A@Hcu?u1y*U7bOCz`Mn(XgW2yHF3p#ZM<{)BLWsZC5yHaV7g?P1)2xejIeHJ`p-ZBaove1_^@fAqkdMy`oY29OTaB zWHl(tD8VTCh&@rt#|do;u*q4($tFfLX%>O3h!?pC62;32F%za>x3r>8Wimw_(y#^p zXwx=qT^L$Y9SoB;S0>DI{NxWKV}lz&>XL#p_D4prr9_T64-Ph$y%9DAdF;!!MR?}d`XD50ww9uv8=bgNO~O~ z1fLxCM!hM073wY4=+)lD^n(4i5TH`8O)Og8u=gnN2R%AD6h6ESxz+}_3GCpJXzQW= z&oy<}%FdN!Qz{f^f=f=2G<$ZoRt7?^G!P^)Qf<-=$rX-tV^-g|BFludXIUm-NE%DY z(VVzI8QB?lR{WZ_Uu*d#&`=0zELnRm9U>ic)eg%L_1I9&`{K;(Eqf%gY&i;at~ii( zNLT3G+zzEPo11jvE_lN|{8NrGq`EEyLJFJ(xRL@h^*@V*=|R*B?@o%Kl8c!U#qm1BU#IEG(fON**TVPtEit%Zh^|g_Ht>agi1+MmV59|em9N^ z=fpoO?>muy8u#B|4q|X=Nh_vbvyn+u73lvM zrn#O4Co;qU%s~~)S&Fd7Nd;|~_TQj}DQyeC5(z+4Ji)x-5E}EBBBCUpR3e6shMx8P z130kfM{9MYeNmH*yRZQ;HzGYE?Q7^-Frru*fEUHY!YmgP1PV<^E-`o3MJ=0z9t;=v z&yNby7)i2FAezqV^aYwE2Pu8c29z_P>;dUm)M{1OY+$bb-X zOl*aYN&N@++auc|JNurq254=s^EiTiP1BY9q zP96Tbt-dv6G#?64tlTfiAeviC4@C|-ovHH=_2OH5IvT?{K*=WKERby1L|r{%0)-%o zIL?*kXd5wKH5SO(u1LcNEY`E#%0PXyQ4W+@1%slwH?jJw!xoH5INBxbG}W0}A&U3@ z1Tol1%->LD#UXIP*s-d+i`hS_y{hdvPBb*3vmM|bwFqaFcU&q z)?PyZYKz83zuBD1krq-ZVeOwL6{1j3iJuoRkS$js7%%>gy*#P;=2xvhaDYxN*^b{B z0K%`WxzQF@xt;CGJ+UITv?>iL;%oy2i0&Sukgg%GPj}gHf=0?+u0+YNA=QHKb7l2M zDEQr+k34bR29*^Rs^^+6w{^{jbJ?_o6On;)3Hx|4S=wf&aAF&Fim1CX8Q@W8#w!{t zx}Fmvt%wo1eN|F#7*tX@041_h{4yi%nlZqMW<$hp(|^pSUj$#dwM-a_C?r^n2KXQz z(w>cCQ5oXL_?^#A>TE!9x_CE8C|Fqh2@Cs|O-8^)`N!<&l8@gPCzl*(S*VRK9Zisu zI6*eSDAL9r3U?p^{Y}h9=7vLn2qB2Zv=2{Lm6=->ZZjy>y9u8W^0p@OW65rPw;p4A=Z&zUwxLY=jSp-|C;F?Zc_iK}R^C zr058bKb#KmMgD*G-ap!o>#Fmts{8Bx*3~aZ{*~0dQQ{}ZiWCTuV<)ldf%9Vp1}E)d zxmju2^rF`UDczG8PdYtq;uoSMqEU!K%%FgoD2akJV1q&o2oQ@0;~qq>&?qx*5MV%Q z42U5E0@A(AV90#F-+iiXy{9Kfb`qFBh~ihbPF0<=&pvzav(Mi9>{FfT>>Dj|z1Z7_ zvfHUv`unu9stynKY2{TNpqwCr>eJl6nCm0l@8Y`L+gIT)+o7L4QdH+D9$`DFmN_RY zzi0F!em+1t+UvQVAVDleU&YVUG;kx=C;Nm%s&EfChp6Hvu8&g%@s_H2x8CLRmvj9Y zzWM6t(RzR3p83&BRvX0Dd#^4-YmiB$6~Pt`Aqu^WA(9Pe)^-iQ7}~>E;*Z8C>EZ=Z zQ>Qwb&@Ci?)Y#ma9Tl<_(t!U2r2fk0+P`FWu!jQpL+odh=30a^Yf#CiaT8?zPK(Am_fNd z)z|1R7Ekt(ia7IRI=JDger+M-x>MG%ZA&Dn!Zi zrGEcxfhyxYSD zEAnY;x|#sRbE@c$#AvJ&V6<&>BRZC{kOT~MX#zqs<3b7@`+BsfjtuS~_O;_8xY*$B zO|{~dPb@qoGmEn9IVUGgRO8vz)Vv96xX7y~O6EE>_q;Hxs|YHti&Drafs|@d(7rr? z*5nBp>va(qI+Z_pE+L(x0eHX&jn7eB)HO-#O%_bjz~W6+qx3g*y`Bug0`CbHT6#%* zD5|DA36hhXAX_AwJ>5g`0v)G%!p&mwNH1viWY07!VwEUA#CS=1AJi3f?tnbtJ;qwY zCARgoTTM%m$g9sSLw(bPW_r0~K?Zqus{-joRwt^+zt&70?`>{XegPXkwzXIS?Y3Fp~g4rMLj|zVRvU3wizgf zUGFu4x$;NUDz+#n)x$}slPYYv4*tA)GP>iYwf5+yQJnYCGSoC4L+#=6aF1stkvNG# zBex3eC;>Iv^Y+NakjDqJ?QvrG;sf=l9;dZKT`!tjqX+C-|MM+g)imxU%Zu$HwbmO~ z&3B@RRpW|1hE!ndkE^t!7Qb(lFc0;C05P#VLo0Mwn`HqYBE$@X&3!n>Nj077Jn?F^ z2s)2&N`W9DgIL5;*=K86i6Df2w#m+tgb=yX8X@$!qY10C3V>TI&gJ8)lTo3Sppx zE~i$Fa)(*UanD!} zQz>eJgrkgvr+RxrI)e?cU>O~Y*KN8FsYLM&z(|a$Dl4sWe`7Q6`*V8q$-xia5rDTeF|yW~sZUbAoHq&0>>bQWeFZ zyRyI4(=YV*?aWwmvLQ{LHEF!JiF?uVbR0d}?C@J8Hnx^mC6KoQ>zDxZ=9WH@m$12| z)BSQ&a|>2BmBZ#1v<;mH3RSk;D*R3nniU9RKyJVmBPB4lr*6{mCn!}n&vRAJ z&gq`+U(nktmdPQ@Rwe@ImpuQ{*H?N)J}O^%d^E1*_yscdVgaxzgE_$o!Rxzo+|~W* zRA;%XyTbyIySg{D%-vL7OS#p*PIZ^MjMo5s=49j=&su@2&h>=J7b`G`8Eez+*r}1q zHn9;mH@{7(yFxH^+k(k_QA-h4F$YkyysbslY^FeSiWoia*mEm{ysuXes^TFTRa7I7 zDyq?}Hw&|Exi@B-tT*ONi6lI0C;ls$LZ!7lHzv&x+ecaVT>hUpGzlBmM)azu7&sk* zIyo7bPv)(SA~@c>8;6-vJ1-E=X{I>g&tqfOL!N0_L*=6v0w)&rCy_bq6X{&!S{>!p z7pBSVsM=xT0Cvs-7vn4z7rRcHA}~Ih*YoZzOdQyCMzsc2DS~a)Et`C{8Fqzzf zO`K0|k*IoMOrlDyS+{$nZkIW}?g{OEnD&xd*xE#b`y_(a^>skGGdo<@AUtR_IL!!!DFT_t@0cFjPl_Fdp6Rz#aA?bqE; zLmO&`mMjrw+gkWbtKDo>BW+(}n+e<3$WV=4ij8RTEWd{Eey{nTWXUFY)abvZO)l@y z@JwQOd-WbR?~F?^ym`41Sed?S6JZxE975^X6JJ;O)-=#Obl>#C&g^Zq*5NM_93tPT zOV>%8g)-Jj@Q6uQYkPV)aBK8mxflZ}Kr-0BFr5|gzZ}-vT>Zj#p*;*j-@w=;C-CO# z_oZ)a2z>)IGpkGU(}b7Qxpk`Qt*%O%KyP(Ld|%-XCpD}rbx!_BpEqlpkHUJp_l!51 zblFHq4<DR|Qp(HTc6zw)@UAd1u0RKi9N zEjH?Mugt(FZyKN42Qu#&n;D#`tU81K;fJTmF3>67sR27PNZw|0vN}~eO3=>iR|mIb zAD1kH*B|1loy*5`4+P_vay^EwaNq&XJvhYs)yEm&mk$5Dh}MqvM!d44IMJIOF`PhX zX}Odm4#>HL6_J41moh4fWst(fTR{n3QC*)8cGUPU%WLPiM5>!LotN&)n_nD*rd)M> zD%P%NY(w(qpvMNIuTj%y2P4O1eR_bf5tABKQ?VgQ@4s4kGB6+RD9#Mz7uliFVsaYP zju9Gp<#E~1F=g-oSnD2aR|9B=Ziv3RAw~(Y;ZgE-C%!4a26YG&m)EXmB@kkE)N~sA z1NFfXKG@MY(vzSyb-XaS++!vXf`Az{R+BJjekJF(jH(1tUS7-d*l?juS`5ct&(#~b zPLbHGSMEJduw8$)dXS;6Wc&PmR+f+H=H&M?_)p2)@hz7##($6C=LM<=8Jp|C3 z5gV)&QKG#UP#YDc9d5Rhq1-6{E$08FFMQz(gE(_0h~x8kCW6*4VrG?P8NX(}Jrl2K zA-8&S-awo4bi`Rv&bKz_%~#vrg86N}`i&p`&o_E=p0?+UKvCUda~{dd-}3aE^GM;w z>+5gM^F|XOm31B|Qaq#0c}$bHYGj_oA~##!%GcX;w2AaA_85yS=D45$YpdQ~6u3(B zh&)Q_eay-705o&rx5g}VcVOH?TBAbN?yl+K_-Lb-!zNEA39tSfW(j#J>Dkj#Jacjf zFv6n6YQq*S5Wqr9T9Z~ZCTErbHhQ5xPK;g}_3~OLct`{&MSC4GJ)9T?)k#vE$$BsU zRZuF>mz8J~y^<6!iGbRqGtoYjEs3}bn6|yUOXH5TwI+vFzh*}n==l6(tDINLU|&NM zoOZRgcF}gdB(g+@9gR)++1T_w*n}2n%>eYVclDbsZT%X6z5q~St7fm=M)8G{gMd#r zMC-z>wirtzQ%*vF(W){n!Jq;!!H6R95{xlm3D#026;{)+qM6o|Wvs|0Td#I_y8uUc z$mqwr&kyk-k@x%%d8d1m8H&a0a*Vc@^jEiSgPAJAhV%kmQGki6#jsCmNH4Ujg8z)SCCEbNB&xe%+8_i*IPyo19c_EKi8WO_(jq-(gJIn=lcL4>>AvS`jEs4cXC zx=c`e4pCT>j5gvVO_KjK`0K93U(z$gU;5-U)NZP`^xY$-z}f(>zN}yo*;+C(z3QH& zFy0Wz1U9hyVf+e|pH&`+?X?F2J7+8_p~KETvS|1ysh5N|xx7I;HF-f!tfL=5P|uS~ z6Nnz^k9O*MvL7?gLlBeh@r!r{%J8-_p15c2=b&kF(Cm~EL1!J?;m9vJ{3YCEKtOcf zcD!lphvg@kQCmCI#?tD#X@~~#%C2dHnwPW`bd!-vXY8__$2IAE%Vx3a9eb?ZUlQ394O1~2L98l z{zS$zt+&!y8KCD~o#axW+{p;ZxBY#`&K&;eFCX}BZ~N)AZ%@h-<6500-6q?C-_yJgmFHVtw=92nLWqPdFSgLtvc3SVrv0CJrT_6FZTRq3t_!fl5 zgrT#n0=hC_8*MZiat3D8h}Ck6^mT7zEk$o*-M9*8me&_rn7yzbW;Xz_ApMh~`ZMQ+ zA%N6Xzt=>0uD1q5X0mBq#+tv-6%C+apvR{1{TQ zGyF(BQ0sucz)lXjyKz?i6^X}$8Gto?jy?XV&q_%PO!3NC;DD8N-Y|w=pyy!N$v+b6dRi=2@`!z2d_YRIpN{2$gBx3+&i_CB`aarwY*@3adR$g$R9CI+{#Ff|T7` zvrp=tBLp#Jeo7oArD?9*M6KBTuNI@%!_xxhw+c;-JF{~MD6w}5$D6Iqg>L-S^UlD{ zDzNqKS${+3cE10NSayD6)5N7bs{ERlVM--04yK%MG36x2T0^iNQ^JUYKzaZVUhb}UwN6=rI&eG8`ctu(p9Xc4BemB265IB z-r91-Lpg!zKME$rXVfsohMUzA!j=$ice#W`h^5g&#}4S2Os|}tCO~{%VY<^TAY#kS zY9MTO(6*m5EqXaqi0}z0XOwyw=~nuee3qqWl|=EEF@u?`YAhvFob5c^_|%gB1@Qf;0JDmfQ`vHvN53Ic4N7MQ|&$CWlY*)iDJc$(sqX6p~q2KGmNn)`)EEm>%(S5LYwe zv6@oBC7@n@Hf=My-1=*=e)%sKAb6`9zew<9*2D(>g6RHA8Bdckjqb|yRYgTRv+$!* zxT8Stu*Z$rMV@^IqggMk2kE7R6~OD=*%qSF2{lWR?lc(;Z0!o#yf+OX|v$30uYSIi>S5u2cy6tLc&HA2K@nX6c zOpHIK1)S;z5yo51aGG{)ZZ?0ykA9tm7n9f3m0GNeL8Z~6-KXjD)jsT=SLBGju5rZ5 zhJhsqq3A*0cuRJw8}v*Yl#ac3Z4R zUbUz5q-5lF%qSxJ@@2&_U9p25)fJRDt^f-IaRrVua0CK2RU!~9i)=Te@8IH9#~Bkm zkr*K6`{h@adv;|+u4d(p|!!m8{g5AA74*LgePs`(>nMaQM zPpbdYfOVZi1J)HQl+8;}>1Bcuh=2s65r&|ZjN%eB2%ar*D#UCl5-A;o6L?dGOJT%CAZTcYS$d8k83?V&!}qGnsVC z4e5!@IZE&9Lxg3@X;Rk6jMJQwh)5;tA@LgH4Yy|B4Z^DLf%Z2va)A*zM5#vLpstL- z0bM00x-1})YNQ0mvB!(edu*_@(kCmA4r1n%m)pw{<2c&^!#I6=;<(}Kz3I^gX!Vyp za2sw%{IA{|x9N6PH!M+9N*#7r1_1$X5RM~GtP}-x)zoI{1B~gC?#**y)~+pRn3*;XFcSlQ0`RFz&JQ&4xz_;3_*BBic1WZ4; z)f^3?8g1N4*2TuSh4yv>IPa`u0=-|*2ZDb!c2*fo5vLjOVKBXcUx>~d9Eh@R+>ayPM*+cTTq7(g*aI!9<7@QE0dSv znmdICY&nD)Oy2#dV%i-AnXGG`9+;E6$!elw5U~5CSm`4)TnF!d*s$!(j;Ogb^@Ry7 zV!io_;5XH06B^Ft%n)E%;)R)PtTL z06&D7w1TWXK>SYDSoMhjA|1g_d_m?u%M(%{X+8Pk-s`-@!S&J341@!UxD7mNu^#tAw-~qLY=}c3CHqeG4O^?Ew4okIwjKm{trx8Yz-2_P5-%_aPQn-X zan()|l!y;eM~bv5=NXb!*iVDzCnQC(yQilmZ635OZM8?$X8m;-$X2m{($mkfts(Xw z<0x%dMz}dZRFoDH@UeCxc}lDvR(COV#fc`DGQ9J_eo-zLi%2}6DWOcm90NJvI@M87 z|F!!0JgG$y+fqx4YEQ>{GefhYF=1>@r?EMu>({ZjPgf3hdq`KgGj%0OVO4~$BYL~U z+cr|jk-UoWT^-4**xuEVyo&8z9m%WM-o;v)U8S(tJ|&Y#UPtbl*qOG?(@f(CZ=y7% zNq;qcd|znMtWZR8XweGYO_9D6CoR2joG*bGm(ilF@vJ+wUnZoNvu)Re^p;J`>sETT zDu&l_%yrc3RxKjhF}$oYCNaDY>1Fn8Wc+{_HEF9Hx6y?57LB%wR@x5jRj7$Wd+G57 zFjiea1l5~0E`$gIfjCU+*xra28YvoMRcvor1K`-+Ni^>{l;ue@uVQ=aeno6=6V2-- zq>j_oar6xSR3<7{EN)Yp!La?&&w;Suz^ihs7tza>u>8>PHfzt|GAf02h%|Dt-U zI3?bAK5T-(e7YbAFH9M0zmym#1vjAlDY%N5Q?r{^#to01!iyb>E)JaD?W2O3sE=0f z>2zpeCn$NSSpoZk4g}Iqpn6`j;&ywJnVpB4aruu4c~zKw50i!fl!Ou4Etzg+j3#NnW!7Q;!5Am{BSd zuU8^hW2{zK*bG?Mq)Z@#SaFJR8>aON#@VQd&$q1y?sirtxE+n?wiI=K8C`Y z5kQJLVHY%#VJePjjmVnWkPW?7$JvzFSb?JBo|~c)SKvk5vx@j3O39twa=Xy-+=PHQ zq_T9<6Ofitp+wdb%d<<+qNpI2xx$F$AQ)l}zZ5e*9E+)>-Y&LX?=e$b4P~Zg?dqA@ z%5UftvByL+HI^mK9Ib6FAfleMnXIAt$?guz{s9ttwe0^&?czwgH8}Moja9uZg%!DN zBTASv&XdSDk_aHNpkLyo#xIwkM=4w*=-2GsAjTuf%B?a6J;S{lgIdm(^rR8+c|)MY zk+cQ8dbVos1~Yvv->0l$TD(t7qebnwvYi`^l&&P*>)xP1tdjLtv~z>S0;}I`h`4K5 zXGjUQ2wx(;wL)bNVHQ#y+Ir)Kv6=FQ4E0lMVRqsn?Wnb`+AdS$HcV>CaM@%Bg#Whg+0L^dDzmjQ*7&{pC zGLd#MQzW!rI!EY?TuB#c0+T&0m(CFyC&>V`3E}za=Ll3ojCt6nx)J@^Sf|#J?N=(q zv;baL`&wgI0i9TGWYht>+wdUp;k4*tT}xL@BaVb)0A4>T!FggL@{N7fSc{?|Fwio1VN$F0F;{<^h}CwZ=Tf~a2S80YTrO+0q%B!0 z8nf%+v<;~`+A4f73iH}Fx*WDq_mz6I|)6ET@f>;OzOT9r> z#D=G!^Z^NW%9&l+|D*IDe{LIi>h;Wy&iP{es>q)(vshdpC{j5=J}1S6hZhSte5TSi z-kIvjVqbMICwdV@Wk%TfHO>I2eqGvFV$T^d##u_s{w>+3b!CD%qbnBw6}_z>5~U?k z*gNgfc=Ce)-X99QKVA)UcA89JW#AQe$mls$697AyaYku~d(qEpqMJKuVb|nCcXD_1@uukFV)T$REGHc# zp4@+dP}%1&BK$WxWt`9^uz^F#^9vn2@=`7w>#~~*wuhUzV4_&$;#25JqOTl_WY&+g=4|BL#vR8T zad1H#dgSv5U~bTtzez{k7u9V<-9WhTuSQ;zv^H2UQ$re37wUmpoq5$`6%)}Lgyw(J z3`22e48t9^hili1h7B|fUmZ&$|14vN0gnKzcr6!t{&ify1ITjk$LwQ&O&an}b<@6d zxXj(L1C=2+2~>aVlNcxMx5+@~5)5B0d1m~QcQP`q8O=^MmBFPGY+L2hOUwp>=;nZk zJVzzKuwTXWXJ8`Z=G_v&mQR`jzpcqW-$~*@v!|t~rj(n714~!ly*b`xkOYF0bne}c zc;H?LW0xs%>ajfUPO=&%gDk_Nd95NdmX7AaE`Bcw0dxL!*!{!RM{{+cuMtJn^78V~ zyMKCcDBcRj+`E5t;AQ{bAQdX2VIR#^NGy=|m$#r?DlKC74~gUEsE>=?+VrQDR}V_a zC%b<<>*~X`M{^a3BYO4k@(#k6CXpyyrpC%GS&&sQwyW@fdwL;sSia`qr!IBWQYv-! zLBAV^Xv(FSlc>l2mPo~HK31X|F8C02fgjKR%l<$l=6k~qPSKri=hieyxhSN z-iHJXB{3X-V;?xUsebG5N=7=$PsnH0<0+<$XIj}Ua9-e<%!i*q#6G)f{?;6fJw;5W zBT@Ndq$#C?8t8Ef<{0B=8Pw*|tYmwir;MJ&|7E_=@fFZ#>kBayRu8Jh0Lg%UFwaDr z@sE-0?qAqY=osxxfAqgdr14*uL6`FTV2y3Eg`!7Cw$R_!(@i{0zT$i_%c{Tnv-iAv zpfqvK`%3r8Iuov5~_V+K$+IVp$5LSN^MS=nv#K7NKmvs$ z6810jaDOnasw%lVE;F3T{52U)Hkd5^)wxf+`+Yxt?o)r5z45YRdMxEhxnxWifVMiV zryGYK=*)f%gAKFr{}B&{AMBX>hTrF_N4K^r-QVax;)NM`Iicr5%TIN6iZh>(9x8XTF$FuE_KV*8Ga9c zpflU9_Nst?tWKyW?9Cf~xHEg_x~6f;GZ<040e&+%92)^&NBIxyXn+}tlFN=t&HzBv6fUq~@g?^m~R;qqV1j?|nc07!g2x?osd+@_0~%0$-H3OlM9 zy1y#g)YZxI*-aiv&Df$bPujm&gc`&EikSDd|CJfq>%y?#{4ehpoo){$3h!a8w_sjq zf|}$=Xi7tUQYn+XUKq19gYSoL;y+4-bC=cyLMa90tkt*!+gLz$LTTY8GpgCq|K`OUHKoeiu#7Gxx&TVggEF6mm2WLI)uX;sT+jx&UKVFRG4w7~%hC zEJo^rQ*}XIgY#UODyUSP5-HSzLS*JB_VTJ|M3~INTERslBQ!9W?hdQb2{AzGK@68A zf*Lg%ZJ{AI8hG8^k(Tdn=8@!#sUXS)gJb}Gb@sFP9j+@ALrpNFY!!)My-@?R=b0fm zBrS-e*ttNp%X@1X+85#QKdH7${UI zU)ZEDm^1uilIqkHMR5!Q@0T9UMLkJNs4u$Xe-);;>r0uVVrleLUgYo0TeD+ggu0*k zaqv`uou&Sr*Dmy1ayE4$GEh&tzgX<1M-qcx*#`8lh@zcY8Md;FHKBq#=?}S8l~W|s zSsI3{Ysf60L*lN36U%I}&#%IrRuG;uYxGJ!C8@0rCuGkG+kyAlAIhyOq_(4>*Cz1U z3g2M=PL+wW>0NEus|UQc9=f}3r+S6HOx46;Gg0;3sqA8_>bIn_uoK36?@-z7*t|qd z)fT1yZsryD#0K!$@5$4ux;=C9rq|$6R~*?3;M+_%r9cb9NlaOr)e)Qlv!*nD^Lbi= z8^V-5VihepEk5rBDII2wu!@j`uB@eHrJ1>zgH84>3{c%Cp!d2yio*X(J=Ym}6K^8> z)yEhM+DQj|bn+@t-EWbNVBL_$GWiNxn5_r%D+WT1ExLJ=u$)B0qM@qCcpY>kX(4<( zE!q;H8*j6$oiqf9wtsmIQ{|@%mO;&u1V(4H7~|!fIf%)P8G`I96^0`u6W8VL>r~Fq z+up`Y_uP_k7%z8oZzsbkcPJd(_21q+o+n8c4A}mH<;?1Lnkwo#mBI$c&)b?Syfhg7i zg84E*z>FyfXnCor=UG?r$?J-(ar);`DXwev>w3bgujZ|>jy;3Py5nsa$w?E<yB@ z9?eSoWH(4z*ihm|ZR=pl-o+5eDv37@P^gqc1v2)~Y}6haQt_5EG>KZ{mwNHiAYPiO zHgfWril+Fkt20%|bX0ZZ(!?NF{f8g_WvweX@Ja`GdeHNIe+ z&!bM3U7xYS5LLX43W_1m6riXP#U+O`*(b$;#2Iz3U zAq`}rDqTo4CT0*#^XUT4w1UM!xk1CFk)-3(riaN8+oSFXw?Vl8+l=uAGeTu=zsFC2Hv25`*6TcI+-Pz$2?Ma_ zKH*vY*%)nUL}4{sPnAQr34V5T?hsdR1iZ-U%Z*VyVavqYA&aJIl^KTM zl5Zs80JK$N3+)L6F{w@u)NTB0->xb!^>4q#zjDB1avxR6%Bzo3AC0@l`?#Qf0_5 zOO;I?jLniN!z8`Fyyh@Q=Z6x>rjbLMEihJnu&Oo&;`7xtHSIw0W^z7Z=*4jHb~N8M_ z(imScL>T5h2m-QzXc&(eDT%PDa>fKAnCfA~MV=vk2dHbc6vp-_@))k7h~XNF;7bOHGm)+W-($`?)TPjR0Y3I% zO?$ZZ1t7(}Y3i{yr*H;NrRSrNxDY8E_6_irpdM>((Woi7SPY>NUNvenWzQG^{`ROP z?Gi0184H=E7_|&Q(x`3T4|fPls`6<^Eh=7j)apm;j9PlMderLoJ!%pytx=QUU@Dp^ zw=^=tlhs@^Q8AsNBGtFzEzeBsXJ+#@>Z~04nwe&r3f9g{bq?}oW-13L)>CN89TbkK zn4?VOwK_$8O>KxSTG+e4hCtGb0&83f1WOuK=dF#F*-Sia|3l?h2+IYAmy?mCB6Iba zVO$jvET|ayx}aO+Yfjjz7Is}iinqOn-99~wzd<$gdS)@CFi+X&;hMOS0z*GUuY*SJ z_>|uy9C=5Ajl27;9h!{WLK+C&Fbf6)()0XKn1s=jSd-*h^I#&6koQ@I)#Pf(tl!E$5otyEQOGctcRGcH*4G{9_{R(13TRFGD#dH3XA}N&GA`x28cJ zi0E0l4Sz@`Wzh$V!|a-d{*h%lOU7B7sjw|LV#d>$2tE`2XENc)XT$ovej<|c!*&@B zMwza1ddz-3;5JQF1o&!oYPS-qZx8_f2`TA0rx?&+j>%d({$<)>_ja;%36y+x?|PNV z1yVJY(HVQCE8TXP1BCH6dEdSN_Jh+lo&l&zJyHb{rHo|fH zACO3d;fC$?u(EgIv@V*uR_EC`8~%?{XG>~YVh@dSCUCo*%Ji##ZSs;BXp#4r1k-ys zM40{Mc2R|+OieRI``fy920Xp3qgY&rf@S)APc`&Q z#q1JPh;#taGE}uI5csl*VeL6S&Sg5yBmwrDx%DV3HFeNMjhm)YT;~c+$*J$~(UolY ze*^Rn&lSDuRQ{ zQ2x)EZ@e~DY@y|66w3r?iI6JyWJi5!gma&=w>_Lr>|yq%VkizQuzr^DTJTau(Nxhv z6;x$>ou{vt2JbBg2f$$SeX;iYPV0NwIsJW6f4{Ky`_9_$IRrFyfpZt@?>qJPTi1S1 zaPVsQd#&$#_4nQS`|H+z-&^}V3! z-e(K8K3cy2JK0DuL+A&2V)cT*CxeN%r*Z6js*w!>g|EYqk z4;9S9ERh}_tsm9}C)XCNtSvZO7ceXeL|IMT3GT8;a5Hpb62XluZ6<++s+ohC0>x0U z6udBdsN*;UN;~&f#XaLJNDLJ!Q)4KlQ==@Yr~E?E862;c@4v@(0z?55)N8u;mzm54 znp~ZTVQLoQVYT8pHS}6+EUa#<`DEWj5DQw*LD7eohf$BbI_*kE%(%Ws0o3HIiZGk8 zN*ug`s)Tz{oP3NEu#|#;Z3hXguD}A6084wic>;7mnkr=tkBy=QnqV|&S*%=LSAcd& zMT+Of?~nj;OR3Y010a-{-GFogr9Lp@PHF0<8wd?M8~mJMo2tXfJsJ-yCq2J5XdLWW z@;JmVI^2(OkQ|}<$vAN94(mmh3e7lh51v`Es|f+W4}^2Nqu|1b{a8o+ln3$>^)nCk(BUB{`C2I?dFgd71Cn}S}-CpzO-(S-Unpoojtd; zn7e=QPC!_Z$qX0@n|E@bl2Po1Xc+u=ASImItguHhSAKYWu09)!wKDH;Bo^=JC{DQe zZ*<~tNsLr%6P#g`6@gjT{6E!|Y7Zl;fRvVsrgvrE>FtNH;Sm4G&PY2*_4jGvKzGW5 z{1ZBKJ|P$$0r{yZVQWe&KyQLe?Tx#`H7yF<`?M?!OO}%9xRc&f3EdRcf5W1K-%T!> z8iar@zqk2#Q9HrR8wXgAf!ShLe($Q?ld1nKx#1cC4EWa2OdA%n-di~xZ3u7-W>V5^ zVH>`^Q~it+pJhsaXIC}t7_`rpv7$9K6E!Ip5eLA z#d@`RXDzr1m>GV07Yn@lrF{A_ZrYUXf zcM;vv8Z(C{hEd$tcomfnB^T6!_;tX?<+XsQy+Z2M2ugQ5s(?j)~H_9?b>CV)0-u)M^jqcuFZuF+o78 z(SJnD!v2MRrX4IY6y(*R>J6Y8Rpdws$jEs{zwb7omT6I&r5wPI5BrXx9C`^ zsmK3v1PMp#)-@56VYZo6#bSeVA;^9KfI39?5$!D{<(N)-N`P%RZgvVL`(NF$ci@6_ z3f4ky-I}BJ3P)ndompiTVy+4fVn_6FY4IS-{j`Uh=_+`C^PUcS2FfjR9^*nGKg%n! zIsJN-7^qxW(tpJpuNB9UmZYdeV+j%4xjh8Bi|Ux!P@HBS5?eiJ+mWF?f}C6S(Ss71 zyb^LM?S-_26x&M5b)}|%5mwV1wXhbSJI9-3)@g7knR-fBjO34qH8>jB!dymm)U?T9 znPY3r6HW671>O=E$qyitlO_{bfPU}Feo7cx6hrSU@q7L=dm}L;gq!@68h4NAuB^CHh$@+YvB+ zoc<{Mh@Z&Bj|wjc#Rqd+(ki?s{1nbK1}8KYjLk7!aakVKl`-NK@I8m4NTy!=pt35@ z^C!vQ^pcuG#uE*I?}0a&ND0F7FDQx`NW^LO5Rwz0m3k1JHIkbU&&2x;vKIr{h$WzE zcCBkRat+$C9=ZS9vZXrsG1%S5g@h=fy4T3O8ptW5PSsb2%u4lD^P^lpV_-+)PPLN_ zJ>4vm1+Y`SWWSf$@_bvxpbKsl^=N;rgAv{IiVcwc;m6J7IG*5lBpSQksc!e{sOIIb zzlV|pFDQk9mu8l-;ZH#tJ37NVkavbhq`IRsMO0AJzcXuO)?=e4i()$`LjL8e&eHgymqRtTVTf$m1`%2n8fDE2yMtm2>t`$qj zteQ<2Q@{M+yw)HV`a+v<3#kO=gkea{8So(Di6K+O=`MeKQ_;VFN~cyTe zI#M}!3ypU8TY1d|^;Px|)H#$;UO7mh6ctF(8-Bc_SCsVOpu#d(Q!0JzE!lA`uAt)u#o-6ThQ%=^6bbKgDU@;@2rT2F?nmPIX+rPwDFuG($Ej;K9p0CG1Gc!c);h+Dx-+1`qe28wk zrbc#j4i{sj`6Z9Fz*@@QNF9g0=o%|Weditbjfro(^B&X@o?Kvp?A}um5{!woUH|V+ zz~i;2yadAj>|D1J99VIPbGHm3a)DE|&@U=tV8f4VYdNXv{_AhAWGMzCuP#n*9LWT& zLQM=qWTfvcy&qyd3r(VZ1j!NMB2prY-#$FH&?*8a*XrtXRE7M|A%N_o+E@MIr0Tr- z-N}tRIJ|LEL)lyU5UreKvACuc2@=plrW9>rW@`(7gSyncx7yTFDqeejG%ZonBCLDI zqOAYlQ5Bj%Ycz)Ys`o?9&1itN_q6Z-_UW;91gtG%3|I$iY8O5aDW5Df7%i(Px9}(#%qhB+1`)Ex}g|DGJWg6WPc~JUf+^%p&+FvYOJd5ukZ4 zNh>JcHtt``IMB%5ijSj)rNjS;Z>b0Wp_1ijnM?qeid_Meec~=bdaCiAaY(- zT-0Oa0e|5#ONB*52~#dBjvdICOOc6T|B+u?$*LDs#~6(WXvsMiR009XkOCuQ_EPss zbTX-MwBl|APWFyi2X`dNwM+wx@k)s*#XVM)xZjP|F?r6bZ`AWQ;@#QN*~Sm7Ys4bN zj|h_@l`Td7Q{H#qm?I7DyvG8zks<7+5M0CGRnMKizB(`wfFcjd5hY1ykL>S8a9twA zd=A7MEUHhR5hC~iWL6J=j_MKN#OGLBknJ8X+&7*MTe8vNy!r|VHr#{tK+`-kZ(I0y zokrp{6HMjf3M3NC>6pGJ^T^c=$3tXGABJNOU&^v{VB5axagd3!ss)=i%2khX-{JR+K}EPTfI|xO~0mDs`>6E9~Re zacl$aN?eJ64anlY;f>OYS$Sfb{?j~c<7cy^1BHrYZAQc?Z63eO$52Z&ebm{B8U#uQ zmV)NVW%`zk6Y1HaTAR`7fYcIIME`H%a>D&zrk#sYxe zcgVIA3d>EY?;Z7>8VFkwccVwAzQdY}VHGublD*q~7DXU$=`6~Xb{St*39hv>TK|$) zD=l@{8XcmaR5RIh`d@Atc;O^cW5%XAuT?tLU#djLx^>qo0G8^Jl}`VYrLJ4G>hVgY z+p4DneLw4!3MzMNrGf^Gqs!W}*0oR@;2iuU5U;;dQLdrT_`OnrsGjcaBGmT3ELwwP ztzGO1I)^`A(0^!MIj!mRHm_w#GQj@ih!HClAV{X?APa&jL>+eE$$G@ZfDBMZ0qz`m zgJTIz5szhclUKE3XldfZf9GawJXW-ULXm*osjo;GbT6JH$Dyk};*lne6m=u?7l_-9 zFh{5n;9lJZc7mw5C;wD0IUW^kmc3?p!cH|URQS&8;Yc`zgkVAB7&=CmRe3PG6HZZ} zJ1-pl+NI*aHSvx}$4jN(9k5iY86%cLKv@ib0*p`osiVd{9170ms}R?E9JEW-bGk%E z^_~;Z#JoI!+vuLR1P^@**U&n>##68TpWnr6GkR@1uX&qp{hBnE`n3nd6IkGp#Y55n z0tDK7^H}9PwoMUAq=yFK|urrMnCb>;I}(`*b93V{BJ6l zRRQ3s;E|>P+^OIfRWQvP+Oi4*X9P`%qxoZBZi~#jW3-4N{7{oQ`)nZTDksJbJGwYZ zG~5uUe?gf$v$^51!qyilZClo|f#w$)7OSvW;;W~B$MWuryn{CWMeD&p`9d1pSw$Pe06-mj}<_Gza)SJBLNtt!%NH>u()J=;Al zV6S+#dz!b47@9x&`?t$Ef}_f?Et+1%jtVJO$vQSVG=Q}RO_669G$BH)?Y7LVuO>9c zxO0F1{T$xkba2Qcd_1(08Yx1s9(vP z+G-izX*{*Zd1_7&Y)NUu_!k)*KcS~~?4pF#Pw@-H(@*K?P&Kz$0Au}{?2jm9&9}rx z#M2{!YR)_vvs?9JDzV8to4l{QuD}_S!s+PArMV%|8J=Iq`nfRgkOj6dLAxpnf1oYeg0Icy{Ez|sWp)!4? z`gS~TF$YXR?$W7TDN9ivmPdctZVP7KhHt^6%w7tE{GU;W3Q{Wy-EM72q) z;PV#MCJqUzJrk<3@5vhZyw}M85Q6%(6G8pjuN*D@ z{R^h6LNFbD1R-?QYQc0$WtS05{;XTA{Y-+X`RwmQFunJAWYF(AY!MGxcz1EsKxmh` zcPCTd<$g)-AI5!z2N)jW=7TxGjK7oZUtkf_{I8#Wb$#u{ofjI_m4((w_-I{VF+8`p)21>6_o|g`Z{Iw;khe3gi?Q;M& zAMr491E@XKS_jE-_<-J^Ms?X_)*y}H<9s&2WUC}0ZiB}RIRwcph1ujN?D7;#88g*yc07;6kQJwtY*pB_>tP&P=b+MrmW54{p zWMt4PPixUh8g;zrEFJl9Z5s7iE9UCs2_5Ufm7&L4ha<<^powt5HB*9}8M*JfIwU~- z!puvzbkw_6qy(0ylf57%7TbXm_8*Ge9BEh&`|E-)15WCx}9$bYx1E-!t06Puw3PQPeV5 z1zbL&(d5dg>J^Bn`U7GxMcomPq*P{(ql9@KZ|M_r8L{d4qMBA9O}|=xCtK$4LFcN5 z6zA6foFgpdFRtPIw?UBa5QiyLE$SRpV`g(cQ(z_Tk!z~Wvq0Y)G1q~|zIl+qr%6%7 zbar&iXKzM%{N{U?(O#^44D8;Oi*~FNPY%%_@+i|?BW~U zR5P=1jzU|f;K%VsOCpioLqMh|HJA{}x+RnB0_{4TOd(eMoO(MEZu*HS-6W^upXVI9 z$M^yMNo~n8`1qWXZ$NQurE-jfS%k0Qo2MM{79wY^5jj?|*AY6%j0$%c6^QCu>k3{kaJ3vSs)y*8 znUcS7>G0ddyqwbO({B8dG9W}4dQIKm9_;gGh+HP)3K2Eo644CAxT%pPPtpRm_m8bi zA^@RZ1r*K`KP%W-#y{nb+8JiKka~lfqE2NFcxcI|sPlW)t8?L*)yWyR^;QDI`Ms*M zJNyVEV?HySbI+_!2mRuOu6I$ui^v&-C_%!w6-(5*{?y6glS_? z-Ce&%<0-;JVBC_`zC#5U_u4^_s{)sJs5X}FUy`c6^VQdmxAArgjC`kaQ8{#0trt=s zXm+8ftJ0}%VZXD~omSHZsoW|L>jZ)2KJs~NUApakOEcj|hqf0*;N|!^ zlqxsllBiU!NAv0D`jriTP zB8s|-?-SMVSTv;CYRW=pdeVW&YK=sj>Zf^?+;b!Cupc14h@{5RWSMvw} z9ur#w!b338gX-IcTe2f6Lu`E5SA+0FdK4f;NPNwPy=Mx-5d_7X6hn?HI%05Vlzl1& z@1zHhhYq}*=*+PqV zDFh82CQi^AyTu6v&BC(ggpHSSLaQ|(=Tmb+4OamZv?GY8>itmK)0twj2PzW5T{j&T0X*%)aVI-QL-HMCO$*I^ji`3MTJ4=bc;lRj<3^O zQ)zDnlERrt6uggEU_%SZR3_>L8lb|eU?;>I%MP$gR)-F)u41OdRT0KXM+f0(PPCw9r9)CW@eaw>lcPU19K6k}qmB~2sMuM z{UMf9zl@jMen}p+YvFc(wNai#J=laN(alZ1Le2PFY{fgA;0{_(wB+Am3WtM_o9 zp1YC>jIP~&N3R1#KX`C-FAlhDu-sMi|;hYb7}Y2 zU2M=q&*M<4K1)NYOEDTgmx>BYH6yTa2&={`sn6$9MRicFkEVK-HPuH`dGAVJx=cSj z>GB*C457&~esP>`v0bTkc7qfw9zL4tnSFt*vF6WOL+!L&wIpiP5m?kNg|c?lLg#kX zdO>4nZ6A{(B>jE;Vk+_(5sp6i;v{V+al&lB9x2?mED77hNPoXvByCr_s7kK(HADwV z|Jl15SGy9kRDa2RB58m0tVtNE!7jDgFdDZ%LTNYB#yZzomL%oY_%!?kJ0;nLBL{Q%uKb z3Nh%Nv_z<&X&ehD%vgQV)3u`yA6_JyD=MP}a+4JQ=ks*L*8MBLr2#RomMKz;D1XE5Z z;1AM(kg_!Rb2_M~`4oXg0OKkdC%h7|AvVex5k#@*c=-z}Sv9Iw-u+8;k`(2iRRF_4 zco?*~Vo(mm6~uC{<_h%GRsh4m7N^do*Qgs<`_o!m z9tt5s0WDs@EB>8NN1#~cT7U$*+N?LF-8XcL`2lZ9UR|SEPTmCm)Nzpf+^zd2$Wftq z+&Ag;2*RWzx4o-tTt>0%qo+4qZg&4Hqnh=lA3~tJioHyI^lC^|QgGEjTN?-iQ~8w2>ANa!w4zq%Kjf_l*^eA+W*uCw zlbg=%I!{_cU7KvA_fEq8L0L@PS3?!n3>aUKZjncubJnETmEzg`8odO`G=Z~4jPz&b ziVY$CE{ZGQ^B$;&eKi8%JECN_5-e*Bnvz9jxz#8%CFMSLzX|P433)6z_Iomjio=D2 zTEnP(!s88;Gy@6IG~e&tPZ;&QTuD8rT%4}cByxX|c+^h0p?)_dW`1)yuMya211(0x zIo)lN5mp;9XLy@*z&)KTfqYVOIXDf!6lO*)FU6qQ^FF%a@T>U6mRtsz2M2Os(=AW%)yH%`3zhB zBFnbn*CnliyOXjwh)%0d^FpsW?OZpkiPjv`K7W@yWX8S51lplZ0WGr9PjW=-eD_y!VKMg#F3e;% zbAgFo%7wt;-CWo?cM})v>x*2FCfm6XVqS7Vr@oF0Cira#UJl!xN?J6Eeyj*7W;$Y@ zI6Do{6avRjSXp93ut)c_PpgfM!{GR?at3T}H2ZJj*Q|fdY1isze#)}_AAUT}FsK+^ zr~fv}NX4ukF(NxUD^!H-COXI3A##McbDiiM8J!&!9i8h$=Sb%sc}3j0PIRu*?woiT zxEb99w^*5iASD{D(y9neM9tzOKr{8GW)JBxktU>1&JN_N2@^0;v4;P1jG+f#co|EV z`P^#ie*EyYk41XTtEW~&3oF7>iP0pHx@AsU|Dl?HG#?8S@Hh`7W43G@pmNcv)S(@46`Xm^ z2)%;$52pSe@MA4Ih<(MH`f};Rp2d zFhBG7`5-@w_<0ad6?(z}CRWMX;q#J&W%8rLgzc+?o$4exemd0yon~hYGe&WUts5s4 zXba(0pOBc7ZSh1GF{ibtx8L#i6kmm8_C6y@PPR%UMEIyx0u4}dv{eG7kHG^8k0&+J zCZk8UCS{t%4tB=dE$p`+2X@;|p@>qaY?&J^@*_;<|hIxtuqKKLIgI+>Sx}^Ae7uN@i5l_^T{I3G<;6x@T)UwnAp!MW)Z}HBJ*yxX5*7VF;9GFq4O#7w_6e;=R+3}xpAyI{nT~N*N zC8f$DlhLNXdkP2U^E!Jk9fP$c%nWj^v04TwSUIxBI9aX(|A|jVO~A?QqG(VCAo9Gp z*e-l18p!R-1rRx9xP(&%$78=7ut)DXw%VoU@II)y%+2NMgzLLn1EJ}tuIlavhtbn* zRHC}Swf0*ow-|5RjCvjlnwM=}L@G}|*9(Qvu~Kh)V*J?L2eVHwW90Q{%{2S7r+gq-Jz0iJLsuIFiH>nJNdgeU>nDY-mZ$PX0& z&kx7y-jk%GdCk1{7#!$~o};4W&ggnwpDIS1}61HC8&`1d=AT1L8v(7RK4ojn+QA`ky{&x zNm)s0BBcIa7Hov3PO23mtOjDX#W+i)7k}oe67QB?z zA%k+LT3;d?heU*+SQKo`9qwx{1c%CZOr(V(dr(`Vi#EMFcA&#jEJ7T3y`1o{0^BGW zNt3Wkzv*6IArnDGb0TFDuXRQ@B)Vk)YVK1`jKRF$eF90ZF8n$(?RS7Uf{G*v%Ny9c z4{l{*zMv}_16lcSP-r=5sOTuM2*@R1kss*x`Kd|ot{%^XES&KG(mQBtK&lk*pE`%$ zX$Lf)+dJa{@C%e|93kjuR*l_Ev@XFi>D&ub=RA!dT4uz#Gi6`vArczUIZaT}IZYjA z(5vLKd*N|bi#Hq>=~|${A(9u|Amz+66B zt|gxF(K(C^q3%2ez{Sv$|6{4<$4Pq1iD@!8yhYl`3t0@kiX4J$+YQ4$*q-C=1}~D( z-KDyP8$kmCDY4+iJRx%>_E@ofPdQ!ANAk4!FQbFISwb7(CAvU!}Gir?!PiQTVDVL=JX1PL=PF+h9w{FZCNNEg{%7lPuY^&&z zMFJ$EYziA$a-I+>8Pj9BGN?y&1&#-G1&AZM0>J~if`UW3f|bJ{{`PrrSUqY5`oRu^ z&#*U|9;flVecZ=O-Q}H6DMcp>*s+rqLMwjlG>;?}9_Wl;h)$@x=iuJfm6jgT6--+X zw?-K0yncMC6mQncNz2f3}gWzN5{ZpmH$FGAyBaWQ5>mj27>At>BhqRTWhR$yI>jEh)b z)Wodi#|EHuIjhBSrV$Xe(XU^#u#)?pQI#I{m_N}hNa=}7*wNp#yzCMZyEG+F zf^DB9q2@G3kFr3ysKI*-{po@CuOt@xGIB_9sAp8Q!c}V+jCCIV(bZhfb##&&D+8{QkU4&m z!`M&RuGv^)^cf&ykndu9^#08)YZd?Mn#%rhOgxkCW|$(YAN$e9i8F(ZrTRGc$uBtr zZB#$hzW-2jQ{mi@!yQ)75wTq)4bOH)?t}60)xB46=)J$d`CVJpwY zHYRtwUr7mdP_d<5^axjQh&#>R-RdBV>_7VVD6SmJRb9gdR(}U-Cy)R9Lp&Y;LN7gL zzU$fs&?UER(x9n)M{(Vr;y$gOd`OyVQmcr8oGp{OeFsNH%gTjkpw8{l3p>lx)W`hz zG*6k`yX4j7&*vMHh+%olp5mpF9{6d6oT#G>?0tJWcMGVusymBC9ONtvl{)o7RIGYB zcPl5P5;Ii4`9AQVGvY|Xd%Zr{O)OU!T$RXyk47wuk?&io|0a}iSR9sUH~k7dEjK4y z5c|n<)}T4$1g zP_>a<;mc#Pri51qt=b+N73NsKRqt-rNa_fEGoxfu`;4DhzMjEHwn`S0+BA|J+ErLe-3$US1Qv0rW_&Q-5p zueJOph7%CvI}weH4|W{&`3c}ywqch@Bm`W zn$#C4yG{k{XR?MO96}Kypyoc_6P4gYrNZ1}rq%ED{&iioZGSn`9B$b2^15=kpR#J( zzjkT`In`-RUvlv$3LQyB0evc^>oViYlV+bWGlR4)PB!BOExgukpL6$cl?{EQp9CEr zU90z@tY_2te7&BlRwxM97yaO}%@ALsrKQ?}hS#TQ-j?hj+9K5YttF{YSWOr^3L@fE zlng4+CjY<)_TWI0+D{v@ zftq=|hIc172BNtHn)oqCqZ@)Bs5$ErPmX>t_rK&!iuv1|TFQ1#Hoqpqi4Sn2(;aWRGVYEg2 zpd$lq^leqMg8p4sV*~G`Dt)LZcx&9Stt<%2Dt2BPI5vIg4?USx)PV<9vY{3@vN$t2 zE;1X%8i5Y9>~v_Z=dt1WP3k+Cz8LQCdiJRM?UaWiLNM__DmfgYLV7;IM%U?)9WHa% z&GP?p^X;QSx#e~=K?#R2QTFCHDG=K$30pu|irE6flI;m#l<=l4V^>L?=Li`UMWq>-*qGXRX)8y9TXUTrY4~mmM1d1UzcKoQ+HkPQG(Ij&8%S0H=G$!rm-VV!^8*jhI zVKG}=cKz+}B06gR9rxS=TgWdC*t;6=G>jx1*T5#np-c^;8lHqt0;_|*QKxF_M5|MD z9{UN)>02;QaD@UbL|BX#*~MY$Sox}O*|`0fBbwt9{U%2Dp_Ul6E!95 z#_+_dzQZdnne;#8{Fe;}nhu@;4j5h?WIzwNlHc}eg*~K_guNI57Ui!7_(hZ1GC1=Q zbALGQEsPjd*-0>mNqp5^zVwBd-eB44Pu~XxeOAON>yRBqC%O|~soSO*#CX%dLtT58 z4cYK}ixHE!06y4J?+oZo(KYqhWviBf`CYf5B+ z0=h|wNcV(cm;~H`q=>jX_I{>i<({k_WP+~t@F^ym>M`A%{QmUpaBjsT)}yj_tvWhl zN0u%9@$dcCkNwDh`kkNo%j^v#63JEc2WQ{&SAX>IhkyF7vNys3O&W$KFUhg+rZsst zaw>iNebdDtGLIdOJ?4sAaHyZd7L)}%q85tkDEJ^qV@L=Z zmu+>Zf^LrH5vafpP`#ubb;+JaWjpXv@9A6+Sl9+W@m?U?#&49Zh*OAd-$hGE@Eb=M z`*a&25_@(F(PSE*f`CO{nHa{rkBqHBtv6V971fDJf%btM&6Uq;v7Aov2|#}*;RRgo zV5!FC>qdQD_A*ZtEF+nvxVuh&w#(NpBPDZ`cHnC_j~oW@1b(oL=|zrQ4X&Q(R6sl2 zkt*^zS2I}tSq&vbQuUBSErdIkoH7zSoY5`HSr@NmtKU&Hqc$e&%02-)cV@>~lOf{y zE&Clpow8%OH$f<`yk4q~Ga|g^nF@2rp5g?hB^%j}=?Zrp)mw}PVEpL;24@s)Bi0L9 z6W&}F(nIg&4s7V%^CZuxwNPYcny>49lo*i`(|YXh-s8Pls;O>>bj$ehlm6vw>YC*w zQkjj|o)u%?n0aDbvBtX@dfMQ{CRS4ob#}{2Wr&{uNP+ygfOW^XV)Si*b{7~#PboFr z6Faftew+$~p$2ezt;C&-SPAf=2@6wx*s&cqpomZ4lq55Gx+sxZINf(aYR)!pZc?&u zi7dc$kJdhRkLW=oEe$!+l6o&-N^%UN*eV)m*R3SE>^u~iB~i&Yo(KXyi%N4x5|unA znnd$MQ61L47mLcoX3LFQm)Pvd30Fn)Fn&Ee8jTBTz7~^$BBbQ$Lo2JLWKn&9HO*=% z`J>-k6gS-8bK(nvsff>&P~w1ZF&?p0T1|&g>d7+VNGf7InRi)+&y9&$XH07GRG^}> z%p;4QT#Jr_Cjmt?9Ruz_Dnb-hcXhErLQfc?1T`dex>p@^ z$@x|ZNaLMztrD;X2N62hDx*zg41sEsGDj~Kt4L7o$?w1I1{h2M3GMPTiAld#vjN#pwAeKT?ctqS=JDZR15fEZb33Dp;{9TRp&p zA7Dp}6o(VJL_nt!>g4S`#R0`E5;e7KRlqo$@rBlN0e=ExK^<@m*j&|R)I0Z?xp z01?*{5YQ_2L(m^Tuj40xsFVMSZ{ zuQ?inU(?9JB(D*V65;54QPGS9vr#sh)g}?n!X?s=nf^)kI?N0?)fj3+<#@73#sEh! zvzU6S$AnV9a?~r!^gJBy?`3UIgje;2UcF-;Wt%9U-mN*PY${-2SsYqH>!Ycn#O&g^ zPGiDgCM)0UlCnKxdZ~@WGSJ4daaOG3Qzd70=$z7xux?3nm4J?axX_3g>i4>xBF_}j zpwXdUp6dXFQK=_8?92ovNYx{-OlRR~f?MGDDT<6GI?M`bCWU-F#X^JX@EjREo$-c< z`p8nl)N-+tD%Yk&JkT`Y+6szw^yJ!qYWXkZUv~ElE&z@IQB{9p2zO=|It*Bl zR;A}vnJl3+@YzlsIW~};IDw!A?}ijP_DDA({Z4knCH_!1#`{E+Gg&pCO_r8tt$0uj;GIkGhD z5UGl}b`@GGR;psIRRv{>d~OKmO*7G@Aap=?(3=KdUv7wCv9m6O%!&0(M18Iwoqnuu zZo${+p%Lzdy>o#{y1X;{t&Rd2I_hzR5DrZP8gl^C$mEJENfV>KNSK-&faHiX0*+OvXpL zw|YQ(>kTNQbJ+o1X`%6#7(fl=iqOemO%o!;DezW+9er;ShqO)NkUS)AGZc{20B%=X zaEv8li(?D}7`93+(R@fW9|p67qTTp;fS)O11;uo^AH2JQ7{}VyuP1dz-z7&|C1+i7 zqE&LvB_~@Y=UsBDRdT^4E3J}?E;%zPv3*56%_{S7AOAf#X7=unZWO=Yl077x{{&yn zInfM#Qx8s1THc7+m@5u~&QaZSD%#t}78K0b+or{_|LC3QUaMT)gvOo|EZxuCU)Z5fygoNLV+2VKzYqQWNS zf@Y%?L*Rl&zempbL_MY}s5#43C^@6IPeFg0$<((~ zqC4SWXZEul@jJggX_?=lv2&UBEh=3`GpQ27p;(AB7#sh&f?1gkJom=Ap3Q6NT+ilB zN2os5mkt7QF<=y^)zUsXRol2BXe~TNqF5)OiWC~7&(1;(kf>kyO?Xt3H*X0Mo}>VK z7e6WDDRa9=6KHq9Krxy~RqdA3yo$^xSlHoaYV1W3RU>|gYPEspJ*w+{6xG{#9Avf3 z9^>1Q3-?HGi7-Cet>3NNg^DUFX1vsNMa4XkOt%7qhZqH6J*@@3gqRPnQmwccutsr- z&Yw(!h}dN8PEMqFTOIjiXI*vVgujhA+=oIPIZ6>=omfvDIa*gPMc@k6k&k|9>WHlT zwL0?QG*cb1i2M@N5lmrCrH9?8P)9!4n!X^c^`|dSS1sXcVf*aWk+YXkM;^a&b);3r zDs`l;0#^7+s3RCbjm0XdBW%o(Vh2@oI@mK(NAOHE96czo3H;G?%SEp3hhvX`y?SI#Qz>VX|5sX??It9cg_~J`;5$)%RsrM_9@?X#5Mu zyRrfiI-jXJk^tQPkLt*!>d4?9)seO82q>{Sg5ju9M=pr&LLK=NFF!7$j!5gM*Z8Z{ z5tNK8R7dRl_(yf*OIJs{9KqJ-K@4@|yrr?Fcv~I$Y_YC7f>n@jLmko92BacJK}nHw zgxgvh$4e&;#Q z%e`0kUg^=RW!bXN^B^0^SlA@CWL}!3a|eT&Oge`02T56Nvf4k0L|eo1VlgcPmta5y z5yV7El*H+}5QCLqgGiiKWO=Q*2_mB~PDg3o6{T^?WuhcX<1(7WoocA3>F4|X?ep?n zUCFX>GSjs{_@3wNbIyMG?ce+U?cY8XkhD7TRixRqdq+;T=Hn}AlG(Cax%pnuJ947+ z{fX#>)sbIm&F9OYj$A%t6Y59>?nWK)2gCOKOsFHR4~iF~j->g1+0~Jy78pO9)R85D z^Tnzose|8BN5Ta#;T^$>{+@Sa(mMi3td1N9|0?guap7I4BR_vNbwpann(7Ej#x<%V zj@bI1I`ZACBih~SCCO&7=BTDIA`{x`$Y<78M-CeSLLE60>c}ERs3V8hQb!i6%3p*! z^5O4J9bxIT)*SwAM+%d3G=F#M2y3r(r5BwxA=Ht7-T6CQthrpc)w1gUALR+E&d9XoQ$--bH!WQTAU;&3TK9XZt* zZ^1hvue1Jn9jK~0BUS_5MPf*i4TLznXH>t*+i`%3zxfI&09hkW`BHS$iQ+~w#dH%z zp`SzmnG_Qu$;IHU37_KLRCHievqTMcEbjAE!V9zq z)L}+yOFd?3jD1F_8NFAHZ^`3RF!SE*v$Y`ePPwXcEQM}qqDaizS+?N|GAs5-3CWdZ z8>Q$GC24WgOYAItdx@QBt)~a>n!Om1fHKRZe-+f`Bf7-B8k7U27Rq>izWmx3@S{W? zQ%2xW1Fl3Hvuy7dYA=b#P`|)(BQMmd&OFgar{sCbhp%Ps6pS(-!6?xW9@lMV?KU-M zS=-XDT?1LWN)1nNAXdexiX2w*w89Pqcf~ktSry}8pB#&zTh2esF@u?yM#qYTeW|tBdkdWhJ_WO)W8EL zHi}3Y)%GS%)e)W8uY9=m{o%k_;tyCLYvC;G&THdrwKQei1!uQa)S70$#$YYhZ=*-4 zeBM}*bwIR1g9O%7D5z1BRWePp!f6J;p+YpmN{r7{EuhY}rWTS534ymY)qs=@0tbc* z+mtcV1O;K4ptd6CD@9MVQ~A0S?XY(JimTA@+W1U{&MPAF ztk|aax{H$vX*IwPgR#0Unww^`%Bn*yp(2ewclR^^;Csl%o#lm{AS)AQbu2ocZeWQFM>BmUGAP~l-!fv1oPFmcT1&EMej zRG=IK5&J}jQ?U-kdZcVUj`fI5H44*JR0n(b9r2Q%~#;GD$rLEM*#Qw@o*uisEO)sU$Cx5^Lz%qfu$-@2?f~e{>c7oEX2g^>adWuTeiI26r>Uh5#l6oS4$8 z047H`I|FbPl++4fVgy237$(XEX_FMi6nAF3q*0!`x0p^lEa!q1|D8oQiIw>9yvBd` z08kCVD;2;BEllz~^6q$`G-n#+aFc6oa={h zRKm_my6(+>tjVn>xlZUiD)9^?j%p$fl!qRCPWx1n9{j_h1}h;VDlbvXumg+JPZSgUsu^ifdD3Vjnp2y!D>2|9vN2D={^pvG z5%3AH)P~rURDqvBmCOinp3nxX(t=1>MkxJ~sJP8BO2;EVL8c^&@+5$sPAtXYdDb51 z#9d(*FC20=NLxhd5@N64&?9l6ln^LcQz)^bltBD-$w`;MCF+tBE?H@n5SPkV=UOGi zu2OQgDG~cS1J#N(E|4$yl0rhy0Nr&dN7qY7_q^DqU?@_o~D#mutluPHd^f>ucAiVIpiOaZf5n};c0Hf!^+NGYr+ zS&d7K+UYYZu5=$*DU2X%=4!6A)UQK4S!-U+m3Yed!1@>DO7Uh7Yi@Q#tT_8HBCwGd zH%Koq&&|MIFO0!Qhccx}Y!ACPv82o{4GETpP%5vUNT)w;_D`@bU0=rAm`4ykB9nI$y$ikt+O8)l z>P6FFA;5^=kTFzzDX%&uwzQ)$w5@oxG`RU{+`1-hPV7R~N-^IsDDn~yf7a@DFsyms zOApIz^db!^R%5m&D}WsqY|iO*d;Ni=h18u1lfyQ=9$f3lWwdF7{I!3VIb`A0jFu;@-kCBSW~I;KBTka;h}(DYiH@DW275@!H&i%mq`e~ zaAtcOIaawSA2iN+zF;z|+N=rGz2_o5;8jV}PP=@!IllWGED$v^Y5K}*FL}(fLMhh;u6@G4Exm!-M76I5I!!XYlF~{^+AshO30xl zRCPP?<8(_Rr6W`hL-=Ip>5XoSw78n;iPx@xje+JsW!kbBi|KMcB5HD?@^Vx7*sf65 zWef;p6Hz_K5pCs63q|ZwiSaGLVH=_{wrdA$#U3M(a7XX#&8{!MZ5MgsqOPDk{5dM` z>OfZ}89;dfi1Tf6c$)P^GarND>9P6L9ZHG1q0$4$Jij}CvNs}=>K^U7d6k-i@x}M6 z=_|y@8bDGl_;!F_eBIRM<}6lHlS=3^J!{+fnyW_zMPBNg^)Cg*bV?ov=oK~6`V@~5 zJNyw$Ep$tBkv4dG7ZMrMz0ZroEj>b|*on-+iJzdX);l_`gc*QV*(HQtHO5^gu2%PH zHE^yd=0^w;lF`>i@-Zb{M%5J&wbs409|te6K&XCwXb~D!!q;k46%INNcgyR)+3qBqw_A!0BPZMs5qGp{qD+QF zYcm>*@^C^%F->hjIxfC<^S=Cyu6Q_4>$-(xvAP1TCv^o@r*s8SPw2{|oz#^XdrViR z>x8cC*Rr?f)z%=)>@>$zFHoz8k>=P?N4KF=XZEy-V=oZpTz1bgW}nXJCO;2O|76fh zf4!GUo`M-fD!ldckq~_~(q4sO?acrsjqlMmPT1ZZ+2cJr_~qJ0nw9%)wI>2?Qyrda zZKYzjaFZ;m8HO}rE;7H9q6q(~eE@41qL9zT z-Y;$XqC2Y@&uZqvD^`v26RI`AncuHKsZ&fhQMd>%>nqT1s0N5ZNuZj zkvg6mJS{;V!yk-u-n7eK^LPEdOc^p+Ijw}~k+g98y)Z3w`;_S_ZD76JIioFa=%eTX zGuAQ6Wo*WOfBQMXqfZ50Ko_H6=f`8EYz`!-o`sGJC3VsawPtac)tY4(Z2w^ut6 zc#0DNV7#Cc!EXv^D+A?RAu-2tKE4eMCjArnD$ZzWj|QA6gTLgn7=BO>7QLQ}GKgSJ zZ~O})_WI?=&6-57PS~Ne9OC4ArNQev)zvq;L{gTf^9q4Oo>F?pD z8@XWxRrO1bWWe1fM$CtGI*+rqV*ARQHC79)x7J9Aa?~AU?@OAjwGyi+6q+OINDm)Q zYSpSJa{xeM@%j2oMXrzNt1=D$DYCneub+PJ>7L{FB1t?9Sq?ZX zpJ#Mc8tcA<&P7sF)Rod>a^%5RJCZ z>PrIThX1+dkQYej?$_%VvC@{QPfc;WARqCZ!}`i+K889v;)ZsW6-7LfzpS!WW3!zD zTv{cE{SMyw>K#@407F(%7H01h*9BS;I8tgPj-msVt9(v@XHJcT5a%Ukw(csh6g1pL zDpR+WB7}TSx4^7#HE-|m>qdxtl(7W8W|q#?nf7+c)uLodq8AT`zYMk-f)heH_#q>rcw55{8MF&(e%N<7$hL+bLJ5AO_LIg5n%f$F$b9*YnjiMl zSq8$xVw=IWD3p9&e*Ai3L3bc0?0=xa#0PmzyQV=D(9wJ1(S%62!%+v-F$f$T%H4${ z%fT5+PXDTpLExA`zIG;YM#9fs0Syk}D9E#~sqrEvXJPQzQ`=NS`PGX(978sES> zbq260Zj{-_mCvU(id%i)N53F%(nV1eha8ZNwqJ~$jkaIxMJ(ukgzHS#g4KFm!5xx^ znFy(n<62A_WK$bD?GW_G(Q7!9(8Id?r^A<={%6W(AGCdbFV}CUc3SBEeY(8am)!`8fAvD%_7$ z(J|KL=iB$i!Sa{d_nh3@pyz=j3 zTi}I+dGwTov>-V@=3JKpWu5eUB^@Tq(Fj--oB&au2h!6?3>>E!wP0k_wZKI=4FSFy zSs47{3K`8vF~NxqEFYvpWqVqD8Q$a^fMjN-NX`CD&-;MjB z`Qg+9xqkH1he@EHDY>_lyK1gHOZrq*Fy?gH@+i1^@lv4gBKy58Z&kn|g56 zp&!h{^jpgAgIYp#`WWIgbPDVSl(DG?bu8?LVv3>d%eQD|Hi#>8$eN=$fD%8p92_1h zHaHJBRq$h48b3SEblm2YbYN?fS@~hwdcVv(#lU2I=`_zi4P*E(b-LXKI3%hQK|Bw# zNC99pO}q1z-ndI&4sz}jw88?$99I^rM%%dl28&i3N+^52OSXMw^PeJpKF%jb-jg;x z1tM!|bg=C%|GJ)E=FQ|&o1#fQ)qA%KO~|D-MRq^^x{d15tj8TnYGv0`4H$JCZW3Am zsQix(-jShf3D7z}m-eNaF@C?pVqH&pyRf8ts3fwWdvLe>5nYLISkje~upibHxM899 z#O1K8gA}$6FLi1`|vwZj-QEys(wQ9(uPFY_#DYB zqj8H*cT!&SA@3q47@J8ZJ!J;SKMu((5sAUPU2nQr4~kONdf)@L7BpAjQyOK~@&m7dM+j^-%I^j!)4C5*&wjwRYr1s_%dxocjl%0<* z{VX<@2M|5NDqcOrO*weqXg#J9t?rtw9NP63I2@O0mKlsBYl*EDkPZ~hhx_vj zV2^%s;K7Q2BFDyB@JcrjDWaR3#4O=j8b9Lg6I5bmyT07<=J{Qe>e=;dPq{0-4QYr$ z2wlY@#H1S02dib6e)K$N3%1z#GdlaE;^z{Nb#+s!olWwuo@2v15Pu9 z^iw=p1X}ZC$ugbo0JVb{7B9yhUDoLizo3gwci2XI;X0YWcm9dKb(Q(87%2R|Y*Gv)o z=&~s~j=YGNReI$qhM|hTUvs_OgD-GB)f~sGLa^Zg_H06L{-@-yJZ~?l*&REj2$=bG+43InI9qWOxPD(cL&zDNyZA^M%?%r?Ygc2)rVG_%BW1e%h+* z;vj$k@lVZ-8Z3ZH6Bd9EBGe7kh61z}7Q7IlLYr5|f(b&+;tcP=f(bs@fUl-*Lp)FC zFN#1Fh|`NKG$xrgxTE7W8@A108f;*+m+^$v*zjf&8dVsu4MlMEysuWHW#6Dik8Sh# zC@_#)s-6_-d25)%dxEqR!5A%&g<^W5PavqDI=l?MO+T-<1r^l!d>p~hlSF(LvXtUw z0R>w_5^_=BOhF{Agb8Sdx|EcLgq2{L?R2XZfmG5QlGXtB z0)!-OWRojn;LD+xZ_hMO1cS z&Q^k}Q^XkVEtTvg(1gE4+4`_lSakcWsNkw=ItO}Xg-yf;07_ofHX!{iU0m>!^$ zzdd?rYzx-@FiHLcr3Z|Vmxmr8tk#fgX7F9mL((;WS7edsVKjGx=m8Zem|>RAp5s`& zOsCGNbR9nr9MZ2{{E9;zB}|;co&|ld>Aum9BHNo4p;^9x=n)F<9NiSWaWr3f%TO|W z2HyHS%Q0Q%WppTqt+Fc^W)vs~lkWRiBUcx{|^SUJC2%dbH-D1Z4+b3l&{Cy7$d%w;UlzEI1EP5!o z;ChrZPPD3wGa-ZB~0#13NeZSP)=m?G-#T-46{-cG~m=@Fj_-0*t z<01t8kkjXERgEea))};CsqRVnpax02q@Sbv$FG$jY#fDUl@$58}4+Tq9a}o4~NrrLW%EhJSFHHvWMvS8%KGWJSFH)b8z4IOr9Lu<+U$f&K|l~2Q|ynGdU2lqNh_Qc56=;56^!l#S7rPjcrqRrR@if;-cU?>Ouy*sJbThdf)4s181sp=+A~ z?Ld!F3RZZjD3WqOz>k!JmgA>HTlSV{V);fm3`e)=sD^_do{rZ=F z8=1uhnRUTwIR^|Kbk<-0S{KcHvks!4i_0_@2HC@%s3W`;#>2^$_o07rc_S7Dmjf{G zjY*b59hCe7lg38GLBXNt7`*P@K#w?ISeJWjws7V!tU*#9KB{-^j?<+P68gHa+F#mvnx)E!FA#G3x3LU-SQD?)kW>AH9Rwrd_Ob046{-jN~ z^LGiBf|P0+vhZGgqbOT`zX5*+mwRw;aJdT)Fj4f{t%O~K>abCoOOWhFZx6A>vQe^H z-NYU};Mdluh>v9ly@3m+&plkQkASN}-0tLCs9jJfX_)?L5r_`lsQHn(?>mLp$AS=# z4(R0PPEn&AxN;?wn^!)1;8VYQt?0Q!abq5Hh4%<*{Y(hiX)5*kr0zgoBSD4ptYk%O zClnJnFJ$tulbdDsrC-Q9rW=Y7))}yl@RybbUBKT&7e0j?0l{VrWnH7GC}x@ItU6og3)f63D(^xi zl?_-zqI5v%cyNRIqn=LB3LVRi_HYoBti<^&PH19LxPFL{cZ%Fwt?po%f)TJ*FxqOu zkj|Nl9}Swh;bR?gztsVCTlKAy)Kk^$q49wC8UMulG_3atzylfA^ZqQ8fi9^CN5Lyj`44N~J1kJ_IiZ#F} zIr><}nrLXaC+G``lEl7C!;gQ(Z41TWM^RL!-vX$%qSMwV;q84JC4|er1xnv~dp2GE z(+~Z9>f1^g-7U|9Uc+DLGNOvRRfs*!j(#jC^V_Y`&-mcb@N?i6o35zS516x-oKQdE zyFx{1IC1W(jHgKv*9A|? zt$`<%RNN6$No>sO=EzfA3C98^Q2ClRBG6f~HQ~Zzgnd$K<(t*I&3v&C;RjOnw54sM1cTMG5%@aVj`DEeU^=D=9R!Lle-kSRfY*qo1GUHN z_hwnSfsbpXDT|;W3l#Z^%YTZJk!&l)F_!;h`yLVb<@Wuf%}rOT>iXeNcIYJWl?7|f zJ5WIA%I%3echhRK(_rj^6Kot!mBpyTe^yTT>J720=^l7FcXug2hpcHQ0l0lc1fh&d zZ{gU5mZBi&0w#ozkH>C4zmp%gqp~PS4tY`nG>zl}lPUAQE45ww z3%iVCU%p$v1iG%MJ0G6++~`;+W@C%`tHaglfoGrA=&|RmKo%qvK(b0p4U>cF_Hb00 zJqq#+2$Bj8pdgEB(rhtJnk}Y@*(x`t5m2!Mnbhs7QX3hrsEbyW6#aH1$XrINmi#J_ zMjE$~1tb#1renL|)etPZrNPN0F2I4+lnWqxZpSU>97)yqyPR2|oc;l;D$gTmUOA`DN=boKe=UFOk2?1m11!#jgH zEnAUBSq9Xhf-<<$`aghY-9VmuJp9RoMq-5tjm91L=N=j{W)wVEo7G#@dH6|Hz+Lk( zI-x(=ac^-SAyLeRSJu$%_?=8?D>fD__CH#vWM#N;kRhwI2KZHMt zr|@M>{)$2uPdU*lQ?z>OMfIMVkhgA;CBgDAfv@H)4NtjPxmw(P{Bn-siop<2JjqiQ zaT8vkQFVWXu&s)dhT9dT6*oli#PTRSn!Q`<%@KY&@)ls>+;g-DjyiriN*Cbp(<&=I zG=36uqR%ey(`$nGclgQXES0j0A$D%{%4hhAt*p{>{0s+Bd6u7YeAfWDl{`H#botE} zbp;?qxn7gHT+e9mQ`ZN_sjewYA51v^b_wKsJkqIfOifRPE;;Wxp!ac7pGNo z>Agu0itcb2kI@k%CUNL_(UUj0Jy_mO=$SI2;r=qBwB4LwrD8>&?8OUOw*GsKhD2~~ z(vUhJA;74~H!H6@SbiH}xI4@CWto{*`RCjxO;WWH{n3y7-(UQrul~6Mo%Q*2gFgPeQ+=La z{(1Si=N#y%?{ZW}E$IrWLj|f=0TOPfN6S+O%cW1F{xgxggK85an3wEapTuz&xkb#o}UAmzxD-?*=T&uTK~$R zLS`(>_KUG)+m-soXX_Vb8`9RfsS&O2r2+2I{-#G=CGF9#G2XE>3pj-Usvo1QawnX! z#YP!krNr{hJ6Ln03v00aN4mjW)>t80laOSeBtm+@icO(cYuO40Yz;taP(@d`f|*|p z3ySklkX~kMJZg`T4-S>nq8mM!0n-hP<}2t%xhLAf=y~oDr9xGI)IiL&nQrtzbhE0q zif;T^bQApJj5ca(-i!*J;bRfBln~<#DnVy>$E@D1sHueuD!gbUxHK4koJsdP=6zQK zoFNx5f=aSsj5muU)Rk-J=p1Y#O%3k^8 zlne?hJxJL6i772rhOiDH91FWuSH!!Uw;$;yd7Q9E9P^}9Ag;XGuJ}n*#uKKaQ^J2h z@AWtudLUzwFe93beJvRdXv?y>_~F8VjCxo^iZ%iiRx;d>b35 zKn_|ClgdJDJQ)5xs?h3YUWH~|lx3}mXN|#&mGNY10i9-XIfA1V{4ATa6e6H3wich4 zU2?Wna>^xVS|zM$^3`&yBBX|Sq4DE2Yy1gp!Ki3*A zpIHwh0zTbPt5=2n1YeDpdUYct({gJjEvsWKO9))W8eITQR2k~sgpH#}W*brC%? zlHMidG7PM?F~yhI51!g3DRymruD0JxmTG0G_q2SNOn0q@DyOa3vae=_$#2U(A2AoT z{=6e{6+B{=9LQD9Qy~!-=xNsTc+a5^v7APPeXtW|F%Zfw;`H-HMA(1+QRLBjq5yGq zF^}pkGgpC+T`3Lth_FsJi@h8v9Fmz)7!jY~?~sws*Hs{;DVvHrQL*QRx0tf$`!UJ8 zG%qhHqSt22#I}GeLL*Doks?Cs@4#uo;!;*cIQb_&=$Ni@WeNvB9G#8Q7sM#oQ;E6C zrq|Z)?-iF|^(Mfwh1Mk)wy8wBJ~4Xh=V$yJqqr*3=FJO`Dia5M>rK*i1>QGIc~hnL z4Nq39N)!OIs9n*_8V!UfCzBxF_^fyk(+=S zH{|B&7OxB}j6KE2kr4Fw?`S-q%2C5!%z$u;qycf+)gBY~+pBwqm3dg2A?$SiF0-lq zRaT&R@q!I{Hcqov@9on`)M;yO{wzlKyJK<>8yIY_UiCaCjzF*SFFy`Fe@oLPaPL&- z-j#$KyXxI?Y}XRay83s=PJeZ4_*3~Pq3p6&V566}N84Z?t!g0Dc{;+Gc%i4AhZ*^6 zjAHuR;HEH_5(3&PY)xIb*pvwM-lZ;-pZO$Re--c3lk!R3Ja%L`8$Pd<*@usDyPs!l zdM=;V&B>oh&z`w8-|(UC2U+G?>K+>ByRsqM^YijK2qhbST0a-jYdi51Jd%O(Tt2q7 z^?W|OxiVxRRh}GXtwfwPw`!J`$3Q%U5L}R&aLWrw&*j0kfB2UR}SxaQE5r8qCQ~Fjkt^db4aWm3N@^~GO zk&3`m6Qc%(41^XK6sxSbLCEgW5hsY&r<5Br-kw_ZrpB#WrgVxyU4z{xOx)3YWE+>W zy_^gvcQDLU>a%)$pK@MCj}hkal5(fIzwQMSoZ3Hdh+mw}!Dnwo%H)b;rO5;1p0X7Y zilG6=KfQBLsyZKasagOjGKxl>>ZR(cmtPBv>SH;y5x3(^q46b=SjZAGh1R#dfXJN) zQrcDpuThU8xv3&JM)>~}8$!D{_MCPI&??0-ONu<~#7v~;xwm7cns%$-Fl1`m6K|~# zBQrHBaQBoAl(8R!b?6G9`?>53Ck8Or5D=2(2!%x-kEgC!%MW$Xjx>CY%U8NA z0_@-|EWdT;Ge12QQz*Vtbm;%lUtb1zBsMm^p@l5+gT0C!Xgq{qs-fSi0b2+@KnZsdgm?*(Y z3p-OCO(74YW~8Iwj09X(Fsm88K4#Q;4vnFnQoS2w#6@4@D`k2p&2gI6ACpXrNp$NQ zn@L19z4|1s)A*Rgnf9Q&o}n3eAQF(*wSa6Y6_D4pfLu|3dVi+%z9&%c&rH5g|I@Ut zlen3&6m3lveV;aqM!b|qgbux7Arv4b?v-Yd=yY?3-f&_TDZb(?VrEnmFaw=1djwSJ z1h6SunVvVCp@6CfyRKYS#m<%k{o8N8_GhTg7mDG3_!b^D`nw(B>IlaP*yQL6d0^P2%& z>Lk`q6%R#B0t1qQihdEy2z>*$VMYuLl0q0!Nr@sRpbh3`4ea?$ zFD>Q-BJdKmf;xl8i|*qK#m62RZS;F^@(^4aFq}pCuJ{!!vQy3ik^a1_BFQpH+U+oF zYKIwVNu-cpglN{iHQO_SxdZS<_gX?oy;WQvwU}yHwQ3DqeS007?5QJ!94Vi#+qOR zbR(ArR_iZl9h9szB~l2^$yg8$(BV8D5E>#b)9m1atOzKA|gy z=}BET;h@r$Me0X%W%+MOSD=T!tLae<%Um^0qB{X^G+4++8&PJDvV5OOwH7bu72v9n zn*=lbDppG+ZLlQ9gxO>xoRc^pKrwAc;?K0Q-FUxJ(UV8)p7FFUNS`_mn%g&y`%-)6 zM^Y)g@{w6%L{chJ`;94GIyVnQ#@9>Il+%v7f4_9> z?L5JB(Sq#8N5?%7(nCn4kAb|RWh&Xz-K{NA&KQyrT$lQcimru3Jh%#6!u#XunGAYJ zM}x)(b#zABp6ziAB2tdsoGnQ{6|wQqmQ)NM-+Rnaz&6 z0)v`cMC0NCp??6aJW?B#9`8dC5}@6kKNx*`AfV~F?X{*|16}O!J#ClAv_tht@(g2`Bc$^9~;5=@$jM1lz7EA`BFKwJs}4fsR^U*Q}`)oL81V$NN8{&vNU!q@~- zZO@KR;$?!{LS@+we5mZjKpdHZ%&6QtqRVjWn2*YF9M+%%@N0$jpAAa8T9?msi(EwjeHjvc~ z;A`X=4S;*Ei-kqnsOkpAsGIbL!+#?X)lKP}cS%UW(NcTw7LvyxrD(k9#{XTYRzN0N zhm&UV`dZBK7cT<1Q3;Pm)C*CL*nF4p6gfWwaQHTCV*D2Mx5!1hTUADz0r*8 zVz+|(8mJ}+s+Dl(@U~S1ngW``H>;X+Kx;NXkTZY67_kvet>CnZ8oSQ&=0^DLxo}`X zIg;e9SG(^B;Vc$be*7mv%BNKy*n>As{e{P*=!{%UlV{}oYgIti`(@Ue;&JKlLL2a* zT(kh66cB`Fdn)9j!55W$Vs1ZtVy8c~96mAXRo~r-cJt!gR{qpwIrMlXbn8S?v4Q}C zbd&3@@~&CKS>;{(=Wok*e5fz)+R1*)yB1S#@0u|(ylX2$Sk1}!dR4N!S))p#GTXazcX)imB#Nld|| zdhvqkNIL4pRvB%Im6aEoGEu}zcYKqiZU{m$i1xTuHR=n#;Z4xJgwGGr3F<9_9ci`R%Fh~CbI>q%eC@-{SB zzn@&FezIhi9`%GThcR~P#Ps`Qm+i?fbjLT^u;~^zK02D2a|34>^=$G(o$-k0aZT>c zewTx5lMiuF`4Ic@Np$1`6TQH3r>BawZg-cZ+R67+_4%&69frUlIf1ItZ^A*NGkYYn zBv%HhXYaCe#kTT~*PcRwX`n6*5`g?cxC{SFH-T=WUj8V-efAe_Rr5MVOqzIZGqbOg zTPXcuRN5JypbGvEb;6Svwyffk;@lyn@tnaQxIf%YuAIE$WFeqD9st#pLT{q)6dMYLE>X1drAt0bn^x$Ny zln`My{3nSK>z>6{?juKjEp=G^SAIF3DTu(#1PCw80!Y#Mb3pYJ$*?k=c1(RYE$htL~4T@yR-6+S@XdJr}%E?PVJ6q0I z9%((>GwzjpIdEw{%Q}p)SH9+uaHV9^SvcisP;<1<8Qlar-l&sQJZJ1CI`sI$-*i4Q z+SvtKHmHWb?Dte}5p5Pb`6N($H13vnz6G$PqHg)xA8hUt9$+NwT*wyIEo8&rpznLS z+ZVF8(ImfyV-B>a8vVd{XK~Yy5ch6J=pEUoBvC%yul-y4RtR*X`T_#2Q-+-l?FoEV z9!0FTn1Po*f%aet?@J@EN)?MOWCr-{2Bh z_@RXMc&KAyWgUx`$P2*0?yM)aE6){fdzHSX{4=(Z%j{zY-;CPUrm^yqpYymmBqvBp zb<1IS84PWZ1%ohj%AeAgJsq#p`jUZO{-uY93)baQkEM?laF3N-!MG%JPy%ed)L zyW7;%v6H}RdPq|h8k&DqRaZ>S_1@TwUakVElyjqL>f110S67(Owd%X^s>LAT1``dG z>bv&pr@lKtJs^y?Ig|jY(3AJi@Y_5qBc%JAy=vMf+uCq1TNiPy(O|xt zw-o$6F_+LTu{)m6fS7o5&VI=xgUaugkur zpVW5=CGw1a-$B{yJI@GLq!_TJ)##Zdx(FT>s~ZC3f+fGy5>Qd}5wT?ShBOH3jd}U+ zs5d2j!cS~uEKgCwp0jFw_zs$Tedl!Q${D(HQq7-93Ih|zVD6*8YCXz z8mX&aatV#Jn>bAqkEJFQ6px{X#{^Z%w7(9thO17DVP}ki6kl~Qx81LX>jO_NrOA(PeOxxvSStQBt^7!3T--cIM;E~^;wDQ z8&G?*uXNxelNwytT*16y)p?PLUv#X!^+S8>Tb)|1z4bMi%e6NbC$@fqE>=3%uc#Lc z@`O5Q{jFbgaQBKufj?3fyK8B0uFn>1UDfewjA$KY<|Vhi+0S<><*n~^$(DF%ls9@{ z3Lz7j#%?>lx9tpbZ-_ht3-S zB_S%TR>ma>*(mv}ETNZ^<%)#BQNXq{I=@rA2t1S_2Y;2w7C7~rZ9I=+w_xISW1Tu| zk`~I^WmKUbLw`mAqgu;oTPqOD6|5C}`{KeVmG~KCq|iBGqJG+qy;JsqWY1+RwnA8l zd?^RFKv(n~HRacFSDE|~14f6VEf&D|F&z4daB1u_on$%mvTQBO!HiKX3d;eNesm)O zqvvG}F^$H0xXIQ7eleQV(+3*P;naL_6E=k0tb4OhbjAwguo;m`lNpij5>I3S zp}<^e*%6B!84^|=-jD6Tc@AN{d;qIrrwxfUmDYfD%aHKoNi4P`9xNogqQql~7m3H} zd;~KjmH%sBfPYEl_p<#dP^@Ay#o5^+nEWC8x5l$AXAp@o54P z)&)ih8TV!ff|B`FCJIj8oc}lZ@@Tzo_hRzp(SEz-W3;SA2es^tqWm(GvNubqm4HR4 zhi{Tg+qwgzCp@!J4_SJXh6+{GDkA2D7^aSXhgx|u@sw3QJq0@)%;K+zBnThTmKX8O zEK&%OPc0p{4dlCXTQp~QILBDI!~x@b1mENY9dD@j$=accb5rU)59R$_7fX+f_zpnw z`s@?@Dq_paC-t+6BjB7YFH~deIL-iLL10qUXR)q=ZF!2j+6Suq0>y^<*%|JL@T@qu zq7{7>RbD0j0HTHRI6gSt zL$9ML{Njtb7wRi)jjMXX_6SKZVMLb=+xX~xf_S9=*g{!kohN?@(IzZlvnoH-(HvUC zcUG5rMSmb8qj2(3=ySmew^vNZ-E^af|92Hxy{V*L(`G%E7zsQxTA<~i`#;l)#&r2d zk8)9ZZlY#ku(RdYR4^$2QWquM&tzsD;6gaV8@Lc@au12sdN|b-T`=6og++kzoUZlK zEuErlrnZT)wCsDfqcxUy!!xpOSREBx>r83xYJmp#{m*y@a~Q!5WCw3X|k)OD^OAbSj#_m8{*`axXt z+&wV5fm#?T@X|=%&V`ZQPm_R6e_2s~4Ws7Wv!s&Jl?AftNSmO%p%gqVtIBDFa&jbT zx?^s5n~qoAcJv5Q3Jk0&QuiSYT9b3*2r$wKm4|gDSmYsHA-qLh$zbyVF4(;9=K`8O z$c3XsAK-#(;N4tEWCI2WhWy=EaYKQtbJy#E7^NCh%pl`JN&X~-9#~gNhx7)Fn5A~+ z5G*w92*!+XfA=09NO)!?p82$F6M-U`EULOh-tnx&U`i!|!pZth0KhD%-d5$x@jn6Z z^6^hEdLFGK`6|zA(YAfINcRNagI1m}TIva-Xg!f_n z;)qg#Vi=-;X1o-9zJo#`r>oglJnPsasz~_saupKMDxkXQ`e`)QJQdV58rxnkZC2b@ zdezK~heOGlvt#4|Wzx+26Chpggi9z?Ac6yw>2DK)4iA+w^D1Ujc3=#Rbu?3Hrj=0I z0KowF*qg2rG%hf_kP->w#!%%^K~Foh#LykoVcp7sGdhV&7;0zaOTx_W4hCNq46YmQ zRZunH2}V?PioWf_eu-`u@Ync7NN>f)9Q866Ll$?23lDF%NeXTO93(&^AS@CFk_@#- zz?#MJy_QIrSqS;?0wO_(e+7|1%U=`i4a(oqAR$4>hUqxLIK?F&(Ul=Bk!~D3aTo6E%=4SjQ^)oC@ zQqcQ)G8kK306|ks*6HdEGy@8p-#9)&eV_nwnBEXuqqfO`RV?Rf!a&K$t|AOHo}++h zLJ}B^%#m9oov-+j5Eq8XPe}r{AJM@i4W6i^!DAEBz+AW%2Q`PT#6ew9iGwF?KLXwQ)g+H>TB z%jW2QwP@r?65)RpqqqS^F+Jax&p{osYBtFcy=LM8r#L-ET9L3hVxn%XSrKOwX_BfR zFjWDj5hjeEUR-8enCg! z@tY3_1>Ef-*#{07%&}w9PIDe&ON6b`vR-hgwX7zhRcfngYs=CKONdyN#FMba!lGL7 zwtdX^iE1uzR~uh));Cq@!=u{FCQ}AEdKObhLELA!YSDTuQ}N715O+8ecB3bTXFu0^ z48xUdQ%Cq#?*FJyrjr)owc}G3wAfFiKjZEh{AJh0(Jj}_YHd@dEZ+92UV184P}LjD z3KI13!p(l7P@TdDIbUf>!44Muwj8K_FXynoSLd%sj4gn2*X6{KKa^3}sZW*q2~4~e zglh>^kENCH*Ii}JLklE*TvVAcmy0?(;fnKWuxe=ae)?+eA-R`PB1f#fb6h-w*cu~< z3SzGC~4-yi?gL%uunIwT75{=fp3ja7SLo zW2V2HIhj0D@`_P%yj22jQbMF+^^Q>Nu=}t^SmqO-TAtjhY**B(V9GCcGJ&%CNA=x9 z>j#}~x0~hKI8ZGYJ%NR*wXC%A&cYX@qdjrbv{(!8u{hHy)55=&#hRxi>F`sm;)yjf zrbTK3)b;C-TW|PUs;H~PO|6gWdzK!0vtP_R`G@dt4ITE$m-1)P>`#7)3TB5tZF-h| z?0m50&$yV^=6J05S6J=Xbh}PWdH0?(_IOKbp_c#MMTp z{LWAET&Dlz=g(Hpzwrg0%W#@}K1`qgde!=K?dqfI-_kRDaOFc^Za0m`Bc7jloaZ

8XY!3|^N;VKdd(*`>k7g!pcETx&bX z{1PJwuW$WqaD;)n!Vw0h*f!i@xl`gHyteyA6h3z-Rq&jz$biL2Z;cM2ys(pUh@d9C z-Wt6(#jk@fe}ax9U?jqTy9mBpLER6MXLE9qn70aLH|!(vsRj#v=W`B`i*DQ-awa|m zAw^%3?V!l>7ez^WPuq$1^>^T<`?l>`w6Kb_Z*wx=^k&Psrarbpm`h@YPwflsvcRCc zJ8SP^n-vC03-@O_r8@{rEa)BOAN25`DO;m=rFj})k=9``)Mb^r4hKR2#wxQ93Xfr< zs&Xj|qi;UlGKea)U+ulL+hs5q+)r(W83-CwS}d{jZ=}LpYMXEF@TwW>^Be{vFngwT zQMchRm@qUo)6>8Yy;3*m!&0xSa9C*2_k?ZS+-VxfCy{KNZhwG1;sfB>Z_t;Sgf$m1 z)cU_QdS@60gEK=P;JnYiJqr}KMh~XKU$;OKpxKw^Bej^X%CJxrP545JPWWfx-FWr3 z6x>3q-f8=xlN4EIz#l#FNK*wJ^poS^bj@H}s3d0+>O*8IDjFLjDrr-D@IfEe&5G|YCYrzoGW9FA z99yGrCH{K_r{tSZ@o{GIh@w*hqbDR{aXl%61J@HWU2;9%ut1gIDKZDvgui3vifxyPzQSQr^rS^wPdX z!)$J7!S3h2u!!K>eI%CW*tq)O19ZZDsnbG$`ri0iM5`6-nPTwFHhT4ht(k~Zg5|8Y zviNY6JJHf37OuYGd;z~=;5cp(R1E?^h7}ou46DipnM4vkF4YFV57-As_<+_cnF+@4 zV#C%kiwciW;iZOHB^}cig)-yG{*1@VjMk!}=kF^WK*srIzV4>vtg?t@40XS3T?p(#1aKLF6UuE#Anxll2LgvU zg>$tN;Mi(m&3#gvFi;ubbbdUk^j)gv-MmhH6j7SMxu$66ht(Q7bx>EDd_Wm#@_s$j zzK8UDju}*t{BxQ?v~HbL7Usgbhy9HFa-!(4yePa;t$dtMc5HPPk*6pwV})p(ke=*LqM7pWRgsekl>-dvKq-L1@x zUGl$_2*a1(7u_c^e!p$)FLB8uDr0M;lU!&kz~)PvRKU>qMjr?i1qkj?1JoI{ zSHU4@`{xtS8I2^9Gr;JSW%nfcv~|;+B#G)yC3$NJNj|Cagce()-%B9hEK2R{C6M31 zG(23OMi%3_DJn>AmR^CH$Zb4&y%tzQBw$N7iW!ey2jTIg_BgexURCl5Rl@bS?+3j% zz*9l4fWTdAf=KNYq&6O%Dh7r%O&-}($sDg0x9E!@+T7OY@siwH#!xxqPvxH6f*J<) z0}ao;_Xi;g9KAJb`gp)LjL=D>@G>57s_uHq=!^68E_^QNIVc^!5B1Z#15lL{VbY7v zwG_shaez>o@Fqmzbe9r19}d7dqF&jOt7_aL$T; zEH9Bc>ky@!!p~CVDNR;OXvxnEP+5anc~xYr@ZRRN@lIxeaR?h!@lM6cLcR_SgKN^9 zL)J87&XQ-$BY@=h)+bLT&&Xwlb8HMpAF|<)^PlQDnB>D@@~GJTMX?FZj~E`xAo-n| zaIq#)Tk?y^F~wA}dA_pbV)2>0q6fx#`c)`%vBsb@Kbzy%HkG^PKk!9Q=)}(&MX9(R4Jhy!sy{jkXbeu0n zUsm8v7*IDR1QrHFGAS zX;@diC^sBvq8H_A653!<&QR#uhfU@J0Sn}ipjOma&{q@8yyQq-lFF`;-Sg_DvTHa+ zQB+k@*){A=$3}{rlM|wtQdD0dmC2pLq%qPe0W7=b;k@MqyDUg(S1*$p1m`N5OjO#a z<5kOKp_w&-jK&<)K+)PhK@6w6l8~Pg{s=Xe2x5PtC>Bpc5EF4%)H12&XqqOB8Ii_s z8I15$>@TIefGOuydA~4b8r-tc8}mcZd~qpkK}PIE1_p+yiKGoCr9DF@iE=@H6B3x= zu1}P+4`|+U(M_YjTy!%9#fxsnpQ(F*=tkJDhQo=`KI1KF(Yv0wW){oY{ zf3)ZqqMP+e$~Q7bTyUiCmTLX^<3Ib3p%ql?;@x+kTJIOn`~RhC9eV!kRjnZhM$G>a zsn#^PkD{|3r=;iyHG>9F^mjc?ik=W%(@RdCnj4)vRGYHz4O9M*D(v^ciGY>E#e}Z=DS1E-lr`EqE|HLotDJV7xeCrI(wE)Cnd~TB~-7px$Q;1`*ZT zC_3#c33OIUgz)9Iu?h5Yi$sj<$sUj5`!_Py-U2Gcp{bykl=@Qzm9{TJwbC0p%k>7D zQ3z`$!HsymK?=@@)kw$v@uDW%w_H=loFqwXZJifAwR250axKZ1F>XCGU;pIq-v7D7iG{JP>?LHNe5+`^`FSweyCR=#76!@Hqw&!by^lJIo2RHD%Zte^F1nsq4q)D)+?)k$?_}Ndg%#^02zm%UX{hy zBt$6^0eB@_Dqw^N*oT&V7GE7Q6xvf0E1||x5WK~gK_4^iQBTI|VTF`xiJ{+=cemWwjAC#`YJk)lwyy_c zGZpNkuQEEzl%%2;bft?c8lmZ-aZ2Rh@1hafhWzOoq3P^FI$Ic_OXD+57sphfgOXGJ z#9&7G@1CCK6A$8(Qb1O~T$^RaAkWw6>Q49rg!J`+m9{GDbWNq9GeSdQghxXyuwb25 zk%WHCM$JO)pUg@;NHv>CMM z*pJs#9|pQGVcU0}wf=~7L)%Zt+;~mNSOt|kLy=-Qn9E4H3vfO2>=eW3itLn#!UbQe z4cqO0*j}LqUWS>jHD+q2&FR^amrj?E^1M{d&1GtQTDjIIEOfPTkvyOkF zUq5^KX8`MWjeq)8JZx3QKaKHxH~A+kss97`r&->fA^xciNqw3odzgzg+-;Dp0ea>O zo*w&DRAM9Q!Dwi`xDxxc5xcq4O1|Hd;hSlh6j8XRH$0o>>erb%M0;z=u$izxA>)#p zho&~%zP_bA)~WC$fFH_|cu`jv?FC)owC8n2=zCIER{qa%#igzU%w`W5X!sVXP$p-e zOZ`fh$?AdYosr{=yCi3^`qGXi|u3Fi+Y}u8fcbSIiHOp0bA=~{I-y5 za!yu(C=<(*n9Q-oXihcfH!=T{+80t>|T=5>oaG<+aRfcC2MHw)P zW!@0Bj<+oJ%I;oG@l@0KY<$CkyXuh6*Hr)rZr8)ZaklAewqKg|P14b{CUT)YX`xmk zoo<_^^3wZDja*yNsj4MyI|d_AFxdLqciMf+cEhx(6b&)MdCBH8=&)@7W~8XHaO zmdH7wiOO~zx#^)xaAvG@2@sA46e=EU=-TDR%$DCdQjCw+>xzzO4lrGpc0@yn?1xwpt~l7|5AIs&8L&3c+43fAT4*ZLhPw%d1EgoY9rq<%lHR z^Asv7_~Zkf#Mn5V{1n3CLaZ%#^j|#VAXybVM-Pq7a6yiV4o_0)T?={MiA)jIauvqGo^8~-H%)t+d3M|dAcv#?z z+)Y}ndQMpyP}J$NsN+{(6fA5&Q5VXh2v>HMjl%vjpri-?wCLZ}mjpquxL%5F##9o} zd?YzwqmXDJn4G}3SQf9$zNI?HU>W$d2SM8m`vHmAGN8?8%R;Zd&GK|yKDrN{dFs7~ z+}2BilBlDHo<>RVdV?dqSPDj=SPhI%EHC{jKvCX!ie7N#dMo3=I6GT&Bo==NFrvei8s# zO$@$Sb-G#HuS`D!aU6x!Jpq8-D)$9lTGRplJ;{Cd>slr&$*6K(QkHIC&b@!;bBg-a z$~-`_8*%T^g-x_7^TdaJPEog7&i5+I*ub2kUgXsLQSBd6&Qt(Z=i8OD9o($@yC`x&&Z6P(^f}*U zMOz8()CoRb1|1qM3Q+s>u)Y~}N3P~mO=>IM_v9nK*7~rXAW6fjIa|wl+E-G~c`oGC zl&s~vsGO_&5#X$q>8GMX@GyrqFsU*{hEi1ai(g)hB#SylaqaxeI_g^43REh{pQ0cT z;fuNqXNraD&g*{ei~MN34Q31eNf_0=kl6eWm2O{FvJZwDySLK<*L44C7rLP zS1S$`)4I5p(|c`QJQ^Ec)ty+qX03@y`~O@teY4BueVVvm50C5RmYuji2#*`(b(*-Z zg~utaeJ1Wd{)PYchEW!p6ZhWm_&hD7CGJzxeO-mr@!hmuae(b;{LDjI4X52aqkI_ zQ(7xZ+~eh=@zT@b@l&=LI&ts&nlI}mHV537!sGW#RRJ{!SfM@fl5-gzkJAuuq<%4) zzX6h)l+8z?g>Q)d?=zrzsc18}oRLF>T4F)WogIo)XH<&XYTLa%?}<9sDuF^l@5UsTXs!UqMu4L~f3f+@!O;skH8^TZgo16;&?~~R z=*zO+z9o*^_qr70*y7JGMm;1JNnnN@vI7YteONqsGyBn5C3_Q_XqZ-kUyTAgNVj`h-N@072n+2Xq({0bV-y7#$_!9s88x@i^)9%ia_l$ zfJBNm{26i(^rZl1{fZRgdp*n*BGLeCw~aA+zD#dh-{#%gM>u@djoQNQue zYgYU(yzfvL0qXFdp-?KwXUFf3*VX>(d#I%ky!DwA-lgGvgKKkLtD`kt`aD6Obzm%W zF-vWUKv4(MF5uFHgv?sN0UV7pdA&eajjImKPGABn37mtI_{`$DSCQGZRkAqp)np!3 zW?$EUR`)l5_{}7>4O&2_^YzAVcwy2g;=`C)%h8lG^q# zOVQfqYUMQh%W3wP)3kEr8^#o-9NTO_Y|K#3@KY;ixGZPbw`Vex!w&nW(w;_H4mdz0 z)ZNUq(cL(hK~p%ykUIm^E+{-+3g-z0I`^nWwq!Np+xGO^_rAf+?K^s}CNi_f?~>9x zKr?4yF}Zd{3t>5&OhMwVTcQb`8k~NG*EvsJyyh&VPCd)&B1`=n8gYhdNB6ih{=<|H zX?n-D7F(0P{cFMmkr@zxLF-8##RlJ$unZ=+1!OdTlql7y^4QLZp*_A!MZJ2=7`5^$-JE-0VQ$4WjO73UDwn zg%Ko#e1yeOBgaO%+ai37meDul4yzXM^AY^b4Ad5ylLn>kaKWb-Ar`h={02TqDZ7K* zLAVF8L&zg@*dz@ZW~6Iii_l#lYPkjK1R~gJI>L72n3PlSN^$=LwcrJKbaEI1w*9&6 zF7X&p)?y%P)G1ZcY=wPe;zx1VGSaPz;$Ef`~;?8LEYkrLpZHDS3WEn>)ByWK(mvY{X@Px%Es^Vd~x zD_I`G=)?E2fhVTLsc7pzGp(hsHs*vWF;QlRmO~#p{sYAI+x5*4SYvRF)MpkcfQn#e zUfMJvOfd1a3xsMqg(2eV^S6$n$RJi>Itz!fwjn}QQO%+#hQi#im}O-toJ5dQ2s24i z2yn8fI<(BfE2DiSHzIAMh%$_+-}c%xC>TC$jWiz(wQeA=0~vl40s_5j?aqdFk&x(k zIbqJ$h+~*`f{C1wWBFe%x;8{sXr^UMEo0NI-p#B(AMMmPY59%M!-SFeyx2BZ%oXy}}tm8}FkhS{hbFt3~r8;j`OenQC zu)(~a5jINe3vpvgKTQ!|AHG3YafK+j}}e`_Valg&Zp05=Iu$37(w>V`pN38HD98Qmzm&kV7W zG&#Xkb)0cmNNX7k4W28Oq`vX}Emupx0EgCms}?MQQ_&XGjG#$l{X+WEqCjqDXlMuv zvpHv{;ISk^;f>QArjpP#b7caP3{N`OFqrz#ul$G{+p^Dfeo*Kg;ugzDKm9m_qoHw! zesum-nBwv$L){?>Xb`^LfZ3~TWUN3czPb) zMG%5=rfDpVEpeMT!o<`Fr>z)ZmUk97@OHIVs)Vm5Q@!4+1}80BOQFm1A88irCp1fL z250vcU;aJsMV9HF%%P$&YUrkw+N7Yk zeGO22Jh!N^!UzzOIk4apmj7E}KK(TZLCcIcu8UmdGDTY?KSsEl2ZL8sghFclb1 zd}Kt`IDkE25Va8?V<%F>xCyeeFKFjg6u}_2`dQ=)3GfI4by$uBc9I_lP4w- z>q7s5%4Bke$D;PX1ZD^u3S~1(wNw_({LV*y;lDkyZ}D^Qx!1zv&;0&d-hc6L4u9!4 z_dwk>E25eA{oP+4c<=omo&PsJ!^OY*_}}0Ez=syTUm3nv3s{2F*2vF!xA;D4ZFWCl zo`kXcs2&?Ub~=BW6#Rsa>1>chbEM&w9VQI&pXQ28LXrc~lF(y;J-3Chz}hcQg*YNG z#&vO|i8!JT%60?4F%x6$Yt%KL-{gu0!EU6v)iPjn=r6FWuV{cTqGoa-E>Wkak%RjH z2WEzhE^+rQG<<8+#@^GAO2(^(vT^bvG*-|;*lTQuYo)hYtQgUHX|;TdPXuw|i zj?cNYHz3%^>(C#b2f4y*?@kC@0hYPt*r{IwgoGH{88KAv@WK zQ@y0B;^tc{z$Bc&?(RV~#R{64)fD${j;_JNls9LUIcwVBVDCoU}3{Hk6AS9&|fzq8B9Y$Dek~w4tLQ3o&xc3d{)%U$+zCDX2jO!cms;6k^3P+A{s820(TbbManX%$v1PcAJ)?yW* z_0V4=1!|T-DzsE<522;t2H&{7YUy#CJQ72PJsTR9Ln>q7p-LC<67`%$=9I`Ah2d40 z-C*XkMX7p2R?r^lM&1&}hq>+QV*s6Tt`yXh6!?=k>Mta+TiLl(qX-B(O-Lp9%8-;& z4KfWaifGPCgjc;1iWrC>46Bgq@SeJ@oTTdroI}H|%ha>HZ8qc7mJx@_*v-IoLc& z@CHUTmObI>u9w|pqDR69{E$d%u@D2UDqI9tLT5!TN>HgE>YH`F=r;`vMNy7SnY@J< zngG}Goc@;*?>knfNuy7NCV8uEL6fx5)kl-0A{8`=5nM`>#)|xfuCtUTttv7UB&e*f zNbp6}XcC@tqDhPoy%i}z?ABdm0<_R8MzU3s&O_!JW$Yo8A51_O%VI!Ez)S?gsPlZ} zS~6h6*(pGtb7=)tjPYI z;gT8++|NgaEU@=y)R9s3-XsVCz^BOpTqEKkwfAA=!#CVZP+|h2 z|B*Yvs>GvS^mWH-_wOg|B^2R(;9g;O5>fbuv`Ox6=E}L5tot0Na0ixfJR~k+zpJjE z-X9=ID!a23rG?kpSTn<%H9K~21* zCQ1OLiH#*q{Db~Eukqa{ z@68)thC>Ac81yia6qhcS;y8h{l;RNgwlnMM6Tgz;SU9tZuT?jp4#f_Z;$%-Lq_}?p zv^4SgR%61?ve8KfjE>v`Hro*GPfKG2IpXdI2^R^1^Or^4!-;4b<)alv-A5GN z#KyB18(KY<gEz-#@z?aQ8oDD<(hs* zIrFBiOK5=%Vl3Ioj!Zm7VNO4^#l4wg(mg-96G|=~C7wT_a7$5cq`lF&L|LeV;L74lib2DMJpE$+Ub zAu8&;Z7i(-L*uMzBHfWYt1jw?8flQXL~!TgUB=3)A~+a9dF?Af-|jG2>E4%R@Ab2! zEZVZF!!SUr{4mhGpVPR+?u|R$$&WuCAv@t{A0VB>UU`-7*`3?YS)paoUxA&5MOh-+ z;MospMhZ#vj0d{h?)-+_3x!3KKH3mK;bGKhlUs}Ir=#?8uX{`xyc2U~G6{&BGK}d1 zK?E{uyxfnw7*N)jGNXYa=O!>5iW1@F1+B##%3B^)O;Qw&C_|_=+AgmLt@3fPHf@wg z^Ww*VLavX6EzCFUi%32+^W{@eOLaN+p}MKZKSl1ehCx4k27YqcX!t46O5}jMQbcYh z9(91$=;KK+gchrzUS{CIMv(T{>(09qo0yVOXaPebjF?MUuHN8o;Fbeshwk8kTP$*T zl>FN~ncahf6DS++o^?Oq7uI!nZqc`5elsybi_tx4XyYgw-dSn11Z7v65Q#eK6iM+;w|6DqC|hw?pdyu~~J=kfph%oJ!P+u?d^8M;a&$ z*h0qvmxLDjFNuZ3NuY>}s0NI5pa(RI%%qNX{-=2KUUwYq6(E7JTjbt6#J~s;NLDsT z6WtM(2_ZlyK!$>irr6L=aB2%w{M^_JX3DiZs(%5JMSAZ{Ox`SY6lgBU{qA{ zA0v%S7~>^WQp;=ldsb1(Mnx$hZld9a1Iq{{2*DfSdq1JXB~l2xGF2=-G^#j=riuex z^pko!Bnfjv_dO^tP!qdJpbd7DIw+CdGRfo?HaB+h~wjl&&N8ABkib=DFL1MnsFc%tJZ85^9MjaK8l zRnTgAh6P%U)0&h@Xm#XiHDC&~x>b^C(X!avh$0542`)3{Ey(h2bFa0;befLEqDfF# z`5|(_WGe4>(9Kw4N?19`Z!rRr7G?s!0gB>5*vm?4Z8hFT-(ZzJY<4tC_AVLY5OTz) z>2ARD=4=+-F;#TFkQZcdN%!Q@o*Y3JW}+C3@KmI>-8o|1$6>IlONU77D!ew? zBR7_7;~NIHCT>XVGoC7DprX3J!U|ybSH+hwLV0RIaofG6%M&y;Krk#A9b9$C zB>`NlXs8jod@#Xutm3U>{cTFb$D>LR94aKvUaKY<1S%kuZ|9FjN-_K^zkchO}V7 zIrE;MbJ5~HzHYkE$^t-ve>kxa``%LuFN%IP$y1IaM?0k``M)UcU)`_4R` z(oB^yZ5UP|mKL}x%!ck8S82??Qg&_J=Y)00FkoFWUE-bjo%tchS(7nlws>)0k3VO6 zS6U5oUEUX%nOeo*_R0GozL)s~W(>i7g9|9j!9{Tb-~HfnYXAfQ#f0?Ndao4ey;1O( zTwE&9Xvzpgx}ZB^b`6*?WTd-iT5>9(B4lS0T0z?)ute-oWas61gajw)pZ0RlNv6jr z>mUhQj1o~r`Mr@a+8cG}C17yhX1jv!Athc3a~H(w^dn-W`Om*QRF=9@@LL+~`EANT zcj2*Zomj>vp2bQMxl|N!D8ojUpBsr-lRsr8SSYqnTStS}wW+ z&80Jj-CTuLC9+?JB5(H+t5#Gh?qB2oVSPz0l4!J~Zf&+HYGq4AO?nvammY=(Ne|?q z*ElbGu9~l!b=M*aY4nj=7&62askIs*&qK1|9k);AW8~t^HBW|{|&+D15@>C{kn;^W|w!eF{%x*O4*;AtoJ zSbl}Aj8aeqlOz2Gr*u>-$eN4GW-a+6vxGGEa>Cqj$#BReObRgmpe!lm_A^>3%xJK< zM!1*G=o-1c+>EwOSr&_Bl$vZtQ@qHvuoT=k?q_EXF^DoYjbJ?@$c)AVfH5AXH673Lm zd6lCj9MqDi!9O_#z05DmElw7l=udRGe1(dj)hm!`05rJ1h>-)>27a|mfcbcj*GqlRK+{>R4MrX| zHnmvj?Vnm~pYh0m6~^D7Mi^MtMo6)An59!oOM%9KZ6^2GuWImC2LrG}ezW5gf>nTw zr2&XY5@G->qRkLv9BJ}MD3>Zk0+XjGkQ|MbxuWFSAo5&p4$*p1VlJZ;Z^#FlC^0k} zHV~`~g5u@r#OaSi;wA4X>sdWWbk>8e<(nt^@r1XP>SB1 z)x)XqplkW&Nj;niZ*(oQUC_h1@J81%+a*1m4{vlWv(1a|Ukq<_Ewk;_n>l{e99_$7 z59(ndywSDHc0dpN!W&)7Y!B&Se|V#7neDJ14u&_nmf0TD!=dm-*D~8tJvOJ`iqC`KbGkL*NI};^L8bFkY z5G6$UM9Q84dMBHUC#qhkY+%y)PPqr7EH+oIig*4-Hupl#inQyjAjO?R0xBh}g3-to z*A>DU>M{K_3rGV}npPGN`S~AN(Phe<3C_i6VXT5lEW zMzN(7j{j?Q-kbVW%xP8;>INuvcx$9SkK=tQpE-JiYy)?w{H@pGfcN9lCAA`k&)|sz zNCT1gnUSn{jOQ&;bW=oo-O=hHnRyT)brHWpEiFI-ka`?PYX?WeO~j8k2^QVo$G6yv zn~kDjB<`)ezzdN(E!}UkJ1ysDb|)`^Nn_ia6;rJT^jXP}uFG{49|zOlw??tvsKyXZ zgF=sG0{zv9^I)In?C8cq@>vJ93Zx-^DXtr({>XzAb8%t^42|U@ed(On}QJ zC)pjN|1Ak^k_5{a3>x<|b|Q+Th9`DlcZR_dPxiIu$o>5!x!d2}bu zD;1KE$RmLSP(+hTcO|Lxld9^3D31nm5fv32RPGEaC;~nZoMA@BLB$bKXBffxpg3M< zM28u@Gh7E})bWmJ?)SI$In~wO2_ndy`QLxw^f~*S{aAbLwbxpEt+jVy)qR*IC?&h( zp)|&vrnf@JvJesqWnS$lM1-~0-rTbQ3XK!I!(6jkgEh9jk?2HLj^E|@tme8clHk&vDk<*_tzd{aTgA?ku|vhEh3G{y8LHAL zQIEFKlIc&}4Y27)g(r29H}p|x5iVHO1R9-86@3YNlG-Nzz(iqO+%`a%o&ca+zdmx; zN?nL?uPrK%?nEBr2m~1+)S9M>etKAi)h{b-zvCGN+WHoc6xvT&`||bi%k0(gBUTDF z0dlt!IO7O1&C-^(o8Ars6ItB#m{AA_ORj;8T$sXyx3qeYOx8ZnGeo7_`8}7Uqq_;L zDlW=0+cafAm*~e@0i~&>TtLW(jYzW$z9K?}Nc!VkY%F7J%(ipb444nRpc+PEJ4bYO zj(PawDW*Pqu5#Nv3L+Ju1#ijS4hP9C&fWIkqbR_dZ77F1d+kQpin_+hZBg`AAnLtQ zrN0ce6oMcbiD4>2$b76-soZ=J(#oAUg2aT0$jn^B`&JFKjWvIAZ)5UleaZBi52Xeo zC%UK;1Be_HZ`7FSgL1k_YDA#GOt2!Qg8s`KFKUyGDw=bWr0_}Fv|0CfJnLvoQ!D!U z?A#;9HbhGr3o*n5u~G>(k=7H|;L&V?Jf}vV*za*O<1Lcd zn5ywpiEIPefNz($Db``5#vfzkhKh4F~)apEY@u?t%X11VXdt|yKV){zgs z8cbICJ1tWe!DPLcCW)?2@3nzue$;yf7pwO)Yzl)2MHv?ndy`UxX+oduEt(w65GVv0w$|c4b+=qb-rZXpG$97JtEn?q-h`3MRe#mG1(|>ACjQ ziN<0=!;Y@lb1z_K5gX6x>98b|qka05S(&_eoX8{9+aU7kJ4%N?hW`;-@- z>Dlx6>g3TCm)nNQr5@XKFcR;pe(*2PX33)uiObh#7xElQu*-2}<>aa~YSb!HT-L4X zvnMDY3eOQfH`aW%&41)|mRxnlXe;{~BRW-iH9?Bj$do*3t7mW4-TUnhaYpz4>~WF- zfYsEZ05G2saE|+I)W1fY>f?|53&f2ivmz}$d(8nd0EG}nO~2d@GGi{Ya)0%C z2##$k%q=pabk8Kav;u}{8ky0=V5#a7Hcep5eM<$TH9y2d)3<`$_gxJh94q&nd)I6Y zFZCKlS7!_T)8K}4bIcD5Q=_F86q5Nwh(+9OR_^J0sn=%L90!FKa?snX+_&__*K_nG z+w232SvmX{4;TLShrS5xlXe@-6%zd1y^onZl3qY{^PpHSyT+~BolG-qPZBM6+^P8_ zR6KKsn^}gGdwFf59*N4C8wX^e$-%q9uPEN_)%^R4Xey>`%p=eyK@U)^Eoi9c$2P=VF)dyx1YD>SN zb|l;qC~CNkFxy1L3ne+=D+XBJX$S6jZ>{#zIL1rk%dbRKy9;(=xP*6Cvm2X6)$`JE z5LWvhPVTct#!*pCS1k|))GP{4L$29;B^%o|m~a|>R#L!Pb2w5=#;~VxO0g%^|GX6L z>`e)0wqQ~uYZX04k}1g{q*8Qvl8(TTaQ+Qn;4#=pa&R6^<2r=1sV`Snf8JSW08;!w z?%ovL=h&T?xxKc73$mx64l4wwDHkxB28lTBDmV?LB_%Yxs>JR20_Bt-Zi&;2Two58 ziO&=YMCZh80QGtjO`Bwz2o&K2=@D;i3-K6cmw8vRUMVkw5`VK;6+>a7(2?EN-`+c zYS>N$ZYGn+xF9j#VcWNEjzf-Y0&<2)z0^!*TB64=XvWEOlX#*pn8jjv+;2P-opOTc zkXnX#z>wr53i&}kb^V+wZHiH&&|t4+0?9oO^KJUR)>(wtYOEQOgbj)EH2ompC8Ge1 zg)ZiMYKpJe#x66DM>oXuc#%0%bn`i(5kf0^))-FJlgf2RG^!5W($9JOk+k|?6k3ZxT~EuR#$V{SbfQIy3@wUX{U|x z<2@WMru=r=7@Lyqv@xjDlxG>cn_Ak;Z&Jlc*q&Os}ctZs!QiPh;~7-$8bj|mp! zKZn~`yUZQv5UESExizqOM6&j|!Jos#Jk1}z^1%BB%~^(qgHfpw?xPq0MyBbXF$rku znO;PF_B=(JC1}dd3klfwP5>Yo^(L{#ny5o<5eQ$n=C#@|?HfE%BB)IystEumv{+oC zE)s5zRCETi)tZVcR8A3%onIKqHo5@D<&40Ns{k6{5vq6(8wg>zVlWa|2B#gJ1YG;5 zOW^5A{tQ*iL~~038UQ~{&=0p+&7Pnz&aDj`sFgA)$eRM3$jcepqn`uYd;*R7s1<~i zL&HvR4dtN~8!B|csHut7SOWmLN!yats#O)i<0?GjhwR3x%I@^-#=TBurz!EuM8w)b zkXRLaV8l`8aFf#PSeWBKC#eV0FP(4dxi33k6nOb|^r&+wBw1Fnl=TsP2NT&bzuLT9 zI#P@cwPD~0-jk+4)O5_a0f7p{5FIBlt(<{%h9DkdV-{mAxsu8~`cX+HX+Ta!X)Vt( z?14|fr)A9kTEH2LNSraGYpkEy&Q!J^wLsvu!U}Ssbe$T=BmbG#41~=AgCwn$(@FMn zzSz@%SUq42C#clz02*K>vFzGpw36J{OgBUXd>T_sAAc>{8Qc6%+*;16Q#33$>D4!3?%WJy~G;6 zL~b%FK=g;26Ldq*3*2-d_|ud?n$Zr^q!T zOg%*$7{?OeyayhbRsbvJB<4zp&d?|$%KiAu{E$Z@AR@JW=Za;S+eGt`BgybKUgL!7 zumD+gQvajsc(m$>Bjc=Yb%T1u8wi7(1y7CkNl?&faS^(yK)BXyFeJ-45muKc3}Z4( z+loc8S#_BE)|XWyVFpna(BDh3=#r+7tXphiP((1l1)rLQiZ_Hl zi)sz3UN>iQOF2|U@*zv0KH|VxRy4KA!;6HIbcjMpIy;0q0ezCeJxkKnTfS)B7QIHw zH7XNSDfXV;+mek1QV7zja*RZcgv+8(#M$T-VQ`XgX(!?8CE-++{a64Iw>3Fgwn;7G zgx~&_dRr>6T-$3$Tmzi&C!l@Nx7Oz-qvo^_TuX(Crsr70iLcpfj_y(r`ESZge2}&< zP+gPFh7M!b2v7QLWo2UxU30K(Y)~!rHO;Z?uj?1key~P365ukNFajN6{X|J=^>L;I zbA>MwljQS4&O)dD5CdtGFs(6Fr5Z<@7n0=6EJciXzNhZtLW$H6EX4bo-Pz=NGRM7u zfii8rflKR|L5?t=1SBz`+PqOK&RwU0po&rt-~=-n4Q5YJs;^-k+jnzr@0V+IVs(ZM zqL^X3=n1k1Q48Rxmh4DXZn7f7$_~g#)UOA!4<5#)``kyJ6pUADoV6_mC>ObPlrp%& zpRnR$pH`P`QZUiV0(0{60(R{&)8X$@5?=E1<-sGV|NH=u0LuLoNORL;xT4-Zlyzo7 z7Sd=bZeS<=4gKk@sZ8|GPh>JdoT$CmDUmiOtA6ewp(Aw>X~|Q4798k3zIf7if8?L) zD|q=ZpPsc((8<(N-?dNdqMG{YA^U{PnfmD&Pi-Lr0=N|BT#@t?fF89>GC$O z4kx*oCE75@$ykt-fJ@T=@CDq?n}=c!d_c@JOfn5|!)cR=;ta+fp|PbNHev}NMnV;# zngwFKLV*Urzg!%qj=FMB#(-*tWjbRnWX}QE)qG@MxkpO7${AS>k^&cc%-E7C_rO;g z`*TlzcJU@&{^i{~r&#Fuxexv{+n@VER&T%mG>;#ev#F%_S6`m{;PVX|c>3@Mcs-rB zgtz&*9hc{x`6~|l^4-3~+y9W+vn2OZ-5$ji{2=!~Pc)5b>lNtpbD#ZjLw`;?BOF{h z5C8e=E1T@7FhBPnpCNy1?k^tV_Mss6KR?U;{y@bgX0t|}ZpuS|^4Y3Y877=pD#7o& z_*xI^DDfHM4yeJoXF!wFWTx9IPSTz5cACA-OnTdBZ#n2`LSE?@Xi1aaHrU%)litcJ z_ZWLDCGqlyw-}BEQbX2bu+X`rdZm za&lZ*kMv%h_|l+h`~Tn0GaLL|L+&QItZXqbF@?q?>-RIMfCKZd4wz`Bx8%~Wa3~Rd zW3wH;jH;tE@R*SqW@I8^%!zrM5XrzW=2UWXMq?w6mg#at!cVYKb6#PBIYrhMd8*^n z>d-=+LO=cje*{F@!gf+Lc>qs{cj+jGwFG>QjfKq(_Ru69j{g96@_#UmM-g2D3Tl!n z5wKxM^}sCHo*b<8s059i9V~jB^r@a7YCG&}o#`G~Ua)jbtFuGi-HVu;<(@$)N{I>Q zrooFF1O2`|M3~g%zk}#F`<3)$?n9KfNK!ioPQO0VC{|M^-Z8{!G8DkLV@F8alMCss zZA+b|mFLlwQoiST;=y&qxf$0F&QS&Dm*N`mZrJ+{hCwVbnR_=%u`{4@Z^Ysq(qx{L(ns*_S0%271E*_oAYKohLFtGj|`R$gnuVU zx!v*vD`UjS@yku15njUar@E!+E@~T=NVfuUPFoVQa!+WX|2Tib`gu8=KioigjVl?B zrHu3!IaPJwMsIVsJ3GOI4;)^oxQ#|uSj}mTOTA``we}5V=lj$KSOH1e!qnz*TY-6m ztWxkWt}O~?5vagZDmM><52w}Y9Z_-%bQh`fyYV`%jQ8lm3Z>x*rMt&Fji-igj7BPq z{hw?dS{7n2{5w=ldl_}Yy^xJ=zQvsge&uKlI&x3BZt}ds>4VLtn*lBQaF|xSprX>S zA9-e9>SQdDzp^hyYO)&{z;H$(Sst(mSqKL=^FpQMjCCiqrE)q1Z3SNx%jmi$qmiJ8 zA<0&AM+6e<&DaW`G;>nqhlx!fu0b<(z`Lwo>>xa;Hf$i&Pi+V9W?&?nS`{z$SF#g2 zo7zkdWQlh4$If+qpFeJ{lEF?Nn>~maI-P8PO6q`nCdy>{lf0E?f09L5I!)F71f{@6 zYb`v8&~bAVE!3E!nh}#q8{TI*P#m}s{bhMMVUeNG=j?}){BE1|2huU{nOm~#GzM$v z2fiC)L$E8f6kcemb7-o1$R0k9QiZ802XF9VN_ezDCyEi~hH#-zInPi++W2*Yc0e)) zn%9`x>9QsPhMf#2l4y=A;lxi?5Xjvwz*_2czG;1QH0s1-PMLzSnTc4uG6{Ep>Xckg z@PssFfwQ*g3j=;>CmFXTkXIs=0UgqdX)(tG&`LP;S&8(~8Hvk<~f?{c{^24ap zvR6dWFA5eD`xO5Qh=b9dgJyV#(l$IbAu#kx{B%kXObhxPd+br%WlLwq%-sD#V`?wfvdki}!6hwYZ-sO`l^-; zAO7d{pZ>eqWA_mIk-GzLz}{#f1I0Ci#3=s-28QK>Z|U7?s7l+IFvR&ckmOec;w;-Q|2Ft(It3vG63|S^gq*_mc4B6!K2EpSc(7Koj2%wxu}|4slYa8*&?Dv+m%F?UdQwp5&1Cna zz~mNo1vfF(P{;yK{aHIU7V>i{q&ZzTxz=0zZ-4mhFMjZYpL_hh*R1uLZjmxUK%qYT z_4hyio&R;u*WUVb?1%1y!peff7FpA8AEp)|1`UX)v^Bb~(w%^EKn}0u)Puyf`>t$( zK`ctFxsul@l8ha$RaX!}xhS#a$}r&lc=okt+=v`ctqpFV*)wiDs8I;kF1-P`kG}EX z+RuIXx{ti;6Unix>ZilcJn)$hedhL`#r zB?@oyTYL?`!7U~mbN^c&P;$-cZ+fTwGR!Q8S6ZOqKn=Gft4-4tp?XTo=qgiMjvK3% z-sW2T$EZa=YB5Z>AI2$QumU!Ne{XIf76x3X&3bXO>8yVCpM7UUhw)ihlh$)mT;z0= zJr7dGVE3DUC*dU@Osp-CCc%Wq_*mm9=LFj@)ns^irx<5hQ8lYCQGi(6#J*|?q+m1R z%x;69v09pVr1*5G5%Cc+xKxz=*NLdoC#(GbWsJS(A;*VBT9>9UuI`XqXpS(E6kEHr z4CKIYrO=slQ%-`86*QRrfs1?+x$)L5X_(QhPgnu*j+F`mL(jN$i4VcTPW;3i%|gCTahQBy#aI3G}p@M2)vmrkMCkvlJ=H>6cqD9nd7L=u9`QB`nSX zf~d(HXm!E#=N82#qTRdoMq2hh1vp)KIjfMU3`(0k3VeZ?E%AJV&0Yr8mqGMW>#_i+ z92nqO87zZZrf5rQkb6W6o;q%u=OIPF2}&dWfMx|HC37#}<4sGkhR16%$$uPF_L{dG zOf~yd#SD~oWGCyT_c0Ob_LXeyc6l`(;7A|i{i>YFH?^cY?D%lif+qR*VM+B`gVH4*v-mbd|ZolF;IaPmZCV_!awOr)MuuOCndE*taP=tXxu;yc-Jsea*uRCB-ODv5M0NKRF0gp6=^ zgq+B(_TcB70hY6HJ6m*7T0|i4ElwrYS1dm~3!wr^)`M<+n>~(p(6~XSW?7AGPUa2! z61_DZniW{un$e`646LTY%X6uH*$!s2s$#+bWKC7jh9?(_mH=!UZ9W=mZci`^0!BroUJxrn^qywN@vlyH4m>vl{f*bb@X+hSPG7|LG&z z0Msl^YPvT2*r@O{p+n%;Yk7sEGCdxZZ;p2eOSO3LVJS+z;F~j&2J1CIxJzaI);

p)g40<TtzKYmnoz<{pS29anMen?OYStr7u79ixrdNNE4|7k>Z=ME|SfhzBtEDm50=KX^ z+A;$!(K6jE(tM5%lnrv8i#DM@dz%$|BH04_lNpn29FPc4;vhu(v10;{6zW%j)2$}FEio@|Vn)MPhO-}{Z^@Mi%jhTSv5f|=KZ#pY9h1el0 zU|cEAP@{9^%!4CpQOQkl#EN`?ABzv;W=d)yXh&}%Xk0FAv{9~9#MjTYY-BX8o87kP z8X?GbaWa61tzE7=6ROggSgz_v1!rm#?o3wgzy+{y^D$26Fs$ph?#~7&0H51J50`rL zHkzX7SXyb{SS$qYcjc1cGYyS-gK{ zYh`lW$TCKmxUb4(9HVQ`SN#AWoX* zx2iwEn_tLi5k+W6fo&7VP$4SO7=GcJbEjc==6ioLWEG8&Uo$+KAwouUN}epXRzReFNhWbBlaim`0UrO=kYeE$~}?q&EgJv{oRWvq)v2jm=@C2Y+wgpMk$ z-D;X60NsC~kE54?#XvKUet1oz(o!GkI8=cWjqa%V4iL&;FT+QynOg?NEy}=d2xY*8 zG9g1^at5H9kU{FHYr<+s=lD@N*`XCusL%%vSkmBy_S1FTM1jTys(PE^Y()>KJLAaJ zyhwA(YOBbS#k-tsV&?jFqWD>RV9sR(tR-QKUtwZjOn?DW9M?K78 zM6sVovX~Sw^e7*i{#qoT$~{|C_vAL!mfD}#=8kHcu63EmUF&k)Ra^h|1GFx=sMht% zN1`)2tVtu}z%?RMf(@qBRABZtGDLnP0OYzs07wPguBao{BJ9m8!Iz9=Ia|nQ2lN7G zIiQe90!ayNQt{ko6m1=p2(a}|FfIbfZu?Lyd#NReM1WNcQBo-dtGtHCabBam;x!Vq zvZ66uMv&&<%{^Cx(8=w9w{Kj{qZ_I}C{=O#^o%jn;R8i5W$v zB4*@zG=f9RNH&9hi5X}#3DpP&6Ehf_8(hUcFiOn02H+LEfd3H2hL~X$j7+6Tt$126 zJkV%}pjIwq3?641;BZ+wF@7t>m~jfNKY9+<)Y9W(oQyX2Ol7 z74sNXkRUX{A z_<;NM5xEqIorOP_3E!UjgOeaY;n7i!!~T9Hm}T&=pX!7_9E}q8a14!}gV;A@A}0l} z1{=4CI)Ok{Mgbmep2e6gmWHE5i!?+HN`bhwPbh@OF-~NZcxRF=ZKAfM#qaO{k`myQ z9-|Iwi<+3BVTr!EP^WqnMnqkV`iXZ`w@2@r7>3lC%{_{QGi>uGwRs+Wz%(M&=xh_s zY-4Mfk_kqH7dDeqa1k~YNQvkoh6DHVr0SHjj+_=2luRTNDX@}u!AECL%QPYq(iVJ_ z7Wc2$9$hJB7JO9if{)0c$RW$1N8+47V|`6%QJrP5A84r4#%Zg9&?0jk)LCdz44ITD zq+x*dY;tb{2fK10IS-qIPe}#-kLNr>T}(47$+jdgkLzbxQLSL%Zrme3ne7Kb4+2yru>7L6I5m~XXp^jD=NYhvR8o-xv^h!UUOz& zv*x8{)ilwlRs>q$OLovdrZ_W(@otHZYR+m4k=*O7CQS#Wr=lROKFtBdb~nZv0qhJX zv})>y_9m$wN=DX`bT~~@mAO){VHK&|L{zC0sP@Z_N_|!0wc4HvumVv}P@ZJ80`x-| zg*3l3i<&(^VHGIDo1^xmTOR4RIbZ}JO_P!wvO^Nmo6AV3QI@_cN5u1UFG#jWJ~&tr z>YH|^qXd-|TgKEjNJw9veZM~`Vn*Ez=$8jjG*}Zg6KK~~ZPW~7)!)pR@{)iVd83;Y zAfeHLB_JVv?NiacW>XXhj6-Iuda~xA40Av5LPc%W`o18*RjUnCh$kt=G6cBj2H6v+ zCK@~qV8Gx5cy6&`4+9?o4yB;4X;+~eG2xGQ2n0r)ruLlP4g5=XhzBOR)}5TXQBxPn{NnH5jUk zoqLlomUbAcTa=gs#==a5Av|SqhHsI9RC1>h#$1_Hfiodpk+sa!p{L$J%G4Go)Hzs0=!a)Q5@KN*vK zKixXAGdYA;oAY7qA%!cTU}Tz+y+%=)dua0SJ$JGQEI?wqo->B^Uc3XggVz6|PGU~qCo`Z{)Bq3EAu3|# z6K&tDKyN=lVfRFxRBRriJK~PFzhv;b{}Z4)5o|GxE#7@=dHUp4jE{Fdzm)>oOt#0n znZAl4hILDIond>o-UI)R*uFMzfooNTsmfDmn-(Xz2UJcRxzGAROku^bIIb z*&jSib{TQ`EF*5TkR z_K8+p2gBiQxKv>Pew6ZGWP!&(}|f0|Qky=LFNz!hT%h4F3CKx5H>Z(b~fZPT9%=9Q-T zq5L1bhm9V%CkzhU(~mJ6U99QdiM4D-#iD%Q4QN?eXj2S>P)-D(6Q*JMDm1^$w)?JX z;RxQ>(?T8b_pBaxc@=UnacPKRXMZk0@+EP5>6^>n79B)WphmsW)>!{zN#6umRORpv8GEE*G9bCp+hsS=h(&Y22vq$C(xgA z^XKZTczaNBFRp@s;>=QI4FoPvHwy52p-u}NOb;r`vQas;c+s0cZ>;QE)Ocri0-JPk zoBq&6FpyO5z#P3p`jco@0A2L&8u`>k-8Gmas%Wce&=~=R;1@)0yf7GORvIj<*c@i9 zKW>z5Emn)oKxo7+J&sK+X|S_<^-l6tL(#5x9oe3E+Zc0~e+rSx)NUQG!|rVM0TJfVai0 zYL(Lf;4=cA)nGvNbU@*o`qe?SGVfew7^w=4&cSKLGg*m5p{F^RQor7^KoG~S19p~t zVLhP;5+e|7#eV6GPyivuoj->CoDK=kRy!(&;g*?48HuyQ%4{JN{D zHW6_u*rOjm)?Lj?0cHamYT-EpZpD&X>aQjW5H59POM~bh(^}YY@qNPk)ntM1R+-(E zSE?^WGQzR0yiy=%|LDtp1JYvb5ifgZ^I5~ip}xY<@L+y$cyy@JK3pCgE*HyfyYqvC zZTmWR7ApD9whKlJr33BThAa7jEyKeD=N2y?E%p^F2M(Y6yz=g?`|~5~ugLdSa#ri6 zA-#y7FB~4N6h^3Ld$F%F++P^l&Wr5^#NmpT3jkOusZiNvFAj|t8!QfOcc2eUfvQ5I zllqV=6)SrN3zcH;Ha_O7sqMC0F0y#vGL!uBXXm27jlb`A{p_Nzp>k{?v%(fhS}Un=Y?mW#tfdkV$f zdn$(D3k#Qzl6Pl*sK0lVt`1VJv^x*3@|8WsoxS_>5c z!@WH{`wINIxX^oAL?zqHmA;;y%7KwWxu++3*V7}?A+MvIo}MW~e?}Qx+jy3GdT6hw zXZ;n0UWOOs|27p{52h03g@y9S@KCu>+X|Sh6dWita$#X);J{YB>ZLuQ)pdjs9v!IA zmGbCLMy;IRt$tbV!&Nr5f(R4mxw4x;Tx~h)ssRlQ6I+f7t{>VrrNE{kfFG(9f%Z4y zM>Jf6_=&WBIJ6iA-sO;$(9ok>Y zkF+k@5e^T9`Jr&f`ci2}xGz62TJZ1+Ay+&v!*vu_`)Ik;4im@^wD-c5hTBVp-7p`- zLb=r2Ze3{WEkUH^w&L*8u3eqoean{Z+?nrO+0oItt3Af|QaHxa&bDQ39agSzg&0}6 ztyFHUYw~u`&MjPm^=K~r^SNem9mA!59?MnxO}IIZOJ(M9&F4Cv>jbV7xoY!eZ#Ql((uS|IWI{e-pgCbhn=IP zA@Ny~1;^fs<1;zmhurEN?kk9g=XVwc28*!WN@1w5e|z+LbOg~-fF~>GKp|gpj~CP6 z<`L1;fkJs`IKLC_P#hW>-o78fwtZirGK@qO=>Y#1gXTDv|tyM7(n{jz$*I7tw%w zK1>uta5y>y`4)OBg}#9U6X@(D>S-?_!h73$d%L>weJi?FtzNmZyR$pLbM>;Wj*i~$ z?vB3vs@~47j?VmwUAvYqZyzY`EWu3LP10JgnOsa}_4{@8P2M@wd3(L*P3L|xm*Cd5 zkgJtTIEm-CqmRk+JKS;p@K7O|--E?6d}nvKt5_I-Bkb`0oi=7rM_ogc&AHK`{-NRh zL)8pR!pfdPsSxJ5hKAj1&7nEuSGk4UH6}ZjgfUja_}dn~3DzGhZ%rt>_6KKbDVx+QhlAvR)xa#e7*_ZxW3VW0jVI?@bRG9}W%Kd>a)_lOtSu zM(8~n)%7%YjlIjn*jIW&ihIxTUUc~j?iw5EPvPmI*Ep@oOGoMLBc)<*p(mWrJLL^e z3Hhs@dR_0b*E2pO@UFHF78-kC^2Yu(+r~e`P8e&5u9rF_v*J208p@ASs8oD& zq3`CX%}o)#YwZ9o0 zkFZL06Nqn3d{bW+a2G$=j|w!re|woF1-PzGS*A#@M9A&}c{Y+)ZCuP-v+9)+v4n&~wGt|8sm3aVcX=%Sz z3{T%tOH2!~7edbV!SZf?!}Lxp6@N6NM$)sSohannfLf!Wi!I16Tl)46mkP#Aid>vjhDn@Jt>U2tf zPuLN^!vGM!JLV`yt*@}JXvyWuQrKc=TbGkpQh@0N9i`70Tu`W>2I*`thEY?~;QJ`3 zFp7NdoA=t%w!XANR%Sg7JvR z<`hfOi?(f8x(ak?)zDXkr;mvsI*8#Ln3NtNEvXaJ%|;rN_7=BS#a-Ma-)7BfvXxft zTs9Ybo()Wb`DAmeyGG(cxk} z&m}ZxP(w?3#AgGn?Iz%oM*N4|#YrFK9&mq!^cq>BY{3fEE^k|ARBM(RTh0!b+XYyA zY$O$fc!su1v@MRS@iW$3?0YpqiQsIP)vX2=@zV(g*KsA#gofw!AJgQCr#%uIyP?FeX^&LoAjmXN&2rAL_IFwmrpC<-oT6 z!(=w?SrT8XG0~sqm(n*M+vL5E>%&~1=K3?PFLAxXG3q_ya=m6{kbC|CWcRH>4R4(y zyS+J0UN3N-#U)LuHf^#j`o3n;cct}xcnC&a9vv}DQaF^ya*Jsm9wFf{91a)~!;UL9 z@b7WzT0)t)jfyeDYSg&~ok- z*L?(q_F>vlf8Wa`e8&X#a!g2@=Q~r-o4Bj4!W*4E*{LhX3Gj`y|c*OPvQ%*|;W(pHy8Hb|$JXlT6WfaOx!_!~MY6LXyY-lX)8 zCZ&HeDg7Ul(h0Pd+WHzNrH`4Eo|M-&;wGKH_vI>Dv5C&#U>a`BD2_ z>DEc#*0HC{ST2AV~xMxPg*$IG>A#REM2w7>8~bb_T={!!VXE5RcNy;#t{?J zMlpz(&8v40^t{Ba8ZeT^Ou~tv@{$vqjK8o(DU?|L#!ejU0~qA`SpL{L$24K7BC^fg zNSRY=;JXX>rq`rzA$<&K{j1^Mm=t$a7%=`!FoswA`CiI(QYP;A+ep{qnpv@%G# z7SG#B%k>hMKZmr;qqXVU@8|Qq7S9_=A5H$vk(EB&zo#%1R!NIhgR^ji(bCYNaJ>Ex zP*zHgaJieMV@!xs>xn8TV^I5@GX=No5>xP-9ZwJ~3y+(kMJUU&RpJ#g)k)51@fhco z5~@YmE9UL24%_jOh^hq3ZNMTqEZWxG6K{-V_GLUvw&d( zR9&B<``gHK6nVzKx%u!Q??wL?Med1Ocj)7M6P_=^^l924bIMtdofY6md>2i=LNYjl zD-#R%o_1KJ{0WT0dCr6&cZa-3F?|lc#`XP;z@f1hO~`PQ;eCPo%^+V2YMlN!=`%@R zRP{B5sE|8F@w+gtSIQIp8TFXYlclHPW% z9nn>*|L1x4>cCiX!8z@qHIB^z)L37gxFFhID3xl$8aDUGQ4MCe6A#e5(-`kLxyc*g zeizrPM|XGyH0#V+hRa}KlhK>P55!Yz(=~h(WuOm(ua%5+FTy=2t8#G}@psA9I4zo0 z|6(RJIk3s1M{qQ{<>OXMI@}#8vL%OEN=XG}$d! z2)Pk%bv}QBt_pAgR4U#Pf>=QrAciYEFg(iBP&kUbsbb{p{0c@2$11ZC}VmagEif#fvPRMP@#Wh-M=L6 zrm8FzuxB7L1kKI@DrZqJ07^~Sa$C4<80Q?pAiWhU>|AIVhh#@ZJC}qQLKQ6tFC(E` zzUov7U#j`Ws9X^!L&SC9BJ3?RhnEz>Jpd%DcVVDc-52iBb&Ucn=0hn3#3-(12|nF^ zA)464GH64Bl!xV&XN49LLlVjZM=QhpDYaEvaV@bPd3AV0HOSJK`oUA0Y@RP?9%!z_ zY0Z^pu2%;Jd^S-iQ)aOXQ|YHI>Cm-n(>~JTsk^v#b167;yQx~DAJ`Un#P{mmN*$7w zZj~WfJ|G&`&`l^}321S62u*|Vui84EqKd@jK{IPUEli^m{k*t;uDcN$N zgDV2WSRsHR58IsX9_N=FQT})xvj^mf`oNyIg1lP0#ox-s-6(UTFaVcf3*RM!;_rC# zr2ZbzssZaPtO-t3)zBS>#`S0{va=1R3FW&eAM5xwE0_}x@P5X4z2oBqE zgzynCQvJ}!`x=-&;in2#ydjmA&GxwLG^-IvTevHf&_9{l1s)(YW!2kb?-ZZmgoj zI()8M8JF0ROd0Waje{=fkZzbJwmr!EsD_P&E25{1D!W#lAH~@qLi@CukmE_={zO~| zV{tgIUb{}&>lkel`Zq)y4tHx0T*?}%wr|6HLt%^XS1mrF{0Mn+eSKSr3ms*D$NsH* zN?Z5D3q)r>vbou|%-IQ6a#yI{ zl?eiV;I=}Hr~3++^b`p>I&M{nYoWatXjk()yWG+0yy(7|dn50=xhs_H4DRBY1>qzlPa*vf@6ART*=XQJgjJfB8F6UOdy+h|d#+X7 z9f*i1&(Xi*k76}myvCCaQDdnEsN!Q|1TR?O`qja=(|Fc+!uWoIglgDjUTJ zvjmPJgq4R&c%r{ED%`{M3b|3HPhGaH{n`s zT)|aa?f~iejM0f)EnFvYwQ?=yYFa7oV)LU?BC?L)GZ{b7oL#INT8v|qZR*n)av_;$cD6H72*5hEocr74q$HJb4JH~V6 zO>bu@18r%$P}sU|RY%7U#(r)l=Sq*iPaO4 zGokjgTsr8nFm4XUQsQ+s2|7CCD$ z8IgU6KR=HcDr@$mRJO(Moh_}J6z7dUjiOOADOvsS$MmJP%{H($(V`gEd_1Cf?6ts? zmQFMANU;9eQD?hCUr5PJ|TIljNUJSeN9WAdco~O<7pmW(ek~(lQ$fq4DB5goY zxH^m|m%Bu=T51`i950&(_QAn?O@;vl=2|WR0#Fu4Bm54sQ|=Y&q6q!I!qUBER=(O& zh4XA>6xP;<<$cHvfppSvRg!tg)QI5GT4V;u2cX$x5w%HTe&3 zX~R{xRH{*K>sgyNjU&uWZqNG(P-vq_T=#$HS(4<{#6slU^;%cE73u=oll3M}U(2&J z-#C30&r7)0y7)MVZkK864^#eCg_W_4J<(6mRxdF8Etg;|Mp8$f?~Ogbd(Zb})F}?` zJm0xTeg<_MTwOETQ>fz=j@VRR@3>pX`!3MPfAb!$rCg)Z&8yb@!+4w6cM$uk;jvnHiqpzijX`ju|3N&kvxQDNM^ z((>)a=|ACFb2mBXeSeW=*96tYTmXXP}vKB=12Od(>i^CCXbn<;ZjP5r0P zpV>9(Q=|UHoLfHG5UH_imrROn-m{dKzVs9B!ux-4r$`jA)fZL@S5%p?d3f_-*V3I9 zb{aw5=FK|Yg^$N=7$+?s7~F~8u#s#v}Enl&+t9#Yz#qF=G{L<}h?c=q*oVwaxAp|d{&2fkqFKKRh z&4QCoUf8Thjlb|IgEZEy*_?IyBDV+_1psCeVCD?uV8_@5sGF(xMrP6n(J0wYq)Y;Yq`$iTG!-_A+uw<*tI-g$5s38deS?vPht#0c^Sc#)B6hb z3Ad!Pjo2&Q_6L@7@gm0i_w`Pncn+Xsi~SL4=~eMv)`W1!c)GH|*$w0GS}Nn#^ls(7 zY-CG9{O~->rt~&0*>iNgo$DQ3H*wXze<$g8alL!e`g>Xx186~|lE z#OXGkUAtPL@~L~a2JwlWcDmcT#nPa4QEeZ7k0Nml!%K*{_0*pJ#oNU>PQmS08`j1# zxuW~nO3vm%PPV~jzNZ*%TzisoTEA#>$0F|XSXT~=Tm7-x+LmxEe{2sa7W%M+4n?sC zrNS=x<0ia8v)&^oeND{b5YF%6Qh)8Mnj-m~ct;C;GI&I93w<(ta>{^g5i}5|lqJ6p zJBI=x<4W0EIkdB+!-B$*;s`!=13y2YAPL+svaOV>rsr_K+dQgscC0qs^f;juA7C!Z zYO4BRh%o=UDqL#8p1ZL3Md4-8aU47_Sm-N`4%U1d7{WLh*IH|#ZFgJ9 zB7p(v$1*fLvIr9uM#Q*NswE`qs&AkW)2Z|KVi0qVviP-ZwQ_RfT_3I3*jls{F{UwG zZqGxZ(67(|Y}GtjAgS7@f%fuI4silsy@dk%#S8#*F3a=4SeW|+7jF50+q7J*!rt|P z8{xE$sZ_aK&`-L7v~n73&Khnv}kS^qpKE=8{B_oc##b zU0k7VHSqg>D?T<3A^;o8S_1J~_bpXPd) z>#w=K$MsKKcLQgvC*8yIy<8vTs(t@)(!WEUCuZt00DI?baXOX9{T$kHR@?EpGrk9l zQ{_0Gs294%6_ZCpB|C z-=E_7x6m6S7UdjmlCs(}VIhMqsL=U2Ty;!bDO>>do8fbHODGc1|S`@=$l;(MVe4(SYc#ICSZ?3Hky!?=S45_!)_mcMbC{}-MGYe$A4WoXb+6!kFA8Gr9a`>jc}xU?3B~5++!?X)BrJ9 z1gm^;E+cO^_JcOKd3(5vzny-1^XbGk30a8lQ@?&aMp zx>t60b$55K>R!F7V^!y>WviC2TCr;7s;*Vtt5&UAy&4c#)BI|xUQMypyqdcFI|Z$) z6rK@wu8#ZsPcQ=Uw)?qi@%Aw3&vAX8>v3pU_=)+cxx(caulY8QfuCEGo<+Ka^pyF* zi7&mZ+Y5uedrDycxr-b_Or9!(AL)WMsrZPzFP#Q7QE)54vnL54BV-qIIC91 zWoj;TaI)FkC@?4O5(dD*3TJEixM2OJ0$60^pW# zpOQCHSZ+q7VlhdZpJZe$rik|fwHof-z&3%Q-{^T?B=BG0a*;&VS zt?s$^W8eOp`tF-=xi{T#>KVI=?|#qB;q71e@xNTU^QSKy+Pdxc|DdgXVe3U7xZ}=` z+;z{r_kH%^N9(eU#~j~t=K2fnzUT43x+8tu+?JEhIP-_k{mY>*Kb8z%bJEGJ%UAVm zeC@egwqA7c>n^?QO*?uEyZXylTy@Rc@A~-t4?ObZr|usb{`~K~spT!HL~?0jSHf>^ z8@ulKMCXk8$p!T%q!y>vC8wV<_VKy}$py*Q%!=&!XIxZ>RC}@^U7ubPE=)GocO`mKbJNMj^p;KC%cm_*w`CfxJ^8|O7H3YGJ@@4K zvyQDlp9a=VJ1*T&w=uJ@el)xGj8p1PO*PbAQ0J$b5~;Cw>^xy(reW;vH?^$KHq=c! zx~Hz8Yf19hu|GYnZ)@Ym`i2eb=WWbvowh06F!u8e4aX$vo( ziTM}%GnP%e{ttGIX2%|V`?4~-l;mY~CpT5TB1JP^qw7O*H=y(`*}k- zGjhy^H_vLE)p$w$abs`2_Uy!eTRY>JgIi9ls~h{~;?x<<{>akA++=X=niFUCr2K22 zJmtE79Q*f0=O!DH!SyrOoqPJ&pPyFeCof9PTM=A4eMz#f@#2QDPpvwB+LB~_I+$KJ z_WRd=J2^8kEwMkjogYB+XEY{P(Ye-4%lX%CYdjuUx-!$rTAv>K%aa-o)_Hy+m8z=? z(sh}1{mh2>+2b1LPHURpI3wAVIO?dQ>u3ANCg=FaCFZ8*`SXJlXNQT!iKW>#za!BZ zEc5RPJ{EjD`H9Sb1iwuED)@EcQ2l*Z9C*h&KiqN2>)vtG&GY|u`iyhV{pAa7?Pp&0 z#_c~i_|A9T@}7@<`m=xb<;TAE7k~HcKOFLsM$p|or=Gs)wQoH5ERr@#06Yu!-ec=={x>z9F5N(X_Dr$Nw@k+B-~ zw=Od;SvT|APfj2EMC!!)Yv(17%lOImBpqbPtQwVk`C&QZQPPPE3p*zG_!6-V^8w$(BbL(E8UYy#{up|j>Bs#N8l5^{_iLp=eslD^O#MoV#(-Jch zr=?eA7N@Q|G;>a-edf|c^Ni*hV>czQd;f9SV{W`P)t)*PN}E$Z_W71dd*{rdLGGl+4YM66sqM>e8W&=OoSIM4`xHS3t`myWh%x{=oe{OQ@ z?RB5HtMS-m=bg!GzjHD_*_Rr-yXo4WrTy@fI=;R$IrjO)yu^%YN95rVFW)ZXC2ah* zHxYUXtKPz;dz`+EXUUIo54sCKm{RX}1ey0dbx9V;grep8WutGYzS~LqHC*vg5w$AT z7kF>0f$F--g$0j}Y_AO4GHg2v%|x~A5z2T8Om@l8yCt>5d*jh}ct;%@p4b@fIPqVW z+_CtSj&RBF-Onru?%lEUgkSDx^L`z6eelqZu3!1z@A4a(yBAFRe)lJ)=U2DSxpQ^L z{QSm$JK@fA*R05Id4BJm7i=DGzVHJN-+7_;M1E`G8+UH?zSF$Td*=HWed-7KOP+hS z`Snl!=+4)N-j84ZynoH5-UwcjrRYEb|M?rU9mh2J1?VdX{N!u=6Xv}k+f!ff&q@0A zh{Dw3#A%sR=J;VZ1(F%)DBTbo@As&9GDDVzU@kwbv>KV244_;8gdoB1#gR^t!Jie( zMxv6Nx-)({(GZ;ApGw(AO14rxwestaeli_otyY0Vqk+=%gVn$nw{pC{(N7Ym;QJZ> z0zXJMW_J2PeKx%*m`8oS-#y)@#Z=Z`Q19`Zo$PWi3%jr>dm84|1b zNWnx;CJ1gz_|yEf8cYO_t?~RXHG7G7`a43et{8YppI=?w62NzX{kS0Izdx9J)HMI( z%yHSaLlY5(-Zf|Q>*gI|bPQI9b3wiytnj64+K-%NW+ zKWu2NvyrL`5^W&dOM?*q!r6dAEpM))0dNkrsVU!MbXTNOdh+XLc(54HKQnm&@4dF* zSoCwEQ8JkzeM0iqgx8&1mhq?ivs3;IYMp5{ruzIlD06xe45SCs-j1>7of+?VrkM2D V_&UV${3Mn@Yq|Dtz3alJ{{zZ*KxhB} literal 0 HcmV?d00001 diff --git a/tests/nix_tests/ibc_utils.py b/tests/nix_tests/ibc_utils.py index d230bd9f3b..7c875bf9d8 100644 --- a/tests/nix_tests/ibc_utils.py +++ b/tests/nix_tests/ibc_utils.py @@ -21,8 +21,11 @@ wait_for_port, ) -# EVMOS_IBC_DENOM IBC denom of aevmos in crypto-org-chain +# aevmos IBC representation on another chain connected via channel-0. EVMOS_IBC_DENOM = "ibc/8EAC8061F4499F03D2D1419A3E73D346289AE9DB89CAB1486B72539572B1915E" +# uosmo IBC representation on the Evmos chain. +OSMO_IBC_DENOM = "ibc/ED07A3391A112B175915CD8FAF43A2DA8E4790EDE12566649D0C2F97716B8518" + RATIO = 10**10 # IBC_CHAINS_META metadata of cosmos chains to setup these for IBC tests IBC_CHAINS_META = { @@ -222,3 +225,10 @@ def get_balance(chain, addr, denom): balance = chain.cosmos_cli().balance(addr, denom) print("balance", balance, addr, denom) return balance + + +def get_balances(chain, addr): + print("Addr: ", addr) + balance = chain.cosmos_cli().balances(addr) + print("balance", balance, addr) + return balance diff --git a/tests/nix_tests/osmosis/evmosOsmosisPool.json b/tests/nix_tests/osmosis/evmosOsmosisPool.json new file mode 100644 index 0000000000..8f75d6ebf5 --- /dev/null +++ b/tests/nix_tests/osmosis/evmosOsmosisPool.json @@ -0,0 +1,8 @@ +{ + "weights": "1ibc/8EAC8061F4499F03D2D1419A3E73D346289AE9DB89CAB1486B72539572B1915E,1uosmo", + "initial-deposit": "1000000ibc/8EAC8061F4499F03D2D1419A3E73D346289AE9DB89CAB1486B72539572B1915E,1000000uosmo", + "swap-fee": "0.01", + "exit-fee": "0.00", + "future-governor": "168h" +} + diff --git a/tests/nix_tests/test_osmosis_outpost.py b/tests/nix_tests/test_osmosis_outpost.py index 2575f9af4f..6fccfa2bbb 100644 --- a/tests/nix_tests/test_osmosis_outpost.py +++ b/tests/nix_tests/test_osmosis_outpost.py @@ -1,10 +1,34 @@ +import json + import pytest -from .ibc_utils import EVMOS_IBC_DENOM, assert_ready, get_balance, prepare_network -from .utils import ADDRS, get_precompile_contract, wait_for_fn +from .ibc_utils import ( + EVMOS_IBC_DENOM, + OSMO_IBC_DENOM, + assert_ready, + get_balance, + prepare_network, +) +from .network import CosmosChain, Evmos +from .utils import ( + ADDRS, + KEYS, + OSMOSIS_POOLS, + WASM_CONTRACTS, + approve_proposal, + erc20_balance, + eth_to_bech32, + get_event_attribute_value, + get_precompile_contract, + register_ibc_coin, + send_transaction, + wait_for_cosmos_tx_receipt, + wait_for_fn, + wrap_evmos, +) -@pytest.fixture(scope="module", params=["evmos", "evmos-rocksdb"]) +@pytest.fixture(scope="module", params=["evmos"]) def ibc(request, tmp_path_factory): """ Prepares the network. @@ -13,36 +37,153 @@ def ibc(request, tmp_path_factory): evmos_build = request.param path = tmp_path_factory.mktemp(name) # Setup the IBC connections - # evmos (channel-0) <> (channel-0) gaia - # evmos (channel-1) <> (channel-0) osmosis - # osmosis (channel-1) <> (channel-1) gaia - network = prepare_network(path, name, [evmos_build, "gaia", "osmosis"]) + network = prepare_network( + path, name, [evmos_build, "osmosis"], custom_scenario=name + ) yield from network -# TODO remove this test and replace with the outpost test -def test_ibc_transfer(ibc): - """ - test transfer IBC precompile. - """ +def test_osmosis_swap(ibc): assert_ready(ibc) + evmos: Evmos = ibc.chains["evmos"] + osmosis: CosmosChain = ibc.chains["osmosis"] + + evmos_addr = ADDRS["signer2"] + + osmosis_cli = osmosis.cosmos_cli() + osmosis_addr = osmosis_cli.address("signer2") + amt = 100 + # the expected amount to get after swapping + # 100aevmos is 98uosmo + exp_swap_amount = 98 + + setup_osmos_chains(ibc) + + # --------- Register Evmos token (this could be wrapevmos I think) + wevmos_addr = wrap_evmos(ibc.chains["evmos"], evmos_addr, amt) + + # --------- Transfer Osmo to Evmos + transfer_osmo_to_evmos(ibc, osmosis_addr, evmos_addr) + + # --------- Register Osmosis ERC20 token + osmo_erc20_addr = register_osmo_token(evmos) + print(f"osmo_erc20_addr: {osmo_erc20_addr}") + + # define TWAP parameters + testSlippagePercentage = 20 + testWindowSeconds = 10 + + # --------- Swap Osmo to Evmos + w3 = evmos.w3 + pc = get_precompile_contract(w3, "IOsmosisOutpost") + evmos_gas_price = w3.eth.gas_price + + tx = pc.functions.swap( + evmos_addr, + wevmos_addr, + osmo_erc20_addr, + amt, + testSlippagePercentage, + testWindowSeconds, + eth_to_bech32(evmos_addr), + ).build_transaction( + {"from": evmos_addr, "gasPrice": evmos_gas_price, "gas": 30000000} + ) + gas_estimation = evmos.w3.eth.estimate_gas(tx) + print(f"outpost tx gas estimation: {gas_estimation}") + receipt = send_transaction(w3, tx, KEYS["signer2"]) + + assert receipt.status == 1 + + # check balance increase after swap + new_erc20_balance = 0 + + def check_erc20_balance_change(): + nonlocal new_erc20_balance + new_erc20_balance = erc20_balance(w3, osmo_erc20_addr, evmos_addr) + print(f"uosmo erc20 balance: {new_erc20_balance}") + return new_erc20_balance > 0 - dst_addr = ibc.chains["osmosis"].cosmos_cli().address("signer2") - amt = 1000000 + wait_for_fn("balance change", check_erc20_balance_change) - cli = ibc.chains["evmos"].cosmos_cli() + # the account has 200 uosmo IBC coins from the setup + # previous to registering the uosmo token pair + exp_final_balance = 200 + exp_swap_amount + assert new_erc20_balance == exp_final_balance + + +def setup_osmos_chains(ibc): + # Send Evmos to Osmosis to be able to set up pools + send_evmos_to_osmos(ibc) + + osmosis = ibc.chains["osmosis"] + osmosis_cli = osmosis.cosmos_cli() + osmosis_addr = osmosis_cli.address("signer2") + + # create evmos <> osmo pool + pool_id = create_osmosis_pool( + osmosis_cli, osmosis_addr, OSMOSIS_POOLS["Evmos_Osmo"] + ) + + contracts_to_store = { + "Swaprouter": { + "get_instantiate_params": lambda x: f'\'{{"owner":"{x}"}}\'', + }, + "CrosschainSwap": { + "get_instantiate_params": lambda x, y, z: f'{{"governor":"{x}", "swap_contract": "{y}", "channels": [["evmos","{z}"]]}}', # noqa: 501 - ignore line length lint + }, + } + + # ===== Deploy Swaprouter ===== + swap_contract = WASM_CONTRACTS["Swaprouter"] + swap_contract_addr = deploy_wasm_contract( + osmosis_cli, + osmosis_addr, + swap_contract, + contracts_to_store["Swaprouter"]["get_instantiate_params"](osmosis_addr), + "swaprouter1.0", + ) + + # ===== Deploy CrosschainSwap V1===== + cross_swap_contract = WASM_CONTRACTS["CrosschainSwap"] + deploy_wasm_contract( + osmosis_cli, + osmosis_addr, + cross_swap_contract, + contracts_to_store["CrosschainSwap"]["get_instantiate_params"]( + osmosis_addr, swap_contract_addr, "channel-0" + ), + "xcswap1.0", + ) + # ================================= + + # in the router one execute function `set_route` to have a route for evmos within the swap router contract + # set input 'aevmos', output 'uosmo' route + set_swap_route( + osmosis_cli, osmosis_addr, swap_contract_addr, pool_id, EVMOS_IBC_DENOM, "uosmo" + ) + + +def send_evmos_to_osmos(ibc): + src_chain = ibc.chains["evmos"] + dst_chain = ibc.chains["osmosis"] + + dst_addr = dst_chain.cosmos_cli().address("signer2") + amt = 600000000 + + cli = src_chain.cosmos_cli() src_addr = cli.address("signer2") src_denom = "aevmos" - old_src_balance = get_balance(ibc.chains["evmos"], src_addr, src_denom) - old_dst_balance = get_balance(ibc.chains["osmosis"], dst_addr, EVMOS_IBC_DENOM) + old_src_balance = get_balance(src_chain, src_addr, src_denom) + old_dst_balance = get_balance(dst_chain, dst_addr, EVMOS_IBC_DENOM) - pc = get_precompile_contract(ibc.chains["evmos"].w3, "ICS20I") - evmos_gas_price = ibc.chains["evmos"].w3.eth.gas_price + pc = get_precompile_contract(src_chain.w3, "ICS20I") + evmos_gas_price = src_chain.w3.eth.gas_price tx_hash = pc.functions.transfer( "transfer", - "channel-1", # Connection with Osmosis is on channel-1 + "channel-0", src_denom, amt, ADDRS["signer2"], @@ -52,7 +193,7 @@ def test_ibc_transfer(ibc): "", ).transact({"from": ADDRS["signer2"], "gasPrice": evmos_gas_price}) - receipt = ibc.chains["evmos"].w3.eth.wait_for_transaction_receipt(tx_hash) + receipt = src_chain.w3.eth.wait_for_transaction_receipt(tx_hash) assert receipt.status == 1 # check gas used @@ -64,10 +205,149 @@ def test_ibc_transfer(ibc): def check_balance_change(): nonlocal new_dst_balance - new_dst_balance = get_balance(ibc.chains["osmosis"], dst_addr, EVMOS_IBC_DENOM) + new_dst_balance = get_balance(dst_chain, dst_addr, EVMOS_IBC_DENOM) return old_dst_balance != new_dst_balance wait_for_fn("balance change", check_balance_change) assert old_dst_balance + amt == new_dst_balance - new_src_balance = get_balance(ibc.chains["evmos"], src_addr, src_denom) + new_src_balance = get_balance(src_chain, src_addr, src_denom) assert old_src_balance - amt - fee == new_src_balance + + +def transfer_osmo_to_evmos(ibc, src_addr, dst_addr): + src_chain: CosmosChain = ibc.chains["osmosis"] + dst_chain: Evmos = ibc.chains["evmos"] + + cli = src_chain.cosmos_cli() + src_addr = cli.address("signer2") + + bech_dst = eth_to_bech32(dst_addr) + old_dst_balance = get_balance(dst_chain, bech_dst, OSMO_IBC_DENOM) + rsp = ( + ibc.chains["osmosis"] + .cosmos_cli() + .ibc_transfer(src_addr, bech_dst, "200uosmo", "channel-0", 1, fees="10000uosmo") + ) + assert rsp["code"] == 0 + + new_dst_balance = 0 + + def check_balance_change(): + nonlocal new_dst_balance + new_dst_balance = get_balance(dst_chain, bech_dst, OSMO_IBC_DENOM) + return old_dst_balance != new_dst_balance + + wait_for_fn("balance change", check_balance_change) + + +def register_osmo_token(evmos): + """ + Register Osmo token as ERC20 token pair. + Helper function that creates the corresponding + gov proposal, votes for it, and waits till it passes + """ + evmos_cli = evmos.cosmos_cli() + + # TODO - generate the osmos ibc denom + osmos_ibc_denom = OSMO_IBC_DENOM + ERC_OSMO_META = { + "description": "Generic IBC token description", + "denom_units": [ + # TODO - generate the osmos ibc denom + { + "denom": osmos_ibc_denom, + "exponent": 0, + }, + ], + # TODO - generate the osmos ibc denom + "base": osmos_ibc_denom, + "display": osmos_ibc_denom, + "name": "Generic IBC name", + "symbol": "IBC", + } + + proposal = { + "title": "Register Osmosis ERC20 token", + "description": "The IBC representation of OSMO on Evmos chain", + "metadata": [ERC_OSMO_META], + "deposit": "1aevmos", + } + proposal_id = register_ibc_coin(evmos_cli, proposal) + assert ( + int(proposal_id) > 0 + ), "expected a non-zero proposal ID for the registration of the OSMO token." + print("proposal id: ", proposal_id) + # vote 'yes' on proposal and wait it to pass + approve_proposal(evmos, proposal_id) + # query token pairs and get WEVMOS address + pairs = evmos_cli.get_token_pairs() + assert len(pairs) == 2 + assert pairs[1]["denom"] == osmos_ibc_denom + return pairs[1]["erc20_address"] + + +def deploy_wasm_contract(osmosis_cli, deployer_addr, contract_file, init_args, label): + """ + Stores the contract binary and deploys one instance of it. + Returns the contract address + """ + # 1. Store the binary + rsp = osmosis_cli.wasm_store_binary(deployer_addr, contract_file) + assert rsp["code"] == 0 + + # check for tx receipt to confirm tx was successful + receipt = wait_for_cosmos_tx_receipt(osmosis_cli, rsp["txhash"]) + assert receipt["tx_result"]["code"] == 0 + # get code_id from the receipt logs + logs = json.loads(receipt["tx_result"]["log"]) + code_id = get_event_attribute_value(logs[0]["events"], "store_code", "code_id") + + # 2. instantiate contract + rsp = osmosis_cli.wasm_instante2( + deployer_addr, + code_id, + init_args, + label, + ) + assert rsp["code"] == 0 + + # check for tx receipt to confirm tx was successful + receipt = wait_for_cosmos_tx_receipt(osmosis_cli, rsp["txhash"]) + assert receipt["tx_result"]["code"] == 0 + + # get instantiated contract address from events in logs + logs = json.loads(receipt["tx_result"]["log"]) + contract_addr = get_event_attribute_value( + logs[0]["events"], "instantiate", "_contract_address" + ) + print(f"deployed {label} CosmWasm contract @ {contract_addr}") + + return contract_addr + + +def set_swap_route( + osmosis_cli, signer_addr, swap_contract_addr, pool_id, input_denom, output_denom +): + execute_args = f'{{"set_route":{{"input_denom": "{input_denom}","output_denom":"{output_denom}","pool_route":[{{"pool_id": "{pool_id}","token_out_denom":"{output_denom}"}}]}}}}' # noqa: 501 - ignore line length lint + + rsp = osmosis_cli.wasm_execute(signer_addr, swap_contract_addr, execute_args) + assert rsp["code"] == 0 + + # check for tx receipt to confirm tx was successful + receipt = wait_for_cosmos_tx_receipt(osmosis_cli, rsp["txhash"]) + assert receipt["tx_result"]["code"] == 0 + + +def create_osmosis_pool(osmosis_cli, creator_addr, pool_meta_file): + rsp = osmosis_cli.gamm_create_pool(creator_addr, pool_meta_file) + assert rsp["code"] == 0 + + # check for tx receipt to confirm tx was successful + receipt = wait_for_cosmos_tx_receipt(osmosis_cli, rsp["txhash"]) + assert receipt["tx_result"]["code"] == 0 + + # get pool id from events in logs + logs = json.loads(receipt["tx_result"]["log"]) + pool_id = get_event_attribute_value(logs[0]["events"], "pool_created", "pool_id") + print(f"created osmosis pool with id: {pool_id}") + return pool_id diff --git a/tests/nix_tests/utils.py b/tests/nix_tests/utils.py index a504a822ed..f3292e4393 100644 --- a/tests/nix_tests/utils.py +++ b/tests/nix_tests/utils.py @@ -43,8 +43,22 @@ "StakingI": "evmos/staking/StakingI.sol", "StakingCaller": "evmos/staking/testdata/StakingCaller.sol", "IStrideOutpost": "evmos/outposts/stride/IStrideOutpost.sol", + "IOsmosisOutpost": "evmos/outposts/osmosis/IOsmosisOutpost.sol", "IERC20": "evmos/erc20/IERC20.sol", } + +OSMOSIS_POOLS = { + "Evmos_Osmo": Path(__file__).parent / "osmosis/evmosOsmosisPool.json", +} + +# If need to update these binaries +# you can use the compile-cosmwasm-contracts.sh +# script located in the 'scripts' directory +WASM_BINARIES = { + "CrosschainSwap": "crosschain_swaps.wasm", + "Swaprouter": "swaprouter.wasm", +} + WEVMOS_META = { "description": "The native staking and governance token of the Evmos chain", "denom_units": [ @@ -58,6 +72,10 @@ } +def wasm_binaries_path(filename): + return Path(__file__).parent / "cosmwasm/artifacts/" / filename + + def contract_path(name, filename): return ( Path(__file__).parent @@ -67,6 +85,11 @@ def contract_path(name, filename): ) +WASM_CONTRACTS = { + **{name: wasm_binaries_path(filename) for name, filename in WASM_BINARIES.items()}, +} + + CONTRACTS = { **{ name: contract_path(name, filename) for name, filename in TEST_CONTRACTS.items() @@ -195,6 +218,8 @@ def get_precompile_contract(w3, name): addr = "0x0000000000000000000000000000000000000802" elif name == "IStrideOutpost": addr = "0x0000000000000000000000000000000000000900" + elif name == "IOsmosisOutpost": + addr = "0x0000000000000000000000000000000000000901" else: raise ValueError(f"invalid precompile contract name: {name}") return w3.eth.contract(addr, abi=info["abi"]) @@ -243,6 +268,28 @@ def register_ibc_coin(cli, proposal, proposer_addr=ADDRS["validator"]): ) +def wait_for_cosmos_tx_receipt(cli, tx_hash): + print(f"waiting receipt for tx_hash: {tx_hash}...") + wait_for_new_blocks(cli, 1) + res = cli.tx_search_rpc(f"tx.hash='{tx_hash}'") + if len(res) == 0: + return wait_for_cosmos_tx_receipt(cli, tx_hash) + return res[0] + + +def wait_for_ack(cli, chain): + """ + Helper function to wait for acknoledgment + of an IBC transfer + """ + print(f"{chain} waiting ack...") + block_results = cli.block_results_rpc() + txs_res = block_results["txs_results"] + if txs_res is None: + wait_for_new_blocks(cli, 1) + return wait_for_ack(cli, chain) + + def register_host_zone( stride, proposer, From e892e979948261ab75006e3083c371f186b4962d Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Tue, 5 Dec 2023 10:32:05 +0100 Subject: [PATCH 014/345] imp(bech32): instantiate stateless precompile (#2130) * instantiate the bech32 contract * add the I suffix --- precompiles/bech32/{Bech32.sol => Bech32I.sol} | 3 +++ 1 file changed, 3 insertions(+) rename precompiles/bech32/{Bech32.sol => Bech32I.sol} (91%) diff --git a/precompiles/bech32/Bech32.sol b/precompiles/bech32/Bech32I.sol similarity index 91% rename from precompiles/bech32/Bech32.sol rename to precompiles/bech32/Bech32I.sol index 8542c8a5f3..7d1c65a150 100644 --- a/precompiles/bech32/Bech32.sol +++ b/precompiles/bech32/Bech32I.sol @@ -4,6 +4,9 @@ pragma solidity >=0.8.17; /// @dev The Bech32I contract's address. address constant Bech32_PRECOMPILE_ADDRESS = 0x0000000000000000000000000000000000000400; +/// @dev The Bech32I contract's instance. +Bech32I constant BECH32_CONTRACT = Bech32I(Bech32_PRECOMPILE_ADDRESS); + /// @author Evmos Team /// @title Bech32 Precompiled Contract /// @dev The interface through which solidity contracts can convert addresses from From f179530941c390cd863b221024f50acc81fc8274 Mon Sep 17 00:00:00 2001 From: Vladislav Varadinov Date: Tue, 5 Dec 2023 11:40:36 +0200 Subject: [PATCH 015/345] chore(upgrade): Override module account to reflect new burner role (#2129) * chore(upgrade): Override module account to reflect new burner role * CHANGELOG * fix: add migration of feecollector to new file * format, lint and license * fix: make the fee collector function return an error to be checked in the handler * fix: add test case for migrate fee collector * merge from main and comment out the burning part --- CHANGELOG.md | 1 + app/app.go | 2 ++ app/upgrades/v16/feecollector.go | 33 +++++++++++++++++++++++++++++++ app/upgrades/v16/upgrades.go | 14 +++++++++++++ app/upgrades/v16/upgrades_test.go | 25 +++++++++++++++++++++++ 5 files changed, 75 insertions(+) create mode 100644 app/upgrades/v16/feecollector.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d193be2b5..5cef5273b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -52,6 +52,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (incentives) [#2070](https://github.com/evmos/evmos/pull/2070) Remove `x/incentives` module and burn incentives pool balance. - (evm) [#2084](https://github.com/evmos/evmos/pull/2084) Remove `x/claims` params and migrate the `EVMChannels` param to the `x/evm` module params. - (post) [#2128](https://github.com/evmos/evmos/pull/2128) Add `BurnDecorator` to `PostHandler` to burn cosmos transaction fees. +- (fee-collector) [#2129] (https://github.com/evmos/evmos/pull/2129) Add `Burner` role to `FeeCollector` module. ### API Breaking diff --git a/app/app.go b/app/app.go index 6b0b8391a6..63ab69ccec 100644 --- a/app/app.go +++ b/app/app.go @@ -1255,7 +1255,9 @@ func (app *Evmos) setupUpgradeHandlers() { v16.CreateUpgradeHandler( app.mm, app.configurator, app.EvmKeeper, + app.BankKeeper, app.InflationKeeper, + app.AccountKeeper, ), ) diff --git a/app/upgrades/v16/feecollector.go b/app/upgrades/v16/feecollector.go new file mode 100644 index 0000000000..7ae93fe4ab --- /dev/null +++ b/app/upgrades/v16/feecollector.go @@ -0,0 +1,33 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package v16 + +import ( + "fmt" + + sdk "github.com/cosmos/cosmos-sdk/types" + authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" + "github.com/cosmos/cosmos-sdk/x/auth/types" +) + +// MigrateFeeCollector migrates the fee collector module account to include the `Burner` permission. +func MigrateFeeCollector(ak authkeeper.AccountKeeper, ctx sdk.Context) error { + feeCollectorModuleAccount := ak.GetModuleAccount(ctx, types.FeeCollectorName) + if feeCollectorModuleAccount == nil { + return fmt.Errorf("fee collector module account not found") + } + + modAcc, ok := feeCollectorModuleAccount.(*types.ModuleAccount) + if !ok { + return fmt.Errorf("fee collector module account is not a module account") + } + + // Create a new FeeCollector module account with the same address and balance as the old one. + newFeeCollectorModuleAccount := types.NewModuleAccount(modAcc.BaseAccount, types.FeeCollectorName, types.Burner) + + // Override the FeeCollector module account in the auth keeper. + ak.SetModuleAccount(ctx, newFeeCollectorModuleAccount) + + return nil +} diff --git a/app/upgrades/v16/upgrades.go b/app/upgrades/v16/upgrades.go index 2c19b56c4b..f0f2e412bb 100644 --- a/app/upgrades/v16/upgrades.go +++ b/app/upgrades/v16/upgrades.go @@ -5,6 +5,8 @@ package v16 import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" + authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" + bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" "github.com/evmos/evmos/v16/precompiles/bech32" osmosisoutpost "github.com/evmos/evmos/v16/precompiles/outposts/osmosis" @@ -20,7 +22,9 @@ func CreateUpgradeHandler( mm *module.Manager, configurator module.Configurator, ek *evmkeeper.Keeper, + _ bankkeeper.Keeper, inflationKeeper inflationkeeper.Keeper, + _ authkeeper.AccountKeeper, ) upgradetypes.UpgradeHandler { return func(ctx sdk.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { logger := ctx.Logger().With("upgrade", UpgradeName) @@ -41,6 +45,16 @@ func CreateUpgradeHandler( logger.Error("failed to enable outposts", "error", err.Error()) } + // TODO: uncomment when ready + // Migrate the FeeCollector module account to include the Burner permission. + // if err := MigrateFeeCollector(ak, ctx); err != nil { + // logger.Error("failed to migrate the fee collector", "error", err.Error()) + // } + // + // if err := BurnUsageIncentivesPool(ctx, bankKeeper); err != nil { + // logger.Error("failed to burn inflation pool", "error", err.Error()) + // } + if err := UpdateInflationParams(ctx, inflationKeeper); err != nil { logger.Error("failed to update inflation params", "error", err.Error()) } diff --git a/app/upgrades/v16/upgrades_test.go b/app/upgrades/v16/upgrades_test.go index 30d434ed68..1b32420d4e 100644 --- a/app/upgrades/v16/upgrades_test.go +++ b/app/upgrades/v16/upgrades_test.go @@ -6,12 +6,37 @@ package v16_test import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth/types" v16 "github.com/evmos/evmos/v16/app/upgrades/v16" testnetwork "github.com/evmos/evmos/v16/testutil/integration/evmos/network" "github.com/evmos/evmos/v16/utils" ) +func (its *IntegrationTestSuite) TestMigrateFeeCollector() { + its.SetupTest() + + feeCollectorModuleAccount := its.network.App.AccountKeeper.GetModuleAccount(its.network.GetContext(), types.FeeCollectorName) + modAcc, ok := feeCollectorModuleAccount.(*types.ModuleAccount) + its.Require().True(ok) + + oldFeeCollector := types.NewModuleAccount(modAcc.BaseAccount, types.FeeCollectorName) + + its.Require().NotNil(oldFeeCollector) + its.Require().Len(oldFeeCollector.GetPermissions(), 0) + + // Create a new FeeCollector module account with the same address and the new permissions. + newFeeCollectorModuleAccount := types.NewModuleAccount(modAcc.BaseAccount, types.FeeCollectorName, types.Burner) + its.network.App.AccountKeeper.SetModuleAccount(its.network.GetContext(), newFeeCollectorModuleAccount) + + newFeeCollector := its.network.App.AccountKeeper.GetModuleAccount(its.network.GetContext(), types.FeeCollectorName) + its.Require().True(ok) + its.Require().Equal(feeCollectorModuleAccount.GetAccountNumber(), newFeeCollector.GetAccountNumber()) + its.Require().Equal(feeCollectorModuleAccount.GetAddress(), newFeeCollector.GetAddress()) + its.Require().Equal(feeCollectorModuleAccount.GetName(), newFeeCollector.GetName()) + its.Require().Equal(feeCollectorModuleAccount.GetPermissions(), newFeeCollector.GetPermissions()) +} + func (its *IntegrationTestSuite) TestBurnUsageIncentivesPool() { its.SetupTest() // check initial balance of incentives mod account From 3f6f4d8ac3b1315ba4bc8e5e8db09b1ee04388e9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Dec 2023 11:36:47 +0100 Subject: [PATCH 016/345] build(deps): bump actions/labeler from 4 to 5 (#2136) Bumps [actions/labeler](https://github.com/actions/labeler) from 4 to 5. - [Release notes](https://github.com/actions/labeler/releases) - [Commits](https://github.com/actions/labeler/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/labeler dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/labeler.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index a897fd5d16..4d3b7b61d1 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -9,6 +9,6 @@ jobs: triage: runs-on: ubuntu-latest steps: - - uses: actions/labeler@v4 + - uses: actions/labeler@v5 with: repo-token: "${{ secrets.GITHUB_TOKEN }}" From c31dc0d89dfdeeddbf1dd0bbfc3e407920dae89c Mon Sep 17 00:00:00 2001 From: Luke Date: Tue, 5 Dec 2023 19:02:42 +0800 Subject: [PATCH 017/345] imp(staking): replace bech32 address with evm hex address for Createvalidator function (#2122) * imp(staking): replace bech32 address with evm hex address for Createvalidator function * imp(staking): remove delegatorAddress for function createValidator and event CreateValidator * Update CHANGELOG.md * chore: update comment --------- Co-authored-by: Vladislav Varadinov Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> --- CHANGELOG.md | 3 ++- precompiles/staking/StakingI.sol | 6 +---- precompiles/staking/abi.json | 13 +--------- precompiles/staking/events.go | 29 +++++++++++++++------ precompiles/staking/events_test.go | 4 --- precompiles/staking/tx.go | 11 ++++---- precompiles/staking/tx_test.go | 41 ++++-------------------------- precompiles/staking/types.go | 28 ++++++++------------ 8 files changed, 46 insertions(+), 89 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5cef5273b4..65883ac292 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -128,12 +128,13 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (bank-precompile) [#2096](https://github.com/evmos/evmos/pull/2096) Add `bank` precompile integration tests. - (osmosis-outpost) [#2077](https://github.com/evmos/evmos/pull/2077) Update Osmosis outpost to use cross-chain swap contract V1. - (app) [#2104](https://github.com/evmos/evmos/pull/2104) Refactor code to use `sdkmath.Int` and `sdkmath.LegacyDec` instead of the SDK types -- (staking) [#2105](https://github.com/evmos/evmos/pull/2105) Detect the length of the ed25519 pubkey in precompile CreateValidator to prevent panic. +- (staking-precompile) [#2105](https://github.com/evmos/evmos/pull/2105) Detect the length of the ed25519 pubkey in precompile `CreateValidator` to prevent panic. - (p256-precompile) [#2110](https://github.com/evmos/evmos/pull/2110) Adjust `p256` precompile address. - (upgrade) [#2117](https://github.com/evmos/evmos/pull/2117) Enable Stride and Osmosis outposts in v16 upgrade handler. - (osmosis-outpost) [#2109](https://github.com/evmos/evmos/pull/2109) Add Osmosis outpost to available EVM extensions. - (osmosis-outpost) [#2029](https://github.com/evmos/evmos/pull/2029) Add Osmosis outpost end-to-end tests. - (upgrade) [#2131](https://github.com/evmos/evmos/pull/2131) Remove incentives pool burning logic from upgrade handler. +- (staking-precompile) [#2122](https://github.com/evmos/evmos/pull/2122) Replace bech32 address with EVM hex address for `CreateValidator` function and remove delegator address argument. ### Bug Fixes diff --git a/precompiles/staking/StakingI.sol b/precompiles/staking/StakingI.sol index 10107b8a43..113cd1725c 100644 --- a/precompiles/staking/StakingI.sol +++ b/precompiles/staking/StakingI.sol @@ -129,7 +129,6 @@ interface StakingI is authorization.AuthorizationI { /// @param description The initial description /// @param commissionRates The initial commissionRates /// @param minSelfDelegation The validator's self declared minimum self delegation - /// @param delegatorAddress The delegator address /// @param validatorAddress The validator address /// @param pubkey The consensus public key of the validator /// @param value The amount of the coin to be self delegated to the validator @@ -138,8 +137,7 @@ interface StakingI is authorization.AuthorizationI { Description calldata description, CommissionRates calldata commissionRates, uint256 minSelfDelegation, - address delegatorAddress, - string memory validatorAddress, + address validatorAddress, string memory pubkey, uint256 value ) external returns (bool success); @@ -269,11 +267,9 @@ interface StakingI is authorization.AuthorizationI { ); /// @dev CreateValidator defines an Event emitted when a create a new validator. - /// @param delegatorAddress The address of the delegator /// @param validatorAddress The address of the validator /// @param value The amount of coin being self delegated event CreateValidator( - address indexed delegatorAddress, address indexed validatorAddress, uint256 value ); diff --git a/precompiles/staking/abi.json b/precompiles/staking/abi.json index ce886071fb..c35c79a947 100644 --- a/precompiles/staking/abi.json +++ b/precompiles/staking/abi.json @@ -95,12 +95,6 @@ { "anonymous": false, "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "delegatorAddress", - "type": "address" - }, { "indexed": true, "internalType": "address", @@ -396,13 +390,8 @@ }, { "internalType": "address", - "name": "delegatorAddress", - "type": "address" - }, - { - "internalType": "string", "name": "validatorAddress", - "type": "string" + "type": "address" }, { "internalType": "string", diff --git a/precompiles/staking/events.go b/precompiles/staking/events.go index ef90c39f32..e7c01e5423 100644 --- a/precompiles/staking/events.go +++ b/precompiles/staking/events.go @@ -125,16 +125,11 @@ func (p Precompile) EmitAllowanceChangeEvent(ctx sdk.Context, stateDB vm.StateDB } // EmitCreateValidatorEvent creates a new create validator event emitted on a CreateValidator transaction. -func (p Precompile) EmitCreateValidatorEvent(ctx sdk.Context, stateDB vm.StateDB, msg *stakingtypes.MsgCreateValidator, delegatorAddr common.Address) error { +func (p Precompile) EmitCreateValidatorEvent(ctx sdk.Context, stateDB vm.StateDB, msg *stakingtypes.MsgCreateValidator, validatorAddr common.Address) error { // Prepare the event topics event := p.ABI.Events[EventTypeCreateValidator] - valAddr, err := sdk.ValAddressFromBech32(msg.ValidatorAddress) - if err != nil { - return err - } - - topics, err := p.createStakingTxTopics(3, event, delegatorAddr, common.BytesToAddress(valAddr.Bytes())) + topics, err := p.createValidatorTxTopics(2, event, validatorAddr) if err != nil { return err } @@ -289,7 +284,7 @@ func (p Precompile) EmitCancelUnbondingDelegationEvent(ctx sdk.Context, stateDB return nil } -// createStakingTxTopics creates the topics for staking transactions CreateValidator, Delegate, Undelegate, Redelegate and CancelUnbondingDelegation. +// createStakingTxTopics creates the topics for staking transactions Delegate, Undelegate, Redelegate and CancelUnbondingDelegation. func (p Precompile) createStakingTxTopics(topicsLen uint64, event abi.Event, delegatorAddr common.Address, validatorAddr common.Address) ([]common.Hash, error) { topics := make([]common.Hash, topicsLen) // NOTE: If your solidity event contains indexed event types, then they become a topic rather than part of the data property of the log. @@ -311,3 +306,21 @@ func (p Precompile) createStakingTxTopics(topicsLen uint64, event abi.Event, del return topics, nil } + +// createValidatorTxTopics creates the topics for staking transaction CreateValidator. +func (p Precompile) createValidatorTxTopics(topicsLen uint64, event abi.Event, validatorAddr common.Address) ([]common.Hash, error) { + topics := make([]common.Hash, topicsLen) + // NOTE: If your solidity event contains indexed event types, then they become a topic rather than part of the data property of the log. + // In solidity you may only have up to 4 topics but only 3 indexed event types. The first topic is always the signature of the event. + + // The first topic is always the signature of the event. + topics[0] = event.ID + + var err error + topics[1], err = cmn.MakeTopic(validatorAddr) + if err != nil { + return nil, err + } + + return topics, nil +} diff --git a/precompiles/staking/events_test.go b/precompiles/staking/events_test.go index 7ab9c8f8d6..585dd89f3f 100644 --- a/precompiles/staking/events_test.go +++ b/precompiles/staking/events_test.go @@ -230,7 +230,6 @@ func (s *PrecompileTestSuite) TestCreateValidatorEvent() { var ( delegationValue = big.NewInt(1205000000000000000) method = s.precompile.Methods[staking.CreateValidatorMethod] - operatorAddress = sdk.ValAddress(s.address.Bytes()).String() pubkey = "nfJ0axJC9dhta1MAE1EBFaVdxxkYzxYrBaHuJVjG//M=" ) @@ -259,7 +258,6 @@ func (s *PrecompileTestSuite) TestCreateValidatorEvent() { }, big.NewInt(1), s.address, - operatorAddress, pubkey, delegationValue, } @@ -277,7 +275,6 @@ func (s *PrecompileTestSuite) TestCreateValidatorEvent() { var createValidatorEvent staking.EventCreateValidator err := cmn.UnpackLog(s.precompile.ABI, &createValidatorEvent, staking.EventTypeCreateValidator, *log) s.Require().NoError(err) - s.Require().Equal(s.address, createValidatorEvent.DelegatorAddress) s.Require().Equal(s.address, createValidatorEvent.ValidatorAddress) s.Require().Equal(delegationValue, createValidatorEvent.Value) }, @@ -287,7 +284,6 @@ func (s *PrecompileTestSuite) TestCreateValidatorEvent() { for _, tc := range testCases { s.Run(tc.name, func() { s.SetupTest() // reset - operatorAddress = sdk.ValAddress(s.address.Bytes()).String() contract := vm.NewContract(vm.AccountRef(s.address), s.precompile, big.NewInt(0), 200000) _, err := s.precompile.CreateValidator(s.ctx, s.address, contract, s.stateDB, &method, tc.malleate()) diff --git a/precompiles/staking/tx.go b/precompiles/staking/tx.go index b288d2d207..d55d6097aa 100644 --- a/precompiles/staking/tx.go +++ b/precompiles/staking/tx.go @@ -54,7 +54,7 @@ func (p Precompile) CreateValidator( method *abi.Method, args []interface{}, ) ([]byte, error) { - msg, delegatorHexAddr, err := NewMsgCreateValidator(args, p.stakingKeeper.BondDenom(ctx)) + msg, validatorHexAddr, err := NewMsgCreateValidator(args, p.stakingKeeper.BondDenom(ctx)) if err != nil { return nil, err } @@ -64,15 +64,14 @@ func (p Precompile) CreateValidator( "method", method.Name, "commission", msg.Commission.String(), "min_self_delegation", msg.MinSelfDelegation.String(), - "delegator_address", delegatorHexAddr.String(), - "validator_address", msg.ValidatorAddress, + "validator_address", validatorHexAddr.String(), "pubkey", msg.Pubkey.String(), "value", msg.Value.Amount.String(), ) // we only allow the tx signer "origin" to create their own validator. - if origin != delegatorHexAddr { - return nil, fmt.Errorf(ErrDifferentOriginFromDelegator, origin.String(), delegatorHexAddr.String()) + if origin != validatorHexAddr { + return nil, fmt.Errorf(ErrDifferentOriginFromDelegator, origin.String(), validatorHexAddr.String()) } // Execute the transaction using the message server @@ -82,7 +81,7 @@ func (p Precompile) CreateValidator( } // Emit the event for the delegate transaction - if err = p.EmitCreateValidatorEvent(ctx, stateDB, msg, delegatorHexAddr); err != nil { + if err = p.EmitCreateValidatorEvent(ctx, stateDB, msg, validatorHexAddr); err != nil { return nil, err } diff --git a/precompiles/staking/tx_test.go b/precompiles/staking/tx_test.go index b8de9a406f..62674b5c70 100644 --- a/precompiles/staking/tx_test.go +++ b/precompiles/staking/tx_test.go @@ -32,8 +32,7 @@ func (s *PrecompileTestSuite) TestCreateValidator() { MaxChangeRate: math.LegacyOneDec().BigInt(), } minSelfDelegation = big.NewInt(1) - delegatorAddress = s.address - validatorAddress = sdk.ValAddress(s.address.Bytes()).String() + validatorAddress = s.address pubkey = "nfJ0axJC9dhta1MAE1EBFaVdxxkYzxYrBaHuJVjG//M=" value = big.NewInt(1205000000000000000) ) @@ -54,7 +53,7 @@ func (s *PrecompileTestSuite) TestCreateValidator() { 200000, func(data []byte) {}, true, - fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 7, 0), + fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 6, 0), }, { "fail - different origin than delegator", @@ -65,7 +64,6 @@ func (s *PrecompileTestSuite) TestCreateValidator() { commission, minSelfDelegation, differentAddr, - sdk.ValAddress(differentAddr.Bytes()).String(), pubkey, value, } @@ -82,7 +80,6 @@ func (s *PrecompileTestSuite) TestCreateValidator() { "", commission, minSelfDelegation, - delegatorAddress, validatorAddress, pubkey, value, @@ -100,7 +97,6 @@ func (s *PrecompileTestSuite) TestCreateValidator() { description, "", minSelfDelegation, - delegatorAddress, validatorAddress, pubkey, value, @@ -118,7 +114,6 @@ func (s *PrecompileTestSuite) TestCreateValidator() { description, commission, "", - delegatorAddress, validatorAddress, pubkey, value, @@ -129,24 +124,6 @@ func (s *PrecompileTestSuite) TestCreateValidator() { true, "invalid amount", }, - { - "fail - invalid delegator address", - func() []interface{} { - return []interface{}{ - description, - commission, - minSelfDelegation, - "", - validatorAddress, - pubkey, - value, - } - }, - 200000, - func(data []byte) {}, - true, - "invalid delegator address", - }, { "fail - invalid validator address", func() []interface{} { @@ -154,7 +131,6 @@ func (s *PrecompileTestSuite) TestCreateValidator() { description, commission, minSelfDelegation, - delegatorAddress, 1205, pubkey, value, @@ -163,7 +139,7 @@ func (s *PrecompileTestSuite) TestCreateValidator() { 200000, func(data []byte) {}, true, - "invalid type for", + "invalid validator address", }, { "fail - invalid pubkey", @@ -172,7 +148,6 @@ func (s *PrecompileTestSuite) TestCreateValidator() { description, commission, minSelfDelegation, - delegatorAddress, validatorAddress, 1205, value, @@ -190,7 +165,6 @@ func (s *PrecompileTestSuite) TestCreateValidator() { description, commission, minSelfDelegation, - delegatorAddress, validatorAddress, "bHVrZQ=", // base64.StdEncoding.DecodeString error value, @@ -208,7 +182,6 @@ func (s *PrecompileTestSuite) TestCreateValidator() { description, commission, minSelfDelegation, - delegatorAddress, validatorAddress, "bHVrZQ==", value, @@ -226,7 +199,6 @@ func (s *PrecompileTestSuite) TestCreateValidator() { description, commission, minSelfDelegation, - delegatorAddress, validatorAddress, pubkey, "", @@ -244,7 +216,6 @@ func (s *PrecompileTestSuite) TestCreateValidator() { description, commission, minSelfDelegation, - delegatorAddress, validatorAddress, pubkey, value, @@ -268,7 +239,6 @@ func (s *PrecompileTestSuite) TestCreateValidator() { var createValidatorEvent staking.EventCreateValidator err = cmn.UnpackLog(s.precompile.ABI, &createValidatorEvent, staking.EventTypeCreateValidator, *log) s.Require().NoError(err) - s.Require().Equal(s.address, createValidatorEvent.DelegatorAddress) s.Require().Equal(s.address, createValidatorEvent.ValidatorAddress) s.Require().Equal(value, createValidatorEvent.Value) }, @@ -282,8 +252,7 @@ func (s *PrecompileTestSuite) TestCreateValidator() { s.SetupTest() // reset sender - delegatorAddress = s.address - validatorAddress = sdk.ValAddress(s.address.Bytes()).String() + validatorAddress = s.address var contract *vm.Contract contract, s.ctx = testutil.NewPrecompileContract(s.T(), s.ctx, s.address, s.precompile, tc.gas) @@ -310,7 +279,7 @@ func (s *PrecompileTestSuite) TestCreateValidator() { s.Require().Equal(pubkey, consPubKeyBase64, "expected validator pubkey to be %s; got %s", pubkey, consPubKeyBase64) operator := validator.GetOperator().String() - s.Require().Equal(validatorAddress, operator, "expected validator operator to be %s; got %s", validatorAddress, operator) + s.Require().Equal(sdk.ValAddress(validatorAddress.Bytes()).String(), operator, "expected validator operator to be %s; got %s", validatorAddress, operator) commissionRate := validator.GetCommission() s.Require().Equal(commission.Rate.String(), commissionRate.BigInt().String(), "expected validator commission rate to be %s; got %s", commission.Rate.String(), commissionRate.String()) diff --git a/precompiles/staking/types.go b/precompiles/staking/types.go index 2d6950eed0..bdf1792e31 100644 --- a/precompiles/staking/types.go +++ b/precompiles/staking/types.go @@ -24,7 +24,6 @@ import ( // EventCreateValidator defines the event data for the staking CreateValidator transaction. type EventCreateValidator struct { - DelegatorAddress common.Address ValidatorAddress common.Address Value *big.Int } @@ -82,8 +81,8 @@ type Commission = struct { // NewMsgCreateValidator creates a new MsgCreateValidator instance and does sanity checks // on the given arguments before populating the message. func NewMsgCreateValidator(args []interface{}, denom string) (*stakingtypes.MsgCreateValidator, common.Address, error) { - if len(args) != 7 { - return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 7, len(args)) + if len(args) != 6 { + return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 6, len(args)) } description := stakingtypes.Description{} @@ -111,18 +110,13 @@ func NewMsgCreateValidator(args []interface{}, denom string) (*stakingtypes.MsgC return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidAmount, args[2]) } - delegatorAddress, ok := args[3].(common.Address) - if !ok || delegatorAddress == (common.Address{}) { - return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidDelegator, args[3]) - } - - validatorAddress, ok := args[4].(string) - if !ok { - return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidType, "validatorAddress", "string", args[4]) + validatorAddress, ok := args[3].(common.Address) + if !ok || validatorAddress == (common.Address{}) { + return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidValidator, args[4]) } // use cli `evmosd tendermint show-validator` get pubkey - pubkeyBase64Str, ok := args[5].(string) + pubkeyBase64Str, ok := args[4].(string) if !ok { return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidType, "pubkey", "string", args[5]) } @@ -142,17 +136,17 @@ func NewMsgCreateValidator(args []interface{}, denom string) (*stakingtypes.MsgC return nil, common.Address{}, err } - value, ok := args[6].(*big.Int) + value, ok := args[5].(*big.Int) if !ok { - return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidAmount, args[6]) + return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidAmount, args[5]) } msg := &stakingtypes.MsgCreateValidator{ Description: description, Commission: commission, MinSelfDelegation: math.NewIntFromBigInt(minSelfDelegation), - DelegatorAddress: sdk.AccAddress(delegatorAddress.Bytes()).String(), - ValidatorAddress: validatorAddress, + DelegatorAddress: sdk.AccAddress(validatorAddress.Bytes()).String(), + ValidatorAddress: sdk.ValAddress(validatorAddress.Bytes()).String(), Pubkey: pubkey, Value: sdk.Coin{Denom: denom, Amount: math.NewIntFromBigInt(value)}, } @@ -161,7 +155,7 @@ func NewMsgCreateValidator(args []interface{}, denom string) (*stakingtypes.MsgC return nil, common.Address{}, err } - return msg, delegatorAddress, nil + return msg, validatorAddress, nil } // NewMsgDelegate creates a new MsgDelegate instance and does sanity checks From 562b2e09f0f490e347652d2cf1dd8cb10117669a Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Tue, 5 Dec 2023 11:16:47 -0300 Subject: [PATCH 018/345] chore(app): replace imports to use storetypes (#2138) * chore: replace imports to use storetypes * add changelog entry --- CHANGELOG.md | 1 + app/ante/cosmos/setup_test.go | 3 ++- app/ante/evm/eth_test.go | 9 +++++---- app/ante/evm/setup_test.go | 3 ++- app/ante/evm/utils_test.go | 3 ++- app/ante/handler_options.go | 4 ++-- app/ante/sigverify.go | 6 +++--- app/ante/sigverify_test.go | 3 ++- app/ante/utils/setup_test.go | 3 ++- app/export.go | 3 ++- precompiles/common/precompile.go | 6 +++--- precompiles/erc20/erc20.go | 5 +++-- types/gasmeter.go | 20 ++++++++++---------- x/epochs/keeper/epoch_infos.go | 3 ++- x/erc20/keeper/token_pairs.go | 3 ++- x/evm/handler_test.go | 3 ++- x/evm/keeper/state_transition_test.go | 3 ++- x/evm/keeper/statedb.go | 3 ++- x/feemarket/keeper/abci_test.go | 4 ++-- x/inflation/v1/migrations/v3/migrate.go | 4 ++-- x/revenue/v1/keeper/revenues.go | 5 +++-- 21 files changed, 56 insertions(+), 41 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 65883ac292..cec84ea20d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -135,6 +135,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (osmosis-outpost) [#2029](https://github.com/evmos/evmos/pull/2029) Add Osmosis outpost end-to-end tests. - (upgrade) [#2131](https://github.com/evmos/evmos/pull/2131) Remove incentives pool burning logic from upgrade handler. - (staking-precompile) [#2122](https://github.com/evmos/evmos/pull/2122) Replace bech32 address with EVM hex address for `CreateValidator` function and remove delegator address argument. +- (app) [#2138](https://github.com/evmos/evmos/pull/2138) Replace imports of store related types and functions to use Cosmos-SDK `store/types` package. ### Bug Fixes diff --git a/app/ante/cosmos/setup_test.go b/app/ante/cosmos/setup_test.go index 96cefc292d..9bc8cd52f8 100644 --- a/app/ante/cosmos/setup_test.go +++ b/app/ante/cosmos/setup_test.go @@ -12,6 +12,7 @@ import ( tmproto "github.com/cometbft/cometbft/proto/tendermint/types" "github.com/cosmos/cosmos-sdk/client" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + storetypes "github.com/cosmos/cosmos-sdk/store/types" "github.com/cosmos/cosmos-sdk/testutil/testdata" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" @@ -92,7 +93,7 @@ func (suite *AnteTestSuite) SetupTest() { suite.ctx = suite.app.BaseApp.NewContext(checkTx, tmproto.Header{Height: 2, ChainID: chainID, Time: time.Now().UTC()}) suite.ctx = suite.ctx.WithMinGasPrices(sdk.NewDecCoins(sdk.NewDecCoin(utils.BaseDenom, sdkmath.OneInt()))) - suite.ctx = suite.ctx.WithBlockGasMeter(sdk.NewGasMeter(1000000000000000000)) + suite.ctx = suite.ctx.WithBlockGasMeter(storetypes.NewGasMeter(1000000000000000000)) stakingParams := suite.app.StakingKeeper.GetParams(suite.ctx) stakingParams.BondDenom = utils.BaseDenom diff --git a/app/ante/evm/eth_test.go b/app/ante/evm/eth_test.go index 357f094fbe..6668fe30b2 100644 --- a/app/ante/evm/eth_test.go +++ b/app/ante/evm/eth_test.go @@ -5,6 +5,7 @@ import ( "math/big" sdkmath "cosmossdk.io/math" + storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" ethante "github.com/evmos/evmos/v16/app/ante/evm" @@ -329,7 +330,7 @@ func (suite *AnteTestSuite) TestEthGasConsumeDecorator() { 0, func(ctx sdk.Context) sdk.Context { vmdb.AddBalance(addr, big.NewInt(1e6)) - return ctx.WithBlockGasMeter(sdk.NewGasMeter(1)) + return ctx.WithBlockGasMeter(storetypes.NewGasMeter(1)) }, false, true, 0, @@ -341,7 +342,7 @@ func (suite *AnteTestSuite) TestEthGasConsumeDecorator() { tx2GasLimit, // it's capped func(ctx sdk.Context) sdk.Context { vmdb.AddBalance(addr, big.NewInt(1e16)) - return ctx.WithBlockGasMeter(sdk.NewGasMeter(1e19)) + return ctx.WithBlockGasMeter(storetypes.NewGasMeter(1e19)) }, true, false, tx2Priority, @@ -353,7 +354,7 @@ func (suite *AnteTestSuite) TestEthGasConsumeDecorator() { tx2GasLimit, // it's capped func(ctx sdk.Context) sdk.Context { vmdb.AddBalance(addr, big.NewInt(1e16)) - return ctx.WithBlockGasMeter(sdk.NewGasMeter(1e19)) + return ctx.WithBlockGasMeter(storetypes.NewGasMeter(1e19)) }, true, false, dynamicFeeTxPriority, @@ -472,7 +473,7 @@ func (suite *AnteTestSuite) TestEthGasConsumeDecorator() { if tc.expPanic { suite.Require().Panics(func() { - _, _ = dec.AnteHandle(cacheCtx.WithIsCheckTx(true).WithGasMeter(sdk.NewGasMeter(1)), tc.tx, false, testutil.NextFn) + _, _ = dec.AnteHandle(cacheCtx.WithIsCheckTx(true).WithGasMeter(storetypes.NewGasMeter(1)), tc.tx, false, testutil.NextFn) }) return } diff --git a/app/ante/evm/setup_test.go b/app/ante/evm/setup_test.go index 1ffdbddc5e..7d921f0072 100644 --- a/app/ante/evm/setup_test.go +++ b/app/ante/evm/setup_test.go @@ -11,6 +11,7 @@ import ( sdkmath "cosmossdk.io/math" "cosmossdk.io/simapp" "github.com/cosmos/cosmos-sdk/client" + storetypes "github.com/cosmos/cosmos-sdk/store/types" "github.com/cosmos/cosmos-sdk/testutil/testdata" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" @@ -74,7 +75,7 @@ func (suite *AnteTestSuite) SetupTest() { suite.ctx = suite.app.BaseApp.NewContext(checkTx, tmproto.Header{Height: 2, ChainID: utils.TestnetChainID + "-1", Time: time.Now().UTC()}) suite.ctx = suite.ctx.WithMinGasPrices(sdk.NewDecCoins(sdk.NewDecCoin(evmtypes.DefaultEVMDenom, sdkmath.OneInt()))) - suite.ctx = suite.ctx.WithBlockGasMeter(sdk.NewGasMeter(1000000000000000000)) + suite.ctx = suite.ctx.WithBlockGasMeter(storetypes.NewGasMeter(1000000000000000000)) // set staking denomination to Evmos denom params := suite.app.StakingKeeper.GetParams(suite.ctx) diff --git a/app/ante/evm/utils_test.go b/app/ante/evm/utils_test.go index 88df0d92fb..ca8c34340e 100644 --- a/app/ante/evm/utils_test.go +++ b/app/ante/evm/utils_test.go @@ -9,6 +9,7 @@ import ( "cosmossdk.io/math" "github.com/cosmos/cosmos-sdk/codec" + storetypes "github.com/cosmos/cosmos-sdk/store/types" "github.com/cosmos/cosmos-sdk/x/auth/migrations/legacytx" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" @@ -661,7 +662,7 @@ func (suite *AnteTestSuite) prepareAccount(ctx sdk.Context, addr sdk.AccAddress, ) suite.Require().NoError(err, "error while preparing accounts for delegation rewards") return ctx. - WithBlockGasMeter(sdk.NewGasMeter(1e19)). + WithBlockGasMeter(storetypes.NewGasMeter(1e19)). WithBlockHeight(ctx.BlockHeight() + 1) } diff --git a/app/ante/handler_options.go b/app/ante/handler_options.go index 39e71840dd..ef3ccba70b 100644 --- a/app/ante/handler_options.go +++ b/app/ante/handler_options.go @@ -6,7 +6,7 @@ package ante import ( errorsmod "cosmossdk.io/errors" "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" + storetypes "github.com/cosmos/cosmos-sdk/store/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/types/tx/signing" "github.com/cosmos/cosmos-sdk/x/auth/ante" @@ -35,7 +35,7 @@ type HandlerOptions struct { FeegrantKeeper ante.FeegrantKeeper ExtensionOptionChecker ante.ExtensionOptionChecker SignModeHandler authsigning.SignModeHandler - SigGasConsumer func(meter sdk.GasMeter, sig signing.SignatureV2, params authtypes.Params) error + SigGasConsumer func(meter storetypes.GasMeter, sig signing.SignatureV2, params authtypes.Params) error MaxTxGasWanted uint64 TxFeeChecker anteutils.TxFeeChecker } diff --git a/app/ante/sigverify.go b/app/ante/sigverify.go index f2d8922993..ab9ffd6ed4 100644 --- a/app/ante/sigverify.go +++ b/app/ante/sigverify.go @@ -9,7 +9,7 @@ import ( errorsmod "cosmossdk.io/errors" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/crypto/types/multisig" - sdk "github.com/cosmos/cosmos-sdk/types" + storetypes "github.com/cosmos/cosmos-sdk/store/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/types/tx/signing" authante "github.com/cosmos/cosmos-sdk/x/auth/ante" @@ -35,7 +35,7 @@ const ( // // - multisig (Cosmos SDK multisigs) func SigVerificationGasConsumer( - meter sdk.GasMeter, sig signing.SignatureV2, params authtypes.Params, + meter storetypes.GasMeter, sig signing.SignatureV2, params authtypes.Params, ) error { pubkey := sig.PubKey switch pubkey := pubkey.(type) { @@ -64,7 +64,7 @@ func SigVerificationGasConsumer( // ConsumeMultisignatureVerificationGas consumes gas from a GasMeter for verifying a multisig pubkey signature func ConsumeMultisignatureVerificationGas( - meter sdk.GasMeter, sig *signing.MultiSignatureData, pubkey multisig.PubKey, + meter storetypes.GasMeter, sig *signing.MultiSignatureData, pubkey multisig.PubKey, params authtypes.Params, accSeq uint64, ) error { size := sig.BitArray.Count() diff --git a/app/ante/sigverify_test.go b/app/ante/sigverify_test.go index cef461f9d2..5b93058e46 100644 --- a/app/ante/sigverify_test.go +++ b/app/ante/sigverify_test.go @@ -11,6 +11,7 @@ import ( "github.com/cosmos/cosmos-sdk/crypto/keys/secp256r1" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/cosmos/cosmos-sdk/crypto/types/multisig" + storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/tx/signing" "github.com/cosmos/cosmos-sdk/x/auth/migrations/legacytx" @@ -47,7 +48,7 @@ func TestConsumeSignatureVerificationGas(t *testing.T) { skR1, _ := secp256r1.GenPrivKey() type args struct { - meter sdk.GasMeter + meter storetypes.GasMeter sig signing.SignatureData pubkey cryptotypes.PubKey params authtypes.Params diff --git a/app/ante/utils/setup_test.go b/app/ante/utils/setup_test.go index ac7b28102a..e14a608f1d 100644 --- a/app/ante/utils/setup_test.go +++ b/app/ante/utils/setup_test.go @@ -6,6 +6,7 @@ import ( "time" tmproto "github.com/cometbft/cometbft/proto/tendermint/types" + storetypes "github.com/cosmos/cosmos-sdk/store/types" "github.com/stretchr/testify/suite" sdkmath "cosmossdk.io/math" @@ -72,7 +73,7 @@ func (suite *AnteTestSuite) SetupTest() { suite.ctx = suite.app.BaseApp.NewContext(checkTx, tmproto.Header{Height: 1, ChainID: utils.TestnetChainID + "-1", Time: time.Now().UTC()}) suite.ctx = suite.ctx.WithMinGasPrices(sdk.NewDecCoins(sdk.NewDecCoin(evmtypes.DefaultEVMDenom, sdkmath.OneInt()))) - suite.ctx = suite.ctx.WithBlockGasMeter(sdk.NewGasMeter(1000000000000000000)) + suite.ctx = suite.ctx.WithBlockGasMeter(storetypes.NewGasMeter(1000000000000000000)) suite.app.EvmKeeper.WithChainID(suite.ctx) // set staking denomination to Evmos denom diff --git a/app/export.go b/app/export.go index 17825add09..f5bc244d50 100644 --- a/app/export.go +++ b/app/export.go @@ -11,6 +11,7 @@ import ( "cosmossdk.io/simapp" servertypes "github.com/cosmos/cosmos-sdk/server/types" + storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" "github.com/cosmos/cosmos-sdk/x/staking" @@ -177,7 +178,7 @@ func (app *Evmos) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs []s // Iterate through validators by power descending, reset bond heights, and // update bond intra-tx counters. store := ctx.KVStore(app.keys[stakingtypes.StoreKey]) - iter := sdk.KVStoreReversePrefixIterator(store, stakingtypes.ValidatorsKey) + iter := storetypes.KVStoreReversePrefixIterator(store, stakingtypes.ValidatorsKey) counter := int16(0) for ; iter.Valid(); iter.Next() { diff --git a/precompiles/common/precompile.go b/precompiles/common/precompile.go index e2ed2481ee..c5bea6de85 100644 --- a/precompiles/common/precompile.go +++ b/precompiles/common/precompile.go @@ -44,7 +44,7 @@ func (p Precompile) RunSetup( contract *vm.Contract, readOnly bool, isTransaction func(name string) bool, -) (ctx sdk.Context, stateDB *statedb.StateDB, method *abi.Method, gasConfig sdk.Gas, args []interface{}, err error) { +) (ctx sdk.Context, stateDB *statedb.StateDB, method *abi.Method, gasConfig storetypes.Gas, args []interface{}, err error) { stateDB, ok := evm.StateDB.(*statedb.StateDB) if !ok { return sdk.Context{}, nil, nil, uint64(0), nil, fmt.Errorf(ErrNotRunInEvm) @@ -97,7 +97,7 @@ func (p Precompile) RunSetup( // set the default SDK gas configuration to track gas usage // we are changing the gas meter type, so it panics gracefully when out of gas - ctx = ctx.WithGasMeter(sdk.NewGasMeter(contract.Gas)). + ctx = ctx.WithGasMeter(storetypes.NewGasMeter(contract.Gas)). WithKVGasConfig(p.KvGasConfig). WithTransientKVGasConfig(p.TransientKVGasConfig) // we need to consume the gas that was already used by the EVM @@ -108,7 +108,7 @@ func (p Precompile) RunSetup( // HandleGasError handles the out of gas panic by resetting the gas meter and returning an error. // This is used in order to avoid panics and to allow for the EVM to continue cleanup if the tx or query run out of gas. -func HandleGasError(ctx sdk.Context, contract *vm.Contract, initialGas sdk.Gas, err *error) func() { +func HandleGasError(ctx sdk.Context, contract *vm.Contract, initialGas storetypes.Gas, err *error) func() { return func() { if r := recover(); r != nil { switch r.(type) { diff --git a/precompiles/erc20/erc20.go b/precompiles/erc20/erc20.go index 52167c092d..4ccde1f401 100644 --- a/precompiles/erc20/erc20.go +++ b/precompiles/erc20/erc20.go @@ -13,6 +13,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" + storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" @@ -70,8 +71,8 @@ func NewPrecompile( ABI: newABI, AuthzKeeper: authzKeeper, ApprovalExpiration: cmn.DefaultExpirationDuration, - KvGasConfig: sdk.GasConfig{}, - TransientKVGasConfig: sdk.GasConfig{}, + KvGasConfig: storetypes.GasConfig{}, + TransientKVGasConfig: storetypes.GasConfig{}, }, tokenPair: tokenPair, bankKeeper: bankKeeper, diff --git a/types/gasmeter.go b/types/gasmeter.go index 2c662b55d6..99a232472f 100644 --- a/types/gasmeter.go +++ b/types/gasmeter.go @@ -6,7 +6,7 @@ import ( fmt "fmt" math "math" - sdk "github.com/cosmos/cosmos-sdk/types" + storetypes "github.com/cosmos/cosmos-sdk/store/types" ) // ErrorNegativeGasConsumed defines an error thrown when the amount of gas refunded results in a @@ -23,12 +23,12 @@ type ErrorGasOverflow struct { } type infiniteGasMeterWithLimit struct { - consumed sdk.Gas - limit sdk.Gas + consumed storetypes.Gas + limit storetypes.Gas } // NewInfiniteGasMeterWithLimit returns a reference to a new infiniteGasMeter. -func NewInfiniteGasMeterWithLimit(limit sdk.Gas) sdk.GasMeter { +func NewInfiniteGasMeterWithLimit(limit storetypes.Gas) storetypes.GasMeter { return &infiniteGasMeterWithLimit{ consumed: 0, limit: limit, @@ -36,7 +36,7 @@ func NewInfiniteGasMeterWithLimit(limit sdk.Gas) sdk.GasMeter { } // GasConsumed returns the gas consumed from the GasMeter. -func (g *infiniteGasMeterWithLimit) GasConsumed() sdk.Gas { +func (g *infiniteGasMeterWithLimit) GasConsumed() storetypes.Gas { return g.consumed } @@ -44,12 +44,12 @@ func (g *infiniteGasMeterWithLimit) GasConsumed() sdk.Gas { // otherwise it returns the consumed gas. // NOTE: This behavior is only called when recovering from panic when // BlockGasMeter consumes gas past the limit. -func (g *infiniteGasMeterWithLimit) GasConsumedToLimit() sdk.Gas { +func (g *infiniteGasMeterWithLimit) GasConsumedToLimit() storetypes.Gas { return g.consumed } // Limit returns the gas limit of the GasMeter. -func (g *infiniteGasMeterWithLimit) Limit() sdk.Gas { +func (g *infiniteGasMeterWithLimit) Limit() storetypes.Gas { return g.limit } @@ -64,7 +64,7 @@ func addUint64Overflow(a, b uint64) (uint64, bool) { } // ConsumeGas adds the given amount of gas to the gas consumed and panics if it overflows the limit or out of gas. -func (g *infiniteGasMeterWithLimit) ConsumeGas(amount sdk.Gas, descriptor string) { +func (g *infiniteGasMeterWithLimit) ConsumeGas(amount storetypes.Gas, descriptor string) { var overflow bool // TODO: Should we set the consumed field after overflow checking? g.consumed, overflow = addUint64Overflow(g.consumed, amount) @@ -79,7 +79,7 @@ func (g *infiniteGasMeterWithLimit) ConsumeGas(amount sdk.Gas, descriptor string // Use case: This functionality enables refunding gas to the trasaction or block gas pools so that // EVM-compatible chains can fully support the go-ethereum StateDb interface. // See https://github.com/cosmos/cosmos-sdk/pull/9403 for reference. -func (g *infiniteGasMeterWithLimit) RefundGas(amount sdk.Gas, descriptor string) { +func (g *infiniteGasMeterWithLimit) RefundGas(amount storetypes.Gas, descriptor string) { if g.consumed < amount { panic(ErrorNegativeGasConsumed{Descriptor: descriptor}) } @@ -103,6 +103,6 @@ func (g *infiniteGasMeterWithLimit) String() string { } // GasRemaining returns MaxUint64 since limit is not confined in infiniteGasMeter. -func (g *infiniteGasMeterWithLimit) GasRemaining() sdk.Gas { +func (g *infiniteGasMeterWithLimit) GasRemaining() storetypes.Gas { return math.MaxUint64 } diff --git a/x/epochs/keeper/epoch_infos.go b/x/epochs/keeper/epoch_infos.go index f08839283f..10e0745d74 100644 --- a/x/epochs/keeper/epoch_infos.go +++ b/x/epochs/keeper/epoch_infos.go @@ -5,6 +5,7 @@ package keeper import ( "github.com/cosmos/cosmos-sdk/store/prefix" + storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/evmos/evmos/v16/x/epochs/types" @@ -40,7 +41,7 @@ func (k Keeper) DeleteEpochInfo(ctx sdk.Context, identifier string) { func (k Keeper) IterateEpochInfo(ctx sdk.Context, fn func(index int64, epochInfo types.EpochInfo) (stop bool)) { store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefixEpoch) - iterator := sdk.KVStorePrefixIterator(store, nil) + iterator := storetypes.KVStorePrefixIterator(store, nil) defer iterator.Close() i := int64(0) diff --git a/x/erc20/keeper/token_pairs.go b/x/erc20/keeper/token_pairs.go index c3f6aa7492..7cfe812035 100644 --- a/x/erc20/keeper/token_pairs.go +++ b/x/erc20/keeper/token_pairs.go @@ -6,6 +6,7 @@ package keeper import ( errorsmod "cosmossdk.io/errors" "github.com/cosmos/cosmos-sdk/store/prefix" + storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" "github.com/evmos/evmos/v16/utils" @@ -27,7 +28,7 @@ func (k Keeper) GetTokenPairs(ctx sdk.Context) []types.TokenPair { // IterateTokenPairs iterates over all the stored token pairs. func (k Keeper) IterateTokenPairs(ctx sdk.Context, cb func(tokenPair types.TokenPair) (stop bool)) { store := ctx.KVStore(k.storeKey) - iterator := sdk.KVStorePrefixIterator(store, types.KeyPrefixTokenPair) + iterator := storetypes.KVStorePrefixIterator(store, types.KeyPrefixTokenPair) defer iterator.Close() for ; iterator.Valid(); iterator.Next() { diff --git a/x/evm/handler_test.go b/x/evm/handler_test.go index 84f1eb59aa..17879d8764 100644 --- a/x/evm/handler_test.go +++ b/x/evm/handler_test.go @@ -31,6 +31,7 @@ import ( "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/crypto/keyring" + storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/evmos/evmos/v16/app" @@ -529,7 +530,7 @@ func (suite *EvmTestSuite) TestOutOfGasWhenDeployContract() { // Deploy contract - Owner.sol gasLimit := uint64(1) - suite.ctx = suite.ctx.WithGasMeter(sdk.NewGasMeter(gasLimit)) + suite.ctx = suite.ctx.WithGasMeter(storetypes.NewGasMeter(gasLimit)) gasPrice := big.NewInt(10000) bytecode := common.FromHex("0x608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73560405160405180910390a36102c4806100dc6000396000f3fe608060405234801561001057600080fd5b5060043610610053576000357c010000000000000000000000000000000000000000000000000000000090048063893d20e814610058578063a6f9dae1146100a2575b600080fd5b6100606100e6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6100e4600480360360208110156100b857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061010f565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f43616c6c6572206973206e6f74206f776e65720000000000000000000000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73560405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505056fea265627a7a72315820f397f2733a89198bc7fed0764083694c5b828791f39ebcbc9e414bccef14b48064736f6c63430005100032") diff --git a/x/evm/keeper/state_transition_test.go b/x/evm/keeper/state_transition_test.go index 5551c19082..34f35ab74c 100644 --- a/x/evm/keeper/state_transition_test.go +++ b/x/evm/keeper/state_transition_test.go @@ -10,6 +10,7 @@ import ( tmproto "github.com/cometbft/cometbft/proto/tendermint/types" tmtypes "github.com/cometbft/cometbft/types" codectypes "github.com/cosmos/cosmos-sdk/codec/types" + storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/common" @@ -502,7 +503,7 @@ func (suite *KeeperTestSuite) TestResetGasMeterAndConsumeGas() { suite.SetupTest() // reset panicF := func() { - gm := sdk.NewGasMeter(10) + gm := storetypes.NewGasMeter(10) gm.ConsumeGas(tc.gasConsumed, "") ctx := suite.ctx.WithGasMeter(gm) suite.app.EvmKeeper.ResetGasMeterAndConsumeGas(ctx, tc.gasUsed) diff --git a/x/evm/keeper/statedb.go b/x/evm/keeper/statedb.go index 011fc8a012..77ad70aa78 100644 --- a/x/evm/keeper/statedb.go +++ b/x/evm/keeper/statedb.go @@ -10,6 +10,7 @@ import ( errorsmod "cosmossdk.io/errors" "github.com/cosmos/cosmos-sdk/store/prefix" + storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" evmostypes "github.com/evmos/evmos/v16/types" @@ -57,7 +58,7 @@ func (k *Keeper) ForEachStorage(ctx sdk.Context, addr common.Address, cb func(ke store := ctx.KVStore(k.storeKey) prefix := types.AddressStoragePrefix(addr) - iterator := sdk.KVStorePrefixIterator(store, prefix) + iterator := storetypes.KVStorePrefixIterator(store, prefix) defer iterator.Close() for ; iterator.Valid(); iterator.Next() { diff --git a/x/feemarket/keeper/abci_test.go b/x/feemarket/keeper/abci_test.go index f57301caac..ae338c93db 100644 --- a/x/feemarket/keeper/abci_test.go +++ b/x/feemarket/keeper/abci_test.go @@ -4,7 +4,7 @@ import ( "fmt" "github.com/cometbft/cometbft/abci/types" - sdk "github.com/cosmos/cosmos-sdk/types" + storetypes "github.com/cosmos/cosmos-sdk/store/types" ) func (suite *KeeperTestSuite) TestEndBlock() { @@ -24,7 +24,7 @@ func (suite *KeeperTestSuite) TestEndBlock() { "pass", false, func() { - meter := sdk.NewGasMeter(uint64(1000000000)) + meter := storetypes.NewGasMeter(uint64(1000000000)) suite.ctx = suite.ctx.WithBlockGasMeter(meter) suite.app.FeeMarketKeeper.SetTransientBlockGasWanted(suite.ctx, 5000000) }, diff --git a/x/inflation/v1/migrations/v3/migrate.go b/x/inflation/v1/migrations/v3/migrate.go index 08513d25f2..6a8e39b1d3 100644 --- a/x/inflation/v1/migrations/v3/migrate.go +++ b/x/inflation/v1/migrations/v3/migrate.go @@ -4,7 +4,7 @@ package v3 import ( - sdk "github.com/cosmos/cosmos-sdk/types" + storetypes "github.com/cosmos/cosmos-sdk/store/types" ) // prefix bytes for the inflation persistent store @@ -15,7 +15,7 @@ var KeyPrefixEpochMintProvision = []byte{prefixEpochMintProvision} // MigrateStore migrates the x/inflation module state from the consensus version 2 to // version 3. Specifically, it deletes the EpochMintProvision from the store -func MigrateStore(store sdk.KVStore) error { +func MigrateStore(store storetypes.KVStore) error { store.Delete(KeyPrefixEpochMintProvision) return nil } diff --git a/x/revenue/v1/keeper/revenues.go b/x/revenue/v1/keeper/revenues.go index cdee8ec04b..7577c4be61 100644 --- a/x/revenue/v1/keeper/revenues.go +++ b/x/revenue/v1/keeper/revenues.go @@ -5,6 +5,7 @@ package keeper import ( "github.com/cosmos/cosmos-sdk/store/prefix" + storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" @@ -16,7 +17,7 @@ func (k Keeper) GetRevenues(ctx sdk.Context) []types.Revenue { revenues := []types.Revenue{} store := ctx.KVStore(k.storeKey) - iterator := sdk.KVStorePrefixIterator(store, types.KeyPrefixRevenue) + iterator := storetypes.KVStorePrefixIterator(store, types.KeyPrefixRevenue) defer iterator.Close() for ; iterator.Valid(); iterator.Next() { @@ -36,7 +37,7 @@ func (k Keeper) IterateRevenues( handlerFn func(fee types.Revenue) (stop bool), ) { store := ctx.KVStore(k.storeKey) - iterator := sdk.KVStorePrefixIterator(store, types.KeyPrefixRevenue) + iterator := storetypes.KVStorePrefixIterator(store, types.KeyPrefixRevenue) defer iterator.Close() for ; iterator.Valid(); iterator.Next() { From 697f581ba5ec1e77c81f02e3d81afdf523dee130 Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Tue, 5 Dec 2023 11:26:00 -0300 Subject: [PATCH 019/345] chore(app): remove old upgrade handlers logic (#2139) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: remove old upgrade handlers logic * add changelog entry * add v15 upgrade folder for e2e test * fix comment --------- Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> --- CHANGELOG.md | 1 + app/app.go | 168 +- app/forks.go | 54 - app/upgrades/v10/constants.go | 11 - app/upgrades/v10/upgrades.go | 47 - app/upgrades/v11/accounts.go | 5933 -------- app/upgrades/v11/constants.go | 19 - app/upgrades/v11/upgrades.go | 219 - app/upgrades/v11/upgrades_test.go | 373 - app/upgrades/v12/accounts.go | 19177 -------------------------- app/upgrades/v12/constants.go | 13 - app/upgrades/v12/upgrades.go | 68 - app/upgrades/v12/upgrades_test.go | 106 - app/upgrades/v13/constants.go | 11 - app/upgrades/v13/upgrades.go | 36 - app/upgrades/v14/constants.go | 11 - app/upgrades/v14/migrations.go | 155 - app/upgrades/v14/migrations_test.go | 201 - app/upgrades/v14/setup_test.go | 44 - app/upgrades/v14/upgrades.go | 163 - app/upgrades/v14/upgrades_test.go | 37 - app/upgrades/v14/utils_test.go | 318 - app/upgrades/v14/vesting.go | 37 - app/upgrades/v14/vesting_test.go | 51 - app/upgrades/v15/setup_test.go | 33 - app/upgrades/v15/upgrades.go | 46 +- app/upgrades/v15/upgrades_test.go | 84 - app/upgrades/v15/utils_test.go | 195 - app/upgrades/v8/constants.go | 15 - app/upgrades/v8/upgrades.go | 28 - app/upgrades/v8/upgrades_test.go | 72 - app/upgrades/v8_1/constants.go | 15 - app/upgrades/v8_1/upgrades.go | 28 - app/upgrades/v8_2/constants.go | 13 - app/upgrades/v8_2/upgrades.go | 32 - app/upgrades/v9/accounts.go | 2165 --- app/upgrades/v9/constants.go | 13 - app/upgrades/v9/upgrades.go | 68 - app/upgrades/v9/upgrades_test.go | 113 - app/upgrades/v9_1/accounts.go | 2165 --- app/upgrades/v9_1/constants.go | 13 - app/upgrades/v9_1/upgrades.go | 86 - app/upgrades/v9_1/upgrades_test.go | 203 - 43 files changed, 6 insertions(+), 32634 deletions(-) delete mode 100644 app/forks.go delete mode 100644 app/upgrades/v10/constants.go delete mode 100644 app/upgrades/v10/upgrades.go delete mode 100644 app/upgrades/v11/accounts.go delete mode 100644 app/upgrades/v11/constants.go delete mode 100644 app/upgrades/v11/upgrades.go delete mode 100644 app/upgrades/v11/upgrades_test.go delete mode 100644 app/upgrades/v12/accounts.go delete mode 100644 app/upgrades/v12/constants.go delete mode 100644 app/upgrades/v12/upgrades.go delete mode 100644 app/upgrades/v12/upgrades_test.go delete mode 100644 app/upgrades/v13/constants.go delete mode 100644 app/upgrades/v13/upgrades.go delete mode 100644 app/upgrades/v14/constants.go delete mode 100644 app/upgrades/v14/migrations.go delete mode 100644 app/upgrades/v14/migrations_test.go delete mode 100644 app/upgrades/v14/setup_test.go delete mode 100644 app/upgrades/v14/upgrades.go delete mode 100644 app/upgrades/v14/upgrades_test.go delete mode 100644 app/upgrades/v14/utils_test.go delete mode 100644 app/upgrades/v14/vesting.go delete mode 100644 app/upgrades/v14/vesting_test.go delete mode 100644 app/upgrades/v15/setup_test.go delete mode 100644 app/upgrades/v15/upgrades_test.go delete mode 100644 app/upgrades/v15/utils_test.go delete mode 100644 app/upgrades/v8/constants.go delete mode 100644 app/upgrades/v8/upgrades.go delete mode 100644 app/upgrades/v8/upgrades_test.go delete mode 100644 app/upgrades/v8_1/constants.go delete mode 100644 app/upgrades/v8_1/upgrades.go delete mode 100644 app/upgrades/v8_2/constants.go delete mode 100644 app/upgrades/v8_2/upgrades.go delete mode 100644 app/upgrades/v9/accounts.go delete mode 100644 app/upgrades/v9/constants.go delete mode 100644 app/upgrades/v9/upgrades.go delete mode 100644 app/upgrades/v9/upgrades_test.go delete mode 100644 app/upgrades/v9_1/accounts.go delete mode 100644 app/upgrades/v9_1/constants.go delete mode 100644 app/upgrades/v9_1/upgrades.go delete mode 100644 app/upgrades/v9_1/upgrades_test.go diff --git a/CHANGELOG.md b/CHANGELOG.md index cec84ea20d..8832e0a80f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -135,6 +135,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (osmosis-outpost) [#2029](https://github.com/evmos/evmos/pull/2029) Add Osmosis outpost end-to-end tests. - (upgrade) [#2131](https://github.com/evmos/evmos/pull/2131) Remove incentives pool burning logic from upgrade handler. - (staking-precompile) [#2122](https://github.com/evmos/evmos/pull/2122) Replace bech32 address with EVM hex address for `CreateValidator` function and remove delegator address argument. +- (app) [#2139](https://github.com/evmos/evmos/pull/2139) Remove old upgrade handlers logic. - (app) [#2138](https://github.com/evmos/evmos/pull/2138) Replace imports of store related types and functions to use Cosmos-SDK `store/types` package. ### Bug Fixes diff --git a/app/app.go b/app/app.go index 63ab69ccec..7dd50d1433 100644 --- a/app/app.go +++ b/app/app.go @@ -63,7 +63,6 @@ import ( capabilitykeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" "github.com/cosmos/cosmos-sdk/x/consensus" - crisistypes "github.com/cosmos/cosmos-sdk/x/crisis/types" distr "github.com/cosmos/cosmos-sdk/x/distribution" distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" @@ -125,18 +124,7 @@ import ( "github.com/evmos/evmos/v16/app/ante" ethante "github.com/evmos/evmos/v16/app/ante/evm" "github.com/evmos/evmos/v16/app/post" - v10 "github.com/evmos/evmos/v16/app/upgrades/v10" - v11 "github.com/evmos/evmos/v16/app/upgrades/v11" - v12 "github.com/evmos/evmos/v16/app/upgrades/v12" - v13 "github.com/evmos/evmos/v16/app/upgrades/v13" - v14 "github.com/evmos/evmos/v16/app/upgrades/v14" - v15 "github.com/evmos/evmos/v16/app/upgrades/v15" v16 "github.com/evmos/evmos/v16/app/upgrades/v16" - v8 "github.com/evmos/evmos/v16/app/upgrades/v8" - v81 "github.com/evmos/evmos/v16/app/upgrades/v8_1" - v82 "github.com/evmos/evmos/v16/app/upgrades/v8_2" - v9 "github.com/evmos/evmos/v16/app/upgrades/v9" - v91 "github.com/evmos/evmos/v16/app/upgrades/v9_1" "github.com/evmos/evmos/v16/encoding" "github.com/evmos/evmos/v16/ethereum/eip712" "github.com/evmos/evmos/v16/precompiles/common" @@ -889,8 +877,6 @@ func (app *Evmos) setPostHandler() { // of the new block for every registered module. If there is a registered fork at the current height, // BeginBlocker will schedule the upgrade plan and perform the state migration (if any). func (app *Evmos) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock { - // Perform any scheduled forks before executing the modules logic - app.ScheduleForkUpgrade(ctx) return app.mm.BeginBlock(ctx, req) } @@ -1141,114 +1127,6 @@ func initParamsKeeper( } func (app *Evmos) setupUpgradeHandlers() { - // v8 upgrade handler - app.UpgradeKeeper.SetUpgradeHandler( - v8.UpgradeName, - v8.CreateUpgradeHandler( - app.mm, app.configurator, - ), - ) - - // v8.1 upgrade handler - app.UpgradeKeeper.SetUpgradeHandler( - v81.UpgradeName, - v81.CreateUpgradeHandler( - app.mm, app.configurator, - ), - ) - - // v8.2 upgrade handler - app.UpgradeKeeper.SetUpgradeHandler( - v82.UpgradeName, - v82.CreateUpgradeHandler( - app.mm, app.configurator, - ), - ) - - // v9 upgrade handler - app.UpgradeKeeper.SetUpgradeHandler( - v9.UpgradeName, - v9.CreateUpgradeHandler( - app.mm, app.configurator, - app.DistrKeeper, - ), - ) - - // v9.1 upgrade handler - app.UpgradeKeeper.SetUpgradeHandler( - v91.UpgradeName, - v91.CreateUpgradeHandler( - app.mm, app.configurator, - app.DistrKeeper, - ), - ) - - // v10 upgrade handler - app.UpgradeKeeper.SetUpgradeHandler( - v10.UpgradeName, - v10.CreateUpgradeHandler( - app.mm, app.configurator, - app.StakingKeeper, - ), - ) - - // v11 upgrade handler - app.UpgradeKeeper.SetUpgradeHandler( - v11.UpgradeName, - v11.CreateUpgradeHandler( - app.mm, app.configurator, - app.AccountKeeper, - app.BankKeeper, - app.StakingKeeper, - app.DistrKeeper, - ), - ) - - // v12 upgrade handler - app.UpgradeKeeper.SetUpgradeHandler( - v12.UpgradeName, - v12.CreateUpgradeHandler( - app.mm, app.configurator, - app.DistrKeeper, - ), - ) - - // v13 upgrade handler - app.UpgradeKeeper.SetUpgradeHandler( - v13.UpgradeName, - v13.CreateUpgradeHandler( - app.mm, app.configurator, - *app.EvmKeeper, - ), - ) - - // !! ATTENTION !! - // v14 upgrade handler - // !! WHEN UPGRADING TO SDK v0.47 MAKE SURE TO INCLUDE THIS - // source: https://github.com/cosmos/cosmos-sdk/blob/release/v0.47.x/UPGRADING.md#xconsensus - app.UpgradeKeeper.SetUpgradeHandler( - v14.UpgradeName, - v14.CreateUpgradeHandler( - app.mm, app.configurator, - app.EvmKeeper, - app.ConsensusParamsKeeper, - app.IBCKeeper.ClientKeeper, - app.ParamsKeeper, - app.appCodec, - ), - ) - - // v15 upgrade handler - app.UpgradeKeeper.SetUpgradeHandler( - v15.UpgradeName, - v15.CreateUpgradeHandler( - app.mm, app.configurator, - app.BankKeeper, - app.EvmKeeper, - app.StakingKeeper, - ), - ) - // v16 upgrade handler app.UpgradeKeeper.SetUpgradeHandler( v16.UpgradeName, @@ -1276,55 +1154,13 @@ func (app *Evmos) setupUpgradeHandlers() { var storeUpgrades *storetypes.StoreUpgrades switch upgradeInfo.Name { - case v8.UpgradeName: - // add revenue module for testnet (v7 -> v8) - storeUpgrades = &storetypes.StoreUpgrades{ - Added: []string{"feesplit"}, - } - case v81.UpgradeName: - // NOTE: store upgrade for mainnet was not registered and was replaced by - // the v8.2 upgrade. - case v82.UpgradeName: - // add missing revenue module for mainnet (v8.1 -> v8.2) - // IMPORTANT: this upgrade CANNOT be executed for testnet! - storeUpgrades = &storetypes.StoreUpgrades{ - Added: []string{revenuetypes.ModuleName}, - Deleted: []string{"feesplit"}, - } - case v9.UpgradeName, v91.UpgradeName: - // no store upgrade in v9 or v9.1 - case v10.UpgradeName: - // no store upgrades in v10 - case v11.UpgradeName: - // add ica host submodule in v11 - // initialize recovery store - storeUpgrades = &storetypes.StoreUpgrades{ - Added: []string{icahosttypes.SubModuleName, "recoveryv1"}, - } - case v12.UpgradeName: - // no store upgrades - case v13.UpgradeName: - // no store upgrades - case v14.UpgradeName: - // !! ATTENTION !! - // !! WHEN UPGRADING TO SDK v0.47 MAKE SURE TO INCLUDE THIS - // source: https://github.com/cosmos/cosmos-sdk/blob/release/v0.47.x/UPGRADING.md - storeUpgrades = &storetypes.StoreUpgrades{ - Added: []string{ - consensusparamtypes.StoreKey, - crisistypes.ModuleName, - }, - } - case v15.UpgradeName: - // crisis module is deprecated in v15 - storeUpgrades = &storetypes.StoreUpgrades{ - Deleted: []string{crisistypes.ModuleName}, - } case v16.UpgradeName: // recovery and incentives modules are deprecated in v16 storeUpgrades = &storetypes.StoreUpgrades{ Deleted: []string{"recoveryv1", "incentives", "claims"}, } + default: + // no-op } if storeUpgrades != nil { diff --git a/app/forks.go b/app/forks.go deleted file mode 100644 index 45d655fc1d..0000000000 --- a/app/forks.go +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package app - -import ( - "fmt" - - sdk "github.com/cosmos/cosmos-sdk/types" - upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - - v82 "github.com/evmos/evmos/v16/app/upgrades/v8_2" - "github.com/evmos/evmos/v16/utils" -) - -// ScheduleForkUpgrade executes any necessary fork logic for based upon the current -// block height and chain ID (mainnet or testnet). It sets an upgrade plan once -// the chain reaches the pre-defined upgrade height. -// -// CONTRACT: for this logic to work properly it is required to: -// -// 1. Release a non-breaking patch version so that the chain can set the scheduled upgrade plan at upgrade-height. -// 2. Release the software defined in the upgrade-info -func (app *Evmos) ScheduleForkUpgrade(ctx sdk.Context) { - // NOTE: there are no testnet forks for the existing versions - if !utils.IsMainnet(ctx.ChainID()) { - return - } - - upgradePlan := upgradetypes.Plan{ - Height: ctx.BlockHeight(), - } - - // handle mainnet forks with their corresponding upgrade name and info - switch ctx.BlockHeight() { - case v82.MainnetUpgradeHeight: - upgradePlan.Name = v82.UpgradeName - upgradePlan.Info = v82.UpgradeInfo - default: - // No-op - return - } - - // schedule the upgrade plan to the current block hight, effectively performing - // a hard fork that uses the upgrade handler to manage the migration. - if err := app.UpgradeKeeper.ScheduleUpgrade(ctx, upgradePlan); err != nil { - panic( - fmt.Errorf( - "failed to schedule upgrade %s during BeginBlock at height %d: %w", - upgradePlan.Name, ctx.BlockHeight(), err, - ), - ) - } -} diff --git a/app/upgrades/v10/constants.go b/app/upgrades/v10/constants.go deleted file mode 100644 index eef9e34d82..0000000000 --- a/app/upgrades/v10/constants.go +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package v10 - -const ( - // UpgradeName is the shared upgrade plan name for mainnet - UpgradeName = "v10.0.0" - // UpgradeInfo defines the binaries that will be used for the upgrade - UpgradeInfo = `'{"binaries":{"darwin/arm64":"https://github.com/evmos/evmos/releases/download/v10.0.0/evmos_10.0.0_Darwin_arm64.tar.gz","darwin/amd64":"https://github.com/evmos/evmos/releases/download/v10.0.0/evmos_10.0.0_Darwin_amd64.tar.gz","linux/arm64":"https://github.com/evmos/evmos/releases/download/v10.0.0/evmos_10.0.0_Linux_arm64.tar.gz","linux/amd64":"https://github.com/evmos/evmos/releases/download/v10.0.0/evmos_10.0.0_Linux_amd64.tar.gz","windows/x86_64":"https://github.com/evmos/evmos/releases/download/v10.0.0/evmos_10.0.0_Windows_x86_64.zip"}}'` -) diff --git a/app/upgrades/v10/upgrades.go b/app/upgrades/v10/upgrades.go deleted file mode 100644 index 3f10ac86d9..0000000000 --- a/app/upgrades/v10/upgrades.go +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package v10 - -import ( - "cosmossdk.io/math" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/module" - stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" -) - -// CreateUpgradeHandler creates an SDK upgrade handler for v10 -func CreateUpgradeHandler( - mm *module.Manager, - configurator module.Configurator, - stakingKeeper stakingkeeper.Keeper, -) upgradetypes.UpgradeHandler { - return func(ctx sdk.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { - logger := ctx.Logger().With("upgrade", UpgradeName) - - if err := setMinCommissionRate(ctx, stakingKeeper); err != nil { - return nil, err - } - - // Leave modules are as-is to avoid running InitGenesis. - logger.Debug("running module migrations ...") - return mm.RunMigrations(ctx, configurator, vm) - } -} - -// setMinCommissionRate sets the minimum commission rate for validators -// to 5%. -func setMinCommissionRate(ctx sdk.Context, sk stakingkeeper.Keeper) error { - stakingParams := stakingtypes.Params{ - UnbondingTime: sk.UnbondingTime(ctx), - MaxValidators: sk.MaxValidators(ctx), - MaxEntries: sk.MaxEntries(ctx), - HistoricalEntries: sk.HistoricalEntries(ctx), - BondDenom: sk.BondDenom(ctx), - MinCommissionRate: math.LegacyNewDecWithPrec(5, 2), // 5% - } - - return sk.SetParams(ctx, stakingParams) -} diff --git a/app/upgrades/v11/accounts.go b/app/upgrades/v11/accounts.go deleted file mode 100644 index 2141e0d39c..0000000000 --- a/app/upgrades/v11/accounts.go +++ /dev/null @@ -1,5933 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) -// This accounts file contains the accounts and corresponding token allocation for -// accounts which participated in the Olympus Mons Testnet (November 2021) through -// completion of the Mars Meteor Missions. The token allocation is in aevmos. - -// 7.5% of the genesis allocation, totaling to ~7.5M Evmos tokens, was set aside for -// participants of the incentivized testnet, of which ~5.6M is claimed here. The -// remaining funds will be sent to the community pool. - -// The participants of the testnet will immediately stake their tokens to a set -// of chosen validators, also included in this file. - -package v11 - -// Allocations are rewards by participant address, along with the randomized validator to stake to. -var Allocations = [1183][3]string{ - { - "evmos1az0eeqw5222en0enxz9ect3s8xy4kayz7khcn2", - "72232472320000001048576", - "evmosvaloper1aep37tvd5yh4ydeya2a88g2tkjz6f2lcrfjumh", - }, - { - "evmos1ksanxvyylh26sdl8ps07y9czmrsg5gmagemgf6", - "48985239849999997599744", - "evmosvaloper1g57n4k08sk5z6ramzsgzrapgpsjsyh4t5tldw5", - }, - { - "evmos1sh9hnwuv8l7x4zvjq0l6erhsrxa9pdr7qw3xke", - "46494464939999998509056", - "evmosvaloper1kualgrr9qup0983gj44fczyvcda8ea47y494mz", - }, - { - "evmos1r30pcna6kmh4njemuq7vpv3p2mnmz36atekfe3", - "39852398519999998722048", - "evmosvaloper1suvf29zmvlmgg92zngez946nj8jrtu4hmxpwqv", - }, - { - "evmos1jv2jl44yky7zqcv9vx5sv9pm5j4gyn2ys7pmvf", - "37361623620000000507904", - "evmosvaloper1h62qm8qcctvcdd8t3jwm9jcc9cwleqjgnsn7ry", - }, - { - "evmos1s5sckwx0h02xw7qkdyu6auj8vq0a5gcr8j2hh9", - "38191881919999997116416", - "evmosvaloper13rh82yhf4zzf9n44e32e7r30ackggkvu6ps426", - }, - { - "evmos1x3ehmyzwrp3hl3qqxnvd6j24kvvqc6yfcfa7y7", - "36531365310000003022848", - "evmosvaloper18lgy886ruwkuaefm2c0sn0gt9kgnj0de3kt6pv", - }, - { - "evmos1lwfuc2lc27mk8yys2zcd0qttcwmnd6x79cly6f", - "33210332099999998935040", - "evmosvaloper1ak9t7kwk44azu6cefqdydqmy3hen28nvdjjvz0", - }, - { - "evmos1qx7u07f2tv5j8677r3ttt97prkc2dgcyvyettg", - "32380073799999998132224", - "evmosvaloper14yeq3lkajldaggj28hmq8xng9xux7x5g86tx29", - }, - { - "evmos1g9rcsa8sr6utp073pdtvqg5xvynv00vs6dcyfp", - "28228782289999997435904", - "evmosvaloper1k5hcl0cjprzewwvzhz3um589kx8skzlrneuepu", - }, - { - "evmos1zqkrqsvrn4hskeywd56gx2dcy50mnyp6rw3m89", - "29889298889999999041536", - "evmosvaloper13h9qxch4r8ep2x8ynwlmcvcl6h902zg5elznhq", - }, - { - "evmos150sqkd22muztwaswv3phgtlaxrtt48073q7ske", - "27398523990000000827392", - "evmosvaloper17vze0tk7q7gwpd6jt69p4m5svrty40yw9a88e3", - }, - { - "evmos1lr7tdf32qchnw6dmwrv6n88g48epkhchdm56ya", - "25738007379999998345216", - "evmosvaloper1qp49y6vh8vvv5yf8ule8fwx6sss82ncz39tunl", - }, - { - "evmos1eu5jfz8hrh8dmh0p9s6vv4zqjztgqxhu2v6ty8", - "24907749080000001736704", - "evmosvaloper1rwy29t3eup0tnaph08rezdjsmckzqemkxh535w", - }, - { - "evmos1ur0zjltn3qs5xzx4rn8ekr828f4tglyh36qgwn", - "24907749080000001736704", - "evmosvaloper1vw7k3z99swlv7svjmnrrqvu6zdmatqhvzuz7lu", - }, - { - "evmos1y8f6u3ctfuemve87d9l5na46qs9ruyhj68eqsk", - "24907749080000001736704", - "evmosvaloper155yk4wfn0xqye80exlsr6hu4qdfsvsgw63w87l", - }, - { - "evmos1cxzyhvvane97uz5pxlvllnppqpdmghjc4k3c7w", - "24077490770000000057344", - "evmosvaloper1g376mzt2kcszpf7y3ee7r8jpseq2zv9hshf5g3", - }, - { - "evmos1rd3acdgvspcwr62696nnnfrge9yw5wcm2qtdm5", - "23247232469999999254528", - "evmosvaloper1hyytyjxr02j72cx0cgjl24s3nn2yrdqqaslk84", - }, - { - "evmos13mp23yk0ee9rdsj2fdhxpmlw9gxr9hwgxp9yfx", - "22416974170000002646016", - "evmosvaloper1chx7v975g72xuw8kdpjt94dh35daqqfyc37kys", - }, - { - "evmos182rn54wqungpxwzwn7f57vyrz34mldxtsr7pfu", - "22416974170000002646016", - "evmosvaloper1k96y0w5wf089nuvvym3s324c8umd3vvm4yh578", - }, - { - "evmos15ksyw7t5t9e7w9n3d2jqqmv7y334mfrhyzrrfy", - "21586715870000001843200", - "evmosvaloper1y6yvdg2xdltzr0v5hvf8zvxk373xwas4jwgvkp", - }, - { - "evmos17ypwsl80ytz0q34g9ycswfl9ulvndu9t26q4ms", - "21586715870000001843200", - "evmosvaloper17jyfw78xztc8crq4t8znjlg8ld76lkzkg2hny3", - }, - { - "evmos1fqhda9k5wp69amalzv6rwxgqvh509k48g66my5", - "21586715870000001843200", - "evmosvaloper1vw7k3z99swlv7svjmnrrqvu6zdmatqhvzuz7lu", - }, - { - "evmos1kv0xzjyy30hx6uqdpceetjyqrr7c43q2ayglwv", - "21586715870000001843200", - "evmosvaloper14yeq3lkajldaggj28hmq8xng9xux7x5g86tx29", - }, - { - "evmos1l36dzm57jx733feh5a225v99syvlsunl8vcddn", - "21586715870000001843200", - "evmosvaloper1vm5fvg57aeqp7xwl3umev7z0364jzvcfzlnfew", - }, - { - "evmos1lldjhjnn32e8vek7cxe9g05nf8j74y0xa6dt3p", - "20756457560000000163840", - "evmosvaloper1qp49y6vh8vvv5yf8ule8fwx6sss82ncz39tunl", - }, - { - "evmos1j6zuz54sum48ylpzjqt4jugjmr4lw6sr3rrweg", - "19926199259999999361024", - "evmosvaloper197ahcv2x9jj0nmvnen4sqqfffhygjga7rk3shu", - }, - { - "evmos1xtjvdu46yu6v75zz66rcxvzeyekcr58fcdmjac", - "19926199259999999361024", - "evmosvaloper1ur0zjltn3qs5xzx4rn8ekr828f4tglyhu50c0w", - }, - { - "evmos1pmrxm04m5f320hrrtutjmys74l89xn5xua4ep3", - "19095940959999998558208", - "evmosvaloper15n2ms99yx2lycwk0msmtlj9yxhtlmqeymtg4c3", - }, - { - "evmos1t703ccll8shpkhwnvmtu5nzrvcaw52u8sa9ww6", - "19095940959999998558208", - "evmosvaloper1chx7v975g72xuw8kdpjt94dh35daqqfyc37kys", - }, - { - "evmos1aw4gm8z8x5wcuk72xxvxgt0ukljul4wettr47k", - "18265682659999997755392", - "evmosvaloper1tczjwjrr36e0l5jjqnwrp95kv8mk57zdmxse4m", - }, - { - "evmos1q3aejvmwj9dxturgk00jv7hkwxld7ny7hm9mz6", - "18265682659999997755392", - "evmosvaloper10xhy8xurfwts9ckjkq0ga92mrjz9txyy6y8l2g", - }, - { - "evmos16e3005la0rap62c8c5jn6kn3uphx4ee5sv502d", - "17435424350000000270336", - "evmosvaloper1fmfhpcc00r6ejuclv2fje3egruruk9upe7tl4s", - }, - { - "evmos1can8lfdushdmp8z9zm82dmpt6gz3r2rstdlhfn", - "16605166049999999467520", - "evmosvaloper1zk0sx2e677293wfmhxngpexu50vps3sdwyef92", - }, - { - "evmos1fhfkklmv764r3u6kqkeflmddr6rlzhf4wtsdc8", - "18265682659999997755392", - "evmosvaloper1lwfuc2lc27mk8yys2zcd0qttcwmnd6x7gks5m5", - }, - { - "evmos1n85q8mhmej8u68lz8gdhfk6v59zsfx9uyqekw3", - "16605166049999999467520", - "evmosvaloper182d5yfc5wwaphwjm5wqj9xmsf0vmp30qrtjllu", - }, - { - "evmos1qdrlk86jah6p8u37qv9jh67pk7l97kckj0sv8s", - "16605166049999999467520", - "evmosvaloper1rvsmc4k7ay8hc6nlz50lw8hskygvdptmwr3rdl", - }, - { - "evmos1q2r0ljt3zd59fnxvk6amfdddqg7y806ghhxkct", - "16605166049999999467520", - "evmosvaloper1vdvflras2n3h7fjhe95h86wsy0z2nlsktngrp8", - }, - { - "evmos1zk0sx2e677293wfmhxngpexu50vps3sdr2keyh", - "16605166049999999467520", - "evmosvaloper1n4kuugnh2z5dsug7egamma7chnjcdfu4jwhq76", - }, - { - "evmos139694lezyzwl64up7m800prwsqhxs5h2ac3rpu", - "15774907750000000761856", - "evmosvaloper1c55g6u7q2uzgks9gjp80sle8n6qcyg64vk64g2", - }, - { - "evmos13zd9uwl0qm65ufvszyn9h68mutvvda6emfycv3", - "15774907750000000761856", - "evmosvaloper1kw03prf96w5rrj53pvhdnmsnr469dn9gqmsqwg", - }, - { - "evmos16ahga2u3q6ueer5me26g7ws2ckjdrx4q4xzj0w", - "15774907750000000761856", - "evmosvaloper17aplkq60nqqnawztjlxyk0wwtc9l2uv955003h", - }, - { - "evmos19frkyd7eqzlcj86nhw6se22vmcp985v650u039", - "15774907750000000761856", - "evmosvaloper1kualgrr9qup0983gj44fczyvcda8ea47y494mz", - }, - { - "evmos19rgfvrhq8xq6sdacfs2au07u63ypsetf5vu2zv", - "15774907750000000761856", - "evmosvaloper1g376mzt2kcszpf7y3ee7r8jpseq2zv9hshf5g3", - }, - { - "evmos19rgvmj734cn3t43qpa6qcmxtekfndk94fuqf05", - "15774907750000000761856", - "evmosvaloper174jlcery04j6r7wgvequeysruyjlhtcmlhnhy2", - }, - { - "evmos1aghrs3cpayfj4x69p0dfy2z092vazalgqdm4fu", - "15774907750000000761856", - "evmosvaloper1tczjwjrr36e0l5jjqnwrp95kv8mk57zdmxse4m", - }, - { - "evmos1cn3mdzauql5af585mq0xksn26lmlh7nav38qm9", - "15774907750000000761856", - "evmosvaloper1ak9t7kwk44azu6cefqdydqmy3hen28nvdjjvz0", - }, - { - "evmos1dynsvwfpm6k4l9lp7ufj9g7a7804he90vwhk6v", - "15774907750000000761856", - "evmosvaloper19fxanpnjlggzuur3m3x0puk5ez7j9lrttexwsw", - }, - { - "evmos1ewy85dtectk68z6cnpt6vmkgsqwkwttgx0kzr2", - "15774907750000000761856", - "evmosvaloper1hn8u6x03mklzdy69r9khsd9q4yft7gmrkz8qkj", - }, - { - "evmos1g2qf5d8jt52d9cwl738uxj9xpr83uyngutu8up", - "15774907750000000761856", - "evmosvaloper1gj8uu6pxcncdtav707a86v3sqva2svn45sx62g", - }, - { - "evmos1g3sm95cmlpl492n9y58lxxa6szl6lfng9f7aee", - "15774907750000000761856", - "evmosvaloper1mtwvpdd57gpkyejd566s24afr9zm5ryq8gwpvj", - }, - { - "evmos1gk9cqangsfrd8dd92fyplmpqhft0zk0fs6hmnt", - "15774907750000000761856", - "evmosvaloper1cpa5rlkxt8x7nu8rnqm9q4wc8qan5ve5cvd8e5", - }, - { - "evmos1k35wzk4slyz2ly9wycjqjs5ed7mwjl2yn4lcvl", - "15774907750000000761856", - "evmosvaloper1hay4kqak5h9zvp0r43y6nggprug4uc2qs0pn0j", - }, - { - "evmos1sq9ggymzx02vcp7kf6yyar83scfm4r22aqn2lv", - "15774907750000000761856", - "evmosvaloper1suvf29zmvlmgg92zngez946nj8jrtu4hmxpwqv", - }, - { - "evmos1uc7zzetewzmvlf6wqjayflgpnafe4ph4atstx8", - "15774907750000000761856", - "evmosvaloper1rhddecqpwfjdkwmu6lmfzekh936kcu6wxs7jxa", - }, - { - "evmos1vthr9lq223lnnrhthk3kyk7tue7kg2ks6n7e32", - "15774907750000000761856", - "evmosvaloper1cw8035q5dh9yc5gmk9zzt6k2ven0w292uuk96v", - }, - { - "evmos1w2alsy4fna57a2wvl2vtgdkfhj9a6nmqray7jm", - "15774907750000000761856", - "evmosvaloper1ak9t7kwk44azu6cefqdydqmy3hen28nvdjjvz0", - }, - { - "evmos1w9vjmxhmt59a6ksscl263wxl9qyjeqv3jtzyup", - "15774907750000000761856", - "evmosvaloper1rhddecqpwfjdkwmu6lmfzekh936kcu6wxs7jxa", - }, - { - "evmos12at63j2zxlrlu8nwf3j02w79xsd58hr9g5xpvr", - "14944649449999999959040", - "evmosvaloper1hn8u6x03mklzdy69r9khsd9q4yft7gmrkz8qkj", - }, - { - "evmos12y933qldd8l0vymhw8j8v8ag2vmmfr3ahj2pyf", - "14944649449999999959040", - "evmosvaloper10pcga9su5me3dp5g4jln49uxjq7c9s2u9qy9zu", - }, - { - "evmos144p4mlj9ju8rencusw2835cjmu9yf2v8h4h2k6", - "14944649449999999959040", - "evmosvaloper18zt355ccyxd3kj23mz5hdz00qqn5lk5kjnj74m", - }, - { - "evmos1fhppaqp7ur2p2stp72k2p84hl8lg8mk6kl6cz8", - "14944649449999999959040", - "evmosvaloper1ce4vh0e5kanlgc7z0rhcemvd8erjnfzcyfecl7", - }, - { - "evmos1fjtf99nr3397k3vrfem6n87m6ecv6nswprl34f", - "14944649449999999959040", - "evmosvaloper1hyytyjxr02j72cx0cgjl24s3nn2yrdqqaslk84", - }, - { - "evmos1qy7cyme9ny8cer3xjgq7wdkleytpmf25ypjhrw", - "14944649449999999959040", - "evmosvaloper1zk0sx2e677293wfmhxngpexu50vps3sdwyef92", - }, - { - "evmos1s95dwnw7vuks688tnzuue0hl6gsczmzjj83yyl", - "14944649449999999959040", - "evmosvaloper1lldjhjnn32e8vek7cxe9g05nf8j74y0xs5zmsu", - }, - { - "evmos1sjpdjamv5lequnx97kye809tguqpk74wtsxx2w", - "14944649449999999959040", - "evmosvaloper1zqkrqsvrn4hskeywd56gx2dcy50mnyp6wq7txc", - }, - { - "evmos1tj978qa50vnykr2afgajzeuxtthgsklka8am5d", - "14944649449999999959040", - "evmosvaloper17hd4fyhqkgply6klljx3ugqemhdgqhe8xu2yu6", - }, - { - "evmos1yuukmlc6cm70tz8kfxke0dljp0krcv9kc6q722", - "14944649449999999959040", - "evmosvaloper1h62qm8qcctvcdd8t3jwm9jcc9cwleqjgnsn7ry", - }, - { - "evmos13xc78t8vte4ta4p5jg9gcxq6w376qfd7jx3lnu", - "14114391140000000376832", - "evmosvaloper1gzycxekfxq2hvu9jt255aajvlakay9nvz4p5jf", - }, - { - "evmos163ytd9n8fgdqy8rcdu7zlurqqt60kxl4glx88j", - "14114391140000000376832", - "evmosvaloper1kw03prf96w5rrj53pvhdnmsnr469dn9gqmsqwg", - }, - { - "evmos16vuseq8dj6ssajelf0gdysspx80n680h3tupsq", - "14114391140000000376832", - "evmosvaloper1wvgslxyxtg798cwsjj9epjcxxj8xqhj4a4pfzq", - }, - { - "evmos1c0w84ukex9036jz8ryg5wqepalk8jw6wwrsxy9", - "14114391140000000376832", - "evmosvaloper15fezptqfn3rmxtl4006ze9plealy4w9xdfamnv", - }, - { - "evmos1dupvq63qg688dnxfettpneqxczxu8tnl55dzr3", - "14114391140000000376832", - "evmosvaloper1ce4vh0e5kanlgc7z0rhcemvd8erjnfzcyfecl7", - }, - { - "evmos1gmfzlmdv55xftch7y20lyk8pruxcm42lvgd003", - "14114391140000000376832", - "evmosvaloper1hay4kqak5h9zvp0r43y6nggprug4uc2qs0pn0j", - }, - { - "evmos1mep3myhl699yd7try3vyseej3t67vxhq7vs0cp", - "14114391140000000376832", - "evmosvaloper182d5yfc5wwaphwjm5wqj9xmsf0vmp30qrtjllu", - }, - { - "evmos1nty2hvt7fgrxeywydmnxferd73xgkdssnly8fz", - "14114391140000000376832", - "evmosvaloper1ce4vh0e5kanlgc7z0rhcemvd8erjnfzcyfecl7", - }, - { - "evmos1qly7jn2grfcpgvzynznnlt4lwu3e85kapaqlqs", - "14114391140000000376832", - "evmosvaloper1gyxqlahz6g9ws5cu0tk3gccgryzja7558f069r", - }, - { - "evmos1qw9899m7fztl4ccedcalw8gxzy55tqfe72m6ap", - "14114391140000000376832", - "evmosvaloper1teve9jdzedzu64mty72qc2888kh7t9hjchp5y2", - }, - { - "evmos1vhvvvhak95dzr82n0duj0w7wdzpm2zpcruyg8e", - "14114391140000000376832", - "evmosvaloper13h9qxch4r8ep2x8ynwlmcvcl6h902zg5elznhq", - }, - { - "evmos1vs0vvzpudrattan5pqs9caa38uavj467gdyyqw", - "14114391140000000376832", - "evmosvaloper14yeq3lkajldaggj28hmq8xng9xux7x5g86tx29", - }, - { - "evmos1wzx5g45x7reftxzl3ss0lgk0wh08egmywxqvke", - "14114391140000000376832", - "evmosvaloper18zt355ccyxd3kj23mz5hdz00qqn5lk5kjnj74m", - }, - { - "evmos10uhneplsx9rgd4vhkark6q46rg0j4keu2c9t4r", - "13284132839999999574016", - "evmosvaloper1suvf29zmvlmgg92zngez946nj8jrtu4hmxpwqv", - }, - { - "evmos13dysll8r9wy7x98vtvpdrqcd26gfjywpvcpv58", - "13284132839999999574016", - "evmosvaloper16jr6ewgp0ypu39z80lywgzwjrx99vxcq4sdfzf", - }, - { - "evmos13hga38afe9ktszfxeaypxl8xacvfqn2ldzwgl7", - "13284132839999999574016", - "evmosvaloper1qq95x6dhrdnrfunlth5uh24tkrfphzl9crd3xr", - }, - { - "evmos13sexeke9mvn47yd4uh6x2qa3648fgec38f3k8e", - "13284132839999999574016", - "evmosvaloper1ae6cgh398k7axy6a8jgsv3sw82tckt9202w38y", - }, - { - "evmos14jrpqgzp88ss3x4l4pckr240qd92nn3sp20ww0", - "13284132839999999574016", - "evmosvaloper13h9qxch4r8ep2x8ynwlmcvcl6h902zg5elznhq", - }, - { - "evmos15aa3nkkf4n422003xrsz3kayk2hz3mnep20xph", - "13284132839999999574016", - "evmosvaloper1x5y65hgngh77sxta6s2vpjnfjep3ltllyhf2hs", - }, - { - "evmos15anw5r543tlrrr695c9tm3fttlf8ny7vhxga8c", - "13284132839999999574016", - "evmosvaloper1rwy29t3eup0tnaph08rezdjsmckzqemkxh535w", - }, - { - "evmos15p5u6ej83hmh6el65r0x4c94xknzmfr6wcv2d6", - "13284132839999999574016", - "evmosvaloper1zk0sx2e677293wfmhxngpexu50vps3sdwyef92", - }, - { - "evmos15smejuzpr3hf6j4q4hqpegxh8lvfkdaeqlnkwg", - "13284132839999999574016", - "evmosvaloper1x5y65hgngh77sxta6s2vpjnfjep3ltllyhf2hs", - }, - { - "evmos174hcfhz3xfkl0au59ec4f4vwu0qza9h3uukt05", - "13284132839999999574016", - "evmosvaloper1w2j20fj2a4wfmvqnhfhv4mfxkw5xxt09x8esyj", - }, - { - "evmos17axhhvm3gustyyz66zr8waw5n2rnzngkspx9kf", - "13284132839999999574016", - "evmosvaloper1k9lay7ec328u2cmmtp8m8309msztt5hz7euvcc", - }, - { - "evmos185wj273hn9h8v289cz5rj4al4a0yata6azw2xx", - "13284132839999999574016", - "evmosvaloper12a6wa97lsv8wm62j07tz0xeqvfxddzyfg72d45", - }, - { - "evmos18xs4vw9007naqpvk73g8mn2y5c6d3znpgdcxmg", - "13284132839999999574016", - "evmosvaloper16ywlfq3ansuh70tjtenazpdwcn6rg279gjadep", - }, - { - "evmos1dk4ste222kp256ky00553nexna0rh38htynnm9", - "13284132839999999574016", - "evmosvaloper174jlcery04j6r7wgvequeysruyjlhtcmlhnhy2", - }, - { - "evmos1efg8du326wfp7a6qkymqfpcy8fjkyelupk2l4a", - "13284132839999999574016", - "evmosvaloper148hpdcvge7jgjr4xxjufcq56w5k4rr0pnnqxla", - }, - { - "evmos1fa4p9cajr3hrwz57hlrlw56xcgtn84dpux8ze9", - "13284132839999999574016", - "evmosvaloper1f6m9d94lkenw9fy5wmytatt76l849kx6ugdz70", - }, - { - "evmos1fceafkzfjfuptt9pd2sqszpkyk8latc0cl36df", - "13284132839999999574016", - "evmosvaloper17aplkq60nqqnawztjlxyk0wwtc9l2uv955003h", - }, - { - "evmos1fgk2cjd2dvhnsl22m3gyd4fw5euwckfyygmewa", - "13284132839999999574016", - "evmosvaloper1hyytyjxr02j72cx0cgjl24s3nn2yrdqqaslk84", - }, - { - "evmos1fn9ldnvd5mt2fcn5prq2lhvcga6tmtlh3xrh8v", - "13284132839999999574016", - "evmosvaloper174jlcery04j6r7wgvequeysruyjlhtcmlhnhy2", - }, - { - "evmos1g3wn7klnllv54ctcncnqv037r2puheug78v7s2", - "13284132839999999574016", - "evmosvaloper1x5y65hgngh77sxta6s2vpjnfjep3ltllyhf2hs", - }, - { - "evmos1gp3smgnl92elvknutdz4jvc0yfjfhz9gafhh9s", - "13284132839999999574016", - "evmosvaloper1wvgslxyxtg798cwsjj9epjcxxj8xqhj4a4pfzq", - }, - { - "evmos1h0pvn63nytdqvp0a8mnc24pfzyu87qqdq3wfyd", - "13284132839999999574016", - "evmosvaloper1xsc2lnpf9jwem8kujlqan44ywet3trj2sezfhg", - }, - { - "evmos1h5zzeup9a3qznt3vjfs6lks2duq7te43wjfl8x", - "13284132839999999574016", - "evmosvaloper1k96y0w5wf089nuvvym3s324c8umd3vvm4yh578", - }, - { - "evmos1hesk5hkzmx3fgehydqqx4nfc6j8jakk53p56ks", - "13284132839999999574016", - "evmosvaloper1k96y0w5wf089nuvvym3s324c8umd3vvm4yh578", - }, - { - "evmos1hlptyehtlxvg87fxflj8xtr0ruw56h0strjtgh", - "13284132839999999574016", - "evmosvaloper17vze0tk7q7gwpd6jt69p4m5svrty40yw9a88e3", - }, - { - "evmos1j58303p36p4ystz7d6e7m7emzx6hmhepxz8dre", - "13284132839999999574016", - "evmosvaloper1d74wdckw5vyn6gwqt4r0ruemp9n8vmwtudw848", - }, - { - "evmos1jkn3w5rm7lp0pn07qxc4d3rxdxre7h23t9t6dc", - "13284132839999999574016", - "evmosvaloper19e53dt5r9w2mstt32jnj43xrxlyprnc085tl30", - }, - { - "evmos1lnqkv8xjn44sx43ugta72zuzsetzf0mppyr0lr", - "13284132839999999574016", - "evmosvaloper18zhvafj8jcezdut6z9u0pcsnqy978ya9d25du5", - }, - { - "evmos1n52c3asvsmdxr43m9ss8us4gqt4a0xj43nvf06", - "13284132839999999574016", - "evmosvaloper139gzv3nvlkp4ylrywsnj8eurm6qwp8t3l9a2gy", - }, - { - "evmos1nqsh5k7m5jkj900u75ff7wt5sqmw2m6d64chh9", - "13284132839999999574016", - "evmosvaloper148hpdcvge7jgjr4xxjufcq56w5k4rr0pnnqxla", - }, - { - "evmos1ny0dzf3wkutdfgxkk6us0xwal7gpuj4h7hh7tv", - "13284132839999999574016", - "evmosvaloper1ak9t7kwk44azu6cefqdydqmy3hen28nvdjjvz0", - }, - { - "evmos1q0jmpzettrsz4zrf3lqpdejhgqusy9as6gjwek", - "13284132839999999574016", - "evmosvaloper1hdslyd0vwj8ym368tqc5jdpu6hxrqvx9zex5yz", - }, - { - "evmos1r0q7zg2kxehn5aw9l3dntgtt5mh7j7276sxral", - "13284132839999999574016", - "evmosvaloper1aep37tvd5yh4ydeya2a88g2tkjz6f2lcrfjumh", - }, - { - "evmos1r4egnngxqudu7nsxa6uygcygn36j30v7rlsvk8", - "13284132839999999574016", - "evmosvaloper1wvgslxyxtg798cwsjj9epjcxxj8xqhj4a4pfzq", - }, - { - "evmos1rkqhzw06wuh4w554ppaze8502mv6e0l4u9278z", - "13284132839999999574016", - "evmosvaloper1hdslyd0vwj8ym368tqc5jdpu6hxrqvx9zex5yz", - }, - { - "evmos1sleyg06r6sm32wwgg0m4hn6pkqmwhwmu55qmzm", - "13284132839999999574016", - "evmosvaloper19fxanpnjlggzuur3m3x0puk5ez7j9lrttexwsw", - }, - { - "evmos1srrt9yydqjch6dlf5dzl5us746k9sz7wj9jqwv", - "13284132839999999574016", - "evmosvaloper1teve9jdzedzu64mty72qc2888kh7t9hjchp5y2", - }, - { - "evmos1uamm3sc6zl5ze3mxyas9hmwpmjuc3n7zzt3s22", - "13284132839999999574016", - "evmosvaloper17zaf6jk6gupa0mgnyyt7e4u8y783k6u3wz6avj", - }, - { - "evmos1ugj6zknu8hgxvfryg7ne2g88r0jr9g628elcax", - "13284132839999999574016", - "evmosvaloper1shvcjzhcxau6qtlz9w82a646ecwp4hq7ayqt0w", - }, - { - "evmos1utkd730ym3pgrce88auasgd3gfuf3p2sk38y06", - "13284132839999999574016", - "evmosvaloper1tcty2k97cdv5sc6xcdf2atrrxq0zg7vvjyfsmr", - }, - { - "evmos1uw9wtnzedcf2uqw6ne5wnk6wjyfkcr2at3x793", - "13284132839999999574016", - "evmosvaloper1jk7umxyky5m5dul46t8nxneavlg7eysjr6lfj7", - }, - { - "evmos1v3q2kuups8gzjk2930haevwn08gl9vflq52ty4", - "13284132839999999574016", - "evmosvaloper1mtwvpdd57gpkyejd566s24afr9zm5ryq8gwpvj", - }, - { - "evmos1vg5yr3yj8h5h6c0zex0hv4c3grf0xxe5nflwxl", - "13284132839999999574016", - "evmosvaloper1kualgrr9qup0983gj44fczyvcda8ea47y494mz", - }, - { - "evmos1w4jc45y3kf9c8858ectjfe45suj58t3h266usg", - "13284132839999999574016", - "evmosvaloper1g376mzt2kcszpf7y3ee7r8jpseq2zv9hshf5g3", - }, - { - "evmos1wnvuh7mk3nl0rfu042eytld0dz2mvjrhgy96z8", - "13284132839999999574016", - "evmosvaloper1xaxg47uw046uw8vgpp3da367ctw9aguqjuyyyx", - }, - { - "evmos1xamckefzhg634643h8739dl4m7w5yazkqhgyyh", - "13284132839999999574016", - "evmosvaloper182d5yfc5wwaphwjm5wqj9xmsf0vmp30qrtjllu", - }, - { - "evmos1xrjkctwlvy8vx2w9seq4rc45ldwtnnqewg6fx4", - "13284132839999999574016", - "evmosvaloper1ufg2a3vc4vmsmxtjmckjzltqvz83ste98mr6x5", - }, - { - "evmos1xvrdg707g8kug8k9zlrpqamfukzt5qnc2ja6ll", - "13284132839999999574016", - "evmosvaloper1suvf29zmvlmgg92zngez946nj8jrtu4hmxpwqv", - }, - { - "evmos1y96y6awujpq8sz4vd2rvejxs25mhrs6fd9q0h3", - "13284132839999999574016", - "evmosvaloper155yk4wfn0xqye80exlsr6hu4qdfsvsgw63w87l", - }, - { - "evmos1zayhvj9gxc93236qyf5tal9gnuhh6ntgylduqa", - "13284132839999999574016", - "evmosvaloper1lldjhjnn32e8vek7cxe9g05nf8j74y0xs5zmsu", - }, - { - "evmos1zqf4s6t0r4elu07krs5kquf6meme2qm5ced835", - "13284132839999999574016", - "evmosvaloper1hn8u6x03mklzdy69r9khsd9q4yft7gmrkz8qkj", - }, - { - "evmos1ztk4jpduj3zf88wde4fgrcc0gc4hp2l43fagyh", - "13284132839999999574016", - "evmosvaloper1qmpmzdesg9gr5wpyzkssayldnhk3pa8x2nwlwp", - }, - { - "evmos10dryd7fhdqzvh573temjj6a00fgr8sl4knwrnp", - "12453874540000000868352", - "evmosvaloper1ak9t7kwk44azu6cefqdydqmy3hen28nvdjjvz0", - }, - { - "evmos10fnx27hjwz09rkey5xf68vkce7q56svrph5egj", - "12453874540000000868352", - "evmosvaloper1rhddecqpwfjdkwmu6lmfzekh936kcu6wxs7jxa", - }, - { - "evmos12lru0u89h0hu4ru0mtmfvkqf8thcs5plmlnd5s", - "12453874540000000868352", - "evmosvaloper1jxruqmfurgxrem4phvaqxkvprxa6fr0ncg3t88", - }, - { - "evmos1327v82h5ku83acdruvttp6pdr463dautm6jt8x", - "12453874540000000868352", - "evmosvaloper1tczjwjrr36e0l5jjqnwrp95kv8mk57zdmxse4m", - }, - { - "evmos134y0wa6f454z3azgw24pl64xaanujg4fwvck4j", - "12453874540000000868352", - "evmosvaloper1qq95x6dhrdnrfunlth5uh24tkrfphzl9crd3xr", - }, - { - "evmos13h9qxch4r8ep2x8ynwlmcvcl6h902zg553drka", - "12453874540000000868352", - "evmosvaloper1hdslyd0vwj8ym368tqc5jdpu6hxrqvx9zex5yz", - }, - { - "evmos13nexk54kw2vtll08szfghn3ae44gcrfzz3x0k6", - "12453874540000000868352", - "evmosvaloper1xsc2lnpf9jwem8kujlqan44ywet3trj2sezfhg", - }, - { - "evmos13ss89kza3wr9waf96ht8f4yd9svcfwa2mv6mse", - "12453874540000000868352", - "evmosvaloper1ur0zjltn3qs5xzx4rn8ekr828f4tglyhu50c0w", - }, - { - "evmos15clegjxdx682jnz65h7yrl0p8wy78ujuky5v2w", - "12453874540000000868352", - "evmosvaloper1wvgslxyxtg798cwsjj9epjcxxj8xqhj4a4pfzq", - }, - { - "evmos16cft3hf7vmr065y9pvxadwxt6r4mn794w2sjcn", - "12453874540000000868352", - "evmosvaloper1vm5fvg57aeqp7xwl3umev7z0364jzvcfzlnfew", - }, - { - "evmos16p0nkugmuck4umgkgy928k2gvlk4jgf8exrn7h", - "12453874540000000868352", - "evmosvaloper1kegt9p7se6mpmtt47axx0rwxlp8tr5626pq09u", - }, - { - "evmos17p7chvn0xus6mmkyjyrnwpue2wwvlyce6a7057", - "12453874540000000868352", - "evmosvaloper1x5y65hgngh77sxta6s2vpjnfjep3ltllyhf2hs", - }, - { - "evmos17u4580ck2dwttrllxpyqjqr4702p4csvpp8txg", - "12453874540000000868352", - "evmosvaloper1tcty2k97cdv5sc6xcdf2atrrxq0zg7vvjyfsmr", - }, - { - "evmos1862ed57tg9vrjm34r03n0l427ufzj3z87407qr", - "12453874540000000868352", - "evmosvaloper1jk7umxyky5m5dul46t8nxneavlg7eysjr6lfj7", - }, - { - "evmos195v27mgytr20804sfpmwg2n6x57u28vwaztzqq", - "12453874540000000868352", - "evmosvaloper13rh82yhf4zzf9n44e32e7r30ackggkvu6ps426", - }, - { - "evmos1aj4zvpqcgmxl67dnzupqe2lhp0n5ap5paewx4r", - "12453874540000000868352", - "evmosvaloper18zhvafj8jcezdut6z9u0pcsnqy978ya9d25du5", - }, - { - "evmos1alpdxxnvxywmjgt8vy0y8w6x3tcc8rqazv44ve", - "12453874540000000868352", - "evmosvaloper146mfv59nypacvs5l9h0takrcv8jtlk90wr0ggp", - }, - { - "evmos1c6q5n2s5ezht0y3e8h6zf5d0phwy2tzh3dultf", - "12453874540000000868352", - "evmosvaloper17zaf6jk6gupa0mgnyyt7e4u8y783k6u3wz6avj", - }, - { - "evmos1cv5qqk8ta3jndme555phh00n4kpl2k8jnkkyy2", - "12453874540000000868352", - "evmosvaloper18zt355ccyxd3kj23mz5hdz00qqn5lk5kjnj74m", - }, - { - "evmos1d7243xn5a2k2lnqenh7myvstgzg4azgfl3mnmy", - "12453874540000000868352", - "evmosvaloper1ulkhal0g0fmgsjlf8q7mdd46m6t9sqkhmpfvfd", - }, - { - "evmos1dtkjkctyhvr29ju496ccfxl3d94p2zmj882rhs", - "12453874540000000868352", - "evmosvaloper1cw8035q5dh9yc5gmk9zzt6k2ven0w292uuk96v", - }, - { - "evmos1dtl5tkq7q25p30flrtxqgdfmmre4q43zt834uv", - "12453874540000000868352", - "evmosvaloper1qhazu8zleyn5chrkxymewx3xw5guq2vm6q7zl0", - }, - { - "evmos1epmnzpmqkp3ra4dg9n2ntfxlqx6mqvqy03yxgu", - "12453874540000000868352", - "evmosvaloper1vm5fvg57aeqp7xwl3umev7z0364jzvcfzlnfew", - }, - { - "evmos1f70tgeqh85z3ur7exdzv3ldqfvfkdjaaaf36f6", - "12453874540000000868352", - "evmosvaloper19e53dt5r9w2mstt32jnj43xrxlyprnc085tl30", - }, - { - "evmos1flstpma7djv40pmrv647wtgzpfctw0amvv4gsz", - "12453874540000000868352", - "evmosvaloper13h9qxch4r8ep2x8ynwlmcvcl6h902zg5elznhq", - }, - { - "evmos1g30lnu2xq8cxpcmggyufq44m0p97w0kdpkuct0", - "12453874540000000868352", - "evmosvaloper197ahcv2x9jj0nmvnen4sqqfffhygjga7rk3shu", - }, - { - "evmos1g3h8m30txxrahs6lyemfftmy3hcga2ddnkuj3h", - "12453874540000000868352", - "evmosvaloper1n9f25qr9hkt4alsq3d3jmrc6x246nmc7ghujrh", - }, - { - "evmos1gkj5l80hymyyrext9mdgjjrhdm2du3qshj7c2u", - "12453874540000000868352", - "evmosvaloper1t3rfzrxeslmtz62mydyf2xmmxehwk7xzaaucjd", - }, - { - "evmos1h55ng7772u5zpcydpj32h5d8xuvuqurkf29mqg", - "12453874540000000868352", - "evmosvaloper148hpdcvge7jgjr4xxjufcq56w5k4rr0pnnqxla", - }, - { - "evmos1jg9pv9va6vhzc8dpxmhtq8da45j5j3p7s0e9qk", - "12453874540000000868352", - "evmosvaloper16ywlfq3ansuh70tjtenazpdwcn6rg279gjadep", - }, - { - "evmos1kj8mpf9hu9gtue37swfge7udrlcn07g9zwyzzy", - "12453874540000000868352", - "evmosvaloper1fpjf8aywxg9qxexfwu9lanlgw58f5fhqfu348k", - }, - { - "evmos1m2h0neyc2zjep2072cqhakmt5qsxwvppajc07v", - "12453874540000000868352", - "evmosvaloper10q09k0flvffqzcmy2nx20nhxzs78nnesrv60ad", - }, - { - "evmos1mgv4t4l6fj4h0lrg23764a8ag4tlly0d6dujaz", - "12453874540000000868352", - "evmosvaloper1jd6w3lm4y22680fkwvykx5h8tjzftd9z0mdcqm", - }, - { - "evmos1mzssnjkanhc0vvx785tgj5uqc58yj378pywjv7", - "12453874540000000868352", - "evmosvaloper13rh82yhf4zzf9n44e32e7r30ackggkvu6ps426", - }, - { - "evmos1n59crn53wapqm662v85twdw8wet590xzrzmqy5", - "12453874540000000868352", - "evmosvaloper1hay4kqak5h9zvp0r43y6nggprug4uc2qs0pn0j", - }, - { - "evmos1n8q72ycahytz7kldvrhwgm0g2fx2t5zlxdqkt7", - "12453874540000000868352", - "evmosvaloper1a22spreqspsh9s3v67ctsuzaf9n4kallj7wuzf", - }, - { - "evmos1ndpd6t6t27p8cy4xvfjfyf5lr3l607wttmj8rn", - "12453874540000000868352", - "evmosvaloper1rh9uz23gmhr6q92a45qrath4fr9ffefz4eas0z", - }, - { - "evmos1p8dhl4pyv0h0lxtgp3zf3a32jlkzu6vysm6s0k", - "12453874540000000868352", - "evmosvaloper15n2ms99yx2lycwk0msmtlj9yxhtlmqeymtg4c3", - }, - { - "evmos1qnezlwhpjhhev6wmvul8w93f66mdetdafh862c", - "12453874540000000868352", - "evmosvaloper1wxllvjqmha2p437dpczat82wzpr8gem04jkwmz", - }, - { - "evmos1rs63zmf9pktk6cxyvwqyuh82cn4druaaw638rv", - "12453874540000000868352", - "evmosvaloper1a22spreqspsh9s3v67ctsuzaf9n4kallj7wuzf", - }, - { - "evmos1s72e9ml7e695ldesswhmgev2ls43efq3kh0efq", - "12453874540000000868352", - "evmosvaloper17vze0tk7q7gwpd6jt69p4m5svrty40yw9a88e3", - }, - { - "evmos1t3g78yyfjscfp0ysfrhcq6k835meqz3x8qcxhg", - "12453874540000000868352", - "evmosvaloper1x322q9d7dvm0xw9966c8730pn083rv3q6ddtyx", - }, - { - "evmos1tj5g25jjxljks0q49pjn2rjnst8yl99kvayy3d", - "12453874540000000868352", - "evmosvaloper1g376mzt2kcszpf7y3ee7r8jpseq2zv9hshf5g3", - }, - { - "evmos1tjxyvhr987sshwnjdc2cjtgrprg2wwqv934q9m", - "12453874540000000868352", - "evmosvaloper1ulkhal0g0fmgsjlf8q7mdd46m6t9sqkhmpfvfd", - }, - { - "evmos1tln7rpuda7kl90v9f3xwj6g7uh9ml2vumq2f6l", - "12453874540000000868352", - "evmosvaloper1sq9ggymzx02vcp7kf6yyar83scfm4r22swu673", - }, - { - "evmos1u2v87xs7jka4vxfgwshnp94z4n77vu6fv9ju35", - "12453874540000000868352", - "evmosvaloper1fpjf8aywxg9qxexfwu9lanlgw58f5fhqfu348k", - }, - { - "evmos1undyf00g3wlscefkavjf22tm9le0paqwd8sv3m", - "12453874540000000868352", - "evmosvaloper1f45kvvy80gzcfccgvmg5gjzelwxeuk2k26xelm", - }, - { - "evmos1wk9cjd5yghnw7w3kkxr6gau548ll062wrwgf5e", - "12453874540000000868352", - "evmosvaloper1hn8u6x03mklzdy69r9khsd9q4yft7gmrkz8qkj", - }, - { - "evmos1wkfnvwswt2mxe03s5508f56tfn4mhfspa4htmr", - "12453874540000000868352", - "evmosvaloper1d74wdckw5vyn6gwqt4r0ruemp9n8vmwtudw848", - }, - { - "evmos1xc0chgxhks0mrgdwzqsrjdrxd03f3fsgtnuufx", - "12453874540000000868352", - "evmosvaloper1aqjfvunjprdhs660e9yfa8wdulc7rxlzz43hn3", - }, - { - "evmos1xrd642wqj0arz8w85f9rs0zvc928lhfxs6graj", - "12453874540000000868352", - "evmosvaloper10pcga9su5me3dp5g4jln49uxjq7c9s2u9qy9zu", - }, - { - "evmos1yezfs9p3dvdp29rhggduy5nk8z2drfv5up9m4u", - "12453874540000000868352", - "evmosvaloper1aep37tvd5yh4ydeya2a88g2tkjz6f2lcrfjumh", - }, - { - "evmos14a02dhq4v42hzquunx9zqe07a46jj33pva70x2", - "11623616240000000065536", - "evmosvaloper1chx7v975g72xuw8kdpjt94dh35daqqfyc37kys", - }, - { - "evmos1arlf9gyfmnaxrhvvr8he7acznkwmu9a5uhwge8", - "11623616240000000065536", - "evmosvaloper17hd4fyhqkgply6klljx3ugqemhdgqhe8xu2yu6", - }, - { - "evmos1lkeaay5ss0c2fvlst4a3zfnntznf9e8sws6klu", - "11623616240000000065536", - "evmosvaloper1h62qm8qcctvcdd8t3jwm9jcc9cwleqjgnsn7ry", - }, - { - "evmos1qe4eecv8h7f7xegycsjzaucdyuz82aj4ph77jx", - "11623616240000000065536", - "evmosvaloper1ce4vh0e5kanlgc7z0rhcemvd8erjnfzcyfecl7", - }, - { - "evmos1xexrdlyzjjpq0tertstjc0pr8gcwt230s9f462", - "11623616240000000065536", - "evmosvaloper1vdvflras2n3h7fjhe95h86wsy0z2nlsktngrp8", - }, - { - "evmos1zlfrekplelr9um0hssfgwjgz8v2txt69car9wd", - "11623616240000000065536", - "evmosvaloper17aplkq60nqqnawztjlxyk0wwtc9l2uv955003h", - }, - { - "evmos127e4rple8kvghykz8d95dmnyg2ytxx2uw3kqdc", - "10793357930000000483328", - "evmosvaloper1v6ack3xwvnktwkq00kw4ld5xxlw55r5zmh26k0", - }, - { - "evmos145vmfffj0w4engnddlqsf5nctq9ggg5ndqttpl", - "10793357930000000483328", - "evmosvaloper10xhy8xurfwts9ckjkq0ga92mrjz9txyy6y8l2g", - }, - { - "evmos168x4fntv2dfysytxdtlcl85s9uk0epy4xv38f2", - "10793357930000000483328", - "evmosvaloper10q09k0flvffqzcmy2nx20nhxzs78nnesrv60ad", - }, - { - "evmos1752lw8ml48tfnsz9m4g8kq9e5n6arkgesnk4vr", - "10793357930000000483328", - "evmosvaloper17zaf6jk6gupa0mgnyyt7e4u8y783k6u3wz6avj", - }, - { - "evmos1kqufve24cy96nyv8dq5y483hw0n90n7thtq5eq", - "10793357930000000483328", - "evmosvaloper1c55g6u7q2uzgks9gjp80sle8n6qcyg64vk64g2", - }, - { - "evmos1le38vh4jzecqmy8r35pra32nnlg0y54zeqyj0a", - "10793357930000000483328", - "evmosvaloper1cpa5rlkxt8x7nu8rnqm9q4wc8qan5ve5cvd8e5", - }, - { - "evmos1lyqj60nv007tvsuvyhuu08gldlfzwq28wqfnnm", - "10793357930000000483328", - "evmosvaloper1fpjf8aywxg9qxexfwu9lanlgw58f5fhqfu348k", - }, - { - "evmos1rc8hgh8zhz4ejfexs8zvf76msywsa2htwp256k", - "10793357930000000483328", - "evmosvaloper1zk0sx2e677293wfmhxngpexu50vps3sdwyef92", - }, - { - "evmos1s8fyd4mklyazk0jusd89w96vzypc2r2lfrlcqw", - "10793357930000000483328", - "evmosvaloper1vw7k3z99swlv7svjmnrrqvu6zdmatqhvzuz7lu", - }, - { - "evmos1vw7k3z99swlv7svjmnrrqvu6zdmatqhv0jdw7p", - "10793357930000000483328", - "evmosvaloper1vw7k3z99swlv7svjmnrrqvu6zdmatqhvzuz7lu", - }, - { - "evmos1w0m2cuy6d924ejhx2m39q2v975m8cs0hpwcwlw", - "10793357930000000483328", - "evmosvaloper1t3rfzrxeslmtz62mydyf2xmmxehwk7xzaaucjd", - }, - { - "evmos1y7ugyu7d8cd8a62nhmwlxy42lcdgkeagttwjrv", - "10793357930000000483328", - "evmosvaloper1a22spreqspsh9s3v67ctsuzaf9n4kallj7wuzf", - }, - { - "evmos12mw0x395tpvnus2panvrpn9lczm52yrdmn7eue", - "9963099630999999348736", - "evmosvaloper1q3aejvmwj9dxturgk00jv7hkwxld7ny7642tr8", - }, - { - "evmos13eg6lmpm9armndedqxq6q04me7vyewlnv406tu", - "9963099630999999348736", - "evmosvaloper1cpa5rlkxt8x7nu8rnqm9q4wc8qan5ve5cvd8e5", - }, - { - "evmos1426c3rs6fkt8wt4p8w8nl48nn7zpvd0xtzafpc", - "9963099630999999348736", - "evmosvaloper10q09k0flvffqzcmy2nx20nhxzs78nnesrv60ad", - }, - { - "evmos146yjpr70wj3rjjt9mmgky2gy5c7d9ehdgtrur5", - "9963099630999999348736", - "evmosvaloper1hay4kqak5h9zvp0r43y6nggprug4uc2qs0pn0j", - }, - { - "evmos162fmljm289vplvwwqeth6h3srwt6pxqv67w6ce", - "9963099630999999348736", - "evmosvaloper1rvsmc4k7ay8hc6nlz50lw8hskygvdptmwr3rdl", - }, - { - "evmos165xumnz7j892dstxth7h7nnm3pdpk6ylk3044v", - "9963099630999999348736", - "evmosvaloper1k96y0w5wf089nuvvym3s324c8umd3vvm4yh578", - }, - { - "evmos16p03d3eyfrxthl05fskalw6ftg8nu2pdgy3qhr", - "9963099630999999348736", - "evmosvaloper18zt355ccyxd3kj23mz5hdz00qqn5lk5kjnj74m", - }, - { - "evmos18smfdr4zqavhs080cjtf9c0s4x9nzfwxccq6pf", - "9963099630999999348736", - "evmosvaloper1q3aejvmwj9dxturgk00jv7hkwxld7ny7642tr8", - }, - { - "evmos18ysedxhmkuag0w5kdjcg0krg9uv62yh6al6tm0", - "9963099630999999348736", - "evmosvaloper1hn8u6x03mklzdy69r9khsd9q4yft7gmrkz8qkj", - }, - { - "evmos19q4dz3ctmw7xpm7nwl7rpvg9ad6yud8tmypffr", - "9963099630999999348736", - "evmosvaloper1vdvflras2n3h7fjhe95h86wsy0z2nlsktngrp8", - }, - { - "evmos1agw0ngwcnxmytm5yt9y3sd6pvs5rqq5vhkj3w4", - "9963099630999999348736", - "evmosvaloper1hay4kqak5h9zvp0r43y6nggprug4uc2qs0pn0j", - }, - { - "evmos1crwayp0hmlyhtnhvevh3xv8m3cd7rhgthxamqj", - "9963099630999999348736", - "evmosvaloper1g3jy2wdjus4gka7e5dud7etz0u3mcnfs9vt5cr", - }, - { - "evmos1dknke8g5ltnzrw9vs44nm8zx66zl3p0ggmm4ma", - "9963099630999999348736", - "evmosvaloper1dj0mysdn05447p9ncsq9g424fv2ynaxryhpjkc", - }, - { - "evmos1fx7y2v4yq0f0xm2lcg598jchtg368srr9336xa", - "9963099630999999348736", - "evmosvaloper146mfv59nypacvs5l9h0takrcv8jtlk90wr0ggp", - }, - { - "evmos1g9tttrl46xaxeh8e77pddqn0ugagusegyl7drt", - "9963099630999999348736", - "evmosvaloper18zhvafj8jcezdut6z9u0pcsnqy978ya9d25du5", - }, - { - "evmos1h9r8qg73xf2lmtmrnp6zufsmql5lvrjx0s2kxk", - "9963099630999999348736", - "evmosvaloper1cw8035q5dh9yc5gmk9zzt6k2ven0w292uuk96v", - }, - { - "evmos1hquf6jg89p46xrn5ha9ds8qmgfnkczy2pnd8ee", - "9963099630999999348736", - "evmosvaloper1v4crs2adgcu2cdm2jxq07mw7ugzx0z4x6alxeg", - }, - { - "evmos1m5z2r8a4h5uhs6dxrq3d6elq7yl64dnw70t6xt", - "9963099630999999348736", - "evmosvaloper17z0xyw6vwjn6gqj86s3axs7mjsngdl6sncdwga", - }, - { - "evmos1n2kslw6v007txuzdt92ckpmhh4llyxed7nenl8", - "9963099630999999348736", - "evmosvaloper1kw03prf96w5rrj53pvhdnmsnr469dn9gqmsqwg", - }, - { - "evmos1n88s74rx5jq7vzzl3epe39utqrmypxn7sw58xx", - "9963099630999999348736", - "evmosvaloper1k9lay7ec328u2cmmtp8m8309msztt5hz7euvcc", - }, - { - "evmos1pgzc42sh6ac952fnajpuu3dv7c25eer4vkvqap", - "9963099630999999348736", - "evmosvaloper1vdvflras2n3h7fjhe95h86wsy0z2nlsktngrp8", - }, - { - "evmos1q6m4m2mecxqrjmnmr3re8ghhta6ndu93qa73lf", - "9963099630999999348736", - "evmosvaloper12a6wa97lsv8wm62j07tz0xeqvfxddzyfg72d45", - }, - { - "evmos1qklq6ccdwwjah5n8sx2022hhmx69hpe99vup8s", - "9963099630999999348736", - "evmosvaloper19fv2gwkgv3x53lau3um6tzg7qxvq96grvg97zr", - }, - { - "evmos1qr2xwz8cfzk502t63zut66x4d64k03jy5p64nd", - "9963099630999999348736", - "evmosvaloper1n4kuugnh2z5dsug7egamma7chnjcdfu4jwhq76", - }, - { - "evmos1qt58cdtfznv94j4jl739amg8ztaj0kc3d9uug7", - "9963099630999999348736", - "evmosvaloper1gj8uu6pxcncdtav707a86v3sqva2svn45sx62g", - }, - { - "evmos1r0m0q7pne2r2qvqu4kkgvav3gjzk6xa3h374eq", - "9963099630999999348736", - "evmosvaloper1cw8035q5dh9yc5gmk9zzt6k2ven0w292uuk96v", - }, - { - "evmos1sq8jwuh7wysjy26pvkxaphjtk4knqej0jc5qqa", - "9963099630999999348736", - "evmosvaloper1mfu6uer0zatrqaz6435m2zk40ls25tt38r4t8t", - }, - { - "evmos1tm6x942652qhc5c5mk5uc62lurg7hhguqdsk0p", - "9963099630999999348736", - "evmosvaloper1teve9jdzedzu64mty72qc2888kh7t9hjchp5y2", - }, - { - "evmos1tru5v3yvvkecnuk0q5awkkhfrx8np749dpqscp", - "9963099630999999348736", - "evmosvaloper1teve9jdzedzu64mty72qc2888kh7t9hjchp5y2", - }, - { - "evmos1vc25cjktc6zwg02u2nejgj25fkx0qn80ax3v4d", - "9963099630999999348736", - "evmosvaloper1aqjfvunjprdhs660e9yfa8wdulc7rxlzz43hn3", - }, - { - "evmos1w5vqeyvkvstql4f9eueswkj00dztllp07fxfj4", - "9963099630999999348736", - "evmosvaloper1jxruqmfurgxrem4phvaqxkvprxa6fr0ncg3t88", - }, - { - "evmos1w7aejch5za9stadkwcx9apfqrehgerl2k9vc3y", - "9963099630999999348736", - "evmosvaloper1jhe4gfgl7wv3s99h3d9tz4g833j8265e7cjqyw", - }, - { - "evmos1xkkv78wrz6226y6teuu8m4kn3rchaewymh9ql7", - "9963099630999999348736", - "evmosvaloper1kegt9p7se6mpmtt47axx0rwxlp8tr5626pq09u", - }, - { - "evmos107mlv7f87ckvg6rg7mhrhlqylv35pq6kpfxtch", - "9132841328000000589824", - "evmosvaloper1c55g6u7q2uzgks9gjp80sle8n6qcyg64vk64g2", - }, - { - "evmos10xja4gsmvwnqrlu8w66actl2g72g66zkc2vv65", - "9132841328000000589824", - "evmosvaloper17vze0tk7q7gwpd6jt69p4m5svrty40yw9a88e3", - }, - { - "evmos1246x3wcvanazxg623pwg3uks2j5ad733yhnd7t", - "9132841328000000589824", - "evmosvaloper1rvsmc4k7ay8hc6nlz50lw8hskygvdptmwr3rdl", - }, - { - "evmos133ezu4x3srenwsgdae9wn3f3fkna4y83hwzmjd", - "9132841328000000589824", - "evmosvaloper1xaxg47uw046uw8vgpp3da367ctw9aguqjuyyyx", - }, - { - "evmos13rqqht6cm24v4azac9nn5fxmrsv2pyrlhl37lc", - "9132841328000000589824", - "evmosvaloper1vw7k3z99swlv7svjmnrrqvu6zdmatqhvzuz7lu", - }, - { - "evmos14u3e62qhue2q6ue85urry5m59dvzv0kmdmp77r", - "9132841328000000589824", - "evmosvaloper1gzycxekfxq2hvu9jt255aajvlakay9nvz4p5jf", - }, - { - "evmos16z9eagz2nglr3kew6qk5f868uvv3tsze83xfjs", - "9132841328000000589824", - "evmosvaloper10pcga9su5me3dp5g4jln49uxjq7c9s2u9qy9zu", - }, - { - "evmos19p03v4h8zq325l30t6kcnz9vwcg4d48hcn3sd8", - "9132841328000000589824", - "evmosvaloper1l840d9sse36j9cvzgq98vennrzuu5l70l5shhc", - }, - { - "evmos19y7d5jz7q0v86zw5m0300mhprpvu0ccc4x6xgg", - "9132841328000000589824", - "evmosvaloper1hn8u6x03mklzdy69r9khsd9q4yft7gmrkz8qkj", - }, - { - "evmos1ckttz9elazyvtz79q5mgdry055awf0ks54l53k", - "9132841328000000589824", - "evmosvaloper18zhvafj8jcezdut6z9u0pcsnqy978ya9d25du5", - }, - { - "evmos1dkhzfyg9d7gpf0sut5mwn3wspzg6pmxmsk7d67", - "9132841328000000589824", - "evmosvaloper10666nk6c845g295h9y77eprzpepdv82gnrrs4c", - }, - { - "evmos1e2a4qtxm75r9kdzc7easd50qel5axxzxtttfx6", - "9132841328000000589824", - "evmosvaloper1ce4vh0e5kanlgc7z0rhcemvd8erjnfzcyfecl7", - }, - { - "evmos1evrt209s5prxcmtpnp08hjzg08zjc66dwassy6", - "9132841328000000589824", - "evmosvaloper1aep37tvd5yh4ydeya2a88g2tkjz6f2lcrfjumh", - }, - { - "evmos1exgh85tz3a7zm5rc8ea3njvzdfspuw3scv3g84", - "9132841328000000589824", - "evmosvaloper1w2j20fj2a4wfmvqnhfhv4mfxkw5xxt09x8esyj", - }, - { - "evmos1fh9f2u0eyqfeyc0n4namlrnzs2vsqpeqkvdktz", - "9132841328000000589824", - "evmosvaloper1qp49y6vh8vvv5yf8ule8fwx6sss82ncz39tunl", - }, - { - "evmos1gkj79vsultpu2kccjnq3hv2neg2vr84z9d873r", - "9132841328000000589824", - "evmosvaloper17jyfw78xztc8crq4t8znjlg8ld76lkzkg2hny3", - }, - { - "evmos1gwzm97y2h9eel07x4vyl85x46qrk92hfjx7tn4", - "9132841328000000589824", - "evmosvaloper1dk4ste222kp256ky00553nexna0rh38hx2ur6c", - }, - { - "evmos1gzwfj3g9970alkfz6p4ylsw8hsjwvff3jn94ey", - "9132841328000000589824", - "evmosvaloper19fxanpnjlggzuur3m3x0puk5ez7j9lrttexwsw", - }, - { - "evmos1h42z4c0skgee2qszpe599fzrs9gn39m0w3ukz4", - "9132841328000000589824", - "evmosvaloper1zk0sx2e677293wfmhxngpexu50vps3sdwyef92", - }, - { - "evmos1jscw9jgl9u3hdtj4hreudpkmwt7hfyupd9rkyj", - "9132841328000000589824", - "evmosvaloper1zqkrqsvrn4hskeywd56gx2dcy50mnyp6wq7txc", - }, - { - "evmos1lgj7hd89gne34tfqhay6uydjewegp5z9pyfvur", - "9132841328000000589824", - "evmosvaloper1ak9t7kwk44azu6cefqdydqmy3hen28nvdjjvz0", - }, - { - "evmos1ll2kludavl3gwlmxexr7napylsd4ave94fs53m", - "9132841328000000589824", - "evmosvaloper1l840d9sse36j9cvzgq98vennrzuu5l70l5shhc", - }, - { - "evmos1mj47ggrw8mj7s6z8hnjl4qzlu05f2z2slv25ak", - "9132841328000000589824", - "evmosvaloper1gzycxekfxq2hvu9jt255aajvlakay9nvz4p5jf", - }, - { - "evmos1n0qzaa37ll0326nrx4j96wmqg9w77ujajq9h99", - "9132841328000000589824", - "evmosvaloper1tczjwjrr36e0l5jjqnwrp95kv8mk57zdmxse4m", - }, - { - "evmos1n9hxp8gplg6yjyzahl8jrlz4qeq0p7k3sk0wtm", - "9132841328000000589824", - "evmosvaloper139gzv3nvlkp4ylrywsnj8eurm6qwp8t3l9a2gy", - }, - { - "evmos1np6nq0p50wtp6jdlt0jud35pnr02nn6r7clp64", - "9132841328000000589824", - "evmosvaloper10qpycc2egucukw8afcz4us7xlxxmfwh6rscvjz", - }, - { - "evmos1qqfr2vyr06ct4k7jeykm65dfpjxpcnpwzspurl", - "9132841328000000589824", - "evmosvaloper16jr6ewgp0ypu39z80lywgzwjrx99vxcq4sdfzf", - }, - { - "evmos1ragl4c523dwmss0m5rlreh0ggd08wqsyy6ehgj", - "9132841328000000589824", - "evmosvaloper19e53dt5r9w2mstt32jnj43xrxlyprnc085tl30", - }, - { - "evmos1rvckd7nw5pvrx9vmfjvcahewsen2xgdk64rrkr", - "9132841328000000589824", - "evmosvaloper1f08fffp8zz42jj0f6wh3gyu7he4hf6zzs6mn8j", - }, - { - "evmos1ryn0ptf3aqmguxf7ngqxzxxdc2x9t0296xlrj6", - "9132841328000000589824", - "evmosvaloper1y6yvdg2xdltzr0v5hvf8zvxk373xwas4jwgvkp", - }, - { - "evmos1setytp568dsry9vxszklzg7u3eh6fa8lppvp28", - "9132841328000000589824", - "evmosvaloper1l840d9sse36j9cvzgq98vennrzuu5l70l5shhc", - }, - { - "evmos1tgsdy3m5q8v8muvgg5rdf8uayyck6zaewjmjkh", - "9132841328000000589824", - "evmosvaloper1sq9ggymzx02vcp7kf6yyar83scfm4r22swu673", - }, - { - "evmos1ug8mkxtg0l92arute5ffjrw2992ye4z9k5ukr7", - "9132841328000000589824", - "evmosvaloper1vdvflras2n3h7fjhe95h86wsy0z2nlsktngrp8", - }, - { - "evmos1usskw3vvwq2tug3gz07t0y9ujyy2e7sr3p4phj", - "9132841328000000589824", - "evmosvaloper17jyfw78xztc8crq4t8znjlg8ld76lkzkg2hny3", - }, - { - "evmos1uxswpmetvuyatu02wj8jp2vrl30mzyn6yed70c", - "9132841328000000589824", - "evmosvaloper1gyxqlahz6g9ws5cu0tk3gccgryzja7558f069r", - }, - { - "evmos1v7pjxfeturnx93xxz892a222u39mzqsezvd7es", - "9132841328000000589824", - "evmosvaloper1fmfhpcc00r6ejuclv2fje3egruruk9upe7tl4s", - }, - { - "evmos1v9hzly9u0zfl8dlrmhvsk4r7uetl9hy8sqd5sn", - "9132841328000000589824", - "evmosvaloper14yeq3lkajldaggj28hmq8xng9xux7x5g86tx29", - }, - { - "evmos1vl3svdrg34r39w50rvwfznmn9evl9sssyr0hz0", - "9132841328000000589824", - "evmosvaloper18zt355ccyxd3kj23mz5hdz00qqn5lk5kjnj74m", - }, - { - "evmos1vnlt8v33fjxvmlt0x0d6e3lds8auzq98v2k9q6", - "9132841328000000589824", - "evmosvaloper17hd4fyhqkgply6klljx3ugqemhdgqhe8xu2yu6", - }, - { - "evmos1w6yu2d5wgf8gka0jea66wwxcwr85feaxjx5scj", - "9132841328000000589824", - "evmosvaloper13nujml9r2dg85nucffe82xq3yg8f35qxmfal7p", - }, - { - "evmos1x48uh76nku4568kl68x3eaud7c8nwsp9urdj0d", - "9132841328000000589824", - "evmosvaloper1wxllvjqmha2p437dpczat82wzpr8gem04jkwmz", - }, - { - "evmos1xngq37uyepnj9unhef48u6pfqvpacwz8g2z9s2", - "9132841328000000589824", - "evmosvaloper1zqkrqsvrn4hskeywd56gx2dcy50mnyp6wq7txc", - }, - { - "evmos1xttel3wklh3eeaa506che38kn479y3fgt6yyew", - "9132841328000000589824", - "evmosvaloper1l840d9sse36j9cvzgq98vennrzuu5l70l5shhc", - }, - { - "evmos1zyyalvejk32w2qrjcdxlvjswwn2d28txfqn39u", - "9132841328000000589824", - "evmosvaloper1rwy29t3eup0tnaph08rezdjsmckzqemkxh535w", - }, - { - "evmos10c9xyftetlhlc5ectqtqrf2jj6vqc94yzdurmp", - "8302583026000000450560", - "evmosvaloper1gj8uu6pxcncdtav707a86v3sqva2svn45sx62g", - }, - { - "evmos10rsmg3j2a5nn9f4j0v2e6kly4jlet6eqh44xqt", - "8302583026000000450560", - "evmosvaloper1qq95x6dhrdnrfunlth5uh24tkrfphzl9crd3xr", - }, - { - "evmos1k02qsfpn4x3389gc6n9f2pn90zdw2622qjylft", - "8302583026000000450560", - "evmosvaloper1g376mzt2kcszpf7y3ee7r8jpseq2zv9hshf5g3", - }, - { - "evmos1rd30ap757xv04rcea2ddajhtw5xkrrxp2lqw9k", - "8302583026000000450560", - "evmosvaloper1ulkhal0g0fmgsjlf8q7mdd46m6t9sqkhmpfvfd", - }, - { - "evmos1afcdd60zqyntzl96kfwg3n2d0sms0yg0ure2lv", - "5811808117999999647744", - "evmosvaloper139gzv3nvlkp4ylrywsnj8eurm6qwp8t3l9a2gy", - }, - { - "evmos1hsxs04fvxcsqjstvnkvu6p0umfy86lzmsd2hhs", - "5811808117999999647744", - "evmosvaloper18lgy886ruwkuaefm2c0sn0gt9kgnj0de3kt6pv", - }, - { - "evmos10ey9j3rkw75y5fek9nugd7sd9q26vcjcymmcr2", - "4981549814999999840256", - "evmosvaloper18zhvafj8jcezdut6z9u0pcsnqy978ya9d25du5", - }, - { - "evmos13kau3evx98a2nxstt6mzw2m2598gq984jz2ywg", - "4981549814999999840256", - "evmosvaloper1vdvflras2n3h7fjhe95h86wsy0z2nlsktngrp8", - }, - { - "evmos14rhhr9qqmw8yvut6k2rnf08t5w33738j8c664f", - "4981549814999999840256", - "evmosvaloper1zk0sx2e677293wfmhxngpexu50vps3sdwyef92", - }, - { - "evmos18pt3yghmyun9wjzl2lulj5zq97s2gvryv738el", - "4981549814999999840256", - "evmosvaloper17zaf6jk6gupa0mgnyyt7e4u8y783k6u3wz6avj", - }, - { - "evmos19ukysy0y8vftenua47390kmg82t8expldca9fe", - "4981549814999999840256", - "evmosvaloper1zk0sx2e677293wfmhxngpexu50vps3sdwyef92", - }, - { - "evmos1a36r4jvcprvewxnr2qhfs0h4spec35232798lk", - "4981549814999999840256", - "evmosvaloper1pz3mcahcrglf3md4lggax5r95gvmppc6x5w7hw", - }, - { - "evmos1cxpkev44hfqx2pcyx0zl80f9skfdcym08umxzx", - "4981549814999999840256", - "evmosvaloper1mfu6uer0zatrqaz6435m2zk40ls25tt38r4t8t", - }, - { - "evmos1dnv0qhj9cq4zq68g70thcep0gn3j6zrjm3nvlp", - "4981549814999999840256", - "evmosvaloper1t3rfzrxeslmtz62mydyf2xmmxehwk7xzaaucjd", - }, - { - "evmos1dyjz2wnytke373kya78hyfec0hea2wr6tjjxy9", - "4981549814999999840256", - "evmosvaloper1gj8uu6pxcncdtav707a86v3sqva2svn45sx62g", - }, - { - "evmos1g42a23klcwhdmmkmq43d8awe6xdtsuk673jfdl", - "4981549814999999840256", - "evmosvaloper1g3jy2wdjus4gka7e5dud7etz0u3mcnfs9vt5cr", - }, - { - "evmos1m3uqnzaxa4dh3qde0md2w6l9qmpka0weyptp2j", - "4981549814999999840256", - "evmosvaloper1d6c097pmd6avh0x3spfwc0cagc690e2mmkpx4h", - }, - { - "evmos1mg0zx47gknjdhxq2sgfr7pl6lsypk8aj7t7249", - "4981549814999999840256", - "evmosvaloper19fv2gwkgv3x53lau3um6tzg7qxvq96grvg97zr", - }, - { - "evmos1rrjls4ujjnxw7ta3rnge5j7nfyl936uyx4frjl", - "4981549814999999840256", - "evmosvaloper1vw7k3z99swlv7svjmnrrqvu6zdmatqhvzuz7lu", - }, - { - "evmos1v902ffur5rm5rp07kwcm5z88g9k7f65ltyp62q", - "4981549814999999840256", - "evmosvaloper1jhe4gfgl7wv3s99h3d9tz4g833j8265e7cjqyw", - }, - { - "evmos1vjackunwvmqyz56thpzeft9085ppw4ldv7n267", - "4981549814999999840256", - "evmosvaloper1u6ndfv26nc2jw43kx0kzck8s9pnunakwgu8vmc", - }, - { - "evmos1vn9g4lm5fc6vmvymdldkj0zd8j6cup6meq8hn6", - "4981549814999999840256", - "evmosvaloper1psf28krr9muve6w0qzgjlrju5mamlsac96l85q", - }, - { - "evmos1x387lfyfzqel62qlr9crzmxmyms8pflr6j2njn", - "4981549814999999840256", - "evmosvaloper1xsc2lnpf9jwem8kujlqan44ywet3trj2sezfhg", - }, - { - "evmos1xmycuq7tepqlj3d2p3zvwcc0txckglyzd7xzf0", - "4981549814999999840256", - "evmosvaloper1vdvflras2n3h7fjhe95h86wsy0z2nlsktngrp8", - }, - { - "evmos1z8gn6dmcjv8uph2snz2qcq9jflqdkcy2djzxql", - "4981549814999999840256", - "evmosvaloper1g57n4k08sk5z6ramzsgzrapgpsjsyh4t5tldw5", - }, - { - "evmos10khzyt6w8st87k3vptz7g9q3hpyyt4r9ptcj5j", - "4151291513000000225280", - "evmosvaloper1d74wdckw5vyn6gwqt4r0ruemp9n8vmwtudw848", - }, - { - "evmos12dd4l085vv8egehmxdg2w9a42mtwszcdjdgs90", - "4151291513000000225280", - "evmosvaloper182d5yfc5wwaphwjm5wqj9xmsf0vmp30qrtjllu", - }, - { - "evmos135hxfqaueucdkp3c48j8l8wvevxvuvr48x22kx", - "4151291513000000225280", - "evmosvaloper1u6ndfv26nc2jw43kx0kzck8s9pnunakwgu8vmc", - }, - { - "evmos18vt7eay4rx7fra0u52mcplud3ne43eq7es2fn2", - "4151291513000000225280", - "evmosvaloper1fmfhpcc00r6ejuclv2fje3egruruk9upe7tl4s", - }, - { - "evmos19edzsptn6t0v7clgyt7v0xs4t6ucw5nfeju2f2", - "4151291513000000225280", - "evmosvaloper1wxllvjqmha2p437dpczat82wzpr8gem04jkwmz", - }, - { - "evmos1aqse6gxmmf635hwsqv5tlt8rr8crvhun6gru72", - "4151291513000000225280", - "evmosvaloper1lldjhjnn32e8vek7cxe9g05nf8j74y0xs5zmsu", - }, - { - "evmos1ckwzg657hy6mxqefls7tv3u0qh00f0suwcv48m", - "4151291513000000225280", - "evmosvaloper1g3jy2wdjus4gka7e5dud7etz0u3mcnfs9vt5cr", - }, - { - "evmos1d0hjzlhvzsh75xqw0kcrwa8nsgztf9v70h2tk3", - "4151291513000000225280", - "evmosvaloper1rw4nendrehkr5tkhjswzy8ts97dvwg7rc0u0kp", - }, - { - "evmos1fgfw2x7mc7kge3jmks82cltjkugqpd5w8as3vp", - "4151291513000000225280", - "evmosvaloper1qmpmzdesg9gr5wpyzkssayldnhk3pa8x2nwlwp", - }, - { - "evmos1fp97huqqhvgkga6390pqvqajxck5rrxv2345ql", - "4151291513000000225280", - "evmosvaloper14yeq3lkajldaggj28hmq8xng9xux7x5g86tx29", - }, - { - "evmos1h2vrsphes5q44swfj67hlt7296x4mh3c0ek7hg", - "4151291513000000225280", - "evmosvaloper1mfu6uer0zatrqaz6435m2zk40ls25tt38r4t8t", - }, - { - "evmos1h4y85kenxwhd749f3v25q0svam4ymqvjz9u2hz", - "4151291513000000225280", - "evmosvaloper1g376mzt2kcszpf7y3ee7r8jpseq2zv9hshf5g3", - }, - { - "evmos1h8057cmr2znknsaqu6vqazfughcfq93k24dmw4", - "4151291513000000225280", - "evmosvaloper174jlcery04j6r7wgvequeysruyjlhtcmlhnhy2", - }, - { - "evmos1mm44z05vmt9j235st4j42tyfz4qdrqjvhlj6jw", - "4151291513000000225280", - "evmosvaloper10qpycc2egucukw8afcz4us7xlxxmfwh6rscvjz", - }, - { - "evmos1mx4cgehdv6jknq4sufydzqgmup4h5e62hxgsgl", - "4151291513000000225280", - "evmosvaloper13rh82yhf4zzf9n44e32e7r30ackggkvu6ps426", - }, - { - "evmos1p7a5wfus798gpvcs6738fkzpvhn0hg8vq89ghq", - "4151291513000000225280", - "evmosvaloper155yk4wfn0xqye80exlsr6hu4qdfsvsgw63w87l", - }, - { - "evmos1ps89mt28l59js9hr4429xum8hfe376klws4207", - "4151291513000000225280", - "evmosvaloper1k9lay7ec328u2cmmtp8m8309msztt5hz7euvcc", - }, - { - "evmos1q35pm6vlykjued8qa6pm9frm5v5u8pznz4pegh", - "4151291513000000225280", - "evmosvaloper1d74wdckw5vyn6gwqt4r0ruemp9n8vmwtudw848", - }, - { - "evmos1rq0r53s3wg4854n05tg0hrw5u3jaqlw42ldlq4", - "4151291513000000225280", - "evmosvaloper1d6c097pmd6avh0x3spfwc0cagc690e2mmkpx4h", - }, - { - "evmos1uppxmtc6l3e9ys5q898cx3zzq95c4s6g4zdlg8", - "4151291513000000225280", - "evmosvaloper1ufg2a3vc4vmsmxtjmckjzltqvz83ste98mr6x5", - }, - { - "evmos1vvjw4652wfnkn596va77ltewe02mkf7qju3rsz", - "4151291513000000225280", - "evmosvaloper15n2ms99yx2lycwk0msmtlj9yxhtlmqeymtg4c3", - }, - { - "evmos1ylyzgcj4us0pz8vskvgzjmfmls7lg2smdh6eny", - "4151291513000000225280", - "evmosvaloper1f08fffp8zz42jj0f6wh3gyu7he4hf6zzs6mn8j", - }, - { - "evmos1z7zkjuwkr7zh28ha6fd3r2d7rmtmc28yhn4d6a", - "4151291513000000225280", - "evmosvaloper1hdslyd0vwj8ym368tqc5jdpu6hxrqvx9zex5yz", - }, - { - "evmos12lfg3g2daa5wgtqu8ac07ta85w4gu0ew9q9nr3", - "3321033209999999893504", - "evmosvaloper1g57n4k08sk5z6ramzsgzrapgpsjsyh4t5tldw5", - }, - { - "evmos12ms7p8ydctrrl9sxmmlnhv395t6s76k7gklhs8", - "3321033209999999893504", - "evmosvaloper1sx5qerxjzthnjzne7wz4x6ml4envjehvwtx8c7", - }, - { - "evmos13pyxga0sczrqqhqeww63xszkhmpan3n0qye25d", - "3321033209999999893504", - "evmosvaloper1gzycxekfxq2hvu9jt255aajvlakay9nvz4p5jf", - }, - { - "evmos13w3tmn6ymu9vle45yfg7j749e5zymqqnkq53vq", - "3321033209999999893504", - "evmosvaloper1tczjwjrr36e0l5jjqnwrp95kv8mk57zdmxse4m", - }, - { - "evmos14ywx2edjgrq0kuvjxedyfpx4rayuqnle3zsgpp", - "3321033209999999893504", - "evmosvaloper1kegt9p7se6mpmtt47axx0rwxlp8tr5626pq09u", - }, - { - "evmos1599vfdrjhetew4evucg0sjp90kwr8048rgxzlf", - "3321033209999999893504", - "evmosvaloper15fezptqfn3rmxtl4006ze9plealy4w9xdfamnv", - }, - { - "evmos15c7tax29yz8v76dvd4znmf2gj2pxyhel2llfcv", - "3321033209999999893504", - "evmosvaloper1c55g6u7q2uzgks9gjp80sle8n6qcyg64vk64g2", - }, - { - "evmos15fezptqfn3rmxtl4006ze9plealy4w9xq8jtj3", - "3321033209999999893504", - "evmosvaloper1a22spreqspsh9s3v67ctsuzaf9n4kallj7wuzf", - }, - { - "evmos16a72wggjs2zv906r2d5v3g8sskuhh2904uqjvg", - "3321033209999999893504", - "evmosvaloper1q3aejvmwj9dxturgk00jv7hkwxld7ny7642tr8", - }, - { - "evmos17uk46szgy853kkl47ee2fhg7hwj8ryhl7qg8fx", - "3321033209999999893504", - "evmosvaloper1gzycxekfxq2hvu9jt255aajvlakay9nvz4p5jf", - }, - { - "evmos17wetyn9jc4msmjgglntzcy280hqtak58jyqt0m", - "3321033209999999893504", - "evmosvaloper1vdvflras2n3h7fjhe95h86wsy0z2nlsktngrp8", - }, - { - "evmos18fdznufds7xcgthx00jmpvf6pplt7g4nnehyu2", - "3321033209999999893504", - "evmosvaloper1x5y65hgngh77sxta6s2vpjnfjep3ltllyhf2hs", - }, - { - "evmos1a47va2fk8hngkzdzh9rn5xfem6326vp8sq3unn", - "3321033209999999893504", - "evmosvaloper1d74wdckw5vyn6gwqt4r0ruemp9n8vmwtudw848", - }, - { - "evmos1c0uuj6qzrc0wunqjm0vtua4efdr9wzp9mxxzm3", - "3321033209999999893504", - "evmosvaloper1aep37tvd5yh4ydeya2a88g2tkjz6f2lcrfjumh", - }, - { - "evmos1csddvlzdq9r8r0ufcvftdc9h4ntllxmf7w3m0n", - "3321033209999999893504", - "evmosvaloper1qhazu8zleyn5chrkxymewx3xw5guq2vm6q7zl0", - }, - { - "evmos1dmut4gqsnuhdv49gak5r4m3ayzsaqqwwx29eew", - "3321033209999999893504", - "evmosvaloper1fmfhpcc00r6ejuclv2fje3egruruk9upe7tl4s", - }, - { - "evmos1eekueq28q5fmwqan9v8wk8z660js3ceg9n83w3", - "3321033209999999893504", - "evmosvaloper1zqkrqsvrn4hskeywd56gx2dcy50mnyp6wq7txc", - }, - { - "evmos1ehf5yx9cf0ff7xdlyhcpy876kpedl73dgs70j7", - "3321033209999999893504", - "evmosvaloper197ahcv2x9jj0nmvnen4sqqfffhygjga7rk3shu", - }, - { - "evmos1eqv5mjz9026muhukem6qzzd4780w5tyxm64ulx", - "3321033209999999893504", - "evmosvaloper1hay4kqak5h9zvp0r43y6nggprug4uc2qs0pn0j", - }, - { - "evmos1f7r5h28ejtsrlstgtxvvlc4slgjkm69c9j50ly", - "3321033209999999893504", - "evmosvaloper1k5hcl0cjprzewwvzhz3um589kx8skzlrneuepu", - }, - { - "evmos1faty8lrs52xqklw7q6987lhf2tmq29s3knfqua", - "3321033209999999893504", - "evmosvaloper1vdvflras2n3h7fjhe95h86wsy0z2nlsktngrp8", - }, - { - "evmos1fud8t2gjepgjxs8nv5m0zk4ydmnc90l2a3zyp9", - "3321033209999999893504", - "evmosvaloper1g57n4k08sk5z6ramzsgzrapgpsjsyh4t5tldw5", - }, - { - "evmos1gggr80ecxret7y8xy5uxmx8aqg8a9rz2s4qfyd", - "3321033209999999893504", - "evmosvaloper1teve9jdzedzu64mty72qc2888kh7t9hjchp5y2", - }, - { - "evmos1gxrl7eet5p3s0zqenzqs0rt6arqq003k8tmx0m", - "3321033209999999893504", - "evmosvaloper1rh9uz23gmhr6q92a45qrath4fr9ffefz4eas0z", - }, - { - "evmos1h758xhul4ac8mqpm2f0m8ug2cuuquy2evkryf4", - "3321033209999999893504", - "evmosvaloper1lwfuc2lc27mk8yys2zcd0qttcwmnd6x7gks5m5", - }, - { - "evmos1j0hfcqxjgrqcm98a7efpqkpnj0qwp73lkpzar2", - "3321033209999999893504", - "evmosvaloper1ufg2a3vc4vmsmxtjmckjzltqvz83ste98mr6x5", - }, - { - "evmos1lqaunyzvn3k6rvgqpmskt8hxklnzdaqtplt6yc", - "3321033209999999893504", - "evmosvaloper19e53dt5r9w2mstt32jnj43xrxlyprnc085tl30", - }, - { - "evmos1mpq59xzvf29deq4rhwghz7vkxnhh497g3xqrle", - "3321033209999999893504", - "evmosvaloper155yk4wfn0xqye80exlsr6hu4qdfsvsgw63w87l", - }, - { - "evmos1ncpa8kpv7spmzza7d5fa09st6gwaahqmtzs3ac", - "3321033209999999893504", - "evmosvaloper17jyfw78xztc8crq4t8znjlg8ld76lkzkg2hny3", - }, - { - "evmos1nrfr5ds8qzrayvc0qh3utf4nkq70hva7wwhqlj", - "3321033209999999893504", - "evmosvaloper17z0xyw6vwjn6gqj86s3axs7mjsngdl6sncdwga", - }, - { - "evmos1nve7sn4fny984eeezy2t5heuskaldhemfgfz96", - "3321033209999999893504", - "evmosvaloper1jk7umxyky5m5dul46t8nxneavlg7eysjr6lfj7", - }, - { - "evmos1pqp4q6geyn4yvca4wp753z2kyd5clg9530gjny", - "3321033209999999893504", - "evmosvaloper1pz3mcahcrglf3md4lggax5r95gvmppc6x5w7hw", - }, - { - "evmos1qqnrruxg9nyj4zvuj2hp6ny9lveyjqxh4klztk", - "3321033209999999893504", - "evmosvaloper1tjm6jya5wh65ha55c6279glcsa3mcs9srscytj", - }, - { - "evmos1qvq6vwp6slwsvmd8wqcx4c088t0z564k5kzxu3", - "3321033209999999893504", - "evmosvaloper13nujml9r2dg85nucffe82xq3yg8f35qxmfal7p", - }, - { - "evmos1rarnkfmqc5kmrfw88edeuvd4mcj8pdmh8m4ava", - "3321033209999999893504", - "evmosvaloper10xhy8xurfwts9ckjkq0ga92mrjz9txyy6y8l2g", - }, - { - "evmos1s23vctkh5pe64n8dqp7s0kcmln9yrsh3f3wzn5", - "3321033209999999893504", - "evmosvaloper1lwfuc2lc27mk8yys2zcd0qttcwmnd6x7gks5m5", - }, - { - "evmos1s3ttza8cpfcq8tkqv7mr9s8hj87xc63xkqs63s", - "3321033209999999893504", - "evmosvaloper1w9m6p7ctu4gkdsr8plle997h25rzsa96xlzfat", - }, - { - "evmos1s5e6zufya2cgul5z6jcnd8td206wfkcpwhzljg", - "3321033209999999893504", - "evmosvaloper155yk4wfn0xqye80exlsr6hu4qdfsvsgw63w87l", - }, - { - "evmos1tj0ptkfet083a9lqnxz7zmc8ev9gknlq3kn6sl", - "3321033209999999893504", - "evmosvaloper1teve9jdzedzu64mty72qc2888kh7t9hjchp5y2", - }, - { - "evmos1vrrtwkrnnh44znlfl364rgs0xr3wecn76z8mck", - "3321033209999999893504", - "evmosvaloper1shvcjzhcxau6qtlz9w82a646ecwp4hq7ayqt0w", - }, - { - "evmos1vtnyeu32hngg48lv8p4q4jdu3t4j45xeznnmx2", - "3321033209999999893504", - "evmosvaloper13h9qxch4r8ep2x8ynwlmcvcl6h902zg5elznhq", - }, - { - "evmos1w739dj2c3apqnydgnwtagyzmyvz2xt8g0p0y05", - "3321033209999999893504", - "evmosvaloper17zaf6jk6gupa0mgnyyt7e4u8y783k6u3wz6avj", - }, - { - "evmos1yg4a4l7tq4fxudej5v5a0l5d7fve5gx62v5wx4", - "3321033209999999893504", - "evmosvaloper1pz3mcahcrglf3md4lggax5r95gvmppc6x5w7hw", - }, - { - "evmos1yk52jx7pnunqat6ghluehwrctvlm6n8zy4uxtr", - "3321033209999999893504", - "evmosvaloper1q3aejvmwj9dxturgk00jv7hkwxld7ny7642tr8", - }, - { - "evmos1zk8ef40wrhm8z9sqcmfa0zhz8euyyra8lmuesf", - "3321033209999999893504", - "evmosvaloper10xhy8xurfwts9ckjkq0ga92mrjz9txyy6y8l2g", - }, - { - "evmos1zmdezgf0mcs08tj24xskdgkzhnknzdfmt6uraa", - "3321033209999999893504", - "evmosvaloper1teve9jdzedzu64mty72qc2888kh7t9hjchp5y2", - }, - { - "evmos102grarhhpehz0netn9wpcdw34mh78jvt9m2g7c", - "2490774907999999754240", - "evmosvaloper1dk4ste222kp256ky00553nexna0rh38hx2ur6c", - }, - { - "evmos103csnw540f7mrmww92xrdw039qu5su3kwpqfps", - "2490774907999999754240", - "evmosvaloper1qx7u07f2tv5j8677r3ttt97prkc2dgcyp2km24", - }, - { - "evmos1042h0a9dqsjlytmrfkqxuuquvv93d77085r67z", - "2490774907999999754240", - "evmosvaloper1rh9uz23gmhr6q92a45qrath4fr9ffefz4eas0z", - }, - { - "evmos104e3xm2724zkun8n6trll5qaqujw566gucq9nj", - "2490774907999999754240", - "evmosvaloper1suvf29zmvlmgg92zngez946nj8jrtu4hmxpwqv", - }, - { - "evmos10a4upa0rm5ef29a7kyevn2sjp0zpjs2vqquv52", - "2490774907999999754240", - "evmosvaloper1q3aejvmwj9dxturgk00jv7hkwxld7ny7642tr8", - }, - { - "evmos10ffftr2t4p6ngf8k25hpp4nre4mxk944da3j4l", - "2490774907999999754240", - "evmosvaloper1kw03prf96w5rrj53pvhdnmsnr469dn9gqmsqwg", - }, - { - "evmos10hcf6fn07g637ldtkt9wkqj5w4mzql3p3m3up9", - "2490774907999999754240", - "evmosvaloper1gj8uu6pxcncdtav707a86v3sqva2svn45sx62g", - }, - { - "evmos10qyhq396grg5485jd2tu2mgshx6xknudkj8h07", - "2490774907999999754240", - "evmosvaloper1dj0mysdn05447p9ncsq9g424fv2ynaxryhpjkc", - }, - { - "evmos10t8tz6swpz0d3ljs83qvp3d33zmwe3f94hxpwu", - "2490774907999999754240", - "evmosvaloper1d6c097pmd6avh0x3spfwc0cagc690e2mmkpx4h", - }, - { - "evmos10uvzrnjuenxlkcth8as3f20fs0zg5gkxajkf3j", - "2490774907999999754240", - "evmosvaloper1dk4ste222kp256ky00553nexna0rh38hx2ur6c", - }, - { - "evmos127p2a7u0lk7zcr4gdec0evcrxzu9jalfxnqwfz", - "2490774907999999754240", - "evmosvaloper1rwy29t3eup0tnaph08rezdjsmckzqemkxh535w", - }, - { - "evmos12a0zkutdfpgxg9el6s4c43eqswny2g4fjk39s5", - "2490774907999999754240", - "evmosvaloper19e53dt5r9w2mstt32jnj43xrxlyprnc085tl30", - }, - { - "evmos12nnlg4eu6cn4f5fvs8r5xe3dy5gg6fcgxdurpw", - "2490774907999999754240", - "evmosvaloper1wvgslxyxtg798cwsjj9epjcxxj8xqhj4a4pfzq", - }, - { - "evmos12qs5afgrpaa6c00t8gea5jl5wsyss7hmg2ntrp", - "2490774907999999754240", - "evmosvaloper1gj8uu6pxcncdtav707a86v3sqva2svn45sx62g", - }, - { - "evmos12wg6mfznv07xkp3u0755tzafx0nh036zdqvlpw", - "2490774907999999754240", - "evmosvaloper1q3aejvmwj9dxturgk00jv7hkwxld7ny7642tr8", - }, - { - "evmos12zq8q55qxj3mmjagp9exzep8wthdd3d35h842u", - "2490774907999999754240", - "evmosvaloper1q3aejvmwj9dxturgk00jv7hkwxld7ny7642tr8", - }, - { - "evmos13524casd26ke8hgg8dgccpddhy58q4zuagsm4j", - "2490774907999999754240", - "evmosvaloper1qq95x6dhrdnrfunlth5uh24tkrfphzl9crd3xr", - }, - { - "evmos136zva6h4al30g0guycfyqqveu656aj3ckvhw37", - "2490774907999999754240", - "evmosvaloper1shvcjzhcxau6qtlz9w82a646ecwp4hq7ayqt0w", - }, - { - "evmos13f3tnj4ruzptctqf8yr3l5an3ydyujrtwa8kam", - "2490774907999999754240", - "evmosvaloper1v4crs2adgcu2cdm2jxq07mw7ugzx0z4x6alxeg", - }, - { - "evmos13ha640dp9kl0mz9x9cprfqutkh9t2tnjd24u4v", - "2490774907999999754240", - "evmosvaloper1g57n4k08sk5z6ramzsgzrapgpsjsyh4t5tldw5", - }, - { - "evmos13htjqakl935d79dayp93a86ynpczxkwh47w7rj", - "2490774907999999754240", - "evmosvaloper17vze0tk7q7gwpd6jt69p4m5svrty40yw9a88e3", - }, - { - "evmos13hyx9dzktwqnx9prm0pkszue67yyzyg55xs2pm", - "2490774907999999754240", - "evmosvaloper1w2j20fj2a4wfmvqnhfhv4mfxkw5xxt09x8esyj", - }, - { - "evmos13kurl39c8xwkmtfpj04rs2v82apuzlqytgv2j6", - "2490774907999999754240", - "evmosvaloper1yw3uzauqx3lywnttftjr728e3j6e9ptfk7h406", - }, - { - "evmos13lyq9lchvdfxtfgh0e6ss3pee2hzj6v4rdgx9w", - "2490774907999999754240", - "evmosvaloper1w9m6p7ctu4gkdsr8plle997h25rzsa96xlzfat", - }, - { - "evmos13mqnk4khu72hwjzkk8ye7fh69w9n3fhp68qutm", - "2490774907999999754240", - "evmosvaloper1lwfuc2lc27mk8yys2zcd0qttcwmnd6x7gks5m5", - }, - { - "evmos13pw786jf2zuxs6sfcg9my9fuk04sslgxtsfd5z", - "2490774907999999754240", - "evmosvaloper18zt355ccyxd3kj23mz5hdz00qqn5lk5kjnj74m", - }, - { - "evmos13t8ey76z0h8x5zl0684l6uwqj93wzy94yw6k59", - "2490774907999999754240", - "evmosvaloper1qp49y6vh8vvv5yf8ule8fwx6sss82ncz39tunl", - }, - { - "evmos13u8vm9dulc0fz4ydwtgvtln9cygjfj3xq9mzaa", - "2490774907999999754240", - "evmosvaloper18lgy886ruwkuaefm2c0sn0gt9kgnj0de3kt6pv", - }, - { - "evmos140jj365u9ww7ht9jt575qay8n0qe3m3929na4u", - "2490774907999999754240", - "evmosvaloper1w2j20fj2a4wfmvqnhfhv4mfxkw5xxt09x8esyj", - }, - { - "evmos142uggw2c6vp80t50c5wwg38qkrl9f5lqqzh4tn", - "2490774907999999754240", - "evmosvaloper1teve9jdzedzu64mty72qc2888kh7t9hjchp5y2", - }, - { - "evmos1462xddydxpea4e8mtkxtw0k8vl65k0m83qrjkm", - "2490774907999999754240", - "evmosvaloper17vze0tk7q7gwpd6jt69p4m5svrty40yw9a88e3", - }, - { - "evmos14cqykjs8ll63anqmvmxlym5wh6a5kt0n5r9qkh", - "2490774907999999754240", - "evmosvaloper1qmpmzdesg9gr5wpyzkssayldnhk3pa8x2nwlwp", - }, - { - "evmos14f9dmatxqdp077grqqvuf7jtavztvrkjr7nlm2", - "2490774907999999754240", - "evmosvaloper1dj0mysdn05447p9ncsq9g424fv2ynaxryhpjkc", - }, - { - "evmos14nreydlcrzhhv3gkz8d6kj4v3aaw03vmxszzqv", - "2490774907999999754240", - "evmosvaloper10666nk6c845g295h9y77eprzpepdv82gnrrs4c", - }, - { - "evmos14uzqxyaq8kek5whxa4z06enguq87smu7vhu04u", - "2490774907999999754240", - "evmosvaloper1sq9ggymzx02vcp7kf6yyar83scfm4r22swu673", - }, - { - "evmos14xc0h00wztt7p687ywywywrmacfp9a08r965tj", - "2490774907999999754240", - "evmosvaloper1tjm6jya5wh65ha55c6279glcsa3mcs9srscytj", - }, - { - "evmos14xng9dq70c5auu3082tzf7vrkm0jpff8ypagkl", - "2490774907999999754240", - "evmosvaloper10666nk6c845g295h9y77eprzpepdv82gnrrs4c", - }, - { - "evmos14yffz25vzehwl7xxqhpxm5tmnkkf323jxp5256", - "2490774907999999754240", - "evmosvaloper174jlcery04j6r7wgvequeysruyjlhtcmlhnhy2", - }, - { - "evmos1505gsffxzl23c5tkrp2ac29tkyf2h9x64dhclj", - "2490774907999999754240", - "evmosvaloper10qpycc2egucukw8afcz4us7xlxxmfwh6rscvjz", - }, - { - "evmos154lv87xd4jqa00a8cu3jzpc35qzr6k32lsrk9f", - "2490774907999999754240", - "evmosvaloper1g57n4k08sk5z6ramzsgzrapgpsjsyh4t5tldw5", - }, - { - "evmos156jrlhh09cm9l475th6n8d6nfwzjry7npdznvc", - "2490774907999999754240", - "evmosvaloper1ce4vh0e5kanlgc7z0rhcemvd8erjnfzcyfecl7", - }, - { - "evmos15cvfrecqmrty4av8sa5qkmdd3yld3zpx28dvz7", - "2490774907999999754240", - "evmosvaloper155yk4wfn0xqye80exlsr6hu4qdfsvsgw63w87l", - }, - { - "evmos15em5xvdpgsr76tvg35plnmy23z3etvxvvhxrhr", - "2490774907999999754240", - "evmosvaloper1yw3uzauqx3lywnttftjr728e3j6e9ptfk7h406", - }, - { - "evmos15je422tpxzszj8hkts56q0vp7ewnu7elu3qrd0", - "2490774907999999754240", - "evmosvaloper1gzycxekfxq2hvu9jt255aajvlakay9nvz4p5jf", - }, - { - "evmos15lu27lnhzqnckkgcyk3am2m7jzmaq7z026mryt", - "2490774907999999754240", - "evmosvaloper1yw3uzauqx3lywnttftjr728e3j6e9ptfk7h406", - }, - { - "evmos15lysxnydt7dwkl57caq0p9x38wns2kuhct689y", - "2490774907999999754240", - "evmosvaloper1tjm6jya5wh65ha55c6279glcsa3mcs9srscytj", - }, - { - "evmos15nv5w9vx5r8xhw88r23l7lk4cjjqes894djzk2", - "2490774907999999754240", - "evmosvaloper1vdvflras2n3h7fjhe95h86wsy0z2nlsktngrp8", - }, - { - "evmos15r0tu0mrnrkl8cqlntrjj0420jxslf0e0zqmep", - "2490774907999999754240", - "evmosvaloper1gyxqlahz6g9ws5cu0tk3gccgryzja7558f069r", - }, - { - "evmos15u8wwpdx88wxf5gsf0836dz9tlgq9pef4yt0wg", - "2490774907999999754240", - "evmosvaloper14yeq3lkajldaggj28hmq8xng9xux7x5g86tx29", - }, - { - "evmos162dan7l7097h066ghyvvvcv0hkdpa0n58ntucy", - "2490774907999999754240", - "evmosvaloper1k96y0w5wf089nuvvym3s324c8umd3vvm4yh578", - }, - { - "evmos165h7l4qjfsvw0vx24cn3406jg5t4ue562fdwx8", - "2490774907999999754240", - "evmosvaloper1zk0sx2e677293wfmhxngpexu50vps3sdwyef92", - }, - { - "evmos165pcssku36hc8hwgf3l8n0ce2e7wg4twudca8j", - "2490774907999999754240", - "evmosvaloper17hd4fyhqkgply6klljx3ugqemhdgqhe8xu2yu6", - }, - { - "evmos167prkrl3wmecgtt5skd640ug59jrmn8xvxpyct", - "2490774907999999754240", - "evmosvaloper1rhddecqpwfjdkwmu6lmfzekh936kcu6wxs7jxa", - }, - { - "evmos16d4lkdzc9f8a0q9v6gwj0nqz0d0mew25tgzv3q", - "2490774907999999754240", - "evmosvaloper1f6m9d94lkenw9fy5wmytatt76l849kx6ugdz70", - }, - { - "evmos16e0tfcfmgwsjn4j59c3wfxxjc0sf6u06amky8x", - "2490774907999999754240", - "evmosvaloper1zk0sx2e677293wfmhxngpexu50vps3sdwyef92", - }, - { - "evmos16f82azyhh4hh0yvrh3t33a35tlju7jvrmxhwhy", - "2490774907999999754240", - "evmosvaloper1aep37tvd5yh4ydeya2a88g2tkjz6f2lcrfjumh", - }, - { - "evmos16h7wy55l5cq4rwyqll9mlguh2yszel8n28szzt", - "2490774907999999754240", - "evmosvaloper1tjm6jya5wh65ha55c6279glcsa3mcs9srscytj", - }, - { - "evmos16lf5nja2sum5qsdgfwn7gd5gnue4xf9rgcce35", - "2490774907999999754240", - "evmosvaloper17zaf6jk6gupa0mgnyyt7e4u8y783k6u3wz6avj", - }, - { - "evmos16lhttd99uleftwak6jdjl7fnemmmhy9jt4amwh", - "2490774907999999754240", - "evmosvaloper1d6c097pmd6avh0x3spfwc0cagc690e2mmkpx4h", - }, - { - "evmos16px8gx665nukj60j2frwgvdnsu3vrx06ejcv4y", - "2490774907999999754240", - "evmosvaloper1kw03prf96w5rrj53pvhdnmsnr469dn9gqmsqwg", - }, - { - "evmos16r48g4xgqzzqv4jha2zul8huf8fjaaey9e9eql", - "2490774907999999754240", - "evmosvaloper18zt355ccyxd3kj23mz5hdz00qqn5lk5kjnj74m", - }, - { - "evmos16wge4zc7t8yedal37anqzm74a7a829ynqqjwdg", - "2490774907999999754240", - "evmosvaloper148hpdcvge7jgjr4xxjufcq56w5k4rr0pnnqxla", - }, - { - "evmos16x9xgchl9lq2w72426zjqjemxf8wqafl7qzcsd", - "2490774907999999754240", - "evmosvaloper1pz3mcahcrglf3md4lggax5r95gvmppc6x5w7hw", - }, - { - "evmos175202x3pc4lwta5lxzu49zhsu6u54c5zx02kx2", - "2490774907999999754240", - "evmosvaloper1sx5qerxjzthnjzne7wz4x6ml4envjehvwtx8c7", - }, - { - "evmos175e7zucffjjdpfz30td7a9mp98q5af7wdehh20", - "2490774907999999754240", - "evmosvaloper1gyxqlahz6g9ws5cu0tk3gccgryzja7558f069r", - }, - { - "evmos1773rxl2rgzkqg2xqjevnctvjgy4e5qhwu8h89s", - "2490774907999999754240", - "evmosvaloper139gzv3nvlkp4ylrywsnj8eurm6qwp8t3l9a2gy", - }, - { - "evmos178selfke8eecc8rr0a05mkn2cltwlsk7nqc6ch", - "2490774907999999754240", - "evmosvaloper15fezptqfn3rmxtl4006ze9plealy4w9xdfamnv", - }, - { - "evmos179h8lquqfnwtgmyy2ujvlpl0gn4ma3wxnprygc", - "2490774907999999754240", - "evmosvaloper1f45kvvy80gzcfccgvmg5gjzelwxeuk2k26xelm", - }, - { - "evmos17juzq8pgpwnmd232m8ner3g5tn0mxajfqw5hzn", - "2490774907999999754240", - "evmosvaloper1qx7u07f2tv5j8677r3ttt97prkc2dgcyp2km24", - }, - { - "evmos17lterknwu23d0sfp9754hh69clcmpvnnauq2kr", - "2490774907999999754240", - "evmosvaloper15n2ms99yx2lycwk0msmtlj9yxhtlmqeymtg4c3", - }, - { - "evmos17q5wd30dd7n9k7kytvc528hgngxh26g82qq7fm", - "2490774907999999754240", - "evmosvaloper1hdslyd0vwj8ym368tqc5jdpu6hxrqvx9zex5yz", - }, - { - "evmos17s3rkzt8k43qjndv420au26kjgfg6cuyg9ek9c", - "2490774907999999754240", - "evmosvaloper15ksyw7t5t9e7w9n3d2jqqmv7y334mfrhfvvnge", - }, - { - "evmos17w44wkmdckl4p5lz2a486wf3m6xe9y7e2hfmdr", - "2490774907999999754240", - "evmosvaloper1x5y65hgngh77sxta6s2vpjnfjep3ltllyhf2hs", - }, - { - "evmos1855plrrgfasmy6zd5rma7qs9jhmws0phymc4vg", - "2490774907999999754240", - "evmosvaloper1aep37tvd5yh4ydeya2a88g2tkjz6f2lcrfjumh", - }, - { - "evmos188wgpx2azm8gakxk4z0jtextpw93wfpfm8tym9", - "2490774907999999754240", - "evmosvaloper139gzv3nvlkp4ylrywsnj8eurm6qwp8t3l9a2gy", - }, - { - "evmos18cajaqrsysmnh2e28kcmek36mgy09j53hjxnje", - "2490774907999999754240", - "evmosvaloper1jxruqmfurgxrem4phvaqxkvprxa6fr0ncg3t88", - }, - { - "evmos18dm9d8ppszfw7wm7g9l44wrhuasjfjrtcgnzwf", - "2490774907999999754240", - "evmosvaloper1rh9uz23gmhr6q92a45qrath4fr9ffefz4eas0z", - }, - { - "evmos18fz0srg0t5lmh43k6e466pr4sj4wt6j3eh2fq3", - "2490774907999999754240", - "evmosvaloper15ksyw7t5t9e7w9n3d2jqqmv7y334mfrhfvvnge", - }, - { - "evmos18grrkdd8u3z4j09f6w4lktjft5waaxrh4wyc3e", - "2490774907999999754240", - "evmosvaloper1wxllvjqmha2p437dpczat82wzpr8gem04jkwmz", - }, - { - "evmos18j06ymnsvfg8qxs06yvlf06ev8j5aknm0df0ze", - "2490774907999999754240", - "evmosvaloper1a22spreqspsh9s3v67ctsuzaf9n4kallj7wuzf", - }, - { - "evmos18md0snc68hhw00mk7vdgz7yatatnghals2uaan", - "2490774907999999754240", - "evmosvaloper1n9f25qr9hkt4alsq3d3jmrc6x246nmc7ghujrh", - }, - { - "evmos18q9xl8emu4mz7w2ncstfz3p8eqnste68m7gat4", - "2490774907999999754240", - "evmosvaloper1y6yvdg2xdltzr0v5hvf8zvxk373xwas4jwgvkp", - }, - { - "evmos18vupg3ue3v86azvkyk7anqwjnqnug9dht0dk03", - "2490774907999999754240", - "evmosvaloper1ce4vh0e5kanlgc7z0rhcemvd8erjnfzcyfecl7", - }, - { - "evmos190cg2v34s02kqgar0xlpng0dyshracht3fzdp3", - "2490774907999999754240", - "evmosvaloper1rw4nendrehkr5tkhjswzy8ts97dvwg7rc0u0kp", - }, - { - "evmos192jw36d73q79hg737p47297rv2xqwe9266x3ac", - "2490774907999999754240", - "evmosvaloper1suvf29zmvlmgg92zngez946nj8jrtu4hmxpwqv", - }, - { - "evmos192y3w9wwdua9xej8lqe23fdyh7k5qr85hya7j7", - "2490774907999999754240", - "evmosvaloper1gj8uu6pxcncdtav707a86v3sqva2svn45sx62g", - }, - { - "evmos19470jk9wftzl7t7c039v7uffxqhv27sr9glevj", - "2490774907999999754240", - "evmosvaloper1v6ack3xwvnktwkq00kw4ld5xxlw55r5zmh26k0", - }, - { - "evmos198erj85kfsmg3arqa6xtzh27x52msg0z7a7n49", - "2490774907999999754240", - "evmosvaloper1y6yvdg2xdltzr0v5hvf8zvxk373xwas4jwgvkp", - }, - { - "evmos19axnee54u0wzq7vhtgs5mpcmsqkvtkxyhcuyuh", - "2490774907999999754240", - "evmosvaloper1t3rfzrxeslmtz62mydyf2xmmxehwk7xzaaucjd", - }, - { - "evmos19lylqtc8fg2sptfpu0q2qcmwphsp5xegzz34kz", - "2490774907999999754240", - "evmosvaloper1f45kvvy80gzcfccgvmg5gjzelwxeuk2k26xelm", - }, - { - "evmos19np3hz93th5j79p5yxvwlqemtdt88nt3p6nadn", - "2490774907999999754240", - "evmosvaloper1ufg2a3vc4vmsmxtjmckjzltqvz83ste98mr6x5", - }, - { - "evmos19uuy5r6nag39krugj3xv9n4xxwpy3tf2k8ek78", - "2490774907999999754240", - "evmosvaloper17hd4fyhqkgply6klljx3ugqemhdgqhe8xu2yu6", - }, - { - "evmos1a4td0xg29rtyyl08f4l9ujw2f7k8yq4ahf6x56", - "2490774907999999754240", - "evmosvaloper1c55g6u7q2uzgks9gjp80sle8n6qcyg64vk64g2", - }, - { - "evmos1a949xpqwa3makhme8zd3hdqmvx5nxuvxcfpzrf", - "2490774907999999754240", - "evmosvaloper1vm5fvg57aeqp7xwl3umev7z0364jzvcfzlnfew", - }, - { - "evmos1aq356mddxdk8xwh8vrqndgdal8r8tuawfy2mq7", - "2490774907999999754240", - "evmosvaloper13nujml9r2dg85nucffe82xq3yg8f35qxmfal7p", - }, - { - "evmos1aqqavrwr47656s9dcttphhumh4hv5ul8nr7l2h", - "2490774907999999754240", - "evmosvaloper14yeq3lkajldaggj28hmq8xng9xux7x5g86tx29", - }, - { - "evmos1arwgy8ye37gu70qattzcngka6497f90srwqt2q", - "2490774907999999754240", - "evmosvaloper13nujml9r2dg85nucffe82xq3yg8f35qxmfal7p", - }, - { - "evmos1au7gmaa5zs0dc70lvy00u23n9lp6m3nnq68afr", - "2490774907999999754240", - "evmosvaloper1vm5fvg57aeqp7xwl3umev7z0364jzvcfzlnfew", - }, - { - "evmos1avnl3j6g6y66xa57ta3vs66g9qmfml0nwvp9vd", - "2490774907999999754240", - "evmosvaloper13nujml9r2dg85nucffe82xq3yg8f35qxmfal7p", - }, - { - "evmos1azllshwylfcvz3k44ma756nkvtdsp3lnfmjnrg", - "2490774907999999754240", - "evmosvaloper1f08fffp8zz42jj0f6wh3gyu7he4hf6zzs6mn8j", - }, - { - "evmos1c4twatcp4mc8y7h7hrzzrgees0ty7emtct4fwc", - "2490774907999999754240", - "evmosvaloper1rw4nendrehkr5tkhjswzy8ts97dvwg7rc0u0kp", - }, - { - "evmos1c6rsfda69mwt0qgqc74cseark7yjdyfnzq73s2", - "2490774907999999754240", - "evmosvaloper1g57n4k08sk5z6ramzsgzrapgpsjsyh4t5tldw5", - }, - { - "evmos1c7fqn7ucna5mrrt7ep0zm2ajs88pvmnkepcwhd", - "2490774907999999754240", - "evmosvaloper1qhazu8zleyn5chrkxymewx3xw5guq2vm6q7zl0", - }, - { - "evmos1ca4vgg7g0pcge3jkyk85v2ys25nakn4hjtatv2", - "2490774907999999754240", - "evmosvaloper15n2ms99yx2lycwk0msmtlj9yxhtlmqeymtg4c3", - }, - { - "evmos1cc8jx44fnn0ezcru4wtujalvuxgur4wqcs0xhr", - "2490774907999999754240", - "evmosvaloper1ufg2a3vc4vmsmxtjmckjzltqvz83ste98mr6x5", - }, - { - "evmos1chhdd5yx2m0qjsc999gu9f6a0mpsy4wkcecgw7", - "2490774907999999754240", - "evmosvaloper1jhe4gfgl7wv3s99h3d9tz4g833j8265e7cjqyw", - }, - { - "evmos1ckuc6mq84nkwfndq0uusl9p0sqam4ywxer9czh", - "2490774907999999754240", - "evmosvaloper1tczjwjrr36e0l5jjqnwrp95kv8mk57zdmxse4m", - }, - { - "evmos1ctyjd8p7svycppxh8cfnvhzpat82yc25pyggla", - "2490774907999999754240", - "evmosvaloper1vm5fvg57aeqp7xwl3umev7z0364jzvcfzlnfew", - }, - { - "evmos1cxps9974s9ghc0kk8vjpk4ujwwar8n7rdxvzu2", - "2490774907999999754240", - "evmosvaloper1chx7v975g72xuw8kdpjt94dh35daqqfyc37kys", - }, - { - "evmos1cz84gz4cx69f7h7eus4wuq2ycs2adm0rn3nk9t", - "2490774907999999754240", - "evmosvaloper1g376mzt2kcszpf7y3ee7r8jpseq2zv9hshf5g3", - }, - { - "evmos1d06v9pdygtcz0ngzxzsvynq5url7knd4sjvhz7", - "2490774907999999754240", - "evmosvaloper1shvcjzhcxau6qtlz9w82a646ecwp4hq7ayqt0w", - }, - { - "evmos1d0c2kfr8gxujxu6xmc24m48jnw77dzpqq32akf", - "2490774907999999754240", - "evmosvaloper10pcga9su5me3dp5g4jln49uxjq7c9s2u9qy9zu", - }, - { - "evmos1d3s9gksy67f5dx4cx6dhysyqr45acmdxxp5dnm", - "2490774907999999754240", - "evmosvaloper18lgy886ruwkuaefm2c0sn0gt9kgnj0de3kt6pv", - }, - { - "evmos1d40u8c4hfztasamwl4wv5vhkpl4l8xnzadwtht", - "2490774907999999754240", - "evmosvaloper1k96y0w5wf089nuvvym3s324c8umd3vvm4yh578", - }, - { - "evmos1d6n63y8q6237lalgjwrdxdytf5d4ehtdjg909q", - "2490774907999999754240", - "evmosvaloper10666nk6c845g295h9y77eprzpepdv82gnrrs4c", - }, - { - "evmos1dfzez23st0zjwsldznymc8qn34sc3467rw2fav", - "2490774907999999754240", - "evmosvaloper17jyfw78xztc8crq4t8znjlg8ld76lkzkg2hny3", - }, - { - "evmos1dm9t9n064ve089ll5ngt8dwc4g3dj2w349j6l7", - "2490774907999999754240", - "evmosvaloper1ur0zjltn3qs5xzx4rn8ekr828f4tglyhu50c0w", - }, - { - "evmos1dnv7n87afgxuu9pqngcxskhkufmpg9ktt0vngg", - "2490774907999999754240", - "evmosvaloper13nujml9r2dg85nucffe82xq3yg8f35qxmfal7p", - }, - { - "evmos1dvvgr725w43pzv2s2xnmff3j2y3rtutyasstfp", - "2490774907999999754240", - "evmosvaloper1jd6w3lm4y22680fkwvykx5h8tjzftd9z0mdcqm", - }, - { - "evmos1dvvl0xqj3kgz47am207y422lgz40sfzwr050e7", - "2490774907999999754240", - "evmosvaloper17z0xyw6vwjn6gqj86s3axs7mjsngdl6sncdwga", - }, - { - "evmos1e09qts2f7gcn80n0hkamcdmsncju45mxthjx8l", - "2490774907999999754240", - "evmosvaloper1mtwvpdd57gpkyejd566s24afr9zm5ryq8gwpvj", - }, - { - "evmos1e4d9km7a4jvmqvp2fnflyn96cft4gkda67yu47", - "2490774907999999754240", - "evmosvaloper19fv2gwkgv3x53lau3um6tzg7qxvq96grvg97zr", - }, - { - "evmos1e6ee6flfqxnwhrxeyff27uxdcaz8kzddhkwjuc", - "2490774907999999754240", - "evmosvaloper1hn8u6x03mklzdy69r9khsd9q4yft7gmrkz8qkj", - }, - { - "evmos1e6s8k0n3j8hwyt8vqw0lezsf83pscq5ytsl3q4", - "2490774907999999754240", - "evmosvaloper17z0xyw6vwjn6gqj86s3axs7mjsngdl6sncdwga", - }, - { - "evmos1e8s4u95m8yfq7wp7d98w00xva0prh353cq58qt", - "2490774907999999754240", - "evmosvaloper1ce4vh0e5kanlgc7z0rhcemvd8erjnfzcyfecl7", - }, - { - "evmos1erqmu7guwmrsdu7y2kzzxc94a3paw7m958lae4", - "2490774907999999754240", - "evmosvaloper1k5hcl0cjprzewwvzhz3um589kx8skzlrneuepu", - }, - { - "evmos1ez7qcm799zpdqlhulga6p6stpskwtm5j09h5vq", - "2490774907999999754240", - "evmosvaloper1gzycxekfxq2hvu9jt255aajvlakay9nvz4p5jf", - }, - { - "evmos1ezpqc7f9t5e76ugzuuwksr350vs4k32n5jk5ak", - "2490774907999999754240", - "evmosvaloper1aep37tvd5yh4ydeya2a88g2tkjz6f2lcrfjumh", - }, - { - "evmos1f42qwt93vsxrrngmcjrvxs30e4247yw3jstq5k", - "2490774907999999754240", - "evmosvaloper1ulkhal0g0fmgsjlf8q7mdd46m6t9sqkhmpfvfd", - }, - { - "evmos1f765n9r7fq9upvu8cj5u4eqfagv6606k5p7haz", - "2490774907999999754240", - "evmosvaloper1v6ack3xwvnktwkq00kw4ld5xxlw55r5zmh26k0", - }, - { - "evmos1f7kqcptlcnegc3ur06zwr4rze0cmsnn4lzn3wq", - "2490774907999999754240", - "evmosvaloper1vdvflras2n3h7fjhe95h86wsy0z2nlsktngrp8", - }, - { - "evmos1f8caw8llc3vtnykj6s38m47h23t600ltpw5ge2", - "2490774907999999754240", - "evmosvaloper1qq95x6dhrdnrfunlth5uh24tkrfphzl9crd3xr", - }, - { - "evmos1fe4f0cetl968avd5q205g7dv57kmkc6vckjul9", - "2490774907999999754240", - "evmosvaloper1pj3c7q7tj888h4ms9uq2qql2hf84pndx3zvleu", - }, - { - "evmos1fna6pw5axdt0gpjm2l0r2zfsf6vnahlqhq26mx", - "2490774907999999754240", - "evmosvaloper1wvgslxyxtg798cwsjj9epjcxxj8xqhj4a4pfzq", - }, - { - "evmos1fqeezech7r9mr20aggde4a36qf4zy57rew5lvx", - "2490774907999999754240", - "evmosvaloper148hpdcvge7jgjr4xxjufcq56w5k4rr0pnnqxla", - }, - { - "evmos1fwz2l5ewpt2wj0vlcsrx59dstsqhaa3292uvxy", - "2490774907999999754240", - "evmosvaloper1tczjwjrr36e0l5jjqnwrp95kv8mk57zdmxse4m", - }, - { - "evmos1fzlqj3h3vd8huuz0e8mskwtsdpdpqm4plmdldh", - "2490774907999999754240", - "evmosvaloper19fxanpnjlggzuur3m3x0puk5ez7j9lrttexwsw", - }, - { - "evmos1g4nftzvxvakkrj5m3sfm3w7h3gr2gqphlk0xtv", - "2490774907999999754240", - "evmosvaloper1hdslyd0vwj8ym368tqc5jdpu6hxrqvx9zex5yz", - }, - { - "evmos1g9qve9h0enjtgld5cmn0n6g0jlumyjq08d49ar", - "2490774907999999754240", - "evmosvaloper1k5hcl0cjprzewwvzhz3um589kx8skzlrneuepu", - }, - { - "evmos1gczhgrrlayq8we0he5ad3swmy4cyruhre5pu2t", - "2490774907999999754240", - "evmosvaloper174jlcery04j6r7wgvequeysruyjlhtcmlhnhy2", - }, - { - "evmos1gd6skwtfjuy69l7c64pfa679rj3reyhj68lday", - "2490774907999999754240", - "evmosvaloper1fpjf8aywxg9qxexfwu9lanlgw58f5fhqfu348k", - }, - { - "evmos1gdq05xw05xfxnmdll4nw7rlzu35z785n5glfsa", - "2490774907999999754240", - "evmosvaloper1rhddecqpwfjdkwmu6lmfzekh936kcu6wxs7jxa", - }, - { - "evmos1gdq7ysun459a60axpw5uh269jsywzhqwlz9tgj", - "2490774907999999754240", - "evmosvaloper1v4crs2adgcu2cdm2jxq07mw7ugzx0z4x6alxeg", - }, - { - "evmos1gnmw34hc4kst42wvrlahvthgf8wjdx8daf2759", - "2490774907999999754240", - "evmosvaloper1vrruadnv4glvjze923m9rjaq96fyzks6egmspz", - }, - { - "evmos1gnyvms5z3p5t9q3h0a88pqnn5axw5apwll9q0q", - "2490774907999999754240", - "evmosvaloper1jd6w3lm4y22680fkwvykx5h8tjzftd9z0mdcqm", - }, - { - "evmos1gst2w8h77hwaufnp0tc8x97nwefwkacup9kl47", - "2490774907999999754240", - "evmosvaloper1c55g6u7q2uzgks9gjp80sle8n6qcyg64vk64g2", - }, - { - "evmos1gv5n44s7jych0vw0nd7cmj3qa6phuyzp9h5k9s", - "2490774907999999754240", - "evmosvaloper18zt355ccyxd3kj23mz5hdz00qqn5lk5kjnj74m", - }, - { - "evmos1gw3wy0cgudjc05ngcduqzd3j0zxh3t3flsny4y", - "2490774907999999754240", - "evmosvaloper19fv2gwkgv3x53lau3um6tzg7qxvq96grvg97zr", - }, - { - "evmos1gzmgs3nz94dv4u64gew6epk6h87kxdnl0mkce6", - "2490774907999999754240", - "evmosvaloper1f45kvvy80gzcfccgvmg5gjzelwxeuk2k26xelm", - }, - { - "evmos1h32dwc4s9kr0e9c7dxnaupdsq0gtrtzvqwkmpv", - "2490774907999999754240", - "evmosvaloper1tcty2k97cdv5sc6xcdf2atrrxq0zg7vvjyfsmr", - }, - { - "evmos1h5kwl258efm2dj2lf3h03av74n455vydmz60ln", - "2490774907999999754240", - "evmosvaloper1qhazu8zleyn5chrkxymewx3xw5guq2vm6q7zl0", - }, - { - "evmos1h6045vhzt4edvnva8rnke0cxlg5ydatlhsppft", - "2490774907999999754240", - "evmosvaloper10666nk6c845g295h9y77eprzpepdv82gnrrs4c", - }, - { - "evmos1h9yfrkq03trtx7tdhzzjxcgj4wz4d9rwcqn4ac", - "2490774907999999754240", - "evmosvaloper1f45kvvy80gzcfccgvmg5gjzelwxeuk2k26xelm", - }, - { - "evmos1hcrq4jhuc6sh3p77fhavhw7nlwn2qkj5v0jjj6", - "2490774907999999754240", - "evmosvaloper1ur0zjltn3qs5xzx4rn8ekr828f4tglyhu50c0w", - }, - { - "evmos1hpxudw3kv96r68sj59yvdyc4xu3y0hy029dz55", - "2490774907999999754240", - "evmosvaloper17zaf6jk6gupa0mgnyyt7e4u8y783k6u3wz6avj", - }, - { - "evmos1hrknv3zarmnqxk2rhw0wghl3jsyc822ka2fxd9", - "2490774907999999754240", - "evmosvaloper1k5hcl0cjprzewwvzhz3um589kx8skzlrneuepu", - }, - { - "evmos1hvav7wzmdudhgmhre2snrc4w0xm75kwpjjwaf4", - "2490774907999999754240", - "evmosvaloper1hyytyjxr02j72cx0cgjl24s3nn2yrdqqaslk84", - }, - { - "evmos1j2quk68z58atkas9gcg5hfy2xgxsrlu8jlyg0y", - "2490774907999999754240", - "evmosvaloper1xaxg47uw046uw8vgpp3da367ctw9aguqjuyyyx", - }, - { - "evmos1j59nk2n94uumky0n5hcky6yx8maa7yh6n5h0cz", - "2490774907999999754240", - "evmosvaloper1d6c097pmd6avh0x3spfwc0cagc690e2mmkpx4h", - }, - { - "evmos1j76z34xzfnkd8ds9fhn9eajgej3yvfttqfs3dc", - "2490774907999999754240", - "evmosvaloper1aep37tvd5yh4ydeya2a88g2tkjz6f2lcrfjumh", - }, - { - "evmos1j94fm60k62xc4f57mlg90n3hdw85yewr5gvkrq", - "2490774907999999754240", - "evmosvaloper15fezptqfn3rmxtl4006ze9plealy4w9xdfamnv", - }, - { - "evmos1jcxczjzmel6ujzjw6rl295gguhmm0wtkdaugzl", - "2490774907999999754240", - "evmosvaloper1rwy29t3eup0tnaph08rezdjsmckzqemkxh535w", - }, - { - "evmos1jf0xgtg0wpea6x7gulzd9g9h2gc5u3rm0v4jm8", - "2490774907999999754240", - "evmosvaloper1k5hcl0cjprzewwvzhz3um589kx8skzlrneuepu", - }, - { - "evmos1jh8g9tp4jkk9p24wjhcjte9hy4cxcfcdzp77a7", - "2490774907999999754240", - "evmosvaloper17hd4fyhqkgply6klljx3ugqemhdgqhe8xu2yu6", - }, - { - "evmos1jld6q525yhktw259f8vwp56y5vk6kra56gs6dc", - "2490774907999999754240", - "evmosvaloper1psf28krr9muve6w0qzgjlrju5mamlsac96l85q", - }, - { - "evmos1jn68sgevvvkger38n3e2nuanrw4udg0y9xusux", - "2490774907999999754240", - "evmosvaloper17zaf6jk6gupa0mgnyyt7e4u8y783k6u3wz6avj", - }, - { - "evmos1jnhe754w3egtphy792ddqggkg89s8y3smcstcy", - "2490774907999999754240", - "evmosvaloper1g57n4k08sk5z6ramzsgzrapgpsjsyh4t5tldw5", - }, - { - "evmos1jxrqvq6n427kyvru6tkf9e5utexelpcfrj5p7y", - "2490774907999999754240", - "evmosvaloper1u6ndfv26nc2jw43kx0kzck8s9pnunakwgu8vmc", - }, - { - "evmos1k0xwq946emrhnvxu3dv7cpwf2fqmzc38e60udd", - "2490774907999999754240", - "evmosvaloper10xhy8xurfwts9ckjkq0ga92mrjz9txyy6y8l2g", - }, - { - "evmos1k426xyvf3dwa4fvnq2qtjun4f45gruj3vrxyka", - "2490774907999999754240", - "evmosvaloper1ur0zjltn3qs5xzx4rn8ekr828f4tglyhu50c0w", - }, - { - "evmos1kcykfdu5fr7ya2ua3ygd3eysq8l6gtmf2tqczw", - "2490774907999999754240", - "evmosvaloper10q09k0flvffqzcmy2nx20nhxzs78nnesrv60ad", - }, - { - "evmos1kgwd006yrqp6hmdhpwe2s4w2ktw9a9wkkdccuu", - "2490774907999999754240", - "evmosvaloper17z0xyw6vwjn6gqj86s3axs7mjsngdl6sncdwga", - }, - { - "evmos1khu4se2pkmvfknrm38w7ccw2cakzj5v4ysy63n", - "2490774907999999754240", - "evmosvaloper17jyfw78xztc8crq4t8znjlg8ld76lkzkg2hny3", - }, - { - "evmos1kjf9druqftr4xkrzlwtj3jdpcrfg4ccwua4gke", - "2490774907999999754240", - "evmosvaloper1qmpmzdesg9gr5wpyzkssayldnhk3pa8x2nwlwp", - }, - { - "evmos1klsxkfjvfvjwrqur5l3zwwune6zcx8hqnuz5ep", - "2490774907999999754240", - "evmosvaloper1fhfkklmv764r3u6kqkeflmddr6rlzhf4r9lae6", - }, - { - "evmos1kp6qp2tks6w09r9z7nnz49rfnf6eypuzas8dql", - "2490774907999999754240", - "evmosvaloper18zhvafj8jcezdut6z9u0pcsnqy978ya9d25du5", - }, - { - "evmos1kpl2yjxfy7htvzg57vsu72zy4c6zzjxkgew88r", - "2490774907999999754240", - "evmosvaloper15ksyw7t5t9e7w9n3d2jqqmv7y334mfrhfvvnge", - }, - { - "evmos1krpwkqjz0d54pneg0dr3c5rvql8h8pjcnu69wn", - "2490774907999999754240", - "evmosvaloper1cpa5rlkxt8x7nu8rnqm9q4wc8qan5ve5cvd8e5", - }, - { - "evmos1kv7eyqq7tu4hlz0na24xz7qtsgmq66vvcdmyf3", - "2490774907999999754240", - "evmosvaloper1u6ndfv26nc2jw43kx0kzck8s9pnunakwgu8vmc", - }, - { - "evmos1kxk5xycddxjlxk5xym686j9np6hpt7wvmr73x4", - "2490774907999999754240", - "evmosvaloper1fpjf8aywxg9qxexfwu9lanlgw58f5fhqfu348k", - }, - { - "evmos1l5pjjm099z9ysy5k4kar9cde2x30jm438suwv6", - "2490774907999999754240", - "evmosvaloper1suvf29zmvlmgg92zngez946nj8jrtu4hmxpwqv", - }, - { - "evmos1l69c7vxe638ve0ls7ld43uvxfhxjpnzy5ptlvc", - "2490774907999999754240", - "evmosvaloper17z0xyw6vwjn6gqj86s3axs7mjsngdl6sncdwga", - }, - { - "evmos1l96l2gzk7j5wuqlg6pnht3zf75v9470lwxath6", - "2490774907999999754240", - "evmosvaloper1jk7umxyky5m5dul46t8nxneavlg7eysjr6lfj7", - }, - { - "evmos1lewtkae3txyltsy9qlquqpntlw508xwlh0hw43", - "2490774907999999754240", - "evmosvaloper1x5y65hgngh77sxta6s2vpjnfjep3ltllyhf2hs", - }, - { - "evmos1lf50nn8txda8m53nwqj8adxljtc233l8h8cr6e", - "2490774907999999754240", - "evmosvaloper1v4crs2adgcu2cdm2jxq07mw7ugzx0z4x6alxeg", - }, - { - "evmos1lhsgj25dln3h7sq5wpvvadg468mlynan35w22f", - "2490774907999999754240", - "evmosvaloper1kegt9p7se6mpmtt47axx0rwxlp8tr5626pq09u", - }, - { - "evmos1lka6wccrn0zlg96tdsvr3gxf0uppd2k0gk43yx", - "2490774907999999754240", - "evmosvaloper18zt355ccyxd3kj23mz5hdz00qqn5lk5kjnj74m", - }, - { - "evmos1ll57266alkwle5qus0eesr278xajtwremrxksn", - "2490774907999999754240", - "evmosvaloper1x5y65hgngh77sxta6s2vpjnfjep3ltllyhf2hs", - }, - { - "evmos1lp4t9u7hwrs8cak4e7dzyut58khc3ylas367lc", - "2490774907999999754240", - "evmosvaloper1d74wdckw5vyn6gwqt4r0ruemp9n8vmwtudw848", - }, - { - "evmos1lqq03qu55detuyl2chhe8cz7qk0ek62kelpa9v", - "2490774907999999754240", - "evmosvaloper17vze0tk7q7gwpd6jt69p4m5svrty40yw9a88e3", - }, - { - "evmos1lrewt2u4f53zlrsttywu39dj6l3dfdsaq09l7v", - "2490774907999999754240", - "evmosvaloper1jxruqmfurgxrem4phvaqxkvprxa6fr0ncg3t88", - }, - { - "evmos1lrzkxyvst5vs2zjtmhkpkdthfzu3t360q35td7", - "2490774907999999754240", - "evmosvaloper1jk7umxyky5m5dul46t8nxneavlg7eysjr6lfj7", - }, - { - "evmos1lte573jvsjwgvd66y8advwt4urv5hf79pf76sh", - "2490774907999999754240", - "evmosvaloper1v4crs2adgcu2cdm2jxq07mw7ugzx0z4x6alxeg", - }, - { - "evmos1m3cnflnj344za3l0tvf5xke7ycyz8l3qp0yrlp", - "2490774907999999754240", - "evmosvaloper1d74wdckw5vyn6gwqt4r0ruemp9n8vmwtudw848", - }, - { - "evmos1m77493mefamta88mterk7z24zzm3uscc4unpys", - "2490774907999999754240", - "evmosvaloper1jd6w3lm4y22680fkwvykx5h8tjzftd9z0mdcqm", - }, - { - "evmos1matqgfgtm7jk82nspmqsnly4rcxa52ef7kl208", - "2490774907999999754240", - "evmosvaloper17zaf6jk6gupa0mgnyyt7e4u8y783k6u3wz6avj", - }, - { - "evmos1me3j5pe37g3mz89en2xenx6r9n2q2gf8tzam9d", - "2490774907999999754240", - "evmosvaloper1c55g6u7q2uzgks9gjp80sle8n6qcyg64vk64g2", - }, - { - "evmos1mjc49cqr49mf7png4n3eqjpegkrg5v8wadku5z", - "2490774907999999754240", - "evmosvaloper1g57n4k08sk5z6ramzsgzrapgpsjsyh4t5tldw5", - }, - { - "evmos1ml6n4fn7cwe923zyd3j8ct033qm9ptuvdxa03f", - "2490774907999999754240", - "evmosvaloper1teve9jdzedzu64mty72qc2888kh7t9hjchp5y2", - }, - { - "evmos1mpj0d076a6ljhxc5v4vauh6c3vp086t09q0vg0", - "2490774907999999754240", - "evmosvaloper1qq95x6dhrdnrfunlth5uh24tkrfphzl9crd3xr", - }, - { - "evmos1mzqw9wuz9jag4ydqp0lw0f2m3stw52j3w5adfq", - "2490774907999999754240", - "evmosvaloper1fhfkklmv764r3u6kqkeflmddr6rlzhf4r9lae6", - }, - { - "evmos1nf4gq46fktp9vg0urfqtgqgpucr7nefu5phs5g", - "2490774907999999754240", - "evmosvaloper1rwy29t3eup0tnaph08rezdjsmckzqemkxh535w", - }, - { - "evmos1nfq4gg29mysveukpfvr62s59yhufzt0nnrrh5u", - "2490774907999999754240", - "evmosvaloper1l840d9sse36j9cvzgq98vennrzuu5l70l5shhc", - }, - { - "evmos1nj0h5f59xqqu864apnp0mm2axjrxf0rmesrd28", - "2490774907999999754240", - "evmosvaloper1teve9jdzedzu64mty72qc2888kh7t9hjchp5y2", - }, - { - "evmos1nktua2vcunhpf0zs4rtaevyktc779shcvt7qqn", - "2490774907999999754240", - "evmosvaloper1fpjf8aywxg9qxexfwu9lanlgw58f5fhqfu348k", - }, - { - "evmos1nqnzmd8v06hv64h2e55u6jmdk578vf63yuljt7", - "2490774907999999754240", - "evmosvaloper1v4crs2adgcu2cdm2jxq07mw7ugzx0z4x6alxeg", - }, - { - "evmos1nva0qhzeznq8qak35lkkzfk3tacy75khzhal48", - "2490774907999999754240", - "evmosvaloper1v4crs2adgcu2cdm2jxq07mw7ugzx0z4x6alxeg", - }, - { - "evmos1p2kg83d0p0xk6ypuq7fgejwhrtayhzsn0ttzmy", - "2490774907999999754240", - "evmosvaloper19fv2gwkgv3x53lau3um6tzg7qxvq96grvg97zr", - }, - { - "evmos1p3gl84vdy6z0zgmylaw20n5le5d2ye942k4hyt", - "2490774907999999754240", - "evmosvaloper182d5yfc5wwaphwjm5wqj9xmsf0vmp30qrtjllu", - }, - { - "evmos1p9spavrpnjmktstfc9a7pe4xhvw5rwqcmqgv9f", - "2490774907999999754240", - "evmosvaloper1gj8uu6pxcncdtav707a86v3sqva2svn45sx62g", - }, - { - "evmos1pn3azfdnq9ekq7kytvd9sjvmnr3hzjdqmz7eyr", - "2490774907999999754240", - "evmosvaloper1hay4kqak5h9zvp0r43y6nggprug4uc2qs0pn0j", - }, - { - "evmos1pnwuxpu87k0nw2slx6nzttrcsmwfaahwfjp0r3", - "2490774907999999754240", - "evmosvaloper10q09k0flvffqzcmy2nx20nhxzs78nnesrv60ad", - }, - { - "evmos1pxvmfukzygxty3snpj8l69mkht3wgges62x94j", - "2490774907999999754240", - "evmosvaloper1hay4kqak5h9zvp0r43y6nggprug4uc2qs0pn0j", - }, - { - "evmos1pz2386aulmmyqzqqxg4dk42ctqy9lnlvx922zy", - "2490774907999999754240", - "evmosvaloper1qhazu8zleyn5chrkxymewx3xw5guq2vm6q7zl0", - }, - { - "evmos1q64ehhgjgtg5f5ajmjqv7w64p349hu6qqgyx04", - "2490774907999999754240", - "evmosvaloper1kegt9p7se6mpmtt47axx0rwxlp8tr5626pq09u", - }, - { - "evmos1qew4c2zdlwjxltxxv5xyqnwj24g9vfgz0tskfr", - "2490774907999999754240", - "evmosvaloper10666nk6c845g295h9y77eprzpepdv82gnrrs4c", - }, - { - "evmos1qk02kf68qgudjtm4deq4nt7ccwy74gzvsw6jx5", - "2490774907999999754240", - "evmosvaloper1u6ndfv26nc2jw43kx0kzck8s9pnunakwgu8vmc", - }, - { - "evmos1qmsknrya5sje9x9mqmrn5pv3vgexa4dm98t69m", - "2490774907999999754240", - "evmosvaloper1qmpmzdesg9gr5wpyzkssayldnhk3pa8x2nwlwp", - }, - { - "evmos1qncytn4c7gr7wvnyyd3zr29xt986ra5an6g0md", - "2490774907999999754240", - "evmosvaloper1qmpmzdesg9gr5wpyzkssayldnhk3pa8x2nwlwp", - }, - { - "evmos1qquds3t03hmvgt97aadnd0nt0afmukxexftdle", - "2490774907999999754240", - "evmosvaloper1g3jy2wdjus4gka7e5dud7etz0u3mcnfs9vt5cr", - }, - { - "evmos1qsud277yjjnqgp4087rklfgw9u62a064948l6l", - "2490774907999999754240", - "evmosvaloper148hpdcvge7jgjr4xxjufcq56w5k4rr0pnnqxla", - }, - { - "evmos1qt5ddktzf3acawq6cay02fd5gwvwnsqqz24gfh", - "2490774907999999754240", - "evmosvaloper16ywlfq3ansuh70tjtenazpdwcn6rg279gjadep", - }, - { - "evmos1qtzv5f80mu57p8ex6847lh4g2yn7ntxhe48fyu", - "2490774907999999754240", - "evmosvaloper17z0xyw6vwjn6gqj86s3axs7mjsngdl6sncdwga", - }, - { - "evmos1qudl49g7fw8gsgwnarep2l07hgfd7xrkx98894", - "2490774907999999754240", - "evmosvaloper1aep37tvd5yh4ydeya2a88g2tkjz6f2lcrfjumh", - }, - { - "evmos1qva4zjmfuuwjskht83r2264s7y68r59a4t56xa", - "2490774907999999754240", - "evmosvaloper1sx5qerxjzthnjzne7wz4x6ml4envjehvwtx8c7", - }, - { - "evmos1qvfel6a6s0pq8tdrqyj6a2vflardhq692j5waq", - "2490774907999999754240", - "evmosvaloper1tczjwjrr36e0l5jjqnwrp95kv8mk57zdmxse4m", - }, - { - "evmos1qyreplyw20ragktqahvm3gg3kppalgldd77627", - "2490774907999999754240", - "evmosvaloper1lwfuc2lc27mk8yys2zcd0qttcwmnd6x7gks5m5", - }, - { - "evmos1qzyw0ckm8apl7ktl90whuqn6yfdgjs6pc88k3h", - "2490774907999999754240", - "evmosvaloper1d74wdckw5vyn6gwqt4r0ruemp9n8vmwtudw848", - }, - { - "evmos1r5lsfkc35526qghnjkxwrt686xuthptg5hcqzu", - "2490774907999999754240", - "evmosvaloper1g57n4k08sk5z6ramzsgzrapgpsjsyh4t5tldw5", - }, - { - "evmos1r6ahqt2nx5p2nhumvcuy8tz62tlhl4fazxcayf", - "2490774907999999754240", - "evmosvaloper1x322q9d7dvm0xw9966c8730pn083rv3q6ddtyx", - }, - { - "evmos1r77239ppu073t0p469tqayfe7n8r80myqr533x", - "2490774907999999754240", - "evmosvaloper1lwfuc2lc27mk8yys2zcd0qttcwmnd6x7gks5m5", - }, - { - "evmos1rjraa6pe5v6qn29up0xnpql5p0xnegd85x3vdk", - "2490774907999999754240", - "evmosvaloper1k96y0w5wf089nuvvym3s324c8umd3vvm4yh578", - }, - { - "evmos1rsu5uuz9nuy87r3angx73dvjazzuh2e8w6z7qa", - "2490774907999999754240", - "evmosvaloper1cpa5rlkxt8x7nu8rnqm9q4wc8qan5ve5cvd8e5", - }, - { - "evmos1rx8pvtugg52n9qvwz398enzfpyv7vvzaev7x23", - "2490774907999999754240", - "evmosvaloper1mfu6uer0zatrqaz6435m2zk40ls25tt38r4t8t", - }, - { - "evmos1rzln434lys7d6cxqjdk366nk8d2p3jy0xylacp", - "2490774907999999754240", - "evmosvaloper19fv2gwkgv3x53lau3um6tzg7qxvq96grvg97zr", - }, - { - "evmos1s22j7gw6c4c44xa2592f42p7ecmkl87ck649jy", - "2490774907999999754240", - "evmosvaloper152y6pcgsagwh5q8933vecex840adml37rsmep3", - }, - { - "evmos1s62ygxz0y7jn9za5yugemup9an7lavjj5qghsa", - "2490774907999999754240", - "evmosvaloper17aplkq60nqqnawztjlxyk0wwtc9l2uv955003h", - }, - { - "evmos1s8xxf9z9jfucyd5hpdq42c7nnjchu25qjhd9qx", - "2490774907999999754240", - "evmosvaloper1vrruadnv4glvjze923m9rjaq96fyzks6egmspz", - }, - { - "evmos1sj9p2zyl047qd5gdpurkpsqz0lvxyvp8e5qcm5", - "2490774907999999754240", - "evmosvaloper1n4kuugnh2z5dsug7egamma7chnjcdfu4jwhq76", - }, - { - "evmos1t0j3c22nh0gjt004400t0vnunqg4tnjszsgrce", - "2490774907999999754240", - "evmosvaloper1d74wdckw5vyn6gwqt4r0ruemp9n8vmwtudw848", - }, - { - "evmos1t24r5m3z0lfg2cjcx79fd506qnmkh8vsln42aw", - "2490774907999999754240", - "evmosvaloper1gzycxekfxq2hvu9jt255aajvlakay9nvz4p5jf", - }, - { - "evmos1t3ygaevfla329ns5ksn93yj88cul4qudaw44z5", - "2490774907999999754240", - "evmosvaloper1kw03prf96w5rrj53pvhdnmsnr469dn9gqmsqwg", - }, - { - "evmos1taj54jsrlcve54j56ha8fwdc7qp9hgaykpxl50", - "2490774907999999754240", - "evmosvaloper1l840d9sse36j9cvzgq98vennrzuu5l70l5shhc", - }, - { - "evmos1tdzsewmdw9gs9ekhd5uvaw4s2hf7unnjhq3hms", - "2490774907999999754240", - "evmosvaloper1rh9uz23gmhr6q92a45qrath4fr9ffefz4eas0z", - }, - { - "evmos1tf4aehh6vmlmc9kjw86e67swv59f95tpvk6jfg", - "2490774907999999754240", - "evmosvaloper1ur0zjltn3qs5xzx4rn8ekr828f4tglyhu50c0w", - }, - { - "evmos1tfppus8jdwy4g8dfgxv2hjdaz8nr46zaamf3sz", - "2490774907999999754240", - "evmosvaloper155yk4wfn0xqye80exlsr6hu4qdfsvsgw63w87l", - }, - { - "evmos1tq69gpan22jdezajyf0s6ew7g2m8lsxqpfw9m8", - "2490774907999999754240", - "evmosvaloper1jd6w3lm4y22680fkwvykx5h8tjzftd9z0mdcqm", - }, - { - "evmos1trxejd23yrs72vqd0ecpgdnf0zvm8dnw2jdkxk", - "2490774907999999754240", - "evmosvaloper1mfu6uer0zatrqaz6435m2zk40ls25tt38r4t8t", - }, - { - "evmos1tt446c96f923exwgfes78pfww5mnf4c9cmadck", - "2490774907999999754240", - "evmosvaloper1wxllvjqmha2p437dpczat82wzpr8gem04jkwmz", - }, - { - "evmos1tu3kvr5z2cyyj6706aewh9sqhayqg9lvnz9pet", - "2490774907999999754240", - "evmosvaloper1cpa5rlkxt8x7nu8rnqm9q4wc8qan5ve5cvd8e5", - }, - { - "evmos1tu7av7fjdsyjzfvdgj6j07xktyadu7fxlnfswr", - "2490774907999999754240", - "evmosvaloper15ksyw7t5t9e7w9n3d2jqqmv7y334mfrhfvvnge", - }, - { - "evmos1ty8wv29cvra2xg9xn5p4qj9j29wt7w90q0r94s", - "2490774907999999754240", - "evmosvaloper1dj0mysdn05447p9ncsq9g424fv2ynaxryhpjkc", - }, - { - "evmos1u0qdp5c0qltkcgx5p46vrq79u9nrud400rvmxq", - "2490774907999999754240", - "evmosvaloper1qhazu8zleyn5chrkxymewx3xw5guq2vm6q7zl0", - }, - { - "evmos1u7rpfd45hd7gj2v642djq03pw290khyysyx0vn", - "2490774907999999754240", - "evmosvaloper1psf28krr9muve6w0qzgjlrju5mamlsac96l85q", - }, - { - "evmos1u9kemn6g0sspkngg4dqjpx3hq6nackwdyl2yen", - "2490774907999999754240", - "evmosvaloper1suvf29zmvlmgg92zngez946nj8jrtu4hmxpwqv", - }, - { - "evmos1uf4hdet0a3h6au2wqhsdmuquryvrss6pfxchec", - "2490774907999999754240", - "evmosvaloper1q3aejvmwj9dxturgk00jv7hkwxld7ny7642tr8", - }, - { - "evmos1ufgz4yrcp6hqw7qwz3ytuv6er5lsyv7tschx7t", - "2490774907999999754240", - "evmosvaloper1g57n4k08sk5z6ramzsgzrapgpsjsyh4t5tldw5", - }, - { - "evmos1ufy8us35tquxjxwfcjf6prh83a7elx0yxluajf", - "2490774907999999754240", - "evmosvaloper1qhazu8zleyn5chrkxymewx3xw5guq2vm6q7zl0", - }, - { - "evmos1ukvqkh0yrpm8cn2fygq7mgjcuaz46lhajdf45r", - "2490774907999999754240", - "evmosvaloper1lwfuc2lc27mk8yys2zcd0qttcwmnd6x7gks5m5", - }, - { - "evmos1upfkrv2eera2p83zt8w42n0g727rg8qs8zu00j", - "2490774907999999754240", - "evmosvaloper1chx7v975g72xuw8kdpjt94dh35daqqfyc37kys", - }, - { - "evmos1urm3l9tnfjvhdfk77kru4va8ahpejmvxcx6gnt", - "2490774907999999754240", - "evmosvaloper1vdvflras2n3h7fjhe95h86wsy0z2nlsktngrp8", - }, - { - "evmos1uupckxphx3h8sgw7ht8gam4lwh454egvwkcan9", - "2490774907999999754240", - "evmosvaloper1kualgrr9qup0983gj44fczyvcda8ea47y494mz", - }, - { - "evmos1uz2wnhlk8h78u3y9yeqd2dqekm9g2pqa9rkz9a", - "2490774907999999754240", - "evmosvaloper1vm5fvg57aeqp7xwl3umev7z0364jzvcfzlnfew", - }, - { - "evmos1v2lkyggpps6exl0eze32uywaq2qd35dlqxquzk", - "2490774907999999754240", - "evmosvaloper1rvsmc4k7ay8hc6nlz50lw8hskygvdptmwr3rdl", - }, - { - "evmos1v8eakmzlvc8r6twkkt3ehwfk52fu5gfwv7jzlw", - "2490774907999999754240", - "evmosvaloper1rhddecqpwfjdkwmu6lmfzekh936kcu6wxs7jxa", - }, - { - "evmos1vcxaegmma2d6xy40d9xmy6cn3yy8m6kjp2atam", - "2490774907999999754240", - "evmosvaloper17vze0tk7q7gwpd6jt69p4m5svrty40yw9a88e3", - }, - { - "evmos1vfhgunkc44x7lunet4p8rjwtzh4qu6spd7x9e5", - "2490774907999999754240", - "evmosvaloper1suvf29zmvlmgg92zngez946nj8jrtu4hmxpwqv", - }, - { - "evmos1vjufmz46kzwycxjzthtte8p6jgt7xw3fxl9hcr", - "2490774907999999754240", - "evmosvaloper1psf28krr9muve6w0qzgjlrju5mamlsac96l85q", - }, - { - "evmos1vk3zzptu2gjc80zv2t5vaefcntp6je4n8hffvr", - "2490774907999999754240", - "evmosvaloper1cpa5rlkxt8x7nu8rnqm9q4wc8qan5ve5cvd8e5", - }, - { - "evmos1vtl6606cwg9a5aedle4m9d976q0w8hq0tsryeq", - "2490774907999999754240", - "evmosvaloper1v6ack3xwvnktwkq00kw4ld5xxlw55r5zmh26k0", - }, - { - "evmos1w07kzx5zlqdmsf8zkjq6z70pjqct6qnvjmuqwj", - "2490774907999999754240", - "evmosvaloper1xaxg47uw046uw8vgpp3da367ctw9aguqjuyyyx", - }, - { - "evmos1w0clc8z095uxrfhhmyj8hnpj4cuf78w4aznkhp", - "2490774907999999754240", - "evmosvaloper1qq95x6dhrdnrfunlth5uh24tkrfphzl9crd3xr", - }, - { - "evmos1w3a7z8aulwq5nncfy3zymmmsf768yg3vdttsk3", - "2490774907999999754240", - "evmosvaloper1rh9uz23gmhr6q92a45qrath4fr9ffefz4eas0z", - }, - { - "evmos1w46acy642s7srljsdzrhtwrde5ra7dpm2z8y6x", - "2490774907999999754240", - "evmosvaloper1g376mzt2kcszpf7y3ee7r8jpseq2zv9hshf5g3", - }, - { - "evmos1w55dehw8h5wv4xptzf6j3usxl3ws8dx7j3yk5e", - "2490774907999999754240", - "evmosvaloper10qpycc2egucukw8afcz4us7xlxxmfwh6rscvjz", - }, - { - "evmos1w6veg77z55xkf2x0c57yj8308wavx8u4230dna", - "2490774907999999754240", - "evmosvaloper1q3aejvmwj9dxturgk00jv7hkwxld7ny7642tr8", - }, - { - "evmos1wkag6utm45as7g0vwstyspt33qru0g5apyz2lr", - "2490774907999999754240", - "evmosvaloper19fv2gwkgv3x53lau3um6tzg7qxvq96grvg97zr", - }, - { - "evmos1wmhvaps6yl7k0fzx2x303wralsuex0rnn6shns", - "2490774907999999754240", - "evmosvaloper1ae6cgh398k7axy6a8jgsv3sw82tckt9202w38y", - }, - { - "evmos1wrcfrcjl2zr56n58tp9q524g9n67q9rk3rx6pe", - "2490774907999999754240", - "evmosvaloper1h62qm8qcctvcdd8t3jwm9jcc9cwleqjgnsn7ry", - }, - { - "evmos1ww02fphh0xa6z274ce8af9d3mtmzux0x0gc4u2", - "2490774907999999754240", - "evmosvaloper1qq95x6dhrdnrfunlth5uh24tkrfphzl9crd3xr", - }, - { - "evmos1wzp0f394zc97dg3zceu8e9u2kjjnypzuqfdzs2", - "2490774907999999754240", - "evmosvaloper17aplkq60nqqnawztjlxyk0wwtc9l2uv955003h", - }, - { - "evmos1x73t7zq64pcl9usmpq8jk8czgavgjxkn2kkeed", - "2490774907999999754240", - "evmosvaloper1rvsmc4k7ay8hc6nlz50lw8hskygvdptmwr3rdl", - }, - { - "evmos1x7vlc23xjqvyeuf59lkukjcnqgat25fa7varj8", - "2490774907999999754240", - "evmosvaloper1wxllvjqmha2p437dpczat82wzpr8gem04jkwmz", - }, - { - "evmos1xe7dmzt545e0xk8uga4ty9a35zv6v92dx0d7f7", - "2490774907999999754240", - "evmosvaloper1ak9t7kwk44azu6cefqdydqmy3hen28nvdjjvz0", - }, - { - "evmos1xmrj3hg6lh9wmusk2ke6u6drzdnhwj6vxtvk23", - "2490774907999999754240", - "evmosvaloper1f45kvvy80gzcfccgvmg5gjzelwxeuk2k26xelm", - }, - { - "evmos1xq8m0s2syrre3kevleean9rq7uxwlyfl2g8htw", - "2490774907999999754240", - "evmosvaloper148hpdcvge7jgjr4xxjufcq56w5k4rr0pnnqxla", - }, - { - "evmos1xwt4mp3jk6an48gqzn269qvyu9elax33hma8ts", - "2490774907999999754240", - "evmosvaloper1x5y65hgngh77sxta6s2vpjnfjep3ltllyhf2hs", - }, - { - "evmos1xx9qezp083vk3zqz68zwqx9v2sah86ehvmeq5v", - "2490774907999999754240", - "evmosvaloper13rh82yhf4zzf9n44e32e7r30ackggkvu6ps426", - }, - { - "evmos1xypw6u7zua5wz7shj9rw3uxhamrr0gxwrdkfaw", - "2490774907999999754240", - "evmosvaloper1rhddecqpwfjdkwmu6lmfzekh936kcu6wxs7jxa", - }, - { - "evmos1yc6gtujyqu68anv9rmsxyx3xqwyaq9zlruxcqf", - "2490774907999999754240", - "evmosvaloper1tczjwjrr36e0l5jjqnwrp95kv8mk57zdmxse4m", - }, - { - "evmos1yjce05nenvfdwu738lfj5qdwfwnf6dyhrqmd6q", - "2490774907999999754240", - "evmosvaloper1cw8035q5dh9yc5gmk9zzt6k2ven0w292uuk96v", - }, - { - "evmos1ykj4l40n3l4el2wd0f72738hg2arm034zrwzyg", - "2490774907999999754240", - "evmosvaloper1kegt9p7se6mpmtt47axx0rwxlp8tr5626pq09u", - }, - { - "evmos1ym4rakrh5e0qaqchv6x7yhscly8tua6kf497rg", - "2490774907999999754240", - "evmosvaloper1k5hcl0cjprzewwvzhz3um589kx8skzlrneuepu", - }, - { - "evmos1ys45292vqwnmq8zs50jtqc7ppqaa9t4qg5kgjq", - "2490774907999999754240", - "evmosvaloper1tjm6jya5wh65ha55c6279glcsa3mcs9srscytj", - }, - { - "evmos1yut2vrav9q42rx30u4dt69nn9mvuelzms45rv4", - "2490774907999999754240", - "evmosvaloper1t3rfzrxeslmtz62mydyf2xmmxehwk7xzaaucjd", - }, - { - "evmos1yv23ervwm27xk52lpcctt2y4jacv2tkurp67sp", - "2490774907999999754240", - "evmosvaloper16jr6ewgp0ypu39z80lywgzwjrx99vxcq4sdfzf", - }, - { - "evmos1z9wctxjzyhc23z4d7uw8hezcsg6jft3wvjn5ad", - "2490774907999999754240", - "evmosvaloper1mtwvpdd57gpkyejd566s24afr9zm5ryq8gwpvj", - }, - { - "evmos1zazl92pf296r37fs7wdyd2hzecpk2d3ze36zd4", - "2490774907999999754240", - "evmosvaloper1qx7u07f2tv5j8677r3ttt97prkc2dgcyp2km24", - }, - { - "evmos1zcj92jv6zkujalzuws6sqyk5t87fejnt58lene", - "2490774907999999754240", - "evmosvaloper15fezptqfn3rmxtl4006ze9plealy4w9xdfamnv", - }, - { - "evmos1zh6xwkwdkk4a04gc0aftxns925z34sg39fcaa5", - "2490774907999999754240", - "evmosvaloper1cw8035q5dh9yc5gmk9zzt6k2ven0w292uuk96v", - }, - { - "evmos1zhyg9zr5lv30axe2u8t8g0l3u0364dk32sarug", - "2490774907999999754240", - "evmosvaloper1n9f25qr9hkt4alsq3d3jmrc6x246nmc7ghujrh", - }, - { - "evmos1zuldz0kuly4aa8kltnglsd5r9zpmkakmfshgzu", - "2490774907999999754240", - "evmosvaloper1rhddecqpwfjdkwmu6lmfzekh936kcu6wxs7jxa", - }, - { - "evmos1zuthga5a84wahh0v3wczlchatlctcmmqj8g8j6", - "2490774907999999754240", - "evmosvaloper1sx5qerxjzthnjzne7wz4x6ml4envjehvwtx8c7", - }, - { - "evmos1zvdt6cy0ypxy0jc4vw65wdverr5gutt0azmeyl", - "2490774907999999754240", - "evmosvaloper18lgy886ruwkuaefm2c0sn0gt9kgnj0de3kt6pv", - }, - { - "evmos1zzd28f8qu0vzhs4nwd0sj08gk38g5uf22d726y", - "2490774907999999754240", - "evmosvaloper1psf28krr9muve6w0qzgjlrju5mamlsac96l85q", - }, - { - "evmos10nsnvvsw8xsya7ahyhxj3j7w7lk72cgayurycr", - "1660516604999999946752", - "evmosvaloper1tczjwjrr36e0l5jjqnwrp95kv8mk57zdmxse4m", - }, - { - "evmos1206usrfe4wfh8s3cgn8deerqa98z7zsd7gu05l", - "1660516604999999946752", - "evmosvaloper1d74wdckw5vyn6gwqt4r0ruemp9n8vmwtudw848", - }, - { - "evmos1225u5u3azmzzn268aqnf7zt4lyqa44z5trq8ee", - "1660516604999999946752", - "evmosvaloper1q3aejvmwj9dxturgk00jv7hkwxld7ny7642tr8", - }, - { - "evmos123n9e2av42nudtuuz5k5r5ll0s9ckwlvr08u7f", - "1660516604999999946752", - "evmosvaloper1pj3c7q7tj888h4ms9uq2qql2hf84pndx3zvleu", - }, - { - "evmos12dx8w4ph2yyvhnhmuwvjcly36w2fa2aj6z6l77", - "1660516604999999946752", - "evmosvaloper1qhazu8zleyn5chrkxymewx3xw5guq2vm6q7zl0", - }, - { - "evmos12ke58hqhmyuak25d7gyj4n73ghsklf3vf5sxfx", - "1660516604999999946752", - "evmosvaloper1g3jy2wdjus4gka7e5dud7etz0u3mcnfs9vt5cr", - }, - { - "evmos12r7palp63kp7gxcgmcwr4qt30pxj50yuq84yqw", - "1660516604999999946752", - "evmosvaloper1ur0zjltn3qs5xzx4rn8ekr828f4tglyhu50c0w", - }, - { - "evmos12r8hrptwg5u0j0k3euv4mhyme4mylf8mr67wsf", - "1660516604999999946752", - "evmosvaloper1teve9jdzedzu64mty72qc2888kh7t9hjchp5y2", - }, - { - "evmos1326mc8893qqaac394x7j42hfr00unvff93dplk", - "1660516604999999946752", - "evmosvaloper1jd6w3lm4y22680fkwvykx5h8tjzftd9z0mdcqm", - }, - { - "evmos139l72nfzkl2xqqp4lj06m8dueewt97qzp7d8xz", - "1660516604999999946752", - "evmosvaloper1ufg2a3vc4vmsmxtjmckjzltqvz83ste98mr6x5", - }, - { - "evmos13k72z08terst4j06xt2ec09yl3erntu3jr95pj", - "1660516604999999946752", - "evmosvaloper1q3aejvmwj9dxturgk00jv7hkwxld7ny7642tr8", - }, - { - "evmos13pn9xp3pqnpeyrtccjsqfwaw2a83tq7wsyecfd", - "1660516604999999946752", - "evmosvaloper1ur0zjltn3qs5xzx4rn8ekr828f4tglyhu50c0w", - }, - { - "evmos13wxxsutf3yka59tls706sn5pags6wvex89egj7", - "1660516604999999946752", - "evmosvaloper1dk4ste222kp256ky00553nexna0rh38hx2ur6c", - }, - { - "evmos140jgk4wyp052f3q3kxe7rk78vqwg8pf77mcr5e", - "1660516604999999946752", - "evmosvaloper1d74wdckw5vyn6gwqt4r0ruemp9n8vmwtudw848", - }, - { - "evmos14lzju8ehq4px3n03nwsr28fuqqt9wvjzxhptlj", - "1660516604999999946752", - "evmosvaloper1vrruadnv4glvjze923m9rjaq96fyzks6egmspz", - }, - { - "evmos14rz7jfnjcf2zmsfepefefgf55v75hxvtdanuvk", - "1660516604999999946752", - "evmosvaloper15n2ms99yx2lycwk0msmtlj9yxhtlmqeymtg4c3", - }, - { - "evmos14sw8wdwxfdknh3cytuuh36sw4etpx2x80zth3a", - "1660516604999999946752", - "evmosvaloper1w9m6p7ctu4gkdsr8plle997h25rzsa96xlzfat", - }, - { - "evmos14xw2vdk0uvj5w98c9m5644v6lm7rknxnra7wed", - "1660516604999999946752", - "evmosvaloper1d74wdckw5vyn6gwqt4r0ruemp9n8vmwtudw848", - }, - { - "evmos157qudxz0atrffevgrxz80dak6y4snrq0sg0723", - "1660516604999999946752", - "evmosvaloper1mfu6uer0zatrqaz6435m2zk40ls25tt38r4t8t", - }, - { - "evmos15cekcgneycxa0qhhwxn39wejjskct557t7umnj", - "1660516604999999946752", - "evmosvaloper1k96y0w5wf089nuvvym3s324c8umd3vvm4yh578", - }, - { - "evmos15n9sxv28wdkpxkd9zdj3mekygrzp6nx2fg7qkm", - "1660516604999999946752", - "evmosvaloper1rhddecqpwfjdkwmu6lmfzekh936kcu6wxs7jxa", - }, - { - "evmos15qh2w3h2tjcejrzx2wl4mw35re4cq5lvuww67e", - "1660516604999999946752", - "evmosvaloper18lgy886ruwkuaefm2c0sn0gt9kgnj0de3kt6pv", - }, - { - "evmos15wpawyk6vfsjz88ylckap6ffs3kltlzwv25f3t", - "1660516604999999946752", - "evmosvaloper1v6ack3xwvnktwkq00kw4ld5xxlw55r5zmh26k0", - }, - { - "evmos15wpumqp9ss7krk5zcxnhkpsdxfgvp7klflgx5q", - "1660516604999999946752", - "evmosvaloper1lldjhjnn32e8vek7cxe9g05nf8j74y0xs5zmsu", - }, - { - "evmos15yg70jh9960ft3lw0ztt3nqeaqrgq7xg3pv2us", - "1660516604999999946752", - "evmosvaloper17vze0tk7q7gwpd6jt69p4m5svrty40yw9a88e3", - }, - { - "evmos15yu6tp8j839dfpmdxzpqgx4v9jte2msu9hslru", - "1660516604999999946752", - "evmosvaloper1hdslyd0vwj8ym368tqc5jdpu6hxrqvx9zex5yz", - }, - { - "evmos165377r3cf7la2vkt48mcye3rnathtza54u9uwc", - "1660516604999999946752", - "evmosvaloper19fv2gwkgv3x53lau3um6tzg7qxvq96grvg97zr", - }, - { - "evmos166w2y5lmh82dcmn95mcsnph0rny8adyq36sdr0", - "1660516604999999946752", - "evmosvaloper1shvcjzhcxau6qtlz9w82a646ecwp4hq7ayqt0w", - }, - { - "evmos16e27gd2ynqmleqdc4zkreulmf3588zj4g6eht6", - "1660516604999999946752", - "evmosvaloper1lwfuc2lc27mk8yys2zcd0qttcwmnd6x7gks5m5", - }, - { - "evmos16fq2cdnj6gfpz6dpet28gc0x2u5z9fel8s96kf", - "1660516604999999946752", - "evmosvaloper10xhy8xurfwts9ckjkq0ga92mrjz9txyy6y8l2g", - }, - { - "evmos16hfgz8m2s3zm2yjhhs3mjw3t9ac5t6we949u0w", - "1660516604999999946752", - "evmosvaloper1hdslyd0vwj8ym368tqc5jdpu6hxrqvx9zex5yz", - }, - { - "evmos16kskaqcq855khk4dd08uscwtwynzqukk78egtn", - "1660516604999999946752", - "evmosvaloper15n2ms99yx2lycwk0msmtlj9yxhtlmqeymtg4c3", - }, - { - "evmos16l9s3rrdlrkjvnulgfu54mg5qsrf5q3cct9xnq", - "1660516604999999946752", - "evmosvaloper1h62qm8qcctvcdd8t3jwm9jcc9cwleqjgnsn7ry", - }, - { - "evmos16s7ml6yh66p9mnh833rz66plwv50gfwfam6qhx", - "1660516604999999946752", - "evmosvaloper18zt355ccyxd3kj23mz5hdz00qqn5lk5kjnj74m", - }, - { - "evmos16xexj78wl5jf3t6l0um6f45k4ctvek9uxepke2", - "1660516604999999946752", - "evmosvaloper1hay4kqak5h9zvp0r43y6nggprug4uc2qs0pn0j", - }, - { - "evmos178tyueyv42fvrlf0ekjmlenrfw2c65k009wk4c", - "1660516604999999946752", - "evmosvaloper1pz3mcahcrglf3md4lggax5r95gvmppc6x5w7hw", - }, - { - "evmos17nhv5ecx4ej53qsa7qjdnvlvsjqd8n4z4meqcm", - "1660516604999999946752", - "evmosvaloper1tczjwjrr36e0l5jjqnwrp95kv8mk57zdmxse4m", - }, - { - "evmos186kusrlcrt0ja69mmr077rdwn6vw5dm4at8pnx", - "1660516604999999946752", - "evmosvaloper1rhddecqpwfjdkwmu6lmfzekh936kcu6wxs7jxa", - }, - { - "evmos189dnmw7ast9a5shec0jmk6x8fz6nampk4p0xxf", - "1660516604999999946752", - "evmosvaloper1x322q9d7dvm0xw9966c8730pn083rv3q6ddtyx", - }, - { - "evmos18kywl7xr267k73hha2z42traxz3e78m8k6rxt3", - "1660516604999999946752", - "evmosvaloper1kegt9p7se6mpmtt47axx0rwxlp8tr5626pq09u", - }, - { - "evmos18wanxutj9z0t5lwfc5gd2xwmqa4jd5renxunyh", - "1660516604999999946752", - "evmosvaloper14yeq3lkajldaggj28hmq8xng9xux7x5g86tx29", - }, - { - "evmos199yx4u4hkrwwr0zae5xtzjhqjrufhlad7zga5w", - "1660516604999999946752", - "evmosvaloper1fhfkklmv764r3u6kqkeflmddr6rlzhf4r9lae6", - }, - { - "evmos19cgl79gq0ft969pprvhuykx6w49w3van9k9l49", - "1660516604999999946752", - "evmosvaloper1kw03prf96w5rrj53pvhdnmsnr469dn9gqmsqwg", - }, - { - "evmos19muy8gmunvnnzln02gwggy48uas5d5ae53qjt5", - "1660516604999999946752", - "evmosvaloper1g57n4k08sk5z6ramzsgzrapgpsjsyh4t5tldw5", - }, - { - "evmos19vg06kluxxhupv2hawgqv9j92zw0jq892lzlkm", - "1660516604999999946752", - "evmosvaloper1y6yvdg2xdltzr0v5hvf8zvxk373xwas4jwgvkp", - }, - { - "evmos1a206fd2j87mxd8aslw3h4hg8fnqd7kyaqzmhga", - "1660516604999999946752", - "evmosvaloper1kualgrr9qup0983gj44fczyvcda8ea47y494mz", - }, - { - "evmos1ahgkeg9aeyz50s2wjlg46c6rjasre505hl8v8q", - "1660516604999999946752", - "evmosvaloper146mfv59nypacvs5l9h0takrcv8jtlk90wr0ggp", - }, - { - "evmos1ajj4m6smku75aecasrczutwffktfmsclll60eh", - "1660516604999999946752", - "evmosvaloper1c55g6u7q2uzgks9gjp80sle8n6qcyg64vk64g2", - }, - { - "evmos1at0x7ctul5xhqna07el7c7ma3uc27qghu4ah0x", - "1660516604999999946752", - "evmosvaloper10666nk6c845g295h9y77eprzpepdv82gnrrs4c", - }, - { - "evmos1c77jvz2qlpdlum3vqtp70fdgmw542hqdvk5pjc", - "1660516604999999946752", - "evmosvaloper1fmfhpcc00r6ejuclv2fje3egruruk9upe7tl4s", - }, - { - "evmos1c7a6xf7pgu363ffgny7p5e7mrufrd83tys3m05", - "1660516604999999946752", - "evmosvaloper16ywlfq3ansuh70tjtenazpdwcn6rg279gjadep", - }, - { - "evmos1ctg82xrtlenhhy77vc2z955dmqpsmt44ty8lcw", - "1660516604999999946752", - "evmosvaloper1hyytyjxr02j72cx0cgjl24s3nn2yrdqqaslk84", - }, - { - "evmos1cw5tv3s5yylz88rzj2skugh9zevegcvd03c6hm", - "1660516604999999946752", - "evmosvaloper10xhy8xurfwts9ckjkq0ga92mrjz9txyy6y8l2g", - }, - { - "evmos1cw6vwdqknwwjt320z3c48lfu5yk7t9jfqgrus2", - "1660516604999999946752", - "evmosvaloper1q3aejvmwj9dxturgk00jv7hkwxld7ny7642tr8", - }, - { - "evmos1cyw9sjqznm3vuhcx0645nrp5xrlj7wznuxnkv8", - "1660516604999999946752", - "evmosvaloper1dk4ste222kp256ky00553nexna0rh38hx2ur6c", - }, - { - "evmos1da9ta6jx7z7ptr0c7h5u5zujsgf27vnf4s7j2g", - "1660516604999999946752", - "evmosvaloper1xsc2lnpf9jwem8kujlqan44ywet3trj2sezfhg", - }, - { - "evmos1ddlll90nfxxuceh8s4eax9eqr8a97yamuhk6t7", - "1660516604999999946752", - "evmosvaloper1v6ack3xwvnktwkq00kw4ld5xxlw55r5zmh26k0", - }, - { - "evmos1djt8qr4vgu5ljkhqk7g3gjwpzx5akazf0etr6j", - "1660516604999999946752", - "evmosvaloper1f6m9d94lkenw9fy5wmytatt76l849kx6ugdz70", - }, - { - "evmos1dqlaspx7dc2a4cj2t9vrkdsynql23wq6xstu0a", - "1660516604999999946752", - "evmosvaloper1w2j20fj2a4wfmvqnhfhv4mfxkw5xxt09x8esyj", - }, - { - "evmos1e2arm7j8qmnkqumthrx0650mdvl8fjjpaxrgzy", - "1660516604999999946752", - "evmosvaloper1fhfkklmv764r3u6kqkeflmddr6rlzhf4r9lae6", - }, - { - "evmos1e2u30lyacr2p294g68epw99279pdpu9eugsl2e", - "1660516604999999946752", - "evmosvaloper1kw03prf96w5rrj53pvhdnmsnr469dn9gqmsqwg", - }, - { - "evmos1e3gcz00ar6tazm6gqaakc7e2za4jgmus6ytlev", - "1660516604999999946752", - "evmosvaloper1mfu6uer0zatrqaz6435m2zk40ls25tt38r4t8t", - }, - { - "evmos1e4rjvm78m4nq7fcham4783cs0s6t3x223eudme", - "1660516604999999946752", - "evmosvaloper1mfu6uer0zatrqaz6435m2zk40ls25tt38r4t8t", - }, - { - "evmos1e7vdpfrfk29smyzlyq0cx0pfsddke60yyf7zzu", - "1660516604999999946752", - "evmosvaloper10666nk6c845g295h9y77eprzpepdv82gnrrs4c", - }, - { - "evmos1e96eydwge7uegm8lgm46yapu6rs72uwzxmzcrm", - "1660516604999999946752", - "evmosvaloper1vrruadnv4glvjze923m9rjaq96fyzks6egmspz", - }, - { - "evmos1ecz4lx3qv0wsud9pte5rdjyymhl4ekv2723cr4", - "1660516604999999946752", - "evmosvaloper18lgy886ruwkuaefm2c0sn0gt9kgnj0de3kt6pv", - }, - { - "evmos1ek8pjpe43ux5wx3zntd6243cv7wfg7aect5tu0", - "1660516604999999946752", - "evmosvaloper10q09k0flvffqzcmy2nx20nhxzs78nnesrv60ad", - }, - { - "evmos1epwpnfftgudjrgu6dwplsm65emtyczr38ej6e2", - "1660516604999999946752", - "evmosvaloper1wvgslxyxtg798cwsjj9epjcxxj8xqhj4a4pfzq", - }, - { - "evmos1esyv2zew98aqfn77pn6h8aj0sgzlfxq2laldn4", - "1660516604999999946752", - "evmosvaloper1gzycxekfxq2hvu9jt255aajvlakay9nvz4p5jf", - }, - { - "evmos1ezghslh6g93nnuljelkvhchtccjx0r7etladps", - "1660516604999999946752", - "evmosvaloper13nujml9r2dg85nucffe82xq3yg8f35qxmfal7p", - }, - { - "evmos1f8vew4aulgzxqg034kegsc299lvhfs7hee80pg", - "1660516604999999946752", - "evmosvaloper1vrruadnv4glvjze923m9rjaq96fyzks6egmspz", - }, - { - "evmos1fcxwhxvypx3vgqjkvqgradylqqv3q4hr58ec7f", - "1660516604999999946752", - "evmosvaloper1kualgrr9qup0983gj44fczyvcda8ea47y494mz", - }, - { - "evmos1fdmx2gnkwwh2t2pdmay9tlky2nd8y7khmxtps3", - "1660516604999999946752", - "evmosvaloper14yeq3lkajldaggj28hmq8xng9xux7x5g86tx29", - }, - { - "evmos1fl2ev68j2pl3q74rfs7lth3que3kv87mtk2fln", - "1660516604999999946752", - "evmosvaloper1g57n4k08sk5z6ramzsgzrapgpsjsyh4t5tldw5", - }, - { - "evmos1fmx7lpkc3al8t4qp8evrc9tv4zgpswl7mx0qzw", - "1660516604999999946752", - "evmosvaloper18zhvafj8jcezdut6z9u0pcsnqy978ya9d25du5", - }, - { - "evmos1g42rushkjkqqp6d5we2x570yweng0f6e852rgw", - "1660516604999999946752", - "evmosvaloper1v6ack3xwvnktwkq00kw4ld5xxlw55r5zmh26k0", - }, - { - "evmos1gk8vyr0zd3cl9kw630n7q4slf7jf928t5tppr8", - "1660516604999999946752", - "evmosvaloper1d74wdckw5vyn6gwqt4r0ruemp9n8vmwtudw848", - }, - { - "evmos1gt8nucflcd3ytgsewj685j36keafthyjtwkvwx", - "1660516604999999946752", - "evmosvaloper1kegt9p7se6mpmtt47axx0rwxlp8tr5626pq09u", - }, - { - "evmos1hrtsprv3glanfwmgps5se49ugk6mrfzwe454cs", - "1660516604999999946752", - "evmosvaloper10q09k0flvffqzcmy2nx20nhxzs78nnesrv60ad", - }, - { - "evmos1hxvlqjf2n0x9mfwe57fjlkf6yf72d75y56dgc6", - "1660516604999999946752", - "evmosvaloper1lwfuc2lc27mk8yys2zcd0qttcwmnd6x7gks5m5", - }, - { - "evmos1hyfeqgsdddhrxre7fssk5ac9akh03pftf4782l", - "1660516604999999946752", - "evmosvaloper1xsc2lnpf9jwem8kujlqan44ywet3trj2sezfhg", - }, - { - "evmos1j6w7zufzrp49nfuj2rkqz2evfryafeqsswwurx", - "1660516604999999946752", - "evmosvaloper1gj8uu6pxcncdtav707a86v3sqva2svn45sx62g", - }, - { - "evmos1kj3ls3akflt3jpnhqzn9naq8lslr9xzg49dl5y", - "1660516604999999946752", - "evmosvaloper1ae6cgh398k7axy6a8jgsv3sw82tckt9202w38y", - }, - { - "evmos1kjeccze0hez4ud3hm60x3s388tqkl65r7fq47n", - "1660516604999999946752", - "evmosvaloper1hn8u6x03mklzdy69r9khsd9q4yft7gmrkz8qkj", - }, - { - "evmos1kpx9nteklpmkwqz8tq7ckdadar5uctkhj0ljah", - "1660516604999999946752", - "evmosvaloper17z0xyw6vwjn6gqj86s3axs7mjsngdl6sncdwga", - }, - { - "evmos1ks5tnsjeukxnf6q63mxgj04ysdx7uk3xk2gtxf", - "1660516604999999946752", - "evmosvaloper10q09k0flvffqzcmy2nx20nhxzs78nnesrv60ad", - }, - { - "evmos1ky07h2as2uezshywf644eac7kc9z5p88ehwk4s", - "1660516604999999946752", - "evmosvaloper1ae6cgh398k7axy6a8jgsv3sw82tckt9202w38y", - }, - { - "evmos1l2lgxsmyeye8tgftmnvlwanqrnhdnt8u7pw9pt", - "1660516604999999946752", - "evmosvaloper1a22spreqspsh9s3v67ctsuzaf9n4kallj7wuzf", - }, - { - "evmos1l5xgdr6v0drx59agukk8pe7m6evyez4zp3ncr8", - "1660516604999999946752", - "evmosvaloper1zqkrqsvrn4hskeywd56gx2dcy50mnyp6wq7txc", - }, - { - "evmos1la7mm7d6kw75hjhqgwcfw9lucn0hnv34mnnwjh", - "1660516604999999946752", - "evmosvaloper13rh82yhf4zzf9n44e32e7r30ackggkvu6ps426", - }, - { - "evmos1lek638wptwmfu88ule7ne5zqk266d046qht2cx", - "1660516604999999946752", - "evmosvaloper1k9lay7ec328u2cmmtp8m8309msztt5hz7euvcc", - }, - { - "evmos1les9nn24kt9wa56ljjt595hd89msfxn6urpyur", - "1660516604999999946752", - "evmosvaloper12a6wa97lsv8wm62j07tz0xeqvfxddzyfg72d45", - }, - { - "evmos1lmxh360zkdendmygu7m2pcgs7mudnk572q3lpf", - "1660516604999999946752", - "evmosvaloper1g3jy2wdjus4gka7e5dud7etz0u3mcnfs9vt5cr", - }, - { - "evmos1ltz6pdxwqejnn2s5qlfc220hymy65utew5e9t4", - "1660516604999999946752", - "evmosvaloper1vrruadnv4glvjze923m9rjaq96fyzks6egmspz", - }, - { - "evmos1m2wrvu2tjfdz7unw704vvmpx236n62qmzx8tew", - "1660516604999999946752", - "evmosvaloper1chx7v975g72xuw8kdpjt94dh35daqqfyc37kys", - }, - { - "evmos1m4rujt9hpesfk57epayr9t8nwz3vc7lg7l9drw", - "1660516604999999946752", - "evmosvaloper1kualgrr9qup0983gj44fczyvcda8ea47y494mz", - }, - { - "evmos1m7qv3878ng3a8zkxfk4ggg2s6sua0k7w294ayj", - "1660516604999999946752", - "evmosvaloper14yeq3lkajldaggj28hmq8xng9xux7x5g86tx29", - }, - { - "evmos1mhy98wxm2gexh4pq26n6pm54ynst09s00ef05l", - "1660516604999999946752", - "evmosvaloper1d74wdckw5vyn6gwqt4r0ruemp9n8vmwtudw848", - }, - { - "evmos1mtqrlgdekc8s34e72qzp98zn6s50xpxhppvcee", - "1660516604999999946752", - "evmosvaloper15ksyw7t5t9e7w9n3d2jqqmv7y334mfrhfvvnge", - }, - { - "evmos1n83cgljt777jeaedusa8zlzvfu8gd2js3u0knm", - "1660516604999999946752", - "evmosvaloper1rwy29t3eup0tnaph08rezdjsmckzqemkxh535w", - }, - { - "evmos1pxjmu5pc3tjap2hca7vd880r2frp208uf8qt2f", - "1660516604999999946752", - "evmosvaloper1jxruqmfurgxrem4phvaqxkvprxa6fr0ncg3t88", - }, - { - "evmos1pxl8wdhk52led576hw6kf4en5lcevt5l308cr5", - "1660516604999999946752", - "evmosvaloper1cw8035q5dh9yc5gmk9zzt6k2ven0w292uuk96v", - }, - { - "evmos1q7snylqnfd2k6nma9m8uyz9ru93nkvmtl2xqll", - "1660516604999999946752", - "evmosvaloper1f45kvvy80gzcfccgvmg5gjzelwxeuk2k26xelm", - }, - { - "evmos1q8czdtl500zn09asmsuxauvveudgdt5uvkcvjw", - "1660516604999999946752", - "evmosvaloper17z0xyw6vwjn6gqj86s3axs7mjsngdl6sncdwga", - }, - { - "evmos1qj5h443540dur3602jltt5fvewvd2jdwm0dmv8", - "1660516604999999946752", - "evmosvaloper10pcga9su5me3dp5g4jln49uxjq7c9s2u9qy9zu", - }, - { - "evmos1qk4dmtkxlkpwfcpup08l286vd4cl5jn5p2qkaz", - "1660516604999999946752", - "evmosvaloper15ksyw7t5t9e7w9n3d2jqqmv7y334mfrhfvvnge", - }, - { - "evmos1qkpdrzmzdqddquawxhsmakgxmj2w3sf8nusvff", - "1660516604999999946752", - "evmosvaloper1lldjhjnn32e8vek7cxe9g05nf8j74y0xs5zmsu", - }, - { - "evmos1qp5mhdl00u2lkk8dd8prtxsx56x43lqfqtmepe", - "1660516604999999946752", - "evmosvaloper1f6m9d94lkenw9fy5wmytatt76l849kx6ugdz70", - }, - { - "evmos1qq4eea5f90wcr3yvhx4m5akypf5vfnl4rhlf4e", - "1660516604999999946752", - "evmosvaloper1f08fffp8zz42jj0f6wh3gyu7he4hf6zzs6mn8j", - }, - { - "evmos1qss79a8tz32nvesluk3t9us78tzyjgzrm4ukhn", - "1660516604999999946752", - "evmosvaloper1sq9ggymzx02vcp7kf6yyar83scfm4r22swu673", - }, - { - "evmos1rakk5svqj9mgm3nftuhrj0dm7g6jj8akq90ts3", - "1660516604999999946752", - "evmosvaloper1pz3mcahcrglf3md4lggax5r95gvmppc6x5w7hw", - }, - { - "evmos1rkkq4anztxu2ltws9q5jxagldtrd27fnw4pqu2", - "1660516604999999946752", - "evmosvaloper1jd6w3lm4y22680fkwvykx5h8tjzftd9z0mdcqm", - }, - { - "evmos1rl4u3j5ae8r8248nzzk8yequ22u3lkcv38e5ad", - "1660516604999999946752", - "evmosvaloper1rvsmc4k7ay8hc6nlz50lw8hskygvdptmwr3rdl", - }, - { - "evmos1rnarxjemkmxyfpq4ukw88me8cvjgk9wgsshwv8", - "1660516604999999946752", - "evmosvaloper1gj8uu6pxcncdtav707a86v3sqva2svn45sx62g", - }, - { - "evmos1rty26sg75mzuaxyn90p9dely03ep73a3tl57pj", - "1660516604999999946752", - "evmosvaloper17z0xyw6vwjn6gqj86s3axs7mjsngdl6sncdwga", - }, - { - "evmos1rv9vlqgmsay6v9jtlrv8cl8spev5an0vhghntx", - "1660516604999999946752", - "evmosvaloper1vrruadnv4glvjze923m9rjaq96fyzks6egmspz", - }, - { - "evmos1s93zu2dspqhg05n6tvppszhexc4n67sfyz4jj4", - "1660516604999999946752", - "evmosvaloper1zk0sx2e677293wfmhxngpexu50vps3sdwyef92", - }, - { - "evmos1sap6elj3ny6fqv34wldnk6s00xac2x9dmxxla8", - "1660516604999999946752", - "evmosvaloper1xaxg47uw046uw8vgpp3da367ctw9aguqjuyyyx", - }, - { - "evmos1snqnr9ssdrasdvlefzalhf7t0xjc6wv7u7s6f0", - "1660516604999999946752", - "evmosvaloper1d6c097pmd6avh0x3spfwc0cagc690e2mmkpx4h", - }, - { - "evmos1ssk7cegmxrln850sdg3804tc3f9xrspy46m9v9", - "1660516604999999946752", - "evmosvaloper1c55g6u7q2uzgks9gjp80sle8n6qcyg64vk64g2", - }, - { - "evmos1sudzd3xjg9mfvspkyndfqkyw4scjffswrd3vdx", - "1660516604999999946752", - "evmosvaloper1mfu6uer0zatrqaz6435m2zk40ls25tt38r4t8t", - }, - { - "evmos1t7hz4uykxeg7cs0agjaxg08yzdwm46tz6p7ja5", - "1660516604999999946752", - "evmosvaloper139gzv3nvlkp4ylrywsnj8eurm6qwp8t3l9a2gy", - }, - { - "evmos1t88372s8w750u4tksq4dv3l43cac7qhgq3zw9p", - "1660516604999999946752", - "evmosvaloper1g3jy2wdjus4gka7e5dud7etz0u3mcnfs9vt5cr", - }, - { - "evmos1tgv26ewtlmngdqs56npmaxy6zkexq6kqhf04ue", - "1660516604999999946752", - "evmosvaloper1u6ndfv26nc2jw43kx0kzck8s9pnunakwgu8vmc", - }, - { - "evmos1tz92w87wh2ejsx68dsjvzsp8nd7qa96tqwrts7", - "1660516604999999946752", - "evmosvaloper1pz3mcahcrglf3md4lggax5r95gvmppc6x5w7hw", - }, - { - "evmos1ucsag9pjfhl50ag4lxp7dydm3dqv9zuchn5v36", - "1660516604999999946752", - "evmosvaloper1vdvflras2n3h7fjhe95h86wsy0z2nlsktngrp8", - }, - { - "evmos1ue5r6chfcf2n474czgnre473m427lgehft0wrl", - "1660516604999999946752", - "evmosvaloper1d6c097pmd6avh0x3spfwc0cagc690e2mmkpx4h", - }, - { - "evmos1ug05d7qgl8n8f86cme5umtyvgjfu6pxe8szy0g", - "1660516604999999946752", - "evmosvaloper1tjm6jya5wh65ha55c6279glcsa3mcs9srscytj", - }, - { - "evmos1ul94whczrcwce46dhy4c38dgf2pe5fnp7e6v22", - "1660516604999999946752", - "evmosvaloper1n9f25qr9hkt4alsq3d3jmrc6x246nmc7ghujrh", - }, - { - "evmos1upu5030g0cnua66qfclzvrvku3n85s2q040zfd", - "1660516604999999946752", - "evmosvaloper18zt355ccyxd3kj23mz5hdz00qqn5lk5kjnj74m", - }, - { - "evmos1uvrjj999r7sdcvzj0cmzv9eqrnw655839cz0uk", - "1660516604999999946752", - "evmosvaloper1shvcjzhcxau6qtlz9w82a646ecwp4hq7ayqt0w", - }, - { - "evmos1v2xfy7wsmn3dlr3sqq9kffz6a4khw7zllrgynl", - "1660516604999999946752", - "evmosvaloper1ak9t7kwk44azu6cefqdydqmy3hen28nvdjjvz0", - }, - { - "evmos1v2z3m940cylf0cskm2ch6l34yf5ujrxmk2x82p", - "1660516604999999946752", - "evmosvaloper13rh82yhf4zzf9n44e32e7r30ackggkvu6ps426", - }, - { - "evmos1v3nrevfajuu4kpz5mmd3em8dawmqvqdm9avyk4", - "1660516604999999946752", - "evmosvaloper17hd4fyhqkgply6klljx3ugqemhdgqhe8xu2yu6", - }, - { - "evmos1v59kcm4xvcaae6rr0gzlgp7dylclv4kdjzq667", - "1660516604999999946752", - "evmosvaloper148hpdcvge7jgjr4xxjufcq56w5k4rr0pnnqxla", - }, - { - "evmos1v925avsl54ekgqdxrkdltd5jmlrg7m3qhhjne0", - "1660516604999999946752", - "evmosvaloper17vze0tk7q7gwpd6jt69p4m5svrty40yw9a88e3", - }, - { - "evmos1va5dgsagnme9xcfh5xxzu75v4p7dtpxtfcc8pf", - "1660516604999999946752", - "evmosvaloper1ae6cgh398k7axy6a8jgsv3sw82tckt9202w38y", - }, - { - "evmos1vc0gqqstxnje6pj090603u8nnfwcp6dk0evphl", - "1660516604999999946752", - "evmosvaloper1gj8uu6pxcncdtav707a86v3sqva2svn45sx62g", - }, - { - "evmos1vefnstpclaq0vzdj665au38r3e48xcm7wphaz8", - "1660516604999999946752", - "evmosvaloper1f45kvvy80gzcfccgvmg5gjzelwxeuk2k26xelm", - }, - { - "evmos1vjnj3g5tavx5rrnlvr4rngynkfe4efcs33n5jy", - "1660516604999999946752", - "evmosvaloper1l840d9sse36j9cvzgq98vennrzuu5l70l5shhc", - }, - { - "evmos1w2rqne2zke6z3th5r49zdrqxugftn7za9qlnl4", - "1660516604999999946752", - "evmosvaloper197ahcv2x9jj0nmvnen4sqqfffhygjga7rk3shu", - }, - { - "evmos1w39puy8ref0q70hkp0ge645u6cx58xxvmsr67f", - "1660516604999999946752", - "evmosvaloper17aplkq60nqqnawztjlxyk0wwtc9l2uv955003h", - }, - { - "evmos1w62ax6ndlr3d752d4hwuyvjsdc70yl5ts06gtt", - "1660516604999999946752", - "evmosvaloper1mtwvpdd57gpkyejd566s24afr9zm5ryq8gwpvj", - }, - { - "evmos1x28xfqp7v6223m7qt7zjgrj2g5dpknxuc0ezcx", - "1660516604999999946752", - "evmosvaloper139gzv3nvlkp4ylrywsnj8eurm6qwp8t3l9a2gy", - }, - { - "evmos1xmnkeln02us6fgprtcjxjdnhugl5s676nqcee7", - "1660516604999999946752", - "evmosvaloper17zaf6jk6gupa0mgnyyt7e4u8y783k6u3wz6avj", - }, - { - "evmos1xp07stxqz64jhj73v96du97dy78tkaeyjcatlr", - "1660516604999999946752", - "evmosvaloper1qhazu8zleyn5chrkxymewx3xw5guq2vm6q7zl0", - }, - { - "evmos1xxrskwrcg9e9x0qdxtz6kur6spzcjx2plyd8pa", - "1660516604999999946752", - "evmosvaloper174jlcery04j6r7wgvequeysruyjlhtcmlhnhy2", - }, - { - "evmos1y2hz62xeml067exrkwugp9xkpftcfmdmk9wk8a", - "1660516604999999946752", - "evmosvaloper13rh82yhf4zzf9n44e32e7r30ackggkvu6ps426", - }, - { - "evmos1yga9t5z0u09v6yeydprsf6hvzd2tw5sh69avh7", - "1660516604999999946752", - "evmosvaloper18zt355ccyxd3kj23mz5hdz00qqn5lk5kjnj74m", - }, - { - "evmos1yghuf3l0mlxadtsa4pq25c53n2mj2nydkf99la", - "1660516604999999946752", - "evmosvaloper1f45kvvy80gzcfccgvmg5gjzelwxeuk2k26xelm", - }, - { - "evmos1ylrxlnh2yvqu3ktx4fc4gja45c64x34yqrkz0w", - "1660516604999999946752", - "evmosvaloper174jlcery04j6r7wgvequeysruyjlhtcmlhnhy2", - }, - { - "evmos1ylv38dwzgpyrpg0ae8hcay4jfhtx9e575dzy4f", - "1660516604999999946752", - "evmosvaloper1wvgslxyxtg798cwsjj9epjcxxj8xqhj4a4pfzq", - }, - { - "evmos1yqfq334g9x2vmp37awsfl36w7qk7eruhncxl3n", - "1660516604999999946752", - "evmosvaloper17vze0tk7q7gwpd6jt69p4m5svrty40yw9a88e3", - }, - { - "evmos1yv6qunmp6z40am05fvxe84g2jhkvugn8p3em03", - "1660516604999999946752", - "evmosvaloper1jhe4gfgl7wv3s99h3d9tz4g833j8265e7cjqyw", - }, - { - "evmos1z8r5gwcmaeg0l50ac07dtmehthlyjk54v7qc9g", - "1660516604999999946752", - "evmosvaloper1teve9jdzedzu64mty72qc2888kh7t9hjchp5y2", - }, - { - "evmos1za7vj6gn2dd23raqe3ez9lzfc84zhpqhhungxf", - "1660516604999999946752", - "evmosvaloper17zaf6jk6gupa0mgnyyt7e4u8y783k6u3wz6avj", - }, - { - "evmos1zaefldvs6jd4c8p93s3nphde47n5g272m4ufcz", - "1660516604999999946752", - "evmosvaloper1rhddecqpwfjdkwmu6lmfzekh936kcu6wxs7jxa", - }, - { - "evmos1zaqhsnlwfn2k3tsfqpwuaxqpc8w0a08nurl8yg", - "1660516604999999946752", - "evmosvaloper1sx5qerxjzthnjzne7wz4x6ml4envjehvwtx8c7", - }, - { - "evmos1zekv9g8gdg663q2vcuun5aymq4mw48078cud99", - "1660516604999999946752", - "evmosvaloper1zk0sx2e677293wfmhxngpexu50vps3sdwyef92", - }, - { - "evmos1znfgz2392mvnj6xncyq93rzzmzwkg9x6h3rxyz", - "1660516604999999946752", - "evmosvaloper17aplkq60nqqnawztjlxyk0wwtc9l2uv955003h", - }, - { - "evmos1023qz68m5jer659pdaxy3ve9a9v2z72twl3ynm", - "830258302599999913984", - "evmosvaloper1xaxg47uw046uw8vgpp3da367ctw9aguqjuyyyx", - }, - { - "evmos102f8gfem0tx5ev4p8ldec87d4mjyt5vhnc67nl", - "830258302599999913984", - "evmosvaloper1cpa5rlkxt8x7nu8rnqm9q4wc8qan5ve5cvd8e5", - }, - { - "evmos103jll6z563sgt7tt7rl8kkfyepncv8zhe6sxuq", - "830258302599999913984", - "evmosvaloper16jr6ewgp0ypu39z80lywgzwjrx99vxcq4sdfzf", - }, - { - "evmos104tekhppfyy6nz985htcmp8w70753nmxw7ttq6", - "830258302599999913984", - "evmosvaloper1u6ndfv26nc2jw43kx0kzck8s9pnunakwgu8vmc", - }, - { - "evmos108ky3534yf4w3yen4pren2kksuhn5gw4xth4zh", - "830258302599999913984", - "evmosvaloper13nujml9r2dg85nucffe82xq3yg8f35qxmfal7p", - }, - { - "evmos10e2eav2pa3fszxarmj2uefrrtchwnsuls3rdw2", - "830258302599999913984", - "evmosvaloper18zhvafj8jcezdut6z9u0pcsnqy978ya9d25du5", - }, - { - "evmos10ed5jr9pskv29nkcrlec42wujhkv9vhcwjnv4t", - "830258302599999913984", - "evmosvaloper1f45kvvy80gzcfccgvmg5gjzelwxeuk2k26xelm", - }, - { - "evmos10eln5xqun97kggxmzjzkj0y4t72vnv2jkldut0", - "830258302599999913984", - "evmosvaloper1ur0zjltn3qs5xzx4rn8ekr828f4tglyhu50c0w", - }, - { - "evmos10qqsu7uwmj0kwr9wv34ws6l0g0n79gdsd4t0y0", - "830258302599999913984", - "evmosvaloper1shvcjzhcxau6qtlz9w82a646ecwp4hq7ayqt0w", - }, - { - "evmos10sk0v348rgxnenc7e30axz5eche3c72fwlu2e7", - "830258302599999913984", - "evmosvaloper1sq9ggymzx02vcp7kf6yyar83scfm4r22swu673", - }, - { - "evmos10x9n7jflkv9n79x0wp50hsue3y2w7sctw94mgc", - "830258302599999913984", - "evmosvaloper1tcty2k97cdv5sc6xcdf2atrrxq0zg7vvjyfsmr", - }, - { - "evmos123fwacrq4h4ayad7a80wy90q2ty95f2knrec9l", - "830258302599999913984", - "evmosvaloper1tczjwjrr36e0l5jjqnwrp95kv8mk57zdmxse4m", - }, - { - "evmos123k5nhy5xxsueagxnv9lejwdke4ama8jtxhw98", - "830258302599999913984", - "evmosvaloper1n4kuugnh2z5dsug7egamma7chnjcdfu4jwhq76", - }, - { - "evmos124ea0de2mvv3ltevlhplqgzensdcpcj4zpjcgk", - "830258302599999913984", - "evmosvaloper1hdslyd0vwj8ym368tqc5jdpu6hxrqvx9zex5yz", - }, - { - "evmos127hn2eaf69frjsaegtg8sp03fxvtwqgsfjyzsv", - "830258302599999913984", - "evmosvaloper1jk7umxyky5m5dul46t8nxneavlg7eysjr6lfj7", - }, - { - "evmos129khwke8p4smdg2c36m68hkctqtjyhsdxmw476", - "830258302599999913984", - "evmosvaloper155yk4wfn0xqye80exlsr6hu4qdfsvsgw63w87l", - }, - { - "evmos12fmgphu3kauu6sdy9yx9mnp5tvnyk3hym3nfat", - "830258302599999913984", - "evmosvaloper1zk0sx2e677293wfmhxngpexu50vps3sdwyef92", - }, - { - "evmos12mhca5eeq2weujc39ppjflsdhe4gx85xnay699", - "830258302599999913984", - "evmosvaloper1sq9ggymzx02vcp7kf6yyar83scfm4r22swu673", - }, - { - "evmos12nn8k3sd64d86vap85axsvmfvp7h88pxu70hqg", - "830258302599999913984", - "evmosvaloper17zaf6jk6gupa0mgnyyt7e4u8y783k6u3wz6avj", - }, - { - "evmos12nvpk54799l4r5zjrwy23kv89c7szfy2q6pjth", - "830258302599999913984", - "evmosvaloper1xsc2lnpf9jwem8kujlqan44ywet3trj2sezfhg", - }, - { - "evmos12psetvawgmrka9y6c9gh22xg4zvq6t27reu37t", - "830258302599999913984", - "evmosvaloper17aplkq60nqqnawztjlxyk0wwtc9l2uv955003h", - }, - { - "evmos12qrpd54x398537jcye4j6ly5c44w0chu3kg42g", - "830258302599999913984", - "evmosvaloper10xhy8xurfwts9ckjkq0ga92mrjz9txyy6y8l2g", - }, - { - "evmos12skmvjct7g8s58xwr8z26zm20cejqv9ngpgnkd", - "830258302599999913984", - "evmosvaloper1ur0zjltn3qs5xzx4rn8ekr828f4tglyhu50c0w", - }, - { - "evmos12vh8gzjqu38xanphft9ku94ldlr89r9kvdl2qw", - "830258302599999913984", - "evmosvaloper10666nk6c845g295h9y77eprzpepdv82gnrrs4c", - }, - { - "evmos12wlgjuxgq7dq3jg5lg8m2k2fnrh7e7prqf3e6e", - "830258302599999913984", - "evmosvaloper1ae6cgh398k7axy6a8jgsv3sw82tckt9202w38y", - }, - { - "evmos12x39f4h6h4rsp235xvnunsgjgskfxsenuhgz38", - "830258302599999913984", - "evmosvaloper10qpycc2egucukw8afcz4us7xlxxmfwh6rscvjz", - }, - { - "evmos136g3zm6c0pqqa557q9w9ljl0njzq4dccruzn2f", - "830258302599999913984", - "evmosvaloper1fmfhpcc00r6ejuclv2fje3egruruk9upe7tl4s", - }, - { - "evmos13da5p5fgg4x396xa672qurjqm68dhgyc0wh4hy", - "830258302599999913984", - "evmosvaloper17z0xyw6vwjn6gqj86s3axs7mjsngdl6sncdwga", - }, - { - "evmos13dyy26ztmrl7g4d7vs7thsgjjaudvxvaukps20", - "830258302599999913984", - "evmosvaloper1wxllvjqmha2p437dpczat82wzpr8gem04jkwmz", - }, - { - "evmos13ha9ntc9hcqmhxckpr2r4kh909jp3vcyxwtrtq", - "830258302599999913984", - "evmosvaloper1tczjwjrr36e0l5jjqnwrp95kv8mk57zdmxse4m", - }, - { - "evmos13hg73s9kaalz75xwt7se0ppl7rjn55lzhagfdu", - "830258302599999913984", - "evmosvaloper1gj8uu6pxcncdtav707a86v3sqva2svn45sx62g", - }, - { - "evmos13jd940h4upp3wmejfamwmjyw0l33zytz0purur", - "830258302599999913984", - "evmosvaloper1aqjfvunjprdhs660e9yfa8wdulc7rxlzz43hn3", - }, - { - "evmos13lysxa4nmpacr05exyal0zfl04t30g75peaexw", - "830258302599999913984", - "evmosvaloper1hn8u6x03mklzdy69r9khsd9q4yft7gmrkz8qkj", - }, - { - "evmos13papk4f0zvnj06x0jawevf8hkfmvg4hzgpjc4n", - "830258302599999913984", - "evmosvaloper1chx7v975g72xuw8kdpjt94dh35daqqfyc37kys", - }, - { - "evmos13t73lhmxe0l5czg945jwljm408u4r8d2lldafk", - "830258302599999913984", - "evmosvaloper17zaf6jk6gupa0mgnyyt7e4u8y783k6u3wz6avj", - }, - { - "evmos13ztx3vh4cyrggzhqlk3c9j9d9t48v0e6cjqjd8", - "830258302599999913984", - "evmosvaloper1h62qm8qcctvcdd8t3jwm9jcc9cwleqjgnsn7ry", - }, - { - "evmos1422hj8jdr7r844q9z93a99z5rh52l9ceh0zqva", - "830258302599999913984", - "evmosvaloper15ksyw7t5t9e7w9n3d2jqqmv7y334mfrhfvvnge", - }, - { - "evmos146qj4atpdq2q2ngt4zascdyjdlk8sxg94p4jny", - "830258302599999913984", - "evmosvaloper1wxllvjqmha2p437dpczat82wzpr8gem04jkwmz", - }, - { - "evmos14du9gwqfrqnvvy5hvr488puz03n7al9e7hghrt", - "830258302599999913984", - "evmosvaloper18zhvafj8jcezdut6z9u0pcsnqy978ya9d25du5", - }, - { - "evmos14gywuhgeutlkdqww9645cja7a3dyev2jfwrq5g", - "830258302599999913984", - "evmosvaloper1d6c097pmd6avh0x3spfwc0cagc690e2mmkpx4h", - }, - { - "evmos14hz6kafstt0qp2zyfnygnsuxxfdqkf93cdtez0", - "830258302599999913984", - "evmosvaloper1zk0sx2e677293wfmhxngpexu50vps3sdwyef92", - }, - { - "evmos14kee6p7j54gfxzzl65jv2pxrflz4aqu76mwp49", - "830258302599999913984", - "evmosvaloper18zt355ccyxd3kj23mz5hdz00qqn5lk5kjnj74m", - }, - { - "evmos14l3pf0pzxs2h5rrafvqa9y06j5hnk97jltu734", - "830258302599999913984", - "evmosvaloper1qx7u07f2tv5j8677r3ttt97prkc2dgcyp2km24", - }, - { - "evmos14m2fksp0kextwputf45tapajwv2vjm6u4cup80", - "830258302599999913984", - "evmosvaloper12a6wa97lsv8wm62j07tz0xeqvfxddzyfg72d45", - }, - { - "evmos14nsxrnc02yqzts6ckgaywvjlw49dzpqr8mjmq8", - "830258302599999913984", - "evmosvaloper1tcty2k97cdv5sc6xcdf2atrrxq0zg7vvjyfsmr", - }, - { - "evmos14rwnkw3x9vwdryewxwx6eszweaychjar8qxuu9", - "830258302599999913984", - "evmosvaloper1pj3c7q7tj888h4ms9uq2qql2hf84pndx3zvleu", - }, - { - "evmos14s5x8hxahgmw3xhwdthwsfwy8djxednyl6uajc", - "830258302599999913984", - "evmosvaloper146mfv59nypacvs5l9h0takrcv8jtlk90wr0ggp", - }, - { - "evmos14stk28alzt97g57uqtfjy4ezjyrarfunqsx0yh", - "830258302599999913984", - "evmosvaloper1wxllvjqmha2p437dpczat82wzpr8gem04jkwmz", - }, - { - "evmos14tc58auqmfk62fu3ls0nmlp7nmz3vzd87az2qg", - "830258302599999913984", - "evmosvaloper13nujml9r2dg85nucffe82xq3yg8f35qxmfal7p", - }, - { - "evmos14vmn9lrzjt6e8rnunzmmtm6z3w5sxstgt0fuys", - "830258302599999913984", - "evmosvaloper1c55g6u7q2uzgks9gjp80sle8n6qcyg64vk64g2", - }, - { - "evmos14vz2cmdkg53zwkg6t6jrgz50ewxcnvrm23fu50", - "830258302599999913984", - "evmosvaloper1g3jy2wdjus4gka7e5dud7etz0u3mcnfs9vt5cr", - }, - { - "evmos14w7cwztnqs5d28dyc70n52yuc9lgqzhwsyepuv", - "830258302599999913984", - "evmosvaloper1qhazu8zleyn5chrkxymewx3xw5guq2vm6q7zl0", - }, - { - "evmos14wev2uqy9qyldgddfyj8gl524lx54ajrz5uu84", - "830258302599999913984", - "evmosvaloper1k9lay7ec328u2cmmtp8m8309msztt5hz7euvcc", - }, - { - "evmos1599mpxsjj7qkgr3h7t0lsw5l2kh2lletlq5de8", - "830258302599999913984", - "evmosvaloper1tczjwjrr36e0l5jjqnwrp95kv8mk57zdmxse4m", - }, - { - "evmos15a2ks6tnrhxlj6syvamjpjulsy6mn7c90cq6ef", - "830258302599999913984", - "evmosvaloper1rhddecqpwfjdkwmu6lmfzekh936kcu6wxs7jxa", - }, - { - "evmos15acxk67g8fztrnplvd7xrwfy32aut5665fmyc8", - "830258302599999913984", - "evmosvaloper1f45kvvy80gzcfccgvmg5gjzelwxeuk2k26xelm", - }, - { - "evmos15enjktfhhg7pdn9mxqspyuwxs4ck77pvmwgfc9", - "830258302599999913984", - "evmosvaloper1n4kuugnh2z5dsug7egamma7chnjcdfu4jwhq76", - }, - { - "evmos15f0uwwt3jk7hfkajy5ue36n7pafau80gu3vaf5", - "830258302599999913984", - "evmosvaloper1q3aejvmwj9dxturgk00jv7hkwxld7ny7642tr8", - }, - { - "evmos15f8vczl5j6s97h7trw6u8eysl0gc55syv8kmch", - "830258302599999913984", - "evmosvaloper19fv2gwkgv3x53lau3um6tzg7qxvq96grvg97zr", - }, - { - "evmos15n5z9ucsrqhf3hu2shysgrezkspkxu4rxqlwaz", - "830258302599999913984", - "evmosvaloper1rvsmc4k7ay8hc6nlz50lw8hskygvdptmwr3rdl", - }, - { - "evmos15nv9dg48cd9t9pwwk2jaem58y402t8jkwu2n6t", - "830258302599999913984", - "evmosvaloper10666nk6c845g295h9y77eprzpepdv82gnrrs4c", - }, - { - "evmos15rw0e7alg0m846z9zq80ktcmxrjefprgzpdg4q", - "830258302599999913984", - "evmosvaloper1hdslyd0vwj8ym368tqc5jdpu6hxrqvx9zex5yz", - }, - { - "evmos15v43xrgugfd7szkhly7nmzw6kw3ks76jkjtg83", - "830258302599999913984", - "evmosvaloper1gyxqlahz6g9ws5cu0tk3gccgryzja7558f069r", - }, - { - "evmos15wcfncuq4t6exy8eq27zfgwnnq9ll558fcgexr", - "830258302599999913984", - "evmosvaloper1v6ack3xwvnktwkq00kw4ld5xxlw55r5zmh26k0", - }, - { - "evmos15yc9jfm9urzcv40vzkvtueez6auwu7h2savslr", - "830258302599999913984", - "evmosvaloper1rhddecqpwfjdkwmu6lmfzekh936kcu6wxs7jxa", - }, - { - "evmos15zp5f7pwzyzkcwpcg4dmqsfazzdncfjw65x2sv", - "830258302599999913984", - "evmosvaloper1h62qm8qcctvcdd8t3jwm9jcc9cwleqjgnsn7ry", - }, - { - "evmos167y0kzgmn0efpy4ggk77pfyzn3s3ke5dphv2s9", - "830258302599999913984", - "evmosvaloper1suvf29zmvlmgg92zngez946nj8jrtu4hmxpwqv", - }, - { - "evmos16ccgr08rhzd26pca3ger4t6hf7wz7pqg3qxtcw", - "830258302599999913984", - "evmosvaloper1fhfkklmv764r3u6kqkeflmddr6rlzhf4r9lae6", - }, - { - "evmos16dcyhhd5jta0a8rnw9quca00f3x68hpg9ewu35", - "830258302599999913984", - "evmosvaloper16jr6ewgp0ypu39z80lywgzwjrx99vxcq4sdfzf", - }, - { - "evmos16h4xu3nvpgm7ymt2x85hmk3yjragv00tdzplug", - "830258302599999913984", - "evmosvaloper1ce4vh0e5kanlgc7z0rhcemvd8erjnfzcyfecl7", - }, - { - "evmos16nwwhh89tjk6t8gufm6mfk63tsyrdmvpyjt86n", - "830258302599999913984", - "evmosvaloper1g3jy2wdjus4gka7e5dud7etz0u3mcnfs9vt5cr", - }, - { - "evmos16qn5sflh7lnaw5v70vtuaapq7hsds2glf09jej", - "830258302599999913984", - "evmosvaloper1g57n4k08sk5z6ramzsgzrapgpsjsyh4t5tldw5", - }, - { - "evmos16tudu3paldj9uy0322fpy89quypups0qxutdn8", - "830258302599999913984", - "evmosvaloper1q3aejvmwj9dxturgk00jv7hkwxld7ny7642tr8", - }, - { - "evmos16u06tpfu0zl6700ve2lnqm95l5u0kffy4xf3tl", - "830258302599999913984", - "evmosvaloper1sq9ggymzx02vcp7kf6yyar83scfm4r22swu673", - }, - { - "evmos16yq33m37j2u2g5jh9xewyh37dx9ptrnklwfmkt", - "830258302599999913984", - "evmosvaloper148hpdcvge7jgjr4xxjufcq56w5k4rr0pnnqxla", - }, - { - "evmos170c7arz4aw73p4v75q7nzkzg0jgdcaqcttkwu2", - "830258302599999913984", - "evmosvaloper1f45kvvy80gzcfccgvmg5gjzelwxeuk2k26xelm", - }, - { - "evmos175nfpmqu6v4nmkl38d39yjqahwfvx2dry4d7cp", - "830258302599999913984", - "evmosvaloper18zhvafj8jcezdut6z9u0pcsnqy978ya9d25du5", - }, - { - "evmos177s7k3m6rcm4g8jwvyp4vtu3jjtay7yu0v4d24", - "830258302599999913984", - "evmosvaloper1g3jy2wdjus4gka7e5dud7etz0u3mcnfs9vt5cr", - }, - { - "evmos17d4nnh0exxayuq5srlfkjpp7f2pzdqzugwd6qx", - "830258302599999913984", - "evmosvaloper1gzycxekfxq2hvu9jt255aajvlakay9nvz4p5jf", - }, - { - "evmos17es8q6s5ywwfk705a0lc0mc5u4rq6pdffnspum", - "830258302599999913984", - "evmosvaloper1xsc2lnpf9jwem8kujlqan44ywet3trj2sezfhg", - }, - { - "evmos17ft9azm3hf8z73q7lrmdzcv9e725dxl9cwaxuq", - "830258302599999913984", - "evmosvaloper1fmfhpcc00r6ejuclv2fje3egruruk9upe7tl4s", - }, - { - "evmos17gxkvtkyf0uh4kc77wa9907k84pn3dj6dga848", - "830258302599999913984", - "evmosvaloper146mfv59nypacvs5l9h0takrcv8jtlk90wr0ggp", - }, - { - "evmos17kqmgj8x4tuyuatgz8guzrpcq2239aj4wdz6dr", - "830258302599999913984", - "evmosvaloper1dk4ste222kp256ky00553nexna0rh38hx2ur6c", - }, - { - "evmos17lt3g4gcct2tqcptvr37czx737c7q0ngh2e0ld", - "830258302599999913984", - "evmosvaloper1rwy29t3eup0tnaph08rezdjsmckzqemkxh535w", - }, - { - "evmos17pgc7z028ts0ymd7wezvc4ns6yv4kmg34xn852", - "830258302599999913984", - "evmosvaloper1aep37tvd5yh4ydeya2a88g2tkjz6f2lcrfjumh", - }, - { - "evmos17qvqhtllw4djytzz5d5ecw40r6mjpj06ndx435", - "830258302599999913984", - "evmosvaloper1q3aejvmwj9dxturgk00jv7hkwxld7ny7642tr8", - }, - { - "evmos17swuuxlq40sh8gk8r9x3c7yz2uae8kete8fm3g", - "830258302599999913984", - "evmosvaloper17aplkq60nqqnawztjlxyk0wwtc9l2uv955003h", - }, - { - "evmos17uvdnf020mvp65c8zf2fyjh9j5dscd655hvaqp", - "830258302599999913984", - "evmosvaloper1qmpmzdesg9gr5wpyzkssayldnhk3pa8x2nwlwp", - }, - { - "evmos17v9ur3d9mhrghsuxtxf4d89sux0fstdxe0wqfu", - "830258302599999913984", - "evmosvaloper1rvsmc4k7ay8hc6nlz50lw8hskygvdptmwr3rdl", - }, - { - "evmos17wl4ytkegy567v2c08aq289fhehlp6st5yqn7j", - "830258302599999913984", - "evmosvaloper10qpycc2egucukw8afcz4us7xlxxmfwh6rscvjz", - }, - { - "evmos17zh986mxqw9x84f5c4futak3mljwa4e29ssyt0", - "830258302599999913984", - "evmosvaloper1suvf29zmvlmgg92zngez946nj8jrtu4hmxpwqv", - }, - { - "evmos17zku5970hhux8glpmqk2x70u76am43d8g0v9xn", - "830258302599999913984", - "evmosvaloper15fezptqfn3rmxtl4006ze9plealy4w9xdfamnv", - }, - { - "evmos180jnggm4zz2lnw5zfra9pef0yfdv50h99gnu2t", - "830258302599999913984", - "evmosvaloper1v6ack3xwvnktwkq00kw4ld5xxlw55r5zmh26k0", - }, - { - "evmos184y2g2rfxrrq5hg4w5pdq2gkkwlues2qpdthju", - "830258302599999913984", - "evmosvaloper1kw03prf96w5rrj53pvhdnmsnr469dn9gqmsqwg", - }, - { - "evmos18e20wvwjlxw225xarc7ypzt4ksnelunc8dq69r", - "830258302599999913984", - "evmosvaloper1y6yvdg2xdltzr0v5hvf8zvxk373xwas4jwgvkp", - }, - { - "evmos18ecet58yv0nk0pdtqhwf05qjd3uk2xxzsdus6t", - "830258302599999913984", - "evmosvaloper1c55g6u7q2uzgks9gjp80sle8n6qcyg64vk64g2", - }, - { - "evmos18ggnxpl8d6hyl5m6a3374h9cwh3tmx0ayvag7m", - "830258302599999913984", - "evmosvaloper1rwy29t3eup0tnaph08rezdjsmckzqemkxh535w", - }, - { - "evmos18pjhgvgfg0mxxh7hz8qex242u8p6zm8xapjtz8", - "830258302599999913984", - "evmosvaloper1gyxqlahz6g9ws5cu0tk3gccgryzja7558f069r", - }, - { - "evmos18rdldfypak5m8jjagecm4wy5ffkh7q9mxggszq", - "830258302599999913984", - "evmosvaloper1chx7v975g72xuw8kdpjt94dh35daqqfyc37kys", - }, - { - "evmos18svylgkxm4zlmmprr7nh97hwa53y7u25k4nj5w", - "830258302599999913984", - "evmosvaloper1f45kvvy80gzcfccgvmg5gjzelwxeuk2k26xelm", - }, - { - "evmos18ukcne85y7xjygpcq50pfxxeysct4x94knguzw", - "830258302599999913984", - "evmosvaloper1fpjf8aywxg9qxexfwu9lanlgw58f5fhqfu348k", - }, - { - "evmos18uv828xnysev7zp50lgz4ae3gsp6lldeha4y36", - "830258302599999913984", - "evmosvaloper1n4kuugnh2z5dsug7egamma7chnjcdfu4jwhq76", - }, - { - "evmos18vzrxepwzlxankx7pvlkzjcm9s3cvq8rrwnua2", - "830258302599999913984", - "evmosvaloper1tjm6jya5wh65ha55c6279glcsa3mcs9srscytj", - }, - { - "evmos18y0erj7tw2ft2rl4xjdaeyt5r9gnxq3xz83lkf", - "830258302599999913984", - "evmosvaloper1f45kvvy80gzcfccgvmg5gjzelwxeuk2k26xelm", - }, - { - "evmos18zjpuuk7ux399zae2ymppt7kxtvx00qn42qpq0", - "830258302599999913984", - "evmosvaloper17vze0tk7q7gwpd6jt69p4m5svrty40yw9a88e3", - }, - { - "evmos19l58a5n7d7pztss0rkls4cf9jczcc0s8frj7u0", - "830258302599999913984", - "evmosvaloper1hn8u6x03mklzdy69r9khsd9q4yft7gmrkz8qkj", - }, - { - "evmos19lnef7hmmfwuf0jreh528zqd64pll9arghdjt9", - "830258302599999913984", - "evmosvaloper10666nk6c845g295h9y77eprzpepdv82gnrrs4c", - }, - { - "evmos19szyrh56dm5vhtktjauvt37nl4h6przv89eqzf", - "830258302599999913984", - "evmosvaloper10pcga9su5me3dp5g4jln49uxjq7c9s2u9qy9zu", - }, - { - "evmos19v8ut2gfqnd8u4zm8994xn80nwzn3nypdhgah8", - "830258302599999913984", - "evmosvaloper16ywlfq3ansuh70tjtenazpdwcn6rg279gjadep", - }, - { - "evmos19xgjqj5nqpsna8kn0qhmhe8dse824f7zaft3la", - "830258302599999913984", - "evmosvaloper18lgy886ruwkuaefm2c0sn0gt9kgnj0de3kt6pv", - }, - { - "evmos19znmuzvvdd2rkh4hrqdl965zslevffsxpcjuu3", - "830258302599999913984", - "evmosvaloper1mtwvpdd57gpkyejd566s24afr9zm5ryq8gwpvj", - }, - { - "evmos1a7ll8tuj6amvnlaqxrqphfwa5rlcxxngn9x6zc", - "830258302599999913984", - "evmosvaloper174jlcery04j6r7wgvequeysruyjlhtcmlhnhy2", - }, - { - "evmos1aegcw8cvhg30vy38un304fjf5ac45sm70meaw9", - "830258302599999913984", - "evmosvaloper1vw7k3z99swlv7svjmnrrqvu6zdmatqhvzuz7lu", - }, - { - "evmos1ah5rf4mdqnc8aemwkgkj3ue0kw9gxzm6ftgv2u", - "830258302599999913984", - "evmosvaloper1n4kuugnh2z5dsug7egamma7chnjcdfu4jwhq76", - }, - { - "evmos1ak6yzdpvu9x0q7h8g5jc9028umdhkf7t7ezw02", - "830258302599999913984", - "evmosvaloper1vw7k3z99swlv7svjmnrrqvu6zdmatqhvzuz7lu", - }, - { - "evmos1alru5ccey7as6fajmtxg6g8ymsfjfa5yj799r8", - "830258302599999913984", - "evmosvaloper182d5yfc5wwaphwjm5wqj9xmsf0vmp30qrtjllu", - }, - { - "evmos1an73zgmu3u66vp5wg6eg44ajyar7uxum3uyruk", - "830258302599999913984", - "evmosvaloper1vrruadnv4glvjze923m9rjaq96fyzks6egmspz", - }, - { - "evmos1anw7flxng0m9wek9jddj0s0gurk969ts3recp5", - "830258302599999913984", - "evmosvaloper1w2j20fj2a4wfmvqnhfhv4mfxkw5xxt09x8esyj", - }, - { - "evmos1at3drna2snjuc96mfyfaepn0djmnqe5phaas79", - "830258302599999913984", - "evmosvaloper1dj0mysdn05447p9ncsq9g424fv2ynaxryhpjkc", - }, - { - "evmos1az5tmc3pjhc6cxj62yegm5p9f9rvl3t2fjz6gp", - "830258302599999913984", - "evmosvaloper1ak9t7kwk44azu6cefqdydqmy3hen28nvdjjvz0", - }, - { - "evmos1az8j0te0t705ydx4pqk74rfmj4rtl4c9x5tw23", - "830258302599999913984", - "evmosvaloper1hyytyjxr02j72cx0cgjl24s3nn2yrdqqaslk84", - }, - { - "evmos1c45rfzjhy7vwwutdzqywhce0ezmazv7v4vmgfy", - "830258302599999913984", - "evmosvaloper1hyytyjxr02j72cx0cgjl24s3nn2yrdqqaslk84", - }, - { - "evmos1c60j34nsxyf2cmgtvld68j22yg4xklv8xvfjlm", - "830258302599999913984", - "evmosvaloper1cpa5rlkxt8x7nu8rnqm9q4wc8qan5ve5cvd8e5", - }, - { - "evmos1c86x0y97f93pz89lg0uz3du08vkgyem44a5rh2", - "830258302599999913984", - "evmosvaloper16ywlfq3ansuh70tjtenazpdwcn6rg279gjadep", - }, - { - "evmos1ca73qumf5rs57w9sq3kulljyd23jz63yu6zkuu", - "830258302599999913984", - "evmosvaloper15n2ms99yx2lycwk0msmtlj9yxhtlmqeymtg4c3", - }, - { - "evmos1can9ne6vh0j3rkzreex00l66xfnyl5y0qltt4z", - "830258302599999913984", - "evmosvaloper1jk7umxyky5m5dul46t8nxneavlg7eysjr6lfj7", - }, - { - "evmos1cce8hfdqmynggcfjsc84ul0hwr3z47dfc3lk6u", - "830258302599999913984", - "evmosvaloper1wxllvjqmha2p437dpczat82wzpr8gem04jkwmz", - }, - { - "evmos1cey2ahwwylgna3ppfmkvjntdzne28t7dvra3p4", - "830258302599999913984", - "evmosvaloper1gyxqlahz6g9ws5cu0tk3gccgryzja7558f069r", - }, - { - "evmos1chghaw0qf6vgacs24hgnrjdp8yyup8lvu2awn3", - "830258302599999913984", - "evmosvaloper1kualgrr9qup0983gj44fczyvcda8ea47y494mz", - }, - { - "evmos1cmp92lxafchqy2jx4gemg6tjh462a7nan9m2n3", - "830258302599999913984", - "evmosvaloper1tjm6jya5wh65ha55c6279glcsa3mcs9srscytj", - }, - { - "evmos1cnrrfs4pjyhhrra6lavteesgh37yd5hefrff9a", - "830258302599999913984", - "evmosvaloper1chx7v975g72xuw8kdpjt94dh35daqqfyc37kys", - }, - { - "evmos1csshpn698hsvmjdwkwm7jnz468z8qs2yz2vyyv", - "830258302599999913984", - "evmosvaloper13rh82yhf4zzf9n44e32e7r30ackggkvu6ps426", - }, - { - "evmos1ct8xp6r97f4y0ngh5lnnmvf2s8k49nnlqjcl6g", - "830258302599999913984", - "evmosvaloper1xaxg47uw046uw8vgpp3da367ctw9aguqjuyyyx", - }, - { - "evmos1ctmdsmhaxddzvge7u6ya8ckd948zasddru6pfe", - "830258302599999913984", - "evmosvaloper1wvgslxyxtg798cwsjj9epjcxxj8xqhj4a4pfzq", - }, - { - "evmos1cvjqcxcwfwjtukkgjpex4555w8pnhn5l203zg7", - "830258302599999913984", - "evmosvaloper16ywlfq3ansuh70tjtenazpdwcn6rg279gjadep", - }, - { - "evmos1cwlnz4qdurcl4cdegh4zm9czvp3f9gcc38dqpg", - "830258302599999913984", - "evmosvaloper1hn8u6x03mklzdy69r9khsd9q4yft7gmrkz8qkj", - }, - { - "evmos1d27eyt647tfks5rh2f5ca0jwzp35nswmk7x5dw", - "830258302599999913984", - "evmosvaloper1pz3mcahcrglf3md4lggax5r95gvmppc6x5w7hw", - }, - { - "evmos1dc4g56wzamwsc7njqc7a2vaghatefvf67ew0j7", - "830258302599999913984", - "evmosvaloper1w9m6p7ctu4gkdsr8plle997h25rzsa96xlzfat", - }, - { - "evmos1dfv36rvkm82sqj4ut6spm8f60807czva2sqrps", - "830258302599999913984", - "evmosvaloper1gzycxekfxq2hvu9jt255aajvlakay9nvz4p5jf", - }, - { - "evmos1dlfmrkxwth33zpa6cz9dlcrc9ztmhehafq24fm", - "830258302599999913984", - "evmosvaloper1qmpmzdesg9gr5wpyzkssayldnhk3pa8x2nwlwp", - }, - { - "evmos1dqnas5plgvhzufl4c32f4lfh9cnpapjvmxwkm0", - "830258302599999913984", - "evmosvaloper1vdvflras2n3h7fjhe95h86wsy0z2nlsktngrp8", - }, - { - "evmos1dqu0dte9pwgsqkxylyq5889hezaftycgv8xhnp", - "830258302599999913984", - "evmosvaloper10666nk6c845g295h9y77eprzpepdv82gnrrs4c", - }, - { - "evmos1du7vavkvgdma3390wttjhvju45lra5037r0c63", - "830258302599999913984", - "evmosvaloper1x322q9d7dvm0xw9966c8730pn083rv3q6ddtyx", - }, - { - "evmos1dvu05jrl8wmzp33w6k0ypyvj0v4e9fatyv4g0l", - "830258302599999913984", - "evmosvaloper1rwy29t3eup0tnaph08rezdjsmckzqemkxh535w", - }, - { - "evmos1dwfv87uq8reqhy3dhx5f279x2h5u3k9yuzjjy0", - "830258302599999913984", - "evmosvaloper1tcty2k97cdv5sc6xcdf2atrrxq0zg7vvjyfsmr", - }, - { - "evmos1dwsc8hjk8nxhg0sm25z8k56drarhwvpdtge04l", - "830258302599999913984", - "evmosvaloper1rh9uz23gmhr6q92a45qrath4fr9ffefz4eas0z", - }, - { - "evmos1dx5a4qslfx90ln2gfew20lcvk6acv2g6xrtyvr", - "830258302599999913984", - "evmosvaloper18zhvafj8jcezdut6z9u0pcsnqy978ya9d25du5", - }, - { - "evmos1dxcqec75da8f7rnhhxpm0ud5d9atkhqnxtczwg", - "830258302599999913984", - "evmosvaloper1lldjhjnn32e8vek7cxe9g05nf8j74y0xs5zmsu", - }, - { - "evmos1dxtm0pc2wmpcm5l7gwdcll60p923xqdv0lpzxf", - "830258302599999913984", - "evmosvaloper1vrruadnv4glvjze923m9rjaq96fyzks6egmspz", - }, - { - "evmos1dxy4dnxm3qjesys3prxrjfd97qn9hq3y9lfqrd", - "830258302599999913984", - "evmosvaloper1yw3uzauqx3lywnttftjr728e3j6e9ptfk7h406", - }, - { - "evmos1e33kvd6t5qejyqgyskmxx8qqd3j9c3gajnju98", - "830258302599999913984", - "evmosvaloper15n2ms99yx2lycwk0msmtlj9yxhtlmqeymtg4c3", - }, - { - "evmos1e6fxmwqt7lxfqf0kwvrhzuwemrjrtg3gefz7v6", - "830258302599999913984", - "evmosvaloper1h62qm8qcctvcdd8t3jwm9jcc9cwleqjgnsn7ry", - }, - { - "evmos1e82l45jydrg46yk5j4m2pmdha5lx2rltayttlj", - "830258302599999913984", - "evmosvaloper1ur0zjltn3qs5xzx4rn8ekr828f4tglyhu50c0w", - }, - { - "evmos1ekwn2zgxsg602ljt0880a55dpfh62czckpf6jk", - "830258302599999913984", - "evmosvaloper1xaxg47uw046uw8vgpp3da367ctw9aguqjuyyyx", - }, - { - "evmos1emlg7x7avntt9sdkeczrkta2gakn9clzum45mu", - "830258302599999913984", - "evmosvaloper1rhddecqpwfjdkwmu6lmfzekh936kcu6wxs7jxa", - }, - { - "evmos1evqvmkttr7xmn487tnnrup9k42cy8xa49t7ydt", - "830258302599999913984", - "evmosvaloper17z0xyw6vwjn6gqj86s3axs7mjsngdl6sncdwga", - }, - { - "evmos1ex0nh95t02xgss2vyekyh5vehvw8awrvpq695x", - "830258302599999913984", - "evmosvaloper1tcty2k97cdv5sc6xcdf2atrrxq0zg7vvjyfsmr", - }, - { - "evmos1f0nludnusrztll69slchuzwm27p5usd6233uj7", - "830258302599999913984", - "evmosvaloper1sq9ggymzx02vcp7kf6yyar83scfm4r22swu673", - }, - { - "evmos1f4wsmp8jff38z8uknnh34dfdg9jg82pjc9whjk", - "830258302599999913984", - "evmosvaloper1mfu6uer0zatrqaz6435m2zk40ls25tt38r4t8t", - }, - { - "evmos1f5k9m5rajjwk8fshhz668qrlj5n29f8y5cvszv", - "830258302599999913984", - "evmosvaloper1ak9t7kwk44azu6cefqdydqmy3hen28nvdjjvz0", - }, - { - "evmos1f8th0c7ksmwx4etj2j6neelque885xjja7r2qs", - "830258302599999913984", - "evmosvaloper1d6c097pmd6avh0x3spfwc0cagc690e2mmkpx4h", - }, - { - "evmos1f9g405q0lrv7lamn3z8vmjryykhawckzh4pmx0", - "830258302599999913984", - "evmosvaloper1qq95x6dhrdnrfunlth5uh24tkrfphzl9crd3xr", - }, - { - "evmos1fd8mt94tq5pc0j8kh0yzqf8zg59293f0jhwd88", - "830258302599999913984", - "evmosvaloper1fpjf8aywxg9qxexfwu9lanlgw58f5fhqfu348k", - }, - { - "evmos1fjzhg59cf9fhy96zrkg7sue38tvcv0gzzfxq2a", - "830258302599999913984", - "evmosvaloper1qq95x6dhrdnrfunlth5uh24tkrfphzl9crd3xr", - }, - { - "evmos1flhpvqwfzrv729c8ej9hqfcptgt7pw3ydaxd95", - "830258302599999913984", - "evmosvaloper1psf28krr9muve6w0qzgjlrju5mamlsac96l85q", - }, - { - "evmos1fm9jc7msp8c2kadhc46p4escv94ud9qdcfv2u4", - "830258302599999913984", - "evmosvaloper1ak9t7kwk44azu6cefqdydqmy3hen28nvdjjvz0", - }, - { - "evmos1fnhvjw7zkran0hjxe8efv38p2jr4725c2u0un7", - "830258302599999913984", - "evmosvaloper1dk4ste222kp256ky00553nexna0rh38hx2ur6c", - }, - { - "evmos1fpy83fyr05r4gat6ad3uxmvaqwh9nglh2dwm66", - "830258302599999913984", - "evmosvaloper1tjm6jya5wh65ha55c6279glcsa3mcs9srscytj", - }, - { - "evmos1fqlmhyhfuzl0sdxg44pzyvn8an825m5vwylyxv", - "830258302599999913984", - "evmosvaloper1hyytyjxr02j72cx0cgjl24s3nn2yrdqqaslk84", - }, - { - "evmos1g0fhln7afh4vtu8y3g9y75lgrmm3346xc4qx8n", - "830258302599999913984", - "evmosvaloper1lwfuc2lc27mk8yys2zcd0qttcwmnd6x7gks5m5", - }, - { - "evmos1g8qyzgu48mpxjxujdsn8pgrf8k9ehmgpam76wc", - "830258302599999913984", - "evmosvaloper1dk4ste222kp256ky00553nexna0rh38hx2ur6c", - }, - { - "evmos1g9mtnqjrc2x7mqtxfp6cjx2ptt4uduv0x9qnpt", - "830258302599999913984", - "evmosvaloper1jd6w3lm4y22680fkwvykx5h8tjzftd9z0mdcqm", - }, - { - "evmos1g9r5ehf4a8uzy8zt2tmh0vsa89ty7krn2ndsdd", - "830258302599999913984", - "evmosvaloper1jxruqmfurgxrem4phvaqxkvprxa6fr0ncg3t88", - }, - { - "evmos1ggzvn7hl3kd3zmn78w3gl2uf2swyd9r2ujw79u", - "830258302599999913984", - "evmosvaloper1jhe4gfgl7wv3s99h3d9tz4g833j8265e7cjqyw", - }, - { - "evmos1gj050ly7jg08yj2n79qshwz6zpsd76pms2ewnc", - "830258302599999913984", - "evmosvaloper1fpjf8aywxg9qxexfwu9lanlgw58f5fhqfu348k", - }, - { - "evmos1gjamxhm0kz4zghjs7haqdre5rmywhrd4kz308l", - "830258302599999913984", - "evmosvaloper1d74wdckw5vyn6gwqt4r0ruemp9n8vmwtudw848", - }, - { - "evmos1gmsqv4eu6w3l3ff7l34h8a3ljlqxzsrk8mfulr", - "830258302599999913984", - "evmosvaloper197ahcv2x9jj0nmvnen4sqqfffhygjga7rk3shu", - }, - { - "evmos1gv5c370y0xfmwn2ecuc5h6dkw7nv2792yw3kxa", - "830258302599999913984", - "evmosvaloper1lldjhjnn32e8vek7cxe9g05nf8j74y0xs5zmsu", - }, - { - "evmos1gyv5khd9yj0ts50f0hqa48rnaa8rjetjyjpe5j", - "830258302599999913984", - "evmosvaloper1pz3mcahcrglf3md4lggax5r95gvmppc6x5w7hw", - }, - { - "evmos1h7s6a0u6w97ucggjqyl3htr7v3dl867zgdq58z", - "830258302599999913984", - "evmosvaloper146mfv59nypacvs5l9h0takrcv8jtlk90wr0ggp", - }, - { - "evmos1ha388vlc28587wgxnfwf8kshlnk03qvztq3ejj", - "830258302599999913984", - "evmosvaloper1cpa5rlkxt8x7nu8rnqm9q4wc8qan5ve5cvd8e5", - }, - { - "evmos1hencufkf5j6pn2qfnfyctc86ulgu6u3rdpsqpr", - "830258302599999913984", - "evmosvaloper1suvf29zmvlmgg92zngez946nj8jrtu4hmxpwqv", - }, - { - "evmos1hge6q033p96jkxzff0s5z8k24njhuwn4jrf48w", - "830258302599999913984", - "evmosvaloper17z0xyw6vwjn6gqj86s3axs7mjsngdl6sncdwga", - }, - { - "evmos1hlnff50cygc52ml8qtr5jrmhg4jmgv8namm65n", - "830258302599999913984", - "evmosvaloper19e53dt5r9w2mstt32jnj43xrxlyprnc085tl30", - }, - { - "evmos1hmg8xpzgdjrzcp2r49j3dtcfhak7pzgcuaheeg", - "830258302599999913984", - "evmosvaloper18zhvafj8jcezdut6z9u0pcsnqy978ya9d25du5", - }, - { - "evmos1hnjfa87xlqgsxa4jqhuj8sxgwmdztmp4uagnxh", - "830258302599999913984", - "evmosvaloper1d6c097pmd6avh0x3spfwc0cagc690e2mmkpx4h", - }, - { - "evmos1hp7rj8pzdyvleupuyu2gr7msj9ekxyu8uf2hvd", - "830258302599999913984", - "evmosvaloper10qpycc2egucukw8afcz4us7xlxxmfwh6rscvjz", - }, - { - "evmos1hrgtpferckgm0wrfh34qcz0ej2lsp9uzddl90g", - "830258302599999913984", - "evmosvaloper1rw4nendrehkr5tkhjswzy8ts97dvwg7rc0u0kp", - }, - { - "evmos1hzlqw0m33z28d6hwavjak23xnmqwxd8ntpxdje", - "830258302599999913984", - "evmosvaloper1hn8u6x03mklzdy69r9khsd9q4yft7gmrkz8qkj", - }, - { - "evmos1j2ccc3j9la0f4tt4v6rshcquf3ggetjddhq0r0", - "830258302599999913984", - "evmosvaloper1qx7u07f2tv5j8677r3ttt97prkc2dgcyp2km24", - }, - { - "evmos1j4ph5st8vgs6v7ltjlul7gwneqky3hmmsf45uj", - "830258302599999913984", - "evmosvaloper1h62qm8qcctvcdd8t3jwm9jcc9cwleqjgnsn7ry", - }, - { - "evmos1j968kpw2h4769qkj4gt02hs70h57ccxj4wvp6m", - "830258302599999913984", - "evmosvaloper19fv2gwkgv3x53lau3um6tzg7qxvq96grvg97zr", - }, - { - "evmos1ja7musxe0csv8jyndhvk2ug2mcp2ww3mk4mfav", - "830258302599999913984", - "evmosvaloper1fpjf8aywxg9qxexfwu9lanlgw58f5fhqfu348k", - }, - { - "evmos1jdwcklgum4uqshtzwgn5r2fhztnqdeqt39k5y6", - "830258302599999913984", - "evmosvaloper1kualgrr9qup0983gj44fczyvcda8ea47y494mz", - }, - { - "evmos1jnzln7t2e24klw23csnsyvw4rqqcrq0y7t09l8", - "830258302599999913984", - "evmosvaloper1dk4ste222kp256ky00553nexna0rh38hx2ur6c", - }, - { - "evmos1js0g3p798n8ch0952rxcs0pdjcns9jgmtdfy0m", - "830258302599999913984", - "evmosvaloper1d74wdckw5vyn6gwqt4r0ruemp9n8vmwtudw848", - }, - { - "evmos1jvjdn3dmdw0akzdjv85kvjaa6ghuwdvdvhdrnz", - "830258302599999913984", - "evmosvaloper1gj8uu6pxcncdtav707a86v3sqva2svn45sx62g", - }, - { - "evmos1k2gxuc9uxchcvxdq540egp9amcv736wsah3rhh", - "830258302599999913984", - "evmosvaloper1ufg2a3vc4vmsmxtjmckjzltqvz83ste98mr6x5", - }, - { - "evmos1k6pq7z3g88ejywftw0rg68awwdd9qp6n0zfv3z", - "830258302599999913984", - "evmosvaloper17hd4fyhqkgply6klljx3ugqemhdgqhe8xu2yu6", - }, - { - "evmos1k7hla85da7vvletyee55m8pdexl8t5ra3dlt80", - "830258302599999913984", - "evmosvaloper18zhvafj8jcezdut6z9u0pcsnqy978ya9d25du5", - }, - { - "evmos1kd3stkmajlvr2fpg4mwpqckq05xyaj77gru0rv", - "830258302599999913984", - "evmosvaloper1g57n4k08sk5z6ramzsgzrapgpsjsyh4t5tldw5", - }, - { - "evmos1kfq4j2tznxd9mltav0zurv3q5726nwrsp0ymx2", - "830258302599999913984", - "evmosvaloper1mtwvpdd57gpkyejd566s24afr9zm5ryq8gwpvj", - }, - { - "evmos1kgvlrps8xfma8lvwed53jsswt5rtda935m56w2", - "830258302599999913984", - "evmosvaloper17jyfw78xztc8crq4t8znjlg8ld76lkzkg2hny3", - }, - { - "evmos1kjz0r84swu0gmtca9zvgc64pmhr79jvscf3age", - "830258302599999913984", - "evmosvaloper1f08fffp8zz42jj0f6wh3gyu7he4hf6zzs6mn8j", - }, - { - "evmos1kp5xfsxvldguy6w9nq0c9vchlx9uue5xwyeztl", - "830258302599999913984", - "evmosvaloper18lgy886ruwkuaefm2c0sn0gt9kgnj0de3kt6pv", - }, - { - "evmos1krkeq35mx9rxutetwry5t84gn8j9fvnq8yf884", - "830258302599999913984", - "evmosvaloper1mfu6uer0zatrqaz6435m2zk40ls25tt38r4t8t", - }, - { - "evmos1krvf9scp47x9hzztp0nk3lsa2gpl697rr3qcxf", - "830258302599999913984", - "evmosvaloper1mfu6uer0zatrqaz6435m2zk40ls25tt38r4t8t", - }, - { - "evmos1kuqwtjzvrepkpmxa4ny4jaxazjy0w9duqpaygm", - "830258302599999913984", - "evmosvaloper1rw4nendrehkr5tkhjswzy8ts97dvwg7rc0u0kp", - }, - { - "evmos1kwj3q049ll9f8j5cqk7ylca0puekla8rtxdhvn", - "830258302599999913984", - "evmosvaloper1n9f25qr9hkt4alsq3d3jmrc6x246nmc7ghujrh", - }, - { - "evmos1l0yrxzlxg4q293qmv34mwrwhvj92qgcxusdfwx", - "830258302599999913984", - "evmosvaloper1lldjhjnn32e8vek7cxe9g05nf8j74y0xs5zmsu", - }, - { - "evmos1l2r3rdcpyahg99up0p2xhj96h7mumu60cjx93d", - "830258302599999913984", - "evmosvaloper1xsc2lnpf9jwem8kujlqan44ywet3trj2sezfhg", - }, - { - "evmos1l2ym2yyjmkzc2drwkjrmfpj6jcdktks3z9gsrj", - "830258302599999913984", - "evmosvaloper14yeq3lkajldaggj28hmq8xng9xux7x5g86tx29", - }, - { - "evmos1l3dfj6ceg26y07uuasmu7f9gx2msqyh9tz07p2", - "830258302599999913984", - "evmosvaloper1qhazu8zleyn5chrkxymewx3xw5guq2vm6q7zl0", - }, - { - "evmos1l55tmz79y96u39s30tshhc28fed6kngf34yruk", - "830258302599999913984", - "evmosvaloper1kualgrr9qup0983gj44fczyvcda8ea47y494mz", - }, - { - "evmos1lcjttd42acryhac9r5jf2e06z6gl4hc852zlg4", - "830258302599999913984", - "evmosvaloper1aep37tvd5yh4ydeya2a88g2tkjz6f2lcrfjumh", - }, - { - "evmos1ldmzxus87z2alm6nuulk9z62kn6lfwcts7y2p9", - "830258302599999913984", - "evmosvaloper1w9m6p7ctu4gkdsr8plle997h25rzsa96xlzfat", - }, - { - "evmos1lgv2ekqa9yeek0zghfn6ysdj5hk7zlsxcekts4", - "830258302599999913984", - "evmosvaloper15ksyw7t5t9e7w9n3d2jqqmv7y334mfrhfvvnge", - }, - { - "evmos1ljmk0cgmey6vadanf56atudvlfsvkus0gkvm6r", - "830258302599999913984", - "evmosvaloper1v4crs2adgcu2cdm2jxq07mw7ugzx0z4x6alxeg", - }, - { - "evmos1lk4w3yawk34c2wdz2ksa0vhnr56yqhtav6w4jg", - "830258302599999913984", - "evmosvaloper1hn8u6x03mklzdy69r9khsd9q4yft7gmrkz8qkj", - }, - { - "evmos1lrsqdl4celey2n8lsu6evjdn0a73l5fa70zwmc", - "830258302599999913984", - "evmosvaloper1hn8u6x03mklzdy69r9khsd9q4yft7gmrkz8qkj", - }, - { - "evmos1lthgz8nmzzjn78knq5820le2tt2vhk54c9mq2t", - "830258302599999913984", - "evmosvaloper1yw3uzauqx3lywnttftjr728e3j6e9ptfk7h406", - }, - { - "evmos1lww9xrygm98jvnl732cwyczxv5ldxcq6f4dwp8", - "830258302599999913984", - "evmosvaloper16jr6ewgp0ypu39z80lywgzwjrx99vxcq4sdfzf", - }, - { - "evmos1m5xnf2qm7xwe295lv7qrsfw72dpm0pk3m8r43y", - "830258302599999913984", - "evmosvaloper1tcty2k97cdv5sc6xcdf2atrrxq0zg7vvjyfsmr", - }, - { - "evmos1mj63crn4gyrtxpmmzkc5tcquuvay6j8u7w8ckn", - "830258302599999913984", - "evmosvaloper1vdvflras2n3h7fjhe95h86wsy0z2nlsktngrp8", - }, - { - "evmos1ml9v0n6wcne7c7n2qtwwd45wfenuqxpqwqpzy6", - "830258302599999913984", - "evmosvaloper1pj3c7q7tj888h4ms9uq2qql2hf84pndx3zvleu", - }, - { - "evmos1mldtkyznrchmkgghqcpccl5z9unsjg2nekhmwe", - "830258302599999913984", - "evmosvaloper197ahcv2x9jj0nmvnen4sqqfffhygjga7rk3shu", - }, - { - "evmos1mn0y4us7lxh7uwr6jxzldseg0a22eu5ukvx7uw", - "830258302599999913984", - "evmosvaloper1hn8u6x03mklzdy69r9khsd9q4yft7gmrkz8qkj", - }, - { - "evmos1mp8hjxkndwa8q4ueyspndl5kpxrlzk293p237z", - "830258302599999913984", - "evmosvaloper1lldjhjnn32e8vek7cxe9g05nf8j74y0xs5zmsu", - }, - { - "evmos1ms3lzjj0sqq0gp2na3mzxkmq37q2avnfh3g640", - "830258302599999913984", - "evmosvaloper1mfu6uer0zatrqaz6435m2zk40ls25tt38r4t8t", - }, - { - "evmos1msn63tv5zf27adf2g0207r9dfh6v8nfz2zyfzw", - "830258302599999913984", - "evmosvaloper174jlcery04j6r7wgvequeysruyjlhtcmlhnhy2", - }, - { - "evmos1nc9uyq2t4ewrkvyqqt8jnjnnjmza0wluxqryyj", - "830258302599999913984", - "evmosvaloper17jyfw78xztc8crq4t8znjlg8ld76lkzkg2hny3", - }, - { - "evmos1ncfvdhvhygs4g056ly5az63usnu39zvz0epy7q", - "830258302599999913984", - "evmosvaloper1aqjfvunjprdhs660e9yfa8wdulc7rxlzz43hn3", - }, - { - "evmos1ndhac4wzd5ecmlxdg0zd776zz3p8sm6nvf0zpj", - "830258302599999913984", - "evmosvaloper19fv2gwkgv3x53lau3um6tzg7qxvq96grvg97zr", - }, - { - "evmos1nhdgqqc7xzzdgacch8r5y5zk7fwmqcxsa23n5v", - "830258302599999913984", - "evmosvaloper146mfv59nypacvs5l9h0takrcv8jtlk90wr0ggp", - }, - { - "evmos1nkkvfaqyugx6hm756fyusyy9evnhjjwszmemgl", - "830258302599999913984", - "evmosvaloper17jyfw78xztc8crq4t8znjlg8ld76lkzkg2hny3", - }, - { - "evmos1nmc5xsanu3ezd9jj3fyedk8mq28q5wfrv3lrp7", - "830258302599999913984", - "evmosvaloper174jlcery04j6r7wgvequeysruyjlhtcmlhnhy2", - }, - { - "evmos1nnf85kd8d8fx4dnccrqdpr5eq6d74vhaqdtgwd", - "830258302599999913984", - "evmosvaloper1ak9t7kwk44azu6cefqdydqmy3hen28nvdjjvz0", - }, - { - "evmos1nnltt3l62h9fja5yfyl05gcp0ugw4anthv7a7e", - "830258302599999913984", - "evmosvaloper1aqjfvunjprdhs660e9yfa8wdulc7rxlzz43hn3", - }, - { - "evmos1nzea95v0yv802qywha3qrfxx20dtey2ye0xjrv", - "830258302599999913984", - "evmosvaloper1dj0mysdn05447p9ncsq9g424fv2ynaxryhpjkc", - }, - { - "evmos1nzwjcsc3jsrtgrpl5pqsqn46htls3m42d66hx6", - "830258302599999913984", - "evmosvaloper1cw8035q5dh9yc5gmk9zzt6k2ven0w292uuk96v", - }, - { - "evmos1p49x2st3yjcphm0hcwv8nl9zhzupc5dxy2lzz9", - "830258302599999913984", - "evmosvaloper13rh82yhf4zzf9n44e32e7r30ackggkvu6ps426", - }, - { - "evmos1p7de23lsav6yuj790ju28enure4wc9g97w76vm", - "830258302599999913984", - "evmosvaloper1qmpmzdesg9gr5wpyzkssayldnhk3pa8x2nwlwp", - }, - { - "evmos1p7xw6yx92hm24mzel64pds44lsh586a78pcv8l", - "830258302599999913984", - "evmosvaloper1chx7v975g72xuw8kdpjt94dh35daqqfyc37kys", - }, - { - "evmos1peymem35ddatfr3js6w82hhmev760evvl22yuf", - "830258302599999913984", - "evmosvaloper1fhfkklmv764r3u6kqkeflmddr6rlzhf4r9lae6", - }, - { - "evmos1pk42hww8u4h8f2ylacrz78cg4zgj5xgk7fnn3l", - "830258302599999913984", - "evmosvaloper1teve9jdzedzu64mty72qc2888kh7t9hjchp5y2", - }, - { - "evmos1plqwf4h8x692n5wcuq6fsg2twp6y7sfvextgdy", - "830258302599999913984", - "evmosvaloper1vrruadnv4glvjze923m9rjaq96fyzks6egmspz", - }, - { - "evmos1ptfsxdvqqgflf807n70jg2sv8h06ysnzl8lqxh", - "830258302599999913984", - "evmosvaloper1fpjf8aywxg9qxexfwu9lanlgw58f5fhqfu348k", - }, - { - "evmos1pvfp80ut8cu3r7p8zfayjqgfx20rk4d6plp9sc", - "830258302599999913984", - "evmosvaloper1cpa5rlkxt8x7nu8rnqm9q4wc8qan5ve5cvd8e5", - }, - { - "evmos1pwejuneq6u2fduwuqe2rvnhm92uw72se6e3rzw", - "830258302599999913984", - "evmosvaloper1sq9ggymzx02vcp7kf6yyar83scfm4r22swu673", - }, - { - "evmos1q3vlt725wpmju040nvrqgjzn4z04mwkxd9x5c2", - "830258302599999913984", - "evmosvaloper1hdslyd0vwj8ym368tqc5jdpu6hxrqvx9zex5yz", - }, - { - "evmos1q58xsxpygyasugt860d6ut00rqghz4c00ke8cd", - "830258302599999913984", - "evmosvaloper1t3rfzrxeslmtz62mydyf2xmmxehwk7xzaaucjd", - }, - { - "evmos1qhv4gd0znma3zea7gs9cn277vz435ceptt2y5f", - "830258302599999913984", - "evmosvaloper1g3jy2wdjus4gka7e5dud7etz0u3mcnfs9vt5cr", - }, - { - "evmos1qtfwy92usmhmzn9n0wtzfq08muec704rlf0rm3", - "830258302599999913984", - "evmosvaloper1rw4nendrehkr5tkhjswzy8ts97dvwg7rc0u0kp", - }, - { - "evmos1qx64lf4guqqmrac38yvuxn7kuzr50hmxhfxw6x", - "830258302599999913984", - "evmosvaloper10q09k0flvffqzcmy2nx20nhxzs78nnesrv60ad", - }, - { - "evmos1qxuzdvr0pwyzkhujurd7m65pjk96g2zsek967h", - "830258302599999913984", - "evmosvaloper1tcty2k97cdv5sc6xcdf2atrrxq0zg7vvjyfsmr", - }, - { - "evmos1qys33f5uxsqrcmg6vcrrc5wre2e3yx32h9erk7", - "830258302599999913984", - "evmosvaloper1zqkrqsvrn4hskeywd56gx2dcy50mnyp6wq7txc", - }, - { - "evmos1r0p7xjzg5szt5xs8qfn4y4s7k5mwmmmqrvgzyd", - "830258302599999913984", - "evmosvaloper10q09k0flvffqzcmy2nx20nhxzs78nnesrv60ad", - }, - { - "evmos1r36xfv2w8l4ytwkptvga2e8qyslp0gdqyvsn44", - "830258302599999913984", - "evmosvaloper1zk0sx2e677293wfmhxngpexu50vps3sdwyef92", - }, - { - "evmos1r95n260953j4vmarpcgydqysm50k9y3jjhavkg", - "830258302599999913984", - "evmosvaloper1w9m6p7ctu4gkdsr8plle997h25rzsa96xlzfat", - }, - { - "evmos1rdavw685v053jzjdr686s57egyqm88vaxjr757", - "830258302599999913984", - "evmosvaloper17z0xyw6vwjn6gqj86s3axs7mjsngdl6sncdwga", - }, - { - "evmos1rdhxvcmtcmwj3pld2tp8sd8ymqr8856uk7nm50", - "830258302599999913984", - "evmosvaloper1k5hcl0cjprzewwvzhz3um589kx8skzlrneuepu", - }, - { - "evmos1rp60chu3t25l6fxr08l8l8kyqcruaau2sjtjv9", - "830258302599999913984", - "evmosvaloper1hyytyjxr02j72cx0cgjl24s3nn2yrdqqaslk84", - }, - { - "evmos1rv97rm3xjemw4larc2l5n0wrptv9upr7f5eqmh", - "830258302599999913984", - "evmosvaloper14yeq3lkajldaggj28hmq8xng9xux7x5g86tx29", - }, - { - "evmos1rvszt83ck4xt35pn34fjkeelmxkrqtad3ppxdx", - "830258302599999913984", - "evmosvaloper1psf28krr9muve6w0qzgjlrju5mamlsac96l85q", - }, - { - "evmos1rzwkeuf3hv6e8k040wrmnhk0c6eeghuu2kfck0", - "830258302599999913984", - "evmosvaloper155yk4wfn0xqye80exlsr6hu4qdfsvsgw63w87l", - }, - { - "evmos1s2s4vf30lxw74gc8yg09jcngxhz7u5p44ymkmv", - "830258302599999913984", - "evmosvaloper1ce4vh0e5kanlgc7z0rhcemvd8erjnfzcyfecl7", - }, - { - "evmos1s5ukydeur4m7mdjts85mfhl8twtxawkdksrq26", - "830258302599999913984", - "evmosvaloper1qhazu8zleyn5chrkxymewx3xw5guq2vm6q7zl0", - }, - { - "evmos1s7jm5u65et596jgzrwjsr3le0nypsh3qcsaa7u", - "830258302599999913984", - "evmosvaloper146mfv59nypacvs5l9h0takrcv8jtlk90wr0ggp", - }, - { - "evmos1scn0d9qw96egjv80kn80fxedrukfcyvex8mwfw", - "830258302599999913984", - "evmosvaloper1vrruadnv4glvjze923m9rjaq96fyzks6egmspz", - }, - { - "evmos1shn0gpu758f8xunk809cqlfv8726k688rqyqqz", - "830258302599999913984", - "evmosvaloper1hn8u6x03mklzdy69r9khsd9q4yft7gmrkz8qkj", - }, - { - "evmos1sljjxrmmu8d3seanzvplp4tc4r7yaqk5v0vuca", - "830258302599999913984", - "evmosvaloper1x5y65hgngh77sxta6s2vpjnfjep3ltllyhf2hs", - }, - { - "evmos1svf7ma4s0pjt9873637dagyds6aku78327k5kz", - "830258302599999913984", - "evmosvaloper1mtwvpdd57gpkyejd566s24afr9zm5ryq8gwpvj", - }, - { - "evmos1swsfu609udrca8nhnqu0vuzzz3ywp4vy9qws55", - "830258302599999913984", - "evmosvaloper1n9f25qr9hkt4alsq3d3jmrc6x246nmc7ghujrh", - }, - { - "evmos1t88s0evru6y8clrmfrqjhgujz6cc4vjxupatr2", - "830258302599999913984", - "evmosvaloper17jyfw78xztc8crq4t8znjlg8ld76lkzkg2hny3", - }, - { - "evmos1taqdemkrzxzrcw2y4pu67qhq6mks7r4v95xltj", - "830258302599999913984", - "evmosvaloper1hay4kqak5h9zvp0r43y6nggprug4uc2qs0pn0j", - }, - { - "evmos1th6a5aja5fk4tc2h68gvh5p6hxwtcwr73ups3d", - "830258302599999913984", - "evmosvaloper1xaxg47uw046uw8vgpp3da367ctw9aguqjuyyyx", - }, - { - "evmos1tnvjyttt6mg3wd8phpjfvkeq09y3ncutjne3dz", - "830258302599999913984", - "evmosvaloper1psf28krr9muve6w0qzgjlrju5mamlsac96l85q", - }, - { - "evmos1tumxjxv90z2z49qxnmnu2zath7lc56y4rf4ejw", - "830258302599999913984", - "evmosvaloper1rwy29t3eup0tnaph08rezdjsmckzqemkxh535w", - }, - { - "evmos1u2jxn5t868l6y0pcmvf5jvnksr8mqmvektqj4w", - "830258302599999913984", - "evmosvaloper1t3rfzrxeslmtz62mydyf2xmmxehwk7xzaaucjd", - }, - { - "evmos1u5avf477nfv5ynwffv8xq2gn7459n3s5nheygw", - "830258302599999913984", - "evmosvaloper17jyfw78xztc8crq4t8znjlg8ld76lkzkg2hny3", - }, - { - "evmos1udqrmt4024ycglhkdue7a3wswagntj5kh3h8tn", - "830258302599999913984", - "evmosvaloper1kegt9p7se6mpmtt47axx0rwxlp8tr5626pq09u", - }, - { - "evmos1ulehgvrx9pk830vffjcnu83acugzz03hj0g0nv", - "830258302599999913984", - "evmosvaloper1g376mzt2kcszpf7y3ee7r8jpseq2zv9hshf5g3", - }, - { - "evmos1unwslmcpy85rc5s5e3a57w45weq8w0wyu2q7ze", - "830258302599999913984", - "evmosvaloper1v4crs2adgcu2cdm2jxq07mw7ugzx0z4x6alxeg", - }, - { - "evmos1uqgvj8vv7rxkcf4fk8gyjz9d0zlwsv3mtrdzll", - "830258302599999913984", - "evmosvaloper1qp49y6vh8vvv5yf8ule8fwx6sss82ncz39tunl", - }, - { - "evmos1uqysp60wve907xrs6q5h6gdlrlhldk3uyfhkw5", - "830258302599999913984", - "evmosvaloper15ksyw7t5t9e7w9n3d2jqqmv7y334mfrhfvvnge", - }, - { - "evmos1ur5vsz5kmx2xg40j4p2sqsqevff3kqnvg2nr5j", - "830258302599999913984", - "evmosvaloper1kualgrr9qup0983gj44fczyvcda8ea47y494mz", - }, - { - "evmos1ushzwx09w6dll0qw7sx057k9lpsnfy84yxtyhw", - "830258302599999913984", - "evmosvaloper1u6ndfv26nc2jw43kx0kzck8s9pnunakwgu8vmc", - }, - { - "evmos1ut7hevm7sewfdlss3j8q4tj4lflxjt2080atl5", - "830258302599999913984", - "evmosvaloper1dk4ste222kp256ky00553nexna0rh38hx2ur6c", - }, - { - "evmos1uyqtz7gjsx76nnjq0lzszkdmtl236ch4xc34xs", - "830258302599999913984", - "evmosvaloper16jr6ewgp0ypu39z80lywgzwjrx99vxcq4sdfzf", - }, - { - "evmos1v0gcyy4ckadaez8ntgm0ntalu67l9thja4zn78", - "830258302599999913984", - "evmosvaloper10qpycc2egucukw8afcz4us7xlxxmfwh6rscvjz", - }, - { - "evmos1v5y44zrd43uknrpehq7f9xt2jjxkf647ar6gr3", - "830258302599999913984", - "evmosvaloper13nujml9r2dg85nucffe82xq3yg8f35qxmfal7p", - }, - { - "evmos1v9ccwpws8pfr557g5d02vzyfr78cxaqepg4wjq", - "830258302599999913984", - "evmosvaloper1f6m9d94lkenw9fy5wmytatt76l849kx6ugdz70", - }, - { - "evmos1ved34z682suw34jewvd4s0xyas25h342mjkvet", - "830258302599999913984", - "evmosvaloper1rwy29t3eup0tnaph08rezdjsmckzqemkxh535w", - }, - { - "evmos1vhe4tc2v82uw69v5y3hpaw3ad6gt0jdl933a0f", - "830258302599999913984", - "evmosvaloper13nujml9r2dg85nucffe82xq3yg8f35qxmfal7p", - }, - { - "evmos1vlq8tjruhrfjavmuye5d9aq6yhayvttmq6cc7g", - "830258302599999913984", - "evmosvaloper1chx7v975g72xuw8kdpjt94dh35daqqfyc37kys", - }, - { - "evmos1vnwwc44lv8l8y764d9ckz9xhcrj8lclvkdjuxd", - "830258302599999913984", - "evmosvaloper19e53dt5r9w2mstt32jnj43xrxlyprnc085tl30", - }, - { - "evmos1vpxrkvge3y7u9jxufqfkgzuz7lxjl22zwz0dhy", - "830258302599999913984", - "evmosvaloper1fmfhpcc00r6ejuclv2fje3egruruk9upe7tl4s", - }, - { - "evmos1vrzwglu9ngwykm4rknqmadt5gl9qxyd6ae3nmf", - "830258302599999913984", - "evmosvaloper1w9m6p7ctu4gkdsr8plle997h25rzsa96xlzfat", - }, - { - "evmos1vzkkne38d540fnpc8th3h9r3y4yc09zednnvr6", - "830258302599999913984", - "evmosvaloper15ksyw7t5t9e7w9n3d2jqqmv7y334mfrhfvvnge", - }, - { - "evmos1w3wude0n6fxj3mu4050kw3g34m00pz498uj96w", - "830258302599999913984", - "evmosvaloper1w9m6p7ctu4gkdsr8plle997h25rzsa96xlzfat", - }, - { - "evmos1w7gens2gzphl7vp9f47t2g8lc7ttfttkzndqq9", - "830258302599999913984", - "evmosvaloper17hd4fyhqkgply6klljx3ugqemhdgqhe8xu2yu6", - }, - { - "evmos1w7tsrv5q040w4zr5zwz0d9ur8nhh0f7qgwljfa", - "830258302599999913984", - "evmosvaloper12a6wa97lsv8wm62j07tz0xeqvfxddzyfg72d45", - }, - { - "evmos1w84t5g9wwhk00c7ut74tl9adzztqw64mfv2zq5", - "830258302599999913984", - "evmosvaloper1kualgrr9qup0983gj44fczyvcda8ea47y494mz", - }, - { - "evmos1wa0559qfr9uxjwur4xu7me3eud86qlhn0f33mv", - "830258302599999913984", - "evmosvaloper18zt355ccyxd3kj23mz5hdz00qqn5lk5kjnj74m", - }, - { - "evmos1wc4p6a0swnksmxxvrmnc6ytumq5mfr05frfxs5", - "830258302599999913984", - "evmosvaloper1ur0zjltn3qs5xzx4rn8ekr828f4tglyhu50c0w", - }, - { - "evmos1we8ppj25pq7mfmnxgest6ruvsn33vmdlgdfcn5", - "830258302599999913984", - "evmosvaloper1tjm6jya5wh65ha55c6279glcsa3mcs9srscytj", - }, - { - "evmos1wm8t4ayxq3upry8dpu6qyeaqkwskqpq2d5uweh", - "830258302599999913984", - "evmosvaloper1ce4vh0e5kanlgc7z0rhcemvd8erjnfzcyfecl7", - }, - { - "evmos1wpzt3urapgmzqz0ek3jhp99aswxtfgus9t2sf0", - "830258302599999913984", - "evmosvaloper1xaxg47uw046uw8vgpp3da367ctw9aguqjuyyyx", - }, - { - "evmos1wqj0r49em5vndngfm5dsu2y8jt7ftkv6w26kpu", - "830258302599999913984", - "evmosvaloper1y6yvdg2xdltzr0v5hvf8zvxk373xwas4jwgvkp", - }, - { - "evmos1wt0yuhgzh4jfg2vargae0nc9mdauft8hgada2q", - "830258302599999913984", - "evmosvaloper1vm5fvg57aeqp7xwl3umev7z0364jzvcfzlnfew", - }, - { - "evmos1wufk0wgtqp9t0fjap7qv362su8vsrn9hhn3dvk", - "830258302599999913984", - "evmosvaloper19fv2gwkgv3x53lau3um6tzg7qxvq96grvg97zr", - }, - { - "evmos1wuv77pmj3r5389wm68ljjj4v4ckuuqf6lz94up", - "830258302599999913984", - "evmosvaloper10qpycc2egucukw8afcz4us7xlxxmfwh6rscvjz", - }, - { - "evmos1wv9qnyxnjjcvj2j33paurxl6jlmkva6kl6qsvg", - "830258302599999913984", - "evmosvaloper1g3jy2wdjus4gka7e5dud7etz0u3mcnfs9vt5cr", - }, - { - "evmos1wwdqftn0zvt2z9ydagc7lpm26dw2sxtzt0yce5", - "830258302599999913984", - "evmosvaloper1lldjhjnn32e8vek7cxe9g05nf8j74y0xs5zmsu", - }, - { - "evmos1x2cv9rrd0t9xedgz0avqup29xku5guymv73z60", - "830258302599999913984", - "evmosvaloper1hn8u6x03mklzdy69r9khsd9q4yft7gmrkz8qkj", - }, - { - "evmos1x2ptywnpkysq0v5c5442nfxxeh7f8vv6nxdmwx", - "830258302599999913984", - "evmosvaloper155yk4wfn0xqye80exlsr6hu4qdfsvsgw63w87l", - }, - { - "evmos1xah4l5mk3hfajf260krpl9qtwprnyp3wmyamwx", - "830258302599999913984", - "evmosvaloper10pcga9su5me3dp5g4jln49uxjq7c9s2u9qy9zu", - }, - { - "evmos1xalqegrte87d6aunrf0a8ssn04kwqmu4hmrpkn", - "830258302599999913984", - "evmosvaloper139gzv3nvlkp4ylrywsnj8eurm6qwp8t3l9a2gy", - }, - { - "evmos1xd5gchzs6thu458zsearcnt7yvh8kcg05jj02z", - "830258302599999913984", - "evmosvaloper155yk4wfn0xqye80exlsr6hu4qdfsvsgw63w87l", - }, - { - "evmos1xdl34uht963hmvvec58mdqnf3ntwfsltuayfrj", - "830258302599999913984", - "evmosvaloper1aep37tvd5yh4ydeya2a88g2tkjz6f2lcrfjumh", - }, - { - "evmos1xezj6xyvzdsvjmm8nm7hw7jhup4ufxz6akhtyy", - "830258302599999913984", - "evmosvaloper1f08fffp8zz42jj0f6wh3gyu7he4hf6zzs6mn8j", - }, - { - "evmos1xfk34xzlqatx24dw7fzwxq9g3kzjsrskfvn4nx", - "830258302599999913984", - "evmosvaloper18zhvafj8jcezdut6z9u0pcsnqy978ya9d25du5", - }, - { - "evmos1xfrtk2ydg8ydm60ekel28mkygsuvhgumf0z4pr", - "830258302599999913984", - "evmosvaloper1kw03prf96w5rrj53pvhdnmsnr469dn9gqmsqwg", - }, - { - "evmos1xpqrm3e5sllcxgv2vv2j72a6lluz9j5dk4fn7a", - "830258302599999913984", - "evmosvaloper15n2ms99yx2lycwk0msmtlj9yxhtlmqeymtg4c3", - }, - { - "evmos1xsk7h3kldvk2cvqg75eznwnqffcdca37t2ycl0", - "830258302599999913984", - "evmosvaloper1a22spreqspsh9s3v67ctsuzaf9n4kallj7wuzf", - }, - { - "evmos1xxx5huf2crw5xk7mzzha0z48efc8aykz0lcv4v", - "830258302599999913984", - "evmosvaloper1h62qm8qcctvcdd8t3jwm9jcc9cwleqjgnsn7ry", - }, - { - "evmos1y032k5ccgt0la68sv9ltp73jhum6dmm89nes60", - "830258302599999913984", - "evmosvaloper1ur0zjltn3qs5xzx4rn8ekr828f4tglyhu50c0w", - }, - { - "evmos1y2w20qzz4dyefmxacemnhzru0qf8hseapjkufh", - "830258302599999913984", - "evmosvaloper1jhe4gfgl7wv3s99h3d9tz4g833j8265e7cjqyw", - }, - { - "evmos1y36se9av3sttg3z5nwrzrxvn6wfsp8lew4ch2h", - "830258302599999913984", - "evmosvaloper1fpjf8aywxg9qxexfwu9lanlgw58f5fhqfu348k", - }, - { - "evmos1y7xyeygf63z07eypn53ghrr7m6pmk5tz6fmt2r", - "830258302599999913984", - "evmosvaloper1hdslyd0vwj8ym368tqc5jdpu6hxrqvx9zex5yz", - }, - { - "evmos1ydsszj59vs3mvglqp8l5va8c2uedmyvj9xuzrm", - "830258302599999913984", - "evmosvaloper1q3aejvmwj9dxturgk00jv7hkwxld7ny7642tr8", - }, - { - "evmos1yj4340s55qndyyge56wxdamru09j6qm8wnrjfh", - "830258302599999913984", - "evmosvaloper1wxllvjqmha2p437dpczat82wzpr8gem04jkwmz", - }, - { - "evmos1ylgh7hqyxcakzeu0n6uzhpnmrs4h76hv82xk5n", - "830258302599999913984", - "evmosvaloper13nujml9r2dg85nucffe82xq3yg8f35qxmfal7p", - }, - { - "evmos1yvfcsqtlypck3g2t6wmxeyyvmw67u6dvpmfwfq", - "830258302599999913984", - "evmosvaloper1vdvflras2n3h7fjhe95h86wsy0z2nlsktngrp8", - }, - { - "evmos1yyclwzkglpwt5n50ps46n94ex08hn64fhamkfg", - "830258302599999913984", - "evmosvaloper1rh9uz23gmhr6q92a45qrath4fr9ffefz4eas0z", - }, - { - "evmos1z0a3hmftjzywjukr9tlvlw3mjxswak67k8p24f", - "830258302599999913984", - "evmosvaloper174jlcery04j6r7wgvequeysruyjlhtcmlhnhy2", - }, - { - "evmos1z0zeq7j6f4gxmytssfwuz39976a9zgn5z5y28p", - "830258302599999913984", - "evmosvaloper1n4kuugnh2z5dsug7egamma7chnjcdfu4jwhq76", - }, - { - "evmos1z955a5mfus9qdkhu8wf7d0pgqx7m40t2yzg99a", - "830258302599999913984", - "evmosvaloper1w2j20fj2a4wfmvqnhfhv4mfxkw5xxt09x8esyj", - }, - { - "evmos1ze34d28tr90qlunxjdjf03tjsauyve4l8tkm34", - "830258302599999913984", - "evmosvaloper15ksyw7t5t9e7w9n3d2jqqmv7y334mfrhfvvnge", - }, - { - "evmos1zm479w9eqesqtnce9qmrzzsl4x56u72f53qqwu", - "830258302599999913984", - "evmosvaloper1n4kuugnh2z5dsug7egamma7chnjcdfu4jwhq76", - }, - { - "evmos1zmh7ehhwyc40ez46cr3tmhpm5ysw2c02w3f8rk", - "830258302599999913984", - "evmosvaloper19fxanpnjlggzuur3m3x0puk5ez7j9lrttexwsw", - }, - { - "evmos1znmahry632fk7hmqjd220h7fntvtlh8l8z98p3", - "830258302599999913984", - "evmosvaloper1x322q9d7dvm0xw9966c8730pn083rv3q6ddtyx", - }, - { - "evmos1zsgy9ldzn47j8q3n7qmklmuf9gfepmqg50actn", - "830258302599999913984", - "evmosvaloper1gj8uu6pxcncdtav707a86v3sqva2svn45sx62g", - }, - { - "evmos1zt2nr8fn5k8cg300saseun77dk3lwucwzhuf64", - "830258302599999913984", - "evmosvaloper1qmpmzdesg9gr5wpyzkssayldnhk3pa8x2nwlwp", - }, -} diff --git a/app/upgrades/v11/constants.go b/app/upgrades/v11/constants.go deleted file mode 100644 index 73f9fe48ed..0000000000 --- a/app/upgrades/v11/constants.go +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package v11 - -const ( - // UpgradeName is the shared upgrade plan name for mainnet - UpgradeName = "v11.0.0" - // UpgradeInfo defines the binaries that will be used for the upgrade - UpgradeInfo = `'{"binaries":{"darwin/arm64":"https://github.com/evmos/evmos/releases/download/v11.0.0/evmos_11.0.0_Darwin_arm64.tar.gz","darwin/amd64":"https://github.com/evmos/evmos/releases/download/v11.0.0/evmos_11.0.0_Darwin_amd64.tar.gz","linux/arm64":"https://github.com/evmos/evmos/releases/download/v11.0.0/evmos_11.0.0_Linux_arm64.tar.gz","linux/amd64":"https://github.com/evmos/evmos/releases/download/v11.0.0/evmos_11.0.0_Linux_amd64.tar.gz","windows/x86_64":"https://github.com/evmos/evmos/releases/download/v11.0.0/evmos_11.0.0_Windows_x86_64.zip"}}'` - - // at the time of this migration, on mainnet, channels 0 to 37 were open - // so this migration covers those channels only - OpenChannels = 37 - - // FundingAccount is the account which holds the rewards for the incentivized testnet. - // It contains ~7.4M tokens, of which ~5.6M are to be distributed. - FundingAccount = "evmos1f7vxxvmd544dkkmyxan76t76d39k7j3gr8d45y" -) diff --git a/app/upgrades/v11/upgrades.go b/app/upgrades/v11/upgrades.go deleted file mode 100644 index 2bd2e25f70..0000000000 --- a/app/upgrades/v11/upgrades.go +++ /dev/null @@ -1,219 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package v11 - -import ( - "fmt" - - "github.com/cometbft/cometbft/libs/log" - - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - ica "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts" - genesistypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/genesis/types" - icahosttypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/host/types" - icatypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/types" - transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/module" - - authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - distributionkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" - stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" - upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - - errorsmod "cosmossdk.io/errors" - "cosmossdk.io/math" - errortypes "github.com/cosmos/cosmos-sdk/types/errors" - - "github.com/evmos/evmos/v16/utils" -) - -// CreateUpgradeHandler creates an SDK upgrade handler for v11 -func CreateUpgradeHandler( - mm *module.Manager, - configurator module.Configurator, - ak authkeeper.AccountKeeper, - bk bankkeeper.Keeper, - sk stakingkeeper.Keeper, - dk distributionkeeper.Keeper, -) upgradetypes.UpgradeHandler { - return func(ctx sdk.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { - logger := ctx.Logger().With("upgrade", UpgradeName) - - if utils.IsMainnet(ctx.ChainID()) { - logger.Debug("distributing incentivized testnet rewards...") - HandleRewardDistribution(ctx, logger, bk, sk, dk) - } - - MigrateEscrowAccounts(ctx, logger, ak) - - // create ICS27 Controller submodule params, with the controller module NOT enabled - gs := &genesistypes.GenesisState{ - ControllerGenesisState: genesistypes.ControllerGenesisState{}, - HostGenesisState: genesistypes.HostGenesisState{ - Port: icatypes.HostPortID, - Params: icahosttypes.Params{ - HostEnabled: true, - AllowMessages: []string{ - sdk.MsgTypeURL(&banktypes.MsgSend{}), - sdk.MsgTypeURL(&banktypes.MsgMultiSend{}), - sdk.MsgTypeURL(&distrtypes.MsgSetWithdrawAddress{}), - sdk.MsgTypeURL(&distrtypes.MsgWithdrawDelegatorReward{}), - sdk.MsgTypeURL(&govtypes.MsgVote{}), - sdk.MsgTypeURL(&govtypes.MsgVoteWeighted{}), - sdk.MsgTypeURL(&stakingtypes.MsgDelegate{}), - sdk.MsgTypeURL(&stakingtypes.MsgUndelegate{}), - sdk.MsgTypeURL(&stakingtypes.MsgCancelUnbondingDelegation{}), - sdk.MsgTypeURL(&stakingtypes.MsgBeginRedelegate{}), - sdk.MsgTypeURL(&transfertypes.MsgTransfer{}), - }, - }, - }, - } - - bz, err := icatypes.ModuleCdc.MarshalJSON(gs) - if err != nil { - return nil, errorsmod.Wrapf(err, "failed to marshal %s genesis state", icatypes.ModuleName) - } - - // Register the consensus version in the version map to avoid the SDK from triggering the default - // InitGenesis function. - vm[icatypes.ModuleName] = ica.AppModule{}.ConsensusVersion() - - m := mm.Modules[icatypes.ModuleName].(module.HasGenesis) - m.InitGenesis(ctx, icatypes.ModuleCdc, bz) - - logger.Debug("running module migrations ...") - return mm.RunMigrations(ctx, configurator, vm) - } -} - -// MigrateEscrowAccounts updates the IBC transfer escrow accounts type to ModuleAccount -func MigrateEscrowAccounts(ctx sdk.Context, logger log.Logger, ak authkeeper.AccountKeeper) { - for i := 0; i <= OpenChannels; i++ { - channelID := fmt.Sprintf("channel-%d", i) - address := transfertypes.GetEscrowAddress(transfertypes.PortID, channelID) - - // check if account exists - existingAcc := ak.GetAccount(ctx, address) - - // account does NOT exist, so don't create it - if existingAcc == nil { - continue - } - - // if existing account is ModuleAccount, no-op - if _, isModuleAccount := existingAcc.(authtypes.ModuleAccountI); isModuleAccount { - continue - } - - // account name based on the address derived by the transfertypes.GetEscrowAddress - // this function appends the current IBC transfer module version to the provided port and channel IDs - // To pass account validation, need to have address derived from account name - accountName := fmt.Sprintf("%s\x00%s/%s", transfertypes.Version, transfertypes.PortID, channelID) - baseAcc := authtypes.NewBaseAccountWithAddress(address) - - // Set same account number and sequence as the existing account - if err := baseAcc.SetAccountNumber(existingAcc.GetAccountNumber()); err != nil { - // log error instead of aborting the upgrade - logger.Error("failed to set escrow account number for account", accountName, "error", err.Error()) - } - if err := baseAcc.SetSequence(existingAcc.GetSequence()); err != nil { - // log error instead of aborting the upgrade - logger.Error("failed to set escrow account sequence for account", accountName, "error", err.Error()) - } - - // no special permissions defined for the module account - acc := authtypes.NewModuleAccount(baseAcc, accountName) - ak.SetModuleAccount(ctx, acc) - } -} - -// HandleRewardDistribution handles the logic for the reward distribution, -// it only commits to the db if successful -func HandleRewardDistribution( - ctx sdk.Context, - logger log.Logger, - bk bankkeeper.Keeper, - sk stakingkeeper.Keeper, - dk distributionkeeper.Keeper, -) { - // use a cache context as a rollback mechanism in case - // the distrbution fails - cacheCtx, writeFn := ctx.CacheContext() - err := DistributeRewards(cacheCtx, bk, sk, dk) - if err != nil { - // log error instead of aborting the upgrade - logger.Error("failed to distribute rewards", "error", err.Error()) - } else { - writeFn() - } -} - -// DistributeRewards distributes the token allocations from the Olympus Mons -// incentivized testnet for completing the Mars Meteor Missions -func DistributeRewards(ctx sdk.Context, bk bankkeeper.Keeper, sk stakingkeeper.Keeper, - dk distributionkeeper.Keeper, -) error { - funder := sdk.MustAccAddressFromBech32(FundingAccount) - - for _, allocation := range Allocations { - // send reward to receiver - receiver := sdk.MustAccAddressFromBech32(allocation[0]) - - amount, ok := math.NewIntFromString(allocation[1]) - if !ok { - return errorsmod.Wrapf( - errortypes.ErrInvalidType, - "cannot retrieve allocation amount from string for address %s", - allocation[0], - ) - } - - if !amount.IsPositive() { - return errorsmod.Wrapf( - errortypes.ErrInvalidCoins, - "amount cannot be zero negative for address %s, got %s", - allocation[0], allocation[1], - ) - } - - // delegate receiver's rewards to selected validator - validatorAddress, err := sdk.ValAddressFromBech32(allocation[2]) - if err != nil { - return err - } - - reward := sdk.Coins{{Denom: utils.BaseDenom, Amount: amount}} - - if err := bk.SendCoins(ctx, funder, receiver, reward); err != nil { - return err - } - - validator, found := sk.GetValidator(ctx, validatorAddress) - if !found { - return errorsmod.Wrap(stakingtypes.ErrNoValidatorFound, allocation[2]) - } - - _, err = sk.Delegate(ctx, receiver, amount, stakingtypes.Unbonded, validator, true) - if err != nil { - return err - } - } - - // transfer all remaining tokens (1.775M = 7.4M - 5.625M) after rewards distribution - // to the community pool - remainingFunds := bk.GetBalance(ctx, funder, utils.BaseDenom) - if !remainingFunds.Amount.IsPositive() { - return nil - } - - return dk.FundCommunityPool(ctx, sdk.Coins{remainingFunds}, funder) -} diff --git a/app/upgrades/v11/upgrades_test.go b/app/upgrades/v11/upgrades_test.go deleted file mode 100644 index 310a5f095a..0000000000 --- a/app/upgrades/v11/upgrades_test.go +++ /dev/null @@ -1,373 +0,0 @@ -package v11_test - -import ( - "fmt" - "testing" - "time" - - "golang.org/x/exp/slices" - - "cosmossdk.io/math" - cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" - sdk "github.com/cosmos/cosmos-sdk/types" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - ibctypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - "github.com/evmos/evmos/v16/app" - v11 "github.com/evmos/evmos/v16/app/upgrades/v11" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" - "github.com/evmos/evmos/v16/testutil" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" - "github.com/stretchr/testify/suite" - - "github.com/cometbft/cometbft/crypto/tmhash" - tmproto "github.com/cometbft/cometbft/proto/tendermint/types" - tmversion "github.com/cometbft/cometbft/proto/tendermint/version" - "github.com/cometbft/cometbft/version" - stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v16/utils" -) - -type UpgradeTestSuite struct { - suite.Suite - - ctx sdk.Context - app *app.Evmos - consKey cryptotypes.PubKey -} - -func (suite *UpgradeTestSuite) SetupTest(chainID string) { - checkTx := false - - // consensus key - priv, err := ethsecp256k1.GenerateKey() - suite.Require().NoError(err) - suite.consKey = priv.PubKey() - consAddress := sdk.ConsAddress(priv.PubKey().Address()) - - // NOTE: this is the new binary, not the old one. - suite.app = app.Setup(checkTx, feemarkettypes.DefaultGenesisState(), chainID) - suite.ctx = suite.app.BaseApp.NewContext(checkTx, tmproto.Header{ - Height: 1, - ChainID: chainID, - Time: time.Date(2022, 5, 9, 8, 0, 0, 0, time.UTC), - ProposerAddress: consAddress.Bytes(), - - Version: tmversion.Consensus{ - Block: version.BlockProtocol, - }, - LastBlockId: tmproto.BlockID{ - Hash: tmhash.Sum([]byte("block_id")), - PartSetHeader: tmproto.PartSetHeader{ - Total: 11, - Hash: tmhash.Sum([]byte("partset_header")), - }, - }, - AppHash: tmhash.Sum([]byte("app")), - DataHash: tmhash.Sum([]byte("data")), - EvidenceHash: tmhash.Sum([]byte("evidence")), - ValidatorsHash: tmhash.Sum([]byte("validators")), - NextValidatorsHash: tmhash.Sum([]byte("next_validators")), - ConsensusHash: tmhash.Sum([]byte("consensus")), - LastResultsHash: tmhash.Sum([]byte("last_result")), - }) - - cp := suite.app.BaseApp.GetConsensusParams(suite.ctx) - suite.ctx = suite.ctx.WithConsensusParams(cp) -} - -func TestUpgradeTestSuite(t *testing.T) { - s := new(UpgradeTestSuite) - suite.Run(t, s) -} - -var expAccNum = make(map[int]uint64) - -func (suite *UpgradeTestSuite) setupEscrowAccounts(accCount int) { - for i := 0; i <= accCount; i++ { - channelID := fmt.Sprintf("channel-%d", i) - addr := ibctypes.GetEscrowAddress(ibctypes.PortID, channelID) - - // set accounts as BaseAccounts - baseAcc := authtypes.NewBaseAccountWithAddress(addr) - err := baseAcc.SetAccountNumber(suite.app.AccountKeeper.NextAccountNumber(suite.ctx)) - suite.Require().NoError(err) - expAccNum[i] = baseAcc.AccountNumber - suite.app.AccountKeeper.SetAccount(suite.ctx, baseAcc) - } -} - -func (suite *UpgradeTestSuite) setValidators(validatorsAddr []string) { - for _, valAddrStr := range validatorsAddr { - // Set Validator - valAddr, err := sdk.ValAddressFromBech32(valAddrStr) - suite.Require().NoError(err) - - validator, err := stakingtypes.NewValidator(valAddr, suite.consKey, stakingtypes.Description{}) - suite.Require().NoError(err) - - validator = stakingkeeper.TestingUpdateValidator(&suite.app.StakingKeeper, suite.ctx, validator, true) - - err = suite.app.StakingKeeper.Hooks().AfterValidatorCreated(suite.ctx, validator.GetOperator()) - suite.Require().NoError(err) - err = suite.app.StakingKeeper.SetValidatorByConsAddr(suite.ctx, validator) - suite.Require().NoError(err) - } - - validators := suite.app.StakingKeeper.GetValidators(suite.ctx, 1000) - suite.Require().Equal(len(validatorsAddr)+1, len(validators)) -} - -func (suite *UpgradeTestSuite) TestMigrateEscrowAcc() { - suite.SetupTest(utils.MainnetChainID + "-1") - - // fund some escrow accounts - existingAccounts := 30 - suite.setupEscrowAccounts(existingAccounts) - - // Run migrations - v11.MigrateEscrowAccounts(suite.ctx, suite.app.Logger(), suite.app.AccountKeeper) - - // check account types for channels 0 to 37 - for i := 0; i <= v11.OpenChannels; i++ { - channelID := fmt.Sprintf("channel-%d", i) - addr := ibctypes.GetEscrowAddress(ibctypes.PortID, channelID) - acc := suite.app.AccountKeeper.GetAccount(suite.ctx, addr) - - if i > existingAccounts { - suite.Require().Nil(acc, "This account did not exist, it should not be migrated") - continue - } - suite.Require().NotNil(acc) - - moduleAcc, isModuleAccount := acc.(*authtypes.ModuleAccount) - suite.Require().True(isModuleAccount) - suite.Require().NoError(moduleAcc.Validate(), "account validation failed") - - // Check account number - suite.Require().Equal(expAccNum[i], moduleAcc.GetAccountNumber()) - } -} - -func (suite *UpgradeTestSuite) TestDistributeRewards() { - // define constants - mainnetChainID := utils.MainnetChainID + "-4" - communityPool := sdk.MustAccAddressFromBech32("evmos1jv65s3grqf6v6jl3dp4t6c9t9rk99cd8974jnh") - fundingAcc := sdk.MustAccAddressFromBech32(v11.FundingAccount) - - // checks on reward amounts - balance, ok := math.NewIntFromString("7399998994000000000000000") - suite.Require().True(ok, "error converting rewards account balance") - - expRewards, ok := math.NewIntFromString("5624999999983399933050880") - suite.Require().True(ok, "error converting rewards") - - var validatorAddresses []string - validatorDelegations := make(map[string]math.Int) - actualRewards := math.ZeroInt() - - for _, allocation := range v11.Allocations { - amt, ok := math.NewIntFromString(allocation[1]) - suite.Require().True(ok, "failed to convert allocation") - - actualRewards = actualRewards.Add(amt) - - if !slices.Contains(validatorAddresses, allocation[2]) { - validatorAddresses = append(validatorAddresses, allocation[2]) - } - - totalTokens, ok := validatorDelegations[allocation[2]] - if !ok { - validatorDelegations[allocation[2]] = amt - } else { - validatorDelegations[allocation[2]] = totalTokens.Add(amt) - } - } - - suite.Require().Equal(expRewards, actualRewards) - - expCommPoolBalance := balance.Sub(expRewards) - noRewardAddr := sdk.MustAccAddressFromBech32("evmos1009egsf8sk3puq3aynt8eymmcqnneezkkvceav") - - testCases := []struct { - name string - chainID string - malleate func() - expectedSuccess bool - expCommPoolBalance math.Int - }{ - { - "Mainnet - success", - mainnetChainID, - func() {}, - true, - expCommPoolBalance, - }, - { - "Mainnet - insufficient funds on reward account - fail", - mainnetChainID, - func() { - err := suite.app.BankKeeper.SendCoins( - suite.ctx, - fundingAcc, - sdk.AccAddress(utiltx.GenerateAddress().Bytes()), - sdk.NewCoins( - sdk.NewCoin(utils.BaseDenom, balance.Quo(math.NewInt(2))), - ), - ) - suite.NoError(err) - }, - false, - math.ZeroInt(), - }, - { - "Mainnet - invalid reward amount - fail", - mainnetChainID, - func() { - v11.Allocations[0][1] = "a0151as2021231a" - }, - false, - math.ZeroInt(), - }, - { - "Testnet - no-op", - utils.TestnetChainID + "-4", - func() {}, - false, - math.ZeroInt(), - }, - } - - for _, tc := range testCases { - suite.Run(fmt.Sprintf("Case %s", tc.name), func() { - suite.SetupTest(tc.chainID) - suite.fundTestnetRewardsAcc(balance) - tc.malleate() - - // create validators - suite.setValidators(validatorAddresses) - - // check no delegations for validators initially - initialDel := suite.getDelegatedTokens(validatorAddresses...) - suite.Require().Equal(math.ZeroInt(), initialDel) - - if utils.IsMainnet(tc.chainID) { - v11.HandleRewardDistribution(suite.ctx, suite.app.Logger(), suite.app.BankKeeper, suite.app.StakingKeeper, suite.app.DistrKeeper) - } - - // account not in list should NOT get rewards - // balance should be 0 - balance := suite.app.BankKeeper.GetBalance(suite.ctx, noRewardAddr, utils.BaseDenom) - suite.Require().Equal(math.ZeroInt(), balance.Amount) - - // get staked (delegated) tokens - no delegations expected - delegated := suite.app.StakingKeeper.GetAllDelegatorDelegations(suite.ctx, noRewardAddr) - suite.Require().Empty(delegated) - - commPoolFinalBalance := suite.app.BankKeeper.GetBalance(suite.ctx, communityPool, utils.BaseDenom) - suite.Require().Equal(tc.expCommPoolBalance, commPoolFinalBalance.Amount) - - // do allocations - for i := range v11.Allocations { - addr := sdk.MustAccAddressFromBech32(v11.Allocations[i][0]) - valShare, _ := math.NewIntFromString(v11.Allocations[i][1]) - - balance := suite.app.BankKeeper.GetBalance(suite.ctx, addr, utils.BaseDenom) - suite.Require().Equal(math.ZeroInt(), balance.Amount) - - // get staked (delegated) tokens - delegated := suite.app.StakingKeeper.GetAllDelegatorDelegations(suite.ctx, addr) - if tc.expectedSuccess { - // sum of all delegations should be equal to rewards - delegatedAmt := suite.sumDelegatorDelegations(delegated...) - suite.Require().Equal(valShare, delegatedAmt) - } else { - suite.Require().Empty(delegated) - } - } - - // check delegation for each validator - totalDelegations := math.ZeroInt() - for _, v := range validatorAddresses { - delTokens := suite.getDelegatedTokens(v) - if tc.expectedSuccess { - // amount delegated should be equal to sums calculated pre-tests - suite.Require().Equal(validatorDelegations[v], delTokens) - } else { - suite.Require().Equal(math.ZeroInt(), delTokens) - } - totalDelegations = totalDelegations.Add(delTokens) - } - - if tc.expectedSuccess { - // sum of all delegations should be equal to rewards - suite.Require().Equal(expRewards, totalDelegations) - // Funding acc balance should be 0 after the rewards distribution - finalFundingAccBalance := suite.app.BankKeeper.GetBalance(suite.ctx, fundingAcc, utils.BaseDenom) - suite.Require().Equal(math.NewInt(0), finalFundingAccBalance.Amount) - } - }) - } -} - -func (suite *UpgradeTestSuite) fundTestnetRewardsAcc(amount math.Int) { - rewardsAcc, err := sdk.AccAddressFromBech32(v11.FundingAccount) - suite.Require().NoError(err) - - rewards := sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, amount)) - err = testutil.FundAccount(suite.ctx, suite.app.BankKeeper, rewardsAcc, rewards) - suite.Require().NoError(err) -} - -func (suite *UpgradeTestSuite) sumDelegatorDelegations(ds ...stakingtypes.Delegation) math.Int { - sumDec := math.LegacyNewDec(0) - - for _, d := range ds { - validator, ok := suite.app.StakingKeeper.GetValidator(suite.ctx, d.GetValidatorAddr()) - suite.Require().True(ok) - - amt := validator.TokensFromShares(d.GetShares()) - sumDec = sumDec.Add(amt) - } - - return sumDec.TruncateInt() -} - -func (suite *UpgradeTestSuite) sumValidatorDelegations(validator stakingtypes.ValidatorI, ds ...stakingtypes.Delegation) math.Int { - sumDec := math.LegacyNewDec(0) - - for _, d := range ds { - amt := validator.TokensFromShares(d.GetShares()) - sumDec = sumDec.Add(amt) - } - - return sumDec.TruncateInt() -} - -func (suite *UpgradeTestSuite) getDelegatedTokens(valAddrs ...string) math.Int { - delTokens := math.NewInt(0) - - for _, valAddrStr := range valAddrs { - valAddr, err := sdk.ValAddressFromBech32(valAddrStr) - suite.Require().NoError(err) - - val, ok := suite.app.StakingKeeper.GetValidator(suite.ctx, valAddr) - suite.Require().True(ok) - - // get staked (delegated) tokens - delegations := suite.app.StakingKeeper.GetValidatorDelegations(suite.ctx, valAddr) - - delegatedAmt := suite.sumValidatorDelegations(val, delegations...) - delTokens = delTokens.Add(delegatedAmt) - } - return delTokens -} - -func (suite *UpgradeTestSuite) TestNoDuplicateAddress() { - participants := make(map[string]bool) - for _, allocation := range v11.Allocations { - suite.Require().False(participants[allocation[0]], "duplicated allocation entry") - participants[allocation[0]] = true - } -} diff --git a/app/upgrades/v12/accounts.go b/app/upgrades/v12/accounts.go deleted file mode 100644 index c1eb25e9dc..0000000000 --- a/app/upgrades/v12/accounts.go +++ /dev/null @@ -1,19177 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -// These accounts represent the affected accounts during the Claims decay bug - -// The decay occurred before planned and the corresponding claimed amounts -// were less than supposed to be - -package v12 - -// Accounts holds the missing claim amount to the corresponding account -var Accounts = [19164][2]string{ - {"evmos1000z4mk9jtr282yxmc3577qr9h6sprlu3tsz6l", "11874559096980682752"}, - {"evmos10078ys6pyrqhr9sdrphdtgth2u3t5kmz644539", "2616281440833449984"}, - {"evmos100a9fpmq7rsjkxyryauhr9tt5z9c0hwgwknct2", "291140584219587084288"}, - {"evmos100cmf99uzq034fpzqeyqgp5aypdhx93m7w0er6", "1648928122612736"}, - {"evmos100da25cj3dk22u5n9avllrmnhy08ppkkm6wpv7", "2876440839872856064"}, - {"evmos100fe88686h5mqq2c8du4u4665pkt3cj9y37pp2", "1415215513032187904"}, - {"evmos100gc5ytyxm09c5jkyavnuk382hle8mqamxccn4", "192817012171901440"}, - {"evmos100hdxqejv4k2ggsvkt8gu3gglvvqz05d88te90", "4370575177188962304"}, - {"evmos100m58mvcj4a9fq6205cm4h5rsm42n4tqxcv6gc", "2676590941646471168"}, - {"evmos100mldeytppgg023uy83uazf8zyp93066w2tjy4", "13886565854140176384"}, - {"evmos100n950wex4vlkxv0qgxfhsu9uxme8t8kuzxjan", "465876982094850048"}, - {"evmos100ptecad5v0zld8x4qvau48vqpyn7nrd04gche", "2102428316010249216"}, - {"evmos100q43s667d0ngf4nzuum0pfpqpz3u9zfqk6kqp", "2796160406994723840"}, - {"evmos100qp62s9zd6wwvdlq0n702y2f5a88zee0ev4zh", "688277128371539968"}, - {"evmos100tlt8k3fyalnqzzj07sn9wkt8l8c0f4d5v8aw", "772383910516931584"}, - {"evmos100xfvp9wukjv6llepvlm83w7k8kzhfxdax95kj", "1653768558314952192"}, - {"evmos100z4fhxajzkc9azs58qz8zsj9gpee72a4rncyh", "1285162623721566208"}, - {"evmos1022g0rlmhlkn9p4gvppc2gqzd4sh2kj5d8zd7m", "58944133204561223680"}, - {"evmos1027sxhhzewprxquf69tw3m0ddvlxctjnzrfc5v", "6980297569444490240"}, - {"evmos102a0pu3898egau5zte7xtsa748fsudzsxcxxjx", "1564547673753408000"}, - {"evmos102d640td4efyumeuwr4qzvg2nchhh3y0207tg0", "386191955258465792"}, - {"evmos102fq0h35xzz7sswpmd7w0ufll4esdx33l3lee4", "6255477334018216960"}, - {"evmos102g2gqykxgr8ump7nn93pdhqkp9zu9yw0tj6ux", "6962750077035241472"}, - {"evmos102jane8jmk0z7jwenpqp6nt9u6p9ctk64wvrea", "26889435648432103424"}, - {"evmos102jep5hsucp526exru7ljpk7d5wnzg06lyfsh7", "36807214276013760512"}, - {"evmos102kf349s28yaklfa5q8uaaj9upqlguhv20y90l", "465926848739940608"}, - {"evmos102n0crkwcggn3f5df04k2sg4d03c4gmvtl2wtr", "385971255853383680"}, - {"evmos102rsv4nxuvju5pknqxjuhrtj30tgdy5ztggg37", "375376017934635008"}, - {"evmos102tkl2hecszvdqze8vspyvpes3lss0gwhpttfn", "22861068862217224192"}, - {"evmos102uvvp8zsw7rlc8a8fnmnlnykjvm9s6h35hp5w", "3262692145247838208"}, - {"evmos102v2lxq0rcmz0tdzyrqf7anpaktv49kl67ryte", "1266794741231812608"}, - {"evmos102zck64vfff5vu5u2ka0h265220tmcvh3uxfl7", "384213162911791872"}, - {"evmos10322wtvkfhqpyjexz6hx5han67shka57mshyra", "319581919757158144"}, - {"evmos1033jhyxvw6v0dhy7824eqznzkvx6fda4hzy665", "3743486970734098432"}, - {"evmos1034lc4gzadcezd7yept7hhhmcj29rd5q5d8skt", "2438557286483186176"}, - {"evmos1035flq46jfsvm9clwy7gm2shtuvfvtyx9ry46h", "108732145043497975808"}, - {"evmos1036cyep7v76y8vxrlqks2ya685jup8ujkxsawj", "1813854399204274176"}, - {"evmos1037p0mupvzhlw35fjhjc7dgscjzhudqdug92rt", "5495532741836029952"}, - {"evmos103dqht74ecg9tddxcj9jee9dxy00trsvg93g4v", "20613889831048425472"}, - {"evmos103f6nztfa0lchgjlx9lg7lz307uae2yvt4c2xm", "807222161704905216"}, - {"evmos103fwrsa9d2wnt8qalldy55elftm8rv6vp6aplh", "1781413158365465856"}, - {"evmos103ga85egyhukzwysts4erxzm5zu2rlxq2xkh24", "281298712879949824"}, - {"evmos103gn83877dcuczhqhuvqyet45sv494vvrzax2j", "590717958566356992"}, - {"evmos103jlndduzuxkfk9yyguw2l3k484x2wgl95xa5y", "889854735908841472"}, - {"evmos103jy4vjwhe4vwljpa2xze7gvnkzjna8ua4rdav", "4966162459623260160"}, - {"evmos103kp0l95s5x7274mcdrc3dye7zna70tv67u8a0", "2994512084544165888"}, - {"evmos103mcfrx4jhqrj256af8e34fqa6zfcs055pnz70", "6650756477664060416"}, - {"evmos103nd4ls5cmff05jl2ku0jx8g69tzatx7kxd4qt", "1106655987914190336"}, - {"evmos103npmhx9kg67hlt77lg89dazn0hefgznh5dqvl", "1608071276711534592"}, - {"evmos103qux7mpqa4qfdrfuks6tpf8xxeca4740ll9v2", "46034824011706187776"}, - {"evmos103t0h4tcpnx2wn0dlmuh9vru9tqd2pmgcrkmct", "213548638412570624"}, - {"evmos103ue62g43gew96gmhspz5uw2r2ny2yrnpnnzvp", "16427180496527837184"}, - {"evmos103ussx43juelqguk9y579zgtl5mpajq8rygp4k", "1370225498396152832"}, - {"evmos103w6xj2qsl96pt55ly5yst9r24jn45zg304m3d", "30981076877442793472"}, - {"evmos103we2s53jatvxurd6wxtxa9v4js0acn9m2dmm7", "20992747541649960960"}, - {"evmos103zdg9glhxyw29prackcv7rsujc3536clstjq7", "45503662418265456640"}, - {"evmos103zx0he0jnpn0nnqe6cvv0mxuf0g2v299dvfy3", "3081512729129943040"}, - {"evmos1040kc8u2yeh6j7pk6elajann3edt2449umtp6a", "28075960537139968"}, - {"evmos1043fnaalk5er94s6mumwwzjkv4mategw7sc5sv", "7582417658744270848"}, - {"evmos10450fmeawflh224yf9egrcrv4mdv3pr2ekryf6", "1016503413503559680"}, - {"evmos1047f43k8a9gtx4ka87qp5704tmfgfg2hluyzpc", "2063210746664686592"}, - {"evmos1048ng5rdms75e8whg8hwjs9p9hurmkymvhqfma", "2516481544714412032"}, - {"evmos104a98c9egulvdfxe73lq80gesufq8pqahjflvs", "800195360355411968"}, - {"evmos104cld8z204vj34h8scvzdmejwd6avagc3np3hg", "13516941718511517696"}, - {"evmos104ey0ycpczg7snzrkr2d65ugtzk2hl77h8yenq", "4675695573532479488"}, - {"evmos104g5yu3nmmpjzr6s4xh0a3mxnz3rx24hnj20en", "41638039063764992"}, - {"evmos104h2sdvdg8sk6ytlmnc7qtzwtecsvur0euwewv", "3652354772979900416"}, - {"evmos104hupmj257t7py0mranmhvqkkrw9sg87newcre", "10580672999438860288"}, - {"evmos104l0kffpccyz094rk4jsxejhey8566nt2fgv2h", "53570076963995918336"}, - {"evmos104nt60dptcref9vcnhyp8yme0pq5dtldq2saeu", "3053805838497999872"}, - {"evmos104ptnzwpzftft25v2pw5eduew4x7ferg890lr8", "448567074460036608"}, - {"evmos104re6qr394jlfpy6wyw6fpjgg08tlqawsj4m5p", "24000675978665304064"}, - {"evmos104ukk6u9xqvfa2m52uv9ha76u07q0p23es67mr", "387782754107190784"}, - {"evmos104uvt968yjsg32j5h46exa6tklltgend55dhq2", "39650867717456232448"}, - {"evmos104v5neefwd5xj06k6cx8d977mpl7vqetfpa78n", "469010648405677056"}, - {"evmos104w3tkchcfnjdjhh9tqu9754lw9a46j2mpcsff", "1806041296272072192"}, - {"evmos104w890sy9vfk8nwr0zv6rgxnhrtrg8t0knq8jn", "4191399516476972544"}, - {"evmos104yhln2vc5zyz4vepw0q2mxt55gc65uu7g5xe9", "1065283772289051136"}, - {"evmos105560gkftczqe8j4flt9v9glvttqcvuewx0ru9", "2234397874207128576"}, - {"evmos1056p4dq6ghdgu63ev8lqwze754qev6xyfx6pdq", "415777200423040512"}, - {"evmos10570p2t2aa36egsjmajhafk9gy0206am7mfvrq", "3773043300249682432"}, - {"evmos1058qjmrueq55cmlngscn2ew3xcl43vfknecw4x", "8647039073565360128"}, - {"evmos105904mntjelhmjjxhr24jvthslddap4zrzxvgm", "27626620642714648576"}, - {"evmos10592fxj5wr4d28s3tneu72jssn368gqfau908x", "762828608516903936"}, - {"evmos1059hxdvazsy7uva62crehn9l4adlra6stw3r22", "904185414971439104"}, - {"evmos105gjmhgmwtp5r88vffexrqsy7czywdngwc05pu", "868663501925560832"}, - {"evmos105gk3hju2ltpk9ksvzgqlj7dugerzy05a5l79y", "2167014168263693824"}, - {"evmos105jcsl0ec0v9gdgct7cpmaxhqgav4a92y7m7jp", "3010404925754810368"}, - {"evmos105ljtsrk3s4enkj876xulqw5990akedr0lx2ky", "71144639121985536"}, - {"evmos105n3u5hhxcf8uxcza0uvudau9hc8jzhqr4u9zq", "3872958542289975296"}, - {"evmos105pm88u8pwepqax2a5wlz7d96zk4rehcu2f989", "381384342406049280"}, - {"evmos105ra599c0d3hp7uc0upzxe7mgw9d8rqrvmh69y", "866299112783570944"}, - {"evmos105tdpenk364an40gekjyr6plxqwen26leea00m", "1493978630410842112"}, - {"evmos105v08c3yvzfyh3mrlwehtvqvmj6qmtjghd4w0j", "2874294852482288640"}, - {"evmos105v7khk4swx6nqrxs95g7qav9wwtcwy7njc7ta", "2807969860877081600"}, - {"evmos105vssgeje750c3gltzskac4pajdf9mk3d3nwlj", "26524319595142144"}, - {"evmos105wdv8mp20hav7vk85gpchzfxaycn3l8p4ad5l", "733305897407363072"}, - {"evmos105wjw355x7tsgqze0xqtuja4apyhdm7dvtd0j9", "1295143471606509568"}, - {"evmos105xyh9f7kaeznrvl8xchldxqafqf7wf4ut4mhf", "12595331253471936512"}, - {"evmos105yn9fp5yswkwdylsuethv5kc3hvvptq6xueh5", "8531120284998592512"}, - {"evmos105zsyxj95wa5tsysht0jxd03frl3a5mcu7gdrd", "3368159037323814912"}, - {"evmos1062q0ql2t8tyneexq8rjjuct20dgsn5tepxptm", "1323614470101722112"}, - {"evmos1065c5774stzf94epe73hamshs7jlg6vgq3glwa", "347321200346893824"}, - {"evmos10673hm67yqzpn0t0kf757cggnu2gjc00n7zaua", "1981648998206901248"}, - {"evmos106a733ax9zzf7sc90qqh0g9xea5mvd3v6ugh47", "2559136055130018816"}, - {"evmos106c0663s68lnqjuqzxntzdnnu86qm7auymhye2", "1468467607588405760"}, - {"evmos106c0w2g8chn58v0jg60qrvq57p77w8e7wv0vtm", "99948840258755584"}, - {"evmos106djcfu4gm936v2cy6nexzzx6l7ql9ncz3jh5e", "386226260515216640"}, - {"evmos106ecjt0ug55msx5mzrg873key79mev6u2z9zwt", "7701404799577524224"}, - {"evmos106efncnqpmfa0dlk76pq6l5zjp0jf2nd8ycmky", "1550948473972670464"}, - {"evmos106eg9utsrlt3c0fc0myks9wyqx7c2xuty3qmx4", "2235565493062239232"}, - {"evmos106famcaazzcxetc67gaxwar9gnxcqs79kqd7qr", "1082137280585984"}, - {"evmos106fjqccj0le04lnhg3ru4r22s2r2pe44rr3j5y", "384308486499702784"}, - {"evmos106jj36x27lege37eflveya2u36egkazyrdphrv", "275964296312357376"}, - {"evmos106mk2jfpyv6tvvsykxtpufy2qp5tjz6jqk3h85", "644144796201999488"}, - {"evmos106n3s0z2rtxef6804keg3vhqh0afrzc6ger933", "1716703181378313216"}, - {"evmos106p4r2f8zk756flwr4r9w8mhhdl673zg9ctu96", "13273091771462377472"}, - {"evmos106sw494k4quh8nc7lyvwcxnf7df4gajdjw5y70", "1561716382434238464"}, - {"evmos106sxnz3dwl5m9rase78e3krwzmhv8ugzmwdktl", "51256901029574909952"}, - {"evmos106uhgdlalgly9sf7kdhj6c0z6yha82cztz5cmm", "1673256004840136704"}, - {"evmos106v0dgp92mwgerjph7aw84wwkutzuq4zechnkl", "4155748937275064320"}, - {"evmos106v58gj2v0we4dvn77vzmzpmfczp3gqj2h5sk2", "4929616528754573312"}, - {"evmos106vgvay5lx0k8p7qylphq268dqpxguzuurrdd4", "1958222103227478016"}, - {"evmos106w309wf6w5ckm6ffnaeefnhkxe8237yzknuwa", "1876398630864898304"}, - {"evmos106wfj4krv3z244q0ctegq0zmh4zjxwxh3judwj", "172446599242742784"}, - {"evmos106yecftkx3vtynmlahf39e98ajnqcm3wlsa0ly", "11302964603915505664"}, - {"evmos107338ypdhzpn9c53uczxqynhj28d2wr4ra8thz", "4077354817699889152"}, - {"evmos10769jdrlkhs09qe9e4de3p6pjegsgyzxhthf6n", "1064365880060825088"}, - {"evmos1076c2k8fwh89hc8p2t48k3y8v900gtfzx7h44g", "3509027010099929088"}, - {"evmos1079srp3whaakp6r7724fvmwws9f3n3nfjajnvy", "68007427466813808640"}, - {"evmos107gjtr24qv9859vlmtczgx7tzuyx0taxgmgy0e", "3714350401790754816"}, - {"evmos107gzekcqe5txfjlcty9s37khdlsruh2xwq5qug", "4984287810158592000"}, - {"evmos107h0nw9g0xxgakks9game8nz0ewddzhcv9fgje", "1722046721085665280"}, - {"evmos107j9xsrmrwzd8y4fl7nrpmr4nt65txs5nqx57m", "47556232109905920000"}, - {"evmos107krsgvtpnmdtmegl0a58l5h3z0cnx8frtd5r0", "9667086527574016"}, - {"evmos107lwepvq5grx2z0gzpnnx078deku6h7sa9dxrk", "4105861517177663488"}, - {"evmos107mdd04fjslpttr8dpf266ylzwcju7adl9gjfv", "709314829538832640"}, - {"evmos107newhuewe4k2zfmyqpdfzwplvvukeml3zshsl", "6145088320476555264"}, - {"evmos107ppcd25xvd4dpqr5r36hly6y895p006kf99l8", "13820773261615267840"}, - {"evmos107qel2q5lhn7hk3mevs698e9vwpykq92mqwak6", "26727301464175611904"}, - {"evmos107qtvtmcrpm9vszf4k675ljahkc603zlgj8zal", "967480672784174464"}, - {"evmos107szhk5yqd9hzgfcw8hhqcnmgpfdxk55n3nads", "92392513488967172096"}, - {"evmos107t2u8spy8qjqarktakf4k3jqkq4hpr260m4d2", "3063702074137443840"}, - {"evmos107uq6hr2n5y3tw2rpr7328lw4svtjrgtt5l0fs", "3125789225314502144"}, - {"evmos1082jzdn8whfmdf4krr6dzlq2xy777kqfjhkzuy", "564735320333022720"}, - {"evmos1083la8vqvknjgv57dxj03x3x87qvlees77gxnz", "23305779786411638784"}, - {"evmos10849vmmjte4nemjkh4vjm6wp8utdcdgfa4vkdp", "14540776973587968"}, - {"evmos1085kl2qxhxmg35mxh6ql5cvd5jwxc459mwm5lf", "370613562358398976"}, - {"evmos108a4p264c8dq767zzry92t2ehmnv770pv8muhy", "3640067191743451136"}, - {"evmos108ayshkc97vu755x6r4d9mhnljea8npx27hmlw", "2681500276075266048"}, - {"evmos108d06rdxymer5ehx8lsx5retjauplqvcjazxqa", "392679400524584192"}, - {"evmos108deadcdv8denduc88gxj7qfd4uwgm69zgql46", "5103106461376582656"}, - {"evmos108eam3f4h37wxcas7sey0k50yrng7z38r2nss7", "396061214787408384"}, - {"evmos108ewl5qxvtq6r6ug6ghgm08jjhkzwpy0xhx6g6", "1936660252502639104"}, - {"evmos108g5d78pv7rp8p0g7jj9v7qpxjfwexnc5aamcl", "437793052597647360"}, - {"evmos108jrqx9ck8eefq9cuachyn2ss3styfrpwnzj75", "3065869021121278976"}, - {"evmos108jyka7fcl47p00vhw3pqclsn2wd9uftpjfmn8", "1652843490823593984"}, - {"evmos108ng23e7lrtsex8jv20v3890xzv2wlw30q54v5", "1121831180903231360"}, - {"evmos108rwswykjpwpelh08ycdwg3kkfa26tlak8d4au", "522689270241467392"}, - {"evmos108udcjvk4286qvayspekfd6xkcg29a0sjjhlqt", "5552767429618008064"}, - {"evmos108w8x92rd0ehp3ys8e0l5q7qz4nu8saxc8tu9e", "229799922462698496"}, - {"evmos108waxlvq4dy4aym9nwdztu4kxsavmew3y4nak8", "316054690887722496"}, - {"evmos108x8h4755levyga6ua9smm3nwegwqzje80dp9h", "30360312770724859904"}, - {"evmos10904qu3v7kkc9audm2xu3aajx5ejja7rpqq605", "2298015090601361408"}, - {"evmos1090sjw5grtp76df5nh3dwxgxq88v0zlw0cydms", "13075484069238573056"}, - {"evmos1093nsch02rcd6vqp280wfwsal29pp7hg209hlk", "38165115281616297984"}, - {"evmos1094wvsvr3vr7p7m5f33wmzwpnu6hlcefw4w257", "1166751379739342336"}, - {"evmos1094x5fv94af0mn286c4guu9umvmwxq0zphkj96", "1345347048266785792"}, - {"evmos1099pt7fua5qlrv97tvvyx38shqgc2x7qdj044l", "44770182676534272"}, - {"evmos109aufx8daep40gt2zp2dkqere0gyepxrnzsz76", "5954019102147162112"}, - {"evmos109c4n7yxfw0ahxfus0ze70va3tmz4j6c86t28r", "5953283658822647808"}, - {"evmos109clh3p9qe43q2p3j370hf6mvmf4hlczts5lx2", "4616801514978365440"}, - {"evmos109d92xyw62fjt9rqyn0ww4z7hcx6qy8sprm4dd", "1458309147431149568"}, - {"evmos109eafgj8fryjgw5ff6w7990epxdu0twgt7q6xn", "23182512832731865088"}, - {"evmos109emfgn6al3djkpfjnprn33c4djma362hyfc7z", "1410513517304987648"}, - {"evmos109fnxjmtflt3l8z68mlucr33gfx8ufp6c8nyul", "4552548568233672704"}, - {"evmos109hefvfc9ldkl27y585erpnxzw2h44zt0nnyz8", "411356221965601536"}, - {"evmos109kj9qw440hgw45rnk2htjfuj0q4mvnqpe89ur", "411574690397381376"}, - {"evmos109l95k0am49slqvgx0tc6r8xyf9axufpsjf8pv", "4804413341001203712"}, - {"evmos109nqc6q8v00tuk76ulvv42kj9qgj04qm7mmqyr", "1541252239050682880"}, - {"evmos109s74hsccfelrxcqam7w2eytht8gxu3plaseyh", "47392372710409715712"}, - {"evmos109wda88lvsq6hpkyl5nsq7dq9f0ae5qjtfdvf0", "26800689763532800"}, - {"evmos109xsvcv9adndyf95ghu4d5348thufju8vcpzae", "2422802791479967744"}, - {"evmos109z97fcwhthljyvsd2fv4r09z75d8ls37a9uw3", "195190231946507264"}, - {"evmos10a3p2w8a693pm5zqt45erdx2uf55hejg5lh6jk", "47247406331062591488"}, - {"evmos10a75j4vyts9cms5p42j4qxacft47mx0ku9kxny", "469462410383462912"}, - {"evmos10a75n565ujwxvwqh2xaengxhemnds0mj3e4u9y", "6867973976694757376"}, - {"evmos10a75nvd3v4dv96vtlfyxpf9xhzvxrqau2gd4l6", "1073425179196232192"}, - {"evmos10a84769p27cqpmnx3k3mnftjdpcyav2pjtv4dc", "3952451573664939520"}, - {"evmos10a8xmujwscznxasyegk9gy6fdthr49hwr0m4f3", "2461206016039256064"}, - {"evmos10a8xxnsphtm3ez395mrr3ausw0wrl3lrpy76ek", "40266242307181453312"}, - {"evmos10a9cc7s8689gghd6tnmnttvct3pjs2kq953fny", "3918708589383816704"}, - {"evmos10a9fqx6wv7fl0zxsy93aykn77vnzame6ajl0zn", "31569862785526161408"}, - {"evmos10adue2mk6k2t0jltjn470zxjh3f82fze92fz8t", "1206879442374772224"}, - {"evmos10advm5frdp8e7nfpm60jz82q5clrmcy6t84djy", "4926675919030648832"}, - {"evmos10ajuvn4gq7gpxjd84676fv0c52pvegz30t0hlg", "3364626590972549632"}, - {"evmos10al2lf056adl59kw2m7r7mhlqm39vepqykk597", "216572393599377408"}, - {"evmos10am02d9m0drtwl7djjgza860ptmp292ts0pwp3", "40671307976339709952"}, - {"evmos10amvjsa5c37cauj582lm0pntndnw76h66yj59t", "719375245017134592"}, - {"evmos10as7a8vctwqf7dcyn5fyhxc77t3guy3nqwpcuk", "4932528876623120384"}, - {"evmos10asfawxwk5jm0gr986y8e6ag29mkdglzqlu56f", "891488248817489920"}, - {"evmos10aul336n3254wtpw2fr6p4sq7auw9lz2hcmyth", "1348749490949605888"}, - {"evmos10aw3juxywndvya7f4rzyy99v38x6hxee8k0nfh", "391008624883177472"}, - {"evmos10azhpe096w69ff9f3vsrjhl6sw6c0mm8zutxwf", "568359051015095040"}, - {"evmos10c0lqm7f4kk2wwp4vreavaxxk6r2aan734penw", "5436205371836923904"}, - {"evmos10c2603zuz3ucx4qnplp3xmzy6hz9setqal6d04", "4991742554516432896"}, - {"evmos10c3hhp62gnz8lw4hde322dl7kkpqae3qy33hs9", "1571168199833838848"}, - {"evmos10c505mc79elqrhl5t89ac2df9tt07g85ma23zr", "3821555700919645184"}, - {"evmos10c6dmmmydcp7g988f75wchvaz05ef2uwf226vf", "431677065186132992"}, - {"evmos10c9xlq222lser8mq2ffffkp5kafjga4y39rgyu", "20552930217945344"}, - {"evmos10ca47w8vll2yyxja07awwmn29g98ku3nje0j5e", "20981135046240256"}, - {"evmos10ccvfnlaheklprxjtrh8y0glekxjxj60lgxjyu", "285002746836002816"}, - {"evmos10cgmncqjlrk5cyl4h8d03c9wvey9y627vdg504", "1650333321648555008"}, - {"evmos10cgqq9pz7c5rl0m0h8a8jarfee3hgz7vq6wyug", "25445384332288000"}, - {"evmos10ck42p8w7rh2eh09hnrfp29xvq3hdjxkpdma00", "66928240351148800"}, - {"evmos10cl8e3gyf7z0mqflu0fg83h6mnuugtprd7jp8w", "11691175447826853888"}, - {"evmos10cluz2l3x3xrtv4hjvczwnf954vs2urgw934ry", "12877368607069470720"}, - {"evmos10cmjt2esph887668rqer9ezw2wxlmt92hu65c6", "16967637187926876160"}, - {"evmos10cn4xtk0m994emfkx80pwcyxwjggjx0535spqt", "1030879933763845120"}, - {"evmos10cq5ejejq3awzh9hnw9gkhpatr2qz0rhmkfq5x", "4972591321319311360"}, - {"evmos10crw44mznfe9l4ml3wedy8yntzx6ddjawl938s", "384223010796675328"}, - {"evmos10cscr38y6j8ymw7crur46vazyn09l56xcv003t", "1463880578854800384"}, - {"evmos10cv55rchqh5k568lpvnmv9djcefexvfwd4pw0d", "5571274307360320512"}, - {"evmos10cxwpleaa3tq5j85sunq6ly7dm32drdp4km3xz", "2662641574926408704"}, - {"evmos10d2eqfcqh3t8lys6al62309xafu9twks3y8upy", "367095830281877504"}, - {"evmos10d4svym3kwaz6gnjrukm07h0t60484v2rpy2e0", "270105229711634944"}, - {"evmos10d4va302xmw4aadsvwdcc8gd4dvamncr0m2e5x", "227294826202672128"}, - {"evmos10d6t4uvqddxd73rzxylu8d2f3kq3fzlwgse7tt", "2430156254228323328"}, - {"evmos10d7nfduzc5l2z7e4sdmv3scf99gfjnsndd4a44", "2698078351281274368"}, - {"evmos10daqsp02nrsthlf8g7mrweqnav5lnc7elfezjz", "8904985426016595968"}, - {"evmos10dc0kfxxf788yspayf3vds56xsa5f6qsjlltt7", "396549145694336000"}, - {"evmos10dljz4763s88fyfhunsx9ffe9vzxr0xteuzshx", "21327039003292672"}, - {"evmos10drrlv240ejjttu9ve9k20q96xjmsjsdrxrwh9", "703041091945402368"}, - {"evmos10dt66evxtf9rlt3vuua95w5s7scn0ngc4t6y2m", "1183646331213507072"}, - {"evmos10dyx6djprmafmwz5p3tnz5zm65kq03urtl87ra", "412990343525476608"}, - {"evmos10dzud405fcn0lstvqyp09esv5u9ga8t26ddehv", "318351398697532672"}, - {"evmos10e040rgwf3p6uhqx5xdlksa98x5fpry8t324ww", "1234936743629533184"}, - {"evmos10e2mwjctqmnahvuwkphatw7xedeygk8w8z5vlh", "40381161722026745856"}, - {"evmos10e439ufwp480z3j60p7pdcunyl4dur4ssujpht", "3148412705784627712"}, - {"evmos10e4k578m3mgnvcsqe6zfv93khxfyln76pq8pwg", "128038853870468096"}, - {"evmos10e587getm7vyz39qup8vr0stpg6qlv9e0xrpqx", "402774252859224576"}, - {"evmos10e7pjah3ujzmzzsaj49duusgehtm3l9la3jffe", "1926911804386605056"}, - {"evmos10e88gy8unq7mzqnn09fwpyq227rkwnre5y5lst", "10621591441238179840"}, - {"evmos10ed73fudxupg8tac3j5gef5a8dcdglv7e4lf27", "6855624604799270912"}, - {"evmos10eh4t5wrd7f0ew8lcsv8gnk72ne4a70n96uzj5", "4110678188263979008"}, - {"evmos10ejvrjpzth0avw7l0d0gt68d4cw0q9zqsagaq0", "8884654120223948800"}, - {"evmos10eke7pcvl52dg07u50u663ep94av8at589es9v", "454951925028989440"}, - {"evmos10ekfun0cp0uy70kp4vxvx2nl6826n2rge0qhgr", "9982787576566624256"}, - {"evmos10eknjntsew4vu6ms54gnv5xdeeyqhd63v39rxx", "1164361168582025984"}, - {"evmos10en9txf9rnrvd45hjeve2ms2r2ahw44sgzncc3", "546118033196093440"}, - {"evmos10epq3u3vhmgztxtprncfd6enuqskwpg8fwfm3h", "6543828536374858752"}, - {"evmos10equ4meufp53wjcgcuy602cmr5err3whcfhjz0", "7661250294981779456"}, - {"evmos10erthqkp3hdm4pqfjz48hm7hnxh7eg5jh5as8w", "2875977584115291136"}, - {"evmos10eryqjz2e0nvfjw5uf922p4tktc76esfa2nws5", "1414577917300711424"}, - {"evmos10eucfu64hcmv80xp367343k78wx7xjgnyhnj0e", "3201391564623523840"}, - {"evmos10ex7edu5z6z9dy0a5eefdqld829330fu23y2en", "14386225614137999360"}, - {"evmos10ey7hquht2c8tehenckm94a47acfgeuxcvtdg5", "385838696881603584"}, - {"evmos10ez085evy06yaqaur98vdqga3hdd2pa4uwaqns", "70970173594636460032"}, - {"evmos10ez3eldr8686gruc73f0t9zfkl29rflcth8qk5", "1869781420766247424"}, - {"evmos10f49lta36nl8zqwlrvj8efdcf4jzjefprkusy6", "806249751487817728"}, - {"evmos10f5fsd4wlf0q90pv8qlskwvrgfv6khjw3uev04", "390478030433424896"}, - {"evmos10f5wpewpjdxj75xtg47x28kckwux5zsac8cvda", "842449975058404864"}, - {"evmos10f78gnagnjpux3cnfctdnx8jmrgpwpaas7ua26", "2384925692753240576"}, - {"evmos10f8vxnrns2ry8273m9mlwj9t4td53jhf87nl7y", "7862512775138000896"}, - {"evmos10f90x9tfxunl6umfzey2emjpk8gpe4zu0h4nvk", "899394101654722560"}, - {"evmos10fa0ng6zyecfveapfksjx2mx6wvmxnk6dn5687", "369364105640019968"}, - {"evmos10fanq4v79gl3zklndl3udnljwtnhxnx9xzjm2u", "42620358804116832256"}, - {"evmos10fav7gjpc2ec3d4haw9m578kzhm0wuajercpkn", "119170075821448704"}, - {"evmos10fcapdsqgej4qyzd8wj77mdyykkc26qnt3drtf", "652702259329392640"}, - {"evmos10fcm5wnq7ukgq86mke0ck4hzehn8qgpj77wek5", "1099753115146989568"}, - {"evmos10fcpmy7gysmf9skqgny3350788r9d3ec6uwcu8", "1121992242327351296"}, - {"evmos10fd3laaph68rvgnu3khk24gd6vf2zt2nhw2h77", "7128171788405665792"}, - {"evmos10fdklzt5dq49ls6h932s23zwwr3klr2xjdc979", "7409800796079733760"}, - {"evmos10fe5dyvzjt4y8r75tcr68zerfxr7ytl966cx88", "9734971736940365824"}, - {"evmos10fq5z6rku2s8n2h9rklggvq70ly4v6re53gdc7", "9014904423741230080"}, - {"evmos10fqcxq4tu50egjt7sg6zm4glk46fxkvlxckf0y", "1146341748925607936"}, - {"evmos10fqtk04dg62dzc6pqmsa44uega274l2vp9xsps", "250077396410212352"}, - {"evmos10frth7tlgze6lzuefn3vtvyfmy3fv3ypp7kc72", "1455778341200527360"}, - {"evmos10fun4uteq0dmv3up8measekfrmujmejy3rwqzg", "31226678124039680"}, - {"evmos10fuzamn30tr0kxfq0ue2e6ege2fvvkw6rtzj4x", "367854188380512256"}, - {"evmos10fwf32kju20e5ku4cwhzqtqptsyvphzuzeqxuu", "39083926854645342208"}, - {"evmos10fwhu4gvn4zrgg7zycrm70vm7u4m53jpcyedld", "31208224003033358336"}, - {"evmos10fwxt2zxzllxtz5h0ry99jgpysf56pksfs5xug", "50572882065205149696"}, - {"evmos10fyf6pgwp628jq0scqj00h32lxsl8jnz8amaa7", "315438300013573888"}, - {"evmos10fzh07puu6a3xkha3y25mmq5cfqqxcz6ynu38p", "686122788596987904"}, - {"evmos10g3g4uycze6230vjcr7lehgqgxf2633fkd5yl6", "6764167412994265088"}, - {"evmos10g5szn3uualcwwmgkr9rhw08yhhtygymtul9d4", "1965354205660651520"}, - {"evmos10g6mp0c0lgvs8s39nllt4wdn34kzdtpdk9f7ga", "31673702148499456"}, - {"evmos10g7eaw7kgm4ecswyat0454ssw39jf29n0tp05y", "410843178628827392"}, - {"evmos10g7h29seutdymntwh672c792yz0cfg38rca77k", "855069861177893376"}, - {"evmos10g8jsfjw3zg5yvguk6j30tzuy22v04nng3zutn", "6279378189759205376"}, - {"evmos10ggdtkumxc68l3yj7gx4farnd4y6vw84mpp6ua", "1394246808903073792"}, - {"evmos10ggmk8042gz4vnr5y34gkkgpeay45fxew5kfak", "3511302911749213184"}, - {"evmos10gjktag3tgl2s5fwl6339mraqtuld3k8je2cly", "2288210061256454656"}, - {"evmos10gks3vs5hzsm7v3gz5t74ndeu6f60khc2d72lx", "8537866321330812928"}, - {"evmos10gpv53g3ju2lahfuklkk4h07xu8j68hy4tsv3g", "1174641508791345152"}, - {"evmos10gq422r4qcrjdjh8y40mxzp2e3mk6l3pz5hgzx", "247479187323975680"}, - {"evmos10gqhmx4sqpztef2559ss90ztehhvnmc5tlyz4t", "17419307571633668096"}, - {"evmos10gy8nlwf9hmpzhw0xz0kaau5pya9t0tvqf34z3", "664673571433955328"}, - {"evmos10gzcf6ha2m5cpmm5m5znsq4cxt4tmwll0pda0l", "66956729683908763648"}, - {"evmos10h0qllwvrrcsx5j5fv6gyea78ry3ufnk0un578", "239144882686856192"}, - {"evmos10h2j46gp5nru3vh2um2wzm0p4swrg8glgrxyzx", "7259887669984935936"}, - {"evmos10h3fxjh2kqj7akeepqg35c9jkqvufu0v5syrnj", "8071817804364363776"}, - {"evmos10h3lq4lanwkpgupactt9r6g3m3mztyz3g9u8n8", "11405341671702073344"}, - {"evmos10h59rrxlh0gychdl9h3ngxu3y9py3w0fg6n3a6", "869389475478804992"}, - {"evmos10h5c2q59auq3752qv8kfvxqxay8972txplgh34", "4630548533517713408"}, - {"evmos10h6cyfkgndjnsmxhmcuuqv5jme4yuztt7cv67p", "412907307774071296"}, - {"evmos10h6p37ufze2tednhza4fl4f8hal8eeam4r9kln", "2354052441595558912"}, - {"evmos10haz643wfaq60s3fqqrxl3krap45qwssyy6wem", "10096920860319772672"}, - {"evmos10hdle8jp0u6wf953r6ntutsejrxldjur4yqj0x", "4461517948885401600"}, - {"evmos10hf5le85akfv267saggrewve33dqcrd82wraen", "299463328430984192"}, - {"evmos10hgy6dcq54lfc4nlvh7c5ec2p783x5escqlh3k", "4976930132433257472"}, - {"evmos10hh30c2z2xg63g72rhyaq9q9flde44gxy9ee6g", "18182180968284160"}, - {"evmos10hk2ls5czmndxmmlspkcvx7x09dkm0xctx03hr", "35776716827051089920"}, - {"evmos10hqew4t790y0nuhev6qhsqv800txa5e8mcxe3k", "39817520460986302464"}, - {"evmos10hqz4vvcqs2n257e94nm4mrj8xc0t3ezqyf7up", "227919984604594176"}, - {"evmos10hrflcxed9ykg0r38anehmgry4xgfzmgpfwlu9", "496505582201961984"}, - {"evmos10hsgjhxdqvmwn7dd0l5r4hntgtwdrdzgrs57zz", "67271386451846201344"}, - {"evmos10hu6j2jfxuvhv89323qqny5zuhhhv4kfhsgtvr", "195076119879565312"}, - {"evmos10hyd57htgu940e3qpjtzkdgaheg28yn9lphr67", "879781467403813376"}, - {"evmos10j2slhna6fh7gzykmyacld6n9wxwt3zar7ngwh", "2084169814249234432"}, - {"evmos10j2z9rj3mdlnaf73s4spkctsflhmyqmxg0ps9p", "40811769884378136576"}, - {"evmos10j56uw3ld0pnsv23gcjl3396cfg3529dynnn0v", "1287459708747529216"}, - {"evmos10j5jjnhtkccf3uta2zdla2452fjhhyeqvh9fl2", "5837970078411843584"}, - {"evmos10j5jz2emjeqde05xd7rtscq7t04kvejgjdqxsz", "1323827873282191360"}, - {"evmos10j5u7aup6kcaj4sxzw96k7yj83wqe3tuch4ay7", "1584989050831570944"}, - {"evmos10jagfhkmklwzwqgp90rvc4mkn5f6gdr6hss4qe", "13971818513952534528"}, - {"evmos10je03pwcyr2vga5j2p0zasmq20a3rv4mgaaxjc", "2309374663876195328"}, - {"evmos10je6kx57q3ux469rhpk26xc6qtkhpjxlw5280t", "10201201221547102208"}, - {"evmos10jej9uec43s5jnujpaskcz84rf0rmkrqns7nfq", "3604480206825924608"}, - {"evmos10jgxhdpz94q5dvcnel92gjuqf692ss38jx63ez", "549170107706155008"}, - {"evmos10jhfkanss3fdufuxaatds57km4j3vv45x5qpz2", "49240385768794996736"}, - {"evmos10jhpktsnl4zggphchdc409u6x6thtfgzwd4eau", "22782244235657109504"}, - {"evmos10jhqtgfvjfsyduqztnep57fq2g0979nugcamds", "103840476151638392832"}, - {"evmos10jk4sctvt2zccmmhy2wfa9gz7j35qqmcqjgmfl", "237188833674252288"}, - {"evmos10jlatflpgepkpt3vm4vt49txfvenmh3drmkm5a", "844456452448804864"}, - {"evmos10jp90j6fwynck2zhs3wn27cs3fhgugex2t3r39", "1561219280348979456"}, - {"evmos10jr0mpees733lnp9vw3zptr8tzks9l83tu0lqy", "376628228352488960"}, - {"evmos10jrmttt9uaz4gfppv8y4vl6wyphvr7g5j3d2xd", "3297924127790612480"}, - {"evmos10jtjrfujpzxdgm6zdqp6jjpmzvuaxpew0cutph", "7603542627844455424"}, - {"evmos10jxr0cq9agqy3rnwd2qlrh3t09cs4kwhuyprfq", "1366005131803244544"}, - {"evmos10k3cfa4p6uck5taplushhvr566qjzdyvnk6dua", "44378165356242688"}, - {"evmos10k3n9zc5tr4clff320menfguth2ywgyqwcprdy", "2166056403134939136"}, - {"evmos10k4724rhh6jxjwakscwak6pm8frfsf8gd6csz7", "991695680112638976"}, - {"evmos10k6ptr39y04uvmhthdepgefffzdj8vl7jnje6d", "1310188339131773184"}, - {"evmos10k7gzcn7n3dk5atatjuymtc5ld37k9lgtmd6zx", "9749435681890439168"}, - {"evmos10k9lrrruap9nu96mxwwye2f6a5wazeh33kq67z", "526327075874043904"}, - {"evmos10k9r4c3y60wedwd48sg256wxdj7ln38jdw4w7n", "17445910997336981504"}, - {"evmos10ke92hkpln2d3mrt005pl5tmz9vgdtk9fxfaur", "6135048679968372736"}, - {"evmos10kettz0j007k5x95xhjfw09a6d94cw3lf9jz7p", "50702255928073846784"}, - {"evmos10kfvlxsk4x827e0ulr5u2ssvwjxekrz4v0tvxl", "461775535029682944"}, - {"evmos10kggwrsq06sh0y9t4lyg7wqm4e0jratzdt6m62", "473860412932043520"}, - {"evmos10kgmql2tsg8glv9c7r0xvppu3frvze4y7hdeh3", "2880524649160091648"}, - {"evmos10kjjttn79hkex2vsws5pr6uqd3a56rl7dpdz62", "4723490061933451264"}, - {"evmos10kk788u6lfdv24jqr6g5f28m9e9w0kkwyfg00k", "844731258256384000"}, - {"evmos10knuatfmm79mxaxfcggtzmzrmkddsrzx64lun3", "416909436096430080"}, - {"evmos10kpdum2ys03shynrmlmpy3t4kj9705daj46jta", "441932883666591232"}, - {"evmos10kqnrv3vd0hhagthtqhyufjvxhzwxqvktucz5e", "2082331516977094656"}, - {"evmos10kwv4vlr9g8c2ftu4rplakjdyvlvwu6rntdyus", "1290308373327849984"}, - {"evmos10kz99a7fzgd43p8r5mch428e6566s6jq6ry98q", "11337170892230625280"}, - {"evmos10kzr93382tsz8anay83hlc3vsrp4plcuvw32yd", "34611213173214552064"}, - {"evmos10l0hmzq7qnq8qrnn858z75hdvm575psjla85l9", "465912686601618944"}, - {"evmos10l47lal4j00a9j0zguj8gwhhthu0350mfstsee", "408372361658081280"}, - {"evmos10lays09j0xhyg8zg4n3ays7hc4ynk7d84cteq6", "1116208738501395712"}, - {"evmos10lctj9vsajp7d39zj8zqhfs0x48083t5wzewh4", "5804367386760716288"}, - {"evmos10ldex0tnug78vk28x783k4z0huv6qmd332wsz5", "5866113683497725952"}, - {"evmos10lfkahmqgek2z27utv8jjgq9jp9t4hcafwaz9a", "7271717024623570944"}, - {"evmos10lhdpmkacd6kylqt9nvz2pfy6wtphsfz99r9tv", "2559292475392989184"}, - {"evmos10lk0pg5sx0j3pam9nazx2h64qtk4utuf6re6vz", "18048430268379435008"}, - {"evmos10lmclft26dr9hd9t0n0pyw8me8y8um8jdggxz5", "16219077253996236800"}, - {"evmos10lmu3f9hffw6d6x34rgej8v63j7kcse4tsddcc", "530404434168824832"}, - {"evmos10lnmzc0pw968ve74tdy9fzzhj5k2xmqwj7zyk6", "315279557674451456"}, - {"evmos10lpyjskayzrhvjjc9qvlk6axkrtz33v5y09swz", "741835615014823680"}, - {"evmos10lr6z965ale0hkhqa9xn05alg2xgaeh7da2z3v", "13548710786321920"}, - {"evmos10lxuly278hdd2zapyjds4w942nhwx73gcyt99t", "22874306102204198912"}, - {"evmos10m02v38jyhqd9lucqtwuuzdmtafljfplgf3dza", "1007728572172505344"}, - {"evmos10m2nasz9lar44vgdk39d5arzhz9uqu7tzr9rct", "410969468858650112"}, - {"evmos10m2q8a5ug6uz93df88ylg2tt9pnwxltmcar853", "384314424118280448"}, - {"evmos10m4yp3hmqjz5rdsvpu5xh8tm4n2lrs7fzxyx5h", "15100149068049797120"}, - {"evmos10m5a4glhsdcfqq4hx25da96ad8zl7f3p0d0w26", "9469080738903482368"}, - {"evmos10m5z7zpwalskkegeg7jrggywz6t3weercq6jqf", "4809841037888688128"}, - {"evmos10m7204fvy82t082ymarlh7ejrf25ase4pm0rzx", "1405956381498171392"}, - {"evmos10m7qmcymsefxtrqnyqyjdjy0jssftehkleg84w", "5186556073265758208"}, - {"evmos10m7y0tu84hwu9agrw0etyasnd7v82u4w8ewxcr", "4001517933304970752"}, - {"evmos10m7y8q3ryvczag63cfrt3l8az5rr4ga72rgfn0", "11466437093212401664"}, - {"evmos10m8q7efsdd6cg8y84qy6cvnzdxfx4hjqmwzpzd", "1626999032143098624"}, - {"evmos10mawdjmcys9v3akzfrwqfs357t4gxvlvfpvr2v", "962745267433023488"}, - {"evmos10mew343z8n66awnsxhrzwf2xrclaw886fl76yv", "8174903591754188800"}, - {"evmos10mf88gmp66a3dqelpetrcvf7yptnsyf0ae7xsr", "9086130908254101504"}, - {"evmos10mhqfts28p6z6v7kjds7wrr3rqtp6e44nnazn2", "4699130660483674112"}, - {"evmos10mjj8asa84jvcznxsqadhaasd2jhrtmcvwesmz", "1453694552900665344"}, - {"evmos10mjk054vth9ycs3zs80trc3nf2q9hfkpr77483", "2584395031435567104"}, - {"evmos10mk73d4zu4f7jpjlk8lfajtffm6pepxf85vxxn", "4302175798374224896"}, - {"evmos10ml40e0460ysu4laueen2w6yqegquranmemm2j", "3282605135326580736"}, - {"evmos10mlgu98vljel7dyj2w5eyk5grz5vu4yqv4yjsa", "793471264232420352"}, - {"evmos10mmazyd0lsqf67sz4wxxh9w52866tdewzg8svl", "17254600340606496768"}, - {"evmos10mmgp2h45c372c9qfn3l59cxepdne04r7n7pan", "230318782354155520"}, - {"evmos10mn2a2vca0ek7n4gpe35hjedd4mdzself4gjjg", "1573933005151576064"}, - {"evmos10mtxdxrnjyuur20fghpynh8lvscu9hx0nxpcr9", "3131317049484032000"}, - {"evmos10mvxdcdg2dkna8tvy0v0c57r304n7lp6rthrnn", "2908608908541591552"}, - {"evmos10mwacl5ag560frvu6vslr6qn6yse6etj558c8l", "24005247018546393088"}, - {"evmos10mx50te3q5q0vwzgflrvlyq0rg02eq4pd9tzld", "32328887520782213120"}, - {"evmos10mxrgd9zrpmzpq9jxxg9mlntn093rm3ea7sqj6", "15825487510966784"}, - {"evmos10mz5q58p8m35j26wdt952vx2vd8gkqt6vcff5n", "6981139857013116928"}, - {"evmos10n060h7pce6ekkuf8g4tuswszrua67d8f5z8cf", "5100985005314455552"}, - {"evmos10n0fanhcffgpy5n4gx7ne8at9de9jmk07stcmc", "175931209849428480"}, - {"evmos10n0j3fr3vf32ge5k8zaadt4z034c8ucsecgxga", "1085960154811089152"}, - {"evmos10n32y8mqvujnxzvvnj7gpm8hge055mnqxuqkju", "18489888136230125568"}, - {"evmos10n3hysc6m2xj5vgt8exsnxd4rafs2u6whhva75", "1390804632967113216"}, - {"evmos10n5kj7wgy78vtq3s6w6dsn5hq8kt6lcwqqk547", "522689270241467392"}, - {"evmos10n5rumfvlqp5unjl0lv60464zg7s6q6cmawu2g", "857918516591199744"}, - {"evmos10napmlyr6d56j8r83ddx84nwqrvcjrqlcren3z", "651665713442156032"}, - {"evmos10ncp5t0xu8fl87zj0s2n25xmq5y05qnyjx9w7d", "976952957918533632"}, - {"evmos10nd748r76tks63du9au4hv4m0twkar4lazj8r3", "3076887099719788544"}, - {"evmos10nd87f30mfl0dnxytcd4lrfxgzml9tf4guqqsc", "13925462884871102464"}, - {"evmos10nd8k6jltx2n2g7pttlsant39fqkt8rsfywkzu", "83683259855031296"}, - {"evmos10nf4klecfxhrshf8qk5vhq9dhwzmx789657lv3", "1264752230608621312"}, - {"evmos10nfrzx5eavn05yn6r2xzk2dt3xvjwpj026635e", "387055995541681152"}, - {"evmos10ngmnyrd2qaxc385f6yr20zuxcv43hya82q8ra", "18071631612024817664"}, - {"evmos10ngwpqyfqaytgpgah89wj6crf02ex8d7gj3u9e", "18113855170666819584"}, - {"evmos10nlj43gajtx9ayxl4zlttx34xg3rwx2yg8g5gf", "1390209843038779392"}, - {"evmos10nmmd2ymzwchey3s8d3u9qtda9exmeydjsatqr", "22876530485414346752"}, - {"evmos10nmycg4l2ta23zktk6z7fk6h9rkxvzhlvxd4rf", "287360506148711168"}, - {"evmos10nn3y6gfn2ha3auj3ydevqv6x53nsjydd09e8t", "1163403492040950016"}, - {"evmos10nujulzrauuswzke9dhuyc6kwh6mry7zhqndst", "1719090645422366720"}, - {"evmos10nv6yk4p77ap4gl03l6qpkswrp6q59k7ns2cgh", "1085895297624113152"}, - {"evmos10nvyx8rv7danj22yk3lshlcwk24mdhuzhaycr4", "11351179043179655168"}, - {"evmos10nxk94zuwufpu3mzyvq8f2f5wewlfqj08zy86v", "11878437315057213440"}, - {"evmos10ny0ll2azeylexfu847tf2a8lj5vzxfttluah4", "4400339685776954880"}, - {"evmos10nyj0a990k7ces5l9jmje93w7hzmpakz8k820y", "5399471886730358784"}, - {"evmos10nzzw9306rzgnmq3g62ktpj7aa7qxtuapxuftg", "23095972571040886784"}, - {"evmos10p2c9z5mklwn2a90gxyt5h6hy9g0ps83p38atv", "1639331796709542912"}, - {"evmos10p3r2zhfu45y5zx4aysyzuysn8qeleg7q7nmlg", "857492351209308160"}, - {"evmos10p53ytvxekgru2u6ldk08mc6cg2q9xaxnk74hx", "2370809061424044032"}, - {"evmos10p9jhafq3cv3cx3f9zyay3slvf6g9tpw5h6357", "2863118664015526912"}, - {"evmos10pa5kll7lrka4420xygrnt85cdh7e9vnxshyz4", "557761733071503360"}, - {"evmos10paav59f46uq6augnp6l4wcfj33j0syna4j02j", "1447175236845355008"}, - {"evmos10pf9hhjzeu3nuattjde9gp6r4a3drkngzvhudn", "53892749209633234944"}, - {"evmos10pfx0nn2g8dpjs76vp2wvxwcdphzucknak0aj2", "14429794632766582784"}, - {"evmos10pgqjxsm79hsvnqyslm8ndky6hqp9snnxyv4ha", "1627086527799162880"}, - {"evmos10pgx06uhc0u8l8taj8l9czah3vgthae84d3f33", "16800809501107113984"}, - {"evmos10phk8vyfv9heza0qa0jcqewmamna8t30wck3dw", "3683777865719846912"}, - {"evmos10pkf0lcf49t30pjxj92ah87ny5e9jezcpascsn", "68338869442454593536"}, - {"evmos10pl620075jyz5ud0z04spyz33vzyl7py5g59qh", "943094080436148736"}, - {"evmos10pm4t455pydnj864n5ukyega8ldjzwlmzh0hm5", "12332787953671925760"}, - {"evmos10ppnrykjkv3kvqq25raj4yljlfms6gsketrx3h", "530469425840520192"}, - {"evmos10ps4ueumya5s9gpx6apukf77yg6udn37fnszm8", "2808155000870437888"}, - {"evmos10psgsyaxxrynpl64gsees4l5s0suqdt7rkakyr", "2572373486744702976"}, - {"evmos10psr9x0uxk9ld3xz2alqttg4vsyzzkz5g0zpjy", "666530153013028864"}, - {"evmos10purlehn408kda3hmf77vqt99f9qu807gx222j", "734784511759156224"}, - {"evmos10pvmmgv4zhg5djal3em9n4aj2ahzev7t5uvanq", "1433734495331239168"}, - {"evmos10pzs4ptng7sst9dtjgs55e7j4sawc430g3jcqh", "1971179613050467328"}, - {"evmos10q0y59mx5708wsm0n9as5emht38shvfp7kczgx", "2712470729426196992"}, - {"evmos10q0yn3wqdvt9kt0x6gcd34nlx6xqge43pvvml0", "1373204561652705280"}, - {"evmos10q3ze3l6l7uhwp53546gj6h8h8gm3f5zy5c5tz", "3202800386835313152"}, - {"evmos10q5z0mn87qmyvjnxhwjy246h6mepd26mqrsupy", "1281879346171457536"}, - {"evmos10q60h6gjxmtlu0ayv9pslaypsl5npxhgwz7vxu", "641196863243332096"}, - {"evmos10q6p7wrqvc2qeuh7tv8ngd7dx92vr5n9f47mfd", "654569575022045696"}, - {"evmos10q7nwpakan3nyvtuzyzw2lx2q2h7r06hjx4f4l", "608354339714449664"}, - {"evmos10qdajk6lj898svzupuyk7wxwprwg285d9j342q", "1026628820605248512"}, - {"evmos10qe7yfh8waflfk43ss0e2u9eamda9lmwc7fx6r", "150908064385612447744"}, - {"evmos10qfrpx6p9d27pdwsvjrqdgec6t3zjk6lrtef8z", "4534345006126579712"}, - {"evmos10qjhnahyjrgr95fdlcemu2tfa0adczwamve70v", "41176825798232612864"}, - {"evmos10qjm93lvcfgcs0j23dc790taryuu3w662uhx5r", "3994912589138378752"}, - {"evmos10qkulhcxthl5aq907wx67m04dg2qrq05q54taz", "19180285122362368000"}, - {"evmos10qnw5hsp9dg3h3dm38tsh2fde5rnxg63xc2kns", "167089920665395200"}, - {"evmos10qs06t9qej46swek8x3d2dp4wwme3xrrp27c58", "72069555666819584"}, - {"evmos10qt6tgh44wcz94p3stnpcku62yawqlxzgauu8h", "63351626369515388928"}, - {"evmos10qwdslwx7drxk62yq45tplh9erlt9dlc5a60dj", "1298547666620190720"}, - {"evmos10qxr76fwng7jm55qrfwkywj0sy6nxsk5aalw0n", "3992181967089037312"}, - {"evmos10qzr964a5mmak46zzjwnj9tqt7gynl3lvv0u5q", "87800818155885920256"}, - {"evmos10r0twcy6unyts63ad0llg97cwn9wxxmp54qlww", "1328577080899620864"}, - {"evmos10r4gcpcs9xvsx44yrzlajue2j49c8luy6lrf4x", "473581056259180288"}, - {"evmos10r5a5x6yzvj83aw2gaxn99ggcafyrl5ap0eulf", "9771175169338382336"}, - {"evmos10r88j66tzvwc5qat0mnv46rzm8y6d4hxepugrc", "96456216666409216"}, - {"evmos10r8pxhx4fclqdztjvnh87tww96zszzc0nqmckn", "922088757866733568"}, - {"evmos10rcdz860j74s7qxc4w3k23vwnkaacefa2e5ufx", "1064816698608512256"}, - {"evmos10resdcg3yz3an4ltlfkcqpury5yplephfgtzy0", "15257722460114395136"}, - {"evmos10rey5g6gdsqt762x55lkpwcpelrmwtt32xcmuf", "111776722387513753600"}, - {"evmos10rhv5me0wpzjxs7gvvqeyd6enfqp6gv35rhlaw", "7022895745141538816"}, - {"evmos10rjs5fc3f42n33zvl6uttvwkjz2yrvcp4s5jgm", "17645793677569228800"}, - {"evmos10rlvxgchu5jdj57mvwuvnhs0rad3xxuaujl84f", "1765939838161659904"}, - {"evmos10rnfpfdny3e6wjsfphnvrxn77785ql3qaplagg", "669095473243991808"}, - {"evmos10rpx0p57tzyz8ak3vc8tum3gdhhzjlc2p36gte", "430316934383854848"}, - {"evmos10rqky2932ws0gcn9lq3hf443yvlvkmh4xmwj5d", "8143745897671098368"}, - {"evmos10rs5944nrcjagj9g7fxrzqap8q4vgm0khz6jph", "5196669896866336768"}, - {"evmos10ru0vvp7n5p02yxyadejftnezgdpwwxz3sa8a9", "1233414223823290368"}, - {"evmos10rwu8433mh26ysxasyv0we9pnrnpswsry69p49", "1044142534624431616"}, - {"evmos10rwxyzv0mcywyzktvn94l5k2fzjnzefhpjdtsk", "3802940940013690880"}, - {"evmos10rxtk4mdnlfwarzdyxvmgflermup5tnm4l6v38", "2317653616299100160"}, - {"evmos10ry5d6qfdntnc3gxq38mv0cc9kf78mxrejm224", "7719809164964823040"}, - {"evmos10s0ldz0uquqd42zttp88jy7zhsq7amq8czvpt3", "4232815996635701248"}, - {"evmos10s3eh0l6asyren5a8va9wzywwy29594cn5swsa", "1190489703670436864"}, - {"evmos10s3urh4yqsxyt4k5zwxzrj5rjk6r7k6wyy0tjk", "37443268584815738880"}, - {"evmos10s44xvy5ma5japfzm5l5qzhl5ylf3gp8fuh7as", "1306426243561750528"}, - {"evmos10s6j0c8wrr65zqnfpsmhafg8qdtmcyzss799zf", "9672020833159591936"}, - {"evmos10s70y5gg529lwrdu22kj5yjl3ajv4kgv3cmzmf", "2537916327257895936"}, - {"evmos10s7zu5mm9zn9z42zerrlhgx5tveda54evakkwl", "98014928301069824"}, - {"evmos10s9ljv3m57s79rc3rdqw3hm4yrkzyuzdqu7ks3", "2890174734683767808"}, - {"evmos10sd0v2drwh4ldds3rtjq7ncaanfkm25rrdkqpw", "812637160464827136"}, - {"evmos10sfff43n330sv8x9td5g6a77uccy76parkt6t0", "5314434080033983488"}, - {"evmos10sh47v5ah3f0c5euzcyuwpvrk8jv6x3fp28c7a", "385790795181429504"}, - {"evmos10smajj32kjnad2a3muva80nvvc5m24xt8v40l3", "744681077550589952"}, - {"evmos10ss7dnx2r3n6wrvekp8j2qhtql3lpp4ap6ufpv", "2069492295992160256"}, - {"evmos10ssnwskluzusc4m3y4f7rkk5hfhd89n6uuqkkj", "1114992700785803264"}, - {"evmos10stvqgsy3vj3gfyzeur2exqxg5nnj55s0m233d", "406647964560302848"}, - {"evmos10sy50ns5avy3503cmxkypmdha750ece93y3nwt", "8224419741838589952"}, - {"evmos10t25tlfzzp76gxcxggjjhy3fzlqm0tvxr6t7m6", "97307512349406464"}, - {"evmos10t3nfnagzcutgrxpccl8nj43rkepdceg4ns5d3", "7386594918382497792"}, - {"evmos10t5dey5dtwr8tanz8ntm4khszju7zc99jyufvj", "435852359929606912"}, - {"evmos10t5wwpfp0hgjd4jtt8llvsahsdnldxvmj5guaw", "45721076516238417920"}, - {"evmos10t6fsnr9n0dt5zvtkylt4n8j4dt64mptjz242d", "22834659962108522496"}, - {"evmos10t7ugl942ckknl6xz82nss4qtnczs07wpum4r4", "934903308346493696"}, - {"evmos10t8ppuywlfzajr88cg5gtg5ng6jv4hfeu0me56", "9514848779870527488"}, - {"evmos10t8wd9hzze0r83tcmz2ke084whjavvw3j5rhjv", "9135182797946273792"}, - {"evmos10t9q8j5qm3nzvew7n497kj5udjdw2uacee9fel", "15698513190626541568"}, - {"evmos10tan3zw8j9lhl5axzmxujrcjthpwk0lu5vy42c", "4809566444594338816"}, - {"evmos10td0f23kwwd6ntmqcwt354vywf7spaur65504n", "2653968860464923648"}, - {"evmos10telv5jhmhn0h2e3ylvzxzz5mh4tyx4gwwdqx2", "8724684499217472512"}, - {"evmos10tg7a77xe0459x4dc4ukj2pv35rz20nnxw8fvy", "3251888858539982848"}, - {"evmos10tgtjlfnr7tm6w46ft4r8ev4uxkar8kvc23vt4", "432242116934531328"}, - {"evmos10tk53vck4yad753qu7wrztk7e624ursqrrs4fk", "55555692343312384"}, - {"evmos10tkttjt63zhpq4gensh4t2t3d7ta5ntux00uxk", "932325312308364800"}, - {"evmos10tl9j7hjy943ew57c7zq4uamauhwwwav8nm0te", "135728855975639695360"}, - {"evmos10tm08wr6tpssaw6ea9peq957ppsl8r8nnpmj6r", "384416590566471936"}, - {"evmos10tnrkezhc8asm643w9y9vwdpkudglusssz9rvz", "387266234148145664"}, - {"evmos10trn0v2tjfh4lwlm00apml9szeva583rwd9yj9", "14661789460724189184"}, - {"evmos10tthlr3pfsqmml04wch7jw4jnvpks0yl7zvefw", "1465424796791805952"}, - {"evmos10ttz0qresazc0474dvv94en02j59wec2c6za9x", "1588949660259240448"}, - {"evmos10tux2pgg7ppcqn27jnd5s8yweu48zd2sxtey8w", "10209361556516153344"}, - {"evmos10ty0ptm3fy3epwq06q8hw8crjk3k668aes4tca", "10431855472296894464"}, - {"evmos10tz7yzlnrjd7fk4zfk79gwfvylh2cmnd6cezp0", "8224152801545109504"}, - {"evmos10u0c7zcmzx0waj69v9ccg8ruy980yyhzynaw3d", "1105710311193184768"}, - {"evmos10u0gg52zftny6l3lllgvspa49lj58h6du47wt9", "27102753669424181248"}, - {"evmos10u3kum6lmu4xfunyhwsvq7yaga2fh6gvejmh2d", "1728445202369890048"}, - {"evmos10u808pw9gmsqmmdqct0rk3had985qruc25w8ka", "5149892322673837056"}, - {"evmos10u8zjv0thkse3yae8yg46e8y3zvulmmau6yyqh", "2988990061894006784"}, - {"evmos10u9cdx66qt4yvk2p74p56gx4kxl0d6t924sgk3", "1597397610005500416"}, - {"evmos10ua78hqs4t7dravy8dyycvanp67l59xh4yqyvj", "8954135448231933952"}, - {"evmos10ucwkqnccdfawr9kyk6hgtp6qajaa53hw6vrza", "8664884447884845056"}, - {"evmos10ufxpdgu0802es4zwt97rgjxnkuzz0xjqvy5xn", "787290661212628480"}, - {"evmos10uhnwacts0yn9wkhtenfj4l68zaks75m0552lc", "674402560516899840"}, - {"evmos10uht7cy3ffpm7sc7jwzgtfud490e54aksxcvk9", "385008502556207104"}, - {"evmos10un3q0h2nyklj0xddmv09asg9sqyzseh025exa", "631734493742850048"}, - {"evmos10una9lhfkuclmnw8v9jwmtmht4avz89vtje9ch", "101130018556644294656"}, - {"evmos10uprrkuvumfhtuum8trv7lyn8ul7jlf2vvjlx4", "3408893289134791168"}, - {"evmos10uqanv38tylqxwlc6m7gde356fa2s4tg325mlm", "1035122938832021504"}, - {"evmos10urk5eun3l2fg9swktd55jnn0pk237dljnsw90", "3148578809213559808"}, - {"evmos10uzvr6n7vrevvgy5340jq89z8574f5gd2x3ku3", "16250914503185823744"}, - {"evmos10v08cxs6zaywyanhanha3wkleddn5de4padyez", "23357439857751040"}, - {"evmos10v0j60n8pgf7cj76ulagd9kha66hsxyejq3399", "670995583398412416"}, - {"evmos10v0pu5dcd82uxzvrz3cgysl7dfcwpdemsjzt2x", "884418440126308992"}, - {"evmos10v77w6n6kp4psj6xpgunjtwapckwa4prl4f5ya", "13182707156598847488"}, - {"evmos10va2g3fvvnfp32w6rn598c2v3td257p6emk6j9", "4280192906742519808"}, - {"evmos10vds2khuswqm9dgdc2ecy930576ng66ea2jgal", "5378393282543517696"}, - {"evmos10ve9w6gjfn8xgfm7h66dd77wv5nkszd7ys434l", "4387094993327641088"}, - {"evmos10vfc87ldt2hk08s3tmyxq6x0gz76agl8crcupw", "2473741927270459392"}, - {"evmos10vg3n6lly0yj5we7wunfs9jdl0yas4q7kapvdt", "2632655775756375040"}, - {"evmos10vk80cf63qypqpxsga9znupn8zeq7cjecpe54g", "29186602460666478592"}, - {"evmos10vl2xqquh7celec5yatczyzkdqxqvgg5u7ncc4", "70407791862570240"}, - {"evmos10vm53xzysq644v5k3zrjuu92cadyndr2558j32", "147479110689914880"}, - {"evmos10vmgxxy6stn86xeq5dsfy2c8jm3ttlhh3hgtnv", "369030944559698432"}, - {"evmos10vmsl6r5mpwlnswrtcfv6ktxrqlgtdvqkmpfec", "234358852841570816"}, - {"evmos10vmutzvqdqchnl5yr7djvva69lnmel6wfhx8ef", "6862433912380268544"}, - {"evmos10vnmvjydmqn72zadc6m5slnpdzk7px9cvf8ekn", "13924572443308457984"}, - {"evmos10vqs2dzgg53j7xgsq3cuyn9ycvswhuhq8kp3js", "4924690855452620800"}, - {"evmos10vrh4d923qnjztvkxezlnkzurl7uka6qa60qzf", "369392083469941504"}, - {"evmos10vsuvyr35xhg8rmldedhdw3c049ce6gcvlwhrf", "23121396516106063872"}, - {"evmos10vwwhwzz7x5w9h0lvrzq8zs37gv90x9xpm7gpq", "473154538099421696"}, - {"evmos10vy8qpkmdprsw8tx99ahprk9yf08vqznpfr4gk", "2391772093767778304"}, - {"evmos10vzlu9skw3cfhc2ycfr9vhmy63kz6jxc3ujp09", "205948589522409728"}, - {"evmos10w24xp0584zukw8eg9kj43unya8f0ypanmfm2u", "1364515477796052992"}, - {"evmos10w2ey4dx78s8508e5aladmrzspjw8u740zfs2d", "1324771502001726464"}, - {"evmos10w60klh9khsrycj7dzz9ml2we7xtxxfysfy7gc", "1259062411005803008"}, - {"evmos10w6v3xrwzam8kkvrphpkpz9mr8zew4yzsdvgq0", "460574666062286848"}, - {"evmos10wal3kt3rj73egtjx429w7x55lqvf0lawpd5nf", "111475078503795982336"}, - {"evmos10wayn0qv75cc8f4enf3hwnc20882z9uzjyclrd", "1518834879448588288"}, - {"evmos10wdgpu74zdcql4asyac3emmpfgm60c8l8ypqxt", "1930171505843847168"}, - {"evmos10wggrwwjjysceuxdjrfc30kt4mfandygqdw6xu", "1101126617520663552"}, - {"evmos10whcglxfqqqvcucqx8exe27asklxt3kqmp08r2", "403255689449200640"}, - {"evmos10wjs5ywzkun2hd95l9zmqns3cxfv68fa5ddkaf", "1161756429032953344"}, - {"evmos10wlna46nrnrnumk5ssqmkau9fvffhz0wyajl4z", "145674811546048331776"}, - {"evmos10wmylcks2th6rn9sa35pkkvzqvydrxl9dvyfgq", "6671618779705227264"}, - {"evmos10x0jwf6gg6426nhr94ldjltly2se2c2kdhm8cx", "2453444494143823872"}, - {"evmos10x2lzmpvyxzqhw2zxjpth5ldrpnelv60n5klrm", "85315670670437120"}, - {"evmos10x4g6x03e3vrfpdvpx6jx9efcr0cq3e334dw9j", "886525297256441344"}, - {"evmos10x9u8p8zp4w3dxr6qay8l354np03wsk9qlyeh4", "5410143637971980288"}, - {"evmos10xanghrdjuema2tgfn408n6rwavagxcm4r2zlh", "4910291280271495168"}, - {"evmos10xc0zzlczq5xs7rt4a873em9ns5tpcz3pctqkx", "679524414699067392"}, - {"evmos10xeassrkskhe790a6u5t85jsj3da72wykuccyy", "2570276023477178368"}, - {"evmos10xhmzanm6cn0cwvteljgm7vzmt75jgs33g4ec0", "9256275618035316736"}, - {"evmos10xjhsq9u5gus0an3lj5cyms4g9kx52h2w32zse", "409537775061217536"}, - {"evmos10xkqcwc8wcumnyhek7vjqxwcnzryjmfkfldryj", "5521590007852752896"}, - {"evmos10xl0y0xycc3du56nhlk3xy34a6ep2p3jk64mv7", "15000326212956411904"}, - {"evmos10xljyhal6s8h3vv83fk3amqmkq7lj2ht2seduh", "9517613091898478592"}, - {"evmos10xmj8ny8zsj3fgeuguh9sq4zvjva4n74zpdp5c", "3072215336308341760"}, - {"evmos10xngq7hjfs94em0keau4mg6aaxp09k3qgxme7j", "582111368882731008"}, - {"evmos10xnmc2uxj2jvwcjwuuz9mrzr4uls6hd63etr78", "79166516568218632192"}, - {"evmos10xpn9uw9wlz7ga8xvv0tfx0u2vr9t5kuwezggu", "107035806765460992"}, - {"evmos10xpnuhnltd5d89dpg8yudeq4m628e4l636szs5", "33366087515894927360"}, - {"evmos10xpuvlgdpjr59cdkphsyezq0c3g2pfy49e6y27", "9169971568316932096"}, - {"evmos10xqjr0hhrkhulu7sgmjv9xynva05a4gr9gg75d", "310290611753443328"}, - {"evmos10xqml9vhcfhrky6y5phngcaxzu6pcsjp4lghm4", "413374859794925824"}, - {"evmos10xrn4xpc2xmhwk2z7zchsuf2egeyftdq4s5n4g", "32078632016238223360"}, - {"evmos10xvhkpe2gu52mrkmurxwz0pygws7nw929rv2pw", "840399460751879680"}, - {"evmos10xy7ws0qskdcc3j82sjvrf9ft4lerm4r6m0vlh", "9241129683193233408"}, - {"evmos10y2kwcn8kllvyhdaxn99sqlljmnuqw4ndyq8qq", "3568909059227238400"}, - {"evmos10y2tru6nnd42pxqj6ypxa8q3an207m03770vc0", "2689755901944551424"}, - {"evmos10yeslcg9vj9spuynk2wj0te7du5kdqa72gxlzt", "1463162125620380160"}, - {"evmos10yfnz7fscudkxuxw68xvmrdkuljd5f9m4dunp2", "390036404602220800"}, - {"evmos10ygj9nv6f0a233e4rq5vzdsmtepvn9lmvtzjxa", "1775179299596091392"}, - {"evmos10ygl4r2mlnnzaa5tw9x4k5dxtftn9vgpxn3q7h", "36940247338557071360"}, - {"evmos10yhdzppkwe4846hmgn5fhvc5sq0m80hlgquygk", "814082256093632512"}, - {"evmos10yjmch7epjhc30jlnz6uvz3n0e4usy0k9xhwwx", "60229376530706432"}, - {"evmos10ykhcjt5h4adzujc3qwhrtq76gtk0g4k2970sp", "77998682746880966656"}, - {"evmos10ylthsy0t9ym2628lsdhc6y7yjfdhj6f9rrxsn", "1316861594913068544"}, - {"evmos10ypmvwyqpfqc75pgw3zav5m3vzlklmqmr58xd3", "8305541910629629952"}, - {"evmos10yraxjjxj7m6z92m9zwmmxhdy4unetcpstwwh3", "2655788858225338368"}, - {"evmos10yvug69et5fu2r5ygt94mj7uxsw7jle7d9ql5r", "1060666857918451200"}, - {"evmos10yx2s802g4k0h7nuv8rvkrn39ju4hw4ff3d673", "1357955127369011200"}, - {"evmos10yy8xf45pp7ld0f6czn9guaxmk7s6wpjyw89l9", "4375206955692645888"}, - {"evmos10yyrehlr8n2tw3ts459638ltn78lszenpt98fa", "89132510500086693888"}, - {"evmos10z0mt4cnpxda7h8qgcuh8rp63s48y86uyvnre2", "40218238888802549760"}, - {"evmos10z20pnc3ta48f62mm49l2rs9crxruflw7jn7jn", "478321975119873792"}, - {"evmos10zchz3cf6uqcfgp0sxv9v6nsg4ruvszxuv65sr", "13956173321975259136"}, - {"evmos10zd2f58phwdtm363095qe9wz0y8dzl9a2p5z0z", "466129538333626368"}, - {"evmos10zee9936pfxsuvfmenk4vcn70uywnr7zpqgz0c", "17668280361621938176"}, - {"evmos10zenv7c0237dz6avg5lh3z2k4l8fy3rmlw6htx", "6991947099458994176"}, - {"evmos10zes6s0gqsx3cpa5tmczd7grlv7ucjrtv8e2gx", "759298647901863936"}, - {"evmos10zgjjjf9fpagl5fwzkp8xwpussvp8sqg4xqtng", "7179235106323894272"}, - {"evmos10zgl09496s6xdlpf7ypqdyyj4m6f0g5s0zcmjf", "2373996906661869568"}, - {"evmos10zj0smmpg4ncul52cwpqf8np9gtscj26jz4nk8", "3140395419091768832"}, - {"evmos10zjrvhp964pdllgqmkl8zh5vyya3qshk3a0frv", "384153823648240384"}, - {"evmos10zmy9r8ct0sht3k225pfu39krtwmd7ex0uzgwt", "6161841730338477056"}, - {"evmos10znghlttfz0f4jcjxpwugaqxny2j00kgduuvkk", "3992996093580260864"}, - {"evmos10znk3kq97k6fzp63pxjw8unrcdmwu29ujz028k", "467098946386624512"}, - {"evmos10znm8pr0dvzq0sz34mczudj6wm80tphqet33gt", "1818297793904782336"}, - {"evmos10zqh0lyaxad0hu6zhlzv0sqaatgt7r52ruyjg5", "1234843832697038848"}, - {"evmos10zssggy7ssdgv9pj94as852a0vflsfws5egx9p", "1143485079345913344"}, - {"evmos10zul7v70hcdkk6g5uw9d5pvneszdpl3ekc0g9n", "9060296054196762624"}, - {"evmos10zxgeze3xptcrhx9f5famf7mj9w4c2zg6qsnxs", "848767574207535104"}, - {"evmos10zxn5t5geaztdsujky0sychnlyekt53dypmfkm", "6605515848625463296"}, - {"evmos10zz4pag7cwutufvnaf383r84qxmla2glmn87kx", "6216424940854868992"}, - {"evmos10zzcz8qm73858e5xyjl3thuvpdg4thzdzs6k4f", "18630658653089505280"}, - {"evmos10zzfe6c6dzq70fnm0cwejxrh86dujxsusvvyaq", "4210016678800687104"}, - {"evmos1203vmq9leawn2gp5ju24ve006lexu26axhnx28", "807059650111462400"}, - {"evmos1209400egj6qu94fl6468kmqmz2xfsnfrlk9s8x", "10856307227851259904"}, - {"evmos120a7azdp0l289suhptchtcushsg4tjm9jps325", "3995811969038171648"}, - {"evmos120arduekmzgfya8r8x6nn5tca5g6u5hqflsl44", "1331591208861550848"}, - {"evmos120d6fte8ayzd0suuvjk8yd3tj8zx7lgwd5sn4m", "7620955826804262912"}, - {"evmos120fmx7cumhkfzvlgn4fdq4qlk4zdhfc3v88v9c", "235950658647692544"}, - {"evmos120fv45pp3k4azf8x7r6g52fu8pum2qvrn2jaep", "516341495656038912"}, - {"evmos120k53k4wumqm9rxmv8zcrs3l07dlvupm97erzg", "1269828809873370624"}, - {"evmos120ks2ml273s9xm0jf5pzwcqmm2h0e4unujel8a", "351944810323157248"}, - {"evmos120l5jeac2ntsqellkvw5w4naxukaaeurvkdq9e", "25967888857087770624"}, - {"evmos120l6rlrw7f4hafzmex3qhxhtgrl47xcz288h6h", "2767708827229762560"}, - {"evmos120qdcpq3v5a4cnmh9sqt3ucfe3ypygyj8vxcxp", "44876307870373249024"}, - {"evmos120ue0knjqmttly8lcs3kk09ga7mmkx5flrgaal", "74913434343487684608"}, - {"evmos120uujn2em52cz8cjm577c5aea7s9gdt5dmt08s", "117723848425443328"}, - {"evmos120vvu66ur8e4skj6gyw4a2as03mf2jk8824g3u", "1239081170416831488"}, - {"evmos120xserhpp7q49fm40rh5lh35wsml40ltazrj6u", "1421865652598030336"}, - {"evmos120ygqg8kgakpekp2qfjpgd5skt5ju6htly7msr", "22912944830175936512"}, - {"evmos120zqgu7umlvj03pqrn87yn33ff7hcdvyqf43kx", "16801750346878185472"}, - {"evmos120ztu5dvmxq8sfzlppapauyqtm9gunp9hh8ryl", "11195304998046547968"}, - {"evmos12203cqh025lcxw0x67h64e0pd095xqhkhhh6gd", "3979652514431067136"}, - {"evmos122336pzgwcf3u2q55dj5kgf0mc9t66rz95qky9", "425988711134187776"}, - {"evmos12292jwgrac55e32t6dddw8t9tmst36us5yglpr", "460676622434476544"}, - {"evmos122jcp6al0rcy8cn8rc5lxjyyufkcmy4js06aqp", "1789327618696751104"}, - {"evmos122jn29mv2w3yu5a8jw0lz7gy0h95qhn3anwn67", "659351526318739456"}, - {"evmos122kfvjgtj9spujnj5sta0y2688yjus2sjmwryv", "36340775041958656"}, - {"evmos122mutwe0vgalxvzqkwezypux9l7r4gz920zzlr", "4669117843682004992"}, - {"evmos122px9309au4yrz4s4dfqe9fdw8jc9rleaf8784", "15806331167708524544"}, - {"evmos122q9x7z8cqrj8gh8zq6f8y9l7xvkv8xnvwcgf5", "12821370925514424320"}, - {"evmos122rh9gud6kryltmktjale50zx7hxctmx9n2rsv", "6531234046854237184"}, - {"evmos122w9ayu4vphgvgh8785texvnrclm67r74cd9et", "562348069077032192"}, - {"evmos122yrvzpwg97hhqu7z7shjerfgfn252d9h8lfr4", "179424881260250624"}, - {"evmos12323pr7nj5sdld3m4dqypa8wxchpx5uj8mmn0s", "143895021798858752"}, - {"evmos12332la73agmpda4k68j8uhf8mtv4pgavwjz3d4", "8113415237677693952"}, - {"evmos1238jh90lxajlqllejzcwvenutcxkky2558xheg", "478867143271885312"}, - {"evmos123andwt3pd0ahnvf40uc8s4egjludsrnfrmxht", "850290149621215232"}, - {"evmos123drc779ln6cum6p6xjdsjwqctzn6cqkv0s2cg", "72253168515162996736"}, - {"evmos123esm4e9yhmwp5hpgenlcyhgp67xku2hkhfq85", "475597837855511552"}, - {"evmos123gr5vsux9qr3mudg08fad74gl9td8n7c9kr9l", "14351006366571765760"}, - {"evmos123kyku9dsh33cf8xh5xjg2hptpk3qnjkpldq9e", "6491099061702148096"}, - {"evmos123lp4qa5jqwc0tzyvzsaenkjavvagrqyuepd4p", "196144265605619200"}, - {"evmos123muvanz5vv0jzq5yuqx4n38kngjuwfdgpa2m4", "2511099829244867584"}, - {"evmos123nnnlmceh9xyuw3dy7x5jaqgrezle3hnz0jtu", "6457382123741753344"}, - {"evmos123pzw004v73d45xwe73l0vtazlknnzwxl6pdet", "217959975824157440"}, - {"evmos123rkau7drq6sagrgmw7gdh9zd5gmcg9j7lr2ks", "50096808493047570432"}, - {"evmos123sarf6f6t2ly57yc6t3etah32rfrxzec96smu", "452066215713869824"}, - {"evmos123t42urfdm75axq9n35zc20v9hvn2hqwza3hfx", "1433371213962448896"}, - {"evmos123tz5g74sw558vy6rkjp5z2au5j78aht85vtul", "1545893335110156288"}, - {"evmos123vcz6f9ut3k9aan94ctmah3l4t5n6w94qv8fc", "2922375487973488640"}, - {"evmos1240qg93c4uu8xmgdxly2alddef26tt5ntraxn6", "583286789188079616"}, - {"evmos1242epqfc9c22nh22kfmk43zqvrzguamf477psv", "423278263515996416"}, - {"evmos1242gv59djarhvjrdxpu6gansltvqkrm50rh70y", "6383464723221566464"}, - {"evmos1247zsqkea2rsjs97c2nj448zdn7rx7dl68e6qx", "13128145453898772480"}, - {"evmos1248vg0msknxkc08x2h3ljaxsk5z0d8m0lqsjcl", "8158332717932205056"}, - {"evmos12496rp6xu9jw9jqd734cep2f3lvq5e0tmgkrh4", "1781057557558901504"}, - {"evmos1249jwupz847t823jk3z5kureklk28shlj33jj9", "44278570275243008"}, - {"evmos124cvcq8vk3mngqrcsdrxhy62tzzv3k8ch3t08n", "902169579866720768"}, - {"evmos124g9r8faak2g3p82qvm7x5jvyj24z9wjwpyjy6", "3015094515543221760"}, - {"evmos124gvg2ml2n6ycar0zljq3l0kmpqqp9nstqc0g5", "3842106064531603456"}, - {"evmos124msah03lxr9gjh2hcc8gytl87qgpgxda5huy2", "944402143960829184"}, - {"evmos124n6k0gzm7tpgj9txc8hf5jdnmtmxnuahxahdy", "385373736626527232"}, - {"evmos124pkuc377zceelxfdudrhrthw6ng6lz5e6c0ta", "4060749155682174976"}, - {"evmos124slgdk05jwt0v3u6q7m6mztnn43g49k5u7f9a", "4148681756017223168"}, - {"evmos124sylmem6tk8mftql7j00f334cj9rza64ca92a", "1480320953562630912"}, - {"evmos124uhrr46jy5002dkx9hgr3hcv76yw48r9ax3zx", "587043932346880000"}, - {"evmos124vdl4q3aqpw5n3259xytg25874gzwwluzen2x", "2874158108594923008"}, - {"evmos124z7cmv2pegq5yywxppkmua3hlytcslfxs48us", "21324405954790350848"}, - {"evmos1252c53ngpjsjaspw2rlf8k9xj7k0pn5ujgckw9", "2242917808835065856"}, - {"evmos1252j9g3q9jqehzuwv68y3ps94v8ccpy8w8gp37", "14807420333788628992"}, - {"evmos1255ds7kcwzuaqmtpdaugmlaq93qtm9rxxvr3md", "384085808998311680"}, - {"evmos1259vvqwz6dc8l320wf7p6qdhh839sz0dx6j9nr", "2113217523153316608"}, - {"evmos125ahknwswrvmghzd60y7u4x38zlu5q3qfe4cg3", "467647277213898752"}, - {"evmos125alln0vgfcyfmxu4rutj6w0dd8hqt63m6ukpl", "4004009666505048064"}, - {"evmos125carss0036hwz899scs3qgmszwhdhsydjy5uh", "1208809079318215936"}, - {"evmos125cxzlrjqpnlsjhx9266vmjjvwxgf0un9lxnvr", "22489879538587451392"}, - {"evmos125czyeacrqas0kgyscrfmden0lgctkh8uavmw9", "942665768470765568"}, - {"evmos125f0dg2w49hqqyawh8sr74a4s4ju8gllu66xnj", "4854218395835203584"}, - {"evmos125hz2guerjsh24hr5jmezz25umu3jtgtk7ptt4", "7666231536041000960"}, - {"evmos125lga0nuur08q2rhf5wk9wlda8y4wezkcp4nyu", "675465580388081664"}, - {"evmos125pst0tt2uh77smqq24dd76lmmyl869jq3d5n7", "884021904957928064"}, - {"evmos125su6g4d6sn97qzy6rj6cy9pa229c3a3cuxrv0", "1414313313112932352"}, - {"evmos125t0ay0la256enxwc4shg3j4mxzcpnqup2ur6p", "520828765627361280"}, - {"evmos125u8j0cw6f8af630e4fztfqfjk50ttp6wwqz7y", "8547314161390104576"}, - {"evmos125x7fnfvz44chsdag3ta39m463na5h3sw002q7", "1041451870309501312"}, - {"evmos125xwxpyy6843epkryakrel26j0839858yrnmyx", "23252538339593728"}, - {"evmos125z7q8qcuuhf3vg4d5p6qpgcfrvpz0nw7tlc20", "21078303968137736192"}, - {"evmos125zya8tm9e723cd9rugm3epxa5gr0m7erzrvyk", "4053315519082102784"}, - {"evmos1260j3nhldjwx24gnz0l4dfkf4ufcjrqq02v3tn", "64826574194940160"}, - {"evmos12625re73euqnr5l4lx9rw4l5lxty4qk39dfwed", "1902999253040199680"}, - {"evmos1262lt09rjhguqvjdyeazd4zdl2wvrmja5sddt8", "1431413255576656640"}, - {"evmos1263zmapvq6jqyhaazlhfzqy9wcx3v24k0ypnat", "12603913955554744320"}, - {"evmos12648lg4c5826dsh6q4mdnaels6qkk57czptnq0", "1323314012186096640"}, - {"evmos12666dsjvhrd9syf9hcrrv82um9whafjm0q3umf", "2002070491778303488"}, - {"evmos1267e0ng5arz25ccsc8h2fmxgm2a66g9dmdgwr4", "890800161030816768"}, - {"evmos126eyw5pc5exjv5vlqgx5p9fe6ee8jkn3s67uwx", "431084851254220800"}, - {"evmos126fptjwt7the89y4z6eyrp53vz4nwavqa0838h", "4047571693081500672"}, - {"evmos126ga840phtya0kvymvatne3vxm2vrsqswgazf0", "270542505720515584"}, - {"evmos126gwc97q6g92pwses8qgrmp62skyy6juz8wux4", "36909277600349650944"}, - {"evmos126j6267hcmsn5xy9le7nmuved9kj8j9q2lqmeu", "694121221619066880"}, - {"evmos126j8mdhwfulgnv5km39n062mmxz7m7gtc9msl2", "1489255304484558080"}, - {"evmos126mmt6ujdjkpqfkpy3pwj6kwmev8x7mxkx6agg", "1560961919252559872"}, - {"evmos126tjk0hnv39qaua7qrxsrkqgxwdarm979ahhux", "2083726698264854528"}, - {"evmos126wuvx8ueram0y09249mh7fxz2nj9kl6zglwlr", "2520491829716105216"}, - {"evmos126yepfzc8f8h0maxn33dxemrmycnnqzhw538rj", "1067139646085127168"}, - {"evmos126yl39vy6pks8p9m63gm2y6yvsttdpx940a89p", "1310817781679934976"}, - {"evmos126z8223dwxnztt8fp7prhaxwckvw5g0j2v3tza", "29031839751993016320"}, - {"evmos126z8sf3tp7mg3k6tagvc0qu8360xk2wpaq4e86", "62697423435597312"}, - {"evmos1270je2l8nj8takl4e6rrcf8tr5qxh479jclyqt", "1534169717167421440"}, - {"evmos1274rakmcl6n2ttdenc59t97h4rkucs05jx22jl", "7356747400921266176"}, - {"evmos1274ye45fd2sc0ejkqludtpd09rsav07ayc4cma", "261325720874461184"}, - {"evmos12767wgzm8sdxq7eu6ludymc8k58zqrxwr5ny37", "1004445071790747136"}, - {"evmos1276jf4yv3ch6nannx24v7kygawepehc5p69qj7", "10728990810147561472"}, - {"evmos1279jaz2mhnehfgjt3t5mdkh2rkeheayvyplgyk", "193173699644800000"}, - {"evmos127arhkeu4gqjdxat3gr2n7mmwdpp205jeadf3p", "5224997853392797696"}, - {"evmos127gwm2qsv8ndyj8l6naurh9s4m4z6ahazngrxz", "213430168520347648"}, - {"evmos127lr5urs3868t3r0at40p65ga2zlgule4627p9", "342819024713892864"}, - {"evmos127lt5uu836qwm3md2n4umj69ugu0a2ne8rv37d", "498468653289014272"}, - {"evmos127mjwg5wt0mdce4claushsw7nclx4v00dl70tm", "4847521369291544576"}, - {"evmos127pc6f206pxdu35j4ulxulem5kljagz5uqpuy0", "1521425133048791040"}, - {"evmos127qmemv80xny4ed7nrcz3xncmw2hcqwy4uxtah", "369166426354094848"}, - {"evmos127rk35k8ckltvrxvls2g543usduw9q0vq2ee0y", "98804142501130567680"}, - {"evmos127td5zchgzdhy2gq5zjkfkagskcg02fdrv9jtw", "2424299890930483200"}, - {"evmos127u4p69vh8fdy5wqet2n3hln66p0uvlxm79ts9", "5985049384469346304"}, - {"evmos127vxmzhmy24lpy8nhn2y3wm2z3st3j7x8hswj4", "77615616695951540224"}, - {"evmos127whc0jvk0jryqxxhqv38n0gx2qc53ur23dtxm", "883487602984889472"}, - {"evmos127y48nkfe37xqxmurdrfwaf05p65306twcayfl", "10856547768904335360"}, - {"evmos127zdtg9u2629r0xmx5vhg23xg7ey6afn73xvw9", "384155747637593344"}, - {"evmos127ztn5z3xh2wst5vxsvym7z4wdrafduwephetz", "1526180946858786816"}, - {"evmos127zuvaapmd8z7pdg8gnkl56cpt0smsk9fp23xm", "217756248736988672"}, - {"evmos1283hcllc3k45xd8zuhe2fpcxsp9upalnxmp2e0", "17381497952163209216"}, - {"evmos1284ppz4330lxe08f4zexqryfpfysccrdjwmmy2", "4611445049660016640"}, - {"evmos128csfnuw8kge9wzh7upqgjd9jhfzq4g6pu9tgz", "5705542360229711872"}, - {"evmos128h4muf7qpe43xraad3wuk84mzwpud6zmh9ee7", "17024912046494042112"}, - {"evmos128jmxj00kk9dvpcn83h4a2295qmnqfuguw5d3f", "465761634469232640"}, - {"evmos128jzpjx6gscf5qp3r9tfx4kc5hx9rdvf6stf8n", "10123534356196360192"}, - {"evmos128n4pdutw39lrqn3q5wkg28x62qkwxtkn44gmg", "27069362428444405760"}, - {"evmos128n5tdfndhkwg6ye2sl2qzq6p30phptf7p57mk", "1039546224027625472"}, - {"evmos128r96fh646st69785sx9lpvhrpc4r88ft8uuyg", "32519706270887411712"}, - {"evmos128u7tdamq3vy998m5rsqunzf8l6yx5zs5ah2g2", "733215227770963968"}, - {"evmos128uj6pdf5nkvsr30jlspl7yla40ty5cdt056jg", "2861077228737542144"}, - {"evmos128wmwttax4rpq8kwux6cyjtx3zkvm60dt6z97l", "9962145838419906560"}, - {"evmos128z7zqvfpxdwfgycvq63v79llum5jcwq9045rp", "384886670442181120"}, - {"evmos1290v5rwhz8zkmv47ynzugn9jznr99j5cn8tfx5", "8947385739484672000"}, - {"evmos12928ex50lv83l00wpep6y7zde2e7hz8kr2n7cc", "23833804751055794176"}, - {"evmos12935r0zx49krcakwx9mc2dw7k79qgmyesl4v8d", "1105039672069774848"}, - {"evmos12962lsy4fqmtyh8lu8dafs5dryhwpr585sml4n", "7829612756856307712"}, - {"evmos1299ypjyranhsg7a2l2kqs7e3tc30803pczmn24", "3448953418536804352"}, - {"evmos129cazjqxt2mnaykgvrwrw3c5n9z50rh760p2gt", "3217041409054474240"}, - {"evmos129lmrzrzl7k6j0khx29f6c2xehtlktxsy93sp2", "1991269231201632256"}, - {"evmos129ng4zyy8t9j8vxtl9mt40dkdndu77yqel2h8w", "22392930711268925440"}, - {"evmos129p2ermjl57ayed3wxnzhhq58m25vfxn4e0965", "980132562289438720"}, - {"evmos129ppy669wwhp5glyez4j59nrrjh8y5e93k2uwp", "2034120402117359616"}, - {"evmos129qhjmlwn67jyxumn35xfwkcqaanp33r57p3sg", "13332310728081879040"}, - {"evmos129uknxr63c6ytpj07f0dzerzwme3hlnd6puwsx", "5614625071358018560"}, - {"evmos129vx95n92c49ufh5yraathzfmsn8tvv2ckh83m", "4157801919731691520"}, - {"evmos129wgya9ycg7yhn50rtfkj7tgk29tn80ypervdu", "404188378945380352"}, - {"evmos129xehft7el38tl9pm4tueynenu0ppgtsphn609", "2581396018097840128"}, - {"evmos129xnrtjnld5gm0r0h28ghl3m3tdun9pktnwnn5", "20810390605187940352"}, - {"evmos129yd4hwxpm4j5yn82tmtgx5pprtuk5mtajvxas", "606973746287994368"}, - {"evmos129z8rqwd6pagct9d99cvaralfu2stzszad2wq5", "85870904565767946240"}, - {"evmos12a3cpgewkmcwwr2jnflv6p49kc2t9qgxsk7g60", "446025013773761024"}, - {"evmos12a4vsxy5s8m8tgtea2tw42xc6q7yjr0rgk5xp0", "24048707085831491584"}, - {"evmos12a6a6umuqayhqth6sk3x8ejh29hd25hmm34cfd", "3970922379768800768"}, - {"evmos12a6f9ux3r2qtc6nqm30w3smt08ddws7vtfh3rk", "427523872779216384"}, - {"evmos12a6jqjhsp5zz5jfenjj34gsj3tayzkmsa233zv", "5469554375504907264"}, - {"evmos12a7s34cm9gat7m2kjqnr2wajrgejyf3atfcc0u", "10089543658999412736"}, - {"evmos12a9llq3wda966ld5gg36y72lxwelqxv96lu7mx", "11016961772870275072"}, - {"evmos12adtzq2ma4zyphj8g72v434h9p6ddpa3rngn2g", "158801503907755520"}, - {"evmos12afnru7645shk2ew3tknsrdupkd8d34pm2lgg5", "5181946635197968384"}, - {"evmos12agzyz6h54735eu9eyzkq9y6jt92ua6rl5x23t", "53251127879662174208"}, - {"evmos12aj8vx7e47zdqas0wzn80wkfqvyazyruj0ruz9", "1975877006583996416"}, - {"evmos12ak49urxa88f8dpzk3qazfpw2m3255kem56ctu", "433848051105549056"}, - {"evmos12ama9qjma3fwp6k9n8g63c8tgltc6e70vwk03a", "2216692368785181184"}, - {"evmos12amax3uv7pdrrpn4q0asp8008tura53d7ggqnw", "874354217824718848"}, - {"evmos12amgmfuef5ra2mslxj8y3cdl3l2tny693wyhgw", "413945330343307776"}, - {"evmos12ar4mjnkzpngn6hhxvhqg06vt6znw5nmaq4szv", "553864097314606080"}, - {"evmos12ashukf3yulxuza7kk6ymhtru837uzqj77wfz4", "1417515721815777280"}, - {"evmos12at5pavpqw8hjfp9vu86d0ltej8ymn0lzt6f63", "595039440973172736"}, - {"evmos12aw242ea8t54j7f6pxcd3nku06yyzsh3qxxelt", "4273434993164525568"}, - {"evmos12aw832fpspw4tamenv0j84ckswzk25htqntu26", "8537792244972290048"}, - {"evmos12ayaetrref3fcfv4wwa372xs03wtcq4x9s5xu2", "10970594620302098432"}, - {"evmos12azk07hpfnsgyd6wy94ew7kkccsxhsf635u6f0", "20818494397757161472"}, - {"evmos12azlnzd5xw3cqnv6j35vpddf9ksql8mxvasjy3", "466526377403219456"}, - {"evmos12azu04yv0ergsqyp640jyvf3ck4d3drcjqnmzj", "3624406300360953856"}, - {"evmos12c0kgu3lxf9ny2z8np75nvnfy6tpcyfdvqyh55", "1478554550957737472"}, - {"evmos12c2cltew68y8aefqm0euq957eq3ukwxx99deex", "324107165972538368"}, - {"evmos12c2mjxeqfck45dpfw2e2a2hmxzkn6yvyeu0mke", "5496013919757883392"}, - {"evmos12c4lrdnacsxeklpam4y7gkh93es7rdmwu3wvdk", "431636856597571840"}, - {"evmos12c4xcsckg7qq3jnklrmufvmyax6w2jhthqq6wt", "1392942162181898752"}, - {"evmos12c5q0dw5ephppauqfncss66jt966q22p73yp4c", "367095830281877504"}, - {"evmos12c7myhpahjw4n5wxrn7fkw8569sy6yp0h3wun2", "686041088178174848"}, - {"evmos12c9zvs3z8thgv3akwk6dlu4xxz5xwtx2dqtafj", "9943295931858739200"}, - {"evmos12cax05dfhsx0c3xxkwt3ntd00ew5ajph57j7zs", "369483799213311488"}, - {"evmos12chafu3c5jh39zufc4ezsxttushu6v0nuksqz9", "1714763431197586944"}, - {"evmos12chqnwawsmwlzaf5s0lz093msqw0k7z0wdn535", "119551910775350624256"}, - {"evmos12cp9c47zvgds3aw00uxn4j44c25p3e06yhkv9g", "3904263964309624832"}, - {"evmos12cwxkx6eg4jwl5cs9hcz5f3nqxn693rmu2fhq6", "1636124696080297984"}, - {"evmos12cxukqtwvz46sva9knu0rume2xxn2lmesgch7x", "4682985756054835200"}, - {"evmos12d04lhh9wxu4h7w9lcy383m85rnf07wcls67p6", "4524136225203781632"}, - {"evmos12d050fq2klg5fkl5raqjc2zfqwfau2ae7npyk6", "422445648419865600"}, - {"evmos12d0vd4rdwp02k7kfmtff8py3dzw6vrlzu0mptw", "413700633296552192"}, - {"evmos12d57g7krc66f0hesn9f9krr5f0ayd4msuul6a3", "24049285786580365312"}, - {"evmos12d8tv3m4k2crqqmey52d383ck972qlmect5r3y", "3705215935059277824"}, - {"evmos12d8tvrf8tpjtckvy607wjggfjg7gr23jy56ceq", "1624245903983460352"}, - {"evmos12dah4dvfa2m5g0f2x6ezlht6tgnk42sfvx22t7", "6696292783901753344"}, - {"evmos12dcpgxd79y48zzlw3l3s5qt6en6mlwknxw77a5", "519576252688162048"}, - {"evmos12ddnvcwcdh9gga7u3wndfxw82qr45hckrhdej8", "13556069947863064576"}, - {"evmos12ddxyh73ne76lgdaqlmq2ahhsrjswy0q54mxxf", "883990577481423488"}, - {"evmos12dgxq782hw3qrqlhesqpc8esp8f24adn8t2qcx", "4230066913069340672"}, - {"evmos12dkjwap6hcx0xrc5204lj09fpud6d94dvfnjzv", "3474039286197949440"}, - {"evmos12dljchh5p5eslzpcm905eapl6nqaaf95jrm096", "99473350857942528"}, - {"evmos12duntdqwhptng20xhfqmyxg7m3vka6mfdzrhuu", "1173448583658577920"}, - {"evmos12dwz4y62ct4stm03lrhpfnfnzmkq3rrzg5gf69", "1049158061938834944"}, - {"evmos12dx35vm5e9n9qt39682arc96nddavlpheemmq0", "25555026403050565632"}, - {"evmos12e036zxsjfchsdk3s7ff5ahcrh5ykxlys36mvu", "3231210766766112768"}, - {"evmos12e0qdle3s9lkc2xz3dj4yszh3x7nfe6t03h7dj", "3314949966413771776"}, - {"evmos12e3nsr52ezefktn5pwnxlznh6tgsu9s44up5tn", "1447073889872648192"}, - {"evmos12e48fsv92lev3ly4vghmtmlhdap6wy4v6w8spc", "821215900166383616"}, - {"evmos12e5hzz2s2pu03sclfnf0hekaqdlykmum3c2atm", "35775986635752456192"}, - {"evmos12e6pp0jy9qfesdn7tavkm739djd8tuh9vpewmt", "1438273448562555648"}, - {"evmos12e7xwelzmsy6nfmk9z8zfj4mqrwlf4mwuqndhr", "11787384279113445376"}, - {"evmos12earu4y3fk8kds9a4unutqrmnehkw7c2v8hyw4", "3302671058234114048"}, - {"evmos12efrleu96dmu9wmrfdq6vsxfd9fsl6drylwhcl", "893334574047377920"}, - {"evmos12ek4rn2k680ry5qmmdxyyva0nzmkg7qadv338r", "10027945306295965696"}, - {"evmos12ekjcvvsxm90wvce26sjhggc739sgm499uvzlw", "9131650015855153152"}, - {"evmos12erar5aqf4tvlmr48tevp3xtdqkyhkvltcpuex", "1256045846745405952"}, - {"evmos12euw842nesnpk6gpy62jeevg9zkafvpcyy2ha3", "1281532181704571392"}, - {"evmos12eux9pltgwl4tjhxam07607qeknveaw2c4wva2", "1815842278799982592"}, - {"evmos12evccm60p0pculcre4dq2zw4gsksyf52nnawdy", "238543761494062080"}, - {"evmos12evxvqavv9m37jxh9cf653ysk3yk8jft6y7mpt", "1568607621080110080"}, - {"evmos12ewt0n0u2afks7kdwsvd6rdj8nhapjf7t7634j", "15748556722650652672"}, - {"evmos12eyqc929faj9wvendj8x9np47aujannzqtlc3e", "2373056440397079552"}, - {"evmos12ez0kcran2h5822xzaytsygpkj73uruqxyzmf5", "37003448232589312"}, - {"evmos12ezr33am4utlhnjf38cc44yghuw5utfclxnrms", "136886340520072192"}, - {"evmos12f44z078xzrk923l3ga3hwhp7epsuy2kt3nps7", "3218450539459094016"}, - {"evmos12f5x7f8n407yykkk5fmqg8gylffh4gwqphw3q7", "25242236712530534400"}, - {"evmos12fcwq3wrejku3dtelyv3nh6wwq428k86rshgrv", "369090285164002304"}, - {"evmos12fcy7xpak6u02f3c0h9qlw0ne2g3h27gsfa298", "26859446976663296"}, - {"evmos12fepasfs8gx3weks30g0eestzrtdtfec7px54t", "149969948967456768"}, - {"evmos12fey59y7m82jx0rltxe49y9cuu8zy7n8jnafhr", "837786461984035840"}, - {"evmos12feyyrud5rwpnxztjdh00luxj5ynmxw2hl2s7e", "4940881125706223616"}, - {"evmos12ffpr4hm0kf0mgdvqk2m678pxat89gyh9fpx2t", "1271423307492610048"}, - {"evmos12ffy7l6l9d677w8xweyc5nldk0wq3ysj94lzpz", "5288822634650439680"}, - {"evmos12fgre5zhpyxcy669tgrkyry4qx74jqcsyk2jtk", "5130185559884316672"}, - {"evmos12fhs0y9rr926yh0pngdjn9stdq5z7xx20skstz", "2753486232368866304"}, - {"evmos12fjqn3ptftvwmqpgzqtk79gfxa6p486qnmt9gy", "1823818228592361472"}, - {"evmos12flwklzak4c3wfq4xwfl79kvpcwjgtwner7373", "226842917715184128"}, - {"evmos12fn4sr5nyldnrl2q285qcxjxwkyfetqazqh4mm", "115891880937180160"}, - {"evmos12fn8atrv9uyurqjxemdszlqd5vt9jln56vxyw4", "4876353197745917952"}, - {"evmos12fqf35ar8unz6d37tcq0mhlmk4jrphccw40tux", "6937305396800628736"}, - {"evmos12ft8zznekg3kcfw0vmg845pa7yjuek65xy392n", "553295880431196928"}, - {"evmos12ftj5prjkpn7ln696p440hx74enet5tujlm0nv", "75536392302967808"}, - {"evmos12fw2kzezuqdl4cs654kt005dl9p33z4atslxdd", "328985083301657600"}, - {"evmos12fzsak3qyqx0kkxdfjf2tcqevlmxz3xavk9uc7", "9150797247016265728"}, - {"evmos12g5cze828t3mf98uakyshjp7z6fyq7mq46wn3f", "6484178954199695360"}, - {"evmos12g672mmjgxc95ey2mfvsq656hr95q24sqakhjk", "29653078280321187840"}, - {"evmos12gavm72gx3jvtssfg2aktlyt5yl3c4t0tjkjja", "1242306188016691200"}, - {"evmos12gc404g69cahykmzseeu8kd7l622kwvgfrugwz", "41024331568471695360"}, - {"evmos12geeky2pwcydc85a2jvpywsa94aq9lggf9slaa", "2150574961867289088"}, - {"evmos12gjnahupnamlph55axlaywf72snp8ep2hvzp6f", "4237954318856192000"}, - {"evmos12gkrzpjjh2yxrutxh9vtsqakncg7r2cnjyuz5y", "286843017619035648"}, - {"evmos12gl34wfudsc5jmdw8ujt2rtdgmlh93zsqwsexn", "14911110638514198528"}, - {"evmos12gle0jcyk6y7ndan2lv20n09l88k02ycm4jcpt", "9866070497939456"}, - {"evmos12glfturgmmxjhsut8dl9jkjwn4q69ec2qdnjl5", "1700603072334394368"}, - {"evmos12grksutlx9uf8e6fkd3nn863hj9qjt8uegvysl", "7785936584748560384"}, - {"evmos12gsmpnma0redcl4tanf0834cakwxr7vjzq5vxc", "10737360501240762368"}, - {"evmos12gsuuf2eq6npeu7uy5rpg0xn34r2j2lpe8l4s9", "4983307036374784000"}, - {"evmos12gtumrp7ya4vue0fuyf90f4lm69tyq46ucjk9g", "3303219566183883776"}, - {"evmos12gv8886yfm4ghuxx72dxqyjuhhdf0ra4hyvlu3", "146708725953707008"}, - {"evmos12gw70uxkhktvl4rvle4wawqvwa6egcmy5l0q8z", "1335718004373319680"}, - {"evmos12gyx9n3sky7nh4fjltl5tjnc5pw5szqphlmfwc", "1067105262464460544"}, - {"evmos12h2dawgesyvr2nu7mvdq6rhaw49rkajml5cvvm", "22064327898048512"}, - {"evmos12h40d0937czeam57j7304lj52gjzdckkcl9xel", "1361354377632124928"}, - {"evmos12h5sdhjyfcppthtgs2ktggjs77m87tqkj9cxmc", "250036317680099328"}, - {"evmos12h6jmxkl24ud00d2g3vpu8sqdj62de2pvk48zm", "1498919194775481344"}, - {"evmos12h89qls2jmsfjhh5pkcjgywrzc9h4x7zf84l6c", "414414473540161536"}, - {"evmos12ha8kh2evhs5wa9zpkfkfj7qfhfcxwnkj0tvzy", "3918048198808081408"}, - {"evmos12hacm5887j6uzpc9sgxknncup39998x546rv00", "400321351127042304"}, - {"evmos12hcmwt2rmpvnr3vqrraa00uaj9pygvskfg7amd", "766760995317182464"}, - {"evmos12hdypu3v98kd9g742qzhjv4wml5m99cdpjhgy0", "631942116956806144"}, - {"evmos12hl6zn2z9gxnce6938njs8hyskrp0av5lp5unx", "6027499434047373312"}, - {"evmos12hlfq9qlh3n0zarm77svq47x94sj5n3wlxns9z", "1360576470568945664"}, - {"evmos12hrry0fxrjjecm7htm9dk8z4yln50azhdzgkn5", "258102712261316608"}, - {"evmos12hvd5wwch23j0lzkcprudkxnvvr5mwpucvm9hm", "1509501462536201216"}, - {"evmos12hwekfuamxdft4mrl864tz4atj0fp9kzh3cdmn", "6007816814431911936"}, - {"evmos12hy5w54e3h4vft7zs0w9yytp08gu35xxf6uvd8", "1272774125298130944"}, - {"evmos12hztqsqspftujspc8s0v3aypd3uan29ynnsjx6", "749832526312571904"}, - {"evmos12j0cjrwfsvstr0tszg3nz79phwj45rtl3mnxp4", "5774863113825521664"}, - {"evmos12j0fmjstrh7563a6auggnf4tc8u6cwryg2kp0d", "1784565653856718336"}, - {"evmos12j5x5cflzqhzrzht9dq2fxfkj52gj8vv6u5729", "2570574113846106112"}, - {"evmos12j7rg02evw2nuzsq2llh8acvnwd3eltkhtwk3a", "5374562328427184128"}, - {"evmos12j7ujmx04p6m48uvlweq8h3x55r2ujw468hzvl", "1474563645248848384"}, - {"evmos12jcz2nq2hncs3shudtk7g2r3xtlcjvk76y5wsr", "1553468196351074048"}, - {"evmos12jdgg7zhz7e8e0hntgvmj83a4gdffs9q7k5ypc", "300715671175603712"}, - {"evmos12jl3tfvttew49ugu8ny94qnqsv4j5g3cn602xx", "318377733735068672"}, - {"evmos12jpjft8fw78me068qssv3uphzqxznd59kkgveq", "106948334755791241216"}, - {"evmos12jse4u078tquzfmftj3flkw4yy09czjxnqgnp9", "16590486230117234688"}, - {"evmos12jve0lsqrl6alejs66ng456yxm0s4jshht5v52", "2516696735506700288"}, - {"evmos12jy0lnnzdq8qy2uhwrtzdjj796pvaluhf80sqs", "1189033204737904640"}, - {"evmos12k0l75lmjcus7vdfg583xnufqtdq54amvwqseg", "5016566540407727104"}, - {"evmos12k28vgukxdkyss37k0mpvhq0hjv3u7d99r3gxd", "18338460848573378560"}, - {"evmos12k30fmnkl83576pl7uuz07fyseh5w25yc97fjq", "3505466968374292480"}, - {"evmos12k32ty6fwxzl3udjtn0ep2fhruha3dz2ycfnun", "4468056330939505152"}, - {"evmos12k78v63eccyv746t2kc9f3qmv5cdfmkfsgyh5k", "6553936777570478080"}, - {"evmos12k9nxgpkulh90dmtf0v7uz5tqwcq6j2m3x52jj", "4112427168845404672"}, - {"evmos12ka6d89axqaknxkt6usrwpe53xpzncdek8mue9", "4679872965625105408"}, - {"evmos12kauaghz3vlz2wgc8896u89ehm8yqmwdjlzw34", "381122682037666560"}, - {"evmos12kc4q9vh4ls5uz9vnuydwhqtcttd3pzr5xc4wy", "2485944317787694080"}, - {"evmos12kc8k8h7zka7la3qjpzhwhwr6whwzucm5erxk9", "883530624038078976"}, - {"evmos12kdqd2w7mjukpsfayp6tz5fwqmpzpr2cphdrpe", "9429146298017169408"}, - {"evmos12kjc72t0klw3x48ywcaj3p29j526dyc3r4j0ns", "7707446501198241792"}, - {"evmos12kk9qd2f7pjmnm4n7lv95c83mjhyx8p3ln6ge7", "103283781694802688"}, - {"evmos12km9gk3rdpvz3meuujkuq773vv459qppjrqs37", "1690998566578094080"}, - {"evmos12kn62e29p8vlfe9prqpx3t9r4vt5es6pqu3jg0", "2151424829203437312"}, - {"evmos12kqac6l6evwjla73asyafa7ddw5an6g79ysp8a", "4241626049163753472"}, - {"evmos12krw8g8xcdyl4ynl5pldkxhmnevuqzetggzc9x", "23006795161532030976"}, - {"evmos12ks58z6tvekyxkvsntys93qmuzwrhqs65pwrxf", "3609504301670162944"}, - {"evmos12ktr00h8g05fd2ydpg020q8uzh2tj647tmlac6", "29587753503507968"}, - {"evmos12kujdvmke2qdphrgdjmg55p93yzpjtykejvhts", "21886922846440062976"}, - {"evmos12kx665am7fdxjrcs8ac0ddx0hkglkg0ayx6qrj", "9742693988320509952"}, - {"evmos12kzpvfjh0zrkny2w47c5hs8rm3tah6qj43n423", "10333729320989960192"}, - {"evmos12l2equqxtre94urm2axkvqqtn6ehry2vt9lcsq", "3013766556112453632"}, - {"evmos12l3ydzpcaelu6swmsfnla7tnj23egjgqy7pwxu", "780955044630784"}, - {"evmos12l7mckntx45qc4k7rqnkzwc6405keenyvmwl0f", "116387716466298368"}, - {"evmos12lat4suju5tkpk8r2thmymzaukd3urqxzl0rhm", "2668973665462040576"}, - {"evmos12lc2kv2amxxhf2vw5v4qd57pq9qlgel8q2htvq", "3765701422740893696"}, - {"evmos12ldalpu7vwalpl386rsz6uy4tg2yzyyd87j7yz", "120699731183698313216"}, - {"evmos12lecvaqgtmdwwn0l77xlyfe6njgracel3dqtwy", "71463832304658636800"}, - {"evmos12lerav070sgzquvhgdrugp6qpcg9l5l9ha2nq7", "26944527455607906304"}, - {"evmos12lf6djlmnk7z7sl55xlle46k9nm7k0jl28w62r", "14811881485939200"}, - {"evmos12lguhac8f84s0wgtqwfxmw2axalfvmc529uljk", "25091375873680236544"}, - {"evmos12lnrrmw9uh37p3082f2ha0cj8rq4y7c2u3grv2", "201977907451140096"}, - {"evmos12lnxz9fd3md2m8d9h7sr9hue6mg4f3cvwlnxws", "1644246742377159680"}, - {"evmos12ltm7aphaa578xwc783xe2avlafeyuwzutsusv", "1281462882053044736"}, - {"evmos12luzqe5j9e38gqwupjr8vzjhrgjhwdztm3a898", "323144836276649728"}, - {"evmos12lvndl6awkua5dfuhzqw248uqg2rv7hj72fr7h", "2272286282246072320"}, - {"evmos12lvrjpqt5quzxpvra3z45qamkpq7a6gte3jtgr", "1071091521938733056"}, - {"evmos12lwtpfq6d6zclnj67jfmqpkdhf7ykfyzm8qyr9", "23676572408430280704"}, - {"evmos12lxeuq3eg98zcujv7u63ugslp6fem5j92r86wc", "1364742430884975616"}, - {"evmos12lxqnw2mhhc3gxrwhpnt3glq24jnpskfm9hk0y", "20696354883327344640"}, - {"evmos12m05fqnnjs6ustvp9x5c24dvj0gl8af98293gr", "1281284959665974272"}, - {"evmos12m0uwxusl0pejwy44p45qr9h0kk9zvkt04n60c", "3073662622813511680"}, - {"evmos12m2mmrxykq4m3d4svxspwy5tjrjg7vtdq0l5u3", "24121357172103471104"}, - {"evmos12m4tnwe55ah46z6gctl6evxxf4ut32zelj5tkl", "23349252182898638848"}, - {"evmos12m59xr44d6r4ptkv9nvrq7q8y0t9nr5pyjaxd7", "3504114651866644480"}, - {"evmos12m6fzuyxj597s9n5lr33mpun666p39uymte3fj", "21405678999074033664"}, - {"evmos12m6wmw4qmsnfzqtjae2mu4ef08sjvge34aplgf", "13903967445213061120"}, - {"evmos12maapuduzr9actnrt6ufge6yvqjhkkdc5nsmh4", "273541383323825408"}, - {"evmos12met9gexp5xsxmx3zsg8p3srlsfgyz8wtgptj8", "35172171065125216256"}, - {"evmos12mjs5pcxuajrskpznwh8wqryvyr3yjwsej9tw2", "11011923997535846400"}, - {"evmos12ml74jcsz2l6z5cm0rsmwry9ryd0qashadfu30", "2568973830615814144"}, - {"evmos12mlhlvmazr7w6eqld5gam4jdccl86l98rnrlyh", "3365156538170231808"}, - {"evmos12mm9mnvzr3nqkne7svmfvarltk8rc5mm4w2d43", "465714910682539008"}, - {"evmos12mn5u7aw5qw4hl9u5cmtfq00syzxppw6tzpc45", "1473714467582683648"}, - {"evmos12mn6gcv5t4a6pu262c4fgh80c52mgd2p80qy4p", "8127268166875368448"}, - {"evmos12mr6f07mm3tuq4z5z0gj5vqjt7n9rke9k2rm8e", "5778166994808364032"}, - {"evmos12mrsl6gw5wqy8d26v7nllkqlwvy32hjud58jet", "1472055967220119040"}, - {"evmos12ms3k7pm8kgdtr4ey8rns2h4p9mdl4ppsjqrzk", "1386928104365023232"}, - {"evmos12mx4ata8eylemvdk676tg6cht82n44qwa5pqsd", "43235401706879918080"}, - {"evmos12mzse32fhs2wmdhf8ae4825xaq4g8qxfven6uj", "3996475855456692736"}, - {"evmos12n03lx98f8tt4he4whdfnwa9tn99qh8hwcqj77", "29006586325260161024"}, - {"evmos12n2a5dslqe8erpf08cts5rszvkvdgx0v5mjq0g", "2000062678088466432"}, - {"evmos12n32rlc384x08wtjs3t0fqd3qfuzj5nwhuewvj", "3869094572944992256"}, - {"evmos12n3asyklcfv5j0cf5wdjxd0pm7w74s388kjxxj", "23789495367245086720"}, - {"evmos12n3x7l5p3m47c8sxlph34h5k26lxfnd4tnz73x", "613228273432717312"}, - {"evmos12n46wkr0glaydn3daf2az2fn2zdlf56d0khlxz", "16285689908992026624"}, - {"evmos12n48lnan38n3dq3923elqtzq57j4uzpqg6xgd6", "7427664140031267840"}, - {"evmos12n7fwvm3f8c8rnuqj46l2fhzlekedcs9ja6vzk", "6990600552413101056"}, - {"evmos12n8fela3lpsxjyurcy8hv02hrjnfvdq8h7ttrx", "779835041035078656"}, - {"evmos12nd36w6pdezx75ckguejqmdq00y32rwxh6uwwh", "18432497704173473792"}, - {"evmos12nddq69ctmx38erun253962h5wms476du82jxl", "120532077885618688"}, - {"evmos12nesme68nyygakyg4jpxy4c8n2zgcjgx3x2q5m", "8891058149485284352"}, - {"evmos12nk7e0e27w4t9htzu4swx4jn7zx4cga5tvfu2z", "10143566445356670976"}, - {"evmos12nnkga5ym3005uvv5gjs0cy0zmlrvm2kpw47qu", "387930278080124160"}, - {"evmos12np6jrnnx3m4qtncgal2hy5wdeugla7pn5txlh", "177766940290850304"}, - {"evmos12npl982q7q53zc0p29epmfhy86y7j2y4fc7qzs", "1875693214563581952"}, - {"evmos12nr7e3wxldtq2ja79m20cdj9lr6j4w509dw5dx", "23382148249567305728"}, - {"evmos12nrw4arvfnx8judguk387h9wt0sawns6utsm75", "2242271766423924736"}, - {"evmos12nt3fyqctq5jw29vz3hwl3xj2zuhfqpd3yxmgx", "1427785389956005888"}, - {"evmos12ntrvslx0rs2mj9wwctwv00z47nvqg5seaff4y", "1168338925890619904"}, - {"evmos12p08yajwhwqps9ch24wt7yqsew30hkut63883p", "2020579413825385472"}, - {"evmos12p2npxdmgnm53066kqeyp4hvxlpydne4xsemm5", "5146999328165510144"}, - {"evmos12p2wdhlztplr6ql066jxn7pc835026qkdh4kyp", "7652619772412813312"}, - {"evmos12p4nt7sqz4txc96kw6skzyg5y040fyfzm9tkue", "10135010672618622976"}, - {"evmos12p87l48ts8nl8jqzvegssseak23zslcxpjsqc3", "308291410823695104"}, - {"evmos12p92k9cq8pw8gheyt5sttthh6jl8nwvjecp04q", "755716146777423872"}, - {"evmos12pd8rsd2e27y4lvzqndatk5ypv3t2su43nc8zq", "4742763773111605248"}, - {"evmos12peceu52glcq2d763naa93g7lsuy5y62p82ylk", "14698236791831031808"}, - {"evmos12pff0pykgnu2785csc3sm6e9m4tw9ttwe2utaj", "20847605717395308544"}, - {"evmos12ph6kg7guhv7vf9qe40qtpxwq0lymfa73pxx4d", "357652425978753024"}, - {"evmos12phnauf05k6m029v5w2wrvppnln40agw5r4a3a", "19869997769352208384"}, - {"evmos12pjt6jgarxe9z0e050ffy3cu68909a966q28we", "13900971393567682560"}, - {"evmos12ppldlxfefeah398870zjw399yxp42j9qmhvmf", "400577217876508672"}, - {"evmos12pupzprke542p9skpuke3zhgpt40kkhyq7jcme", "1150738142254690304"}, - {"evmos12puxcqprcw9u6tl3f8snr8x8jhmuvu0pm8n2nf", "18797873788857102336"}, - {"evmos12pvmsccv94gyup7cn6nv783ge0yexf6pxeq7jc", "6738617468122975232"}, - {"evmos12pwj6wte7sdvppy9r2ym9mc4ffjamzs0769zv5", "883932619605884544"}, - {"evmos12q5amjwtfq0a2lqzq967r5jysengquvjwat5gk", "13231583921876123648"}, - {"evmos12q5urmv4nqpgtxp634y2a58d570ngs9ezzt9fd", "4997403475273359360"}, - {"evmos12qe9sqg8f7truzxr6g7c6n70fqdahktcj5c6mq", "510940612683464704"}, - {"evmos12qgj0r99vqjukktthzdj6jgl7nsphxxqt64eqq", "10312903464277282816"}, - {"evmos12qhu4lgcwwe8sysh5xkq5ph76pq3j28yf2et6u", "2366674056832628736"}, - {"evmos12qjj7aq3qxkhjascnteuutcx5ckmrawjqwrk9p", "638318805076183552"}, - {"evmos12qk705numsuq89zva8qtf0aee32nh2a34cl2mn", "231929866544078848"}, - {"evmos12qldh6kran02330jjma8weqn8qnmvyssxq237y", "604970012158481408"}, - {"evmos12qm5gcn5qrxe6fd78rgszs3plkzz86u30vze9a", "9226924716381335552"}, - {"evmos12qmpdnvyx3t3ssx76tkk0gy5lkt7nxp2lkcfkp", "13367453582630035456"}, - {"evmos12qnnzqypuvvdg5s6h4yk00j9zkkc5q3ajawffn", "33359695146387243008"}, - {"evmos12qqhl3s8m2t9kmw39asu3fjkphlzm7f82y9sx0", "26630577640949235712"}, - {"evmos12qra7gxhs67qc69spqhj6p6k6cy5za0yz3yhwc", "100097678065860096"}, - {"evmos12qs8x0ad3exczv6rf5aszd7ekwu26nflwmne2g", "1200049949291765248"}, - {"evmos12qsjpkj5ktg5yfu22knkkmhck5j6r3f044ssp3", "8015266626522589184"}, - {"evmos12qtn3m4qvqur2uvqh9ha8prw8r82kzmxr4rt39", "1776427222864175104"}, - {"evmos12qymcs2xerhudrty080zehwp4wpz854cv4f7kv", "3365709498798383104"}, - {"evmos12r2uc43cgx32lss9zvuk7mxzxwmpeyendtjawx", "1473096655756786688"}, - {"evmos12r9asvg56kre0fycnak06cvw0e5qc02cpnhyz3", "7104825983824322560"}, - {"evmos12r9w4jmqpug0ll6cskps39m77dsskyvmlp23fk", "1044399431780685824"}, - {"evmos12r9zrp2slcga25ne5uy9shefs9wc0rkxvr3f4z", "1972902898817600512"}, - {"evmos12rc8lgpmdxnr5exjwz4ffymeyysccemxktmhkx", "12808674969657786368"}, - {"evmos12rdh730e37tckvmsr2e43hc9h2wqqrvdlmwdt0", "351422175410251520"}, - {"evmos12reecgj2556404lryvx08qrg9fsqd6n856gzeq", "674734324863293952"}, - {"evmos12rfq8su7fqrwk92tqjpkkkm87fwgg5fty47yq5", "3292438221801086976"}, - {"evmos12rk5l20lh35j8hx3c9jprxyyl03vmwg4urn70m", "72827275446069760"}, - {"evmos12rp7lzvma4qpa8dc8aewjgzf0qg83whj8tpahw", "13930301512233639936"}, - {"evmos12rqpsnvrduc68k09txa8rmukrt57jc29jrxskf", "1234937797769689088"}, - {"evmos12rtqd7u8dznu5a0evhdc2wp8vnp4dsxnus357r", "18305474418603835392"}, - {"evmos12rujen6lngwz3820k6jzd2kf54wcgg9hezxgkv", "1199710931239728640"}, - {"evmos12rune7qz3v2cwamat6pq7hap2rgkdg2fhhf5ht", "16534387952171593728"}, - {"evmos12rvn8u4shal6j6cvg5qwelcehvad5l3dzmd8hr", "8321091926342735872"}, - {"evmos12rxyqancfamvyk3cmz59ud04cpa9d54hj5njfl", "1535201618146224640"}, - {"evmos12rzxelz24dxyjfzmvlqe8x3ut0sptdr57lpul0", "5931869383486099456"}, - {"evmos12s02mffzxrnndx8j5uxqtvq876dhzes8fcccxc", "2397770580651491328"}, - {"evmos12s2ep34asksvzj3t2jf55s50ay6kv2p6s5mslf", "1045344600415062016"}, - {"evmos12sa0xqvvlfhnykku3gecy6x943fhmcglufufqy", "631033875064261120"}, - {"evmos12sd2rs0w7l98rxfxse0qlzfndallcrs9td7kzh", "12442631091819063296"}, - {"evmos12sdysw9vvaqhxpl4w2xnm4gq5vyru4lrst7fw3", "53229803644131328"}, - {"evmos12seletna9tml2vtmtclj9lamzcrdk4f9kryr0u", "27303334890375319552"}, - {"evmos12seu8axcw2h7cpvz0uldhvutrvyh994ht2pgza", "423410316962473472"}, - {"evmos12sewpmw8cl4yw6xlwz8snt26u25a07gj39y4vx", "1181099492493636608"}, - {"evmos12sfu5vnxs5ez5524zsaapg7668yhmnz6ruc5zz", "467665265421447680"}, - {"evmos12sgk8t0s5t5rpk0egpmrayfgqlg6xk04dyu3rk", "30738954039482589184"}, - {"evmos12sgvyrerzn7wx6ewuefzjuw7nf33v3edtm0ffj", "385957476211099136"}, - {"evmos12sgw8ckx90syhx9wxjtjjj9lepvc9x9wwn8d4d", "14647399653860212736"}, - {"evmos12shmaga73s7l8jgzdm6pxsy5cwqwftcjeftgrv", "2529609841398946816"}, - {"evmos12shrjz5c5az0evs9ar0gkddemxmmty4mlct9du", "1028281989430408704"}, - {"evmos12sjg4ynh2nv5tutxvr4pxjlc7428rtvhnwvufm", "1729371792315088896"}, - {"evmos12sjmwf0jvs5ulrenpytncj024vqn4cydfvl4nu", "5066062600001257472"}, - {"evmos12sk9vjx5v33zqla63f9a0kysks25ku303kqd0f", "15133685851108225024"}, - {"evmos12slfgcaekdwyqjl9kqfnswxym0pp49y4p4njcz", "18418641063535120384"}, - {"evmos12sn3jre8hpztw8684f82zq5tw0spyfp9lqc9hf", "1588403041636186112"}, - {"evmos12sry9zzw54m5s4nrrws3g94umle7g2np2thyak", "597104740011270144"}, - {"evmos12stelhu6psv4w5jtan6swl0l58wddz4e08mgyl", "384878744872476672"}, - {"evmos12suh09hteg9qawvekrex8uypm46y3jrh0ll4dr", "65275860374438404096"}, - {"evmos12svvmhypyywexa6zckzy4c2redqg2rg6twrmel", "338669339919592448"}, - {"evmos12sxx65h0jcfj34c667lnrrrrssruql5a6xyut7", "3251888858539982848"}, - {"evmos12sz8rlcyeac2wx6ph0ntlfsq3alqadprw7lnlm", "3203886004528037376"}, - {"evmos12szvh8txutfm6a9v5zjtrfrugk05e9vdngxf6f", "1041444356842607616"}, - {"evmos12t0lpagrw9av99mzmc48tlmwymqpxs86ukkh4f", "6378856451503364096"}, - {"evmos12t0xdxmjuvg7ajwjc4rv4z6dn99lenr9sd5fxl", "1719810662897532928"}, - {"evmos12teqd50294jes0tu366y3mzjdmrxhy73r4z0kt", "726813982682835968"}, - {"evmos12thvtwm77kma7ja60dseu729ndusrws3vhen82", "4967513590940024832"}, - {"evmos12tje56a3m0avn9g4tzfvjgn5rgw4fsq8vnsxwd", "12194451972895686656"}, - {"evmos12tl4f9486gecnwf04rgyzpnpmekqtpkzkke3r2", "21861738835466313728"}, - {"evmos12tnr4ka5lpekwauj79cw4z24zra6ea2nhmlwkj", "1413075514714031104"}, - {"evmos12tqxevsu5at93kadawk56s9yrf80833m258jsj", "5742213651806285824"}, - {"evmos12tt7x9nc6ufwarq4efd0zzatcft7tds6z5xavn", "7538454646792394752"}, - {"evmos12tu7h8w7hx8ygh4yclx45yeknlxhwpmsh6rml9", "453977390107074560"}, - {"evmos12txt5gapa8xsc8v4tpftse0jv5qs9geh6l6q7z", "16549342345403875328"}, - {"evmos12u0433pgh6dh4z7pff8veg6g8gvqm8yazx394x", "2248496624438513664"}, - {"evmos12u0qy749twuln6uahrky7y350aqlvmwz3l5xe6", "4197912933280440320"}, - {"evmos12u2sust8duff5ffkntjl8nkpch9k420mdmwyfd", "1385570394205722624"}, - {"evmos12uchs44pnnwg48htmftljecqk4n42das92300k", "6233181978354216960"}, - {"evmos12ue653nwen3j7h9tvtpz598jxs20th5mt5440k", "395429410377179136"}, - {"evmos12uh003ja2hfu90uxmvafll2p83eeeaf7ayy0pk", "473596546823254272"}, - {"evmos12uh2wdaauwreqwvv9drvf4xxpzq4lu5lugdt8n", "450226598138516480"}, - {"evmos12uh3xkpum22wy03zf6jz8a0hw3gsd2sg5lyvhe", "7407880166266628096"}, - {"evmos12uhruaxr3xjp2wdhhtclhz7az9dafq7n9cmx20", "4258201298866285056"}, - {"evmos12ukg0v0gmswh377d34p0nwy7k2aguuxf90m8fq", "470962016397960960"}, - {"evmos12uq5fz2n8gsk2juzftk3m785r5h34lwuwg0ht9", "2374488834966541312"}, - {"evmos12usj2m87252nat758nxx9x58zf6zd8p4x06edt", "1601768864994470912"}, - {"evmos12uv9sug9xh27ts20usnen3k7lqlhldtv42tche", "1418496745257885696"}, - {"evmos12uvkl7va2xdxtenxtr3v3xyp9kkkfhhc5wh6t3", "4955283125892430848"}, - {"evmos12uxerycc0n77mq3cvpnzd58ze0htxn5rkwjy7k", "4941534603309059072"}, - {"evmos12uxvandztls84tz5n6r6qfw34gz876cfdwp2yz", "617476908120064"}, - {"evmos12uy4d9q9wglrvejkcu6x52k3qrgv7q7e9l0z4e", "991336508699933696"}, - {"evmos12v2aamhvm4w0qw5kyfwuyh2d095emj048tmuvz", "1600576214849826816"}, - {"evmos12v2h9vzugq9sjherd8gskrp3a7hc353chc6kaa", "214477538629372928"}, - {"evmos12v555r8kueur2swzmdmf9wd7sa4kzrqqllzj2s", "786136256871553024"}, - {"evmos12v669zwcj9wllfp508v5ku95nu2l50evtz6u2u", "6043312145808089088"}, - {"evmos12v8duxuvjvw7z5pjr5naqvshmypt76jjnhu47h", "3498115366012674048"}, - {"evmos12v8grk8ycuhty3rtjt97xuwhq9p8d922vhuzp5", "14637423303093301248"}, - {"evmos12v9nxhzn4v708798jjujz6xzwhy0ms5ksxul7n", "772578283114363136"}, - {"evmos12va0myfy0kevxdf9d2n4grmvcszfaalvg5a0kk", "11572150723054964736"}, - {"evmos12va5ejclly9r3rpz6444vx7atnnrja7hcvg7dt", "387379287915103744"}, - {"evmos12vhj2z0zsh9kwhqqhyeal4u5za5accpuhpcdkm", "1554040820611749632"}, - {"evmos12vhjj4ls87rl7enljdk4mclyhve4t25j542zgq", "482991624401100800"}, - {"evmos12vknzq9qq0js53nkf85d4k7sxx646fsptxre0f", "20885649646392737792"}, - {"evmos12vpv2mqp5x6wquaesyqzstxygda6cw0umpsdr9", "1466722060840852480"}, - {"evmos12vqs3z0vjvvyc8kyxz0j5l63mv5nl4cqs39lhy", "404952920245943296"}, - {"evmos12vueqrq2wrrmcfxnyh2p6gq6duj7djfjgjeqhd", "42263351199782535168"}, - {"evmos12vy3gkyjxmuhzfj4apjl7v5pwyhgtu5xh0xfsv", "1814670513286298624"}, - {"evmos12vyn4de56fjvxzvd2m53pctl2lxjc9y4fnlcvf", "39460967117815808"}, - {"evmos12vyytfj5qw5tle8at67r5r3huldnvp6qlxhaty", "1348112858800410112"}, - {"evmos12w2g8uc5jfqvs8dl0mr6xgraqkagsx76txn5uq", "1627721876692639744"}, - {"evmos12w2m5rfj382r8zyjy08mtk7cd8ppwc780p76vq", "414226467852998912"}, - {"evmos12w465wwflmqws82du90zqzecv0np2udxha5tzc", "1218146569593309184"}, - {"evmos12w48a30vdnq4plnvmnc0mhk9pc05su7xay6qq3", "388281486142117888"}, - {"evmos12w4m4ne73ay35puuzczne2sr3qazzelpapecrm", "384428657751977472"}, - {"evmos12w5zrve4pfcjgp48frklpxr2fa9jhzsj3j5rwc", "6357919469284896768"}, - {"evmos12we26lpfshe4xn8d4sqv5p0ycl7halvapflvuk", "32071592054376960"}, - {"evmos12wgyd4jx7vy2qtmsxapsma0ag4d74px6qhvfzq", "35403308400699195392"}, - {"evmos12wk3xwt3qk4lu7kujqfyl0v5dp6nacgdvt07ud", "155696297147100160"}, - {"evmos12wkfcaa6eaptvzkft85q93jxw68ml4tctsxj59", "416301302911350784"}, - {"evmos12wm9xdydzhhlk48ge7l4855c0dc3kvcmjyjl7v", "866197088477051904"}, - {"evmos12wp2quumgl6e9tcuz42ec207pjjyhx9n8u0pzu", "6421442153018098688"}, - {"evmos12wplpl8jcrzfxzvd2gf4qhwjewldkw0vctst4z", "163817589863709696"}, - {"evmos12wqfy8xa4jmnkmt8q0qyx5zvz4unly77ckucrs", "4384549926712953344"}, - {"evmos12wtc96d5rvc2jmt79vc8qdd860v2m205m6jh64", "11015998182469738496"}, - {"evmos12wugj9j4h3a3eucmka2xryn4ld28chx8ykggqp", "2330164758263242752"}, - {"evmos12wwxgf5mq5lqefcsnu99x7cj9axyj37l48hg9d", "1415196487723180032"}, - {"evmos12wwxtwxwp25uq8vmljm4sw0ulnd6v22jmv5zam", "18410158356289449984"}, - {"evmos12wx786we0vsfhnt4fyylsv4p8gepxzu5v0cynq", "14974335051065927680"}, - {"evmos12wxny2k3suxftnflqqpulgqc3nwmnfgufmu740", "1057583498486090624"}, - {"evmos12x374huk32wdxzatqu97gsxhld6mlal7lkuruu", "7644149415850426368"}, - {"evmos12x3mmat3nw56lh3esxg0zegrt9dqsw0h4f5h4u", "368879575362353152"}, - {"evmos12x3yq5emfs2rur594y86lkas0ract6c8a5nj8f", "2636575655046406144"}, - {"evmos12x4vszpkhpd0uuyw5meh672zfvcyhr6yhy2sdy", "4278078151407607808"}, - {"evmos12x807s9qrh5clxcw2pk2ar457jxkn93j9ydrnq", "23960330258167169024"}, - {"evmos12x8afvwxfzpraqyqzzphtzph8gxclucyyfp0xt", "3746488494883207168"}, - {"evmos12x8hu95qaf9h95l8pwlv9074h6236w38e4uf6n", "40980530862821031936"}, - {"evmos12x9chrues6n4qz5uh7am55rdthsn687x2qn9ke", "9166113383027044352"}, - {"evmos12x9pde4yf8rn40d25u2q5yx3rlqwjlglmvnkec", "5059866512246558720"}, - {"evmos12xd5lnd3angrlt2wqspfzcv05sgrm97c0xrmns", "2840312399633735680"}, - {"evmos12xdwlde46nn56g44r9w80ccxy8m7d8ewh75gg6", "5752398080256"}, - {"evmos12xdyvhcr768c5h64fzhkufgwagdnkvf9tvelkf", "474717317605993728"}, - {"evmos12xea6qnw8qmn2tt6pma5x8rzcxrz6r2dr4tklq", "388027104652189696"}, - {"evmos12xf2nks6r0qyqnw9xg37jks2su9y3km8ud2w3j", "1133799639647924224"}, - {"evmos12xlldugke5wehlasyj9xdxaase34myhckemd6r", "750716812291262464"}, - {"evmos12xnaqjk4j443ywnptku35dzlz72fan74hws275", "463025982307044352"}, - {"evmos12xp3hdvwlurdf7lzsenqnll0zse5fjf47pgqac", "1225103465184658432"}, - {"evmos12xx675k63um5n0mc8nqua8m2k7t49wfeds0e0l", "2453595943179541504"}, - {"evmos12xxdpyl2pnkgczqp8qwywnf906v0uu4qgg3luy", "1012305910132207616"}, - {"evmos12xytxv7cny5ynuvzcx3emfma7gufr25aqwgyg4", "875751837616717824"}, - {"evmos12y3e6wxq40e3mwkf6uuq402py7cppzhn3z8r5g", "23248278122328567808"}, - {"evmos12y6059cshqavrjpchr4gfvjwy4haycy34zf04s", "5704315854100711424"}, - {"evmos12y6fs86hkzuw7tn3c447muskry7r0ldxlgweqj", "80956790552686821376"}, - {"evmos12ya43x7xjc36a4dgjucxp2saxld9lcanu6r69g", "451834446816509952"}, - {"evmos12ycg2g0avmmps6ckxyqkhh8sx3phly8c83qgee", "13587946827522048"}, - {"evmos12ycv5gyr6k3lksxljgtu70neq67w5z49grlvgc", "1554886475029102080"}, - {"evmos12yhw4zm084hmcxpuz6j40c46k625qhd8ph9j2u", "385647248179938560"}, - {"evmos12yjs77suc6rylns8xazpt2m95znsk5a9sjxt2j", "1347325004754812928"}, - {"evmos12yka2ux5h9f449sfjthlqvldu5rtrdxh9fss2y", "9217411020212191232"}, - {"evmos12ykhyndhd5gf8cgk2ktpn6l3yah0dn8qqa20nr", "319011018849048064"}, - {"evmos12ykjtp6pyx029z0s27x4gjxa45kkczvjwgahae", "2168416653387931648"}, - {"evmos12ymvmlzd9vd8ga602ymsjhuzlz90tmyeqf96xw", "476046277911052288"}, - {"evmos12yn0q53rxwql434mexxadp3r8u397x28u7l6ey", "585162605854514688"}, - {"evmos12ynmmtmclvkurajtwg699ykjglxrx6g0xhaaus", "160532883297747968"}, - {"evmos12ynt557ff9jus7asgxtrup3jkczrp6lmvy5xep", "740186137387779072"}, - {"evmos12ypxuxlphqhg5gqj0ksl6sl3qc3kxgu5fjhs8v", "5713625112862664704"}, - {"evmos12yq63tq8v67mztk3wfczzj325qklajjvtnzpq6", "30409445677493760"}, - {"evmos12yq7rd2nehsxam0xm2aw6khtega6ktvzzj9zh4", "3560016009154472960"}, - {"evmos12yqxtqx7y8f3mv5fh6xu0j0kjd2a6w5w0qpqqn", "716216478079745152"}, - {"evmos12yrz87y9apvugqx30y47ft3zwx8xltqv9ncca6", "1219259961429883904"}, - {"evmos12ysarr4wp0jmk47khdus02w5nk094u00ql6t93", "2110870775414488576"}, - {"evmos12ywma8nt0m0xql686q9xsx74c7nd89ap8uscsn", "298926191822512128"}, - {"evmos12yy2t9hl585z752yxm7ref8ajdxgwvhaad9hc0", "1577437069795515136"}, - {"evmos12yyqkee7g6z9m48t9dcqj45cplkkpzhx8frexh", "84650080846343168"}, - {"evmos12z2ahpz350hhc787s7ary3sh6nqwa9z5kwuzfr", "29773348061846831104"}, - {"evmos12z2eme5m7kqmdtr5w4dqplhqr3aj8yvwusq3x0", "84080069891829760"}, - {"evmos12zau6ktz0sft0p58dzarhkn3tez4dvrgnyrh02", "34063832784628199424"}, - {"evmos12ze9r2vfn9nqrs36jlkqzzv85zymfk3z8drzr7", "342448922530095104"}, - {"evmos12zgdpfhypmwt6u7e8l5p95233zzsx3rkt3727x", "25472487681740288"}, - {"evmos12zm3sa9aveemj797xwlt7wwe47w89nfjqvufvc", "1272682922249201664"}, - {"evmos12znl5xeeamysg00p3crhq0fvs47dcf03vl2adm", "86180295552432128"}, - {"evmos12zpksg40jjacs02jacvqdq4kqddjvq75leeuhr", "12939154391671611392"}, - {"evmos12zqpew6d3z442jus2sspe9eynrd3wjej4d6yma", "7669115638992370688"}, - {"evmos12zurz4udzn9048telcsnsxuk3senzg4u5ddf00", "7272493807290165248"}, - {"evmos12zvmtucrrsrdaher23q9dzne6j8608m5q4zj3q", "310048312926541824"}, - {"evmos12zwq8pcmmgwsl95rueqsf65avfg5zcj09nk948", "15962506391295361024"}, - {"evmos12zzcvh3gmcx2a0nr63xeft0zd2l63cvalrlh4f", "19764375852264972288"}, - {"evmos13046qcv4h8g4fjyrhuthdqa49uweztqghrawsw", "1108759692739315712"}, - {"evmos13080z9az4nsd5jy9eztpngd57ryl5hc6g6w75h", "6888258355213844480"}, - {"evmos13094964kegqggdeszj39xr9z667kmcw7aas6ru", "2640749852966583296"}, - {"evmos1309gag5mwgerh8n4afu4y2czpltuqtr97pc5z6", "6133028964166130688"}, - {"evmos130dj9hhr8xhsh7wckxleskrxvjl5d7rx3lsnj4", "183210739936447488"}, - {"evmos130e7m9vgv3czrtyz0krak3vk2hm87jcxsjntn4", "34782975488728760320"}, - {"evmos130fcps3effllsqt9qqv4kv4k5sfgjlcul5mu48", "47499941755469824"}, - {"evmos130gwzppyy408r2cc6xf9q0m4rmmzzeasg93avl", "803570363793808896"}, - {"evmos130kl9d72aczqr29wf64mrg33j0mxq598n795ng", "3629131972411084800"}, - {"evmos130n24xd5u3v2zsrlhn0l9j6v6yn2rduyl48khc", "1531630953878895616"}, - {"evmos130pujnyvm0t6wvkux9wp5qal96e9mgvmlarc52", "7174626012713762816"}, - {"evmos130sw0redf73zvt4fshu7k0652cjjjhv8e8tvgj", "384223010796675328"}, - {"evmos130ug0gvdw8galpkler6pw3n3msqdlc8n8fma2c", "90943841957688832"}, - {"evmos130ytfeyjzyqme3twczztjpsxndeauunkfdvd0q", "9371365412876812288"}, - {"evmos1320kpxf9f9rds7hmh92nxgc27m2d7jvf3gzx03", "1242836886844030464"}, - {"evmos13232dnc6ws3tnuczcmfsdu2pjqzg3dtp82kpxt", "58897439902315008"}, - {"evmos1326wx95vjgdc2c2754cte97d85w0w5vlsy4yhr", "1518459423862226688"}, - {"evmos1326zkz3f6swqcpegt7r56r7hq9fcw3xrjlxmjk", "9652806624510590976"}, - {"evmos1327pd6geccw4scanf7fqm76dcj5hhupk9gn7v2", "17388897788731322368"}, - {"evmos13286fa2kw0ftznc0szl8nxyqu44vdnc2rgtfjt", "6220031417667469312"}, - {"evmos1329wd7evvfva0q3ngev8yhv5lmlzwm6lcmw6vl", "1616009742283915264"}, - {"evmos132a8enze0984ezketgt0x8dudluazl0z5m0se7", "1916373495297771520"}, - {"evmos132ajsjyxv7azp9l6adstwhulfwkjfza4cd9xtq", "30254942659423764480"}, - {"evmos132cel9fq6dtkh5tgcrwgvhudn33r3zchyxu2f7", "70176168277010432"}, - {"evmos132cmz2ulzj7t5we5stwzluqqywd0txsf72s435", "385205288007635200"}, - {"evmos132hplnzfyn0600sh2jar9ka0qprzmcd7thgs6l", "11395090847267690496"}, - {"evmos132jpvpwz3f32gs06rg9h257cwzgt20zmtnhfr4", "2238381732243928064"}, - {"evmos132kecyd6jklgxfavzxwe5mj3zjdkyvetgym8hl", "794278355536678400"}, - {"evmos132lju2gcuwwlvmm5lguel6ldegm5nrz75llh45", "21910825784183336960"}, - {"evmos132ps7yz6gtnstnlr5q54ml8awfv763ts50648y", "4896102454704834560"}, - {"evmos132rcy9w5eumywaahtd8rtmvwqp8aehslypx60v", "883620902555080192"}, - {"evmos132vju5e7tljjzpvdcv4z9us5amtp4xcnyeczmu", "401551372798949376"}, - {"evmos132w75fkezw4n7qf6hqh98afyhsrf7r3yaq67fz", "1487706158864772608"}, - {"evmos1333l4nxz6nx4tstg4stxhf9e26uqwgp3xcxtph", "369479775219465472"}, - {"evmos1334ha68rl8qef0v3pu63syky4wsgfenam05aqq", "384492501976935936"}, - {"evmos1334skg3qqwchzp0x9z5npn9kwfckutflvm853w", "327347136849512448"}, - {"evmos1338tdxy2rxw6hjhqeccs22el8tzez7r7wlfjku", "8725640816968769536"}, - {"evmos133df6d5ud78yzr5wvjdkr726dtr4zesy6wtsy0", "89059564601641984"}, - {"evmos133dfkj0fqhz80tdgndtrvz3qe7nxfgsk7exext", "3141465952885486080"}, - {"evmos133ht2pu2c5nr6kq630zclwlz77x7qwppff7tkp", "2814830458066527232"}, - {"evmos133kysaykcj5u65crp27a6ntrkxltayhndfnq5e", "71245283615588761600"}, - {"evmos133m8ejzvtnp66dwu5wv3nkwrjphyuxvcva0uv8", "465299886756716544"}, - {"evmos133rpzshlj526xw4krq8ltxwjve30cxsu93jvtl", "18440757983423045632"}, - {"evmos133uh4zffrvqy2tgdswrju5ss2ue60lvfw579jv", "6825409490722295808"}, - {"evmos133vdh29enl57fj77sl4gxcrxwkd425sh9w24va", "16062910352212475904"}, - {"evmos133vhnu3fkjz46nmyecnlx3ep25xff86scguu7w", "3038294264129970176"}, - {"evmos1345eaj4u66s9asdl5ygn02eam5rt0x9hs042hk", "2144977480553940992"}, - {"evmos1348e5tckhy8jh3rkdr8kktv0xunps5ydku65ep", "802236467399222272"}, - {"evmos1348krpadcscffaxshz84hqn3z45nkkplkdv37w", "39839793189665024"}, - {"evmos134esptuc8mdzyzyqvtjr7t7nxnnvhdy22g8t7a", "10479993038482386944"}, - {"evmos134f8z6nqmpw5uwrjw692mysruc5v7ra5sreztl", "1790991562406498304"}, - {"evmos134h5mg9f68wdw7plkedg83pznu8el8ajxnk2w7", "2462267636983169024"}, - {"evmos134mmmcpx293t6qyt7veu5xc2zem0j6td5wjfs8", "3021359129813005312"}, - {"evmos134mqahu3w7hp26k3nrhnylkl3d9v5fdq5pdsd4", "8290448711691819008"}, - {"evmos134ug5yumakxtf7hwedk4y5fqw7a0mqe7u66cz2", "245439518634976256"}, - {"evmos134ypckw4m7lvrkh9jzszy87taxpzm7tkjj0nft", "740887430854895872"}, - {"evmos134zdddyda004fae9tvva9s9rp9tgm8uwtl0aeh", "1406759751878975488"}, - {"evmos134zjc86t4cu9kyun8jp7elms6apzny2lka9smc", "10199696124141150208"}, - {"evmos1352x3pv67f4m3jvex8yfyuuwhqskxdt58pmcvl", "6655632273908531200"}, - {"evmos1353ep9xfa0hw8wjr8fv70av72j3kcqxsk2k646", "2047024876687704064"}, - {"evmos1355400q7hm8npked3p04869jx7x3d3sdwmkqph", "384777325807308800"}, - {"evmos13554chwpf7nhu8wv0x8nypxysvsktfyleuh5vq", "844098293133487104"}, - {"evmos1356qefu6lcld2gwa3e5rn2yjw8k08x35q9gpkw", "645071638847492096"}, - {"evmos135944pwpw7d2p2fa608fz6qae5fxy2mcwvj0vt", "6794161084619226112"}, - {"evmos1359tcp3ra458wmck8rly7xkzmq8d9zdv5lv3nz", "8403260065379909632"}, - {"evmos135a74q3lytalupv9wl9qr6dgs9sw9hf6nnl08a", "14247115774243373056"}, - {"evmos135c82rgh2s5g36cepsv6r3s87dgp0dmr6ww9q6", "48898651997288087552"}, - {"evmos135g68at4f87p6pp0qu837a5mcd70tmz3eylcsv", "1799488669835842048"}, - {"evmos135gj542qet30pr2g5zm5fhlajgf34neyr9fgsz", "740789782607678464"}, - {"evmos135l88dfyzlj7q8s9hdg93gdtsvq3jl683pfxaf", "369374179156885504"}, - {"evmos135lxy8ttaxyc5ugma3mt5wussau26z464u9sud", "418759088609958912"}, - {"evmos135qs8vy0ng69fjgtznzuefpt6rgrrkqjnwf54r", "1031095871846785024"}, - {"evmos135ujupstkf5x5k7ym85g2a50z8lqynchvq9enp", "9191117640640467968"}, - {"evmos135xlwaf69uk0s0s4x67aqm42t7hn83vd8px3k3", "108847507030959104"}, - {"evmos135zce0jjtvrjs5l8ctt5nu5sg0vhegcwqpfecn", "1962938459297898496"}, - {"evmos1360ejtzcexx92ldptghd4j9u5qzpd9vdv4vagr", "217241241732051968"}, - {"evmos13658y8e8al92hvusrmt82eg94wrn79d8z237kv", "957326039127644160"}, - {"evmos1368pesnmvenwkenx4ewz49kh4ag6mrp2y3z40r", "3991233165418823680"}, - {"evmos136f2glya08x8eke8t0f9fl3ef3qxrkky7pzk3u", "871054302609629184"}, - {"evmos136fpqfnt3fzea79he2lrma4dqwq73gm2wmaav8", "5409926498692098048"}, - {"evmos136gv4k9tpgte9jxxvg0je6n55lucxr0j0az34p", "383959352677092608"}, - {"evmos136l3k86dyh0d7h9l2skd8rkvc2v3zjc5435vpg", "8793634221604057088"}, - {"evmos136mmgtl2496jlusz9mfcs9d4gsqur2djnke3xm", "4464152353478180864"}, - {"evmos136mu0hj33putn0uh58kcmyama78gw94py392dk", "535630043005917184"}, - {"evmos136mu7xyquutsqsk0fdl44eqv8ex59ytre73hkp", "3708825915660599296"}, - {"evmos136nhnujpsnvfxq70sx8guw2xt8ujqyjxl76zex", "8706518409728139264"}, - {"evmos136pspxypfmshvy4tx6ajhp3jenjetnmzgc9q22", "2386344465401984000"}, - {"evmos136ruq299s2c2v0hwjm4wu9x3t6caq4wwhsq80g", "2369902432437310464"}, - {"evmos136tv63m5cmdye8rcystp3makz8hqmkmln8vvnn", "3369324114853396480"}, - {"evmos136u5lr03adylqkrdyd4nzt37k3n2vrz97naukw", "467351991510918912"}, - {"evmos136vu9gk4zffpzc7v2q29rn3zwq99u0aaevgzke", "230009714445903872"}, - {"evmos136w52r8cwsw3748hp54z4r24ww8pfdface8q7x", "2331542986447457280"}, - {"evmos136w8k5yhvm7xsgf9wd7zpg03paxvv93vkt8696", "571598971812581888"}, - {"evmos136wk2revftucs259sthhaxae8h038v2wkpv053", "4515207311357191168"}, - {"evmos136z84stlsecq8nxd5367y4k5f3jlewvfrk2nh9", "3753460579640055808"}, - {"evmos1370s53jdz05dgr8yxweqczf72zruprr8hkz74l", "5629397680422191104"}, - {"evmos1374jg0sdygf5jqj7pa5ywcmua37hx04zscgaz5", "354622885295663872"}, - {"evmos1374ns4q8yuhzeqdgk7kdhkq9fyqmcmgchqagvr", "85050105584252928"}, - {"evmos1375hx9vjawuexff3r2xjftr4m20gf5axe2eaya", "2197857596533343488"}, - {"evmos13760dtsfzpgxxz7vmc2svt9l23adzumj6gflg5", "6211394522909190144"}, - {"evmos137c6r6lhqvxm24eth2k6shsg9md44hjqz2e9er", "1211448611229088256"}, - {"evmos137fcj8n433krggzseqcnyxj3ql9ylhczn2rjdf", "101839708013976879104"}, - {"evmos137kjzlu2t23zv3erach2jw7gs926she6v92wek", "9461739312961394688"}, - {"evmos137mdhpl4265zq7rs40fl4ellhw42u7e5tr4max", "1914823283986730496"}, - {"evmos137q9900wje9s0ra6eedu3j35rsqxdl26m8fwzz", "35294023750158839808"}, - {"evmos137qxrg0emeq8uvqwylpdd7wh45c7p4uvzfve8m", "12719365553088249856"}, - {"evmos137qymmyqq2xttw792dmk9vnk9xj2kmy5pcynan", "16862822302624161792"}, - {"evmos137rktqfwdpucwmh036cs8zk7v5gexsc20r5esr", "4794769530352762880"}, - {"evmos137tcuuncmf2hv9ntsky2fhk4gr2p4aj2qcsz96", "2548404477588036608"}, - {"evmos137x66tt8yvgvce7v2qy9zr4yfzfaeqx5y7kwz0", "3328528055051755520"}, - {"evmos137zph34hhtypyrld046u5clglutfwttddp70hw", "3876269597799636992"}, - {"evmos1380tz4790hw34jy6rap5a24xn9km6tm6pj7qfk", "1194614284013271552"}, - {"evmos1387g2dlgm08kac9639jlqnqqufqdq5y980jgsn", "4164838030291258368"}, - {"evmos1387mvzdur3ljmr6hwtj5lup28jdne42syh0w33", "236353415452088832"}, - {"evmos1388kj890lpv7ex2r9p34z6pyhsfjt2exe8aaqs", "9176862382417571840"}, - {"evmos1388pds0pmqfjre3nhnyasphsyen4xkhv7rn0n5", "66486695063563591680"}, - {"evmos1389v7cc9rzspsqwugd5r86rvvtqndng9sceqnw", "48776265053986048"}, - {"evmos138g6vca484whsv0kwuvl9ljfxtuz28uuvc9y3q", "233960066794780672"}, - {"evmos138hygkyct08fcps64p38grjxts39u4027tf5sc", "369469493481241856"}, - {"evmos138j7gs8rt8lrqeqymh6vf7palwhmnu6w2yeltr", "4811579588994910208"}, - {"evmos138jsyxz954feff4xg5eshf0v6td4k59z4vw5pr", "20589219853521158144"}, - {"evmos138kzuvup7xrd5sxs8zw92qnpejt9y9rs39yf73", "228245605523331584"}, - {"evmos138lfxd0hlm0vxpymjck39at367hfnn8m2xhcxs", "1398934743350910976"}, - {"evmos138mg2nxj77p0cecl929t4dx7tmfxnj2a9fyurg", "8876416472853248"}, - {"evmos138nk55awhs8emwh6d75wfqtq9u49kha55gm0s6", "819382289329797632"}, - {"evmos138p9l4jzhp2ahmpm8s4xcfn4cmcg4rmgl5nuqk", "115987744283009024"}, - {"evmos138qzqu9zlrz9a8s4ctlfpu5cyf3gt22055fhns", "1655920231394070272"}, - {"evmos138v9v68jduq38qygv4k7zfqhsdxl8gw627qyum", "384294623840255488"}, - {"evmos138vf9t33zqymyh9tswehnmpqjnscpqf7ng5z7q", "800628878984002560"}, - {"evmos138vsa3j2ja0jmdfq42v2asnaqk8r6w6jpdm5ve", "742443815918953984"}, - {"evmos138xh2d9qeqtd7v7j299vzv99vjc620y85v2wkg", "738006962897068032"}, - {"evmos138y0a6rnl4lch5rex99xcnwdnqnej2cwdhv88x", "2910731685460886528"}, - {"evmos138y3u2d3t62spdxjg58zjuq6834nqc4t9ak4h0", "2176830790909452288"}, - {"evmos1392dldc2ese8xhfy79ulw279dfafqq4ymnk09a", "2365743356165177344"}, - {"evmos1393v4l2s5ke4fjuyn2d93ppsd9njvcz975zfxa", "3726398590573243392"}, - {"evmos1394erqm2ezvlhsg8er2fd6cmjmk535kgf4tayq", "6148766295854804992"}, - {"evmos139728n0323ftvtk8r8g4fh2g3dnlafl6r30546", "4225098290235949056"}, - {"evmos1399a4xclg9cctucy0c0vdug6mfllggq5gwwg27", "99990872446288384"}, - {"evmos139decx89w4kkk6x8dlq9ta47yeafr96dslxh5c", "7793998124955515904"}, - {"evmos139ecmx65u9a6hmw6jd7kavdzrrvcv7pmrchfv9", "5648443497053486080"}, - {"evmos139emr2g2muxw60d7ym02m4dpwmkt2j85hvlahc", "385033493911261440"}, - {"evmos139j5jtcjtl67hpnm0epnzuqyxamz8m7r3d2gsa", "728788433511670784"}, - {"evmos139jjvqd8kheqxtl5c4fvjflj7lecl7eg7m0yqf", "5650033134083897344"}, - {"evmos139mmtkhrjzw4ep5fs6d39s23enhljlelupkdw3", "1143974064669492224"}, - {"evmos139vc99e9fzcqwpsxhjktfu3se7n75mcl24cct8", "3554670624265518592"}, - {"evmos139w8j53pql3q92pc8wgu5rkaufwzgrqx56ca0v", "2655156233889607168"}, - {"evmos139x5x7u7rrzc3xskvpacrzr9cz38h9lkhmz97g", "34162010584789778432"}, - {"evmos139y3ld98lf8970sjg5fnutsy59qvetkkts9seg", "154195431620323840"}, - {"evmos13a042mpxvn9z84qdjj568ylehau9zzhpwgp5wv", "663822037195665408"}, - {"evmos13a0rrgxu999zstepct408yuhdlyvlge60ytzxa", "19369688559541817344"}, - {"evmos13a26n33j8ewc4kw7hslf9wtugh0ec0gjun3zrk", "331098332766109696"}, - {"evmos13a3ak3053rg7anzsssgazec2j2ex076ru3k5fj", "102550927554514688"}, - {"evmos13aeag2vdu8nwtfcqdjajm4ttq0hzunnr0m45l2", "26901369630197760"}, - {"evmos13aejh2r3zclqjaykydedr0uvlapf09qeu2f4q3", "477570782507735040"}, - {"evmos13afmutl65sqhqt6tm0nnpjhq9rfkpk788kumxw", "6438785677011575808"}, - {"evmos13aj4dah4c33t9dckh0tgqu8s8skryamrrs447j", "1670621486404298496"}, - {"evmos13ajlml6yu6m7grjzq9f5sadvmv7frnjucyua2w", "1211145654283899392"}, - {"evmos13ankmhgw9nc7csz8234h6lpyc6nj8kaszhc878", "410167279043092480"}, - {"evmos13asez08wegaegtf7fuu678mjxpefrarxlaut3q", "13749655050698432512"}, - {"evmos13at3wjpc6xk0zztpcf04h2mqjpw74kujle4umv", "420245139703420160"}, - {"evmos13au3hyjywqpvf2s37e6y346yftzcdlhw7p3jxj", "1136646336174236544"}, - {"evmos13awua4874flepaj2pxs7s65a7hk4zpqjvg4sn3", "4234126290418636800"}, - {"evmos13ax4zr3urknz2nahzmrrl0sngvaksl8q83xqgs", "80258649622714624"}, - {"evmos13azssd0vngx2ljhunqq0ap23km9tdat8696q7t", "818463148423187456"}, - {"evmos13c47xxznykvd92lcek6x8sscg7awj62chnkp8r", "15026244600000575488"}, - {"evmos13c4w3xzqrrhmdvtakp83lagpmpsygevljrrgkk", "6939978193610302464"}, - {"evmos13c86qjs0xkc0ch0pvp6uhmg7w6lera35c553zu", "7501195331840828416"}, - {"evmos13ccdc2h0j4a37lwk0vdhh3j3lln7z7sxnkzv59", "651868598285096960"}, - {"evmos13cneqq2rszdn3yv4tnwkeqm59nw9ndxle6wdq7", "3008026048972963328"}, - {"evmos13cr3gdmq83f3nrfw8997k7rf2ae9nxfjdfzpam", "1150715823531162624"}, - {"evmos13cu9rpj8cukuelqkj24ea8skqd6syuzmulf6a7", "1537643656686649344"}, - {"evmos13cvjhrjltkrct9h878qks2r5rkzlqg2wpy3k39", "5900016802975227904"}, - {"evmos13cvrqg2p68pacr3vmrhc4wkxwuqw9r6ela385c", "113085261025840640"}, - {"evmos13cw3p2h0nsxq6vm653cz90cdjmfpk44er79jyn", "157391307588497408"}, - {"evmos13cx82qa7576w436sl2g0dqxq6pfh7urvt07xyx", "32933440415399960576"}, - {"evmos13cyfv0zfd4992ypm9lxdcjmeug9zd3pq3h7s4q", "517050218727644160"}, - {"evmos13d06uhcuzvjrsa8ve8d924ryfd4wtmvwksj2xr", "619415306181487616"}, - {"evmos13d3yskl3urkyg6ft8p9g7srphnakvxhk2mn6az", "477544932418871552"}, - {"evmos13d4saw0pjnnmhl8ldj23xssp6uyfg2y6d26ctj", "3930979105774383616"}, - {"evmos13d6ghht967yqhtw4ukahdqdv4nxlgat20huqp0", "1605709307593183744"}, - {"evmos13d77n5ur6vwz0v7vk6luwj8nysszcy3dtu3chv", "2523428790183165952"}, - {"evmos13da8yds7m3pt6c0ksppfr4a96hkcuvl33jvq37", "472104799906107904"}, - {"evmos13dcgqtrlhlhrmmr4h69gcf5s0stz7nhxs2y6ue", "6101511238154944512"}, - {"evmos13dezx8g3yvl6kky4rj75hsnqhaskslgh3v84ma", "3217941945614320128"}, - {"evmos13dk5tvt5f0zq554lpmgywuuqz7mckprly4mzzc", "3624939538253484032"}, - {"evmos13dks45raczw799jk8cdvf38jgxkr3m2xl83xdm", "2753217462305087488"}, - {"evmos13dnatn9elrlg6h494cfz3h7z99kfnga90l2k02", "927995807909635072"}, - {"evmos13dnxhv4uqgnma8njmnsuwp7550tlsktjfuv7cp", "772407941855431168"}, - {"evmos13dpvgqu2u2r4077q83amtqef3k0jhq046a2u3s", "10465978102260480"}, - {"evmos13dv53rg5hzenh8ze4jy7vdk4ekwuqe44d4twny", "522685307429912576"}, - {"evmos13dvppvrr2t78t3wfqjaj9x664xjhkvalwsvs8j", "5252495074923184128"}, - {"evmos13dvst5unnn5lmr9f69qceu5uw39u4cpxh7e8ld", "1084596517021687808"}, - {"evmos13e0ssgy5mhvnj522naah87pej0w9twv9kly3hf", "2308819543284752384"}, - {"evmos13e0ys3ghzpcxg73wh0uja8ul9tmg36r55097t6", "611470736592449024"}, - {"evmos13e70d43rlzpkq0achraa2lzcr6z4vfw4cdzaaq", "358329920410755072"}, - {"evmos13e8g35vsy5lgmujvnmty8dqx38g9uex7sq843s", "1384182224503808000"}, - {"evmos13ea4d8hvydfy9vc03ypuph5skpxfd7u4qmxxrl", "2450488090405189120"}, - {"evmos13eaxr27w8dfpm5u4eelfcm0vl5mgxpv4jk7kty", "4557239129503626240"}, - {"evmos13ee7wgxamx4l89j6rz0hhl3tye63hc52g7sxt9", "1482244898343632896"}, - {"evmos13ejm2m00qaeu2ryxaudae396xjca7pqucncdx7", "815356376058161664"}, - {"evmos13ekgy439u985qkk3ydqpxjnwpndvnaf30nc36m", "1515505038967828480"}, - {"evmos13ekjgttx3gygpwjj8v233qxjy3s020tprtaqdg", "1162997421143005696"}, - {"evmos13emqpe0dza9jsw75f8ncz85mhzgz2u5hlh973q", "1836259346085336064"}, - {"evmos13epgnhla2reg2juaaevurl5walpuv6vl20ehe4", "75958188966971392"}, - {"evmos13eskdgvpvhn07tleuy5jftqw23zwfchk6ttgsf", "229143745426865152"}, - {"evmos13eupej365jqmdz5zkeqwv7vq7eaw0pffeeehje", "196795850963184640"}, - {"evmos13ev7qljndc662ugs4wrw9sq0tzsgfxgaf3gypx", "313536681590394368"}, - {"evmos13eyfk6g2m7c724r6yjmfdtns9nfgj4eawks7x7", "1630780918238199808"}, - {"evmos13ez6d0m7yyf4p44hyh44vajsmcn2ua8pea3dj7", "10555595965028974592"}, - {"evmos13f6kdac38l0mt88mn06cfa6m24fnk3s6fe3ka3", "18360319863830956032"}, - {"evmos13f7f74wt2xh2qfs6mjm4r5tm8dzr703t4nfctm", "1038287815094968320"}, - {"evmos13f8s3dry8zz3mxs75rrwhl6p5pls0dsa24evay", "1100927803323878272"}, - {"evmos13fcnsy65ty246tfaf7ug2d74tffmsdgdw7ydtu", "995731349396668416"}, - {"evmos13fdzm3xw9znn4vuv3z0hua5fsqh7xha3ukvmpz", "1328428556969388288"}, - {"evmos13fhffk434z0rd9hxmux7prvfutancpjspck9lm", "346870309522082816"}, - {"evmos13fhwhxmya6ag6w6yqjlk0f7zvtz4tcjm8g5t7k", "46869248827617067008"}, - {"evmos13fhwta2els9dxwl3q72tvd8a8trunp265cyvzl", "6997520564064780288"}, - {"evmos13fklmkvcy82g42ak4wjec263fgy6as8g03lgll", "416449113931885312"}, - {"evmos13fp2y3qzlkawzsrv73883ve5786v007mt29fzq", "32617549704863539200"}, - {"evmos13fr0p49v63tztlcnea43qnkrl53jjx3f6ssxv2", "695578242448445440"}, - {"evmos13fszkrer0rfrte6clzd0fx742855pfz4e0d7l3", "814430630327402496"}, - {"evmos13ftvqqeqqs4ykhv9rxfg5sjfz7pfvs43c2j7wy", "6069422048769977344"}, - {"evmos13fv0jdklpf45gvf49w22ghfytqcuvxhtmssfnz", "3057898124541634560"}, - {"evmos13fwmrdvh764rwwx0wxl5h0t3wgylzplpfhd4j0", "137247418182529536"}, - {"evmos13fxqm9s9mw2s5rmktd708f43l3ah9xqtt9cpwr", "1106020181763067392"}, - {"evmos13fydm9qa4tt48p02y90kfnzyjle6lyg0d69ypp", "2447556442727104512"}, - {"evmos13fyktrnl3fp00ujpm2xy2dhlu0smklscza6fe2", "12854813404326043648"}, - {"evmos13g39v9hfr5tx8lwncp724jacrfyw2j2zk8dqgh", "384046910856390144"}, - {"evmos13g8ekgukvqagstleks3pn8nkwu2sllfnml7c4f", "2291476268544180224"}, - {"evmos13ghd0y8u05r2knksagh6kl2e7t60swjg6k0a2c", "211581088831689728"}, - {"evmos13gnnvhrgnw5uaskk2nrn7x4ets2pugjk9gdzxx", "152733248773415424"}, - {"evmos13gpcl074scxmr92w57409xte0z88aac0yssc9d", "4588023156970586112"}, - {"evmos13gpecw84ljh4ar92gmlekk55gf3dnug3nla52w", "632350021357202432"}, - {"evmos13gs3ntkarcspg4k8ty9yltgh0snew5ha0c5fmt", "1551637876313180928"}, - {"evmos13gv9vj30kzu73yw88c63qtk3gs6kf8xshywhx8", "1966702359941977600"}, - {"evmos13gvay6y8wgk9quleqxq2je49h7yw75ssjn70wp", "3600650759755993088"}, - {"evmos13gws8ufl0hj2ujhfnpkgqny4nw0d9xlmgrkwhd", "6265987171607508992"}, - {"evmos13gwvf8uktp3j0m83u0sthwszqmsmymzq2tmd3u", "6577261315868236800"}, - {"evmos13h554xzsnh3fgy0qywgyne0zhdzjyv95was9mm", "826054691679989760"}, - {"evmos13h837ldj5q8vmq8m6eujq7rn4mkk7ax2z8cpr5", "3940175196151586816"}, - {"evmos13ha8mnxdgvknfnrkzpwwdf4m7nhu2eywmsuy0u", "1457845034648769024"}, - {"evmos13hcmzcmgumypuv9fpnd4py7nazp9kz7pr790e6", "9770645125826131968"}, - {"evmos13hdvhpugrkcrg8tf64kjj8gljx7zvzptjaffdm", "280616319980421120"}, - {"evmos13hggf9rde6wwu5j9ym2h5h2wejpnhyfzk3a2x2", "461638697981501696"}, - {"evmos13hjw7pk705qrrv3lgxzphjl7g6ge65zytyqwv4", "4748238845844605952"}, - {"evmos13hjz57eg9qetsjlu7lpwnmdcs2ue4w4v4u2l5m", "1281249171860068864"}, - {"evmos13hkurz6zg2hjucfzakvy7e9gdm3p5cxxqzxj77", "45392802134210048"}, - {"evmos13hnmk9pp348phuss5mk2sxct3k0g9g8yfwd0tc", "4352387804830017536"}, - {"evmos13hqgwlpxnx3tv7v5lgehn9und8nq6rtvk04xs3", "409777112854415360"}, - {"evmos13hrwnsknymauej4n00t7jlfs204nth0lzxmjqf", "289620362674958336"}, - {"evmos13hspys4tajg0c5dmsjvdt3p9a9jqf3gyphqtvd", "1259712958990071808"}, - {"evmos13humrpawcjm3exvx96h3w3wnx8lm63x2xxkvuv", "268674792720363520"}, - {"evmos13hwzsw89hjhqlukrh2999dp8mnq0x9h4928zku", "934349173790973952"}, - {"evmos13hzccr3s3rdftrm8ws2chla82d6j483xgt9x9n", "367078048530786304"}, - {"evmos13hzrzreq6kd6gk9hdf3pg95hw9le87jpdgr4a5", "4665849132747266048"}, - {"evmos13j0dsd09er3grjc69vfzn2a09p5lqm8h7f888c", "11785816809184143360"}, - {"evmos13j3ete4qpjms2zzj2f8mc3m0gja3qrxj48sske", "475115598091835904"}, - {"evmos13j4q5283dd9kmnaf4t40qesmgw42aw5hr8cs7a", "15330808636312797184"}, - {"evmos13j6wxpzmwl4efaksrt334ljnzd7zvdhv87l9vf", "1228382906957902336"}, - {"evmos13ja8fwfhmafyk8lalgnu2jfwceqyu948srjj6m", "721572333450567680"}, - {"evmos13jdd6ec3mgz6ua925hdyhhxy5jy5p2jjxrunmg", "89499191748564992"}, - {"evmos13jgg9vlvewah4qap64p3wu6lzf4lnyqhvk8r2l", "883669539425303040"}, - {"evmos13jgtyyawlpzlnl49yx0kdn3wfrxuyr8ht59eff", "1578271080203752192"}, - {"evmos13jguc87n7096zevkal3kuq6430gt68474r7e65", "29772146882254360576"}, - {"evmos13jj8w9d73tqg4ut95c52hqg3hvl77w83pf7y4u", "2316608073400852480"}, - {"evmos13jj8ysrldfvtx4jyx6n0wjnnpqrrt234aexkrh", "24819338957952548864"}, - {"evmos13jjp89p2ezh8w7n8qs6mhr5095j94s8ew5s4ny", "428561500701842432"}, - {"evmos13jlrp54l6uvzymhsnd2fzjmgg4zndk3nmzyd85", "4308881640526914560"}, - {"evmos13jmex44plqqd5mh3pvmlawf9tvf9znm2kdt96u", "842029932734406656"}, - {"evmos13jq3pn0jtg2t6vjpkm6s5k9kh9w24utdc4efcl", "2989696522919710720"}, - {"evmos13jrvfr0d95ezxvjl4t3ngzk2slg9zqcejlwf9y", "1558943103907927040"}, - {"evmos13jug76sg2m79lxh6xf2mc0d7lg70fynjhyn4mw", "774758575830207488"}, - {"evmos13jvca7efgkmgrh06fn2pny80u96m0avw0qvejs", "384312444528233984"}, - {"evmos13jvyumxda9stz6nhukcdccje3796fe78h5l6nl", "4707098495448862720"}, - {"evmos13jw0m6c4vdamnzj8uge4clsk2s5j4sxm3y8y9e", "45932391997748797440"}, - {"evmos13jwrqu9nr799tjzmpt5v535qucs3yv7y49t8zc", "4220647129850734592"}, - {"evmos13jxucdxtl0wquf78a9ntfgq2ht6wdtspawlngz", "11211838302240088064"}, - {"evmos13jyfyazgr6rymduklepurhtsalzyaxudul096a", "6097025447805253632"}, - {"evmos13k07fy69lkecdd4kdm4cchr632nsa5aykg7hdf", "4014920547698534400"}, - {"evmos13k0grzeeetkpy63szjc27tvarjrvcd2s4avch2", "1465094575985139712"}, - {"evmos13k3fpshrtgg4972ezrqvd2cdqluc947tvdkwrp", "14891758972605337600"}, - {"evmos13k4y8l4mr4hw4u98vws8g6t6quwkj2scj8mp55", "271620583107067904"}, - {"evmos13k5gajk8cu0dcdx8gg3jerglm3sut797klsj98", "1165033611095155712"}, - {"evmos13k782t8advw55ptnjvjyyhrkly3th5sh537a73", "24668490709062090752"}, - {"evmos13kkhkgytjs0sklswxdrtfjd4m9rd3q6z6ttyzy", "151202440259825664"}, - {"evmos13kkmae5yj40z02yhw8fuq7gxa6dqwvt7jlv2xy", "15014893615517798400"}, - {"evmos13klnwuxz8a3rc7wtuj4tcrnmzcspj8hc26xkct", "17348054329721407488"}, - {"evmos13kmzvurjfpyh98v7nhhhvuytga7jerzg6rkf0w", "9057557492138338304"}, - {"evmos13kp782lea35c8cukuc4gy7g5yafdxs6mp0ufx5", "432455217511522816"}, - {"evmos13kqn09hc3ckevrrqtt9hkxtss56yn3x0qkw975", "299467634016761600"}, - {"evmos13kraxxfphrwl3m6ahzel2s5defeadvf33636re", "1226842009481963008"}, - {"evmos13kvl3vn3pe4rh9xehar94x89yucxnt9aa2e8aj", "336061473803827200"}, - {"evmos13kx7ee5egz7decup89qdcn7jwrs9xyzh0evpq3", "2168566424433376256"}, - {"evmos13kxgc6m7zk99tnx329wklvcq2ql4s620vtyvhr", "30302171057601437696"}, - {"evmos13kxxv3ytsqvlycwkntxypp0fhcegs9pannqks9", "8359084248057020416"}, - {"evmos13kz8jr7c4t74cl79c2tzs0wpmea4nkema0q7y0", "8132601869006102528"}, - {"evmos13kzfyap6kqxp7q3u8ht8r3aj57y092k9wrfvl7", "1377702372644487424"}, - {"evmos13l2k9rjyl485z206ngp9vhgh4nemug4l5sksjg", "4764745108160643072"}, - {"evmos13l4ar4rzjk7ff8t2s8yfr9tdjv328u8ckdsce2", "714579151444258816"}, - {"evmos13l6r20qthfulnjvmrkz02r7pnt5en8g8fgw5cl", "38854313656953044992"}, - {"evmos13l796u06qy4vvtg2qh8v4pxcydrtff5l7qytq0", "13215414612263555072"}, - {"evmos13l8dwta0lwagc0806ksxmt82fhlk3crg7hqgft", "4898730335321665536"}, - {"evmos13lcjrldf0sczgnwn8ulsdyx74l6gt7cd9u3j5f", "5138623595465897984"}, - {"evmos13lcvuaj4hud295sm4l6fv6v35a9utf2sz7qd6p", "783107513591636992"}, - {"evmos13lea9mhsanshqhra2jxnvm7yyaxa06hrw5g2an", "840281415640489728"}, - {"evmos13lkjus05j2uxtcxkt55wwwfc3h46c4ls8h36ef", "836513553135026176"}, - {"evmos13lky4j2c87ffkr8sl6kauzlh4jyfywnj5gyau6", "89135320001971968"}, - {"evmos13lmvlqvqkdae68ek6rx5mz2uy9ftuw85w8u75f", "4328518060684898304"}, - {"evmos13lpzx6kryvralz44z9szfdw88qnuxl8tklh36g", "6227300904296896512"}, - {"evmos13lqmaxkhnhxdkruv72z43aw0n99ecmyf59q38c", "224879987402665984"}, - {"evmos13lrqq0dda4awaum5asmqxrthwrlyrj3m68x288", "3805434092836429824"}, - {"evmos13ls3375ct3ndp3uggmmuspxtnw8dwqd8s495gu", "1014656324392884224"}, - {"evmos13lv8v44mr3430qr8pel7zjw4mpkpa6z86ehl4e", "21982950585748701184"}, - {"evmos13lvwsc0dpyajwzg36755l39nfv7c7x8yx0m293", "122190742253715456"}, - {"evmos13lx6uqg52v34j69a393lyz06vpd67fgfajq279", "1316932820196207616"}, - {"evmos13m4gpqmxcrfm8kys2jtf2nzg9j4lmpr5rw84n4", "28528675642640084992"}, - {"evmos13m4ngy8v52agg6hletzq90w8lnqy2vwhew9wr6", "7563462277861172224"}, - {"evmos13m5ptr6rty59afu0fzdezk65n8h2wngukep424", "4623423342056413184"}, - {"evmos13m749yysdr0fnkv202erxxgur0x6q4ns7ajdat", "841516522251639808"}, - {"evmos13m92te4tp7fh3tc2h3t9g76ftfydwdzvltytah", "12933659443621416960"}, - {"evmos13m9ufjrw3u6392htmumgr5vnrur8zvc2wtm6nj", "23238679988007788544"}, - {"evmos13mec7cs2ku0ytzxsn3ta3rm3nh6zz7ey68s55z", "1573002058565434368"}, - {"evmos13meuq3rshma94kpcvge74yg3w0y75myrckn2t5", "11091825978623551488"}, - {"evmos13mf3v0dl32j27lku84euwyjxhxl485wk0xgpd9", "1162591459510428672"}, - {"evmos13mhh0xqc47548vr99ez58ppra0sgna265jtg5n", "772363157242912768"}, - {"evmos13mjun9m949yms93ah307ga4782dlxm49tr6u9r", "58166938561084448768"}, - {"evmos13mkq52lpepcvcp9le6phxxgm2xwhvwelf90ljx", "9484856451600064512"}, - {"evmos13mkynsrry2kcrqw28wat8zv4q7thhwwcymukfm", "29755568176961814528"}, - {"evmos13ml5fzzr8hdystaz2zxn7lx0a8zyhunp0nylae", "2676731815386643456"}, - {"evmos13mlt73fjp2kw5mxd8w04smscr6gsqvwgdzxzlm", "1026919554690326528"}, - {"evmos13mmym9jl4gvfksykgelvjm8ggaq3gp3drvdrcl", "849997357230936960"}, - {"evmos13mru3u5zh5ne6xs35l3an9p52h9fwc4267vdll", "785081200968371200"}, - {"evmos13mt63fme5fx0kv7p9ce0xk5pjfskdwfl73h4qt", "82032069907243368448"}, - {"evmos13mtyhpx9ga3af65ll4j9gvghdc28zq6d9xkjsr", "883559891337429632"}, - {"evmos13mv8dl0dx6vuty978cfvaatwyvmkalemqly4k8", "21514064284359966720"}, - {"evmos13mvgw4th2agdcfz5psy3ux3f59uzg0meyfyyae", "384498519150480128"}, - {"evmos13mvyhdtum3celdguj3c3gqyd49w2yh0he7tar6", "66074028418797568"}, - {"evmos13mx632u68t6qls02u8yu6utevpn0yuml9mlhva", "1316965062022307328"}, - {"evmos13n0pngf3vnng7t5eesnnztjsm6m9khq6nzhngz", "477488833645214720"}, - {"evmos13n5pfjktd0usu7f9d9dw2mj72cql7737d4a9vv", "956595900970389504"}, - {"evmos13n5tzqln5dwg847wq3nzz7p56mplus3h35pudq", "2406169327637356544"}, - {"evmos13n6re35zq2t4xelmuu452qfcr9t3sya0gcjjag", "1098898276095985664"}, - {"evmos13n8gamenua82tefd3s7j4uehd764mg6054l0rw", "51703497793077248"}, - {"evmos13n8lt23sekd8gj6pwmc4dxwzmppe3cmgnljpk6", "1460943129407853056"}, - {"evmos13n90dstfsjp3exru57vzpnvd4r0pzkudasqrde", "5028193271615717376"}, - {"evmos13natfrcmvv5watm2hta9hfuq259u2yyaqmxsj4", "290196730197671936"}, - {"evmos13nd0v79zyqn9ja2kt02rfdl99whwsc82u3jnap", "16522030308489981952"}, - {"evmos13nem7jjj8km5k6nrnnsqayedjlgsuezlktmqt5", "329566422045896704"}, - {"evmos13nfmj65ypea2hxq4ral02ndzvcw35z3yj7vwlw", "19726894994208735232"}, - {"evmos13nlh3w6vqr058zht0w2rvj87958a23vsw80zke", "175871336483340800"}, - {"evmos13nlwny9nat3ur3uv9vvhhdwdaes4jjfmd5njl4", "10079999695421603840"}, - {"evmos13nnd39jfjcq8l64h6uvzvjs2x9u3hnqzr962t4", "883841022241758464"}, - {"evmos13nns8fykp6rdc97fy9ss22qw6ssx8r5l53dhdx", "1428898075958548480"}, - {"evmos13npxu65j0nhafpkmq3xjhvr40p26sqjq4w9yr4", "445061018967941120"}, - {"evmos13nr2qhu824xnuprf9xkefmdx785tsz02prhjs4", "477065292774215680"}, - {"evmos13numhevejmqxd3p0yjt7hp89dkszzhhd80sq6s", "643462473464422400"}, - {"evmos13nvlnsyvdglcjx79wrcadg7uj8qlv2asrdzw94", "11875965274793410560"}, - {"evmos13ny5jkzun47hevurd5jkcmvwxr9ayr0e78mdr8", "3400170605909875200"}, - {"evmos13ny60whntzkjyecyur9fe485clrmweaef8h82d", "344334352373719040"}, - {"evmos13p4cx40vccrgrlsgvtt55a8q2u7vva8gx7rzxq", "4651734203317716992"}, - {"evmos13p6pwj3rveng64875c6r7utsjwy4v0y2ct50yd", "6363548547956475904"}, - {"evmos13pa65w2tew3cjys4fjun0fde6s2j6g0gu3uf5t", "1896422101802373120"}, - {"evmos13pcv8fc5f73srnfxqvg6ldljxxd3nn2hjmksdx", "5193290502227992576"}, - {"evmos13pdy66yp4fpysruhvm8a2uz87lvzc3xzrckep4", "8356499248930914304"}, - {"evmos13pjf0gwp02zs5htpf2eshhrs3798l6jq7t67aj", "1004824522041886208"}, - {"evmos13plwnr7z5s8pvn2s8exszwh7qud28dreqet8ta", "701766588580762624"}, - {"evmos13pmeqhgw0wqcy23a0py8dch74rtleucvptu0ax", "10328408316319488"}, - {"evmos13pmqv0rwrm26s20luchhem5ka27jux0ppjd50q", "17713233926402891776"}, - {"evmos13ppa2ckh0lmz2n90wmsk3eqglctkutcyg4dfxp", "1185178236328223744"}, - {"evmos13prnnpdq0y7xraejqyqnpqkamnpy2zqlxg7dsx", "1618527921737447424"}, - {"evmos13psnn8hrwcn0espqcj09rpxehqu7mp2275dn0l", "6848690394754395136"}, - {"evmos13pt86hakp34zstwh7yfwhkry76nq9qftueqw4c", "1162930030505883648"}, - {"evmos13pv5ahle3yem8h55ghcalqd6qsprf0tk4v3g93", "3682731277445393408"}, - {"evmos13pvlhgum6efh5mwpulx86jehc9gqu9k9xs0yuv", "880669541193020416"}, - {"evmos13pw9vm7gx7xz96mre9swy3gm2anzjnf5nqvrpx", "1469314916291360512"}, - {"evmos13pya9xj20d68zy09xztg6qz746f9ayqv6n33c5", "1124251844358924800"}, - {"evmos13pyejg2v2cy3s5mktww5xg703wul0e5ehz72z6", "16202415344696590336"}, - {"evmos13pygtv349s6eu696768cawshr5qty97vd9ehgg", "28875640898970275840"}, - {"evmos13pz2dmgsuupuve79h0knsu2ahnv93u082nz5ds", "121609704605211648"}, - {"evmos13q0096ec43cx628lef2wyrv20wf0weq62kuz0d", "534014940394478848"}, - {"evmos13q0avf793sapy90p6njskvh33e48wk0gf43ahm", "3623265023391864832"}, - {"evmos13q2fngw87hlhfqrq276kzvd73q5p6nj7h92vvz", "1804087637897887744"}, - {"evmos13q3kh96c9decnqvs4ax4c64r7z47p43dcrys4e", "1097795705480662656"}, - {"evmos13q54mmspsfxvw4xff2u4gzvr7ucpyeh0n20dg8", "1167728175444865536"}, - {"evmos13q62mf9x33hkershd3ggxsyn3knr89kas0v4lu", "981247445237960704"}, - {"evmos13q854legh58g2vglrhea5jyy3708cmvlvqde5k", "384205232914133760"}, - {"evmos13qavv7uwf0gzzqfh9t2jh0mg927zuj3ztzkkh7", "163705135825026048"}, - {"evmos13qc2r67yey7dehvp0fqq35886msyjvynpzetx9", "15599965304893685760"}, - {"evmos13qeg0006ur2c58lasw6lchsrp0utm37cxt0tqw", "1039483790629830656"}, - {"evmos13qg8r36k2r7rlhu4lmnflwuuyu47av2gv997qj", "4669151920167223296"}, - {"evmos13qhhh2xz08un8acqeun7cyntfcejrx395ssk0m", "2617831266117584896"}, - {"evmos13qkp886df7qfzqqtjtghm4pr0ypsl44useyfk3", "801771952997878784"}, - {"evmos13qnucylzhp7jj2snvxzlg2estzv068603082za", "1839976563885856768"}, - {"evmos13qnx0ce3rd7x3kkt0zn95t902p6dx8m9hzw8ws", "709527019786839552"}, - {"evmos13qsh20nvrj7u7eprlkfltp53jpchnfrgfxtq2r", "477439446197152000"}, - {"evmos13qst7ffrj9gq3l3796uxr0yv4t0rvhllj6mrts", "11180718179006527488"}, - {"evmos13qt3gmg4qtlv7c5jenyzkc29r60th82g82qqnd", "2189809925986230272"}, - {"evmos13qvm3tc5hk626p3xfes2yv2n6gzecxyye7z500", "45510650558530486272"}, - {"evmos13qwfy7ahfp8skltm52p4h6lqlnnzr48l6acevs", "385838696881603584"}, - {"evmos13qyq0j34k30sq7z5ur5rffs9uwtn2n6zgqn2rg", "1626542601403572224"}, - {"evmos13qzdxgafm58z07gwa2eqdu7h8lq88gzgzrnfjr", "31612762690831540224"}, - {"evmos13r02mwgnglvh0ka8u9w6pasql06v4udxw0mrq6", "2066026815614056448"}, - {"evmos13r0k2tfhmzdfevl7jhvj4kzgnmj59p8ajrnfj3", "1232043961815860224"}, - {"evmos13r5fkpsaaljagcymfjfh2pa3e56encfrdm2x9n", "120562292272999936"}, - {"evmos13r5mzy93wl563659crhypgww2vs9wcep9snlw4", "2015185646309413376"}, - {"evmos13r8c37t5qseeefv3j2lpen8n9tjn2yg9qrgjtv", "515038662090153984"}, - {"evmos13r93ud0sl904u7e4rm25yyspqxmws8tjrnkrj9", "27002277328357847040"}, - {"evmos13rc4dtqgu4dmkmgmeq7lssdwa272wsecs9l2r3", "1353574427832773120"}, - {"evmos13rccfvdfpnfy25k9fj0hleu39e5x9qm83r84h6", "1628853849202050048"}, - {"evmos13rev7sklpwca5lh0cq3t5w504c36xagu5prkzk", "104899714862808064"}, - {"evmos13rfczaaunueg2tj77h8tdw8u8qxee0nrcqm8gk", "2017550750184792064"}, - {"evmos13rj5hnf7zh4gq9zyqdkrv6jzzqtp9zk7elkxvm", "57776086856138240"}, - {"evmos13rptytwddklhqya4j80c3vqwydh4taj4yjt0vu", "6842756203977216"}, - {"evmos13rt0myfwynvusfhhm7m7a6ay07ssennyctl9rh", "830134139683143680"}, - {"evmos13rtuyh8hnk9nxa4fsu6lnnmvkv5m5avkkeks2u", "3203050379841233920"}, - {"evmos13rw6glf5qfvfmxt3a780ttun2hca7gfpg3kr5s", "1416204118400147456"}, - {"evmos13rx8kl6atu6funmzuv24gawa6ns8atcgu4mk3w", "2404930884707045376"}, - {"evmos13rxycvruxxdpkn46eds2ahffuhk09jv2dm2hr5", "1329011383540932608"}, - {"evmos13rzn434mdpqrt6cazxrek2s0cm4pg64csuwyd5", "3309383242614931456"}, - {"evmos13s4qvhdvxumhad69pcl73nl238dxt8w3r3s396", "6199412796629915648"}, - {"evmos13s64r6m9gxqz5kdsnk82lfqyrlerryp4xry8ts", "1231473497397129216"}, - {"evmos13s83pkwtpvmd65tc74xge9cyrvtahhzd2f8vqn", "36030286795155791872"}, - {"evmos13sa6g2x0xpcephxg9cxe6r53uftdf927fky347", "29717383532912410624"}, - {"evmos13sc66ae36a8m6zcqyg8h63t9syjeg5a76dqak5", "16301758403590004736"}, - {"evmos13sel7m6x56wkgf8tknu70sfz0mcmdp58j4tgt9", "15754664441638094848"}, - {"evmos13shggdnyherg2gnknvx3kwmqfgtevgjfh3s7m6", "539168919850411008"}, - {"evmos13shq6tr2fdlcdlrll5s2pyepyf855mjvxs95ru", "194875463494752256"}, - {"evmos13smdcg59gpjkr9l2jn264menza7kmme6usckd8", "28489664958989045760"}, - {"evmos13sqw7vgkgp9kg36uf02e7rkh4c3nq2fs3wqhf6", "74970760026407600128"}, - {"evmos13sqysh9gf70qsszyxqlau6rqvk2u49c2s3380v", "4216743231091799040"}, - {"evmos13ss5p7s4j7arq4yt0t48nynnpgcte9zuucmm45", "2667151756449396736"}, - {"evmos13sst92e4x6vq0uellxq5q9ugkrd2zldn8g3ucn", "1533703666811265024"}, - {"evmos13st5a44dscl22076vzemrg5nvm4g3m9hwpdexd", "857575670832906240"}, - {"evmos13stgxxafqnx3qr7wczm8r2dfrzlmwc7laz48jj", "9886049817700646912"}, - {"evmos13svmedyrm6uuzsks5eaa8cq2h4t46e9v96vhzq", "3497035603976271872"}, - {"evmos13svway9l7s8a57jcqxcgs9n93sjrrphs4wtupx", "1484958772049301504"}, - {"evmos13syjq8wuys8pqn4p7t46z9ytuf3puwvuftu2e4", "8328872415444130816"}, - {"evmos13sz4sjz7xll3ggj46hy42mvr9dway5dp3z936c", "3317053661412478976"}, - {"evmos13t2xxq94qna76ynq8le3j3kg952x6xycu56fjg", "6633212772806062080"}, - {"evmos13t3wc23l0femszudy2dmcy3sr0fj6kn6jwrqps", "477274395556405760"}, - {"evmos13t5pk2uuv4g39u02se398uvxyhk5e3v20u3p3r", "425974582629185536"}, - {"evmos13t62svmgl5md9a39l2qch259rngf8m9xlhvylh", "1309462980512932096"}, - {"evmos13t768js79k8zst3jeg89asdkwuukcl2aeflzft", "1920347719562716160"}, - {"evmos13t85rmce47n57f3n0zadegmu0lcc5fxj3e0jf5", "12507786992438476800"}, - {"evmos13t8f36ze9n5h89jsdea734h7cdsap7nm2dyxj5", "531392928776123392"}, - {"evmos13t9pp487cf2mwqq6hs96nduzdg6zrt5q6gfz79", "13398199691320983552"}, - {"evmos13takqx22vsk3lte9kclhje8pdrgrr4xhtcwaks", "517751754529655296"}, - {"evmos13td325c345hkcvj07e34m54jjrurf04el3hcwx", "908079302323176704"}, - {"evmos13tdwu3k3v2pxna46wykm6rjlr904qdhpul6sh9", "5715311701661470720"}, - {"evmos13ted3ysrfqexp787tzav0zltem8cj3jy4nuy0m", "4014642997200627712"}, - {"evmos13thwsh20wqchl7vg53ajzdzfw9xeteynazr84c", "866944271158419968"}, - {"evmos13tju9evkcnaq7945vv0h3tp0zysmjfwqup2xgm", "3401345394137552896"}, - {"evmos13tlpnv3mffxmt7uf9k8rjy8cxhjecgvdhfm2w4", "3445888648640460288"}, - {"evmos13tps982gch77a25sdvfnmzrutz24dhe56qndn8", "44121722302570823680"}, - {"evmos13tsmg9vmqvxsjzz2pzdnnelsgrzzp8emtpunpn", "1170350022163333120"}, - {"evmos13txe7f8k3ejnr2kyqdkevqzc7p50eryz3rjlpz", "39951997073823547392"}, - {"evmos13ty4egk64e55389sjpq0yk97raea58c7fz7pm5", "2927372341521173504"}, - {"evmos13tzurja0c4j0h5q7ujc3dh4gte49jw45arv2wy", "6104547201079582720"}, - {"evmos13u2y5t4y7gdsuhpdgs9ec445ah748vzhejtad8", "338248141620128768"}, - {"evmos13u3da67l8m4dj6sxp8efcj00070k22k772v70z", "1281368202566600448"}, - {"evmos13u7rq5qu7zg4jefmjetnac74663d34fs0vrkd2", "13543863423218507776"}, - {"evmos13u8qtjcj8h9nj9vg2j88mdzzwevqecp6nry8e5", "1049477942609568256"}, - {"evmos13uagfl69s6vdappsvnljcvvfwk4uescr9nfpua", "28940597206653267968"}, - {"evmos13uev38rqjhxpnv3e3s5j3qqn8su5rwg85y5dye", "801124194668360704"}, - {"evmos13ugwdr5prkp4qrcuaz3usakth3mnyp7a2gmzhe", "2226347450471866880"}, - {"evmos13uhddev6y75kyaajx0h2ng8s73svet332l3yse", "1281913645423295232"}, - {"evmos13uhe2njvprue62sr7my0c4ck3dm5zs73xaqsym", "80210349641643520"}, - {"evmos13uj006ma2leluwz95rhqrq3uc7mxns3xp3zxxk", "31409483229909729280"}, - {"evmos13upf877wrd72jva2ph4828mdeqh5cww9e8qv25", "2127650962182526976"}, - {"evmos13upzluxjyks033e584q9pugk8w3q99gsd80lfn", "17203133509943257088"}, - {"evmos13urlw2v596g344fw6f0qzasnj5n4chktqyj2tk", "555035992302427392"}, - {"evmos13ush9w9yflmhjnyq43fqv3avn05u4te8hus2ch", "384498519150480128"}, - {"evmos13uu2gmh4lhncpy6sdlwjrwp7rcylzzckdanjn4", "2420793655835968512"}, - {"evmos13uud94cffqjsqt3e4ags0as6q6v6jc4ggkns8g", "459726563376795648"}, - {"evmos13uvfu5fupg9xamd8mjadel8u68ssl4cj4h78an", "1751191542850332672"}, - {"evmos13uyq92lxvxvk5yhz0q6dnp7qgg0dyc229u4xnk", "2552953022561789952"}, - {"evmos13uyvscyvwchxua64cxxhvz683xykqfzmug9pcm", "1407786235084195840"}, - {"evmos13v293mu60e62vzgsqq0najupxt7k4lqalpcuwc", "1295065330230008320"}, - {"evmos13v2z88myldqd7wtczjr0epd8pzdlefy33v8gjf", "438285702808073728"}, - {"evmos13v5kr73tw65del99usskqyv9gxz23f2m2m6tsy", "1569425434084215296"}, - {"evmos13v9v8y4hse3a4raw9kflgnp548lnzhvjj4925s", "2601478935774325248"}, - {"evmos13va96sky5ea7seqfck27pzspqmjn7d6dm9uqax", "3469370789697068544"}, - {"evmos13vjhuas2gjuty6cqfhadhl62xnsaeny507flzf", "7765630905497392128"}, - {"evmos13vmkxgwnztm5tj24eparn6qfyxwee0sxynlhjl", "299268509204770560"}, - {"evmos13vpwfjzlae3ehpc57srnw5uld0f2f5qmq5kupg", "615878858988858880"}, - {"evmos13vscpj8whw0dlnql2v4t3ml9r6axk5jncd04g9", "5517457874929491968"}, - {"evmos13vtvpgm5kvahdwpf9xpd4qfay3dwma7kztxmne", "1084736370244764160"}, - {"evmos13vwjk86h6zrka9lsdwz9lyp6f3zm58scyvv40q", "912226070249676288"}, - {"evmos13w2ara0tm7rrmlhjxmu2wm8vzypt3nne6wh5z6", "410870777836274688"}, - {"evmos13w3k3w7e8mn7rrucplcrexfdfjhn3a3vapvfcd", "22019957934999732224"}, - {"evmos13w5hmrk8k8qswwwy8e7ewfwa2l7w6mm43sv5r6", "216955542731451392"}, - {"evmos13w5v4xtp0v4wcj26ut8l46d5qn3l7rcfvmqct2", "799994067364670464"}, - {"evmos13w8d2lw7cyg0gsfupwrxv9qsevylzlauc2sk5m", "1067645422451243008"}, - {"evmos13w9wzdda4dujqy7v5qvcddhlz3lldf6w9r0g9k", "15759669521942528"}, - {"evmos13wca9yhkmm0ul5h272cp54943zg0d6gw83lxj0", "12273266480677150720"}, - {"evmos13wddv8pnzh94pk08x4z98zh9x95e5c2stfqkrl", "253414893044600320"}, - {"evmos13wdup0d6tlfvxsq64hm2ze9a4hhgpvztzp7wc9", "2816912068234609152"}, - {"evmos13wjepzss0mffezvtqz6f3lxwpkyznyt4wev2w6", "416948206505551872"}, - {"evmos13wm4mxrukv0j4cxvh4tk9797vzs8q5jep43u89", "12802172707710464"}, - {"evmos13wn37z3lau2n5ek7wfpu9fy3zt4yrm4zg0ktg2", "13684405335800909824"}, - {"evmos13wshezcpmmd7rfkmtdeaj3wj4xmr0xql5ypsvp", "3671160126210801664"}, - {"evmos13wu8khjgem4knjd2xj545p62t7z8kewlq50r0j", "1249061027536090112"}, - {"evmos13wu9zwxg62gtwwkuf6tz6j7vt2ucvg8fy4m574", "1316823181151473152"}, - {"evmos13wusjapy82kdvlh457vv3hrm5mes39vxzvz9mv", "1459802360456871936"}, - {"evmos13wvuuzlt494zmd0nwf5sc0d7chj2q2tqwtrv2e", "383987846274820096"}, - {"evmos13wyg3yhm0625832g484jg2zaaqsz3xntc9jky9", "298521397495126784"}, - {"evmos13x023vg80prwz9pjefhc4zndgm3usg5velt45v", "14882539338959921152"}, - {"evmos13x38lhsjg0g4c2qf7k4n68c25st4hvx37rsu55", "1004136602172964864"}, - {"evmos13x4q6l4ae3vdyv90ggt8d28k9jsk34t6xa843a", "26493289988743188480"}, - {"evmos13x94s3ym2xnk0ydcr4yww86d9ydj7cng7y9kgu", "18539007809179136"}, - {"evmos13xfhvfayxwqt2zzrd5y9zr56tm7xl3jzkzmnap", "412496900081912832"}, - {"evmos13xhaqzgc8l8c4stxwveamueqffyc4d3376ugsy", "1921016997486059520"}, - {"evmos13xk2xht9mgxu4tuw0c8dl96rgu4f6gyvuh7jjm", "978324906367849472"}, - {"evmos13xkj58ucyek8vr6ct3t2vc08xd8c78v3rd7yhs", "5690517701583945728"}, - {"evmos13xl3ygqee4r7rnxw55eq6kqnp7rjy0g9za66x9", "281972208095334400"}, - {"evmos13xlqct07radhh5zllvsf07zcx7j74lsc3qh0h3", "375756886859971072"}, - {"evmos13xmvuxyh8vxepd3qdp57nqcgm92vfau69k4a49", "155239343660544"}, - {"evmos13xqggj5uhg9qpke2mux5lr03wx0tknty6zvvtk", "740999411051678208"}, - {"evmos13xt8s47avp3ne48rf3vh5h3ve3k6tzma2wajwy", "5033907010876239872"}, - {"evmos13xytwpduayss849ln9d620mtwky6fzl8s38mlg", "3374418381841790976"}, - {"evmos13xztce5na4y6rwu4sr83x85dxkkcsgrlu3j8hy", "1288630948682111488"}, - {"evmos13xzwfj44yhehw2l222n9cjcytyvnjleudxxt9u", "872047230294257664"}, - {"evmos13y0f0w3mn5carrhxzmhkzgnxe6mj6hzy6ghyz5", "5036800253807755264"}, - {"evmos13y2f47jwqxu9g0kj9asgdrufmnaej9wkqdf8qv", "1172740204117934080"}, - {"evmos13y2vdgmtlx7p9u39gvv3aaxcrj5xqewws3d0dm", "435897576751252480"}, - {"evmos13y3mf9knvhrdu8tffh3ha8s3cxrz0hkzqxwctl", "2370226247039774720"}, - {"evmos13y8p0j42x9emtk5zrezhq32z69z9shex8adf5v", "17145684363382784"}, - {"evmos13y957x4lg74e60s9a47v66kex7mf4ujcgl7swq", "424373448417411072"}, - {"evmos13ye66z2vgkdmwdm7wnuz6ky589dfzglvmr7clu", "1064988439194762240"}, - {"evmos13yf36tjwzhf2vawu27ask3d5t7yxcpqkz4at9q", "1049906981387105536"}, - {"evmos13yfrr3p35qrm2e6qyxn5m66jxcufxy4ll5d4ru", "387371006098057216"}, - {"evmos13ymaks8sfjy5pmhk0vc2057y930fzqz9r7xk5h", "791247537465420800"}, - {"evmos13yp0q3q7lgk07ejxymz0x8hvcwef2de95yqwv9", "3233090913264815616"}, - {"evmos13yq63ffqmjj9cly6qqwlt3vxkju8ag4tj8kjr4", "2451044482564024320"}, - {"evmos13yrjqswznuwq2tpd2d702fck5jsxhjzcrgey5m", "3986651518951508992"}, - {"evmos13yrk2f8069gue8jryfqg9egv0fgzhpk2dkj0mj", "7227358283722869760"}, - {"evmos13yuaq02mhprdfp6yupju9ptwfdm20sgl5g6vku", "1420633113404702720"}, - {"evmos13yugjgvnlhdtzhc3x3v7j8suf2clq54ytl9g2k", "18189626670625536"}, - {"evmos13ywgzqft67wlrmj06thg6uptsae6ug2kmvcvtx", "386191955258465792"}, - {"evmos13yydcs435k0ykv7tqdt767saakglzrtlznee00", "44975445077093120"}, - {"evmos13yzemps3t6u5rw8sgfmpekt3s0k79l9tcwtczh", "5671977078109117440"}, - {"evmos13yzsjtvhjqhfrqckqw4g8aumgv552zh8s8yrss", "1687527929418224640"}, - {"evmos13z0ueq9zmhz5s2sxxqdjpkv3frxm7t9tewt3p0", "5515624842869563392"}, - {"evmos13z0uuzcalr5fpykgx2vhv3vj3ssw64dqapj5f0", "19872964760423284736"}, - {"evmos13z46le9katzn5wcqysvd33w0l9trj23qnh2r5d", "22522030196385792"}, - {"evmos13z47xrtnrp583l25mf8rsj2pt5v40xkk8c90ks", "5181248767790516224"}, - {"evmos13z66zkkfwzdjqls8zn6e0gsxjlt04wezua22dn", "85860284504860416"}, - {"evmos13z8g9vpr5x6atvh0ctymg4t635edysprltu6gv", "905925354501101568"}, - {"evmos13za2v8sjdm7gahaee4cxhl4jyhdyr2mje2rxzf", "2908817454200193536"}, - {"evmos13zk7s2sjfrmnpejswf6s3xalhamtq2yd5q3lpg", "2638048319123567616"}, - {"evmos13zke0d2m5h508j3aacfwkrfel8h40r4q8pgcrj", "8767269448297402368"}, - {"evmos13zny3xwve3ljer4gcm9rahlnn9dkr9cw2vrgmg", "63388884123735539712"}, - {"evmos13zu27a46nteygd4paazcedkml8ryrfx8g7dx8f", "1982480451428540416"}, - {"evmos13zwu4mre92dqkm0kl675u8agvk8r6dweq7ma0v", "15956449453794856960"}, - {"evmos13zygtg0ct95h633e8e7we57779jx0z7gsfe2m6", "1471382189723532288"}, - {"evmos13zz4mgwmppzlnve09zshqlf4r2x4uqtwzwdjyy", "4341601779298418688"}, - {"evmos14006rw2jj70t7r4sq9lr329u66zjm6dntztxju", "2612095085270256128"}, - {"evmos140drxl42fm5v4s4uxgjj4ps7aytmvm4m7ettvq", "2859590932256813056"}, - {"evmos140gu6xvkz6zqvtktt673ye7hyr4q9jg6d9eldc", "13125017868817526784"}, - {"evmos140lcxhqudznhdmjs9hmtyymrzh56np0w9h5z0z", "13944674532819275776"}, - {"evmos140nuqsz5gsv0cmnya0jj7ca2t7d3hjzumue755", "2546030090856342528"}, - {"evmos140qw87hwy4xuymzywf8yp03zpre24rpqzqrl5p", "4616714752262380544"}, - {"evmos140r6fk8hdpv9w0dm4qzeafa9lkgxfwg74g7y9e", "467356850075320320"}, - {"evmos140s8ncumcnnj8anr4w6maen2r5359262w5ajzc", "300532441875224576"}, - {"evmos140v294z3q6ygasfvgteal7phwh9w5797lehjx4", "948107349373800448"}, - {"evmos140v3xshktl0ctv5q86ety6cvt2zfassy35h6yg", "884564538097340544"}, - {"evmos1424248kmlalxeyhd9dqdwnrdzaunhu3kqh72xt", "1696849464164483072"}, - {"evmos1426vea9z3q7rzptmskw56lxq57xn80s6rjqztr", "14254867705280108544"}, - {"evmos1427qp59drfp0ajnwencuqrqs203ajdznr96a8w", "478445877428828928"}, - {"evmos14288kc87p09eerwjx7g6qf9ap429we09vj7n80", "8251706424040968192"}, - {"evmos142aa9zq54v4rdv3wxqyngteueylzmnnd454wy8", "3423183921327456256"}, - {"evmos142acz2pc8qcp7apz9r0lvnjqr5c0xmdpas2k54", "1319236869850394112"}, - {"evmos142awlppd3q6k4jeqrr6dllm33004wjfjr6nnez", "26798605344173924352"}, - {"evmos142azljhejy6wpnuze8aetx8p6xsawmmgusuzl8", "473965392849971200"}, - {"evmos142cvja70pevjxuhnr2fzlsanhtwaurd0x7jqca", "64489227786617831424"}, - {"evmos142esemyj4q6qm5pl8df3j22hh66xeeszn7j6kq", "1567618974301953024"}, - {"evmos142hdggyxmw9fje5rtmfc8mlt587sjg7ata9mnq", "6476783748635226112"}, - {"evmos142jql20hklfh8e5gsegxd0u0j2lqxf6sfmahqk", "5241463017280143360"}, - {"evmos142krf5cddyu8slr982hmjg4uyzl6n3gj2tzetc", "676096401033912320"}, - {"evmos142lyl2x0zhy6pt0297aauxsfq5wdq6pkgfwgy0", "67499961235371884544"}, - {"evmos142njvhugqvrlkdk868r5kcx5fmw08zaq43uz5t", "22641755373435445248"}, - {"evmos142r68f3fpcnnnwmus7sdd44t09xt9kerq3dmha", "531400880197495040"}, - {"evmos142r767qtemcenvv0axhxsgp32mpxzmfvs26egm", "1101914975035986944"}, - {"evmos142y8ecruclcelv29eu53s9yf7nlv7uzlk89702", "57786571284579762176"}, - {"evmos142yyhlztdhkdsqpwyr3p4jcjdexfskjt725gd2", "6782476040264232960"}, - {"evmos1430mv60ucuzfmrtu8n44zmmgnyf02y75ra03qf", "4252731728410099712"}, - {"evmos1432paag4py9yaqzrrsjh6k8lpxnja970qv5nhw", "4992132470720216064"}, - {"evmos1433xvrhzcy6q54auqwsaa3a9svl27q8hha54qf", "590386445780221952"}, - {"evmos1435a940k7jkhczeh3wl88euk6juz3nmrqlc7e7", "6389954439092445184"}, - {"evmos1435cncgrdwp5gv9se6rv475h4vrjnmsgr5ha4t", "942849329602882944"}, - {"evmos1437hc7u88f4fe8efd6x6wjycknwmn45c8m0dst", "10225125286202605568"}, - {"evmos143c5u5yg4fznfuf90c47yygv0edvvjczujlzul", "183878804544189952"}, - {"evmos143fvjg0zszlkqlvfgjkj54863y0tmej8qew6hd", "1183142969336708608"}, - {"evmos143hhndn4gn5r6fysjxp7gakfpvmdwy9y43vxck", "432440491519030528"}, - {"evmos143lj4djlptuts8pyyz04k02mspna99rpwmazze", "2808681859959371776"}, - {"evmos143m47se6nd7a66xsh80tfmc2u4uu7esd6qhy9j", "1732882959893674240"}, - {"evmos143r4a8ka042g9w9xvu9upzat2epwz7m7x98p9t", "3232535946917773312"}, - {"evmos143tmtxttj7txgrxgm4tq2qphlg3eaprfa7szrk", "38975176342220365824"}, - {"evmos143xssgfh4mxuzg7fexu337ly7knrw4gw2wlp6g", "5437231946839244800"}, - {"evmos143y3ksmqk8cale33jcgaty7zv8pn9arcrajesa", "173015338578807296"}, - {"evmos1442dns7pjmcmjmcw8ztzzff68rsndnvas5ca4d", "1293310655404573696"}, - {"evmos1443d5zd9ltqgeqp249mswxrvn0sc8pcq8ckxcx", "241125171806457856"}, - {"evmos14446vjhduc720g60w809gtmkkt5sd4678xduyn", "796133095698178560"}, - {"evmos1445utlyaej3yurz02ul2yj3h8kptjqlx5xpflc", "16057266876773302272"}, - {"evmos1445z2kpvgnhjqxf925w2pkjpau4lpj2gtlsyek", "951453104108244992"}, - {"evmos1446mhe7dkvn0jhkltzkvhy355shf0jk94hwhfg", "39742108484967424"}, - {"evmos1448zghqp6pv0lh8c4ue74tjkyj0f0ahsh7snha", "3983873043138963456"}, - {"evmos1449yqp9xz2z22zn4y5vut34vkrnxtvplc7z3g3", "4645920423493091328"}, - {"evmos144cld9wl6n293mmtldu5rmle5935dy7gylyy7r", "7815088696700021760"}, - {"evmos144cxdcrqkvankxkesfvfn3py3q5lhazz5d4ldj", "165773653385668608"}, - {"evmos144emk95cv6k9m92z4ujs2a9pc0vrcc544246f4", "2423652125859864576"}, - {"evmos144fp5puwnsed6rjc05y4y88d2nkh4mttjrhq0t", "21175059111005511680"}, - {"evmos144h32g0cjlul7agyng2panrywvz09j2rfq7snq", "5684617195298641920"}, - {"evmos144j5y3973k5g948mtxj2uqwjqz0q4kzlgk25mk", "835304391115993088"}, - {"evmos144ku2kcuse9dnkmeyhhtek43ng0lyxafyjz302", "1290473932410617856"}, - {"evmos144l79ss0ngl5gafu0c0gzdqmqdwmvemss7vpew", "16470845986340902912"}, - {"evmos144la8u3metp4j58xcvr55q4jsat2qc4yjqlvel", "15492211285355167744"}, - {"evmos144m49uhh87fpslcwk34lnv54x5xkslxugl9vg8", "4875338869430390784"}, - {"evmos144ngap7h88ptxxwezhkqj0t8fgq9dq0xk6l3le", "99563102407787380736"}, - {"evmos144qazlyx72mxkd9wjczay3ngvtqf0fxe42s889", "299830335470621184"}, - {"evmos144qjrvnj6zxdl06fzq9h4yv56uzqj8augd734k", "931546898347862016"}, - {"evmos144qnufk0zjlxtew422k8058wu3equjukdfg25h", "7277053884223750144"}, - {"evmos144rvx3xkh8yxcxtah3q5turlj5jjnq3p42t8x6", "4886557448900030464"}, - {"evmos144t5dxlgr8qh78scxvv9kpvnpjuxt8k7af0een", "10811945431912484864"}, - {"evmos144w9chdnnelcxwnkwvy7d3h3j83z88d6mga6pa", "1487784391912287232"}, - {"evmos144ycnuzcapenazwgwmkxwc7lz396430yfcnj28", "16465786037290184704"}, - {"evmos144z8cp5c4ljtejkxnlzcngvmalg2ztkc38vwkf", "1274154325891735552"}, - {"evmos1454s37rcczlycstz5u4m7lq023le80vlsft72m", "4228184817341288448"}, - {"evmos1454vqh4qnqlkpw0ydwxk7flthcdshkqjuec4lc", "49599845191812603904"}, - {"evmos1455g8c2k8f59kf3m5rjf22fyhzfhp7hw6kpdxc", "48426210171375104"}, - {"evmos1456nw3zjjzuf4m6hre8sl8w8wdm0k4t3ayzzss", "395640901611825152"}, - {"evmos1456ymrthq8yvgsn07gjkr82a37cxurm5ch3cfq", "610514345076363264"}, - {"evmos145a0whj05hw70ahwadc4w8d8w7a006nvjur2yr", "384278681053556224"}, - {"evmos145enqxy5p8zrqzrulypqjz0nmtnr6x5kn94fql", "2677192291699793920"}, - {"evmos145fg865d4j6nzwy5psw0scjevwh4dsmuz6kh7r", "743024666661978112"}, - {"evmos145fp4kueayc3q5zyymzjlvmy4xtkrk7qddpy64", "8219295439272688640"}, - {"evmos145hu5qd9jqcaxlga6g02epztnz4q7az33np477", "815959316818487808"}, - {"evmos145jhpcwd7vf9g8gxamj4s629w9c927fgc2jj6c", "15183191446536407040"}, - {"evmos145l6camn0vgplgw07e65vk5gdrj22vw9je7jcp", "461548396693897984"}, - {"evmos145lqdctejfgad6lfqtjv7g00s36wyzjrvtj8jy", "6454450665765586944"}, - {"evmos145mkrtz79xn7h26vxqeveqmzwqcpqswjf439z6", "34014138272167383040"}, - {"evmos145nw7cqnktt3srhs5kd5qgd0hwdsldv8c8r9jr", "625024174076476416"}, - {"evmos145ptd5l58c3z38pq72zrsvh4umpzl4rj6grw3n", "264602885443477504"}, - {"evmos145q0ssummgnzy9fttzl45465d2dedwgunscps8", "794733509543903232"}, - {"evmos145q3d4zu8yhxj3azlnlgav8p6qf3e8pak8mwxh", "384366988123615744"}, - {"evmos145rys3lmtr426833zh54htpxwmjrefhq4pf237", "197354095485487104"}, - {"evmos145tmml7ssp0kmpcsz6ty520ezrjkfnxhzyuafr", "68693581438498734080"}, - {"evmos145uf9xz7t56f4f68wy0evc38487ac5qdxcxyfz", "681947873846645760"}, - {"evmos145vwrcduyss5ted5x5sscw096346wnalvu3r7g", "2495732661370380288"}, - {"evmos145w7kex4wzft6766606uczk8tefpp9mk33dedp", "4990950973612687360"}, - {"evmos145x28nvm3ykjsrgzuf9ml25gt2p7xmj2qnwqdu", "48018474953600000"}, - {"evmos145xl0jkexse7qcc3gqa2vc6d0dys9x4jy95tjw", "33804523384286470144"}, - {"evmos145zlv5fs7zj5czfsxdkff03jwvvztdkkdyzwy5", "410801977030496512"}, - {"evmos1460p05tur9wyxaqqzaw4vgfdmjsm37g4520mhs", "923099021281231872"}, - {"evmos1462kgwpf080tdjv83zx23rs5sw5rwt7qz22sre", "74221123514734592"}, - {"evmos1462xksnj09k4rhjcp5adqjnf6cgdjs2ae600vg", "1082542428538920960"}, - {"evmos146axlt8lxnwa5r05fjlhnhe2lz4z9lua0xppak", "415852306679638016"}, - {"evmos146c58ghgztcxqgdpx89txc0eumgr37ah6ssv5z", "46264923426304958464"}, - {"evmos146efznmxygh60tgn3cfg5pt4qj9uwcpj0gh9js", "182007559991447552"}, - {"evmos146fgml5fs54gym7fhzjquqms02tk7wrehd865s", "20181540065423052800"}, - {"evmos146lqx5f3mu0yxjskqctg7d63ersr504mln4ga3", "720512575686983424"}, - {"evmos146mlc5l2ryfeknaljzx67vdddr9hrwcj2m6nj7", "2601825625817112576"}, - {"evmos146p2ck0atmul6eqm45pptza9svh6ccm7lqrgr0", "1202591570909605888"}, - {"evmos146pd0nk4etm32q32zpyeekffvgctp27ykgy2df", "1441774932812906496"}, - {"evmos146pswec9pylhgfl0d6up9pqnxjm4g564lmp03v", "10482583648615297024"}, - {"evmos146qde7qsncnhf5ugsnkwdsg3j8r6r3vrlu0sl2", "2071511359236595712"}, - {"evmos146rz9uru63ln0vdfsrcjm4h9vuqwtd0msslj6v", "2991931378867176448"}, - {"evmos146sr977l2lv68utha2k38el9c9rlcmxz5sztsq", "150285419052868608"}, - {"evmos146tx6wl3zh45srhpy8wzphpt06pjdygadh39p7", "883972191152638080"}, - {"evmos146vpj3fjlmw05qyyn329rnxgu0q2kdjk7t5kde", "48205030562082357248"}, - {"evmos146z2qd6ypwf7e8f2vdyhlggaxr28u3u5rxh9hf", "58074317398829568"}, - {"evmos1470v5l8ad5gdgh6dw0y942lx49tjnuhwrdqkr0", "18583276653388324864"}, - {"evmos1473v8w0tvj535vlwp4ulr3q8r4psyf005cfj5h", "4009629674293094400"}, - {"evmos1475ey2vxh69w2syw00uhfnxwgye55wamg9hral", "1319768027098821120"}, - {"evmos1476sa9uzwms86whrlnr6j65tqhzk2r3zrd6hge", "13863487891355193344"}, - {"evmos1476te6tskaez9f6dyspff0t8y9s3fw8thearlx", "2807271133141821440"}, - {"evmos147896jwulvpk988zuzxaxuw56zmly7qca9le7e", "2927395483795069952"}, - {"evmos1479jzt3wdht9jwj8c6en5v8sa5z8ls8vae8c8x", "33816790379411251200"}, - {"evmos1479umqs4rfqnr0469r8vctht7awyvrq998aedm", "1625802970384498688"}, - {"evmos147d5atcawnhzaldt9pn3ay5gwn47dhm8gl3d8t", "2931362678711743488"}, - {"evmos147e8x5teccja68gendq44z9r93wslnxwdsrajm", "54247755065346867200"}, - {"evmos147ewu6y7jzfme9yta3rc0tm0ek4yrpn7gltgqz", "6900001394479525888"}, - {"evmos147lhcuqj2cpmtqz6zuq9wxtf92p5f95g4we3ud", "1657477022810097152"}, - {"evmos147pe9yplk7slkvpmnnyd5ekf6uprr5rlmjnae3", "470966034874624512"}, - {"evmos147pxptehlmsc9w64zufxs5849ujz8yatwv442v", "462644933815025408"}, - {"evmos147qxg8xaxsukx2ay6uh3vqln6jc3t3gxlu5ngq", "1631227620544167680"}, - {"evmos147r0umdwpft22r9u842qh9s20nlnlcg06fsu4a", "3594214349618003968"}, - {"evmos147w7end55yu4wh2h4jlgmw2xnqc6nl453ley34", "655112991275568640"}, - {"evmos147xfjftchnv4r0vajtsjyg8t308m7efed5n679", "129291202948204412928"}, - {"evmos147y7hsqmd7v5a6lly5h5sazey5n382m2mdfe8z", "51324160395829248"}, - {"evmos14884rmegfns4xllsn954l6czd355egvwx4e9q7", "994016619532994560"}, - {"evmos148auvd8afpmmzgq62744xu69g4p35xp75w6k53", "475385106119826176"}, - {"evmos148cgj28fh0musa0tq6wra84l0nzphycflhdp0n", "432622598444284928"}, - {"evmos148cyf2j847xk22eyzcehdpaw5c4hdjpul2tufg", "34151988083283525632"}, - {"evmos148d988g30md9l6pwqncn339807567qryr62q5d", "274732029539062528"}, - {"evmos148er0jsmkcggsw6mqxuqq7eeew43jal9qqsxyk", "10715270942966390784"}, - {"evmos148etasq8eztez623l3glndjq8v4nql9aq6sy2y", "2044677346630489088"}, - {"evmos148f9m524gq307smuqfvufzauxemk8u0a2w35dm", "411245324603049472"}, - {"evmos148hf5xjz2ww7sapcl8g5ek4u7v4yvuqtfwth9f", "9000493300562593792"}, - {"evmos148lw8xzsv5lsv5auktrf9c56hqgkwxuwrddw9t", "5256710570228199424"}, - {"evmos148m59hlnq0meswztdu9rzh34w8wqtvhhgfrnef", "13956930431823491072"}, - {"evmos148nnh6nczm8jx08hhv29ku78dhjpf09um6y2pe", "5575935968723431424"}, - {"evmos148p7ynlsxqnp5pfd4tctgg6ttp9xnqp3qwzpp6", "950937747251391488"}, - {"evmos148qcnlu2lskpc22u77s3zeaj0lkgzj5l6v2dg3", "414070467763471104"}, - {"evmos148r78u6t5wrlpuq63hu62pdg0ruau30tqyrrhh", "7524704206012448768"}, - {"evmos148rryw34vf5wka35lr6a0vuhw60zw37l3ehd3j", "15943761458608209920"}, - {"evmos148sr6zugvmhzsky2t4evcjhxv4szp5me5gfw4n", "2234753608866370560"}, - {"evmos148tk6u29rmj20qk63rjgxul06rq2te5j3ar9jx", "422683459128425984"}, - {"evmos148tnwzmdxf8kqn95dcdlclw2vekxjak7udmd8t", "384502591131419136"}, - {"evmos148xkp7splknw36tyxpdq06nwuf9nkwjrs78rxa", "3546891147168779264"}, - {"evmos148y32vgp0h5mz0twr26u9a5y62annp08fvt7c0", "1425835164090777600"}, - {"evmos1492p2y623zcc44azdftmf83wy46av0a2m40m2c", "1271425992574029312"}, - {"evmos1494f4cvdqkek04s4gyfqnffk9egh6240fnmjgy", "2702385068712249344"}, - {"evmos1494scn822ampqe77evffw3tsftjdtd4wteqdcz", "18003022001638801408"}, - {"evmos1497mm3njxm7cxwush0kegexyufp4vqafscrygf", "25594610944380160"}, - {"evmos1498h2twm927lhpxmwtfqq286aa7tahhxtndx7k", "1787297582548922368"}, - {"evmos14995p3f5xtc9wmnysu7wrn4dr2hx9lysd9wj7e", "40993362551580639232"}, - {"evmos149grsgl87yur6hdc2fgca45zaq0s85dqm0udlj", "674281688608747520"}, - {"evmos149gtqphuj5qul797defzq9260z542r5ld83tux", "12177588029683941376"}, - {"evmos149ktcnpk2xe946leas5dg7rcr0pkdwk8xacmqe", "889555056222782464"}, - {"evmos149mq4637cpxmw2xpfvxks0g8g0rcddwrgcvkdw", "4151580191177867264"}, - {"evmos149myy9hxcnxvcx2ruxa4ewdkdt2eq0nrmgf7t6", "18282756053431353344"}, - {"evmos149ndvnfsm90qfzv2s5960ac66c6z37tpq43n5r", "44698511375213740032"}, - {"evmos149p2dnruwrpjnx0z3epa3nxndzgkcduhg4x76j", "12324748540954329088"}, - {"evmos149pnlcz34mjhk80q9q6sf0n5k8tv6wdtpapc3w", "2091725440077578240"}, - {"evmos149qcv8w653lz0zs3m9jmqwehrfg256yfe4fwk0", "2341016089002559488"}, - {"evmos149qpag7p5pqdfe4jz9fw0cyc35hezfkptzczu7", "52396907530202808320"}, - {"evmos149s4s0a96k7w2vpcw0c7qw45wsz8pxe2kjek8x", "1590615113008604416"}, - {"evmos149s7393awz4zc28cjgumg5a9v4xg6aqjvnufgp", "2992460577893389824"}, - {"evmos149s9rvy3rwsl9ccesfglq05adjdjzq9d6ku85g", "718438343256541056"}, - {"evmos149td63ydlkrl90py2w4r43djathzua72mtr3gq", "20317763658900736"}, - {"evmos149uxgfwjhfsay8wkxjuvs705jl250rwl5hy9w2", "1198045444366319104"}, - {"evmos149zw84sc8smm3r2cupmkgca0sdpf3eyuqg70fz", "1693009560004739072"}, - {"evmos14a3du7dczqttwhnu95y6348jg2p0vkcpym780d", "2983228604588146688"}, - {"evmos14a77wefkapleywh8rycezllwwcac7fdffu4anr", "1511249162298466048"}, - {"evmos14a8f302fdld92pz3uu2allvpxg20pflh2n7rue", "435711725726262784"}, - {"evmos14aaf4ktq06dq8yhqck0yp6tvz243h8egacenze", "7586508016094362624"}, - {"evmos14acnhz8h93mn6k6eh7y95ka2anh0n052jk85qr", "1854122499619108864"}, - {"evmos14ada4gq3edcvycnhktvuf4rj0mquezycdsvhhy", "30733299923411652608"}, - {"evmos14ahd47xxng0f474hsg4zet56dke3yh6gsrx0h6", "3141462988851750912"}, - {"evmos14amz2pny2t3u6akcg93eg4e2xtg7a2tnwk99df", "795181850518290432"}, - {"evmos14ap90kgxgpqmysxp70g3w0h296vmmj32f7lp0p", "13096706728812314624"}, - {"evmos14appwlvcjm9rkaehedq9dcwy2yv2rtvc38nagy", "831427229760817152"}, - {"evmos14aramnnlr62cfzyj8n6824qlazgc09t54r75r7", "4813393954875365376"}, - {"evmos14avnauhr9hj6um23u2c59ayz2zf5fj707qej82", "10515961520608450560"}, - {"evmos14avtny4v5wnxdqh5t5wxcvarj065z8erz06lp2", "28798161645484032"}, - {"evmos14awujzp666keamczgrk4ukylk9zsxy2qh3dpgc", "4691430543784902656"}, - {"evmos14awygsmmqp7ghuczlp482gxsverek4t8k935jm", "35402812944392732672"}, - {"evmos14az9egm485sm4p40kv7d2qt3nylx8pyz74sz6k", "12243793137911824384"}, - {"evmos14c3s8yn5n5ufxc2xjdljqc5h7svg6gyyvckjk5", "384500541973383936"}, - {"evmos14c7ymjd2satyl0v8zlxgj53plg38xn0hlrwd4j", "101126920352949248"}, - {"evmos14c9x2xrxxef3a5suena8pn4k65gcfqqdxxk0d9", "1126214197651142144"}, - {"evmos14ccgfj3akq8y6jwlgqm6pvtvtp3g5jss2g9dhq", "1134876470305829504"}, - {"evmos14ccsl49rn6ehxty0pz0gpnglr6s43afsey49rz", "2018744195546910720"}, - {"evmos14cddcjx4dsfym2zzw9gw5nyaqzeszu8k62n4ak", "60305574839627907072"}, - {"evmos14cdh380jeu6n9stwyr4m5u0e9yueq5p92zlksv", "418718056275517952"}, - {"evmos14cehzde7x3fqcx4cxpg7q60d6x2knt3zjyphcs", "793582921149424128"}, - {"evmos14ch24a6jaghgmhchnj6arjnfy78653mmfsx03v", "368891557958953216"}, - {"evmos14clmc4yuawdcwvlvv2zshhtc9peuu03lu7gplk", "28792777605513945088"}, - {"evmos14clwz38zc7hyxd53njsenudrh8wfuzak5qycpu", "2096948880303337472"}, - {"evmos14cm60xws950x2cltphr4nm4cqwg3cpnw6e8rac", "8046421892401504256"}, - {"evmos14cnt93rs0wahakgs0888sk993f4qdlmg7u5wwn", "894291691417123840"}, - {"evmos14cpehwme8ys7sj4e3d9wf43vqvhj6fddrmurfx", "1389959843000192000"}, - {"evmos14cqstq0pgaqtq9rg0h58gajrc62g2ckjut9wpl", "7200595118399253504"}, - {"evmos14crd64sk9g4qyfll4st0wsj6n0pfw3pf9ecnv8", "133848509356225536"}, - {"evmos14csgrut0re9hefxkjsla8u87fl2g8v0s2f2auw", "4405787174108342784"}, - {"evmos14cvslmgghx5ruh8ftxepv9xlkk8wyxz0r652dl", "16496965646472890368"}, - {"evmos14cytpe3wh9vda4vfc2spsnynwhchpnjq9u0lck", "2774174538132807680"}, - {"evmos14d8axfv6p5v45pl7q7qhqsuaswsuyvclkpzqcl", "1197993778347539456"}, - {"evmos14d8w86dysptme7e0hjy89h8syu7pzhjfwu6dr3", "2718535624107294720"}, - {"evmos14d9eg0lfdycjx2d4pxhtzsvepggwlgh5uak36x", "1998499545956125696"}, - {"evmos14deadpn3vvu768uks209nfvkp735ant6d2h4g9", "12087316737791047680"}, - {"evmos14dexdaxh65z7maqpgfydhzfhjxfm9tl970l372", "2170714006547210240"}, - {"evmos14dez5m84nlfh4egxp2tkvxm0rs4he88llcxrwt", "4111823071845928960"}, - {"evmos14dg3pkkrd07qqzgyjerk499ft70t42dyy367u6", "374174450664624896"}, - {"evmos14dgqgdflzts3dw70p3rhwr8lumxx9fmk7yvayc", "37388462777232154624"}, - {"evmos14dhwn5ha6q7kmuruktfwwqacvqxw67lsrmn5lc", "2578118085173248000"}, - {"evmos14dmlmx6aw78k5wtvqnd20zpyxya376q8h3qhuj", "472569559786442496"}, - {"evmos14dqg5vzldk7rvw04shtqdtde4c0mh28elg33x7", "19817280387692032"}, - {"evmos14dqknl9zglcf9q4fdyr66x5ht2gjcflnyxayj0", "2428977987048251392"}, - {"evmos14dqna2he7w87uzgn3l6glyrur4tafhrflt2v9y", "3701849753742704640"}, - {"evmos14drzlh40t5qfszaurstaetxpcrlmdg379a4q3q", "258968501304713216"}, - {"evmos14dswcxjrch7dynfwem0gxef23fyuhd4grkqn7d", "11449916858157916160"}, - {"evmos14du27ht9879m9v9n8wsrv0jf9aeycpdgs9726r", "17903658848553328640"}, - {"evmos14duylrxs243snyvn5s8mn549hhd0tdc6wkmu2u", "3372293403180446208"}, - {"evmos14dv8088v9wp2whlazqlaezxhuwkmzdrge9zza4", "32061302626667347968"}, - {"evmos14dzyc5ejh5ltm9n9n97lwz0nf4zkrkaap8d00c", "65548732765111552"}, - {"evmos14e2wtpjufk70llwaf73t5qqs88xluyvaekl8fu", "125249275627291648"}, - {"evmos14e4cevx2wc85nd6sa5qu675spt8pn3mcy8yzpk", "20546708230539501568"}, - {"evmos14e53ahc7vvglhwclp5emqpukuc29szr73w8lml", "2091930457457647616"}, - {"evmos14e56d2v4a6mm0vp5jdv772d2292gs6da9kdr0v", "1404223729135828992"}, - {"evmos14e5tfmrn93f57hfapwvs4uhrldlzt7lr02c55u", "726710475986329600"}, - {"evmos14e7jsdpqzydtza5tvt873c3vgpp8p9nkxu4c0j", "123167200770348032"}, - {"evmos14eazt6lqkqsmxyu02fs3mvlzmy6yf322gu0kvn", "1717942117136877568"}, - {"evmos14eh080twnufgjmemf6zl0c3vh0s6p4rvk8qgzx", "657442954068455936"}, - {"evmos14ejkm9zc85v9ehhp7pq6tem3x2ra9uh5fwrkec", "4197573711820509696"}, - {"evmos14emkx3syphp7mngw37r5jt04qfazpnfml8wn5p", "7740123606301171712"}, - {"evmos14engvcq0qqvm266v3ypztnn4ye5shq7pups9qz", "7879516050335952896"}, - {"evmos14enmctqqhsmezqqa3g97alc55g0tty4m6msj3r", "9750964782057363456"}, - {"evmos14er2djvks676rsu5ewk3a2s847rlt8hu2qr735", "5875571601629489152"}, - {"evmos14etgwmj7mlkj6a6q0zlnqkhg7mkwcvsa9jdjju", "4354533476764065792"}, - {"evmos14euycut6a8eejwtpqgwrlevnvczwayu6zjewdf", "9337186442661498880"}, - {"evmos14eykaqgtr2l370fslpdpa3j2rppp0yxuktcf8c", "14295463653754982400"}, - {"evmos14f0nv2xeq4t59md46ldefwlmf6eqqtq8788ps4", "2737917991234404352"}, - {"evmos14f2sv9wtzwq3n3fcgchrcncxn5m2jhyppdz3vp", "4743243713075314688"}, - {"evmos14f2wcwmpgk4zlz43gacqtve7h0v4ywe9c2vdgp", "1196909071186001920"}, - {"evmos14f64tnjqm722d7c8kvyh5xkezyhll2dvzuwhjf", "41594836662461562880"}, - {"evmos14fc2x3g32x204zpwek852q9g9e3v7nw825vfm0", "141908973604307968"}, - {"evmos14fcd8xvx3yulyv7e6pl5lyuadr0wh6f2xu0tgn", "153744593769308160"}, - {"evmos14fe6ktnx9yfp8ymf2emxzvlkde9akfnh6hxhmf", "751004612877545472"}, - {"evmos14fg7wnygm93v8uz2qtlteveyrn3s59jjv58zsv", "3521377759595646976"}, - {"evmos14fg8c3drkluwxqkydx084nrqd0mv482dl48tyd", "18506571480341118976"}, - {"evmos14fh5v4x6szsy433j5aps2898gslz8emjgrn97w", "1430780807941357568"}, - {"evmos14fjyfka0smckhz2w72wjlh0l02muln2r3sd6kc", "796557790140376064"}, - {"evmos14fmmskpk96dpr8lu276qg09a3zdp7hzxlvngvk", "675495222226858240"}, - {"evmos14fphj0m9w8yr7tlz3xhufatae942ec9ta0xze9", "11717983626560196608"}, - {"evmos14fpqjeswge3lxggcd2zv6jl88xl5qhjhfz8268", "701086663574528384"}, - {"evmos14fqps4pcgexy2939yykq3ez9wpaw3zyr4yhtpy", "6354921088415754240"}, - {"evmos14fs7n9pwes9vh9yhnmja9hlhsx247r4yzhzcds", "1118176173045520640"}, - {"evmos14fsus754kwfze9wwt8hyv4t70dxkguy9gfq7ka", "675526593880894208"}, - {"evmos14ftcckns79w55g3wx43fkgnsntduvtp3uezynl", "829084457375860480"}, - {"evmos14fw3q72yltaaahut0jc6vj60cc2my64h426rc3", "831279174762618880"}, - {"evmos14fxwvph5zpy8yzhqvksnhu2gtkpuuj2t997t39", "384296598478660864"}, - {"evmos14g0mus6wkcw2d4uk0e7acy7exs3qq7yj2vfu29", "1007031365039942656"}, - {"evmos14g242plk47lfv6ktshaqw7k00cw8vxnleq2zuf", "1029825162013601664"}, - {"evmos14g2jkfu48exgkm6u09cf0pa25enk55kcr8cj2z", "29219718577049886720"}, - {"evmos14g5gqr7qky3sy348q9wgcck5mxp4w9t7k6m06e", "38650323332171726848"}, - {"evmos14g6dkuzhhghvf4s4vtyjt0aun2a6ys3j2eap3z", "310360499214868480"}, - {"evmos14g93wa7apa3ru877r4g0n9zrh2va7tqwgf9z82", "8144202022169278464"}, - {"evmos14g9jd0ynanaa7xusjhslj0v4p9g89p94d7yu6e", "298650343477795840"}, - {"evmos14gc2zg2dx9j7nng8f8rrvtt9hephat3lsncey7", "155061271982102016"}, - {"evmos14gcd0kaxe5gdxker6xqjevrxt3vh72q39vwer4", "846078214723241472"}, - {"evmos14getrlj8gk73pu6t7tth5vmhwquwdz0hpg4qqy", "10533392347509319680"}, - {"evmos14gf53gevemfykqv8vxay38jrsuxvh7fgrpnh6c", "1529140092952067072"}, - {"evmos14gf9c9uayqp07ty3lddn7edqekx563u0weg4d2", "1193394403787910144"}, - {"evmos14gjdpm5redu9hc99w95ju5t05c46g0hn5jrchm", "6146256396010833920"}, - {"evmos14gmk8nh60fnlg3qfthjmduxw39ywyfjvfv2ez9", "1292175846074829056"}, - {"evmos14gqaa3fs0nch7gygrgegdh92qcjh3n48z92zzf", "1554805799994918912"}, - {"evmos14grrv6u36afnq39athxuf082kzgvddyrnen0uc", "2659017477850167296"}, - {"evmos14grvewuwglzte46sanee7xpk04934ulllk0835", "1945156054264026112"}, - {"evmos14gsy0zlpp558xe6zzhw3vvjlwh8ajz60hxj8az", "384157695968512256"}, - {"evmos14gt6qtdms3rkp3rw9hgsfxw0xnd6usct24etav", "5435660528662457344"}, - {"evmos14gx72vwp8kgplwnrppge564wecy0jsflapgxpt", "31518634841331367936"}, - {"evmos14gxpnwgcq3l2khw9knsdra54smq32857qatsdr", "832547685242258944"}, - {"evmos14gxwap25rwdw6wsec3tnl7ydhc232adqd9dyft", "190650482462670848"}, - {"evmos14gyfatnfwpxnsdu5zwf33emt9r7lmz6p8ffr0q", "1218216833110993920"}, - {"evmos14h6rqundqrc62f43ssuql0nrx3el78lh2fwfrc", "410979579568149760"}, - {"evmos14h7zh40axhadwe9jjhw9v230wul5zkf7fafc6f", "10560530084144003072"}, - {"evmos14hck7mnd50aqp9vptm0haxgq7e7xkdrmrq7u35", "1472151320123838976"}, - {"evmos14hg6p0k4tcg8kh0v4hg3c848d6lpy2rgamyex3", "4144513319048349696"}, - {"evmos14hh33f2hz5num74hyhmxer82glduyxrmxwcljp", "5167853220813759488"}, - {"evmos14hjvzrg4n2xt6s20nfguqw52peds2epsm93dk2", "24825188471849226240"}, - {"evmos14hkkzakztjn3ckany5lekhn4x74lauvxjfk09f", "369001079774574080"}, - {"evmos14hl4ek5vmflsud8583ud0auvnzej3785h9dq6w", "2164988892706725888"}, - {"evmos14hld4x2ar5067x26vd4clvkyj6shtakl3kay0m", "5069790996655259648"}, - {"evmos14hpurtrmzud45tm7trzjyq7p4um7w645y0zcp7", "8974107534543323136"}, - {"evmos14hq24ultvvjxlejw3ckcalumlmyk85w0lat3q9", "4961025882887241728"}, - {"evmos14hq39vyd3rhxe0p6ug34dzq2t60uxgjh3qlfr5", "231018885178198016"}, - {"evmos14hvsdut62dcrvt3es4l4mazlkg0cjpt39dtnu8", "38143876105039298560"}, - {"evmos14hw9dfrhwems6cjq6al2ncqw0p7h3ryd97tgh3", "440153826771495936"}, - {"evmos14hytzknmmrfmfdehpz7g8xlzl5h9kpd3zf2df9", "1179117617234023936"}, - {"evmos14j0q9fnkpt3z4fnj4ugn8yp08n08qvqh0ja690", "1594350969620408320"}, - {"evmos14j2fugsqn7vf9lfj5makylfd5ezvule6kwgq5m", "6108284162019971072"}, - {"evmos14j3lqcgqlxv23x6j67zm4zdgyl7lqsy9knqxp8", "14679731613148260352"}, - {"evmos14j5x47mrgd4kdagkwh8zxdzaha8768g5kas4vp", "1090360100285273984"}, - {"evmos14jcec5c032l3wqv0f33ew5dgew03ljky2drquj", "5287656033763227648"}, - {"evmos14je3y7a3ua9p5ks42lrju3u39qnuz33rnkwl3u", "1708726438764888576"}, - {"evmos14jenu6q6y7cq8fx2dz3fqccc59pcmrut28ez9e", "3114695871060541440"}, - {"evmos14jf3hw78p5asc9fdaql2fyczvp6y7ngxxe2zk8", "8563628027221176320"}, - {"evmos14jfyayve2n0dusqjga6746zaftzv5f3pmrtu6z", "476583812272086272"}, - {"evmos14jj5ly2u5s8698uhklypghjlu828xd5tyjmsw6", "1544767821033863168"}, - {"evmos14jjt6alytxucnzsdaxkhc89vxnl4grgtfksuhr", "1922918438516451328"}, - {"evmos14jlygecy85p48puy98vtth532k7lpry3q3spt9", "27788209600224526336"}, - {"evmos14jnqktsqhh87gqthdrtgt58km05tslnfg7c7sr", "4946795262221683712"}, - {"evmos14jrccrmqmtzv6u4yj4k69g7g53kd5ymzvy8xmm", "2152257692365799424"}, - {"evmos14jrnyl5uqjej4s2z89w9ks03lqcdws8nenqkks", "142597270907551744"}, - {"evmos14jvs6275w96rfuz4htuv0emjkut3vxzpkym69z", "9198934463609192448"}, - {"evmos14jyp9djh38h7w7ez3a55539rmqlfdzenp2gckl", "28639416052631666688"}, - {"evmos14jzllnrd2jw6hnerm9hnesmxd55gyttnzfxghk", "1857483183454235648"}, - {"evmos14k0hfn6hsy2xy6w6wktp887ghxg684nha3unyn", "3274140015510778368"}, - {"evmos14k4xqxxyp93tsj5uf9rv2a7v80m397eyauzatp", "170008820819215872"}, - {"evmos14k597a3f7fr5kx8rnc0rxuyrk9442w9zmdfrcp", "91502079025364516864"}, - {"evmos14k5xtct5u7u92dd5tzcm2ufqywtfwww0yzl3kq", "50124627582107516928"}, - {"evmos14kajhkusvfyn2950wgerhmnckcjs7q3s2u7elt", "2349020077140416512"}, - {"evmos14kalpq75tk6v3uyfn7vqyk9dzl3fy3ugkwesg8", "1291962379522467328"}, - {"evmos14kfe8relhdveh5tsl3ce4vsn9kunldwatq3asg", "10405764748443246592"}, - {"evmos14kgusgw2qk6ap4kse9258q2x5yprl36eg0wxs6", "2048562770503581696"}, - {"evmos14kkvxqudhrzxfw662k87cctvskerw3gwcf20t2", "5731882120884232192"}, - {"evmos14km0da53rnme9jk7hvsesdcykxvksdhg0jnhgx", "3156931638902562816"}, - {"evmos14km25xnfranmdvuyq0la3vj8hxlvdpt3pavewf", "3397984219258844672"}, - {"evmos14knkww6g6et2sl9dqx7t4lntrmndvg0d3nr6cm", "4332948974974070784"}, - {"evmos14krrnr9h7zlsg4emkdnj7tq8ppk367jz67prtn", "664390859148787712"}, - {"evmos14kslvga7lgx0j3um78p8sy5ecxk85mlyj6nx0a", "805992569417327616"}, - {"evmos14kxumg7lszjjfkegy3pze25eunq20h2wj2kmh3", "1087845783204249600"}, - {"evmos14l2lvz4gad853r42pmucc8zmqezang9qjacua8", "255084059330650112"}, - {"evmos14l52z0tggtcj0zgd29arqh59q6ryrmtqsrcuuz", "6468624486973730816"}, - {"evmos14l56776a6qj2rzmw8pgp557a4d9tjnkqxdn3w2", "18907941662046003200"}, - {"evmos14l6qapn873ce7ys40ph5e0q533w9a7p5vdpys7", "1606893526477878272"}, - {"evmos14l8l7fsgmmyxpmn6jgn2r76uq6jjhwg4gmssum", "1451865539813885952"}, - {"evmos14ldzgq45js7cnnll2t4eqrxlpsfk5pmvjmj2n8", "462593561459622400"}, - {"evmos14lfks8xtp3fd2jk7zke2cdryyhyw6rv4m4cf80", "1634107193479894528"}, - {"evmos14lg5f7z2eu6s0zcz77f9lc9ykuyj6rn6nuhf0q", "72678203227801796608"}, - {"evmos14lgqjj464e7hryajumls7tyketkzf2tg3h0vvg", "699978535135851520"}, - {"evmos14lq6tjmqtw734f0kg92930z9e464f5ytcq22vz", "2051847526688869376"}, - {"evmos14lq8pqeed8azdhxfavez3pluezmgzj6p3twhqu", "1790022196965565184"}, - {"evmos14lrrfw9drtad5dt05w2d5vzy3h59hct3pq9yhu", "6799873217543153664"}, - {"evmos14lz49lwv7ux8tfwf5s0xw4la5cn9dd0xdlatlj", "10128786462923132928"}, - {"evmos14m0tq6m2d3866dl6yg6k3seca993jfntqlu4tc", "9776296323918434304"}, - {"evmos14m3ceqk9hne72ls0q28xtlv9ndvgnh0p2dejkv", "82066366945767168"}, - {"evmos14m4cpdz0q5gu7km7k7pmgnm54uyempwqdy75u3", "6134264258509258752"}, - {"evmos14m4m4gr8qu9ec86mhatsyktx9jy6fv8mm4yd4z", "955952290476994560"}, - {"evmos14m9huv4y9dv3w8dsv9pdsldtamgge3ffndqnh9", "3679476155555799040"}, - {"evmos14mccepu5egqwj98rrp6rwv4wfcevrds5zv2drf", "20821832813722329088"}, - {"evmos14mceg2ycquj6nlv0ghwhnps4q4dedyv02lqus6", "18439758754536128512"}, - {"evmos14md6gpss73huvyeck4ke0z8g00lrtqeg45wg7r", "1513325074846312448"}, - {"evmos14mdq52jeltn4l4us28ehngwyu0qs7tdc56p24u", "3239900343073038336"}, - {"evmos14mezj9055y88077n60egfrnm7z03hlp4m7jm7h", "21153084932247068672"}, - {"evmos14mgs30jyqlcvr7t29v72kvsmalfv8ylu5gs8w8", "389918398077537280"}, - {"evmos14mmut80gxujf66tz3xsem5xuq2w7ur7dg5e0ly", "12149820414644199424"}, - {"evmos14mrjzylvfa8rn887pw9e3kwrf3n6y7xwur3y7w", "11014696179420123136"}, - {"evmos14mrzf5rcpyhc6k22ne7efmz9tnrfqx9v6g8rh2", "468983596621502208"}, - {"evmos14msnw853nw8zl8htnmk5edguemr56j9lvhkf3r", "5886764197016944640"}, - {"evmos14mum9qc465waljgt7fus5rglncvvaa6xkram75", "2744788538604982272"}, - {"evmos14mvgw2wka8mnqn4nhx4zyjjew93dak2d0hwqxw", "843941250314471424"}, - {"evmos14mxwxfyxh78k2lwe4erzwpyduxnjcsd9s5qmzp", "10609722580514795520"}, - {"evmos14my0a3klq55txcmqa0cxv8wl3g42g04nqahfts", "25899913845830127616"}, - {"evmos14mz5fhrjmrprsaecwhk0fcq8d6xky2ugktglec", "6624872713365565440"}, - {"evmos14n22m0hafc7v6r0hkgw3e9fnk264d8scd7v2x3", "3600149786284507136"}, - {"evmos14n3judhr7r4lprre808njrjzsvw9m4zfzh9t0c", "326285192965437440"}, - {"evmos14n4pnev7cdnaaav8jlf7rgycvsgnxmg5ps08hv", "491749438128149248"}, - {"evmos14n4xhhzgkzkmkm7xaqgfaewp3lr25vtu9uyhy9", "402099884763057152"}, - {"evmos14n7zclk58ftg5ded7yk2fc8whfgp3g40jwl25m", "7146997379932127232"}, - {"evmos14n98l7j6nyz37hg2zsxh9hzjljm5pe2llwelyc", "2604198983337845760"}, - {"evmos14ncpn9pnpgqunhnv9q4u7mrzyvdte78yyu4mrd", "5426187547411014656"}, - {"evmos14nkykmkjluzry8hgjtf5yptsu65yrdanf2s2lj", "681245464068657664"}, - {"evmos14nmwqtyzngvgdj625859vnvfv2kgps9k8sph4k", "936340999358390784"}, - {"evmos14nn7esv9y42p6kk4p9fk3qvc4sw6urlry5qlmn", "17606182572368052224"}, - {"evmos14nq3qf8ur60pjvlf69yuu4rfdddaqt4xr7ce7w", "153907979868944384"}, - {"evmos14ns6uxjdkwk7cg4nuytn4l599fdxleq2ww2345", "115939883954209280"}, - {"evmos14nslr3k9ezdw8lpjp8le9ecjp7m5g3d23p5s77", "366024172885679360"}, - {"evmos14nswgasu2xv5erw7787lqrnhetefwevaf7pzkf", "8642630637752492032"}, - {"evmos14nthvnegs0n7sn6p5tq8alcd2jxsu30x44cy0q", "51257760821233920"}, - {"evmos14nv4cm92crsna8fp5rq80kdxwhaxhg27jk75rz", "2491572638390198784"}, - {"evmos14nwmyxd5ypk8t87mfyft7lvu6svlvcpct6afl8", "464069977272567040"}, - {"evmos14nym0kl2rjpw72ym7vlh4gmd0jy9fw82ypamvh", "4816733604426074112"}, - {"evmos14p0jl6zqjptw89c80ptfsy64l26fh6xeh59qmw", "56805447713661952"}, - {"evmos14p5qg2ln5h5ke6zth2c27f8sgzh5huc3qatmzh", "285125096869836800"}, - {"evmos14p5zs5kzx363n5g08dzhmqhdwy0kqeq5ma4djm", "4874249036914507776"}, - {"evmos14p77w4fv9zdnt55qfkecw8uhdaqljrnrtvmthp", "14947155597814407168"}, - {"evmos14p7e4utry60f8yuhh3yhqxfcme9mdu8sgdxav6", "1482447186827853824"}, - {"evmos14pdywmgt85wjadm05q4505amtezer9gxupds3j", "2429080356430802944"}, - {"evmos14pgdzzv9x2h4rt8zpzhqa0wdcyxt3y75jksnf9", "817026738294464512"}, - {"evmos14ph7wf4dwyq9fejjza7w9fc0wmc9qh59wpcnny", "98925647274403328"}, - {"evmos14pk85xjluv0f3lwrtx76jjl2m3yu7jgzwz7yz7", "864620459145781248"}, - {"evmos14pm8ktnnwr4kmg8fcd82j8hfae4rmhten0gmpq", "193323719942443008"}, - {"evmos14pmssatsk5amqygt904fgya6qzyevy4g76jy23", "211729485059617024"}, - {"evmos14pmwd60wljznghs04r6wvfspytpqclhmsmw3vt", "1350661967360425984"}, - {"evmos14pmyhwedtnmls3p8s302224mxn9f7gr6gqe2r7", "40682121695764873216"}, - {"evmos14pnwydsx6eqhe04u96zlylh2dl3e6gxxtvgznd", "536740491780960256"}, - {"evmos14pp5s73wdjpjkau0ff2st0u9rhszr4vggzqpnx", "3852096556229678592"}, - {"evmos14ppyqer8sl2yv4gvd7fsrl0s2yewj2r8t0vt5v", "4353985776283909632"}, - {"evmos14prscxjxpwftltt2pjs0z65gd622jnrdxh52ra", "7571400759124237312"}, - {"evmos14pw537ckwap7z5v2errqg4ncu8w0le3r70g9fm", "5741514261200219136"}, - {"evmos14pyndg9qmsaz70f5qm5uhupvg27hhh5j8hzs7z", "10682119873174550528"}, - {"evmos14q02r37lmltxj8tnkxej82gezyqqh33s9qz7q8", "1290365385362050816"}, - {"evmos14q5ygafflcvp5klvmufdn5j0fs929urvqdhzxv", "1757142224073089024"}, - {"evmos14q7q96r8tdnzey46kc6au8wkn5n97s6y7aez38", "24478128955960549376"}, - {"evmos14q9cxknwy0wlw6jdrkj7dhz97g8v6qddvn47vj", "88966566898039848960"}, - {"evmos14qad4wutpjl7uklyduswq2e3wqcq2ju2jjazv8", "2391239073892785152"}, - {"evmos14qef9glt7tnyw0z90nrtq8sptkv93vtk3g3tre", "706559475237402624"}, - {"evmos14qfkd4pu48gerhtd60nl52wrjvjstn4katsa49", "3837731591562186752"}, - {"evmos14qjz3vesupcaufpxrqznknezc88putx8f34nj3", "3521511515149073408"}, - {"evmos14ql5xeuxzegkltqu55u3pvetkn2et0657zamn4", "284516393678368768"}, - {"evmos14qlqhk64s322l2ypr0hdcplzfrwvfqe9kh3t6v", "1121515734596909056"}, - {"evmos14qmfj5xuq5pq55hg3r7k4pcgn2ythemjd6kak9", "6042298663357357056"}, - {"evmos14qpqrrl76gfzzkr2hkvt2c7u7ukzl5e29dj480", "5888233792244793344"}, - {"evmos14qq5454x2n3mnhpwevz82q4uu9r8h0yclv4fgv", "67053411015608064"}, - {"evmos14qqnt7c26gpd4jnee8a27trd5ftfk82s0jarmu", "659296806507881984"}, - {"evmos14qre3n7ffugpqfna57xxknjh40tm6v72559z9s", "30293864987705344"}, - {"evmos14qsucavru0utj4weqsrgrxwpz5xxrqkmmq9a0x", "1287089078243506176"}, - {"evmos14qt3wt00aa2a4fq4de0pa7pfp2xjgajkhxxq7n", "14169146789499488256"}, - {"evmos14qw7rxg8c4m7rcfsgeejx069n6hhcuc3fs2akz", "12941100003854336"}, - {"evmos14r3wfqhq7lsy7d9u84tmphrfplt25r8mg85gcn", "1786676951201005056"}, - {"evmos14r59jj34h3t3nx4k5mqf6elpkfjwq6e7ujrvf5", "2960724529361543168"}, - {"evmos14r5vtt0nuu2vdqs4p5hcrtydt0azq59sq7ng9e", "798393684199349760"}, - {"evmos14r62ju08rwagy52wv6g82vnv02fraf4c7mgrvl", "2183100042083267072"}, - {"evmos14rdx99p3w66pahfserswgzawp08uvfyn0nzzmf", "842329730802407424"}, - {"evmos14refpfuz7neng99q5llxr3n8pkc5pl77ncc4r2", "21245492704813539328"}, - {"evmos14rerscmjfzvvhthujlla8v856m2wwcqlq0atfu", "107637152796134400"}, - {"evmos14rgayyg5f9e0e36nc8tprzdc2tmdwnfjgdrze4", "1867255229655425024"}, - {"evmos14rkx7k8rpl8e4wrhtn9y0s7tztnr08g4a72zhe", "369404785486505728"}, - {"evmos14rkxjsj7hjj3kgldcppmk0x34vvj6mkgqrsmg6", "387930278080124160"}, - {"evmos14rr9pnx7ccrcs29np02j46pv4uc68z4wq303y8", "883420004493881216"}, - {"evmos14rrp43zyt9pce3g85d6wf4u4hupd64d6whft8h", "251186289701745152"}, - {"evmos14rsw4gtc8psz9kcz3gmpuftma9xkjru8upug0w", "1479606365162921984"}, - {"evmos14rt79cyjfugxs2wg0alhzr5waqlwkja8jjxmn7", "352307901170220032"}, - {"evmos14rtgkpk6a49e5ykp3dg843w7watuhelz3rtye9", "842142810764595200"}, - {"evmos14rxntktpuf2usljca5l7jwtwpyr3dtkv0n25s3", "9171075476169467904"}, - {"evmos14s027unfy0k03v7mxma5g7ykpqnv9wtru34kx2", "13053990610216824832"}, - {"evmos14s09trzmnnhjs9l7ly2xzamlugf2pavneva6zk", "340834973696286976"}, - {"evmos14s2m795583845wyvzdsucp9pt34ny9af7sxn5k", "1695706450639352832"}, - {"evmos14s2rdwxylm2ulzp24egq8wv2e0x8lwlcempzaq", "1085927381476991232"}, - {"evmos14s4xdunygls8c2c03smck8q08qa7trszgk8h89", "10785946624514856960"}, - {"evmos14s7yq22td3avl0eg2we8u0ackwzenfl48mrlnd", "10938432601986250752"}, - {"evmos14sf2uvu95fs27848fnguttc9anvuax46eq9qyn", "1737808041373765632"}, - {"evmos14sfe230h73vvuyt3zhzszmwypf58nm8hp5pv69", "5019437544301488128"}, - {"evmos14sgcvwt7k3hena547tpfd94yjxc4wgp5uucjtx", "9345042011121489920"}, - {"evmos14sj27pd82zv75plm0uks5j3v9ww7f46egrhhmu", "724241449198796288"}, - {"evmos14sjmnth9rpmznzpmxyc2jvx54g24ngsmk2cc5p", "811217093013687552"}, - {"evmos14ske9w8lhcmpddj6lzuqwy0ygvzjnxux77sass", "4181390529777238016"}, - {"evmos14skhy8mutz53efww89umtduhhp3l299lkftz20", "3703184683752587264"}, - {"evmos14sy3dl2428228aym3xec87ghp2ggkjnspnuyjf", "567290513495552"}, - {"evmos14sz8vaqzfmzghj22j70tmmhxn743ptdmwf4csz", "478483554027745280"}, - {"evmos14t04g20629u40a2vvv3s2vv85ttjjlh5d3xyv4", "83456853090739456"}, - {"evmos14t04twucdr9wmcu4p4pfku2xhytsrhr574z2yp", "1477651487757893632"}, - {"evmos14t46y6uy5zxsy3sq5md5zj0ggnpx50hwsr628r", "3000395395215540224"}, - {"evmos14t7m4h4z0yv0hdzrfnugk4h4dtmnyuhpfpwd27", "26845392547232890880"}, - {"evmos14t7yz9dpn7rp0lcnwmyagpkap05lxsglrcrvqv", "22854645367305592832"}, - {"evmos14t8ndx2ak4v426hk7yumjh0mucd7gq4lwe8499", "782533995056202240"}, - {"evmos14ta3vsje6fcjy5c2aaf4mng9nadnmjzyulgctc", "20834025187809230848"}, - {"evmos14tdqe4zma0xywxwhxse87x2m32edez6z24chng", "1024186107241716736"}, - {"evmos14tfg67vg69zv76q99ypzgmszetzn0p9wddrcse", "3909503242127368192"}, - {"evmos14tg9v7jx4eph4h6umnxxqe7pt2pmx6c60ak6xy", "38213327222926876672"}, - {"evmos14thrmf6zt03lz0072r60k4fpsscuhxszwsneht", "6986381878985924608"}, - {"evmos14thy5pn23ymerala66v3kaqaesw5d6h0vr684g", "4775361114924738560"}, - {"evmos14tjj8ajmkymtkvt6fe6jrd6vcg0juvx75rr2fz", "935415102704628096"}, - {"evmos14tleh8mrwas2zldlltpw7yvr64j9wdlrd6e6sj", "7687249704103313408"}, - {"evmos14tn8s4lmezcd9njsjk0t26xwvpe39wzvhc2u0p", "3987116509556251648"}, - {"evmos14tps3fjx7zctvdamjys2d65xkk4wnqlxchjhqx", "411221944128238592"}, - {"evmos14tpv0ln0keeguhjcmeu7tdm02lhh9pt4nzr7aw", "161941348478739968"}, - {"evmos14tpyvq2fqqh66ezcvzu2ayzzns0xm5saq8usnv", "3216201570044378624"}, - {"evmos14trkdxdv4fsxz2l2hqvvj9dutt3t2vp9a8lsc5", "656426932117053440"}, - {"evmos14ttp7s7ca2c8ks6sr46k7l6uzm4l3s5r9h9y7m", "763915241458244608"}, - {"evmos14tuwe0ja8e7m2cll484j466vyu4zmrkzxds0pn", "3604366809885191168"}, - {"evmos14tw0an6nuhfnz6ytyq0e6f432nqlmznc8ehl0c", "5766860567588459520"}, - {"evmos14twtzngfxysf928jswz5arttws6ua9jl5ve39t", "522691309717189120"}, - {"evmos14tz8wv4fv9aadc5gr6ms8srlvru6nfh6flj0e8", "13610910212173328384"}, - {"evmos14u2y3c7la3qykqvxn9adtpr0qjlusryg2wkhak", "79367450923131904"}, - {"evmos14u3wc3uw7y6kp7e7guxga72ka99mkeevf46j8t", "9522084494801567744"}, - {"evmos14u69ecv2dmrxx89sy9cz6ugqcja3n38vxe2e3q", "1351667907359584256"}, - {"evmos14u6n79pegp8vlf98aqk25gu5z64c2v0wh3c4wu", "2866732433939464192"}, - {"evmos14u8ntdjfnyptq95jvx9vqtzppvvrfalqsfvvv3", "602308696994506496"}, - {"evmos14u9e8zr06nwwy40taz3heq56h9qdtpw8eze7ut", "733469665907587072"}, - {"evmos14ua34fpvfrx5lxnvs3x28y9x5p9ny5et5jjszl", "4002364244736917504"}, - {"evmos14uea7we822u52yvekdxc34lpd0lap2xww8vwf9", "8709488822036488192"}, - {"evmos14uhzkp9qnhdy9079jt84qxhl2y03y5dmsv0gpy", "15360096741436063744"}, - {"evmos14uptf8qy3w0kl0wl0fa8lz0sth276mnr094ung", "892024160959141888"}, - {"evmos14urlhnpaxxxa9654557qwx2es4777cz3tu3kem", "10522589238216622080"}, - {"evmos14urqlm30fz3qj2rg7wp2933x6d0hg93h6f392g", "2383111171113040896"}, - {"evmos14usyd2eyy6cqh0xfz6hdl5hld2j4nyssldjjcf", "433703943646434304"}, - {"evmos14uu32zh83frkadklhf5u8lje4zx7kddk7sd98w", "11373591458945695744"}, - {"evmos14uutd9t7n2aygxzmydy6ucgrw9tvrz37z2nc7a", "1502432773590718464"}, - {"evmos14uw4vc0f5cx7m2msuypy7dqz8muwumz5wr8cwm", "186607350625467904"}, - {"evmos14uwgg20m2gggeg5u465rreru4v6jv57826lnuu", "2448746096120410112"}, - {"evmos14uy4yyvfwcwh9h8uwyqs46pturl5g0v388n79n", "2515641129561065472"}, - {"evmos14uytd2jgcczhj7drp3f6mq6qndmaj4tj4gwqte", "51999337303066886144"}, - {"evmos14uzt9zq4ak9tq5kr2mjgejjj9t6jd2nuta896s", "8010211065656710144"}, - {"evmos14v4n0umtecu38ca67s04u5xnajnghglk4fs23a", "6921822985172493312"}, - {"evmos14v8meq9u3crdegd684cdegdvymsq8k9mlsnemn", "3497192915939135488"}, - {"evmos14vdchm0nl776g0uf46nz0h9vwplafnnc65cudr", "2134227410084872192"}, - {"evmos14vkazap4az95f2cqpnkd6mn46lmjpx9auvz89w", "9178595279302424576"}, - {"evmos14vkz5sfdnj8yfr0p2jd57vct0mfrst30um320f", "3254452619852754432"}, - {"evmos14vl8a643dv2lr74kcjyavse5c9lv9l8r9qqk0e", "44387927503706624"}, - {"evmos14vlasmmqufjv5tqecxf3ewttr304dgn2kget7h", "791909290410567424"}, - {"evmos14vlk0kr7pe4dy25dgh2dx8spr7s5e2cuykncxj", "16668723765878190080"}, - {"evmos14vn93nwr2s6yktd8lp545ma9wm70w7zqufr4kp", "1983111870028764928"}, - {"evmos14vsulmqz2srhv9tjq2zpgdzmrz27yumfds5acv", "945804933749781504"}, - {"evmos14vtllc57722rnehqyd4lwzhaassda3v5umes6j", "3565865968092891136"}, - {"evmos14vucn8m0ekwymstkrc358awetkpfsc8752jl9g", "888652244949788672"}, - {"evmos14vv6a0ykw5v6d4j5qse29g3eq4a3wvzh3k8ptp", "3967355037593190400"}, - {"evmos14vvfz0nnya2d99mnfrevsf8khsety9hy2643rj", "21900894055288532992"}, - {"evmos14vwpfllwz80cls466hrr6utuhlg3yw7alpyj3w", "415792983979611392"}, - {"evmos14vxkadhjq47573cthf24l543r0jw9slql9j937", "1446330407169268736"}, - {"evmos14w254js6dxd3pkc4hsp8597fc4a2ecln4cmppz", "6664013275684675584"}, - {"evmos14w4leskvus7m4mky7q6cpsq74m3vpjdcexnqha", "292603581975624704"}, - {"evmos14w4q323pg6lkzkfpgasfx9s6n6cha62p66x3fm", "385581334229164800"}, - {"evmos14w6qrrk05as0rqgxkgxcujg2psrch73tqd9jcx", "701755679145224192"}, - {"evmos14walyh0gspaa45j39uptjlgjgz0m0q9mqwvqud", "403096978770960640"}, - {"evmos14wfprf4jptaaatdc5zyuazquflv59dgpqqjt30", "6155479479912349696"}, - {"evmos14wfsu4ju4557ee73g07gr2u8d35q3r7asz6gge", "3728340360410939392"}, - {"evmos14wfx2zeul8ylsn0tmat9fjpehczxkkkwz8xa78", "1783908678586910720"}, - {"evmos14wgp7uvc33j9gxfjhw5dysauy0pcf9tpmzw284", "1302489618472792576"}, - {"evmos14wk67383mf73whw7xpzuerfagq8jr2elcmftwh", "31289420284683526144"}, - {"evmos14wkm63xzngel9rjtu08scsddt59vwwa75fqg2l", "272766439499315200"}, - {"evmos14wr06udes6xp089ehxlyuh8md77v4ztv32j4yu", "73803966009156075520"}, - {"evmos14ws80wrc7uceaksz8ss4r966rqgqu4rnvlpv90", "793408782692581888"}, - {"evmos14wt32azeel0ml6dqf4ae8k377u909v23dnznnz", "22893251790080258048"}, - {"evmos14wttzyz6vfzgllxmfnzkgxl7mzx8ytafs2lejk", "237640808867254272"}, - {"evmos14wu4c2jfrcx7rtu2yjvcv2g945yhvstd3a3ffc", "32727798759261440"}, - {"evmos14wyp56q6v0td5lkah6nspq640q8cfj7v8xlppt", "884429859255147776"}, - {"evmos14x08vam8l46a3fa2exanvxev86u0uhawwqn8g6", "35781666079297536"}, - {"evmos14x27tsewg0rqj3xaqelfqjc57zh0nnm6zgt624", "6007259275839666176"}, - {"evmos14x2dp7yv2yq9mp9q9am5pwgj5mglrc833szaru", "5634391601238929408"}, - {"evmos14x3kha2x9m9ghqd2xp65fz565es23al2kl7rtt", "1987748455602068992"}, - {"evmos14x6uhp74ypjzrchzru2sc0pftptncykrwmjn9z", "145325795012456448"}, - {"evmos14x72t7d409fldjp0plaumt5kpa340k76xscmk3", "3420358387701940224"}, - {"evmos14x7ar37nuf4p72k90qm9sahvl90txstk8pdfs9", "3752754346978129920"}, - {"evmos14x8e6e3g25a9w7f8ur42hknfmvytyv3ejl4a3d", "7115395141536104448"}, - {"evmos14x8u2pwnu32a0cmr4f959qv7vct59rnp4q2r6l", "239003729291865088"}, - {"evmos14xgsc29rvvy3gp6cu7r6jn7r463kvyqqvf3xc4", "1043829610238555392"}, - {"evmos14xj8qwlf4ngrdyuknln70azpeexvy3znmsts7c", "2151147072778688768"}, - {"evmos14xjhxsa6xfhfcz4zafhj2n9ypmvlmrr5wwu2jc", "1311663241680002048"}, - {"evmos14xjldgmh05fg674l9luh9js5dgf68l9rc7hfpw", "48384795091814301696"}, - {"evmos14xjlgdcctk9paa9ku7sjhhwuagc8ls2uz0vq29", "1008743479157822464"}, - {"evmos14xjszh3d98hxvxqks95ms2lrj5ukwa00fs7y4u", "3699714627070099456"}, - {"evmos14xmeejvac37myw4vvd4mep4u7dk4aqnfl3mg20", "585004464015034112"}, - {"evmos14xqaxl5te4tw2xqy4w3h4ume6nzmv0934m6ft8", "20512728173741871104"}, - {"evmos14xrjdu37kj5ljdlax0hys5d27w9wvrhjl2n93y", "1425440500516233216"}, - {"evmos14xtarcarerdphqxldrelkks78t5kmwnpgks4ln", "32004794000690176"}, - {"evmos14xwqprrwvyzdfgy94rf6lwxk0t32wrwkx5x3p6", "6243050520312201216"}, - {"evmos14xwqztdpdjr72uhru6j05hzcsa8q9w6h8jde03", "5810687196808417280"}, - {"evmos14xxp5xuqxwmayqhv6cmfdt66dpwe7x9sz6ntjg", "843741520515233920"}, - {"evmos14xydyrvfkxwnd4tnjeq6zqtmsrttpdqeqmd77z", "5346641268323098624"}, - {"evmos14y0rqnddv6v5gxda67vtnk2sslr2ctjs9khh7c", "846861554309857280"}, - {"evmos14y5u8jv43vvyy72zphq65aj4k0e47caueu6hc0", "3584447942289440768"}, - {"evmos14y8wwhn9h8ttt7ma3tjg5h3thwtla08fvmlr4h", "1558350224353716224"}, - {"evmos14y9p5st4p9rzg6jnygj9jwjgxyam07vrfle8a0", "2572258630893184000"}, - {"evmos14ykx9704rhgf2r26cgr539dyq8s3g43ufjam8w", "4354319743007261184"}, - {"evmos14ylsvygaz4fkcz6w7rxvfjnyeftpnpwdvan2m0", "10502209334557976576"}, - {"evmos14yntd95lm9helchf3w2ayh9cmwhnuv4d4ks0ua", "1068601324789440000"}, - {"evmos14yp27xtdc4kfe6j5ly352a9cxr47k7dhx990j9", "237667995300258054144"}, - {"evmos14yrd7m0m2pj3hq6huad3dpsv9c77gfjhkhx8xp", "375428977651560448"}, - {"evmos14ysa0mawu65fylkh72rx5dnkx3qaplvhkna7rd", "33955661051751972864"}, - {"evmos14ysxqlxexsrm2zxa3dju5uhqurxh0j92lslj55", "1290992161116146176"}, - {"evmos14yypnkl50xhk72399je2g7z78qqjal4dexxhfr", "680838157464728064"}, - {"evmos14yyrcsx429zat2vwppsgyhc4gekrspmrjugudl", "467327726486177792"}, - {"evmos14z2vue4m9m86esfl732vecqhsd2dhpnyexpy6m", "142036106056726528"}, - {"evmos14z327r88zum65zr8g8mpl76myalfsccvzr2lld", "3054620161704626176"}, - {"evmos14z3h790sulev7v2fjwvzf2mw5kvphkszqpdnu5", "1785115374551861248"}, - {"evmos14z4m2he46cv6wp32s00c8r6mrk7nx4h6qe0wy2", "76358118002641152"}, - {"evmos14z6hq6k33uwy4a2hwhjsf0yal7skw53tgv2vrg", "596260734790819840"}, - {"evmos14z7ax9tfv4m63znnxxqa9zjmu7wsrw5s598255", "84909758154760704"}, - {"evmos14z89wsc7dmvm8g3cd55h6vhx0pcmpf0ewwjk3e", "1550088382838885376"}, - {"evmos14z8gsge4vtwrzctzqcf7pznwgfjgxj5m9xmdch", "1282066533769897472"}, - {"evmos14z9dt9kk9ssv26klecfq3zxqfzyzqn2k76dwjv", "59278291479559168"}, - {"evmos14zcp9awjah8pk7qpzarn3zt7t8huhnhr9ynv8r", "313404321636807680"}, - {"evmos14zcw7v5tgw297f8dn9cc69gmg648w868kx3z6k", "3071859166073779200"}, - {"evmos14zd9krpemm2csu2k2xw9vnj0n4hrsdasruy0gv", "13889823309977591808"}, - {"evmos14zdwmxlh0nu8gder6epjxh6pdlzsqj50mk0uyc", "655539636643177472"}, - {"evmos14ze2rzmf4jjyyfmq2jegsh8hgsmje6alwls9j4", "3468994491979530240"}, - {"evmos14ze9mzlzd5e5vhx6xnfskgggj0svfe2523v72g", "2490072036733337600"}, - {"evmos14zf8gjl0y8h7r92qxuh6nesjcfa7hwzp0537we", "42030668691854286848"}, - {"evmos14zqw8gaaa0num6yhm0fva4sjc8kxy4rr8u7fp3", "8975337353832863744"}, - {"evmos14zuahcq2x77t0xf6ewcvt2pnf058ywulfvzh4g", "2536863828738285568"}, - {"evmos14zvuv3fcrly4r0mkfs6efjm27w39xsuq8xyk24", "15848188059521466368"}, - {"evmos14zvvpyzmv947yn77tfj2pe3gwj2vjgdzue75hc", "474772597938941184"}, - {"evmos14zwgn2uekhjjlvu5ygp5a458r73srumgy7z0wz", "2952181848899411456"}, - {"evmos14zx0cxrvsasnum4ledjfpsdtckfgmgqfftfwgd", "11872348005517090816"}, - {"evmos14zyd4aksl5u837vlxgc8aex4crussd2u5nml54", "977939753406861312"}, - {"evmos1503lww3v8g6ew9hl6x4nfeypeez29c0vdwlfgh", "1686846415247114240"}, - {"evmos1505q09k9tk66aalfaj7rqrsr9gfj923u0wpe3l", "97921936708822016"}, - {"evmos1507w54mr83cx933uwvazpt2vngn50mcc48cg42", "1161974155639980032"}, - {"evmos1509lh0gcykaqjzy7lkxwt5gdva3zygcmu5l8uf", "198427681222627328"}, - {"evmos150a798rgz4s4yrh988w7qrux03j6jnepve9rxc", "4164028069076891648"}, - {"evmos150crgh4wux2g633ckg8swm3c4gs8dlt4hv3evf", "1113995076425932800"}, - {"evmos150dpqq270rept56ghmmq5mzy52mz6vvdg78n7j", "959321354975138304"}, - {"evmos150f2z4gnc0kgylmluhcpe09q92zm9vqj2qkrk6", "250732705387523072"}, - {"evmos150hy03s3uc2cehw06mdzztx46nzqa6mnf8qmes", "14684362773804288"}, - {"evmos150jlarh0ra6t9p629pcued5pxqwtnflzudhn82", "2587449188746632192"}, - {"evmos150jt7ltqyl5s89wcsqcrdh7nlcm8aymmv8jjq7", "21928830311831232512"}, - {"evmos150kj5gv6j6e4lfrrnpcd65zg4zs70knjyccqpc", "3552447015692492800"}, - {"evmos150l7l0kratuq5jdlrme3crc6edn6m7d2t54zh0", "3821640795387936768"}, - {"evmos150lymf964r8dkjdc9wtm789a9ldtlafkx39wrp", "97870411042439680"}, - {"evmos150nrqmnc24dp3rfxylswndt369vj4s5hwqyu0c", "1605332608484327424"}, - {"evmos150tfppdktd6jluwkc8mwgje8rejtyfc7v0x9vt", "234727586844408832"}, - {"evmos150tvqr589uz037pe8yvm7z07ywhaum6437227p", "4137901019469860864"}, - {"evmos150twxxxc7pgnt0sfgr20mr99mqp8kkpwq59lvx", "628725672837478912"}, - {"evmos150wfcwvr009xskxdlj0nwgqme9fephc0qd3jyl", "5830415378481605632"}, - {"evmos150xyruc6pufzgkggaau5p0e82v9gxpszzu5usl", "11932112429391525888"}, - {"evmos1520052gmfanryl8dn8uaaj0323kl26qsx4r0vu", "8659914838197264384"}, - {"evmos152056awmk06wma7n4d5jjrgcqw3mp5yu7zqz39", "7595282546426261504"}, - {"evmos1520ammyux67adqxn7kr8wd0l39y60u2anjvayc", "19704293863096848384"}, - {"evmos1522x272c3k80u4dv2rxkyja4sgqejwj97rvnng", "866164688687415296"}, - {"evmos15234nhra4aexsx3x60f2xakax4ndy8h90v8h6g", "3939598681205499904"}, - {"evmos15262s72u055kwxex5x8gf9yn9gtgx957wuzk97", "2863083261960085504"}, - {"evmos1526x529kr56wwn7xctey8upv0t4zrxj73dxr22", "130519800962568192"}, - {"evmos1527xxg7xvcsunqfg582spunsgufznxqfnl0af5", "869412103045929984"}, - {"evmos152a6886cy0htnkfhfkd5q63rdpkj4jdr84ns8f", "1290922473183778048"}, - {"evmos152dg2u238keyaejkk2yze876rr6eqt4sm6ycww", "65524507700783616"}, - {"evmos152dpuscyzttudkggzgwen80pd3pardsttv62d2", "26175016587745792"}, - {"evmos152e9mqwl5gse9pcq4xtp9xwqlwrmglzpk3l0an", "415446498269058560"}, - {"evmos152gdajl2zh2dv4vvtzujyvtmxgmhgghce8v845", "11013387801190965248"}, - {"evmos152gylwtutxfz748pmrr46svzphkhl76kwn25lm", "2993205222268150784"}, - {"evmos152jwy79yhhhwj9uaaegmayc6jerepqm8tr4u9n", "3875052583635791360"}, - {"evmos152lxcp0kmcflxu2c39mjrhnc7ypr9nrm3ax772", "140021150153463296"}, - {"evmos152mgjswkfe48a6j965rudcu9c3u3eqlqxlc0c0", "1555207224616823552"}, - {"evmos152q9mlv22sdnsjf79674jd8z9lcsdt6l06zfsj", "5370919458057506816"}, - {"evmos152srjpcu9pttj9zsc5mxv67tkd9l4z6vwh309v", "1332266581585001984"}, - {"evmos152z0h7ej5tumuj294tq3kz0apysrruzkld299s", "343773306841623808"}, - {"evmos1532w0fhdyl2ujccdlvcrcuqr6zjf6lpf54qvt4", "384860796830384384"}, - {"evmos15383jjmmd9rvjw8uw9rcrvaxum3hwvjqzxpqe3", "214223197843112960"}, - {"evmos153adxvp52lk04hpqs0fdejkuq5s7f3vafp340z", "2643521446150496256"}, - {"evmos153e07n38nltpcq7yqv5c805wdw8rf6p6zqcur0", "1717160742458911232"}, - {"evmos153f7drmjprwjp460kqp5quu88tqykqtlntg893", "91053105194683648"}, - {"evmos153gew2czrmt6qsykk0mz649cfmcqu35y72u05e", "4895183645932348416"}, - {"evmos153kjrv65glq22e4k9f650cjegac5pyr9pwc7sd", "3766164996417912832"}, - {"evmos153nruj9yuft96ntuplu9xgfffc4rz08mpjwq82", "8675635608151777280"}, - {"evmos153r2t6rjfrd7uum6uz3dma2gdyxrtkc9dh4yjt", "2448907555503413248"}, - {"evmos153tduxh0p2wc3futjla72deuxvt6u96dj6rnh4", "2712810300572748800"}, - {"evmos153u8ugyng99w600wadfzzyjtlxr9njecqevsey", "8614504422096326656"}, - {"evmos153w0pdqkqe7t43xdwmn3q20483n4yrv8ykshmv", "45899003945152667648"}, - {"evmos153wkxqeknyt49rchu98sszk0gh2wmdmkkl4m2z", "502302270095917056"}, - {"evmos153xdhtxzaheuy05gnrpjnzdnt4x4d0d7kgrpjn", "789013714159187968"}, - {"evmos1540qrfq92latnkrlny7c756y7xeypqrjgk980s", "759992932701041152"}, - {"evmos1545k52p32uskfp3aar7sewd6sc3spe9kgyecnw", "2300100435386147840"}, - {"evmos15468cugm0syfs05e9ht6ampwa0rtwy7lrcnd2e", "22512252431102025728"}, - {"evmos1546yd8y4nqp5s8e9lqjmg8c3x7a0euy4rceqqr", "3732759490936872960"}, - {"evmos1549rqxartjr6gqywejjfvvpnyut6n2700wxsh9", "300312153692062976"}, - {"evmos154ep45xr5wjchlsfffkna4glf2n5aq74tesdgz", "3318138535990467072"}, - {"evmos154h5znkdmtz0kf97nq8eg6rthgeyaqmcdgje2m", "2982328888450072576"}, - {"evmos154lrrdjysjjxeu6kwnfge9tjy3038zm6evvazd", "4987309765353226240"}, - {"evmos154qc4cqjt8hplhnckf603zv39uvnjmgeaglsr3", "4609317065709065216"}, - {"evmos154qs88c9n5zezulfvqkdgtvns0srpt83cxxxhm", "9309839198673055744"}, - {"evmos154rps6t7qc64kgm4z8khlhnyn5rue6wtqhtmvu", "17797700245314183168"}, - {"evmos154s4aj2vvrfnwwhjcn65ujnrcpvjtjdxmw0ju7", "14791533170259914752"}, - {"evmos154ucv9rj734pmddcsknnnt0fexhyndjswjcywc", "779238525203009536"}, - {"evmos154uta99zrpqd7k7qxacmn7w2r2xe83l0rf6avu", "4028444300517179392"}, - {"evmos154w2kcrg0mvgrkhzxmu0fhskm298yh3lg38e7m", "1004057852582523136"}, - {"evmos15506hxf53dvqsg2549ha9f7eycq2p6fs87h9u6", "435461379012421120"}, - {"evmos1552rdv5tj302nancw3kpgjj4hkjlfp9l8w93vf", "2338878629070749696"}, - {"evmos1556agaga8a4g8hclla78s7u6cwtwjw3qhehuf6", "4836232891941478400"}, - {"evmos1556ay7eqfkwz9q97tn9h8tjghuvl2ty5ysuzae", "9242148183438946304"}, - {"evmos155c9j67yyxdc6plgpjpp38ll4w9ewz2vlyk0ep", "2557764987016182272"}, - {"evmos155ctysazpj6fx9eg36jnphy2qwcvpmtrq90j3q", "3466784571122958336"}, - {"evmos155cy8skjx9st8y6pk8qy38awatgsf4xwf3zwwx", "1618749281876294144"}, - {"evmos155d9hkyyxkgj6fxcu0yevz6veqj3gstckscv6s", "2186402334307971328"}, - {"evmos155djf47fmxlmq2qnhjeptzlhv4mcn5krd54zrl", "2848693212952343040"}, - {"evmos155ds6y28jtspyz3jmv9an2vr0hfcnekd0q7wxy", "10288682034481668096"}, - {"evmos155e0lmy3d5nnclmc7kzt4sklcwp8pr9fs33d67", "19913974990106763264"}, - {"evmos155e37slxgxyj53hqkwpf6j0hrj9r59s7alszql", "1021710018202767360"}, - {"evmos155f8x8nptwm26l5j74rrr6d4wg6kxxcmlc69x7", "26140567071206656"}, - {"evmos155fdn9dze6jww0u94fe7jdyqxn7j6z28sc0t88", "12665673010517753856"}, - {"evmos155fsyt3ev0dw60acx4s7el8nm4v3lqlc30js7a", "48848310173360807936"}, - {"evmos155jtd720ewxumjjh8hhea9us6txduy7079fmfl", "1494242150326875136"}, - {"evmos155juv6m5resx7x2n8drje7qr6y2rrn644rp9p2", "1590921754981040128"}, - {"evmos155k2st4mypt4a7qysy3qqpnssuteevnde69tke", "1371945594307602432"}, - {"evmos155knne3eqzvj7d3gd9fl3p8qzjkp76ydq4gldl", "8866369448197996544"}, - {"evmos155kx3neny9ftcke8xnqpc643damwkp7f72g3f0", "4062379374535788032"}, - {"evmos155m0s4nyscyce0kr4nw07737dmtm8edpk8p6rr", "322877318965372928"}, - {"evmos155mjg6g6j7a0a987vqlcx72sh967gmn5fdjgm4", "1086001285563592576"}, - {"evmos155n3tfwvtmadr0nyseget5h288ranrnl0qn5se", "2505133015615845376"}, - {"evmos155nvaatu9w7efd86455kzxs9wjjq63zx98tdxu", "31162443071148236800"}, - {"evmos155pq6n9r2yq3ukppacpvggvkrlyaqqklw2y5ev", "2630186015904530432"}, - {"evmos155q8qqke4ppw2rk42e2l0l3ka5de9k4s0vng0e", "43112465003196928"}, - {"evmos155r3gpzx3sjq995sl2wzm0hr0sk4dseaxnrq66", "1164535346002842112"}, - {"evmos155vaued8d9u4xp40vungnyq69esyk3dely9sp6", "18867478307800670208"}, - {"evmos155w8z4876wtlltp922t9fmul57t7907mahc9mr", "1587440867062161664"}, - {"evmos156044u2na3cs4jx64nahyfwh5yjfqcldvukxcj", "5524147638678165504"}, - {"evmos156389c082kfw8ndak2x3yu3l8ets67mj466za4", "369105735786331136"}, - {"evmos1563uqnya7vqka82fayaqhe40er0jvjxe6harkt", "3154640397533906944"}, - {"evmos156443j4j04klkqu5s5rltrf2mxy77e3ulp9a3c", "11231761695628273664"}, - {"evmos1565p6uflglw9k34zlld82d8tdde67sj5v7dypa", "1207118299739213824"}, - {"evmos1567t4cw7aa3lrt0wqqvzdrd5a7lewr9m0alkv9", "1126642216988270592"}, - {"evmos1567wa9wccnk000a2sx0elyqy9sd0sytfvqw58v", "12582144071745228800"}, - {"evmos1568h7hqntsdwchd9pcwar4ep8f7meh05scmmk6", "2053247237975341056"}, - {"evmos1569tggp9sc4mzz5fy6njgstz2q6mu2rr39h3u3", "3994933227546214400"}, - {"evmos156a25ystjczqmgs70rzn590380uv4d47d4te92", "6673387666399197184"}, - {"evmos156asgscshfxws3n0x8uman8ljgn7v02dzn7rdc", "1496213210901709312"}, - {"evmos156dpmqgmn5lxc98lh858uccgh5vs3yy90hxgpl", "2678126002257008640"}, - {"evmos156e3kzmu6dnq6ntxxv3rk63847pahpwl2n8yvp", "12592187265188313088"}, - {"evmos156eeqxh45ev96sd2gxlpe0n6m6ymptfvgu2dg5", "4872503655104796672"}, - {"evmos156ggqnkzzukmhe6dwjzpsav3jn5v20k2kw2uqq", "474459800522973184"}, - {"evmos156jdj0nq9jhuudjqg73zt6nr0sh7j0tnn76ayz", "5889386677672738816"}, - {"evmos156mf64h72je87u8x4wr2276g3uzr6da6p8zfrv", "11447699718972080128"}, - {"evmos156n9saxg6ujlfjq4nj9zt4z6f6txgrp3frn200", "1993609195388010496"}, - {"evmos156p8mkrjanvl9mpas5zecu45fr9jvvcaqlq4t6", "14731436907929423872"}, - {"evmos156se4z47dgs3l7435plpakzcpzss8ep28ytyv0", "28241599140052480"}, - {"evmos156sq2hc30a9z8k49zyxtc0a4luzxzx4802c44f", "371179273357165568"}, - {"evmos156swxf6ygkwupe2w92lcwwgw80utmen5uteetv", "14294170871346974720"}, - {"evmos156u4dgtcd6c9e8kaxxa00llw7c0gqamwd3afkf", "1137646117272868352"}, - {"evmos156ujm57ckeazd7rkrrpwpeencxly66xcrj6t6n", "2914400815405664256"}, - {"evmos156v22adk5g2p5xy6u25jjw5jlgwmpqfffkq5xe", "892303707877346816"}, - {"evmos156z88q784qpg08avjzkparynvlh7t3p0ftgu4s", "757747666206067712"}, - {"evmos15732nf49hym9nr7lqvmkgarfkd39etegp54pzm", "219079281446394880"}, - {"evmos1573n84c88zmulngcwa0ppgqpsjy6chwp6dm0w3", "78782904031422480384"}, - {"evmos1573tyzx3z9vutvs47ll78zjsn8ld4g3zpju4xa", "44183492341389824"}, - {"evmos15748h5lsfqyhkc6umwahzkq3ps63d7qaenzd7n", "2987485307823035392"}, - {"evmos1574vxx9p3erp2zv2jehjnaaed8npsxhl5nyns4", "923752540414440448"}, - {"evmos1574zr94wa3lp83xxsv9utaxlh6lwazfm3dkzul", "2781418756063526912"}, - {"evmos1575txemkz80m5g85j6c2mlv797u05lvatqfc8s", "7259882379848615936"}, - {"evmos1577gw3q8sw8l6tx5f5ukhkruqnqrvryeyz3thf", "462527736718665472"}, - {"evmos157g79l9mwhwczlxfv4vghl8sklhl7cdyfnzaca", "16495323456825483264"}, - {"evmos157gw6k7t40vjaufv478jvhsjf9qfrys2tfdy5x", "527687026776070144"}, - {"evmos157jvk4zc8a8pqt6pchgk2vqhprfzdt9mt909nz", "7127860445642747904"}, - {"evmos157kh9h4alr8fmyayvfjv7nw0nzwq08prj2kpge", "384361029940793344"}, - {"evmos157kwtlxds22nf25ywqfuuvy5yl7tta0vaecc2p", "33678638546390925312"}, - {"evmos157mpazxcecdt64plszfy7hmdnue7s4jg5gcvf6", "3787903585905524736"}, - {"evmos157n7n84hgg6ws74yavktu9552sry90qm8epq49", "437870522319134208"}, - {"evmos157nkw2rntgdfs5e82eqx6cw2umyf5m6uqkyajn", "480778151345037312"}, - {"evmos157trltds3dcrxff4zsfvfn9rsh0f7j2svuqf0p", "2630267026836848128"}, - {"evmos157u6lq5dwtz677wztz7lrfr68f7tclkrht0m7m", "20230314991897100288"}, - {"evmos157vpgf5m4crn6tmvavxlztg6f9gdzefy5x8e43", "704618803084204544"}, - {"evmos157vxk6x3vhex3xrmuspzhcfzfhztcvr3zlpkpm", "471928660627956224"}, - {"evmos157we9609mjcuc8rmzm4h3dt24e492caadme7fe", "1420776703050690560"}, - {"evmos157xjc6dnfj4edjkwxxt84ljjqy7ledsyml0492", "8092894561945747456"}, - {"evmos158053zd3hfqqxugd6eej6nd6xgxwk2c0nagwz9", "5786052059858173952"}, - {"evmos15843st7lenddym5zjq8v29r663ys7nvegdmlc7", "4134094804934395904"}, - {"evmos1584n09lt9j6ky2rsa4cj6mtjqafy0pfpqcxzwm", "385343739983365120"}, - {"evmos1584s59qemdltdx0sdml0ywa66gx047ax6nt7r6", "738496480934283264"}, - {"evmos1586n25v2pum66fz4zhqa3ycg7fuj3pc6cm95d0", "4178760552053400576"}, - {"evmos1589f4qz235h7yhh3x67jyfvf62cktq6pdqfej8", "17161940936483807232"}, - {"evmos1589zpxled232fxcefcqugm8vygshlyuaa82gqu", "2572614969642637312"}, - {"evmos158aqvaufefha65ta57whqq4y0v4v4lq4eat02r", "2899777166607936000"}, - {"evmos158dlw9g7d33c0xy96eu3jw0wnx8s9d59ak7rdx", "27677028515448832"}, - {"evmos158hu9nxsw32xt4r9pp5cyh5gtjt5mr6hmamud9", "422280059176846592"}, - {"evmos158lp8864qchuma84yw3aljngz70uqjdngfcd7u", "432849907256806656"}, - {"evmos158mglaukrny0yqk8d3eh5m78pu6j7kmwec4yz4", "2958102712115264512"}, - {"evmos158rf4y65kdcwsh6xtxjd88fmuu64wezc9lcsmm", "22032173947800125440"}, - {"evmos158vzpa3hxsm67gpqvk45wx0ajgxs6zstyv7l86", "846558993605216768"}, - {"evmos158x204c7jd75m85xxspvr3cfzfrskjl2q86j35", "4928316289328655360"}, - {"evmos158xpuwt2u9lcdpd7fgu87kg52fu80aeq6arkcw", "1463692020713305088"}, - {"evmos15922kwa0zs9eldt8xshaz7mjwkn3mulvp9zy78", "1326260592514916352"}, - {"evmos1595a3tfjecd9f3zkk3rwrq42csjzpwwjtw2nue", "884831283592634240"}, - {"evmos1595r0gkyuacy268ccpak4njqmpp203nl3heufk", "539686275451459584"}, - {"evmos1595u7da0tt9thua8j4lt35xr26auv050za8pgj", "2024159335479995392"}, - {"evmos1597ewpczev90gwycm3agawvd6gtecwzea8ldwe", "1959389887738678784"}, - {"evmos1597hdc2njdw39wsklncgrej5eu7gcncq47h8e5", "7659939730851579904"}, - {"evmos15980pcwpk0l8yurdchmfeczet6wm5pjxddg78c", "931085066353453312"}, - {"evmos1598au9rn04muq7ff59zxmccwd9whrneh6eeepl", "6605042775193311232"}, - {"evmos1598dq4xqugjav904tl9xqhxqz0r4mjv9lh5hxv", "1252074148085049088"}, - {"evmos1599vwdjpczgyjfvts050t87shxp8g0c6fal3h6", "938733542365365760"}, - {"evmos159ehxsynmxjmnuy2vahtvsurt6js68qwjjgfqk", "478629696213148160"}, - {"evmos159f8waad8w2x7athvdfuyhxvtmegfyc5mcqu9u", "1322877817934487552"}, - {"evmos159g8zl9g0hj8mgcg258rmcclcwekh0cqcgzqgl", "37324901718728310784"}, - {"evmos159gd54l7znsevstyl4ft246ecfjfch56sx98ak", "18015951013157720064"}, - {"evmos159lt3s8e48w8sq6cz05faj8z04n9sp66znh0hq", "383771267692144896"}, - {"evmos159n2yspe2v2x7fl560awjaww93clpjzlsrd2et", "1590208005995608320"}, - {"evmos159necd4qgjg88y5e336tq7ml7qzlp2l4gnc2ut", "2342834806001966080"}, - {"evmos159rjhgx47k2xuqscdw4vq476f7as8nzejtc4lx", "494445799595512832"}, - {"evmos159rrxgytwx9cvxr22djvfw3kryxj6seunw5epd", "12219927923578888192"}, - {"evmos159tdpwuwr84xswcfrjgnxywurqy7drrnvx43yd", "4197124641990069760"}, - {"evmos159u77amnd4nfvdhle4epasgrqgquzxakmf4znq", "4546602035135283200"}, - {"evmos159uas5a7nh84l0w23qaxjdxuxt3gyckqfh9p76", "18453669012991660032"}, - {"evmos159xz35vsqldgr0qduklyzm96pjjev8svj572uv", "1864134733431988224"}, - {"evmos159ztczlatq3avy4h06pv8nysznam2ee0k3g3k2", "2537920117090867200"}, - {"evmos15a22l0hjfp3h4urykevfhwqnatus72eylt0q2h", "1064317050086039552"}, - {"evmos15a5dwmp4vq8yf70vt2ffcncvl7lu9ych79pkpk", "1283238592306311168"}, - {"evmos15a7f9nycnlfj7u7200zcj378cw84hcdvl36vqk", "3683525810376310784"}, - {"evmos15a85ghgc6wgheu2m8j6qyudrhlw54vfe6dk7ww", "462547774339280640"}, - {"evmos15adxz74q8cz0mqc5nma5j5s8xsk7te4gr772nz", "369309870191581440"}, - {"evmos15ae07r2dtfx5dkmyjhpzmk8unu5m4l0m4wgcmk", "1451033563433535488"}, - {"evmos15ak87gr5qvq9qhljv2qwfvggwd2keaxsz6ujss", "42566297242581958656"}, - {"evmos15aqnkxp5x47dsz5z945tf7fzpgw3mp7ecp464h", "100114836545726464"}, - {"evmos15aqthf32fqnv2zxq03lvk8e0x86tlt9a9eck93", "384232830751243776"}, - {"evmos15as7f6c8udqzqll7lqm3ds2wqev445fsq0u3gz", "7784124588182603776"}, - {"evmos15atzl4j6a4muucmn3pzfcv8gydnd2rsq4dulad", "4854251547906595840"}, - {"evmos15av0phy99l9e23mcyd6e4yxzdhulnc04vwt09x", "4317160897531047936"}, - {"evmos15avn3ahjzv5cpgez88efhzlcpelj2l0a084rn9", "10408701582521196544"}, - {"evmos15awfsh3me6ul7p53amat8yp93hdls7cph8teq6", "1250808004133187584"}, - {"evmos15ax4pv3a7npq7x4axmws30fquwa9s9t89hs9zg", "178417006346387456"}, - {"evmos15c2tzn67apny58yxq043csvg2g4hq4pqv3qxdg", "3136441812635538944"}, - {"evmos15c3tsm6a7q6kgx7nxz72vm6332snnhu4qcpvqm", "7417192759222960128"}, - {"evmos15c3y9hxphf67rc8qg9ky0vf7kd40pus7nnhpnn", "864052719439948288"}, - {"evmos15c3yxt3gpjuga329g03t3seaycefmngxdjy4vv", "6146273369911536640"}, - {"evmos15c4lty8lmqkdm06rjsey2pecsmzywjrehv5kaz", "288928052460669184"}, - {"evmos15c4mn8suvrvlwyultlrt289z7f8zuasaz8rkhc", "66893263418903658496"}, - {"evmos15c5d8ffqcgx9t5sq4gdafnnu4spcd54wcgflel", "782703333849873408"}, - {"evmos15c7exj3v3c30npa3vv77646vs92tuypdax2ahm", "2339624833090994176"}, - {"evmos15cadswsw8fx0el048a8hlnysyu47fjumt7xnqy", "3581853326641086464"}, - {"evmos15caxqermr56fc89xnrp75ytguq9mmw2jr8j58r", "150011974184982528"}, - {"evmos15ccprh6z8avws27pr85xnjhxsqkr94ccupeyp3", "301069894571521792"}, - {"evmos15cdvs6ks3ypplg97pzd9qextsguww2km7j7a82", "54483239451103488"}, - {"evmos15cft4qmddy49gt5p6zk6ay4d5ndqwakw8qkrxn", "3727745167651188736"}, - {"evmos15cfyjrp8rz2v5pm6j0asjth30fuyzc7q3aaqk4", "3742891392612977152"}, - {"evmos15cg30tz6w08nmkk4c75hrvzsca6rwral58f3tn", "52997023877111652352"}, - {"evmos15cgcaen57mn037u8cemt0ea9ah4aujw3x56c02", "315883905291264000"}, - {"evmos15cgp9cdzlr8qhttjjc5cs22pdckcqz738r8tvu", "672303156632844288"}, - {"evmos15chjqpx2vegq6r8htvw08qc2775w4kdw9vck50", "12500091301680160768"}, - {"evmos15cjlp3zuwv43jtkm57s4stf3zg7s9065fz3gz3", "1171348835710481408"}, - {"evmos15ckdvcnmtm92kgr08j2hu9965cnnl33yaeeym5", "2003605995995739136"}, - {"evmos15clvuvxf96nz94a3x05q7y238sm4n0rlq8fg77", "1223986879124533248"}, - {"evmos15cmrrxa0as44ld2ppe9asnas8dmcu2wgsz2ztr", "1678825661080649728"}, - {"evmos15cs4hug272w8cyaha0tt8ec5q9jscvw07qf7k0", "702687307107886592"}, - {"evmos15csvlh8pe49xuz6u6ang7nvq8rdts0xcqdzhzx", "38920617214354210816"}, - {"evmos15csxshqyze5fvzmkhya6n9g9p69ldygrm64rlz", "364979792992655360"}, - {"evmos15cuyzsdccwjuvdwk7j4qkdxr08t2ptuherd0rq", "89110211836611328"}, - {"evmos15cx32c54tddz02t3h8rjjq3l6f364c78k2xsuj", "467309887248794368"}, - {"evmos15cxjvm6j4ujk7sts65rjm0m835zg6r38f25p8c", "8224655093080743936"}, - {"evmos15d0tnv79738u2p2avyqyqg4a57ssuwd3c88a6e", "93524171387954176"}, - {"evmos15d23fkytp20zkpt5jwl459ruljjx7etz4as95k", "3363355625478701056"}, - {"evmos15d32d4udqlel72zyd50m5jpl0rt5cr3mh5lqhd", "5070370353283354624"}, - {"evmos15d32dvu84qqcq2rw7sxcumkxegn90206dmnpn7", "982025328508309504"}, - {"evmos15d370d6czlr6mtz5jqlt48qvrqv42w7utl2vu7", "51528391356385542144"}, - {"evmos15d3ppef96qhnuvc05jf503p7e9353k25afepvc", "1600228982036942848"}, - {"evmos15d5gkduhg55e9a7j4pfvhk82djgccg3vthhv33", "387494344961140992"}, - {"evmos15d6rvat6wyu864fdhjxqfe93aphnqlnqkunyds", "81161021393876779008"}, - {"evmos15d74vjp263a7phkkarwwxtju94r62rqwtyn9dj", "8808061826273528832"}, - {"evmos15d766dxqna2nndr2tzp0hx6jar0zqrltxtd3cx", "1670203174202841088"}, - {"evmos15d7ayntdvfew2tv36v7e3ycdyar6vs82nlnpsc", "12241330740172595200"}, - {"evmos15d9aqhd64y7xz0tezvrgulwwz37eu8clk87htl", "2216789701352089600"}, - {"evmos15ddm2kxqryllcfd9wc5z77m42u6p92ps9ff6km", "17205296087446388736"}, - {"evmos15df026jdvp6ksyp45kexq3ux5m4cuyp9f7npnf", "38040473883371438080"}, - {"evmos15dgydvkjnk6tfywdd30t747hqa804uxdr2f9cn", "300683602731307008"}, - {"evmos15dhdman4nf02hq5cwtwxv5hm0erdx9exdc74my", "2334037137701718016"}, - {"evmos15dm58565hhydvxxant7th3ay66f4pvke8lvfmy", "122914107953686478848"}, - {"evmos15dmqzt6pu66dj4xvp62kfl6ra7n9s4py8rfzsn", "15863407603880206336"}, - {"evmos15dq3m84y3fftv4s7thndlm2sf690jqupxf9m57", "3292666605971178496"}, - {"evmos15e29m7ghcvkdtfagc7s75x57nyt4w8473kkskp", "4618622859132294144"}, - {"evmos15e53kwc24xgg9w0dgcefsaygdkfga64g68vj32", "23045135685512994816"}, - {"evmos15e70t3huxvssh7hahd5ascx9fxckpau7ct8v9c", "6876750091881746432"}, - {"evmos15e848mejdw77x5km7hxvqmll40hhdj3arp3a0e", "3339538773662500864"}, - {"evmos15ea5sfdcvyvta662xpsn2ugmxz234vrkyjyuln", "684162398880497664"}, - {"evmos15ef8e7ahetjuarmem76fh73pv02xd4ftw9ffwe", "3107695361084767232"}, - {"evmos15efgadnn0appszkthr94m4z0vmgvzu2p0a9060", "1233737285862361856"}, - {"evmos15eh4dld36jtmp0nk6250ax2ca7ml5fjkuf944v", "2508276679778609152"}, - {"evmos15emz8ytnx5hwphztlyxl0p9ecezhj86xgdf48v", "16291489853462843392"}, - {"evmos15ennrqldekdxn6jp4ck7w6p3mt5l5595atd3sm", "7977277083757830144"}, - {"evmos15enx5jec34q90kqh6f3aegrxclvr2qd5tlw7qj", "1505947932174035968"}, - {"evmos15ep0tf7u3sq42750d962lgxeje9lv92shfzmh8", "1569245745114051328"}, - {"evmos15ephmvhn5v849klfcz6j8ys4ukfpgergyhkya0", "4811886287258910720"}, - {"evmos15euygj0qw96y78l2e7gdq4era6xcnltqgjrapn", "1506543107652471808"}, - {"evmos15f0n0w5u3jqrzzexjkj378yp7939t5kxhmrapd", "3017988383591018496"}, - {"evmos15f0qune6qfx3g46ptugz0u4vdg5p6lve4def5q", "6787340158601461760"}, - {"evmos15f6v6x835vn5p79p66p7f95s7ay2xqw92drfry", "5523012718034189312"}, - {"evmos15f7e2axyqvh5x45v9xq38kk55rf2m3mw5h0ly0", "726524658447207936"}, - {"evmos15f8f8vge7ykgrmzuzqrzggel7m5zfcauhe2kjk", "11868010910351884288"}, - {"evmos15f8kh6rgwumtv339963mu668xmwtg6jl334k6d", "43051003172623872"}, - {"evmos15f9q8fflysy76muxxnemxu8mlt83x5kz5j8nyq", "2151376428820858880"}, - {"evmos15fdwkka0vegk7vqkd3wq8lk7s7pkfxmzuz87mv", "2668809992251715584"}, - {"evmos15ffy8qsjw7csmlch5vnk55d8wt7k3jw7yeqy6u", "3457659320755634176"}, - {"evmos15fkjxgjlj8rg307g2728hha7zdcf0rwa4962wz", "3210155174883125248"}, - {"evmos15fm2nwc4u2xqnxugzlj29keqp2rezsnn7yplh0", "110701815853960192"}, - {"evmos15fpfvtxx7k2c75lm9nsznzpm20464zjmumd374", "1435300697724644864"}, - {"evmos15fqx0a450gjlyav8dfs37ctvx6jhv9yjsl9zcf", "1257077648138837504"}, - {"evmos15fsjzy9vh00nuprjrt7urz3yrudv5x7h2h05e5", "1048832438494527488"}, - {"evmos15fwmw4vm5mnggxcnfp3ajyq7g8n7qh0gngync5", "3328718317174784000"}, - {"evmos15fznvvqkm0ku0xe7spzzqjdma2qza3f4pkfc5d", "1503281110395849728"}, - {"evmos15g254np7m0cwqrc9jshj63kx254jqxjlck0549", "9030393565054996480"}, - {"evmos15g363qsga0cl5f5wp6rycsvqlp4nkxgcndpa36", "407797342363205376"}, - {"evmos15g4mc4dnpf2m0p93k22gxsmx5wdchemjmqqhak", "729004860213251072"}, - {"evmos15g74pa5wzzl9804jeunznmlc8yz0yepg32llz7", "66329373047881984"}, - {"evmos15g7rmxsljhdx4npw52z2sc8zvanlwapupqpgwc", "20705422169020133376"}, - {"evmos15g7tdpuqhe6ty4997ussa3k0r3mz3x2nre47y0", "23928761070677577728"}, - {"evmos15g8evu8x09g8rsjpkgj0xm2wzlpl7xfue8gts9", "3725063470078457856"}, - {"evmos15g8lwp85vj2m5nef4nyvvfl03pyxep3gvlym3s", "299662374713606656"}, - {"evmos15gcxpx9wc60vwd6ccc3j0swy6nvrlzha384vls", "2216766509025289728"}, - {"evmos15gfrjpqkx79pfvzs4xxqsuat4j2e6xt0lrsxp9", "45658973231601408"}, - {"evmos15ghf2dc0s5j46h826fzkdpdey7qzff757y3z24", "30882784994964996096"}, - {"evmos15gjx6axyr7hdt5yz2494k9hr9xstyvw2557nde", "5253179850502077440"}, - {"evmos15gl4370d4chflcp8lp4z9fzx05asye8drp3hgs", "8936834950865997824"}, - {"evmos15gljtk2nvt6vsu4s2p0adk2qe7vwt7545ugh78", "1194510844179959808"}, - {"evmos15gmvy8y3zkq2hau2hz9x9zvxyrurns7nd2r8v9", "315398484915801088"}, - {"evmos15gn3mxm2xrzsatk5tk756c03xa4q7pjfdc4l5y", "3984279492461607936"}, - {"evmos15gn9pltv5aty9t74afdesdssmxmggvlhanufpj", "1950731600124182528"}, - {"evmos15gqt8alllx5j9gug0eqhz6056hdl3e26lpl5y2", "2088384486930464768"}, - {"evmos15gsp2j9fem04qxv2ecgu03na6xc8rttzpu6n7q", "522703383192428800"}, - {"evmos15gt9cgpetaszkx7erfhnzxzc8pjnr65n72mamx", "6172593986391029760"}, - {"evmos15gw8m99ekxj888dvwre2gshhpuueeztux652pl", "2695585644662921216"}, - {"evmos15gwpvh7te9kun38v8ntqwlegeqpw906fnd80sq", "1156153530615282688"}, - {"evmos15gwwz6wufue85xsmt5mcafpm7ykd89pz6ysrrr", "1130574312598822912"}, - {"evmos15gxxpc00cccvqz439y5772mhy5yunvsvyh3f4k", "8021539791403581440"}, - {"evmos15gzj3lfx04e5n84r85jqgd3ervg5uz97q5rpwm", "2420942411193291264"}, - {"evmos15h27tpjrp2qt9d3yu6zswgheux6tctg8tcvakt", "384500541973383936"}, - {"evmos15h2qul3udyjh7xx9ttzhqac76j2etjl28ymvw5", "6291086811136176128"}, - {"evmos15h2yad2kxnt04l5u2j22ehdql4mfxwzl4ej2su", "1359895188504920064"}, - {"evmos15h63lkvumw9nm6dysc8mdrxzkw2spd6jmxr4xj", "1082171477404596224"}, - {"evmos15h6yvyhl0268qfkcg0a8vmgdujsat3v2fxh6ux", "5578931256524267520"}, - {"evmos15h7jkapjt40jjke05zt4kmguj9uem23zpjyqpl", "1165747691389282816"}, - {"evmos15h8lmc2zht35wvt84k8kz702yhhjj5jmvh0a4d", "1108907880807657472"}, - {"evmos15h9635n73j9wfhxmugufwnvh3m309pft0uayat", "13680429701899888640"}, - {"evmos15ha57tjpvt0yydc84k7upunchj062ap0n3zhzh", "37849716674114691072"}, - {"evmos15hay33sr9rdnccmtrqd3tqm95c5rgt8yl4vv2u", "3993688992317983232"}, - {"evmos15hh75w4cx7kaj7trl3p6za2d4sadfna9jz7q99", "6207540929723907072"}, - {"evmos15hjrz5rrr3lkvagex0z64gfw3ny25pzql6j9tm", "384215104697220864"}, - {"evmos15hpkjcmy08tuga7caa7dzzsrdds683gvlga609", "1576087570889867264"}, - {"evmos15huz0w9rmwze7hgwvqmj84frmpkjxupmy3qwuz", "212420774332996354048"}, - {"evmos15hwp0hcv239v67jgkv9a82y30zqug5mp9ad3vd", "3602113406955421696"}, - {"evmos15hwu2rphps3q6w2xvm5577fxepqgm0hdggwxff", "2579630320175132672"}, - {"evmos15hx870ypdq2znw8ylsr5s3cgx3rvlkuechzhpn", "189934431080026112"}, - {"evmos15hy3wfyqg8dvfz3w9st502eq7n0jcvrxl3zql7", "2274769886955390976"}, - {"evmos15j0xdvwyzp2ckwg57cufzqut39zmgemwlhx58k", "1216116143966149888"}, - {"evmos15j7aktkuz2l0me5n7xqd786zryuddvdd8u07fk", "814441841162902528"}, - {"evmos15jfhf6m6tyk0xqnda2unye8xvpk6y8f3dlmq4c", "6339040853333639168"}, - {"evmos15jfyhgnd3nsg4tt9hgqq8rc2f7d4fp5uuvc06r", "92428333145298688"}, - {"evmos15jgvr07rc5sq8lglj0mhcu4g9lp5rgfa9pu5dq", "1893398133032403968"}, - {"evmos15jjmtk6pg08garfhsnppn6zfalk3zlvge892av", "8838955676774227968"}, - {"evmos15jk5f24gllgffz3g8tcl30kjlcuesa9jk08e38", "2495638206698405888"}, - {"evmos15jkwq2qafsu6sjddnzxc673sa28uur4xjfvssz", "295404582993535232"}, - {"evmos15jpun92w33458jakm00v4c20nrvp0z0qj8asty", "463869937547829248"}, - {"evmos15jqghwr6fvr4ynkt7720g4lykc0r5lt3s8l7qq", "1080676259865645056"}, - {"evmos15jqzllqgmjxt59jrc6vznj4awp0p3ywjmp6rrr", "13811842616405000192"}, - {"evmos15ju2z2aq9qnsp8z4zw5qtynldsclvw4f9daxw6", "20079890905550761984"}, - {"evmos15ju5t2kkzahgx6cg5r76n5knhakn7hawtjrv73", "872012082231104512"}, - {"evmos15jycskxp98ut4k9dqeka0f9txu8nh9qgy5zkpr", "20436446138685931520"}, - {"evmos15jztg4v3h7tcjyezec0r8faxdrqfrgfnjgve6q", "9979467685723901952"}, - {"evmos15k0ddyx4rp5z659luc3yk23ekwx66j0n0vec5x", "379959319319666176"}, - {"evmos15k0z9u2ztl8qkr252r9wyd5ljfp3tr8wd5kld5", "7638618913902442496"}, - {"evmos15k2rwgraw5zq4qqdqhglj6jx3qplk69hj0jp6v", "432342857689647360"}, - {"evmos15k5sj9xz37hjevwqfqd36cqmm7hqq4ppjrajmk", "773883720816776192"}, - {"evmos15k9efymvr9k4yca4ggewkltv9wv6w3d50h3pu7", "10876316177511557120"}, - {"evmos15kan0ghn7vtnlyvyk4xthx3qkfk4khhtnvxex5", "3061560043667398656"}, - {"evmos15kfnf7ugahhjuy2ywc77t23rq44zd0fe5r4fp6", "1274582860388900096"}, - {"evmos15kjnuhmznsyafj6ptup3wjl4pe6py32uy0f6vq", "338498863406503936"}, - {"evmos15kljgmk04hw8mnfarzp3730pc45aydyp46yrel", "1434752826336673280"}, - {"evmos15klmw4283zp0eh7hfvyr283guhz58m7vh6xwnn", "2010738400284681216"}, - {"evmos15kp5rwtzc3hfqhh2lt48a7qfkdxcx6yqpuzut6", "485493516607153152"}, - {"evmos15kqg3hd2vxrgnwz8k5exfqc800z857j7nkkksk", "84176689433274368"}, - {"evmos15kqkmlm4s4xxxcp5n9twe4xssvals8m6fa8cs3", "2268219727464017920"}, - {"evmos15krchhjc3z9acv78yq9dntu8dgqtkjghuh8gf6", "368743888807698432"}, - {"evmos15ksd8p9kanfp36h3ecp6mscm6406npkueauu68", "7577881416712886272"}, - {"evmos15kuy43ukke3t5uqh43y6k96x6p4rfrq6z6xh4x", "402027521798522624"}, - {"evmos15kuyqke44arum9afduxagd0lpd6gx6des744ua", "75136768817377427456"}, - {"evmos15kwaremyate0y8p38eesk0fu2gsjgfcxa7dwr8", "746392625304062976"}, - {"evmos15l3t0r48ew8yxxukm0cmjhqpml4fx7fm3vlm92", "15893485173620469760"}, - {"evmos15l3udsktf3uv2yx6djzfx08qyx5mrzc2afpgu2", "17825766499094550528"}, - {"evmos15l769fcpnp7zpalcksxncxe8sdnw0xmhrw3x65", "6108707627809783808"}, - {"evmos15l97pq4w9jfh8lejr36fmtwdmhk8wh7tm5vc5h", "1283471981304333312"}, - {"evmos15ld22qlnz0mnjww34t4k386ytm778ahdzg9z5q", "4491191792171493376"}, - {"evmos15ldzxktz2dhmr0q3sgp860k8auah9rfzpv8juy", "1303505682008358400"}, - {"evmos15lhk0pwqrrz8v4qugwka7wm24agn5ge90079ua", "7692875641212758016"}, - {"evmos15lmaq6mvndlkhvk5zlf5uydq2z4dx7lzhf5sar", "3348177295433704448"}, - {"evmos15ln02xh5l0taraxe2ajthjt9emz26ku3g58th5", "4879446072737546240"}, - {"evmos15lqlw5sfch83upng7gvxs99pzz8hajdjv6hz2m", "532365698998272"}, - {"evmos15lsynrvk9gkcefh3ur6ypqjpmt5uetzljejx52", "1582594213295611904"}, - {"evmos15lt6erl8ap5nk4vec6wv048kyfn80pzmyqzv88", "48832435718783107072"}, - {"evmos15lvyq4lc9yjgqcjc9gemdxkdkmspexjjp0s0p5", "31927079633518157824"}, - {"evmos15lxd36tajaelj525gspyq9xflfj09d5wmsr6t3", "5295439302655430656"}, - {"evmos15lxjka89e7eqaxgl7q776ajzcv87n5ynvhxzj7", "4682137641254197248"}, - {"evmos15lzfaep59g6m0vshtmgm82hq0xpl0ys74kwlgt", "3268119257517015040"}, - {"evmos15m2fk6e5cctq26m3c07r5fval4rydnnllhylek", "21740445166535487488"}, - {"evmos15m3arw90csy9d0y7ewyshj7gwm56f7f6eck5ps", "7759752870594647040"}, - {"evmos15m47jg7xw4sr6jmn4pzhm5hcvct5qh4kkavn38", "6218505800642324480"}, - {"evmos15m49av8zh0tw3mhl8vr33c3c5fjjyk4htkksh4", "2576508527179628544"}, - {"evmos15m5xuzz9xtvxya9m5ct5cexns4muhv6nk8es56", "473943386302461952"}, - {"evmos15m604xzq4f5z23rvsg90d40ve70h3ws9j84rne", "2673257594125074432"}, - {"evmos15m8nrz286mxdy4pa3u0errzjyqxxzydgng4e3w", "79285787136243105792"}, - {"evmos15maltjs4rpsz9sdy0q00pew2cn3z90kt4t9pn7", "58946027778748080128"}, - {"evmos15mdwvx57ck5fd6cvlx5uqj96k7rfa6cud2vlxu", "2901539524815265792"}, - {"evmos15mewetut2ju8w6lmc3f75lvhggktugehkmg36y", "23556834928966250496"}, - {"evmos15mfwxc7nkdrgdk70zk8kctm8csgnnd5a4v0822", "18979067886202241024"}, - {"evmos15mhtahqpj8nhy9y5yaslxf3zykr0kw07mj6f04", "57327735239159296"}, - {"evmos15mknt5wr30jgaf5pgfh5c5fhz8qd3rmecp9jp7", "18457087398817071104"}, - {"evmos15mq09qrn9hnmvza5q6fxwe0udhtn6k0j0js5cf", "6608598509240228864"}, - {"evmos15mrta5f8admtapymyz2rwt00ucqkuwzavwpu6d", "2215711229051985920"}, - {"evmos15mtzan30q59fk8hhncqraks2qyjsfvlg3x9pr2", "16063836440617265152"}, - {"evmos15mvqj6l8dn00ze3u0yp2xcad5462h0s6zt6x8r", "411498211571574784"}, - {"evmos15mynzestk98xxa8jhzm3l38a8a76s2r92ngk7v", "2716724403466639360"}, - {"evmos15n2jrut9fezjcu723hqahpv9ggpp7y8m4vg53y", "3945185748516067328"}, - {"evmos15n2lsk6u596s7qasd2q4k90qv2mvsq0phgwq0u", "8117232929843719168"}, - {"evmos15n44c6mvmm6hgh7rp4c7pwju77qcfhvpyxtuew", "987919234815988736"}, - {"evmos15nazas5ulgqusuxk7tadlltrdhymjrnze3jct6", "33970938731080671232"}, - {"evmos15ne4r0d3zhqdvu22mcyzan0unj9qx6fz26ee75", "11013517942201063424"}, - {"evmos15nkqhpsa590z456fd77cm03thr2kndmqr9vqp5", "2535119517968097280"}, - {"evmos15nlrm4r6vl68vvktdp03cfhjhfm0upudrks54w", "5113174300062627840"}, - {"evmos15nmrp7ndft4nlyc2cw9ghv28mgchye397uh9rz", "1448772421732576256"}, - {"evmos15nmsqzjssq2ltrprjp7fpq0qhshp78s3azdegm", "1583858302759789568"}, - {"evmos15nn9slyptyavmxdej2cpep6q6v549f63ltfhta", "3168172485286796288"}, - {"evmos15nntf6xkp65pxt8duj09qql0v5j59jpxn06w59", "58618856096648413184"}, - {"evmos15nnvlla29hfpchyvc3m46d7ud7tu8gxgvusz5p", "4077079352276989952"}, - {"evmos15np4tp07pju5ykzjy8paqd4vmf75qg6qzaeht5", "5817715890380521472"}, - {"evmos15nqpmlrcnsus2u4rqjnfm7t9702v6sn66zquls", "2216558696308411904"}, - {"evmos15nuqrjphdqzftyrqj3njzf56907mq4kwqsp52r", "2287244195830800384"}, - {"evmos15nuuprnvdgwwfpharur686z5z9yhnucynqane5", "1895032873847438336"}, - {"evmos15nznjd52rg7djnu7sd8dakuwrkuyrenadmwvl7", "4645043148805630976"}, - {"evmos15nzstxpgqt495mf2c662tdezksnev4udf3nnme", "4844096405123989504"}, - {"evmos15p3gm7r0ac8akvjmsy7fc0wc7rkx0cqzymd4ep", "420763169260741120"}, - {"evmos15p4kfa6ucpw48r4wwn8g6pmvhmfn9s2jxdql4u", "642572292729290240"}, - {"evmos15p4kjszdq9r342x4r0nap2w7d264zwk8aw34le", "1627586347586631168"}, - {"evmos15p5gknjt7p7qem9h9d0728jmg9kq38fcygtneg", "27014559545489170432"}, - {"evmos15p7d8vsazafhkup78c9vnnukk37rjvzjtknqkl", "145609889078222336"}, - {"evmos15pc4ecwej5d4t7uelkd363nmmpmwlza85lckzw", "844096840755916288"}, - {"evmos15pdqs9c8q3sup69sc0pqaw0jut5nvuw2mzs4c9", "1236751346666622976"}, - {"evmos15ph0a9csmp7n8wkxqthzmu5rahk7nwhrh7v327", "665173967080597504"}, - {"evmos15ph2nnzc6r2scqe6rd2lzwvlk6gfked0nhnzel", "1672935580001876992"}, - {"evmos15pj2svs6chtzlzmggjzfjk3uj4t93u7ksw6a3l", "42787345405743939584"}, - {"evmos15pmqsnprha2qk665nxla0d79dqr6uxl97y90lg", "32779178523732770816"}, - {"evmos15prwevl4fv32vatc0nvujz30dl0pna9mmeflhk", "403740139669665280"}, - {"evmos15pstqykxnvny206svd9gwrm2tlw63xjhahwnxt", "8748616407238244352"}, - {"evmos15ptsyxr49jym3j0nmu0tq6puhae4hjmu3uq502", "1203863761268474880"}, - {"evmos15pvqfnaqnmyv8qwamul35md7hffm560mhyw2rk", "1351386583882055168"}, - {"evmos15pw94yu245924uwm9c5l0nt6rr6ytjcuelvv3c", "12697169775328038912"}, - {"evmos15pym7esvxyt8te3rcgln6hmy9mnj6svff86nyt", "5169175145524121600"}, - {"evmos15pyvcjlg6v954w9j9cvpy7c76t6dnwd94jhevr", "1331640887234551808"}, - {"evmos15pz9vupdceerkdpeg6jj2efry8ew9mssmwpl7f", "1002062045315751936"}, - {"evmos15q2lvslk6s6hfguk4egmdc2pc7uxxfhnlz7dmc", "1423140245295937792"}, - {"evmos15q2yr3lkrp9yt6a8gzx5hkfqnydqtrgwn53dej", "303940130969376256"}, - {"evmos15q4p65qe5ze8fk3qw42282w7s48eauyhvptaa2", "5568048022685745152"}, - {"evmos15q6k4gak2fz6hmdq97p6qsefnaxz8zrfuduhvn", "2065596640158147584"}, - {"evmos15q7crsl93lgwm9el0vhh8u8zd00apu2rxek65w", "1553223913438997504"}, - {"evmos15q7x2hu9709srwn3ysgch3tavr42fchaytcxvx", "224261809682454528"}, - {"evmos15q9m70ujwgefwy9rdl3lgl9s203h0nwn0vk3cq", "935491506442790912"}, - {"evmos15qe5z6uuuawtgqyale2k23j5sw8ndkextkpukq", "385205288007635200"}, - {"evmos15qf7um90nzl86dxult37mrnml8g2zjp6297uhf", "1248929087880840192"}, - {"evmos15qh5scm28fcafj0yxa79vt7jay8efpdwhmhl85", "5616173982504269824"}, - {"evmos15qj38dwpd9v5pwrusd04e5pc4sfurdflgp4335", "410173553657214208"}, - {"evmos15ql58wajks2w4478sfx3prangg0ww0gypkhee7", "202403933006196736"}, - {"evmos15qqrh9ddpr4zu4wkpl5chmjfmr0gu0wxt0cmw4", "1011660437653308416"}, - {"evmos15qskc88wnc8yk0q9kc90pmucqg3xdh0v7lftwk", "5443386823045191680"}, - {"evmos15qxalatruqem6fa9qn3dzgkw3mxtf2ykmyg2y5", "521778537483419648"}, - {"evmos15r2jl6k0gcll4k2ndg2v65860tgqsa78p69ers", "27686975541238554624"}, - {"evmos15r3h859jlpc0zh63r8quza24eahlj0jsxn7f9l", "161048199805590634496"}, - {"evmos15r4jxnhl2cu5u6d98yay2yykwuu55tzam3jwqg", "3851257421797225472"}, - {"evmos15r5586eppqdaqsmx3aj6gxy7q92gayqq6gdcdv", "2232139673834048512"}, - {"evmos15r58qndyd765teh5txr60eypw7d050caanaxdn", "2933140829840556032"}, - {"evmos15r7l9xx3hcxvwn84p497p53gnn36dacn0uh83e", "884328214319468032"}, - {"evmos15rclh4f8nh5muwznrv07erud7atsz8vadmdm8g", "415371898663511552"}, - {"evmos15rfclg6w2clxnk4l0zefcsm99vlc2835g3vaws", "17843760628397461504"}, - {"evmos15rfv5shuej0wyum3hqsetedz3mmfvgjmc6ydyg", "1187586530593955840"}, - {"evmos15rj6jlwz60jhsj58kvwhf0zpqwfqhhtl9r9nyd", "8007239441084227584"}, - {"evmos15rjn4cmp0kf0el98uhgke8u2z7j34vukfxru7x", "5114084280684281856"}, - {"evmos15rkgredc0tlj3say7yr8j7rmatvxe90svtkfvj", "14286770994300123136"}, - {"evmos15rm0wwfzsvtruyemmtlrt7xd04f9yrk3q60u89", "2473850584513858048"}, - {"evmos15rvl0xmtvgpecguh074mraq8fukawy2yvgmlvs", "5020321975488432128"}, - {"evmos15rvlessmlklphc8utqa2uj4yu8n3yf5r8udeyg", "8113881743858933760"}, - {"evmos15rwf5y8a72ekk3szx78udc4u0kv0km82mk9d6m", "1880471241322556928"}, - {"evmos15s2tnusqmr3yyeynxpgkptn8cmw5v44xwjxdk5", "750075013024245760"}, - {"evmos15sczcdy34syc9kn5eaq4peycrvay36qn36g9zh", "5069806205988454400"}, - {"evmos15shgcdh5k6enqsypkut33j7seqvjm0m2hx7azy", "1120546566282279040"}, - {"evmos15sjm4v8jxxttvq5e7tq8d4qd0753m0u2ml3l95", "686275936428679168"}, - {"evmos15skkcm0jpcgvvfs8edwqfemt7z64z6qytvwmtd", "5477103277680201728"}, - {"evmos15sm05ecfnenp3p3yxux2fqka3wsut60gwevtvp", "69240224019554304"}, - {"evmos15srt3dd7447yet2adu590nm4pz9dgpyk0hmafq", "2425481169547689984"}, - {"evmos15ssdsq8ksr598jd4n22t03yhu36whugf4f48j5", "2713614680113934336"}, - {"evmos15suncckugk3rrccm7nzsmshk40fhfhhg04j05x", "675734958467835392"}, - {"evmos15sv003gr7tcmz0g4d38fh0r33qhdxrhkq40mzf", "387443561716066304"}, - {"evmos15sysc4gja5ay7w39ph5pacv5dq454rfjyuckgq", "1660505451950694144"}, - {"evmos15t2w58q6f2pr6msemlc27a68vhy7c3pe4rq8ft", "3799946809986385920"}, - {"evmos15t3fm7et22y9cq2ksl7xmexjcgkzmjnzngr7mh", "423216890603344640"}, - {"evmos15t4c97utxehchq0lrwnxezuq459vrsva2utqa0", "16812067680530944"}, - {"evmos15taua7jc6ta8495r3mh5azmkcjn2leeuhteeqx", "106831990188828928"}, - {"evmos15tcs77uw87pwyqjm87kqanup8exlvy3lleuqtl", "15596482631764398080"}, - {"evmos15tdcu2zszf8m4myqnn2en8m6zvscc74q9wdvz3", "149128874748161024"}, - {"evmos15tegr7t29tdslsz49ym4a22d5n43wdsksg9mdw", "34802963954566316032"}, - {"evmos15tens9y5gcls2nm80v6v7ww9ue20gqk7q38r8j", "201142098860471040"}, - {"evmos15tldxjhhgs7rtps02swm646h9zmnqpfj4hssyh", "3953458354941861888"}, - {"evmos15tqxtxqzrqsew0w8pyyhpvvhjpq6mkk43kv66u", "387375306405355008"}, - {"evmos15tt6kvt99uxfnpqa0tg9j0crd9kpu6ej2jnz6w", "12630748245349351424"}, - {"evmos15ttp6hg2zxhchn8h0dn3e0g4n6spkumj0dy9wj", "1825010385106777088"}, - {"evmos15tvwuv3g8zqyt47qka0n2fu7tgpsgftz5j9t4d", "4815870964516071424"}, - {"evmos15twxrn83czud6vzmstdp7sl7s2y3rra8af327q", "187014793436739796992"}, - {"evmos15u0ljwkpdxhrsgg2j8yyqyva0ey3hwvge42ew0", "1097275254672306176"}, - {"evmos15u2453jcnq25fzpltv9vtav0hdfdls87fheevz", "6222528705439614976"}, - {"evmos15u2n92y74g42rqlf4cz62tj50l2rrzvnyjpwky", "10032393502201909248"}, - {"evmos15u3a4yak76xthe30wwenu7weh3yav9zv6j78sk", "36068671280076288"}, - {"evmos15u4vd4y5h40a6ps0plzgcle9zp47rjhygm8zug", "1317957614489399296"}, - {"evmos15u6vuepw9gs043cgkrv4r0mpge92wgj3gj5n23", "12481753874038341632"}, - {"evmos15u77yu5fjpwu3v45sg3a5g2cevpv5hj3edms35", "7832519853198966784"}, - {"evmos15u8eza90ml2kth85wglvtc74lce4mddstqp3sy", "3139967680509527040"}, - {"evmos15uc449a4h0cxetutlaartuvm2whqunv87w2lf3", "785635904197088256"}, - {"evmos15ud9rfyx8ghec25r48lt9pze2qsveq983wk2ma", "5753426128326961152"}, - {"evmos15ujk6ccvanwvuwgc6tttassr4eupcyfgtmgane", "1315010150601330688"}, - {"evmos15ulpd2emsu2xxhv589364azkgugstqp365sd6c", "19703371871215235072"}, - {"evmos15uly9gcn3uqckvv2awaxzkv3mex8km8ylshnf8", "2064493863619966976"}, - {"evmos15umcjvjv2nrzedf2m32252ewkpmk7mn9tnfcwh", "31288189959276183552"}, - {"evmos15umxm0luv5v2t3h8c98pyrdgp8qjwadpdpnh3x", "3012820736508294144"}, - {"evmos15upaz94uhpj3ev33uhc27erzld7f0w8m4qe2wm", "39484319206489194496"}, - {"evmos15urw63nkyp8phxe65qzulz44eyknp2psvp63ze", "664836957014679552"}, - {"evmos15us6l53dsp3w6cu0qzr5d5u3g7yzq9spcn9cj7", "27001905831921315840"}, - {"evmos15uswzm3tr9urrqzm8vastqfzp62raye5yrwqvr", "2765573903771910144"}, - {"evmos15utnzrm3ktncp8yfg8g5a900d7afjrqkh4fcya", "11942614000458870784"}, - {"evmos15uutsvuj0favjms94gn65jw9mm23ru69aqlg9u", "883754795149168768"}, - {"evmos15uv4cud2ypyplgxqj0j3xglc5nf69awjerk8xx", "813556050120461312"}, - {"evmos15uw89nzzd766szqleatnhwh6qlkmhx5lnk7v8l", "3903835365867008"}, - {"evmos15uz6t4jd9n007rp7cydz9c4salgxk2a8sx0qhk", "3610585619283329024"}, - {"evmos15v2axdd4kqzdkp3qfgcccylw9j28gdhq76ytxc", "853488330924037120"}, - {"evmos15v45kj7yr3kdxk6qplwpj9khnul5es9ss0hdh2", "3555234343628914688"}, - {"evmos15v6dnwuswfq0uq06fgwchthvfnq2w4688yyhxg", "63827802777639936"}, - {"evmos15v9xsua5r7kldlap978ykm5plz9h4kj24cru2t", "9098271329207903232"}, - {"evmos15va7spgfrt89ds389qdp5dtwtf0hu5xdmnl2ey", "3872314126094028288"}, - {"evmos15vc5fcwqfh38z53zp9ddxhnvuqjral5wkgn5uw", "1990032080296345600"}, - {"evmos15vd4k0nenwgdzegu4gs8c3f60wwnm6kz654t7r", "10589690784269565952"}, - {"evmos15veq7azkz88sqjls9wqcdky6kgcy48afuxem8x", "980141878059163648"}, - {"evmos15vhdxpcg9mvyv7za7uc6am2s50wyse3smrsg93", "38958133896956747776"}, - {"evmos15vjc206c4laesy93uq2y7yvhgx6u5j66mmxlxy", "16459850905451782144"}, - {"evmos15vjr6saasewf7lcp507ufq9h4l6cx8sypkuysu", "542725864711444736"}, - {"evmos15vjru8q2advcnr4ywcmcl3vr9h2pqex2u0dp7l", "31175543584320094208"}, - {"evmos15vm2tjj3x89w6kjf62lh2sc0608h6025la3xur", "2770078964226408448"}, - {"evmos15vmas5tg2cec3ezd2ds0yj9fvvfszz28dcdutu", "672414721454159872"}, - {"evmos15vmdyf7c6ppcfkjx6rd5hl9atyh0qa2px05lag", "460650711368590848"}, - {"evmos15vn5e5nxpz8yt38t5sv8sydurwrf94jetf7psu", "1443709752772359168"}, - {"evmos15vq8t2486nnvsefgtgnxgtwtt6j832y8uz20em", "593257489725863936"}, - {"evmos15vrwq93yct3r9he2d6jczm6sqfxfdhl8py9t05", "12570705557961435136"}, - {"evmos15vv930ajuj3r9unjq338yumhnlh50m6hy0cwuk", "10413579916619001856"}, - {"evmos15vwflwnmh30u0dhlshdt5gyuz45ypc4e75un5g", "2580991761694238720"}, - {"evmos15vwga3yrm00ce7l92jnxp06rczveyjelvpg2w9", "1301007004530969088"}, - {"evmos15vzgxd7etp6kv6ul6pxlfmccarmj9gnas5xq77", "4799212466042830848"}, - {"evmos15w4h2gvdhk304kld7xjg9x9pq3jkwgvn660hrd", "2715359674167696384"}, - {"evmos15w4r23nwmpzuvvdztgcmln8mgfnzvscnjj53v0", "13472184063200563200"}, - {"evmos15w7ud8g5n33fgwelr2fp35urgl9z7rsytwp9dt", "1753655076430240000"}, - {"evmos15w7wxypxu7frq42sxa45za5hy2wupzhf477v54", "11977889169244991488"}, - {"evmos15w855s3vu4dwmqp2d0flr9ucr86wr3n7cvu463", "2395544208026722304"}, - {"evmos15watlnqmyraulnjuhtm4547xdvk346kjs48rma", "7408939996379828224"}, - {"evmos15wc93uwf38s9pfqzced7rxmkejted795phla2z", "6753582801187687424"}, - {"evmos15wd2m6srrtddfd5c2qrqz3tfwkr5l4v4j073ac", "12277541512976384000"}, - {"evmos15we3k55jvqx5s9evlca43z5yq6jp7s4h63ng4m", "331724213218375680"}, - {"evmos15we7jzhdegh4pxyx5hfp8mtnz9q0zqjjndt5rn", "10202888047495438336"}, - {"evmos15wfz0esv3z6tehhalzalc9esdww7rld0wm49hs", "3107112656348218880"}, - {"evmos15wgx9zxnk2tj7r7qave2n0czqp83cm54phs3s9", "1371800330070781952"}, - {"evmos15wj8ztxpurjxtysp68quky07dca4karrhmncyl", "910470178709027328"}, - {"evmos15wjy93al0ad5gn9mvp9c6dp9egsw58sgpt89hk", "69438759710181120"}, - {"evmos15wk4vu7fp2pavwqt2p7y3gk7qsnf9nmgfgfysp", "80187114298830336"}, - {"evmos15wlhzhnsyx9ku8lrzuuwe737dncmu56dhyexll", "1975402497445973760"}, - {"evmos15wmx6saw8pvxfc4wpr3r7j59h33w2exryjg230", "1180591376006344704"}, - {"evmos15wnk233jyx6yrg8rrl67t03lje078qdfupxfkl", "3814736310493429760"}, - {"evmos15wqfys5x9zmlz5rlldmkyj68vpejc73gpj2dtx", "3019289700492425728"}, - {"evmos15wquv9m7ut3f4cqvcd7hrxphzfp5jdeqalrt2v", "854787997180531200"}, - {"evmos15wr6ye4he5tkw2sty8e4ccz02jg65xxsltfcc5", "105316023613040128"}, - {"evmos15wrk58fqkk5qvldl9gx20783el7847jazkuae2", "7759713092336220160"}, - {"evmos15wvw6qttwv0575jz95zfwjgfwae278smu7meng", "27556213392955011072"}, - {"evmos15wxdx6rs2eyfqssqva0nkyykp03ewh84acfk97", "110869106348870598656"}, - {"evmos15wz55z5h40kl0qff4jhe0t06h4vvepppresp46", "426398498814896640"}, - {"evmos15wzajdna7qkstae2tmsgwlzm56mm72axehl465", "5792966033943216128"}, - {"evmos15wzrsux583xz2sa69laum6tfupyx5lf4jrwdth", "922594286307884032"}, - {"evmos15x2eg0xgxj45h4duya0ux4djd99xzr9jasvx33", "99272071244635717632"}, - {"evmos15x5zjqgkee7sggjjedkmwnkc6y603yj8smpxsw", "1425618688399220736"}, - {"evmos15x7q0vzmksgd2y42da9cfhrx3uc8w9sp9tk67p", "18192589053246849024"}, - {"evmos15xchqsfsdl64zz5aa4vqgqq96g4zj64awxdqj8", "723981904303738880"}, - {"evmos15xjh9ehdmwr268uln5fwlqul8fk5k3se2kpyxd", "2978872139613437952"}, - {"evmos15xjqm7hvlra3n0p9p3dr0fkk5fe0e4eh2n544z", "488857905624565248"}, - {"evmos15xkl8hdg6lmzew4kt2rfy6aydtpxtnewhw2m9d", "31235375795206504448"}, - {"evmos15xn05snj9wmmd5m9wccy3vmf0paaexg9w80xne", "1423521685026181120"}, - {"evmos15xn7wqr99tzw97q72h3zyl29gxqnsqpk033y5f", "3019672141250043904"}, - {"evmos15xpf76s26aafd07fg9s6tuc3fkchyr6m947fsc", "675984149061025024"}, - {"evmos15xphwxdvasm9lzfpf278tydqls02revdy239jv", "5047672545275955200"}, - {"evmos15xq7qsagefzyk9qfjt74zqakrvd8egue42g7mv", "3535215845183389696"}, - {"evmos15xqypnm0j760l2828kqlq7y0akytljvgtmxlr6", "1332406136525096960"}, - {"evmos15xss3jknq7rafujp6nkjxf5dc9cgyt0874uv44", "415899818929323008"}, - {"evmos15xswa36plca0q0chpd0y9fa5jv6f0ugaq85m6r", "4442255485881991168"}, - {"evmos15xvwy3dldy5urgvfncmtl9t5zu2r6nmlwaanmy", "2554276066893133824"}, - {"evmos15xx7jxdzj784dfmph9ya4dyr7hwhvamk26e55p", "17503770369479790592"}, - {"evmos15y2ekufmpl5mawxryf2psc9rsux8mak2paggtf", "57510096714050740224"}, - {"evmos15y49c2764hnku4x0shtjkduh24gdadtskdltmr", "50689996773285380096"}, - {"evmos15y4kc376w3l6hvh44rw6ut7ekq5acjq8n8x3ky", "74918160961161723904"}, - {"evmos15y4qm09j38s6g98vt6fkqjx26jypvd37kf2aah", "2762637567349344256"}, - {"evmos15y9s0ga7nmn8ldc6mwe0hu6ynhmvjes5tem2hz", "3092102861462618112"}, - {"evmos15y9w7w070tpwfy62rkj8dy7n23d5nf4aspxdqr", "770835957325448704"}, - {"evmos15yacqxvr9veqqmt0a30vf0smxptlaqye8z9arx", "932247482456099328"}, - {"evmos15yau8affpyc5h645ynp6n74cp79u7jk0kn4w64", "17867744781855514624"}, - {"evmos15ye24smjfn0ea8ryylmqlmhwxvjgtcnesxafs3", "1391213930295140352"}, - {"evmos15yjp5plpz35jugzjcwu2uwt90j3rpwuelv3s9t", "10712736543143972864"}, - {"evmos15yk9araxvq0fq73sanll362z83wyv44capv9pz", "4132969189161304064"}, - {"evmos15ykjehryf7gsc4zx66d6yq5ck73d72c33tdz32", "1587476236075585536"}, - {"evmos15ylh5dkeyv8fwnmt9rallkn2pev5wcumt79xpk", "620980739538501120"}, - {"evmos15ym9dmctnfmqlwesrsj7vxfmn0e8sxkhj4penp", "570306851840860160"}, - {"evmos15ypyex8dm074any67yy8qkx8nzjf3nu8955paz", "3986887390571857920"}, - {"evmos15yqrn27qf5t9xfw9atckedxmalu4y48svd64mu", "30795662721829801984"}, - {"evmos15yumlue9q44ua4njs928xw3uvxvwt62xdwaq4z", "1589118226744992512"}, - {"evmos15yv22g9jqhn4jrgqufd2an23mw8ua5yaepdxxz", "13341755554634596352"}, - {"evmos15yw8239whngdfl52ad8uapeqx5kgr2ghfx3zcl", "1091508350166794240"}, - {"evmos15yzu0c6utaq8c0pjquqewkqxzjnezxylw37cen", "477244124566511616"}, - {"evmos15z588gtwy5u26huc75jrgxztah98zxflaxtcsy", "7784315760978890752"}, - {"evmos15z76nduhrttskgd75gyufynemzxlnzfjy3ptcd", "7558983079314818048"}, - {"evmos15z9s59999rhj2lv7wv895et8drwqujzksyjyj6", "164631473671160832"}, - {"evmos15zffsrrslkjg92q37uw6j4sjsyd0qfq48wqq4j", "2033253330041340928"}, - {"evmos15zfyh7arntmjypucylk6sgw38pwuwgy4yum8g2", "49046507516459264"}, - {"evmos15zg5f3cmpqg32y6uqxuy55d9778nna7rqt8mme", "217451944414090752"}, - {"evmos15zh775l5lkfjdy7lny5c5yhl7q5qs9rq42f5dh", "3861017331244298752"}, - {"evmos15zjumuk7qj56fqdmranycgx24nfqrfk0n098ge", "5961884572014223360"}, - {"evmos15zlnjlujwttg5rhwe6wkqvttzymg7asssq4c2f", "1694949351549700864"}, - {"evmos15zng8mcua9z90axgmjue42j54a2dt0rv7uxzch", "10733292404148056064"}, - {"evmos15zqqn2tjc2rl2j6qrgt92yukj8md8h5d0fx88z", "1266439442808337408"}, - {"evmos15zrkezd5p0p3t2s845wst32exvul6rphj667rf", "368993634241352960"}, - {"evmos15zskwgcdyw230hrsrvxuaakv6al4l86aw72v2y", "1416243219230076416"}, - {"evmos15zwllct6cdw0gmtelxk5uldhh75xfw63nw4yyc", "7264583630337544192"}, - {"evmos15zwzw88xvdhvdd46sdgxc0qjr0mg6q86hudhzl", "1863054542665961472"}, - {"evmos1605avrjwfhnp2yjd2gujr8ejj3k3q9gaq2jvf7", "1457228044340346880"}, - {"evmos1606hrcfpgpmvmjgy0347cug40yd9ku6ec3fahm", "16821223983339008000"}, - {"evmos1606tzw44hgtszg2w03hfvxc87x6kpm4hwdfxdn", "463124908453462016"}, - {"evmos1607n9em2rj3ha3qg4tz8wa43plqfn7zpad269s", "10021332466895953920"}, - {"evmos1609fgvdrdq8pldkmtqx2xrh5j70wn84wseqnz8", "2366849349605457920"}, - {"evmos160ajsauxxzue6ahyujnghevt2rpc0y4q4f72dd", "10814813323851681792"}, - {"evmos160at22svjv6x7gafhxeyl4z75zud6dpqy9mrg6", "213698432148150272"}, - {"evmos160d3guxhsnkc2nqyr6enqeqrtm67096fs67yt2", "2220501423288467456"}, - {"evmos160fzt3vkv596xtzqtg6catwehlya66pmdkzqku", "1433102607464852224"}, - {"evmos160gwy9qunx8xfsw8ufp4qe9mj7z73keyh0gh62", "2618262728645672960"}, - {"evmos160hnk0u497nujv2x8llxt2f02xa3krclk27jue", "1315598079838327808"}, - {"evmos160j58asfxg0qajkyuc9ry27gxdqzhn8s69xnlp", "884589827404193536"}, - {"evmos160qvgc95zm85gqem4q4mnr27kaavwkgty6pgnu", "2911228459196167168"}, - {"evmos160rvx3wp937gwufjwmzf9r9edrz7yd9huqgzuw", "7826558082258848768"}, - {"evmos160s0gnuea9w9m6snctmfwsvycmr0jner06cfrw", "825682295226456064"}, - {"evmos160w0jtm4ttkays9dzvxqdzw7a9dxh38wp860jn", "7086850141309018112"}, - {"evmos160x32v2ka9mr3dl7wx5d6j56tsa9ngpqms7p6k", "272603486792404992"}, - {"evmos160zutqwu7c25rjyepcjwlra74pjkkqql4tz4vc", "3052912926961629696"}, - {"evmos16229xanwzxgh290cfqv9gmvhezws9ktlk437kf", "8709763876383801344"}, - {"evmos1623ft4vpc90hs2hpmm9yzsu5wf65flrqummmee", "35613007368930459648"}, - {"evmos1624tk9a628hpw5urn64h77gnfwe35jy29seek4", "48993487408738304"}, - {"evmos16284mtpusp5n8xnlfrky5pjqyf6ywztpdak6xz", "4294163672500398080"}, - {"evmos1628njpwur09lrpfewwhsfkgc7w8ss73r9rz5qa", "2368741624246131712"}, - {"evmos1629zem3tc2m97reerkey70p94nfvcld5nt7tsp", "3242205096381857792"}, - {"evmos162dqccwjuw95t68g8nrw2nyj4eassjd0t2ny09", "14010372222012434432"}, - {"evmos162fz978l6d0f3z0ugy09rwsecxly9vl36933kv", "7377660485241102336"}, - {"evmos162gnaw3lk73v588xtqr0fzndtu3v8c8spd6p7m", "80497569698706751488"}, - {"evmos162hwkw3zz7ffhdjvgx0vu2esveag995gk03t0m", "1265474649200253440"}, - {"evmos162ljuxwlkl5hm7s6ngqmcj5al0m6f8r3dvagpq", "367103776617711616"}, - {"evmos162mps9d7jgf9eg0zptfgjegyvdrwj8l8zf589c", "53207404223754752"}, - {"evmos162na3mq5vm9nc5c74s3cr89flsjf7dwckkl2w9", "283007362299417600"}, - {"evmos162ncv2hdjugfscq3yw4dhs8hs28hddxkf9af95", "10652637075666874368"}, - {"evmos162q86mg2mx62x6cdrr53zuln2avq9guhl6n0a6", "6717164523150598144"}, - {"evmos162qunha3esntuncdyd4tt9nlpspsh34tly6yyg", "503659752383797248"}, - {"evmos162rrlty48uku654hc9uf2ylt2ld4q8xgz5dy6e", "30377378059002052608"}, - {"evmos162xp96tgn9wmfvafcnpxyyeq83rpdy9fu92uqa", "157450212690862592"}, - {"evmos162ysth23csanzvjam5huca6j4vgfwxy22r7wwm", "3051032736503928832"}, - {"evmos162zs34elrv5cxd7v46p8dq8003sdtjdhrsxgkt", "896041646918076416"}, - {"evmos1635uyd6nz972kff49n9k79jp6q2afpg92yxaj9", "4838392810114641920"}, - {"evmos163hcadf4saveutxr7taslax2dqkkfzwf8n4zv9", "451739227326408704"}, - {"evmos163hyxwrz9zp0cduh6gpzts3gyngarm02awy0l3", "3045748244965031936"}, - {"evmos163kjp38tujvcl5ua5mqrk2ssq436gk88gnfe05", "959709294777634304"}, - {"evmos163mzfyh7q8ev8fpyn4gx36cgv42hwmqglghaal", "7498079918245691392"}, - {"evmos163nkzpqaklx63k34ng2eunzdxasj4kf9dk5flz", "191672777954725376"}, - {"evmos163nlqqd9ux5x9fr97vpyvf6y3ze2m3d3mmc0d8", "317591923940926720"}, - {"evmos163q40kyjv9kv7stcwa6qwkr567vva0nurye9h0", "337935043180827648"}, - {"evmos163rrlqwm95stkkeq39yartps9qw92302mp03q3", "3537701891029760"}, - {"evmos163rwvxazs09ru6agtuferjsz9xk2kl35c9rqg0", "44353502302473043968"}, - {"evmos163saqsk5d9x0gvfmsszmfpx3rmp5zdzhj6wt20", "1676278905819389952"}, - {"evmos163sm9pcm885yl5ejjwmsy49xxk0cfh29wjw2vt", "8278468249607446528"}, - {"evmos163w46drryt8n76vt6vgvlw0pu9kxeqfse8pwaa", "6143044885557575680"}, - {"evmos163y94ajtu3q3dxuvv5fcyxhmqpalf6lya2m08e", "9754483917990424576"}, - {"evmos1644fsaw2ve34v6wln3dj9p92hx74sgg78gf3xt", "3295881000486993920"}, - {"evmos1644tahjaz34kfk4y479mzsam4ez8d2jpacfelv", "10096045780732116992"}, - {"evmos164745cgcvp8d2w2jukn5tevvpr5g8dwmvhuvw5", "6880273015654360064"}, - {"evmos1649p4ullz4p8d8ve9fmuttlzzch62j5swvxnv5", "1805114918482525696"}, - {"evmos1649tp5x9cnald3qkrsux6f8dxx8e2kae6520vy", "369315856744454656"}, - {"evmos164afg43hpyeg8zpkf5d20wjwwmalqe68wlge30", "18029795699306797056"}, - {"evmos164crrj2gay7aalcgxcxqlzmzp2hk2ajdm4lm5k", "733172712849416192"}, - {"evmos164cy0m4ru8alnplsfwwn02ne2269mfv8dexmm8", "16617347699030837248"}, - {"evmos164d5gt7kn53rkg00gpy9ncx2r8hf9vdvx9rhps", "2199439852223349248"}, - {"evmos164ffrh2fqmrfq2rx4khlcxzlksh7cf4cuahhzl", "2595305753426960384"}, - {"evmos164kt6kwz2pvjqw6fjmdrqfyk4dlkrmyr0ux2y8", "372656387777640704"}, - {"evmos164m86s5tqk9u7nhzptyw2shkxu7fuqmvuw6apq", "1255350529140558848"}, - {"evmos164mrmqrk8739n8a4l66h350fv0dskp2e075w3d", "2712232517559975936"}, - {"evmos164v3vguxtqf6h03lpztvns8q8zwt28w0dapeaf", "17346905509499904"}, - {"evmos164x7yxwhmcxzsm00u2g6xe90frhv27wqm8g5na", "848629126522127360"}, - {"evmos16520ypjlmep2qtrneyfhxh5wtghuczz7vrv5kk", "4136876562171523072"}, - {"evmos1653n6yvac9xjzyxdmafzyfn7lxkty8kvn9rc5k", "1121603510955277312"}, - {"evmos165493406mfj668vpg6m2j6n3d9nuyyg452teku", "1164487683010765824"}, - {"evmos1654fmmva92aj7cac2h9k0yhls3c22g8jjwfle7", "10107637628025176064"}, - {"evmos1655mamm2knfpnl6lq4geewlyml7e5raa3c3u4s", "9835241850992824320"}, - {"evmos1655zfs6a24zpkwlsfxkcvayq70qa4q900nu79n", "3323332793961125888"}, - {"evmos1656pvf9svejdf8nc69kr9qxvscd7zatx0mwd5l", "527211625522904576"}, - {"evmos1656s6r8u99rk2kcg8p4wdgjhg2xldeak0eycpg", "884609018372414720"}, - {"evmos16577qampxvr7m7qpaxh5sv5thy5wnvm6wvrv8w", "443767600287108096"}, - {"evmos1657n3qmwneaj2nawclc79je0vdhv6qra98w55w", "136768185627846656"}, - {"evmos1658egm6mnd9jfs95e6sptm9pnl0zxhtxt9hw4h", "1460378091757306880"}, - {"evmos165cqcc5hy558kdawmypeay2fxrk7ed8ng94ys8", "684593209048953856"}, - {"evmos165cwp5lf5zhvhcnt40wag844eq6vnshrhcezxw", "2375114322946656256"}, - {"evmos165ewgjrcjj27kakcqa93ecgkrtvvu37qzm3stf", "686095672461803520"}, - {"evmos165fg0dqgjv8gl3atekpa24a3506crggg0t5906", "23857070425941983232"}, - {"evmos165gl0krn3egesg85usv5hhdj20quu5tmy3jvxl", "11275396680617744384"}, - {"evmos165mlv06tm2yyxz2f2gdwudrzdxw3rngm2thffd", "4213810337925352960"}, - {"evmos165p7jzmtu7snjmgs4x9ug025nqj7k9rc02xwnm", "521069517754114560"}, - {"evmos165p9f46jm430fsesxaxx5nznu4y3pjs73ka4x5", "369263843718008064"}, - {"evmos165q9kq7mz8zlern2848zms0yelrgtaganf5y29", "106124484589351936"}, - {"evmos165rwllfvh2v2tr99r47cgw67rc32264s4tfd5l", "3075524331205854208"}, - {"evmos165see2k0w98p34hhkjem3vdzjm9ktw3gfms9gh", "168735705747027968"}, - {"evmos165wt5w5yxtdmgwhwypa8l5a7hlhc0paea25keh", "139386531932236544"}, - {"evmos165z9u0lyrgdjr73alcnfhngaqhesf74a6eawaj", "633642536130572288"}, - {"evmos1660z6zuahczwt7c25c0jm3t3ulqpg9f4wyyzhk", "2747191410551734272"}, - {"evmos1662n5zjccqnp6udf0ju05xq5hrqdut46u8dpts", "218708791839977216"}, - {"evmos1663wheknktnzauhlmdzgg68l9u70ejamzsz4x6", "287738753858338816"}, - {"evmos1665fjpgtjvjrd3ym9m7gurh4xhgc962uhyasfe", "252079504422832128"}, - {"evmos16682jpfluqwzjnl3ymjx2dwmp93z0rmd9dmgap", "3194838277808004096"}, - {"evmos166cddul7ejmk4recmsdlp2j5urqvtanke9xqs2", "6052926415954657280"}, - {"evmos166cpcgy33fa6t5z7s8w9nhkny2tzknfhdck0kg", "18733845324715266048"}, - {"evmos166dhs4ffm8e8u6y34uwzlmqxwl6zyrcq4qhtvf", "33561773558628741120"}, - {"evmos166gtjpyqqyxu6q0p8gngxht868r3lkhgsgl9y4", "5642407285127426048"}, - {"evmos166jpxecwu9kuwkwfnyue3xv4uy2ynut3446kmd", "420288502020550656"}, - {"evmos166lxwvfz89x7jjvyss3t5egqcj5x9lf05trgxs", "5351491481431277568"}, - {"evmos166p60y6shc6tjyj2cva06w0wtm7470s6f0kaws", "3968831398420484096"}, - {"evmos166sxdx0gwuhyr82u5u7rm4a9rzqhgr7lgjva9f", "22465272809108316160"}, - {"evmos166t3jmskphx920438ul7gx64jehzydp8hzalkh", "705002668559163392"}, - {"evmos166ttk238x357s8dcrrhd70j4qg9xnljf8g046w", "884551314477657344"}, - {"evmos166tuyyrtcfavgcwetyfh6slnmqm9ff5jhnzmur", "17444403390057664512"}, - {"evmos166ulvm7rj2wplu6av92tp49ul7rcqpxk4kyr8m", "390301427775027968"}, - {"evmos166xa32c8qa33lhawnl67da9ypncsq2cr8cuf0m", "4915432180043284480"}, - {"evmos166xcpsnj95kc67yapacvn0w0zkah9jwwusgdp9", "2299541365179555840"}, - {"evmos1670msqly8ktd0n6spvekf3k4ta0m746vuuzetn", "234481965686126336"}, - {"evmos1672gvjzlv7hz60s2q7yprjwc9zeuuqevd3t4c9", "9849451298905563136"}, - {"evmos16759uzfp60uswmzfw9q2v0j959velcwa2m0c6q", "1217214187592069632"}, - {"evmos1675twyq0g7nyhhy6xgn9p2vjj2n26q30n96a82", "1309765641323465216"}, - {"evmos1676a7nyjggxxk8arp7y54zq0mzwvwl2cgz2cjr", "158271770421629952"}, - {"evmos167729kv748zf7pxtghjltch2yza6u0hhfh4aq2", "1669925932477657088"}, - {"evmos16775g4mktgfwfgm6efd8enxnx5gksaq989h7gr", "3206362475419913216"}, - {"evmos1677avas3e2ln3trvlryvsgerwdpgs8dq7cck5a", "368909509708502784"}, - {"evmos1677lkjx26j2agkzmnkzkdxelx7ham78k26dh93", "1384886085788177408"}, - {"evmos167d7wq3kvdgp8y8smhdq88yz8wmh5jxwcluq23", "2725452097502814208"}, - {"evmos167dw86w8jk5rfjwx69l5cuv6xp65gt48gn9da0", "184385168689085440"}, - {"evmos167f46asdeka96wsxd60cqw703jvdfcpkyq22w2", "26345721633306460160"}, - {"evmos167fgyvkmu6fnn50m5ensx45qm4svms3pw4lth4", "20982950173079453696"}, - {"evmos167g657dt69runmz39m820nk328gdg7c5lxlwhp", "354099886188074752"}, - {"evmos167lqdlk3zmr4cjcw94mx7kmfae6pu90zta0ghc", "2834910009809798144"}, - {"evmos167mc4qkqpy3wkq9n0ylu0x9maunvrascqvlwwq", "1329933949902992384"}, - {"evmos167trvjdsjdzqfrhe3njll3zl38h3wwpt40rw2d", "523649466037692928"}, - {"evmos167ucfy98cnahdqz787zcnvet8x9l6dmxy0xnls", "2743481187756605440"}, - {"evmos167udy39hlll4wart04dd8ev4s3q7zfftu3z3n6", "331256783919734784"}, - {"evmos167z8ksgtnvxzwpxzdzj0znhu2tu2057n6hw8lh", "22941454437579964416"}, - {"evmos1680tu0vzfzfwdfn2ydasjgvl68hktfusvxduqd", "27778669350508277760"}, - {"evmos1684y9fsys2zvrp9ne2wnwljfcwwwqgt396sf04", "2950951896029954048"}, - {"evmos16858xa58qlccpkq6q8uvutgel47u7526tv4y87", "474112676026506240"}, - {"evmos1687ykgr0ftqyx0e7gr7alz8n7vm7s8d5rrcqex", "2931834407618663424"}, - {"evmos1689eqypwwr3f23s4uglafra5n60mym5h85lf0u", "2785335270213778944"}, - {"evmos168d84slcyqfypnck0pkj5qu95u75q0pevj96ss", "387603311787792128"}, - {"evmos168ejh2t4glqg8jch0zy4438xp9tjh9pn8th8pg", "402029484249711104"}, - {"evmos168ggqyr5zfxgkc2t77y95hs38e5ra2leehks8r", "3771072677694496768"}, - {"evmos168gw8q54yw7q5z8k7lu6l7xm0mj54jtglmfhqk", "435906557089506304"}, - {"evmos168hl6c2r0c5mzfug7xg5mfk68jvfxg6j0vjvhv", "305677430538719232"}, - {"evmos168kas2c2vzxn09fqj2qxdnztd7grzqtmyycjn2", "4135916095307838464"}, - {"evmos168lr7lqhausw20f54d7zpfwsn3fj3xy46jlceq", "567874511221456896"}, - {"evmos168qqyc0utcnnfn8tw3ut3r4e72fhzzl8ky7cae", "7726836820001089536"}, - {"evmos168rekxwddsq5ns0n2l9f2st5ruxjrlr3yptdcn", "73128967870396899328"}, - {"evmos168sxdjexcagetfy94u6z3jk4cehkcxpcy69r5f", "429979173706703360"}, - {"evmos168w3fmted85k4u7zeelmsvusnr5xfjuy70rnm4", "1488090987115659264"}, - {"evmos168wupae8jd0nw6axl863k8s0kjquyha32435z6", "7969998023912120320"}, - {"evmos168xq758kwh5ay375tt04ettvn29x8zlfwz45uv", "2792085404482686976"}, - {"evmos168y3jwvpvx0uvkejttw992xpwcjzn5wfe6r73d", "418081915640144896"}, - {"evmos168zqq58a3fx87s75phk80vde8aszv5s0nch0tu", "8162135028443304960"}, - {"evmos1692e9383zrrkru2dp90wjw94d89cxzy92y9vfq", "20701128792180203520"}, - {"evmos1694utpkc0rh0vjnfuzq560eh88ckmcjhrva6qw", "291518442363575552"}, - {"evmos1694uv2ytxvy4dv4xqrehpu6lq2utr3j56eh0ek", "4726309570745224192"}, - {"evmos169627hzztpu2h9p4wazjjmu7l272rk5ftnjk8e", "467829951897133056"}, - {"evmos16965wmjcqrkj9kmgv5jrhsz55zz57mqm3ymutr", "1659660904306810112"}, - {"evmos1699x7ws7zwm8fy2azuk2yq94gn3ga8yr2a90cf", "827497802565184128"}, - {"evmos169an8xs88p4lpqrm5mgygaxn7kc8f5uhk6sk5j", "2583708381287918592"}, - {"evmos169dg3083hpnmcxp2r3lwhdr0scghcafduk2hcj", "2259107555420430336"}, - {"evmos169dyrs4fwtnkmk7hwdsp5pqlyj30sjtqp99jwc", "1903454435671031808"}, - {"evmos169ftw677a6e74kpcvt0y3qhdypyxhwhfuddcyd", "887513761716322560"}, - {"evmos169h00um4gj3hjfrr53xs24l2knppmzdpf7kn3n", "11332157459562360832"}, - {"evmos169j3pnyn8lkt0wlfgm5v2fxyn95l70wsxdppvd", "2676368293177143296"}, - {"evmos169k9ysy3ql0k03janlzzwllspgwpk6yl42eryt", "1085966883822506112"}, - {"evmos169ksnssdwrqn5duvvff87runmfs3kk84pssfql", "3117066849625550848"}, - {"evmos169nk72ykjyg4hgtmad2v6yr67h79w6pqug8gsj", "327875769672599808"}, - {"evmos169qysz5mam05jyjpqr5uek93t6p2xhhnhetelg", "4598682063128783360"}, - {"evmos169u4mh243demylyu959mpalud49dve5d0nhf4k", "1787764052230217728"}, - {"evmos169uxdsg0t9fz9c2h8370yvpu38jl0wltwv8c0h", "3996018163180272640"}, - {"evmos169uzwh8epqp5qekjs7jyk7ganq23e73uvqvmru", "1681644871895961600"}, - {"evmos169vgt4ypqnz5ps7rv3ku8m5rmc2f67k2008pjl", "751257551630266112"}, - {"evmos169vhs9a68fd5q88wyndew9qmw9lgxsgsw5j433", "49542841995129667584"}, - {"evmos169vj2prvfppm7ez26p5zx9u247lxwmwktasm8k", "6625074907322269696"}, - {"evmos169wl5ud0p0wqlr7c3cyn6x6a7r052n5rgt78h9", "1429349216359073280"}, - {"evmos169xkjlqr9v9pu4krvfvqpg3lvr0yvlhtajf48j", "4915081755923595264"}, - {"evmos169z6nm3p2d95sfs7lsma45d4myvghh3x5a6c4j", "315837345633992960"}, - {"evmos169zkjfy6573ajkjzs9njvk33f7524uqrm4645v", "50903509239290380288"}, - {"evmos169zrswugh6h2l0udnt3pn7z4ktzqgr5x86nakv", "13797625151574315008"}, - {"evmos16a20na8n3stquaxk5stkskgjrrtaat7cxhkfpm", "1480603829736505344"}, - {"evmos16a20w4g0qyfph568l3gwjwwk4xgmhca793jfg6", "4471385505611019776"}, - {"evmos16a22mqcdlwmc96pqdge97n2pn0tzxt8pxq87xw", "79112652434898944"}, - {"evmos16a24quz56kvmd60334uvkhxqdrmzjfgnh35npz", "1281194506387859456"}, - {"evmos16a3czsthw536g06zq733grndl8e2jsc6u4pqz9", "478766633693117952"}, - {"evmos16a5gznkwtgv2xwzx7fa4s6cml30cwpzl6yjh7g", "1492209333318011904"}, - {"evmos16a5qejg05gs353p2nfh2mck2mz92yk8zpe2x3h", "1691954958831918080"}, - {"evmos16a9maq9s2rrtuw72n08je3tm6ww2ngpsqfp5yq", "837319158063108608"}, - {"evmos16a9tpeq62yf4dkzuy2q28l29gcxrygw8y8enhj", "2804908519564223488"}, - {"evmos16ac6r8pgdxn42lrrckj2japkdcdq86xr6yhude", "350922236742874880"}, - {"evmos16aclvfavzhmpyrmtrj7mapr2qaez5uzunddmjp", "6798262630047662080"}, - {"evmos16acrqg6g5uwm05z8t5czzffhj8nyt8gkpum240", "18154884812047716352"}, - {"evmos16ae8lkrrq2x6kq6tk4wsuaeq722lnl0dcfqzxc", "1423010078531477504"}, - {"evmos16aff99v82cpwgxysmmejcaf5puvu7m77ltvq9x", "26771412619679858688"}, - {"evmos16afqnpucekhgmcxa22na6qjdgysc7ejm6nawfn", "5773817708166651904"}, - {"evmos16akxrhztpeh5fsflu7g35l0d2a5hqs98dns4gh", "516051693037354752"}, - {"evmos16alkufx9echsv6jutw5f3m3lqfy3yhhr7a0h2l", "380994170859258880"}, - {"evmos16alrfyz8n4j2rj47s2tn5m9v8kgcg4psm9wlm4", "569203990963005184"}, - {"evmos16an8n7k4ulqnjkeph07qde3mafe80e9lalh3su", "1805984749093673984"}, - {"evmos16ap76vcfsm7x80357nh7fj7dh6m9uahuw0faj6", "226377925396236288"}, - {"evmos16apyuqxcvjq28acr96u6jqw2pp7alxxx7jckm6", "3876787578267742208"}, - {"evmos16atnf2vu9fze4r800wlq7p7p9fhyx57p0el2ku", "1306337786337959936"}, - {"evmos16awplm79ml73zgq8ahs6n32ew0maaq7jva6lyg", "462246066027736832"}, - {"evmos16c0rk3ry34qu4y8c7rxl5xw284r2eh54nk2gez", "1661666545104858112"}, - {"evmos16c76k5j3zqafjyxpxkxqv226zakprf4attjce8", "2004222760187275264"}, - {"evmos16c84ppyw0v2eadewyyjdqy264fk7r4w8waqemn", "2653193058259702272"}, - {"evmos16c9tc8z0ewkwqjyl40gy40c4gn4ajhd0g2l5nd", "1426575411511517184"}, - {"evmos16caylnku739nnrw6cj6ggwkt6dp8pjy6wqygm2", "31753512873956024320"}, - {"evmos16ccsrccxdu763t3kx59yq7s0fmv4f39cykuwt7", "181444682235377152"}, - {"evmos16cgptq3mvznudc2kezr6wfr84qtsykwjxnye48", "2206015053991284224"}, - {"evmos16chc3f29t3egju3msat0kl9d2jvewhfstr8vnz", "18853445979211087872"}, - {"evmos16clz4ayexf7uvzasd9y2ns0h90nr8g4kfctxw9", "926051568793145344"}, - {"evmos16cn9l3y7vf7fl6cne9553myn729k30g46pa9fu", "19948074208931569664"}, - {"evmos16cy0ruuktkz6ked8uxrfag40t0zqd7cku6qpfl", "8784498870869803008"}, - {"evmos16d05ngnl83xhmcjky8tyuy4xweg6fhv5qxyc46", "1260136697043165184"}, - {"evmos16d4hcnrj50tdehumuk6j2kdhevw8dewy4acrl3", "1056754800961078784"}, - {"evmos16d53huccfvan5jqgkefv67mh2yjydn9v5dchqp", "386944896669301760"}, - {"evmos16d53n527hlr7cgh8fm254l5cy4dkay0nfrjnky", "21132691283904000"}, - {"evmos16d68zcryv70ny492xseyj99tvntj2hhqyqg2hm", "7879329282972446720"}, - {"evmos16d7s2e2a396w85fwy0xphcr24ax54m8pcra7yj", "4940717864348370944"}, - {"evmos16d8mg78cpg8d0hfqtxytdkyjq78tv5hl3d02c7", "233172332777870336"}, - {"evmos16d9h3hcrxw7l2xt36rtr0pgudjgz5knu9k2m5r", "3562361010519046144"}, - {"evmos16dgacfhumpae9nmywnc4qgd3lwa0hrvpukey38", "104863372318993408"}, - {"evmos16dhcp8lkd2vj8gvl2qtef07qul0dstcungpdsz", "248714239348144128"}, - {"evmos16djcgjqgneclav9rncewlxxerxxvmwzyguyeqw", "6431909803921702912"}, - {"evmos16djxmnu8ycpueqemykm6lzqqj2lgp4xqac4ez4", "465351684681878528"}, - {"evmos16dknjjdpva460ecyr4j50l3vtf65wlttmxfxeu", "11090649261149143040"}, - {"evmos16dm2l2epadacemsvflzwzckstm8e6sz539lggp", "4514570484186572800"}, - {"evmos16dm3ufadwkv6kvxtwzqsxnz3ahghjq8z4mtf2u", "1090892211692809216"}, - {"evmos16ds4yaxgued6jj6plxf5rau4ud48mjturqtmdh", "2284963953334075392"}, - {"evmos16dt9vy7lc7gn7rc6fw5xf032pt2pyatznk0yfk", "2864542015643639808"}, - {"evmos16duye7hsgudenumuxwwm85czazsnkxn6f7a6g9", "911071882007034368"}, - {"evmos16e0tzlhfttlugddjj3gyksgvkxxmfl9k4ktazf", "116081276656143360"}, - {"evmos16e5rxl9kkc3jz65nu4dhd790rxh3p2l4fmp5kh", "6570235935612924928"}, - {"evmos16e6faguxcysnppttx0k97vr7vknml9vzkk3vyx", "26803091840657162240"}, - {"evmos16e6qa4757jyfy449tfxlk06m3tehv5gf6w0gjh", "5665343842218132480"}, - {"evmos16e6qq72egump3evuxuce0kf7mre3vwvxxll685", "8637510902910894080"}, - {"evmos16e7r0czscqdkx4rd8dgtyqxanw4acpa4kw9ehc", "136899265961103196160"}, - {"evmos16e8qh2awfxjtn7mppct2md0l307kjwz3u62vez", "675545845283763200"}, - {"evmos16ec5y27acjy597xplr6use3wld4tptl5r606dm", "394036135079333632"}, - {"evmos16ekxx0v9q8vl44ddyd2tqrw6w256jeqd8kwqdq", "1383607215672136704"}, - {"evmos16emrvvlqm3nxqale3k5xsvamng8pqzs42a3aun", "11460963414374690816"}, - {"evmos16eqeywjmkru9gq2ag95ly9lag9cymhpna958pg", "1588552121527520000"}, - {"evmos16eqzjfpdjd0gthxfsu28mwqsmlm6ar90klqma2", "14190248666156150784"}, - {"evmos16era9ej8fq0vynncq8hppyjg4wgn6ej9j3n40z", "9481809139805126656"}, - {"evmos16et3mwmhwddw3zx5lltvy7f6gclndhjcgreadt", "5388936260790508544"}, - {"evmos16etxp69z8ltx0m8x9tnam3zl8rs2a35v26d8d3", "44131645011472384"}, - {"evmos16evj3ehu7huzxlm0wnp7y9z2ytu70xhzkujc9v", "28359594689413373952"}, - {"evmos16exgjalmxzfrnztp54zk7rkvam3ygh4ywmxg5p", "6178262605446364160"}, - {"evmos16ez80mqvfln59vutdyglhjktu7qff0h2genwjz", "270428980797952"}, - {"evmos16f363gwu5wtpupc8zp3xfgpsj958q3gq63ewth", "21554163065465618432"}, - {"evmos16f4zwv2cnkujq6w8s4sgpkzzj892vh8d08f74c", "2913967918228963328"}, - {"evmos16f8n9svtz0mm9gt8mwa8nve0zu37dfp7h3tw4u", "2146357012452751360"}, - {"evmos16f99kwjfashdpkkwyhcaa0ks0c6qhm7fs7ahuc", "7171994260778283008"}, - {"evmos16fajedzfs3dt8anq3tdelgg7axqx05486wtrz0", "1048909435702358528"}, - {"evmos16fdktjg9tjh0gxzspculh8jylvwp90d8s2a62m", "8662971385327017984"}, - {"evmos16fgjtqsdx08wr3z73ad42pv0ep2pg7caczd0da", "369637603803246336"}, - {"evmos16fhshht807vv9lytlxhml0qlfhwdzaac3m7mn0", "317369439661038592"}, - {"evmos16fhuajnxj0u4kgmjf9dvu7f42t4t2vmhw76est", "7722288567664607232"}, - {"evmos16fjevmyw7js8x3ahkuvdnme2ukdcyg6trsaha0", "47452458689109491712"}, - {"evmos16fjgeeeh85ysfhzleruymqyhlhczeqjyjpcrvd", "940183017826338816"}, - {"evmos16fkwjsmrdjnr5xqs3phaz3zd8h90ww9nx4lexx", "1194049958019136512"}, - {"evmos16fm0xpymxy4qyh7ph67tvcee638jv8ry7ue0xl", "482186631549935616"}, - {"evmos16fp23req9dun4q9r2vny78z362fte9gmgxp8re", "57312929613221396480"}, - {"evmos16fpxpzt7fdxwaatthn7t55n2g78wg2gmn3gess", "2396086662251423232"}, - {"evmos16fpzkhy0u7qt40rmn33ly3223xs5lcqjnwgwk4", "807713068207739904"}, - {"evmos16fs7jm536n86e8v2mpk3lakcu4vnt43rp9s960", "13923727229015109632"}, - {"evmos16fsz47z378p9ca6wg5gl3act734v5syazer22r", "2656860806585407488"}, - {"evmos16ftce9wzmtu8ua2z6npstj2uauqjjkrhshjzuc", "2652335591395266560"}, - {"evmos16fv5gd4zyr5sf9wtxpntynfh4qjjltqvhpj0ah", "24803031741158195200"}, - {"evmos16fz6xjtnzq5jv7gr70aerm07ywufy0l8646c6g", "14209213795590909952"}, - {"evmos16fzg848584ueme88e3rcwq8m54sct48kwwl9wl", "1725111448467709952"}, - {"evmos16g5g2qqyt6d2eve6vqahdq29uy42p5yhmd49uf", "6920812595621983232"}, - {"evmos16g5w74c8n7xcdjjeynf4vt0f6ht9wn8epvrf78", "368716492082324224"}, - {"evmos16g83m2x7xxqscpmfs0m4nqrcgt0f7kdx0w6vx3", "5331028032529688576"}, - {"evmos16g8exyhq0fsv6zca4cnm5rzqfm8532aq6pmf68", "461448636687048960"}, - {"evmos16g8kj3q2x0jkvnsw46j24pe2f892gr6euc4taa", "129831663289872384"}, - {"evmos16gfaasxdrr0qgclyqmnzdk33pmak6p43g69sdr", "2438160669426781696"}, - {"evmos16gglj5hc08tm2regwfvh4q25jddefksrczus7z", "1473171262602648576"}, - {"evmos16gglrmdhq3h8n3et8jwmd96d0529595h5g8j8c", "1009280307658458112"}, - {"evmos16gh2scqrcx73e0wcslw6z3jtq7jhrqmfaz4rjc", "2001002360721485824"}, - {"evmos16ghm6hq4dnt54vpzfsqlwf7p3vmc4g4uzytk8p", "477278426848106752"}, - {"evmos16gk42ej0jgx7e78mmyedv4430dylmvpdp3y0aj", "92873596246480027648"}, - {"evmos16gkdu5r6yyev2n3ka9q8dmgy754auxfz6v43f4", "1342582872396379136"}, - {"evmos16gq7e0595v55g3jfvjs7rsp0jgl8cn07ad35py", "420166552492773376"}, - {"evmos16grvtrx6jkv597xglketfhx8lur5hmakhtzyvr", "863323835435134976"}, - {"evmos16h44g4tl5kq37h7mhtx764peju4d4m4uxf0mn7", "103156394583469056"}, - {"evmos16h6c669z7qqgrnzz2peyftd9lppk86l6enr0jx", "1535808780758528"}, - {"evmos16h6qymr85nh4v5h22uuswfuc7h9fvn6xucwthj", "696389133495186944"}, - {"evmos16he0h30888rl9nrgm75s07mxsq0d8tdg2rpafz", "6344247903550130176"}, - {"evmos16hftg3l5jg7k6x0j8rgr26rzfzjjejh6qnu2u8", "3825045796895308800"}, - {"evmos16hgcg596hhmvj3ddyvu2lzsljfljmrcl25mjdj", "21681820736527269888"}, - {"evmos16hh0nukpf9zlcde9hvl4gxq3x47wua6df6dx8l", "367581706015309824"}, - {"evmos16hh7j4svmesvfretv6yegeh36wwgy3xhzn9pgf", "497956244880547584"}, - {"evmos16hh9ljakgjytn3prh6c0q6zwe8cw5h4t6deuff", "229275233787095552"}, - {"evmos16hk6pateuvwl09dd9vxsr4jm0vm2pv8q7hlf53", "766405203189891072"}, - {"evmos16hq4anj0r07q60dq8ma4evhlw7pymh02czxw5m", "15642525661316169728"}, - {"evmos16hssz3tdq27lz5at8j63crqjqwgn3pn89lle52", "705497418550824960"}, - {"evmos16j0x5wzmskq377ve55tl3veaxahvgtgyvvqtdn", "1847309496250241792"}, - {"evmos16j3pg6ycnr4wy062xesqhtc0luvgnlx3duzxch", "1169935255229078528"}, - {"evmos16j4p0yluyywh9jgsk96qg7hy8y7kg742lyzvz9", "587739761339715072"}, - {"evmos16j540x48dvhwmp8kkww223cgqj7kzmwy6skdzu", "3318264774180995072"}, - {"evmos16j5hsdrcaa6950ks0rf944rgmncukl74ga5e48", "49371803142576758784"}, - {"evmos16j5xjwcj05kmzexxcgwhpj83vwawaxdjaxt3f9", "973487909595019264"}, - {"evmos16j6pmanwdsk6slnk5z86z3pyl2c9enwckzwqkx", "2467887032736765440"}, - {"evmos16j7vy2yty2ffeuewtjjc9s763ynn5jntchf6rj", "426207212056186112"}, - {"evmos16j998hj3pflnhkxx05xlwd7zcdsshd25j97k5x", "1555273738397974528"}, - {"evmos16j9fh5vapwwuyxpmu4wdws7cwk8hsxj9yzmkgv", "104420624373720064"}, - {"evmos16jcpuvgwuge6xr0alj7swxfml2njf908eq3um0", "1672811133560007680"}, - {"evmos16jdr07lz8gryykdh0jzjmpd5qqx98ld4xeq9x8", "10257384545108684800"}, - {"evmos16jh43w93he62jz2c2rhddpgy32umv0mnne2n3u", "498813163716734976"}, - {"evmos16jjs2ushmru4pgxdqwuwddzwyuphj2265x56zk", "3777687029936749056"}, - {"evmos16jltre7384vn7ul7kd9fnmtwrjyfwvv9qm7k5g", "3036400222822529024"}, - {"evmos16jq82gnqjcmy3e6kjdz7lt5m52rthwaaqusere", "1410123023735701504"}, - {"evmos16jr8qcdylmasklxg9t44678fx8nf29du3z8uwz", "8487985971648768000"}, - {"evmos16jt5urrtz0kgcewgdqxp8szsdteurtfssmrs9h", "397373473553079808"}, - {"evmos16jtxch54l0s09q87nm994kt9kcs6hnlvwse3cj", "872634237340249600"}, - {"evmos16jy8f7wdzn974ceqtpnxk4a35n6v9a3avfd6m5", "7039999951764226048"}, - {"evmos16jz0h50cnu8fxxw5tv9wdk2tm2468eu05hg286", "99424277127140864"}, - {"evmos16k2qfj5vedfjtksvmhez4w5mn0hwr7kgedtqtg", "4994123616709404672"}, - {"evmos16k3hzpp5jytduxnvr0x798v0tv2laz3fnrpj2y", "15660740644365045760"}, - {"evmos16k5e63293lxehtfz0k2pjradnq2hc4ja5zwde3", "883545434704948224"}, - {"evmos16k64rju8al4579ndn9rmj3yh78kw34lx8jnjzy", "2073594853124891648"}, - {"evmos16k6e4qruj0052ucr9ynvfrv5wk9wx6p2gutv6c", "288353815640178688"}, - {"evmos16ka4t3sux3lp50naqezlncqctwurv07kfk775k", "1701094742386693120"}, - {"evmos16kccfsf9w7hx5jwc50wh0jhqc4fmma5gcg68xv", "3356238649455755264"}, - {"evmos16kmm5f0778kl0u2nsaqp9z3zhvryn3w7fxrufu", "9752767708637233152"}, - {"evmos16kmy86tssec9lsl9tg8zwztd088wtpumn3qkc2", "2002868489468135424"}, - {"evmos16kn7hgljmma6zkchql84pkxh8k2a4h69q74drm", "9016288815368998912"}, - {"evmos16knw0r3u99dwx2yfez2w39ph2ndtul7hdd98se", "296825656736817152"}, - {"evmos16kph5tv0t32s0j2wc5caj8r8djgwge5jurs98l", "100066350858685440"}, - {"evmos16kpxduyac0hpcxlccs9qx5l446kg5vzfcqrw25", "19503376676542185472"}, - {"evmos16kqdza959qktqsyhgjdwgqm73ccx3vpevyyuux", "3121108597467848704"}, - {"evmos16kqlpdzf8ah4zackth98tdj0p7aq9dsl4yylcd", "1093337715686051840"}, - {"evmos16ks54u2vuaccscd5w2q6u6eudhrffqhgwdmvvu", "203311559841812480"}, - {"evmos16ksertlycfq09mf3qjd2et67hfq39czp8rsrzg", "6512754920603574272"}, - {"evmos16ksqhk6xqpraecqrzy4rku7d7cuummau8thvmq", "3383604824843750912"}, - {"evmos16ktn5lw8rutd5574hmmfdrqpdn9zmu3vh7w7fp", "384498519150480128"}, - {"evmos16kut6pu350zdsmkgjsrktes5d2vhtzpq5wqh7x", "1432937658662620160"}, - {"evmos16kux89xkwfdwwtha5ape45vmfgangm6d4auvhx", "1152483262530440192"}, - {"evmos16kv4kegcmnez6zstnqzk9dfe9e6jv9jl2204zn", "7712180494212268032"}, - {"evmos16kxcg6x4846z2ptk5lrgtruqjypjkekqldq3uh", "1325006970277865728"}, - {"evmos16kxduqfgx6vdsnmstac3cmdptrlj9zdcfnhz8p", "1274321143403143168"}, - {"evmos16kxrfmnu2cdpn6wzaj09lq3a7f9mk66pdtunma", "5377763484858442752"}, - {"evmos16ky6nxdh7ufktyumc25kyj0zh84rz459qqttsw", "689999016658479104"}, - {"evmos16ky9d2vh7ty0fd70lhshq0yzmdauu0vlh3cuaj", "18255083909557665792"}, - {"evmos16l2f7j47adnzq2mk2zwjjvp70fwlpq59yms3z5", "59840482588442624"}, - {"evmos16l4da0rcun2ew924gm5hxs5y3pnh7rhps36alm", "1669036080724369408"}, - {"evmos16l6vnmz9h8ng8n9g7wy33ez9w52lp4p837sgk2", "2185787072881444864"}, - {"evmos16le6vjzq0n77kslag3sryfdpdl2e3agr2hzuxh", "215417244375442432"}, - {"evmos16llgcx08zghvcnemhksmdzvnyy272v4gfmeflk", "1435027188845191168"}, - {"evmos16lp2m3tnefjjhpvazt63r4u87cxy0z7l6j77nw", "33781304865636220928"}, - {"evmos16lqj8ylz8gr7venxmgm38hs6dh83trcwygzfhx", "39413947776222715904"}, - {"evmos16lrxxzvnnu4umvxswf7zmk2v9gncdx5esm8jud", "463033416716660736"}, - {"evmos16lshsd854mey7uedhdhs6dj26h77n4gkpwa0jf", "344383367738077184"}, - {"evmos16lsjff06hth27pcjhsvzwn07u8vu7snrvxhus2", "21394623479127007232"}, - {"evmos16ltdhvkel3vqzu0qd2ghv9v8z93prf6m0s5s0p", "12657044779810439168"}, - {"evmos16lwxjnt4ev54a2zawduw6lu40r5quazpuqpjn9", "11389051820637712384"}, - {"evmos16lxmprt57efzejkkuxmg30238e8vawws0tk7ta", "399271729067196160"}, - {"evmos16lzjl8myrhsl8aa7ww324xflrujd00kn29xjlf", "3160935050499147776"}, - {"evmos16m2ydq6jtywysuujssmu3fr9jf2kq2p4a72zt7", "1477804240733280768"}, - {"evmos16m5nc8l9c3wg9cus2lj59ys0kygyj272scs3gm", "861833380139173376"}, - {"evmos16m78mf5p69jwcfhyx97970shqfhxxwkd4ns088", "1054127273056777728"}, - {"evmos16m7g7lr0gauhgssvsjn5fm3g64c500teny4y7w", "2030148899174290688"}, - {"evmos16m7hqhhqkvdfxqxnug25hn88wunsewm0x25xky", "1739191037901676544"}, - {"evmos16m8qdfj4j8cu09nuwj7dss0aulexegr9c5v6km", "1388960774493773824"}, - {"evmos16meghk2drm00m78aarm0zqy5lmm7tyxq6ade3g", "27302382719196061696"}, - {"evmos16mfc8rcvt3z6erc5jda7kayaa50kh7xa8xzv95", "130402504120166481920"}, - {"evmos16mffmc379d8kk6t9qafu9dz3svjmwpejwsl0lm", "3877192799523777536"}, - {"evmos16mkftvy2qa3rcg5pl8s22k4rw0rhea3ppn48h6", "6452419441284874240"}, - {"evmos16mmdmtjv3ls3zmf0xc9jmun68gkftpwpv4ts37", "1220907970631852032"}, - {"evmos16mmt66lat89tn4fmevx7jk7wvkt8fkv0d0ntyk", "1310157902501203456"}, - {"evmos16mmujnywstr79cfrf33k65yajpjmrsm0yfdk08", "26603197991995768832"}, - {"evmos16mn8h569qe3y4deaeentu5zyuhhjlw496s6dz5", "1427338277196787712"}, - {"evmos16mp696he9skjhtmheuewy23krjhf4ym8mckqus", "2884742227897431040"}, - {"evmos16mq7xv5074xk2w6hyghuap7l7rdajd7lknyjuf", "45927323867311513600"}, - {"evmos16mr4appqqekfldrh0ec4y3yh5feknadv9y94zx", "1264855907655415808"}, - {"evmos16mrkzs8jh724c4d050yl4r7w4q4g0uqp4tapn8", "475117623724534272"}, - {"evmos16muk5fymetknd4cy4um50cs4k90evsv0ftmueq", "1196814284927135744"}, - {"evmos16mvtfmwxsfqwus5cdhnfgwdlr9mlkh8420e9gz", "13270321003100760064"}, - {"evmos16mzcnf045lyhmqrxalch00952kna9cf0tq3pc5", "1941415048374961664"}, - {"evmos16mzp3q92tkd4exdcmjfgdekmtmzlgx4a73mvuv", "6215539570233016320"}, - {"evmos16n5265hxqflvp35p9hghtu0v7xt0kcdvasqufg", "516516037214674944"}, - {"evmos16n6syd9cfnyufn8gvag4h5uep6rrwjhhdmphh0", "354378617359244288"}, - {"evmos16n9d96xe6ee5lvj84vmnd90lj2qg058nqv73d6", "2019392199233135104"}, - {"evmos16n9rlcuu79mpmj9266t9n7ekrxuaw2w3l37ygf", "780203103009343744"}, - {"evmos16ndjhw20xx3w0hmf3d53xnl6579prg6r03w047", "511984844831191040"}, - {"evmos16neg4x8370694nlugt02w72xw5t2n3yx2ymrgw", "1281305987410759168"}, - {"evmos16nf4pc88wvrxpekd75edvy7dlem46egnrss3y2", "1346074193137631232"}, - {"evmos16nfvj4fm264ta7xrcdg6arsjkexstawteu3xe6", "402031504333810176"}, - {"evmos16nfzd2mgnghp9z6tv9ske5j6uhz8fhs80nqtkt", "839236243652395008"}, - {"evmos16njyj7w8sgyy397evuzwsffauuptc89x4ex9uw", "1934123503898083328"}, - {"evmos16nr0zz20gdms2z2t56rz74x77jalr8txkemlp7", "1354199371678126080"}, - {"evmos16nsxy6mwevx2lj8z8jfrphy0x4d9zpc8xlx7g3", "34242865412025761792"}, - {"evmos16nt0wkru08kaj2x03xlh4gheswqtau4ac6uujk", "11520127644288360448"}, - {"evmos16nukfqvjaq7gf5yl8qzqjmxl5zudyqy7t7gn32", "7145473114131939328"}, - {"evmos16nxa0h8chnqrslan96kkujwv587z0qxecwp4eg", "368917456580025088"}, - {"evmos16p0zuvm4redqxd4ac55hs70lw5tsp3trxqr7pq", "85025188276555264"}, - {"evmos16p4hn3xsx327z23hl2xguluhwnrvl9sqsnncfy", "460923700911316736"}, - {"evmos16p4phgvkfqqddy9pna05cc8kh4a02mu7s87v2p", "2996600338137874944"}, - {"evmos16p5tfyl53yldpsz9vzut0gs62fvhqdmu6lqnrr", "3096239021768607744"}, - {"evmos16p8ex7ujw35a8lnk3pvvwgup85l7jae0esvm2k", "6079673898298861568"}, - {"evmos16p9lrjqq7knlkwqdu6r36rww5ssa2lryjvtu7w", "1534017939021685760"}, - {"evmos16pcymypllv6j5md24jhffmjtg4eklx584dx92w", "1309614131147026688"}, - {"evmos16pdlf8r5gchswvpcx6hpcdeym9lm88kfyteekx", "482367021893320704"}, - {"evmos16phthjsgqqf8ncmus03zdjmcacfrz4vp9e0xta", "902934234140108288"}, - {"evmos16pp688sazk8q6skq5vlvadrgg8vl4duwvzah82", "4030967295248830464"}, - {"evmos16psuncs9zypj7mx2nt0wf6v59fu0pp4gvxusew", "1436838660361418240"}, - {"evmos16ptvnt5urd48fevyswt0xyrf5egfnz99d8lxwy", "9901805878036502528"}, - {"evmos16puu4v2zlnr506n5d4jpq5nhvs4a7cn3vdlxkp", "989565255861674368"}, - {"evmos16pzr84dxpt0kgyx9kjj5v43vrrnfezp83p4qp6", "4117472578698565120"}, - {"evmos16q0ktq994y30mtptglael5jgvc8qf3fmnk3aue", "505200319668821248"}, - {"evmos16q2j85ktvfvkdxej7yg20rslvf48ag9y62x7ls", "369538316603585792"}, - {"evmos16q2ysdaa0umwgpwplcqd9z6ajvgme3zu3rut4s", "2095685200554784768"}, - {"evmos16q3v3v2hdp02hs49swwzchp4ul77mqykqehqen", "644399216942280704"}, - {"evmos16q46u3lajve9l5xv84nqku7cly7y6767h29673", "7582909094981289984"}, - {"evmos16q5t4w7uzk2f4234tplet70fd375jstache4a5", "22399616967153422336"}, - {"evmos16q6s4adekp9xqlu6eusye0mp7drkexs209nzdh", "3516931177390382080"}, - {"evmos16q88sww908h0ms3gt34l5rwu0ptpf3p5sp508a", "83688566446141952"}, - {"evmos16q94fnf07nntyegrrgzwf9gy6tqrvxcgru4dul", "2821484930089000960"}, - {"evmos16qg0c3k3fywt7luahk6ftyexms4fdxmrkavp2r", "22963961811074363392"}, - {"evmos16qg4law8fcvqp2gmwn3prczl9zl2l2sdnmw6yf", "700274704826509824"}, - {"evmos16qgquu6xf2f9np4x0xl62x03ucws7sxrnmsuff", "235184941502982912"}, - {"evmos16qjrag8r8hpvtr79qx5peahtyd9zsnzvfphqvt", "5509259560801857536"}, - {"evmos16qjsaxua6ljs9dl5w2rj43r2hp877x0h22nk0p", "315108702584902912"}, - {"evmos16qk3we2ym7dw5w0uradr0n60xs4xr5e3a2pmvl", "189142959742009856"}, - {"evmos16qk57djdt2avv2qu0ws3w4ndfy0kdk2k8twcd4", "1510015917904561408"}, - {"evmos16qkqksqarpj7s77yxeds5f3p6lvt0q6gpprg6q", "245276260759584768"}, - {"evmos16qks4c5w2xuf64u9ga55guptq9xg2qg0jzg55a", "128870168440039936"}, - {"evmos16qr7cdvw3esryhga37jqvhdkr5qzempg775nes", "286005969989681152"}, - {"evmos16qrlgyvyzl78eege6xwmlhy63y8tdlaarvxk8h", "1365998866123530240"}, - {"evmos16qrsgj52w77c4u36xf39sjm8aex48eamymv3wg", "898294329773611008"}, - {"evmos16qwqut4454q9n3ex3vg9y5wzn2xnjh5um375xm", "1808114250760135680"}, - {"evmos16qx354rqvjqft59x25khfnfpeffjmn9jca5hxz", "3787682385204877312"}, - {"evmos16qyz75eu2yexmq6nvtgd274d2y57cwact2k303", "343839762862756864"}, - {"evmos16qzggmmkwenjg984pvumelfec2pusuxve9hcs9", "874209039826200576"}, - {"evmos16r0ujvk9lvge2aepluams69kwee7xn3zvm0zrq", "46594470154485504"}, - {"evmos16r0vm6w4vtr772px4kklzf55n2sxghp6ykph9d", "4309874544400052224"}, - {"evmos16r2ll0uvqn39mr6ew79jnw8v3e6t07lu93ujl7", "2677089024274587648"}, - {"evmos16r3m5e5zmg6uk0x89pq3rt6az63anp7xmzvsma", "1433593482836905984"}, - {"evmos16r453yu9zrlrdnehgufl5rlg8jc0rtm8rm5szt", "4873140683827009536"}, - {"evmos16r52la2xd7h4vsyghr7s22zqp5hhgsu3gc37m2", "2697765149043361792"}, - {"evmos16r7flrlnm4q03ggvsnvn9av5sac3pgwguqza4h", "5923194785803730944"}, - {"evmos16r7ru29pgsmv6ec8hlqw9rsvt0ea0q9tpslctn", "8563857202261768192"}, - {"evmos16rcd8frr9rc98h454ydue7j54cga39hr0d2fcm", "2908842747989904896"}, - {"evmos16rd6z2ptluqrxzxslhkestgyxn8x9n4mqxvj4q", "16271729616867680256"}, - {"evmos16rdkzl8gjtdld59are2e47wsdfsrqepteptak5", "336136015686301696"}, - {"evmos16rfcjkrd45s7fv7kwnw7jmvt4yf0avmd40grev", "188810322905157632"}, - {"evmos16rljp095skvwkg2j6u3k30v8nmfvvpw74xvlu5", "3114978453794091008"}, - {"evmos16rnhv6rdh0sc8m5j97w9sl8vnnt7ltwwuwkdke", "8924512555203182592"}, - {"evmos16rpayh4neej4js87h4ygt0nvysk97v43kwg03z", "1047387159574202880"}, - {"evmos16rpv5sguq22llzfpptduuj76a828prvg0jyaet", "7708134440348221440"}, - {"evmos16rpvhkr03qajgcs67rt8dd7gpy34sd6p9y3ygd", "2359563610477699584"}, - {"evmos16rsg5us2rc395ssktja4qjflku8nraajurtqt4", "1809177253841188864"}, - {"evmos16rsnmxsxmczgeyxjanamzy4v2krvm55qwjf484", "2121545734895263744"}, - {"evmos16ru98v7fccsuvj6m3ssxwvtm9t7qprgr8c24pq", "11152456393964269568"}, - {"evmos16rv2jjurrxrkv8mfzc0h3tf24ps0n95h3zrc76", "14683505082315016192"}, - {"evmos16rvg8jn43avykkr0jdva2cslpayzn40es4extm", "30846936216716574720"}, - {"evmos16rw5p2j3g7dcxguplwzq8k3ghe6n6nat044fw2", "19180207258423844864"}, - {"evmos16rx87pvcjj6vh3dnxd2fq8wph2z2l325jkdl24", "2525794787045626880"}, - {"evmos16rxrdhgc7vc5neeahukvh7f3lhsvy0hm9wxzez", "384426602445879296"}, - {"evmos16rzx0zguchxl7m0syj4dymnn48kwre32jp9tyx", "7883408879512184832"}, - {"evmos16s25w0nk456l85gmauufca93jmk2h2hv98n8l6", "13932334356388802560"}, - {"evmos16s28e9klr759u8geh076cyc026uqyrrdcrx8s8", "5403366100786388992"}, - {"evmos16s3wsr5zzxt5kmz9nlrawkx3ldtydr63gnmckd", "11833979336513421312"}, - {"evmos16s4kxjf7p3atrpu6m0qnf69q064fn8f7cc960a", "42323345261582483456"}, - {"evmos16s5q6rqp30g9xzrgk5w9ezc9cru9sj2v8rzume", "4764046695537600512"}, - {"evmos16s8tv9vhw5983gqf7pzvapkqtxcu4jxkha8unv", "4281437931535779840"}, - {"evmos16s94n689w54l98w4tjuhk5a54v6uxswdhesmxf", "144605025587074416640"}, - {"evmos16sc2u7mvht22nqpd0z06qs82v9kv3ws7xer06u", "3892257666453644288"}, - {"evmos16sdxuayksx38mwuzzuym9p7g9w99m08l2mycz2", "5373227548801884160"}, - {"evmos16sefks3yu4wp7f9nm33jj8r6wf6hnal9xnaamr", "1598950042450232320"}, - {"evmos16sfrg440p0n0hsd5vzlc2jet44rh2dzy5rtatf", "789585449793662976"}, - {"evmos16sg7qv6d8v4mljh2t23u9q08lx4p38ugcsta0e", "2189109823994716160"}, - {"evmos16sgt3vdxzx8w3pjrfv3aerh77us8k6z9g54zrw", "32747794822513786880"}, - {"evmos16sjjm0u5paagrg4z72cvf7usf8evzctkckwhku", "3816358693044978176"}, - {"evmos16sk6r62xqzj09tkzp45qn3de9l0q045el2r26p", "283907894816476160"}, - {"evmos16ss6tkl5tmkzwtvvehuxjpcl4r3wjeylduxmry", "11700986005940334592"}, - {"evmos16ss8dg3p8xl79zy8ea48qtc7y99cugmx5azzlc", "5478734340194052096"}, - {"evmos16stjzqrr7dswdfkr37jaxnjdk8dqnewupjhhf0", "14017190278559985664"}, - {"evmos16su0766z9f4hl4ahh26nxj78nd6p8q5twf0ej5", "883083099235507200"}, - {"evmos16sv6efkx8z5dxu3mzxjsvg0rjzpqdsul07a86j", "11521766123629152256"}, - {"evmos16svrq6szmg5u5q5xt0d8anwdazcpq69l90ehu0", "58564659679720275968"}, - {"evmos16sxu7eughjxcfq6lvef3yspfht0pe2y59dl6ys", "17331644291825664"}, - {"evmos16szrnuhj3r0slavqen0p3uzjsstrnmgu84nc2p", "475135589022005504"}, - {"evmos16t05ct4sq86aj5w8jfvejrgyfj4kah8cz5d6u4", "877252039431468032"}, - {"evmos16t075v4ksnnm4hnkqescj5ls45qafc9a5jdr4z", "1904371268613145088"}, - {"evmos16t2gc30a79aswg9yay4x32pjeeqcagcspnzmtw", "1319376233447438848"}, - {"evmos16t2yejcmph0z5cn8yr49ffq3289q40ts244n40", "429285251628001024"}, - {"evmos16t3l6qj8s48cu87yrpfuedevt7u2fl37h95raj", "15105731697744056320"}, - {"evmos16t54x502h749c4g97rt2vtvesj7vnzjjhv80kl", "2427889855355510784"}, - {"evmos16t55kxr8dysusjaa2yhzf2m6nwd049gkmyqqae", "3746700539814840320"}, - {"evmos16t5rddmaa5rt52hwu4mh29qv39hn07m4efjyj2", "907644105672559104"}, - {"evmos16t5zl74ceydd0t5fujhmy0sgeasce23flv7a48", "3219050353146230784"}, - {"evmos16t6rz40kfugrf5kl9cm9lhdl28ck804ver350r", "2067298679829749760"}, - {"evmos16tcfp8fmnz4ed4qt9svepnaqy7qpajs5vw0lke", "98955980048385280"}, - {"evmos16tgttvx85szej7ncaqp56xahvdfvgcjqc82gzw", "997401441072005120"}, - {"evmos16tjqxn63vlnjjeavgj4u34h8qqre0pewkd8zgc", "3266001555740563968"}, - {"evmos16tjyus94lwtq4zn5m4ae66mlzjuqtdgdcdufjf", "2847041551292006912"}, - {"evmos16tk3s7yp79gcyggpaadfuq0tun2rgsefgc6t7h", "474310852154660352"}, - {"evmos16tm89n6gh3mnl84tah2cfl2xs63r5v36f2yjnn", "4709950379749456896"}, - {"evmos16tut24q3yzrtvzgszsg92jqq054fju5k3u3kmm", "31920083277741121536"}, - {"evmos16twjlj7ey2qz6myg7937526w7ptfegtq4chjdf", "463524210299170304"}, - {"evmos16u49cvk5z3uqzqyent5mlemkcklq4lkueu9wan", "138442071347607808"}, - {"evmos16u85ku7p83qjc8szwq3rq7h0yrhvjktfumd0jp", "2081266553620714496"}, - {"evmos16u9r3qlshpgujr85vcspsqrvax49p7az2c9yyj", "1757525169173510144"}, - {"evmos16udsk7wecg74nfynpaddm0sum920d3mkmnkype", "3257962937433854464"}, - {"evmos16upzrq09w3el0e7nyskpffpv6p9t7nmapehz08", "813479319966309632"}, - {"evmos16us0t5nn0vrh7as9ww8266shaemtmln8k3ljgv", "1434611591897487360"}, - {"evmos16usl7qsu04xtx2nt7hn5lfazzw9f63ccy5kchz", "4949915878791323648"}, - {"evmos16utf20a4dcstj0hdrxkd0qgaz7962v7qxzpg5u", "9779864360829982720"}, - {"evmos16uunhnfanzy7vltzlw8fr3fdfyp4lydjveyk90", "1491187076629618688"}, - {"evmos16uuwp46wry9jp40d5mc0y0m9cmvjt0eyde7a72", "3145316224051806208"}, - {"evmos16uwfsvw4hsg6fqts6r9l6hu2tcu7j8kav2re9n", "403964763147743232"}, - {"evmos16uwq6lnqh3pvql6dfjptrxqlg8xhvgu45smeqv", "977407326767546368"}, - {"evmos16uxrrg6sd4pj6wqutgtfqas27c7hqynn3htf9a", "886660525198336"}, - {"evmos16uyw202c44f5x6sswkcmvg7lmt9wzdl6nr4cuj", "4457223678970986496"}, - {"evmos16v0gl4wwthk7a30zyj3v9vsnunc765a7h7g2zz", "17023678158542491648"}, - {"evmos16v0khjk4nel56mcqhnyu0p5cr4a3p2lmegs5tt", "1203792854171046656"}, - {"evmos16v36h4w7jjsu8ssdra74evn44ldqd2jeztmw3w", "8412775983829123072"}, - {"evmos16v37rk474npg8lt43823rhcqy6r3uhx03h0ejf", "97989950319960320"}, - {"evmos16v449ud994z2lmur3l3v9ke66vtzda8lwtft43", "5710947973503281152"}, - {"evmos16v53q8zrte5lrxmmjyjpvj0prul4h030y0kgjp", "7685479454263947264"}, - {"evmos16v7f2rjxprp06zqmewz3k2z8gv83qyzzm3gkht", "8106837149665167360"}, - {"evmos16vfg6aqhf6mtg9c6hhxt5ufk9dvme26d4j974e", "2003303740697922560"}, - {"evmos16vl3htd3cjqmwst938myhsxvlkwpgg32ufme94", "1182671558814471680"}, - {"evmos16vvd4lw0yyv7mq2aad7rs6hc8y4dg7d65h5297", "1035541021718535680"}, - {"evmos16vy8fxxagyt87c778d886mrmcxpe2qvunstdhj", "415756939931541248"}, - {"evmos16vynm2x3ur0cp42zrcngkwwktdlncmt2v46rq2", "2272174817181237248"}, - {"evmos16vzq8vf07g6rfta8qqwye93wz5486d0zhcu89y", "5986312199410225152"}, - {"evmos16w0vq4tty7l239r33jvpgu9p2ujz0pv94xj8pg", "15445703852092669952"}, - {"evmos16w378fv7awpjnm0avp9ax2lvrq5fvehh6qghn6", "1741932058053797888"}, - {"evmos16w38czce55s9hpt2mnl4gujnr835x298pyr2r6", "22170033480342360064"}, - {"evmos16w5zjdkq724t9zt28ea8wf8flur9cnynfg3rjj", "5456345395283197952"}, - {"evmos16w662gxdk29px2qyvg8szc3j5k405hu8vvz6m2", "2026180311350040832"}, - {"evmos16wannxsr8ee9h3ym9gjrv8f58s9sstk4dl5w56", "16244699598094848"}, - {"evmos16wdkuenknj37c2sysgq95vvxetyvwcv3qrdyxf", "733508334868123136"}, - {"evmos16wgw49dagp9pfz364amgxvk3ggc0nex0y2fvx3", "3544873499364480512"}, - {"evmos16wl480vvnth26f5j56nyn2s7kwfamy83g5kmqm", "6962875254010458112"}, - {"evmos16wl4eq0lg05wthhskdl9aq7vpt35c2cf6r907f", "9710603270804176896"}, - {"evmos16wlmu7l3esqrx6hp7am8v00hahmeccts3dtvdl", "3093205499626182656"}, - {"evmos16wm2dejjen8eyee0nlkdz67ynl4hfaacjkrk42", "474857801513832704"}, - {"evmos16wmq3ht0zz5y7hj2rn4tnr0yfes7ruy404y0az", "3731870159906779136"}, - {"evmos16wqjq3lqnkp0fqe2tqh469ch93hzpygpmey45k", "475401092239321344"}, - {"evmos16wr2t37ga7s8366uvscu9thk5z663lngdg4cvm", "152527855506305024"}, - {"evmos16wrnv5vfk3vcn962p7m8jdnszcn9ngux92g8pm", "12489237208337235968"}, - {"evmos16wttfvcen9djyfln403uzu934lapdh0rlharu0", "958145675284570112"}, - {"evmos16wurrxvp9cueyjyvppmpwdn7g4szxpve3tusml", "6154156737002920960"}, - {"evmos16wy7tfg3ve62jyy9k9w6tcrk7yq0590z27cmje", "3984715302463953920"}, - {"evmos16wyxutdvf9cxqk42f9d2u669p3sajeaxkyuy7a", "32507910796658655232"}, - {"evmos16wzm7zmv2fen0jtf5slxgal4x3unqfzd7na98f", "144381791231177216"}, - {"evmos16x32dalglupaudrckkjdrngdam29m005kppve0", "74575115395606528"}, - {"evmos16x5x8kjv2j8mt0mfz55juc6mtrhn3dmmgfx0ha", "1412938773108006912"}, - {"evmos16x6g23c5al6e86duqkh3csd5zqfmkhkvfwc47g", "26649757716714479616"}, - {"evmos16x7apezufgekt76u664z9pfm2d6883636mxy5e", "1761084633022263040"}, - {"evmos16x7yzvdlazg6gtp82mn2srg99cjmhmlvhae2u9", "6876812725013872640"}, - {"evmos16xa4u0mmvgdycugdl99mkz03qjq39s0fhnvq7v", "1499045359742828544"}, - {"evmos16xe5vfk9tn3dmsrv6857qtk45h39g8wzt4q77w", "57039885823077120"}, - {"evmos16xep6ep23atsq5ug0pfu859fcy6dtavxcw5s6x", "2755522985390485504"}, - {"evmos16xfz6p65fpsd4325g98v5aqvva5ua34eg892cu", "4842218777392251904"}, - {"evmos16xher4gjp8r33upqcu2xs0fu3zltjj4tgdt4q8", "4411153347405205504"}, - {"evmos16xm2ehrj74ur2dh07s3ekwpsr5rvvp7aug3wvn", "99328685983965233152"}, - {"evmos16xqc4qx6e986rkcjfwd35xahrhpq7g5dm8e9fr", "3692493891230994432"}, - {"evmos16xr3s7u0g6jujq773wwdfckrsff4jc5wzrfznf", "425702204742139904"}, - {"evmos16xvccykv5tm96c78dcz4saa8k0hsd482gsl4wm", "1501024783979307776"}, - {"evmos16y2kerfsdd66gruk6rj36ganna2h92utvxw5a6", "20060027767601922048"}, - {"evmos16y534jq4khr748z0e2ra38gwgyea5hlqc44e4w", "24424647356226043904"}, - {"evmos16y55hg32yyhm5nfp5yt4lp57xnv2mmvgscsfnf", "1292390518030047232"}, - {"evmos16y67hvu0dftleerq7r2jtc69wda4kucmgklxud", "286332848484475904"}, - {"evmos16y6y58j9antmclt6ctw9wd0zcrly29e5datqgv", "387942550749320960"}, - {"evmos16y9awa9csfgr3ughj8yrd5jse7uxpw8g0lsv79", "3666920818698663936"}, - {"evmos16yduta7fv4shtz02pdgn66rrn9ggwrqlw5agha", "3555265066554753536"}, - {"evmos16ye2d6edsp2tc6fdy0zxn73gqfy9knywvta2fu", "848159145675882496"}, - {"evmos16yeewwpapdj4x86tra29ugxt5x8sv0hrecrvzw", "47805877646044545024"}, - {"evmos16yexywvype2tkzr2esznrwsc5uvf6h4334n4fe", "27206029367779721216"}, - {"evmos16yfhdcnhyyd5x0ss7kjg24xmdzqs935hddp3mt", "71324544144178176"}, - {"evmos16yglnvlw2sv8k87yt9pnkavls2cuv6nqvfjaw7", "6884616448101449728"}, - {"evmos16ygyyxn58gv6dhhzx0pjg97q3xexsncuj9mrqh", "1259970963070295552"}, - {"evmos16yjnrtrf0jec84jkg2dwuk2n2geqx2m9k5ljhp", "475365182052329216"}, - {"evmos16ylgfyf5gfwdae7agmjef3nk69j8p7ph5ua43u", "960363078702369792"}, - {"evmos16yq25cskh96gsprmah2mlhhnna5eu8nhueq9eq", "33302124077893722112"}, - {"evmos16ysjkjqf35fddewumetuxsurmtfy5nwu5v9h0f", "13740713898234466304"}, - {"evmos16yvagffh89c7thjx0lnkjky9kmzek4hvc8qqem", "1546692041949069312"}, - {"evmos16yx529ltr0kklfrv6tzx2c5vp66wu7ad7msgdv", "9449600831130624"}, - {"evmos16yxjz8anl7kuh5ysjn43jqgfmlg82yfl392l8n", "8261153608096954368"}, - {"evmos16yzgwrvujvatctrtm56klq3p4thr86uegf23j5", "3420488644633005056"}, - {"evmos16z0k9a9zrunh7w48ufx5rs0su34r07gw0xueef", "1266461212764286976"}, - {"evmos16z4gqnw7gv2a5tkjgn49lvlpwe74qz9u9wxn7n", "43973843877092204544"}, - {"evmos16z4zudjqrd6e5xd8ta0w2fqyxeuhwg3ht4hyyp", "411073520563858688"}, - {"evmos16z8fhnsgqxnh3dqz7csx5p823urgyp50y5yryt", "14332814706322972672"}, - {"evmos16z8ykkhd86k4wnmz7up4rfm3awvkg3cr05jgs7", "2909296929057688064"}, - {"evmos16zac6lxd6zfedm78r5wrzdv9kd7lnwy87yrln6", "384318388316961280"}, - {"evmos16zexz2nwuvg3z9958vjnytr0pz39r5udp65u78", "384314424118280448"}, - {"evmos16zgefu899e07vpf3xnlfq7p66pc3lltfqqd2fk", "712081301847953408"}, - {"evmos16zhqavx0rnea2k2afsazuln63lplw3q8t0ua28", "52112298749035520"}, - {"evmos16zkv5xdwf5xvqe055zkzvgaz5j3vtc7gl94e2d", "1431869234924228608"}, - {"evmos16zmgqr24gy4d8kzy4w4u7cxmqs0vd7wwz6xkll", "971710258412209152"}, - {"evmos16znwjw6a8pvxpmlngc04ndg9ckgrl84twf55nl", "1010931587391186176"}, - {"evmos16zpx3j7uadvyv6u4x8tatzs9jcykkazcqu6pwh", "3849192140929073152"}, - {"evmos16zrnfhnucnew36k47jeqkyhyydr3ssg0scsf05", "3903906197624881152"}, - {"evmos16ztxvmfg9nwdrhe5an26pkk8vanl9za84crmef", "1970595112008939008"}, - {"evmos16zty93ktca2ukxtdndcnzv4veq4wf7e8y0j8ag", "846019832847572992"}, - {"evmos16zurkhzzuxa8z863w67w0uv4kwyyck2tr3m672", "86890024965996445696"}, - {"evmos16zvsexjvpq7vxeq0my0qzdhxej3susxd08wmzr", "96486420562883840"}, - {"evmos16zyjm23fz5pcglzelys57rwunvwyj7yezpz35f", "410304621098840576"}, - {"evmos1702v2tsfc802s39209aklkj4s8ametfg7lg950", "8045747962647558144"}, - {"evmos1704n563c3l8leplv9ja44ljs4atmf4xy7sgdzz", "73477342123715084288"}, - {"evmos1705mtt5lgztwmc8kl2fpglg37hf20lflxsvwxa", "727414294784012288"}, - {"evmos1706cwrzf03fal26vef2jv02vg3hp6cglfgr73h", "6375591800848833536"}, - {"evmos1706junqm85t75mcpffpzpvpre8pld5ssdet27z", "1206912182471208192"}, - {"evmos1708t7vpanc673kvpusxvy2yk57rnz3a5n60tek", "191083511986853376"}, - {"evmos170ah0y3pg43rl5k6tgj9wfgkwz4vjlazzqfwtw", "61602013476397924352"}, - {"evmos170am9s98z9ffa7dcrlje5hh4hrc7p6e8g537lg", "9559880114005065728"}, - {"evmos170dganlg7975lx4au88ay4pej0c538dymp757p", "889767504276824320"}, - {"evmos170dlj80jr3u4zs9f34yqaxkme09c5p6uwvcrcq", "1429419764198801408"}, - {"evmos170dr6usya2ew5xkjgrqgzpswq6dl2nhutvq5cd", "1042355947466735616"}, - {"evmos170ew0zra3jgk86shpexcexr08khplkp60spnme", "1204930601600785408"}, - {"evmos170fd0yxaujyflugt3k8m6t08vv0wjanr2ay3we", "1530821929215074304"}, - {"evmos170g4r6g3f9gxcwm0j8xkduj4p54fke6cu3uheg", "1341183030097952768"}, - {"evmos170jzazqmpdcm02s9yyd3xqz3u7tway3tzftrzn", "5137965033737653248"}, - {"evmos170krnjela7r5y2txwdpmmasyngjl3s00wge9as", "15832168203559731200"}, - {"evmos170mnk02r2yg90mxnq0ejs2cmh7p5pu7x0jrpsg", "3191536572302991360"}, - {"evmos170myws3394xzw0szgllzskjvj7cslh7fyn389v", "1236182827435930112"}, - {"evmos170mza7nfj38z469vewxuc0vywrall5rpeexgr7", "828689146360425984"}, - {"evmos170n8v9glfefxc08qy9p8l0aevte8ru0n5cv9ku", "1890254761221275648"}, - {"evmos170rtaegjcy8ctpgr2c97kp5xy643ww82q8puh4", "42510222999747657728"}, - {"evmos170tgerzfc3khpa22wk9mdadpsd9pyqls56qgyj", "3275723405820313600"}, - {"evmos170vejkj9wyzse3l2fxpj98dgpk3g2cm9v9apcn", "984430089613873152"}, - {"evmos170yjwg69dvec2llxakpxhp8qysrkwju2705dgg", "8581746526472316928"}, - {"evmos1723ywvnxvw75th3t4v85sxyqk4d3geny26tkax", "3204287527714004992"}, - {"evmos17259addl93eg8tsa93rucz2fngth2gcwxwy5cm", "9049407099905929216"}, - {"evmos1725senz2kxq5vyqjjdgz0h4f60afl57yld00p2", "540469012708945408"}, - {"evmos1726gjcjhspj453lap82ehec28rjp0kc6nhsrhq", "4826127695784721408"}, - {"evmos1726lkh39vanddmt05ykkgaw9agt522465y38gx", "3788261546186719232"}, - {"evmos1728nwn4dj2l4gyaswpckh0vv2c4rqdj4v7kzms", "23953121565629628416"}, - {"evmos1729tspwkahhzgezr4sj78392fg44d3vxzzxa9h", "3149522244864152064"}, - {"evmos172cg93sumr0xxlvmadtqv002r882mymchenmsr", "99269761753057280"}, - {"evmos172csksvkra4u8qq709rd40j4wg2c5799cwmlyy", "24958560586079059968"}, - {"evmos172exuczsgkcdqzl8kezu0vx57lgftd2q6ckr9a", "1085443071318147072"}, - {"evmos172f49a07nztccn9r5jv559yg4r390r09tt32w0", "3668049494781802496"}, - {"evmos172fnu09jhvvmrupq5etxlgqjrp02l9permysfg", "3681402308570123264"}, - {"evmos172gprceky4p3puqcdm9engwjjgu7kxza7tcg2l", "76425667852073984"}, - {"evmos172gxgxgpf7dus7st4kzhvvr3dg3wsgdp7wcna8", "884503756435820544"}, - {"evmos172lhgnddzrn9ffgfpgw5ar7ct3qexvxsywh2yn", "407153294412339968"}, - {"evmos172n4jsvs6zn3napmk70epfz5zs5zuqnpnvrht4", "12874294685783248896"}, - {"evmos172qweeyqndzcee67nrqg3t3qtqjnkusqs8jnm5", "11883381815204331520"}, - {"evmos172rwde0299q00tv0ch6vf6dh97czjrj77s4d7e", "410870777836274688"}, - {"evmos172w5ymrr75nazaqtxlxkj2ln8fsxvwgnphres5", "770142763556785408"}, - {"evmos172yk59a3ew8rnnymwdknnmnt48fs5dz3kkcesq", "998265130936848896"}, - {"evmos172zggg3ydlleregnxk8543rm4whnnkaezlaueu", "5587034807229636608"}, - {"evmos1734s2wu9qx0gv530507rkcj5e8aurpj5rt3vdt", "4411835002509148160"}, - {"evmos17352jm0jtt6wfn8g8wytney4368mvzcf0hctc9", "1292415793310845440"}, - {"evmos17375td6pa3htgns22h79acfgh8hnwkhaqa2gnt", "168292279806179840"}, - {"evmos173adjnjchcsd2ax6j7l7cqhsc5el0utjdhxt62", "110952511940080386048"}, - {"evmos173aywxvcdst4h6dsvufct3eg6fh8ean79x3deg", "6532531153187098624"}, - {"evmos173fak5rl0tcnvgcdjwk5shumrdxdhu5epn0swp", "107204009117440"}, - {"evmos173fjws6v22xv57dzh0wkdqfgkrrgm4xxah07xy", "177263937203208192"}, - {"evmos173gc63km5pgvk6v3cf6w8n89y2mnxz4y0ghj0x", "4867251931879215104"}, - {"evmos173ggws272ewuc7ta25cp9j5spckzll5yxrnltt", "6378126154561105920"}, - {"evmos173lr36yzftm9jt49a0l68ccx3jdvsj005c2cm6", "860257785835311616"}, - {"evmos173nt2s5z9m4v2qrd2a873w3qxk236nupj407aj", "1551591588237120768"}, - {"evmos173nxzelzpg4fm6fwvpg4fmmexcme0yztsl80v3", "4443830633788833792"}, - {"evmos173q88lgnzqwl5vmc9mdky7ry0qfljxawdmsvpe", "4590714594712847360"}, - {"evmos173r3wujf2px2fsejly9xv88k8320ramk5tdkgq", "1408843893036651520"}, - {"evmos173rd4wmezwk8rlpn4a4233jm6dkzc7e0r3an3e", "5569589154824740864"}, - {"evmos173rng8yr6v2en5lcym06hjwwtcf6s5qc976a4q", "304924192697235712"}, - {"evmos173rwuwuwaj5vgd6c75kjxwqlgv09fegd9k6yzl", "2025315526791306240"}, - {"evmos173sm0ekvxskjjs3hnj44xvn8r49eamlw3gjrjg", "2734251715695175680"}, - {"evmos173srws2s52fehfr3wwm86my6x5epaz0uu4k5sq", "2060735337593101568"}, - {"evmos173vghzvr4uxlt693xdkdeeguc45kmyqeuja7z7", "1909187910841787392"}, - {"evmos173vr43wp9hekt2zslchela3ac7kt4l7t9dma3n", "12194233196679495680"}, - {"evmos173vr5t2wd3v6ge4844dgmv4a086m2pkyk7h0se", "384569760560724736"}, - {"evmos173xgk2cgjpcm5a9d7xkzxptcd3l8rjp8dgwvyr", "7427226037754261504"}, - {"evmos173xyf3gqqttr4wqc8dhnnyh93ypcrfa8cp0ynh", "2171794392304353280"}, - {"evmos173zpdtanpp88m9d2aaj6xt8xmf2rxfalfyu9s3", "3480209377420535808"}, - {"evmos1742jphppljhe9xudw2ugg0nfrznnzp3wj8qxmd", "4911686242085699584"}, - {"evmos17462yrsslsy7wfnv24zw4lqh7eqy3w58xmjyne", "1611874537268490752"}, - {"evmos1748vqdz4tlttmxcpv8gnuesgkav3krh9c4w5rt", "2010745525515905024"}, - {"evmos174cr4x2zk2p3hvaxweyu2p9mke55gm4k0yk9q6", "17198163564237066240"}, - {"evmos174de9d34hd697ed7n70gff2snyzjnz40j3qu3h", "676974349787509376"}, - {"evmos174gdsu29tndef7vyxsmq853hpj08xzful5w4wr", "4810966526628849664"}, - {"evmos174gxdtssm6kgzs4mm50hufkm2sx7jfxj0xh7dv", "2993528510121539072"}, - {"evmos174lgr34m45t56akhghj29tc60q4ql96uc0w8t0", "31482881840172670976"}, - {"evmos174ls4z4ep7lqwsrj487kgxqx5qy9gpldkd4n42", "862998979203017216"}, - {"evmos174p7vzu6e0c96myzyk838clwf2xcm4ces8mf9c", "5523710349401274368"}, - {"evmos174srda49mxuej8pqnh9un3qt9swdge2qp3rcks", "14342124716081266688"}, - {"evmos174uywk63l8mhkfppcvsafsx4xz2z54zge0p7r6", "5366509108245610496"}, - {"evmos174vrqx3cyjq8ntsqycjcna08284jasflqujys6", "26775487501128572928"}, - {"evmos174zr3lu5yugg9724v2q9a94g5r5m4mftvs7fnh", "797590263796973568"}, - {"evmos174zr9adlnrvuezqhlwwyqfeve0hk0gje5u6wn9", "193423592948564992"}, - {"evmos1750nthnwlh9cpr99fadvk35ja3jhkfqxthgnu6", "10714409654752448512"}, - {"evmos1750y740u7s2qm2qzekdzgcqw2cgkqcqa7m3nq7", "955205661049856"}, - {"evmos17524e7acl7d6v2k2fkkhefz9kjejh3kekavjgj", "32170224616819916800"}, - {"evmos1753lk2mqgw5p859wujaewfux0d506upfkuj9kq", "4786088423175852032"}, - {"evmos17574u7598v37nl5ryu0zxgflhz25jf6xp9qw5x", "343229426727576576"}, - {"evmos1757t09xyrd2vfyu70r962j2f4kseduy3gm6cul", "1196412564931460608"}, - {"evmos175a763lt8x35pw0qed3xufasxvk75hjjvy0een", "3530361544187445248"}, - {"evmos175c68s27jc8z5xpefu4hma8d3sldny3duy9n9f", "1682989794116840448"}, - {"evmos175csnw6xkd7sxzuv6ldmpxtj6pu92dj8es5gtl", "110812721515123376128"}, - {"evmos175d8zeyq4344rfv7d93930yprs0w3c0fldc3ge", "10976945434450397184"}, - {"evmos175d9zww0ldnfrrtt3273mvn89u08q8td2mpgvw", "1071151502874019840"}, - {"evmos175e020lkvzy7ldaw4697lqg3waqxvtpazztpey", "27525472253984206848"}, - {"evmos175jes25565ajwa5jyf2qmnaupecg0w3vujshx8", "58446134906830848"}, - {"evmos175nkntm84n3yu3xwf6hl2yl6r36zl70vsv6hgz", "436501643980536576"}, - {"evmos175rxcv53ea0cp75qq3hyrvvplug3edl8sdvlya", "1998414218733309440"}, - {"evmos175wnck9phxrkz2zrhzzhd5ftk7hte2kc4tlrxh", "2634856459152057856"}, - {"evmos175xqm3k3e5ljp0l3gspc2k0slvnm6c6fm0waty", "2293776579222993920"}, - {"evmos175y2r9ngzcpt7g0syy6u0j88u33pkdr7seyv0c", "7760751828991248384"}, - {"evmos175ya7u0z93kh7jkgk7xkk2et6gm620htclj2jv", "9932578881960310784"}, - {"evmos175yh9rxwf44e7g3pyhjax43mp53luc46dxe4e4", "806728777789399552"}, - {"evmos1760vmyc9yrn4j2s4n68v2lsp5zl5eyc5vyq8fm", "5146160951613440"}, - {"evmos1763f8srd7h49npt0x730c3taxcjcv423arxr2l", "1675132743652338944"}, - {"evmos176682j505f7vfynffvqf27j06j5wkj3wl7mvnm", "3513394859462492160"}, - {"evmos1766c652tzmklzvt36uqe9lt4k2aa07rmj4pved", "475305272847669248"}, - {"evmos17673lslc8gf48n22duxpppgyq9348k0uzep9wy", "6007710922659725312"}, - {"evmos1769zlvl6fwg0hf78wq8d33nkemy57dtn9pftgw", "4913497518559361024"}, - {"evmos176arng7r2nmu5kmtjtwnevur8ma92eysthsqa6", "2719249807772214784"}, - {"evmos176dr7ly5yqwddymnfage0mszn794d0wrur78xu", "8099067527582489600"}, - {"evmos176dtglkamcrxuqxsutxpz69x36l7ve90sfaxep", "1238283112304506880"}, - {"evmos176e95hwtz9l9ynyvwd26lyygv2rwnueak2mgdg", "3842972205780488192"}, - {"evmos176f6pt6cfkc6ss0kn2fhvglm4gm4hyhqe5sa3v", "3707096850015269888"}, - {"evmos176lafh8kfe59t4hynu7rqk5k95amlk5se39yg0", "8849968570245423104"}, - {"evmos176n2gp8m704h6g0y57r9rfwrw0csp9ax7r302u", "21324096215126245376"}, - {"evmos176nl7qmpft686t032kug5swj8kle9gynwusfx8", "12771299214544713728"}, - {"evmos176qe2ze2jzdgvqf6u84sc5z7yh5gh4hncef8xs", "1513957164388233216"}, - {"evmos176qexyd75ekcvk8d28e87y7vf3fdq5pue9jnsn", "759907615264438272"}, - {"evmos176qf5ggzxrw9rm99wx8pkscs522nqj39gmkt95", "153226337819978104832"}, - {"evmos176qhrvsatwumcwrh37fz0mm06adp72nyfzde9a", "17138498719967195136"}, - {"evmos176s3cmc6vvr3y2h6zxk26v755gp84u25acv72z", "378204515007841536"}, - {"evmos176t0wqh4f2ksmngdlaf9g7yr5sqnk0ny7gl3ms", "1670224531126005760"}, - {"evmos176u2f3rz4e9v4vnzhxr7xvsh4yk2zejyku377y", "1382580399279684608"}, - {"evmos176wpwhf0e00hej94ftdwffg3qqk3zrhkamq47p", "1673537696303153152"}, - {"evmos176xaqgxm28535w2uu590mc3lhgx5xs8dehpyz2", "6233488567973193728"}, - {"evmos176ydtft3a3uxgcfxwrh3jnwnmsdewmrgj9evhe", "4190347514392751104"}, - {"evmos1770q86zkrfcur3rzx2h8n8z6fye34t8vh7ldl0", "597131924468242432"}, - {"evmos17733uy6vs0ghwrkn9m4qc8kgsnkm2xdjg9qklu", "100130539575248384"}, - {"evmos1773gg0suqdmy73f73egm8548d3fytgktdjyqvp", "716172757556341760"}, - {"evmos1775pnh46p45ufu6k0jul4sztqhkr5egks6uslq", "15169614954367082496"}, - {"evmos1779enwfc8uphja57gqqsah0yjfp7sp6yxrtvk9", "13245840772586045440"}, - {"evmos177a9acn82uu0yjx6rftw0mr3cjvemcysmgduqr", "104282378667609344"}, - {"evmos177ak0kjnttwcapxdn53vy83levd6p92zqtq834", "5008122706133843968"}, - {"evmos177aqxzllj8edvkrk3x357225g6mlzndlalz2hl", "8903733918757228544"}, - {"evmos177cs6cpeqajc76gd556wnd7mcndt8ckkltf5dm", "6721490330326515712"}, - {"evmos177emjk4ktj8hh97994ftugyrqrqe299y2uqq55", "10513567522712428544"}, - {"evmos177fs5ng0q5ra2g4lg94s8h6ag9x6zuz9gvrqc4", "513453257988264960"}, - {"evmos177hfhuxjyemjurew5gwgaaxt8cfjnc52ft7d6p", "851471559494135808"}, - {"evmos177hqajlwvz3namex9tc39sjtrutkmzc5hffuq8", "12287508797220841472"}, - {"evmos177kzp9dww99pangme7ed2rxms56h4pxw2aczns", "10519426533050007552"}, - {"evmos177lp9lj4wwmmxyn459nqezw89ny8mhgxgh4yyz", "2378075195743412224"}, - {"evmos177lvvsw4dtff49jydhytn05xwulpyp4yenlnsj", "7658428920309514240"}, - {"evmos177m3pzt6jgnunxsg5hux47v0jxxzc4wesqdsfw", "1639313002970607616"}, - {"evmos177ncp2gj0v4q4w3nqxaeecv3c48xq98s8sqqzz", "8382327065510529024"}, - {"evmos177p2e88kmajqdj0thczkzvge9kapyjfcpcxwm2", "6457288081028976640"}, - {"evmos177qeckrvpqzgyyr2nayvxrddhtgthxjxv6peyd", "134276864389339660288"}, - {"evmos177tkt5ryhpny337qra2lnm94a3wn5l2tu06j7p", "45283915459131392"}, - {"evmos177v83tfnqz6c55qj2esjrwyu7z838j8ry88xp4", "35856961477683761152"}, - {"evmos178066d9vfd65y9ds09pcjs0xrkra3efyp6sz0h", "5596351458004004864"}, - {"evmos1782cswjhrj7ljt4g6akccn6lna50kf4apnych4", "2197033308887900160"}, - {"evmos1783nyzkxzstum37v7elw850nn0ygdmk7d27j9k", "2762013053211193344"}, - {"evmos1788esvql39j4968dlrtmee69fea32942z7zlnk", "228849355323520512"}, - {"evmos1789qs9t5n9hpwty083ed2l8um2td8gy2sfz5x5", "269259135028994048"}, - {"evmos178ars57t427mwym56j3u4x5vkmhk6lx3gpp4lk", "2377873832898735104"}, - {"evmos178e5zls3jnn6c68etc2nmc9wrrrzqjlcknfpd9", "1286441213476020224"}, - {"evmos178es2pn3442tcqsph0d8dg483q9xfg0qep0jtz", "2520442971103084544"}, - {"evmos178fe7vchy0cpzgd82zmyjlcj6y9rvnj83fchm6", "11735941953134426112"}, - {"evmos178kcqw7v0u53zz67rpuupjlrjuq7lzpc78zeaq", "4926593701684840448"}, - {"evmos178kdy4t03myczeqkdn7w4akd42r9sggw0kw0st", "1176799192928342784"}, - {"evmos178kxuda5ghmrrqxahunuvz4ky56wy0nf2sk59d", "80014022787236888576"}, - {"evmos178kyvcdpstupjjrnw8eva4htc5vy6dt88pfmrk", "502277544344576"}, - {"evmos178mzrjl3uechj2cx7dpmcg3y7yhsvm3temvqvq", "6761577906755954688"}, - {"evmos178nf6k82334ynf3c7sq0vmdmal4ta6a6ae4htm", "3995148053053462528"}, - {"evmos178pepthtfjctz3h2wraxwtfagl78f2jyn5ry0q", "7878048979480578048"}, - {"evmos178r0vj385vf54tzcpr5xycqhglvm6z7tntn7jv", "1807538281998135296"}, - {"evmos178sp8gpj76hxj6eyeyryuyhctqtdn6x7z7v65n", "17052936510874820608"}, - {"evmos178t98htaw5yf7v32dtj2s5fdal8m70jg3fef6s", "14659716085764855808"}, - {"evmos178tqlp5qa2p0s0v6lae6qka758kka6g27udqp6", "316692589451668480"}, - {"evmos178unsquvupgavl9n27hnwypdzl0hfzm8fhpn8k", "830209680933666816"}, - {"evmos178x5jnkhgvznqjreyan04s7la4s40yhrd3gmxs", "2413943980391571456"}, - {"evmos178xgp4aq0a9f7zlpxxkq8rzz3mp2yravsnmffc", "881609744623756544"}, - {"evmos178zgrcqhgrz4gxhmq02krsx3thvq6t7av3497g", "5020438655591631872"}, - {"evmos1792f2009rt8v4u8uzvvrm0zmyxgkjdfahqgvsm", "27566781904209920"}, - {"evmos1793y06hvw5tnyr9rzgtpjupvzxgrnm09yj0ap8", "2612406502720020480"}, - {"evmos1797vj3u4xq5gu49vz6lu5u8z3vlu93x0p3khly", "55131369018235174912"}, - {"evmos1799l6x9qt5zlwwgd44u3wrvvufxqxn3rfctccp", "1285863902694728704"}, - {"evmos179aq7v6dg035xdrnxkc06eehj4sha8ca3tdz7y", "23316767835995045888"}, - {"evmos179dul93zxkf7fnwerrqnwck7yr9k6unphnq6c9", "34168650612414832640"}, - {"evmos179e59xuz5jz6sq8z5ez9jtxtpevhqm8nn7jplz", "17945087517794304"}, - {"evmos179eeqcw9t3prf4cazk0vktslhynuekatjedk6f", "9585716343456002048"}, - {"evmos179f9sxuvkjrtyntn44g7yw3l60szyffcadzsdu", "28301507056140390400"}, - {"evmos179g34jm0k0znvlptmuej3lwtm7qfwkkjkhkux6", "1602212992787840000"}, - {"evmos179jvkswkatuaqpr95g2mj2au6xsp0ak3mj3luc", "1419798588514885632"}, - {"evmos179ka9jej0mv0kknkm6tc3hf0h69fn4pu78wz23", "2767613654685999104"}, - {"evmos179maeyyf8w0wszsn44qmrn9n8m0vuyhgmeqxtf", "14549056542410582016"}, - {"evmos179mj9la98gk900dpq69x3yxd4rtv4ugsn0248l", "2441210672966828032"}, - {"evmos179mlm4rps8rz0zc9xf2pkjx95f9supqgpmdnnl", "10491165722671063040"}, - {"evmos179nkkswvj9ypv8uhkaxd6w9dvfxgk7mdyj9c7s", "385664109764058368"}, - {"evmos179q4m44vdm8xc70fgxaf27d5w4f9larsav7pmm", "1027032462042918912"}, - {"evmos179rx9d4hahltueza0qa0aup6dnnpthlqwdu6gw", "15905894620334510080"}, - {"evmos179svgy8g6sanum2tu0g6df4kukdsys7mnle5sw", "279181525997288960"}, - {"evmos179upcwp4xmfyud00lgvl7ftk3g0fuxtaaeu78m", "12689846356674048"}, - {"evmos179v30c849yxj9rlee3fg4metd5mqswud6z3a8d", "408275893598862336"}, - {"evmos17a06k52xyhm806xfzd3aw82ugrjydmh35tcwf2", "1351243202670179840"}, - {"evmos17a37cnz0hwguk4vgxa30e4n5j0d3smwl6v2qzn", "15821687562338553856"}, - {"evmos17a469qr2tp2uu85c7mrh2chjz89ap8t2c5xjdw", "3401214169516033024"}, - {"evmos17a4sv0la4752x3m6ml9wlwn287hmuqf4fmxu3t", "1004689362087813120"}, - {"evmos17a5kxssv7aprhygxtmyelhl94p3xu4pqca9d3p", "2937619245076490240"}, - {"evmos17a5r5jkd5rnwk4nfpm2d9gmt5felm098tq5cl5", "1342797433091586048"}, - {"evmos17a7dc4xqdxqrmpvcynnvnzlx95e7n37zw5xyfy", "1425308531690020864"}, - {"evmos17a7unyn33zewpknwukqygc6vt2ewj4swxlvmx5", "43574145709621919744"}, - {"evmos17a8gqetg5xm78mrqfwllwxg6sw0efj6l557rxy", "7386164680977440768"}, - {"evmos17acc664mmnq79y5sgwslj6j0mcu8fw9wxndsqs", "2244877002009804800"}, - {"evmos17ajfvrkedj0sj08wgc8y3lz9ane3k3dpxf7fgt", "44730962375249152"}, - {"evmos17akze5wj6ypgzfw2vagp8c32wn23hfrgc34wde", "2560355320478818304"}, - {"evmos17al8weacv4yprye2c869y4ag8ut0du3qe4wkwd", "700919311680556032"}, - {"evmos17am8nxjv0ez4a7rr2gpgrjuqtlssr8ex5zwnsw", "1154194549345083392"}, - {"evmos17amlnq04uh6vd22magwcluqjcm3ua7ftuz3qd3", "2397630215826384896"}, - {"evmos17appkqlqhky84gwhhn7kz908eqvdnhmg6xlepc", "410372337578552832"}, - {"evmos17at3e2nc0zvutx4xt3yve7dpnfqwdj24jpn5k3", "21231840231868440576"}, - {"evmos17avxau2zdn9lf6qc7uu3kjtqazyc4wvqstadtf", "1145266895760633856"}, - {"evmos17c0qrek635cxlzkzsda69jt8rnnhknu8hwv02v", "1444771399072814080"}, - {"evmos17c4guskmkf5k238e9secss9dd720md8rrh0wr8", "3142891911552091136"}, - {"evmos17c6p2a3vam4a2kk75fwc3qakplzmep72jwm4rn", "519042383595381760"}, - {"evmos17c6qccvs7248vss2skt3w7dyyrjdnqagydjwzs", "299355583262121984"}, - {"evmos17castmtknv47pzwj6jmsgcp0rmku2qnl39g7z4", "775733154852765696"}, - {"evmos17cdj9yz7dtmyhtem2c9ar024kff84s99d9lga0", "862985675470180224"}, - {"evmos17cfmmmsja0utypxjr39t2aun7zk503s8fanmpr", "1371795071667092480"}, - {"evmos17cjqtcvghwtznmtz84st03cde38z40vpe7vrh6", "780936855293673472"}, - {"evmos17cqh7rxkgcq5dumhg9kny3vnyq82ljt688khrk", "5582574402566717440"}, - {"evmos17cqvz30ec7n4rpq7khtzad7w6dg3qrvpnf8yse", "16422810920022401024"}, - {"evmos17cqxm6htn6jam0gftfksscts5hgpwkqhqq58fe", "2209408187613970432"}, - {"evmos17cspda3j089y7w09y8zepl8q3rhqh2qezx79en", "331047454003840512"}, - {"evmos17cv2kqkh2ksjhz5h67axdr65rx4u3s8cr9aefe", "404192432219241728"}, - {"evmos17cxhyvdggjzk50tg6p7zy7fd0vt4mvjy8rtgs7", "4403100008029726720"}, - {"evmos17cxz6crrmtaw5txd6ndrsz66sddfdjewqa4gg9", "17337794872624566272"}, - {"evmos17cyhtqndr0gcctresr0tnuwxl5fe2p99cey6x0", "387085315589460480"}, - {"evmos17d2kvfsp9g8qwyn0gy695ltd4dtsc7naqgjave", "33545376142425600000"}, - {"evmos17d3qlgs57rgy56nrzf2v906j9z656nngp3dvpe", "445263603553448960"}, - {"evmos17d6cg86qmpvrrz0fs7kzsjca8t85yc6lwyda3h", "13264310183781953536"}, - {"evmos17dd09ufp9kumz2d3h668xzgfxcqrf42mellgyl", "1232161247867578368"}, - {"evmos17dgm6z5q6f3jk2s863pqqc4wu800zuvnaezaqt", "1398072850544112896"}, - {"evmos17dh3frt0m6kdd3m9lr6e6sr5zz0rz8cvxd7u5t", "753177985660609536"}, - {"evmos17djfjxhrphxmv2w8rlx4k7ecw9dg56htvud5yh", "5626171529135362048"}, - {"evmos17dkhns2h2vhnryjvjjz79rwxz3asp3g2vmdvyz", "386191955258465792"}, - {"evmos17dkhx8hqj0r2mmg4wup9fwhnderhrxhrhxcfg8", "39008470834388254720"}, - {"evmos17dkn3llz3f4ts93mj6vm3emwf098r6pphg2qm9", "87856232102369984512"}, - {"evmos17dlceecwmsvkjf69dn5kpzfs833eq7f2n4ww0q", "20630236633506545664"}, - {"evmos17dmuur4hy9nwzr2r0mu72xml85cdm9d0cwrdaw", "58633017303973376"}, - {"evmos17drar8jn9395zwxyk54n4nrnh5pggq2tc0zss2", "12009556802015592448"}, - {"evmos17dwf2f6kx5sjplpx479c2jdq9jfj9z50p07x64", "35799336572487680"}, - {"evmos17dyc5t62er5q7jjtuf90yluxh0rp580035az72", "9045893372422591488"}, - {"evmos17e4luvdafaj9zf3ly7g7aqdtk7hu2ljzvphkxd", "22359405201782333440"}, - {"evmos17e55tz2sqypreuw0nmek5ds6myyu4yekyy34nm", "1281482135013226752"}, - {"evmos17e5yt9uysh7az4vg399ytu8tqh4q5zq0y64ky9", "362778621101872128"}, - {"evmos17e6x79rja2fqamnm0yay6j97pl4xg7l73hw3vv", "308320301062374400"}, - {"evmos17e7c3es6xhs8ye7etj5f7g48h2kgak7rduuszh", "10215896093951037440"}, - {"evmos17e8zavyphv7vqnvj7e23p22t0ya743vhq04xyc", "13914345455106752512"}, - {"evmos17ece0twsvg900vs9wlnrs00x0gz8dldkvt4d2e", "424459378697727488"}, - {"evmos17ed82e7hkghpry603k8hnwx6ggur0yx488urzz", "3145922538579501056"}, - {"evmos17ehasm6ekesp49zqu4e8q32n2wtzjcqfugnwzy", "26148423342424326144"}, - {"evmos17ehh95fqxwvm2udjnf8cyzseyr3amfqjze4pxz", "19387498093465427968"}, - {"evmos17ej0u3pae8zacjkxf4dlmqef684t2qkz57zcs7", "8077491051345936384"}, - {"evmos17ej3t4ehrgqf7m55h5dv5pzxjmrkc9xmtk7w0v", "231405786537407232"}, - {"evmos17ejcrlyfvmpfwwwc2ggv4nzdn4q3kzryq3vur4", "371122465868783616"}, - {"evmos17epqfeffqgetfc6hl4u4n05rzv9hvsckwtzxy0", "3276632761045753856"}, - {"evmos17eqkhwm6m7jy5drzq3fr845dp533fh73ptn42q", "5592246939686318080"}, - {"evmos17eqrqrxrx8uhs4a0v80wfr26kfnf6wkmlmyp4t", "2761634938704738304"}, - {"evmos17erdd24efzad9z9uu6fy57uget9703d995erl4", "3505352796019769344"}, - {"evmos17erm5au5x4emx24p0wpq2fl6yn6x32v5qyskm4", "48878706606405812224"}, - {"evmos17erzqujlxet72ay0f8au9dyyykxm7dsvyfvpxy", "10984051245789456384"}, - {"evmos17esvfhwlxc82j06r9swnh5qqy3znfqplm3fpje", "2317176099565317632"}, - {"evmos17evcgxqzz0ttj7pt00l5827pp77rdmvwayvdc9", "96803084673933824"}, - {"evmos17evgzm49kz9hg3wyjphqxy352sreewp4kdu3yl", "20340141257521920"}, - {"evmos17ewahfsxu0x0t39u4l9qgcjdgzqjvnx3xw6556", "416509446684335872"}, - {"evmos17eyhkzsljl3a4ek95gx3p4l0qhxd3dve4yxp65", "1589703096537011191808"}, - {"evmos17ezv9qf98fden4yyrmx62yapfefp0nczp4vhwy", "245636521964625920"}, - {"evmos17f0ys4x9x8qpju8ea76npu9dgza73zpqy9mg3x", "45468140226451554304"}, - {"evmos17f2ddxr6kuk32309s57hqamxdndjfs5l3hz04d", "25272272135745536"}, - {"evmos17f35ecx7597y9z4guk3x4pt72488vgmguvvhq6", "96795215257861120"}, - {"evmos17f6lfy2vpy26exrtx0fsr83cfqe8ururqg2f32", "9793894987104653312"}, - {"evmos17f7l22l2a6kqfl66lrx0uaena5fk894lpcz2p7", "1216882409573312000"}, - {"evmos17f7wrv2ea7la93ygkl3j28txvss83eurdtplkp", "4392959409500554240"}, - {"evmos17f97r0759lwwnn9semw73rdmgad7jzdezh7a5l", "20150379257571921920"}, - {"evmos17faexjdfkxsq6slky7ch3e0sh5w8x67k4j786u", "3053112692050088448"}, - {"evmos17fafjnplnlfw4jvys2sqxe22hj679w0mh3hq9z", "44964381314076160"}, - {"evmos17fc8rs6j6xz9cyqasxq65n48p7xs66mgm3c2w8", "783270196503001088"}, - {"evmos17fcfwrmk9eafm98km6tqsr6e4nml3px2gh62rv", "13141484054256746496"}, - {"evmos17fcy36wwjwe755pznnzjml68m8qenu3at7cjqa", "6969219113090607104"}, - {"evmos17ffj2w382fxagz6l033k4h9vndw7n52gnxm9wu", "1403389912063070208"}, - {"evmos17fhp6rteswmndeds4qt3w2hvvf8s3upgk485pq", "513118689938885632"}, - {"evmos17fjy7gvn2yphz6e9c33srp8s2a6yjxjaznxa7x", "62140098583256236032"}, - {"evmos17fkxzccwkqdl7gkuczqgemz57rcwt6224qqpan", "17418913595958771712"}, - {"evmos17fmpt56smpqj9w9k7up4m9n70wu4s0qtajl36l", "7610367850688069632"}, - {"evmos17fn0sexd68wx6h8llysaj8zk9l9787u7srdf8l", "856034600508277760"}, - {"evmos17fnsa0wn96kccsduvf7th90na8z2dqunccheaq", "642318560868757504"}, - {"evmos17fnx4p6vhyknuzrwctvtl6ff3dd0w8yxdgmfmp", "374728155728527360"}, - {"evmos17fq6g68ruhvtf6un98x495uhgr8zynewxgq8tl", "506535957354680320"}, - {"evmos17ftj9d3fplf7anm4d0x5599arjlh2l7yask9mq", "1221458244864817152"}, - {"evmos17fusczrks7p5jqpxaq2x3tz9h954vf8dxmkyr8", "287527968851291136"}, - {"evmos17fv5vwv00kmm6yq2s7ws895vrpwxkyxz6x53p3", "7297911207895465984"}, - {"evmos17fw5kw4ts40h3urs65k8wm0jn2f8tt4lkdhuwg", "614269471348327424"}, - {"evmos17fw66e80vl0ja8c3p40j4hgrc2t6gn9a6sd7n7", "384318388316961280"}, - {"evmos17fwp8s896zkhnvpg6cxr0n7fmnng9yzw5qxsqv", "365808525838626816"}, - {"evmos17g25wu3tck4sl7pnmph9hzk23vfdlnmgayg5y9", "5774103882058763264"}, - {"evmos17g38m940zt875eyae98gyq7tfgxwuykmpym5pc", "2041721839260852224"}, - {"evmos17g3zr9f98l4szakhmd342sldt37myn50wz3h3m", "301242231575889408"}, - {"evmos17g4x2q4xpvr43fwh6upfjr5gpph2znymlmtpz7", "7707909944048832512"}, - {"evmos17g5fl0dxgvy8dtksa4994dztnn5gc6mec26lze", "843977637484806144"}, - {"evmos17g6papuw6x04ev82myj83l6wx9vvcu3q9fg5rh", "33819126845781524480"}, - {"evmos17g7djw66lkseyvv37ne6j72ashl6gfk35nyxrf", "472459360409050112"}, - {"evmos17g8gp2z6c527j2zwf58llyu5s2gcev36xuaw02", "867203081712195584"}, - {"evmos17g8w6dr75d9zhmsx9ytcgyx65ujv8hha2a0yje", "3495512745599221760"}, - {"evmos17gdr6q2xkr8t0j69hf658s72x5j63qcdqhlgjz", "672461488590188544"}, - {"evmos17gfxekq490jkuhnt6le3pvmyesvuz45qhe6mn8", "686001009611208832"}, - {"evmos17gh0tzexalfe3vmfpp5rpqds97wemxkmcn74jp", "7054702466781497344"}, - {"evmos17ghfy72mufr56uwdwftyvlkr8yjngqvhrx4f3m", "1471277964915276288"}, - {"evmos17gmq7rqq0qdv647gw2qz5hdrfpjnmlpf7yfp5r", "1231010682008072960"}, - {"evmos17gqecuvnqdgnzv75zyfad4qr2d694tzdlqsn4e", "3594845712469088256"}, - {"evmos17grlet3vy5nr295sm2pem5a6z0chta7nqd48u9", "2094093368603860992"}, - {"evmos17grm83enq9jq9nrp2lwhjhtfd9qsnq8wc3wqxc", "13932968993399808"}, - {"evmos17gsaffsw2cgvwjcp0m9nathn9jnpwv87kpyt2f", "387319681935475712"}, - {"evmos17gwppn24qyj54zqc8ttkkqwy706mdlxzduk5ne", "973710456598480384"}, - {"evmos17gx8t734eagat2hv3aa9vyghug4ngklwth0wvz", "2587839974146779648"}, - {"evmos17gyvwhea96uujmwfm2ggsk38l5qx8kdajl9kj6", "389273612348062976"}, - {"evmos17h80rnqvwh4dnmfau756vm5g07erdq5ljyuwtq", "1249602081765242368"}, - {"evmos17h8gmkhazyw7chne4l89rrwdwdnzg8y0f8l9zx", "4371116499466502144"}, - {"evmos17h8uz8pp8qucqfk2svsczmpfv237r886dftf5f", "427583159421952"}, - {"evmos17hamp980cx0hrqqddee7vwg7j9g9czx6znunhe", "1622183726538640384"}, - {"evmos17hd6x96rag6pq4egpwe6m4wzldg9hhzv347n4h", "1509921653464973312"}, - {"evmos17he2wl37lncaqfx7qr87nkrtt4pkffs5749nrd", "1032225696067692288"}, - {"evmos17hed7etkpqzrw3pjq24jlznk0da4hzmhqpe9ak", "1170718813856423936"}, - {"evmos17hehm3yx33ekrepaav6cjx7qwg8xlqysjq9qf3", "589071374167687168"}, - {"evmos17hgw2ma9erj5fxrg0zdk78m7q2akclwxl6ue0a", "29715367521396224"}, - {"evmos17hh7w02zgw7tk975t09cnfuwl7qtj3pzkpktqc", "398467807474616576"}, - {"evmos17hhupefzwtjjn8uay033fnj00857dturuk734p", "1052953964485955584"}, - {"evmos17hjex7ufvcmc3ykfgvgpvxw8wk9rspp0haf3j4", "748531240855675904"}, - {"evmos17hl40kkmw4wsr534xcyxjae4zusyujcmxgmlcf", "6310022108923500544"}, - {"evmos17hm8x8999ffgkhqc5traldrhxefrvrpvwzfn3x", "5436616343204967424"}, - {"evmos17hprxd5ralyumrwum2wlh0h2raa2c66u5f6hxa", "477648581946873344"}, - {"evmos17hqak4grvqhjt4kvfyakkyh72tx329vmpmmh5e", "4954944947729471488"}, - {"evmos17hrkdm9ps6v2jj4hz6l4mptxld42n9jyky3jkm", "418011465281432576"}, - {"evmos17hs4htf64yvvjea5rfn33c6as7p9zq85869qn8", "220420987194468864"}, - {"evmos17htgf8cdr40gfvz879tejr8szmqydfpntd6j5u", "11247423820598091776"}, - {"evmos17hukxcatuwvlhm4jzx5zg89t6t5d3gr64d99mt", "878285622181396480"}, - {"evmos17hxdv25nfj58gh4m34xg6rmlr0sjj7tn8rfx7k", "1067909752419246592"}, - {"evmos17hxtj3gkhv7p84ap3hwu62l7e90lm8wntx8khk", "1535119973794725888"}, - {"evmos17hytrlynq9ye9mkwljg2sh6a9y7mpa32l2dl3h", "4376486994056806400"}, - {"evmos17hzcxpd2fvyrnsj9muhl3y40rrhtppwmg82mem", "3769043489649773568"}, - {"evmos17j4rs9clzkkmeuyjfalng27msthxcva65n8hh7", "7792096382970703872"}, - {"evmos17j527xs6fx2v6dqhhvw8u43tyangph826vqpva", "106435658084407296"}, - {"evmos17j5wgp2grg2ey0qnqgspd63nsfawsarfwp2jjr", "1356110983806193664"}, - {"evmos17j64pkqd6papr6dkskfterhs90zn38egyruhcf", "3269236108448415744"}, - {"evmos17j67v2jm2xa5pjrfzaxyf0uyf9wtjklz48c76t", "2780458090003771392"}, - {"evmos17j7r067u6w4npa8nsfj5kag02s2p7ewsn2kq95", "1049475351558624768"}, - {"evmos17j7x3e65lxdv9yuz77agf8ewz7g5ksxv0nzvp0", "31990793508281442304"}, - {"evmos17j8myem8g6qf6kdyw5mk05x08ywswf3qluxc4u", "253632498654696192"}, - {"evmos17j8t25k56w8ld9w3n26ghnh7vxvn7wpl4zcaqr", "1084250466052157440"}, - {"evmos17jdpwksgwup72lq238smg53gk9uu9y3zpalmac", "31312310514849988608"}, - {"evmos17jenwupkknv34er5hknfwkjw8g52wr84ggl38m", "4612145874138577920"}, - {"evmos17jesfut9cy3zrnpntar9z3urcf4al5n0uya9tw", "14843456944297826304"}, - {"evmos17jf2u8gvq22h5wnvlh3l4p23drh4rrtkjf6a69", "6471424155292903424"}, - {"evmos17jft9r8c6sa59jstac3qtafm5yqpcv3hd5sq43", "6604110963786586112"}, - {"evmos17jja7nldwwf48q2rsw7t6qa0h26d2kpsp8293n", "17935356702620065792"}, - {"evmos17jp0rlxrsmctvtjfx0zye49lmz2cttwnn0l4fh", "6552534707946442752"}, - {"evmos17jswt89ugv2sp4xss0tnshy9ykt6rjhcpw024w", "1500335400394489856"}, - {"evmos17ju60r32zjser8d4kmh4lsn0lkq2nejyt7arw6", "4036992183018353664"}, - {"evmos17jymr223ycf0rhxjzarpgwc0kwpfyfr69de5dv", "216334384834468864"}, - {"evmos17jyp3r37qxqd40du46m34xzuxu7hrna7msga6c", "187386874514349056"}, - {"evmos17jyye6pwu40vuhdswpzvxa8veph82ckhn9x92r", "866201542643979264"}, - {"evmos17jzwwldcy5wytvdkwytr2qu8r6hsc8jj3h595g", "387351061097381888"}, - {"evmos17k34vh54cqxp7jlgktpldqd0tyhd52t9s3r6qy", "97936501859079168"}, - {"evmos17k4j9j0etntjfme96hyg7r8fraz4evez9rffdt", "919756975788352000"}, - {"evmos17k4kkj5d27yqwjg77kwws4vc9xgfxfshje2hxq", "3263207873208688640"}, - {"evmos17k8fuu34rlwj6cxj8dksd2edyhmrzw8pe8zylm", "18412431871735552"}, - {"evmos17k8pz3a62ppsez56yv3zm08admsxss96nqkyg2", "6299306936470831104"}, - {"evmos17k8z3xh3v29d05tf2xga96ypmf93e7vjzr7vrt", "451609269341863936"}, - {"evmos17k9nsuk2rk848rkuy5pkse4k4yvhxf7q2ky693", "3727595886876477440"}, - {"evmos17ka4l8zx6aasf7ae8sagf84xg3zjfxul2hzzv6", "313005918596547328"}, - {"evmos17kan9d0lsje45vncy4zs0x2m5wm0dkg28jq9r9", "14119593262870646784"}, - {"evmos17kedcdmq8uyfpmephjcawy8ravtr85ta5y6sdw", "1424752656961671168"}, - {"evmos17kesyvd63n6eaafg8nnh8sky7v2efwaagtrcr5", "1077489981369524736"}, - {"evmos17kgx354t5cp4da30wxdu6pvq6whkc88v5zvhjz", "13575249232899749888"}, - {"evmos17kjh68n0llf99sc55plgq7evuv39aprsejte9v", "74579354840957272064"}, - {"evmos17kkrez3m8knsprtpak5j0xurxc6s52pftep492", "1010364431281811456"}, - {"evmos17knw0p2wkrcmmg7e6nn99vlx35mygk0racytkm", "229642086278882048"}, - {"evmos17knwqxngr2k8z4jnldjv0g7kzymk3kqkadm74a", "7931030192506653696"}, - {"evmos17knxtmwy8m97x28hvxa3yvlcgww03ykqwpglsu", "8318439584047634432"}, - {"evmos17kqk23z47ag4kf9mnkfhf9mlxgf68x4nxv5ctn", "1521484338474636544"}, - {"evmos17krfdyc6xzlmdxgdy9k2sgnq57tunrmay069vv", "721025905003556864"}, - {"evmos17krpxh88m30la9p2ggu9j8yj4ca6km5reuuc2r", "4494682712723856896"}, - {"evmos17ku6hp82g8plcvljnxgdueh22q6e89k57ctuhz", "477648581946873344"}, - {"evmos17kx5s2mjrkzd9rj0jmc37z0y4rde8e8mtjzktn", "669479171459382656"}, - {"evmos17kzdgv7w5gyz9cve2njcgd0awx7y6djn57twwc", "5628085913705099264"}, - {"evmos17kzgay9n9t220hcmmqfq3dcff0vnu088lvjmxr", "5015254090437683200"}, - {"evmos17l25pm3356cc3ykgw2h2cjzk2w8hnse3p943r9", "11234367914880532480"}, - {"evmos17l5xxsv5sfxq49gg6wkndw3h3jcgkvf70k8spr", "137074806503646208"}, - {"evmos17l6pn2jmzdd258ptrc8u0aza285vx7zpl4p0pe", "2750478236603891712"}, - {"evmos17l6yvmelfcv43pxectyazphne8l3zn7ew3amhp", "1274976430397130752"}, - {"evmos17l8murkyck6ufrlw29a3c6dk3dald7ks33923n", "15220564914669486080"}, - {"evmos17l90rdxau6xtwplv6alkw4j67s52mtqw32lkpy", "133472555108280320"}, - {"evmos17lat68pjqes2vy9c8mudrmqeaz6cgw4tj9x8eq", "3056554069187040256"}, - {"evmos17lavysyyfuy9zv7dl3n4tqkyaj75elegljsyvx", "10088153316121600"}, - {"evmos17lc6umnkxs3hcq4z6v4hmclk2vth279z54qc0e", "4234474790025800704"}, - {"evmos17ldyk455u0lk7dg3zwhe8u6sr0nlfywa89wn55", "369234847138917888"}, - {"evmos17lf0myphctqgn9dcaeamg6tyydu6kqn6jwzxlc", "3079983761820848128"}, - {"evmos17lf37cyc99afehzv6vqg4jnjr49rs6gp4my8dn", "32279821641727721472"}, - {"evmos17lf6uhaynvjhltj302lsz9f0244fy432lyac8l", "1038009891527410176"}, - {"evmos17lkwgujuzv2pklu3jkus9h70eyn753tauu69zp", "1237066982575208192"}, - {"evmos17lu452np7ep6lprhnywwqgpgf6mf8lzpmfujuy", "1448574879378921728"}, - {"evmos17lvu80gemtfmue9qf0v8znx38j4m3phjrgk79n", "485360583025472512"}, - {"evmos17lx5gn2qa5nvx5lq3qfs5ezss89pv0gjmk663t", "838125690728548864"}, - {"evmos17ly5v7yl3xttdzam6yvr2lfl6rrgpsk0uaf9eq", "5137178913576851456"}, - {"evmos17lyk2cpln5p455jnmupju9qepf6ghhyuxdtf8e", "4655908388317044736"}, - {"evmos17lyl2uvzgs2dcqfhf0lqta7gnpl48y4a4vu0nc", "24734178900517175296"}, - {"evmos17m0t3mcq0v6u0vam8fxwxla2mw4g4q0sgakuaw", "1418146924881125376"}, - {"evmos17m3qphn50hau4vw42w6r84xec8rh6trm0zesca", "476718742662672384"}, - {"evmos17m3wdwp3rcy92sf3tsserxxzfcs6tpjfne0hv7", "9822730934530621440"}, - {"evmos17m43cvltgsd5vcu40ldex3ldpkq5chu7ufsf7g", "104055254703107840"}, - {"evmos17ma8k5dy342p9gdcqhaawrnv7hqth29wwtu7n4", "1023498343665297408"}, - {"evmos17mcg9apax8zq3uqdz0gkefdduwt20dldxjfv2p", "1551871219100370944"}, - {"evmos17mfvx93wv7qmxt2uzatfg2qznx34u0ad7ewkzt", "45420907281272576"}, - {"evmos17mk77vkwjtzvetxpeytwcfxxfds2wckzjt5ezm", "1770628293202504960"}, - {"evmos17mkrqgkfmy6gm6947au9hd3m2wns47qa9mrjst", "5136963861364257792"}, - {"evmos17mnmjllw3xcz307lw4d65zlmccvadyc9vfpuxl", "21363274674730680320"}, - {"evmos17mnrlfvt9mfmhs3rvt7mdnyv6g75pu4j02436a", "65397055251139584"}, - {"evmos17msw3xfkcxlgrh6f2j5fhw2qgffsle0agpalds", "7962527092166481920"}, - {"evmos17mtpxy3qgsyp38xukr9498hr50dughd79vrtzk", "307567918883781888"}, - {"evmos17mwvsk2529supy4v95ak2mfpa7qm9jemgew27f", "6782628099329534976"}, - {"evmos17mx8h79x90w0nm88zh7vkkatcp30d8hka4uu3t", "74729334430860800"}, - {"evmos17mxkw2wcyf34qdhvgae2q8r6d8vhcwjdaxptje", "17365529389824954368"}, - {"evmos17myfktyaa4eh3cq0t65zhan03x4vm5d7nrwd9u", "18327182072142080"}, - {"evmos17n0yqemsdl4emq233qfdgxs4g2eux679k3mtaj", "16188164222829228032"}, - {"evmos17ne02nreu9jj646fwc5yfcmhcvatug4gygutp0", "1524802644697953280"}, - {"evmos17nfw5h4axjf33pfxtkm2y3uj9jq8dgdvdwaze8", "2736479753784768512"}, - {"evmos17nhaw4y3n38f9zhltyg8mn9m9alnwl4ww5spn8", "1268843821896505344"}, - {"evmos17nj3ka3rh6r3atsgw5chpctte89ef7cscal9gm", "1393901699920027648"}, - {"evmos17nkccv07fqmkycrt9q99kwws97cduqvjeawacs", "44121036963995136"}, - {"evmos17nn7ddsq9phlh2q4fagj2ss2paudhq6a3xr247", "813981499349225472"}, - {"evmos17npf87kxv5ep6jl80yrms0mnjcwdgm48aa9pqy", "3877536332105340928"}, - {"evmos17nrk5t8300kvx2xzkx4vfnq6v4m9sgyylgqfpm", "805702056675401728"}, - {"evmos17nrkn3ltr8xm6467y9c62g3593rhyzya896lqn", "5404350789310939136"}, - {"evmos17ns56auv9k7kl5dqfuy8yx2pavlpe8tv45zt7f", "897239860272697344"}, - {"evmos17nwgex3g0nk5d6sj6t0rs4p9p7gc20cr0txhex", "11367736008602355712"}, - {"evmos17nwhtkuh84x4mfz2sv6flpprylparur82jq72m", "2391559930327148544"}, - {"evmos17nx4nz736f3u9dqt34c5jdjfjtwgersqgx8x65", "17358469432027828224"}, - {"evmos17nx8j99lr29fqn39q6prnkcjy3w8grwsadksa8", "4141758982348730368"}, - {"evmos17p0hgecssyycnn47xaknzga2f9l4ufak7ew0py", "1289578439128940288"}, - {"evmos17p0qcz54ugsz85dl37scgdvcaaylx9p7gketla", "1010849939770830848"}, - {"evmos17p2aa75h4d6zkpgswfvuvkvr37x52athgfhhsu", "1784428344472940032"}, - {"evmos17p2f5xv9f22lwqkm9xadcl9qt5dl3umc2y6qlz", "7020048786215043072"}, - {"evmos17p32lez0d4mz63dh6mhp45xnucvemp8yq3vcc6", "929765818178462208"}, - {"evmos17p43pnyp6exj7qd60zwjgsndkl8j8nfq79p4uk", "227671710048743168"}, - {"evmos17p4tuje59t2qaz3yns908mpews52872gk7c79v", "380273830746078976"}, - {"evmos17p5jcrsshnz8r6ghrhw2u934kemrd25kfk0q4m", "26700100281608650752"}, - {"evmos17paa5fqw65dksswkf07k8dlqnn63uccxmnqjf3", "2186575502116839424"}, - {"evmos17pc9zy0m739td2e569ypyz9rcm248qyh2j8wf8", "1404131893093431296"}, - {"evmos17pd2fvv9rjh49pjjyd4tq4tvqnprdywqg39juk", "973895393362926592"}, - {"evmos17pfkudwjt8e8608hhyy0v39e0n58jyszv726l0", "231419847372098816"}, - {"evmos17ph80lvj39mrc8ha57mfq8ec3ark2cgzqp44ht", "2296409009530992640"}, - {"evmos17phj6lg5cgsaam3fkdkevzxyngt7gk44f4s8yg", "224203561436476416"}, - {"evmos17pjpqst4tx8mmkxmv53cvyzmn20wh2ng46hnt4", "1214245146166416896"}, - {"evmos17ppj53k4srkp9wjrskhy3qh3uaa5c9ltfyz370", "62724402442205184"}, - {"evmos17pqfnvcdyva0xtak4yrqyn406gw0f45hux3gvh", "16434761895727800320"}, - {"evmos17pqjk43a3yjxrf68sp6ruwlc7gznlxgu7da05a", "1105413298966136832"}, - {"evmos17ps774cwsnhlymd2xgqh7clnq9nrdhyemdhlgw", "840629657100882432"}, - {"evmos17ptzww875rf5et7lampyx8sr76p99g03eyzkat", "16834405180999294976"}, - {"evmos17pup6mck5z0vy8jg0a68nzsveagr7hkhdqm64a", "918596176028579840"}, - {"evmos17pxglq2c0r4snw8yvqhlu7q24jqc4e4ex53zj5", "2369841832605608960"}, - {"evmos17py5dsg3y7sfd0xk54evq8yfc9j097sjeenwpa", "1836650448773001216"}, - {"evmos17pz7y6n9gwny6xgd4revpt3209nhtmt3547mmf", "15190751900652376064"}, - {"evmos17q0qfmjzf6nf9cempgu66zcxqjdf072x0cltfk", "978581527503155200"}, - {"evmos17q495dkna0rdy0ufa4ryxuyj6z69mmsa0vfu08", "2495320087927822336"}, - {"evmos17q7lje2fpzp9svqcce8ag8ag9477uqe0amfxk4", "1928003526217211904"}, - {"evmos17q9gqz2rz3c6rk7kmqcauh8fvpuyte3744qzvw", "751096150444529536"}, - {"evmos17q9m6dxa7mq5f9nm00kkfazekc09vj9hy0rmd7", "5641600207835103232"}, - {"evmos17qd5t5wcnkmazk3kgad3ljrlyytx5ct825s2rl", "28536014968450449408"}, - {"evmos17qeqqpnd67akhpw405rlegx498a4tyu566x97n", "1730393832753356800"}, - {"evmos17qfuzcynv5s35ddya9nx0ervkc2a839k30c3pu", "4309016793910164480"}, - {"evmos17qjxnzuf6j20mjxg8x6jguzl8hteefg2t890z7", "2185697119670845440"}, - {"evmos17qlfe6t00kdyvltnxcyf5zv52dh4jr8rmm9tqq", "9227808627667722240"}, - {"evmos17qlkaxjde9tunqxhd8kvx936agvdjc87mcya0x", "1346342779757780992"}, - {"evmos17qmn7pah7nfrkmtxgav4atj5d4gjhvs7gkag02", "1294473250875477504"}, - {"evmos17qpknum0gllhzuxthe524seqj3arf4jyux4j4u", "34837951354165510144"}, - {"evmos17qpmfzrkykvz3makm26xt6kt94n70fwjtugzm6", "4974486812013088768"}, - {"evmos17qqhjz07wccrr9p9rttmmct9mnp8rlt9upzt56", "6856586645831038976"}, - {"evmos17qsfjnnvrlhr6uwj0x7lgj8fr763erfrk4m9tc", "72261474980415488"}, - {"evmos17qslkk7p9dztmt8dt8wtn7rg56umvatmptya2x", "1218206393613410304"}, - {"evmos17qsr5ygpksa59h7hn5kgw0mgsxgggt0r4y095h", "1676406092966799616"}, - {"evmos17qvc4r42lrvuj5nav2905zl2hen5z6d9tja696", "543282068720776704"}, - {"evmos17qvw7juzzedz74kny4l696ep2ngaxmjm0lefsx", "2361481698699673600"}, - {"evmos17qycvrqt5vcury49d0lf020ww7hx3cu0pm7qqc", "384496547221015808"}, - {"evmos17qyzl4zwx9caf9hhlqsvyysdfg4fflg6pttdjq", "49213432753026826240"}, - {"evmos17qzwaq2v5kt8u2nq75wxax5dcxghw3hm64k3rc", "4845412379281248256"}, - {"evmos17r2ltyq6cmpcylt05yqlx5k4ztsxxpl47fr288", "35078800036294656"}, - {"evmos17r3atauf2uhetedsunml3jjsh7ea7lzxyt7cdv", "107858357005078528"}, - {"evmos17r3mjtj0uecw0mcd3zg24wq2ztr56ugvpfep2c", "620631488671844352"}, - {"evmos17r3yya4t0m8lh6c32pu53r8x7sy02e8hsfs9mc", "198160146426165248"}, - {"evmos17r4209v0ruh656p8s45t68l4dem6m8wng6cquk", "8787911263879406592"}, - {"evmos17r5hm6kl7w33vqw95mujvq99hm3fg6hm29g6gf", "1583333776327752448"}, - {"evmos17r70jj6ugx63lhl7lcfpsjh2t6qlt6m46zgd86", "13905066668564082688"}, - {"evmos17r7uf4rc3twwc63ekndkym3ezd8c4tnpp90e3p", "13568323659769438208"}, - {"evmos17rejc0ydaaa58j4pflk4w54tc5upeqm5qunw8r", "1198588906005012480"}, - {"evmos17rhlgdffp8ewe0um6f0a4dugemfgejge6lcdhe", "2248605508532264960"}, - {"evmos17rjw3xmecwcus2atssrsup6rgrc0u9gqn6lpek", "2997630690122661888"}, - {"evmos17rldsy55mnvq65jm3fymt9ll43xkpr78akhsmg", "126604603607903232"}, - {"evmos17rqfmyd2xrjfrcdr5gxxl56c8qjhufjgjzmeqg", "1054453001227757568"}, - {"evmos17rqjh8vqtg5fyuj0vgggs2s6k6v6h4agp9wzj9", "1981157636759719680"}, - {"evmos17rqucdu8fe0q0t0grpdk7w6lj39ajng9u0lnhz", "1253842782910108672"}, - {"evmos17rrs576ea5mznjfueeahgmxtp4adqyut05mf88", "6783487509275406336"}, - {"evmos17rrv023adlchx867xhsaphnfx25n82a5nqszg4", "5122695316220145664"}, - {"evmos17rs30ym23gdpdgym57e7u0523t66luw8jqpnat", "451199877707330560"}, - {"evmos17rs9mkp3nnzl8tlwgg7qjk6620ltumpetxg2hp", "5560331469319573504"}, - {"evmos17rtd7njfhzqvflqj5trggk734wljzwxfeyze5f", "27769665296174350336"}, - {"evmos17rthcqjmm88g2mxe099gdae8t33ysx80g86x8x", "12464606401125842944"}, - {"evmos17rvfm5ft9vvt2qe3pky9ns00w7v6jeu8rpvug8", "1503660955190493184"}, - {"evmos17rvh8806c5ujy6l35yngplza9qluwl6kktfqmf", "701838877713331200"}, - {"evmos17rx868yj2cp2d9rd07qeqvw9q0m9wsjdhgprz3", "827278811869521024"}, - {"evmos17rycelu3lt6w35yd9sqx6zzrwu539xtx5jgyz9", "8403653235469223936"}, - {"evmos17s2fnahpq4ux2ahmn89scpsxymae7w33qs0yke", "11802926813896384512"}, - {"evmos17s4h5vxv5f38kfhrze7078vjsgsncksyjvjmh9", "6776683768083646464"}, - {"evmos17s4n5lhlf38kr7g3ny0z06xw2rcqp5eq44uk4v", "369166426354094848"}, - {"evmos17s69uums7frd74kmr24kmjz4nnjupqmdm6885x", "1324090488726107392"}, - {"evmos17s7l27mv9dfvc9hvj2ztvdwwz8zqwzktglxwh6", "701694136020703232"}, - {"evmos17s8wgw7rlm2w5mej3nukq5tlajfzv5acwc526d", "848464265181372928"}, - {"evmos17sg2sr6net3tjw9yqfvr5jpqdt4flfys9ktzs9", "20147146540461056"}, - {"evmos17sqzenq5rfk9zffjduvs7ypsfextq6spq80zv0", "6402157468795457536"}, - {"evmos17ss04swp9366xaw9msftyh4ut0mxa7curvpfqa", "1790460286396574208"}, - {"evmos17svxdmjg45gj0ghegtzkptlfcuqe8sy5hpec45", "34569430765464821760"}, - {"evmos17sy5x3j5xdej7z0qlhf879pmrrqrtjlpzkx3uq", "81205296517814272"}, - {"evmos17sz4ttmf0unfxwwsaz9wlrdqanxjudq3xe9c7s", "247970332028251648"}, - {"evmos17t0ey2x2swhhag9xjs3xu6atu523cm8lrejfgk", "1056470140183443456"}, - {"evmos17t2t6wxkruhyjy8clsdwzzcguln25xg3aypgsp", "5139973107667363840"}, - {"evmos17t2y0vlyn2vkgkcq5nutjfn3324me9kj2wklsr", "2424492097152661504"}, - {"evmos17t3pmhhkla9q4mh68ara8uxkf6k97s6c7zqyx7", "30386710764144316416"}, - {"evmos17t3std6ehtt7pqv2mus84q2ct5vyuue3dvea7u", "1954797196705517568"}, - {"evmos17t4gv2wv8unqprx5wd2yw6sl58prwgsqq0jxg3", "10749984755538837504"}, - {"evmos17t4hnmz7khdnm259hxfrmcd662psla0lhlj2v2", "718943022204984320"}, - {"evmos17t4hpcxfpjuususvkd62s6gvm337z6q2t4qv2l", "284305328084669440"}, - {"evmos17t56k99cwz6hznstxec5y3ptcln30c05eptw05", "315976144060065792"}, - {"evmos17t6a5qtf2h0yjxnpf2qu247mqn0z634gk4m9nu", "670927735762522112"}, - {"evmos17t6utgc4u4kwuev8ap3tclm5z5hkgelzxtzszn", "95938475024961536"}, - {"evmos17t7nacqj2s9q6us5pzhllryvtpsfyw36m6wc3y", "475313468990793728"}, - {"evmos17t836hsnha76szt43xzewje8m3x9s6flhjllw7", "9526931750511546368"}, - {"evmos17tawdd9h8jk29ep7hcsk6kxn7wlmvj64a98mlf", "4567660101227137024"}, - {"evmos17tdrlx4gewruagy0vr0ecm27xgaml0w5q8q4fp", "25270577563057905664"}, - {"evmos17tdtnqtg2ssme0yq2trs47vlxkvfh765rder95", "4148474464487006208"}, - {"evmos17tduzwrgkdjv8x8xxh5w5wd9lnf66pv3nmypqw", "4821645779674353664"}, - {"evmos17tecwkfq0vjr36w8s5sdwzshldcf9qsgv9896c", "17717963242013663232"}, - {"evmos17teu8zv0s9a4f8prgscvppeqpyz2ryud8vltc0", "3265088468802306048"}, - {"evmos17tex7m5pxef782elwdpc6fleqmlsce4zldys2t", "385790795181429504"}, - {"evmos17thzky3hztuc3qy8n3t5pmw34rss4q9u2ykgzp", "96483646452305408"}, - {"evmos17tl909l58ahpjv4eu7xr4fzenj50jt5rra7s96", "1493818252950758912"}, - {"evmos17tlr3plwahcw08getxvwafxlz0pafcgast0prm", "411515388984143872"}, - {"evmos17tm66pzdlw4yzujfeptg0zxh4g0x792mt7a256", "166542225531308288"}, - {"evmos17tpavn29657evepufafuu3wsq49uj4jzv3ks64", "34184247345339875328"}, - {"evmos17tpxg8wp7e5578kv8mxektc735fla0ltraz3sa", "17898395255367761920"}, - {"evmos17trt68tt4mqp59n796pn78fvkg8adnwazzl3jd", "1237045775130381312"}, - {"evmos17ts4hwupwr94v2zpl65mnqf6tm9aawvcv7er2w", "660678008720052224"}, - {"evmos17ttrffj0d9pze2d943gjvg0yka94s66esh68kn", "1394437413175024128"}, - {"evmos17tvaeuqpu2zhqgvqpsw3ws56qg5dutpcq983vv", "3956234603172728320"}, - {"evmos17txhnwuwhxy2vnyuqrddllwxwsax5j2uwd89eq", "1712660971880701952"}, - {"evmos17txwfm93rypcm205ux8c9crmk42lht3vpezfqx", "2102493107716356096"}, - {"evmos17u4jy77lzru93409ftxx2dgpsvhw3h5a0qmwmc", "14336706046376192"}, - {"evmos17u6ufx8vwje7jav6vv4mls27efftjd55njnxtc", "19508124450480693248"}, - {"evmos17ucrqchvxfhg0xzfuj222d6aeucv59yzshmtam", "3747016188467290112"}, - {"evmos17ud6qjn8ectfru8hjc66vteu4lw3nj43pvlrns", "892699528391920128"}, - {"evmos17udnn3e2u7aa3uw8k7qhp9r474gw8pfru963r6", "527737546187012864"}, - {"evmos17ugzanct4lzzm7u688gajkj4f73k3tl9htme56", "3081255086301351424"}, - {"evmos17uhn9lvuv6luny0xkhhmw28chaq4t93mmv0tl7", "4923685722986113024"}, - {"evmos17uncf7lflty7rflhxvhvpef4n6jlp5xkyv5l4z", "3731486143072209920"}, - {"evmos17ur3yagg7xerenh5x4ashgvjl984gsgwvv5zlu", "1709441660164546560"}, - {"evmos17utedrdkcf2vcgrth8v48d6fz9jj6tgh66gre7", "8860858850905945088"}, - {"evmos17uu3smn3r63czt3mtl7c5usreav0hp4ehacfw6", "8368195079959537664"}, - {"evmos17uvdcsqw7djhcjexfc70gplr36tgckk66je905", "4432757161196105728"}, - {"evmos17uvl2dddl49993c5ev2366haua80uksq9wnk8r", "39779189517262995456"}, - {"evmos17uxfls66mg3s3gc67kjmneuchv8kffcvvkumlz", "17666278745414762496"}, - {"evmos17uyd46yz243kjmva3y8vcwgxc27s8mtg8fdjl6", "848629926700263552"}, - {"evmos17uz7gl9drxuyxcf49jnts5dyj834h2elyxenk7", "4195855885363702784"}, - {"evmos17v2p6l9vykv3l3vu8xu34gchkyswql0akdjqlg", "1207680883086011392"}, - {"evmos17v3l2r23v5g2ezsgxaenhv0yzqj579yjw4w2gd", "1492601939380461568"}, - {"evmos17v5gdlaaq20c78tcfe54rth8tgxdnfeg5ctkag", "4538153985023848448"}, - {"evmos17v7gstk86esagswchsuj4er7aanq3an3aempjp", "12908152273090060288"}, - {"evmos17v9ms0t0xqv8enqsxm38ahzr90zjgyamwyrdw0", "228324063910746880"}, - {"evmos17vaqvxczqa0kzhpyv0fffpeq84vc52yeggsy5v", "8336666437312299008"}, - {"evmos17ve5zwelrcxmjsped49ppxgas29epcfy62g8hr", "1146931508828962816"}, - {"evmos17vre3wenanryu6t20ae6uukqy06lzpfzlemft8", "14295398936259063808"}, - {"evmos17vrg438077gqvu0hmc26scapn98zlhtlmgn7pt", "803931759285023104"}, - {"evmos17vtmzcve0jdxnekdhc2ch9lavr7twd0kjmh2pq", "109045562471814400"}, - {"evmos17vtthhuvsj9sspj3tcdh8w6juqa5g8pw4lchdj", "3729384825809240064"}, - {"evmos17vuv4usnhv4atgv4s5mx6kpsu3xwa4k4n6pkyk", "7366452263339827200"}, - {"evmos17vzx58caseht3g992xgjlc779rqf67u2jt5hg3", "16166554031557685248"}, - {"evmos17w33gguykp9ymhexqj28j5wuwwdwvnsxz0kq0a", "2606531332207752704"}, - {"evmos17w49gk9zr88n3mlhttxm2y0n67v5k2kpx9llsy", "4305185578161471488"}, - {"evmos17w5r6mf0kn3whsmtyeuczvvfysv2rze06hk5ey", "3048382001563762688"}, - {"evmos17w76txsejms59j33nrf0tf2pusjgmst66edzxg", "23291789300251066368"}, - {"evmos17w9hgq6e6zn7ugjcpjg7zqyrhvdynzx8hwucj4", "21492453176044240896"}, - {"evmos17w9zz7a9zm9at5l7u7wvkn63c2vpc2s69mpr4s", "4329953471931430912"}, - {"evmos17wc6rmxke2sdkq7c53d6k0evjs5jq0k794h653", "634702916124889600"}, - {"evmos17wd79urdfhtec2m479m9rttn59vvs6g6ukw40a", "472627572340114176"}, - {"evmos17wg07weng40c5unmpx5ut04wymls5ye7alk6ch", "1531419662159857152"}, - {"evmos17wjj4ujfcul8x949ud86el4sk9jhlavlwula8l", "6957324678176125952"}, - {"evmos17wl6emkmgshpwrufdktwzmkszd2vqg4msjr39s", "1142409774465941504"}, - {"evmos17wl8gtxcjz2xm0gwnx2c9k949k2338hm362q5h", "2947973534576271360"}, - {"evmos17wmel8c7cg9sm3ktuqdvmzqtkjnfcaw42rmal0", "1101892438260858880"}, - {"evmos17wnjryj6692a798zne7j5n8vpthfy2hv4evfpt", "1373894400438640896"}, - {"evmos17wpdcrjuemrv96xac5dzgmk54ncdeac666muvc", "3107438924591126016"}, - {"evmos17wq6vgtw4qvcgsnqxccay6n0jmvy5gxjdt3v4r", "896799964479535104"}, - {"evmos17wqd8lheghh25p3jnfv53t072vp9pk3jm6u382", "1173008171327414272"}, - {"evmos17wu097dehuzdazjcxtlaf5hm6dj0v7phz599ua", "1442594148626414592"}, - {"evmos17wu99rd7c2qu25jz73p5vu5nhsyqmpe60ahuqp", "1297270308534614016"}, - {"evmos17wxg3qxadm0cfc3szk00ju4uf82fkagudwu9vs", "1552039716809504512"}, - {"evmos17wxzg3w039ha362agu9uux4jf846shsee4sjnp", "2676257473543450624"}, - {"evmos17x3efqfsa32dqey8k9j9mw4wcj59kstpxukj6u", "1671735169971265536"}, - {"evmos17x4g44hun6pz7d92cyhjrlypqt9kzq2epeypgs", "386977257585633792"}, - {"evmos17x76w287ww73kvtjv0z58e5ms9suzk279vz4k5", "1025833755249704960"}, - {"evmos17xa0rswr8fthq9tyyqa0ufdl29ygqf56xks4kh", "390607424525714944"}, - {"evmos17xafs9wlehz92zfrzf637ej3svu4wu6ynej79d", "2132837391112324096"}, - {"evmos17xcqwexzv4cpufze3ychkc57gyf7xmgyeuylek", "375880485372120832"}, - {"evmos17xcu7xjyet0r67sfvttp40wywhcl85ynucaf59", "1642386690065346560"}, - {"evmos17xk5v2n48wjua3y5jwnz3qmuf36nlzhktsg5l5", "2402881975575745024"}, - {"evmos17xk9df48t09aj9w530frvp0jferj8x9zhta86y", "1963881286064323328"}, - {"evmos17xrjyhf6yefvm0qcue6a4afnpg8l4k869ap6np", "405047285542623232"}, - {"evmos17xsagquaumvpm086hk9wlhyjfzhnvvsynx69h2", "5263767967466283008"}, - {"evmos17xumackp6xrqd83tcv890x4umvepmalq9hxtp4", "1326893973931192064"}, - {"evmos17xzulmnhr8mnujqfsckh0v2tsf2eqk9yh9wsd4", "209321267144368128"}, - {"evmos17y4h3esyj8jhnqsh67ycln394w80ydd2pnjw7f", "2742149810719172608"}, - {"evmos17y5kkpplwgcqdd5r3hvjufzj5hq6cee7ysrrfh", "2187711360047185920"}, - {"evmos17y5tffq94xffgq83hz3u5eh055s2lkd7sqn56u", "252957887535964160"}, - {"evmos17y7wxv5vpz85k9xcln08e59lmg2snvq4jyjv59", "15088715536028172288"}, - {"evmos17y899myka9lyeh6fxg28e2fkrnvnltszpxj6f2", "24730643041555320832"}, - {"evmos17y9ql7s67uudnx82y9p06tk2ne3rsnves2a3vx", "26489588117393608704"}, - {"evmos17ya29q6lqt5t45x2hqpw5tde3hdtgv3lm49tp0", "3006339392129433600"}, - {"evmos17ydrwqezdgpgyher5qkpkdnrh68ugcrqml5k5f", "20406900887171840"}, - {"evmos17yft0c7c4duxnhqvfn8cs84lhslpzfhzdwq3up", "2235224377339797504"}, - {"evmos17yju2ze3u5ufvjppcs3pftaywf83jkfg4em29n", "1017753108520160256"}, - {"evmos17yjzzmtv4yewvl9jam9rjy9wws4ueq0m5stmml", "4404456738700386816"}, - {"evmos17ykaek82dechrc3dryyxnmc6auhfjfgrndzun0", "7307514587092975616"}, - {"evmos17ykq8uafmjvl3zllc0a8mltgkm6vxpphnnsulf", "125149605843918848"}, - {"evmos17ylxsq43t3uqjfzwa3lqw7fhwll7r5xgz26yts", "55237843808213803008"}, - {"evmos17ymq4vn6qttu3rklwk73n7mknsy59ee0r6sl68", "7133755314430013440"}, - {"evmos17yp6yg87xjwcdsjfw2qf2h0xk5vkv3tuw9vjej", "16244672173526605824"}, - {"evmos17yregwgmvduzesq4twtsfkagw70hj3udzfv00k", "1177062215719809024"}, - {"evmos17yskx9x8e5cplkvduwu2sgp9yuuzwvjs6nfr7w", "23114510001828618240"}, - {"evmos17ythnkycqhvakv3j8hgszg6fnyvesv00rd827k", "887469166154589952"}, - {"evmos17yx7erqkxpgjvvjn6u8c2yae86yvtrsetvad8s", "20767891336117014528"}, - {"evmos17yy25sj4zps0dw0zh4ym3nus2h8xrrat65w7zs", "4551576998433488896"}, - {"evmos17z2yg90vjnhfqdhzdqg4e3t9etqma7fm84m77u", "378192432572203264"}, - {"evmos17z4wzzzp9amzkhx89fwu2rk9ck962wfkq6qvqr", "2800093765681668096"}, - {"evmos17z6tdu3cg26trxtq7epm8ghyxyrvt0fjep3x49", "5503000244148797440"}, - {"evmos17z83l2nc3xnlk47qgj9pqfjvn92revch7szllt", "91247125717499904"}, - {"evmos17z8jplc8dk7vr3gjczanzqsvk3jnmvgq93wcd8", "3203730188450459648"}, - {"evmos17zckqu4726u7dmf8pcd6rg0tq3uh5g5yz75ny2", "854721293101744128"}, - {"evmos17zkzct3fwjlsq7phq2u8y8wz9twderxpn90y8l", "12921400940327626752"}, - {"evmos17zqax8jh0fwqnr0w63fumh9dkn99dxzd3mp66c", "305619659728691200"}, - {"evmos17zu8pxq0ujeg7vlqzzgfgtaquufteenn3nty57", "7994102875649202176"}, - {"evmos17zurp7mtxx3643mludaka9rtkm6usd6yyewfy3", "1074912195743039488"}, - {"evmos17zzz4jugnegwluj7e56zmhx4n0d0kge6qcrxd7", "2407511190086730752"}, - {"evmos1802ea5tvgc45geqfrqcd4wpgmns8jpm07j2ryg", "1319973558185725952"}, - {"evmos1803cgp6lajrlv620hcqdkg0m3aqud6dzpdlvm3", "144683465528713216"}, - {"evmos1806pfhk09wca6fp45kue3nrud454rg0t5qdfpr", "579460322649787904"}, - {"evmos1809e6d52j66d3t4yn6djnt6l347jypqhncgqgv", "24537603989059469312"}, - {"evmos1809f239wf90we26rghwpfqraav8rhjjr2u89ps", "208068776388584448"}, - {"evmos180asyj7lxkwrgx5j82punx6ue3rznhhyfmyvj7", "393725929991902720"}, - {"evmos180drh5ehkv20eenz9fyw8r2fqkl2p4e8shlxxh", "12354274846786732032"}, - {"evmos180ehd0sklr0pp92ryk9uatyajffmmmhr2acc5e", "5706766430013571072"}, - {"evmos180jphczd2kwwh7f6lrt9032gf7s4yxrpvv7j3t", "3277628211623050240"}, - {"evmos180k90jux3ggk4p7yp5gscleyp4xg2t7sv66yju", "172474141104187904"}, - {"evmos180lrlrmwm8uz0wedukhllr05675cqhuapaqvyj", "142757429643212544"}, - {"evmos180my03kcnm4v4xkau545hymkk4x65q25syt6aw", "321121393641091072"}, - {"evmos180taqx5zzr5gfdpucaeexdrrhl605z4l4zh7cx", "27111248088612757504"}, - {"evmos180whe6jnnlkxua6qtfs59heag93f4xhf4pmh28", "1499361823403489280"}, - {"evmos180zj5xtt4wpnj3l50n3yvq805ds9xp5cpjuxf6", "1265981253597863936"}, - {"evmos180zr4z6t403jvev7eltwvsgag3a705deh2a26a", "739733135074726656"}, - {"evmos18206fpyc2sl3zkvgu2pdd6dy6qdlngaq89ccmt", "2689109428363101696"}, - {"evmos182090yt9eknqcrct46y05phjqk5xusjktwn5h3", "688302997414421248"}, - {"evmos1820hew7da88mvt6pv3yuyev8jswuan63enr2uw", "3249300148439007232"}, - {"evmos1822nznwhence64wq59mzc5xnj8cws8083lhtvk", "605821996638208"}, - {"evmos1822zqqqwku62chuzn4y46fh65ad2pqyj6mec8p", "5140647795391413248"}, - {"evmos18249q27fqtm7fxd9xtjw2rwn95vc8r38n8533t", "1721672739922214912"}, - {"evmos1824ekv29may2y2hrxl2s68tx5we280dq8au4jq", "4058316275033487360"}, - {"evmos1829yuz65thmyfsurntjejzczzzzh42skxnvppj", "6453620818200576"}, - {"evmos182dgqenap6jqvgcaz7f8hc8u6rqjr8zk6q79dc", "4772075187717013504"}, - {"evmos182fj7e5wz80q39ces6kw39wrupat9vlc6de3pg", "14718265160129282048"}, - {"evmos182kf4dy3jr9gpn9urs8dan23p0q4k2u0ugprqh", "55718131992510218240"}, - {"evmos182nx05z6d2s3zh8555eu9xa48zkdzvqve7temd", "2983073602678390784"}, - {"evmos182pgda4agka8e4qaxk89fhy257p0r55pr406u2", "7206954858135121920"}, - {"evmos182ppr3vgaxy35cj5ne4m9chneth9vdc4cq9qel", "1455932912098662912"}, - {"evmos182ptd6zux76xlsfg9j244s3nkm8z6ep9tnksjk", "2503212394115679232"}, - {"evmos182xevetm3esxqef0at8z28l3tm3tvr6f0rrkru", "2161749316080984064"}, - {"evmos182y2q0scq3epwwjr6tj3qv9ypxmnydjp0yy7c5", "2586027784483484672"}, - {"evmos1830x2x06qw9sxu9r5339fg65yv258jqfc0kpmd", "476661221841012736"}, - {"evmos18322ke6p29x8kyw38s392hra0fwffmpu6psvlx", "12842602380648482816"}, - {"evmos18348jpvu27acrmqk5uyal4m4f50xyrhwzregpc", "5897008714152294400"}, - {"evmos183705sfcdpamz3k69h365d5d9lg5a9xmrvnddg", "753185667040992768"}, - {"evmos1837qgyypmrmmysh03vc76kd6ws04kxuw4u3u7c", "2251409845477670912"}, - {"evmos183a7wg9kse2hsr9xxzxg44u3tl895wa0820arw", "477891969536482304"}, - {"evmos183d78lntppj6upw9txdufm095w3p8fp6ajr5rd", "36394562563730956288"}, - {"evmos183jwmlzjxz7a5frmm6r0vuyvzsy97307c5y80r", "335258940863281152"}, - {"evmos183kxch2tz7swgkvcm2yt8yaxlz30mzslnuesvs", "4528349840439851520"}, - {"evmos183lgwr89rg6zng7jmlzy2s5z4pnk7gpf8vl0hh", "2911383717573779456"}, - {"evmos183p2jvyauz54r0hp22msda5wzmrm5cg92tycm5", "4736209373016373248"}, - {"evmos183ug3vx7l0qhu4rl0huec0996r3rcltcuqu5f9", "2499324648325660672"}, - {"evmos183vdndf75qxm28e35u83q0m0fav6euaewdjuep", "8306212606985216"}, - {"evmos183w8g5kw2e3a5c35ewtd2e3c24z0uzl0n6xmyq", "3993451336332887040"}, - {"evmos183ws00rka7jvzthnwrfkkym2wey59h7pnp787t", "5555480390191832064"}, - {"evmos183xegggzuj34yr5xyedtk80sz2k2d77ct63j7y", "5281391680414097408"}, - {"evmos183zdd6cy425nrzq7vr72j7hukvrzgxg69ps4um", "384464513876745728"}, - {"evmos1845ggyv6eyc4tpyhzymmpl6sawk3v6wgpk2f8r", "3997564376451131904"}, - {"evmos18465v83fj2q2h3mlhmrvdvuevrm60n4d30shzv", "9051783733432125440"}, - {"evmos1846asz0qfrl3ktwyf9u2wkpzmgcs9klgracamv", "10408457720449839104"}, - {"evmos18480r7j4lfxwvv86e67m6aw8vx7p5r753htx8f", "5771652552829664256"}, - {"evmos1848dwapcdelgrllmylgva2j4fck49yc36kelch", "421000403628850176"}, - {"evmos184j9dveuj5x2734jkqm3yphajd45xs8n9hw2a4", "319827930614480896"}, - {"evmos184lqq6av9t0mt7qz6rzk229shu4sff60a5fml6", "712051344306009088"}, - {"evmos184n4lh5ymezsklz70uw5nudhpzun2t2xel64su", "1694378577132427520"}, - {"evmos184p8ze90z49fz5wur5hkcwpavwxhl4dx9fxj0t", "731609580727189504"}, - {"evmos184runre50lud4feqwwxh2j82qqpja7sf9drwjz", "5927667013215019008"}, - {"evmos184tday05djd9uvle32fvmkezzxx8wpeqvrt7re", "15741844963557912576"}, - {"evmos184tjk7tc8ksjp3v79enfzyqtvctp4xwrw5xmnk", "643081499931426816"}, - {"evmos184umk3evwacrtg77n6mfedqvwqtdmzujm43uwz", "2728646164146257920"}, - {"evmos184yctc7sj6yh6pavnktn45sm2zcaprrl8dzcfp", "1360116012817622528"}, - {"evmos184ymx6agj7agdy7r4p5rf3vsdgrm7xstt6skpj", "5567505444812570624"}, - {"evmos184yzpfs4myyalfkg3q74sukstgevfh64dk6fxf", "142751994638041088"}, - {"evmos18524g23h26azrj44fcwa3wyd5k64unj22re5gt", "1077459125576839168"}, - {"evmos1855c3aerln3uvgz756vydvuuyc4tpahg5332rj", "45149123994890379264"}, - {"evmos1856mterrqagdj3w38u2zrg93849v0ey3shean7", "50292160482410905600"}, - {"evmos1856zydu34gx3h8xs9hrd5a8hwx0tpukcxndu9l", "2550216719142574592"}, - {"evmos1857cetdy4ctksqfz97mxjdfq55efl2w3xpfgn7", "11135824979392458752"}, - {"evmos18585etr8x6vqtnt4zgwmlzlak74pm7s83ttvhf", "9026717065005350912"}, - {"evmos1858fff2ega9474g2l77sa5jvhf7ermmx0h6fk4", "180267546577127424"}, - {"evmos185cyeq9phksff9dxpxc7euk4mj4s3zm5qxm2fx", "277605521506742272"}, - {"evmos185e8jcmxs3u40punpc73qe58xer6td5ufzlr79", "9700780678390794240"}, - {"evmos185fflhlw4y7t0g5lpwgv6g5pmws7ely5r92vj8", "8295685603081437184"}, - {"evmos185gdyq56ced9q47qxkx7daed586d88vlqds7vw", "1030099864848514048"}, - {"evmos185ge6y62uqn9qqgmght4crmfwdpshackqksx5h", "4231073056737818624"}, - {"evmos185gq4ur4hvmnvr2h9f6pxcu6vl0chsvscg0h0q", "42769893810762743808"}, - {"evmos185h4zf7ql02t5rfgy0hjvfzjsrx5mgjd69qarm", "103028782069561088"}, - {"evmos185jvck9ph79dt590ra95yj8yzd9tpckd4rxh2z", "11684388467039961088"}, - {"evmos185lmpzezyq82qrr55ek4pxyqsuq50s4gnsjgtn", "1677080043624720896"}, - {"evmos185msup60cn40zvj8075jky4ze97xx78zqjdx50", "4985744096024134656"}, - {"evmos185navlrz52ve9ly2glwnuv5432uzlj227dqwv7", "1237098659077980416"}, - {"evmos185nee4dx7p0qemva7cx39asjvj9q658w4eufup", "3842365392374124544"}, - {"evmos185r9unuq50tec2smdurzexp0ed39apmjggfexs", "1856017086192830464"}, - {"evmos185ufsy5q74rqce7sqdkg2ex9nh952wud3fkhvr", "2176094759369113600"}, - {"evmos185v93fdtresfhp4vqyr2t5797gm6gjn7u58vth", "3710369410045208064"}, - {"evmos185veesfuzqp8utkxwt0c72rv23ctenym4c3vpj", "1911619230478671872"}, - {"evmos185wzuqagxwlgwespxhfrtfp3yyu9xq6f5dlqf4", "1706813670099363840"}, - {"evmos18602n7wjgv7myfh0d4fm8ld9dxzhy62fxmnc7t", "171427102451601408"}, - {"evmos1867kg7shgw2wsejcxevp8rwwqpqtjhlywypx9q", "8018134029375557632"}, - {"evmos186909uyjc0ls334dm5jcwsxv5qcvm327cpx97p", "4438961821561126400"}, - {"evmos186acr7ufv99tjgml7m8u9jxtjmk3zvttvrhz93", "518391799923859456"}, - {"evmos186dckeqp6jhxvlujejy5w2mm5wvfs03lmkrezu", "625887513589144576"}, - {"evmos186eafsk5x76nu0fa7zasq3p4vrw06lmf58wunl", "53080933648172072960"}, - {"evmos186fanve34ez2tc2nrsv4uxx0lzwhfd4fzeef6f", "29543541981372280832"}, - {"evmos186jqm2vhrw9mq8h7ksxa63wfmhkh35lpaqpffc", "88102902104268800"}, - {"evmos186k04vdyehyz39552eyzfdlg50wrgvzus8lxje", "1164635896523094016"}, - {"evmos186mxdglnnlk39emq32c3l2yx4tmh4lt9dq6r8s", "794357413022151680"}, - {"evmos186psanepyr2zyrsukx5cec2f2x9h2jjngjy70k", "5651261290769990656"}, - {"evmos186qrwc76krpnyzt5tkzp8wvndhxm004re2r98r", "4311636321815912448"}, - {"evmos186sx99l666e4nv9upzyyvkp3a7f6r6txqeemxu", "36659964240144896"}, - {"evmos186ut3a35qftr5xrwf7kf2jhwpja5wpdzpemp0w", "473641242062097408"}, - {"evmos186wfclsrj46claferv2qducp3y8alcxyr7j7g8", "12074196678829314048"}, - {"evmos186whyvzj5v5xdtyr47pg7h0rp4q02pypmxjgv8", "99062389766915840"}, - {"evmos186xzezdzr0tr9ht0w8hp2k8qnje4d0gzxd4j66", "4953936833465188352"}, - {"evmos18704whksjtlx3kgs4uar03n2t9mcphwjfphxnf", "9604837489668829184"}, - {"evmos1875y27nyecnjd9a4s72gjd3axy9l85rrn8vhh8", "1068346320975368960"}, - {"evmos1877ay7pruhjcmvlyu8xvthnp0vgqln0q5upl7r", "1604789772814546944"}, - {"evmos1878apmsjcphhtu0w0hv2ajgnqwlcyu4ysaahka", "1160739749003661312"}, - {"evmos187cnwd75l53gfa0yxlvnn5aqj4t3p6juk6t9n0", "956687156186963968"}, - {"evmos187d8wa9xhuga9u8wp76dq4pg7tgc4px5sjrhr2", "319365174436484864"}, - {"evmos187gmnv3jx6ftvacnetkn0wrmu65aj6gj4cthvm", "1389929867554830336"}, - {"evmos187h8jh0000v82s4mgzpds53rn5dfl7ddyyzgr0", "156484052060981760"}, - {"evmos187kchnf2afej6q4zq0q4dvvjq5jn72sxs8pmc7", "16040715005662023680"}, - {"evmos187khts30jd6mkum4m3wh3rjlj669quvhr0lc7a", "55205388054421315584"}, - {"evmos187n4dc954lxq7zlaw4fgrlklstvjjfaaaycjzc", "7497931882743643136"}, - {"evmos187p4rqpr2czqvhg4zt53js2hja0gs0f7zfdxtl", "171702199532000768"}, - {"evmos187qk3ctp37drcsafpcdmk8w6uskvc60ucq38kd", "4215614177312690176"}, - {"evmos187qqssre727vyclz988l207yddsd2mclvhc4hq", "1185874428339564032"}, - {"evmos187rje7p6dsqqzp5t4xnpacrzcwjwcqw9lx5jcg", "313743625074058496"}, - {"evmos187sr3rfng67vykadflrqgn2mhq8nagha23eg75", "7105786217687072768"}, - {"evmos187u6xn5t94457xe9r85t05ssaa4jhq9jlhclxq", "8341171954107553792"}, - {"evmos187ujjdnegm7p0ry3sxgw678njgee7qknswsts3", "466593869050122496"}, - {"evmos187ujwv35hwh795rpw9r4xy4eftmg603q2pn67f", "16684751564806721536"}, - {"evmos187xfr60fev8yacwxc2v3nj6neqe5w5p2rwgh99", "473928042549152000"}, - {"evmos1886c594x08fy25lczhhjdkgzfqgjyhz5n9mjyy", "1346799990005273600"}, - {"evmos188d9rhv3hgs5pmcd5w8pgqjdcz9gyawzftgmj9", "437281527079212288"}, - {"evmos188e0elwk24eafs0xmsk3dstp69swre0x5umyex", "29085934767007866880"}, - {"evmos188f8hfqpva3kt6ud9t25mj4vfrg2t756ap5qfu", "30940340545563648"}, - {"evmos188hlp27h9z2vmxgvpwudwpm37kljr83kpzllxe", "401378951814395648"}, - {"evmos188jjlzdm8rh8zrmklaf3wc9rqdz8xcw5nhu60r", "12226236398106636288"}, - {"evmos188keeh2gdaj5t9qe7cj3jax6u0uqmeeq25krjh", "8631037878282706944"}, - {"evmos188kxacfnp4sc4rnuescpzdk2t3w327024qjlzd", "2847053948592881664"}, - {"evmos188lxfw4uww9h60txm6gtv8rq5grulhjxtha40g", "5511915546131169280"}, - {"evmos188m75yxjepq94ygfu3sz7tt6yn77vxee8makqt", "12968650283932344320"}, - {"evmos188mt4p2qt70xdlwjqfxg39rvrtkxnrdnn8x8ck", "2099845178040588800"}, - {"evmos188mt95s6t7fjj8a696evc8jrt5sme0yfen56l2", "3608862869476456448"}, - {"evmos188mtekty84ay2udf7sy2788xwny40q6u6zgz7s", "2309798756331722752"}, - {"evmos188pdrulrsn5e7dhxzwrp9e8cjvnnwqhaf4aa2z", "1384885494415195136"}, - {"evmos188sjqh39ha0kdj90jtzaddv97paaxvg3wmq33d", "2937023309144583168"}, - {"evmos188u94c2xecuwtu2waawfpgq8gg9znuvu8dyurz", "2921365989746417664"}, - {"evmos188umy2gxjk0jhfqmjxg0msf70zpu026yjc77f3", "8607990278974947328"}, - {"evmos188wp7xf9j8yeu9xywfzs0lf9k3yfd26j4xp0fk", "127191589649585152"}, - {"evmos18907ew9q6673v2whqm28ydamhca4vq604048ak", "708209926916615680"}, - {"evmos1890j85e7nqwkux6expt3j4w8xk9n598gk8uza2", "65754048589674373120"}, - {"evmos1890mlr2n638mnesksjnjw4attn7gmq7hmmhd5q", "856866337574111744"}, - {"evmos18926pv0c43a3t7lw6rgnq4u3zsg450yyg7gn2f", "16949325206907219968"}, - {"evmos1894s705jdle7f6r4yme7qqs4xmt9qvzcaknycc", "974742188116499456"}, - {"evmos1895xx655v7ze9uanuc473snzmc3ylc2fhpvejv", "1065243676826608384"}, - {"evmos1896nfms2z764gqye32m0wgwtt4dtat9ux38ew4", "3871973202536342528"}, - {"evmos189748ezrds6t098ctr3y8ds62n7jrxdjx2c90g", "7597929856924534784"}, - {"evmos1897amcgdzzxyf077e0s46ud275jh5j3qyce6hk", "14372514456468172800"}, - {"evmos1897fgv37fprg4zcsaw3v4gmrnrd0pf9g6x36tj", "378563520304365568"}, - {"evmos1897ny6yc797qs2qx8q6mmuxl6pnnzpegn8hxdy", "7619777261936001024"}, - {"evmos189cxtllv8yk6rsas6y9qe8lfgmkvj9vpgtknny", "4932553157446611968"}, - {"evmos189dg77jrj2cxzj7ytn3agr6nl8gh0u38kqcztj", "5052348524697960448"}, - {"evmos189dz37w06nv7f8sms7v8cfvc5tetthhlw9lfrv", "6399909765573378048"}, - {"evmos189eku4fq5y7ttg46mhnk450kvsdju5cqakdrsf", "520183752846151168"}, - {"evmos189fsz7hj82ue5l2q70fx79v47f7fzdzlak96ac", "82421549166756864"}, - {"evmos189hsu406xdgngsw42muy5m49cm7h6gtmjmxv6h", "1587924472910065664"}, - {"evmos189kck6l4mltzsp37ph63dr7n6twzpdu3vjvy82", "149964008254939136"}, - {"evmos189mjv0evtdyug7u3r08d6dh5a9dlve50dlm223", "20391737015365677056"}, - {"evmos189pc335gcermnw5mvhezgpggl7dvuzhkzv04vy", "25627906539831382016"}, - {"evmos189psam7wa675al9xljrm3lq58ff387mf7j8hh9", "768305269499904512"}, - {"evmos189sfsam3u4dxhacvred95p6y0ca85qrmf3frau", "4313829722776394752"}, - {"evmos189x478ryg2hgsjnggjpu0cz0mc446elh4fmvej", "61112347325215232"}, - {"evmos18a0g0chym2d92z0fxmcf83kwu84e88ru6ed6em", "7363874661370265600"}, - {"evmos18a4xm46mlq2pnayrzjr7aug52dxkxvdjfn5e9z", "6905808528468590592"}, - {"evmos18a6y8lppph337ucgahlen0f2my9hv5sn80vhjg", "2835029592655323136"}, - {"evmos18a9v9grjqd3w04x5zm8k9jvvxx7j042gknmx7n", "473904068640107520"}, - {"evmos18aczatex6qes9dkmyvc50ysfjjjaeddecky2p4", "831826594162122752"}, - {"evmos18afes05s0fn2hn6gtzzarkgv6c06yr3tfv2dwa", "2704887434317325312"}, - {"evmos18aj4t6x6sk0qcjj79m60rgneazpt5ywrz2xq9l", "898689491112099840"}, - {"evmos18anwk5yv3ytg6qnxaa9eau7l09xr6kw5kh5h3y", "104094968676327680"}, - {"evmos18auq85rc7aselxry96uxrvuevmhw8vh5yx5w9s", "859285075125738496"}, - {"evmos18auwp6xcj25ujajc5ea0d4e06pz4m07hdduvkc", "527430081751875328"}, - {"evmos18awvehp0fccgj0g8pxhn33suwn4mds8xqfdzas", "40182713162033020928"}, - {"evmos18axapgnv8xkm4he4azuj480wy09ewgzyhr0srz", "6807324669841989632"}, - {"evmos18ayerne0qsxppu27p3fmfankcazyp0ps8370h0", "105209576549892352"}, - {"evmos18c2f9z0u5vgqrtxhkzezdlq9qygm2txuluupum", "70813524089829376"}, - {"evmos18c2z9cx0sjfmfzss4rj4cfha9952kadndsczhk", "194158007096936448"}, - {"evmos18c6hhwqxve7g89peu78gf9xxdxl2qzj8kz00vh", "13979816234937815040"}, - {"evmos18ca2wh0xfyw84e4lhkzdrcx0tn88tfhnqff9f3", "7442260670146062336"}, - {"evmos18calwac9eg5rj8jxuyr7wwwkkq684rz6gkns9p", "331156999315955712"}, - {"evmos18cgav4enrs5xvfyzdtre02t5waa7perl53ly3r", "16114875782678118400"}, - {"evmos18cggnk7wq0z8eh8vthrjz2sqdwn8fduj3m3s2c", "411348783431083520"}, - {"evmos18chuzvgysvx3s24uhc7yh3m4tqsjxjjlvqxgns", "122900275230347264"}, - {"evmos18chzyuhvhyq5d069lcmvjwgk93xzv4puxw54wc", "827551879650586368"}, - {"evmos18ck4ul7349au3wk4jrnggfk6tdwzjh2aaqht84", "16213285565030144"}, - {"evmos18ckskyk8393a27urp6udlzahwnq0l6c6lzcfa2", "3123800569434943488"}, - {"evmos18cly2pwx2yexpjw0rsf4x850gj0hz9htqu957l", "859336566069982208"}, - {"evmos18cngx6m94ht8frv9n7skt06v0raa98ldxwdve9", "798483287671737216"}, - {"evmos18cnpv0zl37t3dqt0aw66ugdv0q6mt7sm06ez33", "4848486100831592448"}, - {"evmos18cqzhlt0t88thukx7z850pdkmjrwdwt8zmtzh3", "2660942952877912064"}, - {"evmos18crypumwl8nkyyjgtaa3m8yq3zpfp55j4jcyzm", "1605105360417730560"}, - {"evmos18ct7stqkha8ycrunhzadr7excp86swvvl4dp98", "384248629485215488"}, - {"evmos18cwret9cxyxcdksw2awz2nu5rqaqs86r3vwz79", "1570879719539974144"}, - {"evmos18czl3cs6nlkf3zpvr3rd7g3ewm46q9n000pmun", "4775508534917517312"}, - {"evmos18czvf68kkukrkpuy3nhw4vntuccp0v7ktuty90", "7218414194430190592"}, - {"evmos18d5zql5dm5y7ht0xlfhlllusfr26f0ncy4spsv", "6046498509778468864"}, - {"evmos18d7v6a7wazm5lgkv75vut7324vgsar8fmrw4qx", "554812142885346816"}, - {"evmos18d8r649sjv3tg407qfnt86x80uyk3slj8lv88c", "3503198658019955712"}, - {"evmos18d9jqndx9f5zz8k772trt93zsw5yks3xmejxvl", "1641285555930370816"}, - {"evmos18dd67mzezp040q6rs2mf87q6rcu96mkud43txq", "684745885635809280"}, - {"evmos18de2dpc5q5e7xpagzat28ftyx3c0zvl3z2kvzf", "55468287456450756608"}, - {"evmos18dkd94kgus25pls82dda55n7tktg9tqgylwqtj", "341220791929483008"}, - {"evmos18dmekrm6ypffyp0t7x87eglsrlue0juusncxfe", "468798806635656960"}, - {"evmos18dmy06d3dg7clqh24ymqej4rp3refa5dxpp6pc", "413938847075264512"}, - {"evmos18dn3hy6zajxvtuwsey2hfzgf63vt5htg9d77tj", "1172565544759410688"}, - {"evmos18dql3868jks9p70r6wn4xl9szfmwfdemxtz9v8", "4412022303593767936"}, - {"evmos18drfgh4zmfx0rmml3rdwxs320l9gfpt3md4ajd", "2018790573915751936"}, - {"evmos18drk0eut4q46un9fm3tsh5wvp0e6uawksu6qa2", "669026262606749696"}, - {"evmos18dt9v7zjz7r32xj6vmgl28tnk6m6qepu8anmww", "1213146460533911552"}, - {"evmos18dx27n0hcstmfvg6fve9kqn8gq0ytdae362js0", "44047477155342843904"}, - {"evmos18dxuvvfswfl25kw4ydfkdxxs7wk93kcexdwc4t", "416228266228924160"}, - {"evmos18dxz9g8wsyghjl4dn3lulyc8ppajprfkteutlt", "2994142281909726720"}, - {"evmos18dzfphl03a895hag8wyx97sepuly67esfhx2ya", "14352284137262137344"}, - {"evmos18dztp30fc99xtw2dnvv3gh9t2yffajcxncszqn", "3787584322078590976"}, - {"evmos18e2c0yyallcvkv8edxj9yyyv3enuwkfafk56kp", "1640710318563313664"}, - {"evmos18e2pm6w6fhx883706gjafkn0yvkhtqunsmy577", "7908778654767431680"}, - {"evmos18e3fpjzm5x27ew9gkc98he98xleqc6wnd4vyfx", "1316901229722377472"}, - {"evmos18eke77g992ddu07ruywcyfn3gjl6hypxf69m3g", "550540777220636672"}, - {"evmos18ekxu0e8hkeqj5ls8yd0h3n63asmwdthedta6q", "2675179589980133376"}, - {"evmos18elnrh4qutdzlusqh60q8jzzc3qpcfelvxulpd", "223831325358336"}, - {"evmos18enk6kwzlhlkyyuvg7z9mmk06cn8cpzujawqgt", "2124074251351607552"}, - {"evmos18epan3hjhvyex4jrydwlc8u373fu2ll5agwn8s", "8346603873477640192"}, - {"evmos18eqeldhfelv2v6s8y06m47y03xwnduae0fexyg", "1554644145043879168"}, - {"evmos18er8mpnppw9dczeh8lhrjjyjlqmf077v5hkxav", "944242787858953216"}, - {"evmos18esv8lw7au5mg0quglpraqadvh9j8r9nlkq4ug", "1423627175592706048"}, - {"evmos18evcvjmpwwmkp3jz5usp5fqq98vt4rtzr9v8kt", "301978386955498496"}, - {"evmos18evdqehuh88d7mu5wve07pykf8q0ns3zg9s8k0", "387252143010984448"}, - {"evmos18exp0herp0zrfq4qctt7m0gaqxsuz8tw06eygh", "1818194441754091264"}, - {"evmos18exqu5fkc5nycggvu64g3xz56zursr9p4pdm6k", "2182936655150577664"}, - {"evmos18eyeamsndj0af6a7vksqsjup65n57znj70kk35", "5854865472118702080"}, - {"evmos18f2gqxvvkza4wjk4xuzhzqvlwegdqxpcjsa2af", "2914863609406691328"}, - {"evmos18f2rm9qcky6cuqeq545npdjg0yxzhyvfye2shz", "6203910689876528128"}, - {"evmos18f352m3fmggg2qgdgc57tkj9f9p6q4ufxhkp7w", "227624278221969408"}, - {"evmos18f5320ec7kdgzexg9e9hg26epr7h4ptjkt4lpg", "12925412065409843200"}, - {"evmos18f6qleh3jh8zvr96t2mp5rpzh9w7l6848mr46d", "384930283638366976"}, - {"evmos18f8jtjmp4ukv3pzhrr7jacqzcfqfn070et5gzg", "1352027562826268672"}, - {"evmos18f9945j9d393zj7q6vyw5z7fnenuhsz8tnj25a", "384790387202093568"}, - {"evmos18f9rtm609tsfxtgkclsacpvpwv0n2j7nj9ncwc", "2114285934996047360"}, - {"evmos18f9z0cltzgtmk0e7kt52akvvak053xgqh6mu0t", "315034673251184896"}, - {"evmos18fd9nn5dce6z3qlt86k62wqzek8tzlhtywga7v", "33652613250873200640"}, - {"evmos18ffp552zd4zxulwu9nqm6nahku45q7qx0g6lm7", "1110487653260456960"}, - {"evmos18flkuvx53jdqzgyjdvaujv87rxf2gkfvtdddgd", "2657611537384267776"}, - {"evmos18fllh5jj8jqql3s66zy7zh44fkpawsntlk3t78", "1474089327262195712"}, - {"evmos18ft876q75st8zqr78pu92h6rzm7lpnsvavgzjz", "17538804102666039296"}, - {"evmos18ftcgpfmflcqpmy79vlqnenxhmz6na5uts4dtm", "47088765277169999872"}, - {"evmos18fvenahkwfhfgfc0yagrgydwv2sqpepq6r5kn3", "16126043293674827776"}, - {"evmos18fyctl863mvvs3fpe7r2tsz042vpqp2lkl8vhq", "37144422664864768"}, - {"evmos18fzcut5pg7t77ytcg69594fa000w0g42lkk4gk", "407976137685775872"}, - {"evmos18g068cypfae7cfudt8ecxp5mgjcr6wdcx328wh", "6465438139340763136"}, - {"evmos18g3d5x65r8mq4wnewuud2ejm4faukx26msmle3", "328437098191900416"}, - {"evmos18g3hp2h4a6qvuh7kvpvcwtc7h0wzcaywxhzkk7", "467965456917323520"}, - {"evmos18g5n5pmwh486dl5gpa634dzaqk057cxhevrp2y", "1604792710608502784"}, - {"evmos18g6v2rz94xlel2k3uxk66xx748a20g4a3n2czj", "3443184903507411968"}, - {"evmos18gcpqqg8thgvhs5tcnsfh853z25lf6dlvvcjjt", "36788326380766576640"}, - {"evmos18gerhqcuspfyv7hrkawmc72tarv680du93sj5e", "522706908531883264"}, - {"evmos18gfwdea5v7k5uh4p9yrzw06wy27gkf8px5xgal", "5107603527698710528"}, - {"evmos18ggerlt8h24epmq8a75t0z6xcv2l7lryxmv4gd", "18507620402412613632"}, - {"evmos18gjktvzu0vs9wqvdud563qkxhr364v2r72rrc3", "1432700596160426496"}, - {"evmos18gkszcfym7t4s59cff4fwrkd2ujm77fahyux88", "15179585461967958016"}, - {"evmos18gn8y7c7hmez3t6exhdv3ndn6sz77r55gevxfu", "1777498750339391488"}, - {"evmos18gpa44pdy9ddvd0xf2dw645ecgvwjcvadpc5tl", "1604328058409517056"}, - {"evmos18gpft8hnhdemunkf92fwrqjhznf233swtk7u8z", "14897620569001107456"}, - {"evmos18gpkqhl4e5d8qtvv7nkpafgnymwcqfrh420gfm", "89048818349571915776"}, - {"evmos18gpuhu3s8cdt2n8eluxesruke9p222e9mg0qkr", "4505380841304227840"}, - {"evmos18gq6atere23emp0gup43jw857xhjsta8yds5pr", "384091762028360448"}, - {"evmos18gtnz9xuussmgzguvcy5z7qwr5vavw66gczjz9", "51694242299218714624"}, - {"evmos18gtzauc465m9xz8fvatyfxgthee2fqppsty4lt", "99034350937304832"}, - {"evmos18gux5r50vp2wmymg7pu8rwafeeezep3vt3yu9x", "1437504238281812992"}, - {"evmos18gv9pzuck06z68jrcezs3v855e73lq79pk8yqw", "3424974642337218560"}, - {"evmos18h02gqsuf9t22drmq8q9heevegklu4jnq943nw", "2676451085277597696"}, - {"evmos18h4kx4935mae7hk3a677e6pssz36aksx0yvd3t", "133615641633430077440"}, - {"evmos18h8kwpuyfzknwyy6va96g25q7wtpjekaglzhtl", "472375047117740544"}, - {"evmos18h9eyde638arrh7fzp2cjm9dksgwc939e84ljt", "5748624586175217664"}, - {"evmos18haex58ngwd5gf8h832l73vym7fry7wkhmmxwp", "2625026332948157440"}, - {"evmos18hchrvrl8u4ujs673fm52w5quhty095zmzxy4u", "835658189364066304"}, - {"evmos18hepjklxkw3n6546dsfh6e784e45crvzlxhkng", "1110573845141766144"}, - {"evmos18hf7s9mhrxdguw3vhrc2hwdw5p7w0gad67msc7", "7598997896117796864"}, - {"evmos18hhm0p7c0fsmkucz93lv39t8jn2zvdum27e69g", "713812782031359488"}, - {"evmos18hjvef0c5k8mv8wdpzplel8y5u9nl3mgrwqsn4", "914505013207723008"}, - {"evmos18hl6nrls750tgaffxuajus0hye9lzd085mqmke", "1982084927006932736"}, - {"evmos18hnecspgq9k0hsvpml4dp2zj7axvxpm9tyh86d", "1027008935113850880"}, - {"evmos18hnwmy6nzj48upsssk30y0t5wggkhnhdgq6gau", "99321953792795648"}, - {"evmos18hplrwz4lx6m2uzfx7xewm3a8a63za3fd0tcd4", "2427987677511596032"}, - {"evmos18hpwuuzrj390rnwfl9qarpxz0he747h9xc9glw", "468400052392392704"}, - {"evmos18hq33fzwf00zf5kk9k82mx2vptxfwzfl0qmj00", "1182632914609694720"}, - {"evmos18hurajwjkc4mnwurawsjrz3qy4jtke76m33ewz", "5622168416261642240"}, - {"evmos18j0dztewsm26da3c2tfd9uu9rt6n33djfs8ew5", "1539655754126816256"}, - {"evmos18j0mtmccdprrn7zd4yrh8425kaar34acp5cfmp", "320566978717837312"}, - {"evmos18j23nlhg9202yu0peknyckr2rsk547lem25arj", "9428243900970340352"}, - {"evmos18j24gpm39rc2rlp0g0kc5zf8v26rj49nyrunle", "1014632205616680448"}, - {"evmos18j3ejpk3lhlh72yhc4yawgg6q7kuepqekh98mh", "101268384327367168"}, - {"evmos18j6y6y7x5r7m3w4cx8fz4fzngttf0mcqcdpddc", "512366919127259136"}, - {"evmos18jcj94kn4twvwyvyrzpye8gq07fax7tf3pe8l6", "3810752897875979264"}, - {"evmos18jd80eugz0szd09z36l8w4ftu3wwmu8xr79mye", "2326295680545186816"}, - {"evmos18jexumq9tapwdpw49v0r0q7xymzke5hdc97mxf", "18650762373394386944"}, - {"evmos18jf2tsyj05wfzwc9zqkmkkgty7hz4j7skrm0jz", "1058531927862935552"}, - {"evmos18jfuvy5cws73xmn73kdjxszvhkywxfslfqe7zr", "11880378516735631360"}, - {"evmos18jggakl5f6wjnavkwa78k06thjq3ff8httnaxs", "2791583225700120576"}, - {"evmos18jh4u678kpcjyyxcg3nj6qewrk2ha0gj59jucl", "3044601988886294016"}, - {"evmos18jjs2u0md4f9k9ts3ev80uys8paw93a2h49w2p", "916851176523938304"}, - {"evmos18jndtgps5v09874zsgvn4wvkflv26xdgqc5ud6", "146518059258460160"}, - {"evmos18jnx6zkyqd5guc4a0ptk05wkkrruqdvctgc0rt", "2982190655925536768"}, - {"evmos18jp3nhvrlgvwcxsd72k0v5nh5uc4znt8nu4esr", "1373194335468077056"}, - {"evmos18jq8q60zf3k6hx8tuuzypndrajzm5lypu0ma63", "15281640384372410368"}, - {"evmos18jqchn5ej2a5gf6lgk7ayg53u7qtg4awafkaqt", "880355660193693184"}, - {"evmos18js2kg0kzqd6a3glmj6d4lqtnlkvx0jnky9lau", "5239515722546989056"}, - {"evmos18jt79v7nzc5an3mac0sflzcc670745lrfdhhjf", "610760989584251136"}, - {"evmos18jthmvmqgkcvtydanucpqdfvhu46amm9vxe6jx", "16168803450068324352"}, - {"evmos18jtr958kvgc0q4306y572lx0ngltrdzyzqqakc", "10486529604263755776"}, - {"evmos18jvt34pewn5hm3ratumzm42p39uyfauwf4jfr5", "18438485364962398208"}, - {"evmos18jwmcye8dz4s7we4ge5y6llekur3kq2uc08gug", "10455895112710184960"}, - {"evmos18jxsscxfjmcvgpcqgaa3ke4fvkw0kn7m49ftzs", "3614490344258403328"}, - {"evmos18jxzjpjece7vl4zh69fgjunza54fjs7jhuhtd3", "1976537889896064512"}, - {"evmos18jz9u4tyx9wzfscs509879fgaqz5hjhqs36l8e", "310747622267800064"}, - {"evmos18k2affkm4cxdqep6s2cn5yas3ysadt0hl6npt2", "3296814692360147968"}, - {"evmos18k5alc3pzlqq9gmw0mkryvpzmt3e7l8s499ezn", "3848779589419499520"}, - {"evmos18kaqss3qmrtseg92vpsumcrr203dq0demhjv74", "50494141229219856384"}, - {"evmos18kdnnfkqwcsjfxsz2flqlrnrujc90np8u8u3rl", "3911442119936417792"}, - {"evmos18kelunfl4nvn6ux8qws6ranje7fdag9sfhfv5n", "34892143694288224256"}, - {"evmos18kjk0petnzdxdmth60ftdq9w3ktyv2vs48dgme", "18673143683998081024"}, - {"evmos18kmrekx523hkg6twf8gp2xpe6hguz8vmplw304", "7723725393988117504"}, - {"evmos18kppsemapmlgg7d670p7rn6n4nm5g6zh8jdnhs", "4907924593474670592"}, - {"evmos18krede8lqwg6cd7v0fu585cg50cwh6cj2j7hs3", "107341469400981504"}, - {"evmos18kvvy4grdxfj49w4qyd00s3npzkujmrgechcq5", "166479394822883840"}, - {"evmos18kyhv2hrplak0emy3nfcqd6ac8lucvq2t9fhv6", "2675267439448637440"}, - {"evmos18kzsmt7673fkrzlmndzqdgype3z407wa7hh9dx", "3029822112929849344"}, - {"evmos18l6chdwzfha70xz8tx6fzkfx6dyck7ffdekcpn", "5701330347413803008"}, - {"evmos18l7lyc9m0kl2cpyvtyckvfs2jc9lwxm6gx3x9v", "883962967971977344"}, - {"evmos18l9c2nast8y2vt5ne8zpnsmwfkcyw539ehkcrj", "3657187828653920256"}, - {"evmos18l9msrjw2xrvw9czh8c85qz68jxwyclkq8j3pe", "1026694078649085952"}, - {"evmos18lcxewukztm7ryash85axjck64y22lhaqk768y", "1693315834671388416"}, - {"evmos18ldd9uas0lp0j4jztzt7m6pwt2uh9sngcgn0zm", "3206605664719834112"}, - {"evmos18lj7ka36qfllvv5dyrpwrc7wyt0gsz5hphtmdu", "813058134779996160"}, - {"evmos18lmr2xq5eq4hzp6qf5wk3rhtgr5g8d2gk37zlj", "100262393476254023680"}, - {"evmos18lnt6zq4ce4kaalynm0wwkkgzgsfhdx59newfg", "16869147097461823488"}, - {"evmos18lphnvzwm0f45e3tg00tq4dzsytqt2vvtscvc7", "5382710946826123264"}, - {"evmos18lqlza8t9pc356h2ehmdcacurygae95qk08dg4", "2184376423583785984"}, - {"evmos18lvd4nvn035xklkld96u4l99cj7cle7j7wm0qm", "471094361729064960"}, - {"evmos18lw6u8t5tqpsrflhyqrf6ghkjdqnx4d3n40d4x", "10863891180422789120"}, - {"evmos18lwmuee0wk627x27nzagatnp0ku72afzhuzufp", "2938654850030837760"}, - {"evmos18lxfrsuamlu0v9hc0jnxvk5k987j8n6dd5ng4f", "455234151743212032"}, - {"evmos18lyuyzz28t473mysa5e8g08sprkxggvpqnj4xf", "96445854554668288"}, - {"evmos18lzmmdukv6r3skhwp657n2mpf0mys5gfduskdu", "13719775978626568192"}, - {"evmos18lzvepf9uah97yhxc089eetccsrymd32t3wwa0", "737647393470889984"}, - {"evmos18m38s4tyyjcpl6n9f4m4edjyzjaqez8mu3rtmw", "640504978663315968"}, - {"evmos18m88zzddwcql3c72gle0pyyema06wfwyfaf4g7", "44360234579205382144"}, - {"evmos18magkx0ngazx0gaq5qryhca0dv98p3h9vfwue3", "1409607844803230720"}, - {"evmos18magxsr3tvzsuq8z4wtpeqza2zxglxsllnkntk", "275235252336351232"}, - {"evmos18mance8farl28ctp42kzq5lzdyut6euxjkc3v3", "384031400921930240"}, - {"evmos18me484t83exl25v8lpkjtmaen03g5xknma0tt0", "6041064433196285952"}, - {"evmos18me7jhjsyhvfjenftkjhc0ksx8htcx7s8e55zp", "767350173027483648"}, - {"evmos18mecnur65ta6jjncy2s3c5va9cc9ng2dfs7pq3", "5101670678682529792"}, - {"evmos18mg8yzvygpcz2hlw9hgpauxzy2zgyjqzzqp2xp", "1433071410853690368"}, - {"evmos18mgar85g00fyc9e2ype4tsa8d2cfurvcswuqr2", "1480594104044986368"}, - {"evmos18mnuzrkrnj0a3ce07zut7jhqwr2q8evnf9m3ef", "7777770813425272832"}, - {"evmos18mp9mwleq35f08p9k3we7a4t42jeml9zkanzv5", "317704279623111680"}, - {"evmos18mqccvku4f7r2we8uqm9dwjyu5a480ge38d5cw", "23313592992865611776"}, - {"evmos18mrg8vyydsa5p0sytj5hclhfah7yxfk843cnks", "1600067115226267648"}, - {"evmos18mrr4f0ry3mmc0vuvzpazjvjlp2u08jvq9mhe6", "3085449277380934656"}, - {"evmos18muwkf5tgtn97l399nt3run3wyvjjql3l6ute2", "1551575165584441344"}, - {"evmos18mwqesngfdmmej3w7jpsn2eg8nyz46cwzfency", "93307117879500800"}, - {"evmos18mx4s75ae40qw4rv26rml7p6qs8tv6u2xj60st", "947603255328965120"}, - {"evmos18mxeaf2yhqz6h3l5hyzw0y0mklpwfgeng0pksp", "369255832923610368"}, - {"evmos18mzufu0u89puwkexuvej4ydp02hsncg8ymcl5j", "522687269874940160"}, - {"evmos18n2fexk4wehmfgv6gtd3tegkfqxutpnncp3ptq", "2103411751481193472"}, - {"evmos18n2g5r9eeqnq3e6rpp43lld9jaqmamelv4llta", "159580487117437952"}, - {"evmos18n2rg3zu8q2frsku7qpl05zr9lgl60fxpdthp8", "41860674670174232576"}, - {"evmos18n2vwj0lsjj6c536mkswx05kfpt72274lam23g", "467266100676823552"}, - {"evmos18n5q0yupn5ynes55s6pe398klu2tmghpckz6ku", "1526614251714011136"}, - {"evmos18n5vlhdjx9e62n9hpynmutfulm46wnsytpznzy", "26897591379340800"}, - {"evmos18nazwycdasvtr242ucd230n5vpsq9zh2mrc7vy", "1293562934480659200"}, - {"evmos18ncmhzzayk4n53gk07qaduu39d9hxfz6lxflg9", "1089551759043360768"}, - {"evmos18neqmugmfr5gt5kfgeeq2kfjrytkjw0cjn2tkg", "7321557756236738560"}, - {"evmos18nfd86fjun302e65gxttg2dx9r9e8zfpfr0pfl", "590340913022621696"}, - {"evmos18nfppwjc6xfs03dkqgu8tc06vxa6unehp9lm0d", "2730805422036992000"}, - {"evmos18ngske94e0ex06l4gp5n9xhtfxnrgfc0vg09l4", "3329313875413172224"}, - {"evmos18ngx624qzjenfdpmeu3gpgk28ndctycw0w0pha", "12083104060085233664"}, - {"evmos18njjcugnhrft8ll28uj229mc98ruxzmhl4umh3", "904784224535616000"}, - {"evmos18nmxwy6m3nkwha8mr5s4cj5ur59qrdlj8we3lc", "2606039398670358528"}, - {"evmos18nnhukmzqlv46g99hys5cpettcjpucpy3ng47c", "198729266964897792"}, - {"evmos18npganp6ratq63yctkvpxxwk9wlx55f34x82pr", "420402079122138368"}, - {"evmos18npxrvxkzkywylp3vv0kqq345r0m7ljrpwx3nk", "1335393193598167552"}, - {"evmos18nqwx33773g4xp6jkx33g7j2kcfkc7p3f99s39", "4253186030796621824"}, - {"evmos18nuhu3smmu2ygq4z8zx2afg9cfrx0pjequz6rm", "3204555855211902976"}, - {"evmos18nzdte7n7jhgeke56xsprvrmqqcfk4t0fg2evq", "30109360949420662784"}, - {"evmos18p2r668twr3lgzjk7wacu9vqcl8wqlm5zxdacz", "26360252715794688"}, - {"evmos18p4twfdllrdnplzwc8crrgcreeqskss5ljf67a", "1280720417944336384"}, - {"evmos18p5l2a8gglcxpnu9qzrqmy8lzv425aacn8uyjd", "3518137523740360704"}, - {"evmos18p5w80c7c5h6vcaexuvercaz64e9ps44m4y5nl", "2263093417406315008"}, - {"evmos18p60jfze4aut3yzayqkpkfas9qp556tzs32nfp", "1616398252275889920"}, - {"evmos18p8k6fctaqa74rgw348uaa83c003wg5qnyfz6e", "2092247761986146304"}, - {"evmos18pdys7yuzvhg5aytrw4gknfgssjfp4vqd92wfg", "390313961953517568"}, - {"evmos18pfd70e4223r50r8pq9l0n88wt8xrf27s2w6x0", "521237510934966272"}, - {"evmos18phwnhzzwkvw878sxgpu9t9q5dp0865k4vc87p", "2201687428600283136"}, - {"evmos18plv4a36qpga94me24eatfzzuhvahjtn8exwdu", "96311446642122752"}, - {"evmos18pphthuc3k55e6uc2k05ln7d5y0dahsmmxpsuf", "10250588616697882624"}, - {"evmos18prrrrdv34667vad6u0uep3h29k65zgpc7nyl6", "683910494632196096"}, - {"evmos18ps3m4v89gv9t06yj74saakpnm8mvgvrrwt6j5", "2720027904535527424"}, - {"evmos18q30jyduxddste4m6njc00sm6xt50mdxz8ylh0", "245257960431105024"}, - {"evmos18qakcj2kdddf844wpzu44kneg5ftp3x8c0jnxy", "67141693074724372480"}, - {"evmos18qelv8rm56w5lq4md8fq3jdq0c7rls7s5u05a5", "6617382495527909376"}, - {"evmos18qjfn59ns78wm2au9awevmc8zx0p57uyrcnd3l", "13717118561654710272"}, - {"evmos18qm6lhypavc2mgdgjyl8pdqf9e52tmc60267fz", "2880831700205346816"}, - {"evmos18qmk4gxh9chxasryz8nqcn5dg2kz53yceq45ln", "4554143032245840896"}, - {"evmos18qmnfvs9qkyudm4hupqtec2ujunc9mtkxyrs7u", "116422485516880384"}, - {"evmos18qqc34lx56kdxswlmzgk89nxeu8w24hj54u59m", "118356120864293994496"}, - {"evmos18qs3f6dl6aexpsfkazfy9hu5hjpyuhg8adu784", "3692392687099298816"}, - {"evmos18qt7ax4wtlszvq55kvkhlmj40gfv4heq40jy8c", "222849532300352512"}, - {"evmos18qxwptx8jkpkngre8swl6wlry6sc0a3vgzs63j", "1662806256168492544"}, - {"evmos18qyllkvglr3ws9m9hxd03kjw8npecrcx7gdx9y", "436826409897783552"}, - {"evmos18r2svscj8lznmwr7ugh60ulnfd64s974vtj00u", "7790723444217208832"}, - {"evmos18r5pmej8hz5tfefdrusvlyldu2pfnk548rzja2", "8601755000756404224"}, - {"evmos18r95y75urdrjuagjsqzu98zs5vhsttmq38h0ej", "11018227638741860352"}, - {"evmos18re2zc5we5zk94upmy3tgdup4zux2qzcafsjqt", "1494128926299255552"}, - {"evmos18rg29wxe8lejuq4y4rg7ercruee5m4wgj9wagx", "3457211792122230784"}, - {"evmos18rhw636c89xesw6n7e6xs4n9dl0hcsfpras8nh", "26707754405074976768"}, - {"evmos18rldnq7fv3gev67mjn42x68z4xu7cv3uvwv2l2", "1355890715265494528"}, - {"evmos18rn4ku7qgcmjkdfund9m8cgu5mmww52clsq7pj", "883950356396803968"}, - {"evmos18rq8dpukm2mvjd9axn4lzsy3kvjy2x3xcgs7ee", "1700844808697655040"}, - {"evmos18rqmreq3hn9pxwx2eu9zj89g2zxsjsjjfjgtk4", "3268099671585617408"}, - {"evmos18rshps94shhdyyht09q79hzeu299v228h6x479", "372867351174542336"}, - {"evmos18rv04mg3vzwce4tmapmyemj4r3qltxehtsy4d5", "2284321483246162944"}, - {"evmos18rydkecyw9r0nv8xuxz654l2adnududd9n4glx", "8851194973511426048"}, - {"evmos18rzcr5mk4a5slyhr5n627txdq4m0npt75c3hnk", "119468823989992448"}, - {"evmos18s2l4ls0g9gn2596np32p4tnhveq9t0u9k9j5x", "1094648002124115968"}, - {"evmos18s5703lqalqadamwkv60chgeahy7gccpcvdpc9", "8049997358764240896"}, - {"evmos18s5pw4jsvxxw5vs8nwttumnxk85twz42558zhe", "601165649489305600"}, - {"evmos18s90clk65dx48ncurchpmg0g9lxg596u639tl3", "3399410228154871296"}, - {"evmos18scg9alfcp3c8rmsvzr8yg9z6sudrx3yeak0v8", "2755496912504487936"}, - {"evmos18se0skwd75mzzhwh85wk9nwlsl5gk826kksmwf", "4677765641765949440"}, - {"evmos18sepcmq45d66xrxnaarhl05c0ec8aw8u0edwru", "1018827244707186688"}, - {"evmos18ske8e7hq00t4up3fcakm08efs00q4w8kr9rwu", "2197452976446278144"}, - {"evmos18skqvgjq97dkpjpgcty5r8ljklj4gzdxpsg6k0", "369170422815233024"}, - {"evmos18snqsjp3mz7grtvw6nnhkqdrd4m65j7d4gzkts", "29568800906913536"}, - {"evmos18sq48h0wvjr5t0glu4qmehhsenn4vmg79p3zhd", "219216005596952494080"}, - {"evmos18srjc2watzx0xfqspkk9kq2f6snh0jfwfhktv0", "65065127752729608192"}, - {"evmos18t3kyxlts79dhj6dk8892htfzavkzxuhaz6yn6", "4349761996017502208"}, - {"evmos18t5pup2wf83zl5cvxpft9fnmwr3qsphexnrlnx", "6564490718899317760"}, - {"evmos18td6klxcfx466qlr6fl7k522mj4ke40rdyej4r", "2378033835475096064"}, - {"evmos18terg3kz42eqvvk5ysxx90h036w978xjgl0smv", "142277446327952384"}, - {"evmos18tj05fxqknw9dej273hthegrnyandwts24zz34", "6327519852766488576"}, - {"evmos18tk084jrjjhddw3nlmf0jcw6t3u8e7x4apz98w", "36153801532580155392"}, - {"evmos18tmedh9tw68xjlkgg9czjaxkhxrmz8hnatwnr2", "4814076765431133184"}, - {"evmos18tnjgl6z6gw3vm5esp5f0m3z423x6j8es6k74x", "1896182321218708736"}, - {"evmos18trjgxuef6f3ll4vg2w3kasqdt2k45gkh7l9ag", "1252474419172382464"}, - {"evmos18ttvmhrg06nm9fhmv58tas2vdtguyd88ctarzt", "2018857202170180352"}, - {"evmos18ttyfhw66k5yr485fqq5wsmawr0t6v550u3g5h", "1182352138756009984"}, - {"evmos18tulnwhj6cqtxm2ts25kd7nmt6q5jfjggcflm9", "844756744156716800"}, - {"evmos18tvw9a4w9k8c9nj7s8t2q2jrsre0dd9drdtux8", "2002851712958861056"}, - {"evmos18tyf9gy3v4gkmx8vnsptjhlcgz45htdwnxg38n", "5726993105379503104"}, - {"evmos18u30mm7w2ce7dpd2uqv00g720fpl29wdv0n73u", "1105518157813181440"}, - {"evmos18u4tpfz45977esgr48jmr7yttulzh4v7qsyasj", "1845297380130748416"}, - {"evmos18u6p37vjw5kxetwayr0k7q32xgg0vy4k95cwl3", "6437290543046459392"}, - {"evmos18u74k2ny464cua8lawdmn35le9d80cthfrgzms", "4214583997819617280"}, - {"evmos18u7rud6ad975q3xepf6fch09pxusrymmcesc4x", "3154854089273933824"}, - {"evmos18u9hwnw8ns6fc6pjvvme4wz0uwu5gf5quuqtxp", "2468463334178275328"}, - {"evmos18uantddh4kagu0efh2px5kf6ugqm08hvumnsex", "6840683220359712768"}, - {"evmos18uerxl6ekwtxzr495uyc5pn7r69q4mtu09anld", "1527689764181475328"}, - {"evmos18uhlrjcqjpapnqt9zy7nfuxw3fdws3jlhtwjv2", "10119199145853296640"}, - {"evmos18umrmgmralg3jfddkfrqqclvu5e9sl9l7fw8ea", "53957400351031230464"}, - {"evmos18umyv55wlnvksjvz8mqx22khunqll7qjj79ft6", "30465463781462212608"}, - {"evmos18usu8qumxeja4q4q9t4r7xenrq00h358zw2krn", "286941083953718784"}, - {"evmos18utzw8tm7zv3ejpd92s7l9wga60lq4zkupy97t", "765980146834493440"}, - {"evmos18uuhla70z6pa4rjlc4cqgqtwllnlhmuqslravw", "12897740479962353664"}, - {"evmos18uvnv43z6namqwwt5ak4xtku0u5tzmj55anp6f", "999642476149614080"}, - {"evmos18uzfukzsy2w33uq5vr0a5wxrafjz9ddycqgdp4", "387387496056406016"}, - {"evmos18v0yhpj4ua2v9jhp0j88y5l6hr6pmul4fawgtj", "50708964919092527104"}, - {"evmos18v3hjedhgsjn2fx4hq7qyuk7apjllgpgp5cj7s", "25284978036266139648"}, - {"evmos18v4gsl9z6vtetanyeu6dke4kuhuqz396hsy7jh", "111460124854749184"}, - {"evmos18v4kqm2u8u0q9rftj22j9m3nf603572wz5nace", "6110591522275354624"}, - {"evmos18v6q80ja9ksl9yhg2c7geryj2gwtrq07wpyxav", "3322280547283697664"}, - {"evmos18v9eesf03vjmph3p3qqgwu67er3ryjkv2m6fyg", "2523412414221287424"}, - {"evmos18vc047wgzgttm668564alc2t2j3nwhelm9ratg", "22186471339091795968"}, - {"evmos18vcdlz9r7s8l4gkuc3mjpdg85qh20dcq9l4ffe", "1461952109080289280"}, - {"evmos18vcuvpamdan7up5zrszkzxqu9r329wl8f5sd6l", "3704819437683444224"}, - {"evmos18vdrd6j5klahas4zxdkuz9z0ksszmsltxktwaj", "31890478079230496768"}, - {"evmos18ve3wfzpc2kyp5zptn0kvjs5mkp2wtzne77nlq", "43447086114122014720"}, - {"evmos18vf47zu8mawprgspsmwvu6s36pe6x95huszav0", "1285996868324444416"}, - {"evmos18vf82789af5krtcqh4gv5l2zm0w6tjlk53feea", "3001476281031611908096"}, - {"evmos18vgmmkprjsxgf7phhk4y0k59xnhraxctfcdu6c", "4071572010566615040"}, - {"evmos18vgq5glawjddprl23f4nqe78f4hhntaejw9vx3", "1384887396581610496"}, - {"evmos18vjnd0tj5tufp07fcul8hs5ch97cgcct6w3lp0", "12187495539947784192"}, - {"evmos18vljuth7n786w8vysd0aedt7tf52v6suvs70ke", "1201433852522987520"}, - {"evmos18vmy28uhturskn2snfr30zgptg0e4fkw7w8c87", "1604936597634529280"}, - {"evmos18vn387zk5h5ncyfscqn2p3veyhdudgks2eqzdy", "51111342886036736"}, - {"evmos18vtjkt68eq83n5m2rvx5xlast266agv3wp204m", "255700247274614272"}, - {"evmos18vu0ddh3hzm9lqratc687xg03kzljq940n9ztt", "1690799218833563648"}, - {"evmos18vuzj065c35f4pxfn670kgl85nm5mfpczznzt3", "1040465927978954752"}, - {"evmos18vzfnjlamup6xtjxxs5fpalxfx7ac8hr6fk2ta", "3944078595226748416"}, - {"evmos18vzsrcvwuqwch8pwmaz6gwtatv3mjrarual2n7", "1994250379982622976"}, - {"evmos18w2cgj7uxv7ee5q7l5nq2vu4rna4k6ffjrk0sk", "384426602445879296"}, - {"evmos18w593smvskhrpf8f2ecvzc85csft9l02ysc05c", "1071224109502034944"}, - {"evmos18w5nrkjt065qt79slgfy07cvv6ak84qys5aaum", "3287902143477488640"}, - {"evmos18w5ud7acsxxm07w05j59g8edldlkh3japr8u8f", "5515653948305293312"}, - {"evmos18w6gjwc77ju79skmpmpx4sls0rjlewlcqgh3kn", "643070756242752512"}, - {"evmos18w93w6s7mcaff87sf0a0ds2h7ch09ky5jntczz", "101526603188589740032"}, - {"evmos18wadm6m8c963f8yq3hzrfpm6dng05nzs8407z6", "6685273720927617024"}, - {"evmos18waucwq94zvannudyglp694hek9jyjl76uyjr4", "17639607830179786752"}, - {"evmos18weqhwkn6n3vq9spp7hcc705pt6xdvjqh2dx83", "815090418280586240"}, - {"evmos18wh9wev3a7mxf6gqmf7umd0xqukmegv36hep7s", "384201315764825856"}, - {"evmos18whk5x3ykyk4z95rvwe9wjfp807eyvsfl7fyl9", "3868492866810003456"}, - {"evmos18wkprpwwvvwj4lc9r3yff040gpcmuxvnjr2pg8", "1006357345866682368"}, - {"evmos18wl4kh58x4paey9u4m5mex9a3nxsdes0c4fmtx", "5304454732970821632"}, - {"evmos18wnj6un8nsh8yurr0ypp3lpwv5e4qk72czuj4a", "5096771046880911360"}, - {"evmos18wqv3ku0588zdksuep0vsxqfqpxsh3udjvujtl", "303557074124768256"}, - {"evmos18wrzdxrluvguhazcscc8twukh6tgngghgr2jec", "214098951437281280"}, - {"evmos18wvqgtktgpc2plpf7vxy0f2qlyqves0vwaq8tj", "164131941680762368"}, - {"evmos18wx866ekmy7ze3cv38nut98q6u3kwutfu5p065", "22776326547270131712"}, - {"evmos18wxk0fsfev78tksmuwr8pf5cp6ffj8llq63t3s", "536756841503859712"}, - {"evmos18wxm05hf6ltl3rr9ydwxz4a2jlx2np49ndfswx", "1309203701701307392"}, - {"evmos18wz0qmsf9wmeudgawsxhvl0s3tpujv30qc83cn", "3776361047283262464"}, - {"evmos18wz76a4z4lchwh4e8ftuhlnxlc0r9u8uz5n0cu", "17762966285562658816"}, - {"evmos18x382qasl0qyeg5xfsrgaxsw4acv0jmrmgu6fe", "3007426846968015872"}, - {"evmos18x57h3e05nwzwxes3l9lrsd3sh2ajkr2h4xh2s", "13680358111030401024"}, - {"evmos18x5lrp87rzanadudmjy9engp3pnxmt0768y4jc", "3705699662965407744"}, - {"evmos18x7j5j7hgrwmpwl7r7577vh04rwy8jru3pffgm", "4069001177093898240"}, - {"evmos18x7l8t9fm5ysqefsw0tls5la6yg8hfajdqcyxk", "6614240265708210176"}, - {"evmos18x84n0xuwpx0n2dvu697v2azglurttr90uy3vv", "709380478647878144"}, - {"evmos18x9v7t48rvnjhupepkdcmmdhyggupfvqltkcfs", "2746954421613296640"}, - {"evmos18xa65aqddy8rhecl54e0lgdaw996kqw46ysuyr", "1308961986616561664"}, - {"evmos18xdt6d4ecl80qz8htkyqtmjlmuzag9mn4sq7m6", "2932592826252746752"}, - {"evmos18xeq76aqxzfwv826xcq27k0dnfaa7p7uxhzkfm", "1676028482265395712"}, - {"evmos18xk39dj7mqhn68glmtvyfulyz8vkxcelawfw5p", "730029237621751808"}, - {"evmos18xn2ljfqa268yt8jz7aggezwh44danc4qk7rfa", "18655378613137727488"}, - {"evmos18xp4vu8q8u2lw05kweqk78v74ejarrnhja5w6c", "1548131218390556672"}, - {"evmos18xq33cjf7lp2xm9pa0dhzgfwepcyvhxf36klm9", "54930930360452096"}, - {"evmos18xrf7g9k2e6uf8fgsnat9c26ctguxpegu4t9ap", "22158539726996856832"}, - {"evmos18xs0gchn5xsctzz4v4rxs6ufkusy7q4tl6hasg", "175238560914837248"}, - {"evmos18xstplg4rt3vutzrylzqkadx6m4pddnltyqts9", "5269924853252554752"}, - {"evmos18xtvdy5gu9ryerfrsg7aklnjwsczz92vz6pjqv", "4286246141746644992"}, - {"evmos18xu5dc6m8hpp232ue9d5gmkasd5f9rgs9seft7", "5858352483966392320"}, - {"evmos18xupctmq7sajldu5dynxgu95x32yuzjf0lpavu", "5450948234311090176"}, - {"evmos18xvgn3ux9nxphdrtejmwsx0paczp7nq963r8zt", "369263843718008064"}, - {"evmos18xw0h9sk3yph5fxl5d57l25az2zuf5m3tf75re", "24402344792619102208"}, - {"evmos18xwkr0erlzumm0uavjc5z965ju9x69uxwt5xyr", "2198490547272681984"}, - {"evmos18xxu48ugycgqjktk5nsuexep8qry587ds4d6aj", "13878853227813425152"}, - {"evmos18xz2sl005r8kfvehzc9pache2u3uks3k2jnt7u", "87574875708293120"}, - {"evmos18xznxj8v9laemjmauz4gj6tkkxj48uq08h4evh", "7666689069184778240"}, - {"evmos18y076dvzut9mgz3ud6694rxnfcasrsmq794pnp", "5372589033315586048"}, - {"evmos18y0tef7f3jjtdklar8tm3xgqqaau4cfey7z2sj", "116279361434007552"}, - {"evmos18y2gftlnjpkfgqe9cc70d8w92zt3p6n24w4z9s", "1989540067407306752"}, - {"evmos18y42pn0y6e6j57xgnvnmw4zxy9f2zudul0506y", "3495756381395512832"}, - {"evmos18y5fcwzmwp0k8g85chdz7hmlfa0n0ntg45y2gf", "11384073860629524480"}, - {"evmos18y6ddllcpp55w3r9aukqccf5fuae3lh9ex3u84", "14070335044510513152"}, - {"evmos18yaujwx4wpuac45fjl3zja0k04yfd0au7tsqv0", "3552859936226439168"}, - {"evmos18ycdnk9hwp566cky5x6ajs7p2303uw5kna20t0", "6063421939171655680"}, - {"evmos18ydnm5c52caaxepqfrhatfy9f328egfcr2ekf4", "1665923245283364864"}, - {"evmos18ydvlfvgnvky0mhe65gygmll4d9yhu8754q45z", "169361285829632000"}, - {"evmos18yff67xmw9mmc6jm5sqhdxmwjhcx3ght2ywhj8", "469442445988932096"}, - {"evmos18yjaqrn2gcuk6x9c5eaw05qr5nt73x4jtrhwes", "8184994925753993216"}, - {"evmos18yjce2s02mdee83x7d33tp45ync2v3mnqn938k", "499214967852980224"}, - {"evmos18yjy88k8ksahvdh82phurxfdx8cv650adw97zm", "7551527193330059264"}, - {"evmos18ynmw8yvt8nk22y2zn5snz52y63rgyjk3mqd47", "1474811664431947776"}, - {"evmos18ypztjhlrmcwqsdnx957ahmrj3v0sljq7a0lq4", "28599480206471405568"}, - {"evmos18yqq44m2lk0q6443t2mvt2zn5extj2qell7cna", "945508058487864320"}, - {"evmos18ytz5jttjzduwehxrwyz2ac8q92u6z856wy5yg", "609876488715804672"}, - {"evmos18ywjg7chfyuksaekzd8y8gmxmw5tc9pzy2qwed", "3390657233114452992"}, - {"evmos18yzm46xludnftmvcclp8urw8rzukewwytznu8x", "3063030976088940544"}, - {"evmos18z2u53eek250vdnedgzqjpw6k5xzfy7sjp6gwk", "5566338158902414336"}, - {"evmos18z58fg2lrqm7cqml2xphv3uxamptyj6w8t6gus", "76962373673379905536"}, - {"evmos18z69lf4shm0ce9nq5mnjavfhr6pf26y03ul5df", "3516387903718789120"}, - {"evmos18z6g33jfkrrxyvhsch54hjqysdsaq5y2jtvqjr", "6537671210342502400"}, - {"evmos18z6p84suhjs0zun6xqyqt9959m3sgrvfsufsqq", "5149115156961787904"}, - {"evmos18z7q9sw2dfdky4zddzlqru0vglfngdr2pjcep3", "25080989555026313216"}, - {"evmos18z848ew79h0x58g0e6cnfpw9undv4nw2yssk6y", "316913583735210240"}, - {"evmos18zc34gz4g6pzcffpw6t3evc96cxnstjpmrmpas", "35999036377926066176"}, - {"evmos18zch2a2azlnfvuf36nutyt2zuk8r850c9uvxr3", "1233120003126899712"}, - {"evmos18zg5ued5luwxq5yymnfer053ze6zwz7lszpq38", "5139516823256308736"}, - {"evmos18zgkexx2nk5u73cuhr6ah5nd9ayldafcmn28sd", "11275296499980177408"}, - {"evmos18zhrky2k6g2u9ja877cpetew6ryqderztp2as8", "1162827672655721984"}, - {"evmos18zjr2zuwcw3ww7djwkq6ez6cfxv5wt27lkak4z", "401268018043093504"}, - {"evmos18zkew7aptq5m2m8ul5z0l4tmzm7n3lun7sgx4l", "99963780872942848"}, - {"evmos18znawddv50ynnuvf4yh5rnqlxndzjp74ss6rk6", "9438813038965407744"}, - {"evmos18zpl65gp74zlwz59k0ru0s8dwed4kcuyqehddm", "20087914538308403200"}, - {"evmos18zpmj8329q3nd2yzsy3gf0cu5uwzrxfzhrjjz0", "475117623724534272"}, - {"evmos18zyqssm2rwlnc39s49xjdz70paclenuazh87n6", "64908440452579786752"}, - {"evmos18zyvfy7w4mugyfyyrpe2sqhuwx6rn7uk2f4eqe", "1840859250008924160"}, - {"evmos18zywc9y2vwlc8tql2x9n5eg9tw0n2kac63hdzh", "38805110918747406336"}, - {"evmos19043g6z9ean796c0fnhmr7endxy646wtjghs5k", "3462572499145100800"}, - {"evmos1904gvetttyuyzjlh2s2w3y6gn0pc9ez4vxg7qk", "4961725113160855552"}, - {"evmos190afw8x545deqmftnd8dqp634mn9w5vd3q9q93", "5678582985091751936"}, - {"evmos190dt5qgjmyaarcspmyem294rdg7pu2kwkmldgq", "39537471814548250624"}, - {"evmos190k5ca0dv26glc902fcxcung829e5mzlqnfqhj", "1085992397003824640"}, - {"evmos190ksw0wm2aek2wvjfa25asgdyjxmsmfj9z9ydd", "1193276875420786688"}, - {"evmos190lev6p34seffckjcxm2xhzkvn6r6djds0n6je", "5926960177141091328"}, - {"evmos190q7lrnzhdmszyagsr880ar50nfwht2vlecvpk", "530386393715341312"}, - {"evmos190qjqcwgjyjst9uywtpp6j3rmdp67c4288zljp", "1899718894409091072"}, - {"evmos190rgxnrm3aphx02fg39w3n7sjyl0dzzncnmxwz", "1792405987811532800"}, - {"evmos190sgzmlektdtwz9vym56hd6x527txjkd593cta", "2216738078855816192"}, - {"evmos190t5yfr4sm68h6su3gwvmfurvrdrxwftzgtyhd", "1701869718238673920"}, - {"evmos190wajz6f4a8l8q8q5mfvwfuv2cm6va4lhd9l9r", "14475507750019891200"}, - {"evmos1923lw0d4c2kr5x5ff2fhppfdy803qj5g2f7jdp", "789589898683129856"}, - {"evmos1923xhqcstcq20c2fuf6xlmstnna75wr9flfr3t", "2928351579245846528"}, - {"evmos1925kumqqd57z4tsfw5mk2qypr62p4pzl6xktws", "5408480939502551040"}, - {"evmos1927c535lut6pgte2n0tgkt8rjrc5qw0r7spqmj", "1002572582486800512"}, - {"evmos1929kuuc3sxs3es7358fdrsappwkzdky6xavwp6", "4217924640590571008"}, - {"evmos192azsukc3k99fqhjlhccfmz0x0tkgd4c59wu3p", "10455038831569330176"}, - {"evmos192cc3635ds4ly6v7vqxrs65hpc0wqm5aw6ctva", "25367713616916480"}, - {"evmos192ch8tdqzz3fmc7rztkup4knjcyvd95hkng5dj", "71232097995214241792"}, - {"evmos192djxt4rlgh2kednus9uhh0dycwxa46exvvek2", "769542163980488192"}, - {"evmos192fpjknppusl3kscq8lew4425yf3nmmgh33kxp", "3653306388966754304"}, - {"evmos192k7uffh9tx4y4xzs4nu7pff82vwpetd2jk8y3", "1002542041501462400"}, - {"evmos192lwy2f52hctdqp6svn2kmt5d3ep67xgrq2cf3", "3036187625254656000"}, - {"evmos192n0r8lyj50l0jlq3ue3jsamh0q39z899ympck", "634908656807211008"}, - {"evmos192ruzdzsyj45vwkvyeqhzfxyxwesd87aqaf4dp", "3161820634386509824"}, - {"evmos192u45fk0ncasr488scca5v2v3t7ldsjym53r67", "134082547922485760"}, - {"evmos192w5qqvtnksdvkkz6aarmuyegmam8l4d5dzaaz", "1695563068955115520"}, - {"evmos1930y7wkccmpnj69rrdzn7d4vha08w7xpkav8hg", "6468427158045401088"}, - {"evmos1933d8tcr4tgg5y2jv5z70lze8c09x73ac5nr4e", "1542652582670501888"}, - {"evmos193565qxn4u09zje7n676f8daem4yf26ve0tczm", "8427030950274668544"}, - {"evmos1935e2ccu0zy6mhq6k76mc4hvp8f4kly0859auy", "366804890169079296"}, - {"evmos1938gewycw798ndvej6jtu89fgk7fnrtl3w896k", "13716761881879197696"}, - {"evmos19390kmt9xl5p2yvr420j2l2stll890augg7uwq", "602425276629624832"}, - {"evmos193frevgzt6a9mc6ed7egsnq8g692tclaku9hwn", "1130607637867417088"}, - {"evmos193hlrss86fh7tn20lgt7uslcgryznge57t8tp7", "4440927735647419904"}, - {"evmos193k7dexzksvu045t0m0r43qrqkrv0wp7jacshy", "952422727662772224"}, - {"evmos193kgfayszp8jyr7x4wy3wz490g04q7707zsscn", "2167785682364891136"}, - {"evmos193lvl55y2fcwqf8ayvu59f0cv50l8672d3yy33", "314432418293982208"}, - {"evmos193m0vrqmjwwdlnnv4dkxxfxqtwhqvaykxfuxsa", "29271630854879784960"}, - {"evmos193nfre5hhcg3m9vn38mjzl64l8zdrrazvyy3dl", "430003196914927616"}, - {"evmos193nfw9470nt59gpvugk6p96v0jjwhndu7u8ns4", "13654856810649845760"}, - {"evmos193p5se7j3kj32jwl7ahmzf7wy2u653kx6s55kd", "10449740856515067904"}, - {"evmos193q0kvd3hf6k2eu2gnhwrkzp6qaccwxweq852w", "253670472832649216"}, - {"evmos193rv4pxzapfe7gezka0mz6p88cljqt7quy20nk", "48335925478415872"}, - {"evmos193t0xg6mx5cg3e08yrra5f7056jvdjtyykmwat", "2444096635543470592"}, - {"evmos193t484g9ctnf88vgxrkdnxr6glcw95npeey8r4", "7085568563814250496"}, - {"evmos193u7cxgzzgudnax6shj94svzwqlkauvfxv5ta5", "27906603131578368"}, - {"evmos193uz8kx6vmnvqqcy5u6z4j4xmwnjun7hlrhp50", "1046264871315758080"}, - {"evmos193uznpjcyj3mmwp0f552k0sjajrvd20vqfytef", "7569136306234662912"}, - {"evmos193v4rjg0zaw9wez3junreg9aqteqz8wxfyk906", "522685307429912576"}, - {"evmos193ye0g5te4wumpcgpv3qnva4ew33xljg7qql89", "4248245300100235264"}, - {"evmos193ye4hmfvkefwudxrvl4pysqrv0a9kxsdy58kc", "441292055615563520"}, - {"evmos19427yw5fre0h4fmaswl2supnd55cdqp5vlzd7q", "24911003993300324352"}, - {"evmos19430j4dr5x9ys5s58l365qvnv6tylmew4el3zw", "2608264307779756032"}, - {"evmos1943h3q3ut35uq8qqn88jzf0rljfcgjsv4k7gds", "6196009538815918080"}, - {"evmos1945v0nvmcqs52z8zwa792nzq28vmvu693cr372", "8889234677416701952"}, - {"evmos1949juev5nw430c6p2s7rfzu34awa2phpdvfp4m", "695864059782012928"}, - {"evmos194dx674cy0gtk3x0ctp4v5wyhcztg9klfd53yd", "5204786534312386560"}, - {"evmos194fya74zj9m9nkwzph893pdf8q3hj6d5f4xhzh", "497980052979347456"}, - {"evmos194fylj6yxz0qqn4dyj63c2zmv3uyxnnf3kk6t0", "2778114353285874176"}, - {"evmos194qglu4flwmgnkhr35c83p9xea2ee575yh0gly", "9006498339254636544"}, - {"evmos194qzqhgfv7y5w9lq8s7nf8hdyepxwevnrheap7", "2078539534111880192"}, - {"evmos194u3d49mvceqk3mtvx93frz40z2434xcnmn57q", "1634130862536636416"}, - {"evmos194uqdynczqme8q3k4mz5urx68stsqclztskk7x", "1262077938669133312"}, - {"evmos194xdhdjxq2dx6r48jwdzwssl4u664s3p6lmuy3", "16218969189370638336"}, - {"evmos194yk3c39ppvfe9k49ca7gn4j9f6693c0a0w930", "981055720556265984"}, - {"evmos194zdt3hzg3qz8y6navvlfd4jce5akq289k0fs0", "5383294088370960384"}, - {"evmos1958jdt2fmzkuz0hunez8gytphx3lqvnq8mu9zc", "265168043195631616"}, - {"evmos195aavrgzdzzme7qqklvdez5lv4t0a23cnwuchj", "1432343609952612352"}, - {"evmos195ck9zgwp2qmkr62raj73pudyzzn7cskvdlvf5", "40260394476799655936"}, - {"evmos195eamdjw00tpxwcrtvgcgvsnhn7x7srsv5wsv0", "14037538374468743168"}, - {"evmos195gk49452l7hzsr6ry7yzpf2qyfren7necn4hk", "888662824078656384"}, - {"evmos195hm2jpaknm36fv0vmcv6hql8sh9sqlqas8wjm", "2006842459077132288"}, - {"evmos195kf6u82yq2lh4u9muk856qv6j8vs8302ulzrh", "471716691746249472"}, - {"evmos195ksamvcvvjrjkgq20uftkgt9ua3mjfds2rnfu", "514819552269688064"}, - {"evmos195kypk5rj8v3r8h78dz0l7qnz40hpmwpau8c8n", "26108091023207821312"}, - {"evmos195leazlqyzswtpu2srmpffj7zcwkk7ccw2gzdd", "287558115766726400"}, - {"evmos195nua8anl0tqhx8exkmp4swwrhn26unkx3f54t", "3070071191411428864"}, - {"evmos195q6hxd24vc0ye2hhcp0teysm7m8fnuz7vkpdm", "432444442706358528"}, - {"evmos195v2v05qsfqgfn4nrldjzdq3vqdmkdqr3s4r70", "3023988128436870144"}, - {"evmos195w9ky0cqf0zlp6rlkj56zk7vrxf9egyeukxse", "4860719438502719488"}, - {"evmos195xp3z9gnf2hxjh6m0upu6g9ha5zchj08ck5fp", "1269965234017997824"}, - {"evmos195zfkwswss2989nhwv342330uk58arwf6kyerq", "9099730802113216512"}, - {"evmos1962yqqgxlhjpd7k0cj8t5lsy4sqar0wt2sg03j", "93025950821108514816"}, - {"evmos19635a3ntn887mnz4z5mc4g33vn0hl6dfc9maut", "69759180995075840"}, - {"evmos19647387jfjlc59tpxz2ah6y45esn09pfnaczuy", "26599019192316747776"}, - {"evmos1965k34dwsvdwwt3r6c7fllk0pqctadlf32zmq9", "7374216223048355840"}, - {"evmos1966n2w0k79tjswnnrqs69sl25w99ys0ly88td2", "1429575943573154304"}, - {"evmos1967la58uc9qezmgkx92z80twn6gve9ts5uesl2", "384318388316961280"}, - {"evmos196czjwwf8t9z4fmpuq3rfw3zkagnngsjddsjuw", "56472638427002535936"}, - {"evmos196d7lv8jg67mhhxy35n76g9l688cra8k6y8zvr", "316306840778705920"}, - {"evmos196dlp0ly39h948t2tw73w675m9smwt9eqpyy55", "7117580595833536512"}, - {"evmos196e354dtll7rxar889hmv49futygfz4nm7420d", "10080414226261012480"}, - {"evmos196gd73uu6vf0ax82hy58wnr43snk9vlwt43dc4", "97180757410909440"}, - {"evmos196ggaxaxt4xc0g2jl2qhl5me54l20muvljktu3", "140510247928902909952"}, - {"evmos196gne0v7wvtuj250c78elq5wt08hk4q8c9x2hk", "1341494598517510400"}, - {"evmos196k9e6fsxeagj7rvsq6zgdewsymm33e5evtlch", "7068108582288793600"}, - {"evmos196qznlswszv8umd683j3r74kgkqma9957uqv29", "2887622570068662272"}, - {"evmos196rl8nswj532ekxzckf3jth45azmtt3tp8gz2h", "7206092312910589952"}, - {"evmos196saunltfnfuc4rjmu9gl7gn95fsksjg6ayj4h", "4350355545228839424"}, - {"evmos196tw6g5pcvrfc6474ewe2c8npack639462tgst", "23021699680901918720"}, - {"evmos196znn4wsce6hp9xm4qgqmqa425pcy5fkxktkjr", "4183332939924466176"}, - {"evmos1970fy50e3n9fcyhd53p6q9229thqs574kpt9vp", "3735515796387840000"}, - {"evmos1972yz84x2ydx2szahdt2xvl3hk886694k9xs6w", "3917708124833308672"}, - {"evmos1975hf3he0acsqzxkqar5yu9pafwzskg5musvcf", "34608509441637036032"}, - {"evmos1975qhq0gae5pnz0ww69r2p32gszvms7umda2ja", "2964798280915046400"}, - {"evmos197deqylf2xsusvgvyfd7qpkp5d4hrkzzl2nvhp", "11759011200039362560"}, - {"evmos197dvy9yy72m0wf62a6q465ff8d5kc4d5sqvy3d", "2392520944948191232"}, - {"evmos197hljncjx27jrsy4yqfs7ka754uklt8ygp7rl7", "10478965698079334400"}, - {"evmos197kfans5uv27a7zut5yp04gz09aamf67cgzhdu", "402588177011057408"}, - {"evmos197mwrpwawqn9mp3f3jhhwkz3ycsy3e6vmxwcwp", "733622677447212288"}, - {"evmos197na75e3uhg9ruw0y0x2g544kep8s9z3p03zzj", "221770059195530240"}, - {"evmos197qyg4uz978hkch3wz77vu8tlf60c2p4aa8q5e", "11193358489515714560"}, - {"evmos197r4rrqqp5l3lp3rjcl0fsjq3c0g3lg8wuf6xe", "748312175320530432"}, - {"evmos197rzl9uyqlteljl36r76ste3v9vd60x4uksaum", "440046043814821888"}, - {"evmos197tghg53xu8s5slxqld25rw9x7z44jegm5w667", "29878081627676303360"}, - {"evmos197us9sun995utvtqwk6k6rskrglz65jdxjg2eh", "385979708590806272"}, - {"evmos197wwu9j7tvnlczx56p2nqryrepfpw27kdpvnf5", "5664083640135782400"}, - {"evmos197xyew8l4jlstdgm9mw8c57u97dead4pwn7jlf", "1913603173035028480"}, - {"evmos1980340wwxy2a48ymxzhcamnlzhpl74g8r7g5s7", "929873531640777728"}, - {"evmos198229462s8l8352rs3k6vtxxsdqkcxw02rtph9", "147239328721298432"}, - {"evmos1985xquhwjms7c5h6hx9msaern25kz6w4uy9n66", "7738244636189260800"}, - {"evmos19879twhj3yl5hhkmtxnkscxhlpp68fl5c4t5gq", "45272244804563582976"}, - {"evmos1987pmack35dj30c0recjc9mse053yuq4wq4jkh", "45092527599246336"}, - {"evmos1987w342ktz7c2cnqsaawvmtwcml3qs6a8vf9nr", "16129688354949795840"}, - {"evmos198c9pmf2yeztkvvr0trquldluexhkcs07u2kyp", "30440131773032407040"}, - {"evmos198duj7d5tvh5tw9mg8mp97qdek9jaazx5nyrf7", "2345096444574354432"}, - {"evmos198hpdpyx25cqurfkvy59lzqu4yyu6vvuz8t9sh", "97718930433933312"}, - {"evmos198nk4nz38dkr2v8tpgc605hyhndthaa7ut8akc", "2421100844255965184"}, - {"evmos198qfnc7sx7e8p047cvvlqrdnrmfhqzls9w32ge", "1914637029740363776"}, - {"evmos198qnjfvh9tvj983gr43gw965pze83zmealpgk2", "219671901478189056"}, - {"evmos198qu0stf00q8q8nlsep8ted6ks8kzcu5m9llye", "1596557510349921280"}, - {"evmos198rh48ltjt3cd7ae3380fuhghzj22aan3j365j", "320538487523264512"}, - {"evmos198rlh0ewxd96384hh390cyss3zrmq672a4yzjj", "17657496197510946816"}, - {"evmos198tu3h42xfj4mpdwk7mktyv6qppfgg3uedtlhh", "1132606173824183296"}, - {"evmos198u4jf62s4u2w44ktl4xncw0vhkhn6jwqz49hs", "1384811689122029568"}, - {"evmos198vz054ks70jskf5z0mext7kjg6d6jjewy5hk5", "2216503573680461824"}, - {"evmos198wvm9qad63uyewlvugz7q25hcpve2cx5dy7gf", "5723577877731672064"}, - {"evmos198yp203zt4md8r7ex5nm3wqzt0xchmest2gfx5", "405279369461871616"}, - {"evmos198zhz9545va0ll74v8thfxrm785k7y9ktydpju", "112336218889187840"}, - {"evmos1992mxmhqgsxlu26kvrz43sl0c945vffrxazss5", "4838710555067803648"}, - {"evmos19952hqzfkxacj7n7x5pyly2pqe34tj5z5a30a3", "2586448171590874112"}, - {"evmos1999kf74qefaxecdaa8umzup8v830hp4vz2uhzg", "5511228654780923904"}, - {"evmos199akzxf387nd39k88xy5ys7z02670xlyrfskqz", "369557013756546304"}, - {"evmos199avdda7y4yjjl6c2xpgvual0vt2spehhn8p3p", "1129996731140698112"}, - {"evmos199d6hf5xv5eah976d8sy693x33atc3nc024g8j", "1322673162261134848"}, - {"evmos199dqveky3amrcc899zt8znn0qvj7j9xqarmhl8", "466656271967808768"}, - {"evmos199ec9v9k5cxkvzghn9w3e40ux4hqu8jcx695pz", "28669692280369250304"}, - {"evmos199ejn8hg53gfy39qk7ca7veu24skn58ctkcdks", "4213553978787143680"}, - {"evmos199f897xjxk95y3pq85zx708euykf2tdum0pkah", "1520772080471553024"}, - {"evmos199fmr02xxtpz8et0m8z43a4p4r7ftnrpvwdepy", "704163345620733440"}, - {"evmos199fy2exdrg5tzd6mcyufgt0dn49xys65vd3km4", "2657578155046734336"}, - {"evmos199gmrac930fvqhcpj4qq93zshtqgwwz8ze8r76", "8678562835029516288"}, - {"evmos199jdv9lav2v55egs9jpdm6p2u3kh2qll2k3p4z", "233001106330193756160"}, - {"evmos199madavu0l2zkj7twj5d5t5yv6k6zm3dr0u5p3", "25216956551380832256"}, - {"evmos199q05vuhcy86ndnlazn5zxajxfujlgcxyjzawj", "4868660405343535104"}, - {"evmos199smqtww39k45ca40xt6rtsjgumdut83g0z2mv", "1734080896461331712"}, - {"evmos199sq4a4zj5p5ckha6g9qzy4xr0vm6jgmvc40kf", "478840817291067136"}, - {"evmos199szkreg8cxmduc42u7smtxku4uwuaf5y54fcr", "18230950555878330368"}, - {"evmos199tcsqm59eja5v52c9skkvfyfgmer73fyv8ns2", "33163723737541443584"}, - {"evmos199tepusp4hx3wy3efnyeh3ynj8tje2fr8cjgsp", "34621232282771873792"}, - {"evmos199xav70pd0f9dfasdjrky9l8sj6a07lr8gvnx8", "865852024667572224"}, - {"evmos199ya8eht4qvjw5ht6z4l32nxlqpju7ygw8e8eu", "1350719218310864896"}, - {"evmos19a0jyga62atwk4qr6p0apwwlnll76ffln67637", "6184420102056230912"}, - {"evmos19a0l2ngz3lseqkhc8kk3zclpyqntjzfuzqk9g6", "1376232318484740096"}, - {"evmos19a0u4j0hcs5gtqfd9xvhkru7p2jn5gs05xkavk", "524102334456715776"}, - {"evmos19a27ywxfnppz058hads6tmdgyhk9xk4w05920p", "38313380286659977216"}, - {"evmos19a4d2avet34umu0lmrv9rvs76nt53e3v0y9ldj", "19375295688186740736"}, - {"evmos19a6qgj54vrtzerj6cd3tr0wxhtmekanq35l4yv", "2849357768587030528"}, - {"evmos19a848mpfx2epl7ahyyqlfc04sjqu0m2w6zn948", "8734222388179042304"}, - {"evmos19a8zt7qhykku2wzhxmrxgv5nudwc0ugkljf80q", "30663237299681550336"}, - {"evmos19acc97c76mz3qtqkf2zy9k9lpj7ykn6zg7zlnw", "6343838218960966656"}, - {"evmos19adac0avrtmwuqv8m7qf3vu4mj9ms8g68t498l", "4043143335343833088"}, - {"evmos19aeax9zts6u2l7usnx92agxhq9dwlz4dz8qrhj", "3083973993021855232"}, - {"evmos19ahzjqlykj6wvc9mawtx7x5slwem94mdxfl8r2", "183092444443838464"}, - {"evmos19aj07vjth788y3q9kawsfps94r3na2p0kgypw4", "21239283536750739456"}, - {"evmos19akk04rqvv3eeeedxl0m8yelsw5xd0vnplwfra", "4881635842596470784"}, - {"evmos19an7ah95s88n39cfxx204m6s52p7gllml9m5e6", "9067078687996444672"}, - {"evmos19ap4x3m3fwhjn6e7qadu7ken6xts3x7ann7tl2", "4028913250101262336"}, - {"evmos19aqefh4m9y27sx8k4hwftgk3ua4nk8n00kk294", "5655863729180291072"}, - {"evmos19asdr0y6sr5srwdayz6r879fg8emd90c9lk4gg", "833909219727890176"}, - {"evmos19avtwgyv3ag4hqf7kkze7ja4r7ngd58e8yv6la", "384314424118280448"}, - {"evmos19awgdvl2x5n08lhu2zpw8r2x0nazsvl8ua8hw7", "904145156590553088"}, - {"evmos19azrc638r944keujkd3ykqu39s3junxsz2dzkl", "2006363210788069376"}, - {"evmos19c09adc44kqsgwj5s4hef2qmdlkd9rp8xv4ymz", "29228814466831794176"}, - {"evmos19c25xr4mcu9y6v4umrvlrpsudzng3z8kk9wqzg", "778646387596500096"}, - {"evmos19c4cz3sh2vddq8ua5nzxrycf6w3z37zr7mqz3v", "763731456950171648"}, - {"evmos19c55hzy0r38cmul7kdash6fjvpa3pglh58m3eq", "8716472984369670144"}, - {"evmos19c6ezm6qx59egljs0e27x6cqfknzmvvalmu08q", "386191955258465792"}, - {"evmos19c72uv33hfk3k0xzusv3yjfwfm2ja2vujj3zpp", "8678230429971162112"}, - {"evmos19c7gn034v6trvccgw3gwrvlce0tamx0c3ycrlm", "1877871161584229120"}, - {"evmos19c8wkvew3jpfe6wau8f87rp7dx9lj2e8zn4fct", "474709389390580224"}, - {"evmos19c92x0evcfmy6dp6xd7kp5wlzzh48q49ek3kdn", "4375718025905684480"}, - {"evmos19cac7j8xqfqduvzvjml082v044znlzvxc0mxl9", "1310654818853291264"}, - {"evmos19ccqejaxamxup54lrqkn5uursk6z2nw6u0elg5", "5594971551850102784"}, - {"evmos19ccww5ytnhdj5q6lagdwsa4z3vj678yu4j6nlg", "80145331494779904"}, - {"evmos19ckd5k8gwlmncdca8efpr30asycfz54f6qvula", "13064359409851629568"}, - {"evmos19cnzm0qwrh58jkwtexjauk83c4vtwdhlncsynw", "14854796464108494848"}, - {"evmos19cpe7ws9pwezj8svudxnrralr0yeaanc7ju5ye", "4479837027243866112"}, - {"evmos19cq2q8yh4m05vvz5um426ucyturlae52qc3lrq", "5359423035065434112"}, - {"evmos19cvjtktnt37gjmulsrp2fy39knfr4vw9mtvg33", "1999483522824773632"}, - {"evmos19cxw49trnjh0culgzkmqmdp9at3pqdrh2c0vpe", "9237907068583323648"}, - {"evmos19d2k5kd39l7w7qr2w5lqm8kevv4e3jxa0fql7m", "367113736744458752"}, - {"evmos19d2xmrzz76m5a8zsg4wshpthufnxywr7chvuj0", "16112766134873745408"}, - {"evmos19d3s7m26369c0zq5tmar0uwmzpu73u5gj9q8yr", "4191408503274684416"}, - {"evmos19d7v2wnq8ydlfxar26kp8szhf84jlndczghx64", "497991971141190144"}, - {"evmos19d9rlzdlqf3cqmvy6jzt6tj69ph6vuj2jdtr5f", "2488041807523855360"}, - {"evmos19dcwvncra0kaag4qcag3vhu34pclc3xkmug9z7", "6617208119296560128"}, - {"evmos19ddc479d6ez3t5w30szvzkrs26dtav5j4uv22z", "29769216462302375936"}, - {"evmos19ddfealxj3yj40e6dq9t0vqgzsxdj630rxdysl", "16636693800027299840"}, - {"evmos19ddqhev5pd3au8kaen98hkthx4lzfz8dr9n9ft", "7319517904119876608"}, - {"evmos19dn30q5f52fwk54w5ceay78kftpvw4kz7cn24d", "2086797097842673664"}, - {"evmos19dqy76fl4vdrfrxzqtet7rfskc00s3wswpsn7m", "1440021141780438016"}, - {"evmos19dt7dqhztatsn5004j5hxjq04yjs3pzvk6wxzv", "1127142711330323456"}, - {"evmos19duv5cgup22wfqf27qa0ngpyydtxpdgne0malp", "4593131325497279488"}, - {"evmos19dy9qzqqww9ufhc52dpvzxf2p4sx5rn5skc00w", "10563300925027606528"}, - {"evmos19dyl4j82e99h898c4rz26dpejj9kfjh6c3engr", "740440051444500992"}, - {"evmos19e0lqawnrjqexjnhjzlfm934c83nhzacdckk7t", "936156696655819648"}, - {"evmos19e2670v3akpgnj4wetq2g4c954zkpkt8xyxrcf", "34576707365599854592"}, - {"evmos19e2uzc0lt934wa74u674xfqyrwq2aqp5d68s5v", "18104603079885930496"}, - {"evmos19e64z5jusvuna5gg9wfjwuh8m8erllqgfza6pm", "16225736614944962560"}, - {"evmos19e7ctf9r5gez9g3hvm3gcvz6pqpvmxrhsxgp23", "8503229121455919104"}, - {"evmos19ef597qvr9xae6dh57du4ue2al9mnyqunvkwcg", "275375040690026496"}, - {"evmos19ehcrqfrmj3rg0kza2gmk5vpd7wpla2f5tnwsx", "3938874234918391808"}, - {"evmos19ejrhrlgahrsfn4z0rlz3npw2np5x5tfcxmaw6", "2020761469022457856"}, - {"evmos19eke4kagzexa0qvsa5u8actaafpj9ez8txgpyh", "3291619786994691072"}, - {"evmos19enupds739khw7jugqq2tvyczmjnwlrtjeqvhm", "421910650598504448"}, - {"evmos19eq9flzvn9nm0wtrmzutr6e67v9src4vu9dn0z", "2698314861642252288"}, - {"evmos19esyuq7shy8g4gzchw9mvvf7wjtqdqevnm48ej", "2803798361012142080"}, - {"evmos19etzgyusrp095cm5scxelmmwn893awelsex2uu", "20110222197989376"}, - {"evmos19euhnvfzw947z942guuc8zrlfx4kcrky6m65ee", "1207480367974586368"}, - {"evmos19evjgny99snj8z5vfe7u7z6x7dham4h4d67s3g", "83266636584507342848"}, - {"evmos19evqsd4vf3v9hf2yu52l3xv6zwv0w85u4j8f7j", "45309475603404544"}, - {"evmos19exn3vq43a62r8axswr52a7zh8zx3l4a3cq45g", "1700390041334505472"}, - {"evmos19eymnedq3pq2rl5qyzgmn2l7gm0g5trer4v2gd", "652322017373966336"}, - {"evmos19ez36vtnxn7stcac284scwlu3nteazzrkpp0v6", "5343312809458862080"}, - {"evmos19f2eyryxk7e80257gmwntdfy8dczf4x6egl3eg", "1589663883295164160"}, - {"evmos19f3p0l05gfumlq46dt7528fqzwmhd2aeysqhy4", "21778844183807500288"}, - {"evmos19f3xxgzkz3qqae9cn9qdt3kx34w48mu4cwkznl", "38787941325253246976"}, - {"evmos19f5jn8hly6srmj3wps9d8yqamqwgu73nrvepp4", "8063164882343970816"}, - {"evmos19f82esykaf9hmrfj6rkkertnrngx0vkha9em0v", "3802523254332903424"}, - {"evmos19fc9r47thmmmdzyl3c28wspqk9jnh9xp4acqjc", "15356558958800896"}, - {"evmos19fjh9qlls6ddef6upaklqq84rer6gl6fj7m3qd", "237510617227145984"}, - {"evmos19fmsy0xy9sx42vwn05t8vrx6r5j99yx0uqmru7", "4750194266089771008"}, - {"evmos19fp898grus33x7e42p3yfg8tj5vvq296up2qvs", "2990716540430162944"}, - {"evmos19fsafltlmceu5pwmmqjhkwqsqpvxe7j7f60nr9", "7999727681682250752"}, - {"evmos19fsqrsn9f64sjmwvaraeurjmfa55re69yf3muu", "80022415354333184"}, - {"evmos19ftfyud7ys7npzuguwz76v3kqj45a6l9va5nt4", "1612741952182306816"}, - {"evmos19fu5y8jmmpnk3zdh0yzk9q59e2028zlgk6mmap", "267999873603696640"}, - {"evmos19fzgf4dvxu2t8acreflxh4r99l8p2zrlznzpld", "312708071081856000"}, - {"evmos19g0exhupwhuepn9umu4cekzzz32ztmzhhnh762", "2058804691093622784"}, - {"evmos19g4773ajva6ut9z7eqq7xqsudhvhhy7jex5zyt", "1322996586682783488"}, - {"evmos19g9nwmlmpk7uad30qgvjucrs6hdhektj3rvwus", "389617764507513344"}, - {"evmos19g9ugjjpg4derlrp0gatwl8wjdn3hys5j82fpm", "1871151463358259200"}, - {"evmos19gc89v77u7j0u0666kfj90kp0ywgutme2z383p", "196709401587233792"}, - {"evmos19gdsn2muvugglnu3ttw55wqqguukczfxy7lkna", "24920006944119627776"}, - {"evmos19gepey8ylw03pmyu4p6eruu2p8a2s3zzkkd468", "5747565071377818624"}, - {"evmos19gnu3nw35knu39wh3x25q8zfrr4rwkl27h56e4", "384544357303038464"}, - {"evmos19gq4ykylez57dpugdcu86sd2j4ncpsfld0r6vt", "769790375305341952"}, - {"evmos19grt3ar85ed3a3dar64p3227vpm7jgtvzwmcc7", "1157400221750943744"}, - {"evmos19gt07gpzwz8k462dzygj3qg7z42207ckj88mkj", "382344551949723136"}, - {"evmos19gtn0mefh2d3cn2rjwzf0ruwufpg2p79p8w0h6", "1131083553249488896"}, - {"evmos19gwq2df32p8as367ftcecnn0jn9233ujztt7ty", "3200355921249648640"}, - {"evmos19h0r6ea4j5mynfuc4ncvhs2fju4q7k5dscn5nk", "1053509914245604864"}, - {"evmos19h3kw2d9gmtq8sxwmd7v2t5tpm0t9k0vq6w7he", "3706878308802113536"}, - {"evmos19h64anuqxjqle7xr8yzsfd7tykeyqtkerwd0q9", "17154456968279982080"}, - {"evmos19h730luh86ttqn4fzhztujh3kp09r0sfpu3dsx", "4949828593152692224"}, - {"evmos19hd52uz3t0d22a4tpq93pmunw7yevd8n52zzv3", "34641337510343602176"}, - {"evmos19hedxnhdt92ku2ffck6lrmmk2gp7nd4p5lmgp9", "2644662099165323264"}, - {"evmos19hem0jzyzr3mssxuc7ky860gtd9fwd4rhvcfqk", "18034760351724707840"}, - {"evmos19hgplywgz2e6cwm4x8yn2wpm94ptuh3y2rr84g", "4843535989708206080"}, - {"evmos19hgyhzj8mvntn7g7whpa8mllx7xfvee7nakgph", "384238743454454784"}, - {"evmos19hlhc5pasmqaa030lsxpxgvu4ltghaaq7v94u8", "4102890661534802944"}, - {"evmos19hnyvdg75rrc2fyyr3a4nkqq77vnqddam8h905", "3755024776545460224"}, - {"evmos19hppu3ze305z6k7f7suxpkj4mp8sjep8cn3yfc", "402930603927283200"}, - {"evmos19hsvqrpjly63x8acj0nxfyw3zdmjj67532qp8y", "2107990482633049600"}, - {"evmos19huy967rd4rwql0e73stl79f6q97j5n6kpcn5q", "2694884098397965824"}, - {"evmos19hwhgl9dhge4z0rsk38udmwfkkvzy9cds620sx", "3455664297507815424"}, - {"evmos19hx4cfv3keshe2gmve2w5wfeyy76klpcfutzau", "10414703558774325248"}, - {"evmos19j6w2hgyvm8rd9n7s30yfe8r6zph4tfppelfef", "60629486870667776"}, - {"evmos19j7tlvwcq7wad8c9l0wwxf6crfuh4wv87s8jrc", "373404393103366656"}, - {"evmos19j9zv2p49rm7zvvqshl7vy6s0cgdh37km2sj4h", "1424553296634298368"}, - {"evmos19jaxm34ndeeakavp8f456pfjyfjkdya3h87j5v", "422765348097927424"}, - {"evmos19jeml4xewg3q3stzupdtmggkpdqcxwt5w07vn0", "674458279659064320"}, - {"evmos19jjmulxysucs43rzyv4vjpw4n5rlmehvsgez27", "13512189242358142976"}, - {"evmos19jlcv8f29a7zfphegaypjr3gme4p7xwxqrp8m9", "66749908871607296"}, - {"evmos19jmqhwc0894fhegpvdvsta5st7sg8gjzk4sznj", "6764935663105888256"}, - {"evmos19jnlm6834crf57tk8r6l52n5jtwqnvn3wy7vkk", "3913636059808058368"}, - {"evmos19jnym26j8x44w5eajaacmmz7x0vrgunx4tzy5z", "265313812360276480"}, - {"evmos19jquecl33ujlwlp8v0rfgrjnh03j2aq4k9k2vs", "392660328767270912"}, - {"evmos19jrmmahar75gl37jmauvnv0lmzhm7kdy0n7gsq", "40733142187380539392"}, - {"evmos19js2lnx0q7sccy8j0hsjzufckd9nyj2tujawqc", "6861549536355244032"}, - {"evmos19jskfvm4re7vu3xqqm7wjq56pj9k7evmygf50x", "11845991412667895808"}, - {"evmos19jskkw7hpf3g7sv5zg2yths04y9cqa8yu3jyea", "7059340098794252288"}, - {"evmos19ju862q3uhwjkzsg9j4cegv44dd7skx4dn2dmy", "76270468913328384"}, - {"evmos19jx03x0f33fcu0zcxx08ukspq56y55ak3c2u8z", "102634553181778944"}, - {"evmos19jx3l4365a03hz6mywqd5awhacencmdsfsd0u4", "9220136615384500224"}, - {"evmos19jyhcl6t8d4yvexyveetxyvfk7srzm3xgpw7ek", "10113709414672373760"}, - {"evmos19k2n8p4c926we5zmk7r7z879vs9u60xahnlwx0", "5330519602333444096"}, - {"evmos19k2vu9m5s80x0refs27q3t8ah0j37t40agem50", "99284774896182528"}, - {"evmos19k3qp5y97y8zy8lt8uvc0px722quu8aquvnxu7", "414142222659488768"}, - {"evmos19k6vfmsgvvtpa25fk7nhlgd0dgagxnwy6lc9rz", "38161126108296486912"}, - {"evmos19k6w0a2ye39laa2etqnyh7zxn9geetkdaa3hhz", "95257770729286912"}, - {"evmos19k7tmdhd3hc9mhy9n0v7q6jnaylpe9tpq0u32p", "20285358833191944192"}, - {"evmos19k7yyw90vmcjw2q8s0zycw29wqrslhucjy0hcl", "551268595682663936"}, - {"evmos19k9kd8cgucp6mlwef2x58hq5dl89vxtvxdad4t", "5113421985892225024"}, - {"evmos19kc8ukqts0a4qdedh626fqqjxaunaje4eqzpae", "522699226096932096"}, - {"evmos19kdknfzaduh3k2xazlsl7ker9enzdt7a365j27", "1046899733930917888"}, - {"evmos19kf3nhszhzsz6s8d02a466wxh4a8l89j072puh", "7816976357391136768"}, - {"evmos19kfs2pngqgu58f2y3qdmvy2n04wvca8uzgaw3d", "49918926203354611712"}, - {"evmos19kfvj2gr2t0s7mffse7nn58ssd64w4z0j6e9q2", "5460260050063051776"}, - {"evmos19kg7r4x56azcvzahstzslqpgknr4yqly6sssw4", "179974226265778176"}, - {"evmos19kh85xahs3whmtlcdfpcht46c0wzjhaw6f3znt", "16277249417312251904"}, - {"evmos19km2hrrap4t523df2y4pv0c43cnx78k3fsyn5z", "4865665579197248512"}, - {"evmos19kqvdvfm5q9q06mnqgdusjdv7tz0x0rc0ldxp5", "1002054997733841920"}, - {"evmos19kr0js70wxa8y36nmx9hzr5txkx4au5vdl6kem", "40904015991752949760"}, - {"evmos19ks3c58l4fxe88ummjdy0444gw2qsuce6nqg3x", "425840956387473408"}, - {"evmos19ks4rp8vslnn576t8z4uedlv3qyrkaxm45j3df", "752760000271923200"}, - {"evmos19ks7wzu2zssgfzzudhacpp09kc9zqcu8gvy7zq", "11857693965605158912"}, - {"evmos19ktevvea02gq074xwqryx76vzmhcyahxlqfyhj", "667630259352946688"}, - {"evmos19ktwrl3clazuezgscctm830qkc5c4q0ne5e9w4", "178751821147635712"}, - {"evmos19kv53a2f95nv08an35v7nf6s3g59vak8vqlgv4", "1559811921270192128"}, - {"evmos19kw2llwk59e4j6vl4gypcu9csgvm63u2z6c3up", "4198034918275142144"}, - {"evmos19kxu7w5klm52r90gnz2f859eu3lfl6fzzkdjg5", "23854799846236397568"}, - {"evmos19kxxhwc6783fh8p8l6t2wkhwkrsv67j5cwa4a6", "1245568738709112064"}, - {"evmos19kzrv3x3z9erv4drasntx5027yf8xcgukms9sa", "12432554608354762752"}, - {"evmos19l22sh5utp5lhv763anlad09f7nunvyef4ef5z", "6680523166799515648"}, - {"evmos19l30pawzxp62edpsrszxwdnc65wp78sepjcq5d", "376225137145756672"}, - {"evmos19l3hqd2whtcjgzggrm0c26vkvfqhcx65gykzxv", "1312141298805832704"}, - {"evmos19l5mqq79r3aarmxgwu9298py6xjn5hlatrx4fs", "942120187415068672"}, - {"evmos19l97qutm78hnrtpej3vczd359hvrggp9zeesn6", "9937578759698688"}, - {"evmos19ld6lpycfwj6f4f2l3p0wtk3ntn9e6sttwy0s9", "798040627341671424"}, - {"evmos19ldc83ddqgmt7rfr0x2lv4queq045vhswlh7sx", "1915003846309484544"}, - {"evmos19le4p3q6p8j5sqnz4dz3y83nem9grmuefe3eve", "3995333171105185792"}, - {"evmos19le7kac3xdeada8fhke4frvwj8a55ed2f8ut95", "1730024985435709440"}, - {"evmos19leg5vaf7jj3zz9rrv4jqk47hssf9vjmx3hrdh", "203277847771057152"}, - {"evmos19lehffs5m0ped09t8rkhvaw5s5ffa6q4t3ehdr", "33220165596696018944"}, - {"evmos19lf792nmuxaxhu4wcl2mhlsnvvgtjsl3gmlm33", "1448378235176271872"}, - {"evmos19lfehs6gzpn032phvhsl9uphgd0dpd9023m9mj", "38423674249916538880"}, - {"evmos19lj4kv6jcpkprjn7eaan30fpqnh9gdxnq5as6c", "5117086656021658624"}, - {"evmos19ljd0tfyj0ast02ku5sw4cjgny5ctr3vv9vlc7", "705697005166875648"}, - {"evmos19ljsez8j9rdvlsjpqr0qc5t84fa988wxjkxjmt", "20003527428020854784"}, - {"evmos19ll9dgn6d24cu5vukhym8yzhgdp899pntk7kme", "3940010637452572672"}, - {"evmos19lmps97lqy0c05xc82p5kmst2fgflvs2a8mac0", "10072266371720704000"}, - {"evmos19lq24x7vrzcutqyglgsgzlcqedys847dvqkftr", "5110331071204124672"}, - {"evmos19lqgj4qwfsuyff0pxl3w7ckgf6u76gq77xynas", "2420129804723581952"}, - {"evmos19ls9aex56ph9ghexe2f8t0q2fqca7wv22j5mlt", "462696679031257088"}, - {"evmos19luh5as7tszs730095n9tsct5wjh0fuv0ufrq0", "890626908085690880"}, - {"evmos19lvtmpuuv6fq4x5vyrgr4s6t50dtsku9m7s69c", "776551360912044032"}, - {"evmos19lw3gldghvejjs2fgjhvwljpyl7dksmcrged0v", "6380199371517112320"}, - {"evmos19m2dp545ff3gzjkpjmzctmazued2hquhjkwy0m", "841952283043183616"}, - {"evmos19m3dmk6jum89uqr3534nfhfdcxdnx6gqer3n6n", "1323647741963603968"}, - {"evmos19m5xwrftjd5ct40mrm5k3qgvz4wnhww2cra0sh", "17860817742250500096"}, - {"evmos19m68l82rmfu5welec5wa42r29a3h0mjwfcnnfq", "636449684227463168"}, - {"evmos19m7ag3x6ncvzxgywjmsn3tw5mzuqvwlj2ul5cj", "701086663574528384"}, - {"evmos19m7cv3hlx3cdd5r9y3vf8r22027l60vvms73qq", "2752929853031932928"}, - {"evmos19mckxzvnh3tf5x8ccsr2kusw95zqu926d8pmx2", "22081390072310214656"}, - {"evmos19md5fxrupy5avud36mmhz0v5u3gm95kvv38dgs", "1090184391620588032"}, - {"evmos19meey4j6ceqaat8xr84wkv690w9v2rzv4n6f60", "987842298881228800"}, - {"evmos19mefgl720lmvpe3es7vvmkmyae8hmknusatzpg", "217407100614607360"}, - {"evmos19mezsjncfs06qmu4jx06h9uwsldp30rxe7gslw", "4618360779799068672"}, - {"evmos19mflcajpkqp9x7pjf2awuj99wd63x57g3aspf5", "5539201269936941056"}, - {"evmos19mfw3klh5kvun5avpecxw47ywjez45yzhs4w0p", "10286000761967388672"}, - {"evmos19mfyjdk4e9zmrzdl6yxhszpql787jfv0g6j3ph", "2640183202200221696"}, - {"evmos19mhx9a6sr2d5l580dw765flxg38n4qw565kh3c", "4279841308399356928"}, - {"evmos19mj6ffx5uj5f7n3r2wqtawfmvcgzgyz3slkhzj", "1224535124863157504"}, - {"evmos19mkhavj4a3jqhjupk9pgqd3qg9qndctfdqunfv", "2810485984093667328"}, - {"evmos19mld5lapx5zumzp7tcvz5nt0h666u7hfg7glhr", "8223566392438792192"}, - {"evmos19mltzmzaz9pqkth6v7d027u99jnfrg2n6g05l8", "3174525582382415872"}, - {"evmos19mrnmxppe60vnun0jwey09jfshh2nmfws8z02e", "424394549498274816"}, - {"evmos19msz6n5p3c8penzxq49j7lydzqqcel7g438c39", "5041321319629309952"}, - {"evmos19mxkpyrqn5plc92kh608ewl4ux82c0zw9e4e4g", "2227243874920357888"}, - {"evmos19mypxt2y822jm32jd5nm46nhnm6nky4j9ze6s9", "32502667841829543936"}, - {"evmos19n77ryqxwmcxzgrlcqyuz9vrxetcrtu33enjcx", "6295870999451270144"}, - {"evmos19n7t4ah26smyx3msgw33a4tpjr5m5cgp9lgave", "1634359800424462336"}, - {"evmos19n7u6wn8c0ca7k3lx05qqx6ud569k7kzjh99lv", "2928878397450629120"}, - {"evmos19n8qdsd25tzr867q7hzfcwpa3584m89k0fwkd4", "655393046590648320"}, - {"evmos19nahy73td7t80v6punvplyn5w9rynt28c3p373", "1908374447331419648"}, - {"evmos19nawf5v3asrrhnjcj8jwexr9yaltyt348kx2ru", "233738316089216512"}, - {"evmos19nfvngqjuxfc45j5yjratc7manjhw33uvgsspa", "16138527187426015232"}, - {"evmos19nh5hlcl4fkkjd04sxcdr88mumxkyth9sl8rz5", "16735927755433373696"}, - {"evmos19nk06ra9dlrpkvp53c3p4cququckdc3ykfs8nv", "4398561584058701824"}, - {"evmos19ns6vmez5twxusgdjqsa27ht35fad0l003xrkv", "6481562621678252032"}, - {"evmos19nusvr6zgmmpm46l8uwquzdex4w894vapwkw49", "3228632450511355904"}, - {"evmos19nzhg94j93xhfn47l2e69nwlhl6f6xm0cv952e", "403597378854027264"}, - {"evmos19p27k8fle30qrpmj0zjd246tx4tdrgel3zsxns", "1877498898710300672"}, - {"evmos19p9vgx2ek7lq0anw2639alh50qk4hyzrpk2cxn", "477264512701972480"}, - {"evmos19panav43pdlcry2gfj70wgx62u4csarj5028f7", "2018428371593085696"}, - {"evmos19pcg65ftzn7t8l7jnycytdllpvlzxyaz92ygsp", "1417138009120844288"}, - {"evmos19pdhk4sf2xuwfsgz2ntl2x29xhzwjqjjkwy8ht", "399919222553140736"}, - {"evmos19pdsccls89ldxje9zq9n2lnrrs7p857a4gq74z", "1386215207184115712"}, - {"evmos19pfza5ddcsna9dcuv3tygvq2g99057clk5kjv8", "761408142608746496"}, - {"evmos19pjtm7hlcem2d4rzwrwdfz9h8nv0jm429tjwzu", "50904255914071793664"}, - {"evmos19pkgd5r0h282jze4u472k6npq9ufcq6txy2kal", "7685424818044174336"}, - {"evmos19pkqqzlgwqs5kk06vr75pdhz6gvr682jsemh7d", "4447646124557778944"}, - {"evmos19pl9wy9q6506tvy49d0dakvwmawvc7mceg94vk", "11332207483422146560"}, - {"evmos19plq8ewvx8pdavansjj9y4ulxp555dxaf2m62f", "1733811461798580224"}, - {"evmos19pr9gyz57mue8hz4zgwvc0ftxenjxncmkqaj53", "1896056352580546560"}, - {"evmos19psmt6wfjphuyqaunrczx8rat25wje3l5wq8sr", "2586808801126905856"}, - {"evmos19ptq64v7kwcf0yq5hm8fjz7fjten4y5032hz3g", "700381060450788480"}, - {"evmos19pvdfdsylm63enjpjh7yqap3acpt87s244zh65", "7552443746179848192"}, - {"evmos19pwynkn53png92mjlqsj62g9chp22tc5hp327r", "148312949188632281088"}, - {"evmos19pxru0cjwy3nv2vpsdqwel4uegj42tmsfy5g29", "30764316529053163520"}, - {"evmos19q0f89jkg7nxnzgky7gfjsuc7h9mtqe0d4upd4", "3042819527399600128"}, - {"evmos19q54e9v9mvcxdedfkuqzfjqu3gu50ch799scsv", "1213781099347709184"}, - {"evmos19q5qdfwqgrvz0z3xh5fk9352s830s0xxkpy2lc", "2604576119622125568"}, - {"evmos19q8nyf3q0vglqq86c74dccem4hqqurlrmj34f8", "3668024094355767296"}, - {"evmos19q9eadyrn6c9up0y39e7rjtfyfhucsujwgt9ue", "318928446898850816"}, - {"evmos19q9jez88564tjynku6le6sv7zxdmmm3f8skg09", "4359829729356699648"}, - {"evmos19qcf4mvgy5dr6tun8wax085n7pru58s4ta4t94", "3775076321222526464"}, - {"evmos19qdngcea4u9d70k5v92rdts9qtu2a86dfv9ssq", "735588943894802432"}, - {"evmos19qdp436t0djlpujvf6twzds2qckngkvq0fnvlu", "4130453307008835584"}, - {"evmos19qdte4sp5a3m5lyprzhshx0xn3ked8ujz2eh7j", "626406992302096384"}, - {"evmos19qflefnzr609ergqtcdeeycrxj29hzh7sv07dr", "6930614048098492416"}, - {"evmos19qfuvmytk5z7d640ct6vdeqssfhw52f3ecr7yf", "1511434272431120384"}, - {"evmos19qjtmrz2zcncwy34xgelxuq3hxy74ge9ngd56s", "18212548530685622272"}, - {"evmos19qm6zxuqchzar3wk7rfeml3uy3fun8qedygz55", "4087697519936146432"}, - {"evmos19qm9ghtwql57j65mvg4zuh68slkfes4wqjx7je", "1165742261599225856"}, - {"evmos19qmf5lsya3mz55x03970va8egl8x5u5tj5l2s8", "27123130409928822784"}, - {"evmos19qp2hufwgem69rrykm0wrw5fwtctdngys5wpg3", "1426783270469658624"}, - {"evmos19qrh87tsrdrhptrmxfwdfqekz2t32ylszx9llj", "16592256656447381504"}, - {"evmos19qrqmjlseczngu6rf0he3n2w5cy5z536jsn5xy", "807052243990867968"}, - {"evmos19qt0x5526vjwvzyhzndgaz29tav888ngjvwdpx", "14007995352847863808"}, - {"evmos19qwmh89r7m2guzznsj5zrde9n2lacltxrac2e8", "4911951089848479744"}, - {"evmos19qym6svm56zujvqqtj5p8mrf2zueze8nhdm2cc", "623919136219289088"}, - {"evmos19r0tltkl4c503wu8j8d0xte3wg8uyqv4yyl3l8", "2541892531530221056"}, - {"evmos19r2eut5ds76tyu48tvuy7m6e8fqmfh62crq3ua", "11777543123292217344"}, - {"evmos19r5szucev84anx3qh4uv0wl33k8z8uu6c8agzr", "5939574725442699264"}, - {"evmos19r5ut06tgles4mj5ehthxq7mqctet329jh0mj3", "44168247117867008"}, - {"evmos19r6h02534nhdcn4mpe6g5rtxf4vh8dwhdnz6a0", "1292787688221005312"}, - {"evmos19r937tt7zs3n4v3en9wluqyd3p8lcc89cpj3lk", "971576628913975040"}, - {"evmos19rcnszyl9zfua4rxj297ywassuawpxsvwyfl2p", "347838692283468800"}, - {"evmos19rd5vqvh6svepq26tccc4fc8f3t45d0asyrcfw", "6491323547175915520"}, - {"evmos19resjd2xz3edqn8s0f7576zm38cqm2qatk4jha", "3498685279518360064"}, - {"evmos19rhhktgdp9g4mauk3q5p9rdu79xemf9qha5953", "10491986779589836800"}, - {"evmos19rk9tdd3ud2t5c0xq7488sef0wvd40epvmnj5e", "3589212371193951232"}, - {"evmos19rkxhrufymvqyer7g6cn4r5cmre5lhu3au75j2", "2798578976053135360"}, - {"evmos19rlrufng5gme9dqwtsg3sm6dgp98nxdssxsedc", "8860323828190308352"}, - {"evmos19rm5vwcs8vh94tkma6qtnyw0jgfpm48vz4r5vf", "2371316298808200704"}, - {"evmos19rmd7jmphv3stckgugmnnvyaruh2xdmgrpa4uh", "1418227512194396160"}, - {"evmos19rmm669pyely23k24e53l7zxjtyrasc74he7ar", "2260072765867261952"}, - {"evmos19rnclhg0ctnq9ys2rcym5z66dfw90q6lxy2lyv", "36648547479941709824"}, - {"evmos19rnmya90clffg366pjl2syndgt8hx7a4d3anf4", "584877492292558848"}, - {"evmos19rudg2687573pywe29gdhwpea7fmec8dfetf80", "74122496520323072"}, - {"evmos19rx37rd2u74ww55k9c0cct7j8959kd476qg4z6", "1004539814484415488"}, - {"evmos19s2r2zufwd87hwwl2ex2mcw5yr9anxamguck2v", "867403502672151552"}, - {"evmos19s4d68yxx4g6qezgw6lzyasyerj93ht7n7cdgy", "13664368929665662976"}, - {"evmos19scac5rnaw4lvmh3kja4nru7egrcu90fe3qw0z", "3185316017467356160"}, - {"evmos19scvtz64wtyqr0px22aumdkar6wmgh52e0fczj", "838913697882615808"}, - {"evmos19sdgw08mnwnjruqsvc0sp7lvd9ul4sr2wj5c43", "9171102739798964224"}, - {"evmos19seemmctvfkglq8njumqsnn34ej2c2zepgqfg9", "9548195306578411520"}, - {"evmos19skvr3vz03z2629x6pcnlzhs56yqp7svt54h83", "307925873528097024"}, - {"evmos19slez4wtf2vxk045hh66sswcgjap6efnwsa0ms", "2045245448178603008"}, - {"evmos19sllqq25s5gxva2wt3zgg8gx0ynkmcjhpsekr0", "3981302575171192832"}, - {"evmos19sqp2gkar2mm7g8jj8feavt2shx6g0uvtdz0gm", "13592135900958885888"}, - {"evmos19ssv0tfch2vtgafa8d4fxsujpwm4hj77y62kxy", "1457085091161789952"}, - {"evmos19st94ygrtvwqk38gmlp7td0zfatz6jjynfnn5y", "1901317820191394816"}, - {"evmos19t04h43ltnsv8lzqd856myclarvsage2v22n03", "716943153885779968"}, - {"evmos19t28cmuva68lyvhjhv965ekcppma7hvf3tqfym", "3436587149360316416"}, - {"evmos19t3ng8na7v7prjc0gh6vq6ufcuvytsz8lae4d8", "468699870628301312"}, - {"evmos19t3vpn60n2spfl5e3mafd4z23kl7nuxls9m89x", "1294873789096059648"}, - {"evmos19t40p86sjt6ll6fjntl8573xw83tfnamm7yk7a", "947441263766136832"}, - {"evmos19t5hryxhrxnkk0p6vllnn9q0rqfxq585s6tutd", "7737918397302968320"}, - {"evmos19t7dj3460t96g4guszed692al7g4ljy696vqsa", "66294159767396096"}, - {"evmos19tc4rlz3yp98jk7htcy26t2am0tecte72fzypu", "853077190843808768"}, - {"evmos19td972mhs65t83pdgafd8m6547skhrtx8w0rkf", "4838466230867609600"}, - {"evmos19teqwt4ffdqphfgyfmjewwql4wl200wf6jznt3", "11511525842204981248"}, - {"evmos19tfpprwf25twdcg4lywgdwa4jd0n94htvd9kna", "55373262560251265024"}, - {"evmos19tggwdef2n27pfz0lkrqwgck04c2agvtwfq8df", "598550437380870144"}, - {"evmos19tgz82zvc4hm8yljer7qtt56rg3wf8p3anefzs", "1047161147127326720"}, - {"evmos19tj2s3wvm6w5wjwf50apdxgf2dmafmlstz2xwr", "4905408125530537984"}, - {"evmos19tjq49fenp7yxupjp57060mdcukdunmjlukahz", "6115906720411486208"}, - {"evmos19tktzn5ekjztrz60tunx97v6cw6pzsntyhp3wd", "6452992983228411904"}, - {"evmos19tn4m6yhqwml7th5t78znr2ektenal9rlwx7m3", "45257261903197519872"}, - {"evmos19tnfpvg433gmfgtf2ccypa792afl7ajmcgeew8", "2214149695379709952"}, - {"evmos19trpynzafq70lynxyy4j09ffpazekepk6tqc47", "17968627896405516288"}, - {"evmos19ts3akku8js3e04swa5k5r4ypep94nk72w8uuw", "4933491712772024320"}, - {"evmos19tuqww9vq8ncs0g3eyfdl6pj9sff4ew9aesz6e", "979427224610107392"}, - {"evmos19tvcql6x4xkmahumwmcqrh8p8r3gyfjywgn8v6", "4358310308834541568"}, - {"evmos19tz6tk8lppwnun70y269683qj9kcynhufh07sj", "8298814636026191872"}, - {"evmos19u3rjnq9ma0yq5z6hzew55j4quga3pnt7p33xg", "351778619035438592"}, - {"evmos19u44pnq2pp9gvwqpmcawv8ykxhsp66xn4qj6ut", "994109716925040640"}, - {"evmos19u4x7pma3mwk83kh6xm3ghryg584ka4ht66vcy", "24910656826811293696"}, - {"evmos19u94gx2qfh83xcwdpmqspvg6wvaklm3zswqq0d", "1068974994860116224"}, - {"evmos19uc6hryhvjv5956fj0tyq8wudqhr59knfjnsw9", "1894096990078476288"}, - {"evmos19ues43q5nte08uf530jed2gufwp82lkrnq7pzd", "51105053498823168"}, - {"evmos19ufcguudtwmux6khhvuuffrt22mzpg6z30lwar", "453977390107074560"}, - {"evmos19ufsut0yfalka7zgm9y2s9n887psqh38fssher", "645565602080808960"}, - {"evmos19ugpaqx3gew65yl4nng3s6yvlsu5vkajzvjchm", "5394470712804292608"}, - {"evmos19uht6laqfmygvej6rqm828ak4nj528na0jmma6", "384450512717101056"}, - {"evmos19ukncgzzwkvd9afm6tqalllzcja8gnfjha8az6", "1005548892379434112"}, - {"evmos19uqwcvt9956lp2jmh4e9yzlwvp5ld7ekmtecpd", "869018856748974080"}, - {"evmos19ur84hdj53zdmvc9xda73d0uwcervppzj2ks9g", "368929410986807552"}, - {"evmos19urgkyf60a7jqjgk75egstj30sewsdumsq8dwn", "4126600235955124224"}, - {"evmos19us7vuujz4xwtxs6skmyr76d47e6xwrq5hadl3", "5151762675172355072"}, - {"evmos19usvumju8mhh9h7hp3kkx8ewd2xt2rajfd6fz4", "831290488875223040"}, - {"evmos19utc4rwaz3gacay3lzrl07luu7c6zjcs0l2xc3", "2056682079999513088"}, - {"evmos19utu0qh0t7jjhsvmdhjely0v5f0m4mtpnqje3h", "5380102668040552448"}, - {"evmos19uu7zeu59ryetsav52mmlky70hwpzm5mwudfe5", "21489455321014284288"}, - {"evmos19uug0r66wn62t265fu6ayzn4qzhqd2ecrh65wg", "3435517409683777024"}, - {"evmos19uvvd9euxh49n2fchnenyy8t952afs8rgc6hqx", "1120124262089984000"}, - {"evmos19v0dqehx3dcl8k004674krf4kvun4d0vywsyee", "1019267534945507840"}, - {"evmos19v6ty4e956y273jat769yspv5gjhmvlq9ezfa6", "108297586202895872"}, - {"evmos19v7q69ewv95r5tzc0cejkcul2u5rx4g4du4grw", "1923543030094256128"}, - {"evmos19v85j8nhamgxxv3yep7ls4yrlwycn0c6tsjuex", "14617163745433088"}, - {"evmos19va0fmz9refu3t9n2lqkslypl2t9y2jet8adf9", "44695097583401918464"}, - {"evmos19vdha6w0mekwhce8xtctnp9lywq08rj0wfwx42", "10090625584576866304"}, - {"evmos19vdk3vlg0cp9gq0guxv6yvenhgz8rt40f698jm", "941963704736692224"}, - {"evmos19vdxm54gpalf5gc9yp2h9hc0fvutypdp2wygz3", "371174541465706496"}, - {"evmos19vf6qv5mvk8wnmmjprczug4jqwgnneesgh578p", "1520331802455620608"}, - {"evmos19vg3yv77l45jcetwjp9tszls38g7gjmxgh9upe", "28249732100101087232"}, - {"evmos19vgfnqr4pkp5upcdsedu99wryuvfq07ysm7car", "1673633117280290304"}, - {"evmos19vghfq5yu72nm5ypp49ld97m3jgrg7sawlvvzt", "2806502242871941120"}, - {"evmos19vl2a28kpd078zvr9d2say4qdk7zfd7uwxy4qx", "974913417071100416"}, - {"evmos19vnc58s568wxjn382nv9tt8yh3szsscqgzzt2t", "142952206712004096"}, - {"evmos19vra3y4cg8g7aymfv2gu242h4kcuytl2fufu25", "11202519596762611712"}, - {"evmos19vs5dntymm6a4xqf5r0gl07hfhastfvvd5dvwd", "39342724146520555520"}, - {"evmos19vtasumh26umwypjkaj07uag9qv8cnvse432v9", "13743972831575615488"}, - {"evmos19vukjn6szjsxwu7ch3y3w9wzl6qaz9ngxhq54x", "356897134440445184"}, - {"evmos19vv70kardydu2f4z7lqvxtxpq3vv6l8cjnturd", "1068976607855230208"}, - {"evmos19vxvuedpjkhsmcjk5rahfulr6fvyrddv7p0vcn", "829791569553229824"}, - {"evmos19vzdm4e3q0gqgndz9yg08qqnf4vs63p3rcy526", "707889047687498112"}, - {"evmos19w50f2jq2pycuflzkuv8gk962g2m3vflhm44h2", "4742377120747771904"}, - {"evmos19w57zykk4rteuqch836gwk6ltnwqp7d5c6av5p", "891021193653895168"}, - {"evmos19w6evwewmgtd2f2dd00r7h3vvwc8u7f6vzxsy9", "18609367714269945856"}, - {"evmos19w6v09t0hp2kf42qhr29879pp4ec85dhdkzlte", "25580100553202688"}, - {"evmos19wc494yxpl76hap7pczetyzljx736ew9z022zn", "50959626854818816"}, - {"evmos19wf3u08452eremjq6ywqrq3cegeuhul7m3ywj7", "13062363873604247552"}, - {"evmos19wf4ckuh7zc6d76uelhklkcqs6ly7j2dy3lqg2", "8575739375113883648"}, - {"evmos19wf6x998gfv49mmpn47xyvapf4z32z0nyv0z8p", "3952637474990131200"}, - {"evmos19wf9lpq2x5t799fqtpg5cvs2fr50g9tvyr25xa", "379802334790744064"}, - {"evmos19wgasx8eh9mu2w42qqq52l5yvl0fcayutxwt7r", "1359964755785658368"}, - {"evmos19wjk5fq4mmd2au49fgdxejgdg427qqqdek2985", "10550798630053371904"}, - {"evmos19wjtcyd9lytj5pge2e3jj2t6nknc47lqm0tcut", "42541870996239687680"}, - {"evmos19wl3sljd8aupldwte6hnxykqt63rwuypt6y64m", "10084312727340675072"}, - {"evmos19wm79gpc2wd5qwwr2eymsj26ultwzys8c45zpu", "4777525600221028352"}, - {"evmos19wqfzm05luznkqgg662yyjlv06rpsn2qnsd53r", "1122200011421769728"}, - {"evmos19wr53valxnjr5t7tne9fnw0uuel5dvk46aju0e", "738415755639001088"}, - {"evmos19wrdp225cfl2thecdrrx7nfykm8mpuczsdrz94", "141437693420728320"}, - {"evmos19ws5w09nju7z3qcj4yhm3yctkzhjetszw9hhyp", "340778721256011776"}, - {"evmos19wsstyfqjl9esvn63202zmz6kyu7zx7fmsmhdc", "22907871288735432704"}, - {"evmos19wt0mas8dheekledz5320qmarh3xa50gmpf2hu", "426902691473123840"}, - {"evmos19wtd9gausgm6atee9ud088nskgc0fmjgn03zjm", "5415647196181121024"}, - {"evmos19wtvm6cum7gy8ha53gumzlndpm5qy6aj6ntmrk", "1660901121305444352"}, - {"evmos19wurty287275qsml0d3rscyxas5vvjnf0gmwr0", "11194579093909833728"}, - {"evmos19wvnhgprsvg49ht27u3mmmrhxzu59xtj2nkqyd", "3542043386844524544"}, - {"evmos19wxw9peynufhp5rf3w25jjtnnj3ynm9dgqu69k", "466832814600360448"}, - {"evmos19wz2uua5rq5hexh7dquk03n837qrgpy8w7f34x", "1432354326323959808"}, - {"evmos19wz46y9ssnw4jswgyj57km48vm3qshmapla2v2", "15357238454022656"}, - {"evmos19x0uyqvmhvdsgj9lmxumjfn6nftd90pgae5wqm", "117356360416103936"}, - {"evmos19x3s8s7k9tapfypmrqkpcrv7tt538zz3zllk2t", "4800937510719009792"}, - {"evmos19x7mrvwecmhktpey4j05mrq6wezl27rmnv074e", "853947874264795136"}, - {"evmos19x8lzt3yhdxrdx4ypfvdjr5j0gtuvehg2c57lh", "560542846287627264"}, - {"evmos19x92xnxscxx22f7flda7np2w0k9qekwg87gc8h", "832201388062349824"}, - {"evmos19x9hrjm3kqn0gfk5cnhrw5h6450ye4qa2t3yzn", "700787685570659328"}, - {"evmos19x9qv3trcdhmej74zp0zaz6csjtpqv4v7ju2nm", "3065167775972270080"}, - {"evmos19xc7h8tk8dsxmwqnvjughm0d6pd8uz6j52vwjn", "14244265609128570880"}, - {"evmos19xn9rlcdsfk9rj4hgpaltpphwpe8e95kemdlwk", "28161694922887573504"}, - {"evmos19xpw96esnwaxm28s0svgn6lg07z2vlqhxpmh4p", "969436202941906944"}, - {"evmos19y3hzdeugjw38xhwuxezxcakxrlxyz8eey9j6f", "18869138291623940096"}, - {"evmos19y8cen7ya9lmzdcwjnlqm9thd5c3eshn40u5fj", "1889202158514137088"}, - {"evmos19y8zywgl9n7r5gww9d6uwaqg75938zrgq3fw6e", "247850994892588032"}, - {"evmos19yawp5wjjeqneq9p5t2cg3h3cx0v6espjc4w4u", "522693276084534272"}, - {"evmos19yd3awhkc7etdgp4s9m9ka05ha230qurcupkjz", "41182839442710282240"}, - {"evmos19yd8p3ppllfx0kupknmdhh3q28geralw6ydzks", "19178340424124108800"}, - {"evmos19ye4c2kwtrjw5j5f4rl8sf67m68rz5afteszyf", "1511567157525645312"}, - {"evmos19yflusnp4l7snythx2sxv8tyrnt0w5jcpnthlh", "4582663338484482048"}, - {"evmos19ymw0gfkmd5cqslz5jsxfmymk2gdw7eqj89p5u", "3398816819160091648"}, - {"evmos19yn9f6kkmg5vn7rnz3cl82d5pd5ywyp4ns6jl2", "3369608068850250752"}, - {"evmos19yp6fu63rsqfr2why6lkvgq96f4tztwqpu8pka", "856439982838460416"}, - {"evmos19ypw5acw3m3n7gggm39fh3l5zd29nuyjud7wn2", "1650689470313447424"}, - {"evmos19yrcntkj6maw2yv3hn5ueeyc6rpndhvf0e494h", "6200494169444282368"}, - {"evmos19ys8v40ahcxxg4rmng0g7uw7rpaaxul2mf684a", "2176780690644525056"}, - {"evmos19ythcgpvzcf979gfyxlgy6l9arwrxnl2yzg4l9", "2635000449644996096"}, - {"evmos19yy6dpfu6l265lf6kyt82x0ehwzrh9sccpxnrw", "1799521007505725440"}, - {"evmos19z2m2gnv02wgz7qsz4vlp3lz64pcqpdlscttdc", "1574769951871704064"}, - {"evmos19z49cejnhaex5u8vjgkuxyxme7usclwxxc4tts", "3487367136841895936"}, - {"evmos19z4afrqtf9xevlzuvtfeswwtl8ychkfyqg7m6f", "49968421826184511488"}, - {"evmos19z52gqgpr5aemqr23pj7lrsk0yj5nst4k822ms", "171364123760394496"}, - {"evmos19z6nh962ay2n6saxq6j3vwcjd9m7aw9fhlwv5q", "457655445819851776"}, - {"evmos19z7d05ls8g84auxcaspe077v9yvpkxff224tyc", "2348707046291789824"}, - {"evmos19z8n6003cuv3wmc0de25ns4rj2xj05wp23qanl", "772320022411042816"}, - {"evmos19z9hpj25la9qmwehfjemfe87gp4tuq2ecv8cje", "1354524076650882304"}, - {"evmos19z9wpzv8wkvucv8w4ryqweqcyzlptt5xymhqu7", "4197294775463395840"}, - {"evmos19zcztxrya5rfyfpvgtnj7yz6ml6dknq8jycxgq", "88329730690580736"}, - {"evmos19zd3r25j8per9d5ux4klhyxkecwhjfnq9lp4lj", "2576911303606722560"}, - {"evmos19zd82jdftf3dedrm7u4fv9lvty7qhmvztq222t", "323634712240994304"}, - {"evmos19zggrq8evy6h2tmpl8v8f6sq49kmyn5ga84u7n", "5453109924229627904"}, - {"evmos19zgxzqhc6dtalyjc8w8rr6j5hje7w4vgcs493y", "2439224080830755840"}, - {"evmos19zheldf6ufkh8yhsnm3j8j4vek45cynrxaltm5", "2003637043738528768"}, - {"evmos19zna356y9tjn9v34wjp3753qkcqnvmhdnaamrt", "1854737277205596160"}, - {"evmos19zp5wma72wmyftgrsaprsjzeez2l2yrpdg6hkr", "1745559446377308160"}, - {"evmos19zq0etgynxnt7lccfkzywxc2chvhg89mnttszx", "488128644787064832"}, - {"evmos19zq9hv9dc0le8mwfapcjuzvh4artm5f7nllgr4", "2365624017562335232"}, - {"evmos19zrtt2uncccycgcm9efgedu0hr27qfdvkwyvtf", "111230724671817515008"}, - {"evmos19zsmdgl2ym7wqns7lzyay7knfpzll5ca9c0vwn", "3901164133960161280"}, - {"evmos19zwwj2yq4mg3a0sf5377u7qj2ksy78lw8feywv", "104663507205049856"}, - {"evmos1a05f8cpm0srkrl3m0fe7sqak9xgrxqfm7pr7ax", "5459458593843445760"}, - {"evmos1a0dd3ltthmfnrcaj547t3crwsaqx0n9jkdpkwk", "849060124409528320"}, - {"evmos1a0ffwd84rpdlam7wn4xytvjzf4q6tx60yn90a7", "42645188957391093760"}, - {"evmos1a0jrg77hln2hlqmqfh5nn8emaxt8m462c8elfj", "17783052378441431040"}, - {"evmos1a0jvmmcve3wgf26jt9gpark7va0w0jhzr4gxfz", "9937243260087525376"}, - {"evmos1a0kmxj3ju3wse88afuc4zu5h7gpzrwxt5keuxx", "381035111994141184"}, - {"evmos1a0kx5ujyc4yf3yy7yh9np4hxjj50zwf0yza7pp", "13167440196182587392"}, - {"evmos1a0lptu6k9khtm6u40gq37uzfzqhvt3pvprkkrv", "3281976791223115264"}, - {"evmos1a0n4wsq2wt440uh88qqjcfw3dedxfrd96n95v7", "36759808206405959680"}, - {"evmos1a0w94a45jt2mujns3f4nqk254fggekja0dkuts", "1330573070722181120"}, - {"evmos1a0xvxelmzwnlp4g0ehzk63nf95dk9w42c784yt", "1399827609559430144"}, - {"evmos1a248rsssksz2wwln3w30fgtg5luwhuku58vmf0", "5533157063455997952"}, - {"evmos1a24u7lfy4kncuw3lsm709ekxyguy53w0w7tn4z", "460874142814352128"}, - {"evmos1a25fmmnayg946j67put09gp9je7ge6aq6q40k7", "194413253944914432"}, - {"evmos1a267e34y3r7x39k94x69ckm2rndn4lmsfs5707", "30622626534796439552"}, - {"evmos1a26xn3fe0h486504hacpkdq98u72um75dxme3p", "2807359763261433856"}, - {"evmos1a26ym408u8yah037km4uzgwrehgvcdte6rfp4w", "12886039776853958656"}, - {"evmos1a2a6aqaje2k9yp3klp3gg7dl3wyh5t2kx4tx2n", "6822736209512251392"}, - {"evmos1a2al9txf64zsa89aqke8a663vy7recd45dh2p2", "405970661466409216"}, - {"evmos1a2ale0a7z7w8sakd7j4xn4kmcuwtrjkdd9urs5", "2449146349037983744"}, - {"evmos1a2cpc89ehkswusfjtje2s9c43c8xtzg6upmcr2", "69312344443528192"}, - {"evmos1a2fgekpdgzl25rxrfd8yr8cytcsljrfc28uvs9", "17787140585973303296"}, - {"evmos1a2gumeuenhjf2lk6l0tvcsg8zlph286h2htvne", "3284591932657029120"}, - {"evmos1a2gvsp3cssmk045qqsxuanaycw432ua86t0zl0", "26598455960947683328"}, - {"evmos1a2j4ssn0swrltu6ugmczzdvcnp27hw9szyynjd", "3412074379710832640"}, - {"evmos1a2j5fulc3j34cgeml76p7qw6elf2vlkruewxta", "1288686461910097920"}, - {"evmos1a2jayc7zehjqhle35kgddc47l60z6ty4h8xd8v", "190380323798496256"}, - {"evmos1a2kahkrdzd5v3re6xnyt7ddcyagjjjgxld5w8t", "367013439777549312"}, - {"evmos1a2pnkzly40m8uw7yhvhgt9ldx66v0z89v8g3t8", "1530481687873306624"}, - {"evmos1a2rt8kd9y5gy6eq8t328znk8nfcufdvz6l5dzx", "25808545938467069952"}, - {"evmos1a2u7ew254g2rtlxcmfw2rquqrxdpxegsgr26pj", "3217716862152554496"}, - {"evmos1a2uv8rkls227wr9ujlz3k0mc50paxe26aurpyn", "2909936840595010048"}, - {"evmos1a2zhppq8gl9x62zwe25t32fkmvxk4jxhxuth3w", "4069365013018165248"}, - {"evmos1a332al20mshmv22dv08fg65ssgv83e377nvnya", "4291482272475119616"}, - {"evmos1a34th59475pxlhgvenfx96hddxgftyjs4kyzax", "1313318899071938560"}, - {"evmos1a369fsnpwgraek2ya624f3hrcxnqfj2la4m0wy", "54105930213638144"}, - {"evmos1a3aeuk2g2787tacjjh8u2qyvtuq76g5zkpvjzu", "1392470281796091904"}, - {"evmos1a3f7wp5wdzh64kc2986slvx0l4k39feykr0hd7", "31204032595392249856"}, - {"evmos1a3f96g3385kym9frdku8se6dxljrsepda54fns", "1463340626589821184"}, - {"evmos1a3gvaddyh2nt3gc4c5tkd5zm6vgntatx5sj67k", "1604960400602470400"}, - {"evmos1a3hrqc095cnnlq2tc9y76tjja8fpplpy0cy6j5", "16891895477878132736"}, - {"evmos1a3luqt84l4d4y8hgn0dx5cn56utd3u95x9tnkh", "20654604724552900608"}, - {"evmos1a3nvc83q882wfw0qw7uwcsda34tz5xxfjz432g", "475261997226663936"}, - {"evmos1a3s5yf9s694nleu7ejd4vaca4ujvxpeayvg093", "9638972242841376768"}, - {"evmos1a3tyal8666ndstranam2t0rjneqpsttcfcmyz9", "10618756094351079424"}, - {"evmos1a3u8rutltma802gz2ddsuggmmn7gzrlmd5xz2d", "1039880846798585856"}, - {"evmos1a3ug8fqjwp5t99jms6lwlvg6tmke2aqm59a2mp", "1403888733546514432"}, - {"evmos1a3x4kqr8rpc5f6mgfm6l490jy49wc4msz59n75", "8623486452806666240"}, - {"evmos1a3xawsyydpdlaz66ugacuzzrkyxhmnq39cl860", "96391404319271583744"}, - {"evmos1a3zkcqxfahu0jrzmfqd2xmtdeg7hnl6s8q99yj", "1694377716423323648"}, - {"evmos1a4496hfqz2ky0xsnu7ukerzrem5mwwugqv5tfp", "6456905469057445888"}, - {"evmos1a44sh6utlrdl5zwc3jlyyewye83whhn8nv68td", "34209029963031863296"}, - {"evmos1a47upnzctrpkdz5rxwnmfxuaye06vw554pz4g5", "22769485137435234304"}, - {"evmos1a49guwmzj4lqn3th2yz0wvv3ml0emrduehfxd6", "17739285714724257792"}, - {"evmos1a4a5v2acvr2h3532lhx0rmy97yh37z80mnqveu", "10140114362261442560"}, - {"evmos1a4cnturuzw5frr6hqcvkmh6g6p0z893qsw6arf", "4067449732871501824"}, - {"evmos1a4dwzltugjmv7zxjtv39rgcagv5fzwgngqtx5u", "1469944401191122432"}, - {"evmos1a4h5ekfg376zl8s3nanrhqgtuf0g2lgt63w95w", "21568523389485862912"}, - {"evmos1a4kc3kkw63unc2a0wz72lm6c3pmkgtyf68j8kn", "9609838677667840"}, - {"evmos1a4l492azj6f0vts0g9clqsu6qyv2dx620u0ywa", "6270604264221704192"}, - {"evmos1a4m3s6prq6d4txzjmzfahezuhfhqwmqnfettsv", "1591170804230848512"}, - {"evmos1a4nf9av08z0hx7dmem7uupph3xe4n0v4hwzwjk", "599042095341752320"}, - {"evmos1a4pml3feme29a975day9yftq3fzrvdf3w3tjlf", "1091298962896509440"}, - {"evmos1a4rfm48yrype5k4l6jwcju6ll42wh7e7dxg8sg", "2818997180926953984"}, - {"evmos1a4sl8yq46dmwr3a8hjk0m3g86s684d8nuc3wsw", "5078892787601912832"}, - {"evmos1a4tze04sl8lrrnvelyn5aqmrkgcqky68xz3z3r", "5119672543667257344"}, - {"evmos1a4up89ywy0w4kd2ks0vuyw40qmdz4xsp0ung86", "23462551279282692096"}, - {"evmos1a4uw5rwlq43vwjru4xlk9j6gsj0gyh3v4ugqga", "745638644901576192"}, - {"evmos1a4ya49l7ad8lt0n237drq4888nznc0j0k50tzd", "21860425647739662336"}, - {"evmos1a4z2aa620c4h8hdjwt7rmgef5uquuk3p6cg2ks", "6807535945003631616"}, - {"evmos1a4zfn24dpjjen84s6dwqrnctddlzvqurcekd53", "8743740312630257664"}, - {"evmos1a55wmadr3vx2egthy7j2ntazapqx653fwqk92a", "2556822565102419968"}, - {"evmos1a579qgykfr3tg72dg7cfw03tjhntw4kwct262g", "12190840522339516416"}, - {"evmos1a57evw95uzt8yaqxrm3zxgxfdjnj4fym9alxk9", "113230335144392448"}, - {"evmos1a58q94930uh8lkp5sx3v9phg0nx6smgwtm2kyr", "7416949652324122624"}, - {"evmos1a5999verktgpjgfmc25fmeyuz2p08atx6nxrfp", "385834512201786880"}, - {"evmos1a5cve68ak4nayf86jrjy7568fkdx7v4tcl6nan", "438093722867079168"}, - {"evmos1a5ed6fc430n3n5ct5640kcf95ngztn8xvr20uc", "18309229469542559744"}, - {"evmos1a5efw4xckath0745jl4yst7ah7a0q506l2rxw9", "264509628044930048"}, - {"evmos1a5ew4j2a30vm95yv6eeg35hufy37jwxznch8wv", "2175138043695940608"}, - {"evmos1a5g7t6545k35gra64hzvcszv2mg2twcyze8xql", "693939544018567299072"}, - {"evmos1a5gy0x7s5ksd7l4epwkg6l5gr7as6ca4wm2v7y", "1235614655964159744"}, - {"evmos1a5jzycup752y2chs75xxndatht669uyn0j6ycy", "23556321142828986368"}, - {"evmos1a5kf2gye8rkg6fpsluuj2tcna5rej2gyzshe8d", "2512469708559908864"}, - {"evmos1a5pd4jtjdu25np2ecpww2ers4dx336h0h7e7um", "1486797668872663040"}, - {"evmos1a5pm8ff5e8v8z97g0xm3esp3g3l289rftuvegw", "1218283610098049536"}, - {"evmos1a5qpepnx77zh4n7j6m5emzgrvdz0jtkdrk240r", "1034549211515092992"}, - {"evmos1a5uqju857p6xc4kqx0cq2pmrf2v9ases890umt", "5105584163302963200"}, - {"evmos1a5w2v0dkakszk9q0hngt9ng27zdt8dn75x683h", "5710313446862340096"}, - {"evmos1a5x9vdxd6350rqca29rjfe3efke9r70jm90ydf", "22211619811798564864"}, - {"evmos1a63zhlp46aseelgzj88ac7y8qj86qnex20nglc", "152481456591839232"}, - {"evmos1a65nhrtyqn4mhqa993c22vmeclarkjfmslrm2s", "919451951373692928"}, - {"evmos1a66kkjer33wyzhpy7dw839ltk78f4ytkp3upm4", "1761357798781450752"}, - {"evmos1a67rthz3g0uqnu8xkcx92arxajyjzmk0ap4f5e", "132114300139448576"}, - {"evmos1a69j8lu2gk24gzea7c292vghjd8u2ylt0yxu53", "38671526187943698432"}, - {"evmos1a6a672vthz6sweer66d0vxlhtfwz4kxkxc0afx", "384830312149164288"}, - {"evmos1a6etlsall04x0fyharsg375hyjvxu0ykyya9xr", "85482367154016043008"}, - {"evmos1a6j62rcscm77cegdl4wd2wv67t4slxmafkhljh", "3186318330255298560"}, - {"evmos1a6lmpufyvd4w7qdclt3m9vgf49esstgd9tvy7t", "397537357569246464"}, - {"evmos1a6ls6fg47yp5tw88ehrm3jnp0v66myccl302vq", "1698548253619159040"}, - {"evmos1a6mfznzhgvdtmka6qnkz2u0lh90cvwra72cngm", "325236330224221184"}, - {"evmos1a6mzp3su5w7q0vuk83wyskqp6fvr2l35xa3m20", "560132245474842624"}, - {"evmos1a6nuzjxwq57wyj0zmp7ak9g9ewd3z25p3lk2u0", "4816935231215192064"}, - {"evmos1a6s2m5g4p5q04u789yvywyuvwly5yf4dg0m5y8", "1316870643652718848"}, - {"evmos1a6syp24xyz4w0gztl50hae58qwga2dlvgwkjkl", "10784116826986592256"}, - {"evmos1a6yn5ksuprmh0khcla8tecehx9xxffsgu77jtu", "5527778202028736512"}, - {"evmos1a6zvkyx3qs4wwzazuxxx98jef4xxn9u23vdvrv", "1937490127641477120"}, - {"evmos1a70lqwht9w3whn3tesvn5ecqu6k90a9wdqnsr6", "6190841222214905856"}, - {"evmos1a70vchl59fntu5penf3ede56ts2maj2x4sf7r8", "3355370928583999488"}, - {"evmos1a73g0fk3wmwjnghqg53gwt5j43frk6mqdnfvkk", "12264131170821836800"}, - {"evmos1a73yy733303aj792cpzrdfvlyeyanaaukw8jxk", "979731101316568064"}, - {"evmos1a78prefuldnlys87w32qxnt4luwmzcu8qe3wa5", "1437298144426352640"}, - {"evmos1a7cep9psp6qh6umn8vsqr2kypafuxlw76qjldh", "774174934164877312"}, - {"evmos1a7fycps3qdwlfhk04desqvsvjtmgkr69qmk7jr", "16400007599221065728"}, - {"evmos1a7kfl9st6t00ctfqp80aw2jwk0whe0g45ftul6", "54888807803344592896"}, - {"evmos1a7lurcdwcgakcljr97zl63763gldds6hv042xz", "2949442550432327168"}, - {"evmos1a7n2u0h0kku55genv8s46ytkgdc7rde3yvcpk3", "5168503530365257728"}, - {"evmos1a7nz5egnjmmekcdp5gla2gaqna7q68pvhzz8ud", "10723200366794670080"}, - {"evmos1a7rz9lcns245x9x8yycasp95jyfuu4qaeupe25", "3883780423595895296"}, - {"evmos1a7ss6zrfl7f4flvpp5sw647xgg9gncx506m336", "791214665800179712"}, - {"evmos1a7tgnj5wxagm35su40s6l7lh6t6xd67n44j5z9", "8541753176452620288"}, - {"evmos1a7ttta5265xx0t5444kpdxzy4c4u59fj4xzxx9", "1235928819608117248"}, - {"evmos1a7w43mqjl7dcmh6sehkwqv9swftmp766uh5f7h", "66125435823545856"}, - {"evmos1a7wmj7dwvhhdrpe9a7y54r5pyuf0kjsj2emq2f", "7692139737434122240"}, - {"evmos1a7wzj63qa8z50h5e5v7e4rx92hehg4029x2lyr", "27877180399426707456"}, - {"evmos1a7zzhz0grwnctzltu6522dutc3t5gq7dzacuxx", "13883649244211736576"}, - {"evmos1a80dgs5fgnashf04xq6nq8xkcantu4g9t58tq7", "1038268523524745472"}, - {"evmos1a857t0sxferf9m07c7ve47wefqsgxcw87wre6q", "740215715140383744"}, - {"evmos1a865gn0xk0uaaaxaa4x6jnhsslq5d7gw6qyhqm", "1679509483177857024"}, - {"evmos1a877mq532fjwpyupsctpwkmrdvkmsdd05n00yc", "7621054091803074560"}, - {"evmos1a89ftz9rff26u74j7x5hxraal0vd40m5948s0d", "1424505858415435776"}, - {"evmos1a8arzyjepayu34kfl8ggdhm6g3wcpwqg9pdzp4", "32513264393015410688"}, - {"evmos1a8c4wjqc5cc07snw0p0rampzcapmd5ah5wj3xq", "16489036605748180992"}, - {"evmos1a8ccmcd7t3wmau37g5cd3n3r6dver8kkcjq97m", "3081168506211139584"}, - {"evmos1a8ctap0tvmc8jae8pwzhkelga6cysxqd8tk5rz", "6398002187080617984"}, - {"evmos1a8dxm0dhgs0rvr2yrse3s500rh34a5v4r0yg46", "2839321253932197376"}, - {"evmos1a8f4u6y5sur30adxqc75z50zmftlkr8wef8vvn", "298158681957435392"}, - {"evmos1a8khypxacvkvhp5lk0jnmqzugtv4397uenwcvc", "19506808013508743168"}, - {"evmos1a8nal4mvxkerdynyc70nrvacptxwcpqqafauvv", "13508791843431530496"}, - {"evmos1a8nljzedhj9a8cxervxxa8rmnsd6ljhalfrzye", "1435638084675436544"}, - {"evmos1a8ny6shww9luzk75jdqmw5p02jhgk2hstz2mgv", "2559885442435227648"}, - {"evmos1a8p3h2hlsftkdxpk455j06905un3zv95uxy7mj", "6208699104023293952"}, - {"evmos1a8sd7cd38wte2wvdpcn8nlp7ff370s6eyr0lwj", "6831054794020601856"}, - {"evmos1a8t2gjymlqh7zp5974cm4fxnye9x3hdupk9kcr", "1643812576640221184"}, - {"evmos1a8uly4jq5q3s8xnuy4l0gaq4s04v5v56sp423m", "3989570160369598464"}, - {"evmos1a8w0yrxwc238a6zs4u2v6xuch5pg37md4zvfs6", "1268446625533490432"}, - {"evmos1a8w6kn6g7mrm0f05vnf3jz96dmekku6k5tet2h", "1173550067388773376"}, - {"evmos1a8y2tq6f7526s4s5wyu4qtpkrefgjrc5xqyy3c", "1277505102773398528"}, - {"evmos1a8zkf3lkzq6g8lnyydnt3k60yrj0na5tmeswev", "240275953296272384"}, - {"evmos1a8zq96k3z200xl9r3p2f87mt43nldcp8mvg80p", "2341634000930356224"}, - {"evmos1a92kzhdxzhhaeex9vga9rvlkstsw2fjqcyt8l2", "2692742950918355456"}, - {"evmos1a97p7dkrv4d2ml6pvrckkqg204r8lufvav8nnk", "84107428478935552"}, - {"evmos1a9al4s9ndrd2unxxh3yd5z5h367f2gtsrqm2uj", "21350043463503052800"}, - {"evmos1a9fappga06ss40ssy8u0t3n473tuav8kkh9qjs", "6648888414915297280"}, - {"evmos1a9ffx3m26emhk9d4mclzvuvlr7sd7v8qtc5hkk", "65967823981736704"}, - {"evmos1a9l9a9epyufmdnmpynmcrrd9sfggf7tvdctpzk", "1506097426409525248"}, - {"evmos1a9m2vm3kwuzsdu8ruqrjc3743gk0cs0jepxlja", "1938156285819467008"}, - {"evmos1a9pv5cjxm502rzmzvususlr0yrkkcpw5flpyd2", "427304751442065920"}, - {"evmos1a9sgusfnul36muq7r50dh2yaa70j2dvxsnedl7", "2169931705665634304"}, - {"evmos1a9v4dlhpw3cy8sacdgm3wz6q8882alhzmz4p0g", "1193594292405227520"}, - {"evmos1a9wpsd5hrvh8ujrg6rx6kyzpf7h4dy4dsrdn4h", "7237000135534592"}, - {"evmos1a9xeh3rfhux5vkapc6jmff8hxc0u5l8lhget4v", "670946112884561920"}, - {"evmos1a9y0hrr2jj0809nk2355hanm6hv8fxpxdkqfe3", "3088486319375024128"}, - {"evmos1aa0ea9g90pudf7c4jmqj06u93uz23u9gwpwnvs", "1905736511668568064"}, - {"evmos1aa2kjd7ctdu89k8emycctcxhq4pm3hqs7g9d6x", "462230130989592576"}, - {"evmos1aa4m87agae7ejsh4739eygkdenyfnvn607uaej", "3030305807555130880"}, - {"evmos1aa780pt2ljtuscvsyrv3wu4wep6zufms5uelge", "1433624798116917248"}, - {"evmos1aa7nkkd2uhau86vp27nylk4dcvzes6muvw7qzp", "1176260701190066176"}, - {"evmos1aa8gyp8tcm70uesawxyr4qeft7whu347y7qlde", "3461301863087693824"}, - {"evmos1aa94jj95t4qh92y3zg506fgagq74pfeggzdyf8", "5605778896046317568"}, - {"evmos1aa9wtjcrh6y50y6qa6lnkg9kjrx624u0pkcqy3", "2260662778965574400"}, - {"evmos1aaa3rwma3rfmgt5xdl2q6z5hfj0d0qvg79pgjz", "53177536112461561856"}, - {"evmos1aaaputmkt4snpdvwm97ypdczrkuudtmuy9vyzr", "415830867229874944"}, - {"evmos1aacgv3sl0lnjeq4dhn2gpz57kha6t9v0k07nyv", "2569754777247483392"}, - {"evmos1aae36yw9qa4eswzhs90enkhkztzx7qctxgazxe", "2047253246482057216"}, - {"evmos1aae4p0zc7wql8634q6684kcv87k2cvn8lcngg5", "16314712686110181376"}, - {"evmos1aaehs0u0hkfdglqv68lnplmja2j0ween2tjvwq", "3096640820230643712"}, - {"evmos1aaf025gkhtwsktcq4ur5y8md27amnrezq46aev", "1013662599553323008"}, - {"evmos1aafgx6t0nddsz88xwqvuu6dyl7mg2wruu7kzhx", "5152704412080922624"}, - {"evmos1aaglmll0k9z5jfuze9wwhzusphws0z70xqeuy6", "1626280368186796032"}, - {"evmos1aah0n8xjr03v0wu2yrzrdp9a0ual2w26mepngu", "96293344521697536"}, - {"evmos1aakcfk04na73r4xqhp3n7teaf3ngyjq8psykcv", "384258615938045184"}, - {"evmos1aal9qkvwm6gt6ux5drn5yd0znuxd80vnm8wkn9", "2028020944170852352"}, - {"evmos1aam9vayhfcr0m6g2ckvhn2ds25ngnk0wg4xrem", "368231312512380928"}, - {"evmos1aanpxf0xq2h3kp8g2k0sqp594uv66fvgveelzd", "3120019464532120576"}, - {"evmos1aaswqj4w0c8svgy8wldy9uz5a45q4xmh94ck3z", "28955726624282165248"}, - {"evmos1aaumn4m9jzu8xsy5xzchkrkf4mxxf7msszq8dp", "5914393951160020992"}, - {"evmos1aavj7rx8lza8duvpenlscx6h2nkrkpjhknyxnm", "7267790710960226304"}, - {"evmos1aawr29mra6exc2lpt4kkf8pml7jm9e3wzlnl4z", "884348326646945920"}, - {"evmos1aax2758vlxhaspzmynmamntqk0d2gly725hate", "233408798809730304"}, - {"evmos1aaxyh8y5twzjzs48udmpeaa6jzq8sm242tjqtj", "225777922042329856"}, - {"evmos1aay99rtwkckpklcvt5vxsd5gusd5vl8afnw32v", "113470022533741248512"}, - {"evmos1aaza9t27pcq7fdt6vg5mtyx8nq5e0t8gjn6xwa", "2358721776123476992"}, - {"evmos1ac4s4585vgve5nlguympe3ehat2erkkn9rwe7e", "4399302574471609856"}, - {"evmos1ac6eew0p5quz9f3fdulnr0up40h4z55eql5eek", "1311155958036768768"}, - {"evmos1ac6zp989hl4u63sc20f29gjqhkqr3ljry8em03", "6374989782477512704"}, - {"evmos1ac70scfy2mjj38ucuey520f8n6ygzlgc5vvfg7", "32081116536384364544"}, - {"evmos1ac98x2w02cklagglrdyumzw30kagchjwpnr0s5", "385605521325644800"}, - {"evmos1ac9p7vkyjnx0kdaehueq8rhtztg6vsghcdt4p9", "13470390870676594688"}, - {"evmos1acagv055fyrsnpy9gzjtsh2zenp66n5z2xq4ph", "16299944391702642688"}, - {"evmos1acc2fplxxuvu0yhz4df9ptlv2slpju4vzx2gwt", "17635610139237298176"}, - {"evmos1aclns68caju34aan0k9gw6lnf5fuc6jpxqy85a", "2255267851904573440"}, - {"evmos1acm93t9m84jmtnn4gugr4t938f7zw3q7e6yjgs", "97776825061081600"}, - {"evmos1acpw3exlkyufcu23z0afx6spye8n7nj84xejne", "211251797822508288"}, - {"evmos1acrn3hcrc3z3y46r80xc0qq35g6kta64kmnzsf", "720976833991139840"}, - {"evmos1acs998rsdc4n0qf9va3yv3emjvuhlq7h7scpc4", "384044958349613312"}, - {"evmos1actuu4h8gmxyrycu0pxkvp6tkk05alf6c3k898", "196039211936993280"}, - {"evmos1acwarakrqk00u6hvecu6tqg3xq3v68n4sy6sma", "829206388365731840"}, - {"evmos1acx7zvxaksy6w2lzdv3aqa9rvzt5xl2r6yqmvj", "2483427965802053632"}, - {"evmos1acx820c74p9s4h0rtl296xardyghgqgtd7gl7v", "5777223050644154368"}, - {"evmos1ad0gjfvj2ppd5whap6qxy9rdkzed899r6zvyjg", "4946742533010534400"}, - {"evmos1ad44r52c5h7lv7a8f4ndlezt89hyugnaf2jvf6", "1317384881071570944"}, - {"evmos1ad5qqjrvkhllq2p4pzv37g0y75mrscr34gtca4", "8243976483443959808"}, - {"evmos1ad6gwzy6e9uhemrjzmvz45zkf7wt5rcwfrgyzu", "237517366251667456"}, - {"evmos1ad7a6k3edrwyzzgh9er70aeejsd5maz3se2378", "368274563453786368"}, - {"evmos1ad7y2hy9gdjrnsslc96e2j934lf7jd03ka54y9", "460566299913014272"}, - {"evmos1adchg4c8tvfd9cvdr4lu7tqvctc455gv8t9ye0", "5166703373509570560"}, - {"evmos1adg4kf9kc63xenraq5ae3zc6ffs4y6tntp2xhw", "1235832286771952640"}, - {"evmos1adngp7trl5rgwjrtekdjzqu7qp2ax0cczgf5tv", "339948129485307904"}, - {"evmos1adrd0kn6wsfgtd3slhc4pttlr04g4z0jh4vf7a", "231382416451672064"}, - {"evmos1adrvqf82ycpfvk5atmzka4ldg0nykepnzkuxvs", "2879465582234249216"}, - {"evmos1adtm6kml57etke2ffy68p9zrmr2uagl7jz36vd", "3777197923903322112"}, - {"evmos1adu783amj2cqelphr2e9runy2mhallqj5ljl98", "1814117069240524800"}, - {"evmos1ae2nxsxuvx524wmp5483rzp3n059c4g8c0pymh", "1478515009540710400"}, - {"evmos1ae3zzg4uw8hyv2zu8w7ndc83xjnjw8y9h83nwx", "13970174118564405248"}, - {"evmos1ae7yn20jqdzr0wazg5wqg43qkcfuecg3phlq7r", "384236764480555008"}, - {"evmos1ae8f2qgav58h08hppzzxy9dwj5kqex3k0m7tfv", "384504574182085632"}, - {"evmos1aefgp60t0wwn8jsrxvkmwwptyn6295qf0p8vyj", "2170071168594837504"}, - {"evmos1aefu8f8zwm4v98mhgswyrkccwypuzss4ft079q", "814939196339618816"}, - {"evmos1aegqkcn7w0uaypa9ks9m8rdhvfcpkz36lqrnur", "488453545416978432"}, - {"evmos1aegtj357hkc2fs5g06676ut4a4tnq9r4u6zjj8", "14573026693220282368"}, - {"evmos1aehvmv7jga596ywveadxtv3mzfm79gutcju995", "20169544231849558016"}, - {"evmos1aemj69trvyqry4ltw8efjfkn3wwea6csethrx4", "1067014278405596928"}, - {"evmos1aemwu2km98s7tkr6kyhd32zf9rs696tjkylnyx", "1762812910903995392"}, - {"evmos1aep4k58ru3l7n57wc5eaz7qvsuhkl2rxk3gsaf", "477648581946873344"}, - {"evmos1aepgl4j0kaunmeaj54zrzxek4vq7lsc78drpv8", "8535354117171908608"}, - {"evmos1aerxqeu6d35cz7v74evxguwyvecu9aqgn4f506", "1028120878667958272"}, - {"evmos1aeun05hnshh2jcwpz8ns4fnh0w95j5nxd8cqau", "168649762867245568"}, - {"evmos1aeuwgrmnax57wxh9q69q2wj6fu6qr5p3nq2hky", "12473668133453807616"}, - {"evmos1aexqmwm9ry8zc2myvp0757rcvrsw3nk6knk5d5", "1076609291025475072"}, - {"evmos1aexxyvnntd3hjezxeqm70a9ch55eljzyn4nkuv", "354678936514535424"}, - {"evmos1aeywfja4l6lzce77qy8rvhfzkumylhhwsdsqf4", "77968487396297342976"}, - {"evmos1aezvqupppwqaqv8fsvqpqn97w5xj0l5ry9h8rh", "1443683241818883584"}, - {"evmos1af0zrm6l7gwhedxg8huqvgpzdcvldncgh7p9g9", "884083033933199744"}, - {"evmos1af464gnuxlutft54sq32em78aeels50p2vax9j", "299656527908130304"}, - {"evmos1af5dfgu8hsauft8g4nx0a2qc9vks9ddcw9wlvf", "71142251712164096"}, - {"evmos1af5dje2wgnv7mtwayplskvqg90jqwm2r5y20ee", "7811165359057240064"}, - {"evmos1afd9hkwuexhchdz3tcjm9zyxcdw66ve599uh8u", "386191955258465792"}, - {"evmos1afddp7n0aswg99z4lx0egy94h28qht8pg8qc2n", "2216861065991929856"}, - {"evmos1afdsygjk3r4ljvy9lrwf9hgymkuagnj374lk63", "171981501714604032"}, - {"evmos1afg23gwm2yhehc27jp22gc5hlpe3uj50a6ff7a", "2821657997049780736"}, - {"evmos1afh3mndsd0fk4s0cmufh6ynrg35xt2m62x8zq3", "4677738171320317952"}, - {"evmos1afkm2avdu9r95349p8uls6puneuc66ppmfk9p0", "691102442585620480"}, - {"evmos1afmj2mhu9k7rjevcds2frxecqykhm4se4s2kgg", "18755046137792716800"}, - {"evmos1afq3kqr457a00h3g9r65r435lr9ejpqf6r3kfz", "220778476899117568"}, - {"evmos1afu9kay7lm7y8ft5n79arkfxrd46rkhj3qg0yg", "13050340136598122496"}, - {"evmos1ag3uykdkxlmjmqrf049y6yczm70kg5ctk2q092", "2727858633197539328"}, - {"evmos1ag4lgl3z2jk8e00w8t43zgcrrnrlp47a9hvdny", "4320859690411057152"}, - {"evmos1ag562xeg86nvp5u89fwrmaxau096jsfgm92q58", "41059154210153619456"}, - {"evmos1ag98wkhly3jelu5s0s28k0hzadll3psu5p63aq", "2395983583598129152"}, - {"evmos1agd4d0fguq0lat7l0s4zlxwk9wdkfhmlt0tvxg", "197209744823021568"}, - {"evmos1age9ezsun4fr4d542hfl8hzuvfpe9wpsw9gndy", "6017414575637024768"}, - {"evmos1agehespcl7cmrpq0gcrr2c4yy7ucgguew59vn0", "411310711861408000"}, - {"evmos1agg47jcdvqemwe9wf49lkhza3f858yugz8w0lu", "894356507293197952"}, - {"evmos1agga5ccsp023htu0st7farhthlfw4nswdera5s", "782907973469658624"}, - {"evmos1aggmnvdhacmv6amk0m7r0ux6usxp5e5gcrs75r", "708270871384267776"}, - {"evmos1aggs0lnekn037yqpa8pmqfg2pm30w5synpjtu6", "832755790742228992"}, - {"evmos1aghzltyzrqpv5nsys87mh4j5qtrauqylncngw3", "2521392819682752512"}, - {"evmos1agpddz2na3dvgjr8u043xt3rpl7rplty6lcrka", "385790795181429504"}, - {"evmos1agqmyuzmhs9kt0n26gcgm9gfc7led2qu694ugs", "769685576007153664"}, - {"evmos1agse5x5azdc6j4nu74n4jhhst3x378r58pvza8", "39117542919416463360"}, - {"evmos1agtfets9g0j6vqkxd3lyan3pa0kk8rfppg5uqs", "367657623834129408"}, - {"evmos1agu62mtlluqqlsfzh94ndqs0gs7ad56xga53gr", "21380143860444160"}, - {"evmos1aguj6h0waxq6ugwc98alswus4yy03nkjzr8trt", "52215906658660352"}, - {"evmos1agxydaqtv8ga962yw87h60pnwjclmda0efmklp", "7583356545675812864"}, - {"evmos1ah39yvy9m8v57sh5l9qgfeegmzqn7t5gpvs4m9", "74733044162107179008"}, - {"evmos1ah4y30v6ffyg28f4xl4v88900qascedesndv76", "5797462126055913472"}, - {"evmos1ah7rd86ar4qmhfttqa2namqfw4r8ypcgwjr0ul", "1470579807527144448"}, - {"evmos1ah8fecttt48yv66qhjtu3dcpnuxjhpnea807qy", "502133746888830208"}, - {"evmos1ahgad4qvwuu8kclulrgpe95j03aas6we9gupw4", "24049141625593544704"}, - {"evmos1ahghk2lsk6a7n200j5dlefkx89p92l0vylxerc", "1751567868946595840"}, - {"evmos1ahgvydxvxp9q3w06vxyhucc6uf0qyfs77a6pzh", "29375710361405825024"}, - {"evmos1ahl8zghleqtv6s3tnexcward9tpw3fugmr89eq", "638208827744124928"}, - {"evmos1ahlgr3nggx8xmwzcga3anxtfmc2psnekect7tz", "676598914345451520"}, - {"evmos1aht7ren6tr0lgldnrrree6pfv9jk8ju9ug28xu", "9824557749623478272"}, - {"evmos1ahxe3h839aerr7qgyxgs2ng40zje6jtyt3ypz6", "7240799256449284096"}, - {"evmos1ahyp4h3smk29lhzju2z0yykm2yl2f7n99eczww", "210755312624302592"}, - {"evmos1ahz8qygu68e8x607srtl54002hpm0mpjvn80mu", "11208441623492132864"}, - {"evmos1aj054qup87pmnknczgfg7pmvhdnvv88vuflcvf", "9157947956186120192"}, - {"evmos1aj6za9029see4je7jf64x5efvfcqc9hqfp4wca", "16136273384345755648"}, - {"evmos1aj8ke90mpkyxtsgtyqmfjasm7gfc775fry0edh", "1483372849059233792"}, - {"evmos1ajahr6jz843fx3lwnprfrk44hz0cg9ura6u5sh", "1613329252678075904"}, - {"evmos1ajdn3uvzvh28y5za2mws8s2ujz2lgdnduqpm4l", "1764900796054446592"}, - {"evmos1aje9q9hwwa2qp6lytq2dwej7e074u945smdl85", "1493698910777398016"}, - {"evmos1ajercxg2ntj0z3pacjv362dq59wy2dasa6kgn9", "1889153375529994496"}, - {"evmos1ajjquznk6a5mgquuv3h5c676pd82gf8rqhrckd", "1013062656043115520"}, - {"evmos1ajjrj3kmamk00ywt3lenpukscs2exsvy3cpr7m", "632094146607917056"}, - {"evmos1ajm67g87d8e298953j5nsqjynz5j6v8u26g5gd", "1396416751449121280"}, - {"evmos1ajnz9guuqw45evv3hsyunnqd4kepd6kalhe79j", "4778614794086961152"}, - {"evmos1ajp7ga5wx9xdmz8ezr3e0tlumeu22tujazy3k7", "834098402590365696"}, - {"evmos1ajqc2hpvemfqfy3u9qrz26wmr88sz5at5h8lz9", "891749454741871616"}, - {"evmos1ajqxhgmh749xuqc30efg6kea8jqss20pah9kwg", "19146902820921950208"}, - {"evmos1ajr68u5nzg7q5j67zk8t4h5vsjw3juee2vgqwx", "56894612095421022208"}, - {"evmos1ajs9pcz8csxeuuslhahypngq7cj5q97rt009zd", "344439377460655104"}, - {"evmos1ajxe82cgk88r3fhv0j24wmfwh3l8twyyne5r6e", "9443500863373684736"}, - {"evmos1ajxrzlqk427tm92mlqg03zusds75upg66c6rsw", "3378396489247505408"}, - {"evmos1ajyw45fhf87ewdfwwy2lncy3zmnv8dc9j45z6s", "385840739409682688"}, - {"evmos1ajzmyewpxz4mcrtngtauxkzatcrprdlr8qpsev", "5648257046323376128"}, - {"evmos1ajztpdwv5r27h5q5dje8guf644dg0vx0hc8jfg", "3327292017593804288"}, - {"evmos1ajzzqm5uykrek4nl885xnuxu66pn7f7tma3esq", "9530077620674756608"}, - {"evmos1ak0r22atetx7g3kw2c9x5dz3lqd20np70r56kg", "385417978662724352"}, - {"evmos1ak67fzk7zsc2ekv9quevqufldmtv762jcrzzzn", "262932239034907648"}, - {"evmos1ak82cxzdlss5trgtwjg94cqt27qxtu9z4xr60p", "6185328982779875328"}, - {"evmos1ak8hxcpezuhsqegpvfvzrhpqr82f99vxjaw054", "1516721541833827584"}, - {"evmos1akfltgt2g95ne93f5p6002qg73pzkve6hfn3x0", "20863092916876296192"}, - {"evmos1akfrpq9gc2dxma5zenc3qm85nx62qd3jptgz46", "1065745075969419776"}, - {"evmos1akhapufcaxdvv2lj6wp0xyjww0sklqkkdd06vg", "758388398295955456"}, - {"evmos1akj3yke0ktv0t8hqfapp5jaghjdyxqltue54vm", "1443055751626121216"}, - {"evmos1aklh97ywwgfnkyxdmhknshftpaaj0avgq9saex", "5210365142050154496"}, - {"evmos1akqg898039m7t7w84mpgs2rkjgnu7wwz275ztc", "462234112368576768"}, - {"evmos1akrcwwy89s9x8jc2kvhdrt7cwjs7s3qsrwwpxt", "1791430524782038016"}, - {"evmos1aktczg7a7x726j4mcpluelxsq88y96z75qyztm", "1987464043082739712"}, - {"evmos1akv5h9pec87dfsfw6zs5lnyxuf9zk7em95a7f6", "9289980593410441216"}, - {"evmos1akv7sf42k6phgcj6e5s6j3ajcnp4gct6pz4vlu", "341013664262512384"}, - {"evmos1akw7r3exaxuqrqhtn4q29lxdzqtp6h8nvetz30", "693193891298979840"}, - {"evmos1akxrv3zz57t5yjr895m6kczqy7hqf45d22wps9", "2018541581935558656"}, - {"evmos1akyfsfkydvc0ldnwzhlk5zmedt8c2vttjnn6tp", "982847926818443264"}, - {"evmos1akz2vas6h8dxgvtd9rgpc2uwfuv7kyzfv25ds0", "793717046841669888"}, - {"evmos1al0x49a0vx9dgpeprs746j2tcftefqsg0t6gpc", "36693486601902391296"}, - {"evmos1al0yexmzfacw8hk2925qecp2z09askq4rzu4u9", "107505016100125212672"}, - {"evmos1al2fkhpud6065ghr0seee9gjns33krm5pxv0ft", "3987160017143831040"}, - {"evmos1al2j48j9fl4e4k8defvgc75hq0t8ehlhupl36d", "1678494502045114368"}, - {"evmos1al6wre4h32mp8fvd339jqhceddwkhv42p0m647", "925982476449939712"}, - {"evmos1al7r70j7p2n5jw8xqa8a9rmcf7xfl2rp0srn6x", "384575722150804992"}, - {"evmos1al8r3uc7h6ukxl596dy8t9fxrl0ka0ht2yhps5", "7412683377138652160"}, - {"evmos1al8vdj7h9hg9zr87arwpnc7pma49pupf4422gh", "3375842090641245184"}, - {"evmos1al90pkpl3u3lp9q43cc4mee6rf55m9g6xk9lsz", "302409351205551104"}, - {"evmos1al9af6yhnwc5pm9h6qkrxvazgss5rpxu64kfhw", "69328897469490432"}, - {"evmos1alahyt2e77a5xwmkwl63c26l430v07kktzdf7q", "2480166501046025216"}, - {"evmos1alcjz2awrsuhjw88hqfv8yre0n7st08mlkp40n", "326603270826494208"}, - {"evmos1alcmkvuuqsfj4gdd49k9nkurnu48czaaps6t2t", "6514622593205772288"}, - {"evmos1alfgkxg7rnaa28sd8ce932x3ef9kwazttade70", "42086870413127589888"}, - {"evmos1algpn9jhk3zg2m3jt8kcu0peaepu75wueptnr5", "1284114712078311424"}, - {"evmos1alhv42x85js50mx4amrw5vukqpf09cj3tyeqd7", "8153374970113767424"}, - {"evmos1alj22dpjsrw9yux4muwuss4dyutxsh6dqryce8", "1687408893999595520"}, - {"evmos1aljgtwcntzdgwaegnkw0ttkudan8ek6se3l55v", "1707595787854848000"}, - {"evmos1alklmvh7vjj7m7xwece86faw6qc4s36k83w6kj", "627883168046432256"}, - {"evmos1alkm5zmnxruraxjx47l4yvsujv5uwn03zgftnr", "7257348249303343104"}, - {"evmos1allssxqx3t40rq4pk5mesx2m7egurrk5a22x8c", "29186580064816594944"}, - {"evmos1alnzuwzg2fu4qkyd97vreu80nhfkttwegjksew", "973604076330637312"}, - {"evmos1alup7mmq78ga79jn4cxxsll3vy0cxhlfshlwz6", "10954894624257064960"}, - {"evmos1alv456rppcgs54m47aqc32xf8hgql5xztdyfz6", "608231360042790912"}, - {"evmos1alvye7s5pg2pnflmkvfvj56hlagse7mjav9nej", "8820801067424215040"}, - {"evmos1alwlz6gceyjd76gpq7y0gzxvckpe5new29yen0", "5315494655251406848"}, - {"evmos1alzllpzef6l3glww466ugyrevuk0pkzu4egyur", "321085799570059558912"}, - {"evmos1am396pej9q86t2htrcvpfcucdv5u7m3t6qnfx7", "2891590796640141312"}, - {"evmos1am5afy366v8nac4pfmk5tuuatcnuvuv8ud5f2n", "168605719566717952"}, - {"evmos1am6c6pz8cxxv5zl788jp5edlyaclwke99xqv2k", "691249363703976960"}, - {"evmos1am6jsernunrr790ggelwrfgrm8jlskkdnnsuzl", "46629460441780736"}, - {"evmos1am6t3kdxpvjdxqytuuvw9l578r3hdv7v6w6897", "13233432484988162048"}, - {"evmos1am9ehgfzy9mxtangpk99hv3d2qfex2l5n5kak2", "133126973610316800"}, - {"evmos1ama6mf2nn7dw9jruz9gumvs9wwvrsv6z4pcc9h", "19096695604446437376"}, - {"evmos1amehrpzffjqhjrp5rlnv6nxugagr7yh8rdc2rf", "429305718225382400"}, - {"evmos1amfgcs3n33pcrucgvs27svkyem4mt98lak7t6q", "98941924176479488"}, - {"evmos1amm6s6txpu326qsxampx9wy4kaecqs4mqps8me", "1036705346442178560"}, - {"evmos1ampqlhqh5t58qpr9qsdy2du37ytpes6mmuj6nu", "453909111979958272"}, - {"evmos1amqwqrt6mccrrf9tx75nmxc30w000shsrek6ce", "122278999079113981952"}, - {"evmos1amrx7h5sgpqduujfhnlt2vvyejlke4fnlak4jg", "4812271837759770624"}, - {"evmos1amxjfm4xf8u4d833c2js5n2yvsxx743q0xezfl", "7344415247694237696"}, - {"evmos1amyjlruqxqkvvmjxu5mm382a6y4tsttenfedyv", "8282552315107013632"}, - {"evmos1an7ls8nle3drhy2nyx80mx0et8le853mc3qhz0", "2724234745630961664"}, - {"evmos1ana07tl8w4qnp7f95sy5ussjeqh4rcfz9s696j", "890143243407862784"}, - {"evmos1anah0pnup9y3kdj0rp7hwsycfgpl2jdrjqldmt", "763336116063199232"}, - {"evmos1anau7xjqkagh2hnea9hlnjh89q5rr2pr0q8mjk", "1152247341826983424"}, - {"evmos1ancf4eggek72ncg7gdx2lmgveuc56dgw54q5ch", "2711453059774009344"}, - {"evmos1ancrvf3zxn5005ttf75pcv00r6yp2p4y9u66xw", "20299562333472256"}, - {"evmos1ang8rt60xkhgeam87znclc2lv2l9ghlydktq2s", "384448104948331520"}, - {"evmos1angycyus4z3plnr2czl09gtmrkfejnxnc38ekg", "7684852600516081664"}, - {"evmos1anksxuhttg425empe3xu4vxugu6s260ue6j38k", "1754214289578860544"}, - {"evmos1anqp5u9et3hs456rhgtqcq6v0ar40zelzrwkh2", "26835467306689126400"}, - {"evmos1anrp9kjy2g68jsaakq4zp6k9tr5608qmvp4azf", "2325813847874519040"}, - {"evmos1ansqdu0z6d4auhksegj0nw896f27sa7q7s0zw9", "2188902955756118528"}, - {"evmos1ansrterwhu60qygczfyupefxhx0xsnmkj3nz6j", "1126844076235825152"}, - {"evmos1antscdyllhmhxu2y79fngu4h5u8f20kdhxvupr", "161723099494190592"}, - {"evmos1anuw30x7k4qnhcq32fz7k6dc6wny68crw09ezn", "1495832981037697024"}, - {"evmos1anz6esulsq8su8yak0vmx5wyl4r64vxxu5rdgu", "2348514179483113472"}, - {"evmos1anzqejy6nmcd7x7u2t6nckf984y4skuu2zmpdm", "3060749522356289536"}, - {"evmos1ap3vvl76x5wz3qz873gupazavjw07lwcjagmgp", "2184181995363983360"}, - {"evmos1ap577ex5mfjyuhhh9lkgduc3mrp637cx67p5cr", "1589676497960779264"}, - {"evmos1ap5fmxqt70lup2pd4s9009prfnk5m0zuqw3ekl", "957712338168636672"}, - {"evmos1ap6che33ra3acm96kvsnas7txhl04vdsx8nujy", "4073069461137178624"}, - {"evmos1ap7h239xchjr9szj2nryvdut3l6etyjlszk4pz", "269508461315873024"}, - {"evmos1ape7t057z3mntukpzcr34uegr9azfns647676n", "6012210831699886080"}, - {"evmos1apecjgel4e7nrftrlnd3t8ghta59ard8nzkvkm", "1609540406251130880"}, - {"evmos1apgy94zyngh36uex67g9gh35js8altexr3e7wz", "204416768749809664"}, - {"evmos1aphht8pg5pj7rnnq82nqy4868d76mlu6w9rz4x", "29176181160959270912"}, - {"evmos1apjlxk06mue5xarqwf7tmztkkzfsaad5peheg4", "4060485392631920640"}, - {"evmos1apkm9eg4cvd5k0jmgyyuprvdhdjs0uk97h3hmg", "5179752781809502208"}, - {"evmos1apkrevnfre3k4eds8j7m79cmvrl6c5jn9en55j", "2297035543262060544"}, - {"evmos1app4enp6mxekkldq503nwnmw0c4jryjmughwa2", "205982775605199872"}, - {"evmos1apscgweuuxee7nmdkrd2us7zyhtrv6frgpp3vr", "36955251215769124864"}, - {"evmos1apvwy8dvn5kcynj2jtdpplgyft03z30tfuxt0y", "913057375424312832"}, - {"evmos1apwmklxs25k2xnvayrvhykyak8hvtax46dre7s", "7486847888471969792"}, - {"evmos1apx0kq59mf2lvepwfdysylwzrs9ftrdket369l", "37300247641507086336"}, - {"evmos1apzdexuq9kw9fzqflwkvem2m587my55dc4h5zg", "1291991027206896896"}, - {"evmos1apzgu6aj6mj3cya5upwdjnksvw5c426vyhfl5u", "369546293118190592"}, - {"evmos1apzny2usqhcngz93n46x5c0rsa3xw4zhzqkl8d", "10014501671993845760"}, - {"evmos1apzzn0xuyd3w3tcvs2485q3pfjljkr40su4293", "32629884100834680832"}, - {"evmos1aq309ly2nzgtcdc9kpjgd2f58u5hp5e4gny3wj", "12749650501284327424"}, - {"evmos1aq69zrlfvglg4xmq5hec4aluuwyky40yv360wx", "3204121212995388416"}, - {"evmos1aqazkyjl06vgkdklg7xcv64fc8vgta2ucwkdj8", "93445877683870976"}, - {"evmos1aqlafysq8czj6p2rzllmd0w995sk38j6t89pem", "806600356387848192"}, - {"evmos1aqmhx6egr87rwkn5k3vtym4gsnlj7ydd0kmnxx", "10546089798065389568"}, - {"evmos1aquhakt7quq7uduvg3ynqpd8s4jpuv664rd3r5", "658504508086683648"}, - {"evmos1aqyq7kvp579ydexjh2cqxs3l2htq4hvvax6qzq", "4528992412086599680"}, - {"evmos1ar3h98n09lhphjxuwc269hw0nj46jeznaw7t52", "16932554224791291904"}, - {"evmos1ar3zj8pg8e6eym89cq7pfunya6ac9z6dc4lfns", "2600309889426612224"}, - {"evmos1ar4x80ants3z2uchl4hylxhn9luhgkk08q53dp", "384091762028360448"}, - {"evmos1ar5kq3a7nmzl905hvxk6kg6echrvhfc8ra5nha", "585059933163918848"}, - {"evmos1ar93s3lg46wyej3t835c5qgsz2mje7nlpdxdet", "3170545093883112448"}, - {"evmos1arct66fdkenzl75zgykd9ufmvlnwnartpahkuy", "11399068699904401408"}, - {"evmos1arhnm8qtevpnjn9wllsf3mevxsjuwcwqfeyje2", "235573226141811200"}, - {"evmos1arnvrucrdtuhuautgl9955cax7eyz6fh96qxhf", "403694559613185536"}, - {"evmos1arpcutn7450kr543y4qsahwqsx0x332uu8kuge", "1782287533398754816"}, - {"evmos1arqwzm4g3vf86m8vyn3pk8yvf0slfyn0sa70ff", "1903454435671031808"}, - {"evmos1ars9xe8259xamg2c8h7j5d2zj85stnhnugpwta", "2043396362541931008"}, - {"evmos1arsnmpa2zqvawggdrvr7vd7yly9ajd8x2zftjw", "9179883619293782016"}, - {"evmos1aru69zz4f74tht9gc62xhuhr5pakshqjf7zfpf", "183641856212593920"}, - {"evmos1arwguvtf8zxzdsu68ypard52m2h7cshjke86cd", "957857649319735424"}, - {"evmos1ary0vhxvyl9sslv4p3nmae6lsflej707z0m0s4", "1079519698860809216"}, - {"evmos1aryzwxa294rklmx44cnj0m8x854wvcwldu80tz", "1501569553319127040"}, - {"evmos1as00a9qwnqxm9dfz397funl2k5dz587855qc6r", "1366655431758437632"}, - {"evmos1as25qjveyjgr7z9exf6kagvj32vph90ctcvngm", "386702725282898944"}, - {"evmos1as4089v9k92x6r7kj5qcvgllkzxvp8gm9a5kmc", "900314147971040256"}, - {"evmos1as5xlzlptsavhju7mfa9csunl5v0gja6jwvx2j", "5206118482556080128"}, - {"evmos1as6rup28xnflf60qvnlmpwy5la00hj6kxw73pz", "2783252425797713920"}, - {"evmos1as7glpvz44w23rs89akgevh7rw4wmfxs4wz80t", "18662341668751872"}, - {"evmos1as7jxhk0mg9pqc423zhmt982jvt2pkh6ftqd4p", "441380230175147520"}, - {"evmos1as8e3d8267crn87jrasdpgexsyuuqses9pwx8v", "762525946427266048"}, - {"evmos1as9vklmuv90ntgmsq5jekyxd3ry5atuemw08gp", "15901462898785015808"}, - {"evmos1asaawjdx9h3lfdlqg0vglyc3ud2ph89zd7yy7h", "368913515245095424"}, - {"evmos1asctmmrw4uyxfa7u9kcfag76jrs7dalhuqp5vt", "3761879276571137536"}, - {"evmos1asdkkhay3c4w3rnrhykhgq6n5mws780lpwfesj", "2990839327886869504"}, - {"evmos1ased3v9u68gu5y68vlul3fv8rjxnwdr44m25vq", "2045590429570482176"}, - {"evmos1asgcruv2hm54mwesrlkf7kunmej0aeamj455ej", "114933114824937984"}, - {"evmos1asgznc8g6cpd36wxtk9p2pugudpxdmuxhn47jj", "2858276869138882560"}, - {"evmos1asp5v6utvj834n2nv2swg8nfmu3pjtt9f2csd6", "15794114824506503168"}, - {"evmos1asrf35m893wupmkfgn3jetyywxazqrqccvq3c5", "35373648848959422464"}, - {"evmos1asscjukyw3097rpv896qjdu8dl6ld74cv4kc4f", "4059437182986143744"}, - {"evmos1asvctuwj08lesnpr8rl2nv447h358m93guh2f2", "1393494185814802432"}, - {"evmos1asvj8euttxvy9js8z3w23unmyuvqpd5rxw0qqg", "2730444284306571264"}, - {"evmos1aszls4ue0kqgs5tlk0vrk6uau2h2n3e4fxg55w", "2913912015403139072"}, - {"evmos1aszuqxj4xhdl0wlzq860yta6vu8qmqa8ksuq7g", "355318721792766976"}, - {"evmos1at0vercsfthcdxlgn6v0e09u4fssm4y4xtsxfq", "15246686402544005120"}, - {"evmos1at39s45dqkuu6dqj5fpeq46nhjseltm9va8k7p", "478378079268545792"}, - {"evmos1at4yw2mtpytz6a0ewevlxlvqxur5w7jfvm4ds0", "1296641225878749184"}, - {"evmos1at54w4v0jt9u47zthdm3tdrvq5snu22n70qspt", "520517022615248896"}, - {"evmos1at6m3aawe7w0l03cw35j80uulhvxhwyrxvrz63", "2559568587565611520"}, - {"evmos1at777r75g7fzjcasghyevzz8rwleq763kgt0th", "2060592745857640960"}, - {"evmos1at8pddg2nj03suzv89jrecfxp44jz5dl4w2h5k", "8100755027875303424"}, - {"evmos1at9uz4r0n60t54g4zzjgtheunp0rfsdndllpyr", "2374164549747302400"}, - {"evmos1atdak6d3u8tt4sa4fwe90m57cm42fnumjavgc3", "9202982336839487488"}, - {"evmos1atdupv2e09x4ps06q85xwy95z8j57yscm2wzjh", "28937490707557556224"}, - {"evmos1atfcmdqxjm5749juhl2u0qennpgz80jf35l85x", "3988333964568231936"}, - {"evmos1atllj55zhgc98l6fh7mhlvm77vr4f6mz2tvc43", "5373917248907589632"}, - {"evmos1atma2ydpj4kf62t7lwedsx6j3vmarkxh5ujdyp", "21091924450053259264"}, - {"evmos1atmp9870pdxcz8fyct47gtqxmau0mcjacm02tx", "2913116322761050112"}, - {"evmos1atp5c57fvrgr994c26ks84uqg0snf05py7k4lm", "39514897552014336"}, - {"evmos1atp5gyh345htqak08469mrjjd4ues4dpetvetk", "5912828329894795264"}, - {"evmos1atxd2pw5unhyznxk3uk37pqrdgl2zzwtpafa8d", "14648925587773526016"}, - {"evmos1atzyd2rqj8dvxc6gma07cddqn59a3e7h0ddxne", "6286846447290892288"}, - {"evmos1au0j4wzhjhsttgwjtvvqzwzq7568s8elslm2uh", "1536483686423891200"}, - {"evmos1au2tnxg947ep76ufphm6s64qgwmd5v6wdpxumm", "827022089715200"}, - {"evmos1au49yd24htwue7l2l8xdss3plvr2a7a3zcptql", "3448723712143990272"}, - {"evmos1au66u20e8z34rnrf2lmhqkdw79k67n0guqwmt4", "84548464690969600"}, - {"evmos1au7nhkqz7asvd5fekjfddn85swqng9c7sql6ml", "30033392336487878656"}, - {"evmos1au8undkhgp0uqa0l60d5wjgyjgldmhan0pxgxn", "98702591140174233600"}, - {"evmos1aua672kcqwjanvdykjn3ndaju8q79c4eshx43c", "248824583392123904"}, - {"evmos1aua9k08aldln37ytyhphtuz08lchq2m3dvnf9e", "79683942899786240"}, - {"evmos1auajn7hqy27w2m9pw9cz6sx5h6ac3rk6hyysve", "97788995961713664"}, - {"evmos1aue7rkffe7e0ltyw3yayw60pj3psvehsyclaxt", "2955468025536466944"}, - {"evmos1auf9uj0mrgdut7qztvmyef2gvd50lpaf7p9p27", "2044960353637075968"}, - {"evmos1auj9r0llq52pa5yt78jmjxunwm0ud7fxfrlqgd", "10488957236850978816"}, - {"evmos1aujsdqlv6ry6ju58z5ghdf793nquqjpngtnggz", "1973715877410574336"}, - {"evmos1auk3h4prqctpzhe4g77cr02xurerpvemwmwdn6", "243579666970838016"}, - {"evmos1aulqs06f00qz22uymlnt6u89mynh4xp583zuyx", "6407282810794672128"}, - {"evmos1aum7h7qxflaw4n5p7u9x5wrhuuhejxxneyeqee", "22796339896522240"}, - {"evmos1aumj9xws2dx29twxzx7nr0qf5qvpklnuaux52e", "2417727947813240832"}, - {"evmos1auqu5prlt6zghk9h3atphhqwhak9avfh220rvs", "89154795169427456"}, - {"evmos1ausexly6nsr8lu0y2ve2nzqyhme967yegk2rdr", "957834125739978624"}, - {"evmos1auudy8qxj2wsyd0260qmfngtaxv6nujpgsgpuv", "26045221101808680960"}, - {"evmos1auvd25guzsw77qh8yxk2d65lsw4mztj6cyjjdv", "1873763169838489600"}, - {"evmos1auvk3vktw2wm7d4r4elhz8j7ltr50j9856d8mg", "378677591648755712"}, - {"evmos1aux40ql3c0wkh5fu73hmuh35gglga9h5avdack", "474144735831687168"}, - {"evmos1auyzmafx8ap6xyhg559qeagrn0cejcguf9kfxd", "2189707561708208128"}, - {"evmos1av0pcu76p054p3x8hz2pmuv6653x527rkk5w8h", "10926815831614038016"}, - {"evmos1av7ggscc8ksjd4gl8xew8y7wa08e8safga46pk", "8619099281299001344"}, - {"evmos1ava2hgxdnyh2535qvuq83p2hl4f2r9zek7ac0m", "1007825363036872704"}, - {"evmos1avafuujcwwqwy8nmuqcren3qurtel5zncddtg9", "287688544753791488"}, - {"evmos1avc2rtz3k5ll9kuwth8ndvq3tkcfm0wctwpdj5", "3586200529711605760"}, - {"evmos1ave90vt6zqxdw4dpcxa4z4vmepmswla4xl3jgs", "66990499905837752320"}, - {"evmos1avfw4rpvlelsqtncuhr73wf8pe5znahaz0gcc2", "887648145331205632"}, - {"evmos1avg967lwawdqahv60zdu4ku3gm8h8yuua558us", "3240161114419920896"}, - {"evmos1avj09j5qpmwr3sepujfswt7u4glrgeh278l4jl", "699547551819763200"}, - {"evmos1avknuaey6eye337f06cr2y9rytatqkerrlghrz", "92512496299611392"}, - {"evmos1avmee8rauvupvnwcusy3mkpwga5r4yxmqtpu0g", "597389605150303232"}, - {"evmos1avmf4pqm934ee9l4ahx5rrn09e92ecl0w6emvg", "1617978691546641920"}, - {"evmos1avnkc4yhh2yrc8lc36ejyvg4je92an56s92gly", "3996512583065414656"}, - {"evmos1avp6epuk7ckxtpdwcpvtl7fdm7z3m5nyrs6drw", "1914276912516848896"}, - {"evmos1avql69vy9l0f7lvam70jta4v0z3dxec2thas7d", "317966136347164160"}, - {"evmos1avtampwm2fy0rrk4hzfyhx6jz6g0qwyj0dda95", "129394757460960768"}, - {"evmos1avvdnl8nxmk3459kp2tw2uxsx2fqj3gygm82ck", "18534681120561815552"}, - {"evmos1avxvzzr85vn0x0dydkc7gkapywwz3xquvrvejq", "78189398498922752"}, - {"evmos1aw0mu5me9gsajxy74quwdaeq0ww5dum6mhf93a", "2733305622804174848"}, - {"evmos1aw62jdvt77zldnd572x4xt0mla3p8da5jkx0rs", "2204162756420732160"}, - {"evmos1aw6l3s7ex8u7l3jyu0mpsqdz7uknc8fweywplx", "1476275896085475328"}, - {"evmos1aw7q32tshs6dd6zrkum62vcdt73a89td0du87f", "965269870734610432"}, - {"evmos1aw7uq0j7zf5nn2mrwcmpcmj8n002plldmfp7p3", "1983144498683199488"}, - {"evmos1aw9fuhrlevpz6ze7h9c0azw6gc4qwmwh3httz8", "639897474324045824"}, - {"evmos1awcjxhx6vl9vxlckc7eua3c8ewsnm5q3x3q9qn", "6312552504507987968"}, - {"evmos1awe5q6echaqg3x0j6gyjl8mrd5pltv9uqy8589", "381738647539140352"}, - {"evmos1awge4h89jzqctfhkeps2ks5p96p76d26cj3fws", "1427480137066147840"}, - {"evmos1awgttrz38wz2n33ep44why3e9c7pcfz3zkkv6l", "1995865021818683392"}, - {"evmos1awhw56k8szfdp74476k6a4vvrwd3zlc5nx65xp", "3307211925940035584"}, - {"evmos1awpggvmllq4qv37ffznypz456jg9hjy8kp2z8m", "832923435207252480"}, - {"evmos1awscjxnz9za9ncy72yv2w64aud0uhj9kff6aft", "13365585307307272192"}, - {"evmos1awsdld3fgw9xgt3k3cmks8a0kayc3gq8m2c5dq", "1423935198906392576"}, - {"evmos1awuctnqvm5yjvpx7xnxaduq90u7f7g0wnfyuyt", "1562971234460532736"}, - {"evmos1awutcayzyc5mle065tk4d6jmhhsv60k5cjs5rr", "1311587289380058624"}, - {"evmos1awx24l9jkcwux49r7vgatue5r0pfj0k98t97y0", "274932022355785728"}, - {"evmos1awx5r3hqljwq7mtkpfpd73fav5z6u4zq4jdfn5", "2676368293177143296"}, - {"evmos1awy7svd5t3qm8qaj3v2838r349qkvjkncratn2", "384314424118280448"}, - {"evmos1awyfvezltp0a6lp60gx9l4mnt6qtycj00m4q2r", "8226290307118153728"}, - {"evmos1ax0nef5ne85kkq05zk8z223sgx6dwjjehsvshx", "11373319575522705408"}, - {"evmos1ax2w7h83lkj4fvetuvtlu73uevjrs2ppszr7re", "2739199216777195008"}, - {"evmos1ax48duhn7qezwfwsrz7we55jd8cd9ustgnfvrg", "450171032234922240"}, - {"evmos1ax4v88xf5v96ek36xrdvwugn0dvav7gjwem74s", "3011720241032668160"}, - {"evmos1ax8j4y9ajx9pkrqajqq9ezhxhkag0k8nfdekdr", "8448870640434708480"}, - {"evmos1axaql7cgurj9aszpz4vsk9etsrc987a2dvy522", "85865174337597440"}, - {"evmos1axhdm92czmgajdtuzuz0l4w9kt4vsdhaqpygfz", "2392227450165261312"}, - {"evmos1axhmj56kj4rcdaydqc28m2pf2ezflwrsyqgnhu", "51730035006504878080"}, - {"evmos1axrf8usksl7y8n4fkkqnq7r33rugfq027tn0xh", "10753715009772990464"}, - {"evmos1axsc2umg3pylpfvvrnpqgyynzgcy0n3746me0e", "414517256409846528"}, - {"evmos1axscdau6jj6qhf3a3dd620fz0gaxmk0n8gx83z", "17653238992707600384"}, - {"evmos1axss644en8ad9vnkcn8fn2048y3qrgxh356c2d", "9847176086969065472"}, - {"evmos1axu4wncl4rlmkzzsv8u4l9lntn58hdnedq2wh2", "1195987839947016704"}, - {"evmos1axw0250f5grefkp9rms36sxd9rz9s2hsezvnym", "5771080130468347904"}, - {"evmos1axxw9dan9shd5ralnut4vsv0mh3zvk2hksvs6z", "4819940974145650688"}, - {"evmos1axy5al5l7rf7k9nqg27xa6h3ralej2zrxaj0fs", "51936953501841408"}, - {"evmos1axz6rgfy3wv4ye5xjfvvm9jlrhs3zy0v8wz2yd", "941624856657856512"}, - {"evmos1ay3akprncgqgu4f0n075ygvy47w6vpdc5qtaum", "604663522498838528"}, - {"evmos1ay5wuy2r44l94rt7s7fv0xrjl3v988khgdjmv2", "1384199656966383104"}, - {"evmos1ay63zanksvqvpvk4ftmtz8w23cn7ly90aau85x", "5068916550803502080"}, - {"evmos1ay6f3cekz6klrtjdeuwgm6hncgve0sl660fcde", "475041013849547776"}, - {"evmos1ay75clhj28z6yws9fjk05slkmmzvrrs7wda6p9", "171591538311332462592"}, - {"evmos1ayansr6tgeegm40q6rk8vm23ugu9jrwnr58rpt", "27464915537449295872"}, - {"evmos1ayduwwze2z4uxrc7sg75v9xp8j8vsd3qhj0qm3", "1578441237339762688"}, - {"evmos1ayg7jal06geqdkhuuh5xntag5wrpqk5yz0ry4c", "7037070438923115520"}, - {"evmos1ayk4t8ues4c3f3ss40h5w0p3hcuwfgytswkkhp", "105771833608091904"}, - {"evmos1aytkhwr9pg42vcddfdzl6rqw7rl6l46t6vl2zx", "3205917112611139584"}, - {"evmos1az4x0t7xajzp2q2q52u2v2ke3aswc7h3vj5l4u", "3983101981952278528"}, - {"evmos1az53vh8e5tzgz0vf3vnpg4pd9durpg2xgq4wt8", "10763764351278004224"}, - {"evmos1az5aql6xn3j427ky02v4kef967uh2thqdxnwxq", "106867631035416821760"}, - {"evmos1az77y6tlarqe5eka9h8lw92w3ph5y0f4yknx4p", "423797839264129536"}, - {"evmos1azcc6vrxvtsazdmzap0d3lks67gxfv5s54h0gj", "463106527595346944"}, - {"evmos1azczfakmmmez29mp0mh5u74gv0yel5ped8ehlf", "1140122210062632960"}, - {"evmos1azdacag7q4qdljza4suayzxqm6fn7lvvpcugjr", "357724146838199808"}, - {"evmos1azk6ag962paz35fsjpgman45mdl7xaa0whstpt", "5533222606203314176"}, - {"evmos1azm7zs7zmmy9scusyj3qh0je09m4ru2jsccf86", "1424382437357834240"}, - {"evmos1aznqfh7tnmjkqzspg4xxapj2yqc8y3prdy9lkv", "25451906044379398144"}, - {"evmos1aznqk3jtm72ksc5njlqzjdd2yy6qzen3zgqvqn", "622467196989116416"}, - {"evmos1azshuf7xvw2556cnzqkm78tw30s372s7z8x4gx", "884376173493802880"}, - {"evmos1azv7q3yuyh6urzy7rf7uw95cejhmnn6h6lpzlm", "1911525360142303232"}, - {"evmos1azvjnxtnt076jqm5jvy2vx8thhfk8vukwqjzzt", "164687658484909604864"}, - {"evmos1azwx5da8jzcuywguvgq9yp0es22g0pwv9xem2q", "351764136389038080"}, - {"evmos1azx0apf44ufpzgdyk367algnmtj0h3xv55vhjy", "1189503054229374464"}, - {"evmos1azxjzdlezeksqnzl2wugujrepuyexnu523tywg", "3400619724183533056"}, - {"evmos1azyfyqfzzmq9r7fzpfseyvq474ru3jva4cgc6e", "137236709786936320"}, - {"evmos1azzhj2egstl78nau2yz9lv4hmrgkpfm76fwkrv", "1614207148100595200"}, - {"evmos1azzhn5a7svl4nua8h5mdtlaf2xaruef8gctqvs", "1555495147553525504"}, - {"evmos1azzsqaaajyph5ctw3dd08g8mm2z3rv3fqrpej2", "4368883022370039808"}, - {"evmos1c03hk6y5qgwkfjrx4dm3mjcdzqqn4d6v3t6p22", "1329414133826215936"}, - {"evmos1c03wty73lyjrjppzfwqw0w0jwefmz3cqu0z6e3", "4946785123437114368"}, - {"evmos1c04uc3n73xjjs0m9gsx96da949wwamjd599pxg", "202120670056181760"}, - {"evmos1c07ym4nvg6fntary9twge8kz8jc6zzfummfsw6", "1931556622275521024"}, - {"evmos1c08gs0nm8ugdk5ug8dg58s8xlm7yq546a9m2v8", "6290362840038735872"}, - {"evmos1c0d5ldwg0qq4lzlwsq0rnk8ff87zg95ypf9m4d", "420133501579272192"}, - {"evmos1c0dsnnghl8zy9t7azexpzcyx2qmzkgwyxevazc", "25383549891444965376"}, - {"evmos1c0jy9s9xve852e5hmj0y3wsd720peghnuqe2dt", "5038599682860753920"}, - {"evmos1c0lhtyu86ac2u8sqjvlpdx6udxr8n2pv4vd8zx", "10410290996793188352"}, - {"evmos1c0lnrx5v9q8n2ykn36gdgujnnp290g28ltnhys", "2762585324469012480"}, - {"evmos1c0qfztc06tr8veyq2rlez50jklenrnxzcduc7c", "476007264193609728"}, - {"evmos1c0ruypa3tq6sy58lq3yeq8q99l2lf65v9fwxkq", "765707626349587456"}, - {"evmos1c0t5dye4nxq40lxv7rfer05xvetcmyg6r0kn7a", "137172723378798080"}, - {"evmos1c0tv4x5du3lzx3lur9l0ee8kpafywq33kfhtja", "8660340987462311936"}, - {"evmos1c0vawnhw430rnrm6073a54735f8yja369pysmk", "6620995337774086144"}, - {"evmos1c0zz0ehywv95jq4twcv36nqn5nelmrjdcl5uev", "1462425940715041792"}, - {"evmos1c22mntujkstsxvv7548qdglga4y56y22v66q3h", "904146037342907904"}, - {"evmos1c240v3w39fqx8gp6r304vnwfatqcsraqlkzneg", "34771438712510676992"}, - {"evmos1c25zw7jq4x24ylkcvrwzl6q0qntd0wkd7jst76", "7383979752717090816"}, - {"evmos1c26tyn320fm8jr8lc2cyp529nu2tvey6sdq6e8", "53591674708977680384"}, - {"evmos1c2cxhqshu4neq28q5yfaawazzzzy22u9mr3xjy", "1788981592580538368"}, - {"evmos1c2dwset2n9pj7mak4jvjz9malg56c8v4fzrt5q", "254309915509656576"}, - {"evmos1c2dzf6p3l7l3qxukppjtln4xym72kanes20rf7", "45318299043143450624"}, - {"evmos1c2h95ee6v03yulrk06mtul6evdmxtuq3ryn37f", "1469932186075554816"}, - {"evmos1c2hadjrrs2ul42xrhumnuzzfpwaggcynh8pk07", "2092698383494651904"}, - {"evmos1c2qjpzz50hwrtmlnnvztst862sa78x2dgvlgck", "15009440849924096"}, - {"evmos1c2rapvn6chrqm5kvclzjdmn92erex4rdas60dn", "447837007942248448"}, - {"evmos1c2s6dlwauh2a7v63e55et2zsrppq9yyxd3a4ke", "1551330181754754304"}, - {"evmos1c2t6s37st5etzm55cyamzc6825gal7jdku9l4p", "4904452835673000960"}, - {"evmos1c2w6hfen5gtdjyj6jy79gka2n2h267tc6y8rsa", "684305646687397376"}, - {"evmos1c2xcjrpudj38a7tcgn47nyudlnm4a23qk5kzu7", "5690489836165840896"}, - {"evmos1c2yf3a7hq4dmm9rn2ycverj658s9wmy687cgey", "855459009190534656"}, - {"evmos1c2zavlpdayn660vmfkkd4j5cxpr0mpaux6kz7y", "74653597816117504"}, - {"evmos1c32cw9lzag8qrmehxu2hwr6w57n9r3rfa8m7mn", "3209779174932583936"}, - {"evmos1c39tlldjx2l0kfgtc8mfaqlhc67zmllpcjf6s7", "1178840073293176832"}, - {"evmos1c3aeg0sq6rtf6ysd9zgflq0jl8pj2yfxgk26s2", "484119536508900352"}, - {"evmos1c3au5unywxt8kpsstpelq0y7zfsny9nyzy2hn2", "5525855396432226304"}, - {"evmos1c3c4dsw2e0hep8jvcn84mvyynl29973ddvn33x", "34470497618608128"}, - {"evmos1c3c9dqwcn2sdsjely03c9gaycrxnw2eg7dn5g9", "274218632961722368"}, - {"evmos1c3ctl9qhlq9fy2wukerjcyamk50f9vuwxngk86", "264724471103570944"}, - {"evmos1c3gfmhwjw4n6m659p9v45f0glfkgwatnds9shq", "2887056276159406080"}, - {"evmos1c3gxu05jup43g963r9d7usvwgq3up4ma2q9qnw", "464879502899865088"}, - {"evmos1c3n6uv9vzelkyrpsuppr45p4mj6wr9qp7cdyts", "16466764682771075072"}, - {"evmos1c3nkdzy9atq5dafmkljaqufyqaptjpy23pdalj", "721472961710606848"}, - {"evmos1c3qha6g7cy4ffnuvhe0g7x08mwzt3h6v0z9q4l", "2333313742135492608"}, - {"evmos1c3qxvwnfdequm27akgwyxylh79prr634jda5z3", "1044102729230988288"}, - {"evmos1c3slulrdnen9yz2gxtjajpuvgzascl4jdkrd6e", "1170045695275745280"}, - {"evmos1c3tczye3xw5s5ggc6r8ew254jttmd3zvq4fs09", "4042452295253504"}, - {"evmos1c3uv8jjugckvgxkadduwuljjjn8fgjcl5u4thf", "315445142085044736"}, - {"evmos1c3v0wh2cjm9uagecjqnly0m4nyfvz2xezlvtr8", "2650317711936249856"}, - {"evmos1c3vsy2nkprds06sm2r9s0mdzhl5rupfty4h9dg", "53468086494574280704"}, - {"evmos1c424t6r5g3weq33xh5kymysw3qufffsuus5pxf", "14042255812721262592"}, - {"evmos1c43ux2tr9rj3e3aw6wx80nlxyu4nkatl2tys4v", "1262673202706977792"}, - {"evmos1c47etq0zy7ynqyp3gp0syapwnhczd3z0z80xuz", "593694885425999872"}, - {"evmos1c47qtlamm4llpfkl5qk09fknffpq6d666mka4u", "21892630336786944"}, - {"evmos1c47ugzkkhrfn80wm7l3cuvqk39q6jj5kwk2cnl", "1093651383458374144"}, - {"evmos1c47v7ufnntv6p4h8v90p842m5slcwl3uy85pha", "15507779426905944064"}, - {"evmos1c480ps6dn5hjpmmdvjqask73klx4p97r3v866a", "3615770737088684032"}, - {"evmos1c4c2t8a2qlldqtckfquztk8g740ldy4ytlwfp8", "4789496209683030016"}, - {"evmos1c4dupsnqyu5g3lquup833clqu3s889sptjypul", "560786145022710784"}, - {"evmos1c4es3lmd8ffcezs3tnuxua8kw5ctlz7wl89q49", "814453001345503232"}, - {"evmos1c4fxvjgghm84u4ukc4cvs4f4hxrsx2nzept7e0", "724258434833361920"}, - {"evmos1c4jjfumy7fh0f34trevysger2uupqgqudw6lka", "1627880777342798848"}, - {"evmos1c4jlnk588l84cnxrr7t78dq8nd7w9wgv68e9g8", "2571420751474688"}, - {"evmos1c4nugwm8ra6v3k4gkezypcucqv6hl4650jh7hd", "1612068210371018752"}, - {"evmos1c4pgg5fapgwkfyvh6nvqh9azgj4rmk73va5u6z", "6636113229976168448"}, - {"evmos1c4rf6m3nuu5fpag6hs5egcgpg5hr3dt45wjzc5", "2603077314280753152"}, - {"evmos1c4rrlsdwnmwrsfcznd7cyu5fpj5wvlfygyhwvx", "12211361132864045056"}, - {"evmos1c4ulyz079d6jykw9qc9cp5u3z2hj03sv70yemf", "3757738857033187328"}, - {"evmos1c4vd0chv507npp2r0tzhyxdp3zlg9mvcl3tgr3", "3985217019683012608"}, - {"evmos1c4vhe87g3ndx7gddzlnqtkkx9xp75gzpqgwjxj", "1396605113138973440"}, - {"evmos1c4x64lud59l9ha5cfg2tu0v7m7nnq9n6p43ggy", "3171449817656541184"}, - {"evmos1c4y8mmjeenyrsf9ma5tqeszuc4gxlhwvtysd5a", "1495360031083525120"}, - {"evmos1c507lw00s0edxqzy3v3dkmavqvhedheldfnvhd", "6351845998033042432"}, - {"evmos1c50m29rle9aaxlp22sqcz5fkw6lcz5c2dv72d5", "4309306820341713408"}, - {"evmos1c553c9lvaqfqf6lskaznjlw08fxg47gmxj0sra", "2911476256419670016"}, - {"evmos1c557q9rrpz9kemadj565fqm0qqccd0zsch6spn", "3606673065780101120"}, - {"evmos1c55whfc0zzhy4tknav67js4m0qjhzhzer9z3z3", "3123307165421609472"}, - {"evmos1c580l88nj8slh0cdyp7s4ef25m03kcpmz2fwn8", "1263380184851911424"}, - {"evmos1c5afh35zq2m6xu85hujknlamv6w6fwupk4rvtz", "555295888595501056"}, - {"evmos1c5e70ddz9yywss8s7ne6u6vtvcajd9e6tzcamk", "46236073085390462976"}, - {"evmos1c5egaqd29g04mc7308n4tsahvxnwsnkz4yvhs9", "31048323024368320512"}, - {"evmos1c5fme58tnu4fcjl9raczam3ash8rjl4h40y4j5", "859542456163376128"}, - {"evmos1c5fmxn3ay0r85adxuuaqhjume23a5kw3dwl2v4", "1422831083634515968"}, - {"evmos1c5jrvw7463zw8m3uvfa9m5j0xrq7pdw3nm2e2d", "36412247527512809472"}, - {"evmos1c5nxtvmlal7h4ql4wkst0wa9ukfwud7hvacq97", "2519302243187660800"}, - {"evmos1c5qav0yud74ufkkru4kppk78u34ld9qevwxacl", "685337606879345664"}, - {"evmos1c5qe8zy0677jfhnwt20tr7c9k5v635l4pkf9jj", "7309598880232226816"}, - {"evmos1c5rw73geutyzqflpej68qan2t8wvsdv0ets6er", "37804396919181950976"}, - {"evmos1c5s0fvhux8dchadajk009xg5pgh0grskr7fna9", "384498519150480128"}, - {"evmos1c5x3ykrw5uhjw7dxxp6ths58dggj7ccdzddzyu", "150652019179577344"}, - {"evmos1c5zm9k57dpql6yfn49j53dsmm7tnst4eskc3lu", "226953738279226624"}, - {"evmos1c5znsew9sza2c3ldk5fuknqrxx89lzk7ej5g7q", "14352196447961184256"}, - {"evmos1c63vfkufrtm2yjdgzww8jf9h0n9ce9murm2vn5", "7276747944513721344"}, - {"evmos1c67rvwgj0jkguwxwlst8qyya3lkl6xkqvcst9s", "883812350773164544"}, - {"evmos1c6fkpm7ccunm59gddw5k0g2tl6jdveee7ytkhc", "4227899386365047808"}, - {"evmos1c6j599q8l6f7ekv3s8smfw04mw3jnah60zltjm", "1183804993345081856"}, - {"evmos1c6j65k3skcjsjzsut6t4kgm7n4ydeqaqdfz0qt", "6151807075844313088"}, - {"evmos1c6jlsj8v9g2f5gcdf2xjf9hpz8hyjfffl32g5l", "1395902168066347008"}, - {"evmos1c6muk3yqzpsfgsp3uz4mft45flurguah0hlm9f", "1104106554556991488"}, - {"evmos1c6nd9de8rysh6n8e3dxa2d80smcf7zx5s5tqdr", "2934984879261932032"}, - {"evmos1c6pm3fuvkay2fk2lm7x4ww9grw4szyu406k0zw", "29243381546184253440"}, - {"evmos1c6sj0ne60e7awul5qekft2s8nvg2s8wy8vvetd", "33304774831054315520"}, - {"evmos1c6swy36374kf3tezsf60dlhqllt4r95d4zhkd2", "9471144540221054976"}, - {"evmos1c6tpj8rf5t27hq6eaw2mw33daw2hwrsuufvlpw", "182230733305452544"}, - {"evmos1c6vnaanhg0lch9pu5spgx260lkq35vd7lrh4f2", "711972987165353216"}, - {"evmos1c6vnrt0tsuvnyfu89ydrmgrgqhje4yztfyf2ax", "279717883805838336"}, - {"evmos1c6w99damegnlyvj4cz7q2atwgvlpus030cmh29", "10054427167137542144"}, - {"evmos1c74cj8euhq4afh03h7u4g4wpx2ttj6zme8mxmx", "432694491502221568"}, - {"evmos1c7840q4u0cjy2z3ur7tm20aftfkq8gsndaw9qp", "233559198037427456"}, - {"evmos1c7cknvggchn4nyw9yzh2ju2q2dpfrjqa99pnjz", "3626365050521060864"}, - {"evmos1c7drqxwgynj390rudukkfsxv43fs3gpqrp3quh", "6882688208641731584"}, - {"evmos1c7khu98thtvdwuv8a6y9utjnfzefcgj5qegytr", "641321751065673728"}, - {"evmos1c7khxslxeh0dkt8j6xysxajyxm4uqq97tdyymh", "1000302323425329152"}, - {"evmos1c7l9560smft89clvl2h422d4l6qasqaphyk3lf", "252693578012450881536"}, - {"evmos1c7lcge765nm99el4q9f8frn8y6v92pq6re37xn", "3338949487271376896"}, - {"evmos1c7m9vjf9m7qfmz5m4c5kegm60mzk5yj59tk9da", "1858430562768963584"}, - {"evmos1c7pkdnp25gl0qsym7yuq8dwvv9zlhg844utwvc", "1281327334002196224"}, - {"evmos1c7quy3nw8xmdpakhayhdsstlv9f4l9w0d02j8a", "411620545128152832"}, - {"evmos1c7vzagxc8kst48t9k4mracz9v2a63gl6e4j3vn", "36652908414441861120"}, - {"evmos1c7x5f4twpnur0xczj4pzhfp8usrkxze3d7j5ka", "1304187856998270976"}, - {"evmos1c7xzn3jg6yeex7uw6ylg4z75xj73sey7xhw8p5", "567146280368512000"}, - {"evmos1c83wqsmglmh5es5g88pkg33unj2zx62c9v45r4", "803786353988477952"}, - {"evmos1c863wjf6flrevw09nj8ff3rjs2ncv8msk5aucs", "3386952404500798976"}, - {"evmos1c88dfgzve9qpsczfx7vfag4768zxe0egr2dv4f", "11739042838328610816"}, - {"evmos1c89lm5glewad4ja3m9z65v64xtpqafqscvkm3v", "4864990874996377600"}, - {"evmos1c8ax802p3x5ufx3sqy9k5w43zx22jkzzcpneal", "598964135762941952"}, - {"evmos1c8e77s63lcpuqmm7leej3y8kphjhu6kffxv4sr", "666433037250624512"}, - {"evmos1c8gjlamtajrhv2sv95fq5che4yr07swnklt2af", "12387222554343067648"}, - {"evmos1c8kxw9nuqzx5lwqxmk9jhcpcfxee9af6lw85n9", "1013514656840640000"}, - {"evmos1c8lxm9kgahdz9y65dxn0fzk9r92falljdg3vla", "915403723893367296"}, - {"evmos1c8q2y5wql223wvxj4rw45th5qaeukg0n80w56n", "5806401891759771648"}, - {"evmos1c8red779dyc9cv8w0df9tk5c6p04cfmh5z88j0", "56189109436692224"}, - {"evmos1c8rzg4x6axnq8ff0kulu0kt9tnkw6uf2jg5fkz", "1463983786679070208"}, - {"evmos1c8sha3ravjumxxxcwt0j0hm6s2kcu75en59nlt", "1152469932726170112"}, - {"evmos1c8uxj5z79wj7g5uqf6su2fm6g5j36l0kvlh9l6", "385437797479759616"}, - {"evmos1c8w73sm7vhzttjuahpyesct956f2xaysar3gwp", "41189546843301085184"}, - {"evmos1c8y0yr3dau3kmdgd5k5d0avsc7ku3lugn77wd3", "2669090383338850304"}, - {"evmos1c8y7tkgayyk3mlcqs3pmdsq2puqzkx5u2l97mc", "1395224869443461120"}, - {"evmos1c90qzxuwz9lm4rxzg8rsj58u0863t2e74wd4za", "11196151268122662912"}, - {"evmos1c90u3zlvek4cthvev3f6e8n0nkp37f08hmyu2c", "1668431560111513600"}, - {"evmos1c93h8d0akanutsgtrmckdpjfl98eyhsrngp7zh", "30018706132196016128"}, - {"evmos1c94kjctwnqllpu4uzleg6hwuvtmy38ms8mzl8p", "3844947656497184768"}, - {"evmos1c94reqxj0ydvgys6dv0ffnfm72773gxum5g4tn", "11099450187193753600"}, - {"evmos1c956g42xglljs4j73gzducp249jmctymm4fvc7", "2143640412008640512"}, - {"evmos1c97p2mdlnrujxhus3tjq6w94vtheryqskzga80", "4136811909536748032"}, - {"evmos1c99mzqtklzr9gn2jeu3q4wkhx6agsn2c070rvx", "13992706335577358336"}, - {"evmos1c99rjvewx2hlxxzlyrferahl0h6any3cntslm0", "11755913519044780032"}, - {"evmos1c9d7gtdwwwdegkyx0hewpwamrxjm0vm2hxmmp3", "3638862119782285312"}, - {"evmos1c9ees9je57gske87n6pxp4qvl7zyt4jv238h7d", "1907633413967912960"}, - {"evmos1c9js7kffvcntswc6yun438ed7a5vvxm53ktms8", "307437958459220992"}, - {"evmos1c9m7myt8fsj7qpa0qhjd3syv3pswxh2h0kus45", "984739950381807104"}, - {"evmos1c9mf65myr7r7djd77x96zt032k8nz6n89hxk24", "1355899116816756224"}, - {"evmos1c9nmd3s4ej4lj3ju3tglpva4s4x924nn5ua3uu", "14975121391660896256"}, - {"evmos1c9q9wk3rvrz5sdrxnlgcj9wu89k3qm7lfj0kt3", "948063294371004416"}, - {"evmos1c9svhtr04kdylkr6n072dfmplw26tyn9rufmnf", "1358025029217034752"}, - {"evmos1c9t40uk8kgpcp7g7k7mlras5yntt8clpj4jf6v", "2143726668651577344"}, - {"evmos1c9umaf2fmjkf5ccnkgme5s5s4rhzs8gfeneznc", "10791379458761275392"}, - {"evmos1c9wxu4fyfw6dmsf5e46t43hlgd7rsfhcgwstkp", "2960536593513480192"}, - {"evmos1c9xzv0k4jf3lmkpf3f9usgdslfvc0ay0y3ywr3", "10021207020044218368"}, - {"evmos1ca02zecjngasygkarudte0hac3eghqefzdcdam", "3778239936405632512"}, - {"evmos1ca2aclqcxs05nz5pq64gllsaxr8psc5rw3kg9w", "1552365181327927296"}, - {"evmos1ca2krsud9v7a68zsp2neph6ashne3ydfdc9hq8", "314561772205345280"}, - {"evmos1ca2w0r45emky2v3dcn2l42sy0tuchxkfc8rd0m", "273776361220577280"}, - {"evmos1ca6gmden3nqsdt4sgx6ejewszq0d4p3k37x49c", "565908664454352896"}, - {"evmos1ca6xq0dqemmqexdd67jlchz25c609auuad8djp", "408798321061276416"}, - {"evmos1ca7gm7pmxe8cgxd95600zppnzsap8fa6g8sl5k", "1772246605259952128"}, - {"evmos1ca82ssz0rqvkpyfy4e55x2rfjqrmeaemf2gukk", "1997834907726107648"}, - {"evmos1ca8hln8fqz7pzk8s3qfct5mrfpx5el33kzcvzl", "384087815855715584"}, - {"evmos1caaccjq2rv00rr982436qd5zmtdchuhp5xmqyl", "160566990363764736"}, - {"evmos1caayq30qdvp2gju92ws6q62c0leafe4hyehana", "2136998342535102464"}, - {"evmos1caearjxy0kex59uefc6htpr508s4099tdypwpu", "1788205833122865408"}, - {"evmos1caexuah9cz7fmnmcwr3fulm6xgygm5m9wra2pw", "1779307391580971008"}, - {"evmos1cajlzlr5l72k4xzjq3k0vfw3npmllk0peh0ssf", "891814947483844608"}, - {"evmos1cakce77t2j9wwuafdu8tyvv4vpat8rxcah263a", "434210430552702208"}, - {"evmos1camm5lgcrek3fkjc2hak3t4cs9mmq045vnjnas", "30820808596844298240"}, - {"evmos1capcmsugnjujwfwevka62k003czrvk03p6mazs", "1433487243493927168"}, - {"evmos1caplxhdw7hjjnmanc3qe2ue5s30ya4h04nryqs", "39839317598248239104"}, - {"evmos1caxxesgzt4rgj5gtallu7q7fxqsz9fv02d67m7", "3992816120808650240"}, - {"evmos1caz8shtve2spspdxn9gnd6eylp9q3rwtjldm09", "1059858645372182528"}, - {"evmos1cc28klwz38t565nru062vj50z6zhyvdvr6pgav", "36455790383062319104"}, - {"evmos1cc408x637vjkklaj7hm67223aq6l6x7pzlm0m3", "897035400621240320"}, - {"evmos1cc7pluxgz5dhrqpz9y6wcdu5xuk0j7ugqw9s4m", "1189971908368201728"}, - {"evmos1cc8jdvudxahcw329x2y3guwxhq008350mrzshl", "1443340659949289472"}, - {"evmos1cce2cz8qpwjnqf7ky2tmavkwdskya3xrcafkj5", "1687546366692787200"}, - {"evmos1ccf8sd3n2td5ly7kede6vfxern2r0k7uzk9ty8", "3611602126816428032"}, - {"evmos1cchc78dzny64090zjsmd5hyq8yl93mpzt9vuxr", "1212361538676574208"}, - {"evmos1cckdld4qmx8u32ak52zn4pme4mp30gmu9am0n5", "1461154683017239552"}, - {"evmos1cckec980yq96e2csmplll7q6x9l7q8rmpna7ge", "11988010853200678912"}, - {"evmos1ccm5xa3ngwx47x645zrwmd3u2xcyfd90rg03ac", "3710049555357572096"}, - {"evmos1ccn2fd7lm3nhrxw0pvkh9jaznms8fq0dw0wgke", "1823589502953693184"}, - {"evmos1ccnm7vtncvc4dsx9h09k8m6t46axsm7dgjj4t0", "18988419537027280896"}, - {"evmos1ccqymnrkjnx6twaqur7wkva6695rmvhw74kq82", "440446541950564096"}, - {"evmos1ccs4ctnl43ah688qptnlzjvaslltmgkzgv66dt", "22905071061998702592"}, - {"evmos1ccse36pqse3zhqgunlvxk424379la4vxpyqlpa", "1523455387886540288"}, - {"evmos1ccy0pu7ze37ye3ccxv4ht2lhhzelyu02xfszlv", "6543041323857001472"}, - {"evmos1ccyhn9v7p2ny4lxcldvn09yex2r5t5cyx6sa2k", "3564626034204901376"}, - {"evmos1cczpp6m8fzvs5luyt5qhmsvkgjmc0tm92k73lg", "2098384165327931392"}, - {"evmos1cd0a673maz50a7x99sw7tcq9ynlkmlp49vm3fp", "59238905000359424"}, - {"evmos1cd5gwsgc4dnn86wksp3mte9wx7l3sj9jyl4zed", "7532044368635512832"}, - {"evmos1cd6pv003hmkvuufnv6vwfpatwug6m29zjkdcd6", "5696711732930461696"}, - {"evmos1cdesdhuu2el43nngs2rfq7tgdjq0nv6gja7jct", "4856617149992253440"}, - {"evmos1cdjte9x3y2c9rsgpqcg4sk8e9xg2eygpaj75cl", "981519646296687616"}, - {"evmos1cdk4dvhzp5mkwk6nvyujn08n9c4cqrfqh2a9wv", "914802979994823680"}, - {"evmos1cdmzqnsys8577vqswj7fq0thkufwlmth7eeexc", "10704900076996259840"}, - {"evmos1cdpvv84j47qje4utlv2zahsahhv5wfaj0rtx76", "5257632615925711872"}, - {"evmos1cdtw3ll2djrxhe0jj02lacarn3cwgp6lv06pdy", "1167592788109106432"}, - {"evmos1cdx8f5nyccfsqd8q8mqmuwwv8m9wxp37zg3xa9", "1158112877828646912"}, - {"evmos1cdx9fl94d4y9x2ztmnmyrnlzltrfh8y4y2lv57", "772954599954243072"}, - {"evmos1cdxpwmrxa9jvavrepn90en50v4ew009dzztrjd", "63505526300778240"}, - {"evmos1cdywv07qfxz783fnytyzf77xpaht3v4kyhr43g", "3880701015682101248"}, - {"evmos1ce0aagvk4kkev5ecfaehugvm8d9m4l9plf9ju0", "365593184796610560"}, - {"evmos1ce0je63negqv0cpg3wr3ymd5gwtswcurmk8eqa", "406960741113750272"}, - {"evmos1ce0sud6jwte00xxeku80dz6yrgl03nyvm3p0sx", "542557438806987264"}, - {"evmos1ce2v246afhx3wngswag4y8z3uec4dhxnwv5gnp", "32834546470276448256"}, - {"evmos1ce99xcnezqz4kcp9wxmw4qq70r7493eh9gtd9r", "3254651739632782336"}, - {"evmos1ced2q7n3xjcg54vvhs56h2fua00mq23n5upl9y", "1310747605861683712"}, - {"evmos1ceexl7y3j7szey652sg00x7wqa4ck30crl7mxn", "1784103007547060480"}, - {"evmos1cehdxj6jhl6qj227vkrk3vsfcmdst46eplc9h9", "681678746427004416"}, - {"evmos1cekg2heslxgr8n2evp84udatlxh5hk606cufs0", "2718261880637427712"}, - {"evmos1cekgnye60h3jzzdcxcauj6w9qtdr4atyh48lgq", "40782298743533772800"}, - {"evmos1celdmzs8tg4fv6ptux5l8avxtsj03fc2x0cq7a", "5361514243043340288"}, - {"evmos1cep4qvvjdf336reyrjfgtjvw4pqwuexanekxvq", "233604270403371008"}, - {"evmos1ces3dqsyg5cymkt74d2kmhudue4vcxxpa92hlv", "384266680225681664"}, - {"evmos1cesckew4gfsvytwuklelh90yfx60v24mcau00x", "4124242484557724160"}, - {"evmos1cet3ctakdqjlzwmh2xcuxdypp5uhvx8t7wf7ql", "461837914995132672"}, - {"evmos1cetrc20nvnm7vc07zy4q9j4fslu8h9t0m2575c", "1413460601352741376"}, - {"evmos1cex5wtxpns4fltnynmpdeh8lsl9ffa7743em9s", "21296856903639203840"}, - {"evmos1cezchpsr7hs2ljqvxhztgtedz4phm3w9uvpfzv", "1509319719859568128"}, - {"evmos1cezxepnwff32ewckcy8x6gvfqwvjqylugj5k9a", "385343739983365120"}, - {"evmos1cf249c9t6rd8a42f08tatt3tk00cmhvzw749vj", "3700514121164161024"}, - {"evmos1cf44jjdfcmdw4fhnw22gj7ex9wg5yjujeekh65", "355675434720930304"}, - {"evmos1cf45gf8cq44y9pqs20qyp7rm904qu7g8tvz9v5", "2675924193686118400"}, - {"evmos1cf5j4htejcn03ztq8kdlzyclx0y4fujqk79f0z", "2903336328235431936"}, - {"evmos1cf5mcnl2arrh7k5cyys0a5ng5c4rhcamngm5j2", "1077914411859675648"}, - {"evmos1cf5q00dz499h4tuw7f5948llsx493hgr8fk5w0", "543036618021072896"}, - {"evmos1cf6m2ekcw086gy9em4g2c96u06nak0v0lpcyxf", "384252681766087936"}, - {"evmos1cf7vxvnvku8dd56rx9q86fgk44ycme9pwry6pd", "381587746889712640"}, - {"evmos1cf84a4kpfv8ngdgzpgkdy5urprhl5tw9k2e962", "1402963259477243904"}, - {"evmos1cf9d7kp3g7r0mrtldncwtr7chjsh54q6jahkq4", "4150155710136614912"}, - {"evmos1cfa5u7wr6jddaggdpxrm4ggzh2jugxv5r3phku", "2767775679201247232"}, - {"evmos1cffzy8hcrrc5sq9mc09lshm5rd4754m7krwusv", "36858418142117523456"}, - {"evmos1cfhkhk083vxzl98y2e3ecyupkxkta9z3lqawyj", "179071036857829376"}, - {"evmos1cfjaheypvs4hq6vj0q7yn5j20hskrd0dsc3pyy", "892235005274319872"}, - {"evmos1cfjukzsujedxm0wv6tvz0lga3nxuus68xxzg4t", "16417456585507672064"}, - {"evmos1cfm9gt7j5sr9wsprsrv0j5jyck6zz99ehgj97t", "4430818462908530688"}, - {"evmos1cfufh2lp5hxet6q6uheygn5zuyu3ha7wc9p39z", "9845622721192136704"}, - {"evmos1cfzlxs3vg6kgllfth86c6vl70n4sgmp6z5g2qx", "2784758923846987776"}, - {"evmos1cgczykl3fqmv5xzq4w0ta29h4pe0gkh5nzy43n", "64126350815109431296"}, - {"evmos1cgezgl7tcv59h2crfltjsefr78g4xznsj0je86", "216461646603131846656"}, - {"evmos1cggzyt7yjcdz24408gvzqvvaqg0vedjuqc8hq8", "78905074978654208"}, - {"evmos1cghkepc40dskycau5dmtlse7j4p7yves3v2qt4", "891587357358496768"}, - {"evmos1cghy7k3g2tjrv850szlc8cvz2q7nxck03j7jsa", "941749129099217920"}, - {"evmos1cgs4fvqakyus7k7jph30kgertzvwryjry7tpmp", "3630599029106038784"}, - {"evmos1cgtc53gcta8uwwatqdthhevxlagh6n8q3vj3ya", "6750233812565821440"}, - {"evmos1cgut39tlta4usx0hr3ujrqa3mtvghnvy9xaewu", "64495093029864192"}, - {"evmos1cguzsxlkpzwzmma6dupzscwwxrhsv48yyhpdkg", "864944966141792768"}, - {"evmos1cgxfdz8zxdred3pqel5lkc5hav9e4jqdtkj3ft", "765357336224906752"}, - {"evmos1cgxyfjz2p4wr9vyhj3udxhv0eu0786zmp0f888", "316968806968863744"}, - {"evmos1cgyqlta43cxlxx986ffrw6evrqvarngpqqu34d", "31568982315070156800"}, - {"evmos1cgzyegrarwp267yanvdhk4dyqzmnwf6t8fp854", "4550033746539200512"}, - {"evmos1ch0xkdu8w9tylr0csf8zcc90nk4vy8w39c2sch", "1044916983846207488"}, - {"evmos1ch0ynycnjlak68qcdn6lt8ug3ny9s85txj79jp", "15528734229626368"}, - {"evmos1ch2wzujzuc6sw66smlw52zaark43k2w6fewdud", "4730695289908375552"}, - {"evmos1ch4fvdw6tm5taw007jkjfypzey63zvtzw8v33m", "15891838588408389632"}, - {"evmos1ch4ltag3jj9cvgfpnqjdmk7jh5mse7s9nyc932", "19908994624510816256"}, - {"evmos1ch4n0k50n4lhjgut8flxxcp0535f05kesnltu0", "1967876101109983232"}, - {"evmos1ch5009c2rp3t2c674hkg058l8eljytqd0px3tf", "6482039494242533376"}, - {"evmos1ch8kz8wfx7t43877endhu5gxkz6hxme4dk4zzr", "6382228582857369600"}, - {"evmos1chcqflx8h2ekqk78epptc83upgd3cn0h52jds7", "3845319311901361664"}, - {"evmos1chf4uvmrmlf7nd5tl82yjm4qm0crrdvluwr05p", "42958090440699854848"}, - {"evmos1chk6xfwm3yesughd5a3x0ujj2d94tknl5m3x0f", "76026434654103040"}, - {"evmos1chl89jxt9tt2v5ec65kya69na9qz0utlmtrqyw", "44569108661738373120"}, - {"evmos1chm2v2gxrwp2a5le2y8fg890yy48vts3rgz3zk", "12922178035723874304"}, - {"evmos1chn9vjgdqsc4y7u80tdf7p35el079gxyutddmn", "3585092449891018240"}, - {"evmos1chqcm5qauxw6jrjz3n3e28fazc7kpcqpu2remt", "8466520786299680768"}, - {"evmos1chqfdfjzh2e6gd2gta8psexlz7t8p4x2yz2z7s", "513563123900780544"}, - {"evmos1chqmjmg2kl5nul8vu5e9p6v97qsksw0vzte8zx", "41132585080922112000"}, - {"evmos1chrm7hpjwjns0jrqagfhkgq7emvnyqwp3sh60p", "270678580824628224"}, - {"evmos1cht3lc0l28g2z28cf68jskaj3293qftlxpv6ws", "76783843760278528"}, - {"evmos1chtr8k3er464jpgmdsq3vjv30tc4sh0g7c2m0n", "16973097979784921088"}, - {"evmos1chtwnjs3kypfem3hc68nmsaph6f6kmayr6skrv", "345480383751548928"}, - {"evmos1chu7qgvvhasvy3ve0nme3ggsncljeyn0795ukl", "1430615453534485504"}, - {"evmos1chvl8f3asf9vlptw2ywxwetvq9a250lc8t8djm", "2912762794004912128"}, - {"evmos1chx40hp4lns5j8e77e45ke23qqgk4pr5m94j35", "5651012155708888064"}, - {"evmos1cj02wrhrd84f5erzqwqdmkgv578vevgakctpqw", "78167469032309760"}, - {"evmos1cj0hxyq74nahunmk7eujufwdzgdfd9mjsy79jl", "767693279800285696"}, - {"evmos1cj8cu0ncmp6x5lzldznwlh320a0j3v663hayka", "6930741971318102016"}, - {"evmos1cjcjkjx5xdqeqw6e38vr9lggshzf8tgaynq6wd", "1369996527280637952"}, - {"evmos1cjcysstjla320dq02um7t9sclqesw7eaecjzja", "2155930369946619904"}, - {"evmos1cjd8a88d7wk4n2a4nzy88qgwa6r0l4mgw6fhdk", "8074054124851881984"}, - {"evmos1cjgzvflhplmcpycul6myvzncvqscnx0p35ldpp", "7221462332139302912"}, - {"evmos1cjrq960xuz9zm47u4p2kz84uux280mux9qe82x", "7010324920897060864"}, - {"evmos1cjt2q9nnxafsylwgr4y6vyukhrgcvhpyul3qns", "1560555925125480448"}, - {"evmos1cjvey9qejgr0rpeaj77p783lgz0qwm32ewkeuz", "700038770670054400"}, - {"evmos1cjvrptwsnda3xav9xlayardh87jl6ja5pkfz67", "88963238870317350912"}, - {"evmos1cjw942gqpljn7pf0e735qtvqr5fv3c3703ceee", "476371535412115456"}, - {"evmos1cjxpd5tvau5kfvhv490030c50ham9a55s6g3df", "1917542781951054336"}, - {"evmos1ck293u35jvuqs278n5fmeydvtt2pke93a6ae0a", "1932345647769888768"}, - {"evmos1ck554hm08a3spsgne2e3hcfx9ew9y8umszmxth", "1192651321484494848"}, - {"evmos1ck5ttu77w0zl87q24u6ls573kjnp8alv5h2pvs", "25176265222000640"}, - {"evmos1ck6plvg93qau6kwwaurjkkmtm0za7vw6pw7ywq", "3374250746895071232"}, - {"evmos1ck72nqprdpddywte8n9wqs0vnqy6q7f4stsww3", "318717600085353728"}, - {"evmos1ckd0tdtnplgdw4q67fk4ulua6ya9zj287sq5zm", "885477402765598720"}, - {"evmos1ckd7ezxt8f6e8wspfpqaqd8gkamwz76sgn0tdx", "381963827196084736"}, - {"evmos1ckdqefp3y9h3pn2uzxp3h93grqh68tp7tv680u", "27264575625734402048"}, - {"evmos1ckeezxzsuj2q0ckv0cujcd7z6d8mwakyyfghy7", "64874170763613696"}, - {"evmos1ckg8alnrlqyl8equr9v3swlggdmux2v7pjzj6x", "93574086720537100288"}, - {"evmos1ckgeltrgr2kf2rxnzf96ylnfqqnnyryms4nd9c", "384573681614437120"}, - {"evmos1ckgmzzlt4h438aydl99luafg95e22gufftt62d", "765053100060872704"}, - {"evmos1ckgv898s4l3r4fdvcsjjc6lw2jxzpqxs84huuj", "4730159368810971136"}, - {"evmos1ckjjdnvce0e39ah9ksk4jwdzeu7rw9x8d439yv", "11233258141343924224"}, - {"evmos1ckk4g0xq42vrcxwrxkl2xm2ty4t2und44st9t0", "1332847575687901184"}, - {"evmos1ckn4saq9hdkmfkqlcjmf0wlupv6mc5y5lal8vy", "1664066579419865088"}, - {"evmos1ckq6xr8rdley73vgq7d6c3hzsazr5l65yhuhs2", "2068002229743882240"}, - {"evmos1ckqmapunlqhjsfdsskty08mlxv92aa8zmxh4wk", "1055099765341462016"}, - {"evmos1ckslw838xxazmpr2ya05u9l60wkdwmz7s4kvr2", "3092347201909866496"}, - {"evmos1ckv2lqx0v9feut03a4jh47kz6lrkvqw94e5ncv", "78795457253543936"}, - {"evmos1ckv6ug0fhdsyzx38ccsz9rnuusk03p6mqwgujy", "5983183021141860352"}, - {"evmos1ckvmk92n52lkk597q8vgtsyq4k9cls9q65xn6e", "448540290543669248"}, - {"evmos1ckxklra5hft2mhvhjlk5e0eh03dnyllcfcgvlq", "3028583317163002880"}, - {"evmos1ckyp7j972qvlkjmwpcl4ke8uswnuyu8fnz2t0l", "19368776175946727424"}, - {"evmos1ckyqmy8c3hdseckrq67tdhgrseg4cggyzqlk97", "892739907297142272"}, - {"evmos1ckyz7u89uh8agglk0q7mxjs0n3w39l0hp38j9h", "9707649172647354368"}, - {"evmos1ckz6u4dfs79ltvxljhvgc9vg4m4d5lqrfnfyf2", "3180508826067623936"}, - {"evmos1cl072k8dp8c08dewhv9qf6w5axd0p0gdlj3jvy", "670533349062669312"}, - {"evmos1cl0hevp25w9cklr88ayskan0ur0jpkhm57m8k9", "4021527378390605824"}, - {"evmos1cl0y4rdgryvp9uxsqzyg6m9e5e8zleup0z2srv", "35293510652713275392"}, - {"evmos1cl25ttnz9dpdw8k37de7dpnea258rvc9u089cy", "498690906063754240"}, - {"evmos1cl4a97kdmk5f57wpjh447c89svwv2pj83spgwn", "6120683407389085696"}, - {"evmos1cl60rs7y55vxx0mgk9xdrmzu3uzvkqylrqf247", "2878231912095693824"}, - {"evmos1cldwhr9s4274ecc7nclsu64lzh8vg99j47juuu", "474031076667302144"}, - {"evmos1clejxqyv886q3dqu4890087p3skawpv34ktd5m", "847231736892138496"}, - {"evmos1clfjqan9k5faqg2mru4jx2yeaark7e8rmzc49e", "504637422215356928"}, - {"evmos1clg2u86hhpr307663s8rjqzamm5ntjmjtd37cg", "1019304206128989696"}, - {"evmos1clj2gs5mp6kcfnks8gpd0g075kt9p3luhv97um", "7238366986699264"}, - {"evmos1clm2sqc3a6zl0du0ef5lh47qnpfye5nmlcxpeu", "956852767306331136"}, - {"evmos1cln5lt954h8h0tnqq7hdkgpyxutgwkv4agxrla", "1389939406233666048"}, - {"evmos1clqalpvczdu2sqpld75jj8d0dx6ys2na7nd2rh", "1674448320284804608"}, - {"evmos1clqnpn8cyfdxa20tfx3sdvyshky76udpcx4gf0", "7614050859714945024"}, - {"evmos1clsas5gfdrrr7swxdrer6dw8p855w7d6smexwz", "832323578064758784"}, - {"evmos1clsgkr6n3rqahy9mjah26xsk3p03av3ltd5fds", "906412906399282176"}, - {"evmos1cltj4crk8etd4ewec3alznht3e3c8z9mvtsnze", "991498969764966400"}, - {"evmos1cltkuwjuy03s7cmxektxzafg96hvqy050c63f5", "6308816244488097792"}, - {"evmos1clu88lyhttmvrhelxswz03hq9gykhecuknha9h", "10495874848012701696"}, - {"evmos1cluguutdzjzq5fdmr6l5e48mwrdynstfph3j2h", "3022197065532647424"}, - {"evmos1clwnqtn3tryzrzrct3782j73x3lgnymarats4n", "316955615379971840"}, - {"evmos1clwzkwassjr4p8kfy52l9dvwa47m5q36ytnypm", "64872120934402080768"}, - {"evmos1clymsfwv2pre9mm7t3q8k2h2f48tu2u238g0ml", "1654442340357742080"}, - {"evmos1cm3l8vt5u085c7pgjygurmqlgz8a6fusmksdn6", "1421733926928092160"}, - {"evmos1cm7u3hyx4jfcgyjgqfakzrrhve9refne0kdzcy", "20743228865129742336"}, - {"evmos1cm8mmqtnhz9nn5rq232efst2mn7yrjtped6g4z", "1489222240375752192"}, - {"evmos1cmaj20mfjpmssfzq68t39uyz7wj4uq4aq2tvyt", "29813667293990240256"}, - {"evmos1cmcq7dess4v4cg5px35f32kndn8pnv4xqcq0km", "1613873933749421056"}, - {"evmos1cmgaxhhnpcjca8jqtwsl6e9mw3p29kal4kf4jw", "2092601561590771712"}, - {"evmos1cmgu6ykg5mq789cacc3arx9ndd67459d03pzf0", "103564896925343449088"}, - {"evmos1cmh3xtk7frterj55hxxdta0vchj47xqlzyw625", "1816824759251015680"}, - {"evmos1cmjserx09p30y5vg6wpsauy70sp59mt99z28ld", "63634063385850880"}, - {"evmos1cmjuaj3kny96egpdar256uqj9xlyjlrk7wl3hh", "42758685583709683712"}, - {"evmos1cmjxx7h0p4smypc5qh96kpm2hup74gcsrt7wcf", "1230353026175307776"}, - {"evmos1cmkmhe2j0xr3c8nvl7las3rgpyrtkaps80n2wp", "23961730984779776"}, - {"evmos1cmkxy3m06v9ksjze2v6jrgflm3l8k0h9f5x8q2", "9746091168993996800"}, - {"evmos1cmny7tdgcrrkjf4ljta3hkwl7xvr0v5x6wfph4", "3206397851502518272"}, - {"evmos1cmqe0x30zaxl29j2jlvlpnufm8hm7400ysgpaj", "667127482651290368"}, - {"evmos1cmr8d3du3lnp97r6jcxc4km3eukcw6swjr9lzt", "4752451706109499392"}, - {"evmos1cmrqxemarkvch3pmpqtlxphfkv6avmau2ry83n", "6307326333788766208"}, - {"evmos1cms92rjqsr2p4yjjlt764z7vwq9fnmrh5jvcn3", "1577515341390307328"}, - {"evmos1cmsvqn5adg6cjdhdfrzrf0w3df49n4572ey2hr", "460660662804737536"}, - {"evmos1cmtfgzfxpyv7s5tmh8ze5udgrq6x6kr4l0pcry", "128931435328499712"}, - {"evmos1cmu539n23td5hgpj62nl72c4fev99kll0sla77", "29605258648428314624"}, - {"evmos1cmxlwwpyyugvrf7e529vxzufg5lleq3lazha7w", "79935112163685597184"}, - {"evmos1cmyasq4uzmv8g640etz8s8u634zz6kzamgem9x", "30275723599421992960"}, - {"evmos1cn0u876p2d7jhhjf0ws55ewd0cv2hmws96efa5", "802711572942198784"}, - {"evmos1cn2rap7ctlk9xw0g29lmvaak3pxg39wy0wqlnr", "884642583520893952"}, - {"evmos1cn3w2fhldhxc2luz5ejv07snnrnpe6gmlnn48t", "216966577929984"}, - {"evmos1cn40782l6xr0nzhksrqsrq7xa5zfkxz8amflj0", "475454413194615296"}, - {"evmos1cn4g9yk7raalfg9eun78wm2u9kdzmy9nscl04y", "21552625384801681408"}, - {"evmos1cn59s6dpawcc6gtzc3zkp27ephl40zndzt9rmt", "4569538569619265024"}, - {"evmos1cn757x36yg8hk8g4ee6h6s4huymzf03fk4ga3m", "8722462706696704000"}, - {"evmos1cna53da6x2atcsqdq7x88lk6ykf5xnlryukfs7", "254108208073776128"}, - {"evmos1cna6fwup2vmlf5uwd7nnj0ydyz678szfy0gaxz", "8386782807683840"}, - {"evmos1cne57ggp9kzphnj8yuy5fkuf58sxrqfhlpput2", "1689728436765900800"}, - {"evmos1cnnlp6vw47df3l4v4auy053cxyhp0pmea5zxmg", "54462794133298888704"}, - {"evmos1cnnmqfzxlpecd7hehx0x6tuz3ajv8lh8kjfrgh", "2042278157758109696"}, - {"evmos1cnqztppm26v7tr9n9fk70nhxflfswxfn2vdpjl", "384318388316961280"}, - {"evmos1cnryeqex2tc2xfhx0esy7t8kumlalkfggn5546", "17026480762292518912"}, - {"evmos1cnsvga94r4d7q03u6w84tqm3jlwasp7m00qe0f", "2718089093672436736"}, - {"evmos1cnt7ds956wkv9hlg95hnfk95c3306dnszt3leh", "236827824081677312"}, - {"evmos1cntydkfwrqxh7wzudc6u9tnhf8tve6wa3lw5r2", "89580452705425719296"}, - {"evmos1cnvln425yc9kedd6tydfep0ths999d4yfv8alk", "1466160748896836608"}, - {"evmos1cnvy07s8u7kv5d400uzzlkqqxrxxyw4e6c4l9r", "319110351601900544"}, - {"evmos1cnwayk7e02l36907xvq9lz2qp8l4fzpv3hheq0", "1435898466255449600"}, - {"evmos1cnwe5nq68sq4mq3j5l6cl8snduzzvf4s75uw0q", "4793729004670177280"}, - {"evmos1cnwhar2tyuddwuuc8hahl6gyyefe4f2ae6cg8z", "1965791167882780672"}, - {"evmos1cnwkggg5cw0agxy22p07ze90ywlzlceaewc3la", "8287777612501233664"}, - {"evmos1cny22munjggjc7qdms8fm7wyn7ngtqcayz94un", "252268815894601728"}, - {"evmos1cnz77mq6qrqnzzcl4r22lmgj3dl5dgkerw0aww", "294219418770062336"}, - {"evmos1cnzf303g8elchrcmve034r50rgqhplzsarrd35", "1542600330275271936"}, - {"evmos1cnzmsaq9j0t3t6dfh699cqj0cdgmmaanxz4855", "1241874049487290368"}, - {"evmos1cnzx7qy5f3pp6s4r8sxyd62gs3mczasq3mluw0", "5444808250475610112"}, - {"evmos1cp3waj3cj9fe7ag9fvgxpxt65dzekuuseq6rxa", "4236162104903428096"}, - {"evmos1cp62wtsllgucggez695l3fc2hap8s9c6ltjc0l", "14821941152372989952"}, - {"evmos1cp63gcv2xxjfqm5mldky8wgntch08wva90xha3", "8197955754856818688"}, - {"evmos1cp79d6xlpmrwstfc7uyqxl0eepcq3ydaaz24aw", "2305213983343091712"}, - {"evmos1cp8wxapytwgxxrd5glrwhjtsz2kpwrkgnylrdl", "837152029594619904"}, - {"evmos1cp90q2xnzkcem8ufwmw2yt396wpy89ggcf88hj", "686210925475204096"}, - {"evmos1cp96k4e9w6klxg0sqq5k8dcvw9dynmpssfkg0e", "1585128283650111744"}, - {"evmos1cpa5rlkxt8x7nu8rnqm9q4wc8qan5ve54zzhcf", "2742333673548980224"}, - {"evmos1cpadshqw77ppdqm0f8nhnthtxvk6gpw7mye9hk", "385583332264678912"}, - {"evmos1cpcja7fduet2zdkvtun97td6mylf7kmhpyfkk5", "1401704587236759040"}, - {"evmos1cpe3u2nsmac9m95hwpequ5lh9794x4fdxt940z", "384558247478283264"}, - {"evmos1cpjy8jxg999xrejmxep7mure075z3kkuxvzvce", "3292919864812986368"}, - {"evmos1cpk3c3ktwtz57dhe3sy9ne5vhed94gzgy4lefa", "5723950574106591232"}, - {"evmos1cplfwzkkxs564rv04fvtw8d9q7acl0z97ljyx7", "278873157330911232"}, - {"evmos1cppunndnydpvyalfj5uqg4enwvjjlfrevq5658", "10467917163029102592"}, - {"evmos1cpqexewp2mg6z7a9a5fkpjvs8ecu6hm0jkduf2", "14602996803671130112"}, - {"evmos1cpqwfaqdjmnln7u6a2sy44290fyz3y3dee0nm9", "1305208691208853760"}, - {"evmos1cpqzs8wtqh2y8a8a279uq8xfdag8rs5kstk8xs", "1292988940422649856"}, - {"evmos1cptv0y36ax293ts9spmkxafnn0akefczzulv2c", "3443809255648014336"}, - {"evmos1cpu2hsje8af4q8nttj95jta3pptl2u0mqm9tmg", "14530547398652416"}, - {"evmos1cpx8cthuqgmnzvp700up4xm9gr3kr3m2hcmd0s", "476273596884676352"}, - {"evmos1cpxccgaqhr5v9elnyz2rpkrzaxm8pt3zqa89ff", "1633351442881961984"}, - {"evmos1cpyqexxp9akklgdwakvpt589xmt4dclckm63e8", "3879630822757544960"}, - {"evmos1cpzevnn8ntalzqt875v9vhnwchkdets69ph38z", "40897871592337424384"}, - {"evmos1cq00d96hwy5fegzhzf2y5ljvq99r4yfxfpx8kd", "878415637933832960"}, - {"evmos1cqcjx9ezmsmwvvmsq95d70d8lz68fzcfml574v", "573609921351999488"}, - {"evmos1cqdjr9y2l4vjurg7r0xpu6cvl6qllaftrkr39k", "52576268440977129472"}, - {"evmos1cqg2hesq588pt9l7tuwhmt6amk7nupkusmt7xh", "213700624405938176"}, - {"evmos1cqk6z29xfauk2tzp4t44w9v4m8nsknlhffvndv", "1336566582991654912"}, - {"evmos1cqldvptdcg944jwsa975lljnwqu8gyjcgnya4v", "7101505835535990784"}, - {"evmos1cqm2xe9rvy0cy6h4t8rzg5hzvg8wn3eqq708mj", "1895761095253478656"}, - {"evmos1cqm4mdu2k5dc96d79cfexjzfzfvjsq6rgnd346", "802718795017879552"}, - {"evmos1cqu0u02u0djnle4h2mz43zz2xh26sevc2qp9v8", "1439474621535492352"}, - {"evmos1cqu9c7qm9u66uza9fs553axz8tarhw25p5elh4", "340331686453407744"}, - {"evmos1cqwcv57gzycptexjyyzevk5lyhdnnfnulgfshx", "9985164918793445376"}, - {"evmos1cr0fck8ndt9s2nqk5r7mtqtruqqu700utmsm03", "12958778015145869312"}, - {"evmos1cr0wyrdlwavtd5yngstgjxggjggfz5mjlkpap7", "12055316920779370496"}, - {"evmos1cr49j2jwdjuypz4l0nk2t7lchveanx53sazjgq", "830490617249792000"}, - {"evmos1cr5n6cnp8r40tceufk2zdhwgtn3m5mn0crxvt0", "1059876963408799232"}, - {"evmos1cr60luuk8rapvzzmnrarw0mgkmmecwrk7t7lwj", "2606881505230135808"}, - {"evmos1cr6l84ru8a8w742muchc89z9j5l8anaaw2dclr", "32631467203852726272"}, - {"evmos1cr7at4x4e67ka8v0fv5qw8l5kv6yz2ywkvnjqm", "18667404342986752"}, - {"evmos1cr90qqw4e04agxxjpzm7rhq0nk5pgdlerql5yz", "1765610851351644160"}, - {"evmos1cr926a85y3vul4evqlzgc7n9g5vusjrzeqv62s", "11676290794771083264"}, - {"evmos1cr97vvhpgfg0fle9xccc6xrer0n6pvv3ujgj2w", "1115242672852008960"}, - {"evmos1cr9n9h7mvp44cr3am8q6l3haxzqhhamd2gzexd", "5060027993973882880"}, - {"evmos1cra3tl6eamaz35jhdka2kgpekg4pkq05y65jaq", "161251768552124928"}, - {"evmos1crf63kfempjn7r7cleaqv3ka8zzzjdrxmzmpk4", "21779183565749035008"}, - {"evmos1crfpkcf95atzdmeaqmsgl8whm8f5ax68csm903", "30947974457592832"}, - {"evmos1crg0r966equmuv00l9sec7t4pkxtp9j58x40z6", "1827036598252764928"}, - {"evmos1crhrtkuce75s6u9ddpshngngxhfu6v5p5c6k3n", "8489689911248570368"}, - {"evmos1crnacqxhhzvv2vv2gq5885xawh4jzlfw64r3vc", "14830450941338667008"}, - {"evmos1crpeduguytd2xpewucvhvyrstcmw6lg490vty9", "7320220918504224768"}, - {"evmos1crqacnvrllstxn6c46806ttqjae7uaqw7pekep", "8676817271068719104"}, - {"evmos1cruzl2xqhwweygh3x0fuss4kz4448yed03kwtp", "2750052040396777472"}, - {"evmos1cryhudun3jm3samzzsws6n9vphkx8nnu9hply4", "1022786087850455040"}, - {"evmos1cs20dfvalcmq5vwjx62ntvl6j97rptlmtwhkxe", "3513077948452137984"}, - {"evmos1cs277s474kfn3lxvsyexgqz038jekf55gsawem", "1139509891719421952"}, - {"evmos1cs2krvzhc5s9ryrdvj45arxl0wyrtwl6x68zdf", "211727737181416448"}, - {"evmos1cs3ht3hagpq96a7x0nzgtyt7hhzqmz2sdkdtak", "3148561755147274240"}, - {"evmos1cs4cqjrkfjsn3tz46p9pu9u3aym43yv56yn39k", "101940062405519360"}, - {"evmos1cs7fx2hawprd9dsggpdkahq0fcplny962mdx2d", "82663650408493568"}, - {"evmos1cs80jqaft4lkfz0d8p7q2yy9ajn90ghap3vx3n", "2781373326078382080"}, - {"evmos1csaksh4yhs5y4jcraxu5j4ncszs6aakpcxnaza", "23674688245271445504"}, - {"evmos1csdhrqweppkttth2pl3zqyf2vgcxcr359lnrqx", "801353228466736896"}, - {"evmos1csdq9nkprhxj84xkgz3jl5cs6ce69q0ewtj62v", "533910015288549632"}, - {"evmos1cse644vv0tuktfww0gmyw2rwgmfn8qftcaxk7w", "8442080192686415872"}, - {"evmos1csjlduaww0vy0c5kd3nl0tsmycjmpetlmqx95y", "2913254802185158656"}, - {"evmos1csk522k50y7sr9f0qyc5g9qneqrwxqgz6ym648", "1880741531794066432"}, - {"evmos1cskkcddulknkqj8v5c8nxhdsdw0v9vh5nkm8rd", "36740225759315200"}, - {"evmos1cskmkzvx52mdxrl8azy64a469fev48fw2wdfan", "5646293810936016896"}, - {"evmos1cskwhvl5sszg09d4ww48cykrq97qzf0l3sjr2k", "1005472291841864704"}, - {"evmos1csms0wuz65yn8prfdp0zhwamygp8u3zrla7n8c", "213769852416903936"}, - {"evmos1csnv7qqpaxa9jsfj2xwll832ypfw3fyexxvp7k", "236086088554555904"}, - {"evmos1csr2ly6d4hqfmdsqakrlwyaekg400vfawzpl7s", "2106850525727907840"}, - {"evmos1css3ztz6z7j5h7rj7hdaatmdm3880qk2t2etmu", "108606667410961664"}, - {"evmos1csuq0q35f2s8qpt96z28jefltwrutf63ka2796", "663620776166956032"}, - {"evmos1cswen9q9vvflkdm24ssem83xawc35s4dw24xtr", "1675213855773483008"}, - {"evmos1cswrtlt8jukzntegzz78ea8w6ftaen9gpvjw44", "19873759739961880576"}, - {"evmos1csxt7d6rpncvn64xdmkntetu5t3j0g87vned5v", "15292957335760125952"}, - {"evmos1csyn8prhmanxtue7tm4lxaghrlcatdevpjg5kc", "15217709248784345088"}, - {"evmos1ct0l68wty0dqu0n2mwlks2xeperrup4akqk7dj", "404882717093085184"}, - {"evmos1ct2e3vm7hvcxhvf9awv66dlh9lvhf9h5senst7", "3006095314810814464"}, - {"evmos1ct40a7ju2yhsmudz37ermcwcz7asl6md5wtq6z", "3337291842394576896"}, - {"evmos1ct4qz0nnuv966g58w3qjlds3kh6grcmc2eljmd", "4208498565754455040"}, - {"evmos1ct6wv6arghh82dahf7jlrdgpwkzypnhcx7nhke", "4354957236967258624"}, - {"evmos1ct7s2kfwe0xft7lgcpmjx69q08nzv9aagmzglt", "264383147890868224"}, - {"evmos1ctcdnxwdmukxmtrcvvqn993xcnx95ta2gue0uk", "58386663655924285440"}, - {"evmos1ctf63qn5f43xs0g556jnk7ygmu4z4kjk2d06t3", "5575449866677862400"}, - {"evmos1ctgrw0np23wkvrnl4rkzazkykcr8qfgdvlpnp5", "410858882316128768"}, - {"evmos1ctlvatvetlux77d8cxce3gkv5nxax3vvkjvzm9", "2415489396185833472"}, - {"evmos1ctmc5e9rhsku8gmzllh970d6qvd55e62h4hnww", "46767097514511048704"}, - {"evmos1ctmq0vh39v8x06sq57r6kmkw5l2uee3tkc0nqt", "19095029281007345664"}, - {"evmos1ctpjj34fcf844agu0c0zun97f2ca9gm3n3q2x8", "436438305633906176"}, - {"evmos1ctpuspuzsarskuln5pclvq3vktvzsdl29kqnxf", "1629487962922651136"}, - {"evmos1ctqap0jtnltgcjv5fn2v8jut3xhm476euqyjhl", "2075400110409637888"}, - {"evmos1ctqcxcwajw04g9zyfutzjdntc46xrdgajuqht9", "386714596381141504"}, - {"evmos1ctrf4nnensrmewyz86yrgqd87qdk4lewafr42x", "4110837933919093760"}, - {"evmos1cts63pstssyhnrzycdw5at8gz6kgt2hqrprdc4", "2491814963358209024"}, - {"evmos1cttd5xftannsquzn804506kaw4t9ts2jsts9d5", "1854998288260203520"}, - {"evmos1ctwa8pm5xgeguh6umjy98xkam4qq70zvatg3aa", "22543587983840608256"}, - {"evmos1cu36ytc6ma7pth2kuxd2mtrmfvrlrszfnmspll", "6255983986950684672"}, - {"evmos1cu7kz94qmxhktz6ltu7r4a6uwsqpk9y78aexyq", "2134285835328185856"}, - {"evmos1cu9x2mm2g96athh6xql9nh4cfufp6qf3fpxa3y", "1422260254464139264"}, - {"evmos1cuaya5j6mrcudszejktvwj2sjyzazgwk58jf96", "2570095147083390976"}, - {"evmos1cug7y62lhjry3zvkk9065ngahjl5tmd80crfg4", "7944956855074570240"}, - {"evmos1cugrjg2vqyjcwuyp4les29dnxr62s0mz2xh9zr", "13122877149672769536"}, - {"evmos1cuh7ewuutgn2gjkj6vf57k0fenyrju8m3kxq4x", "3468021549419565056"}, - {"evmos1cuk864tm8fdwk2hldt5hapndw35rhm8zku9m2a", "6804911547574446080"}, - {"evmos1cukhxg30p6ney2rhgepqlmy57dwcggydr2d3nq", "181917344738855936"}, - {"evmos1cut7x3dv80fk70u9n9j68l2y423g3t74nzppre", "277260054439020800"}, - {"evmos1cutgwp4rxec50j425e3pnwru7hvdzp8yd3nadm", "4141382852399293952"}, - {"evmos1cuu6ll44dwjvkw4wzlsvkz628dcaz348thcyrn", "23575117644109070336"}, - {"evmos1cuxhtzaujxvg5eutrp7rph2gdynha7avvm7jh7", "48126143198046208"}, - {"evmos1cuydz2gy2l77gd293c0cft80a590gsd22mvunc", "65233602156377600"}, - {"evmos1cv0ywgmxsgmhf7n2dtq8dg60lsuuls05cltypd", "1001505231090283264"}, - {"evmos1cv3zrh6rfy7vfjw8hqyk87zztzt9nrvj2zvn8x", "2130675969258889216"}, - {"evmos1cv53cxucek5ap2zhv7w0t3tvr36742ez52vegt", "5928316529490671616"}, - {"evmos1cv59fcxp5h9tgj78m2euntzurusughsrzpa7w9", "3942337429045454848"}, - {"evmos1cv8vp0d2ql3gznyunp3qf9m49hw9qu7asnduqp", "1155520796879437312"}, - {"evmos1cv906hcefk72gr8wxd8kd7lh55hsja48q5shpe", "20207977723129618432"}, - {"evmos1cv946339r6nn6e74spdhzf7wz9lldxfa3rhzx8", "11375771978343823360"}, - {"evmos1cvargstcmpuz5c58fhgnv0w64cf0agfd2zccvz", "1569765884754598400"}, - {"evmos1cvd7t864ytzw82ymc05x87t7d7p98gsum989ud", "1934251007293870080"}, - {"evmos1cveqp6s8e2rm7dcag8xkwxa6j944waq5hfl526", "4813760440793705472"}, - {"evmos1cvg2qy8fxjd0th9cspxzf0wzkxdszlg3qn45tj", "14078432171372904448"}, - {"evmos1cvhdu47f7gkv7a0su77c90rt00aefczt80lv98", "7515603840414940160"}, - {"evmos1cvhqrdcyra7nc32kn53enzs42myhfy026wcz0g", "16772133704595603456"}, - {"evmos1cvj0r5s9jdv2v96s6rzwjvp52wg0aqev9hlfj8", "2513305947367481344"}, - {"evmos1cvpg6m2lul64d3x6vhvd0m4vrqrhmcrkurmn27", "1583040586243497984"}, - {"evmos1cvrqt62tjm248kchddpryt52xhd6gvv82wlnge", "7770763816128163840"}, - {"evmos1cvryuc2k0z4e6g6lnqussfpugqp7cc823085nj", "1114380476825720832"}, - {"evmos1cvs8x8aty4xzuujvc9kz5mqqz70x3d5kjxen6t", "98834289135875840"}, - {"evmos1cvt0g9gfvg34v83qwlps5fsyxjva27dd49arh5", "5428088580524136448"}, - {"evmos1cvt2yee2rm48xzdj84wdy7pfd04e39lnnttak7", "1178579753397205760"}, - {"evmos1cvuk2gdumadj8w69cx37akrmv6cytlcljz2fcv", "1880325732838647296"}, - {"evmos1cw0uwxss7px76sfknspa7hqrepthntp4vvnkse", "772190668927016960"}, - {"evmos1cw52g86l032zmuezy75mmkk08frp0tar662rta", "1496864846091223552"}, - {"evmos1cw5j3jd66hzq790z5n283c09dlnp846l05pqem", "8757233957651886080"}, - {"evmos1cw5y07kqknv36jlv05aw32xc2jqpczqzutz93a", "1675866157344260096"}, - {"evmos1cw7xvchdgqvrhxmlxynd3m9eum03uxudcltyza", "2718078794808223744"}, - {"evmos1cw8akkxstwn7u87z83866fjkzhqde29ygyz3s3", "10047496181899771904"}, - {"evmos1cwax6yw65dp80jgxj7hlluuxxyjflwgcy5q5dh", "313523522381368064"}, - {"evmos1cwdvetq7kkmvet640ywuucgy7h5dv3ecx0q65h", "2311038802635464704"}, - {"evmos1cwjddnmf5u04khppeuna3gzetvvsrxp43e57nj", "7270520353394866176"}, - {"evmos1cwjn2kvazvd3nqr5suk6fza3kv6pkn9ma50y38", "1430467425153455104"}, - {"evmos1cwp5f4dwkfce8rhprkajfz9gnh6qsrd33266x4", "107658744867166464"}, - {"evmos1cwpfpxr9m00le4g75t8nmzhhu7dweypmay6hcf", "10567130750410403840"}, - {"evmos1cwpszjkvrfu4553f3agmp3xynncyjxma0r9e7a", "237393933750978560"}, - {"evmos1cwsktqhat8vkl6vne5q4zu4l2xva88ykjqtjje", "417921623823254528"}, - {"evmos1cwt3d2qs9mf0ulmk3xa83dx0d9mk23qc5c75uj", "1351466871492427776"}, - {"evmos1cwwe4c565lm0w9vww37yec7gpguluvmw5zfk7g", "1170651843164852224"}, - {"evmos1cx07uey0jwae425nhu0dy40qh497qh528g94qe", "106081051558151168"}, - {"evmos1cx0tcqg6eel5r73hvrc42537jg5jp7xmw6t5n8", "384205232914133760"}, - {"evmos1cx0xd2gs9mzvldtf8x7g8y880hcuu60ms54hn5", "2851050891439217152"}, - {"evmos1cx28vh6rs229jh455csv5m2q8a78uex8y5tdg9", "69852391294605312"}, - {"evmos1cx6xf6ekpm0klpmcyc4enmd58lgn99lfvwh84e", "369020854980606464"}, - {"evmos1cx9pf26np0x3l3yrkwquqyaj6y8l7yqa955qjv", "369378186902675712"}, - {"evmos1cx9q4qdn4rv6w6nntp0pu0qw72tvezswk5ef0j", "43730266663673462784"}, - {"evmos1cxa4uk99pvw4k0vh09mpf0fcwumdpj4plgrrlz", "10743207841813131264"}, - {"evmos1cxchs2rpwngcda65a4nlpcsj83aq0lh7zdp3af", "538687551366610944"}, - {"evmos1cxdhkhck446wuk6gaep90djjlafzg94k93rhv9", "1351611543645279232"}, - {"evmos1cxdr7hvtkhcswxzj0c3fdt4j7hydc2t5fss5cp", "5413674250899070976"}, - {"evmos1cxg7uw7nrw0eq8rl0m0l2l70wwkz6awfhymtge", "865595195075144192"}, - {"evmos1cxhpcd98rhtz9zxnsgdy7kedajr3zkljpfru9n", "1319723072568942592"}, - {"evmos1cxhqel4pr0hwejcpd8wuh5hfw3fskf7nsslesm", "29284178558240784384"}, - {"evmos1cxj7thghmvut7zf95qtkh4lshrd5c3jkzs7x90", "13095233527707920384"}, - {"evmos1cxjfyd04g44j038g36pdns2cwzw9rtgy7lgp3s", "1062563345096359936"}, - {"evmos1cxkc5j0vf4spe3pucygd6w4jd37n0mwd8qn0x4", "2331082932956099584"}, - {"evmos1cxkdr602t4hqz0j3hrwekx2w054lgsfxfzjr5n", "2438299213728002560"}, - {"evmos1cxl7wjqf69clns2zy959cdp0d6r8gjd2t3ck8m", "944488645578676224"}, - {"evmos1cxmhswpukyv7qawwnpwn4qe6gcatv636449z26", "9146703070265304064"}, - {"evmos1cxr7pyekg3f98u8x8w9frsulalcsjz6e4d6xwq", "1181477497441280512"}, - {"evmos1cxrzgk5w30vsxw5uep8kyf4fcwytz49z7e57zr", "6314649771112775680"}, - {"evmos1cxulv0czymhmzqv5y5jgazhcp998t9drnl3rc4", "2101977300739636992"}, - {"evmos1cxvm84up8slvax434wxu8pm58flkme859zrgy5", "52428771438539481088"}, - {"evmos1cxvmq7srlnsczve0cwrwzrqlaeu3a7wz57rdk9", "1861070370117409792"}, - {"evmos1cxwtqvl54vp8eutaq5zl6vh4asak04ls07lcza", "3400520227913234432"}, - {"evmos1cxxcp82xkcv2242rsqmydqhutxllyjvs3mv60h", "849409315686916096"}, - {"evmos1cxz034z32xswgut437qf3ftvczzvzfv4mdf5jq", "5499507914671104"}, - {"evmos1cxz8v9a8hz2rmjnrx4cyyuqgxdfp0xd67dl92w", "1416013688147763200"}, - {"evmos1cy5f9da6t542njvq2udl84wdtfw4wst727ucjh", "2409575902837369856"}, - {"evmos1cy609qxrth74en28ag2cf6v84djr387x9yeuad", "10292419295840919552"}, - {"evmos1cy6qgx59akanhkw2ud4ryjry2nqudcf5cncw8l", "1915751811270555648"}, - {"evmos1cy8e3g694emumm4s7j29cjpulyytjkzr04efyx", "180750227275469824"}, - {"evmos1cy930s8c0p75tltjv9gr30q57l8lqrxd9ahkwm", "552869796999673344"}, - {"evmos1cyeq70wje3y6aezpp8mx9cqawg5el8mu42ayn8", "314056189756700416"}, - {"evmos1cyfv4l90teqh4vasrnqy7gmryu6wrt4a77trcu", "9600866411008999424"}, - {"evmos1cygf3cnpeamhq3sk4p88krfgvumrn788hpqmms", "1905349974225028096"}, - {"evmos1cyk7sy4wvy4k652t2t2jn7tldt94ynyw088yah", "373430109406881536"}, - {"evmos1cylj5lsq54j2xrjks4affk5azzur450adadgvq", "43189379481448448"}, - {"evmos1cymmtjfmu9lmr3r9pn6x8nfhcpasxktyz2tqg7", "478137522542944768"}, - {"evmos1cynaeumcr7x6wx2w5zh5nj45h27j7auvewkj5c", "1574106055002750976"}, - {"evmos1cynknalp4lvmm747yspu203rrs3uzm9ns3kggh", "467339579901020160"}, - {"evmos1cypm5yynacjjmswmsdrraul274gsmpw4lwvpql", "961595844953970688"}, - {"evmos1cysw9pckptdjqj6860caw7x5m6tajqmt644059", "2295426885164837888"}, - {"evmos1cyutmla0r7gqx2pax0p78u6an94dk877vyn80v", "386944896669301760"}, - {"evmos1cyv8amkzx8w79a6ez4vt49q29ntw69d2cvjz55", "476283479203981568"}, - {"evmos1cyvh24ayqzh905y8hdly6wd4x3n7p2wtpf9kc7", "263740549316121600"}, - {"evmos1cyxhd0d60q929fsvzs0va55galgqxm02e98ghf", "5719338068423647232"}, - {"evmos1cyxqrt03n50jeh58u5zkax5ypx7csjdaunp5w3", "1432454984108617216"}, - {"evmos1cyzedvcmhwtfee7hk536p3f8a3yslv6cfnjtps", "403301046151894784"}, - {"evmos1cz045y5uwu2mccuf2melmr4hqycyps06as48h7", "2824700142143944704"}, - {"evmos1cz2ayxww3hp9hcwp56z3jdqjcmem28jhfns98r", "7703340555654262784"}, - {"evmos1cz30p44z5g0plh7shvj9p3j55ky6mf8gszw4m7", "2231832345695917056"}, - {"evmos1cz4azggfg6g3ad5hswyzmy3yple2pg5twzmqp8", "1948644656430022656"}, - {"evmos1cz5jsxccl0l3vqvlf9a7q57vnpjqgu687jp3h9", "1716964375805344000"}, - {"evmos1cz660mdk9h0qrtu4pjfdn2tpxrq9m8vllsfqdu", "5347952468075692032"}, - {"evmos1cz75d7nu6cwcyhvlg6g7t9wxcltxargrsn2gsz", "523250656424222208"}, - {"evmos1cz7a8r04mdk47w3ah06sfcds43z6p77pkrrnm4", "3561118248942588928"}, - {"evmos1czcwua2rh2jurjuae3p4y4r4rp99qmupya8kc2", "1227422833561586688"}, - {"evmos1czgw8v55d768yj7gcalc9r5kwdyr92ekagq0cj", "797477124613337088"}, - {"evmos1czht94mjpa9lcmmwkvfazwqyqtchq02klxt07s", "40070886171403952128"}, - {"evmos1czk46g0lrxjwskcpd0748nkcss5ets23phrgy8", "1529574517728436224"}, - {"evmos1czpmku7ctw2ggmakd7pnj0a0zyfytmhqu6p34y", "4792747187598224384"}, - {"evmos1czptmdftnu6pmz44mzhfmfcg6y7zxrx2a9cxss", "4207174766460178432"}, - {"evmos1czrlkz6sg4scshvczwfsty2h0gr3juuhaqp492", "3756560094396617728"}, - {"evmos1czvd9a0naqw96l6jglvy02t7nzgp2u0vtwy9an", "23392929039948595200"}, - {"evmos1czvdgh6n0sfhr9u32ztknhcpzgv3lzqf4tnwme", "989743573750764544"}, - {"evmos1czvsrrchm72mcg4kpcn9u3jreyc8a2ggdu4ha5", "9481386947503538176"}, - {"evmos1czwyuf6ffffnpk7ceacnphduxuchwsg2yw85cg", "471676926410131200"}, - {"evmos1czye5nerra563jtszxpqek8t6t3kz82jw5g4m9", "139449137589509632"}, - {"evmos1d02azcvl4anuenj7066fhzv9lwztat5xp2ehzw", "29088307607083155456"}, - {"evmos1d02z944hhwqkz6n9hfzue9w9jzzmkmym6y8nqy", "38475054674113478656"}, - {"evmos1d0470p90w676h4ufm476y00uj23qul284ey4tl", "37451281673715236864"}, - {"evmos1d070f2mtdyh367tn7cendu77lkx0sysxkkcdge", "2912510307181158400"}, - {"evmos1d08mr7t285ns7qx74vul6588szt9wcgnpwfwx6", "19427318571579904"}, - {"evmos1d0dqx2m03vqvjsxl0eqxgy0523vlmcx6qg5lfc", "7764560869571929088"}, - {"evmos1d0g8mlkh68ptp773nck0w93zakqlzr304s9lr6", "4234704424665242624"}, - {"evmos1d0js20zehq4l5u20f5j95uvkxtagjvtulxkk62", "1049945413584749568"}, - {"evmos1d0r99mdylj04u0ydxzplg7q0xystjx727g900r", "432952186270380032"}, - {"evmos1d0v58k2mpt2s0npurrnh7zq9gdw8wl732nat0m", "5459757031483711488"}, - {"evmos1d28ge4swscnzklvuchgg70kz79e0s45re5zzyk", "32869103855617792"}, - {"evmos1d28wacmvavgz4nqxapgtq8gk3wn6ett6y8j043", "15160687369085403136"}, - {"evmos1d29h5x6ujye3lyyslkyf8mczps2a9ztz6hqekr", "2988425348246011904"}, - {"evmos1d29p57hhqxqf7z33qhum3nyrlngyy84sjrhm0u", "1629537636160536576"}, - {"evmos1d2ahxe2kmg37pppw8x2g2xjg5gqzh5p4z4kjqt", "733440360995736832"}, - {"evmos1d2apa7v4x3cxgms7fh3ht9akvkn2rz7ahjew8c", "6063298966624509952"}, - {"evmos1d2drap2z3xmzmnwank50wzlqvy2e3h05ms9vtj", "251822542211822080"}, - {"evmos1d2ecvtrr9j24awpc06c7xh8fa7klpttc8vz5t0", "101054342806937600"}, - {"evmos1d2eltmnesg7gthyyvaahg4kxyyywlr60rrk3t6", "4098309287530102784"}, - {"evmos1d2fj7zhz57jflvjtwrywaahvpqypvv699t7r5a", "3843242749931407872"}, - {"evmos1d2hfks442n22x84yjk8kye03u7vcqqsfshuc28", "17022958094739959808"}, - {"evmos1d2j8vlhkj0m2d0h6ln5q7at5ss3cuaxn07ppg3", "192021886258257920"}, - {"evmos1d2je29gqqy0kltv89jfa6d30r3qak0a09xmmyc", "2147315647683137536"}, - {"evmos1d2wzgllc8zeruck3qcq6u5855a6zr3x3apgcnh", "1689265487536498688"}, - {"evmos1d2yzp24hrwl39tlnt9tda373fm5ftmrvc4csgs", "1694738660685283328"}, - {"evmos1d2zh8slgpejh42yz4nzl3tj9fggzm2mjdl8set", "3366319763618279424"}, - {"evmos1d2ztfj3t7p4zxg48knnqee4ju2kly33fkzppsf", "887577481525317120"}, - {"evmos1d2zugpq30g4vmg4nck72amctymenqwwsljdark", "2134834238898606336"}, - {"evmos1d32mwsdu8kfnertutplek5lv8leel507yz5k0f", "7154210012773912576"}, - {"evmos1d352m2navnavhmeu8cnhr4tkjcw69lqxz8evaz", "184320668152600064"}, - {"evmos1d377q8xzwyz8p8mzqn8t23lvp5eman9wq25fah", "86527933299682803712"}, - {"evmos1d37950yxrmjd7kzfnq5jfe5yas44r3k2820y9d", "490499640687323648"}, - {"evmos1d3a2cr8996ykn2dn0tqqe2rd9cdml4es5gyvvh", "1158927000975048704"}, - {"evmos1d3dlr5ajmshgk4ssu09z8wjelx98lahx7uxt4d", "6822414198600931328"}, - {"evmos1d3fwprynmzhtrpe8lkt6pue9vqlxevwyt42xd8", "178054640111196160"}, - {"evmos1d3j7hrkatfak8snde9fehx92rjjl0ytfg9p0ty", "4796722548917420032"}, - {"evmos1d3kms5xz6wzf725tv6yxa3982na6t0h9varqa2", "9358917421814366208"}, - {"evmos1d3pffje9vla5dxr4u0a2x47shplv6kw50mcjt6", "478706305974921472"}, - {"evmos1d3pwykp9u33ec7kkj4krrchj26cs32j09zwxux", "1229797269812016640"}, - {"evmos1d3pyygn6mfrw66gphzv2rqfvp6p0u5dpje9d53", "850886408643182592"}, - {"evmos1d3r49vnuyt9sahclcqn8gt8mhrpd0t0l8yk5q5", "40978124136949760"}, - {"evmos1d3t6vwtc080heed084nwn920xgcpyld24fw3v5", "10283795150398359552"}, - {"evmos1d3utm86se8chhdz3ulxmtczpfd8jqnxdt9cjwy", "24821583601796726784"}, - {"evmos1d3v3zzvu4vf38z6l382f5r0jcl59eny2lp22vp", "418180947832125440"}, - {"evmos1d3zymyhs0sd62u7mgvdexrfcuzx6n0c83lwjv4", "10782549160629407744"}, - {"evmos1d40lmdq8rfmtn66lmrq9fdell3ejxsd7ptpk0f", "4589277538477506560"}, - {"evmos1d40t74kjkmnqfqlam2m6wm4x55spnkxa6ean2h", "711006005932961024"}, - {"evmos1d42jy932753ugnmxqhcj3e2zry672gsdwrd3q4", "3264157541656483840"}, - {"evmos1d42rxswyyewrfp6vlnnc6mehf4vd7tchegh6ng", "331182499747525632"}, - {"evmos1d4490mqtsz8skhvngytg76lmxj8424nlh79h85", "1418626691553861632"}, - {"evmos1d44ccm23xy9pxf9dhyl75y7zqrp084g7sspv9c", "1455843402635942144"}, - {"evmos1d46ll0lare372pe0plald38wlgtqgwt8te2dw8", "31983414526554652672"}, - {"evmos1d497lf3y3y7xnlxa8hypv839m8ugckaphagnjv", "140091764801670144"}, - {"evmos1d4anr96g8000rx5ve9mpeyq7u0mq5fwz0wjvzy", "14470923807800811520"}, - {"evmos1d4dk733xte3kjx3wpgadpzqmpr0vj6h9wx3ggw", "10537724375362990080"}, - {"evmos1d4e5m5avxe9fseu8a8mk9r0z0uj4k9k543q0n8", "1316887783165604864"}, - {"evmos1d4fd0qn55hktakr03882ahnu3wxnc4scxt3kzg", "5655929937908817920"}, - {"evmos1d4gxlhyrl0j5lgef2z867429sejnjnwsv0k3ss", "2288825755869970432"}, - {"evmos1d4jslh5pw0h0hqqxje8gc8vpqsad9uygkfkw63", "347970769900744704"}, - {"evmos1d4l6kl3x0p2tm32uklru5hcqnewkvchr76fzvl", "1603137226948174080"}, - {"evmos1d4l6wm8z7hw8ucxymca7unzwtrywu8n4gwnrmr", "155086096221953536"}, - {"evmos1d4mvhktk9lzpt7wk0x792lt0lw05vkpmfjlj3g", "8268732290349568"}, - {"evmos1d4n8fsalsd4nh6e6fxrtxwnw9m4styca48v89u", "1236385498030691072"}, - {"evmos1d4q9jfnas76uwn4rh8ax264rsfycpg924hc44f", "935257534604687872"}, - {"evmos1d4te5qfhjqk62cc8zdzvqyqk3s9rl58f24pp5v", "256255362758133760"}, - {"evmos1d4y6qsx07hlhh8nt2npryd5kxrhw8t87uy8eu5", "9552517535468507136"}, - {"evmos1d4z5hdptngkufj8puc0akvjr60fmmgf034y3hq", "435862392962040832"}, - {"evmos1d505tm2gyt62ctw8n4f44lq4lzxqecxplrthtz", "721849289590353920"}, - {"evmos1d505ygr8cs3kdp70dhm3wjuhw7xsfcmx0h4k9p", "240206415743369728"}, - {"evmos1d50ps5kgc5mtaqauc6clv45tktv90s8gyhuc42", "3147803950335721472"}, - {"evmos1d580mdvx8ajcenr8ucmcfal2swu5gd7jc3ywsl", "757971485893058560"}, - {"evmos1d598309xw3mfdytfpmdh3zgdm5av0puqurge3u", "884357814325485568"}, - {"evmos1d5crcrs4xfcklv6qf3v4pxgjtphzke8rdexdcr", "13824404524811739136"}, - {"evmos1d5e8staq84cc94pakd3kzuqhpj0ate4s3nngg3", "7595335963662856192"}, - {"evmos1d5eckne978jrcuhpkrd5yr5v0xnrsmh0vhnkf4", "39806115671439245312"}, - {"evmos1d5gpkfvdj3zc55xu800dslc8yzz5gfmms4gsje", "2229176544039366656"}, - {"evmos1d5m9hhh0qrt9dvvmjsl2vw7w99vrm5xjncstrw", "841254086916445184"}, - {"evmos1d5n0qjqjcp48enahxfjjdhusdw7jtngfzdaz9k", "84236523831582464"}, - {"evmos1d5q3tmmxzv2vt6pm67psvhk2zc428l0lplhnvt", "2215714250676276224"}, - {"evmos1d5r8tnfxk9a9xh75uhepuu6af24u6thneq48tn", "1281600129026146048"}, - {"evmos1d5rekyep77r0erdzs8xu9rll8j274mfj9z5gl6", "1212128680573751296"}, - {"evmos1d5s8p78zkg4fmnkrvv0a2wpqn8j58hhwjtd0k3", "1419647510188908544"}, - {"evmos1d5ttad7httft5f94zs9yw3lvc7r3d6lt6kh0ke", "1167636473294386176"}, - {"evmos1d5wkwkratc983vcm23e2crs2y7rwhkjpm9vewn", "3726722420705499648"}, - {"evmos1d608uspevn3wfwmeqzdc5jzvhj0j68nzlpyk3e", "6200637670428424192"}, - {"evmos1d62cgmunpka33zczhyhnd69cksc2a2kfjwlh6l", "871540425488659456"}, - {"evmos1d64l7xmymg7gyfrtvw3ls9lxapmx0h4hvenzky", "741971074023497728"}, - {"evmos1d65ehhgvztykk4v5h9x0r7n6wtqkfnfyeqfmcn", "77367367923645841408"}, - {"evmos1d65nnxhw5fufq8tlfjvq776tn3dknw8ukydxjl", "1709635811250148864"}, - {"evmos1d672ryr397epk7s0g8vkfxcrceq6r8fwj8sx67", "203091573645516800"}, - {"evmos1d67svm3gjxfz70qml4pxk2jf6hgtcywgkd3zum", "7228047619590410240"}, - {"evmos1d69d0q0qcxk72h26vzw7zwshav89kxs8s0wduy", "81257443924745191424"}, - {"evmos1d6dfzakwcxj56gtmkqy9djqlwzfcgp4s9yu5az", "3755417476344364032"}, - {"evmos1d6ftcjfud2aa66smrpqk7qpauty8826splkrjp", "91356311247250432"}, - {"evmos1d6lqa8kmpts8v842kex97qtr3hd4sgw0vykckw", "3571017013799257600"}, - {"evmos1d6m906djjfnmnz9edzeevkgp9wsjpyhlhw3f4z", "5088243050176692224"}, - {"evmos1d6t0xav9498syk33jgx6w3t6w8kwsmdhzm396c", "467290257585893632"}, - {"evmos1d6wzfekxxhwttzprds8pla3qvnaa66y8qdjjpx", "26375853368250880"}, - {"evmos1d6yqymfuf4zclh967et6pytnkqy6csk68ezan9", "14640471360111157248"}, - {"evmos1d73nz47n0cukr2rp80emf5hw0dn5eanwa8kwgh", "4005745299850747904"}, - {"evmos1d746x6xmm56petl66cckscxqrmudx6j60v24zs", "3558729104053969408"}, - {"evmos1d77xmlgl70tkn4lv24jkchypu29689nvse7968", "753794123706700800"}, - {"evmos1d78weuq9waczw5pxuxctjq0vplpffg9hvhjqx0", "71976429400869126144"}, - {"evmos1d7awgr48ggwd6uylu8dr3ev9za0g7w2l3qf2j8", "2795413409885633536"}, - {"evmos1d7e9lh2j7qm45lg2rvjgam0cgefah2jhrnhldq", "9981797361898938368"}, - {"evmos1d7gmuqqp067s2gv09t6pjlkj3fcv87y4wctu5v", "692409728185729024"}, - {"evmos1d7gzdgfdzaj0kl550ztnwa37g6jlzypd9ywl3c", "956890894888388096"}, - {"evmos1d7j8vszwm96qkpc6vz9xwjdcqtlz7ah84cdfw4", "1477463770365239296"}, - {"evmos1d7jys4ct2sn08cfj2metmxa7c8mwsscrcpv9se", "1622395529761863680"}, - {"evmos1d7kkm9qr0re9ta2ylfp8m3lqmksxhv5d2kljm0", "499593060113462272"}, - {"evmos1d7l9np56tgscxg0anusqrwg6hc6jsgshk3g24y", "315547914656551168"}, - {"evmos1d7m9rnwsqwn7hgve36w80k0wpm9pqt5xqvnwk4", "16537755731525439488"}, - {"evmos1d7qf4xmej6tmflwk2mpfm6kzpm246vct823d7m", "22136384373300858880"}, - {"evmos1d7qsm360ghk83c80q7qggjdddr4dct52g8lful", "353085003953195264"}, - {"evmos1d7r934x5u9kt90j9uk8h5jfwd2t2kfy83mtw9c", "1919970776517566464"}, - {"evmos1d7w9z9t6cdzftsm3h45s7kedwv0uuh033267vt", "1031447812434784256"}, - {"evmos1d80em3yux49vx993apn87h6cz828hyc7sd24v9", "12157726150478524416"}, - {"evmos1d854uml38308efelezys6ttydxkh2s4cnmem6m", "53049591105018789888"}, - {"evmos1d85yuntr8m2r3u2vssgp23ycvwky2kdjllpdqy", "2707128310744604672"}, - {"evmos1d86jtdd8n7hcv77u868pycvwpse8zh3lnl4egh", "13885987128663044096"}, - {"evmos1d8f40xzjkve67m65tp283rnr5txzlw8kpjszmn", "3110431762028462080"}, - {"evmos1d8fpy255w47ql0h9g3ffvgmhnup2xrp3l8fu4z", "2014819398769713152"}, - {"evmos1d8fr38c8sxkq70wqe5c5ttlkmwpt9a9es2q6zp", "8238879446956904448"}, - {"evmos1d8fw7yu5r3ya4qtkr78km7thd2gggdtzkw9rl7", "2009607627486707712"}, - {"evmos1d8h08c8j3zqnshvdxak9dpk3pwzw9uslccqle0", "510743558332142592"}, - {"evmos1d8j733pfp5mdu4e3l9c534jy5smurrdr27n8wq", "224274033220452096"}, - {"evmos1d8kcs2sv09l8fuwehzdh7e78akd2vezuh0kcc3", "8396465437588678656"}, - {"evmos1d8zkd85afl3n55w5lucur4fy35dq6l8mxfd7ku", "792136276706282496"}, - {"evmos1d8zxjyyms0kyhd6r7j446kw9dych87gjut48zc", "17642124773446914048"}, - {"evmos1d94g3mhafrk9wjge6agvm954gcl07xtvuly8p3", "3392058576604673024"}, - {"evmos1d94p44x06pewf25l25cd5fungg8hq429z05k9f", "941248244162823424"}, - {"evmos1d968vep337j65g030qm5k2ytazx28agdl9h8g0", "980599761391030784"}, - {"evmos1d96x2fvx2j5kgj2sxc2ag7n8crfq7fzef26d6l", "82449182261959131136"}, - {"evmos1d98pxj4ktk6f7czynkgczrstxv024w0cnjdkhs", "343488088606449664"}, - {"evmos1d9e3vdj3thsa3594qt6mp9c8s0q8r673qkp9pz", "3143178813002748416"}, - {"evmos1d9e5mwzynypn86lkswal0dzjexwsg7we5aknnp", "12224016921454419968"}, - {"evmos1d9eagf57xey8ece3yah0k6jn8qpac8ssz0mvsh", "5399039070472922112"}, - {"evmos1d9gezl9sd4s27ax0hjnjzy3arnduxrdds7lyuw", "291051646266785024"}, - {"evmos1d9gsel30f8vpe3wzmdt38exlazvmz8uykerqyw", "384573681614437120"}, - {"evmos1d9h3r62f62ghg025f66ygl7radxwcsun0ykmqf", "487503186543054848"}, - {"evmos1d9nqpky9txkpcr5yme3q3u79dzheu6jg3vj6dj", "270777946077348096"}, - {"evmos1d9pjqh3cgutpg6nsvwhz8zedgqxf9y2xtm0x7x", "475974240989065472"}, - {"evmos1d9rhx9wq38ahmzgckcuvkz7ca60yy2v9pz5ttx", "7658087904188768256"}, - {"evmos1d9rwj2exdkdae3zy28sr7jsdfjmwkesathxuf5", "1062389435933447680"}, - {"evmos1d9wm8drn0twfwtf8p0hnval4xh79vhw4l50kr5", "31517994074630656"}, - {"evmos1d9yz54f9g0tnkax2zm2s64daz6760p0w2dr2ek", "12485528054854418432"}, - {"evmos1da330yg8kmw8v4y8p6ezwz4kzksar2kqs2dr8g", "6432766153949372416"}, - {"evmos1da55ldrgtkn972nfdjmt2scv5fqhzf2cpsy6h6", "1028416862095745024"}, - {"evmos1da5f50ycaserwgh67zw678ghee7jpk3s4a0muh", "3910416897824636928"}, - {"evmos1da84w825qpxqx0qdshpupzknczvx5q223mlqvz", "5929437762458482688"}, - {"evmos1da8upque7mqft688sr92yldpdc98veq4gtxcqp", "474046926959380224"}, - {"evmos1da97kxum4uxqdcf62qx4qd3f9ndazxsfvktaml", "1085933934224010880"}, - {"evmos1da9sc44fevknqpgs3qdqfhc0tgytrllmy9xeqs", "6836124716401414144"}, - {"evmos1dak3daqhd9l0vtwjfhzlwtxts3gfkwgazulsse", "1163310101314560512"}, - {"evmos1dandwfxrn38jtjayt9wfc7z5um9mz9wulwtg3q", "6098007639512498176"}, - {"evmos1darmsmpax7dphx950ncrjnaa7rr4puv8uq46xq", "1383011015675154688"}, - {"evmos1datnt4v3ty3l5vukxlan6msfmey7dt357m6r6x", "3863494243272974336"}, - {"evmos1dawjd5ug2s548hkfe40g8wf9kcqddc8jufefne", "11463018006254166016"}, - {"evmos1dazj0zz4lpjaq5g7kxpkd397zx7kuzy907j3q0", "5364293752942175232"}, - {"evmos1dc08jse8hzy2458w9vgxrgj2m4r684aj0xekth", "3154856239945027584"}, - {"evmos1dc200rrawxdllkppmv9ws7rrg9x0lv4ad8erth", "4722751915097841664"}, - {"evmos1dc2dfc27y3wkanlrrqds3shlxrfvrksezm7w8z", "2589778438417033216"}, - {"evmos1dc346pd2sxykj72vx8lz8rzdx0amwh05qga0et", "465082036365107456"}, - {"evmos1dc4yuyfg9ssuvedhkzvn2950aa7nr4455vgmn9", "10417192296009412608"}, - {"evmos1dc58t47ah2mvnh8u35hcqlkpkdw8kccysq5rfq", "1246297368173749504"}, - {"evmos1dc5gd6wy23mrvewdg763tqznexm7mxpu0739st", "1847189005507229440"}, - {"evmos1dc70gz7rkjszzng6u8h2sxhvyuhelzw30skeuu", "84315558276964352"}, - {"evmos1dc8fgslspzjap7d29u4pd85m3r4cf2v4t9nhgq", "11217969996353224704"}, - {"evmos1dc8hfnskxpffuan0dnsdddwc6e2639al34lsqz", "7106337166171412480"}, - {"evmos1dc8lxs4usqzfgl2vlpckn95l8tq23xurrach0y", "522706908531883264"}, - {"evmos1dc8nmn4vs8sr86d3jl57t2f9aqtv7hn28zcpra", "42651549287493885952"}, - {"evmos1dc9h2rh6t7cmlmf2xxkxhd6p25duex85zzr5pc", "2500339288653629952"}, - {"evmos1dca4zur5mgrg65k07yxezj6s94mzuhzjmqlngh", "17324977566672535552"}, - {"evmos1dcc3cel9u4rk66alsu3xqwz3fsldz847zaxunt", "1145737479200227328"}, - {"evmos1dccahwqstasz42g5zl6f0tpl4r4hylfsrc97cd", "3003605461429065728"}, - {"evmos1dcchggxfqdgsdm0e59379c8u5nwx35d6amt34l", "96517073905926912"}, - {"evmos1dcd0w3wyspnfh6av6dc4rnd5cug3pe53u62m76", "13147139766858817536"}, - {"evmos1dce2ghxwrcplcy75neeamsefmwv6zdj279cgaa", "8341165664147727360"}, - {"evmos1dceuvwe702ew0adjsc63fvuen8c7uchet3u3mx", "4689500818036654080"}, - {"evmos1dceyv6k8zgvw5c3r6e759wrale3hzgjngfyv53", "43687242772416380928"}, - {"evmos1dchysg9tgsca8e0ctum5c76unehl2ye83qwljk", "2795595636145171968"}, - {"evmos1dctn6fjzuxdks80uraz5552g2dl6kj0u3zv0jf", "3401464301903614976"}, - {"evmos1dcvtlfjuwtceuzl56la8pwcvxqmygvj59h7xu8", "2920163752305808896"}, - {"evmos1dcw94jat4u9ncu75gykp03qd9uwjuxpmje0d29", "218296766576107520"}, - {"evmos1dcwzf4l8d8myq8d2vewpcgd9v2lzsg5vah8mxq", "17369188179750643712"}, - {"evmos1dd0xeeughrkh63dgg3c5lx3cyygyduas425esu", "1125970851476029952"}, - {"evmos1dd3dnpwgqmjy067urmykvmqvx33ry0py2hd892", "1508452757292406784"}, - {"evmos1dd3jt3pkkhz5kw6hnn465x3nn7tdx0fcc2a9k3", "1129898758949761024"}, - {"evmos1dd9s32rem3q5s3pckwnw42nz3u9w34ulnwnwva", "899955294972139520"}, - {"evmos1dddn64769tn2r6vj33ju2g62tteezerek48r83", "41101993900922863616"}, - {"evmos1ddex3rkmnnu62w7udmp5f3scxc7karzx7rvrku", "3394869953093694976"}, - {"evmos1ddgpz0hsuc9z4p2dvwp4cy9r4de2kkye58d836", "6627633341752852480"}, - {"evmos1ddhytj3m4nxwzktdnkcjd757uykej5dem56d4c", "35812676869913419776"}, - {"evmos1ddk3gz2ay2yg6z87sccdr8xef5z0mr3myln9z4", "13074426593978208256"}, - {"evmos1ddkjfr66qakl8cxjhektemkf8z88e05futzrw6", "144709579338967367680"}, - {"evmos1ddl8t9ekrtacytqr68wsrp85s9lama64r2m9z8", "171869285162692096"}, - {"evmos1ddlvsfxkqqtpee9mu8608haxw570p3g79w3ug4", "1778844767770399744"}, - {"evmos1ddpqt34add0t39zhe0swymr8ymln20fevwmeeh", "1161937167507639040"}, - {"evmos1ddpuu2aljkp89d2vcs54qy60u6ud6anpstt7n3", "5316709570156582912"}, - {"evmos1ddrlk35m7gln6t2mv744l8ha5h96sjhjgtj2se", "21932031575489208320"}, - {"evmos1ddthmw7cql40yn0h4v5h4ztk0dm09rgtvnwkk2", "3698676631141310976"}, - {"evmos1ddturgx6mg5quwz2vttpykq53vsjd0s33akg6n", "2373987008600404992"}, - {"evmos1ddu7a65svcrl7x4tp7vxsl9n7ucfdk224q9yhf", "2012449227693981696"}, - {"evmos1ddwr6s370nxj53dlmxvkuy6nu02rzvcef35dtk", "573128489042841600"}, - {"evmos1ddws2uym9je7ql0w2wg66zt0spzxmx98v23yuz", "18289592645740554240"}, - {"evmos1de5xzga8ntwzt2xyfh7e692nu7l5r4hqzezl6s", "1255584204142036480"}, - {"evmos1de6j6k49ns6d6dnzuglftydj8qu7e8yg0gh9e5", "2401884768520847360"}, - {"evmos1de7j8mpswa9hqmcvlvqrnj0ngw6yzfar3ll0y3", "3867023831570558976"}, - {"evmos1de86d4tq3wmfm44hzdj0sp3r6q07l0qze9587j", "231060815799698432"}, - {"evmos1deeeh2wn6htzuvcawmeuk2gqx345jhxpvfmsxh", "833210613699043328"}, - {"evmos1def9726t9pgaj8jf6fv7l8mq7gw47hqyd59q59", "20235305290798956544"}, - {"evmos1defxyuggnjfnk3s0hq6p5jdhf976psqzytsc4g", "895827480714479616"}, - {"evmos1deh8anferylaljsnsnasvvnscu29jxl89mvq8k", "5165589009262474240"}, - {"evmos1dek8f2yu2qvxc872z60vkg4434m6xp2vyqug83", "16116903995220054016"}, - {"evmos1derdl0cnp9e8vdkvg369q89te9892qynyuwa4w", "49813651279162624"}, - {"evmos1desc2x4yxyhph6sgucl0vqmu246clv6vgcep5t", "4200689300065703936"}, - {"evmos1detmllp7arnhhfae8kl6clpeyj8vqy7nawseef", "2586663349252337664"}, - {"evmos1deukhz6dqerw05n30pqrwgpq5scmwwzp3dtkaz", "883868477434509824"}, - {"evmos1deusd6j44g0yxa9vlqlqcl2strcwcmqzshg25v", "3986181093843396096"}, - {"evmos1dexv6ylk847ptlevjw7axq3p6we8c0gm2xudwl", "10016214525785993216"}, - {"evmos1deyctfwc7ec7mnsv4th4shhgpa7qwvsec9kt62", "5095039842484967424"}, - {"evmos1dezwh8k5ra8ajvg297zwz2yvfma96unalwx4pf", "10802290030451658752"}, - {"evmos1df0ga7fjckz09gm75ddj0jtpl5xauu823z05pn", "60865224547077120"}, - {"evmos1df3cy3xj97c7ryg45ahtnlf8v2w99y9zev90na", "23467714747190579200"}, - {"evmos1df6c2d7h8lsn34ac26hlmu0kd3g5kyl3wauh5w", "7276591762678284288"}, - {"evmos1df7qf9eurqcvr4p3zx75m6487thjks27twkpgp", "803607127206548480"}, - {"evmos1dfc0j74vkl3ja56u4xyxeew8qmg6cgsc8wer92", "16487101360372318208"}, - {"evmos1dfcsq8qzcatr5mq2mjmf2f4ph27shqm3afjxfj", "29385538986692935680"}, - {"evmos1dfdjuqwvcnkvf4s3fwdu3pgm7nule30tg7eq9z", "427590088812831232"}, - {"evmos1dfdnvs343w24vgknzarequczrc06yqh4y8283f", "2854488806215370752"}, - {"evmos1dfkp77d892dzddzandccw702hxdd8uhtvfxy4y", "1795585751172520448"}, - {"evmos1dfkwscaygewy99r2ykkuvguptfrrrxqw9xm527", "1689939281096896512"}, - {"evmos1dfp2xtknzcyejlps957wedcmqf8p24dgxu9wm2", "881818838025306112"}, - {"evmos1dfth7z5465e7jwsvys9hcdlfcf2xth2qxwmlkx", "387679879017486848"}, - {"evmos1dfuqcacjsyezersth264hy6urwms7ehvuqluhk", "46210341912821504"}, - {"evmos1dfxfrhrfrpafdptxtf9c37mhmcregpvh03xh8y", "120736780843607040"}, - {"evmos1dfy2gs220s82acf8cxlq7unlhtguz6mzd2kyym", "3317058394713169920"}, - {"evmos1dg0p06dffs2f46hj0hwa478675vr5thv7ywsxp", "4699855716583755776"}, - {"evmos1dg52hhvnuq8ufx47n47kcz7a0q3mghuvlv7h25", "6791394601085796352"}, - {"evmos1dg5m5qpfhluq720sd6j4396p8u2ezzz3ufr8gd", "12446689777504032768"}, - {"evmos1dg8xyam9xrvlnde5v0equdxsl8l9lmk3uh8cm3", "3392383645198356480"}, - {"evmos1dg992jtnq9dxkwjys7u2vdx4fe60ad77sxzrpe", "31173297545490460672"}, - {"evmos1dg9yy2j2ajg6qpc5r9ue56es6d4dvyd9xketnw", "5681907462570688512"}, - {"evmos1dgc3k598rmh3venzdf9fwn8n8zrcjvysm33zlr", "4821910083047414784"}, - {"evmos1dgeqfpktutpt382gqkkeynarnqmxgdmc7uq7jw", "52937936641694867456"}, - {"evmos1dgevc5mzygvu6flvegrd38afnpg0nkt0scj6dx", "1069144862201212928"}, - {"evmos1dggjuzhqx004eqwfsf46k3eg95dqsklwk8v6wy", "16169473754511683584"}, - {"evmos1dghukyq4em5rtmjgz50ds6rfjd8ty27449wslt", "472031522936356352"}, - {"evmos1dgk9ad4u63uy647k6x7qfcswhknftxdzwlu3aw", "1225295825326723584"}, - {"evmos1dgn73avlhuw66ckzvcxr707r3r0w68tl4y9df2", "29775672795921965056"}, - {"evmos1dgngzzmwamtgqe7e7cmnfw5u0h482r99ykdsfu", "100995819699884032"}, - {"evmos1dgnsemt299akwz6ps05mkcng5d3sx6kq5jq2k4", "13709853200856549376"}, - {"evmos1dgq67ggdecqlgj6svl7x3pjp8p9ghnjm3z8rjw", "77159814136215207936"}, - {"evmos1dgxg606yexshfxk6e9ee0f38hqyjxs2hzeaswu", "1151697454250173440"}, - {"evmos1dgzypqf7vg9e229hhrktpz5w6mqqtgxpy5znku", "1588480310260400896"}, - {"evmos1dh3mpv8v427z909r6c90wcc7ttqr93wnvu5ygm", "457580392319924224"}, - {"evmos1dh5lf8pvmm5swyp76fz22ekxx99nplycchyc8x", "803052710634099712"}, - {"evmos1dh8l2kxtpa7qu30l07tg56rsjfgdd3k8ffa53r", "9626136122243809280"}, - {"evmos1dh8vgfq294zu42t25y6yr4rkuyxmsxjgw0fmzk", "1085781663924557184"}, - {"evmos1dh9q48l88lz57xlvcjjn2c0rzuux3358rqzhel", "413843589589169920"}, - {"evmos1dhf69dph0ftjpszknseave4cj3n222qglfvqlk", "406555250430180352"}, - {"evmos1dhg7qq5w7znrfvq7zwezjx2fy4tppvu06cfvht", "1188196901293021184"}, - {"evmos1dhjlfe5nm3jx99x9fetjfvg750tw2qd5cru6g3", "384205232914133760"}, - {"evmos1dhl0luw3ym9q7sfjrd6vtszdetuvpxr72prsn9", "46155806873495576576"}, - {"evmos1dhmk5svxeanqtquu2hkzglxatx6vlaggg4e93s", "229500746512748478464"}, - {"evmos1dhnudyr3nggjhhvvm7f4yg95zk0g9f6gk2png6", "1685555726612504576"}, - {"evmos1dhp2cyxyum3egf08elqzxgm2y40uvqv5fd5up9", "1553471838100840448"}, - {"evmos1dht0uezd0f9cqqtcax4n03ctd09s7v88cjg292", "2410122181849001984"}, - {"evmos1dht98lsc7h3tqn37dfg842ll2c75jfx08mhrqt", "338642750881623552"}, - {"evmos1dhulw82ny7upltg3c6yv5khy55lqtdp74asq27", "1422886064437106432"}, - {"evmos1dhv3hk4ndq5zm382fa97ljp3k798cwxqwzzpjv", "14309924538231795712"}, - {"evmos1dhve3efz5ae6nkudke4a8lgd9dtzn7d5q5t7l6", "36005227323894571008"}, - {"evmos1dhvjalfu2wkuxfxhalg8d0t33e36nc3wjt83ku", "16391437237862768640"}, - {"evmos1dhxfel2q4kgvhgz3kaywadqchak6eaywsf869s", "40328646352069263360"}, - {"evmos1dhyk954nm7gc67u4209yff33yaqaap7q0a6dnt", "1811644495174053888"}, - {"evmos1dhz04yd483kqvv46q8hgppnkqmtuqzl9ypezy0", "260311356409051136"}, - {"evmos1dj0r4metu0nxmva72uud6sy6qpsthmxhjammtv", "77674482347389026304"}, - {"evmos1dj2u05fdu9vya5u0zek5he3afey3j00ant3mqz", "3410224538508659712"}, - {"evmos1dj3u6znrl2sjl73lktcay60hf6x0ymu6xpd6hh", "29144674485776961536"}, - {"evmos1dj5nevdf6qtsv55r4kgnjva5dwnww4hfsl9jkg", "19714665444709748736"}, - {"evmos1dj7f03reqx0afjtaah08fgd3cmr7p8uy4079k2", "5305589829253623808"}, - {"evmos1djaztu4ns2x0r72gy65lnglhdwzedp299g3vhy", "6983467323923922944"}, - {"evmos1djcffkw03dmxyj3cc3tr98rncs4yflt3mz3564", "1433248584200236288"}, - {"evmos1djckjllgs3tsdq0d5hjtcuake002r3suc2stye", "32298917336823808"}, - {"evmos1djdv8z3w2nveqs6u9nrksejxecu4fk3uw5w38w", "4851494151820855296"}, - {"evmos1dje8gwepfjfrw5s9vntarz4uvxgtju5k00pw7g", "1257198246286562304"}, - {"evmos1djfv60f9zmwt8ftkujdfvnstpu5rlu3wypmhyp", "66782907443177201664"}, - {"evmos1djh8363un65qee9x3jadmj3kvl9hpl4nlhktky", "384223010796675328"}, - {"evmos1djjktvvng4n9jeshq4whtuk3kld2c5wnu0zvkh", "2511733687329138688"}, - {"evmos1djk9a6cp64hg3xh6c8ud0anxdv6yyf0rfc930u", "1844277186786623488"}, - {"evmos1djklrawvueryxm32wug3ylnszj3zkd59w3a7wh", "34837007086188228608"}, - {"evmos1djlsypvua4pmcm3mep2an7j0q4agjfe899axav", "6093570340889069568"}, - {"evmos1djpn82xnsnwwa0km4rvz55kcrcupk98a8myyta", "18334510224226408448"}, - {"evmos1djtmnjwmftupfrlcqfc7m57wk7u0kcd4qglwdu", "314796728910644992"}, - {"evmos1dju9el9rxmwz5wc2drdhsy3vxpgq4y0e0fvlzr", "915665207652265216"}, - {"evmos1djvzjyvwtxrhyj0a9zze9yf79e4vt50tgrymwc", "4756885401470513152"}, - {"evmos1djx82wdldfsuyjw9yryr0mgwr8u3x3xup7vh0j", "77215191209035530240"}, - {"evmos1djzsnca2r6taukclrfcgh544h4znhfhwu7p3wv", "2645949111384699392"}, - {"evmos1dk2f2h3gzr04dqkjtvgmp73ykgm7mk7czquz5p", "7229807502345654272"}, - {"evmos1dk39he2ujrnf0v3u7779pamsamvp2v968vvjd5", "2638576021147334656"}, - {"evmos1dk4ste222kp256ky00553nexna0rh38htynnm9", "20988406701257011200"}, - {"evmos1dk7unpc5xh0lfm57fycsqzqn6f35rv4vvekusj", "941710000483440640"}, - {"evmos1dk9ms66ranvwsj4r2s598j39v404r8qwvx0hkv", "385959487973997312"}, - {"evmos1dk9tx7xhc7el44na7edlszhzkrpcdd26ldtf4h", "4052253457060442624"}, - {"evmos1dkaemxyj3x7a9ug6u7m90qa63jkxqf7szvwq5d", "583418014921289728"}, - {"evmos1dkc97x6m8ftencc6jcxn02quzl2tvz0g6uqpcr", "2541113158177638400"}, - {"evmos1dkcfq2px5hrlaezenxtauklt3ut0zqq2ve3c2a", "708086809143475200"}, - {"evmos1dkcujd77p27n3nw59y4y7tsqk92tnry54d46pf", "120103142449245683712"}, - {"evmos1dkd6xg3cacflrcxsfdfat3y6q7g45ytyvxnmta", "13876545720254099456"}, - {"evmos1dkhpk5hy4dvu4w80f0dgsn3y4frn69w2dsw6rq", "8390448580247511040"}, - {"evmos1dkj202pa0keh0agr8kt88frfhyhr29e9z678jy", "2161749774571601920"}, - {"evmos1dkj9c63gkzvr08m63ns45jx335drr9zcur9mwq", "167829976880364288"}, - {"evmos1dkjqw8u5xe50suk0464axeclca04mp5puxsvzk", "13436559027006464"}, - {"evmos1dkkuhrmlhqg8jcgd26vk5j2pghxfpgk8ux5sey", "669059097736140288"}, - {"evmos1dkl5rdmjf2jp42tjglcw8zg90x0eqjvu9sndpe", "7973639193884248064"}, - {"evmos1dkq7jergu886jnh78w64lsz3jpyykykrwtlprl", "9050796800040770560"}, - {"evmos1dkr97h0tk4sh3gd6ckc4uex3ne397t54ge7sfp", "721604687230071808"}, - {"evmos1dks0yafcygvq53cfu0n0n0q5unsfsfyrvhu4te", "2218579308170988544"}, - {"evmos1dksrcvvmyjjzyxp6nepldh255lpse5ehrr288x", "10579183988665135104"}, - {"evmos1dkuq5pj3pll9jvddrc6pw94wrgu0sjuz3qrl84", "19697439031361822720"}, - {"evmos1dkwl3dgfgxv9tl9yqxerhcg594s348evfnl2e0", "102022948072626176"}, - {"evmos1dkwwte9ajzpl9kghy2q0xgz98u4mys0sjxk4nw", "7152660922557794304"}, - {"evmos1dkx7c07k3k22wxy6nq6xafftf5ewqqqju2hcur", "6138668069697331200"}, - {"evmos1dkz3kyzndlhthw4gxndde4r44xnk3gnrfyrfc7", "9279304569682288640"}, - {"evmos1dkzgneglpztzfkqyj78te589mzg2tq0rar5094", "1031104426697640448"}, - {"evmos1dl2jp36t8lfyhe3f26muh8ztugtrq7dy9fpj3m", "667119127050475520"}, - {"evmos1dl3hr0z2deqqswl2e2elfx006jsdg4sm2vuge4", "19686679146706640896"}, - {"evmos1dl4ux2er7k5lzy9jm8n0ff73ucf9acsx3v3yju", "869409290716474368"}, - {"evmos1dl76ksyzdupl6ptkve3xfgw9y2mttjus6en6aw", "759547726592260096"}, - {"evmos1dl8jg7zq4juu5smhxlmqwdqrhplhrkvs64zrg0", "10265023536050343936"}, - {"evmos1dl8v8fu2xz4ucyskvdpf73ka54y0t5yuvzx2zz", "911674983183099392"}, - {"evmos1dl9ssp2g26cuaz36vr3443wm27wegfzyq5ttfc", "2745969632477519872"}, - {"evmos1dl9yv7c387zg5m8yhxzhwed6m263mk9s63u6qw", "41998124134137061376"}, - {"evmos1dlc99zjzxs9tuxscfqtk026g9ttmqlkhgs6m35", "767457077415320576"}, - {"evmos1dld005lweuhtvnxeml8ga0x0ckns8yejprqxvr", "1044418377104654720"}, - {"evmos1dld263fcjas6au4pz0327m6hkekzp78udhj6vf", "1453955770004717568"}, - {"evmos1dlfm5qk5duxdvnwyphy5t53zn6jcysj4c3n0gp", "9523940560852021248"}, - {"evmos1dlfrffvggjzk5mv6emrxdpghkr009gqxm6d4w6", "283290641410894848"}, - {"evmos1dlhpgktrln9urt0l0n2cm0ttaalswck3adtccq", "12768109898717962240"}, - {"evmos1dll6q8kphe4y08sgfkvhcnemw5k4ykkt7prwmt", "916873911035995776"}, - {"evmos1dlmqv0wgn8zdpqkagnryz22frm608pjpsqzg05", "4350217103067850752"}, - {"evmos1dlt3pj6g5udfprjfx3fvpvhslvl5lnx0le8va4", "2961357341048721920"}, - {"evmos1dltlrvaqkna4emqpgr0ht6h6k42rffladmk4y6", "125486719025016094720"}, - {"evmos1dltt9ef56a8w9z6k6kur7wtygjgxddzrzn7yn9", "56418651902790483968"}, - {"evmos1dlxwlqgewe62zcz7h2d39hz9p29m0q8reph8zf", "847865575194595328"}, - {"evmos1dlyl4dg23309k3rd7glh5nup5yljjq5uxk6y0u", "27329468390953861120"}, - {"evmos1dm09jev985vr6v6hugaaxt3zvegyv79jxzqesa", "375033907252560384"}, - {"evmos1dm96tgfyjyr0mv7zvstvd847ruhj5f5utx8yal", "214396442680652288"}, - {"evmos1dmdju2w2te2erdudtfeh03w78ayu4m78xewhun", "707493003027956736"}, - {"evmos1dmer4c9aav4hmajatx3j8yhcx0er3xl64waweq", "1071306671200378368"}, - {"evmos1dmfg2zuutatarrk8hye3e5ehda4gn7wlx2xdvn", "1243826674945220608"}, - {"evmos1dmgugzyvvz8z78qke44ynuzjzsc8x5tpc3m253", "3184718968917814784"}, - {"evmos1dmk9gufp4y2jqjdul43tvnkuza2e83f9w27t32", "31429883243689549824"}, - {"evmos1dmmt466dk0rhevagzwzckxrruja3pu3g4jhgz0", "2108613400311219712"}, - {"evmos1dmp56lucen30m8mtl9lnfpjg38jt9zxgv8zu7p", "5520698974302709760"}, - {"evmos1dmr5z72fpsekcyvp58hp86sknr9y5ws6xtv7np", "8480282157195804672"}, - {"evmos1dms6adfhl6x57j9vfals5m2e9r49tksrn0t7g2", "353832250392887296"}, - {"evmos1dmsxnkmws9f8haa6ymjndyf6zehm5y6jwlrnrd", "7035266134935511040"}, - {"evmos1dmtn9ykyn299u6kyjyllxvlmyy6zgtf0pr4ldx", "3027513349337607680"}, - {"evmos1dmulxlygagc8073m58yhlydw7npffp6qeep57n", "85529542762612224"}, - {"evmos1dmvpe0tr8tqcgdwa8a5kcztl27ndlunl6ayw7m", "2889031849245147136"}, - {"evmos1dn049xecug2e55xxjr852kzlagr8ynpd5maj2d", "9221391945257242624"}, - {"evmos1dn668mgk4av0ft5hnc8g8v5p0pjge8s9egxumg", "2812947893168009216"}, - {"evmos1dna70h0qxjefl38dqahyfm8cjttpstkc3usay2", "4272045445441235968"}, - {"evmos1dnafxe7g8f5s8svq206l5cmuwpa3nxgk800ksv", "467286229192734464"}, - {"evmos1dnar8xeqppz5s0vx3qs05zj7h94pn2hvemw55y", "26057952271154176"}, - {"evmos1dncd5l3gm68l9cuhu2r700nkhwh0l56re72k8v", "4208275157450038784"}, - {"evmos1dngq92ldtfuv3pqc3hgpepxrpurdxdwuu4d99y", "3329922055697956864"}, - {"evmos1dnhr9mran8cfdkhglryp409n9aaq8v42zvrquu", "4678639684195368960"}, - {"evmos1dnk9jywg9k7uxkeug25npcrky05nl3nnjtd3zs", "274932834079834368"}, - {"evmos1dnp5y32wwu2xx86km9m797mz8sdg7znklnnz24", "735627009379036672"}, - {"evmos1dnq27elaeh3ula5leyj6dgdswuhw0t3dlmvtjf", "3964026800068704256"}, - {"evmos1dnq4q3yazzhmchf0fwgyrt7v37ltat0su485x2", "251330588826537984"}, - {"evmos1dnxs3u7fgxl9zxewvk8xghekkhmjaahv4ygagu", "11250736585609211904"}, - {"evmos1dny8c43kjn8qe8kv2fwe4j4hun38nypumg39pe", "12530273415455703040"}, - {"evmos1dnyrddf4aw2rr7w7lq4hr7qwgj0jnjppup3sgn", "5656430397151434752"}, - {"evmos1dnzcdghgrz0euzkkwdlynglwgxvulmg767adyt", "10477597309031362560"}, - {"evmos1dp0l8332rwcwm3rpu464e8r95n07shgc7k4d89", "44950843927907598336"}, - {"evmos1dp0v6gz7uqvwut39kr95xyu37r2egguszgdaer", "1200439543821288448"}, - {"evmos1dp23xp8fnf5z8jt3xvje7qhza0al53tzg4eec7", "337711752057729024"}, - {"evmos1dp5aqqx67wuu3w6lhqukyjugdp78hscenva5hf", "94293612618232576"}, - {"evmos1dp82cysvmlla0q7hrz43scaj8g8guptg8x2vsh", "83051706467062579200"}, - {"evmos1dpc85dsg9xhydh2juvryzln0e4xtm39m958txl", "105092738033803984896"}, - {"evmos1dpcvp7p82g4alpr6zxve43597u0dfj2evz3wq5", "1042720296811717120"}, - {"evmos1dpf0hu2alttm0vknrq6dg6k3jl5errs8k2cr3e", "767701110351587328"}, - {"evmos1dpgc95rlnk4tp7uxsu5dt4v3ckrjeyk86zm37z", "9603084632259706880"}, - {"evmos1dpgztn8zemxqdugdwmer2mvdg36g8z7l35c5as", "5861394264250531840"}, - {"evmos1dplduvxlar55wd9wuq5kchdtehy7mp327qewsj", "1063740369198961664"}, - {"evmos1dpps2ax6f0d2ja5q6a5h7fvqu3h774vjzerpne", "1587952250960930816"}, - {"evmos1dprkjaec9kwtshg3wadhjffwulfgt9ec7qcjxr", "40299651671595065344"}, - {"evmos1dps0ucqsdrpw6qelmvtu5x7gx5wmd29grsvr9q", "1459326670148305152"}, - {"evmos1dps6prxlccyga7a98jgxc0qalwxyrjnjjcy5n8", "1328094471782193152"}, - {"evmos1dpsm4sg0w6vlrnlpmh79w23nw4u57ehm3f2ney", "4817120077838917632"}, - {"evmos1dpuefpzf47xdp9md4zp70kpecf8nhxru8kd84z", "15257656911825752064"}, - {"evmos1dpujy9mdrw7tehpftcfphn92gkslgr7dff4879", "3521259315156240384"}, - {"evmos1dq5jkvt5tfdpeyzzngafzhumgtsnhmuu40jls0", "1568672255737775104"}, - {"evmos1dq646tj7zef8pakvkz2wv72vw457jca93prz5l", "13003740868895973376"}, - {"evmos1dq74n6z8n6sgm74qqrrthd9xlepj03flf99aq2", "39325851832866816"}, - {"evmos1dqad3l0fycgsqmkt0ng7cazkg7p20xxnxauvhq", "1915427202993684480"}, - {"evmos1dqay9ed5zjh9eau7eelrd899jdlaehq33zj4kc", "46406427090096603136"}, - {"evmos1dqc30545j4dpqkdledc3qd2l34kj688yf4jxyy", "31181273372845527040"}, - {"evmos1dqkgfvw3fw3z9qx0gut5t2u333a65tdaz4n3yu", "197720033279511040"}, - {"evmos1dql52avg4v8v0wu9hdlr4grjtxx278ja0gnwz9", "275622864019426816"}, - {"evmos1dqlew453qeagvqwcwkzg9ft7mez8d6jrsted78", "3295849308435743232"}, - {"evmos1dqme60dn4qzqje3v2tlkhp3ptw70wfmm64ktfm", "29996560575620177920"}, - {"evmos1dqmuj7nr7h6xhvkdvh4z92mfk0gw5vawzfrdhw", "5649457890235607040"}, - {"evmos1dqnvxdk9dndgjkj5y0up358ee7e23tyk6hvr7f", "218358038765746176"}, - {"evmos1dqrkrfldmnqmthsjfjj2dre8fzncgwfktens20", "56165209854166245376"}, - {"evmos1dqt80g0hd4v7gd4jj3d7zc89u3k0lv38ld727e", "2455443115025637376"}, - {"evmos1dqtuksqwv3cj6zxpr3rv38xuns867apc2xjgmd", "1082204863045089280"}, - {"evmos1dqu4n9w4z8vw8p636f0kt87ffv5e5q0p6vv0wj", "230590709641024256"}, - {"evmos1dqvvk8c6pv4n9tldfkd4qflph6ajfk6e72cvau", "2625631895305014784"}, - {"evmos1dqy3dey5u6m2zmc3xmzszppzwmjftef4sljrnj", "192255662641605632"}, - {"evmos1dqz08f0qf73yae2kazqamyaune9nnkeuqukm3k", "4510050702386561024"}, - {"evmos1dr0p7zn5d59ywplmwv9nlr0usjtuz264cyl5ke", "34868848318080643072"}, - {"evmos1dr0xw22sdxl6k064elhl6904sfyw5msuq7nlny", "859397590395235456"}, - {"evmos1dr27hgfyf2k7t6pwf8uxhl3hgkgnctnls47xyc", "2976078078743299584"}, - {"evmos1dr36gxttywf9gahyptpxqdvpklevgxp6xcnxld", "4598674018816772096"}, - {"evmos1dr4zs0z3t69xrxly4mm5yh9ym3hdchad8enw44", "4876707384471378944"}, - {"evmos1dr697ycelkk4qcnkyw0lmpmhcy37zxfru5t2ym", "1786514431674345472"}, - {"evmos1dr86w2senssj8anagzfujkcntwwfmtsn3qhtma", "71842805138075648"}, - {"evmos1dr94jwj4qz8mtunxeme5emsppdxyvlfzsgchch", "777710560007333888"}, - {"evmos1dr97j0hw8ysnkkcc4gxnepsqzww4vvq8eh0lf4", "1460423065001826304"}, - {"evmos1drcmjyag505x5r9v55y2k07gc6aztz2a2qhc5y", "23250629555660288"}, - {"evmos1drdtngx6hpxy3wycjm5p59s52q9ltwu9v8v32f", "3535965288999432192"}, - {"evmos1drfrsnj5h9a48lhtlvvfvmhnww6jaxdenkv0e3", "2764649813815111680"}, - {"evmos1drh3q25n528k344n0r3lq4rrrwth9xmhxw24g7", "2561705082871390208"}, - {"evmos1drhmzdrjv8y32qgsnh6dpdxxt037qqfm5rdtrg", "20702504189873717248"}, - {"evmos1drjhf2kkzaxaeggwtg05ptm2045qhavmllcdlq", "1575270447987371008"}, - {"evmos1drjtf9r6xlkyzvtj87wrrjxj2fhftsn5tgqpcd", "10427504438402082816"}, - {"evmos1drka068hmf6t3xea0jnj0xm2myznhve9wsksmq", "5314504603629056"}, - {"evmos1drncpnul4hw0gfrvrs8y2kaswwa2kgh7vhxgt0", "1294212763813660416"}, - {"evmos1drqr6y6ek7wdhc93s7e8guhl75acmzjgzvehsd", "6042646352994697216"}, - {"evmos1drsdw2rkefxpm0zft67v0v7d76077qrx2eulpe", "2487564540367806464"}, - {"evmos1drtudsk4dte5pz7xzk5ut3uav39kasw9dt2mfw", "6844612959542272"}, - {"evmos1drux8kxm4jhld29xpx67v5y9vxmqj25c0q8g62", "1722151737456994816"}, - {"evmos1drvn6mfz826m8kzq6m80687ra6p2afh68fr564", "27814834479460319232"}, - {"evmos1drwgjhcq7s322ay8anx0pymcym3gh73aet6la4", "29523222267748638720"}, - {"evmos1drzk9ygnyra74rwc0n54a8k9m4vqwslj0v5x0f", "75043855289295616"}, - {"evmos1ds2nl6hzjmwk7qjfxg70t9mjf20tllenq9ce4c", "1055548666129035264"}, - {"evmos1ds36rhqm3mhuktgpqwxgzedkpwpt7l2mzxcuug", "6386583393468604416"}, - {"evmos1ds38a9dw5k6hy6z6yr8k9m2rtst782p4dcmha0", "5674742588433614848"}, - {"evmos1ds4ed9nzwcf0kajk40krkr5uunrwnzmylzpdm3", "31689188150565163008"}, - {"evmos1ds5yx7p6mqufhpgphrevnqclkc6tk9qpktuqhk", "701311578764848640"}, - {"evmos1dsd58xp9j8plaxrtn3qmxed4jcqlj4hzqzj0rj", "1274807172018457088"}, - {"evmos1dsezunxef37yeheuypq2jn0yzw2ycez58h7u4g", "1287291354373287936"}, - {"evmos1dsffeuq3rs7wfwklrk0y6jppcqeahn8ws6zzjg", "1734841260569081088"}, - {"evmos1dsflerh4q9z2y9czg9w40m8q5zv8nl8mvc2as6", "459579776916851712"}, - {"evmos1dsghpg3sarjm5jhwc92cksw3kqnrf4682xglft", "78219856239948840960"}, - {"evmos1dsj7uldv6wsqjcpxer4l57rm8900gmn344smk2", "794504448723697408"}, - {"evmos1dsmwve54cwze3gytzhsud04f4c9ulpsw4uh3un", "14039734064534267904"}, - {"evmos1dsrkrxkmymurhqd3mj894f9hz3z02qznfl4kkj", "103388232679424"}, - {"evmos1dsshy24k4mdn04v88pnzpvmwcjchus07lqdn3a", "87853229588891402240"}, - {"evmos1dssj3wzm0nm5h9ga3axwy2szh46ktfz5v6t0rf", "288523153354918400"}, - {"evmos1dssyyn6ytft4f58e4uamzxtgwnxz9kahxzqz3k", "3023906978731997696"}, - {"evmos1dsthq5x75sxmxmrzfldv50q2pnlxnh7wu60e3r", "2014444392460098560"}, - {"evmos1dswhevhcaecp8v9ahlflkktkqwm64tzat39ta7", "11015756273498697728"}, - {"evmos1dswqjrzaus5xf48atuh5g5mfzyepgpt9s03ulc", "4461788744464896000"}, - {"evmos1dsx3f3nuef0fgnewk95wcsvkutzxtqrgkk2n8s", "233683541418692608"}, - {"evmos1dsyyfunn0w6esm3ujh5fenpf9zavgup2p7393z", "340756194699882496"}, - {"evmos1dt398f5w2gvwrrzaqlzd7lsvp7yjchvklvafp4", "152570182213242454016"}, - {"evmos1dt7se70f9xlhc34cku5jxd5hhs3xq7ygrgzsc2", "1281174535019673600"}, - {"evmos1dtchd9kdtz54vuja25tv3rlxnvcvjjadcn80h3", "35878057750589184"}, - {"evmos1dtdxg4xdgk8zxrpxar969wsckz6p7pqlu9c7aa", "437903075181892608"}, - {"evmos1dtene4tlgse0tmz0yyxmntawtlmjfp9f2f9wtg", "2908401914980229120"}, - {"evmos1dtgthxq4hxgr6fn628smlkz3xpnx43ex0pcpty", "6975615174210083840"}, - {"evmos1dthrn7h8ae2z8laf4cjtls366wnay39etn9cdr", "12713217759470716928"}, - {"evmos1dtjjamd3tu3s7kqg7af5l8w8eec5yclrxpc4yx", "1590900384014800896"}, - {"evmos1dtlu29g8vxpaazr3nt2f2tkfv9tzfrgaqgy22z", "2965906555631691776"}, - {"evmos1dtlzmqpqgtn2c43yqp6lraw7gxspmkqxy0cqwk", "818945956005816320"}, - {"evmos1dtpmzcx8cu95nnmzlr0hx4q6t9yzgmttrkts2v", "12330278003338866688"}, - {"evmos1dtvuzx8lav2tkgmkqz8g83rk6228mh8x6xwu92", "102104110648032296960"}, - {"evmos1dtxvze09e7kvwxhyckk06wnxl4gwt575q5vazw", "3746177990417176064"}, - {"evmos1dtz5kdhz6z2835ax97tqhgqzmmu2a0h3vdm060", "10946026575294291968"}, - {"evmos1du29tw0k8yu2t92n493fjv8u7v3eq5mvgtz583", "29007918549514027008"}, - {"evmos1du2zwsamh5mu6mlpdvhxuxlh4jdm0zhryxys6z", "11189792162142734336"}, - {"evmos1du4t8kef3xeykazccypapgcj62t8dtave8akxt", "38417479246715420672"}, - {"evmos1du58sru8ymhz9nkq5lzwcukpwecaavhqckvj69", "10106318014549645312"}, - {"evmos1du7ph3dkvk8q8hmkmgwhxs06phpfwp4m36a8l4", "4174832894686543872"}, - {"evmos1duagl87smf4nafyxptta7dr6qmcuvk7mr039kr", "4374329640519604736"}, - {"evmos1ducryj6ujs2vh0gg2vr8ydeufrx0qecaz3q40n", "17173002884927303680"}, - {"evmos1duer83lflf34z78fkgc4qsus83unk22fust5dd", "6483907309914497024"}, - {"evmos1dug28hm4j6n7xe8mdw7r7mffg0srka7vz6334l", "3439479722175601152"}, - {"evmos1duhsrw6jp6guwmqmla58d445pkvzsemfkc4raf", "610200474116962816"}, - {"evmos1dujnr86gtr04kfs95y9rn7wrw2ahnz6t8tv2rf", "24370012593173569536"}, - {"evmos1duk9pd3j333pq3us0f8xyuavvk9u25khl3r2hg", "11440045979584337920"}, - {"evmos1dukxxgtmkupat80tavhrsys4hwq9s4rh99re36", "208388298495647232"}, - {"evmos1dulj7vuhr2pm75zvmu925ey5cvkvefz0easduj", "1717151514805144320"}, - {"evmos1duma480ddwdw2m7fe00s4t9cnpcmdddj6axlh8", "15877685507068633088"}, - {"evmos1dupmpck3z8spz7vwpzl872axxsz844ur4u3k7d", "11878036274727071744"}, - {"evmos1dupqwrkwc7yjx6kx89rwhk5kc2t9ssq63l9lhp", "14974540917462525952"}, - {"evmos1duqdspnmf7g642afgdr65vhacs2s48ymeuvslx", "258777303151688192"}, - {"evmos1durgtd7vvyx2mygsp3v9yhm2ayan3x6v86scdf", "652218917233901568"}, - {"evmos1duuawy2xraq24jsr3qfcdxt362cz2j20qzsvy5", "15635814896768821248"}, - {"evmos1duw98m8a4ktyrhaya2uwkvtacqzu6n83vvdea2", "1138266184902866944"}, - {"evmos1duxysf2zp9nl0r70zump992843q6775f2tv22y", "8841670645819314176"}, - {"evmos1duy2fs6d4fy03sqrmsx65csa2gd7l2zdy6dzl0", "100147208498913792"}, - {"evmos1duynp8eem0vmgu5c6x2x6ejh7wfke9zx77ju7d", "2469433548051578880"}, - {"evmos1duyul5vq268tvgme2d335j6wnkd49n2j5k3t9a", "4886295322000146432"}, - {"evmos1duzu7gmua30jl9rfkw5e85te8e7fmw6v77ddys", "10128471752364638208"}, - {"evmos1duzz800v9308u5s4lg6p5q9mn8zr88yxq2jr20", "31529293859252051968"}, - {"evmos1dv0p0ylzxasl8z0ej2uv9wdju84ffds2zd4swt", "5691381043278937088"}, - {"evmos1dv50gk3hg9923h6jfqfmsc69eurpg7y62mh6x2", "1482897112435923200"}, - {"evmos1dv5kywqnpc5cq6wdqnk5fk0y5evf295exqmz5u", "1782586201838462976"}, - {"evmos1dv5mf8dpw6q78qfhv9m8apqj9vqsd34yk5kk0d", "3284380933841723904"}, - {"evmos1dvg37vy74rt4p9yz9yqyx753w3sk08vpmtqj4x", "13292063601512439808"}, - {"evmos1dvhfqxskmupmd57cy95xwc0zpgpkuedydltkke", "15040776873037897728"}, - {"evmos1dvhx2yeh4qn86k5cs4xd5gtmd5f47a33ww8qeg", "2215108321612928000"}, - {"evmos1dvj9knvguzyykhuzp4vuyaxm6m29t9hzqugrfp", "1619800930737897472"}, - {"evmos1dvjeujwy7fz00nums4u4824nds3nthqtv9cukd", "12556474710124847104"}, - {"evmos1dvmaeg6tgqjm0xj8zprr6wu2d2f3z88d9meugh", "3861323214597279744"}, - {"evmos1dvn3ck65zuee6hs0rdnpx3sm5wgy48zvrd6z2y", "1665689922578160640"}, - {"evmos1dvqjj8djae4rfg68c7yucdy4u2g2ajtdjhtnl7", "36319068683218538496"}, - {"evmos1dvsmg52gk2sdu6gf39raxsj5yqfpw6calulv60", "44950959430598400"}, - {"evmos1dvvsfzqg3czaywjklzk3ay3syysjnz943q9m7a", "236313098091771392"}, - {"evmos1dvww44sjndxrx3xuw06r2tvyumkpfp5v2dnvep", "3579369941201647104"}, - {"evmos1dvypv28krsf26e59xzpdlead6pwqjurzz79rgt", "876959842278031360"}, - {"evmos1dvzflsf3u8ud0qjyn23ycr9nf4tz7lz4na3tek", "51962450048572416"}, - {"evmos1dvzjhd84u4x7u6x0jefs6e7fk4pg8t8g8k56tz", "1698746090611464192"}, - {"evmos1dvzraluxjn9wt8lkdegqffy8maz5m2v5jg8qdg", "4890528584742877184"}, - {"evmos1dw24t2n69apvxn5ytqx0m0k89vjy23k4r2c5u5", "2405976105624894464"}, - {"evmos1dwdnu6afaxsn938u5d0xrf986fkdez4ujd8agy", "2876862468901806592"}, - {"evmos1dwe87qnmc0e9qctuem97f753sjp2muahvv329w", "987776896365430272"}, - {"evmos1dwec7pfsh7yk8jdejy4qy2p340m7auzcwgv6z3", "24554637117602959360"}, - {"evmos1dwfzfft72pnfxy83r3g904nfyssv3q493td7ff", "751588909282369024"}, - {"evmos1dwh2sel66fmmau3qu9zwt82nja6kwscp555why", "474821874487726848"}, - {"evmos1dwj27ehyd89vujzpj05fwkgrej0r5yxf56ag5s", "3725217376126078976"}, - {"evmos1dwj6zwwdvhmng0rskgs8zxt237jraz7xrf44vc", "16459567424982528"}, - {"evmos1dwm0sw3fe88t9cvdex60ejts329um262wsshtr", "2466132511416713216"}, - {"evmos1dwnpwzsnp3ljw5w6sgcccaurk4hr5q0d35m62z", "6682884888633671680"}, - {"evmos1dwqgm388s472sy7pahce9e570r7g73nut8q8h0", "2289501338344690688"}, - {"evmos1dwvat8dqzr67v6z4wuurrwh0setr8vv82yfp4r", "10671917375659171840"}, - {"evmos1dx2p3dkulathdlh35xku480wmdjcneq3u76qzn", "9872948688639799296"}, - {"evmos1dx4k4ppc2apjdzmyhkv94n83flqnlht9pemldz", "9822871234799818752"}, - {"evmos1dx5z49a2swmf0ap4z34yufmqjx690sazxl755e", "16004121461466955776"}, - {"evmos1dx6x3sl4ey5s03l0djaudwz06tnnt5xt79vdux", "14676438239379054592"}, - {"evmos1dx832lr2qjzpjhntllp5vykjnz8lzmqnmwxxlx", "40738060688762028032"}, - {"evmos1dx8yzu6pgx4324axe8smlhausafysvmtpg46ds", "9136680084019992576"}, - {"evmos1dxcwxlmyfxgtq8y2mchyr2lghm8gsycje3gk0j", "3760394938481224704"}, - {"evmos1dxd2wmqlxefeycrtgst4v3v4wuqhfhcfclkuyf", "1627851432225571328"}, - {"evmos1dxdkznel2t7nm9qhrnyvxf3knr2ghtql45fa8l", "2578239971410478080"}, - {"evmos1dxhuxumgaz7yjyq6fexu9ddln209rc9pnya2xz", "5369618173414699008"}, - {"evmos1dxl0xv9ramc67657xly2u20k8rww8luewf0f03", "677987831708835840"}, - {"evmos1dxle5ej58zy6ud7zg738hxyng9g0g2ve73rq78", "6052625192146632704"}, - {"evmos1dxmfhp2z3j64xgsyrkvxt65m6t0hct32gx25gv", "3176303493515280384"}, - {"evmos1dxmxt65juleghy9zp6sp9s6y3s26kcusgu0z35", "4168353294630586368"}, - {"evmos1dxprdfu2axdqrj98qa78nhc0w3y9ll63dpx2jc", "16304028079685376"}, - {"evmos1dxstjyq6xgmlcclue5p66k7lcw2rnckz3kd32n", "859763765082071040"}, - {"evmos1dxtv0pxd573gg8p6dateeztywavx58v6hvctet", "59349465495372103680"}, - {"evmos1dxw623cvy56k00jvt864ytrgkv9mmnyqamn5la", "1422613443899531264"}, - {"evmos1dxwmt8er6n7f46uacacwk0esapxvtt8376fulv", "2211532649635676160"}, - {"evmos1dxyy6nwnyfq3q8gqgmmjqr2zgs6s4v53nw4z52", "73594317712733184"}, - {"evmos1dxzwlhxlra0d25lurnunre270e45uss05nrdfx", "402720109928979968"}, - {"evmos1dy2zscsfgx7tnhdpegp4hn020t23lyy0374sgz", "286878082065003008"}, - {"evmos1dy68tc8a8220mqxtg473xs6myhqvjdwqhrf9jg", "93990808313703251968"}, - {"evmos1dy6yw964d3jdcjdzhgmzv7sya7k0xnf8nppahm", "30430830863494881280"}, - {"evmos1dy85vwu6jwnv2cjwkrqmph0nt5r80tjl5pgqp2", "2707928834245771264"}, - {"evmos1dy9jx80qrufzucqsd7jgklxkusg4hv4p2hvunh", "128475264136292270080"}, - {"evmos1dy9yck4lf0sxaswt87rut6qa579mk28axtmm2z", "9822466395179794432"}, - {"evmos1dya58vcssrlyhmtnm0k0xsddwe7z2ka4mk4tc6", "16254742889499621376"}, - {"evmos1dya5jddts2wy9klwvxwz5wmg4a5f4e5jckz7kd", "22027312251128381440"}, - {"evmos1dyahc67w6sxph65e53ehsuxk8p9jx9w5859vah", "342344430744469504"}, - {"evmos1dyflkzm6r8ct9pu3mkqsq0zck8w405fvsd35um", "9347745234235392000"}, - {"evmos1dyuw03g7y95w63d2fdzalxx64ne842hjwvzm0d", "206433064290972160"}, - {"evmos1dyv0uv4mpn8m49su24rfnsd4qmksh4zcyl8zw5", "2834350253244207104"}, - {"evmos1dyx6ayechf2ml77kuq8803pdflg7qnlfa29aup", "3317317872844814336"}, - {"evmos1dyx7ez8r5ue48er6f9y936ajghvks4gahhwlc0", "385511682957233920"}, - {"evmos1dyxye942vsnk6dkths47mqvvhfgqkhjgmpmg82", "69270636058867456"}, - {"evmos1dz3889zaukcvjpdr80t2vtml45kcp83uh6xrek", "225637070820822528"}, - {"evmos1dz3x0nvn2pyfznwxrxh8a4f5nmwq97du55tu9d", "2912436639491148800"}, - {"evmos1dz7248cvrjs65l8t69vt73mqyzm3e07ulf3wqy", "3387291738013057536"}, - {"evmos1dz7nhmpdafqd39tsvwrpl9wpgus9t4g6q3l3t2", "384219075070511104"}, - {"evmos1dz7qxfluj859nks9ad46deay3hk9veuk8xydf3", "23758230148709031936"}, - {"evmos1dz7vslhd8mtd74mnr8uhptkvwk00n377jfrhf8", "5402766721269331968"}, - {"evmos1dz8kk94dwqkkr3fscw7j85rgu7zkjzadnc59we", "751339518680312832"}, - {"evmos1dzdj46dufxnps582wwcts0tppdruqdxrmgcl7w", "2452943680104280064"}, - {"evmos1dzgc79gp6re0xwm3ly678duygdw0qarygma79f", "1647190434671129856"}, - {"evmos1dzkgt8vqe4dl94xfcmefkrytcrc9lqaqvkuhmv", "1933253405780020736"}, - {"evmos1dznvyqv7hhrr0vznz90dxr69dthjevq58lhtpn", "21765054497985454080"}, - {"evmos1dzq05hv3hg4y88xh2sndsv24spzkvg4t8rg7qt", "4589355506679291904"}, - {"evmos1dzqt0dttcu3kpftns4ejex8wsghpz6lxzg2sq6", "2249609623696007168"}, - {"evmos1dzt9wvxpde7ejl0xla6hxjt7hrzhugh8zpuazj", "7587435172955608064"}, - {"evmos1dzvtlejuzzagy5cj5kt6dr5ekyapaxx8606qqf", "7224336864405155840"}, - {"evmos1dzzynv73hqewl7z58ayjmuazzhlwzr08xf9eaa", "142113682207196381184"}, - {"evmos1e08pyjdcttfz5ak0nju9hssvl27kqmmsv2fqsv", "792992042233645056"}, - {"evmos1e0ctmcgp7t306l6kcu3cnrs7jqtm5ekpgj67rd", "9524426935713030144"}, - {"evmos1e0cxju4dfsef2tgys4txc84qknk0zxsdfyvvq5", "43162485426349858816"}, - {"evmos1e0d05vwa7lh2wwqtwwer6pxw002u0x5ev4kr65", "2946373546347997696"}, - {"evmos1e0dz5cqgm2my5cdvjv6yz626ewng5u6u5ca6nc", "411263507031182336"}, - {"evmos1e0ec9vnl6lh4w202x59x3ezts05fw4hhs382x5", "4141237459325945856"}, - {"evmos1e0elkz65rktuktstrtynxxl3cavg8r3en6k70v", "386944896669301760"}, - {"evmos1e0f806xvc7km53cehmt4xgn300l4mqqjqxn25x", "384312444528233984"}, - {"evmos1e0gwhzs2jwe59u72rsuz8r0ykj4ptm4c4f6q0s", "50902994410460815360"}, - {"evmos1e0jyc5hswkjlql2lu6s2ecca88zkux87lzhlg7", "6123613945986945024"}, - {"evmos1e0ktn4lq56st0hkry0d6df3nvqd2dvnue0utry", "2692084771602972672"}, - {"evmos1e0m7ltnknqgs9cxvffyhu9awkrfu0wt4esf2wl", "57068422564546560"}, - {"evmos1e0mgsqv54msat0rt8c3nyczvdws5e0pjnwe3z0", "187729169866857984"}, - {"evmos1e0nyg5nk9z4j4lqwlt7thxm7jnxa207qqxrdur", "121739710185188753408"}, - {"evmos1e0p0c8pc9mttm62qwj03wah7ya7kzfx93uy5h3", "2281859336463343616"}, - {"evmos1e0plfg475phrsvrlzw8gwppeva0zk5ygzudn3r", "116195975837823172608"}, - {"evmos1e0ttphhynm4g3ge58l6wtgjzxkrtfswk47n8e3", "3270608505473335296"}, - {"evmos1e0tttykj2f22lkkg3nua9l794q2kftvsh0tw4a", "92499445015601408"}, - {"evmos1e0wgdr79np4jee3cj9gdrlj87rgp9zualgwegg", "76405221731306340352"}, - {"evmos1e0yt6sedcscyu53cjqjvwuhtmm8chywwn5accd", "709196999566119936"}, - {"evmos1e20qe5ndk7f7qhnf38pwj5qpsva4km75k0na7q", "13068498922580084736"}, - {"evmos1e25juvvfgxf6uxv0ww75x0wfrnsgwru7je6gy0", "7199908948621997056"}, - {"evmos1e28v9wulqafh8t8sly3cnd0z7gygyz5sps5u7w", "2752782123066245120"}, - {"evmos1e2a6psl0n3tz9md46jxkcqy350tsmv59nvct9m", "4256419817629925376"}, - {"evmos1e2gv7pe56mx0tm6ja8kq552eyxn86cqn0yqj3r", "14822124021061840896"}, - {"evmos1e2ln3hk6sva8heks5l8qazwa6ku8xrj24mcusx", "2876917795155551232"}, - {"evmos1e2nr09l8pukvf5dvgcr5eq8zluxp6hpllgx6jc", "3879024943737125888"}, - {"evmos1e2r4wv7cqvyynl0rucajknxmgrykhsgdlv4rt6", "1192231810272148992"}, - {"evmos1e2sv5gxlux9zcc6308l8apfkt6yvhkysy67h4d", "1862748681996255232"}, - {"evmos1e2vphkck64g396yz55tup8nwy83eyd7x7skvzk", "3321379697158529024"}, - {"evmos1e2wrscvt9epnhft6ytftt0qywzrd9sqejf2tf2", "760252277866867584"}, - {"evmos1e2z4acfvxyj405z7l5l62jcadrfyzdqyhkd35h", "378845232251343360"}, - {"evmos1e2zwnkm0n5lh7znva3230wcnhex0j423pwmezh", "89383752720856088576"}, - {"evmos1e30y06mef0053qfkyx2d8s6j62sjhf48dpcj74", "70483086948620288"}, - {"evmos1e32r8p85f9ddmhzqt9cv2r90hvfru54f95g4jm", "4610736107829442560"}, - {"evmos1e34m0ezdq3v4fv52n632zeyau9jr6tgjdagnn4", "8203963211099371520"}, - {"evmos1e36vg9nhayuvhnkjnxrvqedpnztl6zu9cv0mcx", "4112893916479736320"}, - {"evmos1e37ld9glxlcqvtu3vsrpdy22levctfkr5w9xku", "1433153524223877120"}, - {"evmos1e38nxcdpz6upqnfqrynz3r4eezxxdlf64fnxjq", "2685027170014486528"}, - {"evmos1e3cf3k4cl5exaj4rv9pju8s7geqldfnalu0lll", "407791241178093568"}, - {"evmos1e3ee4ndv5apt4rc6vl72u2499qfhu9nzmssvn0", "19592046721723383808"}, - {"evmos1e3fdjdju7r73lvz59ah8cz78348km5ctzg099g", "162155894786131968"}, - {"evmos1e3g23ss4taeukqvehtjm7da6ksz9yjx9gpqxj6", "3691069126092892160"}, - {"evmos1e3k0830q9dg7naza29c2keqt6apufla4zpdgrr", "413280910501344256"}, - {"evmos1e3recx0p6zaxzr4cltnesj0qxh782235vc9vey", "315575615105558272"}, - {"evmos1e3vddvx5zwjkvgvqd03cfn9eydjwhfhp8fjl0p", "3447268884933115904"}, - {"evmos1e3x79w052flls96s67x8plne9r6suzmssjsfeu", "4890961621950480384"}, - {"evmos1e3xp7ax42jl3nnsdu2455q9xy9kpzf709zsswm", "1804379380032290816"}, - {"evmos1e3z46l8haq8rv8c8x3z8hrdh5qlurlyefv8q0k", "5177022392897912832"}, - {"evmos1e3zam9e95jh8szx3qevkh2308dep6e06qapu2g", "4524909125126254592"}, - {"evmos1e42f3mgfny86eexd3j46g2y2fsq05wyvm6nj0z", "2230730001855246080"}, - {"evmos1e42krvd72hql5ja6gayerxsryx2f0dh09asgl4", "3083470925919260672"}, - {"evmos1e443afls2erzh5l9r7ztqp4m27nsday767hf98", "3020283095353933824"}, - {"evmos1e44aezax50hjp528p0hnqyxtc23np2cn30j6la", "1310475841128760320"}, - {"evmos1e46ghzp79unudxjwls5tgwlyy8hdjskye0zgu8", "1912651276065742848"}, - {"evmos1e49k49wt5g3r3ltcl9rgmn9fj98tjxsy2l4npw", "314851855197061376"}, - {"evmos1e4ags0wrum2sm9vtcjgfka45rg6dlvyn68wg6x", "20370186907470520320"}, - {"evmos1e4elfj3zelgc22020pw9tz7xzmjunkedzlvf7v", "11862725312677543936"}, - {"evmos1e4eny842glfusfegwarmp0exa259g477tppnv6", "215091980918497536"}, - {"evmos1e4gdhpx75wd62y6krny0wqcdsz64jh83qacvzg", "13196323342654308352"}, - {"evmos1e4gv6u9y4qxuqjhg2u6rjyj5n6f0yzsgfm4f7w", "394811991090804736"}, - {"evmos1e4mg6xjxgavfu9pqdxz0lrdnq2gjcewxdrjlc3", "30440572510750244864"}, - {"evmos1e4mkez777vpggehjstce9z0fvgeavgrhexkk5p", "1587278905064623104"}, - {"evmos1e4r8uzp0msltexzm268zajgk7kmlfryyzc3fwv", "806256376467325440"}, - {"evmos1e4rze2l8syut7qj3x3xz9v5s9nprp87w8rgkel", "51451122876931584"}, - {"evmos1e4sr2mtkx92uu4x940nzksasajq0mp0qxt4d9v", "84429646384059136"}, - {"evmos1e4st9guu05pa7vt46tgelrwamentf67mf989nu", "3351557104111298048"}, - {"evmos1e4tuec7pnrhqnmln4tjeh55y0gf39rmacxwu52", "3063709212114944"}, - {"evmos1e4up8vufhd053nxqwanp9h4eq269dn20lep9gf", "773319535582861312"}, - {"evmos1e52fw7f5lhlmwcl6c9kum6jx7wmg4au83x2vpt", "7403582716177213440"}, - {"evmos1e52kryt8u4tsr800qtl6nkrjjyucswnz40pyl9", "7001269797722121216"}, - {"evmos1e52ws30tu3ug4fy5t7e6wlr3gy709dqs6aecxj", "17877816921603348480"}, - {"evmos1e56j25xes40qmw34ma246m2tk5j70w885k5swe", "6456454581944872960"}, - {"evmos1e58d7t7x8zwgry5shv2dmdjdtjskkzu9plvsw7", "930967002669965312"}, - {"evmos1e58yt7dhneee0kjgj0nghr02lsza5af66udpk5", "3464472343125938688"}, - {"evmos1e5a7rlhzv3ucura82d02wz922sx6hvvkxewfyt", "13829600734596907008"}, - {"evmos1e5agep2p3gh8j8f7xtlsq9tt7ltmphtd28dwv7", "6641218361771476992"}, - {"evmos1e5dc8s7eal0p4zgkz0tkraze4pr9xn25d3gx3q", "15564001581085831168"}, - {"evmos1e5drsmc0sgzkwyk9w3pf7fgsyfedtehc7mutlp", "12601786520943140864"}, - {"evmos1e5dxdyadha0pn39ahthx6dcwxa8z5q4sqctcjh", "19297365356179968"}, - {"evmos1e5dy9d5njg6eel6dv0j28arw7zkd94en0mgkpj", "8185333270469525504"}, - {"evmos1e5e7tpju5zs20nva09e93ma4u8sshpdp8j7cd6", "4866318087146207232"}, - {"evmos1e5ftzg956wml4fpvrzf7f9znvef25j5m9xdxxn", "2377748298542916608"}, - {"evmos1e5ga7ak69n6s42f9hu54hc2pfcex7x5dupzla3", "10021217059720286208"}, - {"evmos1e5h7j9u796esy52lyrkv4cz2cucjdrydurmzx2", "700427285912402048"}, - {"evmos1e5j5jgxhax8aam7pfxj277szqu35a2w6jmjcdf", "766138381591605248"}, - {"evmos1e5lg2xfhvj202vmp4805ewkl5k4ww27nmdc63r", "36109904946418647040"}, - {"evmos1e5ljrzdq0hex9e6jxnrrktz3cstcje0z5tyday", "4712745972024676352"}, - {"evmos1e5m76dgchp59l28s4tx3lvxgmwwjyqhufg3lvr", "40572649213980672"}, - {"evmos1e5mc9fc76msyqvtf7vln8u033fw9uf9gzu78gp", "6468364058156580864"}, - {"evmos1e5ndduzu8ct03mp6jq3h4004fatm5kwfgdq6su", "571127888504696832"}, - {"evmos1e5ry7yprm92435ypfa7dhn60r7m02qtawkarjm", "3723125026904983552"}, - {"evmos1e5sae0cll5qqp84tweq3s88t5satlajgpe64ht", "72048171773922048"}, - {"evmos1e5ufea8se4dnc0cdzq7gnqye49vnzefgy0q5fe", "378196365684103936"}, - {"evmos1e5zunvclk88lldl6fzv2hgcvnkzvesvwtdvxgu", "122638489217558577152"}, - {"evmos1e60qkt40ep5tuaary8yerq9spefnnzuvrydu37", "205862520456406528"}, - {"evmos1e628c29nn4nwn5juqhmxd330rnqra3sydyc59k", "1522065849816605952"}, - {"evmos1e634mnmp5s9dsluym8n9azp6p78ue0np8ct80g", "474794421793697536"}, - {"evmos1e645yz9vedxwf54r32hvr6y9pmtnp6ltzk5hfl", "100044730123631104"}, - {"evmos1e64ds6zgmsgcxdae0mt6pld6xmdx7q753dzv5a", "173832563774339072"}, - {"evmos1e66cdvs0jl6uu00h2gjm20mzlcrpcjuhngmj2s", "243382462293107712"}, - {"evmos1e66zgv8apvw7tgj35tp7zazwx5suttsuzxqvem", "875021083552602112"}, - {"evmos1e67s75ap24nv0hs3ywz05mlauwmyl4sug2fc3d", "613820968984158208"}, - {"evmos1e67ykzelu6yh9wuqdt6p2guv3x0j6j9uh5uhm6", "786024326874599424"}, - {"evmos1e69c3d4tph58aqx3n0lrmpc38lfrpf374g32f6", "65321045824005888"}, - {"evmos1e69zezev9y39emjlgcuq60hchqu4e8fl7pjfzg", "474745221678736384"}, - {"evmos1e6ay74uerg3lqg3fyje3s0ljv6eyp04q80zmkw", "1643362459983651840"}, - {"evmos1e6c7ad9pjpauh4j0a0qfgeqvk0zypklmsszf9d", "511819263305798656"}, - {"evmos1e6cdsm58yrnsxukcrj63ufuk9rg8uptfaxdn5s", "1463170117367984896"}, - {"evmos1e6cehkqr4gczclejslx2rquu6gk24u0n3hp0gk", "736005102311138816"}, - {"evmos1e6ddrh967sw58swk0vxl0q4xlemnt7cjw9hhgn", "793127494731423744"}, - {"evmos1e6djenw9qljdsm97c0hl4z2xf2k7supgzyug3e", "1959730048967137536"}, - {"evmos1e6eqj684dtzlff5urw85vkqrnj43js6u4g6p73", "1152325339736758272"}, - {"evmos1e6g0995nr3dr7a2e402y6wdk9xe6j2dsll4rcw", "2370552007012655104"}, - {"evmos1e6ltmckcj42cdp6yx07qu8k4hxsucgcf8h3v3k", "21441151638541492224"}, - {"evmos1e6n2pg5ajwd8qwjntaf6vxc3mkqs5pacj20m5r", "737990010297188864"}, - {"evmos1e6n9rejq85zclux0rd7939vdcaq45n3cxh5gqd", "1419998890826383360"}, - {"evmos1e6nep33sylpws3y4s3wjpvt4gjpet5tnm5gn3y", "3633309504237764608"}, - {"evmos1e6qhzqhf0jcwfl6h6c3smk056gp9emcw60kvwm", "34471086775967318016"}, - {"evmos1e6r47z5mvsqdjpxf3anu79zkrkemc8v08p8ynx", "3915628783529022464"}, - {"evmos1e6s9c67rhc3alsllrnrp9hulwjv4nursl68ksq", "803519363720892928"}, - {"evmos1e6t2wgfmpmyqmaut85a05yzaxgzrsmwqv97zvq", "82890050089642246144"}, - {"evmos1e6ue9e0g93ccfy0hwc5e6nl8whvjzs28zhhhr8", "1668165328952419328"}, - {"evmos1e6uh8plg834x7lvydw6a326davk3d04utw000n", "322863095887873280"}, - {"evmos1e6vqjduujrfuwkd39qj8uxaf6en67xyea2rfyp", "3754026833210605568"}, - {"evmos1e6wkt43xr2hprg2ud30dr67xg7kvndxc4uujzw", "14870799852911890432"}, - {"evmos1e6wl54v4ks7d0qqd4smg86lyqejcy653vdn0ts", "1315294811439733760"}, - {"evmos1e6z848x8sqf52ftjts3w8v57g5ksxxkupy8zf2", "36670809558867443712"}, - {"evmos1e707qrqfgl0cn20k82847tngngpql3dz9nujla", "2863622475047322624"}, - {"evmos1e70gc3lz7h2mf9ejc3rglehlyeqc5dteh976sd", "1000474177545737984"}, - {"evmos1e76xgkzjg84t8m9njgq3vj9gaq5mj50dzj44zm", "9319101390166663168"}, - {"evmos1e783lqk4jwdep408426j3tdhuew729nffw55as", "5304547256131174400"}, - {"evmos1e7av9x6qjmp2cudkmgdhr7fkf3kjt2lg9dnkud", "1967362152296928256"}, - {"evmos1e7cwrl383vfag83cluxxt0qhekx9laz85gvwxl", "1083895098122588160"}, - {"evmos1e7dw8rg4sz3dt4e0s5ypjyt5s9vlttvwt6dugr", "58411109127653376"}, - {"evmos1e7eg2gr5wm9tcu8taxdzlrhvk32xp5n6lydw24", "1646510920785986048"}, - {"evmos1e7f7wzqcx89zetxs98cu9xfg7pux00tapg8ync", "1237778194866489856"}, - {"evmos1e7g3zc7vz8a6s9qsyuy9jlh9csgzuhphtyqg72", "1073409227537761280"}, - {"evmos1e7jsmxavzv0dvk3yut7d7x089n4s29efxnhjy6", "14256298248342077440"}, - {"evmos1e7k206ye3jv9jmv8pnfkr2upugeu04kcvmq0ge", "11146783352798208"}, - {"evmos1e7ktdf8h5cay57z52nsx0gka254wdy2ke0ftxd", "5418202462450977792"}, - {"evmos1e7mrkewn4vqeldqjguhy8nlm89hvh04wypeasy", "446474936698058752"}, - {"evmos1e7qtper7n6ec8y0sh3qpwgrr6cun5ghf8kg8n4", "1235329245673030144"}, - {"evmos1e7rjljkg5vjeyqel94r2e22qfkncupk4qjfya9", "101025951944881664"}, - {"evmos1e7srveqarfnct5xxa62df63829046g2eqnq9fs", "3965936339393888256"}, - {"evmos1e7tqy8c7hmwykaergavrxga3jnra2hdqvh9x7f", "19855149645100236800"}, - {"evmos1e7ugfkc3nn4m5a0p6ldpyttajpxpegefsrxzzu", "452680753366650880"}, - {"evmos1e7uwyzzlc66vvmret2dh2jnehsvlr4873c9lk4", "65530756332816384"}, - {"evmos1e7vqys3s4jnanzfjp5aagtahtr9yl6vjnj4rsp", "27132539918633693184"}, - {"evmos1e7yr73m7d3a6s7a2zvfdw0c6g6n6tdhz8e66l8", "24844425707197173760"}, - {"evmos1e80pc0dzygcwt0lfhqh5xuakzj63rujhzzqwlz", "3420047533026779136"}, - {"evmos1e844upxsd8a00lvn2kkzq08k7pw4d3y40y9vg2", "971837358564084736"}, - {"evmos1e85hnn2uvg086sr3khn70pg889fcnc8l9lmjsy", "384558247478283264"}, - {"evmos1e86gsajlx6c54w5lagdhnm4acmpzhra4gtwtrk", "1300443088308282880"}, - {"evmos1e8hcrk9ggk5yuhd42h2vsrmy0mcvan4pet43h9", "745571453685945335808"}, - {"evmos1e8kyx5l2n20wzj9kuc5gwsenjlvy505r98y6k9", "515354570165939712"}, - {"evmos1e8ndfnvfxcsrcft7uepx693f9s7txkzv5g4rqr", "8512526231632992256"}, - {"evmos1e8nrjpavqqp75t8r0wdznj9h36vrperukmcpq6", "11723753836006664192"}, - {"evmos1e8s4lcns6c963kez5k9w2qvww67yvssq3j7umt", "16614614905498302464"}, - {"evmos1e8s9e89gepvye30pc7efwsncwd3gd9mn46ca30", "525534347400782848"}, - {"evmos1e8sa6nde6xe3zhnylye05tdessmf40gc0kenxf", "2850738123971166208"}, - {"evmos1e8sfz3xkvh8tefz3ntaneav0xcr5ymmu9lua4t", "533704011152525312"}, - {"evmos1e8stvafdhj8hkmny7grq24uf8lt03nfnn4sy4d", "5626787310857432064"}, - {"evmos1e8t7da9pnkpnwzcxr2j3wvyx76x43gfuvds97s", "22062990197277114368"}, - {"evmos1e8wj93lfj7rx9vp0fcqcfzzgmxcga7xfj3tp8m", "1093250374669336576"}, - {"evmos1e8xcm4r99ns8lxcux6qljctcwrvf75yczw2nj7", "21086960213676118016"}, - {"evmos1e8xsj0rhg2zt8gp9rvww57v6q9ny4ulum3deew", "3213970908192122880"}, - {"evmos1e8xvq2em86qn0ccl2ey5588wce0axalnne73x9", "702570485061122560"}, - {"evmos1e93h5rku5qex2glrra902dkwe5sdgh76pxt83r", "5121935723988553728"}, - {"evmos1e94c8sfw675lu02ngulyv5he9vteteygvxfc02", "2472639483912478720"}, - {"evmos1e97sm05l7s7kvdakz9c33eqq3jah0q0aqeq0zk", "9599352380421640192"}, - {"evmos1e9akl8drf09960ra2p0ywk7jtde74ttwpjjeea", "3866322403820790784"}, - {"evmos1e9au2vf6kt27m3fwwdms2fcr8xuz7rsx0pwxcz", "2361161927623718912"}, - {"evmos1e9elkg3e04vgwdsq307c7gc00zfdjxz3yce79u", "316097289592915968"}, - {"evmos1e9fpsxdfmc96w85q9gprqnwrc4t67f2fnvj4xl", "13202729236002816"}, - {"evmos1e9jqrwsml9q74lfcsc5drk4rz9ep252gxahhhr", "1256062154475683840"}, - {"evmos1e9jyeh6c04chp4c853xwr8etaurrhsu7k77ne7", "134205510160179968"}, - {"evmos1e9kudxft6xmjut8hdhhdt3mvrmcgrjtet4dqsk", "1806338460915253248"}, - {"evmos1e9nncmth2er92ss6nv368lftjcrtemptetcmzn", "13833442037718040576"}, - {"evmos1e9p2w30csx6c3ydg20v2gytjkv9hy6t85nr367", "420160552091339776"}, - {"evmos1e9radxpd75es087ekdyp0qj4lqyu7200m92mkz", "15751506122279819264"}, - {"evmos1e9t08rv948sf738lyaym9mlqg3j6pccsjlc57t", "16797957554856345600"}, - {"evmos1e9v4kl2nhu0ukf66e2pswx0h567jfa3pp4mh4n", "1494570474862673920"}, - {"evmos1e9w9vuew4emnz9uqyg44dt85p66rr3767fku60", "761226459301319168"}, - {"evmos1e9y39j3mlzqct3k3gmp8uvsrcuapqlw799xe6a", "60946663584979861504"}, - {"evmos1ea2hxesc8tddyg2qaf97690s4xjz25hsxscanr", "384528586655688704"}, - {"evmos1ea3lxgt9lgphxqknn6t4vz90aqa56k8anf0hk6", "1293183788606676992"}, - {"evmos1ea482g4spqcw6w6fuy5uufkfkqut8ss9sjy0gj", "7350192363173732352"}, - {"evmos1ea88q9vzc2a3wtnl398z7mhvtqtrwfknkcs83w", "5757063661230040064"}, - {"evmos1eac0r4f95wqzm7y9m49n29m8xpsgw2d5htz2vu", "16324244310188240896"}, - {"evmos1eaet0jpmfudusmupaq27q9mezqj2tdlavl3qml", "369509985861360896"}, - {"evmos1eahd2zdjxzkntgkm9mruhlz7d4dqm2e950nmnh", "76901627944788992"}, - {"evmos1eak575nga3urpcchu475quk094p7f832fvls02", "703856177281566720"}, - {"evmos1eam4f7kp7y4wapwxaaqgtegs4swjx6zh04dpw8", "26991419814116790272"}, - {"evmos1eap7nghea4ypph5f4cyd3pz9mrx0vw43x32r72", "2499798934038699008"}, - {"evmos1eapz9493nspu7shglpn5wl5gu568zxt4qjav5s", "45781985295487205376"}, - {"evmos1eaq3p72zym2dqrrhtr5zn8tg7a20dm6n7hxr98", "3214349048072572928"}, - {"evmos1eaqfsxxxak02lf4cunf3q6d35a3wm5n8ugy5ec", "364847344239587328"}, - {"evmos1eardpej7lyxxzlcvm5k8sxzwvpajpazcschpnk", "4957505270074566656"}, - {"evmos1earzexv7ts2fk3grulengeja2z04lhagpjga46", "2904134487073308672"}, - {"evmos1eauv36akz0v8tgvsy7gq5slkw2u67csdms2m9d", "177804089702902784"}, - {"evmos1ec067avdzhpw5tt72jyw3a6hd3lusy78usr9v5", "402200840298718464"}, - {"evmos1ec5g80x5jh30vnxjgz5p390frf7kckch4rc0e4", "599097110413560832"}, - {"evmos1ec7lcgujmq0uykzhgw36stg69ltuq7er32sfn3", "215822669073707008"}, - {"evmos1ecae6hklmayz6kwmm3zfdlk5njc2vu43hlgetx", "70058741101398212608"}, - {"evmos1eccxuzvu0tm6ftzz0ep93e5tu4xde47vedymht", "1530948094693052160"}, - {"evmos1ecdjv4pwjp7k4n96wv05czeh8yz9dfmwzrqj5p", "2190473123208364032"}, - {"evmos1ecfdlw397gfjcdzuqhn8ey3c20x20taq8a40l6", "421839463416953600"}, - {"evmos1ecfytczyxwmrac0ywutkeurjq66p8e6d6zkfe3", "99225540179351552"}, - {"evmos1echuc22hd6j5uknjh6dwkndx6cescrctmn0r2d", "12188340060242911232"}, - {"evmos1eckg3hju8whqw0qtrcpcd90x7pawjqspdmshw9", "2992807845450191872"}, - {"evmos1ecn0tuwcdh4nldzgeczzhfjfwjhux7ruafxzxp", "8440983946689445888"}, - {"evmos1ecnvy2hys5az207l6m9vnummm7kkx7vw8s2erf", "31297997088932096"}, - {"evmos1ecp8kay09xmsf3n3pgdvkg90acwjgulga6hzsw", "68213650048361984"}, - {"evmos1ecpfvvt2njpdg25fkrhp5phnh37thhh7gz4rk8", "5099332896716763136"}, - {"evmos1ecq9evvef3vmuwkveyyudhfzxuge6wvaufe2s7", "372041936597300224"}, - {"evmos1ecsqef3zefujvzmnj7yte54ssnzcpd2z4v5utj", "843000022983624960"}, - {"evmos1ecstttc9s6x36wdxt7j8as59qec526r2uwkwn8", "175858208188383232"}, - {"evmos1ecxk5c2sxgz2cy5tzj3f8jlg0l6wk8wph70ze2", "24339753994201079808"}, - {"evmos1ecz0k20e3apx77ap95vn7h6zewexle4n3susqt", "18734412436943298560"}, - {"evmos1ed2pp72e3uyml0et282hun3xlr6f38llmzx6wm", "13946751489153662976"}, - {"evmos1ed2yv52kvepsajh53dcczcdtlusyr9mdf2whae", "6883543346201952256"}, - {"evmos1ed39gftzkk7ulnum2pqkt5uyqczpg6kgdc50v0", "1702842230384275456"}, - {"evmos1ed7ryr9j7fmmv7kuf8958f6rr62ymzd97xqpsg", "2970417851041382400"}, - {"evmos1ed8epyasm3jfq9ldq4seug3vzzz95qzfyny9sc", "644808168679096320"}, - {"evmos1edda48xx20s4ywy0ejmfeg5dl7ms4zmecx5cch", "3941094163647168512"}, - {"evmos1edhqd3rklx5vk0ykmmnglktdwpaeppnda92luv", "98880872249574656"}, - {"evmos1edkavm0e9vxdg44elyrtzu64r73g0swzzpan4y", "14614163812826419200"}, - {"evmos1edlmsl97qlst9ryxxaklt6cmztk804u8yah2jx", "368929410986807552"}, - {"evmos1edlpsmaz0qu835kejd7kv79tjeptqps4g67aem", "387389358476130816"}, - {"evmos1edn6pll2d28catw83zdvgnwxa2l9tymkxgqx3t", "3782562924254175232"}, - {"evmos1edpy6he3yvf43jss9e3dveudgh0acj6vvfgfvh", "55144083038064640"}, - {"evmos1edq68mp3v4m4uhhg6uf89sr8dadfyzmmpsk2m0", "21049389476428800"}, - {"evmos1edwvrf3u763uw952c9anf9hwmjmlsqe32c8aqv", "384129847049969408"}, - {"evmos1edyl223wzrstrq2dwla9hlvmhknm5pyr4cur2c", "1109020193256612480"}, - {"evmos1edyz8rg0vkykfwpvnnc6yxs7sj6cfjjfsxzeer", "8813529729238163456"}, - {"evmos1ee0qxahsk3t3vqesc499xgy072ya5h37fj6pv7", "579871407056021504"}, - {"evmos1ee0yr4slz65t5c96n64v4fxx3nhgu8wqqjpuf0", "4196075485314482176"}, - {"evmos1ee37dkjeul42et6808r5nk2lgee6delm3c44jx", "472743923968244480"}, - {"evmos1ee69sslesl42tqjl84jj8wt6je0zl3wjhsxq9l", "947248707467575296"}, - {"evmos1ee9h0x4yqu35a62sdyd59a2twzmjtvulwxjkg3", "2835763461828417536"}, - {"evmos1ee9ngek2aaetvnh276jnlurpwzwd0wa229urhc", "764629787530035712"}, - {"evmos1eea29p73vs77r9xxtcj7jkd3g9v27n89xwt4p6", "1965196996786617344"}, - {"evmos1eeavl078e2cj7re0cqm4nqmw6zhsl3pekwu9lw", "1227597777179734016"}, - {"evmos1eec42mnzgsetwtrlp9r4d8yz06v0p9kcshyraj", "385967177163980544"}, - {"evmos1eec8fp0nvedwde3sqcd57wklf5mex8vgm8sp7c", "7604131972054246400"}, - {"evmos1eeefc2zxp6afcfsr5xksl73nlhaq3fjk62v8hv", "1390979183828922368"}, - {"evmos1eehuyt7ch888f0dkh65f98squx5hc6kzf44esv", "8335129313281474560"}, - {"evmos1eejw4ygmy9p7f0an52wavd3qsq2nyhmsvanppj", "960432396977664"}, - {"evmos1eekdqnm0v6rgtnmvlew9yt6k3g4tzqxkwsunaj", "1485365270345112576"}, - {"evmos1eemgssk7vh0v9q4g06crh7ah09grdnyemn47ea", "163699189389085184"}, - {"evmos1een3jahv2wrvgre6dg8neqkslqkc34qejmrmft", "14183800050173431808"}, - {"evmos1eepfnscfmvcak98qwvrzjulye9n7yct7ft4kyt", "821486268696087552"}, - {"evmos1eepr207kvzt6n2rcshapuek8pss2pmnqw0u5e6", "2442525558552934400"}, - {"evmos1eesm05ydyuevdwn6u4fkjdczxgx6t9cxd2l6mg", "5523130726217863168"}, - {"evmos1eesssunv8mc84rdy9w77re6e5gl4a4dmaeqjp8", "35654597098174464"}, - {"evmos1eetjf3xdleeevqc5hthyahtg3z35mrk0q4hqw6", "369455559495722240"}, - {"evmos1eewlh5qzkds8lje5s04yjufg6zr47ruukzltjy", "28154115175540920320"}, - {"evmos1eeytk72cy5a9arh6zjm8w5c44khqjdmtj8wux8", "27489772672667189248"}, - {"evmos1eeyuhv90xm2vwksqp4gq09lh668rmhg7ahd3ww", "5424471444648099840"}, - {"evmos1ef6amrqd09752c28a7dreh2d0yhn5vtf8zxg4v", "4993876543188705280"}, - {"evmos1ef7d82h6pffnnqcjzjy7z3avm92t7f9dxsv8md", "476804993004322304"}, - {"evmos1ef7rqre6tv4rh4zgf4wt05hpgnv92j4c00upe5", "87516468668295331840"}, - {"evmos1efck47wvssxlgk4qg0q25utu5hulym0j4yvql8", "10304731587609571328"}, - {"evmos1efdthweucaz37g0e3nvr6amve25qjsgpdhxgdm", "1174331861146861568"}, - {"evmos1efeup4twf8sm5c5aal8lqp6fwccv8kfx80xw44", "10642934492365965312"}, - {"evmos1efjdneewcxygzxh5n4lednjnsf0r9k4u2fz3am", "6286529816816128000"}, - {"evmos1efjflvxmdqrw4tazfw24ma207ynckzaardxv95", "2210507717774802944"}, - {"evmos1efkd4nsjjqk2al4ehcyh9emhvrx3ngldnf2xh5", "234843704047027968"}, - {"evmos1efmjfamun2j95l8fyhtcjsulhwnhvd7zg2e6wq", "119818048183316381696"}, - {"evmos1efmsnm4d38lw5tmvldl28jzgrfea4xm2wpd70c", "554271577466470400"}, - {"evmos1efr6phcfflfumrytmfdkjl4kcjdcc7gm9l0zw8", "11428768869613793280"}, - {"evmos1efrdlkk8e607rzs5qjxpxcpzhde0gv6l5m5rge", "796165979337028352"}, - {"evmos1efuvyjxp3kqg00fhct3f43m9feal67t6r92lne", "10912903176357754880"}, - {"evmos1efuxakydu2dkstpzr6wj4hmc35pzr43jtp7265", "4999625003159339008"}, - {"evmos1efyzyvcwz0g9d0ruup62rp2jynnrn0matwe09k", "8183225646519549952"}, - {"evmos1eg2eatlg5m2jsng8430p7j8tty2ups52p3ac48", "1192666991562514432"}, - {"evmos1eg6yz78lf46qcu38l979v46ufpuaxe5umqaynm", "5585301374944699392"}, - {"evmos1eg8g74t74x8e2qpf5swhfutd6any3v03tyxtkg", "1076679855347694080"}, - {"evmos1eggext7qv076q3dmu8lmpa6jd3f2rjtqttwuju", "20991808243500941312"}, - {"evmos1eggrnmrratf5ny8k4yudmkyk0t6vuxd37vkrau", "387089355178766592"}, - {"evmos1egh2tdj8gham6vee80nudj6y570sx7j7uvdqg8", "2999901229178363904"}, - {"evmos1eghszfteqnazzpymtht5vdvjrjnywjh3gs4t67", "1147680301181540352"}, - {"evmos1egjwy78895k2dwa46gl25hudr59us3fcqgzdac", "7107611865415553024"}, - {"evmos1eglp9jrhuak4408w4qplaehm75dhxhx9vjy2ts", "3141738950000291840"}, - {"evmos1egma9xp9xhsm7nsndz6hlqezc6ftp240yyfjst", "657085053352834560"}, - {"evmos1egmfkawxcnft66um9f5sh4hlwkd2k2xqp0wjkj", "10383117332231827456"}, - {"evmos1egp8lcp07wh23kuf46u2k2japr8w8hdch4a53n", "358145010010959872"}, - {"evmos1egq84ju73exu0t8ugss5g70mla5jezcrd6suk7", "385790795181429504"}, - {"evmos1egqgezwshg3hw6mzrayhy6gx9teyvyffmwljsj", "1004125918902902784"}, - {"evmos1egudqp4n3mj5dukc96wajqh4flrdke442fuevp", "31481710692728336384"}, - {"evmos1egue4gk9c79eedyf46tcv7kmtlsvjx49hafxvm", "1420980978665070592"}, - {"evmos1egwr6lwmna05q37q06tfda973j7cx8pr4k4439", "443906424305068544"}, - {"evmos1egx40ec9tzs0pggj4la4e0k5ekyf5r2pcmuqmr", "36127554331472224256"}, - {"evmos1eh0psdxkj9rrppyupenugq0n4v7d63qjmprn7a", "10318446641621248"}, - {"evmos1eh2rnpdglukysksz0x7cz0wr80g6t0smk3ae4p", "28354452144101605376"}, - {"evmos1eh394jnjwu5ckvl2k054f6dfgu9nxs4fsjlckg", "20463990943132192768"}, - {"evmos1eh50zm7ezfvpjrz2kuu9u59l2smf0mk9fhfn09", "988326980756713984"}, - {"evmos1ehapszwzccawtrer5seltcqzd35we55cksduuy", "1524573648574029824"}, - {"evmos1ehg7nhm8gkagqapz9v23jm33g5g4vt0xn3t4yq", "1991161029013837824"}, - {"evmos1ehgr75ctxpr07c4a6slga0zm5gdtw6g3epgguc", "465588308363397376"}, - {"evmos1ehhm9aq98tn9fkavke7n53yjpcumh7ckcyefc5", "4143315240238874624"}, - {"evmos1ehljdm38veqez9hw803m9mde507yhq8ztxxjpg", "44025962953495060480"}, - {"evmos1ehntktgzjv63n8seappyr29tpvg76fr3jnd788", "53800135046140772352"}, - {"evmos1ehqe65ln2qxeptkzz5z4mcnajfttjqxnhhps9k", "999196967823552512"}, - {"evmos1ehrm4xferua70ewupeyueqmpk5muls5m2k5e8c", "1821714659539120128"}, - {"evmos1ehs2c4zwwvsg9gc92lw7dfldaj7vy85rrlfrj5", "1360598228319248384"}, - {"evmos1ehs6yxm7gfh7yny8ygwus8khahtwzlcee6huz4", "419600205840641280"}, - {"evmos1ehtsf0uvnrhctwx4pkqc007vfwkqg9vmyzx529", "5083008884216430592"}, - {"evmos1ehzd082qj4fr9wkr0e0ptgu8yykhk2tuxpn87g", "2265195343663824384"}, - {"evmos1ej0jp2x5dwjnr70zn363sgffgfjlllchutwuz0", "3744309133956459008"}, - {"evmos1ej2n729khrnjt8uhtfn46sevdgyzfw93yev6x7", "524926819563867136"}, - {"evmos1ej2q4ke2wqrdcq9wjn3n5j8mhdl7rpfh0yfnl6", "3614704091446067200"}, - {"evmos1ej4rnrayhkp03ekz5nv42c0c8p7mj09zeldequ", "106326725660392960"}, - {"evmos1ej5d8wzqu8v4m4ze5qhzvxmk52zeqp5xq4femz", "2015656643296894976"}, - {"evmos1ej95evp4syscdj554u77lx9v56gtazskd0l6l9", "4645980425311023104"}, - {"evmos1ejaf4pr5qcc69r29pvasy3xsrjv2g7x2qnr59d", "884243762190505984"}, - {"evmos1ejanlp36h4qlknqsxnr850hajqcm6q4lz023fp", "1197769186665303808"}, - {"evmos1ejcghv6mmzjuw7nsuy9as0tu8xl3t5chz2pvmy", "1982436623385009152"}, - {"evmos1ejcyshawclmk26pkvfcyr9nksn86rwlt899czf", "397363001747122176"}, - {"evmos1ejf5757z2nnxqynrxx64x8h5exjys8l9l78h25", "5266744081902401536"}, - {"evmos1ejhf8lyhwce3875474mtuc8d3a6jq5098vk2tf", "1427539065176496384"}, - {"evmos1ejhmehffe2hnpfln8wletps08p60spqmwxdef4", "987366211970615808"}, - {"evmos1ejknacnd0vdpl45kjpmlpekh93tysmplv98fwa", "1697057032091797504"}, - {"evmos1ejl5zcgjj3mt564rpzr2mmuxq9ysf0lu0k3qs3", "127446875188871168"}, - {"evmos1ejlau054m5pzdp2x3wrhsczvxh7rx47wgxku2r", "2956727947424493568"}, - {"evmos1ejplz7g92eggx5dwg36c0evs2nykgyx3c7yxc8", "5336635970703290368"}, - {"evmos1ejq9h60cg42zsu3u9ppe5syeq7gpupt8hqmazu", "720558152086220544"}, - {"evmos1ejs66km6u6a7jvcdsh7geh4muk7ytay2ewlqwp", "4625182314058907648"}, - {"evmos1ejtn0ngsdhj6gjampl73z5a3ah09rl6n78df9n", "48785399865604546560"}, - {"evmos1ejuq6ghv7tfexumunzjknluc5saqgjznczkzk6", "25650494321475026944"}, - {"evmos1ejz9xvr9gkzmshduzd3nlhj9dplsm4nfkngs8y", "502424741313239296"}, - {"evmos1ejze06z7k9ysan6fj3th7z9v8mh6e3cmjglwq2", "1000321587212192256"}, - {"evmos1ek30sm0z7q0dyy6vujtm2frgtkgyupzgszepzz", "2624397501807383040"}, - {"evmos1ek4m3ny0y4ap3qcz0w8pjc5fwnnnjel4ypf0jq", "3773789584563508224"}, - {"evmos1ek576dq00edg0mqre4cj45632qlp48wsagu20n", "1068910149336092672"}, - {"evmos1ek5pkev56w3erqw3vz5wwy9evj8x2mkamp3j5c", "1420339684657160192"}, - {"evmos1ek68zvsla0f5pvsmha64lltsrygl4v699x5jhd", "476813063835060480"}, - {"evmos1ek7javw9e5ezuypcxqte0yszmp77waawhhynt8", "47008957852756320256"}, - {"evmos1ek7sn54c882599v7ezxrqpqnv3044jv0tk3j3x", "6162408616297472"}, - {"evmos1ek88y2faz0cdxe2s3c863842r8x44pqghxr8w0", "2985598590934012928"}, - {"evmos1ek8ylhwqwlzfejdzx4g2l8vlfhkzq5vpfdmtdk", "16612375323554873344"}, - {"evmos1ekcl8er6pavfyrfzaqh6m8f7k3uy53nwcv4vq6", "470153240335580160"}, - {"evmos1ekcyc5xuzhp5sx4te8fyk7ca34d2np47ecl63z", "5934040467245117440"}, - {"evmos1ekdcvwgl7w0t6zpzxyy6nm7zrpj554nqwxpmp9", "3162712688464706560"}, - {"evmos1ekdxu359g78rec0nk0c9malk4sp9cdwyx5pytd", "1294120663868253696"}, - {"evmos1ekejn8cm233h0a3wv7de2v5l5cgt4s4ruht6jc", "29065160724456833024"}, - {"evmos1ekgmgzt9f78nkvd5pew2g0evklafg0auyysykn", "1616137178604694528"}, - {"evmos1ekgp4kyrckc9yncjk2tu20uay0900mhu8jzsjj", "1901369767125062656"}, - {"evmos1ekgzhvg3kvgp4rdplra5n2le6pfrecf8n9mg0e", "15162375601938853888"}, - {"evmos1ekq0hg5d232f6k322jyskqhk3d68csuhhawvmf", "13429857133218181120"}, - {"evmos1eks6pmxh6fd5nm9lpmkp730skla4n9smwlgh35", "5004451056635130880"}, - {"evmos1ekskm9y5u86jl2gt07wyfnlfx7zut36dsevyfc", "855221330169807872"}, - {"evmos1ekur7j4fwyl2844u9336u7zkaneu2shvjtjx5r", "4736224544776187904"}, - {"evmos1ekuy4zdm854dnx3e47ksq6xuzxuzsrau29jpec", "189336007163020288"}, - {"evmos1ekv6kt620m4q6xj500lmzjf4zfus7jhrwqvemu", "2731427138933010432"}, - {"evmos1ekxf05symxj7v7vrsk2d7mzh59kdxvu6c5855j", "1546181186592491520"}, - {"evmos1el0ersh5qma9dnj0cuegs8ny2ne6xyfyquekmk", "2187920114694062080"}, - {"evmos1el4yv92gpmsqq9w795dxkf4gy4gwtj026rtee2", "4661400721039812608"}, - {"evmos1el67u0ejappar76p7zqc6vp2e8nydl9mvgwzna", "368979786783394048"}, - {"evmos1el6r9sljvtkrnvy7c7jjrp6w6e5gnpht9k09zt", "2823446901137313792"}, - {"evmos1el9a3tahryx9fxfr22kpg7fn29h53r0g9gk9pq", "8068680354685931520"}, - {"evmos1elefjnsxf4dxn74wyfgx94xzxx4k33ypcuezfu", "4658729826184710144"}, - {"evmos1elfvj40dn6ezr5n449pjyf593jjusqkft5tvcf", "3133551253389611008"}, - {"evmos1eljajyv0hxcfuzqjzky4kcj2cppeh79fd80r8r", "3190996131631209472"}, - {"evmos1elnjzf6wdq25h5scvk20227hgpcyu9tujdh5e0", "4681428567649049600"}, - {"evmos1elr5qyachuyedx00zk83pxe73wrlp4hkck35h5", "1291235652517102080"}, - {"evmos1els25qfyfxdw4k6mm4fpgs7n0kdw4zdn222tky", "1196626485081088"}, - {"evmos1elultgzmpn6ffhqtzwwjw8aa35c442ejn3r84n", "21135367663385645056"}, - {"evmos1elun9rdjgmjs0mw7gzege2xf45gcc3649jqsle", "116983376159065088"}, - {"evmos1elwcy3pz52cyrycdusz2wefr754cy3x9kuq05l", "3316829801348352"}, - {"evmos1elx20t4fusphgjzcc5lp8t0cjawmjqutq04000", "50685967301001158656"}, - {"evmos1em2cg5hu2m0wm2wrcqk6dh7ykz5p2ar7796j9j", "476855544117859840"}, - {"evmos1em323jn0rz83kdvdvjvxjp9dzxvrlpf3ymhhra", "7212993848006563840"}, - {"evmos1em3g24jzaya9wxlsr2cc3k9amstke9w7mqzuph", "5160666121979250688"}, - {"evmos1em45zfxs8eru27fk5mcfczpavz2ywgjhgupdff", "8595286669299091456"}, - {"evmos1em7mta34hly385fwd6krww8f9vtgr0t9w0x062", "28146521880463826944"}, - {"evmos1ema76e2aasx8uxztdmu2vyej3tdvss0surw7ys", "379208919652155392"}, - {"evmos1emc07alurtl4ccp52lhfzf955l43huzyd4mzf8", "1073392878730634752"}, - {"evmos1emet36z25m4zca395u4350n9tkw003mmjpevpe", "4969967009553917952"}, - {"evmos1emfgph76ukduz9vqq0xpg62ctdj8425w5typ8x", "13039402701888794624"}, - {"evmos1emfkr9ke2jaq972500m222dr4rlst4wcx067r6", "476689343737391360"}, - {"evmos1emfqcz8fw55h0xps9pmjlq6j3w2dnpg88770yz", "478740760028875264"}, - {"evmos1emkwalw4hty2ncpfu6eu7n70v2mgasfz5ys376", "888381064028921856"}, - {"evmos1emlj0lcr9k85apns4xfk7c2w5ueffmc9fkedz6", "14229619351831996416"}, - {"evmos1emmn966qlees2atx47a0aa6zu3mpt67e6uv929", "4845136026058981376"}, - {"evmos1emmrj2e06wvdeluc5vlhdkkv4rj2ycw44mz5td", "1964643531775596288"}, - {"evmos1empj99g2d2le483g49lerc3ksjg9j42cc7tt34", "1669702134594223104"}, - {"evmos1emqjsetqza3a9fdt5xw7kj382kklln6m3zqhw3", "10240140392636964864"}, - {"evmos1emuwd6ukf358d6d4nshx45cgfve84s2p578c36", "158687669985367552"}, - {"evmos1emv6k9cx2wz7auxy8s22qezr0jhf8c7wgzzd9v", "3184682407038386176"}, - {"evmos1emwsh0dzg2fd0ngwz9q7y532r5ujhy9tdce8gk", "1480427972985919488"}, - {"evmos1emy3edglh00jj5x2vzdttlz4zutgvz63ss967p", "5488535099283718144"}, - {"evmos1emzfg4a7rkck9paytf93n3949j3q8cp5ut7qyv", "134220007048629501952"}, - {"evmos1en0gdh3qnj43x4knqpe3h3wf6s6x3e6ea6y0az", "583839490857201152"}, - {"evmos1en4t50atrattxpwfncl7vgnz8y4yyg85qk02ed", "16055939644820623360"}, - {"evmos1en6ghnu0ktavag0mwqmcggggwymv774sktgnk4", "5126454828120674304"}, - {"evmos1en8zt3wtzte4p5unadcfur8kn0vt9w6acpg04z", "2068916080118589440"}, - {"evmos1enctqfwrdudx2m7c8yf7ue8ftgulcl2d7pxetv", "2368965219167735808"}, - {"evmos1ene7tm2fff20y494x9c8uvrnqz6jqap00yweav", "1827903125942591488"}, - {"evmos1enekynly2we6rfhrqg77lcqc92drh86sjqy43e", "385505561251639040"}, - {"evmos1enleaza6n89zaa57me22v6lj83w806k8nph0kv", "1703702612950220800"}, - {"evmos1enmynu5c5lyz26x4jpxq8jtda45t4262fsgzwt", "298951795165961984"}, - {"evmos1enrz4ehhg6mtgq7yfpwtm3vrd6zwyu4vp37k33", "465544222604898048"}, - {"evmos1enslpk77xh5y3ewm7uunqh9f9rffm26my2jx7r", "218884112937913745408"}, - {"evmos1env25jye5qkagjp7h9znmrw053kamvr5203mjm", "7953554067964843008"}, - {"evmos1enwqsjztk5k0h3eus2ygtrjqvamyyjewd9v8jq", "11620606537062486016"}, - {"evmos1enyerqchjdedkc63zz8kkftqks48wevemckcun", "1144042368068285952"}, - {"evmos1enz0lery5gkccpqlt3l3qyxl5jepdxjzkzqsh4", "10505043864966086656"}, - {"evmos1enzslp7cdfcv66pdzhspcps460rtmc2pll0nr5", "815020031093179392"}, - {"evmos1ep0acj5lfzww89v5ldglvaxy0hlvh7k3kvzgxk", "17238542928197498880"}, - {"evmos1ep68y6uy3xtg06vlv686lu9phl6qu8spw773tz", "1592998373495215104"}, - {"evmos1ep7vqhlxw8xnf3u0r7rjwmxj7sxl4zqttsdms0", "792848166772203520"}, - {"evmos1ep7wjw2vvcy5wnfful2pkgaswg0peharjqkn3m", "7866039777179471872"}, - {"evmos1ep9j25qzjct7qhs9lphn5qkrat28e63xhv02nl", "402802372790955008"}, - {"evmos1epkpn0955sh4y80z7ejmcz424tkf5wmy3fdxkj", "49021768527324928"}, - {"evmos1epkudzm22l29sex3lza7wtl04ursh2ye2zkvmc", "433664630056524032"}, - {"evmos1eplvd9vc24cc5npqv9k5g6zythepcgrye6l4v8", "2628482937027028480"}, - {"evmos1epnkwgwjlcwe3nazf6y6l799fr63dwglvqethv", "63128485697655676928"}, - {"evmos1epq8x52akah3rhsv605cpj0waqpnvx597m6ap7", "1574355084385878016"}, - {"evmos1epup5q7es2fcr09ryjf4jd9z4su99zlu0987rc", "235306129166035712"}, - {"evmos1epwv3mzap2cnutzqc9rvnux74hqke6agvjumxc", "7574717513092444160"}, - {"evmos1eq3kdn4v467zlvawtfzlr5jmcpcv9qpc4vrsmu", "38904297290913652736"}, - {"evmos1eq43ewpkgsgh4devhz9xtd667f4tspzwxf6v8x", "24484578907629568"}, - {"evmos1eq4k2nwwk5yc9zdg9xrx76ycdwtg00fy8e5a3d", "1316878853501270528"}, - {"evmos1eq79888j4sgp07jfw9k77ny25u5q65akh5hj8u", "9085651416649531392"}, - {"evmos1eq7tet7v062p2d3pqquq2k88gr5j8h339gmerl", "33225602730855104512"}, - {"evmos1eq8a4nxxthxka5psl3qkry83c24hky4vr3fcq4", "2089156587654733824"}, - {"evmos1eq98dp2xppjnggeyrufcf8rzkhk9gsyvp2a6l6", "422351551873019904"}, - {"evmos1eqcxtdgrayv4ew5zj8fftzxmaz06edk6dypgf2", "713347068794099456"}, - {"evmos1eqd27lefugdjv50chwr5ugpj677z58h8enmta7", "1078208285856851968"}, - {"evmos1eqdugkls39ruvyra43ydpd79egxfcfam42f69s", "4563002056793746432"}, - {"evmos1eqe8lkq407d0gcxjrqrmxdfsuv62q0g862m3ws", "9415316231327881216"}, - {"evmos1eqfqqpq5afxwpfpz7gg0s5r2848yzcku0ygkyv", "890105625286375936"}, - {"evmos1eqg2uhhdvghczlw4syqs63x9386mptm9wemm66", "38405870829679607808"}, - {"evmos1eqh9l3h3wwgn03g7wpkxwt47v0sdjuuw8ae4f0", "1179341170088321024"}, - {"evmos1eqlgtv0h2unvsr4cl3ypd0uuzptgg5zu64l30q", "1003528132227374592"}, - {"evmos1eqmal5wp7dfku42ugxqcdhq30c8c7sssfw6gtj", "2784124831082127360"}, - {"evmos1eqmzmct38f5srk0f9fq9x2gjm497ghhfwkke6x", "12105180431780720640"}, - {"evmos1eqs4lrhvvdst9f9zmujhmnd5gy5x78g9gf5jn6", "476821039478011136"}, - {"evmos1eqs6w7hef54gjsw3gdkwdm43jxjnwkxdn3g4kn", "1292002049573244672"}, - {"evmos1eqsurhlqy08j5820sa339yqh8wjm0upc8e45dt", "2608866883377567744"}, - {"evmos1equ2xvtrala37j26uey8wgj6mncy237vv2mwh6", "142383317776984064"}, - {"evmos1eqvnry6v6rkt3lzuu3q5qu020fjllnxah8nl94", "4337084920763525120"}, - {"evmos1eqx4dn0p5gus0a4049cr7k9pftp55l33wc6fhp", "107757817795870720"}, - {"evmos1eqz4h5v5azgyugde9k36kd493axw8s483tz63j", "1234851512450760704"}, - {"evmos1eqz6ls6cs5sp0mqys7e86apsj8tr9f8nuv6335", "168965720905732096"}, - {"evmos1er0hwkpu6nwtrxpylqfvswq3z5qnly77hju9dz", "516285108323300096"}, - {"evmos1er23qjdekv0ulgtf30rp46y02qvpqvl6plgfc9", "2327793528088556032"}, - {"evmos1er5z9tmgv4v5wtt3qklddemeu7vwrldgnvtyjt", "99432000474042368"}, - {"evmos1erdn20z7p8z6cnlmrm4qagklar735xh98dxfws", "407579860365500416"}, - {"evmos1erfln2w3fa039emh6jqe5aglkeg22jpkwfd388", "2184846127034023936"}, - {"evmos1erg0cjy2f22cvjratt5ag3dcyg63ksa6flaj54", "1581425107970072576"}, - {"evmos1erhe0ufc3dk0ep90m6zkvfrhulm0ygqnf3d9pt", "2031736933304737536"}, - {"evmos1ermc2659x4r9v5rzw3tqw8veehqqwzlz08hjkm", "12029390181241008128"}, - {"evmos1errfcc2rc3x8wnrwyp97negk24hqzxhp40mjwt", "1515112834280232960"}, - {"evmos1erw7c6a5gea7mxmemjv0665xdq07dtym82lhnc", "1507704754200461312"}, - {"evmos1erwxmfupp9azh6v9fa5l4mgsuzra4zknttqxh9", "10754764031536607232"}, - {"evmos1erwy9t4vz4f04ltc8mx4fs6xlfplss6lmuvksv", "187943954797632000"}, - {"evmos1es0pw4ay0d0z6q4v8925u6kdlz727ka4603xrr", "33953579192976953344"}, - {"evmos1es0trramtk2ypjyqepuypvv49mmz6wws8hh9uc", "24401506228000358400"}, - {"evmos1es2ve8uye20ejtvhgvc94tmmwchusr4eztwsqf", "5141283134449432576"}, - {"evmos1es50keuafshnmtunaj3s7j0rhn27lxv3r5dl20", "3203454424456351232"}, - {"evmos1es5dzzm5yhjehexp4m5lkazmnza3d3fan7qasv", "3766134148741122560"}, - {"evmos1es5lnvur8pdqk5snf2xfhaqguu8c7fkxev350z", "1445510742596864"}, - {"evmos1es64a3ql8zqu2csx3q4h435tm8r7g9qadjd20q", "20138850694897856512"}, - {"evmos1es7ptks0txr3rn4rj3rqv565pmuhl7v7r5eltz", "48015031547084210176"}, - {"evmos1es7yk9xln3xqdp206cl8a5nsgm7d5dmgvee0sc", "79482952390208552960"}, - {"evmos1es9n5hpvhjumeew5ks5ryl5rgv2wpelfexzgpt", "13195135974741147648"}, - {"evmos1escyfrv8w7qmnm0qz4tev8au528wnf5dmha2r6", "6546690473287647232"}, - {"evmos1esf2q0rr3q2asxanvxaal8fjxarzlhw7nzk7k5", "7754076550473816064"}, - {"evmos1esfjh0903lhadm24cp0l4rgsyx3z9ugec7x8sm", "15556522185894991872"}, - {"evmos1esfrkrwp3exuz3afe2puur6eaw654jvrl03cwf", "2468443485346621952"}, - {"evmos1eshr9j5ma65jujaa2am6xrglhy3vlg8kvh8rkm", "81472402404293312512"}, - {"evmos1eskqnwv3h7tn4qf8rrhg0m6r4lwrhys35pyuve", "36585346691910012928"}, - {"evmos1esl6caklv97a9tddrnqmqnyufm9ana9ftsmm5f", "305883853802438656"}, - {"evmos1esl9wtemvx8gxdkd9ktve2l8s2lp0hmq6rrtvx", "4276628989204383744"}, - {"evmos1eslpp9j6sv632pncwhsed9u3muhm6rrmg8xuf2", "820197666779046528"}, - {"evmos1esnpwp9qc8sss6ajy392kmdrhm0pchzx8sgyjc", "5466311735484694528"}, - {"evmos1esnu3vtgkqgh0m3xttac9hnng4cnz969u3vfyh", "11357679172326293504"}, - {"evmos1esp3m6f0scrtlhgj2v8nue4r3j82jpqhfav4h2", "72014236662944256"}, - {"evmos1espgapr9cwwgkhf9qscusg3em3lwfznd8hs383", "938395372589234176"}, - {"evmos1ess5dw2mjk63azqk9kzy09swrarrm996at0fjd", "426980145534375424"}, - {"evmos1esth5tq3q5xavt3yp9ywr5jph2dsv9q8gwkhq9", "463547693775425792"}, - {"evmos1estl84fu5zpgw2pxdykcdrs8a4pargccldec5s", "8509202399517351936"}, - {"evmos1estwwvtqx7z6w8dpanwent9jntsulpwnxk9nrm", "475115598091835904"}, - {"evmos1eswn7ly2njl6z7vg6p5x4x5e0ywnar3lsnzykd", "2301949280443080704"}, - {"evmos1eswxa5gzdxle4rhedmsl80ar6ws2j6al8n6ksc", "1168089656322436608"}, - {"evmos1esxkwmzkp2he086qhflx3vvk5ldyjrf2tv24ka", "465632062958523392"}, - {"evmos1eszhzdwcux25ldyyxyly99005h2w30sc3h44az", "34599147760178659328"}, - {"evmos1et3jg3eda426p7txx4k3amjj0jm60h62eq9n0x", "4106910656760397824"}, - {"evmos1et64u5vw472x80ruu76vteemvpm4w5l463hym6", "27283959915493515264"}, - {"evmos1et7k2pqpwzx2faj6yg6q6plh3cv03sej84yntf", "8460086117147213824"}, - {"evmos1etaa3nmp32ge3nrta2xep0zhf7xjfqcqqnk0wt", "2201014664023500800"}, - {"evmos1etac4khnsymrcq9unzcrkvyey2sw2xyuwhjwzv", "9555893344312758272"}, - {"evmos1etakj28t569cs55dvmadjxpuuhhxlvrxzqtxrk", "2791000997653438464"}, - {"evmos1etaqkk6av57cv5r8g0tfh6g58ne0g6y72ctln8", "2484396533298083840"}, - {"evmos1etecp36u6yd8q39d2sxsklpaj9se6ke9shj8e5", "2257330500891574272"}, - {"evmos1etggqrkucwe6e8u8t5pr2z95qwcmmqesze5dwq", "3304229545254254592"}, - {"evmos1etkdczukxj7suy2n3jc5rnnm6rc7hl3a99gj9z", "319097637080042240"}, - {"evmos1etnmdg4u3lhfrk2qtnrs9hnnxgem5v0gpwm9qr", "2317490463440138240"}, - {"evmos1etpwmnggyc5t5warrvahg5mhjf2sxx0xa76hs2", "2122917594584282112"}, - {"evmos1etqhr7wv35d76jxmdstxyqw36fht9p47k99e84", "574826843738210304"}, - {"evmos1etqk34a00lcwll8cjtw346fkq58rxxu7xktjfr", "4515925401620844544"}, - {"evmos1etrxsy0kthhh7mk7cvn6lpmmkmx2ujvysky8e2", "955168466108048384"}, - {"evmos1etsc8eduequd7lnm9z62z6hc6ghs2j3483x5r2", "1301941823873453824"}, - {"evmos1etsf8zvsp23paag2k80j46w47wy2l2a3304s8v", "3151082194234492928"}, - {"evmos1etstkh94fpjsu40c6u870e7lfmvx8chd5qd5jc", "10221962676456275968"}, - {"evmos1etuxjkd5f2js6qkmkz4n7dvxjpk6xae6nns8wq", "700139590468987520"}, - {"evmos1etv0yxf22ufue706lyhjvnzq69h609mqwx0hfz", "254915162707989760"}, - {"evmos1etznn3ufszu3n7vxpj5uu9s5dlkknermdweg9d", "3913965849950558208"}, - {"evmos1eu5373445dw7fk97ex24d48g2yllugzm2xgqm4", "18656613025959575552"}, - {"evmos1eu70tkcyuzsu0r9vlcgxtnya4zxj42zerakun2", "1920043718202934272"}, - {"evmos1eu73z9y4gjn4kj7p0el0kyfn3lx6kl9cwcrmyx", "277458084166265600"}, - {"evmos1eu8p6e5dfgp670uw8tyn50y8tn6l886w6fszjn", "2041642452146700288"}, - {"evmos1eu99md2ewuvn09270kfznfg9j5uwdp7d39m7ju", "5635989879287056384"}, - {"evmos1euay5rw69ewefmmdxrfp3nlkyffvxtx32c0gpz", "386936761880681216"}, - {"evmos1eucamskqk4t3la8xmdcqjtsaax923kygzmq9cm", "45116642122226944"}, - {"evmos1eudl6xd34dn6y50dwjw8pp8xsautjszmv8d2ml", "6897241405755553792"}, - {"evmos1eudqz3xrcmx89geqauqy9yy6na8empkcjqt8yd", "4496063845764366336"}, - {"evmos1eudxlqm6hpfd4t92xhv3p7fdqelyratct768ua", "388018656532394240"}, - {"evmos1eufy4wkp70gjxjgx323207phj0v06484c7xy8u", "410882811551087104"}, - {"evmos1eujf8xmv9qvkk8dgxzc86yuw4r324z44fys5ms", "1445346061644124160"}, - {"evmos1eukdrgg38gjvl2yljd2xd3rvygg8lf6m0rmzq9", "101971665510262528"}, - {"evmos1eulm25ya7xp5s0xgt9wapvaqm8q9yxvvx3p0c6", "714518800950972416"}, - {"evmos1eult2vyy6qgk3h83f4pg8u0hyayrgt8sfhj4es", "3203594228243151360"}, - {"evmos1eumz0pm5w76tw8yy66wteutkcsdkq4hdr5s6qh", "339805628508006656"}, - {"evmos1eunug3ph4paecssu3ch8c08g5td08au3mqgjgg", "2213405523926652928"}, - {"evmos1euqwkm4ls6ql3vjh3xqcaw3ynzllr858v3uv8e", "4431905799849063424"}, - {"evmos1euraz2te9e0qlvftvdlfpl79uda474hnpa3uue", "1040684474071732224"}, - {"evmos1eurnv768lzahrya29m6pvmru3z2a2srv3pjhyt", "29705008490963640320"}, - {"evmos1euswrdl66e0ey6npmk9ecny5a8s3frqvf8z8rq", "401814023976829696"}, - {"evmos1eutjclxwushtz8c6q2cmsjjkls5e9yslje3ujz", "1448876576177491712"}, - {"evmos1eutygsnwpauushw9u27egwtsw28vlsjv2ahel0", "2322725024218488832"}, - {"evmos1euuayewkull076tzj4vzm8gr754uxe3ky8vxjc", "4804960831830650880"}, - {"evmos1euv6yvyxk4ta3cwz4n8zv4pdcxqzavtqduwyql", "18146291255301650432"}, - {"evmos1euvsn8tclnazx67f90qr3vntzehk5ssdq6h7vn", "2780434210307227648"}, - {"evmos1euxn8wh3qlg8jc7f3e5ter66j7uhf60s2erj6r", "9615742108400005120"}, - {"evmos1euz72d7u74kkw4atut3sqx3xdvl6pu47nw9659", "2924726568862150656"}, - {"evmos1ev3a3j255kvxzxdcvrudq0fys005st9elg05nz", "394631285055593984"}, - {"evmos1ev3r9y5j9mh3wjwsfkeurdcypqg6nd34txcs9d", "6227305900465860608"}, - {"evmos1ev59ts87emuw4v0ws2s0cv6c2a7rz7qzn0n72c", "1510683990325253376"}, - {"evmos1ev5pggd7wjfqgtvc3qetelvccue8drnaxzau0j", "309893976655056896"}, - {"evmos1ev5t9lru44yp7mfxdalgnq7tu90e72f0y7nj6a", "4202282238886457344"}, - {"evmos1ev9z6fr72txy28yyx3tr4y2zsxd9nkzryclu8u", "465572257787052800"}, - {"evmos1evclp0k0e8gpzemw07zvhngsler30ujjyxy7px", "76639419140167843840"}, - {"evmos1evhpxlcxhgpctu8xkw3gzmr077ntap7r0a0en7", "3840794316045353984"}, - {"evmos1evhwrapp5ne0xz62v0sr2440x0kmlw5y3zlxc7", "1493955527161702912"}, - {"evmos1evj6hx2fkcxskmsnzk4k9nrpdwtva2k8tgttjj", "821921625879138304"}, - {"evmos1evk8p2qe5556zk93udyqmxgnh6ap53ssnfczm4", "889954330958645504"}, - {"evmos1evmdk2dznr5maah7j0t2uvjr9vdae8jsgecv7z", "1149437616585311872"}, - {"evmos1evq8hdrdupmlsaujrywtcxfrmr7dyr50umm3zu", "918260481239646208"}, - {"evmos1evsee7fk0nndq35yyzm8x3j5zd40j3dhrcnqrf", "2828324283791564800"}, - {"evmos1evv2fng7d636s0mq66705kh3qgm4cenly4x6s0", "384314424118280448"}, - {"evmos1evv96ye5qm0e4c7pcj7dw0x6t9fc8llc8dgnd2", "1281669460218375680"}, - {"evmos1evvdvuuq4vxwrefwhmpnracame3qcek7tjdvch", "3058841924706451456"}, - {"evmos1evyylymrm2rwdwq39ws9ztpypy6fas88uzzu02", "3204302574179804160"}, - {"evmos1ew23hft2njx642xsej0lnhxt0wfzanekhxjg4h", "1880947928012548608"}, - {"evmos1ew39qrnzlunfdmhhs73fczd2tngqhjha9n8s2z", "1340780470130663424"}, - {"evmos1ew3wjrhjrau3zuwceeg3rn3saakfqh9yqwf343", "1344752266465148928"}, - {"evmos1ew7335avy74sll7sf0xdpydjsqkf9cx27d55dj", "10327491160984825856"}, - {"evmos1ew7vlh98h6vctfjsg5e8etr5xuczpxkc208rsr", "184353665180241920"}, - {"evmos1ew8s82uqrh6pl9r0tykjqk0np2tlt5hflskyuu", "1277083094908730624"}, - {"evmos1ewc6spfm339lq5tg3722c5twc95yum870npt9x", "413713783370043392"}, - {"evmos1ewcgzuekfe8xvcknhwfd4z7pkwyldw4nus9t28", "504781711717727232"}, - {"evmos1ewfch0kh0z0w324aykdgeduf4g6spwlna63kjq", "6516387695289399296"}, - {"evmos1ewgj46e2pvxanf4jcmy92pcnmfktmj4gxf2awl", "468672311926417920"}, - {"evmos1ewkucqnasrtgwudezhj4006tdmt8mfnc2chfl2", "27797313107180335104"}, - {"evmos1ewkwwh62hvxq4s0j3uvcukp79laesh9a54a9ng", "1140394289260250112"}, - {"evmos1ewlkp7sgg9zxnzw8uxr37q8h6nvmy284ex5e8u", "5148242498710528"}, - {"evmos1ewlky0hvcql9rgchyn72d8yq8zatn89kufpkaa", "94887256784113958912"}, - {"evmos1ewm3pwt2stsu6dgvtctw695jrl8w44w5t0fgw4", "3412586423014713344"}, - {"evmos1ewml4kgx3lzpq6t2eehsp54csh542cedz80edn", "1527044945069629440"}, - {"evmos1ewmpyw7drc02nsx4fn05l9gxt3qwcxsyesf5nt", "61082299837166477312"}, - {"evmos1ewqrukc80jysdx3zldyzaqye89a2k4wm59yyvk", "624455655756729344"}, - {"evmos1ewqz0quv59pvzdy7xvv39xm0xgeuxv5nsn82nt", "1784266325776776192"}, - {"evmos1ewr57rla3crra4yv4r8n6zryywspwtxhrste84", "3988084749677866496"}, - {"evmos1ewu7ys547y6j66qm5gmm599kj5x2xu94sy2se7", "121418343739417411584"}, - {"evmos1ewypltrvdzwf8gf763vygxdejpy7cp8g4zg68d", "11562780341721305088"}, - {"evmos1ex0k60qegetwcmck5uj5dpy0gr8gymrnesr55d", "8670659342489927680"}, - {"evmos1ex3df43sqtptpn8lgh0v4g22y4mvxta69uhe93", "2509087151734795776"}, - {"evmos1ex42edt89vpcdve5gawyhlwnk2u0cz3dhglkzv", "114605548507103232"}, - {"evmos1ex4rj3ezlmc3ph8hfu053tv225fglwxl5psgy3", "385031422551785728"}, - {"evmos1ex50hj64am3sr662m6nftst7qfhwqsj8t3tazg", "935829283729151488"}, - {"evmos1ex57gv80teqkhlelkgk4wgu40m7aq5x9ehe6mf", "2808244106232807424"}, - {"evmos1ex607vc83dhwskjj4c8s8r33vv4rxq45ngrtyw", "2539602491563548672"}, - {"evmos1ex6k2x7sc5dx8g6m7tf7cnqrmrmp7879duxk0v", "10417763440200194048"}, - {"evmos1exd4tn2t9qmkjwt0tkah66ckmgl3vnvcquxcjm", "461477127728494336"}, - {"evmos1exf39t660p0hxxh0scka2qwpun48zhu8l0qwar", "851107412361248768"}, - {"evmos1exft3d6zep0ul0739tw3dqzqnyhpr5gj3v2phy", "416598379527260160"}, - {"evmos1exjvwhzpq6fealvlhd2h0ngyhw9qs6xywh5cvs", "5205105923828703232"}, - {"evmos1exk59u3l5z29s9tux4m5hgvqmsgraec840qmmm", "99388367940579328"}, - {"evmos1exkk8f8vppmulh8zzhc9mhxee0z2pczr2w0cnm", "1438355287698018304"}, - {"evmos1exlvz4z8kp939tzh2w27kwar6q2dvwnexhwgku", "3298448293044799488"}, - {"evmos1exnj46u8nvy4qxnwyp7c4nk3r4a5yhma6rjuva", "295004164982524928"}, - {"evmos1exq7fhz7gaumh0t59xafmh65vxl8dsrdtpvz9n", "416661944959466240"}, - {"evmos1exqmnm7zue8ny42n2n3tqsglfkwcctxm73pmyu", "1510410980377442816"}, - {"evmos1exrvcs0w3af4v4uccjmzh3z74uznl2m6jtsj80", "7627016350315249664"}, - {"evmos1exrxtkae2g9swdr5h5deuexjshzlavf6wscf6p", "1086613134268742144"}, - {"evmos1exs6nj42vzxa8famjz6lz662pxgsjkh092s5v3", "6240460625929808896"}, - {"evmos1extwqcq0d0fch4sknsdew94cdqlury7k7wg55m", "5491221285205737472"}, - {"evmos1exucqns9f0m667xxkmsezn8fw2y0cczs2ywkpy", "305230896685314560"}, - {"evmos1exw24vraf252gdl7rwn9rpwzgc4z9d2a9r4msj", "371496199776660480"}, - {"evmos1exwrws49mdgl69lvchpaztt8ty9s0ndfe4y8m3", "1317287520498344960"}, - {"evmos1exxku9euer44cqlle7etgl0et9t7g0y88s3h2u", "384031400921930240"}, - {"evmos1ey4jd8ws04nm5j8u84xpzakqxy0sraafkn5shw", "117212234493942272"}, - {"evmos1ey7s8yelzlauvk07de2lnhzafq2r7rzc7stkha", "2396412193991467520"}, - {"evmos1ey8cu2up3m5nm4kpn7mc5qxmrmy8gf08uaw9wh", "1758175404989521920"}, - {"evmos1ey8s8mfnqhgcwxjdtcutt3apsw4ddskkm66xw3", "201979404679144448"}, - {"evmos1eyc0z6r5yhz0mtqaes347gvgydmkjjvulpvmp5", "2927969360044315648"}, - {"evmos1eyc9hyufenq4cypzed4wsvzc0lamuqaz20897h", "2801945663709076480"}, - {"evmos1eyhup9jclwtueavll56dgprkdsm38jpgjw582y", "2810743924199388672"}, - {"evmos1eyjjq3jglxp9trsrc834p30564x3lsd9y76qxz", "5174776253166786560"}, - {"evmos1eyklve5qm8secn7z48k3ghx6x09j7uv6x3q0up", "197309266232610816"}, - {"evmos1eykzpr8hy9acwf39v65jz223ht6yxsk6gqw2pk", "676060211049670656"}, - {"evmos1eylyvjkgz84v8k0vzg9m9yedtntsl6csekzwra", "2867804903808620544"}, - {"evmos1eylz2fls27lh9674x95ym8yxexy3mznfcty4yw", "13551121479088123904"}, - {"evmos1eynuu57rc9h8vp2rr4za3y2pd96qu6ehweatjk", "200779861779802368"}, - {"evmos1eysh38zh0yfkk2hxcrf24m7d6unf0msspchnxr", "1791120469380601344"}, - {"evmos1eyummdtyr0k8xzuldm3sjtdh4gf0t6hkh9uj4j", "103667408311816192000"}, - {"evmos1eywvhxatqxxph3ft4z8vr9vhskw23jgng7sqh4", "4911901567739721728"}, - {"evmos1eyx6k49kkpp854aqmd6220yh3jy3p0l68ut9ph", "61215032996300562432"}, - {"evmos1eyxr5ur9fl22zjdfshmvk3atnwuxnrlsp7qkwe", "4055605518237919744"}, - {"evmos1ez205yjutvzz8g3mkqatyvvxgvezxxn5577p0u", "5737184142631936"}, - {"evmos1ez3sgzmzlnuwglp564s0p9c4lv4dtex427gw27", "1506295088091527168"}, - {"evmos1ez57frum3wsfjdek437x98gmqqrya42p0adma5", "3999523021053181440"}, - {"evmos1ez6ja5mqxqv6l5sndgrxw5wy4327vuysjlkr6l", "1709144941639516160"}, - {"evmos1ez83p2z3rc45wvp6tdnmqyhfvmu5t3f4tzp9r9", "899329309493257728"}, - {"evmos1ez9pnj3mxn8ntpxfth8v7t5h2rrr7plvngpnua", "15183401664271417344"}, - {"evmos1ezaxc4rjhnuc9jyvk35us7z68tumrq7pzjjwxp", "27047363918398619648"}, - {"evmos1ezczs0u382z4cuf57fh9ly0p5uscdw4ujcyr58", "390033598955887872"}, - {"evmos1ezdcm4lruymakyy9whh2uvq722mvwtvlflkd2u", "520284448451829760"}, - {"evmos1ezehu9w6yy946gpprc9yuqczqh35hxr630su2m", "412563398283171072"}, - {"evmos1ezj7qjv8egdl7pkkavwpdyn2dhxmm9e4wvc77e", "6964739881762979840"}, - {"evmos1ezjh8hjct694ksuw29ex26dqjttlgz0z5vzdvl", "1185921465299388416"}, - {"evmos1ezktv7mhdcale27vj5hhfwvec3vrs3l3w4ut8y", "3071094523169366016"}, - {"evmos1ezkv8j2fnmhsw4spw7qc94d44v5dayjg99jdq2", "477887943164916736"}, - {"evmos1ezmtsx0tcy6ykkk4j8gj6eectjmpfjmldrt62t", "848308499396846080"}, - {"evmos1ezp5sqcpf7ckp4khl08xxcl7yshmw6mash949l", "3607843667475065856"}, - {"evmos1ezqm5f875cwecc5mkl4hnvajqwf9ssg4629k2w", "18249932049776209920"}, - {"evmos1ezuawzukhhskzpsua2ezqelx95urxlvqf3fgs7", "22141216346173677568"}, - {"evmos1ezy8llmpjdfgs6tcsfwreax3spchssn9x67zas", "1642365566447262720"}, - {"evmos1ezyffq4g2d2qkv43ug36n9h0rk02a7gaacx2z0", "3673616616281064960"}, - {"evmos1f002706a67e99ltdga0wqulnjl48snxdvuth9g", "12380907943305068544"}, - {"evmos1f03jmdhj93fx9y9xy3l6mywyggjjxeawxu94md", "11235333568956545024"}, - {"evmos1f044qvuuvn6eqxhtn84lju7qxs5kf7vt50ww9m", "124322366622112768"}, - {"evmos1f05t6xams2xp4crek4zlywuvk3xyxwstdkkerv", "115686933638640640"}, - {"evmos1f0apfpcnt6cq5l4sejp270zwpmj4gxelp83nh2", "415970355500459520"}, - {"evmos1f0dvg6hgufunpmv0mm2fya5hxysnytm90ul23m", "5615917858106277888"}, - {"evmos1f0fd2r0ejh0qa6s3rn70p7jh7rj9sxtkdvkxwl", "7354767311931047936"}, - {"evmos1f0fe50n882w4tdh3dp4hz9nmmqh82du05eh9jc", "410900956057650176"}, - {"evmos1f0grgtwwwcv63fxh3el3pd869957uqm56lew2l", "387424014257570560"}, - {"evmos1f0ketdhwauny6hhh88cd4sta6we4069zcqa9he", "214565843136356864"}, - {"evmos1f0mqc347gxv0w574rte3cpa2p8k7trsspjx5k2", "618423454526169088"}, - {"evmos1f0n3zuhuzlku46vgcfjgkmkqe8dm7ykh3wgaed", "1585601902451062784"}, - {"evmos1f0ns0hea2fh4ywrx2yx02fgta4m8gd660c3e5h", "2750511945113954304"}, - {"evmos1f0r2tkrhzfnkv9fu3nnhkmdj4028p362jllvq7", "26663491811623424"}, - {"evmos1f0rthvx98d9gneeze4tq52wxn4ylh2tgw83dyx", "1369249774755328512"}, - {"evmos1f0v63axwv30vy9annxtv00qrqjl6gwy9q702d6", "976260575830404096"}, - {"evmos1f0zsz9h08puzglta4mvap9t4n4l4fhjsut4zsa", "260282527524136192"}, - {"evmos1f2237gmjq9wn9esmxckd9up9guan474xqc9nwe", "14239141735665426432"}, - {"evmos1f2259vvx8htg8xlq3xk3qrwwr2x7xds99s8t9a", "3715173892904177664"}, - {"evmos1f22nl3pz3xmmfg6a0ahhdd3ddjxq77hu95fc57", "1263452901986020096"}, - {"evmos1f23wz7apaetu76urtjkr9sf9yxstjq9ur2mqcf", "9750733668347248640"}, - {"evmos1f24uczylq935neph0ax2ccf6uaaxz3zmu30hxf", "133692853402520338432"}, - {"evmos1f28v6a77nne2zjh7cv279tqxkfvy45uulujc5e", "5958841481530303488"}, - {"evmos1f29qhfpfg7jsdzv9qy6fvzth455nx57m3ye3du", "7563505789675040768"}, - {"evmos1f2fm9m27qwshq9avta2yntphhafq2s2u9mg6dc", "413179404332080640"}, - {"evmos1f2hgu55wdqrh92p35nt6xyk8j8h86z7qsfwhdm", "3399963195382660608"}, - {"evmos1f2huaumwx3lyctcxmm4vjyxgt2umscq2tj8um8", "59433278027405819904"}, - {"evmos1f2ju3munmu5lnclz2lww7dasadjnwsgyjtsfzl", "476804993004322304"}, - {"evmos1f2kkzp5fjuwvvm7f59xchjysjch8mtflu3dhc6", "2194725087351813632"}, - {"evmos1f2kxtz2em8jtp8nmve5hnsfm626h5477nqmsph", "377240237894402048"}, - {"evmos1f2l2rc5mtgkwvppw7qzl0ly92tt5wuh25rqzgw", "12291520356097392640"}, - {"evmos1f2pqzka5swwtz2kvmnamg4c2z2yadjwgel048z", "453477468136683520"}, - {"evmos1f2s3dle50sa4kprqnr5c4rzt6anyj52ewu3z4r", "3773370702697178112"}, - {"evmos1f2teld839cdpmfl75pss9ll8ku0sf7a6vqjaut", "4941258723508677632"}, - {"evmos1f2tt8jve0crw697wf9y9smu86lg5mrt73cl0cf", "71291367510821376"}, - {"evmos1f2yytmugthsnxna8p8enz9lhydy9lnq0ctusel", "65691005284598528"}, - {"evmos1f2zhnn6tkrph8395mamnjx5rvtavmjf8pc7vk8", "1174715081124155392"}, - {"evmos1f34s2l4vy0n46ke96zr3u7kx0unvrtyus0zv7s", "413820214776145920"}, - {"evmos1f35qcuft8j9vcxlh5zc56khp9k39ug39dcnkat", "2709192277857491968"}, - {"evmos1f37gx3hqw8n54s97hvajsq37ddkc53nyuehdu7", "304942821388260352"}, - {"evmos1f38qkxfrvmaevlulnu3svwa0vquvk67d36wvkt", "1872074751745103872"}, - {"evmos1f38tlgv7ydqts6775u806053t97ctunaqkur3v", "4836506839992190976"}, - {"evmos1f3902z6nxmdcq4rrv2fp2j0eu3p88drvl4mw3t", "14265238716538314752"}, - {"evmos1f3chqxg4w5hufzctud8k5s26pewysylu752q7v", "97270681446229248"}, - {"evmos1f3eh3c3rllndar4a6fetu0hj6rleacetryjn9m", "35966328726320160768"}, - {"evmos1f3k3d8rlt5vynefsgkcu7czdwccvaj0zzjj7az", "5405957959147180032"}, - {"evmos1f3l0q60fl08famw7e6zy88ulr3gj6zdx9yn8zq", "15785555058495537152"}, - {"evmos1f3m0f2w05zavmyy2n5wy95ztat9yqhzxxetsgw", "525647104000129024"}, - {"evmos1f3mwa3ev9s8z3dm4vlpxa256mt397rhm947ssh", "1551917217097446400"}, - {"evmos1f3sf8qjp98kchxpzkjdsl9ehq7ednu7kxs5ld7", "3272719010576957440"}, - {"evmos1f3tfg5aqe7y39u8hv68qfkw7s87s0k6rt4xwhw", "944502740101925120"}, - {"evmos1f3uzc35ytuceh5dew30x8rg5f3px5ayzwyu2ym", "17003712087252992"}, - {"evmos1f3vpdhgemd30zn5w7p34ntyexgktc3fexgl6fs", "17071006044955156480"}, - {"evmos1f3wvvl3c5wr37esgecxcu0qguyl2mgvktmp3vw", "289852825044742144"}, - {"evmos1f3xcjyz2s565plktv97lrkhpv2q2puvu90kz3s", "12230773917324734464"}, - {"evmos1f43ajysj8a6gdkgl72vqy7g3p5xj7gc9jewaem", "1162408442239772160"}, - {"evmos1f45paa8dc835rrf604t6dxsjqum2pl2smk6988", "9566482507522680832"}, - {"evmos1f49vwstd5kv70lpg9evax4qgx8cczxqjlpxftx", "1470271803373588480"}, - {"evmos1f4dz2s4y8dkdjnae6u3zrk60u78f35e42z0uyu", "1002071407911744640"}, - {"evmos1f4tdesgh9h2fx84vkhppf5qs7rk3scdra7mdpl", "3998254770090721280"}, - {"evmos1f4wullreznl8g8ly9gr4amhzvsmc56t73vmavg", "5138204546407247872"}, - {"evmos1f4y3wtk3pcdg555yaulujudu7xf7tn7d59jz7k", "31320440063448006656"}, - {"evmos1f4yv2ll0lxmjdtqprlnvw3fsqq6k6q5dl3wd8d", "42052060854259712"}, - {"evmos1f4zewjvht90ttnr9rvvyt5fp8ddaq0ce25k7nw", "9005822939675789312"}, - {"evmos1f4zffhcy9zntv0hjuyh2jl5cenncwwpm7j903m", "2914761892334448640"}, - {"evmos1f538j7c2g9v7vqukqsa5pp9g0ukgw27racazyd", "3959160403664202752"}, - {"evmos1f54vpmeu7tey9nl0vyg0w38jp8fjscdya5plvs", "4218166796153438208"}, - {"evmos1f55j884dunjls4rk9qvvduadqzksky62zkukgf", "2795587118590398464"}, - {"evmos1f58y0md2rvc7uht2lfw9vvjq07zxf7a6p73x8s", "9035682449161449472"}, - {"evmos1f5an9274c0rta3j0edrsaxt0appu79whjnu5jw", "405281748925753600"}, - {"evmos1f5cqk4s75p4tuyxn3tg9xx096t4xgxqzuqd6sq", "4536085335974707200"}, - {"evmos1f5easnmx0u3xgjcf75qlp8xt6058d35w4gs8va", "1520812878896263168"}, - {"evmos1f5edgskjgw3yzulex2s5z4mhd7u38nclsr8fx6", "16934342653597509632"}, - {"evmos1f5fdz9yw99wsnem73368fc6ldq8w3lt54cushg", "2616502281183457280"}, - {"evmos1f5fn3dp4kr0y7fw89d5z66z3ctq7uchdveyyx0", "40668425425244569600"}, - {"evmos1f5hsg7wf8fg3rhz48z7f5nttww4hwgtjljw5lc", "1994494262449119232"}, - {"evmos1f5lzl3hqx6nwfjtkjxwucv375k7uh4dlzeldu0", "3313913066161307648"}, - {"evmos1f5pa0w6fu6rfkvjdje0fqkasn2ye2jex0x0g6m", "14298121038970884096"}, - {"evmos1f5s78h9ggucvhhnf8uffa4uh7025nx4d8qfczw", "9759705964985065472"}, - {"evmos1f5y4s6cxxs0zlu0qcd0ed0qcpee72ej9jsywkh", "1330832057580190208"}, - {"evmos1f64unn3vffvrdpf7zp823zd4e0d85jsm2feq96", "7327718811750924288"}, - {"evmos1f64yz55d4p0slcns6pmgdwhn3tp68p2jydrgye", "1137695834603429888"}, - {"evmos1f65vxhkrsrs3kg38cfj9gkqd8dx8a4glugw0fp", "342532077582254336"}, - {"evmos1f66uyk78ew7708z65uh87wlp232pttydp7vxvp", "15719138140860284928"}, - {"evmos1f67czx9esngr2ccy099gd0g7xsurj7dy79lmpd", "37037223306866622464"}, - {"evmos1f682a6vfhurshl90dp8yqerjvm2xeqvn9pcpjf", "953743330593968128"}, - {"evmos1f6adv9trjzkg09y2ldhp3kypsexy94zw3qdfgu", "1535546880459528704"}, - {"evmos1f6d2guewnn0psmkfdlxyg6xdfg07y765p6hyqa", "1301549407262900224"}, - {"evmos1f6dgpa7waqd2eac0qrvd982u5pgx94gs2qpu02", "1414860516054478848"}, - {"evmos1f6f3qx3cujxssa9tgaqtz68xcm9hx4r5ttvv92", "4503058216139811328"}, - {"evmos1f6f7m0exw38rdk8rfcn8creztpaatgefnlm2fn", "94832166372016128"}, - {"evmos1f6gses5e73tc0e0v595qs4sclfzpfzs7zk3q6t", "438749511595480832"}, - {"evmos1f6jj5v7rrquvrz48hph2vpsrp56twevx2y46sq", "37683331812793024512"}, - {"evmos1f6k0ktpf75x5n9cvyj9zk6hp2v5ef2c3vm6rlr", "2152854377038594048"}, - {"evmos1f6lypuj4hq5c689xzsdu0yx2gyaw48e02q9frv", "1302490627267988992"}, - {"evmos1f6p26ylwe8v90mm78vq5ml4lxtwmmzyy4shr7f", "21603223238793953280"}, - {"evmos1f6pkdhwfschgvd3pe4uy9dnhjw82kvyhczefpz", "11477127015445063680"}, - {"evmos1f6qhldtz9ljx2krn828m8prqn3et5fkdpm924a", "889974349994790400"}, - {"evmos1f6sg2jkyfm5flsn25uusfjzdlctz36npyf24ya", "369404785486505728"}, - {"evmos1f6sk2ar0h3xa5emn5r8mhsguugy80syd0hnw08", "1913887560805444608"}, - {"evmos1f6tvq8x8lmvk3vzw9kxxcujgdzv7cr7pfrtkx9", "5612353638227968"}, - {"evmos1f6u34tu3quxvng35mg74fsuv9q273hlgy374fk", "402739520317726720"}, - {"evmos1f6uqu465hd4mekdrr7s3hpk3qd9zevkr6mq633", "1440228182857412608"}, - {"evmos1f6yqjva253s6t77s6jvlrc2z678h0j8238s5xn", "89532194440352104448"}, - {"evmos1f72luf4uk5g53hxe29tpzsss042are4umkt8eh", "8800667557305257984"}, - {"evmos1f72tltm5t28evw8ueqsps8ahrm4apzy4va0m5q", "13130547431248640"}, - {"evmos1f73jcdq7kdy8rwv97hmefa7jyfz7jcew3mrg69", "12490055104870344704"}, - {"evmos1f74llqffl8f3n8vckj3gax3d8slz6va98n8vx8", "1555347823280218112"}, - {"evmos1f75uelvnn0vm7h368z3ww7pv47etpy80qjmfwz", "33759640208520429568"}, - {"evmos1f7989qfdn6cs6z044lexu0kpenm6827x9hda65", "2641106558536908800"}, - {"evmos1f7au4glq0463kfkuq58ecrvdgfqklgst7uh2rh", "795783454589298432"}, - {"evmos1f7hzpuq52mewj67nlf9hwktv3cmkjfqa6udtly", "5350086145155309568"}, - {"evmos1f7lr09jlahkjzdscghr90df98uj2t2y06z42g0", "3670188892021112832"}, - {"evmos1f7ndme54u8l0trpv67wp3hhemmgmn8zqlesvja", "596895087438619648"}, - {"evmos1f7sr086wfyeeq7kxjshsw9jsvt756e8yl78nxr", "412958986112381952"}, - {"evmos1f7v4sujqq0lk2732jqhedsgvqc6279p2v4ad2s", "338897084516073734144"}, - {"evmos1f7x7wf0rdqwzdmqta3w440gt335atyjajs38wv", "1675380063832855552"}, - {"evmos1f80dtt5vndfnv6jz2k5wt9vyvpcym7yg298c85", "3308064418286331904"}, - {"evmos1f80x0m6srq9cxvjgwy99aa6hgsn097kwjpmqsk", "69243313864268032"}, - {"evmos1f82enee7zetje70x2fnd5qx393jdwrur8cgdmh", "14869949292088909824"}, - {"evmos1f838rkl26ysrjp792sx7kdr0dhyeuy6dy73np4", "3139486918447801856"}, - {"evmos1f847ee5sd9wljsyj4vg3jaa49jcqm6g5zp64p9", "437644870300115456"}, - {"evmos1f84hr2vl872n278vwxydx025y3kxaqm0mycm5d", "40166244095762644992"}, - {"evmos1f86tx3976h48rc4djvjf9muu2a08wnau2jt7wr", "803325506963668992"}, - {"evmos1f89wnensrzuese29uz3yrmas2wsq28tvgqqe5l", "1430239597475889152"}, - {"evmos1f8ajr3udn56tajmyansaevf6cwe7f88hgnhccf", "857575670832906240"}, - {"evmos1f8eqaqxp45l9urtpeutxw326vtzp06f984us6s", "577268934581103616"}, - {"evmos1f8fdkhmvz7j69z202gf9qj924xyg2qqfquwz60", "28434109139594727424"}, - {"evmos1f8ge0rwwrfug5r3n43vuqp89lmjqj054j5nkef", "869182640747983104"}, - {"evmos1f8hqlh2c3c9vf7f5rklxmqdnp2x2924v645p6z", "3653903090720808960"}, - {"evmos1f8hw06nwxv9fpfq49y4vmt2gylqem6x9s59dag", "2668122236279768064"}, - {"evmos1f8jacy3ncg9v3qxh5x2xd9lx6eck56asgpwuzz", "675435787152608256"}, - {"evmos1f8mrkf2w4yzru4m83sf7q6h0y4l6k3wp5332ug", "11163802623937667072"}, - {"evmos1f8nkgnh0nac9fpgakcz48gywuqa98pdlmtyqlf", "738486862499232768"}, - {"evmos1f8nux7ymamc8gj0e2jz4lrdrsmxsktr0fz2rzm", "1490869473769617408"}, - {"evmos1f8rq3qn6cu870gjcuz544gl7pcnz53mgeljaw8", "1340200892130433024"}, - {"evmos1f8t0wkdcyg86qqrz5xrh5ct2v26ss7lvhfld4v", "5196016953492750336"}, - {"evmos1f8uak9uss7ejlt577qtkfuf0u93d2jt2wulry7", "34667122119968186368"}, - {"evmos1f8ywkmw5n9rncd5tws5ld4g3pqtt7xa5ruyutf", "323707475002935552"}, - {"evmos1f8zrmy88kp30ym94eexeywalq0h9e0yj9y55xn", "1251816815181037568"}, - {"evmos1f92ga99jtfr60ke3w4fvaxtwtvp6wnt3ka3z2u", "3594903342567562240"}, - {"evmos1f92w9dtmqjdrh07pgh4mcpujuw4xh6djzejjy7", "1043409168275510784"}, - {"evmos1f93gf249rkkjx5u7wz8c5e4n9pr5p7j6y7ge96", "17782658095167377408"}, - {"evmos1f94jtdqm2yqxexd2nus7tx25u7qxkv7qdy88wa", "78223934673518592"}, - {"evmos1f94np79ljtjvz0v2g99qq72v45wckcpqr376fj", "5221297459716026368"}, - {"evmos1f94p2ewp4xc9derg5g82kyv96dgz4zuunv59m9", "380171183424579840"}, - {"evmos1f94y3l0dwggw8ay3y5a337tmpv40zv3q8fs4nv", "10400308067074691072"}, - {"evmos1f990a5szntgcnxms54emfjq04kl2clzvpv639r", "37134646920418664448"}, - {"evmos1f9dfrh662n4vrs5wx388ww0rz5w2rn5y94fffd", "674871225546257664"}, - {"evmos1f9esz7vdwtwxxv78x2k5vu39wjxn4y6v5unee0", "2115370242744934400"}, - {"evmos1f9hhxqzlze6a49fkualp80dk9mlv85l4hr4chu", "712710025973962240"}, - {"evmos1f9jahz2sq508al6m06suuhe68pmyme25t95pqy", "947003838563106816"}, - {"evmos1f9qzfjrgykpd7l9m0gwylc52sgl8sqfvjyx9vc", "11728728394533912576"}, - {"evmos1f9rgxl3ytpcgdww4h8m6qggqhsesqpx2g42s9z", "471556960637727488"}, - {"evmos1f9umana2pjc7lzu5gtrlqrm3lfmkjcwrfsre7q", "13032095039754469376"}, - {"evmos1f9vnwdqfzuwv5a208x4ggvtxvpqvenee3nuluk", "467752969304631808"}, - {"evmos1fa7gg0zg4yrj6lt58q4gkhl3aydq9649yetna3", "2150038530132173312"}, - {"evmos1fa9neegk7yd0sq2jds3qydsst0xfur4xhrhlcl", "1678356668483324928"}, - {"evmos1faa27ahwpzurs0nrdt9xva06lpqllvv9ppxjl9", "5891441798692864000"}, - {"evmos1faacc7fgvg29ud5lwqatq6txa968nyxmraz6pq", "2018624409780018688"}, - {"evmos1faahwuk078sfpt0hffvccdd9jnw7kcw09jqx24", "7787340130940747776"}, - {"evmos1faertvr5z8q3t97zysa05pnqfv2mpxryt8a8vc", "289061068375293696"}, - {"evmos1fahn9ctfy4ndxd08fx9pl7dpcxh5xyrts69w2u", "5745651853285126144"}, - {"evmos1falqrnmxmsxuackag0vx095lslq89m8vqu9pmx", "62434272549545984"}, - {"evmos1fan5kuf6c7k0uksjmhv57jz8ddpzh6fvhu750j", "4018195758400919552"}, - {"evmos1fane34p0av4fz605l0s0npksqhsmwcvqmsw03f", "716686004172935168"}, - {"evmos1faq7h4w8aapaw9zudsar3ynwgaehx7k8gysd2y", "3052331213266616320"}, - {"evmos1faqj4hlpsxulsnxuwwkgf3jfj7w6mep4w7r68g", "4824728972329811968"}, - {"evmos1fauvpv4lskcgyz7uyetuez6wj6cuqyqw44hp4c", "1655997773942333440"}, - {"evmos1faygsl7entckvxj57gv90vgmdyysau8lv0462u", "3248171711608061952"}, - {"evmos1fc6hz5tcryuf20937txl2fn4qxhfm94t4qa0df", "1744611651179577344"}, - {"evmos1fc8qy76m0avq6usfmhx7ys6qxkx0654q2hp82w", "24874087024258203648"}, - {"evmos1fc9p6p4pd4s07ssu0lwvp07z6gkf9ch5megdsl", "2286796984862721024"}, - {"evmos1fca4sqx5zksueprnjxn9klr3a9fzjn8zxtv9lg", "1215055348322995200"}, - {"evmos1fcdhwxqljjlkhaafsqtnqar5dqfp2phjjns0l0", "648741397513594880"}, - {"evmos1fce3ts8l54eenrhs4a6yadxsrpvwfdxelh76vh", "9405673242177675264"}, - {"evmos1fcf97s8lhfg0ma0jl0fn9ydkj9xcs6rktxnlnv", "2349385248624926720"}, - {"evmos1fcfqw5kwheandehfv83zmttpmrhs2hzqm3z6ht", "5991471568930286592"}, - {"evmos1fcfszh82ldzzl2gdcckpx9zywug7ca6chphr95", "805152652732071936"}, - {"evmos1fcjf5thgl44r57zhge6pddn29hrvmwqt28m6ly", "37790001009200316416"}, - {"evmos1fcknzhcq80cyqd9jt47a32mfddr9dddmchk8pa", "11328806765816270848"}, - {"evmos1fcl370v4pa5f9yhg4ghakku2n6a7dwx5hserkt", "11361635514336194560"}, - {"evmos1fcmvt7y9rnvew6hayztdc4fa9njrfpt5w5aupf", "415508598325438208"}, - {"evmos1fcmwddhn4zuv6v5lh54w8w75s4f8qya237787e", "3213688094756044800"}, - {"evmos1fct4ycvgnmzdx79ue2ysqultwdmtyktvlpf4ca", "36589319832080343040"}, - {"evmos1fcu875gqpg7mdmqyemvh5jxlr4dxejr50u93lp", "1450661918309961728"}, - {"evmos1fcv4nukyxmg0c9k38kc6pa7tjexayk2lkj6ce8", "318935920962798336"}, - {"evmos1fcw4jm4c8pdzys6nah59nvgvk5lyxds27jhhk6", "3077295439437824000"}, - {"evmos1fcwkzyaaeg7dgsv39zq5f68dtdqkcn34s6uvtn", "273729233685446144"}, - {"evmos1fcxajcapgvq4qmjrzwrtkh4787n2yqcp0067e7", "14041152123326767104"}, - {"evmos1fcz5qqrl6gf0nysf0q83lqfz7wqxggma3axxk2", "98893334987783424"}, - {"evmos1fczvew0s3zkmmyparczkaugtmpjglp43rwvwyf", "137646997388116492288"}, - {"evmos1fd5cv6qv4wzw3x6hvreyv20ck7t7vx9vcdplg4", "731438555969064448"}, - {"evmos1fd76tm2p6tfwn0f9wuvag2nddme58v59afy4el", "179212918757672960"}, - {"evmos1fd9gmjze3k80zsezgk9p0g75rp04lpezsvph02", "4394704460123043840"}, - {"evmos1fdhjyjt7grey9n7f7hq6ehsdegd0u8ftxcrk0r", "6701866074066494464"}, - {"evmos1fdljdmptzqzfhucjleqyth6c7p0c0j4z23jc0h", "12929530965616238592"}, - {"evmos1fdlwrl6muu9jx8y895zz9knk97mkxked3g9z4k", "44406789444625154048"}, - {"evmos1fdmnuret2uxp74dpkgqpvu2aeflaghlz33t8dc", "5653241383592960000"}, - {"evmos1fdnfjv83np6ck8wvhk0hxgsnrppuk8lwl905cw", "261367053859941376"}, - {"evmos1fdpyqcy4jkr0q3qhfn9aedam880jk9qwj2avqu", "4280284273695240192"}, - {"evmos1fdqa64y2dt6hqclg7y78nzu7ldu8m2v4w5gze3", "57888653700609064960"}, - {"evmos1fdqx54w6kx8wp4rvcpus9wdk9sgh5xzvhklst7", "3225802103974838272"}, - {"evmos1fdu4h29ucrcjtqfaz0d9kewu4wj2uj73kjmsx2", "47569945056940318720"}, - {"evmos1fdvpghglp5tfskay9vgxdfsvycq5apdmxjynah", "1119694532083972096"}, - {"evmos1fdysw8kuwalserj6lzyhyk720fm7f68hx6znsu", "227477098482585600"}, - {"evmos1fe3etpn4lef7vkvkfem62x28xw4r385f4jhp27", "2783264523965621760"}, - {"evmos1fe3hpzs9guvv9yhwetvymzxjf5rth2ysd4uq3d", "2734978188116221952"}, - {"evmos1fe5q8q39qezfausvy9rxpjtnrcaa08dncedqry", "48477892148499890176"}, - {"evmos1fe6hqx8c9xxg9deac0uepej2zwljcqhahfvm0n", "464263843763975936"}, - {"evmos1fe7ex35se2xjhzu0fzzzt9d4et5xmmehv4snjn", "2595148841402005504"}, - {"evmos1feah960eg837sen482xhxlv2hv4at7e6n4xzsv", "3757610154833406976"}, - {"evmos1fed93az2fl0c9qj4mdkl7fcquyufqwshver8z5", "1898816372637551616"}, - {"evmos1fedmractav2vqmshzf34t9slqpnkhrvzgpc7mt", "3790323301974859776"}, - {"evmos1fedn6ny06nf4cjfm04j27rcy68fw6gfzt6tlca", "6001980472818520064"}, - {"evmos1fej3whc9ks2q5p68c2wvaxtu6jahryx574sqpj", "1712716704834846720"}, - {"evmos1fem2lgjj7x30rljzq9d3fqcwzn6t05ak6rs43c", "832333991841607680"}, - {"evmos1feshv5wvxztn076qg3kzurs2em0ltwf0ycmnd9", "797974318382455808"}, - {"evmos1fetj0g52974xweveypty2xy907qwmmxfmkyegk", "31531174096275054592"}, - {"evmos1fette5xj37x5pmdaljykzmaut63evh7pcd273y", "1999931289629131776"}, - {"evmos1few25qkdr59wt4nsvfwnddd9p5lzy63xx95e83", "18693629918954240"}, - {"evmos1fey2a2u2tmng3mk0tm5c7enams0px8dtp9kw54", "4195439198059006976"}, - {"evmos1feysrzaemrjvmrsk5np0d39mcjnpfzcrj2khn8", "19923537289064529920"}, - {"evmos1feyxulhwyagqhzz36c7sqvgecndysf0kjy0r6y", "9069684055262422016"}, - {"evmos1ff09c9q80pqz2n0rhewf5jnjf862st2sg07az8", "738331210881096448"}, - {"evmos1ff2zj86d7ru4ccqg0f6cfq8q6tmmlm83g8selx", "5137509653982215168"}, - {"evmos1ff6vxrleddk2jwtq9wmgqqk7pltqu2tnr750ns", "2297182063871461376"}, - {"evmos1ff7zxlrjyujepdr4jvf83xkdn8htpnkjw0y7nt", "34301776819144171520"}, - {"evmos1ff84fudyt0zwlfta73uyl9v5f6lwpt06dmgllj", "799683826699256320"}, - {"evmos1ff8v4gly6kcuclrrswzedr6a36pjctt2rwqrmd", "15844040453429977088"}, - {"evmos1ffe0yx3w7qr2k5lnss5aa9gmzn6u3p2wk9n8y4", "3865945062686191616"}, - {"evmos1fff7yudxd5c8h6q7vx6wxw454wf23ex3dasw8w", "3257311332951355392"}, - {"evmos1fffn5lpvm3sh866z232ttg04u0n6242kqaad0e", "964622873622526464"}, - {"evmos1ffjt9qs2q6n8a6rcz4a87jrpz33ad0tcza54h6", "23454478360554151936"}, - {"evmos1fflgmjmkpsgx3wm2tq5vp5990fs58khswrjxlg", "33776135980054573056"}, - {"evmos1ffn7s302pckgkacyfyfjln7nqssc5takymks7e", "34532052759076343808"}, - {"evmos1ffzgpmf4gnhve9kkkcdw0y7f0muvygfee4awlp", "15878270769980561408"}, - {"evmos1ffzscelnuugh8lxw5w7qt0jxatl5tzwksn6lng", "606124884100079616"}, - {"evmos1fg2z9pljyfauu5ws9vxuf75urdalxc9xrngtzk", "174680903951478272"}, - {"evmos1fg4mxxg46udpm2a9hz2gds5tz8hcgmxazknskg", "372878908959784960"}, - {"evmos1fg5vfftl7mj7jl8sp9quy5xkgv8l0mtnya2ekp", "40275130020363616256"}, - {"evmos1fg679d735glagychuaak29g0s74dlacdyj0dr7", "357003637759391744"}, - {"evmos1fg8wf5j36j58knsxm5hy9phwgke2vpxn7knv68", "1492722982227151872"}, - {"evmos1fg9lk6vv5wp9yn847netegcs8n59m2nerjtfzk", "1413151675393113088"}, - {"evmos1fgckq0xp62g32ld4w95xah72rjqs0e963l6x78", "1989780812889039872"}, - {"evmos1fgfe3puwj72p02sjckyl89u7ph6q7rzjc60gxp", "8314169645966725120"}, - {"evmos1fgfn52sz9eymt60h42m5tec3r9pu2gqx2tp7y3", "3735506893327141888"}, - {"evmos1fgjemxrz327hthsztjuynxs3pzq6pr6k2rzln6", "877124239800411264"}, - {"evmos1fgl7yetv0zwm8rmmsvgx4n4rkameyhvd7t2n7a", "32900765481109454848"}, - {"evmos1fgla49g8as9tecf7vv2fyeynj2y75yv7xwsnj0", "31973201071054454784"}, - {"evmos1fgnlejt28xjf7z6xcs4k95ka8sr23kw5sv9n27", "2956426927491249664"}, - {"evmos1fgpta0yqvqzkld85gfgh4pg7zqs39hk4sgnrre", "4373684273334255616"}, - {"evmos1fgt5fk3qpfhj440c72ye9u40ewn80mafdqh69s", "13843845143069696"}, - {"evmos1fgts2cgjdgwhvkntszsgrkmrn9z63dfm8ljgq4", "396146954906291200"}, - {"evmos1fgufmsud5aw5yt7nuqcmrd7gyslu45p4glalx3", "279845950022540288"}, - {"evmos1fgwvk079pys9a3zws6n5rw3f4dn2qm69nax0sd", "3515608012138706944"}, - {"evmos1fgy9zwehu0nzfndgqs7hxjxltrmz0u8l5mkf3v", "3529160533665595392"}, - {"evmos1fh2p2kffhqn3y5tmqpk98g94lywf79flcuuswu", "1343755784958442496"}, - {"evmos1fh48hpe32dajg08tkxwdwcfltvnhu2dmcvvqlc", "2463183634380022784"}, - {"evmos1fh4tdxzser9wsyswusxtwv5k8stjm6tkv4nlqt", "3058585042741736448"}, - {"evmos1fhemmjq82amkyq9m7sf0wj6t29pu0wnanlu3dq", "2268549282282713088"}, - {"evmos1fhepkf0z2t95ffcpepge9qxvuuer05lc67j4v9", "22456406351084277760"}, - {"evmos1fhg28puzfjr0dqkuffhfx0achngkqenvp9nzkk", "5448059533430784000"}, - {"evmos1fhkq6pzfzakaq2pzs8rrdv9dkx575vjnrqtvsd", "384462538222563840"}, - {"evmos1fhmvmz2ua8dynhq45vqpyu0gn94xkhstd4vyzt", "138339710595114240"}, - {"evmos1fhqt030rcmsndlky9l0ncn9kwmchnwqae98ez8", "686090373158654976"}, - {"evmos1fhwrc9u0c5eq8m77ld8z6atx3pscc59wjp3mhx", "171454193051645184"}, - {"evmos1fj05ed05y9p45p8h2c44wk9eh5f0x35qulv6cu", "37553783153643143168"}, - {"evmos1fj2tqyh2w7myreqfuzx4w0p659vmvye899pk7a", "8721099416213553152"}, - {"evmos1fj4u6yprps3jewluxdy7cmfl6zutp04ujtr0an", "4820841057504950272"}, - {"evmos1fj733m99gfrarkhhduzsxazxh8fjpghrw0zl4t", "16523757701160359936"}, - {"evmos1fjfftg82ugfv2tyew2m42ekhuchmlk526tyneq", "6068964519959695360"}, - {"evmos1fjfx50s7k6afw9gdx7j3h05us76u8gj4e3sc4w", "19301557057968709632"}, - {"evmos1fjhqkrnx58z4zd7lfgghtsdxzt2ytyh7m05rvp", "98443959128625643520"}, - {"evmos1fjks6jqf4298scymez2ev682vf4k3ntcskusc0", "661947778781861888"}, - {"evmos1fjlwpnn6d20v6qv87s8n8lfcdezw6jxg2k5n8d", "1154775111297239040"}, - {"evmos1fjm2h466ezukmq77huq7ldk84fwktc0au0f3lj", "2803266369984915456"}, - {"evmos1fjm38q5mqvw6e84uncff57f3jf2t5dzesrrcgl", "17009981285539129344"}, - {"evmos1fjm4aw40u2l9rwqvyq96qn7j8y4dkknl6myvuy", "42923515671231709184"}, - {"evmos1fjmteuh77u5kd5lwjnmndzhq6z3w5kw0gph3r4", "407712386451486720"}, - {"evmos1fjsmkrxruqugk58uk6ev4fwtvxy6lwynhyzpt7", "3310907781621248000"}, - {"evmos1fjsunu404hv9cr5rj7f2fe5nqh72zncp6zq9uv", "432258214373286912"}, - {"evmos1fjuqncn0s8ep8x68u2kkt54dma03gerlydcsem", "5241396537226903552"}, - {"evmos1fjvrwlxwrwxvzj2vmjcg0rza74mdl2rscha4ld", "17278633799913308160"}, - {"evmos1fjxxcwnqdxn4fx7umkgyxafugzeq6xejgkq4s2", "44275037562472398848"}, - {"evmos1fjyhx47zh0pk5r7vygfgydwsnptwtwfq7pl44z", "1907580263466298368"}, - {"evmos1fjys4ty0sr5jq58g4g8gwzf472u5vmlq4tytcv", "233759333702386688"}, - {"evmos1fjysmss00kvaqy6nj6sg6p732x9ytgwau2t8sg", "3961870379433764864"}, - {"evmos1fjysn0lcgzrnj79m50y9ssataw6zan5wt2ensw", "792388596655566336"}, - {"evmos1fjywjplkzgkff54yfwpkyj2335a8v29qrdt84s", "29358098517264175104"}, - {"evmos1fk03kw6adnaw6yctx2kdpu3f8gjy884lkx9jy0", "1314462301645629952"}, - {"evmos1fk3nenhu2cuvg2zr4m90m6a96909stgyx7jn93", "52055245020167424"}, - {"evmos1fk7eqgrpywf4g9d7gh6xus7v9ewpu0dajl2jkj", "299404177243457280"}, - {"evmos1fk8m3de40el4gy3cy79r5kk2aukldtpzwenwm4", "8641451711114084352"}, - {"evmos1fk98rml3tz823j2ncudc03laslw2d66qhrh5fp", "1894480691548267520"}, - {"evmos1fkcelrmthq2ykx4xndgm6jtxdzsa2q9evslnj2", "237458334254714454016"}, - {"evmos1fkckfgva2sfanp0jjnqn9gcax6m2xhgsv0q4hq", "316694141450633472"}, - {"evmos1fkdeq56vazj9skpplu4gn0mfelajtjcq4g0zf6", "23698054590317105152"}, - {"evmos1fkp743evcq3w0e3ahlp4mj7hka9hh0pag7hpqm", "721419335984891904"}, - {"evmos1fktnr4h9wwhhn6yycysnxc3yn9uq3vuzjxdjk9", "649788554663870464"}, - {"evmos1fkxurvgqyaxlfjhs33g4suwghe38c2f7lkld2d", "39757826483118702592"}, - {"evmos1fl2xa7k2wp6pmysur6r5gndgztfdr33czzkmcj", "17805296061910974464"}, - {"evmos1fl3ymrp85xujaqlzw94y02anzfcr4udntzax9t", "14336425752761743360"}, - {"evmos1fl6009fv85cjatwunztd80v0725q6rq759r0xv", "404886688426454016"}, - {"evmos1fl6zwwslq909myy5ku6s0ysmuu2qvahy0cqpyy", "11077963324681068544"}, - {"evmos1fla9a94tvxrwuvun2egs2e92ln9uwemtc277q4", "910647786552118784"}, - {"evmos1flkmzw986lc5yamgaat50wu926e49emycp8zr4", "956913743132350848"}, - {"evmos1flnt7p5g96cu0mtrmcpvjmmrqgfm3pewknpkd6", "4995563849943250944"}, - {"evmos1fluern95pfqfd06fpdr7gfqjzrnee5pwvf49gs", "7712256565089271808"}, - {"evmos1flv4225d8u6ennd7p0u30rstlj7ev7he8n3nt0", "282928035428820992"}, - {"evmos1flvj3q79tqqsq7cm3t420t75rkps78sk3aa6kn", "88376073511381811200"}, - {"evmos1flws0vffeljxvv8a4pz5pj3a3uc6gedp0rxmq9", "586192065972482048"}, - {"evmos1fly4xkdm64evp0zcp5g33ernj00kf63a3fcw3s", "632593325135400960"}, - {"evmos1fly9xgxderdzw52da288dnr09zfnj507vyqzgq", "195293175876178870272"}, - {"evmos1fm04xapv6tt2s50zal7m3rt6zm7hm6z965jlrh", "180496689752254464"}, - {"evmos1fm42xww8xjsalwc8nyaqpdhee2a8mnuh24eeaa", "9539308420088954880"}, - {"evmos1fmeehxumnkrmwyttf5ssgulyhu29z8vfyd3ltn", "5468971142097103872"}, - {"evmos1fmggxwjjzta6fm0q673q68qdcyelqvc7n59ur7", "314929293245996544"}, - {"evmos1fmjc5dv95s4ge9r6rhn3sntm7pwjw0ttnc3zc7", "38274316155716435968"}, - {"evmos1fmp5wn6tpkcnlfv96fqph8h3mar37ajmgtsk8z", "16803242815633387520"}, - {"evmos1fmr6ahk8g833dml8cpzrwv76j79rr8w90zvfz5", "34586436383559860224"}, - {"evmos1fmscklwqzmceecjsrv3e3z970hhk9scx38nr8z", "38001895319532912640"}, - {"evmos1fmsdf82rnk35f64rtdpsua620wucde37rk7fhg", "764701321545602048"}, - {"evmos1fmt4qc80r0f0kt0jckw8pvug0ulxu9erv6mjvw", "5410799184094599168"}, - {"evmos1fmtcvd3agvs8sr3p4c7hcfe9k3zz7hvwctq90e", "1707457113215762432"}, - {"evmos1fmu0k0hhxcmq9ya580my68p0a842yskumvrjwf", "2152571001714958336"}, - {"evmos1fn4hncgmm7allddvjqkhk5xspvennp6mn55ulw", "81313478491912192"}, - {"evmos1fn6mtf6gz6np78rqxfsu90r53g7a60v5wakw7u", "346367462234535680"}, - {"evmos1fn89tehsngza6grhs9unxqvud53suev89fnddj", "86632840963269632"}, - {"evmos1fnar9t704p4p4c8wcmr7t0rcljvat6rhmaqff8", "1598012496540874752"}, - {"evmos1fnjj5aaf8etlev8dw4trxmrczv88vmww4h3p7y", "3876038050857964032"}, - {"evmos1fnk354hx0n05ajeu0lpyk7rda0g9tll7wyscj8", "4484464127352532992"}, - {"evmos1fnl879y8088lnak8vzl4jrzm98y48ugugxd5rv", "18586618492254273536"}, - {"evmos1fnsejrcajnqwgvc3vv8aap3zth8su3kv42qynw", "45260230354145853440"}, - {"evmos1fnumytzzf77dc069cqscq02lyg5ez3aesqwjwq", "384502591131419136"}, - {"evmos1fnutuqgz0ttxcjferqd9hrzm9v5pwu0s6ty4en", "30413446749576732672"}, - {"evmos1fnwpn6a2fsex55jhpjhq5l4j99h2vc0e9kkldq", "6324351759958731776"}, - {"evmos1fp3lcall3k4yh608tfyjkq9ylwknqvahh9kph3", "83962884336031563776"}, - {"evmos1fp46y97jfay4uzaysa2kg476q27x8hc48kfj0u", "2714971552556646400"}, - {"evmos1fp52umgwjx5e9yn9r4j73e08hy03ss97pe4x07", "353111175081395200"}, - {"evmos1fp7tlmh6trrmy3sne07z08mchwhrpyx3elpgrl", "100970992636230400"}, - {"evmos1fp9dlk3ty2mkzzgg00llevw3yruwq3dfq6dxf6", "13547526888480038912"}, - {"evmos1fpapla8nsdrxq5xpqql3ykjeqdqj2yyucwl2zw", "23095497428940800"}, - {"evmos1fpcu25ed0ft0wr6dnjza6ct9jk3g6c5xdjt32z", "701086663574528384"}, - {"evmos1fpgavz00m28j5wjyds37688nfh8r9a5fwpcyyq", "50047673585475272704"}, - {"evmos1fph24dcnvzsw0wk7yfgf4p5ptvdzatdztjznl3", "741157047307542528"}, - {"evmos1fph7kxt8nyyt849hj5r9sx646d2uzt6trqv6jr", "406227291661204224"}, - {"evmos1fphefqedfh0eltvfdg8d39ede3e8822qfcsv5f", "1007078081207291904"}, - {"evmos1fpp0vtc45v5csv0qgx9h5extj6l9x7fqx6x038", "4453645600136757248"}, - {"evmos1fppn7xgf75ja02uznwk6vcd4ytklmv32pchsr0", "83966867895814422528"}, - {"evmos1fppxmy9lfq0d4we32am5qfnds0wrggfv0xdrmh", "478313743189591296"}, - {"evmos1fpqtqfq9t4ze2xtqk67358a2n7207gcxnc98lz", "673453415684524032"}, - {"evmos1fpurpaxp3kuer5w77gmadlzknldnh3k800h2d9", "369457543353863168"}, - {"evmos1fpva2qye95qtfmr32xnqdpljvyxzhwhkz0jlhn", "5136077733821255680"}, - {"evmos1fpwqfl5r2uqxselq5757ew2p72meglgswue8dz", "42611752334146093056"}, - {"evmos1fpws04cy28d4kyzsxzf00t72zwygzwjr8l09z9", "358337256932497408"}, - {"evmos1fpx74twqmx8sgcl2hxsh79sz4z0ppheq3sh36v", "9352013700191981568"}, - {"evmos1fpxlz600gnm7d9klxsvgra2vdefmuv8y5enpk3", "5136364764686349312"}, - {"evmos1fpz3jewljudlwsv9zpnefds6peakynnvn3lgrh", "1002683388558429696"}, - {"evmos1fpzk8dsh9cy74kmuxv6u2l80ve3wgnl5gn0wx6", "4905176268425631744"}, - {"evmos1fpznndzplcuv7y58an0evr83mf4tkd4l00xt7f", "866643730614499328"}, - {"evmos1fpzxxr2le53zw2gu5dklnl5huw7mr2un5fvyk0", "11664731677364785152"}, - {"evmos1fq27td3w0xjhu0zgrnv2l393un7c5edtpwwr3l", "1675816028885589760"}, - {"evmos1fq3qwyasce88qtwhh5zpdsvy4zzy76r08jrsse", "12629233203846070272"}, - {"evmos1fq4qpv6w5aeyp9klh837ezcdsuawajqdnpmnhx", "300705574426222592"}, - {"evmos1fq4zq9n86wzc4tf7y8neluv8zfc3z35ygn40hn", "2171733222269201920"}, - {"evmos1fq7rkz8ux8gmvm9jzk4t9l98a0vzg8pprvha83", "4637522560040845312"}, - {"evmos1fqddz85hexcnr2zv225g7vm62q6qc2pq5hxv0t", "51987040405222555648"}, - {"evmos1fqf06rcuenzfdh729d9yg0vjd6agyvp4npqf53", "152138105020760064"}, - {"evmos1fqg9wrukud9s5znpz0lw38cufgvj2lr7c2nuyn", "38828954149575680"}, - {"evmos1fqjgjuhy322uyu5vqe4k5ln9m3tk6m33eqxz9p", "96431946651226368"}, - {"evmos1fqkell6k2x7qqwgyffhjlkxquurxgkpv705vee", "1725765344899782400"}, - {"evmos1fqnmj6tf98j2v8ldta0xgm85dxreqz6xfrq45e", "3449695880363450368"}, - {"evmos1fqnza07d0ysy5jsp4nxzry6mtjylkr68pq9ezj", "2246635896294178816"}, - {"evmos1fqpa0s7mwl8wm5vjjawrcs3vqfs045xumcpeaf", "5635587904956788736"}, - {"evmos1fqu3ukcmk8l2lslwe0fggd0np5jrrgmdgryfln", "7738639913439728640"}, - {"evmos1fquq3rrqfgumnvh046m7y7z9j6lty9y35kaz0x", "7961118200868962304"}, - {"evmos1fqwh06qspf9hy80ngft2zs9cuxdz87wwnm90ya", "9600908089348624384"}, - {"evmos1fqx40hpq3l2vtg3sduxgv9rzzpfm03jrdm8v47", "346385522718748672"}, - {"evmos1fqynjx0dwmr73appw8e866lsc2l2vvxghv7ez0", "14314327293257891840"}, - {"evmos1fqz2cxayd22zn8ncfqahmnz3ncy7qg8fgkkmef", "923652882303479296"}, - {"evmos1fqzts0r04jc4nnhaxu9kr8dngsc3xas9f08xsg", "1426833443772113408"}, - {"evmos1fr0mxcuhl0nduzn67suqnu20v4rc7nwda6ax26", "57795175184218062848"}, - {"evmos1fr259hfhe7d76uvg32kh0u2afyxanagczp8wq9", "17798879468893734912"}, - {"evmos1fr29cdg0xwrpx8sn46whagncs9w6c3e9mlzn70", "18292291727734091776"}, - {"evmos1fr2ty8nw8vuuzwmexnnsaphe4zlya5dklfm9l6", "522693276084534272"}, - {"evmos1fr805w6595776mps7637wdsk69fhp6a0thn9q0", "2868153724213059584"}, - {"evmos1fr9yvwh9qrxqaff4spv9vacfchs3dzzrs3mm2h", "99407160832554240"}, - {"evmos1frfpz87wu33034l9dmms27cqq647y5ma40k0e4", "36363069336220147712"}, - {"evmos1frkden8n7rua56vutakh368rk0udmx0j86cve2", "4961130620567588864"}, - {"evmos1frkwn67tl2h57hrgcnce0txnr0s7qx3nk4fh3t", "2608346604126458880"}, - {"evmos1frlshzxfwnl2074eydwj9f67mq0xyu3dgp7gvd", "317276770059016192"}, - {"evmos1frr7pkea45l7f6c9zwuxlewr36a5uru3x9p6l6", "383491523856818688"}, - {"evmos1frrlv40a0j6ckrrrmvu8d5x3hqv3vhka9kqc66", "840626619567336448"}, - {"evmos1frsyy7nz57t878jd64rfqmh2xdkmqe6a3543wk", "422036667797510656"}, - {"evmos1frwyth3z6r0y6vm4kwlgv7zeahtq5mtynlaj6l", "698868182558418944"}, - {"evmos1fs2u3y9k5f2856r5j2j6qwfv0egla7ezck6vqg", "99650231261806592"}, - {"evmos1fs3w876k4qjfh3yvqzkd6dk2jzt4w0gxdvk87q", "6220189335124115456"}, - {"evmos1fs68kzluh00dd35qeldwh6ww5xe223ek4lfvw2", "2624440681238116352"}, - {"evmos1fs9447xq2zskhv6clte80ghyk2h4rxe0wcdcyg", "1903268274343510016"}, - {"evmos1fs9ennxwkht4wenkvamy40lx7ef27zu3e67r3p", "471482783513819136"}, - {"evmos1fs9mucmcv4mtxsq59244d368g7apvyth2pugs7", "182655955246625280"}, - {"evmos1fscmxs3ejs3udy5k5xxnwk6tk9w24daj7knya8", "403550373472664576"}, - {"evmos1fsdg7txh0w92aap0qum2xuhxvayuxk4sqfludk", "74388950335238144"}, - {"evmos1fse7xmnypmj5zpmwln4j3zqzjwxkn9tcwk7hx2", "56289560713774825472"}, - {"evmos1fsfhrcn3m8ez6q7l4g7sc32lqk2sxzsq7yt635", "44903356878013743104"}, - {"evmos1fsfxxfscvk0qsuc87wmd4lyahumxdr5fm87dh7", "72971752091512496128"}, - {"evmos1fshdgq8xjfg72jxf9sjvh6uxes6d0z6gtap3gl", "1036772543326622208"}, - {"evmos1fsjremvn6dyg07cj7el77a5fjv7v0glwv84ptk", "3215612721786735104"}, - {"evmos1fskzq4pdwhsgx2xjrux8xevz85n49cru8xfx6d", "173530184556708608"}, - {"evmos1fsqgp5c6llmhs8mz7cguh7pnt54deaun9v4t0d", "36385414700461846528"}, - {"evmos1fssugfhgmmx33kfqm7sytj0vc9gemxc9qwr4sr", "24738380804989952"}, - {"evmos1fsv4t52y3l05rp72z4pxpgq9ynzpy0h8ng08xc", "2821181412367226880"}, - {"evmos1fsvx5ycrt226dy6t7hxx33yvjps7c2hjhca5ct", "2167067584466067456"}, - {"evmos1fszdvw60q5wntx9k3ayte9dvlsmr926yszfave", "1350525445336428544"}, - {"evmos1ft385j5t7r43zl66e94mke734gj090k9zskq58", "10125054879402344448"}, - {"evmos1ft462kgxxy0tymak402v3m5v6puqmmgy20te6q", "1178136845229992448"}, - {"evmos1ft4fhnrfjs0j9pqjq7nnuvg2ufwer320smpqrt", "544089875818901504"}, - {"evmos1ft62l8rtt4jkft4rd6yddwp93mw0fwl7m7u67f", "18409411119341494272"}, - {"evmos1ft6vtkcrk6cd7dyrpgeaat9wvhmgjz7mvwm85c", "11234033192925685760"}, - {"evmos1ft6yhstjxq3k5dz7nnhqahx9609mvyfpudt88e", "3718155066055174144"}, - {"evmos1ft762sap70ggfwxcxgz4ljkmhxjte4qkesg9a0", "30564942212800925696"}, - {"evmos1ft7crru5fxpqvfc4fw8kfpxyjcpv2cj0gkgpan", "195208995009721344"}, - {"evmos1ft7tj9lw78mudnxeanmdvmfdt49swzyxn6ta3a", "221482529515341824"}, - {"evmos1ft99cm7la5rqehxmrdsc9u5763qwzlv67zcnex", "224027567618382080"}, - {"evmos1ft9d9pyw9uja7cr6jkxf3xsvruchujrvszqc2m", "2392748986287734784"}, - {"evmos1ft9z8et40g45kcu6thk5mpvr95en9xs8u5vd54", "1938854928163332096"}, - {"evmos1fta4rmtjt5z320wgnwukrhyqxtqm40kxjruqs8", "2915997815876275712"}, - {"evmos1ftau5t2ehrycrmcjgajqz3avpa2xwdktf96275", "287250641487886336"}, - {"evmos1ftc6lsj3dvl25p4yv30mz6lumsh69zgx208fcw", "15583782383489273856"}, - {"evmos1ftcctrtrexxyv2g8vlxft6x6u6c73qplmhcxmm", "1645228652280307456"}, - {"evmos1ftcwdnurdxy00za7sv9zszl9ttg5yg73l6n8ze", "1372464726782696448"}, - {"evmos1ftd9sneptmrha4dzp4dfm4hs3nu7e3h4d8u9vc", "10039543194742071296"}, - {"evmos1fthkqs5fsjrh9hyk2frklqrsylwa7za0ql9nl0", "2913057825619538944"}, - {"evmos1fthlva2wagl0kjfpllltx3fwrrh4vws9nya628", "5572458488292378624"}, - {"evmos1ftjupwr4a8qtu20s0wt3mjfmquf5jsvwaa9l38", "151419526177083904"}, - {"evmos1ftm8ht9dp2eqqaf54pjy4vwdh87exrx68ql8jc", "10066324234414579712"}, - {"evmos1ftmrr32sfaajwwz9lxmdt6eenp9c47y3eln2ed", "437807930406952960"}, - {"evmos1ftt0t7e6elrnvmaqc3wwme2v8x243lpqew27z6", "60192112416864518144"}, - {"evmos1ftvszlqmgghq55scejd9rnp95u5pr4mgnntp8j", "3581694018369949184"}, - {"evmos1ftxc8l0wjwlrekz8fpv4vfy9t7zmu529684yn8", "2969227496182622208"}, - {"evmos1ftzvnr5c5mk8l4p4sxmx9q77e2z67lqef00rhs", "693065364360955392"}, - {"evmos1fu4cyxgfnzjplyzm04532scxjujzeqh94d3t6a", "2457835993004367872"}, - {"evmos1fu4xd4u4ekj7hckgvpf8jr9clt5qfud9r5crhp", "1913114415951310336"}, - {"evmos1fu6rasq7txgfpy677m4h27zrtxsz5y02afedrh", "1041137026127519744"}, - {"evmos1fu723qk8z8t0qf25urfqm8qvkzf5pjwcgydezw", "7022714056654405632"}, - {"evmos1fu85tryrmslqvl57nuga092unmgnfevz37l892", "1133486559675540992"}, - {"evmos1fu936wvwejg9r78fkzsa74fdxfckdgxrrmc59l", "3603899966838029312"}, - {"evmos1fuc3mux9dvrpvhs6xg0pydqq3r3qj32d6gsf9e", "22160903701517991936"}, - {"evmos1fucesnmhajla3l34xasg4j5ynnv0qw5jd8959k", "16205723373085765632"}, - {"evmos1fucey27ptp2d74zrr8yn3ruvkz7zczdqfmmpwc", "674309862930137088"}, - {"evmos1fufa7tdlhvfv2t6372k4ed0zthhpvgqs2mrpwn", "1694064337964781568"}, - {"evmos1fug4jk678ueaydcv83wcu4f26rv6nxy4lrf2rf", "19631296340514246656"}, - {"evmos1fugq47gpmy35yzyukw62l7gjlr0egavf5rqmn7", "384492501976935936"}, - {"evmos1fugvjne73hj5zd4rn7jlqflr2nuv6wwvykfte3", "36712994903464509440"}, - {"evmos1fuheg59fq92r978l6d3pn6yrfr5925t90ref25", "20620062506360520704"}, - {"evmos1fupdhh30zynypejkhd2a747m8ymr374usaayne", "414611125359198720"}, - {"evmos1fusugqpgz5rx8rylhclkx0svcz0ccj0f3qgkj3", "2906553253558575104"}, - {"evmos1fusxrvtgxvjr2w0r4dxsw8umq3ntw8n85zfp9k", "2942233684624179200"}, - {"evmos1futeaeat9nyc9j2l8vcpzzzxgyunyc36yjy7gm", "6165303056332560384"}, - {"evmos1fuuht5d5g9lwu9fjd6cnuew72qkqs2ce0ch5ar", "4284374748757645312"}, - {"evmos1fuvxmtlnn869wmzatztllyny482820af6ahjlk", "1115279922529563904"}, - {"evmos1fuwxsu4sm2fm4s0p8s9j0u2cvwme37g9j8gefx", "28197061022753742848"}, - {"evmos1fv0cscxmpy3ym5xn3c0zrwmqwasej3dpudjnqa", "109420735479367073792"}, - {"evmos1fv5xw42afyqfek4z22r7uw7ttwuwxgnze63xpf", "2613300128226246656"}, - {"evmos1fv63gf7u0qnwthqqj9j86gd0tms047jlz5f864", "1225647952055897088"}, - {"evmos1fv6ptv4qjd0cmtctp7nrf00ckqr2unxcp9ql9u", "1641395422888029696"}, - {"evmos1fvc6zfrqdjdd7w8v3uw8w8k5st2942qm462v9j", "4986642184670019584"}, - {"evmos1fvcgz6th5lwmnpzs590m7kjwp9xw8d2xftp7fh", "54670364283514421248"}, - {"evmos1fvf7uzhffd620cpj23k0dsr6gkjamn4q6t2rq0", "3623720199744534528"}, - {"evmos1fvg8qlkfzu678ekykhc0n3xq77xj897pva89rn", "3723189350321622528"}, - {"evmos1fvh7ug87aczx0gmfef6l040g26kzvp96sqsghs", "733102163555405824"}, - {"evmos1fvht0le9t39p8xwyj5rz3tcksd8p696ltg92kf", "4785362076388063232"}, - {"evmos1fvl6g7sxvvlmu78ez9p9vrqhp6r6plym20jtrg", "171029478677385472"}, - {"evmos1fvlfax5n8k094vehxdcmzj27j7fr7qpq9la02w", "2798522767391106048"}, - {"evmos1fvp9rahnrsarxl4z0jjvxcxtz6dz8xr5zlxt8v", "14005029099580973056"}, - {"evmos1fvqa4jlx9v3h8gx8gqzqutmfuvfg8t9z8aqfja", "5734493744883548160"}, - {"evmos1fvqjmcq6yd2prtf52rg3jghjpvaj7mjyxu3f77", "36876385361121099776"}, - {"evmos1fvqsdayg98yy9730z74y6ce7zkjfr8l33kl69w", "217302345947009024"}, - {"evmos1fvrguk3eutqys6ppldam43r869kwzeqcje45md", "2600959923022479360"}, - {"evmos1fvvpq3hmsahwsn64nh7s8lywkac6kp3l23p4l2", "384250708673831168"}, - {"evmos1fvwdt3qwke63myey58w0dwmsfl6623yc6h2elx", "2099411844076352512"}, - {"evmos1fw0pm3vhwewlh56lqa0xnmw034ek5a9q3hwq9m", "2829741881590739456"}, - {"evmos1fw0x4fpyyep56x4v6ws37ylugnhj2ygknpqqgg", "318465156480741376"}, - {"evmos1fw25s7h90rqv7hrmp0fefctlqyelx78ddyt5dv", "1316896011395582720"}, - {"evmos1fw2upl3wfu8mrdvqyhttnl2zrpg8rjvsyqaftt", "1327044552682683904"}, - {"evmos1fw583eqf65g80jmrdut6fz8tzpg2ra0z0qza4d", "5302412712296310784"}, - {"evmos1fw6qyfckv7396vvnt5fl79wj4rudppzkjj8ekh", "2758690440507013120"}, - {"evmos1fw8wqfyw8ngg4z0c05g39jvej4a5yk6l8q3hh8", "4718483874862137344"}, - {"evmos1fwkm8s50wp3jpued986e6cl06xpvukkmu6cxaf", "99811963297012224"}, - {"evmos1fwkun0jl2kjx09hgfydtzz6xu5gv83ahncjg8q", "2853148065621583872"}, - {"evmos1fwkzratchm4sdnxx62lsem6kcrxk9ac5teqyzz", "1017446940595699712"}, - {"evmos1fwlkfhld6zd4748nrtz08l6xuaj3pyantayel8", "7403343213510375424"}, - {"evmos1fwmf5vlsp8wy9xs70lla2eu789ykhc50laqz8y", "11773629950260215808"}, - {"evmos1fwmjwlgsd3vwd3xq0jmvxes4vlz59lfjwf0wk0", "12980805013739790336"}, - {"evmos1fwtn2gtfacmrgt85qx3uk93g2wsu43l85f75fm", "97797574416664182784"}, - {"evmos1fwv6y600sdtdr4yswvjryq0htx97hphta5jyv3", "16083597809759533056"}, - {"evmos1fww0s73amy890n0f8m2cktr88mjz9fa7dywt48", "45018776556859998208"}, - {"evmos1fwwfa88w9lgs2fekz392tzpsfq8ewf6lnyjyhp", "1789713985946831360"}, - {"evmos1fwy24jvx87wqea6208r6rfkpjv23eampx2vwff", "23213550543623651328"}, - {"evmos1fwy3p89hnc6relul9peh47ahc0fzyjf7nvv99m", "1121107507550300160"}, - {"evmos1fwykrvlaeexv5dtg0fx79hv605nup580w59g20", "464042644398902784"}, - {"evmos1fwz566enes9u6sm3v3dfkz2xv9mt9kxw5zvlmv", "3253590455844841984"}, - {"evmos1fx3ht0yn3c7vyxzwrvdn5hevfvuxmgk69j2e7f", "3959138002614228992"}, - {"evmos1fx4x66gv39dlnlqy9m2dxz5wahf705n8qxv5m3", "1890244392176607232"}, - {"evmos1fx6ncgx2hyvg2dgc28v0dwmemrjw5jt7hs553y", "327001557071422976"}, - {"evmos1fx8s9fahg2w2hcxwrjma94qjl0k5mfjhfwt68d", "99084481022739464192"}, - {"evmos1fxeyqspuvegfzhauzjlm6glvegplv74nv3k0ey", "7000649404344997888"}, - {"evmos1fxfqklrtxqssky2zg5pe3sgrkt5r2d98k6cxx7", "3336397442205582336"}, - {"evmos1fxk62pnq8e9qtx670jl4e5fsrh47qxt6qyfgpy", "181009940597997568"}, - {"evmos1fxkutpvm8zggu0mqdpk5z33ahfz5x7czyl9d3q", "8361427888944990208"}, - {"evmos1fxl443wyjj0wp70wtg7szhatw4294wq3rccnya", "223405798521121792"}, - {"evmos1fxljr3gr2u676m3da0ya23u2fsh04vrjh42wl3", "1313650568809162240"}, - {"evmos1fxm7xewgtm84pjc2g4cfe0ak6dam7sarq823wy", "801202076074436096"}, - {"evmos1fxnxthh3q82ktd0ff95c7q4ym6s7n53zrv6xfk", "8918473099490545664"}, - {"evmos1fxs9a0qv0pknv7vqpkjynnhleln0esydujujdd", "6823157590118364160"}, - {"evmos1fxuc0fxjmmmfhg4y67kj9k4dlq0vygykx3kzsg", "2247424476313468928"}, - {"evmos1fxymwfhp4epewmry2ugmzdlk40s4wfrjk3kxe4", "1168905105923383296"}, - {"evmos1fy03pvnzg0w85nrgvccnt90nqjvz4snf54zffn", "2634930207075123200"}, - {"evmos1fy34u9wl4d7h6d6t59vfsde6qcwtgd2g03eydh", "803763770913305088"}, - {"evmos1fy3s6qzq9m25vpu2vjnq66uxtr6evzdpnjzqhq", "203988500439949312"}, - {"evmos1fy3w79myqrjlwapklzwlv6e8c5jhppjt2x8ln4", "3767680014340055040"}, - {"evmos1fy40en7p2crnhmuhw0khyxnpygd3gvgw20dpfg", "795957586110534144"}, - {"evmos1fy6qjuzwch3w628a4485scu9xg3g435nnkvzpf", "2516556998155994112"}, - {"evmos1fy9rcjl52ssxr23qgs53nswft8fn88xpe7yf4l", "6289474102501359616"}, - {"evmos1fyafs60rkhuydaezv743ndmwn0ue65d3p5kmqw", "416443111745968128"}, - {"evmos1fyh4642mht5xdx52ch2k6s5lcdyr2jtzaepy5a", "53668537961358704640"}, - {"evmos1fyhfmntgph865spzdgprstxrhzmelyhg9fr24a", "1133691073454585856"}, - {"evmos1fylau5ww0anl2n2xtcz93gprtewfpzmfv4qt8y", "124165982164503232512"}, - {"evmos1fypmz30pm4ycj7waaktj5epgxj4n9cpylxr47d", "1387467355388998656"}, - {"evmos1fyuzvvc65ls77ajr4fnnvfe8pmjj6zkcjnwqf2", "1544916486014418944"}, - {"evmos1fyvuxm6jsewsrpyeu70khvskzpa4w9524qjjsj", "375428358362769408"}, - {"evmos1fywafgdswrpzczeg04n4a86l6ad4tl6kqjw054", "6298753936713052160"}, - {"evmos1fywdp3n473dpjcqm7sy673wfwntqqqpp6vvl7l", "28814228662498902016"}, - {"evmos1fyxj6lzevqrdx3wwwwnzkzda2cp4xljt8mxwpk", "23397785432975929344"}, - {"evmos1fz72yrt3x8euv4rfufvp3js6kyanupa8n8radd", "964131942851974144"}, - {"evmos1fz8363jam2y9vc9e2y97ufrslgjjm888rp4m68", "4579434160967487488"}, - {"evmos1fz9pfv2fqvf7je3znh4y7yr0d3s0wnrxe9vf9w", "2373518665431720448"}, - {"evmos1fzeus5wgsmchnd9yaa2kgnvufw7m0jz8s20rvk", "243053050200061952"}, - {"evmos1fzf8laaedt4xek0uytezarl3xx84ed8kag2cdv", "384494484815864320"}, - {"evmos1fzgfwwgqr7snp6j4f4z4ppc5sfxzgea4wmcz46", "7848948927802123264"}, - {"evmos1fzk88hg6w7zxr49lz5cshe65nxk6rkx0sukmnv", "5011039606693552128"}, - {"evmos1fzkjdrrt5jrgq52yq7ax0xhtglhl8am43l2jte", "7470312373641805824"}, - {"evmos1fzkljm5lp0h4gpdjh9yshjpac49ns0hwy2zjp4", "8412284136727001088"}, - {"evmos1fzlzl979kzsjmgs04xrtstp7laap43v5mnhzwt", "9511672586721673216"}, - {"evmos1fzp26w8xsxcmtgyuptn6ew6es67jnlygv6jkv9", "7290434130539393024"}, - {"evmos1fzpu6ksyhaw36wsgnr4jwlrwv68umvch56fx94", "128371985894313984"}, - {"evmos1fzrrwlp4cu3k5s6gpn7aqvpkxw9mr6pl5xty7l", "1539823827922035712"}, - {"evmos1fzseajttsagtyt0tqjdwnytqjj4q8u7rznppw4", "3209504061385776128"}, - {"evmos1fzt0h078ge0ltrr864h6slhlpx30mdxp83efhf", "212951989143806976"}, - {"evmos1fztgl5unlh94h80q8fz9sf53exut3tvqnd9ag6", "6303724161530523648"}, - {"evmos1fzugltemf0trgxynvnn60s0ghz36tm4j6mpsx3", "102643022329644040192"}, - {"evmos1fzwhzae8kzt5qquj3lsgsh3sgfwf4ph7vrlxev", "4349763774115238400"}, - {"evmos1fzz439zl7fegch8459ns60x55myw592ljk4tl9", "7797116392796738560"}, - {"evmos1g05vc362v876wj9lmcz7m7m4jq98pun6hfvm8j", "1384239807449309184"}, - {"evmos1g06kep2v53l39meet3f49qrwwlfldawe73z2yr", "476030127238057472"}, - {"evmos1g06lhu9kq0qjwv92unjwqq4r4jlesfgjm2ugz2", "12180718833416736768"}, - {"evmos1g074d53my9uxj48v6esqf6uc9sfmtdtmk6qa77", "368905477391334400"}, - {"evmos1g083z90ymv408ejgp7chj2s6q2g7rz8fcher6u", "4363943997032741888"}, - {"evmos1g08av5jhv8a9x59gyrkas8s98vysqw76km9l2n", "772229250766908416"}, - {"evmos1g09tulxrw2slru09c7w08tqwrzk8c98q92g9wx", "2821502354527131648"}, - {"evmos1g0az7ggngqescswut3qn363jv39n75rzlvs5k5", "1252364358448089088"}, - {"evmos1g0d4a2q993ps82wyfq76xeql4e6n6dg54ufdc0", "1104363330961580544"}, - {"evmos1g0d8yd4gfcnw6v3hl0a7k9wuy97e89uqqs2pu7", "8362528063138959360"}, - {"evmos1g0dx6tdev5dhqshrrlajvpa8e7jdt5pmkv4qd2", "4691180741698709504"}, - {"evmos1g0ea4r86vq6fkqfxzzfp4d683a7amua6h3t4qq", "241674060167640576"}, - {"evmos1g0fq6hh60rlsu3jamgh9syyln7e690kw7uc2wg", "396278417711002112"}, - {"evmos1g0ge988w6ktcc6mvfh59j3sygy338tqza9unkp", "10815351366703390720"}, - {"evmos1g0jhw6hm0kxt6y007f2yvgehn2wt8ss0mqzhpd", "4425712678576955392"}, - {"evmos1g0mka3csexk8kyxzmmpw96e00zqh2xr6ra27n0", "2079750720498692608"}, - {"evmos1g0nanaegzyna4qpyj6eunku3mfy85kg5mmrcv7", "478000898842835968"}, - {"evmos1g0naux0q7nn5gdweu42vww94sdccj2htmfmhz3", "482113509036721152"}, - {"evmos1g0p7etm563rspfuzrul2tr82u45aw9vvccm7ql", "10608857102246144"}, - {"evmos1g0pps3rce5nt2jxcsj37sczd0haj9ky3lr8ucc", "7497725288687173632"}, - {"evmos1g0qdn40qczmmte0lgt5cntkh7te04k3m74erg4", "5167152462862128128"}, - {"evmos1g0rxfx4mya7sap795g96t43ql5p2xdq64ksnup", "1391246209737121792"}, - {"evmos1g0ss3vg8eq43z28n5ankqcpg4ukn9j9npuv9dz", "1308329296165473792"}, - {"evmos1g0tzyaq9rxhptdxy60y2hkzvdhn2jtx7vtzjmd", "3005764266175662592"}, - {"evmos1g0v0rresvjrx3sgpqp4n33aw6rqn8243y09x5j", "788980228711300096"}, - {"evmos1g0yz686tej7l3lhr0swzl9l5t2xshsexgj33w3", "9023053038534645760"}, - {"evmos1g20dw22m35zgu9w0wavccm60j7cw385mwmscwh", "5663395851531026432"}, - {"evmos1g20uqqxfv3gzacynyt66tje9pww5j3gp6tshm7", "4072619091990339584"}, - {"evmos1g22krhpvmmfvr67znrwxkh6v2l93gjn0fcs3my", "1827559431434766848"}, - {"evmos1g235yq84v6petnpqrz3x7wmjgv37kz2c257g7v", "74192784422848768"}, - {"evmos1g25elw07eww87q36f55hxn0hqcazql2pnw8vle", "111852823883451392"}, - {"evmos1g26hd0lfjfjn0nky4ql3gx5jqj3lj2dqwhjwap", "5631541186553680896"}, - {"evmos1g27xa6vre6uewcc33efszjfdmd6cw4nwscth2x", "11667985342944075776"}, - {"evmos1g2863e7x3r9569ja3dqljvrsgqqmdpekkatfym", "2819366708911628288"}, - {"evmos1g2aq20r462gdvu4j9mv6eaus7xjddqauzujmpv", "3000183444560976896"}, - {"evmos1g2dtfnk0gd8ccqyqcdmz0rkfll7xz8gsjv0u2h", "2753996126527446528"}, - {"evmos1g2dxxhk5mtu498q864qx63ntxj0vxsmpaellwu", "15251844724389023744"}, - {"evmos1g2f37u880jsz2nnjq7ynff4rlqgwq6yuss9v5s", "2699289666584512000"}, - {"evmos1g2h9vsn5wnsw4h7gg4jlc98r7rc4z9arm0e9fc", "1461285601701369344"}, - {"evmos1g2hymuuu8laftfhusd8pw5j2ze03xwsxyd290k", "204676771449959168"}, - {"evmos1g2pl6ww8pswwatlyzprc7dtglkwn7x46vvtwds", "467698458296242432"}, - {"evmos1g2pt9n7fz2uyeee94xt7jrg5qa4fecw6jerylw", "10258060114298212352"}, - {"evmos1g2q5e7cgkwslnlkavxxnte8z59ttgjyt7v32nk", "8695492777194493952"}, - {"evmos1g2rjul0sa8retdft97zt6cf55xczf34s78fzs3", "925835280800544768"}, - {"evmos1g2u58cg7st63xuv7kmsqumcaqv6l9e2xx9rcye", "12305232748590104576"}, - {"evmos1g2upkvn9a8nd42e5uugjn8zrc0554vx22kchaj", "5189140256830750720"}, - {"evmos1g2us85hpc7cvsgmk087xtyly4wtys2904uc9vn", "33562333239442202624"}, - {"evmos1g2wp42p3js9mpyuxvmkpz6xddmmsyecs2mrpud", "4621568569922498560"}, - {"evmos1g33t4hqgxl00ldfa45c3pxgu5cmkm38lvpa0wn", "195420889413580800"}, - {"evmos1g3783muz65jmtljev4nm292dy3fkr5sqe0e83j", "10087229505470423040"}, - {"evmos1g38nq4f3f2gdq4s9cvtay4fp53wgyn3senjwye", "384310475872807680"}, - {"evmos1g3cauk8kl2zzk4upt7ay3fxvywfgk59u0z9j38", "2277229354451382272"}, - {"evmos1g3dagrsg6mjuhz9d43dhqkk28r045n6xhc47zr", "493353874249124864"}, - {"evmos1g3ddvaa6j7p7hs0kwufz46tc3pvdde82vefq23", "14296628254998282240"}, - {"evmos1g3fst7ylx3hzc43d5mwmgt3xk89fk78eteaxrw", "2705078992561582592"}, - {"evmos1g3fttrf0mvvacatsshhkyq99la2fl0df9g0vh8", "385971255853383680"}, - {"evmos1g3hfjlm8z4lkq7y35gygveekfdsel3yur7mv6t", "1816515705761623552"}, - {"evmos1g3jpysr4n622aqmuzy323vfvuucpf6dpxy59uv", "8172951068240582656"}, - {"evmos1g3jy2wdjus4gka7e5dud7etz0u3mcnfsgzyye7", "2251261916004204544"}, - {"evmos1g3nja643tmazd2yuhnzzfcu0nk0le6x0arep6x", "255300620584970240"}, - {"evmos1g3pzpapmsd8j4al7nmpaledfkht6z6qx7ljjh2", "324067508047523328"}, - {"evmos1g3tf0lp2v6fz9mmy7qm94zx4u64llssytv4mfx", "411558634765226240"}, - {"evmos1g3ut6apvnq9q7jgeyqa05w4tcgcrulfnmq2822", "12029963210499266560"}, - {"evmos1g3whv0ahs7gqg2aurqusgdjch3hfe03r5yh384", "1654222063834013696"}, - {"evmos1g3wpszdh5aw4tlfwwgl63asp5ufl44tlr06qvp", "298479448968969472"}, - {"evmos1g3yrpsjqw8qu2gxxrkta7ftdkhf3twlskv4kta", "3210889429899823104"}, - {"evmos1g3zejyrvseschlkvffgmrv2rxr0me80ukuljp5", "4632709690810974208"}, - {"evmos1g4077khv4nxn5sayhn3vxqee9cg0ytrrmq06rp", "1010940806656727040"}, - {"evmos1g45jpj0sxd6tqhpvjp7x835q6yn2txjtet8tra", "1016202560352549888"}, - {"evmos1g47eqx6w8cu4u39pck2ww5c4rsushqjqn0r6rs", "2125485027221575680"}, - {"evmos1g47ql5ta8ymcxj2a89qu098sar05vxktv33v69", "2709533207036844032"}, - {"evmos1g47w0u6wmtturr8jldprrdg6ne4hndz3scl0d3", "318636675968131072"}, - {"evmos1g4995lmrwlzwede5jt39u0ymen7p7whwa3tkjp", "4135491528453079040"}, - {"evmos1g4alhf4s44pvp7xyl79esty5zzrdd9x22ztqfn", "906009410100369408"}, - {"evmos1g4dl9zsy02zcs5lpt7kssz0yhz7rxqqvssl6hu", "350145804098937856"}, - {"evmos1g4kmvcecw752a6307eade3qejj5wllcflgtyk0", "14256945147297476608"}, - {"evmos1g4mjnyuncyc7v0hzw3964kg7w63e77wkv2u3mg", "1896648841325993472"}, - {"evmos1g4nnpt078e3q7xlv9s0rf5hvlydwq4mtzj0x5p", "353615259191551488"}, - {"evmos1g4qv7aq2lx63a6ew9ry4s7gxhzca70f99sgp8v", "6318799855543070720"}, - {"evmos1g4sxumlhcj9qtynpv5taml5jwuet4pjdmn6wkw", "646326947358464"}, - {"evmos1g4u49fwnwawvfguwz5j0tvr5d4y0tvcsgxngng", "16465508570101374976"}, - {"evmos1g4vw79ac2tzvrxmktjygp2e36e57rcpltm5x65", "139576315036859662336"}, - {"evmos1g4w55vvfvte3kkvh4ugkt5tc0p5jvvjxhwphf4", "7371164666887417856"}, - {"evmos1g4whz396ee3hs3utds9hh2rlc0z3693h57dsed", "8943613689440651264"}, - {"evmos1g528dcfpez3dc6re7c96xunzmy2nw8xjksjk4n", "2812302648336613376"}, - {"evmos1g52pqq3kedk6y43ug8gxpss6dks9287lmpe7ft", "842050368059778048"}, - {"evmos1g559exv52axp4wfs96la8pze3jz6s7cwvwl5le", "12055684725548431360"}, - {"evmos1g55tsx3cp2e3ceyduh8ppwle5snjq0wa78tcqt", "1008971947788102656"}, - {"evmos1g58gvm8kcjfeg4g6xm3mskpj5v5u336776uqfx", "1541483348514357248"}, - {"evmos1g5dctu6mxdx2xxejtum5r3q80u2l087xfj9esj", "2918793961405540864"}, - {"evmos1g5ddrudfdlsvx0gkpw04h5uv039jpl5vptxemy", "39616844344758902784"}, - {"evmos1g5ev62pcf273ws9935hlmvse489ex8hqm82shj", "5449484868265668608"}, - {"evmos1g5g4y9d95jpdhshkkgr5ahxagrz020h3qtcct2", "6868479644247216128"}, - {"evmos1g5kaueaqa5m6l46365kdlv3guvz3qzyjntgkav", "18117461687466237952"}, - {"evmos1g5mjen5z3cv9h7cq39pvlep2f3wvw6n4fjv29k", "508481227157189888"}, - {"evmos1g5mmmf35whr5603gsp27ywdmu6j6w2wvds05zk", "1881550714248639744"}, - {"evmos1g5qpha5g8fnfw3ddvcflacrlmluhv6f640kkcn", "10201764354372741120"}, - {"evmos1g5rzahu2luzy0lng4st2nwyr9zdxfuwkhv2zs6", "17467079740180269056"}, - {"evmos1g5tcehjjytwxl07wauvm659v6tzwuvnzf7kknd", "9673942875644248064"}, - {"evmos1g5ywn2x48vkntrxhdquepw0n8fywnp0nfr90re", "2067942635016804864"}, - {"evmos1g5z677hz8te70qxmjm9tmfc78tjq8fryu5dh3z", "2198965808879641600"}, - {"evmos1g5zpvt4w0gly3gy4nvlz69quzr6afm6guff8fj", "1088498816030564352"}, - {"evmos1g60hl2ungwzhuzkw30562956cf9jfcuk46zumn", "90017701549983744"}, - {"evmos1g63gj6jvtsrtz7wemhu34v9fc37rxhmwq5tvxq", "2017781819132223744"}, - {"evmos1g63lkd7a87kjhf9kmudzkx5v505qtapej867cm", "3280534919770873856"}, - {"evmos1g660gvaa4gp2s67584j7m6z5cq36wr2jfqf6uk", "1825016399584581120"}, - {"evmos1g69xax65hgflhq0mc9t47wtt6rxyda7ukwvl9h", "1338353938229272576"}, - {"evmos1g6aq4a4uvrn040ve2a6ycptaqvw8yzkwekx4c3", "11645062684468310016"}, - {"evmos1g6dzcyge8xhkw2wkaunxn4y8t472ny4mkt8mpd", "3780648913949459456"}, - {"evmos1g6e4qslapk3wcf8jcssamfu745d4fardpwtjsj", "908131533406215680"}, - {"evmos1g6e4w4dggsswajvqks5p4tp4danknq8wncrvye", "478682362421761024"}, - {"evmos1g6g0lffvnl70e7g3m5hyuz43y2m0n7ydknu5mx", "7769948049939561472"}, - {"evmos1g6gxs56htg6qedfgjwc3ftle8u3tu6765cwen9", "12447065727358441472"}, - {"evmos1g6jfktq3u2r2079qfnyp6h5dqscncwz8ae6vry", "3630673711062016"}, - {"evmos1g6k4gluumscskgm8e50dje9rm6hqdc3hgjwgp3", "28719515114410414080"}, - {"evmos1g6nnhequasgmdc6tjtggcqwzycu4qxxkrjfhw0", "5076902176261363712"}, - {"evmos1g6p0pnx8h47dv69uxx0uapyh56e4yalrgdg7ly", "26364437011313278976"}, - {"evmos1g6pju7gaf3mf2x4vxm0pm79uzsgmw4m9z82j3s", "3318935200394771968"}, - {"evmos1g6qh9fc60mdz5psue2v5rvy0mjemz3zcht6rvk", "2431852171728972800"}, - {"evmos1g6r5hmutja039u5k3m6pmyc29raf5zn7yvpkcq", "3277595098288521216"}, - {"evmos1g6urp0evyk845ldkf6u6jecx4ygnyu274sq0sq", "5236316542872102912"}, - {"evmos1g6vjs7fhwgtudp5pa0ex29pceqr5zdc2ar69la", "20265183964111953920"}, - {"evmos1g6xzmtrgpurqp0uvs6m23wlleq0c9u2erncnhj", "182093682875415296"}, - {"evmos1g702jevw88qzsezethrgkqzg2y3gmqzkqxhfwm", "29471422269983055872"}, - {"evmos1g70kt3twunqxxq8mt9vg4fpun5sjpeccs90trw", "1391964576733103872"}, - {"evmos1g78l8lp389tdj0suhxtp4qnv50g6qdvcjzrx3u", "7025805689693519872"}, - {"evmos1g7ahf45fyk9q4yy5rdhycm72f9due0f020shzv", "4288220677215672832"}, - {"evmos1g7an6xzu9dzfmzjh44yf9sj4qgfr9ty8qdd9lx", "1780380699711889408"}, - {"evmos1g7asmmdwqv7adlekwq6xxdrtjwll6mccxyw0we", "1444181516429049088"}, - {"evmos1g7c9dd6p9ap78rcjxg655h2z2erug8r68476cw", "371579555973770496"}, - {"evmos1g7ff0ak2qzj494m708m4xrfzz64nrmzjak4wd3", "810284074182361088"}, - {"evmos1g7jmu9978gn3y870y6uehck295r9244nwttwdj", "473649060296693760"}, - {"evmos1g7k538dq45w9g0t7hr7c4yg94g20zwyeunmnua", "7834709846699535360"}, - {"evmos1g7laagqrs7q703leaf59q0n46775r5mdwccc97", "8030676757112193024"}, - {"evmos1g7nkw4eqly9y43hr48wdcq0yhwa8s95mly20sz", "384314424118280448"}, - {"evmos1g7qe06c5stetl5n7thqegrseckcqlth58zqzpf", "13881718432771624960"}, - {"evmos1g7s4vt7fyxfuydl6f8dmd7vj400s35t7l2qv76", "841175045627449344"}, - {"evmos1g7syf8vcxtm0g3qm592qexemanu8fy4u5v4scr", "6768092562469576704"}, - {"evmos1g7uv6kn69kvhyzm0kvdm6g72m60dpn7dw9c645", "10663263455976763392"}, - {"evmos1g7wd0lg603vwhkqk6n8wznensxq7e8uhahyqaf", "715688640944181248"}, - {"evmos1g805pnp7puuamg7t43ym6tap66km34n79fnycv", "49641634482037248"}, - {"evmos1g80cvampg5hlggd8yrkgpqc5s0x0e5uqtl4sw8", "232522236293394432"}, - {"evmos1g80kaner7uqa3s0pm6npnpqtf57h23cqfnzn74", "1827054461945575936"}, - {"evmos1g82azpjt2gjf653tvwmgrycr3lef5f4gphm878", "6467856952850010112"}, - {"evmos1g88mj67lnkg8f9y5gav95su8g5axt9pkf2t9kp", "6594622540356911104"}, - {"evmos1g8a0h8754qydq23jm0g7tequpmckgg30u36rn0", "400497160548793344"}, - {"evmos1g8dyclwr7f7kdt63x076jj5ppl8sj4dac4jtps", "2000776607533046016"}, - {"evmos1g8fcwt0aywp848sklx5apsf8s7gpkewlzkk5sj", "2137025897095529472"}, - {"evmos1g8gsfpnr9vazqhu8w63d0ag37pqqshj6zh03d4", "23267924277219016704"}, - {"evmos1g8hdxwry99zfradcfnamxupvq06zatzh5f0dlp", "369305859367371264"}, - {"evmos1g8htz69f7x3sdtufk28q54m2cxdr5tyzngu3s2", "1417715735036575744"}, - {"evmos1g8kquwtegwmzfrrzh67sl2sgmwdcjtpjjvglna", "49072861199747424256"}, - {"evmos1g8mdvq0a2pxg0l73twz5dsux833e4lgmm95zcd", "760134209987315456"}, - {"evmos1g8mv6ze9xj5tpj7wkcpvwd7j3ay7e6hsnmeufd", "36656152608241532928"}, - {"evmos1g8ptz7e0ha07f4uay7ves9py8n8gzt24nt2j84", "477946818386009600"}, - {"evmos1g8r3qsl02w3ps4frac90ylhp0g78lupek8fjeh", "1589044662748484352"}, - {"evmos1g8r43zn69lhrx2f32qtvnxa9tc0msza6gjcd6k", "385012718240440832"}, - {"evmos1g8rn4grdje52zna4fr2fnytjcjanmurh2a8knu", "10365358768242069504"}, - {"evmos1g8rqj3t020p0fvwgr4ekrr6pdky4trpdvwfz72", "856050701094227456"}, - {"evmos1g8sa8fp7dz80l3y9rnj2hjqasm329wzn88ezk0", "62213871005898752"}, - {"evmos1g8th0487wthefkfx43cjauapv4q0aggvj2m72r", "7458448579654451200"}, - {"evmos1g8tv6duvvzzejrhclm2e6n9cz49l7y549usnnd", "1085835674240997504"}, - {"evmos1g8vnhzm4u9w05yz48nsq2h3kstm42zmh92plm5", "13302275651654645760"}, - {"evmos1g8vupuhwrhz8c5c2739uy0jaf04qtulglcmjwa", "9155287380715274240"}, - {"evmos1g8x3rrfvyagqptwjzmpfq4csvxnl9n07w0xku8", "1050125967961567744"}, - {"evmos1g8xkxssv3p8lf4capqtfkhmraup7ccv68pzlcp", "384502591131419136"}, - {"evmos1g8xuexda955tl5qedsnnra0vaf87vcy0s2qrcq", "30442639281504559104"}, - {"evmos1g8y8xrz23gra2glzt7qvndrhxdlpd75utrwmzm", "1058867256958128128"}, - {"evmos1g8yak59h404qfrnsztwc24xaqynhwskgsgwyh4", "704142211837139200"}, - {"evmos1g935vqtxerj7c2d4jp42kzvrr4d4ncetdewc4x", "5105892855898324992"}, - {"evmos1g95nq4er5zul3f78yavjs79a0fgmdt30e2mfav", "5996176354416834560"}, - {"evmos1g96c2mxwymgqwknd5klq2mcfgscwze0zrt4vgy", "405165310953469184"}, - {"evmos1g9797lx7ux767uff9vdf3cgu3dmxcumzvhft4j", "1364122787329922304"}, - {"evmos1g993wtfuac70e2r4myt6zqulh03png336v0c39", "18421190096020041728"}, - {"evmos1g9cvj3c0zmr22rr83yaqx4ddu0suthj92g8e7j", "9929262793552445440"}, - {"evmos1g9dzmyxgrdrlsuh3derugy9zgye9g0jjadx79w", "384079334274242816"}, - {"evmos1g9e7avj9jhwwhmhu7h2xt5k48dhl6nwmywulj8", "4525056165836411904"}, - {"evmos1g9f205rner4a9kdd57rttqspxa7sm9yfv5tc28", "4109595427042768384"}, - {"evmos1g9f20mswzy8an5gq6vafm2e0j3u06npy0jyj0p", "2464227280651262976"}, - {"evmos1g9gn292k5us76k922wte6jcl389ktxvc2n0zqg", "590484866860813056"}, - {"evmos1g9m3y0mv6zt4ey2vff2njrwkn8ex7cqhs4pkqk", "1144305897124441088"}, - {"evmos1g9ptseu68hvma20dfkpx88tp22tk3wwaymzwkx", "5858903983946381312"}, - {"evmos1g9qcda632g0qfkwl42e8zqq4hur9yldrdhf9cq", "7698131548681021440"}, - {"evmos1g9qhsghxypagxsycjcjg9vngj5du295aymgrvn", "4569647488248474624"}, - {"evmos1g9tyuk209wtlkkrznx59lz5w4575sgc33d0sd4", "1270854865595643904"}, - {"evmos1g9usnuts845yzdxx24ene98gcsxqe2knzc7xth", "5367218600537751552"}, - {"evmos1g9v45xkkma3ej6h9krxr60g3fzualcw2wthaeq", "132419704050520576"}, - {"evmos1g9vn3upqywkkyz064ny50mnkgkmke26n5t7mqy", "234242245006875648"}, - {"evmos1g9yevvhdavph4wuc2w80ehuelnw4tdy6agux7z", "25741701308399181824"}, - {"evmos1g9yr7u9qa4wt2hzww5w8q2e28admdwxx75sh5t", "662759422868382208"}, - {"evmos1g9zn8an2sdvakgkrkarn8qn0mlnle3e0thvgh7", "533739691940962304"}, - {"evmos1ga0j29zsuv28gg3tsf6sup58ueyvtnf04yc788", "26826933638106542080"}, - {"evmos1ga0z56mzsmftmpf6zcvg2rc5xevrr2eh4rxepe", "3386058769890058240"}, - {"evmos1ga27n56ltf26nym7kcxfszykyrvdvffgd92pcv", "1104896810413971456"}, - {"evmos1ga3f6kw37ww00x7rcfh3y7alym7wj55p9cnrps", "8827600338721814528"}, - {"evmos1ga4pnf32cajdw670lpv3w77s298h0l0xex2vts", "30622066572159967232"}, - {"evmos1ga7hapx7dvt929ypy9an69m68w7mtq5vgd76er", "18083532042651668480"}, - {"evmos1ga7k0y5d7hpmkc2yfa58aees45ac8ztyt0xyd0", "33405696548927447040"}, - {"evmos1ga7ym3py88as9p6tgqjgda2wj8xdc4j7fzfk84", "227870374733498624"}, - {"evmos1ga88dvqa6qvetwuhj7m90x85p5jxpcht03gz27", "100345973778388992"}, - {"evmos1gaemhy2aamzxf32txs9aglh9hvugvc7vac95ff", "11177049253221527552"}, - {"evmos1gakactgjekmfqgs4agzdtan2qszycl7tqeyjrt", "219813348642956800"}, - {"evmos1gam2txnnxv7uzmefne9ttuztcgu5qed0e9j6c9", "5039000647358693376"}, - {"evmos1ganjntegv837rva3789hld3q734s7m44lpuy58", "767961929796145152"}, - {"evmos1gasyznt9kufvy7msrr4rncurnjfpsa8yhsvsf3", "86819959623518896128"}, - {"evmos1gat42urlca478ghc3ns9eenl5nfk7tncyy4l5m", "1631566040577758208"}, - {"evmos1gc24d0xcntsplwdty5kv9zeem0jnw8khhwk7ya", "3930872567759004672"}, - {"evmos1gc35tcrw04dhrxptn04x3qmy84dcrtg30n4tfy", "4689494298811571200"}, - {"evmos1gc43hjtsgfsqrmhdk7g90ygt3msksh794w8vme", "1599682287817544704"}, - {"evmos1gc55tfduy4rez384phpdxcyqjrj07gsgk5ly87", "2457696348026918912"}, - {"evmos1gc5ck60exdupgr8gmxq0gpmlx4tgkc09rhj2hm", "6553372209184709632"}, - {"evmos1gc5eqdp96prqs4pmxg6le7q2yf8rd5c8f6kmvr", "6716634683655459840"}, - {"evmos1gcdezszn85k9qq3c52qn0p5x2gap3kq337gs8r", "1612098774168428544"}, - {"evmos1gchu4zds3un8ne7s06ldvhahnshfpj5k5vtxyu", "798990109225742336"}, - {"evmos1gcjgntvddkr4uuwvnfd94ayjmp9c6c4pqlpr2v", "33668695058888728576"}, - {"evmos1gcl8c0ls6cjm0g0qsscwxjr9770f2nels0md3v", "619242585545425664"}, - {"evmos1gcr35v9pmn2ah3h85yw4mydxakm6sl5u0qe0ff", "4186080417213472768"}, - {"evmos1gcu4h72xct83xrwkshx248p5uk4fkprg04zv46", "4611727154330517504"}, - {"evmos1gd3g8q9sjuyq4f77hma7uegjxdt00p95d3tnyn", "4673013259911577600"}, - {"evmos1gd73lcazv76qr3gnh34tddmp8cf8lmxs6j2yjw", "7093910005054321664"}, - {"evmos1gd9g7erakj6324s287dc6fgc258ux50zcqv26c", "2877485809529603072"}, - {"evmos1gd9rz6655xj96qjjfu9gh6lc5f7ra3c4vz0msw", "5683479204799862784"}, - {"evmos1gdfzzc2mt2ytgzalxa9dqll2mp3qxwmz5xp65c", "478678354985662464"}, - {"evmos1gdg6s6ea2pev5vzrx8jxgakjx4dkam5c80ynle", "2849418901193563136"}, - {"evmos1gdge46hkvjyuqrj4ydpxhjc5l9kpmenrptv5la", "209235338499460096"}, - {"evmos1gdguwdyytqeje3857hnx02d8puua4k5xlsf7fv", "192825055610143232"}, - {"evmos1gdjwujpgx8y4n85gtx678ptq39qnlfq8rcq9ka", "1128482103650202880"}, - {"evmos1gdkfuvdar795fply2etrwj2tnxfsqf3ln9cuxx", "31257060268617216"}, - {"evmos1gdpkjwgeeshj0jgfuz72phsz6m53q972ejr28a", "8428472489743974400"}, - {"evmos1gdrzye795jgr3q2j46488mag5lv7xyhlcdmqds", "6755756857738219520"}, - {"evmos1gdstep0mnwd8l3xf27g5l0pfldcnn48rxmndfj", "4932183330209957888"}, - {"evmos1gdsvw2cp7ayktxgjm4rk4ym6qpz6es0letslzg", "30806044042351878144"}, - {"evmos1gdtj75t2l96r2s7g9a2ppyvkxmcrwf4qqeknw5", "3432247506937851904"}, - {"evmos1gdueu29ed5v9fz6fv4vteqt287yvsqutspudad", "62451889596645523456"}, - {"evmos1gdxm59y6fg4ejzd8llhdppy34mvatwgyxwf8pn", "10451331915418951680"}, - {"evmos1gdxv4z6w6gg9n4g4nvcprfc6598hl849kmeu4t", "2769918350254424064"}, - {"evmos1gdyzgvkyyuhyrscasphrq4wqswj7jwvjqym7q3", "1286576460974746368"}, - {"evmos1gdz7emjg6hn3gw8dms3cr2ze35jemcmjaxsq7k", "384476649878295040"}, - {"evmos1gdzv76u9hfka8fu26pg5t893txdksyjt7f5jrh", "12305100693377163264"}, - {"evmos1ge04rngurc7x44h3jhy80q9ny28e4jtzlct23v", "29203561781954871296"}, - {"evmos1ge2wvnd7zs29wjh2eyu359yc4j705fkwjq2txg", "8637779288491330560"}, - {"evmos1ge3j9na9k0gcwd9vfk99tfap9uypvray5t0ymy", "997241139777136640"}, - {"evmos1ge83d50z2z575m4y6ctta8epzgrmhleqe34vk5", "1040341081592267776"}, - {"evmos1ge9v0famvlp36k5m22sqm8hqd2570mr98g8ypk", "1001726308603610112"}, - {"evmos1gea9gjgm3pdvsktxyy6lur3w06vsvqee89x9zv", "16127968913251819520"}, - {"evmos1geamwe3gtwrev5s32f5aqp0rtqvzdgp4zqyz8w", "15442200633911652352"}, - {"evmos1geapc2ghjff0ul5w8mt42ud93ms9ggek00aha7", "7083577197749390336"}, - {"evmos1gec4qxf937z0ft2w8eac740eml52756auhu54v", "1261515230245747712"}, - {"evmos1gecg0q6vv7xv68m39f8xfa4x5kx6k9w3aq3x3r", "621581929259509760"}, - {"evmos1gejjvmv2cpl6kxahxw56jc6z6zwpwtes8qsy0k", "586015085191811072"}, - {"evmos1gejwvke9pt6qvarfapsa4839nuljmlpj64tf8g", "114306847591568384"}, - {"evmos1gel224hlswhz5a3l8reydwa570mwj4v2yz6ydt", "5293903179384675328"}, - {"evmos1gen4dr00gpdv5f36ujtawgl025d4yt0mwagg30", "2215122147665362432"}, - {"evmos1gen8mt33qqudmsqr8nye6w0zfewr0fszjeuf6f", "4110168421532735488"}, - {"evmos1genuenwfa5yzjsvrhqzw2lg50fy9vtzzl3er68", "1333653677209758720"}, - {"evmos1gep2a0hcmf3ehtfp0jqcj7r43709hv9v0cd04q", "819916220373417984"}, - {"evmos1gep2cav0uawf8f6qua3csrun4zvj9w3nvlk6v3", "384314424118280448"}, - {"evmos1gepsjn0zuapuhhmqg4r7pqz6pp2pm4vn0xk9pv", "45910321403351179264"}, - {"evmos1gesf25lmn9qwem5f8j5pqpst8mjdsgt0uze9k5", "5995720168214515712"}, - {"evmos1gesujl94fa67g5mqn3jdshcvawkea8t4q85e8k", "3559502470641664"}, - {"evmos1geu8te0udws5m5xaj02fa5p2nsvr7na7m2nyrd", "1489380166705232896"}, - {"evmos1gew4zs8k0grfnwjwekhnxjsz0kgznupn6xsmjk", "825345055899045888"}, - {"evmos1gexnvcq75dqumevngxgys53hzl7pxhmfhra3tp", "12388574130132762624"}, - {"evmos1geyn8qzgd4r8ter0m60qxk9ywpxfhuhpyevyup", "5649878710090657792"}, - {"evmos1gf22e6z4u2x0f0ydrg84z6mm9hjx9re0wzaqmd", "1145196754625626112"}, - {"evmos1gf3sug6s5kje4c92kyqp60g7upg6v54q9fx6cu", "26457748372753408"}, - {"evmos1gf5ml9e8a5zjcs8x7yn7urw4utw7uc5fwvny6j", "15741216663678185472"}, - {"evmos1gf5paavv3fmeppyda6lywele7ssxuz5q0tagv9", "2162624673238114304"}, - {"evmos1gf5zj6zffdpqyap8wns0ekg57nwmwcwmr03sjz", "905322852554817536"}, - {"evmos1gfdh62z046km9n67axskegw4c6ftcgrlevutvv", "858688377475129856"}, - {"evmos1gfdvflhj2cmjtdyvfsd6jf0z3mdrmeyr3ecndg", "2633733576620130816"}, - {"evmos1gfevgtfa7mruhejsxm0h2frhpwn4tk800fhfux", "428185110154001664"}, - {"evmos1gffh3fldusxajc9a2pamafgvy7sm95nn6d9a9y", "22149961005279488"}, - {"evmos1gfgxnjewglfuer2s58f388djtg3xandd2wzul5", "990268516478177280"}, - {"evmos1gfh8tmge3y0kkptgeydk5yp80t6uywdhgt2npv", "9577031191568646144"}, - {"evmos1gfhuzxtpypegf5s08m4w8dwrlpm7dnvu77sh3z", "741661693096670208"}, - {"evmos1gfkr9vsjgr32uwwqd7g6nz6ml3l4dp9hx84m9l", "4254087781921380352"}, - {"evmos1gfmx204kxnqmfwvqcvpfq7s6gp5mxclqc9mm40", "3166868563219857408"}, - {"evmos1gftmcuh2jnjlw3v3jr0wzg3kaelwqgpu2js93m", "30411447759662149632"}, - {"evmos1gftrlnaqfnkjqymn8qykmrkeqdqfqnsp4nezyv", "477984630994895616"}, - {"evmos1gfu2wr8kqxpq0mzg4x2j45tp9gn4cr920ph0k8", "314636183775874304"}, - {"evmos1gfvjnsfdd5lvrcfag5gvumwyqtycdmmcaczm4w", "26678940403921825792"}, - {"evmos1gfwzu7x56u49dhpa35f5aa93p2vw42kephjqgh", "3048884330631543296"}, - {"evmos1gg0a7tz988yrflxsym0r8mgpwhycgqademlc3e", "72634242320706510848"}, - {"evmos1gg0y52590a7hmf8mm9kky696lrjj2mhvxnz5m8", "70801227227785101312"}, - {"evmos1gg263qwl5w8697kw62rh3jfkdme7t7ak9nayzl", "2382049160407391232"}, - {"evmos1gg2z2y3ncjwh0wd0q6e7tj2ecma04my0hz8n9f", "95266736126699569152"}, - {"evmos1gg46sftzs82wwty08zuj8chm62hw2ngc4fldtf", "12995958387542679552"}, - {"evmos1gg4j4nr5p2st428uhkv6msv2p3z5tfmmq8rjcn", "10117492961591480320"}, - {"evmos1gg6qjhx88nmqf3tdqsnxa3f2enctvzdd9x44f4", "4783275312945612800"}, - {"evmos1gg6xrnuarcfddtp7k244fs5l0dj9fluvs5ys9g", "434702526714695168"}, - {"evmos1gg7a0wyjs7t2f9q4l9pw3tl4nrwep2ld5nurhs", "937950327922849536"}, - {"evmos1ggdx6zzrg8aw4fcz52cne3ttnny5agvnls773t", "1294807574891868160"}, - {"evmos1gge3drlp2pmkhfhcek5ceyzprd2929gzctlt5s", "21724666085523001344"}, - {"evmos1gggg0x5pr98zv0jpa4rsgc0jnh4laqv7qrlrgv", "469937720907302400"}, - {"evmos1ggjyrvfuanf9fuy25pxhdejnmkwuuz3vya8nmu", "2941664867819722752"}, - {"evmos1ggkm3ktxns9fkhwxxwj8hh66cvsd2c05k4jn23", "1237295766573145088"}, - {"evmos1gglvasqr6ckzxalrafjprxly8dgyvnyr438d2f", "303474621110541824"}, - {"evmos1ggqaq02z6cf24c5j62evf54amvvfyq7a42tj86", "9947331003349655552"}, - {"evmos1ggqv0y92hw6alz923pwpglh9y9sfq5qhzwmt9q", "1568788532132126464"}, - {"evmos1ggqzde7se8ksh2hmj2rm6pq7t5zfseq6sx8ulm", "2521725951059868672"}, - {"evmos1ggs7g2hzhm5ld8p5dvll9fm92vw783tu8jl7v9", "100802879616646912"}, - {"evmos1ggsttjcfdl4n4tz2p03mvlqm7gczy3njkrlkmm", "3731033098333380608"}, - {"evmos1ggul3rjl0lt7q6qtawlralmy0cr0nqgvdu9cw4", "27883008846312538112"}, - {"evmos1ggut0jseaeka86c78e4qerrf497uq865luwg3q", "1791302978590312960"}, - {"evmos1ggvdpzzjpr7avj0ssmtq6awt9n5hjhfqqws2wy", "308997664643741184"}, - {"evmos1ggvrjuus7r89p085azs02ausj2jrqfp0h0sjas", "1730075696610365440"}, - {"evmos1ggyun6nyld86gdltj59nswdy8jvajmqx4xajw3", "8758123036468936704"}, - {"evmos1ggzf3lejtu39lrf9e7r0hgvu6prvr3eu7hzqfe", "11724765872277501952"}, - {"evmos1gh30awqm6e3scwcndeyfvaxgkcghp6eznz3823", "1454799065308662528"}, - {"evmos1gh3t32hxw9ee9yazjm5rrr3n27p5u4tnmavl6z", "7197265128103870464"}, - {"evmos1gh5nmt7defxjmn3z8yjxtl9e74947fd2kushqv", "6970330151432404992"}, - {"evmos1gh82vt7dxrl972yfte37ejn6j8cj4g7vydcxhr", "827221156164737408"}, - {"evmos1gha3ykpyplfjtf6qd7eqqeehy2866x0u7algx6", "17314158522637996032"}, - {"evmos1ghd9xhepxvwukgu0d68796t32q5zf8t5x5xd9f", "381982589327104000"}, - {"evmos1ghffkesljdg6hdfaxsf0l6y99ens37wsfjfvf6", "8460061869845487616"}, - {"evmos1ghg56qp353v3eqa7ydc83t73mkcwd5mjuwc6q6", "7335361633263091712"}, - {"evmos1ghg5nftdlwdpvkfnm3sj7rf7wydk7y72z462rv", "9605031659761506304"}, - {"evmos1ghgrd5arggjgavhr3qx3gsrevvxvew3g3etyyj", "883767433703775104"}, - {"evmos1ghjrnme8ulfsg6dsthf63w03kaygq8p6kdm69m", "150066456546200576"}, - {"evmos1ghk82ktnnfx5vre4t3m29uhd65umwylt3zh0sm", "3191605589131337728"}, - {"evmos1ghm5jvj0x345mcldu3zjcj9eu3yx0lkt9hyrdg", "415469224510649344"}, - {"evmos1ghm7ml9hltjt7me0qdmygz7k5p0tqfcmg3kk8c", "4888843439408125952"}, - {"evmos1ghmv7guz67zh2aft2z3qlhj60sq2w6y2jnxlkg", "412290307620784384"}, - {"evmos1ghrahsjw4ppagcz6qyn7cf7783ae0c0u0cgm4f", "404834997818404864"}, - {"evmos1ghs2zgxxlwtcua6f5jk3vt573j8j7vhg3c0n2c", "3034829667252194304"}, - {"evmos1ghtt6nl9e6fkr6xf5vp6m6qwws6l0wmq7kaqen", "1369546040895753216"}, - {"evmos1ghu3u74jknrfwu2c8fxcaenpn2gn59ekkxax95", "409778226307678208"}, - {"evmos1ghv40rj6dt6yyv7zqskmnwqv48sp0072xv5n0q", "18842824967780126720"}, - {"evmos1ghwhd9y3c07axfgjwzqd6ysvv9tt6uwwp2y40j", "4856847431011084288"}, - {"evmos1gj9xzwcy7jn66hqasc3kslxjl3eqk8ynl732ch", "551328339878936576"}, - {"evmos1gjax9qyyhztenmpn5nz3jv3pjtl939z6nehcax", "63969833804804096"}, - {"evmos1gjc337j4j0jxl8rplx47pp5ss0v6u5t2c36ele", "1115968002540593152"}, - {"evmos1gjf0p5zf00a52e9qshs7r6emhqyqmluncq2m9y", "2329594106169079808"}, - {"evmos1gjfmkum4gsjrpt7v6vnn85j2cu39jkhxagn3r7", "316074061799084032"}, - {"evmos1gjjcfdcfanf8x6d8fpx530myat304l59khducf", "41558662737697275904"}, - {"evmos1gjk6cq8mvpf2quuyuwdjyymrkf6vv06h998dlq", "1096657536625620992"}, - {"evmos1gjkn349dxx7aknxj3v7rkc8geulmejdwj65gn6", "2508447408986943488"}, - {"evmos1gjmd5n2ludr4fhtt6lcqu9vcd6k97g7gl5v93f", "2068488017295157760"}, - {"evmos1gjpnwgte5p7fu2wscm3cqqxm62xersgqjcnyyn", "105838582546780766208"}, - {"evmos1gjude9shjznjcrrtawt3gy8hnrpw6wr49pwuqd", "491778347022334976"}, - {"evmos1gjujecvexscnylljplnej7s3vsy553vez33mcn", "11049892755284901888"}, - {"evmos1gjwhdttlg7tfd88urv3twyx46nqfrjvd4scayz", "2389623085388945408"}, - {"evmos1gjxshmuk0s96nmhf64nqa5avkmj9ajse0mjpu3", "4394263296431748096"}, - {"evmos1gjy5f3kln7ns5z354usq562vq4qhn8rlycxfpv", "1230122956464925952"}, - {"evmos1gjz4j9e4sxnfrw2v9p3az6sqeyaa9djgguwmr9", "71079958043368448"}, - {"evmos1gjzaj84dzssc3d2s5qymjd4kr9qk8sfdh9d3r6", "13792183600471629824"}, - {"evmos1gk2wtvs0qmt8gftewwe4863g0fv3accag7jwl0", "100611071058085120"}, - {"evmos1gk6zrsfq03s4d9hq53ae4ve3u5ggy8st7ffamv", "1529694065369341952"}, - {"evmos1gk7nldjzatepd59p3ygsm7quwez8y9scztd8wr", "903890388011088384"}, - {"evmos1gkfrsy456camh3ufqqefuqsz4cp2z4c2wdmjlt", "20899977744843898880"}, - {"evmos1gkjn998yzrkkft65w542e2f3jegudxjxp32atk", "1085982175132050688"}, - {"evmos1gkkn3drhg5mfwhngq64zxfr3m3apwf55lvvj90", "761826841055427072"}, - {"evmos1gkl4y5njk7um0jc6cdzdpwaaj3fwnhct4ld6y2", "3523156415877597696"}, - {"evmos1gkm2cvty7yrdnmg88cr8ptd9y5quw5qfl8cg4w", "1040714755430035968"}, - {"evmos1gktcvnndr5qt5pgkjrx4k00k0czj2k2mjfe0c6", "478311650167129856"}, - {"evmos1gkuw2jvstvce7radr9mymshhzmwpdcz4u73cce", "4867406677774059520"}, - {"evmos1gkw4j9g4qh20rz4u3hkvhn6ranp5uy00em6nmy", "5051393540804005888"}, - {"evmos1gkw7244gxvpk36q2p8a6d4gwd9nm6cf800xgd4", "47636594415049216"}, - {"evmos1gkygp8e92mp8hyw05lc6zytfh6yw4hxvr0dmck", "44068222678949232640"}, - {"evmos1gkzu46za0x7ma5pgyjtse3y58m3q3wulf25nzx", "4148353617762289664"}, - {"evmos1gl3py7wn5j5d4t5s5vn4v2v385pacxk3gcwaha", "1208073529680446464"}, - {"evmos1gl46a98uh4z94t5vpj7na84zx7dm43lue08yf8", "12035335215664664576"}, - {"evmos1glanek70t8ya65lwest6mspqkqn9dw562qzrcd", "981638805805750784"}, - {"evmos1glfz37mcdwc5z9mz29rlzp2k8r6xk6yn5vxr7k", "1594738798219679744"}, - {"evmos1glky77dd7lnu23wnmk2veykndm0nvwe0rr709s", "8352244259172466688"}, - {"evmos1glp2yw9vwttsmcmfv66skrtvpmsve0whrdmxvv", "3635170604862356480"}, - {"evmos1glppzvyakencgxu9xmqr09ksy5ff949mh2mt8j", "701086369412441344"}, - {"evmos1glq3gf02wqymcjwk6pgssvxee44mxzany8wtnn", "1001483026093700608"}, - {"evmos1glq9zqgrssx6ckhcj6szwgvjx93s6s9wnlv336", "1584973354398945792"}, - {"evmos1glqjthhx3x9kev3hn096ljprlulkz3ms5etv5z", "1392144111025061632"}, - {"evmos1glswdg0a3cgr60nhduwpgzwqspue3p33fxjguu", "427215639513617664"}, - {"evmos1glv6adp3cvd2vrh3lxe5ask74wxs0yazwc95m5", "1385794936394328064"}, - {"evmos1glw0ngrgsvt279g40tuzq4gg40uy3d22njt7a5", "2584983269968401408"}, - {"evmos1glxpw2vcddm0dn8pcvwxq2r9etfpv3eafvxayq", "5148317433552814080"}, - {"evmos1glz2hn9vs5qfrqfcc6xghzme4mjzeacjzclny5", "1173033259949103104"}, - {"evmos1gm23tkz0p7h4k44znpqzxlmdhhhce9u3ue39rt", "15821671082226667520"}, - {"evmos1gm3g9093gzfcx8av7mhnecplyekpn4avqqshjr", "2676914175554478080"}, - {"evmos1gm67vgxrymhqyawmm77mnqeqms8gzmqamg80ur", "2308944125573302272"}, - {"evmos1gm73hdqph89azejx7ta96yt3cr8szwrhjza2f5", "4580072657245562880"}, - {"evmos1gmethp6hwujmu08xvjwqd0pytafqvfalczwvyu", "3197784243786317824"}, - {"evmos1gmhkz5ywjx7dj8pcxlqgjyxl6f7e9as878c7zt", "44849855302147072"}, - {"evmos1gmkncr80ngxuj4dzfqm7vdjkwwgnps7lhvpwft", "468676520072898304"}, - {"evmos1gmn0yhgf9tvsfz3u90cf4r4q97s47rg9we06g3", "108750096769433600"}, - {"evmos1gmng7nwaa608hr2lefldq5m98ecc9fy8y900jc", "2812240064455707648"}, - {"evmos1gmpg3z59m4zlk0ja7scdassayextdnq3vame66", "942419100786554880"}, - {"evmos1gmply89lkz40pckqt5nmw3632qnkmtrgsgh6hn", "7202881519040540672"}, - {"evmos1gmsutt8sdmp9lgfjh9ecceyc6gw809rz8n373d", "2616769019558422016"}, - {"evmos1gmt6etvv6qk3ueyheuxk9qaa53wvxxyjj7yc6q", "3776340324912028672"}, - {"evmos1gmy74tvd7269avxuu768yy9ld3g57atd83xzaf", "986453969428497408"}, - {"evmos1gmyjggauhgudr43ct2czs0wcwqfxeh4qt6f4ap", "7270894365107761152"}, - {"evmos1gmzwnuptduwjcfr8af34ac7m4zh9drk76rn76z", "8689819549975699456"}, - {"evmos1gn3nf7nfqwdc3tdym0teulwsyf3l7awke0ektc", "1405960269955940352"}, - {"evmos1gn7066hy82h8n9jm6vvawcsxsdgydvc53ngxvm", "356716308237223936"}, - {"evmos1gncgguur7uh4xm5rwdya24aese52xpkkde4ld6", "3532816796191932416"}, - {"evmos1gndw04lk50rljvtzw37zyuht8ynax9lvf2gg6g", "4761366882299203584"}, - {"evmos1gnf7856drhf7r4fqmr8rn4gun2yvltrw67n9hs", "4234311320055097344"}, - {"evmos1gnl30ynn3vs0u6qexs7dd9qsft2x0ll25qkz5n", "1570664396350679040"}, - {"evmos1gnleldy9y0y5utnqjewxaxrf6nv7th0444y8m5", "384605220239341312"}, - {"evmos1gnpl0dxygglfpaxykefx6ggez3p3grvmv6m9jj", "1225883901886847488"}, - {"evmos1gnpxvs7vc5fra2egu34xl432sw9j85a6ypqf3l", "21000846011393458176"}, - {"evmos1gnrrcyg80ptsz9dptcn3zajz0cjhqsn795mwp6", "1473064498526744576"}, - {"evmos1gntzxtvk9mzlhml9nfc3he98fjlp7galyemetg", "1606496157528767488"}, - {"evmos1gnucuhs4cd46t8ssyqax6l20lzxunr90kjpy9r", "6128535699552759808"}, - {"evmos1gnv7jdmwu6gcfp07ak2gyx0mvptsel22qauyn8", "816782695292932096"}, - {"evmos1gnvgkj38mjqvltqt4h55ys9wx95snphefdn7ah", "1636519518652399616"}, - {"evmos1gnwl5q5t09s0h0fgnet520u73ye9qa6awa9jnc", "387553284372858624"}, - {"evmos1gnyjpjkg4tz95hfzcua0jpc4kdh73ft5shj6zh", "802638900637632512"}, - {"evmos1gnzgezas63zz9qa9gyfz43w2qm53vzd8fw27p9", "711048964887334400"}, - {"evmos1gnzslg05wfzmyr4nu0ma4r6dmk2ly55kkmyu5d", "950119920785411840"}, - {"evmos1gpa7ehuwyrq5wf0d35a7eszlfeu3gtndxf8sx6", "712292536496205824"}, - {"evmos1gpama3rgvc7su9pf4qw0mcdtgntakfg5dqjrvy", "110102993059570432"}, - {"evmos1gpca5547yz90ndwmnj6sg8g3q7uz43g9e892k7", "8720595523847860224"}, - {"evmos1gpe9r35psap2jw98qdcsu9wtjtqu8gmcaagaxy", "2284456099671698432"}, - {"evmos1gpkgkwp33a5thgdt44y9r0uujyrp552qwsyh9j", "369461461872211200"}, - {"evmos1gpm7d55s5sfj6jyh478rrs577y03q7vvzt2lc4", "920128944436209152"}, - {"evmos1gpq3uv0fu3jh4dqy7evz2phx92yr9dy6dnxdak", "3091144613427625984"}, - {"evmos1gpq7nkv0098w0k2j6fnvrgg8q7s275ejjngrhf", "47296645169536016384"}, - {"evmos1gpqj2qshft7zuraxzun3d2gpsh3yef4j2mnlnu", "415434815688750592"}, - {"evmos1gps4dmxfmhx8nphcmfc4wk32v5v4df0mjludyp", "11480692420644345856"}, - {"evmos1gpsrd9vce882uvtczeec0gnt3pfczjf7mmm6v4", "1793464831785842176"}, - {"evmos1gpu02gwcfyqhnjeu4j8p4plmw5nmplg9jm3yxh", "666404559027937280"}, - {"evmos1gpv7jn6rrvkysdeu8nuk9vjhk7jtrhrrnut2sq", "32477190732477530112"}, - {"evmos1gpzdjf7kqp40z3h7kmprwpzd60cqucpftv2e7p", "131006176245540618240"}, - {"evmos1gq494nsusde29q0ctvqerssw62p807tj9uytnc", "4891187342971478016"}, - {"evmos1gq7kv6pywn3uxc6e45lcqmhya68y4k2p7ntmuy", "26208411569222787072"}, - {"evmos1gq7p8rq2akljwj8vjw4n36pxtut9f7exka9yxn", "10696067991850471424"}, - {"evmos1gq8044zdyy0kt7dgy4drvksmjwh9990xwzuzea", "3502921035054109184"}, - {"evmos1gq8rulje5pf97v4kn9025pc73zzdfeqp8kn4kw", "8718770116692275200"}, - {"evmos1gqcyaa84vwshdjkf57fmz3gyk9fpauweyx5scg", "2135050743398280192"}, - {"evmos1gqexyn084yne3jrvah6jh8y92gjld4mclr8mq7", "87652642363601920"}, - {"evmos1gqhkek5u7ejvg3qvxkxm5e8v6dljd2fkmhn0rp", "3063435883319236096"}, - {"evmos1gqjrgsat8aanc0zjq2wc4zksxk05gn65pp0zxd", "1999741338800185344"}, - {"evmos1gqjw4rhhywdh8jxx4mj7nanp247429nkxhe4z7", "384370964233520896"}, - {"evmos1gqkr3u6rwf8smd8xux0he3wkvk6fs88ygcqvaw", "7607568604731285504"}, - {"evmos1gqnkhf00m7alwj240a4j5z22h4upjutyeue2ry", "432622196316143872"}, - {"evmos1gqp5fg6dwtjfv7pqw6tgdcyzt6cpmjhkze7uu2", "1484633698093286400"}, - {"evmos1gqpsvjy6t3ha77wd2q4cevrupgp4dp4q59gu5g", "1189460586968498176"}, - {"evmos1gqr2ex20z4sgc4m8yv667sa5wrah07t029223y", "752642191770139648"}, - {"evmos1gqrqj7jsfvz25n05kqn34nte0army6dux3ecuy", "1618488192580302592"}, - {"evmos1gqvpd9sjejeg4sfcd4vrj080zwr2rryndg675z", "32467748878872731648"}, - {"evmos1gqw8whx8vrezw5cw9fnrkgle3uhajywqxdk5lk", "4940528366299211776"}, - {"evmos1gqwayle4l84sy0mj9strwqs9yea9a9e32qdnpy", "77005112613961728"}, - {"evmos1gqxm42y5my3rjap3m7j5xc5z8gh32p4wqkuffy", "4237308548256932864"}, - {"evmos1gqzfa54awrxk3hrupd3q26md3u3ekyggvlfdff", "530680989951082496"}, - {"evmos1gr0w5r9sle072920lr7u08kxszr420gwph6t3t", "958009553427832832"}, - {"evmos1gr5pk34djdnuctceqyzq3x448lfh59rnt6gf72", "1731712562256781312"}, - {"evmos1gr6qflnvpyde29tkanrmenj7e4tvnp0hsvy2je", "19370243450922172416"}, - {"evmos1gr7s4a2w7jn8qfcwjzfkqfjk8xg8xw5cl5cpfp", "419453137535461888"}, - {"evmos1gr7u8hgtm763gmtrycas9qq4pjnp62clsa03hg", "1500370355690014720"}, - {"evmos1gr8khwygefnsugqnnvw25zaqn9hk2dcuc6mk26", "7248467621054008320"}, - {"evmos1gr93succrnu6mqe6xczr38m676kg7xg23ycww3", "2113314751917901824"}, - {"evmos1graewgte3sg2dpryu2k4v2qw0f36ev9kl3f6f3", "320660600075165696"}, - {"evmos1gragfa47ca4rwdd0rxy4kzf8p6jrc7td3vmqh2", "14799685771724267520"}, - {"evmos1grj62ssg07jtje3qjur3w7cs852cl5ay0xzysd", "229140020344528896"}, - {"evmos1grm7ykp9tk86kur29ddzzklsuwkhul6cfqjmdq", "17683126373560074240"}, - {"evmos1grr4rreeqf4y5fxxy9pznkk6temsr3s8wkswp5", "2739945068654198784"}, - {"evmos1grrdtev9gesjsaprfyk5lcn5l7s0gwlgqe6gek", "1645131342024977920"}, - {"evmos1grrwc9w78ajv00ylk28aut958dvr577es8putf", "2136955864370388992"}, - {"evmos1grt8wteug494qk54fz886xq4w669shz9e6trr5", "53624935629241856"}, - {"evmos1grvjezy8dsde84sfvnjcsuplexh6m6k5md933v", "2994572021217067008"}, - {"evmos1grxjt2jeamatsd0kje4w4yhq2tqf0yfc55ezdz", "3829723130481651712"}, - {"evmos1gryhzq668nvk6elj0mhrrlwyyts6xfs2g94pjy", "23877130085849063424"}, - {"evmos1gs2c9gvrx4d72a6aevqtxe37jrw0gefuq2y47y", "2233867324150001664"}, - {"evmos1gs2guc0vaztklemf3h6sjtehem0lyhg2ukm7lj", "2346634600708110848"}, - {"evmos1gs9re4wjz9kpu3emdpufyjt7l6uqjwwftyexgd", "270274739163142144"}, - {"evmos1gs9ur4fe6rwpm26klh03utwvgwfcj2ghd3k7dm", "4468876754494603264"}, - {"evmos1gsd5urrca9zwayf97z5n97gj3wwshy3l5pudta", "10022700157668413440"}, - {"evmos1gsdyw3lznr7aeu02hu0dcderhg8ry6ym2est2t", "406722671147129600"}, - {"evmos1gserhnjm42vdsdjp35mcscga43netfj0puj80l", "1092367813172702848"}, - {"evmos1gsew3wwy5f7mah2gydd3rd6g7dzacx47ezgyf8", "81973410694714368"}, - {"evmos1gsh7afvw656dzkm8wvez2elca929vw6y6jkqf2", "2767928377743598080"}, - {"evmos1gsj72km0kzklv5p239n9e5pk6ja70tm30g6tdm", "25011907796030332928"}, - {"evmos1gsk8qev8epn4kdc2e9er0qm662q0m229hng0nj", "842841330037264384"}, - {"evmos1gsl50qvlmmpuk8vqvhv6unpjs80ehttez5vtm4", "715425456473083904"}, - {"evmos1gslk2u3lzef3r8kk6ahepec5sgrataensnw88f", "1283617465692249088"}, - {"evmos1gsmz29anw022ehuf9evppnupxc52prnfan67sj", "7254970843671445504"}, - {"evmos1gsp0t5ld692x5fwfn9rj7l49d9ugfrw8urvzl0", "1803706909892349952"}, - {"evmos1gsp48fl3tzgxkvc99lg7zdxw3pemfcrztaypn5", "830384994495300096"}, - {"evmos1gspj45gs56gh65q3wvv529php9qr9azepeyur3", "1094046520176865280"}, - {"evmos1gspthz8q40qx7k40m0vj6hufwx49svvmjxq0xy", "457493542270083072"}, - {"evmos1gsqsj3wrvx94ag5809x7y4vv2v2kyqg399qgxu", "16436443339942526976"}, - {"evmos1gsrl0y282j73d5urak0p32e9lydzwnsr340qpw", "831268145252878720"}, - {"evmos1gss7xdwgjdjx0n9fcmeq33qs74ea75nf2dv6mx", "967695635491485696"}, - {"evmos1gssnr68fpxv3r8ylll6zedm37efkec9gj7ecya", "1490966083372646400"}, - {"evmos1gsue2uhh9jt5smnml4szyq6s7yu25q3nhhug3l", "13207097090236313600"}, - {"evmos1gsy8c4ad6ealgeed6eczs6wu7juh4kzsj3rdx0", "137499029371423488"}, - {"evmos1gsyaz7t6gy8vfrs9s7vw2p0577754sh6pneyr3", "558811363271599104"}, - {"evmos1gszlgfeg44lxgun9k3dun09uhsclz8rxpelxxv", "498419078561087232"}, - {"evmos1gszxn9lct9j3da2mwa22qg84ft5mphmd5vrzuq", "467710640719621632"}, - {"evmos1gt5mvlmxtqwyhkyw6a9ft6np0yfea5pf9ylfcc", "8860508855377926144"}, - {"evmos1gt6nq8gcl2h8d57xl9p96qxccvd6spyg8vsq6t", "1583774811289845760"}, - {"evmos1gtd99alpsap7c4unfc36mxkxr9wsdlzml26dzd", "4833822732221140992"}, - {"evmos1gte9ewpsqerupj4rw3arfujxr6wuxtpqm54f4y", "1674888126353479424"}, - {"evmos1gtfmsuepf9lnevxqgx7x9a4exkgqlg7r2z6zrr", "1290243609064263168"}, - {"evmos1gtg2chhlx5jzl7u6prj5ctv830w4jukdr4tqmg", "2627939630183841792"}, - {"evmos1gtkej5ypr5rt9n7mhrkmss0te534y56phu4g7k", "491459882499893504"}, - {"evmos1gtlgjvgpu4ek2plrwnyh78auwcqrq45cce9jmv", "8738493352340976640"}, - {"evmos1gtnl4u9vhp2mnfwvd42hvgww3m5lvtdmahv9tu", "1118735085064081408"}, - {"evmos1gtnrn3f6xczwqmsycg84xvh04z3nq20ccshz8w", "59048674273504329728"}, - {"evmos1gtnts96xzjqgyfty7pazdtkrqwxacuug5l8mvx", "26073081377939435520"}, - {"evmos1gtnx2d2dst2tye7wga0r6u6hrpqvpxjnk03w8w", "14129803605470707712"}, - {"evmos1gtq0zlyvnn3s4rzxmrkdyzwf742nvax5f6ked2", "605954629190672384"}, - {"evmos1gttc9jwnc2smyy9xvc426x90ax73vec4h5htc3", "1123393390140355072"}, - {"evmos1gtutdaagjq5w205yxj6l748snmv6z2j2dhns6t", "5908076230186176512"}, - {"evmos1gtxkqfkk5tputgdcwce2ay5lfdf26el0rdm334", "6771372832516605952"}, - {"evmos1gtycgccshxu270llje4qvjr6lc559lf0wmdjt3", "824765533115150336"}, - {"evmos1gu3qg8kcj5jkke5sly95u7jylg8969lz3gwlal", "1253610764422071552"}, - {"evmos1gu3sy2srnu5ads9l0ka2qnu2y883sk4rq8wvca", "129950543725312"}, - {"evmos1gud3p2fjmwvmqmndpx7n2r0uku9j6ptf0u78gf", "641015981911339008"}, - {"evmos1gudk5q6mrdnqj56kl295lcmf6dnkna3rem9j7q", "1043559235947246592"}, - {"evmos1gue5rscujslwmpwvy8n9zhdtvc8njzg2yjfkf0", "384091762028360448"}, - {"evmos1gujf940rrmgu9wp3vykfk9c94ax2nd0qtw3pxg", "81991721372158197760"}, - {"evmos1gukm6ywn6wu3snnn6d75fzcf2jvqela7nk63l3", "182229149952192000"}, - {"evmos1gulfkjyga5k53pfc0gyqjeag0mfxdsw509685p", "1091263574316759040"}, - {"evmos1gulxy5rk5aeally80jtttyetw2gfp3j5p54pq0", "316398179223042048"}, - {"evmos1gunxnqz3jxwa802dqf0xmnvm2fm5rxqpm29cl6", "1444971208905861376"}, - {"evmos1gurp5pdgy9alt598knk8g0g0vyd2f87j299gk8", "2964023429413996544"}, - {"evmos1guu3pvu0vlrrfd0zlvs3e6f8pefn7zhdxt2xtq", "143106190285080100864"}, - {"evmos1guux0vzlrphszy27zqpd3at6vqsupf6ugaemds", "227200229166332416"}, - {"evmos1guv99as2rwr7wzsefxf4cf84jlhmfv2r8zvryc", "56030239609550544896"}, - {"evmos1guwdsfdwtgf9nsxqntek529rurc592trn0dmjc", "2236556751614550016"}, - {"evmos1guxx42ujm0dzy2uttvprk2xthkvmxplfdhu3uv", "2376530297716785152"}, - {"evmos1gv4jrv5vheyqjee25wxp6x4fz8xjenxfdsqe3c", "810714349275840512"}, - {"evmos1gv6ky6sjhcujagylwtqxdj0lqutldlv5rewlx4", "5105918722212134912"}, - {"evmos1gv8k3x573rdlfnjyxedarynph9n0pvh54jpgq6", "140628100755052544"}, - {"evmos1gv9d0ctc60sqz30ntszpcl6gd4lg5nr7wukrgp", "46293325158445826048"}, - {"evmos1gvc7w69gmwkeawrwz5ed2gsrnyr36m2spgywt2", "3250289816786680832"}, - {"evmos1gvcm8kecwclgmvzezcwx07ecc90vq4ttd3zykc", "99075070848624640"}, - {"evmos1gveggqkhlnavkhczhhnjukn8n0pzz0q2psgnt2", "2431033773683936256"}, - {"evmos1gvfv6vc7t9xw7qkg8cxjech2uzu2667ynrc3dm", "5416707444769095680"}, - {"evmos1gvgm7l5jdhg66vac67ffga39s0ual4jpvkjjpe", "1436350181994858496"}, - {"evmos1gvj9zt3p2hcswjch6dhrkz5ffcc4892haz7xdu", "5735258499046473728"}, - {"evmos1gvk48g9vcwjzng2kq6hej78t04q7zaqkflv34q", "788095375524292096"}, - {"evmos1gvn2tmhuvgku903txa07r62ewdyzhxmx35xkp4", "981827384874065920"}, - {"evmos1gvr47e867lv3p020cezvzte0l7am33fk6v7p9n", "19588293768343416832"}, - {"evmos1gvrquanj9kawx9386x46fvmm8va6x3w3r7jx50", "4876577767111999488"}, - {"evmos1gvst7lh46enzmay28ln3tk3cldr2hm056a82cr", "1276813337951031296"}, - {"evmos1gvt2vaeh9r0ly5m5420jcq6zrt9qzkhsqgrawf", "61494069420024020992"}, - {"evmos1gvtdzawmndaucmkaqpgn7qufm75k00th79lrd8", "6108673687393433600"}, - {"evmos1gvtgsyjgkwwpetdhyeqxq3rr4t3mwl8he5uffm", "294557238171254784"}, - {"evmos1gvu9rjfjhxsg5khsc6aqqa8mz4q3t3a96gmfca", "328971076425679104"}, - {"evmos1gvvj968du88q0mvqezdvfsczug7udw3qrskx8y", "5106130253001873408"}, - {"evmos1gvy49l5yaw5jv3dkmztazcfknzyyydmel74krl", "21821555864017920"}, - {"evmos1gvyhwutfr0g582ktwhpkn8757angrjgejgadul", "53138675919958605824"}, - {"evmos1gw002tdua3t26dsr57sq8cz9n2nm53pk5jqemz", "384498519150480128"}, - {"evmos1gw23rht0ca30u29aq9wks9t7533vawyd2qsjcq", "317353842826685440"}, - {"evmos1gw3wc2v37xyul7xqynanfgluax3nckhz8ug9ff", "3856815366612237312"}, - {"evmos1gw5f8kxqa83kneqet4xh2d8h3zg894mrkc3qza", "2637211042534285312"}, - {"evmos1gw5fuqn7zx5yywgnn0vw09edddwnlunyjhpupy", "1620573508170932224"}, - {"evmos1gw8ps7wr3wfwyd0f0y0p89edd36zcupcazvda5", "478241783805863936"}, - {"evmos1gwa2geqsm2ekvelweukclf4m5tzx97dmytak9n", "1549725761894785024"}, - {"evmos1gwaj5pz36ks8qw783372ccttw2ckh5ty0hw8cn", "242343524051632128"}, - {"evmos1gwfg648h0pmg9gfsvrepsnsyly4e6pvc64pvsl", "3350510074951401472"}, - {"evmos1gwg3hapqzehf6xg32gx8w4hty88nwr2e9mngrc", "7952092448889708544"}, - {"evmos1gwgh4qt5gewuq9fzars5xd025tx7x0m0vffan4", "1543793530841238528"}, - {"evmos1gwgl0fsm6ad70vxnqkkedhdfl7mn34qzqs0kt6", "2913705065778392064"}, - {"evmos1gwhy72ncwuxftg5zvv26va533g9khj4rhellwu", "231798715261058048"}, - {"evmos1gwm8puad0vwv6xke3tjy8sd7h7fq4hkq3yxejp", "102512929899163648"}, - {"evmos1gwn3eqe598u88h99xs6yleu2jsv77zpsprnmdv", "861851702948969472"}, - {"evmos1gwnkkhehd6wdq2dzmwm5fmms099hvukgegkkcm", "811662204571894272"}, - {"evmos1gwnl3h9wchg6n96pxjekzsetrn2mecd7k30cvy", "1050689407343218688"}, - {"evmos1gwr2hfpvw0th2ps62dm8ccmxquu6y3lkfyjml2", "7572246068302292992"}, - {"evmos1gx28sn8dzm886k9ppdhm5gzauj8mm5yrpzv30l", "3244524828505022464"}, - {"evmos1gx2n4qr6tgwu68chrazr4aers8auez0tt37ypf", "3735131594068781568"}, - {"evmos1gx380drevq64ufthah8cae8ggukf4efchqcvgv", "9293304627815819264"}, - {"evmos1gx8ef2jkmnsfem0d8wapn9flt6cmamlmtjs3h0", "1650208581104624896"}, - {"evmos1gx93r3dpx7g3qn9fu5j5fc8ezd3xu80k3c0yqf", "9481586480336404480"}, - {"evmos1gx9ce9nnsk986z80hwy0xu84mvsfqre2uvhpxk", "4574665452565053440"}, - {"evmos1gxd5hfg3d22l86nq6npg98kwkdz0hm70u2asxl", "4985607526499275776"}, - {"evmos1gxen772ak2j36qxznv55fmt8aygfqazvzl3d2l", "2037658755252206592"}, - {"evmos1gxgx0azqtd2dk8w3e80hn4rg53q2nduxy3tgwf", "916237690726124032"}, - {"evmos1gxhm4nnkt9dh4pg4emgwtwmrenlew4ge4ygmtc", "999369932353587712"}, - {"evmos1gxj6qvum665c3cvda52hmkezlyz7ldsqlnku0s", "29183638599484928"}, - {"evmos1gxjr7ts2sn0tcg0q6qe4eh740vlvygv8m68560", "4345303633212959744"}, - {"evmos1gxke7tzysmvpdjm7s776w3ap05pg0anakg9p75", "26510226967592448"}, - {"evmos1gxph4uh52djf2j626s8na02uarduxry7hxz4zf", "4709540928341751808"}, - {"evmos1gxr2ylrppkx8y4k7r67flv4ucl2xpqucd9qwes", "2810680264137572352"}, - {"evmos1gxsmetwlkn2c2p9cp9d0s4gepqnj7pd6x5w4ws", "1027411911302643712"}, - {"evmos1gxsp7r749nhqcqz6ngd2565089073hqyfuj2fs", "123681851351661035520"}, - {"evmos1gy23mf5kggz0pnp2znd5d7ysejxgkvptrcz7ea", "442013378199279616"}, - {"evmos1gy38ydknl85zks5khgayz29zmdyhm77advc7an", "440246675019149056"}, - {"evmos1gy53r3s4snsyda7hx8qq6vq4n7mrh0z0h2xdvz", "5174193975007012864"}, - {"evmos1gy5cgtpq5vj8ng7jse4k4zz2n4cql2mkjltc05", "55051589738766770176"}, - {"evmos1gy8q3vlxf2kp3tsc7tzsvmfxapy2ezuuwnf9u0", "183265699235201024"}, - {"evmos1gyc5k4n90c79klxz8yse0hdp6psn4en89mjj9v", "32816089290466959360"}, - {"evmos1gycfgcsnxswu82p07u7f4pu0ldh4fzs4u00x0g", "28138240704050872320"}, - {"evmos1gycnkg4dtqhj8055cpjfp0whd8z0ctuhxuahgf", "1103997993050456576"}, - {"evmos1gycsx6ql7gkwp2dahdr5yx2zdlt8u6lp6n9l5k", "77682252698914048"}, - {"evmos1gye4yhxc38fkenz8y4r82jedyjydxenqtvx9z9", "31887522222109933568"}, - {"evmos1gyeaqatvg8a328qheujlu99442pefktgh3knh4", "909013685624653312"}, - {"evmos1gyep77vqq30f9g5fr32v8jz3704f8jz65kwfae", "1604050825457147904"}, - {"evmos1gygx9xfks4eprwj80wv0patf6v7vnwqr0hmfvs", "351812823421710336"}, - {"evmos1gymh3v70lrzgydp39zkg2jd2an0ytt0k2l2njg", "12449674672518324224"}, - {"evmos1gynz3hnzvwnrc5a4jk5dhgwy5ev2g0msqwxpft", "387956252913133568"}, - {"evmos1gyq45hjhyupjmk0nmz4trdla9gwkwh5ewkpe4l", "5732501908414644224"}, - {"evmos1gyq6w4gydmpfyds4zctkektcg5thn6mvg9kka8", "1997105979497472768"}, - {"evmos1gyrkaepgugx8x6ly6j4y5vu6dm9npldrthelh4", "467935757072723200"}, - {"evmos1gyz6zw4dgzsr7ck5ty8j08ukxs59er7tfep5w9", "584922567607163136"}, - {"evmos1gz2wchcksmql3gzx68a5uxrk22ud06ehs0lny0", "2572526598964754432"}, - {"evmos1gz3sknlwlaw3rhwf5fxp68nckkle8mskfx6qmw", "12297071247401963520"}, - {"evmos1gz4jy44qhluytdm56pklr96q5kjd7rtng3gngf", "4912159862528599040"}, - {"evmos1gzc6c07al2avfmxx5q0lllep0c0kgdu0s5p24t", "4089993989704228864"}, - {"evmos1gzcuyn7rj3ul46daeffr95s4ww8qdjm479kjum", "13327588232944263168"}, - {"evmos1gze4fzd6xx427tcdxwt6vjcnylsnfccv6d4enj", "1183655013058997248"}, - {"evmos1gzj0e6ymym5jfga47yafreu2thzfgjj9f0s527", "5643755192804518912"}, - {"evmos1gzkv34a4hd7pj8xwf2v636fjwhef2gchqkf386", "197379516862046208"}, - {"evmos1gzln7fwa3md45al9e4cg75q77j8zy3gveq92qm", "98781932839118864384"}, - {"evmos1gzvjlp0hlxmwt875qld4dp9jd9dded5acjt7hv", "79803103595639603200"}, - {"evmos1gzvuq08uu3wvypdey3tju96c54fz6mgzj0wh83", "1223314239692271616"}, - {"evmos1gzwtupj63vtc6ke84zynugravxsyxgtr02mha0", "2697837159407210496"}, - {"evmos1gzxqdv2mqc8nzfz7n2fcq6e7j6m4fltesm3pzz", "27846074653077248"}, - {"evmos1gzz7n7m8nhf0vrpwvjh7j5e3qlapcx8js2v9uw", "20234948300595814400"}, - {"evmos1h00pupwed3wy7l3h0402a5su4sy2j2294cjlj6", "32442170732376932352"}, - {"evmos1h055c40jgghcz58c2fmzf3g9qg0erm5szzayuy", "1425365204927176704"}, - {"evmos1h078fu054nemvan4ejmwfz7dehf4t4pme2cs93", "59500760548233216"}, - {"evmos1h095u4j839w4hyasngcdv35dzw4fymv6u3rpd2", "110007827915727616"}, - {"evmos1h0e2ama88nrnuuujjuq29akekt6ne0thtue8cg", "859853716870103040"}, - {"evmos1h0f6qeu4laeejkt64s7lsccadxr9pjfd6p8ps8", "774686132758891520"}, - {"evmos1h0h6zlkpwzqmelw98qr0qc200yunfly5dhy887", "417352862383620864"}, - {"evmos1h0hk8wk7dc39h25vhustl6rfefhdk6xvtlplz5", "20174677747045888"}, - {"evmos1h0j0ajh2nfjg4vsqdf4x35tkdcslvst0hs98j9", "3205685385016898560"}, - {"evmos1h0ln9twa3cmxthhkrzghe6g67v4mwyv488xsfd", "20644339814563373056"}, - {"evmos1h0rcq8876ke97nxzp8jhx34a0a5qzy6x5cjvls", "3095947157303267328"}, - {"evmos1h0x55tefmhtpm4tyxs3y3dmhl879zqj6uaufdv", "475963884137634816"}, - {"evmos1h20mspxj8sujz0nknx29k5ze63lzku69umw2nr", "592923074063212288"}, - {"evmos1h20xd5sjpxfv7dtjzc4prhrzdgdzgez34wgyyr", "5845786326067486720"}, - {"evmos1h23j8paa242najqxvgk4yjcjhwuzg2sefpftdy", "458784412815319040"}, - {"evmos1h26njtycvehyrxfd40zp0s5n8rwvavd2v8trw6", "1526098810193564160"}, - {"evmos1h2ah4g3grl0ur27dnrqwgvk8qru4aq0syzl70e", "1410077099882800128"}, - {"evmos1h2cukma3xafwd3y5w2nlg3c3ysz3muqu456a8u", "1001228364168679936"}, - {"evmos1h2dt9ld9ahcvgn22un6m9h64p5nqzze2ypg8tj", "25667972484157833216"}, - {"evmos1h2etfgclspzl3xsx3el67jrskrjfra70zzdkd7", "41876302377424175104"}, - {"evmos1h2flgdzkl4sfeq7a5uuzygshultmh4wk0xg0v5", "8642576854966970368"}, - {"evmos1h2hax6qh257sdtkrut9fu4qtg5vdurff79atzt", "1769359015388172288"}, - {"evmos1h2jluuk7tlznaeswfy248lj2z8npap7jvvkkaa", "46486168078815633408"}, - {"evmos1h2k7czme2yqsud9magnfk4hz8uyzlw2mnz70ga", "1782253614287201792"}, - {"evmos1h2nzmpzy0zwtrls2pk9dlj7tmcjpt5cdcgl4nm", "3791123761675026432"}, - {"evmos1h2pxdhyk48stwk93daam6p2vuu3s0nefcue9ay", "38500056991479349248"}, - {"evmos1h2qj3kkwu9yll645j0fmyyc4fvuntr09wx2n0k", "369979234957292288"}, - {"evmos1h2qssmmhgvk3w8v8glkk8ytdee2l7fed4hx4me", "243880065415689728"}, - {"evmos1h2r4f8yg65x09jk5ugzz8rzcvur4wc3m8qfkrm", "419535425620925696"}, - {"evmos1h2s0v3hthw658hcsqftyd4lyacejdhpwke9f28", "2263797406487225344"}, - {"evmos1h2sz6n365na2z2xzzymtqaamg9e0uhhc636t8r", "1327044412541591040"}, - {"evmos1h2tmgl0zgtrtempkll2mzeeghcdeyk3hx4nlan", "308191194352778496"}, - {"evmos1h2uhygs796smq96jj7v3d04p79f9vrrthvyrvg", "351202223711021312"}, - {"evmos1h2ukzgygjgggk8v924gjefh8vy2dhcqr272hx7", "43230317343307718656"}, - {"evmos1h2vtdxs5psrcw33pn59m7zanhy35svm52ll62j", "2642016310711697408"}, - {"evmos1h2x26x7fnmw84e4yp98ugate5n7hfl37tg5eq6", "817065861063286272"}, - {"evmos1h2zf7c4p6w3klrm2eug6944kpsyd97pxrpfh9h", "5630152823337817088"}, - {"evmos1h328zqfj3vaxnl8a678hk77gwgt090qh3qxpma", "711227423980861696"}, - {"evmos1h348mn8uyl6g3cuqpyksw88lknuzcuntc37zrm", "6422091664306535424"}, - {"evmos1h35qwvj4uvczq3rfu27hyex80lyqjxkntq3v7w", "9871859290419539968"}, - {"evmos1h3cgcuxmnxfyfchp82erruk223hnt5dqckal9w", "3183958976057313280"}, - {"evmos1h3eaksug2u0y7xqcv787np97a63pm6cfhcumlu", "2808952607821938688"}, - {"evmos1h3g2an7vlfxhusvjtm5d5dnjyywx60x02f64fg", "3442223021711486976"}, - {"evmos1h3gqcvgt2kzsn4399mfu0pys3xzmu5cgy2wl7g", "1702975521758768128"}, - {"evmos1h3gyqaw5v88q5drtasqnas5352rlyrv99tydwx", "889811406787866112"}, - {"evmos1h3gzsp35er6w65jk82rlernuv0gexq5gcpu47q", "1706532665161697280"}, - {"evmos1h3hc4dunrt05ey63tnw3pld0332244zc2rpevj", "854721293101744128"}, - {"evmos1h3l6qczvyfae5my5v247gtpfjcr9a8x8hz6s9d", "211767469263462912"}, - {"evmos1h3laqcrmul79zwtw6j63ncsl0adfj07w2as296", "14006594379600343040"}, - {"evmos1h3nhpcgkj7kguw3ppupf9erf3ygtlgsmt9qkdc", "603670967133603840"}, - {"evmos1h3qcd74kwyg7kch2jpvdrk2smae8ur9fz392pu", "1568720928131252224"}, - {"evmos1h3s9a9xzuht8n0zfr4whannx0wg62rrw4w0y98", "16571633390010314752"}, - {"evmos1h3st8d9mm4jxuxdskheeu65rca8ckdt6zx500k", "153794468583545344"}, - {"evmos1h3tmuudtchwymrgpfxx2fd7q8l9zyvwnc0xmjx", "20233133164949381120"}, - {"evmos1h3uuwyuusl0evhc0fsj8glejd5vxf3d0wmphhv", "938153715847732736"}, - {"evmos1h406w2u5lrcacjwump5vdx0900lfyfwqy09x0v", "833991312963567616"}, - {"evmos1h40qxad6xturd4shh85smt44wqkqlrm2wrvllg", "2351843634176649216"}, - {"evmos1h423r2duw3eaeq0qnnk5pwajrgnx9np9r5ntka", "386650498723468800"}, - {"evmos1h43vp9acpw0yedanwmktlufqwnymjssnrtpdte", "2214308813402289920"}, - {"evmos1h44jae08jdexmdkewce67ua6ustkrz8t3j35gd", "2196395568559554560"}, - {"evmos1h460lfu8rv5n8xr7a873ajnulnh2gxrsstqgh4", "4062766555916828672"}, - {"evmos1h46lqrprw3cfvygaq8dycqjzryg5uwss8m0fa6", "5284371337582151680"}, - {"evmos1h46muu2d9cckp96v3maxxqrak270j8pr3kqk5n", "1102990143436896256"}, - {"evmos1h49r36g8zrk8h6ef9y3lfgd5k8gpxxm8ruw3y8", "326494821866352640"}, - {"evmos1h4c097qmh3furlzuxjl06atuxknhhfk2vuhw8k", "1122042979934300672"}, - {"evmos1h4cl0gv0zxtxu6vjg4t860ykfuy6al5j8ssgyy", "3121210758106439680"}, - {"evmos1h4cnrayf6yfwsw7g378x0afkd9ragqy98ku0uw", "20857960691057827840"}, - {"evmos1h4vwnnt444qgywmry7crgelxmfr4hp2j6c547d", "14380670226823426048"}, - {"evmos1h4yue2kwpfdvexe0r83e56ky9y200dfnylee2p", "35400900369649192960"}, - {"evmos1h5359kfmqncvrrgmf7pfxdknpdux4r5rd2lvwc", "517576486362707968"}, - {"evmos1h535jlctlu3lhm48png5my376zx9ujq0h63l8n", "1494457488545836544"}, - {"evmos1h535pxd6jxyq4eq0ltgdztnaalna8hn78r23q3", "4148838242445448192"}, - {"evmos1h53ant4zj37h6p7l8xq4vqmf2umq92cydu83es", "490840246329123840"}, - {"evmos1h54p3her0sqcaptdezx8yruan8vzkzrdgtfufu", "2624213707941806080"}, - {"evmos1h55z9nqn6ny4295hp403z6gz73zyhuxwp03x6p", "5712600125229006848"}, - {"evmos1h58gls06vsx2rpfqtuv0r80k20dlv99ve9lkxq", "3424708022551793664"}, - {"evmos1h5dy8zxecze4eeqs2l0y0c4pxtue8lpn587m20", "28259057082664886272"}, - {"evmos1h5h5e3wq40m6em9t6rea26cuptcpxqfz2gkwpk", "5712631920941321216"}, - {"evmos1h5h8tucgfrnz2t9u34c0su9xtwyctffz3wm454", "404146152301256960"}, - {"evmos1h5hsg9690wk4ltpnykvhhxlc630ql74pnvz9ns", "2623313877864579072"}, - {"evmos1h5k4tdl3dy7ylveh4zdvkyhk2l26elyzx6ey44", "18922029552516096"}, - {"evmos1h5p2ddyw52vt8yrnqlkz2wpfclzrna5jqq2weh", "30067573969777897472"}, - {"evmos1h5sqq4j9dk8ruxv7lh74k5azhc3pdzun4y2q4x", "12685718550927908864"}, - {"evmos1h64u9g3zz5mzxeausyqp3q0fftuyg7myv3a5tr", "138987457882131456"}, - {"evmos1h68758serw55mx99cvsnsjkx4kcuzdrr8s4add", "105870132174208000"}, - {"evmos1h68twtfn6asq3w6fvsvfaph4vdu2e3gcurkgf2", "26109614274299136"}, - {"evmos1h6dxnhazhjnt4dvtm2lfm5wsnx7y8p50dsfkd8", "17090284540743225344"}, - {"evmos1h6h5y2s837capemqv76d65se35k5tunx7yfm8y", "898033279538432"}, - {"evmos1h6k3gyqrtx8gu3qj38z33g4hl63ayp4zs20mna", "5071637439687544832"}, - {"evmos1h6kre8vzcpndshn6zxz3vrkm4xfm6wdt8d4z9j", "554567255422906368"}, - {"evmos1h6qcwreecd50sydaehv92eygkfjkl9wgslre88", "768896882966611968"}, - {"evmos1h6rzknf4tmxnnwlj84le88wrt2uxcndadg7a2v", "705594481577115648"}, - {"evmos1h6svqev8zp9c69ykk3czcjp8y3ce4m492yjgcn", "7533001150572670976"}, - {"evmos1h6t7gfs67zk7yewgsd42weyrxcr5gatq6365r0", "6502557984832442368"}, - {"evmos1h6tvszr2lpzpd3mwmy7ahazmxppxymlnzcwa4w", "787207127298113536"}, - {"evmos1h6u0jkyj00555udvnpeaczkfvwh99w2zvkqnjy", "1540085314019224576"}, - {"evmos1h6vw56553lmyt48tkyk2q529r2wxr0s43xrq75", "387089355178766592"}, - {"evmos1h6x53zcmyexnauh36jxttuulfkvskjs4ym7xxs", "1248948715148731904"}, - {"evmos1h6y9v7t93m94pklnqlekyep4n3dyjdl56ln8ym", "803184838676463616"}, - {"evmos1h75nnyvcnyscnsjw3wh99c03ndmfxjkhmr7mr9", "493707664409170944"}, - {"evmos1h7arxkv98sh5v46eer8v9p909d8e9nectmex69", "11543593592663187456"}, - {"evmos1h7e8d3t3nhvrgvsznaw5df0etpud80vxftus6e", "2155178756477878272"}, - {"evmos1h7hsmrlh7u8u9uf7muxjysr2afdylg2k84ayxt", "30140485678410285056"}, - {"evmos1h7hu4gsq3e4fmaarnpj6henahtrs6vn03nlurl", "5165992125902331904"}, - {"evmos1h7n6k470gpzttumlkzx930tmdq88xxt8x0my40", "10266514544231569408"}, - {"evmos1h7p40nfexn74rnf6aj08385umwjctz4taq4mpq", "2400305669210438144"}, - {"evmos1h7qps6u3l38njj9g3gxc945et2sc2m0nyha423", "5109109195600838656"}, - {"evmos1h7ryrqcazhp8qxapy2vpc0t6dgjn86jgtx0mv2", "381617794224828416"}, - {"evmos1h7tvsecmcx8snnaf64nxk4dxgmzs4fuy0esdk7", "1174245753518457856"}, - {"evmos1h7uqntafxnzserc2zh6786lhnj7hznu8kd92lf", "4754373508219616256"}, - {"evmos1h7uxldfymfr8pay7g86jw3mc69pzsk2tm9ljzc", "10023139104960028672"}, - {"evmos1h7xp9pmf28f66vc47x52rj6fc99hhs5kxmqalk", "83888494901142528"}, - {"evmos1h7yqvajhnw0tulhm3te4dj2qqymf9uf6yhnpg0", "234079739756754688"}, - {"evmos1h7zgt4hz7dyx05h2xa4m9pphzwyjuaew22r2py", "4143132105564002304"}, - {"evmos1h7zl062qy84sfflaqmnhyesky6e62cgrllrjf7", "1311384872687618560"}, - {"evmos1h82gulvhuksuz0mr58x3k5anjudqj00zvelu9k", "1321074807091834112"}, - {"evmos1h885c78762jzl5z87mvpaaape5qcf0amrax4gt", "18832149512297963520"}, - {"evmos1h8an2050hv77e5acca8cydl8kkera8j0x75qgd", "1299247404972210176"}, - {"evmos1h8cf539tkg58tjq5dxyg0u35enldh8rwjhy8gh", "24942272664817557504"}, - {"evmos1h8dtpkk02zc80y5csjgawwu28l3rq9dh0r9s8x", "3093780143181209600"}, - {"evmos1h8emy7djzeee6ummfp4cffzllqfjxnpjwv48w0", "98925697214314496"}, - {"evmos1h8f7tavxfhqqnhc8ejhy6h09wpgpdv8vz4clrz", "783402677083828864"}, - {"evmos1h8faz5s957zlujfwuclzdc4vhyf3h5zmghqtky", "902848465887084544"}, - {"evmos1h8gfqt0f26gxpp4ynntkpe2z4jhuqy9297vmgf", "17754951713157343232"}, - {"evmos1h8gqp8yk2zljgkeq29xe44qs4ra4n44hrzs755", "1000719906567191552"}, - {"evmos1h8gwpvqv9dzwja4wuuqrtpf9zg5p0v7h4zujfn", "6946281263204492288"}, - {"evmos1h8klr3y4lyg0zq9pk0e7eny4s09ham7dp4hzkt", "1589474746653518080"}, - {"evmos1h8lvqpx2950lw9cetdhe9sp29y2p2efnvg7k3c", "248618646178754560"}, - {"evmos1h8met59e3tfcxrzge82ke6zyukfun9gr54u2lg", "2361580806122585088"}, - {"evmos1h8mk82kcz6yhc7redq88dy9l20jyp0y7m5539n", "567003405870075904"}, - {"evmos1h8mzeyg4c0rd66h5udpvf0zt4hs4c3w9tmpljj", "8626529913438947328"}, - {"evmos1h8nwa73s4k9hturcpxh8a8ec87f6f8q3axf72s", "691634075524806656"}, - {"evmos1h8s2lg0x8pvv2cd9jc8g2aqk0rrmnedjfkp3qt", "4643484362400206848"}, - {"evmos1h8shzrv3dcg6jeant8cgz8s448f98r0ya9lvjv", "4657244819447876608"}, - {"evmos1h8ts55yk8dpmu0yy93jqy4adm9qcygjmx04lfe", "3094691885016726528"}, - {"evmos1h8u6a8mss4cqp6yh97lwq6uc4d5le065qtwrjh", "3469318624988632064"}, - {"evmos1h8uh9uvlf8pklwmvc3u585tzcr27pz0f7dxg0h", "64787480282735271936"}, - {"evmos1h8v3340dl55350gcxws03pwqmvu0tqrcnjnn6y", "6283244983421364224"}, - {"evmos1h8x7ldx82grcl6xukqdkgvxqpah8wqjy62pxzh", "21811044348026425344"}, - {"evmos1h8yj4t4yqrwm3kc2muzd762w2ashfxj3s27gwx", "3042689739214696448"}, - {"evmos1h8z0s99s7kfdpe39nfqg2h5vjsxsauv36zzyc9", "5231195568078880768"}, - {"evmos1h8zr6kq8z6tfp26vra638cmzhuec6ejy50x7q6", "1813264822351939584"}, - {"evmos1h93dk6jy03m25pdpp2guc7l609zaet5xtv24da", "1638836670370545664"}, - {"evmos1h95xckdp3peqevem3dqpkrl7g29phs6fmu4vvq", "1305644991348509696"}, - {"evmos1h982f325qwvv95s5tskv26gcce4h5t8xuwepzd", "755351524289056256"}, - {"evmos1h99gua8jxp4qh72hhpu7jccxvhpqhq7n64yxlp", "2687160372911833088"}, - {"evmos1h9c0rmm4vzkry46rkhw6sxpxtdvc6dauqn79du", "1159345587484339200"}, - {"evmos1h9c6874pquxdl2ufdr3949hvdpzckkfurdxthd", "6375343846826377216"}, - {"evmos1h9ea50umzq3ze3kv0l8m3uger93ar88jqs7v4j", "4117359503341527040"}, - {"evmos1h9fsxcwzq9uq9apzmwzt2v9srzuyq2axslfvut", "7679041007576674304"}, - {"evmos1h9ga5wrs77marcleyjwp36fatnzux4ju97ggan", "7268419332440735744"}, - {"evmos1h9gnlz99dc99g4hpr5lgthna672sw4tzqyzpep", "9059907465992032256"}, - {"evmos1h9k4paafhvcxjz22qw84zvvafrc2yqqafg3rp0", "411283029397281536"}, - {"evmos1h9kapx52sal0n8k0tjtk5jmzwldsakzk9mw5nz", "1077488927197140992"}, - {"evmos1h9mae679jl5kwycd0w5e6azrdtgz5tqhk68wpr", "5574692649217327104"}, - {"evmos1h9melm7ppsrsl5a9pfwuzccf6jqv0l3943wzqe", "467362880713270016"}, - {"evmos1h9wssaa5svy93ld0dgg3rk9zxvs5cp4jxg84he", "4100618762202601472"}, - {"evmos1ha65gm2h09y35zvezye2pswctun02nl7ugykq5", "917392156412655616"}, - {"evmos1ha7djctyvxmhdjcpp3ktsxy09qxzdz30yju0af", "884198821947056640"}, - {"evmos1ha7ltqpu02fxja34vd7ckuep96hp94fwd3xrwz", "2090464337171801088"}, - {"evmos1ha9eejt6x3lkgzlyvphmzevwwjnsnua6w7yf8x", "1532450254018682880"}, - {"evmos1ha9jwlff2ksk8e8j4xqxee2f9tt8etp967tcug", "2185863611688132608"}, - {"evmos1haa89g0ejwr8tn7fav7a6mmfpu8m5teydalt0d", "4430284141455806976"}, - {"evmos1hadcqw4eanwmsehxwewe0ar7yvhnc0c3k3clg9", "1519871957359933952"}, - {"evmos1hadxx75lq5w843wvyy8msp5d6jjcv63smj8qt3", "4028450472320606208"}, - {"evmos1hafxhd8hgzxjayt6t047waj9u7dkmfrxyrldqv", "1590548271346188288"}, - {"evmos1halenah96mh9j4w33y5jh4dw9enr7tgmuu5usx", "28368775098362245120"}, - {"evmos1hanrz5gywapwmfz778f7pgdknvamzadn7742e2", "41190307467304484864"}, - {"evmos1haqlx9euj8xuhf473us98594rr0y4mzgyvxwqt", "1122556692109591552"}, - {"evmos1hare7h7annvk22cq8dp2hh4ummeh4cs8hyh3q4", "850886408643182592"}, - {"evmos1hasec2lrw2d73mv78csmydskcvwx7lcrrw5a3q", "478605473348184832"}, - {"evmos1havekex67ngw39yzhrwxwet048t0xttayldax4", "877064382825119232"}, - {"evmos1hawk5awjvydlqlr4f3qhs79hal2ruc2yjq8q04", "13147755120182714368"}, - {"evmos1haya95v5cr0m3sc3c6dj6fdyzlsz766emn05zg", "41979194618839302144"}, - {"evmos1hc24k2g4mckqjk2zy2nwytg8ugr72txpat7ul0", "803389637839407104"}, - {"evmos1hc2arkvcsv8qzces24c35jz0ngsxz5p8wxr4h0", "83780864189981147136"}, - {"evmos1hc33g3egpuq2hpxj4aslh2twl6wls24mrfzruu", "4863646514235876352"}, - {"evmos1hc3k4xq2m6vg0xrw9e4dmjhlf8dh3lr899pw0z", "3563913111427387392"}, - {"evmos1hc3n6s4ne7dcj8vxdemnh6e20pk9rrfkwyacda", "9839655115895111680"}, - {"evmos1hc46y6yq9tq8zz43zrdvdajanx4rehjuettyak", "4068123210083219968"}, - {"evmos1hc4uf48wvy0u7exqydsmspys8gs2uqd52gdxat", "803464344013013504"}, - {"evmos1hc6kmh0er3t29j3het4yj8q2qm43upnslhv2wz", "34138472209142016"}, - {"evmos1hc8m57634xq5q6hxcj5twpq2dajkly0x4nqwe2", "2537673080674563072"}, - {"evmos1hcd0hjf6kskhvhvs77c95ms9lntc7lu6uxakn3", "21053975423802781696"}, - {"evmos1hcdnh6g886t3j4j9y5ev8yfj0sdlxx5qw27kxl", "2118756831129691392"}, - {"evmos1hcfqddgczs2qz53qf45h7dar0x7s6jve34xsgs", "5509894226476011520"}, - {"evmos1hchg9p6grvc59emptudhq8vmksd0cdgjgedfdh", "369404785486505728"}, - {"evmos1hcj4s5kyxqwk8yhmr4jsqwm6pc80de4sgg4vtw", "254631836399939072"}, - {"evmos1hclfjzrh6ecwvmx0gysw829jp79p8rjfc4l5a2", "1068594018984205312"}, - {"evmos1hcmcf6vl4fq62lk8gv763uuuzkk70628zcdugh", "2185100696182532096"}, - {"evmos1hcnxfnwxczna6tqfjqk5peru84kwdzuu596nt7", "6775570250416259072"}, - {"evmos1hcq4netxxep4avz5thxwsk6rqascaz2agksy9t", "2528446402220852224"}, - {"evmos1hcvx3tdpvx7x3jjm29239na0zntjpc3f0qclsj", "2277970211129193472"}, - {"evmos1hcx8w0argksy79tslkngt88k2q8yxlwxuw7g45", "883720743012857216"}, - {"evmos1hcxurc9vfugu7synqurmv2sem2sdrl5w4s72rh", "20494365968097337344"}, - {"evmos1hcyafngqykjjza3xs54jz4m9jr36vtfr6t4956", "4132310517337931776"}, - {"evmos1hcz6dted7e4qquvnep93q332ua5kmxkd09d7gd", "718853648675812864"}, - {"evmos1hd4392yxlrx56cqpke4ttcg5qhc3phqelm9ta9", "707903594280903936"}, - {"evmos1hd4emql9z2c73799hvc2hjs97e2rf3jl5zznjj", "11020252459000815616"}, - {"evmos1hd4kn8y8j7fzz5suc7c2cgs2r73qjgac36dgq3", "11834315303741939712"}, - {"evmos1hd4y30ryjq6ksp4sx2xy3jp4qh3xdhudfwxn5w", "76549944281288278016"}, - {"evmos1hd5putha58lre0uzyfte2pljjm55j0cvpm9x4f", "62434066698572423168"}, - {"evmos1hd84pd8xl9fgdkfkngvl8rasztxwpc574ysewc", "55427180677549056"}, - {"evmos1hd9yru7y8h0vqld30hs0r5lg3ltzx5jxyns0cd", "284549113985966080"}, - {"evmos1hdgmcf6lutnupwatumtp07vkvk3u4zx5u9g9f7", "873866777278259200"}, - {"evmos1hdj70hu8z9nh0k773dx8thje4rnan3jtn3h5x9", "2855662288825186304"}, - {"evmos1hdjjt5n36w6jtrmshxw95vgg0mahpwjkuuhyc3", "1655510386535164928"}, - {"evmos1hdmccrgrejzylmcptld0nvm7auw0n84vjcwnrk", "380246508378651904"}, - {"evmos1hdn0pptempspk0vlxe66nxkw4lmfefwpsjllee", "52931261702114852864"}, - {"evmos1hdnamne8ew5jdp9ztwteya7l38qys9kzst2xwz", "20980331363461054464"}, - {"evmos1hdtls3a5g4lncwzx26telcjjlgvc7pp7hhj5gm", "3093075835763588608"}, - {"evmos1he077mgrek9lj4vps7amv7mzywkz9zt54ayvvy", "1905557085971713536"}, - {"evmos1he52yvs7kqs8kne7k90gjzl6hcf7295n0wptr0", "2972576215260553216"}, - {"evmos1he6xkd3e4u7n7wn5xvv0z88yqul8rapd0m29u4", "3002170768721588224"}, - {"evmos1he7astav637ntxyq8azvhxqq0prx46arr38glq", "27863045370319822848"}, - {"evmos1he8ay5yc7auky7fmnp8el3sen0skqd320etkas", "1471254734946850816"}, - {"evmos1he8glkhr0pz5ue8hw25tan3j9n5mtl352akflj", "2216579587067308800"}, - {"evmos1hecngcep2p7z0d6za4rxxye49euz99nndnwlnv", "2724117239100800000"}, - {"evmos1hekzc4c5xe32097dqm2uhgc0cl4mjpyvmpzhgs", "222229130829349683200"}, - {"evmos1helz67j8n09eeqj9pcj9pwh9zhmyzs0j7p872t", "24953705334558208"}, - {"evmos1henf3la6grfnavxku9pf8a04xw90hw6zw9fpvr", "1193339282945236992"}, - {"evmos1hesfc2nlw4e9hc3epektjghdgkxs02haqv85d5", "1052977591038420224"}, - {"evmos1hevpgyqxhx2v9hvyfc472ssg7z07es5pxfcp0t", "972712687451377664"}, - {"evmos1hewjqdy4ecu2errpfn2ujlqyjaev66nrukd68t", "1281421359397252096"}, - {"evmos1hexeaecuwtcea6a5xhzphe342xx5dnrtgs744n", "3572520475578570752"}, - {"evmos1hey4ypps22hv36rpf3k5fjwdyagpehhv9yn269", "2374280749408504320"}, - {"evmos1hez6hxdmv6828fj87kta2feawqv2cq7qguzx5s", "3722450401083129856"}, - {"evmos1hf0dfyt36mejr9wuz53uhllv6wad473hk72rdf", "475884401713001216"}, - {"evmos1hf3af0fktmtv2q9wfppxjl7swc2yxf8x0qgmkq", "4574139079010423808"}, - {"evmos1hf3mz7z4ylkc9haxqfswazul74sgulvstjep4f", "3815916806465953792"}, - {"evmos1hf5n36u0whlw8ctke396p65wyv5ulkw078ulx0", "45468274690200551424"}, - {"evmos1hf5zukfhsnmk2nj0jt2cyy7uf90j98hvt82zrv", "114260302016166789120"}, - {"evmos1hf6hagtum8y5n6d5j0mt9ehrvkdemt8jnff8k3", "7486773334000420864"}, - {"evmos1hf7hqsszev7axy0utnevt6favlfxzv4uqugy8d", "703346367150071296"}, - {"evmos1hf7uhyex5ewyz44gw82qnp4ry6dwu0qhax9t6p", "1640377032785833984"}, - {"evmos1hf87nqwc6u530kfmdnwcj6g7a84fm2fptjjnf4", "5168823028468891648"}, - {"evmos1hfa4a66hhya6kcsmnww09cg4a3f8qnc4kntj5r", "778681748708776960"}, - {"evmos1hfa5pguf329d5235rpjvftt9nya0vjjgdsa6lk", "49616693291283456"}, - {"evmos1hfaxrsv23gvzwr7vdt3u2zql3nxml2egp0dn6v", "7767451972897116160"}, - {"evmos1hfd7c0cktudw594c53tdjsw2gp8gfhlww7tplk", "29638796859829370880"}, - {"evmos1hffm3rz4j3pfq08p7j5jt67jaecukhnqarg39a", "1974634121414328320"}, - {"evmos1hfh80r0404lwzeldw4srhyf7nu368fmlq69dqv", "4496645660868653568"}, - {"evmos1hfhl463jqmvxupxurvkq98huhx2fg4y7vph84p", "1281703520592085504"}, - {"evmos1hfjfl3q5tate4nr7hgft529hf3wff9mwgncdxr", "1316923430229759232"}, - {"evmos1hfl9lwshrx2usrdt8fmxqxk44rff3krtfafk5c", "28065050934407352320"}, - {"evmos1hfm5hdpj2qs6a9agxuu43aecjl4798m87g7v8l", "45209847469005312"}, - {"evmos1hfmk32emw88fgqwh4grkwk4qlesm2uvzsm026l", "86783526230986752"}, - {"evmos1hfmzh0wnwklatm9v98ayvzskyfsm8v9n8qtd4u", "16534800505088757760"}, - {"evmos1hfnrw7vhjzwaew5axjpvlt9402zd2raf6cfd8u", "1284743091364165376"}, - {"evmos1hfq4kv3ewfqryfvzfvkqdlzazv5zzd5cxkzgqv", "37063052076336709632"}, - {"evmos1hfr4jxahkqvttl4mpyhl6u0d9ye52xpqsz7z28", "163662147752337408"}, - {"evmos1hfv4szur0ljhn33t2ssgm0gvzr6al0g4q8te79", "103151477045450440704"}, - {"evmos1hfwxfywlv09r7yr3dx4vur4rkrzdkjcqhs98qx", "172929750452116992"}, - {"evmos1hfx9wea2z2t7sa5cka3w9ez65yl32ess948vj9", "13902895596133957632"}, - {"evmos1hfz3epzvzlz57w7pk0fmx25ed4xfjvaj472wt3", "3628904315862897664"}, - {"evmos1hg089uzh4qqrmyhhx6au632xtr642lrxhcuj09", "300900561971235072"}, - {"evmos1hg2vv44sd54qgx2txy57gv6969ekg9r3x0n87k", "3905852094756567040"}, - {"evmos1hg4r2pyc7v88h4t2jrth45wy8ler9lca7hagqt", "152537152707954688"}, - {"evmos1hgaxxc7m2ranx59ezaqqcfpmkwswjfnu6w6kux", "61056277850609213440"}, - {"evmos1hgfm69frl5ljclufyjnayfzcp7wlmd8pceutcd", "6858164127852325888"}, - {"evmos1hgggfyw2yclcf3n695zpnj9yhykjtef3hzuhsy", "769617403790554624"}, - {"evmos1hgjez8walp3zs6evmwzle2k2wmwmpypjp8g7el", "6851963330864791552"}, - {"evmos1hgnsa0v4nn90pvn2udzgkr6kfgjyqh6xer2j6e", "1541741419591147520"}, - {"evmos1hgp789g3nfs3fymm5xr5mqqjsl22jh26v0jsuf", "1416521215515040768"}, - {"evmos1hgq5xzjrf9klnz2kus42kz8tsh9pq7a3ljtr0t", "4263754606576762880"}, - {"evmos1hgq68m0n6fgtedmy7t9mr903zaruv0lrlqz22x", "917767539685970560"}, - {"evmos1hgsdwv8pc4r3kg4k9v6yhml7ekwpgg489lcpky", "3965511612175616"}, - {"evmos1hgts3jt9rzm3nwe59yjsvxk8gl6h00j86t7202", "16834214094267262976"}, - {"evmos1hgtzfh8thuqhhtwt0u7dwhk7qmxedl4txyzjy3", "153136261736254464"}, - {"evmos1hgvwgc4xz3wpk3d4weptwyt0terzt9zmn9yyxl", "1590442022926529024"}, - {"evmos1hgzl06qdur3ywsjfamqrmfsxzueyprlahc760p", "19325103794856192"}, - {"evmos1hh05mdzrznh50jehnvcau22j6c0a6wnkjsz7fn", "4976237283860922368"}, - {"evmos1hh4y239xwjwj8ave800el6lghlnazsmp5munv0", "3327304471482845184"}, - {"evmos1hh6gjngjckr0yecnpk5hpks7ey34wjr68c09ut", "768465661502487552"}, - {"evmos1hh859hgmqrk3v3z662pyuv7q4re2rzftpfuvpn", "4375459356893431808"}, - {"evmos1hhcpa0jz2jvlykw73agec6g8czag9w6knznl68", "772806429001805824"}, - {"evmos1hhdz6pm53ffaw922kxkn99x7geg8lqkgj2gpld", "48593533560574099456"}, - {"evmos1hhevs0w8gdg44ddax80vh6e94gy7ectuwj282l", "384127897464329728"}, - {"evmos1hhh4hv9wt3xcf040axck0tvee02khzt4a9f65s", "43773904042996334592"}, - {"evmos1hhl807kf42jgd5hw5rlqwtw9p3j3u986996pm8", "451497510575397120"}, - {"evmos1hhm203jy40pucz3kwq3fgu7zzku7llxxswqk5m", "2479967788806325248"}, - {"evmos1hhncuzagk27w4t8jvycmtzs6l8wkzg634kekff", "1394521045734502400"}, - {"evmos1hhr6cqckwx7kwxgtpx5v8jc70petd34prwddsp", "4071964199958437888"}, - {"evmos1hht0km7jf4kkpzp56kj0yy3fch59l69fk8x6ns", "2830021295605534720"}, - {"evmos1hhtpdufkym5jan3amx7kfdezk3n9j7h07dzk4t", "789371927877619456"}, - {"evmos1hhz0jwc0r5lfphrqak69jq348phmrlu2rhhumy", "33819583182574800896"}, - {"evmos1hj2jepgkl0nhaj6uyxhtjzfhye2lwh5ms8de2z", "1638364896127518720"}, - {"evmos1hj3cs59tw05k2ncsz62gqwkzmasung9ekepxk6", "1381279465798530048"}, - {"evmos1hj6gavlajfs6ft9fqcrt9akuzycj7wml4dlvay", "1293787762832375808"}, - {"evmos1hj799qdf0nvjprxmw8lr2h6n72t58gye4fycqf", "5544218689460670464"}, - {"evmos1hj86uhusc4l6wluldze7ah8v95n9krtf65v04f", "2568004083235579904"}, - {"evmos1hjc57r8kndg5ylrsq09am5dq8f46r6d06wsph3", "16298329491111837696"}, - {"evmos1hjcujdemzg2va9kws3ckpcekvz4zj07gqaus6f", "10788329505813032960"}, - {"evmos1hjege6r2fl5synspdw8tyt7g35qrs2j2yysckc", "4371680893514496"}, - {"evmos1hjha6epprrj4xcpyva08wmfjgymj3hggl7xcjn", "7115829169239326720"}, - {"evmos1hjhr6t0vpjjyz40kwd93f3pqctakkumcwusck2", "2244405329838649344"}, - {"evmos1hjn5th96uu0vh0dup74vp0yvd0ldk7ecl9n6tx", "5838608900970475520"}, - {"evmos1hjrdqreeajnq7fmlffcg38dwkzph82ne7n8eeq", "3377916707431876096"}, - {"evmos1hjsarm5nsf7jd0f7tn95uxfu0yjgngtjyj2np0", "350263136922312704"}, - {"evmos1hjutrunkt0s7htexyp8zqjn3fxq5k4jxtgxewz", "11686041686635732992"}, - {"evmos1hjv50j9sr86hq98kh88tapt367kwr5k2tpfhgu", "3973435892772294656"}, - {"evmos1hjxtvhzhcsazgnr3jw5aptyqu47mdfce7rrds3", "3594196036230194176"}, - {"evmos1hjy6hh8d0mvu0m8p5yun93sxattz8sq0ngzvc9", "935144565199843328"}, - {"evmos1hjza727h95a4zlk2r2up48qrssvckre8sfs7rm", "13660998734849277952"}, - {"evmos1hk568sjpq5aacf6z8ekwa6pm5r3xht8zc3e8tl", "890405963799636480"}, - {"evmos1hk5kd5h7aeze6gd4dzctdq6wxze0lk50cwndg3", "303905176674209792"}, - {"evmos1hk6r3dage2yz0vj32vyjv3uhdq8ppgn6m3rljh", "620784685107367936"}, - {"evmos1hk6upwzfjm0xa0zl7rpr9k6rs82qa5ar0v852r", "8908482146382721024"}, - {"evmos1hk8cxlgljhep7ryevup8wgnaf9tc0ar4mllalz", "518548516456626944"}, - {"evmos1hk9eju74d7vpgx4wt8cuxhwqttucch7v2r28yx", "1661402913312715776"}, - {"evmos1hkepaqtwg40pvskmar80ve52vtscqetmuk7896", "4102946531032075776"}, - {"evmos1hkh7lxralchfp35txq7c97z0mgngus7up8s6le", "883502090503552384"}, - {"evmos1hkqpehzu5vkumgv4czdv5m9e0ug4nyygkg5f4p", "10841734810940059648"}, - {"evmos1hkqsc4yu9p78t8leq380avt390q6trkazy6gln", "323420376039117824"}, - {"evmos1hkuca5dt6msfsyz2rx30vuelzfxnvjwv9usz7e", "460326456394858496"}, - {"evmos1hkwwvp6up8xeqfpfd2uk64fz765eqc47vkuqeu", "29229198387614932992"}, - {"evmos1hkycc22967yn9lj2fyj2pnjfkrcm4msn6aa50r", "1322880617207775232"}, - {"evmos1hkz45ryqvmkh44yfy7rmggwztehqjqhkl8zwnv", "628881049916528640"}, - {"evmos1hkz6kwg4c4tn5mv68e3uc4k6u3xwavfqt35ayh", "783726562827186688"}, - {"evmos1hl4ue98agtqqq8q2kyt6hne38yrshpr9ydtlgz", "3266841221061640192"}, - {"evmos1hl8rpgkawy0na5jjyw8gyz3u0xhmtd822lzzrh", "68384477090897158144"}, - {"evmos1hl8sfvn0kz89s5kkn06qq2dm0pw0smkr5u8aft", "848627583488332800"}, - {"evmos1hl94p020gqxa7cxvjpzgpg0a4daf93jmukf7qt", "4700858074863005696"}, - {"evmos1hlak560zmw2t6c8pfylg9mfuak3fu7q5znr63n", "1901235195376792320"}, - {"evmos1hllvvhjsnxpx5n74d99ykeq4axaypn8kngv8xp", "22714787750621638656"}, - {"evmos1hlm9nqwlm736q2lk9mr80j9cj336rd6mn5d80z", "813303699181862912"}, - {"evmos1hlqtfjdxe7uqkp83kevz7p2gqxt3kcvla93elm", "763626079120546816"}, - {"evmos1hlrcw8ed56n9wnp6x4mse0kazv2m3skq6mq4nc", "3765276836302403584"}, - {"evmos1hluagjukn5lwxwu3g527al4x7l32cxt40nl20d", "1116276175577667072"}, - {"evmos1hlw26n7j48jdf3g35a98706wmeqvrpxllhfyfd", "128307182373138432"}, - {"evmos1hlxuxxskx8gpjj0d6jyr8mv45clqzuqtnpg5q5", "1940753116396398336"}, - {"evmos1hlyeyt6llu3dk3u9ldhd9p0wgyldyce6h2nc4p", "942534604655630848"}, - {"evmos1hlyqvesw4xxzmhxuzad3cq7q8naq8rttmuyrjd", "4392343623601144832"}, - {"evmos1hm2808lhfv28awwp2skjgxls862cq4q2xl8hh7", "24756482807756439552"}, - {"evmos1hm3drf6w9wqr2ue64suqknn6txq925fvy7m35m", "1493382679590381824"}, - {"evmos1hm45xlhdurnz57tdn6wrxlmzw3hfykpjf0rl8f", "6722815553925834752"}, - {"evmos1hm7hkfygtndl0fq02v6g8ztxfhac8xetkqvleq", "2296680875891851264"}, - {"evmos1hma6mgtfmewzvtaq0w2hca69rzc8gm9ddre585", "2477650287233460224"}, - {"evmos1hmexgf5wsvkx9hsdde7dsj6skac2e0qnj372ln", "15617709252118339584"}, - {"evmos1hmfexglru9g2vlrz8vgcwplhzkgn6jgslve3gq", "3120011486905401344"}, - {"evmos1hmgww29wynvpvtd2wgmm4rxqnr7qfx44rdtv4t", "38587632239523749888"}, - {"evmos1hmlfnnekhm4c7848aers0928xk3vwdmcs208qx", "1426899458977538048"}, - {"evmos1hmmw5xy4qswwrgsjnaqqxyw8a9fm4dcy6uksev", "6799693205270380544"}, - {"evmos1hmp8ec7ruzljjjqxfu6j5mt6rrq58wvyp7q3y7", "7926886472514212864"}, - {"evmos1hmp8lpwxwh7tusr50muj40hal2w52gltruqged", "342549387585693696"}, - {"evmos1hmpcra4as5cmrpagprau0c9uj679yrk5lfxqsu", "1339584574689927168"}, - {"evmos1hmru24mqk2f8mq08p5afrgrymhzl235rdj8v4z", "5353700077788545024"}, - {"evmos1hmssffakpll0d3hesk2j8s286zd9yfv0cdq5yz", "1175004732271578112"}, - {"evmos1hmuecr7692558mhswzeu6jfmy7mrkdn67pj9jk", "241972660159219200"}, - {"evmos1hmw4ve2n96y7hymcdkurrntd9thxvh0c7g0qdl", "2156884484208924672"}, - {"evmos1hmy8zcx4dhtd83qu2esnpz8q2k06hd5fuaav53", "884058002483378944"}, - {"evmos1hmz4hds0x05sf7j3p2xpplhm5nuugg9suzlw5z", "16957307900138131456"}, - {"evmos1hn0f44tww8vkcspxam3tk20de9648npj5dnj8f", "875592726736037120"}, - {"evmos1hn37y4w8jdc0e98vhukfstkdf5fcv7l5ragkka", "25342807956398542848"}, - {"evmos1hn4anmmdjecrtz9dn9vd955zstgjpzwene2skm", "108698178418348326912"}, - {"evmos1hn59yjx2v5n78d02eqlvve0s8cc08jatys838x", "6930132512782940160"}, - {"evmos1hn67cry9yznjc05vttmhturx96689lqaxprgeu", "585723532997111808"}, - {"evmos1hn8e72mkcl3yvrg2ewtk8t5tw7t8tetgn2c7e3", "8188192166399705088"}, - {"evmos1hnaltvx2ucglcus466r22x475278me8ae0lrz6", "1497960881498540032"}, - {"evmos1hnn646x8g0z59qhrky86psfy0szu6q9gv66azd", "904364612176354816"}, - {"evmos1hnq8hz3fppm8lnttmmjphu4sy2fuxyzkzzts02", "4486291987007574016"}, - {"evmos1hns3f3l86nlcyqxwz598ymmpp5d4ztcgl3wnh3", "9995709927658455040"}, - {"evmos1hnunn2v9s586quh7xjdg5paxscsjdfx7hfqdtj", "2094970782420445184"}, - {"evmos1hnvf8nvs7w6h0s26eashzhrk0htmjqvudagcw4", "400005024760445952"}, - {"evmos1hnz52rypsws6dv225g8rzlu8ehx2pheza0av7a", "770682412835930624"}, - {"evmos1hp0k94g55z30wg8f56mfzjrryp5v3s5h8r9hau", "947771400506783104"}, - {"evmos1hp23lpthaych950etjaevlqsgg28kwjd4cca2h", "9709201121408757760"}, - {"evmos1hp2p30c04aelr6t3amx66vsv537pxnf58ejpda", "8814436121997295616"}, - {"evmos1hp59ze4xaptw9ss2c5wm2kcl2puqt06f4mdvwt", "17098936878165215232"}, - {"evmos1hp5pmv7psl2mj9ge58lxvq64r6rh87k0cxq8ec", "96383058368878723072"}, - {"evmos1hp7px8jxlv2kpvea7fty4r3x4yqu4q64vtt7py", "1559117149165538304"}, - {"evmos1hp7w7whyxkg579gpgys9sehn26wt4snwwl88gu", "2068633920774998528"}, - {"evmos1hp8a8nk5cdry3vdpcdqccq9sw95f27hzp2mk5k", "36657827864243456"}, - {"evmos1hp8xxnz23h2z0w359phhvfsadmwpxh6kf4q2fu", "7348592242913591296"}, - {"evmos1hp9sq5gzlfcn9h2ypz6669aqhun370jkpawtj8", "386052893578983936"}, - {"evmos1hpdjr0rrle2h5lrpjh96a06zatdzuxztngrry3", "254113406470569984"}, - {"evmos1hpdkwq078a4m87tkagk59g92hk20z6y2uk282z", "1432332376846328832"}, - {"evmos1hpe9wgtxr843psgagjcthjrt8gchyngzk48rfj", "103806361239745757184"}, - {"evmos1hpfs42x3cdyrxucscn3dy9z5py6nkg3vhnx7kq", "105411808268998400"}, - {"evmos1hphx76urp24qm025g5f64xhv0fpqxdgnrmrfp4", "3534866680978442752"}, - {"evmos1hpnr2jyxfggn6vg7d03ga0sy2rkkart9le5hh7", "4896224517494967296"}, - {"evmos1hpr8g3cyeddzvy4tjk2kecwtk5eyjsa0quq6vj", "842805214427206272"}, - {"evmos1hpry0cgjr4rfsrne9grs2mzqf4cr0z5u9za5fc", "24713587055568609280"}, - {"evmos1hpsfgvm9m7rfejpu20srw3t8772w99mu96vywv", "731198704415322624"}, - {"evmos1hpt4p70md7h9fsz7rpd9a2trmjx3trrvefqmx2", "863931214282211328"}, - {"evmos1hptzva5fm960f6842nsrx5nf76de4neqvw7t54", "76788586982772703232"}, - {"evmos1hpw9sv2wfna7xe82rpaefl0eysfg60ke3uyu5e", "89076685226712832"}, - {"evmos1hq0gguwph4f6hwg4xdnkw2kdtqrxa2rnl5w0l9", "17395338844907331584"}, - {"evmos1hq290e389kam9dtaclapwygn2hupqgkh4966xu", "33236350586801770496"}, - {"evmos1hq5a35pc27fp8ssz0a8h873zlc2fqmamh4lduf", "1374595272900829184"}, - {"evmos1hq6euj22u0edwhdqsakndnpmfp3kd2alsdp80a", "4188032349139083776"}, - {"evmos1hq8zr84p5ua4dmks3hnhuymt05vf5y8y7a7cr0", "4794510745526026240"}, - {"evmos1hq9dp5lkxhqvddhdr86x9l5guxg4jemn2gwlj7", "639005616899075072"}, - {"evmos1hqc0ch3y45rdxkwxw2wk8npwzcxhcfcezpequ8", "16692978725277417472"}, - {"evmos1hqed0negzx72ap8nvsh0qa60ejaxjs8k6e74zr", "50052452117973811200"}, - {"evmos1hqfe3vahc0tyzjylqujwaej07wzde55avcne3m", "475864799742999040"}, - {"evmos1hqh3l9wgnjmxdaf7v3s3wyc366he7caws4lkz7", "522112172339463936"}, - {"evmos1hqjlfevuqxf8u9agj68c88fe6txw28v4k4ktca", "1788189694907006976"}, - {"evmos1hqntm0naq5crepzk45622whq0qp07uya83l6w5", "17449512985131008"}, - {"evmos1hqqx6qh8760m90egs5fl3pxknswuzc8prm45ru", "691557303759716352"}, - {"evmos1hqtlx37vthrhm2ltghwqw8wye2qt9rskwsp354", "3769849547027772416"}, - {"evmos1hqtmqymmkx5r3t4uccazx8g493ktqw6p8l0ts0", "6767989898008678400"}, - {"evmos1hqxrxy2d0m7juxpwcae6ryg5nv8p0clzatt6rz", "11965090661089388544"}, - {"evmos1hr0ufgfpeeeug048mzz526v6h49lpcv5wzaejg", "475848750938351360"}, - {"evmos1hr4xavu7gy39nlyfh5544yp5fk7j3sc0ras8w3", "1492615601416647680"}, - {"evmos1hr7t09u2uaqs2ctmaf0ayk2kcxwln4ls85vl0g", "4280670564284041216"}, - {"evmos1hrffhy3txggjqp5llqyxu0sxfg8vg7uze3azwg", "771581590362859008"}, - {"evmos1hrfhcp7j0gpc55pess9zv4mz25z77sh5lqt8wd", "8658564566585193472"}, - {"evmos1hrfsq4shpjnva7a9zlskrdtle7jd4qtv8vsf9p", "44309849192130600960"}, - {"evmos1hrg842skpzy7fqs3gj9cmknxkntdja2tvcwlqt", "2407565544887208448"}, - {"evmos1hrgnn5rhq2xhygls52jgm907rfw0gwk2n0cv4s", "3387790144527015936"}, - {"evmos1hrhaepalf2pktwy4havp3duagxz6fpefj3y33r", "24310724808208564224"}, - {"evmos1hrkm6mjdf5pg5fku48tgknlw8z8sneu08n4hu0", "384498519150480128"}, - {"evmos1hrlz3mp42ufy65e9h2pmc653smdtm7ykucl83w", "60285850077969514496"}, - {"evmos1hrqlrmghmfhuftpw6m5wmwumwujvu38yktguxh", "492163027201688576"}, - {"evmos1hrrwg0ehup9zgy2k9gfur3yt8t2ewh85a5yrkx", "271287218685898752"}, - {"evmos1hru8hlwchy5p3hu4ac3z4pl0yee4edp9jwprm9", "8259983141321717760"}, - {"evmos1hrwujsth8x7fhlpsxlh22uatyrfmxg4cyy6kcw", "9941774422501515264"}, - {"evmos1hry6a5cl2s74ruqmt7yuehf29rc9zlsey93dtd", "275618929062642688"}, - {"evmos1hs04pe45fe7pewyx0080k5g6f8dd23lxug90zw", "236406169267904512"}, - {"evmos1hs35ngvqqy6r2ynmexaqs25wjc0gnuvxqqm3d9", "4534395825319636480"}, - {"evmos1hs3p3l5e6lllxx7gqxk2xavhpe4zpfj39n72u0", "14211141462831611904"}, - {"evmos1hs5fjfgadqye6cwrq43r940grp2jvu8j803ls2", "42747675069136666624"}, - {"evmos1hs866mcqfshl87x2xjv5ap5f0j2006hgwye62h", "18248037813227581440"}, - {"evmos1hs96uq3gqv6pr5lekm3ecgceygvcj9jxndj9jg", "487070048639309824"}, - {"evmos1hsahv6rvvfaj9xlxmvs0f3r6krntllsfhfrp03", "62650008117094064128"}, - {"evmos1hserkkcejqe0c6yhx6a4exwy7nu75nqppy7p4v", "265565035908284928"}, - {"evmos1hsf2nd768nh7t97fu0extd2rgt3zutnyud54vw", "48162046914133286912"}, - {"evmos1hsg2r3mtgrlpfl3edk3nx6l88zj0ygfyxa5v29", "364069252339367936"}, - {"evmos1hsh2qe06r9uf3xhfrp72lrdg3lfj4f4fcd5us9", "4979900749446503424"}, - {"evmos1hshq40lrs6y7keeecrypmagt22cqnkvytjsu2t", "13447627767499874304"}, - {"evmos1hsl8u447djqgfwvllzp8qf28e69c7lsgrugt8c", "1350055492288638976"}, - {"evmos1hsmjtc5k5keefysslqt742h2c4x3ylfmspw396", "7252430506762043392"}, - {"evmos1hspdkqcrvyfpm4pmhvhuhj60n7vvrhrafglvee", "2729190891323695104"}, - {"evmos1hsqn34sepm0mtvlx4u5euq5ann8ps8hthyqcxa", "5615575812879294464"}, - {"evmos1hsqwnhyn0yu8fej9df8uqm9r62umhyv6wfzjhh", "271305839474714624"}, - {"evmos1hsrmf09dhqglww5qwzy2pgamkqf3vcwcjjrx66", "9125426759286226944"}, - {"evmos1hsve5upnx99f0c38h98jq6aka367c0wmklky5h", "4363110073846583296"}, - {"evmos1hsvz77cwuugcfwpxgqk7uajkmmzvwfvzv6d8zd", "794767357312476800"}, - {"evmos1hswy720wk42zlv0ml7gha2af8l0wug95d0xw66", "387379287915103744"}, - {"evmos1hsy2qvhjzghtfydwpymedqfu9p7cyvpcygkthu", "7900931120206692352"}, - {"evmos1ht27e8jl69r0zgx48jq2au28nel4ymc6v59p9r", "16125058716864430080"}, - {"evmos1ht4xjqd6sxerg97wp8jwv82hfncva5lpwx0v7l", "12694490626810400768"}, - {"evmos1ht5ca278g68yyfw7a8f068tevhn7qdfh4u6c0u", "1894886129073702912"}, - {"evmos1ht6s3h3yfzqq5v4fkc94yvhq5h0jnkstknzwaj", "432160682677676800"}, - {"evmos1ht75akafk0ynrw2f35l9kt4s2dgwrlz7637cvk", "2661220158653227008"}, - {"evmos1ht7zgqylr5h49jf6e9leny23pcscmjw4rtdadq", "2317482099491315712"}, - {"evmos1htata3myf9dm0gcramuf95ucvwsx8nqa3dsqty", "40544005796005085184"}, - {"evmos1htd24al46m8658nfhplydxzy9wcx3xm8ezs8fm", "2731170052993464320"}, - {"evmos1hterhygq3g6em5ljmkp7mv5qme4jvlsmw2zdn8", "920729970316455424"}, - {"evmos1htgzm74yxp9q4vahn55fsyjhu07wuvzcr7fxmt", "5345650450672164864"}, - {"evmos1htk7mpwyeuq0pw2ytmsl5pf4m22qkw4n72suxk", "414396746773791488"}, - {"evmos1htktmdk487jthl9jhm7akrcltq2623xpp7jjsq", "1482203803073626112"}, - {"evmos1htnj0gsc49yxs6yaf0dnx28ryh4xyhzetdszmh", "64104463724544425984"}, - {"evmos1htpyrc6udrcawdtz0ykz4clkm6vm7kzv9sfys0", "2794053255417978880"}, - {"evmos1htqdrecq36wpqp75rgth8wumqe8lrz0h20q6er", "946076464314425344"}, - {"evmos1htsd9fhg4j797g3yhycqae8x4auqfm9g4lf3fe", "3776635241221176832"}, - {"evmos1htx42nuzdy9ssrv76phkwapjr0tl8r5yr09c3a", "3215030650011614208"}, - {"evmos1htxak8kx5vxfxpt8qe52m7045r4egvjm6w8vs9", "6058889967594504192"}, - {"evmos1hty872ngzx482dmrefxmsaw5j75h4aandnntwr", "4892261461372516352"}, - {"evmos1htz0ut0mzlhmrzjtr2fdw2aue9dyh24s9knhlc", "1366282472166428672"}, - {"evmos1htzw4kgtxjk5acmpwdcxap2hljwe200syd4q4f", "26089468343817052160"}, - {"evmos1htzxgmhhjmjlg075qm32v0ycynyyf0lv6xeljr", "4040545733953636352"}, - {"evmos1hu0qefgr9v3z5fjpzrsvugpckals6dq93jftns", "744773077045968896"}, - {"evmos1hu2cj9ngvvww5unhc0r6z783nn7tz4fpg3sfqr", "5343387992954781696"}, - {"evmos1hu3cxm4z02s5n2sr2w0umk9uems596yvu0pl4q", "5787810463164934144"}, - {"evmos1hu4r86ghantycs2p4pf03y5gzcdlu3jz3zucm2", "940231048838610944"}, - {"evmos1hu5ja87gl7zkk22p0exvuxf59t0256nkrkruu7", "7829435094125754368"}, - {"evmos1hu927j5dzdheuys98pdf5jx7xklpegqvucf9fy", "86873518911486208"}, - {"evmos1hu9cs5ye928tmq4jy37echffdun2mkrxyfcpsq", "883824765222860544"}, - {"evmos1hudc5j7m7297hz7yqcsmdjmc9d6saqpg9v4kjf", "1061217767347699712"}, - {"evmos1hugmcqur7a940898weu3t4y9mhymw70kdw6gmu", "5456797730494705664"}, - {"evmos1hujdaa6aqghsqj2x839874yykg3k0qnfr0937r", "1736614458973437440"}, - {"evmos1huljuc65yxmmp8jadrfdf8xl5d4tqxtuv6y70w", "864924728135294464"}, - {"evmos1hum2ydqm4ndt5x3jy07chzewe6cme829hqgrss", "749978650366750208"}, - {"evmos1huqctyey9n45n9leh8zazxqjz9r3rcnll8qkdt", "106854985191202560"}, - {"evmos1hut2dmepqmfewl60mx7dt6xaq4em067r92ej33", "1331979842243352832"}, - {"evmos1hutuct9g2uvda9swctuvge5rqka0c3uatvrvf2", "3653293828746739712"}, - {"evmos1hutv7tukgk0xhphccmkgue4z30j9c7l8wnjh7x", "2859805696593839616"}, - {"evmos1huuqg8my6kzzrxgc90ffkkl83hwc4hg6jt55sc", "179706461501537280"}, - {"evmos1hux8dms0wfk7x96dcs9u973em33xqy3wcvhw9m", "996057822208371200"}, - {"evmos1huxfxezwfphscrxlj94zw5m6zvqaryxv0tkzt5", "29909659534326468608"}, - {"evmos1huxx2xywk7zryfuj57ccqapx7m3pm9qh8dvyyn", "1495782555156979712"}, - {"evmos1huy9q4c82laax4utu3hxx24fd2r5hgday42r8j", "21777999023358451712"}, - {"evmos1hv08mjywgmg9542fjj6q7r6zhmuqsasl4w0res", "460951181510746624"}, - {"evmos1hv0dhrry67a2xgh6mlgn6jjah9ks9ghpfmv2j2", "2422753598980045824"}, - {"evmos1hv2sh3lnhfuq25at4m7sgg2g959fedf64a46ek", "377091273788735029248"}, - {"evmos1hv2u3sapamu5320zxy0ge73jvurdy4pq5pykxc", "232469654151563008"}, - {"evmos1hv6t5yqxl9cn9qeh67y09enr8csntrfrzm4k0k", "3221905707275214848"}, - {"evmos1hva3qx7hccs9utnfgp3hvyj69mmpjrucg3z7vj", "2357683097393651200"}, - {"evmos1hvamx2hnsahn3kfzjal9nc44xrytry4xcnlwc3", "520122366056720384"}, - {"evmos1hvg6xqhg86yv99w32xlq406maxfdmh93flacsx", "959939527578212992"}, - {"evmos1hvglyu2pen9up8d4t65q24rgeg3tj7dgzmr3ax", "7910542885217685504"}, - {"evmos1hvkn33jtuh3ldcm90u8djtqn9w2nv0dqdy8xcu", "348633328293442560"}, - {"evmos1hvmqkulu0kf5qq4rsursqlryeqy3a84p89enup", "1181032035253365760"}, - {"evmos1hvmseryu957m8lr2xcc9m0vxycf5euenjzg9nw", "69869983008491159552"}, - {"evmos1hvnhv6nhgjyesh67ncth6kqd6aly85gzh2r2mh", "2842773344573087744"}, - {"evmos1hvpycvxg9wqfz58xfnycxtmcyqxwlcqlxesz2d", "403420644660816896"}, - {"evmos1hvtudy8cap337ne2g69s6jvzsxqweja57aru4z", "369005057571197952"}, - {"evmos1hw0gsm06r4e4g5mtwmemm3mglc6upttjctfs5s", "2094687652270734848"}, - {"evmos1hw4vjfjfk3h5tmlufgv65gmf8v2srw0fsd43p6", "21679118376789413888"}, - {"evmos1hw4vvj6wgjv65sxmyw864zkqpwk9pqgm000753", "10033574957535356928"}, - {"evmos1hw88nx73y5j8cuzqw83sgq4qpyhc57jvl2rqps", "2406924585136365056"}, - {"evmos1hw8r5c3ul63c9y8plas226tdlym42etjyt4pcz", "35263346738697920512"}, - {"evmos1hw9j9ws6janckdum2gx62c7de477h4xuqvx2jz", "4074775477953331200"}, - {"evmos1hwa0n287dz0vxv55fkkd7zpp20xhwvyfwg5q5f", "704228502204199424"}, - {"evmos1hwa7r3c9fvh908r7tdcp05hcd5lvhmayaw8g95", "317316473082413824"}, - {"evmos1hwc9jftpmqpj24mqucn62ks5tpzsvyaqc6wnp5", "532670697397729280"}, - {"evmos1hwe0z8sqtvdc50ltvqdq5f4mlzu3naf8klfmhk", "381242907850381568"}, - {"evmos1hwfgx5a5rk9lvu82ynvz0rns94x4wx2urlcghd", "1273924365002516480"}, - {"evmos1hwg86wca0kcjx9p8n225mk944pkqaphuedzzmp", "1281435878470068736"}, - {"evmos1hwmdanpk2lrvufh06nml3a38xe6zgy3nzdd8nl", "1618093787275502592"}, - {"evmos1hwmg0lpqw7xhe7fm4vynjv8e0ev0svkr3xxmrv", "20864923035209973760"}, - {"evmos1hwmnw7tmzpf4h6hk4qya0nh0njl3z63ydtdp2k", "1475111102236278784"}, - {"evmos1hwn5rmrwhg9xt6andnzzd3qsl6zkk2vlhm7n2t", "1896932656813366272"}, - {"evmos1hwpevnc3zt4tnj4qaan8letjy7tw54s7zczs6e", "715298423312964096"}, - {"evmos1hwrfg5vmc69nxanr7z7mu7vy0dysqzmty9ku87", "30989426309530378240"}, - {"evmos1hwsxy4kkkemw43mll63jfxe3chzrke9aksz6js", "318799693088661504"}, - {"evmos1hwtr3g5wmktp8ygv8a3zhn0eugtu5nz9h7wuhl", "15261669610228312064"}, - {"evmos1hwvxczgwpx373ntl8t7dpsnmys2jaj99lwzpkm", "875616879939763200"}, - {"evmos1hwxfk3h7huyzammp9snxueagge33r63vave6qy", "1055264578669300736"}, - {"evmos1hx27n32f2vndq7dtngdcpdl2wtcrpams7puxhm", "4270657270990898688"}, - {"evmos1hx3nuz5nzeacjuk7qd5w342u5d72yn23cl8us7", "20876208295556472832"}, - {"evmos1hx3say0s9vgce7rarmfaanpv2swe0acj0gzsd5", "49419359137103757312"}, - {"evmos1hx6wkqtmdhdmflhqcwx6ch4gztt496wkw4hqt6", "4268395048863592448"}, - {"evmos1hx82wjcunl4rntpq9fu0le3cda87fuk7dy8n4n", "4854557357456228352"}, - {"evmos1hx9c3gyenz6evey0gxj2ylgzxlk6tzaxxkg9ra", "182114945265634560"}, - {"evmos1hx9gu0g5hlm3xl55hepkunkx6xr6ddgtug49dd", "1769447635396746240"}, - {"evmos1hxa8e9j4zyfhe62xe27eza5dcs00y9etxsy6gf", "557727677747812864"}, - {"evmos1hxayqsfrjjjveswq830q6de7ucgwwrd67qy9hd", "2461304578600685568"}, - {"evmos1hxglxj7093afpycg28th8skx6fg38ahhucqkat", "97857274008543488"}, - {"evmos1hxhev0907dq4ws5vflaxwazlp8vnxsndntky50", "3134032548361643520"}, - {"evmos1hxhuynrx6p8hw0yh6ue7fszc5puylky2as88u6", "371004026508829184"}, - {"evmos1hxjlr68qtqkw8cjtnd2hvt2yhs4xrjfxn90x0d", "776476662449000448"}, - {"evmos1hxls4pcah5ktz2zgd9pzpvw7ga6q80g29hz2y0", "4422823282231618048"}, - {"evmos1hxp24yua5c6kf0tm5e0er90aeh2m2832e3t078", "417310792675074560"}, - {"evmos1hxpjafp4kvtm2q83fe8z9zfndn0d2v826wkns2", "1598083704747179264"}, - {"evmos1hxrzkc43vaz0cna28dux9k46mgejjdp9rfh7hq", "384975711730012160"}, - {"evmos1hxs729rv53q69j9l6alx03kct8f25crlhx050m", "25539542939430912"}, - {"evmos1hxxfem2zpgfh6000n33dn8w72h2d3pulcgk2pr", "1801440303101134336"}, - {"evmos1hxxpcnunxptflaam4j3tmnv9pntf8sdtz0whyx", "1384055956616327168"}, - {"evmos1hy3nsdrafnjmpv7jp55fshj93yy0g02j48ccud", "33270067472915738624"}, - {"evmos1hy3w7ac2t9vh7f0vtn48zarvq2d2evveng52q0", "3943243281751447552"}, - {"evmos1hy4ks065mpgs6evm0rc25scnpqmk0225hxr20w", "5302257263244083200"}, - {"evmos1hy4nxjgle6cn7upk3gyk3uee02fwyr76rz5n9v", "373290373570134016"}, - {"evmos1hy5d3xc5f454c2kt268n48x3g7ac2g9ekegal4", "272364595790338304"}, - {"evmos1hy5epkryj748tdzm4dpjxgq8ehu47tj9fzcsap", "45114519874022656"}, - {"evmos1hy5xc5vupl6k328r3qxvzmxwlsgncagvvykq89", "2159188135177806848"}, - {"evmos1hy6m8293wxkf0qfdgvc4g0zu567f6aak2sly3t", "1135771788378621440"}, - {"evmos1hy98svgj83jphd29k2r80426eqtwvsesl8dcf4", "1327179144017876480"}, - {"evmos1hy9v7n855rqy7rzxu8d30qsssp28z7snza7xmq", "1351051719950244096"}, - {"evmos1hyc2pvwtemzq9m4l9prlz2eqemm9w4u2jmzhv7", "3803008327357745152"}, - {"evmos1hycyej06ukzvf7cf856kn68fykhce85ujmlutn", "6849123120479764480"}, - {"evmos1hyezaush3tct8xa9ng8k6qmmumd8dfw3yylsjv", "7239195812926169088"}, - {"evmos1hygwceda8d6px2acwlenj234mvqpwglmlvh7vr", "3319594171662447616"}, - {"evmos1hyh4u5kpzv8awsk2vdaz6cjwlayuyzxy6qzqww", "384766543465054720"}, - {"evmos1hykjwwvqhggclq0sxludafndmahxp55c4xq9gd", "101861717931474176"}, - {"evmos1hylsz8jx8xvlh5qs9rzw2nlxlwva5jl2jmjdr6", "3276882889706327040"}, - {"evmos1hymvdfulj6s5haymttvt27k45q9mu49ll4988c", "847073725015502848"}, - {"evmos1hyr5tknpgvymg8uj2a8hyc35329w5mgtdhx4g2", "167431732936770560"}, - {"evmos1hysqrcjxuf9cnxfxtqx45u05gslrm4mlh6n9mq", "4884921459572356096"}, - {"evmos1hyucp3kkmtfwu9kgk3nqwznya063qypuyd0g2j", "5057754246400782336"}, - {"evmos1hyz4zsh44v2thqgv5w95tq6up5e8f9f28mes2u", "27405276557165363200"}, - {"evmos1hz3rjfsm2j2hhydx2as38ytmvcf2h3k5ke0chd", "33818463978877345792"}, - {"evmos1hz3ye8wdk8xkknayl0y9vjvcgw0dtw3nj8c6eu", "3636608188073197568"}, - {"evmos1hz402lvrfhhetfsyt2w68t7cnem29xhrukxdnm", "1420260813973528576"}, - {"evmos1hz4pzhgfk3su7gh7nqtxl35czs2kszxq7y0xys", "565820813282770944"}, - {"evmos1hz6ckfywjad8d528gpz9fa42qlf2fclzpfkr7d", "32308813701624246272"}, - {"evmos1hz948hgj8pncdnt6qrfkvq0w0knvuhrvgywqmt", "274937929327188992"}, - {"evmos1hzd76uny6ypr7sscrf9rkkklphxsdktksydx9r", "16136291164243668992"}, - {"evmos1hzf4u70mmsj7pwh2anhnq9xene4pyk9tn678ch", "5662179901216242688"}, - {"evmos1hzf82wasdrhn9nwapygjs44txfw507skuaapgk", "1680459293657520128"}, - {"evmos1hzgkzsq0jhmtekv9m7q8px6xv2sg34ekn8j9gp", "1688353298609432064"}, - {"evmos1hzgrn20zvwyfv7mmr2rmsu333ugze0wnfk22jc", "44798306820112384"}, - {"evmos1hzhnj7ky54dgt5ted5h065wun0ertwf7vg9pkn", "1596337616313135104"}, - {"evmos1hzjzep0q0gn7d373pq50727v8t3d8mqaahycdp", "340036667758854144"}, - {"evmos1hzl9e9ld79wrlxmvvx8v370ppe86tssu9avdur", "1873547775655591936"}, - {"evmos1hzp36qw0rtelnsgh354r0ca5fx0fm8vpetsfsm", "2674529274136985600"}, - {"evmos1hzpj65tdpucffd9ac4qqud4z56vyyvl2uthl03", "30991736795717566464"}, - {"evmos1hzt50zw95ttnf3ezksn50fzwyyt00g8n0nen5q", "316155167963538432"}, - {"evmos1hztv4h3xqjkp5jm9dvqusqvayr3argce89kztr", "22795233824373248"}, - {"evmos1hzu455fu9a654essslkluqzheqz38ejfegtgpd", "8575281527598825472"}, - {"evmos1hzwctvzj6wc3rwwp9qze6g0esszz8mslhrn574", "1171640929968734208"}, - {"evmos1hzxn4hn7ggcujupc7mvzgadzxdmjllp9rdu78q", "855730930011224064"}, - {"evmos1hzy7ecagw5nyan6xuw0824rumh7k26quy45x3k", "474200800263261952"}, - {"evmos1j02h934f63xjf42dsap472ph6qt9qjvak4ld7g", "13584907067989020672"}, - {"evmos1j04qd9uyhg6cpqzu49my25spmlcum3fl6de3g8", "1283676005247926784"}, - {"evmos1j076a47hxvpsufwwqh5gmvdswh9tjh2za9pc5e", "110283029972389167104"}, - {"evmos1j0858650zgye45pcsylyu9dv97ye0atgx4pgdv", "400293088900493312"}, - {"evmos1j08zkg3gf92hpaz3cd6ks988ayac5qwkt6waqf", "4922160704586940416"}, - {"evmos1j093rylnzmep36ed4ux8h9vfz0drnd5en593qh", "22726399267071275008"}, - {"evmos1j0agq8wn8l8xvaa6y30u5rlappmgjmj3tcsj0v", "798545263625371648"}, - {"evmos1j0cf9qjfpjdhr3j72kw9f0nkerts583lvqr4g8", "9748713374861410304"}, - {"evmos1j0du8wacy2t3u9hpgw4pxy3l8d3z385ezsq2lx", "3473378348752943104"}, - {"evmos1j0erzm65huwevtcq0u3u8qn3067y69mzp09nqz", "781605579267248128"}, - {"evmos1j0f7ghkfwhdpw7wsxclj6r3kl44jptwxpuz54m", "730530312039205888"}, - {"evmos1j0fldv7xq7jktppwgppwuu72xtfv2gze6l70gk", "2919367834569078784"}, - {"evmos1j0h7ezwmsqtk39djc7jwqzhcpzaudy3ey0uxsz", "12179522802249318400"}, - {"evmos1j0j20l0leut59h4f8yjsxyk2j5jadgtgvnkwfl", "24162753973438545920"}, - {"evmos1j0j8cua7zry25w2nxgmadupdg3ya2afftm6erd", "763720701407935488"}, - {"evmos1j0ln5805llpvu6w03h4d2k0ze5uh98uf26ltk0", "4550236137469476864"}, - {"evmos1j0mpn68jtheqkpruu4u68wcx9er4gs5t7fu7nl", "24108371236085538816"}, - {"evmos1j0nee3dy9ufdmlnnychlk8u4xh3x8vnmztlzl7", "1566068339558199296"}, - {"evmos1j0ns8c3737phaxn04lljjerafhd29dsft6w87x", "607434814074735616"}, - {"evmos1j0qw9usydfplk2zy6uugpu59u6sh57l0980yfa", "854784747776221184"}, - {"evmos1j0qx37dlrkhspjxw5ekvack3upq2g392cpvlks", "7695342669453197312"}, - {"evmos1j0stktn23nmuhnah586h8xu4hl722fqaklw06u", "1237084678376951552"}, - {"evmos1j0tgrdkkfhajm2fax4cp8kt3v2x5z4a36vw2gp", "480719535906154496"}, - {"evmos1j0tj0hzyz9jyj36grntv29879zh026p4an8ym9", "2088486408980463616"}, - {"evmos1j0twv3u4etwplj60m995xv8sr6gyajd8kc7w8w", "2113434050403618816"}, - {"evmos1j0txknlklq7vxdru3933zufj9yew2hjsfp9l3u", "408983090612507648"}, - {"evmos1j0whj2p7g04673dxy09p5clxp5dd2uxqvhs7yh", "2146928589910884352"}, - {"evmos1j20axyvlk8wsls9tvw2jp8xn9jp9fxlw377scx", "4876179640658671616"}, - {"evmos1j23grxale9xejgmg5sy8ajahrpp0jqp600y0q0", "2279775698574567936"}, - {"evmos1j263xefnhahz2ny6t47t4dsfc22z26df6jfxz3", "15242931968391669760"}, - {"evmos1j28u539elneezvfgllcalk9fwyxmwthx7j0tu3", "2248720370161086464"}, - {"evmos1j2j2r45afgr56y972gwuhkz0au2v4lfvh52l26", "1912577381955600384"}, - {"evmos1j2jecvthk265x9dt7x34vj95qkflvp379yr4t7", "1091091418086293504"}, - {"evmos1j2kck4w5x74heap4r8u2x82fnaveqfft6e2jyr", "7821263790564972544"}, - {"evmos1j2kg48ztt9677uq9djpzgt4c290ctl7wu4snp6", "14431557797758033920"}, - {"evmos1j2kl9t6gzj2gg2qj3ph9wc62ejue7c7zlph26l", "864931736553281536"}, - {"evmos1j2lwe70wnsvm3vuj6lys8j79s0cf6akcfdzjw2", "7327725679690792960"}, - {"evmos1j2mdyhsnmq856p9k2ypgsec3k67k9vl4ln5vqg", "2400381422969048064"}, - {"evmos1j2msdl78gv5qkxg9zphmd9shw6dcvw75vw9j7j", "1213952320556911616"}, - {"evmos1j2rzwjcg0j9ptuftgg6l0j08mav5z7rweev37m", "85042242253048832"}, - {"evmos1j2u6fdtmff5dklfxk7urh7vtamdxn4zqazf2ax", "666872840752930304"}, - {"evmos1j2utwpgryl7k9enwn3wdjp2xww3cygedypkp7s", "4775692485076451328"}, - {"evmos1j2v6ez3mm4j6m83c6vfuqu5kam3ay40d3sm3gt", "4819033104532926464"}, - {"evmos1j2wp94pyzsqwtshrknhke302fv9qfhy2t96gmw", "6797399488657440768"}, - {"evmos1j2yan0ke044m3v8yg8kju58vwtgk86sw0rqkxy", "70489893691299840"}, - {"evmos1j3057d0tj7nm42krg0s8mes7j6t6mhd2zttcjd", "5131697753488099328"}, - {"evmos1j327khf6zuz46xne3ngr00dmcgtxfjy6llq7ux", "2948333376566000640"}, - {"evmos1j32j965yceyswaxjytl5z9cevcyzz8nj9qg00s", "60763075914076291072"}, - {"evmos1j32w8zjhek0a7axudaysxh66egffgg8tyl0m9k", "4817112463068013568"}, - {"evmos1j33g69a4v62a92r66xwh6m8vmxmkzl80x6sygn", "2535961751167849472"}, - {"evmos1j33x4lt64dkdacuf9d5p2hf7z2f7g3rxr4het5", "525410846736014336"}, - {"evmos1j34jahfzx0en9x6raam5s0ylfxhqzvtcdd8lp6", "477598129268707328"}, - {"evmos1j358pw7s3qaga8zkwe36v2uawnrgyey8vvwj0h", "3046227472502282240"}, - {"evmos1j38ljzzl79fjv6z3nxfvmqspcn2yhdxp9uhua6", "635948700563398656"}, - {"evmos1j38s6k8vy4jjsytdvg3npwfl3tuqerp4ya4wum", "173358781615484416"}, - {"evmos1j38tmk0x9d042f2z9rhg68x75telap34d7a84d", "2132921522601149440"}, - {"evmos1j39v94003st3ksexe2whe5rlcx42zmu485lg6p", "3084520054358699520"}, - {"evmos1j3avdy9ny2gwg566cdpdykn95qgjtf2y83put7", "15851323529826967552"}, - {"evmos1j3ecya3vjqffwmg3sll9tnjmjdd2s3lag4tyjn", "2442321160707362816"}, - {"evmos1j3f36eru0z7acf53te6v9m5wd2syux9nkz34me", "1063712894318145536"}, - {"evmos1j3lh5ju2ka9ce30lnt7ju3zkhng6ctwyh5nw2l", "8205367319930300416"}, - {"evmos1j3nd3de7jy6wjg93twszqwly7wrd6d00yzsxea", "4137699118267613696"}, - {"evmos1j3rwdfaspuv00aw66gzrd5shkm0el9pplfy53u", "95902524112989192192"}, - {"evmos1j3rydtng85hs697428vte6g3lm877p5y8np7vm", "465819240015509760"}, - {"evmos1j3sz6vpjqxuxjyl4c98payypt8guvkk8lxs2e4", "4702799783418202112"}, - {"evmos1j3tnrkjg7yt8ausk9mxa4pcacrg9kcdhcla5te", "172724770300757504"}, - {"evmos1j3uukxzxtdcztne99hd3lpshe5mrt68xq3jfv7", "28354718986794708992"}, - {"evmos1j3wh3m3uwxn60ynltnlpd57cslkd37ln3hgzt4", "694334677583222784"}, - {"evmos1j3wj6svwgl4u00ku62zj8h9pyy0ntjcel70etg", "63319809339942715392"}, - {"evmos1j3wsv34mpjvfgtzz2whhgpp02z84g4qgvtwusx", "5771433347840573440"}, - {"evmos1j3xmz535f3twdw27egf6n6w0kzpcng8gjqkgj0", "611355887124085248"}, - {"evmos1j3xzjpgjqnd2063gxj5avl75ue5hufjh5lgh83", "1373152293512114944"}, - {"evmos1j3zxl3asnxkq7gth4eqwk8456yd6uefkycktn8", "13692569187464896512"}, - {"evmos1j447juhg69nsn5ephrzhhnn7tuppl057nu8rt2", "18415498456118005760"}, - {"evmos1j4dddyy9dqergda7fedltenf3a9f88efls6tkh", "13940155899854655488"}, - {"evmos1j4ewm5hrxskxta9r4w727ccrh5c5696dqw8k3w", "8332483816820248576"}, - {"evmos1j4h3ecll96je4z6pm7pua8u9a4vaw0ujj0lgj7", "19212850647085359104"}, - {"evmos1j4j3d7u25388ve0yp0nxq8fsqu65vjn859lv06", "69008734448331520"}, - {"evmos1j4sky7exts58uxfzz4qp22sn56h6kuqswn3pmd", "9786509508224315392"}, - {"evmos1j4xajl8ncmqec43n3aupwn6wvcg8ycfahu4m73", "4239256331043027456"}, - {"evmos1j4xpflfvrj27j9zqsg7wl2rnmvvu9u9cjyeljd", "1033551573253556352"}, - {"evmos1j4yhglg2pfsuftn8aq77zvp5kxlqz53p37e05f", "31199633142938763264"}, - {"evmos1j4z8u4st9wf38u4vw3hx0uya0smqht4zhstjcf", "24118645532987109376"}, - {"evmos1j528e8k9hkneel9dfy4lqs0hd8zjzerpteasmv", "6957767391384076288"}, - {"evmos1j56fulwvsmadtqepdp25f9tz9qr4s68cluw8g5", "476129458303641600"}, - {"evmos1j57fdmnhcvg2u4cmy07mym8wn0455v067ck7mj", "388950442149172480"}, - {"evmos1j589h0dd7ffxp86fktx52g3v6v5q7dwke63tp6", "15515728981696124928"}, - {"evmos1j596eclwvh3uz9y2rgrnjhsyly0af8tkqvzxx4", "89843389001320960"}, - {"evmos1j5c0gwfz68mg4q9680f7pkxj0qvnfqej7qqafr", "5139157890627687424"}, - {"evmos1j5ck67e9tem5n44jejdyj02dgy4qpapr9x6zrh", "849541199492984320"}, - {"evmos1j5fdtj3etnptzf4877pczts8qqamsa4p3c0ztv", "2896992422924597248"}, - {"evmos1j5hljjmsxa9v5tdnzcsxy8qn6we8ldsq3frkr9", "1675104527258255360"}, - {"evmos1j5hrqe3p052d0p07qaeatw8wmyj3rnyup8jjqq", "384530613922069248"}, - {"evmos1j5hu6mqvgehs7gpv29vl6gq2n3am6jxj27kkqc", "2636043540407233536"}, - {"evmos1j5psgwuykkn0n4vp59xmsgrk9k6qgkw6lrjj4n", "370725866287737600"}, - {"evmos1j5vlkn965npu4eak9g0c76ahxst8zj6xtmksyy", "1401158224434406656"}, - {"evmos1j5xh25ay63q3g2amez4pjgr6l4022kgw3nxln8", "97770898574897430528"}, - {"evmos1j5z9tr8sum002z36x88fajsny34yhh6xt2u805", "29098412133735112704"}, - {"evmos1j608mke5gmg8mjlm8kgal0v8yf9r3mf0fmgw7l", "15405765073676677120"}, - {"evmos1j6099vut3harqr3akpjh6t7nkvvsfdwf4hv68w", "41610202026040320"}, - {"evmos1j60g9zr6wdmj6pfwcw8lvqmjmes9qnxg4tcny9", "720442683265052672"}, - {"evmos1j62s0nrjapr045qyxfynfn52mvtmzvrnvv3yx0", "861052151747088384"}, - {"evmos1j62zxh6kn5y0scw0aqw76cwchxxkyth5xlu73u", "23747266119169785856"}, - {"evmos1j63pz9tzszv05pah76pskthlzd255gz4t9jmtr", "78500451442657165312"}, - {"evmos1j68qdr8ewh33a0kv7w2lmp3q24xy2xq090hgwa", "60167561557352120320"}, - {"evmos1j695ccevwmggx5z2x6rh9ht8xf9hcfjf9x2fm0", "478678354985662464"}, - {"evmos1j6a6hwx7jdx9lf7fv7f3w6hwxj44qg7dgp9xr7", "7280039817070134272"}, - {"evmos1j6d2hfe4d2zd9t0dr7uv255adtzqnh0022l753", "3712089949150212096"}, - {"evmos1j6gant3g7gqtdsfruy3pjh7jyumrxhnw440jk9", "16676255084551454720"}, - {"evmos1j6kqa39nm7v7c856dzptahafjupt6hvl3rnvvz", "424851166509827584"}, - {"evmos1j6nswuc356ag7d9zxs375vfgx0ssxd5ffprp7d", "55890143263931711488"}, - {"evmos1j6r3g0tfyfhy33jr2n37jkah52zkv9g79a42fl", "7309743715682435072"}, - {"evmos1j6sdlvqknek9ej9qlv92x2fv7627t79v9xrmyh", "11005941606089717760"}, - {"evmos1j6t2l55vnynk9smczuac3tc30emh4l2apr4gsj", "954556783040090112"}, - {"evmos1j6zxk0rhgwteldvgdnp6n300c55a0jrpnvjst2", "317167249710496768"}, - {"evmos1j709zxk8n450wx2t24rzhk07pcvaheyn6tuzgt", "12113078789395169280"}, - {"evmos1j72sjyvseqfvwxt2w58ah53la6zstfqa5n2278", "4774147752158050304"}, - {"evmos1j72wy8ax73k7jc0klax42uev8cz4hgfh7ygqtz", "1208480977564619264"}, - {"evmos1j753vehfppf2898ngdgrgukxh28dhd4hsl6ffl", "781988568326424576"}, - {"evmos1j7dwvwgu32y6t2cfv2exr0ahtvu5rnxeppmm8r", "1728678232868608"}, - {"evmos1j7g767cthxdujv7wp2xmaqf2u95nwq8pmqpyeg", "5057243485710795776"}, - {"evmos1j7hsccyuukssqr5av9k7mtsdvsdekhs5ukqnmw", "5977533313411514368"}, - {"evmos1j7k04g6apqxs2zf5vn2428f0za8pfy96uuf9zv", "998854189538060800"}, - {"evmos1j7sgcjjskxlyna76gdtvxfgt9urgphpy5we5e7", "1724081178549891072"}, - {"evmos1j7sksr7ewj8k2svpt96jac44vra7ktdvdsj7zr", "14182992156787421184"}, - {"evmos1j7sxuepa3k27e43stcjmf5d8dqfux45nlljqjt", "1516365309891362816"}, - {"evmos1j7uqdvjhv9m44tgcnxznf8evgm7hjzwu3nfem2", "1525337105089466368"}, - {"evmos1j7v2efhwmemg3fpqqkqzjhw2pkdhnyjdzf2zse", "11966450790774210560"}, - {"evmos1j7wvkmegxcfyq758w6n4w6fhzr7wdr0rfjzw9l", "799246026299936768"}, - {"evmos1j826zxkx50jrurptd30klknvn288rq6w7nh56w", "4566294603926739968"}, - {"evmos1j86l08r75r46xh26z5uty43mshkrrk4hefpjch", "1484523159038562304"}, - {"evmos1j8aywta39mcsf4jfltxwqr3m5s77275d0rplpe", "3217297136613588480"}, - {"evmos1j8hh2tndp3qw5zca2s45gzayev6m8tpcy9ynnc", "50062005180602671104"}, - {"evmos1j8kuu73ggqrte5t7yunktk04rcfv6kpmx70jcq", "866667298912935424"}, - {"evmos1j8qz3j40rd3s3jg55nyq2k2qfcdyp3p7g7ep77", "686051006957039232"}, - {"evmos1j8rmvn6q42nuf4dlkqcdrf0lfktz5gh9sud5f7", "1839641873366319104"}, - {"evmos1j8samvm7ymzrdg9tztk9dnueeqytf3qvewzjat", "385505561251639040"}, - {"evmos1j8tvqhhp9kmctvuf8x48ngt2kzluuu8ae7g96c", "20911359891960352768"}, - {"evmos1j8zjgthr785qhr7lej5fkt2q7f768pmv8ljm26", "6982468939970179072"}, - {"evmos1j92csx5ecstzpm0u3z0p3mqcpnw4v77xxj7ruu", "250979545197463552"}, - {"evmos1j93e7dezq4npeqws4gtlv7fas86h6kdlpkd8yj", "24927714513830912"}, - {"evmos1j948jzpfzxgatsf797y0u4m0sdl0n20up9u4q7", "22848674479562752"}, - {"evmos1j94s897s4dxwqmca49tckf69x94gmpxkcmmy36", "530319699548536320"}, - {"evmos1j9c7xk04skapp9ayp6klhu67yw76eaf7ek52ds", "6695900309074800640"}, - {"evmos1j9dl3w9tsxat8x2gsatpuf0094d68n0p4zstur", "60714799981435109376"}, - {"evmos1j9e0u55juyu9y9t92xa7vyzcg6gg7dhkta8hpl", "812958654117295616"}, - {"evmos1j9fs9n4q82ru6p65389kmka0hps0hj9va8jfkn", "3603245558711099392"}, - {"evmos1j9hzam0f6z4gek9dx4njaz5g83zrgdmzsmzl5y", "1382083307905867776"}, - {"evmos1j9k9mh9cfa7g360gfe5jv4hzuxe2nvfsevf2pl", "1925842443727355904"}, - {"evmos1j9lyf6xqphkcknatdj053fe9yfqpkar72yzctj", "351912066338258432"}, - {"evmos1j9qw8jhcgdhnspa6s3qtyqey5fg0z9qc4xdt7v", "988685471117573120"}, - {"evmos1j9rjcqvrhrjpj90kd3l3qg7uagy8e56hm30qa4", "1479480708915326976"}, - {"evmos1j9tkq4zrz8a6g730smt6dfmckh9wx2lhvzylky", "4478023803672096768"}, - {"evmos1j9u0f9zl2w5pyq9r4dg4uyah5u68hdacumaqte", "9485892529010475008"}, - {"evmos1j9wrcr0j9czr9fxr085svava4dek682m7p2l9w", "2416760168387205632"}, - {"evmos1j9wwjm8r8az2s0tg6yeuspjywmsuk0hfhymwjm", "2521575019438112768"}, - {"evmos1j9yysg44crkrs5uqtzzztt666jh600c9p3d6d4", "1233336688704489216"}, - {"evmos1j9zmd7hlulj0x53dpkypk6yp6dxxxnwclu4jt8", "25443214194688"}, - {"evmos1j9zmh46l66qprsc5ax7f9zwwmwj0kah6a4hk3v", "1888778814826759936"}, - {"evmos1ja0uf3qdh44r9f9nmm9v4ap44we03l3dmtstdu", "427763894809438720"}, - {"evmos1ja2djkwl4uzy7cx9c7c79zep0yprcv0m4dgcaq", "2572201761719733760"}, - {"evmos1ja3jdnsc36vuxhygt9uvs3zuap49fp8vmewrld", "99086247761238528"}, - {"evmos1ja5cshfrwqc2xtsj6zdhj3rkncqe547mcuvm0x", "487294405196621568"}, - {"evmos1ja5j4z4jlu2z8l462ft74tjv3gnlysfmja5pd3", "385205288007635200"}, - {"evmos1ja5vqhpmyv86lwnrcgvshfqmlp5y6z78w86vp2", "1321117025385468160"}, - {"evmos1ja6dvuucna8ttf92sczuadrxf467cy5fd8cfv9", "63144159724161212416"}, - {"evmos1ja6sx6nr2cmg50w4sjl2hcsfvlhrm4hezsttae", "954724765878049280"}, - {"evmos1ja9lx2ujfn5nnhvrgvnm5l88qlpghpfchaxwlr", "2040101264232717312"}, - {"evmos1jaa7krmstqrhwwr7wrmn5ka6mkmcq6wflfw4l3", "33751621676378210304"}, - {"evmos1jaaem20xka0c5tc2zvc2eu8jdw6z8jnckljr5e", "1430009759103751168"}, - {"evmos1jag5zx5c3yv5e775p067ey5ws4z954ysc7jk36", "14538847529021792256"}, - {"evmos1jagpdefyag6yef9lfgshq2tcyp259xpmp58dcw", "185521226137837568"}, - {"evmos1jajuzvq7u5mnfrvenav7knkde5pl09dmvdpvs0", "1656043506928879104"}, - {"evmos1jajya06tr5afzvpag0ym56ehmvk292jslnudlc", "4809491337252237312"}, - {"evmos1jan683sce4e5aafr7y9rap29zn6yjarejkqztt", "8366134575330385920"}, - {"evmos1jaqn4m7883628ur2vmf6guglg9237pydcgtyft", "2288045183572350464"}, - {"evmos1jarw9v0tq0nks55t3gay3ckvzvq53vxhef3jd5", "9086062018848646144"}, - {"evmos1jarwq5ejk6mvm9zndjhd9728hjpmfs7qaqrg7e", "1325438765427837184"}, - {"evmos1jas5vpudfse0t9zhh4fraqp7ddpxvrch2myyqq", "2839218292475126272"}, - {"evmos1javutv6xw2q8ft4l37rwf07pp9durda4typzmj", "4939230633377859584"}, - {"evmos1jawdnqrawtummrvk3yyxdyc03nkw62mna89960", "358672720122414592"}, - {"evmos1jax0gp2kczt3mmp68xt967z92yjnmrdmw0qky6", "3931696416235749376"}, - {"evmos1jaz8p9aswdc7s5l6y8sj8tmwazpzf090l6pwk9", "75700456527197952"}, - {"evmos1jc2u8f06gfvjglmaj73r75qfxnqkqhhczlahyz", "1449710135797415936"}, - {"evmos1jc2vflmmja6sa4pnedzp0awjs2477lsy5q3qlk", "318948288817688320"}, - {"evmos1jc37ejrj6mf2px7grunth2ty03gzq52789eeaa", "5450313301250103296"}, - {"evmos1jc3hqs7552ketps50v79tf0vxs744h64g2wv2x", "3790318013691065856"}, - {"evmos1jc6446y3m49gmemqxalpqq6yv5z5ylkeehj23v", "8856348701835571200"}, - {"evmos1jc7tt95ajq8jwvgxpqmf4hkvyrfwjfqx2yf8uh", "328473589852960512"}, - {"evmos1jc8afjschnsc47mwjjmqs74v0fcsw6cda2jken", "1063915260754988544"}, - {"evmos1jc94x69fhek9jlhyv530quhr5qvwq2n0808yk3", "2998112207563026432"}, - {"evmos1jce3xdjdmxy8k2vxmfdtcl5m9s806e6dex2pfz", "5164769412936885248"}, - {"evmos1jcjpk2p8u8rs06uahw80xrjprvxtk625s5t8se", "739835844637540352"}, - {"evmos1jcrg22k5kckqyul964zjgfncfs9nk9ukyqk3f9", "2691772874309971968"}, - {"evmos1jcrwlpvy8xeu3rhy36sm9s5e5lqyggdc4anjmc", "78057024266426368"}, - {"evmos1jcsswssf6pqr4zxkkn79f4ky4wdkrth4ua5nlq", "1733958198383779840"}, - {"evmos1jcssx20ehmy8mgaevzlmuwh80scrresc6nqcw8", "3173701081395347456"}, - {"evmos1jcufpm3039vp2tzxlvv9thpxed9vzh9vp33mqg", "1068895832648397568"}, - {"evmos1jczl33vvrpr8j6ejc99q2wd863zpn6pf4gx7td", "384300571551294208"}, - {"evmos1jd0f3ghjhwrdute0pd6wnu9af6u0l329cysc4x", "3038673384448242688"}, - {"evmos1jd48rt2x9n26ud360ga9kexy4jsu7p4yut8egq", "522703383192428800"}, - {"evmos1jde06kz72v47pf3gx6k7h0d4sleaw5tazag9xz", "3452191570937145344"}, - {"evmos1jdkd6rwzs00tjuez7pwxk5azzrfazvl7nxykyv", "99353978732933632"}, - {"evmos1jdqhnmpw3a5fla48kw3dz8c0lzdcqeu4m49yg7", "1869613930957529088"}, - {"evmos1jdrfflxn8qeds8l0m4wk9lr7z6250c0gq3cupz", "1039784029913796096"}, - {"evmos1jdsa6z32cek27sfxwl22p7d8l0z58pnj0sl27l", "4876419426738491392"}, - {"evmos1jdvawm99mwqaea0y6pj8323fvj4n2s920lux8y", "1712218581650532352"}, - {"evmos1jdvjgpe5fkyr0vrp7zpmyxfptm3h2tclxchwg9", "227982164544628736"}, - {"evmos1jdwnu7tx2jvyncs3e703v3sfjn7p2xgya4av6j", "313959306898609152"}, - {"evmos1jdwue87lkn5k2xnuu48g5jk5wd5m4fdj946442", "109472140186778140672"}, - {"evmos1jdya07vdm5sykxrzm62jt44pj68tdejy08p6ql", "469053213164939520"}, - {"evmos1je00u65pqh4dyulgrh8mwx9avfkj7zuqlena0p", "3002546342803299840"}, - {"evmos1je2dwp54yu3uy7vajmgz45zxck0fs02y4ytfvt", "1723151156399997952"}, - {"evmos1je2jzxnccq9q3jrskuxhhxkzwylpvv2vvwzszc", "9290282310281385984"}, - {"evmos1je7u7e3tsgtrzfg65w9906r47scgru6ygt8lhk", "14469495585809408"}, - {"evmos1je95va7g566k7759s47c2st364qzmfrv4xql60", "120680939594537091072"}, - {"evmos1jeaajr0pxgth3u8qpp3wwrk2ng6k90r7s3y360", "3209314166146594816"}, - {"evmos1jeaswvspy9w2hw7q78ql9vjcdqa5jh95s6lmsz", "2770410090019546112"}, - {"evmos1jedeu2y0pwux4q633wlqr2a2r6fl90dw44hnkv", "1101962756115523584"}, - {"evmos1jee6er06vc3cys7k655vg93hdmef2ugzgfvsfc", "3150683283450745856"}, - {"evmos1jeglxkag7gnxtlmwqjggv69yfxs96mvm0xalur", "1017358591302170624"}, - {"evmos1jelu0suy3fqkslrflzhy87wwn4ey7d2tg2nu54", "445249730248146688"}, - {"evmos1jeme3cr0exepfy0whygc3gx62zh7fv70pypeqj", "78180282223306539008"}, - {"evmos1jemn80xx4phq53xs624cstw97nze6rwh0v6fqd", "2583462808654734336"}, - {"evmos1jeq2xhjngh9svwwym5zex4nljv60l6u20zwc3e", "11611569336240128"}, - {"evmos1jescg8k528x5ze4r5fl5v8huqpqqh6aq8s2nux", "34673932712768274432"}, - {"evmos1jesy0wsl5cfleksrys5uz7qwskafaamwdajlqx", "2156994810515620864"}, - {"evmos1jetmjn2apf793nfvtxkp0957w4xznmpfkqyjaj", "1365255494101032960"}, - {"evmos1jetvgccqsf022gjfrnffjmy8mh9cycnqumq54f", "881399644838797824"}, - {"evmos1jeug24sxc6g09k5ywzcrcxljnl9npf8ke4k53s", "6600934576253321216"}, - {"evmos1jeugkg0edkr7lsycztjmg0e82hcq043p40tc6c", "652474357364064256"}, - {"evmos1jex2cz62dkc5g5x54p2fasj5xnptftf3rf9htz", "246014911273463808"}, - {"evmos1jex5skt4pqe8hxepgqetnkyftnagwvmhf9d83f", "846785601964695552"}, - {"evmos1jexhrutz805kj93n4ydqvdaskjxzaxzcg86d33", "939152149990532608"}, - {"evmos1jexzgsa9y43mhlg9ncvrn3avwq2qd0lt7jqtqh", "1660071423717584384"}, - {"evmos1jf03sp3p2rl9gan6uacesl06nxms82vxsvp4x5", "1972268217249241600"}, - {"evmos1jf4qyx9j4pt7marm7uakyhx9yk292efak4jtqp", "433961786338067968"}, - {"evmos1jf4y5qkf548esvejecr3r8gqa67q52z4q83zl3", "5342367750240911360"}, - {"evmos1jf7n984yp0jkre53ph28w4t0y6wpejee9xw9lz", "13887203919587815424"}, - {"evmos1jf852crmjgc254l5k74kvy6dmq0ur4a5se7gff", "8586811943078594560"}, - {"evmos1jf96e8eejwkh2l3sqv92h97ewq0eus47j5d6dd", "5112190847631507456"}, - {"evmos1jfa0gtp354mrvhsfrwkd68nsv2h4cwsu2yx00u", "398827804383330816"}, - {"evmos1jfa2rz37uqrwvvkhwl4r2ygtjqn7jn2g4nc642", "8844353541929906176"}, - {"evmos1jfd3508s4datf4s87v54tu7tp7vkumqju8ge3s", "1368207938824890880"}, - {"evmos1jfdnlqdspwk0tf9qjys94hsdpe3enntcey0fuu", "403340653717015808"}, - {"evmos1jfeax74sc6z5ntd3mxyym0hqsnxu6sh9drq2la", "1134852426767300096"}, - {"evmos1jfpkkj2wq2tpup27sggwthk7kzp5zzg0hp0vdw", "27408845057570652160"}, - {"evmos1jfqtw0qutr63w25jzvtym7hl8s5j2s43rvsz6a", "6301868352759009280"}, - {"evmos1jfst08hu0df6kgu7dwx49lg7wpcgjl3lj4hv8k", "2963540197002517504"}, - {"evmos1jft9jnguwd3tm7dmfyr2wwj8ldpkgdmvac9gga", "201975187650490624"}, - {"evmos1jftm46frfnmxw029m7u8j0xar5jv96mhw28grl", "553474263716675584"}, - {"evmos1jfu2w3nzmgty9wxu033uugdwzhpcqqzunv4pds", "1188548394700390400"}, - {"evmos1jfvwxhnrxvwnqg4k20ak45m05m5435nqvd39yj", "11621683337025859584"}, - {"evmos1jg0wnmkq7q434ljvyhtff7r4wg5rjw06tlvvcn", "7964096415597656064"}, - {"evmos1jg2zdpqlask4n8lrmdtn0g7g9v4vyfzjp47kng", "384500541973383936"}, - {"evmos1jg4rkrgwh099mvz74c8lt0l23h63fvrpc3l4f5", "2913909448574824448"}, - {"evmos1jg6g7wdg6sjy976pxz478ek5a3y2ks7khye4tx", "15388384850607568896"}, - {"evmos1jg6jn590tpl9u8rz4mfhru8r6psr52rrxchs40", "2200619661189734400"}, - {"evmos1jg92f2dqmvwslyyw89az77j60nnaduzyjldgv0", "9741087359612076032"}, - {"evmos1jgec87pp34nzql4td9aj5st4zt0qkvstg4cgxl", "13931160532779532288"}, - {"evmos1jgfc0zgcdah5hnn6rep5dnu6u90alwalqf3d6n", "33468455540647591936"}, - {"evmos1jggggv5lpeygg7w44m4krdms9j3eth8qyyg2sp", "1470971856336642048"}, - {"evmos1jgh0fpdrraldhdngeryz6n2eftdgapwcv6pdx3", "2925875656497235968"}, - {"evmos1jgmel655w6t7rq7nvfsdwhz7gfpct68uc8evn6", "1417354379963128064"}, - {"evmos1jgmxhenaw4f2s9f5pqeyk9ela6nkcpqyvx4dcl", "6474583740899491840"}, - {"evmos1jgnpknqqc2tapps8rg862zmjx72tj7cwerwm23", "7192309946777978880"}, - {"evmos1jgpgmmap8r9zzyjmruv79vdaysckdw98fsmc6j", "12201837596368240640"}, - {"evmos1jgqfxf0uvvasn30u0se6lagad0m69n2jv2eyyx", "15954071533418311680"}, - {"evmos1jgseqay6ds4xw4e48q62332hvy3gvvs4m40qwa", "3394080938329407488"}, - {"evmos1jgt0e8d40lljzwngczp07t4unhscnx0fvreurx", "2328412740368479232"}, - {"evmos1jguvg665f57sr0sfrul654f6l0jdqt2rc3x7t4", "2456019935937011712"}, - {"evmos1jgz655t4z6qusxhqjw74luf9j0etusda86tkan", "2814116062484950016"}, - {"evmos1jh0clnkkzdq7npqdl8ks6ekz0u3xd5n63026hm", "1356068329657413120"}, - {"evmos1jh2wr6z7xg65fcd02lyq769358wvu4dnls7j0c", "47643216881596522496"}, - {"evmos1jh4dr6hd64eal806uu37q3tmx325hdnqhqemwl", "477328089448583424"}, - {"evmos1jh5wayv0d5q2ld6hxsx9jgykkjhr4dr4nzzszu", "1223598737398644736"}, - {"evmos1jh6vawjpj4drz6edc0689ylycau8hw4a2ksr00", "3702516727693881344"}, - {"evmos1jh7cqff970vhn6vfm0370vgmu66q808vmetm77", "3979945406446699520"}, - {"evmos1jh93dp6ees68u4gd38u5l9ejh5swf5vly58ket", "778590720000832000"}, - {"evmos1jhe40w5dussfpkhcjtrj0w98zmalgx9qu6p0az", "726767436191754240"}, - {"evmos1jhf4hzs3nc2ed0599gr42pcvcrgmuxejsnwpzc", "618860094649308160"}, - {"evmos1jhgtp23073zcyp607chdvhfs0npgdkxcckyk2f", "1295377411914848256"}, - {"evmos1jhl29lyncdtpmzdnwvgg2lqjsldse2yrre5yj2", "9307908126458609664"}, - {"evmos1jhlsd07gj3z9wkdmwp6eh6p3j5xa5fzpln4ruv", "488885196257481728"}, - {"evmos1jhnzarlcfmvy2m7ujuu7uj54j7akunql00lh3k", "20272563988850610176"}, - {"evmos1jhpl8a0cqhnqg33dl4glh6jnxr6evwe4xfls6v", "7446340045325606912"}, - {"evmos1jhqramvvcxvdy7lqnrxndlhlkx5266p7u2nc0a", "191628635162787328"}, - {"evmos1jhspepdh56qeqvnfesx9874x3099hgf3vvgyj7", "1530708910353456640"}, - {"evmos1jhssy9l2euzk9lhg2cuk2fmlce6tkuyj09kgll", "4278556330721181696"}, - {"evmos1jhtuwvvkl64papdpvstrna7qcy6plkjjfjzw9t", "599430691360749568"}, - {"evmos1jhu7s728exduaw3pnnv7ufe272wfd9ulj90cpk", "175591489791072256"}, - {"evmos1jhuexaurjzvm0jgt3drkknc9ju9u47rnrem5t3", "35735072975412797440"}, - {"evmos1jhv8fjskk5jvmkj3vezxa9wcd54puxr0qw5wx9", "12532646920554307584"}, - {"evmos1jhwdx8rsvx7n0kqkjaleemj047skpq00m5wq2d", "2068949698673393152"}, - {"evmos1jj0d4h55xnnslj3l7asltgv552muu458px9l59", "3996235123966160384"}, - {"evmos1jj24hx2syxm08uukg4wztyyqr9zq3zszpmve9y", "1221320161979566080"}, - {"evmos1jj46ywumhlnmkc4faw93y9wh9d0k7vap08h9eq", "4606830048749568"}, - {"evmos1jj9q8pm9pruwz8c7tpfgg3fz3384x8qf9qj3xy", "7596360698772766720"}, - {"evmos1jjepd58v62d29duej2qwhfaxjngtqlt0u6deqp", "51505546585884663808"}, - {"evmos1jjjvxqllrpye244me4ng3wnf7p9g7l36ekndl0", "5473662776966895616"}, - {"evmos1jjn3kt9dl3ny42z56cdpxhr5xw84lmressj2uc", "924745276579276800"}, - {"evmos1jjrrzqdnxadgh6znrgqfu9qeyvm6nzsq3z0hcm", "1381339886285935616"}, - {"evmos1jjsryyvzl9d5k4zn0fka0r04w5xlx5furngpsw", "378153443833774080"}, - {"evmos1jjsx0cky6m99m48wacuucf93yg5h7mnzmwcz3s", "402383028389856000"}, - {"evmos1jjxzmj23rg9ymtaxjq9ufd8eckalx0a82vjm5h", "162896418272841728"}, - {"evmos1jjyhw0ylzl77nj2756vsy2th5n83cwchvl2807", "4149218873623320576"}, - {"evmos1jjyylfuryelvkqjxufxle3sc52meeugxw6urjp", "789481782896158720"}, - {"evmos1jk3d2xjjdlasl0gdejaq8metxhjare2uetlem0", "491701105663461120"}, - {"evmos1jk3xsy05tv4h73pdy0z2v4sywdvc47wyqhaxvw", "2886017246667599872"}, - {"evmos1jk87f45kad86wny0stgcyatpqakayu4l6rg0p8", "1036363767738105856"}, - {"evmos1jk9u07rejfu3azd9elnkfl64g8mr99jz9mk8yq", "26573902892067602432"}, - {"evmos1jkadtmugmu43lekr9asyggfrgq63ccrmvy55pw", "12965759310186582016"}, - {"evmos1jkaxekgzchxw79u809smx7v78dgw2s55mr7ug9", "75077142266721927168"}, - {"evmos1jkcckaepac28zj4e658jrlvqylvmjepjz0txjh", "47576911645181943808"}, - {"evmos1jkcxc83qr7q07yg7eepvr7m065z3avejuf9juu", "5241818060806159360"}, - {"evmos1jkdpfcthfrvtdwjddfkd7esfyfzlucmz8ujane", "133929597056054272"}, - {"evmos1jkg2x08afczd23zdzrsg4rksf2njmf460jv7za", "1910512021162885120"}, - {"evmos1jkg39ddxyc2ywzq230a8362s24mtn7z70y8up2", "1814728920874809344"}, - {"evmos1jkgxh886q7dwpmzujcvzf9d3k8yfx9pmhw40g3", "1742104585955794944"}, - {"evmos1jkhe2wa7jyj7wph2ull7yt59edlvg53lpdwmpp", "2951872022552653824"}, - {"evmos1jkhg8qxzjtd09gwgv9wxm6sd9vh5mmdhh86ea4", "384314424118280448"}, - {"evmos1jkl687punled5vc7d4rg7xh8zup0n3ydszxmjz", "667005972196335744"}, - {"evmos1jkl9ew8nmmw8wt67s20mrfkvkxwuthtjgf2lv4", "522706908531883264"}, - {"evmos1jkqxdek6vdassjy852xs3g5grk4a2pnes6kckt", "3280043669722636288"}, - {"evmos1jksdhlgmeuwtyfvds4m7quucpvdurvspvz7r9d", "202867713798929920"}, - {"evmos1jkucu8klwfhg69lluusylnq4utput6js8plwgf", "365596774382635520"}, - {"evmos1jkujykd2mtgjsqgtqyrz93j7aa2q0hnczvhq6l", "48391808079733415936"}, - {"evmos1jky9s9hz9dxx0zaxgprltap9xkcu5hv0szww2u", "3844317641518557184"}, - {"evmos1jkydrh6uuu6tunke3n7dr8uevydhqhnlrx8rkp", "1530461554667725824"}, - {"evmos1jkyehm7le7k7cmdy42e9hlvdmyq3u2lss0tqce", "4989534649671530496"}, - {"evmos1jkz06rn3r5l3qrvf9a83drvqsx0v6tasn39mzc", "6924017681605984256"}, - {"evmos1jl0f20x7z07czwkxh78r4krntnqc5a9hsvumz8", "63193728274771836928"}, - {"evmos1jl43y5dqaad2g2l6keyacpqt0c8yr2g8z0auns", "477748632919973888"}, - {"evmos1jl4yla40pya8rvfv53g6ks5yrk0mc335ryq90v", "1295049091251854080"}, - {"evmos1jl748djws8qm3c54keth5my387jyyus6w0p2hy", "1663229423662252032"}, - {"evmos1jl7ljm66cz3h6wjf3plqddk6ww54n6d472079l", "87484603566150656"}, - {"evmos1jla9fvkd6lqqejknct5wvugxytpdp7pku87sz4", "14632946645719908352"}, - {"evmos1jld2kn5zds2yt8rp74mq0dshdhjylz7prkdcjz", "1993361460447821824"}, - {"evmos1jlelx4g8xujlg4974xsy7h30txw3e8aqs4f4pc", "6276962932622848"}, - {"evmos1jlfczrsclssysdy9hl0tg0vvc79dhrl30jtnsf", "1495471445018394624"}, - {"evmos1jlftrd9zf8k804t069tk235ed5200kc6q3frwe", "20174358984243683328"}, - {"evmos1jlg0rh0zuk2n5jkzuc2jw9qhrz368m8q8lvcf4", "18770624940771196928"}, - {"evmos1jlklvvqf7qwztx2rt90x2f6upf6we8h6y4tjk8", "657046448698901888"}, - {"evmos1jlktm0wh52auge2vt69pm76ph0ukkywpyvq7d5", "5826672198598702080"}, - {"evmos1jlle5e607a9nk5u9z06efz9d63zjr7salhlk2n", "522693276084534272"}, - {"evmos1jlm37uxllz0duukdteysdwhsdgjr56964kl5s2", "459620412517739520"}, - {"evmos1jln9gkl0479hmkh3hvxwrp2u7txpkrzn7ntn8k", "892145258684205568"}, - {"evmos1jlneyw6ennrt2562ect93je2kwgtntm54lwq43", "247939478794315776"}, - {"evmos1jlta3lzpfp2yhmfmq0mltz6avf9pe9r2kjgzgc", "2180876217955237888"}, - {"evmos1jlugerf59xym3tgkn4r6xxj8mfqqfayvq32sfn", "7496035784857878528"}, - {"evmos1jlvf89dr6646a0ct5gannjvcysqhx40ncv8x88", "2938846953150544384"}, - {"evmos1jlvk5vms84cllv807l9nsu47r0h86c6399xera", "1085976467180944640"}, - {"evmos1jlwagzyzvmy3qctvk3fsqv054rutdn2jjlzlth", "4061733530810340352"}, - {"evmos1jlxfjepdk85rxx53jevcq736cj4msm3jhe9xa9", "7620353396021563392"}, - {"evmos1jlxstm5lglr2hgpfchk5l08ge6qhtphrh5rfer", "515143389572911104"}, - {"evmos1jm02t0swr7nqkyvhl3va0my79dkmt9vkxg8jal", "11084317860996065280"}, - {"evmos1jm2teuhkmpuqejvuhv2cpr8gdwyfr3wtysrqu3", "1956922823279468544"}, - {"evmos1jm3xuu9tutpww3dndddujacx9kh2hqg56u2sl7", "19100013462013341696"}, - {"evmos1jm3ymutv6lsadc6ar7g5x7wyhp34ltwp5c7tze", "6348780149494525952"}, - {"evmos1jm45j705vrm2gpd5zm3wgfa6jqg43qm2kcp77k", "701816935721351168"}, - {"evmos1jm5e5n8qjfqxhrz5lmgksp486mjvq28xmh3fy3", "5624432000577248256"}, - {"evmos1jm7c045wcfvsx4syyvxscn07ng7kvpn2f00r29", "3615827765399020544"}, - {"evmos1jm7lhtuw2a4kh9njpf5wlvpndyhx2cxn68cg60", "2802404551581824000"}, - {"evmos1jm7rucf2c6gs4pa59s7c3x7s7kwdy6307e4e09", "2234996014696495104"}, - {"evmos1jm7sa0nmj7z5caw27yp73ruvx5wl7a4vxes6e7", "157078343294684160"}, - {"evmos1jm88z4jqwmc7nucpg0h0x0rflllvuty574lmqh", "384316370694166016"}, - {"evmos1jm8jk4yaz0qcfrw72w84cux4r0a495xmkxkkec", "1607659874347900928"}, - {"evmos1jm9pw6dy9jcz5kef9h0vph7g9ctnp25x50cupz", "2093850896674945024"}, - {"evmos1jmckw9advh0grkpmvedacjrcfqrmc83hcv2z09", "2312096365671661568"}, - {"evmos1jmd694pumzvunynz5tx67mduht9ealm7pggazj", "1316908797805232128"}, - {"evmos1jmgulq7w73c77y9f33zwqafz9v4f7gn7fydu9x", "1234637489711683328"}, - {"evmos1jmrpaj5a05gftawsrgfc4v86r4zkcgexzjwwjm", "369009271567056384"}, - {"evmos1jmsej84afvyfwh9ae2yap8l8kem67srm26xjy5", "46722075574703872"}, - {"evmos1jmvxqgaaevmsg90z3hwv8k7xvlx0j08rr9aahc", "2580812347624925184"}, - {"evmos1jmxv2eypxr8wjrm7ucflpfvsvf8t3vcgepnqxa", "850890429022511104"}, - {"evmos1jmyk58qkgda0ew7tv4tfdf2c6wen8rz8wt8phq", "7626464273618031616"}, - {"evmos1jmzvnnvcavpt5q8jwv0yl7ukt732gxfrd0e4f7", "6835501872633808896"}, - {"evmos1jn0wvay7x2ka2prz3a7st8rkxcvrfr3mukwpf2", "529099394203868160"}, - {"evmos1jn3wyx9h82p0qzdymkjdzrhu7caztkwu5ufcn8", "5844419980353125376"}, - {"evmos1jn4d06agrg4aygquum6gtq0k45glc0jvr2qdan", "3711972287139162624"}, - {"evmos1jn5n4w82df3z7fqkf0xt39w8307vsltsq4z6gv", "5636519484613901312"}, - {"evmos1jn6ushhqyvlc6pf3ym98r4l555gsrk6qlyltsk", "1370848667023034368"}, - {"evmos1jn7qcfzxvf8y5xpjcy4ywyk2zy8nch3uhrqeed", "1328177550927355904"}, - {"evmos1jn7wvcus08s29frw86xj47qpmtj8l750szku5v", "1407146141031350528"}, - {"evmos1jne2r3u05jfs40hlggcycak3thukrajh8dtvvv", "2312805821242284032"}, - {"evmos1jng07mqx3pyk0k9d3yjuzts768xq72f4kme46v", "5126417149930125312"}, - {"evmos1jng0n03gqvjjn9pdmt8e2gnceuhqznxa2nu0wv", "885261719802503168"}, - {"evmos1jnhv9klyxupgsnfqn025rp486rts4yl45yg3fm", "6186842603323328512"}, - {"evmos1jnjcpfsxxsk83snlarud48k9y80jsx5gv02eqh", "786221871463639040"}, - {"evmos1jnjqv7dh4e2rgy8msn2ypuk95sn8keuwx7g4qp", "1097659643038592768"}, - {"evmos1jnmfcnjjj4vkje2m0juz5cyz39j3dj33rtta4l", "477648581946873344"}, - {"evmos1jnmhcwpasc05eyh2gcdwcqwa7y4n25wddqhkht", "11294932611096494080"}, - {"evmos1jnnflu4uwvyf5fl4k88rq6tc4l99p8h6ykfcer", "2399112829578371072"}, - {"evmos1jnnskah2wz0r8uh5rv6mure0rk2vu7v6nvlxjv", "6315701693392003072"}, - {"evmos1jnpsexg85afc0mlz4uth9ak0g3ra0l7anv0233", "20394919399900782592"}, - {"evmos1jnqkj8wnmxh2rzywalv75lmmmnjq8u0gwcnwzc", "25647151613067214848"}, - {"evmos1jnqxqsre85dt06sy4s5dp6h8jdu06wah94ya76", "2715797003341081600"}, - {"evmos1jp32j6u7j3ajk4eg8ec9e9acw867ketpetw3jf", "8196531175160340480"}, - {"evmos1jp5a6250jayux8r4wafhvg6gu7mrwmu22qgx4l", "6119157849277523968"}, - {"evmos1jp6vvxsd5v07ett0vrljyzsgfmgutcp24s79e7", "1534088202712564736"}, - {"evmos1jp6yrv656u8rqdwa0plp37gekl8c58sj9su4ez", "3640546902563346432"}, - {"evmos1jp78zv2tqgvdsadmq47mnzfw4qxnvqre59y4fm", "6406591692957067264"}, - {"evmos1jp7xh9z77q9jayjk6r9ejn297vqkpufncrgjp3", "5581359604347715584"}, - {"evmos1jp88f5fuvrc9e5fnemp7vtt62g6zg20pvxvl68", "3456712497119825920"}, - {"evmos1jp8u4xaw8hfyjy0xxjswxu4r3048qvf2plujfp", "99934248228284160"}, - {"evmos1jp9t4a7zkls9hyv3l94mvcfma60vtznlezhu3x", "1315476916409191424"}, - {"evmos1jpc3j9wlh9eaa4x0zudn8nq3e5k8ca2x355hhp", "4527185152520990720"}, - {"evmos1jpecjy5kctwww2dmcav90hfv4ylzz0u66krn0e", "606760467845582848"}, - {"evmos1jpelapjekwge8zugkqkjsaskcjukxm2m36r7mh", "15821439591956224000"}, - {"evmos1jph2s8k46lu2qqvuzsftp7trz0qm2cprhenc6y", "3168309631885312"}, - {"evmos1jpqq9ayd7wwg7m4a78nu4mvrkxp2n6neldeecq", "4557994411733248000"}, - {"evmos1jpr8qca58ckwc7kwl452fmqstkrs5j59t4pamv", "11559226883826759680"}, - {"evmos1jptjwu44cxglyevrp4tkr76fx25rl8z0wjmcf0", "86151151719289088"}, - {"evmos1jpvc6wc3vy0pjf2asvyepxurk46hm58nx3w2ap", "3206459884293855232"}, - {"evmos1jpz3rcz648uxcmamerpteqcas583rmupfpyxz3", "6573976667845509120"}, - {"evmos1jpzwqk8p6zjxa2fwyufugx55exnfqjhvv7r8cc", "450427429382407680"}, - {"evmos1jq05h2pe8qdcpqy303sk09h5lclphpxnu6t73c", "19326598109538127872"}, - {"evmos1jq3mfana86jnqfdnltmw5p33j65c8d823k2s83", "522685307429912576"}, - {"evmos1jq57kzsdek8fdtz2kucdagvfulq7ten6mmeq9j", "644226878767840768"}, - {"evmos1jq6mdyvxljs6nfpad4d2kc5z9mtxdehqqzf86h", "428026936496082432"}, - {"evmos1jq6yuxw8tmwad90mnd9ukkth6a0aum2pu8plfj", "385031422551785728"}, - {"evmos1jq7kp027rv976v5gfr5qjw4prv90mrdkn90j0w", "5008505756441707520"}, - {"evmos1jq8wwtkejry3ej8nv53w8cycu3ys3pkm3j3p4e", "2063607778025504768"}, - {"evmos1jqewuzd8p5fct2wsvwxvpya6ud4qy7fmm447vm", "4343596523509273600"}, - {"evmos1jqh37uejps0z23e6262dj48ajm008t7g74zycq", "1281652354150790144"}, - {"evmos1jqhu8zhhp9qp5l8kqjen8w7dapjfj550uqvlze", "213699246836717056"}, - {"evmos1jqhuur2a49tzqdzrv02athmqty0mdwshenttrn", "2349342284354347008"}, - {"evmos1jqja4cnmtm3ycvyqhes3xgafexedyvtnl7ghlu", "2019069648439583488"}, - {"evmos1jqm6f0hcc7q0pn6z37f60hsjmc7sycfll5rgw9", "57758095795389079552"}, - {"evmos1jqmymwmey97u3yw8sx0agkw426l3dejefmjfzv", "13627505215832619008"}, - {"evmos1jqraqz4mlpams3egyesryym30gqqqddpkd5dt3", "5147733305321193472"}, - {"evmos1jqv4f8tn009awvudd3q7sgr5ffx2q8y9hsffyj", "426786945537135104"}, - {"evmos1jqxtfg9l5qx4vl8m626z2kzrg8d7lscdsds76j", "16905518352961722368"}, - {"evmos1jqzjnd8tygp8as3289ccjyvqjacwleul5f2mw3", "1599374720469399552"}, - {"evmos1jr02uqnc4fjtcww9wg6kthqlkc8s4549zg7shm", "707909544352451072"}, - {"evmos1jr5hnv7kldqzrd9f00cwpy2dvkxvqmuzu73qhz", "14540596578027204608"}, - {"evmos1jr5s6v5l0tktajh29cxjnn39zv2chuulrq7j40", "4232124493994932224"}, - {"evmos1jr6xuetzpcsx8gklpjey6vxw0sy907vka63l9y", "472183161823288576"}, - {"evmos1jr7kr3pxhfehv2v2huuruk963cn2e6sv9gglup", "9197945955096870912"}, - {"evmos1jr9fux279l3kmp7x2s5v5uxp59k56rc38qcf9t", "4686910273347564544"}, - {"evmos1jrcawat2tg5rgmzrejpcy0q0jv0ucjvqpdjcm2", "888997494255986176"}, - {"evmos1jrcfdmukayhe7wuglqsh55snh58kxrc30605qz", "8676048269135719424"}, - {"evmos1jrcuhyedh72rs4p5csx48hehylcqu593fgutd0", "29752117943614521344"}, - {"evmos1jref9pv6vr83qm7qh68s0aqtc8dvuvgrdr7gme", "3168112244394844160"}, - {"evmos1jrengktyjl95j5lmakkuhjnxl98l2rxnh89pn2", "3764629887081248256"}, - {"evmos1jrhkc7u6gp6ljlvk8d2e9spvjg29vfcma8k7cw", "17868907299207579648"}, - {"evmos1jrhsq8mc5l9klpvmed82cmdc52y7jkgtp89lkk", "8060129191326196736"}, - {"evmos1jrhvg8v2t09wag2ym4lr6urjt9fejdnkjg4jhd", "9932160000342032384"}, - {"evmos1jrkjtdwrf384jxlvjqpfrn9y4mlepyf93qymw6", "1448426487364050944"}, - {"evmos1jrks39gqq7jm88wrhjkt05p299wcut8hnyc63u", "391482590541125632"}, - {"evmos1jrllqkayvcfngzcg62mg9hr9w7p9wzf53tvjnk", "39606320296014536704"}, - {"evmos1jrmjxq3z4aa5kffz2ua7xc6k3gnmj2sjl8ayfc", "983331775889814016"}, - {"evmos1jrnu0ddr7v0z7cluwhm6jmlz8wlqc3zz3ujltz", "11392837549369755648"}, - {"evmos1jrpca06a56p76xfzmtrdghmt9p6q3dsmjp9nn7", "13441564868556705792"}, - {"evmos1jrs3m69w929twk3tjs6yatjrk333r02w2xutjj", "1693897113397510144"}, - {"evmos1jrsdxl6eknfjq2yq6ta30ul9pdc9damzct58vk", "6047667084693069824"}, - {"evmos1jrt09d6her990ntgwscr2xryz4uf6d8a3hxk3v", "356523274811740160"}, - {"evmos1jrtp95m8ye05nn7kv0xpwvg2gpucvn5vgktwfl", "12987325656060729344"}, - {"evmos1jruzexf3vye3750ln9r0q9mzel6lzhgfl8em0w", "253133189821489152"}, - {"evmos1jrvknah3nj2g9lxe2sndkv0dk2xfae3pftlnsg", "1549171260015870208"}, - {"evmos1jrvrjxvjwxew3af628ggzekdkjrd4zjgdc570q", "938830485031548416"}, - {"evmos1jrwg0h2humtk2q372m7j8uwj9drlw4s34xtmrt", "1351800110654288896"}, - {"evmos1jrwpf4zzxxenca4ey8dt9jn99h4fapus9rvwcv", "401886853197093632"}, - {"evmos1js0h6wcgky7l8kf8t8yf0wanaz2ejru6u9warl", "190514585462827974656"}, - {"evmos1js25625prddfs8e6hq22hmtgakpwmtp7uaax0k", "5318677154676080640"}, - {"evmos1js4nkgdme0arv7l5uegrdpsylxrj63ty505vpa", "367113736744458752"}, - {"evmos1js9rzr86zla2lknxjzcwka0sm2qekyk50zl2m7", "3374513107302934528"}, - {"evmos1jsdkz9lhqkwysntxareya5uvks9pve7dwvuzkr", "385413392593985536"}, - {"evmos1jse09gewvn2pjmxad2u33jx3j4hvpth9esgt75", "105862268083061248"}, - {"evmos1jsf8658w64dwzu36vx0ff9d8nrm26wu5mhu6e2", "48150321813020180480"}, - {"evmos1jsfg5zyjm649lwfwntlmyu0hu8vzy0zv3c7edz", "4620485008720337920"}, - {"evmos1jsfkn3ufvmjzh60lldew3pacshycyxgxg3e3q2", "1506651291371151872"}, - {"evmos1jsgknllncdfma9j78u6gy0h2vwmhygvu5zad3w", "83027498129673984"}, - {"evmos1jsjqg6c74xvzvy74azmcxg56zrft4kzu23hlrl", "461558561648526592"}, - {"evmos1jskfjwtqmfcfrnnuretjwgq3wt9l8xatxtjxj5", "43615315610329088"}, - {"evmos1jskl2tlhhy6u75cpmz5rr7gcw9yljfnagc4q36", "5470396127221911552"}, - {"evmos1jsneywkxfsw59lzaanehu7eke4xapfhs0zeh4r", "10474842250212126720"}, - {"evmos1jspt75n9sm7ah46eztd0g0e5fvu0fr3g2f8qan", "40695440646786514944"}, - {"evmos1jsr6jkklt62grsejzyn2ldezgxufmc5kmqf0dr", "10787382318585823232"}, - {"evmos1jsrv5zhk8re33hc4tej46katsy4qul324pd4ft", "760095135116465664"}, - {"evmos1jsvcssdmhu09w30mhk2s65gdvf36a6wppma779", "17641027079418130432"}, - {"evmos1jswtm8yr79z7p927n5kdmtmz5quwx5y7gmur4k", "36664869765842591744"}, - {"evmos1jsxv747wmv4xjkhl9qc63ujra5x4mce882vk7u", "13561484822120050688"}, - {"evmos1jsz9nfgskt62m9g8jh22g72p8ytz30cd7vrn0k", "7840972147483258880"}, - {"evmos1jt2m93lv5uwzkzy62ytn8qm3ssaw83yfxrq605", "37959898631734837248"}, - {"evmos1jt50hygkvj3aa6axwmjzmpgm6807e7xy7d4558", "909426629181300736"}, - {"evmos1jt6agu4m2qvwsk8zx3fkgxzshl4vxrnanz78ut", "1286068942189404160"}, - {"evmos1jt6cpwqfn7tryvmaztttrfpsumvlfqwe527yge", "1250962223966830592"}, - {"evmos1jt6mzfgghvrj3te4nlws354vdxc92kxqhyxshn", "226168486800044544"}, - {"evmos1jt8wsygkqu607t42demq4pjf5c4a8alwrh0nqf", "6544310876144199680"}, - {"evmos1jt9yw8zm0umhjgtetn87zdk4k9cwun7kjw3fth", "1391774886128064512"}, - {"evmos1jtefzpz9znfr0342askzpke47z4wgq223lc409", "81758743928871780352"}, - {"evmos1jtemgjdh2t8t986cey6wapewdgdhm27n8lzmq6", "12410928774874177536"}, - {"evmos1jtfgu4cm7fh3rkcc7qlckuy9r2hyuve35w2hxv", "12763149214337298432"}, - {"evmos1jtfvl7qaq86ak0264gr6f7atu577ntpd4h2zuw", "38705839039616753664"}, - {"evmos1jtg7w8zd3gfm9naxhhqgmfxhqfr03le6gksjwx", "4681960639174217728"}, - {"evmos1jtlth99tdv2e5avrzmrkgr5ydc2xqwfp6dkd7x", "8904223919313188864"}, - {"evmos1jtqgfxrtmv8lsuxyhjd0z2smqfc4aq35v7sjna", "3904571509973678080"}, - {"evmos1jtsr9f4gfts40n9envtte0aqn3khc9tjpza3wr", "199571794728505344"}, - {"evmos1jtsrs3xhz60azns3nr9lqv2v0g3rc7pvqqm3yh", "88072298490638893056"}, - {"evmos1jtu6ym2qnsqwa8wz3rcyyds4aztqssxhpdwnt5", "55783012217636352"}, - {"evmos1jtwpfqhe92qc9x6p7z4u5rjwa5hljx4d0nym08", "2416317048189312000"}, - {"evmos1jtx0j4323tsq828jvsu4kmwhryasa9kt2vem83", "7990004968769927168"}, - {"evmos1jtxuf93ye3kmz7k77atfqmlcnfx9vzmww752ah", "229441789324300288"}, - {"evmos1ju02qav4f7xysepetf2n7y8ahyu45urd6m55l5", "6859000072579098624"}, - {"evmos1ju78cf5u89emc28ds74wa97nf5mhm9appm3m94", "187300190937986048"}, - {"evmos1juca9pk2kecl9uenkuzsd7shyyzxdzp0kgj6ep", "10368579434711998464"}, - {"evmos1jucmpjzrd33ukqv2nkq5vhk7f8ktqwgwz2nprh", "6268275530989690880"}, - {"evmos1jucsh85yctdt87es7yazxet8g60szr63mka4en", "14008275513575598080"}, - {"evmos1jucss909lefpm92z3lupqdx2zqqpgn8aw2gh3h", "884302995044974976"}, - {"evmos1jueqy92mgjfugkk0fy43kfkjp3vyq4k0eecrmg", "26825660895869009920"}, - {"evmos1jult4a53stp2chayr9ycjejh3mx6pqwl3pasa4", "2188376023146186752"}, - {"evmos1jupjvv2plt40ffs84jdh95d28te3pju82wr500", "7473980677328922624"}, - {"evmos1juq79dmzv46ekquca6c24f96asprekw0uew8j7", "1323629591120843520"}, - {"evmos1juqey7mnz7e86fpqk8yd3l54agn93qfpaecxyr", "35998189667487281152"}, - {"evmos1juqzsmxzqr9t8p0s56l429v4tac95c0q70wrk5", "350828635546936832"}, - {"evmos1jusaap9erxvj7v75as7clfyvut9x0m6cqakwnq", "2971933526528258560"}, - {"evmos1juv5gzdhnhehhnq3n6r0mwxmeyqn53yzaeacg4", "5864038662380716032"}, - {"evmos1juvvnkg6y009gsmt507v879kpwuwkx6mkghw5g", "48972089565921771520"}, - {"evmos1juyq0c5lclkzc2jxd35vgkzhrx6gwvxw8kyfzl", "2657943352786624512"}, - {"evmos1jv2fkf7938gc25530yka8v2fk5eqyx9vdldmf0", "4287417443997155328"}, - {"evmos1jv54zwgdm2t9xcsh43h239ql2n4fpgc29nvdk5", "1958884010460864000"}, - {"evmos1jv95qpt48wzc55cq87tze93pns9ghk6nc5q5x0", "1304225027447399936"}, - {"evmos1jv9cnlt49989k202u9xetf3drk8ruumghz0hh8", "5968233302360499200"}, - {"evmos1jvaxujzap7nd0ra40gr055t3vfrzg0vas90wln", "371254364752246016"}, - {"evmos1jvckrwxwak09p2zwvy4z5gfhvekcpa9z8nn8fj", "1299956192077446144"}, - {"evmos1jve59qcu89rlmj8rq9kj6t7jerha5wy7fxnw7t", "957802410767189376"}, - {"evmos1jvew80yqx6sqp5xpqgjkahyqf60r7mn2dqsctn", "153347503383247872"}, - {"evmos1jveyh40sey527gt5te5ycskmvnmecd7kvlewzj", "1283405331295079936"}, - {"evmos1jvff93p2tasqaqxhtd78wslszepypzpvt08t79", "7429716906381031424"}, - {"evmos1jvkdyhwhu3r96vwtx3q0s6enkd9jn8524vgm3r", "9429529561892890624"}, - {"evmos1jvklrxn36r75g6j8m2ac4whtunjf0xec6x2mla", "520952601713019392"}, - {"evmos1jvlmj9tn4vrazn2q7fvl5gzldvks6knvdu67jh", "3260740191168143360"}, - {"evmos1jvlwvvgh8wrzjsvz8djahqlm7xjr3lfz33cn34", "252290255237509120"}, - {"evmos1jvpejlgeumchjpw685eme4sufw25m5yhwguqaj", "16048028607146000384"}, - {"evmos1jvqu0lp5x3eksq79gtvfpugvw67sj84cmlswuk", "1169021745554850304"}, - {"evmos1jvrt7x3mhylmns87h9ksqhs5q3zaydmxea87cr", "134593451117054976"}, - {"evmos1jvsarh775tczpzjjj6yhqraypu77fr970j5fg5", "3051882343648383488"}, - {"evmos1jvu5uh9ugcc0c33jkmffklw47eddx6d72xe4nk", "6922548643564081152"}, - {"evmos1jvy6p7y76zjx3su7uqcuczk3mhgv4vqd97z77u", "1975318516343059456"}, - {"evmos1jw56e36ccqzf82ngkv8tcwtl6j2ps2ae5g5fft", "73875836055621376"}, - {"evmos1jw6qegfqmth8f8f7gdgrtyjpnx59wr049rul66", "298347773044149248"}, - {"evmos1jw6u06zccz2c5nqtrfnm9psjvtxemu9lx5rrzx", "28148889001678094336"}, - {"evmos1jw6yywzatjcky7u4t3g7wqfzyuzuxrg98kwmyk", "847967261672086400"}, - {"evmos1jw7u2dp558v7kdhge7726mm8phdvs3y78pta48", "2614182732371974656"}, - {"evmos1jw8j0sk6xftuzp2ady6hsd6wt8q2jkp7lz20vc", "9522172469437390848"}, - {"evmos1jwff6x0453zycjv2zswt5h5xy4zec4pg4tf3t8", "341369434313778944"}, - {"evmos1jwhle7gjnjvr49c9j7tk83250zcnpp6d24ec29", "2865001491484016640"}, - {"evmos1jwjykjkrnj39372d9u49grawyh0l3t4k9epuun", "24817223856099983360"}, - {"evmos1jwlh5t8gt8wd2egjptxp85q5yxk36phk5yfw4h", "4715172853036048384"}, - {"evmos1jwnkxvvcp54rnrq3g63ghe2ruz38fd0khy3ucz", "4295265894510888960"}, - {"evmos1jwpskygr0jjtfeqz4xcc9xah8xshj4z6yttxx2", "8864464885731614720"}, - {"evmos1jwvxrv2e5ljhg30le3yxlnguh2szlfmk0tjd7p", "8699995872874356736"}, - {"evmos1jx4g69utmlkycj2y9tsts7me5fnz2hz7q6gnua", "4870414171413221376"}, - {"evmos1jx64y764gp732lukvfr5a6vle2n8myz2ge7hax", "4874749914081460224"}, - {"evmos1jx972yeqzt89rkrmrfk8nk4qsfnkjm4e3534ff", "3822330818769612800"}, - {"evmos1jxd6pfjtcny8w75d0tn00vs7cyxzfmgtqghm94", "2585213802297966592"}, - {"evmos1jxendgqdqv5wlhxvq2xj3mk9543lj82e5c3z0u", "120386453816017092608"}, - {"evmos1jxrz8mvwe5v4zscv4hamsn00s39y5s5f7rfegd", "473528961872419584"}, - {"evmos1jxus5rrglvds5azguy6f3u2f7v8snnu9ezxzyh", "4808751765983006720"}, - {"evmos1jxzumhrqw5txa4l30jmgypra79q6z8djht68c3", "507481703572719872"}, - {"evmos1jy0dhc0e9nr877at5mfc8qd6zmnkla7l25aqmp", "10519182507702214656"}, - {"evmos1jy4luupye574p8scugga0fw0psfwekzh7cw2g8", "315174614444261376"}, - {"evmos1jy4n2z8a5gnlq7zeq0m4c6vd6qdpmvtx9n88zw", "4655821246251687936"}, - {"evmos1jy4x3wwwrgjrmc4udf0325707hm648p6jr8m9r", "2685196616271329280"}, - {"evmos1jy6k3sk8cs8zhrslnghge0kzulyvez77dgcj6l", "5353183020167761920"}, - {"evmos1jy75a4ctcmhgg0ewe3qflvkufk8p20ag9tm9ez", "5623542892444108800"}, - {"evmos1jy85wd9hv5vc8vwuu9jewzptxvzdwccf93frtq", "74963579393352704"}, - {"evmos1jy9zh938wek6avplrwtu4jrruty6evaqdt0hnn", "2216610542841541120"}, - {"evmos1jya33c0lya60puyn5fctpjdp46mjcenx5ng34u", "22093944961184063488"}, - {"evmos1jya6sax7yge53jrf5fcnptnhacy6dek9cuhktg", "2749358474089472"}, - {"evmos1jyax0hk45uvd7lt9y0vp28dvra4xx67vpft56f", "952364923982066688"}, - {"evmos1jyc970d0efl7zpvs3je69rx5yqfhy8jrm4rr55", "941900862977690624"}, - {"evmos1jycvptx94mqgu5rq43rrw4ra5cvcxsazhspp2f", "2207691554357315584"}, - {"evmos1jyeecpjud9c0sx9yg8e20vvsdpt8ywc0n2htt4", "6902368226163523584"}, - {"evmos1jykmwxvghm8yrg6shnluuyz3tgckd78mat6mly", "21937491302702403584"}, - {"evmos1jyl0gxppd4pd53zxqq6ypl7u35yx5z5k3sdxnn", "951947765763432448"}, - {"evmos1jym6lrp97qze3t7x4hwe0k73cwg8wpzyv0tmqw", "1395349313428302848"}, - {"evmos1jymxw2g7a6xgqw9qt8trv6ve80dch6an0chxqr", "592042617442787328"}, - {"evmos1jynkvdkvus7pt8e3adu8u3hg6z84dky53ewhha", "14592957626107117568"}, - {"evmos1jyq3nkt0e350ezv2q2c8kwnrz6vj47qqy5ekjk", "202810710947214848"}, - {"evmos1jyrf9pnj3gt0krp0ur3faftwy5lxn6cpe67ekl", "29244343831167795200"}, - {"evmos1jyse6h7y2s9uax2qxcsh4hnhj3w6t4hkartvzc", "11785643255830773760"}, - {"evmos1jyttelc3cxs4luplmvyhd5779xu9n68n7uf50w", "2172372778549032448"}, - {"evmos1jyug6ruca06cl9akv23r23ynus7rqnadf3z5mx", "96407532021322496"}, - {"evmos1jyv2ujy9mka0lx7766zacsnc08w6wwrku7gyaj", "13550287988117692416"}, - {"evmos1jyvugxkh59898dvgygg2ftxrr6hjxf67z3pwdl", "6918476818425856000"}, - {"evmos1jywg3v2yl0jdvdgdcqtp6ucjgw3w0gjc799hrg", "5809615224435855360"}, - {"evmos1jyx7m0l433xnn9nmlu8eazd35w39rrun8atfvl", "4010474246067709952"}, - {"evmos1jyx9495z9mceqjdsn52pmt74as7fqqrnxqd9wt", "6684304441369366528"}, - {"evmos1jyy02n3vf0qwc9q0vhewrlz3v3y5dy9yel7jc7", "842029932734406656"}, - {"evmos1jyydjgd3u3ug0ru6u8hqzj56yjkuqxeu5gyy8k", "369044803056407296"}, - {"evmos1jz0r47j68llnjh0m27kf4zxfpx7gsrd9kcxwk8", "415916308831735808"}, - {"evmos1jz0w8c5epn8cec4250xdh3dkrqqz38ard4nhzn", "2612475594658065408"}, - {"evmos1jz3yxyc75f8sdzndyk7kc5evhavyn2ju39flx8", "140244207232025600"}, - {"evmos1jz43nh8taq9wl47fqmxjv8yumdwq66pjcmqjcs", "410854938636467200"}, - {"evmos1jz5rjlwusu2x4xvqm8x0c40xqmannx5m4wspyf", "6466257404592037888"}, - {"evmos1jz6hc30gdn835rkngupqnxxv367fzm9cw4d906", "379606804945920"}, - {"evmos1jz7f0yz0anr2muuuypfsgkwmkq2dxaqpnjj6pc", "179472199878250496"}, - {"evmos1jzecvh0tjvz96g08wwdumtxn2mllvuv6g2735u", "522699226096932096"}, - {"evmos1jzkmuhdavpctde6llye86dj7pae73cpxdkwsjx", "2140822818294942208"}, - {"evmos1jznmg9ss5f0hhafch5nacmsyxj7n3yejycxs4l", "19053049346711318528"}, - {"evmos1jznxe5k77tgn7nydpy3z5ywv902ss9f7za0yzv", "2475648485140682752"}, - {"evmos1jzq3fcgt23l5syk2quej20tdhnuvqey02l6w7t", "67463202180451590144"}, - {"evmos1jzrs2at8pd4ph7mcr7wx79el0dlf9pf967cjh7", "1831880974054227968"}, - {"evmos1jztwhw7qz7l9w2l38fax3jyaxsdu824rs98qc5", "999999543946813440"}, - {"evmos1jzvcrasgxzl3h036epfaqr867d5pztxu4uz6s9", "251333123597974798336"}, - {"evmos1jzw802dyeuu5xusk3e7p2eh6qe8qh9ztujyhhe", "340158062095248640"}, - {"evmos1jzwsr3lj6rx28u5gtp8ve4ug8ta3lceuawc2dd", "2788044642089457152"}, - {"evmos1jzz8uggx2y7ww55adewevhka3k8fyndxpe9x4x", "953418292280300544"}, - {"evmos1k00885fgvmjtdzl2xmgz2xwh64juqp0ek4gfdj", "1147922981333442560"}, - {"evmos1k02d9c33ls89me350dxxkdtglq69h8cgxzveg7", "401726602788763648"}, - {"evmos1k052cuc78kfxc68szm0faj8p3pgky2wdz5y6u4", "169947885911536128"}, - {"evmos1k087ldgveukmz27hrgthn5t8ftej2l0u2pg53r", "1373449228765173760"}, - {"evmos1k0d3drnfvu40hu09cyscr7m9p7rexp049s2wx9", "8232753703680528384"}, - {"evmos1k0dc6gafs7qqq2csmf0mpqhy0vkj9e8ncg38lu", "380258934092786176"}, - {"evmos1k0e4q9d7542se8jxemyasfug66lfflnm7ne0p5", "4951915480691347456"}, - {"evmos1k0fnx66v2ma9wy4zdj46a5k9nccl8j0zu80x6m", "116843384432027254784"}, - {"evmos1k0fpc2ddgsmh9el48r4q7areyfledm3fkgd6ly", "478518626950135040"}, - {"evmos1k0glfdqtxxhv9uk50jdr30n72xpd84rq9qurzh", "31096809122609995776"}, - {"evmos1k0hhx88wjkucn7hu70hzjjwm429aqnelhkew25", "884038663396953472"}, - {"evmos1k0k0nneamfgu6c7ka0r6k3uexhkhnn659pa3ar", "105014068832128256"}, - {"evmos1k0kep39r96ava6unsadlmgmc0qrak0ju72vt68", "117748687813705728"}, - {"evmos1k0n2ty6pqluvqa70pj8lzrmnvd74cuwwlr2zwa", "803677956368194048"}, - {"evmos1k0rx3ry2dmq6xwmclsclz5lxf3zquk06u5xwfl", "4131284092836527104"}, - {"evmos1k0x36tz00kpjrrs9n3fysh2wuel7zc98ajujzj", "734504270984744448"}, - {"evmos1k0xthgv2jqhksqgvwdf6dpagta749esz4r66q5", "4380175633120890880"}, - {"evmos1k0ysweczqzayv46umtwc764420vuq3e52aepqt", "6953111957998420992"}, - {"evmos1k0z5jsj83wkdv3s9m5v4e02d467hhahx0j5zjj", "2670209281832869888"}, - {"evmos1k0zltrza0g7wrur3z5ztx48lzzx5c3ljhrcsnm", "52770402088334753792"}, - {"evmos1k25fll84whq6f5akdz3k8wm3m36z56tuwm6qtv", "462575593983692032"}, - {"evmos1k25shve2auu3wms4t8rmanap78lf9d296l2gc0", "625903212627933184"}, - {"evmos1k26wwu6tsqssnx0z9gp5w6m2dex76qmkqade0y", "340323084300674560"}, - {"evmos1k294s45s59e22e4keceqq8ql557685ysfn8l7z", "4941134925621014528"}, - {"evmos1k2c9gghn6jflkksp7fmlt54e7p469ggkajeuy2", "45367361163351552"}, - {"evmos1k2ckw0lcztv8ms4mqz6vf38n8rss5e67hmss93", "1577315345665178880"}, - {"evmos1k2ddsgrswnz4gum2gcqvknyylfp5sj3jsqjv8l", "18785949917563904"}, - {"evmos1k2e5rwnhh3wat5f4uk7q89lqxuf3nxzwc6uaa6", "177424016075679744"}, - {"evmos1k2ft596ljl8urpjenk45hhvtss80d2vk9ge472", "40286252509048320"}, - {"evmos1k2guehkm44fnu5tt75afjdavdm6j3yuef0mcgd", "10977066403491393536"}, - {"evmos1k2gul7jvhngjtrad2pz5jmqfy693xlkl8k6teq", "4092400502626009088"}, - {"evmos1k2gzwueylqt8l7n7hymjeupyw73wayl6w6u34c", "10147453412001140736"}, - {"evmos1k2jme2d9yyyvlv87h47hk2gr6lawdusw6rpavt", "10514385730744393728"}, - {"evmos1k2p0fa068ekx9yh0c7few7h6uxtj2r5l9zlvp3", "1905792263489873920"}, - {"evmos1k2qnra7268ktazhd54mcu99x8rxgx0jwzr0553", "3808163451121254400"}, - {"evmos1k2qr0qq09qh84948nlgtpdwpamtyh2kj5kc0c9", "7331018035218526208"}, - {"evmos1k2rx86x9ympd8nwegn78kc47uxdycjpxszjaca", "4214789032704909312"}, - {"evmos1k2s3lqu7xsurjy6p240ddxpxylfjspw2rtaylv", "2871140382322780672"}, - {"evmos1k2sw3l7pvu56p2mzrvk72hs5q6v3ksr7z2meq9", "2372075507104071680"}, - {"evmos1k2ucjpaq564mwyzzz06ret2cckycmehfmx2hlm", "396169593066042880"}, - {"evmos1k2ues00hzgghk4l3pun8gxu0hvypq87hwzrzpl", "2122033527317714944"}, - {"evmos1k2zhv2nd9drptfxae98dm4vcmt286mxxx2tuqn", "3850249934981076992"}, - {"evmos1k306z3xevznsat9dz0wps7q5kzsgvp6u4qz6ly", "511392121820335104"}, - {"evmos1k32cwx9v6ddj727zrtg6jma7pcuj6x9wfz2xnj", "978483146857976192"}, - {"evmos1k32kehhf43j2t0h4d8uztrnnq3v7ynfq8ar83c", "2936403481894986752"}, - {"evmos1k34dqx9atgval2day3rsgl57pq2n0u6x7909zp", "1125059697658640896"}, - {"evmos1k35xenudvdjhgw8y4ychq53jxqaauf7ektgldk", "48598361861729959936"}, - {"evmos1k38dxluxp9tte4m48dftk2ngr5sq0z4l5f5t4s", "3681643756357051392"}, - {"evmos1k3fpzxn3e8vwqxl8y3km285lyheyxpr3jzmzk3", "800039877321714688"}, - {"evmos1k3nhe5au9ve4jvvcgkemju7st2w3zryx824jl3", "1320399289236406272"}, - {"evmos1k3qlvsv8gez2j9hdahj4dd5thnlm80pev7dg7w", "9082211969488474112"}, - {"evmos1k3slxaajxvtpczdqrdm0dg26pxvg6vulzungc2", "1311050634403179264"}, - {"evmos1k3sys6yk70pzj82dwsgz5ggzyt535tkcn38vnh", "2215917201779823872"}, - {"evmos1k3ztlc5g3g6cgppxhaw2mexvxsh36jlf2dt3r4", "2070605977343811584"}, - {"evmos1k40v7x9pkjjhaccf0m3y5heqxr8wwuvv0elynu", "70859713716756905984"}, - {"evmos1k46a6s9nm07896hel0ff40fs7vpkddlhd383ts", "5251711204592640000"}, - {"evmos1k49pw4mwmy0g7vhrxw56egywphgkjsv9lpuzal", "1840315065149569024"}, - {"evmos1k4a9072uy7u2z95kek9xesndyq2ewdhmlc7fs8", "784619595990003712"}, - {"evmos1k4c4lxpkhna9ktm8kc5qy59jtqv4esh2mfm63q", "100081346691391488"}, - {"evmos1k4g5z0yw2melx2u9h4kvg00smvkh8aef0dywy0", "748669868316467200"}, - {"evmos1k4ga78n5yvepjqxvz2t9a2mmeum0dt3pr57kc5", "2097662328668313088"}, - {"evmos1k4k84zthpua52pvsavfw98sa4kdztsz7nuuzjy", "2034767619062481920"}, - {"evmos1k4malj5np3nrn59p30lhprf0vhkjflcwvy2gdw", "1495244744664760576"}, - {"evmos1k4pa86n0velx6t9a6ac9y5kfztm2lmc54um8xs", "475512675828209408"}, - {"evmos1k4qxt9dtse3er7ww4d5mwtx697ce6d2e3ywye3", "27141360313535332352"}, - {"evmos1k4ttp5846u35egngvj8zrspp0q6s9felmx96cg", "1717593970593099776"}, - {"evmos1k52s3n4vk7ncqd59r943vdfcxyh84sl8s5nnde", "5028632313140193280"}, - {"evmos1k52vdfkjw2jruyk34y85ejy9dg2aj3jg3fkfga", "7626410398010867712"}, - {"evmos1k553u9p08dkp2h6sscpzn948vja322dr7p80th", "725635104632635392"}, - {"evmos1k55v2u7a67k2hgdpmfm6fl26r6j2x2vsnhsnat", "1272655038977046528"}, - {"evmos1k578khrwsgz03dslfju3vvkk9pl3katu3y2ras", "22381097075658784768"}, - {"evmos1k588v6598me90wafgjsshsxrxjjfjv4sz9er22", "90257628516493312"}, - {"evmos1k58q7l5mxh9fl8wlya0qn8gd2jcm2pwvvxqq23", "12902734733144780800"}, - {"evmos1k58vsdjqhch423wwvcjpvcf59hx8n2ye7fwy3w", "2651354301608804352"}, - {"evmos1k59c55yt5ss2yh7eedkdgwtzh94058y096knfk", "3970908185216674816"}, - {"evmos1k5gxy5pq9nznam2spnsxemxgnpp3n4dmjqztdh", "2388980655427582464"}, - {"evmos1k5h5pxljwg7y7hqvpjjzmpvfrfzv284e7xamlr", "20283707235702464512"}, - {"evmos1k5h96uuc3areuejpy62h9hvd7q3y80gyrx6xa7", "5392407754646682624"}, - {"evmos1k5lht54nv6fkfqlk3ja48nueknd0s0lph9ufsk", "6585628289590929408"}, - {"evmos1k5pvgdca8mywpssklcj5dld67m8n347kr24jn0", "28107546818973261824"}, - {"evmos1k5sv5ng885sqar4adahkdxgdxld737pc2k3vnv", "228560850056634368"}, - {"evmos1k5u2q9m6nd0kcwx2jvn5cy6fzu2kdp032tcj4t", "917063349755239424"}, - {"evmos1k5wj50ceysf687pkp6qd72xkzff9etwjs7u67v", "37518816521259520"}, - {"evmos1k60cqda5m8784ldlx257auclflck3rfj2rpj6u", "672611790665156096"}, - {"evmos1k60ttg0pk0kflyh82v76ssl2ulf0dvt39r8esr", "2879303438836416512"}, - {"evmos1k62kdn9vh7t7v93q9w7kgpd6jz6tt4vwcuyvwm", "5757836200605888512"}, - {"evmos1k63a49kuqa2c4qgyrjgqjg3lp7kc9xstzsx9sx", "8844396494623191040"}, - {"evmos1k64rsl3cau4dee3tzhaewmd0s9pdzjg6qq7j9x", "1203705208984669184"}, - {"evmos1k67tt8cje0aenxfvms7n3jqez66x5t8svjgsnu", "59311963267801088"}, - {"evmos1k6cmn20w0ltngn2vkpk6rm8rg2ydx67a5lxase", "6054385558918507520"}, - {"evmos1k6dh6674eqltxjcfnyzfrf4uw000n64yrw0djg", "13337576582199836672"}, - {"evmos1k6egrz490e75qsxx7xcnqlqdjpyxdgeswj5crw", "396768088328836096"}, - {"evmos1k6er0ssepn6xl3fsvt8v55z63quumwa80hd0k4", "32803505927933255680"}, - {"evmos1k6jp3lz0m8k7utzuvzg49pus85adau0a5gceqq", "4270507198003212800"}, - {"evmos1k6k69v8pysdv3utx3hwtpc0yru6jpukp7rx0sd", "665393569327835136"}, - {"evmos1k6m58scdggulrahz34d8xpnfzrgvf830vahgpz", "371555447675518976"}, - {"evmos1k6ps38a3k496rv2seh5klhy2mqlwevcvndccd2", "1038835959634959872"}, - {"evmos1k6tjxlgemsd5w80n4ycwq99lk5qkaxk92rcmsf", "8575676957706774528"}, - {"evmos1k73v727ju96dnhscw4csvmh6y9fmhtpspcddgp", "2107951685264032768"}, - {"evmos1k74k2hjykdq42hvtprtma6q4ryd0gg2nxrc7da", "1596584524176456960"}, - {"evmos1k75cfjmayyygu00j763vwds4pw78g84eqgfjcq", "29051478425071853568"}, - {"evmos1k75gwuh4h7q74ej5n23a9xmt5nmzuuwfsud6zm", "5184862610194382848"}, - {"evmos1k763s659g6s7v42ewjhdku47j6t7wvrw53458z", "1060897284696033280"}, - {"evmos1k77cj2u4lsh674jegpxe4jsmlgty7p5xmp0nlh", "2922483638415153152"}, - {"evmos1k7d2whttaqgljxxgrsne8cwcxvsxj9e7wv0c66", "3454203512051081216"}, - {"evmos1k7fqwn6htc099judexhjkdzl7y9pgsfq5h0lhz", "1945659839125843968"}, - {"evmos1k7g3ccuzf02u7rfjvdrxh98slrhac5cj2j9e5x", "1277035261982982144"}, - {"evmos1k7hmpvtes5zqn0hqayyqngxdsum449ssutsj7v", "691033927839338496"}, - {"evmos1k7n7da5rh2224cgljstt2pvec8y4y0lme8e6yv", "6575556741883490304"}, - {"evmos1k7ntchej54krz4xeqlyf905ewzk9hp3rtfjvt4", "13779328763908141056"}, - {"evmos1k7q03c3uxd3lmgy7usw9lmdly2l5t8nnsphqpl", "1168683995758020608"}, - {"evmos1k7q6a0w3x0s5eehgh4q8dn9dqcp4mljk8mdu5p", "1824886101186957312"}, - {"evmos1k7s28vjtg9gk2cpdehwln750mwq7shq52yr9q7", "4865894737063559168"}, - {"evmos1k7t2g4qs73q6xtasn2yl3phclvyzlpy3lk9ue2", "6626460186465228800"}, - {"evmos1k7t30v6l49xkmg6mf7r2d33us63p46qy9nl72d", "8142011699875782656"}, - {"evmos1k7yjlsdar78hw5k03seqvtzgx5xywl9l0kyw6p", "442940150815490048"}, - {"evmos1k80uqp04l8sw5qd7ej7tpyanef3a6c53h09c95", "1460781549764536576"}, - {"evmos1k830a3httuz6q3ttd5tmnff2mv5g5lzjmznnd2", "7858696764009517056"}, - {"evmos1k83z9q0phj9ts0dpevfcuf9vkqzttfx2rw2a2y", "20382450076713488384"}, - {"evmos1k898dv4tezmmvxslhm2xvhjaz5afsm0lv30tfd", "2604720847181414400"}, - {"evmos1k89tmfrl2cs46tv6n009kd6l4ury84938kupvj", "20214802117897482240"}, - {"evmos1k89u4pgwycu389x7y22kyq4rk2deg7m22t4fn4", "70815183105759232"}, - {"evmos1k8a2w4ktjctxleqqhr3q6342zrdj4sdu84fgsc", "99095386598842368"}, - {"evmos1k8a93cnna0ljt52tq25hnea0gehlus7q57k64g", "878174843029495808"}, - {"evmos1k8dst4hqvz2sq30rja34u2f3q7zmx60cr8u8t8", "384244658518974208"}, - {"evmos1k8eylrm7gjku978l4c86scjmgrf7nnfakvyqv7", "5007020351040454656"}, - {"evmos1k8gt6al4wj87fa44k8l768vsdquyk2fed0dp8y", "1799625838145331200"}, - {"evmos1k8lx207escvyzxr632dd42dendhtnphkvu65sj", "230189657943059200"}, - {"evmos1k8mcxzf6chg7k88kr9mvc5ss0n646wg9ap39nz", "3730937556599603200"}, - {"evmos1k8qsshyqqz9v7ewe23g8qhmnkfhcpcv3h907fw", "6521432809888448512"}, - {"evmos1k8se9cx9xsfwa28296pugaeu26p0v90w36djaz", "1589719338377997056"}, - {"evmos1k8twmjkmvu9shtr9z4azqs50dc0tlxnqhxhl45", "997467961641528704"}, - {"evmos1k8wsshvh473vx0msckxhgzcvtm05xqsqu4yhxp", "830116561712010752"}, - {"evmos1k8xvf253cs9mscdhr4ehz6q28zpj5c2vw43wtu", "1876474147482378240"}, - {"evmos1k8z9f9skqunfmvmmxm4nwjccdauawlds3c9rpd", "3047826695401807872"}, - {"evmos1k92sv8d66lszlupftq2p9yrk3p85mcf7725erc", "15642843399135662080"}, - {"evmos1k93qcp28w3x7m5c0gz5x8syar9j9xtuv9ykznw", "12851554784884936704"}, - {"evmos1k96gdfl2m53avdmuf7d9ajdus5tn7rxxnmeqjz", "533715447582669312"}, - {"evmos1k96gl40wmvf45j6r7n8ft377d98ud7za8ffckz", "6060586432752812032"}, - {"evmos1k98x5mxttrenzx3cl2dl3qvay30g3l5mw7skeh", "659967899821673984"}, - {"evmos1k9awv55s2563tlsfmpce20v95gcna6gacukrpg", "987373405590605824"}, - {"evmos1k9c67w066anhz78hy820kg2z3fl8tdec6pmjql", "1328286816730981888"}, - {"evmos1k9cm4xka2gyhz0hglxt7ddnwrneq9srefdu3z5", "40647764701074432"}, - {"evmos1k9ead2dvu43a3lg0mx5rg05aggg05k0rgcjjsv", "1186835672578451968"}, - {"evmos1k9eu4p7p8cr52ue3n5mtyay5d0hczvz4mjfsd5", "5142027077882944512"}, - {"evmos1k9fr6rsm04zk02e8unfxc9nks3t2j06t4kr0j8", "5807562018339603456"}, - {"evmos1k9rxwlnmnxsc2nfxhaw75vnjnyxhee7rxetmqw", "1789432190795860992"}, - {"evmos1k9tcnraqte46spnysln4qjzsfjcv45emqmdt8l", "469007811905837568"}, - {"evmos1k9tm5v8rge7ahjzy798s9d96ws0364ylh8twc2", "29460542468882432"}, - {"evmos1k9uy6f45fa0xh39rsm3u9zfcg6fh7va8x8qwaw", "433131275466026240"}, - {"evmos1k9w3vu7js6j02g9vhe482s04n6mdcz28dwe08g", "458174474890694144"}, - {"evmos1k9wc4tp9hsku5ngk9aq5mqd9fwnkmnendldd38", "1876861212999025664"}, - {"evmos1ka297la7gzt4ructmaajtzm7drz9paq95fra86", "4349145970962325504"}, - {"evmos1ka2fp2c7kmtgfd0cjg6c9u6c9cp8cxj0z4sms4", "66855217053177344"}, - {"evmos1ka7hrl7x0fcnn7pn2733kdmppjfj225pcm2qsy", "6829291992715567104"}, - {"evmos1ka94xwzjwpfcqlrr8k3r38f5y8l49dawvcjxwx", "5513448228176166912"}, - {"evmos1kadk3h6kpylhhgpehkmk0vtv87lzvpp5zvzrmr", "2821841916629073920"}, - {"evmos1kae8shy9k49kn7fwc9gn274y0ace6aegws8t0l", "367146471257815552"}, - {"evmos1kah9ql5re9utlwkmma8j6394tagqjgw725565x", "1588310567116127232"}, - {"evmos1kakmvm5hydnazua2cmq6pn5m3hhffxcv77dfsv", "11813789560769781760"}, - {"evmos1kale287pk2uaz353chm4qtscu2spuyygh3m3gw", "11748765128261605376"}, - {"evmos1kaquvt058d4p60hzz2vjhpy348j0ceq6nskmwd", "2844391100616740864"}, - {"evmos1kaud5d4m8mla68zr8nzwt4hp5f0hdkunpkldf0", "1048166335195015680"}, - {"evmos1kaueyac0ade94mxaqfhh9zewe9w8892t700w9e", "2963064191891582976"}, - {"evmos1kavnn2qscdh4la3ylegryqhz7an8udqthj04t5", "3285045358004660224"}, - {"evmos1kax02cm4y8yux6q4jlrap8tk60p0pjz0cwvkax", "43428267584477855744"}, - {"evmos1kax0rmzm2yrfucz55av08ukr3prupaxfyyr8sa", "4092705534386534912"}, - {"evmos1kc3ft26u8frq28ftvwcyvur74lxfg7taj7td4c", "736748463874300416"}, - {"evmos1kcamgkew7c2vuzracqwfsqfasl7h27ykr4p7w0", "4109321366864687104"}, - {"evmos1kcchdf53my0wecckayeffxh3u940pfu8nkqgek", "29130927463564001280"}, - {"evmos1kcdgda6ens9qws9v3dhwmyrn0ap93whnhxvcsx", "1046566449343778816"}, - {"evmos1kcdyetfxm76sauyvjhfnhuxn2z7n2dnelq9n47", "318864459403776"}, - {"evmos1kcfkdfknx58pnch0xfzvcsu0m49g034zpnvz7u", "428099543562102272"}, - {"evmos1kch2qxwranmy0ssm85u57deugzy78exk904zmp", "6543895014600884224"}, - {"evmos1kcjsrzfjujvg7ee4e45z5yx9spzjyax54r66mc", "9180728502226894848"}, - {"evmos1kck86uh58urldq857lz35mns0um2lutw4f2z4e", "835256485864161280"}, - {"evmos1kcmyc9madjn78842y6rw2kxk8e0rj35j5dazdx", "320128646015360256"}, - {"evmos1kcn4ngajz4rt8lsw2px5ygrcn8n69p23cgjv9q", "1391884936883293184"}, - {"evmos1kcnvwqsarjmhx0hd0atwvec29skxar50wz5erh", "474937755558459904"}, - {"evmos1kcpnej3v2a0270tfwt3nc77e2lnl59hxhx7x4a", "1442211039745391360"}, - {"evmos1kcqf4m6aja3gfxkms07xramsavew3c9hnf8pf6", "2547271293855940608"}, - {"evmos1kcw3rwsl76hsc9wa2jl3c242a6g2r3w9pd64ue", "27144526515719442432"}, - {"evmos1kcxe7rtp3le4zjumeym3y5gkqdsg07685drmpp", "3095026345981626880"}, - {"evmos1kczhwuver6us2spds42g6del8qtr7ef4m0e303", "3327045778235846144"}, - {"evmos1kcztay24sy8yh2fcecr03e256t4ngw87nt9pda", "88661059788232835072"}, - {"evmos1kd023clnzartu5ww36vp4jpqy5gqtedp0sul00", "1173141739973969920"}, - {"evmos1kd0vzudlx2tjmnfh3k5gljvdqdq9xcgch2h3zm", "5493928183884800"}, - {"evmos1kd2nnghed7l7yufj5kvw8daewlw6ane2ux4m3z", "20591649234406404096"}, - {"evmos1kd3gr58dmecwgpktr2v42jjjtz0snxceek563u", "727363839591522304"}, - {"evmos1kd5405uth67jfnqj50vnrtk38jljk7uju8zgtd", "39957757245826605056"}, - {"evmos1kd62eg4wqh098vy7mwesmg6ty4kfh7a2sp5r2l", "183208940397334528"}, - {"evmos1kd66zxk4m33hv66vep3vsr7f0lhef3zn04mrx4", "387381411118765568"}, - {"evmos1kd6cpfn096t8uvf0pveatvseyarfrz2lccdgkj", "514654895286644113408"}, - {"evmos1kd7tceh48u0ttrwjapxnvhahnw8zz4353ah8q3", "14122593195037128704"}, - {"evmos1kd8wxedk8vchmgvth7clxzk064wwhkw7zvel7g", "12215817102505316352"}, - {"evmos1kde43ufmkrha64a7823ec286g6l2s25fngc5p2", "830064726567395328"}, - {"evmos1kdkxw03udx95t49nm2dytldp6u0py7ktrky0d4", "3790351817573482496"}, - {"evmos1kdp73e0g7u2490snccc4ls2mllquaxtfn9efa9", "3768151134463508480"}, - {"evmos1kdre4s32kyaf6dvur2s0mahhu0fe5gruypz0uu", "2791240632306401280"}, - {"evmos1kdsdz7j0j4c3hsfqdsgeztzr9yzumlqnl028k4", "100393286142302208"}, - {"evmos1kdu5m6t0kg8ke0w36xpuqkxek8q22hrfyjy08j", "555629355474966784"}, - {"evmos1kdw7x47wlgndzpdk4prasuaqd05ga5x4v5z3ux", "791608035592380416"}, - {"evmos1kdxt8mpnya2uzjyslprznncq4xrc6p0hp6s9mn", "1084064620575897600"}, - {"evmos1kdzxq6u6mgpqx35phk9dmkvyuwj3gddyts2kxq", "276426223595540480"}, - {"evmos1ke3k2fkqqknufyanvzapg955l8jfxxpw3lcz20", "105696341548282624"}, - {"evmos1ke56x9w02ku90nnkxmxy88zghdfagrmc8qttqq", "475476297096306688"}, - {"evmos1ke6wluq7j88ww4m6sllcpxyavh247dfz4yhl2j", "184911370283486976"}, - {"evmos1kej5vv25a5m5cvrp3dnmmnd4f8e2raskd9yd9t", "1703264637018267392"}, - {"evmos1ken5wfq7g8c0gntu6tvuurggl6am00cw0k0sx8", "5890382914175942656"}, - {"evmos1kenvdgknmzwqz2cn9ywu4r5mdyxmr90pg83qnw", "16109612400332388352"}, - {"evmos1keqgmx268x0r6u6znt0fydntpjtc7tw7fu2u52", "644039661830307840"}, - {"evmos1kesa0ldef67tw9s48vsc9vqxvq7f539xe450ha", "104787462174939185152"}, - {"evmos1kev7vcdemken2cp8uyz3cjxvzfwjw2gwxml0xz", "3193893456814614528"}, - {"evmos1kezz79sh98mdukvxhmq5kyrasje3zs8meg9xyu", "3091286959349655552"}, - {"evmos1kf06naqpwetjqa8hfcarllhqk9caayd8e9p8lh", "4486229251572733952"}, - {"evmos1kf0p0nqhh7hn520nssfuvf0zvlsauv6fg8wf38", "2327995526375549440"}, - {"evmos1kf23l60tas2uu39m9eeu5rd2tp0tadqwysgmzs", "1753169254938210304"}, - {"evmos1kf2aqfdx58dyukns07zsrkkpfzstuwpv43h7wy", "1471500323747300864"}, - {"evmos1kf2vamnnfuanxuhmgv6e99x9gwg6vmew8yryeu", "1140750132164369920"}, - {"evmos1kf37ja28kwldex4ry9xqh3yutxza7fkjxrh2yu", "339227557224708096"}, - {"evmos1kf3tpxnf30u07cgysfy7m9dt5pwr38jf6jdpzw", "4872169662317936640"}, - {"evmos1kf5sjzryfl9ayap9dva5nzlx0a7e3ndsvqwrsf", "1343185203355141120"}, - {"evmos1kfa6k5qf7ac8xwwp48jwmzj3qq7mlferfz5ju2", "2756083539050157056"}, - {"evmos1kfdrus0a942577e3gyuqyus9ha2ckpya5ul9ef", "469445273624302848"}, - {"evmos1kfe4nkxhp5qdfk4hq5wr7j7amemjm8xpynxu49", "9818413620546580480"}, - {"evmos1kfg002s4yxqwkhds9tj8v3rmyumn5xruxqsu5w", "1743862451114041344"}, - {"evmos1kfgzf3pp6nuta0jx357ux5lq0p5vnxgpngrnhm", "2199300609298092032"}, - {"evmos1kfqmw5upzfr2g9rp7uymvq52k832x5zh4c788s", "945308575960854528"}, - {"evmos1kfrj3c4qwazg7jgy44t3vr82hy5nq0sq6m5pec", "351576962971337472"}, - {"evmos1kfvpgzv83mfksj9uk6a4hqffl3p6spfg8m5xkp", "1227544012749533696"}, - {"evmos1kfz6608jq8a7lslk59sqcg4kruvg364v58565d", "235764545969681268736"}, - {"evmos1kg36udyev77ufvxqzqc8es5g5934p8mzyqt6t9", "7848872921448572928"}, - {"evmos1kg43rpa74n768l32g9xshjm9ctpdxqfwjm5d75", "30033110299422773248"}, - {"evmos1kg4nj5zlau6nzl757kkx3jwurfgjl4se6vgrfx", "7550166931998932992"}, - {"evmos1kg4zvfppegm87p7cna2a63tlhz3secut9ve798", "3213523687635632640"}, - {"evmos1kg5elfmkhg45ckmkq4uy94frflzgw2snnmfd8w", "1482182106718363648"}, - {"evmos1kg5kva395w0hcrxwcjjf6lfyskseahtghxgr7h", "5919090181271819264"}, - {"evmos1kg76rau4hv30ep2hhksd4maxr8jcqy5gdcn3rj", "9346296488406171648"}, - {"evmos1kga8tdfhl9djtx4vagc24rulse8lv23uj5qm5j", "36529932738399272960"}, - {"evmos1kgc7ldhxll0h4f02wc5q7p6clxmq8j5m53d2ws", "826644763424450560"}, - {"evmos1kgej6we2va60dlmv0uuhtpm8l7dd2q6r249zxh", "27878441928063037440"}, - {"evmos1kgekfjjhg5xk29sa8e5uek7cldstdukw0uxxe0", "7814503881743237120"}, - {"evmos1kgfucqvy0rc2vzlm8z4q9ana0px5n47vf9s8l7", "750344102505716224"}, - {"evmos1kgg7m2jlfmfa0c3jkhyma85pugwdkreav5m6k5", "4115803382210419712"}, - {"evmos1kggwsqu5khr9amu29nu5qa7f0cfh05leusugzu", "900816853935335040"}, - {"evmos1kgh4n869pvjxspzupwyleegawcz2v43k7khj66", "763563687910834176"}, - {"evmos1kgnz08qkpkte98qkqp6vpkel58ycq2ty3ugwjf", "550296125787067392"}, - {"evmos1kgqk8pay654advsfahnpcks0uucw74jycu88m5", "1916689867515510784"}, - {"evmos1kgsgm5geaz96yzy7m0gwr7mh0uk4guf94tgnqj", "413465131753097984"}, - {"evmos1kgsu4kckjhseuw59a8tl40jd83a4em2a4rtrjq", "256873646253622784"}, - {"evmos1kgtdc4fytnj8mpz06m5ysh2ns2lm3mrndd0glz", "2689568183079395328"}, - {"evmos1kgtxr0256uscx36zrrf06tum7u7geht6f7tqfd", "4295340933426784256"}, - {"evmos1kgwfz6ac6mxyw793xnxuelzzcecl8zuzw9mw50", "2687580740907548672"}, - {"evmos1kgx9q8mmzf2rdepd3lwhkt36faa3kwpelh0xd6", "165904497632585728"}, - {"evmos1kgyexmwdcvlaxjaza6gzghdpq5mpwxl5s244ew", "541195442947159040"}, - {"evmos1kgypmdfdkncl8pplaqfvfnl24ec6f9u803zszh", "126836735072910336"}, - {"evmos1kgz7wtf2avytzh4nv6jzy3pych59yykt6a74v8", "536768796203805440"}, - {"evmos1kgzrc4pmkc8m02njvhxu5dv6xhztcz06uudlkc", "630912964859707392"}, - {"evmos1kh0c66jcpfuyg05j66rfdzehqx37nur8k9704h", "250171270467225600"}, - {"evmos1kh0c75vva2rgaf6zydqd2h20x6hdykpkaux6hk", "13013652338600910848"}, - {"evmos1kh0fdveruvhcdtwd3vvqg724gfvpzqa4teek4l", "1353746849662801152"}, - {"evmos1kh2n6yvkugaz6zqefgw8eyv6k8lfwrpquxwe6v", "4287360827090026496"}, - {"evmos1kh3j2cmuq2u3qh2x7xckhchw57evc23hh7lxpa", "1502479241960617984"}, - {"evmos1kh43ehdrfedyp04laqua4ejl8dpgyaepqy9588", "56827842127534809088"}, - {"evmos1kh4clunt3hmzvhngu33ka0tqpjpg866s8ek93k", "40674073062805438464"}, - {"evmos1kh4s0kavnaue2qknugctpmz0llht22pwnp6lmd", "695522155452420096"}, - {"evmos1kh7taacywmdgr2hzxml4gczfkjdfxn93tj029x", "369417631597378048"}, - {"evmos1kh93xurcw76890lwrjpwszln809u9ywzu08ur6", "167478206369938432"}, - {"evmos1khcdnswfj03lfjxeszj3n4mcszg4y97cdmqzsh", "8670998084755906560"}, - {"evmos1khd80zv920p27jsqpck5f9s2uxxtmu92r5zzd5", "1183416929962552832"}, - {"evmos1khhg5dq6ngyjmfrwed50fs700wzjagq8nxpuqf", "4101957027792468992"}, - {"evmos1khhnregra89v2q4h0a0tl3tcrgytrj84myjj8l", "462254167487819520"}, - {"evmos1khmvhy8l30c7pymsmxdckwrr5nc2szndevuhpa", "3880107200581267456"}, - {"evmos1khucsw5nrreu00zs5s97ynuhtzzluya96xcdyj", "2177679038113017856"}, - {"evmos1khugsv0zamhvdf45z8aqwx5zqgr3zerj6ejzwj", "1728688680742998016"}, - {"evmos1khx98037tpkw07zsxsuc5cp36vhcegvq9p53fv", "378144963380279552"}, - {"evmos1khxtgmtwerd8nw9vap57ktj7nhzfstmk8hlvtd", "1438476843695939584"}, - {"evmos1khy7w6t7hqks60xz08k825xusuk8rekek6lr53", "3379578727725726720"}, - {"evmos1kj0af7wsmt9qrc436vv04qz6zk5y9qtyc0qp5c", "2216869408740661248"}, - {"evmos1kj2r5s7rhuvmcue7xm672frhafrm8q0uu0m7tf", "49974009026909880320"}, - {"evmos1kj36u58l2tkkl3dg0mzlkwq69t82rffstckj2z", "685288847944679680"}, - {"evmos1kj39jxveswctncaswhm3hl2n4at9ed2pmvz2a5", "262851336681710592"}, - {"evmos1kj3jk9q4ch808f49332fvjhdhag0973p539y6r", "6793227803868249088"}, - {"evmos1kj42fzc4jqzau8294yn34t9ayelavxlrtj8kkl", "862089863081086976"}, - {"evmos1kj49frffucclxsmrtcw6u94klrmud4kxxu97m3", "11297253927898144768"}, - {"evmos1kj5nnyxrhpvtupa7keenwvs0ytqg8ndqpevp0t", "4968704429625271296"}, - {"evmos1kj8e6sl32cudgd4ysrkf5md2pg8vhzr5tmkj0q", "411075512933687552"}, - {"evmos1kjan5ymq4eju5aeu8464e3fl9x8wtkdvff7rx4", "772383910516931584"}, - {"evmos1kjc335zqr09prsd3kryjhqt45u734dsxc823hx", "386506755060020736"}, - {"evmos1kjdtrppgr4c3kmna76ce94nqhswa92ctex4px7", "253391980630851584"}, - {"evmos1kjhk9zz8cwqz3uylu6hdl8vpywrm5xey5wp8qv", "11498055877265989632"}, - {"evmos1kjkpgznyyyt8nc5pmehwlcc0r2n3ka843c3qa4", "1597807382964616192"}, - {"evmos1kjnektjxgrcwvv0caenjs4qa648f84pgxvdes6", "3940018951530133504"}, - {"evmos1kjp8ve7at9uvkt9tyg637nps4a4903nrsj9taq", "2019677797334838784"}, - {"evmos1kjpy9p70xcezlzn39ryf5ferds3wzf0ljaqn2q", "107075420324203264"}, - {"evmos1kjqxpncd9g39t9ltr5rgr0e9aqt473v5qg4ecy", "1427749609222727680"}, - {"evmos1kjrxmzmlwwty6lwa0d7nhgjm2w44n0sykceva8", "384500541973383936"}, - {"evmos1kjtuqjjkrjc0hcrul8d2egahltuerkmue6nac6", "3970223093316022272"}, - {"evmos1kjw4en9yd0jxk7qzh3dq9awq3z5yydudjcj8fp", "8746624314547568640"}, - {"evmos1kjya8fjgxh030c0ze86k88peje9mafey4j0dum", "656084447535259648"}, - {"evmos1kjysjycfanv47lsfr6uca69p0tgxdq3pyf9g7x", "6789468097111523328"}, - {"evmos1kk0yv7za2w3q98uc2fmsg88vc0ztjpdlzg24cr", "12088694552609054720"}, - {"evmos1kk2hv49ea0575cxgsfmny09fdrcr27cjqph3ym", "13609676578439725056"}, - {"evmos1kk2ravl8n6hkjcmtz3u208v30y5ylln88nyw4a", "5126295777737211904"}, - {"evmos1kk3aad92m3qaqpxcjg7zgsht4hd2pz7spqlvee", "1408637391039203328"}, - {"evmos1kk43cfrn7kmcghwsgr5ylhqespsxq038747a53", "1126135299559854080"}, - {"evmos1kk5tz062wwvwt9u4kanv829uucw2qc3qqsxhwl", "9821599162020691968"}, - {"evmos1kk6pck6t747yl0j0kcutzyrwqzujzzmehw8vl8", "883575216670546944"}, - {"evmos1kk9sac9xdr7epll5q6xtzvtw5u3a0qnk8mvgna", "461546336895391232"}, - {"evmos1kkjedrg049yycxh3cctmejzlln3nslhplscx0u", "210532878713541120"}, - {"evmos1kkjyme6w8asuv9jp40l9krd0yg2p0cgf94fhdm", "187054198543978496"}, - {"evmos1kkkuqd9z869wzmlkl2879us3c3397ahprpum2y", "3203336865531782656"}, - {"evmos1kkm83np8rz6z0dw4wu99afruy6up58nek9wxgu", "249887402888265728"}, - {"evmos1kkmpf5d5peyq3x3vlmmmmzz6j2an3sqx27ae3e", "23194116749372600320"}, - {"evmos1kkndrvceyuerjawa5h0v3szs8mzkysw34vf2ne", "385842752079491584"}, - {"evmos1kkp726yvns84x928s74r68r7na63kz70a3806x", "1005702117324995072"}, - {"evmos1kkprcwcpk09tyssxcm4s4cd6u0ln8jnev3pnsd", "6319498271407077376"}, - {"evmos1kkqmgcdug2rc9w9kuqxlalnlz7cxyzn7x49up6", "1601446042011553792"}, - {"evmos1kkqvppk69nx6n6wayx63w6r9cvju5q2t0nw0fg", "99662783286622093312"}, - {"evmos1kks5mc86lh3uq5gce5hkxnns4xnhz944gcyu9r", "367152460654343936"}, - {"evmos1kkuasv5d0tncpm659vx3cc0fc85tfwc8w79tpc", "829929550802589184"}, - {"evmos1kky4060429eptlc4eft74syrnrseaeaejkvajq", "4528785036498667520"}, - {"evmos1kkys5ywnvsuyeuujq2ulzg0nh6cas8yfmpz76d", "36430917340409946112"}, - {"evmos1kkzz0ns5zyzwfxdyhkl4z82jr59hvhu0qfxd6r", "353034654873013248"}, - {"evmos1kl0pfrgrpdx48d0g8z4dqmdg8k62ey8zu4gqkx", "8248296248388173824"}, - {"evmos1kl3z0j5u7ylm47tur3r0elhlk53gegkz2em6h0", "72614819655045775360"}, - {"evmos1kl4x3pzklrggrrf7k6smqkanv4fqwrgkpc6hlq", "3264097773644849152"}, - {"evmos1kl8f77g56z6200jfmr86qaq2nk6zwc8pzxdp66", "3899889117419336704"}, - {"evmos1kl8fhwxv4mr6sax2ezsppcjw5zcad6wlugf67q", "1496422326383186176"}, - {"evmos1klc39ghl0xzw7j2ws7e98yze6a74qreh0dzcul", "460926470395274240"}, - {"evmos1klf67krzp30vzhlvme8la74a8se0vp57ychs9y", "15232753900343013376"}, - {"evmos1kll8tqlws32dzrn9n7aaudwku2gjedwzw59ha7", "7016113433235439616"}, - {"evmos1kllzum5xgqa4p99fxxqr674wa69umfgg56wv3f", "18457182112694362112"}, - {"evmos1klmczp5n2crayqp6extcjnyzwytna0ltyf7fch", "35308541197621927936"}, - {"evmos1klr6zrak2c7hy82afetuegjxg85rfcyc73gqys", "1424089581268500480"}, - {"evmos1klu64ju8ltv8r0c935ctedcwewj6fyv46yau5c", "16352868026150453248"}, - {"evmos1klvdmm8wgj5lp4gndqcv2rkh89lmg9s5y7y4nt", "13347614818999162880"}, - {"evmos1klxefgsax9sa2lesz45s0r9kwc76t64e3rpemy", "15590446857995059200"}, - {"evmos1km28t2jt4mpq2hrx5yj46kaeasu55wds52sn7x", "2104298599346569216"}, - {"evmos1km354z5nqvdzfsnyhevapwkqp09wlyz3zewe2h", "7596344322452816896"}, - {"evmos1km63dqfzpet30f8yman3954yj32mvh603vpkac", "45230105292166455296"}, - {"evmos1km64gf08h6huffp3jcqzd23a2cdxlwzcau2msn", "2517886194954883072"}, - {"evmos1kmc9lu8rrsusflhgndv5ucgjxmzzw0793hlsh6", "1164699525744083456"}, - {"evmos1kmcllksctup5ks6kp339gnk70y3cuunxdv6vvq", "1073345677571558912"}, - {"evmos1kmg5sud3k0je0uxx4nqhl45sq2lhs45pfchz7k", "1729101693559943168"}, - {"evmos1kmh5xqq22468cl9qr4q60g2laattvcfg4d7acc", "85431917453406011392"}, - {"evmos1kmjmhu9wrq4xvfs9alpjr9fgs25qcq6fmlqqnf", "32708257513067581440"}, - {"evmos1kmme29p0f40selzfvxj7qdxe6arrycknrcru3m", "4709465524815912960"}, - {"evmos1kmmhtmdyy2xh6s7602n2ynytw42kp3auh4gd7c", "1427523134683807744"}, - {"evmos1kmnrzryxs7rcrrezwpw8clapexzlxzygcr3hre", "19255324756040925184"}, - {"evmos1kms26vsymfx5yt8pege6qq57wezjwuksly2gxk", "976844317785063424"}, - {"evmos1kmse2x63x5e4ujadm5x44ta4fl6zdua0wy2lnp", "1381313900086254592"}, - {"evmos1kmwcjcc27p6hwu7v888gr7snu0gd8zzev989eq", "18889066765185982464"}, - {"evmos1kmwdj7x0er6ukdvfwyuc7qk8gxvex0ww5c6ryd", "2083997486052048896"}, - {"evmos1kmwdnwq3f3xzxr3xup2a9et5fke26fn5n2zlmg", "17664174533410191360"}, - {"evmos1kmwkw2z25hfcegtr0dk7n3uhyj9wl2duun84ju", "1278985060046884864"}, - {"evmos1kmwlc80p9psdctk8tlvcqdh7mv6zydfwz03ggc", "104764110220271104"}, - {"evmos1kmxt3kka6tpgpmucy7dasl65zglehmx6awv4la", "840473908119914496"}, - {"evmos1kmyc2k7qm5fv3ss8xxv3j686zh7k3njn0hgyqw", "3051107218992669696"}, - {"evmos1kn2syds683hcy0htn2v67z0pzquzyphwcgqsy8", "698742564050548736"}, - {"evmos1kn39mx84pnd0qm29axms2new3h6zjl495rj69u", "343393982937276672"}, - {"evmos1kn4l8q88mgw4n9auv2cftjdep2z25lct075dx3", "255794595524655104"}, - {"evmos1kn8jagqzp5kqtj8yp0dfc3eetsv2wl0nu0krvv", "233529004413607936"}, - {"evmos1knk3esjyx5rkyp3p24puvntghgyqa3c0hdw3az", "3397940674510116864"}, - {"evmos1knmnyya28zvswkmn92jgkg8t6fnj02dghrmgku", "33076662696364728320"}, - {"evmos1knmyy3gac3t8uhl8cgs9rcg6n8w29ldkrt794k", "69195832916337213440"}, - {"evmos1knsw4pg4fpnx2c4tynxez6r5acltddmpueswtq", "3204930372501549056"}, - {"evmos1kny4xxnquffvsuw4ry3me8c48uwnw89gcwa29l", "2794836950603896832"}, - {"evmos1kp6gmczz3l2lym4gmpcwpjftx5sqvyd6tyfnfp", "2234949709560370176"}, - {"evmos1kp7cskqwamskthewl0ccqxqqcp7s6jp6gzynnf", "5294092878551294976"}, - {"evmos1kp7mdvgfzkrqmtd28ldxt38qhf5x6aa32fpakt", "2535653964809306112"}, - {"evmos1kp7vxma86907fm4epccp7gqvjw60feejck4way", "445768295460759552"}, - {"evmos1kp93e3q9w58qv8z0ukhgt6djm2805x4knqj2ly", "407542715911441920"}, - {"evmos1kpeq5sxkxdwlptysl70yka2jza3jefuvgwkz2k", "2086431951687156736"}, - {"evmos1kpges843sa2hkf02mpf4h6ufq2s3x64kpxczy8", "8675846105657919488"}, - {"evmos1kphwyrp4jhtzc2q9rr8wtxke8w5sjad3xrapcq", "1504126353133152256"}, - {"evmos1kpl0nlcw48k0lg4lnm2jgk4ackmr4xrf7jae8c", "24452107452813991936"}, - {"evmos1kplzv8wjq6xw00rr96knf97lz6d6wwm56emft5", "36950857217500291072"}, - {"evmos1kpn9s8mlazd68spyzg7t3xyuxzy3e68nugxs37", "6010053051651371008"}, - {"evmos1kpnhxjf266djxytqy2e9lu8a47jcku8vqx5zwv", "5837518037936843776"}, - {"evmos1kpp26fxsn8xyq0ln379pnf9h59cvgmvz073y68", "156284706505888768"}, - {"evmos1kpr6tk5cgrnjfk3pdfce3hu4vkst3ua78vwlss", "3664432564626031104"}, - {"evmos1kprc4368xexj9hs706ps9pk6f9rk2x8m3hjuld", "26236643255192735744"}, - {"evmos1kps8u2700he26xrh29nvnvhy9t5z5wam7hx9lq", "17638405998454554624"}, - {"evmos1kpurp7wjpexaxy4ty7s0xxg7vdsmznml7c94wx", "6449911328483988480"}, - {"evmos1kpxue43kuqhnzqhwn76v43p43hzczn9jtr6002", "968526445644270080"}, - {"evmos1kq5c573ry5wq8sqx4sd985stlnqu9hcxtxvh9p", "2421656431364982784"}, - {"evmos1kq5xq7t4kqfdalfd3a9m672vceuak0j3h9g0al", "9209394698408726528"}, - {"evmos1kq7k2ytsemhr2u56lauj6530m9fvl9xq0e3qs7", "42820605557397078016"}, - {"evmos1kq8ft8mxt0xntq7lzgmed2qfgv0vprny7gv2ft", "6392878087385366528"}, - {"evmos1kq9gvpyud3s5p4rt4jj5pl490lvf5vwes5m8ty", "90691474528316928"}, - {"evmos1kqax0vd2zaef2ssdaauzss3rdrfvtzjt0pkney", "24709796279355809792"}, - {"evmos1kqfhd37dxkw867rsaqjkl0uc0w88vccz97uv89", "286267789635346944"}, - {"evmos1kqgpmqgrpq2k9aw379wxdx7fmn8m5sepna58en", "1032435693030311936"}, - {"evmos1kqhenr8zlw4lsmgux39gjy7z8e5vh9fyvk25va", "2371107437900956672"}, - {"evmos1kqk2m5s5sw0clzfxen2f6ydqgg8c4cu32khaqr", "78637131679550976"}, - {"evmos1kqkuvw6wyd8p40pkatvgmass6el5jgxa2z6v7k", "93793263633412292608"}, - {"evmos1kqlxe02p8wvx7raezyvkzerkf7g6ed9hp6jj6k", "3714828779296964608"}, - {"evmos1kqnfj6u89yc5074mlq8p2wmms3ye99y9vwyudz", "909920463183096832"}, - {"evmos1kqsvwrztn90v470zhauy5wzcya05f0gwzkjmy8", "2453231351230466048"}, - {"evmos1kqujsuyq4lvdfc2nwywh2f6l5mz8gnwjhur4cg", "7852568058764242944"}, - {"evmos1kqv29klrj9jzhemmp5996fzz49hc5sjktck8p2", "7402394118666125312"}, - {"evmos1kqxd3rsn09fa2gmzpvhw95n2es9dmm7f2mamau", "1855883131486700544"}, - {"evmos1kqzuzltnnewwa3tkneenjzk8z3nj6a2sp9yrf7", "286865782475689984"}, - {"evmos1kr00s9u6k2ndmhftkh3qq5el2ajumxrc8a3cxv", "234975869184093184"}, - {"evmos1kr22vx43fek88huwc37972uuqwtqt0v8vmvedg", "2329609811618553856"}, - {"evmos1kr3wrmd7gq572k7jzluzwfzzqq3mjrx5d6qntn", "473431261760525312"}, - {"evmos1kr65czym2tmz7qh4azma3jq9w6sjf5p765y740", "2733056420879024128"}, - {"evmos1kr6jlvs8wkrqzqa674ck7g5l7s4aw0dgzp23lq", "30512638896841101312"}, - {"evmos1kr8myek98afl3qvm9myxqfgmp27rrvcclr4hdl", "40733710192702521344"}, - {"evmos1kr8n55952z9tf03cweul74c6swwkq80t4ffqh3", "84841806892859064320"}, - {"evmos1krcwwcmchrhn2759fda34z70f6rynauq30htmu", "1006077675816104960"}, - {"evmos1krdpzvtj578kh5gt0fp2xm7nj9f833smrzgxda", "865126899843368960"}, - {"evmos1krdtq5hg8uwgnk9xetl6s69xt0lr93t0gcnjd8", "478570343868879104"}, - {"evmos1krfq3qucpcuhhlr3mp59czm97u9neuzvrmwwsh", "3608467626097502208"}, - {"evmos1krjw0e20lyq03h925264jga7gr7ppjv37upghn", "142182704537968640"}, - {"evmos1krlhkttkhksk2d4unhchdafu2msf5x7rzmhy78", "1281562193644474112"}, - {"evmos1krnhm2rg9yms572f92yt35vxmsvs9k6kkmcjez", "527929372171227392"}, - {"evmos1krpwt9eadh6gaxz90nhelv9snuy4nhk4l9uk4n", "2439314705111737856"}, - {"evmos1krqz5pldqqwrddkphukzekf2tk50uc4a6ruyly", "51421413668654727168"}, - {"evmos1krv6guh8a90wcp0c744cpjnjgjtfzvf3gz70dr", "2750013761231831040"}, - {"evmos1krwd7f7urukx353rzfqv9zz5y4js66celzr8q5", "933939356155169792"}, - {"evmos1krzyhaxc4a280tgwrmm458u9afhmua8ejwtzjx", "494705195700493312"}, - {"evmos1ks275xa0ukpkyhufyu8mj4aqkjlvpvn3nn4faz", "384498519150480128"}, - {"evmos1ks2zhqt5n38fe0gthl88czfr6sl9p0ejzdsa33", "354649749151742976"}, - {"evmos1ks3uxkfkqxvr83kfnlfqfrpcdcnwsxn8empzsa", "767452971371777024"}, - {"evmos1ks756wv5dwzyy9acny40u6hdmm53fs3vrfcwmy", "6892412905992536064"}, - {"evmos1ks7k0893d4v0q5ss6r59g4d8akmh0gkfmfnhha", "2675718162345234432"}, - {"evmos1ks7upf0l8jtm0tdjuslqqd6rd6p3kucwv2m6lx", "26839647960462991360"}, - {"evmos1ks9zf6xhp59aa0exn9k6s3yhms2prpnsldmd6n", "2406964067148627968"}, - {"evmos1kscn73dajy6jkc5jalv74sx3l92ms3dw3fmmgl", "145865299433860096"}, - {"evmos1ksd2udxl8l2ekucq50n7g6nwh0duas3xlrfsm3", "2032508650667704832"}, - {"evmos1ksdkrva5304pyd5tc7a7py2elzs2kyk355z5st", "298032221250227200"}, - {"evmos1kseuu3agjv7se36yn2r5h6j4lph5x2l2ufc499", "715584488286736384"}, - {"evmos1ksgd929h3ldgxk3l0ttecm8kggkmhpqxsgtnwd", "16607346794633830400"}, - {"evmos1ksh95ul2qnq4atmgdw4ppvgmgmmgru49jj9e3d", "26584942843150508032"}, - {"evmos1kshm8xcuvrktguafretyy477ehwa7pg0dvw2x4", "11261131804391546880"}, - {"evmos1ksl3xkfusskuamz8qayc0eqcgvlyrccamtpuvq", "1681340950840112128"}, - {"evmos1ksldlyv755dw06hq4d785289xz4tkmt9er2r6p", "5729281648553596928"}, - {"evmos1ksnr6fl0kga2u52w0zethdzvxcfayclanywdhc", "4808626691914967040"}, - {"evmos1ksnyuxqjql3wwq0hyvc7pxvv8rsyepgjkceqr3", "2737368405558104576"}, - {"evmos1kspy6rq978kdjktp7g8d6az8ww0svy0ehhuznn", "3381380506594228736"}, - {"evmos1kstdevamvqsvjh899kng5pgc0x7j5tazjkyslk", "445325324335211520"}, - {"evmos1ksv4ajd4fxjhds50chw08lcnpkmsxzzeawvvr6", "3328064113722673152"}, - {"evmos1ksxreds2sd5cfyvgm4h8hprhpdf0vyzm93fy3c", "35207280567218593792"}, - {"evmos1kszf5rt5tsd6t4nea4uf34pdr8an9pe2d7dgkp", "65568097010723840"}, - {"evmos1kt0xguedw8q3j7y4upzu56vqhnxjgqkl5p55mp", "8670769595257626624"}, - {"evmos1kt2l6l287ewzc2ll9knq3uu7pp7kpy5wdm9vzq", "13536528089250906112"}, - {"evmos1kt4udscyqe98um3g5epr3r8s6xteyycuw85qge", "8042857668923625472"}, - {"evmos1kt4x79ssnuyxewjsmxq44vsqzzd8kkzy5v0wyk", "388041224804561152"}, - {"evmos1kt77pqswyp66gdt65vqyz8cekcptc72mgnxcrs", "10800392756790390784"}, - {"evmos1kt7wqm25nlanzg77mrkw4pnnr809kszqxfdn8j", "3519052169530744832"}, - {"evmos1kt97x0wxgwqw0t76zlmthn2efna9grlh8vyjx4", "6390246626038661120"}, - {"evmos1ktadktvexvufplpvk4xf8uttynxha7kjtnps4v", "347482876942401536"}, - {"evmos1ktel9ec72nd6addnfvdv2v52zjyqkvcn6f9wsh", "1364390216639960832"}, - {"evmos1ktfn52jskymgj2qauys23usvsecyqa04nh0ftx", "253253008626462720"}, - {"evmos1ktfy8vn6v8hwvevtzxxal8a3rqgwsqdhzy87he", "11010414637631045632"}, - {"evmos1kth8gv0w56qq26r3qc66xkgaa09zrye30vscjg", "3670221382640944128"}, - {"evmos1ktlj94xhvg26ksyhhutpny0vh8ys805yr5080n", "368033183588231168"}, - {"evmos1ktmfc2qzshnc9etpc3grg0m0qkh6tq7yeu98yd", "8336935886894833664"}, - {"evmos1ktn0hnwl2cdy9xamg76ay6qp3m8wjuvu46en9n", "708058589584505856"}, - {"evmos1ktnesl7lllkg73myy8mrcnetsehgxxfvcrmh6n", "3753656327319685120"}, - {"evmos1ktq0nsdm2hdq82vulwfqpepj8xvqatmvvc9cdx", "1490738039011456000"}, - {"evmos1kttk7dlzlh8d67yh4cn4ejq5ykej9urapddw34", "19363476442530578432"}, - {"evmos1ktvagw5sar37mcgeg60scvctwx3lv00h80h353", "2073859065510395904"}, - {"evmos1ktvr3qzyk63ettzncjj96hm6e9z205ygcx4h79", "2932966759907269632"}, - {"evmos1ktwrepqde28ng58scpur8h20al7x89aw5xp66q", "5003260222284906496"}, - {"evmos1ku6lgefgzg6apdt29hlq3xkrapymva3dv6gefk", "475486191613301504"}, - {"evmos1ku7hwkkht8msm9f5xeuaf83dk83e2ujgeppl3n", "8615704518709379072"}, - {"evmos1ku8sqw7l5dhw027myrcr7cvmhaf3l67y9jur02", "6902809895645757440"}, - {"evmos1kuan8urcuu7z87mq0lj3pd5gldyx8mnmh765xg", "1041360073635614208"}, - {"evmos1kueyr3dd03yjxj794juwcf6yeq7g3lgej2kw55", "1289357888834923520"}, - {"evmos1kuhqhx24j940wh0xnwdlnvq7xzrqr4cmaa2339", "12187918909220880384"}, - {"evmos1kumvhu6qefxvu0us39wwmttkcpcpqpywlefcc0", "674695048032534016"}, - {"evmos1kutqz7t6gv32nqq77dxu7ksqsjk0vwcjtet7ej", "801812147648090112"}, - {"evmos1kuvcd75xjw28hcg5eap7tqlhhyync3w0f7p27q", "755307079997257728"}, - {"evmos1kuvqvu8u8eayenv0uj7tajhzh648myhqyvmyuz", "479456857722910208"}, - {"evmos1kuzhm0jqruh9ef3gdp7rs8lz353995q8ax0gz5", "2884809960360728064"}, - {"evmos1kv0wznfq4sevuvt0c6f9ykdfvcew8jqtwrez22", "73017318258294693888"}, - {"evmos1kv4p7av8plg2eg09lxhycg4skkyx4jycscg7qs", "3021060188427501568"}, - {"evmos1kv52jmqkm42e3hut53tslhaf0dgrz9wycyuwrf", "23475543351282061312"}, - {"evmos1kv6ruc3a0f5xpzq7mxch3m9jy7tgzguktacvz4", "18931412368532353024"}, - {"evmos1kv9gp8axhtxxzppu2ppwu6rqnh9gjhgqhuuqvd", "1033067932998291712"}, - {"evmos1kvcjj3grw0r7vevx0ter00z0dz9uq4ncvpzq6l", "686720732114176"}, - {"evmos1kvcsvc5scf2qkvzh47x5g69gtzhttcy3jvw4kt", "13077400536209117184"}, - {"evmos1kvf5rvl7w6aaw2fcpz0wv75jvwmwtklh429eea", "4599258045539022848"}, - {"evmos1kvgfm0r40gjd60kat9gqmspqt3xzkznnfadtp2", "307804772791618816"}, - {"evmos1kvjefhhhnsua5rtnx09kmmj6hlg38n58ptlzkz", "3202942845220622336"}, - {"evmos1kvkly4s9cvdza6we24rkaw0jvwmhl6vmp6ufq3", "45500509993873920"}, - {"evmos1kvmumj0nvdprt94pg20h52wnju90vj3wczdde5", "1844067844280012800"}, - {"evmos1kvnq4z3zrstamq0juvukewm75twz5zx73ne80m", "409491972922298368"}, - {"evmos1kvq08yjz6t6a2czcdjvy9p6czu6z760y5myh73", "3216239874145470464"}, - {"evmos1kvqujjp4mva2erzcz8nf8kchnpz9n9er59687u", "4987404966339504128"}, - {"evmos1kvu4ye0467npjmsyxm8c4hzrkhgs3ska644w0m", "15743433061801342976"}, - {"evmos1kvw5p6ev6rtdq6uzvhjm3l3dmygprncrwtee0l", "1653188148332534784"}, - {"evmos1kvwnp30aqxct6d8c7t9qsu8r67cntm0qz8hke5", "1009014755992621056"}, - {"evmos1kvzxx5u4npmhvkwsk49773d3rwu6wpq58nf7y9", "75365713434265600"}, - {"evmos1kw2z2ptuqlkxgjk567r4hu0rgmv5va5h04uhy2", "155034058909616384"}, - {"evmos1kw3953mujlu2utvu22m6e7lzer39n4wep0u20m", "387379287915103744"}, - {"evmos1kw54p0qul4jnrz9chgtvz2q8a6fqf7f7hev0ft", "350023273025985792"}, - {"evmos1kw6m54tkt7mlp90f20pxxvrjqz894r625xpxcm", "21535763710811340800"}, - {"evmos1kw9mfmmrxq8mgp8pxk4gjwfna4m52y2mz9zetv", "2560526750534523392"}, - {"evmos1kwagp0r0crshllupypas35ue40pu3g4al8v4a3", "19355910822939226112"}, - {"evmos1kwajkt439eq3kjhgewq8gd396fcytsgl29g8gx", "1026620474701389824"}, - {"evmos1kwcu7j3h5kkh5082n4dk2243qmy4w6u22qtrd8", "3675511662436171776"}, - {"evmos1kwe48sjpaw3gven8pr56hylmgse0wtdhecs9jn", "2560371409031913472"}, - {"evmos1kwf48vdl9l8jw4uauuxsgpg56pkmsuzlulfema", "21426599860643479552"}, - {"evmos1kwfvm3y4d3yu0nsjfay8r6d7jz2vq3rk0ej968", "328687150480519424"}, - {"evmos1kwgey06t6gx3eqflph7th8uj8227z2pycsuyal", "15080213179203084288"}, - {"evmos1kwgrt6metl5ph9vkk7z6tsnayvxne427wdwf6g", "1616927122350537728"}, - {"evmos1kwh27ck7levprgwhx02epxg9raqx4409q8w7d3", "7148246633132666880"}, - {"evmos1kwku5ckntdkj5vnm94zk0l7ydgzrk94w0wp6pa", "1593347162314948096"}, - {"evmos1kwl3xw2smplcg5y0cerntm2q5ne8j74x7lcqsp", "55529371073956864"}, - {"evmos1kwnes4vjfr7nyh5nd5rrhkkey0rs29qmw7y8mc", "4876554693361402880"}, - {"evmos1kwnlhsh68rqc44zr8t5nleljzh7j6ptlkpvw5d", "1421067229682367488"}, - {"evmos1kwtcpvc94qhu6yjafmhfhdn2qh3u8s335sevt7", "1016375666657760768"}, - {"evmos1kwvnje3mwxmqrp7kk3cdzcw2w808lwtrj44ftg", "13032173792313937920"}, - {"evmos1kwvz8fu29mhhzjs9sfa2tgdqhhxm2nzqdj83p4", "963667265166712832"}, - {"evmos1kwwlx6d9eu2e4cn4kgy7vgc88sythw4qpdjxf9", "1414962646799948800"}, - {"evmos1kwxv48f03ft4pzx73ns4szuj3jh38epx5tjeua", "5755811625863380992"}, - {"evmos1kwz5fn8jjhtck7h8k2awtkltmv0snygdq28ttf", "7812163512338853888"}, - {"evmos1kwzw25h5lf2njynl42pyrrq5g7g9nmjqxjecdm", "1479265283977928704"}, - {"evmos1kx6xvl0k5sr2287qfe8f4gzy9h3aqyvul2m6pm", "1252748792762152448"}, - {"evmos1kx7yp8q4cxdhphya7as6wwvrsmspl3g5ruw9v5", "8167763483978719232"}, - {"evmos1kxasf6sysg9447yvm2wm02s2c0gsnwf6wgqxg7", "4413035602594428928"}, - {"evmos1kxcgv9pce9t0jscuyv2p87s9puka38nmm8m9ak", "54806901731762085888"}, - {"evmos1kxcndkql704nwe0jy0pkt9kqtt6sqdr7rcuaxd", "91629741777371136"}, - {"evmos1kxehzgk7y6dpwe803cv8kc7tgl6u5sw8x46zqp", "3750580193124900864"}, - {"evmos1kxhth7ac339ghtcnq040ry7r0jp02wqq9pj5xu", "1387880699610135552"}, - {"evmos1kxk47e3zxx4v0tr76jc3amw4gnlgllwx7c66wh", "478742749783878656"}, - {"evmos1kxp4zw3emcqsn265s5pumgumtas3wg7j0fddet", "477094670602932224"}, - {"evmos1kxp8x9z89yn8vwaczr5nfc657r3a4yt0e5nudk", "6782733695527419904"}, - {"evmos1kxscmj4v6jxvt9q0sja28tv0atg4q7yj56epka", "710052976322938880"}, - {"evmos1kxtfzref7c2ld6qd900sknpk6agp57nj3m8nt7", "1075479690088611840"}, - {"evmos1kxxczrutz2k7z7u33lnhg6cvf6kjthlvnh8mnr", "16915652262105645056"}, - {"evmos1kxxn32sp5d8hnrtk9htua7h333gv5jthvrn73c", "431720151569512192"}, - {"evmos1kxyk9verwu6y5l6c2fhydkj97sqld5p5nnhqrs", "1413522909862195200"}, - {"evmos1kxynpusxlhndxlc5pu3k2gh3xlzh55v47crdqz", "10862446910141485056"}, - {"evmos1ky208ug6gd79r2vhph9ff0r0vlzj5h04e60pg5", "11384727173458997248"}, - {"evmos1ky50xatr6wqy4nlmuv6tyzfenjeusp7ccuxzq3", "2220426126657912832"}, - {"evmos1ky6davzesetutu05ctk8j08962t3kltv9ydeva", "341637950919106048"}, - {"evmos1ky7aa7kwk7ky69v2uedww2jv59l93dfgrl5dh6", "12743441323792900096"}, - {"evmos1ky8v6lumzvaxkyha7smuw5xrkn6uzydwq6a4vk", "3349060691262640128"}, - {"evmos1ky8x7na4yezy0szqtvn8snh2evmzh45gmkh2tt", "5331058557867638784"}, - {"evmos1ky9zg2scm2yynt9mfg20kcl5rqfe79deqz0tuu", "11697162363598536704"}, - {"evmos1kyagze30mz0hy09w7gwqrqv65ych6lq60ktfaz", "5001304988852086784"}, - {"evmos1kyhxt2hvu5025255zd9952sx5y8jq0wq3kzgx5", "6534852408200020992"}, - {"evmos1kyj3kdj70mf8t56nw242dyk7ukq0er2wzcg029", "5450445101188661248"}, - {"evmos1kyj8ala59z9upn4nj3vzgte24wlftygez4fpdu", "32412316266954620928"}, - {"evmos1kyjfzmv449cc0n7gv7aulgfdg3k6eeu76aezwd", "385967177163980544"}, - {"evmos1kyvj9quh0nasr6v0j7jssr4s4cg0wzvduxngwd", "4525432454651618304"}, - {"evmos1kywglunjhp9nlk5g3a8s3q6kkcm0hetan97c4s", "4612802006496718848"}, - {"evmos1kyzzf7h9nujkswyur3dz7l3wh2k6a8vxn69xwn", "10575870370012004352"}, - {"evmos1kz0jgqp69rc6t0zrxyr7pdtaszzc3ypkfw20us", "835411903603570176"}, - {"evmos1kz0qhk9whafg37wj27s6k0dgfcjln5tccaac4v", "436821521601202176"}, - {"evmos1kz22980et2kqkhek3gxywgqdpmgz5xvy2uwe02", "11798069551439581184"}, - {"evmos1kz3utgc9a6zalmgr209kjszz8pjp8tz6wwm8hk", "100945768876522496"}, - {"evmos1kz4s5k3xnu6dg0exr87msjcnntkn0ydfj4khap", "473180586773924864"}, - {"evmos1kz4v8wv2lqdhsh0n2sa3c7v4wynlnezxphzqe3", "926310502533996800"}, - {"evmos1kz893zfyqks5jsu98z77utkts4lsn742gfz580", "1067858182814591744"}, - {"evmos1kz9kxe6s6ufdesgqfhdnr5e2gulrqk00tn2jd5", "287835929689773312"}, - {"evmos1kzc6ccl0y5tz2hvxtq999hu5pfa4kgp6w3akgk", "33826627244453228544"}, - {"evmos1kzd7ukfrcf4uuf54g29kxr78aw2psy7vjj7gxv", "22248937531406991360"}, - {"evmos1kzdhjjghn8x0hs0t8quh8225p4u3ag4p9dw7nu", "1171419698731913728"}, - {"evmos1kzdpgxh4g9lfrw0dwy9upau0qxkuvppwrndpm5", "2887902845233763840"}, - {"evmos1kzgqc594vqphpxa72l3wyptsm7dpkse65mu2v3", "2389973047492732928"}, - {"evmos1kzgrq5fy258jcg8lldx2xm6zxmgdfefc9wqw6j", "752922543613580800"}, - {"evmos1kzn6y8dxaeha57ysvwuyejrvh9rwru9ad4v3nf", "10583942258938634240"}, - {"evmos1kzshh9k9r5nc2xg2fk8js7c0mh6xjsjvmjz5lt", "385607461321715968"}, - {"evmos1kzt5mcksc0zlpzfdg4k5sv67q9j9wja8v4hsy6", "113854887467602477056"}, - {"evmos1kztez9vcsg29rdd426mg5v4vg89kwkeq75kmsm", "1267384044012602880"}, - {"evmos1kzudywy6r5e9smwyc84sd68ap3shpcvphu7j0p", "12365622114034345984"}, - {"evmos1kzw94lgat0tx8qee35k8tlyev8vxarxy4xu0yn", "5572041009149016064"}, - {"evmos1kzx38cd2ezy6fen7qc947lwz50ku2ad4tsg3cl", "26302781735746816"}, - {"evmos1kzzwyjr3w5naz95jhrfeqjfxcv6xnx6mvf6r9j", "11871606241657733120"}, - {"evmos1l0237nt6szud8frgk42nn620key4fyd8ptspe5", "42844989594121256960"}, - {"evmos1l04eznpundapj0yjmcfs5xr3vzt50qejc2u4kf", "7390255319693970432"}, - {"evmos1l04v84ajuzv8rmkfxfv3jmnempp5jlmu95rclj", "1248587971133245440"}, - {"evmos1l0c3rrfp3ltj38zxjezhc6shy6kg68k29h0zcl", "461761837761955584"}, - {"evmos1l0d5yv2n28q8xd9vryd3nkjr02t7utvzq0m0mw", "460650711368590848"}, - {"evmos1l0dmxml5gv3sp6jcp3k3e7vykl63t7ydkecq9e", "1661160627492618240"}, - {"evmos1l0dndz3382t3u0gfuce5m9u6rstrkwctt3fgjn", "12531365795587661824"}, - {"evmos1l0g5p0c500228rm058mmmlrwxkmalxph7m0x5m", "47517027580358656"}, - {"evmos1l0ggthedswaw846lmr4drs2pgmvyc9luzsdzdj", "501180760988055552"}, - {"evmos1l0gzw6zvdgpvv2qkk9pz5pf77e5e3fgy2zs29x", "3350515860789592064"}, - {"evmos1l0hqgvqctnh9f905utq3uk7r4led4xl9jsld3s", "15226251151150151680"}, - {"evmos1l0n9ylrp7dsnhdhfew0rujwe5xlvqfpc3nzkjh", "95974123886155008"}, - {"evmos1l0ptcfs5srr7twwlud8y3qtvm3a548c66mdfqk", "10710445224267591680"}, - {"evmos1l0qtf4gvsur6p98tkzj5udsfud5nghqr7vnaj5", "6219325838792573952"}, - {"evmos1l0r23z2tqtzel87hgwtwwdk25fh442cdwp8y76", "8688557643746017280"}, - {"evmos1l0szgh5hymvp0km0rj8sv8wl4ltzfm07nup32y", "4778033541464825856"}, - {"evmos1l0ujvl26492zvz79hfa5y6pnfys993j8k4fw77", "385583332264678912"}, - {"evmos1l0xfstysre6ku9eyfaj5gaf6lmm9gawhhkk0le", "639945263588763648"}, - {"evmos1l0xgxfyehpcycj7dhh23nsy0g2n2qj5aln9qr0", "1725571084939569920"}, - {"evmos1l0yj7lhm34cmtxqmy8xk8urnpkyggvxme4plqy", "760247049129401856"}, - {"evmos1l0ze8l88hxgfj9hwvr9ywursswzw9xydt0wdtg", "8860105583393224704"}, - {"evmos1l22hezdqp3wd3mrlwae57gcsufs6zlf738x42m", "5126675174570901504"}, - {"evmos1l23jgpzhngx92akf3yykrclr338lcf3vtt3w46", "49285087584801832960"}, - {"evmos1l244v9wn2d53l05m8ktnl6y7yr3qlhlmpmh05e", "1200681570870635520"}, - {"evmos1l260sydqjt6gw4ymr32k4vxjcjl2hsjcseutj6", "1293214879710771712"}, - {"evmos1l26l6znd70e8w7ah3gl8wh5aqpsf59c39lq0r6", "10073303421511274496"}, - {"evmos1l28ffuc2uldky4avgpl3ay0hufxr9fm5qfhmdl", "26784154215316224"}, - {"evmos1l2fug9px0u9mgyjzl7p0mx5r9zglg8cacfv6pq", "24748875331378688"}, - {"evmos1l2mg45kf2q9l2cf6n3rd87400xp6y73p5mnkuc", "814841247870924800"}, - {"evmos1l2mn8gjnjjjwktms9rgpsrslemdzdvdqz78l0s", "1200607477152247296"}, - {"evmos1l2q7fgeg644el4xgwf5ts2zwwzj00wnvep637z", "384296598478660864"}, - {"evmos1l2qap26l5j057zypl34cc5d48ygunyekrqfl2m", "883516058054049408"}, - {"evmos1l2uh2ymt9dntune36whc0zl6y68lt60lqaa6k5", "2461382514025783296"}, - {"evmos1l2wywcmhuk4tm5rnncm60lf6je0gfjkcyrvv26", "7326557021584900096"}, - {"evmos1l2zt89y4wsup0dvfnk33660hx3u5awe4n3nhhs", "445249730248146688"}, - {"evmos1l30sct3z3clxjwm4rgaju44l0pm0xd8825c40s", "12691190454096773120"}, - {"evmos1l32vlgutwa5mv6fl8jsthjykpgv7dz8jlfycak", "32811212930272256"}, - {"evmos1l3604v5n8r0rvrunamr3c3jzefn0qczyt4thfd", "40116956467495534592"}, - {"evmos1l369s7ygdk62kq3swc6yq0k74263rkrhwfljuu", "2221219386866102272"}, - {"evmos1l37qaugfq7s76xh2rg6xg2s5lrkz6fnhpkyssh", "56346912717798694912"}, - {"evmos1l39l6dydejrv42jajl6f9ue7m353scxcvz80v8", "2136438648468680192"}, - {"evmos1l3c00g297meknlyzrhx9sqx2wat3xyxlqvvrld", "6293895249901273088"}, - {"evmos1l3ch5sgyntxc6kmze6wv3aj85fypup3zk2e07e", "1340778227041105920"}, - {"evmos1l3cypzavdc72g9dkp8aj6ayaftc4ffx0ysg6q4", "367232710808202240"}, - {"evmos1l3efxasnvjfrepz48y92fy9c6zzufayh2rty0n", "5334690289453002752"}, - {"evmos1l3ehgq7a2jddl97k7gt68hpd0t20nazhjjsl8k", "46386169443703881728"}, - {"evmos1l3hkzt9tzf59xah5vdwjem3gg7s4cvas8snxkg", "452656142989377536"}, - {"evmos1l3j4murtqq3vr5tt4m7f69c3csfjuy9a3n5wet", "19720995894756528128"}, - {"evmos1l3jr5kstmr0scrjy5hh5ukw4gr083lsmt3g48a", "230053103291558912"}, - {"evmos1l3jyjtrnzcqj57s2w3thepj4cmlutmr2ftqkxd", "234604264349098496"}, - {"evmos1l3ldh2ntmum4apf8z2zta5hjaaccgec44gn27e", "14385371113769598976"}, - {"evmos1l3lrkz5mazj9qmjkrzfk2rz3f56nrwjnllg5h6", "121826663762698496"}, - {"evmos1l3q5mter3g7tafjpl8hd39vu56k6aclal6a6fx", "5987979945539918848"}, - {"evmos1l3qdl7amkqz63t2va83c6qhkm2ay6hkd0tp0f3", "4671469474777176064"}, - {"evmos1l3r4t6tw02f46uhhrqddkzhgk6pat4r8d3gffa", "212772774559212032"}, - {"evmos1l3uca83xycz8s0mkfmt8lly85te9wg64tgqqse", "1936300772562521088"}, - {"evmos1l3x8g8lt34sfwmlguja8pvc8kqrp70qqmy2xzh", "2606898362841341952"}, - {"evmos1l3xtmndze3vpjchssymcklu7yu83hjey7asc3s", "11793379054277210112"}, - {"evmos1l43pqk5tr7h6g93yqtutchzr4zmt5sl069uezf", "39125258743194112"}, - {"evmos1l44wuyasxllzv3xml7pxudjzxw9zqkg899xmgm", "2016603654747023360"}, - {"evmos1l45ddk7mmgtcezsd658lftnqshlzql63kjf8lx", "3126938764391366656"}, - {"evmos1l45hyf2fqmpve4xryhm8mnq6967gqeftxpe38x", "4230723765760613376"}, - {"evmos1l46nj3r3qh87gq4hlskyr3dd8848a7cg5vemd0", "2910557918693982208"}, - {"evmos1l47fwm34rv2um0279vjqvwkn6qjpz0swdc030w", "18488103254080421888"}, - {"evmos1l4cnanlk73ecylsp6lyv75x6mkjzsynzmjuz9z", "414019273591509504"}, - {"evmos1l4d433uh9jn0m95r2vayayq2zjx5futmdge8qr", "270116953611766016"}, - {"evmos1l4fhrdu0sk48s0jfzlsjeyj6rt5rch7z38g4hk", "3848660486928178688"}, - {"evmos1l4gq6djrr2mv5h9qanahz6pu64duf0wt2nz6qp", "3105429487811158016"}, - {"evmos1l4huted74v9npa90f35j4nsrfkfl6lm7758wpk", "6914845249528305664"}, - {"evmos1l4hy9a4l3hz5yfdl7x4mwyt2nq6cm3kzplntx5", "454245090833561812992"}, - {"evmos1l4m88kw355svnzn9ft6d5p0xpncz8v629tah7q", "985887538739635712"}, - {"evmos1l4mt8xkfjjg68679pautzwgxdg0sgaj47zggkn", "3477757242469137408"}, - {"evmos1l4nnkhrjtsn7xmxwte0qhxea3jeyr0tqf5pm9j", "2024038827043429376"}, - {"evmos1l4pagnhu3mpdme74nnrv6ddq4tahc6n3rnpyuy", "1500210150483979264"}, - {"evmos1l4rdjl55wj9vnlvqs75ql33ku3scltvzgam25a", "32071903337112928256"}, - {"evmos1l4tp0nz79vvzglstfredvgel2f904n35kzy8q2", "838189936278072448"}, - {"evmos1l4uyg704f6pm9ss32ltpwf7qgg6c0kuaz7g24z", "1203012844442328064"}, - {"evmos1l4wen9ce505ckuyefy7z5fyh70hs0nm8z92ruu", "16022205619343675392"}, - {"evmos1l4xghc5swffla67xa5g4gu73vxeksfzhx68yej", "2153299665012215808"}, - {"evmos1l4yzrthtj6ttg993d4uqtmkpu8kw08e98qw38w", "3217580232065431552"}, - {"evmos1l533wrux9u2lffd0sqz3gysuud92d426aekwnt", "4796924830267404288"}, - {"evmos1l55zl5ytr9n8yw7ey5wyzxqprseyjuyehdww9z", "423108473885116416"}, - {"evmos1l563v84l87ghvlxu6gjk6he4v5vd2xnm3yvj79", "885100173242072576"}, - {"evmos1l58rpd6uc2ae03ds2fjjradnd8ys7sqd4mx8gu", "463761840775902976"}, - {"evmos1l59ecg8jw8znqa0mrpdvt3mzpgllum3gvvuzkz", "18216348993795096576"}, - {"evmos1l5czps8v7qlhnrkv8frjwwsy6lw0nkscnqkv2g", "2439120419784192000"}, - {"evmos1l5fy599j427tqpauxj0l2wpre7lnp04ky9uvjq", "253750958898693376"}, - {"evmos1l5hfw9glgamkfl22sa9h3d9g5x2pemh96ak66n", "1277009463957596160"}, - {"evmos1l5j6n4l575zu8wu2elxnt7e043e28hxgf2d3kh", "4274803714462081024"}, - {"evmos1l5l9ax2vdg3nph7vzwsra7c8sthdal53fu4982", "1184731332385312768"}, - {"evmos1l5r2yx4afqlx4rrgplpwxuzswhhwcyv0htp5a2", "673786703143097344"}, - {"evmos1l5ttt9l4gmj2m8lsrgqrvke2pnlaunecmu6uwn", "89912527463272704"}, - {"evmos1l5vlrw2nyjz668eut7rhcmhs4nm8a9f8f8zlhq", "10494116248094363648"}, - {"evmos1l5y02cwkqhayx7ka66nhg2f8xus4x7fl536khu", "1442598633188962816"}, - {"evmos1l66p7y92pgy2cnhq4ucwp58wptfztl2aquez50", "1104584807261024768"}, - {"evmos1l676v3pamtplzztxftjz0qycd5zg04exfye73l", "678796173867130368"}, - {"evmos1l687tv3uafplka78xw9mt8x85qrnnzlt0dnetg", "1355517679778586624"}, - {"evmos1l68t9mj790dmelnmkg28y8wxm90y40tjam42s8", "1109048006699364864"}, - {"evmos1l68upxwehd0awcjr28xk337my5ruthw6p9nm8x", "5214023153065199616"}, - {"evmos1l6cvcx4u5hqdrgmztq5g8p39789nregk0ryg3e", "3154989190352133120"}, - {"evmos1l6es7zk3fzmp3yqqmdqw8wqnhtlecd844azu4w", "1290977614108453632"}, - {"evmos1l6j20vw4ute9x05k0fwlgstxwrq74ag22dzrru", "1019267221901721600"}, - {"evmos1l6j52rkyhpveejpur8unrugq8e484n7t2dqkd8", "2646548562813204480"}, - {"evmos1l6klepg8zg5s8zr6ld2qf52gh2xeztvnfvhspl", "22863215525149515776"}, - {"evmos1l6m5ly2guls05w7v9ys0ln7xnrxuh4h8x6cwjc", "1146550338897986048"}, - {"evmos1l6nfchhwy3mmnf4qlr4u47wz3xpqgxqp0ku8lj", "795271877583198720"}, - {"evmos1l6qgkpu3slxyvr68xazcpa0mglyzhpa9tmhdu4", "8636853866079590400"}, - {"evmos1l6qvcmjxdqthyjm28cnc6jqjyctu43dyhpj8pn", "298571906593332224"}, - {"evmos1l6t8rx48h286kqhf6vfrcrzqcgu524tud8eu6z", "3896167093945453568"}, - {"evmos1l6v63kmt3368eypv264ruv7dl74f93kkqn2x79", "4816433354571563008"}, - {"evmos1l6v9c7nvp38lwsf8xjewrxjfcgtq8c4ctnfqfw", "16021930579613679616"}, - {"evmos1l6vr9v6apkqumja3eu7dweey7p2cdwjyejsn69", "1603298922232170496"}, - {"evmos1l6wzm9prhv62zrh9ek4j36adlv3k4qwy00fepq", "101379864713524480"}, - {"evmos1l72475el6n7t6c9jk9ur70k40a45lt9wqkgz5z", "640244805976370688"}, - {"evmos1l76wmc9qv63jmnd6d2qmm4mc4a5lwrda7gvkx2", "3985485827803596288"}, - {"evmos1l79mfvvv6l8w7cvq7vmqwxn4pzgpn8sxxz2uwg", "4277279786921626112"}, - {"evmos1l7d0jk4jhav26fnget2vn2ydtrr9wxpyw5kud3", "473262319991222784"}, - {"evmos1l7e2ve2rzgu6r7rphrcavhyxlu85rc9774lmft", "1617948011512194048"}, - {"evmos1l7g5etkvfdlgzylyefzd2u6jjvs96qdeet2tjp", "2137740194463744"}, - {"evmos1l7gh320g4wfareyh805ple2g2ajzz8prmq9yp4", "96473964474939904"}, - {"evmos1l7hlv8p9y5ztwkc6ne99d8uc37h34kj65zltgz", "1659801104886237184"}, - {"evmos1l7hxqet8jgafq8xtkayfzh7mv04x752wktkh3c", "845092752773570688"}, - {"evmos1l7jlr0ncg4jmq93n444hdce9j5d8mrl4kl902s", "28240077542358114304"}, - {"evmos1l7mwzcgxqmvj9vgmjhq6jacz8mxlrdlp4pxkfp", "477301821129860096"}, - {"evmos1l7s5a7vp9j7welu48g8ply3eg8mce33cawh3rf", "84334054329524109312"}, - {"evmos1l7swpng55pdkkdrra3dyl80wh8u36c92apm8yw", "46599574699828224"}, - {"evmos1l7uvnmye2xcay2hqva4gjew7gdqje6ma5vg2h4", "1828345191716512768"}, - {"evmos1l7wdcz4rjkuwlfq6ztvfd87g9qe2clf76k69g8", "4845853168890593280"}, - {"evmos1l7xlqavmfz3mrae3wrf4w03jdp86empq57565f", "1733014556882057472"}, - {"evmos1l7zzk7lqy2nk4k0g27maywwv9xh9gwhhdutdxr", "1031755073447569408"}, - {"evmos1l809rutatjnufz8yjrj2e8ma2qng3l4p3get5p", "12401605517729644544"}, - {"evmos1l80kg77g0q2majjej6rvqntten3vp3gd3vgd2t", "196376297478340096"}, - {"evmos1l85xpyaptaplta96nh7z6ae36s69rwfqj24sdf", "28654788051467124736"}, - {"evmos1l880uw3x82r5rg4fvhm8qf8ccmha5pu4rskps0", "2766623593154294272"}, - {"evmos1l88d2k29pyj7jtflvp8y38nl7htalhwsnm3zjd", "1472369653818843136"}, - {"evmos1l897nygwy82mj5v8lj6sarg9j4a23mxyqglax5", "2478096217368813568"}, - {"evmos1l8e2hnyalzyhjjmq7pu357z0t2tax2fqx9ckyt", "100900632804600381440"}, - {"evmos1l8g7qnmf07s7jf9p6z30swzjsq2kd5kvvnfapw", "1547378740601400320"}, - {"evmos1l8gfq7nxv4krl0mh8ky72mz0cxku0sccj9dv8k", "6210992233072244736"}, - {"evmos1l8kdj7twusyqtjwjrq2vxegn8hev4uyaae39mn", "22369519913132081152"}, - {"evmos1l8mn2lpavts5mg6upuaf372mgn49fm8qypfv7k", "60133238423610368"}, - {"evmos1l8rz8c2670f6yrhrxvd0kqenzl36d5ncvwta0y", "18408152524306354176"}, - {"evmos1l8un29nw85u4kl4jz67d6pzje26dwumdxh3e8q", "1505618639301466880"}, - {"evmos1l8y80uj9dlp7kt3d8xx6m3x45j64xxykass40k", "4450734293203841024"}, - {"evmos1l8yxe26dh9wkshzhpnla9s5ghhqanje6jruh77", "1211677442162745344"}, - {"evmos1l8zkfru5y7qlpaenkfspgtaneewhh8lnm3zmtu", "1747589600294630912"}, - {"evmos1l904qhcpmg8u6ejqsc826cs822ytc5jj4flxdr", "461877341885047808"}, - {"evmos1l90u6phh89c5d765xlkfy8v8jd75rtqrtdltre", "415589243335030784"}, - {"evmos1l93f7ntg940crv00cjqe0nv0rqfu0luu75yt9t", "242676407961231360"}, - {"evmos1l957805u75x9aanjm8attzza6ev74sh0rgqjkn", "367123672353219584"}, - {"evmos1l98dght4vfjn7fhtm7kke6pk7ned4t4a4zhyzu", "1333497058537078784"}, - {"evmos1l9990usaxsa4sruysrn4gnzad8ygxsgdhzprmc", "96579800388579344384"}, - {"evmos1l9akq8eua9qp4p5qxzvmyt9rzvhge404350xfq", "5616914173224900608"}, - {"evmos1l9cnf7z6y24hegqmvz064lus6mqtkz7g98pe2f", "65687532873298608128"}, - {"evmos1l9cpmvx66ycq8ulmwy6y6uap998vc4rqkh7j28", "11841185479060559872"}, - {"evmos1l9cxfuzh75q3kh678u6y6y92wzg08ypp3arc49", "41933160538556350464"}, - {"evmos1l9fqwzydagyajxhys3mhwr5zekyw8gw0jkgpln", "19545395496222646272"}, - {"evmos1l9h4pngua4r0wjp24nqcrqeyatt9yc0c84xgvq", "35506134437324234752"}, - {"evmos1l9h943tnt77ff9d467y55lr5j33z8jqvad3340", "316953999782578176"}, - {"evmos1l9lww266tyr86pp3u74gufrf6ylrg32lqgjqdp", "13083711710551859200"}, - {"evmos1l9msx8e9tzud94jhdj4sux6qe2pht2s9jqdsgw", "784352476591228928"}, - {"evmos1l9qftkx76ss0l3w93zf8gt8v3c3ys2fxxpuvpw", "24239625062179811328"}, - {"evmos1l9qj0q39jktuv2543me8cscvjdlp8dzvwhx4yy", "177725538360131584"}, - {"evmos1l9rffu8gvvkw7t7raf0eekrvkcafu5rvtu9tv0", "2176451176481706496"}, - {"evmos1l9semu09x8hfyfxelpmypnjrm8th2pldlmxxg4", "1194387367242413056"}, - {"evmos1l9u9veah57mefd6ulgfpu4ylhrx50a4yl5ggq0", "313276484347721472"}, - {"evmos1l9v2cr4j5pqrzzqvhrup7g5674pg2na8n8vgvk", "830457258945243264"}, - {"evmos1l9v408klglckduckhspcsa2q6hvq4gczj5m9jl", "4553647279537154560"}, - {"evmos1l9vhmueevsfp2r6umg6gf4h28k0dfjfl5kmvcc", "284947400565390336"}, - {"evmos1l9wzr9mv4406thhvea4pn07gss0xs658ejgym7", "355774793051871232"}, - {"evmos1l9xf7lapmlp2t3943q22ddqzdek3f27lxkwgvh", "1346132095397625856"}, - {"evmos1la3uj9hgeyuzn7laz7x6j0sgrt44uvt3u2nm7s", "8935492629283994624"}, - {"evmos1laa4g603wqltn32zjlde74hpmz4y6c89lctg52", "646247766470504448"}, - {"evmos1laawa8tg490ja28t29h66hxftfc2krrqj2dn0e", "10347643394196275200"}, - {"evmos1lacpteskzvpgjzpzyh89tqwjgsk2j80787cgwe", "1375391231827820544"}, - {"evmos1ladqcsap5ezxl84pe3mev95udq5kn7xj4uj73s", "405063352807187200"}, - {"evmos1lag394dz26c0l3wvm7ca6vqf4adu64qe7ce8vs", "65977764617603350528"}, - {"evmos1lagwlc8yvlcxa4s4svfqxaw0hpkw3vuf5shvg0", "3794954378462019584"}, - {"evmos1lah0t3lntxgye2xffpmhv9qqxufx2mephn4gns", "13988260330241763328"}, - {"evmos1lajffg8dmfne2w8u2dx2f6pk5dcx7ky5rjh5xs", "14858686499870629888"}, - {"evmos1laqxh97dyttqncnvpc2xda7kfnvdzl35yjrtns", "295638826140097024"}, - {"evmos1las9w9a6spatsjwzqj08may0ndajl4ehvz0hg7", "367052315561395456"}, - {"evmos1lc090gmg4y6v4s5da2es6t0c6qaterrtxcclv6", "5500590368708534272"}, - {"evmos1lc0m8zz8ervnz6vjx2fepkd8l4plpake6kmrwv", "1558473113285777408"}, - {"evmos1lc0qj2z6r3glllen4zrnf9fp9qye8z3hlj26lj", "1218762776815283200"}, - {"evmos1lc2uf9m0e4v0vsrvndx8j27rwhmdddzw45tcmp", "52051914062524194816"}, - {"evmos1lc3dleh478lfmrrd0p793t89zvaw7a3hfh925p", "4012072329018643456"}, - {"evmos1lc6asqgy2kfg093c6fhhfjhtdvwy4w4thjdjzh", "435221611632736256"}, - {"evmos1lc6n2p3w4jrn32gcf4ctjgjxs2d40y36gwahtr", "979334068224093696"}, - {"evmos1lc6r38l0rwpcpxukyks5c5hs5j6r6q6feku67m", "1171235597913177600"}, - {"evmos1lcanrgt0qwwqxjx4ye2cms0a7q8c2nk3nlurv4", "98820049586937344"}, - {"evmos1lcc5yqjt4t32ql3904nm7f2f9m6pfu63ry0aez", "161047744026691584"}, - {"evmos1lccvdkt7skuxgxse69p3njy5j6skjc7skz6aqh", "4738664448908689408"}, - {"evmos1lcdqss0nurl4zx6af3c2d8ryxxnh8q2z8q0xzp", "4578772791942479872"}, - {"evmos1lcf7udxg6jqam7gex792kuwv5ykxf2akmv44tr", "9388889859275102208"}, - {"evmos1lcftchzzszg9n8qg0t3r0p3gxq47tsrp4879p2", "892380026205255168"}, - {"evmos1lckaklf7kjpjhan5tx5w5re8fu6ftgktasaw83", "49040262484932864"}, - {"evmos1lcmd3tfdf77z7f7ynqkmlqdcsxlck2c86jymmm", "12607988256914141184"}, - {"evmos1lcmqgmmpj0tfr7v79jgp2vqrlzfcelzpkc8k3h", "7681241480179281920"}, - {"evmos1lcqg3rlh9cgmqpph5yllj6t9k3xt7l28zandsl", "1189586868847988736"}, - {"evmos1lcsxlyx93l4cusj8f3g8fhjrcgk630p4hgv2kh", "2983408508503992320"}, - {"evmos1lcuhlfgqj8q5xn6aur4ez4ur2qp4wghmltcd2z", "726386168174099456"}, - {"evmos1lcvprg7w2t22s3t0yap5l4j69hwq0xvzt0zyms", "518606906595163136"}, - {"evmos1lcx89cme2cwasewaj4lyd9wgsxatcsyffk5f3s", "7534829483996454912"}, - {"evmos1lcxe4uke73099mcmdutlqyrmlwfnfqftqrhz8v", "1417321085319725056"}, - {"evmos1lczzkxhtguw07ts6vuy726p9x0gee0x8cfmkr3", "880224602796934144"}, - {"evmos1ld5y7zfa545t5sexptass5n9ak4dhvwwvm4ycy", "536732603810747648"}, - {"evmos1ld7z63l0e9k7858snqzhsg0e495eamlnadladj", "1047001626115259904"}, - {"evmos1ldcnaq89yghk9h8e0rqgt8nymnknhv5yyc0tyv", "151543904340969553920"}, - {"evmos1ldd7xzu2mgve56myuadt4tjhghxkwamt8ajmwf", "8099636422686703616"}, - {"evmos1ldfs6k5z3gxcve8w3av5f0rkrtqt5mxrgfqwe8", "2744361225948337152"}, - {"evmos1ldg2m040whjahnh5hmmxn5q7hcfnm724qj4wfk", "419791800628686592"}, - {"evmos1ldg94gm4pzmyrnjd3urxse7m8vlkvxzads28fd", "3795078705920757248"}, - {"evmos1ldgsm9phkxl63fr4swl8vzr0s7qqez4yrdv735", "832082210375411712"}, - {"evmos1ldkzk5d7r68wp5mun3s6dp3yymf9wpucgck5fc", "1061493528716615680"}, - {"evmos1ldn7rpmyh2l9tu0xqunr882ykhdrnx9daaunq4", "339470350690580736"}, - {"evmos1ldnxsw2j0yahun797qxulshwhdz46wd2gnknh5", "766755883611933440"}, - {"evmos1ldqd0at3hwf947m0g8c0pf9xfwkz0493ksepg0", "1221322009115236864"}, - {"evmos1ldqfm2qxl0yyngs0nm4sdpc65d082qqqvjmnza", "949143195255111680"}, - {"evmos1ldr2jpwhkv2dpq8rqgeyeydeekmlgx0jf3jqqj", "22187027127749353472"}, - {"evmos1ldtcm9vr0f7gcq96esmf57wkh93rqhnssjcd3y", "1998145820592332800"}, - {"evmos1ldtw5k5xxmza59xf0zdyq6v79ka5hzqtszfntp", "4682949285798663168"}, - {"evmos1ldvukquhxqn9f5k5strgvkj8axta0n5e3kdnha", "5098207651806500864"}, - {"evmos1ldwuxa2lxut7dylgxspypjfrth6skjs4qvjta4", "715474141935235840"}, - {"evmos1ldz0pmh52cephfqut33z0lamr667at4tu7ynwt", "869942425495568384"}, - {"evmos1le4hpz5epm7wznc35t6n06af8u7e6xg48dm2c6", "1618451351470999552"}, - {"evmos1le77zpr57rtvcpfcv480d38s8caqvxlzlnxnzw", "1421635660566724608"}, - {"evmos1le8dk3eg3gd0ptf6cynqn4fcr7lunzndm73v7f", "338342170962944"}, - {"evmos1lean00tph69ney2jlv8fd92j67xut7rv438ee2", "1175573912811585536"}, - {"evmos1lefdjgyeyx9et2phd4j4qukwmzvqrz9qzhc6jg", "462996936260201984"}, - {"evmos1leg63men67lq3zvcncqvqljqrk8jp5wv505c38", "17029261740955869184"}, - {"evmos1lelum9clmqwq02tzy0nmle4kp39uhmzyxuwjp7", "1565253375661727744"}, - {"evmos1leny9r8s8g6y2hpm4z0umjzugarlwvtp7x0p34", "528227222376552448"}, - {"evmos1lepq6zzapjn842lnmz3wx6fq9c6qtpzghe5jng", "1223161169103352320"}, - {"evmos1leqhasujnzf6q8mc64hy5fxq7laf57yaemrz7z", "256548001543943168"}, - {"evmos1lesjkcrj54s0vxkvpd9cky76tlhrwx7mt83fyk", "12707311812537176064"}, - {"evmos1lesmazm2ultkuuupncf52md3wfm32vcl7f5unj", "12631553971549327360"}, - {"evmos1letjamw8kpt9t79fkqh2tmj48qq77mglkja79n", "1486946799320030720"}, - {"evmos1leuayhtgw675whthfgefh4y4j38clz54nrt635", "1366336665377216512"}, - {"evmos1lexphut2qyrdrksg6y8f30zy29eyar9jzv3gxn", "2549309974904222208"}, - {"evmos1lf2a6ml84tdwypqpkuur5hsxfq7znrwwx0jv5g", "840636724172922880"}, - {"evmos1lf2gndgykdrdy44nhg00lvhy3ttk5m6dqhmnvw", "153685745636089856"}, - {"evmos1lf2vy3u7t89l5uhyh60lrnvu5wm9w88ajwz3p5", "794094228545849856"}, - {"evmos1lf396pw96yvczgqxelqhaemtpcah2nwn57677f", "28667397347767140352"}, - {"evmos1lf5n3xpusfssa55rpmpgxkd362yazt0d9uvw0j", "6958979295256444928"}, - {"evmos1lf6vzx5keyma90vadqsu9e6unznsed5slhm63g", "2028330639242054656"}, - {"evmos1lf8pdj9z29myr868ypvq2jfazm5gr8tcs9ypvk", "714801429952873984"}, - {"evmos1lfad3tlmp44sxpvc8ha0mf9gfz9y3qzgzzfsdn", "2962139137547399680"}, - {"evmos1lfekkz3tzul4smhag4luxnw8cv9f3ufu3exfyx", "467216358276354560"}, - {"evmos1lfer9s2j645qs828sxjwemv3daezz29xs6txsp", "1000706683270807552"}, - {"evmos1lfev46tng9jpfngderx0p9d37puwe2qlakhd65", "1374072394508769280"}, - {"evmos1lff0rw3p2e88w3c4gxvphtlm4vprvq9udwfp5p", "469339138227361792"}, - {"evmos1lffl2jgvgnwjxghq9h6j7pmsgaz7wwmf92a0x5", "16075194325598068736"}, - {"evmos1lfkdyk49s70603ttm8x85jsrg8qwayrq8ckmyk", "21234674065643483136"}, - {"evmos1lfp3cl0nv72w6897t3hfwnn09u2umml9rt9ucq", "2057131488656744448"}, - {"evmos1lfpldpgmm9h2mh76dddrnlm57yu2uphls6kmd8", "93728241007070216192"}, - {"evmos1lfqyg0p2zg9m02lm3t3sv6p7nv4gnm3xjvsmq6", "812543554711928832"}, - {"evmos1lfrzvpzz8gglpcp0c82jhkf36wyp3ckm68nr4v", "179538174508142592"}, - {"evmos1lfyh3cnucd4wq9pnn8ynaf74kldk282rt9y8em", "670134866105212928"}, - {"evmos1lfza9rzul45dzvptjqzzjulxq852uz438l9xhc", "997295687456557568"}, - {"evmos1lg0yk8c22f5e47uz3wezm9nt2v3exac74mpcls", "469368427413487360"}, - {"evmos1lg2ksr33auv4tzkhv35w2gelzn2gvjgekd0gfu", "6678773764798650368"}, - {"evmos1lg47pzt5vhm2e32dyxulxwsav2l72kfdr936u5", "704069433124493824"}, - {"evmos1lg6ldxndm8hcpt6qvct580j3ncc0haqxcfpf8a", "6444760477960785920"}, - {"evmos1lga366plrs22w7g3e07pmhxrwl4k292u7nr5te", "419422675750588928"}, - {"evmos1lge6kgaqtnxvk8nufgnfwxjfsx5rvhpdj3e4vw", "275159171740736768"}, - {"evmos1lgg8fkux7ywv9tfhunxdfznpstmpk929y75kuy", "12230999272580057088"}, - {"evmos1lggdcnpwymv6tnen285k7ccm7vm85dpw7hhm4m", "2374747049997296640"}, - {"evmos1lghyjvq2cqr3upj8c3uyecvfhtwh986yzjjjsn", "69645659524765696"}, - {"evmos1lgjj6he2m09d2k5uq0ees33d85xaql5v724zqw", "23576293262454415360"}, - {"evmos1lgprpsrapp47ax9tepkpfqrrsmd5mesje0rk54", "404430531265648640"}, - {"evmos1lgqrmpa0htga4pp03mwxjhkq8xnq7dxwmlqpnx", "864949289966915584"}, - {"evmos1lgqwwvr8uaqv6p9tvyq2lxh2tcusyppcwkynks", "3038840918533079040"}, - {"evmos1lgrmzdpjk9fjddh04gfz7yc52gygh5qfcx53nf", "11307951393534210048"}, - {"evmos1lgsplpnzqd8hr2n92mj2nh7p7u57p2fh7w2acu", "1475435369761100800"}, - {"evmos1lgttgqvaqd5rv6uh7t5cygzxcm2de268vmxjv7", "21045986849263915008"}, - {"evmos1lgvxzcfse96kc8x5833ptg54shxafrrerxklkl", "5990197730904218624"}, - {"evmos1lgxt3fs6n2e4n77nq7u76g0ph073gzp0ygamav", "4588876040702502912"}, - {"evmos1lh0mxrzdruqs6z8nkhw5ntpxg86xq8m8e7ky5q", "3813227439100313600"}, - {"evmos1lh4qqan274ckadafwxz9lvmgx2axyercl34mc2", "4906468029286574080"}, - {"evmos1lh6dnteej7nfnaslvq8kkjcrmf9mscd8zddsc2", "2971912669820264448"}, - {"evmos1lh7kpx08cqdv5punxsd3srt7p0etscjhfu3prk", "31877206820652785664"}, - {"evmos1lh8uzxyqq4me45w8pgzkpl2mhtd0l6l4p6hmqc", "30644918188113125376"}, - {"evmos1lh939tmhy5jkuvpjy6t320pxmmmc3ra4kmj9xc", "3052301930306225152"}, - {"evmos1lhejx2y6j3kt7p2ez92rwkm0d3sfnak0clcxld", "10493495702652350464"}, - {"evmos1lhepsurmuuk42ll5cqgvxvllynyxprcvf4pqzs", "748814015671369216"}, - {"evmos1lhfe5fcrcmgv2hdslnvfdr6hm9tu9r2q8t3qyl", "3862094260736475136"}, - {"evmos1lhfhahyxvggnu08ym93kna0ef4ty5pmh53amw3", "369080423287211008"}, - {"evmos1lhgkz7fchtfe0ul2w49w9tf7z4lnlxggfxxn0l", "14350158077591527424"}, - {"evmos1lhlqs37dx9xhcwz45mcemqlfyd2u6n52ha36mx", "2502367276562976768"}, - {"evmos1lhrkxlh2js5x4v439ukr0vvsdh7yfzc5frw7ua", "513629354211684864"}, - {"evmos1lhs7zgamee09szs3ea08upk06x4ydwmxpakh86", "2769587662078472192"}, - {"evmos1lhtzexssmqhadlrmzm5kthcxsmlwetr23m8c5j", "16204385617174056960"}, - {"evmos1lhu5fdan6cyu884y3lqevaz9fhckrzpj29w6kc", "196414502391500800"}, - {"evmos1lhu5qjx4y8wuz59gmucjjcr9qh9y5ml0f2guel", "4393697105480118272"}, - {"evmos1lhw77uqf8p6a7u5csded3x6n5cnn633va6msad", "1328625804537192448"}, - {"evmos1lhyy6fkt0r0p67hmf08jm3y00zwe6pzmnwku8c", "1636567201809257728"}, - {"evmos1lj5u5nh5yevz64v5lp4yda484x4k4lkjt3lf68", "714947928312766464"}, - {"evmos1lj6q0hdu46lrmjay576mgasahx9tp6sugyncsg", "385607461321715968"}, - {"evmos1lj7906r4r658l6mluytefd2fvhz0jv9kq385vc", "1390903244328779776"}, - {"evmos1lj7ax7k7rkwxkfmj8sdqja2lj4p270jmqpg7a0", "3673043418606678016"}, - {"evmos1lj9aps6hk4h34d2nagnkdpjh25z5497e4sd7v7", "13740253629874724864"}, - {"evmos1lj9ca03dn940k93hw0gqvdkddpcz6tsvawx6y4", "29039324974795448320"}, - {"evmos1ljc37nm8f8w4z742nuuqxhlvc87ez2ga5873rk", "3185200345992394752"}, - {"evmos1ljcddl3k8sv83n4c7enfpretys85qxh0f99748", "5249917485753782272"}, - {"evmos1ljcx75x350uxmp95pxeamveqkr888002n0ylfj", "9578827845621219328"}, - {"evmos1ljdpgmx7ykk9qxeqdxrlhqpzjnfns69qnu8dcw", "2511199656584052736"}, - {"evmos1ljhe5twugpswtmlmmhnaneyf4q0kdlhlkyu6g4", "1403166535145807872"}, - {"evmos1ljj3qk96ca7fjdjrz6v6yevusksrn0a9qf87d8", "3054013856511098880"}, - {"evmos1ljjk5wt8kvr4xt9ve6hnwg97f527u3wlqef4jn", "2817321245496485888"}, - {"evmos1ljl6fxyawyt37gm87ua507azju8rtcgcrms3gs", "143384084082092949504"}, - {"evmos1ljll6c5y0w0ffzy0nzxw0l99fa9n40zw0v67cy", "5189431420913032192"}, - {"evmos1ljvzd0dz6d2gp34srme9mqz3nwu32j7x9h5eks", "87620854136812470272"}, - {"evmos1ljx9ulzav73n2rme9k25l76g5j7szdslkzle0z", "12106834080334831616"}, - {"evmos1lk2a92hyptjfz3mzt0467pse6ch5wa6q8gljy6", "19551724764590219264"}, - {"evmos1lk5tfjf2q0svj4q7unsvwpdtwgrp8udvg0fs7n", "385664109764058368"}, - {"evmos1lk6fsmu3xft8k745c0fg6qjxpwf370d4yklcsg", "974168315228971008"}, - {"evmos1lk6zd79m6g27ev8zsfw72cuz30yu03klu5e4pv", "1465994422258950144"}, - {"evmos1lk77m9pw5f6yrqv95yczhhkc9sv5w5ugms5x6m", "2657489260430428160"}, - {"evmos1lkaaxxy06jr9k6ldw705hqcy7gmcw6469a7kxp", "1645148161009401856"}, - {"evmos1lkac9rgzf09yrrna8q0555d309pl8lc062y9dn", "884476769298240000"}, - {"evmos1lkaw6t4x2p4ydttfpdjrl7ken0u2d4slydngpv", "940650934035816448"}, - {"evmos1lkdhdw762j0m6nhjh2knd203uflydu85n8ycar", "9810063773136527360"}, - {"evmos1lkdxe5t8pl5wksqjmz4mnn0j2aq6dlcyqa87hp", "8912878927803928576"}, - {"evmos1lkhwchv9ep295fs4c8ch2r82dusc6u6tpt3c6e", "2621517894734733312"}, - {"evmos1lkhxyu5zxghkkvakc36fezla7knwr68w7s7qy0", "688975357117430272"}, - {"evmos1lkmzsgs56hsa2gmsrun8wvyp47n7ejamea63dz", "1526572598925320192"}, - {"evmos1lkp9ddlgjnf4l3f46gwnf5cum2d62qzhqpu945", "1421418029750607872"}, - {"evmos1lku3qdwfd464fywjnj7k0mrrj6ngd54m8v6xpx", "181089630409107968"}, - {"evmos1lkzdv73urqdydr9sx3897vkn6kwk37584mpkgs", "3742566566671106048"}, - {"evmos1ll0nv7gnuq5zzssmfl7m2lvz79k4xx0c4r9hya", "1674098734224003840"}, - {"evmos1ll2tpaw0zeexyse0hkydc2296jwtdrsszl5c7j", "2181994716129014016"}, - {"evmos1ll5cxzuu5t256sknrcc4l9cdg7jmqxnm2qpl4w", "914664269572256256"}, - {"evmos1ll5erdmvfuwwswt8j55r5f9wzuvm6acfgzn0u0", "298005145752803328"}, - {"evmos1ll6d5ekx2cfjtk2tat7sfsy40ualll8hmshdzz", "2629220186358890496"}, - {"evmos1lla02jn9avvc6uzw4rqtfrhw99nezg8kkvmeg4", "849609199796996096"}, - {"evmos1llazsk6v5m4dnefhy70xkrtdyv74u44m7yspyx", "1407617755972337664"}, - {"evmos1lldc69dpk3cgvyc46ttehj5dqk49hmpw7wc9pe", "6341332417400457216"}, - {"evmos1lldsq5nm550jg43877h6e7uf4xklphm80xtvh5", "6370314981353465856"}, - {"evmos1llev866zrcnx0fz6glr5ngmcqrezuu8g0trvmx", "27268779022494117888"}, - {"evmos1llf09xqzq3d0apn6kvf6jhv5putgmrnkqnpkz2", "3566152755168334848"}, - {"evmos1llfd77af5pr89yehfrwgdnn37ycl7n2sjm4882", "9047611927713148928"}, - {"evmos1llfsqwsc0kv4reymmgsx7v4xuajnvpp8sdavvf", "7662806559139723264"}, - {"evmos1lllr5zaz8nhz6ay3w0ae42s8405l0uj0p6cxl3", "176121259283534336"}, - {"evmos1llr6wy7h4mjfah76d4g4kvrhkj7qsxx6zg9stx", "505080061688438272"}, - {"evmos1llrwwyu54q2hw5sdnry9aen3xy7nlqyx7u79f5", "4745837641620656128"}, - {"evmos1lltl6zcrksh39ss8n5n30agyltj4jljkgavh67", "31510896172579454976"}, - {"evmos1lltsqy754pmg7s0eyjz0efm02flrh0nvnhnulx", "6514791438432702464"}, - {"evmos1llu4cw0ggrtet0k6tspnqxu0uts37kt7zh8yqu", "35536310532426629120"}, - {"evmos1lluj8adpq9hyytwmt4dh60hcz5540549uy9vrt", "309565549340311552"}, - {"evmos1llupmavtjnfaff8q0fmad0e0tscrfvyjadfe7g", "171746309307731968"}, - {"evmos1llx44pfdptevl340mw9suxfzh46wps9w4w7e9m", "8196780794669481984"}, - {"evmos1llz20a7ng5nvzll0mc56zkjd3p586j4h9gxgz8", "2245487405625655296"}, - {"evmos1llzzw3epghdkxw7a8fgj8nt8kx8pssc72zwjac", "118113836635771404288"}, - {"evmos1lm4ye4afdh8lhhrd9ekgzn45239tvfn8sw559g", "15803114541461626880"}, - {"evmos1lmadpzhvjnq9v7pte622zz54p8swqkune5ddld", "1002048288983874304"}, - {"evmos1lmawaxfaarmq250nspferdt88hpppq4pym45j5", "409273267789496576"}, - {"evmos1lmcf8cvgg2u99l3cx0kswq8ajdeshlwqhkl6jy", "457936331472100864"}, - {"evmos1lmdkl6q82tu3e6xvc2n89zwz8wvggy533djpw3", "148269216474976256"}, - {"evmos1lmgx6myj46ezqum4w7fm8gr3c5va96l7r86trh", "490280505737282560"}, - {"evmos1lmhnm04yfsgmen6n0e2ug0w7cc28n5ljnur82u", "46575372552461824"}, - {"evmos1lmhr40pk5deepusk3adsvjdn0nqjkvyn42a5dx", "4657858787294011392"}, - {"evmos1lmjt9npdjfyspd8dpheqhx059sx3nz9dva6hrr", "3103729420698648576"}, - {"evmos1lmkvxl4375txzaak8ygl8aq693zea8l7jl59l3", "967975159765636608"}, - {"evmos1lmm3w9f94kmgx35xkun4jlhelcm4g7h7jmrtjz", "634355071852675072"}, - {"evmos1lmmjqv8z3knuf59yvh6qfyatv72uzw2mnshap7", "21108498925221257216"}, - {"evmos1lmqryjey66d9gqmzpjssqjdjl3wfk6evn40yvu", "799479821017546752"}, - {"evmos1lmt5r6vfea3lfqhddw8vsywqnasgt9077g57wf", "911693846514061440"}, - {"evmos1lmtk9kga7j3ua9htffpucqq0nm80yckhg5nggy", "13264788083347271680"}, - {"evmos1lmua3fhaqje2xjrc6vtgs03fxwzrex59ee54ca", "26410963467810992128"}, - {"evmos1lmuy47xkgt66v5uzvs874lt5fjmdllq0lq728c", "1119731229664120832"}, - {"evmos1lmv9s3szx7m25wlushu6jc6pnpfp65xayazkua", "42883850722174812160"}, - {"evmos1ln2uedv46zw9krzlx90h09ctggyprd3v9rx9qu", "7388235603067432960"}, - {"evmos1ln32a5a7n4j9q8rw4q57v3vqfyhrhhn0grp8g8", "1507629411832392704"}, - {"evmos1ln4sy08sd20hchv3ls4g44pv5dpk9ca9c3rfhx", "369026919007868672"}, - {"evmos1ln4v3u2mm9tsg0uj8etyk44lpdyeyyznq54ynz", "1493297890402128896"}, - {"evmos1ln6pww7z008fd9e5dex0xduvlytq7mchqk474m", "21319043769027485696"}, - {"evmos1lnczyqqlapu3qkgzm4w2hxjhu5xkrjfd9y7gd4", "710900375483052032"}, - {"evmos1lne0talpkpy8avnq6r02r848vmevc3hwgsw86h", "40482977749362688"}, - {"evmos1lnf3k7llgnffuhumrm2v35w6v0y05rja8qjw0u", "1275017601498105344"}, - {"evmos1lnrdpanjjn982m33xw22vezuq838txaaxagl63", "742674392107360256"}, - {"evmos1lnrryjavmteprq6r4plcxy6h7p92dwcq4u5ga3", "659125013582065664"}, - {"evmos1lnsyzwadfevl2k2xv60x0rkvl6rhwamh3h35r7", "63322679465905602560"}, - {"evmos1lntvpex8sn6a6ye2ts5k7aamdxxw99elzcv0sz", "6415986254731018240"}, - {"evmos1lnupu834dnqgm2e0z77wzrhe8df6hy03wymtug", "618409162111731200"}, - {"evmos1lp0xjvtrvc9wprtgsj7zkufgwr9y08rqm64fr6", "420724273989121536"}, - {"evmos1lp7ep0u53xyvpwllwx3st6drn4rxkt4vgn6ujd", "274325970123810560"}, - {"evmos1lp8phq2ewkyfn4lk5ks6x362mk6zj2tk7v9r7h", "8102603598246400"}, - {"evmos1lp8ve37va9dfsn220c9y4shycv7w2vtr7r8xg6", "29420927561255370752"}, - {"evmos1lp9mzj7mu53wkkh4mler2q4x2hhz0lc307rwkx", "8283796323015559168"}, - {"evmos1lpdvgkm82ecuj82z3vzhyme3we5r2y9ltfsn7y", "1386884088575324160"}, - {"evmos1lpdxh05df3equpfya0u58tg8nsseggkqvz9hys", "2975161882782418432"}, - {"evmos1lpgdheqgqpnsgkuuds20ra5ryc5kexse74hk06", "5102819990006994944"}, - {"evmos1lphkyg89vj85e3nh9zd2t0cu6jgxkpv5g37vvs", "126635873178204928"}, - {"evmos1lppkqa3cld4sk2ql7vutr77y7vekclym4rz4tc", "4883809132344724480"}, - {"evmos1lpqvw52zlqdp93dc97v8dm04llarfs734w2wp8", "3783281445738114048"}, - {"evmos1lprr6azfqzg7atxfvfxhxq5zsrxxaek88ftnx3", "5411633554999283712"}, - {"evmos1lps8pmx6jn8kcumnqyrtryzwwj3ym225lzrh4d", "412791985850161664"}, - {"evmos1lpslry340ywvl6adwj8zukqvzk8h835tvmk3u6", "3626023250388885504"}, - {"evmos1lpu0l2xa50y56felurf8ewwdcee9pa5ttp66vk", "42455459818128211968"}, - {"evmos1lpxk2uyvchfvdxdxyxqyjetkcl4u6cfkv9gulj", "476224143032905728"}, - {"evmos1lpzqsu0a6dupey4qqfzajtuv52w7hegl7qdp9r", "6483802375612509184"}, - {"evmos1lq2rg6dn8xuc6tcw2nru4c4ynhtsj38p789vtu", "1101585907046569984"}, - {"evmos1lq3d8202e8mj9jws0gsacc0u80kdgwdnspvnzp", "3414422622971166720"}, - {"evmos1lq60f48sdccrrfuxgq2avlc24epvgk5ucy23cn", "2865146459148886016"}, - {"evmos1lq7jzhhljlrhazr0raw8wlrpgtn8p637mpy67a", "587512651511873536"}, - {"evmos1lqazxm9tz79v5996tw5tmeawrqy30qmaffnfx9", "1599854188213951488"}, - {"evmos1lqfeulxr69har4xe6dzmhz92jtjqdvhmu7p8z7", "967945441553700864"}, - {"evmos1lqfjt8jkev88tadu07cxprllur2v3v50l83r45", "314841119445248256"}, - {"evmos1lqg9vp52tmgxew2x0txd7aej7lfkn3q6s4vd6f", "4224969970399523840"}, - {"evmos1lqka6pty3e37mcgzklkxgd4zj5g8cn0fspwzuh", "3420243589257155584"}, - {"evmos1lqkxtk87aw036ufpmzqvy7d9rtlkcqmkrxzz8e", "2076532349360708864"}, - {"evmos1lqluru4f0e0szsvgwa0z9r0fq3xwnzhk37h4fp", "640648350228250624"}, - {"evmos1lqm00qkdrm057fkq27hrghjl23zhzsrelm3ls8", "894564314019807232"}, - {"evmos1lqn78mcewttsw96sgj29utyv5tkyfecvgqa22d", "15037725773727109120"}, - {"evmos1lqrrsk9xpca0c9tyxxqjfvvf6zp8q5at6rfyxs", "4228916548488294912"}, - {"evmos1lqseh4x5wj5wm8jqg8tv4cq5vle7u8jkr22hl3", "14046232749168459776"}, - {"evmos1lquqgcqp78m8v6ftpnrc2vtez2v60ku7v7sqjs", "1057115656725778432"}, - {"evmos1lqvlp482d0rk48pwg09ymqx4ug9d58hhp2x8d3", "48579524926706024448"}, - {"evmos1lqznjuysd0gsvqhqhf0ev2x7sez3vfmtrfrpmq", "314409140100665856"}, - {"evmos1lr24evlh5vfmsd27ku4e2qxj97vpr9y8pn5ept", "197184814985507840"}, - {"evmos1lr2aj9yl3f88ga4h0esnwdjgcqzt790fxr96zx", "5863307068009119744"}, - {"evmos1lr782zgtwleul58xaj2csqalf743wtrszpxaz2", "27924464384213139456"}, - {"evmos1lr8kwhtmg8r7qw0dqcpry5yegsldwq0k6u4xaa", "8352393825965242368"}, - {"evmos1lr97tpd6qgclrsz2nunvs0zaggv0c5ukx8653u", "39229954284731105280"}, - {"evmos1lrer856ax4kvvmj0wqct2a02xj2eede6txwha0", "769757489744953344"}, - {"evmos1lrh6y344lzsqxx7cs52cewsdc8f44hkmrngz0x", "81502878241876736"}, - {"evmos1lrjdkg4pg72gjprcag7rqgfw5f4jyyrd9kmd8u", "369474239792067072"}, - {"evmos1lrlnma654p5evhjayhgz83edkp4eytakq23mm6", "225691269015301120"}, - {"evmos1lrpe2fkp32zrcdv2ty7uv846w3um229uzfxjp6", "367816398346526976"}, - {"evmos1lrqaeymr5ar790g5qhfjky59thxp5tlu8h0axn", "56503907248076288"}, - {"evmos1lrqfyzjac5le373822vnmc59sxvuuxh4669n0c", "412635122024557056"}, - {"evmos1lrqrpp8x5rszrhg75pz9c2jwy5eec7jteqs7g5", "486084208645658624"}, - {"evmos1lrrzqdwkrt5zywxqwrxzzfts7ldkehj66f985l", "1218056523501819904"}, - {"evmos1lrsd506k67zpza0vu9crs90s3m8qptrhwt7sqt", "31985206394650886144"}, - {"evmos1lrt8hpnf95m5gc44wxzmqm94nc6m7872w49cyt", "7927328392562704384"}, - {"evmos1lrtpe69we9f7wzt8u8fsqdwfknrluuvp9uw9uy", "152568191714359574528"}, - {"evmos1lrv5e4862c9wd9y5u0q4mj3qjva5lpseu3d4gv", "20464579624476172288"}, - {"evmos1lrwhyeaaz5tjlc5ct0hkhups0sj7njjl6z22lx", "722368392547213312"}, - {"evmos1ls0j3mljd023ex74hjct53ugzrtds3x3gfhddq", "918683370575794432"}, - {"evmos1ls2rlyem4kl0unnkjprhghxz8cpdur5srcytdp", "23690543218984542208"}, - {"evmos1ls5pjm405em2wuhd0lv6k906eqlga8ajdp5xev", "17006940814502109184"}, - {"evmos1ls8c7dgjpjyq9h4e9nq5cnn0erv6flfp8e0gl4", "2733990789001478144"}, - {"evmos1ls93zh04amkg3g3xm9fxkfld6dsmw6qpgfh09y", "8357885753376178176"}, - {"evmos1lsdz70325uq72x0m8qj2elgpgg3vsmt5w07grh", "22152962087754448896"}, - {"evmos1lse5ujczwcpfs8v39kaqstvxek67y3efk5t78p", "2982947256002097152"}, - {"evmos1lsk6tyvgaat30c3cj8qxz05pqfs4hwzvfr6k89", "12198679555550119936"}, - {"evmos1lsneegf5lj5kxhaslf6vl3pyr82cewxrchz6es", "2383428818678458368"}, - {"evmos1lsnquq6qpegkz8rclgmdnegpv6gankjszcrxf9", "2211720951644261376"}, - {"evmos1lsq2ftryg60mdkl6nu3xtf337d8q4w993cw283", "31489964782209552384"}, - {"evmos1lssmer03p0em09htgaj3ek5dw6a0szwrxd4tr3", "655479774518874112"}, - {"evmos1lst4s04kxydjlqkn3l4t2h5aawx5kefpkpgl7r", "23793346300880128"}, - {"evmos1lst6u0ead0au3z7jw52sxtv0vm3uu8t277pjvw", "1857900908941950976"}, - {"evmos1lst90t2y4y069qzkx4k2cdndx7e3r578uzqrqw", "443669133363954432"}, - {"evmos1lsu3e06t4gkww8prkvkmxemc5n3m3kyxgnm9vu", "119639775609826820096"}, - {"evmos1lsv0c06v0gnhfmfeqkqut6exxfsyvw64q007l5", "2558530296192551936"}, - {"evmos1lszerzfmp0d5xgkjt0w58yz24x43xu2q2f53rw", "1661239636158012928"}, - {"evmos1lt33syrkd845k2v5avkvplze75t6mhqgts7z4h", "3207391155808664064"}, - {"evmos1lt4yuf64rxursdn8acz9v4g57nw0gttkcpcmwv", "3204007846332823552"}, - {"evmos1lt69lxzngjvwwvxf5yew6djs9acapnlml9y6z6", "1413613030427598848"}, - {"evmos1lt7e8rch4cazcjzjl785nljhn60mwkpkv80mk8", "18273007795756343296"}, - {"evmos1lt8hxqz9juu0vzcalufpgz504a53furrwtzpnu", "21334507777807081472"}, - {"evmos1lt9du4svrx4pjfawfm0w3p4zul9yyjekcktf27", "11731447408121835520"}, - {"evmos1lt9e4dj2h0tnnwjlqea8vxrg2at4svwtdpkm3d", "883168629496881152"}, - {"evmos1ltany4pfx524t7dym7agg63uzurk2uzx5zt0gx", "2351049675647544320"}, - {"evmos1ltdlfydhgq4vfmvx26jnf5el0ckh73n4rwrfnh", "4391809345337758720"}, - {"evmos1ltew2h0v0p2xjua7qhfngyqzj8kdjmncf4lhvj", "24453376114169516032"}, - {"evmos1ltgmks5crx7fnmr3gjwq33s9jw06krk6qfhlwm", "1295332676904320000"}, - {"evmos1ltmqf8h5mtu7rgn5mt390sqfprjg9sltx23yz4", "2093048962121228288"}, - {"evmos1ltq82tmygkv6vv5448rkjqam2vaeghguedh337", "942517679619301376"}, - {"evmos1ltqx5uewskdnztaherqyeylsmvexajrkmvr8c8", "1537603955198324736"}, - {"evmos1ltrjqftx6znry0z07zsxegvvnq5l2mwl7077ef", "1811034572150919168"}, - {"evmos1lts7ugejkngqds9lgp9ywy0a5sn3jxu40z9pmy", "12165268950825435136"}, - {"evmos1ltug7xwvwn5tplp6zs7t9vxlgvv2velp7y2j94", "305229895863117824"}, - {"evmos1ltwjvc5m7nu3ukcmgykfpngwtfcq5ua4jt3maa", "4143312958692102144"}, - {"evmos1ltz7uh036sgemthtmngu9m69p75gaalu8579ad", "1415243772630097920"}, - {"evmos1lu0jcfw0cn3fcgna3drrpmwmahsj6ctmpyarzn", "3106417789879312384"}, - {"evmos1lu2nx0f8wkgr062wcaz4qt9qfqgy8gxccwesre", "3606670506311675904"}, - {"evmos1lu43g6yhj0c50chwtdrhzzgfkqrkwl6ve66tek", "2227948222512709120"}, - {"evmos1lucdkqkn4slrr5j073hjtlqmwnafjlhh2e7h23", "279420214047375360"}, - {"evmos1lue4zlyutnflvpgrwfn36chzegx5xx0uh89dg0", "11637475433921599488"}, - {"evmos1luhc2uxelye2jl3lex0cnvkwuyklkuje9r4ur8", "19044153243081531392"}, - {"evmos1lumdhqar5rl6xu29j3pytc30hvakctsk6h8ye6", "3267817539008517632"}, - {"evmos1lupwkr8dcn39rf6wtj9ujcpq036zalzz690f7c", "4815568296744937472"}, - {"evmos1luqd3rqmyu8eh0vjgt48u65q439xfz9ephd7gh", "389267935349150720"}, - {"evmos1lurhukqczxpp6nwed8jaszxan4hyhsrkfehd5a", "3415310878378400768"}, - {"evmos1luuptv4dxqsjx7wlml8rhg7328mx7vjw2wkvyd", "771170920154077696"}, - {"evmos1luvqjjxkzwat5x2ehrvvn6ttjj2es28euyj73q", "2644667747830239232"}, - {"evmos1luxfnrvjzw2d38zkf9cjggnz9cchyjqv845c23", "106337828372353024"}, - {"evmos1luyhhnzk7vngd27rqnff5p3r97ps8egy3vzyl3", "1655973221860302848"}, - {"evmos1lv4s6awqqnha0vu9xp2t7gxw4eq680nfhth84z", "90709119458017705984"}, - {"evmos1lv82ghu5fctgyl90nqjp0wvwlzuc9e26wknrhn", "4055317919135629312"}, - {"evmos1lv98fm35nathv5uelnlcn62wp09r9cqu8td2uj", "1241898700994019328"}, - {"evmos1lvarz7xu72ue5y4e39nwvdn6d3u3nmug58mdf8", "1870975635713725184"}, - {"evmos1lvd59g5nfhp2xse48y5a969w04enxut4dyr0mt", "27110686020775084032"}, - {"evmos1lvgct9u20puauuj3xnn59k97085m6rrr4qec8x", "666958439610701312"}, - {"evmos1lvgv0yua8tr87jldn7sv40q62qdqzc8vctg3js", "35888541297983606784"}, - {"evmos1lvkns7uxhnk0p4kwst2phjy89l9y7wfjck09y4", "903922719380400128"}, - {"evmos1lvlknpd63vkzfxnqd68lhkajnseg02xfhs4773", "4726885966265595904"}, - {"evmos1lvm436v635y329jty3yn5ee5tpuerjc8g3ksvp", "13516192639968169984"}, - {"evmos1lvm7s62sax7rsmhqscekmfl8uhn6hd8h9fnv0l", "3946944650123579904"}, - {"evmos1lvnawjr3f93qrg4mzgfnwy6jg6tr956gwh6hdw", "1459464544509124608"}, - {"evmos1lvra90009h43a0kqq9jyk3ej4dmjs8r6sazrg6", "68479950511890944"}, - {"evmos1lvrvg96m0us02u9zdtjkk24ad7khyn4khu295h", "8346154025117722624"}, - {"evmos1lvrxmsdrkvfmwszazsg2xcl6nwsd2nayfp0zf9", "1883170521658987520"}, - {"evmos1lvsr5av036jzvjh6xctnlp56zkk5wk3ylckcy3", "1052397150500366336"}, - {"evmos1lvt8e4t4m5np6g73ne7vupqnejhd6qnpugv4wy", "52265966409224704"}, - {"evmos1lvtk52kfht0xu69q5pts9qwvaswy5s5cqlee5s", "1155341735167265024"}, - {"evmos1lvud8yjtvvhdn6tzwxh0hf8kd7pd5sgffqqett", "12724653550974828544"}, - {"evmos1lvxauptujtpzlvp3xe2sracvha7gcdykwm4nqg", "7782749662602377216"}, - {"evmos1lvyhtwwzaujyg2xj5y0wtt33ecfhhxkxt679yd", "96525512729447680"}, - {"evmos1lw2yn4juqjm8jz38zne7v0z7a5epqc6vmv609x", "11189172774919196672"}, - {"evmos1lw7h463895466jt8wyw660ey97j33kvhj5z9ng", "1669003193311441920"}, - {"evmos1lw8984ykf46u8h7hcglqh4nexerlvlyv4av3wl", "40629245827339853824"}, - {"evmos1lw8wfxd84lkdjt26w7rdd6texat8wwpc4gyxd4", "1002337373056690176"}, - {"evmos1lw8yt844wfcurwa72qkk62ru4jtqxam6vj5ewc", "4670395203751047168"}, - {"evmos1lwf68hc6kmn4qncxlg8uvsw6hq06qvfdjjqtfs", "16089010007192401920"}, - {"evmos1lwfkk7355ykyfnxs0xv7kkv04znev2qye54lez", "2570384163222026240"}, - {"evmos1lwh9emvmy262h38ew77cpwmglk8rhqy95k7xug", "299616060293672960"}, - {"evmos1lwjgsplqg9u3j5zgn05a67uggu3lec4pcwzk8p", "302396462652407808"}, - {"evmos1lwkr25e0q6szngdzjcjgxr83r6zl52lx5avwac", "5136576739614574592"}, - {"evmos1lwl8k927rf8cju0zvp8js7295q3jsdsuyy3jjg", "1423555285838848000"}, - {"evmos1lwls99hsc7mrptl0wgd6cddp9gcvyjcpqdw648", "6194666130936918016"}, - {"evmos1lwlwsnw7v2z0927er6yq7zv74h96fw6ly8sj9z", "5604668706313302016"}, - {"evmos1lwlz0mq0jlcznnnmpjfhrs5tauuq2kqrz3w02f", "3903086649099354112"}, - {"evmos1lwn8fkamltlddk5cj5z3u5sym6pyxfdezwxlcl", "190638690491554560"}, - {"evmos1lwnfyx9rsta0fxzc5zw4usf2urp6qycu96am2q", "12696938907631759360"}, - {"evmos1lwngkl20jn05su93ueklcy5eqc0wmkvtcef7g8", "9799883174126870528"}, - {"evmos1lwqvjzet29p4rupt0s9kffc7uvn6mpr7xkavrq", "2163679667664879616"}, - {"evmos1lwrcul4gq7zhugxks7eve73mqy0jgmtsnsvz4k", "9610808693288730624"}, - {"evmos1lwseqhmd26dpcttp6xclmmx8j5d2kdalfh8xsu", "2658968132526661632"}, - {"evmos1lwvglz4j0g4y6r6jw8qz5ph99mq4kd0ldk45xz", "4959721837488056320"}, - {"evmos1lwzpt7gsdm8jmhrnk3x5jgf3ufsd4885uc7wty", "3058020835696586752"}, - {"evmos1lxajp8aqekqnffren4gtum4znl4t8lz75w4chc", "824397818067106816"}, - {"evmos1lxculypjunhj9v92urmdwaquepgw23xzcgue44", "1907027493662788096"}, - {"evmos1lxd637qaqdrtm9avr7meyl97v7l4tfua8h7664", "15038494024088014848"}, - {"evmos1lxjc92kanfm7rpryyfav6swfyl2tw30p5p88gj", "1575151437896826880"}, - {"evmos1lxkn40kl3q9zd7t8qqxwgzwrv9w3fs287tdswt", "3672153077325607936"}, - {"evmos1lxl9cgjvea3zfdp2cscaadem66tlkeyej88e24", "6505332353148305408"}, - {"evmos1lxllc58xm6ndcpjr84fjtvvsdhsw0yu0mpsfas", "27746986338458071040"}, - {"evmos1lxprzdcsytsszd6995jvv4a4uy4kqvn3238znd", "3591727452868456448"}, - {"evmos1lxptnn6lnpxdfp3g2jz5psg0aaal4qdsn8ajwm", "196742487395948544"}, - {"evmos1lxqj6rzk7drv2sh0pn9merf9nr9lqgcyvr6wwz", "60416950366567268352"}, - {"evmos1lxrljts2z588ytv7huzr7rfaj928krajw8ah9k", "99439354526658304"}, - {"evmos1lxt4lu307espd9rmzrdwq54mnl669rr0k568s9", "3629087657115156480"}, - {"evmos1lxtp7dkgycjkrcy0gnhgfevjlgexvsfxdrtx8c", "23166871341926981632"}, - {"evmos1lxwv3l8mtgjjq2kh9gj59e46f3n4kegxt3vnlf", "1203908521373017088"}, - {"evmos1lxxsuw2ya0d6w899ralqgl9ls7p7jnes6wn3pq", "4092169007375495168"}, - {"evmos1ly2cqla0fddwzfdva8nz3wznxpz6drscpaf5gn", "315651091505476096"}, - {"evmos1ly4090vqh4yv4eagt5lfs3s3w66d3rtlmg22ju", "26663980843342991360"}, - {"evmos1ly4qqnknkfpngq8hl733qc9ygp9ddqwahz3vpx", "6364849539907956736"}, - {"evmos1ly5murlmv346r0zhkt434atc2ttq0k2hhk4ncc", "3043424754330247168"}, - {"evmos1ly84dtapmt5ztk6hlsc9ktu0rn8nxaf3wujpl4", "12114782378495725568"}, - {"evmos1ly8cwffrwyj7eml9d9kd9d2dn45nf4r85hl4mh", "90149404373155840"}, - {"evmos1ly9qrtu3g684gxxd5hkkkxw9z4gwk56jymdfec", "835284431133556736"}, - {"evmos1lyga3z74xhw54qzrvlyup7928nnce9x47xh390", "2183364487164436480"}, - {"evmos1lygc5dujty4axg4z0ky6wf564arghzthr3ydj4", "391183450521118720"}, - {"evmos1lyt8r8rj28ssnnear2thkm9drx9kxrpjzc4300", "5942415788640952320"}, - {"evmos1lywpe3svhqwg4wdqah74nr0ysd2qxj52gzw3ap", "39119316490997784576"}, - {"evmos1lywuqc583048quat3c9ch2axne734rk09d6q44", "4482732116477767680"}, - {"evmos1lyy2le0039tnwqmglyhhntrw5q4dfy88umtd3f", "15498865792506308608"}, - {"evmos1lz0zfr34gznjxqugley23h6w996eyt8njctcfp", "1546711854834962944"}, - {"evmos1lz23t82vphhup9vtaezt4w92qawyjwvt70u5ff", "2970758252595275776"}, - {"evmos1lz5a09vchzwcpt9fwx6cu26m6rlgfz6xnr9zqp", "4524136225203781632"}, - {"evmos1lz5pk0r44magk9latgsvfzuy2zl4mukh95khzy", "7685438772480399360"}, - {"evmos1lz90e70hjqswxut03rg0j3qmt6kpyff93whhq8", "7404979229742759936"}, - {"evmos1lzcvj9zn88pes99nlnj0j8856pny9xs075acty", "1718739745300601856"}, - {"evmos1lzjzmpr5avnq2pl8ltx0ku7lx702ne8xfdu9mf", "1435746939210919936"}, - {"evmos1lzklvx97jylpvynprcvpj387cvfs53fkd5lfup", "5909394793564407808"}, - {"evmos1lznuwe7wlcwmwfnff4yneg5snp7rexms66248r", "2107912150799569920"}, - {"evmos1lzpsf9c6p2qhcxg9a0pd2cqwh49s8a077qcscz", "911447456271728640"}, - {"evmos1lzslz3an8scmvcn2v4323ahk6ee50s64r9z7du", "2227149426204983296"}, - {"evmos1lzvrlt5plcyeceyr3nlv2dyum7kest4ule5g7f", "1372707959465800704"}, - {"evmos1lzxa5eact53w65kx0xtkrjxwky4nma9xse58zh", "6913456325659344896"}, - {"evmos1lzxx76cgp54yxapaxjfq69weyvkmgr9crcmpkq", "30307870536164700160"}, - {"evmos1m024zfgfujhamxdqxuhpe2uynxqm5z02djj78z", "3982182912247090176"}, - {"evmos1m03h6yey6yg08cxhlfs3lhszedpjdttdtvshym", "6629548543351177216"}, - {"evmos1m04thr26yqgv993ekf05ud78787s2ujave92ct", "4902807291969452032"}, - {"evmos1m07gafypk7j3wyudteu2clwl4gsxcvm4l7gts8", "37066417655115464704"}, - {"evmos1m09v7vxq7g8jcz2qf4wjvk9zvxw6vrjjzjygsw", "39310327803878916096"}, - {"evmos1m0ag965alt3cr0qyystg875wmk85zkwlfxtquh", "1573363112935401728"}, - {"evmos1m0agyzl67864ktzdkhtj2mhs7tre6qfxmaw9hc", "302860103888378368"}, - {"evmos1m0elk4cye605mdcxlexec0683c3s0qjjkxaxva", "25679719824993017856"}, - {"evmos1m0j7k4z2tyf6ecza07a799kqz3kyu85m2lhyq3", "413280449952813312"}, - {"evmos1m0kf2cc47np8lwhjfj9k3qkfme00j954phgc84", "109412286401590272"}, - {"evmos1m0kgrd82kz6jxndanlmug44lw5xh4yyxm9jgkw", "1084243343503630336"}, - {"evmos1m0nlj76fqd9tdx05ssjh6qp7ecxfhksngzk86m", "1617435669960830976"}, - {"evmos1m0t4lwteke96x4k8zhmhxmjmksd9j0er3yy0ml", "2216883890482670080"}, - {"evmos1m0v3089a3ft00638c0s6pr0wekjnmhlv2fqm35", "1847815184243679232"}, - {"evmos1m0x73rernxw9py4n4txdnddz43eprqwuwe60p8", "1112642655405205504"}, - {"evmos1m0xqq6xtrjkwml0eas7z76kjqf0cdaugqepev0", "134008473722615775232"}, - {"evmos1m20ku46gcyal0842kkau29fnf5tdndlzysgdmt", "5283757806007353344"}, - {"evmos1m223x8xmu2x43gsv4tc64dxrj7sglch6x46we8", "4028097417190289408"}, - {"evmos1m24n6eju5ftsx765p6gaj2h4jxzjpkn6mynsjl", "463010850272043008"}, - {"evmos1m275wgl0kf7wtgjfhsxa0yxgvxcgf2cv9n2vnr", "2170166570753728512"}, - {"evmos1m27wf8enxs6d5gy9zp8u4e6l5eq7esa9l3xz0f", "10026547924299855872"}, - {"evmos1m28jyfc20cz3hevmk9p97rjch3hv0t9l96ygfe", "6980157825737510912"}, - {"evmos1m2a5x6222chc7krfjxu0mz3u35quzjwnw2y7nu", "462296080757195008"}, - {"evmos1m2ct4dnjp5cezzmlqs977nrluss5ve4w6t5hq5", "36049641326905794560"}, - {"evmos1m2f5m9fzrucca7myfsyl6kzrpezp49yazd6wqf", "9503115052717139968"}, - {"evmos1m2gyea20dflrdndcqakp2enap7sk27tgvczq23", "108137018892883787776"}, - {"evmos1m2k9lwsgy7u0cgvrqrxmcsp5tee6d0cun4ldqh", "4986605940637462528"}, - {"evmos1m2kkq2l9hspf2cdn5gmvsxk8j4ptmd80x5v9zg", "2223088898507816960"}, - {"evmos1m2nkdjahm4fef7hqxs6h8qvnm2dthhu4w7tepw", "2156339210231017216"}, - {"evmos1m2p8347hjqhukkv523c27jq95yhfw39qzjqzz7", "1608082474519977984"}, - {"evmos1m2qphpa7zrc986cwsmx8gmv0xle927uwttx3wx", "953870291246402816"}, - {"evmos1m2rrn6adu5gxqaq5lcukaxqhz2qwaph3gwqsah", "395979389866853376"}, - {"evmos1m2t7wpg3vmmanwem0t4fl03y0a64gvr74k5xzc", "7184652916589539328"}, - {"evmos1m2xlt9r98nj0zg9w2jd75ut3fquru2pfrty53y", "5152032559001424896"}, - {"evmos1m30dl6mh00064pg7hk35cyppvfec9yx65t8va8", "154774491934172971008"}, - {"evmos1m30mfespl8gz6m9c3y6n9tjhzutc5ltcy9nys8", "1779842524150996992"}, - {"evmos1m30nadat55cy4xyyr62tgw6pmmc9jmlrqd4cjg", "2216774650560302080"}, - {"evmos1m30ndpgldjrav28r0hqz43uaevkdvnq50txc6l", "961151419634878464"}, - {"evmos1m30sjjcz7qmetg6zmg5hkn20a4qs67u4nxe2r0", "6114628529747853312"}, - {"evmos1m327x6em6ltsmpqavgjlf93ef27ucpl0fc4m2e", "5628595295826903040"}, - {"evmos1m35ulgwhx9h3nefu47s5q7w5006qa44laujn6t", "124366937548194545664"}, - {"evmos1m37vglnpmxqa2f6lz4zyh85d5ymd4zrh5g7mlt", "3623865120749384704"}, - {"evmos1m38j052newmndy0w2lvcc76n8s97x87956t57u", "275818883426894053376"}, - {"evmos1m3a6uexswr8q97e0acddgkl2x9gx483p7gzh9n", "489478960143642624"}, - {"evmos1m3dj8fgqrat9n276r74rq7h6wd5m8nandjf336", "105943757453942528"}, - {"evmos1m3gc5af0v0ns4cweqg6eccnlcwcka2l5ml5833", "884454669581430656"}, - {"evmos1m3grk2zgmp4aeeudtwc8c4845pdte7n0dty6f3", "9115446048209125376"}, - {"evmos1m3jyc8vgzhs7ee98d6m4ygk2qncua7ykgj3d3q", "475393019765004800"}, - {"evmos1m3lnch7pec3w3k8jcdgzjp2mesrw580u4e50ph", "28796752911162560512"}, - {"evmos1m3p3egwm3sxextf85jykzmhl2zytj9xtcweukg", "338741173535823872"}, - {"evmos1m3q5s5lf429skh24jaqtddtcs9r53ntczzrmpp", "1493611345748553629696"}, - {"evmos1m3qhnjfq5a2g9ff477uujhn52kgc6827h5j4w9", "2914572928380302336"}, - {"evmos1m3qx0rygjk996s58f40zrupaa4z4rqfqpta77a", "23045655090279698432"}, - {"evmos1m3ttt7s29cvnndz5auy47p4m0rn9jampw4kzqu", "3621316527398236160"}, - {"evmos1m3xdselmwmdyujpy72uqg8mh5r78f57csupd9y", "8003508763112514560"}, - {"evmos1m3xx0nl8exn9maum477cz06ep0rczq76r79j4w", "6386388149049290752"}, - {"evmos1m3xyf9pml0ylslg0rls366dyhq2dxcyv2gk4mz", "35894888700661248"}, - {"evmos1m3zhwzwqrj6fyzzpa4fjsgljw56p8cnpkd64lt", "1265998226205526016"}, - {"evmos1m428zjeu8zyj0tkxmyf5vg0r2jvwrzw5pyw3gy", "538752347014485504"}, - {"evmos1m45scqy57umkgk6uuhcmu4x5jx94d6p84flu8v", "8146431670600007680"}, - {"evmos1m463r9g2tsvd0weg950385d867uw594g2wjxl7", "11505003767760064512"}, - {"evmos1m49qpcvhw5f3hjnp8952egs59f6crpn7pgmkgv", "141224813169373184"}, - {"evmos1m4a08upkwg6npjnh2nwzjja74ll6x4lkkjzsdm", "8120746093867314176"}, - {"evmos1m4d85599ts9xeyeg22ppnweljezqjfsjn73uv7", "23893857827420200960"}, - {"evmos1m4e69wrhvvdne25ah849xdedt303ydt3r9vgtw", "722075303243320064"}, - {"evmos1m4h2k5v0yesv5m9ljj9947ntqn5t4z0aay7hzf", "140976647352590336"}, - {"evmos1m4hcpxa4wx95s6c4alnxkj9d8ufpxdlqkp348l", "5598560994228830208"}, - {"evmos1m4hylh5s422q2ze4psd3s5fu4wzv5evx6jk9ec", "8830541612694702080"}, - {"evmos1m4j3gdrhv3a6ue9xaqgwuc5744jz3w5tujxrz7", "864801798272837888"}, - {"evmos1m4jvp2t592l0mpdtk6cr3lud9fgdjekpl5rafm", "1011708280288420352"}, - {"evmos1m4m96nzkwgxmw6kl3vhm6trf82dn80y54zxc50", "2925429512042692608"}, - {"evmos1m4ns4485try8es7835ajz2mtxkdr9s27h9fvgx", "384464513876745728"}, - {"evmos1m4s0erju00urt2mqgdecwdz2q6rfyjrgvmqxl7", "4051207922008530944"}, - {"evmos1m4s2kwqnr9fj3zkhwu4wp8j0dkcwxaxppvtcd2", "1052171578157410816"}, - {"evmos1m4sd0g92u67glmg64m6fekxkd7jds90qjumxuv", "4852243365700801536"}, - {"evmos1m4ut035ck8gh87hyzpz2zgqqnn9nsllpj3v0r6", "921536752563135488"}, - {"evmos1m4vyu8wg48fdrl4ut594pcjp0nc8p7rmmjlxkf", "639284102603897344"}, - {"evmos1m4x6xn87qt6cc58qhq7xj6ypwzlvymrs0r8ljg", "3763615714139579392"}, - {"evmos1m4y8uppm9z85zx2hxkzkc96eu3ss4ta0glp7e8", "92452130590102784"}, - {"evmos1m4yxx3uhkgnnhlrr9hyk6q929krchmzuzddng6", "3744049256065979392"}, - {"evmos1m55jg49sjzqte9ejcf0c406t3p675ly934mv3p", "3325617479757524992"}, - {"evmos1m574ek26zc58gqpmxskdhg9tp4yuqu57zzwwdd", "1487372774522724352"}, - {"evmos1m5azz02aagjr564fuy2vvs85y0euxsv2yfmjug", "3520917172963024384"}, - {"evmos1m5c0pltdrn2ql3dfq8acy4kxelejgde3yd0q99", "2843409309709908480"}, - {"evmos1m5c6httfs7v5ew5xmv5gwjnhtk8thur00nxa3f", "4269901212863604736"}, - {"evmos1m5dtppvy9hmu8sdy897wlm44782ujapz2yddra", "886418159429591040"}, - {"evmos1m5e59gkr3208cfxq3lfdacg8qest2ckzfvq4mm", "10933457670619078656"}, - {"evmos1m5gzj2y47nyyjfxjeyc4e4fdrcmqw4eru8rt56", "1151969676975419392"}, - {"evmos1m5hyfajk37uwdwqne9c8hmrk6e4umzycf3jwz5", "10975448309801472"}, - {"evmos1m5khs34ezrz5k7s7c4ykz6eq9gqfe3t0fv89s6", "17708660557780230144"}, - {"evmos1m5lwtkkwkh2ncfyta62muxucudvxcfrx9qqejn", "2113741846030822912"}, - {"evmos1m5na25gjksrsqjk6p85ms3q0xaup57nnszj2f7", "2672462288146356224"}, - {"evmos1m5nexv7g98jgtn4atkvynmtrrgwt9dskcls8zy", "1634189736066486016"}, - {"evmos1m5nxz7427dwc6xkmddq7s873fwvnnxfgq6ud8c", "269805225999448320"}, - {"evmos1m5qsw7up8zgxm2n0jx7y8slrcmhpe3gws4q7rp", "21291842527128109056"}, - {"evmos1m5rfqnwj2mt4l949k64h4qsy4juw6kgc53cuh6", "1145906325346770944"}, - {"evmos1m5t8mp35c8w4vs8c7dqmc0tkym6az36xthh6le", "130973217351474688"}, - {"evmos1m5yr7m3qhwmpmc0qv6h4dm4rlql3lgvm0erqtd", "5418589560090492928"}, - {"evmos1m5yrk0u37wylw4h9z7ygh8d0388q3g7yv2jaxl", "109276227429799936"}, - {"evmos1m69nylc7cf7wwjdt29pdj0mr23catq46fakg44", "3051199008435679232"}, - {"evmos1m6d98gtl4vnh5acjrfukswznu9m6cfu87uju3k", "1447543177531398144"}, - {"evmos1m6de25yz4h2v7vflcpzhph8jly86ta4kufu5t2", "4701923710217863168"}, - {"evmos1m6fs846xp5dy7mfjsgp0f5lt85pzmc2gjsqdky", "606863638820215296"}, - {"evmos1m6gkm8z6u03dj2tkhzzvgle32aya4nal0qkv63", "101373563525764352"}, - {"evmos1m6nw9gfas6whmx6vvpu2nty7he8wt97m0rkrkl", "1673011577130672128"}, - {"evmos1m6qtmdkzzccfptfs9y3ej8fe50cuugtpx7xjk0", "1550118242023284736"}, - {"evmos1m6z6xp874sl5kvqg83uquj8e92qcwe4mua6ej8", "52440220275259015168"}, - {"evmos1m75hw7xxd8g0ypfytzx5tea64rd5rjx5quq4dz", "4596540438781177856"}, - {"evmos1m780hzjjy4s74x7cc4v8fh9y2dhwt3scvy2td8", "108231858728481193984"}, - {"evmos1m7e5z99tmvedzpdy25g30g23cn7l3x3nqgal3m", "793212684378680320"}, - {"evmos1m7knv4jmsaf7n54shh967efvzlmhxvz89acc2d", "3205137354548773888"}, - {"evmos1m7l9xr8qkexju0phqaalhnc889yyhrczl0ukd5", "3232218754422306816"}, - {"evmos1m7pvl2frpdgqn0tl5tey9v5ffnt885wsz525ym", "2481101696259824640"}, - {"evmos1m7wannkel29lfahhv85umzvg4t0rmtwy6dxrqq", "3981533254026773504"}, - {"evmos1m7zxwe74a3ejgucvuy73wu7fnevy4fj0nh5krg", "1866873092300292096"}, - {"evmos1m8fskmnf4yukvgkhgwkwmjkwgd9npc5lccc7eh", "752291289984485376"}, - {"evmos1m8gs69z2l9lwglsz2szd4f62c49hzhsqjpm6xg", "399102689788516352"}, - {"evmos1m8h0etjgx07tzlx5avm3sxdr84erx0atse4dcd", "1257157428681054208"}, - {"evmos1m8jshwvqefgyua4q7txnu9ywf3wlf3vnkls4c0", "1005662290888427520"}, - {"evmos1m8k4f2u545xasv4s3n0kxamzxg2w9632y0gcng", "1512927080861417472"}, - {"evmos1m8mmc6xaur385k20kkkus0pkzu7lg0d7evd0x3", "170301178102496768"}, - {"evmos1m8p6kl8nmf4nvkyzeyswk7l9yez7n5n6jfjse4", "827081745838484480"}, - {"evmos1m8sav823kng77ldg7zw2hhwvtypsh7rjt2hcju", "3063620031373197312"}, - {"evmos1m8ukkuwxdn58egqx03fuqdkjemvp00v5zq56qc", "8158514010157494272"}, - {"evmos1m8vsk7sucg93s9tqy208ycaeux467ehwfwxnrv", "321159749352992512"}, - {"evmos1m8xzwwpmhvt6am5sezrnmfwg2k3j0c5r5fuy5u", "384494484815864320"}, - {"evmos1m8ztwz3de47xh4hs5xnjnr0u72qalzzn8xl9yt", "2468259967487295488"}, - {"evmos1m93495ny2fh832fz98yr52d36u2eecp3dzseys", "1266547429249363968"}, - {"evmos1m94l97zg699fdgd02gsuvasrs4hz0dynqadkfl", "327537389525888256"}, - {"evmos1m9a6aweulef9k2nkh0xxvs2n0uuls7n4yp0tz9", "5149469229376579584"}, - {"evmos1m9c6j49q5wkp3ql8eu3umc8hk9wj6z65hj5en9", "165175416071189504"}, - {"evmos1m9dzs3mccztjkthr8ekz5x80putapd47ma6pz4", "1820370940937206016"}, - {"evmos1m9dzsu7hth7xd6spdajk4vy9jp7sd7eakmdgnj", "513227324150140928"}, - {"evmos1m9emttf3rkxcfkgpv6chxdw2etqjvwatd27s3z", "87081807570675531776"}, - {"evmos1m9ev6y4kt79xtq3ax2mrkvvrwymg3ap49x03gu", "280502979934441984"}, - {"evmos1m9fvwdxz85w0rflk6yafts673577r86ftgs2ad", "3639483472574396416"}, - {"evmos1m9grxw9wg0y5wfh4e9mwn8dx03c6ld4205mrxc", "3984982608119875584"}, - {"evmos1m9ljtsykdlyunpfeqd3ks0hpkcwmyxezrl7kxp", "815427633490224128"}, - {"evmos1m9tud3hfkmhlulzex5495waa7dqznlepvqp5ez", "3581554966791270400"}, - {"evmos1m9y3fmdvr07d0wj28ner04z5leqpu2dy4nzawh", "1493205493612407552"}, - {"evmos1m9zc63gcxg466aprskxn2czrt9hdac68hqk0m7", "6180078849604538368"}, - {"evmos1ma022xxjlvr6zrpr2tq0ugc8ljwj5tyeg4flxn", "4802553068066127872"}, - {"evmos1ma2a8n9q25ac44meknh0yzh9fkuvmjelc60g8s", "899126630932513280"}, - {"evmos1ma2utwvqy57kl6fcy8g6e6nwkuzfr0eyqlypxx", "11712887807418423296"}, - {"evmos1ma33shqngmrwgkr8az4y6kzr37xmkweeacnakx", "8634716659156874240"}, - {"evmos1ma64cdhh6wnmgqg2yr3q8n8ufemq94jldveugv", "21726157583124029440"}, - {"evmos1ma8me9dlr498rqra03rudess2klcv0gvtdxpeu", "130764220907499520"}, - {"evmos1madsuwy8a3kt2hpxr49uq5w73klhmpjs0eh97k", "62780988393910272"}, - {"evmos1maffnzws5wc4w9wfyg4a35r4z4wj8tmknkp743", "686075858018977792"}, - {"evmos1mafskw6zr5azmq5266z3ht5k8mnrc9yv9e4e0j", "4249500980785069056"}, - {"evmos1maftdkg4jr0pf2z4vxt9chnwhy00nzwxx4f5kp", "2490051727468712448"}, - {"evmos1mafz7d85velx8rmrfn7knd8zn9mhy4gw48y0u8", "4832420713314025472"}, - {"evmos1maj9u7ke6y08u75hejgxmcjzuww6rcy2f8xjlp", "1964449082120208384"}, - {"evmos1majd686hx90ur59gt6urtksqlq34taqx4v8l9p", "43044912952078368768"}, - {"evmos1mansd76x5rcu3uhyqxdujzaxm76l59udn9kpl9", "369046881632622336"}, - {"evmos1mat0aydttjz5pjax8shxa8cwuvpkveecaez85e", "773061883521614336"}, - {"evmos1mat7vw2xe0jg73fvce9k7zn5876uad0595j5jm", "11998101957279555584"}, - {"evmos1mavjcf525y75fzgp9h39mval7pnyedzu38dxw4", "2192034901749587968"}, - {"evmos1max7qj06q58fy8t7jfd462l79rass3mdjpa62p", "1898917210919005184"}, - {"evmos1maxj0xvy50xu7dfnvesxy09yq9xjvff6e5rnae", "538267883180204032"}, - {"evmos1maxqcq2mmn678nqhn3qpja4vsxwy7d207sn5dg", "28669976894104616960"}, - {"evmos1mc06xptgdylf2sgaj784p4saj4vre3qu0y22gf", "884388789700551296"}, - {"evmos1mc2hxhj94rv38a5agk643mr4f658pp3rkh5un0", "591663737300119552"}, - {"evmos1mc2v73gd0v25ed5hdmcr83vuddx2nzduzl9kjn", "79587735996677210112"}, - {"evmos1mc55axwr28kysxkdtce69v7ar0azvq9r33tn6y", "23964003196843008000"}, - {"evmos1mc58nkmykd9y9a8q2p9uxn5cvjce380xr4xd0q", "664289960264568960"}, - {"evmos1mc62fky93g5pfs7qqc2n7l08xlprxhju79vrwv", "784231726236962816"}, - {"evmos1mc6jsq9u9gwprxl03fs9a4vmu8xwfzvmqpxktg", "3196526239947518976"}, - {"evmos1mc6xydh2pvk7rlxt9pa4tm3hxvzkmr9lg2hdh2", "156639755409379584"}, - {"evmos1mc79pqphsp3244nkdudd30yr5tpud8e9vsp2tp", "16723662497276030976"}, - {"evmos1mc7ttmhuxah0hhm97znyvxfvqr0mekmdd9m9tw", "711648211430402560"}, - {"evmos1mc8hk72e6638xvt4h4nu4kv3m0g2rhc8s298j0", "658132930331431424"}, - {"evmos1mc8pfcc5asfu40ppyuhem5naasxf9dgyxvt8fz", "1634599909660323840"}, - {"evmos1mc949veeq700c3jgcc2r8lndfch9cleg5w3njj", "17716735142157537280"}, - {"evmos1mca6rdq7d3sj509ryyacf0d0txxllkumwq4sps", "9658316739555033088"}, - {"evmos1mcevnxfqfqwza8lh7g78xcyzxhwxmwfr967stv", "2568146070665609216"}, - {"evmos1mclucvxvxqcqhluur379g57jjz2tea79ndnyt8", "6606976845394486272"}, - {"evmos1mcncrkxyagtxt56xtc40nn8hyzes2v56zwn4j5", "3203205380704539136"}, - {"evmos1mcp49pcrv6tl9nz35k9snezzhcgdl5kjfdvkpx", "17331775293535303680"}, - {"evmos1mcpxl403ndg0s2fpq6nala62jqz25zswexcarm", "14882723497829318656"}, - {"evmos1mcsdkscxs4ydnuhy9r4vpqgzk9p2m6fxqfnhqx", "3103243498441401344"}, - {"evmos1mct4r7cua65pyzvg0sf7r5qvrgc2nxrlu7dygn", "369413685991714560"}, - {"evmos1mctd4khs4zttna26satvdtj6nm8qcque6eqc2y", "6767656250130478080"}, - {"evmos1mcuv2xggnvqagvg86dthy87tt68xzs4z4zx6hz", "1112037232799015168"}, - {"evmos1mczcavphuj3s2h9g9sy23z6vcm58ynuwmwjapx", "680236603864927104"}, - {"evmos1md2g5l8fx3f8g38tj7ak8j2ldrcnjgz28ug9my", "6712610918438490112"}, - {"evmos1mdaylmd7rzqt530gu92pcr2qlkqjhthxex45z2", "885822410820465664"}, - {"evmos1mdccvafm3kh6qu7twkw4h7wdhrx9dt6qqdenut", "4430052179695025152"}, - {"evmos1mdeukk8urdg3tw46g2zksck8jjas76csnnn5jp", "4336461802174775296"}, - {"evmos1mdh4xpsu7e9xeguxntev32wzfxtthlklzwek6a", "768406936450092032"}, - {"evmos1mdkfvn24k69d2xz46a89qnmv8hen34rhsl2yz8", "41180534972870041600"}, - {"evmos1mdkpszrukugkf7d50xqadp8x335hkvv7xaxdxr", "1667194355492831232"}, - {"evmos1mdr46ckzk8q2e042ym80uudswehdy84eag9d6w", "85902281185575936"}, - {"evmos1mdr92v5f93pj38tkdsps2ufd930tykt6qqks4r", "351364871905293568"}, - {"evmos1mdradvwys6sdmqhyz75vh3udq0w844yzay78rc", "12232102702814388224"}, - {"evmos1mdrc0cj6fgxfnhd6j5mnjrc584faddq09qjlyp", "2056321311807944704"}, - {"evmos1mdsctycz0fqw43dr4exxagtr4s49y4v7lceqku", "329263368816512512"}, - {"evmos1mdtf0ygxg5xthdjz0vaepwt27x9p732xt3vn2e", "310565354264288256"}, - {"evmos1mdu3wvxdj5qwul4l4r7fvjtmsut0fw58yzgn87", "1454557383091044352"}, - {"evmos1mduetgk08ezrenp8n8awjx7fehyusjh04m53r2", "6659598071990109184"}, - {"evmos1mdxm9rj03j3rp97gc2vjq92ly0wh66f30ljv6v", "463471775766355456"}, - {"evmos1mdyfrvxrptvxuq6t7krc4j56rvy90gdpqh28ax", "1979486300506868480"}, - {"evmos1me2lfx5rpm7jex2qp9vp94qa44tvcwx69r3e2q", "802131148857407744"}, - {"evmos1me2xnuvm5adsw79wax4x2a6usplztkq2p4zu8z", "2374048842091376640"}, - {"evmos1me4s3r09et0e8fstlxkuwa3a0x8ejcnay6ecq5", "6037820078898385920"}, - {"evmos1me7dzwn945uuz56hn5yygenwku5jlr0x5lldmf", "2415502644165976064"}, - {"evmos1me8kw7dyt2hndxjmln689r7pph7wpahukx26ur", "3396697737194646528"}, - {"evmos1me904zvw2q7wl0ayjr90rl9ags8864yqgzqsa4", "211652895340539904"}, - {"evmos1me9p0pqlssy4v073paddeeusmthdgzyjlpr2yh", "2888136717224967680"}, - {"evmos1mecgmm9kr5rwuv9f2pga6gplg0sdgnrs4xv5m0", "2555849186802413568"}, - {"evmos1med6ejygqssl5zyxf5jqvfux9ezz864zw0kych", "26485671703884980224"}, - {"evmos1meehe756nhazljtm62rwvypyz92cc5a7nqu63t", "131730801361920147456"}, - {"evmos1meeyeu8gnpnvrq59svpd85vjyurcm8kzg99h2f", "40228902363996520448"}, - {"evmos1mef4xtg55p5e6haldlwjvz3ymeqsmr245n9yld", "645935463162831488"}, - {"evmos1megxlp0y7pf80exytglm572mfpqcha465u6694", "515724698453024768"}, - {"evmos1mej22qmvd3ztp62a25wvpp7yd52grffzus6adw", "413747830310291200"}, - {"evmos1mel6kgs3q66vtjjcn544uusdvekka0rrwle0j9", "8274271642017502208"}, - {"evmos1melgldf786af6jwtp0amn2f6ccaw6pa7n03f4q", "152323597154157133824"}, - {"evmos1mes3dku567e0vkjc9ylxdpwjxtkw7jv537kdse", "5071426752745015296"}, - {"evmos1mesd8gtuprpzk30jmmj0qjnsldh6fptr4u5grk", "5545121164144173056"}, - {"evmos1mextz6zn4f6qpzjrxdge078epy6jlcrpluwuh0", "2580649681299488768"}, - {"evmos1mey3r2pwh7aruqaswjqlqew5rswxzfuzhg6luj", "1398186931557095424"}, - {"evmos1meykq8y9jlcxkc4u6l3yz38ka08rgah59jnnpc", "1022273112427728640"}, - {"evmos1mf0cam6wgt4ds6y4gp05nq7jukj7g5vm9l6wtg", "440221128537115136"}, - {"evmos1mf3jqs2ascpa2qu47hyyz5rj4c449euppd8x28", "2424359886703017984"}, - {"evmos1mf9u60khc49mah9pqy4alxvezs9eajzqup6qlu", "11422330337848713216"}, - {"evmos1mfaqx0jz40sf9v505tlp3t9e7k2q5nv6ntmzxq", "3478444965866831872"}, - {"evmos1mfcnc05acjjy9tpsryywa8vnfz6veks8tmpz68", "10905656519735410688"}, - {"evmos1mfdggzjeddkuyz6x2900l577k2254rtpfsmqqx", "145919314662489088"}, - {"evmos1mfe4pqljucm4nxh3xrps407vcz7gzmds2j39rz", "1502514780800748032"}, - {"evmos1mfjy48yqeqcqsjzn3egu28m96vc672c6mezqdd", "387287651938625792"}, - {"evmos1mfkuaae9l7susmev8tvxrdpsgrp98epwztum96", "6637111609543263232"}, - {"evmos1mflxwn77hzzwa2zr8gjdley2p9dn3yh0489yn6", "1332941950974902272"}, - {"evmos1mfnl58kqz90tz2ex0ru6hpklyxyj85zdreslpj", "4707514869966929920"}, - {"evmos1mfrjfe65rjac8d4fae56ape76mguu8mnprwa9z", "47969024173127008256"}, - {"evmos1mfrqcwurk3whtx0p4rsufmaa6vqpxgjn7rqwkf", "2249066058293444608"}, - {"evmos1mfrscwusvs0x4xk7zc5ed3jfnnjge9w9deuyu0", "910810794838386176"}, - {"evmos1mfskdp505r8dq9ftvgvrtjuhfynerxcu3ghnu7", "471716691746249472"}, - {"evmos1mfu2t5kukdslh99zxnftewpqk33pn8rm0anm5d", "3275060251665247232"}, - {"evmos1mfv94qcwx0uuqpe4dmm248gs5a75cldnqkjy72", "85673178484424704"}, - {"evmos1mfvp6hsvy86eu6q6mem50arh638yum75qnymsx", "593414324488005120"}, - {"evmos1mfwf8zphuhxjrj8r0g5prwummfj3t92u2ze67q", "883915633213088384"}, - {"evmos1mg0scnhl6gguzn6pp98t3kem9jyvezar8n9tfa", "2152128040032340992"}, - {"evmos1mg20lk5mk00wral3anjn302m5k264nr5ejqqd5", "8238129998730813440"}, - {"evmos1mg2rcmj84vqf4sskthxahv05ra8k6d9mx0jhvy", "1327452486227023360"}, - {"evmos1mg42n8ppupyhk3m6ukwe2m6qcwg67ls2lxz5kh", "8439602696017102848"}, - {"evmos1mg4eyk0pnm6w2cllg9ece94t7sq6zwu903zgtm", "387168472590046208"}, - {"evmos1mg5ypnw2tc0ydqlkpyl7rka4n6gj82ez6pkx2v", "84437313632256"}, - {"evmos1mg7sh9v2xmcp55atlwf0c0uaunyg35t495dytn", "2003032896559837440"}, - {"evmos1mg833ma4rjdx88fhkrwydnn3nkcc5vlpn8akju", "810654190164006656"}, - {"evmos1mg8n0je6wvtv5juuwx9428wma3k6njggyak2sh", "1098360836499083776"}, - {"evmos1mg8yxw9e75rknplks9jeta6vrqedswsechv542", "681252573607832576"}, - {"evmos1mg92qss8kp8az0hrxdndql9pc9mavyk52063t7", "885205212357734400"}, - {"evmos1mg9edkc47cne9m7x2m572z8qmv9xk3x87xrxl2", "10080723311818633216"}, - {"evmos1mg9ftpce6j0sw0uahs9z2n5vqws0j5skxs70vc", "1457568323945054208"}, - {"evmos1mgg96tyzzfxrygywh0y50r9yv05se7kqf9g5um", "142548244106598912"}, - {"evmos1mgmqvphyujzw0jt6h0xggsdwpzrl3zsc2dq449", "18581705395040002048"}, - {"evmos1mgne7svqvxdzlvr9lqpmu52evqvn92957v9wks", "22194026898799763456"}, - {"evmos1mgqv7aawyrmgyge690yev9a9ur6y0ddcj7yqg6", "1634081343373336576"}, - {"evmos1mgqy2p7e32wjhrt95gtjx4497xydsxecpreqpk", "18985827499246448640"}, - {"evmos1mgwun79j4nhedxd6edfnx8trhf3seqwgdgrqrd", "5363112098674821120"}, - {"evmos1mgx0kwlkszx7z9z0z2xg0pv0v8n4c95fn7zx7d", "30587089120913383424"}, - {"evmos1mgy6wjdzvqehajdgach7hc2ldmwwd3svxfnz7y", "116727980124836352"}, - {"evmos1mh38nkdw8swvtavnu5us6nhsq0jdfam026m593", "48340272162632851456"}, - {"evmos1mh5uzfccy9lhjg3g4swwf39qf2ftz4e4twv5q6", "30128207787659714560"}, - {"evmos1mh6v7atd5xy3yu6hjtw6e6843tj93dy67td323", "1197380380675533824"}, - {"evmos1mh7au2ynlxrt9r5dcpnlkf8x4srvq27a8t7utw", "22093631175061962752"}, - {"evmos1mhaja8arlvp49g7dgyg79kgf8j5a8w2jrpqzk3", "99775727143121664"}, - {"evmos1mhaz0rqmfxx654fj248u8nerq5xfsttyszfg5d", "4683796177200840704"}, - {"evmos1mhc4k6aap8lemqjatemllx3u7rcmwf8sx8hxnj", "432298262017014272"}, - {"evmos1mhf6lyxcldu0dl5tatpa3xfp67gtwkljdrq7gp", "384579679736732160"}, - {"evmos1mhfp7g48rljpvqmcxu0k505q7y20dvwd3rldsr", "344261574840754176"}, - {"evmos1mhgfnku4ll7k2f46gwc976np4vpp89zyfl9d5m", "392662336931305984"}, - {"evmos1mhj44mrfsa7npsrsj99upwdt760zppwvgpgqws", "368873964945953024"}, - {"evmos1mhmq9hxnxcnpvj6eqnntnmphlvzgz63drrlwft", "3160305914878232576"}, - {"evmos1mhmxdsedpdl4dafd5rqllx9u928hkwcwx2dy6f", "1268787727554716672"}, - {"evmos1mhud4zr6r4wq05z6jjy9ddua4vy3alrc27xeg5", "9583630142891532288"}, - {"evmos1mhx6da6e953u266qtrm9um5c7qkdd5488eew0a", "22449207184956030976"}, - {"evmos1mhxq7efrdezyr20mvjqxzmfh7y582040hgyd33", "2520720813137768448"}, - {"evmos1mhzh33vu7jqpa2kctehqyjh0uaw793e6p2ns8q", "13272296123956193280"}, - {"evmos1mj48ma5sef7cv90qnch3wfr4e5zga7adq89ssn", "4748384362189007872"}, - {"evmos1mj58tu23g9fwxpyhv8lr9jtcyuv69u6t6tu7z8", "385959487973997312"}, - {"evmos1mj5mhur5r62aagslc0vjafqcclcdprdynfp6my", "303197272736500480"}, - {"evmos1mj5s7gywkmxfedqsda0f62f2h3s6xp3r8h0y28", "611554442463398400"}, - {"evmos1mja8hudp386hgwp0fmeq25ef5yzh2q9se6nnm8", "473928042549152000"}, - {"evmos1mjaxz4j6zpwscht032y654w4trxeyphwjd6xnv", "4041350761914875392"}, - {"evmos1mjcsuyy4jawvfakj567w95qdqe6psn2c534lnp", "5016799549347262464"}, - {"evmos1mjd00xs3dt4lmullfd463ac0d35uhw5qf7pavv", "24212687237045248"}, - {"evmos1mjd9lmt9nayeqe9zngx0a8xw33txsxml2qrsda", "24379334874013974528"}, - {"evmos1mjery06v7d257n2sk9vhe60326rdp764j29pu4", "8903601425034200064"}, - {"evmos1mjlencp4lkxxh9t5zu43lcpuz420528mk4vvfw", "1611516630049783808"}, - {"evmos1mjn42ydttyp2y2qc52g27zkc6cth3s3t7y84kc", "199982562524457728"}, - {"evmos1mjnre0m9dgc7ad52mzew03nsklsrpqr543h979", "4631847769176736768"}, - {"evmos1mjsa0htjyqzzgdvpvm2dt33pl9gxf5gk9vdf6g", "1160032193328739584"}, - {"evmos1mjtp0u0m64s6g6435fy2fx4r9rk3dwk4lugafp", "204400080106608640"}, - {"evmos1mjwwlgt9kdq662dl8j2ttx4ll7afqzr364d3tz", "10556854978485022720"}, - {"evmos1mjy9s5xh9sexn23d909n93cwyzqt8t83qmjnmh", "6370036155858313216"}, - {"evmos1mjydflf5waxey07upc9g55uedkfh03va77gkfw", "7628428125186113536"}, - {"evmos1mjz99y5ug9hs2zq60upv79wn4ru9cqklf8hdxr", "42139543677101776896"}, - {"evmos1mjzlu4nfqd02yqkknuvhq0k0yun29prnsws293", "19646527156000735232"}, - {"evmos1mk2wvs05j3nlzeytkhkayrz857c9xtvuqxl4sg", "1171844786546720768"}, - {"evmos1mk48c5p2uyn0kjg2030zf82fr0wwr59qluhgtd", "10216427439489404928"}, - {"evmos1mk8z2jx6t2vj5caw25svd0yjcdazhnzysahwqw", "2989589404643464192"}, - {"evmos1mk9dfexk35mhzr7rvee02ttg98k0na9mmuxs7a", "1501125170227789824"}, - {"evmos1mkalxme8rsul3nhuu3prvaf7cv5y6vaehxd3eu", "1881958268390191104"}, - {"evmos1mkffsv9c72ucnv0tzcpr80q4m660qepphnleyw", "897725877129766912"}, - {"evmos1mkfz28a3c2uhfkudkh04n0d566sxjhc9a7d3hf", "806263341491285504"}, - {"evmos1mkgu6hhecgpyzvewyfgpfr26dye67074jcykj9", "805215937628631040"}, - {"evmos1mkj4k7d04vexmew6gpxnul4femc8w0c88vz5jp", "971583122974574592"}, - {"evmos1mkjq7vqe0jgr5s6j292tu0c6ptl4582yh95zsf", "53136374749004800"}, - {"evmos1mkk09v5t830s3j0x8z7qc283u0gdmek7un5e9q", "884654238157403264"}, - {"evmos1mkkhu94yrs3sfml794h5w4jy77y08m8zphjaeq", "2511526013954020352"}, - {"evmos1mklzz0dd2qvfp8weypnwkulyr4zhlt90kg9t0v", "42978258659830104064"}, - {"evmos1mkm6jvnsyhtemtjdu3llq8xx4t2fjkjrny4n0w", "3996696643172311040"}, - {"evmos1mkmc9drqs8zyamav2d5t54g5ux6ygrcpt4etpd", "333362766273352448"}, - {"evmos1mkp3x5nk96w70t26yeyepcdmn7r6dlpp5k9f5m", "10665214048606060544"}, - {"evmos1mkpp88cn8uj6eu4hz9ny4j5tkemts45eaktcfy", "25392726386206617600"}, - {"evmos1mkpzw7qy9ld08zcr6ne9p39r9d3vjqpagyc9x9", "2900678585717878784"}, - {"evmos1mkq0a4eu46xrlau466h64c298e5d7xvqdq2d4f", "55212085302214352896"}, - {"evmos1mkrkqveg35w5ufhhgkxgxt3d58y9r9qetudysn", "1924479893543727104"}, - {"evmos1mkt70laj4ek5f3dcvj48nnrlmsa2jlclqxn5jd", "30079772765875912704"}, - {"evmos1mkxmalan22wfr6r4hvv028pwrq6h495nsdwg3e", "868280438518341120"}, - {"evmos1mkzfnnpk2ycf273clzctqhnnduymvrlslzudsu", "478648277446812928"}, - {"evmos1mkzlu0kj94ej3xz57cakcdqv6gjq53qrnhlj6x", "3033175440783285248"}, - {"evmos1ml06f8qg2f9958vue8rnau3z6dmlcrzjx5rrak", "313557627448594944"}, - {"evmos1ml0up0p4dx56hs9y3d9nn9227u79ld844fvwu0", "192256378990452224"}, - {"evmos1ml6g962jwrgrc3s7mtq7nlj9w948v5q8mwgcac", "3318458077496009216"}, - {"evmos1ml86gm6lxjx82lcwv2xu0k48h8ymvnlreksg35", "45739026421701120"}, - {"evmos1ml8r0e9sk2n0jkltt8wgsqkgt4wc9e72fsgevx", "57420342039696842752"}, - {"evmos1mlen92mdjlrt7rtngyqk7wuu9jn0nj0ks5tkmd", "1684869456432734208"}, - {"evmos1mleutghvh8l8xp7225t6cm72swq8xhde77vtlh", "6252418787317376000"}, - {"evmos1mlky8kve35zsm8lf09390naxxwnx5drrlkn259", "1736015171957758720"}, - {"evmos1mlqezpfwax2497mpc264lrt6h7nf2emvlqf43g", "233275179970748416"}, - {"evmos1mlql7202ywf00ldtw5au06wngs9vuylk048nzh", "2456746514831896064"}, - {"evmos1mlqtm276f59p04vuptdnqst3u78rnyj8fhjp9r", "358096249469165568"}, - {"evmos1mlv8ukjepnc2hn9rfz77gd2xsyp5q6vw37fg50", "385205288007635200"}, - {"evmos1mlvzcecgx7v33kvdduw7yx9ma7kyxmjtp56d99", "6411227438047227904"}, - {"evmos1mlw47qxssyu8aq3awgk5pguqwz9ealcenr5az0", "3524176897480367104"}, - {"evmos1mm0zga9fz7s6yzt23ws5qlvwlf5u3t6rgq8ym7", "828590378642753536"}, - {"evmos1mm5utul6nzkvn85gna9xrlgsgkdjjt92slf23v", "33284027936939032576"}, - {"evmos1mm72uesve5pcsqt0325np5la288ckpwjnu30u2", "130320835290297344"}, - {"evmos1mm79zv5pggvvuhnkl56k7v4u8w4qcfq03ck8kr", "75962503469679771648"}, - {"evmos1mm8fj78vjft7jap8xc907psu2q8rpn6adp4kfp", "8177001295491821568"}, - {"evmos1mmay9uwxa08rvcaen573g3a2gfjp80r577uefj", "3075628065784310784"}, - {"evmos1mme0k3k5jvsd6hlxvc26rlx0chh7tf2pdu2u8z", "15811462898167263232"}, - {"evmos1mmejtplvrn7d7cs3fz89s7ek7htgm0zerszcqx", "3584259279928334848"}, - {"evmos1mmj8j0nxy43aqur0nw6adacuya8v5qpgvx7u4e", "7307503067046406144"}, - {"evmos1mmk3wq7r5rsquqxneyaxyrfqjz5rc8l7550pmy", "6845891777903476736"}, - {"evmos1mmkhk649na4h7m5e7c3wk7wxmpanqnz358j67x", "1073380827740306944"}, - {"evmos1mmlw9fy3uthnk6jsgl2zkakff9mumtzvdl5tk7", "2106966455061886976"}, - {"evmos1mmm7jzh8t2q3uxns48zaeuwrkqcah2hedk927q", "7518591321931042816"}, - {"evmos1mmn3cuczrk0dmms3wv30yvp8205t4q38crsp3w", "27325215694910623744"}, - {"evmos1mmnwgmwnyr850rzpddfvgpszac8ynqv4wafr60", "991835812750585344"}, - {"evmos1mmpzzm7t7pupp55lyhzrnwnzz3pkcnekxldtzz", "26672248167150280704"}, - {"evmos1mmqpdfj69pj7ddk3jvhkej2swyke2tewmgpu9u", "1614754116922684928"}, - {"evmos1mmr04qn42f6jkckxsgptf247qeqg77c8drcd3z", "1922957837694286080"}, - {"evmos1mmsta79dmtdt22d6n5k455j6kx5q42w3vc5js2", "1374635542307289600"}, - {"evmos1mmv4f56swzum602dnlj6sd4td4jerm2n3x9swm", "4885356374654142464"}, - {"evmos1mmy66vme7tqhz3w39s0fv08n50ded6mzek7ed2", "3769899352923023360"}, - {"evmos1mmyfsgzdyvmt34lkmtju5thwdn4z5aewkxj2sj", "1052711281055168000"}, - {"evmos1mmzp4w9ftntyax2j4h023m52lvgu999egetdfa", "2266080667116129280"}, - {"evmos1mn3d43vd80vsa99nlhpwep25elypng4pkpjf5d", "981132937917074432"}, - {"evmos1mn7aq7capngl5x0hyynvjknv82pgehulvqpt5v", "3766819042961862656"}, - {"evmos1mnampqp5jprtn8swuy4jh0gxkg6903xnar3fh8", "216797156364884992"}, - {"evmos1mndfrr8wa4wrxt0xzn3lg6e0k8p5zpj26lr72t", "1122135338832527360"}, - {"evmos1mndw234y4f5hf8243e62k5nfsrk30tmxxch2f3", "569245728965220352"}, - {"evmos1mnf9ghwyf0mc8xl36auq9v2k0mwhch7xyrw3gy", "2833286714170433536"}, - {"evmos1mnfhz9wz65d8rc6rtjkpt5rj64lksl97nwzpkr", "7376419292199180288"}, - {"evmos1mnhna0x8a33l8yz4vqzvffjsqrah6ygg86yzt5", "3088169390654758912"}, - {"evmos1mnhvnq24zk778ytpkwd27rwmg7lresq3qq86tn", "7834100564823068672"}, - {"evmos1mnmrlcx6au3ujqltqd96zns8jx4nth58qrtxcf", "1888364666093307904"}, - {"evmos1mnp74lw3334sv09mltvsk97zru477nulkz7tac", "3912803217659867136"}, - {"evmos1mntmypnp30yzmdwxgkkfpmk5svw4dq895cv4cx", "19479252626622173184"}, - {"evmos1mnunchy45c37qtfkwr60urjswmkcyvutd83qpx", "80028249942714204160"}, - {"evmos1mnv6cp0vavxvxvu5ylhwnaqw56xqn3x4re3q88", "21189145616826163200"}, - {"evmos1mnvl89pw9wdakhp46f9tuasw8szcydpt6xmur2", "20365956529814896640"}, - {"evmos1mnwac0zh2z3yeehkqx745vqt9dtrqs5cera7v3", "62116375874214363136"}, - {"evmos1mnyse22wav7excxvywdxlmwz4hacslv7kx9z7y", "2770632833921368064"}, - {"evmos1mnyssr8ukv9u4d0tt0kgyt4putex3x7s4vkrfd", "8222084183825563648"}, - {"evmos1mnz2u47kkateql2u4wrm8rvs629vz9uthzxzgv", "686014867745921792"}, - {"evmos1mnzs4vyujmqf90y36em60vtrvsk7tm3e878x2l", "416955009991844608"}, - {"evmos1mp03cmdjrqfxqj5h2pgcyku56vam3ce04xw4mc", "41985892720648093696"}, - {"evmos1mp0dmyjvwgm7zh6qgtx3flasrs5m37muv2fjzt", "852766467064742912"}, - {"evmos1mp0klq92s9p7vs8zrgg3szx28dgjxgjrlnxfqx", "2739092488163867648"}, - {"evmos1mp69l08u0csdgwygmnek82x5vwuqcm4y7jqqdg", "960290334013441024"}, - {"evmos1mp7pxzc56yglnpqjr276998m9s974crmjzf4r5", "25913910491352457216"}, - {"evmos1mp95nt36pra0lgd2nt0ttgrx00cklgl9e5kn29", "2214410664986951680"}, - {"evmos1mpdl0h32zhajeaz0t0hvyu0cqjswdjyp2pxuet", "2795763149719847936"}, - {"evmos1mpdra09gfm9z7f7g7fe65mfn9y4ejt56mf8g8q", "2954402670389030912"}, - {"evmos1mpdumdrekmr2m28g4sppwxmdujmv660na7tlu4", "792695355974061568"}, - {"evmos1mpf5mxhm4ahgw997d662qfh0dwf34wpmx4hze8", "5969467049440452608"}, - {"evmos1mph0yxk990rad60d4euy4earc36j79f697ek8q", "21275327305442840576"}, - {"evmos1mphzmpn5tdqqafyxyf0w5zd9pxzt7wpryhl0hj", "951247269715881984"}, - {"evmos1mpm680snw7h2854umnp48fwlxhg0un75f8qglj", "404755696680542208"}, - {"evmos1mptprg8p0hgj2khesdcegvkpwjwsh6rrv3j2hg", "59454035530677010432"}, - {"evmos1mpuvhltsalu502aplq0d60zhq9ypgeggjnf0vp", "1608414238234124288"}, - {"evmos1mpvg8y8ecrmcymshplctlny4ud3cawrp2xpt9a", "2518550090611816448"}, - {"evmos1mpvpz08js9886n0gtlnst5rd0kc8a0zkn6gu2p", "817265226682277888"}, - {"evmos1mpw4n2727lkxmaytusfndzg63nn0pakvyxuqew", "1647946705278107648"}, - {"evmos1mpw5scwlun9v0wl3qrt64cv9kx4cnsaxx6cfyd", "8348055172381095936"}, - {"evmos1mpwmxplpu0yy90uyl7pmueua4fhhf478ejjqd2", "2578468475927658496"}, - {"evmos1mpxhhhzt0yt3j97grhdmy2spzw0tfnvy86h2xg", "1909157594072095744"}, - {"evmos1mpxtq06tfmqctmv8fau7p2clm5u7uezqlev3n3", "2749786507136389120"}, - {"evmos1mpzuw43365fj8c5pama5e7qks8zgyux3n7nnwc", "2906090859652972544"}, - {"evmos1mq2gpzwe9e2hn4dd8r83jn6ynzfm52xfpzaqwn", "1687596887151659008"}, - {"evmos1mq57zuwa36rz08vfmjd87kkhl7adt2r2nq8qsv", "840385601679650816"}, - {"evmos1mq6jxag5k4kcks5d4nypead7j934cauhdgsdef", "1932297755998008576"}, - {"evmos1mq72nkr07hgknxyk07qjz5r9jvuq2ptr0gcrre", "1785237902610014208"}, - {"evmos1mqg4ywyhypcjua86hv2vz2j2zj7mdp5a3p4rmm", "1533131776753478656"}, - {"evmos1mqjsz6rsn65ny7kpanvkug0y0sma3sn4cztvxe", "177011373467746304"}, - {"evmos1mqs8y2khq0hwqq8nc9druegvkm2mapnvsvplv2", "752701737770407424"}, - {"evmos1mqvm8hq65x6ajrs7spk793m23y8g8myr907yp2", "19339793077462712320"}, - {"evmos1mqwxrmur5k7g5mfmgz6nlsc0r5dyv5j8wjv7j0", "218185322445978624"}, - {"evmos1mqyhecwc98mta6z7m4z7zuwjgxglndzwdpe47d", "23025424154126356480"}, - {"evmos1mqzuzt70hmr5uunddrp5jz3mqegdzdex44lrwg", "226750457784972288"}, - {"evmos1mr3jcgq3czmxwhfg5qeh94qy3cav5a8lrx6sp9", "717761479959430784"}, - {"evmos1mr8dcsxsxrmf7zk3mgq939w3am5ajwk79avj6j", "1641824681223016448"}, - {"evmos1mr9mk6r8nfr30y584ttshesy0yqc4ckyzae726", "4811310089561676800"}, - {"evmos1mraaesq65h73ckmwp9acsjjdqg6ttvlelrylyk", "227973035876438528"}, - {"evmos1mrg93uhk08yz9rcjtz698d8aadrsk3rh7q468g", "1549406524670537728"}, - {"evmos1mrhhe83mun7unehw48hcdmy6lvxywyk5mrs708", "5346227255365839872"}, - {"evmos1mrlnp8cx3t8maq38g35pqhdy4xu9qp94l6hkc7", "34135330941827997696"}, - {"evmos1mrpn9p05tsqe75k6qvy74vs8zshp3es3wg5rjl", "31247097126238216192"}, - {"evmos1mrqek3gxrw8uwsfkcphwtj6xfe420ja6y79449", "1414645650327077888"}, - {"evmos1mrqp8nn874quqc3l3vjx7a3eyd72dx492z9yxv", "2750696589625081856"}, - {"evmos1mrr4phcr4wnv7spngs5nfuyuzncd2mmgz92r33", "883054222800374528"}, - {"evmos1mrrmzvy8szfa7fha8uz3pz8v2qakaduz7h705c", "212713434820471296"}, - {"evmos1mrstlj4um3yr9d8wge8663z7cn82ddp7xc9f8a", "3296914624196739072"}, - {"evmos1mrv94yy3gc8usnmvc4x0vhesqyhzk20vz5npjl", "12318156212323235840"}, - {"evmos1mrva03wvlhat72xafuqvfle9a6ngjnyzg7xckc", "895079338295468032"}, - {"evmos1mrwvf4gx3dnwxttwdk28myxs5s3ecr47wq3g7n", "23132351955734097920"}, - {"evmos1mryaj5qe429sgl820zgmerljh5zjrevl2z7efu", "522689270241467392"}, - {"evmos1ms0g3rrd6fur77vwtxy8u9xr620m6zemqtwj96", "10052750531720435712"}, - {"evmos1ms3aqzkgs95pdl543rkmdg7mh32z6maen7h9u3", "441319837239621376"}, - {"evmos1ms6ndh2xdyafx6at47nnnastcm6l736smmudnh", "1512883894553128960"}, - {"evmos1ms9l0x6928rngkwje54yexuplt6sw5czlwz4ls", "1384881747885758976"}, - {"evmos1msfmmgk5x9kd3s3ugr4gja924qpp62qm4dhstt", "1065433264969729536"}, - {"evmos1msmpf6awj3hr6fp4tdz2ku6tpsmk29d6fkgfhq", "10583675343941763072"}, - {"evmos1msn4wdqf9j8kj4rt23afny3jwu3vt0yk50r7nh", "2804027262974952960"}, - {"evmos1msna8a34qf76jej9d49k0lh6hdsqjd2ll27q29", "805827306195356160"}, - {"evmos1msnjpfmzcklemmht23rqej863g4k97k862sahz", "733519794679066624"}, - {"evmos1msqxa6488q0lvclh8ega0kgupy2acpgjl8twvh", "950888979381348864"}, - {"evmos1mss5rxh7qhrek354sddhwjp0wc3ked3087p3j0", "338407195907732992"}, - {"evmos1mst93twpmdf7u7nt433rm2ycvuxzstgf398k2u", "320867756617762816"}, - {"evmos1mstnga5lv9ezggmslz87yljwthgwxanwfx2s4s", "970085362248089600"}, - {"evmos1msukh42rjqvswu03npgrrcajrkqw0zxq5zdnr5", "3909910088360541184"}, - {"evmos1msum08e7atkfqkxqmr7npt6nxce0p6fqt32tmp", "19807852991113175040"}, - {"evmos1msxp5p2ftsrtxw3r9l6tzh0gzdvrlzyqlcsnh6", "2111918622180705280"}, - {"evmos1msxwfdqh823naw0yjg5hkpw5n2lft4ncjvgq3z", "1068551329277102592"}, - {"evmos1msy7kefdg45v8c3dza4uar67lvf27ack8r824m", "2317137407401594880"}, - {"evmos1msymxwspp2grpcy22rvnpfrew80u7eldhafr82", "1831900649934875648"}, - {"evmos1msz0x8un5ajmsnywqhm3x38hft6j6s8hztek5f", "5638703191217077248"}, - {"evmos1mt02qaj76jcpd7yfvge7usnz0hew9zqyherp63", "845271110854447360"}, - {"evmos1mt0nup3a2e3n32frlg7vttehm0uj9kfdeqah4a", "1027919674822981632"}, - {"evmos1mt0pcxdpqur0wdwcl0r6r46vt808myn4wklnea", "1242817581765632512"}, - {"evmos1mt2gyrkaez22dzprzz45jtxa3wk2nadlngurm9", "28884339165858971648"}, - {"evmos1mt2sv87es7red9ag4xhz3vpgahz6w5gvs8ztx7", "100026414326777600"}, - {"evmos1mt4dha6d0zn6dd4prt99a29c3vdtdsw4xfthr9", "669551623614574336"}, - {"evmos1mt50pjvlnc3n5srxg7a0xpfdtu6wymyxr8umyx", "13346071663328862208"}, - {"evmos1mt5kgr0rkgfzfyldjwrgsgu04clqan39znj50k", "299441900460714752"}, - {"evmos1mtcsvrertqlwqzyd40qcwxvktvm9a4n2ylv0af", "3230177235289866240"}, - {"evmos1mtcw76lha2vkcaqvextxad2sjrfmw2u7zj3rgh", "3067898550689976320"}, - {"evmos1mth550qp9p9ke5gtwwxdh20j3uhyx3f4ghv05s", "10962732541938352128"}, - {"evmos1mtjsshgu9nl3yvlhttewvl85wwc2mtwtch8gy4", "1439200366096842240"}, - {"evmos1mtkqnw2t8wqvjw2dhh4rrxga8v8g2ykz97ruvk", "8528155205775499264"}, - {"evmos1mtlnwl9xjz9w94zwnxha8uku5h9rxna3lywr74", "1061211018594779136"}, - {"evmos1mtm0xdx5n2l3qe0x68dlt6sy743agfxzp3j7ex", "4012058491386362880"}, - {"evmos1mtnjz45jg5kaaxkjt5pzjt9vktdr5us9c4gr4h", "47596281344668672"}, - {"evmos1mtnv5adm9t7jz0jcsagnmzch3yfza2h2uxgpdc", "72511475817972285440"}, - {"evmos1mtpgjfme9vamrfaf2malkxduuus0rsq5wc0kz0", "103473103009619712"}, - {"evmos1mtqtduasps2elsnvm8s484lsucze0cs8h44lt0", "387020982366350336"}, - {"evmos1mtt0t4meym2qmx3cx8esz4gp4ux5x9t0ft5l5h", "369301809084049152"}, - {"evmos1mtt8g06xdqt0e83gtvf8vxhcgvq2u0yujfz03t", "959435382284822784"}, - {"evmos1mtur038kmg637zlf7y3ezj57wu7jjtp9mnhqsp", "8223258375632994304"}, - {"evmos1mtvt3pevrc604459ykg2lejs8d9kzsgunz6ccy", "3288764887111143424"}, - {"evmos1mtwd62xyc7764nv4taa5zwh05n2zkjpwwhtn98", "3771513733962615296"}, - {"evmos1mtwlxyjdc3r5jgmsgktmr77cmfguy7dh6lgjvu", "1308368106702233600"}, - {"evmos1mtwww5ugpuj4en5yj27vv4578mc4ldslqpf3p9", "4551341229759261696"}, - {"evmos1mtzcunfnaegfcurswlh8nz7lvuemtkuep4dfcy", "2579000492284770304"}, - {"evmos1mu43m3r7hacu5kg5u5gp966emzrxmnwgwsqh6a", "1067725002758546432"}, - {"evmos1mu4hu2v6gre5f43zks93rh56a5sfv3vw7e2g67", "4951822782138175488"}, - {"evmos1mucvr9j59l20cfvd77ptwzzysma9rlmrkp7nyv", "13777772464655290368"}, - {"evmos1mudlvgzeu5sjurfzru0k98sjzp5v3hvtjqtlp4", "47830484880380805120"}, - {"evmos1mukfrxpym7938vllxjp0fuda5kawac0r9gzrl4", "1778680594795511808"}, - {"evmos1muktyy7qs2gyfkuqmc0yy8rpewx6uvx7au8kd7", "14303090184528404480"}, - {"evmos1mul3rfm92l0alatlr5vq3tm2kpwmtvsepnvwxf", "847900309014859776"}, - {"evmos1mulc7rjcpfmst934hm0hl0lsq5wn02dahj3t7p", "1954365577568639488"}, - {"evmos1mummsnjcjtkev4ajk2f4qudz83et9ww5ayvapt", "1478906710723436544"}, - {"evmos1muptx6u0cld7x04ykt59l47vpzpy2erj4mquu9", "49419007908761853952"}, - {"evmos1muqr5k36rp89lsp29hy80v8ntd5dllj8lhxnzv", "5966784383704576"}, - {"evmos1mus85l7czkwwxwxfq7748jnp2fm8htnrgn55f0", "4040320443101386752"}, - {"evmos1musyuwm28pldupnsrlrv8k6k57w765nnd3wp89", "1725631841093943040"}, - {"evmos1mutcg7fcttmx3c83825pjqa8n8m9gdnwgmwvsp", "3207434655091075072"}, - {"evmos1muv2r7ap8kd3n28p3ah4rw4znfu879m6p28qf3", "2806989154132061696"}, - {"evmos1muw73zmnsx238h87l3eg0x88vjkzyjfdfen5my", "2216281837286333440"}, - {"evmos1muzdmv5zxgd26v3wzkfxxchgdlp9w9twe28dmv", "1812930684926197760"}, - {"evmos1mv465rfttu9zn9nc9g5u5fznzt87arzjdcn45c", "20544276905279807488"}, - {"evmos1mv4e63esznvvdf09tk5jypgej3tm5e3yjn075r", "7069238039426785280"}, - {"evmos1mv4jjhskuzrpdvj67xq4c6q39e54jxg482vjwl", "3501008982334169088"}, - {"evmos1mv5glwckn9zql2z6vvt6r3pej3kvptscs74fvl", "972449182863541248"}, - {"evmos1mv6fgut9njnufql5lvadq9w707p7uk207r8mgt", "2017988461857523968"}, - {"evmos1mv6s5s8whf6r0k4gvkjd8ryhd9dyntres6wvvr", "4188153298046515712"}, - {"evmos1mv8j3j0h6renkpxj4r4zgwg6z5ncwmvt9pl3sv", "10900871425112434688"}, - {"evmos1mvd8a8f7w68e73va76wktlekgyuw5x5g3k7m97", "3398082654417808384"}, - {"evmos1mvdkxejlcj8g86fny70gzenc0skxyyqjqgca73", "398325754230019072"}, - {"evmos1mvdx68902u6nt578zyyraf79e5pncjtly09y95", "1017469411581913088"}, - {"evmos1mvf0tp7rf6jxms5nz7sczy69guzv8cvww3ktkj", "356396166765553152"}, - {"evmos1mvhktdw2elhgqdl84aynvv5yqftmsgc86eptx9", "1540417487243752448"}, - {"evmos1mvky8fzg44fph2sjheecgjlg0860uycvl4rhmy", "2510365753370189824"}, - {"evmos1mvnfzxkvv4lfrtelw6qpzhe2lxd4t6raa80cpa", "3502858711243195392"}, - {"evmos1mvntsaklfpclq286ngvc6yszgvph5mm6rmpnd4", "469090666413104640"}, - {"evmos1mvpyrkzqh4wmem8cxsnukqrz0x6rn97dms7ccm", "428373986563260160"}, - {"evmos1mvqtjslsvx44k9jqhtnxur82k9yx4rwa7mfdgu", "32553667243502702592"}, - {"evmos1mvvf8nh8u3q4w4h55zwgyflvsrzqkjxdj4qkaf", "5049664730311593984"}, - {"evmos1mvvvm5239eppq2dfkfn8alzpwtq4f22d0wqkas", "10835735966597498880"}, - {"evmos1mvw46kkd663zxdss3pr323qvjt9sapw2wa7nvg", "8539263449459161088"}, - {"evmos1mw20gk46rgrna4fhscnt62vgu30phxay0s26hz", "2403831612550438912"}, - {"evmos1mw4xrv688y5e89cd56mu3yrywale7femcfdcmw", "59739837778521038848"}, - {"evmos1mwk2wwnpyrak3axdvadec0ju8q76ay5ywy9ame", "3163974447948759040"}, - {"evmos1mwkprvv9e6zyvw5gmyl90se7tsguvt8k8frvcy", "392705513735556864"}, - {"evmos1mwnhjw38v9y28yq8jjr24j26msg5tkzurpmxfs", "13515724811792269312"}, - {"evmos1mwnr4zvhya9wpznjr6j5u5cyf46d7v8l79ea5v", "40864949365144854528"}, - {"evmos1mwpm4dum8z0hnmyfqc7swlxq56n7cnpu7wjxe3", "30203339911899185152"}, - {"evmos1mwpwsgwnk0svtgd7yvrn6m4vrxncvv7v7dr6md", "443258840339625984"}, - {"evmos1mwt3s4f0dddqvs3d0nnepg85wfq30p6nwcn2mr", "2562440576337482240"}, - {"evmos1mwtzv3xas3hchhmzts6e3rq83a7vf4ujpydqw8", "475512675828209408"}, - {"evmos1mwuts6sua2lqjscxftnzc6ldsz2vr7pcp0aq8g", "30237164911390982144"}, - {"evmos1mww9z2e6gzfhq8et3t479pleldet4kefq0dtg7", "153275673697579302912"}, - {"evmos1mwx8cumxavkapzawch8qywfv7x04xkplq3wg68", "2689568183079395328"}, - {"evmos1mwyfus7exp03dasqpd60av2wwm5tsvx5cg8n78", "36772564744555683840"}, - {"evmos1mwylvshzsut4kcfexu5fj9uxy3cesu02ec7avd", "17995808225650434048"}, - {"evmos1mwyptawfz4xsu0z8qm2zt88srgxrmcrt9yc5ca", "460972854873713920"}, - {"evmos1mwyq5kvkwch25yr2p6l9hxusep724y4rxy5x9d", "4278217324427624448"}, - {"evmos1mx04qzh045kuw0kkl2pnfhwduxh5peu2v00nt4", "566595707745074176"}, - {"evmos1mx28d3gfwpkpa2q57mt20sc9pnk3fjd7axshd8", "2392582413537205248"}, - {"evmos1mx2esse5eu0fflzlplukamxpv7kxd4raxvu83z", "2921031327516747776"}, - {"evmos1mx4fxtpekvs20mdqr7ag3cetgspzk0vqqhrjl7", "40385230948387110912"}, - {"evmos1mx4szga8zm5r2vu5ya2w8kz0xlmhv8sjkt95dk", "4204519979036409856"}, - {"evmos1mx4tf26m6wznk9ry0g3ltd4g3ez6jlfqst2pu6", "5340641134461386752"}, - {"evmos1mx63ptewh69s6cvvk23ugujd8e3c23dt0elnpp", "1701137388335104"}, - {"evmos1mx7s3zrevnsu3hhvmhfk3ngzk3avtnhucxkvd9", "35538250293928845312"}, - {"evmos1mxazk0e3cwf2qyeds8s0kwqj6pyst67vygal5p", "1156995638876657664"}, - {"evmos1mxczvnw3uh7t7jng2329r8ly8ldflf7lgashx9", "465271528865428480"}, - {"evmos1mxe4n9tjyq2kntx6wgv2l6pjdygkx45skk8cq3", "2674414496459915264"}, - {"evmos1mxe6xzc7kzfa0wkhw2kcn3ctw50jxhldyq4cry", "509197315970062848"}, - {"evmos1mxgdk34h49k52synuyl2vpyu64cpda8lgseu8g", "10231159273966663680"}, - {"evmos1mxlzjv4dqvexwnx67v37jkzt03vpayfzpr98zh", "1199491605189928960"}, - {"evmos1mxpf7fc5ulvrn4sp5q728qe3hs83d65a77l275", "18478202778405937152"}, - {"evmos1mxpswt5mqtkrlvd9g9z06a656ljhz2s4tvjgcy", "5350197861642207232"}, - {"evmos1mxq8l3npr0508sjd7m7qdgszmq99y8yx84cm4p", "6113756620959264768"}, - {"evmos1mxqaj3vcww4gzdycqs8x0w3qcaggn20vs9nauc", "212624065510339072"}, - {"evmos1mxu5w04knnl5jjuzjxq0wvp5ecmhmjwgthjhv6", "2248345603536207872"}, - {"evmos1mxx957fzm0unq9jqxfksqz6qk7857mv7c33q4e", "9254501078716256256"}, - {"evmos1my0gdueaenzf2c07gj5em276w55qntu82faew5", "2063552839688350720"}, - {"evmos1my2f7z949uzuq2gvgsrtufcyu94k0s6rqpc6m5", "847300984799186944"}, - {"evmos1my3f8kk2dwld2luvkm2f3dyw4ylqxh5ecj6s6l", "761269508130550784"}, - {"evmos1my4dtq6k3jmkl7jdxvs4gatr5sype423ftg3fe", "44365448446965504"}, - {"evmos1my5hc2cwd3zrwv308ne4pp9tfyynn5gv4l5u9r", "4942226799163305984"}, - {"evmos1my5kdwa49dv8ruuxusrf44elypx2cag0ryvkqc", "10036148700222326784"}, - {"evmos1my67lpm4cp88uvnlpdjat2e929yaz3wyu6fy7z", "10412624770151565312"}, - {"evmos1my6n6alr2v5m7mmqna0canxgfhdg6mzm5nan50", "12867950368975495168"}, - {"evmos1my7a32t5d2w4fdh2q0wfzgysw4z3y99qhsdxdn", "3692383575425548288"}, - {"evmos1my9ch4pdcqq0ucjr97zae62vxxvd3eq4t80gum", "638968027508588544"}, - {"evmos1myd77kw4wcr3yh9fwhhqphqzh87x3vstkwq3xe", "1857509159212569088"}, - {"evmos1mydsncf54me3vapwu45pw522eztdmxujqd97gj", "655459229911889920"}, - {"evmos1myf4r7q2yvuczfkvzl6wy4dz39p9sdqs00t4uc", "7086418712478534656"}, - {"evmos1myg9ahcq59vq0tx0z9vtpsz2tcgcujuqgjl5g5", "768066619786359296"}, - {"evmos1myk3lw6t4x0mfvwtz3f5guy7z39yweqfpzc822", "191619430189326848"}, - {"evmos1myk5n36d2wnrhzqv08rcral5384jf9edlpn424", "2282767270618669056"}, - {"evmos1mylel2ms0wv9sy55uff79q9e8pl6kwzvsqsjne", "543234006972286976"}, - {"evmos1mymrylukqw58mg9yqdqn7fw5juhsxkvlcldl7t", "1163187071608132096"}, - {"evmos1mynyrc96mht4ufh266969fkun6376jpda7z73w", "70025078120601706496"}, - {"evmos1myp9wpqd2an6q7qnxhrn36hg783c9makephuyp", "522699226096932096"}, - {"evmos1mys2fcwjd2954y48s5pg8nxz4luzdqqeqf2l38", "5006549553457364992"}, - {"evmos1mys3ngf989ytwnpr94srvu44d5473txqpafqx7", "1599498824233009152"}, - {"evmos1myv5xg95vx34xp95vt3uqw2a4hgln9903q2y2e", "369384142595954944"}, - {"evmos1myyztv2lwzmylqd6kcq00at0u0uxw37wn7fvly", "1256476183536928256"}, - {"evmos1mz0m0v54xectq0pglqw8wevpjxmqxmy3l5tl3d", "883885779755971712"}, - {"evmos1mz22jmfad2avqg2h8pxmp5wxdvhs5jsfx7qzt7", "991363155987407360"}, - {"evmos1mz42zys0czjjnwk9le6fdk8ak5sx8g28xh6rkr", "150316492786567680"}, - {"evmos1mz4n988vrf5krrm2nq84gv505x4tv0v8k5cfnv", "705986539509192704"}, - {"evmos1mz4tmz9nyn0wm39fe5umxptmv6y5m0ukxj2jcl", "7349742567167299584"}, - {"evmos1mz6ndwrpzx8tvhd4nshntwgzdc4lhl20eyt8hn", "90983922543487451136"}, - {"evmos1mz6pze4xc5wexchs57fhy4fmajf02dzz97ly4s", "98913728311979008"}, - {"evmos1mz8ewhmyk62aufnlhwshc9tc5746w9dqltp9yc", "11097024981296834560"}, - {"evmos1mz8l6ns8yuyvdwc5lu4vdj8ya0lu253cdtv5ly", "1927961570358305792"}, - {"evmos1mzhc840gs3n39fa0un68meen267hzyrudcsnmn", "3987563243867451392"}, - {"evmos1mzj2vrsfd2eun8hx7k5r24xfv5ch452p26jfea", "6651861718898442240"}, - {"evmos1mzj6pv8vm6e6r60gmkpqhe454eg2np3uf9akde", "12384806302972672"}, - {"evmos1mzjseeflyhuckz2ch8jc4qnzun6g4gyh97sh9p", "1080410800812151808"}, - {"evmos1mzjzenlqxt4u07dc54g797k8z3exyzzvkdkwvv", "42230196907732224"}, - {"evmos1mzkep74laehd7v3s2ptvyl3rvwymd08363qtx0", "1319649054860518400"}, - {"evmos1mzq7c7a7lkwm44fk7jvkx8ayu45u6x3zrr7aqz", "1796979781530188800"}, - {"evmos1mzs987xpkkqr53fqwx8dg45g83eaer742ufz43", "29835852882363699200"}, - {"evmos1mzssrxv3v47d3fvawdsp6vg570edrxt0k56hd9", "201708224528343040"}, - {"evmos1mzunmf8dxhm9c8czhhuj4vr4jp27n06egaswe6", "4544671521273110528"}, - {"evmos1mzvzwh5tjs5y9y24w5hcnlsgn88zx2psagttp5", "371578223776390400"}, - {"evmos1mzwnwtdhv659t73zkevywwm0f4c3wajlvr8phy", "5417598449995563008"}, - {"evmos1n000tuz5x5jrjf5d76ymjcu8vew4ynnyhh902d", "32722477234856214528"}, - {"evmos1n0043u02zd5e68ulljfs3z99ny04cz6npa4868", "3393884993727884288"}, - {"evmos1n022tgfzzxynkhdapxkl477dtxnjezdtetxvzc", "925780055698855424"}, - {"evmos1n03zp3auvce4kusxj5y2pc4n5zaeefytc69ff9", "5191319031563714560"}, - {"evmos1n064qtgd6r999ap7y0pvkj0rzexqqgv08n0443", "4750633924302663680"}, - {"evmos1n08736uau0um57lh88gjmxm5uyu36rvlh8ylhs", "1154790850915101184"}, - {"evmos1n08egfjee5tvqq4zm849q8568nc9pgl6jrevyd", "2214659176347054592"}, - {"evmos1n0dtxjhpm8jrty2p9drnuz04a94xue9vs0mp2m", "2190360670297260032"}, - {"evmos1n0dzntsr07hjjk2px6n0dkce0tzcqay2x82c64", "3090010921915056128"}, - {"evmos1n0gfcfsjz8n0xejngu45ud6e42xcfkkk0a3nqx", "2987044692358447104"}, - {"evmos1n0gm7ax4j24uuf7zxzgvz72t7dlrqk35nm972l", "1409505546679485440"}, - {"evmos1n0gyaxhlgaenkdjqvrweyexy0plrwrx7r4xu9p", "15656904734887936"}, - {"evmos1n0hrgeg3n4qfzss7alhdcen59hk7nrquhk0v9n", "26297816704850472960"}, - {"evmos1n0kkg02n06392anmns2dwaqld4crxgyv5vp236", "497960231793273600"}, - {"evmos1n0knpthh8tkk8a79xexcnv9qa928n2g09sr0dl", "6818410085188405248"}, - {"evmos1n0ncyl94fhj08jmvlgnfj3jupqar52trkxnuhr", "6631575690533048320"}, - {"evmos1n0pad4mge0ankjanmt9l86hgpdc5s9c9n7zl9t", "4121605028038410240"}, - {"evmos1n0pwyvff6lw7tdzm4avpcqg0xa9jd724kj57zr", "5546073831984902144"}, - {"evmos1n0uffw3qd49jaydc5r5mxllvv8tj0rfjkhpnan", "326032087012294656"}, - {"evmos1n0wz06pw0pqy54tmplv99r6jcqqav2rm28gsec", "1501120603530096640"}, - {"evmos1n0xx83xcfc60lccd7gzg8sh8g6c3pxmyr3kmz3", "888578402410405888"}, - {"evmos1n0ye0xyq30yjwmm4k849t2dazcwc9ywar8qccn", "1057153004669377536"}, - {"evmos1n0ye67cspj0cxwehxw22gga75zx3x678w3ejal", "1210186236588786688"}, - {"evmos1n0ymue7lxnys4untxskqqw9c6xegldm5wzpqnl", "891507934036223488"}, - {"evmos1n0znm6h8rezanxkf43kwqgdxmqn82309l4z90j", "956155790452361728"}, - {"evmos1n0zz3uz0lu0ermvxuxlc9h8xvpk2kc8j843cjw", "43697260382061871104"}, - {"evmos1n22s26ffkggaawtuxtwdlxn3czyykd2rlsnxnu", "3491858991273555968"}, - {"evmos1n23sp30w9x56v8v9vkr5c68ufcyy8qeumr3w2y", "167970334836899840"}, - {"evmos1n259d9ej9u348svruw6x769ecya765z5ugcrn9", "1869009368507576320"}, - {"evmos1n2a5g3ew4tatavenafgpu463uzxx7u09zps6v2", "1730641728900542464"}, - {"evmos1n2cafp2a4htm93lrwrjk53yjhl36yeyfa29zsm", "1622947087632592896"}, - {"evmos1n2eegh44knz3q5nfwehy8q68vg73rd4mpfytgd", "2074114603048967168"}, - {"evmos1n2esrl20y5v6ly72x945lntay64a970fzt86vm", "34413774961413185536"}, - {"evmos1n2hgz7vjt0gt8p0ca4a83aytuquhh5pjglv3w9", "1324341212211837440"}, - {"evmos1n2jxl4z0pzwa0xqvpes77k3374p7tfanqteycd", "31080601830146932736"}, - {"evmos1n2ncmn349cuzwlv9puvsav5mujqlh88p9ekkce", "32883830968263098368"}, - {"evmos1n2nrmfr2fqaxquhyrat4c54cl76rcsgg9fwpvv", "1290274689198311424"}, - {"evmos1n2pz5ycenavvtdgfdexzkk764waaw6fpusny56", "403692570722028800"}, - {"evmos1n2qr7q9fz57wev9z907ksl68c6m3luuwztz4j3", "3202680708085232640"}, - {"evmos1n2qtv6gzkgznlmnd8ta7lpxees9at3trh8zctl", "574588585181790208"}, - {"evmos1n2t4adnraffzyttq5teuxdzxn78jg7ac2w3h6s", "854620409076806144"}, - {"evmos1n2tahjd64yts0ddau3wgzpfkc9ace6c4np4eax", "106131177951397904384"}, - {"evmos1n2u7xwee8y95kuj2mxv0cw74cafk8sag8y0606", "216346932652480512"}, - {"evmos1n2upcvgdnhlcttf0vyy23ug6jjm4kmwj926g73", "3982484938068188160"}, - {"evmos1n2vzv9q2nxznqmt7pq6yqqzen6vylyt8j6d9p3", "1342905902204960768"}, - {"evmos1n2whsm02nxc5dfumt7hg556jy5p7wuc0fl6e69", "2377007207412956160"}, - {"evmos1n326fy40g4gepyefc4pa4m5ppxntw3kg957q9y", "2188497483453349888"}, - {"evmos1n33r62kl8m5g846h2ljlpctgmyhu6yz35jhanp", "1174211423849074688"}, - {"evmos1n35desxt2dafjxe2qyvuf36nkc5f2x2j2lqg0q", "5293347949548158976"}, - {"evmos1n35h5wmlnjteqh0hrp2687c08cukmyqjm2782z", "223475140097729024"}, - {"evmos1n36melnw7fwa08hlhxfzlkj7cmdn0adty5htjp", "1423208297207703808"}, - {"evmos1n376dff9kdgxrheht9ngpft2szjvle7wfa83su", "2766152379893610496"}, - {"evmos1n39gwx5v64elv3gq50xddlqn0flzh3tjr7u7kl", "735392479097955200"}, - {"evmos1n3e27x8uk3eq84ycu459g8xhf2j3s9wkzyrle9", "181589796197705728"}, - {"evmos1n3e3eqvysgkul9afluxnplgyp83k6vv97gvanm", "352564276381027584"}, - {"evmos1n3e8jw9rnnnwqetphqustzc4e76kpre8ufuv5l", "4276778823255874560"}, - {"evmos1n3jnfl9ukkjh9nmcvu3zz5l7fh205xt08a3gly", "1695800618029719552"}, - {"evmos1n3muq4rk7va7ktq8t8pwxlkc6xvld42jzag08s", "17535087349323665408"}, - {"evmos1n3n6je6mxqd4d4tt75j4ssf5q5h37x2dwg008p", "76461014044931555328"}, - {"evmos1n3p2kw837duapflny9aw08c73wktdvcgeenqgk", "19861649193406586880"}, - {"evmos1n3rlekpfunmdxt547aq4wdc8h8e7se9rzjj3zz", "320302154848264960"}, - {"evmos1n3scpuh092v7l3vx4vweenc00nmle0jh9ehe5u", "1432116589192527872"}, - {"evmos1n3t2rv6ppwhkc4w4g85uj45xzfwqhmsju46vce", "336410877411556352"}, - {"evmos1n3xqvlc87mf28cdckx6hjtek65gskzsml0r5hc", "2386183338202125824"}, - {"evmos1n4029z4wxzt9rvhvqfhrdj69hm495erfp6dc8h", "2779333663811189760"}, - {"evmos1n40fhcpcsupgczpy3sgw4kcrm9lzmfdwmr9za7", "1057237243789207040"}, - {"evmos1n46dqw6j6qyhckr70le67438xf6h4py22yu3fl", "845845284253573120"}, - {"evmos1n47cvatq3svxz7688d23pazv9m76cew9qtqcjr", "1252205561215602688"}, - {"evmos1n47d2603737fqdg4hsrcy70xja2z799n5c242j", "2957578462335778816"}, - {"evmos1n49rphuupkzy37jga76z8avky6ctt8yww2xcr2", "940293753566240768"}, - {"evmos1n4ch6cnkacp8hxv7frqtzvx6p70q92qyswpp5u", "7034952953626210304"}, - {"evmos1n4ffxw0hdux6q47wrlhq7gmr8pd9v5pkkzqsw0", "5442324777989861376"}, - {"evmos1n4g44vvjgtj30cctdfc8xqyhlg5g5scs49s4tf", "48249702483981312"}, - {"evmos1n4gt4m48x9wrq50gf4tgah2p4xvk274k7kxul9", "2404470317209526272"}, - {"evmos1n4lg45av2x3prqv0n4ukcqjrx7uxxcfdaq4de2", "8463867663293984768"}, - {"evmos1n4lmqtt8g6euz0c7hf0qplrnqxthqah09wpefu", "117014043766398107648"}, - {"evmos1n4tx4lctlty8s7t5pkc0uk89jhm3wdjms6h7u9", "72424303823695872"}, - {"evmos1n4vrfkcslte6dpvgj4wu9yq9w0ta736unmu8dz", "32144803473340940288"}, - {"evmos1n4zgz9ejcs50trzd2ykc2g0s2jvxlsed0vu28h", "2305304261922668544"}, - {"evmos1n52qkqxlwwhm23dfzv96fdnqh6t0trqrw69r32", "4373437261716344832"}, - {"evmos1n564vfxa09ya4f8ty4l75tayl9q624tzhgfxyc", "165528549855906758656"}, - {"evmos1n5658hst2x4m2yzrgt232kjkcc5raud54qcm8t", "1445230300544588288"}, - {"evmos1n57guce9ecnwmw5gwdymxctxxw7vgxaz0nfxcy", "1661459057772211200"}, - {"evmos1n58nffjaqug4k5gyc47uhfjsx9xl6g6wvkrqar", "9178473574387247104"}, - {"evmos1n59c88szk4pyyzwzfmcgkku2hld0yhv6xwwtcx", "5163378803946119168"}, - {"evmos1n5cg78uva69ef29x6ps2darkrrtkwgzjmz4gm5", "2337633570138065920"}, - {"evmos1n5d52lt0vu4jk4ze3jqpwh535twdqawl9kkls7", "412545999996916736"}, - {"evmos1n5ftkhl7l7px8g7ne88krkdt58mhdjjfglpf4y", "157091899366698496"}, - {"evmos1n5h3sz7m8krxkf56g7326p0t06yl2saavm0xp8", "97802407547272960"}, - {"evmos1n5hzn0jylvkr67hah6me7k04zgjrwwhl9m3y6x", "2249755778167783424"}, - {"evmos1n5jlgk2xyumjwund65trxrulklv32vv8q6p9eq", "1541578985569888512"}, - {"evmos1n5kf6xppn3vumhjswmsmt9u506etgm4wgnmdft", "917034781532084224"}, - {"evmos1n5puwx79lj7wef4gwsewlt6eamt0hul233fm5q", "1941322208636928"}, - {"evmos1n5r53snqnku30a9jhvy7asdcld5jcs2c0xf9pp", "2665490060887015424"}, - {"evmos1n5v25v9cn60q4l86dfdfn5yrller3k9fvaxw74", "923390812757694976"}, - {"evmos1n5vt7dqzjluqw0afhz9zxnptxg5a3zws8jqeum", "755874515988660224"}, - {"evmos1n5w45sk8mppt68472f2hdlkgf0vk8wrgwp6srr", "674686918772325632"}, - {"evmos1n5zswcuw0pmmdwqwlu6upv82n3sfjyu3383a80", "559313206646472192"}, - {"evmos1n60grdgr27qptszx3avp4j04srhh6kgdngs6pg", "545330710372375552"}, - {"evmos1n62v7hh6dza54lrkyhgp4nzesm8fcwle7huaqr", "1553443742025017600"}, - {"evmos1n63h2fd9qgy2v8xmpn97ux2pn485cpqh4zccqa", "28351174448104357888"}, - {"evmos1n64h8swaz27qj30q34j8ehjxag75tljwdepvpj", "656186021587340288"}, - {"evmos1n69q2eu23t5e36ulka43ahm7qamjgqxs6dvptc", "2710835755819262976"}, - {"evmos1n6d80q2t72n03qmvnqzue5r9yj5vqfpd57a0c3", "770265514359766528"}, - {"evmos1n6dlwj2nd8nnuahq7swqqjqmz638quguhmptw7", "29933867521051086848"}, - {"evmos1n6gte3r5humsh2nkgqw8vysqq8laqmrsvaw4yy", "973063238696658944"}, - {"evmos1n6lgqyty4xxd06cmjaqftx5vnt4p5np6gvhtzk", "2193391786598651904"}, - {"evmos1n6n0ll2gwyaplg7wuxszg786a7jh0agfm7e0vx", "5227318463637784576"}, - {"evmos1n6t3jmmv4a5pqy5xd48cpwyxrturkeyw2sec3g", "6468459062468399104"}, - {"evmos1n6w2jpzrm5kr77vmzl773z94q0h4qfalfnusrt", "430757823008627712"}, - {"evmos1n6ww8wzmvryw8ah42qmmnc9neq5ufajdhwvt6t", "478305706596754432"}, - {"evmos1n6x257nc6nf3n4r8nzv37nh08zrz5svhxe9kls", "19768389032370610176"}, - {"evmos1n73srwlh7wthgz3ztn6f2sdnygtjzzufzes6d4", "3149126440775633920"}, - {"evmos1n74qumhqd7ylhz88fk6snyqx4c06wqkgl0ysu3", "9233685566529306624"}, - {"evmos1n768ptsj0zl93ln4z86xtqfdg35klx83e7jfu8", "31415798430201905152"}, - {"evmos1n77y4fztc97t9pm7q250h2hdah8csccafq89s8", "1887269699292322816"}, - {"evmos1n7937hqyl0dg95hh32laqwexzp0fdvn5l4yk4z", "522687269874940160"}, - {"evmos1n7ecg7rjkd55zww5cx0ll7u3g5swjf42fg2ze6", "112966628629030912"}, - {"evmos1n7gxcuh5suyljm45x53cdrf9mjuyrt73yxgv3c", "1367382947324755968"}, - {"evmos1n7kgl0k03d94kzu86c0c2772xgzq0h7an6wj0t", "7686714810321328128"}, - {"evmos1n7m0kkuawn6geph2atclmvutfata8qy6zr8a3n", "757678528457508864"}, - {"evmos1n7m480jceue4flzxsjcdtx46fm034y9f2kq6h9", "28819998828727296"}, - {"evmos1n7newwpr4kzptzfnyk2mp0xqa0u94sttjqn0vs", "384031400921930240"}, - {"evmos1n7p0efh6x06d52ktmp7wmftv7nut4xvkdz8as3", "2222317207217115904"}, - {"evmos1n7su6tffq98jx9a2qdcjljkwtxet84a2dccjz7", "205500109305964032"}, - {"evmos1n7vynmvlus0h6eca2320k0m5m04ejlr9nfk8fc", "497970131972253184"}, - {"evmos1n84ns7q6vc22rrn3v38ft9vreff3jny64sjqys", "63981699466066018304"}, - {"evmos1n885s3jqhpav0jjexr4r2epx2su3cajvc32nqu", "5706823305525129216"}, - {"evmos1n88rsnn2tyegj8xnk626cnde0kjmecs89la34c", "6459059991199116288"}, - {"evmos1n8d54yrxhsx7ed8ne2mj2kmvns7w2c7tx87q3q", "88946520359565312"}, - {"evmos1n8dyf6rt6387n3575v6d2pd7n0lzfgs2988p0v", "6899470024685127680"}, - {"evmos1n8edyj6acsdhx5nmah2gl2kw50qfke0qj8l24n", "271136309907969024"}, - {"evmos1n8jd0murddp2kakh7eyg9mjjqjmv3qnkaksm9v", "2086505381842565120"}, - {"evmos1n8nkc027a30vngwvkmxutzh6f76k566kvm2ttd", "115993234808504320"}, - {"evmos1n8ph04xz03wuuyayevf7e0579ufskffel35805", "3354538338668898304"}, - {"evmos1n8qu89m896vdgah496leldu4ddgkqnsdxp3s2e", "28016507214953070592"}, - {"evmos1n8svpers64cf4yneaag7kv8fdcjgp9tywmxc2y", "1177322856455790592"}, - {"evmos1n8t6sezyt0ax2zahhndh3en7w78c9jv8p3rx8p", "351120274981390848"}, - {"evmos1n8tawtm3mme3q53scpp6d7ah4vyzcakqp43r0h", "2191888614471417856"}, - {"evmos1n8vnv6uqk9tzl87ye0tewpqphh7pag73wgkyap", "6488101154768224256"}, - {"evmos1n8y8wplnynjzc2cf5jnutknc6585900xmnrpgq", "253056041638516736"}, - {"evmos1n8yxsqfmhdnfmy09g4ufgqnffwl440y8m0sdl5", "2704839185878584832"}, - {"evmos1n8yzpcgatm3x54t4tuj00dkt2h48sgfkdx3mc3", "563997464725883904"}, - {"evmos1n8zjsy5ts0nxvjjzdcp7f4rywknvc3v8etqlw2", "7123602170174740480"}, - {"evmos1n90rsyk4tu2n9t0cuuf3k6ljhttxv5jep3e40w", "522683313944744960"}, - {"evmos1n93lp75ua4xjuja4s7pnmtw5muawauu7y2ch3d", "6393935387137189888"}, - {"evmos1n93zy8gyjwp72yy2acj582ljhm5ezsxyj9y5m9", "30258893998920417280"}, - {"evmos1n949ueku7xmll0gz4cekwtreudax442n3t3tmu", "4686004260885933056"}, - {"evmos1n94nqhe5f8fxmuupyxmdt2tptpfzpeylq53n4j", "5094313770764852224"}, - {"evmos1n9dlwn5c9gxd9ryqklkej8r823sh5skcjhgexn", "33459353604654686208"}, - {"evmos1n9ek4gyw9gue8nxhkrdpcurv4s9d4pprjl67d3", "8366821382628671488"}, - {"evmos1n9jjjynjlgwmwp35848arfqkf22hyw876v9yx6", "40021685701578752"}, - {"evmos1n9nll8wyj252kxyk2ra4c8rasza5egvzdz9h68", "1461784535568742912"}, - {"evmos1n9nvmv883c6wzverdrcvde7ga9napummndszq4", "473918069878741504"}, - {"evmos1n9rc5rfgqahqlnsrc3985wqeuz2e5jn6cxz40j", "10470379045744283648"}, - {"evmos1n9rf0vxhpvpduq833sk7vpxpehcc8vw9yndrns", "31309660684491677696"}, - {"evmos1n9s3e4ptv2q6nj77a9leujll2x5tr3wv02q7hh", "26602267612308480000"}, - {"evmos1n9s8wv2p6u4vf5n7zmjzr5wws79753uhl3wxl0", "3996884920417993728"}, - {"evmos1n9v532skzxx9uxqcpegf0ds3z3dzmmey7xrgxl", "62887414575759884288"}, - {"evmos1n9w9uv0ynp6d7egedpprfkcm8xuesvqfj4psf0", "1685555726612504576"}, - {"evmos1n9wmqjfw7cmsz3fs5jd8eu35jgm9znpnxxqwqj", "9036532127644483584"}, - {"evmos1n9y5neuxeyxcnzs6scekhj3e34t5q40yj4kxw7", "1542518768023144960"}, - {"evmos1n9z5wm3ry6tzs9xcge9ld9psqtgk0rchnfqw6e", "2984453957714395136"}, - {"evmos1n9zjadcqmrm3lzfpy7rlv9knk3z8gwzmpc0pc6", "102102652188370944"}, - {"evmos1na0d7pj3ty50uds4cpwvvzxpdr7ye3zzzvy9wc", "661973908340580352"}, - {"evmos1na0rtyknac3ra2tutuwwxaxxt6ycd9sypt69fp", "2704633613035656192"}, - {"evmos1na3a33pv6a3vx6an5cap8lwrklhwl2zngaqmy5", "1181988423953648128"}, - {"evmos1na3dqkv5adk098cqlvd9hjk3h5qsq6adrz5pqp", "1062136754033186570240"}, - {"evmos1na3qej7ts483246memllcsw6cvtn726g4lr8p7", "414986476612871936"}, - {"evmos1na49sjy7x88j4lts9fnrpwlvkyva2trkl8rn57", "4978482563363903488"}, - {"evmos1na4y2f8j96cmfz8072tm6vfttp85due6wsp5wz", "14510338568976195584"}, - {"evmos1na63g84vh2m7s7j4v2wvfwfthlklplm6mutev7", "29606767825981554688"}, - {"evmos1na8p6adljd0lszzljlctlvy3wpwwxgmyj7zqgs", "910426844101563392"}, - {"evmos1nacels8yfh2wc6rx3jlmvlkcc39r37y684n50d", "652135013310024704"}, - {"evmos1nacfh0n0u3hu697shkzjt8rqdlcl6jyqj0c4e3", "2636333187564527616"}, - {"evmos1nad6j23ldnvhz5d72zg6m4elhplt6sr9zessn6", "884576495900771840"}, - {"evmos1nads35lma2tnmajdwz250pgnmd29nmw3e7jfyq", "368851015943756032"}, - {"evmos1napcjlzf4ext2uf7aydfef8ltpnzr6048tvxjr", "384044958349613312"}, - {"evmos1naq60cj0e4tjq7dq3te9xr470kdat3amww0gzd", "11743886859452790784"}, - {"evmos1naqkjnzjlqrx6s028u4878u7rjz0fualn5sq5v", "16952100605266272256"}, - {"evmos1nar9lkwvlmwq4emudy483uv6ehncy7jvweny7g", "1162786106780616192"}, - {"evmos1natlfusnqe39yvrf57v27yn93rrjtc6g5jvfmm", "1694012002763259904"}, - {"evmos1natmfvfeltttyllnhyqv5nc22vcdlpyx33ynxk", "12143164908260777984"}, - {"evmos1natv3sc5dl54gwpvjurwjjcdsfh37he6lyd072", "4782660338499962880"}, - {"evmos1naulfxlxpnl9swns43rrqk6u6jyrjzvks8vq40", "16085601932961650688"}, - {"evmos1nax9dj5arnh5tgn0gsavjsmpj94j47q3s7l92z", "34186188977349734400"}, - {"evmos1nayxgf2mzns4zhc27ylrjkkme585yxeqsqh755", "869107558422617088"}, - {"evmos1nc3uk6nyywgn4p5ltacx62hkllmvkax8ezucwt", "776816333486582784"}, - {"evmos1nc4zp43fssu9xtjgxrxnxdg9g8wq27n7dz5kqw", "1175959876563382784"}, - {"evmos1nc6kvetp6wagj4sf7qnsvrvx62fszmuvudmjtd", "1956074611603075072"}, - {"evmos1nc6umfqs3rmcaaxxpwrydsthl053v3p69gcfsh", "153141673571408896"}, - {"evmos1nc748hplrvzmz89nf3pnqdmleuplx3alry7cjd", "702180291961234944"}, - {"evmos1nc7vc3cmsjewlsu2zsg06cde6h7urycs2qsgqn", "36910712298246340608"}, - {"evmos1nc95wq7vary7vgktgscumr8ltthn28hrxn8xsp", "403750377007356672"}, - {"evmos1nccw2p3nkn699jgexg5rx8wjztqp9x258w89uw", "1683850972222595072"}, - {"evmos1nce34m5ls2e9q78hhv2crlag8qadsj2yc4ujkx", "192104365103955968"}, - {"evmos1ncgxjgkprkzkgmatvt0mjtqxrlmawz07l60meq", "432809526797684480"}, - {"evmos1nchqp24k0sa8hqn7k0jrr39xcgrh2y9xur6f9q", "4903206701791952896"}, - {"evmos1nchzc0kmh5fnrvqq3gp3pfngrmmz4jyze9tjkm", "1161544476851980288"}, - {"evmos1ncqmkefuhecaccmnz5xmhrgkz3eawud6akulvm", "1734837479443136512"}, - {"evmos1ncs6jt9yt435geke3f4p5yl49slpkslmdq89x4", "7530565408321204224"}, - {"evmos1ncw6f2gjdd5r9nnas9uwxnf0kcdk99fqpxjpz9", "628963939042297344"}, - {"evmos1nd3zvjske9ckghqjrj7awu5cey92j0rna6p8km", "5185427421816602624"}, - {"evmos1nd40q78saewulqnaru4mtlhclkkep3d03uhvff", "44009924883696214016"}, - {"evmos1nd47h0cfm7jtp0lg54rcau3yv7mqg8mqppzzfs", "201229623510687232"}, - {"evmos1nd5nufzwl5n8yuzks2ugrufuv877e6celypz22", "1859295194884162560"}, - {"evmos1nd5smtcwq87qsmejr7a42txskaw9han7ef4vv2", "12617647444399951872"}, - {"evmos1nd5xvej9a7dvnxu8grl0079qvu4yxmv7l08wzu", "4862672400310189056"}, - {"evmos1nd6k2pgzetn4076lczs5ewqk3y9lux5w49zwh6", "6079835658723022848"}, - {"evmos1nd79r34lxjm3mdmtfnty0dmphnkccdl62ag9cf", "2761886199180908032"}, - {"evmos1nd8pfq8dylcyaxd5a3wz0v0gl22aal2s5a6p63", "2677816704588017664"}, - {"evmos1nd9893njzk76adhpfugpsuvzgychslfqw0lamq", "136680811661746176"}, - {"evmos1ndc2u92z2egy7afz5u25lsfjpylnjxx8hhzs74", "405623831119912448"}, - {"evmos1ndcszmc2e5lpdsm5tc9hwuywc9rnaqalfhrsjw", "1117362304295933952"}, - {"evmos1nddccdvk7hdchxe9lkmf28ykgjpqcchpxrpc89", "2190189763337895424"}, - {"evmos1nddsjw75wldwvnvf2sqq4fk2ka23gx6xq9lcjh", "404064531298008064"}, - {"evmos1ndkyew2yuk4yvgq55a884x2pmkxagckj8v83hd", "3513434978197415424"}, - {"evmos1ndl5tgnj63lztpcdw49zw7cky22mxev88ug27n", "1488802917791277056"}, - {"evmos1ndm9gpejwc5sjqqnphzmnnuryx5k2kusuh8c0q", "1052107461054859776"}, - {"evmos1ndn6dc8ps7qgr3d4f507wuyfhdteu70t8syskp", "384300571551294208"}, - {"evmos1ndqupa76ekzrggwx9n74fec8lqluwfg0jy4kze", "5795827264128262144"}, - {"evmos1ndqxfjwesq0svtehw5fwvx73jjzw0um9drspay", "4631103723260313600"}, - {"evmos1ndrrdh2nnq3vh90n7cjhhc9f3zdgkcdf38tsue", "6341743428896267264"}, - {"evmos1ndsm969tsg202qdkw99nerh32nfqgsdvv6jz6t", "2435748874632603648"}, - {"evmos1ndt0ly85nvlzhx3fu0vsvdmuyg0w2j99kwulk9", "53211522528279437312"}, - {"evmos1nduyz9dnyyfeql99yghxvrk3tutcx7h6mf3ww9", "1495701145861273600"}, - {"evmos1ndw0jpw2twd00vj7w5m732h5mrjsxg4nnuw22m", "726719314620624384"}, - {"evmos1ndx7lnqn240qxtnsy3274qd76ts3swgygdueva", "3399698182464539136"}, - {"evmos1ndyxreem6w6tlvdjdlpg3fq704f8rk9p0ympmh", "351845805907761152"}, - {"evmos1ndzmlz6ra5lfdykspmscd24nqqptu6y2n8gdxm", "392984312236879104"}, - {"evmos1ne2gs3ft6n669zjrkwdeklst5kdwm007xtpca3", "27167261219897344"}, - {"evmos1ne2m2qcyn7dm5t2qsjc575m8z2q6vkayva3cda", "1281038089798848512"}, - {"evmos1ne37vd25g60qexz9p3vwz3e0mhn9cplvukg7uy", "322095083212574208"}, - {"evmos1ne4vmzgpf0swe26rae7rtn2wumgan72j4m66zv", "1763052987319031296"}, - {"evmos1nee8k7lt2hqj6hg33ryrnh5fmzv2fs0ngxvl35", "465644420825627904"}, - {"evmos1nefk8vzypndwmjgx7gmndqeglp6j90xna84sqz", "519186544818700288"}, - {"evmos1negsajk83ssq7kfwkr7a97mmd88xpcwgck2aw2", "4645543631509372928"}, - {"evmos1neh43vkrh38fywem6a6gmkhu26znhqvcru20n4", "298701744003273984"}, - {"evmos1nejvkvqdrj4fp95nlndg5wx2svzl236dx7tcm2", "1743609237102824448"}, - {"evmos1nen59pkhqxc74wnmy4gdsjxygccaje37n4398s", "96922941863832576"}, - {"evmos1nenk607ryvejpcq2arejt0pzfwstfrg5r3tn2k", "2489878845089513472"}, - {"evmos1nennzmx2w6pha9q02nt6edv2d8yr52urlmaatw", "3994365093304994304"}, - {"evmos1nep0yzkj8lk6pn9gnx47dz9uaenucn26qaku0c", "2507769032693405696"}, - {"evmos1neshrp7hmn9vtqfzaz93laskwmkrwxhcm8kedq", "3467618393563717632"}, - {"evmos1neu2gdvmd4kx9fzq6p7aajw5hl8j5yr6xd0t53", "10344412134153203712"}, - {"evmos1nexkn3wygvgup0awxfzwh0fmhd2v5qyw2z3ktc", "41787245796854153216"}, - {"evmos1nez79pfzss3xtd4s756pvn7h8nthnylafnyr3z", "1250275556892647424"}, - {"evmos1nf2d6mqw8rtewr5cww4a4qwjr49dgyan9tykm2", "24160979628060397568"}, - {"evmos1nf6ljtdphd5z7r7394urfreexd43xr2kf68clj", "436553616188390400"}, - {"evmos1nf6ysshx9uy7fku5q8p8m8dpu5fn4rsnfpqx5c", "3652298279882329088"}, - {"evmos1nfa2648rlu9k30dj6j87rjfja9qnlum5uqz73j", "386191955258465792"}, - {"evmos1nff8swaty2a0egcvtj3nrnlssldxgt6lrtwlwz", "25720705706888634368"}, - {"evmos1nffhvtargjeg7ttczpc3af83g2tgjc4hgtzh94", "173330802071147520"}, - {"evmos1nfg808dzwxx0xt7uqetngcduuxgvzmkgwl7dqg", "1001407837561160704"}, - {"evmos1nfh7r6g42dg7q0rce5spvrqe7rngh967n3vj4k", "6163809612506051584"}, - {"evmos1nfhjf0jnhaz42jjhtcpakdp9j7l6nz4te9vhfe", "1085988529610292992"}, - {"evmos1nfhpwnpqrztjduhut6q58hmk4e83tu90avszmw", "3398992517969090560"}, - {"evmos1nfhwyr6cw9sq4pfl8245j4up5vdlwf25v5frq6", "2447589361137069056"}, - {"evmos1nfjy0s0vz5xcuw49dvptcyum4vaehv8k4vjelq", "431522175494027264"}, - {"evmos1nfkeqmn5yyxsexnjnmy60qg03pjq4wxqm8wnpa", "4976972344484640768"}, - {"evmos1nfp5ajturvznz5arxcpgqe7uxxyg3dx0hkr6ux", "4674522481469290496"}, - {"evmos1nfw0jcql2qqve8wn4qt2en7grnx3zt76m6l37j", "3585611178116475904"}, - {"evmos1nfxntzt2fgpkpg8jmgxfslfejzsh9gjph7e5e7", "1002914965646203392"}, - {"evmos1nfyzmmjhej0qsvfkgmf4dhpk5lx2mt2ypefrxm", "4812704881212055552"}, - {"evmos1ng0gv3w7mmrdgh3qtrgrrvw2jlupt0fwzzr3m3", "9659186450951450624"}, - {"evmos1ng0qdc4w3egdal35r8xzdd0pr43mctc42gcpqh", "1144652220197175296"}, - {"evmos1ng2ezfekkpmp9k8k5faxafsx0ajx2njj63f5gw", "368866077205873152"}, - {"evmos1ng3q2agejh8uxpr4v3m7gzfhknfllpr050wwm6", "7716531745655599104"}, - {"evmos1ng4patp7duwjdqn7mql7w9qksnfkxkrj7hnkhv", "4812688370483240960"}, - {"evmos1ng53mdpgymjds68qpmfkv85w4zmayf82vsszcq", "411348783431083520"}, - {"evmos1ng66kr0ge8y6yc6mn53cmegyae0krf6plhz9cs", "5294655989742317568"}, - {"evmos1ng6qgfz9msm753d7u4q26mmpxslspz8rcvtsf6", "386853589640706560"}, - {"evmos1ng8cxhqawgrtywenh9hc9wjtwcplqvpaauqm63", "474889706598915328"}, - {"evmos1ngcyfc9n9sqjfcj3c9fkep4fddrhgjxtfhe2np", "384436578945145344"}, - {"evmos1ngd0effvk09s5vjdt2vcanr8t7mya3l6w2zjhx", "1093822951333843456"}, - {"evmos1ngd60muthc2p8vkldpkvyppy28lz4waarf7lw6", "769536672769968128"}, - {"evmos1ngj06gsa89dnxvqywj7pekvd7jk8yn27p55pu0", "2637802828670030336"}, - {"evmos1ngk8uzurnu8w6caxlsjstjvfflaepujm7jtec0", "8522132506316005376"}, - {"evmos1ngl0gkrt62qzdgq2q680p8l6f5e9r6sqsn6q64", "1026989504227820544"}, - {"evmos1ngld5349sr03zvcxrpspap5mu0vesta6p9zne4", "405844825974351872"}, - {"evmos1ngmdt4z4u77sahz4v7ddkm0rymu9emmcm98tpc", "472827630621849856"}, - {"evmos1ngmupqpyunxk7tuph027v3zg9hru9vxzmcdncq", "4288842238930539008"}, - {"evmos1ngqs48ug8hh3vh24389elha52vndjscac7t6nr", "1604115652425244672"}, - {"evmos1ngr0achr8y9ry7z0rv4fjllj68fzvs65j02c2w", "40467424677170413568"}, - {"evmos1ngr9zw47vv3l3qf4cl8xywz5x8wsra7ktfs76w", "3136267942885675008"}, - {"evmos1ngse3ghvn8vu289g7kfhrpsrmpnrlfuglgan48", "3193582745609615360"}, - {"evmos1ngugrrje2cnwdyy6d7uzqkg5qvs9dgcrpmse7x", "1501890044112528384"}, - {"evmos1nh0kq68cq58ye54kkszqnhpfjsd3alkkd0sn8f", "13671955720760537088"}, - {"evmos1nh306wzuqz3uercg86mq2ydhqcm34vqpwk202t", "5538058743425179648"}, - {"evmos1nh327teee3jleq497ue7vch6z872fy4nmt2yyt", "735735661445356544"}, - {"evmos1nh3nu59ps892xn3p4myvyxu3sypstc34vfuyqa", "2276617725133135872"}, - {"evmos1nh5dagasxcsvx4flhpfc6hfr95w4kpzxn5lsva", "207691517390486016"}, - {"evmos1nh5rys855zg38zvdeuumav66m8pevmkjdx848f", "1327449562186357504"}, - {"evmos1nh6tvugt27zzvpsyfazhxfkvdxqxjdev2pnx4g", "1141176655106478080"}, - {"evmos1nhaxgnm4cx5n2emv09xasvjuagjamed5uaxtmn", "3037060639444500480"}, - {"evmos1nhczxn3rdcq2q8ykjk222m0yan4le3m482cu74", "496111913068047872"}, - {"evmos1nhejvgwru3rz587z5juylhwfvnnrve9e02wnj8", "3456508973825048576"}, - {"evmos1nhfjuae7rpgyxmscrltpfseg0hsw675lh7xa6y", "770856807489970432"}, - {"evmos1nhm8vprx8k9uahu56u0h5vdrfqdaw60ksvw4m9", "1318855198748210432"}, - {"evmos1nhmgyfvf3ztmlhup8x20k52g7z44us5j7f2qpd", "3203183090313846784"}, - {"evmos1nhmwfcmlm45ytquyr4sd56zhrlg86259fq3kn8", "1821673372577701888"}, - {"evmos1nhsthv7kgqw8psg9axz3yjajcrv3egxjeutmm9", "1035966069164724224"}, - {"evmos1nhsv8jpspkpnxtxepeyrrcnt7j3uss8ed4wl2w", "6583920707025446912"}, - {"evmos1nhwhymte034ajd6tl4zr3y9plcnr2wxamcruw7", "86731853678503985152"}, - {"evmos1nj2mpmed8cweefre2f96wwxg003gc9v9cy8sq3", "2453909029066681344"}, - {"evmos1nj3p0zgkp50tpyn7430rkxlm9nrt3mtcxs4ec7", "1676637178608400384"}, - {"evmos1nj3rydtj3n577k7g0x56hd527wsqx4guadstdw", "9858032126578225152"}, - {"evmos1nj4tk6qxnzx8wrkgs776833nvtn23l63d29kmq", "77250618556165832704"}, - {"evmos1nj89lmv7r3nxzwjfsccvgjvp959gh608nffqj4", "448565104433068800"}, - {"evmos1nj8crdk6ezcw9latrf2yuz2y7rrud4nyxp7ss4", "1904543684534592512"}, - {"evmos1nj8kxells2rmvayrnxmmqzm0df0fjeslqvc6qr", "2371972867985074176"}, - {"evmos1njc9520zlyt7x6nz7tyqw8fjl237k7e959deey", "1155942436781007872"}, - {"evmos1njf86dmafwn7n3049xge59p2yjwxeguhp3fwhd", "384504574182085632"}, - {"evmos1njj68g9tcercyvnzwzwuh0gm2993hg24lm7nxm", "2362705446330856448"}, - {"evmos1njjjhppxxh8nen8e5cuxywalemk844hdelgm72", "246223245978607616"}, - {"evmos1njkztutpugahcy2rv6wu24pusznqqdfrdq2fav", "455520002472420352"}, - {"evmos1njlylpqz0tc06n5sgzkafu3zv2vh284kre64j9", "8075379346828230656"}, - {"evmos1njm840325dhax75wjt954zlalqc6ap49rxhx66", "85835775562365184"}, - {"evmos1njpg4h3lu4gr7wd3h3vgzk8suyc5rtklpcak4x", "98969721828519168"}, - {"evmos1njr0zctfnv6l0j6u3lglvdrw0z9svd45m70vx4", "11962425577937125376"}, - {"evmos1njtgnfd5s833c7p7w72mfdu68slaz4kydvhag0", "32446305090891677696"}, - {"evmos1nju0zd6p2f77uxwguclv0t7flavwlxrkmce3cg", "588539780831361024"}, - {"evmos1nju55ud37ewptt4v6txjp2adp7rltvvclt2d9d", "600177251951952384"}, - {"evmos1njwd8z358pg0xzpthl6s7gc64ycu587c4d5tzn", "2092203480668348416"}, - {"evmos1njz4zsunugz7fq2h3u9mhk2rx6jy0jckhma2qw", "2017245071570064896"}, - {"evmos1njzg0vjxf8tjawuwy82v7872rw6tj43ztc0ttp", "107354315371968256"}, - {"evmos1nk0agw3nvksyny5y6dc9r632uw7vrknqwfcar5", "30910119647545344"}, - {"evmos1nk0kqcr2yngqpzkwjag83yj4ulwangnzp9llrl", "3635137502024156160"}, - {"evmos1nk227d3j4cdycx8utsvlaa4qt8rzxygsrvcena", "1495686896002465792"}, - {"evmos1nk3hu5zc9ymhghjgyftzurk02ne733vu0j32h0", "4974431046732739584"}, - {"evmos1nk5jasc6savl3g3d9dqv2kpz5628ef2eq6j033", "175442487270459392"}, - {"evmos1nk5s58suypwpw8aljzc69lkx70cvrynva4twuj", "16004372013495832576"}, - {"evmos1nk5v9xj6u4ktt3ljfdlcjjaymdfrnheh0ert06", "1787959472202478592"}, - {"evmos1nk60rs64ekwueu3t33t3h8k2pgfam4zvrnuef0", "14647081345418233856"}, - {"evmos1nk79uddz7xndcg2tmdld02x8qmth7zn5ptejxp", "1680364478592681216"}, - {"evmos1nk8s9senv3k4nqkc5vfgnuz52q6dpmhx8ppr35", "10530266708965928960"}, - {"evmos1nkaqvyu64zuk8n3tv96gqxh0nazwvl52sgggcn", "10513239647033167872"}, - {"evmos1nkcdwvnpvvfuq9k4y8q87vkvvp66mfna22sep2", "407574694380433664"}, - {"evmos1nkcuzpwtvyrses7j3x2tf82zj6hpncdw3gj3c0", "26941036428591616"}, - {"evmos1nkdsmq9yclrztmpqwfpg5m5cgchhk9x5cpjpsj", "38011074249807872"}, - {"evmos1nkemftwy6n37vryayas7ejgn56xg6pgecu8axq", "198822795356174848"}, - {"evmos1nkg2jrd3wzd4xg6y884jn8jl02acasptmwq533", "98856037126653184"}, - {"evmos1nkhv05yexkkxt4ryjqluuruxt6g53ej5xdxqgk", "10476262350757330944"}, - {"evmos1nkpkqhgy08z82ky0hg5d03rq0axtxpq54zpzdn", "1403940177136670720"}, - {"evmos1nkstt0p2cntxnssj6830fvlacda77hhfj4qnht", "469031589413951232"}, - {"evmos1nku6zx73gm5088wxzfrvx4a25y8j7gtszx52g6", "169242623140157440"}, - {"evmos1nkw74pst7lmykzn6pl0u3wcj92znce954zq7x6", "952157772085792768"}, - {"evmos1nkwetkdfk522an5a82432kplxdvlrdhyqc9dvz", "871227589081166592"}, - {"evmos1nkylqvsr2rppg48wx6tdlhwhwxd4rej20kktjc", "1229750430086190080"}, - {"evmos1nkyx50au44x9wjr743tx0dqzccgy6xguzgvzm0", "3305010828043435008"}, - {"evmos1nkzjuk8ewfrughvzehvhyuwyyns8uf6vc06pk2", "1233186579502815488"}, - {"evmos1nl0a0rc24enk7jkn3s6a7taa83epuhj9s0u4yv", "98067315913090560"}, - {"evmos1nl0a62728j035xk5qg0v5l8frcqyk90nw8y8zj", "710465559322222592"}, - {"evmos1nl4nzdvw0d39e8ejdpjd349gvl4ldmn7evu0z6", "8917800393944807424"}, - {"evmos1nl59wtrxw6uk5vnufm9ammmdlv5jvtxfvpt6t5", "5786452154012325888"}, - {"evmos1nl63w4qaahjvpvxc7ru6nannwmdpxejf5tqywf", "42468262843608424448"}, - {"evmos1nl7kv756qywumw7hpxlqruvwmu0rdws8gheppq", "40954799286563241984"}, - {"evmos1nl8trvmm6fnjqngcjvk2gjsk6w29cjpeyupad5", "8178532614605807616"}, - {"evmos1nl8w0tptdd7y8584w3yrnjzx38sjsce0ysyuy6", "5165525358850534400"}, - {"evmos1nlcapv8epg2ru23huqy23lvftxuasa5q52n6zf", "5682015086671962112"}, - {"evmos1nlcsvy409datznwd46e03eq6km656qsd48xuz2", "3071185981829988352"}, - {"evmos1nle3ex878msd909nja2n8p662ulj39afwtrjzj", "11289685979626221568"}, - {"evmos1nlek52m4a2q5rvdvuawuag7uhlc2hcjp4k4yne", "717369039011825152"}, - {"evmos1nleynheam9m9vw3sjlg2mp6x7ew79g9tu083j8", "1323484155778560768"}, - {"evmos1nlg2ut5sw3zq9dh3y8ds2xd9sk4vjjwavnf6st", "236219032924156416"}, - {"evmos1nlgj7u2qqs6yhstcansu826ytqd2rpmmy87p0f", "844059161008709120"}, - {"evmos1nlgntnyph8w3c8v2p6vd9fkpwwqwsrcnvr8836", "900337974025952768"}, - {"evmos1nlk0q43ht2tnxz9m84hmdvwzxr8ay9zkcund22", "14874963806835507200"}, - {"evmos1nllpv2um0772nyvypwfkl9d5pqy2r2vccnrn85", "1638367677199696896"}, - {"evmos1nlp8g47394hlcw46rn6r3wecgu2fcdt9lmc52q", "3195722910847827968"}, - {"evmos1nlp8lv5kah6t3d428njzaxazf0ayerf7u2z9ce", "407045800292192256"}, - {"evmos1nlq4jv8asvwt6avm4sev6wwykn7vqfamfhz8r0", "99976854400418048"}, - {"evmos1nlqgnrl82asxgnfv0vavfpemp75qzhaeexjt9t", "11858727817993789440"}, - {"evmos1nlqmvuhukpa582kd3v3el879tn89zgf9vauk32", "10908069115135320064"}, - {"evmos1nlteu5jxxrm55ezkcch85jjs4xttd9sqt9n5j9", "472537291305573376"}, - {"evmos1nluuy8akw2s9jzxm2l74mg7afjpg850ydcw6r2", "756144646446063360"}, - {"evmos1nluw4wmcqga877urq4w9zfwy2pfce0gnrz5nng", "56374544851304710144"}, - {"evmos1nlvxxgvp98psprn5xqtd5pwpq26z5hs4hyh5qs", "874525150751062528"}, - {"evmos1nlw7ffdmjydae7letvm5wr5963ndsyxhlxc9nj", "2764139758230727168"}, - {"evmos1nlyv5gg7n57yp9c7us7xfyaqyaf6n7prws0n26", "45667382407156992"}, - {"evmos1nm2pnep65hdh69ne8n2f4wezemvrl43vetdu6h", "3405751478914965504"}, - {"evmos1nm4gqc3nag7vlu2l84lvdz3c0ytxtxk20jjz73", "2673809888299810816"}, - {"evmos1nm5nfaese6hvdxcvmucn8uedmc6cs5jy06zhhe", "670485411840879616"}, - {"evmos1nm6fgqcytgcvh0xwas92u56tqtjufggac2nye9", "3280100522866038272"}, - {"evmos1nm6xgyq56j8x05jclw9g3xrwknmc6s68hy6s36", "429839961025792512"}, - {"evmos1nm8fh8fjrx5gkvg04wa5numwe544fprqrpw7qy", "41663623089449984"}, - {"evmos1nm8henhcaqqhc3ygqj7zqvz3j8wnx2n056jsk6", "16203324379611938816"}, - {"evmos1nmar2u4gdyccxtmfezlqmztqxqdqjttdz5f695", "1069127077868661248"}, - {"evmos1nmf5xqgxqgmw6h5v5g7e56xqg08sp6jwp5s5g8", "16816996602481891328"}, - {"evmos1nmg77f539gkfd7kyafraxn06sygm09pzvpxk9j", "14152080967106617344"}, - {"evmos1nmjz0j3u4acj2vtj8ptmyjvw55xgmf2vscre7v", "2557701812449882112"}, - {"evmos1nmkuq3gxzej9ur860s047gltsmtmzn4sdqum7f", "499560291491985408"}, - {"evmos1nmmjermkypfccale83jt85wtltjj6n36wwcrqn", "13269273863198883840"}, - {"evmos1nmrfhvh8gzq5y5fmlkwcf83j4cyu8w3e7p3sgn", "2025490656609831680"}, - {"evmos1nmtzn0pst3tnr4pauf7th68h09mgj0ptc6qvk7", "16974952812384870400"}, - {"evmos1nmyf2fycst4qtvpcg3trczyayaaffptrnq87sv", "413974712096777216"}, - {"evmos1nmyruhap7rlmu44m5fw34xgd4wq4747t97knk7", "13782893787366834176"}, - {"evmos1nmyzcfqjhc7qvnrg65tnhn3v0yzudh0evnhcx4", "879443622912159744"}, - {"evmos1nn3u9gk06czx6z4qwvh69vwusqzxm22y5nwk25", "294372980931406080"}, - {"evmos1nn44hjn9uk2e2ceq4hsk2mansgqv2gn9k0sgyp", "50111629049464160256"}, - {"evmos1nn5u3x0kew99ctucv2fvknc3j4pwzph5xp8lce", "13964628629127921664"}, - {"evmos1nn6lwguwysdcskf9sfsfyelc5ncjx8xusc09fk", "3932905284370464768"}, - {"evmos1nn7knj7lhsrq963df00eu09rnaucp8u4pp66dn", "1191388727208631296"}, - {"evmos1nna9fgs6zfsjk86ac9mfz86vredxx7hpd5hcre", "744011873569580544"}, - {"evmos1nnegphrqxz6lcnhks8ksgcu5e8z4m53xjnvz40", "1127151801142177280"}, - {"evmos1nnele5wtnmw7wg8ae2wxspnjqygq60f6a26vrg", "1603414772695153664"}, - {"evmos1nnh8l6lz48hwlmuq07s4g0l39p9tfkn3x5n8ep", "5394126071923171328"}, - {"evmos1nnjayucpazq57elxe56zfj4vqq9z7d6q7fxatc", "177129843763151360"}, - {"evmos1nnnflwznclk8hrrz3prqap6d8ahwlhnya4sq0p", "10497112822206488576"}, - {"evmos1nnrtjh39l6q6zyqstakv9mv84htku67hmwx087", "29906805401115398144"}, - {"evmos1nnx9eama098u3xnppfp7ygcugflg6jvd88m5nm", "433727134845041664"}, - {"evmos1nnxf72hnjv5hmuap0vrlgfknl29j4ghqz9h52v", "18550116332359942144"}, - {"evmos1nnyj3hlk72w5qaxy8qzncggzrm4tpp3ulh62f5", "382863712526200832"}, - {"evmos1nnz7qgfa5syuymtprufmnys38mrd4a4nfykjde", "492548549384732672"}, - {"evmos1np0cepr9tjklf5j9utg8tk4ye6xqcj5nlx6jyd", "3352849251356498944"}, - {"evmos1np4ehxgzn289tpnq580xlm2rucv3y6le8qac47", "1137174828701658624"}, - {"evmos1np4g47u2q9e7l5h58uzakc99ws7pdplzssfk6w", "815748923587640832"}, - {"evmos1np4k8m3fdksvfagu3m5zf5n2k7ak0vchn8zehc", "1062854431408889856"}, - {"evmos1np65h2gxydn9u9vl9uw9reu7pjq2m8rm02v0d9", "83190493486964736"}, - {"evmos1np6kfy08v6u35myysp2ghzls4zv8grckp5lewd", "746147260560650496"}, - {"evmos1np9lrz348yaag97wjcamt04q6nt4xe4ce635rf", "2088922403737305344"}, - {"evmos1npcxv4m09n08hm8sqz87vh7qnhvcgc53n00qv3", "2133774320925696"}, - {"evmos1npd9naldpqs5erq6u6q288al464nsmqa334p8k", "10400529598895939584"}, - {"evmos1nph4edt3svmhrxdut7vur0fmazk6svhv5506dh", "14794551379613812736"}, - {"evmos1nph6dttw77ewcdwvnwptrcmfxue9gsfvd0z995", "628004149969245696"}, - {"evmos1nphu7htk8nq4tx8sy4c7sraue9d5l5ulspvk53", "1549600747510161408"}, - {"evmos1npj4n3harutlagwnh6lmlrxuu7afmcqy7l9ygx", "14062017860345069568"}, - {"evmos1npjnxkf0kyvqax384sa42f9su8jss38canpxsr", "5504595866716515328"}, - {"evmos1npkmt7aykgdc4pzv62whkr3tcxs6zdxczn6f09", "12104868600289056768"}, - {"evmos1npkun0msc03lcmrtctjdmxw59j3xtfvev6x4p9", "254508183485452800"}, - {"evmos1npkuykuyqhvlmjrxavlsxgthvge20l33msahwy", "445714502084173824"}, - {"evmos1npn3r9p7ar9q52uv83qcarhfgmvl8cxapkeemw", "20125761402415079424"}, - {"evmos1nprs5j2elur6ulfnd0ustn7fcudhpe90kfxzft", "80009462855348224"}, - {"evmos1npty2xsnlxll9lzurw536myhvkcpme2w3map7q", "971426812624542720"}, - {"evmos1npv3c7dadf5rgh44al0vgja3lyf6thexc6xnrx", "8674345610979508224"}, - {"evmos1npw423vs70mnkurjtx6ce663wl0gn50q03seuy", "20264245479506784256"}, - {"evmos1npwq4c6h8tep7qfg8c5zzk37axmrxtlmqfmnkx", "14506220312001499136"}, - {"evmos1npztpwsxrwrrtasvetkv9rsn4fpzw877a4fwqt", "6801655039706373120"}, - {"evmos1npztt70cppqggvkjunxlx2zh0k68ayer09x2e8", "2513401270913498112"}, - {"evmos1nq4pjqlk0cd6p3h2xrt89neyakeuh4lzkfxtfh", "1186071977440048128"}, - {"evmos1nq5vyq58qktf7l0duhlxrvv8lyc8y6evmxt36x", "2407427307799771136"}, - {"evmos1nqd7h0h7ldefqzwx2lqnalh3lgqu85ev2745fs", "1479750424433867264"}, - {"evmos1nqdfcs5jj3c3mslmj2jau6jfjyhpx08wsnwkgx", "1412158174125379584"}, - {"evmos1nqf0cwl7hfp006gy4szl7szq0wj0d3cggfk684", "2636033466290212864"}, - {"evmos1nqgg9jhps9phy7qcsn72d97v8y6lvq5fcfdsmr", "16200200076915515392"}, - {"evmos1nqhka6p7df608vrgjwvgcyqzhuw7tk8wjrylkw", "2919846650825165824"}, - {"evmos1nqhqsmmft2fasxahnln422cse9xcp6jhzn2d9u", "384478624921467904"}, - {"evmos1nqqqgvpnhj7cnx9mmf9wxfvl0pa9xm26qt4cvx", "883372391653277696"}, - {"evmos1nqqxn2txk7kwcx0dhxfn57unnz2cv9ae8py9ar", "3562171536960348160"}, - {"evmos1nqveuug8g5288ed0v209shxjpe0j5awqn5vl5y", "4982824330487709696"}, - {"evmos1nqvks665evxveqtpap8z9km6u8k9f9svsk76j6", "124114050708553472"}, - {"evmos1nqvy3elhmkcexjha3mcmmavmmvxvqxdzuxura9", "2706366357844749824"}, - {"evmos1nqw2c93ydktyr0s8hwnwr83sfd6tzuaufk9u8w", "5160924632904118272"}, - {"evmos1nqz6dwms8s3rquppjraaj26sqqldhae3j57ynz", "2435730801793823232"}, - {"evmos1nqz99hculkxpnfpyvjp5v87wuhv3z8zemh2az5", "44468079131972096"}, - {"evmos1nr3yjddang07ugswqa55knlwhzdee03p7hhmp4", "637249241867042304"}, - {"evmos1nr43p05zcml9a7qzyptjh964q2nql4lac5mxfd", "2889502569495489536"}, - {"evmos1nr58xwg5yrayry7fmf7wpu7xmsuzl0zqu98wcz", "368923373771700480"}, - {"evmos1nr5k9rs2pmre4gphlp4g8xe6h0z8j50kpq3mjp", "5190306671957696512"}, - {"evmos1nr6gm03c2l7t5teq2e7frnhd560n593chycrkh", "30086284400516042752"}, - {"evmos1nr7ll9h8elfqu5j6r6tvhwqkgqtt5zun5d0dwa", "7660820644722267136"}, - {"evmos1nr8d6c8pfjv7qry6qmmsqnxctwqn3d9uffl6yd", "17399010497888321536"}, - {"evmos1nr8pmzqme7j7lgp6rvagcyf7ea74uqfysfnap8", "2128053447406690304"}, - {"evmos1nr97m2z4uhs7u4xw5ae3kyu664z3uh9n7jm9vp", "3436404352497221632"}, - {"evmos1nralxt040lyqa9ef9ytrfwa8raj9g3jt52n70u", "680451876689536512"}, - {"evmos1nredw3yzj9fhh54lynenxzsqpwq0k69cl3hcuk", "1246221885237142528"}, - {"evmos1nrej7yzw75f2wundy2x7aycsnd6rnefdhsnp95", "6227993485512701952"}, - {"evmos1nrek2t9v6yk0wp2thxke5ydqe2tct60thdd72k", "352909570427776768"}, - {"evmos1nrf4jerfmtnk9z2vrsancqh92mffv6zlme3ax2", "1090999171803820800"}, - {"evmos1nrf7pgawn08hwmkmuhrxvc597dgrqy85xae9xp", "6830387269534892032"}, - {"evmos1nrh0ptgpwzt2zl5rh5cdgpadkw7frzdzefttfs", "20937886978538975232"}, - {"evmos1nrl5adjdl7tpsxpqph3kss0w5se2mglxvvfqxh", "9134783739508719616"}, - {"evmos1nrnag893sghut6r0g8qzjptpel70sl5ekxax5p", "475253107276460032"}, - {"evmos1nrr2gpr7vyrl96ylx3896qdancvf8vylux8ncx", "11042156486028814336"}, - {"evmos1nrt0pyu2k87mskx55alzd24er2wnprhzfxxqeg", "2432132937385156608"}, - {"evmos1nrx0vpwy8g9ln4nets708d07mqmrxpg3l836uj", "7289504945100800"}, - {"evmos1nry5z60lawejztm6dlaamdj2vwd2edkwtp05jl", "467134678437108736"}, - {"evmos1nryj8dqvxcf2zsl9h9axzkpv7lsac7s2pu9uy3", "9075178085599893504"}, - {"evmos1ns2x0kw0gswz59rlftxr03rcwwnkysdj5ytam7", "18899562520936366080"}, - {"evmos1ns4jp8xc34yjlm692ykkgxkl3uqr763p3xg236", "370851107455075328"}, - {"evmos1ns6lcvceu83cpv5x2n6ngzlv6kangs024qtsds", "26717007376107520"}, - {"evmos1ns8g30t4pey9cpucr8z8dj5q8k25d4m3g46rmr", "1085930415305359360"}, - {"evmos1nsc95mttnmjwqufcth7vnglltmgk8tw6774dut", "9970224738245234688"}, - {"evmos1nsfqhll6njmrsgwkv5keex2jh6nrq7h2c7ta3g", "13175167311068409856"}, - {"evmos1nshajhsm30vmu4sjwq9sk2wgj0l2g9lphpjr2s", "3856173195134513152"}, - {"evmos1nshpzz56t2msd4x85qmsqj8e5f3runwwzl8ht5", "1591034091864284160"}, - {"evmos1nsle3nup0nyeyeegnueygh52662ntymtlyzqlw", "12270390560066529280"}, - {"evmos1nslkhcnxrzxlqhy9tv98vl0m7uqtlm6fngxn9n", "95072259396955471872"}, - {"evmos1nsmaupa4wrkyhrk84vqkrxljmvhtrvzw6x5z8k", "1426024327121936384"}, - {"evmos1nspctcsp5zf7h9wfh6hjdcufw23c6qpaqt6jeg", "23113052781644472320"}, - {"evmos1nspuunqhah5wmy2g7pr6mkepnpeyt0m6qnw5gl", "32194393014117892096"}, - {"evmos1nsrpmnwjhyt248at9dnp4slkfq27s793qrup59", "689245523931231744"}, - {"evmos1nsty3y708ur8jpw2uqmqmqmteudxnf00kygc89", "3240294677362797568"}, - {"evmos1nsu8qludpd9vpyfuvuvuhyd7qtt5czh7ddfnk2", "46888597171712393216"}, - {"evmos1nsxe79nggr6z376acp425g6h6fxzg2cyt2nk6y", "522691309717189120"}, - {"evmos1nsyep30yw4epnthqqjgfg55as5y787m2pqhxn8", "19605859634699722752"}, - {"evmos1nt27v7d6mzg5jklzvsasu3uypnpf2f40jghpk7", "957007234174499840"}, - {"evmos1nt33ahlwghq2zmkd67r9tnr8ea2a69arqlphyz", "17573697654642688"}, - {"evmos1nt3cthllqs4wc4vl5zfmxl2drm7hkmyq59wkj6", "1904044877093421056"}, - {"evmos1nt3tguzjx05r5m74tsgw2q2vysgfu4v32y6xf7", "3774525681749692416"}, - {"evmos1nt4pmmwdesazmtjrl08valwutgkaayzj3f4e45", "13268089115116515328"}, - {"evmos1nt5a7f33xqwdj4rwzm0ayhjgsclssgs5ak0zvm", "26632688905663381504"}, - {"evmos1nt6qu06y2al0tjgm4gqfx8m2xydqxhkfusaea7", "5255390690061614080"}, - {"evmos1ntdfplpp329ka3j44yz9d7jwlpxdx2t6lu7pe3", "2689868660319646720"}, - {"evmos1ntfqj0l8g96j2whwv494ctx0pj6h9l8ev6jl0d", "1605940776732639232"}, - {"evmos1ntgcq23wcvr7d5rk5raz0msymwxet7yyz3sd9x", "12619374013604380672"}, - {"evmos1nthqsykztlnr9n8gx5s7q9r39qzthd5wvku83l", "4548768605172727808"}, - {"evmos1ntkfvuxlekdgdf20g8wp5p0hdzzcg4l4gldl34", "12120808200693338112"}, - {"evmos1ntkgmfw5jrkfuxv9lu8y9nrh28xeqna83smlzc", "15658122432536576"}, - {"evmos1ntmk3dh55zf7qjsaa8jdhwrexm9xejlg7vycu5", "650628971263867904"}, - {"evmos1ntmkkhe8encksgx5vmqqttf28cwpt28r0c92nh", "19517503118278656"}, - {"evmos1ntn2gr6qfda5l3c6camgahjd97f23j6wm5svdq", "441372313642709248"}, - {"evmos1ntnk89xutj9vdzw9ypj4qtmrkv0dzsm0c2fe6z", "7849509212941651968"}, - {"evmos1ntsadr73hcgy3gmphrxd6rv2mxtqm45r2vx59y", "1734794312285617920"}, - {"evmos1ntstzrhr65zdevyzva4zjkm65jd3pcu63dxwqw", "367066384547203840"}, - {"evmos1ntwlmmn9agseflm9gr5srwxuj3rcs8cn7sl4ps", "22391162377487687680"}, - {"evmos1ntya66ntgy0axvrhgmf0u8tcm7sfklvqf22cxe", "8501898431890055168"}, - {"evmos1ntyr8e2xv4l0ccprwg4szt9g8amsvuftq86kqv", "714550871104650496"}, - {"evmos1ntzvjzzjykhnpgf5aat0ls0vltanf7wmhu0xle", "3733262454215350784"}, - {"evmos1nu45yy04vjjya9w05n7kqyqzjqmhwamhzxz3wz", "60381611562469130240"}, - {"evmos1nua2yrgmqx8ey6j439xncuhadn4lacm72fwrrs", "384500541973383936"}, - {"evmos1nuakcwa5pvqdu797x9akzt6apqy6dtcvytxu4v", "1036847486503917568"}, - {"evmos1nuctdhdq0nhdcp6jhc9qwnn78udxt47nsm7gu3", "3776062964584496640"}, - {"evmos1nud832eyad9pgqjqqx5zvk882ms3v2f0zl9hmr", "164912964191137300480"}, - {"evmos1nuf9s7m3znzhm8t9sjzng3ahptgvfdh3q6kfy8", "10005057322919976960"}, - {"evmos1nugfvphte69tc7yhd0xc793nmrzzkjr5kmr2kx", "24206868779865636864"}, - {"evmos1nuj84j7lnmrtfj0t83s9j6meuzn3cqn8anwf38", "63520654722054144"}, - {"evmos1nulav0a0auaqlf7lghuqr42u2xdjygpm3uzs5s", "12364887755441061888"}, - {"evmos1nulfenkg5dg972ulgsvrf2qwlxzq83rcqn96kr", "129495509493486080"}, - {"evmos1nupcdxhhl3lkps9l8wxy4q653x99q45fda93dg", "1672278652059559168"}, - {"evmos1nuqn3jp99lyld8fv89yza30n08jfmw75xjgsyd", "97755904334973696"}, - {"evmos1nusftkk06kd93p2mduacxud2plch0gqscd4qug", "20685662828342185984"}, - {"evmos1nusq0jg2kw4f05qjaj8xrjt27vghf8yp33zvam", "3458753894998171648"}, - {"evmos1nut946dt60yvw20j03krvw6pmlk6enqwuvpvyn", "36535530036383297536"}, - {"evmos1nutle6r03ed9en4g2l6hcjp49fl04h40353lm2", "252713339871232"}, - {"evmos1nuz9nfsrcgtkpnzc3fpm6zq60058ln6ugrvg5m", "37533358529818107904"}, - {"evmos1nv037uuzw74dpctsgyk5wn3n87r5gmd66xr5vv", "553697502029545472"}, - {"evmos1nv07af6gh6xs67rmww3r4e75xtdglhfwa64n5e", "1687024128408005632"}, - {"evmos1nv55mnkuepwlqzgwy3qn8g5zynqhmuzpgz5fdt", "2336456325725676032"}, - {"evmos1nv60mpes0zd6sj7segargtwr0xsun3h79qxu45", "817957205871424000"}, - {"evmos1nv7y6rp9xpf36hrcptear28y0qjkz4llse4cfq", "4069574874788088832"}, - {"evmos1nvdv3eksspfu24cnmx4glhsu2056j20z98z3mp", "109441213394049269760"}, - {"evmos1nve2kl9ve2xuthef65wcmrrd45vpzvjrductuh", "18948109553913856"}, - {"evmos1nvfm69vht706s55y6lcuaaz8lrtnq2cn40r3ud", "31677244726328832"}, - {"evmos1nvgrjmanhzgrw0yxrzjsxnj9rx4edsf4p8ff8k", "887548560962797056"}, - {"evmos1nvgrnrvxxuq5hv2fgku2djqyevwr35uye934lf", "6380381334789177344"}, - {"evmos1nvlj99knqmkvlrhy6z68xs06zdvjrnu586w8fe", "385975719001598208"}, - {"evmos1nvq6m43zvgwcz3gsju2mn9k3s2z4hdzss08cvx", "1637367929620271104"}, - {"evmos1nvr0e9n8pqa0s0a8y73f2p5j3j8rmsrecgfyd4", "146110824139761152"}, - {"evmos1nvs4n8c27ttsp8zcpya6w6ajs0c5p284gcz908", "4708101323130671104"}, - {"evmos1nvxpjqq2sccura24hvm9hh3sswzwfuhlvuypwc", "111200450064303980544"}, - {"evmos1nw6gvk06rlyv2s2m2hjnklmn2ka6v8dqj0yk5g", "4666554699339851776"}, - {"evmos1nw8h6cdtr93qng02paeaa0h96cesqp4hmp8tn2", "9921299078286592"}, - {"evmos1nw90khmvh5xtnas695mktt9at283hyg60etaz5", "271727743082299392"}, - {"evmos1nwepzduu9hfcgsu6e3ythx5en2249x8cdw3q0w", "3209727887203818496"}, - {"evmos1nwfm8hs5zcxeeft9ztjf7mv5e3mpc9sjzj3twa", "612552675950041088"}, - {"evmos1nwkczlnuhcn7l0zts7kndtp0datvg4dr4vvgca", "21546478930467069952"}, - {"evmos1nwnun0xk5vq6ksr7l38cuhfta6e4vzprhp0s2f", "48418082580141981696"}, - {"evmos1nwptfr4vqk92a0vk2flg5069wvgclshdy27x3k", "2801731857821044736"}, - {"evmos1nwqc44ewfv7dqw7tujzg539jw3sccn972mhppd", "356111911637929472"}, - {"evmos1nwtkmfy96tr06yvr98juw3vpnq6yr8sy0z5hvp", "191134063669480448"}, - {"evmos1nwu8u8kdml8zs5we59ejfdagglrmcv0hxcswgv", "161397636458878976"}, - {"evmos1nwvdn9rn002mj3tn60puqeum8zky5mhgkvvl0v", "3293778962314782720"}, - {"evmos1nwxhkgm32mxwtd4cpdz0zqjjg9fmrqsr59y3fm", "427129996513328128"}, - {"evmos1nx0lmh5p0thv6p2tqc23jnp634y4wy60hxuk5y", "34601070501638144"}, - {"evmos1nx60g00f5qvqt7krdv52r8dqzhalsvlru55yxf", "467226254274021888"}, - {"evmos1nx676l7xey6cghcdlyrl02yz7vxrat4yrnlcnz", "4315400948469665792"}, - {"evmos1nx6v3rlnt5kxy55u0kgmd6kgncklqdt6py90vj", "9615848990351953920"}, - {"evmos1nx7gu7jws2qum9cttwmccjp98ws5rn4vrmkr2z", "423104503052835584"}, - {"evmos1nxajsn4lw8g7un4myq8spzjwzz2fm85m5gk70h", "3448712152416264192"}, - {"evmos1nxflrufxag47dazwtr9klkctjypj7wwnqc3qll", "3490547769871798272"}, - {"evmos1nxmqesdhqqn2dkdqmf8xp65mx80df3hxpa4np5", "477710116601654784"}, - {"evmos1nxmx6hrmujv6h4jm6y8vnpj8x5x76py8cf59ry", "1314975677122809856"}, - {"evmos1nxnch6pwgwymkwhleyuzw5saqwrryhlmckxxlq", "1734867211694882816"}, - {"evmos1nxrk3hdaycfw8ssg8cmc7dd4rmj79e6e46gfc4", "28564322569568141312"}, - {"evmos1nxtzulgsnqeal3u9xpv8a4cjwznqvqzqqu8hs3", "5470339345697435648"}, - {"evmos1nxultdtsm800tgmuckzj85r0x377jg6t540ydd", "1369820020101498112"}, - {"evmos1nxvenmqsxq9drnngpm5htr0sypczsn5zrmpgjn", "9026622122725286912"}, - {"evmos1nxxn0r8p7w2q8rh277zpx6vtuxzfc2ej5scgy3", "5344528074064396288"}, - {"evmos1nxzvg9wm34vdqqhn4msfz4w2lcd3348lgngy8t", "1906264154734876672"}, - {"evmos1ny20xaz9uaakpg56p5qz9hvxvyj8p59ffy53p0", "384713572782508032"}, - {"evmos1ny2m3g7ey6rsak9gr0em7lclh4xwl02vdg38yp", "39791847637639151616"}, - {"evmos1ny2t5qqhptfcdlgx7nlte9thztrtt0xv2zhwa8", "4863673884331868160"}, - {"evmos1ny3zrz2mp0ksx9zf6th7k7fnqss6nu74wd44y0", "16549255289734436864"}, - {"evmos1ny4vzk9ls3e3fjj7lqwfxxg6dyx8rn2p02z9q6", "2428342465496615936"}, - {"evmos1ny6pn3xnc435pf9lhgslymt9vvrdfcfzj2323h", "474792338938073600"}, - {"evmos1ny76cp7vupdzpy5r66dcx99dkt6xljggv222vp", "1170377449845358592"}, - {"evmos1ny8lu2vq62025fc6jug0rw8r3gge8m6hz5l0t2", "14979964813279776768"}, - {"evmos1ny8n3dsq3fxsps2hg7ldr4xdvnseskkrqasuk6", "4873696263213711360"}, - {"evmos1ny9yqu9zd4pz4s4a7nsn6ktg74qaex48p93fkq", "8771549687215472640"}, - {"evmos1nycsgqe36tuhzx9apncxpx05xhy60yvxp5u994", "1046719814091565568"}, - {"evmos1nyd0scyx542wg92ky97aewzl2mvudkpatm59js", "659220296324464640"}, - {"evmos1nydtxyn949hed8l6ya5stwl9ty5g2l4pfhsqaq", "7853006096869732352"}, - {"evmos1nyegjyd6ld905vjl0sldhyhzcszanhc9gyj9gh", "426855561352422144"}, - {"evmos1nyhfv08my73yr9twhhsqlh4fq8388f2lf4gwc4", "6287914329073339392"}, - {"evmos1nyhm6sv7894pqynnfwzxuz654he3jq4z4n7p6g", "1229285314433009152"}, - {"evmos1nyj44h48cpxs778pca4r56fjkx57j0hfq7ywcg", "1850481412527395840"}, - {"evmos1nymf792tkld4ghg8jmt7tx7k6zml2nhza5rlel", "2355026387704689152"}, - {"evmos1nymzwj0amzgqgktxskkjdy99dr45r2frdc5m27", "47292954319843090432"}, - {"evmos1nynlf2m4wmlkz8xngxygvqye8qs6dr09h7dve4", "1802576664684434432"}, - {"evmos1nypzt3canlccs6vgv3he0srl62j5wc69nnynuk", "14699863669929639936"}, - {"evmos1nystdkewprfr77khv449aggar2mklajn42w5zw", "103706446807946752"}, - {"evmos1nysxnd6fe5nnrz32t2m5cvqkfjldnmfqsmtraj", "691582555841036288"}, - {"evmos1nyszxha2prujvdy947hsw4x406u9jpeegrznt8", "2128204020637560832"}, - {"evmos1nyy9ngal3qqgzyev80ea7hhc67697pxcd5gkq4", "2817571917367602176"}, - {"evmos1nyymruk5zmepxjllz0kvhncwh08h46v60vza7m", "1004859007395086336"}, - {"evmos1nz2w58hnnmxjgaxnsh36ac5qn8xlvf33ffd0dv", "22738331258921984"}, - {"evmos1nz3a3spul56225qczjj5c0e73qhxquc3edq975", "2837454784884965376"}, - {"evmos1nz3ng4k6kwkf23du9zeefccmnc9ch9apuyutsg", "5520374791177273344"}, - {"evmos1nz6uh6cfvprp68a5j5468muwzewepdayu2gxne", "1292639488711534592"}, - {"evmos1nz98ptrmt8m8g83xg2hfllhr93m83cu54kwjyx", "439168735322102272"}, - {"evmos1nzctam5jk2y2qerez8wdwlg7xt6ynqd0gwpzs2", "790431696433076096"}, - {"evmos1nzf8wym7tugchsku374xzhahhuv90ehrg7u9ka", "602342519926217728"}, - {"evmos1nzg3zes0tsy89t2x3qw4vfnurpnc9keze6d04u", "883726686518234368"}, - {"evmos1nzknk0vvvwd3sd9s7fm33dzqvhxpgkylctdk6f", "835826137954006528"}, - {"evmos1nzmg89dncqfx2z2mj48t3drtlt68yqjpfkcuug", "386191955258465792"}, - {"evmos1nzp9rsfddkes0sdfayegpkgtnqs47kzmdpjls2", "129278481086857216"}, - {"evmos1nzrvmngrpqdmwp8yzxra27lxe8xcugx8cu9pxj", "1199811100630943232"}, - {"evmos1nzv2ydxrx9nmdsjdecg5lwnwf3sy9nx39xxntn", "764290129937559552"}, - {"evmos1nzzj0p6v0clsyy2l3xn2juf4cu9k53lu6ae0vt", "442444602203459584"}, - {"evmos1p00n8zqqw8s8uynfhqggxdzxm079ekkjc86cph", "19789769817767723008"}, - {"evmos1p0246gmwaj767qwjc7f98ks2av6g3tczd6a8md", "82345748150590464"}, - {"evmos1p02q4tey6lpk2vudy0p99lj8kdw3ujaewjj22n", "225240837905646592"}, - {"evmos1p06mxxdx56plrhv59mwv43qwu50dpad2952apn", "5106204104981488640"}, - {"evmos1p08u85t6t6fhtzevd63xc80k4wamvg3wzs45jl", "2630492776080556032"}, - {"evmos1p0aegrlm64wgeus8cnw5ayvqymsqkudn7q0kx5", "369313809563757568"}, - {"evmos1p0ecnhnzrzj580rp3m9telcup6zx5waxgc9wkz", "231579372101689344"}, - {"evmos1p0gmm4z404tg5dd4jsw3fng8fydqhkf09ugrg4", "475923927143896320"}, - {"evmos1p0gy90cg9neflr3788qmtlll6hcz80e06nkhkx", "387379287915103744"}, - {"evmos1p0jtwu7949mcc8fd042330f88ghc5mtszt7jau", "1316847705503215104"}, - {"evmos1p0l4r6nppqrm4tkn64a9lqeut3vwxh4pn7mk6d", "2578332097876750336"}, - {"evmos1p0lu663rr85qmv5zrh08s0yajgytelnl6ut9jd", "384264663034213632"}, - {"evmos1p0mgmrzjccutvtkrgjlx2k2kntyph4mzc9hty0", "1693255582085849088"}, - {"evmos1p0mljwclk8asp5yx5c8mqymn75s2v9geaan7ha", "659033426191674368"}, - {"evmos1p0qad0wv2hc7h6g3pd6s9gdldvev2wf8kwsk27", "1317917850584764416"}, - {"evmos1p0uc4yekeg55x9ly8mjm04kutwczaur3j6hmgn", "467206327172431104"}, - {"evmos1p0vjfnf4r2kaew5yt0um77szr00ujadknzuycl", "104893720878493184"}, - {"evmos1p22wtpw5hfa53ryj5j7sw78x5df7htykwpptj7", "11771522682231289856"}, - {"evmos1p23f9mvl44m8qsfvpjqrhlscg2y9rwws7rn4c5", "16525650439780732928"}, - {"evmos1p23mmcpltcmyh8wqu00wtdlmvw9w3g4g7nwdmy", "211667813075679232"}, - {"evmos1p23rn8fxu7zy94zu0wh2xd8q6hqyk5prm4mw8v", "26049856229022490624"}, - {"evmos1p24mm6eslfd98tnlqcdn3445z6q50kvajx9kwh", "1503621131248524800"}, - {"evmos1p26zt8ednjwfn39kga0as9543kxht5evah4d2d", "4801986115240542208"}, - {"evmos1p2cucf5mqeaas74cr8herj650dr03hgde2m8hr", "29737557363801137152"}, - {"evmos1p2d3s8d96jj22wuf7tnvluyt4mhy8hnvnphpg3", "11367507711221248000"}, - {"evmos1p2eum98826u9vdnpjnjypasw49lv5tpjq72c7e", "9164699555806846976"}, - {"evmos1p2gwzyx8cly5s8p7q43lhvn437xrlla47kac0p", "4692115443997624320"}, - {"evmos1p2kcqqc2y0zpdsheduwl7fax5aeg3gj6enpttd", "943707643940507648"}, - {"evmos1p2m5kvxpc4mlglzt9eryqunmpypwjpdna2mm3p", "5990411504753639424"}, - {"evmos1p2pgnkjc7phm89u6zmrc0lhyjvdtja9h4uedm5", "4075565862091718656"}, - {"evmos1p2rhxv5c92zmqw02jvfuqzlrwpka0apemyv8tf", "472507558527817216"}, - {"evmos1p2usedgxywjm0mhqnav73rvfvdjt2yreh7sty5", "20867850005537792"}, - {"evmos1p2yg9mrxj0cw739r5d7amr28lm59t9mer66c0l", "828681042651490816"}, - {"evmos1p3025l70r65jszxzga0z6gfgugg5azmw9eqekv", "12805455578839248896"}, - {"evmos1p30y3t0q4l4qwyj5y3ynnutr5tlj4gav3vgwp2", "630438965271458816"}, - {"evmos1p33pmvpsnmd6qcrt2ml0kmg0h0h7wkqwu94km6", "638673214931063552"}, - {"evmos1p389c427f7gv55srkgszh5fetrnm37l6vrexvt", "12691423759401701376"}, - {"evmos1p39fz8kk4ugr90hv0svjyhy35vtquw0rjp3rpj", "24797808359824293888"}, - {"evmos1p3a7lgjn6r67mrf5sq38fwtr727s4haur89djf", "8300452551017445376"}, - {"evmos1p3ayhyvt4jjvypwfqjyxc9g45lksu4mtg7p5z6", "4197953966368622592"}, - {"evmos1p3gelttgeqfa8zh23yg62876rt2pr7l0fev8rw", "65093221247118848"}, - {"evmos1p3jnndej9ke3v34nzyuq0l8sazhjacpe0jsvg6", "38369542443524653056"}, - {"evmos1p3jw6msxppm0qa4ncnx77cy9358xsddpck2yz8", "10707732881235746816"}, - {"evmos1p3kanmwsmykyelhdwd8wahttlzml4ayflveagt", "3890183704614721024"}, - {"evmos1p3llyprqjk6fzlukp2dfpw0j0ya89n7e0l9sxm", "15047872563745996800"}, - {"evmos1p3musj87h47waz9cn6yewkjugh402sxleuaxt8", "3697114506592877568"}, - {"evmos1p3psu7xyd6wkpsw7v2xden86rnm2yprclltl6p", "141577797516781568"}, - {"evmos1p3t9xh94a624dxt5napxe9zvqj5nrqxr4zxm0s", "1545512628759875584"}, - {"evmos1p3tnkrr2mg5zlhxqhkgtwm64fk5h6yytqhe23p", "3931329546412750848"}, - {"evmos1p3vhgwh9phxtzulu4sx2pl9q4ddf93n2hc0ty0", "1819333492417144576"}, - {"evmos1p3vhs4q3wgxpnexcp62zhesv5af8aanyx4x65y", "16709043280483741696"}, - {"evmos1p3wcex2urxhh6453pqkttn9zvg4je7jzvde599", "554429484371128320"}, - {"evmos1p3x9fve9h0vnwclq5qs9v44tkdhx48fe6jcx4t", "32046171531855798272"}, - {"evmos1p3xkqh62xrgyp83na7yfw7eyggg4hwa2e3uwnu", "96372812918164992"}, - {"evmos1p40npsas67hcv8wm805j7rmjd2yps7hngmkstt", "2390420263679787008"}, - {"evmos1p479c8cgfz8al6hyvlxfev7j9dcgrv35v9f9mq", "21101542304022437888"}, - {"evmos1p4ant4nj5dw0y8ms0pfczrzx0747c6mt9e9xjf", "7592735729087371264"}, - {"evmos1p4eyuc38t772u3yru98k6vq4m4uj0fmrlfrxkh", "2866715718816456704"}, - {"evmos1p4f86gk56ds4ykl77kwk42n48lpqut7uwxumu0", "1249793000383365120"}, - {"evmos1p4g2u4tw372qzhyk58lj2wskmstge35m05805k", "1344251659941154816"}, - {"evmos1p4hn46dxja0ta5hylmqnv6pqywrsn9qvwa0a5d", "476265592755865856"}, - {"evmos1p4jh73zt7248y6sg2pnufcnw0qkcxazju5v9tg", "7202595495441440768"}, - {"evmos1p4ld8lmkm4cgqkckyns65ersc5hnulww77tks5", "10621997376581046272"}, - {"evmos1p4mgfu5rqrfe5fc95we6t7gsp3qn58668elezn", "640051029262057472"}, - {"evmos1p4mgkcffsg3aykgn64kv2k6y6px9pqzjunx0c7", "25677623023903662080"}, - {"evmos1p4qj6ydwxncw60ez6qrf56ctmytxcl8ehkezh5", "4820718919717102592"}, - {"evmos1p4r5wm3226xec7vvc5slszahjlcp8vkhsr2xt5", "2216426664274873856"}, - {"evmos1p4tsqhphqqgn5etsvqy7f3936ys6r8epvzzeu3", "849689576561313792"}, - {"evmos1p4uzhs47sanz62exx8ejwlqzgpqxf8zm2y3kwu", "1580487354973327872"}, - {"evmos1p4v68gkc3j3qzztd38dgjdag03yz3txy49jw8h", "282535453352747008"}, - {"evmos1p524d7shaf4l4869hqa3dq20xcvtcqdak36kyc", "8868150153360023552"}, - {"evmos1p54uzz34wew6eglsyrsd3wfgxnv90af4sc7nff", "4791190522359067648"}, - {"evmos1p56ycc70y48hfmfktcpqnkq0sw94s2wl2dsty5", "11461788714973779968"}, - {"evmos1p58eu404d525pg7va4kxfedqyw6v6gaw6hcg75", "704132033288306688"}, - {"evmos1p58py4u5897d96r9npyvvvtx7xqkuw3r5r9syg", "21073558694458216448"}, - {"evmos1p58vtp0rk0yzqy8zrykyzah6ljwn8efg390vlt", "5955190194989006848"}, - {"evmos1p5eylelwpnpec6azws03re4aw84n3yje7wuzk9", "27260975419091255296"}, - {"evmos1p5ghl3d8gtsu42h28tweltmwcs6nced43xe0ns", "3664011077343345664"}, - {"evmos1p5gphnce3qsc4thjtlhecctq9efemd3y4xa337", "452751178729581056"}, - {"evmos1p5ht4a3w3dsj0f37rv6lmrw9d7m7gatrq0c7kx", "11473486383202623488"}, - {"evmos1p5lxw0hu8wgmwyg6ngwxsndqetf9tgvp2pf2x8", "14200045360451977216"}, - {"evmos1p5qugc28jp4gsmf2v6qezsdc6w4svcjp68e50n", "22549847281290752"}, - {"evmos1p5u05yuzlqy7zw97qqldqxpznwp7hy2xhr65hs", "1838827583625736192"}, - {"evmos1p5udwjzgnam07ad4hfa866lkhzf7ksgya62tug", "1818465647948875776"}, - {"evmos1p5yedrx0gwykv9w3yzggs22qas3wzf8jfujmkp", "11889035359069163520"}, - {"evmos1p5ynmtzsrjrc6lc6kdujty3esxc4pve5zns5ak", "930410542249448448"}, - {"evmos1p5yvqj6dlwyrzfyljun77whaj5x36spead5sks", "1425041625891872768"}, - {"evmos1p603c0cyp7fqmu5f2lvy59f5yrdcffkrg9xc8t", "106536663359998464"}, - {"evmos1p682r09ky3nwpc9cwqmehjlh9vrpeekfg8kxlc", "6970005737552216064"}, - {"evmos1p68rt2atu5d8z8cr5lyd5rulpe6gu9h7y6n5ch", "384314424118280448"}, - {"evmos1p6a67fususzysq94m9vgr9sydjl7vvqlnv5clu", "3146858905104067584"}, - {"evmos1p6amyd20n9w7msn6hapeye2aqa83fy6w0zhqa9", "6930421227101132800"}, - {"evmos1p6dh6hawl9j6dza5kec9xjm0wyw24l50xv858a", "498013887260804864"}, - {"evmos1p6dkn4sxuvwfl8yksvanwmlxtxalmh3dccyt7d", "1138881525194989824"}, - {"evmos1p6ey60xrqj5c4jqeerf3tucc4ly660hvcs9chj", "2962287732453007360"}, - {"evmos1p6fhd56cesp93vx204k6zyuct7ghncld0h8u4q", "10908259019302092800"}, - {"evmos1p6m3cdvf7mnjlsqa5vu2ce6f3whwmcead9attp", "5262174293678872576"}, - {"evmos1p6mpf6ydvaj7eu5jagf49jkv8ue4ph8t9y9dxh", "1020876473785147392"}, - {"evmos1p6pusvyg7drlxd3vdjv8rw25pnug4unczswh2m", "13158245280735619072"}, - {"evmos1p6ql0t6xnr87f884pxd86837gssat5d0f7nx2u", "58757394351573504"}, - {"evmos1p6tflprl3ukll8mgjtlgxjlf9gwvjmm6cm60pj", "463364132354232320"}, - {"evmos1p6uta8pr5mphvc62ae78srz97909gdwhty4ysu", "841317499354513408"}, - {"evmos1p6ytvghsllrtaegppfr4g8d0q9066d8n0xd355", "387904225755984384"}, - {"evmos1p72a8ljnsgws9zylw8as38x8cx283z9mzmaeng", "8616121237486503936"}, - {"evmos1p73mp88508ykd40wveyuxuj5w5vquq47mqa0vr", "1126026999882628096"}, - {"evmos1p756nrsv49t6j370jwza4exjhsn7uaekzdnmch", "2217087329688192768"}, - {"evmos1p78fjxhkumheyv8audw48gz7ljmzlyu6pqejm8", "4181035337805856768"}, - {"evmos1p79vnh72l8xydwjwgqfh059uqgr8xexjafh4yz", "7834937934042501120"}, - {"evmos1p7a23m9u0ukaf884nzuas48p5f5dtas0k2g6fk", "424679890693047296"}, - {"evmos1p7achwj9puehzhjvuewtlqhawx337cda5xvhq9", "3018746880381346816"}, - {"evmos1p7feg9xntj7s4yyn2fzwg0he7ntlnpp80qkjet", "85988691701248768"}, - {"evmos1p7gvv780asachup823wkxfutdayneux8zf8wxa", "24717507304147968"}, - {"evmos1p7jklmw72wv8rt0lu72atm0wdrh4jgrxaz8te9", "3765145888829450240"}, - {"evmos1p7lwwwpc2d6aknrtuxp0ztv554xn36l6h8mrt0", "12745614800220184576"}, - {"evmos1p7vyjrk5s9s34cv5t33zwj3qfqxgehzqpad8m5", "81214662128204529664"}, - {"evmos1p7w2vaf7n94j4mgppy4y605l7lfrnqrcasdnrh", "721114373065515008"}, - {"evmos1p7z5qaswfsxart56p999vqhghzkfkrxnzwawku", "2317587906350616576"}, - {"evmos1p86taa4us4m3jhmauy5m3u5wv7nahzx6sjj8kq", "470480409292241408"}, - {"evmos1p87pqvws8fuw6nmqgcl6jaycwrfngwduuwwjpc", "1691241394625462272"}, - {"evmos1p88t89rq6ugqts456khpj68srd3wzj963w682y", "1290845963925902592"}, - {"evmos1p8azv7tzhw4ufzqk28gynf064p05hl33fgq4ty", "32679750768989440"}, - {"evmos1p8czmg9zzm5jsnpg58nvqjhzx9ged6emtdn30m", "237566676950679552"}, - {"evmos1p8d0ffu9gardcknvzfe7hxnmczj988904lt8v0", "3434622122658765312"}, - {"evmos1p8d62w9aeayxtwahwy2k8d0c8glklc3laglag6", "705889880279638016"}, - {"evmos1p8fpucw7e6kz0j7h6e3aa3yvm6qvvenv82m8ak", "89306934037650176"}, - {"evmos1p8jfu2q60hqx65pt7h72hk39w022ag3nnwpwve", "13906056911583305728"}, - {"evmos1p8k6keyullxa67fpcz7c93jvgcahf78yaej2sw", "2730159698711281664"}, - {"evmos1p8k8pmacgpmhkv46n8t0zqdek5c4r7q9s9ukxd", "2383181061625060864"}, - {"evmos1p8lxzuc05twesrg09xpvxz7v52aa0jm4lmvx0d", "386189923241494784"}, - {"evmos1p8nkpvhxrvea0hnz2am6htqrtku4d0rnznnmtc", "4000448299941720064"}, - {"evmos1p8pkch0kgkeqa07v8tc08acm8e8hqf3xdw0v5m", "118651437423154176"}, - {"evmos1p8tx3s8826rwt9e4j75nwv5txlfw5ue0jva4qh", "3453514884667752448"}, - {"evmos1p8wqn0jpc7lv7ldcntld2darhp9yw0wvk8u0yu", "126828029734183936"}, - {"evmos1p8zgfhr09flqtczp9l8mzqm6zze0cqy9ztdu0x", "6298998729222076416"}, - {"evmos1p8zypc3utp4akxg95mdajf28g5es0n5j4dg4wx", "30432897390788395008"}, - {"evmos1p90rg9lugh8tvd7peezqht9u0m5fvjfqw60ga7", "559095415991284224"}, - {"evmos1p9995pgnkwrat8acc4hs7sash0x750swglza2u", "1466746101155511808"}, - {"evmos1p99z24ext8n7w6jrwjh9da3jjvlfe0nqkry2ws", "26336845619030016"}, - {"evmos1p9cxh9ahzrlene834m7gaw90q8mffcuz0x30vd", "4532117623687976960"}, - {"evmos1p9gj5qyvueerea8c0qh6uqxlm5eqlkd6q08h0h", "441946851497200384"}, - {"evmos1p9h93ne2x80z3alnqm6demnwds057djjq2plgr", "4235984156627757056"}, - {"evmos1p9hefp347qgxkh4zxyq79gx75rshquegts55yq", "2150991855038660608"}, - {"evmos1p9qvqjcef22y4fh9fml5m7gw74r3sdwklrgvvd", "368987658330370304"}, - {"evmos1p9ukua8mfakdhqq97w6pa5aywa482j2a9vj4st", "8273380419196715008"}, - {"evmos1p9xplv8hvc05scnrr39qn52qkgqsz49cv3z2fj", "1531836937224773632"}, - {"evmos1p9y7e043z8cl5gtyqa78attyn6d2ufz7dv7rc3", "2976852006145975296"}, - {"evmos1pa33zcwyf9apn4h0vaya8x3fl7vgcxnjl9d0ce", "8065110386129899520"}, - {"evmos1pa44cjq0msaplta3xgdk336esulxwaz3hp93as", "427298314725255168"}, - {"evmos1pa6eg36dhqdc92qduyyqgj5r06s73rhqxu3j2t", "2352850934192002560"}, - {"evmos1pa7al6jfrmd08xgvc2s4s49hynqx6cn4glhl77", "8960071705384467456"}, - {"evmos1pa7hlevuazrr98h9459h9vsdm5jcxwxjgu96u9", "709547476289343744"}, - {"evmos1pa974352v3j9s6ddwq0gkfhzz6n63tvkaku5yq", "6457192004189364224"}, - {"evmos1pa98lw9y3w8k55cmsp2es5acpmn3qh4qw9489d", "2483221045781550080"}, - {"evmos1pa9pqrrvypmcsxrvywgu8mwhfkdu6hjaycfays", "133509001301938176"}, - {"evmos1paaw3dqxqfazrxct4m0nt2dlq6gkhlph6w9djw", "5141022123100385280"}, - {"evmos1pacf7w4afqgs9kwl38j8gq9ejzqyqfsgn7lgz2", "2919578520129896448"}, - {"evmos1pad9lp46p598xh374853646nl8jk950xnfwf9h", "3397229454807943680"}, - {"evmos1padjg7w34shpkpgcwjesqj59p8q2jlt8ru3q8a", "3952054314227011584"}, - {"evmos1pae0azdqvrf0lm8dh7ryec6k8plft38lp73dym", "11384502212579418112"}, - {"evmos1pafntcatt5wr3vzpmxxjmqlgvaksyj6qnank6p", "884601725984766464"}, - {"evmos1pajjjwccx3fttqnqxrzwuw7urty2yaccr7t32z", "1100436671908995072"}, - {"evmos1palahhyhar2e6296jgahvlftn39jnlf5kk8uyd", "9793335755689148416"}, - {"evmos1palkj27wkvj4udzxg74qpz9t7z8atuc37hewtp", "2636389709058446336"}, - {"evmos1pamv88cs6msyh596nmghr3e586lewj9ad7u2dn", "9995610913726025728"}, - {"evmos1papkx24xznh8lv0t74ka2akykntqpdnqhq68w0", "13319181183522033664"}, - {"evmos1paqrcwtcn8atf2g9st7wpvuxttqqvhawqmvw2s", "1205381050919944192"}, - {"evmos1paqupcz5m6q23sknx2qxs7rs065zgczw0u3u5f", "1055524135306528768"}, - {"evmos1partvwlh96vt8d36qz7pf20eyameq322s8dmh2", "34443789125319936"}, - {"evmos1parx7f4ty67hz3u8nngwfzuqpnuxn3vt5hfmw9", "7367080404096998400"}, - {"evmos1pasfc9cz82vdeqj3xdlzegd64azl64m2ntxd3s", "3235958789781700608"}, - {"evmos1payxqyr02nndcktj2hzk9sdd7n79w3ng3jts69", "99583420668346368"}, - {"evmos1pazeqv7kju5sx60nwa7vayjgjx3x03mprpah9j", "369032933739277824"}, - {"evmos1pc3sp242e82mr8pm9l72mq4mvah242p0h5vl8n", "769281141433823232"}, - {"evmos1pc40edh2gtdu9y0zrp5z0pm6dw4qw54mm2k96l", "1609365781655866368"}, - {"evmos1pc4jjsywga2k0mh56rnjny2l9gu9yxzyprxfp7", "1448093798001029120"}, - {"evmos1pc6wvmy6rn99pmevkjcgkyafqlmc22hn3x4ypj", "546561427701365248"}, - {"evmos1pc8jq0e228d4gt32utuumetqhfk94d5purx5d2", "1575776000797030400"}, - {"evmos1pccy6e0dytzpsuj5mx6ta5tfxsc626xrkflu6u", "2534781776784912384"}, - {"evmos1pch9g3ngxyh7xuk05vkq8nq49ys4rnccs6nu6g", "1857280223605030912"}, - {"evmos1pcjgchmq3wemnekcdfv5u9ak2gudqx2w065mk9", "531766009378295808"}, - {"evmos1pcmy2wh2cxylyzwm8y3nhuafcc7vrvz7j35tuv", "80732869329390080"}, - {"evmos1pcpmyr5pdnw4rlzfmmac4ehuux7tqzp7ef5yn4", "794952586020226176"}, - {"evmos1pcpwpfe9x54a9gpa33je7su4u983xhfuh6tjrd", "8930384791878148096"}, - {"evmos1pcse573pl364fehsa455m2v22af669qau6z533", "5169034514446352384"}, - {"evmos1pct3fdpkkvyzn326wa03fp5gnps540fy00y8qk", "1655368249299296256"}, - {"evmos1pcuedjn4u4v7feu0wyaxzvme689uelv6pr9j67", "891390460935662080"}, - {"evmos1pcvp94q08alylm02xftattmq0zj2337jtwndt8", "5138899031424842752"}, - {"evmos1pcx00ngpdneswmlc9dh0f4njsmgksl554sc2rg", "3237574604512690176"}, - {"evmos1pcx53cjdvtf7fndhaa44h5fydcwkjqk0ual407", "861750069387185664"}, - {"evmos1pcy4e5lrcdzvj3hvwpkyefqt5csrt9sv0qd0vw", "20124780400159338496"}, - {"evmos1pd30qjdsu39u933fg94ux9sdzj2vyt7nzq2mw9", "8737391234854141952"}, - {"evmos1pd35pu7pnfda0x05n7wxag8vkkkpqv02d08dqj", "6456778393910185984"}, - {"evmos1pd5anpu2hn245hv063zlf2y5sy9qrfvkjdyqrq", "26826222656897064960"}, - {"evmos1pd68kxnmk7pxld3v72cxgzclx2vcsp6dycyhkl", "850871807125161984"}, - {"evmos1pd7hgtz7fns8lh77xgyks0d9lcj2qtjpl7jna0", "5380581528934187008"}, - {"evmos1pd92zttkuve4u2zj4s0nzp40cu8ss3ugfl7zel", "14488014523894392832"}, - {"evmos1pdat9zth0y9h3ev4zyklht62vtenrpufv9rwla", "474303002349866496"}, - {"evmos1pdcz42v2l0u9qm5qxvfjfwd0cvz83uepf80raj", "3603296054386189312"}, - {"evmos1pdh3h5ejd6vcg842talfsujuwp89x2j5zzqpg9", "19591325976497143808"}, - {"evmos1pdhpscpxyrcv5gnx4dz2vrs73a5hjt0cux947l", "995242720728866304"}, - {"evmos1pdlr30cteg6an3d5xhdw3zhxca9v4dlw65a364", "133218613226359996416"}, - {"evmos1pdn46syyflpfu587hhkhgf6zrwngxsn2rg5z3p", "134988788145860608"}, - {"evmos1pdne76kg0aadrz5t34g0uufxhtkf0h33eqdqhf", "815939655026999296"}, - {"evmos1pdng4dww5hwedd6r9cwzxx2ldvvlaxfmw36c44", "32889517816066342912"}, - {"evmos1pdny8d6c9mwvz00lrmwnevsj8hh7jm0vqmr7p0", "2991503798013326336"}, - {"evmos1pdwp2z7laeyp6fcvhsgtp42ggvwrht2jsv8v2m", "1034965638138624000"}, - {"evmos1pdymr0tzq7e75fxt0rcq6rew8lg7x8620c2ctr", "1576157607068147712"}, - {"evmos1pdynwvvkdnsmqhy2mr7k40gq898h0lwv4nzdkj", "906871313083430912"}, - {"evmos1pdyylwnz9k26rsu3h77jhqwkmvquysrz32gy8s", "20340169548997091328"}, - {"evmos1pdzth43emn65t3ylyj8ku0pfrhu2ulgwutrgn8", "700661965798649984"}, - {"evmos1pe085yyjggvapzha6wfdz52ylspl6f9zurugvv", "1162879471946421248"}, - {"evmos1pe0vechc5d9n3ya8dsvf27uq0cjqr0lfnsqrn2", "4590797270332143616"}, - {"evmos1pe6ax2jwd936mux67snnlyc9wf6kvakgfar67m", "1983665864795049984"}, - {"evmos1pe6r93y7kvy5gw6ud0vnkwt09newmd8d379t4j", "2459887326725912576"}, - {"evmos1pe7j3yvdd6m488anl7emrdfpgarvtzawjwjk2q", "911885364034396160"}, - {"evmos1pedpcwadssamaf2eykmgmz2yva5u05h20p06su", "1934764770336770048"}, - {"evmos1pee865ahgf8njwwynv5aqfgsxctgl4c9l4d2hl", "1783206974384922880"}, - {"evmos1peenxyc7qvx5a47g6suz0r57cdy9grvyf2e20a", "3482785698426093568"}, - {"evmos1pegkx8c7yx7j93v3meytyu7lvyua3848gylya6", "16172494560890466304"}, - {"evmos1pephl0gtx7ftd6s9uwxe8cjfy32zrlqksmzucs", "635172925553303552"}, - {"evmos1peptj90pw3d5cxf4zupzkxmzwf3q3q29xcxgm4", "405369256472050688"}, - {"evmos1pepztdzh9qstnv8k04qt6p8fwsjkdrgjx6unsg", "1560221955927766016"}, - {"evmos1peqetv2yqxf7r0k9f7ykl0ldh4xan2wzlhsugr", "2356241578748708864"}, - {"evmos1peqnzvu9h82gagd8kl44d86hc26gsp9xec7gth", "2887640634296111616"}, - {"evmos1pesr9rp22338g0w24z2thnnk9luhuttqyn0max", "13906850755504500736"}, - {"evmos1pey80zgqst3agl87q0x797g0ztlen5jud96r37", "36872715458843729920"}, - {"evmos1pf0m3l37pzlag0r8tq2r8pgzw8wzvjxsemg74l", "2060604172566918144"}, - {"evmos1pf2dgqjz2lr4s79s93aqtgdjm4z2y5vnwwu5gt", "21420445231908061184"}, - {"evmos1pf2k7tstv098ekv6k7umkyk2zrdf3p3853kl7h", "433259606930389504"}, - {"evmos1pf47fjvf9kkrljezu594wryatstay2qlw00hmk", "3609474265219012608"}, - {"evmos1pf5wktwa5qw86t3c5em4c7k8mngzh84ptetfle", "12172080683796994048"}, - {"evmos1pf6rgut9snu7jkkwa08w66pnjzh8yyzqqpd9vs", "383097615249279488"}, - {"evmos1pf7tpe55mrrpxxeew996jv08tl48pu3pftekww", "5915858750872750080"}, - {"evmos1pf8065gsnghy62ezjg05782uz6n6ft4n2x7rqn", "4205504443341815808"}, - {"evmos1pfcc57wgjs2pdsn592rd9efmq7930zpmdersvc", "259043760129617920"}, - {"evmos1pfcnxdz9knvzyv3a9wfyxuv4puzw76egnm8fpg", "808719699947411968"}, - {"evmos1pfl93rjcfpap2nw8eefr26eufjx2tunqk4zq29", "72450260192185016320"}, - {"evmos1pfmdsn3zphxgt8fatd7n39nhvwskj8cvezawsg", "384361029940793344"}, - {"evmos1pfntd368arz3t9jkf6mgq8gy7ejzaevq0qsvwv", "8123091866752243712"}, - {"evmos1pfp2umedvwfwkt98y3s5rg8chx0fxzghk55944", "2818586571628798976"}, - {"evmos1pfptkns4rsem26e9x6q53y89jh4msgz9u53ayh", "905646200482022400"}, - {"evmos1pfpuh9gn9l8svuuxj9qlq7fxvmjjkt3vqcjgz5", "77292719837787136"}, - {"evmos1pfscdf0x7atf2zh3yq0cneh8s5yprnsjtmdr4g", "3754717700000776192"}, - {"evmos1pfsm2neda65f8gzfpn3lecym62n8lxxu7hrgu0", "10411067781268230144"}, - {"evmos1pfwhhrfqqyfvve8dgz7xd28fnve2582l77wt9u", "137944630150713344"}, - {"evmos1pfyv3xxjep36cusytdxpr74a6lt246yf09t460", "13910765012182679552"}, - {"evmos1pfz72mg6agyjemu8rulj6u52kendej8mte6fdc", "1661516646776594432"}, - {"evmos1pfzjzmmsgh4pss83v999vqwntgmz324gsszlv8", "1073608994277881856"}, - {"evmos1pg2rw8ne5cfxdy0e80lal4r5c7rlxdwndllrr7", "9914641264738455552"}, - {"evmos1pg3kpmex6lu2mufdzpmpzpnazg42nht0tfaut9", "926593815064724992"}, - {"evmos1pg534nckajrfg78up4kv7lgmjjq3ml75683zxp", "919536504368207872"}, - {"evmos1pg5ng72n3jwgnqa87ejsqkaas605e42t84muys", "367140535233645568"}, - {"evmos1pg66tnwvv5vs6qql892629y4q8hkzayl5hpu4z", "42103430782743003136"}, - {"evmos1pgdtpgg79a3mdtlpj7kgusgr88j0vdjlquyf7a", "3522678559030198272"}, - {"evmos1pgety0jz592pp0sf0p04ucr3ymejdmhlm35gx4", "22211764806442627072"}, - {"evmos1pgh5pxqqc07tsp3vwwqyc4v4ke9uxhxvdg496l", "350989353392447488"}, - {"evmos1pgh7wa354yjlhdvccnwdz7vta75k7stkw7svdj", "1740047627257006592"}, - {"evmos1pghgyjf50k9h9e77ye97xsca58kx2gjuch4esz", "466934516902882816"}, - {"evmos1pgn76k7ervvflumhv697mxx7npag06zycrj4k7", "222587167622789120"}, - {"evmos1pgvlqe8emrgqx7uktj975pm8523q56rue3hwgs", "13580956184713265152"}, - {"evmos1pgzy33qsnlxarhrj4rv2kmjutlxy9v7jgldtz0", "1501105867350825984"}, - {"evmos1ph0x8zdvfzrjl83s24ydm3yyqf5rjzvkutdg69", "408763578861810688"}, - {"evmos1ph2vg0c6dcshvry07k43t7yu7s2y96qlujq88n", "2296526030725374976"}, - {"evmos1ph54fwdzufqsyjehn8rzw26mz0aa09qlaq07t3", "1468482285066154496"}, - {"evmos1ph62a5zw5yt9kqlxhs6dgm7h3sxjsvud0vnypz", "3925435916222170112"}, - {"evmos1ph68atsg6r8mjafzlnp9act3ppsnstzpw6essv", "5710732730567016448"}, - {"evmos1ph9csh5sctdc4pgd3suzrry2c250sr3chj6td4", "14691715159852982272"}, - {"evmos1pha0n9l2r2al8qs3ppavqk5nhxde6yt2vpg2l8", "20355042137956892672"}, - {"evmos1pha2k0gelns6yv9k3q5yp8uu5e5sytustzw7g2", "1835617285772747776"}, - {"evmos1phdfhp4ajww7qae7g5a9g8363sdtq8vzsnar76", "2734280272193567744"}, - {"evmos1phdzky8pqjqrj2splulvcgj0xqtr4kktxmg5ma", "828719671570293248"}, - {"evmos1phgj0aeql4cd0qyjpr5w5r0pjdjla35xqrfj45", "9775910311478646784"}, - {"evmos1phk9pw2c6506980hwel89x97sd9gjuf4s6nve5", "7788657509004567552"}, - {"evmos1phlsun9ed3lcd9te0msdhw9yj35xt4e7dz0kcv", "16263896501244694528"}, - {"evmos1phlvk890qdhwkc0z0u7h8zz90hcsheyjgshmn0", "476002241230553088"}, - {"evmos1phm7uh463pfp05l6nj93af20rx7urnlp9t4ptv", "582754175211405312"}, - {"evmos1phnlxqq69cu8f269pygvrq56zfdzhe83jpv278", "528622569669949440"}, - {"evmos1php805n2x2qgh9gha3vqj9jrqhec4vhr98t95r", "26820416920333568"}, - {"evmos1phq8e5yekedal5h8r4qe2agyye75qxtx0r0l9u", "3964535312057743360"}, - {"evmos1phwtncq444su8jgkavrk4azyh4exfa3jhcg53c", "31037279259837087744"}, - {"evmos1phygk6vssdg4f2hrfyrrwsse2ljzyr3z2dlzfk", "69259483930921216"}, - {"evmos1pj2cyuafwkvjmk28uhd5wp8ne4sukkctmh36n6", "56708330078980366336"}, - {"evmos1pj2qravfc628wgf346jdn9vw8jj8v64qdqxzs9", "1638608195860019712"}, - {"evmos1pj378xqmn2twd52lvq87tu05q7gfu9qygh09tv", "20357703728418304"}, - {"evmos1pj3qhdm855ugrjjenk9arh55fnu95amer78dhl", "11356909109594234880"}, - {"evmos1pj5fdgrt0lrtuhsf4073kfpx3xn67ad6ukx39f", "574813338197790720"}, - {"evmos1pj7vpusz9e4taw3lckrzwgdechs3z9rtwkqfpn", "10720229940763490304"}, - {"evmos1pja96uekf4atwmyt8l69mx9zyuyjq9x8zqykt7", "20827764709841620992"}, - {"evmos1pjaz57hsfgpn6rvyfn6mhwrzv6sjrg0rn7sd26", "20356496021160120320"}, - {"evmos1pjdrc7n63zpe3rq6khpapphm5l8m4w70axa833", "6359709854048993280"}, - {"evmos1pjjrrm74dchvcwe2a96zdaywgqtpljcl423r9w", "10896912115661744128"}, - {"evmos1pjlzv5q3xphasepcclfr6r0mzusuypmrhy7f3f", "10439671121362429952"}, - {"evmos1pjn3gxlslj0vxke5dluegpe32nce023ngpvzsc", "3200644267369526272"}, - {"evmos1pjnv4km23jjpn9ughxsxpsegtlnm39lacrq2jk", "2962578552845448192"}, - {"evmos1pjqsfeh3rwupewhnyt5wedmv9ksj43cn5nhxr9", "4677812276403945472"}, - {"evmos1pjtm4m7knkf7kt5c0qdvqv93zm8acu3e7e3x79", "2914492171977825280"}, - {"evmos1pjun65qdr42c0y3e0rtdh2xq7tx42dwa970ehf", "5780186241969659904"}, - {"evmos1pjwdxmlwya0006w7pu9ejvk99jeh6fw9zmml6j", "581608765928357376"}, - {"evmos1pjwfh5jwevmg7q3sm3uqeh9jdy20u887cux9a8", "384416590566471936"}, - {"evmos1pk0xu64k6w86y32jcx06h4gygsdqmjh96lemgk", "58911256258075885568"}, - {"evmos1pk2fyf508jeewjevak0eh30c4jvr3gdhqgmcuf", "10008155678131535872"}, - {"evmos1pk37cn9rw445m2tn2y3f29zc7mqk58zjr8ljzu", "947277838939998720"}, - {"evmos1pk53wxnetlankyg305vvktrwdlf30zmhxuw5v4", "19052841048810565632"}, - {"evmos1pk747kt2ea0lcwm9zk7rsp58qyd73p4rxkre5h", "1963114325479014400"}, - {"evmos1pk97t3hz2ha4aqsretzt74y3patukm7qtq7vjn", "440813070558682624"}, - {"evmos1pkc7n6tm5ke2z57w6qpamn8napvphku990xkrs", "7474707049052659712"}, - {"evmos1pkdhcxw0rf26h4z9sc682f63sszhv9tv4tc7jf", "14128248163732332544"}, - {"evmos1pkevvp6rhrjhyqws4smadhjyf597my44qw2hn4", "18057456027274321920"}, - {"evmos1pkgqlq44zlde789svem8xwa4f3msz334s8ewfa", "15962360386848546816"}, - {"evmos1pkh5wa823jryn9k6k3qe9eddxj7tha0u63p9dx", "6282057316670641152"}, - {"evmos1pkh6y9q8rlcx6fwamrlh54vf42klw9dtyjmrs7", "48525702393971171328"}, - {"evmos1pklpg88q48xsgwwlcl5nuuzs6daqthmp89jc4h", "751833967708639744"}, - {"evmos1pkq6q3qkm79rxk45s4k4t53cxu693yg2ltvhxf", "8202352178062221312"}, - {"evmos1pkrzpzgdxay280pv96vwsmt8maps8lnhvsxp3t", "15336718085380022272"}, - {"evmos1pkx89arujgtlqq7gy3ufjwc5t3ykt3fxmhujh4", "1430265950439665664"}, - {"evmos1pkxql8g968thwgzxeap57xn6rngzyc8gakqxq7", "888506530237752704"}, - {"evmos1pkzdm0nzcdwf30usgu20g4f0l7mm8sjgd2hyyh", "38753399811746406400"}, - {"evmos1pkzgn2zzfeejq50s0h4mlph7unmjzqk8k9dmhh", "1609180418118115840"}, - {"evmos1pl339jc5l5atmau0lk2ar7h6s7wkc7gycwuw6x", "1014882945772680704"}, - {"evmos1pl5lvu6dz7x690s5q9shwjep262uxete4fe25n", "839764917406274560"}, - {"evmos1pl7zd03k8u68j5g63m4kmrdzld8l4n88fknzu2", "6969693588358500352"}, - {"evmos1pl8fs5vcqycraleccctg73lw4gm645tmnu59g3", "413527928728283136"}, - {"evmos1pl8jvkh8fvq7jcasf65qfl34nlyfqd9az4f6rr", "97882611360186880"}, - {"evmos1pl8prqrnth2psu2wrcnnjsmrug88c0skc05sc7", "843704615005596928"}, - {"evmos1pla4zm3lxjgvr0e2ydal70glx73rwvd5mhhp0a", "11852383495175841792"}, - {"evmos1plc4ml5pxh7vapn5l0vrz9rudyad2ef7nhxngq", "5933086649427767296"}, - {"evmos1plce4deqk4zpwnd4h9ludk5yndwm5ka0mc8tvs", "5639965520388369408"}, - {"evmos1plhwfdey9u50zu4xa88wrzvx0umw5nehz9t8kt", "1067707208914784512"}, - {"evmos1plhyjfw7spmu3230k8229wmdynad8yp3p3k94q", "2494720469888662016"}, - {"evmos1plll64edauru6tw7qkcraq9ksh7qmrgs5f58l6", "12155947407083849728"}, - {"evmos1plmw4xmkqulmf8j0nheygmyfky26hxej45ch8d", "101308890465243392"}, - {"evmos1plpzhng94k672sse02tslmec6dxmgqljck6la9", "25767165286386008064"}, - {"evmos1pls403uavr7y6t9ra29lm4tflh87msldy7qtzd", "61214797202964480"}, - {"evmos1plspy8qhjlsv880pkxvlztykd47mx4ewjd9sg7", "479249297180778496"}, - {"evmos1plu8p5ypvznskq7md3d2nve5hekt6p7r2pwtae", "1109046071849852928"}, - {"evmos1plxpjnexcn9s6gs0awwcjk4dders0wvely03g6", "3047465630906714112"}, - {"evmos1plzasd5r9akx26yv7cckeyp7d2dyfp8kv8x507", "288955393689919488"}, - {"evmos1plzmn3s8nsl5hnd5qmgkr2eus37pzp743ys3pz", "9320066885235564544"}, - {"evmos1pm0u6w9n3mlysec0tlumeuxu54f8g2h9554j5h", "3070912864027568128"}, - {"evmos1pm78fwn0frkt3ffkl5fc4fm5kk5nvzx02pugfp", "16576596890257420288"}, - {"evmos1pm97sfjgpx2th8pq27eyp9rk7np0s6lzf6542e", "2679516548674451456"}, - {"evmos1pm9vp2u6r57g7kduuwdxzzmjks60heu9zwhdus", "2002644805306466816"}, - {"evmos1pmej09ceaet6le003k7rev6gkzmtnpcwenefhq", "6927374323223087104"}, - {"evmos1pmf9uaf926dz3awats7vf9cufdf2a39k09u93g", "1887541068770064896"}, - {"evmos1pmh60eu80t4sec8lemffrayjgk92ux0ty0q9wt", "318455164045139968"}, - {"evmos1pmlnxvj8v9kuqwwxae3d5a4vyer2lr9g8mqk4d", "12622695492572614656"}, - {"evmos1pmrj24vpheqg46y6djlkpt2zjjnwwrnsesnytu", "2331144145673220096"}, - {"evmos1pmrt8t56djmsw32zmllfezhhek7vfgqkt3zvva", "16781947353172670464"}, - {"evmos1pmtr42kel8j2a3mmq6zcutxtrtadctf5g2h6ax", "92627776557944832"}, - {"evmos1pmu9sgupsarcpexdh04wlzl6r7wdxndwd3tvah", "58299253401018810368"}, - {"evmos1pmvqsrseuy6lg4fmmv4pnsj2g3ahg5p7lrv2k4", "8734417160181502976"}, - {"evmos1pmyef927su3f6f93x60ze5u523npwl4hls5g65", "1746322196987526144"}, - {"evmos1pn46ehnhlpgetw85gty8c4pmm5324lyqp3vmng", "124543013748006912"}, - {"evmos1pn7tehk7dwy4kc4lflul589j3pwgx0y2j8tzfn", "963615581238386688"}, - {"evmos1pn96ejdc97xfngrgsdwj06682wjpcpv7m9mtpz", "4462692164673180672"}, - {"evmos1pn99053m7kfv7sezvuqjfqjfqahvfe9r0gqcpz", "2941783163877982208"}, - {"evmos1pne2ccrqeh36ap3yfv4j38pk760xxpvzwf0q0e", "106695620827838644224"}, - {"evmos1pnln2yjnjthk2ws6huv3yf72hsklq83pnmnvwr", "1025606870715491328"}, - {"evmos1pnnv9lzqxf3er0ugup98ukda770ka2xz7ssn00", "7702087570834586624"}, - {"evmos1pnp5ps98xc693aew8y4u6y928fj7wpagpv28f9", "375686991428383232"}, - {"evmos1pnpj3nmvc9ctsez5teuazfkw32rq4vlefyaj57", "9287783473976723456"}, - {"evmos1pnq7a38rctv0fkwm60rmnj9x34l862s328jth6", "26361279564570189824"}, - {"evmos1pnsej2fxjd70p5j58eq6kwhdwqs8dgc5lccqch", "67816335062394896384"}, - {"evmos1pnt3n054l5nj3jrp22lhhk86js7jxfun97jvq3", "1126315046353086976"}, - {"evmos1pnts8a4tgqw3dqwwp2n8xa5qnnu64ue0zjtjua", "3684036079358468096"}, - {"evmos1pnukqxyvp9aqvnp9a46ufuf7zjxhsekw76lu5x", "718722529151582208"}, - {"evmos1pp2cmcgzwutwd0x2d4vk4cc0kp94czwvu9akja", "115346230361417472"}, - {"evmos1pp2lprs58cwmpqwv83t37src0h8mdxuakdqkca", "33909203203196227584"}, - {"evmos1pp3xr4ctr8eghpwvfu6uq6qy2kqngfnc4dehmg", "3856828891128994816"}, - {"evmos1pp7vsw8whyh45hjarjwqrphvyrrswqt8xekpcn", "15389609658029395968"}, - {"evmos1pp8f820wssppdxf2e5klpwmjtxuejkrqcyw7xu", "319340127440459776"}, - {"evmos1pp8h8006y00jhauqxsgyv7zr24dw5kh6gmfquu", "4588526127728819712"}, - {"evmos1ppaezuj0qtznc8xyyy97ljuugevmt7y0qg3sxw", "17291454400864342016"}, - {"evmos1ppcs807pwl95e69ru76r6w28l0vxs9lrvj6mma", "1306675460164861952"}, - {"evmos1ppe86scen5pegaud50xpff0ny2m8jwhzjyskw3", "707672494449228288"}, - {"evmos1ppgxh8dqjgfnhp5qkcq6j97kfeqk60jzgu64jh", "6525064262966754304"}, - {"evmos1pphaqvhkl8sd4gylj9c4v39qygg660lddnknwd", "988235977921584640"}, - {"evmos1ppkjhu80l9y5wgenj9mtqnr6qzmwlzrtxae74l", "1861958589421711360"}, - {"evmos1ppkwe0k6uxwjgfnv3gl0msq7gxjh9jmkcsyxen", "7053888532054835200"}, - {"evmos1ppmk70ae83dhxvhamgdta7crg00mxs8mkke307", "65874157443390464"}, - {"evmos1ppmsq7mx7ysehn899aqp6hwa0r8yetrr89a3n6", "20403791233165885440"}, - {"evmos1ppmwkc5r3jarww7x9ljkxfl5ask8vqvdnq3w0u", "1099976803530706944"}, - {"evmos1ppqltsv27m39zuvhqwyvn7p2nfm224j27srme4", "4748578241212321792"}, - {"evmos1ppqp9pp5cvlzjmrct6g3mkgq7j58h9rnvn2c9l", "24952392387703857152"}, - {"evmos1pprfx9jpny48p5unwud4mxs6hzk4ktegg8d20p", "2422750105680461824"}, - {"evmos1ppsz72hh3hskedfwr97zs55hc0e37rvw87pycw", "469462410383462912"}, - {"evmos1pput2aq9nwk4p0sysdkxqyqmzc503ql5y48phx", "13278002210103263232"}, - {"evmos1ppz3ure566kctksuw4wrsj4a808wldg5g4wslu", "3829844422978256896"}, - {"evmos1ppzz92j7pce5uthprrs5a207jlcutuc48ydehk", "3939061227312628736"}, - {"evmos1pq0dyg3csqf6gv27xkenpgwdjx582uem9fjrcx", "29319703764882554880"}, - {"evmos1pq0z4kf2x7m8v3yf58nez6zn56jzkg90cefla2", "188321465897631744"}, - {"evmos1pq2xk3ktm24q5ve90q4jagmnearrltluq0msfn", "2676492436812220416"}, - {"evmos1pq3w2s8ed58lqx7k9psy5p0dfluw7xrzz8ju7s", "385283406219096064"}, - {"evmos1pq5rkgyz2ftx4pt6zpmlne9nn4yd6y4472gqvw", "116830232041336832"}, - {"evmos1pq7zyhn9l8p62ev76776m9m88l8zj5u2zd6pen", "403370477095401216"}, - {"evmos1pq88ct7565rrqyrgsuh9ac6xwlpglw42u3v9n9", "713142364252584960"}, - {"evmos1pq8u892ennfry2mx7ey4c8cx60u57drl7qyksv", "10634785375733784576"}, - {"evmos1pq9that4fkx02q4p0yy9cerevmlztnkcnzz8kw", "3185200636266409472"}, - {"evmos1pqe7f3u69vvzeghfl7ry983plae7nfskkvx0ce", "3988796346296735744"}, - {"evmos1pqgfje3fn0hcrx94dg7wduamvpvpgl54qgt7kj", "285619012418909184"}, - {"evmos1pqm89xma25c7h3zzkcxg3dfj6f5w8qaugrqlku", "5157562189033238528"}, - {"evmos1pqmr7te46hnk8xh4kma24mmjs5kve54d3agcs0", "21043529375048448"}, - {"evmos1pqnw0ttxlx5y0738jun0qyw43qp8469pjz8ftj", "2563073685890257920"}, - {"evmos1pqqg3ujjlezlq4a92j6h4qmjpdda2r0vgy73ya", "331910075329757184"}, - {"evmos1pqrj5haujrhdrjj0hp3urhu258lvv886spkdjq", "31505220178305728512"}, - {"evmos1pqsf299rc3smtzvd9pcvz6j9hdx4vwwv2v42wu", "129336722503230013440"}, - {"evmos1pqsptd7slvc6dxkd026e983eqq9g6ahgxtetf3", "2856891375187984384"}, - {"evmos1pqsunuwqayp00m3y0xperfs6esqss8wjhpjct4", "47019274884748656640"}, - {"evmos1pqumt0lerue282v0uw476w2ncy480ftsc3mqtr", "194274314146635776"}, - {"evmos1pqxm3kse8aq8sjctjguhzukltta3v96ua6fsz7", "98798225646461696"}, - {"evmos1pr0nq394yr7sq8yna9cyr5lj2lvvpkmmslvr9y", "2858159479264073728"}, - {"evmos1pr49spyj0dggq478xc0vuk9evp98nk3gyw05fd", "478658620482230528"}, - {"evmos1pr4xn6g988shwd07fnnlkvkyvep5j2qluulj58", "6222738494362496000"}, - {"evmos1prczugwf9ya8cztjagv45pr40pggs2qhg7twpm", "83361035793227776"}, - {"evmos1prdueuaz8j4qwyd4k3a330wefvgw8we5ceztec", "46161262267935080448"}, - {"evmos1preckzthwjrt4svdlzp09w0f5xq7x67zw99uue", "77941546944905216"}, - {"evmos1prem5fy6j5rlf6g73tv2x47ulql2ye9gf0ykcw", "13001748105564123136"}, - {"evmos1prf8937tgyrlgpl3789ckhudwljte5qqxevdjj", "18865490289277861888"}, - {"evmos1prfxmvh52f8vgzqhyxm23mz7kqz03lcp8c3xcl", "1459921512968080384"}, - {"evmos1prh2wqv0mgzsnm3ppzj6ka777sdv44p484n8hl", "2890913279405500928"}, - {"evmos1prhut7spzj3j7gxg6xza6vaqxlz0e5sz5vhfsf", "1080234938993010432"}, - {"evmos1prhxyh98japexhjzjdp3waq6mf5mwelzcw43g2", "1041116402986131456"}, - {"evmos1prjjq0cjp9y9cw7pkzn6x392k6ha7zvr8hx2ma", "5769414525080920064"}, - {"evmos1prjlgect3ec0ua7e22aqlwle73mz4tmngc8y8n", "6951675107125870592"}, - {"evmos1prju58mmhuqejwjwu66q4rkx97amshvh2jgys5", "1012740372954150400"}, - {"evmos1prk9uxt5rnad6r59xclfvmdhg4kwps0cg2yyuf", "470504916445836544"}, - {"evmos1prkr6lvmtuyg6h5jez2asyramhhg9q8dd8kaj2", "1282287515241467648"}, - {"evmos1prml6p88dkk8unv7xslqk4gsx704hwjgvqq2nl", "792711362956190592"}, - {"evmos1prnquwdfj4r8l0wf6tmdcxwfgtwqase0hx7wj8", "2424390964990443520"}, - {"evmos1prpasnmf3eusqyz5e46qm332vgnstqllem4ena", "4429859783706017792"}, - {"evmos1prraj9jp70zzvpg85s05sgf0h5qppgc4ujzdhv", "256197588190535680"}, - {"evmos1prrf538tw3zrgeqh0flzysrcmzyx52ekp6kkv2", "59449009362592512"}, - {"evmos1prs0phs7syz3sfjxgpp70tj3x3tmy75xte6l9t", "3740063456111591424"}, - {"evmos1prt92r7htca4fwrm3vjnnluzcudkc0yg5xychc", "143497046268135936"}, - {"evmos1prtcxtdepu6htd3nuyfm2h9kga00sgq8smf5v4", "2332120784668165632"}, - {"evmos1ps0yuj80xneny5ulqqwmdeazrkl58284ucx26u", "1586081227491426304"}, - {"evmos1ps2n7mzgawypf22mm70lu3576pv2667p4pfy5v", "797215984730013696"}, - {"evmos1ps8qjekk7efn27w7sfjcx7j66kadktsf4amqza", "9508385706517465088"}, - {"evmos1psc8qx465yrmevuqea2sc3xrvsp9lac4nmqumu", "444497245539902208"}, - {"evmos1psd39husrqve40n4kk3qgzfq65ye7r42snnc6j", "2356902069444001792"}, - {"evmos1psfz5v20ufc3wzpwyqt6edwera3qqaurjnmkvz", "19034431336154882048"}, - {"evmos1psm3s6gsqqa87z6tgcw8krufp47dj5xj06e9w9", "1162779329385272832"}, - {"evmos1psnxyg7gmdyv5y3czql4hkrhy9r0sc9rwddaj3", "4723502072797087744"}, - {"evmos1pstj7sj6rv32cl62f2c0dcmm59n6ghldrk4s7c", "1458498500659814400"}, - {"evmos1psw28nvqnsqcxtc9mg6p2svzeujh79pla0627v", "1243008818056495104"}, - {"evmos1pswakf380jm826tuwvu5chq0y9llfhsfcs46hu", "3410619328382552064"}, - {"evmos1psydsfr6w292f9j8t3xl4cyjwedm2lx02tytgu", "31043569638010298368"}, - {"evmos1psz0gw7dtjuwew5adjjsq08vv6py4hqsxauq6v", "3252627882914742272"}, - {"evmos1pszcu75qxupu4kkkasd877jhfkajxpgv669rt6", "596521494652034048"}, - {"evmos1pt30q770lvfkd8pas5a326dr6ksjjuezeq6ug8", "384526592120468736"}, - {"evmos1pt4303r8umm4955m2mx3vfsfyll2wynusychtm", "9918096355114598400"}, - {"evmos1pt73sx2zxgjp7q6d5h28kfu7klrt3aa6p3a0hw", "1185325661663642112"}, - {"evmos1pt7r0vnn0zdspzxwww9jv3ut7dfqukem8h2v7v", "1784312371422134272"}, - {"evmos1ptaygfh2zrydvqy3uljr6u58vj5q66f2k29a4l", "560861409818553344"}, - {"evmos1ptc7j2rw2u9spm2nvsptf902zkf6es7fq2cqu9", "1746438877386596352"}, - {"evmos1ptdpj84ax0pzm4mwfr7yjr8jatad92gtgegx8l", "873637836617767424"}, - {"evmos1ptdzwkmgq7xv3re634629hq7l794v88g3h8lk5", "20201072637776121856"}, - {"evmos1ptea7d8rxegq3tzquak9s7kpryl8nddddulknq", "808108873558891520"}, - {"evmos1pter39n6vwacc9latc0fk2vrmwqasdmd8eqnhs", "29358625298162432"}, - {"evmos1ptlak6w7rg5me6899ntpms8uyfa3qnk9ffdej3", "2300310324142727168"}, - {"evmos1ptmzpp7l8p74fex4xjyq9gq9na9hlhegnuh4tt", "12914047791323863040"}, - {"evmos1ptna09aqg06dkasqdw7l85xgdjtrgfwskums9e", "6374143556245935104"}, - {"evmos1ptnyh9zd9qlf7hv5jv3dy8dg4l29vw3dmkmd3g", "2424615073950613504"}, - {"evmos1ptp6z42hz8pvw5e7jtzf9kqsyrl9g8zfj0ysgf", "28190181072104026112"}, - {"evmos1ptt9c8yu7fp6c0t00k4g7cgj23zh3ln7zlpz8a", "390658829698620672"}, - {"evmos1ptutameglyaw36ag70u5c7hkclj85lpxm6v8ls", "384316370694166016"}, - {"evmos1ptv270r3s5uylmdkc5fa8km5j38yg7zaxztgge", "384217073961421824"}, - {"evmos1pu2drw07ejtqaneh0agh07k5m92r5edfl2gzxt", "4044768416950620160"}, - {"evmos1pu5q8ul43t5qng3xx0c7znx3d0lthxq9zkdwzt", "102053031377511251968"}, - {"evmos1pu7l5scy5jzswlfwxen09supcswpvmzyn8rsdu", "686029698022284160"}, - {"evmos1pu80d83v5pr3379m427l2juxg6mrkxcyvrwxrd", "3413748538792198144"}, - {"evmos1pu8sjzk8wwhp3272z948uajfdz0kkjf6l955jd", "1762079681011537152"}, - {"evmos1puay0z8wva439ncjwgphudy44dn266ct7gatuv", "4333027847653429248"}, - {"evmos1pudq8zpt7ky2we25wkzxawuqq8n0vxmrnt482y", "2514484258779414528"}, - {"evmos1puj6jlrjyvh76shdjmjd4e4q0vqjd44tne6cmh", "1665603757922975744"}, - {"evmos1pulhxp5q5ttaud9kg36crm3472wh60lfsdkyld", "171548308107826944"}, - {"evmos1pumvnr34khux02ur5tcwf2p26ak5g6wsdlkmse", "7425188324205186048"}, - {"evmos1puryhnga77s2klu3jat68t08q5yg92mxawwsj2", "5703396958143891456"}, - {"evmos1putdm75qymkrhyp6w745qwura5g2llhraqkez6", "1048823168798433280"}, - {"evmos1puv5u90n3v38wuzwlre2cy5evl0lsthxyedzwn", "16319199555494830080"}, - {"evmos1puva6k2q4vcmx5csna4yr534r6rhysnnytdcln", "473140743040715776"}, - {"evmos1puwc70wrynuax0m9wferntahkpzu69utwtfhxj", "3218140699682478080"}, - {"evmos1puzqe07repvdvchw42yy4e49hevtgpugt74erz", "27290223233672654848"}, - {"evmos1pv3cmz8l3qvk8puhp7ckz6wjeyrsylj8w65w8d", "576525651020053504"}, - {"evmos1pv9a63udjr3c3305488003dyey76xpmzfrjfl4", "6384684561177878528"}, - {"evmos1pvdwmwm2mrmcaqggzceyzn74fefmry8p0m2uel", "462439531763154944"}, - {"evmos1pvhqzwvgnqpaat6zr05u7qp0ptx3hndtr0m7vn", "1350600126275358720"}, - {"evmos1pvhseaxyn9v0cljhh4mc5ms047qn7u907mkw99", "6166616045481625600"}, - {"evmos1pvhtvegfapuuvlc9fncxula9lwvuxfcd5zwsss", "1192456787818618880"}, - {"evmos1pvjd66shx7mdup6dtpycysw72762yfetht4gsl", "5923749125871730688"}, - {"evmos1pvjjxw4cukguu4d4caphhncqk7wsejp6fkj2vm", "774546061536362752"}, - {"evmos1pvjnzd43563wdm8qqfxmg75ydcau2g2sv6x6u2", "2254554316057210880"}, - {"evmos1pvk80k7cq7v43dc8ekf2uxfxhd36yaj0kxzvvz", "5310279583538436096"}, - {"evmos1pvmnaja7d6xrwms5s4lwy4ep3lk47rkd6jzv06", "1244216300176859136"}, - {"evmos1pvn80uwm2z3j0few3hruwjygdmxeppc0mzyr82", "25370024086093144064"}, - {"evmos1pvqql4c7cccxdl4pjkc7wf8v32jjaxacxhc9tf", "932134371486347264"}, - {"evmos1pvqv0sstfwzzndms7r98zspwegmrfrykcs9jju", "1245277771440715776"}, - {"evmos1pvrnf7gmhkue5a6t7f220rv8mslc80yultkm62", "4148201961933397504"}, - {"evmos1pvs56u5gllscln30zy4n4madvg0lvezdv9regg", "965426215621509120"}, - {"evmos1pvs6a0mgkfetl935664jx87khcu49q0ed94p3p", "1577172520333565952"}, - {"evmos1pvtfnahxpre95gcvemave23tn8mlt0y9g9w4vh", "3377422358871932928"}, - {"evmos1pvwm7pvd6q0r5uwx55nl9ccays8tlfrug7p3wa", "7792073271741861888"}, - {"evmos1pvxudwrvf8l7308umnuvyaedzlrmf2ewyafdly", "15813323268657696768"}, - {"evmos1pw6nmcea7rut5s8qup47skvc75rvf3auhvgll0", "24276036942051368960"}, - {"evmos1pw7jzvqhmg72w77plknpnszwl2l5dnyc9h8h73", "5457583883472031744"}, - {"evmos1pw9j5jvkvflehugxu7mdj4q0zfnggx2hn2mzel", "61645291720160512"}, - {"evmos1pwe4wsu4xkkej53wj4gae3lrp2v34v7etdls3x", "50296323930887471104"}, - {"evmos1pwfd05xx2qu6vn9drmd0g8ukf0dpajufryhxj7", "7612256240059845632"}, - {"evmos1pwfgfm57w5sw0svxgera8qyefkg9jaluwu8sv6", "53923687457058963456"}, - {"evmos1pwplv9adrvynupcjfzfsxek2g3a2sxt346prhe", "1028633902770010112"}, - {"evmos1pwq4fm2z05klnahha5fa2m3gsuzzz5yx32f2vp", "7466186360325974016"}, - {"evmos1pws6cg29yjqg4h060uhxmhvhfpa8zquq9kn78e", "6442737119532214272"}, - {"evmos1pwuhgwct7jl4d9e7afuxtkac0xekufwpaa49hm", "2044132649104990208"}, - {"evmos1pwuskdxqqy9w5qnqgrrhfsumfnjzysv80atj8j", "18809415086262525952"}, - {"evmos1pwwthmplpet927hx3kl6m0jkxau8tm94usj8dv", "3347189349902012416"}, - {"evmos1pwxkezdhtqum2qt23rr03vjnhmxnndakg8305q", "1235045983127426048"}, - {"evmos1pwxvjqz340gtnvem69cjrwyehdaf67twxyfjtx", "6994972987733278720"}, - {"evmos1px3hg8fzaqy35qxcqsdf9e6sr0gxndghmcp7u6", "10486329125116788736"}, - {"evmos1px4a3hj03px79j3nlr3hksdaqaq42pfuv7djnt", "384252681766087936"}, - {"evmos1px50uftuw37x697pnq847pd9jnfn5tphnujs72", "2961173184228571648"}, - {"evmos1px6vpztu29snc62vc94pr0vhklsxt9ggdeym0r", "986267050743962880"}, - {"evmos1px8cqm0y9y570q39xr76zdup8e823n0alq0nd2", "6336182583530930176"}, - {"evmos1px97megn8ak6857cltwqgmfxnqxvrmzsll3ydy", "45888688673647360"}, - {"evmos1pxcc5z2gxvgz8yr4pjynepfg6czwehtzw4d7jg", "3314071530614671360"}, - {"evmos1pxcn65ngt2t7kvk6lk5vejhwxlfn7r47wgp6ss", "1201117720353345280"}, - {"evmos1pxe765ujm7tv26g6tsl8jwktfhz86zy7y0ud3s", "26588655886880866304"}, - {"evmos1pxelh57y2fchgms0e8akgv0e6cd699z4dsr0k5", "2962685913675681792"}, - {"evmos1pxkw3gc5q43wue3vsnz94626cjg6g6xzsx2ngm", "1564040099900673536"}, - {"evmos1pxm6e66ytz73978nl496dzntms5vqpkkvfe704", "255148899294965248"}, - {"evmos1pxr2jklqphnzc4jnkfevh0mhp2ehlf2vaq2n6a", "15526626612718002176"}, - {"evmos1pxvagefv2s4ty633xzkfvdzy092f2hdnmf0d0x", "1303164451431910400"}, - {"evmos1pxwrfu29xtsn8pxsushsqxjn3m5c678e2cms2p", "805594850992282112"}, - {"evmos1pxykkurfm6c3t46twhd0vurdg2gvqpafh0ek7p", "1635266928641458176"}, - {"evmos1py0qntps9l4yue55vu8sk0gt4gqzremzw6jwp5", "223078512557091328"}, - {"evmos1py0uhwgcduujvyr5qquw5kuqqll8va8ysew4ah", "511279961976887296"}, - {"evmos1py4yyp0eznmysw5hmav6yf7k3rmlezvsd4gek0", "813504243647760384"}, - {"evmos1pyaza27z4y200lr7x36kanu5s0zl83symtaw7a", "257009302635185664"}, - {"evmos1pydhdaph5n0yz3tmfky4gh4rfstv404czy3zd5", "6979091084275027968"}, - {"evmos1pyf4xty33wckyum6enucssv7evztdat2drdv3v", "34501853292323438592"}, - {"evmos1pyf5v7lhy3uvy5r2ut4aadr8u0wdr5mzdegmma", "8083348273910509568"}, - {"evmos1pyk34rrh7h4n4mrsc2dyc6x8dc54tm274yvvuy", "780064114041135104"}, - {"evmos1pykpzcddlzt3y9wmg557hmddypp8nrn3f82j82", "3075776504414714368"}, - {"evmos1pym7mepk5v0jugkp3zxu6stpqm49ccd4ee2jl4", "518107583017725696"}, - {"evmos1pyned4esdynq6mnhlvhepx3jwm04hjesucytqy", "740139371708358656"}, - {"evmos1pyprff0xcjhjd4td7y32jhk5gmm9cgykk6vdvw", "2538836876168373760"}, - {"evmos1pys26g8u6xvz4gshnsd0klegeymms2w6n9pgfc", "4940177481598140416"}, - {"evmos1pysdvwcsayma945dzs884hfk0aud6lpa532vg0", "3259415401107865600"}, - {"evmos1pysp67r2pmfd8axhzsv2aees3975lsv0avmj0v", "859046329970574848"}, - {"evmos1pyv74338egjdjzd8w7mfmwdjred9z9ny0t2ch2", "14100876246008360960"}, - {"evmos1pyxdwvrgqn0w607yysqe25lsck48l29keykr3z", "163479506100594868224"}, - {"evmos1pyxmsdtp2tsxh58rvm7s7gkk2qn5p9ky8ltqpt", "474772597938941184"}, - {"evmos1pyz8v5qv5xy062k6xu9mrd8qyruxar407j9rxf", "1842264040302665728"}, - {"evmos1pz27c76s4v7dwmf4cdt7vzpwpe8rgqpxqle472", "782739869152138752"}, - {"evmos1pz2w58pvcwvqzgjwww6uyutulz2m559nte95k0", "717300228110630912"}, - {"evmos1pz3tq2vvewne5v038cy7awyfxgd5hush4sy74c", "1048261135284882432"}, - {"evmos1pz45gxcrj7v3n0esefzk6ms00ue4tapkxnk0k8", "433914481083972096"}, - {"evmos1pz6hhzrc8p3qkyvnwlna53tnpjkxypxzjhxved", "1060858343088558592"}, - {"evmos1pz8j6sh9h4qn0ygep0mq0q092zwgycdjvmsywf", "10707929203498891264"}, - {"evmos1pz8u724eh4sh72sgqm6kmpm5ddm6lp58d5d7cp", "6136257783736893440"}, - {"evmos1pzawtt996g68ctaftacv58zwhtswt2kmfm2ez9", "1942105474965028352"}, - {"evmos1pzcuksy3ytrzftce8hy7qsvqwx52uqnrugnt87", "1400468176901917696"}, - {"evmos1pzfzl5eymu2k60hdsp0z5dp0q6fk6jwnp3mxtx", "32135211301571072"}, - {"evmos1pzgn29vq8357u0pt300lf8848w4pd9xklt35sd", "763257254245815296"}, - {"evmos1pzgst64qe9pp9qecwe4vyuq5w9djy2sjk6vljy", "7786459843397173248"}, - {"evmos1pzhn3yuzq84nj8tsjrfz6txypnp492qjwydlnf", "6295231622467177472"}, - {"evmos1pzj003dsqgw2zht9usgty2p94twgf2apgmkjyq", "13719453945181095936"}, - {"evmos1pzlc6ma80aaujdlx9h9h5hgjqxyscj8658ep5s", "42220253123030048768"}, - {"evmos1pztmfec84nlk86dfjwh2dgguac3undyjj0cwxn", "7034103158404878336"}, - {"evmos1pztt8demmzlvpu4zeu6ednxraxfgymk38jee95", "474299036024792064"}, - {"evmos1pzw0wxk0xdhxxhwqtndu69r6etqy0qdehkn04l", "3245253593221496832"}, - {"evmos1pzxwxlnu476vdapud8crpe62hk39clgst5tuhl", "44393938165055232"}, - {"evmos1pzzzf09knn8a3lpdm2xqg0wylmdsqkfggwx7u8", "4004598326271537152"}, - {"evmos1q024c67uw7wxvntcgfnuwg5ep62je0p0tcq4gl", "3079115851070276608"}, - {"evmos1q0af69ksnpuj2w5h2srnz3hv2gxt3c3u5yzydr", "2968557563038316544"}, - {"evmos1q0au67khnpezzhf9l96zn70fhsl34g936nw498", "5864153004636525568"}, - {"evmos1q0cgv0akrswfftfkjjtpslczkjqv3nwsadch8p", "834971056106864640"}, - {"evmos1q0d4g2wa2rg7ls0tlgvremrw639u4e7a29w6eg", "6790139822747877376"}, - {"evmos1q0dgg063nxsev9rggcg385tzewd3u27nc0wmgk", "3092907432461157376"}, - {"evmos1q0ewrgexa7vt58kca9nsmtu98clgc8hpmhwjdl", "40924514034742984704"}, - {"evmos1q0jn8cph04ewp04c2kqe40890jr5vmlex3ngx0", "12694921414869819392"}, - {"evmos1q0leng0v5044vcps6epemjm4c3lr39vj5r2780", "3090841766408043520"}, - {"evmos1q0mfwzefwvwx79ss0czz0tallfyfwu62tnjumx", "4830162947867328512"}, - {"evmos1q0mwye7tcdxmt4jzu724fc7rtfq00w0xlk8g60", "282652319576326144"}, - {"evmos1q0nu5zycvj0s4gmly3pjjqw9td95wqqg36e573", "576634083755443200"}, - {"evmos1q0pgz2xltddcqn8kcaeey9v2np4kww4r5cntla", "170192166107068416"}, - {"evmos1q0syrx5fq0kap5raa7ftku9x0wz6e8s8fh3amh", "342848296628544512"}, - {"evmos1q0u002my8rlwvg8q0lcarvteynuqgt6mj3lhy2", "18000256376367628288"}, - {"evmos1q0uulycy7a5edpm8qkznjgvuhhy4mn6xmduxa5", "9712853000463859712"}, - {"evmos1q0vytnd742gatzf48ef2ztl29wcc64qsutchl9", "429509955082569984"}, - {"evmos1q0ww6vdc8qx66qzvzcpuupx9k592ar4nvnh4eg", "5210111063098982400"}, - {"evmos1q0xahyqmsnm7f4yn2rld7zmkf2m0elnns2s6pp", "3742888183118772224"}, - {"evmos1q22ukmxe323l929wsv4ph8r09w98zcxlzdrla6", "6676896951692574720"}, - {"evmos1q256tfnvxfjlde4qha265v7wrk3qs9ngstf85z", "517715858338139392"}, - {"evmos1q282mmdh5vf2lyjvrqd7ku5028t5wgdq5mgxyq", "384768560364013312"}, - {"evmos1q2cxu39w5evdnugn5gkwuv4eyj696kasc60wyx", "59682783689079996416"}, - {"evmos1q2cyl5nlhzvwd7kwdhcc3rmjjp44hggu4cp0kf", "306970705214543872"}, - {"evmos1q2ep7mq4g054spf2y49rhvce374gn7quvm75vn", "4136045099620691968"}, - {"evmos1q2h53qcks48p5usqtpj85vcdznkeegxrphdzua", "2433877823792200704"}, - {"evmos1q2kkxkmkd6shclnqug4qeemq7z6hw6l2atj30a", "2356433658544754688"}, - {"evmos1q2m6qv6ea6eqzfrxme87y7ezunuhmk9pdmkst0", "6381569097073729536"}, - {"evmos1q2mt6fpqejku8pexh56tkl6u22elfullm2ujrr", "130926377729218740224"}, - {"evmos1q2nalq8avd33gtddvdqn82yjyzm2wt4e7esg2n", "953045230536288768"}, - {"evmos1q2nd3jk7sz3amjdjvfefuh45hxthzemgj9k2ac", "4752584679559668736"}, - {"evmos1q2pk5q5w25q76daj29dw7vmf99gwftlsensqu4", "2569018065971660800"}, - {"evmos1q2q8k554ee0v904gvyj5ar00lgxkvqxs3czqe7", "960886126193655808"}, - {"evmos1q2r7ag47a89hj3n5xh3x5g6q3wnxzkxh6rv83u", "3473987777261568000"}, - {"evmos1q2rx4hu23g43z5ezzffw0k2r35xaytrcw8ve78", "2669579239576911872"}, - {"evmos1q2tla3c78k3mrvs478ejve3z3w763vyvhxperq", "17353363148833308672"}, - {"evmos1q2tm4vslcx9zxzzsmjq87j6455kwrktvy5ww4w", "315586832728397824"}, - {"evmos1q2u94m0ecy9ps9zfwwc2nr30q9x62ns08qswyn", "122194596397271040"}, - {"evmos1q2xmeeyzmy5a0a7353q0ep3wje06g6y94c5m96", "384314424118280448"}, - {"evmos1q2xzea39pz73933vum066pxmf0leks3yy2qn64", "379083284420783104"}, - {"evmos1q2yv7zl8253l0pwkhalxzn7mdy049087ey2lp2", "11921244812437442560"}, - {"evmos1q30jz8vu0mav8q3urafvfvraz7r6c630gnp4sf", "3710528642822750208"}, - {"evmos1q32evayetpmtv95d37rm97drlcz7mcez2yzs4p", "398429816489009152"}, - {"evmos1q34muzvulg9ke3cat8twfnfcchgwaacm4xfkhp", "4410000818429227008"}, - {"evmos1q36g5z320af6qca2mxzfk3gnta0d323myjw6ez", "4907089560646694912"}, - {"evmos1q39a2devu77py6jmknsmk7ujuvcjd406d97yj7", "174220410065207296"}, - {"evmos1q3hd4w7s0j0x3fvh50saxrc54ad9tuw553s025", "17598320807132059648"}, - {"evmos1q3kstsp94fmy22a0c4n07600vhqxju7lllre4l", "3432268565641770496"}, - {"evmos1q3n9nwex8lvrrclp8ql84jmvx7mz9v5lrq2hl7", "721446406062211072"}, - {"evmos1q3qlh5rgd4w503w669yngmc73y2n7lvthlgynx", "911044691708038144"}, - {"evmos1q3s96gex308t47tyy3qhxfyq5vygthteze4uvu", "132346258606487076864"}, - {"evmos1q3uwj5jln7fcg0asgaf9ywa8sg9ap6mtvn7fvp", "456350245933421312"}, - {"evmos1q3uxysf27xx6f32f2jtrpzrahgd0ds8j32uegv", "9978818899454978048"}, - {"evmos1q3uyrn4pmgjj463yem480gpdw90tzw6ujuwful", "166943133807582720"}, - {"evmos1q3x98kzhd4xhqrnryly4f7yr3rhq8wxmkf8nk3", "28686415399088218112"}, - {"evmos1q3xn0v0quy57u5kehtvp7xuz0tcxkn042dm9rk", "1433250284152699904"}, - {"evmos1q3zqh69k05tfl9r83s4ufq6deuee3ugjm2zg63", "1811187193969944576"}, - {"evmos1q3zsf4d3uj30axpz72gvlwpkeqkmrx26cpy74w", "2446274195282766336"}, - {"evmos1q404mpd06n73k7rjanx9q7wmtgcg5zdhwwr8jm", "10837053528919756800"}, - {"evmos1q40gp6yjraje76cnelem6yd6k8wknd3nqqyu62", "5626247838705778688"}, - {"evmos1q445zrx39mg5t7xzfu6p60srkaat0285chvjav", "449400265377009664"}, - {"evmos1q44yewads39hanecppf0n5eq88m34ldmvek9su", "59076280523795456"}, - {"evmos1q457sj8a83lh42n0hw40pwlhvac9k0yq8y825k", "444888558219440128"}, - {"evmos1q45d9f3eu6avs9myzjex5wj6ns0m4rejm4mmxn", "238141345597441835008"}, - {"evmos1q45gpktlfv3a6pzts03t5gu0g5h2v44x9a5zhc", "761438558799800320"}, - {"evmos1q45nt3x9wjmsj0x5en85ea65w5ky762mx6me29", "5940768969048924160"}, - {"evmos1q462xkhgwl06syhrutkwd5xxrm7xnakg9px0zt", "1218875823545537024"}, - {"evmos1q46k6x0d7zwxcpsc6nq7k666vc9fnpgu3xhtuw", "981765325451751424"}, - {"evmos1q47ugwhkrpafx8nc544n9yu39fd59e0vrppy5t", "915650628174330880"}, - {"evmos1q48epsl5t3szesavkrkmt2eyeg5wqanwzu0yhc", "31503646120667054080"}, - {"evmos1q4ddu7sexpldeqm4w2gxl5l5gjnrr2vrn9wcax", "13937894969141123072"}, - {"evmos1q4grggdvjhwugn8t9687ns39fzrw8q2at83ls2", "86907888133298688"}, - {"evmos1q4gx9h72v0qfhrwtuqv6hc7q9zq3c8k5tsp4z6", "53344821965602816"}, - {"evmos1q4jskhe74lkrkfmnhyl8cqxx7l3dst8wy3afxu", "32392879291535958016"}, - {"evmos1q4jw7qke5mqv6482pxs96yr4mm7mgj3qvp83zh", "832420395355979264"}, - {"evmos1q4ln2pm48u93zkd2zgsajlzsc5an3tjl4v8l6q", "1179275044783046656"}, - {"evmos1q4lwv03lq0dhnax0wuwxct06yrcn43k6ueywle", "233111673156249856"}, - {"evmos1q4peq277sw8egw6zxtfmf3wxq3atvua6m3uw99", "210963770262160384"}, - {"evmos1q4sqy762hv6ya4nudr3w74uz6dafns3w96z3ht", "4551964746168401920"}, - {"evmos1q4t33883asdyjsjs6qekzt5pl2373kve4xj3fq", "429005317111794688"}, - {"evmos1q4uz8p792uhfd4e0f0xcedsl347rlvt0hn0kcq", "33047440064944680960"}, - {"evmos1q4vpxcw8u45rmt5fafhaceg6p57xf2rlkh4a52", "589861891493101568"}, - {"evmos1q4vrf97qeulkl2u5en7946axcfv3g8d9w9l6jv", "42367276130401304576"}, - {"evmos1q4z5er3l664s3jxcwlhgpdc73g53z94pvvrl93", "136187335755205885952"}, - {"evmos1q50w66rvx37sykpw0hzlx69pz2hyytu90vdvt6", "3539815583636776448"}, - {"evmos1q583qaw04gvdhq2hr52p9yfjrht07h44q2k662", "1323945910175189760"}, - {"evmos1q59lqene8zd26nhdupxxa9qljlpmcgsftwjzcr", "2703744089044123648"}, - {"evmos1q5aqxxzkkgagywm3uqevj2c4nxkpeslj8zymn2", "88007273464909168640"}, - {"evmos1q5c06jlmkg48jcrgxu8lumvkx539z3sakh5sqp", "94417420430639218688"}, - {"evmos1q5c48k98wcu9w9lxhwzn03dwppw0h5mty7zsg6", "889592694163374080"}, - {"evmos1q5hs22r3y8zlrn632tagxh4l43j7wgaqzgsd7x", "4095514464918049792"}, - {"evmos1q5hv8slafd92xhl7zezewhj8hnfk97m56esnnc", "3110327023200796672"}, - {"evmos1q5m8rkjkew04c4tfsfzvjh70r3cx5488f9jww8", "1481240452373376256"}, - {"evmos1q5q7a4fvj0ssy959pd7h9fdnmx4t84e5w77fqr", "351260981716286976"}, - {"evmos1q5qtz8jleqgzz8h2x33lgmgrlr4tc54xw0hy56", "447634121024785408"}, - {"evmos1q5r9n57cha0sp3mu4dcygtvxqn83zck89vmflx", "7619700404266205184"}, - {"evmos1q5rmq4hquwdexy0qp6s7wau5yg05uch7yyqztz", "38533939234008989696"}, - {"evmos1q5seqzg2zpxprwls7g47mpztrgqlr3u4ukf862", "5415399293361815552"}, - {"evmos1q5u2844xkkfsaka5ngth03tct96nwg9m9d3wzt", "686085054095472000"}, - {"evmos1q5ugkjjlt5tk7qg40nunmvuern37h5rh34jrqy", "132563484360211202048"}, - {"evmos1q5uq2s3zullmf64ax4jq7zuy8e3agmsq40skf6", "713707466328798720"}, - {"evmos1q5w2dkmsfl8dwnrg7vu2c66p7wy9hhxn6cxe7g", "114212813563049984"}, - {"evmos1q5wg0rwewas9n5kej9gxwuq22kmk50c3nlf373", "57458580704533889024"}, - {"evmos1q5wxrm4xne6fedqkvneyqpd4fdewujwr3m9d8m", "511142902108086272"}, - {"evmos1q5xdf9l93htl33xmmfhpat295argcfjt0wg4dc", "3694726275920257024"}, - {"evmos1q5xldhp6f4l49nu3h4x49wm4j4q3ac6yj6zm0l", "2762069914128580608"}, - {"evmos1q626wrf6rxcxmu70rjdznfr4g0x3vhgzm3mewr", "16367156246407970816"}, - {"evmos1q629srrj9sq7v5f95gqn605r5dsd0ra2gc9u77", "891703827538894848"}, - {"evmos1q630sjat8pewqnv5jklgcsleug5pgydpjznfwn", "1938980871338852608"}, - {"evmos1q63r3rq2k6rce4davkek88r4vsapcl2wf73vym", "3624514872695310336"}, - {"evmos1q65g2lz6vx8sdsu6cjdeuucdxn05a5qxpdpzwa", "337783794602752000"}, - {"evmos1q67dkfce7g4sy7jmhz65l4y7caka4m9jhwua5j", "1089016397052359680"}, - {"evmos1q6as2ru4gxasj7k7zdy6d7rwcfml9c3lh7wlp4", "3082404022626549760"}, - {"evmos1q6dcc392575m5rmn232hnkh7xmdsvtxale3p30", "3790845007305424896"}, - {"evmos1q6e3z8d7j9lnx5y2npu525yl33ps4p4y0mq4h9", "28878995064456458240"}, - {"evmos1q6e665dz3225w9nk27qgvvcdf3fvryvv75yvf9", "56693882623389184"}, - {"evmos1q6ermslmjj8asqxu4k9gqzmql589gqduy675hc", "11688594093830324224"}, - {"evmos1q6jwm8jdd6scrnespk4fzsqg5q7wf9te28ptrc", "1801759128477440"}, - {"evmos1q6mgkye350pq2ykrcu2467xrqn0jspd5zfemkl", "133334496903616872448"}, - {"evmos1q6n6whte53mpyq5es53m5ut7dw755h4dp46d3s", "2526404689598834688"}, - {"evmos1q6n9restmfapj205th8eezqvcy9sy99s3h80rg", "1665553184161419776"}, - {"evmos1q6qvc6jd0aae50pltp8094wlqntfx8pjvs7gvw", "8245410379081822208"}, - {"evmos1q6ruf4364y33aqwyr8d7s6aya6yxmcfll29h6n", "9965364200797057024"}, - {"evmos1q6u39hqgzajspc49kg3ph8j5agl623l3mvg0zs", "2021349463222312960"}, - {"evmos1q6v2cdxpux26fuzznunjusmdyh8t7l3v26g000", "1930845669616003584"}, - {"evmos1q6w74gpthxpaxks08hne6raa27k7w7daxcdkd2", "6716320449192096768"}, - {"evmos1q6wh4nal65tl5xxj7947uh557kllfl3nwk6lhh", "851021230200379392"}, - {"evmos1q6zztsccjxwhxg57he5l5cz3td8nwv435nr44h", "1330924874694008832"}, - {"evmos1q72wsg6lhha0yps6vus6mes3ymvyjwe4dva08w", "17812817578845978624"}, - {"evmos1q74g33c78geqryju0p0uynamnv6v0lvnh72p3j", "1692900731187466240"}, - {"evmos1q74gd6r78urhc4qmyenc4kce6xye42l99t3735", "28913798102865412096"}, - {"evmos1q75sj37p8xsns79cvwnz3mj95ppj6rmqd4fr9c", "5996751874846011392"}, - {"evmos1q75zvpuwet9drs54sp0c5vf2nx95jlffh7yva8", "2737119715209646080"}, - {"evmos1q79fxz50p4qd8qjnp82s0ksddkydx86rzzuwme", "109711672422643712"}, - {"evmos1q7a2mym7lnuevwlnyve23sagazjk9rk5eckcqv", "40562057062747365376"}, - {"evmos1q7c95aqrrkrnah0qkkh42l07j5xeuhk0k5q7re", "3479132713981828096"}, - {"evmos1q7d83drrt6w8xrccxm65anyz4xc0fhmtjsmuuj", "2229773440874283008"}, - {"evmos1q7hxf3gew7xs67jrrwk6the68rcf7cvnhm2w5s", "2001272777435990016"}, - {"evmos1q7jxnqk9yy45llsshg6z93t8xda5cu7t7hf080", "6570929765771915264"}, - {"evmos1q7ldh2v7dz5fk8f7244tejnvwllaejw9pzz6fp", "7255984900058439680"}, - {"evmos1q7n0mgnc2kwe0mdsyzad6t3h9guaply3geya6u", "1536304149741770752"}, - {"evmos1q7ppnvgj3nj52426wyyg5j708lv2kwwrjj50rm", "2175744537447272448"}, - {"evmos1q7q90me9h70gvts9jm0etcnzgue7e6jxrhxg5v", "4708867746733878272"}, - {"evmos1q7ss8x6h9fjp9wyckdufj5mphzrr945lmqztul", "23387776483648077824"}, - {"evmos1q7vtft8h57ffqu27ugmm56hwms4tzzkmcg2a8f", "65354963975953408"}, - {"evmos1q7xjg8d73ryk6qhxnnh8uya7z2ekzgs9p6k26f", "1160245609358644480"}, - {"evmos1q7xt5d2mjre8ykrwrzgluyrypa3zzqppfl68zn", "16365378449737728"}, - {"evmos1q803sgrngvr8x9gs4gr2c7grkdylzyk5pvxrkv", "5860917794896964608"}, - {"evmos1q8c9jttsyg9shsvq95najrpzlaqd6utp736zt6", "1208761949530080768"}, - {"evmos1q8d2k02qhhd9hqf9cjhvhthkachjvth6nf77wa", "12842364206336053248"}, - {"evmos1q8edcszcdmeu0uuzat2ku7u745k3mmfjmed8z6", "1497846924458893312"}, - {"evmos1q8f2plle2y77jxcuclycdfcutysrv9p3gsz6gv", "4668261660047128576"}, - {"evmos1q8ksw8lsczcjxt9w0pq8htl6kgrzvny3u6auq5", "3441002765771398144"}, - {"evmos1q8lmm2mzleqzrf7rgszcxnnl5cq2x080pelu05", "3783186102644162560"}, - {"evmos1q8lp2hgswnemyhwmvqfgpq5mxgetthpggudqs5", "1317903779839066112"}, - {"evmos1q8ltkxmpq4ayw76493d9rmdtn62cugezfn95a8", "150619158290057216"}, - {"evmos1q8m05h8au32pjv7vwyuagj7ffr5g3tqukeywsh", "5093121174832126976"}, - {"evmos1q8neg2rjec6gxp93k66k4ad6rhld43d5dvwqs8", "17545967211561746432"}, - {"evmos1q8nh7ty5jq2s4cxdufxpk9tvk5fy66walhsyuj", "918614801131278720"}, - {"evmos1q8nt9e5t686fqal3wfjw6z3nahfj6c85mmsgga", "404483882100239104"}, - {"evmos1q8suywdrkywdyxsu3emzgg025425l2surkdcx3", "731138033531042816"}, - {"evmos1q8t05grh3zdwxl47wztz2a6xy9pfe265783588", "377525694435997696"}, - {"evmos1q8t0fy5xhmznqz6u82edpcvgl6pt66n4ud09ch", "432194021587602944"}, - {"evmos1q8tx3vj4vulx5u5cy33r5yadr8xkur5cta0p0r", "7097604396407648256"}, - {"evmos1q8usxzmmwgzc3a024e0p5l5z2av5jq098v8z77", "2864004141822214144"}, - {"evmos1q8vdg5d65zexgd7qhrpq26gxwqae9q7k8s8k42", "74140218694865920"}, - {"evmos1q8w6lhmfe28k3pyhj2jjn6v8dm99klrq2kmnw4", "14142362589493504"}, - {"evmos1q8wcd9arf30c7472dap5xt9p6w6ntpduajch3p", "4635010948805713920"}, - {"evmos1q8wqpzjugkt0356nd29smedv3xdfqu958pcprv", "1382083307905867776"}, - {"evmos1q8y25zdgs92yuhpl4nu2a7x003w3nzeaafdvhv", "1109963845620833280"}, - {"evmos1q8ynyurzt3kjllltzqmx6laq2u8pukxj54yz4m", "5288531861526257664"}, - {"evmos1q8zcue49fxrzt45cf50mwtrndty983a65q3uw4", "4771966398840096768"}, - {"evmos1q8ztsegm0wwmrzk39khfjrs9h0sxrutlxasj2u", "811005456861396352"}, - {"evmos1q93vsfhssv6sx3u0qgl3mpj5sr0yv63mdv8a08", "4013770161981417472"}, - {"evmos1q96ptkz6mnt9qnhjq9z8ed8h4xvtregmtl64m5", "1907307242108772608"}, - {"evmos1q97y6qh7knn8whfc7d7f2ed0lzhvxlervsyu7t", "1514987284965728256"}, - {"evmos1q98k8hjujgj7k8xv3xca5k2kysr2w4475yt4ve", "23446336148630732800"}, - {"evmos1q9c3g03ly69zk79j4w7kz9juwxjcwtf3xeqnvd", "42445897463400972288"}, - {"evmos1q9dxwkpkkq52js6jzn3y3urp2l90ycjes4jm24", "217331293540489984"}, - {"evmos1q9m3twd8rk476tw6uzamk6cgjegfeqsju7ngf9", "5951496185862651904"}, - {"evmos1q9s2llm602pyg2dgyq5et5pj88fdgx8638cru0", "148692742130830082048"}, - {"evmos1q9vj2jlel6v9devn5gehx5f4frm75mycuu84kn", "1588578695572845312"}, - {"evmos1q9vr69fwxgj4r8fprv04wmv4nacwl93syvgaz6", "2365108590649642496"}, - {"evmos1q9wvhu7jrcqddaze3yq0fg4x97pdjn5wwuvdwp", "1879964268358478848"}, - {"evmos1q9zgmtl65gtj35gz0fnr2gckt8meuxx86z0awf", "341561928092052736"}, - {"evmos1q9zwm7xahnxkdhw9ejg8tfhze75n0wx78jrhau", "3074915826729520128"}, - {"evmos1qa08kvgc4jexxqcn96tr3ln6a4v4t7v9nsnds2", "408634006979750656"}, - {"evmos1qa30d9lj8fq304p9gtrg8htz0t7fz6a6nk90a3", "440159909812080128"}, - {"evmos1qa3za6uzynu4a6ru8hvw052hm6w8vg22ytwtel", "2453189432206987776"}, - {"evmos1qa88qvguntl3uujezk42znyu3l6grdsmfk4kx8", "132183903022628864"}, - {"evmos1qaddp83ty7l8shyx846kp9ks4670zvgc37teh8", "369891208249614336"}, - {"evmos1qaf2r559v4xs2dw46a06vnl50szq7mwllwd7nw", "970324895607325696"}, - {"evmos1qag5ajpuqkh8gph2kf8d3jj5lsm3q4gzsfyx0l", "701084185295118592"}, - {"evmos1qah2k9cy6nlrjsc0aycejyjc9yffpxy2c6qqsn", "119019819881881042944"}, - {"evmos1qajdcsqv9q8l9dk37pvzj6wqce5zwy6qf9ttp3", "12915102056900534272"}, - {"evmos1qajjg86mhk4kky7p0unq757ns5ale5a5ukzs8c", "769089734969272320"}, - {"evmos1qakr4ptxn8u970qpu25yy7e8tch2gccv2zdlr4", "314164396985177088"}, - {"evmos1qaluuffzv5vejxy5sgdja3s2f0pxeess8x83e5", "45030843340446208"}, - {"evmos1qalw6y4zkflp2s0fr0g0dyc0hzca3fxd49uc2y", "19676825388736507904"}, - {"evmos1qanp4tufk24kelgchqatr3nv2m8r6wx7htff0t", "436748568082365184"}, - {"evmos1qaq3099kdh2905d507ep54kmqq3vd4c4lwda5a", "2099365856241948672"}, - {"evmos1qaryjezgfmx849h2r8ywsrt7ddl062xatgp4af", "1492914451995594752"}, - {"evmos1qastfzfx8f9u6qjpt5a97aj6tcymqksw8sj6cz", "9880857021229592576"}, - {"evmos1qathjaktz6sxa2l6u3kq5fzdrz47yzu4n46n87", "734288314002379776"}, - {"evmos1qav6z0trze4uzwnl00gg0cllc8hpzwmumpjpgv", "3019435067300061184"}, - {"evmos1qavx03rxtukwy5dpv6cfnv7acvyvytyr7upq7g", "154802341112979456"}, - {"evmos1qaycne2yke5ljjqdlq2g9slxgzjcm5lfzg89cd", "1224868001698751488"}, - {"evmos1qc2wqa6k8yzyrjeydjyxj96g0pqwwnmaauekxm", "3370464067225616384"}, - {"evmos1qc2x33ajpqncvy9q6hw67lzpgf2d95suf30px2", "904559858873305600"}, - {"evmos1qc59ypsqps7553pzzyz2e7l8ap9r4qaaghpyx7", "1427276506223460352"}, - {"evmos1qc5dxzx6d2grxelcsj0spd0mysr8wmdm4waxf8", "1078424184569790464"}, - {"evmos1qc99y4t293llhaukk6lq74cq8ul38e9dc6xanx", "12477203793276239872"}, - {"evmos1qc9c4s73ngvvy2qur43fkm6hht7t0jfq56etzr", "57641632595040985088"}, - {"evmos1qc9v9k6ynyaa4607p8r0t7wszjd6qmtwthet2j", "527037792160075776"}, - {"evmos1qca67h4gfzn0enfuaschnxc3kw3fda5w384uxs", "60865626650158571520"}, - {"evmos1qcfxmhe38c6n3g0x5uj9w9nyfhcnjtz0v6x8y5", "99531895932234752"}, - {"evmos1qclaym2t82ghs657wn0zgxd2nc4dz0ccausuar", "3901095167815780864"}, - {"evmos1qcp4gt0scd7a7e6cjlcjah8qsmr3kzt3lusayj", "6861675921482579968"}, - {"evmos1qcpgfc9qye3n7njmp7pjd92994c6nwwue5acfx", "6430392414951278592"}, - {"evmos1qcpq2wn4f6xtg2flx8sw4qfuuuusmcjfmyerru", "1642795883831695360"}, - {"evmos1qcr9ame8j3m8l7fagvp97km32ul2ga5dgelks0", "9026886637068877824"}, - {"evmos1qcsytacxqnlrxyl4q3qu62x39x826vp35w77u2", "2196942058972264448"}, - {"evmos1qct3d2z6hf0rwcnwfgkrxktdtxpr6v9czu80mq", "5706015703631806464"}, - {"evmos1qctr3c7xvkx72tnavjpfyetxakx70msr29scaa", "5228621112562141184"}, - {"evmos1qcu8m83wj72gql2c38wjks29czlge7mmvj68a5", "5160581234591563776"}, - {"evmos1qculp3f4wgwdrv55lj7sagmjftfvptk225e8ls", "1773688623638041088"}, - {"evmos1qcv4huuq9049ac2n8sly7q89lgje03c5mqq8gd", "8302017625864574976"}, - {"evmos1qcw4ek9sjzhj2cakc7y9p76nth94a0x7np9w4h", "23972555803462148096"}, - {"evmos1qcxfcfv3xnswt4p5mda7rzs7nqjgqe0vfp9cy7", "1428969574838240256"}, - {"evmos1qcyljm6khm56hhs6e9ep59pedgkm5cj9gmlm67", "574985493626851328"}, - {"evmos1qcztnuccyqu37vy0jd770a5nmvgzz8m2e9gfx8", "12597449121041498112"}, - {"evmos1qczxe07uh2ueu8np2d90eahv3xp828mrh3pm25", "6762858010647003136"}, - {"evmos1qd08exf75298snne6369rrp64m28y5rctw6gdz", "1452969042952003584"}, - {"evmos1qd6my53yy5qed83gelgy4rhh4wcr5zrvw8lukx", "65620808488903942144"}, - {"evmos1qd75vt03uyxkcjsuv2d7hmvf6j7p28nt3rfps2", "475877634739005440"}, - {"evmos1qd7qdpj30j8rgzlsj450e8dy9gnhypdk03ncrx", "31379782125922537472"}, - {"evmos1qd9s5khe8qlvmf2asvnzszk0svlastqrtpu3ye", "83935805895651033088"}, - {"evmos1qdcmh09m45pvujppr0whvv5jk7kzjyjwte7pxy", "17095239969094819840"}, - {"evmos1qdd4nzdn6kkflpppvycxtn6aljvrtmm0vlr7k3", "973412968742049792"}, - {"evmos1qdgzuwtjgjktxesavkcqut4m5fpzul0n0dt63a", "2651044130812823552"}, - {"evmos1qdhlf7qj7wa69psf480yacv2dadjxshr2mugx7", "17026542178981232640"}, - {"evmos1qdj08aq4yfz2dq7362zrunlaj25rv3l3l2wgms", "7825801621553303552"}, - {"evmos1qdxe5wlg07m373cf73l30zfuust6pq6h67hl7z", "608064805112872960"}, - {"evmos1qdxrzz3wgdx8cvxg6f2wl6scjnjquypp2p7hhw", "5827746320005307392"}, - {"evmos1qdydkp35f3kxpcqjgqz0yn6xguyetsc7pcagsp", "9711638358212599808"}, - {"evmos1qe0av7w349d8xdml32hxpgwzdwy767fel6ulkf", "2362227944533061632"}, - {"evmos1qe343mzj9ktw87653gnyda7azm6ssvadgq67f7", "6766703115963039744"}, - {"evmos1qe535g4nrvy83wrevsjj0lt75quqvev4zv789p", "1991597158978551808"}, - {"evmos1qe6ympq93p8egjwatj9zyy4v9shc6q8ktj02dk", "675074831420529664"}, - {"evmos1qe6yyum69ne3ph0sazrm9f89qp6z7762x7e7sl", "3295602001737220096"}, - {"evmos1qe7gh2gzu92fay0nnzzt7axxtn7pec2atnks9q", "2928196142749489664"}, - {"evmos1qeehpxnsy8t5csz0rh53er3lp0gfr3u36v46dw", "15597767327772065792"}, - {"evmos1qejuyn336ezhje6yvqts8u2an69595kxv24m4m", "288625103704116224"}, - {"evmos1qen0ydcvd4aqc3kg9tary6lh7pujcq2tqmlh37", "126745887030725632"}, - {"evmos1qeswj0d8jtvsp009fjspcjje4wsf6879fpx6rn", "427607944968204544"}, - {"evmos1qeuf76m4rvrk43qyhjpv90grxm735y36yzyx2s", "2114941013533587456"}, - {"evmos1qeul2j6ycrwqx7ued0lh935xy42vt90l49njwq", "277334511026780160"}, - {"evmos1qevy6xudatgtgqkt53pch79aa8tlvk0t3q6erw", "470960006537059840"}, - {"evmos1qey3tfxa2nateftp80nq9k9eqn9vy4sslt2tsq", "56821307559160496128"}, - {"evmos1qezj58fmkknrhpj2wf3kgz6mzkqhsk6xudnzs3", "31039682585944801280"}, - {"evmos1qf5ewwyk9tdgl42m6ljwg7dte85ysgz6y3as5w", "2947342922417932288"}, - {"evmos1qf7jep4saqygmy7q6wpsa85x9p0jzaat7ra9w8", "8874415342711504896"}, - {"evmos1qf8pzejwwahlz83ftef4exprxuc220aepu07nj", "430517469113575168"}, - {"evmos1qff4lqv9fde35xz6wefgdaced3kzkcayrwx349", "35423269866113282048"}, - {"evmos1qfgd3wc5pyn03hwzt8ynsllrfnsv33taz74m4f", "2841743117733189632"}, - {"evmos1qfh532970rvxx2tnrnychsjyslp3cf3q54gk9f", "9828105018392190976"}, - {"evmos1qfhmk7eue37kdpm8lxm0vhfrgmv9f8mwtazzll", "17034581927424770048"}, - {"evmos1qfl22e9ek0gvwxmz5gqm94ygky6gkf607f4np2", "472940493954040832"}, - {"evmos1qfna7pyyah92n6t8spn298dj0lkvfqdmg83q9q", "50296908274733056"}, - {"evmos1qfrzud4ajpjjn0fcvpycjrrhu94hm2t29n9t82", "2343619961748992000"}, - {"evmos1qfve3n5l2e27mwettaq05ze7le7x7xuua99zus", "10833644510003509248"}, - {"evmos1qfzc4aawksydqh9ej87n2u84ye5vp5uq5kzh67", "1897136446994056192"}, - {"evmos1qg2g5eztl3fgglguk8e69kyq5gnv4xm7sjyffk", "19117753751007522816"}, - {"evmos1qg349fchuxyja0gd9hw2azxeuuv6fw95anm229", "816932893048598528"}, - {"evmos1qg3g0p9e8z6yv00g84nthlx7yf5z26we0ced33", "2654859610298564608"}, - {"evmos1qg4qnaxtsek56uy98j0c65xwx0cl5rdhu7w82e", "536688533212830720"}, - {"evmos1qg58vtqme9j73czclm4m57rrj5n5n2ykmxex3u", "30436981087383808"}, - {"evmos1qg5hwaz4x9ahyvmq05s5cvkk5y8sa5f7dfv2uy", "411374987467961088"}, - {"evmos1qg78sqzul2dw7l4kfaalyku9ur9y7yz8rs79wl", "4875060473923571712"}, - {"evmos1qg79kfwe5gnwp0lvdsht6jj0lh9mr4w6vnmga4", "856566939910777856"}, - {"evmos1qg87g4wkr5s0ral2h8plj4q282u2x4yzxvzmy4", "771581590362859008"}, - {"evmos1qg8unpwettkju34lqe84lng925hljktnrrazlq", "4308118903670205952"}, - {"evmos1qgeg29e32ynrdeprekwxxxxram3zfjd635cf4x", "1105420168394333952"}, - {"evmos1qgexh96u5qwnua0uhhq7rsz6lzerweassqfzj3", "11343127791029837824"}, - {"evmos1qggcs5x7cu0xsdry24ms5k5zpka63vtsyf4fk2", "78617261609380921344"}, - {"evmos1qgh6xdjtp5pwm6l7xlazv4z762umemxcam7ueh", "954002862626871296"}, - {"evmos1qgja3a5meda3m89reckzeldfhdzpw587rruh3d", "5458137391863956480"}, - {"evmos1qgtafqy4zk3e8zv2jr6qpwynr9kg9fqsra4wuh", "3380671914030941184"}, - {"evmos1qgvast0gfl9s38yu3x6pm4u44lv96955c5vx46", "4078940460426510336"}, - {"evmos1qgvvvmjghj9ea3u7fr6xlsljh42m3hm3l7gejd", "748154119356207104"}, - {"evmos1qh6velnhg74qsw2574xxcelf8zpvvs5vlfxqw5", "11242975935225841664"}, - {"evmos1qh6yrywlxzuf0tpzplhevv8fg7dy7mt6agqdkt", "721572709104803840"}, - {"evmos1qh8kpdjhzql0e4p0wkj7zz3f4yhps86tg5wfyu", "6216670768194745344"}, - {"evmos1qh9lk35g75mqr4g4vfxxuewlp7uv54mfq87y3s", "723063092036199424"}, - {"evmos1qhazu8zleyn5chrkxymewx3xw5guq2vmhw3j7j", "2528812745190383616"}, - {"evmos1qhde6nkcmm76j2npjux7dckq9ud7l0yftjmntk", "2362491467837608448"}, - {"evmos1qhlmpyqetgya24fgda0qzz28tegdny6sfkcwd2", "384368976819079936"}, - {"evmos1qhmeqjykpma3x5redphnhd0ckjw99v95ms8ds6", "473224042715033600"}, - {"evmos1qhnf9dd0kwlc5cukdkqqy799s796xl6rl9dr9q", "849682486969674880"}, - {"evmos1qhntcpp92kyrha4aunslddy29f4mfpzqv2u50p", "1449804119171014656"}, - {"evmos1qhq666r9ldqdqa26d3zullsqr02d4pnstetza2", "1223604209609435648"}, - {"evmos1qhrdaj49c937lqynujyj46juf68m4r4q9vl3g5", "1375391231827820544"}, - {"evmos1qhrm32dg2nhevzkpyreapdfwwztcahlgajrx2k", "1093597813661175808"}, - {"evmos1qhsequv7jytj30etpzmy9m4tj9nq93swvtu2ks", "210017056626271232"}, - {"evmos1qhwk97cktz6uu86qdutxvur3zs3ygfxfxk4ak6", "9861548007408054272"}, - {"evmos1qhx54xjye3m0qauuqxych06kjla9t0mcust3r5", "16437364119514763264"}, - {"evmos1qhxeenng953dx3ak4zsgk8c0kauhaw6rqum20t", "47253305792457146368"}, - {"evmos1qhy3964azhv6zjtkcsyktc2stgyfxk7x3v9kk5", "1440913375015472896"}, - {"evmos1qhzyr4xgezrx2mnmxtq8hgafunl3t8xma7ax00", "9564498600439420928"}, - {"evmos1qj0849smjnjrxd5kpqtn0wym0evjttfv75rm8s", "5389138915393486848"}, - {"evmos1qj3xfzy5hdwgruuama6ga64jt872gym7wdsscu", "930005371412733952"}, - {"evmos1qj6hjqlkpz0qzl943ne3qe59c3k22tulsz2xp4", "1589825804517555712"}, - {"evmos1qj78uduxl2wrkrd8tgpn72q3phx2232hsm5x4j", "59260705180407693312"}, - {"evmos1qj7cma3uvhmkd9v3z3xexu2ffgs6h08u0rw86d", "324856877979765248"}, - {"evmos1qj86s8gqch00cnkdyyz3n5wutnv2l4498a6qej", "117828217444674560"}, - {"evmos1qj8p5gswx52agu9hk2ytat6l682yq5t24mtxsn", "5307986075207103488"}, - {"evmos1qj9m4f7r8xflzhp88lepnsw7aj4gpxywrp3z3y", "385605521325644800"}, - {"evmos1qjac4mdxdnj30eckfxxuf2jg3hlc45r2hfh378", "1423918057917145088"}, - {"evmos1qjajydgn4almcagvxwwqwerlq6wlmwlc4ggvvn", "334645781293359104"}, - {"evmos1qjam06scafts4eragjyej9j9unjfh0ehdgrwmq", "19582464841239740416"}, - {"evmos1qjdyndrz2kn323q5x0u73cuc2cwtgzxhh3gv9q", "411820999790696448"}, - {"evmos1qjhv7szxk84vqnlq54vue8gsa5t7v59hc2m9u8", "8197322038516013056"}, - {"evmos1qjkf7qccs0x02keejr0ygh2l2c0rvpatkg2gd5", "1291518516343760640"}, - {"evmos1qjm4fxc04sy8rmefn0wj9rpaqnaajhcfy44pnx", "225421180487245824"}, - {"evmos1qjmah5t6s97j967ekddf5ggd3eh9nf7w9p3glu", "6505848657744807936"}, - {"evmos1qjpw5xm2pencu787wgmpv2rl8878xwj9k38mrc", "3554998526907476992"}, - {"evmos1qjvltnxycsnz6jk9xc0y86076tge74t9nxq0qp", "65548879246877952"}, - {"evmos1qjws4hqkuehccqnwvv2fgv4v7788gx6fxk5w6j", "395912669510003712"}, - {"evmos1qjxwnye8nuvy8gzlue999nxp7slyka6c707d6j", "2192539908420788224"}, - {"evmos1qjze6lkg2u0q6pghpd4mpsguh9u4ja6c3tmxrx", "3813032674041076736"}, - {"evmos1qk0ww3rwhk43rtn594z3rh4fx03kyv4ktudct9", "1666385840708959488"}, - {"evmos1qk37suth734t8wtwxzg89y96xamt44u76xdaee", "1455313898671808512"}, - {"evmos1qk3tjt9xf7xcpl79t9jq9xn2f9h45uxu803rpa", "17399739750330804224"}, - {"evmos1qk4clarjdhanm9jaeasxu4ctwdxkvf2dxl32wh", "6915745585313464320"}, - {"evmos1qk526urz4e9ugsqnt04vp54tnwc7mmclt7twp6", "2676758269478780928"}, - {"evmos1qk5m0ehcu2xvhjusnz0vr32zv8p8a3ufw7fwzk", "1890358583464071168"}, - {"evmos1qk5uvm37hn5yfqqdklc7tjdn3yj5r76vuxtsha", "384826259944715520"}, - {"evmos1qk62kw5r59uh6ulyerj8w5cpnedqfrf9dc5w0g", "1419821547128105472"}, - {"evmos1qk7n8fyvk9dw8krtt66adrzpzq6apcpqcpnfcw", "470960006537059840"}, - {"evmos1qkea9jxua7kfejskq9mes9ctuemgg575zctdg9", "1589909434603225088"}, - {"evmos1qkf7wns5pz4xepfdwfhzdg5nk8clu8ujr4376f", "2398964795533393920"}, - {"evmos1qkg3wvl7h04slezwznxhfd4we6af35y3ye43pa", "3687918546731745280"}, - {"evmos1qkgyyjx6h408ge2d3cv8cgcfr9gysrf53ua2dz", "225756192397248512"}, - {"evmos1qkgzmt63nvtmcekncfdl8kn08mj9ux69lvg3ee", "929956883545587968"}, - {"evmos1qkkyq2w9fftz9dh0gy2rpr8ua4spnz4rvzk49f", "2790879135286300672"}, - {"evmos1qkkz3tdxjrl3ze0evemrjvqgf5x5fdlqzcjsrs", "97818891618937088"}, - {"evmos1qkn7ecmexcy9gl35r653h0g5xnlwdm4hd996ns", "93649867813687296"}, - {"evmos1qkp0dl0ew45j8wvuv49lgf0y4h7wwx3l2j4ssu", "3398992681230925824"}, - {"evmos1qkrps59akp2tje7fgpwymzaw7tsyw3e64yvykf", "51980139436085504"}, - {"evmos1qks8pmw9jhmtgp7p7j3q28genw74cpww9gv5jc", "1008315378053062144"}, - {"evmos1qks9tmn0ewh7peh22u299ur9pepcq0zn09yty9", "26742167030804480"}, - {"evmos1qksl7z3jhsjzvk7t89ye6rzanfktyqgu9hmcjt", "19678417205855891456"}, - {"evmos1qkt69qj5ceau0g7fvrlze6aupqmcrj0njhfklu", "783193706571411456"}, - {"evmos1qkxkv4pjsmldlw8hd7ramzehr95vn0yctvp8u7", "744306400206158336"}, - {"evmos1qky8ww70uzl95g874pfe782u87072dx2crt6l7", "2949635313418506240"}, - {"evmos1qkystcn8c8pdnga29avf7upgsrkt2hulcne42g", "27285087775883264"}, - {"evmos1qkyvk25vnu6v4fu26zf6cyc3kqnf6xt57un77j", "2674183317871362048"}, - {"evmos1qkzfsx3hd4mq4rsdxfvtmpmzr6u8tngmx8kut7", "3284421174466971136"}, - {"evmos1ql09kcur7xp7hg40x6eupy9ls393wr5cmmw2we", "5043501652680203264"}, - {"evmos1ql43zqxhk5c9dcj3uz0nl8nfegmy3enmws6zzs", "802801186983346176"}, - {"evmos1qlcfqyac79rhhc839pwl28td7j00a2p6g6hxw6", "31955143124975185920"}, - {"evmos1qld09wuj0ete7zpuq5flw02anfkwr2w3zckc8s", "18259646235571384320"}, - {"evmos1qlgy098c2ryea3pwmkmdgs378tx3vfp7xm84p8", "1976890005110112256"}, - {"evmos1qlh6lj26p7e35cskxqqcydg8ztx34ven3y4zc4", "15147453510678237184"}, - {"evmos1qljvxq6wepf6serf2zswtfn8yyz2dl3ne8e9gy", "71695493537360363520"}, - {"evmos1qlkmdcpagkqsu6gtay0jp59pja0pquaakfhfl6", "999611850085315584"}, - {"evmos1qlknar3uussg06p9qywrzmsh7qz3ejvrns4pxx", "1362693372251387904"}, - {"evmos1qlkwgk35ga4q8h2gg5nss6c624new5zc40l4s4", "24627396129097805824"}, - {"evmos1qllngcmzqcrwwjplqaxyflp9cv3c80re54lgts", "1928456683231248384"}, - {"evmos1qlp27atc3q2t5ljjyke0tj23a5tpedvfsjzs0t", "463204320558989312"}, - {"evmos1qlp78f0xq2ldzxjwhz0ystm8qkf8ml5watpltv", "5674690542095924224"}, - {"evmos1qlqcyjn6hwnclp250g5w7jlr2z2teuaqtver40", "1191375606550322176"}, - {"evmos1qlvvdjk7spuwfaptdus592ed9n0ynwkcmha7a6", "1899098916608074752"}, - {"evmos1qm255u2kfduzh9gtd4swkhwuwev9cawgu0dm7t", "1768196607690737152"}, - {"evmos1qm2t39r455c3r6ynnvdw3tm7zjqy55vx8vayr3", "490714945983973376"}, - {"evmos1qm3khstgm9eemt0gsn27huga8jvrm4z2aysamu", "4846217885879943168"}, - {"evmos1qm7aulvh827nvq7c8p6zyvsptxh9rf7fsvxh93", "23886220017599680512"}, - {"evmos1qme07nkrq5d3w7xqycx39cr3cj35fdazz2wtg6", "1867826458801258496"}, - {"evmos1qmewnn5y6hngvs5dxcwerdphm3vf55trel33v8", "928680681750429184"}, - {"evmos1qmkseexpppkkhz8k46sa8k2h3xgv7jwn40rm4a", "119396737358588624896"}, - {"evmos1qmlstjvgu92jrc3kr9wvkkx6j9l6venm07qylv", "4943507627846987776"}, - {"evmos1qmmehz0f954l35vul4j8tejkj7je2mefhfqscw", "6456143425633382400"}, - {"evmos1qmnm8465mfrcwtfme6smrr26v0ct49pakqkmgl", "1428056483417669632"}, - {"evmos1qmt3ul4r5k629urkpgrdpvun52d54nn7p84kfn", "883597568460767616"}, - {"evmos1qmtfzchsqmqh5d5l7nskw3qfklt79a4mq620cp", "2845669075558069248"}, - {"evmos1qmtkpelh2wps5x22tg3e9kht5kdr4x6kywf07e", "887461798000484352"}, - {"evmos1qmuflf8jj0azdahgz703sfcfct0c4tueslgzaf", "3701978860166959104"}, - {"evmos1qmurg2q69xm2kvy0t9lea2m5zpzx83g5c9vc89", "367130506059331072"}, - {"evmos1qmwll6fzf7pm5dsg94557m5uplvhv8tknx4fjp", "124731601562473168896"}, - {"evmos1qmwq0396ankee48jkafq8ze5ydzuqxdnxuegjc", "2460636939427584"}, - {"evmos1qmy0dcewv0m9zk5fsvu5r6fl88scth8kyxf6ck", "19537070638722433024"}, - {"evmos1qn2eyurq2yzls89jhr0jyrpe929ay4lqlnwmeg", "13902062215687180288"}, - {"evmos1qn68paz6wgsvvq8x77w4vudtuuyhgz28xes5f4", "76809388607534727168"}, - {"evmos1qn6vkdjw36wkgefekwkn6mvznkkra2cf2mhygk", "3909942284449720320"}, - {"evmos1qn7keq2p9d8zzn9n3vt2gsvp2yp64y2un4tule", "892273200820549632"}, - {"evmos1qn8sr2hzmktlecusdtxj9hwj0upnm0jf2h4wev", "1258683713844379648"}, - {"evmos1qncqf6eyx85008lqcecusplvkt6ucu0lr9gzzf", "1630147436880665600"}, - {"evmos1qnh5t3xhl5w73qe2w8c3rukl45y3hjea2x55mq", "3612293346837422080"}, - {"evmos1qnhzy45tf2allpaxsfauf7qphqwej9rtjkqn7n", "61523569130215669760"}, - {"evmos1qnndee3qckgp56glqq72vnaqsyllkqjewydndr", "169355529121565440"}, - {"evmos1qnrmdg3c6em6y4hl7uaf8eh5xukdpxff5fzjwq", "19806215334684950528"}, - {"evmos1qnsasnfa2vqd8gzfcsf7y2ra3czfy50z0estdh", "5776743524084412416"}, - {"evmos1qnspw3zu42p9u53l6eaywc3qtn7lczu63a26lx", "6218891754155907072"}, - {"evmos1qntwzmn88hjtp2uzuveg49lv3swf7vzmw4g7nr", "4757470623469668352"}, - {"evmos1qnujwwnpjgwjshj7gyc3l4vfe42yq4mzls6huc", "16256755139354624"}, - {"evmos1qnuwayhys7kq8789hlhar0acanhqt820vdf9yy", "1210643308866959104"}, - {"evmos1qnvckmcusk4gmjdqe3quxplyqyfdmgd0kndshr", "4810313659080973312"}, - {"evmos1qnx4qw5cezqjf9ulw03pnvkyvsfznq08jq2dq0", "3973792849039153152"}, - {"evmos1qnzmysj0r7fq2xzrdu8r5se5v0zq8yhve42ng9", "2638720356304310272"}, - {"evmos1qp28u945au54jd8zc574pd6va30egcmnud4znu", "472079072858103552"}, - {"evmos1qp30ww7kzzjgggdpdse5xy3egjwpel033rrm45", "2401660406876979200"}, - {"evmos1qp4g5jtg385eswjj2me5kcywa9tfhgce84ex3q", "12420551787616960512"}, - {"evmos1qp4gwcvga9uya7c6gq0me4zy26r43dduwpfqth", "64020518281210368"}, - {"evmos1qp7ma5d55yjugh0c3ull5dg07uxffhvlys60d6", "99351313069365248"}, - {"evmos1qp8rlesd5hqezslrpzwvchf2pahttaxe3wm6sm", "46504109335602061312"}, - {"evmos1qpc2w4rteq5cg2wl07wk9q2e45xutg0qz447x4", "3304399780226465792"}, - {"evmos1qpd2e6tm5qfatqwmae0ys0m99teep6rphf4fgm", "4592623352519272960"}, - {"evmos1qpg2sspsmk3cly5l30uf8ceuphtuksxctqz8j6", "1376055010972076288"}, - {"evmos1qpgjy4wgyrd62u4vam4jmtep29pw48j6pjlck9", "3575928837342651392"}, - {"evmos1qpgpte5yxyscz78whp0nul834ggrw500fhxy3r", "24838987348849819648"}, - {"evmos1qphlnqmsr6cr4a08755dl87z9akjtfpk8rh4ch", "276145570786365440"}, - {"evmos1qpk80e5d9n59md2fhtphddx89qarxfz86nu46l", "384573681614437120"}, - {"evmos1qpkej6hweuhxqmak96q7pfmlq8u96eujel32ce", "7240822180823889920"}, - {"evmos1qpm5s8qu4jgu3cf5u6wlp42w6t0rvyn6kmnw45", "7314544060085469184"}, - {"evmos1qpqztm70jwl0jv863fhdeq2eas38y3m5acftaf", "1054541455894858240"}, - {"evmos1qpy9da9snggawfjf7n6yj9jrecrqu6s5vktnfx", "400051945187496192"}, - {"evmos1qpyqwfcz0cr6h6zuus7mf5n6fzkpaxrhdk08pe", "4407949893281168896"}, - {"evmos1qpys09yvhvnvyh68ecsunfa2rpajqsv0f9s6zu", "14884732743959115776"}, - {"evmos1qq0n990tu9tyhe8tm8e4t4ac8ncra63vfdv3jq", "605777271105552384"}, - {"evmos1qq39qkjkry8qzvmvfzjgqs30ldxmmulm66ml4d", "9784614478515138560"}, - {"evmos1qq3anll867fcjhza5kpn64k8x7pjatft6dye62", "1198401397012561920"}, - {"evmos1qq6d4uhxtah0s27xlzfah07hcge2pevu5a6px3", "1777864547893706752"}, - {"evmos1qq9r4x9x2gvdmxwvcd8mszssngl6t6pyn2cxp8", "916356156396893696"}, - {"evmos1qq9raq6l37ccmq34wqkenfsury4hvvc8dfsjtw", "885377847791194112"}, - {"evmos1qq9uv8g29hlwry6x44x3ln3050qfncxt4qlanv", "386936761880681216"}, - {"evmos1qqa8u7p6kea79xv0796ured2ss3z8xssfdd3tq", "6637535415115325440"}, - {"evmos1qqa9ed2mve98u2lrlqxj2x2ep37jsldwznj0wu", "5503946906658420736"}, - {"evmos1qqc5ran82xt4c0ukcfvnks52hqxvlxrqn79ysu", "2961510779793781760"}, - {"evmos1qqd5m8w5m9dsyxjsexwsnh5hepap5zwqccr687", "34699102000908746752"}, - {"evmos1qqd72j06xam3pw09n4tmhh6e8ns7x7w2scpuxx", "5325625035003260928"}, - {"evmos1qqetqucejje5g0km3g8czu6wj6j069e9ajqzgs", "1171547477943480320"}, - {"evmos1qqghpq7560xxj5gpwvgzdcx7xd0ern56ndxnuy", "4863431543765991424"}, - {"evmos1qqjllgalczgpazzl4ls7l06sk9sjtzn69qyqkk", "893575070048832512"}, - {"evmos1qqjzusu6ef9le8xh5v5rq667s9hrvm969x55jk", "113885275053491863552"}, - {"evmos1qqnfzsssyc5ztn4vzgnev02djq75mklq6env5d", "456624655156055040"}, - {"evmos1qqqqpljn92ppr94yvepq3tnmv9gnkfp70p2ntq", "522047751354779648"}, - {"evmos1qqqqpzj096vjfaxf0z66x93elkyweukdepya38", "7148499206784997376"}, - {"evmos1qqqqqpmkedq3anvzjl08t486mwx0wt6klrqf6p", "14360902047625406464"}, - {"evmos1qqqqqqqq3s0d8d52az7hua89jk73rvrxk9cwc7", "29998489326300581888"}, - {"evmos1qqqqqrqpj90z2wnlzqtujavp9mw4arkvm0aq52", "35854356139207659520"}, - {"evmos1qqrwds8ywpu5lqnptlj73mzkh8s2vtk4r500xw", "836862134774153216"}, - {"evmos1qquv3k6df8p24p6ccskdwv55kaaf9hzhthmrjj", "3208039132329805824"}, - {"evmos1qqy33k7kcpnkuuf4rma60nwpg03q6wuu7mpms7", "5136594720159039488"}, - {"evmos1qqz9exzz0a9qchuga5af36jwrxh4699g0zmwcl", "1225890739901425408"}, - {"evmos1qr8jj8r38usykxkq87r23m2azxktf7m6s3ks60", "5251397659906662400"}, - {"evmos1qr9g38f7urfenrsy7t4e9dy58w2d8tk4hyj5hd", "384498519150480128"}, - {"evmos1qr9y0kcmaykpquhfw07cm39qstmawqs5d4rgmu", "8653842830034977792"}, - {"evmos1qrazx9tky0zvx4pnwgq2as0d439rwnu46d9whg", "2159754360386367488"}, - {"evmos1qrcghlh04nwmuzkpkd5477z9jzf63d7y2e0f5j", "3101044589667767808"}, - {"evmos1qre69lzqcss6xgxjxhns2saqvcsw2z65kp4vqk", "883902940860290304"}, - {"evmos1qrf4lzp7a6g4mykju57z3zrapvs6lmhj2mfl8m", "84047932260760320"}, - {"evmos1qrjh20j73fwp7wlyqwfyj4zxgald43euhsmeaa", "1135950622530467840"}, - {"evmos1qrn2a650r8hj22k2y2yfluyjemsx8gw4vyumhk", "1232775125753765888"}, - {"evmos1qrnuc845n8t58m3xe6fhyjvwld5vdm2vyqn33r", "250246202590401536"}, - {"evmos1qrpf49405c4effngtsxgr0ypjlazyqdxvftkx9", "21173315341414334464"}, - {"evmos1qrpvmlgvea5evvkc0wk9sqhfzdhenz0zc0y6y6", "12175866370799044608"}, - {"evmos1qrtqym4a8jkck3jysfj5t8sshmdgyjftqgszds", "6239612465929882624"}, - {"evmos1qrugx273776lz4v0tju0yt6f5ye4na5936qu9v", "1772126611736678400"}, - {"evmos1qruj3f4dclp5tmu3nlj6303ytpvqa70kk7xa9u", "82233171030868000768"}, - {"evmos1qrv83lkh90l3mmekknah4gx497ez2gdnhferxt", "2741318141028435968"}, - {"evmos1qrxrr70kwltdwwq2myv39ckayjy4rkh7lyvad0", "52474334941336068096"}, - {"evmos1qryat3ndgp3ecxlxl7jllw3gxv83sryc5cehtf", "1319786219547803648"}, - {"evmos1qrznch59d85r5smcjvdd43qegp3u9kxz4pgcd6", "52511308665246810112"}, - {"evmos1qs2dpga42ppw6l0q0l2s8g834y664ez78fcmnc", "10595005808316049408"}, - {"evmos1qs2kl869pwzlkeqv5tjrr9e5haepl2ejxdh3m8", "1344867929577072640"}, - {"evmos1qs4kd25n8mut89dv9em5nz7xzg23g6sztjxfwk", "385031422551785728"}, - {"evmos1qs4l0kz9kd8y5v5x603ke2g076f03a2cz224j2", "387563616866014976"}, - {"evmos1qs8veveznm98ctgqcadrggz6h52y4z5cat9f84", "545059829643559424"}, - {"evmos1qsa4tmptazr02nk4dyy2rdf7dadjf6fv5rerjp", "501638014806552576"}, - {"evmos1qsc5qk8g9tt4vpnylrx86yhzul4rhfqyrafhs8", "1476356570663542784"}, - {"evmos1qsenk8acfpdwnfdzlt7g9fk68htkfhdqx6xcz9", "2920387422880813056"}, - {"evmos1qsf4t4s27xzp7tgyrm83t6tjl58zl5gets664a", "2202028579830128640"}, - {"evmos1qsffts4zj36qusfpg6geht2vfuwaynnq5vsa4p", "2822889467909730304"}, - {"evmos1qsg3wxy8qrpnyzwf0fuq6nhq5ywzwvffmdcge8", "8108517422694582272"}, - {"evmos1qsghxxlrkl96gz0dusm5w2m4qpp48kq6nmgqeu", "479592012448415744"}, - {"evmos1qsh0sr9awc7wflawsged3ec8e7rq2468yrkgk6", "1008929334723157504"}, - {"evmos1qshpvzu5405v97y0yw50zm7r9java52yxgzr6k", "1637785304547631104"}, - {"evmos1qsjr57puxhp228e85g4s4k95nykg86yaqj42m2", "65861536792053563392"}, - {"evmos1qskkpe7us36kmyl65gdrp25dalcnlwhfdlk8u4", "464735103471879168"}, - {"evmos1qsl7m6pccdhvy3qs8mf6ysdx0qz8fqfztd3h8x", "2165919320967069184"}, - {"evmos1qslsxu09nmnrlaluuvjn9yqsknms6uky2a3tmn", "3238666880007438336"}, - {"evmos1qsncjkcxwrw5esrtfddh80jay4n3juvl4gj8cu", "102085281386418307072"}, - {"evmos1qspm648r5jne6y8kzytf3wyhkn0gy5ykvlh9e9", "25806526785725349888"}, - {"evmos1qspws60ypdxp4mhh9e5llaw06gv88yfuhuz0a5", "1017937627763303424"}, - {"evmos1qsr59xqhkv6p9a6rkvm7zfz3lzef77q4nqtxzz", "181658066024961536"}, - {"evmos1qsrsk4jh0cgh0rwrs38jhtgw47vdpymcw2vk3k", "435749778893209600"}, - {"evmos1qssvq4l9vxh5q947rwl8vk9m39evc47hscug5x", "2070984067844107264"}, - {"evmos1qsteymq4qnch3yk07wcdplhd4zw8z87wcklesv", "593576717594910720"}, - {"evmos1qsu6lm6a9sm4vaqplh47dvpjzayvr0pe988lrm", "482966039916109824"}, - {"evmos1qsu6xdr4g6xf3e89k6xu3e67c4ax9fwez0xfse", "195418246773857280"}, - {"evmos1qsuz38vkytep028yerydc4pw7h7y45l70t6642", "1421286328949293056"}, - {"evmos1qswuyu5zggu67s6jnt7fp6a8wvmstvtpynczzl", "15390623824306634752"}, - {"evmos1qsylrek2cd405qat2lp9ewcrxn80078yrxxc58", "297970924746669056"}, - {"evmos1qszj3ehtmj7xudlrc7p4phs2txhdee3zdpn5tx", "1642085830061516800"}, - {"evmos1qszqakcfz7f35v09lr6hv3wx4cyjw2450dt2rq", "603536661898743296"}, - {"evmos1qt3wq2t28jhwjf9eqzmf77e7h5t898kv05jp07", "31392849363300608"}, - {"evmos1qt42uy7u2476s2hk8lw5rm4ttek0dcqakj5548", "4806881390926866432"}, - {"evmos1qta3d9qkelrrhtjcg6gdhdj0f6wc6rzjydyy7u", "10831379047317471232"}, - {"evmos1qtcc9repklkzwnweuk7phqe4f4fzt0hkc0xtxd", "1032251636965054976"}, - {"evmos1qtdr7c200d3rtkjhdg554xt6f9xrcwpggtgdwp", "12310023149082677248"}, - {"evmos1qtewacg9khe04jsagw5r0yz8gfk2ea2exjmnsm", "2406495312234876928"}, - {"evmos1qtfvgtptsnh7wtqcl0jph5jhwrlw78cv8gzhq4", "3477537788473196544"}, - {"evmos1qtm7enh7edljjz7xd4f0l2fujdrf5vt6hepan6", "2991095582189599744"}, - {"evmos1qtq3dsq3vdv5c7wujah2lwcuutqeueetcnl2xy", "384444478523955712"}, - {"evmos1qtu2cs5vj8uuwlanrew9jsgmyetza8qkjlm0hl", "482922060674953216"}, - {"evmos1qtut300t4az2xfd6e4aywvd8u80szzwkpv7kvu", "28326138485918859264"}, - {"evmos1qtvayhzruelse2pjn95pq5c6w7yhy0pljmtuxa", "87857490251212783616"}, - {"evmos1qu0j80xken9082c29l085hlxgqmet3su97cht6", "685812019982458112"}, - {"evmos1qu3uw3unu63saecdap8j40a98w257weqz0ss27", "20139609917466968064"}, - {"evmos1qu62d8krhpq3ekwpsaz65fh9743dyywglnu43c", "230813759313796864"}, - {"evmos1qu6qjjd97jjgkpsgrgsmtte5qvrhjmpsqzpaj3", "3598357724208091136"}, - {"evmos1qu7gw2sktd57audfk7w9kgl2gmzftzjd8uumg2", "3874943746845376512"}, - {"evmos1qu8lvmukwnasz0d7yhlx8xt6ln50uxgwcrpmwc", "470516967102610176"}, - {"evmos1qu8xsvnw2p6cklma2thrdv0a72medrg3dznrwg", "791256167878270976"}, - {"evmos1qu8xz48833f94g4nr3a2djdejpjn7hxkljcymx", "4003602125331253760"}, - {"evmos1quge4c43unlh3596lgspsvf5r2rmfum0dt2cl5", "1052333414419179520"}, - {"evmos1qum8asykufdeu9ee02dnggtf7a5cslvmmxfcdt", "20008567201985527808"}, - {"evmos1qunxh07au0jvg487mlk22gfvcc59k83f3uf6n8", "1941204477283789824"}, - {"evmos1quph65cxh5hc3qwkq2y5uvfgvzacmfjhule7sj", "991990147711440896"}, - {"evmos1qupnpcp850jry7axnuxg5xy9ma94gkph9zv5da", "7852560541611759616"}, - {"evmos1qupz95lpsh0ajmw5tcrqvsgdnuvesaljux5jnk", "449863918994433536"}, - {"evmos1quvad8hkzckrhah7lpx0hvsuk0v8nqacplrvm6", "3909263061855782912"}, - {"evmos1quy0qdc8gtnu5yr8p2npfqudgcg6nv9q4ddes2", "716598643664592384"}, - {"evmos1qv3rst4eud2ju0zk0sqqj7uf5q9y8vq0uuqmqs", "1800926006321158144"}, - {"evmos1qv8xj8feutw6nlan9hjlf87ml86epmcqe3mnht", "6013360089961793536"}, - {"evmos1qvc4r4p95lkltsufq74y9v5lymhmdl44t3guxq", "11905907902214340608"}, - {"evmos1qvenl00yqjh9muk668a7ggn2t2xrp6jyr3qmf4", "64456724037632"}, - {"evmos1qvk4my8tnf7v8kcchr8yhrkh6tkv4498z37h47", "473978902115665920"}, - {"evmos1qvr4ugxa2ew4z4vt5vqm2fkzw8sqdvkxlgqywy", "35036762669589557248"}, - {"evmos1qvv2xpuj0z6mxrl3zdy52j95e8vpar0gy8fw9q", "83803862693568000"}, - {"evmos1qvxe74w87avfqd9c9x58huaasntxs2sc5988de", "18274380455887652864"}, - {"evmos1qvxxefuk2cw9eg0pxwn2lz53c6ejhwrdnlmvyc", "1501506182995697664"}, - {"evmos1qvy6f4gk6gghf3543tvn6y4dxwafzs75zg4qds", "4522960875701509120"}, - {"evmos1qvy8jn9a2qt5hc6qrcywx55kpvhrnwwsnsh7m8", "7955168536864003072"}, - {"evmos1qw6nsm8dytslwmlcwwsaksth8wrs3uu0e7l8hu", "6242545174695202816"}, - {"evmos1qw8qs8dq7a0yutne3j44afe3yv6fpreayv2p5y", "415800945175773952"}, - {"evmos1qwcps4cul9qtgvhsx757qr3nhvhn38kwr2spnj", "3983531268923041792"}, - {"evmos1qwddpy2l7r6epa2qry6ku35ek4g5nj6ppsa5ec", "4274546870728794112"}, - {"evmos1qwf279aegc43uswk33x9n00e4q5f55keq7zkad", "31318325351404800"}, - {"evmos1qwjh3cm8pmr0vvjggy742lehwgdq33r8pdglzs", "1055322384130413056"}, - {"evmos1qwmjzp66gggrh4tq46m5t0kq3rz5qyjwvjads7", "1792844338711368704"}, - {"evmos1qwn4565jv9mxnw5sqf4h2gv8zaycxgr0flz9x7", "1999444843831888896"}, - {"evmos1qwpptkrxws7vlwpwyyzzu5n9arnxd6gfy6sfz7", "1625148044292419840"}, - {"evmos1qwq09ruc0n8frzzcqv9ygxpe24kh936m953av8", "19594418560255209472"}, - {"evmos1qwtuutzzndv563utvmzjfvpvdrwugs2w35r2xz", "94577797777268736"}, - {"evmos1qwyt9mq0v6q82dtekv7s3l5hlkdp2kdxwyq33m", "2460799220325236736"}, - {"evmos1qx0frwkz78gvr93xd9gelgz6n9waxqtdqvg4xn", "1823200973270429696"}, - {"evmos1qx44psme4gyc5xvlakjvtfgavglle4mylzu4la", "2384277191692814336"}, - {"evmos1qx6n80dc7vnnxvkrnh96wvccnd6r39ytm8n28y", "96465378458643456"}, - {"evmos1qx7kq3xq6huek8cr7fsjzqeuyqq64kp00rad75", "989108632630112768"}, - {"evmos1qx870h0s2ehm2xejf86l3rvtnfjj6zjqrlw5sp", "680352983687843840"}, - {"evmos1qx9tvskvy4mz7j7epwkv2pl0xdzs9wlc0h3l0r", "32617391983266693120"}, - {"evmos1qxd4rzqyhth5mwkmk9z55gwkrkettru96fkx56", "411044736876828416"}, - {"evmos1qxd8ugsw6a7xknqwepkwsupzckyp6gvzd6fcv6", "13614962805939691520"}, - {"evmos1qxkjnycyn8crskezzd7qlwhtl4tjltn8a3evap", "6977960127650043904"}, - {"evmos1qxksz9txpgvu9zskwr06kzjfaw6rnjmupfagqp", "24909677452837376"}, - {"evmos1qxm0t3av9fervmy75emdmmzmar4wcgzfwskjc3", "367057779262515456"}, - {"evmos1qxmq6qw4hketvrqq38zajxuqnjxcetcsk2xrld", "14409977666831028224"}, - {"evmos1qxp5mfdr37kvqngmhu6ggvrfpxaecde5tg6wgq", "478580925425766144"}, - {"evmos1qxpewthvmuwe9xy0m0nj3yt60ya9fm5f6q4gt5", "849365491034475008"}, - {"evmos1qxq3483mtml9jgjwzu8neqf493m8z4w9y32gja", "1163109609224233728"}, - {"evmos1qxqj5txltmthhpz5jqjgyafp8axvp099wplate", "608232080467845120"}, - {"evmos1qxv9dyxet526k9ljdwap53n8q04yxeaneqewnl", "11673888446151671808"}, - {"evmos1qxwdzk2p9rpndx567cxs8h2kgjn5vd6u2je3td", "2418376743849487360"}, - {"evmos1qxwpst0vg2tduz6q9ktm4wxdl99sx3n7enywmk", "3862351081694707712"}, - {"evmos1qxxc3d7wuz6xhjmt93ms84jjt3xnamr7uuenkl", "3554008117538271744"}, - {"evmos1qy0wlm2mldy0nah4glz0fcge7mnq77dqdrp74p", "34591484207157313536"}, - {"evmos1qy2ev7v0kkwa7llwvp9g5pcf06hng9fqcg5vlx", "19304007227748478976"}, - {"evmos1qy305f923gyewqfvf3t4e7cxtq7qltwzvjshk5", "4840580118287980544"}, - {"evmos1qy34rg6n4y4zqdrnvjl96tg9dnj7lvq6r5cpnq", "3351311712976904192"}, - {"evmos1qy9xw0w5zza2gmzrzrzk5hcxuuru677lzz3tw9", "36465733732328448"}, - {"evmos1qydvdsazxjn0ux3hh2can67l5nflvq37su4u9y", "384318388316961280"}, - {"evmos1qye8ef5ejjw2jzuacvcw557w9xdlw9u4cqxwrp", "483169704950118144"}, - {"evmos1qyj2p7h58vqnfw4pjrckck7dpz8m4ad9lp55w0", "5322500807218168832"}, - {"evmos1qyjnherhyp752m3jpnhpx3f5nl2sjsxr38jdqh", "534341310290942976"}, - {"evmos1qyjwvrcdj7yp8aanre47zjdwxet7eukrqshevm", "1272491890947104768"}, - {"evmos1qyk8smapk3wmtzd6kx6nr2hwnup0f4vrrauk04", "3233380697107464192"}, - {"evmos1qylrmxe06su7z92ennnarvc04ajk5xgg7gvzkn", "8751866187232292864"}, - {"evmos1qym0cc2r7fh3f8fg4s9ragjvca5felwzrxs2jy", "24501570568416512"}, - {"evmos1qysswc70x4twzf8rqzhgcntmh5ehc05ew7xwym", "2744800600039890432"}, - {"evmos1qytm5f924s647al0jngkxy24pgh09uk4vygk3y", "580007163180603392"}, - {"evmos1qyu4f6xmn7jf36zsygtwh8cz8rv0h0mr06lyw0", "2687974341511407616"}, - {"evmos1qyuj082pgn3gt749gn9chqt40wa7cn4suts63l", "109444146902201344"}, - {"evmos1qyuswtq0gjsw72k8x97nfwam2zymy7xp32a9wn", "2038604742257103872"}, - {"evmos1qyutadhuv39n2hh94ga2x2j892arfxj4ykgj9e", "7322129787718664192"}, - {"evmos1qyxxl09tjf8h6s6ndsel3376qz05ew6ltduwph", "2633933049980081152"}, - {"evmos1qyzuwp2ykluqdad5ynx0lle5mj4usyaptk2xhp", "10854433338533566464"}, - {"evmos1qz2jqufuqfydhqwvf3yzmml8zq93txuhx8vcnf", "2359390989868679168"}, - {"evmos1qz2rlggx7t4euufd5mvrh5upmpu8s305vsttmh", "152430343460833280"}, - {"evmos1qz30en0p9lwawv68a2q0j2ka022ue9c05yglpt", "45121269414207594496"}, - {"evmos1qz3v8464cgdusdare2dryfujwh4wnc7kp9s9kd", "13260163719465095168"}, - {"evmos1qz4wynr5h4qjaa0kax90ag96ymmlqv559jeujc", "1107400822254745600"}, - {"evmos1qz6rp0nnwk7rcwugecw7hgfllg9ppggd9yyc3w", "4659929980059336704"}, - {"evmos1qz6zryer8wgaqcc854s9qj4aju7fqwncf6nvrr", "26915514878963982336"}, - {"evmos1qza7s5axvuhq50kqsdt2hnt0gf5c72n9jekuak", "20900108140617179136"}, - {"evmos1qzafxds6vf0qpqpr7v9k6qcavs3lny2q2kzaxt", "1065995790391347456"}, - {"evmos1qzcn24c5nfpl2w6zx8wl2scmrte6ntt0826zxx", "2456845928604049408"}, - {"evmos1qzcufuvh3djsquktmedg23qy3x7s8gfugyg5y4", "771311812853648896"}, - {"evmos1qzdnvk50f3t5rnhdaaldlflvme8fc8wly70lal", "1627283210740506112"}, - {"evmos1qzdxt4dk5vquq27k4322l9nnave6dpamatfjvy", "4846217885879943168"}, - {"evmos1qzgtluv70l2ws4k379zn53rw660kdwrcmtl0ut", "5135003440975933440"}, - {"evmos1qzj6lezevf3v0cdd39f2l3qy3sm0nvgqt8tlxd", "20688203185841893376"}, - {"evmos1qzmdn9s9cnpnurnyzxhkh6pegq2sfrh99wch5a", "870610556895645184"}, - {"evmos1qzplce937yu2k8uyr8e8xvsxq4z0ax4zgwfu2w", "3217352085748103680"}, - {"evmos1qzqe00engrplt8jeahkqvew6jusw68yr76733s", "170910323969989632"}, - {"evmos1qzqkpj7wq08fey2dju6vsg07j6yerpdu70h5zk", "2117641216507727872"}, - {"evmos1qzry3n32lny9plpl4ut659zze3az89c463puf2", "1569223927430467584"}, - {"evmos1qzyk6hnzmgv5jwnrgcyfl683xu34tcgt5yp30s", "6082649886535370752"}, - {"evmos1qzz3mgfk6rmtm6ew2rjcqvlqrp5ey2k5ydf8yt", "879632725392491008"}, - {"evmos1qzzxk5998u2qzreewgf8fxa7nysr55wvlp6xtq", "5496700811582652416"}, - {"evmos1r00krkelnvxrkshvmj65x0ed5zxcahc0falzwg", "7669457637207918592"}, - {"evmos1r00qhywvn7efc9t2rg2cqslk6r3qr42s8ee22g", "492367414662008832"}, - {"evmos1r02ztf6rxqz4n4cyjrztktrg6nsmmqxd0e4mza", "320477354273070336"}, - {"evmos1r04mm9qtlgdmzjx35ax3tvksmdh9vyvx8ra63d", "35982570154512928768"}, - {"evmos1r07szyf3g5r2u6uw7n0m9p3k6s4kej3l783vle", "156892298590210048"}, - {"evmos1r07vxndd4gg4fw6ldhpt0y3l8dwvy4hhpqp479", "1206798650831004672"}, - {"evmos1r0827vl2mn35adhxyylf8t3ex4vyykhtm4c43k", "2131494115419652096"}, - {"evmos1r08z3vrdrmetppf4zu32sts0j2v0s5hrkvhy88", "697822607308471552"}, - {"evmos1r0ayqy4w2vcwe39raxqxvc76n3pw56nfn0llmp", "775664963355568128"}, - {"evmos1r0hx79qr7e98ttu0ga52s624hvk8vvr0t0vt2u", "7895281066279180288"}, - {"evmos1r0lpghsk98mkh8xhr35uh4y5j0j8jygenncfs2", "387089355178766592"}, - {"evmos1r0mjyxpv2ts8tuaygynglazljhx8mmec2xqld0", "9392537569160753152"}, - {"evmos1r0pckqmvsc2rmnr53u95k5zgx76yethq5anqn3", "1404504927579095040"}, - {"evmos1r0u0w86p6j8tlpq93qedey6fyzst9ujkxzl496", "876900250748510208"}, - {"evmos1r0w2dfrdd8h7pdx8kxkfvteypc8p7pqv5np8ke", "39014644174335582208"}, - {"evmos1r0xc6v4dewm2mcgyx9pxm6fhhre8ay6yfh07pk", "1627360559858409472"}, - {"evmos1r246hhve98vh4ynzvqrryx9adyvvc34h6w6rhv", "8554066637093789696"}, - {"evmos1r288y63jz3kraraqzfly67u8xm057j3emxr8mt", "5288526231197298688"}, - {"evmos1r2axj0aan2xjg5yw4x4eng9lqa82eg0wvea4fp", "1003985913598687232"}, - {"evmos1r2djskcmtandx2m96j52d9286sql0jc46f2afg", "6499748331560222720"}, - {"evmos1r2eywdurh8nlfxex6tnnexk2yxtgsqmpc9wcer", "59796940135328317440"}, - {"evmos1r2fss3rprr42e7flkmgl2nlathh6rru2qjcmck", "305396251055741952"}, - {"evmos1r2gphsxrxr8kxul58taqgmzn7n4yqdug77uk7c", "21100994525164490752"}, - {"evmos1r2k0cw6jnz007gm4uwge79vcn20pu87a9r6pmr", "666701106589859328"}, - {"evmos1r2l8rrhsg9vmxgxvrjsas7eclhq4q65zjvlvgs", "2241923639264860928"}, - {"evmos1r2ntjm47aa9wefg77x2yvsd8clacssxq5twzzy", "4643094555982658560"}, - {"evmos1r2prdunfhd89hhhfx3n8qc6k2fejdaqavuwlwk", "385417978662724352"}, - {"evmos1r2ptl0n54ufv5w4938a2nfu5q2vv2g46uur7he", "6095385850778222592"}, - {"evmos1r2pur8hswmugrkute235svc8t2lnkukn6wgxqn", "8709441341762560"}, - {"evmos1r2q24qml3furu7f0wv8hkkpfsfts079kw4ysxv", "37105082450317524992"}, - {"evmos1r2vk0fasc0wnn93zjmjn7h84v3cnsh0jpmpjry", "10726700430781032448"}, - {"evmos1r2vp363f8h5wxl4evstdw04zvydmxrlx6auf4e", "1363846080523669504"}, - {"evmos1r2y535xlyclnshkvv8sdg4lrtlfprs7sjq7ava", "19687466780141740032"}, - {"evmos1r2y8g6yzt0d9f88ew9cqplh5y3wq867ucjajzu", "3214920063188115456"}, - {"evmos1r32pcmfxfdy4l5x3n8n4aqf5qf95fz0jtl0vg9", "2797588960619182080"}, - {"evmos1r36wd6zm75l3kmzkge0p5hmm74kra09h4pmap4", "6444577606717276160"}, - {"evmos1r38rwse3kuk3kccr2adakaln73rrxytpeqtzcj", "1777580073663918592"}, - {"evmos1r38vsad6f2emdjdncu0k2zltsaka4m64dew8u6", "2919593908444336640"}, - {"evmos1r3cqg4q26pe4jphusql56nadrgwm6fjtwfq7eq", "884408516289740544"}, - {"evmos1r3gkgavyyp7c9k74nw9x96fmnfpc2d2rlylsf6", "3042381511258774528"}, - {"evmos1r3hcnytdj7fpvucr3u645l7pp6zlul2efzqnh6", "1670473164001711360"}, - {"evmos1r3krzpfw2sfrts06suqq5phwg5j5592fsudntn", "5830798111327391744"}, - {"evmos1r3mvru7zq2a2shdxh29chjhjx8yvd8mxps0ejz", "382805591021170688"}, - {"evmos1r3p09lxfcl62xrwptt8ecpramm8nnhsxqyuxpr", "786299605796470784"}, - {"evmos1r3p2n92x8fgh80a66e83vagu2t4gar3n8sl8ej", "1078985465560641536"}, - {"evmos1r3pu9ymyhc6nc465rwhc6r9ejjfr0cpdt4qkau", "1359654932739231744"}, - {"evmos1r3sz2tvt6c630nwemu6km8r3walfzprl4vxgpw", "784174967903906304"}, - {"evmos1r3tzd6lk7xpfje2mfn430sjg2r4nxzeqer83dz", "1027243752473277440"}, - {"evmos1r3v4tzmz089f5ygtsl2z9x2x8slgruyfex38cp", "24476223066782982144"}, - {"evmos1r3vfesc4s3pguc3ydatuy4xx2rysvm5w49075q", "1085947534338361344"}, - {"evmos1r3wlaxkws96ndsstn59h5agztm9qvn4esw96qj", "3851041199697415168"}, - {"evmos1r3yvhswdv6sc5fkq2fytrhnl9v9dcjmdkw4ndu", "49278316244585439232"}, - {"evmos1r42ftl73axdywcetcyx2uxr3kt7vpv0jmyh7z7", "4175948522788490240"}, - {"evmos1r42jycn89y6fsy48rkqj69903tcl023x8wzyj4", "755763545728532480"}, - {"evmos1r4444zyhnz920juaqhke90wdg0dfz0dqpqnwxv", "9525291700967157760"}, - {"evmos1r44kvr4yv07m46r5s2p4aa5nqudufcvactluu2", "49805134260379648"}, - {"evmos1r472t9sxp8l5la9kcfflcyknj2zjd74cahzaqh", "1155196532104290304"}, - {"evmos1r47ffejjtvy46u6x87mrjn2l6yxpu3dmuc23x2", "3704597760851935232"}, - {"evmos1r48gucphlpgukankmu0p2z5dexvwj7l5xt2dua", "2940296181717598208"}, - {"evmos1r49vhj0hpjkafehty9tnrw9zpwuy35zzcqst8f", "17225480274985377792"}, - {"evmos1r4cm78egtryk8fx59vmycumn80ghtu69q5sayz", "7237958025826197504"}, - {"evmos1r4czz3zd0sz54usja3yrqqwfhy7vtzu8enl347", "7907802617467486208"}, - {"evmos1r4egnngxqudu7nsxa6uygcygn36j30v7rlsvk8", "1087012208421863424"}, - {"evmos1r4ettrmqdesfnufwflq6fc7hvl9rusgqkltvlf", "9843518132333670400"}, - {"evmos1r4huzasfgqc9m8vnl6jzqkez444mydg6xsw452", "13562854654292246528"}, - {"evmos1r4jd0hzp63lwgnddcrjnez4ktu838e62wpm59h", "2952732167846100992"}, - {"evmos1r4l40hgum429vjkl73lm2pvqxntc4rpesngk4t", "235122542611657216"}, - {"evmos1r4n0lcw0fgd209csw5pnzacheql5eq94vlwgs9", "1588044606252733440"}, - {"evmos1r4nmxfjcd2d3h4r8jwfpc7zjtrhlfzkg30vd50", "212646674861703200768"}, - {"evmos1r4nqwj25xw4m5ge93n3yp0287s9uexh2xh5g34", "317118022192451584"}, - {"evmos1r4urr7fvc6y9pwv9w2g6sygqn2pzzlggh7ac92", "716347022558621696"}, - {"evmos1r4wzzg7fugyzrvht85h3lnysvp7x5hxyazknzu", "70151389244538126336"}, - {"evmos1r4xwx5h2jpl5mpwa9cza4lhxg7a8gdksvqs838", "84637966110369024"}, - {"evmos1r4y28w2qlz979zq8v5934he9r96tsrhvqpxnnn", "1316914671929281536"}, - {"evmos1r4zhhax7waz9j2mn85cdj846tsdk4mcg5ww3ek", "2357406747750992896"}, - {"evmos1r50cldlcu9vr9w3sgn9v58k5sylc9dt7rw8jhl", "416147683140093696"}, - {"evmos1r52rq08twwnp79malf7ee5xy72wzvtjkdsq5j2", "5924135326791475200"}, - {"evmos1r52xswy7vujrzscerrdhnatgnegtljcynz9pyw", "6022625958047309824"}, - {"evmos1r53sancam88crr6xwxn9dmf82plryg5hneq0v6", "854721293101744128"}, - {"evmos1r55dmyly6wg6akchng436aktc2sx434ed77cew", "2076405657728414720"}, - {"evmos1r55uvtfpvya24ha3js462qw8thee70ecr5gp67", "3000695791755212800"}, - {"evmos1r56pys3vgwy28x4n5k433l6l872x4n35nux9nt", "1395683073404444928"}, - {"evmos1r56urhfe27u5ayqlptjn67fn7kw6gjffedt9pw", "11493484014914420736"}, - {"evmos1r57euulhamvy2h9zck9jz54pjad5mkc3adprkd", "365803870479643136"}, - {"evmos1r59ppetm7ms8za3rck3k7427ff09cqsuuqfkap", "1210529568544420608"}, - {"evmos1r5ahc0yjgkhzssxfdu8yjuz70s24ud48zx6rzn", "1149829426295589888"}, - {"evmos1r5h329mxxg42a3chrs9rv74k3xpsenau7tr9h4", "452124426930903040"}, - {"evmos1r5jv5rrstgduek6qa6778hzeya3dx5v696e9u9", "58386387044105216"}, - {"evmos1r5k0uwdwfgh7zjz64zxdcfemt2lg5neqd5ex8z", "224317247840432128"}, - {"evmos1r5ml4p8l9xwu9e3rselcmqpyv29eykgmvdjzqs", "8638771462437240832"}, - {"evmos1r5muk8te0z2url8kntgjst7wygnfmr8xxd7nqa", "6470939802324918272"}, - {"evmos1r5nu3gh62fslh5l2j7329ejcql6napwvaguhrl", "1571608354721507328"}, - {"evmos1r5qd30u7a0lyjkdecqsd53dnx8399pgaf2clvw", "79464370384656089088"}, - {"evmos1r5qkm9zn0yhdergg82klyhdektdcw2787vej9x", "2665538944078603776"}, - {"evmos1r5rc4lqg79y0qyv7ht8lmtd4upc46zhgf0s6cj", "409967550108221440"}, - {"evmos1r5wxhe82x37356z2phe4rlka3tt8wxkqfatsz6", "234212913516056576"}, - {"evmos1r5z6e0qqn9wmnfsjf2wptzq5yqlrkw2yc8zk0j", "410864874067524608"}, - {"evmos1r605svdq3fj3syh7t55nl89sh09cyqzm6kleg3", "945352746345984"}, - {"evmos1r60jkf7gt2alvddz3cpdlfh38046km9yau4x24", "383596036643091968"}, - {"evmos1r62gvkk7vhx07yx5phs463c6ms7pwf4mq5zn5a", "385838696881603584"}, - {"evmos1r62nhgsyxdkczvm0yprz05zt652ay2dp40q635", "2876283600729829888"}, - {"evmos1r64905dn2mrwzhuc4jtxkae2sjv5tp8v734phx", "114543242809372672"}, - {"evmos1r65a3fxqz37ck84zvetuf2ntkxtulmpl54e42f", "768729996946877440"}, - {"evmos1r68dayawsdemps9cl2y8nqdjp5nam5758s0dkw", "404271996911452160"}, - {"evmos1r6aanj7nvpe545m3wd09rc5jl23846wkmk6wy4", "387371006098057216"}, - {"evmos1r6cppvw2kct9ee0hlf3nzyuru2vlgvrvgaq0d4", "1741457486526259200"}, - {"evmos1r6d4xeudz6nwzyr0r97v78gv9rmgt6zqcsnkzq", "86939101367061774336"}, - {"evmos1r6kmfwwy0dyyuk4l3tnhqllfs4xk2vmfhvpqlt", "7491726331841943552"}, - {"evmos1r6lyyswzumln4awgnajnxlm5m527lu20fzm6tt", "5403227535946946560"}, - {"evmos1r6nqlgx2fu2rkae72pya5ypkq2cjrttwggza3x", "6109088905199163392"}, - {"evmos1r6urm4fea76a6wvp220re7y49zj9uyj829ykng", "387758691944454144"}, - {"evmos1r6ycy9r3gay04gnhndwskg8epz66cthcy8jt4f", "26580638226572558336"}, - {"evmos1r6yrr75tltgnsr4snpzawsxc739j0q48pcn7xk", "1412434037863610624"}, - {"evmos1r6ztnutjj85m0uw7jwnyrgnqcjq52hq7tvkews", "10291231386131816448"}, - {"evmos1r72ce5pserzdks5ph58ankf6h8zvr2xhuznf5w", "385205288007635200"}, - {"evmos1r74j3v7czu5gjc4f5wn567v4wq9ss6srf2q7xx", "948843545560369152"}, - {"evmos1r75p7ncdy32emvee5ggfnx8r5gx4j222gdzfry", "8249751640234931200"}, - {"evmos1r772ec080cnnv7x6pvf0hcw3j38fd2g4d6yvvq", "18595323810749546496"}, - {"evmos1r77k5w2j65cpq0e2twefmlfs0pzacy80wpchwm", "1356167799922343936"}, - {"evmos1r7avahjn7qpvze58hlqu54eted5c6nhjnthtzz", "609332810070595584"}, - {"evmos1r7ffppu0g0835vvr2kqmcqnugwjh3cuh8t4f76", "29954938350681202688"}, - {"evmos1r7gkh0ee4vvf483ancvz8fa34r57tusyuw975e", "18541361640292196352"}, - {"evmos1r7h6fvmgrvmyz9ysv0x5ygp8lcfr4wdyzl5fc5", "1067979108627889664"}, - {"evmos1r7j3e3zhp3w6j5rt8czfh06w4zch272m0s6d6w", "1563553676089159680"}, - {"evmos1r7ld6nwzz4uv7nundvtxqsafyy7zquavmxel8w", "3810366198027951104"}, - {"evmos1r7nk95xspccmsdlzvxejmdwygmq2lqn8lt54l5", "9974177098180788224"}, - {"evmos1r7prrm6saxwnvx6j223yashvgs59xelpe94dyt", "1235755676596036608"}, - {"evmos1r7r0esft6wr7sz4k9x6sr9muj32gv2yf7cv62p", "814472459653957632"}, - {"evmos1r7sc2f3fhhz5jr42xtvn6rpn0cw4320dzq8u28", "44133658931700449280"}, - {"evmos1r7sel2uyv4j3qr7g574gavrs8e54sgm4mtqtje", "27241667141048238080"}, - {"evmos1r7sh4lk8h8g4gkktrfcs48gug06n63qxd47h9m", "33558866074300973056"}, - {"evmos1r7t09lejatzaz427ue4jwfcrfr3hgaxgj2m9ff", "4541812267488605184"}, - {"evmos1r7wf80xha735x9ucfj4txy2xgkdzkq70ppnq9n", "1317911743602769920"}, - {"evmos1r7zn3dul4tdq2p9vsfepvzyxgftj4vlcjga7cz", "21942635159736320"}, - {"evmos1r80qk573lqd0fcxvgd0nnnz492u0nztw8p0e9z", "5723184842954285056"}, - {"evmos1r82swek83f6lszljh5em285m4gngs2n0gla6t0", "34981952476383133696"}, - {"evmos1r86amvd889ynrmfem74mth4rp73x6t4zvsm2jt", "7400312766609336320"}, - {"evmos1r86yzu93ex7hkegvm83q793qx6pyk5m3cy2dwk", "102539394886521856"}, - {"evmos1r88n3pukcv060fvryuxcyev7e545l4ysrl9wq2", "17963372681336881152"}, - {"evmos1r892vrfxjdda7an23l5jaz4u0kkgq7djc7cmsv", "893781597197611008"}, - {"evmos1r8auws2v3svqxprkket290qyeljjgzgsfzjll8", "5143627227646755840"}, - {"evmos1r8cnlpvhen6djuq6fq9txs967pzttd5lezpxfx", "179140774994905600"}, - {"evmos1r8hkskghtlpucnu0pa96r9ntv9y2uvfgejvemu", "29605399713285095424"}, - {"evmos1r8hsff4hspse0mn65wd6m87w46ua5hepfnrp6f", "25048118658411520000"}, - {"evmos1r8jhj7f4ax56lh2sy9wjg858qv5zurwne0zm4s", "52744971033843449856"}, - {"evmos1r8n6se7xq2actw7pshfmxj6h9q0cv0fttr3cf8", "422871821678621184"}, - {"evmos1r8nz0glvsngt2qel3ld5zakuamymhzxjaudfnp", "8685882217021412352"}, - {"evmos1r8qcfgetr9y4h52mz2g4zjmypznf4gdqx6uwsm", "1039658028810973184"}, - {"evmos1r8sstatwy0m8ja6wzrv6lj2z05f2fndc94wtvg", "5219835133370454016"}, - {"evmos1r8xvpnqnfunxa8ympmy9qm47tf8ea9caljt56a", "1004748581073926656"}, - {"evmos1r902cxjnypw4p7ueyyv5gk62jkd6z504hxe4yl", "41392374007637041152"}, - {"evmos1r90zwssahn9sdnddhfmphu4z56acr8az6zrkla", "1195677988719980544"}, - {"evmos1r94ezwm9a0m97uqyk94hre8nusyvpn38q53lgm", "5825367800432050176"}, - {"evmos1r955zpp98m5mwhwxj0d2hrjt9j8wkhwtk66f6z", "1843496436975227904"}, - {"evmos1r95kdgm2ekdke5xf3pj5d2zdd3y9rhh3ftpr6q", "56447411301444608"}, - {"evmos1r97lafyu3p25m0d2e0qdhaa0gf0p2rne0lenyf", "18799508980078297088"}, - {"evmos1r99c5er0kk0fymn6g79hc9cgvjtcwnn3kfx25z", "2923990239251644416"}, - {"evmos1r9aw6f93aaq2kxy9244y8tgtly7l5skptwxw5w", "1248181177958232064"}, - {"evmos1r9fjxjuwkglk5uwhap2kx2wzr8grqwvt8h07p6", "2069252735875801600"}, - {"evmos1r9gc5y6cg50hlmeaz9y9ft7pz5sh4xsn3n9pnz", "1267649995038760960"}, - {"evmos1r9hm4jnq74k6j52lftsn252ljw5kjz6k6wryh0", "3256011445552447488"}, - {"evmos1r9htvxzqegckt2v5p44s0rh2wdyqjs9xahmjpf", "132020768981513216"}, - {"evmos1r9k73ey2rnzls69skzdnk96qvkv205x4u3lua7", "6867070600171995136"}, - {"evmos1r9nke9ajnp3v8sjrnyhetdu9af7vu3qakveu2x", "891014614514792192"}, - {"evmos1r9nxw8wjagpg8kzgty0h6cj0826qzuhccckfeu", "2561500858156057600"}, - {"evmos1r9q8ck2xmq62z6ax4hyqma3nfjjjm4tpmh2xn5", "1079240683386724352"}, - {"evmos1r9t26pln72gryuc7t0vh5lqjmdsymp3q9rp052", "23302766035155820544"}, - {"evmos1r9tr5xqn23r6zgn6g90jgepjndmqjhpp529s70", "884531729538844416"}, - {"evmos1r9ypqxdu0dzeagds8vaurjg5e7vjtepxr40tws", "5687774855656130560"}, - {"evmos1r9zv5u3lwam3k26wcyq3qj2wlu0mtjekxn38af", "3940732799968974848"}, - {"evmos1ra2zyy70e9xukjqj2082hq7pcu6ugtr06v9k5l", "102299453793884520448"}, - {"evmos1ra50ux8vgg532ly2890lm7x5wcxr7xv8jm9acp", "1205303983667838976"}, - {"evmos1ra6zye5m25wkpjk4zlhvxl8mwp04x2rkapewdc", "8288282547208916992"}, - {"evmos1ra8rhm4qyep7fvr07d72svyu42a8gkr5lgg32v", "5668429163345117184"}, - {"evmos1ra8wcfnu4wt4ecgftj72tdfk0rent7l0fn4jma", "63320908061382656"}, - {"evmos1ra9z2fn9v5vdxwsz3vpy7gytc3pwjxceycuhfc", "790233116777031168"}, - {"evmos1raev5agtq4t7avdunreh0qsv6njs8p6kujrlp9", "1224489374339785728"}, - {"evmos1raeynsx6hlwgsuc0ueeqhqde266ejqv0t4t2ew", "2095189918823145472"}, - {"evmos1ragukqx3hwurcxl3xfe8pqmpxwn4ezn9c4ky08", "7248233558049681408"}, - {"evmos1rajqewpnt7r528cuf7ptzml3td8zkp03gt65gk", "4027682536810610688"}, - {"evmos1raktlrupmjrs9rk95vx6dfwcwze5en76vecyen", "2551745702686092288"}, - {"evmos1ral6frlm2qfkryafa23h5vswyup38d66wufdaq", "2396233396027741696"}, - {"evmos1ran7lpk23um539aaz9rj0wqtpdxvhvxxlnaap5", "7317419774462830592"}, - {"evmos1rap85m7dh9d88y79s4fqj0ss4yegjrag79vd2v", "4177888379280637952"}, - {"evmos1raq35hcwr24d2gscq0lfzkwwpxsh4amjqd2q66", "472827630621849856"}, - {"evmos1raqwz4xk00gwgxjknxkhfezmj05uqjsacserw3", "13881801212887388160"}, - {"evmos1rarwnkhkq2zfjx22d0lm0pkdhvcpmjpt0r54un", "2817669983774529024"}, - {"evmos1raz9xxnh0gtrqj3gg57tv5nkk7lvns7zsjm87u", "2777671481372980224"}, - {"evmos1rc26tzrkta4k7tqfujgtz5z8jnd4le5txamhp8", "2019517827417153536"}, - {"evmos1rc365zq4dach0gxnev5rf3tclk0aq9sfrzlwww", "6614050010486557696"}, - {"evmos1rc44e6nuwgfvuue9dhplwdk44gqcr45fmn2x5y", "28735284874141458432"}, - {"evmos1rc5mch4m49lxyr0zxvxawyqxa8nllsdhutuh30", "1215800297124747776"}, - {"evmos1rcdjswvjxwx4fc3qw6cw0hntqegcmhy58m5g7a", "13424511443345358848"}, - {"evmos1rcl0j7y8nj9t2ja7kjl5pmcpp7e79sqry0m6kl", "638142753244026368"}, - {"evmos1rcl6hswq0jhzq6f6fkg0k2u7fs53c9sy5wjx3d", "26974526931413008384"}, - {"evmos1rcmqh3x4vvtkv36drt6gunj8pstcjyc46umu0a", "80703815265548288"}, - {"evmos1rcnvjnmh8hmwa37n8ej4p3gx4ym7uzwdtp2r6k", "64183736915684352"}, - {"evmos1rcpkh0yf6ha8t37r963ay7hsdgx27w2gyljwl7", "21840539875943497728"}, - {"evmos1rcs2f9rrm7nsxclvd3hf29x2ulscq2q8wuhv5r", "86007907883849984"}, - {"evmos1rcs332qgvzjujfv57hma2eg5h5u0puxp775jgk", "15451929927644084224"}, - {"evmos1rctg40n8xghl0g5gglhq8y926dt8fcmdz5jw68", "2687514658987991040"}, - {"evmos1rcy5akwlueds9l2d69xqg6kxksfa8qaz5f4ty2", "19157912402374705152"}, - {"evmos1rcyeackpgj7htnkzae78ndq0xua6pphlm25a2d", "14192864028255260672"}, - {"evmos1rcyuv8u2fq9c7v99sk25sph9gyrnvutqcpe686", "3238040997816614912"}, - {"evmos1rczectxy8tzgep28mrfnqa6tdmnj8lu4qkcsrj", "16382395323116519424"}, - {"evmos1rd3gyhuafuscz4dlxqdqvccklrss89mer6eyff", "743710017123889152"}, - {"evmos1rd3lfenkyldv4q0j60jg38n3md89wd2myfvyde", "6817955067386655744"}, - {"evmos1rd4khmdugz3rdf22u3cr90h8883z58u70877xf", "24702281623500800"}, - {"evmos1rd4vek8mtfmnxjj03kh5gn4v62auqmum498eh3", "285399611690275584"}, - {"evmos1rd96vv2uqtehkvj3ju42y5cd68ywukwu7a6e32", "10483008709081604096"}, - {"evmos1rdas43ujzv45rfa8t9twtpunsmt0t4h8uuc92p", "368923373771700480"}, - {"evmos1rdf24383apjqrzad6t843cvpw4lnk8hmk7paxd", "2695879554588795392"}, - {"evmos1rdf2wpskaeldf6s8p5vl6x9xper855nkq3mdwy", "51378288550584320"}, - {"evmos1rdj9hac5rdyc0mnfpgzhk2lqr6x6g3dvfdkdtr", "4324578676280940544"}, - {"evmos1rdkv2mx43ztwfldweyzpgmjy9vt0ssjsctwhwl", "692616289982547968"}, - {"evmos1rdmf0nvsd4ct3xjx9kdczc0y59xqgzwt2hyk63", "21907443069340000256"}, - {"evmos1rdnfj6xagxv29pfhz9jvm30el2xawm7ccr3fpd", "1049165955134762880"}, - {"evmos1rdnhcuq0056myvp2nkpqwqhvxj8e63rj65egk4", "159004239938403840"}, - {"evmos1rdpk42f2pt9nyzhse4q96mmjs9n0af07ddw5j4", "1418785253941370880"}, - {"evmos1rdrjvq4t2x2ycnrwygvydxpk8cxv9vj4qn5twq", "629173519952118784"}, - {"evmos1rdtzl5gs53rvjgfc9mlzukjx5cp0h99v8pwrl0", "979318218310911488"}, - {"evmos1rdxxr6ew5sa6q6f4tk77yyaujeehx6qf0nq539", "928080057018679808"}, - {"evmos1rdyl47e5nfe65n94akelcznat65aj89xgvn4cx", "2227317442946017280"}, - {"evmos1rdyzt4ndtz5p9zshzcpzmz44ychfk9rt96kxju", "508885959489260544"}, - {"evmos1re2atsymaw0e0e2cp8j6ngq0yz0a7dn3wt7adu", "8645190557791537152"}, - {"evmos1re3wcjxu50v230ugjapncf5zqqlk757yf08ury", "138437273754623232"}, - {"evmos1re5cul00tzpgf52hmpr2x6650t44x5qz64l6k8", "26756078449015185408"}, - {"evmos1re5lm3f8w8lcmz773tak3ltry9uphaf5ufhest", "673977001640054784"}, - {"evmos1re7509sal45z8r6mxv80kwz0c65mqp6rrjwlaz", "10046730747712475136"}, - {"evmos1re8aaktvlusu85lx94cy6veydyu52ur7cyqz2u", "937089170433942528"}, - {"evmos1rec8jsuhe7vwtmj98ff2nq7wp0nsvxu0ys8337", "296323449435050752"}, - {"evmos1regqkauuhuq9r2vvwwgc6g8sdcpvxkzs02vral", "1142607873143673856"}, - {"evmos1reha4nj7l6m2a8ehfx6enzkn79ze2ja43gfews", "9820522264740065280"}, - {"evmos1reljqt8fmvdpywyara78nl0q5pksaf94968wn4", "564933273112381952"}, - {"evmos1relpme8x926jjxcpr206utd8r6dpuu7qml66n0", "2494196921450336256"}, - {"evmos1remcqvzl9387833kxnpl8my50dut3n0k8x89h4", "219994048476055552"}, - {"evmos1repm63ftcwwxjwe25zlj3qwdul9nha3r78d3xa", "384498519150480128"}, - {"evmos1res7w8rdal3e7jyxtq8lcapex26z5kdjlf3y50", "2191117501273587712"}, - {"evmos1rew30g55460msu96d4wspjwh6g4t8km2v527vt", "3241599062580660736"}, - {"evmos1rex5fc4yuuujupypj8uapu59wujmhz6epvpznx", "1673931064881939968"}, - {"evmos1rey4zhujx0jutpj520cdl7wngmwv8vnp6t0tqd", "9193727194452082688"}, - {"evmos1rezxl5ht60wzvqx92ym0t29vvxszecldk9mh62", "2073859065510395904"}, - {"evmos1rf34e0set7cu6d2ywhmtt390sxnkwddrfz4dxz", "2581325373807767552"}, - {"evmos1rf3laca457aqqdcu3ttdpy90rn3cpaeehjf8k3", "43306212838465118208"}, - {"evmos1rf4wuxp0ewpfdt4sag704ttl473csky0q7nw03", "37914418442392207360"}, - {"evmos1rf5s2eq8xpk0xm42zw45ca954n5zxs578cfl33", "7831164038837299200"}, - {"evmos1rf7n3dzkg585cqg8gg7z94mehc85grf9lrgj4g", "1458349191815733248"}, - {"evmos1rf7rcp7q382u9nnyqt2ksjt295ztxzta4fdjls", "25222517519919685632"}, - {"evmos1rf8nxqcu9myr52xpr9zu28qelkd4klvuk8vpud", "904526359463239680"}, - {"evmos1rfhaxmdkt8fvw83au97dpkt0e5g7nd00zxerqt", "3950285017512001536"}, - {"evmos1rfhtpzx88449j6aqjtyaee0udk6sw9w85vgq86", "49690382812118016"}, - {"evmos1rfhvs9j7nn7vuxz5nhvqyl04weytxq397dtlue", "14037119681069838336"}, - {"evmos1rfk529785qqgnmsw549xll74n4qcpmuq5kjjed", "6590802226131063808"}, - {"evmos1rfm6ptt7c8al2td6lf6j5dde3wudtxz202z7z5", "1532710485331162112"}, - {"evmos1rfmxpk3wxw5erhkw9rr3gk69f74zywnvh80suz", "4342780188071313408"}, - {"evmos1rfnfhlqnlk4gjhqaj9ukn084gyype8j2g47vhc", "90250738697991782400"}, - {"evmos1rfpdakxf3rweead08hzs25ga2vvp7z5mtmasmn", "67592180624464896"}, - {"evmos1rfpqfj6xzdls4jucz6n8722ae2a6cvjspvnann", "1604244640479003648"}, - {"evmos1rfra9kah8ucu7jw8kgere08fznjtfhds330us6", "11875399051698245632"}, - {"evmos1rfsl3x2gy79ckft6vmzn5qfs8uvhca69yzp93l", "367083936814092288"}, - {"evmos1rft8hpph0ejtm2czvdpvzau8pnr5zr4dhd9px8", "14033853643192320"}, - {"evmos1rfues8dtf3rnqcn95a8e0upvrk6kcluuuqk5lr", "20617515264393211904"}, - {"evmos1rfwlvvmgs7a8uc3526wxangezt2mpcegc2dxe7", "883372391653277696"}, - {"evmos1rfxlj86kutcqaerthm423usrdhuz0ym22400k8", "2396616939311551488"}, - {"evmos1rg0chju6dzzw6hsasmfy2kq4unt5rxd70tk6w3", "379445978793753856"}, - {"evmos1rg293s0564jm0lvwwdyu2alrch9fsgqtptzs6d", "22178474650681622528"}, - {"evmos1rg3u2hzaw0lacug2ne6qnlt9wp9y70trp9nm2e", "3505532970766589952"}, - {"evmos1rg570tdewzfsh57gqrufrhu0hje5pz6emxree5", "27933247642186153984"}, - {"evmos1rg7gwk2kvpcu5h7ny2v6anvy5863u5lj5ywayy", "196394183063015936"}, - {"evmos1rg9j2tjagth0fjl0ek3xzfg5f4c0j2m9u34eh2", "1305941180488941056"}, - {"evmos1rg9uqy2d3rzznld89dusu3k89z8wa6csgnjl8w", "3325341347880546304"}, - {"evmos1rgc5d8w54d36jcsl7ljr7pc0xvwa4k9kn7dlwp", "999870389796348416"}, - {"evmos1rge44hu7w9arl7dakamy9cmxflwprgw3h2fkkc", "2031486507847778304"}, - {"evmos1rgfytx6ank8nwquzq5re0pls2j2j23296d79kr", "61168316202506166272"}, - {"evmos1rggx84s2aenxgvneag2aayuu9vsttld7nx45pe", "533225423119851520"}, - {"evmos1rgh99vpnuzy3f54gcd8g3q34ngdw066xsnk3vf", "13688132823233495040"}, - {"evmos1rgq59a6emhz2smdfge76djhjcpfs8s9yhuqtfs", "17565357047090642944"}, - {"evmos1rgsnf7ukw8nnhq5sj6rpndtal7sun5lcdd950c", "1809526447340017664"}, - {"evmos1rgvfa3mk3rkk9v0scrwc9asdjxkmt08defwhvl", "8664449158751952896"}, - {"evmos1rgwc5ndg6nr8uy784v3w5spm5areg0x57wyzk0", "3567699342024388608"}, - {"evmos1rgwkkvud96lhhphcts2vegjn7mt64enmgns5c0", "1212959742554811392"}, - {"evmos1rgx56k600ag7wx5ghu4hq9mcx6kgjv398xnmq0", "13066343314981847040"}, - {"evmos1rgxzf3gp6cm52kqprztcm9dr9cwd2swxgw83r3", "1687940761878368256"}, - {"evmos1rgyeg2u6u8sqv30y6euz7facg6t04mm59urwdy", "775134838017011712"}, - {"evmos1rgytu4jplh4ftqvgq8nz08x7xtjtur3007j9g9", "51465507484595339264"}, - {"evmos1rh0gfyhnhm69d3yawx95zdy3lkml6us5834rj8", "252989497585395712"}, - {"evmos1rh29ymdrvxm4mfd2lk0svxuy7qy3gfwexh5cqp", "299970435745017600"}, - {"evmos1rh2wle60egcm2cd6zqty0ll7ge2d388ga3jnkg", "5538809632888078336"}, - {"evmos1rh3nntd9d3uc4pc7m9h6ftsr7xkt6mzqq4e36g", "18809415086262525952"}, - {"evmos1rh52lr7tpaq24sx285h8avnwq00flqf59lhfcw", "435422589798464512"}, - {"evmos1rh7h20gtrxelpsm292qgpr8mnzhllg5sq7jzer", "132788525124973568"}, - {"evmos1rh7jr7se6077xaaavr29gxzq32mjk4hddure77", "944901541035100672"}, - {"evmos1rh7prz3y5aqjsf636suvtstwk4dyt2fmtz9cdv", "1775506341004881152"}, - {"evmos1rh7ykjyc0kcmju86j64p4vraez2a3xnsdwr9k8", "9394994829151195136"}, - {"evmos1rh89eczp0943j6jevrhs2txp9nr7dz5m3g7tvd", "2799475876706484224"}, - {"evmos1rhanw2k32n898fw2ttw8w3qw7mq5xym8y4mjwf", "2400997469764042752"}, - {"evmos1rhcva2r6w36eln5ycagfdpe9zfleqsd264qref", "169961998287110144"}, - {"evmos1rhcy0efwn62hm832pcjme7u60wklk3vhmwg6kt", "1450280000602570752"}, - {"evmos1rhfatr9rekuqnh97sg8eudcf0t5sw8s93hhfrl", "1394341551418925056"}, - {"evmos1rhmm92l32prc5e6skczvkgyrnsufhmyawxxhzh", "262357699470570496"}, - {"evmos1rhn09quqgz9n6jw5wt5flu3l9zak756ypmf0e7", "16050707845658880"}, - {"evmos1rhqtkk37cdzmhd8reeuln9ekjlllnc4g9vmej5", "1631123420135579904"}, - {"evmos1rhtdqc3xlmwcdxfe52vjych826rnyffer0us80", "4198952122144404480"}, - {"evmos1rhtqewk4nc6wnqayj9fwmd45xrdcgwd922jl4t", "225189759965612288"}, - {"evmos1rj2f7n7t2u87l7df0wf3tx8euu6wgyvettevyu", "5147366290759337984"}, - {"evmos1rj4da4ytc65teqdrv6xddstedwqtcz7u73elqe", "113180569450592256"}, - {"evmos1rj67jgjjmufg6jmznh05zjl9qvlnnmgyt0wfkh", "9014073274445891584"}, - {"evmos1rj7frhwvrpgtze4k3jsndlty7c64enewr48u6h", "368891557958953216"}, - {"evmos1rj879mel8235frd4xe7kha83ur7dx6h9y6a82e", "1192181623522945024"}, - {"evmos1rj9ym8vkx38r6kh6apjhewlyqcnly2276mcwyr", "1005740406750264832"}, - {"evmos1rja0zr40qly5j5e3wfytm2pvxnd763khxj4dt8", "4016150820324335616"}, - {"evmos1rja2l6jznhg0e0nhuceqk37sg3xnajtl7zqgew", "777059964103996416"}, - {"evmos1rjdlpsg3znnzjfally4lye2dkhjtuz9cfeqvkm", "10072725253150732288"}, - {"evmos1rjdtxx6cs7ty4sz780h9xt67kgacyzg8xx5x0f", "31431419890295296"}, - {"evmos1rjh9nwqs9vqrq5rwtr6wtc27sfmdvfy9t8w7gk", "20710588518062321664"}, - {"evmos1rjjj7tphaedwfqe0yd3dxuyksrxz9u5kqcsn7y", "5157879553231467520"}, - {"evmos1rjlctse73knx2ph68en8z34my74zqex0yk62un", "911263998652445696"}, - {"evmos1rjnhgdwtrvjtgmkhn9t00p2uczuq0ns82rsuye", "384318388316961280"}, - {"evmos1rjrlp3ldght2vhlw95pga3qmgw4dvjwq47v4gf", "716500399350734848"}, - {"evmos1rjs937fuwk0mpj382mylz682rsq9pnern4u4ye", "755424134815450368"}, - {"evmos1rju7pye6dpzfjx7mz453qyce6pdw9fueec37p8", "349824638580994048"}, - {"evmos1rjzadtsnxmgwfcl3vkal49jph7syemd3f8jvp2", "1182117496702809088"}, - {"evmos1rk2648w5230ks0tker5de4yhqjshx9aj25ccls", "3985883807981035008"}, - {"evmos1rk43mql055jnsaqvudew389zuq3fcuydqsd8fp", "5976524105326252032"}, - {"evmos1rk5udlfx9v43akntt8q23su3amr45tm9tgfkqh", "6178432614139620352"}, - {"evmos1rk5yqjuqlxwa3u92pgfstrlfvqhdxusnhxshev", "413821952394129152"}, - {"evmos1rk8ze2pmj3c6sc49qeymy8qhmqm0hz493pphee", "4549473876812414976"}, - {"evmos1rk9knhfurvt7wucykkdp6ehay9su4ngvz4jns5", "130108100457424384"}, - {"evmos1rkk6d0evufdl3qcgl66kd6adxj7jfn69g9zxmf", "7485980048090439680"}, - {"evmos1rkknusmk64f42vdwuqyd9axya7e9fhnmp99ejs", "197692184310402560"}, - {"evmos1rklpnahxn8tl5lyzhkvc2zyr3c69dwa4665z66", "5051543716421601280"}, - {"evmos1rkm2p0a3dm2a06yqwjmpzgsx0suarpsmg9nnvu", "6069579461302712320"}, - {"evmos1rkn4lvx6xfjnlk4emhkdkshja4sl3g5tc6zvlx", "11861516720318074880"}, - {"evmos1rknc9x7mcgg0ezkkfeyeu76m3qyf4tkwdsccp9", "1146634723959062528"}, - {"evmos1rkrc4809fns40mluf5w5fyr44k34haqxqhrl3y", "999646848204067840"}, - {"evmos1rkrkylg30rgv6h0tflnp7gavanpqh77whn650t", "26315487634456002560"}, - {"evmos1rkswamsp4uxseurnd0jg2ywp07skf3klmamf3u", "5107625685899092992"}, - {"evmos1rkum4la2ee87fdxa0v2v0t8ncg6v7nwwagy9wg", "60597896186265600"}, - {"evmos1rkuzc670rved0hsalh4ggweh7v8elm02yyp2nl", "156504601014816512"}, - {"evmos1rkx9hw0qjdneyp0lzlw8gssettpvxy7td6gka4", "524788902933504"}, - {"evmos1rl0swh0y64zamn7fsvfmqsqt28jn69npqnjc2t", "99491754596240128"}, - {"evmos1rl3rqscgd3z74dj3n75vltrq8cdh27kfqwsk8s", "444216581496806912"}, - {"evmos1rl5hka5yrg27a6lwa4l78nakfxzcr7dr57nh75", "2982191808290783232"}, - {"evmos1rl5s6zdfay4p6n083xwd2rjflwpvp96g5avpeu", "7033610167471255552"}, - {"evmos1rl6dhnn5a8hvwqmw7y2wkfkdpk924pa2a67sr6", "1477700012311831552"}, - {"evmos1rl9kts2c3kqjjvmyx2uxmzrnsf2xz750zevdls", "8395441558683295744"}, - {"evmos1rlclke7rxtayfyd8rtph649xau6u9fylfgp7au", "303741265030851328"}, - {"evmos1rlcm2syn4acjzx40kr8fdrg7wye8x496y2e44u", "366832936920413696"}, - {"evmos1rlfquc3u3j3llygrxkhhzaahr8rq7hpguxcppe", "19267320768562085888"}, - {"evmos1rlh7r26m2u3m82zkehkycghw5ah8tv50uj97dk", "729305632754301952"}, - {"evmos1rlj3de8m58smj03z0uel64ap56g26ymjsv2wrd", "281660784306764288"}, - {"evmos1rljd4zlm0w7m3vvffdva8cm9msq0dxug98e9u3", "5542055821052817408"}, - {"evmos1rlpfen765w3uwsdxph8e0rd08z95smu50aqda3", "824674948029088768"}, - {"evmos1rlstta0pm44e25d8exfphsa3c8sm0rgwn0mpwk", "229770575780768768"}, - {"evmos1rlvlf7rarf7lylnh5pyexvm3l5xyd7h0n5scza", "873764892997226496"}, - {"evmos1rlvwe43z9vtn2ktugcgpqyk9u9pzvu0cyn5a83", "8391692105754624"}, - {"evmos1rlx5cdhf8kn9pzq698a4dsudl7nkjwtxgskz9j", "510463053766823936"}, - {"evmos1rm06fnehmm4hnusxs8lgqkzp8drlmtavawrgy8", "354254405013369856"}, - {"evmos1rm2kpjsr4t925mrqrgkllmu3g74ctej3ruatuv", "1165604384887369728"}, - {"evmos1rm3gwc5qtym8zrpdt9v96pv9sxz82dn2ffumzh", "3148740855631398400"}, - {"evmos1rm40nxv4r3786h76eadapqz0hnpecsapy4h435", "7633710779087775744"}, - {"evmos1rm4lfj24pke7stfql9ja08gxuky4xfenhtyhdu", "3437595740742800896"}, - {"evmos1rm5nhufar5wcwceskqgm9rzs0cujh30ppcqlcq", "5031152169971281920"}, - {"evmos1rmaq6e2d9n40sns5cc9nju04w2apdyjnlmzzy5", "121900180292761600"}, - {"evmos1rmltvpcarhr0aq8u7nfyksfmmyjtqt4r0tw0hy", "4821171574433755136"}, - {"evmos1rmqq2cgpk2r4fwv6gh4pm0x6q5wwz7zvphu9pu", "17520523777723629568"}, - {"evmos1rmse49d74stqat8drvgc7t842j9txa0qfe09pc", "1321004854129135616"}, - {"evmos1rmv5nsfrlfemkkzyrl32ujl3k445n5d6dpe4vn", "2963561143965553664"}, - {"evmos1rmzgzpsqnf35gr4pm07a8j3jjcfp58vqzvx678", "712297904309193216"}, - {"evmos1rn0wdpd83sgc6ydrrl5rseln4x4r505he64cp8", "1416379145413435392"}, - {"evmos1rn2gyvhfq9ec8zjgzlsrnjks3sv04j7fw9y2gr", "5561323426770354176"}, - {"evmos1rn95te57f9lag50wmfg25e7ydr2sufa24pfs0u", "35776989975458217984"}, - {"evmos1rndhu0m7xdjlyk7p8rzwgzw42dyxwth0cf32ag", "560874522402304"}, - {"evmos1rneug5u56rcsv44k0smunlsu8znx5xddh3mhj0", "62259630328567808"}, - {"evmos1rnhyzeg9sdsagxsa6uksdxexan9xc7z2qfk77q", "4396969508424077312"}, - {"evmos1rnjcasr0vg07uc5ut63w0y9rnyjver3pnnvqya", "1281404148434085120"}, - {"evmos1rnk7f2ymgj3pz23epq74j5jcdxjdjdm9fkne6k", "2207108356349181952"}, - {"evmos1rnkgcl27dx2efn6gv9ftqk6qrh780aav89vf7f", "397828255946025984"}, - {"evmos1rnpsd96sen6zw5a5yptss2w9fk3eqkjgt27pnu", "798013822648253184"}, - {"evmos1rnpylqp9x8zhx8scancumlnwg5e7hqq0je2l2q", "1574085195928559616"}, - {"evmos1rnvghnn8dv503v3p4v778wlk8t9sasxxxqztdl", "928994304180106752"}, - {"evmos1rny0qaplwyn3wt50ftppcf67ylkfhg6kkzlp8e", "2704821847625322496"}, - {"evmos1rp2vxep48xmkc6u7x7gq58dm3xvxyxlsfpnuha", "573432888517197824"}, - {"evmos1rp4g7728vudww0d35xafpwndfqxxlnadng56nz", "668635009745889024"}, - {"evmos1rp4l4xkphrgnyntsxztarljckdlnyj79zev2rs", "2639567949239733760"}, - {"evmos1rp63499u792pxhwuqev9x0nd72thagkvcdrldu", "2535463584769925120"}, - {"evmos1rp85ffvp507lvl5rfne2puvne0ws3gaecqx0am", "5078466107096612864"}, - {"evmos1rpacnaxtt78t3zef4c4xc944qsxrw08vhgalkj", "4160647943484644352"}, - {"evmos1rpc50tkk6z2jyl2l7hhanhag2pchn2n3rl0ccx", "2423059699305931776"}, - {"evmos1rpf45rxrd4542wwhukgrfkse6y4qqwgl52pglk", "43154026387088490496"}, - {"evmos1rpfm2x8d3c57rmvzh2jp0ldpqdnszrpw7c8sdn", "4184678299453311488"}, - {"evmos1rph0rhc43qz2fuf6ehf9n2wxv3tuyqmp0etkw7", "1672587868962390016"}, - {"evmos1rphc0up3pjvdxmnhjqe92ahce2dfn3gw7g3rlt", "1046769508276112896"}, - {"evmos1rplafzwl9f6z8mnep6253sgjtghhlu96z4gmvc", "42432761244041396224"}, - {"evmos1rpm8v8c9ra2g6hnyt2t35g6cvruvkp6zkedkv0", "1590037451815447040"}, - {"evmos1rpmp3v2xa7nxken8jwhg9l2un3yj0t0upsadl7", "5779948157583687680"}, - {"evmos1rpmvku26ykw6nvfd4xp9dyauejyc9zrzkugkah", "369020854980606464"}, - {"evmos1rpnf2qa2f6ajwpjkp0nx9mmkjmf3ccdlytrfxn", "1423063330167430656"}, - {"evmos1rprhcm5pkyavg8snc8qve5n00y5kzm54l5023v", "978671946090536960"}, - {"evmos1rpsglmcusq0rpgdw2lg5npp6pkryjmhfcld8r7", "1429075155386235392"}, - {"evmos1rpuejqkzfhh87jvjqhu7v37xn6t7kxfmxz3aa3", "5283844263719026688"}, - {"evmos1rpvksslfn59zj0fyvq849rs8gl278qyu900rk3", "1046253004343042048"}, - {"evmos1rpvltxs3cfanl52gdnf9ndhrm2gp5zam5jwu8r", "3533240019892790784"}, - {"evmos1rpwn35zt8efgzxjlqy8vt28qgddt6zau7xcrez", "15915997402748082176"}, - {"evmos1rpx70h954rv6svt4mzqm6u0wx77fuefpnzr9f4", "2402047944270723072"}, - {"evmos1rpz4lxl8cr6dtuh8j05mgzdkeu8nu3fhhrqlht", "136738485217794048"}, - {"evmos1rq0hr5lhh2hlt23fq6k0ulp88lej856wrv8qxx", "522697236711097856"}, - {"evmos1rq0njqfkecpacyrszfvqeg20qummc7jn5ncuru", "13463571198240784384"}, - {"evmos1rq0v0pqurqqjhea339jsgdadjre4cn86zrayq5", "3139370554196452864"}, - {"evmos1rq30r6tq96lpkevnaeswlm67up08t8hm6g6h8x", "5488779436232311808"}, - {"evmos1rq5plf66gutevdggg43d5hqv5zn0jggazau894", "1893855320318278144"}, - {"evmos1rq7pvnfev3jrh2q59q0xgd0sln5kjza6d6f9za", "26791107121227804672"}, - {"evmos1rq7ufr5wdwfay3928ndrw23f8pyrs6t8am3x4d", "7643033024716857344"}, - {"evmos1rq99csrs4spy2yt9llrspszwfte6j7dn265jcv", "2372851618219425792"}, - {"evmos1rq9tmx8hc45xmhf52c8amshrfffxdenxwm5c26", "5133198331661369344"}, - {"evmos1rqa3pmg7afkvh8tat9lnfatwd7zs9kucgs7l6q", "375586051798915072"}, - {"evmos1rqff43z2zdkm8a3apjrwmu3u7zwl8sased4k73", "1576610351895948800"}, - {"evmos1rqgvl8vf2p47xpxp7hefckhjdnhvzmxfezu57q", "1813373462281391104"}, - {"evmos1rqhqccgvf2z4hqgkjwzcy8zvs6g27hem8dusxr", "1295320277428992000"}, - {"evmos1rqk2w3l2tnqzuqulwec3hwfhkejqgymjy0mm8a", "798089900390477312"}, - {"evmos1rqk35zdpmutfjpsqv0hjsmzjunwwvkru2f63qr", "811338691773986304"}, - {"evmos1rqljk52lmn6jq5dd2s4ezkppkwjfc0pft5za3f", "2823289181243386880"}, - {"evmos1rqnrndk8805kda863k9rjfkw5urtwvwvlwk50w", "261529570452463104"}, - {"evmos1rqq684sezvxu805d9hpf4w0p7s6ch37ztrnvmf", "21956326569582874624"}, - {"evmos1rqsxy0kkew00yp2c64t9ec2myafcg33vxfkj7j", "3686560239283369984"}, - {"evmos1rqtkf7hqufkn0ghe90mmu34t35urayd0cy532q", "8646848670699099136"}, - {"evmos1rqu5d7q4jzv0radh450kwzd9lchuulnm74tux6", "415822899737075712"}, - {"evmos1rquxrqdum8unnv2urt8554f94qhrnrp7lxfsh2", "36331278594958274560"}, - {"evmos1rqw9pg4z4h7myxgq06ny6sv4ev6zy5ghk7vmtf", "6762426112697041920"}, - {"evmos1rqwq4q9s4u2ue9uky6x4u3tqt6qcsj8uuekl6c", "2344446481764958208"}, - {"evmos1rr2jqmpskp89mw9an4yvsyfcaj4gw2eldewjs6", "7956138508885221376"}, - {"evmos1rr33l23jagjqnurhs6d9cacer7endk39avatah", "2203923242312071168"}, - {"evmos1rr4nsk0f3s6zz9j327cepe0s6jzjgn52w66rcl", "4178969832251449344"}, - {"evmos1rr63dhtdtart9p6lmq3tn9qgzf6tu25t7ue06g", "4312910945397152256"}, - {"evmos1rra69kpln5cjdy2ha7zvymyy8363usla627hal", "12039634499782901760"}, - {"evmos1rrah27xrcajs2hdcec3lmgjpg4jael3unj3m0f", "967194345178656896"}, - {"evmos1rrd7ygj8v642r3gqeggywmsxlfa9qyma8tgq2k", "1715112725314074624"}, - {"evmos1rre9anedxldt3375sr9659zsaz02aku7nm3fk7", "4740960345078521856"}, - {"evmos1rrhyp5m5h4tsupv3wplrpslcfnfuls0zs46fgs", "4165437139920137216"}, - {"evmos1rrkgl7xy86ygzus6uku9dlpv5jh7csvdxfd5hf", "367126525151390720"}, - {"evmos1rrksclhertd4ejm5ges7xdzqkg0hd4c33ne68x", "497243350684542720"}, - {"evmos1rrkxvwl99wkf8fng0kxft35jza96h2qr3tlnwv", "1671081019928663040"}, - {"evmos1rrmdu3jryj92vksfpswn23hv020ttnwxvgj9km", "1054031449150522368"}, - {"evmos1rrmks3270a0mp87yj87cd0xzs27d6ktnk9gzzu", "17026529904792535040"}, - {"evmos1rrpuffh90zraqz9sqpv679sh5jvzzfmj2858ds", "386052893578983936"}, - {"evmos1rrqfdvg9edeqlf5vfnum2mwlnw3l5rlvxanyzd", "15049609253150185472"}, - {"evmos1rrs07zh3t3aewa3ttmn24xdqsv5r3czjg7t3a2", "4112990679708540928"}, - {"evmos1rrsehkv9s6gzeuwwlfzvhjmj3kg5lgdzqxhq47", "328095514897076224"}, - {"evmos1rrsprasd96ucvuy7hwkmum9hwqvjra52xenlks", "2739503467969859584"}, - {"evmos1rrtckht372zz2cat2tp7q7umuhgk4mmxx8v2h5", "37920374066929408"}, - {"evmos1rrtelpxarp8jtujpllwquyga9dwx9e0fddu7m2", "9615169606352640"}, - {"evmos1rryd8f4zhwj5eeczgg33flwj0l83cjae6z46sx", "385587532297596672"}, - {"evmos1rrzymfv0vc2zpq2w3msudpxlhw97sxk57nxsam", "249818809531039744"}, - {"evmos1rs2kym9l9yzgv35lr9x8nz0gcuw9u5kxfz4mpy", "1962718924620169216"}, - {"evmos1rs2ymmp7dg38p8tzl9urelw46sx3pzlym97jfv", "1607863711678275584"}, - {"evmos1rs57rx0f8rc3y699cxqlemlua3688x294tqhrh", "7098469477734998016"}, - {"evmos1rs9mf5ux2esyvc96729049dv8vc4s0wwklp0kc", "5458340520074711040"}, - {"evmos1rs9rrl3c5fdt4eujqynszgzpvqckq20wyzvwtd", "41684967187860742144"}, - {"evmos1rse22f2jz0zets9afjyvf44kvt9qkrzdmvrrns", "4735531951221145600"}, - {"evmos1rse4f5nkkj0739q6pxuz92gsp4gw3pe86pq4dc", "3762877791473336320"}, - {"evmos1rsewr0mr35gcxmj4vd5vygh980d7qkfnf2pmrx", "2961087513204607488"}, - {"evmos1rshyhf6zr6z8h55dpnknt7dgr0mkzznf250uee", "31318834028909715456"}, - {"evmos1rskpxakfk3v4pk4repw9963h2cwf50utgvw9em", "8448377272244011008"}, - {"evmos1rskyeyzncjgnh6a3nrjrhz6yvlc0vretdn5pwm", "1348346810598284800"}, - {"evmos1rsl8kvauysvfs8w735wj6tsucx4mgqgtwaqv8s", "376077052405582336"}, - {"evmos1rsma2eua4dsjfxdrlym45ffn0c4a5wn2pfm9an", "18567290167095394304"}, - {"evmos1rsnjnqufdrd6fr988laxvh6sr0gxlck88pfaf0", "1455675828518993664"}, - {"evmos1rsnv76agmkcxgcv0ee9es3r4s77g8glk0sfnfv", "3023108235333677056"}, - {"evmos1rsrft8yxt7ht9tl7f3vc42x7rh8gcgjcnad3mc", "5135185797883744256"}, - {"evmos1rst7nnwwr3ts0hupf3utxnhjya8rjtnt0z8zym", "2597137188950573056"}, - {"evmos1rswhvxzdyf0a2q2r8q3dm2nlxhvff5wmktmy4v", "2267904982714710016"}, - {"evmos1rsy3shnwyn2qhy88j3c43c8vpa7nn9cjh6dngq", "3487279768247325696"}, - {"evmos1rszs54k696su6v5u4d7vq5a4z0laeg4zrzpu0k", "308073363418560256"}, - {"evmos1rszyxgs84235m20v83j5nd0yn9kcglwfsc5kuw", "7740447525268992"}, - {"evmos1rt0jf2dv73q4czdwjh7lx3qpgkznz32rj0d9v5", "4626598123398444032"}, - {"evmos1rt3evwhsvgtn5sag57gv97rjywkrutt34p0zq8", "22354117646727397376"}, - {"evmos1rt3xsah8a02twnn5gkpsfcfkg0lqkapauwpee7", "288122070502761984"}, - {"evmos1rt4wf30jtpmfh28sfxnzqxt5ws86tf5l69gnxc", "1695605662594387456"}, - {"evmos1rt7lpz0tfej3v7vwr80j5uugxkgkzzgq9cs88q", "3240732977936384000"}, - {"evmos1rt82fyh83hza9wsq0lc2dr64m39mqhhfr70cd4", "92274560993506304"}, - {"evmos1rtcsq82u93c04vkp487ujx43z5ryg4g43rzsf7", "4229507738004826112"}, - {"evmos1rtd7a5lc9q5v93kgu9lgegnahh85dcmww7nnhk", "1684058412821163520"}, - {"evmos1rtey77jtdcgvjrtlr0pngjdxt3utsmpeagafql", "14263655687326089216"}, - {"evmos1rtftvyhc67sfzxd0rc3a0ahe9umf6m9pn03rxs", "5126021940756938752"}, - {"evmos1rth468phahenl7plxpz3zrsr7krwx8n5un2w2e", "3489723803629596672"}, - {"evmos1rthdjrp268pz7jqr3eyltywfqwuz95jh8mven7", "4541280950335471616"}, - {"evmos1rthnwnlx027x8tekf3thesej76j98k4qhp8mul", "1270906132922352384"}, - {"evmos1rtnarmykv9g72kjvguwlarrmvt5wwd95njx2az", "7575349144144207872"}, - {"evmos1rtqnvd3rxtzr24fhg0xtwta9qc8necrxm294j5", "5168161602968586240"}, - {"evmos1rtuptqvgjv88hjfufyrrp5cpcp4w2hujvu9wuq", "10364882752060514304"}, - {"evmos1rtw56snydljm2pxaj5zcqfjzma2qqz6xjs9fk3", "2598147256172257280"}, - {"evmos1rtwte35an8jw3xrkkph6hpjsg07xhrc76qg6e0", "35460454989183303680"}, - {"evmos1rtxuc2qn43a6g49t3rm94jf2cnk37c89xk53k2", "231287841006302208"}, - {"evmos1ru472rqs8ytzwl44ayg8w8mz7tvqjknwuy7hyk", "838242585295121408"}, - {"evmos1ru7hwf97gr5qaca42y5al6e7wur2kqcnv3yqhk", "5435066395424652288"}, - {"evmos1ru7xrtmeydvvrjtwrl3j3uuaf3fzjmky3g5ram", "8321301688451648512"}, - {"evmos1ru9snaakndn6u6pthr9p7rett3zyaq976xcs2m", "2155287794561163264"}, - {"evmos1ruaagfkn0pjvpjtl7s9w4h6mz8n338ulgdrt7v", "10287821959497150464"}, - {"evmos1rues0kvj7pl9ycf4ysr36crnsm43rfz89mjg5t", "4243557069721288704"}, - {"evmos1rugjpltcn5p79xe0y5g3u3w7j9jg5427ejny2a", "210157568127844864"}, - {"evmos1ruh5plt8wrdzhwpnsfdpmlfrqguwfmxm04ka7q", "8412111761559777280"}, - {"evmos1ruk7zdldnstwfvg3yjc8lj3sh5vccylpdvalec", "3168084333216329728"}, - {"evmos1rukzvuc04g7ktxnv6y43fyf3v9gpaakl3tuw6w", "80550917766379520"}, - {"evmos1ruqsn5cmp3ejp75m94fn4wjs7t85mv3shuve7y", "3833837634244524032"}, - {"evmos1rus0nlekczsyp3lljr7jp657qlvtyngn8v6tsy", "4853740121647038464"}, - {"evmos1rutz2ckgx9fhsx6ejp6afxnuck33nkta3unqk3", "64337000842147584"}, - {"evmos1ruvgtt3x93pm66ph0sdcl3pl54grfxvxyvlpde", "2842194225837283840"}, - {"evmos1ruw64wvraqvg5xmy5vgl6wzsdley3fdl6n8h9v", "1545522562947764736"}, - {"evmos1ruw67eunxtp820espxhcl3c87yhwqgyr805lk2", "4776247775855724544"}, - {"evmos1rux4envqmx5dqvgp47uwmfsyqpcvy72mupkesf", "5638635389587254272"}, - {"evmos1ruxelp6pd7p5x6t0l5uamy37x06gz9tpsw57tk", "422231969864615168"}, - {"evmos1ruyvephtgcvxd6y50ygpae4wnz8as66dpkdg6w", "3441714332837953536"}, - {"evmos1ruzejqg7n09q23k52uwadr3k47r6qnj9cn6ktv", "2370245139659190784"}, - {"evmos1ruzhj6cpa8nxxm53ps96arar66ghxy0g66esnc", "383554017102584576"}, - {"evmos1rv0as6zf0gzkhkcp4uqydhgmxevqyks8ypw0xm", "7734960005393362944"}, - {"evmos1rv0sh9q8g2vn7f8wt0gf3lc22edkerhe7gz35m", "951203259821363200"}, - {"evmos1rv3atq0kddj8ksj2clmr734dueq2ax6fse36qa", "1164754833205058816"}, - {"evmos1rv5jwnuh6avjg9eve2wstkyw6lxa786p8y6zy3", "540894437998919424"}, - {"evmos1rv6ledv0tc0z5shl3endmatyd9n2huyvcl3zfq", "1227351102091792384"}, - {"evmos1rv7tws0xlzw5v5hes6synvxh889zs0yfxw652a", "385838696881603584"}, - {"evmos1rv7xf923trmkrev8fsspwfhlr67tspqw75ekxz", "818517578081537536"}, - {"evmos1rv855cf7svh5m2cq90g9c4x83w05r0emxn64uf", "401884815999685888"}, - {"evmos1rvctw4ye7gjgc99xk9eqvt8zzjdzx9ulkn90kv", "1394408211838390784"}, - {"evmos1rvf0at2s9nuthvr82x5wx3xn34yy7khagcka5g", "1068370714836769792"}, - {"evmos1rvfu5tt0zfq87fpsardy5vpxnv3w7paasxk3cm", "1585715903943639040"}, - {"evmos1rvk2u33psn2f5f5ugwasp5cx762jd539gph0wj", "28391221614894874624"}, - {"evmos1rvlk7wj48ny5mrjl0m8uqlxjfpdspkhdlnmkav", "2300972688752467968"}, - {"evmos1rvnqr3qhmn0sxn7x3zu3939255h3ge6zlp0l6v", "2239076826889441280"}, - {"evmos1rvqx98yxx2rla3v24mnw9nr204vqwpaa208ug3", "23441753669734060032"}, - {"evmos1rvsahf5qvwcmk00xrekc60rxe7y6p8twhctfm9", "6764289346714337280"}, - {"evmos1rvskmknlknjhq32rfuu94hsmf55l09xejljqgl", "5008876769971761152"}, - {"evmos1rvv05y3669klmef0suz5q5rury4f7xdd202hhz", "1606796637878427648"}, - {"evmos1rvvdf56fre425mvgxcq9w2c9wwjw8xv47guphc", "62313183700541489152"}, - {"evmos1rvvwya5u3u5mkczd29lx7st8s6ddhz9trf0e6e", "17710985707055976448"}, - {"evmos1rvw5rkd5vpzlq7ha0fgnhww44tlrhu5gujmkaa", "3294265614846687232"}, - {"evmos1rvxg88qaeczy2mtn80ta9unmrlqgt2hgl0g4pu", "19337225503835906048"}, - {"evmos1rvzcx8klsd00t006cuqt0l3qd36m09w28zcn2u", "5593316748443222016"}, - {"evmos1rw2j60475u472t9eah0afvfn5tsx0tn6gr9u5q", "4098791004528569856"}, - {"evmos1rw80nefyf8vpstnln3zldlzsekp9ml2s44male", "4423653543599308288"}, - {"evmos1rw82asd875ke43attu27gfraeqyx8z5czkty3c", "7200860626362440704"}, - {"evmos1rw84tu5ka0a8nnf57eaqqzxuesz87shtrpu8ne", "686100941140439040"}, - {"evmos1rwd4vzwd4vptc2euu3v63nmavt5lt0vsgq3qps", "6906837408621101056"}, - {"evmos1rweeatmyjjnf9vcxkl8z4ycn295xnqzvx3xm27", "4623891720712060928"}, - {"evmos1rwgp6dw6a6s30yexjdcgylhs9amcjqqxl3dusk", "779966507510222848"}, - {"evmos1rwk495qhm0vyqz4kpcyn095p3nr9vt2a0wyax0", "73572590686329176064"}, - {"evmos1rwmklfxcqad6qsw6neaenhf3nhc7aqjr49kks0", "4053008710774903808"}, - {"evmos1rwnpn3265ks9yl0aeuw743hrgeqwtsk839sczr", "10546941448444452864"}, - {"evmos1rwpjg9nefkmgesea89r2fhj4mn04u0gmrvu0hg", "807641852731899904"}, - {"evmos1rwr7e26p76cjwpqntdd8dg8q08z3q85dfdywsj", "10013861211874543616"}, - {"evmos1rwwm48pkwf8jt76h4e32mn2a85qalmynrncwfg", "2118098310180550656"}, - {"evmos1rwygpuded2p92f6xecuj8ttzq33adllh58kee4", "3569588307323453440"}, - {"evmos1rwza0khtxammwqsqq8p68esffatezyzdnqzqwl", "437101557945906944"}, - {"evmos1rx2ss89es784an0unhverkn3wdtn3gu637ckf6", "1471460373630492672"}, - {"evmos1rx3au946jchgtjzjdm2r7jpahr74syf8h2f8mw", "30004217861474074624"}, - {"evmos1rx6stnjwxgma0h593qqljqqw48cfmq8j0chewk", "5012999925499921408"}, - {"evmos1rxay0qh04hgm7dy7s73rx52lynd5j6rgze0msf", "22066199675620409344"}, - {"evmos1rxczjevtt6pyl0rkx7gn64mjvdrxlq7qzdrj50", "6695793542663802880"}, - {"evmos1rxe09p00uadp77zg9ggy6l864drk3ra6npjzmv", "711068457216545792"}, - {"evmos1rxghxjfgujlmfrzdlw5dlc8spl4sgef4s0hlp8", "433795648026817792"}, - {"evmos1rxky3t7exrdsvdnuzq0qgr6z8ngk9y5cpm9zun", "13612209962609901568"}, - {"evmos1rxm732r6t29fmhcgvy4uzrulamxn0lj46cc002", "20203531250087739392"}, - {"evmos1rxqyh906f0p0hjw53kaac2f95e08lx7ejawjvx", "1357568039773106432"}, - {"evmos1rxsez9glde5upm0wuxg2qz3jkwv5w97njw54vt", "1294617380205035520"}, - {"evmos1rxsnhx0pqx8ahfc3kfds5f0el0pash2vn7m83u", "3349254155040031232"}, - {"evmos1rxsrkarjm559vlkv6pqrvdg9kmxnxm8wde0rfl", "2172157567285178368"}, - {"evmos1rxtl2y9zr6az3gsaxktumk2d6fpgyysdvg73fa", "6796938410824347648"}, - {"evmos1rxvddwqnc8sjzdd6seqfmdazf5d78sf283facn", "109254459236747100160"}, - {"evmos1rxw8r8yrmqjx2ktspsq0l7xdu9qc9cvjc2yayn", "25094323763727650816"}, - {"evmos1rxze3rszyj8gqaajsdsqzz3e6lszp72htr8flp", "10027968959568363520"}, - {"evmos1rxzh722wwhj6evgn93u5jh7udk22myjm2qszlk", "37480444598113189888"}, - {"evmos1ry0dez7uuxnp98dn65r3n6ehrnpll8gzhw4taw", "4724916483882032128"}, - {"evmos1ry0fnka4xqnudma4z2tj5gpxl9vfe92xkpzxsz", "3009002549237776896"}, - {"evmos1ry60z5xccy6zl7hj07z325je24032s6qf66ss4", "20791644953800921088"}, - {"evmos1ry63epk9a0tdkwvmvxvpctgxryf7h30n9kdfp4", "5177689573479477248"}, - {"evmos1ry73uagdc7rs96wcg7htz9x84uv6c6q35jua6e", "2591007105222557696"}, - {"evmos1ry8lgnecnk9e6z87gjeph0rs676c8dvn328r8h", "2257698529246625792"}, - {"evmos1ry8madjqfqxwwpklxhr2dfg42saq0xmzd6htpy", "13946814516798208"}, - {"evmos1ry99ytysyfxw5ca74l8axqcmxszdgndc6jjw3t", "157674817492865024"}, - {"evmos1ryaxhdc5xhqn8rzrl3w6u0eeqlskmv9g3ucwru", "1422120512716767232"}, - {"evmos1rykk4y2pne3mcmut6zjrhazxfnl4jeahukgcz3", "5395041246554689536"}, - {"evmos1rylj27j62nn3lklhgpjann0c96z3wxpw4f7zuz", "13014543552820232192"}, - {"evmos1rynzl74hlkkdazk06wz85402enqfmv05edzm0m", "7929696298707550208"}, - {"evmos1ryutgtldupczwdxrvksmln3qdh4zvn2q43tw2v", "19156669361755631616"}, - {"evmos1ryw4gjgl4gdhchez2df33jc4ggtfy8s0ynrcz3", "100115644990888960"}, - {"evmos1rywa4wwn5ud5tp5vjnpncj94dzavva328n5cvx", "1493061582472640512"}, - {"evmos1rywr5yyhwqgqksu3ynp4nyqsxkz2vtcayuy8cr", "2187613866630189056"}, - {"evmos1ryx7httz2fvd4e3n42fdynfjm3r4s04rydqlp9", "3095444960320526336"}, - {"evmos1rz2h5kz8hhyr56am7xda2rvxsfuw4hq3jgrqv9", "385971255853383680"}, - {"evmos1rz4cavvfg8mxtq94adg9x005wzdawe4eqzza65", "11963623402106953728"}, - {"evmos1rz4tkfsf7g8zljpwnx8h4mnr8gkmt5geh23xep", "1426715218819219456"}, - {"evmos1rz555e84g8h57ksx2v6e327falt432fxk30wsz", "155337839923806208"}, - {"evmos1rz6nslwuw3jdxmphq88t4mc2rnqkdywmjjcyuy", "419269902637344256"}, - {"evmos1rza0cd9tc9sc0dvgwapv8kk9ned4r4gfavcayy", "13039829558951628800"}, - {"evmos1rzc2s7mtvecj08adf9yt9pl9hy6tlnzl8t8v0r", "1413590309431994368"}, - {"evmos1rzd3aku62zzank7dlw8h75cc298ezf0tk3vuz3", "81073492381770547200"}, - {"evmos1rzdtrnn2lcg8xp89uc8wg0ts74ejmxwmfm53a4", "1211659613596723200"}, - {"evmos1rzeqxcy0cpkg7xp3psm2c8zyc779vj5zfu2smu", "4178638242749546496"}, - {"evmos1rzgrjxnh69c8e2srzd8k76aclyfhmsaxtwygz3", "1280825504018633728"}, - {"evmos1rzjzphadj9pedfa9l9e4l92530vm8smlngt4v7", "9631203114818547712"}, - {"evmos1rzk009a5s4t2e233av5dzwu2wtfnn534zwfcal", "327467040806256640"}, - {"evmos1rzkm0st52ypyecqsukm4twhdw7qy02fz954ptt", "410858882316128768"}, - {"evmos1rzkqanhqs7ksztgpcrc34xnqwl078c20nrthcn", "947253947028637696"}, - {"evmos1rzl6w3wau0s35zzyt7t2wgcp9hxswxpv6zfljd", "3698175460286945280"}, - {"evmos1rzlcla99ukeh3zsu9kfedw25a4t6l2yzrvt4tc", "253500310393285376"}, - {"evmos1rzpacd4646476fg2g3e8flpler5smltg3nslf6", "50681492684919808"}, - {"evmos1rzsglsaa4xdez6avv09j28kzu5cp9arfpq2v9n", "21040479501555781632"}, - {"evmos1rzsuv9fh660ls85n8yp0rszzn5my5d46jatke6", "469318794085573632"}, - {"evmos1rzswmemnqppnnfx7jd79ktnkmsdkmft26tehux", "825387413922576896"}, - {"evmos1rzukyw3s6xxzy2rulvh9k0dzvdx3580w2qqprn", "22096734044214870016"}, - {"evmos1rzx7tt5ukvwlf4dqgl37wxzuqz7kyxh2qghyuz", "210568914193396736"}, - {"evmos1rzxakd3ttmzl7rwrtymngj3yqlgp53nhh8tjen", "136831940215172202496"}, - {"evmos1rzyqwh0mgqtcam4s3xkaxh9qcnw33s7qzfl980", "425588765702559744"}, - {"evmos1s00hfec3gpumnrnfpz0dehydudmlkl9sdmpa94", "1721165241084441600"}, - {"evmos1s024nwnpcrqp4v277tj74fzr8cwwgmh5qm98m3", "10359157269377171456"}, - {"evmos1s02cww2yt64jy2smz63l4xpe6pefkerrl3y60p", "2711839071598894592"}, - {"evmos1s04vr9sjexmw50skvu259zxs4zjmcwl4kymxhd", "2606967306650419200"}, - {"evmos1s05mvej2hm8g368k9ydvm9haslmz72mh9jfxzh", "911547982824205824"}, - {"evmos1s0678047qfp95mp0hlvfzh9ny59krx4wxpxjx4", "1325276383796844544"}, - {"evmos1s06d34tj0hq5k4zhwdhrwgfwp8fw54suf8vhhf", "2624356978713255424"}, - {"evmos1s07dxn8yj0uvfv0gf6jug4u4nsasu8wj66sk46", "476838920106519808"}, - {"evmos1s07tq7j2t75spcgrkc8xkq0hdn63t9jjxpgqvc", "904047013763462656"}, - {"evmos1s0ak6a6rt6d0dy2dna09zrwwa2w80agwear2nh", "142172202369001216"}, - {"evmos1s0ca2wge8rpee5k7jkveu97fwcf24s37pmphm5", "6517223785916448768"}, - {"evmos1s0dr3xj6hsdp4yw7dadnzksqcl4kqzyxejlte0", "23534991509875589120"}, - {"evmos1s0e6hmp2wusqnc5xarxtahu9puy2jfkehmhk05", "585801842092755968"}, - {"evmos1s0fxukhznuaavph862xh007hcej5tpsqlx9x0w", "33696304580193468416"}, - {"evmos1s0kzqtxlq3s5v9vkzf0j44m4qdrva972za8ja7", "3181464630437629952"}, - {"evmos1s0nuh0x3p9g2qemhlqa2dmwyg8qedz4ay5y6f3", "2973729514507796480"}, - {"evmos1s0nvvlt9fwr86f7qpmpxj95688fq9cs25feyhf", "2282056365704911872"}, - {"evmos1s0pvkz33saw5sr7qsfvacptd5cesnl3ljhvh55", "868518135512506368"}, - {"evmos1s0pyw25qul7xg7q43ld9yelnqqhlasal3lwkf6", "10869147199111913472"}, - {"evmos1s0wr74z7lusf27jzhgtfzt56lwfhh6egjcd0lq", "1373508822786454272"}, - {"evmos1s0zt5tscmgepf9smat6lv7pwy83z88qpygxt5t", "4255199093556703232"}, - {"evmos1s20zhptvwzak5kt2tmansd00lyfz3fq3l5h666", "13134097869101674496"}, - {"evmos1s228zg6yge2ad52gq60gyg7fn2u00rahmvqsjv", "20310796172512272384"}, - {"evmos1s279el4aa45jugzfuqqj40maphdnjnsx0tdc23", "5519840043666274304"}, - {"evmos1s282qgc9wf8627khksusc640ar3sj2egcm6rhn", "896758172899666688"}, - {"evmos1s29ee76u3s9rpscgmcvpacdh2p7x8af32qvlxx", "10493323706062209024"}, - {"evmos1s29qvru5easjs2t8qcercwpu9lsgne56hzgsv2", "181820304934744064"}, - {"evmos1s2a4craramns4hgnrnt6sk3ys6sqhw7svyrgdh", "72860076824936792064"}, - {"evmos1s2d6mwwc2c5vqaxmypjp3m2ma7hvlmesemqc7r", "38776922875712585728"}, - {"evmos1s2dj7vjqu5333scnnmuuwrgrw555es2kvh6ya0", "34119256292694507520"}, - {"evmos1s2e3v7zqyz9d2gau3nnrdktsjf6wjft03kcx7k", "3339441096084815872"}, - {"evmos1s2eg4h5hz7z0remp65dk7dwg8f9rnwdu535ctj", "1559452269059981312"}, - {"evmos1s2eh7t0cr49m7rc8rhz5y2cx02s7frgrm9jyuk", "563915366347331584"}, - {"evmos1s2f0px4wzuflsn5wcpl6fntysexkwmfnfkwrv4", "636158825688823552"}, - {"evmos1s2gnm8l8ptgadmh85s2pttdcahurmw6s2ht65c", "900559528122144256"}, - {"evmos1s2jpw883n4vlcpqhdeklks5hs9v25k9h6qjghf", "1396959266052497920"}, - {"evmos1s2lp4mq29jzwtsl5dat2mhy43cjzse3f9rh8cp", "1099252651791973376"}, - {"evmos1s2sgs9sxv378tm2l2r7y6jrac72yl0p8xtc5w7", "4106005514610180096"}, - {"evmos1s2uf9e5djdu9gr4mrlcfcwgkqmyhc98aqlk62e", "415093160595909632"}, - {"evmos1s2umupcw6mswmppp0l5lt4ejkzxwthdp5j7ccn", "3621721575976107520"}, - {"evmos1s2up0n8z6e9e7k9hw5pprcqfc83724qadc7cpp", "2999180937951199232"}, - {"evmos1s2vv56xaz3l5954n2hfjpkn32cw7lnfpp506kw", "981193830852821504"}, - {"evmos1s2vvyqghtw64825qkky59we7e6zp4w6k5x8hcn", "3025892950858938368"}, - {"evmos1s2w7sza8wetm0elh3lrndrz8n0r3yuhjypd2dy", "4212975495795913728"}, - {"evmos1s2wzajx5sq0ak6fldjqh7jfyx74h3g33wre4ff", "1302447745457909760"}, - {"evmos1s2x5tlusvlm66dkgs3yaxlqcwhwylkezxkrqcr", "781862697132907520"}, - {"evmos1s2zanf224fdqxh7qzl58zpjx4h3js7ut7vp64c", "629224387097559040"}, - {"evmos1s30djusm9zda46cp53ckppy6m6gzw7rnvfqg4m", "624111651127323648"}, - {"evmos1s324ezrp248mahqxkdzy59qspvkk44ekcqcl2y", "1275720211146465792"}, - {"evmos1s32cftnjzw5a8rt2j67006ny6h6hx9t7w2a0l4", "1044260972976093696"}, - {"evmos1s372kmxuwh62y9nne0szmue8rn96xj948t84w2", "1796857094142427136"}, - {"evmos1s37wrm4gdtru9r0wtca3dhddm8waypvxgu63fe", "674947914616485888"}, - {"evmos1s3c5dfqx3jnxjs5qfyap6jxw5u0kquww0vsmwx", "6338073416125448192"}, - {"evmos1s3h7rxqh54t2pxapgt54p0ggqa58yurhx2nv4s", "10510791339792250880"}, - {"evmos1s3hznk4wlk2f2d6g57r2al503k9wf7dxme8zlk", "643532448977272064"}, - {"evmos1s3lkhw24ydrm3j7f6kpvc7qc90ktkvkadl5ket", "1528794135056751616"}, - {"evmos1s3nftrtg0u7s2kta83glmgcjyxfum20efmn05x", "2613888826891226112"}, - {"evmos1s3rw0lh47uacx8ye8v8axh8hh4d0xz4v6k5q3v", "665857962361569280"}, - {"evmos1s3sjatyaehtvqvj07c3yhe7wptvwskkpygtfwe", "7837206405477269504"}, - {"evmos1s3tase3yzjw34zm60qw4fqhrmz0cpxzhagrkw8", "1007838850292813824"}, - {"evmos1s42j67d3f6julvx4nhjgmcxf74xfph26gjwpv7", "39090687435355209728"}, - {"evmos1s44hvt2xya80r45kzql9lv409tlwj8kt4ea574", "5201531181056032768"}, - {"evmos1s44sxql9rwwtdpeh5t5atffxp4am29wyd5x0ra", "8205553081244008448"}, - {"evmos1s4743p8ugt82v34avtxgf7qx46u69tn0m25g9k", "708050316315176960"}, - {"evmos1s484qhpcpv0nqhgplz9kx6dcazvgq3qdny47qs", "1177716316182779136"}, - {"evmos1s49zsyq33dy3eyt53g8caffd35fh86jprsf0dr", "3519839204015653888"}, - {"evmos1s4aqas2m7u6hj50gzycwcyckz8w78qv7z8uq7v", "1325708267297370624"}, - {"evmos1s4c7kt6chqnxr6ges2p5d96zf4pn0xvm2ptk5u", "746622602094222336"}, - {"evmos1s4cewyg086erxhjys5d3w0jc62ngas7338l3wh", "1478741863802286080"}, - {"evmos1s4hytn88w6zkylddstcdr43usepp2tkg8kw8hz", "281853727721272320"}, - {"evmos1s4k3h9vf29pacsurn2p2xsmfzmwtzhtktucpv8", "656799862869994496"}, - {"evmos1s4ky9nelrpe4axxpnj43hp0m5tjyf4qpcsx2y4", "20904079451408326656"}, - {"evmos1s4lkljgdwywpgyh40u0jjd7mnthkvgkhv8zql7", "1530176440970377216"}, - {"evmos1s4rhdg7pzzgagtu7d3x9r2atvhjpvjet4ydf3p", "32904356116846456832"}, - {"evmos1s4rmv45xrmux6nlyrqg56uzxmtzlavj7q7wj8k", "477355777575853824"}, - {"evmos1s4tnsnwwhl0vc0z9kehm9zwgcmd04u70ld8de9", "404034495648618752"}, - {"evmos1s4xutgfzldj6hmm74nntv3acfv2nvjx5fp9wg5", "1039155207662274560"}, - {"evmos1s4y3za3xplrwqlr465r5u3hdmr0xjlg6t5sknl", "2894509018498493440"}, - {"evmos1s4zrhcll5dkeplfwhc9fk7mmgdlnngmdq0z6xe", "512591253523954688"}, - {"evmos1s5394mqw95ahakp8ylzp47hhln5cx22qylv969", "56674219719652096"}, - {"evmos1s595c007x8st03d6vcp252svxtfstc9ajrdk6j", "95667362628239687680"}, - {"evmos1s5fykackth03xz78ys0c3d2kd6dcty5893rwf8", "862550315019179008"}, - {"evmos1s5h7wn29caefz6prhzpxtss2v33hxkckac4r07", "2184066271529960448"}, - {"evmos1s5ljsvv6dqy7t9qddjfz73sy2m425xu4cfhl2w", "432424373842703104"}, - {"evmos1s5pa0ejqpyy8y5w3ksel4lr9yq70ruh3ap2xjp", "324306288159948800"}, - {"evmos1s5pje2qu9fp8rg0z0qed6wpw9hardqqv258r28", "58249620139677696"}, - {"evmos1s5s8gnuuhekalx5h975qjv9vp8pgurhwnzn8vu", "2108884674149521920"}, - {"evmos1s5uceqp005xughttms9cealuckvrr059ydydv9", "3302598771349044224"}, - {"evmos1s5w3v3xu7lpkra6w2daenwr6m77nacda2hxmtr", "3993916563834738176"}, - {"evmos1s5wnazaze45e2gfhdh768huacjmgj5t0gza5wg", "12521217427107956736"}, - {"evmos1s5xa0h8j6pnzmt2rmpw60kh06vv85q8rrjsvln", "2741302834738610176"}, - {"evmos1s60hhnyjq234paa2w4dz0v6mefkp05jtzkfx86", "477418001501796864"}, - {"evmos1s67srptnfawd7509nydt0qsayt38f0v9v46l0y", "8348117420960872448"}, - {"evmos1s67vayq2sfcf69u6xle7wqu50y6da3u2ztyswf", "3693579367408500736"}, - {"evmos1s687z5xwfz9fy8n8uc4xfn4hrnd232wtx06ywt", "1658518315597643776"}, - {"evmos1s68cs603exntgnyp5k2ylsx8u5anfz8swhflhx", "384498519150480128"}, - {"evmos1s68ux4ey58833r04ljhpr3ceu9uamaygln23tg", "80074424329717710848"}, - {"evmos1s6h0sev9au6g0eaqwalzz8j9rza4slw6cjhasa", "2305456554244084736"}, - {"evmos1s6kqd9uzqcs3e6wrgxsw42dxjn0krssx05ppye", "6190259235606775808"}, - {"evmos1s6ktw8qaf7ygt6lep2zg2lq05ked7xw03p5cug", "3907435798993379328"}, - {"evmos1s6l2c0y3yx30kaw2h5aq2ml80cge4p7tyxl777", "102992243246075674624"}, - {"evmos1s6mttsp5anack88z3gvncxu58wtvfe5a8a30zt", "3490235397496539136"}, - {"evmos1s6sdew2a05sklx635hgv42jwdevpjr4lpgxeqc", "1660823480336974080"}, - {"evmos1s6stagqvdk4xv647n4kxknccv4xr699zvv9wy4", "807245320028810752"}, - {"evmos1s6tf20ldaqv7yu6fyn72nk36tc5a4sgad5hz03", "1623396475259223040"}, - {"evmos1s6tsr286euxd55ptpyy80p72f7huksl5nkhcps", "322102913478262784"}, - {"evmos1s6txnunjxmnmrku9zl7fa4v349lqqrqdx2afhv", "155898415796548096"}, - {"evmos1s6w487wgw8p4kzzqcenj848kyakwll8c3ckglq", "54092301973390696448"}, - {"evmos1s6ysfvtgrjntp3trv0c02lf4am3khhtrcu88me", "2716755439813828608"}, - {"evmos1s6zrc69a0ekw4qg8cv82advjuqujra4452qs0l", "4832071210852407296"}, - {"evmos1s70txg5slxhv6nqkwqsaumh8fhjxylzt9z9jvw", "5783436295285010432"}, - {"evmos1s72tadp33d4xydudjaf5aea0ucn3ecrwmduddf", "101228722008548096"}, - {"evmos1s75cd9aya2h9jptdeunnemptspgz5khp47vj8a", "467170677092798464"}, - {"evmos1s76h4jgymtrnax78jw84zrkgp4cf2xs8wr0hv4", "27578640518334099456"}, - {"evmos1s76hnw0ggghlm64jgsh4dhm94uhkhv6vn8eaz7", "238926498088742400"}, - {"evmos1s775qxd0xzh53u5rl9d85qu23jlmgkz4sfxzxr", "537696064812288000"}, - {"evmos1s790a0qafg8g59sc3n8e2f79rygzfdmm2q608n", "7132374152033878016"}, - {"evmos1s792cmh2703jqlg3wgacyrtwkyg9l2yjapsrq8", "536126390038764544"}, - {"evmos1s7a87ujeat8k7r3xlp388ffx2ejvxgakggfzsx", "6844152963336077312"}, - {"evmos1s7hgmldymngwp8h54ey5f2g9lmjnw0cydknwen", "10061023188341784576"}, - {"evmos1s7j7pw26mm9cegqmhpgn20u6hy5nt267msfq0q", "180296709646903296"}, - {"evmos1s7lh9l7jhd2f8l67gntle6zphas7cl8324lm5j", "42623836152442224640"}, - {"evmos1s7lrfu66606m6sd7uwmyrtjwstgcn2tx2fvn5g", "515282929021835776"}, - {"evmos1s7m8t6fpngacwr04z3yjdzuv3s3yr0cvuynp9p", "59810966737469784064"}, - {"evmos1s7mf89qxm9r4tuy9s88sfkuqcz0qw3wky9gdr3", "313154767643211264"}, - {"evmos1s7nn7hun5k248h7lqv5jucnmjxtgp8azfqclwn", "3033182507111014400"}, - {"evmos1s7ntud2j8pkv2fn22ktv3qpz6lv0f25hunhvcm", "7353225248158844928"}, - {"evmos1s7pcg7eu270anq58g5a6w7lmvuh7c3z5c52j84", "1373933982576336896"}, - {"evmos1s7peuqmccckcjck8vunvlhvn92t77cn25nce54", "2534360391828246528"}, - {"evmos1s7rfkes6hlemk08ql8n40ynwzsa6fulejwp4ty", "466952216030309888"}, - {"evmos1s7s3g36nfdhmdtez2spl7a2anycgnzyzmgdfuv", "1384885494415195136"}, - {"evmos1s7sfhmmhcwq6m38kn5f2tyar5fsyky73vcgfdz", "1321699436704916480"}, - {"evmos1s7tc0dsxgfrt8snz0raan2ej5ze2ep4mp9skv4", "7308678551722584064"}, - {"evmos1s7vy4yaatqtpujda8jkv2hy46x9k354r4ufv2p", "40895891136167936"}, - {"evmos1s7ze9v03t0jmmha7y6g3r07rw04jjq9xcymhmw", "4843426818940932096"}, - {"evmos1s805lfyhjj8tq624nv42gmy55r86kgxgqrhy4g", "1032718843179397632"}, - {"evmos1s82cuxzys36xw9694wc35vad7npz44w6nc8alh", "4414354983723689472"}, - {"evmos1s83asmkyvt0xuhqcn5k46nglmgggmufpcwjtse", "6455794706130165760"}, - {"evmos1s8454yknr05zy0sycrfvvs50z45xa04vg2z2dc", "775888254925982720"}, - {"evmos1s846s02zda3z6en6mta0guygwjqlhm4yaylkn7", "2406566982986211328"}, - {"evmos1s85fwcmalxl4unwrvmgjll7ty640wy652jsf7a", "65537010594203392"}, - {"evmos1s87dvaly7nzex260ml92nkev9tjpwzc97lxkmr", "19727360766655635456"}, - {"evmos1s87j04kyjatzl9g0ushqn0xv248lq58mhmq0u7", "1310912246917390336"}, - {"evmos1s88p82jf3rlvn3426n00uv0pv6wxnht9l0huur", "2126135609643089920"}, - {"evmos1s88w93g5tpp3ujgpsvg75nmpap5lpf857hdtap", "11137585825471883264"}, - {"evmos1s8aqeg3c37zh9p5n4ufscnfkzzj8vl9g2algm2", "55004816443855454208"}, - {"evmos1s8dtaufm03xmpp9m5nw7phazxhnfzwhuc8pqua", "8994581790909176832"}, - {"evmos1s8fewu3vucn6c98093sl47c0mqja529m44c8mv", "1751735008542310400"}, - {"evmos1s8hnu3k5gnt277lk3g9vvnc0aylfk74xnkjhw3", "142234471881121024"}, - {"evmos1s8hwq859fmytfxz58kwztphx4h9rugqx6n8f49", "196371754010636288"}, - {"evmos1s8k3p05n7utwevu0zgn5w43jamhhggzdzy5vmy", "9136584098406952960"}, - {"evmos1s8m0ttaefqth6cryhpvgcw59u900ryn9vdfqkk", "5599496393322328064"}, - {"evmos1s8q0cyd427026h8msj86hmzpxu6nezawnh0n9l", "10460119828944019456"}, - {"evmos1s8sfjlx2nrqnr79mcy4p5qhuperty3t8su8vqa", "801523849197355008"}, - {"evmos1s8xl85s5xcprdqqus3dznprgmalckmplj4g3ky", "2312256820029197312"}, - {"evmos1s8y4z4y9xrkvlg9nh3ge707cr76r0egjagf896", "1515062606708273152"}, - {"evmos1s8z0pr6se55p8x8v37xwu2jrhukrf6w7t3cgry", "2937491384789293056"}, - {"evmos1s8zhj7admtn0ylmq0s2r2nxqfch3wcel49pwg8", "62398274734294016"}, - {"evmos1s8zsl02d5peet7w0en85agatsskwwsv45zaeje", "8155439629997925376"}, - {"evmos1s95m7ph0t7lafjfs5xh4cvpc4awr4jgkumj0ap", "232176176463276032"}, - {"evmos1s962g3gjc48krrpckdavqd4n82c5lqxvupg9zn", "43435241852581920768"}, - {"evmos1s97xutf6kw4eyy9pn6j8kfx9yd6satw9pp3u7n", "85350899629160923136"}, - {"evmos1s99sephpllxh9wrs599vnh0ufm3dkkehfs5ffe", "2280124660764209152"}, - {"evmos1s9a2mlvz06pg7nmekjyv6yjtq6yp7mt4wfpeqh", "2239298028504245248"}, - {"evmos1s9a3ad4c0mt65h45pu9rrmg2n3gqa8f6jpquza", "3093529090292890112"}, - {"evmos1s9fwc5fltdlsga99a8rsusm6lgpfygqee68yqw", "400599327134849792"}, - {"evmos1s9gs0c8fl7kqjmfue5fcneteaxphfzn6s2akkw", "1588315273102794752"}, - {"evmos1s9j97c4s0kzqnux8vnmsrrwmnxky6y9gf26tew", "1402414558578036736"}, - {"evmos1s9jwn3qstz8f09j3d8c8998xjapchpmrncphq7", "1067797777791313920"}, - {"evmos1s9lhm7npcs2vc85aea7n9z3vw556p7srxff5p8", "209802645211968512"}, - {"evmos1s9lp0gyemvuejrc645pg3702ycktpty6zrqr6m", "7394750073182994432"}, - {"evmos1s9lqyu3kpmf6kr5hqxapvndzm6urrz036hk43h", "14028966992112615424"}, - {"evmos1s9n42lzprvf3n90vf48xm42uu5serpy9tch7dp", "6535754951638327296"}, - {"evmos1s9qnrev3hawncqwexsaeeft57jnggq9pd9nd75", "7628166280118018048"}, - {"evmos1s9s8xre2zcn0fjy9xhe8xnlgkp69aldlqsklmx", "70208830198863360"}, - {"evmos1s9sge4rmlmec0r26wkqflhc7c7wngjh5evlhzn", "368923373771700480"}, - {"evmos1s9tulgth6r9c8h7txgw35hv9me4mgz6rgqnm5y", "18068523239028174848"}, - {"evmos1s9vmknpe9sxeqjsrw2fndqlkpneucncsxy2l0q", "1281686510604054016"}, - {"evmos1s9xa4hetd6txslye6e7zygc25ycm76dl49qc38", "2677159142176755712"}, - {"evmos1s9xa778fej2yz8tgvd9tdzyk7a6fuymfygps05", "6457063909932101632"}, - {"evmos1s9xupqzg3yp4n7u3xsf5rdly9e59ldzx9nfkyg", "1394644046727603200"}, - {"evmos1sa4f902fxxm0zlxmw0nus8h8hkanz8yay55kpz", "130463591704661475328"}, - {"evmos1sa5qtdwkd3rsanjqp88qf7fmsn2q6g48qmytak", "270841012823717888"}, - {"evmos1sa69m4f85vw54kvhmdq0zem4734rpzranyv70q", "2315710219996208640"}, - {"evmos1sa73jrqu3n0awr4hme0phnlfu4e6dws5ntekt4", "712166199067290112"}, - {"evmos1sa8467fevjyw3vjjjd9q7k7xw5g7n34sh7ww5c", "303276125697762304"}, - {"evmos1sadfyvx97u8wae5yh2ntxeanwetv9qf3djvsqc", "63100325948378624"}, - {"evmos1saj07p43wakde2z9vf3vv0t2zrgu5qus6sj4aj", "23987033521102323712"}, - {"evmos1sal5y7k9ywflquk5zqv9hwwlx3c8an5xa2nsp5", "342205404458298880"}, - {"evmos1sal6zn7a5v42vq3sqws8e26htla9zjznhy8jqn", "105251169856619520"}, - {"evmos1sam3wwr4fzt92m4nf8czfeyhlae5xxg9g4secz", "1843070596013232128"}, - {"evmos1samnxrr82lwcpgsz27ayl4gfu5uez2edze3lkq", "2636877345136343040"}, - {"evmos1sapnqcvgr0unep2tz8rdxw3fucy33r0huekvfe", "3765503432725342208"}, - {"evmos1sasn63h2wme69ex8s08lq9q64wshcy8fngq42l", "34002223302122844160"}, - {"evmos1satvmtq3g2cgyr5jz8p874repe7rp9whh45y5n", "3213259788186479104"}, - {"evmos1sau36kpx8z7w8pev8hd0wycml22jw0y82msnka", "372891934428129280"}, - {"evmos1sav874pdyte7mn977983j9hvm3pndhh6ycamsx", "3137930393225562112"}, - {"evmos1sawsuvtv2z6dzeckwv672wdg27wal7f5mrdhfe", "6183027737770639360"}, - {"evmos1saz8w5mpnmdlanpcmf8ec5up55jvuksszalsl2", "1089927354925630976"}, - {"evmos1sc20xq8pmmve3f726ds0f8y6x64laz984up5ff", "656981760759575552"}, - {"evmos1sc2yny9tth4a6uyweamg4va90q0v8wqmsgktjr", "391625123492026112"}, - {"evmos1sc32fep54dzqyfgstt9znfvmj2v79qaz08d6an", "240321511731140608"}, - {"evmos1sc4vz4qukczdemgfuw6xgd0q7ghaa96xv2h7ek", "168083591345778176"}, - {"evmos1sc4w98579r293zawfqypg3qhl4cly5n3usjnwe", "5864453238318711808"}, - {"evmos1sc5z2y6cr3fft26327rkua58lssdagr36k3h23", "10933284469507784704"}, - {"evmos1sc6e30wnrww50923jmgaz7rnfrwsty9a7cdw92", "57001759349214363648"}, - {"evmos1sc9y9tg9wspshzktht805antjn89sqqglxtmvu", "2758034861927498240"}, - {"evmos1scagvhhv82qwxgqfdymzn4yj922rjeq6gxza9p", "5809859385096750080"}, - {"evmos1scc0w4ma6f906460dhd55nryp54t4eyzy4fzge", "18522722793918193664"}, - {"evmos1scewgnfvkwg22d66s9wjmprrwaqt78m3d9kv2l", "686065904116687488"}, - {"evmos1scfvuqpcpjtzq5dhuapaa6pkph8qswa4g5nw9q", "99748353832860160"}, - {"evmos1scg7x3fdw6emr7at42fma8wdr4syqnmd3l57cz", "1183978408758622976"}, - {"evmos1sck4npkks8wldaezcrc565prrnymvw273l6hsv", "173375308361431552"}, - {"evmos1sclz0sx9selxgggxxkc2zu26jq67vwjyujeds0", "1594608673676612608"}, - {"evmos1sclzlusn65r9tvn99067dqaskntsr5hwzd0v2f", "12265650640819191808"}, - {"evmos1scnqjyhl7wqap97capzx8kdfe7vt56zlh7yypd", "3938184474285283328"}, - {"evmos1scq78vezgkkksarwa3n3cejp9ul6lruhjzdah0", "10818999002362896384"}, - {"evmos1scqtg9r5482ppl03rnz5xzzvsj5q5scdmjaka3", "2745892775750843392"}, - {"evmos1scqygnzgesha3yv7tymzrs8y5ry46cgktrfeep", "40936095571535388672"}, - {"evmos1scw7nsucv48g86y4azfnm8rut4pqr4m74mmsuj", "5556163663688597504"}, - {"evmos1sczpkawcugwd827wfcsuq7uyaqhnxdptpsp6j0", "633606620309670912"}, - {"evmos1sczvlnaweegsmw79d27uean0ncz7zx096d0xx9", "7694673874429317120"}, - {"evmos1sd5tlzhh32maej85n4l52ncu2dazlyl7ehgxx3", "32563516155995815936"}, - {"evmos1sd63ulsmn6p66j3z4zrunyge47wncktd7vzx50", "1366740400044222464"}, - {"evmos1sd6ps5tv9hdvyn98rhczzyqu9ttfnawaafsm4v", "1090328857916252160"}, - {"evmos1sd87jezkz9gznpccvrhg3kcafcfd36cm2dalz3", "1058815108577842176"}, - {"evmos1sd8vc6j7g4q7qg9h9qnt8z30meyz2szz2qnffq", "826664325663846400"}, - {"evmos1sd9umkg7u2c6zuhhra3hdpd05hcrvapt5ukwne", "4550624531406129664"}, - {"evmos1sd9w8vw42ksdu46nzn7vuxygsctvwn9rmwm5pz", "25810758081958244352"}, - {"evmos1sda6g7f0qcfnmvfsd46079emar9ltshzfeynjm", "2361617449965445120"}, - {"evmos1sdawh4rz7l9lpczqjwqnutuv9un7hx43nr4fpz", "487725772948992"}, - {"evmos1sdldsj0l9p270eevex6tefzpafwx8sh5k83t2x", "465853272738599680"}, - {"evmos1sdljdax5w0p03x8jnsd6cd7wa2d9jf4afjn7wk", "5007642426545997824"}, - {"evmos1sdr59h09mlv99ms4ry2v39g97690zcd7hxhrcr", "1156665928878284800"}, - {"evmos1sdrhxmyskwmvf382z54pu4ch037zy0w2kjdj2y", "14042253038824660992"}, - {"evmos1sdxdzhl3qqdx8mma897genfr2g9x2nq0dnvksp", "3435790738949757440"}, - {"evmos1se0k7dmztu8mzttjng25zxx0v8nhlt2a920kgq", "8128423589894782976"}, - {"evmos1se2u772us2wzg8sjljfgphjj2e5qeuduklz5vg", "4875297640980654080"}, - {"evmos1se49nk3ayl4293p4uksq2surl54hs3qqy2a7ym", "101735335571050676224"}, - {"evmos1se4etlyzfwn7qsvnxm9e9e65mv2m9xst7mmnwk", "2803640076979795968"}, - {"evmos1sea0q97xp5f8r8d8tkd6t4g6pqstjus8vsfd4j", "103595482016712192"}, - {"evmos1seav90pyp9ma3rlqy6y2d7t9uv3p8x086nakrf", "2676492436812220416"}, - {"evmos1sec8pl5ywgd2egvslwqcvne50umqutg4d20wjh", "108313347230941184"}, - {"evmos1sedg905rvzn43althy2u2p9y05d5cump0xvg09", "7703639096025825280"}, - {"evmos1sefhx5nm9ls83z9ar2hp4773swnuc0e3jdj6he", "1432488040021166080"}, - {"evmos1segj524q84rz8y4znr35h0vfzn7xjq58flh5gd", "1512116579880304640"}, - {"evmos1sehcjvz0hk93rq48c2vedzuuqq0gjw3ctdj64r", "138051784374463488"}, - {"evmos1sejyetnlq0fhs60k2vqxjlp5sughlhnjvm7wee", "4755997284343522304"}, - {"evmos1sek974xw6csm77fkcylwcqzkvmshcpp62d3wq7", "5315036472461271040"}, - {"evmos1sek9yxyrhjxt03vhd832qmhn3nrgty27dcj6zu", "141380690555718352896"}, - {"evmos1sem74utdpkkg8k9a6k66g38m34v78drgyes0c2", "973195138948063232"}, - {"evmos1sen9hg95lk4xl2z59ak27yzl49wx0f2cuxjfnh", "7831338800647714816"}, - {"evmos1senq732eks3ae6zm4c4kczufrcgc4a389e5pev", "7777321550550466560"}, - {"evmos1sentclv7zfkudc776ms49tu80t2scwxa96zjw0", "887173784692636672"}, - {"evmos1senuh2hfrgyeujusl6pf6n3kl3nyw38ze04ge8", "1886523297266126080"}, - {"evmos1seukt5wmzkmgmmccah5uj68wcj30qfqm5cz0y6", "2807857596512338944"}, - {"evmos1sexca5nhzpe2zglgrraf2ucw3uaeqj8z7v56fq", "1217103057879199744"}, - {"evmos1sf0s5xtgk900n3s9jzp5fsjy9qm3nl3uk5dn42", "415849470713734144"}, - {"evmos1sf4mm5mlm4f2fj32cpp8srkze2n8hf8hzk7fve", "108303333015426048"}, - {"evmos1sf7wnjh3rwukea9n8tefgl649eg4uyv5l5spk7", "1259744401055077376"}, - {"evmos1sfa6lxv2asqjr03y0trxfgx97akca7wenu02q4", "237203220156755378176"}, - {"evmos1sfd86lampszw0nm09t5lz7jkumaz2agwhm5nc6", "2761676716413468672"}, - {"evmos1sfewwlxz6nshljk0ufs570gjyxalmcscrzsvy6", "3739653127842984960"}, - {"evmos1sfhurch2ngpldksnn5arf6we3d94hv3ylrqrjw", "556409050988800"}, - {"evmos1sfk23wldrrzcwvsd3wpzlrrry4zzw85ezd2jla", "198903677773479936"}, - {"evmos1sfky2gwvkea9sllyn6257ynt707x7s8gmydcf8", "724321728875638272"}, - {"evmos1sfl0dfnulps8cynw7e4h04nygjg7mhvsl857jm", "1167913014517192704"}, - {"evmos1sfpdx5jjnzlxjfd6k2u6p7fpwgcfdme4w3zuzy", "1777798662779650048"}, - {"evmos1sfqq33jnwy5z9qvdezepv37wslw8j59yng6ekg", "36521707858433114112"}, - {"evmos1sfrd6ak39g4c88ard0hr4quhseyvgakydpds7f", "3290897753867005952"}, - {"evmos1sfrrtw8ze0fy5vcqpaxmrgftg0djv2jsudnma5", "201625924754776576"}, - {"evmos1sfvwtnhuhqcln4jzv5l6x3xpwqsqred4yq4mc6", "367154483473778432"}, - {"evmos1sfvyxrt2qecwel6s70hem2cwac46k83z5jt9k9", "217367202573981952"}, - {"evmos1sfwr4uqu8f95rraxl902t3zjl73eye0axh5ejp", "223926614473806080"}, - {"evmos1sfwws5kztgzsnerftq5sph6cy8rd4yfq3xhgr2", "316696435403974144"}, - {"evmos1sfx0ce4qcfw96987uhn28zjq8ell6wffd4r3hx", "225693650725439744"}, - {"evmos1sfxpg5mmch9qjq7wdz3k3n3hmkt5rte96a3yyf", "7306836036780425216"}, - {"evmos1sg0xx0qvu3zyut5lxwjknwj8mevun0chs562jw", "2002154522468742656"}, - {"evmos1sg22rcj22lttnlg9mxcwh80qyl5vjx7ld2ustu", "8913030936231493632"}, - {"evmos1sg2azq6xjr89pmvh6qwn06gspgprlp2n3382qg", "1543157990240117504"}, - {"evmos1sg42xzspqrfaksnevau64rcfhzp4u0quuaesq5", "64673135839476645888"}, - {"evmos1sg4cavj9wtmx338cllqu005ndcv3shh5hqxr8g", "35038285042706182144"}, - {"evmos1sg4e4x907slcdrq7vmdt59sgqu8z0p6pyf5hat", "314674498237903405056"}, - {"evmos1sg6v3vnga0f8fmwyd83pncl2x7236t505uxqxz", "5196906938398261248"}, - {"evmos1sg825393jz5jf4j4fy8h2rrn894t8vwvwmdk3p", "1258151190011191296"}, - {"evmos1sg83w57ngqyvlnwtpg69z8wmzmvf97mlv0ur7h", "31330500890489577472"}, - {"evmos1sgajm6jwtn6sgff33edal3knyhxrqwkjvd9scy", "413598395629535488"}, - {"evmos1sgart3wtpl8jrqv8g33cyly8372mrvk9syr03q", "838248962578807168"}, - {"evmos1sgca7ut79nkf7jhzh28vc3h06amfak5wxtlpn2", "6786239027368263680"}, - {"evmos1sgcn306j2p5m69z7c26y0f9he9sct79g4czzxg", "298869441063596032"}, - {"evmos1sgdwmhdcxkrgms2yvwr9wwnzjmfyggjzq5xhgk", "9295359757543346176"}, - {"evmos1sgerp4j93ja93lacedxc3wjd4jljcunrkcccu0", "5329305246629888"}, - {"evmos1sgjcp334fkf2t0srt9q4m88jl7u6jmvwl4nfgr", "694946248998175744"}, - {"evmos1sgjn4hutj4e7ytwrtjwphske6u5q3s8ag56ggl", "5324321730743590912"}, - {"evmos1sgjzrf6gppwsy4s52szynegxhhn9qlumkzlw0l", "1537421844321691648"}, - {"evmos1sgl63r6v2wcqpkruh8glxuklqyp83sr8hszsa4", "3201871339720291328"}, - {"evmos1sgmkd25yk0phsm0qcg4pg55x4j5a7qyc0ecj08", "1182106180526908416"}, - {"evmos1sgne95hmqlfhxkhdffd89945vldmxq2a95pvfe", "384414607110148864"}, - {"evmos1sgqd77g5578uwxgga4dzd74tzrjnsrlf6ha9a8", "286352489715351552"}, - {"evmos1sgvtnnnmkl9xcxutapyka3vxcctsdru9u3sxt6", "938481705630583552"}, - {"evmos1sgzsn7m04jwuzm70l4wlpuvc7gadelzn4uw484", "2388729196376686592"}, - {"evmos1sh3kchez92d8u24p63nuncsqrhslg59j74llfp", "1344138849535492096"}, - {"evmos1sh5updf56aa3j2zg4dduhd2y2jw5cghpac4nfv", "1671936007644084224"}, - {"evmos1shde83we3hh05qef9wale8gap6kwxf3lgcpyae", "926503653897871360"}, - {"evmos1shewx47jadl5e5tfx3telps8f8jmukfh7u3mur", "477385873694414336"}, - {"evmos1shfud055fallw6tgc7060njqnu9rwd9ka56xgw", "15947959764010180608"}, - {"evmos1shh2ulvcfw7kapvrn5lqxhgf96lk6g83pvt2fl", "1403773292405977344"}, - {"evmos1shkl5gqzxcs9yh3qjdeggaz3yg5s8375ystx5y", "2388570257270849536"}, - {"evmos1shlhxmvrc0g645vvuvf0rnm6klcyan9pup38c9", "78753036494274560"}, - {"evmos1shmphd2w8c8hfn5lk244j0fljmvr9n6ldcsq0v", "1448721522337580032"}, - {"evmos1shr8mvfh6r0fdagdud707vwt3589zcut2u3656", "3773993158329950208"}, - {"evmos1shtf4a8wqh8vhn8ztzmdl36wya0tq2tlkgl6l7", "18558041895012646912"}, - {"evmos1shznxvnu90w7dhhceu2wcfk88ve3rrj236zed7", "9665793124943841280"}, - {"evmos1shzztp6p3x0dm5crm528u535suy5qqhmktcs7d", "1692551179162363392"}, - {"evmos1sj4vgczmc3hdm8gjw2tderylzd2xeeavujar64", "18627809874583552"}, - {"evmos1sj5qkye8jdm07gr0nqstycnz9sz5k4yun8v885", "5444509421696427008"}, - {"evmos1sj6fay5u0p8nt8fx4ug0csystgz0nzjuthlwj9", "246034427047112704"}, - {"evmos1sj9tvaxrzh5lnhmz7539g0ft3f7xc4wpxtxelc", "879248437594761728"}, - {"evmos1sjarax9sreahvepmnankmkxc6v4cs7xtvr5g6u", "733467147765657600"}, - {"evmos1sjcrpkt0j3jq2k37a3syrt8k0qzka6wqtfvcd2", "8666576881146159104"}, - {"evmos1sjf8fsswwzssuhp4l6fsqkh4x6drjxvakkels5", "7755641445621898240"}, - {"evmos1sjftlu03cemxpdmrzd3etrcctn2ne4v7c4u0wc", "41563697533222805504"}, - {"evmos1sjjretzcp3vuycua80952ljzvc7wettkk2lm5d", "3772169884570955264"}, - {"evmos1sjksylqxdv84edlz6cw0rcwxkctd7x7jae3uny", "184402481817804288"}, - {"evmos1sjkx69snx2jedsm4nwa4kgpkf2hp7wstdr2ge9", "1469586749545881600"}, - {"evmos1sjlr43qw2r0azgxss4d4a99dhrvh7a7x4l5lc2", "7914320000550657024"}, - {"evmos1sjmlvujp404h6ktfx6n2hlk562nulx47y5ackt", "1457263316294408192"}, - {"evmos1sjngcwt9u4yr2t9q2ayxwx0uxdwaj6m3lenf8q", "184436565121484800"}, - {"evmos1sjqmml6z9pmzde6h3qep67p8j8u42dct3ctvr5", "35351643710094442496"}, - {"evmos1sjsa2pfvjevu00y4lpz29ayzv8sxf4wvqdfpfm", "388660783184613376"}, - {"evmos1sju3llcfl6te57d6pevrpz7acaf3zyt3jmmjsp", "37464691312982163456"}, - {"evmos1sjx2jjp7kjqpncytghmlks8grpaj6ucgdrdw2g", "3807767163040653312"}, - {"evmos1sjz4euu07kqwmsgs6r6c75qs4maa0daqx3fn60", "12844933620379842560"}, - {"evmos1sjzm58s0vw5l7xtkldr2ey0psrfx86c28xvnph", "3996209841750488064"}, - {"evmos1sk29nsfqw5j7rt5vjutgclqz2gltcl5kjylege", "2762818421216149504"}, - {"evmos1sk2kcj3y0znhwvrrtnsdcw25nq74kzt387pdse", "957747767087726976"}, - {"evmos1sk38xp5xvuxs0k2xnt7ynx6svnlutz4dzu37ym", "2376469794631388160"}, - {"evmos1sk3kx6vudpjzfzn0ljnxujs6tn8e74t8nv05jl", "1247547137005683712"}, - {"evmos1sk9qke528yldhvnr0qrsfyf98l0mrupq08c4zj", "4115953344837496832"}, - {"evmos1skcr9le3zpzzqwly06y9gguavvk3utkypx8m6s", "19612671808824320"}, - {"evmos1skcxycevp32ky3pqjuwys6k6chpv0f8w99wtz7", "367148451421453056"}, - {"evmos1skd3zfnzs8rfyg3tk9pqctk6xscz88t2890ecs", "6239586453764636672"}, - {"evmos1skep0wknpzaze03ll7xge58uwda2e5gsz6548y", "1408358998554525696"}, - {"evmos1skg8frnyzztnyf6g8gfjwqedzt6jale44f509x", "15708674973297496064"}, - {"evmos1skh6a8xz8e003s0nq5487vrya8kj9m3vx86nzk", "433832103669594880"}, - {"evmos1skj0mrtrkzwus98dug2e890dsae4uc56xznk4z", "2292082755718243328"}, - {"evmos1skj4pywuv0sfpjl27dfhcuf3ewqma0f9qk5y8f", "4293579665232105984"}, - {"evmos1skpwpe83xzgnuf0lm2kaqykwsvnk27m2etn9hq", "473138737315170304"}, - {"evmos1skq40vs2f9jee85634cuhmr3kwfkrmfdhwvy56", "448602689728065024"}, - {"evmos1skrqu4g9fhmv0f83trkynd3pwhxzjtefc9rwhf", "1249844569245661184"}, - {"evmos1skv5y9r6nugfedpq0h9sxpur68lhm6jvsrn9r2", "536070100787744768"}, - {"evmos1skwvxxwy90qfrtr4sa5ge7sw2uha48cq0au52t", "105624419121932943360"}, - {"evmos1sl2jccnu83jwa93c30yjkd8lrtljjkchj96cx2", "892180001895366656"}, - {"evmos1sl5f0l3jwr827mt0mfwhy39fv45pf4xyr7nv6j", "246017453069262848"}, - {"evmos1sl6sjqk86e4n7x0xsf0050w8mdpqgdh7ew7fkn", "1423190538616233984"}, - {"evmos1sl8hmtwghcq96sxg6x7e740kzp7twzuhjfk4av", "272768240903536640"}, - {"evmos1sl96uzmw9f9aeeczd930fac0kd6ds924w70u7v", "1066530145642935296"}, - {"evmos1sl9z3xyyzguv6tg2jz0nyu9xnu764dnn7junwj", "122403834792386048"}, - {"evmos1sle54ys9sl9scaqm70v8hkhjpvyc6exu3856yf", "5634500013733982208"}, - {"evmos1slf58dpvzh4shcc65nakpewpnkpumhfhgandu6", "100006725055155200"}, - {"evmos1slh3l6h28vy3m82v42u780s0dqzre4e8r63k6z", "869180296725061120"}, - {"evmos1slhgfuzusn94hc2nxgvfwujf3uh9nerh6xpnjp", "25218742026446080"}, - {"evmos1sllsyv6gv4p4x2my6fhja4t0xws8qy00syqk4z", "4326764547588273152"}, - {"evmos1slnz3vu6nyweajwr6m4nn2c6jmv75e75wxvtz0", "994693956966861824"}, - {"evmos1slrzk0yv9l7tpch42hgfzru3y3syvfnallznpt", "444646135354543360"}, - {"evmos1slw4tq5t9f85kag2l4gy5hvay4s4gfty5keale", "1324042952388275200"}, - {"evmos1slz6024yfkunnfegeuz7xxuyzxs5kftezffzyu", "5222141667551201280"}, - {"evmos1sm2v8wrfrglrpmvxduu0fhz97y0cm3pk9knqc8", "4292996251052495872"}, - {"evmos1sm5m4u0zj87j2mc7vylzsgltd2nsk9kr0gags6", "775652542560099840"}, - {"evmos1sm6xg3gvpcwp5utz3j0dek9a9vh5x46twk8wn4", "1311741045625853184"}, - {"evmos1sm72m39tfl7yjsaeppg3njl2h6yrvfxpgynvpw", "5800652374138785792"}, - {"evmos1sm8drv5j967v7dcxa43fk0pgq4pyz3x47gn03d", "1449628745371299840"}, - {"evmos1sm8nrk2rnfuvgt3yqusq7w54akn5r04l5c7a8v", "1130670487950256896"}, - {"evmos1sm93wr5p2wlpvjuk2n7tnmq9udzrc0hlz282ds", "98994504256994560"}, - {"evmos1smclv82ldtmy9ujzs4n4arp5duusam4y65d5dq", "720408736668593152"}, - {"evmos1smd96xnnnksg3tyjxy40tfepeegx74qyawflqp", "2659927099885768704"}, - {"evmos1smef988tjzarj6gzkge036eq3wk4qm4w96efcv", "10013160558493790208"}, - {"evmos1smh3uy9arwn3p2hm6l09x4tdp26kh2tvn0x60d", "468881832041735424"}, - {"evmos1smk7nxh3sg5lsjkw6u858yejnkhelhqp650efl", "3799604441552896"}, - {"evmos1smkt7sgu4c3my3fs743utakznfzc796j2h0ewj", "270879115142361088"}, - {"evmos1smllt07398sj8827mgrr3c8yqsfdmujtxx3tyq", "6660945378468237312"}, - {"evmos1smmhnaxx9zq43fpnpkmg4n2m2kjy2qeryvfwcg", "742974873750630400"}, - {"evmos1smshsj2hen7g0s7wthdu4zdxxja00dje8n9dx9", "962878361226633216"}, - {"evmos1smx4t28kc7ew6taf75m9fc0cp3cf9747m7zp7c", "7787517081459871744"}, - {"evmos1smz5tzfhu52q0v90sm4ltnunqkcq8zn7k84fky", "51752094335861104640"}, - {"evmos1sn0hruk3qc4trtx6phjc57uwrhamt2nnvrsc02", "5668711706496540672"}, - {"evmos1sna4p4m7jtqwa9er57dpqt44f9y3xavc39u723", "12793107186541510656"}, - {"evmos1snewcr6zq78t66ds9tfa9wdq9gkxcc7fr49a3x", "27847124305272320000"}, - {"evmos1snfwjjp0z3f5elpunvddq8rpfp3a2wkvx0fsap", "3008571306130997248"}, - {"evmos1snn6y9xmfk5v85942suwum5md8ru3dnnhmk4ef", "41375973014136946688"}, - {"evmos1snnkxf3s7hv0q6nnwnl6227f04jv2eaad34u4l", "5289972611308240896"}, - {"evmos1snsnhgl80e07pwfqnmfntt5s2nh7t2xpgrqrg3", "35822104216547328"}, - {"evmos1snul3h569xwau9kfwn0jyn2jtp7upp2zra0luj", "2228232562975613952"}, - {"evmos1snuwxmhqemfjfkdlxqrfaswz08cseq20t4exje", "2767198366227765248"}, - {"evmos1snwwcgjmjf6wwxl7eqldwdmljahg6jpgrqeh96", "5295281011466018816"}, - {"evmos1snwyexxp6atmzkay06vxfwfzpqs3d6cg4rn9u9", "7520688148200365056"}, - {"evmos1snxnysj9xq28mjsla2wqecppz22s342yqgt0cv", "7739987332308616192"}, - {"evmos1snxqx4cnfx5l30fe8kzzk2g668n7jvs3588pgj", "769847775819336192"}, - {"evmos1sp0m36qdwey3eu6e3qn8xt2t9qn3cxmkr78hkw", "410848986735744000"}, - {"evmos1sp4ed3xjs0sv6xpksv6ka887hqqrq43n9pg05a", "9348450051265146880"}, - {"evmos1sp4h4ka9ac38u2y5ehc50luarcp5jjafpc7x5s", "1141756219952271360"}, - {"evmos1sp77jnuj28su8g0zp0q8u33d6ycl6yksagnqhe", "39818270476770304"}, - {"evmos1sp9frqwep52chwavv3xd776myy8gyyvkp6n53z", "21269048911902359552"}, - {"evmos1spd6w8rprau3ks5w2fak6mxgq9vf4cdfwdel4e", "1471613848701500416"}, - {"evmos1spdywsa0xat4xdudpxremlfkdlz8ehy43ghsx2", "1415526166639304704"}, - {"evmos1spjkp3tpqwcx0ulq82pw9246jc3hqmucuhxqsq", "12411444619612127232"}, - {"evmos1spkc7ftswzfm278lw333c49daar9zeqva2tt8y", "597467014939475968"}, - {"evmos1spkjemd2869wgvvj9402fs7r53eeawpz9uf2np", "411226011764512768"}, - {"evmos1spkq7h5ufaj8u4dzg4l9fqnrdfhuwnyx5fl2t0", "9033302309659381760"}, - {"evmos1splw2e2nqj3rt5cf8p377rqjmuuc0g80ah07t2", "4423587022481611776"}, - {"evmos1spphykp3c945vkpwq0n4n6h9kykul28eypnsgm", "478352187937892352"}, - {"evmos1spskxenq5m4vlacfg3k9u2n7z7yhdttf3qs9ks", "1391815404811650560"}, - {"evmos1spteer8nul3k4lwwh7fn3rxvvf4tmavc8hwftr", "4484895902258411520"}, - {"evmos1spvdwsqcvhmp9p0r4my5ph7fn8284lcjrrkpvs", "686534235852115968"}, - {"evmos1spx576v4hf3c2lp0jludrgsdjz4x49a47wf7au", "403711513726954240"}, - {"evmos1spxyh3g0m3rl379n6r53pawga4jc66e289y7v3", "600229949133666304"}, - {"evmos1spz0qqy0lvegekswt20x6xdy4tn3r7yatzutmk", "4017358686172140544"}, - {"evmos1spzjzfdcl20834y04umgge593r890z9w8mp4k0", "99795969287624704"}, - {"evmos1spzplxjwps059a6nuudnkc7u3djxvlwje6csj8", "1952437369589794816"}, - {"evmos1sq2ntg6njdhcdn4qsdsqstdct3hgas097a33rp", "74063756404166328320"}, - {"evmos1sq3qrd4v9290vhptqzt3jgq8cvvnh9e2hf3xc3", "2779024285383954944"}, - {"evmos1sq5uxfwfg9l7mrhyv2lnq0zpdmst0s0hs0tj6z", "4574458933775944704"}, - {"evmos1sq75vtw2ppxj4aen9wf4ds30q2ghk8kwal5cxh", "3365399542778840064"}, - {"evmos1sqdgkykx567k9kkh725t8kzfdjxss4a0ss2f4r", "176995045944104812544"}, - {"evmos1sqev7tnal8ctfjhtdcvk24kyqs68w7krllmcty", "4875843101095227392"}, - {"evmos1sqhlgfznljcg7mmk7sys5v3ys0ezya43hzwa6e", "11770408279115900928"}, - {"evmos1sqhw37r7mce496zcfjt783pct43vkzaqzvfxcg", "38789646570114514944"}, - {"evmos1sqk9cfe2kw88jynqfs3gxcqextwvw3sh54z6q6", "16366393299471454208"}, - {"evmos1sqkqz6ux3jghpg7smjpeepg22py3jxylsg3e4f", "5506996534538072064"}, - {"evmos1sqm60umyhvsu3sd9qxg0d6sy4g9gf03y9kqntx", "34874406756996259840"}, - {"evmos1sqmplgf2dsw6t38zvankfjjjmzrvms5s7zjk6d", "6973743517203694592"}, - {"evmos1sqmsj6q0v6ylulrjm5xf9pj36w365weqlr6cp0", "170068324838065152"}, - {"evmos1sqnt3c0p950t4784cn8akdk896pgmwf7m46xgu", "5286012363314888704"}, - {"evmos1sqrr8l7enr75x8zhhsm8hgnfe45y6sqvukcxkk", "473651055561563648"}, - {"evmos1sqs4wqs39xjsy7hqaa0arc5t4uglswmua2s3f8", "148089405767893090304"}, - {"evmos1sqsecux55dkddqhuup70wrm4j8cx99rfyr0mv4", "5480225403108348928"}, - {"evmos1sqt9lqqfc7f4klps7mxt8d2rqx57tfp5qa9hxm", "11267158915014037504"}, - {"evmos1sqthzws6qzyd0hftrqgkzgg4zrhjqln5fwjfhk", "1002731526723728384"}, - {"evmos1squ2rvvedmrunrsl8ee3sakxf6gqry86wvwgm0", "802957182036062848"}, - {"evmos1sqvzcafcjhkwhylh3wwlve6p5kwd5hg0dcrsgg", "6837761812171988992"}, - {"evmos1sqxyg020cqzg6t62s0tyehkf82pyhe6988egfa", "1602532055558262784"}, - {"evmos1sr3q3gtje4j5r86mz0qsdmqmlr5wsaxufzpf0k", "1577941507832951296"}, - {"evmos1sr4ezvjvq047n2mpc8kqs8q2x6kklxv8ge9xdc", "1359828667056861696"}, - {"evmos1sr5twyqel3h73s63hf4y6n3593dyrw7me3f4cu", "13187999473223895040"}, - {"evmos1sr8k50fwy0lug4jgmt30lm6qarppgdv9t58rtr", "171848835123968"}, - {"evmos1sr8lmjjd0cz7kf08qwsc86vv0fqffmkqp7jyh8", "3726636217612282880"}, - {"evmos1srgg9pftk8slmjjpzv90evzxnd4c5e4n837kh4", "21448287898722410496"}, - {"evmos1srpyh8l25y6prlyug39zcpzpan05akz5psch38", "901457928727431168"}, - {"evmos1srqdjyc5jduywg48n549p7c7dzz9z5m64c2a8m", "2346521193857724416"}, - {"evmos1srsxsej5dkkt6fepc9n3ecjrgu03dggk9vue2d", "65344941831045120"}, - {"evmos1srue65tzplktqutr0vyydugzxyekqrehwu0l6s", "522703383192428800"}, - {"evmos1sruywq3dtw9jqac7jcejg3j2rahmgteusyk62r", "1082219768245910528"}, - {"evmos1srw3e0as3qj2lp3h8kf0el7ylx58v8lq7j8x4g", "243878659462511104"}, - {"evmos1sry3zaae2s97kgtk7kuqxdam78mpyq6yvncmcg", "2705677397718138880"}, - {"evmos1ss6x5uwu8cuepctmzt9md8mxp7j7h8693l62mh", "2246704635236902400"}, - {"evmos1ss70u3zt4scq930j96sc3ev0lvp5cg9xuzmx6f", "116084024566264856576"}, - {"evmos1ss844dj5dg0jlu4rntq4ggu9pzzwg35g9a7cuy", "1166502379973447680"}, - {"evmos1sscj74mhhq8g8s4fn8mddduzjqq4vqg957yqjl", "1559094025148551168"}, - {"evmos1ssddp2at95e4yr9zx630tk9s8zkacy46mc9vwk", "9575568899019235328"}, - {"evmos1ssdw0k4ws40flk9xf9dfxk7xymep0n79zu6h86", "1292553684626065152"}, - {"evmos1ssez5w42m59dtzyntj8g6whnu8defkw97lywxf", "1354909919918108672"}, - {"evmos1ssfkkpctj048alknqr2azwwsmv3c8n6nru9e6k", "42145714217622896640"}, - {"evmos1sshqxnl984hs37v7uhetspwrd7f89w4g2s0n7j", "69471191864737792"}, - {"evmos1ssj3wmstpcwjevpzpfltwup0y92ypm0nk4gyfj", "427927134224269312"}, - {"evmos1ssl4f7ljdrdtayl3dcmxgvlpvgzfgjc635h0pl", "1344544632820948992"}, - {"evmos1sslpdrhefax4frkkkw77w602vfdlfkjkm33a5s", "29310832931740928"}, - {"evmos1ssmrjevlmqcytyawdxy54g3yc5z5zptwyfrrhe", "272019971054838784"}, - {"evmos1ssqgt47tezwfu2f2j7q0f520unen4k85spjs3z", "5412936869352079360"}, - {"evmos1ssrt6qmzedf6he2vm2kpp76hhzpms0hdvxd8td", "2684488064286736384"}, - {"evmos1sss6s35c50lvghtkrwd25lajg8lxgxeescx3f4", "966336968823977984"}, - {"evmos1sst6z3263y3nezyea829pnut3d25h0vr3mpzhx", "199247854939073536"}, - {"evmos1ssvdf0auwphgv4u4mnuyqkx2my4q4s7fktzdch", "2795479260871808000"}, - {"evmos1ssy55wys3lmsyta8z30hmutvedk4eeze6w3umg", "22318179934942846976"}, - {"evmos1st2t8663kwkr6upktqa6kkxdngdh80607q500r", "304219777513818112"}, - {"evmos1st2u7kdapy397wd4cjf97uuq08e2ntnfjzf5km", "934038095236674048"}, - {"evmos1st3sel4cf3sm5l8xejlxy60fyvcz5c5wflcf2c", "21047039534657994752"}, - {"evmos1st6htxjun4ywj6rylxytyxr32z57386ka3r90e", "71261352051806208"}, - {"evmos1st76vue3l6nzdxlg77s5w0zecfhf2lnrelwzv6", "10916799178005309440"}, - {"evmos1st7prkdmff0a7fe7lqn2q7saa7pndkulvdw7tf", "7029883936846152704"}, - {"evmos1st960rxm5chxx50l82cuw7t6t9tfjc2666f30f", "3235185221745246208"}, - {"evmos1stejjj9cah2u5p3jw2wcfn5cpgnqtfd534n062", "9171858556535497728"}, - {"evmos1stgcs09fdethwdpfu7zlr90ry7pmrsjxdy8val", "37040531903364997120"}, - {"evmos1sth82uth59fl2tgkkvjyg8y60nsw2pdx9zzw3e", "6391629031425699840"}, - {"evmos1stkm08zvwqr7k88emyznxgycc7pzclqnsyv6rx", "1422098773277728768"}, - {"evmos1stlnrdyewfs3cx55y3ap0xwx5dz9yk0wmw6630", "2572212629056307200"}, - {"evmos1stn8dujzjak699kayrvydzwwn2del0r57hzezh", "27151072561975275520"}, - {"evmos1stn9jxx3nvtj833k05w4yfknwyln3slvtl28s6", "2693959856668969984"}, - {"evmos1stqjl7v8hkwdwlxkzzhk88wuxqlqngts7a4mnu", "788604222480561664"}, - {"evmos1stqu8c05avvjr5u98ly749asvk2x8jfl646562", "472829634129657344"}, - {"evmos1str62vh53c236fq2valeuje26g3g724ygthyfv", "7658971245503455232"}, - {"evmos1stsvxve5extm0cemk6s6sevu7we08wz5hgupqp", "39314241080604065792"}, - {"evmos1stvcjvtttt9am36lemsngjacmkpl0lp2zdye2m", "1566444738972941312"}, - {"evmos1stws53nwsuek0nqhzv6mlzmfnasytyv025kfp8", "318530960383493632"}, - {"evmos1styu9h2jtf9n64ymfcklwrfalxu6ww8dd5dpfs", "1683357860533777408"}, - {"evmos1su0hmqrxq65qtvgzjrmdclnksrm7zltjl3wsem", "474634319849422848"}, - {"evmos1su72dlh2933xgvsmk7ry38dr9zrh57nf95r6g0", "1444792933938732032"}, - {"evmos1suam7y7y9qq24lqtdnxygd2hhz2pxf0lqlgpt9", "3569147074919190528"}, - {"evmos1suc2ys68k29sz85yqfkruzjlgehcz74djgcfey", "382737247191080960"}, - {"evmos1suczjj7d08z2ngcxsyqfxqdwr3csnvd0hxyryn", "1593437126443827456"}, - {"evmos1sudequ8dxkx53yacnf3x8wrfsknnrwlt2mcdnq", "953377104778867712"}, - {"evmos1suf4jcz0cack864ek9cqql8y2gplg5wjcjfy70", "869870837842611200"}, - {"evmos1sukf75rh0g3f2v749xf5zp80hkw5teencdmgaq", "3630882495063812096"}, - {"evmos1sulqps2uth0z4s96yrmvreklreqj82t4rtqjm6", "47576592001648787456"}, - {"evmos1sup63hx7z86rc4v2ejajpsurca0ymgkylj5prt", "80226506892795772928"}, - {"evmos1susf3gsnu5e8fye9k02pzempwtkx2wxxtef7yt", "1617822103392378880"}, - {"evmos1suu34hw0pwsgn5smpa2a0030glmz8jdc4lej6c", "1365169670038510080"}, - {"evmos1suwmeqq9v0crh3v23rmfnf4j3d7n80ahs3kee5", "2442662581855979520"}, - {"evmos1sux2qcgq8ama3qtssqt3fyz7af9vca7y3dmkqx", "2882834295875799040"}, - {"evmos1suyyx3awhtwxym59d8sd8p5j3kk79wsf3cnqtc", "12466403376817729536"}, - {"evmos1sv0gudawve3kry7swrfhh3sp68eslc9edac6j2", "13747951806188961792"}, - {"evmos1sv59fnrj4gmuhwr4quuech2y6dh5afgfpyd63l", "1065665293149783808"}, - {"evmos1sv5p99u7l6mxwqh74el6k7a6wgqdwp9g2dsqvc", "1094834922400232960"}, - {"evmos1sv6mla7wfndax7a0p2h9hhdatz4s76z5lcj9cs", "4178530127929991168"}, - {"evmos1sv8dcyvqhyt2xxkc782n2wtgxtuz373ufqj8es", "10484995204909617152"}, - {"evmos1sv9tvagaskse26h0jluukwyqu8ly5n523ngx3n", "4637198986127687680"}, - {"evmos1svc053qtffhu5pdjsyg7myl8kqny78hqnehmkd", "4843117614472265728"}, - {"evmos1svcwlknp9s6w0nzd9ed4yxvdpnjrwy4fp3pmx9", "30064749634220785664"}, - {"evmos1svdyyu4kkrg66raw6wtsttmxqmyldqk7tmfdcq", "28481715074712928256"}, - {"evmos1svfg8f3g7dmueamqmzzedrr2pwqpns32fj42fz", "1924347084531179520"}, - {"evmos1svgn446030mcqamc6exgfpu0829jx2vpjm22yw", "414743484717126656"}, - {"evmos1svgnl7zculw3hgk6ejcjyvgawst7prty87zfu5", "2581130477496352768"}, - {"evmos1svl6048x8w9wjjjrg96duk2mta4dtwuq3q4vqc", "161064273154508800"}, - {"evmos1svp54zv6egvhcyrc9ytxvas4mh0xykq69n9lhh", "84434295985713152"}, - {"evmos1svv4wzwymk5a437ngweh3jwvz7akx38ell7ml7", "85399515878099968"}, - {"evmos1svvddyq6r3fhed9zjm0vug5jd5tkwuycxhwda6", "1821017297138181888"}, - {"evmos1svxqmmtvv70rey2c3x6gxqr08lc0zqnuze8h80", "4250745954522808320"}, - {"evmos1svzlyjjmnzvf32ppn07gn20lz7gptcrce6f488", "902670818134688768"}, - {"evmos1sw034z3x8gjdnpxmyp3rm9umtya34xh2shnvje", "3906188307227949056"}, - {"evmos1sw0cgf39873phfg98f0mtjrfxfj08jq4u63wng", "1391031203307356416"}, - {"evmos1sw568ky5eusr4txkzxl4tgv5sgt54rryrujxpr", "520327877581361664"}, - {"evmos1sw6weruurxeetef7u9y76kwnr76vcwepu5h9zd", "14546915144539152384"}, - {"evmos1swaldwvrr3lqa0yfkh7ccldeq7kj38w9dge78v", "384500541973383936"}, - {"evmos1swde8v6y8nxah77ranqns4uym2afuy2uk8pkwz", "384254695695640832"}, - {"evmos1swg0kw8k7er6fksj3vc5yjz6tqazwykhemq2ct", "45481819045719040"}, - {"evmos1swgl2w4ylul6pxhrjmpra2smh90gqpw7v0xwx8", "453872364394061056"}, - {"evmos1swh45eymy9j0tegmfakhuegyy6e4ve0h66szg4", "107047444115144960"}, - {"evmos1swjeech023wqr8nhc4p92tkq7r6cgq4k8y3q3y", "764996448963753216"}, - {"evmos1swkym9ghk6pvrday74rck6ym0hj0gut4ladhz0", "61485599042655059968"}, - {"evmos1swqu5nlrh3rc4rwe5x803mjlkduh8sgpqc930h", "64157262355836895232"}, - {"evmos1swwsvx8upzsljupz9aczcgtx5rzp96nn0mk2zv", "1572740555881969664"}, - {"evmos1swyn5ry83da3cus458wz7r8w86j4hzrk4rde5q", "749067709321251200"}, - {"evmos1sx0d7rlvpqd9vy4pehs7suhcg24hq6hwm3x828", "690769467759859200"}, - {"evmos1sx4mp8zalshpnkvvqlnt33j7k3d5xnj64hj0z4", "26859607780389314560"}, - {"evmos1sx50xzglp5scupp5nh2ete9hgu87uv36x50gga", "27222023323245117440"}, - {"evmos1sx8nhng400puzzz986mfs605cw0djkezs65v09", "309080851988435968"}, - {"evmos1sxaae55wv47pgkdt757u7kt5e0mwft275el9yq", "51722998055624417280"}, - {"evmos1sxdk4gg03mywa465jahurx89memtapulklxqwz", "7073406868985511936"}, - {"evmos1sxg3kulfvgdwunuev7sttlqz2acz6yjxuw6flx", "2724227924676291072"}, - {"evmos1sxgztknrzuc7qp6z8r96xr8tq3qjcv7wm70lq7", "9880171442041925632"}, - {"evmos1sxhdlxwn8hvagn27zuxz4p8ljc6nvfszleps97", "4879305806363305984"}, - {"evmos1sxj0gu5f9zysu4at42equ8neakd9my0nlr8zgs", "819984814943455744"}, - {"evmos1sxsu2kyjqwn0zf8tf5jmx0dyp74n9nnsud80we", "680476386802871808"}, - {"evmos1sxtqzmltxn5xvw68guq0e7v82l3zrr4lz3uw04", "16270166050586484736"}, - {"evmos1sxy9fvmrhyrer20tc20zl8rlzp27ukjdn6raju", "1275872123697123328"}, - {"evmos1sxz69ukgthfkwpcvny7xh4d44p240dwgsjwwa9", "376832531536763904"}, - {"evmos1sy0xjjtkhtzd56dl3sqhu9h8jjcwldntrknkh3", "11338268960669638656"}, - {"evmos1sy2hpwxdvcz6486swc352mykxajkjhv4glfljm", "10134847036942737408"}, - {"evmos1sy6kx6pez3hx8vqg97zzhst0unaplk6tuck2ye", "20510078167742201856"}, - {"evmos1syfe6ddecqzw6xa59a5gljadv4e8ztd6xjgpcy", "134462001839763456"}, - {"evmos1syggs5rt822d9uv39fzkjyxlwg3ym9pvma2tw3", "161461777746948096"}, - {"evmos1sykgju4n5s4awwptg7maavdtcxlmyj9lpdyyc2", "1471981424986346496"}, - {"evmos1syktdfxl42md8v5py6a3zdaf0hz9vnfkhjt5sr", "23338714206668259328"}, - {"evmos1syn2p2p3shk4k5zufqhad88dykwvvdp99vgcm3", "9988340778407409664"}, - {"evmos1synt7mwfz58zncdjp8mtdy4myqh49qlr0y8fhk", "175939795280675840"}, - {"evmos1syps30tq6wcu7gym36hasnqx90dysfwfvcumt3", "14522737289944645632"}, - {"evmos1syqkkhag9d3guajnucl58zpqp8usms4kclphj9", "1829068791949199360"}, - {"evmos1syszks6568qvylkxeaajgfpu56rq5ktdeh4cm5", "709021251427374592"}, - {"evmos1syvdgjardequ6aka8y8nxvjh27y92mvx8lh0n4", "23927855774201683968"}, - {"evmos1syvrrm3kljdpw7fckdu6f254k5gcwlzucclzwu", "37162750945486471168"}, - {"evmos1sywnawguh40uz7zvavhy4u8nzn0q6y87haxwkw", "1639975785560031232"}, - {"evmos1syxwers3enpj8tp3zq6986nwzd4j29g2fqk4fr", "746328031501561856"}, - {"evmos1syxze4tn87hh3235q3v77wxzlfl3g8ysz4cuzm", "2193716631821082624"}, - {"evmos1syyk60hjep7tggzv2sthqf2a7r8u2waujp50lt", "168308370970557440"}, - {"evmos1syyps8wxvn3j8q7ge9c5q8yfnvqywcx9wcrazr", "15117911364560775168"}, - {"evmos1syytv9099lkndzunu4y86n2fwvypsfyve76l2s", "2698256719629102080"}, - {"evmos1sz56vwx3z5smjhsuavafu046f2lerkjny07jwm", "48213275607746322432"}, - {"evmos1sz642a56522eedxxa4rf8d96nkl404jfprqexf", "6440074006862870528"}, - {"evmos1szcf6desl87kqcfc7z60memz9ccsstnxwk05da", "13034929989866000384"}, - {"evmos1sze6w9erl5uvm9vfege05s8dc7qlr2wzdhctft", "23098273608223232"}, - {"evmos1szfd86lcpye0ye5jx5rka9g6uh2way0udz4v68", "14858163133670400"}, - {"evmos1szgv086kal5f2gp73j5wkkqefvnvsyqna206uu", "585471723068535552"}, - {"evmos1szk8rafl6j0dl2rvppak7wywwnsxmjunts5w3h", "1373737578391726848"}, - {"evmos1szk8tszgxl95hjhyrlas7zgtzl63axrks56rwd", "2994629253079656448"}, - {"evmos1szl40r70ftx7ccux9pnptayducrczmu7kkusq6", "4660719180283595776"}, - {"evmos1szlhm893ujeydwyn6wj9kx36s67enq6vte366d", "475141512922972928"}, - {"evmos1szncyhuy9t2w4x2ddkcax5cj2wh3s38fn5yuyv", "6331313186870931456"}, - {"evmos1szsrm0ec83ham9hmjhg6yntrc7mdq2cg4u3el0", "1935710002512027648"}, - {"evmos1sztuhlep9rn00edn6s56c3e8yn2pghpdxv65xf", "6944528882432577536"}, - {"evmos1szwpx0k2cn6fcy557m8665sv7xjaacr7zt75y5", "717803586214957312"}, - {"evmos1szy4ey5s4tfu2pshqz67ks9l22hup805k627e7", "5480476329521620992"}, - {"evmos1szyarclaujv2ktssc8r4tetasrufd3d9f4wq0z", "311871438834601984"}, - {"evmos1szzy6pppyh4xxn68vxs32y43rz7d2cawjytatw", "2104673596733038592"}, - {"evmos1t03nen874hzpau4kqmh0qqnak7w3n7cyy8vhsp", "3134417462892975616"}, - {"evmos1t04tn7jdf4hd9q354m4scfx2rf383tmyh8mxqj", "5316383451939986432"}, - {"evmos1t07mr7slsytpa3p8rl3p7hytye3w8u3dkt7568", "2016011831497620480"}, - {"evmos1t0e3psr78mt49zrv5qwsrk0ftz5wcy8y590e5c", "3338365584563878400"}, - {"evmos1t0hhz83ezqcq5pdqrsgs4tm8s6hvk5c23j2np0", "6844410544313438208"}, - {"evmos1t0meca9fe6tu8544s2jl0hz7ug9v7gl3q72pew", "1340585993995059200"}, - {"evmos1t0swc8v60w5uhvjkhg4mqf2dhep54c7y4q0m9s", "12667374013211226112"}, - {"evmos1t0vffjt6gfau6t057czyfcuxjwhljfk9ej6y9v", "61560589256015872"}, - {"evmos1t0vnsrmqlexme5hjq5rgeczpfz3rgk58spy7n0", "791105362224059008"}, - {"evmos1t0wzpjxnkqpx3swtp5dwgpy4ddh7auv6rw443l", "12258989688052850688"}, - {"evmos1t0ya4druanw3v2g4sls9wvk42j00h690u55s86", "384085808998311680"}, - {"evmos1t0ycm4muz2cwr0syke3mz3xc5e96kekmjs3w53", "1502849511671185408"}, - {"evmos1t0zh5ddj5w36sfkdwrscz8mjx956kmc9vl6drp", "384044958349613312"}, - {"evmos1t220zkpq6wzncdf592mt7zk9muxsf659vtwnqs", "6460570735276648448"}, - {"evmos1t22zmhmk8n3auh2rkd0fp688043mc6s5lmlv4m", "22586116833713119232"}, - {"evmos1t26ms3jjnjnx9mw7z4slwdsm2u6hh3wud4xdwm", "169110201686772736"}, - {"evmos1t26muyag6sn58n2wetxmdh5k6pqf944g344e52", "1496878235128274944"}, - {"evmos1t279lzz7ydwrp7vuszua4rfplp0ktt4z22dqm8", "4784966278941108224"}, - {"evmos1t2cduyzeg04tuwa83s9fx7rpg4mr7pjxwcxkf6", "856548848715781120"}, - {"evmos1t2flmhsghrnpj7ahh85w408uadfxq7fjmzvd8g", "2741220360799873024"}, - {"evmos1t2h003gj55vmg65aljzwvdwcf8l3sv7els3pt6", "22176326538463264768"}, - {"evmos1t2h6rzuvhw3lwzu3dgksfk9x9a7up66la8z7r2", "459095092555835136"}, - {"evmos1t2meh04zcxqljlmt6462p48v0s2ufuerndvuhm", "5175510503890171904"}, - {"evmos1t2pmnn0mdvjxj247ztu2ndd2xcn6we7lefn2cj", "17590371352189179904"}, - {"evmos1t2q8lxud8sht85hs7jp5af98wspewcaqp0wtce", "1027337164272206336"}, - {"evmos1t2qnzdngl62er53xsc9m57d0cpy3n6mnvp975z", "3459644307654921216"}, - {"evmos1t2ue4ll2tsfw7j289tu59ccngrp5n3rsug58jp", "475560332901876736"}, - {"evmos1t2xj2xcsjvac5dt8j9c3el6fqae67rdykrpw93", "279172199322629376"}, - {"evmos1t2zum63948aalgkkj2ewyhqszllhjmtjh6xvze", "152827763709277184"}, - {"evmos1t325hzza073v6yupjpuvqxgarxhkylw8armhfa", "2452101707297173504"}, - {"evmos1t38rme7ypru6g4vja74zs2wsfhvg50mjws3ur3", "11273033125835960320"}, - {"evmos1t38scaue2ax303s9g989zu5e7mz2tgq2dpf8vr", "1172407190402355200"}, - {"evmos1t38wh6qp80dd7z076qr7nkck7wne37uq94pcfq", "40127073551477760"}, - {"evmos1t38xd768myj5de6cq6apv72wegk0hr4r5qql72", "720771184823037696"}, - {"evmos1t3acfdzdgadehy8xxqms0qsqy5gjw0v4rrwcw6", "317472302107927040"}, - {"evmos1t3af73ahv4r3zucyds0lnzjwh0t30agaz99umm", "874416526944727040"}, - {"evmos1t3cr75f3hvex3cxux2gn50qfjnk6y907mxdhna", "12513245597790060544"}, - {"evmos1t3eupzq2a8xgq0y4unxqtleya5daqe0au2t3wy", "384502591131419136"}, - {"evmos1t3f7mj824el9gedr7jtf06p3wn6lcnksvythms", "1005599698596143616"}, - {"evmos1t3fma60hz02z0lvnp7y3pju5gfpzhx8y2eakdn", "19174699152894447616"}, - {"evmos1t3gy86zal5vfc0zh725z24chjyq9nc7hyh45gn", "1224741758814209536"}, - {"evmos1t3j7l08x87jj52hq264de20fv4028z8ddg4hp0", "27180141787037614080"}, - {"evmos1t3n0pyce63c7zqyf9yf7e9mawh8pxskrzaay82", "1052466023234825216"}, - {"evmos1t3rfzrxeslmtz62mydyf2xmmxehwk7xzsnngns", "2438903895745118208"}, - {"evmos1t3tuxlucy9d89vzkrp46rrulnnmmy44dn30l7h", "2228549138787430400"}, - {"evmos1t3vnldlrx7n3wg3flmrnhxgn6wdlcw9g7aemv0", "33304675969134632960"}, - {"evmos1t3wmwfv2mrldgqwjgaxtdwz2e6w2qxn9cfj989", "13315128185124470784"}, - {"evmos1t3wnxhrvu3uj5mw8ersqcgr3g6gc3x3fmd9h40", "1203219757120587776"}, - {"evmos1t3x9trgsxj7azfpp5etu6l29m5rw3zl6ya0uuu", "2046895430114439424"}, - {"evmos1t3yqyfawudpn4j7r2yjp6j0mtt952jgfcx28n5", "5296334010115702784"}, - {"evmos1t429xkfzqec85qk7k0sgf8uvkxzwvljed82n8n", "25113664466805309440"}, - {"evmos1t43ash5yw0hcvl0tthpltvecfdw830xdn8ccjw", "5644306653418393600"}, - {"evmos1t43t6ax09hvjdp6g2fdp6aqxjnc3vnf9nyhv5l", "39070152530359320576"}, - {"evmos1t446dpw4whxlhh2m6u9ky6stypmj6hgc4tp4z3", "13053569882116145152"}, - {"evmos1t44gmk5v0r6ggg2kw6fhygek6rereq5ha3fz7k", "3046264487516506624"}, - {"evmos1t44pvuks0vv7nxrkjlg50nduvywl5wrece54f0", "315845555935303168"}, - {"evmos1t45gnq4kpvndsm7dwfk8yaaeq0wx3fq4fgqaqj", "2456337745159884800"}, - {"evmos1t4hahl7km3hg5zmf55km7qgwlkg9ldadngud7m", "1115803694122949120"}, - {"evmos1t4hleppsjs30mptf42f002he9jjzuvjwszfk5j", "1202801809013426176"}, - {"evmos1t4q7gzqaa45k9uzct2hpserwk70ctxztr496tm", "6958647510471602176"}, - {"evmos1t4qymr8c78fk2243gdcsds84v4gted95ec8g7x", "3153292033804828672"}, - {"evmos1t4t9g7wyjjdpur0sdx3pk5aepqevx4k2p5x0jf", "9972130309568929792"}, - {"evmos1t4tzykghnnrsfnldcv4uxf0y7d2q7795zjr8fw", "1308480036897694720"}, - {"evmos1t4u3thy9ha9xxwwvhnzj37ve54edp2uar24aaa", "5108664546656813056"}, - {"evmos1t4uj6e8k8c7a2efg67r8a5vjtcxxsn02ak384f", "7839012207490015232"}, - {"evmos1t4w7hqr7phau4nvwmtp2x5xzgqwynhnqjavz7n", "218062465699385344"}, - {"evmos1t4xvd2a9dfagsr43ndjlsm89hxqsjzxaxqzrtd", "416727745019675392"}, - {"evmos1t4ydd4rswmu6x5zwnz9wgkuz8z7z6wfg592wrl", "960322658962419712"}, - {"evmos1t4yft57f920ur2l22mtjrtla09thgzvgdkawrt", "178808791310748160"}, - {"evmos1t4znkf82eg32f3umahwnvjuj8s06vuzrfrqvml", "2144084554626121728"}, - {"evmos1t52upd3a6q0cpturksywqwqxdfn6peygwtg7n6", "140179382961447424"}, - {"evmos1t5855zegp69m4e8tctawccpjfjxmcqcqy4earj", "2892592323786076160"}, - {"evmos1t59566lc8tee9m2dppk2u9s08f4qfdktnt43ap", "39118553522425266176"}, - {"evmos1t599kks5jplzg4uzyncpgh7gt9ke3xnrkadm84", "639934126562942720"}, - {"evmos1t5an0jwc6kecp5ru43rume08wwj03wapfs79su", "1546845785666144256"}, - {"evmos1t5csqnv4sjpfyywzx5pp3l6p0kq3rz3wz37u2l", "2836005020820805632"}, - {"evmos1t5dfkyw73yycsmhluhadt9nyg44twxdnj9pvaw", "5289377864204203008"}, - {"evmos1t5dqtnu0y030d7dssjwxyw5yxlzpp5kla2zjgc", "1051765587452163072"}, - {"evmos1t5evezmhmf227p0z7dy64z9xeju6g34ygjj2j0", "30785627462593792"}, - {"evmos1t5f85djayp2lxc7ld9ghd9yfe8urjrypvxwxl3", "14108082974281484288"}, - {"evmos1t5fpp8g0taym7x4jhuj62fsuwllvjxney6vn22", "84417906964307200"}, - {"evmos1t5fquzffmwljx9wf0fxexpn79hv39r8yrh62z4", "1006753450272854016"}, - {"evmos1t5jtfuuu039trz89pka8yamcnqet9xprx7kxf0", "89029522576827432960"}, - {"evmos1t5makwmp2jskyxnwgxa4jncp4grd056yf63s4j", "4039058905063172608"}, - {"evmos1t5n93hhfvu3sj4q9urlu358njtju6sssm7n0rl", "2210651807763659776"}, - {"evmos1t5nyft34tf6mhsd0eyh0l6797h2lz3vjltlwev", "21542141970283741184"}, - {"evmos1t5q3el6hyu2d7ly85md6stu608265jzq2h83qc", "3283649816894288896"}, - {"evmos1t5rnftux2xg8teeynjmpzh2l7tpnn75dcwx5h4", "542739485792918528"}, - {"evmos1t5s06u3tggaqd34ezmhstuca6uust3n68prfxh", "11801704141122439168"}, - {"evmos1t5ztwd2e4nh83fpmpc6hduw3udasnys2sqnr25", "728545905761703936"}, - {"evmos1t64erspf340e2uamg0t3c9nsvsn9nwzgaj0at5", "2269731066316319744"}, - {"evmos1t64u2enf3t7jrq2sw49n2aqngxhpa4qjy5ru9g", "8246055209261203456"}, - {"evmos1t67qxl6uhanmd6jdnzhp5clpyansrsj3axxr6s", "1419479319320002560"}, - {"evmos1t68858jtjxwy2jqgt0ywdglg4sj5799fjk9efe", "60488025385453076480"}, - {"evmos1t69du8h5qkpyptpy5v98d8kda9hqu4hfrq39jw", "9077228465425303552"}, - {"evmos1t6a8q6h2v6ulhpw96ets2jzecxatdafmys6gqx", "1524513095184537600"}, - {"evmos1t6e5t3trfplngm89rf3x3zx2uy9eqc24qy965q", "11409185015045636096"}, - {"evmos1t6fnstvvu36a50uwqtvme58hlzzcqfvg00zrsx", "948345541235613568"}, - {"evmos1t6mslc7xe6ezr22usl8ef22tdjzr9sdunq9u6y", "29426735762207076352"}, - {"evmos1t6rf6zu3ewf39znkmnrqquh824hrv9v005gutn", "466491703878062848"}, - {"evmos1t6vkhefa79meu9w49nnyhku5xq3dk95khsfuc7", "1533510224536826880"}, - {"evmos1t6vzw68kuq2adfcmkhe59q0c9znepsqvalrqah", "34130311797090566144"}, - {"evmos1t6wmzuuy849a9k0zw4386gx2gq4xykdnn3x847", "11353622558078720"}, - {"evmos1t6yh0unt4re62uv9q947kpx5227c5emj7gpx0m", "22792383251896320"}, - {"evmos1t73ql2zy4ye36cajspdgwypy8x20asp5sdcnkn", "818773142385833984"}, - {"evmos1t74d9yeg9qv8jy6k6hur47r537uggffzm93all", "825091077638670336"}, - {"evmos1t756ztq6tal2v3gulknkl0mrwvha96hv3vyt53", "1162734875128771072"}, - {"evmos1t77m6w8kejmegr7ldtuqv42k89z63qwhpl99x2", "3635816612928643072"}, - {"evmos1t78yxtn2hghqrw3rrksztwc282njzy9x4sggny", "510792811404286976"}, - {"evmos1t7cmc6daast0xq55kuyke8yqhhvr7vq6f9mjeg", "76319052808376303616"}, - {"evmos1t7czsyjh8ayul9jlrzqc0ragqja8cccke4kkap", "1281722414400750592"}, - {"evmos1t7g006mdd77wnr82ypzwzu3k32w6d99n06wc7w", "3298770249567551488"}, - {"evmos1t7gwh3ququyf2q4r945rfq828l3yzrf5l6f0lq", "3504441442083191808"}, - {"evmos1t7kh0edysw4dtfm4e830cjal2xpw9mn6mp4nyf", "1902643481297035264"}, - {"evmos1t7kr3uxjruey7pn0p3s27t5667emetz0y9hjtl", "2576169431228267008"}, - {"evmos1t7kw2sefutslfu5ax9p6qk87m7jy08g062uvp2", "1288022364468851456"}, - {"evmos1t7l87xkjplre4f4jl9vz5psxmmrqetf4l2u89g", "384506614960179712"}, - {"evmos1t7n3ep3wv5qftcf2gdfdecmn9zhrh3gqa8w7aj", "2547598395052472832"}, - {"evmos1t7pdp5jvttsawq7s7cc5fftf3q0f57r4hpk7nd", "3208749490211638784"}, - {"evmos1t7puceq77p0vw080w5hel8dj0gtgklxlkfdm4k", "32245554074727292928"}, - {"evmos1t7q478zhyyf58z65avsa0asuuv372zcfvgsgt3", "696986859251308800"}, - {"evmos1t7rleu45ctp2cm0vtdq064ernrye49qz94ukp6", "49857958486032826368"}, - {"evmos1t7sc7cxxujsgfyat6wjd57czug9sevhenzx8ll", "3388535937556645888"}, - {"evmos1t823ndgp4j9qx0lfsrg08tsmu6axpgjx2pdtkr", "8526707335382458368"}, - {"evmos1t8266pvcxygz8mdh5tyypwa6u26f28g4jn83f4", "24929676242992640"}, - {"evmos1t832exldyxm9xr0hpuy2zheaxgjlkkaeq8fvr3", "9019601136131080192"}, - {"evmos1t84hgpxhtj8ngczvnzkclcddmdg786dp224c6k", "3929722037639282688"}, - {"evmos1t84s5ssp26xjqsle4t3vxtp2gjcnkfq3xvrqup", "1065977000208865536"}, - {"evmos1t882n3ey2fmvqcrz6tlr770wy878pdfugzu7sv", "4800033193880828928"}, - {"evmos1t8ct8gyv7qpnmsyk45p72eq4vnemat23fpt5sx", "511079152643447296"}, - {"evmos1t8fwpg47pk6x8smq8zjl6ff47k9t8vu02js0sq", "13676731621963272192"}, - {"evmos1t8jk0m5zj7ldyj39lxve43dke4cnv3zt6ccvdh", "2377184254118434304"}, - {"evmos1t8jrhj2ghlx5selpnws2auqxgdc3yul5ymatvu", "16643326244536176640"}, - {"evmos1t8ln2k927m20pfh4ty2m8qlvjvqn5fzrkvrlfg", "1310557573237963776"}, - {"evmos1t8m6zwccqxhj3fqwpfl3vwmx8m89vqhr0a4jkx", "461867407732842240"}, - {"evmos1t8mr5p2lxnqzs9vr4uj8593dwtvscrqtjvsqg4", "1656910885032304640"}, - {"evmos1t8s27plvc3prjpmf8vv5uazywrwqmn998af2th", "1010467343682510848"}, - {"evmos1t8tr6dnzq7nm5dqyfuzuwnl9h8ye5d60pezc2u", "18691954887740416"}, - {"evmos1t8tux86d6maqewvl3rmln5hsuws42ryju9lk0q", "1704043002359708672"}, - {"evmos1t8v3wfqm2kj6lwarknu3k9uvqkx2h8aep42exh", "37421835525928214528"}, - {"evmos1t8vctjkd7h7yelcdr082y5c3l4c3g6r75cp8x4", "5927758544573128704"}, - {"evmos1t8wpat3za67ke773gnhykm6qfru2txyqknmqzj", "299658517152706816"}, - {"evmos1t8wrhegz5v9hxq4gydtppmu33latnv2j7842xq", "2273808805362761728"}, - {"evmos1t8wtkqhv8dqrdyh4cwsyj5l5wsaqhdlng405qa", "3616627542652909568"}, - {"evmos1t8y8c6v4g5muv9mrql3l0yg9p6msct0a7cndy0", "1389557130509105152"}, - {"evmos1t8yjeeps7gez3442skjgqmyg4kgqrk49zv5ekz", "432239389815353344"}, - {"evmos1t938al8sf9gw3grxsaurxlwng0dmf0fde00uvt", "35718447352623202304"}, - {"evmos1t93j29s5al4uydcp25wv9pp3jcj75aj3udcjr6", "4875441037152903168"}, - {"evmos1t93xlusk4fqgs5w0vqfhs35r49czqqp4ysckjc", "9643387069429463040"}, - {"evmos1t953jw669p2wwfaevszw3qr4c5sjntwc0u2a8u", "95950156783371776"}, - {"evmos1t96a8j9q9swy9kk5exfync5ktj84dsxr8h8nl4", "1792293324420440064"}, - {"evmos1t97j994m8txl2r58t0ayfza290a4z9p8ltneqw", "99058190324011264"}, - {"evmos1t9aeqtwuexf4t3rgre23azqwjn8n836dv57cq4", "4525079524075577344"}, - {"evmos1t9ejnh4rh3fdryyjhzcf8nyd9axhjrgnsquljg", "3370424155343880192"}, - {"evmos1t9gjgg40quyu0j4c9pvr396umrtu0nna0hrvny", "855675966037904896"}, - {"evmos1t9h6gya5jf9gsgh5lz3qlfpm40l95u0zszxyag", "62526991296905216"}, - {"evmos1t9j42ydu2qw7cuvn72fg4t2dhm4p477h8shnz2", "36854327741312086016"}, - {"evmos1t9lhrte80993dc5xgyjwzq8pgluknvwj9y8kpk", "100976362970797312"}, - {"evmos1t9lla4a6en8a0e3nzk5fz2mupwzztrqyrspzg4", "31316649014495854592"}, - {"evmos1t9m2drfqk6hf5maw9vft40g07k6rlf45uj4j8u", "11084010877294127104"}, - {"evmos1t9sm4d6xs7k6kg3wzppwu2j8jvqzcv6rtpxzas", "8101868567527704576"}, - {"evmos1t9t4p4ru80sullnvqxgvst9mdaq9chd8ka6swq", "104925182067171328"}, - {"evmos1ta5su7d63mf7l308yf2tqthcpnc6amwy0ay5ju", "1279285463618216704"}, - {"evmos1taaa2qyqmanx3g89rvxaaxum27xc45ppgcvuf3", "369238756597294848"}, - {"evmos1taaxezzn09nl4t469q9z2ypmzlg6l23ut47pv4", "360882618605767168"}, - {"evmos1taazqktva4x4qhe7haetwpvwgw6sndy8k4x6hf", "3780014705927897088"}, - {"evmos1taf9dscfp0c3yqqzeztspmtd4jwu0a7k7ku5vf", "170365662175654400"}, - {"evmos1tagn3lu2x3ewdye2f7fjqg68dctjd7tnc4drgm", "706385053496842240"}, - {"evmos1tah8q7acmcjvyrs93wwd6phcd4havklamzgca2", "1192222850654709760"}, - {"evmos1taj4xe40cqu48tku0nt0w8pz2ehzl88wjhpgzu", "4752732221913153536"}, - {"evmos1tajq6phfcepgqvevj5fdwrn3pa92jdemnju3f2", "6740332532999135232"}, - {"evmos1tala0juy4y9p0xwxrhh0ux2tflrh3ll4hqzvp0", "118749658597542723584"}, - {"evmos1talecvcugey87a6p02eel5t2h9ldmlj33u0u0a", "13885218867286884352"}, - {"evmos1talvkpk72waf2d4z7rgjqqhp6f2u0r6tcyak0j", "153127531147284250624"}, - {"evmos1tam2rsnkcnjeguv2erj7hxmw9rkhy6ur2tkgsg", "6243036369041326080"}, - {"evmos1tand0yl7l78gux4fftpsck6lze2mg6z6jgqs8m", "9967192069096853504"}, - {"evmos1tapkhenvc9s045njey8jm740fcvvesl2z6v5cr", "158054330101292032"}, - {"evmos1tarh677uy37c25568yaudf4grv44rtxdrxtgct", "161278785601583104"}, - {"evmos1tasklvy8u6r0y0gpumne96vyanzxqut0zp2zzl", "32237669073567158272"}, - {"evmos1taxjg7uktxtj6m39xrgkw5k9skvl9x3eyshj2p", "31277358093066268672"}, - {"evmos1tayhsf2cejn8mxh3y83pjvp9790gfcgn9zw2cd", "1918841609805115904"}, - {"evmos1taz7zpnn4metc9vk2hl0cjrl56nft2xdz9k4c9", "6602359808182423552"}, - {"evmos1tc0mh5d8g3mwzctydk4k74gpg2eejd0h2vvaam", "1506376462632468480"}, - {"evmos1tc2ck3zhm867xnlq8ha382l4l06gnlhs9lzj80", "384852934712870656"}, - {"evmos1tc2l7swajajppra5ud0zdqc07phf3yk4y2swh4", "6448408933270158336"}, - {"evmos1tc8upea8plkxmadmc0v3wvw6grtvp03a5r2c59", "7480374376305942528"}, - {"evmos1tcaea94z2s6fmyh44049r7t7vgq7kdyyeah9sr", "9122487095192223744"}, - {"evmos1tcaysu95lhpw84nm09arhvyytfxmyyngl5dvrr", "3802186999389593600"}, - {"evmos1tccdj7tdz6yph99tx2hn4j82w8fv3fuglwf5tt", "1174977003951845376"}, - {"evmos1tccyyrrjk6h8p42a57e6et3ru462yg8yy9yzkj", "191388508918381056"}, - {"evmos1tcl46fjg3jf858w9p5fjj856az2m6vmfjp2hpv", "2023931274827557888"}, - {"evmos1tcmxeaeq0dlayk6nfsskrcer32lpc6gts9v4wr", "7165722771180683264"}, - {"evmos1tcnmahw7exwhsenkw7hstucudwxn0ssu744yhl", "285190468187533312"}, - {"evmos1tcr8hy8rsv8qrmrhcnxkzjjl7pk6etxslz48sk", "10018562500758913024"}, - {"evmos1tcuctpf5e2wstn32z464q4r4tzjw8znjzptlde", "313310943532178432"}, - {"evmos1tcw84xakhjpgjpnxd9xjmtepgmmzhte7dyuaw6", "3366729118641583104"}, - {"evmos1tcwhf82k9zaxrcrasjeahuxs8vpq96lfqz86tr", "15135305210906146816"}, - {"evmos1tcwvcqvxy3mpt58uamtfxu2vdcvlwff4e0kxr9", "33902453000247566336"}, - {"evmos1tcxe278hdtvg86wau7v8z07wwf27ze5478h0je", "1593649351210719232"}, - {"evmos1tcxjgl3nw48t48ld74wf3px9hfjs2rw3setyqn", "4462492151674577920"}, - {"evmos1td06nxx8vkmp227haa0ew0l42pj02x5nj93w09", "472461367194866944"}, - {"evmos1td7ua6wv4uhlj8nt7f0eu2zr0h9099evpvvu00", "384314424118280448"}, - {"evmos1tdc6hzd8f6u9z4v9hugq56du7yhea23mgjl5ht", "8443643143448432640"}, - {"evmos1tdcrshj9s6kp23jdkqr36de6rklvrpstnpz83d", "5677434808403857408"}, - {"evmos1tdd8hr02ca4mcgp0eutx7trwgpxes6tk6cfxvl", "48701729762277888"}, - {"evmos1tdeqhzzthf9c2n49l4kujylqajfzlmufdntfp2", "3398283031774503936"}, - {"evmos1tdg7r87pqxczwm4mnl0wg5f7da84kt5wx6420d", "3294804068123305984"}, - {"evmos1tdgx6m7fp85ywutqm2ezhhrsk48ts848x7wmpe", "6168863761085878272"}, - {"evmos1tdhn93u57l0ucfvgjws2tpfc3wthernfxe0p5u", "143508191088152805376"}, - {"evmos1tdn3p5qt6sjqvfwljksr85wgjpvx4aau23fmce", "686446462043237376"}, - {"evmos1tdp7gcelklg43a9ts32sl79nnnf80x20ssnjvh", "164668921282555904"}, - {"evmos1tdq6aztrq82293x28cqgsuh8e05mjfsaeexgvp", "474678811048378624"}, - {"evmos1tdqfwl8tc3pvfcz79wtsv7x3t3z4ag8g6au6z7", "8980863761906982912"}, - {"evmos1tdss4m3x7jy9mlepm2dwy8820l7uv6m2pg4jx6", "4918100510193082368"}, - {"evmos1tdtpfw0ll2muw5ten6cj6h9ezewgcs9ds7248t", "171605211683646976"}, - {"evmos1tdv6nkkkxsa0jrl0cl8n84rcq09vdg9xvesctj", "472613880306029824"}, - {"evmos1tdw7hf4vd0hd4cfxjkxm4jkn2c42x7p29m86vj", "9747577340501893120"}, - {"evmos1te56gwqqx5hn7h87wzsrmh7tfrc3ksq4y2s6cl", "1600469304459169792"}, - {"evmos1tedcc7v6vtqkfx0m8afzaryxxdv04m2xkgefdx", "10893200807628275712"}, - {"evmos1tedfltdhudplz85mycv7kljqehp75cm2fp5f85", "2195233196984255488"}, - {"evmos1tedue33nryw3aalsw5scwg969cat780plvw5yj", "12218607995118862336"}, - {"evmos1teegnkj9uvt32a8x42cvrt4gskf0r8s636tjng", "3605885716243502592"}, - {"evmos1tehc5xh583aet6zdfqech5kq88n7dql70vgnsg", "2171278520988256256"}, - {"evmos1tehy6hydwduv59w96vlvatw40ey2px2m9dsnfq", "5070927169539850240"}, - {"evmos1tejpr7qu9eaj40rw4ezq00ka2egh0dpc64ypfs", "5658592288386301952"}, - {"evmos1tekdz3ctntezyxp9daewmqgte4f0qnp38ejj34", "668726214503007232"}, - {"evmos1telxt4ql6x4cp8f3pxp86s40lygw3tjv60s5xh", "116495345940981248"}, - {"evmos1tem3q62pn082yswjal4540l0nd3f6a8hc8ydvl", "28296864605703389184"}, - {"evmos1tenggq733syxfeey5zh0ztg64tavfv32r773ru", "1928550050194781184"}, - {"evmos1teurjzwa7af676zdyzay6lnu990qa43j74zg3d", "6688485870835347456"}, - {"evmos1tev4t665lqelpmwzqpgpqfzxkjj5rcj8av079n", "11007789195232985088"}, - {"evmos1texpzpsh998h0hx74jxr8rnfxqzg688k383fvh", "43358703811676160"}, - {"evmos1tf2644ge244yplj9gmer5p6sp53hnna0k8dgye", "2046081372023789568"}, - {"evmos1tf6gmhhlmfcs3xcrvr6a2ghzcc8tsjx4xd2ury", "14668537919592171520"}, - {"evmos1tf7tfhgfrtu762af7854tpw62d76e06wctahm0", "13256183391960944640"}, - {"evmos1tfaasx3ercxqx7etm4rf9mk9fp37sy7lydrtcs", "522697236711097856"}, - {"evmos1tfetltud6ke9r0gq3lwqk3jkxxdvq5ymdek4p8", "658725935446353920"}, - {"evmos1tfhe03s8gharhtasp269m4q9t4aclkcmzz5amf", "2216028291321069568"}, - {"evmos1tfhu7zxffp2es02vps53vxzpvpesgnkgupkh89", "363885789209060352"}, - {"evmos1tfhwq59txw6cplkdqfkwq7vasaa5ce7v27ga9j", "139180112699164672"}, - {"evmos1tfjwfmvcacls45zrf7u7q9annl2nu96pt2kfwq", "10485517879585923072"}, - {"evmos1tfkg6gv55qgnegf873tk7v5jlnm6f3y2t6m834", "509711114459062272"}, - {"evmos1tfmdnlerru3mhdeskrmtw79fv47ttx2e72vajh", "1233887624964292608"}, - {"evmos1tfn0vnjpgyk2scy6kq2afa53k8ejn3560a5vq7", "1473189681404084224"}, - {"evmos1tft26hjya4wxzm34e4s2ztg3rzzpx34qv52w8z", "2929736374051635200"}, - {"evmos1tfyfh0k2gaslumm6c3qz88gny0rhg7t2djvkcy", "9245942998076923904"}, - {"evmos1tfyhc27p8jpz9waw9jxjty2nfcdlxmc85sunp3", "465902764400030208"}, - {"evmos1tg3jt0exr45rzs9ar4t9elqru054hpuuvzynzp", "1839933092727471104"}, - {"evmos1tg4xxl9fe4mxc6hzj7xkgwfae79marfqvzpjrv", "7841477418037985280"}, - {"evmos1tg52k4f8xdtqpxqkxmeneyn637rndy8azsy59l", "940683675525449728"}, - {"evmos1tg92uvwm56j6pz08ql5378ystku7n8elhl5y4s", "3116790936587619840"}, - {"evmos1tg92vamnyl9eackwewtwgv90hmcnral8k0fd7g", "1439541939668418560"}, - {"evmos1tgeyfm9tvhe4v2m9f503s6eptkchuhhnw7w6ul", "9589599796041521152"}, - {"evmos1tggyznxggr9eefynfmhtajfssn2jewvcj37cjr", "3899041623855894528"}, - {"evmos1tgk3ee8s8eu320jn0pah5jczn404w4sue8fmln", "2673600463075419648"}, - {"evmos1tglzj0l6tyq2ammqzq8dhcsas5vtyx7lpp87zq", "2428224899141952512"}, - {"evmos1tgpntfxgchq5aqzqcuzdwsghf5wuk86082ewtm", "13085551233806053376"}, - {"evmos1tgq8307dl5z5aj9l5g2fg30cgxjw7zmhm4wx3r", "9659247094679666688"}, - {"evmos1tgtucux2quumwcluh3x6t4nu5f6l6lxnn73qy5", "2315867254949576704"}, - {"evmos1tgvm50v5473epgz0yk4xphvf2k64alhcdc0qdg", "1590903903644221440"}, - {"evmos1tgwa7y6a2ml6my7kzcksc0gscjvkd5u2afntuq", "16671405537868294144"}, - {"evmos1tgz09d6n5px2zcx23j4cenj8q8clvzn2v80zd3", "49026844540635103232"}, - {"evmos1th3n8r4nu4fj52fcrw7xj68n9kkjyewqy4str8", "5001985238084158464"}, - {"evmos1th7rcyj25g32hpxkj3u8ce00anzxjygy7trrql", "2482323492218224640"}, - {"evmos1th86l7q0d7m4v5k0r5vdk7ns00huphz3a06m5j", "4671035479689314304"}, - {"evmos1tha6x9pmrsg0v82rjq9rsp6pzmz9y42pgt2yuj", "5982304874511962112"}, - {"evmos1thdt8rayngl7h03ymwda0pfcgumt20huj6f4hd", "71974902307885056"}, - {"evmos1themne70n38u3c382cqnh3dtpx3lunpshrhcdc", "6766611990593503232"}, - {"evmos1thgs8jq2v42afzfne8z4c0x4jmm32yn3cyq29q", "1283090244822978560"}, - {"evmos1thjp709gtskyvd54n8lnzygcay7npt3qla9f0p", "759850398994406912"}, - {"evmos1thkdc80lcg2w2efqhhe8xv8xr7n2lp4le27qu4", "5476522550553509888"}, - {"evmos1thm5066af75v784n799eqqtj67a9x3snqks609", "369398779887395840"}, - {"evmos1thmwmtgnp0kee9hlmarrtfj7zdpekgkhfzld2z", "32309458187849175040"}, - {"evmos1thnxuz0g50pnduuhlksg7rfcjaj6zcj5k0zmzj", "218485261013005312"}, - {"evmos1thtcfhj9vaulgqmcec6z9l2ul0r8nf7vgygsny", "1156181865729449984"}, - {"evmos1thwd8f2vmc96egnfdv4dyufzvz2h7r0n5jcx0a", "365834753661550080"}, - {"evmos1thygscxcmf89hym7dccfgf50vnnjzkrfxln9pf", "686361723337037824"}, - {"evmos1tj0gs9fc543scg5vslteq7cyjkl3gssjsf6qne", "3551866686882395648"}, - {"evmos1tj0rphhc2v6wtp70xm4s00wk5u4lz3fdssh7m5", "761599446118003712"}, - {"evmos1tj2jjvu26uw0ccumad92y5qg57p6k9x2m75jt0", "1343024004119459840"}, - {"evmos1tj325kwdkgvkjnaqxh42czh0gvv3fr09ukedtu", "603619018119528448"}, - {"evmos1tj3eh0qh02zjsnu6zagryf5u9alk5juqdwwpuy", "1502588564104642560"}, - {"evmos1tj5ctz5j2hxch48uyr38xzyv3g6ca37zwhlzen", "11386324955888168960"}, - {"evmos1tj5dsawhlps96jwcyxdq4myfl8g20c39myxp0k", "1817820726905624576"}, - {"evmos1tj7af8p34ugye2ey8jq803s9lf9jgzf3garwvq", "1178295754125381632"}, - {"evmos1tjamfw4nhuf4572uehunslvmcgeml3xzldrq8s", "2824321449689859584"}, - {"evmos1tjcgjw45rq4zef5h3znf25zwflcd6gs6ua4elv", "248707459292244992"}, - {"evmos1tjh0wczgjffg4jrzu0em0jxxgd6pnk4nl6elfw", "2505989250654003200"}, - {"evmos1tjj2aucawptz0ch66mz22kf2k9awjtl2fvqhpl", "17936374869391228928"}, - {"evmos1tjj5mmewggw4z3jdf06m5869vstdgxs0ytx908", "11942959746901917696"}, - {"evmos1tjq9uwzefw8sx32m253ftqdkwmrwppwgqfgfs2", "4689262842917191680"}, - {"evmos1tjs2zl3cgsdejw9asuw25rndzyf9a5m4v3tn6t", "2118015398893824"}, - {"evmos1tjt8pajt9kahzx7cja06pdx835gwyxk9cf22xa", "723712147000207872"}, - {"evmos1tjuvudyh8sm5kmaqu5lsxyspwu7adjf0tejx6d", "565468824207269888"}, - {"evmos1tjwp4crvjzpkrzgwavayvjgujgkzws8r6rn8y0", "4801692721733238784"}, - {"evmos1tjymfgpymhyvd4s2ztg0g6p2rwnytfznu93xqp", "2735696325387051008"}, - {"evmos1tjzsj506265fmzhy5r6d2wr7a76q8yvuknzuxj", "100481707733847605248"}, - {"evmos1tk4lm52n424549c0m9faelhw30mth9rw7v724m", "8810121678514626560"}, - {"evmos1tk53kvru3uhtx3t7j2d6s5kdufsqlpnx2m5566", "914493205208734208"}, - {"evmos1tk6x0xq74fxdpyd33dtehz0j865kdvjwdesjue", "31333841598036295680"}, - {"evmos1tk7wk85ldwmevmr0tr50srvt28d05cdcdhxns4", "2997620522916216832"}, - {"evmos1tkcl023c0qv0pmvr298x8nmhmr4gvtes7h367e", "2150893601450131200"}, - {"evmos1tkd354zz9hzf2gkk5l2w47e8py06lqt3a9nu2c", "2276261109849039872"}, - {"evmos1tkgq6cftc0cnkty3j763nnxcmyqry24emf4slw", "121100195400973582336"}, - {"evmos1tkgujn7kfgy0nwvp9s30fk55pwxwmf8wqq0za8", "3334063608841574912"}, - {"evmos1tkjncrwku520s8u7xx92md4c8v4s2gz2hygp6r", "5654195068518137856"}, - {"evmos1tkkncemxlhhygxxgywu5969qyzkc4p5hae5a04", "11834033757370693632"}, - {"evmos1tkldas2nwvz5s4wh88pt6granmmvkqqnaajypz", "3257647976203460608"}, - {"evmos1tkmsr3ajj9h3rmv0tmpw4p6s2hvaxpfagyfyp2", "902759423472333312"}, - {"evmos1tkpjwj9ay95xy2864dcz42ggxjqghq86vqeqll", "1289975936549672192"}, - {"evmos1tkqehyjnyk79hrt388xw7q24jss6k2jhyq2588", "864262432073017344"}, - {"evmos1tkrnju0fw8znx05c77u4g0skfa6yg8kn0qsxh9", "101184834064081408"}, - {"evmos1tksf9parferefnv6xfejpxadmru8s47dwuwfrz", "13356780467331584000"}, - {"evmos1tksz40u2tc6mffvd02f8d5syvyyzvsfhlm6w0r", "2774100742203334656"}, - {"evmos1tkta5mhrd62lp30pfevhpk6u7cdeasryaq8teu", "10440773761718775808"}, - {"evmos1tkvx0z73hr4ze0up4u8mrca8kva5p5jevkkfrx", "2490188382912614400"}, - {"evmos1tkxfce6ks8j55nv4xdpjr7v9g9hjh3a0hg598t", "1060099043720122368"}, - {"evmos1tl2e64sdun636yraj7cyr34e8yp8zjwlg7xym7", "384377126117507584"}, - {"evmos1tl2smtgkepmasd6zjautxkcfg6wvvmz59t78nz", "631098829203267584"}, - {"evmos1tl5kmz8qqq5qn8m4p8vlfcrynuedrvdvxsah26", "1459095485271892992"}, - {"evmos1tl6dz0dk7q4tpvux84pxkazzhp6p6kkxsn3g4g", "35012272458729611264"}, - {"evmos1tl9yv4ma65mxd6zh3mwkpmvx2dhyh6m2gd0z8r", "1103035508159415296"}, - {"evmos1tlcj6ctlj39um2pa4lmlla8dwksq8s2twwhmf2", "10306901561316169728"}, - {"evmos1tlcll65mcp9zg8pl0mpft48rx90htrpq6j22g3", "4398840277922398208"}, - {"evmos1tledtgg7ug9tt88zy92uealf7xhnvwpfcy9dts", "3936949588479492096"}, - {"evmos1tlf5v48uzy70y8v5n97mv2zcujkaz8vurqfdpj", "1075221110582690816"}, - {"evmos1tllpungevytqf8zvzlglf5j906uj5ggqpg660s", "3267435432670967808"}, - {"evmos1tlnh7jmszk955ua48ugfwtslrq3288cc9yqmdn", "444971331642951168"}, - {"evmos1tlns6rzp5gzg88yg2qexrwlm6k0h9ghrx6t8w2", "574596511326038016"}, - {"evmos1tlnxjyd6vkkjmwhurcyw8k99phh087lu0uze7u", "208226570262991872"}, - {"evmos1tlp9xfqzhd3esyzu879cee9zf4vmgdu45duwuq", "1156780107896369664"}, - {"evmos1tlqupdzx0wet6l6n7ukn039cg4k8zk77paavxv", "156038111860415488"}, - {"evmos1tlr8mp5x477adgy4ptjfedcdvkhcucwen96g29", "56783948525661585408"}, - {"evmos1tlsck7c8xdlu2jxt0s7vmchkrrcad4c3l0w47m", "6377814696346238976"}, - {"evmos1tlw28fz82w9jllyl55mnt5km6p8fn7gszqfxk4", "2982828991688220672"}, - {"evmos1tlwfpx454kxjzsxac5scwfzkh2zeh9j6n8p52u", "1412698484324536320"}, - {"evmos1tlwm24zgcrk9mtzhjjkrakrn0vmq4uefnjnllz", "2217107552860688896"}, - {"evmos1tlxcfu79xx5mr68lt6mshqphgek4aylnslt7hn", "1690628089161519104"}, - {"evmos1tlzm9lzcn9nmtljg9ceamnny3q250gqktjqpkl", "1499865321937235968"}, - {"evmos1tm0kpjwuv0h6dwwdg8g2a56w58r70asrzw9l74", "1109929179260463104"}, - {"evmos1tm0wn5uva2hggyaw4k2futzw7l4lt4e7mtl52a", "4253491222717176832"}, - {"evmos1tm0x0yqzpak32scv6z63uauy3tq9ydazuu7etf", "371773685254418432"}, - {"evmos1tm3mgs6av7esjalc929k9u7m965vfa8lhh36xc", "8706477345930240"}, - {"evmos1tm6kn9g9z0uwrlqtgfpzlhjzmyf046gy7herky", "1739464348452022272"}, - {"evmos1tm97djmc4d7nzjmkxk7y0k738y82h7kezv84tt", "820596540589091328"}, - {"evmos1tml48tjc7uzzxepce2s3dzpt5jw4pywpr362ws", "1649049179445315584"}, - {"evmos1tmljj2ezq0dvjw2ryg78t8svs2lj3c2ukdc22s", "697608528260760576"}, - {"evmos1tmpglk2me9egq0j43cdwskp97lztxqq5mww5w9", "352379915051587328"}, - {"evmos1tmqh92urfy9u5xa2yj8sa2xxszs09pmglv6n9z", "1467807675110629376"}, - {"evmos1tmsrggdzl8t8jtn98977ldu823eeffg5njqnaz", "4298482603168055296"}, - {"evmos1tmufjsgdcwfg95v6hqkmcgpak8qqxasn8kywmp", "2429364722888891392"}, - {"evmos1tmwjr0flh9vvf04mczedc0dn0up42pwqu39kph", "176748525684460544"}, - {"evmos1tmxjq0jduyxh9pztryhlma5nsvr9f8eafqdd9z", "3213368957229793280"}, - {"evmos1tmxzt50ktzhknkd4nl9wmvkeacuz2spk0juc8z", "31211223074415640576"}, - {"evmos1tmzmzs3wu25fp5j4wmq0mtjplshqlekgaek6pp", "1367478629051635200"}, - {"evmos1tn3ujf36s62atrgvjjcm5wr0mppskzfkssktt7", "464120500305420544"}, - {"evmos1tn55337npeh02mm4ee6jpert4cftg48aqrwg0q", "10037054885607733248"}, - {"evmos1tn74wkenqadce52rkcgqs4u49xd67lkwe50sjl", "9336676927129075712"}, - {"evmos1tn9nkedgl65l4nly5rnmxyjlghe7ek8kfqndec", "16248291025825247232"}, - {"evmos1tnar4g5fj34tfae7l7l40ldws4mnfan7lnd2g4", "3994119096055151616"}, - {"evmos1tncfxxk8n4twlrkw76zzurrc77emu7ylj7jkuk", "2753533712142010368"}, - {"evmos1tnfsqskj8nec5jq3h0mcl2dppqnw9hsjxcszeu", "1469189383998676736"}, - {"evmos1tngd38dg2g9t4c8wevyhst5ewhf368h854pj4r", "6363223885913331712"}, - {"evmos1tngxpkg5fweskhr6kvph2tvpv56tsel2j4zmc2", "87773196209205248"}, - {"evmos1tnjdk20kmlg4ex3kchvkt02rukkf0esm59fk9u", "1674238588326471424"}, - {"evmos1tnldgq5z8wf9n8var9w0x6p0udmfc7hacz3m52", "1329734337852551168"}, - {"evmos1tnpvy5w0sjympc57nwnre3mv8pdzeuk8xjquma", "6342520147296731136"}, - {"evmos1tnujtz54r74kqxt3jw4t2uzvguw3sawqkjz270", "466234039326132224"}, - {"evmos1tnul38n4pdven5psqq6fj0uflsxwvea5w5vt9l", "2605727151484267520"}, - {"evmos1tnvh3prvayjepr8dxfxxqz9vlpsj6y5pv0cltr", "107037109140321280"}, - {"evmos1tnw6v77h0q0sag9pq7n9waqnmc3vhwl3dkaa5q", "555369394420836352"}, - {"evmos1tp2zxyn4aqzcxvxau49h6tr0ezya8e5ap6g6f2", "391019845453407232"}, - {"evmos1tp55trekpkxpeey7xh7vk0g2ruj734fnykn3ex", "2010072352086556672"}, - {"evmos1tp60a662lycza3tyq3zrzysp9887vxgjdmc3dk", "339575831052822528"}, - {"evmos1tp9h70vd6uezq83rmpxys593mjkstp93z4zcaa", "305758232231455744"}, - {"evmos1tpacmrvhzt39ghdtjfn2cwxtrg8vmullaa7y6s", "12962766120308649984"}, - {"evmos1tpcfyw3yfaf07tg3n7l42f2zrcewcqrwwxgrt6", "705933482257548800"}, - {"evmos1tpdqqw4qk3rvp7d667empwk94qye3pvgtqtf30", "3259921076078109184"}, - {"evmos1tpf76nex507w54jm877xnza3nn0km6u9dyefm8", "5831649642740973568"}, - {"evmos1tpfnpahyk42ylxh2htds4wguu8yhfy9qezrsrs", "1020181865362579584"}, - {"evmos1tpjpe42pplv6x5gqlcns0u3u4rcts06ner5uap", "1890306029976838144"}, - {"evmos1tpknj3wntq48yh377r8deums4u8pxykv2fcaav", "16065090918517377024"}, - {"evmos1tpmdjuwte5h9crrk80frfpa4rhgfmgknt285zu", "56536634948891435008"}, - {"evmos1tpmdxl923x9nke5jxm4np39ju9mx966k4tt70q", "1291153541697104384"}, - {"evmos1tpu232kcmv9y5q53fddgy2r3em90z6ldvr2pka", "2755251129274302464"}, - {"evmos1tpwat7zfmjskqy4kqncwfy0qdwe4mcc0h2ceav", "257683357209272320"}, - {"evmos1tpwdsuvp9aa6a2lre78arssmeuzcauuzqmffx0", "2212191638533865472"}, - {"evmos1tpx0r2yztxgvdxmuq25wye5625dpdyhhy32947", "232189740798267392"}, - {"evmos1tpyq7m6jlmf575c5n50nydccceutttg7cwwvfz", "5171581647510032384"}, - {"evmos1tpyvafcp0vxnvlnle2sh4shwp233xneyzlugxt", "3770514158838564864"}, - {"evmos1tpzqmtpad93087kjx83wyw8s9flm4rt6jwfqgg", "14364702205173348352"}, - {"evmos1tq2zsrg2razu3y6el92zgvg8296e6ee6wfnj0h", "5135810055886057472"}, - {"evmos1tq4fajs733qpelkrxukun0wznsgrkr0ujt3t6e", "830592917367801856"}, - {"evmos1tq4sp5pyh2z0c575faa48ph9k63jjv490vyt0e", "3217549043451607040"}, - {"evmos1tq7rag29yc0h2yxl8u8vxrns6d42v0lqppfjct", "2394084095609088000"}, - {"evmos1tq8wy7shzrap5c30ev7azwkd2zlw75xwhdy859", "1696075175467745280"}, - {"evmos1tqa40ne06jcdqnhhuvfvhkc2f9rta0mhwvd4kx", "1225692422042206464"}, - {"evmos1tqcs6ddxcet52tewjlzw4nn4tgf2pun4tae3j2", "4208006977882458112"}, - {"evmos1tqdjxe8dw9utvmqah4s6memg3nzf74rmuffrv0", "1924036740463651584"}, - {"evmos1tqjwgdyql7teq5zs0hp2jeamuq9ug5y8qgfesu", "4554065033374325760"}, - {"evmos1tqk2kpr758u0za5hsxy9gz0p47pmel4l8ksxed", "123431640420096000"}, - {"evmos1tqk4vfwu4kc4y7v0czlyg4w32cj4y5vuhnyy0s", "9681246704073105408"}, - {"evmos1tqkwulat6l5agmtaxttpahkmhg3nvc0d6k5mn9", "3246740093771399168"}, - {"evmos1tqmgdcd3uvwr0unj9dgfam9ha2dwhjr3wm3ypx", "13605859270819250176"}, - {"evmos1tqnktfdgxsn4q97g9uhj09g2xjecujz5zktyqh", "235837300768444928"}, - {"evmos1tqpujxjg0cn6s2fft5kfqfk0nlayde2cfcaysp", "10602558555509352448"}, - {"evmos1tqpykmqsqh0yp6kz6nqxhj28a0e2xq40lermf3", "89995259667963543552"}, - {"evmos1tqrt3zf0pf8txzy9t0mgqapxwgdjyhc5mvvn07", "5370590792223125504"}, - {"evmos1tqt5tqhzfdtd0m7fgrhskqqc8wwx0hn6r3jkvc", "9561129886012715008"}, - {"evmos1tqvj6h4eca6v700pa745zdc6rcujl9qaxgugmy", "4096570335224397824"}, - {"evmos1tqwpjrfplkmrp5nynjquy8r3dyklpx2r8tpmfd", "77160185019328000"}, - {"evmos1tqy4muallc4lqngajavwhl8e6p7z0x33yqzjwh", "315254496369311232"}, - {"evmos1tqygnvlrxt4qa5kx3lpvcl9l5dzfhaadgn5kmt", "248489947693465856"}, - {"evmos1tqyuyn83kr2grapyzu0y3u7ekfse8zr503aty0", "677190685417626624"}, - {"evmos1tqz9z7hevxphcp63n8a0gwe5eutwtukhycjjfw", "1176272827839180544"}, - {"evmos1tqzlnqhpk9nhtu8zsmmx20u4dqa422qgj3jrnt", "54287150062461952"}, - {"evmos1tr6jzvzgdsw4yxlmxrfu23hty5jkttwamn6vm7", "1326280412049790464"}, - {"evmos1tr7n9p0plqucrqgprnyq67t5xcpk0y4sf6g8k9", "2367255627444514816"}, - {"evmos1tr92k5spytn78snvdkmjpys2g6p0zv5ya9870z", "1157117087712932352"}, - {"evmos1tra5lqtwymsxm8u4zlz8mk6w3rmzaeg3aelpr4", "1164771141175917056"}, - {"evmos1trar4zcwqsrks3m6wn0rzejadxchmjz8de9and", "59492888234292051968"}, - {"evmos1tre4ar6pcz3kq5s0tpy9j2c9f5798avkt4fq9e", "2216845890630175232"}, - {"evmos1treh0xpp2v836xk83eyfjky9v3rxx0pfmqzu5n", "1393744121600658432"}, - {"evmos1treyzwv3v5057fvl3asyaln9l9a06v9sftmpz2", "21643757416005472256"}, - {"evmos1trkmdl64752xvufd3phxahm6868q3d268ac5jw", "981065900292516352"}, - {"evmos1trlvhk62tsn3cw2ufuanzu9dwvcxm3za6etks4", "1005445790074647040"}, - {"evmos1trngsn6vp30cz9y9fmmny26v7qcgdu0m36kt0n", "18269920193992415232"}, - {"evmos1trs4h5nk6wgl6zazpnk3deq8r4d99amdfw8yj3", "676031071795481600"}, - {"evmos1trt2wc7etj9spwy3hvjavhs4z3x6enkkkk9t2a", "3195453756503980032"}, - {"evmos1trtskcdzsdl7wexzg4kkmtfxcfn23tqzudmk5w", "15737549864378470400"}, - {"evmos1trucf5xmxq7ttvw2qerjxhqnualec4st2ts5uc", "4158129726469062656"}, - {"evmos1trw3spyp304syhf03kzzn8y9ttg3nkxx3kddl7", "11812644265647282176"}, - {"evmos1trx9ndq8kt8fedtawy2wqkds5e87psrvjfl2j2", "464277145942421504"}, - {"evmos1trz0vyhc4zwl73rqx4r9h64qqdrxwrfa2nmwcr", "2722865786348109824"}, - {"evmos1ts3ez49aff2s2hykqd8vlxkapa7yjelq5s24a8", "1521937721972449792"}, - {"evmos1ts3ezv5ztzvtcqz8ak9xkdr63f8wvg0tv92erx", "18225497200268419072"}, - {"evmos1ts6p6fy7dw6w4ah32emvuq2mpve7w6jcehzxe7", "972502592673784832"}, - {"evmos1ts7w94nadhphepqmktlt0ech0uj4erhew6mhg7", "5054331615943680"}, - {"evmos1tsceau5sn0zscj6j9clr722kvhuhrpspmlzggr", "8307200033046257664"}, - {"evmos1tsf3xhp504v8kw79pfgjz7tv2lcdy7n7gqg3us", "1862748681996255232"}, - {"evmos1tslvu70288cfx2ufm26atxerv0z04h546drfwa", "1744462761026978304"}, - {"evmos1tsns22p48dztncglhmcs4253wewsgztf0xu7qq", "448453252339363840"}, - {"evmos1tsre2q7lzwpchzvkqnuy5zrle2vapvn0trs5hu", "12879073227354583040"}, - {"evmos1tsvrvussqdc0ptq5pzlz6uvjana2cjlnu6tlu8", "3668723356076654592"}, - {"evmos1tsxy8mqmx8jey09vpx40cd68n7ycncm92vnmja", "5510548691176523776"}, - {"evmos1tt0lekvkstmlpm6e0z60w7rjagthkj2xk0rq30", "4813622320492144640"}, - {"evmos1tt3g83sy57sw9vep2vhqmpzea74mxg2d5ya5nl", "2671211944112678912"}, - {"evmos1tt9h0xeh2gksp0eukw9vkw4zx3ndxe7qwtu8qp", "9683215018940706816"}, - {"evmos1tte550llcel8w7pe8tgp7ssyx48l3zw3xv3t2e", "7290194625369866240"}, - {"evmos1ttqgthdqx05jsmkp3mr7597xfuv5eyuahdfsyx", "384236764480555008"}, - {"evmos1ttqvktlpuh7xs5x5xm48p7c6m96702ahjeu6e2", "2153496950793147392"}, - {"evmos1tttlkgs92e903rw9m4z5k26gq7dkq85mmwt7ed", "850886408643182592"}, - {"evmos1ttuy7yccysd5yf8vlj0x6n5h5vgce5u0ummy9z", "4841009596663148544"}, - {"evmos1tu3jdykrvmd8d7wrly89scyezau2fahfchf575", "2782139910070812672"}, - {"evmos1tu4454z5up9dyw2t9twj79m00nxz9n8fcuujl2", "15788592127255281664"}, - {"evmos1tu5k50dy375rnj9vjns7n5wvgd7y5v289njccs", "6282801881590027264"}, - {"evmos1tu6c9vrtv6tl6e88jx4h4n5g9lnxhjp4nrk5tg", "2307502677654115840"}, - {"evmos1tu97t3nqmf7kxwkz4fylc0sr3rm57zxay4k2pp", "2338735982444380160"}, - {"evmos1tud2qvh48s0nddwdgw3s7wzumr4lvecjcje9w0", "67644714995560660992"}, - {"evmos1tuehxn28wcd3278jpqy8zjkl9fnf6gagjtc9c5", "22476115422198063104"}, - {"evmos1tug798t3nfhzmpq3edhda2rkkgatjkju2fedzd", "296921914475356160"}, - {"evmos1tuga6wgg2tjcvn004nj3eywxj4v2rslwh0p9fq", "1718005811985481728"}, - {"evmos1tuheeul9k4j4amhrpt08u4ycx6ej9ladx8rgt8", "802826017957560320"}, - {"evmos1tuhhh7um4dxwh33ecm4gszx3ljx3dj5pd63u9y", "234633993655931392"}, - {"evmos1tujznxae5angtmcgazallkdlu6tjtw5mgueutk", "1641764565392826368"}, - {"evmos1tums6xfv9wrfynawujk0aqtupthjefv7cwfvg6", "197577059505401856"}, - {"evmos1tuq6ftxr93vrg7r28l3q5sxus6tled4jzfg069", "1281352538102275072"}, - {"evmos1tuvclcz6ph9tcv2fpcpgxmmjvh92ngrq94prfs", "36858116460496195584"}, - {"evmos1tuzt0vame2mr7ma20e2c6x8uytxy7mjf05l3zg", "490116219875573760"}, - {"evmos1tv23tgspxdu3vhqjwg65ueeqff6uu5nnp6lmvp", "24375029086335557632"}, - {"evmos1tv2ntywlufvyak547yw7uyp4n7h7d4cjvp9jry", "8346027094438453248"}, - {"evmos1tv4mca3rg67u2lpv6fdhfu9udx94l7j9z2drz7", "9914925180954560512"}, - {"evmos1tv7azmpugu3a6m98mqka4tnd67y44j9tmd4xvv", "4842470104103213056"}, - {"evmos1tv8582jh3a9gy5c2rapfnj09x7ur6w82v3vr7l", "17464541017686138880"}, - {"evmos1tv8dwsaqh4krkw7m93uhqep0j4hhrly3c8m90x", "615806407277744640"}, - {"evmos1tv9zp2j5vegh0egn0pae9e6etrkfwjsvsv5npu", "316348695747192064"}, - {"evmos1tvef3u3zh6hxd6t3dpgn4xur7nyawk85z09chf", "4594956240760574976"}, - {"evmos1tveyuev9fpuj0sk8qy58x4959y7gcp3h4sxwg6", "5168729464724795392"}, - {"evmos1tvf5aqnw2hatugmaly9y4vp2g8knk4kypukphj", "422017899537569792"}, - {"evmos1tvjparfnzgjsuyln9mqhn8yxykywpxn7099s7k", "862176412999757824"}, - {"evmos1tvkpnz9tgtt8yef3xm2vcdae04neqw2ahchvwq", "421674272102301696"}, - {"evmos1tvmvxcdjkme2lhdmwaczv3gzyt6vynkq9xf2qj", "97837712499872512"}, - {"evmos1tvrtgjnxu569vc0ku3vk7w3qmgv7as0wtdw8md", "656769180350545920"}, - {"evmos1tvvxzu2ayc4m7x2zmrytgj5zp0hf2u6jhj8hvd", "384426602445879296"}, - {"evmos1tvxqg25yh20c2dzdjx9fdnpzgq0n2s96uamhyt", "384456516233731840"}, - {"evmos1tw0ghhvtd633plgkyv8tcmqf8e4qldtz9djs46", "464198134476673280"}, - {"evmos1tw0t97u68taq3l2kuyd8z5mge8uhlfq3592dju", "1560076166018244608"}, - {"evmos1tw0ynnvprh0qllyka6zsd76qm8yx0wah7yrh27", "29418603847242231808"}, - {"evmos1tw2p96wzypl0puxeq659zmmpw5nnc67n6eyehf", "23740463250079531008"}, - {"evmos1tw5d7jusz0jx2mxsyerp9twv6pmtdep3lg2a2p", "4911950387842048"}, - {"evmos1tw6emdvz2t8hfp0xwv8ksqljdqjatrznjyvumc", "1959428243447119872"}, - {"evmos1twc9rph4m6wl5wqj63jzgrzuv8nldm2s43xxwp", "8223888102864117760"}, - {"evmos1twcz97lh9c8s5c5x46pk7l4wvmsfwlv468qsg8", "1858450288914840576"}, - {"evmos1twfr869rvmfmfvt9fkm6dg7a63w3sa4twjj2x0", "65491869575662080"}, - {"evmos1twfypklq85nq4nh75dlsdahw9tpacqlgfwtyak", "4683839402496854016"}, - {"evmos1twgs4rhg2przdx2fk4mhtue6nh9q9q34zavcu9", "2509536528236739584"}, - {"evmos1twknknd5nfsgek47yalnljpj7tm3z84e38ljz6", "95043854880661127168"}, - {"evmos1twl4cj3fmmm2yklhc7kh50gs2ndr8qerdtptvz", "581456888293783552"}, - {"evmos1twnpe2692pcxec9sprs6jg649y6f9jcdrztvgm", "379560230781264640"}, - {"evmos1twpr0knfamjknap9ja9t2z3p4ug6alfrscmzjk", "10308168499361300480"}, - {"evmos1twpt3228chjvffwj489xt9cjmy3egy6uxaw7s5", "883633308921487360"}, - {"evmos1twqg9hxkrwguh8qf0807g2zn0ecsffvs38kk25", "15179740832940171264"}, - {"evmos1tws7jrjzx72tae0lprt8wvqtfr7tjkv2ydlc7u", "4426017545385890816"}, - {"evmos1twtjtz04cl4wzt29l960a5rpmtg9lxwrc6002v", "969923272431506432"}, - {"evmos1twts8syp2fe78ec2v9nqkqvahezkrxlyqw0dwh", "437050783299225344"}, - {"evmos1twu22zhtxmhawlglvm9890l8z6dzkwvqcgesf4", "10716638987948926976"}, - {"evmos1twu8e8gdfjhruq328nd7xqq3n6kcjdq8pek7wj", "924017040959393792"}, - {"evmos1twuhnwlqp2wxd9hlz905h9huqs0lpry3tkxae5", "200249490707871744"}, - {"evmos1twxx4pdr3zuz7jl6ehf5teaphhzclm0rvwuem9", "115899493930767974400"}, - {"evmos1tx0q3qnk3v6tak7phr66q0k3xq06udvmhnqrg2", "641860440556158976"}, - {"evmos1tx4vl0kzsgmpzxhd4fntup6zu57t8cj5xtmujk", "8221379142947315712"}, - {"evmos1tx5jwj0q0nz50zsc36dyerfalc67yrph0p3vkw", "2971318546407979008"}, - {"evmos1tx5keawv5v4caens4e8q4ypuhx5x7ama0stjgg", "384318388316961280"}, - {"evmos1tx64p4u8asy85kd9dy80k7trptylxggg4suvhr", "15258603028224907264"}, - {"evmos1tx6ph66tvwer8kpn6v4hms7hlyu5td7472qxfn", "8497126759797391360"}, - {"evmos1tx9wza5jh3ds36g8ssfdezpa8jfv6332ww22w8", "1364362647482817792"}, - {"evmos1tx9xnspdd3c6fw53srecu337yhfypqa3fw7uy6", "434193161621644800"}, - {"evmos1txd5hsvyzmur3yyqtuk0e4k6hz0p5d8gpyckt5", "384314424118280448"}, - {"evmos1txesdadx07wdp77rm34jdjuz0v3qy5c0eqy929", "466569812863713792"}, - {"evmos1txgyctduhfzct0q5nau9pfrm2xeut57w4re5tm", "73603868835198681088"}, - {"evmos1txgyj86axk0yqs73ympkkq70tq2xu0w669z8za", "80125293669273600"}, - {"evmos1txp7424szw5zczxzcasm5pmc8yc347p08klcx6", "2632029056634773504"}, - {"evmos1txrg3crzn8plv494uzdmd35ns9tnv3flawccr7", "3675268914373756928"}, - {"evmos1txtdv54n5fxzq2n08e77p4ztde8qczr593ls0f", "3278134556272476160"}, - {"evmos1txvfn2mwg8nzhu3thhqs3lnslqnt6k8jvfajvc", "957606678026149376"}, - {"evmos1txx9uxdpx2jugvagpjgg7pwc0076439wwvkh2r", "5773554774497468416"}, - {"evmos1txxaek5wm9qyxmdz5ncgmp0agj7wx6dkdgwkh0", "1568845894861677568"}, - {"evmos1txyu99ff58ldu38sy6yrfgqt93ml8mx6nud8ta", "2512342676085489664"}, - {"evmos1txz6z37flcj2yyndxd5k6zf3re0wfqtw26qr8p", "2999090178205568000"}, - {"evmos1txzpjke0dme6d66s83msdjm6a92t2rug50dnvj", "19684237772083699712"}, - {"evmos1txzthqh3z9cuk8wz9plz56f4c3x5j9fc0mks9c", "7833541925836447744"}, - {"evmos1ty02efc5k7336ydcn7f5qpmw39gc9z694erm2p", "2528583802297344000"}, - {"evmos1ty24caee957znmfk0n5yj684jgnazx0m3fg903", "8199632148765978624"}, - {"evmos1ty3hu8yyy0sckfsk79xtftu5lxv639fw7tqntz", "1983820872834000896"}, - {"evmos1ty6v0rsq5gxl44muzgg9umet5ltqwag5mjw05l", "1315176739945336832"}, - {"evmos1ty9aa9ewzkh8ms58qv0st6lslf3exu48wfzaw0", "1325776276470178048"}, - {"evmos1tya7ay0tuwjzaqyaquvfln4lnjsyz3z8pq7mg8", "31775419800511225856"}, - {"evmos1tyf6kctegv9pvc8lhflzy284e0cq547gthua7j", "368203658952280064"}, - {"evmos1tyffhe8z8r8jxz9jlg55uej42ywvyehnpdphyj", "18262144129351389184"}, - {"evmos1tyfyvusm48ap723w04rj5hn9dlyhddd2pxm2nm", "2744532753825333248"}, - {"evmos1tyk26g42vrrtrl24kmgzqk43zxgdud4kz0v6ss", "794247071203672064"}, - {"evmos1tykkg6ejupktavm7e2vkhs77pxujsnczuuudmp", "883436865836201344"}, - {"evmos1tym4vf3rmd6wxl4ux7zsdd40zwt5nrtgxz0det", "3497146619034611712"}, - {"evmos1typma8mrpjr9l8fjsjeutrgdf9740ktj7j6nsz", "44993373732430577664"}, - {"evmos1tyqv4tca7xz3zupzfhmtsematd9r8a4lhvj0cp", "342989763205064704"}, - {"evmos1tysjlc7e9z05jl4sswwcs8syu0zlqss2nsfgsw", "1132374554205839872"}, - {"evmos1tyskzw7lzc4qlz4jarmzxwe20gkk4fqa4s6vx7", "9118359787157264384"}, - {"evmos1tyspt6dxzzts2tsadf42uzceawkdyljdqh3w8c", "31986533414916259840"}, - {"evmos1tywhx0azqgsuuavj7v3m5yektuypgp3qt2pzhj", "3625120845375190016"}, - {"evmos1tz3ha062m06gyvkssd4jr0zepffd06mj5mxl2m", "1061003771217409024"}, - {"evmos1tz3txn9v299sh9czm4jmhqpxnr2drruq4szwxc", "760278449773536512"}, - {"evmos1tz69sp3qyv9lvn2wlfv3r48du8dstpv8mp64j8", "6569629775537364992"}, - {"evmos1tz7d0hfuwc39lkm620agrn9q3g407ren528lf3", "423993771082105856"}, - {"evmos1tz8qn4yxfw70qafl8ws85fuva4z22uftpz67hs", "15048388826824564736"}, - {"evmos1tz9y2psrulhjddejeqff5u6xdr49zcs3fwvtx0", "2624118737379564032"}, - {"evmos1tzc3fuupd73r88whec7cgdda8gsf3fdvjzf4af", "418021890070712064"}, - {"evmos1tze5u8gcy074tm2asesvpagh5r7kawcdfvygcz", "2253234740215600896"}, - {"evmos1tzfm0vr5q25te04z7rfr4fhn7mcxwtp8v8crhy", "18292215759060232192"}, - {"evmos1tzfrc5auy33fcfhkj9w2dgy59836nj4gq2nrcy", "28792840544103677952"}, - {"evmos1tzjcl73tmazvjfp6ednhnpk528ktx6ugkksukx", "10786210124348346368"}, - {"evmos1tzqan0ll0p7gv4dfkle5sjhp5mm6jehg5pzzgd", "6142893871597844480"}, - {"evmos1tzqrzdrma2sdgwtchjxqp9qn3fnargr3vavr4g", "45243678435390349312"}, - {"evmos1tzvmppj5uhhhwv5ma8r3rlcvtyu67wwnjc94kd", "4771612939122606080"}, - {"evmos1tzy8h249cuwlp24rrfmr8s7qn8589e56aalxd0", "315935979458527232"}, - {"evmos1tzzd95tvnqzx22590h7cw8wz9q8taj2ycaspyn", "1486751816393700352"}, - {"evmos1tzzwvwzm74cf5xqa535ahjge3pg4mwafshxsjp", "913612894471948288"}, - {"evmos1u035dqn6ltpdvkae4lzcf6swc0yg4f4rl00h0k", "2195672439896147968"}, - {"evmos1u05jfulflyz9d386jxp3wqmcd2cvhs9ql0lt62", "384228947342279680"}, - {"evmos1u0784s8c9czqfycqh6pchsjq6xaulh4m36e6rw", "2664540405278494720"}, - {"evmos1u08ukazh7g7ass4y6h5jre4l5phe98fpd5kfep", "9655386484772964352"}, - {"evmos1u0aufvkx4f0lwulgxp8c3q06ygseus8xhfuywr", "1654907190285208576"}, - {"evmos1u0crlffqq2yf6nup0tdl60z9ykrrvczxw57krt", "1919684411530743552"}, - {"evmos1u0cxrktjfux64j4d5epckvh8fyhjhuj3hctzew", "830797340998598656"}, - {"evmos1u0eecft6rty5mpy02awynadye4d5zwnlxcwhvf", "54700311014420992"}, - {"evmos1u0eed9we0uu7khmatkxfgnm3uwcvn9sarty4ll", "8079113228263190528"}, - {"evmos1u0l3k3k4vmp9sywx7sr87rrr4u376saay52sgx", "1871233671326322944"}, - {"evmos1u0le7s55v5ay27zsqs46lgl00twhtkz35um52g", "4799627069795459072"}, - {"evmos1u0mp92yae7uxze7wjpvx7xr4tezy045zpcpurq", "1070767661945089536"}, - {"evmos1u0ngkhqcl4kgkf8cfx4het2yh86h2jats2u0rd", "1577322293277554688"}, - {"evmos1u0spgh0yh4xtwfvhuesk8j5zsw40swrmez8j62", "196296202898165760"}, - {"evmos1u0vgwztnnjejgzah3e0cntju9hflrxqusp80xu", "12191810812745793536"}, - {"evmos1u0x3y3x4jxg6symsfp42ru0679qs72w0f6crf3", "5143241509929243648"}, - {"evmos1u0yja0cw42pnyplyjxp6fpwrvfyfvs9fmdw5sx", "883464271082007040"}, - {"evmos1u2069n4wf3ccultl6zfrdz8px5qkaqc292c63d", "2656610718265509376"}, - {"evmos1u224y0wfsttrkrfw6jt0h0urt02hcglg5ee5wl", "41610957248230400"}, - {"evmos1u23f85sj6jcg24e3m44yeaeympnm5nr596ptaj", "3655228434861735936"}, - {"evmos1u28x8hnjce9hg3w9g7d5chsg3upc409mls3fqv", "3002974904204279808"}, - {"evmos1u2a6mjg5rtyl33zkx6udjn0xr9kmlc5fazuk5u", "31832648881677950976"}, - {"evmos1u2ag06p7efh2ljwylt77kuvm5efadce93ehjay", "2814577324377149440"}, - {"evmos1u2am95hgrqtechpysdtzwkhx6em40k9pawm9ax", "15135520041641193472"}, - {"evmos1u2d9jcjtmfvz7cspflzdmv2jqaa3z9eusffd56", "442961803758592"}, - {"evmos1u2e2vjmwtd2ms4xg8vdpr3ep7832cxc70th95h", "2511616074232788992"}, - {"evmos1u2ef56dksmrg6cr9zcxjcz7u4yqlpgjheuy764", "43714045411996991488"}, - {"evmos1u2h3w8fh4rkkypjz4486kmlmy5p5efplauttrc", "1235668374117052416"}, - {"evmos1u2h9qfpvs4thhcs5uhjgzg9yqysfda63hg6n7g", "2806604045499574272"}, - {"evmos1u2hyc27zrxu9xy3x6zn276r789u0wvf64xuyyd", "728571474356920320"}, - {"evmos1u2jkftwte6ljzttqsdpg2l093znsu7u39m9maj", "416016658991248896"}, - {"evmos1u2kdc0rhl5p6j33vycqkz53yg6enzz674jup7a", "1749221210604623872"}, - {"evmos1u2qvru325fpcqejmp2867003h4729k87q3550a", "3350131304495131648"}, - {"evmos1u2tpzvqfeyptkdedk8ftkpr4d3u8ny99pvd2tq", "171096291303495680"}, - {"evmos1u2v4xqdv0rdmyh7767cq7dcqjcjqr5a8xjsmsd", "385959487973997312"}, - {"evmos1u2we3xx2a7pt0gg0694k0zc5sleg9f3hrfft65", "89049541239382016"}, - {"evmos1u2wlpm82um5h4anj4k7athuudjrttxrj3uel6l", "162278147100669952"}, - {"evmos1u2x8q9yqrezta76xhrfc0ed2xqkx3mvhhqjs9w", "5188283292750252032"}, - {"evmos1u309erx8pw9g8qk3y73498klvuwsxv6l8993s7", "16162148583301349376"}, - {"evmos1u30hv7xtjuvdrwye355mu9z8prcns3fe9e2v7f", "385462506932216064"}, - {"evmos1u33q20f0kp3skvekm9gc4k4vuncx27evvhv2f2", "414591070239551488"}, - {"evmos1u35rnef7t746a47lsxesdfvs9kf8tk4x8z2nsa", "415655160981703424"}, - {"evmos1u36utjqffsphaqce2d73v0envh3kuhj7jn5tan", "2904323469646682112"}, - {"evmos1u39tf7fudmy5953s5c4tyuk4t6wa2d3nyrl7wv", "69555091189290778624"}, - {"evmos1u39xrr7qj69nlah5l0zekyhmmwmaylwk55ygtv", "386936761880681216"}, - {"evmos1u3a6yp24u2g4kaauvhtw44mzyppf4egu56n8ar", "602730859921756160"}, - {"evmos1u3d2y8qzamnpfuet2u93pcql05pr0m7eqxd3nn", "1316833707946401024"}, - {"evmos1u3mhzjkg2vly8fh9ar7lwus9z3qaucnnpj60qx", "4140124573828014080"}, - {"evmos1u3n8v65tmt4g6w096m0hpl3ymyv4tsqu7rvxy8", "3025941383451230720"}, - {"evmos1u3u8cw9mcnh2nku4s3vayd3tpxshzudgkxv7vh", "16946838024705996800"}, - {"evmos1u3wytuk0rrlwy43s3q7m7gd7m8v433ch5yhhad", "1068382130272328960"}, - {"evmos1u3xehv2m7vskqm60f06n0xzcgwsqk8xxd7u9dm", "26616812366259273728"}, - {"evmos1u3yyxn0sj5lzmvqvfs6gtj65yuj5w8ak2sfaj4", "432352720113767168"}, - {"evmos1u403pt8axajdzwj29lg7xm7mady4y5dcm2jm53", "1493407866769053440"}, - {"evmos1u440g0et8d6zsj9u2favwnrw8ua8pkpqhswrwv", "1365840031421448192"}, - {"evmos1u443j4k8t0x5efm3u09arw0rqh9gs4e9lx0yd9", "987569243865055232"}, - {"evmos1u48hgryl4kq5mnj9scgv9dr94uxat5glg2ak9d", "51776240983467638784"}, - {"evmos1u4ay8rhzn39lykn82hnswxc7fg0y09l3rwdk8w", "891970088066589184"}, - {"evmos1u4c999l8evj945r9jtpjjvejnqh5zxtrg5n35p", "5098822466037878784"}, - {"evmos1u4jah4tncf0qrxm7x66ezsh7smtfqqflg3rsay", "22232897304167395328"}, - {"evmos1u4jqrj84h2xa7k7yarg6wjalhmkpuhsyhp0ux8", "3773682486026747392"}, - {"evmos1u4kqa592hfsly6wxmwu5cdw4r8stnu24wm4740", "3058272739263825920"}, - {"evmos1u4kywz359mkmktsqrecdr3tktszzav6fv4au86", "9749378956249131008"}, - {"evmos1u4md777twat6erqqzs7yfu73scyput4zxypdka", "97675275460705280"}, - {"evmos1u4n93gh8zemrjsxcjm8dgmw4qx6hc0pzgyke65", "3014264819591756288"}, - {"evmos1u4px8sx2ae7tmd3z23967hpnv28mz4wtqv0wy0", "1311212384256459776"}, - {"evmos1u4qvkctdmrhkflhj44wztfkywrev2duame08lz", "1464467931537249280"}, - {"evmos1u4rwvrvvez59eugr67chf0ckjt0687pce874x6", "4961762574268656640"}, - {"evmos1u4wdg7308cmnxn3gv3693qwlt9xudry5yev4qv", "8238006913693903872"}, - {"evmos1u4wkkx6scqucfrvpjmrquh450pjenxnxr8wah2", "33253542217645719552"}, - {"evmos1u4wmygz04z6mtkrwj8m6wf55z6yfqnpepgmnuf", "2619967851958206464"}, - {"evmos1u4x3mlveclvudfnpj8az2f9e55ls095ae093wv", "369277808961618688"}, - {"evmos1u54drv0ylyynf4pmjyh3ej5p0au3fmg6gapqlp", "1429120722645409792"}, - {"evmos1u56hgfq3fw63dalddeg8t5pwr96rnrfqa6fwd3", "4889987096381931520"}, - {"evmos1u56sm9hux9sm7hpctpp7chhzf695vke0htdpps", "2682125640860682240"}, - {"evmos1u58jjdyhyrstft7qzva3h43547tj30g4hx9cvm", "20184657757112426496"}, - {"evmos1u58zkznk8lfwak8jdam3k73628dspakjfuzhn6", "1514266157947990016"}, - {"evmos1u5e85dam4p5lvj6lladg4rjauldntqf8p4geqf", "2995350200131847680"}, - {"evmos1u5gs7ewxv7upqkgvftqtjyqzwlj503w0wmvncp", "9057726644683624448"}, - {"evmos1u5hfytepsp7y6r66fs3qysj80q2gkq8pga5m4q", "9225746281928488960"}, - {"evmos1u5hj5a9k704ukya8mp4rrvz482x59lv47exeq5", "1286724492041562624"}, - {"evmos1u5hr9ruc70jwz6eayqcn4r0vx92nq3qu878mrq", "741731287637808640"}, - {"evmos1u5ht240eer2ycd7c47q5fy7tlfyw0etfswhs90", "118458277967650816"}, - {"evmos1u5ls4qnxt50llqk2ygas6uxpy0phzqddd24eqq", "15981415199379419136"}, - {"evmos1u5mc4ztfaj799y48dcdnvhwr4yctrtdjctxps9", "2822704572010872832"}, - {"evmos1u5rjkwsdkj7x9l2lh9g7ndx8al720q8akqygfw", "3415179918369608192"}, - {"evmos1u5u6weza9ue3q0yfkkcr4w6z9gtrklrnn6znel", "1395455142091042816"}, - {"evmos1u5y2reegfd6lef5sancg6lqgspcuejmewzt32e", "17916439352697241600"}, - {"evmos1u5z5s32wcsgta44jxwxhwys65e7jwll5squux9", "33164389851552579584"}, - {"evmos1u5zas0jfp4xdrt2e8njy3vtmpzdkqqvxlc0dt4", "4220355501742905856"}, - {"evmos1u5zh77pxycsgxqudnasdql9k0x0rs2xl6yerus", "662535396187518976"}, - {"evmos1u60ha6wn50984ml3e606qy8g9sfgtvct5ktne7", "1164572990825551872"}, - {"evmos1u624j3r5l30psnp97n3nzt73xtael0gn54w4q9", "4142132693363209216"}, - {"evmos1u64zkce6ffquqcq63rkj6ztt5e2tnght9ka4zw", "61003930789980913664"}, - {"evmos1u65cru529ecdqjk549ez3kr9q46utwcfr7udhl", "5707609116924903424"}, - {"evmos1u66x390l0836vtmccuexnp08cz408fsnez8pdf", "433973814401017600"}, - {"evmos1u6879m6u8f2xgvac4m5tfkmlsvwhkdxyhjmarj", "1319458014044683520"}, - {"evmos1u6akqn57umj67fvcehy586mlhdldypdftf26vl", "312709260739028992"}, - {"evmos1u6d0q8nf40u6c9czycvetncstzjalsuxums90d", "1626855281984913408"}, - {"evmos1u6js7n7try60d2sdcxjda3xczehxahelcz7l4e", "1543377050995409664"}, - {"evmos1u6k4234r8wgw95gq3x0kegrcyjxgaherlvmdza", "30066405689527894016"}, - {"evmos1u6lzp9kma9tqe7cpk3vqg52dqawktpdu9y0w8u", "57329593159154483200"}, - {"evmos1u6mtuln7uzgs6nhaufkgz8yrc6y2m8uyhpq8sx", "889787614140753920"}, - {"evmos1u6q9t4khjjvwu0usa0c6svqsjj395w8qthm343", "847513202380797952"}, - {"evmos1u6s8k57phl70e6zv56hzs2gxn0vy8kyy2fu5hu", "857575670832906240"}, - {"evmos1u6ta8wnkz7k458wwgwem2upv92n6hmgy8rr6fk", "1430886117426790912"}, - {"evmos1u6tczrz3yj6jr0f5kg58c6h58kgf4p0v8r6sag", "18311673862480011264"}, - {"evmos1u6tehr4nx5h33pdvw4p5hfuq99l6840reeu2ve", "1574449710453039104"}, - {"evmos1u6uckf59aqdmyvlrew0r6q0ft6yd4s4kqtaa2p", "475476297096306688"}, - {"evmos1u6uj0enz0e0k80slvh795vg530cn8kk4dkj087", "17389164722514366464"}, - {"evmos1u6ygfn7tmcjf6zpmdhpg9uha8384aycdyyvuqp", "6855657908257021952"}, - {"evmos1u6ynjftwsz62zg30dn0v9srrc2wn2frk8r3ec8", "5645879543695355904"}, - {"evmos1u6zdcpwpdpguvhkmtk0u8vgmee85yl4j3d48qy", "15950314637061928960"}, - {"evmos1u6zjrak5us83x39w6cc6plge98xa29cdqnycef", "13208581673329152"}, - {"evmos1u750rqywanflh0v6pmdwneccjaznp2tqv2klrh", "2127090936032165888"}, - {"evmos1u75gpkg7pda005cfxlgmtgymuvfqs4uffsg4yg", "11741241839845154816"}, - {"evmos1u78ypw77vagu7sgnkzjgw2gfp5v5nxjr8t4x85", "684638557816230912"}, - {"evmos1u7c6jv4qqke5wunmfz2qxmrhsyjveddyyfsccc", "21742035956697239552"}, - {"evmos1u7farrdjlhz6wwmem4ec59jk2f3zskfxaj7f56", "3366459297821614080"}, - {"evmos1u7ncft93gk7cnylg84q6mapm03cet6v4t3856k", "1409677300338237440"}, - {"evmos1u7stkxjxdwz04lrx6d9dcj4mhk6lc7gcepuq4y", "804600082584233216"}, - {"evmos1u7uzhqmz4at3q9a5s7nurjeu4f6k856zxpck87", "595171481212850176"}, - {"evmos1u7zp44wm0a4elgyf4scsp2tz8342xuc0h295vn", "319482711667560448"}, - {"evmos1u7zxjjw3xqpah230nr242sn29g7u5hn0c4unus", "1591597887643755520"}, - {"evmos1u80z8vaxhlvfg5ywvuat7vwejunvzcady45des", "1323958330452905984"}, - {"evmos1u84pvpaz6jsj3m46jlrefhzkz7rqz8jysedht7", "4414125489025474560"}, - {"evmos1u85zxvhvyw738e97cdacpq9mn4zl9x49caw6uh", "274098481545765632"}, - {"evmos1u896w8uvy68gvmqswrprxyf6p00jk2rfmaufva", "11027744991502137344"}, - {"evmos1u8a7f9yzytcckw3fvddt7qjux6knn53j97r3gh", "2736802932070514176"}, - {"evmos1u8aj8veprw33vtp8dener2c550qp87m58pv5ly", "1462080290625159168"}, - {"evmos1u8ax8gma7rycm3ay3f9mnhmedt2nfgugesuu0j", "7355711158960308224"}, - {"evmos1u8dh8wfd66eglr7gequlgzj6ezy9js2mp97vau", "5131014674456835072"}, - {"evmos1u8dz2x466s0fs6q42tzz3jy60kry8fq9a8hm55", "1222007967122641920"}, - {"evmos1u8eq2td0wj2mwtdk7fdm9ly9pv8wppyaj3jn85", "1206675183194967040"}, - {"evmos1u8ercqwtck9kcyprt3kf220k2d50vjpd9rq5vl", "30414787622787883008"}, - {"evmos1u8ew0makq4d8a3vreueuq90y7xfqhare3ej875", "2259041356622366720"}, - {"evmos1u8ezr5v7n26mzyxd7d3u6ylu6rryt3v6f8v02j", "1741248083050663936"}, - {"evmos1u8g7nqqmq8ttydnd5m8etnr85t7k48cys55739", "1070103657886212096"}, - {"evmos1u8gc4cycl7c66vq7qcy3src4tvef5ug2r729x6", "4617805045979439104"}, - {"evmos1u8h3qkn2lzpvuhfmkym5cr0stun6upnr8j5rhm", "5626756606126567424"}, - {"evmos1u8luhj3l3ku9k4sy6593a4vcvu4nuk93jkahcq", "1525998304612653056"}, - {"evmos1u8mhwwud80xe85x6zzhm5lzgjdlhpvdxwh7nr8", "1885970463832942336"}, - {"evmos1u8n3azendq2qznhuj50fe0v5x2ew0wud2t8rm6", "2073918052203958272"}, - {"evmos1u8n6vfthyunccnykpyw754x499fr47ydvx2h7z", "224876680995607296"}, - {"evmos1u8pdk0stcrgfveyh4jxfg2gcevs7rl3js7dhpu", "1578161640633174016"}, - {"evmos1u8qke9qnu8uxv4j7nn8d3dsj7hj559vyj38p0f", "176183590025277440"}, - {"evmos1u8qkugnckhkkprhd3n3zvk202x6je3y9zttd98", "2090364796304891904"}, - {"evmos1u8r7m8hhl9dwn4nwxsydjch2enmhx8nrhn9y38", "1536873186484108288"}, - {"evmos1u8ruvysml6ywj8jskmvptm8txp3f2u2c6wth4d", "24094784829688811520"}, - {"evmos1u8t5dd7fw9ltlkycgxjahw8nyaxff0kjm6m4jr", "29522620915573374976"}, - {"evmos1u8x3n5zeec9y0v59lpwznlxdt8amdxznunupwx", "20480717407493066752"}, - {"evmos1u8y4fkm2maqkume5h93w5csq6ctey6neuxn9h2", "4476385038387675136"}, - {"evmos1u920ced98uec2zswfmfh4jqe7kjew4p0xgwhuu", "8907748503532158976"}, - {"evmos1u95cvp7fxrwxxvx9wp5z0spnux5ppjxds7sjzl", "5367148807409161216"}, - {"evmos1u97elz9dch4lk7rcr6hxtkt5yfc833c56x287e", "229775025874714880"}, - {"evmos1u97ve3e2njwstfq62sy5p0mnf65tuuq0gvryv2", "1466282460178989056"}, - {"evmos1u98t8kr6uu3jjr7pm6aak83kntnpxwm7s8l4gx", "12011148683981996032"}, - {"evmos1u993y2523v5dqsfrfu5ecj4vevqlnka6zymgtu", "2520002998810752512"}, - {"evmos1u99rsljcdljw470m8p44ujnsyujccxrx7dvg6r", "2845508434937016320"}, - {"evmos1u9c97cpr6ffl5lauyqmrzryrzfnl60jf4pevk0", "1449456639960366080"}, - {"evmos1u9d0gx7qprxsue4zhu8tfxpsvgllfxn370nrgr", "51649825761572544512"}, - {"evmos1u9hltjq7hm7pph53gn8smexu6q8p3pfn09p36s", "21812174469971660800"}, - {"evmos1u9k29qplcgzeq089urw0rmdehxjyp5axldkq0j", "2580973031768479744"}, - {"evmos1u9m62kh5nqm4uuq8trh8h4ulumntaskmm4kqsq", "3788255374018343936"}, - {"evmos1u9mxq3q4s0x8sgfm5zqexdztdt2gaja2vwa2pk", "12371198662620270592"}, - {"evmos1u9nzkq2k5c072h5g7xx8nwtwx3uw9chdfcpd66", "1978049714225386240"}, - {"evmos1u9p76lmhtfcn3cg2nhlweakjeh9l096rrxsq0c", "4606598135461979136"}, - {"evmos1u9sqp8frf4mhm4lqgrfaq6m0r8ppe8uq7al9hf", "1368512895444295680"}, - {"evmos1u9uuvvpcxzrvjqtqt446umufcfp6xzhjsql9vj", "587782647235616768"}, - {"evmos1u9v0e4ct7eqwshpva6wjvxj7vy30l2zejlcwaz", "1130738642828874240"}, - {"evmos1u9vpgq7v32x5xlk268ep4lj692wtn30wncruwq", "39815298568448"}, - {"evmos1u9xeneydju0laau6grcr55pwh29nkuwe8hqnym", "7927424012996608"}, - {"evmos1u9zaa9umfzvyhm7g0azzkdnqlavewhqm0j8g8a", "207578697000685312"}, - {"evmos1u9zzvynhrgjmr07p808xlqn66nr4umvgnp49kr", "2593990941468557312"}, - {"evmos1ua07305fm9csr5wcfputhpm2re439wp7m3phx8", "10128799636497195008"}, - {"evmos1ua3260a0s2vge0r76tmyww06q924zvfdq07c0w", "1528822455983251456"}, - {"evmos1ua3cs25gkn3l0z6cmsh8fkz65pv2n46xemmkf3", "5725783600721788928"}, - {"evmos1ua3fxc2vf7f3sgjmhr2t8w6l9gx2gzdemy03ut", "16464322814211309568"}, - {"evmos1ua6mxmd075vuawzqd825djr4wllhxkmm8z48ac", "3903988553032318976"}, - {"evmos1ua7exr9zmllawjqefwwgzgh90csl85897zklxk", "536718571612096768"}, - {"evmos1uaf00e4mv4plzyj6xmc2g0hr3948e0g2cx9v4k", "5246491516010756096"}, - {"evmos1uajuyrtg0efwh5tl5ewtwnkpjpcf0sfl4yggxn", "3250311664273540096"}, - {"evmos1uak9ccjx3326fjs6v72v8l0s8tp30dcuc4fv8p", "91701803366510592"}, - {"evmos1uam2809ks995jx0wkfshq89l23r076sz6jxeef", "38780032094019330048"}, - {"evmos1uanrv547z8jaytylsnkuf834qsarvpgwsxrt34", "34928383215508484096"}, - {"evmos1uapr45u0g2dw3eaakyp3ymtektytekzl4h7p5q", "1550755236595089408"}, - {"evmos1uapvmaat62t8d80y3jaxd3wdk5vdj4qlyc04vu", "12270464077180602368"}, - {"evmos1uas3kcjf03qngr6tc0lfhlk6auhndvv6837gdz", "2089122468721798144"}, - {"evmos1uasmjhrhysf4yzpps9ghv07v4advgt234kg9nd", "7772012553850847232"}, - {"evmos1uass0jxja7cg5wtyauqecwe49d7wvldhu7qc34", "3085866967826492416"}, - {"evmos1uawxt6h36lktakduph7dtz7x396v4x5qzrlzyn", "8427522893622272"}, - {"evmos1uaxjqzp52hf4guydvlvvecccw8s2gf0j8zrpgx", "283782018453125120"}, - {"evmos1uc0h5nzn64avkfuj2dm4glxem9xu30l99ww473", "6385219705088393216"}, - {"evmos1uc40y2pfqpzj6lxqwxmlhfuqxekrt4fcsxypuy", "7276033779634434048"}, - {"evmos1uc4f56wc4tv92z4sfa3fyaxexruqzxsecugtyz", "1715575789311758336"}, - {"evmos1uc4l9eapgr40pql0k3ye2h85rpg7anh45uec78", "1868949487424749568"}, - {"evmos1uc56gl5af4lrdf55rdwmp6c370eugp6uypdlvp", "2242636843076239360"}, - {"evmos1uc6j9p6tyewyz5r3aj9v5z3jyeesce7yuvrr2z", "8595632528046587904"}, - {"evmos1uc9asf2c6ckur0aymhgp3xseqg5rd4kewz0wfv", "368993634241352960"}, - {"evmos1uceu6dsdhcfggmd0kfamhzft85n0mv9a23la7z", "259952087868920320"}, - {"evmos1ucf0x0nn6c0829f3zlxtv9qs77lprdykeah706", "438607948275605504"}, - {"evmos1ucjea0s6mpr372c4esr8uegr5l8tzez8ymtfmp", "1254742089294172160"}, - {"evmos1ucpzwrdpv46c0u4jccqqecmkhvjtam6d5da7yp", "737614353847418880"}, - {"evmos1ucswn6nsxqxkymxc3zq7d02ew8k4eapn8fmcxf", "3214613288292860928"}, - {"evmos1ucun5favxr38s9rcnrdm77y2hmsrg9lcyyvtev", "469399119911326720"}, - {"evmos1ucuw0kwrmy6h8csxchg6ctr3jycu8ndztn5nqj", "899454623579578368"}, - {"evmos1ucxt7vf57kzhg4vqcs55p0xr3wpm904ws36cqp", "471457736110100992"}, - {"evmos1ud45dt4r350fc7jvad5cdq4lg6fj0qh763vrdz", "406682458731516928"}, - {"evmos1ud5crpxeen8axthz92n339mgtvxmd5dqrhpysa", "1783650538675655168"}, - {"evmos1ud6k7zq40pp68meftrfkyyv38pqz8syf7atvj7", "9412743806957195264"}, - {"evmos1ud8kx00nlscsd44786e4eul2p87w9gms2yjcn9", "4025974690776449024"}, - {"evmos1ud9jagadx7tfyeetzhg75kghxd30mzx5xkcpkr", "877400888836383232"}, - {"evmos1ud9t6ltazd8ex2jzlcwj7js34w2mw2lxtshkz7", "1997187718721234944"}, - {"evmos1udaeynx6lxfuaxj757s223d0jn45hqjqkg2ne7", "2043673458243165952"}, - {"evmos1udc9n6cudrv6gv05h8dt0sc44vhux8j6ehpus9", "31094647684122288128"}, - {"evmos1udd46y2wl63pde4mtlc4cfsayhdeut9erzsp8z", "4834320563955150848"}, - {"evmos1udg6jexx3c9kmfwfpah5a3cz5hznhvjsfs3f34", "804351499971933184"}, - {"evmos1udh7ksdpdmup8yenhg66afcj9uvvtaxhjzj9n7", "3223756424306170880"}, - {"evmos1udhaee4wq9qcka5c5zm8dmr7ekqvm8jtv930g8", "17631242251801499648"}, - {"evmos1udhs4qq3um9qtrpplmrf5q52288xp9lzqqsdz3", "6994580215243126784"}, - {"evmos1udk24v49uey0t5r00gt7a7g0kdft2av3l7ac8e", "27472854570860544"}, - {"evmos1udk8shjz72j7lzpcthq4dcp2pawt77dhzuzv2n", "4506127788379401728"}, - {"evmos1udl8khxta54h3kp87s87pfu23cfqveqrm9ashv", "3382271932352643072"}, - {"evmos1udmptkr6kdq2pt43x2llasqa7fm0zcpzyqvu6r", "1311854445917681920"}, - {"evmos1udnmv3td8pdr2js8h9v2rkkemsve3e8yky9xp7", "10324128692566978560"}, - {"evmos1udqhzclmj20sp9rkeq4uwq72w0pvhuvydldxgq", "5076090194085243904"}, - {"evmos1udsumfdgxqmj94hmu776rhzamu8x3pyv97rdx8", "5414641132344606720"}, - {"evmos1udu7uek8sf735rld4agp4tyhz60ewjqd8lcetu", "10469912188612767744"}, - {"evmos1udw6evd3f4k77t82v4gces0tlc3m8ngrkv5gax", "8993862165724555264"}, - {"evmos1udy3fxjr6rzrmejhym2u2zw8gedfz4245twywl", "8749133673853550592"}, - {"evmos1udyh2xawa5ztztzjvfwar6ezh07dm74hg9u5a6", "1035171617207635968"}, - {"evmos1ue4wrel24xjcpm4xtxkv5k6scae83hr8yea68f", "115881956214835396608"}, - {"evmos1ue548ud7slyh9cq3dunetdtpm70xl0hldh38zp", "34388810819693682688"}, - {"evmos1ue62hmddwq42gnq5q8lfhvmxmv6zrwqmtm0qkj", "93696737256071424"}, - {"evmos1ue8hy7tr5jkmunskmjlqrw4ha2m560nda5lp2g", "4095454007416422912"}, - {"evmos1ue9krx8ktenl6lml3mpcy3n02cg89w6qc6dhyh", "3360352145296038912"}, - {"evmos1ue9nr6hh2hvd4qmccycsrnpskkl32nm37wqjm7", "493698951418856448"}, - {"evmos1uedckhz98xfjuavnv3jfnadkawmf5hpr23pcv7", "739861188122829056"}, - {"evmos1uedfe9szrxfy3e9428w990uu86p9xlhd8xa02p", "385967177163980544"}, - {"evmos1ueee6ln0n3tv7u0qzaqajppsdenpgsj2ja79eh", "384221037130278144"}, - {"evmos1uegly9pycl84phu7pw60rqwxjvc2najmfmp5lf", "9568640848603121664"}, - {"evmos1uej0tq059xqg7jnj8mjy4zla572sc8036sha4h", "74943070463516672"}, - {"evmos1uej8wlj22nmmwnv2dt652xvmxg00s3pd6p4302", "12498922956276445184"}, - {"evmos1uekgvn2jncp6knl9m96fwfrdsa97pm3m9ljkjz", "1107774615635743872"}, - {"evmos1uen550glmj67pnfavkvrpvqdaw9gtnz2ldg8ae", "14421462820043939840"}, - {"evmos1uepydcc3yvj3ngh2k3x4046t8rnlglsxjgswdn", "755091443336426496"}, - {"evmos1uevdh9cagjt8kantvy3x9pewtc8u9gr8tc8uyy", "692222581759280640"}, - {"evmos1uewe7u63dryqlgwkq6tywvadaqw3yrsffede5l", "1261272128770897920"}, - {"evmos1uexg2pvlj4s0636ucnfam6ypxdy3048tp4pcg0", "24174899030092460032"}, - {"evmos1uexnxrxgv4zjpq26508fqcfa3xu9tcaqh50e6e", "182105279498279680"}, - {"evmos1uey74h5y63aq6rxpg06d7vlpgxhvp4f4ytyxzq", "596343669695889408"}, - {"evmos1ueyn9gjuwares8a88ncsgcwvc5x460c69j7hzm", "4389312686272203776"}, - {"evmos1uf2mst0rxa3e2egq4a65ldxjvsg3x877hjw69e", "14841905619519459328"}, - {"evmos1uf2wpttncvk2xxhmtxf6agdjj483j7tqf4rxsg", "445136094736866560"}, - {"evmos1uf4fs4c57kkachgcrw5jp7psd37n86jmkv84a3", "2863561274406797312"}, - {"evmos1uf5aq2lelzzr5ka0xks7d2f83ayd7uxj43fyu4", "927692639185565696"}, - {"evmos1uf89mrfl0ktfa3as3g8vkw5jk44zjx4xfkcrlk", "63061921951597051904"}, - {"evmos1uf9cdkypd0rhjlc5fqsc9sqgy9qq4fp0wr2r88", "1354560890323402752"}, - {"evmos1ufcgs2whtx0v2qj3d2nntxw34qys4lqmymlr69", "19403896588524105728"}, - {"evmos1ufcl9305nd7qs6z4xdr6w2x3ghnmk82rx45vgs", "5674225502734909440"}, - {"evmos1ufdck2e3h6pvmj4t9laa4gt5f60lm8hc48c45g", "1338943733588006912"}, - {"evmos1ufdkq83t054uuz43ndv84v4xr8jsgwn7xd2r2c", "20298906499134726144"}, - {"evmos1uffhz6sfpwm9wswv27ertvytk98hcd0tu8acj4", "2656931174990397440"}, - {"evmos1ufhernpfsnakzup2yx805u2asmn2wpfrrg7v26", "192035977658765312"}, - {"evmos1ufjyux3smezqczv2hkqvnu5meupyqq3fq2832d", "2851463640780841984"}, - {"evmos1ufmxgav2exrvsr5y4rckfvuusmn3qea9gd5nhx", "1937121349280464896"}, - {"evmos1ufpy882klj5fdsn00w095gut0kr63amt3dkpj6", "21425336286251311104"}, - {"evmos1ufrvacsnfljqnje5h8xj44y7pc4p766c0v5q8a", "1079365072977121280"}, - {"evmos1ufsjq7sgyyuv84dll8muk94zyg55sppmrp6jka", "1360427506430351360"}, - {"evmos1ufsx03m0m0580aytp2zqpn6ahz684u87kc4pm5", "26574777920499437568"}, - {"evmos1ufu3x08k67epg5dzk4kk878740mawxc9s4dlrx", "6141376606066065408"}, - {"evmos1ufuu035j4fc3vz0ksm3vm6cjkhyzh396av0ncn", "1517735704933655552"}, - {"evmos1ufvp0zfsyj7ezhfs9cgrxpqfen4prr4chnycvt", "5725250814239123456"}, - {"evmos1ufxww5jsg5eaud7446mzxyuyd58nzgqhjqychc", "928197720471393280"}, - {"evmos1ufyf7sa3syaagfw3qjmh5qkwfla7tjt3qp78ns", "1994365248308663296"}, - {"evmos1ufzehu8acu48lmmt70qx724rafx0zvxwcs0rr3", "25679154602203267072"}, - {"evmos1ufzwg4a5fp2q3jclyrjlh5jflznmn0glexsrgz", "18112943469399629824"}, - {"evmos1ug3vrswhr6q400ggldvzhqyzlaef4l4escmk4q", "315686021474863616"}, - {"evmos1ug44ry427tp2sjhlnm9ctn4p47jtkfm869yhc2", "888234294420905984"}, - {"evmos1ug54dygswcfdlrh8yp394d8k8ykj2hg7q8djxv", "9965045196192808960"}, - {"evmos1ug5hnpl3zqq6hvezdyf68emdzyn08gvxx6sjnj", "32061949538551218176"}, - {"evmos1ug7xlr47j5jzxasp95ns2cqvtegg7frxrygt0n", "384029322191137280"}, - {"evmos1ug88fad0sppwz5ckv269tu00fxmcakm2td5kkf", "482056286612964864"}, - {"evmos1ug8lrtdmfjnmmnypjfrv3ders58qd54uelj7kq", "1085803773766162944"}, - {"evmos1ug9470y3f620uc68e3aedrekdv248zgkflusxw", "3126962339882041344"}, - {"evmos1uga4tuylper9whlnnhcse2cte0pv4d6th2adqz", "2885952111214655488"}, - {"evmos1ugcaf64f3dh23sv9znttrxtn4spz4ravy9cllf", "19464488881769054208"}, - {"evmos1uge4tt0ku2sq32qgsy3csrgerxvvra6tqnvw5v", "5217908764116189184"}, - {"evmos1ugjhuksqwunnc5ha9x89u74sz9r3z9xy9tvpef", "1141695448273523200"}, - {"evmos1ugl5lg8sfpz7l3euh46x5zpmynyw07q22rha4m", "2947255620994118144"}, - {"evmos1ugmntsjmanpg8r30q5ugdnvunqa823y6nnuqxm", "701086663574528384"}, - {"evmos1ugqdyqx7sspn0zv57623k45hp5n4gfevg07gyq", "183382644637786368"}, - {"evmos1ugugctkhsyajqn06nnaqge6dwsu70h737yglwg", "1111552904338767872"}, - {"evmos1ugxyqy6h69vcqeyz6fd55tw22l4c37umxapfmy", "3246467256121612800"}, - {"evmos1ugyrkpe2wsnm98z8k3klg6kd4gfftpupwe0t9r", "237782349570849792"}, - {"evmos1ugzuyqh5rkr6ds9v6eev860qrk7fu5taxlkz7r", "525354348732141568"}, - {"evmos1uh0j73vu2mw3fxc75wug3xt3hjweuj4hv9uq2s", "4045250296240005120"}, - {"evmos1uh32dex6h03c0m07vguk23zdfzy7y4cqwksx3c", "200518624522473472"}, - {"evmos1uh3fe05jxt8fzcnjnz96qwykjah0rhazc079c3", "525285221032500992"}, - {"evmos1uh3kthpwmkx3svhl49hysdlhzcrklxmrm8aq3t", "3640263846956731392"}, - {"evmos1uh5c9yyrqrxujgdqzvsy2jk6l87un93t7ps869", "223899929231862784"}, - {"evmos1uh6ss65zlcja944w82vt9ggecy7hj9jns6mqw5", "861918567937290240"}, - {"evmos1uh77vp96ypnjf9tfgfwa56xmjn838en3hf6crf", "2438728199091683328"}, - {"evmos1uh7neyk4kejhpxw9a7cdtkepxfxm38sdsaxy48", "3243071641309575168"}, - {"evmos1uh7qk3mxa0hd4f3rr55rq6jty8szf3hef6pacv", "4181386712631017472"}, - {"evmos1uh83efmlsvslhuxkvk7c0xpcut4jga0j7k7qn3", "24485813169963077632"}, - {"evmos1uh97f0ghxgs6z00u2zne35gszf9d8077vwfma4", "3312022275708567552"}, - {"evmos1uh9u2ctx84kd76s43ydhnm3nvxjgr0e8gvps50", "1395496817103358464"}, - {"evmos1uhacv20xgu87as96jw4arap8aml6lhz2tgs09h", "8428601168005859328"}, - {"evmos1uhcuc98v23em0da865u2jmj308ttdaaak2zeta", "6844459186141659136"}, - {"evmos1uhejkgquftj905gz8xlrn8kdtw4zc3r4axk9rw", "469468441588834816"}, - {"evmos1uhf0dpn94rudyxmp3rg7g405u9xmdfrfg6wws9", "3682653381098024960"}, - {"evmos1uhgzsyn34ew4n0dpsflahtc54hgg3ucm2dmegl", "21246668339479580672"}, - {"evmos1uhjqh3646tueakxe6lx6mexf2llh9zrfj2s0xg", "1576664635408391168"}, - {"evmos1uhjxcpc336cxkz30nzetwxgyuk6zhwulxkn6q5", "1929815487042876416"}, - {"evmos1uhm5haa0r5elc32lrlklma2zu7n3u9rms8ej8r", "4254647390418415616"}, - {"evmos1uhnjjlhghjwe625pwqqnlmmntyk96fcwxx6v4y", "21223600254100660224"}, - {"evmos1uhsdj9jru863yeehfel62eqnuszrsywfdw2lq8", "42476665784267227136"}, - {"evmos1uht4u28lxwqas8j6uyul6mw6hjff4s4uv8p0zr", "2908036464219521024"}, - {"evmos1uhu3umhm8ys8kfzddeaszztj008jgp78q4sdwx", "995616162102671360"}, - {"evmos1uhv7egysqz5hrvj55s5u4kwa0lvdhzmq5em992", "458052484840840960"}, - {"evmos1uhwvmv6lhx92fnf0rtu8mkk29a5aeyn2d0yrkl", "2005348491578380800"}, - {"evmos1uhxf8xfl0qgz7qhre5euu5x3t95dvqugzsaszy", "1112137270987048448"}, - {"evmos1uhxxdva0yaen3s2fwclnlvmn442sz5gdc6zqdt", "13884782896201707520"}, - {"evmos1uhzt3w3he2502gclwup56gsvemg6u9ept6j0f6", "19230155911710990336"}, - {"evmos1uj2sztrqv32e09wyunqkvyctqfuahscylun9h4", "4259498102968414208"}, - {"evmos1uj3xxgcdvlfscutrfjjx9gqpwnv58g2daratnh", "755685847154364416"}, - {"evmos1uj8apqvv3d4anmarjnuzujr2xml5yg059mprd4", "411300597164829440"}, - {"evmos1uj9p08h6dqtyg0k0v8x0tur7pkp63e66mtq23y", "696520690140204032"}, - {"evmos1ujc2pdysvkl4pr6lfpydrrdgg5zctssxd50kfr", "7378888653663543296"}, - {"evmos1ujpqqxd2lkayqj5c9z5p2hramlkx4zvctex32v", "1397294805177208320"}, - {"evmos1ujvsv88qet529f75kq5ru8g6a3knjd9p02fgsr", "6638655598985674752"}, - {"evmos1ujwsmr8sr63kdkqyejz88znk3u9ck96787uc2m", "799974705073060864"}, - {"evmos1ujwtwnaz2ae0223t95uar4va28ez3tq4rcfsa9", "19575301512035336192"}, - {"evmos1ujx2npzxxsdsul6fs3rxv4nkpu5sy6qvjgu4h2", "41718924249373278208"}, - {"evmos1ujx6hwztyxzpxggrkmhe39u7rqh6eusv5krrpp", "649460131342722944"}, - {"evmos1ujx9879s9tzrkjxm50atas8z4r3kk0q2castv2", "16503445272139202560"}, - {"evmos1ujxp8n5v9ha5v5vdx7alyyuxvak9eh8g2r8uu5", "384268632443664128"}, - {"evmos1ujzcw6w6xj6264x6a9j5n67nafzhvtmcgxszw7", "3520931101099567104"}, - {"evmos1ujzt4cp9zxjycn3ksw8yzaqxmju0kk8sw6hsqc", "1497170979666159616"}, - {"evmos1uk34pkpwfu4tx8kehqccaykf4w3x3tr2xus9vp", "3213719640195897344"}, - {"evmos1uk4jma9e7ahd0e8nghh7tpp4ue26q80cmhq5e5", "422387430122891776"}, - {"evmos1uka048whvyyfj6p237q4y7ahfwmft42z7vlz5y", "4442563539183918080"}, - {"evmos1ukc4lusw3mueekc7sf0apn4hkfpqdwz33qm2ve", "129371609848857088"}, - {"evmos1ukdwxmjm4e3v44sdq80hnjexn8n5a5vztw3l4a", "224029757221093888"}, - {"evmos1ukdyqymhkqpvv66jstf7wq92uyxtsqz6rqzfhw", "78633419202236923904"}, - {"evmos1ukerm53mxyzcdhc2ljm4asnd58j74mjfah7m6w", "2703847948450960384"}, - {"evmos1ukfqdhhejeah6twkrg0h3lkhuhrdz7a443wfcu", "10418142050417983488"}, - {"evmos1ukgrpvsmyu28pzhapzn7p7xs4y84asj3v85h8j", "784308627211323904"}, - {"evmos1ukp8jseqlf6zfg0emvmq53jyvfzqvh9487rlfg", "2357857169964965888"}, - {"evmos1ukqq87tt6wzpqqvpzv0jdvr2u2x34xndashjq0", "43508100849198800896"}, - {"evmos1ukuqmz8jlflqyq74hc5q9m6s6clc5z47y0kctf", "54744699108347199488"}, - {"evmos1ukwu8yjr36zf3q3e2xyq4xmw3wu55w9h42y947", "81285046918766428160"}, - {"evmos1ukyge0wdreqn4aegyyv7hzz9pq3kvkkp2j7u4k", "38156208940380659712"}, - {"evmos1ukz6k2ts3t2c6rasppswnxxl7dq5hvhd33j9fn", "7126439806429363200"}, - {"evmos1ukzl6ffyeum9cm0j0g5fur3u7nxtthssxe87m8", "1470427278722395648"}, - {"evmos1ukzlw98ru4y644l8vvxz9kxuz90tjelqw4ax9f", "1079409257895452672"}, - {"evmos1ukzpl7kc23rahwhv4mvhr7hyk2m9knurtgq75k", "229531981465091328"}, - {"evmos1ul6ne62zzec2ctc3c5p4umm0z0vc9x4xxv68u3", "260254276259620257792"}, - {"evmos1ulg6mdrswrnx24legf0rpxyjjhppxhmzmj7y8k", "6193379985316096"}, - {"evmos1ulgxsxgztjnqnhzed5gqcpjac7pnyplv4mucke", "3750038227932694528"}, - {"evmos1ulrlx2ue3ywu9pr8gqc0ceg5qt0aaxu2d3jc6t", "8179333422229030912"}, - {"evmos1ulrx8hacxz2mhw4glvk5enzrgjvtz85r5fap35", "29285963385359130624"}, - {"evmos1ulxfkqxms6z4taq8nutct0x6w9xamfw3sjcdyc", "686080138456622976"}, - {"evmos1ulya8jzy43fu2tgkwsm3gq9rnd3ax05xwqmf8e", "1526763234096801792"}, - {"evmos1ulyc07xp9t3rq80kz9zh6al9mxvlxml4psw9n8", "385761060623740672"}, - {"evmos1ulyzpydq9mrhsxcvyzpgdaj3cdyvv3w60snasv", "1239097367774364672"}, - {"evmos1ulz3zdpy0m6gl488jxjcc664l5zhx0kuuvq7ak", "510294254274118656"}, - {"evmos1ulzwf94guj6zq74g3chm3zaw333yn3ydcs987m", "12126247986899689472"}, - {"evmos1um0d7xexfrtpyhzyjzveplrmq7ul0lvz2gfrcu", "265369933969378304"}, - {"evmos1um0jtdhnv8vsh5yq5u79cm9sszk0zm0cd2avfc", "170189702960779264"}, - {"evmos1um36v7ahmz3cv0w8ufdld84ruccmp4mrapqptn", "1679741187189485824"}, - {"evmos1um9et89gzplkd5xa2lk3um784hczqxffjp266e", "741446938836295680"}, - {"evmos1umaezgxu3xayarfg9nncg9hp9whj96nparl4c8", "7307630376596773888"}, - {"evmos1umcuapxaezz4h0agxaafs36kg06net5ey0x87y", "2623670451165544960"}, - {"evmos1umdajj2mqaax8qr70vtlk3t4z4zezzy5kdzcgr", "1432889033183733760"}, - {"evmos1umdnsgpsymesjuc9wwsgwa9f7xaj2end02e32l", "761805598254150144"}, - {"evmos1umjdjgqfgpks3pgu9ejuumwnyjkhd2r7zqjnme", "7963793524096987136"}, - {"evmos1umk3m09ak0lygdv8fnsw43ju5xl2xzgc0f7xdv", "2121133333387131392"}, - {"evmos1umln34f8f9c27pdm4pn6gugh9w2x707yuxvmud", "3786406711290984448"}, - {"evmos1umvkffw9f3atm6lyduwazuzwwc8kgwuamfvvxj", "4304821737762310144"}, - {"evmos1umyup0ztx46delklt8eesjdht4lwmvgwy8czsf", "664695235381956096"}, - {"evmos1umzr53f6kgh7enqf7e03hp7qymcvtpw0v82k8r", "2579047869049913344"}, - {"evmos1un3xayn2t2dhu38adpr2g8gvk9dt9zux6gmneh", "2740181505217966080"}, - {"evmos1un432zhsu0e09gln3sf7sfr006uwqre2g0fmpr", "12186435706871578624"}, - {"evmos1un4tnd8c3npc4emppq89l9scl6rp9a8xc9xnjr", "640531135677750784"}, - {"evmos1un8dv9v0370w934favufw5jqh36cf0hs4xkkv5", "18090224295128795136"}, - {"evmos1unamudsn46sd37s0r2d25skh5hw96nx06q5tk8", "292369646342289408"}, - {"evmos1unehlawgthfx47p6l3ysh857gr56qxgkj8dw4t", "18431650278449741824"}, - {"evmos1unerg3r834a5g5ducr6u5ggwmvcyhrddy3lzxv", "860211967107230976"}, - {"evmos1unfhjdwwuaavrj8xzt6v4x8ferf5qxejr26xyn", "1335757359601301504"}, - {"evmos1unfr8q6gdw3wvkmmpmjgzp43uwcyy34rg4ng9n", "590326896298483712"}, - {"evmos1unhctf2aujdyajuay46v2qhvhqxcn6yvq06mhr", "799274258498655744"}, - {"evmos1unk7fke624ryf6yzasqjy7e23ffr4ukgj5rm5l", "96388558912169984"}, - {"evmos1unlf2zke28jju5nnx4mak5fflckkhn828ew6ew", "2306536556767093760"}, - {"evmos1unpjcgu8am3q26p58dv7p6h8xwg2hslzsgemuh", "927052469171523584"}, - {"evmos1unqdue87xtm72jrdkud2r6fksnvkyv752chp6y", "1736536024345779200"}, - {"evmos1unqwvemyasy475lsl6xtkvh09ge6j7nvv26nls", "34614288554096640"}, - {"evmos1uns8dmyvwkh75xdg4e5xzpxn4qvuaz744v0nxq", "3062834316984612864"}, - {"evmos1untgz22lekvm4nesqfe7m9na2xcs4afedn0qmj", "3500678522106802176"}, - {"evmos1unu3uh4czvkcfgzu6wweexvnzy5ypcyftzafvs", "26656187373754880"}, - {"evmos1unursz86rvhtqryfhjvke9uv75tccqar7k0y5k", "6672087577095835648"}, - {"evmos1unvl4a7jrlky8ekhm4xjwrye0uj33fxtx03mcz", "9726605385057222656"}, - {"evmos1uny64c3dzx63y208rshmlkjrkefs77yz3cgrhd", "682160298630146048"}, - {"evmos1unypk678078m60z949ezhvqlyce5lt9tjx6jt2", "1951638888196040192"}, - {"evmos1unztsu73ajaf0hw0z53e6y56gmjpfn5dcetky2", "317689447296332288"}, - {"evmos1up5qmsugf7yptzv26686e4ga6dcltwq7ktkczy", "474320799485360896"}, - {"evmos1up69e495ydred0qhlx925lla80lkt9njfxryvw", "384058946442358784"}, - {"evmos1up7m65f46fq36lr7z2katea32zdlwa60letul9", "3994655568862349824"}, - {"evmos1uph068pxpv42cpulngs3lch2v4spfc4fxvup98", "36332263098294902784"}, - {"evmos1uph0qmpasgsjje4ax85suzlh77lkva5jjyeln0", "759254070989731840"}, - {"evmos1upl0dwvgdrymhykh4s3jcgclkucr7j29hwrqxe", "40931857968694784"}, - {"evmos1uplysl26tcgf3wa56fva4300swhzw06wtvuk78", "446544911402835968"}, - {"evmos1upm3hp3ulgznp4leyd0p22m0ar5yxy6qjewewa", "28195723958874165248"}, - {"evmos1upnc4l6qgjd2t5nzjf2cs3k6fd08gklasmyalc", "883688628060596224"}, - {"evmos1uprat06urd5epdh2hpqxwshtucfmlk472mupxm", "181608688343365120"}, - {"evmos1uprwre7quqxmh6juhdk2fqrcvkaakz738nnc22", "1825432275956662272"}, - {"evmos1upte286pkrfkudet5l6nskl958uvfuu9uvt6fr", "823228152638744576"}, - {"evmos1upupvca03fa6l50um9905kaquuwlukz6x2x3c5", "4329394779180148736"}, - {"evmos1upva9hjplhzvh33e88hc23afnkua0vnjk0gpze", "2407403824558698496"}, - {"evmos1upvurmafjkve848meaufhkl6uj78pl68henknr", "8069815510787354624"}, - {"evmos1upwwqk6879wr4wj2fugwsvtq2kjymprk2pwh2v", "23333831077019246592"}, - {"evmos1upy7yrx6m5tqny4xl5eum9mnnjefjlwtg0ezkn", "223329301960278016"}, - {"evmos1upys86sd55ngq5sfq0ddep844kl0xh5lfsl0cy", "41113627100756131840"}, - {"evmos1uq327vk8qmkp0a3hhacw0lvv07d7yzay2d7en4", "8434420626416787456"}, - {"evmos1uq382wkz7z7rkc2aeerjj99ceg2yjdgqazcnu2", "1395753323518460160"}, - {"evmos1uq54frjarkcfq5lhwm0g2kvp8xp8d242fkja3t", "384248629485215488"}, - {"evmos1uq5cjnsf4n3l9axw7lj958eeukgu2d2lqjmcnh", "35549199781635665920"}, - {"evmos1uq5mh5ufyqj9wnqjuxp908696xu9d7r0n3ekju", "11948402106371074048"}, - {"evmos1uq6fmalp6aegwvxlxgq0havjzx4upyq0w20xsy", "6753281220467597312"}, - {"evmos1uqc3z2gzk3xpp36zm9jaqnmywg8847vry4ltjl", "3745270586599213056"}, - {"evmos1uqd5fv62eyqst0z04hr7v04zg2rsr058gdqwyx", "385283406219096064"}, - {"evmos1uqgh6zq23r8smk2c7ud7ekv7l8au8jusse0mgt", "369103758449524224"}, - {"evmos1uqj4uxyp2ehka3zp542gn3rjhslcn4q4dj8k5n", "6622456641094287360"}, - {"evmos1uqlne785whw6rj0fg6vmt8ytl7lna8puddk5dx", "139959910919739904"}, - {"evmos1uqluswzndkrktt0zh2qnkl8kv5n35fdm47venu", "1248477161709428736"}, - {"evmos1uqqr2ukx98uy25e34esz8wvmxumfhfeu72dq23", "1023613669831333888"}, - {"evmos1uqqre6rqaa9zqxy7w3w48dgvjvpcyqzk9nv5ql", "3365716735465299968"}, - {"evmos1uqte3zrx6xjt0uxm3jrwm4e00476623c6rdk4q", "1107710954193741824"}, - {"evmos1uqzvx06mknjkzr42nkw6n4jlrehr52cz759kgj", "5100206036115484672"}, - {"evmos1ur2c6e8lx3qcgyfsj3fdu9lgszgnv98z2y82xa", "78015354856499806208"}, - {"evmos1ur5la4wzawrltcescr5z924t4adwzwnu9jwnm6", "385462506932216064"}, - {"evmos1ura7fltx7nzk3ccc9tn6rr8dy8hd7smsesrq7c", "4687398108752904192"}, - {"evmos1urf3d6kakpwcmwmcd0ds3wzw4nnl3cvesl7sn9", "1522013746967937024"}, - {"evmos1urgu3sq205a72cr8dkzz8jl8dv3y5euckxm33z", "112647434875243008"}, - {"evmos1urh2czm095wpflp98aqyxf0p2f7ste4m7s4a4r", "369297867074534912"}, - {"evmos1urhwt757k7kcu5y4nuwl09maq3s679vzk8e0wl", "2403987283655316480"}, - {"evmos1urkjq38e6lzs4jevnghm95u7hysjxtkyg3e987", "384462538222563840"}, - {"evmos1urkm0l5xk4pf8cgq40gvn67a6n70rwp2xhxzql", "2798276653595279360"}, - {"evmos1url6pzsuasfwzwpe20thnlyncgnwspmp9tcmuv", "6049929680649152512"}, - {"evmos1urldx3jmwzat2q48ss6v2a73sws6cvrwhadtye", "29698993460596469760"}, - {"evmos1ursj4cwz09j60lydapyfm9v6zeldtj8jc5lz0w", "1729950486343714816"}, - {"evmos1ursytdrz97se50fz4ds8z26a6khhrrsjhht8he", "9401827657201664"}, - {"evmos1urt6a79vc9mng03hcufscg7wg00dplkdxdn0l5", "1715583095883708672"}, - {"evmos1urtzejfr83lz78erl6x804456x3xt47dudqdw5", "301928688885661696"}, - {"evmos1urupe5260k4z9e70fcuu26406ql4vawhysmgsn", "658775363884204544"}, - {"evmos1urutdajlzvyv5dduk6m7cnnar9852sz7mhm8y4", "7527184212657405952"}, - {"evmos1urwax3squf827qeh4qg5qjkypkwm93edt0djwc", "414852781627169792"}, - {"evmos1urxwx22zljst74x003v4pceg7dceajcjmekp8y", "1249565306732871680"}, - {"evmos1us6t6j0yjxqexehutfneaq7lgk0xwvp0vma73k", "229215297960631296"}, - {"evmos1usa3xr44h76e3vmnckehh402cham6ke554rc4d", "853068978451185664"}, - {"evmos1usc64l4rnqsu48d8jyatput0a8dlv68ma00ep2", "61181557328815292416"}, - {"evmos1usdrahc4x4sgyn8sufga6rssn2qnmpyfm2yvxw", "6344160177849434112"}, - {"evmos1usese0rjpxq8fc2ln9e4wym66z8zcyfns2uq80", "1717355946453006848"}, - {"evmos1usg0gkkecp3mc4779z4a8yy3fcp79qm7lyxgtk", "596025180453978112"}, - {"evmos1usj97s62qehmzdwe80hg0yxek7u5t77qa80utm", "920242734350807040"}, - {"evmos1usncvk7c8n83vwr7l67qcxcmv5rdfhv9r9hq78", "1491832787730502656"}, - {"evmos1usnmhp8dmssx2wqc63n7fdz0fc6jvd6fezq5cq", "6770745452853100544"}, - {"evmos1usnxqvc87ug767mrjjp68s6u6z5dk0nu5jvwvv", "33172798473121366016"}, - {"evmos1uspn6fdj7a2qynwdhxw6j6dkh0ql2hs9kx44yf", "99338376009681664"}, - {"evmos1usqmn09tny5mp24t7rkq6xy3ygyyan6cpfksyz", "1439677826430366720"}, - {"evmos1usqr6087k3weq2t04p68hflmkxq5eda3guusmp", "1272829502660812800"}, - {"evmos1usrqnp6rt7eatqat0len7jwwr8qcck08e86ajd", "44856532366771888128"}, - {"evmos1ustassup2lnwwqumzw2n3lcvq86hjn39wkeeym", "106428629370034176"}, - {"evmos1uswsqndfxx3kaqlnstwgt93z4h2497fmuzs9hr", "8241147009236286464"}, - {"evmos1usxmcdgd5h209nq5ykvep9k7keuvdjrdprwfzc", "2483048991617671168"}, - {"evmos1usztw2mkjys9f2sp0r38uz4x6wzd4dztyc4aqy", "22862110374147796992"}, - {"evmos1uszv52nvkdu2zgqxhdxmuzyy2e2czw5awd4suf", "3709966175793099264"}, - {"evmos1ut5pn2vgj24d2lldt5lrghalwm3xn6ucnk5vyy", "410890679518911488"}, - {"evmos1ut6tn89xzyq039gg0m2pj7gu79xyll2w0vmu40", "180295487360079429632"}, - {"evmos1utcj7g53eh7plyfcsxss7gdl24g5cck66jw6f9", "3823963796050296832"}, - {"evmos1uthhlqvlezn5exjc2d9xjgu5slnw68s9gnqu3f", "20242868741591105536"}, - {"evmos1utjwwem32n5uf5ya7a9yk2q7hwzggjw2pp28hs", "1413043344581100544"}, - {"evmos1utmjd7zmsgp7j54kwzs7es77953qphxzw3dd2q", "1384885494415195136"}, - {"evmos1utng5g4r44acrqdk56lu32v9knru2dnafd9ytx", "11483946765321762816"}, - {"evmos1utq6xmmd88eaz6vq0rn90872hdmekk3jnz2su0", "194988269047601152"}, - {"evmos1utu794d9skqt78tftsp40lllcv7qrvw4r2shnp", "287874656520712192"}, - {"evmos1utwd5gaklwekvl3ds99x9gul0wj0rgnk9t7sat", "53170372636087214080"}, - {"evmos1utwqr4utjrex57hcw7e3epdgelycpxe4glsqwr", "820506271387793408"}, - {"evmos1uu3c64h48g3z3fanh9n36t8p0e3r7w0rk3plm0", "6495130191574056960"}, - {"evmos1uu49kfyplyly6usmf2zn42mqfxpy3m7p78uana", "14683037141288126464"}, - {"evmos1uu4fq47sd2282r6uecqecvreqv7h7wf5h7qhyp", "316779744193548288"}, - {"evmos1uu7gcn6ype3zx9etm26us0dzvwf8fqew2d8m7a", "8270756234452250624"}, - {"evmos1uud8ga9hhf5zgae8ls4flsp6074eg05zcjkzmh", "2019824144983788032"}, - {"evmos1uudn4k9q8l3d30swapd4lkx20lucty7ucwgvqw", "945618785687931904"}, - {"evmos1uueraquvr6hs8c6rwn8ejsnq78nsqx3xtvqlz8", "133625590307049603072"}, - {"evmos1uuf4zfdely38e4yh0sygage6j6ggtfxzc4h6ml", "29898071812382339072"}, - {"evmos1uughatx90axu57vrj6pt079ratw5nap39qweps", "16625005118396235776"}, - {"evmos1uupxat2uuuq4tz7ayzu945854rz87z0zuv0yel", "212813003854540308480"}, - {"evmos1uuq0gdl09zpvu432anhfvspjsdwjt4un04majs", "42913829605870485504"}, - {"evmos1uuqkk8ek833tx8qql2gfrmqa4vzl7x2l3aktg4", "3658548610563946496"}, - {"evmos1uuqsrtzadkulselt2wacqgstskh53rz0huxwuz", "76637250219439587328"}, - {"evmos1uus27hmvv2lhcsanee7ns63mnanwacgkmv8mxs", "604318375005576704"}, - {"evmos1uutqk6rfjnqc5pjdwccss507rj5qcc9vxpdnq9", "854328395696726784"}, - {"evmos1uuue3semtrgtndluvl49v2vcs6yyuycknk65p4", "1719433205614477312"}, - {"evmos1uuvfrxsjhj3h57z6flghhw3quaxp3d2s48uyxz", "221298917813565440"}, - {"evmos1uuvpcj35sz5fjjecfkv69q5e9njep3nawr37z2", "10001325116161204224"}, - {"evmos1uuvtkxxczan9jcrt847n7uzeq65a8cdaxvstxt", "1490313479726415872"}, - {"evmos1uuxngqxt6f905c98q4axevwr5kp6trtjuy5tc7", "2189877128229783040"}, - {"evmos1uv2yfejsvg52yksphyjjkj3gq3hta7jnwpdvdw", "336937551388454400"}, - {"evmos1uv39tayzzrghm7sa83vdmxv5c2mr94d6ctnz04", "6013493643216814080"}, - {"evmos1uv3yf5whpvfkjek5wtlxhpzhufp0lvs75xq9fv", "2216896124576528896"}, - {"evmos1uv4aqhjuvx0y5zm67jnm9m8l28u7xgmh6645ts", "1672123947177357824"}, - {"evmos1uv68lrnxykpadmhwdsc30f7amt8qwzvyqp4fza", "4544212425522548736"}, - {"evmos1uv8cec8mpa0l8lypxmzpwl798h6hqlp5qsnuyw", "19955979589681688576"}, - {"evmos1uvacsl4z70tq3frn847kphln22sa284m8pyk4t", "11905754223857002496"}, - {"evmos1uvay4nxlvy4uud25dcvdmruhl4n0zg0dwwpwvz", "22534403887191736320"}, - {"evmos1uvd6rapjvre3fr5pxhuzchg3j9cjc56jz8qzah", "8461590948615536640"}, - {"evmos1uvfsezes47cfw20qduz6csptcenxajs6cyzgs7", "5355374554834274304"}, - {"evmos1uvhcwsj2dsafmznmnn5af8alwtqdew7hcl9yey", "2594196216289587200"}, - {"evmos1uvl3nmwuw6d4p2wrvvzrndm953yfynrtdwy5xx", "477608119677654528"}, - {"evmos1uvmsej2wtydx08eqlgrn30h2vc9nxgdszswchx", "384119454260387840"}, - {"evmos1uvn9pe6gulj2hgtps8vcstg4hgeg6knccvjfzy", "170639758650343424"}, - {"evmos1uvnrr4jy0yeqmll5wqlcyp350kq5f44dewnlvg", "5561681061725184"}, - {"evmos1uvqdyc8cs985r8qdkamz8df94lmrrahlcxjjag", "45788717657824288768"}, - {"evmos1uvssdwqp4389xq2uxnzj0t67fxaamgmwg9vyfw", "2128189437751402496"}, - {"evmos1uvtdp4993aef0spfn9a377598ua9l8ezyjn0x0", "291044777521332224"}, - {"evmos1uvveq7m98pvpwz4kz5ug68cgxtwack4yadmlxw", "98765802615785619456"}, - {"evmos1uvvxf4s303tt5wjfh55eth8r3e8urz5k73m2pu", "531741843314176512"}, - {"evmos1uvys25spfml5uvsr4tjke7rwhkl2yf43wlr8zu", "1148720594832611328"}, - {"evmos1uvz3rf678elu7fhn5gafrvtprq59z7x5rsn4zl", "476607895354506496"}, - {"evmos1uw3hrq6axsa2uyvzk759z62fzs3n36vd26aeyu", "3727985906766327296"}, - {"evmos1uw4px2q2p7uvnezgvkgjnhfv2m2mszr77aelhc", "7397600433290164224"}, - {"evmos1uw4tmexapnrhn6h5wya24u5xg40e9hg4p7ggel", "74608739501064192"}, - {"evmos1uw698py46srzvmfm0qgjx2wk6uvsm5ttkc5hcn", "3331946252934652416"}, - {"evmos1uw7a5eqnxyldtpv9u36yrq27je3tmkqcxqdvjh", "30985383555229499392"}, - {"evmos1uwafjacetyh4nz6u6ap5s9ef8h3sdsrw7u5epx", "9757072927216898048"}, - {"evmos1uwgp6znyjuayl8sk8207s3ydehych28fyfvw3j", "4488933464966091776"}, - {"evmos1uwgwj8za5tlznre9x83wqxkeqtkypuyyfleasn", "735152040241664"}, - {"evmos1uwh8d6h8d70v8aapq4d75j3vh6m63wetc0jeeg", "21808632420638720"}, - {"evmos1uwjwn5chygewx608d7dzx8amuxpx0de9h8lz8r", "3658150527550748672"}, - {"evmos1uwnn3kdwpkcdxu4sttujvs7hvwj8wcp9cs9jxk", "738510682746580992"}, - {"evmos1uwnqu7gv8zjeag2z28mlv8psfyzattyjm0wk2r", "675874612242110464"}, - {"evmos1uwrqmf6r0kcpwrsj9c3h7lx9ha3hj9jc0c35s2", "425503962071850240"}, - {"evmos1uws76qmys8l0zasmfchxr4gwdg8ljteq43crrt", "823313866504765440"}, - {"evmos1uwv45m9m2lzzdnvn7wmf6d7647kp8wcgr6423s", "18520571882792194048"}, - {"evmos1uww8r2vnql88fx66dqrmg53tfc53gkx6zargyt", "1540774122542297600"}, - {"evmos1uwwn94hhnlhc9mk9kc2nt3zhcjfumdmsdrpm5x", "420342544096065024"}, - {"evmos1uwz8w48dvnf2gh6fp0ctrem6l3z5ww9wf9tg2x", "12973105139227621376"}, - {"evmos1uwzee3ptegdd5cc4erwg246cjp0f34dgh4qgyr", "6456905469057445888"}, - {"evmos1ux325uwtl9ez49vazcpj9fwmhzaxdwm2jkpqn4", "68800765586007040"}, - {"evmos1ux6d7z5tvxqle7pyay4w4arvsn2t9d4j2er269", "408112918646914560"}, - {"evmos1ux84zm4ddlccz8zuug3nnxffdf4h2zrw4s3md3", "99008619142375680"}, - {"evmos1uxc6l6wt5kk4h9s9sn3aulfqe0dycxzwcxzm4n", "450244376701071360"}, - {"evmos1uxje3ju7gvjuexr9z0uele6gc0nr5t4sezgtrs", "27047680481274089472"}, - {"evmos1uxk2kgt2va0yepzt9hw6fymwpd2fklsj5c99zv", "3212885542453614592"}, - {"evmos1uxk550mymuwf3l4frte3q3zm6zh2dhkqed5jmh", "2221090766790796544"}, - {"evmos1uxk620l466ruaru3x97a64tm9uyr6hwm8wn6ay", "1980350300259027712"}, - {"evmos1uxltl7dy9fa09t2nrgf7qnq0ffz0puz034px7q", "1941167494511712256"}, - {"evmos1uxlv2q9zk6d98tkm6z3s9fn6emn5aqs5xkx6gt", "1382379846430955520"}, - {"evmos1uxm0wcq330kavgcp8lkd573jlj94z93f9hr7ah", "1754291782801242112"}, - {"evmos1uxns2s2wdt9kd78z066usdjsa990funyud3cpy", "202413598981235712"}, - {"evmos1uxqh8dhr7qv2vegquuv7eml049l0jgpjpyuwwl", "38419324746751352832"}, - {"evmos1uxr4np9jqhwk9gmm5yldm8fhd778r4malfl3gp", "1496155341015721984"}, - {"evmos1uxtdun5umn4prkwspl5pmd6p6h3h72h5h6hevr", "2198244413900484608"}, - {"evmos1uxv5kt7cxypp3grgwk6t847te28vs0jvwnx7wh", "110630386216015282176"}, - {"evmos1uy0ygz0kuyaew0vff7cgalwe0ycnkk6vy6urgj", "98049162876437760"}, - {"evmos1uy2zch9wld426mn3k95kne82pc7zr2nh4hjt7s", "4119476830074054656"}, - {"evmos1uy4h8ue95fj9y5jclv46sallpgxayxnzcvq2sq", "406310852801960704"}, - {"evmos1uy4t9ruvlqm5tdg9x9wyc26vuaaw5n93krq6ms", "2753758677441499136"}, - {"evmos1uy4ue2sz8ulkxn00z08vw3za2sr5x5vtpfqka5", "10123970469527148544"}, - {"evmos1uy4vjg6w4kgl5ax68uu3nrgw5qc4rf5mkejgng", "878013055805577728"}, - {"evmos1uy5hzhmdxky4l76afes2szhdj3zlt8tuqnwm64", "2783430972241666048"}, - {"evmos1uy62a2n6k560p8nkvn2mhspy790h08mtn9rz2a", "460896313520034560"}, - {"evmos1uy86z8vkdutjw408htm2wpjvrwe5t06t96x2kk", "9186909732054106112"}, - {"evmos1uyaxw79nay6nmxdquw9zteqm0sq39xud5heze6", "219419082936107008"}, - {"evmos1uyc923yhdyd98zg2k0gyhzqhvtkkxkh8fu8dkc", "487167860589190144"}, - {"evmos1uydrk827wxwrnzpzevdwrd3xzph0wj4umd2ztc", "1171935931191356928"}, - {"evmos1uyer2zsrdxuy6r5q7xv8hq7aznqnvajg043zvs", "4312142940082237440"}, - {"evmos1uyfdged6ku48ts8mmnyxvygw5j22ph24gycq7f", "85024356096800768"}, - {"evmos1uyfwa75rvk08ynee4xpwjyvd40yr94w66m9l8r", "18128742395552323584"}, - {"evmos1uyjdt4f3y3qg8c08wklj6f2vl8lw2mu49d09m8", "99376099860562176"}, - {"evmos1uylf73xh5n6skda82frwgd6nyruw0rnznqu6nf", "1066885758790265088"}, - {"evmos1uynay7rjwlfr0w4303xgdg6ysdhtvrq6k4hzyd", "45539445648828907520"}, - {"evmos1uyrqm57vdlz4s5majxd5yalv2rts9shy0rxa4y", "905634380936609280"}, - {"evmos1uyueezp9my09a2k2667zl0ds0cq05ckd3x96gc", "4468467309452804096"}, - {"evmos1uyuse5encmqzf780pl7aw4pdmp3dzqafufpm0f", "62675564953289703424"}, - {"evmos1uyz7hv54sr6kh5z5mtzjn0ty2339nykjkj2734", "714012411628108800"}, - {"evmos1uz3g2erms75q2uhzc7hce2mj5ls09m0qd6w0a0", "474164916075643392"}, - {"evmos1uz4wtx83k6vaj666tnc7jg6hd3gmgsd9ct373d", "2779220996604346368"}, - {"evmos1uz5nnk6gtn0q9kmqzn28ymns9gwm7vgzdaxush", "14351110806202552320"}, - {"evmos1uz7zm5v9lrwkdwcaamkgqwqxpw6zst39xnuff4", "2898113113628406784"}, - {"evmos1uz9kf9tlf7aggxfxqcqnar3c4qe3acy2na8gw9", "1150117798941412352"}, - {"evmos1uzaxcnyzxak8vwrdrj32ufgk4vvgst3upu4987", "1598237160881360896"}, - {"evmos1uzch57mxp8agg8t5884xckh797c8lzavvvqv0h", "1548237103004773888"}, - {"evmos1uzet4jtwzgcl9twu4tgadncpamzmqgy2pydf5g", "3038295579637188608"}, - {"evmos1uzhl4glsyqrz4yy4w58psl8fsx8h8mgcyqngmy", "4033326560601765888"}, - {"evmos1uzhqe742gej6enhwalueyrs55degghfeje309d", "2027254343932155904"}, - {"evmos1uzj42tkrdnjza50r8gq7950xfnprqmw69d46qm", "3010883033484054528"}, - {"evmos1uzq90qz475f2fkzk9s82hhst56mc7zqh0xjzq9", "12264939748334956544"}, - {"evmos1uzqmlyyzym5pjhdtmza52a92yaygkyhjftmhrp", "21644760346315231232"}, - {"evmos1uzr48uk2lpk052wwyjcu5ajlduaztf5dh82e0g", "52327912906302128128"}, - {"evmos1uzvadaltcw5h24uw4pvdpq59966dk3xvycqnpl", "2162543246189870080"}, - {"evmos1uzvn9ctqwrs5dtvta8m2gatfdnrxylcx0zu22d", "22855493058129862656"}, - {"evmos1uzxhdd64aplfypj2hzxyl9aes9xrxnl66hvtzw", "1240653427987324416"}, - {"evmos1uzygd2ufm6s2wwtwps0za6dqxryhjs653m95xy", "10498913850129715200"}, - {"evmos1v02c4mp9kehq7ekws4j8s9yhlnfe8tzrvly6w5", "2193943972468015104"}, - {"evmos1v03yhjuam5ks0hjwxlgc2j9ckn2fgthrdu45dz", "3835545726256962560"}, - {"evmos1v040psz5fjvank7l25r9nmej6dny4ft8cmuwnr", "1183592865671798784"}, - {"evmos1v044p0r8yjjwghwped4gvyd0w0zpyr4srtl5rr", "4375907998415866880"}, - {"evmos1v06qz23n6l5smrc72xaltmkr6m8x0ysgfx7fex", "859159792536606720"}, - {"evmos1v08tvdnapfd6n7k9trt3gwn2pnn0gx7hxrfmh0", "131042054297082822656"}, - {"evmos1v099fqxhrrnxfpj3j6cz2cy5fzgj0gumk4udl8", "5720999452054805504"}, - {"evmos1v09arxth0dcr3axhdmu3jdqq2sq6n8x8ljejhx", "42658808965759262720"}, - {"evmos1v09n5guamyvvj02rtgf0m5e9nnlzneeurdgylz", "474459800522973184"}, - {"evmos1v0c2xespwzjunn2v57eghqhsqy0lkd7yfzz6g8", "763804156928905216"}, - {"evmos1v0c36grq69r7whptlwpah6lp2k6dq6mxw0ueax", "14661333286106886144"}, - {"evmos1v0g627n9jl4cue9a9sj50f3yxhfzm0ajt0wns7", "1195756667218695168"}, - {"evmos1v0h5zy0k2lrswtru2ylvtnalj33ry8a63s7tzq", "476779059503931136"}, - {"evmos1v0kllrqm4mrnz8hwesn2vsgtdxdn7c3yxlm9x2", "3046473168439545856"}, - {"evmos1v0rmcp5t0ce0juk6er7huz54xxr8ylr5hv6zqr", "30533599010265542656"}, - {"evmos1v0u83f7htvykxvqgx582v2g2v0npkhhwqw3kmd", "715162100127662592"}, - {"evmos1v0ugz8lu0lz24vhuvnetkp7rwzpwsrlxra57g8", "3102513085922628096"}, - {"evmos1v0xh62vz5me264eapdxukju2dmn0885d3mfmqc", "4721148474079647744"}, - {"evmos1v0y6se7hqn03txamhz8wactqjxttrx27llynw0", "20716720517251911680"}, - {"evmos1v200v7lpgn2kaq2dasvm4d35unlsrx94f3zhmu", "599200835136747520"}, - {"evmos1v25f44sw4hdgrpamvpzefeherusqfkcpus3065", "3733700091147674624"}, - {"evmos1v28nyyktyzan747rhdt5e0avhaqncxh7dflfje", "20692666627417174016"}, - {"evmos1v2g6yugyw8rx3xez4n65dnyvwduszxks23ngvj", "2408965912669784576"}, - {"evmos1v2gegrgv4weyfjwh5ney3tdket68grsjh3ehyu", "3787254802769857024"}, - {"evmos1v2gg2fgcehahajljqq5zju3wj8vxm85yy28w4a", "8658181208728354816"}, - {"evmos1v2hp4zzyn37cjjhwme0erecrn5274jg2cdrxrh", "36028675061573447680"}, - {"evmos1v2mlv843f0eph783gldy5vvrd0lnu9hxfks4gy", "3398570632786705408"}, - {"evmos1v2mu5h9uhnhhzr5zdzfh20q09j8jw9j6vqjcwq", "1781219150298759168"}, - {"evmos1v2njs633klankv7l3vqx2uuw37lrl6umy4dq6j", "29462374633375899648"}, - {"evmos1v2nvt864pup8827z87rpcldhxhf7es5eekspru", "432378756070549504"}, - {"evmos1v2qdvlpc343rd55m9lqgk2r06gefeq7fldkajx", "18721899380757127168"}, - {"evmos1v2qx0fl8ndh0s379egrcz0thkr0c8jf44kx37u", "411162268876681728"}, - {"evmos1v2sfmkhaeg33v2jzhwdrgcqfnqw9xrfdx6gr97", "1645751325995586560"}, - {"evmos1v2uh225pw942f8pynhwfj5t0567xuscaklg83c", "25999617406185213952"}, - {"evmos1v2vfsktdchckcvd0dyuz4duc2e2rxtncl44zeg", "3431718817640667136"}, - {"evmos1v2wmgldx87hl08nk7lp0prns04z8cd4gkmgl0p", "1268718400795050752"}, - {"evmos1v2xtr9g7cq7y5gr9d9az93qezc7d2n5pxmuz2j", "2249997513986039808"}, - {"evmos1v32uq7lfpaqd2xcyrcfgktztqrzkmegg0avsnu", "673690704760881152"}, - {"evmos1v32v7hfvkl2u7sdcnr83uxnsh99ks33gxzecqz", "952371461567155200"}, - {"evmos1v34jdvl3m5tr2eldcksp5pm6784ztrn09fk4a2", "461800838056132096"}, - {"evmos1v34wg6gxh86lntvapul8343w9swuetqu5munm2", "705703995465619456"}, - {"evmos1v35dcfk0m06ctl6persdknffpwxnlysuc2vmnd", "664278642495470208"}, - {"evmos1v35fpn0425t0yk3rrlysynh35hcspy5gae73yd", "12107091447339745280"}, - {"evmos1v375wl6drt3tes486tqvvdwrpuqewmzzf99wlx", "3775104283916812288"}, - {"evmos1v39tqjedpp8cmu5fqr6nhy9dzqmly4lx3m829z", "6791506677935279104"}, - {"evmos1v39uq25shmfw0kju2222ean2vgmc254gt8kthq", "40878378222683537408"}, - {"evmos1v3c2v88ha7x6r7mex837gky340muhtqm5lzlp4", "15921777193255647232"}, - {"evmos1v3cvj0avq3ldyy6un98f22cewmeqm68xgmx4l6", "4874809827772675072"}, - {"evmos1v3ddc7nq4djnhqahrv3cf9dvs0t4ze9juuyvyp", "72021252283299708928"}, - {"evmos1v3gugy3vu873x0ea6a7vcpptt6mz5xd6jnftcv", "1599155906818793984"}, - {"evmos1v3jcj7yadf6kl5gtdxgujd5m2cjd40e25nnnh2", "2259348806083164160"}, - {"evmos1v3knhrvwhraru8k7chh73xwj47est4yr9qsqlt", "1422324885519306752"}, - {"evmos1v3lw40wm2xzkyfd9fpflapy9l6ewkt67c75zwn", "5803330981323333632"}, - {"evmos1v3m5pealhmsalrtvcz3av6zxm3gh2qh2xh8agh", "2405436257698791424"}, - {"evmos1v3mhplx846w802wp9fhp0cywehe6c8qn7dzhm0", "19288930439322865664"}, - {"evmos1v3mx7lacenyech7m548za95dr5jyhqa7vngmxz", "74100976346996064256"}, - {"evmos1v3nkmk5rr9fz609aazvg6xa0kszl5trh6nkpn5", "20375163502448353280"}, - {"evmos1v3q4g0r9xll5xrewr4h73llulsza2tgyar8q6q", "218099375962554368"}, - {"evmos1v3qam5jjz9kxkkydk2n5tg8mf8az88knh3eg00", "1112311986470359040"}, - {"evmos1v3rvzz2hqfvv7drq0mmgaftzlupc5lk0rxdmcc", "1323158638256741888"}, - {"evmos1v3sxaug7q902zh07pcff5tm6chrjrz5y247chv", "901440287196510720"}, - {"evmos1v3tujrw5szrtpr3z9zxk2gdz28sz6fshjzh03n", "47787239857431011328"}, - {"evmos1v3uds5tj6lr0nv2l5slxf2w60p27860h93wv0g", "384215104697220864"}, - {"evmos1v3we52wnqtx63l4cr4tuj9s7epu6jwtneuwuy5", "3154448585482764288"}, - {"evmos1v3xlgsmt7k4vaetzs5qmwp0n6hfad4sp0yhm4k", "368268948472207104"}, - {"evmos1v3ycq3gqkj0dkayh3v9tz3trdqp0vnfckfqlyp", "9126863597762043904"}, - {"evmos1v40n4pxg2h9kkch4p43hpzma6096ng5g4t8xc7", "233260706519520768"}, - {"evmos1v42nsdekq72ry8mhpp4cgp2z8mycrtzeuuw866", "9701190604937265152"}, - {"evmos1v42vl5nsx35030e78gtlpv06kpmnxl6wyxapvq", "3444518213844795392"}, - {"evmos1v4563f6l7yad7amymqe2shhfq8nt90xjv2y5s8", "351488016962215424"}, - {"evmos1v459j9zxtelkuurzfw9m68rxhczpry37a2nxpx", "355833443289528320"}, - {"evmos1v48zj3zcgg09cm2n8cww8g2gggrtl0hcp84xv3", "12325070406221922304"}, - {"evmos1v49jdsctrwfffekkwr9eftp2jc9wcrk0a8el2w", "24736756946180864"}, - {"evmos1v4a36te27qp7y6qkz2sla62r98j545x43jykd8", "96319890821042880512"}, - {"evmos1v4ar3e5efj6hsdgnwmwdkpmnxrgqvewkl5wzuw", "2915559146565136384"}, - {"evmos1v4es0qumd075lsw3l9hpvnazp63nu47nk4pu83", "16744544776727277568"}, - {"evmos1v4ex35nmu060gqq4eqzjkm34w2m838cz05ppes", "3382175842247770112"}, - {"evmos1v4gw3555sqk9t3amarv0r4thf5tgn2l8s35ztv", "3001951179071110656"}, - {"evmos1v4hp5qg924n266sxsv9d67s0tmma6fgjy2v3t9", "1960144907954450432"}, - {"evmos1v4jrzghkkkgx9trzxmwdl3uzavnapfadqw6g8h", "944196537560321536"}, - {"evmos1v4mpnwrjjmhgnujp0dnq3qnq6rekuvepngu330", "2886599793819892224"}, - {"evmos1v4qzxa7dp9tf28pygzlv5lp4k5rn5z9krcfyd2", "369550706623713280"}, - {"evmos1v4tn9zngjefr3y6uza22ylvcay77ks6ruvz3yx", "566121838434774528"}, - {"evmos1v4w6v27mxenspxp43h6ckclpvlsd2gevsr88t2", "7925328830293641216"}, - {"evmos1v4xng3z7kllfv74ft2hup3s5tyh58ge7rd3eel", "3932692944732665856"}, - {"evmos1v4y683hhfxevskv5x9rh629ghyccfk9j67t90n", "2416599539350593536"}, - {"evmos1v4y7kzdk45rea6yx6qqv6ksur2k8w7ptkry2p8", "11611894765822226432"}, - {"evmos1v4y8r0kj920rfg6xaunyamapfcc2wjzjpeepqh", "369407211137095168"}, - {"evmos1v52sph9qj90nr5xvd8yylfgmf3mx24j25ytmtd", "8447443594019028992"}, - {"evmos1v5578ux7mlkt66syakhp47xf8vng2y8evta4nc", "466216253685886464"}, - {"evmos1v56d4mrch06r94rhe5pqqxe69ypmp8v04xau4h", "318094942253101824"}, - {"evmos1v57k8e8j6ugj5x04awvn3y9r7fa53td9jv7xy6", "42346461587660390400"}, - {"evmos1v5jyzx2usu84xdnq3pn3epzm6ve9448xkueqpu", "360865829596469248"}, - {"evmos1v5k7r2wac8ucnl85jqmck7ea7nck7d94c636dg", "1373636898803152384"}, - {"evmos1v5kev0uf938vv28dta74xthu0hvwpcdv289y78", "1456167562837323776"}, - {"evmos1v5kkdtjs7hqzc4vgp8u784kvr4kvkhuxzk5rkk", "6944158580925968384"}, - {"evmos1v5ksjmd0w2rwk84xg278h4d2fsks7ac0vf7vfv", "3170176953634669056"}, - {"evmos1v5p2pevgvn5cfrhtz8pc4zr5m25v0uredyacnn", "846840720576393856"}, - {"evmos1v5qeguu80kudq80gwanglh0a449cvzw9c6q5sc", "430985891247230976"}, - {"evmos1v5qkxz77sfvpr6hgsy5d5rcruyra2vkqu09wck", "411393044534904064"}, - {"evmos1v5rx2ufju7xh6a544pu7nfynxk6pkfvzqqd86g", "301634219439167488"}, - {"evmos1v5sml3msc3xdwxg3gracx9xe2dt8xkhkq2v5sw", "1463494716324397056"}, - {"evmos1v5tt3h9wdzhjkp662yae9lzvxtg3j3ku02m3ew", "10492875185930600448"}, - {"evmos1v5ua60mj67vxj0j0fv3fpkzdu0z3zheahxt2yr", "1589412510925340416"}, - {"evmos1v5ywdyvpw2p48y9366nc7xnc8aheev6eympwpf", "2571392202846340096"}, - {"evmos1v5zsq6j73rq2dl2p0r93x43kr7288r2e4egsad", "340809719792952832"}, - {"evmos1v6257vutmjqugang4mu809hnet7crhlx2zf0j5", "2228686583020486656"}, - {"evmos1v63gfus89246p9akhjwwc6csjfdx68044g8m98", "411382999298613760"}, - {"evmos1v63qf4qzu9x9k76mlxmd3ukycdp48g7dtum0g8", "288909215800454144"}, - {"evmos1v686k4pf7d3lslqhk8vl06k6wqk2mtsleuhtsl", "769516126275447808"}, - {"evmos1v6aenatwm3jddugw7375m9surt5flw2wh4tspq", "4532041915952948736"}, - {"evmos1v6ahcxpxw2jtfgw93ydel4cgkfq77d3zr7m8jd", "4203683384283607040"}, - {"evmos1v6d25u9a4kyfvpp6dz6qndg22y5c2wqx6p2hrx", "6968883385002446848"}, - {"evmos1v6fc8kma5lenvkq8vzf52yxnt4n7a77uxx8yp6", "138014244931135275008"}, - {"evmos1v6ggesh3zt43lqml9tq5ekmgllj672jp6cfzs5", "102707622845696212992"}, - {"evmos1v6jnusudnvary0aw38a27umpdx36jyaywuffm7", "1473978387188760576"}, - {"evmos1v6keyckgr5nfnf4rp6x6su5tyrwzkee07ecsw3", "94779757669806407680"}, - {"evmos1v6lk7upky2y24fq3j46hxr4u6p96fy6jt3ece0", "704469351859190272"}, - {"evmos1v6mv35aafun4v4kv6lf6kuuj86akksxnxgx8w6", "217747114367850496"}, - {"evmos1v6r00frx4usqs7mfps07kugrym02ywt28d57eh", "3879808756837070336"}, - {"evmos1v6se7q96pl30fccrfr0ahmylp7rsef09lnd2w9", "2572275481815840768"}, - {"evmos1v6wymg4zah5u8hh774tljgl5r73e94j2d9d63y", "34220027341510148096"}, - {"evmos1v70fef5a2hpetfwjwqmkjxtn2hp7dpdrc7dmrc", "792104223220482560"}, - {"evmos1v72ruqckf35wwgx489rtqwwhcltzm7pklkqs7l", "7464190559745160192"}, - {"evmos1v745zn2k92l7spdrrghqvzltsvlv3mxtxem64q", "384416590566471936"}, - {"evmos1v76mfs4tkhfk3rj26gg4plwuns9zu30y9x7z7n", "2839374583809536"}, - {"evmos1v79re0t4d6yp9rajazlz0j3l7ftqlvnapnhns8", "2169628361312034816"}, - {"evmos1v7a48pgvf4n3dq67r3x4yhtzjzxmxd79vhsgy8", "11915041837274413056"}, - {"evmos1v7cx0rmt85cvvqsaxvlyk4z4l9gt9knx35w2ax", "706828505276443136"}, - {"evmos1v7djccwhls7kjh5e39p934qm2wk2vckysn7uj8", "9766136235156967424"}, - {"evmos1v7e4zeqgez7u0unp7dkqtrcuyx0hclq9u0k8cx", "4862380612875481088"}, - {"evmos1v7g0dpv2vda897fu463kx996uk6hrkkah0x6as", "460642036329506816"}, - {"evmos1v7g0pccy0ftmxec2txdf2vrpt5nr2yw0hnmjsn", "10301019183303663616"}, - {"evmos1v7hq363kq2xjzpg6emqma2pmrt52zp6f08ss67", "1272692249325063680"}, - {"evmos1v7jkl2vcgu80nnc4eyw4rv6d9yazl7qghm9m79", "387163993917480960"}, - {"evmos1v7jrlqxqnt2z3g57ad9hpjvm93r7edpy5h3278", "462524611932363520"}, - {"evmos1v7k42sudpeluaqmcsjfary0cjdzpzvttcy5288", "1360227910127909120"}, - {"evmos1v7kt9cf8lhchzuetdvny3j6uj8rakxzr29eku0", "12618524027041257472"}, - {"evmos1v7lcap8gh0j9u3s6ksa2d6gdkrcpa7q0uq4hfr", "8186958791808771072"}, - {"evmos1v7mv2g89du32qk95r3sz8gcaag4lu2qm2ypujr", "2582567554228625408"}, - {"evmos1v7n599at2rfu4y3mvth8dyuvfflpztzwr33vy0", "1250493422481724928"}, - {"evmos1v7pfe6zv8l6xdseypqmm46sj9j7svaqemyj0kj", "32121507717622775808"}, - {"evmos1v7qrcn67ccy4yg7fk7kkdcfnpmsh7eyvdu0da3", "385581334229164800"}, - {"evmos1v7qvh96ftvf33zqr50vn6uszx009hcv56efdnl", "369474239792067072"}, - {"evmos1v7rttlu58e6g60jx62pz38u989q8ncew9ucpm8", "6456936580184522752"}, - {"evmos1v7su039agf2887uwr7e9d8xkn4yn9sprlr9k72", "917661174332442240"}, - {"evmos1v7szswet4t5gcga7aup20zqeqcdkmpcwk5uqq2", "1501452911221440512"}, - {"evmos1v7yzggku9m2fegg9wun6lwrqz459gj449nwzt5", "5740011053442466816"}, - {"evmos1v80s7s0rhsdt53wgtnl8t4k3nw3p7u3c8j9c56", "14098776436473538560"}, - {"evmos1v84aezznkgmnukfegpze46azg0347c857x4d3m", "463829527766397440"}, - {"evmos1v8596kzs8lrwd4jedg3whhatxhr8sm5t2kfaeh", "4166654339707535360"}, - {"evmos1v87s6ppa2x04527s27zsqresmwtgp9pfek8eev", "1431582940134834176"}, - {"evmos1v8947twal500t66hdt3c09gyyt92nm72t5avss", "136661309192967168"}, - {"evmos1v8dtfm0rrdt77wcykl92y8u4prpgkf9mjnaehc", "3921877744133652480"}, - {"evmos1v8gpz69wsqd0hhgpmu2aqy2rku49fz5wrff3wq", "1165710532759529472"}, - {"evmos1v8hqfuuhsjm9n9v7fnya24ja23jpcnllapqwgq", "1160890584813727744"}, - {"evmos1v8j5csm5e6qesjy9kmwx40ph2gyjc9vwmtcfdt", "254027168554265600"}, - {"evmos1v8l3tk607ad3srxuxdglw87v9zrqvdn0rx8jak", "1989875960075567104"}, - {"evmos1v8pxfehphze0f57s8kn3kwrj6nztcw8y59zntx", "461823600846174208"}, - {"evmos1v8qam93funpn20cz288a8yaxm978gpxdhc550n", "18928211842161561600"}, - {"evmos1v8qc2lp93tw0fanaf4yyv5fjs5jygjj7df335u", "756477950733970944"}, - {"evmos1v8t7eceg2n90gmrrqn74xecyatx5mgjke7jvtf", "16092974343561115648"}, - {"evmos1v8twmwr3ksws4kljvvrsc9dz47vjuluazchr5n", "319393402245445888"}, - {"evmos1v8ujnlzadrkyrrxl0ydhseymdkyldx7qj32rt0", "35465064042529619968"}, - {"evmos1v8z0f43ug8larljw5ghfulwzv9sv960dgvvcfn", "99048867614362624"}, - {"evmos1v94cyj983w33cp8hdyjzqcxs69538szdqauqy9", "5412644017211406336"}, - {"evmos1v95yjzss0ctm6gaa8dc48lkf40puvts2w3fwmf", "2628762742684131328"}, - {"evmos1v965c7v5qydt03uxflq5yy930xnqxndgez9vkj", "1133833021439204352"}, - {"evmos1v97sszzldqrs7q87f9zuretsz0mkqzcjmjh4yh", "981038912367993856"}, - {"evmos1v9885mq2cmeu5vge0a9lvleqzr98nzz0nakhqw", "1408860361181708288"}, - {"evmos1v9cfl9k9wqwtavuc5ygk9lns77uamy4gc5pa7s", "197931164034298880"}, - {"evmos1v9dmu7538dw285knmdm48jlkcva4nuyjuhwac6", "21439064151619973120"}, - {"evmos1v9guukhyjs5jcgse8rzxga64a2mtsxe58rdlkp", "18121133979708096512"}, - {"evmos1v9jjky6snrvu8ccfdxaezkrg83mcp6e7mxhu6t", "386191955258465792"}, - {"evmos1v9lhjvvtxq47dpt9gaum43azl4peg9065ka4yr", "5151248184093440000"}, - {"evmos1v9lr6s9mqlnkzpqq6mm08eh37yhls0xfq6vfq9", "6775168546004077568"}, - {"evmos1v9ma5z8kdxzt0cgkm8eq0xucchlx75r7qplukg", "884002234031749248"}, - {"evmos1v9ms47z6y96tqc2jealkxts97c700phvxmnprj", "521097948807003136"}, - {"evmos1v9q49chqt6tmxlzgsftfny2assv0plkwn0u3pf", "4566982599475042304"}, - {"evmos1v9q5sjq2kfx5ygd8npzwrnw62dfg4kpvc0lx49", "905925578165178880"}, - {"evmos1v9r3wmtc0zx3kfxe9ns3uvd986w05vuxlyj6x0", "2374846669251948032"}, - {"evmos1v9raslt59aysf9z76fw8l3n7kfp7hv4cqt5p20", "108924457679870197760"}, - {"evmos1v9skam64rkzvkku35wxga2lu3mx4jknjaj44vv", "803891907320660992"}, - {"evmos1v9v8mehf79klnaa4dms8p9m0nrhfgvvz692vmh", "2461384551016316928"}, - {"evmos1v9ver8303lh3mwd3fdplmlelfq2gy4pmxqt8v2", "1283711576186234368"}, - {"evmos1v9vrevf55ehuad42a326r7ghrgdszkvyx858k9", "2743132924556799488"}, - {"evmos1v9wmywsv27q4fdm2faajfl9mzghcdf42y9zfxa", "2566254092726389760"}, - {"evmos1v9xv0ch66zn4vhcsx3krh9ps2fatmylrjx4d5g", "3777529367540668928"}, - {"evmos1v9zc2ryhgwyyj2lu2um9m3ghl7tz3dmlr435l4", "288292178925949184"}, - {"evmos1va4ughgrxvv97vhdjrj97pqvd4fuaydf8rtasg", "1392735082778001408"}, - {"evmos1va7gvvpsaflkrpp2kpu2quh68anxz6729g7c3j", "2194998096313593344"}, - {"evmos1va7xzp9pu6dp0ydmvv8u4pnaj3ahjteqw7ctgm", "1233573085400378368"}, - {"evmos1vaaycmyquutc8zwdsuz89rt4vfjdt5dnt34ysu", "1544208281059322880"}, - {"evmos1vaeh6al4ahlunzzca8njdxrua9h4l6fplpjn00", "13791079942775808000"}, - {"evmos1vagsae553p50adq72rn2j7j7srnznp2t92wfe5", "6250215731332276224"}, - {"evmos1vak6gxde9a5qehmhr2st0332xu07qrvfkd7lsc", "10199151545734922240"}, - {"evmos1vanlwjdquuvn38jqrkydw50cqkxl8g3thtmdpq", "282803331773164191744"}, - {"evmos1vanp2sjerp3hvr0f7tuv427ljkmh3yzrndk76q", "1040898121720524288"}, - {"evmos1vap2lus0zp28rqmwwqhpkt5lzra0pas7mulhnw", "57876915850895360"}, - {"evmos1vas3k77g8rgg0p6jvg53ycxpwvvmt7d2cpsl32", "522685307429912576"}, - {"evmos1vaspfgdad8autzv9l06yx946sar4skhmtk2h7u", "90378768656626688"}, - {"evmos1vaxuvpjaxan85esgyrj0a0l59c2qarkm0gxpyz", "80322711469670656"}, - {"evmos1vaz2cdnm5hem705lcvhmd7sdwgdpa2v2ud7nhn", "5778122373053751296"}, - {"evmos1vaz9m85hgrh0azvfcxrj58q0f0hcsu46sdcl3g", "11718474029289431040"}, - {"evmos1vazfe3hyay2a5k6fx8mpaglze4gp636vau2p3e", "16218484512518209536"}, - {"evmos1vc45n43vn3j4qnmp602nyaj4x6y780n4qyuklc", "12406004288712257536"}, - {"evmos1vc5v3pkjyjc2ky5j6zqk32zkhyqry2d3dtuf30", "2022935560528529664"}, - {"evmos1vc6j36wke4gp56k3rcwtxydxdqm94pt8m785ju", "4306163048198267904"}, - {"evmos1vc7ghzf0magccpjhn3l4pha5e9493umz5j6tf8", "8813659691790413824"}, - {"evmos1vc7jne4y83nmgjq2p0560aclcpjwnn3hr7edhc", "2562939733584531968"}, - {"evmos1vc9k8lg7us2l6eawf9qurc0kfp0x5nvf57mwac", "2709301671448686080"}, - {"evmos1vcdwnmgrn5nudc46llk80xmu9md6h204h434nu", "33770506870088589312"}, - {"evmos1vcj5dhxf79v2n2a568pmx6ds00r8j6wkq47s4j", "978211106402421760"}, - {"evmos1vck7nlgsk4enhkr84awle9aqkdalj2w3ltyrf0", "474086589906185984"}, - {"evmos1vcl8a09rxf2f8dznsjlp7dqqaj3qe75sc0pklc", "478790728624278528"}, - {"evmos1vcndy2zweuu59uzjarq442dd6n7nsh90zu5gmx", "562825849330208768"}, - {"evmos1vcqsdxc8yxd2s7hn8s87y5yv2atdhh4lt63hlx", "318223241234653184"}, - {"evmos1vcquyev34u5076f3k0pj5uug0z20vzusjlql6y", "2766659088503525376"}, - {"evmos1vcrgx679fs53l95tx4f74480sh8l5pwhxegfhu", "81231068151394140160"}, - {"evmos1vcsfppjg89xshfkynrap4caflhtu4nncke88rg", "916635958068396032"}, - {"evmos1vctjv8j42jax7hr0qktvqpgwej68gsy4hlyt69", "14711506974284996608"}, - {"evmos1vctqn88aqstsmg860gwu5etaezav6fmgw06v3q", "2916200480669859840"}, - {"evmos1vcvf8p8l5u05pu4tzyugacf9aek5a3khc3fspx", "564325608671026944"}, - {"evmos1vcwfjw06xyd2d8ycvqw09a8upe5ck79pr6tdd4", "1577073894911811584"}, - {"evmos1vcyd2dpv5r7q4ncvxdxzf9h32s40rlr3c6kj9t", "4112843546178127872"}, - {"evmos1vcyj0aynxa8lgvf8jjs0rukypl3n4jddu7y44k", "1637906661882706944"}, - {"evmos1vd0e2d5jhwvvr7hyfmw2md9x0m6p0us83qy6nx", "8105821672126679040"}, - {"evmos1vd3ywspecw5799q65ldl5dcxcqvqatc4yangs8", "94381690081383645184"}, - {"evmos1vd650e7476xa0x6247kv6v6jt4greweksas79m", "880379865112201728"}, - {"evmos1vd73nw95f75ct77c42x0fzvntl889rh7pm328k", "3727123232693692928"}, - {"evmos1vd7hmjlw536llydpl0yxmtmcqd2fsdemwh6588", "6505105610472485888"}, - {"evmos1vde5q46tr7jc29llafpjjdqvkc2ketr5q3kepx", "231458247359550128128"}, - {"evmos1vdf92mxef4uxfu89j5kqejwct69hpclyuqzylj", "7603006699507758080"}, - {"evmos1vdpj80lxyqr5nptqrykez03zh7tujqcurttu9f", "14046614956707840"}, - {"evmos1vdplj8z2zfrtfpez5kmdtxz5xqghxgh3mqskgz", "5548738483810467840"}, - {"evmos1vdq36k8rql8llutxfm8neaszqzwpyws5dt0she", "330838814383589376"}, - {"evmos1vdqq278d25nvp730tcrwl3eaarsxhf5t8x5xr0", "1856425348117703680"}, - {"evmos1vdqqwncud6jxgmrqwmqc76qr47zygvacse63xz", "339226461329223424"}, - {"evmos1vdssmkfcxctphdzrwxysr9mmat6cu953pq8dtr", "32424062167152361472"}, - {"evmos1vdt7nnztg8u6k88t8d79wuqldg5zk9mf9r7r96", "152775216135583744"}, - {"evmos1vdwj5ptv6a5fg8cckynuj2x22c6wrxjsfmurdk", "4391250135157504"}, - {"evmos1vdyvf8pw974l4hygje3eh93tkjk32nrg6dm939", "1607975934429218816"}, - {"evmos1ve03z9dfw455lk5rgu66w76peqht7xx9ua46z4", "318517834666101760"}, - {"evmos1ve2qql9cvfuxj26r2ynqxjjw6kd53gq9jd2dk6", "11671492139419060224"}, - {"evmos1ve4dcuwqy2h4qgd52qetvq50h0ha2e3xqa4zsq", "39301719125973401600"}, - {"evmos1ve4j39p7gg68zudzvrldz4qryzpev45zzfweq9", "138827489515822080"}, - {"evmos1vecjryyeafkvca0t8a85yqx5d2tmpxsez4rvyd", "1157771942675910656"}, - {"evmos1vekg4r3g5hw7c8wwvfkav4m2pjekgzh2hcyfhu", "1060391024704663552"}, - {"evmos1velwky0r4h7z7w5wxrp8slm55fmqan877d0n3f", "3123932866929155584"}, - {"evmos1vemn32mfx6euf7h2fyywtr334f5u78j5arxdgz", "1282904591094775808"}, - {"evmos1vepansmpvgc7qr520vscdd93ncf8vzcc40mvvh", "475425014659357696"}, - {"evmos1vesjsrfrv0mf5c26u6040t0ex65fv3x2d6frs9", "976305683451209728"}, - {"evmos1vexa6dm86fqf7hx7grf6j5f7752mrgfzk4k4kn", "3772863633115635712"}, - {"evmos1vezrjnhvv7p29ax3g6a3lzykc5xh72vsnxrwu2", "86877443717502205952"}, - {"evmos1vf2x633g7tknj544nckptwpsuhlcqj7tss4luv", "232943291548927488"}, - {"evmos1vf39x3hcft3ers5r6akxfdcnrpw6czs2hw807r", "466224139773563392"}, - {"evmos1vfad8alyajrzkq68yrxnwu3uj6vs83ryn57zjp", "2856431303050967040"}, - {"evmos1vfc4kycjrpwrh8s3w7g6r5v4etxng8eew7ry5z", "3386711476763248640"}, - {"evmos1vfd5zcv32x9rp58ch7eudr6k4xl8kafsj89889", "5072570228366349312"}, - {"evmos1vfeu4zwrnjzhvcgm84hywdl8s9xcr2epzqm493", "1643807370128654336"}, - {"evmos1vfgy6k5m8778zss2f98qzv5pf50tfzhm3600r6", "1334797398074394112"}, - {"evmos1vfj64lydykekl9ccr3zdp6mxj0cqawshpnsd3e", "1064619301870026752"}, - {"evmos1vfjvdp93x9yrxhml8c4thzfpkprxza7sqgp7t2", "2151291574839485440"}, - {"evmos1vfpj337ekuja970msgpf9xrzsd7y080vlf6l7j", "7571630805158043648"}, - {"evmos1vfpw7ad6nc58j0mra3ywhjmlhjr98teqhj9qh7", "1561328789873977600"}, - {"evmos1vft2f7kaepfn27zm7r0s67q0k3qs4tmclr6py4", "3204385242240490496"}, - {"evmos1vfu37zznhw3hnqayqpx2j430ghqd7yss3wrup8", "12869768971960176640"}, - {"evmos1vfv8v7qr7sa2zzczmqs700qy7vpk8fdmptp85e", "3049729005355164672"}, - {"evmos1vfwje0ccfr5cu60dekgqwhpnp7g2l42hefavy6", "5546858888581005312"}, - {"evmos1vfxu9j7dvd3xjxcr55dgmxu8f9ps702rx25p9x", "413176735879404544"}, - {"evmos1vfywrhu56vemqj959mmcye4rjlqu55lvnwxwc6", "90342160474428672"}, - {"evmos1vg2gggnu5cmkm5x8cezv0er2rrujwpled9jppf", "4024860260726539264"}, - {"evmos1vg44xprkafknprp6g2m6kv70a7lvhhnl0yuz96", "1906659255154716672"}, - {"evmos1vg4cq79h4q5vkukyeytwfq20h7jjequrgl7uxw", "40143135260661899264"}, - {"evmos1vg5t3g4ux2ty54qv3ednyrynypeu9jy7ezqj5t", "49506125906345984"}, - {"evmos1vg6n2lt7txywrpx3lce3gj7nvcfef3kgvn9k0a", "7934320378797359104"}, - {"evmos1vg9kxy3ach743e7wv5fc7jnhu6jv5ctgnmamj7", "160202299884589056"}, - {"evmos1vg9ywc5mz39j68jdqkl9h4kv9496r30d9w7pu6", "3553924669740146688"}, - {"evmos1vga02faggq0xplxruy95wq0k3g35gye4ha93ew", "59856930504104448"}, - {"evmos1vgc3hsd39gy0rfqqhg2tt0glxpexl9yf04sph3", "21916315564603400192"}, - {"evmos1vgduea9ysrl7zezfrnqkyradadswtknkpns89d", "8235162632038048768"}, - {"evmos1vgg6ruy02y84flmxvh8wr0vktxhd50v6e9k05k", "5745095913835767808"}, - {"evmos1vgghscw6dxks6eyr7a2s3txkrpcm3czcr5j4l3", "991495383241472512"}, - {"evmos1vghk9wg47cfewmhy925egyp54pw2q9pn6wd9q6", "1313159158603569152"}, - {"evmos1vgj297ehnhlsgt3e057qs9w93jsfh9qwur2lfy", "14166784750169276416"}, - {"evmos1vgjeh4mm79jgxkyhdpu59fsqjhgrx4q5yqxy6s", "2991731350326343680"}, - {"evmos1vgkn5fz7y9hl0q33rzz0tamzydxjn5ghh8jrcf", "403050876327055872"}, - {"evmos1vglkpfthse3akyd34vdtsydqh3xt8dfh2txn4j", "229921989133245952"}, - {"evmos1vgnrmyf4nmxetcpg4pgg9638vdheujzumahf05", "380755434813239296"}, - {"evmos1vgpfja6gthva8tx4w77lf49s0tnwrk0vyks6a0", "2167009708636157952"}, - {"evmos1vgph8m7g7rtmltmejkgq97p8s6muc907p90r87", "6297663734575529984"}, - {"evmos1vgqp4hk6azryjr9k656h97pfpxeslcry7xn4ap", "12746080295116800000"}, - {"evmos1vgrlf4s6w039yp6x6eys4rmjznxsjv4xcmxdwx", "957706523168730112"}, - {"evmos1vgtaa9x8sfq9dgjur47xkys840tsrjue72gyjk", "9058891889184060416"}, - {"evmos1vgte7t2cjzqaknztl7c779mth4t4gqpkm7766h", "7818489214075490304"}, - {"evmos1vgul7yzqusfyj92h57szkt9uckhgthy0eyrlzl", "183335401367732736"}, - {"evmos1vgwk2rlt5jx4rd6xsq7kr7kznkcy6ncqlm6ula", "1056300301473255424"}, - {"evmos1vgxa79gh0amkqws6em23hganvlmauymymy339c", "9913881235003867136"}, - {"evmos1vgzzk4slm763puj4r3nzkpm4ffv0s9q53hmanp", "419556670677020160"}, - {"evmos1vh9vrlr538mmpq2kut54mdxtxhru9x60h9eexm", "15134440590116335616"}, - {"evmos1vhe4cl826e6axrvd44mqq6rl2cyll6m8qeh6mj", "2168180888433598464"}, - {"evmos1vhesg832uuel6my4e8r6dw3ea0wac0d8vgkltw", "873236409803872256"}, - {"evmos1vhewmm8mlxn8tee48mcst9e796j3tlnekc88p8", "1529954013531549696"}, - {"evmos1vhk68y3lujsd53zh7uux6r2nzcx7a5802nc4jq", "1661678291433332480"}, - {"evmos1vhlawklv5r3guvu8fs0xxevr6x4q3vxksyszyh", "135041712037758812160"}, - {"evmos1vhm6q2jp8q4jyarunztxpf5cdexra5pvs74nrj", "63409142541352845312"}, - {"evmos1vhn5cgw388wxk2w66zat5rmsu45v2ulsequ9th", "1528198729958960128"}, - {"evmos1vhq7ykfm2q92u0p5x6rvffh770yf9p0dphggl8", "923517052087531008"}, - {"evmos1vhsan8sylxnvlm7uvr0asy94s2ke6yvfnx5ksq", "5798750834335875072"}, - {"evmos1vhyezsdn49pvtcdmy78a954gghqttsudsmkugw", "819340456944951296"}, - {"evmos1vj0knnxswldq8ha3ra93m245kcjlt6dr9em8ja", "26831659110138413056"}, - {"evmos1vj2leucsqeuze2dw6vncxa9xthqyjsqn6uxwdu", "6466778786667675648"}, - {"evmos1vj4utvgvwlvnhegr3ea5jewj7rvz0yf8ukcwz2", "46476487909651423232"}, - {"evmos1vj5uw7d7xpk52975y95lrs5kyy9n005jp274yd", "4622697996060098560"}, - {"evmos1vj72uee063leg7t6jxk6ewqmkkmhahfpnk4zqr", "368885614419795200"}, - {"evmos1vjf0m3yvhytuxrx4gxazwfd2w7dncyl0vh9xf2", "765883711493627904"}, - {"evmos1vjfxc7fgnas2wj0380p4qyejrswgrqaymdws4c", "1863363924137379840"}, - {"evmos1vjj2x0c6hqxup60gxrujnyyu4kvhsruwvceyat", "4647328493214089216"}, - {"evmos1vjjgxknxqqc7un55l7ury3a0lg42l853xuf5yu", "1285615105032965632"}, - {"evmos1vjkexprnpgu33gcgmmx6njf4mfz8pyg99n4jyg", "369400808531059712"}, - {"evmos1vjlpcxspnqms75ajpq0p23utuvf466l0qlqe84", "3222339295648217600"}, - {"evmos1vjqxv3zmgc2zx060sdd6eyyysrmtdm2sdy28q3", "15037139026082660352"}, - {"evmos1vjrc88wy7jl2y63u6xran84rrn9073glxqnt7n", "912690488756303872"}, - {"evmos1vjsc6gyfvz30udqh6326y8mss57ap4xazfv0k7", "107046526982230016"}, - {"evmos1vjttskup28dz99gu2rry84mjcnfgs8uujepw8u", "1056920282242150400"}, - {"evmos1vjvxwu8yxglc6warntq5lw5sxava0e85jmr3an", "804737722185117184"}, - {"evmos1vjwskdfx0cc2c34e9nuqhl05e9z9jezav6fkyl", "5866517469519726592"}, - {"evmos1vjz95pdzg3sexaecdc3g8pt8tzac4cy4f26d0m", "1234215019488512256"}, - {"evmos1vkaq92y26skz2cu3342efyzu6klwxyyq9snenv", "386751847634853888"}, - {"evmos1vkcdesksm5hjnefkh5ktm463mgwkccslvklu9l", "1712262335662749696"}, - {"evmos1vkguyjajch73x3yvhlzpelx66khtk59yf25es9", "2878097834141173760"}, - {"evmos1vkp4x42mffaf5anzenv2wf5qaf8h4rw087xyrj", "6575801648500006912"}, - {"evmos1vkppstm73kcdyj65dh0jd6z4z7wdr40mrst2xe", "11053075329655838720"}, - {"evmos1vks3mgunc72gv7e5usudfqrepuhvzgvyvvkuqh", "8879269802313575424"}, - {"evmos1vkstzmq6gpg2mls6drujfq8tjueh5g80sdjr3t", "5567309986208522240"}, - {"evmos1vkugxj6z7kc52kkkpu2yaepu3v4knwkq8v75x6", "1333593594695173120"}, - {"evmos1vkuwazxdw2dsp3t53p8ngpr83wky08dtvjd9fs", "6007600825588494336"}, - {"evmos1vkve9hlv2235zuw5n64d5ce69ctclkcgddp7xj", "520329203976101888"}, - {"evmos1vkw9xr4xf7g7dmwc3ev3vz93frgj9k2g6ucudj", "1868807242637312000"}, - {"evmos1vkx67el2tz9q2wku7aqjfcne3qyxa0mtz0f8v3", "8393068571842228224"}, - {"evmos1vky2jv8dynjuaeyc4tqtt7n9vl9fzna2mxyjfj", "5673050878433571840"}, - {"evmos1vkycfae650rlsrvda2rfrspmkyj9fe0drx7hvl", "1807152128615730688"}, - {"evmos1vl37tzarnrwptcyhy24fajjkurx60q3tx657ha", "46176175875368640512"}, - {"evmos1vl800n88sqa82d72fg484f2tth2h0h4mpxj2lw", "1582676219308273664"}, - {"evmos1vl9k7avevjjav5galu50vqau52vp5w2d4prp2n", "1493820462875176960"}, - {"evmos1vlc6kccxlhfpuf8wr33q53mlxdw8799hd5cwv3", "1383883926590372864"}, - {"evmos1vlddsgquql93r3drq34c77vjskzzhsn5xgt36z", "7057232576422627328"}, - {"evmos1vldkqyz7jmy5ax7vx7jh93y9mny8mjc6yj2ckm", "2167395642734861312"}, - {"evmos1vlj6kk6h8uqsxzsswmw60fu77re35xl62zm9fk", "126664905237040087040"}, - {"evmos1vlkqnx7kgvqr3lg7fvc2nypzqscamaxnqs2s9t", "32242920204399165440"}, - {"evmos1vlmkl5pyjyhk8ln5yygtvpsju8ar4s3wrdg5kp", "3372869123274055680"}, - {"evmos1vlpf2g3fmq5m30zqhg7f2l558kyyl3ee5afswy", "1802608244312797184"}, - {"evmos1vlpzkulfrwret0slsrc5932yanrwagvv3snua0", "1373246965787590400"}, - {"evmos1vlrpvmhv60qy93ufhttmmztdc0rn44x6t3xwpf", "18231438704967311360"}, - {"evmos1vlsepflvr3umprac6ar2ft3pjsmsq4auuqx7ug", "186491514219316736"}, - {"evmos1vltdn64eaua3v6rrf3q4eun9w84hgtl0llsq79", "14112397225168175104"}, - {"evmos1vlu9sav4aps4n6jy2w0ugc794c99t73l0ffaf8", "918268879345675520"}, - {"evmos1vlv24q6zpywyy9t4xxt4z42dsq0lze4xsv6apf", "10922479284373409792"}, - {"evmos1vlwm5ypzpnlus6y6dz8y84lwgdjhfx5v3r7mf4", "2529079939830757376"}, - {"evmos1vlx4ll0xvuaywm74phj6n0yyny8xw2ap5n0k9y", "266730460073164800"}, - {"evmos1vm045ac4ch22lwl62fp4ce42ypenhcx35l0y6a", "4803583117643130880"}, - {"evmos1vm22r5kgq27et8ehj5er309qgmzc6rhgu3mnhy", "9019307359948836864"}, - {"evmos1vm3k59rvmzkmtf4awv7wkf54ymw4300xe4dtty", "7170293469247616000"}, - {"evmos1vm5pcrshjcm4kpw0vcx9mve37pz97v8nt63yqz", "2373623309802135040"}, - {"evmos1vm677ref4yxkpm3chuaeq43gldqsv8s7pmuntv", "905834405731642368"}, - {"evmos1vm78l9tgz5ust7gylsjr0ywyt64a30emp85d4m", "3724452295708377088"}, - {"evmos1vmaevkgu298pseej8z5vp0md0ytsqcrv2rzm26", "1352067422043817984"}, - {"evmos1vmar6kckgverg78gg0xyflraepzh6nh8v359fu", "3618822433382722560"}, - {"evmos1vmf6cxjjhmqvn9975yf44h2uh57ehhrp00wy6j", "5748925755178082304"}, - {"evmos1vmgaf5ypnzm0an9eduh5m53j0crs656v50mlpu", "383428597471064576"}, - {"evmos1vmhhqq003j0ga95xv65e4e076mmg0vzmw3uu4l", "16744177640877826048"}, - {"evmos1vmj068jq8qelsf6jg5jcxe298cnpktt3t3d0ka", "160425936618448896"}, - {"evmos1vmlgfw2nxg3m4hppv7kwpqlcqfuu9w8dgval5h", "766722160868319232"}, - {"evmos1vmmyjhsuy7l5wwfsyxf75hztrl7pffpxgjpuu7", "3528560645934142464"}, - {"evmos1vmmz4dcs5j07ccsgzwnpqpe89u07lm0pvl6549", "99203752660249856"}, - {"evmos1vmrefltp0cjap6lqxadevq5k6khgvtz7q5047d", "145197492737729280"}, - {"evmos1vmuzw5laq4ewvy0dnevvjw77hfkdyjuujsehyt", "385071501295411968"}, - {"evmos1vmws49jgcv7ul9l8yweva54uhqhfr8l64kqmtk", "841791865788160"}, - {"evmos1vmwsppewgqq8l85d5e0pmd3wqjzwtq7568sgnm", "892174935005046272"}, - {"evmos1vmwyllvk7m48ynxgvjwyyzzyzr4efr73dr974m", "857976372463590400"}, - {"evmos1vmzlms7ysf522xfudctx622h0fs0g2p654kgdw", "579693901763487232"}, - {"evmos1vn352jtt6pphjknhm2js7cnlgq4eq4qsmae3tl", "19098247728207659008"}, - {"evmos1vn7xaznmd48ezu9hpp2zzrvvuly7xkzkqt32c4", "78541640549122304"}, - {"evmos1vn9uwznsjflxgq0ecwrsusqq7a5j8aycdj0mz2", "34052587969216774144"}, - {"evmos1vnflpn99e3syzjrtszjxdw5sw004duwt5edpej", "7201662737174773760"}, - {"evmos1vnh397z7x424u7ucvutawle5cen7mlq990rjsj", "1371406996898948864"}, - {"evmos1vnhj7lh4dt3gglrz3zukuulc5kcupk7ax78wqq", "369036961508080384"}, - {"evmos1vnhnafu0kuvd2hxywjf5c353wkqtynwqayv93l", "13888732132805951488"}, - {"evmos1vnkzge6a0w7gp725lu27m4ta8q04k0s6hjdalm", "285837845400276992"}, - {"evmos1vnpcayyzp63q2dfkutcn3syqca2l7z5gre2cny", "154317409467856896"}, - {"evmos1vnq4j8wu7acuapt5aes37h7ghrceema6945glp", "23619387178045759488"}, - {"evmos1vnqs04sqqxegy3t0ydjh5w3t24nd2jgmuw5hjx", "99582079466755584"}, - {"evmos1vnrcjfm8zznrlgcd5lqvye7qgkkhxfnzxahg3q", "108805060758007296"}, - {"evmos1vns0vkwz47pvlj0c2kmdxjnp9q4nk6xfvpwhle", "14077705441636397056"}, - {"evmos1vntxz6k8k2kt4tvpunkzrz83m8ayy7228dddym", "1073063341540268928"}, - {"evmos1vnunecas6n6r2mxt7t3ylr4tndy3ye5yf3g9xz", "5209974490972606464"}, - {"evmos1vnuxej5x9c4vfv2a2a7rw83ltsr4w5fmnvnqh0", "4139323979512580096"}, - {"evmos1vnvkdjfs87mx74g7ps8uygwqraz3ekwjzvurgv", "2307830205510127616"}, - {"evmos1vnwyfrarezymxds0le5huf9ujd63vlguars3aw", "354271879746883584"}, - {"evmos1vnxtmha2nrkhfg0r8cczr3lk5x5aycfkjp6rg3", "35272053271350964224"}, - {"evmos1vnzvgee36tlxsee0lvyzw3y3fp0tymwcpttacn", "446345036721219584"}, - {"evmos1vnzymc56f6sle5n5yr3fjky56ah4jspjdhhvns", "1128455232500307968"}, - {"evmos1vp5kl8t2khve2c9aqj5ccuv8x9e4ah2u98p9ax", "38447235766859776"}, - {"evmos1vp5rf4rk6hyr6kv8kqqaf3u66nx6fryvh4vejj", "2252349952795973632"}, - {"evmos1vp7mxa4sahhce0e5v3paugu47prpgzc7hsmp07", "1173123279959039232"}, - {"evmos1vp7wjyvqasmu668suz4wg2z83yn24xc3rsyqlf", "793222279808512"}, - {"evmos1vpafuffre4ygtexnh68qfx6h7ry23926w0ncnl", "8048733122685927424"}, - {"evmos1vpeng9a3z9fs32axv2y5gt8wpa8z5s2dx6kwm3", "7944600295156002816"}, - {"evmos1vpeqvpaus6dnpar2hzwz0yvncp7gfa2ng985zx", "3026813038270537216"}, - {"evmos1vphs0wj5maf559g37jc4l5kl4v84pq5djzaa2t", "5501480927099811840"}, - {"evmos1vplpa4k32sq05fw6kmt0pudx6yq950qn8kw69z", "51038751913456582656"}, - {"evmos1vppderpaf90h8yszgqyzs5fmak5hradeelpuhq", "2791313223063561216"}, - {"evmos1vppg7ckuahnqw5ky3p5d62m7zqy3rnamp4p48z", "7131566875440659456"}, - {"evmos1vprlsqmqsvqr6nv9refft3yzj6j4s87pfy78mc", "6897682697195259904"}, - {"evmos1vpsur6a7757vfep8g59nhsxfyvsr47fmt6222f", "104825130396529098752"}, - {"evmos1vptd62zexg0m09cf5uqe08jjxj24htwe9ccw7j", "1056837641609558528"}, - {"evmos1vpudhp9mgdrjt359vklyqhe5apzlshzvym0zfv", "1087358672703117824"}, - {"evmos1vpwggx97qen6wnz0q63xy3kshwmpevn8u7y9lt", "2745176788413382656"}, - {"evmos1vpx4vspqesge7qm5y9qjhzw8m5sum66w8634zu", "99457843854410240"}, - {"evmos1vpxyf7m9ttc98xuscaq5y28k4wh8pvucahtxah", "3772551457339244032"}, - {"evmos1vpyan99ag50nmqh245kvga5hezfawvx03xmhq6", "3614208753589239296"}, - {"evmos1vpygpd99agjuxjl4sah6f74yglmq403tdx0df2", "53560977412454694912"}, - {"evmos1vpzc5l5z3d8t3u3f65nwy87kkdfzcc7fwds7d9", "143651802364520448"}, - {"evmos1vpzrkw8wqcdq74yv72xq9kkjktrf0sq8e60u4g", "470137456150880000"}, - {"evmos1vq0unmycurfdwf2jr5mhr988g05vdwpqnllah5", "640931757464080384"}, - {"evmos1vq5e6l7dqr83fljhmr8dq6qynzr3atdkn02j6l", "581251120445511680"}, - {"evmos1vq5pgc9lu28tk00ttdjrue6dvdnjpzwwekyccf", "3975285479570718720"}, - {"evmos1vq5rwt7x338zead6fymyv94xuz7nk4gruve9eg", "2570736568251570176"}, - {"evmos1vqa06jqrq55rjl5t54fzuhwwu5zrfqganrdxag", "4102509460116635648"}, - {"evmos1vqauv7cfjj89vs24zutq60kzjm3mpd8jc3c4ux", "1000344094333926912"}, - {"evmos1vqe3lgsh5qyxqsuzz6anm8yk0caqfcm5k7g60a", "1242929405835913216"}, - {"evmos1vqgq563la8vzeff0s5t5gajut0tcy355j6d7xw", "12105020135216537600"}, - {"evmos1vqkj5uf7eejc5a5cnaxw6x7kz725fea28jyqut", "5520676198188609536"}, - {"evmos1vqkx8s7ze5kntf232303265h50crgdz3qyuv0c", "17073810940794466304"}, - {"evmos1vqmdqj6pdvw8s3nj60yynmmak5xn09pda7sm3s", "9646722263672655872"}, - {"evmos1vqmzjr9yqwrfx6a43m00e6xmqad3lccdrtsaek", "6687831321306314752"}, - {"evmos1vqtcrcgrpp4hqfq78tmxxn77lq3a65dhtkj6ws", "8242455995196404736"}, - {"evmos1vqvgsldysmxla4d6a6lm68amkd8ef3av9ulaak", "16052285068033900544"}, - {"evmos1vqwz5s8rk6l25luj0mlppfz950cp3c3kg8wxmn", "2466600841858101248"}, - {"evmos1vqzlpt8apqzl0325hdcgk7qev8a3eyn3ysa3r8", "1014497902250482688"}, - {"evmos1vqzshfee582el48m0h3aws9dnx5spszhc9fkyk", "4492674386901303296"}, - {"evmos1vr37uyv7naqvkxa6un692g8pn29cwf42j43ghr", "416381023580126208"}, - {"evmos1vr3evpx22q8uellppxx3xgjjutc736audyzxvr", "35826699873975758848"}, - {"evmos1vr3q8pq6mz2e22vsysfhf6zen4phmw5wz4svd3", "441242142587121152"}, - {"evmos1vr5fl6mdlrxs38vee20m9nfmkzf9f8cql04r9r", "40536945407426560"}, - {"evmos1vr5z7kc0q7edjttfacux2lyzyq0tkpnqmsmed0", "5463671534905275392"}, - {"evmos1vrcepfrjjm42yw9wpc7k5vkvcu0n7py977jm3n", "224410469216506624"}, - {"evmos1vrdq26mlutgrym0fr50kkyhr7anzas5jy5mr7w", "355445511462176768"}, - {"evmos1vrdqqefcta7phnn8k0kpz7deghp9a9x804dwwf", "9089721970219253760"}, - {"evmos1vrecuz8qagxd57jfl95ltd4hla8axvhktms7uh", "1161773685202512384"}, - {"evmos1vrgakewdfegwwyf8srppwvsf3peaylfpcxmsxz", "5320946844292370432"}, - {"evmos1vrh6kz9as0xc58ttn9dgssp2qa7dcpqjeqkf0a", "471770324192862976"}, - {"evmos1vrhlpvpyjkpxdqcrrkfep4vd2rcsdu9q8d3pcn", "897524925715524608"}, - {"evmos1vrht8whzdk7gx35rnrz3xun9ry9yn0l2crctxy", "65746912429268647936"}, - {"evmos1vrj9q2lzkc376aqmuk9cd26tfs9ydhtda33r7x", "74598491377612800"}, - {"evmos1vrufswsafy640l0d46rpk4wqyufa88m6yemmel", "1522405045884387328"}, - {"evmos1vruuskpt52rwkpm0wqxmkymkxu00waveecwfnx", "950604092796899328"}, - {"evmos1vrxpk4yfx4p990yuksxe02t4vlhkzmf2tf5yfe", "42512926597889851392"}, - {"evmos1vrycjsxlv900ts2nd74ec5wpgalh74l4waz308", "9900972193791377408"}, - {"evmos1vs0dhl3avtgqyuj5qjjuth5hyy0ct4jwchhwt8", "1008276680827446784"}, - {"evmos1vs3es0j6rn5y36ya2vdy3u9wkdhmp5paccakce", "21551527219624980480"}, - {"evmos1vs695yuyn5shvhrpzhvxk8v8fz7t5fstsnjw42", "14657635354599450624"}, - {"evmos1vs8gcmzcnpk8cyrs7nzqxxk32w2yqhmx9zanzk", "5783783144306122752"}, - {"evmos1vs9qde7jwujuu8ph54epcw4c4wphhkkua4mzyj", "324261367102941696"}, - {"evmos1vsej263r433tppnm62ghn9q0seug8hr39edvwg", "12094162336620740608"}, - {"evmos1vsez7t34vgx4e0f7y0t0eqpexfj57nqv826zuf", "3887546711674044416"}, - {"evmos1vsg86fxaa3t7xspkdl25p8wfnxh28yzhpzf33a", "713770744413620224"}, - {"evmos1vsgkj32s6vjjn4k8596and48x6zahatrwcxn42", "384223010796675328"}, - {"evmos1vsguqv4gt5jsfl2fure4qqutu0ynxm0mqlumcc", "1218255319813823488"}, - {"evmos1vsjmzmeagn6ra3agntdpfcy72a0ck5pxrfz843", "47629106276691140608"}, - {"evmos1vsjrn0yxxpl9xjv8wkwk54j2r5ddscg07ezkxy", "809246533753052672"}, - {"evmos1vsk90n3k59aafsmsagtf7x25xns9y786hstqnt", "74013449386969120768"}, - {"evmos1vspue6yalfahctckyek943ennts073kxeh88xu", "1494240316436193536"}, - {"evmos1vss0l4tgulkwf8jw8wp8ke2rj0vnp03zzadppj", "3048278468563886080"}, - {"evmos1vsspxue3wsk0dp2lz8fyk22q6jvpm995mjtauz", "4500466225573872640"}, - {"evmos1vstgs6d0kfj6ax0884qad4egl32qm0svtcdal6", "3211900152438931456"}, - {"evmos1vt05v8cwpvznlruj8kjy9tk7jruf75qlxttqp5", "7836957823713767424"}, - {"evmos1vt0a84gg04kz35gft0gumrfrql53q8qf3v4yxz", "3300061024483254272"}, - {"evmos1vt0c4qyl2fyxz5tk8mcfpymajszfxd2lwk6adv", "5137731737030350848"}, - {"evmos1vt0qzqdje39qel4e5mtc9kjakwlxyvc67850rs", "2947357976812365824"}, - {"evmos1vt4l5jpkx49pt7yf4w0c9267nqdl8g2qklyx89", "63953286175262867456"}, - {"evmos1vt4s8csaaaee7m9d64vzke9flu2c8lvzt6pfvp", "4183124505904828416"}, - {"evmos1vt55g9wv4sks4fz3w0wlrkylyma3j5d3p992tn", "1414924572749717504"}, - {"evmos1vt9c6ksw3jdccs4zu9jc23zxufn37naaulpqvq", "10017318225044058112"}, - {"evmos1vtd6a5s8atgr5kc9fd65tkdn7xj3lvnwjjse3p", "773873523761362432"}, - {"evmos1vthpkykxv7dt6xjgu8nau8vfjet94da3n0sf3t", "685943150408851968"}, - {"evmos1vtkqp9m9yvnywnhpslgxwmrv57l0wxzj4k8fcq", "464440777509521664"}, - {"evmos1vtlcsl36m5dm4gyuufawlelnvgwfjkl3j7puty", "433409641258968064"}, - {"evmos1vtqe3huppswhq33yxp33m24xqdc5k9rmr3puuw", "227189402743209984"}, - {"evmos1vtqs0mch9l8kerka68ekepfdcvfsxl6ehez2ax", "1347852280898986496"}, - {"evmos1vtqsxqgcs4u4zsg4ykvlyay5szf5lqelc647ue", "1429913587453222912"}, - {"evmos1vtraagmjwu6kxlx3ux0rrmt5wghuam5dwuys48", "793875933538831104"}, - {"evmos1vtrak6fppjmjlc0cjekgwyc7ns9t7l885cmmhj", "177886467164763648"}, - {"evmos1vtse7zh0dkkskjl6ya8w0l36kuc806lkragz5d", "1527053464502137344"}, - {"evmos1vty33kaeemppw4dahd75t8p52hghlztcx4j77t", "27115197103856590848"}, - {"evmos1vu2fvvfv03s9w58wmyzx7f2mce8wzfphdktxsf", "39636977553519935488"}, - {"evmos1vu2pl9p3kkct64uc0tfmnanjrmnv3yynx2v9me", "300258327644944384"}, - {"evmos1vu3syqp40adgku39ny3j8xsj602g0n3pfxl98q", "1934467584694329344"}, - {"evmos1vu3tfy3w9cugyz4el2uq5zxyre958pz77tpgmy", "384221037130278144"}, - {"evmos1vu40gwpr694ccx8ddgfr97sj39tlcvwdzhc2fk", "5755397328711664640"}, - {"evmos1vu4rusldun6tjse2s803kevq5e68p43p0esemn", "1162687702620203776"}, - {"evmos1vu676x93gg3zr6rfqd9c28wev05j4zjxge5t5d", "1624670913456643072"}, - {"evmos1vu9m2k4l3gelms79apwjutf7g0ckmsadgzxann", "2180403057520254464"}, - {"evmos1vufd5dvk4cq0f3za6duetrf62adudrf8l6n6pw", "34948283477533925376"}, - {"evmos1vuglhs6qtdrljln4jutwrh4pu8xy5ygl7eemh0", "22176531671224303616"}, - {"evmos1vuhr49cqps8texfmnglcrnu0vhtnumw8qfqh3k", "351040115157855744"}, - {"evmos1vuskc5959fnehn8zmaqcpnyvxmvhpn29lls8ke", "113455910246911148032"}, - {"evmos1vusqwu6la0xh9cn52zfhyyhau05yjepfa2mfvv", "784175625325071872"}, - {"evmos1vut5vxn9cwgzhzjefqn235yxvw7unldmq4v0vd", "16284718174563663872"}, - {"evmos1vuvjq0qa6dm76qex3tuk6vld0ckzfgvav2m3ln", "2372444927663630336"}, - {"evmos1vuy83jvctcg006nu2adktmaec4jzervrjhut0g", "2655965412967696384"}, - {"evmos1vv0axk278tu9lx6hhwvdkmct60pylexj4yle5t", "403255689449200640"}, - {"evmos1vv0s6ss8qx9ctpy6xg3gyh2gjj9rkvw40v8y0v", "3585580695516479488"}, - {"evmos1vv3lgplangyxv9gd37tzqdwvwzfz3t0sr99qeq", "2850312017461185536"}, - {"evmos1vv8078r440208rj50m4zg8z054sl02dwe0zx8q", "14776957410137309184"}, - {"evmos1vvc2zm2nfd3qsvwp5fk928dut7yk56fw96xnwf", "114870268235311431680"}, - {"evmos1vvhrjmlnkev8uu3w8vg5d3a78htz0nguxs262d", "299147623538939392"}, - {"evmos1vvlkaasl77pn257uq4srqps4q2kxy05q3xm20y", "2804384902867717120"}, - {"evmos1vvple6gypll0hag4xjjg5eza4a5d57zevf5e0t", "416161275311731968"}, - {"evmos1vvpnvhvy8cmggkvvvlz8tasqzm5pfqmg0jwqp2", "5103033909215047680"}, - {"evmos1vvrfex8n4j9xh6dmzkzqrs6yldgcvxrx02zv2t", "103631314442798080"}, - {"evmos1vvtt5yma9v2hvtkxz4zuqgmtrp8um5tnnymwrk", "110321644273777664"}, - {"evmos1vvvq6wnadqyk2wfeztlqzeajcj93u94l7svk6y", "3743350962923970560"}, - {"evmos1vvwyv600glwrqxxyxm7cy9rnr88m85xf57ul0j", "578981922635761664"}, - {"evmos1vw0eq25ehcc0hew6g8k9nv8xszyzswwwd90uzc", "11323799402040449024"}, - {"evmos1vw0etgmqp7dfagmrvqu6fpuqq2ypd5td7pylv3", "476744203466012672"}, - {"evmos1vw0rmzvdculphvysryq2snn0nelv2pe9kpkuy0", "2170933264127631360"}, - {"evmos1vw2knxvl65f8m3znwtn2ynfkyl23kgremcgata", "1722756639835531264"}, - {"evmos1vw83snas0myus82nha44pg8f5mtmy3yqcqhdt7", "810305837715421184"}, - {"evmos1vwa29hz4j77vujam7c8j0yqawfkrgsmvgyq4c7", "26886125514707200"}, - {"evmos1vwah970shv4wkhqnhl3ua0h3czcj4gw3azkmfj", "11364431395550732288"}, - {"evmos1vwctvtf6yk7hcjsxu7jg9kanls9fkqe4yvj2kz", "2189722245293688576"}, - {"evmos1vwen33gc5nk533z83p79lzf6vp8edpywyhhrq3", "298829822110152448"}, - {"evmos1vwfls69uknkpyagj5recn24prn3gsrdffm96rs", "2187084438987644928"}, - {"evmos1vwjgaz6kzurh3esu37yep3j099vqgt3dvtjh99", "235700152735456256"}, - {"evmos1vwkuurn0ehf9pt2m0mztchsf7wdc4umnk9yywx", "166556253827956736"}, - {"evmos1vwp4xe5nwqtr03aumppexthsvgujgekpw9e9rs", "1652054242464227328"}, - {"evmos1vwqe467fm8v96s0acursgven44yzcwqewef94x", "3325040628564819968"}, - {"evmos1vwqwy7vvejqdl3q835ge9ugry0xhdtakp3yjfn", "545524569939472384"}, - {"evmos1vwrdjc6waf6vjzuzqmgn987cy87875w3sx9qhy", "369001079774574080"}, - {"evmos1vwrx2mgh8fra9jtu2059dekfzwa6jd98xpdy7l", "5850259132169561088"}, - {"evmos1vwv22w7wux2455g8znr8s4sw0r4j79zyml6y4l", "1419640128982474752"}, - {"evmos1vwvkg37grxg83mppy28zw6g5cd02gxgj963y9t", "5573985950337230848"}, - {"evmos1vwwl5ck99y2cuds7f4krg34g49w4mwnt847wnl", "41040661274408704"}, - {"evmos1vwz7zvw60qxurvc8fnzqn24asw4axfk9q77mrx", "384262630968080896"}, - {"evmos1vx2duaaup2qfnep6kzlf58m8w5zk5meyuqm687", "1367473895425073152"}, - {"evmos1vx2f88y29j6q02s9ht3cwr5my7a6mj94ernne9", "815851472576761856"}, - {"evmos1vx39pfdhrly8sfwamxshvjxlh2wnrvhp8nrgxv", "1132717840657895424"}, - {"evmos1vx4hr40865ykcuawf6tnv6efxzuqjdzx3kgqxa", "2389106368408342528"}, - {"evmos1vx9q2f3572mzlydswjz0jvfx0dquyz4qvmunty", "37319484490643456"}, - {"evmos1vxa3y4nkl2zs2m6x294zvqpa3t9t583gd5whgj", "685904339309094400"}, - {"evmos1vxh7kmkvgt89dlpuj2qkpu43s9pxkdhkmestjg", "940542827416425984"}, - {"evmos1vxhz8694slyqkkvt0fdxxjnxhn0s6exxgcs6d3", "7206079818829266944"}, - {"evmos1vxj5pgujjjnw06azwqlmkez8wp85dqu3vycj7a", "394866010835594752"}, - {"evmos1vxptq8fpyz4rva5f0utfvz2t3c4y2fmp9jnpdr", "703211327186675200"}, - {"evmos1vxvz9tkw83zq66vsgz90ylx2gyvvzrkn6wfzzc", "3462673047737835520"}, - {"evmos1vxw5zmz4vkpy0exsx2dk7lngqrhgeq00mele9s", "2990541257734226944"}, - {"evmos1vxx5d9ajux7pdcka0xhp5mcrng2jpykmd5lrul", "14725040612202295296"}, - {"evmos1vxyjejr069g65dg93lyeywrg7apecyr3hgrk6v", "237148193550742016"}, - {"evmos1vxyysl35wc6cx0zlr87fxv84jwj5rfv8qgmyad", "13331383492061134848"}, - {"evmos1vy35gsmsdj8vadn093tkuzy2pfzvu9egkdwvul", "3858644378786955264"}, - {"evmos1vy5g52ynfdrjmvw68xqdjy95qx8aefg4s0q6cy", "1326708342128603392"}, - {"evmos1vy7qmlpamzcemfq4flld5jcxqgjtrmjd5st3cg", "319685293125740544"}, - {"evmos1vy9326dngvffxwg7as9mfwjaxn6tmn9sucs3x9", "2894490149947572224"}, - {"evmos1vyeeytsjs0azc8y2r09umewf7r4aqrpuzt3r84", "5189920964391000064"}, - {"evmos1vyhfe46xdr84avmzjgu0qfwnzpldq9nzxwl0vt", "10524853402402242560"}, - {"evmos1vyksgj7k8dqtj9u6g77hz00d76kx7356zdxqse", "1465284340937127680"}, - {"evmos1vyl2gfw700eu2c8ry7rwvuakqg3urzm3hlksjk", "2971852484134123008"}, - {"evmos1vyp6vd6znyn6rvx3kme9gl0yp6030s73aksg3e", "40002077828817289216"}, - {"evmos1vypkptx2ksdhspglnef6xgzvc626lleh4v8fet", "1579682742326539776"}, - {"evmos1vysks8zk3vk5kua996ledz583nzl5x0vsda0zr", "1489124577405550592"}, - {"evmos1vytzghm565jgm5uwgx689cp6wl5mm35qzs3tdx", "1097691385288022016"}, - {"evmos1vyup8m6vug2ay6jkra6uan6atgtuzu4x3hsmhv", "889001180173350528"}, - {"evmos1vyvemlu8alzzuash8f9a9e0gz25hd35us946sy", "476634432941624320"}, - {"evmos1vyw92dsu2rcjc0y4dylvn5ds9uwu357684xtkz", "495076177578308096"}, - {"evmos1vz3y7jhr3vyn5n8ttwzvcxujsswk3dknpflry2", "465031902022800896"}, - {"evmos1vz4dcujkqknnrlnx4h7k992a768q743nmhf5qn", "188369699958243328"}, - {"evmos1vz4p0nqqc97u90jqt8n8yhqzf6c49x0pq4njzm", "7254811571478822912"}, - {"evmos1vz4yv6lqptxr0hz78wyl72vnxxg8muz9huy3ul", "6764726087525916672"}, - {"evmos1vz6fxs42sajus6gqcwzgw69jmeqdajkf5lfkxn", "2525511557801451520"}, - {"evmos1vz85z97kpx6kytg2j9ygjjfjwepcckj57rn7zn", "3360142207583256576"}, - {"evmos1vz93pdwt292pxftyu82ptvgkmmmx5wtqgyp0sw", "29760593138067357696"}, - {"evmos1vza3005r99zwvjxf0x4hdaqfqtdj047la0th77", "212114982579095552"}, - {"evmos1vzaemu84j0z5r6vkcnkjw53l02zlqrrujepjy7", "1432462739662384640"}, - {"evmos1vzdgr7cragdmpr6tc44vtctjc6hgtq7ln9c5a6", "1164434961020776704"}, - {"evmos1vzj49emnr3ne0vjvj4guadtxz5c5anqzlnun9g", "161109605508062208"}, - {"evmos1vzlzj8uxm952shunl6y5a34m9m5yfw4xvvnv55", "2183504916822237184"}, - {"evmos1vzmua4ldmy563ly6zgg6456tvqsrz80l95utj0", "1372319738672119808"}, - {"evmos1vzpkjkr09lzclyh8sh8q6qzxnspxk3cedx3nls", "3640051006094311424"}, - {"evmos1vzprd5lpnues2el2phyl0tyjlhdu2j5h3rv7c7", "31220113267203506176"}, - {"evmos1vzqulxwr2rk3w8juj9mkaqau72nrlmfakcsnpm", "6904909695584032768"}, - {"evmos1vzrmn5g8vfm78fnpsnfn3c3tqhfzz80uax6yw9", "5744276844945162240"}, - {"evmos1vzsmdmj07yl2rfwfa4v4yx8p68c3ep9llvrncz", "5143006107833395200"}, - {"evmos1vztywe4mgu0qcywuwc73ucpa9t297e67xxdmac", "24932301527108169728"}, - {"evmos1w0290khdat2zph50ra9f9zdjh92f8yxln4xaud", "5392322735393984512"}, - {"evmos1w04n3jzznvgac29af64dl4uwpzm7p2theyry83", "4595633859329684480"}, - {"evmos1w05fsj76trvjkktq347artmwhdtqv0625y3r6v", "16749158078096179200"}, - {"evmos1w07fh5z97nelszu9ha2wdqcl80z6r865ppd3w7", "10386169174694596608"}, - {"evmos1w08mah0vza484t090u8dtfxwl9wash72c9dum0", "3193522514132982784"}, - {"evmos1w0aeeckhdludjh4nfqu5z985k7gzr4kyc5q9mt", "388288437360232960"}, - {"evmos1w0ayrsqswllgtm24wyjcfrzsnvqnyuhq8seqvs", "53356597518465280"}, - {"evmos1w0c8dwv94jrkje6mfxprua2js6qasaqskrxeu0", "11692441302756839424"}, - {"evmos1w0djkwnn9uxas7u3vjty5p929dt5hasxs443kh", "21447455979910144000"}, - {"evmos1w0ewqncy0yc7skmzunex22c4vxvsqrs5rnf5qc", "610383332522563584"}, - {"evmos1w0gn2ce0hpg5a3nwedpard3ewmk2q56pw3tpe0", "7740516499344519168"}, - {"evmos1w0k33lydxzqxmjq747mg4tydwexzsd6xzy57jg", "809551903133956096"}, - {"evmos1w0kejapjs5y92f03sklse8zseyt3p8pzrc9ytk", "7514127520146612224"}, - {"evmos1w0kpscaqffz5chq2tt8jpfzgn627f07gm2rffl", "1498353188358676480"}, - {"evmos1w0lkxthgaudrvt2qd30u8rsd986eyxa7d2e65u", "2353789932211032064"}, - {"evmos1w0m67tnu7mc9rwy7lspqlx3j4rxtmvxxzpkhpw", "917908843652098048"}, - {"evmos1w0t0ere8dh47vcth04wqwse0watcn7vfyzknzr", "3985452805434175488"}, - {"evmos1w0tcycs87slk7k8laa4um7cnaxe8h3v43gzhf9", "227538363549593600"}, - {"evmos1w20svxy3n35l44vm6xkgxs5t3arjc6my228pe5", "65573527535699456"}, - {"evmos1w23756etxzhxtt98g0dxg99srn70mweq6vvpuy", "100998285798408960"}, - {"evmos1w239t4h8gu9xj4gdsm26py5sfeq2avsw6lwn7q", "27987653012542976"}, - {"evmos1w25a0petghad97spvul98d0dx0kmwedu8x4sjk", "5113432448355366912"}, - {"evmos1w29a265kthpmntd8g5cpctmnzkva9lsn6m0em5", "15334300400029679616"}, - {"evmos1w2azsu6s63hr4qa45ajag0n3snrn2apcl549cs", "2194208975024046080"}, - {"evmos1w2j4twyg2pm9arvkwnk0tx8mkdemne9cg2sxuu", "2380691339739537408"}, - {"evmos1w2l5ayl3gsf5xfqcsexkxw25eycn9e084ku89r", "392454827809865984"}, - {"evmos1w2murth83p5qkdsjahxwp09y69ey3hzvv6ymrt", "409278059707663872"}, - {"evmos1w2nx0qrvxp93uv4qtqjp6hp7y35cyzpl06l7dj", "1681284243520888832"}, - {"evmos1w2qgdghwm77zvfef04tddtpp4qpytlwufvv6d7", "10372577066520576000"}, - {"evmos1w2qj29g4ckhwv0xuak3wnu5vqc6q8auvks927j", "15891424045703370752"}, - {"evmos1w2u8dtfqzgyafec0yd50v27tnyhu3mr877jy5u", "4861773846677309440"}, - {"evmos1w2x58j43tqrst8g2854kjt0f8fgrsa5apsxsl5", "3251404417517920256"}, - {"evmos1w2ymmaflw5x82yzltalrzj6ls5gm0nyramxq95", "385601551757446656"}, - {"evmos1w30al989z9gc04xkpfljcjl7p00a9gj4hz5jvd", "98398377070441529344"}, - {"evmos1w329n9gqx69qhrup6fntzk0f5vxqcnqqwz2ut9", "465123202048521728"}, - {"evmos1w32dqy30xhumskyy849r4das4lm98cua3dmrmw", "29775520695647567872"}, - {"evmos1w33sxuqe0dxy09dlammxghhpf7x03xtad2kp9w", "1148833635263320064"}, - {"evmos1w36xskxt8qnf3kns8k0l30444lfdgakayhrguk", "1479869063276102400"}, - {"evmos1w38sm53ywjxjfupa8dtujp4vdrlf592guu5ch5", "340515984877900544"}, - {"evmos1w3a6u8jmq57vdyy0xxzc0ghrzaejuphz9jzkgy", "283785445078093824"}, - {"evmos1w3clhrda8pr0m6v72nphu9alrh67qqcm9h26wh", "19202757430384410624"}, - {"evmos1w3f64cfqwpck97ssm3pawa547wyvf8392ccprf", "466137381526607872"}, - {"evmos1w3fw04fsq7xm663w6egq004qpfxkpufcpzjka0", "607311021123174400"}, - {"evmos1w3g3thdm9vqq80n0scvd34yad38nqhd0aye9pv", "19989025563046760448"}, - {"evmos1w3h82cy5nv5xnzv0ax8wdwktlrj8jxqnds6knj", "5665561395093921792"}, - {"evmos1w3hzv6rf3yzs94p7dv45gpelf6hlrarnwfy8q3", "563986387083798016"}, - {"evmos1w3j7el6836cvvg88nu6n5gl8sqkzjffv9lka2r", "1051585903231419392"}, - {"evmos1w3m47vguq5jmhrga6zmsfsta59zdfez8thrvmh", "9387172865728905216"}, - {"evmos1w3qttyxvsqlt6rl8h8ql5h9xayhgegpdr86830", "6115944039575797760"}, - {"evmos1w3r86fg8hmvfxn76pek4g84kcutdl35cah6gxw", "4568103213551507456"}, - {"evmos1w3vh5ge7gqav9ayvgrwkdl0g6gkkvd8j57jtx8", "13212998971449016320"}, - {"evmos1w3xayz5tzn2zsuwfqrqdvtdunk4pfcfhwkgpw6", "5878650320819441664"}, - {"evmos1w3ykrqgyczsnjmjnmxmhxyhxelew3x4v5tst7y", "3218847372744590336"}, - {"evmos1w3z70sdukamvy7wslq8aex2n68maahjlrjh6xu", "174145143030167764992"}, - {"evmos1w4207k0jaumn3t06nfpf2vjkq6zlumwnzz4vdx", "2068993870586522112"}, - {"evmos1w44jxn5uza2c6t22schhhd4m370t7wqjzdvqtn", "1951247796603702784"}, - {"evmos1w46f423eg3yrled568nss0e360awwc2985kvce", "4074121548496488960"}, - {"evmos1w494sfuwpkwqvpaq9u6pavh42fp2dyvh56whpm", "410065755672369408"}, - {"evmos1w4c6zmu0nay3wlhe5v23w8m0fhk7wl7qs7n7fx", "28097128928782835712"}, - {"evmos1w4h7zd6qys2gvdvmdvtw0un5pxy647hhfm6syc", "1730741922623074304"}, - {"evmos1w4jrc0za3cypyrpyd3aw8g83dtke7gkg383ajp", "9063849229792735232"}, - {"evmos1w4kvjh8t594delyznady24ylr9mdcdk86rutkh", "1073311002883716096"}, - {"evmos1w4lttd6txpx8kv703u8qje7fgl44e895t9wxg5", "1838231504702900736"}, - {"evmos1w4lzk764wwr95kp6w7wmd9dmqrae3nr9ffdzeg", "5136637231177326592"}, - {"evmos1w4ncajgq28wn86hl9m8dh33h0x0l9xh5keaa8c", "1442974942665049088"}, - {"evmos1w4nls4stavp4eysp3d755d3y3qe0p4ms2f66cr", "7869481345174634496"}, - {"evmos1w4pvp0qdqvacx36gqldhmznzpf0rqwvwxpaq2m", "1485887132666355712"}, - {"evmos1w4q82r84tvlf2yj7uuq9pr049yvexu8w8rajaa", "6527566727264780288"}, - {"evmos1w4t3ht4hk3fwulhjr7s5e2w3y36j3flry70unm", "6060846399838748672"}, - {"evmos1w4vdqpm0hnaj4eye3hsmjftj2s93zgy32kx9n5", "3782884094892399616"}, - {"evmos1w4w8v7avxj9heqjead24w88rj3350em3mj607j", "2429953316238656000"}, - {"evmos1w4we0ezhz3d3kykekdx7aay3yndxlvysqwtpws", "18839798306490167296"}, - {"evmos1w4y5v0ms9quwlfyt2mf0r8qjanj5mdhgmc0tkz", "2824430435482456064"}, - {"evmos1w538lsymmpm28mz3vckpwt6wan8s2whqlfdp2l", "18232510839510687744"}, - {"evmos1w53md4trets6sqqa5v99a240gajsqln2juf9f8", "384159683907087104"}, - {"evmos1w54pn56g8xghpata8wd7s85z8hqtvvdzz9577e", "14257683968301989888"}, - {"evmos1w552dp3v2fma7q3y02pudxxy3fh8s8s4sgavn4", "1096584355992790016"}, - {"evmos1w583th0zs25ldcgf3qpwz32ddvk39ufus9h4mf", "3356547987156113408"}, - {"evmos1w5a42vl3q9lnpfxchhrl0puynjpd2jutfz4u5e", "18328336053587861504"}, - {"evmos1w5d3t0ptul9vdr95uq4nak8k5rjh7keef5fuke", "876458428359329280"}, - {"evmos1w5eu8a65xj0hg8uwn6h4p6hhna6mateaqhy0rr", "1203820911417813504"}, - {"evmos1w5hdr8kplm674zr3yhfecmrcagchgzwlguf62y", "996196965857376768"}, - {"evmos1w5jww2sd66nlpanvkh7kwgw035p3hwukj4u73q", "17806586467356016640"}, - {"evmos1w5mshcewsk242pl0gmv9rjjn0k2urw7rwya8sf", "2412222283349534208"}, - {"evmos1w5mwlmpg72xlzk2kdzwmhj25htrlhu6afnj8c4", "749195043046748160"}, - {"evmos1w5p07sp2zfcmt56ngk47mcncw3yl0enht2xv4r", "757640239395090688"}, - {"evmos1w5p27s60t8jwrh7nw8s4ayvrawm9qxkqjq7s6d", "216184632969169920"}, - {"evmos1w5pe2qvs3rwrg3yt9yr9nq0r6yjs5tv2mvppeq", "742610031986704640"}, - {"evmos1w5tjwtjytk9kxhwgzwwknjqh2hk5dqerxduvag", "384250708673831168"}, - {"evmos1w5tlflgmh00xypfkqgwnag30kssnq2ja8zsham", "972767968727598592"}, - {"evmos1w5xu7m2s8kayz9kktfcszf77hjxpr8ksyfag2x", "12871859588445810688"}, - {"evmos1w60udns7uefd54n995x58u8ssveuh6zxgttf95", "7807104531270033408"}, - {"evmos1w65cm4yvamhgy6djdtfrfu92urkqwd89uw7g6n", "190611242042530816"}, - {"evmos1w65dy6mpf9dy4rmquz97swgjr99gyzju6vddr4", "18501438021880717312"}, - {"evmos1w66pgmt9082w6el2nlrk2zgdfpa6qsc066jpgw", "26190896321989083136"}, - {"evmos1w66twgccpkm8mn4an5mk7myz6qgvx5x2ka9afv", "4000935013998592"}, - {"evmos1w69uqdmuddmkzax29thgllhjl5e4l5durhvn3c", "7839154046464753664"}, - {"evmos1w6d0gwycehka294du5hulphjpsphfr5nvpn34l", "313096208985819136"}, - {"evmos1w6gzgk4qdf2vz23x0zszfml56jt4679pt3wv4f", "1125365575322958848"}, - {"evmos1w6n95x5v7m03gpge7xesn0kh6pmqz9nmdzzhvf", "2130684289156586496"}, - {"evmos1w6na2ugjynjfzngfudagm2lwdnjq2hc9q6kxyp", "1108990300616615040"}, - {"evmos1w6nd9us7l4q4sy3xadqg7v4h28gnam5w7q3d9l", "2641277437919608832"}, - {"evmos1w6ntpglyzm77jl8xy7vntqkfr2wqq0c3e979cs", "1344424181643935744"}, - {"evmos1w6p6mwnnwqhjlqvkewe9surpxwz0u860xzwuf2", "16175521737749786624"}, - {"evmos1w6puezezajyklhe92mwaxlu06y044l9qc7qf7s", "229358164367529728"}, - {"evmos1w6r035whvh8sfftgnccd52ttsfg69l5xcn3m84", "76756732707764480"}, - {"evmos1w6rwfluwzgaf0yaw2dnqept3ugdgmchnf3ts3j", "14002772807037523968"}, - {"evmos1w6s3dq2x49yn6dma907m0x8em7g9pmtga0g79w", "35825248658439127040"}, - {"evmos1w6s7u6ydt946plrzz3aq9xxljau5xet2akvdfj", "317814288382736384"}, - {"evmos1w6sycnt2mfj2knwwskukerak6ljlplh72fgm6h", "10438996104900245504"}, - {"evmos1w6th29ayma5gywlmvm7v30rcf6d9262rdvjlp6", "2736166368037164544"}, - {"evmos1w6ttc7me0efcdqw4ygegdr5g9mlqusfa2z40zj", "2663470880954297856"}, - {"evmos1w6xg0ll35nf0gy3slnvu9zl27sht4w4eyahx2z", "4283611366554812416"}, - {"evmos1w70aq03n3296y2nf5dxk8scjzmf8mgf84wzas4", "10137405582496620544"}, - {"evmos1w75s2smmr8as22g92v3xc7vcn94gjnrclpxn5z", "10168848153994641408"}, - {"evmos1w76dhtqf2m55l83sucmxfunevy877psjshg8zt", "2150983319936138496"}, - {"evmos1w78e6r476s6ma8cgxhmmlr0lyvslh75qtyhvca", "4527939626133088256"}, - {"evmos1w799w2fg5wq3m76mzvgvyhqpkgtxqffvs2wqpq", "1147034643865961472"}, - {"evmos1w7ak6pvmj2rjcvcemqavfm3xaxra73mhay9xsj", "195603478685885440"}, - {"evmos1w7cmn857jd4uunjsnqmyxvktq6t7v0mjcwtkks", "11756611459565162496"}, - {"evmos1w7f7kl7vp4tdys84fj94378s92c25p38mrnn9j", "820275409763825152"}, - {"evmos1w7lvu0n38yv7d5zfa8slkhkwnvkhz845tt3c4z", "37368752561143431168"}, - {"evmos1w7nevuvxlq77sx0s3ufw9ql49q8ejkgfxx7tp9", "105826399065664768"}, - {"evmos1w7qwse5ea9qj2ny0fkdhavy07l5kh0ssugcek6", "312286101749374124032"}, - {"evmos1w7tgnracvvy4dxt25ajmge2nudekc86qpjla6u", "4945434106579369984"}, - {"evmos1w7v0m8ln7ysqrvv8xxyltmpd77uwx3mxkwp2p4", "2857490014791417856"}, - {"evmos1w7vp632ea068xcshk2hxvmxgw6jfs2pxht0zzw", "8399903538488665088"}, - {"evmos1w7ye0rxxvqzu74hccc69dem9frdfcnru2jvkq6", "48687263586993389568"}, - {"evmos1w7yjjlc3gk2nreuknxq8alk553um9a8v3l0ulx", "14695935276043632640"}, - {"evmos1w7zse7pwsed2x9vxwvn8u23pmpkr7nwuvgsgsv", "1449953057593835520"}, - {"evmos1w826mcnaqfkh4zv077hutg0yq9ua28afev57r5", "95404827921324032"}, - {"evmos1w84884rr7xrtxhfuu22m72su5pkfewdn4guul9", "4026023608108613632"}, - {"evmos1w86yq06tyl278u7yggfwp6m9dggssfqa2kxwzs", "314415751563009280"}, - {"evmos1w879a4u06vc0gxqkuven0nrvdhqmmdjhzrd0sp", "18247123431719028736"}, - {"evmos1w87ntcj5jmwkg6keuf62dqs695xveeldxcrynx", "758291120194463744"}, - {"evmos1w889j5hu7flhmv6nx54ygjn8gczs68muldfxl4", "11471539427901624320"}, - {"evmos1w88eqztgaddfxwjdczevkeca2xzt20c045jg5t", "948788120695689216"}, - {"evmos1w89784je7nxsv4d03xjr6ckw07ljv0xeppkq2q", "23781874445187072"}, - {"evmos1w89t7326mgy9va4yhf3y0e3lhwzxtwcht5p5zm", "61437968575290368"}, - {"evmos1w8c4vn6n4pplce9ycj3us6a7gvrs665eaw496h", "78274517362768896"}, - {"evmos1w8eg2c5e9amc4a79qgdfq8f9eskj2s5hzf669q", "13029027415172620288"}, - {"evmos1w8mqemxmvzl9askss84urlt6h2mn5qwkkc9zps", "4056099392916723200"}, - {"evmos1w8nd5weg7naf08j4hvg533hrdrxejxq358rppl", "1537585031213899776"}, - {"evmos1w8qy9xk8ev339p6smff7xc6c9p92hrkzwue28c", "305373933896157184"}, - {"evmos1w8rgad8fy75387jmaup52hgzf7luexjgfyjzn0", "867553264944283648"}, - {"evmos1w8rtkcnxxhpmuqw0u4mzueyepmc5mm2pgz0jjx", "3225532631912448"}, - {"evmos1w8vw3v4qpxyxn4s8jw327ap7g9x6y26x9u7ykc", "31063877936249294848"}, - {"evmos1w92t9y3l23z85za0356rltn0j5wc5w6ffavuqf", "1713687971297531392"}, - {"evmos1w9cg36ywa32r7g60nvptr9gk5jgzsvwkeygmd8", "1939222806905300736"}, - {"evmos1w9d0ygphzqwrcg0lpv0w4qmrhsra9tj2v45qdf", "1648379781751580928"}, - {"evmos1w9ers43vvgqa6y87uar0uzss7q9uz5f7qjjpz2", "7007644676162598912"}, - {"evmos1w9frnn7x9mmxqnwshy2tswsl5wflsutmy82rwz", "1104529822032648320"}, - {"evmos1w9hy68yy9vux6fdz0wu0w4hj8puqktgdhv9dsq", "3400336990577988608"}, - {"evmos1w9kmvrac0tj9nrv27pwdzg8gx2s67ym78l5jh2", "4061479047099047936"}, - {"evmos1w9lmllk8gvmsjzk0dpdvdruajztwgxqfahzhur", "1082376301321149440"}, - {"evmos1w9mm8whpc83xwhaf7lvdcz86grjsamfr6xj488", "331063430998207488"}, - {"evmos1w9pdj82e07xhnvrzlahdp5mpzfacl2tc23v53w", "75167074740789968896"}, - {"evmos1w9pjavtaw4aypsd6y0ww7mgjlthp8mulv2s25s", "382034628595041024"}, - {"evmos1w9pnfs0qycwnmwq3vl7uj3ztwzkwegmsu8zwxu", "398996750163450880"}, - {"evmos1w9ryha2r9tl6py88xwf5ae895a4ptrgwdkd6x8", "76791084392050688"}, - {"evmos1w9t3cssx0yqtld723dglenq8aamswjh2xkmvge", "124165147944064483328"}, - {"evmos1w9ugfwrenj4hv2lg9plpdr75ana8vkvwhwmpuq", "10103899142291075072"}, - {"evmos1wa42fxefzz6sv2cuyvqrj5radna82jcws9kmlj", "1209719456350789632"}, - {"evmos1wa4u0yn56q65vpgqvtkvd4f2stvvzq5zsx8xxt", "205414335826370560"}, - {"evmos1wa4yx4cy77u7ersktr0cu5gsjrzwl8glcnej97", "9907524645344997376"}, - {"evmos1wa52d7n0nqf0825348uz0ev53alqk4yx2n9umy", "1324832423009714176"}, - {"evmos1wa8qejhgfnyxge82x0vus6046pk2gs8kd9hf76", "15612220135044136960"}, - {"evmos1wafkkf3de320854n6ax459n0j4ean9cv6aw4pv", "457683359873175552"}, - {"evmos1wafq9rqr34u28wpcxhn0h7pyctadmpc7d3sqck", "427958525764992000"}, - {"evmos1wafxjwahgf4fej2538v9q9a8zme8wdym3xh2r6", "6119647974197772288"}, - {"evmos1wak9wr364g2gxsnd69um9yg8zh8daj726cq8ej", "5247846627464650752"}, - {"evmos1walywp4qfrdq5a4zgf5xul8v7hrwn0rme2fujl", "1486514341500712960"}, - {"evmos1wank47xszusmfkw05t4tc7fvxcml0c0cg4zrfc", "284663514693017600"}, - {"evmos1wap3u0xsxam85cyvjljp4txn9d9ws6t385a5fl", "7699000220510253056"}, - {"evmos1wap4y6ar4cne3735lx2hkpe8us5kdgsfe4n59w", "1474446330922484736"}, - {"evmos1wat83xwpsnge2ukueqn52x2wkvz9t8p8m8kw7k", "509041397213402112"}, - {"evmos1watt2p7gqdqyeqv8ajwqzu7l85ymssw0tay5a7", "2241390620339082240"}, - {"evmos1wavj6fg3kzjeganvz492r7vp7cm528dqh5quxj", "3425455287279089664"}, - {"evmos1wawyumcf3csn86h8reg9xk25cr6me8pdw2uc7q", "12521608377286610944"}, - {"evmos1wc49wft7vydvm82afrtwmjvrlwps9wu83aeyt0", "32851018734588829696"}, - {"evmos1wc5ghcsjcfed64kunfelrgjay9gahvkgmwru6r", "4831905224554035200"}, - {"evmos1wc5qaxrkzgqgmmlpatwjydqcv874nz3pn57je0", "3440157605684810752"}, - {"evmos1wc5tzsww677hsr9g677sy32v8esyemnzvgcyqg", "33945779550956855296"}, - {"evmos1wc6ty5tmn3vk4kcsxz0g73gn8u3w3qng8g5sez", "8746565777120079872"}, - {"evmos1wc94yuu8skr0uddrzak6d0qtdqm84fywwhjumg", "35486469129474768896"}, - {"evmos1wcaexyq3w0uhvs07u7jf4kjmt4mefp7vdle67p", "3056818454527218688"}, - {"evmos1wcdp93znvy3kq4fr2r532dfct6v5n2pzrx2z6w", "15197911281662443520"}, - {"evmos1wch5danmdnz4kx7zdwhf57n8al2ajy0y4hx7cm", "300829686646386688"}, - {"evmos1wch5zcfzyyusvjvuekxp4a4jh6fn7ty844qam4", "2610870868380483584"}, - {"evmos1wcjl0pd705nrcpndhgqy2a54hqmd56mqxz2a9w", "2617935723915436032"}, - {"evmos1wcmkz4qnzsc0qdhs0rs0gshs62jtez080j6gzy", "3884260837206863872"}, - {"evmos1wcn49a6mwnxrdz4t8qgs8h8zacwzeaq5ju2dgn", "9919891033247551488"}, - {"evmos1wcnhg906lurlsncvedszlnq55q49qh2ttetuvn", "22673625689120309248"}, - {"evmos1wcnlqhxazk5slsq62z2hz73lqksw7q3hx0xkcd", "276126166658007040"}, - {"evmos1wcrcz0j4fvd8kkere8n2eueyl4g427xtpx2fqf", "7596929387306010624"}, - {"evmos1wcsh5fhav9d4eurce9v646p2w2gzk86tdy82z5", "1327343870616411648"}, - {"evmos1wcsmsyrwxlvzsdlt2tmu8swwtnm530h9eqwww0", "859795849282726400"}, - {"evmos1wctktzhnzjf06w6rfqte9zeu94kfwtx4hnw9pz", "1198809851196743168"}, - {"evmos1wctlvqa24ghpxygfws82zz47mrylfl60h48yge", "951294184420846208"}, - {"evmos1wcuf46qg8plvu8gnujsae5n0wrsumsl6dwupu2", "10134956992303259648"}, - {"evmos1wcutjqhzngwn4l0ewtrzf3u3s2hz8shrfemjwe", "5835937233569996800"}, - {"evmos1wcuwal38xx22eev9hw0qraq208wmhjjcc79h9e", "2014051641389371904"}, - {"evmos1wcv6un09h39uqt78qnvnsyl56lu5rhjn0usc7m", "15690055843358976"}, - {"evmos1wcxkn003crzqg6gfjf6xxheztknht24xk8x6a2", "402916571370632192"}, - {"evmos1wd0rjjt47ceunl30wycgl6aymwe968956ws567", "85000659713820160"}, - {"evmos1wd0zfvvux76nsk326kq4uhhratnn8taay4duun", "6457509350006063104"}, - {"evmos1wd2u54snu0y58aklxefw0lzwf29cqztk56fvn8", "417072752192532480"}, - {"evmos1wd3a590sc7k9mmqvt2tw6qgynxa9xfnrmlz2n6", "1292182573274706944"}, - {"evmos1wd4hau5rcqnhs6g6hag4va0rj8cktwerhhcf47", "724086761059822080"}, - {"evmos1wdel2rqn4dgs29ld4edxxtycjmsy44rwr8zv83", "963961733965461504"}, - {"evmos1wdfcey007drkcus588hdnj95ls3em2uaqn5gnw", "118233521491892224000"}, - {"evmos1wdhtn6nwxn83vkme2pl7djcacpxakh6z5mphq9", "911832103772441856"}, - {"evmos1wdhz65chzt3lmmk4p7y48s8ma5963jwrrd9v5m", "74348897002034176"}, - {"evmos1wdjf5045r5etketzs2z7zvs2e26nt8vesxdj8g", "1903219696428327680"}, - {"evmos1wdllsr3rmwzyakkaxh9l5sr8nw8jc6t87xqkrc", "839502777437158400"}, - {"evmos1wdp3ta2nz8jq4ten6hqpyr896grvdrdk72lmdk", "6844960941050478592"}, - {"evmos1wdpaceu4d0yaf0d4gx8zatp3uqsclff62kdhh5", "819409124023099392"}, - {"evmos1wdpxql28pc7teasrfljg8ukgr0qlcjp0aqahh2", "924376925844488192"}, - {"evmos1wdq2a8kqap7tvd4urll0mtl46utsp7qvtvrqa8", "4371167505955698688"}, - {"evmos1wdswmcklm2uxmcj508lk9pmkl4mlqhkd83ccwz", "4214834574200905728"}, - {"evmos1wdxds0lt23qwaha7nxzx8u2zj69c0jsz50nrqr", "553262291571139328"}, - {"evmos1we0yqm43hvysna82utl9k5kzrj0xrdyc0m7n6v", "1483238937747812352"}, - {"evmos1we2temczjkvgc7w56y9snad48yuggkl863dveh", "794018055740624384"}, - {"evmos1we2vlswtgunhh2zzy2rrs9jxe07nuv8jdm52ew", "2559140843874946048"}, - {"evmos1we3kj7gqmkf6d4rj90q4pk8r5q78kjrx62fmpc", "213308553551599616"}, - {"evmos1we42ahq4qrjj7tprqwq6lgk9g0a523drrcfsxd", "161658764902040064"}, - {"evmos1we72uzcc4jg0fff9w496mv3zjwyaleeprmylrz", "1307815549467009024"}, - {"evmos1we7gdnm0dqs0qgt0awdl2ytvxajxcw6ytdtvvd", "2140744099089026560"}, - {"evmos1we7quvxazyz8hya7x8wss5y7flac4sa30xju52", "230961834891776"}, - {"evmos1we8032aguea02ph6vkadzdpt7dzhrmp7w2av9z", "987562928320500352"}, - {"evmos1we80pqp74l2emus4g8pnuj7uqxpcjy43turg24", "701879890662156800"}, - {"evmos1we9jdd93uuhn2xm5fc5zcl2tnzdefaxv0yawx7", "932738464683286528"}, - {"evmos1wedf7u6v99aw4y35z7q6jk5tgm80p4sz6yk2x0", "1450940824552120320"}, - {"evmos1wej25nsc0n85wumtaenkdaf65pnp9zctgcwhc5", "3014859276173783040"}, - {"evmos1wejh0aq35uzpl3txyc06s52240nvghqzdxjqas", "2133296431227713536"}, - {"evmos1wekag30xyz8mk29cvxsn4tly7378m86e4hgeqg", "4038854643797724160"}, - {"evmos1wekpae07035ykg47eme9pcgs7cvy9gq7gx3g9f", "552575736609017856"}, - {"evmos1wekv7eyqq34hmuejl977z9wtw33p85t9u9geyw", "4462399608032416256"}, - {"evmos1welcjfssvullvx5qt5usg8t4g84ksr268cz6sw", "8734414714128527360"}, - {"evmos1wemq0vgfj73ks9nxjds623jtxtlwcevkqgff30", "798652690327974912"}, - {"evmos1wepmpn6ye5uh2dqj907lh0x9maqc468k3tkumm", "5975070882749720576"}, - {"evmos1weqewsgjephfx50zzq50g0az5r8x5gk2xx722r", "4327045987708053504"}, - {"evmos1werkwrshfdz7p3qukgmczvpk6w5hvrhh4qny03", "821725780598449152"}, - {"evmos1wes3pua6e4m06jmpznt86xmjqkw5ftwz6uqnmk", "2643494804878819328"}, - {"evmos1wesel6m7e5qthwduxhka7vah79lafegcf82vll", "2370501531516660736"}, - {"evmos1weugr323sm3cffs2ep88yc3ta8srm62f2juyhk", "8806976420512985088"}, - {"evmos1wew0k9fvt39n3yvh5zhgk3fecmmdfctwpw2p0j", "487683085026667008"}, - {"evmos1wew24g2urvhjl3zfwtn2cnfrspqwk78k327u3y", "3212802734770003968"}, - {"evmos1wez9g4mf9nz00fvnmrkgmu40zekuhxuwr6dl6h", "3128369375980149760"}, - {"evmos1wezr2zu338y08dzxhd7e8dw55477c3pupzjzfq", "9024281057504055296"}, - {"evmos1wf384fqmf64gp5efam4wvhwyzzsh8mw9p37t86", "5394987770244728832"}, - {"evmos1wf3s9xlu452mgjrf2j77stluv6ds3lxsu6whm5", "486141645700884480"}, - {"evmos1wf5fg2fav3xgvjtgeyjtdjfdpdn3e7ueal4rzl", "8636716785880997888"}, - {"evmos1wf5w5ka0u70v850cakqc4thwzptzv4yjzw6fvh", "519804625149511680"}, - {"evmos1wfdkdu6mtn7jk33wjdwrkgm5q4r70w4vhg70sr", "5623705664347529216"}, - {"evmos1wfe86cfv693vxruyk4ukv25mmc6ysxh8nzzw5m", "700812590485987328"}, - {"evmos1wffx20dvh4vwlp5egqhekv38syzfxf870yuhm7", "993576748100198400"}, - {"evmos1wfj7m3p37cuv7ufns5ys2xxwsuwdsx90hfwc7m", "22316439309467648"}, - {"evmos1wfjg6a2yanjm3pg386yl42l9whvgg3vqy4mxs3", "5726773497154170880"}, - {"evmos1wfl8hrctatsz0n2tsmsrelcg5td3k8tsk443m5", "1526708592858720768"}, - {"evmos1wfqcs9xaanj2tzlr4rrh9wqhchgfskat8hstea", "884444416654870144"}, - {"evmos1wfr2yar9deuhl26tqt43upvp63hsxk8zhhes7e", "8135016464170891264"}, - {"evmos1wfw3tyuqnen8jv26h68f8z279gu3enakxzk9fz", "2449569091441627136"}, - {"evmos1wfxh4pljr5ux086l4vwtrzmf8egu0hnrfqg466", "4774020485550538752"}, - {"evmos1wfygwu55rcrs669up7xl7dmh7xs7jzgwfmqs8n", "1262156345884243968"}, - {"evmos1wfzddr77hdzgay795tsf2p9vsr5e6swtsvjryh", "11580759705224767488"}, - {"evmos1wfzfc67lxyx0m8z8a9zxndt930fwd00gw0cvnd", "17816588870194046976"}, - {"evmos1wg4lx3h38cz4tg7mt48cx49nkmspezt95sa9ku", "362919462018017024"}, - {"evmos1wg6x29f67xkptpgph69xdtx5qvcunz63cauygq", "4039026829777515008"}, - {"evmos1wga2m7fjnfmseznh7gz74txg0xmws064evmhff", "8971611045589127168"}, - {"evmos1wgfgxc0v08m6hznxu0uj4de54ak22w7mdt66sc", "1668962325976702976"}, - {"evmos1wghgjksj62s3h6v766wmc8ldhw0nek87j52cuc", "4824893683416563712"}, - {"evmos1wgj3a4tkw2d7nyp34kt4up64429emlj5vzfh4h", "873936928460129280"}, - {"evmos1wgjzrc54zu2zalagpkks7pj56qu806lkn4ty57", "3686331727521034240"}, - {"evmos1wgp8nln8lwjdh80uwnqjl2jgneqpwe4ar4ynsf", "384185422287578112"}, - {"evmos1wgpzvpzd4lxwqy7p86sdetrkhjrn5kzg9twkm8", "5616861075566040064"}, - {"evmos1wgrm9vhyh3wzfu0wgnz264hax8rrmdr3kp6a8n", "563863260390250496"}, - {"evmos1wgwkmm96p7jlhwvrquz0knt768a6dc57dh4agl", "156512584562872320"}, - {"evmos1wgxcrzts9wa63k3jvsy740u6fr9hx4kz7ug2qm", "906536715313930752"}, - {"evmos1wgz6njlee2jnn8wrd53uk6stu48mrmqjv3svsw", "456104862540112896"}, - {"evmos1wh0p27pnxfa072euzeg8dwgeuywpgd9er7kgja", "26657155572423196672"}, - {"evmos1whdmkeaczaq8grjawewxltqrgjq7q89585m98g", "2676844653306275840"}, - {"evmos1whdqtzyahwqzwds8jwwk4w4tk2qc0nva77pjfa", "391360606981302272"}, - {"evmos1whf3fj8cksmdae3m0f2juj430c70hhehf2ng2v", "5169094474957160448"}, - {"evmos1whfc3u8f83fen8fufqjekdh6rw3kj3zkua6zrd", "889630759610490880"}, - {"evmos1whj3wgqd74d7x64xtzzj99aywhg33dzrym6gur", "1164700543661022208"}, - {"evmos1whjm0ujaxnpygq5sxnwgtjwxcj048lpn52tays", "3401580274850859008"}, - {"evmos1whjxdewezfw6rq3hutpk7fed8h2dmtrtm7rl42", "104965544935967488"}, - {"evmos1whkeu2z4nt803z368p8nn2hhasz0expz7v6eyh", "74846218729943296"}, - {"evmos1whkhc023wjsxwvxuuyp6n5k2f6ap7y4z6en0ns", "775093191977788928"}, - {"evmos1whlhktdsm353t5j3z2emq8sem3w64hltkl66nd", "642840709188338048"}, - {"evmos1whm46gnq5kcgytjx45tfuwh5pdart422p4gp28", "162683624305478074368"}, - {"evmos1whmm4yhfy0zsp724havzveqna356ycuzmlr5cu", "13816288175211274240"}, - {"evmos1whplewj9j08hl5447ftdnhzrgj6xr0cggnz9hm", "389636080649384448"}, - {"evmos1whq70ahqese7tyrkzsv2syhvfv4hre29ey836h", "384434624561197312"}, - {"evmos1whqs3hmr8q09ktawvttpp4u63y2ezx4ggmqwtf", "7551358807218126848"}, - {"evmos1whtjsu0wg0qzc5cn448z02sugxwlw3q9khml2t", "14317193013555460096"}, - {"evmos1whvny3h8xk06j0475ywlfwpzjd5vjw0z7sgpfe", "41633677084055109632"}, - {"evmos1whz27wsp2ff9knq27qeprg8vlfr43956prmpx4", "1445827493315612672"}, - {"evmos1whz4wvctxmana2fshe7prtcmzgfkezn4cl6fea", "1126684693182384128"}, - {"evmos1wj08xvlu9vve0e2xsddklq6ncc5py8j635h28y", "1424616963468972032"}, - {"evmos1wj3c27a4d3zclr6rvee3wvs384z2gmrmfvhamp", "686036170417171584"}, - {"evmos1wj3wd2v9kv69f5u6pven75wrx9w2lsf9n47uw3", "10967353727180363776"}, - {"evmos1wj4ck0dq83evcr49eyk5cl4yqyzfs6st6a07nw", "119129272232465022976"}, - {"evmos1wj6amcau3lcsl44ynhjurcp4xz88tl7ydk257y", "2051846182671425536"}, - {"evmos1wj6lkk94qjzppaqdv9n83lxtvm34qxnv4k0t3y", "10740464953584754688"}, - {"evmos1wj95zx7e7u0ym9c42fly6zj6cdxmz32rr4hshy", "99304073458259968"}, - {"evmos1wjawtjl97jddta2yt6rz76afr5zelg880wyyx6", "14477341220106975232"}, - {"evmos1wjdqdd52yxh8uddjw2tzrgn9jp7ay93edg2y05", "925342717418360832"}, - {"evmos1wje5cw48ulypw677572yl3xucw88wcg8xgpkrg", "289151433649583104"}, - {"evmos1wjfnvglr4nz0p4a5vesqhkw6v3hg0slwney0qg", "2483368622670364672"}, - {"evmos1wjhagy46r29g2uy4e9kvt9p8xxgahzwjct20xz", "8931152559612850176"}, - {"evmos1wjhcx37hfcs4eyqufm2q3j9ytdfdwel988tmvh", "22151871341240156160"}, - {"evmos1wjl8atjzjq8g4ftqmvfw87gupwp0rr75ret4lt", "60291388681839616"}, - {"evmos1wjqw2t6h5nhhn8mrnqqmxett63wuggfhdejqj9", "944944411127275008"}, - {"evmos1wjse3hy0t70260p9eatv75ha68qn7mqk3rm6x2", "801385417236320256"}, - {"evmos1wjt76r627xyye59yma5umjff5mn6vw40mt8hle", "20161056320364720128"}, - {"evmos1wjtz3f8jctjr37y57x4pdhu38r7qq4535esfs5", "1364458628182695424"}, - {"evmos1wjuwnkk4509c3mxtdcjlww48kand93u7zs5lct", "368931413267627776"}, - {"evmos1wjv3wzmaqw2gne7j9rwhc99ftyasjyzx38s8p7", "1493589919064720384"}, - {"evmos1wjw9ekw2jx9cmyqcg7g5m9zv7jz5tnyrr35cvx", "40734727365368143872"}, - {"evmos1wjy2mlg632r9qs2fkk5gezkr8ml642d32x8rq5", "12747080794203904"}, - {"evmos1wjylchg9ttnahvvjs2wnj0uh0cly85rvhe07jx", "367101798060567296"}, - {"evmos1wjz79vxcfr84d6anzvfs8c9qgcs9f4s8ktr4l6", "335270366465589248"}, - {"evmos1wk0twthq85lr5xsapzp8yg9fnuh0zpg3ndz4tj", "2502610697297760768"}, - {"evmos1wk4sgu6txzfksl985nf05g095xx9h7zaw3su9w", "4049489841522229248"}, - {"evmos1wkaa0x8uqvw87nz9uthdenq7tg0xmssq7kkd3d", "2038660547569825792"}, - {"evmos1wke7msczkfa30t3e8z7c9g3k2as2c9n3rtqrct", "22617010143406948352"}, - {"evmos1wker57uhjta8fm35mls2p8d4m3u6xa3m3mgthh", "3395554925617307648"}, - {"evmos1wknakmvljkgf6dlyak8tnfgkr28pee55e9ttwq", "1799918415374334976"}, - {"evmos1wkp8q56vwg6543crqp3fcn4vyyr8xdkraup5n0", "2074674786665473024"}, - {"evmos1wkqn8q9a2uxuspmj38yrsrsp32wxjxk4c36dth", "9390624812293820416"}, - {"evmos1wkswz2c6clxqkdad6dhxfd33rtkm9fqlpurs6l", "1846599802719365376"}, - {"evmos1wksx059ujz6e5alnkg0glmps2y5radchdl75p6", "1223747535565363200"}, - {"evmos1wktn4hd87ktdrs4kmz0pd2cgh9fa52u6v26pn4", "155376852533878784"}, - {"evmos1wkyhrwnjylxyae6ef9npt6epndfgsusfx5nyt2", "43592481807619801088"}, - {"evmos1wl2rhqnjx92tvjzvms4dx2qm4j02hv2wtlng0e", "610643677983981568"}, - {"evmos1wl2vg456pcqwdy3v069ap9u3hhz2yasvtmxy7m", "1602987827553386496"}, - {"evmos1wl4jy4q6uqhk95um59j59fyufl2rylpew3hudp", "10985233839403370496"}, - {"evmos1wl4ks5qlzpkev03n0rua334xrvm4p2azxgj99f", "5177195723324260352"}, - {"evmos1wl8wqm7ywz6usjhwv8t7ar3t87qu0kfanvqnzy", "152027682965767168"}, - {"evmos1wla3kgqf84ek8x3cmhytzwlqsxfs94mq0uwvzy", "4505699923069628416"}, - {"evmos1wlax4gg97fcdthxhysj9czgt2xavmqgznlu679", "254734766036989952"}, - {"evmos1wleh2ld6038nslffns5e5t45rrxxrhw5a70ymx", "341122452845860608"}, - {"evmos1wlg0nurdwtdpp2esj0huqgwx5ur0txuy769gtg", "13825875080555415552"}, - {"evmos1wlg6h0zy9eedrzkxdrjwkmweqj6sn9006dnwdt", "50296908274733056"}, - {"evmos1wlj4s57csf2qz8avm82sx3mf7gdv5thv3053qd", "1897520495229834496"}, - {"evmos1wlk7uwug3kww2n0jtvv2fwklna35p4en865ae6", "1281155085989458432"}, - {"evmos1wlkj4a2fnec9g3c4k2tfrxu2ykccgehay49tps", "2689233243817369600"}, - {"evmos1wllh4hl2lp3ap25fr6frax46we2pfyrr0w0sa5", "1760264043154529280"}, - {"evmos1wlljzk84sqm5mt3u29wjwph6828glp9efxhus6", "415076531884007168"}, - {"evmos1wln9exlnt07yxmypsp30hs0ltlsflvgu3ezrps", "10030998221240496128"}, - {"evmos1wlnw4wyp3r0l08qdtcfw8usphd3j9umcvspz7s", "2462151558920323072"}, - {"evmos1wltcp4y6vzffzenyx22na9phdn269d7wrntvlv", "85329846200000512"}, - {"evmos1wltxjlweknvgdz9t96tkltcu0a8plsgvulfszf", "203905038141890816"}, - {"evmos1wlurh9wtvzq74jam8areknpqdggzmtkruwnrzn", "80324394117514149888"}, - {"evmos1wlvzfltph5fjrjg393hk54cr603z7x9xzm737p", "5070845566340916224"}, - {"evmos1wlws4n4v7r35qa7n658xq9qzz3utuqy9y86fgd", "4325059723616944128"}, - {"evmos1wlwxxzku4zw5z6ls7ls8jncqjy2elu2cmc78jf", "1662259159495983104"}, - {"evmos1wlxgksxchdza62ccms5pzu8lnqecsghpvtm7g4", "1323641890232412416"}, - {"evmos1wly6fqnk2r07excqrqjepfws6l8pmwdldwhr48", "12099989825582927872"}, - {"evmos1wlz5gx4kfh0qzmdgz7wlhz2zmj624rvd0klltw", "1478437269183365120"}, - {"evmos1wm2qu26nnc002x83v8mx7szdxl2s65v0tv8ama", "467437224975424000"}, - {"evmos1wm40vqx269umsqfg5nl0jthrpj93gmyn8tdxlx", "1784912521104092160"}, - {"evmos1wm7mxvdmyxqwl3tmns79dje2hcdpxxedzlqgml", "6771484607476896768"}, - {"evmos1wmgmjhhhkq0evnt0d2egzv4dptf8n8tvq8zv2w", "47167483558045483008"}, - {"evmos1wmjq9ftm9l4x36qaguc0tseek8w6z553f5pqva", "5437259060897363968"}, - {"evmos1wmkkvwjrwjwv8fy55p3zazk0d4l9s2u7ncl0mx", "110120773571748478976"}, - {"evmos1wmkm3apn009uqafqyzh2thtcj0ucrwc73mt8ps", "502835517785200640"}, - {"evmos1wml4wpj2w9fz6c02nua7y6umqzv50xdpvc8upk", "9533599696353558528"}, - {"evmos1wmm82zffzfk6wwmxhwd9wfu4467jakt9jkzvjp", "260266082569152512"}, - {"evmos1wmnakx3acr6lflzdtsz4cdsahps72q85qnpxcg", "24760172830405984256"}, - {"evmos1wmulheyg0xct7ww6v3z3vs693fqvjvc890wnl9", "6583747555656894464"}, - {"evmos1wmwpva46zjnw2hnupl8ef329uz8043vdtlnkrh", "17249915092691828736"}, - {"evmos1wn2wz8c5ws84hcr4d3hmedeph9z5c66aksqvdj", "45657488309110528"}, - {"evmos1wn4p3eekragst7kvlphkrjty5zanff3tlvp4ju", "39766687294960828416"}, - {"evmos1wn5tavncm36aym2erzhg80u9kkxg95lmfv7qfh", "33805716533178589184"}, - {"evmos1wn66zt20n9dqj6erswgcj9nxgt70tm07k8zw5f", "4866543559365764096"}, - {"evmos1wnajffpm30drnwhed84ny88fyv6dq55cz967ku", "14346057391152973824"}, - {"evmos1wnav74yh9lwd5z7arad7a5vrkvttpllpy95vrz", "14884841305546907648"}, - {"evmos1wnd9vg0qan6ynv5x3ehsrrgxujlhwez83mvm84", "1608451067134316032"}, - {"evmos1wnf45rdzpjdhp7gmsxc889kz82n4ggcqt32fag", "317012689001942784"}, - {"evmos1wnk2dvmxje847856kvfjhha93szmedu2ur98rm", "419519163699505664"}, - {"evmos1wnkh9qqkq3h75lj794fs59sq0769rkeug57p59", "843542812981509120"}, - {"evmos1wnlk0gyjk4cypd0vcqtcsld00tlm7twthpgg84", "5858527103261017088"}, - {"evmos1wnlzj7a42d30ypqkkqygfg0nss22qf5v53mz80", "387052452373967104"}, - {"evmos1wnnkhpn0kuqjmjfu24hze8wy9txy7tndkv8m8q", "38053307837129383936"}, - {"evmos1wnnuazu524f7hdly5yd06kkp3nl77gv8y5q9r6", "2051161385729351680"}, - {"evmos1wnpyusaehnkejlkcjpnslu60sd9j4n9snh43hs", "296327994832809472"}, - {"evmos1wnswffnn0lk7tyqwf9rn9lakct4rc54rt79anr", "524051709025392640"}, - {"evmos1wnthwzhkyqd607u542wwnqj6msud75ml42kca3", "1578563136986382336"}, - {"evmos1wntp09u94l5069v0mheqd2wg973yxrr8emgt45", "9985506327140024320"}, - {"evmos1wnvq5se3gheedwzxrmfm6z087kqaf59a2fxdfg", "4816357180868571136"}, - {"evmos1wnw2e2cp2pkm37wyxgqw8ywjcygjyhfyfujjt6", "69649384501689856"}, - {"evmos1wnxwzrt5wu2208lsnvzd8n6d0fhyxpvfp37m99", "395668633828729344"}, - {"evmos1wnyvdn5hvmzlwl37rt2uwhl8mgr3n87gac480k", "13484641275504455680"}, - {"evmos1wp2ghhx5lmycv8cjtkc0t65mjcr9nvgyatm8xs", "8534909580454727680"}, - {"evmos1wp2p7entqc66n7kw4v3zhcej8t60p9yllkylar", "3143334699939250176"}, - {"evmos1wp38l9qj6gn2086t9lzpp4a3pshz2nc0y7yzu5", "26044480946535190528"}, - {"evmos1wp6k8p0ms5um6xe97c5psh2pvzuv3gz6g4nqp3", "201004446915491328"}, - {"evmos1wp6seze2unr9x7xrpxgrp2mh7v2f3u3zldlklw", "8353118354236239872"}, - {"evmos1wp6xatxs9el03ynw6vh2u28pyzw6tr3yn5ys5u", "527957234649782272"}, - {"evmos1wp9jmnrqyzy3s0ntyjcvcfxueu6y59vh3jwz25", "15705572609531600896"}, - {"evmos1wpen8s55waytvjqafjs9dr4nhsy80psd0pmhyp", "47659227294935064576"}, - {"evmos1wpf3z6xk7cacwuwmsclzelymf4q6thn2lnnna8", "170275614822522112"}, - {"evmos1wph6kyxs0822vp0tl0ft6avdwqzq5kss3dugzd", "1838781614647721984"}, - {"evmos1wpkkmmkfv7rxhm07rjmmut3psqj032ajpgfnjd", "3467567257979101184"}, - {"evmos1wplfj2vtsy2ecd6dlfadlamjzw7xjzpr5eg3qp", "14805563391232847872"}, - {"evmos1wpnmee6nsqfqrw204cn2x39h69hk4cpeefxl7j", "1685443807886566400"}, - {"evmos1wpsxwt8pp3sdqsx58kt4av57ysg8n6mhwm2jy4", "16393386944293027840"}, - {"evmos1wpz77jy6vxhfx8ly8v5mzgce4usp09xjja7lz7", "4034762273479299072"}, - {"evmos1wq0vm2elzszmq2flnw05aahmwh9ulcz4ww2gm0", "13348586031111585792"}, - {"evmos1wq5j2sary4x8gwvm8akcdtr0asmlf6p2y4v0ua", "12774073142589884416"}, - {"evmos1wq64dta88xj0lvsdrtqdm32p6e3thlhmzdk6vu", "165392908818946048"}, - {"evmos1wq6rv3vfkas9ej8n5p3wncsfa6r0rn997vkw56", "26117828308191576064"}, - {"evmos1wq73h3df7r2m2zcm7n3ktqyep7s03l5vqrrv96", "960886682430926080"}, - {"evmos1wq7d2t66fmmppekpqht83pz38cl9jey7e7h32r", "320528053628713216"}, - {"evmos1wq7l0u93hpncvff9klrl49chccqpt7q80muk0y", "10702635921462571008"}, - {"evmos1wqcuv5j2qarsevgmrjcm34zftzm257pj7cx6er", "1464761860308299264"}, - {"evmos1wqczq9q2srd4nnpukk2qqn8dek672nn8tzensf", "26257828458563371008"}, - {"evmos1wqf07vj0j7hrzk3nzknvnskg9pah3dyhnyzdc4", "301174345998974720"}, - {"evmos1wqfz7g8vyyk0mvmge8cw5uw2j4vp7hrt9xfuv0", "87311891111826944"}, - {"evmos1wqgn0jqhz7jn879f6528syjm9an60phwtdfyn8", "3092632328778237952"}, - {"evmos1wqh7vdlpyqzz5xuqax4ewfpyvtl2xzzs5ukatf", "4743318377770450944"}, - {"evmos1wqkkmmu46k0rr6agggph9qsu9eyl94s80ty5pn", "478601267469434880"}, - {"evmos1wqp0976v7vemjhy03hq47q27wr8euya09xpl97", "13035945716742529024"}, - {"evmos1wqs3e83kgd0ss7kptmecxa8ghhev3e72an9zl2", "928645583628308480"}, - {"evmos1wqsdej7w77s58ftmh55ledpxjrwuqm4psjuycx", "6010491150664155136"}, - {"evmos1wqt384q7l5kdr59vecnnqzflg3fk59uszamnm5", "724508121770877952"}, - {"evmos1wqtezkzteccefujzjn7k4f55dmj78rwv5g9p7p", "53515492261296128"}, - {"evmos1wqw9ezxjeg9938acfzg7f2e5fmqd7a5yru55wu", "1464861076640008192"}, - {"evmos1wqxmvadve7585z4a2qa2js94a683n5d5racns0", "1348555234956132352"}, - {"evmos1wr7kesyw02q8cvrq62c7t8ntxk00l79hrr9w0x", "26657965011913637888"}, - {"evmos1wrcp75azhtfzq3trueugv3mvqdx2hnkgpatugg", "15692177504887912448"}, - {"evmos1wrdptvn453zt0vfr7f55p00lg20q7nh0p2d8xz", "2970665080523638784"}, - {"evmos1wrfc7k0pvevglq8nttreluqt9vvf087tf4sfdp", "1861977798314264576"}, - {"evmos1wrhjw8n5r2s8zqv227mwzg07nq2qngtdlg6ype", "6204705047811374080"}, - {"evmos1wrjgfck3cfqpw25ccv5lwygexvvl4lped2g07r", "1719042893619623680"}, - {"evmos1wrjxrnz5k78qctwnhstenllezla0v3s40rc3nc", "1465185552309865216"}, - {"evmos1wrkq6aly02epvjjt6x4t597ux94qtrezq8qf33", "2669786291804223488"}, - {"evmos1wrn4dq9zxhdycjpdqfnru5xam73n9cxhthnc0k", "407482182720697856"}, - {"evmos1wrpxqu6jpp9g0lj3z539nwsjm0sf6hqhdntxvy", "547778710754147328"}, - {"evmos1wrrk98lcwzadc7v5v9p85rdzlad7g2evuuauq6", "13085059931009886208"}, - {"evmos1wru0guhtujgj4p5fvmxkf7rc4l5dt8u3q08v4y", "1761085863567310848"}, - {"evmos1wru7unulpzpk02348y23rldfvn7u0l44ttagx9", "8077541953171066880"}, - {"evmos1wrx82uyzj3vqdsuru90rp2e8jax3ys3z0rt6rx", "2404752308186175488"}, - {"evmos1wrx9gla5tuya3583wds4ze67mmvsjfutlh7h0u", "108078810220559360"}, - {"evmos1wrxa5krylj7leztuk4dtr4tk9am32rsx6ph9gg", "13908156639114551296"}, - {"evmos1ws0a9tdv72asnn4869ewhhas73qfn3qqevnzhm", "14591908892763865088"}, - {"evmos1ws26uj6au64trc30788w5sfml374had655z57d", "11543853189098893312"}, - {"evmos1wsgzh3yq5stgren2m5lvjdu2ume609jjyr3wez", "398358684390562594816"}, - {"evmos1wsjevyyscdpfl7ckfhv40revkhw0s6g9klwv6a", "208598057091350528"}, - {"evmos1wsr52s3ucekkq7v37c0t4nt33fdd8xxq282v7x", "52337747664538435584"}, - {"evmos1wsr5zcunapycqgzy6yh2dyylrza994sygxagtn", "3658607751671967744"}, - {"evmos1wsr6qggresp6yq8a3l95fhp2rkyayxxgeq8dnf", "1396280851080968192"}, - {"evmos1wsrgj2gjnpgc0hp924zxcsgx5l4wr8e2dvxaxw", "3036308610098680832"}, - {"evmos1wssx80m9qdzgnzysv9saqym5rxuxcqlxl66h6m", "20169668260658298880"}, - {"evmos1wsul0hae9ynxkwapx5x33tvfqlythqlfxalrm7", "12394632389668118528"}, - {"evmos1wsvp4r0frxhr8h9rx4gg3vd78eejregf0pjux6", "2773879426425329664"}, - {"evmos1wsvsyajdcwhenafz48cgndsshl6zv7cqrhsu4e", "2297127078993272832"}, - {"evmos1wsyf7hrw7a0js4ck5l8mn8m24gu2uhgrp8xlzv", "72725734368903168"}, - {"evmos1wt25z56dgx9fszhzx4g0eq3vf9ky5q2vs56hw2", "32070466985734217728"}, - {"evmos1wt3ag8vea74k57n7sznlc7te6cjc9vg6x6s9g7", "2590045907420004352"}, - {"evmos1wt53ssem8nmv03hghvgy5punarxxevjfsvg0tm", "1684689364631808"}, - {"evmos1wt7ll33tehe5p2asny270cfvwfz66elglsakh7", "3510533319908958208"}, - {"evmos1wt7uv2jnfzcl47kjd0266sc3xlucd9vxc62pvk", "276943599525622272"}, - {"evmos1wt8242cymmn374yr0we976akyu5n3k7tqheg6t", "10723555573243019264"}, - {"evmos1wt8a0gleae0xyg3nm5uzckclr9qm9h9mw6nrhf", "886648360337769472"}, - {"evmos1wtalh3qwhky544rv6axl0qrlct2lvumpkzxvw0", "57490734600540225536"}, - {"evmos1wtczqyf7llglkyrdymsvjm700gqwflhwpq4kwa", "642829380542895104"}, - {"evmos1wtentm7m37jhmh89fc370gzde62v0452e95rqp", "19084938665725534208"}, - {"evmos1wtjnjfw20794lpjv2mgrsfm4pn84v4psmkmwqt", "27028762478882287616"}, - {"evmos1wtjqnz6905gd0zdltvjs2uq3hwhjvqhjqnrcrd", "6596246033249515520"}, - {"evmos1wtmlhve87852cfxytmwua923mqqvxurp2cquvp", "4106041934752553984"}, - {"evmos1wtmnum2f82cwsvzcjdeu393s2zvsmk2dhwsmlu", "4360982851460497408"}, - {"evmos1wtpvyyf8lxxp84a9k9ka5eam5lmxr58atgvc8e", "1150477541451008"}, - {"evmos1wtqfrxk765lty35whfgyka83js5a2ndk29whu9", "851540802825894784"}, - {"evmos1wtqu8z9rs6vm2awn62k7pkjhaxzrgmdj8ec4d2", "14820573354228682752"}, - {"evmos1wtx7d3r4fvxt3uakxm5s5ay6tevlyy5s9g0520", "185092638963204096"}, - {"evmos1wu0r6gxaql0399de6n4mzjdu4ykw9kfrn6cg4m", "44630107383934140416"}, - {"evmos1wu2ap3emdecs5f5fynsnd5lnq6mumyde05hre0", "743214860866111488"}, - {"evmos1wu5e62xlqhut6ednf06nwp5x0qdd3rqna5j3g4", "25309362149050830848"}, - {"evmos1wu7s955jec7hmr5wpx945evurgk573cqjn7xef", "3790587417150324736"}, - {"evmos1wu7vvx259ac5dezejhxq6fzmdxyzr5aug8klv2", "1295261406841611264"}, - {"evmos1wu8dajevc8rzhhktd5q78dl248gx6as8e7979f", "903977670379803136"}, - {"evmos1wudapw657cz270c3mc8s2lm354txyru3h9cgk9", "22391947038763008000"}, - {"evmos1wuehmljhngp6q7j8tpcdk3pav5f87pmfjf45hv", "12131786091440596992"}, - {"evmos1wug5y2kdcgym868wwpjwcc3ckwg8geuurzgwvq", "60658068472262115328"}, - {"evmos1wuhy29eusn55fkzau9cn5cs3jf8rydhvaf2aml", "1835867671906975744"}, - {"evmos1wumjzydtq9uud72d06pzuh6d3ckup25w69n5rl", "9983608601048088576"}, - {"evmos1wunfru352c3wx4fcm9czck9tx3yy77e53sg4hs", "9839882565356920832"}, - {"evmos1wunmf66t5cjus4hf5rhtxrnyml09mydwh0dsmu", "10534507886704748544"}, - {"evmos1wuqn6gm6ltyfaaxklmhjpm0pnx444rfqcrhcxe", "812727774969604096"}, - {"evmos1wur4wpyazv63aagf3u0au8s5enpymr88tard2t", "438380337328045056"}, - {"evmos1wurn88wvhtnkywywdpqqatktvfnk989yfznhqx", "579795900269938176"}, - {"evmos1wuskczqj4gh2t399wcw004k4qgnhgjah6waenq", "3274047537795866624"}, - {"evmos1wutn3gzycjdqvvpmqqmukvp4xkk2jntndzcyph", "2765792662380073984"}, - {"evmos1wutu3us9ehspjg0a2f2fd0e84egglhv472ld4h", "27145595967297798144"}, - {"evmos1wuuzy8f6tayf4tl05yw2aa6ekae05ejj5wzg77", "20900081772552708096"}, - {"evmos1wuvenxp0cdmkzx46qjep9k7vuahc5096srwhwp", "994885275086853632"}, - {"evmos1wuwcpqxncv0x46xqqmf53wext5m0kl92wzcghl", "2717863776104378368"}, - {"evmos1wux8mhu9szglzlauwf07n469hk9a64e3uc3f62", "643517132190253056"}, - {"evmos1wuy8kmlnmljx342t5ysmdvk2039fjetl9f5070", "1825386940944990208"}, - {"evmos1wv0zxg9g50hhytmgj7ezkmznzqym27f8en26fl", "864664028108648448"}, - {"evmos1wv226lcyq9d8tx98y7krng30u5je86h3tvm6q4", "27960618574852489216"}, - {"evmos1wv6h72k7qdx46n0dncjfecsgp0nfnmdx0g9fd4", "9496047209833431040"}, - {"evmos1wva7yypfgjqdzk9ak64nh8n86qswxxu5tpn9zt", "45246083765810176"}, - {"evmos1wvcxfwv9c27fzzrs0tut3g60ep0u7z9f0x9cqm", "102515315079086080"}, - {"evmos1wvg25u5fj4qhr676jvfd3tweksgyeu7ulnduuy", "75891589644956672"}, - {"evmos1wvg9qa0m4h3cjcns5k20khvk8atg8jf45hme80", "218881253432365056"}, - {"evmos1wvhtp8fz33affg39v8fxma6frnz4se8aepez48", "5152227193483896832"}, - {"evmos1wvjqcg2zfchrx9nth4p0zwdsvakg03zqpalh0z", "4341330842251684352"}, - {"evmos1wvkachgweahmt0axtdmyc3l7t64u9g3we5cyyt", "4406455418157901824"}, - {"evmos1wvne662as93xjqfgerqtnw00wxwx6nuhxsamn6", "7118878581864538112"}, - {"evmos1wvr9pxnjsqauwqnad9x8rajpjs7auf74p3z0xx", "1281581217565590016"}, - {"evmos1wvrn6dlx4s4tex82zm8hm3u8arangdzfzs9mgw", "19065940931249975296"}, - {"evmos1wvu3qtp9r5462pahmr5n26sc5f932n34ctfg6u", "1484712285789347840"}, - {"evmos1wvye7jwepsc5rjyl3ua454xlung7femuuuk8qn", "406230059198934548480"}, - {"evmos1wvzz8gy59tpjz5f8m9kzwxr0ydgk5pzwp5pv77", "62393724394385920"}, - {"evmos1ww00n7elmvu2gslz2kl3qjpsn50t7dqy2qhfkn", "3852231463820257280"}, - {"evmos1ww0k8ak80l5ap7a47eew8ktkuey0y53jcgp0z4", "838184929390165504"}, - {"evmos1ww2genqmme9ghz7xe4fqm4cqef6pyvv8au9jek", "1921689956521741568"}, - {"evmos1ww2qcz800xdek4y7ha4pmyd4nyyhek4erz2zxv", "402180894074058240"}, - {"evmos1ww3funhsllfcj4nqpcx7jggwpcxwetnde2ugwj", "2428415709742144512"}, - {"evmos1ww44y32hh0plnpg852zkwvhjetx0qp9pyh9x85", "2672942477235398144"}, - {"evmos1ww48y7766ursykethp2n025w5n90p4uuk8hvcm", "1655433944229314560"}, - {"evmos1ww4mg2g7x7aq78475fnplsq44qj97aggqll8yg", "13360309095207469056"}, - {"evmos1ww5n8650sx9jgwrz0u3q5h7pk023e80vvms6xf", "53772327454180179968"}, - {"evmos1ww6wh4akfxvw5l3qjgnxztvqx7jxgu0psh8p9w", "6401717904992337920"}, - {"evmos1ww7ct5f8p2d94m4j430estm64z9x68jzqeta90", "1831648626287899648"}, - {"evmos1ww944t8f7jnkm9vz6vdj6fgdvvmf7ecjt3mntg", "387252143010984448"}, - {"evmos1wwa3jl3f08vad0uk8pmlv0yavlc48m7c0pnqtz", "884315948328807168"}, - {"evmos1wwj9ayt93xv2dvqdypmj804zp5cykpj2qw86es", "3637466471839706624"}, - {"evmos1wwkgl7nksnp4npxvymwjwmy9ta56ahet6e0mpw", "93215072662740287488"}, - {"evmos1wwkqkhufz2v3sfud785uy08tyq5gh8aa5sf6ns", "104375931210925047808"}, - {"evmos1wwktz4jph9rftyj6f6kkjm30gdvaxxqy00em07", "30002480287839592448"}, - {"evmos1wwlkt7p8s3exjyffcctkjtea2e46d6ay9xjf0l", "2106354162713295104"}, - {"evmos1wwmmzn5urmrmpanxazsp9mz8vfteff43gm6k8h", "4454143980788482048"}, - {"evmos1wwp3w0dd7s326tdaw4rfsurvcyuhvuw3wd43fq", "385971255853383680"}, - {"evmos1wwt5lhe0sek7acc5ap9u0efqqd3d00h49ewwnh", "105977402986873088"}, - {"evmos1wwuprjyzask76u9fqgpdep57329ufffuglwjmc", "9699191083668230144"}, - {"evmos1wwx6mg88dlepew2g0ee56yx6pj8xtvk0kw00nz", "10405090554751045632"}, - {"evmos1wx0zhf2ep0nwqjw6yx4egm6gmnsc0suxwkvtfs", "65869933188472832"}, - {"evmos1wx53hnpl9urkq9pq2s5pv84fcg4zzh78gahnw9", "2008465429410488064"}, - {"evmos1wx8a7d67ryct5wrg2t347ka0cvwl8tnxe7xdxp", "120795112137277440"}, - {"evmos1wx9ajsqj9y0p5g9g99wzr3pud5s289r88t4f7j", "1281508694067661824"}, - {"evmos1wx9jeqgsgy4sj68hhlyhlpen6msx8kzw8aa6dr", "17192716766329593856"}, - {"evmos1wxa063v2g6emaptvvnxlcfvytsx0n3k2auxvv4", "53715796260046848"}, - {"evmos1wxejpp5ps40gs26kn4tu7t4xc0wrjewxangczr", "384500541973383936"}, - {"evmos1wxfgcrk39gdyfwuqcgchzj5srkpy9j28kdy72v", "3775463338410360832"}, - {"evmos1wxjttz26qauqd6xdn7z62ff6nh4atyla59l23y", "2913916197084129280"}, - {"evmos1wxmqmsn8tkk0mred4tasflxpudyqs6s4xrl097", "385417978662724352"}, - {"evmos1wxmz7afzp74sdsfeu5plmqgsc089lqytfe5rlx", "3574702286764548096"}, - {"evmos1wxqg4t62n96za63j4dvht2npqqkvzal8yr4t4g", "34078771346429202432"}, - {"evmos1wxsszh0ujdfep957u4ckcyj4889l727d2vls2l", "5517983339422644224"}, - {"evmos1wxz28r8z00luwhr7hp7ce6z8c0mgckpupn5klr", "45917606645639856128"}, - {"evmos1wxzrhvv78kve5fxjff9awvgh6g5rsyty5wu0pw", "618012814290314496"}, - {"evmos1wy74d2fq6weprhntpncu850kjtjm9qj276qenh", "2354022343782728704"}, - {"evmos1wy9d23r94snjmakamjn65ualzz7knvn6mkngqc", "5051251180062523392"}, - {"evmos1wyehdsamvhncdk92pl8ll7eeguhj8e4x7cq9kc", "494384488744370176"}, - {"evmos1wyfe8lz6gldplrghkyejdy093el3yspke9qhev", "1697439264203055104"}, - {"evmos1wyfm232yu5ev7n4djw6x9gm8vr525ymajd92ty", "1859837872564142848"}, - {"evmos1wykkpgzzkqyza2lsjczwteehz5n9z9g039x0dy", "918752335682031616"}, - {"evmos1wykzalmvvwvx98ywx3796v069fqkath6fup2rz", "3121231714075295744"}, - {"evmos1wyq688q9892w8elaqy8a70mw767me00q75a3my", "13707236467942653952"}, - {"evmos1wyqke87tjvearagr2srwkaa6gplv0z80spn3yf", "8898105408175595520"}, - {"evmos1wyt3ldjdf0r4dmhnfu6y3amlwesusr37xv73ku", "6191480759396155392"}, - {"evmos1wyzmp035frx0gx5rg6j9z239dtaekxfh6s3s0y", "1550558677071833088"}, - {"evmos1wz297fytcg30j6mqvn2nr38svpunq0qdlumqts", "89173447226614528"}, - {"evmos1wz35d6la3jkunpeqzvd23ysdp84mkn0c06sjn0", "35777213237333065728"}, - {"evmos1wz3q3fl36lecc38xfj9dxykwf66pz82efruztw", "5975249845859205120"}, - {"evmos1wz5urnx9zawdhuxhqmej256wrzcu909a0s6m4p", "6377739784670216192"}, - {"evmos1wz77zjn87mx2eekj0urmtrykcmrtl8wrkl73ky", "56446793794448896"}, - {"evmos1wz7phq6vdr5sdt9aak8gcsqkt22sag6jr6emmv", "7497147527908791296"}, - {"evmos1wz8tga27l9ffrd9f24ppkrx6ft9qg4havfw77x", "2296135769904399360"}, - {"evmos1wzadxmh8360hujwlnzqp9ax2kx5jpkwyr06t34", "12995904936878968832"}, - {"evmos1wzc7tpz9dt2a3hy00tgtgyphfxzwre6jnapqpz", "811524836008941568"}, - {"evmos1wzccsq6jdl5h6eefn7ym0zwenrmxtjusksfjea", "722410662579231744"}, - {"evmos1wzcptv3j4dkz0j3jk2g2nm7xpymv0uwrqm9wu3", "703681791670057984"}, - {"evmos1wzf9j2a6ka57ke8aj69hq8u2updte7pupvgdze", "212863373350879035392"}, - {"evmos1wzg47whe76gcrxrqnu7ett6fkgu3cgpt478jh7", "783065450237274624"}, - {"evmos1wzk0fxjyraqydan82js2ku8exyj7jtsjnerqhw", "567709730368571904"}, - {"evmos1wzmfc9nd3es79xcqg7424ahytcrzg0qcl9l280", "20605927443144187904"}, - {"evmos1wzsc3zy62k0umv08lwtykw8szcv6d4uy0nhwmh", "625877095496638464"}, - {"evmos1wztnrqkethw02648u807na535zldqvv6jw8urg", "66117502949056768"}, - {"evmos1wzve8mymknc6lptkmjclr8m2qxdmvj95d00su6", "29198565267526656"}, - {"evmos1wzyqlf8hnusqkvx230ltnr279q05yegdktcvkq", "686165690809840128"}, - {"evmos1wzzcf5gmvx736qg57k5k3c3vjwc20kvlvz3jqv", "1326560584276862976"}, - {"evmos1x022haamn6zv0svxcq327328uhn32fg76hcm6h", "20698294997513658368"}, - {"evmos1x02gs2ayf0ffslkglctlzyx8s9grm5dr28h0wm", "1225327863969464320"}, - {"evmos1x03fa5tyruz4ujzfw7e6v904q3l22mkcq7q99p", "669742042409832960"}, - {"evmos1x04xxyahyddpfck8wd9qpev7xqd30ucmc3xj9v", "2095349030197558272"}, - {"evmos1x06zcsmnjd5y8enhf7hfn2eg95rlu2dzrawnm2", "336028390462972416"}, - {"evmos1x083g9n0qulqqevzrug9gcs0dvgh3awv869qnw", "25921097777104896"}, - {"evmos1x095gfs2w4jd8jkgmfdx6rllhjktlnl2e74n0m", "989125305098294144"}, - {"evmos1x0awa2wzfdsrar4avkvhgtatdxq6rjl5g4lu4l", "789484908240824320"}, - {"evmos1x0d3e7pgynxhfzyzljrefv4kwlvy5nq7mzgyu4", "1494381791446231296"}, - {"evmos1x0gaunlgfsr88fxwh8v7y6x4phqsehke5eshyq", "90546800702326636544"}, - {"evmos1x0h9dt3r57kmx7rm5z8cqsvvrcr2d5e2f5q7l0", "2770912048745871360"}, - {"evmos1x0kwq72e2wccdm7sxq898zlqcdk0helatvtyjh", "318239373465570816"}, - {"evmos1x0lny8ed584e2hxjpv3t98w7qjhmcjtyjcppp8", "65407035600228864"}, - {"evmos1x0mjpup5ew5f5lhku46uvkqpfaaly9j8hthqph", "55747464587320508416"}, - {"evmos1x0n20ha5ufjt9ecw4jys5rxyzrs9rpreecm72x", "190484006523115008"}, - {"evmos1x0pkmk8w9lyt3sgxuuq0py78h9c7hznszzlq85", "4995124379915410432"}, - {"evmos1x0r8wgrdscg6mxf2qvhhseuxkyw72ee5tlmx94", "1107398751948238336"}, - {"evmos1x0s8ww8n29rhxn3ufex54smqagq4qcaus4u2v6", "40485000928969744384"}, - {"evmos1x0t8xgqmhp87ep9052d5av23rs94h0pcjdz9y0", "414306174027734528"}, - {"evmos1x0umnu3t6agkz73mzzfcjdyjfkyr3la6fc05gc", "8003992513116932096"}, - {"evmos1x0v87f99as7tdxazrgftafaxzu350v2sjx8vhf", "6816860072433768448"}, - {"evmos1x0vudmh8xwrekmg9rmly0zzcyvufjtcey7ljrh", "11910176105251323904"}, - {"evmos1x0vz6s64mf3ngp56w6w4hl0kzfz33sf2vknemf", "1072721253848317440"}, - {"evmos1x0z0kj0y2e65hqajan3x2e4ep0p8x25l9gzq0w", "4877150595851358208"}, - {"evmos1x0zvw5fcr334vlvrycpljgc5jfhufhds7peeq0", "162091400693377536"}, - {"evmos1x0zzjmjul85dmeeezxhwm6fkfzte3nwwhhd80u", "2599803169561083904"}, - {"evmos1x209ax3882zcsew2jx3xz2tfpe6e3q0lxf7axe", "1790630403137256192"}, - {"evmos1x20jzqh9ez3v3vw0pmvx36am65cgzgaenwqw7y", "1029728265331378688"}, - {"evmos1x22534qhrkwnylsz3652utt48pwkp72m3mwrk3", "2480798320014285312"}, - {"evmos1x23pfstvxxv5katy38usjr5uyzexpt7lq2w3rg", "350718086065766144"}, - {"evmos1x252f75j5chjeg7yfgv7frat74zmc2285aenum", "1918771050247601152"}, - {"evmos1x25dptxz5ltgu437ur4t6r4xmjmwfaneuq8zml", "31234913568558252032"}, - {"evmos1x2ay3gsnjgjfqku0nvf9vvclpkarm2c3gvjwz8", "30938016224579608576"}, - {"evmos1x2c92yyxcwnk5dcarnhh3st6h23xgyj36zrkmu", "2990059427504517632"}, - {"evmos1x2cfu0y0wuqmuacl3s3gx6trdzxjpthpyp3zxh", "1450382769849760768"}, - {"evmos1x2czcv930nzqk3u9ctzqxef23ynqh906h2xunj", "19110709013585829888"}, - {"evmos1x2drf9pqr4scc4mgapnnpg4j49kj90z48uae0k", "7442469326194662400"}, - {"evmos1x2fmush3ra4hmeq36vyfvy8ztm8dd88kgc4njr", "12283262598502326272"}, - {"evmos1x2gl39rp5nqesxjhjs8jljaklapk9zydgqcerf", "463751836569105408"}, - {"evmos1x2h4wk5kw0jytqa09vjt499seecqvemazlpe6e", "1618078446656935936"}, - {"evmos1x2q8wcpmh0rt4vm9zrsxd3gaupnmet4dljymxe", "982743016194854912"}, - {"evmos1x2rsn8x24pck33r4st3356lp32sryw3vr24hcg", "1423784122552194560"}, - {"evmos1x2tmretr4r5d4s0lck98c7mga3rgy59wcwdzlq", "27347348552038400000"}, - {"evmos1x2tw8d5au5ch9j3f0syjuusnyq66thrxe6hjm2", "438705118377428224"}, - {"evmos1x2u4ar3hzpf02pm9jjewm45e77a5556pv7xyfq", "3376625115467101184"}, - {"evmos1x2uzvca0x7msc99dw4e2nm8rhslae9hsj8r4fd", "1070653983697070080"}, - {"evmos1x2wm0uzhx6pvgk3fnnq2xv3n869qrew55kve66", "1308155112066569216"}, - {"evmos1x2zq6n0gd8fldljxqckkkazcdj6fhxe334mldh", "703028664193291520"}, - {"evmos1x32dwdxkwz0dns57ulvknfwz3n9a0h9vsl4wyx", "201036456673230848"}, - {"evmos1x34tyk2ee3gn22ryn2cw9xyve26fy06a28p8lg", "656491016025710592"}, - {"evmos1x368upsvmxqp7kzav33vm89ccsp7x8xc23zwcm", "33674519214368063488"}, - {"evmos1x3ckjfva7vgynyyhywxe062dljrqn2mjk0zwmh", "4246212344519064064"}, - {"evmos1x3e876amg5qraltuv839fpcnc2y9qptz0s9tmj", "1085918214444397184"}, - {"evmos1x3ffz2udr40ghhcccssur4sttfckx6xs5zjuxk", "3222514123363003904"}, - {"evmos1x3hfte4h6kexdw0l7mfw0kk7lpyn80l9s0vrwm", "8426022002775254016"}, - {"evmos1x3huk9lucxg3ffedxghgxej7shg7vfc2fykqr5", "3770798899280651264"}, - {"evmos1x3jjkkdecpvjfccwqq2fnq5yfnws46errcps7j", "1617552160272803840"}, - {"evmos1x3lr4apmkc4wt9tf6ztrpsfg0uf4cl9673xwe4", "29132649047199744000"}, - {"evmos1x3m8fawp47ngs002dj9hgrtc58sms2yjgvl4dd", "385967177163980544"}, - {"evmos1x3mc392eerem957nhcztq76jhm09e2ss7vyln7", "26235672958416896000"}, - {"evmos1x3p7qh4ttngfzus7ly7tlklmz4lkkutll2qmed", "991453497879657472"}, - {"evmos1x3paqwfepadcmwhz6673zaw3jrjgm3ffa0nczr", "45088557877252259840"}, - {"evmos1x3qw0gkmxt5deulsl4me8z4cvlle7fwgw88ud9", "1926094839103063552"}, - {"evmos1x3u5tck2ve2skfvq250eavkqp5xewl973yqpfq", "929180425002068992"}, - {"evmos1x3uzfh80faar88y2u7hcvq097xmnzu4uxcaast", "1413457002724333568"}, - {"evmos1x3xmf9lqauq8krypwv3c5nsd6nxqehlkx0pgfq", "36798723932265472"}, - {"evmos1x3zyrlvdzgkjh32mdnxp5m6usqfd94zxz5m6vg", "820620230603151360"}, - {"evmos1x47eyeh4ynmtuh3anh5uf56y4g02r99ccrt4mr", "579483980670533632"}, - {"evmos1x47sufmspax4hn7ewhkzf7w4f0z082lt3ag4t6", "60679338013795549184"}, - {"evmos1x48z5jgvlv3e6duhnr0z2tn5x64lz5p2pfnwx3", "3780323853112342528"}, - {"evmos1x4anrtara4h29dfg9hvpsp9wxffsjw3w6wdtse", "7925383947962449920"}, - {"evmos1x4hzlnfwfk7dgjz6mzgn0msuu3dgjxqlyglrj3", "467999316600645632"}, - {"evmos1x4nnr62gyjvavx8e0rxul3sg926v25gxvlqgye", "1554146225872077568"}, - {"evmos1x4tlpzx37sr7y7sqwtwsnrjnvrjv6tayr2hqgl", "4028980885718835200"}, - {"evmos1x4x08dkk869nn6mwxlwm6ww4clzcu5ym6l92g9", "1004560442540260352"}, - {"evmos1x4z9402uwyc26crffpkvt6qh4hr5h4k95926ad", "223781894667147264"}, - {"evmos1x4zew0ytqha98r2tynxqqlqq80jdahhnaqejph", "853048416504955392"}, - {"evmos1x550pfmlhgnh53cs4vlxc4fdd9p7edm7f4n0j0", "965533301287628800"}, - {"evmos1x56ehue5jlkrzhvy956tt90csnye5lndt0naaq", "11274732666563446784"}, - {"evmos1x58enfdjv4j8c0yrxd3gjrwkc55fyqyyhrd2v0", "629938415610937344"}, - {"evmos1x58t2ka27nl4g2vtp8t6l7eyj63cynwm5h43fa", "315881388145417728"}, - {"evmos1x58t95lvzv7f3sj2yd9aznne5a25xtqarrankq", "37631644244858363904"}, - {"evmos1x599nx6nk2gsnhxuc3vuk3dytryjc56at3fx0j", "1895008415732637952"}, - {"evmos1x59khscngqu3jh56x4nr5k2r75knxu6wtuf6vp", "322106997651571968"}, - {"evmos1x59lh6r7l62ecqd280e4xvwa9e38dvykzrkpw8", "2249813432067141632"}, - {"evmos1x5d2suc5lcllshk38v507efggy7uzeruslm2xe", "20210584356356554752"}, - {"evmos1x5deunhx0hc7mduna89c9xwfa40n6ve38jnf9l", "20511141445959540736"}, - {"evmos1x5dzhddyp388aexfp3py6gvzmkc69z2eq3ue66", "2616054409979502592"}, - {"evmos1x5jenhrxks8ndky0e44hden0prtkjlcgyuetlj", "32160399582904852480"}, - {"evmos1x5k0uhrpmsd3vjrk9733ep6acu72zgq477wjkd", "407332700737220096"}, - {"evmos1x5nret3vsdkc32tqzyynxdnmcfdcl98hk0gtw6", "1540313093956829184"}, - {"evmos1x5p986gt6gz7arcd48ap9rfvqq7f8mxcsvf85n", "855185245324341248"}, - {"evmos1x5s2twvr2kutx0ewv264zqlpdjjuzasn0rdxjp", "454269529084764416"}, - {"evmos1x5vzevvnz0nmxx0epf20dpkys2jnduzm4caepz", "42110458747363835904"}, - {"evmos1x5wrwz9wnm9wzyac8efvecsccn57ln8egwa9sd", "7438717255108558848"}, - {"evmos1x5wufj7w506rpa2ed766ep9687lyy72ft8zn08", "6405697040143302656"}, - {"evmos1x5xz8cc265ksjuu3lvw9tadzc4mua6edzfhkqn", "2938431355973931520"}, - {"evmos1x5zlpequppq7wnwfkchs480arm2ay4v49lqr8c", "98925032240748032"}, - {"evmos1x60acs4d6ksjx4zah4fqmja8snghyee3enuxys", "5473468792325120"}, - {"evmos1x63c9rztfys5vm36fk8gt2agjpaz9n6j3mu0ld", "1637250407176436992"}, - {"evmos1x6874mrw5hd3ylcd4wnq8r80d3up25wwm3du7l", "10374905315435741184"}, - {"evmos1x6ane99k08hd7crkaulys8xn0h5ke4m7ejlau6", "3234984997842211840"}, - {"evmos1x6aszpzr8cxfdnrtme4y89xvfhjwyvxvw0wm4j", "14877861410227111936"}, - {"evmos1x6f64xawnpcc8qmzj6t8phjk0hpr2tjldhwrzh", "3064693193453879296"}, - {"evmos1x6geuwrtddpmrurzm6qxnprgm476h0czctmxju", "99833323578655232"}, - {"evmos1x6n0daprw798r77kx5yp7nhyflc4h8t2qdfgyf", "6080924266705507328"}, - {"evmos1x6n7sf35zxs8ajlek0xclxxcejtk2d979nndj5", "1616176978612094976"}, - {"evmos1x6rx06ywdxzf4rj26tdmcu085z5rs8e3ev77ll", "4762271368851902464"}, - {"evmos1x6ty75ecjmn7w22v4d7llue0vjycvdu2df76sn", "8875470468459581440"}, - {"evmos1x6vc0hkdymdjkukpyx82v6ft0877qnfyh3uvvn", "10389776262463248384"}, - {"evmos1x6wj6xmp8nhq6gp65tvmv6t02jscgqrl6rrq9e", "476401766217570560"}, - {"evmos1x6yls0dsuh85qzhsc89pvqkqq7009tq3lkxry4", "17455278612487174144"}, - {"evmos1x6zjy000f623rkmf6nd2ed0mag4kcj2wrqecl6", "4558198730734689792"}, - {"evmos1x6znp2a6e6zdxa0q6e9jt6ax3y45xemr3turfg", "1673965611335488512"}, - {"evmos1x70u6l9attr9tj8e4q3y2dx5ek89mylwfzwl2q", "4464909113974439936"}, - {"evmos1x7222tsnuf8am8kxn5343syevrdkskgeyzsund", "2467974503606633472"}, - {"evmos1x72q38eknvnkw0g62af79r59hq4p0knt09hs92", "8632770503462664192"}, - {"evmos1x763qjaxsg0nm2n685jdavtqfnxtdqhydzhuvt", "3777337390418944"}, - {"evmos1x76gg8yc9syjwnesf3uqqkkvvd7szmpy5q69qa", "367146471257815552"}, - {"evmos1x76x3cw5v9kk4flctpzq0gycrnayd6vl02pqf3", "2434738857097269248"}, - {"evmos1x77yym2263m3wxpdsad95f8tmtapf0sm7jtkhq", "19706341190910345216"}, - {"evmos1x782qh3pzq9xwqmqj3vae9g5ujr7u52827q0jr", "6631017640216960000"}, - {"evmos1x78d3lu5zdq6pfdlgl3gm25tgnkrxwfzuav4m9", "3954469243472924672"}, - {"evmos1x7cayl3t209w97gzmtcla9qy6slsdpkradlv79", "1977701773518407680"}, - {"evmos1x7cgdavf3c49te4e4hhzge67z3ekcd6gg2l2l5", "496493395198305280"}, - {"evmos1x7dxd885ydzglw8skddz9wkdrrrj9k98zx3lsq", "2504082050512746496"}, - {"evmos1x7gv66jq4w6juluefgstgg22cg4lf0fw9kppw0", "261574563788525568"}, - {"evmos1x7l25hwhxz58070m7er54gaptp267grkqdutjh", "2753175928405629952"}, - {"evmos1x7lrxt6j8ltmrsxygxxegnn6yz8r32rdm7snte", "34744300808717955072"}, - {"evmos1x7pycuwqf2jn068lu68certkwg5xprh9r05a5r", "3796050072870341120"}, - {"evmos1x7pzwqdsr589tu9ujrtu0xyzxvn54a3ypgkfd3", "6783564432001743872"}, - {"evmos1x7r5afu9ak3mp2rxjgwsrqr02ulah00ywmsx20", "3342586760686214144"}, - {"evmos1x7rg6vw6dzxeqv7zkfdvrrh4au9dym0f6l03xz", "477648581946873344"}, - {"evmos1x7tv49e8c8wxd32sxycs9q05e4l8few8th6dwt", "5791505648897273856"}, - {"evmos1x7v5ntd36w2avw0ug26xm9k82ljfqmuuyxpak6", "32677467559668178944"}, - {"evmos1x7w5famkzy7hgs5e7esff5p3s442cutdea9dxu", "19771761036079104"}, - {"evmos1x7z8hmlpjcs0f0gl8mmygtputc6zdmrctt6l37", "13482091794056593408"}, - {"evmos1x84sdrm27vfg9ataaj4d3pex5672vkvplf0k02", "1892460029334554624"}, - {"evmos1x856ng2cmzrz30hlkt0msvvkzh3h0m0s033kg2", "11014269359691190272"}, - {"evmos1x85ctd8h4a450y2g6fsrpxmmem80p7nmal32za", "51965209537045086208"}, - {"evmos1x85uxnvf2j6vzkrvau467u526l2nzcy3fsttpj", "1716874454585036800"}, - {"evmos1x87qtg8hlphmeu7jestssllzc5qey0vewfyu25", "410852930949772800"}, - {"evmos1x8e78a9ghxcynx0mpgl8d2j2dxkzsw8ffjwd96", "2721325660833438720"}, - {"evmos1x8ejl6tsf6ewvpjt49fj9h6rq73ekn4wlrjgq6", "2044835373222672896"}, - {"evmos1x8esy7ehvqlmmcxjr4gyl8n34n6vvrwmqprd8l", "10561009772669952000"}, - {"evmos1x8fmdh9anmgavs2a6h923rvcd4l89k5mqnwg6r", "8803260104304779264"}, - {"evmos1x8gh86nxl28m5w9nmkme3swppx8n46x9gjc2kd", "1311861376925421568"}, - {"evmos1x8hzl584zgpaqvse6kvcexl4jdfxtgzm4ayajs", "2901253330949906944"}, - {"evmos1x8j6ww5el49shvzv9zvj4p96hxg79zxqcskdqr", "19019155468587679744"}, - {"evmos1x8jdkv039h09ycdrkscgny8emzj6p6sfydeggt", "80124631855084912640"}, - {"evmos1x8jzm2nzq0xq6fv6rqvu4dwyl4wpy0dmqmf7gh", "10496137460364242944"}, - {"evmos1x8l2j9e7t6qrdsjrmv2mjtz6940sezkd9v04ts", "3937951933365534720"}, - {"evmos1x8ld9lhkz2qrcuf9xct0wqsu5eqzd9tvedtqq3", "1427537792701470208"}, - {"evmos1x8m9efky73lvqq39t0rmg27thprrswnl2mjd0l", "384031400921930240"}, - {"evmos1x8mhzsa7l8wgzuttpalzrfnccfxnat0pzvdr2g", "4921841686072756224"}, - {"evmos1x8ms92anr7e65me8wl0qyqmxrnxvc7zsqcttr6", "390910210502154752"}, - {"evmos1x8ptpguczjx9lrttawky4a09m048nlc89w0rgy", "192334835834863616"}, - {"evmos1x8r25ew4dzpp5dzcsqggkdkz55am8z4kp6m92y", "478607571873951744"}, - {"evmos1x8rqvj5030xxgpn89hs4v0h8p9ml4g2l2v94c5", "1171183816025522176"}, - {"evmos1x8v8hprk583c2e396vnr80uh030v4f3dz6aw69", "70451850915997440"}, - {"evmos1x8wctmaeksu0zp0gsgj8ecyylscnf33g29xvw6", "738251031215034368"}, - {"evmos1x8z3geajrultsegcemczfhyldr63na4c69dk6n", "3986426219863943168"}, - {"evmos1x8zq39qy5jrcas97sshzy7mjd6wk9ka85s6vrr", "5300806058137546752"}, - {"evmos1x90cp3724jl8lvwpfej6vdxm3x3n493hz4phph", "723903492197029120"}, - {"evmos1x92gh0wa3ck6q6pukx0cgl2wf92zpygezn0s5l", "2503854221965334528"}, - {"evmos1x952jv6vjyrtej28kjkqsx8tzcfmj8ny4ev5el", "11187695494647445504"}, - {"evmos1x96zy8fv253484kmu7gz4r2zln3urjj56qwhug", "186715930258136064"}, - {"evmos1x97f7nyvhen6tkuj49nykt69twqupdv9e8u7m2", "463900952133212160"}, - {"evmos1x98yxn9u3mzflclq833qjj9hl4dy6awmt739n9", "2009432642466889728"}, - {"evmos1x9d27fn2w0569xjqdc7xenpzvv0hth4eszpj9s", "4679893608610168832"}, - {"evmos1x9dkwd9s06anffxs2n49y3kquhnm3vytvr97wd", "445059716587543552"}, - {"evmos1x9ev3zxlw3ygny9jyeja3h5p78anfafwlkjzzc", "1491498910649311232"}, - {"evmos1x9gkn8gy6fmz6vcuasmqk5szuvdyt75qenpth7", "701323176570294016"}, - {"evmos1x9hj0chth3nztlxawf7crga686seeasaf5hnt6", "1700506652546928896"}, - {"evmos1x9ms482a0z69xw9xdvvyqwn98l48wuxp8eqynh", "320434076507797248"}, - {"evmos1x9nj52q5mu32pzktfc3x468f9weghtv88fg393", "3045765370608548352"}, - {"evmos1x9pujh67kpuueqlk7x3e6asxfe93unnlw9ndps", "38637387103048646656"}, - {"evmos1x9qhjcdlpg8844w9lwu06gvkz8ewcgv4gmfcaa", "1638650278212882432"}, - {"evmos1x9qleme0e78duprslc44476f0g8hqypde2u6da", "6151986571640471552"}, - {"evmos1x9ssgkgvyhf20munt2e5ylkcykkwjwjy5w7rhz", "2653388793020475392"}, - {"evmos1x9u9a25k0g75lmgfskgtl0tut35hsmc0fegfng", "3397726789498949632"}, - {"evmos1x9wd3dzh8u84rmr75jmelhg6zecxjwsyfcvvle", "22133876069790334976"}, - {"evmos1xa045ay8nj7edcelq8dyrejruwu5fyv4fcg25e", "114697380647145472"}, - {"evmos1xa3rdwp80w7jddck8jh5surfrsm7w5g8jqgpus", "29986524917632000"}, - {"evmos1xa3yp0j2herefhtx8vs3802qaqrhc4f2xn42ut", "108111946468141334528"}, - {"evmos1xa5a5vrnnw4zpc93h6kmtrdsssk7wxhl0pstev", "724142684237097984"}, - {"evmos1xa7ccej2xufns9n46xfda27760s8se48sv55ay", "4238628192260161536"}, - {"evmos1xa7qanznkqv6mnkmlswnjweh2j9sjz255r4dl6", "64528599564157673472"}, - {"evmos1xadazjh37ngvqsh6fcpy3nkq4688jrameh3rmg", "106634245019111424"}, - {"evmos1xafmj8dmey7udjfaepkt640k6ld7qsl8jta5dy", "4142623940567013376"}, - {"evmos1xahehq3ca57gc68ehx0jw78tmqsngtvq4lh8uw", "30394843268039909376"}, - {"evmos1xalq794mgtyx6t58lau7x44k600269sxmqd40d", "11288507390284304384"}, - {"evmos1xan5tp8w7g9365y2am9m0w8duf2657rhezlekh", "45006788141457152"}, - {"evmos1xaqfrx4nvj0n0l3ecwx8p3nmujejxhlmer85jz", "43611899518994956288"}, - {"evmos1xatcp9mjhzvqs8cq7lltrnfletmh2g3n6xpf85", "43554348102566379520"}, - {"evmos1xatem66sus7yy073gs6z0cfhdfng2fr74xec5d", "413885176500034304"}, - {"evmos1xawaghpsmtfm87skp69y4wu4xtwey85py6sdc0", "111325877978454147072"}, - {"evmos1xax5zrcwmags2c4w6ct73hs2g7a0tntqemxht3", "5645331421088415744"}, - {"evmos1xax6238p9a7le0hgtaw6n2zp7vm5x69mmz7qw9", "2960958890316879872"}, - {"evmos1xaye8e2lxj4p69w2vkqztrhuzr7dnf9dqss8x8", "845709485892003328"}, - {"evmos1xayef2uv8wm972lm8hlmwz6wkyngcd7hvc43nz", "1846502692541010944"}, - {"evmos1xaznfhsal59sl9jkqrvg0azj7up4agytp2vqnx", "12744789502568087552"}, - {"evmos1xc2hry3f6mp6t4lv0nrvxpeyn8fre5rtqxz7wj", "1549730406061817856"}, - {"evmos1xc45kqxvrz22qgyprj2fwxgzxsykwxf7dfujz3", "950077278832109568"}, - {"evmos1xc4glgxrcm8hkfytw7rfwx9xfc8k6pgjn05k3z", "3573747425909213184"}, - {"evmos1xc4vn468z5c48n6sp60ksxryale6d40hjl75qy", "19242543863008202752"}, - {"evmos1xc7kq72rnlc9wdtrq3qkl009pzl4vwpv0fwr50", "10653842583357220864"}, - {"evmos1xc8rgtkwvwsp6ku0w7j7wha6lmw72ct25ukjhs", "38735573987967434752"}, - {"evmos1xc9dgsmlfsf5qdxzj7c0amhy6vjvznkaa5neg3", "996803241135861760"}, - {"evmos1xccle2eccw60kg6q6ma9z0xvxsn9e272cqge2f", "10431643491412324352"}, - {"evmos1xccwudyfjwqawxakxjw04kht6eapuh75v0mlxl", "217664140668733440"}, - {"evmos1xcfl2ve0wn8mat7f5ng2rc3e7ehzg963trzaq6", "4018155110660377600"}, - {"evmos1xcg5tskktr5uvmympdfgnewjpchf2fle507rhz", "576338646596758016"}, - {"evmos1xcptjqhq0kc6l9v6nt7c36mstpu5h5q8x5t8rh", "1904376113397653504"}, - {"evmos1xcrw9vltdw0pl9ed3w5sctesfalvrfphqk2g09", "309466150007620352"}, - {"evmos1xcscguzr5vacsenpqyqj5sz2x8p8m0pffezwc2", "69555965826756378624"}, - {"evmos1xcswmqekf757y4kap0yesj3c8juptnj09unl63", "42726453015753984"}, - {"evmos1xcw5zxyxuc0uvzkjwwrr3zgje4eh8rua42d7nt", "2621702471692933120"}, - {"evmos1xcxaeda06y543nnul2m9rpfqfknu207v2kpf8y", "45728174877120757760"}, - {"evmos1xd7yecgy5qch68mt6960k7eukq8nq2epuatc26", "3750883313386850304"}, - {"evmos1xdagz3k5phqk7egnvnhwgvc625zqsuu6ffdu8x", "1022522888412416"}, - {"evmos1xdaw24jkd7c2aslqqpezfj949k2pa0l5uel50d", "36807640764720652288"}, - {"evmos1xdc80rmw6974x2z00mk8wxseett836f3pam7vj", "387930278080124160"}, - {"evmos1xdcz9jylxgvszz3m7qr7hcmt7mk759gsyjm8rj", "1928444644104611328"}, - {"evmos1xdhntpjrvqkufx7pval4w7240thupk0xsn4rre", "1462332112746971136"}, - {"evmos1xdlvqgdvappw85k8dyceyx2z6yy5t4d6xtjgle", "10456478005432356864"}, - {"evmos1xdmppt64mnfhehptu0mk7mym9dfjhf3dl0x8x6", "7045127398391676928"}, - {"evmos1xdq2nt2nzjlmp8ysz8w2uu5fwajlsdmcm384v9", "1158695897402990080"}, - {"evmos1xdq3jgsmlatf97n0wnythp9mjfp3x3w2a2zj2c", "984968834279998976"}, - {"evmos1xdrpknpxwxgtxuzwet4022nttcn3hjsgj4zvkl", "1771792132517130240"}, - {"evmos1xdszjhdczms574n0f2lqm0cftukqwm3ys4aztu", "842029932734406656"}, - {"evmos1xe236da72l4v3lj7r4pgj82l9dx7l8p7n3tm43", "10799813501366112256"}, - {"evmos1xe2sgv5ta36gyredvdp4uhvr5vnjt34k6nw5ft", "853093509750100480"}, - {"evmos1xe47grluhame2ulalvk5y6na3e48rg7wvqpfyn", "18452149290507829248"}, - {"evmos1xe80ay5yp23z9pn8t8wyunf95k8vspm4chl7z6", "3446855345193623040"}, - {"evmos1xe89jg7lk6enclj99ej4muudqeg5v0c29y3htd", "294410494376978944"}, - {"evmos1xe8hlk29hrrkc0rh66kz20clagaktcqdrkl6pv", "703631328085947392"}, - {"evmos1xe9wrmtkk7m87lvq2vheecnc5cpkguk60s9mcy", "1544784296257945600"}, - {"evmos1xeadg5np3gvgzw8fkdvml7mlv68plgkv5aayne", "1242616742571092992"}, - {"evmos1xeedpmhyemzvarc708s2krn5c09a2mvfh0xhmc", "99023582294849792"}, - {"evmos1xefa62vltpk5sreu6ta6j4xt9aqx5za4nfedlw", "2290148936118267392"}, - {"evmos1xehnkz25vjg7y89rep94eeympct3xnfvjgzl2m", "27098418909305864192"}, - {"evmos1xejafpgxa47pcfs0wu4ardrnw8zrca03ulhf5g", "217275176215332096"}, - {"evmos1xeje0v9q0wlfnnuy33t259gazwh3str6wgnwg6", "1289431072682429440"}, - {"evmos1xek8a7f3l87cyav3r4eq792g8y7dyavyk8y8xa", "385587532297596672"}, - {"evmos1xelfcwkqu2xp2dk42q77w2l75f86fmv2xu9tul", "2338111010260696064"}, - {"evmos1xetpf36gpsnzs7m7d7rrfh4suc5pyjuy3lhh0m", "27892606449767759872"}, - {"evmos1xeuaf8r5ucwnzvjmz4ax67uy4mnvp0a5gljv2j", "172923084234473472"}, - {"evmos1xew5lrkkgvmcwfqxr268nf3gktjvjl0s3zfewh", "218447149407737344"}, - {"evmos1xey2da0sxzytxyv4hgwj4445fv43zn22yaed7f", "754431171912196608"}, - {"evmos1xezchzcqpuc5hwcgakqmaasly3reqyndljhc83", "384312444528233984"}, - {"evmos1xezhhk9r5lkl476pzx0hflgh0haqlefefaaqrn", "274532758748837888"}, - {"evmos1xezvrrgjsxjypncc22264nry3jpq6kaa068nju", "849995514822758656"}, - {"evmos1xf5ju3dg3anp4767mhqeyn5wy88fqz67zmwka7", "1283456701745387520"}, - {"evmos1xf8cpq59hkgrdthkckd0y8hxx4wmwjcptf5xaf", "8640170576341064704"}, - {"evmos1xf9749yzcdyzfqcyxhc6naf8w63zw87x78eav3", "7155301272779100160"}, - {"evmos1xfafdvtqy0dq49gj07h4udhhn62wcqjsqmett0", "11904242025051570176"}, - {"evmos1xfdn307e38kc2pu3x4tnur3krjn69azw2qy3vr", "117052738140030976"}, - {"evmos1xfejtn90x4ag3ktgnxvpf488nm46h24w2rh8dm", "32264330440355483648"}, - {"evmos1xffala0ua2pdxwnq3kdz0s2tr8jnpk8fzm9yj3", "574172500934205440"}, - {"evmos1xfh4fgs4j4lnmadu2secf6z20eke0jz5pa8j0a", "3429892807355420672"}, - {"evmos1xfk0e39hh8epcrn7ee5lhqjqp2q6swdum4uh4z", "3896932906562461696"}, - {"evmos1xfk8jn9jlt9n808f5zd4felkdzzc3nvefcj66c", "2219070142808815616"}, - {"evmos1xfnj4a8dcy70r26a4dk9ekja7uddxk234j5gpg", "23736669610901626880"}, - {"evmos1xfnnq73n2y2lczvdh6fcxj507r2zp0nrfdt9sn", "34194053673547210752"}, - {"evmos1xfra4yc8y8ad73nae74zuggl5vynsym355xy92", "15305861525602238464"}, - {"evmos1xfsp98xpx504ypeqzywd8c24dmqqh46j4jner0", "384506614960179712"}, - {"evmos1xfvu7tmp0v9qj8fsrw2vazks7zahu5zfld5vsr", "138050300498020352"}, - {"evmos1xfxlh3am7xz0lvv53q0s5s5jc2p633q539tyjw", "3023523764967207936"}, - {"evmos1xfyxqx54kn49009w5llnus38lg2awz6vvcwpcd", "8776455765344835584"}, - {"evmos1xg0rf4u76junz0tqxzqytlwhvf7fszc0ptu4d4", "2769326436536762368"}, - {"evmos1xg0z5txhfrxytv3qcgdfz4d80jdu057gkkvc50", "8978101654848178176"}, - {"evmos1xg39tg70syqm8y64sl334pl7e4t5k08xhx5d3g", "3400861797516632576"}, - {"evmos1xg3lqy6s5v8r6qee4ctwktcnpnj7auc7pj28f9", "854160459263494656"}, - {"evmos1xg45ds0t7h0j7vvam3786gywjna02mes9zkq3r", "19248132334486888448"}, - {"evmos1xg4q5g8yytus8xgffn84dr24csm6xpd0hp8fds", "415812894130289152"}, - {"evmos1xg9d5w7gvtnwqrj5zkujea9k8v4kgcetec9wj5", "386944896669301760"}, - {"evmos1xg9qx35590hft2lmdrcf6j05nuf8we409fggn7", "834377805189931008"}, - {"evmos1xgc5mnwc8fc323vx7x2lu55da640h9pudz9gw9", "5010104413412597760"}, - {"evmos1xgcap7ae7ql2m3azy9cee8tlnqrx8sattuxpm8", "6945735009375531008"}, - {"evmos1xgckuwlw9s6kt2k40wdhw4th93nxdz98angluq", "7390816446339452928"}, - {"evmos1xge2uast6yp2ak3c8wltq5f2lqp8u5g4xvtjea", "11197519525304141824"}, - {"evmos1xge8n4tehqe2ynm8tg6cap6u5z5y6pgtqe8hdp", "5234901347300409344"}, - {"evmos1xgh4q7p4jq98rxnhvrufjktn7hxxw7t9rck00d", "6998183340465813504"}, - {"evmos1xghp9pznalv35nqnzasan4f4lahqenvs3lppqm", "39032394515705020416"}, - {"evmos1xgmgfqdwz2gyu4k99hl5ruumxz92wm0mug7vl9", "472475710169632768"}, - {"evmos1xgnc34tjjwfwcdhmm3tx6ku0m7udv3u4q2zsfg", "21368105878718689280"}, - {"evmos1xgnk6epxe0ydug6rt65j59jzdh7p2nuq7yuhp9", "48556990112126720"}, - {"evmos1xgnk6g2ts4lslwmg2pcm8wwlyphuptmgxr97j0", "195256109758256128"}, - {"evmos1xgnw3rurlgujzcwgwnr4d8dap9lld86pmwv7t5", "2421830366940719104"}, - {"evmos1xgpl5quzlw7pgsn844kq8d5f6k69grt7n90n0u", "465667197922323968"}, - {"evmos1xgsewpl27chgzskwz3lqpuxy775ne7snmgwdte", "13926132188707610624"}, - {"evmos1xgssvul9pt62mfjzj29zhuj78t2qkflzejmr25", "161915026573016064"}, - {"evmos1xgtu6qux9epkn6zdxhar9m6tv3dfnmrj86gcl4", "22946375691441029120"}, - {"evmos1xguwfkajtml0chgqvf8efx7ypece5me8x6eph8", "418292940093935104"}, - {"evmos1xguxzzc6zqa464twds3yv0p4a75gkk9r5hnq80", "105956270676839825408"}, - {"evmos1xgw94m70vma556jv8zp436q5hdtz84wk3nwdc3", "8483159075278919680"}, - {"evmos1xgwtf2xugg53yf0pfx50l5hj07m3jekhnq6v6w", "995356032567336960"}, - {"evmos1xgz0lergfqln8lu5cncsdde627n4s54d7cx7qy", "1384883028902274816"}, - {"evmos1xgz6utaww82vg55u3f93cmdh4uy5fwtq2qrt0c", "11872479479061078016"}, - {"evmos1xgze4zt52gj5hn8uyhhxf96cx6dw5fsl2n0lpd", "1402897324418891520"}, - {"evmos1xh28arrf8966yvddz34utruqzvrlg5sxev9yqt", "2890814899793739776"}, - {"evmos1xh2cvejf4r0y7nk39dhnx2ch4tlzgt7fz96jep", "1071732272062085632"}, - {"evmos1xh33r9zkksn3c6sfmjn08x493rvq6yr4t2w4fy", "5189945416231621632"}, - {"evmos1xh6me6u72598h6jqfvv4svztfdekpqvrvacgg9", "2635563097391526912"}, - {"evmos1xh79n8ck4c2uh9xxj6x5jjpc9z8d692hr0k06p", "3036019004051111936"}, - {"evmos1xhcekjxvgtekc52mzkwsywapftt6zaqer76chr", "384250708673831168"}, - {"evmos1xhfn4vg4zcyf0eveggmgu0mkl0jrc63c9yh39n", "679123052888263168"}, - {"evmos1xhhknfjrytq3t9zcar2mhdjxps8l2ax92ugpjj", "996841710661746688"}, - {"evmos1xhjvrt6gj0d9wxcg0ervwsf805l5l05dm0578p", "2467464132234730496"}, - {"evmos1xhprk9ahlgulhzse7jgdteya3yls7m8dxh6x0j", "22334938143132811264"}, - {"evmos1xhrp8zys5kel9t7x7zqk77003qv8uq9pdlm6zd", "10108201094749999104"}, - {"evmos1xhsaulm5lsddv97cjalxs977pu37c9nejfka6z", "1147419261356835840"}, - {"evmos1xhskx4r0nuvax53pe72aaqfrfrxfhwvmzkcv0s", "314469524211286016"}, - {"evmos1xhuq8g4dzsa9d9kzf4xdp30v0wl9sfsl5xrj9p", "2323125534462620160"}, - {"evmos1xhxe38c828gu8e20elzye4gf8297ygmzzwknpz", "2486904746844128768"}, - {"evmos1xj00peqepk0xquzd3pmte23guy0emxgdqtedms", "5057679170423414784"}, - {"evmos1xj0nhd8lssffup3g60xuf64hr5pa7fd8aw43g6", "826345575249567744"}, - {"evmos1xj0x3v2t90n79h0wu8ud3s9pujp8wjtll947uv", "279363266550168576"}, - {"evmos1xj59snryjn8976nq7qzv2pfsv0x96707y99l3h", "109498260094015438848"}, - {"evmos1xj699xuq2jlhxeuvrk0deps5j4gr5ypfc59zcu", "505218255365854720"}, - {"evmos1xj7npq9h4nct7v5mxnge96zztf2zenvj3ae37c", "468046420199879168"}, - {"evmos1xj8xkm70ysq9ka9c9wchway9gnxad2rvshh3yh", "19824778043423096832"}, - {"evmos1xj9vvfsxra9e9duytuc0rngrnwtdre94tn6d7a", "183795360217571328"}, - {"evmos1xje50nw32mg7xupfe2jz2a9nrls40kek00r9c3", "3226384737264740352"}, - {"evmos1xjgjdxf032lt8ru9tx974jacyyf7m8pqwsrxgr", "1067512170260279808"}, - {"evmos1xjhvssu3keszua3yxc7lshh7q2sl7d04z9ke96", "1527279607770299392"}, - {"evmos1xjkgvt2y3ss4d9p4zewmsh0ec3lr4n9pytc5pd", "10477347683630014464"}, - {"evmos1xjqhw659hadfaegjk40du87e2xqz82uqgldnwp", "127083592049822990336"}, - {"evmos1xjrgakpczk4220x3lpgr904wueu2n6x70zvht5", "4365060896912056320"}, - {"evmos1xjrl97tctet3mxxglps8a4n7wtd0726ts45d67", "12104812284803391488"}, - {"evmos1xjuch50aexwd4p8n5pr2lkdmrxqyh3785mwyux", "4772702693451874304"}, - {"evmos1xjum82yd6505cfe0e7kk8lhgtxnh3mq0npshfc", "631462786273238528"}, - {"evmos1xjw5w936uk6km7zx65rzqqmuug4zpkr2s2c0lw", "86607525080875264"}, - {"evmos1xjwavm24tgnd3y8khwvkau02m70kt0wnh2qyp5", "12928265320997470208"}, - {"evmos1xk0gqzj29yg7jqqcanxtgaak5kxgyyhjcz44kk", "1563840041635430400"}, - {"evmos1xk0sfqw28x86atmzxjcgtfhd5g04esjq0pl6rr", "1320715358403127040"}, - {"evmos1xk2lgtx2ec974ggrym776dsj5dzethpkwhwlym", "2197261020439666688"}, - {"evmos1xk3kr9yzkmprfgvxsrn4tsrkwyg0g57hy3ldea", "4558298192804380672"}, - {"evmos1xk8qkrzxzmdymadc33gmm5dptwzr6gvcmw6j75", "648698241330896896"}, - {"evmos1xk94cy23mw3dkqhy9gxv6yp2j9ycq258tfvqee", "4357944836294828032"}, - {"evmos1xkd0egt0u97l80hax4snhftaew08gjnnvfh9pa", "1519921223658483712"}, - {"evmos1xkgd5e8vc85uuu29unhkafeqvtszgrk9rhlm7w", "6509093058445770752"}, - {"evmos1xkgzrgxdq3ww06e2tazwd8052g2djg0puhrj0a", "4672052697927299072"}, - {"evmos1xkjmfrg8ndy0a0nd5e3tvm6arjqw7zj93a7ahc", "280049489277923622912"}, - {"evmos1xkkum38npxgzs9yqk97gpsdkft0u704drph8sk", "8484637511727423488"}, - {"evmos1xklvn3us5hmzesx8ef8ffxxgeljz9mmu5nyyxj", "2358231230437870592"}, - {"evmos1xknq8jnk25xwg35pvalz4s06g4vyww30ddetke", "3206214592204965376"}, - {"evmos1xkpvwqha52unh0cwz9dzqzpysuqly3u4nwfdj7", "1787559497942732800"}, - {"evmos1xkqq644a989u6qjv80h2f8hx5gd6fu5cjtvgw4", "468020566915643648"}, - {"evmos1xksunv0dzgejhe43440jxtrqwxk07gv987wyez", "6488506200678250496"}, - {"evmos1xkvc3mcscmpnuhyhqenrkexgygq76g5gn6hl3t", "79602411389289988096"}, - {"evmos1xkvt9zp6xu97875cj0xwjg9tsd02ckgprpl3vp", "7934236870117588992"}, - {"evmos1xkwlca5clpselwdd0dn4spd2gawpsl0c0rkrug", "4081247650658340864"}, - {"evmos1xkwu2rzu5qg8ckadnr5yvkz6c5hh26y4hx3jru", "2306395530030694400"}, - {"evmos1xkwxa6llj8vnrpu68829sj8rds5ldz3klcy4a8", "33767012924361617408"}, - {"evmos1xkzce0e6exjn6jx8clu7c3fem0nsel9qxnp23y", "6469680362829606912"}, - {"evmos1xkzx9uuylh6xhdrr92ypf45z0ppevfxkthu06f", "12387431639209238528"}, - {"evmos1xl2l2cdy3vt0mxvv644kg0efq0jae07v69kd9z", "1733650376333887232"}, - {"evmos1xl3d0wwy2x2tnhy3na4vnf4gayrjugxqg0k7dx", "5470142303195725824"}, - {"evmos1xl3th3aetqgtqexcpcp26dppuv859rhklwu4dp", "220371174031947776"}, - {"evmos1xl5m7m2w8glldzucp6kc53ytt2xvaxyhm0usu2", "2798028834719373312"}, - {"evmos1xl5xy2y8e0pfmy6ycl8yqhtz43e45v4d34fkqg", "1085941222670820224"}, - {"evmos1xl7x3q6a68hk6anqlfr7sam563ncu77tx7pgkl", "233471490870413312"}, - {"evmos1xla44uz06rlzg03mpsl78gsuhcahtsz8x0vz3w", "3178189038193322496"}, - {"evmos1xle8ts2t2c7mnxa8wyedtjvmshh5hphh0cqpkg", "1491823295096695296"}, - {"evmos1xlenydrmlct7n7d9mzkaqtf2mh0ss8tgwyn6rv", "26252716956412194816"}, - {"evmos1xljhnl4ddlm8hym2d0taqmp5v54hpj9z0aece8", "10889612101086031872"}, - {"evmos1xlmkmdp6npz2wuy492zqkz2ntn0jnqqrnjyxuw", "407870178568211968"}, - {"evmos1xlmzxtql7lrwugq2etz74gdrzf80wweasaruw7", "3243707744984385536"}, - {"evmos1xlnez9veravq5qyns453hyck8zvxtjchrh7pm6", "542299686225313792"}, - {"evmos1xlpdqp3092w59pgyxflqj56w7c9r8qfmsqch3r", "2074446891983329024"}, - {"evmos1xlpxggtrrzngy42989jw3p4lq6l0hq3v38adkl", "809793380484515840"}, - {"evmos1xlr2v8kphjna0wfvf22nt7j0z2wx9uye82gtup", "3399201551507304960"}, - {"evmos1xlsltjfcl5zs03pdwa4dstrf3ahefufeka9hz7", "385343739983365120"}, - {"evmos1xlu494tstpet5nwxehuzjmwsd9m8nx9y6ylm3m", "416933024234911232"}, - {"evmos1xlx02m0c7amq0euz5fjrq3dqxqwv2fl2gy7xne", "1200410952927870976"}, - {"evmos1xlxexuvy35khcqasj9nkvvktn2nqqcy6s7prsp", "444511303314605056"}, - {"evmos1xly9e75ltvewlc3s48dfan3wjn92yu6h2nssgr", "1237857263007423744"}, - {"evmos1xlyq3zjy3jpmn03hj2zqcugksgul0zge7l9pug", "1555304048315027968"}, - {"evmos1xm0r9de67qwutz38nc9gg89uvgag2ms5lcg9ny", "23300343992791273472"}, - {"evmos1xm305ysu057rdarxs8z926anlrp8w6df0ysp7y", "179507387566487040"}, - {"evmos1xm3vkefkm48xl38wuy3mu3wmg9xy3hzgl9z7pn", "79180420692759808"}, - {"evmos1xm5gf77afjgca8yll220tm2jdehvd8umdls4zy", "7847607218726170624"}, - {"evmos1xm7mvhfdfp9sx6k7dg4yrzc9mgxgfrcmz3mxal", "8924726313588471808"}, - {"evmos1xmegw59wnm0zshyr5hzvlgj8czyhu2cga4w35k", "6846953630777671680"}, - {"evmos1xmh94kt7ttsgcxqsgyjvhmsthpvqhtswpgrcqt", "2845422526585970688"}, - {"evmos1xmm6f6hllrp9jqce9ygwtf43vlv2a7uz4cj8p3", "9786429657028311040"}, - {"evmos1xmpl0mkgdx2gqfxvwxhd44e6pgp88wqhgtavd9", "2514635811187056640"}, - {"evmos1xmqvvnudgjetr3gwwm2tjn6mne4rctkrk3ewsu", "171215775367663616"}, - {"evmos1xms9q23nakpaaw0h794snd6jdfsfp2h80y0g04", "356939574792474880"}, - {"evmos1xmssng3svxutarvtfsrzmyq2j8ahykqqaep7nd", "4017714750469298176"}, - {"evmos1xmwxwwcv5pmrl0s60z4nredafjl8j5ypap95ug", "1910219718063739392"}, - {"evmos1xmya27an2kakj223kwuletnxhe28wmp69aj8sk", "19099436014440546304"}, - {"evmos1xn27d3xe80mxgd3srrkxl43ff34nuemc3n7zx6", "489106916453171456"}, - {"evmos1xn73ge84wsat86gr96wpe0la0qumvl2da3fma3", "1696754064870604800"}, - {"evmos1xn7a00n0vqnvedmuxkqrdsdyqdp3hd6mdjk6m2", "3145128681447407616"}, - {"evmos1xn9c6p3rs5nldpgpqcea7cnpzmuufqn5n4r7fj", "432467094714783488"}, - {"evmos1xnaurjeqqzfkugfqc6p3euq94vvf404wgq4nja", "1738914443355955200"}, - {"evmos1xnc0ysrvasq02le3yacwmxks2cnka4afk62hh2", "2294136481662345216"}, - {"evmos1xnea5snnrmmd58wfcfqa62tg74hd389xs06ru5", "5774035602615998464"}, - {"evmos1xnfhy6z0tgqdhf4qykklh3tvrcsfwf0dggj6hg", "648128330223681536"}, - {"evmos1xnflkk0vq80qgmk4e4e4lequq3jmz8lyntjazn", "2933994896055834624"}, - {"evmos1xnherk6vmspmu24fl8gmmthw585zg99xu3q3vz", "1854742305645044736"}, - {"evmos1xnjx0jdrk0zhvafe4v7ltfynznvdadrxg0x34p", "66306535019335770112"}, - {"evmos1xnk2qdr4uc6gwl2ncpu5mrd592397gz5av2mfa", "2369566317054502912"}, - {"evmos1xnm39ahrx2rp2r0zmp02p46llprhffm3x8awz6", "4009090295394424832"}, - {"evmos1xnr4r4mnd9c6vuqfawc3px5qvgxpt2jkyjgaue", "11302590276216825856"}, - {"evmos1xns5hyv5d32uxkdz45clt0exynfamlxfwu84rt", "82443605954380544"}, - {"evmos1xnvk7jyzw3a7d0z4zpxyxfkm5lw64l724dutll", "1426269583396208640"}, - {"evmos1xnx86zun87yzqnu5a2xkxhdtgjc3lm7wqzgcx3", "470962016397960960"}, - {"evmos1xny333pazjzzr85sdse7h5qtjkvh3d2uyt7kxm", "6819871770676880384"}, - {"evmos1xp03rwa6lmk45dy2uhlmvl8v5lm8u9qhqrqpw0", "1010364431281811456"}, - {"evmos1xp28rfytwwa4npjdqaj0u0avl4yjt6jl96yckx", "468672311926417920"}, - {"evmos1xp5jvw76yh3ac8fs9lqn0gq2leav4se855rfyj", "35646133263891406848"}, - {"evmos1xp6zlh2jmgg8crw8c4vlv8wacm6u6xgkxwvqal", "2581298114476009472"}, - {"evmos1xp7tlntr0azq6c0rydfjndsg0nmt5tuz00r7a9", "405289353553891072"}, - {"evmos1xp9r63uclq99wx4xfwme5eyl9jes6d2k8lennw", "592887061983502336"}, - {"evmos1xpcpt4ruxd6qnqpk0sdlsnc3zmn7hep6p26pug", "3995597758496029696"}, - {"evmos1xphtaq6he72puxu8pgd6dfs249ngspwj490qfc", "283244710909874176"}, - {"evmos1xpnejzqrjalk84ajjjczxm4jpgksufj48srzmk", "1741991101870129152"}, - {"evmos1xpnwagjjgz5mul06jj7hz0dfsshr6edky7kgmh", "45832475253674496"}, - {"evmos1xprtnpqa5vtqfpfdun8lv69cytl00v38k3z0rr", "700668254623144448"}, - {"evmos1xptssy4qaka4yv2hmddgnwpfawr4wjdfaxzq9q", "3138436219198359552"}, - {"evmos1xpus6v9tk4hkxcwzcez8924ha73ur9wzdcefuy", "45748288988405432320"}, - {"evmos1xpy83g3wrp5ry00rfear5nwl22krynnft9ek7n", "3622204639217182720"}, - {"evmos1xpyp6n98glfph78va5hxsy8ayl24yp0jlk2k6c", "23491244942425563136"}, - {"evmos1xpz6aas86u2d7wcln7xk5dxrtuqzrlk0046qfn", "468672311926417920"}, - {"evmos1xpzj766ya2r6r2wa2x87kn679y4aj8slyf2ryr", "387094792432067840"}, - {"evmos1xq0ks7eddfvewqwgfsghjg7y7gujw3qp60tkrh", "429673231484918528"}, - {"evmos1xq0sjrxsh8uuy03y22y2mqww07fgyrhvflw75f", "10794549283287678976"}, - {"evmos1xq0vlyvyslqx2tlra5t6hvu8n3vkmm632h5gln", "172314454695388416"}, - {"evmos1xq0w2yhcqpmrtv0w29a436nvqnkf0gj48yc88g", "3579833675354210304"}, - {"evmos1xq2k0ecupaaq3ym0223rlpnfv5f3s4m6t7dsms", "2726490399983648768"}, - {"evmos1xq3dv894ej77lwtuhmsgws7vjp24repnd4ggn6", "3823605502169547776"}, - {"evmos1xq4zs28wlu65rj2j90jp5zrsrl4cnakgmyyx8v", "1296976055638547968"}, - {"evmos1xq9f4u96xa2ux68t4xswc70t2pj00kn9rmenln", "4810630825871611904"}, - {"evmos1xq9rd8q2qjwp6yawcktqltv4qljjv34wxkvvvu", "3997211222696025088"}, - {"evmos1xqcdylh0mmhwyuutjvsvdv5l0ygxguhc4mt55c", "10771216760693194752"}, - {"evmos1xqkzrac6nuuk09r69hd5s7vg3csc6rrd93060y", "4453499594846914560"}, - {"evmos1xqmk3j5dkuqgs5jgcqp75sye2csvd2qupleesu", "8725790380592447488"}, - {"evmos1xqnfuus9g98xvtjy38e590sfzpkttp6mxgff8z", "3621837775859685376"}, - {"evmos1xqptujrqx3n0vql48ra99wj5jjddceuzs9ef7l", "17283411743317819392"}, - {"evmos1xqrjehd03g9w5ktdmp00f3vntpntcr04ttwhnh", "23947876377169051648"}, - {"evmos1xqwvyxqqjcywt8ukgl6t0hv2fxlgfya0zpakfq", "5778907310838318080"}, - {"evmos1xqx23pywska59zmltlyasepat0nt4zljwmk958", "125373565894098944"}, - {"evmos1xqy9q55v3akjfdqulwlcuqn8n6nekrralspw4r", "34250056729090859008"}, - {"evmos1xqzr42auaw7csapha38selndfs8ttnrymaxzd6", "13389698229289385984"}, - {"evmos1xr03dntavyk9kfd7kqe3fp43y7jz4sm3464095", "998158228986616832"}, - {"evmos1xr4v4lh8fsfqp5fn6jzjr0ln4wdeggh645598y", "2287438462287800064"}, - {"evmos1xr7we9zmgjaqqlwzqect7xdn39004pkvvn60a5", "85532595151575808"}, - {"evmos1xr9kqfmszdadh33fdlgm875waa2r9upmsxndpe", "1499423736677867520"}, - {"evmos1xrelx0hhsu5wckxh6wgpghtklwnw6gldawg659", "384314424118280448"}, - {"evmos1xrjwth6hhu3f9e4sjdfz6epnkhjz2cch2tnkwd", "5015345296839004160"}, - {"evmos1xrk7ypcm9lg5cvd7we4rgz92th2ske4lnvhxjz", "4390731360985040896"}, - {"evmos1xrlv4hl2cf86e63tqeyu8slzauea8cqamzzp35", "388825896155932672"}, - {"evmos1xrnd2r3y4lnapvkyewnyzdllts5hafeuscsztf", "1384884825906862080"}, - {"evmos1xrqut7rwzwmu349wa8lk6mlzp6j424njgv6eqw", "5314894940161392640"}, - {"evmos1xrqyh2awhuzfww2rt8fjcpdd5lmkelmf68y9cp", "102089100616059392"}, - {"evmos1xrsppf9s3tu8c338cctn2dtc6ydwtu6v9wr8ek", "71571779786852096"}, - {"evmos1xrtced5zxz38n430jplvz4c4df5lg66ruvfd0w", "369324038752822016"}, - {"evmos1xrufgqm3dkn9k35wactert6xkm6tnjrcmk7x6a", "29767992523210698752"}, - {"evmos1xrv5yjfnmw9cfnv3px8d2at0wnv7pv2uevxpjg", "474885731824539904"}, - {"evmos1xrxk2xn7rchtqm6pjkrvextvhg0zafenc0zju4", "2615381348658067456"}, - {"evmos1xrync9aat2nt0kh0zswth0qnue07dzmua0u467", "1377361851937903360"}, - {"evmos1xryt2jq7vqvcwglcwd7c8jy6k0yzlj0rstcju5", "25462552953386725376"}, - {"evmos1xrzr5ac6cfcx8p0ceftx35fqkyy4y77lf3upde", "403019335331286528"}, - {"evmos1xs0hsatwq4ysq8w35fqs0204faddkfcl0luwqp", "7986632699402438656"}, - {"evmos1xs3vvx0tnpwnclfvkq03hstayh4u4n74x0cpdk", "27503322449315344384"}, - {"evmos1xs4sxaf82ujrnn5m05nepu9fh0je6dvtzqun2y", "10834755940335998976"}, - {"evmos1xs7fp0xaxtlpfc6snx5n4h3j07890vskg2k9u8", "1085903697316997376"}, - {"evmos1xs80axaj8q75vvcnulvc3h02ddfty7ct90ku6l", "29835041719850717184"}, - {"evmos1xs8wghh50vmp60p5x7v2wapk7ksvqmfysspn4t", "9022031449774120960"}, - {"evmos1xsa4h58g32ay6r87ylfmevc0k487h0mxsq3fhd", "7029203264906854400"}, - {"evmos1xscgpd3t4tlsyj0eydryx8ectkujpay9d6hqkh", "2982686902993911808"}, - {"evmos1xsckp5cagch7tn8zudfnne0k4awzzyta7hy744", "228785855212116736"}, - {"evmos1xsckzg63wevwsql04gwsrekfgwla2jjjdrkf5m", "884516854239903616"}, - {"evmos1xscpa5p5dd8v45e86c0rd25z98mk55wy44z08j", "1300140261897574400"}, - {"evmos1xscpqsyt4pes87rrzvnjj9uw9j8vut7j9adwpz", "924303081650342400"}, - {"evmos1xsdr4x22z5yk9ulg9vv4suahxmdwkjanhjkkqq", "11494566861447182336"}, - {"evmos1xseuz7s406s7mf4972rda6vm689yluy3f0p4tz", "214271110241604608"}, - {"evmos1xsha8lr4y3zx75t2qg568dvr65eyn6cwhqkkwn", "7542483458531942400"}, - {"evmos1xsnlq9mzrj40p2cya8pvupjqgquaatg7e8gew7", "1965511791367442432"}, - {"evmos1xsnxqhzjfqpaststrv026lgk67se0e89dskj6x", "4330022832306946048"}, - {"evmos1xsq8hd0efswjg58kv4m6dplh42swp24c372nyp", "2241216943094028288"}, - {"evmos1xsv4sv52r245mzzsx9vhx9mky8zydqpxe2zz88", "3870601554503553536"}, - {"evmos1xsvxfhxvc5jrx8v0uu45xl4fpmvqu2nu3f30t4", "4359587640984113152"}, - {"evmos1xswj6zvaptgesm89u4y6rg2kxytrsa7kgf59ax", "4202477911178476544"}, - {"evmos1xt23c5ef0kqdqsp3cm6vnffha4rxe02tnj40ax", "106010542380302532608"}, - {"evmos1xt3s6lmmm08vvva7s9damm2x5j5ygswqlwtlvs", "3754790373561463296"}, - {"evmos1xt4p59azjkmpht9e74xk49zntd4yvfyfuqy57y", "1889881064678825472"}, - {"evmos1xt68wxf9pzrq0u4yan8q0vskm2sf9fn97c6265", "2586984527001714688"}, - {"evmos1xt7708fcgfhnlj0fkup0yqazd967cjyztaerq8", "6339011185671168"}, - {"evmos1xt9cucqxleqm0xd5rda90e68ayl2dj0tw35c2h", "798856353082728448"}, - {"evmos1xt9wuksxnuk2c5aua8jswsayqrsq8suyu6p2ah", "3455402650204507648"}, - {"evmos1xtaqwcpfq076k79y8jyngue3f3gvuteqgpxuff", "3288798628255152128"}, - {"evmos1xte3c8uwnv4mxnrhdzu2k8pevyjvngqr8kjn62", "255122155031774720"}, - {"evmos1xth8sadzdezegsqtydxvl3wrd7phtt43mf38rz", "7025501511145877504"}, - {"evmos1xthp3zxsw72rmsq40ar4f2ez48puw76ugjatej", "1406387680316547072"}, - {"evmos1xtjwlss84uugzzwqga82ap7dm320u7kjuzrhdd", "7078038017155055616"}, - {"evmos1xtlgxqyull83te0wf53d0lqg888jftxl42r6cq", "2625998100760801280"}, - {"evmos1xtp4a6h8ft00vkktvykkeqy6h2lh0fhxkcnshx", "12432087628503752704"}, - {"evmos1xtpx775gw6x34r459ujv06as3s3zgtxpx6zzlg", "888554785268976384"}, - {"evmos1xtpxfvfx6d3nuuxyf86upnwgrgdtnw3uk7v08u", "4607247805856070144"}, - {"evmos1xtq4x4dvwx3jmz58n5234s7a7575my67hvj63r", "4269493602551519232"}, - {"evmos1xtqf0gx73jdjwgyhsx8hcf8e24gjprf9n5893u", "5813835981660111872"}, - {"evmos1xtr43hcq8tn360dkhk83xmuhlqm4m3y8z2ng3g", "1933520339292087296"}, - {"evmos1xttzcp3n253xwg0v047u9g65agu23klraeuxjc", "1523196477494822912"}, - {"evmos1xty3t48ed0px339qt7ahyrldf89wa9kwnyg52x", "31918902614530285568"}, - {"evmos1xtywf5ktyep29x7qvy2nx6kfd0cpvpy9g3g0ff", "43372934259171540992"}, - {"evmos1xtz2hr88schg2w028wauzxrlmyfh9d6q7s5zn7", "1976783575917417984"}, - {"evmos1xu5rs2g5wsy7n3qjarextkungn6zanlw8umdgn", "522699226096932096"}, - {"evmos1xu62gx47rnxtk3gelcmpulzuur07s70cdqrmg5", "384407433419294464"}, - {"evmos1xu79va2cks9vk6j2uqdxmqzvsnlaq52weldpre", "2019482558820719872"}, - {"evmos1xu7yjclstdg8fclqegs4f2dgkx784jkyq5awv7", "384946317148801792"}, - {"evmos1xu9djdsvuugpzqzrc9rzt6vnp2p7gllw8979a3", "2809852950083644928"}, - {"evmos1xuckjmym2zvtat8cm5p6cqxrpwaf0xqxdpfnz8", "6209532939908583424"}, - {"evmos1xufz0qqed8e0qk7as75xty7q5vgj0vdaav7sxy", "5086747021429861376"}, - {"evmos1xuh4x3qytmxwjn6evypa03lwdak02r2xvvlwlg", "7567872566941521920"}, - {"evmos1xul3ky7up6rne930lyv2pjcz4jdu6hxn8rr40x", "2672016385588441088"}, - {"evmos1xulvar07kfq80nkdeh65ezxtzr3uj3jv54qyl5", "3745947527862915072"}, - {"evmos1xum7fh584xuxv247d5calmkzh7qek52xskgssa", "671714617237363200"}, - {"evmos1xumflklztz65anu8erqfu7ftuwy0z9j7d9ekek", "479286247716245504"}, - {"evmos1xumqlnqz2ccpfzqlhfa0eele5r5qk6jry6ddha", "989506110509820928"}, - {"evmos1xusxepunsgf7k8ln2tzgh0zmas56hrycegnm8v", "3736204894658624512"}, - {"evmos1xusy9wenq4hutkrchlnjwnvv0kzua8x8w3g43v", "534437774255281152"}, - {"evmos1xuugnfl9x4rm40g7sphkvy7wcwn3vnlm02hdp3", "102442261906605568"}, - {"evmos1xuyrh9tlmeudkedh6r3lu90djne693n8wc524h", "471990069900443904"}, - {"evmos1xv09m8plfznn534dw0zdnxxps2nlgc0xup8ewm", "912039728412792832"}, - {"evmos1xv20xjk0nuh6kkwyunvu7n9cta4kv47xdesjmj", "1062667645579042304"}, - {"evmos1xv2mj94quyfk96xwxq9k6wlx87vp85ve9x5r4h", "1606743767538481152"}, - {"evmos1xv2thp67kkj6636ukg2z9wxxrgk70uzrd2mg9n", "393857995998160896"}, - {"evmos1xv4gpcm5qcshqdh3qjjaavv0wtha6efx0y7hfa", "12803209444526422016"}, - {"evmos1xvammdm5lh8m9wxe4sy3f276q6935hml6v0s9f", "1578572395303604736"}, - {"evmos1xvcr3u5z4nu3mwqud3e5nvx5zund8dygynguzf", "88855751936216832"}, - {"evmos1xvdj8a2u7sff0jzta3ra3w4px3tfr835ukehnf", "382580198817021184"}, - {"evmos1xve26xft427ujw8tegja668vfyakyl4an0ffj5", "8786508031968462848"}, - {"evmos1xveug3ew7pug750fy70903wjra75w3re8sapue", "795534244377132032"}, - {"evmos1xveyzc50azx0r6hp6pcwnjlahtrps2clesfetp", "1317179795088568832"}, - {"evmos1xvhyp3rfnaj7hefg7dyts46s53zj3ytrusyg42", "1810390488759740416"}, - {"evmos1xvmjlw0t6mn2ac9znlr8fg46htrs0h6ngyqpcr", "1520014433699834880"}, - {"evmos1xvp5g0agmse2xp7kuwhc5jem7jzsj459vm0gh6", "4947235884862605312"}, - {"evmos1xvsk095czjsgx3l92nu0hayd8t3dhl7psthww0", "1156341425543391232"}, - {"evmos1xvtyvaxn9snz2qap8x8k0zskeug6400k5a2jhd", "3456156136775315456"}, - {"evmos1xvul77797hhqprtj94xhs8hhnqe0jemptucqjy", "432476735865040896"}, - {"evmos1xvwj4myjmwajp42u3fdx00kuzhkagyded0dgzg", "1282328506531515904"}, - {"evmos1xvwxvpupya2nv7kvjlwvkzlhnacweltgjg49sw", "427286055305142784"}, - {"evmos1xvyaystjzrqv44e32ae49wf46pn4nlfzyg04g5", "468622238410410752"}, - {"evmos1xw3flcrmfnnjv2jqzdffad4avkyg6y7rfclgec", "990243492692305920"}, - {"evmos1xw3lxhd0pujmzk3zxt6rt4lxl6mfsn4thp73nh", "3363730515489775616"}, - {"evmos1xw56qdlpkh3n9j0j2d23tekhzvxxypf7jt9vam", "22425633936660377600"}, - {"evmos1xw72e60ltkgdflyur3854ldw37lunguvhkvd8m", "1452082791734857728"}, - {"evmos1xw765tl93cl0949mye5fgym27ttqqfzycsm7eu", "1783524269874743296"}, - {"evmos1xw8wy5vytehg0zlqelsy68l9dlmugmprk3lkaf", "2481959529908961280"}, - {"evmos1xwarwv0j6wwlvlqahklpxwzy3y9j37xeug7glu", "638672465608777728"}, - {"evmos1xwc3xlg3vmkzgz0wgp3lh8fqaguz8ah5093rxd", "890509231346407424"}, - {"evmos1xwch8fu4wm6lvcfh70e5ld58tlacu4khdvnqwv", "5191934605390368768"}, - {"evmos1xwdmahyn2us5y3qkt2lv6mcdtd6cn6emc0zmw6", "27976755552002695168"}, - {"evmos1xweexwzh0kum2ye9jkq0cgs9wdgl6ldyfkqhkx", "26827507492247339008"}, - {"evmos1xwem859tyk5m0lrxk2g5cmk8jkss4y90ktmv04", "36797893748295585792"}, - {"evmos1xwfq4rq4hz2dp3r7kkuuqm075yle3e98evuqy8", "10702835385997367296"}, - {"evmos1xwnpwld9ldhn6vdnk4ny5pw8nezmv2fea7tdmz", "39419669031517143040"}, - {"evmos1xwrfp27fs3wqwkt6uxev0cvwjtu4hha4yqammp", "413082322250219776"}, - {"evmos1xws2dft5nn2ytsfz4jjj9zp0nynuat23umkwjy", "6722513065373007872"}, - {"evmos1xwt0yjez0nj6g8lz05t57hjgn7auvq4dt2qdcr", "385790795181429504"}, - {"evmos1xwvr8wt96h3exl5vpune5epxmkfp2q5cw87f90", "9655601530208272384"}, - {"evmos1xwwlfku43cv66wmy9w4d0ttl0hpeqrk4md7zn8", "244116437402768896"}, - {"evmos1xwze9ack0ze2d4y5xcclnx3fey50pypuqjgg30", "1263737685138265088"}, - {"evmos1xwzh2g9m3kxrkgxsrnjlgu8zvq9mlqh86xcecz", "2255777709009401856"}, - {"evmos1xx0v255rgj4aummkz3fwgzg9ws9n3jjdyyh3a3", "172814091181980672"}, - {"evmos1xx2sgna24fzsncehwda2432j7k5knwh5w7jdny", "441681276828997120"}, - {"evmos1xx7av4wfakyten5nr3wqalmzy59emywuhuqpxc", "15556188780073750528"}, - {"evmos1xx7c7gy75wll28zpdjw60fc5j2dus03599xfx0", "1145457189395301888"}, - {"evmos1xxc7g3gtjn8ajcp98y49jkrjjy070a6m267gpk", "609478063889868032"}, - {"evmos1xxccc8sq4x64n2y4tvc9jv4kuyvpddztpezyqa", "1603840277539355392"}, - {"evmos1xxct9d5jyu5przhsz4zfdufsr4l5zw4gqkdq7t", "413911254463217152"}, - {"evmos1xxe3c6hr5vq8an7czzukmcedcckl9u3qke2tuu", "14716438446763991040"}, - {"evmos1xxe4x8fctw050yc0flregahvczf92h0s98mkf8", "2213964623154925056"}, - {"evmos1xxest8y45n9mp3c6v5tsjjyzgzxwpusrk9ck7e", "299861224805765120"}, - {"evmos1xxfkdw8xglxad04aa2duz7qgkrz4vxg8avmmud", "4754810681133686784"}, - {"evmos1xxfuplsrps8lz7nlscjgu5ksd6mek2ahg35xd0", "471722622216987392"}, - {"evmos1xxhlp63vn786d7jcw9ew46h4wxsfvqu2jx0gzy", "946195884172500480"}, - {"evmos1xxjtc5nxs4js9l2vav3kgk48ttzfmg86er9q25", "756282933326014464"}, - {"evmos1xxk9vsly0dla9mduzhhmhs9s404ht86x7547t8", "2343296933947523072"}, - {"evmos1xxn3nn8zvztyeewhfx2fy40wdxlrf8enn5qhkx", "14047915787735617536"}, - {"evmos1xxrp8m4c5x5l5z4p59twx7kqxtf8thkc38hznw", "24627834822212169728"}, - {"evmos1xxtcqu8yl2g6hmvwu9s05ht6sa9y38t8umt790", "947115843627905024"}, - {"evmos1xxtlxhzthzg45tj9sp7jg2kelyerj9rj0r4zua", "36398499328704512"}, - {"evmos1xxus7mguj8waxjhvskkv7gtjj7jc2t2unvfga0", "3747199159982469120"}, - {"evmos1xy2tnlt98uv0m7hu7y5twwwf00lffekkr90dj6", "7662330702426521600"}, - {"evmos1xy33qdhd2ymk5u9nsfxhmgdyuqmdaadygdgxns", "493286405869498368"}, - {"evmos1xy9mxmnf2mzwj0a73f4zqx6qrqs38ql5k0d3z0", "8411098625061795840"}, - {"evmos1xycwqyn7mk3726gyt8dcywfd0q59g39a6828ca", "7795608060292805632"}, - {"evmos1xye3qpagkde8tejvgxjf2rwrhyl5l09rnrejx9", "2375859591974969856"}, - {"evmos1xyep00v7vrv7svtrsthe3svg0hxt37q0wrsgv4", "211408714129038848"}, - {"evmos1xyg8lxs2umslay8au0xdswfythv7esx4ey7gdh", "141883485817689088"}, - {"evmos1xygvpvtyzgk2zeueetluflfrn5jpc42v5jgzep", "10709206456061169664"}, - {"evmos1xylwetj58uz2nxp8huyc0c465m8zzp7f5wudzf", "3277012299174461440"}, - {"evmos1xypp84cds8espthylh0t3anlm8heljjsjcmej6", "5089864425959958528"}, - {"evmos1xyq6s4jmenjcjhvvzd72252r043t4e02emhll5", "4864721632821021696"}, - {"evmos1xytc3z5rp0g59fduw5zh7vr0jylpff064385f7", "234023327752013824"}, - {"evmos1xytu7lhqcc4wwxm3tn6zpwrupezfclk545g8vq", "1462820916453844992"}, - {"evmos1xyudpnxdnxdjane086vtpaf539egy54phh0tv8", "10168878042266021888"}, - {"evmos1xyy3drk8nu79zp8f7756vgrjhvgxsyl53zsqvn", "624087420650969088"}, - {"evmos1xz35x5dlf52de23kch5p6594v3cgkeg9l7lttx", "12027888044944084992"}, - {"evmos1xz4ncnqlmtjqz3kejrudmt852m8h9fgwj9l5xf", "378236395105888768"}, - {"evmos1xz6u8m3yjz327u00auh8cuxvxs4qhks9ameq8n", "32106067238709760"}, - {"evmos1xz6u8nafgdpxnpsmlz9pjdl8eu8cvpgpkacug9", "213666281496929280"}, - {"evmos1xzcl3dcrf7u7ulhzjccw6ejj2d5mpfespmkmqp", "5414872642534492160"}, - {"evmos1xzdhccvj3mce5a05uf6fuatqj9xkxuvtv253jt", "792320632988238848"}, - {"evmos1xzfprcyezl9fu50nz89t0gpllpz46zn3k280nd", "6048324295425978368"}, - {"evmos1xzgluz7cdcld27fghgfu68gdr6cxg8g6nmthgz", "8809681171314024448"}, - {"evmos1xzh6rs2d7srf5cxcnux00x3jqqshvuqkwwf9e6", "8171545729723142144"}, - {"evmos1xzkwv2mukswda7qsh6fcp07htwwyykssutvgvu", "8496757038282202112"}, - {"evmos1xzl3zz5dckhlxttvwhpapmhmy6xtvp96mayfcu", "2909572314656226816"}, - {"evmos1xzmkv6nkpnpexm3vqd3c4uv8n8h60uxukpy6n8", "206528584462515712"}, - {"evmos1xzmwc08wznxzt8phxzx76fy568dyqg4djs0plr", "992682957733145344"}, - {"evmos1xzqslpn66rd0ztkajnayrkgk44dpx3d33xv3k8", "8489256208796680192"}, - {"evmos1xzsu4ph0rv284kh02p27pr3657x2hnfmqaya7j", "1808279587021172736"}, - {"evmos1xzxsm5ef3tqpav9zdaq80ffn0829qfv4tw5wlj", "11801432345728503808"}, - {"evmos1xzzrqy5wzrp5n6n77ahkc7c5pufhzyvsawfsw3", "137504689693182443520"}, - {"evmos1y03fuxxzdsp9agxu6r2lskc227krfk50ftvdjy", "2799439577039588864"}, - {"evmos1y04fnaj6gnec6tyhcwam9x68c0rk58msg8lytw", "14452777167349018624"}, - {"evmos1y05p0vuc9wswqv76knapk3cgssv266e2w459dm", "28477086887555252224"}, - {"evmos1y06k9f7kw8a5rmelhmz2p6vzhl873u59rgzc74", "61402587704527585280"}, - {"evmos1y079kx60rrupvgku6xvtk3xgcyrqn7307ynmm4", "223688160569235456"}, - {"evmos1y086cgv0mdmwq5r9gkfzc0zj8chekf2g8lxk88", "2652662185698567168"}, - {"evmos1y095nyxcyff54nrzhxagwy6tp7a29lhr223gqh", "1416178035565290496"}, - {"evmos1y0a4kwx702xpfa6vjcfk5lejre8s7yk3vjv5an", "7169339805443239936"}, - {"evmos1y0aggqfm4yrpy8vqmqunyxpr7awwqx9ka9hs20", "5806319720352193536"}, - {"evmos1y0c45c5kjxuryhkxhuz0djj7dxngl22cll9qmv", "832900415219741696"}, - {"evmos1y0dzdzdt83ng5uc0jdjn25lxxchzjl7nhaax5h", "2783012353101092864"}, - {"evmos1y0fe9wywrzj9ul0n6xye3mth2aaaa00syev9hy", "7291118514731712512"}, - {"evmos1y0lnwqc7clz63wxgv33nnms8uu973nxl5m2942", "1106862475678023680"}, - {"evmos1y0muzmuat946sr0l7wn47xxfq5rw6n5dwg0663", "5228410503900499968"}, - {"evmos1y0pkh9a5lenl80jp8ntpxucsqppafsgp5tf800", "6727145759113940992"}, - {"evmos1y0r84ceeeuzvknr2yau0fecn80q34klpn7tv2u", "18004736099415087104"}, - {"evmos1y0usmdrseqwh4xvcpmaggxw6falhlagg8fxk2u", "838099158887709696"}, - {"evmos1y0v4zglaypu4hn5te7pkmuad2pfzqeynd8n0lf", "15465139168003817472"}, - {"evmos1y0v8p2n3uzdzqx86tstucn24qs5znur5ajjg2j", "1894382946360143872"}, - {"evmos1y0yphv4kqmuq9kr52gsyam925848uqc5c6utsk", "1714195804428500992"}, - {"evmos1y2007cusg5z046x389hygf7w507u0dwpcyemtz", "411194485551377664"}, - {"evmos1y22g09tj4dkkjaztc2dcjul772w7th7mchfnuw", "44707951168782852096"}, - {"evmos1y24gdx2tsuwdc8gn8u38p0hr5xhm82stmqrxpx", "1637182348316769280"}, - {"evmos1y24rlc8f9ujek3an93yta8qaglxe7gyycwdrnh", "673084646335013888"}, - {"evmos1y26hzpxap4pzf9n3jx4uzdax6kk8e0anm5mru6", "14533577797946693632"}, - {"evmos1y285d57nxnhgf2fap3lht5cdcqth844kjjzsz6", "835295622119046656"}, - {"evmos1y2ck3tsg2ka8k0g9elk39tvuayjccgtzh3saqq", "998831292096131072"}, - {"evmos1y2dcz4xrcaagvwqy88lcjtelg9e0cewrdcpwhr", "977168438865944576"}, - {"evmos1y2dfx00rm9msfrs84lrrqkg2jx4c33rm7laa63", "68516842512578609152"}, - {"evmos1y2fsx7c9jtczu74acl7h2jvufw2aejanyw9t33", "3336478523303812608"}, - {"evmos1y2m46hfz0j8qugpjzc2fy9x4ahq77xmqs5vxla", "24822402842646712320"}, - {"evmos1y2p8mufcldq092qvqqj94ush0d0tw8ecfuw7rc", "751429143193178496"}, - {"evmos1y2thf9zep9zs4656uemz2qqjj682tjfurh4cla", "33975351088650620928"}, - {"evmos1y2uy2vqjuvguny0zppz7rvxxpf5kappc6qs2rx", "16782881995866365952"}, - {"evmos1y2v2gm337xx03zeu5f425awtmat6hzyxsl0t5m", "2578183066112062464"}, - {"evmos1y2vl53z6t96scc5hvpvpf8q5rnutjaefzh8nn0", "2573099058312658944"}, - {"evmos1y2wejnp4lu73rg88vctzx8sxf074759c8wjm5x", "13975015086038865920"}, - {"evmos1y2z6sq836st749ylgqdvm78hut8mh2kgca47re", "1160197328684687360"}, - {"evmos1y2zshzhhuz8hdg0sjjgzc3zs0nyfrje2z2el22", "2502786056420609024"}, - {"evmos1y30372f30dtvrp7kjsjkejjle3geh00yd3e8v9", "7681640154452666368"}, - {"evmos1y30knp3pchmafwfdw6qt0qmq4l9em7d00gxqw9", "73182514739740278784"}, - {"evmos1y352glhp2v07u80zue3h90eeh42vurahv2zmek", "2806457669350916096"}, - {"evmos1y35jhf7x653qrpmdnc2n658dtayqhjfgd8j4wl", "382314893765017856"}, - {"evmos1y367kxkzaw75zex5uzdh7jek4240s8992cpw4r", "20249798597219328"}, - {"evmos1y39qkquvwhfj6lck8r2ugq9xky86mvxjfj4896", "2822032869889345024"}, - {"evmos1y3c3vufwshy8hx6ymawpzq6lfa4w2mmgc992uw", "667805432876220416"}, - {"evmos1y3dndl42wp7g9hufcppdtcgt5vf8zdcst4elk3", "8400220901832992768"}, - {"evmos1y3eyhjfkwj9exyvngkfdrra203rrlfawgd44ec", "1263658697559467008"}, - {"evmos1y3f6xl9ktx9syccahm6h902gfrq3nj8d2gpuuy", "49632399045609472"}, - {"evmos1y3gg8uq82sdvxdyrsfewaw4p80ywx3nmxdhrn9", "3952823924353613312"}, - {"evmos1y3gjlu3rskpqghcrmt9l3uf2ytjzwah49q5864", "22787237042883444736"}, - {"evmos1y3haa69u6ewm087p7js3qncyr7nvjnyyt842k8", "6968792264944678912"}, - {"evmos1y3pxt837f2kwj72kthwsa5falm4nrz43l72p7x", "850144680110624768"}, - {"evmos1y3raprgut2fhfwusvccl8875gvqhkak4cwzzhh", "1813852439873638400"}, - {"evmos1y3u5j0scedefa9qygwj438p43nhcx4j82m7s3y", "978917048543776768"}, - {"evmos1y3w36z7lrscn6sjegt4f9da3w4xekmlgvkplw2", "4235188953471537152"}, - {"evmos1y3x84sagxlqn0s9d70htkl6mkcwyl859v70nx2", "385913818725975808"}, - {"evmos1y3zma6q7ut7958585cx926l0kwpsmc64t42uez", "7216551902749765632"}, - {"evmos1y40vfdq8yc4d7pmts2wzxna0d4whkat9zxwnug", "2813267969647625216"}, - {"evmos1y42vz9q84k7a5jf87wynw0vn9eslmravkvfzd7", "609270781140517120"}, - {"evmos1y43mlsy73uz8lslsg2aexu5s35knrxhmqwz5ad", "1237082568257964288"}, - {"evmos1y479s4najcxskq9q4tnptst83uvammxwh42lp0", "1017997870383586304"}, - {"evmos1y4872rm9ecau2gs7ufgjymnl0p33e45yvwt7lc", "5115473244783046656"}, - {"evmos1y4aary948qav9w0d2qyamqhpp0zcq0kzkyk6zt", "406974683001621248"}, - {"evmos1y4dvd7ppw832t4cca4qehtk2h7eedqgw2r0msv", "2123424557524303872"}, - {"evmos1y4h5x73u3whevasme42w87f5gxqjpq4xakg9c6", "5896384733424772096"}, - {"evmos1y4h89yg68xlz8cwtvt566zwje5lzmxhrdjp6au", "6454448486302460928"}, - {"evmos1y4j8hljmdnlhlhksh0acww7ahfa85rpp9h2jex", "358851801203218432"}, - {"evmos1y4lf64996aayepsaue5sr5mgn8xl7d0nuhptyy", "531966820399837184"}, - {"evmos1y4mpca4zqtlkufs0lsrcp59vaevz5nny9r92cl", "1316955766000007680"}, - {"evmos1y4qfkswz9jmtg4747mj2pwzv0j8hdylwxwvaa4", "975843277619965440"}, - {"evmos1y4qqsk4yl2t9mepnm3w9de28p2k2uux297m3l4", "2782620394642764800"}, - {"evmos1y4s6kp3ljj0nr3ytgpket0zp7ufvmvt9k0p72y", "799007467707886592"}, - {"evmos1y4v2l0nmzekz6pwyq2vxhsc4zehea9qrrh2uxj", "20991235991494709248"}, - {"evmos1y4wvfuw2z7pglsl0aqpdh0zd3864ckry9l2l4s", "1521360914425774080"}, - {"evmos1y4wzpjyp7s660fzdehqtx0un6sszfvfe6c49gk", "721711467889786112"}, - {"evmos1y4xcal3antshxfafcu3dyq3k5dkcmsqmy02qrx", "29770972025156276224"}, - {"evmos1y503hz6t8rq99q2ae29w0lzw5hjtqszdvjm9qw", "1326018049842285312"}, - {"evmos1y53sw9hcpfx6v67n6ydzmp9d0tedtmlvrx76ry", "599757086690574336"}, - {"evmos1y54xy04qm4ukly3y6sjwraqlr5e6uhthed2pxy", "99551738149399552"}, - {"evmos1y57077vpd2wxavggq2pte6qh7vr467l5h47jty", "519794969529450496"}, - {"evmos1y57n99ja9cu7gmwh5t7s2tl2r2scnstrxqm4ck", "2428302395129574400"}, - {"evmos1y584066jvrs7fk8u4vre7j6k0q24cgeg8094mp", "8542587058344873984"}, - {"evmos1y594yyvwydx3sflhxf2rkegm7s4nv48phatl0c", "160095477047941632"}, - {"evmos1y59kewvddx4lt97huer96up4wjn766439jqjr7", "43193162730620108800"}, - {"evmos1y5adlzsmucluj8t64hy4cmpkfgqk6wxfcvzj78", "65223552629693184"}, - {"evmos1y5dyh84s0y8dum5fjz5lgtvdkv5pywt69yca9k", "3219676966659850240"}, - {"evmos1y5g5xsgtw6xj3507he0lhcfgz9uqhza59h2r4k", "376223688904478720"}, - {"evmos1y5h8avtz85fl5qfv3f3glkv3dw6fsl8x65jmyt", "6191168433268703232"}, - {"evmos1y5l74le5crlvrume65hxendx872k0gv5qeydft", "1004764764829427200"}, - {"evmos1y5q3dnxrq6p59zw562fdldcfwclpxadsdml6da", "4039380246470412288"}, - {"evmos1y5q9k0myq24h7hj03jef8fg2jqs24hyea8jdl5", "8187050037807407104"}, - {"evmos1y5t06w68prg2wqjvy9vd8vshnu0ru7jmd3rag6", "308407429744542720"}, - {"evmos1y5u4zw0ku0asqsjjrt69f0lwl93j7agnf52ktx", "2482985979528946176"}, - {"evmos1y5um0r48906z0h9wvkgvvh2ah0jlnxwc88t6fm", "16928414036231168"}, - {"evmos1y5wsrk2a3d2uzkg5lpj3e5m5hxehm547drk9rz", "591199254911868928"}, - {"evmos1y5wu2hyw4q5ptke8jjv5xd3vqyqtqrkq8nqf3r", "910730568870001664"}, - {"evmos1y5wxtca7w4yd2jkq5y5zzujyjjcsqwehgfjvgm", "8257743966311890944"}, - {"evmos1y5x7nfavqc6egfn382f3lc8zujeezc3s5jtzf3", "2247827866095394816"}, - {"evmos1y5zh6wxjqp9r8gdj4jvuenu5e7ah565fzxs0t3", "634591453873472256"}, - {"evmos1y60llyuqhv2tt37pcc2drw42q8wzrgrnw0232e", "911717086793609216"}, - {"evmos1y63n87wvx0t0h0rjd228fvtfsqllly5jgs8m73", "748075812422079488"}, - {"evmos1y66nl0qnu0dr2at2qquje6sryt4g3fjmyh0e7z", "836862134774153216"}, - {"evmos1y67dyzauuxzhdq938qvxwmf24e7at3j6yph67n", "962312019351951744"}, - {"evmos1y67sf6vv87mf9gw5jtz22q3wsmvhks9mvgp566", "4467422814341989376"}, - {"evmos1y6dt236mhnkrcjegphmehcpuw0qpx6n5y7mhfu", "6347807828960346112"}, - {"evmos1y6fp5xpvl8t0xdes6lehux5xl4pssca034lpd7", "4347014317051699200"}, - {"evmos1y6j9mhwvczjmzn6c3gyndyugwskyp5lgv9scjz", "4454249746410045440"}, - {"evmos1y6kcn672eyjarlamz7kwvl62t9gu5qpy2e4vcs", "1651643972285251584"}, - {"evmos1y6kedq6yg8vef40wr3se039j5uj5hwj30uxcq5", "857575670832906240"}, - {"evmos1y6mg6rpscw6gl6pkvx4w4fydx64f8fx6nnlrr0", "1709765406463508480"}, - {"evmos1y6mwh9szmdq89vqjqaxhya9hjht9ncqhwtjqqg", "103862485836446208"}, - {"evmos1y6pnynrkk9sakp586mvdfv03slwe32wc8yspla", "3791068759919198208"}, - {"evmos1y6pt7gf89y8xexqs0gtg4ur8rthg7fswuckxq2", "1533700645930061824"}, - {"evmos1y6r95tuyf2dyqt26k6xhx3t976s8k8uemnmujm", "1664644176642160384"}, - {"evmos1y6rf93t3vz8dp74xjrxu59kyha87re4pemydxv", "1965243816032634880"}, - {"evmos1y6rnmw68d7tt06fgdymqcncv80zzq9y7cve2sh", "1556552602078799872"}, - {"evmos1y6ryh9hu4srtzgv7yj40pna4e5qveuq4whnur6", "716805933074989824"}, - {"evmos1y6vlt5f7d326xwdjgmru5tk3w2dh2gawm0tmrg", "172775568507108352"}, - {"evmos1y6xn4rz8qyqq23kap0u4n0mv39tvc0j7xe7t6y", "4163463908437467136"}, - {"evmos1y6yv52mld5n88phl6perr822umudnuzzzkh29m", "22529619276813398016"}, - {"evmos1y70h9a6lxrhezc7g76rfcxcecxzkry66rh33v3", "266889893258045952"}, - {"evmos1y72ek2jcyf7w5cxerqdpzwcvnme4ylxpd0538n", "6816873447840251904"}, - {"evmos1y75du42f6u5f5nms09tzl76u4lk0enpsp9k76n", "1425132103820187136"}, - {"evmos1y7a7tad7enuwkyrlnq4jaeg0s74a6a0aeyqlkk", "61944457096227545088"}, - {"evmos1y7cc8yj5frgcvm79kvjxegwfwjfp0xayuet7s9", "12180975376804685824"}, - {"evmos1y7cctmea0wahcn8mqdhnssq0gzaz2na626z4f8", "36337145798637686784"}, - {"evmos1y7cf372y6m9xes3ndp6293hj9pxd294p97umyx", "387252143010984448"}, - {"evmos1y7d7quv2dvjpm7zlqdn9kp70pflffsjdrvlcac", "1789112139958218752"}, - {"evmos1y7eg2f6fj7kkjf2qds6wvqtdw0emtulzk7exm6", "445301089121460736"}, - {"evmos1y7fvjqvfwf006nypg7eyq05xfssfyvl2ug7dv4", "20279369756491264"}, - {"evmos1y7g476f5ysk3pu24whcqxt0l6z2sdfhfejlezv", "3512563644878115328"}, - {"evmos1y7jkmlpllgqffuw94qj3l5lwgd7kxmxh4euc28", "67986457360448331776"}, - {"evmos1y7m504e93pynldfe0qfmx6zcrea38f7s2uqwlr", "5002136796577327104"}, - {"evmos1y7n4jfk3lh5w8ndw7yqvtt9znfr45f7lgvuy20", "5923274597746126848"}, - {"evmos1y7nm0fvpsqwgvqj6lh5kft4ut6amzvx6chvwkf", "216916496623515648"}, - {"evmos1y7vg0lcfhx3cswurgffswru8f7cv0zsexdrg2r", "1149849081518077696"}, - {"evmos1y7zkk07gvckusx5x70ee30cvuntjc88sra8ldk", "79452278584590592"}, - {"evmos1y83le9emxydvgl86dqzem8cdjjrkg96m4jueau", "3987486831489282048"}, - {"evmos1y83ygyp4ehflmk3m9nkqenfuz8x6u3e97m6e8t", "778905620291838976"}, - {"evmos1y84d7r02z9zaxhh5gnwhllgjuh6clz3sakkzuq", "1246684419367637760"}, - {"evmos1y859f7v26pkuex8u0ldu3ncu7sfqy5cyu3eeya", "1858106248715765760"}, - {"evmos1y864g2pqdgesssh67j2tejrxuwvyvfxf2m3ewk", "2862497029403371520"}, - {"evmos1y86z87vx24gw484a5yc4wkh23fdknc5xkkee59", "27857928792684306432"}, - {"evmos1y89l74hueazwtt67rl96ged5gzqqlpl029v4z6", "2982583942794002432"}, - {"evmos1y8c589x3adk0sd6r588m0rclkyzfultvavyl0t", "5595218873284317184"}, - {"evmos1y8cgqhg80pnp46gw374c38sjpelfelx4dmx6qe", "12956880184129904640"}, - {"evmos1y8gkt96zea2uzjyrftlp69g702g22827kh2sfq", "16035631337047101440"}, - {"evmos1y8glnm2nj8eyc75lw33emav8d8cz7a9vepysej", "880655839700090368"}, - {"evmos1y8heaq8qqqfz6ysr2l45xqvsu4q77cx599egz0", "2064947292374631424"}, - {"evmos1y8j6d75u2r46g3susmfqgrp8kswufysmech8h5", "89914554082160896"}, - {"evmos1y8ltejjve9spvkym588dumfww74uxhqxfnmmjs", "37419933485447680"}, - {"evmos1y8mgfzts0mep2ns6tqjdvjrw7hqkjngq0kenhz", "5223079646434246656"}, - {"evmos1y8pgzn2szl08zad8y4c0m3l8qvenrq0wqe7h6t", "354457997266043392"}, - {"evmos1y8pxnt4zmwvyw3yh6e6zjkh50l95ane8rlq03u", "37924402151930265600"}, - {"evmos1y8qvk50vj4u5fycxvv4cuzd60wxxclgk8hlyus", "1921562339781287936"}, - {"evmos1y8rm6xvcwjm3u6070ln59ns0wwz4n4gqtsykag", "764219787150663680"}, - {"evmos1y8v20d9x8m3lq4j3znduct9ayy5x2shhvd9tak", "154834700679313408"}, - {"evmos1y8vycwd6qr06g3cdt68klq8mw2jdrwjqyy44eg", "2108242537827432192"}, - {"evmos1y8w60nz0vzyvga69ejndthj6v7spwpm5ywjyn3", "1960794029043465216"}, - {"evmos1y8xjz4wmnyj4hjn396x64jma2fr36829jda8lv", "30331904304156999680"}, - {"evmos1y8y9nyg875se3m4ykt29nr9ykgga3fgeht33fa", "4872126777370340352"}, - {"evmos1y8z7n0vadpdf8pna2q7xc76pjax0ymqdfxgffh", "2257287205635749888"}, - {"evmos1y8zdet4zkr46hftpyuqxh8zfu67gh2lngrlau6", "118822692397058457600"}, - {"evmos1y92lcn9zh9gm0nt0jf2wu59nyclztnq3jp7xl3", "20819589065667874816"}, - {"evmos1y92taa7w6a9qx7rx6radknzr3qa03p622pyf9d", "33709562100457033728"}, - {"evmos1y94yz34ec6hfvdaf9lxkwetsldtt9wwnuz0dcv", "4147746041560842240"}, - {"evmos1y96wdxhe78j200w7m4gyzrtfttglyqlqmefdye", "2038943980275132416"}, - {"evmos1y9aer2mmejgaa9xwujepdkdges9fqv0w6cv4rg", "5423916929544198144"}, - {"evmos1y9c230thdnurpn27fu7k33nnyz9jepzphm5u3h", "1977562389596209152"}, - {"evmos1y9d4x9v77zj0e04q84tapnr77467f69xj3a5rz", "4109823558791690752"}, - {"evmos1y9d7vuj02krv5wym46dz7tn25sqpekpaykffy2", "78351925970540888064"}, - {"evmos1y9dn9kwyrvshx29e5xzlk68g9fp6lg7slkqqxv", "883855627236450304"}, - {"evmos1y9fdztw52r6u2xx2643q09f0p6nldcq7dsfwtk", "1414850244963871488"}, - {"evmos1y9ffagyv6uzujh0zlpynufkklxp0qdp9ajh0r4", "324539439876557312"}, - {"evmos1y9g4h5y3hflgxk8r9dymd92d6w8pk6dcj3s9y7", "1020136391274530816"}, - {"evmos1y9h0t99hp5tyyqczuyhmknffeh5v9hyy4kanhl", "12635216412661669888"}, - {"evmos1y9jq7m2q7kvyrk59a9e766r3rd2ejevk09nw33", "13154198882742628352"}, - {"evmos1y9keamvw5706fj0zqnjwetxxc3f0krsae6ynw0", "430137541490480384"}, - {"evmos1y9l20nw2u032z4245pyuh63t0tzysghvkluts4", "816207184677228544"}, - {"evmos1y9ngwpxvjvw74zq4gr8e7g9rys92ff4k3zd809", "68701698675251200"}, - {"evmos1y9nkfd5hpps74f3lvmw5ca97gspuy5wpk0hawn", "4146672566904928256"}, - {"evmos1y9nmce97a2w2fmxwe04amrjgzcu87efnd6zh7n", "14087945856902146048"}, - {"evmos1y9pjtllu74ukr3mwnvuqlpchvqk0scpluc3mue", "12085446033015562240"}, - {"evmos1y9s3eh48vm9kps0twvxytueffrawrm7dd2as0h", "1386577390092810496"}, - {"evmos1y9sjur8kcdfnlwwmpkvd9nfkgqf55dk52vvufy", "3032619833870110720"}, - {"evmos1y9v75q9auk6w9x4538cl6grwlv49re4ht4rn95", "1812976376954815488"}, - {"evmos1y9x8r4amx3l2gzzqjt9w0jtlrf976lpc4up6vq", "2485466804562936320"}, - {"evmos1y9xjnefhqw0lgrgan08ycua5t2teylv5s76vkr", "2269765683247298560"}, - {"evmos1y9xqtgnlrfzayas07utgg387t0gtr4d5g54e5k", "2861049272242790400"}, - {"evmos1ya0hne8xskepc9ap9lzydm9arp8zj2hl6j7f3t", "17292163208259172352"}, - {"evmos1ya2lnljza3qdg35ma0663frge0dnet7el8nvqn", "2105973735028072448"}, - {"evmos1ya5aff35w7gjecc0sn97jy5mtxj6zjj0ppmpql", "96021107183760896"}, - {"evmos1ya8qcwght744348s6n0r78lcv3eryk3ld5gvuk", "3352250521618650112"}, - {"evmos1ya925f3wz89vrzr9505dpn2rvaws5nlptken0k", "353486581143800064"}, - {"evmos1yacu2mdeg2ml3lep4vcnhema64g03c4s2x9kmm", "1657241773954220032"}, - {"evmos1yacww9szlwzd8smcwtylx7mt3enw5yw909qn2k", "2635793707163906048"}, - {"evmos1yadzzvmpz48g8e92d6t8ge9vq2w5vmcmf3wnx9", "433870168577499648"}, - {"evmos1yaf0n74hlcsdjarm48cq9gkxde47v3axattehw", "409807958439907584"}, - {"evmos1yahzyhfewad586x2pyt8sz97e24zxa2qy982ty", "80492517629138176"}, - {"evmos1yakc6gtetwnu737guwkc9ppdxww3w00dq8q7v0", "3422380356148445184"}, - {"evmos1yakzewxleafadpshuva7rj5h5zc93rl0h94lrn", "854278586427869184"}, - {"evmos1yal9rx2ktfl39gkds9ej6s5lu2uln8gw6plyy8", "2855463339957780480"}, - {"evmos1yalfh8w3cear82r3rn5c3me0d7z0krv4nefuae", "16936686501981503488"}, - {"evmos1yamj4v406p67jhsjafvcf042v8ycpvs4dm4whz", "477608119677654528"}, - {"evmos1yamzkudad2gh534ytptwrjv0pkhmwaekv43rlh", "472523360683645184"}, - {"evmos1yanr77k3q9y4xpynjzqllz2wdeqmwfzuptg5q7", "298923479553127680"}, - {"evmos1yarnv0vgd3lae3gcwgtlrjjf8y325j2qk9cpah", "66515241864178728960"}, - {"evmos1yas4uf89c3v33gun2xd44paau3cfvwarynjz74", "56544424407824990208"}, - {"evmos1yas7ut7zc9yg8vdzj4sttp0dqv00aa9xlq4r3s", "4675620267035505664"}, - {"evmos1yasglzymw3076pn2qxt2ughglc70vhks26pf5k", "6013051196337509376"}, - {"evmos1yask2ess9ma653j32t7dlehqg8egzqleespk9l", "889805498314267136"}, - {"evmos1yav4jdn7tj8udsurd3s47m0xnr3hn7szmhcemu", "2554041541149344768"}, - {"evmos1yazp82ttpr65ehwx9fqewyv7enydets7qgcu82", "20680147065405890560"}, - {"evmos1yaztsnd0ndd7lpeeww7h62pj60s394hkvc08f5", "466904345264772864"}, - {"evmos1yc55g3ywc46d6huzzd5kfwl338xp4dte5f9sn0", "103323169653567488"}, - {"evmos1yc6cuckzahkn2r33r07729vghqur4yc4yhgcje", "2881090849526725632"}, - {"evmos1yc7elj7u92uv5t7r3kjghsxv530v6ltkkd6puw", "1554760874781143296"}, - {"evmos1yc9k06pxz4m9rq5ahrps7kftwkngwt52h68aam", "1289820896718602240"}, - {"evmos1yc9rwqp8spkxugue6ngj2erywhasp6pd7w8zqd", "367192512949586432"}, - {"evmos1yca5ggncpmpnjxphaygq5muyekrsqgnzfvhln8", "2688677056945594368"}, - {"evmos1ycce3j0afkz4n33uu6ws4al40cg7xt5tuc9hzm", "882496957195653120"}, - {"evmos1ycftwlj7ux6lamwatmqgwvt5n0pzzl65c6ufgx", "15112998534602231808"}, - {"evmos1ycjhz85zsn9n0xccrpwh2khf76nq5asrszn03w", "2213227538268018688"}, - {"evmos1yckj8gkezmmv7z8qydf3t2j3ugk3gtgt27t4gw", "128747394703046912"}, - {"evmos1ycl794r6ctvm6f6ut5zshvdt0den2m9mw9uef0", "8109954269056794624"}, - {"evmos1ycmdpf89raq0cwsvw5q00rpwz9e7lr27f3vwg5", "411407789502100480"}, - {"evmos1ycnk5uqc70wn0ufpqdektjqw7nqv4yg9cn3s4l", "1500213331533031424"}, - {"evmos1ycp3zemjls7qx2l2rntp3vnkhfsvfld6dcatmf", "2326103590229327360"}, - {"evmos1ycplfdq048p78lqh2lhvs2te93s09a3l260wn0", "205499771181845504"}, - {"evmos1ycruh0pjeda2x0h68z90apk8zq0k7jxuwxp6lf", "4221224841257431040"}, - {"evmos1ycswyejespmam36sx0majx6xxsjmag3dfusteu", "902726132426042368"}, - {"evmos1ycv48rh6kt8dv7exdm24r26c6zftdu8qq06q66", "2928753050752020992"}, - {"evmos1ycvcrd5esmy8k88ktshgm0k549hmjqguwg659p", "2314180255675398144"}, - {"evmos1ycw6zwctuagwa7jyf40xmguy5sppla04a7jurk", "1311310270116704256"}, - {"evmos1ycw7t5fz6aum7xnx5j8kfhw85rj28quy3rnsf2", "1470001895398490112"}, - {"evmos1ycwsmz9vjmyp08tzurtsd5vhmfrdepye90jdv8", "1443105914943328256"}, - {"evmos1ycx9q5yd46zpp0zzg8nuahzrk28q8clqdwrsg7", "387293747014501632"}, - {"evmos1ycyrp0xhmu38q0uwxf6tdwdvec28sm8gv88923", "43400124087152328704"}, - {"evmos1ycyt5zlt7qk5knc7x5539yqtjyp6m0xukeuk4p", "9683201551819534336"}, - {"evmos1yd02ywc7ax4836pe0xm9prc98wusmmm6tfmxlt", "12856645879113076736"}, - {"evmos1yd4ls6hgayuculezna23jqzld32sxrmvndmn0s", "9099619310835257344"}, - {"evmos1yd4n9ju5c9wg96k8gu4txfeh3jddcrgt5cehdh", "27291266625440768"}, - {"evmos1yd7kgls8xvsqx7kkyx5c65a9ffu4ma5tnxhwh5", "8204190512027332608"}, - {"evmos1ydaemcdfgppmj72s67q04v2sd0kd4dn7fyk6y0", "741660879083309568"}, - {"evmos1ydalk3w02m96qkwssk3hwkk8dxqueykkxwawga", "793820608119303680"}, - {"evmos1ydcq3cuvjepdw928rugvtss7kypjdt7s7lnw3r", "3087601810944927744"}, - {"evmos1ydcr545amga8nmmr79t2w6k7z9cyprde8nwzl2", "1355489710079574016"}, - {"evmos1ydd6dzf2yhvxzrw4c7u3ed0j686qwa8dzxsd5c", "15998020937603473408"}, - {"evmos1ydead035nq9cjkedfzdfdz80hutj4cs80vspqt", "12962515906981888"}, - {"evmos1ydfk5nc3qe5cwhf87sdcj40kd906ael74y05qm", "3775898013948096000"}, - {"evmos1ydfs0nv6z5ksdhrtl8tx2zzvhggfv5lxnlc2v5", "2585770568877873152"}, - {"evmos1ydj3m7w7cgckvxjckpc76y874kqupnj60j4ykh", "2481079630865465344"}, - {"evmos1ydkzkseqgndgey7nverzlv2qywwuzlf9ve0r5t", "4190767901354578432"}, - {"evmos1ydq73sks0e7zqpejl9scdhkgt46y2k3u69lzvz", "7257755981137389568"}, - {"evmos1ydrjyqr67sejm5jca8av7lw736p9r5dlhn9ljx", "4815258789251512320"}, - {"evmos1ydu8uzplrsxgtzszdux40t7fsv3qfw9stgvphg", "21337092700117573632"}, - {"evmos1ydx4dwc0syymy08hd3keq762rmc9uhkpj7p2qc", "5887114536400642048"}, - {"evmos1ydx90wraunsyxz7zf6s645efekz6c5p2j5m9cc", "1211608992406217728"}, - {"evmos1ydzp2ppmrll5sm5rzks57j7dftc7w5furus73y", "6493961586915679232"}, - {"evmos1ye23vgk36jwwkfkx3f80l8a6xah0ce6rfuaaj2", "34805830255976607744"}, - {"evmos1yeaj9jv9cqml05w32mjwg0fd7phpx3hcaesej2", "4871730120513728512"}, - {"evmos1yeclgxtnqhv9qj7ugp5x0y0vqmva7adxuj5jxu", "23757712378770042880"}, - {"evmos1yeekj9j0s3vzgylycn6mvcaxy6smxf44mv0rwx", "736879703091187200"}, - {"evmos1yehpzrat5m73cn2s585ml98f4ulaqtjphmh0tg", "7126369504987561984"}, - {"evmos1yejkwagwkdsy3ulte4uu7afdz4ktrqv0hx2kjp", "264529109602177024"}, - {"evmos1yemjt99zw76ad5dx5vvcs5u7y28stqcmkd63hf", "829592005412207744"}, - {"evmos1yeq759m84s60fv3jmd6gxekdyhgefrs6kc4qce", "2807609054544158720"}, - {"evmos1yeqgymdc8cu2mn3qs0gl0nxvt6auvq0na36pfh", "2771891206435964928"}, - {"evmos1yer02efkcnnj9dn6x85evfn4a4mucdgx6gfs08", "4546472752844839936"}, - {"evmos1yesmzt2v5mpu7a67e77937uxchgw6nnkazugza", "6125691032935088128"}, - {"evmos1yetafwr7sku3fmeu8uf2kqfjhnds3uqw9mgwls", "2803004222127604736"}, - {"evmos1yeutu9e22tuexq49hwrscs0cdc7djh34zscr7u", "885159789524512768"}, - {"evmos1yevnj8pelksfl2acqlyft6243zxmt7ghjxwyt8", "6631622617584861184"}, - {"evmos1yey25428uwm2mdqgf703p78w8wgg0qyaczgjtd", "13924702078096222208"}, - {"evmos1yezc7uqkwww5gzfmdzh4959pw0h7p5htlnzhyg", "3756150517161423360"}, - {"evmos1yf6zftwq3qrhkta89c5duqmz6av3a5dn3j7qgw", "4111798560208835072"}, - {"evmos1yf8uhfvzmnpk6j0mz092z7gnzx6a4mc6644rmv", "3910980423236812800"}, - {"evmos1yf92yktvtf489agltggg5q9hfcfqsdnrkdzlur", "5042964600730169344"}, - {"evmos1yf9zqh7jlypgsrztlx9al607j43njtk7twtws3", "766377606761487872"}, - {"evmos1yfd5h3jwq5vz0srfxyhc97jepmykxgsfzwjrj2", "1555651713806776320"}, - {"evmos1yfd7t3f7m38tgad6zl4jgcc9wxkqs0c2a6p349", "108024540501323776"}, - {"evmos1yfd8m9m3hdcdt0mrm6kth7rywu4qrf49jh7snh", "8088735487638528"}, - {"evmos1yfezzxgh055yj4dh630kjvkxy56dqkceeuxg6r", "5252598677103788032"}, - {"evmos1yfgc6a84l7rx2j8mqn47lutrqd657gkkq8gq9j", "677900947175629568"}, - {"evmos1yfhqknsdym0mhgdlura27v5l2mnzmp06ta36gf", "15042545980031449088"}, - {"evmos1yfmkxxtjewgr0ytlt04tzx4kdd5m0auuf4720q", "4364312138410844160"}, - {"evmos1yfnlwq5z3td9zzak07t9h83pjslgqs08xp9s6d", "1106707769119874432"}, - {"evmos1yfqptxmmt0tqja66hlr78mr42a7zyqdavxqxe7", "5141762089023483904"}, - {"evmos1yfr9f7f8xswkgkeawypqa0x4sl5zcm04fvtkq3", "4941844620021843968"}, - {"evmos1yfsnk83vzsprp920zzcmlzxt7te8vemh7zf4dc", "4479154713033142272"}, - {"evmos1yfu4xwp0tq23mxpklahgkwzpzmf83e6zydac9f", "123419049571059200"}, - {"evmos1yfvqx6l0clqejk4jnr7nyxfnx4amqu87k0glfp", "1229300314854219776"}, - {"evmos1yfw3dg55rfapd4c2zm7w7ykmlj2gtu20wesr89", "6894566297328058368"}, - {"evmos1yg2w6r2d0x9czhfquaqy5qft38yslwumzq6674", "5296360215122567168"}, - {"evmos1yg2ycjcc2pz9vuxcgffyrrqn09y97c5q3wvue4", "1503601746637617920"}, - {"evmos1yg34p9hfadm4kawly0pv99h68uz60ukptry7x0", "2491674836113079808"}, - {"evmos1yg39fwtextd80s5p8z5gevpf5mnfpgwjm7jrg9", "6457000030330097664"}, - {"evmos1yg3kptd9l7skly229ulj0qpgpyqaj0ad8t29u6", "4997502997240942592"}, - {"evmos1yg6ktnd0ssc50zawefda40f3dfdq8z46u07c5s", "625225259108413440"}, - {"evmos1yg752kk8sxvqvwhyv98nsa0mc7r9k4ur0le3g4", "8210665319876252672"}, - {"evmos1ygaf2zft7ft8tmh3d835fja9g8v7gnadut27ru", "2371703867370253824"}, - {"evmos1ygd6vajelnartlls42xpd2uenyppxvaw2ydqhf", "335060930361112576"}, - {"evmos1yge9qzdr0d7s47zkqmhu2rfuze9uuuv3hx8vfp", "14858610708164411392"}, - {"evmos1ygh8cr0fr53hh56mfwstdraafhhmsdf847j8su", "472662755403595776"}, - {"evmos1ygj62f6h2z7mswa9zapuzh5szua3qkyl2wdfjv", "4498768885891777536"}, - {"evmos1ygk4xgpvnz0ycsm3g2d75r4gvp4hwt6up5qxte", "675962404455824384"}, - {"evmos1ygllpp5cqaec5l5c6vpc5gslwac0pc0drrj4nl", "132983973676632064"}, - {"evmos1yglnsr0h8p4j882km2zjajs4l0cmz9z8y4qu9u", "1881705531905106432"}, - {"evmos1ygpqaa78cfrnfa4wm4hxfrtfty07cda0q9rgnl", "4939056652589054976"}, - {"evmos1ygu5q5qnd9fhgkq8r0d7nf0dt370lud4u9tae4", "5539510513868261376"}, - {"evmos1ygvqfdmzlqhqna65kxx5486d4ulj95nn0tuls0", "281088937109908480"}, - {"evmos1ygwzmlswf9xzz9egwajs0ca9fjv2ng88kf232x", "15759886085659856896"}, - {"evmos1ygxrvzt6g3ex7yt9l0d5a8reruzn4pnhzlk8ld", "1742321830979688448"}, - {"evmos1yh22ry56xn5myejfuaxwjmn6etzyv3wnhlj04l", "30521413549826816"}, - {"evmos1yh3qxnykauss5kqsrytpewt2v4wnlpmpskeac6", "769677409033716224"}, - {"evmos1yh4jkqfq2zqecxmsmmtgg3ndz86yjhk69zuqdf", "32922890289717567488"}, - {"evmos1yh4p2gp3sxrw9j2klvntaw4ghwu7sgv0aldc75", "5356216288150497280"}, - {"evmos1yh5sdssk43s9crclzn3kq8gq9sykk2dljup907", "3480532334332599808"}, - {"evmos1yh5v5n9sv3dv0suez7ujh35nrnpl5rg6ryy0ra", "2216774689114582016"}, - {"evmos1yh6zmc5gvel0u607s769j9f02t2j7y958zsgeq", "7192125347981656064"}, - {"evmos1yh82e9rqfvlt8f634463awt6rcam7up23gj33h", "2508859122380308480"}, - {"evmos1yh93f6cwvejauprteredn9gt7hstf6mlgc2w0t", "885411151488542720"}, - {"evmos1yh9d28rxlxy4wdmdeqnn5yrdavth68phlqqxsl", "3278811584344072192"}, - {"evmos1yh9wl2msga0e6en73y38d7rga03uwsfh2ugg8w", "207084855128257536"}, - {"evmos1yhauyycxq2kykmc540wel92je5sxavg8w2wfz8", "983689661281894912"}, - {"evmos1yhcahpwr8e9n6dej6q3hrhgn7arh7cv9kskcqf", "78275266896948736"}, - {"evmos1yhh3cm7g80ja9y2wnz4as3f4p5uzmfml4w4dx7", "2861662137861245952"}, - {"evmos1yhkj7qrtadeusyqnt2j028lm888afwmkdmenpt", "76811803318345400320"}, - {"evmos1yhntynlvzx78fyeku22t28ueuzn28e2gmtkm2p", "775883670805585408"}, - {"evmos1yht5wtprgygmaw6shz5c0d33vc5lc6lkcu83fr", "7911002561652933632"}, - {"evmos1yhttp43xycs78ry2he7ds5nm24ds944uy6ql3f", "3590006510296119296"}, - {"evmos1yhxmxl8kjz8vvmvnty7mqklaj0zkc3kq6sx84c", "91781056997726208"}, - {"evmos1yhxq4gd6zgjsrewkp5vd9fp620jvfdjmwg9fnd", "3992356385495072768"}, - {"evmos1yhxzwh878n8pwq8gzmsq6nx37cy8yqu2mqun7e", "387164423619888640"}, - {"evmos1yhzvs34kjdfncv5ly76h4a0hjr780xtevg7hag", "1393491162267630336"}, - {"evmos1yj86ekuuwuu3gk2wy7z5pykek8ce6znesdqryh", "10483925904905568256"}, - {"evmos1yj9jnlg3tfke5xrsgu0gfc4yvyga6sm2gwl7ch", "50713046970470252544"}, - {"evmos1yj9ktx396ha0sx528axec2dc6hdupsw9fftfdh", "17012424703918788608"}, - {"evmos1yjc9un9juyq5s97gltwle5vfug5r3arhy6twv6", "53424170611424768"}, - {"evmos1yjdhv7s8lwkfrntgw8yf8eq5gksrf7w497ygpr", "21307638000738426880"}, - {"evmos1yjh5j47ad9ep9p0zjaxv7zal66jn7qfuee2yv5", "52342033204266385408"}, - {"evmos1yjkz45rg764tqtzxx6jd5d6s20mkpks9qqptsp", "4758097844895611904"}, - {"evmos1yjm4n96hcpatevvm5vvs89388mjumfljv4r3kc", "5791408610185379840"}, - {"evmos1yjscyzp7jxf4el68mc4awqkmxegnfl6lhzdelz", "24135264349175996416"}, - {"evmos1yjsgdug575gpz2khrhpwvcka5csvstsphr99ec", "1881383898208467712"}, - {"evmos1yjya0eljf92rr93staksx0wa5rxhplpa5aph35", "384318388316961280"}, - {"evmos1yk2tveh6k9akdk80tnrskgdwmmukzn7dw6yk5m", "416157188504689920"}, - {"evmos1yk68vnklu4znxcwgkljefe7h8jf7c4qcjsgrua", "7907177656936004608"}, - {"evmos1yk7px70z7dkdwmn00e3hnpsg7s2dc29w63tl3g", "2589293722234027008"}, - {"evmos1yk9m5c75k26tw8lzuduvr05e82vlt5lhmzkfs3", "1252016604803530240"}, - {"evmos1ykankc3jrqk5w0hkmeggxuccq7h3gne5a3ewty", "83295600397778223104"}, - {"evmos1ykc2tusmy4xksnytdmxesy47gg35dk3pyksraq", "1565345241399361536"}, - {"evmos1ykcf0m99rnlgcz5x5wgyew2aka9ffy05tnr2af", "830579424061702144"}, - {"evmos1ykcn0qdv4rwkzkl4y2kn42jz7khw04we6a7uha", "3055522833928684544"}, - {"evmos1ykdzvt04q7rsjamxdxnpf6uc9w48swjrnnl5fg", "1276840682109149696"}, - {"evmos1ykh30r8xwtj0rwq55pvzrpte2dntgctejqeq09", "316406447588768000"}, - {"evmos1ykjsj0a63mkrh8sf2a0na6d0adx8d8tlp5mfma", "15612120341448960"}, - {"evmos1ykjvl7adndsxflknnf3a624t5r7nuha955gn74", "10247943740081774592"}, - {"evmos1yklac5m95my2xv7v9qmjxmecktvv0sajwlhw0s", "6966973438014967808"}, - {"evmos1yknkt9zlllerr0hdl8v4wkzjmpt5h6hpevmgqv", "17745311182429700096"}, - {"evmos1ykpkf399vlvule8r3ue5h5qh8h0a7pl4zv88de", "2269580079795236864"}, - {"evmos1ykr2wkz7a2ex3232pw55kl9ymmwt2cvs8se8nw", "1052834706068145152"}, - {"evmos1ykv8xemyh8zxv7g2uwfc2sm2za3zgde6q59xya", "2226111257669855232"}, - {"evmos1yl3804d9zvtspqxf2rzskyh0njlrl92galesem", "46347416970491707392"}, - {"evmos1yl5q6ntwkgls4hlmj9354m4vlknfu35cx7993e", "4814935373936629760"}, - {"evmos1yl70cwgaflk2wanyru98sg4ydz0ewze6l4aasf", "12538744941100009472"}, - {"evmos1yl8vtuctzcu7lykdqeneylc8042hdejrnx5vz5", "324572298155053056"}, - {"evmos1yl9sm9kgj5vlxftpuqqav0x7ea6sfg6e5dvxna", "9113474251165450240"}, - {"evmos1ylfkpntdghhypyecn3s029d8y0m8szdzvnnzrm", "2380994412478240256"}, - {"evmos1ylfrzhkr76eg6049qacy5k06ln58rtg0c4ra0z", "10422487862295031808"}, - {"evmos1ylgf0hm7g50r0ysj54dt9aumtzwfadxnx2j30q", "3304684791957270528"}, - {"evmos1ylk48c35jp4hsmcyrzh8fv7jkywvmhmlmrkw8k", "3320444692423874560"}, - {"evmos1yllsywadzy0kezwge6g75ht3ydxjanskz9f2d5", "20029008258373812224"}, - {"evmos1yllvdcmvczmhvxddxx7ye9nhx5w5lnxv45gt00", "1513940004239122176"}, - {"evmos1ylm06v9npv9hzjckq0zf9l2udejuslnqrsc3p8", "1838143294127643648"}, - {"evmos1ylnwnasnxrg3awdpp5cc5usrj6wct8kq6x60k0", "7828408902895460352"}, - {"evmos1ylpgse0cm0nkaghhpppnsfgcu8u6wv9cq9dsun", "623385244197722112"}, - {"evmos1ylr7j78ymfzczkytks99y8260fknrveafz6fd6", "608995741376017408"}, - {"evmos1yls7y9m6razrf39m3vfk9v2sjegjqgqtcsagjf", "7955060942017954816"}, - {"evmos1yltnhda6a7w3wganxxq9llxzuxaj0k9kk6srnm", "4035553322315976192"}, - {"evmos1ylvde49903aydfqfsmvpepnkdhsc2fjv98nqkp", "3160806170365489152"}, - {"evmos1ylwdpv92ganz4zvzctcx8em0p3vgtf7x5mftnd", "4699214436190461952"}, - {"evmos1ym2l4qlcukx9mv9kp4rk2yk6qlmje2udynme72", "2672771070259744768"}, - {"evmos1ym4r8htaksld930he9vjsqz78lxpytn0krtzh5", "20990251790774222848"}, - {"evmos1ym82vjzjume4s2j37t469u205wmv37t7xvjx0g", "3881552033833950208"}, - {"evmos1ym8kef6yu6plg6eg789y4xdnrfy8kmuupmy7dd", "4393200638500852224"}, - {"evmos1ym94n52q20mng4v3qcvknl0zart36fgyj7mnae", "404388241299793408"}, - {"evmos1ym9ly33syspnhm9nt6rf9kt42e4suckq9q3urs", "32925571386928762880"}, - {"evmos1ym9r9d2qhkuqszj3f7p8qhy7n26n55s8udqrdc", "14627371977935171584"}, - {"evmos1ymawwxk7px6pgvkjjaz9cvjuyz9jqx5g3lk28v", "404603062631140096"}, - {"evmos1ymd7gghdluwy86n0alqd92keu2qxmfjmnyn8cq", "1241173519188828160"}, - {"evmos1yme68aauww9nmhytndec8c4z29sug7ka6w7rst", "7392005612052742144"}, - {"evmos1ymh29jczs8trv8v6ezpzddjltwa6f07vurvwds", "142348967038448640"}, - {"evmos1ymjlt2rr8lq4dtvaj3u85kjna80he0nz5dhx82", "1781243796778356736"}, - {"evmos1ymlqdj3pc2r2p55zjqcred6jsa98d86qumedf4", "3916333420636504064"}, - {"evmos1ymmeszaa07v67ctnuwur6c29gzhsrg9e870ylk", "10699974107714056192"}, - {"evmos1ymnal6ckg0uds6v95nwxleg8fk4yxu8ghhtusy", "2581225211794219008"}, - {"evmos1ymnrkjwgc6l0qn3a3nkvcl3npfjgz7tmvzx8wj", "138198456074597632"}, - {"evmos1ympnf5aw24n7cr302zsh59aun8vp9y94thk8td", "31880419895956373504"}, - {"evmos1yn3tq02e0pyg4s39agqf4942ckr47kp9np6lw3", "1776850083363744768"}, - {"evmos1yn3ywyys6wq0zxf6880zaw8cg0j47j64hqxq38", "12768950717915719680"}, - {"evmos1yn5t62ms6erms2egt9maf8uafjevusndeu7x3p", "10898542444633178112"}, - {"evmos1yn5vx44uwxcxdegd493f9kph0lv0dv5fhqeuy4", "181495263462255616"}, - {"evmos1yn665nk2nk2daaq9e992jrqxr99x6xtm3x25zs", "1150888996859598848"}, - {"evmos1yn7np9j0su5zjlkj86c8x9qmwn4hthuukdcuhg", "2073859065510395904"}, - {"evmos1yngfxgstjcej2f8ajz5luw9894pqnkdk2xefh3", "2793659261465280512"}, - {"evmos1ynjax35ygwnjhuelvxyzy9znalr6u84vmjyqld", "2993147308650618880"}, - {"evmos1ynks5nk900cp5kjlcnklvexs0jz24k272dflts", "1472834857201639424"}, - {"evmos1ynm60rhn0wpdp5s9auq5dfdd2slfh38al0eh8h", "7622542814061391872"}, - {"evmos1ynmg6gyavnuh4jzjpdrgtfxfqwypssn0wrrves", "1443091008106251776"}, - {"evmos1yntdfvc3u2t9r5q3hs9aygw7pqp9tp7ay9qn98", "18266025648514625536"}, - {"evmos1ynuweupvm83my88tz6jxszt2talnr8hndelvlw", "598602317362763776"}, - {"evmos1yp02e9lt2kmg9vt4g4qz8fhfd4g48sm04xa7vr", "784110405309233536"}, - {"evmos1yp0rpxzv76mw45hzav3hzm2nzcg9q7yjd9spss", "546892094942420992"}, - {"evmos1yp57cld4ds7qjpzfcz93zdrlsel48yvzk40amj", "1424687048128495616"}, - {"evmos1yp5dk40msdefjtn00tnxvw99q24fww46uft6hs", "4647365332650360832"}, - {"evmos1yp8ds7y7v5c5txml25hrhsf5r6yl20efddsehv", "1079885309256787328"}, - {"evmos1yp9glncje3cgz2mkv3x9cuupjfj5qtmjadzn0t", "9829109881329444864"}, - {"evmos1ypgy4wsldaq74gd7y5kkfyjpwk0crrgucjkn8z", "1492914538674159104"}, - {"evmos1ypjxhvraexxv5uv9wd4u83dvtddlvtuprxs4we", "1641545988243942144"}, - {"evmos1ypk37jc6z524dfzj24prv0zfx0x9qtfv2c2f9q", "137082011086745600"}, - {"evmos1ypnhny4y2deueh0pwlmxtc90cezmejlrq3s08e", "197108159662260224"}, - {"evmos1ypnma42zwckjdcn4tnnasam89re5986g9l0jvd", "2966777447679131648"}, - {"evmos1ypnz4s0wzz32spnrzufhk8etds8dtwsnlnkhec", "3476171907028109312"}, - {"evmos1ypp0lcdvz8cmkc0zeqn6e7hm38s9jjkzw5l89y", "15140212155128799232"}, - {"evmos1ypp0sqckqxtrvd2mjz7040k0nsex38tjrr7qpy", "5788551586867080192"}, - {"evmos1ypqyh4gwseqyyjna806pkdqhexh8v4g8g8pv0j", "268409914233421824"}, - {"evmos1ypux7udmgteq98twcwgh4rn8wtw0cdtfdutgr2", "625243812071942144"}, - {"evmos1ypw5krhqhg8lsatepr2gydegrjml7jf4qn9zgw", "30708305370160562176"}, - {"evmos1ypw9yt2mzguke7znvfs27y4nzcemg2lrv57kjm", "2228419519572008960"}, - {"evmos1ypy7kdxtr35dyz9rhz3d7sjfjr3q438l6d0h6u", "3052655540004462080"}, - {"evmos1ypyjzm4spsejcte9su8apk4e04cu6vqv64j4xf", "1624589334710714368"}, - {"evmos1ypylrdqxu634zpwvnkavm672yf6q6szl8d0mrk", "714347191495983616"}, - {"evmos1yq0stst80mvnl6pwlrmz92962rfft82pgzztmn", "3249561212270742528"}, - {"evmos1yq0xkmxcsfenmgy4vqt5f0c7ttdkjfs3srudpv", "647682796175114240"}, - {"evmos1yq3fdq5cqn6pqr33xzsu28hllts845v5r90j9z", "1633149659482996736"}, - {"evmos1yq4htqgdvyuee46q0psc4w3pvj9ykezretrw2v", "203688378612270080"}, - {"evmos1yq5908ramk327wfeqj5aahz6gt9vgw9uwy6rt0", "1858725233908424704"}, - {"evmos1yq89m5zgx49ny6xc0ssxj50528ts6gefyp889t", "1335496145023007232"}, - {"evmos1yqa0r5tult99s076hhjwqhrpgjspqc37l7pkxa", "2209141732053746688"}, - {"evmos1yqar0h3vn4h4rt24w44lua7ed20mwly466us08", "765549222094099968"}, - {"evmos1yqat726fxvz9dfxdvksrp63pmlh8sxgsh7ehgn", "31029566778222698496"}, - {"evmos1yqe87gjw0t26pqp4lkkvdppfzsmqf039avd33z", "2407682021582643200"}, - {"evmos1yqehlkx8052sl9kczzm5s375laszhy2t2nv24g", "1351638030469171712"}, - {"evmos1yqf0py9g86ps5fk0j0a6fk6zqw2kk0g2zec0ug", "1392211886195267072"}, - {"evmos1yqhl43lnx9vh0py6guqdg2eezyw598t5p4vrl7", "9721988575258202112"}, - {"evmos1yqht2yvkxz75fqhux7nq8z4mw5y09scjrhw44h", "286753833444373504"}, - {"evmos1yqj35pg9at23lvkxeewp7wveyn4qdqez9tcu8l", "78106716153413271552"}, - {"evmos1yqnq2x02ydxpd3avgx0p8jerhsypsqsehr5nvr", "1820096033542148096"}, - {"evmos1yqqm3f5m3r8qagdaz4r0fdga5a3l0znvsfkl58", "3964003119862614016"}, - {"evmos1yqv89vzdf3qcy9lagmuhdp4xz9a95tu0e65xd5", "472587496312521472"}, - {"evmos1yqy0fj688u7wuzlcgfuu2tcntm3aeexlm8ut6j", "2687741998167316480"}, - {"evmos1yr2j2jxexw9hzryzjhv74944g60lpullptzxlx", "3351172467418400768"}, - {"evmos1yr4scqkm7sgyth0u4qd22h3axnlfmyt0wv266l", "2279460496278134784"}, - {"evmos1yr5zmf3vkdtd93e643eu94crd36ws3sewmvp4r", "178085838631268352"}, - {"evmos1yr6ph4za66wda3kjjwr7ln7u9kk8snmjpdl4m5", "3577607947172880896"}, - {"evmos1yr9eh2f5spv6uyvw5l745uqs6k8teta6puapvz", "5146566268045178880"}, - {"evmos1yrdemxm8ll73apdc2pz0wdvdl8h0qaw8xvg0tf", "1860351551531005952"}, - {"evmos1yrfu6648edj438kgkrpynwjan9jkqlmxteeepp", "3788831795674423296"}, - {"evmos1yrg559q3wm9jmd8r4qvzx5pvjuwpl9eak7y3es", "1633161316905909248"}, - {"evmos1yrjht5a83xztuw8k9tnck2225vx500jlrefqhz", "2032461227012632576"}, - {"evmos1yrjtyzajt98572zkts7wt93zzsxf8n9q9yrcy2", "3943973517953329152"}, - {"evmos1yrjxgjp99ztda23x85pvrnfxq98rhm566qkj2l", "733047103196492800"}, - {"evmos1yrm4zn5rt0ukac5n8gwgq7fywj87u0k7enhazu", "10808284590324633600"}, - {"evmos1yrmn0tmlt9mkkh3p33uacjttpuwwm9sglkwy7v", "100905812621031168"}, - {"evmos1yrnxzlewapmatqh74p3ua00js4wn6m2m6p88xk", "10142280631452862464"}, - {"evmos1yrp2mteqwaw9a8spjcrefnyx4k80m6etkdyr0f", "453725068305771264"}, - {"evmos1yrpjetnsppcpdz7dczmqf9h7enfq5236edrv85", "12299615565335660544"}, - {"evmos1yrs0elnu6p64qfqv0hm35qyhnk6qx03qqqvmr4", "5856681175661650944"}, - {"evmos1yrt0vrhrk5zne0yx7mj02ldsnup6239j7ullr6", "391297949124615424"}, - {"evmos1ys0ztjw3td08lvq8khsz33xws62gjwrs8afd4u", "93765155729491722240"}, - {"evmos1ys27u7ecm8e79ag0jda2j8qnhtpem88rwhulau", "2851150591415234560"}, - {"evmos1ys4m4849sgjmszl8tulvdnhrgpy4vxp8tkyym0", "821661777008676352"}, - {"evmos1ys4mdwvunlexfpjgcpj6rycc52c5sw427f8cuf", "824576842050874368"}, - {"evmos1ys5pe9j055znjtswyq9rvyz3ntegkh02hxv7jy", "112629761771887616"}, - {"evmos1ys8cje5cgwxmklz2mxmnwtrwu8nktfyghaw6yq", "771170330540113920"}, - {"evmos1ys8kgzndt0yhawdejddg545edtrz289gtky9c6", "385842752079491584"}, - {"evmos1ysahlxufeqydv8878xk65gf03edqur7rjnf5q8", "21256231904599375872"}, - {"evmos1ysc20dzfz89qzkclhcytadrtm4kctehp5r6zav", "71969796529436416"}, - {"evmos1yscax5ha8dapdc89h80dtuuncdf0gjmuht5xwj", "73393025571889152"}, - {"evmos1yscex60z9ntent7vqfk4me6nlrw4k0jfequnpq", "206844250286948352"}, - {"evmos1ysd5gyj03s9apvcz0rwtnu9jp6840ykrhymzlt", "1107653623464704"}, - {"evmos1yseahwae7mklwn4fpzp9tw5zs66r5qm0v59whm", "19581059412532609024"}, - {"evmos1ysepzpq0va6u9qzhlhev94fdaf9669rl89k69v", "54480006109568512"}, - {"evmos1ysft2vplcvvfjnw7euar9dm28am5078fmtesug", "2009380053693909504"}, - {"evmos1ysfwvmx9q4akcs4vrpxn7cl3ma7mxrz7csk4sg", "1020679874090263552"}, - {"evmos1yshup42ep8v0ggla9ypxde3vus7nskkr7x0a96", "11594976121742901248"}, - {"evmos1ysj36yrxupt9uvckjlqwfwwr5j9z3cl97xqsm4", "38570651296717389824"}, - {"evmos1ysjl070f969cwzgk9ujyz3h5j9d070f063cl3h", "8234931226518568960"}, - {"evmos1ysjysan97m595rla0pju3l6hrsjcwuqs5ajg4a", "369005057571197952"}, - {"evmos1ysu42r8fcm7pmwxdcxjx33cs2fl3d3wtnsfjfv", "3318461284282588160"}, - {"evmos1ysychz0lc5p9fjdyu99v27ckd8emxs8ac6fvtj", "13514479443986649088"}, - {"evmos1ysyhlzy5qquk8h65wmhf9w84z2mrhl7khd4yzk", "314434738350797056"}, - {"evmos1yt36urwdfysnu6yu5sgeqs3x2gezq6tp35sr5f", "65177971749969018880"}, - {"evmos1yt5kyq34yv2q0qd8pxe496vz9d3g05qytc7smy", "353056023735815168"}, - {"evmos1yt5lp2c6vsukuct2hrs2kxcnyjhfpclc4mjk9h", "3131529268641408000"}, - {"evmos1yt5pxd0e6jnqnh6z7446tdvr74jej55kfa6h5q", "21255637581007667200"}, - {"evmos1yt6amqp35p5l5rq0wx8ay55z28hfljp8c5nx8r", "1928203941527193600"}, - {"evmos1yt6fqzslks0h2xu0v95ryepjy3sxkad5pfqlaq", "261908665322098688"}, - {"evmos1yt820uy645nm8azjek6dsscm0njje0z3hrkze3", "20927158561518657536"}, - {"evmos1yt85udl9azcwyqsvz5hvz0feu4mfq8zv76ukg9", "1277501715272753152"}, - {"evmos1yt8anmdp9hnlw5rsvcvpysz473sc7q2k0wpn6r", "3217055852773441536"}, - {"evmos1ytc5ewrjsudr0vwesxe59wr9lz33lwhe2vu6qm", "14040669946486820864"}, - {"evmos1ytdnenmkvyl9mg9vtjz5rs7aslya5tcuh69g9n", "19440803501368360960"}, - {"evmos1yte4f59qkh5j0khuznfzeecgjs5c953k07r5hr", "13013094736326125568"}, - {"evmos1yteqqfkeekkaww36tepl5c2zqr4dt2amn5048n", "716401926546731008"}, - {"evmos1ytfu0t2gfshfymc7m9q0w8uzhj9snwyuycekp4", "897581379677921280"}, - {"evmos1ytgjtnd6jkjkq6sv9q5dq9vkf26njh66qfrf3v", "581311984841961472"}, - {"evmos1ytkpxf7v8zp74z6r5ptq44qvvgnu6rzcyzveh6", "1106303136460645376"}, - {"evmos1ytkuax96psws65xnyv64pmuhaqsx6648rsjf9n", "3826906591832873472"}, - {"evmos1ytq9d5p3k2lk2qw6hdnr3va0h3z8594ujj9g6p", "687506627384789504"}, - {"evmos1ytqnagzyrpswqpu97jqugejxng38tss3lpmfwm", "1627652297640949504"}, - {"evmos1ytqx465j4xy36hdws0jwsthqmjh4jqlupfnlkc", "54691752980144384"}, - {"evmos1ytqztxrs4tyqqdra3csgwzu7eaqxvk2e3kpenu", "8323832222780874752"}, - {"evmos1ytta8pchgazkn6nre0d9jh6ths83keqdw94w8a", "3380770727187070976"}, - {"evmos1yttejy4sw2suu69g3zr3dupr0egv2kyewmrk3m", "17599763745410719744"}, - {"evmos1ytv77xechgd04u3rje8zn87u8g76awmsrp8tzl", "6274899961786728448"}, - {"evmos1ytwvtfxcrmxe28255yvrzyygc3kekn742q5fcu", "1269737507426444800"}, - {"evmos1ytz6t9uar576htxtnztgxel4pja8wprlecau8z", "196581345875979272192"}, - {"evmos1yu2rupfgp8raje8njp858hqmyghzax48mzyvh5", "1711948487872567296"}, - {"evmos1yu625djm508lrf5l8c9w6plyl270pmh7lesfrg", "22326009251471654912"}, - {"evmos1yu8luaeyj0txkvwq68kz7ft3vgr06znc8459an", "62380519535952896"}, - {"evmos1yudr25sczk9dr5u8h6xkznw9085jkchrg8sg7h", "337838758104132096"}, - {"evmos1yue2x69gwtz9hmzcr9yzgqhuunf4ste24x7n3g", "384573681614437120"}, - {"evmos1yuef3sept7s4m3fpr48g3jf63gs3g0uhf424dp", "15010847610100412416"}, - {"evmos1yufy8mwy07nxl6hugjzy5htawntu9cpfvcadkm", "24583464622076170240"}, - {"evmos1yug09h0n30pvy84tt4yxq2da62rgnqwuv6fxs0", "5469217747876070400"}, - {"evmos1yuk72hs5m9cdn75csjudcz27fdujn67we6kyvx", "5136137150753462272"}, - {"evmos1yukpn0kguwrm38ep66mjquxz82ckkx4m7nqt3w", "7066447444953980928"}, - {"evmos1yupe8r3calupczvt2h8fdt7walaztsd8c4705k", "1049887304845479936"}, - {"evmos1yuq0gfhjvv73zqzkrn7wgxk0pzjc9e3hyuqxgv", "3685415843715048960"}, - {"evmos1yurmemkzyzytew3alsysljnchwg0umfy9crt3x", "384091762028360448"}, - {"evmos1yuvkvkpkx563ahdkp27ty8yu5w302gyh2n3d4f", "1869981452853657600"}, - {"evmos1yuxzspfle6uhy3mlf9ckhknlsfk6yv6l06ssc0", "22261754471625908224"}, - {"evmos1yuyc55a97fva2yn4jr80hjda28tlajmlkp8qjk", "22717473847508238336"}, - {"evmos1yuyl5mnwr2srzjfy6j5pyglneu2mn3dasjdert", "99370887475033344"}, - {"evmos1yuynm3ewfp8t9udpama4wr24aq0ygdjper48rw", "477252389261016832"}, - {"evmos1yuzt76fq8ntu8hx6lpvrwsqusw86zqqrrla5j8", "4616742788842309632"}, - {"evmos1yuzwe74u709q0vg0z5dmfgz7vqkcygdpedfudy", "3130400809797387264"}, - {"evmos1yv46mt709zmdd8szq2d0hahrmlddta0j08fzrn", "25763965139194105856"}, - {"evmos1yv5csfjxv8yyv2qewnnwnrdp6yuatrnm6jh7sf", "1176528767105703936"}, - {"evmos1yv7ptl0saexcf5xf5hafrt975es9t3qfl8m2ss", "2171336385852647424"}, - {"evmos1yv8mgnxvdtf06nue6440404pkpmjdfrq9tvcmv", "2197351140534315776"}, - {"evmos1yvc856q6mxs023l8s3zkkp4frvvjqa8k0r4f94", "4595019533902181376"}, - {"evmos1yvgethe9f5k7r4c3rww9cpkrxhqcezxl0f0pcl", "310569574445649920"}, - {"evmos1yvjnxam5rdehhhw6636jt74s8gre0uun2fj7c9", "1249653339550889984"}, - {"evmos1yvkdtmtvdxlacnkeknpa3y3ev84yksuum5s9sk", "644468897940413440"}, - {"evmos1yvn3u4glucaneygm8srq4330mmpr9wsw3ltq0w", "5031888622496436224"}, - {"evmos1yvt2nwsfz5tlrtvelr26y9d3npnhq9flkqwwme", "5888880415826038784"}, - {"evmos1yvt2x9rtmz2k8padwr04vn8lzh793ptdxphn86", "2952607873501913088"}, - {"evmos1yvux2psu7exntksvzk0ymgachw46p0w7zyq6la", "28183457413400666112"}, - {"evmos1yvwsf5edmj2h8dm4k9eck50czzrrjqtux7rk2k", "4494476256681832448"}, - {"evmos1yvysuaqf9hed77enyu52pcg7d9z0gwk56fm6fm", "831682308437569024"}, - {"evmos1yvz6l4gnfmjz77fdkq2qhnuhcg5eqxpqdce800", "1032658762702167552"}, - {"evmos1yw0hy2pcp5ylflku0lxml9tgn9jj3ku45vz6a7", "2144755298638823424"}, - {"evmos1yw0we8kzrrm3em6uc9xc3v2za48lgsgs9294zu", "4756896908683706368"}, - {"evmos1yw4cyk40lenc7ernzvlh575s4dyltvu3w0j5wf", "24414726399930212352"}, - {"evmos1yw6jynw2dmegrgjnkl4275f5ekwxlk4q9rxrmr", "1145474919976837120"}, - {"evmos1yw74u0683e5cxkzurc8ehkqmy2zqdm90mrt55a", "1153756632455309312"}, - {"evmos1yw93kjjd329n2vptd8829dtpce2tfkypakfkny", "206891441315616768"}, - {"evmos1ywark2uaehy4mt0xxcpvvhd3qh9zgvwyjk9vjr", "2208007622099158016"}, - {"evmos1ywkcfaeutznqkj0qgts26q9cjar74jjef2e5zj", "2701650834754035712"}, - {"evmos1ywkgp8atnlxks3g4pw6mvzpkkrehk2lr26nw6e", "884968066719533312"}, - {"evmos1ywn5xukxcwlw5rtc2ep5zsypxv248pnrdazl2u", "1375881423312180736"}, - {"evmos1ywngm7l740vep88pctrvcmz6vqj7fpd5pq3u2h", "2991183220490104320"}, - {"evmos1ywpl2y7lm39n5wtetf7mchh60538l7cv9g99cq", "7655519421494495232"}, - {"evmos1ywps5nfn7g7wa5xhn9mw0030yvc0jtwz2j23m5", "1656889654333300736"}, - {"evmos1ywt3dst5etv9gggkk370gxgetpgapqc9rjcxrt", "4990241543141104640"}, - {"evmos1ywuyq8f5exwdvssh34ss0hmzsnk62xjcdmhsq6", "2688755649339803136"}, - {"evmos1ywwd2fwpnr2rd6n3vndtfvd0clr62g5g6w29xt", "2340103558439279616"}, - {"evmos1ywycyuamaepcvf2sghh4ut803mva2supg6w0mt", "113419488913684480"}, - {"evmos1ywz35zvh0hydvpklu8uah6e74tfxsslhvx88gs", "1416898071516854784"}, - {"evmos1ywz3w08gdwyfrtjm997gs876mamqtggltzedhl", "735238036255819776"}, - {"evmos1ywzhul9u88xn8hz8tggc3thynd4lxrmew33526", "1395398583558460416"}, - {"evmos1yx6z4ad05z3mz2ga4yzc7ewvzmy9uq7vcyznd0", "10437511078225182720"}, - {"evmos1yx7qqhlj2mflghq7fdc5vx38j9t37t9an2etks", "1151930413929624064"}, - {"evmos1yx8herwhxp50u835nzj6vlxyzqq9w6dcwwp0eq", "899932822578403328"}, - {"evmos1yx8nya7295z8d0smvrvz0w427mpmgnuxmles7l", "482777484035234048"}, - {"evmos1yx9dd6xsa53ty355u20z5zr7mxxrx3nf462me0", "1560675651223201792"}, - {"evmos1yxd2wn922aqa8l4es4j7sq3facnstc5nhf3cmy", "477292765534826752"}, - {"evmos1yxd66pscpaqzfgrvxukh2n5g95t4muyczc4p2z", "1192703135030436352"}, - {"evmos1yxdqr9sjanvye3w6mgz47adhjkg7n9df6s7wzl", "386950778412351232"}, - {"evmos1yxjudp9azrdtk3djad20wzg75r3yj5weqla9cz", "6952280440027024384"}, - {"evmos1yxlcwa2qy8s4ta8nn6yy7agwsdfcfp04tmuxvw", "11720969820945549312"}, - {"evmos1yxmtjq8j7xkpz9zzsw2022vm60ftdgjweep75w", "3846228720984735744"}, - {"evmos1yxphr3z9gu2nndxpyecd62yak9z2za9xlz8eha", "1617869976163942400"}, - {"evmos1yxqd8lmkmkek8u9ntd83vnhenj69tn5appuy96", "384506614960179712"}, - {"evmos1yxuuhrme4e8wx97zrp7dmcdr2h486da775f38c", "2199614285432242176"}, - {"evmos1yxwklf8qstl8an66rfsjtavp94r5s44q3dsspy", "73463101133180780544"}, - {"evmos1yxxpdva8g25e53skka4v4vq4657rjej7vm6423", "1589254501835900416"}, - {"evmos1yxxv4nn02usn7ew40tjs9edj49mv3t4v2szgps", "439144604910092032"}, - {"evmos1yxy6crd3sl5evyulvw9eyncy8deg4n9cxt2nhf", "1190094783459941888"}, - {"evmos1yy23sr2txstx0xa099k77nesp74t9dwafes8ux", "3666215452855215104"}, - {"evmos1yy27xfx6vla7usxx5d2kx9663nnd6p25qpglc4", "3712920152601176064"}, - {"evmos1yy45knyw0jsw05sr6d8my6ckrqemdal89r3k0a", "1276007462553738240"}, - {"evmos1yy4kjku5h2hyz5r7yerg0etvmam7n4w8mvy6nm", "5740468611385909248"}, - {"evmos1yy6q3c6c00jj3vn5ukmrapcmmklfymxwcmkhyj", "440784985831649280"}, - {"evmos1yy8t4cyjetuqudk5e5lsgnugdtu2sdv9neq5ts", "657953972337353216"}, - {"evmos1yy9cfew6hfrtnpqmnhwzdgm9c4x25uwxqcz07q", "4160147231262875136"}, - {"evmos1yyezmm5rs3q8dsyx0rxx4ueytpxnwu8enuexz0", "5583469904176331776"}, - {"evmos1yyf2uuqanr07kjwj7rqer7e5w6zv6r2vyrxetk", "1783379721994244864"}, - {"evmos1yyg5vkkyku8npgmflpj4lxl0dmp67s3gmt9zv5", "1105845009098946048"}, - {"evmos1yyggg37raaj2ls8ptxr0n4czlxfertu7c90dru", "1100800977190315008"}, - {"evmos1yygl6qstyvens4cfykd7mw74vdww4mawrtjvgq", "5470690225390204928"}, - {"evmos1yyqxrtdd4npe3ckwr7xhwleunng037t3wn92z9", "17374790610146936832"}, - {"evmos1yytflqvfl3yt99xla5fgsfjhqd0yvqad5z7ejd", "385957476211099136"}, - {"evmos1yz0swzlkv6zcdan25jva9speph6ty0fm6hrg2e", "66523907472596688896"}, - {"evmos1yz3dzcdca8kj9wegcn7zljvghq6ahvlky2f2sa", "35003798568399527936"}, - {"evmos1yz5d84upd44e8a8kz3wcpjpzxy5kaatalspalv", "1459466552787047424"}, - {"evmos1yz78xh97k5e3fyp4e49e9f6ryqggd6fyvpm6nz", "4984240908607628288"}, - {"evmos1yz7m66uuejuqaxjy6pg42alggy0cc0l30a8yey", "4617141246591442944"}, - {"evmos1yz7y6zp9d5ernqmlyudztht9fh5hxpe7kechl4", "330115774729195264"}, - {"evmos1yze8kck0v6z9k5qw7ygcpjz57dkq3sss5q0ese", "35628897271139213312"}, - {"evmos1yzhm7pvg3nktk4r6ld8vy5zkg3x9n7ddjmxe23", "4690438304075759616"}, - {"evmos1yzp50p6689nt4ufx4hy86xpj9s7uq8w68d8fgs", "161109419138514944"}, - {"evmos1yzphgjdeccgwxn85gpmqeeyfnuxz2hylkd5g93", "14505255936427016192"}, - {"evmos1yzs6js86d9j380un37kpxr6jwteccrwgvzmxrs", "333134616547592192"}, - {"evmos1yzt8gy6pttcszpdfemweh59cnhdxpgwg8rur8j", "10480106888851120128"}, - {"evmos1yzwks2rqzh4vc7u6fl56hp7epgf2kjpsp682m7", "5051428985134383104"}, - {"evmos1yzwz7cvl9jmx5j5ftnevj3g6vl95csqrts055m", "2324409350776128000"}, - {"evmos1yzxhmh490a7a38c3hklvr4mfmepgzrj35xetmh", "1203346386377142784"}, - {"evmos1yzxx6dnadvy3fqth95xf9k047hck3l0emt9r5t", "385967177163980544"}, - {"evmos1z00e2vnzl3yjfcfshrrra945wnvszhyyh4ml5a", "4548483377486614016"}, - {"evmos1z022q5wsmd3kz3933aaypaus39xrph3q6pevdl", "2259557357058495488"}, - {"evmos1z05vde9fyu3r0063raajt8wyykjz46xsanxnfc", "20398401162669371392"}, - {"evmos1z06pz8kkx7j6q8wj7ucx9qwfrj6run0zvdsfcm", "206631455903226368"}, - {"evmos1z07mphhd8h2phwqfzsfn5uwc7xmwput2e7zn7y", "19846010255780184064"}, - {"evmos1z0erz9ckpkfqqnsdgyl6f44mrmvv78x0z92y7s", "266401990355466240"}, - {"evmos1z0jh7ka9lwd85nqx8tk9t9pvpv78qx22ljdz6s", "287017137581825024"}, - {"evmos1z0md2vsyt6hy4sddjxs7h2twqagrjpqmgjxd2y", "997654742440522752"}, - {"evmos1z0mx7ukgjt45gv5dx47zw5x7vxjjw46r058j2l", "23027198132857929728"}, - {"evmos1z0qly7pt0pqxwqvh78qwmlas4y9ltc4zg00lla", "936098928067044352"}, - {"evmos1z0stajwpyr5arr65rvs0dx63m9zer9y4h0ay8v", "712329892895170560"}, - {"evmos1z0uhtna2dtru7wuug7nmtekx7yg0y0x83nydeg", "1758951343426650112"}, - {"evmos1z0vynrjmdudvmg9z64257tnu7us7zhtwj57whg", "12971052773784612864"}, - {"evmos1z0wchr65cw65sc8c6sdxl0lhllrt7q0088ewee", "113263899700791296"}, - {"evmos1z0xnrc44les0dm8rs58m4jrrpxex2alys6g4ul", "2866142858544583680"}, - {"evmos1z20vsv9m5f5pw46mfw7q04f0a4kwu4kvptqn9c", "4035629038712641536"}, - {"evmos1z22ucu7ea667eg3kvxgpxgp0fsqwesrdpncjwd", "1418974260906942464"}, - {"evmos1z247gn9rdx99m9xcxezussjq22hvr9r3ff8kxj", "4365584458739054592"}, - {"evmos1z274vdu4tqdchlhk5kft8m9h4dvs585qrwgtxm", "2696594779497627648"}, - {"evmos1z27dl5a24cncjvfmctnktzpst5233l6q6dpdml", "202261558558595584"}, - {"evmos1z27qhhhye8v60y78kx3arfpmcygcrlsxnj0duj", "472956460528798208"}, - {"evmos1z283h5fmm4rr95qaajr8rdt4veazs4lzr6s0du", "298218544324930816"}, - {"evmos1z28mwnyyxdhgkzkrcyrvlwsxa4rq7hm3d3sehz", "819440923091559936"}, - {"evmos1z28qplmxmzlmj2frckuzy0edh96zyrtfs2z3cv", "184432233875298304"}, - {"evmos1z2a93tc747mumncq37m9m93p742slgqwqeuhz8", "721812849327484416"}, - {"evmos1z2awpxefy8rlwjyexgz7v5p0sy6nqdgtgrtpjn", "2524253322723571712"}, - {"evmos1z2ceqcd0kv797gn7nnqlanlkh8j76tqz27vy9a", "1297396386699877376"}, - {"evmos1z2fm30zumu4am2ypzdjahkavphe57yp70uf2m3", "9737848528052221952"}, - {"evmos1z2m87qzszfmfh5td5rlhfa636mlqstvcq94ygd", "1610628625650921472"}, - {"evmos1z2nxsxj2ww7qwdhj5aaq0mzze7ppy4se50wfpy", "2166273384902255616"}, - {"evmos1z2qvf3ykxyhmtnhw63gqxy8fr8ex5fqkvvplx8", "415808883085479936"}, - {"evmos1z2qvl65f5g2tfyxzqtazy6ygz00cmrqykuhe7e", "31257090210356633600"}, - {"evmos1z2swyhnzc8daxtjs23rqv2ex4m9ktupgw73fp4", "8858502080500056064"}, - {"evmos1z2t4n0wgw7t7f28layge02p439hmky52qe2k7v", "99154117810246656"}, - {"evmos1z2z3nq45urhxawhz8gyzlurfz499567hupsxr6", "1603959509343709440"}, - {"evmos1z34njepk2gfxqnn09pet3cgeg9ucah48y0a7t7", "4549069148409520128"}, - {"evmos1z35jlpsyzjh7f0ddfpn6uj757t7gn2ruc3p4nc", "9821117355666149376"}, - {"evmos1z36qjsdcrtt0pyyj5r9pjqhujhynqq2ujzy9kh", "28064446247842783232"}, - {"evmos1z36thf7zaykmded2vhq5akk7ycch5ph2hk3263", "11265112062716626944"}, - {"evmos1z36ueu0ru3kxq0r90zfn67lgxaw0wxrg0jztyq", "384252681766087936"}, - {"evmos1z376cu5es35t8njuy8sjxalm7q5k3hnwn94har", "3496198704397107200"}, - {"evmos1z382e08xz2sl89wy2utst6f9kfhcmacuwdtwgs", "13698069440591368192"}, - {"evmos1z382y36hgwfedp3yjhv2t0hwhcu0dhhj8uufzg", "971904969015175936"}, - {"evmos1z39nfh365qnspg4qda295kjj0qast99wdsvqvv", "284240284708968448"}, - {"evmos1z3eadkqshtcm802t0dggja6frtw08yed2ul78h", "2656655858013718016"}, - {"evmos1z3en0vyzwng0f6kfly09ml0emf29489jt5u4kx", "1253137155957104640"}, - {"evmos1z3m4hxs2h76xxzu9mpy6mj03e4fnsz3s7e0282", "478858281602855936"}, - {"evmos1z3n4f7qrkeysxcdf37x7ysv76psuzdnxl4wcjq", "818310648058146816"}, - {"evmos1z3p4fe4vh0x3cp8pvqyjy4sdup868gpsld7ulv", "171760303659168768"}, - {"evmos1z3plevj7rfp9gucj2ryqs92eg3t78u2c7kzern", "28502475320925667328"}, - {"evmos1z3pnknqh55k24kgq5kcscfkaez56yn50zzpjhz", "7839188421724700672"}, - {"evmos1z3udt2yef5ew846atjar5rzld7hdn9q2rd90ty", "40384228219840659456"}, - {"evmos1z3ugd4h8lwgk2ycfj7ke7z6alzz6v42heuntqn", "1067714070090222080"}, - {"evmos1z3wvsyxkcl339fa4ncrlq9e3rfmx8yzluqpd37", "45643198439032064"}, - {"evmos1z40m4xsw4ax0vv9srqjutw89ph5nyr830tzemy", "1899198592341002496"}, - {"evmos1z425ld40k9fazczwarsvwkhnqanwdr46yfhh33", "4033873848511959040"}, - {"evmos1z4328hxzgkweeksuew6q2djzkl5gjwpr0263q2", "69196205200410880"}, - {"evmos1z46srjapn5f2tg4mgvu7wu54lrwccmjay6szp8", "3600022376237732864"}, - {"evmos1z46u0yfn983c9nxfrt7a9t0hxkmxsmsh9ce4e8", "1585059525258725632"}, - {"evmos1z49j35e8we7z2fl5x006lgl92nt9llaquhd47s", "466904345264772864"}, - {"evmos1z4cufvn242z60f774ss54wpjyzrfjlxhgquchd", "7038380175338227712"}, - {"evmos1z4czgfd2yhv5upvyz0l3f3fnajfy4zeep6nj9w", "315784106323344384"}, - {"evmos1z4d9k7nwt3y5a0h69rrrr6ltcds5zqtxp9k25a", "602870093146090496"}, - {"evmos1z4dkfpfstn9tgnhhmfv2ezrvvt8pqh8efqgsqa", "1514901147365476352"}, - {"evmos1z4e863phu4ckyq0ah8kgn0gh0rkcd7q2z7w4s0", "680512295065415680"}, - {"evmos1z4f5z28gnccz9z8zhjt5jkur09wq6tmt86jgml", "16569020262285268992"}, - {"evmos1z4g5tza5pfnakzm78acns4mrjqemuqjltrgs4n", "3178508476696936448"}, - {"evmos1z4l5df47ddqv5jv9wju5ak30jq4k4rya89d5t3", "91642855985715200"}, - {"evmos1z4np4n3yw6pggm5gzvtlkhz40uhyz0suy9a0z5", "1024459701516979200"}, - {"evmos1z4pux3r0gdjhvst5jzny0xr3n959uzudp80qe2", "54090573881199360"}, - {"evmos1z4qdp23xgayjlp3vpcxm3fsla87vxfpewcr786", "3839514149927444992"}, - {"evmos1z4suwn2avfm6fnn87rdx0gvevq0xl76mqyqujz", "753446688223088640"}, - {"evmos1z4w0eqphfx8uyqds3cry8dlkl0hmq827wcdtzx", "4165247106423873536"}, - {"evmos1z4wgcjh9e4xka3f6pa2yls0mrx3hewn8l3rnsf", "776382159190694912"}, - {"evmos1z4xcttnkjx76yfs7v4jxj2598c25vhtw2ranu9", "11070955937440049152"}, - {"evmos1z54dr06qgpsllakcjdyqmcyw6eqrt0053lqfm0", "102386173124382687232"}, - {"evmos1z54kewcpltzsp47se6j7638a9fquqsy6jp58xd", "10313841486421456896"}, - {"evmos1z57t8yxyul5x55sckcntmrwd5mx54z6qx2xm72", "7114936834513731584"}, - {"evmos1z59gw4332fzpglp6q8x0tad93yff59fcq85fmn", "4206708235739855360"}, - {"evmos1z5a426vjzjhtamus2hgea0tnmfrqgglzt66mmr", "42590158905154560"}, - {"evmos1z5c8syxfmdt6drzrqad27wh2s8qpjq6pqvnn9n", "5259756615535350784"}, - {"evmos1z5ddmf20vwcac226perrvp8h76f8sdk32g3afw", "4338084774396968960"}, - {"evmos1z5dzq88q4zmrhffa3ep3cuze3j908797k4aqpc", "276357116737544704"}, - {"evmos1z5epfdwq3xx3aftdvpl3lmt3lpg5zafr3yzgqf", "2381012849337524224"}, - {"evmos1z5gvjry402peuv97jen74leqades3jk0e39eew", "400545060259130368"}, - {"evmos1z5jf3ljsr3p0wndmvnhusmgvp2fu7l8zc2y006", "3863580785665843200"}, - {"evmos1z5lqajjsfqsvrjdz72sswmgsl7s30r7rlvtzdq", "1984655048171053056"}, - {"evmos1z5lyrwtk6snzepny0qjzne6rr2ckzarra8hgm4", "2857294165033361408"}, - {"evmos1z5mk3y7hrf2n82ux33y7la2h7kjg7xpfvq6nnf", "174108489422410752"}, - {"evmos1z5mq0vkn3wqw9wafs3kf8vkd7pnv6znz25cs6e", "1137269477156595200"}, - {"evmos1z5njp6h40l5r8hkcwef2n56fhlfat3lwvxyt6x", "691635273366156800"}, - {"evmos1z5vs2fjclcurhp2e7h65g67508a5mz05ue0mrj", "37956865410359721984"}, - {"evmos1z5xumdnsqf9g6mzlgj2nuarjcrys20jt03u6tw", "1319492845523050496"}, - {"evmos1z5xuz2mc2ufclc00upqtx0jkykzceupwqn0tcu", "8027196175241265152"}, - {"evmos1z5z6qu63p8xcqr57u0ugwznq9awl0k90swcx5l", "6725271794007601152"}, - {"evmos1z68tqe8gdjevktmj5eucenmwkf9y3n56rmk8pq", "907238594792597504"}, - {"evmos1z6e4rcuh5suw6pjl3fn7t8jkc8ue6738l5z540", "11396797829021753344"}, - {"evmos1z6e5ev3uyy270uzhnmq2vr504x9qnc3klm3m7q", "6335442500789669888"}, - {"evmos1z6f43jg8pfa74pwmtqw8n4qjynkd3t8dta29va", "97905995028373760"}, - {"evmos1z6ftcrqjazf30cwx4p00zqd0xy3ex8laxcuj85", "353512216625962496"}, - {"evmos1z6g4vhy7tprtxj9ly9c82g0yjfs5mumk4sh2fu", "443513049532475392"}, - {"evmos1z6ge06r29fqglmtk7w6l9gn3xxfzf45gvm04d0", "14360548721392056320"}, - {"evmos1z6gjracnwwa55ces6fgx4x73q5ezatuen3kk7n", "679082076457309696"}, - {"evmos1z6gxl6zsm4nyr2l5d6hcs76w3nst48ap9cd3v0", "1818234890375245824"}, - {"evmos1z6hku2kft7dvez9gdxm92qr0d5hq4ct3zhr7ad", "1230960354814478336"}, - {"evmos1z6jh0xhuep89ld7ga89xzkm9a98pvhcdv5scu8", "39555640064347734016"}, - {"evmos1z6jl6vc8ff6hvv7d3mzk8mglvrf5j6j5c74su8", "2743461390637014528"}, - {"evmos1z6lrdul04qe4q7a5kcxgkhwf5x7q5taa2l2jrg", "7676637822445335552"}, - {"evmos1z6m9sfc2c5xqqcu5pmfg03qpk00henmsuy9rhf", "19521232943673933824"}, - {"evmos1z6q68g4s09j3dk026lenqz60uyhwcvu34jshk8", "2289086241989459968"}, - {"evmos1z6ss9jejvvkm94fkdyk9r4c8gtt99kcd6pqtsq", "5530869997994393600"}, - {"evmos1z6wpxt8l5vpqkx0a5a5faulpvec36y7lzlge04", "142468415916858880"}, - {"evmos1z6ya9nj9dacudakw5794q5wdljfkjadne52sgj", "2002436524539908096"}, - {"evmos1z72rr54j75uxf7frhuupe67ydtdtsyavmg7mwa", "605887518634504192"}, - {"evmos1z7566exh8466c78gghgsk2973zn5x8ghhaa7vd", "15618916615299944448"}, - {"evmos1z785tx4te6cl6vsk2hg3x00xzzzgg73m5ll86v", "2416693662349959168"}, - {"evmos1z78ead9epx5xj4mmlgv7pv67qsz280cexurjra", "389055140833411584"}, - {"evmos1z78txd5vtp857glj7uj25dyt36dg43wy4xs63r", "2992231678669246464"}, - {"evmos1z79vsa9st5c62lf45ttelt89jnzus3v38tu5r7", "58408510247299584"}, - {"evmos1z7fk73s4lm5ykhrgum4pq9ksgn5qvh8mu2rhgq", "30399246168011714560"}, - {"evmos1z7flvjqgl7nvytlfd735namkaw2turk430nvtq", "159119685326377472"}, - {"evmos1z7fstkwh5p6jnjc9ej30ftqmvf0ucjmyvas8k9", "1460685818136220672"}, - {"evmos1z7g0f74y2q9phagdwl86s8w0dzgmfqpqkrjt4y", "26421910945346093056"}, - {"evmos1z7mm0vqnfyuhr86klqtmf9lw66zdgugl3ftz27", "77777462695964160"}, - {"evmos1z7nprwzyl7wu6ce37pv2zx96y4smpk967j8lmv", "610505286714863872"}, - {"evmos1z7nvrhtfvdkd2876hnhlr5x80jcqnt8emd73y0", "3275616445449764864"}, - {"evmos1z7pul3uxjac5gqfdyafgr92z743cxt3lxgem38", "30170896653421490176"}, - {"evmos1z7pxz7x95kgma4j5nuq7s70g9hq9v7wph5sx20", "384211148446595584"}, - {"evmos1z7qdv09pnmdq79fzrauvhzecdxkpx2xrgttkq8", "65665625229363200"}, - {"evmos1z7svyr3c7kecrvhfrv9lvwvt5vqgcp3s6w5e98", "7951150939249518592"}, - {"evmos1z7ue74rt3vh8sf5s2d6y0y22jtelmk2xhx4vd6", "4766536556287938560"}, - {"evmos1z7uk8ylhk5akvtv7v2g8s7u7apg43nalfhep3x", "2237381384937682944"}, - {"evmos1z7vv6uzgf6rq8uy9qdc53f3nejkrnmwpuvdzn7", "41156548684031647744"}, - {"evmos1z7yyhfcy8jl02kxxaa59vjl3820vv3kvfr3teh", "3822619877544280064"}, - {"evmos1z82r4hyk5n6zzqvdt2d2udm0j3m85927lzrr39", "5068182277085435904"}, - {"evmos1z84fkst8d5mp5g0w0fjj66jf8m0dpq2xcgc3xg", "34159380352287793152"}, - {"evmos1z8874z6f3cw9urzvpf7923cddrw8y0u02lxzrm", "986910773906999296"}, - {"evmos1z88m608vu3vk8vuezs7dgq4tdm5zg57auhjh2j", "1160081940240770048"}, - {"evmos1z8genmd9x9e6jp2u8k5x73wt0rnpqezqyseuun", "8920019980170051584"}, - {"evmos1z8gv7dap2w7y0pedkejhyjlcyy8etcny9tw2df", "1415712064445690624"}, - {"evmos1z8hc706hklp2x9ayyzz5emxa32y0djmyc3hnnx", "3486608841494597632"}, - {"evmos1z8leffjdkry4xcghfp8zrej6kv6ry95sa87hjg", "3381513569275174912"}, - {"evmos1z8mhm9a39g450v82s5wmeeq6fmd9k7nm5w2nkw", "81931285063684608"}, - {"evmos1z8pegmwpkxrv96xdawawg5nmgx9z890w3l2qs7", "18737421138213523456"}, - {"evmos1z8q2g07myquvmxql26lgy9868xsx5p8kswsth5", "5247125448917315584"}, - {"evmos1z93vwr3urvvhvpzc5me4jaf6nnlev7h2hc2ruk", "6519507870134132736"}, - {"evmos1z9459x3jm54rjaynk5aej4cxlq0ukuqyqtz87r", "9667166490410606592"}, - {"evmos1z970jh75wzzv0zasqekhdxmaxkmzvt6amaw00c", "110042857170174066688"}, - {"evmos1z9875h7f9g49l9h2g88wcul8nmjma3xtvgtkhu", "740501370087077376"}, - {"evmos1z9c3zn0drns02a3hctxrrt8klmywjj9wt6t9gu", "1823830845312765952"}, - {"evmos1z9dl5a6vp7urpd24nemdren0dy6x0kufrptldg", "5900826834715314176"}, - {"evmos1z9genmh62hyry6eztc056vu0y4ky40k3qvse6l", "2695341499887599616"}, - {"evmos1z9hfr5xuadhralpwq6gce859g9an5uqgvtpvnt", "3933706014035017728"}, - {"evmos1z9hvwr9qp447d9qw40xc8zn0rnkkdtm5p8zkhy", "6989536751666395136"}, - {"evmos1z9m2ant2fsvdz43fva9wlpuxtqz3utcesvwhnt", "61907945242320625664"}, - {"evmos1z9p796cdqgvjsr9jxxwm4cswsjdd8a9mk6944l", "4704342987306913792"}, - {"evmos1z9q4lc6drlwl4ct038svd682cx3vux8kx4cmx2", "43421640561373069312"}, - {"evmos1z9qn8fa2tu8gplrga8us7ycxysr2smmu0x0xm3", "88217360522302720"}, - {"evmos1z9rsg202h7wga6vk5egy8gstyxu2f6d8hzksav", "6516571075139211264"}, - {"evmos1z9stuftdnxqxck4gjkwgaa9hq04kayhe9kjq79", "7930486388011884544"}, - {"evmos1z9u4klx8gz34zlh7572sjdyz4zkl8kqlh785x7", "12843800424363538432"}, - {"evmos1z9ur9ad53e7z6ahk63rmdm88heur2v3gzhe5ve", "1259535689724487680"}, - {"evmos1z9vy664whldlfrx45y2en06qkk7rs6phu265yh", "19254281564378062848"}, - {"evmos1z9xtvqcuvh8c4xmml4tuzx7s5g0lmzvqa0p642", "1617841752848925440"}, - {"evmos1z9yxyyehplkey0vh0us4u4xyasjyc8k96zq5dg", "3730147567221350400"}, - {"evmos1za3qs4dzsstgjzvkdz4cs23gaq0mdk3ew7csr2", "2558421001492726784"}, - {"evmos1za4x765m8luqx50xnx3y507m7hu3tuywpj542w", "367134505701068800"}, - {"evmos1za7y9syf36kc25tey9rhz0663hwsf2fvw8g885", "3544655914860180992"}, - {"evmos1zac3g0xc7vnhujl7hfw4r4ttfhed6n2fcxqsng", "9807031716059525120"}, - {"evmos1zacq5xd24hp4wzhzxnpw70w9cs2y9vs050jhq6", "5785984207871901696"}, - {"evmos1zacz7ucqpf7rxygpke8s3zzalj03hdlhxkhe7h", "5748614698138058752"}, - {"evmos1zaf9d7z6g0gz5ffv8c4e20agal0ln9eth5sme9", "23333044708910440448"}, - {"evmos1zag0najmugjl50peznw80sfawww637lwkkj7lv", "1753846392764311552"}, - {"evmos1zags2dcrsk0yc0mk6uv8sgxastn0swk6uhckfy", "963211302359740416"}, - {"evmos1zakxqju5l99e8k8gsf6l943kz8t5v52ad8vxch", "93447128446897152"}, - {"evmos1zalru896gu6q70py6xeafhz3zzvmll4gwtg5a3", "6530851320123015168"}, - {"evmos1zamnkhgzpdfttrx3fwkru83dn70xgncyy4e34m", "10773199701808164864"}, - {"evmos1zanv22wz2agna3plcthyyk8wrzc4ch6lwqvmqe", "1686044739720649728"}, - {"evmos1zap0jvrne5d3wy3xfgtken28amfue2vzv2guam", "386052893578983936"}, - {"evmos1zapk4s40crvztu3wnyj0a4llka7nvas68rd6qm", "38885092353781415936"}, - {"evmos1zapk5ax06ezaysw3ssl58lsddjqlpgul7vulnr", "69111998171002699776"}, - {"evmos1zaq8xhtl74usqfxkhj4xjkymzjev898f8klj2v", "2112677768820232192"}, - {"evmos1zarmrclrc9c5c02zn4yeh8p98mvqkxjq5w9d5f", "1251513036233216"}, - {"evmos1zatue72ufgft6hx8c3fd68w8hkhj23d304800k", "11626581897919389696"}, - {"evmos1zay994yk90yjcwcsv8xcxjt6tz63lqtvcn8wez", "16940522804978237440"}, - {"evmos1zayn5dh2vckrkyjhfckja05fqvzh5d4de93uxk", "14791572275257712640"}, - {"evmos1zc3zp2ryvurs640jtvd3hf2t9r9lx768ydwdjl", "943874129125847936"}, - {"evmos1zc4a4wh7p2xy6t7uh05dquxk34q4sxtpazp2pm", "565989410118664192"}, - {"evmos1zc4wwzxccjekcgflll0hdwytnqd6w3kcnuwrpn", "21084199468203728896"}, - {"evmos1zc5qcjxftg4ykpxv3gpmc5hdug42ry76t3aag5", "694045058056388608"}, - {"evmos1zc79wl8qw8q8qnyvvqs8kmervlnm7x6ha4v2zg", "3052894953797607424"}, - {"evmos1zc9t7q2crcp2e8m83p2te7sku8fqtp2cwxtxzv", "31574607959054376960"}, - {"evmos1zclqjdx5k8hs7fue38xgzpc7capfel8lgg0pz7", "4331927171816119296"}, - {"evmos1zclwp80wa2w6k6xlptjf7jxgupad2j4za2frw9", "6834348413219995648"}, - {"evmos1zcm0t6xzzdkp8z5cj7p0yglfgq3nu3lwn289qs", "4956723791124133888"}, - {"evmos1zcnu47zp809ts82g3xv9f4j2cl7mscap4nunke", "25322397258964082688"}, - {"evmos1zcputlunmy8xfcf9444l7qahkd6w7yg8v62r6x", "212967023815659520"}, - {"evmos1zcq6lh4jls3ww5m9v07j6w7jx9wuzgrzm9aqcw", "517135147711176704"}, - {"evmos1zcsg8uf9cd3x7s22e4nwrtdk2fwcvx53da0xwd", "215459183116839682048"}, - {"evmos1zcufans6hgm4x7u6ejaqlhnvhl7gpz024rleup", "339227996942901248"}, - {"evmos1zcunzkctgh2klh82lmdrdn4ajlmzkukrva9dr7", "30681190798612398080"}, - {"evmos1zcw0d07nls8ga3s3rk0086xm5uz9u6d2eyk57l", "3972393369607690752"}, - {"evmos1zcyd693he78pykfcdx4l3f8js8846zfhpay84r", "1854331781430829056"}, - {"evmos1zd27t9uzuqftyg42la4at94c0yz4gr47xh46qm", "6336198818329559040"}, - {"evmos1zd3vlp28tpjffsf5dz6573yyak489knzd3sez4", "6984487415306616832"}, - {"evmos1zd4u6x844z7u0hwf68wfn6s3ts2ff3nf79hcjz", "13639812389839265792"}, - {"evmos1zdcpca9465hnq72gz7wfsjdempn05ucw5u4n7s", "147538644461987840"}, - {"evmos1zdg0kme0f454t9c27mjy7lxnrcqmdpnr8t673u", "3112692215740661248"}, - {"evmos1zdgvc44fh7pkxne958xk82f06r8cp9gpqmxhc2", "2710439990053922816"}, - {"evmos1zdlvqajpyf49m0kuzsetrvzpkn94zfey67089e", "2685098977808523264"}, - {"evmos1zdnmk36k533hvkwukt9ky6dkdqvmpzr8y7ng9d", "753024428339496960"}, - {"evmos1zdnyzpnhlkm594t2rpnhkyt2hq322pqgd90gk9", "27882806283587104768"}, - {"evmos1zdqhxvzhxd6vvr6k73tnun66p7jez9s5aqruja", "491310683767141376"}, - {"evmos1zdqrl9a2mprqnwd7sjlewlsu2h2w3pf0j354ga", "27862614844813312"}, - {"evmos1zdrpphk4m6hq3pnpzapr87ah8pg38catwpnf80", "818100952933387264"}, - {"evmos1zdt0eygsx2hxa7jfq5thells9zhqvwkha7xj55", "111267470012522496"}, - {"evmos1zdw9e7n7qv9vc73z5prxq2an89lc8wen6s398z", "1002851545261812736"}, - {"evmos1zdwls3zlldg2ds73cstw3zc0frcyvfl0hg4euy", "14080960610930649088"}, - {"evmos1zdy7v9vkhhhlz8twld9pm69unvt68820fs7jnq", "18815543997058842624"}, - {"evmos1ze4mwd3m24k6s6txhusa7aeh40um8rywnkqg76", "1820498528883326976"}, - {"evmos1ze90tn7ntmkl7zmvyxkyedkgfqmvhzedpxtqkq", "3454417805480245248"}, - {"evmos1ze97n8en8gmlweq8az8l38z6nsrnmtwyt7mdtp", "2844456979448145920"}, - {"evmos1zegkg8azdhev0hmrl9fk4ephx50uwg45e33n9f", "2023025083817795584"}, - {"evmos1zehstvuqm7v957e5ufk9tafwq75n5hhftyyyy7", "4682368864880614400"}, - {"evmos1zenqnsl287hkcatwcs3glmfrkqjpw0gq49228q", "6874045402433486848"}, - {"evmos1zenvsq47vufl80wzx7n8x3lxl0xek86302frwp", "2880339460935787008"}, - {"evmos1zephmj3na82nu0s22ekfrcurnv67qzzjx79png", "1192370124558792704"}, - {"evmos1zeq34nza9ul2um60l9acu4kync2m5cl23ynnq4", "1343966490684201984"}, - {"evmos1zetlrvpemlfze8y0hhzfws8ux5s29nasv4fa5g", "339283297402844928"}, - {"evmos1zey79gkefuju7p7whxwncm3evuaacnaqfyftt9", "237230670752620544"}, - {"evmos1zezcwk2t4m8m0ezcveg7m4ukvxammhar76eqtn", "2254887676456527872"}, - {"evmos1zf0jkyssl0v8zne07dx75d066f6vq53zvcdpcy", "4164907299052552192"}, - {"evmos1zf0q9hxg76utq0239vg7u0epzcg4mal9yfj8cg", "6493292102800214016"}, - {"evmos1zf4e7e826dn7wdlunwhjx5lul23cqgqpg73ky5", "29285178526369734656"}, - {"evmos1zf4zlwaqju7xwuxv04ucs6h7n9zaf693rjh8et", "263826997252883456"}, - {"evmos1zf9a92f5wd0jt06c0xfmuunt2h0yw9m7mksw6x", "2018194951313473024"}, - {"evmos1zf9rnxryq53wt4manegphh44ff5x7kn40h5fxw", "9440584747910516736"}, - {"evmos1zfcsqhf8hjaf4eykqd5hn3hf40e8snkf3ahp3a", "3633232527569651200"}, - {"evmos1zfjfcjzvx2ukp52l889z5qy9pxf3x2ed042pwd", "18538156788754374656"}, - {"evmos1zfpfmduk6zdqyy0nqkq3t2uzvfxd54f05cywfy", "907189036952291840"}, - {"evmos1zfq5lx787mc89sgwf3wl0v29zhfmt2k6j00fxg", "2699972044267577344"}, - {"evmos1zfrrnsnp779h29a2387wy3zstvexce3yu3rzyr", "26439624431024504832"}, - {"evmos1zfvcm94gfc2rq52ezwjy8l85lrlyzaqqc3y04p", "71332038658852667392"}, - {"evmos1zfxcs5x685kwqnzg33252t2ps73zvujx6xhu0k", "24502640622052392960"}, - {"evmos1zfz0f0vhz94s2wkf3jqdyfnk3prllcckpcxev3", "610474712591884160"}, - {"evmos1zfzcye7qwlnh5myfgqk07jrcnr9w38cxclsplv", "792666546450360320"}, - {"evmos1zgc9qeaszn59pu7jms62ayrxkle9qszx4tm8q7", "2598565222049001472"}, - {"evmos1zgcunhe7tk857e78xa8l2kn7gn30anj73yzujd", "1157228793488549632"}, - {"evmos1zgcx9vdaskq36tzsc8jf79dxnltvz8y4jwyhzv", "229033320186109952"}, - {"evmos1zgdu8rx5aw2yh5nc8knfw0j28jq5cadqpjtaqs", "830973419114365952"}, - {"evmos1zgghrt66xya0klsy9r0ge0w4ta4hl9ejmxtpfd", "33247870654313308160"}, - {"evmos1zghx56eq9x72lup74003zhz49gs9afw95z70hw", "4982248480044240896"}, - {"evmos1zgj6kdp45rkl5mrpa3ndx4l3dwwq6xzrvk033l", "2654749141802831872"}, - {"evmos1zgjlt4kpmf0nlesyr4q3szlr8s04qgstddx7rv", "12692332577896712192"}, - {"evmos1zgkk7h7m78m42am9q7r4n54l7h8hs376fyu7kk", "1164489416291237376"}, - {"evmos1zglvxenn8vn0rn2a3g7u3xppnspc4s2aw568fy", "17970364375449522176"}, - {"evmos1zgp0hg6ucsjuquszh2jtzlaf5d7jm04msqxn7e", "13352888818309935104"}, - {"evmos1zgs4wc7myelp5sevlwuh6f532qw42wjc037x53", "433858196507394048"}, - {"evmos1zgsd9grpf380usv83mz2pwym0alk0thhpajf0a", "481625567990558720"}, - {"evmos1zgt82xjxsss5uwuvges8mhz7jcf256gctgrc8y", "156888267469849600"}, - {"evmos1zguc7807j0n45mz5mvcp0mz8fyffymkh2sgwn9", "12825383690849550336"}, - {"evmos1zgur6n2nt756f85dp2lpv63z7a2uh8sz6nzc20", "169876278234712064"}, - {"evmos1zgurh0d35f338dn0eftnflm9vt47a8neq466p7", "522703383192428800"}, - {"evmos1zgw757f7pksgvwcn496fmdaxxyjr3gh226kz6g", "101303476140231720960"}, - {"evmos1zgy2klaa0xys362e8gzqyuutu4ac72jjuln6af", "65551815352881408"}, - {"evmos1zgzuajlr6m9fjys6ym7wegu88ty0vz572q0lyh", "1846806200238050048"}, - {"evmos1zgzvhvmz0765ecdk2975rgahpfjupfyrlh4q8u", "1718736871028531200"}, - {"evmos1zh03ny3sjwlq50z4zzghv89pzt2cdjyxdutmz6", "352476864428960768"}, - {"evmos1zh58pl3w0lj9k3yk8g6jkyxmptuyctmw4w8f4h", "2386021312281601536"}, - {"evmos1zh5q35gd2kjwl996vzu6h3x5jjlxr4ch57fgyw", "475530540492384512"}, - {"evmos1zh6fplj84p99p36mpnzvra930dccsvrdaxsq5k", "93921316779236352"}, - {"evmos1zh753ljsrrxs77vw2e9ueyv9e4p0n597qkkujj", "15701178729762347008"}, - {"evmos1zh7a3d039smcftklu8d7glfqwen0m7r748kgtg", "497064575559313920"}, - {"evmos1zheqxgdrqqfls2mkjnvyjd2kwlg3kx0j9fnvk6", "433887298001600256"}, - {"evmos1zhhhlymj4pcuryc27w52xn9y45m4srpq3d0kuh", "29882129266767761408"}, - {"evmos1zhl4lwxlk6jfhuctwev5ty8vnhfylvc3q9spyj", "1604352886350943232"}, - {"evmos1zhpav2v8g033zh0n098kmgswcsre68hwt0d8zu", "4254842677912860672"}, - {"evmos1zhpk2eja5n6s8k0xczev0x49extng74z9mj5nw", "95118029355211776"}, - {"evmos1zhpzzufxg7rl6wnltfzlz7rac8vwqcumsrnp9d", "67014408039676928"}, - {"evmos1zhz5apvu4jkhzcrq88x73f2v2fx7zqte3pe34u", "469393227856214016"}, - {"evmos1zhzz0nyc83mvkxgs34shv90gymsrz72d3fycf0", "1886894971742783488"}, - {"evmos1zj0j57ck58ysvq5qj5agglm7drtshq4n603pnp", "2851950704280695296"}, - {"evmos1zj23krkgvfzjhr27p8zj3hcfxuhkf0p2kd0tzk", "3805038900799725568"}, - {"evmos1zj3e9n2rpx2tkekwz63kkc9lfxkgxhaz35tey2", "448569071659958528"}, - {"evmos1zj4w6ge5e2zhwwnklje60z7mtkzu6saq87q8th", "3370821292081643520"}, - {"evmos1zj6ujcdvweg6e4q5udpw0sjpxezp6h64wq036g", "1213238615095074816"}, - {"evmos1zjaaskgag69furqdcec57lxqu3a9gze3ag6ayh", "736102050472861696"}, - {"evmos1zjapst6m23swtvep5ayfcr096askzm32qdc8yd", "4484901695321553920"}, - {"evmos1zjdf7tck570ezpepnkxt0sqxuz9sdr6vae3p7e", "1988897727751188480"}, - {"evmos1zjdg9pzngwp30stuw0flrdun7lf3x4ckaqyr7a", "12196054627864449024"}, - {"evmos1zjdmyx9x2guyf4qpnfzw0qq2h5h8dtylsxyzd6", "334995544456115200"}, - {"evmos1zjg64qhppcu9texw606ughtcm90c0hearudpgr", "318507795343920896"}, - {"evmos1zjgk9l5rvtvhze0es600n9f720gs7q6zlprl4q", "6526265294237145088"}, - {"evmos1zjqpy8qd5ywzr2mvz4sq9jq78su7045p8q3d3n", "1363195191802376192"}, - {"evmos1zjr3xv4sq829wdjfeqg9m7tf6clpjx0af6t94p", "1086252084191622656"}, - {"evmos1zjsfg7u0h6l98t27lrzlsrc54k79t82nvk6492", "10671550485610213376"}, - {"evmos1zjx6463ecuj3saml8pqzgsnycnzq65lqsguw6w", "4203950263719479296"}, - {"evmos1zjxz4m7nskyazr6n2ysx7fhj5fkpjlrd2yweqv", "1085154467909818368"}, - {"evmos1zjypwzjfes9x6j3g75tqdtcuphph7rnhmcvw37", "1292135115613914112"}, - {"evmos1zjzekx7lrczm5wm5z7yea2pn79tknxg0pg6yfg", "761162490676607744"}, - {"evmos1zk09kcvc9sqx32k4vnu9kx8yqef6ketkk270mv", "145464556322045440"}, - {"evmos1zk5ktyhjq85nvy5xd8g8g8z62j57tst04m2u3e", "52851272165418270720"}, - {"evmos1zk8ut3tuz7gnjpu8x2mhg6k0hvsj9h54x3g5g6", "6594527935097184256"}, - {"evmos1zka542svuj59l5nfc7tfmtyq0dxm3r9fdwg5yd", "1909918410279411712"}, - {"evmos1zkc55lvl4t73vst2n6860dqz92lxxusfk4tynn", "28318400573511307264"}, - {"evmos1zkdhv9mu9pxjwtf9zf9xmk74n6zar8ftjpj2xt", "173425193061548032"}, - {"evmos1zkfe0j07696snhyuaq0smewql9uf6dpzzx2m6p", "9992719556654915584"}, - {"evmos1zkjffx8z8xwgl4frlgja4pgwqf8en2s4yc4j3r", "16981591682157735936"}, - {"evmos1zkkt78e9sdnhda9f5tcf9dgky5wvdsa3kw0d0g", "936014779690668288"}, - {"evmos1zkl6fl6wrkkfr255w3eh03kecn64dlncfmempv", "8646522888888095744"}, - {"evmos1zkqfcqvdjxfgqmwkfw7cc9hv06k4lnnus0k5qt", "52379290285819136"}, - {"evmos1zkrsxhmjxkugjej43lsmasstmg7yguluhwtc2h", "35858798535321165824"}, - {"evmos1zkry03gh7xna7lc9urtn7pskxqgxrfh5krr3yj", "86941992274997760"}, - {"evmos1zkt6kgt4xkp9dudtxclhrr99n9z3lcr5utszrm", "3135919896381037056"}, - {"evmos1zkv4d8g5pyazgae5jzd9l2s99mnsgvkaupt2xq", "42462706894801584128"}, - {"evmos1zkxw0ldamcavqc2dj9gvxh3l57a02czgmu6nnp", "1033222727821483008"}, - {"evmos1zky8zmke4u2r0je9c7a3lju3w4zjartcvch2gn", "4940604676674553856"}, - {"evmos1zl6xqj8uyh0gf85umst4r2ncdj8y48s2x48amf", "1849711931606642688"}, - {"evmos1zl9c42amyuq3zrj0chd03fjmslnryywk29mj5c", "19486263441433702400"}, - {"evmos1zla5mvjt3uvp00pn6msk0vg9l4m4n8pgd9cdnw", "885308329794215936"}, - {"evmos1zlat635rzgkw05w69ht5gxyj2k5d2yt3fz4wq6", "592719477216454656"}, - {"evmos1zlc09tc07tu92h9glcallvkxgzwwc05jj74ha3", "13803860384288710656"}, - {"evmos1zlhywsw374reayc0h9jqx5yl4gpsawd79dgyat", "6377063912293916672"}, - {"evmos1zlkwz2q47c2w744t9x8jn2t43vmqtxrznspvnp", "1587592488548106240"}, - {"evmos1zllya5s7xk66mqqp0xcvypz8egl49qxmk30zhy", "1512137145881935872"}, - {"evmos1zlrgsvjak3nkreyhtexuejn9vhvas3jgt4z25s", "2562895868729595904"}, - {"evmos1zlrlgensetvlvpje6ztqg4j8s5g2chx93yjrh4", "3694845299388497920"}, - {"evmos1zls3s8tvmy85dpa58wngsgxuyw3wp69hglr2kg", "2451646395066883072"}, - {"evmos1zlsk8560sd7xpt240kz0nannjkygh9h5cfj5af", "2503597078786768896"}, - {"evmos1zlsx5svsg3zedfrjwjtt2e0ce0p5hwcun3c6f7", "308652456242044928"}, - {"evmos1zlt39x3v2cdvc4klyclg9uwp5q7mf0ltfy5k5k", "3844285431119947776"}, - {"evmos1zlth64pejq0qjrvhg8ajsyc2tzvdgudfv2jj09", "5080745951573596160"}, - {"evmos1zlvadc96fuwtgxedscpff4rqz4g0v0qqlrw7sm", "4096641835196975104"}, - {"evmos1zlvdq3lsu3lnlwehp4w7r2gpup8c56x5dh5ql2", "3461427782258731520"}, - {"evmos1zlw42vj6cfjltk3v57kqa6zg2rn2uh833w343l", "1627379050626043904"}, - {"evmos1zlw8cqv68j38zlqdlvycvzywuufc6gvneypjgs", "68071113876268288"}, - {"evmos1zm3ysu2cjcw3rnmx4rmkravf66xrpx3g4pr2hs", "1853452349239223296"}, - {"evmos1zm64jvg2hj6ws2x67cqr6t5fyt9vuea84j8kcz", "1267567427894524160"}, - {"evmos1zm653dhj26nw7mxzr9q6kfqyq3wu208jgwk0np", "37497719647415296"}, - {"evmos1zm7q94x8s92smmpxdxsjf84eye8xmsnz6c0ceg", "13744880770077294592"}, - {"evmos1zm8hgwy3lf38hrhed6eus2zu4e08y5umv9jhpf", "30533893397247229952"}, - {"evmos1zmd0rnew0g8n470ukekw9h963cd6l65lamd0qx", "499537285513665024"}, - {"evmos1zmfphupujctcwh9c3nnhqhzglz420flr6sfydl", "4013709361736706048"}, - {"evmos1zmhjcwm663mk77z0j3jtap3e09vfq36w9v0txw", "439779397143903232"}, - {"evmos1zmk9acwvgvw2jh0qpdkg35sapdxnls4x5xhx0v", "4219383535558844416"}, - {"evmos1zmk9u7tl92xxf93qpnl84dlh6yf827njvg5t53", "1068360779639765248"}, - {"evmos1zmkff2z8xxyrsl3safwszqpjk55wt0qpvk7lj7", "4539489729976532992"}, - {"evmos1zmm7ans32cqkz4w9my76l55n8yhvu2hwy58tta", "2622837051270285312"}, - {"evmos1zmptxzh6tpzaqmpkzkqu434xz2zll8z8usclap", "42502331342056341504"}, - {"evmos1zmvzu573jvcnrn6t6lx2nk2g8vl5v24kn9j527", "7781570369292808192"}, - {"evmos1zn0kxxgadksd8kxr4nlcd2zyz3xg2xjkmh86nq", "643968582467972608"}, - {"evmos1zn2p6x6th6mdcl7guyckdke3q45my2c4mkr0h6", "441885323172739584"}, - {"evmos1zn34ucwgy02fx6lxz74regf5j3p2hyyt25rxn9", "1600508539929214976"}, - {"evmos1zn3cay4g70ee4equ2xwy7yjpvwa48cvd7lzata", "2360220617810017280"}, - {"evmos1zn68shjlsuuwkky7kzleahr2t7r82k2ywysgdx", "9160336033671958528"}, - {"evmos1zn70rvvrsxqq007p52fjrjupxnc7yg9mk3ad4s", "387375306405355008"}, - {"evmos1zn8nkd774hq4fsr32vnl8wdazhmm44qs9c44s9", "384940321857287936"}, - {"evmos1zn9ec4g756tthv3qp3hpwthnurf8hm02fgdh9c", "614879285019877376"}, - {"evmos1znctqwx8mpy85sxstksh6lsvgy4euufw049xxx", "883656277947144704"}, - {"evmos1zndwzp2qnwe7p6hcn6qd8qs9j907w3psk6x50p", "4944060416547373056"}, - {"evmos1znggwcahkw7dlecr083p7lxvfhyej7qzjugqwz", "1022376773541515264"}, - {"evmos1zngldx2j7zfec9hsp45w5tplqsxyy9ax6pc9ua", "3818209347476217856"}, - {"evmos1znm5nnuj3cmhsrvfngsz47gaaq93v5s9t5vze7", "377919161764220160"}, - {"evmos1znng994sgfjrd4pamldeh9ymzayf5sk5aa537q", "1112564763708751872"}, - {"evmos1znnuqphw00aszfcwvtt6wd25ntnq90g7zehjxn", "9235714136755539968"}, - {"evmos1znpem698zqyqq4wycgwnt2ga5vxvktcc2d4sxw", "441846334592646912"}, - {"evmos1znqk2mkm7tu2csshzkg4whlrvngv3yl8strexq", "30423685703132868608"}, - {"evmos1znt5q9jz97dfy0rwn90x2ak32wdy7nqc2pz4um", "969479220270851072"}, - {"evmos1znv85fg2vmua7ht7pgpxnyeex70mr2dakkn44f", "31993867179770585088"}, - {"evmos1znzlhjm4z9uqzq46j4d3e385ntsa8xl5xedwrv", "7810539397518557184"}, - {"evmos1znzpjsf37guksvufyn8w433hn85vjxz3dz5d2z", "1212491636584294912"}, - {"evmos1zp5t4ffq22sf9pyme985xk0an0l4lqw5s6a2c2", "6275340860534243328"}, - {"evmos1zpc93cfx9s8jp44rhx6f0v709ml9j8t574ej35", "6854830052218477568"}, - {"evmos1zpf56nnpypc7ddjgp3ycmk9ahr63h8khtf6zq8", "2538037204681138176"}, - {"evmos1zpflfd620q6za4ts3hykfqhn009tt29j7nklej", "4666365489992366080"}, - {"evmos1zph8cewjhk320jl6qkutnme2negk6d5p0kzdye", "34166344610874826752"}, - {"evmos1zpmv9nac68e65kls2rvvp4k39qt4hlhw44rgrj", "15123269764896057344"}, - {"evmos1zpp5crvre2hrpevzac004hrts6kh2u7fcfv5wt", "2093379671596352000"}, - {"evmos1zpps4vqje5mfrq374acdtjy7e3xyp4smlpm9aj", "836584572835400192"}, - {"evmos1zpq2r622syrckz0d36rflafrazzjj8gly0ysma", "4479066845459824640"}, - {"evmos1zpupqujqrwvry0phjpt0jlpqevsnaf9u8pp9qd", "925306985740222208"}, - {"evmos1zpvckp5cq46pzs7k93w3f9x4zplpdp4lyzlmwu", "4093728845086961152"}, - {"evmos1zpwwhagst6xm8r2neje9aeu603cz9na5ekhtge", "202072004713376768"}, - {"evmos1zpxsfatcqz6fewrw5y9dqv08dsf2uznxfzuruz", "5200433760460439552"}, - {"evmos1zq2rsrj8jz236sd76f68s9qu987rzgqdewd9mu", "994263920261601280"}, - {"evmos1zq3l4fr7prv2drlsaug8eg69chkk4rulmy9c5k", "470468483617231872"}, - {"evmos1zq3p7djzr46q8trp3tzrqpqukt75ds8cpgv8up", "4872821825459605504"}, - {"evmos1zq45whcsrd7jcewh2meg0n6fj5elnq4x30wcmj", "6996630511173232640"}, - {"evmos1zq5kf4u2fw307kue633gc2r6lk8a8y9vftr4pc", "25782306726254223360"}, - {"evmos1zq6qwxwx0k0kd545n4k9zz2xu3eray7g48frdm", "57684753243875584"}, - {"evmos1zq8cs9r226n6ggl77czxs6zqg5297vvshfew60", "16435289885901410304"}, - {"evmos1zq9lpf3j3u8wk245mjh5y3x6esp2sjyjrywqh6", "23343724798462214144"}, - {"evmos1zq9v88stj4s3emc699gf8ewyug04azc7fkysrh", "409749786623671296"}, - {"evmos1zqah8j4lhkzu23sm2v3xwsqenz387kemml9xfh", "1681603971691916288"}, - {"evmos1zqcf0jpy9gur9jq6zxg5quy03nd2s6xfpsewzc", "57981223958221312"}, - {"evmos1zqearvuwuuv6ke47e9xd2fd0ey6dg0aq2pvjyk", "827877780551995392"}, - {"evmos1zqg0knsgh7c3w0p7wm93wdtf3dzd256r8dm487", "7321117918997929984"}, - {"evmos1zqkcdyawfarnv66syx8pu6j82tys5y6kcfy8u5", "884627374078309888"}, - {"evmos1zqna7dla97v4whuql5cumxmvhsynvgltaqduyu", "1196093819446074368"}, - {"evmos1zqp5sdp2vpf75ylw5dyvtc7s74ur5m3k5mdcc2", "2739754222816976896"}, - {"evmos1zqpaae3x875u5k0j8s7a6sazvk8xlepx9yxehh", "569855813834475520"}, - {"evmos1zqqnfeaa09ls0cs2c786dl9ndtsrm3pe0jcz3t", "3326220608295673856"}, - {"evmos1zqr4wx8q47kwskt6dzj34wv70wmxj5zyaszxn9", "11271939190000128"}, - {"evmos1zqrznxzaqnvtxmedjppehwxyr844qvpsqykvar", "1666575161120618496"}, - {"evmos1zqs7a2yep9j5dzr58halcx8kwamkadplrqxaad", "46831949769187164160"}, - {"evmos1zqsl86049gya2zfzt6l7gel2c9xlh6mek7efgc", "214839149209941504"}, - {"evmos1zqtcf4zqmwu7x8efzat00fglg84rrvu7y0yzwf", "5665194360269502464"}, - {"evmos1zqu38760u2pmdfp94tk0aeasrgw538gv8rt9vw", "12361019817999200256"}, - {"evmos1zqwqrpts6dxsklxx4a8l32scm6jmlpxj8rkpm2", "2488510226885446656"}, - {"evmos1zqxgafmsvh6hxx52ffdla4smr3vwlfw2jc9t7p", "3137750577924161536"}, - {"evmos1zqy2p3nfm5mjjtfpypa7cgwp4utykf8wvc9dzm", "2290512858123986944"}, - {"evmos1zqzw7w9qaaf8tdgkqs6sejh4djj03anets30rs", "539439466694385664"}, - {"evmos1zr0vmsrw7njfw4l7h0nf9l89g78rsx7vvyg8w3", "8688734461344235520"}, - {"evmos1zr2f7z72jnlww3kuzuzezt9kdv2nr96nvfus65", "675574784395364352"}, - {"evmos1zr50ynnxy5xnacfx3krawewnq9ar5xk8r879kr", "1664042511881480192"}, - {"evmos1zr5drn7q006t605jhdt53evupkrl7lmn5gguqq", "44292715302433316864"}, - {"evmos1zr8m4vh8zryk9l0sgdnpy2dzu0kjfjdsah79e4", "109017602303889408"}, - {"evmos1zrahr9e78l62nua922khxnfddh6pd0y7eugpg6", "3135518347586719744"}, - {"evmos1zrd0r9f7uhhe64twngsytedt2kfa94ygky733j", "611224456783781888"}, - {"evmos1zrddwd7sc63hhqrhvfkun5pvcl7tk4283xnd7r", "18417413209771098112"}, - {"evmos1zrdlrskagacj65hett0dsvfg7mzgnpwl9tkxuf", "1246117456648208384"}, - {"evmos1zrehw6ljhvvt3f2wed7r97gh9vmdy4cda0dx3k", "20878089789824876544"}, - {"evmos1zrfjxr3g7f7d4fjk9mew9ngryewr0l3adfead6", "3934601571792054272"}, - {"evmos1zrh3nwsqlhuz80p2h4w8lr9jhss4j253l2prez", "2786632480324935680"}, - {"evmos1zrjk80v3cw8qjfcyn7dpqatvett0wsryqwlpva", "4541307709095655424"}, - {"evmos1zrn9zfz398em0hgry7g76xjuwlgkcwt8nurpxz", "909905206917070848"}, - {"evmos1zrstelneq2a293ztcdznzly6qqvsvn36f4say9", "2943785555154454528"}, - {"evmos1zrt048ke2f548dw765ypmujtqhmlmn5rarg46n", "6179701541555699712"}, - {"evmos1zrtqg8auq2vym3gyvdaf8rmhxys2vcg0x53mdc", "53161078427852668928"}, - {"evmos1zrwpulzhfd0xjqhlhdqpyckwqc90q95neuara8", "4498710074053913600"}, - {"evmos1zs26cjva7hq6f66wjzjzep4qyhs88nkakjvus5", "2101227904288632320"}, - {"evmos1zs3le36d4qh6q0tslg0h5y3dkxazx9urpu0nwy", "32601854193258520576"}, - {"evmos1zs5madqapr7ujadrk4rrpgaxq72ww0hchfrgql", "713155611607355904"}, - {"evmos1zs5n0d0zkyh7d0h244swsgsu8gf84n6hlskq3q", "826271938829814400"}, - {"evmos1zs5pv5m529f323z60607u0s50w8pu5khnvejcf", "1257295359773759488"}, - {"evmos1zs9ad8nv88ut3jscrnwfshg33cc2sws3wqjv3e", "2513453307664916992"}, - {"evmos1zs9ays83xea2t3tp9wxl43cy9u8sx5jkjpm7mk", "2708569624741494784"}, - {"evmos1zs9kh2lw8pkystre2l77dhs8msvw9g3f0axkdz", "1476527291622676992"}, - {"evmos1zsau5gwvu7utgwxl533revg54m53lnsce0uhwl", "3050276359070156288"}, - {"evmos1zsayfhgq20welxm5dvuzppzrghftnxtue4ps00", "2396705579933816832"}, - {"evmos1zsc6txs83fkt53eu8zvmdtf43ttf354948efa8", "582900302685104128"}, - {"evmos1zsd3tvp3nvlqt6cfjm2px5sxwcl9vk8veytgdd", "1262555313643266048"}, - {"evmos1zsecxd4pvevmdl8r0ytesywa4fmx5d7sk2746l", "6343053814923558912"}, - {"evmos1zsepzk382wkleashvz874t8dg97qvq6nh77n2e", "938283594321588224"}, - {"evmos1zsf5ds5cf4t48sjzy7g65m5gufczwe6x5m2gyr", "797739357964813312"}, - {"evmos1zsg00he8dwej9aadwqgl926veg2x2xxk8kkrk3", "2864831172313284608"}, - {"evmos1zsj29sq4f5jkxzkklecyt6nh65t9320xlk4a4n", "3567511915911233536"}, - {"evmos1zsm72dfqssy6w4sydnf7skvheld8yge72708gn", "7481957684405291008"}, - {"evmos1zsn3dlve0hm454cc4jw7fn8nv8h7ns59qrw9ds", "1603923543160266752"}, - {"evmos1zspjjyxcatahxtt84849hc7zpmyfl8khhjkzx3", "909533415275802112"}, - {"evmos1zsr9ycvfcued9pd5s750rh5vagmvd8w8r3hule", "170409794344676608"}, - {"evmos1zsxn7c9vsszhrglq3cschq3sjn28z4tyhx9aew", "1015832592593630208"}, - {"evmos1zsxnn26257nwdwl2zm9tug9ltefacf23cc77ka", "764064427392325632"}, - {"evmos1zsymak2dd2e8cg80gvu5sjpk7zxad6e9czz6kk", "14609966910764554240"}, - {"evmos1zt4qemdlns0g86spwjm9862aug0x6judx5ycwc", "4873430602947324928"}, - {"evmos1zt5fslrkyuqavrc0elhxs7acunq824d2099eg3", "20976450903329357824"}, - {"evmos1zt5pywpzfpfznma2prxjgn38u5e7k86te8eknm", "93740420994007040"}, - {"evmos1zt8f00430guh8uylxsxs94kpdamwgl8aqgh9xd", "1476598775650632960"}, - {"evmos1zt9wt5uulzgysp8el7n7act5rnj83tqqt2c9yq", "9114414815302451200"}, - {"evmos1ztcexqw9g2xu5ykt4a6s33np7lzkvzkfmyx49l", "662277928960067584"}, - {"evmos1ztcs7g58djpy9hd5sj6g56cymywzkfrfkvedtp", "5502309915050640384"}, - {"evmos1ztepdt80sravmdkrkrc487m2h6c92j4z7632rs", "2260344050956410880"}, - {"evmos1ztfcr8ljhh8jun6nc729rfmxwaqh34w94e6rkg", "102573884885981952"}, - {"evmos1ztg58z42d3k2sr04t4a8vr0vtd3v5w83d77al5", "1393010627127680256"}, - {"evmos1zthdmmezqu3u2c6fvlnp0qy4x6m93nd2zutprz", "6285534318654750720"}, - {"evmos1zthpd5cp50wt9gswqp7q296ke89s6wafylmjxt", "5165595681744513024"}, - {"evmos1ztk3pk765y35rl4j4q4g0jlf435k6xpsl3uhs5", "1360770268734484992"}, - {"evmos1ztndg5za59p5f3t9egxr3h2njnu3f6e5xshy0c", "1808004642436925440"}, - {"evmos1ztpmdlsmquutcp3ff3s26wq0z7r5mewgcq4tng", "1963004848015521792"}, - {"evmos1ztpu0w2ppj6sq9hezfvzn6thlqw2swaq78yl9h", "1148074913765867520"}, - {"evmos1ztqkh03ly0nketpx73kpletd2qy6jfqjpxnjhx", "973210332970933760"}, - {"evmos1ztr5hk8drup0nkdx79sdmzs4wnqm97jsdfd4w5", "196978243746065408"}, - {"evmos1ztr7uhx2u9aljtkdszfntplekszrpl93qgngp8", "114471535755649662976"}, - {"evmos1ztrqx4gp65lje43j56jw3qkkpthp5397rz3q0g", "448565104433068800"}, - {"evmos1ztsrrs4ejzfz0fsn66clc5nzw24ft5305uwust", "2489179021862158336"}, - {"evmos1zttp3pfvst3ssptptv5v388u88vl4tlusja3x5", "1948657784719635456"}, - {"evmos1zu3searqddvux47qmlxqmze2nkjzps20wpf5fu", "29033264442325913600"}, - {"evmos1zu4kuq3uyksevgffzal334d4mnjyr68xxhutzu", "384930283638366976"}, - {"evmos1zu5qyjg6salcaqhdpytvj52npj5jpcf6ujs2el", "424952627566150400"}, - {"evmos1zu6tu5xrzmh7d6d5ysnwe5kgk2ash64wylx59r", "405846763982872320"}, - {"evmos1zu806c7u5da8ly4zl024zm8pjx9t2fk0cklg90", "336725218433702912"}, - {"evmos1zu992zlzurmypkp5s8h5k6hsnasu6fjksc82v0", "31119942136915214336"}, - {"evmos1zuaqzvdr89vyxunuke2wtdwk46wqcfvgnwxsyh", "10705120786293415936"}, - {"evmos1zud9wjc2mgakdu44f2dpsh30738qvfpwc50hdj", "93138735986591744"}, - {"evmos1zudln00vm25pr2jdzzrl070uyce72cyjnzzk7l", "941247508055748608"}, - {"evmos1zugmc54l0czfgvjhn9chlejq7xfyv9ahpg3mng", "1448603257613680640"}, - {"evmos1zuhzk7mefcw3g8r9c5hm2z404qhgjnu4tscl09", "316559090188875264"}, - {"evmos1zuja9efuzknz4km705plvg3clxh8zufazmd2nm", "1497826060249432064"}, - {"evmos1zukvzp5kuypttpygh9vz0svcgls34rjr85usuh", "850664078939308032"}, - {"evmos1zuqr8uhqucx9d3c29qmlf05xewa34r8rsd4st4", "1141514699932318720"}, - {"evmos1zury98g85t0tn4zdsnnemj4yt7stxkc4zsw6dh", "963277938503556096"}, - {"evmos1zuuckkkpuv7t59guc6wgevxce8ay7qucqxh3c4", "7413977747593592832"}, - {"evmos1zuxhgevkkxt04fph7dxqq2gk080fnlyckrfqq0", "384252681766087936"}, - {"evmos1zv0fm3rf3c9k3g5sty50keuxvntyq3mqq4yh6g", "2461666836170826752"}, - {"evmos1zv5cat4jjc62xp04en3memsx54zu5w4vttp2d9", "2641744905013612544"}, - {"evmos1zv5wap3gkwqmtqek67grwxywkl4sp259dkv0m3", "4020226755886284800"}, - {"evmos1zv6pjp3p25h9nllqh6d6x3rnaskmy0jjmlmk8s", "51622840078636728320"}, - {"evmos1zv8l836gr0w6qdq630umf8t4weq9u2h9vgar22", "1591024286612179712"}, - {"evmos1zvd7k4fpzy35vjr9xu5q6tegqneqrprkqpdsch", "171963666374409216"}, - {"evmos1zvdhdwdcnhfanq28asahut9h8t0jg5fnlfpr47", "1281198945089845248"}, - {"evmos1zve0xa2lfz5u0ascdqdw80d7vxxa7ewecae5qq", "2174169700620544000"}, - {"evmos1zvflhp9zcu5aez0wz9ctmz99u9nvxw5rnr6jua", "467224255207331840"}, - {"evmos1zvgh4t5kxudrvetytnmrye94hfn9ty3fhz8q9j", "627532180049972224"}, - {"evmos1zvjx9ac0k9c4ksgll63df72feaz7qnft2ux5cx", "13935002420533956608"}, - {"evmos1zvna6lfzqypzf42q59dhgttut7f9q4q4n2sy6d", "1474650590460922880"}, - {"evmos1zvrj8unhlx0c0h05pww4zwk6gxfp9cv8ufj22q", "3174199051240013824"}, - {"evmos1zvvl443fxw4rlqxmd956km4hr3ukt6muhnw9kf", "1460884145404028928"}, - {"evmos1zvw47hhf2lq9utnd7rywvztwngqfz2cfpntdjn", "360001404672454400"}, - {"evmos1zvwnvmacyqpj4nswttfnpxuv5au9kw5n8y0qen", "82344156895285477376"}, - {"evmos1zvykxrnzrvze85hjnz4djcmq6mkwp68czrw0nu", "2858356473585660928"}, - {"evmos1zw4yrnepnkppz36tgq84l0axhyqg5uxvvqe6fq", "2322535773542400"}, - {"evmos1zw587wdrypjly9m2ptv2aqtm8ey05kcr33wsxh", "36207487248058707968"}, - {"evmos1zw5a9ydwhjh0h8rh492ffvd29auxg7tfcks07r", "1049762897259973120"}, - {"evmos1zw5gr42tja2qnlmylk6gaj5e78vsvd2e42n8wg", "2996682117771467776"}, - {"evmos1zw5gtkx785fsvah00ytqxcdkc63pw7ewe47kyc", "1323523622941713920"}, - {"evmos1zw7g64qjg4sduzqq4zs9qnw3pnldvx6x9h8nz5", "1120486724809591296"}, - {"evmos1zw7pzxgc8cyttnaph6wv7lp2gx9t2ugcw6dhe9", "5160269387868487680"}, - {"evmos1zwc63fnhp6crru36733f9h6cp23u92cq6hyfnh", "384205232914133760"}, - {"evmos1zwc98uqhkmrguzyjvllu8ugwayhdjknev4qguc", "3000518948007343104"}, - {"evmos1zwdadtwjmk600rsz9k6t2g708fn2e4fet0q6k6", "3999524341684604416"}, - {"evmos1zwhy35n423j5rg8wmxpzf6npmjfd6myn4gwm4k", "2271027551727157248"}, - {"evmos1zwjp9v4ypxxq3vqmhlmqgck6q5c3eg5ll3x4t5", "5848311149992312832"}, - {"evmos1zwka2c72n37l7kwkyp8zp7fgjhsh58dvuw4gva", "558739691761905664"}, - {"evmos1zwkjydjwexn95nww6dphpn84scdjrlppv6dzth", "9909912242478170112"}, - {"evmos1zwnaapx7dvz7ud2fnvdrd8zxq3p6m8zu82ajtv", "658907327131741184"}, - {"evmos1zwnlkpmygu2ddawg240y4d2ecd992xxpmf9lft", "6161009349831086080"}, - {"evmos1zwqery6ypncgplp6j8almzs9gklqksa7ezykqz", "3773984941362014720"}, - {"evmos1zwr2dllmq66p3g2hxmycqa6g7rh6htp2f72fw4", "5114664968780517376"}, - {"evmos1zwsspyxn3cv27s7jvfs5dahcc7pl2s98mhnjeu", "138131274642644736"}, - {"evmos1zwtjqwpk6zjhn52xswym2tjrw32gehumelu55x", "3167476154420020224"}, - {"evmos1zwtmknyk4d9lthl3mpwcm3nykxds6yw58v7jgv", "2359219556663783424"}, - {"evmos1zwv4kyu99zanyz794u5tdt4wztf25prtt5cv7u", "7886392227885461504"}, - {"evmos1zwvh58dwup070cpn5dlu7pugg4e5n0n3f3cd9e", "227649002109800448"}, - {"evmos1zwyh2sc95lr0wezvsyfqdxp00n2pu273ct60hy", "381633205255808512"}, - {"evmos1zwz0gvvjecd7sj0dskn9zeez04cymz54lclasa", "3623517609190483968"}, - {"evmos1zx02s3qhzng5pc6j8wyxl66m6krk7tkjund7sr", "414641964457848832"}, - {"evmos1zx20esl7z2y0pq80hr5kw5mpsjv4sletg9vpjs", "392707483607567616"}, - {"evmos1zx2c3jn5hk3nmqu7qq5aaverl6m8m7arjmjmud", "79136894909251584"}, - {"evmos1zx436n3mhdmggymjll8v9mxl000g4l2nsjz5m4", "922549546940130816"}, - {"evmos1zx45uvrlgrgcczj3l0rpn9z2934vf3x6sp8tmc", "1522594284263116800"}, - {"evmos1zx5h8q48j9p4qjq03y3dlstuh83xgcsgjnjmty", "598810132908566016"}, - {"evmos1zx6s23ndnach0mhfx9h42dugx2we3auj97v63w", "87765259820269568"}, - {"evmos1zx6wd6g9htgaqwdjnp5g9ptt3hhhnmknrltq4u", "1375930454517145600"}, - {"evmos1zx8z4crnstv2ca58ztsftw455pjepe99xpq9vq", "6435582723189870592"}, - {"evmos1zxg9va42y0h2wp99g7wzljj6t0qejz73xm9h4f", "429094755653457152"}, - {"evmos1zxgsk2vmturmcw60q8ma8rhxapx033dcw356aa", "13821938844099919872"}, - {"evmos1zxjn45q25lvkelgz8fttf2vkvxztclnq5zv4gg", "4556683178280589312"}, - {"evmos1zxmpmfz06nca2q35lfjl9qaqvt6a2kkyezm6hc", "1785900954642037248"}, - {"evmos1zxrjgzd5wlp72ds6hqpazvwk7d2cm9y6m6ne92", "13140980628893208576"}, - {"evmos1zxsr7vmcff24nzzrplr4h7a3qkahx2cnltl68k", "2076456308790716416"}, - {"evmos1zxswlpw7prt0fmtwcm4w2pdgu8lh99pqls48rt", "28302411945807872"}, - {"evmos1zxu0488l5uy5jxtpjt42p32689qxv4te9pqcy3", "292102643296188416"}, - {"evmos1zxunkgu47qkrupujmcsuhtej6fflle98y5lepa", "3002566332064444416"}, - {"evmos1zxv9x0vxsy9cu5anzvpyt4plmhmfcn694mg769", "4703841647309984768"}, - {"evmos1zxwu3z8u7e58y6c7mhar9m3jpsnnzp98gcw7gk", "1275644323059379712"}, - {"evmos1zxzklg0t8uva493dk7pxj4ahweyv2tw2yzudz3", "1316919575836877312"}, - {"evmos1zy6846j5pkh2raryxgptx69g3040e55p7rj5ua", "4364248973830699008"}, - {"evmos1zy6sq9tzsmgqq0wul8js5fupyepd0nedjrwr88", "96927469995879399424"}, - {"evmos1zya9f7lckylnx7ansecgjf4wsldjezvg5ep5yp", "388043185710064128"}, - {"evmos1zycuk0wtcjpzmyz3qt43d3u7an549g3lgd0xrn", "1480778393633407488"}, - {"evmos1zyd5vfrt4xl5dmc4mj3e4dmhtztjwx23jtr4gd", "8090775258342813696"}, - {"evmos1zydfnxz8tdaerz99mwmaemgrj7qt4vzamjw23n", "5166382231212634112"}, - {"evmos1zykv5q0xq8r6wajw48nw7vszdpqvdfxtlu047m", "1290543130658155520"}, - {"evmos1zylskuqr768p0wdnn6t853nxderqeqxj347sz0", "27472255343394209792"}, - {"evmos1zym6xm5sktyqpvtr3twf84jd3ttee4ungc5kdm", "625071763784790016"}, - {"evmos1zyvjaesuquugz0spck96rdgpmjdzmf8dw35zlz", "101051267024112896"}, - {"evmos1zywzdgpv5szsdpx5pq7h9c48c8wt4pfllld7ds", "1428533294674163712"}, - {"evmos1zyzrju8s6xqltxpcm8f2rkga7qwumjgv7vz7u4", "4161721747279505408"}, - {"evmos1zz4ft2dxfd989tmlym4f93ehmxws6hdgtjh8un", "1460862631872786432"}, - {"evmos1zz6vfmdgmzj42t6m586hf5mffgxprvpjlkakcr", "1181810588137009152"}, - {"evmos1zz9a259g3zmpwjmmkt64tlzqq6cc2wvyep74yh", "17303987320942899200"}, - {"evmos1zza6tgsk9akvqa347x5xytem5xkwm7suwmq40j", "1410295548566225152"}, - {"evmos1zzam92y30fffq293pne9pt6x042vp57latqdnp", "1002830724550787072"}, - {"evmos1zzaz8ugp76s5u7u4z8pue7nwf89e6lyl7mxmct", "7937823767409564672"}, - {"evmos1zzejqs9p58e5na2l0nqaz3ffxgf6rkcnfn083e", "71934098956837355520"}, - {"evmos1zzftcjrmad55ssghzy0fjgkce67l3u69svvwwl", "17449246042048696320"}, - {"evmos1zzgq9zsxl33lyksnsae8zeqxdzzt5ayv7nzdku", "3052057170062338560"}, - {"evmos1zzh8hq3ft96sp9at90tvaryzk2l8r9gzuqq59s", "5551691333948007424"}, - {"evmos1zzhuc2puzq4mw0qgrxthdr3c68ewerdpgj2ljj", "1154498766784299520"}, - {"evmos1zzje4hz2jgws6jk74wdx0l8rcw0ylf2k394hzq", "472716128184014336"}, - {"evmos1zzjzu53g0cqyy460dz58a9kujrl8yct5g0zdrv", "5140366385525913600"}, - {"evmos1zzkh2gszl4x8h033qlldhfazykavs4tc2n8gjf", "1774123199228248064"}, - {"evmos1zzpxkqh80zpy0uh23fts36ekv0g57e2xw52qqu", "4794737921886871552"}, - {"evmos1zzrw5zu345zgyvrfn8ucpejadyl840quvum28y", "2305317189100076288"}, - {"evmos1zzsjz9yanazjn5te84qfccj940zkxyt3jj6r07", "1452045819642409472"}, - {"evmos1zzu0eg62vuj5c8wfpglcvghu08crsyu30dpd3m", "73399080228874010624"}, - {"evmos1zzu349whje4r7730sfhq0t8chlc0vqdz3pcq43", "846106333618927744"}, - {"evmos1zzuttewnk3keg6m3xf2n3wxd2h7wkvj7068hqy", "12182799819273142272"}, - {"evmos1zzv76and72vclw43znyrxckp4x0cgfzp8r3aqw", "407939156967250688"}, - {"evmos1zzva4fgz93tpj6rs7vv2mpxnqhpka28xhlneaq", "476293477575783168"}, - {"evmos1zzvy6yhzmp6llwepu82qan96ulcy7awec0pmwp", "676766954858940928"}, - {"evmos1zzx2jdj55gf8t42ewh47z0zmpn2p2afmmph8f7", "341531960847403264"}, - {"evmos1zzxmyznjfyy7au4vkh8ez5u8rre9n7kp3xk4ml", "375254261125595136"}, - {"evmos1zzyzf90sx3rqjzgrmnj6spckt2sw5h4deqrq2h", "371014786993331968"}, - {"evmos1zzztcsuqzlusfhv4p6daxr6svz3p29u2ga80q5", "6903645870970134528"}, -} diff --git a/app/upgrades/v12/constants.go b/app/upgrades/v12/constants.go deleted file mode 100644 index 7e64d77736..0000000000 --- a/app/upgrades/v12/constants.go +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package v12 - -const ( - // UpgradeName is the shared upgrade plan name for mainnet - UpgradeName = "v12.1.0" - // UpgradeInfo defines the binaries that will be used for the upgrade - UpgradeInfo = `'{"binaries":{"darwin/arm64":"https://github.com/evmos/evmos/releases/download/v12.1.0/evmos_12.1.0_Darwin_arm64.tar.gz","darwin/amd64":"https://github.com/evmos/evmos/releases/download/v12.1.0/evmos_12.1.0_Darwin_amd64.tar.gz","linux/arm64":"https://github.com/evmos/evmos/releases/download/v12.1.0/evmos_12.1.0_Linux_arm64.tar.gz","linux/amd64":"https://github.com/evmos/evmos/releases/download/v12.1.0/evmos_12.1.0_Linux_amd64.tar.gz","windows/x86_64":"https://github.com/evmos/evmos/releases/download/v12.1.0/evmos_12.1.0_Windows_x86_64.zip"}}'` - // MaxRecover is the maximum amount of coins to be redistributed in the upgrade - MaxRecover = "169580456887205410791936" -) diff --git a/app/upgrades/v12/upgrades.go b/app/upgrades/v12/upgrades.go deleted file mode 100644 index 5973ec67c5..0000000000 --- a/app/upgrades/v12/upgrades.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package v12 - -import ( - "fmt" - - sdkmath "cosmossdk.io/math" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/module" - distrKeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" - upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - "github.com/evmos/evmos/v16/utils" -) - -// CreateUpgradeHandler creates an SDK upgrade handler for v12 -func CreateUpgradeHandler( - mm *module.Manager, - configurator module.Configurator, - dk distrKeeper.Keeper, -) upgradetypes.UpgradeHandler { - return func(ctx sdk.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { - logger := ctx.Logger().With("upgrade", UpgradeName) - - if utils.IsMainnet(ctx.ChainID()) { - logger.Debug("recovering lost funds from claims decay bug...") - if err := ReturnFundsFromCommunityPool(ctx, dk); err != nil { - // log error instead of aborting the upgrade - logger.Error("FAILED TO RECOVER FROM COMMUNITY FUNDS", "error", err.Error()) - } - } - - // Leave modules are as-is to avoid running InitGenesis. - logger.Debug("running module migrations ...") - return mm.RunMigrations(ctx, configurator, vm) - } -} - -// ReturnFundsFromCommunityPool handles the return of funds from the community pool to accounts affected during the claims decay bug -func ReturnFundsFromCommunityPool(ctx sdk.Context, dk distrKeeper.Keeper) error { - availableCoins, ok := sdkmath.NewIntFromString(MaxRecover) - if !ok || availableCoins.IsNegative() { - return fmt.Errorf("failed to read maximum amount to recover from community funds") - } - for i := range Accounts { - refund, _ := sdkmath.NewIntFromString(Accounts[i][1]) - if availableCoins.LT(refund) { - return fmt.Errorf("refund exceeds the total available coins: %s > %s", Accounts[i][1], availableCoins) - } - if err := ReturnFundsFromCommunityPoolToAccount(ctx, dk, Accounts[i][0], refund); err != nil { - return err - } - availableCoins = availableCoins.Sub(refund) - } - return nil -} - -// ReturnFundsFromCommunityPoolToAccount sends specified amount from the community pool to the affected account -func ReturnFundsFromCommunityPoolToAccount(ctx sdk.Context, dk distrKeeper.Keeper, account string, amount sdkmath.Int) error { - to := sdk.MustAccAddressFromBech32(account) - balance := sdk.Coin{ - Denom: utils.BaseDenom, - Amount: amount, - } - - return dk.DistributeFromFeePool(ctx, sdk.Coins{balance}, to) -} diff --git a/app/upgrades/v12/upgrades_test.go b/app/upgrades/v12/upgrades_test.go deleted file mode 100644 index 75bad6137c..0000000000 --- a/app/upgrades/v12/upgrades_test.go +++ /dev/null @@ -1,106 +0,0 @@ -package v12_test - -import ( - "testing" - "time" - - "cosmossdk.io/math" - "github.com/stretchr/testify/suite" - - "github.com/cometbft/cometbft/crypto/tmhash" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" - "github.com/evmos/evmos/v16/testutil" - feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" - - "github.com/evmos/evmos/v16/app" - v12 "github.com/evmos/evmos/v16/app/upgrades/v12" - "github.com/evmos/evmos/v16/utils" -) - -type UpgradeTestSuite struct { - suite.Suite - - ctx sdk.Context - app *app.Evmos - consAddress sdk.ConsAddress -} - -func (suite *UpgradeTestSuite) SetupTest(chainID string) { - checkTx := false - - // consensus key - priv, err := ethsecp256k1.GenerateKey() - suite.Require().NoError(err) - suite.consAddress = sdk.ConsAddress(priv.PubKey().Address()) - - // NOTE: this is the new binary, not the old one. - suite.app = app.Setup(checkTx, feemarkettypes.DefaultGenesisState(), chainID) - suite.ctx = suite.app.BaseApp.NewContext( - checkTx, - testutil.NewHeader( - 1, - time.Date(2022, 5, 9, 8, 0, 0, 0, time.UTC), - chainID, - suite.consAddress.Bytes(), - tmhash.Sum([]byte("block_id")), - tmhash.Sum([]byte("validators")), - ), - ) - - cp := suite.app.BaseApp.GetConsensusParams(suite.ctx) - suite.ctx = suite.ctx.WithConsensusParams(cp) -} - -func TestUpgradeTestSuite(t *testing.T) { - s := new(UpgradeTestSuite) - suite.Run(t, s) -} - -func (suite *UpgradeTestSuite) TestReturnFundsFromCommunityPool() { - suite.SetupTest(utils.TestnetChainID + "-2") - - // send funds to the community pool - priv, err := ethsecp256k1.GenerateKey() - suite.Require().NoError(err) - sender := sdk.AccAddress(priv.PubKey().Address().Bytes()) - - res, ok := math.NewIntFromString(v12.MaxRecover) - suite.Require().True(ok) - - coins := sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, res)) - err = testutil.FundAccount(suite.ctx, suite.app.BankKeeper, sender, coins) - suite.Require().NoError(err) - err = suite.app.DistrKeeper.FundCommunityPool(suite.ctx, coins, sender) - suite.Require().NoError(err) - - balanceBefore := suite.app.DistrKeeper.GetFeePoolCommunityCoins(suite.ctx) - suite.Require().Equal(balanceBefore.AmountOf(utils.BaseDenom), math.LegacyNewDecFromInt(res)) - - // return funds to accounts affected - err = v12.ReturnFundsFromCommunityPool(suite.ctx, suite.app.DistrKeeper) - suite.Require().NoError(err) - - // store the addresses on a map to check if there're - // duplicated addresses - uniqueAddrs := make(map[string]bool) - // check balance of affected accounts - for i := range v12.Accounts { - addr := sdk.MustAccAddressFromBech32(v12.Accounts[i][0]) - // check for duplicated addresses - found := uniqueAddrs[v12.Accounts[i][0]] - suite.Require().False(found, "found account %s duplicated", v12.Accounts[i][0]) - uniqueAddrs[v12.Accounts[i][0]] = true - - res, ok := math.NewIntFromString(v12.Accounts[i][1]) - suite.Require().True(ok) - suite.Require().True(res.IsPositive()) - balance := suite.app.BankKeeper.GetBalance(suite.ctx, addr, utils.BaseDenom) - suite.Require().Equal(balance.Amount, res) - } - - balanceAfter := suite.app.DistrKeeper.GetFeePoolCommunityCoins(suite.ctx) - suite.Require().True(balanceAfter.IsZero(), "Community pool balance should be zero after the distribution, but is %d", balanceAfter.AmountOf(utils.BaseDenom)) -} diff --git a/app/upgrades/v13/constants.go b/app/upgrades/v13/constants.go deleted file mode 100644 index 4c901ca1c5..0000000000 --- a/app/upgrades/v13/constants.go +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package v13 - -const ( - // UpgradeName is the shared upgrade plan name for mainnet - UpgradeName = "v13.0.2" - // UpgradeInfo defines the binaries that will be used for the upgrade - UpgradeInfo = `'{"binaries":{"darwin/arm64":"https://github.com/evmos/evmos/releases/download/v13.0.2/evmos_13.0.2_Darwin_arm64.tar.gz","darwin/amd64":"https://github.com/evmos/evmos/releases/download/v13.0.2/evmos_13.0.2_Darwin_amd64.tar.gz","linux/arm64":"https://github.com/evmos/evmos/releases/download/v13.0.2/evmos_13.0.2_Linux_arm64.tar.gz","linux/amd64":"https://github.com/evmos/evmos/releases/download/v13.0.2/evmos_13.0.2_Linux_amd64.tar.gz","windows/x86_64":"https://github.com/evmos/evmos/releases/download/v13.0.2/evmos_13.0.2_Windows_x86_64.zip"}}'` -) diff --git a/app/upgrades/v13/upgrades.go b/app/upgrades/v13/upgrades.go deleted file mode 100644 index 233b74c7ca..0000000000 --- a/app/upgrades/v13/upgrades.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package v13 - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/module" - upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - evmkeeper "github.com/evmos/evmos/v16/x/evm/keeper" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" -) - -// CreateUpgradeHandler creates an SDK upgrade handler for v13 -func CreateUpgradeHandler( - mm *module.Manager, - configurator module.Configurator, - ek evmkeeper.Keeper, -) upgradetypes.UpgradeHandler { - return func(ctx sdk.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { - logger := ctx.Logger().With("upgrade", UpgradeName) - - if err := setPrecompilesParams(ctx, ek); err != nil { - logger.Error("error while setting precompiles parameters", "error", err) - } - // Leave modules are as-is to avoid running InitGenesis. - logger.Debug("running module migrations ...") - return mm.RunMigrations(ctx, configurator, vm) - } -} - -func setPrecompilesParams(ctx sdk.Context, ek evmkeeper.Keeper) error { - params := ek.GetParams(ctx) - params.ActivePrecompiles = evmtypes.AvailableEVMExtensions - return ek.SetParams(ctx, params) -} diff --git a/app/upgrades/v14/constants.go b/app/upgrades/v14/constants.go deleted file mode 100644 index b64c42ff2f..0000000000 --- a/app/upgrades/v14/constants.go +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package v14 - -const ( - // UpgradeName is the shared upgrade plan name for mainnet - UpgradeName = "v14.0.0" - // UpgradeInfo defines the binaries that will be used for the upgrade - UpgradeInfo = `'{"binaries":{"darwin/arm64":"https://github.com/evmos/evmos/releases/download/v14.0.0/evmos_14.0.0_Darwin_arm64.tar.gz","darwin/amd64":"https://github.com/evmos/evmos/releases/download/v14.0.0/evmos_14.0.0_Darwin_amd64.tar.gz","linux/arm64":"https://github.com/evmos/evmos/releases/download/v14.0.0/evmos_14.0.0_Linux_arm64.tar.gz","linux/amd64":"https://github.com/evmos/evmos/releases/download/v14.0.0/evmos_14.0.0_Linux_amd64.tar.gz","windows/x86_64":"https://github.com/evmos/evmos/releases/download/v14.0.0/evmos_14.0.0_Windows_x86_64.zip"}}'` -) diff --git a/app/upgrades/v14/migrations.go b/app/upgrades/v14/migrations.go deleted file mode 100644 index c525e39cce..0000000000 --- a/app/upgrades/v14/migrations.go +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package v14 - -import ( - "fmt" - - "cosmossdk.io/math" - sdk "github.com/cosmos/cosmos-sdk/types" - bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" -) - -// MigratedDelegation holds the relevant information about a delegation to be migrated -type MigratedDelegation struct { - // validator is the validator address - validator sdk.ValAddress - // amount is the amount to be delegated - amount math.Int -} - -// MigrateNativeMultisigs migrates the native multisigs to the new team multisig including all -// staking delegations. -func MigrateNativeMultisigs(ctx sdk.Context, bk bankkeeper.Keeper, sk stakingkeeper.Keeper, newMultisig sdk.AccAddress, oldMultisigs ...string) error { - var ( - // bondDenom is the staking bond denomination used - bondDenom = sk.BondDenom(ctx) - // migratedDelegations stores all delegations that must be migrated - migratedDelegations []MigratedDelegation - ) - - // NOTE: We are checking the bond denomination here because this is what caused the panic - // during the v14.0.0 upgrade. - if bondDenom == "" { - return fmt.Errorf("invalid bond denom received during migration: %s", bondDenom) - } - - logger := ctx.Logger().With("module", "v14-migrations") - - for _, oldMultisig := range oldMultisigs { - oldMultisigAcc := sdk.MustAccAddressFromBech32(oldMultisig) - delegations := sk.GetAllDelegatorDelegations(ctx, oldMultisigAcc) - - for _, delegation := range delegations { - unbondAmount, err := InstantUnbonding(ctx, bk, sk, delegation, bondDenom) - if err != nil { - // NOTE: log error instead of aborting the whole migration - logger.Error(fmt.Sprintf("failed to unbond delegation %s from validator %s: %s", delegation.GetDelegatorAddr(), delegation.GetValidatorAddr(), err.Error())) - continue - } - - // NOTE: if the unbonded amount is zero we are not adding it - // to the migrated delegations, because there is nothing to be delegated. - if unbondAmount.IsZero() { - continue - } - - migratedDelegations = append(migratedDelegations, MigratedDelegation{ - validator: delegation.GetValidatorAddr(), - amount: unbondAmount, - }) - } - - // Send coins to new team multisig - balances := bk.GetAllBalances(ctx, oldMultisigAcc) - err := bk.SendCoins(ctx, oldMultisigAcc, newMultisig, balances) - if err != nil { - // NOTE: log error instead of aborting the whole migration - logger.Error(fmt.Sprintf("failed to send coins from %s to %s: %s", oldMultisig, newMultisig.String(), err.Error())) - continue - } - } - - // Delegate from multisig to same validators - for _, migration := range migratedDelegations { - val, ok := sk.GetValidator(ctx, migration.validator) - if !ok { - // NOTE: log error instead of aborting the whole migration - logger.Error(fmt.Sprintf("validator %s not found", migration.validator.String())) - continue - } - if _, err := sk.Delegate(ctx, newMultisig, migration.amount, stakingtypes.Unbonded, val, true); err != nil { - // NOTE: log error instead of aborting the whole migration - logger.Error(fmt.Sprintf("failed to delegate %s from %s to %s", - migration.amount.String(), newMultisig.String(), migration.validator.String(), - )) - continue - } - } - - return nil -} - -// InstantUnbonding will execute an instant unbonding of the given delegation -// -// NOTE: this logic contains code copied from different functions of the -// staking keepers's undelegate implementation. -func InstantUnbonding( - ctx sdk.Context, - bk bankkeeper.Keeper, - sk stakingkeeper.Keeper, - del stakingtypes.Delegation, - bondDenom string, -) (unbondAmount math.Int, err error) { - delAddr := del.GetDelegatorAddr() - valAddr := del.GetValidatorAddr() - - // Check if there are any outstanding redelegations for delegator - validator pair - // - this would require additional handling - if sk.HasReceivingRedelegation(ctx, delAddr, valAddr) { - return math.Int{}, fmt.Errorf("redelegation(s) found for delegator %s and validator %s", delAddr, valAddr) - } - - unbondAmount, err = sk.Unbond(ctx, delAddr, valAddr, del.GetShares()) - if err != nil { - return math.Int{}, err - } - - // NOTE: if the unbonded amount is zero there are no tokens to be transferred between the staking pools - // and neither to be undelegated from the module to the account - if unbondAmount.IsZero() { - return unbondAmount, nil - } - - // NOTE: We avoid using sdk.NewCoins here because it panics on an invalid denom, - // which was the problem in the v14.0.0 release. - unbondCoins := sdk.Coins{sdk.Coin{Denom: bondDenom, Amount: unbondAmount}} - if err := unbondCoins.Validate(); err != nil { - return math.Int{}, fmt.Errorf("invalid unbonding coins: %v", err) - } - - // transfer the validator tokens to the not bonded pool if necessary - validator, found := sk.GetValidator(ctx, valAddr) - if !found { - return math.Int{}, fmt.Errorf("validator %s not found", valAddr) - } - if validator.IsBonded() { - if err := bk.SendCoinsFromModuleToModule( - ctx, stakingtypes.BondedPoolName, stakingtypes.NotBondedPoolName, unbondCoins, - ); err != nil { - panic(err) - } - } - - // Transfer the tokens from the not bonded pool to the delegator - if err := bk.UndelegateCoinsFromModuleToAccount( - ctx, stakingtypes.NotBondedPoolName, delAddr, unbondCoins, - ); err != nil { - return math.Int{}, err - } - - return unbondAmount, nil -} diff --git a/app/upgrades/v14/migrations_test.go b/app/upgrades/v14/migrations_test.go deleted file mode 100644 index af7c7c5eb8..0000000000 --- a/app/upgrades/v14/migrations_test.go +++ /dev/null @@ -1,201 +0,0 @@ -package v14_test - -import ( - "cosmossdk.io/math" - sdk "github.com/cosmos/cosmos-sdk/types" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - v14 "github.com/evmos/evmos/v16/app/upgrades/v14" - "github.com/evmos/evmos/v16/testutil" - testutiltx "github.com/evmos/evmos/v16/testutil/tx" -) - -// TestUpdateMigrateNativeMultisigs is the main test for the migration of the strategic reserves and the premint wallet. -// This test is where the actual mainnet data is being replicated and the full migration tested. -func (s *UpgradesTestSuite) TestUpdateMigrateNativeMultisigs() { - s.SetupTest() - - amountPremint, ok := math.NewIntFromString("64699999994000000000000000") - s.Require().True(ok, "failed to parse premint amount") - amount1, ok := math.NewIntFromString("13824747333293928482487986") - s.Require().True(ok, "failed to parse amount1") - amount1IBC, ok := math.NewIntFromString("421720500000000000000") - s.Require().True(ok, "failed to parse amount2") - amount2, ok := math.NewIntFromString("494000000000000000") - s.Require().True(ok, "failed to parse amount3") - amount3 := amount2 - amount4 := amount2 - amount5, ok := math.NewIntFromString("1013699976000000000000000") - s.Require().True(ok, "failed to parse amount6") - - var ( - oldPremintCoin = sdk.Coin{Denom: s.bondDenom, Amount: amountPremint} - stratRes1EvmosCoin = sdk.Coin{Denom: s.bondDenom, Amount: amount1} - stratRes1IBCCoin = sdk.Coin{Denom: "someIBCdenom", Amount: amount1IBC} - stratRes2Coin = sdk.Coin{Denom: s.bondDenom, Amount: amount2} - stratRes3Coin = sdk.Coin{Denom: s.bondDenom, Amount: amount3} - stratRes4Coin = sdk.Coin{Denom: s.bondDenom, Amount: amount4} - stratRes5Coin = sdk.Coin{Denom: s.bondDenom, Amount: amount5} - - // We are delegating one token to each of the validators in the test setup - delegateAmount = int64(1) - // One delegated token equals to 1e-18 share issued for the delegator - delegateShares = math.LegacyNewDecWithPrec(1, 18) - ) - - oldStrategicReserves := make([]MigrationTestAccount, 0, 5) - for idx := 0; idx < 5; idx++ { - oldStrategicReserves = append(oldStrategicReserves, GenerateMigrationTestAccount()) - s.T().Logf("Old Strategic Reserve %d: %q\n", idx+1, oldStrategicReserves[idx].Addr.String()) - } - // assign pre-balances - oldStrategicReserves[0].BalancePre = sdk.NewCoins(stratRes1EvmosCoin, stratRes1IBCCoin) - oldStrategicReserves[1].BalancePre = sdk.NewCoins(stratRes2Coin) - oldStrategicReserves[2].BalancePre = sdk.NewCoins(stratRes3Coin) - oldStrategicReserves[3].BalancePre = sdk.NewCoins(stratRes4Coin) - oldStrategicReserves[4].BalancePre = sdk.NewCoins(stratRes5Coin) - - // the new strategic reserve should hold the sum of all old strategic reserves - newStrategicReserve := GenerateMigrationTestAccount() - s.T().Logf("New Strategic Reserve: %q\n", newStrategicReserve.Addr.String()) - newStrategicReserve.BalancePost = sdk.NewCoins( - stratRes1IBCCoin, - stratRes1EvmosCoin.Add(stratRes2Coin).Add(stratRes3Coin).Add(stratRes4Coin).Add(stratRes5Coin), - ) - // NOTE: after the migration the delegation that returns zero tokens should be removed / not newly delegated to - newStrategicReserve.DelegationsPost = stakingtypes.Delegations{ - stakingtypes.Delegation{ - DelegatorAddress: newStrategicReserve.Addr.String(), - ValidatorAddress: s.validators[1].OperatorAddress, - Shares: delegateShares, - }, - } - - // premint wallets - oldPremintWallet := GenerateMigrationTestAccount() - s.T().Logf("Old Premint Wallet: %q\n", oldPremintWallet.Addr.String()) - oldPremintWallet.BalancePre = sdk.Coins{oldPremintCoin} - - // the new premint wallet should have the same balance as the old premint wallet before the migration - newPremintWallet := GenerateMigrationTestAccount() - s.T().Logf("New Premint Wallet: %q\n", newPremintWallet.Addr.String()) - newPremintWallet.BalancePost = sdk.Coins{oldPremintCoin} - - // Fund the accounts to be migrated - affectedAccounts := oldStrategicReserves - affectedAccounts = append(affectedAccounts, oldPremintWallet) - for _, affectedAccount := range affectedAccounts { - err := testutil.FundAccount(s.ctx, s.app.BankKeeper, affectedAccount.Addr, affectedAccount.BalancePre) - s.Require().NoError(err, "failed to fund account %s", affectedAccount.Addr.String()) - } - - // delegation to validator 0 with zero tokens being returned because of the slashing - _, err := CreateDelegationWithZeroTokens( - s.ctx, - s.app, - oldStrategicReserves[0].PrivKey, - oldStrategicReserves[0].Addr, - s.validators[0], - delegateAmount, - ) - s.Require().NoError(err, "failed to create delegation with zero tokens") - - // delegation to validator 1 - _, err = Delegate( - s.ctx, - s.app, - oldStrategicReserves[0].PrivKey, - oldStrategicReserves[0].Addr, - s.validators[1], - delegateAmount, - ) - s.Require().NoError(err, "failed to create delegation") - - // NOTE: We send twice the delegate amount to the old strategic reserve here, because that is - // the amount that was just spent on delegations and thus removed from the balance. We need to fill it up again, - // because the expected post-migration balance does not include the delegated amount. - err = testutil.FundAccountWithBaseDenom(s.ctx, s.app.BankKeeper, oldStrategicReserves[0].Addr, 2*delegateAmount) - s.Require().NoError(err, "failed to fund account %s to even out delegated amount", oldStrategicReserves[0].Addr.String()) - // Additionally, we need to send twice the default fee that is charged for the delegation transaction. - feeAmt := testutiltx.DefaultFee.Amount.MulRaw(2) - err = testutil.FundAccountWithBaseDenom(s.ctx, s.app.BankKeeper, oldStrategicReserves[0].Addr, feeAmt.Int64()) - s.Require().NoError(err, "failed to fund account %s to account for delegation fees", oldStrategicReserves[0].Addr.String()) - - // Store addresses in a slice - oldStrategicReservesAddrs := make([]string, 0, len(oldStrategicReserves)) - for _, oldStrategicReserve := range oldStrategicReserves { - oldStrategicReservesAddrs = append(oldStrategicReservesAddrs, oldStrategicReserve.Addr.String()) - } - - // Check validator shares before migration, which are stored as the expected shares map. - // - // NOTE: There is a minor difference expected between the pre- and post-migration shares. This is because - // the zero-token delegation is being unbonded and the corresponding shares are removed. Since zero tokens - // would be delegated to the validator after the migration, the shares are not added again, creating a reduction - // in the total shares of s.validators[0] of 1e-18. - expectedSharesMap := s.getDelegationSharesMap() - expectedSharesMap[s.validators[0].OperatorAddress] = expectedSharesMap[s.validators[0].OperatorAddress].Sub(delegateShares) - - // Migrate strategic reserves - err = v14.MigrateNativeMultisigs(s.ctx, s.app.BankKeeper, s.app.StakingKeeper, newStrategicReserve.Addr, oldStrategicReservesAddrs...) - s.Require().NoError(err, "failed to migrate strategic reserves") - - // Migrate premint wallet - err = v14.MigrateNativeMultisigs(s.ctx, s.app.BankKeeper, s.app.StakingKeeper, newPremintWallet.Addr, oldPremintWallet.Addr.String()) - s.Require().NoError(err, "failed to migrate premint wallet") - - // Check that the multisigs have been updated - expectedAccounts := oldStrategicReserves - expectedAccounts = append(expectedAccounts, newStrategicReserve, oldPremintWallet, newPremintWallet) - for _, account := range expectedAccounts { - s.requireMigratedAccount(account) - } - - // Check validator shares after migration. - sharesMap := s.getDelegationSharesMap() - s.Require().Equal(expectedSharesMap, sharesMap, "expected different validator shares after migration") -} - -func (s *UpgradesTestSuite) TestInstantUnbonding() { - balancePre := s.app.BankKeeper.GetAllBalances(s.ctx, s.address.Bytes()) - notBondedPool := s.app.AccountKeeper.GetModuleAccount(s.ctx, stakingtypes.NotBondedPoolName) - poolBalancePre := s.app.BankKeeper.GetAllBalances(s.ctx, notBondedPool.GetAddress()) - delegation, found := s.app.StakingKeeper.GetDelegation(s.ctx, s.address.Bytes(), s.validators[0].GetOperator()) - s.Require().True(found, "delegation not found") - - unbondAmount, err := v14.InstantUnbonding(s.ctx, s.app.BankKeeper, s.app.StakingKeeper, delegation, s.bondDenom) - s.Require().NoError(err, "failed to unbond") - s.Require().Equal(unbondAmount, math.NewInt(1e18), "expected different unbond amount") - - expectedDiff := sdk.Coins{{Denom: s.bondDenom, Amount: unbondAmount}} - balancePost := s.app.BankKeeper.GetAllBalances(s.ctx, s.address.Bytes()) - diff := balancePost.Sub(balancePre...) - s.Require().Equal(expectedDiff, diff, "expected different balance diff") - - _, found = s.app.StakingKeeper.GetDelegation(s.ctx, s.address.Bytes(), s.validators[0].GetOperator()) - s.Require().False(found, "delegation should not be found") - - poolBalancePost := s.app.BankKeeper.GetAllBalances(s.ctx, notBondedPool.GetAddress()) - s.Require().Equal(poolBalancePre, poolBalancePost, "expected no change in pool balance") -} - -func (s *UpgradesTestSuite) TestCreateDelegationWithZeroTokens() { - s.SetupTest() - - targetValidator := s.validators[1] - - // Create new account and fund it - addr, priv := testutiltx.NewAccAddressAndKey() - err := testutil.FundAccountWithBaseDenom(s.ctx, s.app.BankKeeper, addr, 2e18) - s.Require().NoError(err, "failed to fund account") - - s.NextBlock() - - delegation, err := CreateDelegationWithZeroTokens(s.ctx, s.app, priv, addr, targetValidator, 1) - s.Require().NoError(err, "failed to create delegation with zero tokens") - s.Require().NotEqual(math.LegacyZeroDec(), delegation.Shares, "delegation shares should not be zero") - - // Check that the validators tokenFromShares method returns zero tokens when truncated to an int - valAfterSlashing := s.app.StakingKeeper.Validator(s.ctx, targetValidator.GetOperator()) - tokens := valAfterSlashing.TokensFromShares(delegation.Shares).TruncateInt() - s.Require().Equal(int64(0), tokens.Int64(), "expected zero tokens to be returned") -} diff --git a/app/upgrades/v14/setup_test.go b/app/upgrades/v14/setup_test.go deleted file mode 100644 index db701f36e9..0000000000 --- a/app/upgrades/v14/setup_test.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) -package v14_test - -import ( - "testing" - - sdk "github.com/cosmos/cosmos-sdk/types" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/ethereum/go-ethereum/common" - ethtypes "github.com/ethereum/go-ethereum/core/types" - evmosapp "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/precompiles/vesting" - "github.com/evmos/evmos/v16/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - "github.com/stretchr/testify/suite" -) - -var s *UpgradesTestSuite - -type UpgradesTestSuite struct { - suite.Suite - - ctx sdk.Context - app *evmosapp.Evmos - address common.Address - validators []stakingtypes.Validator - ethSigner ethtypes.Signer - bondDenom string - - precompile *vesting.Precompile - stateDB *statedb.StateDB - - queryClientEVM evmtypes.QueryClient -} - -func TestUpgradeTestSuite(t *testing.T) { - s = new(UpgradesTestSuite) - suite.Run(t, s) -} - -func (s *UpgradesTestSuite) SetupTest() { - s.DoSetupTest() -} diff --git a/app/upgrades/v14/upgrades.go b/app/upgrades/v14/upgrades.go deleted file mode 100644 index 3b8f7b70e5..0000000000 --- a/app/upgrades/v14/upgrades.go +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package v14 - -import ( - "github.com/cosmos/cosmos-sdk/baseapp" - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/module" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - consensuskeeper "github.com/cosmos/cosmos-sdk/x/consensus/keeper" - crisistypes "github.com/cosmos/cosmos-sdk/x/crisis/types" - distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" - minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" - paramskeeper "github.com/cosmos/cosmos-sdk/x/params/keeper" - paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" - slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - ibctmmigrations "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint/migrations" - "github.com/ethereum/go-ethereum/common" - vestingprecompile "github.com/evmos/evmos/v16/precompiles/vesting" - "github.com/evmos/evmos/v16/utils" - evmkeeper "github.com/evmos/evmos/v16/x/evm/keeper" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" -) - -const ( - // newTeamPremintWallet is the new vesting team multisig - newTeamPremintWallet = "0x83ef4C096F9A9daC61081121CCE30578fe437182" - // newTeamStrategicReserve is the new strategic reserve multisig - newTeamStrategicReserve = "0x29fDcB7b64B84fD54D0fB0E04A8f6B062046fc6F" - // OldFunder1 is one of the old vesting funders to be replaced - OldFunder1 = "evmos1sgjgup7wz3qyfcqqpr66jlm9qpk3j63ajupc9l" - // OldFunder2 is the other old vesting funder to be replaced - OldFunder2 = "evmos1xp38jqcjf2s7wyuyh3fwrjukuj4ny54k2yaq97" - // OldTeamPremintWallet is the old team premint wallet - OldTeamPremintWallet = "evmos1sgjgup7wz3qyfcqqpr66jlm9qpk3j63ajupc9l" - // VestingAddrByFunder1 is the vesting account funded by OldFunder1 - VestingAddrByFunder1 = "evmos1pxjncpsu2rd3hjxgswkqaenrpu3v5yxurzm7jp" -) - -var ( - // VestingAddrsByFunder2 is a slice of vesting accounts funded by OldFunder1 - VestingAddrsByFunder2 = []string{ - "evmos12aqyq9d4k7a8hzh5av2xgxp0njan48498dvj2s", - "evmos1rtj2r4eaz0v68mxjt5jleynm85yjfu2uxm7pxx", - } - - // OldStrategicReserves is a list of old multisigs to be replaced - OldStrategicReserves = []string{ - "evmos1z8ynrnhdn4l69mu6v6ckjr4wukcacd0e7j0akn", // Strategic Reserve 1 - "evmos1w2rl60wr9sxjv60qsh9v8aratk0x2r3v78utzt", // Strategic Reserve 2 - "evmos1fgg4xaakwmrxdk9my6uc8nxeatf7u35uaal529", // Strategic Reserve 3 - "evmos15xm3h3fgjrkqtkr79t7rj9spq3qlzuheae5vss", // Strategic Reserve 4 - "evmos15l8jnxynhldtydknzla2xpv8uxg00xgmg2enst", // Strategic Reserve 5 - } - - newTeamPremintWalletAddr = common.HexToAddress(newTeamPremintWallet) - NewTeamPremintWalletAcc = sdk.AccAddress(newTeamPremintWalletAddr.Bytes()) - newTeamStrategicReserveAddr = common.HexToAddress(newTeamStrategicReserve) - NewTeamStrategicReserveAcc = sdk.AccAddress(newTeamStrategicReserveAddr.Bytes()) -) - -// CreateUpgradeHandler creates an SDK upgrade handler for v14 -func CreateUpgradeHandler( - mm *module.Manager, - configurator module.Configurator, - ek *evmkeeper.Keeper, - ck consensuskeeper.Keeper, - clientKeeper ibctmmigrations.ClientKeeper, - pk paramskeeper.Keeper, - cdc codec.BinaryCodec, -) upgradetypes.UpgradeHandler { - return func(ctx sdk.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { - logger := ctx.Logger().With("upgrade", UpgradeName) - - if utils.IsMainnet(ctx.ChainID()) { - logger.Debug("adding vesting EVM extension to active precompiles") - if err := EnableVestingExtension(ctx, ek); err != nil { - // log error instead of aborting the upgrade - logger.Error("error while enabling vesting extension", "error", err) - } - } - - // !! ATTENTION !! - // v14 upgrade handler - // !! WHEN UPGRADING TO SDK v0.47 MAKE SURE TO INCLUDE THIS - // source: https://github.com/cosmos/cosmos-sdk/blob/release/v0.47.x/UPGRADING.md#xconsensus - // !! If not migrating to v0.47 in this upgrade, - // !! make sure to move it to the corresponding upgrade - // Migrate Tendermint consensus parameters from x/params module to a - // dedicated x/consensus module. - - // Set param key table for params module migration - for _, subspace := range pk.GetSubspaces() { - var keyTable paramstypes.KeyTable - switch subspace.Name() { - case authtypes.ModuleName: - keyTable = authtypes.ParamKeyTable() //nolint:staticcheck - case banktypes.ModuleName: - keyTable = banktypes.ParamKeyTable() //nolint:staticcheck,nolintlint - case stakingtypes.ModuleName: - keyTable = stakingtypes.ParamKeyTable() - case minttypes.ModuleName: - keyTable = minttypes.ParamKeyTable() //nolint:staticcheck - case distrtypes.ModuleName: - keyTable = distrtypes.ParamKeyTable() //nolint:staticcheck,nolintlint - case slashingtypes.ModuleName: - keyTable = slashingtypes.ParamKeyTable() //nolint:staticcheck - case govtypes.ModuleName: - keyTable = govv1.ParamKeyTable() //nolint:staticcheck - case crisistypes.ModuleName: - keyTable = crisistypes.ParamKeyTable() //nolint:staticcheck - case ibctransfertypes.ModuleName: - keyTable = ibctransfertypes.ParamKeyTable() - case evmtypes.ModuleName: - keyTable = evmtypes.ParamKeyTable() //nolint:staticcheck - case feemarkettypes.ModuleName: - keyTable = feemarkettypes.ParamKeyTable() - default: - continue - } - if !subspace.HasKeyTable() { - subspace.WithKeyTable(keyTable) - } - } - - baseAppLegacySS := pk.Subspace(baseapp.Paramspace).WithKeyTable(paramstypes.ConsensusParamsKeyTable()) - - baseapp.MigrateParams(ctx, baseAppLegacySS, &ck) - - // Include this when migrating to ibc-go v7 (optional) - // source: https://github.com/cosmos/ibc-go/blob/v7.2.0/docs/migrations/v6-to-v7.md - // prune expired tendermint consensus states to save storage space - if _, err := ibctmmigrations.PruneExpiredConsensusStates(ctx, cdc, clientKeeper); err != nil { - return nil, err - } - // !! ATTENTION !! - - // Leave modules are as-is to avoid running InitGenesis. - logger.Debug("running module migrations ...") - return mm.RunMigrations(ctx, configurator, vm) - } -} - -// EnableVestingExtension appends the address of the vesting EVM extension -// to the list of active precompiles. -func EnableVestingExtension(ctx sdk.Context, evmKeeper *evmkeeper.Keeper) error { - // Get the list of active precompiles from the genesis state - params := evmKeeper.GetParams(ctx) - activePrecompiles := params.ActivePrecompiles - activePrecompiles = append(activePrecompiles, vestingprecompile.Precompile{}.Address().String()) - params.ActivePrecompiles = activePrecompiles - - return evmKeeper.SetParams(ctx, params) -} diff --git a/app/upgrades/v14/upgrades_test.go b/app/upgrades/v14/upgrades_test.go deleted file mode 100644 index 59d6e03463..0000000000 --- a/app/upgrades/v14/upgrades_test.go +++ /dev/null @@ -1,37 +0,0 @@ -package v14_test - -import ( - v14 "github.com/evmos/evmos/v16/app/upgrades/v14" - vestingprecompile "github.com/evmos/evmos/v16/precompiles/vesting" -) - -func (s *UpgradesTestSuite) TestEnableVestingExtension() { - s.SetupTest() - - vestingPrecompile := vestingprecompile.Precompile{} - - evmParams := s.app.EvmKeeper.GetParams(s.ctx) - allPrecompiles := evmParams.ActivePrecompiles - newPrecompiles := make([]string, 0, len(allPrecompiles)-1) - for _, precompile := range allPrecompiles { - if precompile == vestingPrecompile.Address().String() { - continue - } - newPrecompiles = append(newPrecompiles, precompile) - } - s.Require().NotContains(newPrecompiles, vestingPrecompile.Address().String(), - "expected vesting extension to be removed from active precompiles", - ) - - evmParams.ActivePrecompiles = newPrecompiles - err := s.app.EvmKeeper.SetParams(s.ctx, evmParams) - s.Require().NoError(err, "failed to set evm params") - - err = v14.EnableVestingExtension(s.ctx, s.app.EvmKeeper) - s.Require().NoError(err, "failed to enable vesting extension") - - evmParams = s.app.EvmKeeper.GetParams(s.ctx) - s.Require().Contains(evmParams.ActivePrecompiles, vestingPrecompile.Address().String(), - "expected vesting extension to be contained in active precompiles", - ) -} diff --git a/app/upgrades/v14/utils_test.go b/app/upgrades/v14/utils_test.go deleted file mode 100644 index 88805a2a5e..0000000000 --- a/app/upgrades/v14/utils_test.go +++ /dev/null @@ -1,318 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) -package v14_test - -import ( - "encoding/json" - "fmt" - "time" - - "cosmossdk.io/math" - abci "github.com/cometbft/cometbft/abci/types" - "github.com/cometbft/cometbft/crypto/tmhash" - tmtypes "github.com/cometbft/cometbft/types" - "github.com/cosmos/cosmos-sdk/baseapp" - codectypes "github.com/cosmos/cosmos-sdk/codec/types" - cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/cosmos/ibc-go/v7/testing/mock" - "github.com/ethereum/go-ethereum/common" - ethtypes "github.com/ethereum/go-ethereum/core/types" - evmosapp "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" - cmn "github.com/evmos/evmos/v16/precompiles/common" - "github.com/evmos/evmos/v16/precompiles/vesting" - evmosutil "github.com/evmos/evmos/v16/testutil" - testutiltx "github.com/evmos/evmos/v16/testutil/tx" - evmostypes "github.com/evmos/evmos/v16/types" - "github.com/evmos/evmos/v16/utils" - "github.com/evmos/evmos/v16/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - inflationtypes "github.com/evmos/evmos/v16/x/inflation/v1/types" -) - -// SetupWithGenesisValSet initializes a new EvmosApp with a validator set and genesis accounts -// that also act as delegators. For simplicity, each validator is bonded with a delegation -// of one consensus engine unit (10^6) in the default token of the simapp from first genesis -// account. A Nop logger is set in SimApp. -func (s *UpgradesTestSuite) SetupWithGenesisValSet(valSet *tmtypes.ValidatorSet, genAccs []authtypes.GenesisAccount, balances ...banktypes.Balance) { - appI, genesisState := evmosapp.SetupTestingApp(cmn.DefaultChainID)() - app, ok := appI.(*evmosapp.Evmos) - s.Require().True(ok) - - // set genesis accounts - authGenesis := authtypes.NewGenesisState(authtypes.DefaultParams(), genAccs) - genesisState[authtypes.ModuleName] = app.AppCodec().MustMarshalJSON(authGenesis) - - validators := make([]stakingtypes.Validator, 0, len(valSet.Validators)) - delegations := make([]stakingtypes.Delegation, 0, len(valSet.Validators)) - - bondAmt := sdk.TokensFromConsensusPower(1, evmostypes.PowerReduction) - - for _, val := range valSet.Validators { - pk, err := cryptocodec.FromTmPubKeyInterface(val.PubKey) - s.Require().NoError(err) - pkAny, err := codectypes.NewAnyWithValue(pk) - s.Require().NoError(err) - validator := stakingtypes.Validator{ - OperatorAddress: sdk.ValAddress(val.Address).String(), - ConsensusPubkey: pkAny, - Jailed: false, - Status: stakingtypes.Bonded, - Tokens: bondAmt, - DelegatorShares: math.LegacyOneDec(), - Description: stakingtypes.Description{}, - UnbondingHeight: int64(0), - UnbondingTime: time.Unix(0, 0).UTC(), - Commission: stakingtypes.NewCommission(math.LegacyZeroDec(), math.LegacyZeroDec(), math.LegacyZeroDec()), - MinSelfDelegation: math.ZeroInt(), - } - validators = append(validators, validator) - delegations = append(delegations, stakingtypes.NewDelegation(genAccs[0].GetAddress(), val.Address.Bytes(), math.LegacyOneDec())) - } - s.validators = validators - - // set validators and delegations - stakingParams := stakingtypes.DefaultParams() - // set bond demon to be aevmos - stakingParams.BondDenom = utils.BaseDenom - stakingGenesis := stakingtypes.NewGenesisState(stakingParams, validators, delegations) - genesisState[stakingtypes.ModuleName] = app.AppCodec().MustMarshalJSON(stakingGenesis) - - totalBondAmt := math.ZeroInt() - for range validators { - totalBondAmt = totalBondAmt.Add(bondAmt) - } - totalSupply := sdk.NewCoins() - for _, b := range balances { - // add genesis acc tokens and delegated tokens to total supply - totalSupply = totalSupply.Add(b.Coins.Add(sdk.NewCoin(utils.BaseDenom, totalBondAmt))...) - } - - // add bonded amount to bonded pool module account - balances = append(balances, banktypes.Balance{ - Address: authtypes.NewModuleAddress(stakingtypes.BondedPoolName).String(), - Coins: sdk.Coins{sdk.NewCoin(utils.BaseDenom, totalBondAmt)}, - }) - - // update total supply - bankGenesis := banktypes.NewGenesisState(banktypes.DefaultGenesisState().Params, balances, totalSupply, []banktypes.Metadata{}, []banktypes.SendEnabled{}) - genesisState[banktypes.ModuleName] = app.AppCodec().MustMarshalJSON(bankGenesis) - - stateBytes, err := json.MarshalIndent(genesisState, "", " ") - s.Require().NoError(err) - - header := evmosutil.NewHeader( - 2, - time.Now().UTC(), - cmn.DefaultChainID, - sdk.ConsAddress(validators[0].GetOperator()), - tmhash.Sum([]byte("app")), - tmhash.Sum([]byte("validators")), - ) - - // init chain will set the validator set and initialize the genesis accounts - app.InitChain( - abci.RequestInitChain{ - ChainId: cmn.DefaultChainID, - Validators: []abci.ValidatorUpdate{}, - ConsensusParams: evmosapp.DefaultConsensusParams, - AppStateBytes: stateBytes, - }, - ) - - // create Context - s.ctx = app.BaseApp.NewContext(false, header) - - // commit genesis changes - app.Commit() - app.BeginBlock(abci.RequestBeginBlock{Header: header}) - - s.app = app -} - -func (s *UpgradesTestSuite) DoSetupTest() { - nValidators := 3 - validators := make([]*tmtypes.Validator, 0, nValidators) - - for i := 0; i < nValidators; i++ { - privVal := mock.NewPV() - pubKey, err := privVal.GetPubKey() - s.Require().NoError(err) - validator := tmtypes.NewValidator(pubKey, 1) - validators = append(validators, validator) - } - - valSet := tmtypes.NewValidatorSet(validators) - - // generate genesis account - addr, priv := testutiltx.NewAddrKey() - s.address = addr - - baseAcc := authtypes.NewBaseAccount(priv.PubKey().Address().Bytes(), priv.PubKey(), 0, 0) - - acc := &evmostypes.EthAccount{ - BaseAccount: baseAcc, - CodeHash: common.BytesToHash(evmtypes.EmptyCodeHash).Hex(), - } - - amount := sdk.TokensFromConsensusPower(5, evmostypes.PowerReduction) - - balance := banktypes.Balance{ - Address: acc.GetAddress().String(), - Coins: sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, amount)), - } - - s.SetupWithGenesisValSet(valSet, []authtypes.GenesisAccount{acc}, balance) - - // Create StateDB - s.stateDB = statedb.New(s.ctx, s.app.EvmKeeper, statedb.NewEmptyTxConfig(common.BytesToHash(s.ctx.HeaderHash().Bytes()))) - - // bond denom - stakingParams := s.app.StakingKeeper.GetParams(s.ctx) - stakingParams.BondDenom = utils.BaseDenom - stakingParams.MinCommissionRate = math.LegacyZeroDec() - s.bondDenom = stakingParams.BondDenom - err := s.app.StakingKeeper.SetParams(s.ctx, stakingParams) - s.Require().NoError(err, "failed to set params") - - s.ethSigner = ethtypes.LatestSignerForChainID(s.app.EvmKeeper.ChainID()) - - precompile, err := vesting.NewPrecompile(s.app.VestingKeeper, s.app.AuthzKeeper) - s.Require().NoError(err) - s.precompile = precompile - - coins := sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, math.NewInt(5000000000000000000))) - distrCoins := sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, math.NewInt(2000000000000000000))) - err = s.app.BankKeeper.MintCoins(s.ctx, inflationtypes.ModuleName, coins) - s.Require().NoError(err) - err = s.app.BankKeeper.SendCoinsFromModuleToModule(s.ctx, inflationtypes.ModuleName, authtypes.FeeCollectorName, distrCoins) - s.Require().NoError(err) - - queryHelperEvm := baseapp.NewQueryServerTestHelper(s.ctx, s.app.InterfaceRegistry()) - evmtypes.RegisterQueryServer(queryHelperEvm, s.app.EvmKeeper) - s.queryClientEVM = evmtypes.NewQueryClient(queryHelperEvm) - - s.NextBlock() -} - -// NextBlock commits the current block and sets up the next block. -func (s *UpgradesTestSuite) NextBlock() { - var err error - s.ctx, err = evmosutil.CommitAndCreateNewCtx(s.ctx, s.app, time.Second, nil) - s.Require().NoError(err) -} - -// MigrationTestAccount is a struct to hold the test account address, its private key -// as well as its balances and delegations before and after the migration. -type MigrationTestAccount struct { - Addr sdk.AccAddress - PrivKey *ethsecp256k1.PrivKey - BalancePre sdk.Coins - BalancePost sdk.Coins - DelegationsPost stakingtypes.Delegations -} - -// GenerateMigrationTestAccount returns a new MigrationTestAccount with a new address and private key. -// All expected pre- and post-migration balances and delegations are initialized to be empty. -func GenerateMigrationTestAccount() MigrationTestAccount { - addr, priv := testutiltx.NewAccAddressAndKey() - return MigrationTestAccount{ - Addr: addr, - PrivKey: priv, - BalancePre: sdk.Coins{}, - BalancePost: sdk.Coins{}, - DelegationsPost: stakingtypes.Delegations{}, - } -} - -// requireMigratedAccount checks that the account has the expected balances and delegations -// after the migration. -func (s *UpgradesTestSuite) requireMigratedAccount(account MigrationTestAccount) { - // Check the new delegations - delegations := s.app.StakingKeeper.GetAllDelegatorDelegations(s.ctx, account.Addr) - s.Require().Len(delegations, len(account.DelegationsPost), "expected different number of delegations after migration of account %s", account.Addr.String()) - s.Require().ElementsMatch(delegations, account.DelegationsPost, "expected different delegations after migration of account %s", account.Addr.String()) - - // There should not be any unbonding delegations - unbondingDelegations := s.app.StakingKeeper.GetAllUnbondingDelegations(s.ctx, account.Addr) - s.Require().Len(unbondingDelegations, 0, "expected no unbonding delegations after migration for account %s", account.Addr.String()) - - // Check balances - balances := s.app.BankKeeper.GetAllBalances(s.ctx, account.Addr) - s.Require().Len(balances, len(account.BalancePost), "expected different number of balances after migration for account %s", account.Addr.String()) - - for _, balance := range balances { - expAmount := account.BalancePost.AmountOf(balance.Denom) - s.Require().Equal(expAmount.String(), balance.Amount.String(), "expected different balance of %q after migration for account %s", balance.Denom, account.Addr.String()) - } -} - -// getDelegationSharesMap returns a map of validator operator addresses to the -// total shares delegated to them. -func (s *UpgradesTestSuite) getDelegationSharesMap() map[string]math.LegacyDec { - allValidators := s.app.StakingKeeper.GetAllValidators(s.ctx) - sharesMap := make(map[string]math.LegacyDec, len(allValidators)) - for _, validator := range allValidators { - sharesMap[validator.OperatorAddress] = validator.DelegatorShares - } - return sharesMap -} - -// CreateDelegationWithZeroTokens is a helper script, which creates a delegation and -// slashes the validator afterwards, so that the shares are not zero but the query -// for token amount returns zero tokens. -// -// NOTE: This is replicating an edge case that was found in mainnet data, which led to -// the account migrations not succeeding. -func CreateDelegationWithZeroTokens( - ctx sdk.Context, - app *evmosapp.Evmos, - priv *ethsecp256k1.PrivKey, - delegator sdk.AccAddress, - validator stakingtypes.Validator, - amount int64, -) (stakingtypes.Delegation, error) { - delegation, err := Delegate(ctx, app, priv, delegator, validator, amount) - if err != nil { - return stakingtypes.Delegation{}, err - } - - consAddr, err := validator.GetConsAddr() - if err != nil { - return stakingtypes.Delegation{}, fmt.Errorf("failed to get validator consensus address: %w", err) - } - - // Slash the validator - app.SlashingKeeper.Slash(s.ctx, consAddr, math.LegacyNewDecWithPrec(5, 2), 1, 0) - - return delegation, nil -} - -// Delegate is a helper function to delegation one atto-Evmos to a validator. -func Delegate( - ctx sdk.Context, - app *evmosapp.Evmos, - priv *ethsecp256k1.PrivKey, - delegator sdk.AccAddress, - validator stakingtypes.Validator, - amount int64, -) (stakingtypes.Delegation, error) { - stakingDenom := app.StakingKeeper.BondDenom(ctx) - - msgDelegate := stakingtypes.NewMsgDelegate(delegator, validator.GetOperator(), sdk.NewInt64Coin(stakingDenom, amount)) - _, err := evmosutil.DeliverTx(ctx, app, priv, nil, msgDelegate) - if err != nil { - return stakingtypes.Delegation{}, fmt.Errorf("failed to delegate: %w", err) - } - - delegation, found := app.StakingKeeper.GetDelegation(s.ctx, delegator, validator.GetOperator()) - if !found { - return stakingtypes.Delegation{}, fmt.Errorf("delegation not found") - } - - return delegation, nil -} diff --git a/app/upgrades/v14/vesting.go b/app/upgrades/v14/vesting.go deleted file mode 100644 index c8ea0c4dab..0000000000 --- a/app/upgrades/v14/vesting.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package v14 - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - vestingkeeper "github.com/evmos/evmos/v16/x/vesting/keeper" - vestingtypes "github.com/evmos/evmos/v16/x/vesting/types" -) - -// UpdateVestingFunders updates the vesting funders for accounts managed by the team -// to the new dedicated multisig address. -func UpdateVestingFunders(ctx sdk.Context, vk vestingkeeper.Keeper, newFunder sdk.AccAddress) error { - // Update account created by funder 1 - if _, err := UpdateVestingFunder(ctx, vk, VestingAddrByFunder1, OldFunder1, newFunder); err != nil { - return err - } - - // Update accounts created by funder 2 - for _, address := range VestingAddrsByFunder2 { - if _, err := UpdateVestingFunder(ctx, vk, address, OldFunder2, newFunder); err != nil { - return err - } - } - return nil -} - -// UpdateVestingFunder updates the vesting funder for a single vesting account when address and the previous funder -// are given as strings. -func UpdateVestingFunder(ctx sdk.Context, k vestingkeeper.Keeper, address, oldFunder string, newFunder sdk.AccAddress) (*vestingtypes.MsgUpdateVestingFunderResponse, error) { - vestingAcc := sdk.MustAccAddressFromBech32(address) - oldFunderAcc := sdk.MustAccAddressFromBech32(oldFunder) - msgUpdate := vestingtypes.NewMsgUpdateVestingFunder(oldFunderAcc, newFunder, vestingAcc) - - return k.UpdateVestingFunder(ctx, msgUpdate) -} diff --git a/app/upgrades/v14/vesting_test.go b/app/upgrades/v14/vesting_test.go deleted file mode 100644 index e6d5a1b13a..0000000000 --- a/app/upgrades/v14/vesting_test.go +++ /dev/null @@ -1,51 +0,0 @@ -package v14_test - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - v14 "github.com/evmos/evmos/v16/app/upgrades/v14" - "github.com/evmos/evmos/v16/testutil" - "github.com/evmos/evmos/v16/x/vesting/types" -) - -func (s *UpgradesTestSuite) TestUpdateVestingFunders() { - s.SetupTest() - - // Fund the affected accounts to initialize them and then create vesting accounts - s.prepareVestingAccount(v14.VestingAddrByFunder1, v14.OldFunder1) - for _, address := range v14.VestingAddrsByFunder2 { - s.prepareVestingAccount(address, v14.OldFunder2) - } - - // Run the upgrade function - err := v14.UpdateVestingFunders(s.ctx, s.app.VestingKeeper, v14.NewTeamPremintWalletAcc) - s.Require().NoError(err, "failed to update vesting funders") - - // Check that the vesting accounts have been updated - affectedAddrs := v14.VestingAddrsByFunder2 - affectedAddrs = append(affectedAddrs, v14.VestingAddrByFunder1) - for _, address := range affectedAddrs { - accAddr := sdk.MustAccAddressFromBech32(address) - acc := s.app.AccountKeeper.GetAccount(s.ctx, accAddr) - s.Require().NotNil(acc, "account not found for %s", address) - vestingAcc, ok := acc.(*types.ClawbackVestingAccount) - s.Require().True(ok, "account is not a vesting account for %s", address) - s.Require().Equal(address, vestingAcc.Address, "expected different address in vesting account for %s", address) - - // Check that the funder has been updated - s.Require().Equal(v14.NewTeamPremintWalletAcc.String(), vestingAcc.FunderAddress, "expected different funder address for %s", address) - } -} - -func (s *UpgradesTestSuite) prepareVestingAccount(address string, funder string) { - accAddr := sdk.MustAccAddressFromBech32(address) - err := testutil.FundAccountWithBaseDenom(s.ctx, s.app.BankKeeper, accAddr, 1000) - s.Require().NoError(err, "failed to fund account %s", address) - - // Create vesting account - createMsg := &types.MsgCreateClawbackVestingAccount{ - FunderAddress: funder, - VestingAddress: address, - } - _, err = s.app.VestingKeeper.CreateClawbackVestingAccount(sdk.UnwrapSDKContext(s.ctx), createMsg) - s.Require().NoError(err, "failed to create vesting account for %s", address) -} diff --git a/app/upgrades/v15/setup_test.go b/app/upgrades/v15/setup_test.go deleted file mode 100644 index 5ec3391a52..0000000000 --- a/app/upgrades/v15/setup_test.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package v15_test - -import ( - "testing" - - sdk "github.com/cosmos/cosmos-sdk/types" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - evmosapp "github.com/evmos/evmos/v16/app" - "github.com/stretchr/testify/suite" -) - -var s *UpgradesTestSuite - -type UpgradesTestSuite struct { - suite.Suite - - ctx sdk.Context - app *evmosapp.Evmos - validators []stakingtypes.Validator - bondDenom string -} - -func TestUpgradeTestSuite(t *testing.T) { - s = new(UpgradesTestSuite) - suite.Run(t, s) -} - -func (s *UpgradesTestSuite) SetupTest() { - s.DoSetupTest() -} diff --git a/app/upgrades/v15/upgrades.go b/app/upgrades/v15/upgrades.go index ecd8019ee0..f2e204f0d9 100644 --- a/app/upgrades/v15/upgrades.go +++ b/app/upgrades/v15/upgrades.go @@ -6,62 +6,22 @@ package v15 import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" - bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - v14 "github.com/evmos/evmos/v16/app/upgrades/v14" - "github.com/evmos/evmos/v16/utils" - evmkeeper "github.com/evmos/evmos/v16/x/evm/keeper" ) +// NOTE: we're only keeping this logic for the upgrade tests +// This is not the original upgrade logic. +// Look into the previous version if want to know what the upgrade logic was // CreateUpgradeHandler creates an SDK upgrade handler for v15.0.0 func CreateUpgradeHandler( mm *module.Manager, configurator module.Configurator, - bk bankkeeper.Keeper, - ek *evmkeeper.Keeper, - sk stakingkeeper.Keeper, ) upgradetypes.UpgradeHandler { return func(ctx sdk.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { logger := ctx.Logger().With("upgrade", UpgradeName) - if utils.IsMainnet(ctx.ChainID()) { - logger.Info("migrating strategic reserves") - if err := v14.MigrateNativeMultisigs( - ctx, bk, sk, v14.NewTeamStrategicReserveAcc, v14.OldStrategicReserves..., - ); err != nil { - // NOTE: log error instead of aborting the upgrade - logger.Error("error while migrating native multisigs", "error", err) - } - - // Add EIP contained in Shanghai hard fork to the extra EIPs - // in the EVM parameters. This enables using the PUSH0 opcode and - // thus supports Solidity v0.8.20. - // - // NOTE: this was already enabled on testnet - logger.Info("adding EIP 3855 to EVM parameters") - err := EnableEIPs(ctx, ek, 3855) - if err != nil { - logger.Error("error while enabling EIPs", "error", err) - } - - // we are deprecating the crisis module since it is not being used - // - // NOTE: this was already removed on testnet - logger.Debug("deleting crisis module from version map...") - delete(vm, "crisis") - } - // Leave modules are as-is to avoid running InitGenesis. logger.Debug("running module migrations ...") return mm.RunMigrations(ctx, configurator, vm) } } - -// EnableEIPs enables the given EIPs in the EVM parameters. -func EnableEIPs(ctx sdk.Context, ek *evmkeeper.Keeper, eips ...int64) error { - evmParams := ek.GetParams(ctx) - evmParams.ExtraEIPs = append(evmParams.ExtraEIPs, eips...) - - return ek.SetParams(ctx, evmParams) -} diff --git a/app/upgrades/v15/upgrades_test.go b/app/upgrades/v15/upgrades_test.go deleted file mode 100644 index 9ce695997e..0000000000 --- a/app/upgrades/v15/upgrades_test.go +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package v15_test - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - v15 "github.com/evmos/evmos/v16/app/upgrades/v15" - evmkeeper "github.com/evmos/evmos/v16/x/evm/keeper" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" -) - -func (s *UpgradesTestSuite) TestEnableEIPs() { - testcases := []struct { - name string - extraEIPs []int64 - malleate func(sdk.Context, *evmkeeper.Keeper) - expEIPs []int64 - expPass bool - errContains string - }{ - { - name: "success - empty EIPs", - extraEIPs: []int64{}, - expPass: true, - }, - { - name: "success - single EIP", - extraEIPs: []int64{3855}, - expEIPs: []int64{3855}, - expPass: true, - }, - { - name: "success - multiple EIPs", - extraEIPs: []int64{3855, 2200, 1884, 1344}, - expEIPs: []int64{3855, 2200, 1884, 1344}, - expPass: true, - }, - { - name: "fail - duplicate EIP", - extraEIPs: []int64{3855, 1344, 2200}, - malleate: func(ctx sdk.Context, ek *evmkeeper.Keeper) { - params := evmtypes.DefaultParams() - params.ExtraEIPs = []int64{2200} - err := ek.SetParams(ctx, params) - s.Require().NoError(err, "expected no error setting params") - }, - expEIPs: []int64{2200}, // NOTE: since the function is failing, we expect the EIPs to remain the same - expPass: false, - errContains: "found duplicate EIP: 2200", - }, - { - name: "fail - invalid EIP", - extraEIPs: []int64{3860}, - expEIPs: []int64{}, - expPass: false, - errContains: "is not activateable, valid EIPs are", - }, - } - - for _, tc := range testcases { - tc := tc - - s.Run(tc.name, func() { - s.SetupTest() - - if tc.malleate != nil { - tc.malleate(s.ctx, s.app.EvmKeeper) - } - - err := v15.EnableEIPs(s.ctx, s.app.EvmKeeper, tc.extraEIPs...) - - if tc.expPass { - s.Require().NoError(err, "expected no error enabling EIPs") - } else { - s.Require().Error(err, "expected error enabling EIPs") - s.Require().ErrorContains(err, tc.errContains, "expected different error") - } - - evmParams := s.app.EvmKeeper.GetParams(s.ctx) - s.Require().ElementsMatch(tc.expEIPs, evmParams.ExtraEIPs, "expected different EIPs after test") - }) - } -} diff --git a/app/upgrades/v15/utils_test.go b/app/upgrades/v15/utils_test.go deleted file mode 100644 index c20d72d9d6..0000000000 --- a/app/upgrades/v15/utils_test.go +++ /dev/null @@ -1,195 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package v15_test - -import ( - "encoding/json" - "time" - - "cosmossdk.io/math" - abci "github.com/cometbft/cometbft/abci/types" - "github.com/cometbft/cometbft/crypto/tmhash" - tmtypes "github.com/cometbft/cometbft/types" - codectypes "github.com/cosmos/cosmos-sdk/codec/types" - cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/cosmos/ibc-go/v7/testing/mock" - "github.com/ethereum/go-ethereum/common" - evmosapp "github.com/evmos/evmos/v16/app" - cmn "github.com/evmos/evmos/v16/precompiles/common" - evmosutil "github.com/evmos/evmos/v16/testutil" - testutiltx "github.com/evmos/evmos/v16/testutil/tx" - evmostypes "github.com/evmos/evmos/v16/types" - "github.com/evmos/evmos/v16/utils" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - inflationtypes "github.com/evmos/evmos/v16/x/inflation/v1/types" -) - -// SetupWithGenesisValSet initializes a new EvmosApp with a validator set and genesis accounts -// that also act as delegators. For simplicity, each validator is bonded with a delegation -// of one consensus engine unit (10^6) in the default token of the simapp from first genesis -// account. A Nop logger is set in SimApp. -func (s *UpgradesTestSuite) SetupWithGenesisValSet(valSet *tmtypes.ValidatorSet, genAccs []authtypes.GenesisAccount, balances ...banktypes.Balance) { - appI, genesisState := evmosapp.SetupTestingApp(cmn.DefaultChainID)() - app, ok := appI.(*evmosapp.Evmos) - s.Require().True(ok) - - // set genesis accounts - authGenesis := authtypes.NewGenesisState(authtypes.DefaultParams(), genAccs) - genesisState[authtypes.ModuleName] = app.AppCodec().MustMarshalJSON(authGenesis) - - validators := make([]stakingtypes.Validator, 0, len(valSet.Validators)) - delegations := make([]stakingtypes.Delegation, 0, len(valSet.Validators)) - - bondAmt := sdk.TokensFromConsensusPower(1, evmostypes.PowerReduction) - - for _, val := range valSet.Validators { - pk, err := cryptocodec.FromTmPubKeyInterface(val.PubKey) - s.Require().NoError(err) - pkAny, err := codectypes.NewAnyWithValue(pk) - s.Require().NoError(err) - validator := stakingtypes.Validator{ - OperatorAddress: sdk.ValAddress(val.Address).String(), - ConsensusPubkey: pkAny, - Jailed: false, - Status: stakingtypes.Bonded, - Tokens: bondAmt, - DelegatorShares: math.LegacyOneDec(), - Description: stakingtypes.Description{}, - UnbondingHeight: int64(0), - UnbondingTime: time.Unix(0, 0).UTC(), - Commission: stakingtypes.NewCommission(math.LegacyZeroDec(), math.LegacyZeroDec(), math.LegacyZeroDec()), - MinSelfDelegation: math.ZeroInt(), - } - validators = append(validators, validator) - delegations = append(delegations, stakingtypes.NewDelegation(genAccs[0].GetAddress(), val.Address.Bytes(), math.LegacyOneDec())) - } - s.validators = validators - - // set validators and delegations - stakingParams := stakingtypes.DefaultParams() - // set bond demon to be aevmos - stakingParams.BondDenom = utils.BaseDenom - stakingGenesis := stakingtypes.NewGenesisState(stakingParams, validators, delegations) - genesisState[stakingtypes.ModuleName] = app.AppCodec().MustMarshalJSON(stakingGenesis) - - totalBondAmt := math.ZeroInt() - for range validators { - totalBondAmt = totalBondAmt.Add(bondAmt) - } - totalSupply := sdk.NewCoins() - for _, b := range balances { - // add genesis acc tokens and delegated tokens to total supply - totalSupply = totalSupply.Add(b.Coins.Add(sdk.NewCoin(utils.BaseDenom, totalBondAmt))...) - } - - // add bonded amount to bonded pool module account - balances = append(balances, banktypes.Balance{ - Address: authtypes.NewModuleAddress(stakingtypes.BondedPoolName).String(), - Coins: sdk.Coins{sdk.NewCoin(utils.BaseDenom, totalBondAmt)}, - }) - - // update total supply - bankGenesis := banktypes.NewGenesisState(banktypes.DefaultGenesisState().Params, balances, totalSupply, []banktypes.Metadata{}, []banktypes.SendEnabled{}) - genesisState[banktypes.ModuleName] = app.AppCodec().MustMarshalJSON(bankGenesis) - - stateBytes, err := json.MarshalIndent(genesisState, "", " ") - s.Require().NoError(err) - - header := evmosutil.NewHeader( - 2, - time.Now().UTC(), - cmn.DefaultChainID, - sdk.ConsAddress(validators[0].GetOperator()), - tmhash.Sum([]byte("app")), - tmhash.Sum([]byte("validators")), - ) - - // init chain will set the validator set and initialize the genesis accounts - app.InitChain( - abci.RequestInitChain{ - ChainId: cmn.DefaultChainID, - Validators: []abci.ValidatorUpdate{}, - ConsensusParams: evmosapp.DefaultConsensusParams, - AppStateBytes: stateBytes, - }, - ) - - // create Context - s.ctx = app.BaseApp.NewContext(false, header) - - // set empty extraEIPs in default params - // that's the expected initial state - evmParams := app.EvmKeeper.GetParams(s.ctx) - evmParams.ExtraEIPs = nil - err = app.EvmKeeper.SetParams(s.ctx, evmParams) - s.Require().NoError(err) - - // commit genesis changes - app.Commit() - app.BeginBlock(abci.RequestBeginBlock{Header: header}) - - s.app = app -} - -func (s *UpgradesTestSuite) DoSetupTest() { - nValidators := 3 - validators := make([]*tmtypes.Validator, 0, nValidators) - - for i := 0; i < nValidators; i++ { - privVal := mock.NewPV() - pubKey, err := privVal.GetPubKey() - s.Require().NoError(err) - validator := tmtypes.NewValidator(pubKey, 1) - validators = append(validators, validator) - } - - valSet := tmtypes.NewValidatorSet(validators) - - // generate genesis account - _, priv := testutiltx.NewAddrKey() - - baseAcc := authtypes.NewBaseAccount(priv.PubKey().Address().Bytes(), priv.PubKey(), 0, 0) - - acc := &evmostypes.EthAccount{ - BaseAccount: baseAcc, - CodeHash: common.BytesToHash(evmtypes.EmptyCodeHash).Hex(), - } - - amount := sdk.TokensFromConsensusPower(5, evmostypes.PowerReduction) - - balance := banktypes.Balance{ - Address: acc.GetAddress().String(), - Coins: sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, amount)), - } - - s.SetupWithGenesisValSet(valSet, []authtypes.GenesisAccount{acc}, balance) - - // bond denom - stakingParams := s.app.StakingKeeper.GetParams(s.ctx) - stakingParams.BondDenom = utils.BaseDenom - stakingParams.MinCommissionRate = math.LegacyZeroDec() - s.bondDenom = stakingParams.BondDenom - err := s.app.StakingKeeper.SetParams(s.ctx, stakingParams) - s.Require().NoError(err, "failed to set params") - - coins := sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, math.NewInt(5000000000000000000))) - distrCoins := sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, math.NewInt(2000000000000000000))) - err = s.app.BankKeeper.MintCoins(s.ctx, inflationtypes.ModuleName, coins) - s.Require().NoError(err) - err = s.app.BankKeeper.SendCoinsFromModuleToModule(s.ctx, inflationtypes.ModuleName, authtypes.FeeCollectorName, distrCoins) - s.Require().NoError(err) - - s.NextBlock() -} - -// NextBlock commits the current block and sets up the next block. -func (s *UpgradesTestSuite) NextBlock() { - var err error - s.ctx, err = evmosutil.CommitAndCreateNewCtx(s.ctx, s.app, time.Second, nil) - s.Require().NoError(err) -} diff --git a/app/upgrades/v8/constants.go b/app/upgrades/v8/constants.go deleted file mode 100644 index ebf1acdf81..0000000000 --- a/app/upgrades/v8/constants.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package v8 - -const ( - // UpgradeName is the shared upgrade plan name for mainnet and testnet - UpgradeName = "v8.0.0" - // MainnetUpgradeHeight defines the Evmos mainnet block height on which the upgrade will take place - MainnetUpgradeHeight = 3_489_000 - // TestnetUpgradeHeight defines the Evmos testnet block height on which the upgrade will take place - TestnetUpgradeHeight = 4_600_000 - // UpgradeInfo defines the binaries that will be used for the upgrade - UpgradeInfo = `'{"binaries":{"darwin/arm64":"https://github.com/evmos/evmos/releases/download/v8.0.0/evmos_8.0.0_Darwin_arm64.tar.gz","darwin/x86_64":"https://github.com/evmos/evmos/releases/download/v8.0.0/evmos_8.0.0_Darwin_x86_64.tar.gz","linux/arm64":"https://github.com/evmos/evmos/releases/download/v8.0.0/evmos_8.0.0_Linux_arm64.tar.gz","linux/amd64":"https://github.com/evmos/evmos/releases/download/v8.0.0/evmos_8.0.0_Linux_x86_64.tar.gz","windows/x86_64":"https://github.com/evmos/evmos/releases/download/v8.0.0/evmos_8.0.0_Windows_x86_64.zip"}}'` -) diff --git a/app/upgrades/v8/upgrades.go b/app/upgrades/v8/upgrades.go deleted file mode 100644 index 16f3d6e262..0000000000 --- a/app/upgrades/v8/upgrades.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package v8 - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/module" - upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" -) - -// CreateUpgradeHandler creates an SDK upgrade handler for v8 -func CreateUpgradeHandler( - mm *module.Manager, - configurator module.Configurator, -) upgradetypes.UpgradeHandler { - return func(ctx sdk.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { - logger := ctx.Logger().With("upgrade", UpgradeName) - - // Refs: - // - https://docs.cosmos.network/master/building-modules/upgrade.html#registering-migrations - // - https://docs.cosmos.network/master/migrations/chain-upgrade-guide-044.html#chain-upgrade - - // Leave modules are as-is to avoid running InitGenesis. - logger.Debug("running module migrations ...") - return mm.RunMigrations(ctx, configurator, vm) - } -} diff --git a/app/upgrades/v8/upgrades_test.go b/app/upgrades/v8/upgrades_test.go deleted file mode 100644 index 0f27292aae..0000000000 --- a/app/upgrades/v8/upgrades_test.go +++ /dev/null @@ -1,72 +0,0 @@ -package v8_test - -import ( - "testing" - "time" - - "github.com/stretchr/testify/suite" - - "github.com/cometbft/cometbft/crypto/tmhash" - tmproto "github.com/cometbft/cometbft/proto/tendermint/types" - tmversion "github.com/cometbft/cometbft/proto/tendermint/version" - "github.com/cometbft/cometbft/version" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" - feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" - - "github.com/evmos/evmos/v16/app" -) - -type UpgradeTestSuite struct { - suite.Suite - - ctx sdk.Context - app *app.Evmos - consAddress sdk.ConsAddress -} - -func (suite *UpgradeTestSuite) SetupTest(chainID string) { - checkTx := false - - // consensus key - priv, err := ethsecp256k1.GenerateKey() - suite.Require().NoError(err) - suite.consAddress = sdk.ConsAddress(priv.PubKey().Address()) - - // NOTE: this is the new binary, not the old one. - suite.app = app.Setup(checkTx, feemarkettypes.DefaultGenesisState(), chainID) - suite.ctx = suite.app.BaseApp.NewContext(checkTx, tmproto.Header{ - Height: 1, - ChainID: chainID, - Time: time.Date(2022, 5, 9, 8, 0, 0, 0, time.UTC), - ProposerAddress: suite.consAddress.Bytes(), - - Version: tmversion.Consensus{ - Block: version.BlockProtocol, - }, - LastBlockId: tmproto.BlockID{ - Hash: tmhash.Sum([]byte("block_id")), - PartSetHeader: tmproto.PartSetHeader{ - Total: 11, - Hash: tmhash.Sum([]byte("partset_header")), - }, - }, - AppHash: tmhash.Sum([]byte("app")), - DataHash: tmhash.Sum([]byte("data")), - EvidenceHash: tmhash.Sum([]byte("evidence")), - ValidatorsHash: tmhash.Sum([]byte("validators")), - NextValidatorsHash: tmhash.Sum([]byte("next_validators")), - ConsensusHash: tmhash.Sum([]byte("consensus")), - LastResultsHash: tmhash.Sum([]byte("last_result")), - }) - - cp := suite.app.BaseApp.GetConsensusParams(suite.ctx) - suite.ctx = suite.ctx.WithConsensusParams(cp) -} - -func TestUpgradeTestSuite(t *testing.T) { - s := new(UpgradeTestSuite) - suite.Run(t, s) -} diff --git a/app/upgrades/v8_1/constants.go b/app/upgrades/v8_1/constants.go deleted file mode 100644 index 524ffac5fe..0000000000 --- a/app/upgrades/v8_1/constants.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package v81 - -const ( - // UpgradeName is the shared upgrade plan name for mainnet and testnet - UpgradeName = "v8.1.0" - // MainnetUpgradeHeight defines the Evmos mainnet block height on which the upgrade will take place - MainnetUpgradeHeight = 4_500_000 - // TestnetUpgradeHeight defines the Evmos testnet block height on which the upgrade will take place - TestnetUpgradeHeight = 5_280_000 - // UpgradeInfo defines the binaries that will be used for the upgrade - UpgradeInfo = `'{"binaries":{"darwin/arm64":"https://github.com/evmos/evmos/releases/download/v8.1.0/evmos_8.1.0_Darwin_arm64.tar.gz","darwin/x86_64":"https://github.com/evmos/evmos/releases/download/v8.1.0/evmos_8.1.0_Darwin_x86_64.tar.gz","linux/arm64":"https://github.com/evmos/evmos/releases/download/v8.1.0/evmos_8.1.0_Linux_arm64.tar.gz","linux/amd64":"https://github.com/evmos/evmos/releases/download/v8.1.0/evmos_8.1.0_Linux_x86_64.tar.gz","windows/x86_64":"https://github.com/evmos/evmos/releases/download/v8.1.0/evmos_8.1.0_Windows_x86_64.zip"}}'` -) diff --git a/app/upgrades/v8_1/upgrades.go b/app/upgrades/v8_1/upgrades.go deleted file mode 100644 index 0f94ce65b6..0000000000 --- a/app/upgrades/v8_1/upgrades.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package v81 - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/module" - upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" -) - -// CreateUpgradeHandler creates an SDK upgrade handler for v8.1 -func CreateUpgradeHandler( - mm *module.Manager, - configurator module.Configurator, -) upgradetypes.UpgradeHandler { - return func(ctx sdk.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { - logger := ctx.Logger().With("upgrade", UpgradeName) - - // Refs: - // - https://docs.cosmos.network/master/building-modules/upgrade.html#registering-migrations - // - https://docs.cosmos.network/master/migrations/chain-upgrade-guide-044.html#chain-upgrade - - // Leave modules are as-is to avoid running InitGenesis. - logger.Debug("running module migrations ...") - return mm.RunMigrations(ctx, configurator, vm) - } -} diff --git a/app/upgrades/v8_2/constants.go b/app/upgrades/v8_2/constants.go deleted file mode 100644 index 305c43b866..0000000000 --- a/app/upgrades/v8_2/constants.go +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package v82 - -const ( - // UpgradeName is the shared upgrade plan name for mainnet - UpgradeName = "v8.2.0" - // MainnetUpgradeHeight defines the Evmos mainnet block height on which the upgrade will take place - MainnetUpgradeHeight = 4_888_000 - // UpgradeInfo defines the binaries that will be used for the upgrade - UpgradeInfo = `'{"binaries":{"darwin/amd64":"https://github.com/evmos/evmos/releases/download/v8.2.0/evmos_8.2.0_Darwin_arm64.tar.gz","darwin/x86_64":"https://github.com/evmos/evmos/releases/download/v8.2.0/evmos_8.2.0_Darwin_x86_64.tar.gz","linux/arm64":"https://github.com/evmos/evmos/releases/download/v8.2.0/evmos_8.2.0_Linux_arm64.tar.gz","linux/amd64":"https://github.com/evmos/evmos/releases/download/v8.2.0/evmos_8.2.0_Linux_amd64.tar.gz","windows/x86_64":"https://github.com/evmos/evmos/releases/download/v8.2.0/evmos_8.2.0_Windows_x86_64.zip"}}'` -) diff --git a/app/upgrades/v8_2/upgrades.go b/app/upgrades/v8_2/upgrades.go deleted file mode 100644 index 5f42f6f81e..0000000000 --- a/app/upgrades/v8_2/upgrades.go +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package v82 - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/module" - upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" -) - -// CreateUpgradeHandler creates an SDK upgrade handler for v8.2 -func CreateUpgradeHandler( - mm *module.Manager, - configurator module.Configurator, -) upgradetypes.UpgradeHandler { - return func(ctx sdk.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { - logger := ctx.Logger().With("upgrade", UpgradeName) - - // feesplit module is deprecated since it is renamed to "revenue" module - logger.Debug("deleting feesplit module from version map...") - delete(vm, "feesplit") - - // Refs: - // - https://docs.cosmos.network/master/building-modules/upgrade.html#registering-migrations - // - https://docs.cosmos.network/master/migrations/chain-upgrade-guide-044.html#chain-upgrade - - // Leave modules are as-is to avoid running InitGenesis. - logger.Debug("running module migrations ...") - return mm.RunMigrations(ctx, configurator, vm) - } -} diff --git a/app/upgrades/v9/accounts.go b/app/upgrades/v9/accounts.go deleted file mode 100644 index f9c2708392..0000000000 --- a/app/upgrades/v9/accounts.go +++ /dev/null @@ -1,2165 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -// This accounts represent the affected accounts during the Claims record clawback incident on block 5074187 -// with the respective balance on block 5074186. - -// The accounts fell under the following conditions: -// - They were in the claims record or attestation accounts -// - They had a balance bigger than DUST (amount sent to claim record accounts on genesis to pay for gas) on block 5074186 -// - They had an account sequence of 0 by block 5074186 -// - They had a balance of 0 after block 5074187 -// NOTE community and claims module account were removed from this list since they were not affected by this bug. - -// The scripts that were used to find affected accounts were made public at https://github.com/evmos/claims_fixer -// with detail instructions on how to run them. - -package v9 - -var Accounts = [2145][2]string{ - {"evmos1009egsf8sk3puq3aynt8eymmcqnneezkkvceav", "20299404928815863552"}, - {"evmos100wr0u56zfmzyfzjqv0zp0wmczy6am7yel2na9", "1001000000000000000"}, - {"evmos102wuee7tga22vnnxkmev7w79ch5hpudd7an3eh", "4054851449586459648"}, - {"evmos103ejf46km6ympt6y0ws24qqc45h96j7m3cw690", "217669717010562252800"}, - {"evmos103f6wfvuldh5j5zyqh4dnma96mq5vsana6lxyu", "3130047896633089024"}, - {"evmos103gmyy86ydf3thstjdjlewn6lw054uut4258c2", "91766008167085735936"}, - {"evmos103hyfa6j53zpajqhyd5a3zzalz55exvq246nyv", "501000000000000000"}, - {"evmos103n72c5xtmawlrya7qrg9u8cut99ze5zqk8t9s", "101000000000000000"}, - {"evmos104armjlxs72vacdqmef4dv44c3meerzh8pkhuq", "301000000000000000"}, - {"evmos105586a8vzdgfugs8y0em7r9xu6dvrz6w8cpfu6", "45882504083542867968"}, - {"evmos10559ts28yfnxqxhslqsxkrsj4p7ex3mqcslarw", "21000000000000000"}, - {"evmos105t839qtyggs2t6zq822qt29wck8qujrph34v6", "32888382518719710208"}, - {"evmos105yclmzwe7dvjj930gteccu0rkauaaedtcnf7j", "35693259037706718720"}, - {"evmos1060u6wxvu9hmx33v26ga05recesy8qqycjvd2g", "3795587549971939328"}, - {"evmos1065ry8llze9frpkssavchngjt7vz4fl44gmj62", "1100000000000000"}, - {"evmos106hufp04t5pagcupe9e8v3e5g23h7nul58k86g", "133398883581233111040"}, - {"evmos106n3l72df46z9vmdmvjca7trj9wr7znu5mzv0g", "171786212927019384832"}, - {"evmos1070h5whjne6yatsmllta245a7w4wvx2xl0ha7q", "167872611791302033408"}, - {"evmos1076dl997rp3g4q5ppd57ml2h7ku3wvm29rz2gz", "1001000000000000000"}, - {"evmos107wmsnx6eqhtf3etn5hcmmzp06rzg29hmvrq08", "1100000000000000"}, - {"evmos108rvyqyyj0veyft605jkhnzqvw6rjurpfqq47k", "1100000000000000"}, - {"evmos1098pn43caljr6ndk8m2x6wd4g0w2p6j3wx8ygs", "101000000000000000"}, - {"evmos109au3yannfsyjvueqk766umupwpafa3uxvt87f", "55958203930434002944"}, - {"evmos10cc57e239t7u5tfllede7a2psl6wygewlyq0ja", "21000000000000000"}, - {"evmos10ceevq6azm7h7rquacg80770v4um8qfk5y9wt3", "73861106048759869440"}, - {"evmos10cvujqmsjsda5aufx3tfayfysdxxg92q0xlcn8", "1100000000000000"}, - {"evmos10d4w9w7sv4sk6nu824ugy3fj0wnds7kcvj2kc6", "1100000000000000"}, - {"evmos10d6nqdc544zgnarxq53dsh2ymuvazp6x7ef9xh", "1763581660408326912"}, - {"evmos10dcssw4jsctf8wxx9mqljr0hqttvzj92sf885x", "1100000000000000"}, - {"evmos10djmswf42gcpl3evgmprennun9r5304uu5esr2", "45882504083542867968"}, - {"evmos10dlc92rzp2l3eh5nt2hmmqackt9h4ffwuvhhyu", "45882504083542867968"}, - {"evmos10dm8y9v988aqh2yng9zvg0uk3d8v7ununrcm2v", "45882504083542867968"}, - {"evmos10ecp0n9npf8j74qjj2t2vltdhwamtt478mxxx4", "64620803389560193087"}, - {"evmos10esy2fqzqdv3hxzlqn7m8jdhs5m6zl9n8myye9", "1400000000000000"}, - {"evmos10g9lnnkx0js2cu9ln42m3cmfc2g4m4yat726hj", "147723212097519738880"}, - {"evmos10hfkve3nkfwce3wx3jla7wg873pa4ew8attkcl", "70000000000000000"}, - {"evmos10hm3zg7weaytxvx4aymj4n7asmm9shgvy6dv88", "43059791670694436137"}, - {"evmos10hx0u9jfurq20wmt3unlcgtems90lj2h25guyd", "1100000000000000"}, - {"evmos10j592ypch4j6cx98plc3jszjzwnm4pc72z9j0z", "1100000000000000"}, - {"evmos10j5lj9y5w2pp9m3k9j368sgngqv0jlprav602l", "14743448244874619531"}, - {"evmos10j7y6004c29ts26c4hcewss0tz3za0nff9v9pa", "45882504083542867968"}, - {"evmos10javh86tltte5qglh8flqvcenzz6f33hwje47p", "1100000000000000"}, - {"evmos10k3gjrsf2qe3x5r4khg85gm7r26err8zxl6xrc", "61000000000000000"}, - {"evmos10kettz0j007k5x95xhjfw09a6d94cw3lf9jz7p", "23158850120686031116"}, - {"evmos10l2hg9c3c4aw6mrkhrgppmv9h3emylfcxqcluq", "83935805895651016704"}, - {"evmos10l3rfs5eya90utgm6g3lrtf6pzff3mucu7k2tm", "287616221923604791296"}, - {"evmos10laewtwwdwuxtlg2dszrn0twzdc70r8lduc7p6", "1100000000000000"}, - {"evmos10nj0fnt2weqph8v5uxy078xk9uwegqs9myckpa", "1100000000000000"}, - {"evmos10pdhy5043vydeda7gedxwsh8j2fly0adjjhjhd", "26790604532398903202"}, - {"evmos10qtj5etjj04n2sp6m4znnkrehzk3xa0u4tcpd7", "1100000000000000"}, - {"evmos10r4tuwp4n2ef42qyax9334vmylkcmkxn6jt548", "75624687709168196352"}, - {"evmos10r896u5nhu2whg5c5p3d6npt4nytpwufxv4mfu", "45882504083542867968"}, - {"evmos10r92uvhfgsx2t2vpaxv00yrqtjnmp59rjt2df0", "55958203930434002944"}, - {"evmos10rm3m8uzmaaew5vfmz6mzkd3rpmmk30znygwch", "31000000000000000"}, - {"evmos10s2978v798agv6hquke2d44lnhrhdrmqtev708", "259637619958387769344"}, - {"evmos10s3uxs4tam8lh2kayrppagj8ggetcmm84qsrpf", "1100000000000000"}, - {"evmos10s8kg0ht3sfrj8drhpeuw84npzfj5udprl4lwp", "1763581660408326912"}, - {"evmos10sj6j3kjhnkfg6n8z5vecp8u49qteev3k9r7gt", "4001000000000000000"}, - {"evmos10ssclj2ru49c9mgz0nkfytfkfpvm784dlz69vl", "18892084269426077842"}, - {"evmos10surs973g37ecuh69q67lcmpgaxzvdal2dr482", "83935805895651016704"}, - {"evmos10swrrqhxrgnfxw5ke4asu5y7zgtdm2kv7f4arj", "1100000000000000"}, - {"evmos10t9hujrs8ndr6kxen2jjtqhfm7yucsw3sltqly", "203680416027953741824"}, - {"evmos10ua2etcjmez5sjdfpu2zf6gz4mrudz0ejclg6w", "55958203930434002944"}, - {"evmos10vvxcfydy59qx4ujs3qxse5zup3tccmrk3z2we", "5251068476905634816"}, - {"evmos10w3elrtuhvllxf2m308yl5tzqcwk73cfftguw4", "101839708013976870912"}, - {"evmos10ww55ngt9zrsrnrw7hdhl8wd9lex24kuqmlhna", "1001000000000000000"}, - {"evmos10wx7rykn8qsryhugal54v2rhtrq8utkvl5d06d", "1100000000000000"}, - {"evmos10wy9gr25wz2qu9l62ffs3gvtvt0n95wgg2gcqh", "1100000000000000"}, - {"evmos10x3pwvqazgyxyw86y38qy7x2yguwcld7rt7ha2", "3000000000000000"}, - {"evmos10xjmyvkaz4v7n8mu498n54hvrkgzuyeatk6d3g", "203680416027953741824"}, - {"evmos10xqe4y4vgqk48frgzm562qwh94umvrl6qv922s", "1001000000000000000"}, - {"evmos10xtqa3haq09h856h44jv5z3nlh73k65vgmrrfg", "129818309979193884672"}, - {"evmos10yp5kdvnj5c50n77ty2wukrk2q4kmvsnd284tm", "129363185668694719488"}, - {"evmos10zf9nuwfz4yepf8f55sjyyftg9gxlh8eqg4g6k", "45882504083542867968"}, - {"evmos10zrgqf686qkwj2wxxxe9amtdt5z0g8n4tuej2z", "1763581660408326912"}, - {"evmos122c7g5pvm9stw9c2mhs7e33nqfwm4gwlmf7dwp", "45882504083542867968"}, - {"evmos122lhhc2ytfphcsse4s4d2xk80mswryu280wkrk", "91766008167085735936"}, - {"evmos122zpmwpa9hw2u6h6jdtc8s74jxe38l44sgngp7", "9343829969404744192"}, - {"evmos12329tezf55hrt4cjrhnwajt9v46p0k8cl0k45s", "129818309979193884672"}, - {"evmos123eas223yup3j2gxxak4lc058x07c7q683llzh", "21000000000000000"}, - {"evmos123l82mm6r7dq4g5vn7qq0m3ucs7cngcu4lsw44", "1100000000000000"}, - {"evmos123unlvgymymz6rh857d037e7dc6uq7c5ejnqlc", "90001000000000000000"}, - {"evmos123w7x4mj9fln48msx4pzmls6ndqc5sw5y26z4k", "2000000000000000"}, - {"evmos124092sz9syp2zpwn2nveg680gvq7cx456qy0ku", "101000000000000000"}, - {"evmos1247gxudc34x80lajr3lwug92qglg3xlmdpgsk9", "73861106048759869440"}, - {"evmos124lww49rdtx5dncx89uqus3rcqjwqfrtzqkzg0", "22535100797521143338"}, - {"evmos124z0t2hcuhk9eqvddhqksy0rq49udkw7edadrq", "1100000000000000"}, - {"evmos1255r45pkzwmze47e6exuy6rxqk4rrjzv4rmug4", "1100000000000000"}, - {"evmos125u7w6uhm789mtrzgcqwcdlz6q9m0ezjg6uz78", "1100000000000000"}, - {"evmos126ddmmvjst89ds7cxmqcquhngk2x40as5gdmtr", "167872611791302033408"}, - {"evmos126yc02wwfn5zhuaytfpmqradlyjck8hgvggxf7", "108958177038411810816"}, - {"evmos1273syz8kdmyn0ychxyjepn6qecz3w7cd64a932", "5716949655702174044"}, - {"evmos127hdvsxy7le6jfyspxpqnfc2wxeuvauutra42z", "23357321377153489439"}, - {"evmos1287j0nqfrrv26uecrnhr6k7xsx9vk2uc2djqnj", "1100000000000000"}, - {"evmos128m7w0dcwmrahuzsnwas9l74qsxtlwjydj6jnu", "73861106048759869440"}, - {"evmos12a92ptn9fh9pdmf7hysa5w8tdtlzadmcefh6ly", "1001000000000000000"}, - {"evmos12ahx8fhqj5ttcaznw28kksez54r53x6qxxkd4h", "1763581660408326912"}, - {"evmos12ar5t66tgh5pr002j75cjja09er7qypk79lrtv", "45883504083542867968"}, - {"evmos12cc2dgz5xw83m4cpx8uld57h98cghwnqhxuhgs", "1100000000000000"}, - {"evmos12cf0y02vq7ezrhqanncf9pckrlfplq9v0ldmh4", "1100000000000000"}, - {"evmos12d767fv22m7cclte3p7maufugj4u05any39a7q", "45882504083542867968"}, - {"evmos12dc2cwqk79ex36jhp2xv3fzks855pr6vaexx2s", "1100000000000000"}, - {"evmos12dnx7ww4qnevqvh9t34p5zxhrggj5p0nhfd6rz", "200000000000000000"}, - {"evmos12dt7nqfqmha65fxgemulm8737ft337f49cvdfk", "29775925660743924088"}, - {"evmos12dzxynhkvukk8hgz7puakex9ms92qkg5up9m6p", "111914407860868005888"}, - {"evmos12f8jzydyp3a7klegjwqsy4jyhjvhel8v9th0a2", "1763581660408326912"}, - {"evmos12fh654hsfqfxxwp2hxhdkf6ahzyqu3nh4y4fqx", "1100000000000000"}, - {"evmos12ftnad9cfcdycplyxl38xwy025qf6xkpa5sq2j", "45882504083542867968"}, - {"evmos12gxgjyw22yj5h99vl9eqyjr2kar03my6zlq362", "1100000000000000"}, - {"evmos12h9nzmxzv6t0vky3sdzjwvy5jvrry6g2gakdx5", "73861106048759869440"}, - {"evmos12hsw3ppy77yt099xppxp7d2swa94zfk87rcn0c", "2001000000000000000"}, - {"evmos12hxu9luktz5pxpc7evxn7t0jq6v7ygexws6khd", "55957203930434002944"}, - {"evmos12j7rg02evw2nuzsq2llh8acvnwd3eltkhtwk3a", "124443747650766699695"}, - {"evmos12jny2melmjesap06s6nggxmq6gwtavjchaw5vl", "1100000000000000"}, - {"evmos12jx8haa2qh2asf2cwf36e684tqmnd6guugrms0", "532326015524905000"}, - {"evmos12k2klw8ez7ndhacllv99n85dlju9ytd0n35qs7", "201000000000000000"}, - {"evmos12k2pyuylm9t7ugdvz67h9pg4gmmvhn5va85utu", "1000000000000020"}, - {"evmos12kulln9f2vjc8vzzwg0uxnf3k4w2x30hu2pljc", "5000000000000000000"}, - {"evmos12lcc70w4wjgyc9k4sn0xxqgphtydv0n6ywhxqg", "1001000000000000000"}, - {"evmos12ls7mmpgvem0gk4qyr0l630xaejsrprmet43pv", "1763581660408326912"}, - {"evmos12lud2agxqsaeutpnhxfqfg3nhucmcxexq35p77", "3773045336179028563"}, - {"evmos12m9gvknfpgx95rw6sdtwmmwfm897uxn9tlsjxj", "1100000000000000"}, - {"evmos12mjcc93hq6flklsh75w8prddtzzp2u0hvqzqtn", "1100000000000000"}, - {"evmos12n9fuqpx5j65zyfvyekth8n8l9tjuvd0sk2sh6", "1100000000000000"}, - {"evmos12nj5mva2ydswpx83gsvwsznvdusrcwcyvmfxrj", "101000000000000000"}, - {"evmos12ny2mekl8ugs3c5tr9lvhak2ml6d4fqaf94tep", "203680416027953741824"}, - {"evmos12pvkecgjdxq05vguexqd968dy09npk06j6x4p0", "1100000000000000"}, - {"evmos12pw0j838ytpqhwdle67vrugcnkkd25sd3vslkh", "1763581660408326912"}, - {"evmos12qcuq77njgt90wacfwvznuhyjyf3dxj2u34j4a", "129818309979193884672"}, - {"evmos12qwms2zu24qtn5rk278rzger6ymthhyxdpyv39", "1001000000000000000"}, - {"evmos12qyqlqp2tptp5y48vy839v2tgc3zefkulmznd5", "45882504083542867968"}, - {"evmos12r2636hmc2qufheffu573glwc88azjcvfjjd5q", "45882504083542867968"}, - {"evmos12r35fypyvv3zz43vd0g3u82affkvq63lhwremp", "201000000000000000"}, - {"evmos12rdnytkzfyeqgwk8sc7dcvfcp26ar689k2s3xc", "3301000000000000000"}, - {"evmos12rgq0rmsdpjfdcf6fscp9rleuf6r80xqh2sjf0", "1001000000000000000"}, - {"evmos12szrklxuqftvyvt548zwe4997ajv5pqenx24tk", "147723212097519738880"}, - {"evmos12t68n3h2xm5907f7wt7pwvkmcr4lldmn8hgvgt", "1100000000000000"}, - {"evmos12tgkrnmdjcdhzj65d76cp0gyt834hrthll8zy2", "1100000000000000"}, - {"evmos12tjeytdqkh70zxxts65hnsmx06peyvktsjlhrt", "41000000000000000"}, - {"evmos12tkcj5lkkrh62qe96fw4zxsm0nehukh5esusef", "55958203930434002944"}, - {"evmos12tnr3xyvh0c22x4eul4qt8cpvxwjn5u34laj37", "45882504083542867968"}, - {"evmos12umdnvp9kca37el76mf0sa2f4zl6ht38rayw77", "1001000000000000000"}, - {"evmos12uuweyuphf6mlajazkpxke2hxwdfew2wzuq5z2", "600000000000000000"}, - {"evmos12v4ku5w970q2ry7sg4tc0hq8haf2a5hqevd4j5", "1100000000000000"}, - {"evmos12vs5lmyjfavlj892svwdqxzvjdq7ml3tzrcmlk", "1100000000000000"}, - {"evmos12wh95h6alu49336rmcdnxlf055j6zypqwnacva", "1763581660408326912"}, - {"evmos12whde9kcqsmlga3n2c6jufpatf329qzydwldcp", "1100000000000000"}, - {"evmos12x3q53gnh28z3kqs7aqm46wzc5mnlla3yvs5fr", "1100000000000000"}, - {"evmos12xehur45wr6slw865sd7lp4p98u8nj5uw2npaf", "85699387556059343616"}, - {"evmos12y6r39ku43zgv4q3kufl0tac7djuk7p0cqgnw3", "101839708013976870912"}, - {"evmos12y9rw67pvj7dl4nuqr34kj6nxv4awr65c2xp06", "91766008167085735936"}, - {"evmos12z6f2jc4ldyn48w5e7dj0cvjrwltnv5hnuz0fu", "1100000000000000"}, - {"evmos12zcmq3wn5mcm4ldg28g6wgz2sauc9v0yc0z7s6", "1100000000000000"}, - {"evmos12zsyqxfujy3glu6f6pylrnegus7fpt5y7u5lxp", "91766008167085735936"}, - {"evmos132hdn9a0xh35kdpdpcdal6f4je0yhvwlz0cs7u", "11176359149583614838"}, - {"evmos133t8m00w7llsslnf05zdhehharntly8dpsy55g", "30000000000000000"}, - {"evmos134gqghlw7k2ws7yad24e4kelp75jx0750ev8yw", "104924990083292908181"}, - {"evmos134s7kpchfpq9h8t8jkw5n3l3yla6mqlley4c7s", "1100000000000000"}, - {"evmos134tgc47ve0f3kyg8m2gnlhkrwhnp6438mtfcmk", "91766008167085735936"}, - {"evmos135qt9zs9azura5hg8h8cca3h0eec4kmyum2d98", "142855900688060277704"}, - {"evmos136kcdmuz957c6lg668473w8vkhv6dpr8le3xg8", "1464500000000000"}, - {"evmos138lmnxhmfscg600ree9mkqjhynheu43cd6kgnu", "1100000000000000"}, - {"evmos13ce5kc7u2hf82h44xm3s8uzn5x82q0z06kq23v", "111000000000000000"}, - {"evmos13d0t5yp9xn8kfue4gf52tumave923u902s79c0", "61000000000000000"}, - {"evmos13d4aur0z8e8n0us7ye0z3khsgv3yj8vdc0xsah", "129818309979193884672"}, - {"evmos13d86690cm4ymha4w3tcx5zth6z22gmw3plxgft", "27978601965217001472"}, - {"evmos13e9dz2ka54jak2c8t5e4sgu8773j2s3alxfuxs", "27978601965217001472"}, - {"evmos13fd8phhn3g0v3hvpknra0v3qy52s7x28x4rltj", "5282081173002256384"}, - {"evmos13fe2vuy0e383q64usww4v5vxkmz6gcnfvd9jyy", "147723212097519738880"}, - {"evmos13gc3kzl5hv8n3g0am830fh5h8h0eeedwv23kgt", "7671877054615092992"}, - {"evmos13gmvz9zrq56643esryvxyqh4j7frna67z2ptgu", "101839708013976870912"}, - {"evmos13hjsdq74p3nr7wsqdny4fxrr5pxzdv0a6xdfzg", "1100000000000000"}, - {"evmos13j0f5dauaneww7f02q4qz823en9gw5a3473vgd", "45882504083542867968"}, - {"evmos13jwj9zkccn5h6975aju3k9h2z76y3fcp0e5kjf", "27978601965217001472"}, - {"evmos13k0e2rprkuld77ww2tm5cma438xje0vsjslvqj", "10192461379243697742"}, - {"evmos13ldam6pmkt24dprrq90dtcsfv3s0hcwkfkgmf4", "101839708013976870912"}, - {"evmos13lnd6txgyfxj0udrj7ft28r6j26dlx4s34fsku", "35835230257808589763"}, - {"evmos13lqp97aaujr5c6jsam2k76gh3fxe9nj7x0jrfk", "91766008167085735936"}, - {"evmos13lsayduwx4fl5r3ucek2lhlv3xecjl5ent3t8z", "3526163320816653824"}, - {"evmos13n9hz85htwyus7c7jt7wtctmm02g78hvgjetcz", "55957203930434002944"}, - {"evmos13nylk2gj5jnn4ug0q46ap3fuh2gtc6elzhtla5", "1100000000000000"}, - {"evmos13p8vjgmhyk2fagtp83ycy9txyq3x8atuhfvjzt", "129818309979193884672"}, - {"evmos13phvznlhwsqgx7rk86n8feeu4wy2vzwel57rjk", "1100000000000000"}, - {"evmos13pmlxk9h9w5qcpeqnuz5wf03rv8hxpcfd9md9k", "55957203930434002944"}, - {"evmos13prdrn90xq2znkme66tz8qx6wy6ksqh3vlm9c5", "91766008167085735936"}, - {"evmos13q8sr5f6d25fcmz9tm4nym4sw5dhp2rkdd7azf", "113677989521276332800"}, - {"evmos13qcfvrncd9juqxphuz9nwuslhca5hsarvhtxf9", "244241800264144125952"}, - {"evmos13rdx5j0p7nryw5uf5tk42e4ymkh69dx4aevzej", "1100000000000000"}, - {"evmos13rtsec7tg68q4d74lv2qp5h6qjnl6z8l8asp7e", "101001000000000000"}, - {"evmos13sduv92y3xdhy3rpmhakrc3v7t37e7psz22dhh", "193605716181062590464"}, - {"evmos13sg7xca08g4afz7m0qffmk7xqqtggxpz5nsdvr", "49169992863378995712"}, - {"evmos13t0vcrdlj3vju5pqgwzlyr7lcw9s96ka572xzp", "147723212097519738880"}, - {"evmos13t8dntljs6ukveuavml34r65fa8afgv29rjzyk", "1100000000000000"}, - {"evmos13t9w8y52cw6z3x6dfl9snwktmy47mnn0k2a4cz", "55958203930434002944"}, - {"evmos13ugmpjgtpzqfmgz0835teyjycvhv266rq54vdy", "2000000000000000000"}, - {"evmos13uslufkhmu9qkzu4rh39urzn7p3ml6mkgfj3am", "55957203930434002944"}, - {"evmos13vep8j9ud3rlrdfq8nnh9k56cevvt739kmzsr8", "1763581660408326912"}, - {"evmos13whwqvhc8qdgu73w0s0q0lgefxv0k68w9rdrzw", "203680416027953741824"}, - {"evmos13wnjd2ajkhpg8ad929fa0y0ll6qcmgt65rg2am", "1100000000000000"}, - {"evmos13x2pd65eqt6stc6p2h842dhe788wk52rnuna2s", "101000000000000000"}, - {"evmos13x4dge7z4vxvz0h23t0hamakfj69y5uj4ea55a", "1100000000000000"}, - {"evmos13y0vnu93feryadu20uzrsm5p86ppk304pmgzpa", "1100000000000000"}, - {"evmos13z7veaqncplqr3t0lazx0hq8zlw2sryc6rfemz", "195851213756519055360"}, - {"evmos13z7wddcsnc6gfzsyj2hrmqx0lha36qsrn5ne66", "17009982989759789749"}, - {"evmos13ztwpqeaxudrtrhqd6a86szj60nf4gvfhsp29q", "21000000000000000"}, - {"evmos13zyg3z9aqdf5mmywj7suvv7q8nfje76lujq5sp", "1763581660408326912"}, - {"evmos13zzprsdveuhnyujyzulr37jppaj44pvagqrxx7", "61000000000000000"}, - {"evmos1403mfu687f5l83gd6jlzqukap3qmmle2jh3xlw", "73861106048759869440"}, - {"evmos1409fqa0wv8ey550ek2a63yk36xexe09m8t5sds", "61000000000000000"}, - {"evmos1427grrk3nzvswh3aqgf50ecyqx9frpgt9tj69s", "1001000000000000000"}, - {"evmos142uea3pgxdt5xwu3u3xf8e6kar6zcnu2zjjg3d", "11000000000000000"}, - {"evmos14364t32k9euacce805xcjcfzzmtlnuy29nz7yv", "108183450795672426240"}, - {"evmos143f7a767rmqsjxfc3q3rkqvhvtdaelljlds42x", "6831841138891315968"}, - {"evmos143qxzcrpcuch4cyd2zcrnen55v8zpxr4f3rr8f", "129818309979193884672"}, - {"evmos1449xnvlhxx9w0klaxx24gmk2f9fctlyuq0tmly", "64840864650929097728"}, - {"evmos144cpdufjuatkuqtm89sj4f6v987spp4l6xgkl5", "55958203930434002944"}, - {"evmos144czwftrthl42h9mxhhxezc0kakqj88pp0dyw7", "1100000000000000"}, - {"evmos144dt7tlwygqmhtgga2xszuf7v3q9puk2894qpj", "1100000000000000"}, - {"evmos144tvmvne39psrzqfp6z55z7xldvk406wp5rsue", "4675014832085119514"}, - {"evmos144ur8a2mse04nqg009lwhyv4c0zq6p4sftecm7", "11000000000000000"}, - {"evmos145574vcna8djmptq6j2rztkqgeyq24ve7u47rm", "91766008167085735936"}, - {"evmos1456tqm327vayp80hw5ar3hf92cqqnzatlvajyt", "129818309979193884672"}, - {"evmos145mrshnuv8y4j2vqew00p903uqhwzv8hdwru8s", "1100000000000000"}, - {"evmos14629ac6v84ys3rs3np0q7we7nqmxx4j9v0eafm", "111914407860868005888"}, - {"evmos1466ws5v3tgwsws694szwzeltx7jsagrr07uz5k", "1100000000000000"}, - {"evmos146crg8asxmq3v0vvstzaugtmfu007uxwj3fpgk", "8466566493008594125"}, - {"evmos146q9h842tgz0xpa589yyakypuawndtrnnlm2ls", "50882086169259390"}, - {"evmos147jhkwkyqt0k39vkd9q37d47lgw8fagzwr8jyq", "1100000000000000"}, - {"evmos148dk3xruhrxnc8lnmhh4zf2lxxu5krl8em0vw0", "1100000000000000"}, - {"evmos148gz3sr2u24wznz902n5aagmcpc7p2s8lx6uxv", "231659017993170763776"}, - {"evmos148xj8xurqkun5dd457xn75yqj6x2z6dflnt3tc", "3281667866044542976"}, - {"evmos14955wkmlllde0u5a7pr3rr0ae2s3ygqf63kw36", "401000000000000000"}, - {"evmos149cfuapz8cq6j4mz555hjayd2h3zemcpg3j8sh", "35895591911416284160"}, - {"evmos149g2tl9xakprzs5f854ntu5fthdgmuqd8uupjm", "455487833714906791936"}, - {"evmos149hzuqd3q9xs7l45qleuceswfcwljmlyqnse8u", "83935805895651016704"}, - {"evmos149le9w76gjauv2j40msgfqvrd3fu032qual3vm", "1763581660408326912"}, - {"evmos14acrwq72mc3htwxyevah3s9e02ph45gssk8jpy", "1100000000000000"}, - {"evmos14agpgf49qa27602g5fp82xvpkwp805fvu4edsv", "45882504083542867968"}, - {"evmos14aqnlx8trmtcr9fa3kqykzmen857tpmu8u4x2k", "91766008167085735936"}, - {"evmos14cn4cwavhypq5wqcp880nrjkr2v33xaru977x3", "1100000000000000"}, - {"evmos14d36g5xprgp0t5qmfxtg6hmlm7nxapxxwnfa6m", "101000000000000000"}, - {"evmos14d908ulmn2v3grd7w9lvhf3ctfnhhq5w9qply9", "6000000000000000"}, - {"evmos14d9tamuq2mr0rch6tvllcjynpxqhn2tgmm6fd8", "1100000000000000"}, - {"evmos14dl6t9qmgeg5w3keg2988w44yprglrvp004tm9", "1100000000000000"}, - {"evmos14dpp3z6dalsfxfxexkdz0aglynz8pr9fp7w2cm", "1100000000000000"}, - {"evmos14dtazqy0re6sv6tfa4mfuqul7m59wn99tx75qf", "1100000000000000"}, - {"evmos14dvqrf7nnq63hzlpr3peupw9kvje4myms5wfhd", "101000000000000000"}, - {"evmos14e8kur54kl4c8jmt8u2gvhmlcg3llweepz7l6c", "27978601965217001472"}, - {"evmos14e8wteevrg62y5dss5sxvp4cqyv0d8aa0v3l85", "11461583665676145625"}, - {"evmos14euxrjqdqwpxsda9pdz6anc3a3nh7evx4v49kj", "1100000000000000"}, - {"evmos14fmkx27u0zezwch4txd9w6deh8nvcuet0het59", "382071840000000000"}, - {"evmos14frjz598zntwctsfnc63tam49shzs60pqv9zez", "147723212097519738880"}, - {"evmos14frv0nkhrdy4t20kyf6zujtn4ywm47fwjhj9q5", "59991000000000000000"}, - {"evmos14fupuw5u4h97lylytscvxhpwsa8t08wrfe8u46", "1763581660408326912"}, - {"evmos14ggcn4k0ufm2zztg22tcd7hupnwxn9wmrd9984", "1100000000000000"}, - {"evmos14gzd7tpsrteha4g9z5h4jxecynhv2ade6ak4wk", "22183774701088739059"}, - {"evmos14h750yj393tqze83z30ks2u5luxjupkd6h3v76", "1100000000000000"}, - {"evmos14hrfsuupeaelr96edwjf6xckpzk2yfjmfzkwhr", "2000000000000000"}, - {"evmos14j3lqcgqlxv23x6j67zm4zdgyl7lqsy9knqxp8", "81412702652398124000"}, - {"evmos14jjgxtd02kx96lvdd7nkg96jc9p2j6fxv5x9g3", "1100000000000000"}, - {"evmos14jtg3aqex7rfys8070nuzfuupjp8p8mxjelxua", "101839708013976870912"}, - {"evmos14k3nq55e83ugysv803eczcfxuynffn8yn2pk4d", "1100000000000000"}, - {"evmos14k67qc3sd2arzqucjgafhnae7zmrz6l8wa6gna", "1100000000000000"}, - {"evmos14kqgx2j4jaww7ge035avjdmejpafhw5dvj72ga", "195851213756519055360"}, - {"evmos14kz78pkxasxduf6a6e858cl3luaeexth5ps54r", "227743416857453395968"}, - {"evmos14l7avx4y9tpc89nah0d7n7s29q3fv8ldaz5xnv", "1100000000000000"}, - {"evmos14mtc0fjet9c4c65s7lfxntwpy8992v6tsc8ffs", "1100000000000000"}, - {"evmos14n4l5uvy67ckn5j6e8q2mhp0t9ncqy9f2r2gxn", "3001000000000000000"}, - {"evmos14nkmkhkcqjp9j9x4299zpazj9zfp7f3lzaxvvv", "2000000000000000"}, - {"evmos14nqqpuxgtqjm427s86wzm57w0qr7nfeydzs0n0", "1100000000000000"}, - {"evmos14ns6cx2wwwh2x9vq5pyjp4wmumu99dp9quq8w9", "1100000000000000"}, - {"evmos14nwem3v7flrwzusd0r5r9chcyed9y8wee3jfdg", "11787810093859429120"}, - {"evmos14p7nut0vlmay4ld32glacluvx46qwz9gzut86y", "34084144845434997446"}, - {"evmos14p88kcy3dxlh9ld392jemwha60cz4e7rn3rmp0", "59273232041077964268"}, - {"evmos14pnzslgy7vawff7k6hcz7tpz550ym3s4r3md7m", "101839708013976870912"}, - {"evmos14q8a3xz3vh3nr0un85nnrzetjw9c88ex9yte38", "1100000000000000"}, - {"evmos14qydjsrgnsk094dg7sm955a0q2lrs92gectld8", "83935805895651016704"}, - {"evmos14r8xy0er30mrdyv9343ylvpm4c90thtkpwy3wf", "45882504083542867968"}, - {"evmos14r9efqvam3qr2jhh4mqp0x64533a4kyxpzzkjx", "1100000000000000"}, - {"evmos14rm27pgxcpvlzy4nkyxrwyw2qjk267t672xnjn", "91766008167085735936"}, - {"evmos14sruzz9x3828a9ng3d7ze8red4s2kfzpskhp3y", "91766008167085735936"}, - {"evmos14tcxx9z6gtdslajzz5qjlxu3vl3v23djx7t9jl", "343573425854038769664"}, - {"evmos14tk4wvgru0ucrpnufnf3cen5mcwg5y7r22zttn", "199764814892236374016"}, - {"evmos14tnymts90zsfq0aqmttne5fqp2365uqeslgh9k", "101839708013976870912"}, - {"evmos14uxy9fpdfyamzmu9kcfenuk04any0q35mdvydd", "201000000000000000"}, - {"evmos14w5zaz4d42pw02pdvt5ztvndshu23mwr5ussc6", "45882504083542867968"}, - {"evmos14wk26zyeyph62huhrc355mx0zx9ul44n4knl7d", "1001000000000000000"}, - {"evmos14x4hvhsws0vv79ea4cq97g6yafhw055pf4eajx", "1100000000000000"}, - {"evmos14xgdfdnpjtulj6p7rkc75ekxqjq8hc5cu8tem9", "343573425854038769664"}, - {"evmos14z4ralqtw4mh474xgvcqgeg2cwyuth7tk9muml", "1100000000000000"}, - {"evmos14z7fptkpe9yw4xjd2508g36d3juz0cgjk29tqe", "5887727836789110528"}, - {"evmos14z7gdsgmsdp3q047yuft294rlwra4h8sk5fxkv", "501000000000000000"}, - {"evmos14zc5twc5s2a69snx0d2h93phutuvy07atm8nnn", "24231706050187391849"}, - {"evmos14zgqeyl2z4dhqez6lh5n0uayzfallaunh4w3ma", "201000000000000000"}, - {"evmos14zswghe7hjkl4us0x93y0seprhugz0f90jr20e", "1100000000000000"}, - {"evmos14ztjsxy0rwfnd2ch88v6k3xv4krpqv8cc8akhx", "136119259478854389760"}, - {"evmos14zuyahuycjja48w8x8ljtghmhqjm9d0tf7cefw", "1001000000000000000"}, - {"evmos150jk07dc4kq5qwr8hwm262jhjckhvdmv4khysr", "1100000000000000"}, - {"evmos152309hw6tzcund7fh89cca6a9d9f9j0e46nlfz", "501000000000000000"}, - {"evmos1530alm0zuafql04v3rvm2m08dyhwmexpq9fyw6", "1100000000000000"}, - {"evmos15375jc76ntqt5znlqcma3uj56j96tmwvkhemml", "47429286425947844019"}, - {"evmos153hahu5dpy2wmgky3gapxc98vwqket7fmd7zga", "1100000000000000"}, - {"evmos153k282pxkk98ckm6uhpc8q3yy8jg9kapvnyzpy", "11000000000000000"}, - {"evmos153sp7fehch4fypu9sx67stnfwqwugwerutrjw5", "1001000000000000000"}, - {"evmos153zthg7x6ec6j9jk8rz2gr6h35ayzv6m8e4flm", "50000000000000000000"}, - {"evmos1546826s5he0n4pqyjdz749ggync4h45z98lnv8", "101839708013976870912"}, - {"evmos154v45gv8s7res5q9tw8t9r3txr68sq0zux8nmv", "45882504083542867968"}, - {"evmos1558cma0t559u49c44twswkc9lamm0x2yw4qxnq", "2001000000000000000"}, - {"evmos155hqffrm6dd5l0ezx4fyw6smdeazzxvh24ryyp", "1100000000000000"}, - {"evmos156dtwxdgqyterlxhc2mmddl83eqq033utn9ny6", "1100000000000000"}, - {"evmos156k53kura06kh4qhuth44pgu9wknutq3dm4vur", "1100000000000000"}, - {"evmos156sdumhg3h8rtz0gc8ydfrjgy5f0c3dkqfn568", "1100000000000000"}, - {"evmos156splsw8w726nxmy6ye37jdqccgav46482670q", "1100000000000000"}, - {"evmos1575skhp94scgw3xeh9ktk9w8hfrewsy6g4rw37", "251000000000000000"}, - {"evmos157jal708urg7uvs0602ljmwx38xuu53qjsa49r", "21000000000000000"}, - {"evmos157reymgaujhlsr56mpff3n0r9tu5lhs4mrfdc9", "1100000000000000"}, - {"evmos158wxz67dk0j9jylflz2mx8j9rgn4r30htcwutq", "1100000000000000"}, - {"evmos159qrz92dtf960sx47vzphr8yha7wscjdlnwhfm", "107498893177300089856"}, - {"evmos15a8z32c006w592s2zg887kmhj5p25vjc7r998s", "5793130626125204336"}, - {"evmos15c0r4zwd2m9xeegmtj99c2xfxz242l86dnwra3", "33513376331890785280"}, - {"evmos15cdyw9y2wthsc77edv9xhjmklww8u5urwmnjqt", "1100000000000000"}, - {"evmos15djwy0ktxd43xnfddtt3hk4a9sds64rsdyut24", "1100000000000000"}, - {"evmos15dlu4ks4vtutzgrrl0f7qjlwxetsm9e8qkd5dj", "1100000000000000"}, - {"evmos15dt7wntvldk5txhqvvff4g63tn2flfqjrtes8f", "22080658831241470464"}, - {"evmos15e8hv6hugvu6s4zul0k400a5nff2kq9qec500p", "185775513909627895808"}, - {"evmos15exppsqp562r86rwvx0kju833w35ffjsqwasp9", "91766008167085735936"}, - {"evmos15f4n8hmccsyg26p7prdl5929nr6ply9xm0tujf", "47646085743951194880"}, - {"evmos15fw6k8hf5w33sqju6jaxyh8m20wy598nvrxt53", "45882504083542867968"}, - {"evmos15gn7crx5v3gnnm0c6sjz2gzjnph3a4t9883e4p", "91766008167085735936"}, - {"evmos15h7zckscylqhh4cy6m0sl4z9mzl48xg4xk5wka", "1001000000000000000"}, - {"evmos15hjqt2psg3kpuv0r6c0d6xugqft7uwf0vaa4sa", "315594823888821747712"}, - {"evmos15jfgsafs6wt704ls5lwlat66z8p360huct0pm2", "1100000000000000"}, - {"evmos15jr5lffy9xrudrpceud2pgrptccryqhnu68l6y", "1100000000000000"}, - {"evmos15jxzm5nwp87hszpa7d09lyhl6u2kheqze4wxsk", "1763581660408326912"}, - {"evmos15jyafu32dsrephnvtnavd6wq3vhsfmeg0378at", "9001000000000000000"}, - {"evmos15km3htq6w8zu9g3xkc080rp2ww8ldv5h56ww7u", "1100000000000000"}, - {"evmos15l62rwn7qmyjqdh0k4vnta0k0h75fgek3z8w23", "201000000000000000"}, - {"evmos15mhzjaamr5q82kh68nl0dveggtyfp2vk7tu9fl", "91766008167085735936"}, - {"evmos15mkjntu30zgx6pzjv83acvcp4m87sp6759n7e5", "45882504083542867968"}, - {"evmos15mxe5lzxez5juh2d95eshl3jpc2w9ephurafx3", "45882504083542867968"}, - {"evmos15n2wdvrfd2a8vwnnvvcqqxlyl7gh2vkzxa5cw0", "3825774129192919561"}, - {"evmos15nd6aac0cwp3yezf42d3sxrqlrlhl4hhpw5ph3", "1100000000000000"}, - {"evmos15pcffl7sh6zv69xzkf6fs6j5jxuw86736geaeq", "9985500000000000000"}, - {"evmos15q8sdx6083mxwkvtpywcf39zd7v78ququc4r8g", "1500000000000000"}, - {"evmos15rdhd6w996sfgx78ud6qvye9w04nn76ezqtje0", "315594823888821747712"}, - {"evmos15rkq7q48um3zt9286yxch42ed8k73fnzcj58jk", "73861106048759869440"}, - {"evmos15rzu3v64gdr2r3ztjkaklssevdy5j4zcsytp0z", "95952554983047722286"}, - {"evmos15s2meenm76lw0eeekjdu5a4gyfac76eetfrm5a", "1100000000000000"}, - {"evmos15s4vy7uygrc3qhxa2t75pwkg62yf97zkc6awfl", "1100000000000000"}, - {"evmos15s7ezcjrddgeagk6v5y8e94cj3k0ul8hn2av8y", "1763581660408326912"}, - {"evmos15sd4x5p8j647dmtxf8jvk84fna0aaz9sffzktd", "1763581660408326912"}, - {"evmos15sl4r7k0rq8f0kk3eegss5qpnn2naj3sa0g4ru", "1100000000000000"}, - {"evmos15swg0fgc6sdgm2l7xqzc3nn9uwnv66570j7g9f", "47668009092742613082"}, - {"evmos15uj7dqnhtzg0fgyey03j3s58w54wlnz2pgzeuh", "1100000000000000"}, - {"evmos15uqz7z3t25gyt0t85x3ca6cq7kngc0lv2puucg", "2000000000000000"}, - {"evmos15uu798ast2776zn38537cxphglk3t4nyj6jkyt", "101000000000000000"}, - {"evmos15v0pn2x86zuah5g3yu572st0gfugwkdfvga94q", "12276200167597400064"}, - {"evmos15v89w4xun6hyza6stfzw3aer56aze5pur0shuf", "1100000000000000"}, - {"evmos15v9q77g37am6a6u8eqxf9d2vej66sqvh0c2s9h", "45882504083542867968"}, - {"evmos15vquaq2n6rh9lrl9dc6tvjlz5k65j04e7y9n2h", "1100000000000000"}, - {"evmos15x7q0vzmksgd2y42da9cfhrx3uc8w9sp9tk67p", "83647118960730024742"}, - {"evmos15yfpxuqtwfhaq7w3htyz64uhjxr4ke3gajjhpp", "3134513655717138793"}, - {"evmos15yg094qpmsuk8c0e2keruk9ma8ndtpclzazvpf", "1100000000000000"}, - {"evmos15yhz9p8l9kk5e0a4wzgulfyn762d8e6jea74el", "1001000000000000000"}, - {"evmos15ylapzu7su76x2esprc8zcuwx8pw53f5es22su", "11464500000000000"}, - {"evmos1607zqq4c3ex75480tkslu2nwchuquf9qxyg8ca", "12764984866730584188"}, - {"evmos160ppdj4y394a8j50w2ktd3g0dsma76vw9uf5fu", "21185545335544641280"}, - {"evmos1628jvheknwhrkl82acj9m5fr5gzx0waew7s28u", "1100000000000000"}, - {"evmos164gh7te7z4x9w74qqw224sdqx5qqaad2awyyft", "3001000000000000000"}, - {"evmos164kcyhg6yvlqe679375e0deemlv5jdrtl9e3ew", "1000000001000000"}, - {"evmos16545z4633elm2lq8nkjt6zm79ptaq9sm822q7f", "38967572852502157024"}, - {"evmos1654jqfr8uvdvn9f58hd4ggf3slpn38sr6ed076", "1100000000000000"}, - {"evmos16569apm87kresm2xfjgnufss348ph5qq7u8f58", "1100000000000000"}, - {"evmos166rqd4vrqnmv63ec2txgld33lys83udkxjgf2e", "1100000000000000"}, - {"evmos168299nvqh0xxu4tjvuv8qcunhhhkl7k68c8uyl", "203680416027953741824"}, - {"evmos1685qcm0hn5hcus6d8nr00v5mc6p73k2djmmkr7", "1100000000000000"}, - {"evmos1689kjja66s8jmlvtcsw534z8aejazz6r6gt6dd", "27978601965217001472"}, - {"evmos168aehdrn82ps7rguv466hpwmj7r0llde6wwdnh", "45882504083542867968"}, - {"evmos169tad70eqjre63x4n0drj5pa5lntlgs2xdmf9d", "5001000000000000000"}, - {"evmos169xephq4g3l66kr30jyek7f0we2jzt6rlwvlc3", "1001000000000000000"}, - {"evmos16a32p6y2tmwk58f2fyyy4neaqnzdgd8zqnk2n5", "1001000000000000000"}, - {"evmos16a3u9we0tpv8lc4fp3khk3x45wfvh45m2hx6pr", "7702530642609527070"}, - {"evmos16c0q38g372rh482hm7sncd4wp9rlfzjrwwzea0", "1763581660408326912"}, - {"evmos16caqyryrvzk0043pyvly7a8afe2mvhcdgtkf2p", "315594823888821747712"}, - {"evmos16d374e4hcaam2sfnpkcjaulls7ym3qsgzfql6z", "55958203930434002944"}, - {"evmos16d89a9hlaymgunwznud6e9rsrrfv3qkmfysg35", "106832110903005580288"}, - {"evmos16dcwlyrwx8duucsr363zqqsf2prc5gv5vamh55", "55957203930434002944"}, - {"evmos16dync9juk3dde8hh8j00tvhr7u0aa2v38lgd89", "26745827585993878846"}, - {"evmos16ef3k9xk0xn7phja9lzdu0k8gqz5usqkwzt6g2", "1100000000000000"}, - {"evmos16ez4690wcv09yekukwl38txg3xz34xswga0ajy", "11817453381915651542"}, - {"evmos16f9z3x8x5rq9t0x8f8drqgsd4f7dw5t4lzwvq2", "241732717840061898752"}, - {"evmos16fc6y2ps3dpdtpwph8kdvu2zy8glk4z3lxtxfs", "83935805895651016704"}, - {"evmos16ffcz370hhcdlp02nggvcupzwtpxng7y0lc5tk", "45882504083542867968"}, - {"evmos16fg5a4p09tvgdkm93q0hhm0jnyc64t2t57jel2", "111914407860868005888"}, - {"evmos16fq3ew0t7y2xxw7ptkjtf7ff0xf63pjgtt8gja", "54603027719287712512"}, - {"evmos16fth4ctjqjmlk2y0zlld6aldl7h0m6z696kjus", "1100000000000000"}, - {"evmos16h2ynrzwhxgjnd0hswkvdvq9nav9kklqwdc983", "22198136772201167372"}, - {"evmos16hce06qs86aee76n92h56ntmxq3nwaxgdae3kd", "21000000000000000"}, - {"evmos16hg4rr0xsg6mjtqw2zj5t8jvd6tmsfhvm2j6cc", "101000000000000000"}, - {"evmos16hlmwf3d8shuhd09x2g54uyq9d2urv5ujyd32w", "27978601965217001472"}, - {"evmos16j7weuv879u6qg8fyl0kawzmaq2sqmcqgm6uva", "52972264742662446499"}, - {"evmos16jw65lfgx7eetdxngmmr0rv7nsvzqmqumlrl39", "151661712709707548416"}, - {"evmos16jyxtj4ww3cnavf740axgx4329kq7mdfk0nxsn", "1100000000000000"}, - {"evmos16kdzlw8yyc538nqfdadwtpswf9af5v6x4fs34p", "1100000000000000"}, - {"evmos16kjzhmyyyyumxlm3qtpae598g86ygn5p680f96", "10000000000000000"}, - {"evmos16klmnef3xakgdaq79t4wu7c2ljye3zhsw8rg96", "11000000000000000"}, - {"evmos16l3t3l07dfxemc90eswacr0dd0a5uygks2lv8p", "1001000000000000000"}, - {"evmos16l5tf0vpgpaa5v3sc2yj7wz3uwan4mmms2s8gc", "129818309979193884672"}, - {"evmos16lgrt8x9tyerv0yane4tkly865r52kjmdn6ssg", "23619274359948071643"}, - {"evmos16mj6v59p4cp3juvzms2q7dua2lpuctwv5k224k", "137647512250628603904"}, - {"evmos16mr07ua20uk5jr0a8zcn956l8gd77ypr6tenp4", "131581891639602211584"}, - {"evmos16mwm6d38yuz8pgta2e0frqee59y2jsknkeeegg", "45882504083542867968"}, - {"evmos16njrx9urzd4q9ph6c82cjh4us8zhcgkgtlduus", "1100000000000000"}, - {"evmos16pffk5a6u70t7q8y98w8fjyhlsmj7cw7qhjn67", "57330170962422299392"}, - {"evmos16phjecw25muxjyxgft4jxmwntvx24xhc3dnpmz", "315594823888821747712"}, - {"evmos16pv3l5vqxkxr8gxv286tzpsmc7xx0fs4wu7uke", "147723212097519738880"}, - {"evmos16q577m0vnpj4r7xpd7zwu8ymqqq8s85753vr7t", "47646085743951194880"}, - {"evmos16qa54kpjuhu3780jkev2vp7ewyzre8df9qv9f9", "45882504083542867968"}, - {"evmos16qwr4mgfe7pvjx3af8nyrjs9ace6hvgk3f3rf4", "45882504083542867968"}, - {"evmos16r29wj4uyj6knxgekpeeueeyh3vqpsnfshp7kw", "101000000000000000"}, - {"evmos16r39ghhwqjcwxa8q3yswlz8jhzldygy6ska9ts", "171786212927019384832"}, - {"evmos16r9jc9y25zpw8x8ajusgeh4qfmu2uk5zu8pwer", "1100000000000000"}, - {"evmos16r9m2djj4s3rfqaqly9cmfufju8ghqpzhy6x88", "55957203930434002944"}, - {"evmos16ree8zn6s7qzj807ectt78ymkzgjq0kuh0jjpu", "13969840000000000000"}, - {"evmos16rpx3nmpfdajl4sq2lx3ptmge7mgla30754aa0", "1001000000000000000"}, - {"evmos16rqt6ka8w9ludaf2qwkhpv0s65gput892umqlq", "1100000000000000"}, - {"evmos16rryp29jkwqcuuds77pmjrc9j2nwmg7faagduw", "101000000000000000"}, - {"evmos16rua749nl07uhaetnhvdqc5wrwp7n5q5ewxkf3", "27978601965217001472"}, - {"evmos16s9mgcgyf2xq2l0pvyxgmgz6wsr5cmm62p4kz2", "45882504083542867968"}, - {"evmos16shn6m33ngncqrl0kfna6j4cld45tf8hpy3za6", "1010000000000000"}, - {"evmos16t5pr6njw44dxyua0k698j473ff2kxcr86xmyq", "27978601965217001472"}, - {"evmos16u2wyl4kxhzru6k7zdv2jx2ql489yks0jwdjsr", "49923117496432943180"}, - {"evmos16u5yk59jr338q29lwj65e0ffnen5h4hxgg9rjd", "55957203930434002944"}, - {"evmos16u80xh8ghva9u0wkl4mdvt8lwj4ak0lvcakaw9", "45882504083542867968"}, - {"evmos16ujj75qfs4kg7055nztenwknfez4xjskztv9rx", "259637619958387769344"}, - {"evmos16v6dsq7tmlg08cvs7g86776x908pz5hx35prg7", "231659017993170763776"}, - {"evmos16vezn4xnqzckff76z2y08090mm5e8c4cntyku9", "1100000000000000"}, - {"evmos16vlph8cf7yj9pl2pkvkh9kdpx7dmajxt07gnt3", "1100000000000000"}, - {"evmos16vstj3wrmeh74d85xgxwrxnsz4efw7undrmd7x", "55958203930434002944"}, - {"evmos16w48zj8jp49dw2q0ad0zcj7vfsqurgygfxtfeq", "221000000000000000"}, - {"evmos16w89c7z64nzp3xny6dnhpzze7kvrquzzs08yl3", "5165518835364212736"}, - {"evmos16weejfngsalxdrsmjl8mn39f40yllmr2ljaxxg", "91766008167085735936"}, - {"evmos16x9rqwca62u7kta32apvlzfypaut8rukvk3qtq", "1100000000000000"}, - {"evmos16xave7g2ruzp4y2h6702rfh5s5g8txamvkvlj7", "1100000000000000"}, - {"evmos16xewnf0eq2uhgw98p45mvwqch0w6wp6g9f5j3f", "1100000000000000"}, - {"evmos16xp5mg3q0duq36kd7t4vfj43cm78hmresce86z", "91767008167085735936"}, - {"evmos16ydvhwtxcs34y4ty8waun6qscurr8gllevt89y", "7475791850719459342"}, - {"evmos16yna2mkpzqy843y5qehqs9ej8hpgzzrzj3v6rf", "1100000000000000"}, - {"evmos16z4cj4wkpjfuqgcst0flhudzv3q5my2eu8uw9y", "1100000000000000"}, - {"evmos16zerlrnddu8mshd048rd9hz20aecfxeea3dur4", "1100000000000000"}, - {"evmos16zkvgj9za00a4d4yhjkv4jweggcuqsh30gud3p", "15430186128860684288"}, - {"evmos170dnu7wd0ht4d496htzt04jqq0lykvl60dt9ad", "1100000000000000"}, - {"evmos170ew0zra3jgk86shpexcexr08khplkp60spnme", "1588570985570355994"}, - {"evmos170mp7nywyjy9hkt0pcw9vylgcdmylehv8hpk0z", "12656623981088892844"}, - {"evmos170rmdzfr0u8dch098vjy3pcx3dfas8agaxvqqs", "1100000000000000"}, - {"evmos170va76yvj6sy84fe69nw9kyd2d9xdfdd4w5tt0", "54029628569903901172"}, - {"evmos1720qgqf9cjxceqr6cfquzswnuaan36ynt02ppt", "84857047274813263872"}, - {"evmos1723hk8g5zwz9uvdec2k8qpucnclv8855kkurd3", "1763581660408326912"}, - {"evmos173j5c932y4n43hkhhjfs2ve79axzpxzf2727jn", "31504765286033655296"}, - {"evmos173jvldzzj3l9z4wn8pqvjvfel8nv90s3akjmh5", "75624687709168196352"}, - {"evmos173m9yt23gxa2a6vc88z4xdw4zkusuymzzxghej", "45882504083542867968"}, - {"evmos173r4y6mnt78yzuc66fjdmvgfa92ykldxz5vpre", "5108012395938199026"}, - {"evmos174qw0s0nzl0878qckkqtafmqkm3a5y9w8q4wxd", "1100000000000000"}, - {"evmos174tctz2fndzwp48telmm07fg6a83p0zjtg2nrt", "1100000000000000"}, - {"evmos1753lgzhcr4wk39rglta944pdlx3a6v6n744ujg", "83484149752661635192"}, - {"evmos175503vnaqd0svp82ztjh7caap74xtyxl9e7wup", "21000000000000000"}, - {"evmos175a5jrgx686rm2r2qa9y0fgwna8z8wmw043knd", "101000000000000000"}, - {"evmos175jnwnk2g7n24dak4h03rt0a0jc728u9us8sg2", "1100000000000000"}, - {"evmos175ycuc23a899any2hg3xzsu4lwcmy4nc3kxyd6", "91766008167085735936"}, - {"evmos1760jhldmrgumts3zgdfwx98pm4tuzp93ulsr9q", "71555583415353877504"}, - {"evmos1767fe8lxl0jmh8afn04czc6uvdq7wrcn9vfn82", "1100000000000000"}, - {"evmos176dy3095l6eh48z06rflsk2dfzdzgwtpdwdx4j", "1100000000000000"}, - {"evmos177c97xvl969c9gvjr4k4gz8sm48s36p5xd025v", "144162630543847106617"}, - {"evmos177l3072wtfqta7ymtuwju0f5l4zl0n26hrh88a", "101839708013976870912"}, - {"evmos177q5kh8v7vvswaz5yrt865k3ezckw92py8cman", "1100000000000000"}, - {"evmos177vwaa9pkwpdh2d4aqyrjl0wnpw2hk8lzh3ccs", "73861106048759869440"}, - {"evmos1795ywr7vdw27r6qr25kjepdwgepmejq3uhnf2n", "111915407860868005888"}, - {"evmos17cq68mwu8t60sj677qm32kck8meppm8l3weu34", "1100000000000000"}, - {"evmos17d5y9q5qsmf8pugsvyawk6kf2qnpfvh9t98jlp", "91766008167085735936"}, - {"evmos17dyyyzsgujswnuk0yerps3yfhqgs80lgu3yv9g", "1100000000000000"}, - {"evmos17ef5cf0lqpkqsxud3h67ydd76gs0t0l4p6mv83", "1001000000000000000"}, - {"evmos17exgnwxytl0ru77rw33tkc4n93tjxqs7w9eadg", "259637619958387769344"}, - {"evmos17f55wsjmxzwuclx2gnz67n0vp6wffmmmzqw6t4", "1100000000000000"}, - {"evmos17fr8auum7u5nhks25wm3z8uv4dtm6t786vh3k4", "1100000000000000"}, - {"evmos17fsr4vqgx9sv3sa67r5wt3wtq5szkqul4wj7zq", "101839708013976870912"}, - {"evmos17gfdp9r5acpkrr9f2j6etnskcqtlg8x2ff5gc3", "1100000000000000"}, - {"evmos17gym039n2zxy38vnq95r9fnmwkeungc5nh4kqu", "1001000000000000000"}, - {"evmos17h3uhxathxk6a7u63ye6g24pate06zrmhldvmh", "1000000000000000000"}, - {"evmos17hlmy6hmmd9pduyp9yyv0p3kwut5me07z0a5j0", "1100000000000000"}, - {"evmos17jj76ly0dj5x5yuq2ww6x5scuk3uh4ek4mzv4r", "21000000000000000"}, - {"evmos17jqq9rhwrz6ulpt0a7xrx30pjgcyg7n4e3em7a", "101000000000000000"}, - {"evmos17k055lp4xeegpdj976pgltc3t3qkqvmqqqjlts", "6170065371078000637"}, - {"evmos17k9mnkgshqwhvmcxuns756ffm3s72e8wpqlj29", "7317241963982636032"}, - {"evmos17kcwxfv67h6avusq7lg6n352gsf2hys40wfhup", "45882504083542867968"}, - {"evmos17khskjavysj2z2sw9lfhxl5ge9lx7q5xkldzpj", "83935805895651016704"}, - {"evmos17krd5n6gtt6qkypk9zw55w6xfktjlw9vrs30pk", "1100000000000000"}, - {"evmos17kwgd9eexz0yrcdu4yn7u5vgen07tvnjl54w94", "1001000000000000000"}, - {"evmos17ljtjf6rkk4pf40f628s82a7er23wkwvkxwx2g", "147013782683590326031"}, - {"evmos17lyl2uvzgs2dcqfhf0lqta7gnpl48y4a4vu0nc", "133062733043893687035"}, - {"evmos17lz2jzhfrzmk62u44p3rr6dgd2ayfuc0mmdux4", "129818309979193884672"}, - {"evmos17m87hh9t54j7kdpa0zkvw0evpewu9ere0xw337", "1100000000000000"}, - {"evmos17mfk8venv8k4klg4l8g5fpe0e9pylawlc240g2", "1011000000000000"}, - {"evmos17pnsu474d5fdep3lfv8z0ugyepejgh3mwdpp3h", "45882504083542867968"}, - {"evmos17prkktygdjudenfj6qwz3k85753x5q8dq0u8wr", "259637619958387769344"}, - {"evmos17qy4wns7qz9lcvm3qpugmqe3a0nrh9q3p9srz3", "107017419690981485568"}, - {"evmos17rg7p44w4a4yzaesrd6w6uffwzyf0zkzhum5rs", "1100000000000000"}, - {"evmos17rsjcuscevud7736yvdmj8hg9aejvfdk6pg7he", "49779250293362774528"}, - {"evmos17s7k29nzu7yydtn7p0p88dmrhxadguxunllyvw", "259637619958387769344"}, - {"evmos17s7tf0g5jr5wc8qkhr3cuj7z9xpg9zpepf787q", "4560611354038669824"}, - {"evmos17sael2kcmm8npe2pmkxj3un90xfg60vvk54re4", "1000000000000001"}, - {"evmos17spf3stnmd8xuntycft23kyf4tl2r7rk0ktuau", "1100000000000000"}, - {"evmos17t3cw3ajnwt9kpn2vtlnafsveezptazv6hu4je", "41000000000000000"}, - {"evmos17t3lek8ut9lz90f6wkzakxfvdfgsqwjr97g7re", "45882504083542867968"}, - {"evmos17tdafuzr60wzk5v7upwdhlcu84p25gsj78q2fl", "11000000000000000"}, - {"evmos17th86r8rhzkcuwu5kf8w00cgxqwvcr3jqy8pr4", "11000000000000000"}, - {"evmos17tkyt9dfqnve4e9v5f0u0xnt0sakm2py22y8my", "101000000000000000"}, - {"evmos17u4wctete429ugnfvjtejjehc20qxggpgl9rjg", "25814931854416594432"}, - {"evmos17u95l60v3kukpjmzmke4txssveng4jsl5w6aaz", "45882504083542867968"}, - {"evmos17ugp9xue3utakact6lh9y9xwp0dh8lau9rmcpl", "22941252041771433984"}, - {"evmos17uxwcxnvkdvl68538xyp34jsxd9cke8efspuqm", "111915407860868005888"}, - {"evmos17vu79vs3eyhryx59898yvckrastnfknl2durr6", "1500000000000000"}, - {"evmos17vzgvel5v6c80yexl0h60qn7e0xldud7k4p9zu", "1100000000000000"}, - {"evmos17x8lwxv4rz3pkcthr6n5jlfpaaxqvtg4fqanwa", "1763581660408326912"}, - {"evmos17xye72un0n6mwxk5yanntvncan8hdda5zv7dsz", "1100000000000000"}, - {"evmos17y39h2duqrpkyaunpm47v5d04ger9d6dqzevlq", "1100000000000000"}, - {"evmos17ypesa5630raukqnpmgdll3n0c0mzfpk3udxcy", "157796911944410873856"}, - {"evmos17yskx9x8e5cplkvduwu2sgp9yuuzwvjs6nfr7w", "22767994081714247895"}, - {"evmos17yt7mcrx2wnqfuv8xy0yyak4tdxcm90gy8a70n", "61000000000000000"}, - {"evmos17za3fvh8m0jxj5y6xrdm3gv36pgp2jjevetm7l", "11000000000000000"}, - {"evmos17zwe5rtjc0ttzth2n8uma0zhva4dld4m7lgs5p", "1763581660408326912"}, - {"evmos17zwups8rj325fxcp3vevpppkm8hp7z9fsugh8x", "11000000000000000"}, - {"evmos180rnez6exqkwlqlf64vlkpynj0h0p5lqgea55g", "223829815721736011776"}, - {"evmos182avsf84x34d68tyrwyff3t6uf4qclfx40lt77", "21000000000000000"}, - {"evmos1839x7lauu5j0tutf6es4quylvjkka2wvvtpjg5", "27978601965217001472"}, - {"evmos183hexk3shc8nsn7xer27feezfj6urg6xlgg8h6", "3012947665606583808"}, - {"evmos183hrcuzzt3az7p4je6l4vdnr2qp7q82lv2w29w", "259637619958387769344"}, - {"evmos184jlqnsgssuus062un9g9dkudh4a9xv99athce", "55958203930434002944"}, - {"evmos1857xz7yl4zy7asc7ldldh7yvg6nrw28p57a3dn", "1100000000000000"}, - {"evmos185jvck9ph79dt590ra95yj8yzd9tpckd4rxh2z", "34198115616502907053"}, - {"evmos185t9r2xaae3gds8dw533pknjg93eht8aacpjgt", "1763581660408326912"}, - {"evmos186tqkmmtvfvcdufyu5pd4zaydcn76ye89r57g4", "91766008167085735936"}, - {"evmos1872ntszstzuvhgjkpkhfmuwka5zj66ezuaujxz", "1100000000000000"}, - {"evmos187678l5rrnm86hraflwfkyyxn4xylh6h3eqdlw", "1001000000000000000"}, - {"evmos187ak29gretje6f8cttvvqqw74r2vfnsyep67w4", "91766008167085735936"}, - {"evmos1886l2zqnmmfdhp4akczlq2xwhpkgae0329qg6t", "1001000000000000000"}, - {"evmos1892fqrjpev8c8j468es4kgsx2hrfk30futrxrh", "1100000000000000"}, - {"evmos189lm6838x5shtnzmdwh3wx3sjyfx3q3unu3njz", "3101000000000000000"}, - {"evmos189n8jcs42t56rzs7cur9wtz9pfz3sxacj4ck6d", "143807610961802395648"}, - {"evmos189snqxttatmyj0tqjcsjw94auj04gj8sjrqyvg", "44229366956307209161"}, - {"evmos189y63dezek5ufpc0qqtqjkur7ur69nssrhnls9", "49408667404359521792"}, - {"evmos18ad7h5gql4lav969m4f026zerc4vuxrd6vq45p", "91766008167085735936"}, - {"evmos18aguze7ekrcqujsr02jzd5qpzkzf4zdxr8tdmd", "1100000000000000"}, - {"evmos18ajcmh3a3c6d2gam494f3e0gudpeuyfqend5m5", "901000000000000000"}, - {"evmos18ay4fzaeukryvhmh9gjdkgnja8p2lr0mn4764x", "1100000000000000"}, - {"evmos18c5whmzq6r3adnaehehxqkuveltnperyuxre6w", "1100000000000000"}, - {"evmos18cpfc7423z4qlz8peq8dgasu9z4hz0yhh0heer", "55957203930434002944"}, - {"evmos18dq4fvp2eu6e3x89k0gne3pzzljlvh8ehvztnh", "41968902947825508352"}, - {"evmos18dzmj47sw23a7c2cdgeq7pkl6g2zhhyhnvd7jf", "101000000000000000"}, - {"evmos18e23qagv9zc4vcy6m3m4yklh0enmwpy90yjhf2", "61000000000000000"}, - {"evmos18ehzzfw6epwdxayjrw6mx2z0z5x9axwf4el2hj", "73861106048759869440"}, - {"evmos18evpv96kymuwzntcs7ptz7mnduc225qg2d2hrq", "129818309979193884672"}, - {"evmos18fd9nn5dce6z3qlt86k62wqzek8tzlhtywga7v", "200000000000000000"}, - {"evmos18ff4869gdahdygf6dc9pge89rk0yva8y5ffym6", "6816441434207033344"}, - {"evmos18ftmp6z34gzgnaullgsezgsnj4maehwc6mrdny", "45882504083542867968"}, - {"evmos18g7rgkmsf9clhy77kuf7ayaxvq640m3ddlqkpg", "147723212097519738880"}, - {"evmos18gcpqqg8thgvhs5tcnsfh853z25lf6dlvvcjjt", "93029983598427309542"}, - {"evmos18gpxxlcpmade9seyp8l6nr6kl0p36djmle7aa7", "1100000000000000"}, - {"evmos18h063mps2ffekmy4f8cje63v99w0755k0uz844", "1100000000000000"}, - {"evmos18hfdcdvx2de9mdvgwqqc5m8m3autpe9xz3xtlf", "1021000000000000000"}, - {"evmos18kjgtr604p9tz5dj62cc0d3y4w6f6jhuwvk2xr", "21000000000000000"}, - {"evmos18kmy8rec2xm63r0qqpu2ezt53vphmjjvml88tx", "1001000000000000000"}, - {"evmos18l5wcv49wncve5c32m7jydx53asgxyypgf07w2", "1100000000000000"}, - {"evmos18lgkfhqac63feymymt9e600p2jngmflgm425df", "101000000000000000"}, - {"evmos18lgqz5q4kzf6q4aq6emaet0vlz4jzt9jrjszwk", "259637619958387769344"}, - {"evmos18lk2dnde7v2grstalt4h50a2uvtprc0zp96nze", "1100000000000000"}, - {"evmos18lrv2urlxnun5lsm62pa6cfquh8zuthcgmmv8e", "1100000000000000"}, - {"evmos18m388lr2xphynmfd0rnz0yk6hea8g3cymzymen", "45882504083542867968"}, - {"evmos18mqv4lccmlcjpfe77fyc0ta7cy3tlfu7zl20nw", "1100000000000000"}, - {"evmos18mrnsk6sw7csf8y542c9u9588ca72mqazfqv7t", "2000000000000000"}, - {"evmos18nfy4ck5gnd4ptt2fvl2vrcw50a62k4xgf0dzl", "1100000000000000"}, - {"evmos18nnt80wqmhvg5kmdxh0xfan5r5cwhgvsn3kp6z", "3845128058365063680"}, - {"evmos18nyh83ufqthhzyeexhpjr8egwtknacxlrsa9kw", "73861106048759869440"}, - {"evmos18per8yyj5hk92006u2t5etu6acjml0elkfsrhu", "101839708013976870912"}, - {"evmos18qn2jkekwyn6ta9ycsj50hmzwagnzzuj4mv7a3", "1100000000000000"}, - {"evmos18rasgt2s9x6aaqd6qfser8r5d488l0pqtcjvve", "27978601965217001472"}, - {"evmos18s0xly26d06m6s6dhmaqhkr9lq5dxnjaewumfk", "55957203930434002944"}, - {"evmos18sk33c24845k5vyl5rykdw829x536fkwev5qj9", "91766008167085735936"}, - {"evmos18spv3n06vmepqy6h6085cryrhfpfxp2qea0c0g", "55957203930434002944"}, - {"evmos18sxq6hjvusw02k3y607hgzm8y04zq87m57sk7k", "23399475712877693696"}, - {"evmos18t8mz3s3hygzx20crlmlp4paw0f3h6ej6xha2k", "45882504083542867968"}, - {"evmos18tgac8rsx8s24hxnc4u34zt2hadh5w5mn8nyvj", "91766008167085735936"}, - {"evmos18tn9v097jd225xvn95wdzyt22v0fe7cw3rar3k", "1100000000000000"}, - {"evmos18u79mpqt9sqe3z0l54ttlsxusdf3qk3ludx9xu", "1100000000000000"}, - {"evmos18v9egafmumyyvn3u59e8maxycvktwxsjal9nkr", "101000000000000000"}, - {"evmos18vczs408mhjgz2ganrwpr0ywjk3hl6ylae2yx2", "315594823888821747712"}, - {"evmos18vfjgtgqda3d3l44y0pyyuj6vgnwj7qgkqgg6z", "134191799327621838848"}, - {"evmos18w52l36fy856dyx58xva2qgrfvkzvuhc45kjja", "1763581660408326912"}, - {"evmos18wwxzr0hq548tlfc76dx0r65y28sm63z7md6s6", "11000000000000000"}, - {"evmos18xjeeytrpv6myunfq9cfttcrurg0w3xs0reuge", "1100000000000000"}, - {"evmos18xtce3qw95whuyns2z7ll7asml86awksmgx8l8", "1100000000000000"}, - {"evmos18xvkzq2p3vesxw93cssa3nyrzsw9jf70d9uawt", "45882504083542867968"}, - {"evmos18y044tqxgjkhvpt5pegp4sy4398ezqjytdrqy6", "185775513909627895808"}, - {"evmos18y7sk8gz5ak0hmmh040al8vdack5u7ttrunnw5", "55958203930434002944"}, - {"evmos18ya8uhy9h42w07qwln74v9k8tntugxsl7n7n3m", "1100000000000000"}, - {"evmos18ycgv4mvm05u2rnm6x5sh59wtrekzunqs76k9w", "55957203930434002944"}, - {"evmos18yg0z28seqxge2v638sul44l7tphcdun9ylcj3", "55958203930434002944"}, - {"evmos18ygcu2tnc4w7vvj65y4qk09ku64hv5kh4xh8kc", "1100000000000000"}, - {"evmos18ysmm8t8fxch686twyrvz5tnaj30mr7vstv9m7", "1100000000000000"}, - {"evmos18yz6n4qn973w49uv7ayvdsgkcvk62z30k66q8e", "1100000000000000"}, - {"evmos18zwmwcaaxr3jsykjqe59f8xzklzyrrkfpqqlvg", "1100000000000000"}, - {"evmos192tuh4lmda39g8acfa6y2x8lmvtudvr0qywv9p", "45882504083542867968"}, - {"evmos192u9vcwkkjv7672efrxdtc5v66qppmm0r2xx6x", "201000000000000000"}, - {"evmos1939v3y0xfcd0mskc3x099gz29y55lytuam92nu", "1763581660408326912"}, - {"evmos1949upfstjym5n42m5ecw4gdpaz78el6xxhgt33", "1100000000000000"}, - {"evmos194e350uath3a7hvesrdca8y3qjzf08fyteaxaz", "2001000000000000000"}, - {"evmos195d6u80n5p9v5t2gaa3r78ers04v5pglhcqeqn", "1100000000000000"}, - {"evmos195glh7duha7qnm946jw0msqjg7j88lzyyd69zw", "31214463833448462212"}, - {"evmos195y4we63td26yfs4wu44yp7xgucsr9v7yaxfw2", "21117231847341265664"}, - {"evmos195zap52z20urcrmzka6r7l9san47xqfkyjql9k", "259637619958387769344"}, - {"evmos196ax4vc0lwpxndu9dyhvca7jhxp70rmctkh7er", "143808610961802395648"}, - {"evmos196n6sl4mfx25lqnqasu9mzepcz9nztpecgrfs3", "27978601965217001472"}, - {"evmos196qqcvcmz57jau9kpud4sp6d88cfyurdtt28cw", "51858466176024532480"}, - {"evmos19805reap06sp76tghtyg4mtqrd6yc2sw7ug8wc", "259637619958387769344"}, - {"evmos1980kdldkg8a9hv73u4dsvk0a0dhgqz0mqq9awr", "9436583284130730097"}, - {"evmos198w93w8vr82567wvtmw3d623q8hghazhwl9cwd", "1001000000000000000"}, - {"evmos1995jvwatwprsluzshwwzzf5pa7m4eq2eavkfsw", "1100000000000000"}, - {"evmos1996p6eff6gl6y88emdv8emrjdzw4lkczr9lgvn", "1001000000000000000"}, - {"evmos199dgs2tj4k3j3wj403a8ameap42stysng9funm", "1100000000000000"}, - {"evmos19a5yg68zd8r2ffee3pt7nhvp7jh2d6ylnwma9v", "1100000000000000"}, - {"evmos19a8uk27r50ve6rfd7n97z4yzq26vcxt9shmssg", "9754236154624781824"}, - {"evmos19aa3xwzny3zznxjks5a2e6g2my6nhemn5a29zd", "157796911944410873856"}, - {"evmos19ccpsjpn96dm0ru84f9ydtedykr23vn6scdly9", "1100000000000000"}, - {"evmos19cflxpmtyrw779ecmpral2mn3mvs7uvj8d5rau", "203680416027953741824"}, - {"evmos19df88d6693m59uynwypgtx5np6c8a0a2k2arm4", "30114617077784179529"}, - {"evmos19fcdxdkrthces6gua9mxq95ga9ny04lvy7q8sn", "1100000000000000"}, - {"evmos19fg3s7pzuks53kthnva7qpasndlu02p7e0rmfl", "5113283924920505344"}, - {"evmos19fgaj6g79xjmvwlh8rug62lfuyc9pukr4sau3k", "1100000000000000"}, - {"evmos19fgnejrg9sszsl43p3vxwwr5julh662wkxhrw3", "1100000000000000"}, - {"evmos19flleklmd8cdsvsta98t7g465pkftec0hhhknl", "1100000000000000"}, - {"evmos19fqg3sx60wuzaez6j8cr05xsja3y6rmgs3fx36", "2000000000000000"}, - {"evmos19fr8g8suhlcq5rllyp30vsr052m69ue654hyyz", "1100000000000000"}, - {"evmos19g868j6392szq4dhzk6uaham2eze5kwhre72sj", "27978601965217001472"}, - {"evmos19jcktedlmfmf6g490lwgquwdqhw8ypn3gwlh2g", "2783581660408326912"}, - {"evmos19jegt8cgw7ywuc2kq87gmhzd85uzm6q52wmxz0", "45882504083542867968"}, - {"evmos19jh3aqmr58cvl4fdls80h672nphqczzxjfpevg", "1100000000000000"}, - {"evmos19juhf40c6c93lynclz2zezfe0lpgc0vewap58r", "1100000000000000"}, - {"evmos19k2mwftaxxxhmz5rw2pzq9fdwn5atpg40j2dvd", "11000000000000000"}, - {"evmos19ms64tukyxymfzjfsfyxpfgm74va9txu5na6rh", "1100000000000000"}, - {"evmos19myxu4qapvr7aa67m8awa83gjhnhpj6lgj3yp0", "45882504083542867968"}, - {"evmos19p9562eecj0vnpa22y5uy9zhzymrrqw8sfaxap", "26952708929102449543"}, - {"evmos19qwyn62v6uqje4m44glwls6ysgr4wfe0u8t8dy", "1763581660408326912"}, - {"evmos19srgjqlu8f376tulem3dr07txfwrgu2sq4dh5d", "201000000000000000"}, - {"evmos19syfmx0fds78rfkvvysshylye62wejtqshmwav", "45882504083542867968"}, - {"evmos19u2wk4c8zqql4ggfqf3mu4thfmctsyjhdqn6te", "101000000000000000"}, - {"evmos19un2uptgh4j3xxyynsv0n0r8we3f6w76wjk78e", "1500000000000000"}, - {"evmos19vdn7dnm8d49e7kuxnejlfcxcw0nd5ay7selhm", "1100000000000000"}, - {"evmos19vs5dntymm6a4xqf5r0gl07hfhastfvvd5dvwd", "100000000000000000"}, - {"evmos19vt3skwhsh6w5r3a3cuht7fmlrzzj9rtsy4an6", "27978601965217001472"}, - {"evmos19wlk8gkfjckqr8d73dyp4n0f0k89q4h7yzqj56", "55958203930434002944"}, - {"evmos19y53dypgpdy0wnlfuzq46myyrgx7rrdetxjxxr", "101839708013976870912"}, - {"evmos19ys8v40ahcxxg4rmng0g7uw7rpaaxul2mf684a", "43705723392898342591"}, - {"evmos19yu5lqpwv0pvdm0sh2fhjw6fvfenm55d6c6mj5", "1800000000000000"}, - {"evmos19z6a48dy06hw8x00v0h6w55xpeqr4uy369w368", "101400000000000000"}, - {"evmos19zm8w35vky6at2et695nrgsa4nfga78px86n8h", "57720785590842329856"}, - {"evmos19znh4qr96r6d7lfk2t0husm78ftsmkjfwjr4t3", "1100000000000000"}, - {"evmos1a03ah3zvgtet2hte7v5tet7favedlk9zcngzfn", "2001000000000000000"}, - {"evmos1a0nvjcdsj9wdj82c224mm78aja3j0lx9sr48hq", "30414073151128196952"}, - {"evmos1a0pggl32xtjhmkrzgs5c3qksk67tdw6recmg9a", "4001100000000000000"}, - {"evmos1a0phdklmmyq0am57h5vgr8grqu3qqnswan9czm", "1100000000000000"}, - {"evmos1a228vnzm53vep7vedm726y0v9lefx2q0n89z72", "7746468800267621328"}, - {"evmos1a2llr9w7gyuavwgx45kgfc3k4kc2xcgeguv65g", "27978601965217001472"}, - {"evmos1a2y8ku22ghemqv95dzm0as06sd26e7jumxxm52", "91766008167085735936"}, - {"evmos1a3ldlunrsdsru69pn0gn4dzgwmudeyj2jndcp2", "91766008167085735936"}, - {"evmos1a4h36y8lxhau7ykswkhywacj50sl50jkhcrms7", "103603289674385197824"}, - {"evmos1a6uxzplfs0s3s7acl33a949x7c70ha4y3g76s6", "1100000000000000"}, - {"evmos1a6v29fygpaqm7jf00296r20w3lhq8x7nyn35pz", "1100000000000000"}, - {"evmos1a7ardjtvcseklgx6mxpdhm946spn5a4jvu8jum", "3179258952081612350"}, - {"evmos1a7zhg8kltyuftnanelmzs6ppuytngz8fa28arc", "45882504083542867968"}, - {"evmos1a8x8vd0ecyd9fcxqcsumka297mml4x35mdpkj6", "91766008167085735936"}, - {"evmos1a9gzwgqf8069v9j500paye5dm2p54tlxyf8qyr", "101000000000000555"}, - {"evmos1aaceffxxxyqqc9g0kvkj455mzxdp6jwr68y6j0", "45882504083542867968"}, - {"evmos1aaj3pqcrhaj24km62sua73lgvk72vqnje8qz4l", "1100000000000000"}, - {"evmos1ac3wu3y28g4khrcp53w6z3mw95q7yne6rrwhr2", "30445292039531725212"}, - {"evmos1acm7jn8gp6xrqxjxpmas7etxcy7xepswykhvw4", "287616221923604791296"}, - {"evmos1aeh8gqu9wr4u8ev6edlgfq03rcy6v5twaqa8qn", "195851213756519055360"}, - {"evmos1afn3hkc0y5zstvhsrk0xjp5qnwww3rpgysvvy6", "101839708013976870912"}, - {"evmos1afn5lh08zn7e080rahc0264fw94cnrkgulesyh", "1010000000000000"}, - {"evmos1aftxremzxxl6du4uz6urcsejwz3q634dvhnsqs", "201000000000000000"}, - {"evmos1afwtkmhcm78qlr3mm8ufz0xy7u035kgnqurs09", "1100000000000000"}, - {"evmos1age9zt5vsu42h9pjnjmnwu3v66ngjp8m0k9qas", "1100000000000000"}, - {"evmos1ah0xkpzcyy7mff8345ma7q26xptua56d6qe5d4", "3094408965129174528"}, - {"evmos1ah4hw237akmh40d6jh279v70fnfax96d4z0234", "55958203930434002944"}, - {"evmos1ah4pw4n7wy37zhr70r4uszxhtu8whu5kz3uuxf", "111915407860868005888"}, - {"evmos1ahkl2aslfcp84rku7ecjv9nqcm9jwmemnpqzxc", "45883504083542867968"}, - {"evmos1ajagz6cdhce27shcquz9qj4puk4wj9e0llzhql", "55957203930434002944"}, - {"evmos1akjmukx8a8jztjl2adzdeunchs4hddk7349hl2", "22129076481557877248"}, - {"evmos1akqh3cp44e2tz4h8zyy5dcms3f7fuq4an2fe2r", "21000000000000000"}, - {"evmos1akr79fjtmuf8wxjp4gg5q6p8kpc0ml2a35cpxk", "259637619958387769344"}, - {"evmos1alp7d7p80pny3dvzpp8a0fr49mmututymw38uh", "223829815721736011776"}, - {"evmos1amdr4kpguvt39pgn2jgrm2t0ywgpgtcvkplun3", "111914407860868005888"}, - {"evmos1amqz37d2eqns3k5pxuhhrywegf8cxj2903sjdf", "1100000000000000"}, - {"evmos1anjmamq7cnmg7n5vxtpngjrzrstepafzvh8j8j", "55958203930434002944"}, - {"evmos1apgvcwhn0ukck6vr77rl20zg020x4x0x337jgc", "91766008167085735936"}, - {"evmos1apk8gstkvt09l0je583l7uv4487awn6vwktmc9", "1100000000000000"}, - {"evmos1apxeakjjr0dw8vrxtja2w9kqzvsx6gz93w8k5u", "1100000000000000"}, - {"evmos1apy6zv8zw4n7w23yftuf9h3k23c0cen0qthaav", "125903708843476516864"}, - {"evmos1aq882pd8hnd79h9f2d66td8khyhcg70vpvm063", "13319315913561335900"}, - {"evmos1aq9wuscvqry0vs90l034gywhp5jrrfv85fsj0k", "51000000000000000"}, - {"evmos1aqctp4mxd959xchmf5q2tcuwzj6usgs42vszta", "1100000000000000"}, - {"evmos1aqdt7mt7w0ah9yv8yns36u2erdjrz2nu7r5n3t", "1100000000000000"}, - {"evmos1aqmnv7j3pnr8chxy82qu3guh6ta3z5zlx3fdla", "55957203930434002944"}, - {"evmos1aqurjvngjrunmvr9qrc6f30qw3v66sk46x7wlq", "203680416027953741824"}, - {"evmos1aqwwe2ux6a565n32yvdyksp04j05xtz39mf07t", "1100000000000000"}, - {"evmos1ar9xh7n6075c82mrzxp4dducvf5c87g56a8phl", "91766008167085735936"}, - {"evmos1ary3r2nrsl8ud9nkdxsrj0j3xw0fs9quzea0le", "1100000000000000"}, - {"evmos1asd5q6jv3h3f6x6c7q27r62vgyvsrec3a45c3u", "83935805895651016704"}, - {"evmos1askmrcd3quyddq53ahwfey5f74qnfdmnkqatz5", "185775513909627895808"}, - {"evmos1atzjzt28q5rzendq96d00wf0nfadxygyga2rjl", "61000000000000000"}, - {"evmos1autx3av66ga0d8sj5294r37cjgtuh6rx3wednj", "1100000000000000"}, - {"evmos1av54njf3u8lj3hrhqcd4070tdzzff3g7x3euxm", "4391280840727037440"}, - {"evmos1avxnqjt8402kayw270w3vh4qmlwyquram9mkcc", "73861106048759869440"}, - {"evmos1ax2zwq38cpxtamzx824dh8neny7mcc7k8kzaa0", "1100000000000000"}, - {"evmos1axsdlg6fh4a0r07k3h9k7wwf8jl72swqdeffc3", "111605869072444578560"}, - {"evmos1axwr207fgwauaclt5rdkqmftuw4tu79fwwc8ca", "91766008167085735936"}, - {"evmos1aywenhfm3l5t370z7veu7u2067tcvykmzkd55v", "53450649561176859386"}, - {"evmos1aznqfh7tnmjkqzspg4xxapj2yqc8y3prdy9lkv", "76387801969597474426"}, - {"evmos1azt5ntgmcp78lwk36qwupygdpslmgec4ssl4m0", "1100000000000000"}, - {"evmos1azzwnamzpwnplyhhwa0dvntpmeyc94ds4cyv5u", "2000000000000000"}, - {"evmos1c0z092mzxyje97jwk9z7hhw7tsufgkunztpgjz", "1763581660408326912"}, - {"evmos1c2fq94f63ntxvsr07raqgrdtszcuuls2am8n4s", "1763581660408326912"}, - {"evmos1c30mun95ke5rqu6s0v3huyn20r3uvzu4nr8qk8", "55957203930434002944"}, - {"evmos1c3f5hdcm5amgajse0tw26k9hg6skqu99sm5v4v", "147723212097519738880"}, - {"evmos1c3v0lxt2yx6c9uv2ldxv46k8znugtt2kwf0yr2", "1100000000000000"}, - {"evmos1c422ce6rlw5evfsvhxfmncchfplrcj2kzwmsx4", "1100000000000000"}, - {"evmos1c43vn482njg5n9367phf3s62qa5ysy8c5wfhqm", "213754115874844901376"}, - {"evmos1c4e3ds6yg9afp2kxlvvm07crjusvy7ngrk2a3e", "1100000000000000"}, - {"evmos1c4jtj2y4l0wy6s9e8hlh24f3vtnsttnpf0t7p6", "6560955817470734336"}, - {"evmos1c4tuv34u2708g9d0dnjntx66gu2kshau8hqex3", "24622813669001657364"}, - {"evmos1c5de6l9wze6x7tha0xeejnh5l4qukl9fvyygde", "2001000000000000000"}, - {"evmos1c5n599c64g7h6l5has3z495axpj5nqa0yjt3ak", "1100000000000000"}, - {"evmos1c5tdya5ecyyukg23jhk40ryq9k3chuqk9x6mfc", "87850407031368376320"}, - {"evmos1c98p0cnv9vdq55wq8nnl0s3r0tduj863wa20zs", "259637619958387769344"}, - {"evmos1c9efs9mt3cjkexs7sjxff46yqurmzs69ttcn9u", "1100000000000000"}, - {"evmos1c9ye54e3pzwm3e0zpdlel6pnavrj9qqvydzsec", "287616221923604791296"}, - {"evmos1cat7n4agsslkvs4rjg434x5q62k46fdpsyq8vv", "64746660000550750267"}, - {"evmos1cck3msl9cnwwus5hmqa3yctrkd5hk8nnns639s", "1100000000000000"}, - {"evmos1cck6dvqernsrk6tpzfnk6y6j4qad0lkazsmhqz", "1100000000000000"}, - {"evmos1cda2q8rsukmxhqyjnxa2g4ptcf7ley4l37x2qt", "1100000000000000"}, - {"evmos1cdf859wsv5kh98pfy2hu7akzn4ll2ne8slvxed", "45882504083542867968"}, - {"evmos1cdx9yspnals299u35k9d8x9a0tg8jhk4pzq8k0", "1001000000000000000"}, - {"evmos1cecq8sxwdjywwdvc55umtz0tp2vy5xf28ne9x2", "4131408605363436032"}, - {"evmos1cejdta0sz36y26c2auw4msqd86v5fflkzz9ph9", "49603499679348279808"}, - {"evmos1ceslukgm0pw0dtfuuw6zrlq0lcf76sz2uhs83h", "101000000000000000"}, - {"evmos1cezcq2vyqukv8wlvddlhhw6t20r2c560p79ud9", "1100000000000000"}, - {"evmos1cf04m6fq7mvkrs3d26q4ph2rllkkhcqg02px07", "21099083995306083941"}, - {"evmos1cf7q7a42k7whpcppv08qkvvglna40u6nqw9vdh", "1010000000000000"}, - {"evmos1cffyjvcadkq4y5jp22cfv49u8q7xwljcg7cja3", "1763581660408326912"}, - {"evmos1cfj55jusmtskm4ml2xhvfu0wu33am4ux50zrnd", "1100000000000000"}, - {"evmos1chw430t0sw0nygkw348zkee6rx3c8g8wtnj8yk", "45882504083542867968"}, - {"evmos1cjmaky9384w0629k5lcnyx7z55ucus8gaqgm53", "1100000000000000"}, - {"evmos1cjtvzwtf7cc85py38t0hhgg9f2awkv0y77sxyn", "3526163320816653824"}, - {"evmos1cjz9fhlck4gpe9japl04fs35g5samq0tfm8pxf", "91766008167085735936"}, - {"evmos1ck03vh0htyj389lyxjjqtnwf4ngxfj6qyrqh0t", "21000000000000000"}, - {"evmos1cl0y4rdgryvp9uxsqzyg6m9e5e8zleup0z2srv", "10588993430829593059"}, - {"evmos1clf3pzt5rznp5mh9cyjvz4qwfse6e69uehwwgd", "41967902947825508352"}, - {"evmos1cllm0fuqtm3xxyenskn9ty4w9svwnckruwc9qf", "27978601965217001472"}, - {"evmos1cmc23gc5g023ust2jepw4ucd4es5s567c7t7kg", "1100000000000000"}, - {"evmos1cmy9jwxe8uxu0u4h9dgml99xmt8uyvphkt22ee", "101311329105128662402"}, - {"evmos1cn8ay0jztdnc4q9rtuhygepvkd7ewtxkxjkrwk", "259637619958387769344"}, - {"evmos1cn9syn204vtps6utarq227qv4gtjm2kckmqt3n", "2201000000000000000"}, - {"evmos1cnc87vcegyqvk4nqnzn49lx3y5w6hsr9wxufj6", "1100000000000000"}, - {"evmos1cnfhg8nwl9welemrg7ge4zkpgam6zv6lf3jck6", "21215434552222734935"}, - {"evmos1cnqnhj8hmhft9jnu0yhfg6sv5f2kre23etk5xr", "11000000000000000"}, - {"evmos1cpuvcg62tp24ypm5p8wxsqtpxk5ce95f46dmwn", "9617293383238985728"}, - {"evmos1cqls7s7c3q60alu3k2jpdxqfy63qdamfde4g6j", "213754115874844901376"}, - {"evmos1cqvgdyhsjx24g540q8nt3n36mxlwsje3pe6333", "45882504083542867968"}, - {"evmos1crsc6t30jmtnzxkxj50rhcv08dw7qa74lw0ly3", "223829815721736011776"}, - {"evmos1crz8pzxmh8yl5ljxyulgwle335ntgtep8nd8yq", "203680416027953741824"}, - {"evmos1csd7p57hy53vs3gw8vgals9hx0mqhqva6u4dne", "91766008167085735936"}, - {"evmos1csyvk5qzpvn3zjs5lrzasxxtp5n2cdwgvvrzaz", "3571872881375157248"}, - {"evmos1cukvqnvmv9c3l9vdad0dxvuta7r00t540pj8sx", "2000000000000000"}, - {"evmos1cutr8pr2cs6aedp2q3m9wteas9tzp6kkj02nph", "101000000000000000"}, - {"evmos1cv2kc7ay8lclpt9k7jpqjgtnc5vvq9mclap6w6", "91766008167085735936"}, - {"evmos1cv2vxqg637kgfw6f9zpkyzpx82en09xend2u48", "1500000000000000"}, - {"evmos1cv9n6qeqtc54726jnj5vn04za4x87f4hpl03yq", "1100000000000000"}, - {"evmos1cvz9vgk6f8n408pvxwq4ynplvwk9vvehcgulgy", "1100000000000000"}, - {"evmos1cw0aacyng0mjdprx79qygeavy7uzuamhkf7jnx", "55957203930434002944"}, - {"evmos1cw2mul75wptmfld0svztdse4f4qnfn8vhhn20a", "259637619958387769344"}, - {"evmos1cw84ynvt25kpd2dqetwxewea9hcmmar8vkvlgg", "91766008167085735936"}, - {"evmos1cwdwaweadm82dvwdmatdc37r620zlauy8jclqn", "1763581660408326912"}, - {"evmos1cxj0wj0qusrwwkv9nt47pgruylsxx7qd62dkgw", "45882504083542867968"}, - {"evmos1czh9pp58sv7vaae96e9yyh0pn7v3wqtzl3889t", "1100000000000000"}, - {"evmos1czuw8zqnr50nzvdxctmskay6wjsvhz4e8pqpta", "1100000000000000"}, - {"evmos1czxwty0ep79rw5xq0hky30mchagvwz7909x7l9", "27978601965217001472"}, - {"evmos1d25c6jmgenc8m6d6ralgw5waya2dxzu7q6wd33", "1100000000000000"}, - {"evmos1d2guxl6rlfmmfp0ealcaf9ap84nl5trz0ywr5c", "101839708013976870912"}, - {"evmos1d2hdp4ukmz3ukn3lp34gy7g7pta33eezecjtny", "1100000000000000"}, - {"evmos1d3nj62ktamjk094dztznxz8y82rl6336fzw4zq", "6230726132227475456"}, - {"evmos1d3vny0mfgt5q92dw884hswpka3enmuvmksvu0s", "1763581660408326912"}, - {"evmos1d4lnt7nv2hrju5s6zdgyzq5efjsjzdzsw9thf3", "111914407860868005888"}, - {"evmos1d4y02j3qrn3xmt99nnqmndrpfxgvrntvrhh7nt", "45882504083542867968"}, - {"evmos1d4zyfzjm2y3c8m3tfygdf8hyh84gvd06nj9c5s", "1100000000000000"}, - {"evmos1d5gf2mhqzygzs4rmpxls0sltxh82nsxhmmqy87", "1100000000000000"}, - {"evmos1d5h8lqd9fxv6sttrnm0c7ys5ljk65u95qa3qpz", "1100000000000000"}, - {"evmos1d5lu67hu3lhqtw6zyv7uy4gkfpdtfnzxvwlx80", "91766008167085735936"}, - {"evmos1d5pspcjs34n8hmqvft7cumws8sn2y0c63n5h3l", "1763581660408326912"}, - {"evmos1d5tk9yfhmvwvj9hqp8e2fnqz006ncu3rgare58", "131581891639602211584"}, - {"evmos1d5zh2ayezq2jgmsyp8mgzqqelzvkvv36vtdcv9", "99759680946017139994"}, - {"evmos1d6583u4j5tufjj3lygj74z65d64z4htlzdxgef", "101000000000000000"}, - {"evmos1d6jm09jv6rm8n0zq4v4pgmteyjgsyhen0sl86e", "3526163320816653824"}, - {"evmos1d76n9fmzkzwvpf6uqy86es009al0acn3tplcuq", "111914407860868005888"}, - {"evmos1d79vfgrsh76anuems353fugaa2zc9uuw4zgx9p", "1001000000000000000"}, - {"evmos1d7f8aasrcms0u7ap99pag67fny72kk7m87wwx2", "201000000000000000"}, - {"evmos1d7ufhqfvw4ac0exuccud9p8gwdwfy2daycgamy", "2000000000000000"}, - {"evmos1d7y3nep59hgagazstm6jhq8ay6tfc37hzaepc0", "1100000000000000"}, - {"evmos1d8pwj29kze0m35grea4z9qkdgl9e54enph5755", "287616221923604791296"}, - {"evmos1d8y793dxmk6pj347jyjaad7r96t6y3d48mjk5t", "171786212927019384832"}, - {"evmos1d9ekglvr60g33lawdf5rf8p8sjmky203u2na35", "91766008167085735936"}, - {"evmos1da7vcjvn82uh05rtyc7y3gyd338lnlqlefar6k", "45882504083542867968"}, - {"evmos1daeq26jv4w2562gpcg4k7p0vwh74ld4zf3xgcm", "5001000000000000000"}, - {"evmos1dahdytjlwcyhg7ckuzdvy2twsuzrsh3jghaet7", "1100000000000000"}, - {"evmos1davu93x7yu0emrkdz5kk06p9z27dzz8004jn30", "501000000000000000"}, - {"evmos1dc7fmlj5zw5cwg8zn7pyt33svnuxsayj76ane9", "62726725532863139584"}, - {"evmos1dcfn0tz49d7md3wnsshd06m8nmqdmcfrmhx98k", "1100000000000000"}, - {"evmos1dcwq6tzkyc9w65ucmyg7xnn0szhm73me84neav", "1100000000000000"}, - {"evmos1ddeh296y94pdemtwgfxtmdxjnfh4cfmrppdsae", "21000000000000000"}, - {"evmos1desyk2ejwrnrmgfvf738gkxvzl4k6qhkka36nt", "101839708013976870912"}, - {"evmos1dfdv8pgwlm8fm47cu3ajy5tu4ss3slpdf0jajp", "1100000000000000"}, - {"evmos1dfqphtnef9rt4wngeart2jjaedmzujuuygr0ep", "28196763081751448178"}, - {"evmos1dguacmf4wt4q28j7hjy6twgauuz9ej5etqdlgd", "167872611791302033408"}, - {"evmos1dh8dm3gshy3e56nq2xw94az30qwhjh0ne4e8h7", "3000000000000000"}, - {"evmos1djdvh237t5telq3u5mj8m2p3erkh454fx50mhu", "91766008167085735936"}, - {"evmos1djf0hnzn7nedmchl7y7f4v9nv48avz5l9anfnl", "55957203930434002944"}, - {"evmos1djre7563wa4wawfzc74jay3ymq63l0npuqh2ak", "1100000000000000"}, - {"evmos1djx0d9qq6a5errf68n9jwrxjsf2mzjxamkz6e3", "1100000000000000"}, - {"evmos1dk6ec357vmwtnlln4dh3fetz4u0pcgtzj77xmc", "10879705515143342862"}, - {"evmos1dlde3vktxpng5r3hsndd5y64d79v48vkk6k94w", "1100000000000000"}, - {"evmos1dm2adanfz6eexv6as450vncq9xe69kg38t33rj", "1001000000000000000"}, - {"evmos1dm4504s5ugsk65kr24ffan296r9qe7eafazqpq", "73861106048759869440"}, - {"evmos1dmeh325sqfgxx3n97ae5un6hsye6xy8w4wny2z", "27978601965217001472"}, - {"evmos1dmla6p4kuu7p70dt3tv2w4j4hn9w9s6zs2z6xy", "27978601965217001472"}, - {"evmos1dmqmshpj4xpqqfx2qky82y85m2ufydefm6hv9h", "1100000000000000"}, - {"evmos1dmzyjjqrxj9ssj53ljpkvrkg7l7jnce638tmfv", "45882504083542867968"}, - {"evmos1dng5f52etldpje3386zysqrk7w7yyakqmr5mll", "208716765951399321600"}, - {"evmos1dns44ss760nywy9gx4a3lz8c7q66f8g6g2qash", "889000000000000000"}, - {"evmos1dp0su6nsa4alludlxa8pcmzyvp6fvrj7dnf5h0", "6413935780794112"}, - {"evmos1dpc5pfr3v5qnrhesrzmq673eccq4m3esw4vpkv", "1100000000000000"}, - {"evmos1dph4cdz8qjp73psfk9mg27cl58qge3l76q77w9", "91766008167085735936"}, - {"evmos1dpp44nukahe54n6j4vr7wfvc64qplzxdk3q3ap", "111915407860868005888"}, - {"evmos1dre0pz09me06ddyuq0lgdtjk4c8anz620k37nx", "55957203930434002944"}, - {"evmos1drk2h0mcs3urzmf23vwh9ukypaca70nfz0z78n", "129818309979193884672"}, - {"evmos1dt3x5gj5k9met330y6y8xpv3tx0gmdjxhvdqyf", "45882504083542867968"}, - {"evmos1dtxgwxp8em3av6n9w2cxtfc8af859elsrmmqrf", "17412898423054325223"}, - {"evmos1du6juxdf6cw4lyguw4n8whe52w7lxvzrfc6jnx", "1763581660408326912"}, - {"evmos1dvfxacfvhjp9nplzzf5kxhv4lgqurpr9lyftqk", "45882504083542867968"}, - {"evmos1dw3d4xxhuw2r0vhhgt6v743aua62mpayecaume", "1100000000000000"}, - {"evmos1dxp3pgm868emr6yvrw4pdu49g330x8rssklda6", "1100000000000000"}, - {"evmos1dxrcdrl6advnv6ta0eue7vwm7mxlnh9undehd9", "10001000000000000000"}, - {"evmos1dxrrehv2ykawnftjw8m69xnkwex6slc6sdkxzg", "1100000000000000"}, - {"evmos1dxx2plxg3rg3fdrfhttfall8fnhvejezzrhc9n", "1100000000000000"}, - {"evmos1dyajq233uk5hwrzvpmf5wrkdwv06qrlehdkar3", "1001000000000000000"}, - {"evmos1dyatkrjpdmd6w2e0hj84amqply5svjkn8jprh0", "91766008167085735936"}, - {"evmos1dz8dtaru88ad6s9qqhke8h8rk9wj0ry7mg06yy", "1763581660408326912"}, - {"evmos1dzl2d6wjxvq43nptdwyz03rxtuvsugmk3zs8aa", "1100000000000000"}, - {"evmos1dzt8msn8qfp48p24xtgc8e9agd2njftpzyfy65", "45882504083542867968"}, - {"evmos1e0fafwjn3qp4s8g5zd6k8nz84tj9w6x8fl860n", "343573425854038769664"}, - {"evmos1e2d3w4mj9tyj8ctdk435dags0gxsj2ul7ah64j", "55957203930434002944"}, - {"evmos1e2dd5kv7k5nf7ml54c9zqjt970wt5uqed30acs", "91766008167085735936"}, - {"evmos1e2fkvuq9r8zqazrkw077kmxf56vhartrd80t20", "27978601965217001472"}, - {"evmos1e2jmsvx9nxgqru65l7dd6j3yrth02edwvfd4t2", "3329195814768189440"}, - {"evmos1e35z5yugvtnma2pyrstw4026hycygx297zukl7", "1763581660408326912"}, - {"evmos1e3d7e5rfghlq365jq7pwktez8ta5chvrm26kw3", "1763130160000000000"}, - {"evmos1e3uwdrfz2f2ttxxkgjg9rjjs9dnyej0xc3rtng", "6628712115607957248"}, - {"evmos1e4js4jnvpys7wllzevf4vg5a35r3j36mgzhsk6", "1100000000000000"}, - {"evmos1e5ee3cymgwr7kjy6j4kafc9cxh20u0vg8udrnu", "48530636442531274451"}, - {"evmos1e5kkanhzel8g0palwm7wpwgf7vfkw2tnpdrnej", "27978601965217001472"}, - {"evmos1e5rwg6ymzy2hadatt3r04s2fleghhqw2mveesx", "1001000000000000000"}, - {"evmos1e5syluu92x5a2vnwydn9plw4wy4arad8yggq2z", "1100000000000000"}, - {"evmos1e64ccufm6643mnty58zuvw72r6qdus4494vqud", "203680416027953741824"}, - {"evmos1e66zjxstt936j55lsrqy4kdlukenh2zu2ld5lf", "1100000000000000"}, - {"evmos1e7fvr30esegzfnhvufz76lc0t44lgwgdnmxyw7", "1100000000000000"}, - {"evmos1e9w3r4f4zkzvxs7cehw8ytkfnf347eu3ny8kf7", "61000000000000000"}, - {"evmos1ea3zj5a3jh9gsc99xcvlsh5khq3f9gw7vmemn2", "83935805895651016704"}, - {"evmos1ea6tnw388svrqyguggrmdvu2hr7vkwm6ds7mlj", "1100000000000000"}, - {"evmos1eahhx3u8mk9mjadtc9thc66y9pyw00vxjrp9x3", "6001000000000000000"}, - {"evmos1eatmxdnatrnwmk0khea47f7t85vqln5z348gtc", "45882504083542867968"}, - {"evmos1ec3frg085kc8fmhnj0767us5l6fpj3ajqeqk2r", "91766008167085735936"}, - {"evmos1ec4z9d949lqcus6resr4a87cumzrs2r0ask6kg", "1001000000000000000"}, - {"evmos1ec62ng08whxerzjeh2trlxyxpwa45v6fzchadp", "501000000000000000"}, - {"evmos1ecfz04k6h6274hta7yndey8djy40uf4vxjzxqe", "1001000000000000000"}, - {"evmos1ecsmqe4w8vnhfsugy22mcqkkqq9w2y397pa5sk", "15938717687140022369"}, - {"evmos1ecvt43h36sd0evmg537m4c224wfxwavyltd36y", "91766008167085735936"}, - {"evmos1edc5cpqvy2sv6hsh5e0l2vs0qdvfq6phznactf", "1763581660408326912"}, - {"evmos1ede9u4mjjwunvst7747jfmgy2tnxs8sa2t6xxt", "10114018113451712512"}, - {"evmos1ednvnrmr0q6u20tcc6su08gzlrq4q2y3yntwr2", "83974011504949244968"}, - {"evmos1eejlqf4km2u79ylk9j3fxpvsvdg79fekwrhuj9", "152759562020965310464"}, - {"evmos1efwtxyqq4nutuak606nfv985kxw9n8yxphtz3v", "194727464968790810624"}, - {"evmos1eg4wf6xk3xn8pt6cdyan9mdzakq6pw8r6r3n4q", "1100000000000000"}, - {"evmos1egfutxtv9w4ljrt8wsd0f50tz0k2tcnghf9j9n", "101000000000000000"}, - {"evmos1egxzt4xk9ehsa8rjj92rzk8n3j2xg07x8zq59d", "27978601965217001472"}, - {"evmos1eh2xzjlwrrhwtt9wz3c474gth5vdkggh6v5jqd", "27363808183917759369"}, - {"evmos1eh9wt6cu9m3ms7lr4ktyje278g6trpv37pld7h", "45882504083542867968"}, - {"evmos1ehhe5366v44yvsrzkzzz0artrwyqup7pu3txds", "45882504083542867968"}, - {"evmos1ehuszujxqxe2uz3h2qt25kagn9693akd8zjy82", "1001000000000000000"}, - {"evmos1ejk4mmx82p37vay9e8w6uhv0xee6qnvagd30nv", "21764858550555760584"}, - {"evmos1ejn7mzqmvt6yyxthnqfg4dp4ppxccv2s9vrd3n", "22696280108108280764"}, - {"evmos1ek97ynlpseqxdsvs20syskrrjlu3n8wpwhvs0h", "1100000000000000"}, - {"evmos1ekr5uj9zv3fcdr2huzdm3gwxae0lm36e4885e6", "45882504083542867968"}, - {"evmos1el3mhfkqp0chtvardgnwc9j4gcd43j7e4z8e3q", "1763581660408326912"}, - {"evmos1emxmxep0pcq4t7gxmh2swfme5dvr23t7sdlf7w", "1100000000000000"}, - {"evmos1enheajxfa05frzg0xfn80wng4627twxaldj853", "1100000000000000"}, - {"evmos1ep7uv2r57sjl4q0jcvy0zrwjc400mqtmd2alhw", "73861106048759869440"}, - {"evmos1epmctyf6y80txparvn8y92pglq02v8yzd56fln", "55958203930434002944"}, - {"evmos1ermwlfd7thmwd6xn4wfpc2ecazljhhg578kxq5", "12479429744389116743"}, - {"evmos1eslvdw8ty9pwt0eyptq09ces6mhqrl7l5jmezd", "259637619958387769344"}, - {"evmos1esxjd3vwlenh0rrlwsnpaldsy4exwhq9eeem3h", "1100000000000000"}, - {"evmos1etgmnnxuj93hd75356guyn5pj9rpg7w0nvzh8a", "7080758755063168"}, - {"evmos1eth2cyspyx3nchprycv6yctwxphr98xhdnj6eu", "61000000000000000"}, - {"evmos1etwd2wf3x4frhguytd6dy238ekvwfz4xqqjvka", "132891899893550930"}, - {"evmos1eu34n85q3f4h9387645u4kr2swryvuu8ftvkkf", "1100000000000000"}, - {"evmos1eu72glvlh3zqz67kx52tfccs7gygy5ccgrwzyg", "1001000000000000000"}, - {"evmos1eukc32uhcthpwqg8yp5cahgl7jkdrta9ytpytk", "1100000000000000"}, - {"evmos1eurvrvqp4xt345vftnrl7a5rswm2q502m5sdfz", "1100000000000000"}, - {"evmos1ewcu3y94s4jfeec2uesa8afcak9n9luypvjlzf", "199764814892236374016"}, - {"evmos1ewmnvk4ld4tjexuuscnqnnmklkhe3elpuc0xlu", "75624687709168196352"}, - {"evmos1eyktqy0n2jqzygg06c8cas2k4dzk89hszq0ygr", "201000000000000000"}, - {"evmos1eynmaf9x22q6cxgek47m6l9dxkfz4mcjldym9t", "1100000000000000"}, - {"evmos1eynp5d69ekk3t6dgtnwtfkd348kj0d72th0eef", "45882504083542867968"}, - {"evmos1eyqwqnpu538kdqnk734mzm7u2fy4929ntqwlxq", "1100000000000000"}, - {"evmos1f0qjyeerngw76598gr4y8aqqyyw8uw8m0j9qmn", "1100000000000000"}, - {"evmos1f2ck5qx55ptp0xtynejddqmx43x6jrf7m3y3qp", "91766008167085735936"}, - {"evmos1f2dkqvvkg0ctm9y30zptrqun9qnr0yy76kyajk", "1100000000000000"}, - {"evmos1f3elzsz29g5sht0563z3d3d8y5us04l9ft6axm", "1100000000000000"}, - {"evmos1f3p57fj82pxrehdulpzeu452xz039a97vdsc5u", "1100000000000000"}, - {"evmos1f3usn4hs9xe627vpg0yy8a8cu56p5drnplehz9", "101000000000000000"}, - {"evmos1f3uyy2jn2w2jvs403lh24q3xfny0egdqln5nv4", "1100000000000000"}, - {"evmos1f3v9ca4ls5qnsur6guq5ltrpekky2qel9qjl5d", "146692655847032192"}, - {"evmos1f474dsncq0q3sj2dg3h67zf2xxp64fc2pfunay", "101839708013976870912"}, - {"evmos1f5jlr9zzr9cpmfw72ul52ff5a038eptw5jzhyh", "203680416027953741824"}, - {"evmos1f669utvsdhx5z9ahgjunwyj8sfcc7pv2h5n6a8", "2000000000000000"}, - {"evmos1f6dwyqafjf85u95e0tcvvxp64nseug2rs5yuvt", "45882504083542867968"}, - {"evmos1f74ng42fcmqcfw9cv7335y3vr0aj6zz6rnects", "501000000000000000"}, - {"evmos1f7j8xeyy4pcemxku3dc5fszj5h38nmhmccv7ru", "1100000000000000"}, - {"evmos1f8hw98wcp3mtslstkjtaesua9xjvhu9av4q58s", "45883504083542867968"}, - {"evmos1f95a88dm6y6l9tr6hjec8t6m49dkdqdflh2cms", "11000000000000000"}, - {"evmos1f9jpk8n4khwwupq9yjvvguzcxvx6fwmyszqznx", "91766008167085735936"}, - {"evmos1f9ywyxpm5snkvr8vs0u69yy04yuc8l25gq4rfv", "55004012566330607104"}, - {"evmos1fa4p0w7pcc62pqqkldptl4y7qcucduyrq9q44n", "1100000000000000"}, - {"evmos1fanw8texyrahww2a2vjk7xguvfsuxaqcj0mvq7", "54954164386713868881"}, - {"evmos1fc8qy76m0avq6usfmhx7ys6qxkx0654q2hp82w", "132922824920152658953"}, - {"evmos1fd5cg849ha0nqmuarlrpcmpvg0en28nywvth0s", "259637619958387769344"}, - {"evmos1fdmw0uz6y0p8p5y60zxsedj9hra2w9p8v4dmm3", "1100000000000000"}, - {"evmos1fe0dcr2r85ku09st55nmkrl8f52r8sy5l4s6ua", "45882504083542867968"}, - {"evmos1fe0m87gzx57wl9jd2jjpykfzun75vkdf7765n8", "144732908976304211682"}, - {"evmos1fedgx9qd9f57usslnvqtjt0eacna0hl6dju528", "1001000000000000000"}, - {"evmos1fee8g3rra2tvt0av9w5vwj9unfup0uqhngcj47", "45882504083542867968"}, - {"evmos1ferv66gmpg2el0j795y289g6xf8zldxqsny0kv", "2000000000000000"}, - {"evmos1fg8v8a7h8df86xz65ep8mhnle7zlgdzwk8d3hn", "55958203930434002944"}, - {"evmos1fgj7ugjk8pnqznmytzt044v8n5fmzltyg8wuf2", "1100000000000000"}, - {"evmos1fhq3d0wj6mnrlu4qs2ha4jskd2s7k8pgthpr9m", "1100000000000000"}, - {"evmos1fhxtm3chqhygrswx9czvc53vncuuhwutjv6wma", "50957112630320319262"}, - {"evmos1fjqx6fsgg6s2n7hdkszum6ceprumcv4x5tydwz", "21000000000000000"}, - {"evmos1fkdg0nuqmvcwyyh2xt20d7gyysamznl5x4ptpt", "101000000000000000"}, - {"evmos1fkhdyj89vkynj9ecwf28qw3rsvjge0cvldkha6", "91766008167085735936"}, - {"evmos1fknurwqhq5vcqxhg0xudq5825qdsgty8mwv9k8", "1100000000000000"}, - {"evmos1fkqx06p755fz9n4qtln6k48spzgf7qkh54wela", "55958203930434002944"}, - {"evmos1flshwpsdupyzh7nru4z9j7q326d364y8jnerdl", "101000000000000000"}, - {"evmos1fm69agzja643vvwu5zwj39r0arshvva46caanq", "1001000000000000000"}, - {"evmos1fmj98l93nqxjjwanw4m2qkt8vky5xt3md93kpg", "203680416027953741824"}, - {"evmos1fmx55x3jf6lf90urtg40r8l0t4j3j0lf3n7rw6", "1100000000000000"}, - {"evmos1fpyg7xyr6zyl4z75kn0dkcn542wh63f4aedpyc", "1666391603957617281"}, - {"evmos1fq70255rlvprru7rks58kex9gul882ghh6292w", "199764814892236374016"}, - {"evmos1fqjhx76ntpvtq0k4p050msl3pe9666fm2jdnv5", "11000000000000000"}, - {"evmos1fr72j5yh96qruwj0a3rrf9upsq66hrq5s4d9ul", "129818309979193884672"}, - {"evmos1frdgcv64nf8xfsfv702mluvg5wutz2vwqgdyvy", "91766008167085735936"}, - {"evmos1frghrq833l470tyrplfld9rpwkmy34e9t3p9v5", "400000000000000000"}, - {"evmos1frl9cz27c350l57ztct2ncyd0g4wr7j6trm8pl", "83935805895651016704"}, - {"evmos1frucx54dmh7srxq8xznzquhwm0628lwnc87sr4", "1100000000000000"}, - {"evmos1fryuhqckqzhztzuzwraxda526zfvmy90v6wucl", "157796911944410873856"}, - {"evmos1fsjge83za7x4d09ydgywv2hvv48pml6nnr93yl", "21457517541243664691"}, - {"evmos1fsv3rgdpzf24jm73yayxcduk6aqkeunaysll94", "18256332036092769181"}, - {"evmos1ftdph8vlu29tm9v97kx0amfpdx3eu8rtkpj7ag", "21000000000000000"}, - {"evmos1fvqjmcq6yd2prtf52rg3jghjpvaj7mjyxu3f77", "9006118722421765990"}, - {"evmos1fvskrcfa828r7jsnl87tuvw6p3apnxvtzrmwex", "21000000000000000"}, - {"evmos1fw0udez6w6f2evq4zr99a74wsa3en4pj8lu4pa", "27978601965217001472"}, - {"evmos1fw4qfhv4psrq87hkx0y503ypz02dyfllgu9w4w", "77088375051035120895"}, - {"evmos1fww7k2gyjcj9wy9mv5v9e9lelp63e774mhthjx", "1100000000000000"}, - {"evmos1fwxcuu6vglvaxk0k2f85tpkwyyj25getx8qjc8", "45882504083542867968"}, - {"evmos1fwxz476eupm2t2q4ft2thxn8d09hk2aasducpn", "1100000000000000"}, - {"evmos1fxs4zpsw0w5ygm45kxjpqr8ztz7gyp28w6pr0w", "1100000000000000"}, - {"evmos1g06p6t8m8raa6f6ucpgdnjpchd0f23f39zywyu", "1100000000000000"}, - {"evmos1g0m3yjtfscq8exn5yae9az47zdv3gqrec3xhwy", "1100000000000000"}, - {"evmos1g3zq4fn44ccedcnpfsdf4jyhuhxklp298uywfw", "9301000000000000000"}, - {"evmos1g3zyfm7pnhd30cfsng33lkytjmg8d50xjkag5x", "45882504083542867968"}, - {"evmos1g5n2mm0347tuy37sp3fauyyu9lty9c2c5222je", "27978601965217001472"}, - {"evmos1g640vp22jpwt8u2xn4apvt6jyjxmun5e0d73lv", "8564269668139681779"}, - {"evmos1g698v02m82mve83zft579z279pvrc63658u64h", "101000000000000000"}, - {"evmos1g69nt902ch9hj8nkcn92d40v9vqw7w7227tzrv", "1100000000000000"}, - {"evmos1g6fvslrzcu0ung443uumn8gnqnmlqvak8c8gt8", "1100000000000000"}, - {"evmos1g7cntflh35mhsanmwwv09h23xmmj80fy0z5r7y", "103603289674385197824"}, - {"evmos1g7fscwmuu3lmmtem2euklx5wp8wycwjl2pysme", "1100000000000000"}, - {"evmos1g80ktqr7lw2d655vwjyzhaw7xrc62jy53fkdak", "51828015835933467648"}, - {"evmos1g8cv9r7uc838ck5yxdkez852838xpx6mcxdwy5", "9607458353741672192"}, - {"evmos1gal5p2wah5t49vyr2rfx6qkw084raalhw09xzw", "91766008167085735936"}, - {"evmos1gax5zmf4t7ehs8zxyn0t4m789wy94sdyzn2ewr", "1100000000000000"}, - {"evmos1ge4fd2am5222vjyuu338r3gxa0gt2cm9kwmceh", "1654524958753540407648"}, - {"evmos1gf59vrsl6d05qp40f8dlhrdjakepssj0rg35xs", "36301377662204171264"}, - {"evmos1gfe25v3rtdq8vr5w9kknytcrm3sqlrrs0daza7", "111915407860868005888"}, - {"evmos1ghnjd4my8jkcjaaumaxg0a2s0p3mxlwfe5y4fr", "6625882622550768384"}, - {"evmos1gjsxqd24fjf8jamaa2r5cas07a585h9lsja2l0", "101839708013976870912"}, - {"evmos1gk4d8s0mle5tyxx6s9dv5s3e37f8ftl2w64hgj", "1100000000000000"}, - {"evmos1gkec7tl7kn7z03pj4zrjf7sm6kn24gfq092n4k", "1763581660408326912"}, - {"evmos1gksq2qp6ukvm3edxkl2z7da8wn02yz8ynf8uh4", "9434414240649523662"}, - {"evmos1gkyjm7768wwwq5f5zgtg49r7e290yxsmmckwk8", "61000000000000000"}, - {"evmos1glujeppxkm2lf9nttfmnnqjkswfvsy3ydcvnxs", "61000000000000000"}, - {"evmos1glusft48zr3xexms7g5hew0d8xq6nyk4tt9k7c", "55958203930434002944"}, - {"evmos1gm28mpvxnhghpc6at8p0ulrtjxj2jf7jde858j", "1100000000000000"}, - {"evmos1gm448lmxz3zmkql2auutucdzr78w3zmkvucl4q", "61000000000000000"}, - {"evmos1gmlvxe2tsge2mkcjftmgcru57qa0xm5kztzp08", "26041402042782703146"}, - {"evmos1gmtjrg0e5dp8qsvuq8k2zlnzlxdv2tz4ce6kep", "45882504083542867968"}, - {"evmos1gnjwsk0xg6hsvshpe7365cvtx5vl7zr0l5vmag", "5233691300658282496"}, - {"evmos1gnmsc6de5jqnnf6mses0ap9afqqr7lzlzp9rse", "1001000000000000000"}, - {"evmos1gnsmsjz03ndze79jtukt797tdnzd0np66u3yzh", "1001000000000000000"}, - {"evmos1gqf77ngeqqlycxmgh4vecckax8x0xae0ktwq2l", "1001000000000000000"}, - {"evmos1gqqrlfytwlwaan2pm6y68pudag46gf2he579a3", "159560493604819200768"}, - {"evmos1grpl9hpdh6thkdl0w57n9h6xy3493rnhf3skue", "2001000000000000000"}, - {"evmos1gsxv9xglp88u6qxuufxztwvwvhuc30gz36kp79", "4017157304245694976"}, - {"evmos1gta0rsl3wcdk40qly4s55672e4t3q64xfe3mug", "1100000000000000"}, - {"evmos1gtaj0gq2cndaqxevm6yxzfhwypkelzd839ckj2", "73861106048759869440"}, - {"evmos1gtw0mzymcrfwhk7q797gjny8859pu72fptlhed", "87045936370136676864"}, - {"evmos1gtyr6vy5cwvj0vhj7flwt65lgu78atv3rqayjp", "101839708013976870912"}, - {"evmos1gu74twt77lllk0kks2k449hp24lpa3q8stf6v7", "1100000000000000"}, - {"evmos1gu8n0ch86f0gsae9tt8maf53arkcqekp3mddg7", "55957203930434002944"}, - {"evmos1gucn459gf659rdfty93e3cjqpmnhvvyzrsqqyl", "21000000000000000"}, - {"evmos1guw96zapv5ghg9mmhmlpe2hqj9dldnxlkyq08w", "27978601965217001472"}, - {"evmos1gv040hxecsghy5fu3wn5gqvh9xx0m27pgvyjh9", "12489171086805001216"}, - {"evmos1gv5tf9fmp7wjswwmcceq97lpc9v5nu0lj73wal", "101839708013976870912"}, - {"evmos1gwg98pufmtl6z2fzyktwywqt9rh7rpueqqgpmx", "11000000000000000"}, - {"evmos1gx56ehgykqp85rjrct95l8ypd6a9ngkm73nv95", "21000000000000000"}, - {"evmos1gxdfhy5ywgkar6f056dav9q9sh0yrugkuldcz0", "1763581660408326912"}, - {"evmos1gxeqkn5x7daefunrz7zh5d682zz7da59ztl49f", "118812478284900623795"}, - {"evmos1gyfzlapsesph8mcjhwzvv3jc309g087hnrzydv", "1100000000000000"}, - {"evmos1gyj4wsf89ks2k3dvaya54rfrk955mxwztwyxuh", "116036416191827050407"}, - {"evmos1gzxy4upldpej86q5tzv9hnwfp92vfeeve0hh3s", "1100000000000000"}, - {"evmos1h074c6sajj067lqyyy34qlqfne75ha3udfg6p5", "1100000000000000"}, - {"evmos1h096a8mxdz4ud0g4csxcznp9rkp9u7jdsa6u72", "1100000000000000"}, - {"evmos1h0elkct5srs454sattmun54jxpdlfpmhlyr7p3", "2000000000000000"}, - {"evmos1h2tqq4w0ktx3h6v06zmc9umjad55derhugvxck", "1100000000000000"}, - {"evmos1h4gm0yg39rynmf9c50vlv9k5jrnuwsqr5vg96p", "1100000000000000"}, - {"evmos1h4p904gsygddth2ajnqj06ctc7chfwt9l70gy9", "1763581660408326912"}, - {"evmos1h4zr62u9udcnvarshgaf47f76vnmk83smg7enz", "4260532757256250880"}, - {"evmos1h54e28hqdnutpsg36m7ar4esxf5je90n96tc4m", "1395206742162964010"}, - {"evmos1h6v0k3ldzayg2cnxa2ne08rfryn68zkq2323l7", "1100000000000000"}, - {"evmos1h70x2a26gmaupay56j4evh3m3sgk8c2tzdcjsk", "1100000000000000"}, - {"evmos1h778pvs3jq6zpyequclepz4jh4fjyhneegyaw9", "50452623051477792768"}, - {"evmos1h85hfw8yr8wl62unm8edlh6jegfvl30p47mv95", "1100000000000000"}, - {"evmos1haykcmrhs4krq8cjsakxt0dpntlf62y6rlhu7a", "1001000000000000000"}, - {"evmos1hcw5y2lv0u2lne6e3d87ue9uzt4dt0yyk7zu46", "1010000000000000"}, - {"evmos1hcyxs2navg028wqnhsf2nc4gu68r0nnhqp7sge", "91766008167085735936"}, - {"evmos1hd4ezmnpuzq3sac8cmg7v3vd4mr7fph4v5y6y8", "1100000000000000"}, - {"evmos1hdak5tj7uq9hgns6dp2lfdj0wq37s39z0tydqg", "51000000000000000"}, - {"evmos1hdqkgpqmr8rmruhdyp8ncjlz98ganlxuvj556x", "45882504083542867968"}, - {"evmos1hds56vlj4smter3exw3r5yymxl4ef5kl8xsqlh", "73861106048759869440"}, - {"evmos1heyc3ws5fmavytyluxgx529skcqxsqegczqfgc", "55957203930434002944"}, - {"evmos1hf2q3evg9a7u0a98uay0ac4hrj5tuc0gkjqv9x", "3048940767123374592"}, - {"evmos1hgf2fvpkjsqz08jzwmcudfeps5uece2z2eaffr", "13881073965257344453"}, - {"evmos1hgfzyg3zy2xchfz9jk98tgrsf4txhukgc4067y", "761000000000000000"}, - {"evmos1hgty5xvfd0akd5h0tuld0r4gadhqgdlkxlxz4j", "83935805895651016704"}, - {"evmos1hh2nudan40uxaxll9vlrd8pnjws0y2ea9a9829", "1100000000000000"}, - {"evmos1hj5cgccj4fu2km6hpladac3gvwc3v07paxk572", "34598381660845550166"}, - {"evmos1hjxzkefkuaayhg3jrnwhr8ncw96n0zpzeysdyy", "2001000000000000000"}, - {"evmos1hlr77mc8r707lz2xmzus4nas9p8v5xpyxl9cxz", "29877974589190002539"}, - {"evmos1hmayc0z0uqapsa5gy8g9g299wqavkjelfr4hy2", "1100000000000000"}, - {"evmos1hmgww29wynvpvtd2wgmm4rxqnr7qfx44rdtv4t", "63252075774453125397"}, - {"evmos1hmv092axmdm929wzkllshq0s70fam7xd8ms6fm", "61000000000000000"}, - {"evmos1hn2gygvj2ea472x4yd2er2uj6lruty0t7ed7jr", "1100000000000000"}, - {"evmos1hney2fs225sqfy4cn6nf7wq4vy7z7xkrghk8lc", "1100000000000000"}, - {"evmos1hnkcuzu0xruv46mcvsgs5fn386c8apg6zrc2vt", "343573425854038769664"}, - {"evmos1hnwp9x2nw7czn8qy32add0jj07tsczx2dpecsk", "1007196213169622391"}, - {"evmos1hnwrgmg9tsxjfacl2wz0rw666e6d70rxuvzvw3", "27978601965217001472"}, - {"evmos1hp027k0xm356c7mdjtrvyns6sw6c9v5nns77qc", "1001000000000000000"}, - {"evmos1hpts887e35dhrqtrwtft27nmpyrjdtpdl6g3y3", "11000000000000000"}, - {"evmos1hpu5uvnn9m4qpgj929qqduuskfjdc73puhfl4a", "1100000000000000"}, - {"evmos1hq30svgkw97t28hf7uu3axtax4p56s26leqjla", "51000000000000000"}, - {"evmos1hqhgf2nr9sgpayjv0v9cl24dqv3gygqshxujtx", "1100000000000000"}, - {"evmos1hqklf8wcy0wqgmundk9jrqm7e4gturcwwvcfjr", "114115908181574270976"}, - {"evmos1hrheew2y6qwvgn0v4ldktfy6u57kkcnz5y98eg", "124780960055748296704"}, - {"evmos1hrk3mtneua63azs7834qjaylvcdhg4xrys247u", "59180054267746532480"}, - {"evmos1hrrlgxn7trwv7kvd0qelp7wnfdm8hhwmyk9zfc", "1100000000000000"}, - {"evmos1hsupgks9w42m5t9l3r7gchs4rxgjrnpwf386rn", "1100000000000000"}, - {"evmos1ht7mzvj64s2wxr66yezh7l0h474rt3w99zzpvh", "455487833714906791936"}, - {"evmos1htxnjhuu6krqwurzx2vztd7df45md2lfn0ch9s", "1100000000000000"}, - {"evmos1hu25uyj6sqqujz4lez8rwz9u23u933xcapr3cs", "45882504083542867968"}, - {"evmos1hufffr2zx7suhsdfmjhzfr9y8uzfzulvxvk89t", "1100000000000000"}, - {"evmos1huufq5nuarh6ar7zugdxw8ed8ywtkqxf8l8j3s", "18461973678904849108"}, - {"evmos1huwunhagahde48j6c7a0pthz74uj7796msnu88", "27978601965217001472"}, - {"evmos1hxexyngvpwluctca69n06x5pyc30s47ce2kyxg", "1100000000000000"}, - {"evmos1hxvpshhjxgeuy0fjuahmly34g4q4ycnvvnlddn", "1100000000000000"}, - {"evmos1hxxnm2mnra32e37t0jkvknu2zg8fqy9esj6tf2", "12740739169593575478"}, - {"evmos1hyney4fwtypnnf7m78sdvy20h3eetjrtjznyh3", "21097910623039931904"}, - {"evmos1hys5rfk32qjj2whukkq2ptkn8q0t3ndx575zqh", "101839708013976870912"}, - {"evmos1hyvgtjjx53gx3d4wpg3c4jcflxruvmdtd4tzc4", "45875766838918749291"}, - {"evmos1j0c4wu5wn92qhkgqtla86d6rnqdjgv0n2gxw9y", "1001000000000000000"}, - {"evmos1j0grh0d26rsgflhpfkyz56th86z2h4sugqanks", "45882504083542867968"}, - {"evmos1j48h9lcfase8g6ak3lcwqra8r52054wqd93y8d", "1001000000000000"}, - {"evmos1j4fkcmhzzzw5maffw2k67huvqn84cx9gh5j02c", "1100000000000000"}, - {"evmos1j4smu8rwmfv4xl26zrvdh2ltqfxm0q7xuf8vgg", "251000000000000000"}, - {"evmos1j4y5tx97pywx87g9gw46kdlmyk226ans7yfze7", "42011742046725242880"}, - {"evmos1j5czgjj8ykdqmsj504tkp36auvhjr8a3z68zps", "1763581660408326912"}, - {"evmos1j5dplm2harq2ktu5y7g9uqrje6s2gu38pwunj7", "147723212097519738880"}, - {"evmos1j6xd6zs2j2uw9whyg8a54fg4leelatrhdmscvj", "399530629784472748032"}, - {"evmos1j7vt6vyrw50a7uesv6jujkajy8p8kdk6f2y6gz", "1100000000000000"}, - {"evmos1j7ww0v038mek9yf2z7r5dw872jz7w7jgpjh2wc", "1968498125099000"}, - {"evmos1j84nknu8fzmza99re3ndyds5ufavhqwt977slk", "1763581660408326912"}, - {"evmos1jclgu68yrffrufwdeay4he0h75s4ja0rtg9gqm", "4913536220299559168"}, - {"evmos1jctj5ppgp83vsph2w3kne5205uucmyq7xrcr3k", "101839708013976870912"}, - {"evmos1jd3t2wn23dercp34kr6kefuwf2zedpy68cnurj", "1100000000000000"}, - {"evmos1jdh09ysrwgvvx2uxcn25v2xk0smj7agkdj7gez", "55957203930434002944"}, - {"evmos1jdnhel78dylqehlf98jr97sha7wlu395l8xfjl", "129818309979193884672"}, - {"evmos1je3as4a67s0mvvla5s6za7jstngpe2pkd9aw9l", "1401000000000000000"}, - {"evmos1jetczvekxne654awremr9aesttsyyz9ppy4dt2", "45882504083542867968"}, - {"evmos1jfcrkaqnrk46y8tca2l77y2kcll7s80qn0rp08", "501000000000000000"}, - {"evmos1jfme06uy4cnhylruvxpn4ctxz6pz2xql6jxlvp", "1100000000000000"}, - {"evmos1jfttdlts2e6gpqcm5p67hhv5ljhtpqymwpmdtf", "4335355960942532096"}, - {"evmos1jfw45jnu56mhmmd38wlukmv8qg6ejmn7d2edwn", "91766008167085735936"}, - {"evmos1jgxqxv23mvuf4arav6j3sze2vp40n68umq06n0", "27978601965217001472"}, - {"evmos1jh2vk38f4xectu8m9h2apd837fcp3xwafg8wxq", "31089503218696426496"}, - {"evmos1jh3e0adeavhe8l0rym4telvvzsczyjhq00kwey", "1100000000000000"}, - {"evmos1jhwpkrcfklk9svrl4p2wjxm0w7t7vewleqepyr", "1100000000000000"}, - {"evmos1jj43yk7k2kftf0p9yrtm6f8cml955jtmjqynyk", "61000000000000000"}, - {"evmos1jj4mz4eus0u6209dvc23fmtlqsv7ck227wlunr", "11809433983133564416"}, - {"evmos1jj920h72glgddx0tjrya564qxu79djwdtvl030", "171786212927019384832"}, - {"evmos1jjleenhwmfz5g2e24sx0pk4mttea3rfd5kl6dd", "26500000000000000"}, - {"evmos1jjw67e2zyxjx2zm8mvyapf9yssrd4ws2yjqk4z", "371552027819255758848"}, - {"evmos1jjz6zaftuym252vhpnrtnjedjw6rv2zddlach5", "1100000000000000"}, - {"evmos1jln7afu53u84yetlw52levxsjwvul6rvlfy2gk", "1100000000000000"}, - {"evmos1jlnvp4ufehnn440pj527385ya0tszw2gjthrft", "55958203930434002944"}, - {"evmos1jnd7n0clk0lk0s79cle5une8s945ea2c2gf4tu", "1763581660408326912"}, - {"evmos1jnp8ez0nlen24hr8npmjhefd2facq0x45l5auf", "91766008167085735936"}, - {"evmos1jpxmw482fnh97anxvaerh49p0vspwkcyvzr2cv", "1100000000000000"}, - {"evmos1jq0swwcxl0u7xhz9w8mddjhtjsjhgyq3a9h70y", "45882504083542867968"}, - {"evmos1jq2n742rkllwn405v2fgsyycx9h8wwmgz2f567", "701000000000000000"}, - {"evmos1jq2x02m99u5ndg3wkm80qtk5a8u46kjmdve0sg", "1100000000000000"}, - {"evmos1jq52p55nkc5w6a4vj77x7p9qmyl3a32gycpzua", "101839708013976870912"}, - {"evmos1jq6yesch8rpzmc043tvmjqw05z5tw6ylytzn6s", "8526811313237976832"}, - {"evmos1jqzu0rl8wm8552mrp4a7cc34g04ydjkc6e6wch", "1100000000000000"}, - {"evmos1jr322sq8k9ma23d5c2rrgftqymk9sdv46acevu", "1100000000000000"}, - {"evmos1jrx52wq9q94fnr2zq4p6cfnqguvfxts40d5sck", "101000000000000000"}, - {"evmos1jrz7gstkla0kc49na7swqtggmqjgs0pp5ry3uz", "157796911944410873856"}, - {"evmos1jse4angmpqhkscy6kf777jnv37xy0jgrzaluq6", "10001000000000000000"}, - {"evmos1jtx6m2eegm63twdwhed5tuwffaq3rafjl2jdhe", "45882504083542867968"}, - {"evmos1jtyzp2ajmx8qt73ywkeeqls09457ng2gxd6ha4", "55958203930434002944"}, - {"evmos1jufuaez3kl30v3n9r206tvy6rc4y5s8lumxcuy", "1763581660408326912"}, - {"evmos1jv9cykcnu3jy9h2cjujn8j7xk85c96utfldhjd", "1100000000000000"}, - {"evmos1jvmnx0mr3t03uwhxjm7z2xc890lmg9jq0hm6te", "73861106048759869440"}, - {"evmos1jwky8z3zvx0jz9qnjclerpzvcczv0yxt84228g", "50844999948130000"}, - {"evmos1jwnj4j28ajrjadj0s73sz3rdshz8hdhmypjhvg", "1100000000000000"}, - {"evmos1jwx4ny6fa4tudy59pl3ta2ttkrua3szx2zzqvu", "101000000000000000"}, - {"evmos1jxn63xntg9yq0su6hk33yc7rl7fwq8520n7g27", "21633535037262897231"}, - {"evmos1jxrsq4a4gtkd3u24s338saccxmrjefdvzypa6f", "81000000000000000"}, - {"evmos1jy69rd734m7z05rnktdle9wrvkjlhgguzn9n3k", "91766008167085735936"}, - {"evmos1jy7yq7u3cfd6lhcxy5vcdqgptex8mag3w56qw7", "1100000000000000"}, - {"evmos1jywu0ehhyxrv8fu8l06plj3m3jw8ng743zlf9t", "1050794447592175531"}, - {"evmos1jz5ryt3fy777p642h7lellt6qhmk2le68hzlrq", "203680416027953741824"}, - {"evmos1jzvv2yn7q8adlysn89hctdj7qzhzx47ql0w7mx", "61000000000000000"}, - {"evmos1k04h4crhrd0y3t4539rldnpql8m52mr3kq9sp6", "68823756125314293760"}, - {"evmos1k098awtdg8m7zhlxfp90y57jqhd7r7874rhn8p", "1100000000000000"}, - {"evmos1k0jtzh4e3sq9gxgqmzqmxesvmtd92v3l2y5wjd", "73861106048759869440"}, - {"evmos1k0k8taprdzfrel6u9ufeengqtll55za6c3mad5", "259637619958387769344"}, - {"evmos1k0t4lxp9psykwku7wy27y7kpzxn6hsesulu8d0", "134971112357544097792"}, - {"evmos1k32sch9j9dt7gsvh38h6g248nungawmwg4xqtw", "120001000000000000000"}, - {"evmos1k38cnrn6pwq95f4j6pkz56v2hv88q7gk523734", "1100000000000000"}, - {"evmos1k44dccmtxl0gyaesa2dvwcpl4y97suv28a874r", "27978601965217001472"}, - {"evmos1k54hvem96tk0tskqfjf6zxhdp34gskwasqhrtz", "55957203930434002944"}, - {"evmos1k55g89w6dzm0cl04p3tkfv027dljq38nflqe4x", "166748863003573821440"}, - {"evmos1k62a5mv9tuncvhmee35k3rdqzj63ph7ywxlrrm", "27978601965217001472"}, - {"evmos1k65zve5ze0j9h24nhh2mmzagyck7c93y5j44q4", "343573425854038769664"}, - {"evmos1k66mek8fvthzr0aufpzfex5zsnrwrj9jphdnye", "1100000000000000"}, - {"evmos1k75j0casa3r5yy2tkuhrlcwd9r3utthd4q4jdc", "111914407860868005888"}, - {"evmos1k7f94e2ajjv604ulcxdreqtncjgv3ssn6jyk5m", "91766008167085735936"}, - {"evmos1k7rlqk9tn72ss3z4m9ssnwt3e7svvzs47ep02a", "101839708013976870912"}, - {"evmos1k8kh5uj8fmlr8nxurs5tpzg009d3y25qqefhse", "1100000000000000"}, - {"evmos1k9q25385r5uvu0k0ez6ptl0hzf69e6symy22kq", "73861106048759869440"}, - {"evmos1kcupzu953xjqqss2xkv02qn590pq272xtjjx36", "1100000000000000"}, - {"evmos1kcyua4xu59nfdvzpmpu70d4fnv4puw86etpmz6", "1100000000000000"}, - {"evmos1kczhv70ncrga8gv5n8fq4vqtg76mffkms3x0pp", "1821087837083558167"}, - {"evmos1kd4mr9v8dzdrz0dwp3e4f6sfe0yezdstejpmhj", "1100000000000000"}, - {"evmos1kedked6u042ceguahvyc7ku60d5sze8uu6045m", "1464500000000000"}, - {"evmos1keqhxja3gp9tezzdryx0eldh9a8q4awxey7fhn", "259637619958387769344"}, - {"evmos1keu3052k273pzxy7gc0v7j0zznltpfmpyjdgrg", "2001000000000000000"}, - {"evmos1kfmrcrqxlk4nmdnnnw9ztkpk9aq3mhy9wkmqpt", "83935805895651016704"}, - {"evmos1kftkym235s5vr77jp0yzjm30uw3m2tlha6yffk", "1100000000000000"}, - {"evmos1kg99k8wd67r0ffxwavgnxup7yk46rvttpd32y9", "255722018822670417920"}, - {"evmos1kgm48nx004kh4ka7keqprvd5fn7a04vemwvhmk", "18935439897995518720"}, - {"evmos1kgnv0z8enl4z0uwys9nyewkfwvxgh3uggghj7f", "1100000000000000"}, - {"evmos1kgs53j5zjuzxu6qel60au9sdpmxsqg4hz955q4", "45882504083542867968"}, - {"evmos1kgtww7kj2aw53w03yynnz8xpjmpqczd360jwh3", "129818309979193884672"}, - {"evmos1kh3rxn6kk4c52nfqqe27yy333ukx9g8ktjrg5z", "22073863532747077376"}, - {"evmos1kha3vttukf9paf2fldphm8mt3lk58anxtnnf3q", "101000000000000000"}, - {"evmos1khjx4754jm9k73xjljmdh5sfdklr2wtvw0jp0v", "82857727448649328239"}, - {"evmos1khl20dapqlcsaks85jxg26aqfuvwx20x4xldvz", "21000000000000000"}, - {"evmos1kjhdx3nkh6krdhryvjzkq33xwh6wsyy794c7j4", "91766008167085735936"}, - {"evmos1kjsh2665c2s9u4rmtvgf3m2ly42s7yg9km5zdp", "11000000000000000"}, - {"evmos1kkv6986kjetewkua95n6xxt00ntgxha8w4ahz4", "1100000000000000"}, - {"evmos1km4k4n9f0slsrrvzjmnwcsrdef2w9c2ju662l3", "4306502130000000000"}, - {"evmos1kmndljmu7rnl7cfge5fqa9cqpwu7yu3mrxpfqu", "1100000000000000"}, - {"evmos1kmp5447lc8geh7qf27k8t668j4yfw097qczz3w", "45882504083542867968"}, - {"evmos1kpgdw94e7fvjrrk3q3q9fj6gr0fshqm0h22svn", "1100000000000000"}, - {"evmos1kpgz46877u66ac9rksdy4d6wkdl06dnxrtj7c5", "91766008167085735936"}, - {"evmos1kpqwnglcycc4x8hxu9km0w0tfrlks9dzj2w5w6", "45882504083542867968"}, - {"evmos1kpswemlchuq888td3v8fax3y3gu7xrwpgawv84", "11520138277210535256"}, - {"evmos1kq2rzz6fq2q7fsu75a9g7cpzjeanmk682y53pu", "1000000000000604"}, - {"evmos1kqualpulg9y889kxa7tnyuhdfk6v3rys0e2tzp", "1001000000000000000"}, - {"evmos1kr0v57nreul0q7s57nfxtdctccsj0e6q89yye5", "27533299579286495712"}, - {"evmos1krsua6sv286wnwyzfadxr0gw679x39533yema7", "1100000000000000"}, - {"evmos1ksnf9xd70e6kkck9wgehm3fp0udxgp0xn97u0y", "45551594008213112410"}, - {"evmos1ktn9gz2q7tfhkq54lg4e0awnsqlpj8rrty7mam", "101000000000000000"}, - {"evmos1kucd8yytnwp6cnv8dtjuwz4fsp8nj6227yxtq5", "53816186686832841728"}, - {"evmos1kueflypv2tj8yajhscwd3cw5gf8vqgzs60crga", "157796911944410873856"}, - {"evmos1kva4fgrjc9d8xxs25e7uz7y08zvxvztjecxved", "157796911944410873856"}, - {"evmos1kvdtlmm8zpn4m60p0czneprxa56fwata8hcs4e", "4954096640176984320"}, - {"evmos1kvh5n7skften3fv2ry6yc5jkpaz0rwzrxhf8xm", "97925106878259527680"}, - {"evmos1kvzmwh9el445p0l5u2sru3dvhdenmfz8y3z4rz", "47646085743951194880"}, - {"evmos1kwnedyv9cc88dxd74dxc3ls3z6ad7pv0axd2tt", "201000000000000000"}, - {"evmos1kwvc7cndzs5s6n6jyjyme2cyp85w0e7qyf44k9", "11000000000000000"}, - {"evmos1kwwnpu7sxh0mxgj703se7jwg33nm33zuztjtmx", "1100000000000000"}, - {"evmos1kwz4gf9hlaf00lphuqkhatnjmk68ehsse6kszu", "101000000000000000"}, - {"evmos1kx8yxvladmlyeyjkfnsktsg875ykppewz8wq6s", "101000000000000000"}, - {"evmos1kyderqcn37vsl9qsgw5tenjk8l6xzhkvzsewxr", "61000000000000000"}, - {"evmos1kz55yhtvnfyzw8mtdqqnlwnzj7458nsm5lc58g", "1100000000000000"}, - {"evmos1kzaqujr5quf20sfmty8rtc3rexy646wx345wj8", "6480539395186887424"}, - {"evmos1kzeu7vsvzl5ljpghxhnc7dklykdufxk2ep2t2g", "1763581660408326912"}, - {"evmos1l0rkyc0a2h8erwq6jlduc2elvyv09wf4e8rvf3", "1001000000000000000"}, - {"evmos1l2442dh54drmdq9jw3sqkdq4j0q99xrgkmnx4p", "1100000000000000"}, - {"evmos1l32qjpvvzjgnqc8wfal3a6tls5ks32c7faat4q", "1100000000000000"}, - {"evmos1l32v4y4p72grqh2zc0tdetg7a2wg74cn96kr4v", "1100000000000000"}, - {"evmos1l3sm7vxuz7jyksydnwfwd378k55yl7mqkkuq6w", "71000000000000000"}, - {"evmos1l3u6w85q0yn78hht0vkzxcpsp57j2akn6cmsux", "1100000000000000"}, - {"evmos1l3zz5u8c7n3agdh3e7xkvmff4gpvxk2tkyjc4t", "108025923932711865834"}, - {"evmos1l4a7vhht5cykler0dvgv9nvtp8qk4zkxe2z2tg", "1422500000000000"}, - {"evmos1l59053wpn3d6y6q27346p7zyr0s9yye4uzlmgc", "147723212097519738880"}, - {"evmos1l5ctk472py89nsgd0yecxdukn4gq98lhrvuk4k", "2010049767195105681"}, - {"evmos1l5s5w4qu3q3gder0j87njmkcd9jgh07xks62me", "27978601965217001472"}, - {"evmos1l67cvyzpfcatgnrwxu06uwwsmrawekcc5p7qrg", "7476563884976158217"}, - {"evmos1l7dgp27r6p6uqwrncdxy33u0tlzjfeea2y8f3y", "1763581660408326912"}, - {"evmos1l7dtfnqlkepjaalpm0c0zqwr2x09k5gwyskddk", "111915407860868005888"}, - {"evmos1l9dfpnssd9pz7n7h2mwwcpllfvu23e2hqcryxc", "57076488145807383040"}, - {"evmos1l9gzsfgzvle8dvwsf9nnkppalvvs9knpd2gzq6", "55958203930434002944"}, - {"evmos1l9y2yag7ua8n5fza4w6dlzrjcrvx2g738g6wv0", "45882504083542867968"}, - {"evmos1la62g0c0x2h8htckeerzms92z0w4duc789c49u", "55957203930434002944"}, - {"evmos1ladyjtes523lxt5xprej3l9hle8qzygxjmmvsg", "83936805895651016704"}, - {"evmos1lamvqf444dw2nuza7lh5x2ktlc9hxxz26pfpqd", "191512460000000000"}, - {"evmos1ldmzmtul4783ac5n3hmrguc6tze7g9cdk832cv", "1001000000000000000"}, - {"evmos1ldtse29la2pf7tx0qae2ejz7vuja4mvjnsa5un", "1100000000000000"}, - {"evmos1lejgg4kry85z0hfhxnjjk4j2dnjds0j7k9ey3c", "582902328500360373"}, - {"evmos1lfaq2qddk85l0l9dl6kuxsmnyf0djje5kgd0uf", "1113907245711002"}, - {"evmos1lffhk58cpmzrq0xv657xtu8gsmdd46vvjpddd3", "101000000000000000"}, - {"evmos1lfgxwxc78z29wa8s553yzc95tj94ghefmxn0ut", "100237789771180051456"}, - {"evmos1lgcyk765evefc2c7pxz2a9weqccg5g82acn6ps", "111914407860868005888"}, - {"evmos1lhlzlj4hnj9kygg89r8afrn2ed2x9dxe4ks7s8", "153882310808693506048"}, - {"evmos1lhrgk0y004n0pct5t4drrgwxayj76n3my6zdt7", "1500000000000000"}, - {"evmos1lhwjw0a6fdyqj3lvaqmlgh6sau7thr9l9w3rv2", "9000000000000000"}, - {"evmos1lk6sl2ewg2ats59y676yhtf0w2xtvpnedy8nvm", "3341633087303178205"}, - {"evmos1llchxwxhh4we7ytk54s6v9xz7yskcdfcljvjna", "18561922163229280256"}, - {"evmos1lllldecgggesjjx2guj572lxwwcukrdhfy4z8x", "11000000000000000"}, - {"evmos1lmdeq0j629gv7zjc6qg533ddpnkc55ss53lfxr", "1100000000000000"}, - {"evmos1ln29p92ak7pcyeaclc36duw04fzs6x8h2h099v", "1100000000000000"}, - {"evmos1lpp9ssaa9nsj6ev5v608auclv5awhtlvh73txv", "1100000000000000"}, - {"evmos1lq39v4ff0v7r9e8q803dtdewj0j06fcuuaa34y", "3526163320816653824"}, - {"evmos1lqanfjuzu46wmmzqtzec9jgw549897j8j7kpdq", "45882504083542867968"}, - {"evmos1lr24t0pstuy9qmk738jc4gclj8pldqq6vm3fs6", "55001516774247040780"}, - {"evmos1lr95c0snv7c366w9924k6usv687swemlr43ch8", "45831929956053572344"}, - {"evmos1lsyce347h27hsqk9cdkg4aruay242rqcsy8g94", "3192226835246600192"}, - {"evmos1lt3wun4gw9r2rgpxcdl5yckewdmtuxaymvamqn", "91766008167085735936"}, - {"evmos1ltgn6eydws7vmn27zjtjqfzerle2z95h5xuxyk", "87850407031368376320"}, - {"evmos1ltmzgze9dl0064umvxu8m3pq0w5tws45vqzgza", "11000000000000000"}, - {"evmos1lttyhp92m39s6h8zl7w9cznve5lm7qeuhcp6kp", "71725248201993730756"}, - {"evmos1lu2qtcqq4lva2ycqgumtjzxpk7gymj2ed5twp5", "343573425854038769664"}, - {"evmos1luh0dmlgg423ex4hh8wmqqfg40wmtxke24jfd3", "6654855457581192192"}, - {"evmos1lum2j7aqjhrfdx8cuyzek9ae5pshxthe8squzn", "67528300795009055426"}, - {"evmos1lunlnx82vwaypplksq3egprhkqttfewz7ws744", "2001000000000000000"}, - {"evmos1luqx2sr9dl5gdgdmf6qeut4z6st43sx5mh3rsh", "21000000000000000"}, - {"evmos1lvrjjq5u5t7rztre2pxww9mpfrdq8majhsgmyd", "143807610961802395648"}, - {"evmos1lw0mmwj8frwu32m7zdp4awv0f8hy9p2ggllsg4", "45882504083542867968"}, - {"evmos1lwe7e0a3f9j2qmqrkfr3cgyhc0qnerufqdrzqd", "1010000000000000"}, - {"evmos1lwm6z69q3m6hajmn7mha7kv5jzyyh6xaah3txw", "157796911944410873856"}, - {"evmos1lwnxzal9gj9zev9shnzrmad84kpq228ukk8f24", "167872611791302033408"}, - {"evmos1lx7dac9m9gnmfhra25ht3ar0guuvcle6u906h4", "1100000000000000"}, - {"evmos1lxg3th2amx995c07c9dh4ecxnxx3cdmqy6wrzh", "203680416027953741824"}, - {"evmos1lxyn7naehg5zcnluylcadp7scfa9cr34ulljkz", "1100000000000000"}, - {"evmos1lypx0s869z75zdrc7r9svp278ddpephcu9kslv", "11000000000000000"}, - {"evmos1m04tu67wwtk4s8szn6cu3trxgc87rsh6w8zsfn", "1100000000000000"}, - {"evmos1m073dtggfvyc0phf4k0zhrnedthtfd0lj47xpu", "203680416027953741824"}, - {"evmos1m0ug7nc07zw0rfn7utxy93qnn5m284vq35snsg", "18732548648502598656"}, - {"evmos1m23ggu267tfgm457ryaw9nvfkcpd9kqsljppur", "13000000000000000"}, - {"evmos1m2exdq6la7y9ffpy6jhflqhdnzh3rrttfwdhzn", "91766008167085735936"}, - {"evmos1m38su8zjmf4lcwdsgqd9ugyee8mcagd4p6e4p0", "83935805895651004416"}, - {"evmos1m3rcas2lek7r2r0mxue46n60uj5mpxqx0zrzwr", "45882504083542867968"}, - {"evmos1m44zhrdtny40qn2epgyvguelkn50gfz6aedcqk", "83935805895651016704"}, - {"evmos1m4mh9uzd2yag8ewggal2h8kxytcdr925gf0gsc", "1100000000000000"}, - {"evmos1m53rjfc9sz8czwuc3a90ww8w2adttnunafgjch", "82454812964463552334"}, - {"evmos1m53xuw28srr0q02zyh73ssr229cgr4es4wksgf", "16867516495078790132"}, - {"evmos1m5mz2s99e7rdt2p6vd8l2kezqcd5dsrqjkakgf", "1763581660408326912"}, - {"evmos1m5p372r0x0uycsxu2zrnjcudfe7p7tnzum9mc2", "1100000000000000"}, - {"evmos1m5t2y82zypraztt4cze6sy630cfzx9y53mjqte", "3771062441242485515"}, - {"evmos1m6mndgtse244u7e9mht5ez30jhhcap5m674m92", "88626645583183782912"}, - {"evmos1m6sudn3lzp49lcmmmss6m8ys4thnxh80g9y6dv", "61000000000000000"}, - {"evmos1m75jazrlljw5j9hd226q5jcnkjgkcryv3dqh95", "45882504083542867968"}, - {"evmos1m7uhjguplyxscw3s2uv5r8rda997pvvsma9d2s", "45882504083542867968"}, - {"evmos1m8khq3v3ldte6rayfu7jdplcgf3prjhwylhfwy", "45882504083542867968"}, - {"evmos1m8syyg0ugfxlyyfyp36npn33tdfrpatgm2u4uh", "259637619958387769344"}, - {"evmos1m8wsgcn5y5elnsxc0e4w8mda7f3stx09r3dcue", "178687096911100770304"}, - {"evmos1m959y2gzjeycvlujvuf9g0vjl6mlq4qas0lu3n", "75223895647717610362"}, - {"evmos1mc4pjtk6yuwxgue3v0q029end2la2daywxazh6", "1100000000000000"}, - {"evmos1mc7ausakt6k2qvdwutf73cylsgtxy6t5dfrmaa", "1100000000000000"}, - {"evmos1mdc2va855zu5s5n37k3yt3ag7ur06nkn9etykq", "389455929937581621248"}, - {"evmos1mds366pvkxkh9l96ek2y4znwycr2d52c4wkv8n", "129819309979193884672"}, - {"evmos1me29wgkpf6593f4ahxk4klwc8j30wq7g7yrwtq", "101000000000000000"}, - {"evmos1me3al39hmvmfsuyl8h5hvuzxla3cx2s9k8vl6f", "101839708013976870912"}, - {"evmos1meemzk2zmucsc2gsyts4ev025cauznvsl43ljv", "1100000000000000"}, - {"evmos1mf7m0zr59zgmq3hdsuck58pch98rv2cp4w8lez", "63615642189369395712"}, - {"evmos1mfglq0yjdkn6mwf40t9fm2uzx2a2k7emfvmpzw", "1001000000000000000"}, - {"evmos1mgndenptffvy7hkst4zxh69ytlkxd4yyn6cgfl", "45882504083542867968"}, - {"evmos1mh8akgmqzvv4qqj8pfq04q0gjrrmt2wt66udyd", "1100000000000000"}, - {"evmos1mhcva0pmyk2zq2qrwyehky0kl27amuhscnrj6u", "1763581660408326912"}, - {"evmos1mhh5es0j4hy0np5mrt4cry3cztww6shg38whdf", "1100000000000000"}, - {"evmos1mhzyewu9apygrzl808v5ap34rdpc4rett93qfg", "1100000000000000"}, - {"evmos1mj5l70dgc0j96l8fd32fasqsu9fw0dyvuscnpe", "1100000000000000"}, - {"evmos1mkjkcjnz2anymp7xkhk0q83nc6hhfh9e78ef52", "1001000000000000000"}, - {"evmos1mkn87kumf4hpx0mpe6uhvvm8g3l9uqcxdk0d79", "2000000000000000"}, - {"evmos1mlcqcfje3jm5aznz7fkg54zwcl4vyydngjnt7y", "301000000000000000"}, - {"evmos1mm4mmkyhrpaa27txwzyfr9hnvpl78tvnthncs9", "1100000000000000"}, - {"evmos1mm62prpa83z8n78rp838fyezu845l6dpzpy0ag", "1100000000000000"}, - {"evmos1mn58aagq9smunhcpc8jrlzsmmp5m5l3p6nr6le", "2000000000000000"}, - {"evmos1mnt9lx5vvsncfd76vlp7c05wa50uxfwxqqqzr7", "2001000000000000000"}, - {"evmos1mp859djyh6wq59xqe2rskqlrv870dkqrg7qqpa", "45882504083542867968"}, - {"evmos1mqycqdyd4h2sy55eryfgl95shytjvhf5u9wlsx", "1100000000000000"}, - {"evmos1mr4x38saylfezgq4c0k3unn8mcuwsqr07vj6v3", "1001000000000000000"}, - {"evmos1mscpphq52n3xun0v8a74ujng2s6zadqjhew7qr", "111915407860868005888"}, - {"evmos1msmhzsgtgaqzv4l6g8acr8eg6kz8lz3w30untu", "61000000000000000"}, - {"evmos1mu0524d7hak99h2thhp2ff7dssuh3ywuumcd53", "91766008167085735936"}, - {"evmos1mufyypfadttted8t5vqy6h26ywwnyeup4wssyk", "55958203930434002944"}, - {"evmos1muj6nqu638cpuanlmlunf6n4mep7vug7m9xyj2", "91766008167085735936"}, - {"evmos1muk85009jgec87l7ea4ps00er5ww8pjpxnrme8", "45882504083542867968"}, - {"evmos1mvwgjfld0e5y4cz420gh3g8n9z76jwlexw3x34", "1100000000000000"}, - {"evmos1mw2r8j7j57m8d8lkurd9xxj5vcuhyd8hpx3yqk", "82687027256492155057"}, - {"evmos1mw8a0fcrsytlwdcyf6g4d673f68wy77h03c0d0", "91766008167085735936"}, - {"evmos1mwua24cez5ql6t9d7k5lmqyytutz6gxad6p7yd", "41000000000000000"}, - {"evmos1my02afuem5cxlh02sh2j86hqw3ccm52uw4kdle", "20117539634150713396"}, - {"evmos1mydns0ru5q9zt2k555glxhtlezf2h2l4v0z4xq", "3041301424887866880"}, - {"evmos1myt6hg24jxzyd50ryujtey8pszttlxk6hyrjvn", "4818361630463393792"}, - {"evmos1mz2vhtjy8n976e25rer3hv4pmcxc5gl3c4yhwf", "101000000000000000"}, - {"evmos1mzvnphp47c40r6nlcg6f9qn5vl7ckehf6866nm", "1100000000000000"}, - {"evmos1n2frrusafp2s9qk87zue207w6w2rymyfmaamh0", "45882504083542867968"}, - {"evmos1n2uex55d27pjnyurmy9uuxs9m5tuxy3n5t2jj6", "1763581660408326912"}, - {"evmos1n34r6t92mq2ljed6rkxqfcz2568w5f8gdja8cw", "83935805895651016704"}, - {"evmos1n36hclrrv2x6fk45cg4hp9hgpnvj8phq4hqrhv", "17348447260725752214"}, - {"evmos1n3gwc2vhhmp7xtwpvuwter53tkpwn2zvm5sdat", "1100000000000000"}, - {"evmos1n4qqavgxy0f5enk8425lcdreyxrxh8yxeweqgc", "1001000000000000000"}, - {"evmos1n5cqzjflrwv26wpxslr5axwa7x53ev4xyc83dr", "91766008167085735936"}, - {"evmos1n6kqrlmdhenstppxuaemczplnex0cyk9q0stfc", "111915407860868005888"}, - {"evmos1n6txxfmpr2txuym0v5uhj9n2jp3sn8y3j0l9eu", "45882504083542867968"}, - {"evmos1n6v6wsm9slezjnrxad8jxzftzyd7je3g35gvhl", "45882504083542867968"}, - {"evmos1n6ww9m8ecfa00eagmt6quh2pk0uvjs72sw5558", "45882504083542867968"}, - {"evmos1n805ammxanykkp000u4ehmz88a4j5mgew9rm37", "203680416027953741824"}, - {"evmos1n8sxpcswe22la5jwe7efz9suhqrfhl59ackn4v", "64860961267499040768"}, - {"evmos1n9ant6afmk6ln9ym0nehzaae4r923f2tm907f8", "23276538903254522690"}, - {"evmos1ncv6h64ge0tz0j53x9kva686vlgaaklvkh99qy", "203680416027953741824"}, - {"evmos1nczs9w73z4frhwj6yzjqxyh94c2mt2n07r5tfk", "15517501193469650010"}, - {"evmos1nd0jaj0z5t70eanwwaqzetcrl8ggl5d8vkzy7u", "111915407860868005888"}, - {"evmos1nej82s9t60pd6zxcl7jzj5e9ulfty22zf9z6yj", "301000000000000000"}, - {"evmos1neny35qgdyfm6dsf09m084muh0qnf58aq33c2w", "1100000000000000"}, - {"evmos1nezugwx7fwu5lh28lhrl4rg89nee43amg9z6j9", "147723212097519738880"}, - {"evmos1nf7ysaj73qfq4hm586zy6np2h9a2vkpzu7cxzr", "91766008167085735936"}, - {"evmos1nfr4jrjafk5l5n9pznhm9swy6rkh098yetyh08", "91766008167085735936"}, - {"evmos1ng0f7sma6knmz4t2kxydzlesxynfc5t0gkm85y", "1100000000000000"}, - {"evmos1ngngkdcdxkr6msfpq7s7q05zwc0pzmtz0d9x7n", "201000000000000000"}, - {"evmos1nh0dx9c7f8wtshpejayxpppmudn6q7kxz9na9d", "45882504083542867968"}, - {"evmos1nhr0sc57cwh26zyghwm5fuykmqfmtzlmaw7m2w", "45882504083542867968"}, - {"evmos1nhrzhehzmve8r76f8nvj9ttggg583f0z6eqzmn", "1100000000000000"}, - {"evmos1njqpkw64mkkm3vc9vsjafkxrzu7fv4adqykdg5", "1968499999433000"}, - {"evmos1njxcc3v8e64kp7y4d2a0lvaaelkzca4gdmw36f", "1422500000000000"}, - {"evmos1njxhwn5dtmlws9vwl0mrth7qcs5nassqwt0hlh", "1001000000000000000"}, - {"evmos1nkakczk03pud3jtfav4qpr49jt0j70afxdq28u", "1001000000000000000"}, - {"evmos1nkedheq97ne3g0zk5ak6t8gqpz3hsmhd753v0v", "91766008167085735936"}, - {"evmos1nkjq78wz80whewg05ku7f4pjxnp8035p3jje62", "49408667404359521792"}, - {"evmos1nkrsk4e8jlfaprmn282zulhfvw00gagy0l8f4t", "287616221923604791296"}, - {"evmos1nkx9ptu73yyrw9gzzy8pj2va64y0ch4rd54jdf", "1763581660408326912"}, - {"evmos1nlf7h3egnq5qlkjy0qhxc9wnay3rg2dllcqnkh", "61000000000000000"}, - {"evmos1nljpy8m8fcvhn3e6t97axqn0x3vgsz57tdsvac", "100968857913382604"}, - {"evmos1nlqvwr4kackmn3yahsnk8kp82q7mvtwy4ytmtp", "61000000000000000"}, - {"evmos1nlvjduypwuvq2ll2w28pxql5y4ajl7qwmv9a0k", "25853596469448713144"}, - {"evmos1nlvw7l3cvl5k9dqph3egjfex20lvzyj9jhm9uk", "1001000000000000000"}, - {"evmos1nm99fk70pvmthvygdhagtlccjy5fg8watq55pc", "1100000000000000"}, - {"evmos1nmnmdsc69f7ekange3md2m4228qkl995wc22kx", "55958203930434002944"}, - {"evmos1nmth49ksug5ucxw4827q0l54tj75rleywr9mnp", "259637619958387769344"}, - {"evmos1nq4lxjwxc360ucmak4vd40fw600n4aa5me99wc", "203680416027953741824"}, - {"evmos1nrvpas0yfs73v56yj7wkhkpal9ghfgry9yg469", "45882504083542867968"}, - {"evmos1ns3v88fpjjcllc24vl5xgdt97l0uf2w308tmua", "1100000000000000"}, - {"evmos1nsu72zasu4grnw677d7vsfzj85ag46xp7dda2w", "1100000000000000"}, - {"evmos1ntd65w5sz6f6uud478kgt96hfxad4ssvc6gc2d", "1100000000000000"}, - {"evmos1nthsljqhfta9pt5mtqv2z7v0n3m5wfy7q8gf68", "157796911944410873856"}, - {"evmos1ntkxexpzwxhvegyzvlfjq3z4v02r8cwa7n5387", "7643720263757497272"}, - {"evmos1ntzdxeslvfksqml7kzwg6kk3psfxlrrys78ht5", "1401000000000000000"}, - {"evmos1nv2sd5eamcr2jvmdhk7w8h5v7n53gsrkasqlej", "6000000000000000"}, - {"evmos1nv9zvayaldkylr5dvv7n2kn6lap3ngz5nf49qp", "1100000000000000"}, - {"evmos1nvwl269uhef2h66vn63qj5l5v5vyj9kyzs609f", "1100000000000000"}, - {"evmos1nw4vk2mjx6vv328l8zjyz6y5z7nzfx8q5cq5cm", "1100000000000000"}, - {"evmos1nweuxg5s8zpejwafzxatrjjgkkz5v0jd0lyujz", "11000000000000000"}, - {"evmos1nwy5d23wzwq57f040gad0pvhj4ee3nlk3aruf5", "1100000000000000"}, - {"evmos1nxvk5659sdx78cacue3aam7u67zt2c0svggvfp", "1100000000000000"}, - {"evmos1nxwcne29ez8du5j4gkwvpltk0w77w0sue32gjd", "27978601965217001472"}, - {"evmos1ny6chtjuf26jzz3fctlpajmv72fzu3a8qcjc6n", "11000000000000000"}, - {"evmos1nyxr6yphaq720zkgmr8n2qzfv3gq06eax9dfcf", "91766008167085735936"}, - {"evmos1nzfnvrz9aad9rsan3h9alcqrnjq06mmqvut2m4", "61000000000000000"}, - {"evmos1p2hale5eq99h8ke2acyzsujfsqpm0wt9m9akwj", "1100000000000000"}, - {"evmos1p2hdj27yymh548ya89gutjt4nxt26ed2vqac5v", "53426176517915869696"}, - {"evmos1p2rgp0n3n77mmxw8fas0s8p48tq69lz0hte995", "5560109558405711872"}, - {"evmos1p3a4fk6yyau4wnp9pyl2tzhq4j0299d7ml77px", "91766008167085735936"}, - {"evmos1p3rpkr38ucz79sqhvsjwr57n6lxage3krwy92p", "4770682965747594496"}, - {"evmos1p4dlkc7c4n5hulq8x7e6ac92y0r2ve49ey73a8", "1100000000000000"}, - {"evmos1p5p9d7r26h9ztaahxt9mxqja9q9hjx5tcgheg4", "2001000000000000000"}, - {"evmos1p5zefnrt2ud797rwea8p2ljkwjpqad7a8knmwe", "14038781828005726976"}, - {"evmos1p6eqxjs32zmm2ducl9pyswp9h3g79hwv658zfc", "1763581660408326912"}, - {"evmos1p6f4ghk66zag3p9uaecxrrpa34xh84d57rj2mp", "1100000000000000"}, - {"evmos1p6rz3ul8sc795uadsjv6t3j40xrl66fk2cg240", "1100000000000000"}, - {"evmos1p6vnau8q36hafxjee2722lal7dgyuqu8em9tv6", "315594823888821747712"}, - {"evmos1p756reuyrl8pan7fnjkmk5emgptghqcq2h8d5e", "1100000000000000"}, - {"evmos1p8ruztqfzf5xuyy8z6de8vm3p5yesdyv0ruvva", "109771000000000000000"}, - {"evmos1p922778gplluxgq3lr0qjpah3x2dy3sw7qfy9g", "101839708013976870912"}, - {"evmos1p93mvlszx2gdmyntl50mwq43tgjafjq2mep5fv", "2489884975374986648"}, - {"evmos1p9amsut7c69rswfdd86twxrgcld5j6nmjj94ad", "91766008167085735936"}, - {"evmos1pav6u6s24smu09ngjxpjf8q6xzvhcn0758e0ak", "50550371390251374052"}, - {"evmos1pc6ddg5rkklnd93jacy08utdy46wtu0dtsn5wp", "11890591958024599694"}, - {"evmos1pcmgs27m62hpuhvld6l0q49nglgyu6nh3lv3wy", "1100000000000000"}, - {"evmos1pcsd04enccqt9wv8gkyf6txwcd9eg7th7p2hm0", "1763581660408326912"}, - {"evmos1pd5duyu67yac9a3ey79lce8dqcevqnf3ath60z", "1100000000000000"}, - {"evmos1pdcn29attdzapt9kdf52vlcgcxv6xntu4ulkgy", "1100000000000000"}, - {"evmos1pdw2vj9m9h0e2gpjfydtvx8qx5vukdyh3pjyv4", "1100000000000000"}, - {"evmos1pepxx5xwexantkl4tlgqcq40wncxs7ednhx2fr", "1100000000000000"}, - {"evmos1pepy0v6g5shyjl5he4c2wwt65yvhee9q2an9xf", "54957846265043334912"}, - {"evmos1pet6lkufvvgrjmp3qsy459uw0n6tslyzgf7e7d", "19446998241464704000"}, - {"evmos1peyvndc73ja7hx50r4me66kree2qxg3lw0zu8t", "101000000000000000"}, - {"evmos1pfwq2uvftx8tzjceq6x4rxsj0h30yth6gkv933", "44433466690942241942"}, - {"evmos1pgaktl7yygm308z6ltsnj2yz4fn62mxu55pv2t", "1250000000000000"}, - {"evmos1phj23wwz6udwhylfajxc0zj9gh6mw4vc8t7sy9", "87850407031368376320"}, - {"evmos1phnd80hs6hdagzavhh3dpaurdcfs39a0ckvake", "88032844140952166062"}, - {"evmos1pht42dwce7ps7wg5f64yatdrhmnug7yrqmw5j4", "29902112305761776482"}, - {"evmos1pjqd3lg8g9h6gtg592rhxjv0zx0x34dshxyurw", "2653186740235152398"}, - {"evmos1pk0clqwpjkjrudeyd8mvppu885wk4dqpzutpwh", "1100000000000000"}, - {"evmos1pkyknkm5n73zeqg8luu8rcct9k3ydxzv2wfsq6", "12488406259001528320"}, - {"evmos1pl7cgne7hmzep5fucqjenk3rc5z3j9cda925e8", "111915407860868005888"}, - {"evmos1plfc2y6mnd9n7q8w2p02hfn083z7l57jhfl6um", "11000000000000000"}, - {"evmos1pllqe4nrtfnngpe7m2faj6f7qlv7nqk582ct9h", "1100000000000000"}, - {"evmos1pn2rdejctl8cc792us7mxts36t3hz80v32lu43", "5001000000000000000"}, - {"evmos1pn6pe56084j8xge88xmjnd3v20vtkrxaw7qa5g", "698774235791907405"}, - {"evmos1pnahwdclc0gxks7xkjnm7mr5s5a3zhgp7w93gh", "1001000000000000000"}, - {"evmos1pncjum2kdw877fm33y40tekl6can2j7ezcz6dd", "1100000000000000"}, - {"evmos1pnw5yyg9yherlkkvr5y8unxhdr7n7wmgw28u7v", "147723212097519738880"}, - {"evmos1ppal27h7v5uyhvwrhsxrcsmmkk5shd68ygzkt7", "1100000000000000"}, - {"evmos1ppcexw8knljrgk3j829jurpyh5nvcachc389jw", "1100000000000000"}, - {"evmos1pq9dh6cp366qq56n9seymftu5xhh8uq72r4p9h", "259637619958387769344"}, - {"evmos1pqj3x5u32zlflxk2wzd9l9qf93e0wne6kfd4y0", "45882504083542867968"}, - {"evmos1pqwh69x33v5p9d524s7qvcfruggvyfjwgarss5", "20030273093000206960"}, - {"evmos1prlz68nk2mycdnh386xt4y5s9zg9qjgl02937w", "37374301684025517621"}, - {"evmos1prpzxqtxkz56d8ur3yq3qsmwg4ge4vssunttyt", "111915407860868005888"}, - {"evmos1prqwuv72a08v3yec7lse3wn80ld44e42fu7vk6", "83935805895651016704"}, - {"evmos1ptwxhdryupfym3egh8t6gt07kfx98guk0y7sp9", "55958203930434002944"}, - {"evmos1puq4av4sa6whnuyws69gn6c7chjy4ekhvuwzgs", "171786212927019384832"}, - {"evmos1pve8r4al2880c7phd9s029s4jrah33fx2fc7s9", "45882504083542867968"}, - {"evmos1pwfgfm57w5sw0svxgera8qyefkg9jaluwu8sv6", "19937418591700906113"}, - {"evmos1pwvldu85jvndzw2h04l23v9ks9wg6qgttnsnmr", "1100000000000000"}, - {"evmos1px044vh9jesa9pynn447ycsl7kw5unvxev60sz", "1100000000000000"}, - {"evmos1pxlnp6fs4hkpcaml598z6vn4wmjj5te47nn5g7", "1763581660408326912"}, - {"evmos1pyfm8p6xvptuuey8u7t9lwxqq52nm9wnzdz66p", "1001000000000000000"}, - {"evmos1pyjpgndh34qzqjxwuqfs9gnnd68rxahk8l0zym", "91766008167085735936"}, - {"evmos1pytz2c9eckkeh82utww69cy3s8uaeuau8e6rf4", "91766008167085735936"}, - {"evmos1pzh6wtmrstqmqf3mr644etaf5gexwju2ahvcxn", "301000000000000000"}, - {"evmos1pzm6xu0w62sat6pfsw0lw8junxpkazhd53k5l9", "27978601965217001472"}, - {"evmos1pztgrpqu2q4tp7d5fwwk9rnd0esyg6ghn4aqqc", "1763581660408326912"}, - {"evmos1pzunc9mys4lkr02nncdsg40we93qhj7nquxupt", "91766008167085735936"}, - {"evmos1q22ejry7hcxalrklz8x655yp26l9dumqahkxy3", "91766008167085735936"}, - {"evmos1q2ext5kww4hgxkcmlu57ngr7wlgzfz8nr0w6vl", "5288744981224981504"}, - {"evmos1q2mxhc0q7amzavq265r6j8pfsqyvnqaa5ly0gx", "61000000000000000"}, - {"evmos1q36lqgzk7g2u5tt9qyzvq3lapyatkuxxd3k4kw", "1100000000000000"}, - {"evmos1q3stdnuuq6ql4xky6zanrs5pu2hg2wl2tzx9lv", "45882504083542867968"}, - {"evmos1q3vam20twp3wdlw2v2f6fsmrwghu5cgzrgtz8p", "23214037339654812672"}, - {"evmos1q4ejd0h9gdkhj2fjpgctlu57f8q9am0qtgng2f", "101000000000000000"}, - {"evmos1q5vy4nwsj6ht80xffmvqhdpywlatfwextw9u05", "1100000000000000"}, - {"evmos1q6fe9q3f4y9272e49x8kss2ty725h9469rjr2v", "1100000000000000"}, - {"evmos1q6v2c5lr494wt9rvl8husn67r0gptzv9ts3zuq", "139893009826085027840"}, - {"evmos1q6zwt0hr7wa7re5y2ky8vxvaqmvswds5zfe352", "45882504083542867968"}, - {"evmos1q73f398z4egpsj0fg2u55w34qxxkjzmfnlcurk", "55958203930434002944"}, - {"evmos1q7eevgm0v8e9286wjph76yw9mual2jecm7w98a", "15801363488414053888"}, - {"evmos1q844umx83njctcz58dk3luxxvvd5pf36g0rmlm", "143807610961802395648"}, - {"evmos1q8jm4ygh8796fq606vrrh7xh0q3n0rremr8akx", "1100000000000000"}, - {"evmos1q8m03jvdywr77nef4d2lakvnau9k2ca9cjvyke", "26661704354552325386"}, - {"evmos1q8mkrqzujz7g40a02pq8tt7msls7thqg2um5td", "101000000000000000"}, - {"evmos1q8rr39j88as8kttm96qzxeufv677qdx8dl3c7w", "19825487153828457232"}, - {"evmos1qad3fr9h6g4zruktwusxv7yl6qyjyekpx8e28n", "1100000000000000"}, - {"evmos1qausja633dw3nymnmmqxzl8a9fppt5tmfcu7sm", "27978601965217001472"}, - {"evmos1qaw2g3pe05ul69lm2d607adu5eq0k867unuwwz", "1763581660408326912"}, - {"evmos1qcn4nh6dkjjdh4ephuwd3npr58s8270kccdeak", "101000000000000000"}, - {"evmos1qcqp00scnwryyhcrhrrf4g4rhfaalxh2seg0ud", "2999127516759897600"}, - {"evmos1qcvz08dyk4r7wypv9ry3qjr7vl6kr5w4y5jaxk", "203680416027953741824"}, - {"evmos1qee2rvxr4a3qem6jv2ulxpwy89a37z64vtjxte", "1100000000000000"}, - {"evmos1qetknzqrt7kueqarerw6062msmjdmmncw5ug6t", "167872611791302033408"}, - {"evmos1qeuf76m4rvrk43qyhjpv90grxm735y36yzyx2s", "22138930097342970541"}, - {"evmos1qfafad07rw7fpr8gpct2f69r42px4cmhpkyprv", "45882504083542867968"}, - {"evmos1qg4vq8k02jc70x7chhvp43hnnwdlt09pyskxdq", "45882504083542867968"}, - {"evmos1qg6kp72edc3l0llzcxurm8suhcyemyuwhx95qd", "1763581660408326912"}, - {"evmos1qggcs5x7cu0xsdry24ms5k5zpka63vtsyf4fk2", "37211747387204449293"}, - {"evmos1qgz9h8cxjqrhrh0zhvetsspvay8h0v9e3x9ux8", "1100000000000000"}, - {"evmos1qjajydgn4almcagvxwwqwerlq6wlmwlc4ggvvn", "7341409621390545866"}, - {"evmos1qjtkn6zsd2ls50cvrvnceuej8rykzgh626575n", "2000000000000000"}, - {"evmos1qk4reupu5swvjxtdwmxdlutgke6xsj9jjj8vhl", "45882504083542867968"}, - {"evmos1qkz3g6yzv6wt8dfethyrct0wxlpg8ewfg4j4fn", "1100000000000000"}, - {"evmos1ql88y5knymnpeu6rq8379683jgyxc5mztydlyy", "1100000000000000"}, - {"evmos1ql8ya840ma8swpn6waedmxt5qmh97l678ffrq5", "1763581660408326912"}, - {"evmos1ql9mpu55nf2uqtw8jd4tddgg3hfd0yuttdlcsa", "21000000000000000"}, - {"evmos1qn8sr2hzmktlecusdtxj9hwj0upnm0jf2h4wev", "100581024300132492045"}, - {"evmos1qp4nt8rkavfd25pqw0eduzdmrrp6qz74g3xew7", "4880281612404731904"}, - {"evmos1qp9an7skkwehea0yvxd5x359atx9jugqjm2ldg", "2000000000000000"}, - {"evmos1qpe920w3m2ntkptts254tgj4f5l5xkmmx2vau9", "9451000000000000000"}, - {"evmos1qpyjgfaghzx0yukf05j6rcwzppr8u5nv6wjy78", "1000003193661462"}, - {"evmos1qq376wrhak9mzhjtftck3vt67880t5fuxt67hm", "55957203930434002944"}, - {"evmos1qq7pf2ewyh49dehpnsa2afd8gsac6z6s7crr3n", "1001686630293505"}, - {"evmos1qq8946r7c8xzfkln7cvk6pe0ezpxgvl35hm45c", "1100000000000000"}, - {"evmos1qqe2c5m909426myqsu93ejy3w7phz65h2kwvde", "1001689824732775"}, - {"evmos1qqqqqqqqsyg9ll2rjffqm5fuf3cdjhge6z00jy", "1001702606381564"}, - {"evmos1qqtagkqvnqmkp47n2h8v4k4h2mc3nlfcjz8qvl", "1001696214778613"}, - {"evmos1qqtymw728pd4mtfqjn33kk4x2klqc659276t3n", "1001696214778613"}, - {"evmos1qrs5h6sh7n54r7mft3f2v6e598d9tgghjqx9tu", "1091251819307571600"}, - {"evmos1qssqdml8gdk3we9jgqlhpwp5laezs9ake53jxx", "32754899695456394496"}, - {"evmos1qsyld8re4r6s2hn5yx6n4uu7x3e4lw57yln97g", "1100000000000000"}, - {"evmos1qt70vljdwnrgmzw72p7v2kqdtrvwhrvr2auv6s", "129818309979193884672"}, - {"evmos1qtcaa72w2qrr5v4vmf97sxy0rvahhhx98y8wkz", "59582174715046614016"}, - {"evmos1qu72hklsk8wh4uhc6rl043n7nlurcgt6z9r8gv", "201000000000000000"}, - {"evmos1quuqx8wex2wug3fwyp5k4lxjxnuv7affny6sgh", "1100000000000000"}, - {"evmos1qvls22zgxh0rsfvc5f6qzcu5nfmyjefv2dsfwc", "111915407860868005888"}, - {"evmos1qvmy7a8wxnhcjkn9jcx2ga0efdj9hgq7cxss3k", "45882504083542867968"}, - {"evmos1qvnln406t4er9cztt0t6f25qxl50tjzdqxchv8", "45882504083542867968"}, - {"evmos1qvnuyntwqmhl06wsy6zprm5n7ug9fufjf2dder", "118774181924222709504"}, - {"evmos1qwcq04nmwx2mj00cp78pamxpg754tdwclcnpr0", "1100000000000000"}, - {"evmos1qwf279aegc43uswk33x9n00e4q5f55keq7zkad", "4604689509784046147"}, - {"evmos1qwqzf6xt8vw29sx3cvdefck77w0qx8j44uzyz2", "45882504083542867968"}, - {"evmos1qxh8dfj72vymqnqamatdn5e8zmun5ggxh3uh35", "259637619958387769344"}, - {"evmos1qxuq07ucwz4lpra3z66mqr0a4ucwyhyjg7pgxz", "61933872633840044065"}, - {"evmos1qxwj20e9r2yp33ktny8r0e8unz9w0n5apqzz4n", "1100000000000000"}, - {"evmos1qya2stl0xfrgl80xgyfpg4xlkltjz6x4wzh8ms", "125101000000000000000"}, - {"evmos1r45sz9ad4k03988jsrr09x9tnxz6avtll0zcjp", "91766008167085735936"}, - {"evmos1r5dgsv0aka0dnuadvq9362lucd965jn320gne0", "1100000000000000"}, - {"evmos1r68gcy0x0s8jpnsfrh7y4cqwq7n25t74s7xdkp", "101839708013976870912"}, - {"evmos1r6gwwszv3j3nx0vxhjqatpjyn2v627g6mvhgqk", "22131000000000000000"}, - {"evmos1r6w0xwdxdzjf8at3y6alhulh00e0yn7jv48u5v", "1100000000000000"}, - {"evmos1r8z2h4mqgmmq4plas78kf9u8f7dvxrpgsq5js3", "55958203930434002944"}, - {"evmos1r9w06kfugw2q2qnvejaaeuu5hsfpker4q8syvu", "1100000000000000"}, - {"evmos1r9xwzwhgdj0khym2fehgk236cjeurl7vcm8mgl", "1100000000000000"}, - {"evmos1ra03wctunalswfk6zxsrejc630gcl7gmfrjg4a", "91766008167085735936"}, - {"evmos1ra58luq056cvu7p9a8usae8stddcanhxkeu2c5", "1100000000000000"}, - {"evmos1ral2g0fg8580jphwjtw74kyr4rc83j7fz5nrxg", "501000000000000000"}, - {"evmos1rc974c88hdhhhuj498y6aya0wf2c3s84g6lrjn", "1100000000000000"}, - {"evmos1rce9njhev7wgds4shqyyxtry7ve4nw4du9q20k", "1010000000000000"}, - {"evmos1rchqnms04hr0cdlz27l27u6cttj63esrj6xv9g", "73861106048759869440"}, - {"evmos1rdrxhqy8twu3fj6g65fhpeq3gqlplcx4mquptk", "1100000000000000"}, - {"evmos1rdv65rxwuver6rrls5aezf8acsg6a37905l0mn", "600000000000000000"}, - {"evmos1rdxmy9hfyy64wv4mzk2t97yrzrdr9nyunurj4c", "12614614164533301248"}, - {"evmos1rej5x6kfzxc34xzcdz9k8hyzht9hw99ry977gd", "1763581660408326912"}, - {"evmos1rf58lk66c7cscl5j4jje5gz7e74qnu8q9ldtd2", "1100000000000000"}, - {"evmos1rg37almn20z7dx26d4mf2leguq8rvg8z5jxd67", "5557697216848218368"}, - {"evmos1rg6gn852ph2jme6s29gjv72d9svnlpr4lqv5yc", "10437645226557574718"}, - {"evmos1rgp8zh8kpuz5fhhakem28llwuugtqsg4zc235s", "51000000000000000"}, - {"evmos1rgsdrrp4dcn0xnws07gfun8kks4xn0kje6yd4p", "11000000000000000"}, - {"evmos1rgsk3fffwedakrkdzvf65h9zjsvhp7j0sa7yxp", "125101000000000000000"}, - {"evmos1rh3wvgsa4k6e3ugegtj22vkvwf5qgtz8n3jepq", "91766008167085735936"}, - {"evmos1rhrc7n0ca9sh6r640dydkyjfa5a8v0v2hmqd8s", "1100000000000000"}, - {"evmos1rjkn4meym5eagvup30jp4xrd3smwtgh890f8dg", "1050000000000000"}, - {"evmos1rk30yzpc28a00xas2nlysvsxek7z9hej7pqge7", "1100000000000000"}, - {"evmos1rkldxdtwskjtzc3thpwlgx0p3q236vu26380sa", "1060319770000000000"}, - {"evmos1rkze8yh3rpdjcem3r4tv87h99danz8c7ff9wlm", "44192586564167670552"}, - {"evmos1rlu0u3y52tz4e78k72z443e8s3mqgaxzg5ycyk", "54413635288276063232"}, - {"evmos1rm84zst5rtjqxdh6w08ash8chvyvpr6kd2ggyx", "61000000000000000"}, - {"evmos1rmaatcegxky5shpcs4j5jsr7gplc8ryl2yz8n7", "3918230495582281728"}, - {"evmos1rmn9w5jh73tg24z5dhqxn7gq6zfn5qduntmkup", "55957203930434002944"}, - {"evmos1rn4g78ggmsga2q9yt40gzvr9ckgruzvc3jy9zg", "1100000000000000"}, - {"evmos1rnlnk76wmz6cae6k47922nx0m73e9zarhyk5nv", "11000000000000000"}, - {"evmos1rnqwu3da6yx4rl8060ns477p5gt538rtxw8fz6", "301000000000000000"}, - {"evmos1rnrfaps8yruynrg4xpuqlf40vsxej9h3dcfyqm", "1100000000000000"}, - {"evmos1rp7ncx6c4z80sd6tlu5vnxyn4v66z95sgl38ue", "61000000000000000"}, - {"evmos1rpgzpaa7mk5704cxyf6a7v5hes4mc6exdw4kkq", "83936805895651016704"}, - {"evmos1rpsnrxm3n29v8jfez5sxd6lw6qaw7jsz54vxrh", "1100000000000000"}, - {"evmos1rqddjg3ccyg58gawakj2cxsjutsw3zsqv2amle", "101000000000000000"}, - {"evmos1rqgzcca6g5f2un4nm3zvskcusnxq6nw0r3np8h", "27978601965217001472"}, - {"evmos1rqlej06nkzla5umgsjt8n4055v0vvzv4mgza2y", "47646085743951194880"}, - {"evmos1rqsnk6xzxrghghcswydr2rf9h5jk9pfm9jnyda", "1100000000000000"}, - {"evmos1rrq9tl87mmsh99zpqr44llnv2pv22r3ru4wlny", "79589576565445982976"}, - {"evmos1rrrwvlufx0cnmgqmczdtf8n6ch4g83aylmdcs5", "73861106048759869440"}, - {"evmos1rse08e3r42qegcc8uhw7gjm2sjznzg6z6j40tn", "55958203930434002944"}, - {"evmos1rtftvyhc67sfzxd0rc3a0ahe9umf6m9pn03rxs", "106788385920111059352"}, - {"evmos1rtyqsje9pczskzxfsld4frwg2a4uu6kxaa24f7", "1100000000000000"}, - {"evmos1ruk8u7dl6jkxca40gxsg8wfhwwukxyyvk2upy5", "1100000000000000"}, - {"evmos1run67zad3gk8cw8x3a2gw9hy4sqr5tch8x9w6l", "183509000000000000000"}, - {"evmos1rvp2netkgxeeszzapezflmd7rur6z9gy938cje", "1763581660408326912"}, - {"evmos1rvvhnafscz5nc6840aqje9alpl27dyzxp53pvw", "1038461538461427"}, - {"evmos1rwv23494f2fwdyf3r5v9cwd49cfu72c7tnhfr6", "1100000000000000"}, - {"evmos1rwxnmg5290xlh402n95su9xqhxmm38lj2e7q6q", "501000000000000000"}, - {"evmos1rx25d2lp9sn8jk90nk088rlqmnp7vqu4jcgghe", "101000000000000000"}, - {"evmos1rx2z5ye5zzvwfn6tzue6h6v7t20pv5rn9qs0uh", "1145822871754935235"}, - {"evmos1rxk5zw7276yek44ag4dteyuw9a2xa6qualw5km", "111915407860868005888"}, - {"evmos1rzj089gt8hq6qd9p8elp7knl0zslv0szlg9a9z", "1100000000000000"}, - {"evmos1rztefn7kv9jj7cmcpx3d3fm5upnzwc3s8gkyyy", "167872611791302033408"}, - {"evmos1s27zyjjlye0cdvctxr0qzkfyfpawn2jj2wjkns", "259637619958387769344"}, - {"evmos1s30pmshzhzw9rsnveuknteaua48470r8gm7zzc", "27978601965217001472"}, - {"evmos1s369k5x0yh2yacn6wxwan3evk7g8fryxzxpmql", "2179769409713486735"}, - {"evmos1s3708n6hj0t0hp2nx9av8ctkwrjsqhpt8gvv62", "1100000000000000"}, - {"evmos1s3nc9tx87gpmsuy54j5y2cl6wxj09jnppq3ned", "1100000000000000"}, - {"evmos1s3q985fsl5qa0rfekky6f06vw3j9az8dsq2dq6", "1763581660408326912"}, - {"evmos1s3sz9c97p2g9es32y9t8cpxtew9yqwupaamcpy", "390941706872820838759"}, - {"evmos1s3zjqt70zddwuy2pxpheqgd7gf67yurm2nj75q", "1100000000000000"}, - {"evmos1s4mm00d99xjqgx0xj757y0pt3nzqnl8ens3ew5", "1100000000000000"}, - {"evmos1s4zjj8w7sm6qrwelqddj9044rymvymnlcj2q63", "1100000000000000"}, - {"evmos1s5eh089zcnj2xz5lt8ktnu0daa0yfyssjleqmr", "1100000000000000"}, - {"evmos1s5syzkusyf7egqgfj9mav5qtwvyxl94s5994pd", "55958203930434002944"}, - {"evmos1s873tpwszsuph876utd2fzvlphqx55dfd0t43q", "25522100586818602528"}, - {"evmos1s8fazzsatjp0zelzg4uje9394wslyne86mfcer", "305520124041930620928"}, - {"evmos1s8ynavy80lcchx3fu8qs06pv0k7w9ak3vvhjup", "73861106048759869440"}, - {"evmos1s9r23lj9u636yc5sj9ph569x2z2knmu38w5ndh", "1100000000000000"}, - {"evmos1s9tp9q2a07cpk852jlly5zvkuaeytga2a4s6ke", "11830916114326095802"}, - {"evmos1s9vaun96mcu94637czjwuplcrylhy9pxjxg02p", "129818309979193884672"}, - {"evmos1sauffvc2auqwqnklhjzhmvtlak690x7u7k2hfs", "21000000000000000"}, - {"evmos1scqr6w6z60sunz6d56amuwnmr8m40fh4q779qk", "1100000000000000"}, - {"evmos1sd8702a9qas3yt07gmvfn3wqe3tmmymj3hg2q0", "91766008167085735936"}, - {"evmos1sdkl5p0wzejy5a7t334e9ml7dprh8hp2p083yn", "1100000000000000"}, - {"evmos1sdy90khja7kxkdcxnd8dmps20zzxncxtkeyfgm", "265796718669561511936"}, - {"evmos1seelr3g5240t6cgtsnjpr9kljfsdphexw4yhza", "1100000000000000"}, - {"evmos1seqy4z0pfnf3hzxd2sepxa8vtfrads3dqk30j2", "3526163320816653824"}, - {"evmos1sfducwsrt69dezxk47en336cq3n94qvchudx2c", "1763581660408326912"}, - {"evmos1sgtkl53fvgjnscahnpknaf6dxxe6cutvzretkp", "399530629784472748032"}, - {"evmos1shwphmr3t6rfy5nz8ajy7ngqamw46a5k98trhc", "259637619958387769344"}, - {"evmos1shzqjsr5lyvvhlkhzwvvv82u0n3dvueexgk2td", "1100000000000000"}, - {"evmos1sjqaxqupsayax6geqckqatwus9r9wkermh46ep", "27978601965217001472"}, - {"evmos1sjrgqq2ls2guwz0f4w6s5vff06hsyj2p982j7f", "91766008167085735936"}, - {"evmos1slvj4n7lw8s658drxylkyf7enw3492hs0su8rc", "27978601965217001472"}, - {"evmos1sm7cacku55ememm3hpu2nwzmq9jgdwxalhe5sk", "1100000000000000"}, - {"evmos1smeh4shl34sew0epwms9ncytfm09pefh4xxw8p", "1100000000000000"}, - {"evmos1smfdknuml7vwe2602mqx6jrpmecwafn7qahzm3", "1100000000000000"}, - {"evmos1smnd9v9w609mfa3486h0evskrw0u6cygsm0wha", "101000000000000000"}, - {"evmos1smqgvwjx8skaxjh6ww4lfqrvx36kvdwlw8gpd8", "55958203930434002944"}, - {"evmos1sn39v03z32hqm7uu53kyhclcq2ulycyaarvnt3", "101000000000000000"}, - {"evmos1sn6qfu2r7zfkt25kyjkx2kq82477muff52z03e", "73861106048759869440"}, - {"evmos1snqjq4e8mnmfnp5wchnnpfc0wgv8hqc3uvc3cx", "1100000000000000"}, - {"evmos1sntyeysenarm7nmp0y66kuye4v5dy8qhuspzkc", "1100000000000000"}, - {"evmos1snvfap9vrcntx5zlurypyg38hm32mpfpee7xll", "501000000000000000"}, - {"evmos1sq750u8stvtv4hdte84605ewkvgqjkfnyj6q84", "45882504083542867968"}, - {"evmos1sr3he75l692wl9wwhhtnsyt500asq3008svj9v", "45882504083542867968"}, - {"evmos1srq742nw9kcladctmh28rlhfv02l6v39h2acyq", "1100000000000000"}, - {"evmos1ssafaj6mu59pmnz5ztepkxe04ds23zu4fktdcr", "5684307201828358144"}, - {"evmos1ssfu3h8t7mzz0ufryyj7dxrcrz8yfs7tjc3lws", "11000000000000000"}, - {"evmos1sske8xyunc302mx66ljy9t43fmxgkxujk9h9c6", "21000000000000000"}, - {"evmos1ssyfplvzlsmqes29y3uqcdpx8tgnp6tkg8mlqn", "73861106048759869440"}, - {"evmos1su4cfewhvyrm0u8ru6valhptfx5pshw8ucldgx", "10662068510023556305"}, - {"evmos1svvddyq6r3fhed9zjm0vug5jd5tkwuycxhwda6", "2677519610469831027"}, - {"evmos1svxqmmtvv70rey2c3x6gxqr08lc0zqnuze8h80", "92551612136008479868"}, - {"evmos1sw3u8u2x9kjhf54un7h84522a2l7g7k6q5yk73", "101839708013976870912"}, - {"evmos1swes8ptttsgglfx2m9zv6hr3mjltpgrzxyjkx8", "91766008167085735936"}, - {"evmos1sx908ckepxjsk4kxr9r0j8g8hj6kla3qhmzqfc", "1100000000000000"}, - {"evmos1sxk4st7m2v6tg27h7fhsjutwspmjdlfm8kh969", "45882504083542867968"}, - {"evmos1sxk8gsf48avu8p47xm96aa0sctymfhd6eehnpq", "10474114058185516294"}, - {"evmos1sxtwqeyvk9hfz5wzjgrp3fvxq4cxkkpk9x95fn", "1001000000000000000"}, - {"evmos1sxug4mcc8m9rpx2l3ygy4lpruk2khr5c756kqa", "343573425854038770664"}, - {"evmos1sxuqu8mywzclfzmrvmnjkxvyp4nqphfwxymmc8", "1100000000000000"}, - {"evmos1syyq5l5er0xamw5vyvp2wr69667ndx447dfx4n", "201000000000000000"}, - {"evmos1t0kddtj3yftkmkh36gejfsa0xzy9q838u56dv7", "115440571181684659712"}, - {"evmos1t0u62syhm2538erhuz4e7jzej0h4k9c0qq2yyc", "1001000000000000000"}, - {"evmos1t0xe03t796jgl77rxxa6mz407wmt2kmh55xm4s", "1100000000000000"}, - {"evmos1t24wly0e80jdayet3eejf2alnund4fcxwqh2gq", "17694112238831868"}, - {"evmos1t2h0jzu249wwry4tsnpc5hd64qkrg0h48nf6m6", "96802358090531295232"}, - {"evmos1t2q95qnh3zpx688k7p7gsz3ndqytqle697xqv8", "1001000000000000000"}, - {"evmos1t2tpxt9qu3uhjgrfaveatpmqafl26l059avajn", "4001000000000000000"}, - {"evmos1t3cuwudcyaql5jf00h6ue6r4k96a8sj7a7j0vf", "20304025390234726390"}, - {"evmos1t3e9m0me47y6vx7hw3r5yfkpqwg04umppcv89n", "101839708013976870912"}, - {"evmos1t4make4k9zjdnj2qfnqzcm44uphqpge4zydpl2", "21000000000000000"}, - {"evmos1t4v76c6ej760hyx06qtl56x42w8x9m5qg6u98a", "114028835664608449536"}, - {"evmos1t4w5rd64pj982sftclya83mh2qev3py5f3200h", "1100000000000000"}, - {"evmos1t50mmjsmdtnxwse3l2tvwckwhqpywvnjktmuw9", "73861106048759869440"}, - {"evmos1t52zuj4zdmy0mhx47fwwsa9famxt7y0estccey", "1100000000000000"}, - {"evmos1t59c5x3x374lm5gzn7u287ne5npx2hvgccqq6g", "138179909011073916928"}, - {"evmos1t5j79tz6w20lhxpvv0ynlxtznxwe7d3sg84fd2", "1100000000000000"}, - {"evmos1t63eawav09qqpafgkw39el4sxp8s5sc2qwjrve", "115829008996585381888"}, - {"evmos1t67sxq5d298ajh2s5cq3mdvtssfxtl0jp0h3hv", "55957203930434002944"}, - {"evmos1t6akuwv2hxtyf64834zjfu7gtggsw0latjp2f8", "45882504083542867968"}, - {"evmos1t6gqwpm78485dz52tgk7jvuuw2xjs2zxql4x66", "1100000000000000"}, - {"evmos1t6tma84prt8zdyhmc07vz0vjktwksrktdh36je", "201000000000000000"}, - {"evmos1t7ztjh4ugz5lzmhrzdwdavd7w50ts8qm23kyyv", "322171000000000000000"}, - {"evmos1t9kehp2eecx8ne3yk3s8ulpfsaakttane8h5mu", "1763581660408326912"}, - {"evmos1ta6qkr3qk75uh3fq7act4wlr9qzr84uq7k69aq", "101000000000000000"}, - {"evmos1tak8y953d5ca5mhpmksq83z80aplvetr64p5xu", "1301000000000000000"}, - {"evmos1taq8t9l3ryrt52hahttwkmlmrccllnl8588dyt", "1100000000000000"}, - {"evmos1td3jkgc5nvrd5zakk8nq3v3w9m4vyxvprfh5sf", "6157312822891154432"}, - {"evmos1td3lhuuulz3fkn8p77tn5d5zhcpvcyt8pk22kf", "1100000000000000"}, - {"evmos1tdjegr9mpa66mq2873h7fxv9t82m07em0g8qav", "194727464968790810624"}, - {"evmos1tfgrf8hvf6ykrdupyea0mhzxx3upct66lpc6mc", "1010000000000000"}, - {"evmos1tge80lwqfycgxmp340frp8wx6gp03mctewgkzd", "83935805895651016704"}, - {"evmos1thc5pvp8twscyasw8mlwqrc7vs6nc3e2nrawny", "223829815721736011776"}, - {"evmos1tjd9nr808ssjh50cp0p8smcjt0chvvnfdhxutp", "11000000000000000"}, - {"evmos1tjdr9pzc4neplqegpu3je6lpwrns8u3d2z6p89", "129818309979193884672"}, - {"evmos1tl05f3du80fkrjtfpc8hjh2zjdw5ez3ahj3hne", "91766008167085735936"}, - {"evmos1tl52wegru3pp7tayv647vsqvrsh50l9xmqgnd2", "203680416027953741824"}, - {"evmos1tlaea2had6dyw3z6xyj7sjkgfsqhszh5qck09k", "45882504083542867968"}, - {"evmos1tlap7y3vjffcvxfd244t48cqcrxq8xp5qzj989", "27978601965217001472"}, - {"evmos1tll4c2jaz8v8yk6wc0nvs9fhhnyn0ddzytdkgv", "55957203930434002944"}, - {"evmos1tlmkm2dmgwpp6nkmql4cgr2y5glet2xewmghgf", "12276200167597400064"}, - {"evmos1tltg2hvs44nhpvj2w3aty2z9c4hh5gwphrecrt", "3916889595887597612"}, - {"evmos1tmjn388srvv0m5nsl8yp994hrt5pwp8r420exs", "129818309979193884672"}, - {"evmos1tndk24ejk6c5pnrxlwv69gs97fm3vh8n2cafwn", "84833408530960673558"}, - {"evmos1tnps79ccz2hcvchjqc7ys5kadeg9uxfgd3xfgy", "201000000000000000"}, - {"evmos1tnwxa9qex9xqkj0d2cup3pcp32k4mgaunda4q6", "45882504083542867968"}, - {"evmos1tp0hfx3d547aydtw3cxc333zjeuzkxx0hx578l", "1100000000000000"}, - {"evmos1tp3zyzghu5wquw3qkx33fs5y6ql58k89elndv4", "11000000000000000"}, - {"evmos1tpn0dd6vzc86du09e3jx774hqtj8w9fgd4amyw", "1100000000000000"}, - {"evmos1tq8qvgxqwre82s3fc6utf5q99pwlmetjq35zqu", "1929000000000000"}, - {"evmos1trjj7hu0tf2e0g882h4rscsrjr3npa9g5f9kps", "91766008167085735936"}, - {"evmos1ts2xe9emz6kz205l5h3gl02h9sgzg4zyudrn3q", "27978601965217001472"}, - {"evmos1tsrnd2qzy56cdl924qqw7prqhyem482yal6n0v", "1100000000000000"}, - {"evmos1tszye28wh267nq4uv8m47mxwvaee02yeuh5gcm", "1001000000000000000"}, - {"evmos1ttex5e2p3sjy53meg8df3c6yjnsmrqn6se9chv", "55958203930434002944"}, - {"evmos1tth6pwgfutgc25hcjams8l6fw53uy67kdn90mj", "32064370094504340992"}, - {"evmos1tu09kdsprnxulpj4a8vd0ds05csgx5dwkpc4yg", "101000000000000000"}, - {"evmos1tu70q0j4y8gv8qpd4e5dcued4vvhf3j2zep3gg", "203680416027953741824"}, - {"evmos1tug4pu2ck85wlj8jkw2ezfsf98me7y09anuhkq", "201000000000000000"}, - {"evmos1tuk03pk4xja65g7ysnh2x8q59dgaf6ph5e8zj4", "75264706217913389974"}, - {"evmos1tun6d8v6e8e727p4n873059n4znvccwfl2fj7p", "5001000000000000000"}, - {"evmos1tuy3pmqhcr5la32xcek23f9pstdphkka0f3kms", "91766008167085735936"}, - {"evmos1tvlqdf3t6t5cphd9a6ty9k8h3r206k5g549gl5", "1763581660408326912"}, - {"evmos1tw4v0kmj6kkdsykrugyhaehduc9fy093y96qql", "1100000000000000"}, - {"evmos1twet4kyymgtjfklv64fvnfs5kh3m20j03mdzfa", "1100000000000000"}, - {"evmos1txa78aejkpd08hv3lh4hv4fuehmcgp292fphmy", "19298423772196870656"}, - {"evmos1txz7ww6mrqgrmy5fz7m9xljd8fzxams694l609", "111914407860868005888"}, - {"evmos1tyfjsz4yzzyqw7203u7f35hmjn3wflwr2hcqen", "3982818366074575872"}, - {"evmos1tzeckytpqm0a45xl58a9rp98ya5cuudne8dttg", "45882504083542867968"}, - {"evmos1tzjp7wmfnq6f0209zptr8g7y6a2u5j6syhhpxx", "1100000000000000"}, - {"evmos1tzjxtd3cnky5pmg4l4c3h39x9jzaa72a4cmy2l", "55958203930434002944"}, - {"evmos1tzkj8uttz23ykathqp7wum6jnlt2qyr57wnmgx", "1000100000000000"}, - {"evmos1u2jumj4fwp7k8va7nzpktqh6qzh5vsmkrt8sn3", "11000000000000000"}, - {"evmos1u2w3xjpug42x0c49hcwe3az5vf64atse5sfuej", "83935805895651016704"}, - {"evmos1u2wnjkl6g4v4wcyw4nzdt03zjpz5uxc6p3mqg2", "223829815721736011776"}, - {"evmos1u2yv2l52mr9cxay4dayk7qdu76g9r22vm87h7w", "1100000000000000"}, - {"evmos1u350867q8fq2dvdzr737ec5vsd0443kz85uasy", "21000000000000000"}, - {"evmos1u4h8wxp73nz3262mh9w7ep4glwqtcx9ekqdmqm", "27978601965217001472"}, - {"evmos1u6064ejceau5fckgrqpnpldx04jqr8gaekudjg", "1100000000000000"}, - {"evmos1u62l7wr4jdmkv50xl45s4cencsy923p9synlfw", "1100000000000000"}, - {"evmos1u66929damk9stz03f280lak4eqsk8ctx294kdg", "45882504083542867968"}, - {"evmos1u67c9t5kl9d8gm39sudk2ae7k6ke0w584kmch9", "101839708013976870912"}, - {"evmos1u6gjs522msku2m898q58nhu7564atdul82ekg5", "73861106048759869440"}, - {"evmos1u6k2nfu4ppwknt3fcaugg45s9yu9rxx6ceg9g3", "101839708013976870912"}, - {"evmos1u6mfyrqf9ysl7l7x9qc9fvth25l8ugdcyr29g0", "45882504083542867968"}, - {"evmos1u6xll5cnf4rfnwvrxvtl5xtrj5h4yzrhgg3fjv", "46304317134633676254"}, - {"evmos1u7h3z0autkka2rfks7tpcatdve3dt9pzx8r36y", "27978601965217001472"}, - {"evmos1u7nhrdsan8xdj9kg7sp2gkuwkjd98fvzk7ktmd", "1100000000000000"}, - {"evmos1u8m744qdx0h0xrw0zh44alz9gzgqr24cd86c7g", "6618620540102264320"}, - {"evmos1u9mm69eguuvzh0hk293cu3d4pqeq9d7jdfm5yw", "45882504083542867968"}, - {"evmos1uad6vyepuhfq8a9wem7l4kx9vvyey6n5hfmlt6", "91766008167085735936"}, - {"evmos1uau8x9hanmt2m3a3aef79f6h5jqp8ucpfzv035", "16746084749958213116"}, - {"evmos1uay9lpec04zvhprgsy37fzf2gqvj9nzu0736p6", "6858217020445474816"}, - {"evmos1ucqnc2z54s6sjz6ewgzq7mal6sjmqyvuucs7vx", "11000000000000000"}, - {"evmos1ud9wukv7n5ylu25pfaad4lpgkjpy7jdc8snqsh", "2001000000000000000"}, - {"evmos1udpfsexvucs935pu7xzpnw8553d3cqt8uttkjq", "45882504083542867968"}, - {"evmos1udurdsyqruxrgh0jwxef0nqk3jh6f69eszzepf", "21000000000000000"}, - {"evmos1udz7swn4v9z4j05m2ql3qjmknh4xm0rxdru249", "1100000000000000"}, - {"evmos1ueflmhf55vkeqt2a0ykwjkk3xu3kulp4nfzxff", "82364171788702286912"}, - {"evmos1ueyekd4alee0et53p2zjyx2ua9trqczqg7zhl3", "1100000000000000"}, - {"evmos1uf28jl8fus0w589cyey4ah0ffuevxm9jaqvwjh", "45882504083542867968"}, - {"evmos1uf537ftjkfh2jh9clpn8u3hv49kvr7nj3t7839", "1100000000000000"}, - {"evmos1ufmy0qlvxxy0dedfk4d8hw6hj70ynk9408gy2j", "1763581660408326912"}, - {"evmos1uhpkteurd69s6c0t6d48luy6f3n7972axljkg7", "49843203437885664256"}, - {"evmos1uhw7zapsq5xzrxux2df9awpjs7rhjq56hxz05j", "27978601965217001472"}, - {"evmos1uk6yp4wcwg90wg0ln8capj3znl92cm7wr8qynu", "27978601965217001472"}, - {"evmos1uk7zvtyhpqk60a6ayzgphdz97x023fz8g5allg", "45882504083542867968"}, - {"evmos1uka3eel8ca3j8wqz20pdjvuscrvj9uchhtazsj", "6045000000000022"}, - {"evmos1ukcrahhgdfjfk2hjksg6sv7ezl74j7hl3xvd8m", "73861106048759869440"}, - {"evmos1ukhv5h7haw4v5awshrzkly07npmgsf4gn6qnpv", "45882504083542867968"}, - {"evmos1uks7drwhwww20g838w3kjmlz4quladgenafy5u", "203680416027953741824"}, - {"evmos1ulsx44auw6sxg6jteuvgx9ggv4t37s3ugd08gm", "45882504083542867968"}, - {"evmos1um8yq66md4ple534ly5lkmqwtt0wp4jyh92ddd", "11253462131733849088"}, - {"evmos1umfdl3aerw3xunvsk2aw8fg8d75x6uxrpde862", "185775513909627895808"}, - {"evmos1un5y3j0qsyeaskktrngf7ccm8hh9gg66lnrgcg", "3339468867083803648"}, - {"evmos1unhe6lgaet4kr6arygn38mh33ars8s76y7tazu", "1100000000000000"}, - {"evmos1unlc0aexe6lc2szlg9jzw8tjncheeskjf6zzc8", "1100000000000000"}, - {"evmos1unqw7y7wnvwml98uhxtd2krgwnflu9jjsujr98", "45882504083542867968"}, - {"evmos1unyq45sy50zjrwlcpt9nfy92hgagjwrnv5ytgs", "1100000000000000"}, - {"evmos1upnxsuya3xjuclyt73me8v48zdhm8sfxxvfdym", "1001000000000000000"}, - {"evmos1upuu9zssvjl8a8wk8p9wp5x29q0qexxk09xul7", "2001000000000000000"}, - {"evmos1uremtaugej7pkyqdkuf300w5gkt2sw0t8whswk", "11000000000000000"}, - {"evmos1urf6sftdpe7lxyhgkcgwyw4sfntkt4w0w9jsnc", "1100000000000000"}, - {"evmos1us9mh5008mc48ct540fjygmktl5xh2rluumutr", "1100000000000000"}, - {"evmos1usr8kwpm8c5pxxklkvpun0vhfjcg8q7kv67rtw", "45882504083542867968"}, - {"evmos1ut4nmmkcx4h3k56wzr55kz4fya9ukcv8j4knj8", "147723212097519738880"}, - {"evmos1ut5c20d5hnc3m63r7wzyt4lwlzl7y002txeysp", "45882504083542867968"}, - {"evmos1utl6lx9n38aupwtwkajklw6m2y5azw7f94l3ck", "259637619958387769344"}, - {"evmos1utqd3zz0tn6ay6jlh0vpwx2j797crsqa30kalc", "55958203930434002944"}, - {"evmos1uw2watjre49qp68xeymcu250sj87cd22yrgsz9", "1100000000000000"}, - {"evmos1uwc03ux07a5wxx6twk20rnmg9a79zyeekhlav9", "1500000000000000"}, - {"evmos1ux5y4w9xe75yuvyvsca3u5pyh2c2939pjwxeu2", "45882504083542867968"}, - {"evmos1uyrp4hsw8fd8w23edc3x2h3crwf0uuz5hlh2nz", "3526163320816653824"}, - {"evmos1uz23nwsl40m945muxmn3m0rqwsqlt2vnp59r98", "21000000000000000"}, - {"evmos1uz4wtx83k6vaj666tnc7jg6hd3gmgsd9ct373d", "85071186034764043809"}, - {"evmos1uz54u2ww9qva9nj0vul02wl7pndgq6qyavqcpj", "1001000000000000000"}, - {"evmos1uz8hqs33ke6qc75xukg3272c3a2ufzyqyu5uu6", "80557037697149606912"}, - {"evmos1uzj09q0mmhegjap8tcf7yvxul8dx3tud39ktc8", "203680416027953741824"}, - {"evmos1uzmvlzlr39x8009955f6mqhvdsx6h4tqm3pxtv", "1100000000000000"}, - {"evmos1uzn7qu2mvhg9xqppqgrsnga86g0e6srreve2t8", "401000000000000000"}, - {"evmos1v0wuu9arxxy2dm5yvnydvwlzqn89ja2kylnk9h", "45882504083542867968"}, - {"evmos1v0xyk5xyjq6p4k9m00arun5j7zwy23gznwdkjl", "66929253172081787986"}, - {"evmos1v38s9gun3p4naqn8tvu9alzpuaewv2nx22fhfd", "33603485164385251900"}, - {"evmos1v38w9g65v88z32l68kxt9ap9kyyr9py8f82ns7", "10628410358734847744"}, - {"evmos1v3ql2pu4xvj9pl7fzma86dcyrltjjtj4x3469w", "4799714358766142208"}, - {"evmos1v3ttzsj6jx84ca2c7qj5d20xkfr4xhepe54v0w", "5288744981224981504"}, - {"evmos1v47h40za0jqt7fym4sfe05yqsmn5vgp0ptmszz", "45882504083542867968"}, - {"evmos1v4dapjvurzch2nugzws3k08rwp0tvd8m43hr7g", "1763581660408326912"}, - {"evmos1v5y0tg0jllvxf5c3afml8s3awue0ymjuqsvc2s", "143808610961802395648"}, - {"evmos1v68y0a9j3tmu47makht83q5nurq3qmf4dwyxcm", "1100000000000000"}, - {"evmos1v6ds37zcuczclq0ulczv4hhy3rayzr2t0gz772", "1100000000000000"}, - {"evmos1v7kjxypzetst48vdw20027p5qj3hejqa656ee6", "115992848903186601094"}, - {"evmos1v8vqhz2kwequ69ct5fs26ha7zhhchqqmfnp2xk", "1100000000000000"}, - {"evmos1v8wrsznyz6la3yuyv5ynmfl9metykye2n24rr5", "1100000000000000"}, - {"evmos1v9nn6cecdlacg5cg5r954dylmkmu540wpnep9v", "1500000000000000"}, - {"evmos1v9y62xs2kr9py7r0uwh4n6qv34hy6yj879svj9", "112818447305883791104"}, - {"evmos1va3nl4wup8zexwysug2pkuu4htgcn78qfu5d5l", "50000000000000000"}, - {"evmos1va76h37hskqdq9w0cu3avgxs2vje5dkljpu9tg", "45882504083542867968"}, - {"evmos1vc938n0aq9smlmqw4ng76dhtxvrcnllvxyeezh", "21000000000000000"}, - {"evmos1vcm0m7p0grexr5yl6cv46uvvg7vls34x4j06ls", "1101000000000000000"}, - {"evmos1vcv2rr6leqdmx6r37ud8cga5h7fkytteqzkcz0", "101000000000000000"}, - {"evmos1vft04guda4jh82qd4m449fhfhk98axcwnr7vvn", "315594823888821747712"}, - {"evmos1vfthh7w00rehagvyuxj4vm2l50nvlyxz86tvq4", "167872611791302033408"}, - {"evmos1vg530u5nt6dha9phkupkygzzw3ecf9a84jj6rd", "101000000000000000"}, - {"evmos1vgqgdk7lyqz4qzt7lmfmm4eacf44uvt7fppm5t", "45882504083542867968"}, - {"evmos1vh3euf7vgepxytzzftj2vjzrj8eeyeuk8p0keh", "147723212097519738880"}, - {"evmos1vh6dpthet3e46d0p5m7nttz7gxd40rtyzzsk90", "1100000000000000"}, - {"evmos1vhnyzdyngwgh3ekara4cmkkwyhx485v7feu7lh", "1100000000000000"}, - {"evmos1vhqsuaxg52gvvzwyhqejvwfved5ywa3ncdwm99", "259637619958387769344"}, - {"evmos1vjg8989hz99rklkkjzhu8a7getk2382dg0l6a0", "171786212927019384832"}, - {"evmos1vk2y6zkwl67lnrlgefdn2r3auqvc9agj8a85na", "184062413094616784896"}, - {"evmos1vkf2hvv7pdpld6hy3v29n90zxermctq9apcec6", "1100000000000000"}, - {"evmos1vkywlwe7lxqav4mena4442gwkdly2fyhlzgfat", "21000000000000000"}, - {"evmos1vlc0crlxjkzjnzgl5czur0tgpjnctx247h54tv", "101000000000000000"}, - {"evmos1vlmvlpssr9nryc263ce5dfpmxzj9tltg6s2xee", "3962373293503009792"}, - {"evmos1vm3am8smcks93etyfua8s8gcstlsqpj3xj4a2r", "1100000000000000"}, - {"evmos1vm5gytfnt5zm737g8j0dp6nkny9pv7tval25n9", "92766008167085735936"}, - {"evmos1vm68m6p824v5ya55jkg7avytf5a6fmn6g6w34c", "1100000000000000"}, - {"evmos1vmcdv8xvmlks42r27v2lk7ec6632jtll2gj7sl", "201000000000000000"}, - {"evmos1vmnc8x6vmwp4sfee3mraxfa4ykglv0zhy0t7rv", "203680416027953741824"}, - {"evmos1vn9rvqf9y3qpxwm7x8veeuhw56lsx4hxlye7es", "1010000000000000"}, - {"evmos1vnp7jme5x0nx5lce34vxkau7huvh6c7dra6ad2", "101000000000000000"}, - {"evmos1vnxnpl5428yc4pqu0xelq2thmvy0j2cy4jkclp", "1100000000000000"}, - {"evmos1vpa86kynty8xeu2kgmk0kx0h3tr9w5pg423ay6", "73861106048759869440"}, - {"evmos1vpsss8hlrjhx0m82t6ky6n7pej9ywgqm5654w6", "147723212097519738880"}, - {"evmos1vpxkt7ahgnrhgznlh3ewrhe4e5whfys4a8pt58", "71400255503779753876"}, - {"evmos1vqnzqz7w45kdk0uncl5xa74e2ckjpq6ludmaz8", "101000000000000000"}, - {"evmos1vrl02nlwuw4q33c735xn8dayurelpj8exy74lz", "501000000000000000"}, - {"evmos1vrrgxw67d9p23ctk4apnm0yvehtc7ksgreuwe4", "1100000000000000"}, - {"evmos1vrw559yckeq229zxzlpxvhe7g80dnrj4yhgjke", "1100000000000000"}, - {"evmos1vrxrvtdg9025jqxu7uswn0zclqxx4xlvsr2m62", "27978601965217001472"}, - {"evmos1vs83na328g76vytj49pasd0503vmaeqf5sqkqr", "203680416027953741824"}, - {"evmos1vsd8mtkrufpuxjrul6lcwmmemflz3q9x02j720", "259637619958387769344"}, - {"evmos1vt2kaq9tcgvfera062sml0ug0k7ruhzgh5ca5j", "1100000000000000"}, - {"evmos1vtddm6kw3wkrq04wk9pzqnznxe7d7hukt9hf0x", "22645046851565885016"}, - {"evmos1vtmy2xgvgaqmsqenhnxc6teqyqzzqzt3tasn8u", "1100000000000000"}, - {"evmos1vu3cc4uhengptvahc0we3vdju3yftelervnzrk", "101839708013976870912"}, - {"evmos1vu3fufydntl00gmwlfax2t293623cdeyluqkkj", "89975055040279929600"}, - {"evmos1vv725835wp58tacs04w23tqya84htkj83sqg64", "101839708013976870912"}, - {"evmos1vv8078r440208rj50m4zg8z054sl02dwe0zx8q", "23590728355842933262"}, - {"evmos1vvf67knuuapw00rel6t8gvf4022ja76dpamhqy", "1100000000000000"}, - {"evmos1vwhdu5qyvxafr4g9rp8m2t273glmjqwpypf9l4", "91766008167085735936"}, - {"evmos1vx49exw9h49d7js7jge5lu2krumuv4ma5cwvgq", "41000000000000000"}, - {"evmos1vxqteydj8cg3kqv68th23puqze3e53almema38", "111915407860868005888"}, - {"evmos1vys2cp9umzmk4fn9g5754hd92jl6qzmmf7ch5c", "66437196604791536640"}, - {"evmos1vywdrd7ep9hd8rer9e5x8afjf4cw4p4hl63q05", "1100000000000000"}, - {"evmos1vyy9qun46e5c8tu3xjzvpu32xwnzgstfef2llq", "1100000000000000"}, - {"evmos1vzgkk9lckzu3jja2tm9y8dlptqaenfc56c9mw5", "11000000000000000"}, - {"evmos1vzr7p6wch97zgjpu9gkmrtdd5f7zkxqa93kgry", "5669216266706833408"}, - {"evmos1w2v3kh3ayku282qph7ma5xv8k49e9dt8ek2r2y", "27978601965217001472"}, - {"evmos1w3faetwx5k6zk69gcxtzz5a948nsm6dsqhd0xw", "20107142475486872704"}, - {"evmos1w45sxt4fg6cezrsyfvd4d3cr0mmzzpjsq20nk0", "45882504083542867968"}, - {"evmos1w4648sfd2av9f0k6x78kv39yaqss8eujymmc8g", "301000000000000000"}, - {"evmos1w5hsxvnmwtl7rk6ve34nd54v3urd9xmgcxckc0", "27978601965217001472"}, - {"evmos1w5xaz6cngvqmdsmmepj30lze7p494cd4ly3kvz", "1100000000000000"}, - {"evmos1w60kvrtx3r33txc27tvu8dn0xx6scpxcm2kw06", "55958203930434002944"}, - {"evmos1w6az8v775p0hr4u0hzw23sdghfzz4gdfmw9h6n", "27978601965217001472"}, - {"evmos1w6cuf9t2dd8y6dm6832zsg543lgwhz3hujqlfr", "1100000000000000"}, - {"evmos1w6rfx0rgejgz8zqxfllp956c7h5qdre0w9rrq6", "1100000000000000"}, - {"evmos1w8t2xcfwgr4490wd0n44agc6hau7cm368qhptw", "1100000000000000"}, - {"evmos1w95qxm8vh4k65032phjz9qekt9vfwze038vxvc", "1100000000000000"}, - {"evmos1w9fa85gphr2xupzae4mpndd5cvdf9fzp5u8t4m", "1100000000000000"}, - {"evmos1w9w7vvjhk2qd9ht7rrfr39n3dc7g2eaadjflw0", "27978601965217001472"}, - {"evmos1w9z7c4m57d99fx5yvq4qhny9axmduqlcqgvvdy", "101000000000000000"}, - {"evmos1wc06g0ny8reqnwd3tgln96d9dsr3kalvvdpvq5", "91766008167085735936"}, - {"evmos1wcausgx67g4j7u2k32nuztqta8v287mss7wa8s", "91766008167085735936"}, - {"evmos1wchpdruxqkz8yjjqnc2shxjacm60p8tuhq0c7q", "143807610961802395648"}, - {"evmos1wcpf4tljg0tmwnwld5z2j5qyc46qqccts2ep2r", "1100000000000000"}, - {"evmos1wctp55zjqq5zkr2y74uqz8gqdz2cmv5742g552", "1763581660408326912"}, - {"evmos1wdf3xhcmppmwqqxhkmhvwj7ls05gpr2yktk5f9", "1100000000000000"}, - {"evmos1weqcxdwdy3q4un9l7tyncheu8wl6c79yem72rs", "2000000000000000"}, - {"evmos1werzmsmgmwed7lmjt4je77xw2cdswl36wwxuca", "315593823888821780480"}, - {"evmos1wf6s4y9llp5afjw72qv3j84yznx6ln8d4ccrvu", "203680416027953741824"}, - {"evmos1wf8t0nk2a6whwzhev2y9v8dflh3hk3jrhwapcr", "1100000000000000"}, - {"evmos1wfzal0m57ppdajnlke06g7l90gvdfl4csgppc6", "1100000000000000"}, - {"evmos1wg9sza6f3a7shk3t3rfvlx3enp7mt99eq3xrdp", "501000000000000000"}, - {"evmos1wgaz5jx8k9cvnw3j82vdjhx6y6rt3l9a2zp5z7", "45882504083542867968"}, - {"evmos1wh7hp03fh8ztw25r4yuzz0k0z7nnyfduyp79q0", "211000000000000000"}, - {"evmos1whznqsrsr4wqvgks2fyuftzfq46wdjwl5khvyx", "34345793992653157723"}, - {"evmos1wj048jke65p27lnn6a2myws7jj3zvsy43lhlkk", "322429646668651637"}, - {"evmos1wjn27kurep7cmnl7zszm4yk7xzpryajn89dx69", "2001000000000000000"}, - {"evmos1wjns3s79t39gz2hmdh738lnjk0pamme733sayr", "75624687709168196352"}, - {"evmos1wjumew45pkznnhnl38m2uhkznydwthqasyz737", "29861886895390258176"}, - {"evmos1wk2r2m5mj6g76atd2fjjf9n3mg0kkunk6hx6j4", "343573425854038769664"}, - {"evmos1wla2d2ps8rhn2zuffuqnyggsrvxrwx5elswhug", "1100000000000000"}, - {"evmos1wleg848gqppgn93d88s6xcf7y84lxv625xjgpz", "1100000000000000"}, - {"evmos1wls9x0vugnvjurhx5lv4j32r3uexm05rxyfw0l", "1100000000000000"}, - {"evmos1wluda3822hszkfm2fwmkdz3n39fhqwyu760xez", "1100000000000000"}, - {"evmos1wlvv4w2mwvpffdthhjz6hw3r0d9ss2fjpx23ad", "1100000000000000"}, - {"evmos1wm3hs33mtuh4rcltr3hkhfrek84n4dsvcmhe5g", "27978601965217001472"}, - {"evmos1wmm82zffzfk6wwmxhwd9wfu4467jakt9jkzvjp", "3337711426009296373"}, - {"evmos1wmmulr5c0wsn3y7xh2j6p8nz9al7h03fqp7yrf", "129818309979193884672"}, - {"evmos1wmn9fd5azu63np2whzy7jqhddv085wpwzt5j3f", "111915407860868005888"}, - {"evmos1wn58mdp6q0uee7k2kwj3czal9r7c2f9ysx2s4n", "1100000000000000"}, - {"evmos1wngsl8j00pzh2682ktqejnl5jhj3wsw0fk4mgd", "203680416027953741824"}, - {"evmos1wnpak7sfawsfv9c8vqe7naxfa4g99lv7llm9td", "110000000000000000"}, - {"evmos1wpa4qwj68n442slpq8phv00zvlg3cf94wlv6lr", "1100000000000000"}, - {"evmos1wpykvjpvsnz4ltgkdtgthn8klsqqp7lh3vs7u8", "1001000000000000000"}, - {"evmos1wqhzk2akg4aj40s0jzfd3yn9rdk9dtrjfq9jf3", "1001000000000000000"}, - {"evmos1wr6d0t4hjuwv8cz9hsmwskjzx4wc3rrweenkjp", "45882504083542867968"}, - {"evmos1wrfzzgfz5lq3uk3jvmsv65eg8n4yz4x4ch6wsc", "2001000000000000000"}, - {"evmos1ws08hcd6naergv3ulhthxljmr2helwn2ljrnla", "1763581660408326912"}, - {"evmos1ws8cyqvsus8ly39hnngu7ga57ntd3eckwu3es2", "1100000000000000"}, - {"evmos1wshqldznfr3qcyvwmt7907acmgmtugkjlx5ams", "45882504083542867968"}, - {"evmos1wt6rty744fp5jtya45t3qulp2nffu3mlp9xlw9", "55958203930434002944"}, - {"evmos1wtyuh04jggkms43e7na7gtr5nlq5fuvp3gg0zs", "69946504913042513920"}, - {"evmos1wujkgw9kn8m8dexugf6v8ct6ejzyzek7wqpgtm", "167872611791302033408"}, - {"evmos1wux2nfpy47jm5k0dm5lwqtdfgvwdqluhllamdu", "45882504083542867968"}, - {"evmos1wwq6zutczpvwsw6f360rh5my75xq9gcepm85tj", "91766008167085735936"}, - {"evmos1wwrcklelqhxmkyutckdkaynpr0snrwkwlz7gkd", "169012404436314097954"}, - {"evmos1wwrg3kwh77me7yq3gzkhkjqns2pp0uc9gatmxn", "60816376445505184527"}, - {"evmos1wxflrdqveq0gfat0w5zg2gq95xehj75lcr9m5p", "1100000000000000"}, - {"evmos1wxrx6456uar2gmvy9rtts4enemrdyrnyz0xn0z", "45882504083542867968"}, - {"evmos1wyhrzkrwm62fe4wpz5tt630hvttkuv24cn9d4r", "1100000000000000"}, - {"evmos1wyl5jsmklema2qqht3dhmlk5n9h3x6nlz68pg4", "1100000000000000"}, - {"evmos1wz87axyuaf3vxxju659k8utg4mzv5zjzn478xd", "1100000000000000"}, - {"evmos1wzxwus8aep26srw7xjs54qy7g0qw3wqan9ve9s", "55957203930434002944"}, - {"evmos1x0gej6khaypfvnzhmvxy8qazkqmr8vg6py2nme", "1763581660408326912"}, - {"evmos1x3e0dm44g8930ptwzh9xac5fnn7afsvl0k8zq2", "1100000000000000"}, - {"evmos1x3zhsjdg8segw30rd0jezam4nafjg63mse2x0e", "11000000000000000"}, - {"evmos1x4qhn656zx06lr6k8xlefy22gnwg3hjzvgea25", "91766008167085735936"}, - {"evmos1x4vc4tt9ddmsukeymy7ukqsttcv466u950cdrk", "1100000000000000"}, - {"evmos1x5ymhshzpcatlz7mufsuud6gvcu7za7rdma64c", "1100000000000000"}, - {"evmos1x6r02wze0dmuwmyjr9qt85y3ufumg6yx7jrs44", "5941000000000000000"}, - {"evmos1x6vr9ew848vm729c6u5zec7sx5y9azhj8yjsvp", "3526163320816653824"}, - {"evmos1x7a5m6hfpjz8xyl6fh58n8y4h3hk4xkdpfkj52", "1100000000000000"}, - {"evmos1x8txr7936g09v8peggty88tq74p9y4lvhafn5x", "27978601965217001472"}, - {"evmos1x9rl0jypp2p5un5envv6v0trckpruvd7tgd07w", "61000000000000000"}, - {"evmos1x9uts0pckljh5fshsqynlm8ydc0uyj0edlxnvd", "45882504083542867968"}, - {"evmos1xa8fcr60j23333d0lhtqt5a0t2dhgkqtjnkpuz", "27978601965217001472"}, - {"evmos1xc434uscf00n9zfsknw9u97rfptyz2rv5z5cu8", "11000000000000000"}, - {"evmos1xdxcv6nz8zlzjmcq0pmlapza69j9a0wwcamn84", "45882504083542867968"}, - {"evmos1xe3mdf80e4d0jrsaeal4swuc3cpldyxqx5r4gu", "259637619958387769344"}, - {"evmos1xe6wcqqqa752zrj090uxxrh4zw3w3axzzru4nv", "11000000000000000"}, - {"evmos1xe7yrmpz8qk077tav7ltl9qkqdkugdttyr422v", "91766008167085735936"}, - {"evmos1xfhturw8xlp5kqt3fxwkhlcp6xcat4sxzhffrf", "18840027154756472832"}, - {"evmos1xg86240rxvpn7j3nkjrk6say7wsls5v0psd40k", "301000000000000000"}, - {"evmos1xgwgg8gksurthqzpgsg5pnvn0ck33u3afjeqcw", "124780960055748296704"}, - {"evmos1xgygkk0dhywt2plenpuhxlxh34zc98ewdt4a8r", "2000000000000000"}, - {"evmos1xhjhdtxq9xs9gv862dcmr374vujzv9ptcsxyxy", "91766008167085735936"}, - {"evmos1xhmn30rrgk5elfc9fecfmxa28usg98fvmf6u6f", "1100000000000000"}, - {"evmos1xj7g0h26kz3ud756vfjqqf35599pvjx7euwpgj", "1100000000000000"}, - {"evmos1xjcdg44ruryejglrvtt8n7x5x4jnkpl6gjmmns", "1100000000000000"}, - {"evmos1xkzkm0n4elkufg224z80u8usmpmsdemqh5q37t", "116789378128206594538"}, - {"evmos1xmevx388je8gxann5ys4e7jqtnyz6rmlf45xrg", "203680416027953741824"}, - {"evmos1xn6khyeqn372vzjynfm5dmsymvhpmjge85tcfa", "1100000000000000"}, - {"evmos1xn8aqautjpq6wrgsjyvwvzs8r9jh75fasvd78s", "1100000000000000"}, - {"evmos1xname80462fy8qggxgcafukqcmgler3nq9lgfg", "21000000000000000"}, - {"evmos1xnch4twms8c46tsxcjgs6pt8rr3a7g0drv3tsp", "1100000000000000"}, - {"evmos1xnf439dwu36w8smcs8l4mvj2uqv9dhy7eektpr", "1763581660408326912"}, - {"evmos1xnvfqrml6ssw4pz3z3f0x9fpys582ly0kmekya", "41000000000000000"}, - {"evmos1xnxqg4062r7nagucjd9kd0gh3f75jlyuwtv6xq", "1100000000000000"}, - {"evmos1xpdvrs6q62zkq47wun6dc9qtf6fjp69pn838nj", "36510053318136666880"}, - {"evmos1xpfc05zwa05pvv3rqu5llr54fmw5hyh489pxcg", "287616221923604791296"}, - {"evmos1xpq9hctxzw3tj0p970jq62345mfzem3tr8rdra", "152759562020965310464"}, - {"evmos1xqvtmrk2jxqrh2zgusrl6dz0t5n7g9q78lkw8q", "45882504083542867968"}, - {"evmos1xrzmp50wzr0vpzyffg0nfsd3sza38wjtc3a94r", "45882504083542867968"}, - {"evmos1xslp65txq2vuk4mw6thep835cgh3d9qyxnv78y", "1100000000000000"}, - {"evmos1xtd64wss40fsqm3hrekw83daqmp5q9m0sdu285", "1100000000000000"}, - {"evmos1xtlhmeuq484ketayyne603fnqk5svre9z5jgq2", "91766008167085735936"}, - {"evmos1xu6304qrytdsq3x6km4tnkmpxxprkjzy3hv392", "45882504083542867968"}, - {"evmos1xu7m3athqf85etsdmw2tkwtq4668hs043pl7r5", "2500000000000000"}, - {"evmos1xu7yvnxvuj7yan4km6q3t7d3hlj2ckhmdpk2fc", "45882504083542867968"}, - {"evmos1xv2k95q2vhsttqnrdsfmynzjz4sdy9e67xf3sv", "203000000000000000"}, - {"evmos1xv7vpnl0tgqcypahfss0enjq72dq5ugmx86rj3", "1100000000000000"}, - {"evmos1xvg6pznxhax3zwq70htlua0yck95ng5gcjupxp", "1100000000000000"}, - {"evmos1xvrwuw2c5zq6u262szecm37yw0ynfg6q98tvqs", "41000000000000000"}, - {"evmos1xvsj7hq0vx9fpfyeyg9dfdhgdqwlde7ltcrawd", "19807219226633424896"}, - {"evmos1xvu7y8ume6uxh5374grhp4808d2smtryzqnkfh", "15437438616168410779"}, - {"evmos1xvupya036t5ckg084uaqjtdr65puccsa9t8tzr", "1763581660408326912"}, - {"evmos1xwvyfuvymk5szx58e29lvvn60xp0n6maz7um9q", "8572148677396930994"}, - {"evmos1xxacv0jrrfjchdee9rp97l60qpa42m4elzrf6v", "27978601965217001472"}, - {"evmos1xxdrx7sn47pwgav5mppfq9meur87vdryeym0v9", "27978601965217001472"}, - {"evmos1xxt7zpd6cee4kt6e8gn97c287ye7ecj4nh2jmy", "1100000000000000"}, - {"evmos1xzvuhq526g4nhs7cvlcstxsxa5pcmz0lvyukqa", "1100000000000000"}, - {"evmos1y0rkqamw8ygxz9xrscfc2676hu8v97k9g25ntu", "91766008167085735936"}, - {"evmos1y2llmngd888c92mkd5uexwx0erjsv4phf4ens5", "203680416027953741824"}, - {"evmos1y2vnha9757qmupq6lx0klt9wr2rf5sx9h4hnxz", "1100000000000000"}, - {"evmos1y2ylwwtajhezhrnzjkdufzzgmc4luu53eyjrpt", "1100000000000000"}, - {"evmos1y33wxfacznusx72quddvhq65d8nxxv4t3k0l9h", "1100000000000000"}, - {"evmos1y35x2yxytrvfp7ru9v6rkvchvauhewscwf6r9z", "73861106048759869440"}, - {"evmos1y3qf7etw8ndhl59jgvpcnzhxaarpp4jv5dcu8s", "11261000000000000000"}, - {"evmos1y40paa8v288tz0u60uellmj0lmvfcgc2gjs3mf", "1100000000000000"}, - {"evmos1y4z9wm600q2vw7xhwwnv8zsvwwm4d29kd59pmf", "1100000000000000"}, - {"evmos1y55t9428k08f39qkek0yhe0w4udxtuegcyd0p2", "297690921770495901696"}, - {"evmos1y578v7kjgj0spns76guxz4d09elkcaxrwenpwu", "1100000000000000"}, - {"evmos1y67emf9pnjmjr7w5jp6ctakm9wp2hevwumgcfy", "58310498142461547520"}, - {"evmos1y6l298tkptffqu2ukcu235dunle50j3pennkrk", "1514544219611288393"}, - {"evmos1y6mwh9szmdq89vqjqaxhya9hjht9ncqhwtjqqg", "3659719174571880618"}, - {"evmos1y75d548w0sv9c7dc75ultvlq9exfv73gkgh7j0", "1001000000000000"}, - {"evmos1y83nev0z2pm8kpk9hjrhl5zx8hm67m6cv54uuy", "1001000000000000000"}, - {"evmos1y9eq06jsc9t2204qqp964c3vu63wvzrsfltdrv", "101000000000000000"}, - {"evmos1y9wvejufa4x94esrvdfn94g36kq76wjh7ddwj6", "111915407860868005888"}, - {"evmos1yagtcjz9vy8du2pdrng6y3wsg8jnakzds28wv8", "25616278813828500585"}, - {"evmos1yahzyhfewad586x2pyt8sz97e24zxa2qy982ty", "1683089142779188799"}, - {"evmos1yaj87jfpxvmlpaqazdtvkylwx730yn7lt0gj89", "7266384942531386880"}, - {"evmos1yawqv335xrkk3tsg5jf0a39z3mcwnl0taatuc0", "1100000000000000"}, - {"evmos1yc6tdz2cevl277vkjjxw49pkug8velwce8hhwt", "91766008167085735936"}, - {"evmos1ydetrklhcsyy5c28lqv427uwr0v0yh4s35u8ah", "21000000000000000"}, - {"evmos1ydpahdy258gtjl53txput5f7wexfgucyh6ez9k", "8956296191882057"}, - {"evmos1ye8ltlf4ycm6ukm936kxer9m7hs28d5r2mp53w", "52782862610906025728"}, - {"evmos1yfaqm2zu42aqgk6t2tedfx4u2z3flkcga6vvml", "203680416027953741824"}, - {"evmos1yfxdl0ejadmtkqyc80gzrwcn97hkdymewl73lr", "1100000000000000"}, - {"evmos1ygdd9633474qfk3ruek9flt2nxkv6yww8n3lr6", "1001000000000000000"}, - {"evmos1yhczhzaf25vyjkxhn9hunslkapr2vadk7lmm4c", "21000000000000000"}, - {"evmos1yj65j54xka0gawl45f3xh6dkkfzn9awx8xjr6j", "91766008167085735936"}, - {"evmos1yjahur60nwkh79r6se08zrz9lzfu4an496ud9g", "1763581660408326912"}, - {"evmos1yjj5zfxxzlqm6yhe78jahlwaxs6q8uqhk5hz4w", "2367976800000000000"}, - {"evmos1yjqsn574kvggswyggnjsnadvccxlzlx46yxrwf", "37652211543546737521"}, - {"evmos1yjrr0lwzjxnjm5m09fk6mwjtuyxrgfwtj3scq7", "73861106048759869440"}, - {"evmos1yjxdnhvnhcgu66rj9h2u6dwh7sqvacmj6sdwhc", "83935805895651016704"}, - {"evmos1ykr0amlrcwqutf0kzug6z6ktzun4j84kz7gwrx", "1763581660408326912"}, - {"evmos1yl8whxteqd3tvnppypwwuy88tdpm0xhmm3wd2l", "86137306216357269504"}, - {"evmos1ylef0ymepn9vclzmd50l9c4kfjt4fdgpjhvxnf", "1100000000000000"}, - {"evmos1ylkhm3lvx0qeaeuhw62c97s09nqgvgcv96pccn", "11000000000000000"}, - {"evmos1yms02p2d8luyjpmjl5qsc6u9dyrlw2sdgxfas4", "1763581660408326912"}, - {"evmos1yn245fhqdlhfa6xvkkgxlv2wdc9pla700jgx8y", "46882504083542867968"}, - {"evmos1ynd6u0lezqageda9gwxssvfth2w04v0azflqmk", "2963918143624579170"}, - {"evmos1ynuweupvm83my88tz6jxszt2talnr8hndelvlw", "34567705521416089499"}, - {"evmos1ynxj35nraq4sxmtgqsdmpgnwq7sgp8vlzzzaeh", "343573425854038769664"}, - {"evmos1ypakuerp2fz5resn74cngarknzlgj87sysse07", "203680416027953741824"}, - {"evmos1ypakzpy6fqwdhe0ru2u86m4a4s0w45e2f8hk8x", "55958203930434002944"}, - {"evmos1ypgmw98vkvjp5f4h3q9f9dvxp3snp3dp0d2zh2", "1100000000000000"}, - {"evmos1yptamqfp9s42qaxd50sr4z3autxvj2nlwhatrj", "805000000000000000"}, - {"evmos1yqn35pkaps9tnd80t027qvpvd68nqv8e0kupwz", "2000000000000000"}, - {"evmos1yqvasz9zvtgfsnaafcx5m27ct04usehfm93sqn", "1100000000000000"}, - {"evmos1yrnyudqnlfe0gsrkvdwytlj0ejfg38f69w85lj", "55958203930434002944"}, - {"evmos1yrsrmctckxd0c6rlewnf7s0ecse5ad3jdn9xjp", "129818309979193884672"}, - {"evmos1ysfx2pganh0kwlumg5sx95p57dn4qqysfeg50w", "27883962373636716204"}, - {"evmos1ysh2d9svxwluqww2zukauewgm62gn4gxpfz7f9", "55958203930434002944"}, - {"evmos1ysshvux26z6ut9hcvmzapan06gygkcug3nj9hz", "1001000000000000000"}, - {"evmos1ytejdcapn0l3uwfym7umdrusxphrwlhysrh3e7", "3268181421766368768"}, - {"evmos1ytmz30k5aftnj8vhsqfjma8y3p0hqqt0v0pfev", "61000000000000000"}, - {"evmos1ytqrgag43tgt5s0m3uwh2kvu38a6rnd2fruypd", "1100000000000000"}, - {"evmos1yue07ezswgrn957x2new387eqtuade8aqv5f8x", "1100000000000000"}, - {"evmos1yumaz4tranutnsy8v0jzhd95fxt7ej078vcfsp", "11000000000000000"}, - {"evmos1yuq6fqm2d0d7zmzy8s6hvk98u4e4pggfuku95n", "1100000000000000"}, - {"evmos1yuqf2g8an9609q26vyw4jsly6jcyjkl025nma2", "123783720127885819024"}, - {"evmos1yuxcrnzyylztpkhk9d4m9zfpt45sznakjc3l7e", "35001000000000000000"}, - {"evmos1yvfr7mx2dfyy2kh09ajcerujn7ltrpnxtzs7wu", "23132584561592279552"}, - {"evmos1yvg3wwj3cu8g0su7ch4zcqaav3w2r5dxe0y7ae", "91766008167085735936"}, - {"evmos1yvryycscx5ec932vngp780grq5mzsj7kqcf6t3", "12276200167597400064"}, - {"evmos1yvu9txcvc5jlp7hkcq0k9qyf9dnukm6hc5dy0r", "101000000000000000"}, - {"evmos1ywf9qarpna0wxlh7mmdyqlfaluy3w25aaya5jl", "125101000000000000000"}, - {"evmos1ywlx9jujyt7czla9zmrk5vl0wp0wu65rfjhc8q", "69946504913042513920"}, - {"evmos1ywvyx3j9k8esxymw3u7ndjj942hvz6wtms3z94", "1100000000000000"}, - {"evmos1yxghpe9umvcyhaq0cpeuzrra0aps2agpzgya4t", "11000000000000000"}, - {"evmos1yxzglql8d7gcxkktkpre4mjuel5mh0zvmkshy6", "45882504083542867968"}, - {"evmos1yy4kjku5h2hyz5r7yerg0etvmam7n4w8mvy6nm", "40142035472156956954"}, - {"evmos1yyeahsgasyxpedfv74jnf8sghr0jwatfx4nzpt", "81712427000000000"}, - {"evmos1yytzrfvweujtnyrjvzm4rseyyakvnpuyuqegd5", "74674553331514510008"}, - {"evmos1yz3y0ntf864x8tp7ekzh90k5eg3p4hafxjxjrv", "1100000000000000"}, - {"evmos1yz55y5nvwwxptwppaccdfhsyjfcuszdpek8tt0", "1100000000000000"}, - {"evmos1yzzw5xhp6kqkwmnn42h0wx9cvnp5gzwc46xefd", "1001000000000000000"}, - {"evmos1z030hjuc6y3a8qhehm3f96kcmppma36hp4xj0r", "1100000000000000"}, - {"evmos1z04mprdyr4f92sex5ndt3xa2ff3l0wp26yl5qw", "91766008167085735936"}, - {"evmos1z0dskl6yznd0p94f3tgqlwcjarakgkgfhc77r4", "1100000000000000"}, - {"evmos1z0nc7jkpnjkh93khpt498rxhk2my2jughw745h", "101000000000000000"}, - {"evmos1z0wm3vwjz09l7tknd9tae22fmzp62jvwfnvcj7", "1100000000000000"}, - {"evmos1z40q0ns64vk67546mh0evuzelq68d20g7acmhu", "1100000000000000"}, - {"evmos1z48ayvvcfp6wple9qk7tapz5w7kfx46exqq0yd", "103603289674385197824"}, - {"evmos1z4djdjg257nmzkgeftxafprlj70qx5r727vurf", "371552027819255791616"}, - {"evmos1z5qsjq820w2rawzszkfmxz9ak8m0suup4e40fg", "1001000000000000000"}, - {"evmos1z6vwm0q3g2kfj2sw5y2g5qsv6nutlef4dd0ut8", "1100000000000000"}, - {"evmos1z77lrfnswwl62svwuvr0nfhfln5ftlm72vrg70", "1100000000000000"}, - {"evmos1z7v0sve6284d2z5ktq82z348v24xt9vps4279e", "1100000000000000"}, - {"evmos1z8j6sfz3l9fpsflrv4ns46pm38vu3r3f7ajezt", "1001000000000000000"}, - {"evmos1z949a5rdf7y4e3g785ljapxup63g2kcnextpqt", "45882504083542867968"}, - {"evmos1zcy0vs262ukw7r5nt5qp9cnhhyhvgwnlcmfama", "3629734605748683841"}, - {"evmos1zd5rwhylqhjeapu0ef5p43yy9rzq82nt59509s", "8500000000000000"}, - {"evmos1zd7ljan0zmrc06clrjjh4k02ptk7eyez0yuega", "1100000000000000"}, - {"evmos1ze2s9xy7flznfjkcytkgm8adt42mfpct2z6jcl", "203680416027953741824"}, - {"evmos1zet4tnwawreff7w4x5s3fluml5x8xal2flm7pz", "28202149069549998848"}, - {"evmos1zew5he6vw8x92mgth7p2s0rd4nfj8zq4sn4wwl", "101839708013976870912"}, - {"evmos1zfj8jgdyuqxhv7jz6dfccufsyhhs2wwmy48e36", "167872611791302033408"}, - {"evmos1zgkzppe5x5kqw7ugla0jnk6frjwl85ydnwfgcc", "343573425854038769664"}, - {"evmos1zgmmhy5fhzdkap09vjhqmf3hwxkpxqjg6shtq2", "1100000000000000"}, - {"evmos1zgwvdg7xm4yj5lazlddv9wqrn0y8nvhg0ssshg", "1100000000000000"}, - {"evmos1zjlcdw0asgncx9560qc0vr9w02l9rs6l3lggyj", "1100000000000000"}, - {"evmos1zkv0vxtuspm0ex7490yzn6k90d3ywk7z0yp5m9", "55958203930434002944"}, - {"evmos1zkw07yvyff90pcttnjywhdlf37xjevrs6qnl8t", "73861106048759869440"}, - {"evmos1zl0jjzpgj84d8ds9ql505vzfr3zy2tcjyf8gzx", "31756297597724299264"}, - {"evmos1zmaed80mjelkvket9uy0k2je9mc8qet0vz8phc", "152766008167085735936"}, - {"evmos1zmcr0g7a7576rvz84ynwrqejr8c23c0uxrwccw", "132348402236528446464"}, - {"evmos1zmczmq44ta5epjtagjed8zyq5u5tq8x9kzsnjy", "91766008167085735936"}, - {"evmos1zn5ey34cyuxlr30lpswwvuppft0mna5kwyg2tu", "1100000000000000"}, - {"evmos1znmqx9dwgakkmwfchqm2whnnxqrgw5ukznz8pu", "1100000000000000"}, - {"evmos1zpj4qmmpqzjd9fdzde7jv6qvlhk80ewt84am5a", "53755435722540288000"}, - {"evmos1zpp6hwywzamawrx4nqpn404qr9806ek6t0n69h", "47005398074026920222"}, - {"evmos1zqp70nhzlhw4uy3cy5alv07ztq4ks0f8f8jyy2", "259637619958387769344"}, - {"evmos1zr8p0sufekk9jw2jwvlvmj4e0cdulujwawu6vv", "73861106048759869440"}, - {"evmos1zrajy95vns6g86c2tla6vuh3zd34ymk25gadhr", "91766008167085735936"}, - {"evmos1zre6j6tugzstah6pr2e2j3ppmd04x0w5lxf2gg", "1100000000000000"}, - {"evmos1zrfw696q3fgghstf850m0uae3xdfdnycjyk2vy", "9001000000000000000"}, - {"evmos1zskf6ltm2lme0gkzwjw02q7dfa7rpjl68k45gq", "1100000000000000"}, - {"evmos1ztcddjner6ksvjachg0qeev4ywhdyfj6rehd9r", "1500000000000000"}, - {"evmos1ztjurrunhvh0p4lflf70zhuxsgrrj6xc6wkcjf", "45882504083542867968"}, - {"evmos1ztmawsgwc79szdlxw6vf4l8l42uvudawestudz", "371552027819255791616"}, - {"evmos1zttl5ud0klt90zlcp6kxwczncz7tvhl9srhwah", "91766008167085735936"}, - {"evmos1ztx200vnl3v9e7gdaskjd9k6qryaqyvw5gzhdn", "1100000000000000"}, - {"evmos1ztxxa25wc3kf9fny475mnpqcjtzzgs3t3zhx2y", "3127409530944889344"}, - {"evmos1zu8zdg9tme0e5nxlry2r69n9qzumpquza5pnfj", "12301385988399720448"}, - {"evmos1zvpephxu6jrf9lhjr492dr3ajlx7cdz9ftmu93", "140584708159352812288"}, - {"evmos1zvusxgpgeupqs5pnk65fh04q84jnqsm5maal4h", "11000000000000000"}, - {"evmos1zvzaq2x5tg974d5uhlj9xs6ml73q535hp303c3", "1100000000000000"}, - {"evmos1zw2j6p6wdk37ey5yay29f32700xn2y4tltj97w", "1100000000000000"}, - {"evmos1zx67yacj843yzx8zte6k9vrkc2wegtes0au5sc", "1763581660408326912"}, - {"evmos1zx7dplc87mnxddwq9v94wcdl5gdfuwj5cy6sex", "1001000000000000000"}, - {"evmos1zy4mtht80mqyfujvq3wmrg9t8vt8ss02f9wjvz", "69415528324947360256"}, - {"evmos1zye8t8thl9ekmrax6nfcvzdmta2vfrt897yx5e", "132851175405697690624"}, - {"evmos1zzexwq9s5tfltmcjlgjs4w5p3m3mgwl58g89xs", "1200000000000000"}, - {"evmos1zzk6ldaqv74pa7uqvqljjxf0zrg23wq7jhl8yk", "1100000000000000"}, - {"evmos1zzqyutr8rzy8vcqzcc5ts938jlh8mxz0fjc4pf", "5733424660205367808"}, - {"evmos1zzs9anwtx8acj0nkd3l2mg9r0wrtyrkwr0klqx", "45882504083542867968"}, -} diff --git a/app/upgrades/v9/constants.go b/app/upgrades/v9/constants.go deleted file mode 100644 index 2b3da5b3f2..0000000000 --- a/app/upgrades/v9/constants.go +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package v9 - -const ( - // UpgradeName is the shared upgrade plan name for mainnet - UpgradeName = "v9.0.0" - // UpgradeInfo defines the binaries that will be used for the upgrade - UpgradeInfo = `'{"binaries":{"darwin/arm64":"https://github.com/evmos/evmos/releases/download/v9.0.0/evmos_9.0.0_Darwin_arm64.tar.gz","darwin/amd64":"https://github.com/evmos/evmos/releases/download/v9.0.0/evmos_9.0.0_Darwin_amd64.tar.gz","linux/arm64":"https://github.com/evmos/evmos/releases/download/v9.0.0/evmos_9.0.0_Linux_arm64.tar.gz","linux/amd64":"https://github.com/evmos/evmos/releases/download/v9.0.0/evmos_9.0.0_Linux_amd64.tar.gz","windows/x86_64":"https://github.com/evmos/evmos/releases/download/v9.0.0/evmos_9.0.0_Windows_x86_64.zip"}}'` - // MaxRecover is the maximum amount of coins to be redistributed in the upgrade - MaxRecover = "93590289356801768542679" -) diff --git a/app/upgrades/v9/upgrades.go b/app/upgrades/v9/upgrades.go deleted file mode 100644 index b26fa6c68e..0000000000 --- a/app/upgrades/v9/upgrades.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package v9 - -import ( - "fmt" - - sdkmath "cosmossdk.io/math" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/module" - distrKeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" - upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - "github.com/evmos/evmos/v16/utils" -) - -// CreateUpgradeHandler creates an SDK upgrade handler for v9 -func CreateUpgradeHandler( - mm *module.Manager, - configurator module.Configurator, - dk distrKeeper.Keeper, -) upgradetypes.UpgradeHandler { - return func(ctx sdk.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { - logger := ctx.Logger().With("upgrade", UpgradeName) - - if utils.IsMainnet(ctx.ChainID()) { - logger.Debug("recovering lost funds from clawback...") - if err := ReturnFundsFromCommunityPool(ctx, dk); err != nil { - // log error instead of aborting the upgrade - logger.Error("FAILED TO RECOVER FROM COMMUNITY FUNDS", "error", err.Error()) - } - } - - // Leave modules are as-is to avoid running InitGenesis. - logger.Debug("running module migrations ...") - return mm.RunMigrations(ctx, configurator, vm) - } -} - -// ReturnFundsFromCommunityPool handles the return of funds from the community pool to accounts affected during the claims clawback -func ReturnFundsFromCommunityPool(ctx sdk.Context, dk distrKeeper.Keeper) error { - availableCoins, ok := sdkmath.NewIntFromString(MaxRecover) - if !ok || availableCoins.IsNegative() { - return fmt.Errorf("failed to read maximum amount to recover from community funds") - } - for i := range Accounts { - refund, _ := sdkmath.NewIntFromString(Accounts[i][1]) - if availableCoins.LT(refund) { - return fmt.Errorf("refund exceeds the total available coins: %s > %s", Accounts[i][1], availableCoins) - } - if err := ReturnFundsFromCommunityPoolToAccount(ctx, dk, Accounts[i][0], refund); err != nil { - return err - } - availableCoins = availableCoins.Sub(refund) - } - return nil -} - -// ReturnFundsFromCommunityPoolToAccount sends specified amount from the community pool to the affected account -func ReturnFundsFromCommunityPoolToAccount(ctx sdk.Context, dk distrKeeper.Keeper, account string, amount sdkmath.Int) error { - to := sdk.MustAccAddressFromBech32(account) - balance := sdk.Coin{ - Denom: "aevmos", - Amount: amount, - } - - return dk.DistributeFromFeePool(ctx, sdk.Coins{balance}, to) -} diff --git a/app/upgrades/v9/upgrades_test.go b/app/upgrades/v9/upgrades_test.go deleted file mode 100644 index e84720d3de..0000000000 --- a/app/upgrades/v9/upgrades_test.go +++ /dev/null @@ -1,113 +0,0 @@ -package v9_test - -import ( - "testing" - "time" - - "cosmossdk.io/math" - "github.com/ethereum/go-ethereum/common" - "github.com/stretchr/testify/suite" - - "github.com/cometbft/cometbft/crypto/tmhash" - tmproto "github.com/cometbft/cometbft/proto/tendermint/types" - tmversion "github.com/cometbft/cometbft/proto/tendermint/version" - "github.com/cometbft/cometbft/version" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" - feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" - - "github.com/evmos/evmos/v16/app" - v9 "github.com/evmos/evmos/v16/app/upgrades/v9" - "github.com/evmos/evmos/v16/utils" - "github.com/evmos/evmos/v16/x/erc20/types" -) - -type UpgradeTestSuite struct { - suite.Suite - - ctx sdk.Context - app *app.Evmos - consAddress sdk.ConsAddress -} - -func (suite *UpgradeTestSuite) SetupTest(chainID string) { - checkTx := false - - // consensus key - priv, err := ethsecp256k1.GenerateKey() - suite.Require().NoError(err) - suite.consAddress = sdk.ConsAddress(priv.PubKey().Address()) - - // NOTE: this is the new binary, not the old one. - suite.app = app.Setup(checkTx, feemarkettypes.DefaultGenesisState(), chainID) - suite.ctx = suite.app.BaseApp.NewContext(checkTx, tmproto.Header{ - Height: 1, - ChainID: chainID, - Time: time.Date(2022, 5, 9, 8, 0, 0, 0, time.UTC), - ProposerAddress: suite.consAddress.Bytes(), - - Version: tmversion.Consensus{ - Block: version.BlockProtocol, - }, - LastBlockId: tmproto.BlockID{ - Hash: tmhash.Sum([]byte("block_id")), - PartSetHeader: tmproto.PartSetHeader{ - Total: 11, - Hash: tmhash.Sum([]byte("partset_header")), - }, - }, - AppHash: tmhash.Sum([]byte("app")), - DataHash: tmhash.Sum([]byte("data")), - EvidenceHash: tmhash.Sum([]byte("evidence")), - ValidatorsHash: tmhash.Sum([]byte("validators")), - NextValidatorsHash: tmhash.Sum([]byte("next_validators")), - ConsensusHash: tmhash.Sum([]byte("consensus")), - LastResultsHash: tmhash.Sum([]byte("last_result")), - }) - - cp := suite.app.BaseApp.GetConsensusParams(suite.ctx) - suite.ctx = suite.ctx.WithConsensusParams(cp) -} - -func TestUpgradeTestSuite(t *testing.T) { - s := new(UpgradeTestSuite) - suite.Run(t, s) -} - -func (suite *UpgradeTestSuite) TestReturnFundsFromCommunityPool() { - suite.SetupTest(utils.TestnetChainID + "-2") - - // send funds to the community pool - priv, err := ethsecp256k1.GenerateKey() - suite.Require().NoError(err) - address := common.BytesToAddress(priv.PubKey().Address().Bytes()) - sender := sdk.AccAddress(address.Bytes()) - res, _ := math.NewIntFromString(v9.MaxRecover) - coins := sdk.NewCoins(sdk.NewCoin("aevmos", res)) - err = suite.app.BankKeeper.MintCoins(suite.ctx, types.ModuleName, coins) - suite.Require().NoError(err) - err = suite.app.BankKeeper.SendCoinsFromModuleToAccount(suite.ctx, types.ModuleName, sender, coins) - suite.Require().NoError(err) - err = suite.app.DistrKeeper.FundCommunityPool(suite.ctx, coins, sender) - suite.Require().NoError(err) - - balanceBefore := suite.app.DistrKeeper.GetFeePoolCommunityCoins(suite.ctx) - suite.Require().Equal(balanceBefore.AmountOf("aevmos"), math.LegacyNewDecFromInt(res)) - - // return funds to accounts affected - err = v9.ReturnFundsFromCommunityPool(suite.ctx, suite.app.DistrKeeper) - suite.Require().NoError(err) - - // check balance of affected accounts - for i := range v9.Accounts { - addr := sdk.MustAccAddressFromBech32(v9.Accounts[i][0]) - res, _ := math.NewIntFromString(v9.Accounts[i][1]) - balance := suite.app.BankKeeper.GetBalance(suite.ctx, addr, "aevmos") - suite.Require().Equal(balance.Amount, res) - } - - balanceAfter := suite.app.DistrKeeper.GetFeePoolCommunityCoins(suite.ctx) - suite.Require().True(balanceAfter.IsZero()) -} diff --git a/app/upgrades/v9_1/accounts.go b/app/upgrades/v9_1/accounts.go deleted file mode 100644 index 0ad359572f..0000000000 --- a/app/upgrades/v9_1/accounts.go +++ /dev/null @@ -1,2165 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -// This accounts represent the affected accounts during the Claims record clawback incident on block 5074187 -// with the respective balance on block 5074186. - -// The accounts fell under the following conditions: -// - They were in the claims record or attestation accounts -// - They had a balance bigger than DUST (amount sent to claim record accounts on genesis to pay for gas) on block 5074186 -// - They had an account sequence of 0 by block 5074186 -// - They had a balance of 0 after block 5074187 -// NOTE community and claims module account were removed from this list since they were not affected by this bug. - -// The scripts that were used to find affected accounts were made public at https://github.com/evmos/claims_fixer -// with detail instructions on how to run them. - -package v91 - -var Accounts = [2145][2]string{ - {"evmos1009egsf8sk3puq3aynt8eymmcqnneezkkvceav", "20299404928815863552"}, - {"evmos100wr0u56zfmzyfzjqv0zp0wmczy6am7yel2na9", "1001000000000000000"}, - {"evmos102wuee7tga22vnnxkmev7w79ch5hpudd7an3eh", "4054851449586459648"}, - {"evmos103ejf46km6ympt6y0ws24qqc45h96j7m3cw690", "217669717010562252800"}, - {"evmos103f6wfvuldh5j5zyqh4dnma96mq5vsana6lxyu", "3130047896633089024"}, - {"evmos103gmyy86ydf3thstjdjlewn6lw054uut4258c2", "91766008167085735936"}, - {"evmos103hyfa6j53zpajqhyd5a3zzalz55exvq246nyv", "501000000000000000"}, - {"evmos103n72c5xtmawlrya7qrg9u8cut99ze5zqk8t9s", "101000000000000000"}, - {"evmos104armjlxs72vacdqmef4dv44c3meerzh8pkhuq", "301000000000000000"}, - {"evmos105586a8vzdgfugs8y0em7r9xu6dvrz6w8cpfu6", "45882504083542867968"}, - {"evmos10559ts28yfnxqxhslqsxkrsj4p7ex3mqcslarw", "21000000000000000"}, - {"evmos105t839qtyggs2t6zq822qt29wck8qujrph34v6", "32888382518719710208"}, - {"evmos105yclmzwe7dvjj930gteccu0rkauaaedtcnf7j", "35693259037706718720"}, - {"evmos1060u6wxvu9hmx33v26ga05recesy8qqycjvd2g", "3795587549971939328"}, - {"evmos1065ry8llze9frpkssavchngjt7vz4fl44gmj62", "1100000000000000"}, - {"evmos106hufp04t5pagcupe9e8v3e5g23h7nul58k86g", "133398883581233111040"}, - {"evmos106n3l72df46z9vmdmvjca7trj9wr7znu5mzv0g", "171786212927019384832"}, - {"evmos1070h5whjne6yatsmllta245a7w4wvx2xl0ha7q", "167872611791302033408"}, - {"evmos1076dl997rp3g4q5ppd57ml2h7ku3wvm29rz2gz", "1001000000000000000"}, - {"evmos107wmsnx6eqhtf3etn5hcmmzp06rzg29hmvrq08", "1100000000000000"}, - {"evmos108rvyqyyj0veyft605jkhnzqvw6rjurpfqq47k", "1100000000000000"}, - {"evmos1098pn43caljr6ndk8m2x6wd4g0w2p6j3wx8ygs", "101000000000000000"}, - {"evmos109au3yannfsyjvueqk766umupwpafa3uxvt87f", "55958203930434002944"}, - {"evmos10cc57e239t7u5tfllede7a2psl6wygewlyq0ja", "21000000000000000"}, - {"evmos10ceevq6azm7h7rquacg80770v4um8qfk5y9wt3", "73861106048759869440"}, - {"evmos10cvujqmsjsda5aufx3tfayfysdxxg92q0xlcn8", "1100000000000000"}, - {"evmos10d4w9w7sv4sk6nu824ugy3fj0wnds7kcvj2kc6", "1100000000000000"}, - {"evmos10d6nqdc544zgnarxq53dsh2ymuvazp6x7ef9xh", "1763581660408326912"}, - {"evmos10dcssw4jsctf8wxx9mqljr0hqttvzj92sf885x", "1100000000000000"}, - {"evmos10djmswf42gcpl3evgmprennun9r5304uu5esr2", "45882504083542867968"}, - {"evmos10dlc92rzp2l3eh5nt2hmmqackt9h4ffwuvhhyu", "45882504083542867968"}, - {"evmos10dm8y9v988aqh2yng9zvg0uk3d8v7ununrcm2v", "45882504083542867968"}, - {"evmos10ecp0n9npf8j74qjj2t2vltdhwamtt478mxxx4", "64620803389560193087"}, - {"evmos10esy2fqzqdv3hxzlqn7m8jdhs5m6zl9n8myye9", "1400000000000000"}, - {"evmos10g9lnnkx0js2cu9ln42m3cmfc2g4m4yat726hj", "147723212097519738880"}, - {"evmos10hfkve3nkfwce3wx3jla7wg873pa4ew8attkcl", "70000000000000000"}, - {"evmos10hm3zg7weaytxvx4aymj4n7asmm9shgvy6dv88", "43059791670694436137"}, - {"evmos10hx0u9jfurq20wmt3unlcgtems90lj2h25guyd", "1100000000000000"}, - {"evmos10j592ypch4j6cx98plc3jszjzwnm4pc72z9j0z", "1100000000000000"}, - {"evmos10j5lj9y5w2pp9m3k9j368sgngqv0jlprav602l", "14743448244874619531"}, - {"evmos10j7y6004c29ts26c4hcewss0tz3za0nff9v9pa", "45882504083542867968"}, - {"evmos10javh86tltte5qglh8flqvcenzz6f33hwje47p", "1100000000000000"}, - {"evmos10k3gjrsf2qe3x5r4khg85gm7r26err8zxl6xrc", "61000000000000000"}, - {"evmos10kettz0j007k5x95xhjfw09a6d94cw3lf9jz7p", "23158850120686031116"}, - {"evmos10l2hg9c3c4aw6mrkhrgppmv9h3emylfcxqcluq", "83935805895651016704"}, - {"evmos10l3rfs5eya90utgm6g3lrtf6pzff3mucu7k2tm", "287616221923604791296"}, - {"evmos10laewtwwdwuxtlg2dszrn0twzdc70r8lduc7p6", "1100000000000000"}, - {"evmos10nj0fnt2weqph8v5uxy078xk9uwegqs9myckpa", "1100000000000000"}, - {"evmos10pdhy5043vydeda7gedxwsh8j2fly0adjjhjhd", "26790604532398903202"}, - {"evmos10qtj5etjj04n2sp6m4znnkrehzk3xa0u4tcpd7", "1100000000000000"}, - {"evmos10r4tuwp4n2ef42qyax9334vmylkcmkxn6jt548", "75624687709168196352"}, - {"evmos10r896u5nhu2whg5c5p3d6npt4nytpwufxv4mfu", "45882504083542867968"}, - {"evmos10r92uvhfgsx2t2vpaxv00yrqtjnmp59rjt2df0", "55958203930434002944"}, - {"evmos10rm3m8uzmaaew5vfmz6mzkd3rpmmk30znygwch", "31000000000000000"}, - {"evmos10s2978v798agv6hquke2d44lnhrhdrmqtev708", "259637619958387769344"}, - {"evmos10s3uxs4tam8lh2kayrppagj8ggetcmm84qsrpf", "1100000000000000"}, - {"evmos10s8kg0ht3sfrj8drhpeuw84npzfj5udprl4lwp", "1763581660408326912"}, - {"evmos10sj6j3kjhnkfg6n8z5vecp8u49qteev3k9r7gt", "4001000000000000000"}, - {"evmos10ssclj2ru49c9mgz0nkfytfkfpvm784dlz69vl", "18892084269426077842"}, - {"evmos10surs973g37ecuh69q67lcmpgaxzvdal2dr482", "83935805895651016704"}, - {"evmos10swrrqhxrgnfxw5ke4asu5y7zgtdm2kv7f4arj", "1100000000000000"}, - {"evmos10t9hujrs8ndr6kxen2jjtqhfm7yucsw3sltqly", "203680416027953741824"}, - {"evmos10ua2etcjmez5sjdfpu2zf6gz4mrudz0ejclg6w", "55958203930434002944"}, - {"evmos10vvxcfydy59qx4ujs3qxse5zup3tccmrk3z2we", "5251068476905634816"}, - {"evmos10w3elrtuhvllxf2m308yl5tzqcwk73cfftguw4", "101839708013976870912"}, - {"evmos10ww55ngt9zrsrnrw7hdhl8wd9lex24kuqmlhna", "1001000000000000000"}, - {"evmos10wx7rykn8qsryhugal54v2rhtrq8utkvl5d06d", "1100000000000000"}, - {"evmos10wy9gr25wz2qu9l62ffs3gvtvt0n95wgg2gcqh", "1100000000000000"}, - {"evmos10x3pwvqazgyxyw86y38qy7x2yguwcld7rt7ha2", "3000000000000000"}, - {"evmos10xjmyvkaz4v7n8mu498n54hvrkgzuyeatk6d3g", "203680416027953741824"}, - {"evmos10xqe4y4vgqk48frgzm562qwh94umvrl6qv922s", "1001000000000000000"}, - {"evmos10xtqa3haq09h856h44jv5z3nlh73k65vgmrrfg", "129818309979193884672"}, - {"evmos10yp5kdvnj5c50n77ty2wukrk2q4kmvsnd284tm", "129363185668694719488"}, - {"evmos10zf9nuwfz4yepf8f55sjyyftg9gxlh8eqg4g6k", "45882504083542867968"}, - {"evmos10zrgqf686qkwj2wxxxe9amtdt5z0g8n4tuej2z", "1763581660408326912"}, - {"evmos122c7g5pvm9stw9c2mhs7e33nqfwm4gwlmf7dwp", "45882504083542867968"}, - {"evmos122lhhc2ytfphcsse4s4d2xk80mswryu280wkrk", "91766008167085735936"}, - {"evmos122zpmwpa9hw2u6h6jdtc8s74jxe38l44sgngp7", "9343829969404744192"}, - {"evmos12329tezf55hrt4cjrhnwajt9v46p0k8cl0k45s", "129818309979193884672"}, - {"evmos123eas223yup3j2gxxak4lc058x07c7q683llzh", "21000000000000000"}, - {"evmos123l82mm6r7dq4g5vn7qq0m3ucs7cngcu4lsw44", "1100000000000000"}, - {"evmos123unlvgymymz6rh857d037e7dc6uq7c5ejnqlc", "90001000000000000000"}, - {"evmos123w7x4mj9fln48msx4pzmls6ndqc5sw5y26z4k", "2000000000000000"}, - {"evmos124092sz9syp2zpwn2nveg680gvq7cx456qy0ku", "101000000000000000"}, - {"evmos1247gxudc34x80lajr3lwug92qglg3xlmdpgsk9", "73861106048759869440"}, - {"evmos124lww49rdtx5dncx89uqus3rcqjwqfrtzqkzg0", "22535100797521143338"}, - {"evmos124z0t2hcuhk9eqvddhqksy0rq49udkw7edadrq", "1100000000000000"}, - {"evmos1255r45pkzwmze47e6exuy6rxqk4rrjzv4rmug4", "1100000000000000"}, - {"evmos125u7w6uhm789mtrzgcqwcdlz6q9m0ezjg6uz78", "1100000000000000"}, - {"evmos126ddmmvjst89ds7cxmqcquhngk2x40as5gdmtr", "167872611791302033408"}, - {"evmos126yc02wwfn5zhuaytfpmqradlyjck8hgvggxf7", "108958177038411810816"}, - {"evmos1273syz8kdmyn0ychxyjepn6qecz3w7cd64a932", "5716949655702174044"}, - {"evmos127hdvsxy7le6jfyspxpqnfc2wxeuvauutra42z", "23357321377153489439"}, - {"evmos1287j0nqfrrv26uecrnhr6k7xsx9vk2uc2djqnj", "1100000000000000"}, - {"evmos128m7w0dcwmrahuzsnwas9l74qsxtlwjydj6jnu", "73861106048759869440"}, - {"evmos12a92ptn9fh9pdmf7hysa5w8tdtlzadmcefh6ly", "1001000000000000000"}, - {"evmos12ahx8fhqj5ttcaznw28kksez54r53x6qxxkd4h", "1763581660408326912"}, - {"evmos12ar5t66tgh5pr002j75cjja09er7qypk79lrtv", "45883504083542867968"}, - {"evmos12cc2dgz5xw83m4cpx8uld57h98cghwnqhxuhgs", "1100000000000000"}, - {"evmos12cf0y02vq7ezrhqanncf9pckrlfplq9v0ldmh4", "1100000000000000"}, - {"evmos12d767fv22m7cclte3p7maufugj4u05any39a7q", "45882504083542867968"}, - {"evmos12dc2cwqk79ex36jhp2xv3fzks855pr6vaexx2s", "1100000000000000"}, - {"evmos12dnx7ww4qnevqvh9t34p5zxhrggj5p0nhfd6rz", "200000000000000000"}, - {"evmos12dt7nqfqmha65fxgemulm8737ft337f49cvdfk", "29775925660743924088"}, - {"evmos12dzxynhkvukk8hgz7puakex9ms92qkg5up9m6p", "111914407860868005888"}, - {"evmos12f8jzydyp3a7klegjwqsy4jyhjvhel8v9th0a2", "1763581660408326912"}, - {"evmos12fh654hsfqfxxwp2hxhdkf6ahzyqu3nh4y4fqx", "1100000000000000"}, - {"evmos12ftnad9cfcdycplyxl38xwy025qf6xkpa5sq2j", "45882504083542867968"}, - {"evmos12gxgjyw22yj5h99vl9eqyjr2kar03my6zlq362", "1100000000000000"}, - {"evmos12h9nzmxzv6t0vky3sdzjwvy5jvrry6g2gakdx5", "73861106048759869440"}, - {"evmos12hsw3ppy77yt099xppxp7d2swa94zfk87rcn0c", "2001000000000000000"}, - {"evmos12hxu9luktz5pxpc7evxn7t0jq6v7ygexws6khd", "55957203930434002944"}, - {"evmos12j7rg02evw2nuzsq2llh8acvnwd3eltkhtwk3a", "124443747650766699695"}, - {"evmos12jny2melmjesap06s6nggxmq6gwtavjchaw5vl", "1100000000000000"}, - {"evmos12jx8haa2qh2asf2cwf36e684tqmnd6guugrms0", "532326015524905000"}, - {"evmos12k2klw8ez7ndhacllv99n85dlju9ytd0n35qs7", "201000000000000000"}, - {"evmos12k2pyuylm9t7ugdvz67h9pg4gmmvhn5va85utu", "1000000000000020"}, - {"evmos12kulln9f2vjc8vzzwg0uxnf3k4w2x30hu2pljc", "5000000000000000000"}, - {"evmos12lcc70w4wjgyc9k4sn0xxqgphtydv0n6ywhxqg", "1001000000000000000"}, - {"evmos12ls7mmpgvem0gk4qyr0l630xaejsrprmet43pv", "1763581660408326912"}, - {"evmos12lud2agxqsaeutpnhxfqfg3nhucmcxexq35p77", "3773045336179028563"}, - {"evmos12m9gvknfpgx95rw6sdtwmmwfm897uxn9tlsjxj", "1100000000000000"}, - {"evmos12mjcc93hq6flklsh75w8prddtzzp2u0hvqzqtn", "1100000000000000"}, - {"evmos12n9fuqpx5j65zyfvyekth8n8l9tjuvd0sk2sh6", "1100000000000000"}, - {"evmos12nj5mva2ydswpx83gsvwsznvdusrcwcyvmfxrj", "101000000000000000"}, - {"evmos12ny2mekl8ugs3c5tr9lvhak2ml6d4fqaf94tep", "203680416027953741824"}, - {"evmos12pvkecgjdxq05vguexqd968dy09npk06j6x4p0", "1100000000000000"}, - {"evmos12pw0j838ytpqhwdle67vrugcnkkd25sd3vslkh", "1763581660408326912"}, - {"evmos12qcuq77njgt90wacfwvznuhyjyf3dxj2u34j4a", "129818309979193884672"}, - {"evmos12qwms2zu24qtn5rk278rzger6ymthhyxdpyv39", "1001000000000000000"}, - {"evmos12qyqlqp2tptp5y48vy839v2tgc3zefkulmznd5", "45882504083542867968"}, - {"evmos12r2636hmc2qufheffu573glwc88azjcvfjjd5q", "45882504083542867968"}, - {"evmos12r35fypyvv3zz43vd0g3u82affkvq63lhwremp", "201000000000000000"}, - {"evmos12rdnytkzfyeqgwk8sc7dcvfcp26ar689k2s3xc", "3301000000000000000"}, - {"evmos12rgq0rmsdpjfdcf6fscp9rleuf6r80xqh2sjf0", "1001000000000000000"}, - {"evmos12szrklxuqftvyvt548zwe4997ajv5pqenx24tk", "147723212097519738880"}, - {"evmos12t68n3h2xm5907f7wt7pwvkmcr4lldmn8hgvgt", "1100000000000000"}, - {"evmos12tgkrnmdjcdhzj65d76cp0gyt834hrthll8zy2", "1100000000000000"}, - {"evmos12tjeytdqkh70zxxts65hnsmx06peyvktsjlhrt", "41000000000000000"}, - {"evmos12tkcj5lkkrh62qe96fw4zxsm0nehukh5esusef", "55958203930434002944"}, - {"evmos12tnr3xyvh0c22x4eul4qt8cpvxwjn5u34laj37", "45882504083542867968"}, - {"evmos12umdnvp9kca37el76mf0sa2f4zl6ht38rayw77", "1001000000000000000"}, - {"evmos12uuweyuphf6mlajazkpxke2hxwdfew2wzuq5z2", "600000000000000000"}, - {"evmos12v4ku5w970q2ry7sg4tc0hq8haf2a5hqevd4j5", "1100000000000000"}, - {"evmos12vs5lmyjfavlj892svwdqxzvjdq7ml3tzrcmlk", "1100000000000000"}, - {"evmos12wh95h6alu49336rmcdnxlf055j6zypqwnacva", "1763581660408326912"}, - {"evmos12whde9kcqsmlga3n2c6jufpatf329qzydwldcp", "1100000000000000"}, - {"evmos12x3q53gnh28z3kqs7aqm46wzc5mnlla3yvs5fr", "1100000000000000"}, - {"evmos12xehur45wr6slw865sd7lp4p98u8nj5uw2npaf", "85699387556059343616"}, - {"evmos12y6r39ku43zgv4q3kufl0tac7djuk7p0cqgnw3", "101839708013976870912"}, - {"evmos12y9rw67pvj7dl4nuqr34kj6nxv4awr65c2xp06", "91766008167085735936"}, - {"evmos12z6f2jc4ldyn48w5e7dj0cvjrwltnv5hnuz0fu", "1100000000000000"}, - {"evmos12zcmq3wn5mcm4ldg28g6wgz2sauc9v0yc0z7s6", "1100000000000000"}, - {"evmos12zsyqxfujy3glu6f6pylrnegus7fpt5y7u5lxp", "91766008167085735936"}, - {"evmos132hdn9a0xh35kdpdpcdal6f4je0yhvwlz0cs7u", "11176359149583614838"}, - {"evmos133t8m00w7llsslnf05zdhehharntly8dpsy55g", "30000000000000000"}, - {"evmos134gqghlw7k2ws7yad24e4kelp75jx0750ev8yw", "104924990083292908181"}, - {"evmos134s7kpchfpq9h8t8jkw5n3l3yla6mqlley4c7s", "1100000000000000"}, - {"evmos134tgc47ve0f3kyg8m2gnlhkrwhnp6438mtfcmk", "91766008167085735936"}, - {"evmos135qt9zs9azura5hg8h8cca3h0eec4kmyum2d98", "142855900688060277704"}, - {"evmos136kcdmuz957c6lg668473w8vkhv6dpr8le3xg8", "1464500000000000"}, - {"evmos138lmnxhmfscg600ree9mkqjhynheu43cd6kgnu", "1100000000000000"}, - {"evmos13ce5kc7u2hf82h44xm3s8uzn5x82q0z06kq23v", "111000000000000000"}, - {"evmos13d0t5yp9xn8kfue4gf52tumave923u902s79c0", "61000000000000000"}, - {"evmos13d4aur0z8e8n0us7ye0z3khsgv3yj8vdc0xsah", "129818309979193884672"}, - {"evmos13d86690cm4ymha4w3tcx5zth6z22gmw3plxgft", "27978601965217001472"}, - {"evmos13e9dz2ka54jak2c8t5e4sgu8773j2s3alxfuxs", "27978601965217001472"}, - {"evmos13fd8phhn3g0v3hvpknra0v3qy52s7x28x4rltj", "5282081173002256384"}, - {"evmos13fe2vuy0e383q64usww4v5vxkmz6gcnfvd9jyy", "147723212097519738880"}, - {"evmos13gc3kzl5hv8n3g0am830fh5h8h0eeedwv23kgt", "7671877054615092992"}, - {"evmos13gmvz9zrq56643esryvxyqh4j7frna67z2ptgu", "101839708013976870912"}, - {"evmos13hjsdq74p3nr7wsqdny4fxrr5pxzdv0a6xdfzg", "1100000000000000"}, - {"evmos13j0f5dauaneww7f02q4qz823en9gw5a3473vgd", "45882504083542867968"}, - {"evmos13jwj9zkccn5h6975aju3k9h2z76y3fcp0e5kjf", "27978601965217001472"}, - {"evmos13k0e2rprkuld77ww2tm5cma438xje0vsjslvqj", "10192461379243697742"}, - {"evmos13ldam6pmkt24dprrq90dtcsfv3s0hcwkfkgmf4", "101839708013976870912"}, - {"evmos13lnd6txgyfxj0udrj7ft28r6j26dlx4s34fsku", "35835230257808589763"}, - {"evmos13lqp97aaujr5c6jsam2k76gh3fxe9nj7x0jrfk", "91766008167085735936"}, - {"evmos13lsayduwx4fl5r3ucek2lhlv3xecjl5ent3t8z", "3526163320816653824"}, - {"evmos13n9hz85htwyus7c7jt7wtctmm02g78hvgjetcz", "55957203930434002944"}, - {"evmos13nylk2gj5jnn4ug0q46ap3fuh2gtc6elzhtla5", "1100000000000000"}, - {"evmos13p8vjgmhyk2fagtp83ycy9txyq3x8atuhfvjzt", "129818309979193884672"}, - {"evmos13phvznlhwsqgx7rk86n8feeu4wy2vzwel57rjk", "1100000000000000"}, - {"evmos13pmlxk9h9w5qcpeqnuz5wf03rv8hxpcfd9md9k", "55957203930434002944"}, - {"evmos13prdrn90xq2znkme66tz8qx6wy6ksqh3vlm9c5", "91766008167085735936"}, - {"evmos13q8sr5f6d25fcmz9tm4nym4sw5dhp2rkdd7azf", "113677989521276332800"}, - {"evmos13qcfvrncd9juqxphuz9nwuslhca5hsarvhtxf9", "244241800264144125952"}, - {"evmos13rdx5j0p7nryw5uf5tk42e4ymkh69dx4aevzej", "1100000000000000"}, - {"evmos13rtsec7tg68q4d74lv2qp5h6qjnl6z8l8asp7e", "101001000000000000"}, - {"evmos13sduv92y3xdhy3rpmhakrc3v7t37e7psz22dhh", "193605716181062590464"}, - {"evmos13sg7xca08g4afz7m0qffmk7xqqtggxpz5nsdvr", "49169992863378995712"}, - {"evmos13t0vcrdlj3vju5pqgwzlyr7lcw9s96ka572xzp", "147723212097519738880"}, - {"evmos13t8dntljs6ukveuavml34r65fa8afgv29rjzyk", "1100000000000000"}, - {"evmos13t9w8y52cw6z3x6dfl9snwktmy47mnn0k2a4cz", "55958203930434002944"}, - {"evmos13ugmpjgtpzqfmgz0835teyjycvhv266rq54vdy", "2000000000000000000"}, - {"evmos13uslufkhmu9qkzu4rh39urzn7p3ml6mkgfj3am", "55957203930434002944"}, - {"evmos13vep8j9ud3rlrdfq8nnh9k56cevvt739kmzsr8", "1763581660408326912"}, - {"evmos13whwqvhc8qdgu73w0s0q0lgefxv0k68w9rdrzw", "203680416027953741824"}, - {"evmos13wnjd2ajkhpg8ad929fa0y0ll6qcmgt65rg2am", "1100000000000000"}, - {"evmos13x2pd65eqt6stc6p2h842dhe788wk52rnuna2s", "101000000000000000"}, - {"evmos13x4dge7z4vxvz0h23t0hamakfj69y5uj4ea55a", "1100000000000000"}, - {"evmos13y0vnu93feryadu20uzrsm5p86ppk304pmgzpa", "1100000000000000"}, - {"evmos13z7veaqncplqr3t0lazx0hq8zlw2sryc6rfemz", "195851213756519055360"}, - {"evmos13z7wddcsnc6gfzsyj2hrmqx0lha36qsrn5ne66", "17009982989759789749"}, - {"evmos13ztwpqeaxudrtrhqd6a86szj60nf4gvfhsp29q", "21000000000000000"}, - {"evmos13zyg3z9aqdf5mmywj7suvv7q8nfje76lujq5sp", "1763581660408326912"}, - {"evmos13zzprsdveuhnyujyzulr37jppaj44pvagqrxx7", "61000000000000000"}, - {"evmos1403mfu687f5l83gd6jlzqukap3qmmle2jh3xlw", "73861106048759869440"}, - {"evmos1409fqa0wv8ey550ek2a63yk36xexe09m8t5sds", "61000000000000000"}, - {"evmos1427grrk3nzvswh3aqgf50ecyqx9frpgt9tj69s", "1001000000000000000"}, - {"evmos142uea3pgxdt5xwu3u3xf8e6kar6zcnu2zjjg3d", "11000000000000000"}, - {"evmos14364t32k9euacce805xcjcfzzmtlnuy29nz7yv", "108183450795672426240"}, - {"evmos143f7a767rmqsjxfc3q3rkqvhvtdaelljlds42x", "6831841138891315968"}, - {"evmos143qxzcrpcuch4cyd2zcrnen55v8zpxr4f3rr8f", "129818309979193884672"}, - {"evmos1449xnvlhxx9w0klaxx24gmk2f9fctlyuq0tmly", "64840864650929097728"}, - {"evmos144cpdufjuatkuqtm89sj4f6v987spp4l6xgkl5", "55958203930434002944"}, - {"evmos144czwftrthl42h9mxhhxezc0kakqj88pp0dyw7", "1100000000000000"}, - {"evmos144dt7tlwygqmhtgga2xszuf7v3q9puk2894qpj", "1100000000000000"}, - {"evmos144tvmvne39psrzqfp6z55z7xldvk406wp5rsue", "4675014832085119514"}, - {"evmos144ur8a2mse04nqg009lwhyv4c0zq6p4sftecm7", "11000000000000000"}, - {"evmos145574vcna8djmptq6j2rztkqgeyq24ve7u47rm", "91766008167085735936"}, - {"evmos1456tqm327vayp80hw5ar3hf92cqqnzatlvajyt", "129818309979193884672"}, - {"evmos145mrshnuv8y4j2vqew00p903uqhwzv8hdwru8s", "1100000000000000"}, - {"evmos14629ac6v84ys3rs3np0q7we7nqmxx4j9v0eafm", "111914407860868005888"}, - {"evmos1466ws5v3tgwsws694szwzeltx7jsagrr07uz5k", "1100000000000000"}, - {"evmos146crg8asxmq3v0vvstzaugtmfu007uxwj3fpgk", "8466566493008594125"}, - {"evmos146q9h842tgz0xpa589yyakypuawndtrnnlm2ls", "50882086169259390"}, - {"evmos147jhkwkyqt0k39vkd9q37d47lgw8fagzwr8jyq", "1100000000000000"}, - {"evmos148dk3xruhrxnc8lnmhh4zf2lxxu5krl8em0vw0", "1100000000000000"}, - {"evmos148gz3sr2u24wznz902n5aagmcpc7p2s8lx6uxv", "231659017993170763776"}, - {"evmos148xj8xurqkun5dd457xn75yqj6x2z6dflnt3tc", "3281667866044542976"}, - {"evmos14955wkmlllde0u5a7pr3rr0ae2s3ygqf63kw36", "401000000000000000"}, - {"evmos149cfuapz8cq6j4mz555hjayd2h3zemcpg3j8sh", "35895591911416284160"}, - {"evmos149g2tl9xakprzs5f854ntu5fthdgmuqd8uupjm", "455487833714906791936"}, - {"evmos149hzuqd3q9xs7l45qleuceswfcwljmlyqnse8u", "83935805895651016704"}, - {"evmos149le9w76gjauv2j40msgfqvrd3fu032qual3vm", "1763581660408326912"}, - {"evmos14acrwq72mc3htwxyevah3s9e02ph45gssk8jpy", "1100000000000000"}, - {"evmos14agpgf49qa27602g5fp82xvpkwp805fvu4edsv", "45882504083542867968"}, - {"evmos14aqnlx8trmtcr9fa3kqykzmen857tpmu8u4x2k", "91766008167085735936"}, - {"evmos14cn4cwavhypq5wqcp880nrjkr2v33xaru977x3", "1100000000000000"}, - {"evmos14d36g5xprgp0t5qmfxtg6hmlm7nxapxxwnfa6m", "101000000000000000"}, - {"evmos14d908ulmn2v3grd7w9lvhf3ctfnhhq5w9qply9", "6000000000000000"}, - {"evmos14d9tamuq2mr0rch6tvllcjynpxqhn2tgmm6fd8", "1100000000000000"}, - {"evmos14dl6t9qmgeg5w3keg2988w44yprglrvp004tm9", "1100000000000000"}, - {"evmos14dpp3z6dalsfxfxexkdz0aglynz8pr9fp7w2cm", "1100000000000000"}, - {"evmos14dtazqy0re6sv6tfa4mfuqul7m59wn99tx75qf", "1100000000000000"}, - {"evmos14dvqrf7nnq63hzlpr3peupw9kvje4myms5wfhd", "101000000000000000"}, - {"evmos14e8kur54kl4c8jmt8u2gvhmlcg3llweepz7l6c", "27978601965217001472"}, - {"evmos14e8wteevrg62y5dss5sxvp4cqyv0d8aa0v3l85", "11461583665676145625"}, - {"evmos14euxrjqdqwpxsda9pdz6anc3a3nh7evx4v49kj", "1100000000000000"}, - {"evmos14fmkx27u0zezwch4txd9w6deh8nvcuet0het59", "382071840000000000"}, - {"evmos14frjz598zntwctsfnc63tam49shzs60pqv9zez", "147723212097519738880"}, - {"evmos14frv0nkhrdy4t20kyf6zujtn4ywm47fwjhj9q5", "59991000000000000000"}, - {"evmos14fupuw5u4h97lylytscvxhpwsa8t08wrfe8u46", "1763581660408326912"}, - {"evmos14ggcn4k0ufm2zztg22tcd7hupnwxn9wmrd9984", "1100000000000000"}, - {"evmos14gzd7tpsrteha4g9z5h4jxecynhv2ade6ak4wk", "22183774701088739059"}, - {"evmos14h750yj393tqze83z30ks2u5luxjupkd6h3v76", "1100000000000000"}, - {"evmos14hrfsuupeaelr96edwjf6xckpzk2yfjmfzkwhr", "2000000000000000"}, - {"evmos14j3lqcgqlxv23x6j67zm4zdgyl7lqsy9knqxp8", "81412702652398124000"}, - {"evmos14jjgxtd02kx96lvdd7nkg96jc9p2j6fxv5x9g3", "1100000000000000"}, - {"evmos14jtg3aqex7rfys8070nuzfuupjp8p8mxjelxua", "101839708013976870912"}, - {"evmos14k3nq55e83ugysv803eczcfxuynffn8yn2pk4d", "1100000000000000"}, - {"evmos14k67qc3sd2arzqucjgafhnae7zmrz6l8wa6gna", "1100000000000000"}, - {"evmos14kqgx2j4jaww7ge035avjdmejpafhw5dvj72ga", "195851213756519055360"}, - {"evmos14kz78pkxasxduf6a6e858cl3luaeexth5ps54r", "227743416857453395968"}, - {"evmos14l7avx4y9tpc89nah0d7n7s29q3fv8ldaz5xnv", "1100000000000000"}, - {"evmos14mtc0fjet9c4c65s7lfxntwpy8992v6tsc8ffs", "1100000000000000"}, - {"evmos14n4l5uvy67ckn5j6e8q2mhp0t9ncqy9f2r2gxn", "3001000000000000000"}, - {"evmos14nkmkhkcqjp9j9x4299zpazj9zfp7f3lzaxvvv", "2000000000000000"}, - {"evmos14nqqpuxgtqjm427s86wzm57w0qr7nfeydzs0n0", "1100000000000000"}, - {"evmos14ns6cx2wwwh2x9vq5pyjp4wmumu99dp9quq8w9", "1100000000000000"}, - {"evmos14nwem3v7flrwzusd0r5r9chcyed9y8wee3jfdg", "11787810093859429120"}, - {"evmos14p7nut0vlmay4ld32glacluvx46qwz9gzut86y", "34084144845434997446"}, - {"evmos14p88kcy3dxlh9ld392jemwha60cz4e7rn3rmp0", "59273232041077964268"}, - {"evmos14pnzslgy7vawff7k6hcz7tpz550ym3s4r3md7m", "101839708013976870912"}, - {"evmos14q8a3xz3vh3nr0un85nnrzetjw9c88ex9yte38", "1100000000000000"}, - {"evmos14qydjsrgnsk094dg7sm955a0q2lrs92gectld8", "83935805895651016704"}, - {"evmos14r8xy0er30mrdyv9343ylvpm4c90thtkpwy3wf", "45882504083542867968"}, - {"evmos14r9efqvam3qr2jhh4mqp0x64533a4kyxpzzkjx", "1100000000000000"}, - {"evmos14rm27pgxcpvlzy4nkyxrwyw2qjk267t672xnjn", "91766008167085735936"}, - {"evmos14sruzz9x3828a9ng3d7ze8red4s2kfzpskhp3y", "91766008167085735936"}, - {"evmos14tcxx9z6gtdslajzz5qjlxu3vl3v23djx7t9jl", "343573425854038769664"}, - {"evmos14tk4wvgru0ucrpnufnf3cen5mcwg5y7r22zttn", "199764814892236374016"}, - {"evmos14tnymts90zsfq0aqmttne5fqp2365uqeslgh9k", "101839708013976870912"}, - {"evmos14uxy9fpdfyamzmu9kcfenuk04any0q35mdvydd", "201000000000000000"}, - {"evmos14w5zaz4d42pw02pdvt5ztvndshu23mwr5ussc6", "45882504083542867968"}, - {"evmos14wk26zyeyph62huhrc355mx0zx9ul44n4knl7d", "1001000000000000000"}, - {"evmos14x4hvhsws0vv79ea4cq97g6yafhw055pf4eajx", "1100000000000000"}, - {"evmos14xgdfdnpjtulj6p7rkc75ekxqjq8hc5cu8tem9", "343573425854038769664"}, - {"evmos14z4ralqtw4mh474xgvcqgeg2cwyuth7tk9muml", "1100000000000000"}, - {"evmos14z7fptkpe9yw4xjd2508g36d3juz0cgjk29tqe", "5887727836789110528"}, - {"evmos14z7gdsgmsdp3q047yuft294rlwra4h8sk5fxkv", "501000000000000000"}, - {"evmos14zc5twc5s2a69snx0d2h93phutuvy07atm8nnn", "24231706050187391849"}, - {"evmos14zgqeyl2z4dhqez6lh5n0uayzfallaunh4w3ma", "201000000000000000"}, - {"evmos14zswghe7hjkl4us0x93y0seprhugz0f90jr20e", "1100000000000000"}, - {"evmos14ztjsxy0rwfnd2ch88v6k3xv4krpqv8cc8akhx", "136119259478854389760"}, - {"evmos14zuyahuycjja48w8x8ljtghmhqjm9d0tf7cefw", "1001000000000000000"}, - {"evmos150jk07dc4kq5qwr8hwm262jhjckhvdmv4khysr", "1100000000000000"}, - {"evmos152309hw6tzcund7fh89cca6a9d9f9j0e46nlfz", "501000000000000000"}, - {"evmos1530alm0zuafql04v3rvm2m08dyhwmexpq9fyw6", "1100000000000000"}, - {"evmos15375jc76ntqt5znlqcma3uj56j96tmwvkhemml", "47429286425947844019"}, - {"evmos153hahu5dpy2wmgky3gapxc98vwqket7fmd7zga", "1100000000000000"}, - {"evmos153k282pxkk98ckm6uhpc8q3yy8jg9kapvnyzpy", "11000000000000000"}, - {"evmos153sp7fehch4fypu9sx67stnfwqwugwerutrjw5", "1001000000000000000"}, - {"evmos153zthg7x6ec6j9jk8rz2gr6h35ayzv6m8e4flm", "50000000000000000000"}, - {"evmos1546826s5he0n4pqyjdz749ggync4h45z98lnv8", "101839708013976870912"}, - {"evmos154v45gv8s7res5q9tw8t9r3txr68sq0zux8nmv", "45882504083542867968"}, - {"evmos1558cma0t559u49c44twswkc9lamm0x2yw4qxnq", "2001000000000000000"}, - {"evmos155hqffrm6dd5l0ezx4fyw6smdeazzxvh24ryyp", "1100000000000000"}, - {"evmos156dtwxdgqyterlxhc2mmddl83eqq033utn9ny6", "1100000000000000"}, - {"evmos156k53kura06kh4qhuth44pgu9wknutq3dm4vur", "1100000000000000"}, - {"evmos156sdumhg3h8rtz0gc8ydfrjgy5f0c3dkqfn568", "1100000000000000"}, - {"evmos156splsw8w726nxmy6ye37jdqccgav46482670q", "1100000000000000"}, - {"evmos1575skhp94scgw3xeh9ktk9w8hfrewsy6g4rw37", "251000000000000000"}, - {"evmos157jal708urg7uvs0602ljmwx38xuu53qjsa49r", "21000000000000000"}, - {"evmos157reymgaujhlsr56mpff3n0r9tu5lhs4mrfdc9", "1100000000000000"}, - {"evmos158wxz67dk0j9jylflz2mx8j9rgn4r30htcwutq", "1100000000000000"}, - {"evmos159qrz92dtf960sx47vzphr8yha7wscjdlnwhfm", "107498893177300089856"}, - {"evmos15a8z32c006w592s2zg887kmhj5p25vjc7r998s", "5793130626125204336"}, - {"evmos15c0r4zwd2m9xeegmtj99c2xfxz242l86dnwra3", "33513376331890785280"}, - {"evmos15cdyw9y2wthsc77edv9xhjmklww8u5urwmnjqt", "1100000000000000"}, - {"evmos15djwy0ktxd43xnfddtt3hk4a9sds64rsdyut24", "1100000000000000"}, - {"evmos15dlu4ks4vtutzgrrl0f7qjlwxetsm9e8qkd5dj", "1100000000000000"}, - {"evmos15dt7wntvldk5txhqvvff4g63tn2flfqjrtes8f", "22080658831241470464"}, - {"evmos15e8hv6hugvu6s4zul0k400a5nff2kq9qec500p", "185775513909627895808"}, - {"evmos15exppsqp562r86rwvx0kju833w35ffjsqwasp9", "91766008167085735936"}, - {"evmos15f4n8hmccsyg26p7prdl5929nr6ply9xm0tujf", "47646085743951194880"}, - {"evmos15fw6k8hf5w33sqju6jaxyh8m20wy598nvrxt53", "45882504083542867968"}, - {"evmos15gn7crx5v3gnnm0c6sjz2gzjnph3a4t9883e4p", "91766008167085735936"}, - {"evmos15h7zckscylqhh4cy6m0sl4z9mzl48xg4xk5wka", "1001000000000000000"}, - {"evmos15hjqt2psg3kpuv0r6c0d6xugqft7uwf0vaa4sa", "315594823888821747712"}, - {"evmos15jfgsafs6wt704ls5lwlat66z8p360huct0pm2", "1100000000000000"}, - {"evmos15jr5lffy9xrudrpceud2pgrptccryqhnu68l6y", "1100000000000000"}, - {"evmos15jxzm5nwp87hszpa7d09lyhl6u2kheqze4wxsk", "1763581660408326912"}, - {"evmos15jyafu32dsrephnvtnavd6wq3vhsfmeg0378at", "9001000000000000000"}, - {"evmos15km3htq6w8zu9g3xkc080rp2ww8ldv5h56ww7u", "1100000000000000"}, - {"evmos15l62rwn7qmyjqdh0k4vnta0k0h75fgek3z8w23", "201000000000000000"}, - {"evmos15mhzjaamr5q82kh68nl0dveggtyfp2vk7tu9fl", "91766008167085735936"}, - {"evmos15mkjntu30zgx6pzjv83acvcp4m87sp6759n7e5", "45882504083542867968"}, - {"evmos15mxe5lzxez5juh2d95eshl3jpc2w9ephurafx3", "45882504083542867968"}, - {"evmos15n2wdvrfd2a8vwnnvvcqqxlyl7gh2vkzxa5cw0", "3825774129192919561"}, - {"evmos15nd6aac0cwp3yezf42d3sxrqlrlhl4hhpw5ph3", "1100000000000000"}, - {"evmos15pcffl7sh6zv69xzkf6fs6j5jxuw86736geaeq", "9985500000000000000"}, - {"evmos15q8sdx6083mxwkvtpywcf39zd7v78ququc4r8g", "1500000000000000"}, - {"evmos15rdhd6w996sfgx78ud6qvye9w04nn76ezqtje0", "315594823888821747712"}, - {"evmos15rkq7q48um3zt9286yxch42ed8k73fnzcj58jk", "73861106048759869440"}, - {"evmos15rzu3v64gdr2r3ztjkaklssevdy5j4zcsytp0z", "95952554983047722286"}, - {"evmos15s2meenm76lw0eeekjdu5a4gyfac76eetfrm5a", "1100000000000000"}, - {"evmos15s4vy7uygrc3qhxa2t75pwkg62yf97zkc6awfl", "1100000000000000"}, - {"evmos15s7ezcjrddgeagk6v5y8e94cj3k0ul8hn2av8y", "1763581660408326912"}, - {"evmos15sd4x5p8j647dmtxf8jvk84fna0aaz9sffzktd", "1763581660408326912"}, - {"evmos15sl4r7k0rq8f0kk3eegss5qpnn2naj3sa0g4ru", "1100000000000000"}, - {"evmos15swg0fgc6sdgm2l7xqzc3nn9uwnv66570j7g9f", "47668009092742613082"}, - {"evmos15uj7dqnhtzg0fgyey03j3s58w54wlnz2pgzeuh", "1100000000000000"}, - {"evmos15uqz7z3t25gyt0t85x3ca6cq7kngc0lv2puucg", "2000000000000000"}, - {"evmos15uu798ast2776zn38537cxphglk3t4nyj6jkyt", "101000000000000000"}, - {"evmos15v0pn2x86zuah5g3yu572st0gfugwkdfvga94q", "12276200167597400064"}, - {"evmos15v89w4xun6hyza6stfzw3aer56aze5pur0shuf", "1100000000000000"}, - {"evmos15v9q77g37am6a6u8eqxf9d2vej66sqvh0c2s9h", "45882504083542867968"}, - {"evmos15vquaq2n6rh9lrl9dc6tvjlz5k65j04e7y9n2h", "1100000000000000"}, - {"evmos15x7q0vzmksgd2y42da9cfhrx3uc8w9sp9tk67p", "83647118960730024742"}, - {"evmos15yfpxuqtwfhaq7w3htyz64uhjxr4ke3gajjhpp", "3134513655717138793"}, - {"evmos15yg094qpmsuk8c0e2keruk9ma8ndtpclzazvpf", "1100000000000000"}, - {"evmos15yhz9p8l9kk5e0a4wzgulfyn762d8e6jea74el", "1001000000000000000"}, - {"evmos15ylapzu7su76x2esprc8zcuwx8pw53f5es22su", "11464500000000000"}, - {"evmos1607zqq4c3ex75480tkslu2nwchuquf9qxyg8ca", "12764984866730584188"}, - {"evmos160ppdj4y394a8j50w2ktd3g0dsma76vw9uf5fu", "21185545335544641280"}, - {"evmos1628jvheknwhrkl82acj9m5fr5gzx0waew7s28u", "1100000000000000"}, - {"evmos164gh7te7z4x9w74qqw224sdqx5qqaad2awyyft", "3001000000000000000"}, - {"evmos164kcyhg6yvlqe679375e0deemlv5jdrtl9e3ew", "1000000001000000"}, - {"evmos16545z4633elm2lq8nkjt6zm79ptaq9sm822q7f", "38967572852502157024"}, - {"evmos1654jqfr8uvdvn9f58hd4ggf3slpn38sr6ed076", "1100000000000000"}, - {"evmos16569apm87kresm2xfjgnufss348ph5qq7u8f58", "1100000000000000"}, - {"evmos166rqd4vrqnmv63ec2txgld33lys83udkxjgf2e", "1100000000000000"}, - {"evmos168299nvqh0xxu4tjvuv8qcunhhhkl7k68c8uyl", "203680416027953741824"}, - {"evmos1685qcm0hn5hcus6d8nr00v5mc6p73k2djmmkr7", "1100000000000000"}, - {"evmos1689kjja66s8jmlvtcsw534z8aejazz6r6gt6dd", "27978601965217001472"}, - {"evmos168aehdrn82ps7rguv466hpwmj7r0llde6wwdnh", "45882504083542867968"}, - {"evmos169tad70eqjre63x4n0drj5pa5lntlgs2xdmf9d", "5001000000000000000"}, - {"evmos169xephq4g3l66kr30jyek7f0we2jzt6rlwvlc3", "1001000000000000000"}, - {"evmos16a32p6y2tmwk58f2fyyy4neaqnzdgd8zqnk2n5", "1001000000000000000"}, - {"evmos16a3u9we0tpv8lc4fp3khk3x45wfvh45m2hx6pr", "7702530642609527070"}, - {"evmos16c0q38g372rh482hm7sncd4wp9rlfzjrwwzea0", "1763581660408326912"}, - {"evmos16caqyryrvzk0043pyvly7a8afe2mvhcdgtkf2p", "315594823888821747712"}, - {"evmos16d374e4hcaam2sfnpkcjaulls7ym3qsgzfql6z", "55958203930434002944"}, - {"evmos16d89a9hlaymgunwznud6e9rsrrfv3qkmfysg35", "106832110903005580288"}, - {"evmos16dcwlyrwx8duucsr363zqqsf2prc5gv5vamh55", "55957203930434002944"}, - {"evmos16dync9juk3dde8hh8j00tvhr7u0aa2v38lgd89", "26745827585993878846"}, - {"evmos16ef3k9xk0xn7phja9lzdu0k8gqz5usqkwzt6g2", "1100000000000000"}, - {"evmos16ez4690wcv09yekukwl38txg3xz34xswga0ajy", "11817453381915651542"}, - {"evmos16f9z3x8x5rq9t0x8f8drqgsd4f7dw5t4lzwvq2", "241732717840061898752"}, - {"evmos16fc6y2ps3dpdtpwph8kdvu2zy8glk4z3lxtxfs", "83935805895651016704"}, - {"evmos16ffcz370hhcdlp02nggvcupzwtpxng7y0lc5tk", "45882504083542867968"}, - {"evmos16fg5a4p09tvgdkm93q0hhm0jnyc64t2t57jel2", "111914407860868005888"}, - {"evmos16fq3ew0t7y2xxw7ptkjtf7ff0xf63pjgtt8gja", "54603027719287712512"}, - {"evmos16fth4ctjqjmlk2y0zlld6aldl7h0m6z696kjus", "1100000000000000"}, - {"evmos16h2ynrzwhxgjnd0hswkvdvq9nav9kklqwdc983", "22198136772201167372"}, - {"evmos16hce06qs86aee76n92h56ntmxq3nwaxgdae3kd", "21000000000000000"}, - {"evmos16hg4rr0xsg6mjtqw2zj5t8jvd6tmsfhvm2j6cc", "101000000000000000"}, - {"evmos16hlmwf3d8shuhd09x2g54uyq9d2urv5ujyd32w", "27978601965217001472"}, - {"evmos16j7weuv879u6qg8fyl0kawzmaq2sqmcqgm6uva", "52972264742662446499"}, - {"evmos16jw65lfgx7eetdxngmmr0rv7nsvzqmqumlrl39", "151661712709707548416"}, - {"evmos16jyxtj4ww3cnavf740axgx4329kq7mdfk0nxsn", "1100000000000000"}, - {"evmos16kdzlw8yyc538nqfdadwtpswf9af5v6x4fs34p", "1100000000000000"}, - {"evmos16kjzhmyyyyumxlm3qtpae598g86ygn5p680f96", "10000000000000000"}, - {"evmos16klmnef3xakgdaq79t4wu7c2ljye3zhsw8rg96", "11000000000000000"}, - {"evmos16l3t3l07dfxemc90eswacr0dd0a5uygks2lv8p", "1001000000000000000"}, - {"evmos16l5tf0vpgpaa5v3sc2yj7wz3uwan4mmms2s8gc", "129818309979193884672"}, - {"evmos16lgrt8x9tyerv0yane4tkly865r52kjmdn6ssg", "23619274359948071643"}, - {"evmos16mj6v59p4cp3juvzms2q7dua2lpuctwv5k224k", "137647512250628603904"}, - {"evmos16mr07ua20uk5jr0a8zcn956l8gd77ypr6tenp4", "131581891639602211584"}, - {"evmos16mwm6d38yuz8pgta2e0frqee59y2jsknkeeegg", "45882504083542867968"}, - {"evmos16njrx9urzd4q9ph6c82cjh4us8zhcgkgtlduus", "1100000000000000"}, - {"evmos16pffk5a6u70t7q8y98w8fjyhlsmj7cw7qhjn67", "57330170962422299392"}, - {"evmos16phjecw25muxjyxgft4jxmwntvx24xhc3dnpmz", "315594823888821747712"}, - {"evmos16pv3l5vqxkxr8gxv286tzpsmc7xx0fs4wu7uke", "147723212097519738880"}, - {"evmos16q577m0vnpj4r7xpd7zwu8ymqqq8s85753vr7t", "47646085743951194880"}, - {"evmos16qa54kpjuhu3780jkev2vp7ewyzre8df9qv9f9", "45882504083542867968"}, - {"evmos16qwr4mgfe7pvjx3af8nyrjs9ace6hvgk3f3rf4", "45882504083542867968"}, - {"evmos16r29wj4uyj6knxgekpeeueeyh3vqpsnfshp7kw", "101000000000000000"}, - {"evmos16r39ghhwqjcwxa8q3yswlz8jhzldygy6ska9ts", "171786212927019384832"}, - {"evmos16r9jc9y25zpw8x8ajusgeh4qfmu2uk5zu8pwer", "1100000000000000"}, - {"evmos16r9m2djj4s3rfqaqly9cmfufju8ghqpzhy6x88", "55957203930434002944"}, - {"evmos16ree8zn6s7qzj807ectt78ymkzgjq0kuh0jjpu", "13969840000000000000"}, - {"evmos16rpx3nmpfdajl4sq2lx3ptmge7mgla30754aa0", "1001000000000000000"}, - {"evmos16rqt6ka8w9ludaf2qwkhpv0s65gput892umqlq", "1100000000000000"}, - {"evmos16rryp29jkwqcuuds77pmjrc9j2nwmg7faagduw", "101000000000000000"}, - {"evmos16rua749nl07uhaetnhvdqc5wrwp7n5q5ewxkf3", "27978601965217001472"}, - {"evmos16s9mgcgyf2xq2l0pvyxgmgz6wsr5cmm62p4kz2", "45882504083542867968"}, - {"evmos16shn6m33ngncqrl0kfna6j4cld45tf8hpy3za6", "1010000000000000"}, - {"evmos16t5pr6njw44dxyua0k698j473ff2kxcr86xmyq", "27978601965217001472"}, - {"evmos16u2wyl4kxhzru6k7zdv2jx2ql489yks0jwdjsr", "49923117496432943180"}, - {"evmos16u5yk59jr338q29lwj65e0ffnen5h4hxgg9rjd", "55957203930434002944"}, - {"evmos16u80xh8ghva9u0wkl4mdvt8lwj4ak0lvcakaw9", "45882504083542867968"}, - {"evmos16ujj75qfs4kg7055nztenwknfez4xjskztv9rx", "259637619958387769344"}, - {"evmos16v6dsq7tmlg08cvs7g86776x908pz5hx35prg7", "231659017993170763776"}, - {"evmos16vezn4xnqzckff76z2y08090mm5e8c4cntyku9", "1100000000000000"}, - {"evmos16vlph8cf7yj9pl2pkvkh9kdpx7dmajxt07gnt3", "1100000000000000"}, - {"evmos16vstj3wrmeh74d85xgxwrxnsz4efw7undrmd7x", "55958203930434002944"}, - {"evmos16w48zj8jp49dw2q0ad0zcj7vfsqurgygfxtfeq", "221000000000000000"}, - {"evmos16w89c7z64nzp3xny6dnhpzze7kvrquzzs08yl3", "5165518835364212736"}, - {"evmos16weejfngsalxdrsmjl8mn39f40yllmr2ljaxxg", "91766008167085735936"}, - {"evmos16x9rqwca62u7kta32apvlzfypaut8rukvk3qtq", "1100000000000000"}, - {"evmos16xave7g2ruzp4y2h6702rfh5s5g8txamvkvlj7", "1100000000000000"}, - {"evmos16xewnf0eq2uhgw98p45mvwqch0w6wp6g9f5j3f", "1100000000000000"}, - {"evmos16xp5mg3q0duq36kd7t4vfj43cm78hmresce86z", "91767008167085735936"}, - {"evmos16ydvhwtxcs34y4ty8waun6qscurr8gllevt89y", "7475791850719459342"}, - {"evmos16yna2mkpzqy843y5qehqs9ej8hpgzzrzj3v6rf", "1100000000000000"}, - {"evmos16z4cj4wkpjfuqgcst0flhudzv3q5my2eu8uw9y", "1100000000000000"}, - {"evmos16zerlrnddu8mshd048rd9hz20aecfxeea3dur4", "1100000000000000"}, - {"evmos16zkvgj9za00a4d4yhjkv4jweggcuqsh30gud3p", "15430186128860684288"}, - {"evmos170dnu7wd0ht4d496htzt04jqq0lykvl60dt9ad", "1100000000000000"}, - {"evmos170ew0zra3jgk86shpexcexr08khplkp60spnme", "1588570985570355994"}, - {"evmos170mp7nywyjy9hkt0pcw9vylgcdmylehv8hpk0z", "12656623981088892844"}, - {"evmos170rmdzfr0u8dch098vjy3pcx3dfas8agaxvqqs", "1100000000000000"}, - {"evmos170va76yvj6sy84fe69nw9kyd2d9xdfdd4w5tt0", "54029628569903901172"}, - {"evmos1720qgqf9cjxceqr6cfquzswnuaan36ynt02ppt", "84857047274813263872"}, - {"evmos1723hk8g5zwz9uvdec2k8qpucnclv8855kkurd3", "1763581660408326912"}, - {"evmos173j5c932y4n43hkhhjfs2ve79axzpxzf2727jn", "31504765286033655296"}, - {"evmos173jvldzzj3l9z4wn8pqvjvfel8nv90s3akjmh5", "75624687709168196352"}, - {"evmos173m9yt23gxa2a6vc88z4xdw4zkusuymzzxghej", "45882504083542867968"}, - {"evmos173r4y6mnt78yzuc66fjdmvgfa92ykldxz5vpre", "5108012395938199026"}, - {"evmos174qw0s0nzl0878qckkqtafmqkm3a5y9w8q4wxd", "1100000000000000"}, - {"evmos174tctz2fndzwp48telmm07fg6a83p0zjtg2nrt", "1100000000000000"}, - {"evmos1753lgzhcr4wk39rglta944pdlx3a6v6n744ujg", "83484149752661635192"}, - {"evmos175503vnaqd0svp82ztjh7caap74xtyxl9e7wup", "21000000000000000"}, - {"evmos175a5jrgx686rm2r2qa9y0fgwna8z8wmw043knd", "101000000000000000"}, - {"evmos175jnwnk2g7n24dak4h03rt0a0jc728u9us8sg2", "1100000000000000"}, - {"evmos175ycuc23a899any2hg3xzsu4lwcmy4nc3kxyd6", "91766008167085735936"}, - {"evmos1760jhldmrgumts3zgdfwx98pm4tuzp93ulsr9q", "71555583415353877504"}, - {"evmos1767fe8lxl0jmh8afn04czc6uvdq7wrcn9vfn82", "1100000000000000"}, - {"evmos176dy3095l6eh48z06rflsk2dfzdzgwtpdwdx4j", "1100000000000000"}, - {"evmos177c97xvl969c9gvjr4k4gz8sm48s36p5xd025v", "144162630543847106617"}, - {"evmos177l3072wtfqta7ymtuwju0f5l4zl0n26hrh88a", "101839708013976870912"}, - {"evmos177q5kh8v7vvswaz5yrt865k3ezckw92py8cman", "1100000000000000"}, - {"evmos177vwaa9pkwpdh2d4aqyrjl0wnpw2hk8lzh3ccs", "73861106048759869440"}, - {"evmos1795ywr7vdw27r6qr25kjepdwgepmejq3uhnf2n", "111915407860868005888"}, - {"evmos17cq68mwu8t60sj677qm32kck8meppm8l3weu34", "1100000000000000"}, - {"evmos17d5y9q5qsmf8pugsvyawk6kf2qnpfvh9t98jlp", "91766008167085735936"}, - {"evmos17dyyyzsgujswnuk0yerps3yfhqgs80lgu3yv9g", "1100000000000000"}, - {"evmos17ef5cf0lqpkqsxud3h67ydd76gs0t0l4p6mv83", "1001000000000000000"}, - {"evmos17exgnwxytl0ru77rw33tkc4n93tjxqs7w9eadg", "259637619958387769344"}, - {"evmos17f55wsjmxzwuclx2gnz67n0vp6wffmmmzqw6t4", "1100000000000000"}, - {"evmos17fr8auum7u5nhks25wm3z8uv4dtm6t786vh3k4", "1100000000000000"}, - {"evmos17fsr4vqgx9sv3sa67r5wt3wtq5szkqul4wj7zq", "101839708013976870912"}, - {"evmos17gfdp9r5acpkrr9f2j6etnskcqtlg8x2ff5gc3", "1100000000000000"}, - {"evmos17gym039n2zxy38vnq95r9fnmwkeungc5nh4kqu", "1001000000000000000"}, - {"evmos17h3uhxathxk6a7u63ye6g24pate06zrmhldvmh", "1000000000000000000"}, - {"evmos17hlmy6hmmd9pduyp9yyv0p3kwut5me07z0a5j0", "1100000000000000"}, - {"evmos17jj76ly0dj5x5yuq2ww6x5scuk3uh4ek4mzv4r", "21000000000000000"}, - {"evmos17jqq9rhwrz6ulpt0a7xrx30pjgcyg7n4e3em7a", "101000000000000000"}, - {"evmos17k055lp4xeegpdj976pgltc3t3qkqvmqqqjlts", "6170065371078000637"}, - {"evmos17k9mnkgshqwhvmcxuns756ffm3s72e8wpqlj29", "7317241963982636032"}, - {"evmos17kcwxfv67h6avusq7lg6n352gsf2hys40wfhup", "45882504083542867968"}, - {"evmos17khskjavysj2z2sw9lfhxl5ge9lx7q5xkldzpj", "83935805895651016704"}, - {"evmos17krd5n6gtt6qkypk9zw55w6xfktjlw9vrs30pk", "1100000000000000"}, - {"evmos17kwgd9eexz0yrcdu4yn7u5vgen07tvnjl54w94", "1001000000000000000"}, - {"evmos17ljtjf6rkk4pf40f628s82a7er23wkwvkxwx2g", "147013782683590326031"}, - {"evmos17lyl2uvzgs2dcqfhf0lqta7gnpl48y4a4vu0nc", "133062733043893687035"}, - {"evmos17lz2jzhfrzmk62u44p3rr6dgd2ayfuc0mmdux4", "129818309979193884672"}, - {"evmos17m87hh9t54j7kdpa0zkvw0evpewu9ere0xw337", "1100000000000000"}, - {"evmos17mfk8venv8k4klg4l8g5fpe0e9pylawlc240g2", "1011000000000000"}, - {"evmos17pnsu474d5fdep3lfv8z0ugyepejgh3mwdpp3h", "45882504083542867968"}, - {"evmos17prkktygdjudenfj6qwz3k85753x5q8dq0u8wr", "259637619958387769344"}, - {"evmos17qy4wns7qz9lcvm3qpugmqe3a0nrh9q3p9srz3", "107017419690981485568"}, - {"evmos17rg7p44w4a4yzaesrd6w6uffwzyf0zkzhum5rs", "1100000000000000"}, - {"evmos17rsjcuscevud7736yvdmj8hg9aejvfdk6pg7he", "49779250293362774528"}, - {"evmos17s7k29nzu7yydtn7p0p88dmrhxadguxunllyvw", "259637619958387769344"}, - {"evmos17s7tf0g5jr5wc8qkhr3cuj7z9xpg9zpepf787q", "4560611354038669824"}, - {"evmos17sael2kcmm8npe2pmkxj3un90xfg60vvk54re4", "1000000000000001"}, - {"evmos17spf3stnmd8xuntycft23kyf4tl2r7rk0ktuau", "1100000000000000"}, - {"evmos17t3cw3ajnwt9kpn2vtlnafsveezptazv6hu4je", "41000000000000000"}, - {"evmos17t3lek8ut9lz90f6wkzakxfvdfgsqwjr97g7re", "45882504083542867968"}, - {"evmos17tdafuzr60wzk5v7upwdhlcu84p25gsj78q2fl", "11000000000000000"}, - {"evmos17th86r8rhzkcuwu5kf8w00cgxqwvcr3jqy8pr4", "11000000000000000"}, - {"evmos17tkyt9dfqnve4e9v5f0u0xnt0sakm2py22y8my", "101000000000000000"}, - {"evmos17u4wctete429ugnfvjtejjehc20qxggpgl9rjg", "25814931854416594432"}, - {"evmos17u95l60v3kukpjmzmke4txssveng4jsl5w6aaz", "45882504083542867968"}, - {"evmos17ugp9xue3utakact6lh9y9xwp0dh8lau9rmcpl", "22941252041771433984"}, - {"evmos17uxwcxnvkdvl68538xyp34jsxd9cke8efspuqm", "111915407860868005888"}, - {"evmos17vu79vs3eyhryx59898yvckrastnfknl2durr6", "1500000000000000"}, - {"evmos17vzgvel5v6c80yexl0h60qn7e0xldud7k4p9zu", "1100000000000000"}, - {"evmos17x8lwxv4rz3pkcthr6n5jlfpaaxqvtg4fqanwa", "1763581660408326912"}, - {"evmos17xye72un0n6mwxk5yanntvncan8hdda5zv7dsz", "1100000000000000"}, - {"evmos17y39h2duqrpkyaunpm47v5d04ger9d6dqzevlq", "1100000000000000"}, - {"evmos17ypesa5630raukqnpmgdll3n0c0mzfpk3udxcy", "157796911944410873856"}, - {"evmos17yskx9x8e5cplkvduwu2sgp9yuuzwvjs6nfr7w", "22767994081714247895"}, - {"evmos17yt7mcrx2wnqfuv8xy0yyak4tdxcm90gy8a70n", "61000000000000000"}, - {"evmos17za3fvh8m0jxj5y6xrdm3gv36pgp2jjevetm7l", "11000000000000000"}, - {"evmos17zwe5rtjc0ttzth2n8uma0zhva4dld4m7lgs5p", "1763581660408326912"}, - {"evmos17zwups8rj325fxcp3vevpppkm8hp7z9fsugh8x", "11000000000000000"}, - {"evmos180rnez6exqkwlqlf64vlkpynj0h0p5lqgea55g", "223829815721736011776"}, - {"evmos182avsf84x34d68tyrwyff3t6uf4qclfx40lt77", "21000000000000000"}, - {"evmos1839x7lauu5j0tutf6es4quylvjkka2wvvtpjg5", "27978601965217001472"}, - {"evmos183hexk3shc8nsn7xer27feezfj6urg6xlgg8h6", "3012947665606583808"}, - {"evmos183hrcuzzt3az7p4je6l4vdnr2qp7q82lv2w29w", "259637619958387769344"}, - {"evmos184jlqnsgssuus062un9g9dkudh4a9xv99athce", "55958203930434002944"}, - {"evmos1857xz7yl4zy7asc7ldldh7yvg6nrw28p57a3dn", "1100000000000000"}, - {"evmos185jvck9ph79dt590ra95yj8yzd9tpckd4rxh2z", "34198115616502907053"}, - {"evmos185t9r2xaae3gds8dw533pknjg93eht8aacpjgt", "1763581660408326912"}, - {"evmos186tqkmmtvfvcdufyu5pd4zaydcn76ye89r57g4", "91766008167085735936"}, - {"evmos1872ntszstzuvhgjkpkhfmuwka5zj66ezuaujxz", "1100000000000000"}, - {"evmos187678l5rrnm86hraflwfkyyxn4xylh6h3eqdlw", "1001000000000000000"}, - {"evmos187ak29gretje6f8cttvvqqw74r2vfnsyep67w4", "91766008167085735936"}, - {"evmos1886l2zqnmmfdhp4akczlq2xwhpkgae0329qg6t", "1001000000000000000"}, - {"evmos1892fqrjpev8c8j468es4kgsx2hrfk30futrxrh", "1100000000000000"}, - {"evmos189lm6838x5shtnzmdwh3wx3sjyfx3q3unu3njz", "3101000000000000000"}, - {"evmos189n8jcs42t56rzs7cur9wtz9pfz3sxacj4ck6d", "143807610961802395648"}, - {"evmos189snqxttatmyj0tqjcsjw94auj04gj8sjrqyvg", "44229366956307209161"}, - {"evmos189y63dezek5ufpc0qqtqjkur7ur69nssrhnls9", "49408667404359521792"}, - {"evmos18ad7h5gql4lav969m4f026zerc4vuxrd6vq45p", "91766008167085735936"}, - {"evmos18aguze7ekrcqujsr02jzd5qpzkzf4zdxr8tdmd", "1100000000000000"}, - {"evmos18ajcmh3a3c6d2gam494f3e0gudpeuyfqend5m5", "901000000000000000"}, - {"evmos18ay4fzaeukryvhmh9gjdkgnja8p2lr0mn4764x", "1100000000000000"}, - {"evmos18c5whmzq6r3adnaehehxqkuveltnperyuxre6w", "1100000000000000"}, - {"evmos18cpfc7423z4qlz8peq8dgasu9z4hz0yhh0heer", "55957203930434002944"}, - {"evmos18dq4fvp2eu6e3x89k0gne3pzzljlvh8ehvztnh", "41968902947825508352"}, - {"evmos18dzmj47sw23a7c2cdgeq7pkl6g2zhhyhnvd7jf", "101000000000000000"}, - {"evmos18e23qagv9zc4vcy6m3m4yklh0enmwpy90yjhf2", "61000000000000000"}, - {"evmos18ehzzfw6epwdxayjrw6mx2z0z5x9axwf4el2hj", "73861106048759869440"}, - {"evmos18evpv96kymuwzntcs7ptz7mnduc225qg2d2hrq", "129818309979193884672"}, - {"evmos18fd9nn5dce6z3qlt86k62wqzek8tzlhtywga7v", "200000000000000000"}, - {"evmos18ff4869gdahdygf6dc9pge89rk0yva8y5ffym6", "6816441434207033344"}, - {"evmos18ftmp6z34gzgnaullgsezgsnj4maehwc6mrdny", "45882504083542867968"}, - {"evmos18g7rgkmsf9clhy77kuf7ayaxvq640m3ddlqkpg", "147723212097519738880"}, - {"evmos18gcpqqg8thgvhs5tcnsfh853z25lf6dlvvcjjt", "93029983598427309542"}, - {"evmos18gpxxlcpmade9seyp8l6nr6kl0p36djmle7aa7", "1100000000000000"}, - {"evmos18h063mps2ffekmy4f8cje63v99w0755k0uz844", "1100000000000000"}, - {"evmos18hfdcdvx2de9mdvgwqqc5m8m3autpe9xz3xtlf", "1021000000000000000"}, - {"evmos18kjgtr604p9tz5dj62cc0d3y4w6f6jhuwvk2xr", "21000000000000000"}, - {"evmos18kmy8rec2xm63r0qqpu2ezt53vphmjjvml88tx", "1001000000000000000"}, - {"evmos18l5wcv49wncve5c32m7jydx53asgxyypgf07w2", "1100000000000000"}, - {"evmos18lgkfhqac63feymymt9e600p2jngmflgm425df", "101000000000000000"}, - {"evmos18lgqz5q4kzf6q4aq6emaet0vlz4jzt9jrjszwk", "259637619958387769344"}, - {"evmos18lk2dnde7v2grstalt4h50a2uvtprc0zp96nze", "1100000000000000"}, - {"evmos18lrv2urlxnun5lsm62pa6cfquh8zuthcgmmv8e", "1100000000000000"}, - {"evmos18m388lr2xphynmfd0rnz0yk6hea8g3cymzymen", "45882504083542867968"}, - {"evmos18mqv4lccmlcjpfe77fyc0ta7cy3tlfu7zl20nw", "1100000000000000"}, - {"evmos18mrnsk6sw7csf8y542c9u9588ca72mqazfqv7t", "2000000000000000"}, - {"evmos18nfy4ck5gnd4ptt2fvl2vrcw50a62k4xgf0dzl", "1100000000000000"}, - {"evmos18nnt80wqmhvg5kmdxh0xfan5r5cwhgvsn3kp6z", "3845128058365063680"}, - {"evmos18nyh83ufqthhzyeexhpjr8egwtknacxlrsa9kw", "73861106048759869440"}, - {"evmos18per8yyj5hk92006u2t5etu6acjml0elkfsrhu", "101839708013976870912"}, - {"evmos18qn2jkekwyn6ta9ycsj50hmzwagnzzuj4mv7a3", "1100000000000000"}, - {"evmos18rasgt2s9x6aaqd6qfser8r5d488l0pqtcjvve", "27978601965217001472"}, - {"evmos18s0xly26d06m6s6dhmaqhkr9lq5dxnjaewumfk", "55957203930434002944"}, - {"evmos18sk33c24845k5vyl5rykdw829x536fkwev5qj9", "91766008167085735936"}, - {"evmos18spv3n06vmepqy6h6085cryrhfpfxp2qea0c0g", "55957203930434002944"}, - {"evmos18sxq6hjvusw02k3y607hgzm8y04zq87m57sk7k", "23399475712877693696"}, - {"evmos18t8mz3s3hygzx20crlmlp4paw0f3h6ej6xha2k", "45882504083542867968"}, - {"evmos18tgac8rsx8s24hxnc4u34zt2hadh5w5mn8nyvj", "91766008167085735936"}, - {"evmos18tn9v097jd225xvn95wdzyt22v0fe7cw3rar3k", "1100000000000000"}, - {"evmos18u79mpqt9sqe3z0l54ttlsxusdf3qk3ludx9xu", "1100000000000000"}, - {"evmos18v9egafmumyyvn3u59e8maxycvktwxsjal9nkr", "101000000000000000"}, - {"evmos18vczs408mhjgz2ganrwpr0ywjk3hl6ylae2yx2", "315594823888821747712"}, - {"evmos18vfjgtgqda3d3l44y0pyyuj6vgnwj7qgkqgg6z", "134191799327621838848"}, - {"evmos18w52l36fy856dyx58xva2qgrfvkzvuhc45kjja", "1763581660408326912"}, - {"evmos18wwxzr0hq548tlfc76dx0r65y28sm63z7md6s6", "11000000000000000"}, - {"evmos18xjeeytrpv6myunfq9cfttcrurg0w3xs0reuge", "1100000000000000"}, - {"evmos18xtce3qw95whuyns2z7ll7asml86awksmgx8l8", "1100000000000000"}, - {"evmos18xvkzq2p3vesxw93cssa3nyrzsw9jf70d9uawt", "45882504083542867968"}, - {"evmos18y044tqxgjkhvpt5pegp4sy4398ezqjytdrqy6", "185775513909627895808"}, - {"evmos18y7sk8gz5ak0hmmh040al8vdack5u7ttrunnw5", "55958203930434002944"}, - {"evmos18ya8uhy9h42w07qwln74v9k8tntugxsl7n7n3m", "1100000000000000"}, - {"evmos18ycgv4mvm05u2rnm6x5sh59wtrekzunqs76k9w", "55957203930434002944"}, - {"evmos18yg0z28seqxge2v638sul44l7tphcdun9ylcj3", "55958203930434002944"}, - {"evmos18ygcu2tnc4w7vvj65y4qk09ku64hv5kh4xh8kc", "1100000000000000"}, - {"evmos18ysmm8t8fxch686twyrvz5tnaj30mr7vstv9m7", "1100000000000000"}, - {"evmos18yz6n4qn973w49uv7ayvdsgkcvk62z30k66q8e", "1100000000000000"}, - {"evmos18zwmwcaaxr3jsykjqe59f8xzklzyrrkfpqqlvg", "1100000000000000"}, - {"evmos192tuh4lmda39g8acfa6y2x8lmvtudvr0qywv9p", "45882504083542867968"}, - {"evmos192u9vcwkkjv7672efrxdtc5v66qppmm0r2xx6x", "201000000000000000"}, - {"evmos1939v3y0xfcd0mskc3x099gz29y55lytuam92nu", "1763581660408326912"}, - {"evmos1949upfstjym5n42m5ecw4gdpaz78el6xxhgt33", "1100000000000000"}, - {"evmos194e350uath3a7hvesrdca8y3qjzf08fyteaxaz", "2001000000000000000"}, - {"evmos195d6u80n5p9v5t2gaa3r78ers04v5pglhcqeqn", "1100000000000000"}, - {"evmos195glh7duha7qnm946jw0msqjg7j88lzyyd69zw", "31214463833448462212"}, - {"evmos195y4we63td26yfs4wu44yp7xgucsr9v7yaxfw2", "21117231847341265664"}, - {"evmos195zap52z20urcrmzka6r7l9san47xqfkyjql9k", "259637619958387769344"}, - {"evmos196ax4vc0lwpxndu9dyhvca7jhxp70rmctkh7er", "143808610961802395648"}, - {"evmos196n6sl4mfx25lqnqasu9mzepcz9nztpecgrfs3", "27978601965217001472"}, - {"evmos196qqcvcmz57jau9kpud4sp6d88cfyurdtt28cw", "51858466176024532480"}, - {"evmos19805reap06sp76tghtyg4mtqrd6yc2sw7ug8wc", "259637619958387769344"}, - {"evmos1980kdldkg8a9hv73u4dsvk0a0dhgqz0mqq9awr", "9436583284130730097"}, - {"evmos198w93w8vr82567wvtmw3d623q8hghazhwl9cwd", "1001000000000000000"}, - {"evmos1995jvwatwprsluzshwwzzf5pa7m4eq2eavkfsw", "1100000000000000"}, - {"evmos1996p6eff6gl6y88emdv8emrjdzw4lkczr9lgvn", "1001000000000000000"}, - {"evmos199dgs2tj4k3j3wj403a8ameap42stysng9funm", "1100000000000000"}, - {"evmos19a5yg68zd8r2ffee3pt7nhvp7jh2d6ylnwma9v", "1100000000000000"}, - {"evmos19a8uk27r50ve6rfd7n97z4yzq26vcxt9shmssg", "9754236154624781824"}, - {"evmos19aa3xwzny3zznxjks5a2e6g2my6nhemn5a29zd", "157796911944410873856"}, - {"evmos19ccpsjpn96dm0ru84f9ydtedykr23vn6scdly9", "1100000000000000"}, - {"evmos19cflxpmtyrw779ecmpral2mn3mvs7uvj8d5rau", "203680416027953741824"}, - {"evmos19df88d6693m59uynwypgtx5np6c8a0a2k2arm4", "30114617077784179529"}, - {"evmos19fcdxdkrthces6gua9mxq95ga9ny04lvy7q8sn", "1100000000000000"}, - {"evmos19fg3s7pzuks53kthnva7qpasndlu02p7e0rmfl", "5113283924920505344"}, - {"evmos19fgaj6g79xjmvwlh8rug62lfuyc9pukr4sau3k", "1100000000000000"}, - {"evmos19fgnejrg9sszsl43p3vxwwr5julh662wkxhrw3", "1100000000000000"}, - {"evmos19flleklmd8cdsvsta98t7g465pkftec0hhhknl", "1100000000000000"}, - {"evmos19fqg3sx60wuzaez6j8cr05xsja3y6rmgs3fx36", "2000000000000000"}, - {"evmos19fr8g8suhlcq5rllyp30vsr052m69ue654hyyz", "1100000000000000"}, - {"evmos19g868j6392szq4dhzk6uaham2eze5kwhre72sj", "27978601965217001472"}, - {"evmos19jcktedlmfmf6g490lwgquwdqhw8ypn3gwlh2g", "2783581660408326912"}, - {"evmos19jegt8cgw7ywuc2kq87gmhzd85uzm6q52wmxz0", "45882504083542867968"}, - {"evmos19jh3aqmr58cvl4fdls80h672nphqczzxjfpevg", "1100000000000000"}, - {"evmos19juhf40c6c93lynclz2zezfe0lpgc0vewap58r", "1100000000000000"}, - {"evmos19k2mwftaxxxhmz5rw2pzq9fdwn5atpg40j2dvd", "11000000000000000"}, - {"evmos19ms64tukyxymfzjfsfyxpfgm74va9txu5na6rh", "1100000000000000"}, - {"evmos19myxu4qapvr7aa67m8awa83gjhnhpj6lgj3yp0", "45882504083542867968"}, - {"evmos19p9562eecj0vnpa22y5uy9zhzymrrqw8sfaxap", "26952708929102449543"}, - {"evmos19qwyn62v6uqje4m44glwls6ysgr4wfe0u8t8dy", "1763581660408326912"}, - {"evmos19srgjqlu8f376tulem3dr07txfwrgu2sq4dh5d", "201000000000000000"}, - {"evmos19syfmx0fds78rfkvvysshylye62wejtqshmwav", "45882504083542867968"}, - {"evmos19u2wk4c8zqql4ggfqf3mu4thfmctsyjhdqn6te", "101000000000000000"}, - {"evmos19un2uptgh4j3xxyynsv0n0r8we3f6w76wjk78e", "1500000000000000"}, - {"evmos19vdn7dnm8d49e7kuxnejlfcxcw0nd5ay7selhm", "1100000000000000"}, - {"evmos19vs5dntymm6a4xqf5r0gl07hfhastfvvd5dvwd", "100000000000000000"}, - {"evmos19vt3skwhsh6w5r3a3cuht7fmlrzzj9rtsy4an6", "27978601965217001472"}, - {"evmos19wlk8gkfjckqr8d73dyp4n0f0k89q4h7yzqj56", "55958203930434002944"}, - {"evmos19y53dypgpdy0wnlfuzq46myyrgx7rrdetxjxxr", "101839708013976870912"}, - {"evmos19ys8v40ahcxxg4rmng0g7uw7rpaaxul2mf684a", "43705723392898342591"}, - {"evmos19yu5lqpwv0pvdm0sh2fhjw6fvfenm55d6c6mj5", "1800000000000000"}, - {"evmos19z6a48dy06hw8x00v0h6w55xpeqr4uy369w368", "101400000000000000"}, - {"evmos19zm8w35vky6at2et695nrgsa4nfga78px86n8h", "57720785590842329856"}, - {"evmos19znh4qr96r6d7lfk2t0husm78ftsmkjfwjr4t3", "1100000000000000"}, - {"evmos1a03ah3zvgtet2hte7v5tet7favedlk9zcngzfn", "2001000000000000000"}, - {"evmos1a0nvjcdsj9wdj82c224mm78aja3j0lx9sr48hq", "30414073151128196952"}, - {"evmos1a0pggl32xtjhmkrzgs5c3qksk67tdw6recmg9a", "4001100000000000000"}, - {"evmos1a0phdklmmyq0am57h5vgr8grqu3qqnswan9czm", "1100000000000000"}, - {"evmos1a228vnzm53vep7vedm726y0v9lefx2q0n89z72", "7746468800267621328"}, - {"evmos1a2llr9w7gyuavwgx45kgfc3k4kc2xcgeguv65g", "27978601965217001472"}, - {"evmos1a2y8ku22ghemqv95dzm0as06sd26e7jumxxm52", "91766008167085735936"}, - {"evmos1a3ldlunrsdsru69pn0gn4dzgwmudeyj2jndcp2", "91766008167085735936"}, - {"evmos1a4h36y8lxhau7ykswkhywacj50sl50jkhcrms7", "103603289674385197824"}, - {"evmos1a6uxzplfs0s3s7acl33a949x7c70ha4y3g76s6", "1100000000000000"}, - {"evmos1a6v29fygpaqm7jf00296r20w3lhq8x7nyn35pz", "1100000000000000"}, - {"evmos1a7ardjtvcseklgx6mxpdhm946spn5a4jvu8jum", "3179258952081612350"}, - {"evmos1a7zhg8kltyuftnanelmzs6ppuytngz8fa28arc", "45882504083542867968"}, - {"evmos1a8x8vd0ecyd9fcxqcsumka297mml4x35mdpkj6", "91766008167085735936"}, - {"evmos1a9gzwgqf8069v9j500paye5dm2p54tlxyf8qyr", "101000000000000555"}, - {"evmos1aaceffxxxyqqc9g0kvkj455mzxdp6jwr68y6j0", "45882504083542867968"}, - {"evmos1aaj3pqcrhaj24km62sua73lgvk72vqnje8qz4l", "1100000000000000"}, - {"evmos1ac3wu3y28g4khrcp53w6z3mw95q7yne6rrwhr2", "30445292039531725212"}, - {"evmos1acm7jn8gp6xrqxjxpmas7etxcy7xepswykhvw4", "287616221923604791296"}, - {"evmos1aeh8gqu9wr4u8ev6edlgfq03rcy6v5twaqa8qn", "195851213756519055360"}, - {"evmos1afn3hkc0y5zstvhsrk0xjp5qnwww3rpgysvvy6", "101839708013976870912"}, - {"evmos1afn5lh08zn7e080rahc0264fw94cnrkgulesyh", "1010000000000000"}, - {"evmos1aftxremzxxl6du4uz6urcsejwz3q634dvhnsqs", "201000000000000000"}, - {"evmos1afwtkmhcm78qlr3mm8ufz0xy7u035kgnqurs09", "1100000000000000"}, - {"evmos1age9zt5vsu42h9pjnjmnwu3v66ngjp8m0k9qas", "1100000000000000"}, - {"evmos1ah0xkpzcyy7mff8345ma7q26xptua56d6qe5d4", "3094408965129174528"}, - {"evmos1ah4hw237akmh40d6jh279v70fnfax96d4z0234", "55958203930434002944"}, - {"evmos1ah4pw4n7wy37zhr70r4uszxhtu8whu5kz3uuxf", "111915407860868005888"}, - {"evmos1ahkl2aslfcp84rku7ecjv9nqcm9jwmemnpqzxc", "45883504083542867968"}, - {"evmos1ajagz6cdhce27shcquz9qj4puk4wj9e0llzhql", "55957203930434002944"}, - {"evmos1akjmukx8a8jztjl2adzdeunchs4hddk7349hl2", "22129076481557877248"}, - {"evmos1akqh3cp44e2tz4h8zyy5dcms3f7fuq4an2fe2r", "21000000000000000"}, - {"evmos1akr79fjtmuf8wxjp4gg5q6p8kpc0ml2a35cpxk", "259637619958387769344"}, - {"evmos1alp7d7p80pny3dvzpp8a0fr49mmututymw38uh", "223829815721736011776"}, - {"evmos1amdr4kpguvt39pgn2jgrm2t0ywgpgtcvkplun3", "111914407860868005888"}, - {"evmos1amqz37d2eqns3k5pxuhhrywegf8cxj2903sjdf", "1100000000000000"}, - {"evmos1anjmamq7cnmg7n5vxtpngjrzrstepafzvh8j8j", "55958203930434002944"}, - {"evmos1apgvcwhn0ukck6vr77rl20zg020x4x0x337jgc", "91766008167085735936"}, - {"evmos1apk8gstkvt09l0je583l7uv4487awn6vwktmc9", "1100000000000000"}, - {"evmos1apxeakjjr0dw8vrxtja2w9kqzvsx6gz93w8k5u", "1100000000000000"}, - {"evmos1apy6zv8zw4n7w23yftuf9h3k23c0cen0qthaav", "125903708843476516864"}, - {"evmos1aq882pd8hnd79h9f2d66td8khyhcg70vpvm063", "13319315913561335900"}, - {"evmos1aq9wuscvqry0vs90l034gywhp5jrrfv85fsj0k", "51000000000000000"}, - {"evmos1aqctp4mxd959xchmf5q2tcuwzj6usgs42vszta", "1100000000000000"}, - {"evmos1aqdt7mt7w0ah9yv8yns36u2erdjrz2nu7r5n3t", "1100000000000000"}, - {"evmos1aqmnv7j3pnr8chxy82qu3guh6ta3z5zlx3fdla", "55957203930434002944"}, - {"evmos1aqurjvngjrunmvr9qrc6f30qw3v66sk46x7wlq", "203680416027953741824"}, - {"evmos1aqwwe2ux6a565n32yvdyksp04j05xtz39mf07t", "1100000000000000"}, - {"evmos1ar9xh7n6075c82mrzxp4dducvf5c87g56a8phl", "91766008167085735936"}, - {"evmos1ary3r2nrsl8ud9nkdxsrj0j3xw0fs9quzea0le", "1100000000000000"}, - {"evmos1asd5q6jv3h3f6x6c7q27r62vgyvsrec3a45c3u", "83935805895651016704"}, - {"evmos1askmrcd3quyddq53ahwfey5f74qnfdmnkqatz5", "185775513909627895808"}, - {"evmos1atzjzt28q5rzendq96d00wf0nfadxygyga2rjl", "61000000000000000"}, - {"evmos1autx3av66ga0d8sj5294r37cjgtuh6rx3wednj", "1100000000000000"}, - {"evmos1av54njf3u8lj3hrhqcd4070tdzzff3g7x3euxm", "4391280840727037440"}, - {"evmos1avxnqjt8402kayw270w3vh4qmlwyquram9mkcc", "73861106048759869440"}, - {"evmos1ax2zwq38cpxtamzx824dh8neny7mcc7k8kzaa0", "1100000000000000"}, - {"evmos1axsdlg6fh4a0r07k3h9k7wwf8jl72swqdeffc3", "111605869072444578560"}, - {"evmos1axwr207fgwauaclt5rdkqmftuw4tu79fwwc8ca", "91766008167085735936"}, - {"evmos1aywenhfm3l5t370z7veu7u2067tcvykmzkd55v", "53450649561176859386"}, - {"evmos1aznqfh7tnmjkqzspg4xxapj2yqc8y3prdy9lkv", "76387801969597474426"}, - {"evmos1azt5ntgmcp78lwk36qwupygdpslmgec4ssl4m0", "1100000000000000"}, - {"evmos1azzwnamzpwnplyhhwa0dvntpmeyc94ds4cyv5u", "2000000000000000"}, - {"evmos1c0z092mzxyje97jwk9z7hhw7tsufgkunztpgjz", "1763581660408326912"}, - {"evmos1c2fq94f63ntxvsr07raqgrdtszcuuls2am8n4s", "1763581660408326912"}, - {"evmos1c30mun95ke5rqu6s0v3huyn20r3uvzu4nr8qk8", "55957203930434002944"}, - {"evmos1c3f5hdcm5amgajse0tw26k9hg6skqu99sm5v4v", "147723212097519738880"}, - {"evmos1c3v0lxt2yx6c9uv2ldxv46k8znugtt2kwf0yr2", "1100000000000000"}, - {"evmos1c422ce6rlw5evfsvhxfmncchfplrcj2kzwmsx4", "1100000000000000"}, - {"evmos1c43vn482njg5n9367phf3s62qa5ysy8c5wfhqm", "213754115874844901376"}, - {"evmos1c4e3ds6yg9afp2kxlvvm07crjusvy7ngrk2a3e", "1100000000000000"}, - {"evmos1c4jtj2y4l0wy6s9e8hlh24f3vtnsttnpf0t7p6", "6560955817470734336"}, - {"evmos1c4tuv34u2708g9d0dnjntx66gu2kshau8hqex3", "24622813669001657364"}, - {"evmos1c5de6l9wze6x7tha0xeejnh5l4qukl9fvyygde", "2001000000000000000"}, - {"evmos1c5n599c64g7h6l5has3z495axpj5nqa0yjt3ak", "1100000000000000"}, - {"evmos1c5tdya5ecyyukg23jhk40ryq9k3chuqk9x6mfc", "87850407031368376320"}, - {"evmos1c98p0cnv9vdq55wq8nnl0s3r0tduj863wa20zs", "259637619958387769344"}, - {"evmos1c9efs9mt3cjkexs7sjxff46yqurmzs69ttcn9u", "1100000000000000"}, - {"evmos1c9ye54e3pzwm3e0zpdlel6pnavrj9qqvydzsec", "287616221923604791296"}, - {"evmos1cat7n4agsslkvs4rjg434x5q62k46fdpsyq8vv", "64746660000550750267"}, - {"evmos1cck3msl9cnwwus5hmqa3yctrkd5hk8nnns639s", "1100000000000000"}, - {"evmos1cck6dvqernsrk6tpzfnk6y6j4qad0lkazsmhqz", "1100000000000000"}, - {"evmos1cda2q8rsukmxhqyjnxa2g4ptcf7ley4l37x2qt", "1100000000000000"}, - {"evmos1cdf859wsv5kh98pfy2hu7akzn4ll2ne8slvxed", "45882504083542867968"}, - {"evmos1cdx9yspnals299u35k9d8x9a0tg8jhk4pzq8k0", "1001000000000000000"}, - {"evmos1cecq8sxwdjywwdvc55umtz0tp2vy5xf28ne9x2", "4131408605363436032"}, - {"evmos1cejdta0sz36y26c2auw4msqd86v5fflkzz9ph9", "49603499679348279808"}, - {"evmos1ceslukgm0pw0dtfuuw6zrlq0lcf76sz2uhs83h", "101000000000000000"}, - {"evmos1cezcq2vyqukv8wlvddlhhw6t20r2c560p79ud9", "1100000000000000"}, - {"evmos1cf04m6fq7mvkrs3d26q4ph2rllkkhcqg02px07", "21099083995306083941"}, - {"evmos1cf7q7a42k7whpcppv08qkvvglna40u6nqw9vdh", "1010000000000000"}, - {"evmos1cffyjvcadkq4y5jp22cfv49u8q7xwljcg7cja3", "1763581660408326912"}, - {"evmos1cfj55jusmtskm4ml2xhvfu0wu33am4ux50zrnd", "1100000000000000"}, - {"evmos1chw430t0sw0nygkw348zkee6rx3c8g8wtnj8yk", "45882504083542867968"}, - {"evmos1cjmaky9384w0629k5lcnyx7z55ucus8gaqgm53", "1100000000000000"}, - {"evmos1cjtvzwtf7cc85py38t0hhgg9f2awkv0y77sxyn", "3526163320816653824"}, - {"evmos1cjz9fhlck4gpe9japl04fs35g5samq0tfm8pxf", "91766008167085735936"}, - {"evmos1ck03vh0htyj389lyxjjqtnwf4ngxfj6qyrqh0t", "21000000000000000"}, - {"evmos1cl0y4rdgryvp9uxsqzyg6m9e5e8zleup0z2srv", "10588993430829593059"}, - {"evmos1clf3pzt5rznp5mh9cyjvz4qwfse6e69uehwwgd", "41967902947825508352"}, - {"evmos1cllm0fuqtm3xxyenskn9ty4w9svwnckruwc9qf", "27978601965217001472"}, - {"evmos1cmc23gc5g023ust2jepw4ucd4es5s567c7t7kg", "1100000000000000"}, - {"evmos1cmy9jwxe8uxu0u4h9dgml99xmt8uyvphkt22ee", "101311329105128662402"}, - {"evmos1cn8ay0jztdnc4q9rtuhygepvkd7ewtxkxjkrwk", "259637619958387769344"}, - {"evmos1cn9syn204vtps6utarq227qv4gtjm2kckmqt3n", "2201000000000000000"}, - {"evmos1cnc87vcegyqvk4nqnzn49lx3y5w6hsr9wxufj6", "1100000000000000"}, - {"evmos1cnfhg8nwl9welemrg7ge4zkpgam6zv6lf3jck6", "21215434552222734935"}, - {"evmos1cnqnhj8hmhft9jnu0yhfg6sv5f2kre23etk5xr", "11000000000000000"}, - {"evmos1cpuvcg62tp24ypm5p8wxsqtpxk5ce95f46dmwn", "9617293383238985728"}, - {"evmos1cqls7s7c3q60alu3k2jpdxqfy63qdamfde4g6j", "213754115874844901376"}, - {"evmos1cqvgdyhsjx24g540q8nt3n36mxlwsje3pe6333", "45882504083542867968"}, - {"evmos1crsc6t30jmtnzxkxj50rhcv08dw7qa74lw0ly3", "223829815721736011776"}, - {"evmos1crz8pzxmh8yl5ljxyulgwle335ntgtep8nd8yq", "203680416027953741824"}, - {"evmos1csd7p57hy53vs3gw8vgals9hx0mqhqva6u4dne", "91766008167085735936"}, - {"evmos1csyvk5qzpvn3zjs5lrzasxxtp5n2cdwgvvrzaz", "3571872881375157248"}, - {"evmos1cukvqnvmv9c3l9vdad0dxvuta7r00t540pj8sx", "2000000000000000"}, - {"evmos1cutr8pr2cs6aedp2q3m9wteas9tzp6kkj02nph", "101000000000000000"}, - {"evmos1cv2kc7ay8lclpt9k7jpqjgtnc5vvq9mclap6w6", "91766008167085735936"}, - {"evmos1cv2vxqg637kgfw6f9zpkyzpx82en09xend2u48", "1500000000000000"}, - {"evmos1cv9n6qeqtc54726jnj5vn04za4x87f4hpl03yq", "1100000000000000"}, - {"evmos1cvz9vgk6f8n408pvxwq4ynplvwk9vvehcgulgy", "1100000000000000"}, - {"evmos1cw0aacyng0mjdprx79qygeavy7uzuamhkf7jnx", "55957203930434002944"}, - {"evmos1cw2mul75wptmfld0svztdse4f4qnfn8vhhn20a", "259637619958387769344"}, - {"evmos1cw84ynvt25kpd2dqetwxewea9hcmmar8vkvlgg", "91766008167085735936"}, - {"evmos1cwdwaweadm82dvwdmatdc37r620zlauy8jclqn", "1763581660408326912"}, - {"evmos1cxj0wj0qusrwwkv9nt47pgruylsxx7qd62dkgw", "45882504083542867968"}, - {"evmos1czh9pp58sv7vaae96e9yyh0pn7v3wqtzl3889t", "1100000000000000"}, - {"evmos1czuw8zqnr50nzvdxctmskay6wjsvhz4e8pqpta", "1100000000000000"}, - {"evmos1czxwty0ep79rw5xq0hky30mchagvwz7909x7l9", "27978601965217001472"}, - {"evmos1d25c6jmgenc8m6d6ralgw5waya2dxzu7q6wd33", "1100000000000000"}, - {"evmos1d2guxl6rlfmmfp0ealcaf9ap84nl5trz0ywr5c", "101839708013976870912"}, - {"evmos1d2hdp4ukmz3ukn3lp34gy7g7pta33eezecjtny", "1100000000000000"}, - {"evmos1d3nj62ktamjk094dztznxz8y82rl6336fzw4zq", "6230726132227475456"}, - {"evmos1d3vny0mfgt5q92dw884hswpka3enmuvmksvu0s", "1763581660408326912"}, - {"evmos1d4lnt7nv2hrju5s6zdgyzq5efjsjzdzsw9thf3", "111914407860868005888"}, - {"evmos1d4y02j3qrn3xmt99nnqmndrpfxgvrntvrhh7nt", "45882504083542867968"}, - {"evmos1d4zyfzjm2y3c8m3tfygdf8hyh84gvd06nj9c5s", "1100000000000000"}, - {"evmos1d5gf2mhqzygzs4rmpxls0sltxh82nsxhmmqy87", "1100000000000000"}, - {"evmos1d5h8lqd9fxv6sttrnm0c7ys5ljk65u95qa3qpz", "1100000000000000"}, - {"evmos1d5lu67hu3lhqtw6zyv7uy4gkfpdtfnzxvwlx80", "91766008167085735936"}, - {"evmos1d5pspcjs34n8hmqvft7cumws8sn2y0c63n5h3l", "1763581660408326912"}, - {"evmos1d5tk9yfhmvwvj9hqp8e2fnqz006ncu3rgare58", "131581891639602211584"}, - {"evmos1d5zh2ayezq2jgmsyp8mgzqqelzvkvv36vtdcv9", "99759680946017139994"}, - {"evmos1d6583u4j5tufjj3lygj74z65d64z4htlzdxgef", "101000000000000000"}, - {"evmos1d6jm09jv6rm8n0zq4v4pgmteyjgsyhen0sl86e", "3526163320816653824"}, - {"evmos1d76n9fmzkzwvpf6uqy86es009al0acn3tplcuq", "111914407860868005888"}, - {"evmos1d79vfgrsh76anuems353fugaa2zc9uuw4zgx9p", "1001000000000000000"}, - {"evmos1d7f8aasrcms0u7ap99pag67fny72kk7m87wwx2", "201000000000000000"}, - {"evmos1d7ufhqfvw4ac0exuccud9p8gwdwfy2daycgamy", "2000000000000000"}, - {"evmos1d7y3nep59hgagazstm6jhq8ay6tfc37hzaepc0", "1100000000000000"}, - {"evmos1d8pwj29kze0m35grea4z9qkdgl9e54enph5755", "287616221923604791296"}, - {"evmos1d8y793dxmk6pj347jyjaad7r96t6y3d48mjk5t", "171786212927019384832"}, - {"evmos1d9ekglvr60g33lawdf5rf8p8sjmky203u2na35", "91766008167085735936"}, - {"evmos1da7vcjvn82uh05rtyc7y3gyd338lnlqlefar6k", "45882504083542867968"}, - {"evmos1daeq26jv4w2562gpcg4k7p0vwh74ld4zf3xgcm", "5001000000000000000"}, - {"evmos1dahdytjlwcyhg7ckuzdvy2twsuzrsh3jghaet7", "1100000000000000"}, - {"evmos1davu93x7yu0emrkdz5kk06p9z27dzz8004jn30", "501000000000000000"}, - {"evmos1dc7fmlj5zw5cwg8zn7pyt33svnuxsayj76ane9", "62726725532863139584"}, - {"evmos1dcfn0tz49d7md3wnsshd06m8nmqdmcfrmhx98k", "1100000000000000"}, - {"evmos1dcwq6tzkyc9w65ucmyg7xnn0szhm73me84neav", "1100000000000000"}, - {"evmos1ddeh296y94pdemtwgfxtmdxjnfh4cfmrppdsae", "21000000000000000"}, - {"evmos1desyk2ejwrnrmgfvf738gkxvzl4k6qhkka36nt", "101839708013976870912"}, - {"evmos1dfdv8pgwlm8fm47cu3ajy5tu4ss3slpdf0jajp", "1100000000000000"}, - {"evmos1dfqphtnef9rt4wngeart2jjaedmzujuuygr0ep", "28196763081751448178"}, - {"evmos1dguacmf4wt4q28j7hjy6twgauuz9ej5etqdlgd", "167872611791302033408"}, - {"evmos1dh8dm3gshy3e56nq2xw94az30qwhjh0ne4e8h7", "3000000000000000"}, - {"evmos1djdvh237t5telq3u5mj8m2p3erkh454fx50mhu", "91766008167085735936"}, - {"evmos1djf0hnzn7nedmchl7y7f4v9nv48avz5l9anfnl", "55957203930434002944"}, - {"evmos1djre7563wa4wawfzc74jay3ymq63l0npuqh2ak", "1100000000000000"}, - {"evmos1djx0d9qq6a5errf68n9jwrxjsf2mzjxamkz6e3", "1100000000000000"}, - {"evmos1dk6ec357vmwtnlln4dh3fetz4u0pcgtzj77xmc", "10879705515143342862"}, - {"evmos1dlde3vktxpng5r3hsndd5y64d79v48vkk6k94w", "1100000000000000"}, - {"evmos1dm2adanfz6eexv6as450vncq9xe69kg38t33rj", "1001000000000000000"}, - {"evmos1dm4504s5ugsk65kr24ffan296r9qe7eafazqpq", "73861106048759869440"}, - {"evmos1dmeh325sqfgxx3n97ae5un6hsye6xy8w4wny2z", "27978601965217001472"}, - {"evmos1dmla6p4kuu7p70dt3tv2w4j4hn9w9s6zs2z6xy", "27978601965217001472"}, - {"evmos1dmqmshpj4xpqqfx2qky82y85m2ufydefm6hv9h", "1100000000000000"}, - {"evmos1dmzyjjqrxj9ssj53ljpkvrkg7l7jnce638tmfv", "45882504083542867968"}, - {"evmos1dng5f52etldpje3386zysqrk7w7yyakqmr5mll", "208716765951399321600"}, - {"evmos1dns44ss760nywy9gx4a3lz8c7q66f8g6g2qash", "889000000000000000"}, - {"evmos1dp0su6nsa4alludlxa8pcmzyvp6fvrj7dnf5h0", "6413935780794112"}, - {"evmos1dpc5pfr3v5qnrhesrzmq673eccq4m3esw4vpkv", "1100000000000000"}, - {"evmos1dph4cdz8qjp73psfk9mg27cl58qge3l76q77w9", "91766008167085735936"}, - {"evmos1dpp44nukahe54n6j4vr7wfvc64qplzxdk3q3ap", "111915407860868005888"}, - {"evmos1dre0pz09me06ddyuq0lgdtjk4c8anz620k37nx", "55957203930434002944"}, - {"evmos1drk2h0mcs3urzmf23vwh9ukypaca70nfz0z78n", "129818309979193884672"}, - {"evmos1dt3x5gj5k9met330y6y8xpv3tx0gmdjxhvdqyf", "45882504083542867968"}, - {"evmos1dtxgwxp8em3av6n9w2cxtfc8af859elsrmmqrf", "17412898423054325223"}, - {"evmos1du6juxdf6cw4lyguw4n8whe52w7lxvzrfc6jnx", "1763581660408326912"}, - {"evmos1dvfxacfvhjp9nplzzf5kxhv4lgqurpr9lyftqk", "45882504083542867968"}, - {"evmos1dw3d4xxhuw2r0vhhgt6v743aua62mpayecaume", "1100000000000000"}, - {"evmos1dxp3pgm868emr6yvrw4pdu49g330x8rssklda6", "1100000000000000"}, - {"evmos1dxrcdrl6advnv6ta0eue7vwm7mxlnh9undehd9", "10001000000000000000"}, - {"evmos1dxrrehv2ykawnftjw8m69xnkwex6slc6sdkxzg", "1100000000000000"}, - {"evmos1dxx2plxg3rg3fdrfhttfall8fnhvejezzrhc9n", "1100000000000000"}, - {"evmos1dyajq233uk5hwrzvpmf5wrkdwv06qrlehdkar3", "1001000000000000000"}, - {"evmos1dyatkrjpdmd6w2e0hj84amqply5svjkn8jprh0", "91766008167085735936"}, - {"evmos1dz8dtaru88ad6s9qqhke8h8rk9wj0ry7mg06yy", "1763581660408326912"}, - {"evmos1dzl2d6wjxvq43nptdwyz03rxtuvsugmk3zs8aa", "1100000000000000"}, - {"evmos1dzt8msn8qfp48p24xtgc8e9agd2njftpzyfy65", "45882504083542867968"}, - {"evmos1e0fafwjn3qp4s8g5zd6k8nz84tj9w6x8fl860n", "343573425854038769664"}, - {"evmos1e2d3w4mj9tyj8ctdk435dags0gxsj2ul7ah64j", "55957203930434002944"}, - {"evmos1e2dd5kv7k5nf7ml54c9zqjt970wt5uqed30acs", "91766008167085735936"}, - {"evmos1e2fkvuq9r8zqazrkw077kmxf56vhartrd80t20", "27978601965217001472"}, - {"evmos1e2jmsvx9nxgqru65l7dd6j3yrth02edwvfd4t2", "3329195814768189440"}, - {"evmos1e35z5yugvtnma2pyrstw4026hycygx297zukl7", "1763581660408326912"}, - {"evmos1e3d7e5rfghlq365jq7pwktez8ta5chvrm26kw3", "1763130160000000000"}, - {"evmos1e3uwdrfz2f2ttxxkgjg9rjjs9dnyej0xc3rtng", "6628712115607957248"}, - {"evmos1e4js4jnvpys7wllzevf4vg5a35r3j36mgzhsk6", "1100000000000000"}, - {"evmos1e5ee3cymgwr7kjy6j4kafc9cxh20u0vg8udrnu", "48530636442531274451"}, - {"evmos1e5kkanhzel8g0palwm7wpwgf7vfkw2tnpdrnej", "27978601965217001472"}, - {"evmos1e5rwg6ymzy2hadatt3r04s2fleghhqw2mveesx", "1001000000000000000"}, - {"evmos1e5syluu92x5a2vnwydn9plw4wy4arad8yggq2z", "1100000000000000"}, - {"evmos1e64ccufm6643mnty58zuvw72r6qdus4494vqud", "203680416027953741824"}, - {"evmos1e66zjxstt936j55lsrqy4kdlukenh2zu2ld5lf", "1100000000000000"}, - {"evmos1e7fvr30esegzfnhvufz76lc0t44lgwgdnmxyw7", "1100000000000000"}, - {"evmos1e9w3r4f4zkzvxs7cehw8ytkfnf347eu3ny8kf7", "61000000000000000"}, - {"evmos1ea3zj5a3jh9gsc99xcvlsh5khq3f9gw7vmemn2", "83935805895651016704"}, - {"evmos1ea6tnw388svrqyguggrmdvu2hr7vkwm6ds7mlj", "1100000000000000"}, - {"evmos1eahhx3u8mk9mjadtc9thc66y9pyw00vxjrp9x3", "6001000000000000000"}, - {"evmos1eatmxdnatrnwmk0khea47f7t85vqln5z348gtc", "45882504083542867968"}, - {"evmos1ec3frg085kc8fmhnj0767us5l6fpj3ajqeqk2r", "91766008167085735936"}, - {"evmos1ec4z9d949lqcus6resr4a87cumzrs2r0ask6kg", "1001000000000000000"}, - {"evmos1ec62ng08whxerzjeh2trlxyxpwa45v6fzchadp", "501000000000000000"}, - {"evmos1ecfz04k6h6274hta7yndey8djy40uf4vxjzxqe", "1001000000000000000"}, - {"evmos1ecsmqe4w8vnhfsugy22mcqkkqq9w2y397pa5sk", "15938717687140022369"}, - {"evmos1ecvt43h36sd0evmg537m4c224wfxwavyltd36y", "91766008167085735936"}, - {"evmos1edc5cpqvy2sv6hsh5e0l2vs0qdvfq6phznactf", "1763581660408326912"}, - {"evmos1ede9u4mjjwunvst7747jfmgy2tnxs8sa2t6xxt", "10114018113451712512"}, - {"evmos1ednvnrmr0q6u20tcc6su08gzlrq4q2y3yntwr2", "83974011504949244968"}, - {"evmos1eejlqf4km2u79ylk9j3fxpvsvdg79fekwrhuj9", "152759562020965310464"}, - {"evmos1efwtxyqq4nutuak606nfv985kxw9n8yxphtz3v", "194727464968790810624"}, - {"evmos1eg4wf6xk3xn8pt6cdyan9mdzakq6pw8r6r3n4q", "1100000000000000"}, - {"evmos1egfutxtv9w4ljrt8wsd0f50tz0k2tcnghf9j9n", "101000000000000000"}, - {"evmos1egxzt4xk9ehsa8rjj92rzk8n3j2xg07x8zq59d", "27978601965217001472"}, - {"evmos1eh2xzjlwrrhwtt9wz3c474gth5vdkggh6v5jqd", "27363808183917759369"}, - {"evmos1eh9wt6cu9m3ms7lr4ktyje278g6trpv37pld7h", "45882504083542867968"}, - {"evmos1ehhe5366v44yvsrzkzzz0artrwyqup7pu3txds", "45882504083542867968"}, - {"evmos1ehuszujxqxe2uz3h2qt25kagn9693akd8zjy82", "1001000000000000000"}, - {"evmos1ejk4mmx82p37vay9e8w6uhv0xee6qnvagd30nv", "21764858550555760584"}, - {"evmos1ejn7mzqmvt6yyxthnqfg4dp4ppxccv2s9vrd3n", "22696280108108280764"}, - {"evmos1ek97ynlpseqxdsvs20syskrrjlu3n8wpwhvs0h", "1100000000000000"}, - {"evmos1ekr5uj9zv3fcdr2huzdm3gwxae0lm36e4885e6", "45882504083542867968"}, - {"evmos1el3mhfkqp0chtvardgnwc9j4gcd43j7e4z8e3q", "1763581660408326912"}, - {"evmos1emxmxep0pcq4t7gxmh2swfme5dvr23t7sdlf7w", "1100000000000000"}, - {"evmos1enheajxfa05frzg0xfn80wng4627twxaldj853", "1100000000000000"}, - {"evmos1ep7uv2r57sjl4q0jcvy0zrwjc400mqtmd2alhw", "73861106048759869440"}, - {"evmos1epmctyf6y80txparvn8y92pglq02v8yzd56fln", "55958203930434002944"}, - {"evmos1ermwlfd7thmwd6xn4wfpc2ecazljhhg578kxq5", "12479429744389116743"}, - {"evmos1eslvdw8ty9pwt0eyptq09ces6mhqrl7l5jmezd", "259637619958387769344"}, - {"evmos1esxjd3vwlenh0rrlwsnpaldsy4exwhq9eeem3h", "1100000000000000"}, - {"evmos1etgmnnxuj93hd75356guyn5pj9rpg7w0nvzh8a", "7080758755063168"}, - {"evmos1eth2cyspyx3nchprycv6yctwxphr98xhdnj6eu", "61000000000000000"}, - {"evmos1etwd2wf3x4frhguytd6dy238ekvwfz4xqqjvka", "132891899893550930"}, - {"evmos1eu34n85q3f4h9387645u4kr2swryvuu8ftvkkf", "1100000000000000"}, - {"evmos1eu72glvlh3zqz67kx52tfccs7gygy5ccgrwzyg", "1001000000000000000"}, - {"evmos1eukc32uhcthpwqg8yp5cahgl7jkdrta9ytpytk", "1100000000000000"}, - {"evmos1eurvrvqp4xt345vftnrl7a5rswm2q502m5sdfz", "1100000000000000"}, - {"evmos1ewcu3y94s4jfeec2uesa8afcak9n9luypvjlzf", "199764814892236374016"}, - {"evmos1ewmnvk4ld4tjexuuscnqnnmklkhe3elpuc0xlu", "75624687709168196352"}, - {"evmos1eyktqy0n2jqzygg06c8cas2k4dzk89hszq0ygr", "201000000000000000"}, - {"evmos1eynmaf9x22q6cxgek47m6l9dxkfz4mcjldym9t", "1100000000000000"}, - {"evmos1eynp5d69ekk3t6dgtnwtfkd348kj0d72th0eef", "45882504083542867968"}, - {"evmos1eyqwqnpu538kdqnk734mzm7u2fy4929ntqwlxq", "1100000000000000"}, - {"evmos1f0qjyeerngw76598gr4y8aqqyyw8uw8m0j9qmn", "1100000000000000"}, - {"evmos1f2ck5qx55ptp0xtynejddqmx43x6jrf7m3y3qp", "91766008167085735936"}, - {"evmos1f2dkqvvkg0ctm9y30zptrqun9qnr0yy76kyajk", "1100000000000000"}, - {"evmos1f3elzsz29g5sht0563z3d3d8y5us04l9ft6axm", "1100000000000000"}, - {"evmos1f3p57fj82pxrehdulpzeu452xz039a97vdsc5u", "1100000000000000"}, - {"evmos1f3usn4hs9xe627vpg0yy8a8cu56p5drnplehz9", "101000000000000000"}, - {"evmos1f3uyy2jn2w2jvs403lh24q3xfny0egdqln5nv4", "1100000000000000"}, - {"evmos1f3v9ca4ls5qnsur6guq5ltrpekky2qel9qjl5d", "146692655847032192"}, - {"evmos1f474dsncq0q3sj2dg3h67zf2xxp64fc2pfunay", "101839708013976870912"}, - {"evmos1f5jlr9zzr9cpmfw72ul52ff5a038eptw5jzhyh", "203680416027953741824"}, - {"evmos1f669utvsdhx5z9ahgjunwyj8sfcc7pv2h5n6a8", "2000000000000000"}, - {"evmos1f6dwyqafjf85u95e0tcvvxp64nseug2rs5yuvt", "45882504083542867968"}, - {"evmos1f74ng42fcmqcfw9cv7335y3vr0aj6zz6rnects", "501000000000000000"}, - {"evmos1f7j8xeyy4pcemxku3dc5fszj5h38nmhmccv7ru", "1100000000000000"}, - {"evmos1f8hw98wcp3mtslstkjtaesua9xjvhu9av4q58s", "45883504083542867968"}, - {"evmos1f95a88dm6y6l9tr6hjec8t6m49dkdqdflh2cms", "11000000000000000"}, - {"evmos1f9jpk8n4khwwupq9yjvvguzcxvx6fwmyszqznx", "91766008167085735936"}, - {"evmos1f9ywyxpm5snkvr8vs0u69yy04yuc8l25gq4rfv", "55004012566330607104"}, - {"evmos1fa4p0w7pcc62pqqkldptl4y7qcucduyrq9q44n", "1100000000000000"}, - {"evmos1fanw8texyrahww2a2vjk7xguvfsuxaqcj0mvq7", "54954164386713868881"}, - {"evmos1fc8qy76m0avq6usfmhx7ys6qxkx0654q2hp82w", "132922824920152658953"}, - {"evmos1fd5cg849ha0nqmuarlrpcmpvg0en28nywvth0s", "259637619958387769344"}, - {"evmos1fdmw0uz6y0p8p5y60zxsedj9hra2w9p8v4dmm3", "1100000000000000"}, - {"evmos1fe0dcr2r85ku09st55nmkrl8f52r8sy5l4s6ua", "45882504083542867968"}, - {"evmos1fe0m87gzx57wl9jd2jjpykfzun75vkdf7765n8", "144732908976304211682"}, - {"evmos1fedgx9qd9f57usslnvqtjt0eacna0hl6dju528", "1001000000000000000"}, - {"evmos1fee8g3rra2tvt0av9w5vwj9unfup0uqhngcj47", "45882504083542867968"}, - {"evmos1ferv66gmpg2el0j795y289g6xf8zldxqsny0kv", "2000000000000000"}, - {"evmos1fg8v8a7h8df86xz65ep8mhnle7zlgdzwk8d3hn", "55958203930434002944"}, - {"evmos1fgj7ugjk8pnqznmytzt044v8n5fmzltyg8wuf2", "1100000000000000"}, - {"evmos1fhq3d0wj6mnrlu4qs2ha4jskd2s7k8pgthpr9m", "1100000000000000"}, - {"evmos1fhxtm3chqhygrswx9czvc53vncuuhwutjv6wma", "50957112630320319262"}, - {"evmos1fjqx6fsgg6s2n7hdkszum6ceprumcv4x5tydwz", "21000000000000000"}, - {"evmos1fkdg0nuqmvcwyyh2xt20d7gyysamznl5x4ptpt", "101000000000000000"}, - {"evmos1fkhdyj89vkynj9ecwf28qw3rsvjge0cvldkha6", "91766008167085735936"}, - {"evmos1fknurwqhq5vcqxhg0xudq5825qdsgty8mwv9k8", "1100000000000000"}, - {"evmos1fkqx06p755fz9n4qtln6k48spzgf7qkh54wela", "55958203930434002944"}, - {"evmos1flshwpsdupyzh7nru4z9j7q326d364y8jnerdl", "101000000000000000"}, - {"evmos1fm69agzja643vvwu5zwj39r0arshvva46caanq", "1001000000000000000"}, - {"evmos1fmj98l93nqxjjwanw4m2qkt8vky5xt3md93kpg", "203680416027953741824"}, - {"evmos1fmx55x3jf6lf90urtg40r8l0t4j3j0lf3n7rw6", "1100000000000000"}, - {"evmos1fpyg7xyr6zyl4z75kn0dkcn542wh63f4aedpyc", "1666391603957617281"}, - {"evmos1fq70255rlvprru7rks58kex9gul882ghh6292w", "199764814892236374016"}, - {"evmos1fqjhx76ntpvtq0k4p050msl3pe9666fm2jdnv5", "11000000000000000"}, - {"evmos1fr72j5yh96qruwj0a3rrf9upsq66hrq5s4d9ul", "129818309979193884672"}, - {"evmos1frdgcv64nf8xfsfv702mluvg5wutz2vwqgdyvy", "91766008167085735936"}, - {"evmos1frghrq833l470tyrplfld9rpwkmy34e9t3p9v5", "400000000000000000"}, - {"evmos1frl9cz27c350l57ztct2ncyd0g4wr7j6trm8pl", "83935805895651016704"}, - {"evmos1frucx54dmh7srxq8xznzquhwm0628lwnc87sr4", "1100000000000000"}, - {"evmos1fryuhqckqzhztzuzwraxda526zfvmy90v6wucl", "157796911944410873856"}, - {"evmos1fsjge83za7x4d09ydgywv2hvv48pml6nnr93yl", "21457517541243664691"}, - {"evmos1fsv3rgdpzf24jm73yayxcduk6aqkeunaysll94", "18256332036092769181"}, - {"evmos1ftdph8vlu29tm9v97kx0amfpdx3eu8rtkpj7ag", "21000000000000000"}, - {"evmos1fvqjmcq6yd2prtf52rg3jghjpvaj7mjyxu3f77", "9006118722421765990"}, - {"evmos1fvskrcfa828r7jsnl87tuvw6p3apnxvtzrmwex", "21000000000000000"}, - {"evmos1fw0udez6w6f2evq4zr99a74wsa3en4pj8lu4pa", "27978601965217001472"}, - {"evmos1fw4qfhv4psrq87hkx0y503ypz02dyfllgu9w4w", "77088375051035120895"}, - {"evmos1fww7k2gyjcj9wy9mv5v9e9lelp63e774mhthjx", "1100000000000000"}, - {"evmos1fwxcuu6vglvaxk0k2f85tpkwyyj25getx8qjc8", "45882504083542867968"}, - {"evmos1fwxz476eupm2t2q4ft2thxn8d09hk2aasducpn", "1100000000000000"}, - {"evmos1fxs4zpsw0w5ygm45kxjpqr8ztz7gyp28w6pr0w", "1100000000000000"}, - {"evmos1g06p6t8m8raa6f6ucpgdnjpchd0f23f39zywyu", "1100000000000000"}, - {"evmos1g0m3yjtfscq8exn5yae9az47zdv3gqrec3xhwy", "1100000000000000"}, - {"evmos1g3zq4fn44ccedcnpfsdf4jyhuhxklp298uywfw", "9301000000000000000"}, - {"evmos1g3zyfm7pnhd30cfsng33lkytjmg8d50xjkag5x", "45882504083542867968"}, - {"evmos1g5n2mm0347tuy37sp3fauyyu9lty9c2c5222je", "27978601965217001472"}, - {"evmos1g640vp22jpwt8u2xn4apvt6jyjxmun5e0d73lv", "8564269668139681779"}, - {"evmos1g698v02m82mve83zft579z279pvrc63658u64h", "101000000000000000"}, - {"evmos1g69nt902ch9hj8nkcn92d40v9vqw7w7227tzrv", "1100000000000000"}, - {"evmos1g6fvslrzcu0ung443uumn8gnqnmlqvak8c8gt8", "1100000000000000"}, - {"evmos1g7cntflh35mhsanmwwv09h23xmmj80fy0z5r7y", "103603289674385197824"}, - {"evmos1g7fscwmuu3lmmtem2euklx5wp8wycwjl2pysme", "1100000000000000"}, - {"evmos1g80ktqr7lw2d655vwjyzhaw7xrc62jy53fkdak", "51828015835933467648"}, - {"evmos1g8cv9r7uc838ck5yxdkez852838xpx6mcxdwy5", "9607458353741672192"}, - {"evmos1gal5p2wah5t49vyr2rfx6qkw084raalhw09xzw", "91766008167085735936"}, - {"evmos1gax5zmf4t7ehs8zxyn0t4m789wy94sdyzn2ewr", "1100000000000000"}, - {"evmos1ge4fd2am5222vjyuu338r3gxa0gt2cm9kwmceh", "1654524958753540407648"}, - {"evmos1gf59vrsl6d05qp40f8dlhrdjakepssj0rg35xs", "36301377662204171264"}, - {"evmos1gfe25v3rtdq8vr5w9kknytcrm3sqlrrs0daza7", "111915407860868005888"}, - {"evmos1ghnjd4my8jkcjaaumaxg0a2s0p3mxlwfe5y4fr", "6625882622550768384"}, - {"evmos1gjsxqd24fjf8jamaa2r5cas07a585h9lsja2l0", "101839708013976870912"}, - {"evmos1gk4d8s0mle5tyxx6s9dv5s3e37f8ftl2w64hgj", "1100000000000000"}, - {"evmos1gkec7tl7kn7z03pj4zrjf7sm6kn24gfq092n4k", "1763581660408326912"}, - {"evmos1gksq2qp6ukvm3edxkl2z7da8wn02yz8ynf8uh4", "9434414240649523662"}, - {"evmos1gkyjm7768wwwq5f5zgtg49r7e290yxsmmckwk8", "61000000000000000"}, - {"evmos1glujeppxkm2lf9nttfmnnqjkswfvsy3ydcvnxs", "61000000000000000"}, - {"evmos1glusft48zr3xexms7g5hew0d8xq6nyk4tt9k7c", "55958203930434002944"}, - {"evmos1gm28mpvxnhghpc6at8p0ulrtjxj2jf7jde858j", "1100000000000000"}, - {"evmos1gm448lmxz3zmkql2auutucdzr78w3zmkvucl4q", "61000000000000000"}, - {"evmos1gmlvxe2tsge2mkcjftmgcru57qa0xm5kztzp08", "26041402042782703146"}, - {"evmos1gmtjrg0e5dp8qsvuq8k2zlnzlxdv2tz4ce6kep", "45882504083542867968"}, - {"evmos1gnjwsk0xg6hsvshpe7365cvtx5vl7zr0l5vmag", "5233691300658282496"}, - {"evmos1gnmsc6de5jqnnf6mses0ap9afqqr7lzlzp9rse", "1001000000000000000"}, - {"evmos1gnsmsjz03ndze79jtukt797tdnzd0np66u3yzh", "1001000000000000000"}, - {"evmos1gqf77ngeqqlycxmgh4vecckax8x0xae0ktwq2l", "1001000000000000000"}, - {"evmos1gqqrlfytwlwaan2pm6y68pudag46gf2he579a3", "159560493604819200768"}, - {"evmos1grpl9hpdh6thkdl0w57n9h6xy3493rnhf3skue", "2001000000000000000"}, - {"evmos1gsxv9xglp88u6qxuufxztwvwvhuc30gz36kp79", "4017157304245694976"}, - {"evmos1gta0rsl3wcdk40qly4s55672e4t3q64xfe3mug", "1100000000000000"}, - {"evmos1gtaj0gq2cndaqxevm6yxzfhwypkelzd839ckj2", "73861106048759869440"}, - {"evmos1gtw0mzymcrfwhk7q797gjny8859pu72fptlhed", "87045936370136676864"}, - {"evmos1gtyr6vy5cwvj0vhj7flwt65lgu78atv3rqayjp", "101839708013976870912"}, - {"evmos1gu74twt77lllk0kks2k449hp24lpa3q8stf6v7", "1100000000000000"}, - {"evmos1gu8n0ch86f0gsae9tt8maf53arkcqekp3mddg7", "55957203930434002944"}, - {"evmos1gucn459gf659rdfty93e3cjqpmnhvvyzrsqqyl", "21000000000000000"}, - {"evmos1guw96zapv5ghg9mmhmlpe2hqj9dldnxlkyq08w", "27978601965217001472"}, - {"evmos1gv040hxecsghy5fu3wn5gqvh9xx0m27pgvyjh9", "12489171086805001216"}, - {"evmos1gv5tf9fmp7wjswwmcceq97lpc9v5nu0lj73wal", "101839708013976870912"}, - {"evmos1gwg98pufmtl6z2fzyktwywqt9rh7rpueqqgpmx", "11000000000000000"}, - {"evmos1gx56ehgykqp85rjrct95l8ypd6a9ngkm73nv95", "21000000000000000"}, - {"evmos1gxdfhy5ywgkar6f056dav9q9sh0yrugkuldcz0", "1763581660408326912"}, - {"evmos1gxeqkn5x7daefunrz7zh5d682zz7da59ztl49f", "118812478284900623795"}, - {"evmos1gyfzlapsesph8mcjhwzvv3jc309g087hnrzydv", "1100000000000000"}, - {"evmos1gyj4wsf89ks2k3dvaya54rfrk955mxwztwyxuh", "116036416191827050407"}, - {"evmos1gzxy4upldpej86q5tzv9hnwfp92vfeeve0hh3s", "1100000000000000"}, - {"evmos1h074c6sajj067lqyyy34qlqfne75ha3udfg6p5", "1100000000000000"}, - {"evmos1h096a8mxdz4ud0g4csxcznp9rkp9u7jdsa6u72", "1100000000000000"}, - {"evmos1h0elkct5srs454sattmun54jxpdlfpmhlyr7p3", "2000000000000000"}, - {"evmos1h2tqq4w0ktx3h6v06zmc9umjad55derhugvxck", "1100000000000000"}, - {"evmos1h4gm0yg39rynmf9c50vlv9k5jrnuwsqr5vg96p", "1100000000000000"}, - {"evmos1h4p904gsygddth2ajnqj06ctc7chfwt9l70gy9", "1763581660408326912"}, - {"evmos1h4zr62u9udcnvarshgaf47f76vnmk83smg7enz", "4260532757256250880"}, - {"evmos1h54e28hqdnutpsg36m7ar4esxf5je90n96tc4m", "1395206742162964010"}, - {"evmos1h6v0k3ldzayg2cnxa2ne08rfryn68zkq2323l7", "1100000000000000"}, - {"evmos1h70x2a26gmaupay56j4evh3m3sgk8c2tzdcjsk", "1100000000000000"}, - {"evmos1h778pvs3jq6zpyequclepz4jh4fjyhneegyaw9", "50452623051477792768"}, - {"evmos1h85hfw8yr8wl62unm8edlh6jegfvl30p47mv95", "1100000000000000"}, - {"evmos1haykcmrhs4krq8cjsakxt0dpntlf62y6rlhu7a", "1001000000000000000"}, - {"evmos1hcw5y2lv0u2lne6e3d87ue9uzt4dt0yyk7zu46", "1010000000000000"}, - {"evmos1hcyxs2navg028wqnhsf2nc4gu68r0nnhqp7sge", "91766008167085735936"}, - {"evmos1hd4ezmnpuzq3sac8cmg7v3vd4mr7fph4v5y6y8", "1100000000000000"}, - {"evmos1hdak5tj7uq9hgns6dp2lfdj0wq37s39z0tydqg", "51000000000000000"}, - {"evmos1hdqkgpqmr8rmruhdyp8ncjlz98ganlxuvj556x", "45882504083542867968"}, - {"evmos1hds56vlj4smter3exw3r5yymxl4ef5kl8xsqlh", "73861106048759869440"}, - {"evmos1heyc3ws5fmavytyluxgx529skcqxsqegczqfgc", "55957203930434002944"}, - {"evmos1hf2q3evg9a7u0a98uay0ac4hrj5tuc0gkjqv9x", "3048940767123374592"}, - {"evmos1hgf2fvpkjsqz08jzwmcudfeps5uece2z2eaffr", "13881073965257344453"}, - {"evmos1hgfzyg3zy2xchfz9jk98tgrsf4txhukgc4067y", "761000000000000000"}, - {"evmos1hgty5xvfd0akd5h0tuld0r4gadhqgdlkxlxz4j", "83935805895651016704"}, - {"evmos1hh2nudan40uxaxll9vlrd8pnjws0y2ea9a9829", "1100000000000000"}, - {"evmos1hj5cgccj4fu2km6hpladac3gvwc3v07paxk572", "34598381660845550166"}, - {"evmos1hjxzkefkuaayhg3jrnwhr8ncw96n0zpzeysdyy", "2001000000000000000"}, - {"evmos1hlr77mc8r707lz2xmzus4nas9p8v5xpyxl9cxz", "29877974589190002539"}, - {"evmos1hmayc0z0uqapsa5gy8g9g299wqavkjelfr4hy2", "1100000000000000"}, - {"evmos1hmgww29wynvpvtd2wgmm4rxqnr7qfx44rdtv4t", "63252075774453125397"}, - {"evmos1hmv092axmdm929wzkllshq0s70fam7xd8ms6fm", "61000000000000000"}, - {"evmos1hn2gygvj2ea472x4yd2er2uj6lruty0t7ed7jr", "1100000000000000"}, - {"evmos1hney2fs225sqfy4cn6nf7wq4vy7z7xkrghk8lc", "1100000000000000"}, - {"evmos1hnkcuzu0xruv46mcvsgs5fn386c8apg6zrc2vt", "343573425854038769664"}, - {"evmos1hnwp9x2nw7czn8qy32add0jj07tsczx2dpecsk", "1007196213169622391"}, - {"evmos1hnwrgmg9tsxjfacl2wz0rw666e6d70rxuvzvw3", "27978601965217001472"}, - {"evmos1hp027k0xm356c7mdjtrvyns6sw6c9v5nns77qc", "1001000000000000000"}, - {"evmos1hpts887e35dhrqtrwtft27nmpyrjdtpdl6g3y3", "11000000000000000"}, - {"evmos1hpu5uvnn9m4qpgj929qqduuskfjdc73puhfl4a", "1100000000000000"}, - {"evmos1hq30svgkw97t28hf7uu3axtax4p56s26leqjla", "51000000000000000"}, - {"evmos1hqhgf2nr9sgpayjv0v9cl24dqv3gygqshxujtx", "1100000000000000"}, - {"evmos1hqklf8wcy0wqgmundk9jrqm7e4gturcwwvcfjr", "114115908181574270976"}, - {"evmos1hrheew2y6qwvgn0v4ldktfy6u57kkcnz5y98eg", "124780960055748296704"}, - {"evmos1hrk3mtneua63azs7834qjaylvcdhg4xrys247u", "59180054267746532480"}, - {"evmos1hrrlgxn7trwv7kvd0qelp7wnfdm8hhwmyk9zfc", "1100000000000000"}, - {"evmos1hsupgks9w42m5t9l3r7gchs4rxgjrnpwf386rn", "1100000000000000"}, - {"evmos1ht7mzvj64s2wxr66yezh7l0h474rt3w99zzpvh", "455487833714906791936"}, - {"evmos1htxnjhuu6krqwurzx2vztd7df45md2lfn0ch9s", "1100000000000000"}, - {"evmos1hu25uyj6sqqujz4lez8rwz9u23u933xcapr3cs", "45882504083542867968"}, - {"evmos1hufffr2zx7suhsdfmjhzfr9y8uzfzulvxvk89t", "1100000000000000"}, - {"evmos1huufq5nuarh6ar7zugdxw8ed8ywtkqxf8l8j3s", "18461973678904849108"}, - {"evmos1huwunhagahde48j6c7a0pthz74uj7796msnu88", "27978601965217001472"}, - {"evmos1hxexyngvpwluctca69n06x5pyc30s47ce2kyxg", "1100000000000000"}, - {"evmos1hxvpshhjxgeuy0fjuahmly34g4q4ycnvvnlddn", "1100000000000000"}, - {"evmos1hxxnm2mnra32e37t0jkvknu2zg8fqy9esj6tf2", "12740739169593575478"}, - {"evmos1hyney4fwtypnnf7m78sdvy20h3eetjrtjznyh3", "21097910623039931904"}, - {"evmos1hys5rfk32qjj2whukkq2ptkn8q0t3ndx575zqh", "101839708013976870912"}, - {"evmos1hyvgtjjx53gx3d4wpg3c4jcflxruvmdtd4tzc4", "45875766838918749291"}, - {"evmos1j0c4wu5wn92qhkgqtla86d6rnqdjgv0n2gxw9y", "1001000000000000000"}, - {"evmos1j0grh0d26rsgflhpfkyz56th86z2h4sugqanks", "45882504083542867968"}, - {"evmos1j48h9lcfase8g6ak3lcwqra8r52054wqd93y8d", "1001000000000000"}, - {"evmos1j4fkcmhzzzw5maffw2k67huvqn84cx9gh5j02c", "1100000000000000"}, - {"evmos1j4smu8rwmfv4xl26zrvdh2ltqfxm0q7xuf8vgg", "251000000000000000"}, - {"evmos1j4y5tx97pywx87g9gw46kdlmyk226ans7yfze7", "42011742046725242880"}, - {"evmos1j5czgjj8ykdqmsj504tkp36auvhjr8a3z68zps", "1763581660408326912"}, - {"evmos1j5dplm2harq2ktu5y7g9uqrje6s2gu38pwunj7", "147723212097519738880"}, - {"evmos1j6xd6zs2j2uw9whyg8a54fg4leelatrhdmscvj", "399530629784472748032"}, - {"evmos1j7vt6vyrw50a7uesv6jujkajy8p8kdk6f2y6gz", "1100000000000000"}, - {"evmos1j7ww0v038mek9yf2z7r5dw872jz7w7jgpjh2wc", "1968498125099000"}, - {"evmos1j84nknu8fzmza99re3ndyds5ufavhqwt977slk", "1763581660408326912"}, - {"evmos1jclgu68yrffrufwdeay4he0h75s4ja0rtg9gqm", "4913536220299559168"}, - {"evmos1jctj5ppgp83vsph2w3kne5205uucmyq7xrcr3k", "101839708013976870912"}, - {"evmos1jd3t2wn23dercp34kr6kefuwf2zedpy68cnurj", "1100000000000000"}, - {"evmos1jdh09ysrwgvvx2uxcn25v2xk0smj7agkdj7gez", "55957203930434002944"}, - {"evmos1jdnhel78dylqehlf98jr97sha7wlu395l8xfjl", "129818309979193884672"}, - {"evmos1je3as4a67s0mvvla5s6za7jstngpe2pkd9aw9l", "1401000000000000000"}, - {"evmos1jetczvekxne654awremr9aesttsyyz9ppy4dt2", "45882504083542867968"}, - {"evmos1jfcrkaqnrk46y8tca2l77y2kcll7s80qn0rp08", "501000000000000000"}, - {"evmos1jfme06uy4cnhylruvxpn4ctxz6pz2xql6jxlvp", "1100000000000000"}, - {"evmos1jfttdlts2e6gpqcm5p67hhv5ljhtpqymwpmdtf", "4335355960942532096"}, - {"evmos1jfw45jnu56mhmmd38wlukmv8qg6ejmn7d2edwn", "91766008167085735936"}, - {"evmos1jgxqxv23mvuf4arav6j3sze2vp40n68umq06n0", "27978601965217001472"}, - {"evmos1jh2vk38f4xectu8m9h2apd837fcp3xwafg8wxq", "31089503218696426496"}, - {"evmos1jh3e0adeavhe8l0rym4telvvzsczyjhq00kwey", "1100000000000000"}, - {"evmos1jhwpkrcfklk9svrl4p2wjxm0w7t7vewleqepyr", "1100000000000000"}, - {"evmos1jj43yk7k2kftf0p9yrtm6f8cml955jtmjqynyk", "61000000000000000"}, - {"evmos1jj4mz4eus0u6209dvc23fmtlqsv7ck227wlunr", "11809433983133564416"}, - {"evmos1jj920h72glgddx0tjrya564qxu79djwdtvl030", "171786212927019384832"}, - {"evmos1jjleenhwmfz5g2e24sx0pk4mttea3rfd5kl6dd", "26500000000000000"}, - {"evmos1jjw67e2zyxjx2zm8mvyapf9yssrd4ws2yjqk4z", "371552027819255758848"}, - {"evmos1jjz6zaftuym252vhpnrtnjedjw6rv2zddlach5", "1100000000000000"}, - {"evmos1jln7afu53u84yetlw52levxsjwvul6rvlfy2gk", "1100000000000000"}, - {"evmos1jlnvp4ufehnn440pj527385ya0tszw2gjthrft", "55958203930434002944"}, - {"evmos1jnd7n0clk0lk0s79cle5une8s945ea2c2gf4tu", "1763581660408326912"}, - {"evmos1jnp8ez0nlen24hr8npmjhefd2facq0x45l5auf", "91766008167085735936"}, - {"evmos1jpxmw482fnh97anxvaerh49p0vspwkcyvzr2cv", "1100000000000000"}, - {"evmos1jq0swwcxl0u7xhz9w8mddjhtjsjhgyq3a9h70y", "45882504083542867968"}, - {"evmos1jq2n742rkllwn405v2fgsyycx9h8wwmgz2f567", "701000000000000000"}, - {"evmos1jq2x02m99u5ndg3wkm80qtk5a8u46kjmdve0sg", "1100000000000000"}, - {"evmos1jq52p55nkc5w6a4vj77x7p9qmyl3a32gycpzua", "101839708013976870912"}, - {"evmos1jq6yesch8rpzmc043tvmjqw05z5tw6ylytzn6s", "8526811313237976832"}, - {"evmos1jqzu0rl8wm8552mrp4a7cc34g04ydjkc6e6wch", "1100000000000000"}, - {"evmos1jr322sq8k9ma23d5c2rrgftqymk9sdv46acevu", "1100000000000000"}, - {"evmos1jrx52wq9q94fnr2zq4p6cfnqguvfxts40d5sck", "101000000000000000"}, - {"evmos1jrz7gstkla0kc49na7swqtggmqjgs0pp5ry3uz", "157796911944410873856"}, - {"evmos1jse4angmpqhkscy6kf777jnv37xy0jgrzaluq6", "10001000000000000000"}, - {"evmos1jtx6m2eegm63twdwhed5tuwffaq3rafjl2jdhe", "45882504083542867968"}, - {"evmos1jtyzp2ajmx8qt73ywkeeqls09457ng2gxd6ha4", "55958203930434002944"}, - {"evmos1jufuaez3kl30v3n9r206tvy6rc4y5s8lumxcuy", "1763581660408326912"}, - {"evmos1jv9cykcnu3jy9h2cjujn8j7xk85c96utfldhjd", "1100000000000000"}, - {"evmos1jvmnx0mr3t03uwhxjm7z2xc890lmg9jq0hm6te", "73861106048759869440"}, - {"evmos1jwky8z3zvx0jz9qnjclerpzvcczv0yxt84228g", "50844999948130000"}, - {"evmos1jwnj4j28ajrjadj0s73sz3rdshz8hdhmypjhvg", "1100000000000000"}, - {"evmos1jwx4ny6fa4tudy59pl3ta2ttkrua3szx2zzqvu", "101000000000000000"}, - {"evmos1jxn63xntg9yq0su6hk33yc7rl7fwq8520n7g27", "21633535037262897231"}, - {"evmos1jxrsq4a4gtkd3u24s338saccxmrjefdvzypa6f", "81000000000000000"}, - {"evmos1jy69rd734m7z05rnktdle9wrvkjlhgguzn9n3k", "91766008167085735936"}, - {"evmos1jy7yq7u3cfd6lhcxy5vcdqgptex8mag3w56qw7", "1100000000000000"}, - {"evmos1jywu0ehhyxrv8fu8l06plj3m3jw8ng743zlf9t", "1050794447592175531"}, - {"evmos1jz5ryt3fy777p642h7lellt6qhmk2le68hzlrq", "203680416027953741824"}, - {"evmos1jzvv2yn7q8adlysn89hctdj7qzhzx47ql0w7mx", "61000000000000000"}, - {"evmos1k04h4crhrd0y3t4539rldnpql8m52mr3kq9sp6", "68823756125314293760"}, - {"evmos1k098awtdg8m7zhlxfp90y57jqhd7r7874rhn8p", "1100000000000000"}, - {"evmos1k0jtzh4e3sq9gxgqmzqmxesvmtd92v3l2y5wjd", "73861106048759869440"}, - {"evmos1k0k8taprdzfrel6u9ufeengqtll55za6c3mad5", "259637619958387769344"}, - {"evmos1k0t4lxp9psykwku7wy27y7kpzxn6hsesulu8d0", "134971112357544097792"}, - {"evmos1k32sch9j9dt7gsvh38h6g248nungawmwg4xqtw", "120001000000000000000"}, - {"evmos1k38cnrn6pwq95f4j6pkz56v2hv88q7gk523734", "1100000000000000"}, - {"evmos1k44dccmtxl0gyaesa2dvwcpl4y97suv28a874r", "27978601965217001472"}, - {"evmos1k54hvem96tk0tskqfjf6zxhdp34gskwasqhrtz", "55957203930434002944"}, - {"evmos1k55g89w6dzm0cl04p3tkfv027dljq38nflqe4x", "166748863003573821440"}, - {"evmos1k62a5mv9tuncvhmee35k3rdqzj63ph7ywxlrrm", "27978601965217001472"}, - {"evmos1k65zve5ze0j9h24nhh2mmzagyck7c93y5j44q4", "343573425854038769664"}, - {"evmos1k66mek8fvthzr0aufpzfex5zsnrwrj9jphdnye", "1100000000000000"}, - {"evmos1k75j0casa3r5yy2tkuhrlcwd9r3utthd4q4jdc", "111914407860868005888"}, - {"evmos1k7f94e2ajjv604ulcxdreqtncjgv3ssn6jyk5m", "91766008167085735936"}, - {"evmos1k7rlqk9tn72ss3z4m9ssnwt3e7svvzs47ep02a", "101839708013976870912"}, - {"evmos1k8kh5uj8fmlr8nxurs5tpzg009d3y25qqefhse", "1100000000000000"}, - {"evmos1k9q25385r5uvu0k0ez6ptl0hzf69e6symy22kq", "73861106048759869440"}, - {"evmos1kcupzu953xjqqss2xkv02qn590pq272xtjjx36", "1100000000000000"}, - {"evmos1kcyua4xu59nfdvzpmpu70d4fnv4puw86etpmz6", "1100000000000000"}, - {"evmos1kczhv70ncrga8gv5n8fq4vqtg76mffkms3x0pp", "1821087837083558167"}, - {"evmos1kd4mr9v8dzdrz0dwp3e4f6sfe0yezdstejpmhj", "1100000000000000"}, - {"evmos1kedked6u042ceguahvyc7ku60d5sze8uu6045m", "1464500000000000"}, - {"evmos1keqhxja3gp9tezzdryx0eldh9a8q4awxey7fhn", "259637619958387769344"}, - {"evmos1keu3052k273pzxy7gc0v7j0zznltpfmpyjdgrg", "2001000000000000000"}, - {"evmos1kfmrcrqxlk4nmdnnnw9ztkpk9aq3mhy9wkmqpt", "83935805895651016704"}, - {"evmos1kftkym235s5vr77jp0yzjm30uw3m2tlha6yffk", "1100000000000000"}, - {"evmos1kg99k8wd67r0ffxwavgnxup7yk46rvttpd32y9", "255722018822670417920"}, - {"evmos1kgm48nx004kh4ka7keqprvd5fn7a04vemwvhmk", "18935439897995518720"}, - {"evmos1kgnv0z8enl4z0uwys9nyewkfwvxgh3uggghj7f", "1100000000000000"}, - {"evmos1kgs53j5zjuzxu6qel60au9sdpmxsqg4hz955q4", "45882504083542867968"}, - {"evmos1kgtww7kj2aw53w03yynnz8xpjmpqczd360jwh3", "129818309979193884672"}, - {"evmos1kh3rxn6kk4c52nfqqe27yy333ukx9g8ktjrg5z", "22073863532747077376"}, - {"evmos1kha3vttukf9paf2fldphm8mt3lk58anxtnnf3q", "101000000000000000"}, - {"evmos1khjx4754jm9k73xjljmdh5sfdklr2wtvw0jp0v", "82857727448649328239"}, - {"evmos1khl20dapqlcsaks85jxg26aqfuvwx20x4xldvz", "21000000000000000"}, - {"evmos1kjhdx3nkh6krdhryvjzkq33xwh6wsyy794c7j4", "91766008167085735936"}, - {"evmos1kjsh2665c2s9u4rmtvgf3m2ly42s7yg9km5zdp", "11000000000000000"}, - {"evmos1kkv6986kjetewkua95n6xxt00ntgxha8w4ahz4", "1100000000000000"}, - {"evmos1km4k4n9f0slsrrvzjmnwcsrdef2w9c2ju662l3", "4306502130000000000"}, - {"evmos1kmndljmu7rnl7cfge5fqa9cqpwu7yu3mrxpfqu", "1100000000000000"}, - {"evmos1kmp5447lc8geh7qf27k8t668j4yfw097qczz3w", "45882504083542867968"}, - {"evmos1kpgdw94e7fvjrrk3q3q9fj6gr0fshqm0h22svn", "1100000000000000"}, - {"evmos1kpgz46877u66ac9rksdy4d6wkdl06dnxrtj7c5", "91766008167085735936"}, - {"evmos1kpqwnglcycc4x8hxu9km0w0tfrlks9dzj2w5w6", "45882504083542867968"}, - {"evmos1kpswemlchuq888td3v8fax3y3gu7xrwpgawv84", "11520138277210535256"}, - {"evmos1kq2rzz6fq2q7fsu75a9g7cpzjeanmk682y53pu", "1000000000000604"}, - {"evmos1kqualpulg9y889kxa7tnyuhdfk6v3rys0e2tzp", "1001000000000000000"}, - {"evmos1kr0v57nreul0q7s57nfxtdctccsj0e6q89yye5", "27533299579286495712"}, - {"evmos1krsua6sv286wnwyzfadxr0gw679x39533yema7", "1100000000000000"}, - {"evmos1ksnf9xd70e6kkck9wgehm3fp0udxgp0xn97u0y", "45551594008213112410"}, - {"evmos1ktn9gz2q7tfhkq54lg4e0awnsqlpj8rrty7mam", "101000000000000000"}, - {"evmos1kucd8yytnwp6cnv8dtjuwz4fsp8nj6227yxtq5", "53816186686832841728"}, - {"evmos1kueflypv2tj8yajhscwd3cw5gf8vqgzs60crga", "157796911944410873856"}, - {"evmos1kva4fgrjc9d8xxs25e7uz7y08zvxvztjecxved", "157796911944410873856"}, - {"evmos1kvdtlmm8zpn4m60p0czneprxa56fwata8hcs4e", "4954096640176984320"}, - {"evmos1kvh5n7skften3fv2ry6yc5jkpaz0rwzrxhf8xm", "97925106878259527680"}, - {"evmos1kvzmwh9el445p0l5u2sru3dvhdenmfz8y3z4rz", "47646085743951194880"}, - {"evmos1kwnedyv9cc88dxd74dxc3ls3z6ad7pv0axd2tt", "201000000000000000"}, - {"evmos1kwvc7cndzs5s6n6jyjyme2cyp85w0e7qyf44k9", "11000000000000000"}, - {"evmos1kwwnpu7sxh0mxgj703se7jwg33nm33zuztjtmx", "1100000000000000"}, - {"evmos1kwz4gf9hlaf00lphuqkhatnjmk68ehsse6kszu", "101000000000000000"}, - {"evmos1kx8yxvladmlyeyjkfnsktsg875ykppewz8wq6s", "101000000000000000"}, - {"evmos1kyderqcn37vsl9qsgw5tenjk8l6xzhkvzsewxr", "61000000000000000"}, - {"evmos1kz55yhtvnfyzw8mtdqqnlwnzj7458nsm5lc58g", "1100000000000000"}, - {"evmos1kzaqujr5quf20sfmty8rtc3rexy646wx345wj8", "6480539395186887424"}, - {"evmos1kzeu7vsvzl5ljpghxhnc7dklykdufxk2ep2t2g", "1763581660408326912"}, - {"evmos1l0rkyc0a2h8erwq6jlduc2elvyv09wf4e8rvf3", "1001000000000000000"}, - {"evmos1l2442dh54drmdq9jw3sqkdq4j0q99xrgkmnx4p", "1100000000000000"}, - {"evmos1l32qjpvvzjgnqc8wfal3a6tls5ks32c7faat4q", "1100000000000000"}, - {"evmos1l32v4y4p72grqh2zc0tdetg7a2wg74cn96kr4v", "1100000000000000"}, - {"evmos1l3sm7vxuz7jyksydnwfwd378k55yl7mqkkuq6w", "71000000000000000"}, - {"evmos1l3u6w85q0yn78hht0vkzxcpsp57j2akn6cmsux", "1100000000000000"}, - {"evmos1l3zz5u8c7n3agdh3e7xkvmff4gpvxk2tkyjc4t", "108025923932711865834"}, - {"evmos1l4a7vhht5cykler0dvgv9nvtp8qk4zkxe2z2tg", "1422500000000000"}, - {"evmos1l59053wpn3d6y6q27346p7zyr0s9yye4uzlmgc", "147723212097519738880"}, - {"evmos1l5ctk472py89nsgd0yecxdukn4gq98lhrvuk4k", "2010049767195105681"}, - {"evmos1l5s5w4qu3q3gder0j87njmkcd9jgh07xks62me", "27978601965217001472"}, - {"evmos1l67cvyzpfcatgnrwxu06uwwsmrawekcc5p7qrg", "7476563884976158217"}, - {"evmos1l7dgp27r6p6uqwrncdxy33u0tlzjfeea2y8f3y", "1763581660408326912"}, - {"evmos1l7dtfnqlkepjaalpm0c0zqwr2x09k5gwyskddk", "111915407860868005888"}, - {"evmos1l9dfpnssd9pz7n7h2mwwcpllfvu23e2hqcryxc", "57076488145807383040"}, - {"evmos1l9gzsfgzvle8dvwsf9nnkppalvvs9knpd2gzq6", "55958203930434002944"}, - {"evmos1l9y2yag7ua8n5fza4w6dlzrjcrvx2g738g6wv0", "45882504083542867968"}, - {"evmos1la62g0c0x2h8htckeerzms92z0w4duc789c49u", "55957203930434002944"}, - {"evmos1ladyjtes523lxt5xprej3l9hle8qzygxjmmvsg", "83936805895651016704"}, - {"evmos1lamvqf444dw2nuza7lh5x2ktlc9hxxz26pfpqd", "191512460000000000"}, - {"evmos1ldmzmtul4783ac5n3hmrguc6tze7g9cdk832cv", "1001000000000000000"}, - {"evmos1ldtse29la2pf7tx0qae2ejz7vuja4mvjnsa5un", "1100000000000000"}, - {"evmos1lejgg4kry85z0hfhxnjjk4j2dnjds0j7k9ey3c", "582902328500360373"}, - {"evmos1lfaq2qddk85l0l9dl6kuxsmnyf0djje5kgd0uf", "1113907245711002"}, - {"evmos1lffhk58cpmzrq0xv657xtu8gsmdd46vvjpddd3", "101000000000000000"}, - {"evmos1lfgxwxc78z29wa8s553yzc95tj94ghefmxn0ut", "100237789771180051456"}, - {"evmos1lgcyk765evefc2c7pxz2a9weqccg5g82acn6ps", "111914407860868005888"}, - {"evmos1lhlzlj4hnj9kygg89r8afrn2ed2x9dxe4ks7s8", "153882310808693506048"}, - {"evmos1lhrgk0y004n0pct5t4drrgwxayj76n3my6zdt7", "1500000000000000"}, - {"evmos1lhwjw0a6fdyqj3lvaqmlgh6sau7thr9l9w3rv2", "9000000000000000"}, - {"evmos1lk6sl2ewg2ats59y676yhtf0w2xtvpnedy8nvm", "3341633087303178205"}, - {"evmos1llchxwxhh4we7ytk54s6v9xz7yskcdfcljvjna", "18561922163229280256"}, - {"evmos1lllldecgggesjjx2guj572lxwwcukrdhfy4z8x", "11000000000000000"}, - {"evmos1lmdeq0j629gv7zjc6qg533ddpnkc55ss53lfxr", "1100000000000000"}, - {"evmos1ln29p92ak7pcyeaclc36duw04fzs6x8h2h099v", "1100000000000000"}, - {"evmos1lpp9ssaa9nsj6ev5v608auclv5awhtlvh73txv", "1100000000000000"}, - {"evmos1lq39v4ff0v7r9e8q803dtdewj0j06fcuuaa34y", "3526163320816653824"}, - {"evmos1lqanfjuzu46wmmzqtzec9jgw549897j8j7kpdq", "45882504083542867968"}, - {"evmos1lr24t0pstuy9qmk738jc4gclj8pldqq6vm3fs6", "55001516774247040780"}, - {"evmos1lr95c0snv7c366w9924k6usv687swemlr43ch8", "45831929956053572344"}, - {"evmos1lsyce347h27hsqk9cdkg4aruay242rqcsy8g94", "3192226835246600192"}, - {"evmos1lt3wun4gw9r2rgpxcdl5yckewdmtuxaymvamqn", "91766008167085735936"}, - {"evmos1ltgn6eydws7vmn27zjtjqfzerle2z95h5xuxyk", "87850407031368376320"}, - {"evmos1ltmzgze9dl0064umvxu8m3pq0w5tws45vqzgza", "11000000000000000"}, - {"evmos1lttyhp92m39s6h8zl7w9cznve5lm7qeuhcp6kp", "71725248201993730756"}, - {"evmos1lu2qtcqq4lva2ycqgumtjzxpk7gymj2ed5twp5", "343573425854038769664"}, - {"evmos1luh0dmlgg423ex4hh8wmqqfg40wmtxke24jfd3", "6654855457581192192"}, - {"evmos1lum2j7aqjhrfdx8cuyzek9ae5pshxthe8squzn", "67528300795009055426"}, - {"evmos1lunlnx82vwaypplksq3egprhkqttfewz7ws744", "2001000000000000000"}, - {"evmos1luqx2sr9dl5gdgdmf6qeut4z6st43sx5mh3rsh", "21000000000000000"}, - {"evmos1lvrjjq5u5t7rztre2pxww9mpfrdq8majhsgmyd", "143807610961802395648"}, - {"evmos1lw0mmwj8frwu32m7zdp4awv0f8hy9p2ggllsg4", "45882504083542867968"}, - {"evmos1lwe7e0a3f9j2qmqrkfr3cgyhc0qnerufqdrzqd", "1010000000000000"}, - {"evmos1lwm6z69q3m6hajmn7mha7kv5jzyyh6xaah3txw", "157796911944410873856"}, - {"evmos1lwnxzal9gj9zev9shnzrmad84kpq228ukk8f24", "167872611791302033408"}, - {"evmos1lx7dac9m9gnmfhra25ht3ar0guuvcle6u906h4", "1100000000000000"}, - {"evmos1lxg3th2amx995c07c9dh4ecxnxx3cdmqy6wrzh", "203680416027953741824"}, - {"evmos1lxyn7naehg5zcnluylcadp7scfa9cr34ulljkz", "1100000000000000"}, - {"evmos1lypx0s869z75zdrc7r9svp278ddpephcu9kslv", "11000000000000000"}, - {"evmos1m04tu67wwtk4s8szn6cu3trxgc87rsh6w8zsfn", "1100000000000000"}, - {"evmos1m073dtggfvyc0phf4k0zhrnedthtfd0lj47xpu", "203680416027953741824"}, - {"evmos1m0ug7nc07zw0rfn7utxy93qnn5m284vq35snsg", "18732548648502598656"}, - {"evmos1m23ggu267tfgm457ryaw9nvfkcpd9kqsljppur", "13000000000000000"}, - {"evmos1m2exdq6la7y9ffpy6jhflqhdnzh3rrttfwdhzn", "91766008167085735936"}, - {"evmos1m38su8zjmf4lcwdsgqd9ugyee8mcagd4p6e4p0", "83935805895651004416"}, - {"evmos1m3rcas2lek7r2r0mxue46n60uj5mpxqx0zrzwr", "45882504083542867968"}, - {"evmos1m44zhrdtny40qn2epgyvguelkn50gfz6aedcqk", "83935805895651016704"}, - {"evmos1m4mh9uzd2yag8ewggal2h8kxytcdr925gf0gsc", "1100000000000000"}, - {"evmos1m53rjfc9sz8czwuc3a90ww8w2adttnunafgjch", "82454812964463552334"}, - {"evmos1m53xuw28srr0q02zyh73ssr229cgr4es4wksgf", "16867516495078790132"}, - {"evmos1m5mz2s99e7rdt2p6vd8l2kezqcd5dsrqjkakgf", "1763581660408326912"}, - {"evmos1m5p372r0x0uycsxu2zrnjcudfe7p7tnzum9mc2", "1100000000000000"}, - {"evmos1m5t2y82zypraztt4cze6sy630cfzx9y53mjqte", "3771062441242485515"}, - {"evmos1m6mndgtse244u7e9mht5ez30jhhcap5m674m92", "88626645583183782912"}, - {"evmos1m6sudn3lzp49lcmmmss6m8ys4thnxh80g9y6dv", "61000000000000000"}, - {"evmos1m75jazrlljw5j9hd226q5jcnkjgkcryv3dqh95", "45882504083542867968"}, - {"evmos1m7uhjguplyxscw3s2uv5r8rda997pvvsma9d2s", "45882504083542867968"}, - {"evmos1m8khq3v3ldte6rayfu7jdplcgf3prjhwylhfwy", "45882504083542867968"}, - {"evmos1m8syyg0ugfxlyyfyp36npn33tdfrpatgm2u4uh", "259637619958387769344"}, - {"evmos1m8wsgcn5y5elnsxc0e4w8mda7f3stx09r3dcue", "178687096911100770304"}, - {"evmos1m959y2gzjeycvlujvuf9g0vjl6mlq4qas0lu3n", "75223895647717610362"}, - {"evmos1mc4pjtk6yuwxgue3v0q029end2la2daywxazh6", "1100000000000000"}, - {"evmos1mc7ausakt6k2qvdwutf73cylsgtxy6t5dfrmaa", "1100000000000000"}, - {"evmos1mdc2va855zu5s5n37k3yt3ag7ur06nkn9etykq", "389455929937581621248"}, - {"evmos1mds366pvkxkh9l96ek2y4znwycr2d52c4wkv8n", "129819309979193884672"}, - {"evmos1me29wgkpf6593f4ahxk4klwc8j30wq7g7yrwtq", "101000000000000000"}, - {"evmos1me3al39hmvmfsuyl8h5hvuzxla3cx2s9k8vl6f", "101839708013976870912"}, - {"evmos1meemzk2zmucsc2gsyts4ev025cauznvsl43ljv", "1100000000000000"}, - {"evmos1mf7m0zr59zgmq3hdsuck58pch98rv2cp4w8lez", "63615642189369395712"}, - {"evmos1mfglq0yjdkn6mwf40t9fm2uzx2a2k7emfvmpzw", "1001000000000000000"}, - {"evmos1mgndenptffvy7hkst4zxh69ytlkxd4yyn6cgfl", "45882504083542867968"}, - {"evmos1mh8akgmqzvv4qqj8pfq04q0gjrrmt2wt66udyd", "1100000000000000"}, - {"evmos1mhcva0pmyk2zq2qrwyehky0kl27amuhscnrj6u", "1763581660408326912"}, - {"evmos1mhh5es0j4hy0np5mrt4cry3cztww6shg38whdf", "1100000000000000"}, - {"evmos1mhzyewu9apygrzl808v5ap34rdpc4rett93qfg", "1100000000000000"}, - {"evmos1mj5l70dgc0j96l8fd32fasqsu9fw0dyvuscnpe", "1100000000000000"}, - {"evmos1mkjkcjnz2anymp7xkhk0q83nc6hhfh9e78ef52", "1001000000000000000"}, - {"evmos1mkn87kumf4hpx0mpe6uhvvm8g3l9uqcxdk0d79", "2000000000000000"}, - {"evmos1mlcqcfje3jm5aznz7fkg54zwcl4vyydngjnt7y", "301000000000000000"}, - {"evmos1mm4mmkyhrpaa27txwzyfr9hnvpl78tvnthncs9", "1100000000000000"}, - {"evmos1mm62prpa83z8n78rp838fyezu845l6dpzpy0ag", "1100000000000000"}, - {"evmos1mn58aagq9smunhcpc8jrlzsmmp5m5l3p6nr6le", "2000000000000000"}, - {"evmos1mnt9lx5vvsncfd76vlp7c05wa50uxfwxqqqzr7", "2001000000000000000"}, - {"evmos1mp859djyh6wq59xqe2rskqlrv870dkqrg7qqpa", "45882504083542867968"}, - {"evmos1mqycqdyd4h2sy55eryfgl95shytjvhf5u9wlsx", "1100000000000000"}, - {"evmos1mr4x38saylfezgq4c0k3unn8mcuwsqr07vj6v3", "1001000000000000000"}, - {"evmos1mscpphq52n3xun0v8a74ujng2s6zadqjhew7qr", "111915407860868005888"}, - {"evmos1msmhzsgtgaqzv4l6g8acr8eg6kz8lz3w30untu", "61000000000000000"}, - {"evmos1mu0524d7hak99h2thhp2ff7dssuh3ywuumcd53", "91766008167085735936"}, - {"evmos1mufyypfadttted8t5vqy6h26ywwnyeup4wssyk", "55958203930434002944"}, - {"evmos1muj6nqu638cpuanlmlunf6n4mep7vug7m9xyj2", "91766008167085735936"}, - {"evmos1muk85009jgec87l7ea4ps00er5ww8pjpxnrme8", "45882504083542867968"}, - {"evmos1mvwgjfld0e5y4cz420gh3g8n9z76jwlexw3x34", "1100000000000000"}, - {"evmos1mw2r8j7j57m8d8lkurd9xxj5vcuhyd8hpx3yqk", "82687027256492155057"}, - {"evmos1mw8a0fcrsytlwdcyf6g4d673f68wy77h03c0d0", "91766008167085735936"}, - {"evmos1mwua24cez5ql6t9d7k5lmqyytutz6gxad6p7yd", "41000000000000000"}, - {"evmos1my02afuem5cxlh02sh2j86hqw3ccm52uw4kdle", "20117539634150713396"}, - {"evmos1mydns0ru5q9zt2k555glxhtlezf2h2l4v0z4xq", "3041301424887866880"}, - {"evmos1myt6hg24jxzyd50ryujtey8pszttlxk6hyrjvn", "4818361630463393792"}, - {"evmos1mz2vhtjy8n976e25rer3hv4pmcxc5gl3c4yhwf", "101000000000000000"}, - {"evmos1mzvnphp47c40r6nlcg6f9qn5vl7ckehf6866nm", "1100000000000000"}, - {"evmos1n2frrusafp2s9qk87zue207w6w2rymyfmaamh0", "45882504083542867968"}, - {"evmos1n2uex55d27pjnyurmy9uuxs9m5tuxy3n5t2jj6", "1763581660408326912"}, - {"evmos1n34r6t92mq2ljed6rkxqfcz2568w5f8gdja8cw", "83935805895651016704"}, - {"evmos1n36hclrrv2x6fk45cg4hp9hgpnvj8phq4hqrhv", "17348447260725752214"}, - {"evmos1n3gwc2vhhmp7xtwpvuwter53tkpwn2zvm5sdat", "1100000000000000"}, - {"evmos1n4qqavgxy0f5enk8425lcdreyxrxh8yxeweqgc", "1001000000000000000"}, - {"evmos1n5cqzjflrwv26wpxslr5axwa7x53ev4xyc83dr", "91766008167085735936"}, - {"evmos1n6kqrlmdhenstppxuaemczplnex0cyk9q0stfc", "111915407860868005888"}, - {"evmos1n6txxfmpr2txuym0v5uhj9n2jp3sn8y3j0l9eu", "45882504083542867968"}, - {"evmos1n6v6wsm9slezjnrxad8jxzftzyd7je3g35gvhl", "45882504083542867968"}, - {"evmos1n6ww9m8ecfa00eagmt6quh2pk0uvjs72sw5558", "45882504083542867968"}, - {"evmos1n805ammxanykkp000u4ehmz88a4j5mgew9rm37", "203680416027953741824"}, - {"evmos1n8sxpcswe22la5jwe7efz9suhqrfhl59ackn4v", "64860961267499040768"}, - {"evmos1n9ant6afmk6ln9ym0nehzaae4r923f2tm907f8", "23276538903254522690"}, - {"evmos1ncv6h64ge0tz0j53x9kva686vlgaaklvkh99qy", "203680416027953741824"}, - {"evmos1nczs9w73z4frhwj6yzjqxyh94c2mt2n07r5tfk", "15517501193469650010"}, - {"evmos1nd0jaj0z5t70eanwwaqzetcrl8ggl5d8vkzy7u", "111915407860868005888"}, - {"evmos1nej82s9t60pd6zxcl7jzj5e9ulfty22zf9z6yj", "301000000000000000"}, - {"evmos1neny35qgdyfm6dsf09m084muh0qnf58aq33c2w", "1100000000000000"}, - {"evmos1nezugwx7fwu5lh28lhrl4rg89nee43amg9z6j9", "147723212097519738880"}, - {"evmos1nf7ysaj73qfq4hm586zy6np2h9a2vkpzu7cxzr", "91766008167085735936"}, - {"evmos1nfr4jrjafk5l5n9pznhm9swy6rkh098yetyh08", "91766008167085735936"}, - {"evmos1ng0f7sma6knmz4t2kxydzlesxynfc5t0gkm85y", "1100000000000000"}, - {"evmos1ngngkdcdxkr6msfpq7s7q05zwc0pzmtz0d9x7n", "201000000000000000"}, - {"evmos1nh0dx9c7f8wtshpejayxpppmudn6q7kxz9na9d", "45882504083542867968"}, - {"evmos1nhr0sc57cwh26zyghwm5fuykmqfmtzlmaw7m2w", "45882504083542867968"}, - {"evmos1nhrzhehzmve8r76f8nvj9ttggg583f0z6eqzmn", "1100000000000000"}, - {"evmos1njqpkw64mkkm3vc9vsjafkxrzu7fv4adqykdg5", "1968499999433000"}, - {"evmos1njxcc3v8e64kp7y4d2a0lvaaelkzca4gdmw36f", "1422500000000000"}, - {"evmos1njxhwn5dtmlws9vwl0mrth7qcs5nassqwt0hlh", "1001000000000000000"}, - {"evmos1nkakczk03pud3jtfav4qpr49jt0j70afxdq28u", "1001000000000000000"}, - {"evmos1nkedheq97ne3g0zk5ak6t8gqpz3hsmhd753v0v", "91766008167085735936"}, - {"evmos1nkjq78wz80whewg05ku7f4pjxnp8035p3jje62", "49408667404359521792"}, - {"evmos1nkrsk4e8jlfaprmn282zulhfvw00gagy0l8f4t", "287616221923604791296"}, - {"evmos1nkx9ptu73yyrw9gzzy8pj2va64y0ch4rd54jdf", "1763581660408326912"}, - {"evmos1nlf7h3egnq5qlkjy0qhxc9wnay3rg2dllcqnkh", "61000000000000000"}, - {"evmos1nljpy8m8fcvhn3e6t97axqn0x3vgsz57tdsvac", "100968857913382604"}, - {"evmos1nlqvwr4kackmn3yahsnk8kp82q7mvtwy4ytmtp", "61000000000000000"}, - {"evmos1nlvjduypwuvq2ll2w28pxql5y4ajl7qwmv9a0k", "25853596469448713144"}, - {"evmos1nlvw7l3cvl5k9dqph3egjfex20lvzyj9jhm9uk", "1001000000000000000"}, - {"evmos1nm99fk70pvmthvygdhagtlccjy5fg8watq55pc", "1100000000000000"}, - {"evmos1nmnmdsc69f7ekange3md2m4228qkl995wc22kx", "55958203930434002944"}, - {"evmos1nmth49ksug5ucxw4827q0l54tj75rleywr9mnp", "259637619958387769344"}, - {"evmos1nq4lxjwxc360ucmak4vd40fw600n4aa5me99wc", "203680416027953741824"}, - {"evmos1nrvpas0yfs73v56yj7wkhkpal9ghfgry9yg469", "45882504083542867968"}, - {"evmos1ns3v88fpjjcllc24vl5xgdt97l0uf2w308tmua", "1100000000000000"}, - {"evmos1nsu72zasu4grnw677d7vsfzj85ag46xp7dda2w", "1100000000000000"}, - {"evmos1ntd65w5sz6f6uud478kgt96hfxad4ssvc6gc2d", "1100000000000000"}, - {"evmos1nthsljqhfta9pt5mtqv2z7v0n3m5wfy7q8gf68", "157796911944410873856"}, - {"evmos1ntkxexpzwxhvegyzvlfjq3z4v02r8cwa7n5387", "7643720263757497272"}, - {"evmos1ntzdxeslvfksqml7kzwg6kk3psfxlrrys78ht5", "1401000000000000000"}, - {"evmos1nv2sd5eamcr2jvmdhk7w8h5v7n53gsrkasqlej", "6000000000000000"}, - {"evmos1nv9zvayaldkylr5dvv7n2kn6lap3ngz5nf49qp", "1100000000000000"}, - {"evmos1nvwl269uhef2h66vn63qj5l5v5vyj9kyzs609f", "1100000000000000"}, - {"evmos1nw4vk2mjx6vv328l8zjyz6y5z7nzfx8q5cq5cm", "1100000000000000"}, - {"evmos1nweuxg5s8zpejwafzxatrjjgkkz5v0jd0lyujz", "11000000000000000"}, - {"evmos1nwy5d23wzwq57f040gad0pvhj4ee3nlk3aruf5", "1100000000000000"}, - {"evmos1nxvk5659sdx78cacue3aam7u67zt2c0svggvfp", "1100000000000000"}, - {"evmos1nxwcne29ez8du5j4gkwvpltk0w77w0sue32gjd", "27978601965217001472"}, - {"evmos1ny6chtjuf26jzz3fctlpajmv72fzu3a8qcjc6n", "11000000000000000"}, - {"evmos1nyxr6yphaq720zkgmr8n2qzfv3gq06eax9dfcf", "91766008167085735936"}, - {"evmos1nzfnvrz9aad9rsan3h9alcqrnjq06mmqvut2m4", "61000000000000000"}, - {"evmos1p2hale5eq99h8ke2acyzsujfsqpm0wt9m9akwj", "1100000000000000"}, - {"evmos1p2hdj27yymh548ya89gutjt4nxt26ed2vqac5v", "53426176517915869696"}, - {"evmos1p2rgp0n3n77mmxw8fas0s8p48tq69lz0hte995", "5560109558405711872"}, - {"evmos1p3a4fk6yyau4wnp9pyl2tzhq4j0299d7ml77px", "91766008167085735936"}, - {"evmos1p3rpkr38ucz79sqhvsjwr57n6lxage3krwy92p", "4770682965747594496"}, - {"evmos1p4dlkc7c4n5hulq8x7e6ac92y0r2ve49ey73a8", "1100000000000000"}, - {"evmos1p5p9d7r26h9ztaahxt9mxqja9q9hjx5tcgheg4", "2001000000000000000"}, - {"evmos1p5zefnrt2ud797rwea8p2ljkwjpqad7a8knmwe", "14038781828005726976"}, - {"evmos1p6eqxjs32zmm2ducl9pyswp9h3g79hwv658zfc", "1763581660408326912"}, - {"evmos1p6f4ghk66zag3p9uaecxrrpa34xh84d57rj2mp", "1100000000000000"}, - {"evmos1p6rz3ul8sc795uadsjv6t3j40xrl66fk2cg240", "1100000000000000"}, - {"evmos1p6vnau8q36hafxjee2722lal7dgyuqu8em9tv6", "315594823888821747712"}, - {"evmos1p756reuyrl8pan7fnjkmk5emgptghqcq2h8d5e", "1100000000000000"}, - {"evmos1p8ruztqfzf5xuyy8z6de8vm3p5yesdyv0ruvva", "109771000000000000000"}, - {"evmos1p922778gplluxgq3lr0qjpah3x2dy3sw7qfy9g", "101839708013976870912"}, - {"evmos1p93mvlszx2gdmyntl50mwq43tgjafjq2mep5fv", "2489884975374986648"}, - {"evmos1p9amsut7c69rswfdd86twxrgcld5j6nmjj94ad", "91766008167085735936"}, - {"evmos1pav6u6s24smu09ngjxpjf8q6xzvhcn0758e0ak", "50550371390251374052"}, - {"evmos1pc6ddg5rkklnd93jacy08utdy46wtu0dtsn5wp", "11890591958024599694"}, - {"evmos1pcmgs27m62hpuhvld6l0q49nglgyu6nh3lv3wy", "1100000000000000"}, - {"evmos1pcsd04enccqt9wv8gkyf6txwcd9eg7th7p2hm0", "1763581660408326912"}, - {"evmos1pd5duyu67yac9a3ey79lce8dqcevqnf3ath60z", "1100000000000000"}, - {"evmos1pdcn29attdzapt9kdf52vlcgcxv6xntu4ulkgy", "1100000000000000"}, - {"evmos1pdw2vj9m9h0e2gpjfydtvx8qx5vukdyh3pjyv4", "1100000000000000"}, - {"evmos1pepxx5xwexantkl4tlgqcq40wncxs7ednhx2fr", "1100000000000000"}, - {"evmos1pepy0v6g5shyjl5he4c2wwt65yvhee9q2an9xf", "54957846265043334912"}, - {"evmos1pet6lkufvvgrjmp3qsy459uw0n6tslyzgf7e7d", "19446998241464704000"}, - {"evmos1peyvndc73ja7hx50r4me66kree2qxg3lw0zu8t", "101000000000000000"}, - {"evmos1pfwq2uvftx8tzjceq6x4rxsj0h30yth6gkv933", "44433466690942241942"}, - {"evmos1pgaktl7yygm308z6ltsnj2yz4fn62mxu55pv2t", "1250000000000000"}, - {"evmos1phj23wwz6udwhylfajxc0zj9gh6mw4vc8t7sy9", "87850407031368376320"}, - {"evmos1phnd80hs6hdagzavhh3dpaurdcfs39a0ckvake", "88032844140952166062"}, - {"evmos1pht42dwce7ps7wg5f64yatdrhmnug7yrqmw5j4", "29902112305761776482"}, - {"evmos1pjqd3lg8g9h6gtg592rhxjv0zx0x34dshxyurw", "2653186740235152398"}, - {"evmos1pk0clqwpjkjrudeyd8mvppu885wk4dqpzutpwh", "1100000000000000"}, - {"evmos1pkyknkm5n73zeqg8luu8rcct9k3ydxzv2wfsq6", "12488406259001528320"}, - {"evmos1pl7cgne7hmzep5fucqjenk3rc5z3j9cda925e8", "111915407860868005888"}, - {"evmos1plfc2y6mnd9n7q8w2p02hfn083z7l57jhfl6um", "11000000000000000"}, - {"evmos1pllqe4nrtfnngpe7m2faj6f7qlv7nqk582ct9h", "1100000000000000"}, - {"evmos1pn2rdejctl8cc792us7mxts36t3hz80v32lu43", "5001000000000000000"}, - {"evmos1pn6pe56084j8xge88xmjnd3v20vtkrxaw7qa5g", "698774235791907405"}, - {"evmos1pnahwdclc0gxks7xkjnm7mr5s5a3zhgp7w93gh", "1001000000000000000"}, - {"evmos1pncjum2kdw877fm33y40tekl6can2j7ezcz6dd", "1100000000000000"}, - {"evmos1pnw5yyg9yherlkkvr5y8unxhdr7n7wmgw28u7v", "147723212097519738880"}, - {"evmos1ppal27h7v5uyhvwrhsxrcsmmkk5shd68ygzkt7", "1100000000000000"}, - {"evmos1ppcexw8knljrgk3j829jurpyh5nvcachc389jw", "1100000000000000"}, - {"evmos1pq9dh6cp366qq56n9seymftu5xhh8uq72r4p9h", "259637619958387769344"}, - {"evmos1pqj3x5u32zlflxk2wzd9l9qf93e0wne6kfd4y0", "45882504083542867968"}, - {"evmos1pqwh69x33v5p9d524s7qvcfruggvyfjwgarss5", "20030273093000206960"}, - {"evmos1prlz68nk2mycdnh386xt4y5s9zg9qjgl02937w", "37374301684025517621"}, - {"evmos1prpzxqtxkz56d8ur3yq3qsmwg4ge4vssunttyt", "111915407860868005888"}, - {"evmos1prqwuv72a08v3yec7lse3wn80ld44e42fu7vk6", "83935805895651016704"}, - {"evmos1ptwxhdryupfym3egh8t6gt07kfx98guk0y7sp9", "55958203930434002944"}, - {"evmos1puq4av4sa6whnuyws69gn6c7chjy4ekhvuwzgs", "171786212927019384832"}, - {"evmos1pve8r4al2880c7phd9s029s4jrah33fx2fc7s9", "45882504083542867968"}, - {"evmos1pwfgfm57w5sw0svxgera8qyefkg9jaluwu8sv6", "19937418591700906113"}, - {"evmos1pwvldu85jvndzw2h04l23v9ks9wg6qgttnsnmr", "1100000000000000"}, - {"evmos1px044vh9jesa9pynn447ycsl7kw5unvxev60sz", "1100000000000000"}, - {"evmos1pxlnp6fs4hkpcaml598z6vn4wmjj5te47nn5g7", "1763581660408326912"}, - {"evmos1pyfm8p6xvptuuey8u7t9lwxqq52nm9wnzdz66p", "1001000000000000000"}, - {"evmos1pyjpgndh34qzqjxwuqfs9gnnd68rxahk8l0zym", "91766008167085735936"}, - {"evmos1pytz2c9eckkeh82utww69cy3s8uaeuau8e6rf4", "91766008167085735936"}, - {"evmos1pzh6wtmrstqmqf3mr644etaf5gexwju2ahvcxn", "301000000000000000"}, - {"evmos1pzm6xu0w62sat6pfsw0lw8junxpkazhd53k5l9", "27978601965217001472"}, - {"evmos1pztgrpqu2q4tp7d5fwwk9rnd0esyg6ghn4aqqc", "1763581660408326912"}, - {"evmos1pzunc9mys4lkr02nncdsg40we93qhj7nquxupt", "91766008167085735936"}, - {"evmos1q22ejry7hcxalrklz8x655yp26l9dumqahkxy3", "91766008167085735936"}, - {"evmos1q2ext5kww4hgxkcmlu57ngr7wlgzfz8nr0w6vl", "5288744981224981504"}, - {"evmos1q2mxhc0q7amzavq265r6j8pfsqyvnqaa5ly0gx", "61000000000000000"}, - {"evmos1q36lqgzk7g2u5tt9qyzvq3lapyatkuxxd3k4kw", "1100000000000000"}, - {"evmos1q3stdnuuq6ql4xky6zanrs5pu2hg2wl2tzx9lv", "45882504083542867968"}, - {"evmos1q3vam20twp3wdlw2v2f6fsmrwghu5cgzrgtz8p", "23214037339654812672"}, - {"evmos1q4ejd0h9gdkhj2fjpgctlu57f8q9am0qtgng2f", "101000000000000000"}, - {"evmos1q5vy4nwsj6ht80xffmvqhdpywlatfwextw9u05", "1100000000000000"}, - {"evmos1q6fe9q3f4y9272e49x8kss2ty725h9469rjr2v", "1100000000000000"}, - {"evmos1q6v2c5lr494wt9rvl8husn67r0gptzv9ts3zuq", "139893009826085027840"}, - {"evmos1q6zwt0hr7wa7re5y2ky8vxvaqmvswds5zfe352", "45882504083542867968"}, - {"evmos1q73f398z4egpsj0fg2u55w34qxxkjzmfnlcurk", "55958203930434002944"}, - {"evmos1q7eevgm0v8e9286wjph76yw9mual2jecm7w98a", "15801363488414053888"}, - {"evmos1q844umx83njctcz58dk3luxxvvd5pf36g0rmlm", "143807610961802395648"}, - {"evmos1q8jm4ygh8796fq606vrrh7xh0q3n0rremr8akx", "1100000000000000"}, - {"evmos1q8m03jvdywr77nef4d2lakvnau9k2ca9cjvyke", "26661704354552325386"}, - {"evmos1q8mkrqzujz7g40a02pq8tt7msls7thqg2um5td", "101000000000000000"}, - {"evmos1q8rr39j88as8kttm96qzxeufv677qdx8dl3c7w", "19825487153828457232"}, - {"evmos1qad3fr9h6g4zruktwusxv7yl6qyjyekpx8e28n", "1100000000000000"}, - {"evmos1qausja633dw3nymnmmqxzl8a9fppt5tmfcu7sm", "27978601965217001472"}, - {"evmos1qaw2g3pe05ul69lm2d607adu5eq0k867unuwwz", "1763581660408326912"}, - {"evmos1qcn4nh6dkjjdh4ephuwd3npr58s8270kccdeak", "101000000000000000"}, - {"evmos1qcqp00scnwryyhcrhrrf4g4rhfaalxh2seg0ud", "2999127516759897600"}, - {"evmos1qcvz08dyk4r7wypv9ry3qjr7vl6kr5w4y5jaxk", "203680416027953741824"}, - {"evmos1qee2rvxr4a3qem6jv2ulxpwy89a37z64vtjxte", "1100000000000000"}, - {"evmos1qetknzqrt7kueqarerw6062msmjdmmncw5ug6t", "167872611791302033408"}, - {"evmos1qeuf76m4rvrk43qyhjpv90grxm735y36yzyx2s", "22138930097342970541"}, - {"evmos1qfafad07rw7fpr8gpct2f69r42px4cmhpkyprv", "45882504083542867968"}, - {"evmos1qg4vq8k02jc70x7chhvp43hnnwdlt09pyskxdq", "45882504083542867968"}, - {"evmos1qg6kp72edc3l0llzcxurm8suhcyemyuwhx95qd", "1763581660408326912"}, - {"evmos1qggcs5x7cu0xsdry24ms5k5zpka63vtsyf4fk2", "37211747387204449293"}, - {"evmos1qgz9h8cxjqrhrh0zhvetsspvay8h0v9e3x9ux8", "1100000000000000"}, - {"evmos1qjajydgn4almcagvxwwqwerlq6wlmwlc4ggvvn", "7341409621390545866"}, - {"evmos1qjtkn6zsd2ls50cvrvnceuej8rykzgh626575n", "2000000000000000"}, - {"evmos1qk4reupu5swvjxtdwmxdlutgke6xsj9jjj8vhl", "45882504083542867968"}, - {"evmos1qkz3g6yzv6wt8dfethyrct0wxlpg8ewfg4j4fn", "1100000000000000"}, - {"evmos1ql88y5knymnpeu6rq8379683jgyxc5mztydlyy", "1100000000000000"}, - {"evmos1ql8ya840ma8swpn6waedmxt5qmh97l678ffrq5", "1763581660408326912"}, - {"evmos1ql9mpu55nf2uqtw8jd4tddgg3hfd0yuttdlcsa", "21000000000000000"}, - {"evmos1qn8sr2hzmktlecusdtxj9hwj0upnm0jf2h4wev", "100581024300132492045"}, - {"evmos1qp4nt8rkavfd25pqw0eduzdmrrp6qz74g3xew7", "4880281612404731904"}, - {"evmos1qp9an7skkwehea0yvxd5x359atx9jugqjm2ldg", "2000000000000000"}, - {"evmos1qpe920w3m2ntkptts254tgj4f5l5xkmmx2vau9", "9451000000000000000"}, - {"evmos1qpyjgfaghzx0yukf05j6rcwzppr8u5nv6wjy78", "1000003193661462"}, - {"evmos1qq376wrhak9mzhjtftck3vt67880t5fuxt67hm", "55957203930434002944"}, - {"evmos1qq7pf2ewyh49dehpnsa2afd8gsac6z6s7crr3n", "1001686630293505"}, - {"evmos1qq8946r7c8xzfkln7cvk6pe0ezpxgvl35hm45c", "1100000000000000"}, - {"evmos1qqe2c5m909426myqsu93ejy3w7phz65h2kwvde", "1001689824732775"}, - {"evmos1qqqqqqqqsyg9ll2rjffqm5fuf3cdjhge6z00jy", "1001702606381564"}, - {"evmos1qqtagkqvnqmkp47n2h8v4k4h2mc3nlfcjz8qvl", "1001696214778613"}, - {"evmos1qqtymw728pd4mtfqjn33kk4x2klqc659276t3n", "1001696214778613"}, - {"evmos1qrs5h6sh7n54r7mft3f2v6e598d9tgghjqx9tu", "1091251819307571600"}, - {"evmos1qssqdml8gdk3we9jgqlhpwp5laezs9ake53jxx", "32754899695456394496"}, - {"evmos1qsyld8re4r6s2hn5yx6n4uu7x3e4lw57yln97g", "1100000000000000"}, - {"evmos1qt70vljdwnrgmzw72p7v2kqdtrvwhrvr2auv6s", "129818309979193884672"}, - {"evmos1qtcaa72w2qrr5v4vmf97sxy0rvahhhx98y8wkz", "59582174715046614016"}, - {"evmos1qu72hklsk8wh4uhc6rl043n7nlurcgt6z9r8gv", "201000000000000000"}, - {"evmos1quuqx8wex2wug3fwyp5k4lxjxnuv7affny6sgh", "1100000000000000"}, - {"evmos1qvls22zgxh0rsfvc5f6qzcu5nfmyjefv2dsfwc", "111915407860868005888"}, - {"evmos1qvmy7a8wxnhcjkn9jcx2ga0efdj9hgq7cxss3k", "45882504083542867968"}, - {"evmos1qvnln406t4er9cztt0t6f25qxl50tjzdqxchv8", "45882504083542867968"}, - {"evmos1qvnuyntwqmhl06wsy6zprm5n7ug9fufjf2dder", "118774181924222709504"}, - {"evmos1qwcq04nmwx2mj00cp78pamxpg754tdwclcnpr0", "1100000000000000"}, - {"evmos1qwf279aegc43uswk33x9n00e4q5f55keq7zkad", "4604689509784046147"}, - {"evmos1qwqzf6xt8vw29sx3cvdefck77w0qx8j44uzyz2", "45882504083542867968"}, - {"evmos1qxh8dfj72vymqnqamatdn5e8zmun5ggxh3uh35", "259637619958387769344"}, - {"evmos1qxuq07ucwz4lpra3z66mqr0a4ucwyhyjg7pgxz", "61933872633840044065"}, - {"evmos1qxwj20e9r2yp33ktny8r0e8unz9w0n5apqzz4n", "1100000000000000"}, - {"evmos1qya2stl0xfrgl80xgyfpg4xlkltjz6x4wzh8ms", "125101000000000000000"}, - {"evmos1r45sz9ad4k03988jsrr09x9tnxz6avtll0zcjp", "91766008167085735936"}, - {"evmos1r5dgsv0aka0dnuadvq9362lucd965jn320gne0", "1100000000000000"}, - {"evmos1r68gcy0x0s8jpnsfrh7y4cqwq7n25t74s7xdkp", "101839708013976870912"}, - {"evmos1r6gwwszv3j3nx0vxhjqatpjyn2v627g6mvhgqk", "22131000000000000000"}, - {"evmos1r6w0xwdxdzjf8at3y6alhulh00e0yn7jv48u5v", "1100000000000000"}, - {"evmos1r8z2h4mqgmmq4plas78kf9u8f7dvxrpgsq5js3", "55958203930434002944"}, - {"evmos1r9w06kfugw2q2qnvejaaeuu5hsfpker4q8syvu", "1100000000000000"}, - {"evmos1r9xwzwhgdj0khym2fehgk236cjeurl7vcm8mgl", "1100000000000000"}, - {"evmos1ra03wctunalswfk6zxsrejc630gcl7gmfrjg4a", "91766008167085735936"}, - {"evmos1ra58luq056cvu7p9a8usae8stddcanhxkeu2c5", "1100000000000000"}, - {"evmos1ral2g0fg8580jphwjtw74kyr4rc83j7fz5nrxg", "501000000000000000"}, - {"evmos1rc974c88hdhhhuj498y6aya0wf2c3s84g6lrjn", "1100000000000000"}, - {"evmos1rce9njhev7wgds4shqyyxtry7ve4nw4du9q20k", "1010000000000000"}, - {"evmos1rchqnms04hr0cdlz27l27u6cttj63esrj6xv9g", "73861106048759869440"}, - {"evmos1rdrxhqy8twu3fj6g65fhpeq3gqlplcx4mquptk", "1100000000000000"}, - {"evmos1rdv65rxwuver6rrls5aezf8acsg6a37905l0mn", "600000000000000000"}, - {"evmos1rdxmy9hfyy64wv4mzk2t97yrzrdr9nyunurj4c", "12614614164533301248"}, - {"evmos1rej5x6kfzxc34xzcdz9k8hyzht9hw99ry977gd", "1763581660408326912"}, - {"evmos1rf58lk66c7cscl5j4jje5gz7e74qnu8q9ldtd2", "1100000000000000"}, - {"evmos1rg37almn20z7dx26d4mf2leguq8rvg8z5jxd67", "5557697216848218368"}, - {"evmos1rg6gn852ph2jme6s29gjv72d9svnlpr4lqv5yc", "10437645226557574718"}, - {"evmos1rgp8zh8kpuz5fhhakem28llwuugtqsg4zc235s", "51000000000000000"}, - {"evmos1rgsdrrp4dcn0xnws07gfun8kks4xn0kje6yd4p", "11000000000000000"}, - {"evmos1rgsk3fffwedakrkdzvf65h9zjsvhp7j0sa7yxp", "125101000000000000000"}, - {"evmos1rh3wvgsa4k6e3ugegtj22vkvwf5qgtz8n3jepq", "91766008167085735936"}, - {"evmos1rhrc7n0ca9sh6r640dydkyjfa5a8v0v2hmqd8s", "1100000000000000"}, - {"evmos1rjkn4meym5eagvup30jp4xrd3smwtgh890f8dg", "1050000000000000"}, - {"evmos1rk30yzpc28a00xas2nlysvsxek7z9hej7pqge7", "1100000000000000"}, - {"evmos1rkldxdtwskjtzc3thpwlgx0p3q236vu26380sa", "1060319770000000000"}, - {"evmos1rkze8yh3rpdjcem3r4tv87h99danz8c7ff9wlm", "44192586564167670552"}, - {"evmos1rlu0u3y52tz4e78k72z443e8s3mqgaxzg5ycyk", "54413635288276063232"}, - {"evmos1rm84zst5rtjqxdh6w08ash8chvyvpr6kd2ggyx", "61000000000000000"}, - {"evmos1rmaatcegxky5shpcs4j5jsr7gplc8ryl2yz8n7", "3918230495582281728"}, - {"evmos1rmn9w5jh73tg24z5dhqxn7gq6zfn5qduntmkup", "55957203930434002944"}, - {"evmos1rn4g78ggmsga2q9yt40gzvr9ckgruzvc3jy9zg", "1100000000000000"}, - {"evmos1rnlnk76wmz6cae6k47922nx0m73e9zarhyk5nv", "11000000000000000"}, - {"evmos1rnqwu3da6yx4rl8060ns477p5gt538rtxw8fz6", "301000000000000000"}, - {"evmos1rnrfaps8yruynrg4xpuqlf40vsxej9h3dcfyqm", "1100000000000000"}, - {"evmos1rp7ncx6c4z80sd6tlu5vnxyn4v66z95sgl38ue", "61000000000000000"}, - {"evmos1rpgzpaa7mk5704cxyf6a7v5hes4mc6exdw4kkq", "83936805895651016704"}, - {"evmos1rpsnrxm3n29v8jfez5sxd6lw6qaw7jsz54vxrh", "1100000000000000"}, - {"evmos1rqddjg3ccyg58gawakj2cxsjutsw3zsqv2amle", "101000000000000000"}, - {"evmos1rqgzcca6g5f2un4nm3zvskcusnxq6nw0r3np8h", "27978601965217001472"}, - {"evmos1rqlej06nkzla5umgsjt8n4055v0vvzv4mgza2y", "47646085743951194880"}, - {"evmos1rqsnk6xzxrghghcswydr2rf9h5jk9pfm9jnyda", "1100000000000000"}, - {"evmos1rrq9tl87mmsh99zpqr44llnv2pv22r3ru4wlny", "79589576565445982976"}, - {"evmos1rrrwvlufx0cnmgqmczdtf8n6ch4g83aylmdcs5", "73861106048759869440"}, - {"evmos1rse08e3r42qegcc8uhw7gjm2sjznzg6z6j40tn", "55958203930434002944"}, - {"evmos1rtftvyhc67sfzxd0rc3a0ahe9umf6m9pn03rxs", "106788385920111059352"}, - {"evmos1rtyqsje9pczskzxfsld4frwg2a4uu6kxaa24f7", "1100000000000000"}, - {"evmos1ruk8u7dl6jkxca40gxsg8wfhwwukxyyvk2upy5", "1100000000000000"}, - {"evmos1run67zad3gk8cw8x3a2gw9hy4sqr5tch8x9w6l", "183509000000000000000"}, - {"evmos1rvp2netkgxeeszzapezflmd7rur6z9gy938cje", "1763581660408326912"}, - {"evmos1rvvhnafscz5nc6840aqje9alpl27dyzxp53pvw", "1038461538461427"}, - {"evmos1rwv23494f2fwdyf3r5v9cwd49cfu72c7tnhfr6", "1100000000000000"}, - {"evmos1rwxnmg5290xlh402n95su9xqhxmm38lj2e7q6q", "501000000000000000"}, - {"evmos1rx25d2lp9sn8jk90nk088rlqmnp7vqu4jcgghe", "101000000000000000"}, - {"evmos1rx2z5ye5zzvwfn6tzue6h6v7t20pv5rn9qs0uh", "1145822871754935235"}, - {"evmos1rxk5zw7276yek44ag4dteyuw9a2xa6qualw5km", "111915407860868005888"}, - {"evmos1rzj089gt8hq6qd9p8elp7knl0zslv0szlg9a9z", "1100000000000000"}, - {"evmos1rztefn7kv9jj7cmcpx3d3fm5upnzwc3s8gkyyy", "167872611791302033408"}, - {"evmos1s27zyjjlye0cdvctxr0qzkfyfpawn2jj2wjkns", "259637619958387769344"}, - {"evmos1s30pmshzhzw9rsnveuknteaua48470r8gm7zzc", "27978601965217001472"}, - {"evmos1s369k5x0yh2yacn6wxwan3evk7g8fryxzxpmql", "2179769409713486735"}, - {"evmos1s3708n6hj0t0hp2nx9av8ctkwrjsqhpt8gvv62", "1100000000000000"}, - {"evmos1s3nc9tx87gpmsuy54j5y2cl6wxj09jnppq3ned", "1100000000000000"}, - {"evmos1s3q985fsl5qa0rfekky6f06vw3j9az8dsq2dq6", "1763581660408326912"}, - {"evmos1s3sz9c97p2g9es32y9t8cpxtew9yqwupaamcpy", "390941706872820838759"}, - {"evmos1s3zjqt70zddwuy2pxpheqgd7gf67yurm2nj75q", "1100000000000000"}, - {"evmos1s4mm00d99xjqgx0xj757y0pt3nzqnl8ens3ew5", "1100000000000000"}, - {"evmos1s4zjj8w7sm6qrwelqddj9044rymvymnlcj2q63", "1100000000000000"}, - {"evmos1s5eh089zcnj2xz5lt8ktnu0daa0yfyssjleqmr", "1100000000000000"}, - {"evmos1s5syzkusyf7egqgfj9mav5qtwvyxl94s5994pd", "55958203930434002944"}, - {"evmos1s873tpwszsuph876utd2fzvlphqx55dfd0t43q", "25522100586818602528"}, - {"evmos1s8fazzsatjp0zelzg4uje9394wslyne86mfcer", "305520124041930620928"}, - {"evmos1s8ynavy80lcchx3fu8qs06pv0k7w9ak3vvhjup", "73861106048759869440"}, - {"evmos1s9r23lj9u636yc5sj9ph569x2z2knmu38w5ndh", "1100000000000000"}, - {"evmos1s9tp9q2a07cpk852jlly5zvkuaeytga2a4s6ke", "11830916114326095802"}, - {"evmos1s9vaun96mcu94637czjwuplcrylhy9pxjxg02p", "129818309979193884672"}, - {"evmos1sauffvc2auqwqnklhjzhmvtlak690x7u7k2hfs", "21000000000000000"}, - {"evmos1scqr6w6z60sunz6d56amuwnmr8m40fh4q779qk", "1100000000000000"}, - {"evmos1sd8702a9qas3yt07gmvfn3wqe3tmmymj3hg2q0", "91766008167085735936"}, - {"evmos1sdkl5p0wzejy5a7t334e9ml7dprh8hp2p083yn", "1100000000000000"}, - {"evmos1sdy90khja7kxkdcxnd8dmps20zzxncxtkeyfgm", "265796718669561511936"}, - {"evmos1seelr3g5240t6cgtsnjpr9kljfsdphexw4yhza", "1100000000000000"}, - {"evmos1seqy4z0pfnf3hzxd2sepxa8vtfrads3dqk30j2", "3526163320816653824"}, - {"evmos1sfducwsrt69dezxk47en336cq3n94qvchudx2c", "1763581660408326912"}, - {"evmos1sgtkl53fvgjnscahnpknaf6dxxe6cutvzretkp", "399530629784472748032"}, - {"evmos1shwphmr3t6rfy5nz8ajy7ngqamw46a5k98trhc", "259637619958387769344"}, - {"evmos1shzqjsr5lyvvhlkhzwvvv82u0n3dvueexgk2td", "1100000000000000"}, - {"evmos1sjqaxqupsayax6geqckqatwus9r9wkermh46ep", "27978601965217001472"}, - {"evmos1sjrgqq2ls2guwz0f4w6s5vff06hsyj2p982j7f", "91766008167085735936"}, - {"evmos1slvj4n7lw8s658drxylkyf7enw3492hs0su8rc", "27978601965217001472"}, - {"evmos1sm7cacku55ememm3hpu2nwzmq9jgdwxalhe5sk", "1100000000000000"}, - {"evmos1smeh4shl34sew0epwms9ncytfm09pefh4xxw8p", "1100000000000000"}, - {"evmos1smfdknuml7vwe2602mqx6jrpmecwafn7qahzm3", "1100000000000000"}, - {"evmos1smnd9v9w609mfa3486h0evskrw0u6cygsm0wha", "101000000000000000"}, - {"evmos1smqgvwjx8skaxjh6ww4lfqrvx36kvdwlw8gpd8", "55958203930434002944"}, - {"evmos1sn39v03z32hqm7uu53kyhclcq2ulycyaarvnt3", "101000000000000000"}, - {"evmos1sn6qfu2r7zfkt25kyjkx2kq82477muff52z03e", "73861106048759869440"}, - {"evmos1snqjq4e8mnmfnp5wchnnpfc0wgv8hqc3uvc3cx", "1100000000000000"}, - {"evmos1sntyeysenarm7nmp0y66kuye4v5dy8qhuspzkc", "1100000000000000"}, - {"evmos1snvfap9vrcntx5zlurypyg38hm32mpfpee7xll", "501000000000000000"}, - {"evmos1sq750u8stvtv4hdte84605ewkvgqjkfnyj6q84", "45882504083542867968"}, - {"evmos1sr3he75l692wl9wwhhtnsyt500asq3008svj9v", "45882504083542867968"}, - {"evmos1srq742nw9kcladctmh28rlhfv02l6v39h2acyq", "1100000000000000"}, - {"evmos1ssafaj6mu59pmnz5ztepkxe04ds23zu4fktdcr", "5684307201828358144"}, - {"evmos1ssfu3h8t7mzz0ufryyj7dxrcrz8yfs7tjc3lws", "11000000000000000"}, - {"evmos1sske8xyunc302mx66ljy9t43fmxgkxujk9h9c6", "21000000000000000"}, - {"evmos1ssyfplvzlsmqes29y3uqcdpx8tgnp6tkg8mlqn", "73861106048759869440"}, - {"evmos1su4cfewhvyrm0u8ru6valhptfx5pshw8ucldgx", "10662068510023556305"}, - {"evmos1svvddyq6r3fhed9zjm0vug5jd5tkwuycxhwda6", "2677519610469831027"}, - {"evmos1svxqmmtvv70rey2c3x6gxqr08lc0zqnuze8h80", "92551612136008479868"}, - {"evmos1sw3u8u2x9kjhf54un7h84522a2l7g7k6q5yk73", "101839708013976870912"}, - {"evmos1swes8ptttsgglfx2m9zv6hr3mjltpgrzxyjkx8", "91766008167085735936"}, - {"evmos1sx908ckepxjsk4kxr9r0j8g8hj6kla3qhmzqfc", "1100000000000000"}, - {"evmos1sxk4st7m2v6tg27h7fhsjutwspmjdlfm8kh969", "45882504083542867968"}, - {"evmos1sxk8gsf48avu8p47xm96aa0sctymfhd6eehnpq", "10474114058185516294"}, - {"evmos1sxtwqeyvk9hfz5wzjgrp3fvxq4cxkkpk9x95fn", "1001000000000000000"}, - {"evmos1sxug4mcc8m9rpx2l3ygy4lpruk2khr5c756kqa", "343573425854038770664"}, - {"evmos1sxuqu8mywzclfzmrvmnjkxvyp4nqphfwxymmc8", "1100000000000000"}, - {"evmos1syyq5l5er0xamw5vyvp2wr69667ndx447dfx4n", "201000000000000000"}, - {"evmos1t0kddtj3yftkmkh36gejfsa0xzy9q838u56dv7", "115440571181684659712"}, - {"evmos1t0u62syhm2538erhuz4e7jzej0h4k9c0qq2yyc", "1001000000000000000"}, - {"evmos1t0xe03t796jgl77rxxa6mz407wmt2kmh55xm4s", "1100000000000000"}, - {"evmos1t24wly0e80jdayet3eejf2alnund4fcxwqh2gq", "17694112238831868"}, - {"evmos1t2h0jzu249wwry4tsnpc5hd64qkrg0h48nf6m6", "96802358090531295232"}, - {"evmos1t2q95qnh3zpx688k7p7gsz3ndqytqle697xqv8", "1001000000000000000"}, - {"evmos1t2tpxt9qu3uhjgrfaveatpmqafl26l059avajn", "4001000000000000000"}, - {"evmos1t3cuwudcyaql5jf00h6ue6r4k96a8sj7a7j0vf", "20304025390234726390"}, - {"evmos1t3e9m0me47y6vx7hw3r5yfkpqwg04umppcv89n", "101839708013976870912"}, - {"evmos1t4make4k9zjdnj2qfnqzcm44uphqpge4zydpl2", "21000000000000000"}, - {"evmos1t4v76c6ej760hyx06qtl56x42w8x9m5qg6u98a", "114028835664608449536"}, - {"evmos1t4w5rd64pj982sftclya83mh2qev3py5f3200h", "1100000000000000"}, - {"evmos1t50mmjsmdtnxwse3l2tvwckwhqpywvnjktmuw9", "73861106048759869440"}, - {"evmos1t52zuj4zdmy0mhx47fwwsa9famxt7y0estccey", "1100000000000000"}, - {"evmos1t59c5x3x374lm5gzn7u287ne5npx2hvgccqq6g", "138179909011073916928"}, - {"evmos1t5j79tz6w20lhxpvv0ynlxtznxwe7d3sg84fd2", "1100000000000000"}, - {"evmos1t63eawav09qqpafgkw39el4sxp8s5sc2qwjrve", "115829008996585381888"}, - {"evmos1t67sxq5d298ajh2s5cq3mdvtssfxtl0jp0h3hv", "55957203930434002944"}, - {"evmos1t6akuwv2hxtyf64834zjfu7gtggsw0latjp2f8", "45882504083542867968"}, - {"evmos1t6gqwpm78485dz52tgk7jvuuw2xjs2zxql4x66", "1100000000000000"}, - {"evmos1t6tma84prt8zdyhmc07vz0vjktwksrktdh36je", "201000000000000000"}, - {"evmos1t7ztjh4ugz5lzmhrzdwdavd7w50ts8qm23kyyv", "322171000000000000000"}, - {"evmos1t9kehp2eecx8ne3yk3s8ulpfsaakttane8h5mu", "1763581660408326912"}, - {"evmos1ta6qkr3qk75uh3fq7act4wlr9qzr84uq7k69aq", "101000000000000000"}, - {"evmos1tak8y953d5ca5mhpmksq83z80aplvetr64p5xu", "1301000000000000000"}, - {"evmos1taq8t9l3ryrt52hahttwkmlmrccllnl8588dyt", "1100000000000000"}, - {"evmos1td3jkgc5nvrd5zakk8nq3v3w9m4vyxvprfh5sf", "6157312822891154432"}, - {"evmos1td3lhuuulz3fkn8p77tn5d5zhcpvcyt8pk22kf", "1100000000000000"}, - {"evmos1tdjegr9mpa66mq2873h7fxv9t82m07em0g8qav", "194727464968790810624"}, - {"evmos1tfgrf8hvf6ykrdupyea0mhzxx3upct66lpc6mc", "1010000000000000"}, - {"evmos1tge80lwqfycgxmp340frp8wx6gp03mctewgkzd", "83935805895651016704"}, - {"evmos1thc5pvp8twscyasw8mlwqrc7vs6nc3e2nrawny", "223829815721736011776"}, - {"evmos1tjd9nr808ssjh50cp0p8smcjt0chvvnfdhxutp", "11000000000000000"}, - {"evmos1tjdr9pzc4neplqegpu3je6lpwrns8u3d2z6p89", "129818309979193884672"}, - {"evmos1tl05f3du80fkrjtfpc8hjh2zjdw5ez3ahj3hne", "91766008167085735936"}, - {"evmos1tl52wegru3pp7tayv647vsqvrsh50l9xmqgnd2", "203680416027953741824"}, - {"evmos1tlaea2had6dyw3z6xyj7sjkgfsqhszh5qck09k", "45882504083542867968"}, - {"evmos1tlap7y3vjffcvxfd244t48cqcrxq8xp5qzj989", "27978601965217001472"}, - {"evmos1tll4c2jaz8v8yk6wc0nvs9fhhnyn0ddzytdkgv", "55957203930434002944"}, - {"evmos1tlmkm2dmgwpp6nkmql4cgr2y5glet2xewmghgf", "12276200167597400064"}, - {"evmos1tltg2hvs44nhpvj2w3aty2z9c4hh5gwphrecrt", "3916889595887597612"}, - {"evmos1tmjn388srvv0m5nsl8yp994hrt5pwp8r420exs", "129818309979193884672"}, - {"evmos1tndk24ejk6c5pnrxlwv69gs97fm3vh8n2cafwn", "84833408530960673558"}, - {"evmos1tnps79ccz2hcvchjqc7ys5kadeg9uxfgd3xfgy", "201000000000000000"}, - {"evmos1tnwxa9qex9xqkj0d2cup3pcp32k4mgaunda4q6", "45882504083542867968"}, - {"evmos1tp0hfx3d547aydtw3cxc333zjeuzkxx0hx578l", "1100000000000000"}, - {"evmos1tp3zyzghu5wquw3qkx33fs5y6ql58k89elndv4", "11000000000000000"}, - {"evmos1tpn0dd6vzc86du09e3jx774hqtj8w9fgd4amyw", "1100000000000000"}, - {"evmos1tq8qvgxqwre82s3fc6utf5q99pwlmetjq35zqu", "1929000000000000"}, - {"evmos1trjj7hu0tf2e0g882h4rscsrjr3npa9g5f9kps", "91766008167085735936"}, - {"evmos1ts2xe9emz6kz205l5h3gl02h9sgzg4zyudrn3q", "27978601965217001472"}, - {"evmos1tsrnd2qzy56cdl924qqw7prqhyem482yal6n0v", "1100000000000000"}, - {"evmos1tszye28wh267nq4uv8m47mxwvaee02yeuh5gcm", "1001000000000000000"}, - {"evmos1ttex5e2p3sjy53meg8df3c6yjnsmrqn6se9chv", "55958203930434002944"}, - {"evmos1tth6pwgfutgc25hcjams8l6fw53uy67kdn90mj", "32064370094504340992"}, - {"evmos1tu09kdsprnxulpj4a8vd0ds05csgx5dwkpc4yg", "101000000000000000"}, - {"evmos1tu70q0j4y8gv8qpd4e5dcued4vvhf3j2zep3gg", "203680416027953741824"}, - {"evmos1tug4pu2ck85wlj8jkw2ezfsf98me7y09anuhkq", "201000000000000000"}, - {"evmos1tuk03pk4xja65g7ysnh2x8q59dgaf6ph5e8zj4", "75264706217913389974"}, - {"evmos1tun6d8v6e8e727p4n873059n4znvccwfl2fj7p", "5001000000000000000"}, - {"evmos1tuy3pmqhcr5la32xcek23f9pstdphkka0f3kms", "91766008167085735936"}, - {"evmos1tvlqdf3t6t5cphd9a6ty9k8h3r206k5g549gl5", "1763581660408326912"}, - {"evmos1tw4v0kmj6kkdsykrugyhaehduc9fy093y96qql", "1100000000000000"}, - {"evmos1twet4kyymgtjfklv64fvnfs5kh3m20j03mdzfa", "1100000000000000"}, - {"evmos1txa78aejkpd08hv3lh4hv4fuehmcgp292fphmy", "19298423772196870656"}, - {"evmos1txz7ww6mrqgrmy5fz7m9xljd8fzxams694l609", "111914407860868005888"}, - {"evmos1tyfjsz4yzzyqw7203u7f35hmjn3wflwr2hcqen", "3982818366074575872"}, - {"evmos1tzeckytpqm0a45xl58a9rp98ya5cuudne8dttg", "45882504083542867968"}, - {"evmos1tzjp7wmfnq6f0209zptr8g7y6a2u5j6syhhpxx", "1100000000000000"}, - {"evmos1tzjxtd3cnky5pmg4l4c3h39x9jzaa72a4cmy2l", "55958203930434002944"}, - {"evmos1tzkj8uttz23ykathqp7wum6jnlt2qyr57wnmgx", "1000100000000000"}, - {"evmos1u2jumj4fwp7k8va7nzpktqh6qzh5vsmkrt8sn3", "11000000000000000"}, - {"evmos1u2w3xjpug42x0c49hcwe3az5vf64atse5sfuej", "83935805895651016704"}, - {"evmos1u2wnjkl6g4v4wcyw4nzdt03zjpz5uxc6p3mqg2", "223829815721736011776"}, - {"evmos1u2yv2l52mr9cxay4dayk7qdu76g9r22vm87h7w", "1100000000000000"}, - {"evmos1u350867q8fq2dvdzr737ec5vsd0443kz85uasy", "21000000000000000"}, - {"evmos1u4h8wxp73nz3262mh9w7ep4glwqtcx9ekqdmqm", "27978601965217001472"}, - {"evmos1u6064ejceau5fckgrqpnpldx04jqr8gaekudjg", "1100000000000000"}, - {"evmos1u62l7wr4jdmkv50xl45s4cencsy923p9synlfw", "1100000000000000"}, - {"evmos1u66929damk9stz03f280lak4eqsk8ctx294kdg", "45882504083542867968"}, - {"evmos1u67c9t5kl9d8gm39sudk2ae7k6ke0w584kmch9", "101839708013976870912"}, - {"evmos1u6gjs522msku2m898q58nhu7564atdul82ekg5", "73861106048759869440"}, - {"evmos1u6k2nfu4ppwknt3fcaugg45s9yu9rxx6ceg9g3", "101839708013976870912"}, - {"evmos1u6mfyrqf9ysl7l7x9qc9fvth25l8ugdcyr29g0", "45882504083542867968"}, - {"evmos1u6xll5cnf4rfnwvrxvtl5xtrj5h4yzrhgg3fjv", "46304317134633676254"}, - {"evmos1u7h3z0autkka2rfks7tpcatdve3dt9pzx8r36y", "27978601965217001472"}, - {"evmos1u7nhrdsan8xdj9kg7sp2gkuwkjd98fvzk7ktmd", "1100000000000000"}, - {"evmos1u8m744qdx0h0xrw0zh44alz9gzgqr24cd86c7g", "6618620540102264320"}, - {"evmos1u9mm69eguuvzh0hk293cu3d4pqeq9d7jdfm5yw", "45882504083542867968"}, - {"evmos1uad6vyepuhfq8a9wem7l4kx9vvyey6n5hfmlt6", "91766008167085735936"}, - {"evmos1uau8x9hanmt2m3a3aef79f6h5jqp8ucpfzv035", "16746084749958213116"}, - {"evmos1uay9lpec04zvhprgsy37fzf2gqvj9nzu0736p6", "6858217020445474816"}, - {"evmos1ucqnc2z54s6sjz6ewgzq7mal6sjmqyvuucs7vx", "11000000000000000"}, - {"evmos1ud9wukv7n5ylu25pfaad4lpgkjpy7jdc8snqsh", "2001000000000000000"}, - {"evmos1udpfsexvucs935pu7xzpnw8553d3cqt8uttkjq", "45882504083542867968"}, - {"evmos1udurdsyqruxrgh0jwxef0nqk3jh6f69eszzepf", "21000000000000000"}, - {"evmos1udz7swn4v9z4j05m2ql3qjmknh4xm0rxdru249", "1100000000000000"}, - {"evmos1ueflmhf55vkeqt2a0ykwjkk3xu3kulp4nfzxff", "82364171788702286912"}, - {"evmos1ueyekd4alee0et53p2zjyx2ua9trqczqg7zhl3", "1100000000000000"}, - {"evmos1uf28jl8fus0w589cyey4ah0ffuevxm9jaqvwjh", "45882504083542867968"}, - {"evmos1uf537ftjkfh2jh9clpn8u3hv49kvr7nj3t7839", "1100000000000000"}, - {"evmos1ufmy0qlvxxy0dedfk4d8hw6hj70ynk9408gy2j", "1763581660408326912"}, - {"evmos1uhpkteurd69s6c0t6d48luy6f3n7972axljkg7", "49843203437885664256"}, - {"evmos1uhw7zapsq5xzrxux2df9awpjs7rhjq56hxz05j", "27978601965217001472"}, - {"evmos1uk6yp4wcwg90wg0ln8capj3znl92cm7wr8qynu", "27978601965217001472"}, - {"evmos1uk7zvtyhpqk60a6ayzgphdz97x023fz8g5allg", "45882504083542867968"}, - {"evmos1uka3eel8ca3j8wqz20pdjvuscrvj9uchhtazsj", "6045000000000022"}, - {"evmos1ukcrahhgdfjfk2hjksg6sv7ezl74j7hl3xvd8m", "73861106048759869440"}, - {"evmos1ukhv5h7haw4v5awshrzkly07npmgsf4gn6qnpv", "45882504083542867968"}, - {"evmos1uks7drwhwww20g838w3kjmlz4quladgenafy5u", "203680416027953741824"}, - {"evmos1ulsx44auw6sxg6jteuvgx9ggv4t37s3ugd08gm", "45882504083542867968"}, - {"evmos1um8yq66md4ple534ly5lkmqwtt0wp4jyh92ddd", "11253462131733849088"}, - {"evmos1umfdl3aerw3xunvsk2aw8fg8d75x6uxrpde862", "185775513909627895808"}, - {"evmos1un5y3j0qsyeaskktrngf7ccm8hh9gg66lnrgcg", "3339468867083803648"}, - {"evmos1unhe6lgaet4kr6arygn38mh33ars8s76y7tazu", "1100000000000000"}, - {"evmos1unlc0aexe6lc2szlg9jzw8tjncheeskjf6zzc8", "1100000000000000"}, - {"evmos1unqw7y7wnvwml98uhxtd2krgwnflu9jjsujr98", "45882504083542867968"}, - {"evmos1unyq45sy50zjrwlcpt9nfy92hgagjwrnv5ytgs", "1100000000000000"}, - {"evmos1upnxsuya3xjuclyt73me8v48zdhm8sfxxvfdym", "1001000000000000000"}, - {"evmos1upuu9zssvjl8a8wk8p9wp5x29q0qexxk09xul7", "2001000000000000000"}, - {"evmos1uremtaugej7pkyqdkuf300w5gkt2sw0t8whswk", "11000000000000000"}, - {"evmos1urf6sftdpe7lxyhgkcgwyw4sfntkt4w0w9jsnc", "1100000000000000"}, - {"evmos1us9mh5008mc48ct540fjygmktl5xh2rluumutr", "1100000000000000"}, - {"evmos1usr8kwpm8c5pxxklkvpun0vhfjcg8q7kv67rtw", "45882504083542867968"}, - {"evmos1ut4nmmkcx4h3k56wzr55kz4fya9ukcv8j4knj8", "147723212097519738880"}, - {"evmos1ut5c20d5hnc3m63r7wzyt4lwlzl7y002txeysp", "45882504083542867968"}, - {"evmos1utl6lx9n38aupwtwkajklw6m2y5azw7f94l3ck", "259637619958387769344"}, - {"evmos1utqd3zz0tn6ay6jlh0vpwx2j797crsqa30kalc", "55958203930434002944"}, - {"evmos1uw2watjre49qp68xeymcu250sj87cd22yrgsz9", "1100000000000000"}, - {"evmos1uwc03ux07a5wxx6twk20rnmg9a79zyeekhlav9", "1500000000000000"}, - {"evmos1ux5y4w9xe75yuvyvsca3u5pyh2c2939pjwxeu2", "45882504083542867968"}, - {"evmos1uyrp4hsw8fd8w23edc3x2h3crwf0uuz5hlh2nz", "3526163320816653824"}, - {"evmos1uz23nwsl40m945muxmn3m0rqwsqlt2vnp59r98", "21000000000000000"}, - {"evmos1uz4wtx83k6vaj666tnc7jg6hd3gmgsd9ct373d", "85071186034764043809"}, - {"evmos1uz54u2ww9qva9nj0vul02wl7pndgq6qyavqcpj", "1001000000000000000"}, - {"evmos1uz8hqs33ke6qc75xukg3272c3a2ufzyqyu5uu6", "80557037697149606912"}, - {"evmos1uzj09q0mmhegjap8tcf7yvxul8dx3tud39ktc8", "203680416027953741824"}, - {"evmos1uzmvlzlr39x8009955f6mqhvdsx6h4tqm3pxtv", "1100000000000000"}, - {"evmos1uzn7qu2mvhg9xqppqgrsnga86g0e6srreve2t8", "401000000000000000"}, - {"evmos1v0wuu9arxxy2dm5yvnydvwlzqn89ja2kylnk9h", "45882504083542867968"}, - {"evmos1v0xyk5xyjq6p4k9m00arun5j7zwy23gznwdkjl", "66929253172081787986"}, - {"evmos1v38s9gun3p4naqn8tvu9alzpuaewv2nx22fhfd", "33603485164385251900"}, - {"evmos1v38w9g65v88z32l68kxt9ap9kyyr9py8f82ns7", "10628410358734847744"}, - {"evmos1v3ql2pu4xvj9pl7fzma86dcyrltjjtj4x3469w", "4799714358766142208"}, - {"evmos1v3ttzsj6jx84ca2c7qj5d20xkfr4xhepe54v0w", "5288744981224981504"}, - {"evmos1v47h40za0jqt7fym4sfe05yqsmn5vgp0ptmszz", "45882504083542867968"}, - {"evmos1v4dapjvurzch2nugzws3k08rwp0tvd8m43hr7g", "1763581660408326912"}, - {"evmos1v5y0tg0jllvxf5c3afml8s3awue0ymjuqsvc2s", "143808610961802395648"}, - {"evmos1v68y0a9j3tmu47makht83q5nurq3qmf4dwyxcm", "1100000000000000"}, - {"evmos1v6ds37zcuczclq0ulczv4hhy3rayzr2t0gz772", "1100000000000000"}, - {"evmos1v7kjxypzetst48vdw20027p5qj3hejqa656ee6", "115992848903186601094"}, - {"evmos1v8vqhz2kwequ69ct5fs26ha7zhhchqqmfnp2xk", "1100000000000000"}, - {"evmos1v8wrsznyz6la3yuyv5ynmfl9metykye2n24rr5", "1100000000000000"}, - {"evmos1v9nn6cecdlacg5cg5r954dylmkmu540wpnep9v", "1500000000000000"}, - {"evmos1v9y62xs2kr9py7r0uwh4n6qv34hy6yj879svj9", "112818447305883791104"}, - {"evmos1va3nl4wup8zexwysug2pkuu4htgcn78qfu5d5l", "50000000000000000"}, - {"evmos1va76h37hskqdq9w0cu3avgxs2vje5dkljpu9tg", "45882504083542867968"}, - {"evmos1vc938n0aq9smlmqw4ng76dhtxvrcnllvxyeezh", "21000000000000000"}, - {"evmos1vcm0m7p0grexr5yl6cv46uvvg7vls34x4j06ls", "1101000000000000000"}, - {"evmos1vcv2rr6leqdmx6r37ud8cga5h7fkytteqzkcz0", "101000000000000000"}, - {"evmos1vft04guda4jh82qd4m449fhfhk98axcwnr7vvn", "315594823888821747712"}, - {"evmos1vfthh7w00rehagvyuxj4vm2l50nvlyxz86tvq4", "167872611791302033408"}, - {"evmos1vg530u5nt6dha9phkupkygzzw3ecf9a84jj6rd", "101000000000000000"}, - {"evmos1vgqgdk7lyqz4qzt7lmfmm4eacf44uvt7fppm5t", "45882504083542867968"}, - {"evmos1vh3euf7vgepxytzzftj2vjzrj8eeyeuk8p0keh", "147723212097519738880"}, - {"evmos1vh6dpthet3e46d0p5m7nttz7gxd40rtyzzsk90", "1100000000000000"}, - {"evmos1vhnyzdyngwgh3ekara4cmkkwyhx485v7feu7lh", "1100000000000000"}, - {"evmos1vhqsuaxg52gvvzwyhqejvwfved5ywa3ncdwm99", "259637619958387769344"}, - {"evmos1vjg8989hz99rklkkjzhu8a7getk2382dg0l6a0", "171786212927019384832"}, - {"evmos1vk2y6zkwl67lnrlgefdn2r3auqvc9agj8a85na", "184062413094616784896"}, - {"evmos1vkf2hvv7pdpld6hy3v29n90zxermctq9apcec6", "1100000000000000"}, - {"evmos1vkywlwe7lxqav4mena4442gwkdly2fyhlzgfat", "21000000000000000"}, - {"evmos1vlc0crlxjkzjnzgl5czur0tgpjnctx247h54tv", "101000000000000000"}, - {"evmos1vlmvlpssr9nryc263ce5dfpmxzj9tltg6s2xee", "3962373293503009792"}, - {"evmos1vm3am8smcks93etyfua8s8gcstlsqpj3xj4a2r", "1100000000000000"}, - {"evmos1vm5gytfnt5zm737g8j0dp6nkny9pv7tval25n9", "92766008167085735936"}, - {"evmos1vm68m6p824v5ya55jkg7avytf5a6fmn6g6w34c", "1100000000000000"}, - {"evmos1vmcdv8xvmlks42r27v2lk7ec6632jtll2gj7sl", "201000000000000000"}, - {"evmos1vmnc8x6vmwp4sfee3mraxfa4ykglv0zhy0t7rv", "203680416027953741824"}, - {"evmos1vn9rvqf9y3qpxwm7x8veeuhw56lsx4hxlye7es", "1010000000000000"}, - {"evmos1vnp7jme5x0nx5lce34vxkau7huvh6c7dra6ad2", "101000000000000000"}, - {"evmos1vnxnpl5428yc4pqu0xelq2thmvy0j2cy4jkclp", "1100000000000000"}, - {"evmos1vpa86kynty8xeu2kgmk0kx0h3tr9w5pg423ay6", "73861106048759869440"}, - {"evmos1vpsss8hlrjhx0m82t6ky6n7pej9ywgqm5654w6", "147723212097519738880"}, - {"evmos1vpxkt7ahgnrhgznlh3ewrhe4e5whfys4a8pt58", "71400255503779753876"}, - {"evmos1vqnzqz7w45kdk0uncl5xa74e2ckjpq6ludmaz8", "101000000000000000"}, - {"evmos1vrl02nlwuw4q33c735xn8dayurelpj8exy74lz", "501000000000000000"}, - {"evmos1vrrgxw67d9p23ctk4apnm0yvehtc7ksgreuwe4", "1100000000000000"}, - {"evmos1vrw559yckeq229zxzlpxvhe7g80dnrj4yhgjke", "1100000000000000"}, - {"evmos1vrxrvtdg9025jqxu7uswn0zclqxx4xlvsr2m62", "27978601965217001472"}, - {"evmos1vs83na328g76vytj49pasd0503vmaeqf5sqkqr", "203680416027953741824"}, - {"evmos1vsd8mtkrufpuxjrul6lcwmmemflz3q9x02j720", "259637619958387769344"}, - {"evmos1vt2kaq9tcgvfera062sml0ug0k7ruhzgh5ca5j", "1100000000000000"}, - {"evmos1vtddm6kw3wkrq04wk9pzqnznxe7d7hukt9hf0x", "22645046851565885016"}, - {"evmos1vtmy2xgvgaqmsqenhnxc6teqyqzzqzt3tasn8u", "1100000000000000"}, - {"evmos1vu3cc4uhengptvahc0we3vdju3yftelervnzrk", "101839708013976870912"}, - {"evmos1vu3fufydntl00gmwlfax2t293623cdeyluqkkj", "89975055040279929600"}, - {"evmos1vv725835wp58tacs04w23tqya84htkj83sqg64", "101839708013976870912"}, - {"evmos1vv8078r440208rj50m4zg8z054sl02dwe0zx8q", "23590728355842933262"}, - {"evmos1vvf67knuuapw00rel6t8gvf4022ja76dpamhqy", "1100000000000000"}, - {"evmos1vwhdu5qyvxafr4g9rp8m2t273glmjqwpypf9l4", "91766008167085735936"}, - {"evmos1vx49exw9h49d7js7jge5lu2krumuv4ma5cwvgq", "41000000000000000"}, - {"evmos1vxqteydj8cg3kqv68th23puqze3e53almema38", "111915407860868005888"}, - {"evmos1vys2cp9umzmk4fn9g5754hd92jl6qzmmf7ch5c", "66437196604791536640"}, - {"evmos1vywdrd7ep9hd8rer9e5x8afjf4cw4p4hl63q05", "1100000000000000"}, - {"evmos1vyy9qun46e5c8tu3xjzvpu32xwnzgstfef2llq", "1100000000000000"}, - {"evmos1vzgkk9lckzu3jja2tm9y8dlptqaenfc56c9mw5", "11000000000000000"}, - {"evmos1vzr7p6wch97zgjpu9gkmrtdd5f7zkxqa93kgry", "5669216266706833408"}, - {"evmos1w2v3kh3ayku282qph7ma5xv8k49e9dt8ek2r2y", "27978601965217001472"}, - {"evmos1w3faetwx5k6zk69gcxtzz5a948nsm6dsqhd0xw", "20107142475486872704"}, - {"evmos1w45sxt4fg6cezrsyfvd4d3cr0mmzzpjsq20nk0", "45882504083542867968"}, - {"evmos1w4648sfd2av9f0k6x78kv39yaqss8eujymmc8g", "301000000000000000"}, - {"evmos1w5hsxvnmwtl7rk6ve34nd54v3urd9xmgcxckc0", "27978601965217001472"}, - {"evmos1w5xaz6cngvqmdsmmepj30lze7p494cd4ly3kvz", "1100000000000000"}, - {"evmos1w60kvrtx3r33txc27tvu8dn0xx6scpxcm2kw06", "55958203930434002944"}, - {"evmos1w6az8v775p0hr4u0hzw23sdghfzz4gdfmw9h6n", "27978601965217001472"}, - {"evmos1w6cuf9t2dd8y6dm6832zsg543lgwhz3hujqlfr", "1100000000000000"}, - {"evmos1w6rfx0rgejgz8zqxfllp956c7h5qdre0w9rrq6", "1100000000000000"}, - {"evmos1w8t2xcfwgr4490wd0n44agc6hau7cm368qhptw", "1100000000000000"}, - {"evmos1w95qxm8vh4k65032phjz9qekt9vfwze038vxvc", "1100000000000000"}, - {"evmos1w9fa85gphr2xupzae4mpndd5cvdf9fzp5u8t4m", "1100000000000000"}, - {"evmos1w9w7vvjhk2qd9ht7rrfr39n3dc7g2eaadjflw0", "27978601965217001472"}, - {"evmos1w9z7c4m57d99fx5yvq4qhny9axmduqlcqgvvdy", "101000000000000000"}, - {"evmos1wc06g0ny8reqnwd3tgln96d9dsr3kalvvdpvq5", "91766008167085735936"}, - {"evmos1wcausgx67g4j7u2k32nuztqta8v287mss7wa8s", "91766008167085735936"}, - {"evmos1wchpdruxqkz8yjjqnc2shxjacm60p8tuhq0c7q", "143807610961802395648"}, - {"evmos1wcpf4tljg0tmwnwld5z2j5qyc46qqccts2ep2r", "1100000000000000"}, - {"evmos1wctp55zjqq5zkr2y74uqz8gqdz2cmv5742g552", "1763581660408326912"}, - {"evmos1wdf3xhcmppmwqqxhkmhvwj7ls05gpr2yktk5f9", "1100000000000000"}, - {"evmos1weqcxdwdy3q4un9l7tyncheu8wl6c79yem72rs", "2000000000000000"}, - {"evmos1werzmsmgmwed7lmjt4je77xw2cdswl36wwxuca", "315593823888821780480"}, - {"evmos1wf6s4y9llp5afjw72qv3j84yznx6ln8d4ccrvu", "203680416027953741824"}, - {"evmos1wf8t0nk2a6whwzhev2y9v8dflh3hk3jrhwapcr", "1100000000000000"}, - {"evmos1wfzal0m57ppdajnlke06g7l90gvdfl4csgppc6", "1100000000000000"}, - {"evmos1wg9sza6f3a7shk3t3rfvlx3enp7mt99eq3xrdp", "501000000000000000"}, - {"evmos1wgaz5jx8k9cvnw3j82vdjhx6y6rt3l9a2zp5z7", "45882504083542867968"}, - {"evmos1wh7hp03fh8ztw25r4yuzz0k0z7nnyfduyp79q0", "211000000000000000"}, - {"evmos1whznqsrsr4wqvgks2fyuftzfq46wdjwl5khvyx", "34345793992653157723"}, - {"evmos1wj048jke65p27lnn6a2myws7jj3zvsy43lhlkk", "322429646668651637"}, - {"evmos1wjn27kurep7cmnl7zszm4yk7xzpryajn89dx69", "2001000000000000000"}, - {"evmos1wjns3s79t39gz2hmdh738lnjk0pamme733sayr", "75624687709168196352"}, - {"evmos1wjumew45pkznnhnl38m2uhkznydwthqasyz737", "29861886895390258176"}, - {"evmos1wk2r2m5mj6g76atd2fjjf9n3mg0kkunk6hx6j4", "343573425854038769664"}, - {"evmos1wla2d2ps8rhn2zuffuqnyggsrvxrwx5elswhug", "1100000000000000"}, - {"evmos1wleg848gqppgn93d88s6xcf7y84lxv625xjgpz", "1100000000000000"}, - {"evmos1wls9x0vugnvjurhx5lv4j32r3uexm05rxyfw0l", "1100000000000000"}, - {"evmos1wluda3822hszkfm2fwmkdz3n39fhqwyu760xez", "1100000000000000"}, - {"evmos1wlvv4w2mwvpffdthhjz6hw3r0d9ss2fjpx23ad", "1100000000000000"}, - {"evmos1wm3hs33mtuh4rcltr3hkhfrek84n4dsvcmhe5g", "27978601965217001472"}, - {"evmos1wmm82zffzfk6wwmxhwd9wfu4467jakt9jkzvjp", "3337711426009296373"}, - {"evmos1wmmulr5c0wsn3y7xh2j6p8nz9al7h03fqp7yrf", "129818309979193884672"}, - {"evmos1wmn9fd5azu63np2whzy7jqhddv085wpwzt5j3f", "111915407860868005888"}, - {"evmos1wn58mdp6q0uee7k2kwj3czal9r7c2f9ysx2s4n", "1100000000000000"}, - {"evmos1wngsl8j00pzh2682ktqejnl5jhj3wsw0fk4mgd", "203680416027953741824"}, - {"evmos1wnpak7sfawsfv9c8vqe7naxfa4g99lv7llm9td", "110000000000000000"}, - {"evmos1wpa4qwj68n442slpq8phv00zvlg3cf94wlv6lr", "1100000000000000"}, - {"evmos1wpykvjpvsnz4ltgkdtgthn8klsqqp7lh3vs7u8", "1001000000000000000"}, - {"evmos1wqhzk2akg4aj40s0jzfd3yn9rdk9dtrjfq9jf3", "1001000000000000000"}, - {"evmos1wr6d0t4hjuwv8cz9hsmwskjzx4wc3rrweenkjp", "45882504083542867968"}, - {"evmos1wrfzzgfz5lq3uk3jvmsv65eg8n4yz4x4ch6wsc", "2001000000000000000"}, - {"evmos1ws08hcd6naergv3ulhthxljmr2helwn2ljrnla", "1763581660408326912"}, - {"evmos1ws8cyqvsus8ly39hnngu7ga57ntd3eckwu3es2", "1100000000000000"}, - {"evmos1wshqldznfr3qcyvwmt7907acmgmtugkjlx5ams", "45882504083542867968"}, - {"evmos1wt6rty744fp5jtya45t3qulp2nffu3mlp9xlw9", "55958203930434002944"}, - {"evmos1wtyuh04jggkms43e7na7gtr5nlq5fuvp3gg0zs", "69946504913042513920"}, - {"evmos1wujkgw9kn8m8dexugf6v8ct6ejzyzek7wqpgtm", "167872611791302033408"}, - {"evmos1wux2nfpy47jm5k0dm5lwqtdfgvwdqluhllamdu", "45882504083542867968"}, - {"evmos1wwq6zutczpvwsw6f360rh5my75xq9gcepm85tj", "91766008167085735936"}, - {"evmos1wwrcklelqhxmkyutckdkaynpr0snrwkwlz7gkd", "169012404436314097954"}, - {"evmos1wwrg3kwh77me7yq3gzkhkjqns2pp0uc9gatmxn", "60816376445505184527"}, - {"evmos1wxflrdqveq0gfat0w5zg2gq95xehj75lcr9m5p", "1100000000000000"}, - {"evmos1wxrx6456uar2gmvy9rtts4enemrdyrnyz0xn0z", "45882504083542867968"}, - {"evmos1wyhrzkrwm62fe4wpz5tt630hvttkuv24cn9d4r", "1100000000000000"}, - {"evmos1wyl5jsmklema2qqht3dhmlk5n9h3x6nlz68pg4", "1100000000000000"}, - {"evmos1wz87axyuaf3vxxju659k8utg4mzv5zjzn478xd", "1100000000000000"}, - {"evmos1wzxwus8aep26srw7xjs54qy7g0qw3wqan9ve9s", "55957203930434002944"}, - {"evmos1x0gej6khaypfvnzhmvxy8qazkqmr8vg6py2nme", "1763581660408326912"}, - {"evmos1x3e0dm44g8930ptwzh9xac5fnn7afsvl0k8zq2", "1100000000000000"}, - {"evmos1x3zhsjdg8segw30rd0jezam4nafjg63mse2x0e", "11000000000000000"}, - {"evmos1x4qhn656zx06lr6k8xlefy22gnwg3hjzvgea25", "91766008167085735936"}, - {"evmos1x4vc4tt9ddmsukeymy7ukqsttcv466u950cdrk", "1100000000000000"}, - {"evmos1x5ymhshzpcatlz7mufsuud6gvcu7za7rdma64c", "1100000000000000"}, - {"evmos1x6r02wze0dmuwmyjr9qt85y3ufumg6yx7jrs44", "5941000000000000000"}, - {"evmos1x6vr9ew848vm729c6u5zec7sx5y9azhj8yjsvp", "3526163320816653824"}, - {"evmos1x7a5m6hfpjz8xyl6fh58n8y4h3hk4xkdpfkj52", "1100000000000000"}, - {"evmos1x8txr7936g09v8peggty88tq74p9y4lvhafn5x", "27978601965217001472"}, - {"evmos1x9rl0jypp2p5un5envv6v0trckpruvd7tgd07w", "61000000000000000"}, - {"evmos1x9uts0pckljh5fshsqynlm8ydc0uyj0edlxnvd", "45882504083542867968"}, - {"evmos1xa8fcr60j23333d0lhtqt5a0t2dhgkqtjnkpuz", "27978601965217001472"}, - {"evmos1xc434uscf00n9zfsknw9u97rfptyz2rv5z5cu8", "11000000000000000"}, - {"evmos1xdxcv6nz8zlzjmcq0pmlapza69j9a0wwcamn84", "45882504083542867968"}, - {"evmos1xe3mdf80e4d0jrsaeal4swuc3cpldyxqx5r4gu", "259637619958387769344"}, - {"evmos1xe6wcqqqa752zrj090uxxrh4zw3w3axzzru4nv", "11000000000000000"}, - {"evmos1xe7yrmpz8qk077tav7ltl9qkqdkugdttyr422v", "91766008167085735936"}, - {"evmos1xfhturw8xlp5kqt3fxwkhlcp6xcat4sxzhffrf", "18840027154756472832"}, - {"evmos1xg86240rxvpn7j3nkjrk6say7wsls5v0psd40k", "301000000000000000"}, - {"evmos1xgwgg8gksurthqzpgsg5pnvn0ck33u3afjeqcw", "124780960055748296704"}, - {"evmos1xgygkk0dhywt2plenpuhxlxh34zc98ewdt4a8r", "2000000000000000"}, - {"evmos1xhjhdtxq9xs9gv862dcmr374vujzv9ptcsxyxy", "91766008167085735936"}, - {"evmos1xhmn30rrgk5elfc9fecfmxa28usg98fvmf6u6f", "1100000000000000"}, - {"evmos1xj7g0h26kz3ud756vfjqqf35599pvjx7euwpgj", "1100000000000000"}, - {"evmos1xjcdg44ruryejglrvtt8n7x5x4jnkpl6gjmmns", "1100000000000000"}, - {"evmos1xkzkm0n4elkufg224z80u8usmpmsdemqh5q37t", "116789378128206594538"}, - {"evmos1xmevx388je8gxann5ys4e7jqtnyz6rmlf45xrg", "203680416027953741824"}, - {"evmos1xn6khyeqn372vzjynfm5dmsymvhpmjge85tcfa", "1100000000000000"}, - {"evmos1xn8aqautjpq6wrgsjyvwvzs8r9jh75fasvd78s", "1100000000000000"}, - {"evmos1xname80462fy8qggxgcafukqcmgler3nq9lgfg", "21000000000000000"}, - {"evmos1xnch4twms8c46tsxcjgs6pt8rr3a7g0drv3tsp", "1100000000000000"}, - {"evmos1xnf439dwu36w8smcs8l4mvj2uqv9dhy7eektpr", "1763581660408326912"}, - {"evmos1xnvfqrml6ssw4pz3z3f0x9fpys582ly0kmekya", "41000000000000000"}, - {"evmos1xnxqg4062r7nagucjd9kd0gh3f75jlyuwtv6xq", "1100000000000000"}, - {"evmos1xpdvrs6q62zkq47wun6dc9qtf6fjp69pn838nj", "36510053318136666880"}, - {"evmos1xpfc05zwa05pvv3rqu5llr54fmw5hyh489pxcg", "287616221923604791296"}, - {"evmos1xpq9hctxzw3tj0p970jq62345mfzem3tr8rdra", "152759562020965310464"}, - {"evmos1xqvtmrk2jxqrh2zgusrl6dz0t5n7g9q78lkw8q", "45882504083542867968"}, - {"evmos1xrzmp50wzr0vpzyffg0nfsd3sza38wjtc3a94r", "45882504083542867968"}, - {"evmos1xslp65txq2vuk4mw6thep835cgh3d9qyxnv78y", "1100000000000000"}, - {"evmos1xtd64wss40fsqm3hrekw83daqmp5q9m0sdu285", "1100000000000000"}, - {"evmos1xtlhmeuq484ketayyne603fnqk5svre9z5jgq2", "91766008167085735936"}, - {"evmos1xu6304qrytdsq3x6km4tnkmpxxprkjzy3hv392", "45882504083542867968"}, - {"evmos1xu7m3athqf85etsdmw2tkwtq4668hs043pl7r5", "2500000000000000"}, - {"evmos1xu7yvnxvuj7yan4km6q3t7d3hlj2ckhmdpk2fc", "45882504083542867968"}, - {"evmos1xv2k95q2vhsttqnrdsfmynzjz4sdy9e67xf3sv", "203000000000000000"}, - {"evmos1xv7vpnl0tgqcypahfss0enjq72dq5ugmx86rj3", "1100000000000000"}, - {"evmos1xvg6pznxhax3zwq70htlua0yck95ng5gcjupxp", "1100000000000000"}, - {"evmos1xvrwuw2c5zq6u262szecm37yw0ynfg6q98tvqs", "41000000000000000"}, - {"evmos1xvsj7hq0vx9fpfyeyg9dfdhgdqwlde7ltcrawd", "19807219226633424896"}, - {"evmos1xvu7y8ume6uxh5374grhp4808d2smtryzqnkfh", "15437438616168410779"}, - {"evmos1xvupya036t5ckg084uaqjtdr65puccsa9t8tzr", "1763581660408326912"}, - {"evmos1xwvyfuvymk5szx58e29lvvn60xp0n6maz7um9q", "8572148677396930994"}, - {"evmos1xxacv0jrrfjchdee9rp97l60qpa42m4elzrf6v", "27978601965217001472"}, - {"evmos1xxdrx7sn47pwgav5mppfq9meur87vdryeym0v9", "27978601965217001472"}, - {"evmos1xxt7zpd6cee4kt6e8gn97c287ye7ecj4nh2jmy", "1100000000000000"}, - {"evmos1xzvuhq526g4nhs7cvlcstxsxa5pcmz0lvyukqa", "1100000000000000"}, - {"evmos1y0rkqamw8ygxz9xrscfc2676hu8v97k9g25ntu", "91766008167085735936"}, - {"evmos1y2llmngd888c92mkd5uexwx0erjsv4phf4ens5", "203680416027953741824"}, - {"evmos1y2vnha9757qmupq6lx0klt9wr2rf5sx9h4hnxz", "1100000000000000"}, - {"evmos1y2ylwwtajhezhrnzjkdufzzgmc4luu53eyjrpt", "1100000000000000"}, - {"evmos1y33wxfacznusx72quddvhq65d8nxxv4t3k0l9h", "1100000000000000"}, - {"evmos1y35x2yxytrvfp7ru9v6rkvchvauhewscwf6r9z", "73861106048759869440"}, - {"evmos1y3qf7etw8ndhl59jgvpcnzhxaarpp4jv5dcu8s", "11261000000000000000"}, - {"evmos1y40paa8v288tz0u60uellmj0lmvfcgc2gjs3mf", "1100000000000000"}, - {"evmos1y4z9wm600q2vw7xhwwnv8zsvwwm4d29kd59pmf", "1100000000000000"}, - {"evmos1y55t9428k08f39qkek0yhe0w4udxtuegcyd0p2", "297690921770495901696"}, - {"evmos1y578v7kjgj0spns76guxz4d09elkcaxrwenpwu", "1100000000000000"}, - {"evmos1y67emf9pnjmjr7w5jp6ctakm9wp2hevwumgcfy", "58310498142461547520"}, - {"evmos1y6l298tkptffqu2ukcu235dunle50j3pennkrk", "1514544219611288393"}, - {"evmos1y6mwh9szmdq89vqjqaxhya9hjht9ncqhwtjqqg", "3659719174571880618"}, - {"evmos1y75d548w0sv9c7dc75ultvlq9exfv73gkgh7j0", "1001000000000000"}, - {"evmos1y83nev0z2pm8kpk9hjrhl5zx8hm67m6cv54uuy", "1001000000000000000"}, - {"evmos1y9eq06jsc9t2204qqp964c3vu63wvzrsfltdrv", "101000000000000000"}, - {"evmos1y9wvejufa4x94esrvdfn94g36kq76wjh7ddwj6", "111915407860868005888"}, - {"evmos1yagtcjz9vy8du2pdrng6y3wsg8jnakzds28wv8", "25616278813828500585"}, - {"evmos1yahzyhfewad586x2pyt8sz97e24zxa2qy982ty", "1683089142779188799"}, - {"evmos1yaj87jfpxvmlpaqazdtvkylwx730yn7lt0gj89", "7266384942531386880"}, - {"evmos1yawqv335xrkk3tsg5jf0a39z3mcwnl0taatuc0", "1100000000000000"}, - {"evmos1yc6tdz2cevl277vkjjxw49pkug8velwce8hhwt", "91766008167085735936"}, - {"evmos1ydetrklhcsyy5c28lqv427uwr0v0yh4s35u8ah", "21000000000000000"}, - {"evmos1ydpahdy258gtjl53txput5f7wexfgucyh6ez9k", "8956296191882057"}, - {"evmos1ye8ltlf4ycm6ukm936kxer9m7hs28d5r2mp53w", "52782862610906025728"}, - {"evmos1yfaqm2zu42aqgk6t2tedfx4u2z3flkcga6vvml", "203680416027953741824"}, - {"evmos1yfxdl0ejadmtkqyc80gzrwcn97hkdymewl73lr", "1100000000000000"}, - {"evmos1ygdd9633474qfk3ruek9flt2nxkv6yww8n3lr6", "1001000000000000000"}, - {"evmos1yhczhzaf25vyjkxhn9hunslkapr2vadk7lmm4c", "21000000000000000"}, - {"evmos1yj65j54xka0gawl45f3xh6dkkfzn9awx8xjr6j", "91766008167085735936"}, - {"evmos1yjahur60nwkh79r6se08zrz9lzfu4an496ud9g", "1763581660408326912"}, - {"evmos1yjj5zfxxzlqm6yhe78jahlwaxs6q8uqhk5hz4w", "2367976800000000000"}, - {"evmos1yjqsn574kvggswyggnjsnadvccxlzlx46yxrwf", "37652211543546737521"}, - {"evmos1yjrr0lwzjxnjm5m09fk6mwjtuyxrgfwtj3scq7", "73861106048759869440"}, - {"evmos1yjxdnhvnhcgu66rj9h2u6dwh7sqvacmj6sdwhc", "83935805895651016704"}, - {"evmos1ykr0amlrcwqutf0kzug6z6ktzun4j84kz7gwrx", "1763581660408326912"}, - {"evmos1yl8whxteqd3tvnppypwwuy88tdpm0xhmm3wd2l", "86137306216357269504"}, - {"evmos1ylef0ymepn9vclzmd50l9c4kfjt4fdgpjhvxnf", "1100000000000000"}, - {"evmos1ylkhm3lvx0qeaeuhw62c97s09nqgvgcv96pccn", "11000000000000000"}, - {"evmos1yms02p2d8luyjpmjl5qsc6u9dyrlw2sdgxfas4", "1763581660408326912"}, - {"evmos1yn245fhqdlhfa6xvkkgxlv2wdc9pla700jgx8y", "46882504083542867968"}, - {"evmos1ynd6u0lezqageda9gwxssvfth2w04v0azflqmk", "2963918143624579170"}, - {"evmos1ynuweupvm83my88tz6jxszt2talnr8hndelvlw", "34567705521416089499"}, - {"evmos1ynxj35nraq4sxmtgqsdmpgnwq7sgp8vlzzzaeh", "343573425854038769664"}, - {"evmos1ypakuerp2fz5resn74cngarknzlgj87sysse07", "203680416027953741824"}, - {"evmos1ypakzpy6fqwdhe0ru2u86m4a4s0w45e2f8hk8x", "55958203930434002944"}, - {"evmos1ypgmw98vkvjp5f4h3q9f9dvxp3snp3dp0d2zh2", "1100000000000000"}, - {"evmos1yptamqfp9s42qaxd50sr4z3autxvj2nlwhatrj", "805000000000000000"}, - {"evmos1yqn35pkaps9tnd80t027qvpvd68nqv8e0kupwz", "2000000000000000"}, - {"evmos1yqvasz9zvtgfsnaafcx5m27ct04usehfm93sqn", "1100000000000000"}, - {"evmos1yrnyudqnlfe0gsrkvdwytlj0ejfg38f69w85lj", "55958203930434002944"}, - {"evmos1yrsrmctckxd0c6rlewnf7s0ecse5ad3jdn9xjp", "129818309979193884672"}, - {"evmos1ysfx2pganh0kwlumg5sx95p57dn4qqysfeg50w", "27883962373636716204"}, - {"evmos1ysh2d9svxwluqww2zukauewgm62gn4gxpfz7f9", "55958203930434002944"}, - {"evmos1ysshvux26z6ut9hcvmzapan06gygkcug3nj9hz", "1001000000000000000"}, - {"evmos1ytejdcapn0l3uwfym7umdrusxphrwlhysrh3e7", "3268181421766368768"}, - {"evmos1ytmz30k5aftnj8vhsqfjma8y3p0hqqt0v0pfev", "61000000000000000"}, - {"evmos1ytqrgag43tgt5s0m3uwh2kvu38a6rnd2fruypd", "1100000000000000"}, - {"evmos1yue07ezswgrn957x2new387eqtuade8aqv5f8x", "1100000000000000"}, - {"evmos1yumaz4tranutnsy8v0jzhd95fxt7ej078vcfsp", "11000000000000000"}, - {"evmos1yuq6fqm2d0d7zmzy8s6hvk98u4e4pggfuku95n", "1100000000000000"}, - {"evmos1yuqf2g8an9609q26vyw4jsly6jcyjkl025nma2", "123783720127885819024"}, - {"evmos1yuxcrnzyylztpkhk9d4m9zfpt45sznakjc3l7e", "35001000000000000000"}, - {"evmos1yvfr7mx2dfyy2kh09ajcerujn7ltrpnxtzs7wu", "23132584561592279552"}, - {"evmos1yvg3wwj3cu8g0su7ch4zcqaav3w2r5dxe0y7ae", "91766008167085735936"}, - {"evmos1yvryycscx5ec932vngp780grq5mzsj7kqcf6t3", "12276200167597400064"}, - {"evmos1yvu9txcvc5jlp7hkcq0k9qyf9dnukm6hc5dy0r", "101000000000000000"}, - {"evmos1ywf9qarpna0wxlh7mmdyqlfaluy3w25aaya5jl", "125101000000000000000"}, - {"evmos1ywlx9jujyt7czla9zmrk5vl0wp0wu65rfjhc8q", "69946504913042513920"}, - {"evmos1ywvyx3j9k8esxymw3u7ndjj942hvz6wtms3z94", "1100000000000000"}, - {"evmos1yxghpe9umvcyhaq0cpeuzrra0aps2agpzgya4t", "11000000000000000"}, - {"evmos1yxzglql8d7gcxkktkpre4mjuel5mh0zvmkshy6", "45882504083542867968"}, - {"evmos1yy4kjku5h2hyz5r7yerg0etvmam7n4w8mvy6nm", "40142035472156956954"}, - {"evmos1yyeahsgasyxpedfv74jnf8sghr0jwatfx4nzpt", "81712427000000000"}, - {"evmos1yytzrfvweujtnyrjvzm4rseyyakvnpuyuqegd5", "74674553331514510008"}, - {"evmos1yz3y0ntf864x8tp7ekzh90k5eg3p4hafxjxjrv", "1100000000000000"}, - {"evmos1yz55y5nvwwxptwppaccdfhsyjfcuszdpek8tt0", "1100000000000000"}, - {"evmos1yzzw5xhp6kqkwmnn42h0wx9cvnp5gzwc46xefd", "1001000000000000000"}, - {"evmos1z030hjuc6y3a8qhehm3f96kcmppma36hp4xj0r", "1100000000000000"}, - {"evmos1z04mprdyr4f92sex5ndt3xa2ff3l0wp26yl5qw", "91766008167085735936"}, - {"evmos1z0dskl6yznd0p94f3tgqlwcjarakgkgfhc77r4", "1100000000000000"}, - {"evmos1z0nc7jkpnjkh93khpt498rxhk2my2jughw745h", "101000000000000000"}, - {"evmos1z0wm3vwjz09l7tknd9tae22fmzp62jvwfnvcj7", "1100000000000000"}, - {"evmos1z40q0ns64vk67546mh0evuzelq68d20g7acmhu", "1100000000000000"}, - {"evmos1z48ayvvcfp6wple9qk7tapz5w7kfx46exqq0yd", "103603289674385197824"}, - {"evmos1z4djdjg257nmzkgeftxafprlj70qx5r727vurf", "371552027819255791616"}, - {"evmos1z5qsjq820w2rawzszkfmxz9ak8m0suup4e40fg", "1001000000000000000"}, - {"evmos1z6vwm0q3g2kfj2sw5y2g5qsv6nutlef4dd0ut8", "1100000000000000"}, - {"evmos1z77lrfnswwl62svwuvr0nfhfln5ftlm72vrg70", "1100000000000000"}, - {"evmos1z7v0sve6284d2z5ktq82z348v24xt9vps4279e", "1100000000000000"}, - {"evmos1z8j6sfz3l9fpsflrv4ns46pm38vu3r3f7ajezt", "1001000000000000000"}, - {"evmos1z949a5rdf7y4e3g785ljapxup63g2kcnextpqt", "45882504083542867968"}, - {"evmos1zcy0vs262ukw7r5nt5qp9cnhhyhvgwnlcmfama", "3629734605748683841"}, - {"evmos1zd5rwhylqhjeapu0ef5p43yy9rzq82nt59509s", "8500000000000000"}, - {"evmos1zd7ljan0zmrc06clrjjh4k02ptk7eyez0yuega", "1100000000000000"}, - {"evmos1ze2s9xy7flznfjkcytkgm8adt42mfpct2z6jcl", "203680416027953741824"}, - {"evmos1zet4tnwawreff7w4x5s3fluml5x8xal2flm7pz", "28202149069549998848"}, - {"evmos1zew5he6vw8x92mgth7p2s0rd4nfj8zq4sn4wwl", "101839708013976870912"}, - {"evmos1zfj8jgdyuqxhv7jz6dfccufsyhhs2wwmy48e36", "167872611791302033408"}, - {"evmos1zgkzppe5x5kqw7ugla0jnk6frjwl85ydnwfgcc", "343573425854038769664"}, - {"evmos1zgmmhy5fhzdkap09vjhqmf3hwxkpxqjg6shtq2", "1100000000000000"}, - {"evmos1zgwvdg7xm4yj5lazlddv9wqrn0y8nvhg0ssshg", "1100000000000000"}, - {"evmos1zjlcdw0asgncx9560qc0vr9w02l9rs6l3lggyj", "1100000000000000"}, - {"evmos1zkv0vxtuspm0ex7490yzn6k90d3ywk7z0yp5m9", "55958203930434002944"}, - {"evmos1zkw07yvyff90pcttnjywhdlf37xjevrs6qnl8t", "73861106048759869440"}, - {"evmos1zl0jjzpgj84d8ds9ql505vzfr3zy2tcjyf8gzx", "31756297597724299264"}, - {"evmos1zmaed80mjelkvket9uy0k2je9mc8qet0vz8phc", "152766008167085735936"}, - {"evmos1zmcr0g7a7576rvz84ynwrqejr8c23c0uxrwccw", "132348402236528446464"}, - {"evmos1zmczmq44ta5epjtagjed8zyq5u5tq8x9kzsnjy", "91766008167085735936"}, - {"evmos1zn5ey34cyuxlr30lpswwvuppft0mna5kwyg2tu", "1100000000000000"}, - {"evmos1znmqx9dwgakkmwfchqm2whnnxqrgw5ukznz8pu", "1100000000000000"}, - {"evmos1zpj4qmmpqzjd9fdzde7jv6qvlhk80ewt84am5a", "53755435722540288000"}, - {"evmos1zpp6hwywzamawrx4nqpn404qr9806ek6t0n69h", "47005398074026920222"}, - {"evmos1zqp70nhzlhw4uy3cy5alv07ztq4ks0f8f8jyy2", "259637619958387769344"}, - {"evmos1zr8p0sufekk9jw2jwvlvmj4e0cdulujwawu6vv", "73861106048759869440"}, - {"evmos1zrajy95vns6g86c2tla6vuh3zd34ymk25gadhr", "91766008167085735936"}, - {"evmos1zre6j6tugzstah6pr2e2j3ppmd04x0w5lxf2gg", "1100000000000000"}, - {"evmos1zrfw696q3fgghstf850m0uae3xdfdnycjyk2vy", "9001000000000000000"}, - {"evmos1zskf6ltm2lme0gkzwjw02q7dfa7rpjl68k45gq", "1100000000000000"}, - {"evmos1ztcddjner6ksvjachg0qeev4ywhdyfj6rehd9r", "1500000000000000"}, - {"evmos1ztjurrunhvh0p4lflf70zhuxsgrrj6xc6wkcjf", "45882504083542867968"}, - {"evmos1ztmawsgwc79szdlxw6vf4l8l42uvudawestudz", "371552027819255791616"}, - {"evmos1zttl5ud0klt90zlcp6kxwczncz7tvhl9srhwah", "91766008167085735936"}, - {"evmos1ztx200vnl3v9e7gdaskjd9k6qryaqyvw5gzhdn", "1100000000000000"}, - {"evmos1ztxxa25wc3kf9fny475mnpqcjtzzgs3t3zhx2y", "3127409530944889344"}, - {"evmos1zu8zdg9tme0e5nxlry2r69n9qzumpquza5pnfj", "12301385988399720448"}, - {"evmos1zvpephxu6jrf9lhjr492dr3ajlx7cdz9ftmu93", "140584708159352812288"}, - {"evmos1zvusxgpgeupqs5pnk65fh04q84jnqsm5maal4h", "11000000000000000"}, - {"evmos1zvzaq2x5tg974d5uhlj9xs6ml73q535hp303c3", "1100000000000000"}, - {"evmos1zw2j6p6wdk37ey5yay29f32700xn2y4tltj97w", "1100000000000000"}, - {"evmos1zx67yacj843yzx8zte6k9vrkc2wegtes0au5sc", "1763581660408326912"}, - {"evmos1zx7dplc87mnxddwq9v94wcdl5gdfuwj5cy6sex", "1001000000000000000"}, - {"evmos1zy4mtht80mqyfujvq3wmrg9t8vt8ss02f9wjvz", "69415528324947360256"}, - {"evmos1zye8t8thl9ekmrax6nfcvzdmta2vfrt897yx5e", "132851175405697690624"}, - {"evmos1zzexwq9s5tfltmcjlgjs4w5p3m3mgwl58g89xs", "1200000000000000"}, - {"evmos1zzk6ldaqv74pa7uqvqljjxf0zrg23wq7jhl8yk", "1100000000000000"}, - {"evmos1zzqyutr8rzy8vcqzcc5ts938jlh8mxz0fjc4pf", "5733424660205367808"}, - {"evmos1zzs9anwtx8acj0nkd3l2mg9r0wrtyrkwr0klqx", "45882504083542867968"}, -} diff --git a/app/upgrades/v9_1/constants.go b/app/upgrades/v9_1/constants.go deleted file mode 100644 index 8bd1b76350..0000000000 --- a/app/upgrades/v9_1/constants.go +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package v91 - -const ( - // UpgradeName is the shared upgrade plan name for mainnet - UpgradeName = "v9.1.0" - // UpgradeInfo defines the binaries that will be used for the upgrade - UpgradeInfo = `'{"binaries":{"darwin/arm64":"https://github.com/evmos/evmos/releases/download/v9.1.0/evmos_9.1.0_Darwin_arm64.tar.gz","darwin/amd64":"https://github.com/evmos/evmos/releases/download/v9.1.0/evmos_9.1.0_Darwin_amd64.tar.gz","linux/arm64":"https://github.com/evmos/evmos/releases/download/v9.1.0/evmos_9.1.0_Linux_arm64.tar.gz","linux/amd64":"https://github.com/evmos/evmos/releases/download/v9.1.0/evmos_9.1.0_Linux_amd64.tar.gz","windows/x86_64":"https://github.com/evmos/evmos/releases/download/v9.1.0/evmos_9.1.0_Windows_x86_64.zip"}}'` - // MaxRecover is the maximum amount of coins to be redistributed in the upgrade - MaxRecover = "93590289356801768542679" -) diff --git a/app/upgrades/v9_1/upgrades.go b/app/upgrades/v9_1/upgrades.go deleted file mode 100644 index cc05ed061d..0000000000 --- a/app/upgrades/v9_1/upgrades.go +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package v91 - -import ( - "fmt" - - "github.com/cometbft/cometbft/libs/log" - - sdkmath "cosmossdk.io/math" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/module" - distrKeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" - upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - "github.com/evmos/evmos/v16/utils" -) - -// CreateUpgradeHandler creates an SDK upgrade handler for v9 -func CreateUpgradeHandler( - mm *module.Manager, - configurator module.Configurator, - dk distrKeeper.Keeper, -) upgradetypes.UpgradeHandler { - return func(ctx sdk.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { - logger := ctx.Logger().With("upgrade", UpgradeName) - - if utils.IsMainnet(ctx.ChainID()) { - logger.Debug("recovering lost funds from clawback...") - HandleMainnetUpgrade(ctx, dk, logger) - } - - // Leave modules are as-is to avoid running InitGenesis. - logger.Debug("running module migrations ...") - return mm.RunMigrations(ctx, configurator, vm) - } -} - -// HandleMainnetUpgrade handles the logic for Mainnet upgrade, it only commits to the db if successful -func HandleMainnetUpgrade(ctx sdk.Context, dk distrKeeper.Keeper, logger log.Logger) { - // use a cache context as a rollback mechanism in case - // the refund fails - cacheCtx, writeFn := ctx.CacheContext() - err := ReturnFundsFromCommunityPool(cacheCtx, dk) - if err != nil { - // log error instead of aborting the upgrade - logger.Error("failed to recover from community funds", "error", err.Error()) - } else { - writeFn() - } -} - -// ReturnFundsFromCommunityPool handles the return of funds from the community pool to accounts affected during the claims clawback -func ReturnFundsFromCommunityPool(ctx sdk.Context, dk distrKeeper.Keeper) error { - availableCoins, ok := sdkmath.NewIntFromString(MaxRecover) - if !ok || availableCoins.IsNegative() { - return fmt.Errorf("failed to read maximum amount to recover from community funds") - } - for i := range Accounts { - address := Accounts[i][0] - amt := Accounts[i][1] - - refund, _ := sdkmath.NewIntFromString(amt) - if availableCoins.LT(refund) { - return fmt.Errorf( - "refund to address %s exceeds the total available coins: %s > %s", - address, amt, availableCoins, - ) - } - if err := ReturnFundsFromCommunityPoolToAccount(ctx, dk, address, refund); err != nil { - return err - } - availableCoins = availableCoins.Sub(refund) - } - return nil -} - -// ReturnFundsFromCommunityPoolToAccount sends specified amount from the community pool to the affected account -func ReturnFundsFromCommunityPoolToAccount(ctx sdk.Context, dk distrKeeper.Keeper, account string, amount sdkmath.Int) error { - to := sdk.MustAccAddressFromBech32(account) - balance := sdk.Coin{ - Denom: "aevmos", - Amount: amount, - } - return dk.DistributeFromFeePool(ctx, sdk.Coins{balance}, to) -} diff --git a/app/upgrades/v9_1/upgrades_test.go b/app/upgrades/v9_1/upgrades_test.go deleted file mode 100644 index 7fbeeca838..0000000000 --- a/app/upgrades/v9_1/upgrades_test.go +++ /dev/null @@ -1,203 +0,0 @@ -package v91_test - -import ( - "fmt" - "testing" - "time" - - "cosmossdk.io/math" - "github.com/ethereum/go-ethereum/common" - "github.com/stretchr/testify/suite" - - "github.com/cometbft/cometbft/crypto/tmhash" - tmproto "github.com/cometbft/cometbft/proto/tendermint/types" - tmversion "github.com/cometbft/cometbft/proto/tendermint/version" - "github.com/cometbft/cometbft/version" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" - feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" - - "github.com/evmos/evmos/v16/app" - v9 "github.com/evmos/evmos/v16/app/upgrades/v9_1" - "github.com/evmos/evmos/v16/utils" - "github.com/evmos/evmos/v16/x/erc20/types" -) - -type UpgradeTestSuite struct { - suite.Suite - - ctx sdk.Context - app *app.Evmos - consAddress sdk.ConsAddress -} - -func (suite *UpgradeTestSuite) SetupTest(chainID string) { - checkTx := false - - // consensus key - priv, err := ethsecp256k1.GenerateKey() - suite.Require().NoError(err) - suite.consAddress = sdk.ConsAddress(priv.PubKey().Address()) - - // NOTE: this is the new binary, not the old one. - suite.app = app.Setup(checkTx, feemarkettypes.DefaultGenesisState(), chainID) - suite.ctx = suite.app.BaseApp.NewContext(checkTx, tmproto.Header{ - Height: 1, - ChainID: chainID, - Time: time.Date(2022, 5, 9, 8, 0, 0, 0, time.UTC), - ProposerAddress: suite.consAddress.Bytes(), - - Version: tmversion.Consensus{ - Block: version.BlockProtocol, - }, - LastBlockId: tmproto.BlockID{ - Hash: tmhash.Sum([]byte("block_id")), - PartSetHeader: tmproto.PartSetHeader{ - Total: 11, - Hash: tmhash.Sum([]byte("partset_header")), - }, - }, - AppHash: tmhash.Sum([]byte("app")), - DataHash: tmhash.Sum([]byte("data")), - EvidenceHash: tmhash.Sum([]byte("evidence")), - ValidatorsHash: tmhash.Sum([]byte("validators")), - NextValidatorsHash: tmhash.Sum([]byte("next_validators")), - ConsensusHash: tmhash.Sum([]byte("consensus")), - LastResultsHash: tmhash.Sum([]byte("last_result")), - }) - - cp := suite.app.BaseApp.GetConsensusParams(suite.ctx) - suite.ctx = suite.ctx.WithConsensusParams(cp) -} - -func TestUpgradeTestSuite(t *testing.T) { - s := new(UpgradeTestSuite) - suite.Run(t, s) -} - -func (suite *UpgradeTestSuite) TestMigrateFaucetBalance() { - firstAccountAmount := v9.Accounts[0][1] - thousandAccountAmount := v9.Accounts[1000][1] - - testCases := []struct { - name string - chainID string - malleate func() - expectedSuccess bool - }{ - { - "Mainnet - success", - utils.MainnetChainID + "-4", - func() { - // send funds to the community pool - priv, err := ethsecp256k1.GenerateKey() - suite.Require().NoError(err) - address := common.BytesToAddress(priv.PubKey().Address().Bytes()) - sender := sdk.AccAddress(address.Bytes()) - res, _ := math.NewIntFromString(v9.MaxRecover) - coins := sdk.NewCoins(sdk.NewCoin("aevmos", res)) - err = suite.app.BankKeeper.MintCoins(suite.ctx, types.ModuleName, coins) - suite.Require().NoError(err) - err = suite.app.BankKeeper.SendCoinsFromModuleToAccount(suite.ctx, types.ModuleName, sender, coins) - suite.Require().NoError(err) - err = suite.app.DistrKeeper.FundCommunityPool(suite.ctx, coins, sender) - suite.Require().NoError(err) - - balanceBefore := suite.app.DistrKeeper.GetFeePoolCommunityCoins(suite.ctx) - suite.Require().Equal(balanceBefore.AmountOf("aevmos"), math.LegacyNewDecFromInt(res)) - }, - true, - }, - { //nolint:dupl - "Mainnet - first account > MaxRecover", - utils.MainnetChainID + "-4", - func() { - // send funds to the community pool - priv, err := ethsecp256k1.GenerateKey() - suite.Require().NoError(err) - address := common.BytesToAddress(priv.PubKey().Address().Bytes()) - sender := sdk.AccAddress(address.Bytes()) - res, _ := math.NewIntFromString(v9.MaxRecover) - coins := sdk.NewCoins(sdk.NewCoin("aevmos", res)) - err = suite.app.BankKeeper.MintCoins(suite.ctx, types.ModuleName, coins) - suite.Require().NoError(err) - err = suite.app.BankKeeper.SendCoinsFromModuleToAccount(suite.ctx, types.ModuleName, sender, coins) - suite.Require().NoError(err) - err = suite.app.DistrKeeper.FundCommunityPool(suite.ctx, coins, sender) - suite.Require().NoError(err) - - balanceBefore := suite.app.DistrKeeper.GetFeePoolCommunityCoins(suite.ctx) - suite.Require().Equal(balanceBefore.AmountOf("aevmos"), math.LegacyNewDecFromInt(res)) - - v9.Accounts[0][1] = v9.MaxRecover - }, - false, - }, - { //nolint:dupl - "Mainnet - middle account > MaxRecover", - utils.MainnetChainID + "-4", - func() { - // send funds to the community pool - priv, err := ethsecp256k1.GenerateKey() - suite.Require().NoError(err) - address := common.BytesToAddress(priv.PubKey().Address().Bytes()) - sender := sdk.AccAddress(address.Bytes()) - res, _ := math.NewIntFromString(v9.MaxRecover) - coins := sdk.NewCoins(sdk.NewCoin("aevmos", res)) - err = suite.app.BankKeeper.MintCoins(suite.ctx, types.ModuleName, coins) - suite.Require().NoError(err) - err = suite.app.BankKeeper.SendCoinsFromModuleToAccount(suite.ctx, types.ModuleName, sender, coins) - suite.Require().NoError(err) - err = suite.app.DistrKeeper.FundCommunityPool(suite.ctx, coins, sender) - suite.Require().NoError(err) - - balanceBefore := suite.app.DistrKeeper.GetFeePoolCommunityCoins(suite.ctx) - suite.Require().Equal(balanceBefore.AmountOf("aevmos"), math.LegacyNewDecFromInt(res)) - - v9.Accounts[1000][1] = v9.MaxRecover - }, - false, - }, - { - "Mainnet - fail communityFund is empty", - utils.MainnetChainID + "-4", - func() { - }, - false, - }, - } - - for _, tc := range testCases { - suite.Run(fmt.Sprintf("Case %s", tc.name), func() { - suite.SetupTest(tc.chainID) - - tc.malleate() - - logger := suite.ctx.Logger().With("upgrade", "Test v9 Upgrade") - v9.HandleMainnetUpgrade(suite.ctx, suite.app.DistrKeeper, logger) - - // check balance of affected accounts - if tc.expectedSuccess { - for i := range v9.Accounts { - addr := sdk.MustAccAddressFromBech32(v9.Accounts[i][0]) - res, _ := math.NewIntFromString(v9.Accounts[i][1]) - balance := suite.app.BankKeeper.GetBalance(suite.ctx, addr, "aevmos") - suite.Require().Equal(balance.Amount, res) - } - - balanceAfter := suite.app.DistrKeeper.GetFeePoolCommunityCoins(suite.ctx) - suite.Require().True(balanceAfter.IsZero()) - } else { - for i := range v9.Accounts { - addr := sdk.MustAccAddressFromBech32(v9.Accounts[i][0]) - balance := suite.app.BankKeeper.GetBalance(suite.ctx, addr, "aevmos") - suite.Require().Equal(balance.Amount, math.NewInt(0)) - } - } - v9.Accounts[0][1] = firstAccountAmount - v9.Accounts[1000][1] = thousandAccountAmount - }) - } -} From 31a4384cadf4324bbc93066f4d1ded3bad2354ac Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 6 Dec 2023 16:20:54 +0100 Subject: [PATCH 020/345] build(deps): bump golang from 1.21.4-alpine3.18 to 1.21.5-alpine3.18 (#2141) Bumps golang from 1.21.4-alpine3.18 to 1.21.5-alpine3.18. --- updated-dependencies: - dependency-name: golang dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 418d7ed18c..e3a07029a3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.21.4-alpine3.18 AS build-env +FROM golang:1.21.5-alpine3.18 AS build-env ARG DB_BACKEND=goleveldb ARG ROCKSDB_VERSION="8.5.3" From 09f261a6bd39809c06af9c1de25cec3fb1f0be75 Mon Sep 17 00:00:00 2001 From: Vladislav Varadinov Date: Thu, 7 Dec 2023 11:40:05 +0200 Subject: [PATCH 021/345] chore(erc20): Remove evm hooks from erc20 module (#2154) * chore(erc20): Remove evm hooks from erc20 module * CHANGELOG --- CHANGELOG.md | 1 + app/app.go | 1 - x/erc20/keeper/evm_hooks.go | 166 ------------ x/erc20/keeper/evm_hooks_test.go | 431 ------------------------------- 4 files changed, 1 insertion(+), 598 deletions(-) delete mode 100644 x/erc20/keeper/evm_hooks.go delete mode 100644 x/erc20/keeper/evm_hooks_test.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 8832e0a80f..9c24e3a37f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -53,6 +53,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (evm) [#2084](https://github.com/evmos/evmos/pull/2084) Remove `x/claims` params and migrate the `EVMChannels` param to the `x/evm` module params. - (post) [#2128](https://github.com/evmos/evmos/pull/2128) Add `BurnDecorator` to `PostHandler` to burn cosmos transaction fees. - (fee-collector) [#2129] (https://github.com/evmos/evmos/pull/2129) Add `Burner` role to `FeeCollector` module. +- (erc20) [#2154] (https://github.com/evmos/evmos/pull/2154) Remove evm hooks from `erc20` module. ### API Breaking diff --git a/app/app.go b/app/app.go index 7dd50d1433..a4c9ed5c27 100644 --- a/app/app.go +++ b/app/app.go @@ -535,7 +535,6 @@ func NewEvmos( app.EvmKeeper = app.EvmKeeper.SetHooks( evmkeeper.NewMultiEvmHooks( - app.Erc20Keeper.Hooks(), app.RevenueKeeper.Hooks(), ), ) diff --git a/x/erc20/keeper/evm_hooks.go b/x/erc20/keeper/evm_hooks.go deleted file mode 100644 index b88cdd90f6..0000000000 --- a/x/erc20/keeper/evm_hooks.go +++ /dev/null @@ -1,166 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package keeper - -import ( - "bytes" - "math/big" - - "cosmossdk.io/math" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" - ethtypes "github.com/ethereum/go-ethereum/core/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - - "github.com/evmos/evmos/v16/contracts" - "github.com/evmos/evmos/v16/x/erc20/types" -) - -var _ evmtypes.EvmHooks = Hooks{} - -// Hooks wrapper struct for erc20 keeper -type Hooks struct { - k Keeper -} - -// Return the wrapper struct -func (k Keeper) Hooks() Hooks { - return Hooks{k} -} - -// PostTxProcessing is a wrapper for calling the EVM PostTxProcessing hook on -// the module keeper -func (h Hooks) PostTxProcessing(ctx sdk.Context, msg core.Message, receipt *ethtypes.Receipt) error { - return h.k.PostTxProcessing(ctx, msg, receipt) -} - -// PostTxProcessing implements EvmHooks.PostTxProcessing. The EVM hooks allows -// users to convert ERC20s to Cosmos Coins by sending an Ethereum tx transfer to -// the module account address. This hook applies to both token pairs that have -// been registered through a native Cosmos coin or an ERC20 token. If token pair -// has been registered with: -// - coin -> burn tokens and transfer escrowed coins on module to sender -// - token -> escrow tokens on module account and mint & transfer coins to sender -// -// Note that the PostTxProcessing hook is only called by sending an EVM -// transaction that triggers `ApplyTransaction`. A cosmos tx with a -// `ConvertERC20` msg does not trigger the hook as it only calls `ApplyMessage`. -func (k Keeper) PostTxProcessing( - ctx sdk.Context, - _ core.Message, - receipt *ethtypes.Receipt, -) error { - params := k.GetParams(ctx) - if !params.EnableErc20 || !params.EnableEVMHook { - // no error is returned to avoid reverting the tx and allow for other post - // processing txs to pass and - return nil - } - - erc20 := contracts.ERC20MinterBurnerDecimalsContract.ABI - - for i, log := range receipt.Logs { - // Note: the `Transfer` event contains 3 topics (id, from, to) - if len(log.Topics) != 3 { - continue - } - - // Check if event is included in ERC20 - eventID := log.Topics[0] - event, err := erc20.EventByID(eventID) - if err != nil { - continue - } - - // Check if event is a `Transfer` event. - if event.Name != types.ERC20EventTransfer { - k.Logger(ctx).Info("emitted event", "name", event.Name, "signature", event.Sig) - continue - } - - transferEvent, err := erc20.Unpack(event.Name, log.Data) - if err != nil { - k.Logger(ctx).Error("failed to unpack transfer event", "error", err.Error()) - continue - } - - if len(transferEvent) == 0 { - continue - } - - tokens, ok := transferEvent[0].(*big.Int) - // safety check and ignore if amount not positive - if !ok || tokens == nil || tokens.Sign() != 1 { - continue - } - - // Check that the contract is a registered token pair - contractAddr := log.Address - id := k.GetERC20Map(ctx, contractAddr) - if len(id) == 0 { - continue - } - - pair, found := k.GetTokenPair(ctx, id) - if !found { - continue - } - - // Check if tokens are sent to module address - to := common.BytesToAddress(log.Topics[2].Bytes()) - if !bytes.Equal(to.Bytes(), types.ModuleAddress.Bytes()) { - continue - } - - // Check that conversion for the pair is enabled. Fail - if !pair.Enabled { - // continue to allow transfers for the ERC20 in case the token pair is - // disabled - k.Logger(ctx).Debug( - "ERC20 token -> Cosmos coin conversion is disabled for pair", - "coin", pair.Denom, "contract", pair.Erc20Address, - ) - continue - } - - // create the corresponding sdk.Coin that is paired with ERC20 - coins := sdk.Coins{{Denom: pair.Denom, Amount: math.NewIntFromBigInt(tokens)}} - - // Perform token conversion. We can now assume that the sender of a - // registered token wants to mint a Cosmos coin. - switch pair.ContractOwner { - case types.OWNER_MODULE: - _, err = k.CallEVM(ctx, erc20, types.ModuleAddress, contractAddr, true, "burn", tokens) - case types.OWNER_EXTERNAL: - err = k.bankKeeper.MintCoins(ctx, types.ModuleName, coins) - default: - err = types.ErrUndefinedOwner - } - - if err != nil { - k.Logger(ctx).Debug( - "failed to process EVM hook for ER20 -> coin conversion", - "coin", pair.Denom, "contract", pair.Erc20Address, "error", err.Error(), - ) - continue - } - - // Only need last 20 bytes from log.topics - from := common.BytesToAddress(log.Topics[1].Bytes()) - recipient := sdk.AccAddress(from.Bytes()) - - // transfer the tokens from ModuleAccount to sender address - if err := k.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, recipient, coins); err != nil { - k.Logger(ctx).Debug( - "failed to process EVM hook for ER20 -> coin conversion", - "tx-hash", receipt.TxHash.Hex(), "log-idx", i, - "coin", pair.Denom, "contract", pair.Erc20Address, "error", err.Error(), - ) - continue - } - } - - return nil -} diff --git a/x/erc20/keeper/evm_hooks_test.go b/x/erc20/keeper/evm_hooks_test.go deleted file mode 100644 index 8a4404697d..0000000000 --- a/x/erc20/keeper/evm_hooks_test.go +++ /dev/null @@ -1,431 +0,0 @@ -package keeper_test - -import ( - "fmt" - "math/big" - - "cosmossdk.io/math" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/ethereum/go-ethereum/common" - ethtypes "github.com/ethereum/go-ethereum/core/types" - - "github.com/evmos/evmos/v16/contracts" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/x/erc20/types" -) - -// ensureHooksSet tries to set the hooks on EVMKeeper, this will fail if the erc20 hook is already set -func (suite *KeeperTestSuite) ensureHooksSet() { - // TODO: PR to Ethermint to add the functionality `GetHooks` or `areHooksSet` to avoid catching a panic - defer func() { - err := recover() - suite.Require().NotNil(err) - }() - suite.app.EvmKeeper.SetHooks(suite.app.Erc20Keeper.Hooks()) -} - -func (suite *KeeperTestSuite) TestEvmHooksRegisteredERC20() { - testCases := []struct { - name string - malleate func(common.Address) - result bool - }{ - { - "correct execution", - func(contractAddr common.Address) { - _, err := suite.app.Erc20Keeper.RegisterERC20(suite.ctx, contractAddr) - suite.Require().NoError(err) - - // Mint 10 tokens to suite.address (owner) - _ = suite.MintERC20Token(contractAddr, suite.address, suite.address, big.NewInt(10)) - suite.Commit() - - // Burn the 10 tokens of suite.address (owner) - _ = suite.TransferERC20TokenToModule(contractAddr, suite.address, big.NewInt(10)) - }, - true, - }, - { - "unregistered pair", - func(contractAddr common.Address) { - // Mint 10 tokens to suite.address (owner) - _ = suite.MintERC20Token(contractAddr, suite.address, suite.address, big.NewInt(10)) - suite.Commit() - - // Burn the 10 tokens of suite.address (owner) - _ = suite.TransferERC20TokenToModule(contractAddr, suite.address, big.NewInt(10)) - }, - false, - }, - { - "wrong event", - func(contractAddr common.Address) { - _, err := suite.app.Erc20Keeper.RegisterERC20(suite.ctx, contractAddr) - suite.Require().NoError(err) - - // Mint 10 tokens to suite.address (owner) - _ = suite.MintERC20Token(contractAddr, suite.address, suite.address, big.NewInt(10)) - }, - false, - }, - { - "Pair is disabled", - func(contractAddr common.Address) { - pair, err := suite.app.Erc20Keeper.RegisterERC20(suite.ctx, contractAddr) - suite.Require().NoError(err) - - pair.Enabled = false - suite.app.Erc20Keeper.SetTokenPair(suite.ctx, *pair) - // Mint 10 tokens to suite.address (owner) - _ = suite.MintERC20Token(contractAddr, suite.address, suite.address, big.NewInt(10)) - suite.Commit() - - // Burn the 10 tokens of suite.address (owner) - _ = suite.TransferERC20TokenToModule(contractAddr, suite.address, big.NewInt(10)) - }, - false, - }, - { - "Pair is incorrectly loaded", - func(contractAddr common.Address) { - pair, err := suite.app.Erc20Keeper.RegisterERC20(suite.ctx, contractAddr) - suite.Require().NoError(err) - - suite.app.Erc20Keeper.DeleteTokenPair(suite.ctx, *pair) - - suite.app.Erc20Keeper.SetDenomMap(suite.ctx, pair.Denom, pair.GetID()) - suite.app.Erc20Keeper.SetERC20Map(suite.ctx, pair.GetERC20Contract(), pair.GetID()) - // Mint 10 tokens to suite.address (owner) - _ = suite.MintERC20Token(contractAddr, suite.address, suite.address, big.NewInt(10)) - suite.Commit() - - // Burn the 10 tokens of suite.address (owner) - _ = suite.TransferERC20TokenToModule(contractAddr, suite.address, big.NewInt(10)) - }, - false, - }, - } - for _, tc := range testCases { - suite.Run(fmt.Sprintf("Case %s", tc.name), func() { - suite.mintFeeCollector = true - suite.SetupTest() - - suite.ensureHooksSet() - - contractAddr, err := suite.DeployContract("coin test erc20", "token", erc20Decimals) - suite.Require().NoError(err) - - tc.malleate(contractAddr) - - balance := suite.app.BankKeeper.GetBalance(suite.ctx, sdk.AccAddress(suite.address.Bytes()), types.CreateDenom(contractAddr.String())) - suite.Commit() - if tc.result { - // Check if the execution was successful - suite.Require().Equal(int64(10), balance.Amount.Int64()) - } else { - // Check that no changes were made to the account - suite.Require().Equal(int64(0), balance.Amount.Int64()) - } - }) - } - suite.mintFeeCollector = false -} - -func (suite *KeeperTestSuite) TestEvmHooksRegisteredCoin() { - testCases := []struct { - name string - mint int64 - burn int64 - reconvert int64 - - result bool - }{ - {"correct execution", 100, 10, 5, true}, - } - for _, tc := range testCases { - suite.Run(fmt.Sprintf("Case %s", tc.name), func() { - suite.mintFeeCollector = true - suite.SetupTest() - - suite.ensureHooksSet() - - pair := suite.setupRegisterCoin(metadataCoin) - suite.Require().NotNil(metadataCoin) - suite.Require().NotNil(pair) - - sender := sdk.AccAddress(suite.address.Bytes()) - contractAddr := common.HexToAddress(pair.Erc20Address) - - coins := sdk.NewCoins(sdk.NewCoin(cosmosTokenBase, math.NewInt(tc.mint))) - err := suite.app.BankKeeper.MintCoins(suite.ctx, types.ModuleName, coins) - suite.Require().NoError(err, tc.name) - err = suite.app.BankKeeper.SendCoinsFromModuleToAccount(suite.ctx, types.ModuleName, sender, coins) - suite.Require().NoError(err, tc.name) - - convertCoin := types.NewMsgConvertCoin( - sdk.NewCoin(cosmosTokenBase, math.NewInt(tc.burn)), - suite.address, - sender, - ) - - ctx := sdk.WrapSDKContext(suite.ctx) - _, err = suite.app.Erc20Keeper.ConvertCoin(ctx, convertCoin) - suite.Require().NoError(err, tc.name) - suite.Commit() - - balance := suite.BalanceOf(common.HexToAddress(pair.Erc20Address), suite.address) - cosmosBalance := suite.app.BankKeeper.GetBalance(suite.ctx, sender, metadataCoin.Base) - suite.Require().Equal(cosmosBalance.Amount.Int64(), math.NewInt(tc.mint-tc.burn).Int64()) - suite.Require().Equal(balance, big.NewInt(tc.burn)) - - // Burn the 10 tokens of suite.address (owner) - _ = suite.TransferERC20TokenToModule(contractAddr, suite.address, big.NewInt(tc.reconvert)) - - balance = suite.BalanceOf(common.HexToAddress(pair.Erc20Address), suite.address) - cosmosBalance = suite.app.BankKeeper.GetBalance(suite.ctx, sender, metadataCoin.Base) - - if tc.result { - suite.Require().Equal(balance, big.NewInt(tc.burn-tc.reconvert)) - // Check if the execution was successful - suite.Require().NoError(err) - suite.Require().Equal(cosmosBalance.Amount, math.NewInt(tc.mint-tc.burn+tc.reconvert)) - } else { - // Check that no changes were made to the account - suite.Require().Error(err) - suite.Require().Equal(cosmosBalance.Amount, math.NewInt(tc.mint-tc.burn)) - } - }) - } - suite.mintFeeCollector = false -} - -func (suite *KeeperTestSuite) TestPostTxProcessing() { - var ( - receipt *ethtypes.Receipt - pair *types.TokenPair - ) - - msg := ethtypes.NewMessage( - types.ModuleAddress, - &common.Address{}, - 0, - big.NewInt(0), // amount - uint64(0), // gasLimit - big.NewInt(0), // gasFeeCap - big.NewInt(0), // gasTipCap - big.NewInt(0), // gasPrice - []byte{}, - ethtypes.AccessList{}, // AccessList - true, // checkNonce - ) - - account := utiltx.GenerateAddress() - - transferData := []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - transferData[31] = uint8(10) - erc20 := contracts.ERC20BurnableContract.ABI - - transferEvent := erc20.Events["Transfer"] - - testCases := []struct { - name string - malleate func() - expConversion bool - }{ - { - "Empty logs", - func() { - log := ethtypes.Log{} - receipt = ðtypes.Receipt{ - Logs: []*ethtypes.Log{&log}, - } - }, - false, - }, - { - "No log data", - func() { - topics := []common.Hash{transferEvent.ID, account.Hash(), types.ModuleAddress.Hash()} - log := ethtypes.Log{ - Topics: topics, - } - receipt = ðtypes.Receipt{ - Logs: []*ethtypes.Log{&log}, - } - }, - false, - }, - { - "Non recognized event", - func() { - topics := []common.Hash{{}, account.Hash(), account.Hash()} - log := ethtypes.Log{ - Topics: topics, - Data: transferData, - } - receipt = ðtypes.Receipt{ - Logs: []*ethtypes.Log{&log}, - } - }, - false, - }, - { - "Non transfer event", - func() { - aprovalEvent := erc20.Events["Approval"] - topics := []common.Hash{aprovalEvent.ID, account.Hash(), account.Hash()} - log := ethtypes.Log{ - Topics: topics, - Data: transferData, - } - receipt = ðtypes.Receipt{ - Logs: []*ethtypes.Log{&log}, - } - }, - false, - }, - { - "No log address", - func() { - topics := []common.Hash{transferEvent.ID, account.Hash(), types.ModuleAddress.Hash()} - log := ethtypes.Log{ - Topics: topics, - Data: transferData, - } - receipt = ðtypes.Receipt{ - Logs: []*ethtypes.Log{&log}, - } - }, - false, - }, - { - "No data on topic", - func() { - topics := []common.Hash{transferEvent.ID} - log := ethtypes.Log{ - Topics: topics, - Data: transferData, - } - receipt = ðtypes.Receipt{ - Logs: []*ethtypes.Log{&log}, - } - }, - false, - }, - { - "transfer to non-evm-module account", - func() { - contractAddr, err := suite.DeployContract("coin", "token", erc20Decimals) - suite.Require().NoError(err) - - _, err = suite.app.Erc20Keeper.RegisterERC20(suite.ctx, contractAddr) - suite.Require().NoError(err) - - topics := []common.Hash{transferEvent.ID, account.Hash(), account.Hash()} - log := ethtypes.Log{ - Topics: topics, - Data: transferData, - Address: contractAddr, - } - receipt = ðtypes.Receipt{ - Logs: []*ethtypes.Log{&log}, - } - }, - false, - }, - { - "correct burn", - func() { - contractAddr, err := suite.DeployContract("coin", "token", erc20Decimals) - suite.Require().NoError(err) - - pair, err = suite.app.Erc20Keeper.RegisterERC20(suite.ctx, contractAddr) - suite.Require().NoError(err) - - topics := []common.Hash{transferEvent.ID, account.Hash(), types.ModuleAddress.Hash()} - log := ethtypes.Log{ - Topics: topics, - Data: transferData, - Address: contractAddr, - } - receipt = ðtypes.Receipt{ - Logs: []*ethtypes.Log{&log}, - } - }, - true, - }, - { - "Unspecified Owner", - func() { - contractAddr, err := suite.DeployContract("coin", "token", erc20Decimals) - suite.Require().NoError(err) - - pair, err := suite.app.Erc20Keeper.RegisterERC20(suite.ctx, contractAddr) - suite.Require().NoError(err) - - pair.ContractOwner = types.OWNER_UNSPECIFIED - suite.app.Erc20Keeper.SetTokenPair(suite.ctx, *pair) - - topics := []common.Hash{transferEvent.ID, account.Hash(), types.ModuleAddress.Hash()} - log := ethtypes.Log{ - Topics: topics, - Data: transferData, - Address: contractAddr, - } - receipt = ðtypes.Receipt{ - Logs: []*ethtypes.Log{&log}, - } - }, - false, - }, - { - "Fail Evm", - func() { - contractAddr, err := suite.DeployContract("coin", "token", erc20Decimals) - suite.Require().NoError(err) - - pair, err := suite.app.Erc20Keeper.RegisterERC20(suite.ctx, contractAddr) - suite.Require().NoError(err) - - pair.ContractOwner = types.OWNER_MODULE - suite.app.Erc20Keeper.SetTokenPair(suite.ctx, *pair) - - topics := []common.Hash{transferEvent.ID, account.Hash(), types.ModuleAddress.Hash()} - log := ethtypes.Log{ - Topics: topics, - Data: transferData, - Address: contractAddr, - } - receipt = ðtypes.Receipt{ - Logs: []*ethtypes.Log{&log}, - } - }, - false, - }, - } - for _, tc := range testCases { - suite.Run(fmt.Sprintf("Case %s", tc.name), func() { - suite.mintFeeCollector = true - suite.SetupTest() - suite.ensureHooksSet() - suite.Commit() - - tc.malleate() - - err := suite.app.Erc20Keeper.Hooks().PostTxProcessing(suite.ctx, msg, receipt) - suite.Require().NoError(err) - - if tc.expConversion { - sender := sdk.AccAddress(account.Bytes()) - cosmosBalance := suite.app.BankKeeper.GetBalance(suite.ctx, sender, pair.Denom) - - transferEvent, err := erc20.Unpack("Transfer", transferData) - suite.Require().NoError(err) - - tokens, _ := transferEvent[0].(*big.Int) - suite.Require().Equal(cosmosBalance.Amount.String(), tokens.String()) - } - }) - } - suite.mintFeeCollector = false -} From 85b37e3fc5fb49750d324452f6efc36024b573a4 Mon Sep 17 00:00:00 2001 From: Vladislav Varadinov Date: Thu, 7 Dec 2023 11:54:43 +0200 Subject: [PATCH 022/345] chore(erc20): Remove CLI logic for coin conversion and registration (#2155) * chore(erc20): Remove CLI logic for Coin conversion and registration * fix: remove from app.go * CHANGELOG --- CHANGELOG.md | 1 + app/app.go | 2 +- x/erc20/client/cli/tx.go | 145 ----------------------------- x/erc20/client/cli/utils.go | 2 +- x/erc20/client/proposal_handler.go | 1 - 5 files changed, 3 insertions(+), 148 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c24e3a37f..bcd30c35e9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -54,6 +54,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (post) [#2128](https://github.com/evmos/evmos/pull/2128) Add `BurnDecorator` to `PostHandler` to burn cosmos transaction fees. - (fee-collector) [#2129] (https://github.com/evmos/evmos/pull/2129) Add `Burner` role to `FeeCollector` module. - (erc20) [#2154] (https://github.com/evmos/evmos/pull/2154) Remove evm hooks from `erc20` module. +- (erc20) [#2155] (https://github.com/evmos/evmos/pull/2155) Remove CLI commands for register and convert Coin. ### API Breaking diff --git a/app/app.go b/app/app.go index a4c9ed5c27..bd26724776 100644 --- a/app/app.go +++ b/app/app.go @@ -204,7 +204,7 @@ var ( paramsclient.ProposalHandler, upgradeclient.LegacyProposalHandler, upgradeclient.LegacyCancelProposalHandler, ibcclientclient.UpdateClientProposalHandler, ibcclientclient.UpgradeProposalHandler, // Evmos proposal types - erc20client.RegisterCoinProposalHandler, erc20client.RegisterERC20ProposalHandler, erc20client.ToggleTokenConversionProposalHandler, + erc20client.RegisterERC20ProposalHandler, erc20client.ToggleTokenConversionProposalHandler, vestingclient.RegisterClawbackProposalHandler, }, ), diff --git a/x/erc20/client/cli/tx.go b/x/erc20/client/cli/tx.go index b5339f3987..b5905f631e 100644 --- a/x/erc20/client/cli/tx.go +++ b/x/erc20/client/cli/tx.go @@ -35,59 +35,11 @@ func NewTxCmd() *cobra.Command { } txCmd.AddCommand( - NewConvertCoinCmd(), NewConvertERC20Cmd(), ) return txCmd } -// NewConvertCoinCmd returns a CLI command handler for converting a Cosmos coin -func NewConvertCoinCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "convert-coin COIN [RECEIVER_HEX]", - Short: "Convert a Cosmos coin to ERC20. When the receiver [optional] is omitted, the ERC20 tokens are transferred to the sender.", - Args: cobra.RangeArgs(1, 2), - RunE: func(cmd *cobra.Command, args []string) error { - cliCtx, err := client.GetClientTxContext(cmd) - if err != nil { - return err - } - - coin, err := sdk.ParseCoinNormalized(args[0]) - if err != nil { - return err - } - - var receiver string - sender := cliCtx.GetFromAddress() - - if len(args) == 2 { - receiver = args[1] - if err := evmostypes.ValidateAddress(receiver); err != nil { - return fmt.Errorf("invalid receiver hex address %w", err) - } - } else { - receiver = common.BytesToAddress(sender).Hex() - } - - msg := &types.MsgConvertCoin{ - Coin: coin, - Receiver: receiver, - Sender: sender.String(), - } - - if err := msg.ValidateBasic(); err != nil { - return err - } - - return tx.GenerateOrBroadcastTxCLI(cliCtx, cmd.Flags(), msg) - }, - } - - flags.AddTxFlagsToCmd(cmd) - return cmd -} - // NewConvertERC20Cmd returns a CLI command handler for converting an ERC20 func NewConvertERC20Cmd() *cobra.Command { cmd := &cobra.Command{ @@ -139,103 +91,6 @@ func NewConvertERC20Cmd() *cobra.Command { return cmd } -// NewRegisterCoinProposalCmd implements the command to submit a community-pool-spend proposal -func NewRegisterCoinProposalCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "register-coin METADATA_FILE", - Args: cobra.ExactArgs(1), - Short: "Submit a register coin proposal", - Long: `Submit a proposal to register a Cosmos coin to the erc20 along with an initial deposit. The proposal details must be supplied via a JSON file.`, - Example: fmt.Sprintf(`$ %s tx gov submit-legacy-proposal register-coin metadata.json --from= - -Where metadata.json contains (example): - -{ - "metadata": [ - { - "description": "The native staking and governance token of the Osmosis chain", - "denom_units": [ - { - "denom": "ibc/", - "exponent": 0, - "aliases": ["ibcuosmo"] - }, - { - "denom": "OSMO", - "exponent": 6 - } - ], - "base": "ibc/", - "display": "OSMO", - "name": "Osmo", - "symbol": "OSMO" - } - ] -}`, version.AppName, - ), - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx, err := client.GetClientTxContext(cmd) - if err != nil { - return err - } - - title, err := cmd.Flags().GetString(cli.FlagTitle) - if err != nil { - return err - } - - description, err := cmd.Flags().GetString(cli.FlagDescription) //nolint:staticcheck,nolintlint - if err != nil { - return err - } - - depositStr, err := cmd.Flags().GetString(cli.FlagDeposit) - if err != nil { - return err - } - - deposit, err := sdk.ParseCoinsNormalized(depositStr) - if err != nil { - return err - } - - metadata, err := ParseMetadata(clientCtx.Codec, args[0]) - if err != nil { - return err - } - - from := clientCtx.GetFromAddress() - - content := types.NewRegisterCoinProposal(title, description, metadata...) - - msg, err := govv1beta1.NewMsgSubmitProposal(content, deposit, from) - if err != nil { - return err - } - - if err := msg.ValidateBasic(); err != nil { - return err - } - - return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) - }, - } - - cmd.Flags().String(cli.FlagTitle, "", "title of proposal") - cmd.Flags().String(cli.FlagDescription, "", "description of proposal") //nolint:staticcheck,nolintlint - cmd.Flags().String(cli.FlagDeposit, "1aevmos", "deposit of proposal") - if err := cmd.MarkFlagRequired(cli.FlagTitle); err != nil { - panic(err) - } - if err := cmd.MarkFlagRequired(cli.FlagDescription); err != nil { //nolint:staticcheck,nolintlint - panic(err) - } - if err := cmd.MarkFlagRequired(cli.FlagDeposit); err != nil { - panic(err) - } - return cmd -} - // NewRegisterERC20ProposalCmd implements the command to submit a community-pool-spend proposal func NewRegisterERC20ProposalCmd() *cobra.Command { cmd := &cobra.Command{ diff --git a/x/erc20/client/cli/utils.go b/x/erc20/client/cli/utils.go index 6e700c12e3..1a6cac0047 100644 --- a/x/erc20/client/cli/utils.go +++ b/x/erc20/client/cli/utils.go @@ -13,7 +13,7 @@ import ( "github.com/evmos/evmos/v16/x/erc20/types" ) -// ParseRegisterCoinProposal reads and parses a ParseRegisterCoinProposal from a file. +// ParseMetadata reads and parses a ParseRegisterCoinProposal from a file. func ParseMetadata(cdc codec.JSONCodec, metadataFile string) ([]banktypes.Metadata, error) { proposalMetadata := types.ProposalMetadata{} diff --git a/x/erc20/client/proposal_handler.go b/x/erc20/client/proposal_handler.go index 919d85e8b1..c0927da26e 100644 --- a/x/erc20/client/proposal_handler.go +++ b/x/erc20/client/proposal_handler.go @@ -10,7 +10,6 @@ import ( ) var ( - RegisterCoinProposalHandler = govclient.NewProposalHandler(cli.NewRegisterCoinProposalCmd) RegisterERC20ProposalHandler = govclient.NewProposalHandler(cli.NewRegisterERC20ProposalCmd) ToggleTokenConversionProposalHandler = govclient.NewProposalHandler(cli.NewToggleTokenConversionProposalCmd) ) From 563ddedbc79dcc9581b4917683fa717d0b61225e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 7 Dec 2023 12:15:09 +0100 Subject: [PATCH 023/345] build(deps): bump actions/setup-go from 4 to 5 (#2160) Bumps [actions/setup-go](https://github.com/actions/setup-go) from 4 to 5. - [Release notes](https://github.com/actions/setup-go/releases) - [Commits](https://github.com/actions/setup-go/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/setup-go dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ante-benchmark.yml | 2 +- .github/workflows/auto-format.yml | 2 +- .github/workflows/build.yml | 2 +- .github/workflows/dependencies.yml | 2 +- .github/workflows/e2e-test-release.yml | 2 +- .github/workflows/e2e-test.yml | 2 +- .github/workflows/goreleaser.yml | 2 +- .github/workflows/lint.yml | 2 +- .github/workflows/solidity-test.yml | 2 +- .github/workflows/test.yml | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/ante-benchmark.yml b/.github/workflows/ante-benchmark.yml index 7ac5153cbe..e74b253521 100644 --- a/.github/workflows/ante-benchmark.yml +++ b/.github/workflows/ante-benchmark.yml @@ -20,7 +20,7 @@ jobs: uses: actions/checkout@v4 - name: Setup Golang - uses: actions/setup-go@v4 + uses: actions/setup-go@v5 with: go-version: '1.20' check-latest: true diff --git a/.github/workflows/auto-format.yml b/.github/workflows/auto-format.yml index 757fcdd071..59462e15ae 100644 --- a/.github/workflows/auto-format.yml +++ b/.github/workflows/auto-format.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/setup-go@v4 + - uses: actions/setup-go@v5 with: go-version: "1.20" check-latest: true diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 88cb79313b..96764eecdc 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: actions/setup-go@v4 + - uses: actions/setup-go@v5 with: go-version: '1.20' check-latest: true diff --git a/.github/workflows/dependencies.yml b/.github/workflows/dependencies.yml index 36c2f07cdc..4270835659 100644 --- a/.github/workflows/dependencies.yml +++ b/.github/workflows/dependencies.yml @@ -8,7 +8,7 @@ jobs: dependency-review: runs-on: ubuntu-latest steps: - - uses: actions/setup-go@v4 + - uses: actions/setup-go@v5 with: go-version: '1.20' check-latest: true diff --git a/.github/workflows/e2e-test-release.yml b/.github/workflows/e2e-test-release.yml index 2ae582ddb2..56179a2da9 100644 --- a/.github/workflows/e2e-test-release.yml +++ b/.github/workflows/e2e-test-release.yml @@ -11,7 +11,7 @@ jobs: test-e2e: runs-on: ubuntu-latest steps: - - uses: actions/setup-go@v4 + - uses: actions/setup-go@v5 with: go-version: '1.20' check-latest: true diff --git a/.github/workflows/e2e-test.yml b/.github/workflows/e2e-test.yml index 4f8020a9b3..1bcd14de01 100644 --- a/.github/workflows/e2e-test.yml +++ b/.github/workflows/e2e-test.yml @@ -11,7 +11,7 @@ jobs: test-e2e: runs-on: ubuntu-latest steps: - - uses: actions/setup-go@v4 + - uses: actions/setup-go@v5 with: go-version: '1.20' check-latest: true diff --git a/.github/workflows/goreleaser.yml b/.github/workflows/goreleaser.yml index f1dbbaa575..37e9650783 100644 --- a/.github/workflows/goreleaser.yml +++ b/.github/workflows/goreleaser.yml @@ -13,7 +13,7 @@ jobs: with: submodules: true - name: Set up Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v5 with: go-version: '1.20' check-latest: true diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 18c60f7ee9..2fafee545c 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -14,7 +14,7 @@ jobs: timeout-minutes: 10 steps: # Required: setup-go, for all versions v3.0.0+ of golangci-lint - - uses: actions/setup-go@v4 + - uses: actions/setup-go@v5 with: go-version: '1.20' check-latest: true diff --git a/.github/workflows/solidity-test.yml b/.github/workflows/solidity-test.yml index a973968741..18ce2717fa 100644 --- a/.github/workflows/solidity-test.yml +++ b/.github/workflows/solidity-test.yml @@ -9,7 +9,7 @@ jobs: test-solidity: runs-on: ubuntu-latest steps: - - uses: actions/setup-go@v4 + - uses: actions/setup-go@v5 with: go-version: '1.20' check-latest: true diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9a206b4a33..8256cffc7d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -18,7 +18,7 @@ jobs: test-unit-cover: runs-on: ubuntu-latest steps: - - uses: actions/setup-go@v4 + - uses: actions/setup-go@v5 with: go-version: '1.20' check-latest: true From 69777607bd516f6d487d8e4cce76ccedf8bbdc98 Mon Sep 17 00:00:00 2001 From: Vladislav Varadinov Date: Thu, 7 Dec 2023 16:22:43 +0200 Subject: [PATCH 024/345] chore(erc20): Remove RegisterCoin proposal logic, protos, types and related tests (#2157) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(erc20): Remove RegisterCoin proposal logic and related tests * CHANGELOG --------- Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> --- CHANGELOG.md | 1 + proto/evmos/erc20/v1/erc20.proto | 20 -- x/erc20/client/cli/utils.go | 30 -- x/erc20/client/cli/utils_test.go | 51 --- x/erc20/keeper/integration_test.go | 59 --- x/erc20/keeper/proposals_test.go | 148 -------- x/erc20/proposal_handler.go | 27 -- x/erc20/types/codec.go | 1 - x/erc20/types/erc20.pb.go | 538 ++-------------------------- x/erc20/types/proposal.go | 68 ---- x/erc20/types/proposal_test.go | 92 ----- x/evm/migrations/v6/types/evm.pb.go | 2 +- 12 files changed, 32 insertions(+), 1005 deletions(-) delete mode 100644 x/erc20/client/cli/utils.go delete mode 100644 x/erc20/client/cli/utils_test.go diff --git a/CHANGELOG.md b/CHANGELOG.md index bcd30c35e9..e20d3f9a74 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -55,6 +55,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (fee-collector) [#2129] (https://github.com/evmos/evmos/pull/2129) Add `Burner` role to `FeeCollector` module. - (erc20) [#2154] (https://github.com/evmos/evmos/pull/2154) Remove evm hooks from `erc20` module. - (erc20) [#2155] (https://github.com/evmos/evmos/pull/2155) Remove CLI commands for register and convert Coin. +- (erc20) [#2157] (https://github.com/evmos/evmos/pull/2157) Remove `RegisterCoinProposal` logic, protos and related tests. ### API Breaking diff --git a/proto/evmos/erc20/v1/erc20.proto b/proto/evmos/erc20/v1/erc20.proto index f1caabf853..6579b17b90 100644 --- a/proto/evmos/erc20/v1/erc20.proto +++ b/proto/evmos/erc20/v1/erc20.proto @@ -3,7 +3,6 @@ syntax = "proto3"; package evmos.erc20.v1; -import "cosmos/bank/v1beta1/bank.proto"; import "gogoproto/gogo.proto"; option go_package = "github.com/evmos/evmos/v16/x/erc20/types"; @@ -32,18 +31,6 @@ message TokenPair { Owner contract_owner = 4; } -// RegisterCoinProposal is a gov Content type to register a token pair for a -// native Cosmos coin. -message RegisterCoinProposal { - option (gogoproto.equal) = false; - // title of the proposal - string title = 1; - // description of the proposal - string description = 2; - // metadata slice of the native Cosmos coins - repeated cosmos.bank.v1beta1.Metadata metadata = 3 [(gogoproto.nullable) = false]; -} - // RegisterERC20Proposal is a gov Content type to register a token pair for an // ERC20 token message RegisterERC20Proposal { @@ -68,10 +55,3 @@ message ToggleTokenConversionProposal { // Cosmos base denomination string token = 3; } - -// ProposalMetadata is used to parse a slice of denom metadata and generate -// the RegisterCoinProposal content. -message ProposalMetadata { - // metadata slice of the native Cosmos coins - repeated cosmos.bank.v1beta1.Metadata metadata = 1 [(gogoproto.nullable) = false]; -} diff --git a/x/erc20/client/cli/utils.go b/x/erc20/client/cli/utils.go deleted file mode 100644 index 1a6cac0047..0000000000 --- a/x/erc20/client/cli/utils.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package cli - -import ( - "fmt" - "os" - "path/filepath" - - "github.com/cosmos/cosmos-sdk/codec" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/evmos/evmos/v16/x/erc20/types" -) - -// ParseMetadata reads and parses a ParseRegisterCoinProposal from a file. -func ParseMetadata(cdc codec.JSONCodec, metadataFile string) ([]banktypes.Metadata, error) { - proposalMetadata := types.ProposalMetadata{} - - contents, err := os.ReadFile(filepath.Clean(metadataFile)) - if err != nil { - return nil, err - } - - if err = cdc.UnmarshalJSON(contents, &proposalMetadata); err != nil { - return nil, fmt.Errorf("failed to unmarshal proposal metadata: %w", err) - } - - return proposalMetadata.Metadata, nil -} diff --git a/x/erc20/client/cli/utils_test.go b/x/erc20/client/cli/utils_test.go deleted file mode 100644 index 285109f6a5..0000000000 --- a/x/erc20/client/cli/utils_test.go +++ /dev/null @@ -1,51 +0,0 @@ -package cli - -import ( - "testing" - - "github.com/evmos/evmos/v16/x/erc20/types" - "github.com/stretchr/testify/require" -) - -func TestParseMetadata(t *testing.T) { - testCases := []struct { - name string - metadataFile string - expAmtCoins int - expPass bool - }{ - { - "fail - invalid file name", - "", - 0, - false, - }, - { - "fail - invalid metadata", - "metadata/invalid_metadata_test.json", - 0, - false, - }, - { - "single coin metadata", - "metadata/coin_metadata_test.json", - 1, - true, - }, - { - "multiple coins metadata", - "metadata/coins_metadata_test.json", - 2, - true, - }, - } - for _, tc := range testCases { - metadata, err := ParseMetadata(types.AminoCdc, tc.metadataFile) - if tc.expPass { - require.NoError(t, err) - require.Equal(t, tc.expAmtCoins, len(metadata)) - } else { - require.Error(t, err) - } - } -} diff --git a/x/erc20/keeper/integration_test.go b/x/erc20/keeper/integration_test.go index e74a52f5fb..cc4772cc8d 100644 --- a/x/erc20/keeper/integration_test.go +++ b/x/erc20/keeper/integration_test.go @@ -2,7 +2,6 @@ package keeper_test import ( "math/big" - "time" "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" @@ -14,7 +13,6 @@ import ( . "github.com/onsi/gomega" abci "github.com/cometbft/cometbft/abci/types" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" @@ -123,58 +121,6 @@ var _ = Describe("ERC20:", Ordered, func() { s.Require().NoError(err) s.Commit() }) - Describe("for a single Cosmos Coin", func() { - BeforeEach(func() { - id, err := submitRegisterCoinProposal(s.ctx, s.app, privKey, []banktypes.Metadata{metadataIbc}) - s.Require().NoError(err) - - proposal, found := s.app.GovKeeper.GetProposal(s.ctx, id) - s.Require().True(found) - - _, err = testutil.Delegate(s.ctx, s.app, privKey, sdk.NewCoin("aevmos", math.NewInt(500000000000000000)), s.validator) - s.Require().NoError(err) - - _, err = testutil.Vote(s.ctx, s.app, privKey, id, govv1beta1.OptionYes) - s.Require().NoError(err) - - // Make proposal pass in EndBlocker - duration := proposal.VotingEndTime.Sub(s.ctx.BlockTime()) + time.Hour*1 - s.CommitAndBeginBlockAfter(duration) - s.app.EndBlocker(s.ctx, abci.RequestEndBlock{Height: s.ctx.BlockHeight()}) - proposal, _ = s.app.GovKeeper.GetProposal(s.ctx, id) - }) - It("should create a token pairs owned by the erc20 module", func() { - tokenPairs := s.app.Erc20Keeper.GetTokenPairs(s.ctx) - s.Require().Equal(1, len(tokenPairs)) - s.Require().Equal(types.OWNER_MODULE, tokenPairs[0].ContractOwner) - }) - }) - Describe("for multiple Cosmos Coins", func() { - BeforeEach(func() { - id, err := submitRegisterCoinProposal(s.ctx, s.app, privKey, []banktypes.Metadata{metadataIbc, metadataCoin}) - s.Require().NoError(err) - - proposal, found := s.app.GovKeeper.GetProposal(s.ctx, id) - s.Require().True(found) - - _, err = testutil.Delegate(s.ctx, s.app, privKey, sdk.NewCoin("aevmos", math.NewInt(500000000000000000)), s.validator) - s.Require().NoError(err) - - _, err = testutil.Vote(s.ctx, s.app, privKey, id, govv1beta1.OptionYes) - s.Require().NoError(err) - - // Make proposal pass in EndBlocker - duration := proposal.VotingEndTime.Sub(s.ctx.BlockTime()) + 1 - s.CommitAndBeginBlockAfter(duration) - s.app.EndBlocker(s.ctx, abci.RequestEndBlock{Height: s.ctx.BlockHeight()}) - s.Commit() - }) - It("should create a token pairs owned by the erc20 module", func() { - tokenPairs := s.app.Erc20Keeper.GetTokenPairs(s.ctx) - s.Require().Equal(2, len(tokenPairs)) - s.Require().Equal(types.OWNER_MODULE, tokenPairs[0].ContractOwner) - }) - }) }) Context("with deployed contracts", func() { BeforeEach(func() { @@ -369,11 +315,6 @@ var _ = Describe("ERC20:", Ordered, func() { }) }) -func submitRegisterCoinProposal(ctx sdk.Context, appEvmos *app.Evmos, pk *ethsecp256k1.PrivKey, metadata []banktypes.Metadata) (id uint64, err error) { - content := types.NewRegisterCoinProposal("test Coin", "foo", metadata...) - return testutil.SubmitProposal(ctx, appEvmos, pk, content, 8) -} - func submitRegisterERC20Proposal(ctx sdk.Context, appEvmos *app.Evmos, pk *ethsecp256k1.PrivKey, addrs []string) (id uint64, err error) { content := types.NewRegisterERC20Proposal("test token", "foo", addrs...) return testutil.SubmitProposal(ctx, appEvmos, pk, content, 8) diff --git a/x/erc20/keeper/proposals_test.go b/x/erc20/keeper/proposals_test.go index 3847723078..57e9a6ed68 100644 --- a/x/erc20/keeper/proposals_test.go +++ b/x/erc20/keeper/proposals_test.go @@ -8,7 +8,6 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/ethereum/go-ethereum/common" - utiltx "github.com/evmos/evmos/v16/testutil/tx" "github.com/evmos/evmos/v16/x/erc20/keeper" "github.com/evmos/evmos/v16/x/erc20/types" erc20mocks "github.com/evmos/evmos/v16/x/erc20/types/mocks" @@ -104,153 +103,6 @@ func (suite *KeeperTestSuite) setupRegisterCoin(metadata banktypes.Metadata) *ty return pair } -func (suite KeeperTestSuite) TestRegisterCoin() { //nolint:govet // we can copy locks here because it is a test - metadata := banktypes.Metadata{ - Description: "description", - Base: cosmosTokenBase, - // NOTE: Denom units MUST be increasing - DenomUnits: []*banktypes.DenomUnit{ - { - Denom: cosmosTokenBase, - Exponent: 0, - }, - { - Denom: cosmosTokenDisplay, - Exponent: defaultExponent, - }, - }, - Name: cosmosTokenBase, - Symbol: erc20Symbol, - Display: cosmosTokenDisplay, - } - - testCases := []struct { - name string - malleate func() - expPass bool - }{ - { - "conversion is disabled globally", - func() { - params := types.DefaultParams() - params.EnableErc20 = false - suite.app.Erc20Keeper.SetParams(suite.ctx, params) //nolint:errcheck - }, - false, - }, - { - "denom already registered", - func() { - regPair := types.NewTokenPair(utiltx.GenerateAddress(), metadata.Base, types.OWNER_MODULE) - suite.app.Erc20Keeper.SetDenomMap(suite.ctx, regPair.Denom, regPair.GetID()) - suite.Commit() - }, - false, - }, - { - "token doesn't have supply", - func() { - }, - false, - }, - { - "metadata different that stored", - func() { - metadata.Base = cosmosTokenBase - validMetadata := banktypes.Metadata{ - Description: "description", - Base: cosmosTokenBase, - // NOTE: Denom units MUST be increasing - DenomUnits: []*banktypes.DenomUnit{ - { - Denom: cosmosTokenBase, - Exponent: 0, - }, - { - Denom: cosmosTokenDisplay, - Exponent: uint32(18), - }, - }, - Name: erc20Name, - Symbol: erc20Symbol, - Display: cosmosTokenDisplay, - } - - err := suite.app.BankKeeper.MintCoins(suite.ctx, inflationtypes.ModuleName, sdk.Coins{sdk.NewInt64Coin(validMetadata.Base, 1)}) - suite.Require().NoError(err) - suite.app.BankKeeper.SetDenomMetaData(suite.ctx, validMetadata) - }, - false, - }, - { - "ok", - func() { - metadata.Base = cosmosTokenBase - err := suite.app.BankKeeper.MintCoins(suite.ctx, inflationtypes.ModuleName, sdk.Coins{sdk.NewInt64Coin(metadata.Base, 1)}) - suite.Require().NoError(err) - }, - true, - }, - { - "force fail evm", - func() { - metadata.Base = cosmosTokenBase - err := suite.app.BankKeeper.MintCoins(suite.ctx, inflationtypes.ModuleName, sdk.Coins{sdk.NewInt64Coin(metadata.Base, 1)}) - suite.Require().NoError(err) - - mockEVMKeeper := &erc20mocks.EVMKeeper{} - - suite.app.Erc20Keeper = keeper.NewKeeper( - suite.app.GetKey("erc20"), suite.app.AppCodec(), - authtypes.NewModuleAddress(govtypes.ModuleName), suite.app.AccountKeeper, - suite.app.BankKeeper, mockEVMKeeper, suite.app.StakingKeeper, - suite.app.AuthzKeeper, &suite.app.TransferKeeper, - ) - - mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil) - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced ApplyMessage error")) - }, - false, - }, - { - "force delete module account evm", - func() { - metadata.Base = cosmosTokenBase - err := suite.app.BankKeeper.MintCoins(suite.ctx, inflationtypes.ModuleName, sdk.Coins{sdk.NewInt64Coin(metadata.Base, 1)}) - suite.Require().NoError(err) - - acc := suite.app.AccountKeeper.GetAccount(suite.ctx, types.ModuleAddress.Bytes()) - suite.app.AccountKeeper.RemoveAccount(suite.ctx, acc) - }, - false, - }, - } - for _, tc := range testCases { - suite.Run(fmt.Sprintf("Case %s", tc.name), func() { - suite.SetupTest() // reset - - tc.malleate() - - pair, err := suite.app.Erc20Keeper.RegisterCoin(suite.ctx, metadata) - suite.Commit() - - expPair := &types.TokenPair{ - Erc20Address: "0x80b5a32E4F032B2a058b4F29EC95EEfEEB87aDcd", - Denom: "acoin", - Enabled: true, - ContractOwner: 1, - } - - if tc.expPass { - suite.Require().NoError(err, tc.name) - suite.Require().Equal(pair, expPair) - } else { - suite.Require().Error(err, tc.name) - } - }) - } -} - func (suite KeeperTestSuite) TestRegisterERC20() { //nolint:govet // we can copy locks here because it is a test var ( contractAddr common.Address diff --git a/x/erc20/proposal_handler.go b/x/erc20/proposal_handler.go index e6764b9568..64110939a7 100644 --- a/x/erc20/proposal_handler.go +++ b/x/erc20/proposal_handler.go @@ -25,8 +25,6 @@ func NewErc20ProposalHandler(k *keeper.Keeper) govv1beta1.Handler { } switch c := content.(type) { - case *types.RegisterCoinProposal: - return handleRegisterCoinProposal(ctx, k, c) case *types.RegisterERC20Proposal: return handleRegisterERC20Proposal(ctx, k, c) case *types.ToggleTokenConversionProposal: @@ -38,31 +36,6 @@ func NewErc20ProposalHandler(k *keeper.Keeper) govv1beta1.Handler { } } -// handleRegisterCoinProposal handles the registration proposal for multiple -// native Cosmos coins -func handleRegisterCoinProposal( - ctx sdk.Context, - k *keeper.Keeper, - p *types.RegisterCoinProposal, -) error { - for _, metadata := range p.Metadata { - pair, err := k.RegisterCoin(ctx, metadata) - if err != nil { - return err - } - - ctx.EventManager().EmitEvent( - sdk.NewEvent( - types.EventTypeRegisterCoin, - sdk.NewAttribute(types.AttributeKeyCosmosCoin, pair.Denom), - sdk.NewAttribute(types.AttributeKeyERC20Token, pair.Erc20Address), - ), - ) - } - - return nil -} - // handleRegisterERC20Proposal handles the registration proposal for multiple // ERC20 tokens func handleRegisterERC20Proposal( diff --git a/x/erc20/types/codec.go b/x/erc20/types/codec.go index 61c9da0afe..d04c1d4071 100644 --- a/x/erc20/types/codec.go +++ b/x/erc20/types/codec.go @@ -48,7 +48,6 @@ func RegisterInterfaces(registry codectypes.InterfaceRegistry) { ) registry.RegisterImplementations( (*govv1beta1.Content)(nil), - &RegisterCoinProposal{}, &RegisterERC20Proposal{}, &ToggleTokenConversionProposal{}, ) diff --git a/x/erc20/types/erc20.pb.go b/x/erc20/types/erc20.pb.go index 81c439455f..370b9d3e70 100644 --- a/x/erc20/types/erc20.pb.go +++ b/x/erc20/types/erc20.pb.go @@ -5,7 +5,6 @@ package types import ( fmt "fmt" - types "github.com/cosmos/cosmos-sdk/x/bank/types" _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" io "io" @@ -130,71 +129,6 @@ func (m *TokenPair) GetContractOwner() Owner { return OWNER_UNSPECIFIED } -// RegisterCoinProposal is a gov Content type to register a token pair for a -// native Cosmos coin. -type RegisterCoinProposal struct { - // title of the proposal - Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` - // description of the proposal - Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` - // metadata slice of the native Cosmos coins - Metadata []types.Metadata `protobuf:"bytes,3,rep,name=metadata,proto3" json:"metadata"` -} - -func (m *RegisterCoinProposal) Reset() { *m = RegisterCoinProposal{} } -func (m *RegisterCoinProposal) String() string { return proto.CompactTextString(m) } -func (*RegisterCoinProposal) ProtoMessage() {} -func (*RegisterCoinProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_668d5dc537f45142, []int{1} -} -func (m *RegisterCoinProposal) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RegisterCoinProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RegisterCoinProposal.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *RegisterCoinProposal) XXX_Merge(src proto.Message) { - xxx_messageInfo_RegisterCoinProposal.Merge(m, src) -} -func (m *RegisterCoinProposal) XXX_Size() int { - return m.Size() -} -func (m *RegisterCoinProposal) XXX_DiscardUnknown() { - xxx_messageInfo_RegisterCoinProposal.DiscardUnknown(m) -} - -var xxx_messageInfo_RegisterCoinProposal proto.InternalMessageInfo - -func (m *RegisterCoinProposal) GetTitle() string { - if m != nil { - return m.Title - } - return "" -} - -func (m *RegisterCoinProposal) GetDescription() string { - if m != nil { - return m.Description - } - return "" -} - -func (m *RegisterCoinProposal) GetMetadata() []types.Metadata { - if m != nil { - return m.Metadata - } - return nil -} - // RegisterERC20Proposal is a gov Content type to register a token pair for an // ERC20 token type RegisterERC20Proposal struct { @@ -210,7 +144,7 @@ func (m *RegisterERC20Proposal) Reset() { *m = RegisterERC20Proposal{} } func (m *RegisterERC20Proposal) String() string { return proto.CompactTextString(m) } func (*RegisterERC20Proposal) ProtoMessage() {} func (*RegisterERC20Proposal) Descriptor() ([]byte, []int) { - return fileDescriptor_668d5dc537f45142, []int{2} + return fileDescriptor_668d5dc537f45142, []int{1} } func (m *RegisterERC20Proposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -276,7 +210,7 @@ func (m *ToggleTokenConversionProposal) Reset() { *m = ToggleTokenConver func (m *ToggleTokenConversionProposal) String() string { return proto.CompactTextString(m) } func (*ToggleTokenConversionProposal) ProtoMessage() {} func (*ToggleTokenConversionProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_668d5dc537f45142, []int{3} + return fileDescriptor_668d5dc537f45142, []int{2} } func (m *ToggleTokenConversionProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -326,98 +260,44 @@ func (m *ToggleTokenConversionProposal) GetToken() string { return "" } -// ProposalMetadata is used to parse a slice of denom metadata and generate -// the RegisterCoinProposal content. -type ProposalMetadata struct { - // metadata slice of the native Cosmos coins - Metadata []types.Metadata `protobuf:"bytes,1,rep,name=metadata,proto3" json:"metadata"` -} - -func (m *ProposalMetadata) Reset() { *m = ProposalMetadata{} } -func (m *ProposalMetadata) String() string { return proto.CompactTextString(m) } -func (*ProposalMetadata) ProtoMessage() {} -func (*ProposalMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_668d5dc537f45142, []int{4} -} -func (m *ProposalMetadata) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ProposalMetadata) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ProposalMetadata.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *ProposalMetadata) XXX_Merge(src proto.Message) { - xxx_messageInfo_ProposalMetadata.Merge(m, src) -} -func (m *ProposalMetadata) XXX_Size() int { - return m.Size() -} -func (m *ProposalMetadata) XXX_DiscardUnknown() { - xxx_messageInfo_ProposalMetadata.DiscardUnknown(m) -} - -var xxx_messageInfo_ProposalMetadata proto.InternalMessageInfo - -func (m *ProposalMetadata) GetMetadata() []types.Metadata { - if m != nil { - return m.Metadata - } - return nil -} - func init() { proto.RegisterEnum("evmos.erc20.v1.Owner", Owner_name, Owner_value) proto.RegisterType((*TokenPair)(nil), "evmos.erc20.v1.TokenPair") - proto.RegisterType((*RegisterCoinProposal)(nil), "evmos.erc20.v1.RegisterCoinProposal") proto.RegisterType((*RegisterERC20Proposal)(nil), "evmos.erc20.v1.RegisterERC20Proposal") proto.RegisterType((*ToggleTokenConversionProposal)(nil), "evmos.erc20.v1.ToggleTokenConversionProposal") - proto.RegisterType((*ProposalMetadata)(nil), "evmos.erc20.v1.ProposalMetadata") } func init() { proto.RegisterFile("evmos/erc20/v1/erc20.proto", fileDescriptor_668d5dc537f45142) } var fileDescriptor_668d5dc537f45142 = []byte{ - // 504 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x53, 0xcf, 0x6b, 0xd4, 0x40, - 0x14, 0xce, 0x74, 0xb7, 0xda, 0x9d, 0xb6, 0x21, 0x0e, 0xbb, 0x10, 0x16, 0x9a, 0x86, 0x15, 0x24, - 0x78, 0x48, 0x9a, 0x15, 0x3c, 0x88, 0x20, 0xdd, 0x6d, 0x84, 0x4a, 0xbb, 0xbb, 0xa4, 0x5b, 0x14, - 0x2f, 0xcb, 0x24, 0x19, 0x62, 0xe8, 0x6e, 0x66, 0x99, 0x19, 0xa3, 0x1e, 0xbc, 0x7b, 0xf4, 0xe2, - 0x5d, 0xd0, 0x3f, 0xa6, 0xc7, 0x1e, 0x3d, 0x89, 0xec, 0x5e, 0xfc, 0x33, 0x24, 0x33, 0x89, 0x58, - 0x8f, 0xed, 0x25, 0xbc, 0xef, 0x7b, 0x3f, 0xf2, 0xcd, 0xf7, 0x78, 0xb0, 0x4b, 0x8a, 0x05, 0xe5, - 0x1e, 0x61, 0x71, 0xff, 0xc0, 0x2b, 0x7c, 0x15, 0xb8, 0x4b, 0x46, 0x05, 0x45, 0xba, 0xcc, 0xb9, - 0x8a, 0x2a, 0xfc, 0xae, 0x15, 0x53, 0x5e, 0x16, 0x47, 0x38, 0xbf, 0xf0, 0x0a, 0x3f, 0x22, 0x02, - 0xfb, 0x12, 0xa8, 0xfa, 0x6e, 0x3b, 0xa5, 0x29, 0x95, 0xa1, 0x57, 0x46, 0x8a, 0xed, 0x7d, 0x07, - 0xb0, 0x35, 0xa5, 0x17, 0x24, 0x9f, 0xe0, 0x8c, 0xa1, 0xfb, 0x70, 0x57, 0xce, 0x9b, 0xe1, 0x24, - 0x61, 0x84, 0x73, 0x13, 0xd8, 0xc0, 0x69, 0x85, 0x3b, 0x92, 0x3c, 0x54, 0x1c, 0x6a, 0xc3, 0xcd, - 0x84, 0xe4, 0x74, 0x61, 0x6e, 0xc8, 0xa4, 0x02, 0xc8, 0x84, 0x77, 0x49, 0x8e, 0xa3, 0x39, 0x49, - 0xcc, 0x86, 0x0d, 0x9c, 0xad, 0xb0, 0x86, 0xe8, 0x29, 0xd4, 0x63, 0x9a, 0x0b, 0x86, 0x63, 0x31, - 0xa3, 0xef, 0x72, 0xc2, 0xcc, 0xa6, 0x0d, 0x1c, 0xbd, 0xdf, 0x71, 0xaf, 0xbf, 0xc0, 0x1d, 0x97, - 0xc9, 0x70, 0xb7, 0x2e, 0x96, 0xf0, 0x49, 0xf3, 0xf7, 0xd7, 0x7d, 0xd0, 0xfb, 0x02, 0x60, 0x3b, - 0x24, 0x69, 0xc6, 0x05, 0x61, 0x43, 0x9a, 0xe5, 0x13, 0x46, 0x97, 0x94, 0xe3, 0x79, 0x29, 0x46, - 0x64, 0x62, 0x4e, 0x2a, 0xa5, 0x0a, 0x20, 0x1b, 0x6e, 0x27, 0x84, 0xc7, 0x2c, 0x5b, 0x8a, 0x8c, - 0xe6, 0x95, 0xd0, 0x7f, 0x29, 0xf4, 0x0c, 0x6e, 0x2d, 0x88, 0xc0, 0x09, 0x16, 0xd8, 0x6c, 0xd8, - 0x0d, 0x67, 0xbb, 0xbf, 0xe7, 0x2a, 0x03, 0x5d, 0xe9, 0x59, 0x65, 0xa0, 0x7b, 0x5a, 0x15, 0x0d, - 0x9a, 0x97, 0x3f, 0xf7, 0xb5, 0xf0, 0x6f, 0x93, 0xd4, 0xa5, 0xf5, 0x3e, 0xc2, 0x4e, 0x2d, 0x2b, - 0x08, 0x87, 0xfd, 0x83, 0x5b, 0xeb, 0x7a, 0x00, 0x75, 0xe9, 0x47, 0xb5, 0x00, 0xc2, 0xa5, 0xba, - 0x56, 0xf8, 0x1f, 0x5b, 0xfd, 0x9e, 0xc3, 0xbd, 0x29, 0x4d, 0xd3, 0x39, 0x91, 0x2b, 0x1c, 0xd2, - 0xbc, 0x20, 0x8c, 0x67, 0xf4, 0xf6, 0xf6, 0x94, 0x7d, 0xe5, 0x48, 0xb9, 0xcb, 0xb2, 0xaf, 0x04, - 0xd5, 0x2e, 0xce, 0xa0, 0x51, 0xcf, 0xaf, 0xdd, 0xb9, 0x66, 0x27, 0xb8, 0x81, 0x9d, 0x0f, 0x5f, - 0xc0, 0x4d, 0xb9, 0x6f, 0xd4, 0x81, 0xf7, 0xc6, 0x2f, 0x47, 0x41, 0x38, 0x3b, 0x1f, 0x9d, 0x4d, - 0x82, 0xe1, 0xf1, 0xf3, 0xe3, 0xe0, 0xc8, 0xd0, 0x90, 0x01, 0x77, 0x14, 0x7d, 0x3a, 0x3e, 0x3a, - 0x3f, 0x09, 0x0c, 0x80, 0x10, 0xd4, 0x15, 0x13, 0xbc, 0x9a, 0x06, 0xe1, 0xe8, 0xf0, 0xc4, 0xd8, - 0xe8, 0x36, 0x3f, 0x7d, 0xb3, 0xb4, 0xc1, 0xe0, 0x72, 0x65, 0x81, 0xab, 0x95, 0x05, 0x7e, 0xad, - 0x2c, 0xf0, 0x79, 0x6d, 0x69, 0x57, 0x6b, 0x4b, 0xfb, 0xb1, 0xb6, 0xb4, 0xd7, 0x4e, 0x9a, 0x89, - 0x37, 0x6f, 0x23, 0x37, 0xa6, 0x0b, 0xaf, 0x3a, 0x2d, 0xf9, 0x2d, 0xfc, 0xc7, 0xde, 0xfb, 0xea, - 0xcc, 0xc4, 0x87, 0x25, 0xe1, 0xd1, 0x1d, 0x79, 0x1e, 0x8f, 0xfe, 0x04, 0x00, 0x00, 0xff, 0xff, - 0x17, 0xbe, 0x33, 0xa1, 0x82, 0x03, 0x00, 0x00, + // 425 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x52, 0x41, 0x8b, 0xd3, 0x40, + 0x14, 0xce, 0x6c, 0xbb, 0x6a, 0xc7, 0xdd, 0x50, 0x87, 0x2d, 0x84, 0x82, 0x31, 0x54, 0x90, 0xe0, + 0x21, 0xd9, 0x56, 0xf0, 0x20, 0x5e, 0x76, 0xbb, 0x11, 0x56, 0xd6, 0xb6, 0xc4, 0x2e, 0x8a, 0x97, + 0x92, 0x26, 0x8f, 0x18, 0x6c, 0xe7, 0x85, 0x99, 0x31, 0xea, 0xc1, 0xbb, 0x47, 0x7f, 0x82, 0xa0, + 0x3f, 0xc6, 0xe3, 0x1e, 0x3d, 0x4a, 0x7b, 0xf1, 0x67, 0x48, 0x66, 0x52, 0x50, 0xaf, 0x5e, 0x86, + 0xf7, 0x7d, 0xdf, 0x7b, 0xf3, 0xbe, 0xf7, 0x78, 0xb4, 0x0f, 0xd5, 0x1a, 0x65, 0x08, 0x22, 0x1d, + 0x1d, 0x87, 0xd5, 0xd0, 0x04, 0x41, 0x29, 0x50, 0x21, 0xb3, 0xb5, 0x16, 0x18, 0xaa, 0x1a, 0xf6, + 0x8f, 0x72, 0xcc, 0x51, 0x4b, 0x61, 0x1d, 0x99, 0xac, 0xc1, 0x37, 0x42, 0x3b, 0x73, 0x7c, 0x03, + 0x7c, 0x96, 0x14, 0x82, 0xdd, 0xa5, 0x87, 0x3a, 0x7f, 0x91, 0x64, 0x99, 0x00, 0x29, 0x1d, 0xe2, + 0x11, 0xbf, 0x13, 0x1f, 0x68, 0xf2, 0xc4, 0x70, 0xec, 0x88, 0xee, 0x67, 0xc0, 0x71, 0xed, 0xec, + 0x69, 0xd1, 0x00, 0xe6, 0xd0, 0xeb, 0xc0, 0x93, 0xe5, 0x0a, 0x32, 0xa7, 0xe5, 0x11, 0xff, 0x46, + 0xbc, 0x83, 0xec, 0x31, 0xb5, 0x53, 0xe4, 0x4a, 0x24, 0xa9, 0x5a, 0xe0, 0x3b, 0x0e, 0xc2, 0x69, + 0x7b, 0xc4, 0xb7, 0x47, 0xbd, 0xe0, 0x6f, 0x87, 0xc1, 0xb4, 0x16, 0xe3, 0xc3, 0x5d, 0xb2, 0x86, + 0x8f, 0xda, 0xbf, 0xbe, 0xdc, 0x21, 0x83, 0x8f, 0xb4, 0x17, 0x43, 0x5e, 0x48, 0x05, 0x22, 0x8a, + 0xc7, 0xa3, 0xe3, 0x99, 0xc0, 0x12, 0x65, 0xb2, 0xaa, 0xcd, 0xa8, 0x42, 0xad, 0xa0, 0x71, 0x6a, + 0x00, 0xf3, 0xe8, 0xcd, 0x0c, 0x64, 0x2a, 0x8a, 0x52, 0x15, 0xc8, 0x1b, 0xa3, 0x7f, 0x52, 0xec, + 0x1e, 0xb5, 0x75, 0xdf, 0x66, 0x50, 0x90, 0x4e, 0xcb, 0x6b, 0xf9, 0x9d, 0xf8, 0x1f, 0x56, 0xb7, + 0xb7, 0x06, 0x92, 0xde, 0x9e, 0x63, 0x9e, 0xaf, 0x40, 0xaf, 0x6a, 0x8c, 0xbc, 0x02, 0x21, 0x0b, + 0xe4, 0xff, 0x6d, 0xa3, 0xae, 0xab, 0xbf, 0xd4, 0x3b, 0xab, 0xeb, 0x6a, 0x60, 0x66, 0xbe, 0xff, + 0x94, 0xee, 0xeb, 0x15, 0xb0, 0x1e, 0xbd, 0x35, 0x7d, 0x31, 0x89, 0xe2, 0xc5, 0xe5, 0xe4, 0xf9, + 0x2c, 0x1a, 0x9f, 0x3f, 0x39, 0x8f, 0xce, 0xba, 0x16, 0xeb, 0xd2, 0x03, 0x43, 0x3f, 0x9b, 0x9e, + 0x5d, 0x5e, 0x44, 0x5d, 0xc2, 0x18, 0xb5, 0x0d, 0x13, 0xbd, 0x9c, 0x47, 0xf1, 0xe4, 0xe4, 0xa2, + 0xbb, 0xd7, 0x6f, 0x7f, 0xfa, 0xea, 0x5a, 0xa7, 0xa7, 0xdf, 0x37, 0x2e, 0xb9, 0xda, 0xb8, 0xe4, + 0xe7, 0xc6, 0x25, 0x9f, 0xb7, 0xae, 0x75, 0xb5, 0x75, 0xad, 0x1f, 0x5b, 0xd7, 0x7a, 0xe5, 0xe7, + 0x85, 0x7a, 0xfd, 0x76, 0x19, 0xa4, 0xb8, 0x0e, 0x9b, 0x6b, 0xd2, 0x6f, 0x35, 0x7c, 0x18, 0xbe, + 0x6f, 0x2e, 0x4b, 0x7d, 0x28, 0x41, 0x2e, 0xaf, 0xe9, 0x8b, 0x79, 0xf0, 0x3b, 0x00, 0x00, 0xff, + 0xff, 0x87, 0x11, 0x69, 0x94, 0x75, 0x02, 0x00, 0x00, } func (this *TokenPair) Equal(that interface{}) bool { @@ -535,57 +415,6 @@ func (m *TokenPair) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *RegisterCoinProposal) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *RegisterCoinProposal) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RegisterCoinProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Metadata) > 0 { - for iNdEx := len(m.Metadata) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Metadata[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintErc20(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } - if len(m.Description) > 0 { - i -= len(m.Description) - copy(dAtA[i:], m.Description) - i = encodeVarintErc20(dAtA, i, uint64(len(m.Description))) - i-- - dAtA[i] = 0x12 - } - if len(m.Title) > 0 { - i -= len(m.Title) - copy(dAtA[i:], m.Title) - i = encodeVarintErc20(dAtA, i, uint64(len(m.Title))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - func (m *RegisterERC20Proposal) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -676,43 +505,6 @@ func (m *ToggleTokenConversionProposal) MarshalToSizedBuffer(dAtA []byte) (int, return len(dAtA) - i, nil } -func (m *ProposalMetadata) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ProposalMetadata) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ProposalMetadata) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Metadata) > 0 { - for iNdEx := len(m.Metadata) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Metadata[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintErc20(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - func encodeVarintErc20(dAtA []byte, offset int, v uint64) int { offset -= sovErc20(v) base := offset @@ -747,29 +539,6 @@ func (m *TokenPair) Size() (n int) { return n } -func (m *RegisterCoinProposal) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Title) - if l > 0 { - n += 1 + l + sovErc20(uint64(l)) - } - l = len(m.Description) - if l > 0 { - n += 1 + l + sovErc20(uint64(l)) - } - if len(m.Metadata) > 0 { - for _, e := range m.Metadata { - l = e.Size() - n += 1 + l + sovErc20(uint64(l)) - } - } - return n -} - func (m *RegisterERC20Proposal) Size() (n int) { if m == nil { return 0 @@ -814,21 +583,6 @@ func (m *ToggleTokenConversionProposal) Size() (n int) { return n } -func (m *ProposalMetadata) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Metadata) > 0 { - for _, e := range m.Metadata { - l = e.Size() - n += 1 + l + sovErc20(uint64(l)) - } - } - return n -} - func sovErc20(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -988,154 +742,6 @@ func (m *TokenPair) Unmarshal(dAtA []byte) error { } return nil } -func (m *RegisterCoinProposal) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowErc20 - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: RegisterCoinProposal: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RegisterCoinProposal: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Title", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowErc20 - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthErc20 - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthErc20 - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Title = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowErc20 - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthErc20 - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthErc20 - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Description = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowErc20 - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthErc20 - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthErc20 - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Metadata = append(m.Metadata, types.Metadata{}) - if err := m.Metadata[len(m.Metadata)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipErc20(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthErc20 - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *RegisterERC20Proposal) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -1428,90 +1034,6 @@ func (m *ToggleTokenConversionProposal) Unmarshal(dAtA []byte) error { } return nil } -func (m *ProposalMetadata) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowErc20 - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ProposalMetadata: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ProposalMetadata: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowErc20 - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthErc20 - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthErc20 - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Metadata = append(m.Metadata, types.Metadata{}) - if err := m.Metadata[len(m.Metadata)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipErc20(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthErc20 - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func skipErc20(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/erc20/types/proposal.go b/x/erc20/types/proposal.go index 75aa684286..506b66723d 100644 --- a/x/erc20/types/proposal.go +++ b/x/erc20/types/proposal.go @@ -9,32 +9,26 @@ import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" govcdc "github.com/cosmos/cosmos-sdk/x/gov/codec" v1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" evmostypes "github.com/evmos/evmos/v16/types" ) // constants const ( - ProposalTypeRegisterCoin string = "RegisterCoin" ProposalTypeRegisterERC20 string = "RegisterERC20" ProposalTypeToggleTokenConversion string = "ToggleTokenConversion" // #nosec ) // Implements Proposal Interface var ( - _ v1beta1.Content = &RegisterCoinProposal{} _ v1beta1.Content = &RegisterERC20Proposal{} _ v1beta1.Content = &ToggleTokenConversionProposal{} ) func init() { - v1beta1.RegisterProposalType(ProposalTypeRegisterCoin) v1beta1.RegisterProposalType(ProposalTypeRegisterERC20) v1beta1.RegisterProposalType(ProposalTypeToggleTokenConversion) - govcdc.ModuleCdc.Amino.RegisterConcrete(&RegisterCoinProposal{}, "erc20/RegisterCoinProposal", nil) govcdc.ModuleCdc.Amino.RegisterConcrete(&RegisterERC20Proposal{}, "erc20/RegisterERC20Proposal", nil) govcdc.ModuleCdc.Amino.RegisterConcrete(&ToggleTokenConversionProposal{}, "erc20/ToggleTokenConversionProposal", nil) } @@ -49,68 +43,6 @@ func CreateDenom(address string) string { return fmt.Sprintf("%s/%s", ModuleName, address) } -// NewRegisterCoinProposal returns new instance of RegisterCoinProposal -func NewRegisterCoinProposal(title, description string, coinMetadata ...banktypes.Metadata) v1beta1.Content { - return &RegisterCoinProposal{ - Title: title, - Description: description, - Metadata: coinMetadata, - } -} - -// ProposalRoute returns router key for this proposal -func (*RegisterCoinProposal) ProposalRoute() string { return RouterKey } - -// ProposalType returns proposal type for this proposal -func (*RegisterCoinProposal) ProposalType() string { - return ProposalTypeRegisterCoin -} - -// ValidateBasic performs a stateless check of the proposal fields -func (rtbp *RegisterCoinProposal) ValidateBasic() error { - for _, metadata := range rtbp.Metadata { - if err := metadata.Validate(); err != nil { - return err - } - - // Prohibit denominations that contain the evm denom - if strings.Contains(metadata.Base, "evm") { - return errorsmod.Wrapf( - ErrEVMDenom, "cannot register the EVM denomination %s", metadata.Base, - ) - } - - if err := ibctransfertypes.ValidateIBCDenom(metadata.Base); err != nil { - return err - } - - if err := validateIBCVoucherMetadata(metadata); err != nil { - return err - } - } - - return v1beta1.ValidateAbstract(rtbp) -} - -// validateIBCVoucherMetadata checks that the coin metadata fields are consistent -// with an IBC voucher denomination. -func validateIBCVoucherMetadata(metadata banktypes.Metadata) error { - // Check ibc/ denom - denomSplit := strings.SplitN(metadata.Base, "/", 2) - - if denomSplit[0] == metadata.Base && strings.TrimSpace(metadata.Base) != "" { - // Not IBC - return nil - } - - if len(denomSplit) != 2 || denomSplit[0] != ibctransfertypes.DenomPrefix { - // NOTE: should be unaccessible (covered on ValidateIBCDenom) - return fmt.Errorf("invalid metadata. %s denomination should be prefixed with the format 'ibc/", metadata.Base) - } - - return nil -} - // ValidateErc20Denom checks if a denom is a valid erc20/ // denomination func ValidateErc20Denom(denom string) error { diff --git a/x/erc20/types/proposal_test.go b/x/erc20/types/proposal_test.go index 15fb42a5e4..a8d62aa0ec 100644 --- a/x/erc20/types/proposal_test.go +++ b/x/erc20/types/proposal_test.go @@ -6,7 +6,6 @@ import ( "github.com/stretchr/testify/suite" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" length "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" utiltx "github.com/evmos/evmos/v16/testutil/tx" @@ -22,8 +21,6 @@ func TestProposalTestSuite(t *testing.T) { } func (suite *ProposalTestSuite) TestKeysTypes() { - suite.Require().Equal("erc20", (&types.RegisterCoinProposal{}).ProposalRoute()) - suite.Require().Equal("RegisterCoin", (&types.RegisterCoinProposal{}).ProposalType()) suite.Require().Equal("erc20", (&types.RegisterERC20Proposal{}).ProposalRoute()) suite.Require().Equal("RegisterERC20", (&types.RegisterERC20Proposal{}).ProposalType()) suite.Require().Equal("erc20", (&types.ToggleTokenConversionProposal{}).ProposalRoute()) @@ -152,95 +149,6 @@ func (suite *ProposalTestSuite) TestRegisterERC20Proposal() { } } -func createFullMetadata(denom, symbol, name string) banktypes.Metadata { - return banktypes.Metadata{ - Description: "desc", - Base: denom, - // NOTE: Denom units MUST be increasing - DenomUnits: []*banktypes.DenomUnit{ - { - Denom: denom, - Exponent: 0, - }, - { - Denom: symbol, - Exponent: uint32(18), - }, - }, - Name: name, - Symbol: symbol, - Display: denom, - } -} - -func createMetadata(denom, symbol string) banktypes.Metadata { //nolint:unparam - return createFullMetadata(denom, symbol, denom) -} - -func (suite *ProposalTestSuite) TestRegisterCoinProposal() { - validMetadata := banktypes.Metadata{ - Description: "desc", - Base: "coin", - // NOTE: Denom units MUST be increasing - DenomUnits: []*banktypes.DenomUnit{ - { - Denom: "coin", - Exponent: 0, - }, - { - Denom: "coin2", - Exponent: uint32(18), - }, - }, - Name: "coin", - Symbol: "token", - Display: "coin", - } - - validIBCDenom := "ibc/7F1D3FCF4AE79E1554D670D1AD949A9BA4E4A3C76C63093E17E446A46061A7A2" - validIBCSymbol := "ATOM" - validIBCName := "Atom" - - testCases := []struct { - msg string - title string - description string - metadata banktypes.Metadata - expectPass bool - }{ - // Valid tests - {msg: "Register token pair - valid pair enabled", title: "test", description: "test desc", metadata: validMetadata, expectPass: true}, - {msg: "Register token pair - valid pair dissabled", title: "test", description: "test desc", metadata: validMetadata, expectPass: true}, - - // Invalid Regex (denom) - {msg: "Register token pair - invalid starts with number", title: "test", description: "test desc", metadata: createMetadata("1test", "test"), expectPass: false}, - {msg: "Register token pair - invalid char '('", title: "test", description: "test desc", metadata: createMetadata("(test", "test"), expectPass: false}, - {msg: "Register token pair - invalid char '^'", title: "test", description: "test desc", metadata: createMetadata("^test", "test"), expectPass: false}, - // Invalid length - {msg: "Register token pair - invalid length token (0)", title: "test", description: "test desc", metadata: createMetadata("", "test"), expectPass: false}, - {msg: "Register token pair - invalid length token (1)", title: "test", description: "test desc", metadata: createMetadata("a", "test"), expectPass: false}, - {msg: "Register token pair - invalid length token (128)", title: "test", description: "test desc", metadata: createMetadata(strings.Repeat("a", 129), "test"), expectPass: false}, - {msg: "Register token pair - invalid length title (140)", title: strings.Repeat("a", length.MaxTitleLength+1), description: "test desc", metadata: validMetadata, expectPass: false}, - {msg: "Register token pair - invalid length description (5000)", title: "title", description: strings.Repeat("a", length.MaxDescriptionLength+1), metadata: validMetadata, expectPass: false}, - // Invalid denom - {msg: "Register token pair - invalid EVM denom", title: "test", description: "test desc", metadata: createFullMetadata("evm", "EVM", "evm"), expectPass: false}, - // IBC - {msg: "Register token pair - ibc", title: "test", description: "test desc", metadata: createFullMetadata(validIBCDenom, validIBCSymbol, validIBCName), expectPass: true}, - {msg: "Register token pair - ibc invalid denom", title: "test", description: "test desc", metadata: createFullMetadata("ibc/", validIBCSymbol, validIBCName), expectPass: false}, - } - - for i, tc := range testCases { - tx := types.NewRegisterCoinProposal(tc.title, tc.description, tc.metadata) - err := tx.ValidateBasic() - - if tc.expectPass { - suite.Require().NoError(err, "valid test %d failed: %s, %v", i, tc.msg) - } else { - suite.Require().Error(err, "invalid test %d passed: %s, %v", i, tc.msg) - } - } -} - func (suite *ProposalTestSuite) TestToggleTokenConversionProposal() { testCases := []struct { msg string diff --git a/x/evm/migrations/v6/types/evm.pb.go b/x/evm/migrations/v6/types/evm.pb.go index 3f60cb98b7..ceecb7d269 100644 --- a/x/evm/migrations/v6/types/evm.pb.go +++ b/x/evm/migrations/v6/types/evm.pb.go @@ -4115,4 +4115,4 @@ var ( ErrInvalidLengthEvm = fmt.Errorf("proto: negative length found during unmarshaling") ErrIntOverflowEvm = fmt.Errorf("proto: integer overflow") ErrUnexpectedEndOfGroupEvm = fmt.Errorf("proto: unexpected end of group") -) \ No newline at end of file +) From cc07bbbc908e12e40d8b3b5f8df4132a8ad74b7c Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Mon, 11 Dec 2023 10:12:19 +0100 Subject: [PATCH 025/345] imp(docker): update jq and curl dependencies (#2168) update jq and curl dependencies --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index e3a07029a3..97fe3876ae 100644 --- a/Dockerfile +++ b/Dockerfile @@ -43,7 +43,7 @@ COPY --from=build-env /target/usr/lib /usr/lib COPY --from=build-env /target/usr/local/lib /usr/local/lib COPY --from=build-env /target/usr/include /usr/include -RUN apk add --no-cache ca-certificates=20230506-r0 jq=1.6-r3 curl=8.4.0-r0 bash=5.2.15-r5 vim=9.0.2073-r0 lz4=1.9.4-r4 rclone=1.62.2-r6 \ +RUN apk add --no-cache ca-certificates=20230506-r0 jq=1.6-r4 curl=8.5.0-r0 bash=5.2.15-r5 vim=9.0.2073-r0 lz4=1.9.4-r4 rclone=1.62.2-r6 \ && addgroup -g 1000 evmos \ && adduser -S -h /home/evmos -D evmos -u 1000 -G evmos From abe929084121c53fa131e2fd582390da5fd50b7b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Dec 2023 10:30:52 +0000 Subject: [PATCH 026/345] build(deps): bump actions/stale from 8 to 9 (#2164) Bumps [actions/stale](https://github.com/actions/stale) from 8 to 9. - [Release notes](https://github.com/actions/stale/releases) - [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/stale/compare/v8...v9) --- updated-dependencies: - dependency-name: actions/stale dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/stale.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 95a2005486..ef34170303 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -7,7 +7,7 @@ jobs: stale: runs-on: ubuntu-latest steps: - - uses: actions/stale@v8 + - uses: actions/stale@v9 with: repo-token: ${{ secrets.GITHUB_TOKEN }} stale-pr-message: "This pull request has been automatically marked as stale because it has not had recent activity. It will be closed in 7 days-before-close if no further activity occurs." From f9754afc892581ca24d47907196c770233b181ca Mon Sep 17 00:00:00 2001 From: stepit <48993133+0xstepit@users.noreply.github.com> Date: Mon, 11 Dec 2023 15:47:19 +0100 Subject: [PATCH 027/345] Add channel selector from chainID (#2172) * bump cosmos sdk fork and port selector * update xcs contract testnet * add CHANGELOG entry --- CHANGELOG.md | 1 + app/app.go | 3 +- go.mod | 2 +- go.sum | 4 +-- precompiles/outposts/osmosis/osmosis.go | 7 +++-- x/evm/keeper/precompiles.go | 38 +++++++++++++++++++++---- x/ibc/transfer/types/channels.go | 15 ++++++++++ 7 files changed, 57 insertions(+), 13 deletions(-) create mode 100644 x/ibc/transfer/types/channels.go diff --git a/CHANGELOG.md b/CHANGELOG.md index e20d3f9a74..ff1a51a0be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -140,6 +140,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (staking-precompile) [#2122](https://github.com/evmos/evmos/pull/2122) Replace bech32 address with EVM hex address for `CreateValidator` function and remove delegator address argument. - (app) [#2139](https://github.com/evmos/evmos/pull/2139) Remove old upgrade handlers logic. - (app) [#2138](https://github.com/evmos/evmos/pull/2138) Replace imports of store related types and functions to use Cosmos-SDK `store/types` package. +- (outpost) [#2171](https://github.com/evmos/evmos/pull/2171) Add channelID selector based on the ChainID. ### Bug Fixes diff --git a/app/app.go b/app/app.go index bd26724776..9da54a5350 100644 --- a/app/app.go +++ b/app/app.go @@ -504,10 +504,11 @@ func NewEvmos( app.AccountKeeper, app.BankKeeper, scopedTransferKeeper, app.Erc20Keeper, // Add ERC20 Keeper for ERC20 transfers ) - + chainID := bApp.ChainID() // We call this after setting the hooks to ensure that the hooks are set on the keeper evmKeeper.WithPrecompiles( evmkeeper.AvailablePrecompiles( + chainID, *stakingKeeper, app.DistrKeeper, app.BankKeeper, diff --git a/go.mod b/go.mod index 925dc63909..41ddbcbf05 100644 --- a/go.mod +++ b/go.mod @@ -247,7 +247,7 @@ replace ( // use cosmos fork of keyring github.com/99designs/keyring => github.com/cosmos/keyring v1.2.0 // use Cosmos-SDK fork to enable Ledger functionality - github.com/cosmos/cosmos-sdk => github.com/evmos/cosmos-sdk v0.47.5-evmos + github.com/cosmos/cosmos-sdk => github.com/evmos/cosmos-sdk v0.47.5-evmos.2 // use Evmos geth fork github.com/ethereum/go-ethereum => github.com/evmos/go-ethereum v1.10.26-evmos-rc2 // Security Advisory https://github.com/advisories/GHSA-h395-qcrw-5vmq diff --git a/go.sum b/go.sum index 6eed761d05..67611b0c91 100644 --- a/go.sum +++ b/go.sum @@ -470,8 +470,8 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.m github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evmos/cosmos-sdk v0.47.5-evmos h1:whqu51IyyDeINswUPNxDrm1WsvD7Bzo8XR71Ttt3DIc= -github.com/evmos/cosmos-sdk v0.47.5-evmos/go.mod h1:EHwCeN9IXonsjKcjpS12MqeStdZvIdxt3VYXhus3G3c= +github.com/evmos/cosmos-sdk v0.47.5-evmos.2 h1:fyhM0NYw/FnP4ZBXzQ7k+G4fXhfdU07MONoYrGlOCpc= +github.com/evmos/cosmos-sdk v0.47.5-evmos.2/go.mod h1:EHwCeN9IXonsjKcjpS12MqeStdZvIdxt3VYXhus3G3c= github.com/evmos/go-ethereum v1.10.26-evmos-rc2 h1:tYghk1ZZ8X4/OQ4YI9hvtm8aSN8OSqO0g9vo/sCMdBo= github.com/evmos/go-ethereum v1.10.26-evmos-rc2/go.mod h1:/6CsT5Ceen2WPLI/oCA3xMcZ5sWMF/D46SjM/ayY0Oo= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= diff --git a/precompiles/outposts/osmosis/osmosis.go b/precompiles/outposts/osmosis/osmosis.go index 74ee0d6a7e..123a2d1189 100644 --- a/precompiles/outposts/osmosis/osmosis.go +++ b/precompiles/outposts/osmosis/osmosis.go @@ -30,9 +30,10 @@ const ( OsmosisOutpostAddress = "0x0000000000000000000000000000000000000901" // XCSContract address for Osmosis testnet. - XCSContractTestnet = "osmo18rj46qcpr57m3qncrj9cuzm0gn3km08w5jxxlnw002c9y7xex5xsu74ytz" - // XCSContract address for Osmosis mainnet. - XCSContractMainnet = "" + XCSContractTestnet = "osmo1a34wxsxjwvtz3ua4hnkh4lv3d4qrgry0fhkasppplphwu5k538tqcyms9x" + // + // TODO: change it with the correct mainnet one + XCSContractMainnet = "osmo18rj46qcpr57m3qncrj9cuzm0gn3km08w5jxxlnw002c9y7xex5xsu74ytz" ) var _ vm.PrecompiledContract = &Precompile{} diff --git a/x/evm/keeper/precompiles.go b/x/evm/keeper/precompiles.go index b0aa3202a6..94b9221f23 100644 --- a/x/evm/keeper/precompiles.go +++ b/x/evm/keeper/precompiles.go @@ -10,10 +10,9 @@ import ( "github.com/evmos/evmos/v16/precompiles/bech32" - "golang.org/x/exp/maps" - "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" + "golang.org/x/exp/maps" sdk "github.com/cosmos/cosmos-sdk/types" authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" @@ -30,14 +29,17 @@ import ( "github.com/evmos/evmos/v16/precompiles/p256" stakingprecompile "github.com/evmos/evmos/v16/precompiles/staking" vestingprecompile "github.com/evmos/evmos/v16/precompiles/vesting" + "github.com/evmos/evmos/v16/utils" erc20Keeper "github.com/evmos/evmos/v16/x/erc20/keeper" transferkeeper "github.com/evmos/evmos/v16/x/ibc/transfer/keeper" + evmostransfertypes "github.com/evmos/evmos/v16/x/ibc/transfer/types" vestingkeeper "github.com/evmos/evmos/v16/x/vesting/keeper" ) // AvailablePrecompiles returns the list of all available precompiled contracts. // NOTE: this should only be used during initialization of the Keeper. func AvailablePrecompiles( + chainID string, stakingKeeper stakingkeeper.Keeper, distributionKeeper distributionkeeper.Keeper, bankKeeper bankkeeper.Keeper, @@ -83,15 +85,39 @@ func AvailablePrecompiles( panic(fmt.Errorf("failed to instantiate bank precompile: %w", err)) } - strideOutpost, err := strideoutpost.NewPrecompile(transfertypes.PortID, "channel-25", transferKeeper, erc20Keeper, authzKeeper, stakingKeeper) + var strideChannelID, osmosisChannelID, xcsv1Contract string + if utils.IsMainnet(chainID) { + osmosisChannelID = evmostransfertypes.OsmosisMainnetChannelID + strideChannelID = evmostransfertypes.StrideMainnetChannelID + xcsv1Contract = osmosisoutpost.XCSContractMainnet + } else { + osmosisChannelID = evmostransfertypes.OsmosisTestnetChannelID + strideChannelID = evmostransfertypes.StrideTestnetChannelID + xcsv1Contract = osmosisoutpost.XCSContractMainnet + } + + strideOutpost, err := strideoutpost.NewPrecompile( + transfertypes.PortID, + strideChannelID, + transferKeeper, + erc20Keeper, + authzKeeper, + stakingKeeper, + ) if err != nil { panic(fmt.Errorf("failed to instantiate stride outpost: %w", err)) } osmosisOutpost, err := osmosisoutpost.NewPrecompile( - transfertypes.PortID, "channel-215", - osmosisoutpost.XCSContractTestnet, - authzKeeper, bankKeeper, transferKeeper, stakingKeeper, erc20Keeper, channelKeeper, + transfertypes.PortID, + osmosisChannelID, + xcsv1Contract, + authzKeeper, + bankKeeper, + transferKeeper, + stakingKeeper, + erc20Keeper, + channelKeeper, ) if err != nil { panic(fmt.Errorf("failed to instantiate osmosis outpost: %w", err)) diff --git a/x/ibc/transfer/types/channels.go b/x/ibc/transfer/types/channels.go new file mode 100644 index 0000000000..a363b44e9c --- /dev/null +++ b/x/ibc/transfer/types/channels.go @@ -0,0 +1,15 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) +package types + +// Osmosis channels +const ( + OsmosisTestnetChannelID = "channel-215" + OsmosisMainnetChannelID = "channel-0" +) + +// Stride channels +const ( + StrideTestnetChannelID = "channel-25" + StrideMainnetChannelID = "channel-25" +) From 05cf01da265693cc6af1e76c28e0032aaba0ab6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Federico=20Kunze=20K=C3=BCllmer?= <31522760+fedekunze@users.noreply.github.com> Date: Mon, 11 Dec 2023 17:34:27 +0100 Subject: [PATCH 028/345] imp(inflation): Reduce inflation by 2/3 (#2137) * imp(inflation): Reduce inflation by 2/3 * changelog * fix(tests): fix integration tests * fix(tests): add back case for incentives * fix(tests): fix linter * Update x/inflation/v1/keeper/hooks.go Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> --------- Co-authored-by: Vladislav Varadinov Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> --- CHANGELOG.md | 3 ++- x/inflation/v1/keeper/hooks.go | 13 +++++++++---- x/inflation/v1/keeper/integration_test.go | 6 +++--- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ff1a51a0be..1568fad657 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -138,8 +138,9 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (osmosis-outpost) [#2029](https://github.com/evmos/evmos/pull/2029) Add Osmosis outpost end-to-end tests. - (upgrade) [#2131](https://github.com/evmos/evmos/pull/2131) Remove incentives pool burning logic from upgrade handler. - (staking-precompile) [#2122](https://github.com/evmos/evmos/pull/2122) Replace bech32 address with EVM hex address for `CreateValidator` function and remove delegator address argument. -- (app) [#2139](https://github.com/evmos/evmos/pull/2139) Remove old upgrade handlers logic. +- (inflation) [#2137](https://github.com/evmos/evmos/pull/2137) Reduce daily inflation by 2/3s. - (app) [#2138](https://github.com/evmos/evmos/pull/2138) Replace imports of store related types and functions to use Cosmos-SDK `store/types` package. +- (app) [#2139](https://github.com/evmos/evmos/pull/2139) Remove old upgrade handlers logic. - (outpost) [#2171](https://github.com/evmos/evmos/pull/2171) Add channelID selector based on the ChainID. ### Bug Fixes diff --git a/x/inflation/v1/keeper/hooks.go b/x/inflation/v1/keeper/hooks.go index e8d2617c47..e8804ea55c 100644 --- a/x/inflation/v1/keeper/hooks.go +++ b/x/inflation/v1/keeper/hooks.go @@ -7,6 +7,8 @@ import ( "fmt" "github.com/armon/go-metrics" + + sdkmath "cosmossdk.io/math" "github.com/cosmos/cosmos-sdk/telemetry" sdk "github.com/cosmos/cosmos-sdk/types" epochstypes "github.com/evmos/evmos/v16/x/epochs/types" @@ -60,12 +62,15 @@ func (k Keeper) AfterEpochEnd(ctx sdk.Context, epochIdentifier string, epochNumb if !epochMintProvision.IsPositive() { k.Logger(ctx).Error( - "SKIPPING INFLATION: negative epoch mint provision", + "SKIPPING INFLATION: zero or negative epoch mint provision", "value", epochMintProvision.String(), ) return } + // per proposal 258, subtract 2/3 of the prev issuance + epochMintProvision = epochMintProvision.Quo(sdkmath.LegacyNewDec(3)) + mintedCoin := sdk.Coin{ Denom: params.MintDenom, Amount: epochMintProvision.TruncateInt(), @@ -95,21 +100,21 @@ func (k Keeper) AfterEpochEnd(ctx sdk.Context, epochIdentifier string, epochNumb stakingAmt := staking.AmountOfNoDenomValidation(mintedCoin.Denom) cpAmt := communityPool.AmountOfNoDenomValidation(mintedCoin.Denom) - if mintedCoin.Amount.IsInt64() { + if mintedCoin.Amount.IsInt64() && mintedCoin.Amount.IsPositive() { telemetry.IncrCounterWithLabels( []string{types.ModuleName, "allocate", "total"}, float32(mintedCoin.Amount.Int64()), []metrics.Label{telemetry.NewLabel("denom", mintedCoin.Denom)}, ) } - if stakingAmt.IsInt64() { + if stakingAmt.IsInt64() && stakingAmt.IsPositive() { telemetry.IncrCounterWithLabels( []string{types.ModuleName, "allocate", "staking", "total"}, float32(stakingAmt.Int64()), []metrics.Label{telemetry.NewLabel("denom", mintedCoin.Denom)}, ) } - if cpAmt.IsInt64() { + if cpAmt.IsInt64() && cpAmt.IsPositive() { telemetry.IncrCounterWithLabels( []string{types.ModuleName, "allocate", "community_pool", "total"}, float32(cpAmt.Int64()), diff --git a/x/inflation/v1/keeper/integration_test.go b/x/inflation/v1/keeper/integration_test.go index 6e62033de7..12301352d8 100644 --- a/x/inflation/v1/keeper/integration_test.go +++ b/x/inflation/v1/keeper/integration_test.go @@ -87,7 +87,7 @@ var _ = Describe("Inflation", Ordered, func() { expected := provision.Mul(distribution) Expect(balanceCommunityPool.IsZero()).ToNot(BeTrue()) - Expect(balanceCommunityPool.AmountOf(denomMint).GT(expected)).To(BeTrue()) + Expect(balanceCommunityPool.AmountOf(denomMint).LT(expected)).To(BeTrue()) }) }) }) @@ -148,7 +148,7 @@ var _ = Describe("Inflation", Ordered, func() { expected := provision.Mul(distribution) Expect(balanceCommunityPool.IsZero()).ToNot(BeTrue()) - Expect(balanceCommunityPool.AmountOf(denomMint).GT(expected)).To(BeTrue()) + Expect(balanceCommunityPool.AmountOf(denomMint).LT(expected)).To(BeTrue()) }) }) }) @@ -202,7 +202,7 @@ var _ = Describe("Inflation", Ordered, func() { expected := provision.Mul(distribution) Expect(balanceCommunityPool.IsZero()).ToNot(BeTrue()) - Expect(balanceCommunityPool.AmountOf(denomMint).GT(expected)).To(BeTrue()) + Expect(balanceCommunityPool.AmountOf(denomMint).LT(expected)).To(BeTrue()) }) }) }) From 5cf9b1e5d999935ec7df022a6d68e5222d9353a7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Dec 2023 12:16:53 +0100 Subject: [PATCH 029/345] build(deps): bump google.golang.org/grpc from 1.59.0 to 1.60.0 (#2183) Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.59.0 to 1.60.0. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.59.0...v1.60.0) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 22 +++++++++++----------- go.sum | 43 ++++++++++++++++++++++--------------------- 2 files changed, 33 insertions(+), 32 deletions(-) diff --git a/go.mod b/go.mod index 41ddbcbf05..14ac7313d7 100644 --- a/go.mod +++ b/go.mod @@ -49,17 +49,17 @@ require ( golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb golang.org/x/net v0.19.0 golang.org/x/text v0.14.0 - google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d - google.golang.org/grpc v1.59.0 + google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 + google.golang.org/grpc v1.60.0 google.golang.org/protobuf v1.31.0 sigs.k8s.io/yaml v1.4.0 ) require ( - cloud.google.com/go v0.110.7 // indirect + cloud.google.com/go v0.110.8 // indirect cloud.google.com/go/compute v1.23.0 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v1.1.1 // indirect + cloud.google.com/go/iam v1.1.2 // indirect cloud.google.com/go/storage v1.30.1 // indirect cosmossdk.io/core v0.6.1 // indirect cosmossdk.io/depinject v1.0.0-alpha.4 // indirect @@ -141,8 +141,8 @@ require ( github.com/google/s2a-go v0.1.4 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/google/uuid v1.3.1 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect - github.com/googleapis/gax-go/v2 v2.11.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.2.4 // indirect + github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/gorilla/handlers v1.5.1 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect @@ -225,16 +225,16 @@ require ( github.com/zondax/ledger-go v0.14.1 // indirect go.etcd.io/bbolt v1.3.7 // indirect golang.org/x/mod v0.13.0 // indirect - golang.org/x/oauth2 v0.11.0 // indirect + golang.org/x/oauth2 v0.13.0 // indirect golang.org/x/sync v0.4.0 // indirect golang.org/x/sys v0.15.0 // indirect golang.org/x/term v0.15.0 // indirect golang.org/x/tools v0.14.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/api v0.126.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect + google.golang.org/api v0.128.0 // indirect + google.golang.org/appengine v1.6.8 // indirect + google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index 67611b0c91..8b7602edf5 100644 --- a/go.sum +++ b/go.sum @@ -32,8 +32,8 @@ cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w9 cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.110.7 h1:rJyC7nWRg2jWGZ4wSJ5nY65GTdYJkg0cd/uXb+ACI6o= -cloud.google.com/go v0.110.7/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= +cloud.google.com/go v0.110.8 h1:tyNdfIxjzaWctIiLYOTalaLKZ17SI44SKFW26QbOhME= +cloud.google.com/go v0.110.8/go.mod h1:Iz8AkXJf1qmxC3Oxoep8R1T36w8B92yU29PcBhHO5fk= cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= @@ -111,8 +111,8 @@ cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y97 cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v1.1.1 h1:lW7fzj15aVIXYHREOqjRBV9PsH0Z6u8Y46a1YGvQP4Y= -cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= +cloud.google.com/go/iam v1.1.2 h1:gacbrBdWcoVmGLozRuStX45YKvJtzIjJdAolzUs1sm4= +cloud.google.com/go/iam v1.1.2/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= @@ -666,8 +666,8 @@ github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.2.4 h1:uGy6JWR/uMIILU8wbf+OkstIrNiMjGpEIyhx8f6W7s4= +github.com/googleapis/enterprise-certificate-proxy v0.2.4/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= @@ -677,8 +677,8 @@ github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99 github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.11.0 h1:9V9PWXEsWnPpQhu/PeQIkS4eGzMlTLGgt80cUUI8Ki4= -github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= +github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= +github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -1347,8 +1347,8 @@ golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= -golang.org/x/oauth2 v0.11.0 h1:vPL4xzxBM4niKCW6g9whtaWVXTJf1U5e4aZxxFx/gbU= -golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= +golang.org/x/oauth2 v0.13.0 h1:jDDenyj+WgFtmV3zYVoi8aE2BwtXFLWOA67ZfNWftiY= +golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1632,8 +1632,8 @@ google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.126.0 h1:q4GJq+cAdMAC7XP7njvQ4tvohGLiSlytuL4BQxbIZ+o= -google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= +google.golang.org/api v0.128.0 h1:RjPESny5CnQRn9V6siglged+DZCgfu9l6mO9dkX9VOg= +google.golang.org/api v0.128.0/go.mod h1:Y611qgqaE92On/7g65MQgxYul3c0rEB894kniWLY750= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1641,8 +1641,9 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1751,12 +1752,12 @@ google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqw google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d h1:VBu5YqKPv6XiJ199exd8Br+Aetz+o08F+PLMnwJQHAY= -google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97 h1:SeZZZx0cP0fqUyA+oRzP9k7cSwJlvDFiROO72uwD6i0= +google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97/go.mod h1:t1VqOqqvce95G3hIDCT5FeO3YUc6Q4Oe24L/+rNMxRk= +google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 h1:W18sezcAYs+3tDZX4F80yctqa12jcP1PUS2gQu1zTPU= +google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97/go.mod h1:iargEX0SFPm3xcfMI0d1domjg0ZF4Aa0p2awqyxhvF0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97 h1:6GQBEOdGkX6MMTLT9V+TjtIRZCw9VPD5Z+yHY9wMgS0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97/go.mod h1:v7nGkzlmW8P3n/bKmWBn2WpBjpOEx8Q6gMueudAmKfY= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -1798,8 +1799,8 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= -google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= +google.golang.org/grpc v1.60.0 h1:6FQAR0kM31P6MRdeluor2w2gPaS4SVNrD/DNTxrQ15k= +google.golang.org/grpc v1.60.0/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= From 40a17e55ff91a8996962505474ca3780ad39ed28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Federico=20Kunze=20K=C3=BCllmer?= <31522760+fedekunze@users.noreply.github.com> Date: Tue, 12 Dec 2023 12:29:07 +0100 Subject: [PATCH 030/345] [Snyk] Security upgrade @openzeppelin/contracts from 4.9.3 to 4.9.5 (#2176) fix: contracts/package.json & contracts/package-lock.json to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-OPENZEPPELINCONTRACTS-6114711 Co-authored-by: snyk-bot Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> --- contracts/package-lock.json | 8 ++++---- contracts/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/contracts/package-lock.json b/contracts/package-lock.json index 4b0fa1e97a..3bab9dfb81 100644 --- a/contracts/package-lock.json +++ b/contracts/package-lock.json @@ -9,14 +9,14 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@openzeppelin/contracts": "^4.9.3" + "@openzeppelin/contracts": "^4.9.5" }, "devDependencies": {} }, "node_modules/@openzeppelin/contracts": { - "version": "4.9.3", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.3.tgz", - "integrity": "sha512-He3LieZ1pP2TNt5JbkPA4PNT9WC3gOTOlDcFGJW4Le4QKqwmiNJCRt44APfxMxvq7OugU/cqYuPcSBzOw38DAg==" + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.5.tgz", + "integrity": "sha512-ZK+W5mVhRppff9BE6YdR8CC52C8zAvsVAiWhEtQ5+oNxFE6h1WdeWo+FJSF8KKvtxxVYZ7MTP/5KoVpAU3aSWg==" } } } diff --git a/contracts/package.json b/contracts/package.json index a8f0a9a3e8..4cb6c1254f 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -7,7 +7,7 @@ "doc": "docs" }, "dependencies": { - "@openzeppelin/contracts": "^4.9.3" + "@openzeppelin/contracts": "^4.9.5" }, "devDependencies": {}, "scripts": { From a56e81d1999ac89c969fd41f382f717ca2514e88 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Dec 2023 14:47:52 -0300 Subject: [PATCH 031/345] build(deps): bump github.com/linxGnu/grocksdb from 1.8.6 to 1.8.9 (#2182) * build(deps): bump github.com/linxGnu/grocksdb from 1.8.6 to 1.8.9 Bumps [github.com/linxGnu/grocksdb](https://github.com/linxGnu/grocksdb) from 1.8.6 to 1.8.9. - [Release notes](https://github.com/linxGnu/grocksdb/releases) - [Commits](https://github.com/linxGnu/grocksdb/compare/v1.8.6...v1.8.9) --- updated-dependencies: - dependency-name: github.com/linxGnu/grocksdb dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * update rocksdb version * add changelog entry --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: tom --- CHANGELOG.md | 1 + Dockerfile | 2 +- Makefile | 2 +- go.mod | 2 +- go.sum | 4 +-- gomod2nix.toml | 52 +++++++++++++++++------------------ nix/rocksdb.nix | 4 +-- scripts/install_librocksdb.sh | 2 +- 8 files changed, 35 insertions(+), 34 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1568fad657..94555ce942 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -142,6 +142,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (app) [#2138](https://github.com/evmos/evmos/pull/2138) Replace imports of store related types and functions to use Cosmos-SDK `store/types` package. - (app) [#2139](https://github.com/evmos/evmos/pull/2139) Remove old upgrade handlers logic. - (outpost) [#2171](https://github.com/evmos/evmos/pull/2171) Add channelID selector based on the ChainID. +- (db) [#2182](https://github.com/evmos/evmos/pull/2182) Bump RocksDB version to `v8.8.1`. ### Bug Fixes diff --git a/Dockerfile b/Dockerfile index 97fe3876ae..83bfa8c8b0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ FROM golang:1.21.5-alpine3.18 AS build-env ARG DB_BACKEND=goleveldb -ARG ROCKSDB_VERSION="8.5.3" +ARG ROCKSDB_VERSION="8.8.1" WORKDIR /go/src/github.com/evmos/evmos diff --git a/Makefile b/Makefile index e8ebae4f87..16c0e23642 100644 --- a/Makefile +++ b/Makefile @@ -26,7 +26,7 @@ DOCKER_TAG := $(COMMIT_HASH) # e2e env MOUNT_PATH := $(shell pwd)/build/:/root/ E2E_SKIP_CLEANUP := false -ROCKSDB_VERSION ?= "8.5.3" +ROCKSDB_VERSION ?= "8.8.1" export GO111MODULE = on diff --git a/go.mod b/go.mod index 14ac7313d7..1634e680f6 100644 --- a/go.mod +++ b/go.mod @@ -29,7 +29,7 @@ require ( github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/hashicorp/go-version v1.6.0 github.com/improbable-eng/grpc-web v0.15.0 - github.com/linxGnu/grocksdb v1.8.6 + github.com/linxGnu/grocksdb v1.8.9 github.com/onsi/ginkgo/v2 v2.13.2 github.com/onsi/gomega v1.30.0 github.com/ory/dockertest/v3 v3.10.0 diff --git a/go.sum b/go.sum index 8b7602edf5..ce1adf1ef2 100644 --- a/go.sum +++ b/go.sum @@ -834,8 +834,8 @@ github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6 github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/linxGnu/grocksdb v1.8.6 h1:O7I6SIGPrypf3f/gmrrLUBQDKfO8uOoYdWf4gLS06tc= -github.com/linxGnu/grocksdb v1.8.6/go.mod h1:xZCIb5Muw+nhbDK4Y5UJuOrin5MceOuiXkVUR7vp4WY= +github.com/linxGnu/grocksdb v1.8.9 h1:/s352A7OI/+tOxeecK21qJyLJ0YHI7J8gN/cXOKzEis= +github.com/linxGnu/grocksdb v1.8.9/go.mod h1:xZCIb5Muw+nhbDK4Y5UJuOrin5MceOuiXkVUR7vp4WY= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= diff --git a/gomod2nix.toml b/gomod2nix.toml index eb2cc1aa66..d72fe44b75 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -2,8 +2,8 @@ schema = 3 [mod] [mod."cloud.google.com/go"] - version = "v0.110.7" - hash = "sha256-nKAiSXkRa+7ZiJYwtbOo13+sMeB4rLfSdD3DlpoZDLY=" + version = "v0.110.8" + hash = "sha256-2zRfdYe7M+PH1Q4oeh0T12pQVnp117CndMt64CkI3XA=" [mod."cloud.google.com/go/compute"] version = "v1.23.0" hash = "sha256-Pd5tMfeatH7p/Mh4b5qUqE9vMDgwwTg6/3Hb8uFZyUw=" @@ -11,8 +11,8 @@ schema = 3 version = "v0.2.3" hash = "sha256-kYB1FTQRdTDqCqJzSU/jJYbVUGyxbkASUKbEs36FUyU=" [mod."cloud.google.com/go/iam"] - version = "v1.1.1" - hash = "sha256-VANDj1f2Ckjco+l0KG4uboPE5i2xbbclvZGCojqWepc=" + version = "v1.1.2" + hash = "sha256-n4DefmHY9GGKc3xdsC+MN9y3tYu7Sgeol1X/Lsnggks=" [mod."cloud.google.com/go/storage"] version = "v1.30.1" hash = "sha256-4lC0XaLSQDnVBmNLIauiWnGXq+Ax57r8fcMxXFMCCNE=" @@ -144,8 +144,8 @@ schema = 3 version = "v1.0.0-beta.3" hash = "sha256-V0/ZhRdqK7Cqcv8X30gr33/hlI54bRXeHhI9LZKyLt8=" [mod."github.com/cosmos/cosmos-sdk"] - version = "v0.47.5-evmos" - hash = "sha256-j2bQXAz1w1eNBHzy1VFEYEsiZxg5FbqVc/JH6IZhIdU=" + version = "v0.47.5-evmos.2" + hash = "sha256-tFVpEPPxOGoIbEz0lYCTUnOsExmXmIFJKEzPgWiBjq8=" replaced = "github.com/evmos/cosmos-sdk" [mod."github.com/cosmos/go-bip39"] version = "v1.0.0" @@ -324,11 +324,11 @@ schema = 3 version = "v1.3.1" hash = "sha256-JxAEAB2bFlGPShFreyOWjUahjaGV3xYS5TpfUOikod0=" [mod."github.com/googleapis/enterprise-certificate-proxy"] - version = "v0.2.3" - hash = "sha256-4yaBdpdRuv5vkGlwxKPlZ/IVSeHlcP9PJaLcyn4wNJk=" + version = "v0.2.4" + hash = "sha256-4tXjS3R7qKlmA/UueJP7LFk0Tw4anuqKrEW/lnlOrY8=" [mod."github.com/googleapis/gax-go/v2"] - version = "v2.11.0" - hash = "sha256-jWfuxmawmfPNTt7iWn9StsC5yofMupkr1IUZbjTxrgQ=" + version = "v2.12.0" + hash = "sha256-ZcXS+1B11UaJHf8D15N3ZCh00fiMUncpHd+eNRffLZ4=" [mod."github.com/gorilla/handlers"] version = "v1.5.1" hash = "sha256-GnBAARgOx1E+hDMQ63SI17hdhGtLQxb31lZOmn5j/pU=" @@ -426,8 +426,8 @@ schema = 3 version = "v0.1.0" hash = "sha256-wQqGTtRWsfR9n0O/SXHVgECebbnNmHddxJIbG63OJBQ=" [mod."github.com/linxGnu/grocksdb"] - version = "v1.8.6" - hash = "sha256-QOiVB6QU3AKNuuw1dbslszl+CwCF52f0hfb3YXDvLq8=" + version = "v1.8.9" + hash = "sha256-5dTQFqlnm68kBqUHOQphugDR9HI195eQGspgkydGUK4=" [mod."github.com/magiconair/properties"] version = "v1.8.7" hash = "sha256-XQ2bnc2s7/IH3WxEO4GishZurMyKwEclZy1DXg+2xXc=" @@ -649,8 +649,8 @@ schema = 3 version = "v0.19.0" hash = "sha256-3M5rKEvJx4cO/q+06cGjR5sxF5JpnUWY0+fQttrWdT4=" [mod."golang.org/x/oauth2"] - version = "v0.11.0" - hash = "sha256-ztz1lRVZXq6lTN/q4b4Y+P6L1EkP8ZJuhUbSJ0QvCw4=" + version = "v0.13.0" + hash = "sha256-mEmRQrh6FMsenT7x406HbZCynBJCHJ4e9u0M3hpG3m4=" [mod."golang.org/x/sync"] version = "v0.4.0" hash = "sha256-VCl5IerUva6XZqGXHa0J/r/ewsbOIIP7EBqyh1JGsXY=" @@ -670,23 +670,23 @@ schema = 3 version = "v0.0.0-20220907171357-04be3eba64a2" hash = "sha256-6+zueutgefIYmgXinOflz8qGDDDj0Zhv+2OkGhBTKno=" [mod."google.golang.org/api"] - version = "v0.126.0" - hash = "sha256-G/J0Aba+S35gE7VevU2WrrbwQRsJCSj14DVSLTqz0vE=" + version = "v0.128.0" + hash = "sha256-yfyjrqpgemcsLSnVJwIGH17SJyo2jYyh5Ziyb08IN9s=" [mod."google.golang.org/appengine"] - version = "v1.6.7" - hash = "sha256-zIxGRHiq4QBvRqkrhMGMGCaVL4iM4TtlYpAi/hrivS4=" + version = "v1.6.8" + hash = "sha256-decMa0MiWfW/Bzr8QPPzzpeya0YWGHhZAt4Cr/bD1wQ=" [mod."google.golang.org/genproto"] - version = "v0.0.0-20230822172742-b8732ec3820d" - hash = "sha256-NI7h/WXGdDI8UgJrvwW4wziuOVOr1617NaAWBP0nAyo=" + version = "v0.0.0-20231002182017-d307bd883b97" + hash = "sha256-YsRyEjtF3D7NGg1Be6khztBgnQFfT1+SM7ro/luk9JI=" [mod."google.golang.org/genproto/googleapis/api"] - version = "v0.0.0-20230822172742-b8732ec3820d" - hash = "sha256-qd9dJezVHNJZNMkywXapT1rsyD+lb25AU8aG8NJlhm4=" + version = "v0.0.0-20231002182017-d307bd883b97" + hash = "sha256-zhjugz/BTV4l9UAKcWIK/Fh10RNS46VIrOqu+ULAitU=" [mod."google.golang.org/genproto/googleapis/rpc"] - version = "v0.0.0-20230822172742-b8732ec3820d" - hash = "sha256-1kP7lqQ+fKtARDzTrRNob0owX4GsUnxzOwLyBZSmHOc=" + version = "v0.0.0-20231002182017-d307bd883b97" + hash = "sha256-QnSDeqAVIouw9YoQ+AFpgkRcZqQqLuaeA0yKDThRugs=" [mod."google.golang.org/grpc"] - version = "v1.59.0" - hash = "sha256-IcwmXyeroUg742wqU4Zikwxm7y0i7x4axOPdWOGPkzE=" + version = "v1.60.0" + hash = "sha256-L8NmvIG8gYSWlfjnEL+Cm83kF8dNnHWh4t7gNWHO4jY=" [mod."google.golang.org/protobuf"] version = "v1.31.0" hash = "sha256-UdIk+xRaMfdhVICvKRk1THe3R1VU+lWD8hqoW/y8jT0=" diff --git a/nix/rocksdb.nix b/nix/rocksdb.nix index ec35f1bee5..433e456d88 100644 --- a/nix/rocksdb.nix +++ b/nix/rocksdb.nix @@ -17,13 +17,13 @@ stdenv.mkDerivation rec { pname = "rocksdb"; - version = "8.5.3"; + version = "8.8.1"; src = fetchFromGitHub { owner = "facebook"; repo = pname; rev = "v${version}"; - sha256 = "sha256-Qa4bAprXptA79ilNE5KSfggEDvNFHdrvDQ6SvzWMQus="; + sha256 = "sha256-eE29iojVhR660mXTdX7yT+oqFk5oteBjZcLkmgHQWaY="; }; nativeBuildInputs = [ cmake ninja ]; diff --git a/scripts/install_librocksdb.sh b/scripts/install_librocksdb.sh index a94047f019..3eca36c8ae 100755 --- a/scripts/install_librocksdb.sh +++ b/scripts/install_librocksdb.sh @@ -1,6 +1,6 @@ #!/bin/bash -ROCKSDB_VERSION=${1:-"8.5.3"} +ROCKSDB_VERSION=${1:-"8.8.1"} # Check if RocksDB is already installed if [[ $(find /usr/lib -name "librocksdb.so.${ROCKSDB_VERSION}" -print -quit) ]]; then From 1871dbab275d8eb97ed9b4af7342a304fd755b15 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Dec 2023 10:43:12 -0300 Subject: [PATCH 032/345] build(deps): bump alpine from 3.18 to 3.19 (#2165) * build(deps): bump alpine from 3.18 to 3.19 Bumps alpine from 3.18 to 3.19. --- updated-dependencies: - dependency-name: alpine dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * update deps --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: tom --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 83bfa8c8b0..1b57a94f73 100644 --- a/Dockerfile +++ b/Dockerfile @@ -31,7 +31,7 @@ fi RUN go install github.com/MinseokOh/toml-cli@latest -FROM alpine:3.18 +FROM alpine:3.19 WORKDIR /root @@ -43,7 +43,7 @@ COPY --from=build-env /target/usr/lib /usr/lib COPY --from=build-env /target/usr/local/lib /usr/local/lib COPY --from=build-env /target/usr/include /usr/include -RUN apk add --no-cache ca-certificates=20230506-r0 jq=1.6-r4 curl=8.5.0-r0 bash=5.2.15-r5 vim=9.0.2073-r0 lz4=1.9.4-r4 rclone=1.62.2-r6 \ +RUN apk add --no-cache ca-certificates=20230506-r0 jq=1.7-r2 curl=8.5.0-r0 bash=5.2.21-r0 vim=9.0.2127-r0 lz4=1.9.4-r5 rclone=1.65.0-r0 \ && addgroup -g 1000 evmos \ && adduser -S -h /home/evmos -D evmos -u 1000 -G evmos From 800b94d98075aef18f83227c7d3232268fc42032 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Dec 2023 12:27:07 -0300 Subject: [PATCH 033/345] build(deps): bump github/codeql-action from 2 to 3 (#2190) Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2 to 3. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/v2...v3) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- .github/workflows/codeql-analysis.yml | 6 +++--- .github/workflows/security.yml | 2 +- .github/workflows/slither.yml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index dc19f6baa0..18ac84faf6 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -50,7 +50,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v3 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -63,7 +63,7 @@ jobs: # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@v2 + uses: github/codeql-action/autobuild@v3 if: env.GIT_DIFF # ℹ️ Command-line programs to run using the OS shell. @@ -78,5 +78,5 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v3 if: env.GIT_DIFF diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml index 47b07f907e..0fdfe4ed6a 100644 --- a/.github/workflows/security.yml +++ b/.github/workflows/security.yml @@ -31,7 +31,7 @@ jobs: args: "-no-fail -fmt sarif -out results.sarif ./..." if: "env.GIT_DIFF_FILTERED != ''" - name: Upload SARIF file - uses: github/codeql-action/upload-sarif@v2 + uses: github/codeql-action/upload-sarif@v3 with: # Path to SARIF file relative to the root of the repository sarif_file: results.sarif diff --git a/.github/workflows/slither.yml b/.github/workflows/slither.yml index 713b512f6b..d7191aab44 100644 --- a/.github/workflows/slither.yml +++ b/.github/workflows/slither.yml @@ -34,7 +34,7 @@ jobs: target: contracts/ if: "env.GIT_DIFF" - name: Upload SARIF file - uses: github/codeql-action/upload-sarif@v2 + uses: github/codeql-action/upload-sarif@v3 with: sarif_file: ${{ steps.slither.outputs.sarif }} if: "env.GIT_DIFF" From cd9acfd947c9cc4795a67486afa77ccd14f7f006 Mon Sep 17 00:00:00 2001 From: shuoer86 <129674997+shuoer86@users.noreply.github.com> Date: Fri, 15 Dec 2023 00:23:19 +0800 Subject: [PATCH 034/345] chore(tests): fix typos (#2191) Co-authored-by: Vladislav Varadinov --- tests/nix_tests/cosmoscli.py | 2 +- tests/nix_tests/test_filters.py | 6 +++--- tests/solidity/suites/basic/test/storage.js | 4 ++-- tests/solidity/suites/opcode/contracts/OpCodes.sol | 6 +++--- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/tests/nix_tests/cosmoscli.py b/tests/nix_tests/cosmoscli.py index 859c3e4be8..1690136fb3 100644 --- a/tests/nix_tests/cosmoscli.py +++ b/tests/nix_tests/cosmoscli.py @@ -591,7 +591,7 @@ def create_validator( amount=amount, pubkey=pubkey, min_self_delegation=min_self_delegation, - # commision + # commission commission_rate=commission_rate, commission_max_rate=commission_max_rate, commission_max_change_rate=commission_max_change_rate, diff --git a/tests/nix_tests/test_filters.py b/tests/nix_tests/test_filters.py index 6752c4fecb..0ce1e0e163 100644 --- a/tests/nix_tests/test_filters.py +++ b/tests/nix_tests/test_filters.py @@ -211,7 +211,7 @@ def test_event_log_filter_by_topic(cluster): test_cases = [ { - "name": "one contract emiting one topic", + "name": "one contract emitting one topic", "filters": [ {"topics": [CHANGE_GREETING_TOPIC.hex()]}, { @@ -288,7 +288,7 @@ def test_event_log_filter_by_topic(cluster): tx = None if c == GREETER_CONTRACT: contract, _ = deploy_contract(w3, CONTRACTS[c]) - # validate deploy was successfull + # validate deploy was successful assert contract.caller.greet() == "Hello" # create tx that emits event tx = contract.functions.setGreeting(new_greeting).build_transaction( @@ -296,7 +296,7 @@ def test_event_log_filter_by_topic(cluster): ) elif c == ERC20_CONTRACT: contract, _ = deploy_contract(w3, CONTRACTS[c]) - # validate deploy was successfull + # validate deploy was successful assert contract.caller.name() == "TestERC20" # create tx that emits event tx = contract.functions.transfer( diff --git a/tests/solidity/suites/basic/test/storage.js b/tests/solidity/suites/basic/test/storage.js index e42166dce0..701b09f5d4 100644 --- a/tests/solidity/suites/basic/test/storage.js +++ b/tests/solidity/suites/basic/test/storage.js @@ -11,13 +11,13 @@ contract('Test Storage Contract', async function (accounts) { expect(storageInstance.address).not.to.be.undefined }) - it('should succesfully store a value', async function () { + it('should successfully store a value', async function () { const tx = await storageInstance.store(888) /* eslint-disable no-unused-expressions */ expect(tx.tx).not.to.be.undefined }) - it('should succesfully retrieve a value', async function () { + it('should successfully retrieve a value', async function () { const value = await storageInstance.retrieve() expect(value.toString()).to.equal('888') }) diff --git a/tests/solidity/suites/opcode/contracts/OpCodes.sol b/tests/solidity/suites/opcode/contracts/OpCodes.sol index e9de4d3b86..1de7c5af35 100644 --- a/tests/solidity/suites/opcode/contracts/OpCodes.sol +++ b/tests/solidity/suites/opcode/contracts/OpCodes.sol @@ -182,7 +182,7 @@ contract OpCodes { assembly { let x := mload(0x40) //Find empty storage location using "free memory pointer" - mstore(x,sig) //Place signature at begining of empty storage + mstore(x,sig) //Place signature at beginning of empty storage mstore(add(x,0x04),a) // first address parameter. just after signature mstore(add(x,0x24),a) // 2nd address parameter - first padded. add 32 bytes (not 20 bytes) mstore(0x40,add(x,0x64)) // this is missing in other examples. Set free pointer before function call. so it is used by called function. @@ -201,7 +201,7 @@ contract OpCodes { //callcode assembly { let x := mload(0x40) //Find empty storage location using "free memory pointer" - mstore(x,sig) //Place signature at begining of empty storage + mstore(x,sig) //Place signature at beginning of empty storage mstore(add(x,0x04),a) // first address parameter. just after signature mstore(add(x,0x24),a) // 2nd address parameter - first padded. add 32 bytes (not 20 bytes) mstore(0x40,add(x,0x64)) // this is missing in other examples. Set free pointer before function call. so it is used by called function. @@ -220,7 +220,7 @@ contract OpCodes { //delegatecall assembly { let x := mload(0x40) //Find empty storage location using "free memory pointer" - mstore(x,sig) //Place signature at begining of empty storage + mstore(x,sig) //Place signature at beginning of empty storage mstore(add(x,0x04),a) // first address parameter. just after signature mstore(add(x,0x24),a) // 2nd address parameter - first padded. add 32 bytes (not 20 bytes) mstore(0x40,add(x,0x64)) // this is missing in other examples. Set free pointer before function call. so it is used by called function. From 0dacbea02fc350da7c3f94106ae3feb1e4db73f1 Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Fri, 15 Dec 2023 12:23:35 -0300 Subject: [PATCH 035/345] chore(docker) update deps (#2197) --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 1b57a94f73..082b1e5793 100644 --- a/Dockerfile +++ b/Dockerfile @@ -43,7 +43,7 @@ COPY --from=build-env /target/usr/lib /usr/lib COPY --from=build-env /target/usr/local/lib /usr/local/lib COPY --from=build-env /target/usr/include /usr/include -RUN apk add --no-cache ca-certificates=20230506-r0 jq=1.7-r2 curl=8.5.0-r0 bash=5.2.21-r0 vim=9.0.2127-r0 lz4=1.9.4-r5 rclone=1.65.0-r0 \ +RUN apk add --no-cache ca-certificates=20230506-r0 jq=1.7.1-r0 curl=8.5.0-r0 bash=5.2.21-r0 vim=9.0.2127-r0 lz4=1.9.4-r5 rclone=1.65.0-r0 \ && addgroup -g 1000 evmos \ && adduser -S -h /home/evmos -D evmos -u 1000 -G evmos From 96857483806df9e7ab243b39c05e76e574c5af3a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Dec 2023 13:43:37 -0300 Subject: [PATCH 036/345] build(deps): bump github.com/linxGnu/grocksdb from 1.8.9 to 1.8.10 (#2194) * build(deps): bump github.com/linxGnu/grocksdb from 1.8.9 to 1.8.10 Bumps [github.com/linxGnu/grocksdb](https://github.com/linxGnu/grocksdb) from 1.8.9 to 1.8.10. - [Release notes](https://github.com/linxGnu/grocksdb/releases) - [Commits](https://github.com/linxGnu/grocksdb/compare/v1.8.9...v1.8.10) --- updated-dependencies: - dependency-name: github.com/linxGnu/grocksdb dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * gomod2nix generate --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: tom Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 1634e680f6..95b91b5ae0 100644 --- a/go.mod +++ b/go.mod @@ -29,7 +29,7 @@ require ( github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/hashicorp/go-version v1.6.0 github.com/improbable-eng/grpc-web v0.15.0 - github.com/linxGnu/grocksdb v1.8.9 + github.com/linxGnu/grocksdb v1.8.10 github.com/onsi/ginkgo/v2 v2.13.2 github.com/onsi/gomega v1.30.0 github.com/ory/dockertest/v3 v3.10.0 diff --git a/go.sum b/go.sum index ce1adf1ef2..7c0369d6b3 100644 --- a/go.sum +++ b/go.sum @@ -834,8 +834,8 @@ github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6 github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/linxGnu/grocksdb v1.8.9 h1:/s352A7OI/+tOxeecK21qJyLJ0YHI7J8gN/cXOKzEis= -github.com/linxGnu/grocksdb v1.8.9/go.mod h1:xZCIb5Muw+nhbDK4Y5UJuOrin5MceOuiXkVUR7vp4WY= +github.com/linxGnu/grocksdb v1.8.10 h1:6FAhBThErRfJaevGOZISYvkG7RD4gfzeq452X4r8pes= +github.com/linxGnu/grocksdb v1.8.10/go.mod h1:xZCIb5Muw+nhbDK4Y5UJuOrin5MceOuiXkVUR7vp4WY= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= diff --git a/gomod2nix.toml b/gomod2nix.toml index d72fe44b75..8d2fb30352 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -426,8 +426,8 @@ schema = 3 version = "v0.1.0" hash = "sha256-wQqGTtRWsfR9n0O/SXHVgECebbnNmHddxJIbG63OJBQ=" [mod."github.com/linxGnu/grocksdb"] - version = "v1.8.9" - hash = "sha256-5dTQFqlnm68kBqUHOQphugDR9HI195eQGspgkydGUK4=" + version = "v1.8.10" + hash = "sha256-HrhAhTVHPtsBCnWeFmoZI5qZdLIbWB5wofO+iS0xgLI=" [mod."github.com/magiconair/properties"] version = "v1.8.7" hash = "sha256-XQ2bnc2s7/IH3WxEO4GishZurMyKwEclZy1DXg+2xXc=" From b65edd7d0d2eee5c2ece8ca70b9b139e8bcc5ab9 Mon Sep 17 00:00:00 2001 From: alex <152680487+bodhi-crypo@users.noreply.github.com> Date: Mon, 18 Dec 2023 21:11:12 +0800 Subject: [PATCH 037/345] chore(rpc,proto,app,evm,erc20):fix typos (#2199) --- app/ante/cosmos/min_price.go | 2 +- precompiles/ics20/integration_test.go | 6 +++--- precompiles/ics20/utils_test.go | 2 +- proto/ethermint/evm/v1/tx.proto | 2 +- rpc/backend/node_info.go | 4 ++-- rpc/types/events.go | 8 ++++---- x/erc20/keeper/integration_test.go | 4 ++-- x/evm/types/tx.pb.go | 2 +- 8 files changed, 15 insertions(+), 15 deletions(-) diff --git a/app/ante/cosmos/min_price.go b/app/ante/cosmos/min_price.go index 27b17576b3..cf5c267e7e 100644 --- a/app/ante/cosmos/min_price.go +++ b/app/ante/cosmos/min_price.go @@ -81,7 +81,7 @@ func (mpd MinGasPriceDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate // Fees not provided (or flag "auto"). Then use the base fee to make the check pass if feeCoins == nil { return ctx, errorsmod.Wrapf(errortypes.ErrInsufficientFee, - "fee not provided. Please use the --fees flag or the --gas-price flag along with the --gas flag to estimate the fee. The minimun global fee for this tx is: %s", + "fee not provided. Please use the --fees flag or the --gas-price flag along with the --gas flag to estimate the fee. The minimum global fee for this tx is: %s", requiredFees) } diff --git a/precompiles/ics20/integration_test.go b/precompiles/ics20/integration_test.go index d1255630ea..4138367f14 100644 --- a/precompiles/ics20/integration_test.go +++ b/precompiles/ics20/integration_test.go @@ -1309,7 +1309,7 @@ var _ = Describe("Calling ICS20 precompile from another contract", func() { // finalBalance := s.app.BankKeeper.GetBalance(s.chainA.GetContext(), s.address.Bytes(), s.bondDenom) // Expect(finalBalance.Amount).To(Equal(initialEvmosBalance.Amount.Sub(fees))) - // check IBC coins balance remains unchaged + // check IBC coins balance remains unchanged finalOsmoBalance := s.app.BankKeeper.GetBalance(s.chainA.GetContext(), s.address.Bytes(), ibcDenom) Expect(finalOsmoBalance.Amount).To(Equal(initialOsmoBalance.Amount)) }) @@ -1408,7 +1408,7 @@ var _ = Describe("Calling ICS20 precompile from another contract", func() { // finalBalance := s.app.BankKeeper.GetBalance(s.chainA.GetContext(), s.address.Bytes(), s.bondDenom) // Expect(finalBalance.Amount).To(Equal(initialBalance.Amount.Sub(fees))) - // check Erc20 balance remained unchaged by sent amount + // check Erc20 balance remained unchanged by sent amount balance := s.app.Erc20Keeper.BalanceOf( s.chainA.GetContext(), evmoscontracts.ERC20MinterBurnerDecimalsContract.ABI, @@ -1493,7 +1493,7 @@ var _ = Describe("Calling ICS20 precompile from another contract", func() { }) }) - Context("tranfer a contract's funds", func() { + Context("transfer a contract's funds", func() { var defaultTransferArgs contracts.CallArgs BeforeEach(func() { diff --git a/precompiles/ics20/utils_test.go b/precompiles/ics20/utils_test.go index 4f972862bd..bf43783418 100644 --- a/precompiles/ics20/utils_test.go +++ b/precompiles/ics20/utils_test.go @@ -614,7 +614,7 @@ func (s *PrecompileTestSuite) setupERC20ContractTests(amount *big.Int) common.Ad } // makePacket is a helper function to build the sent IBC packet -// to perform an ICS20 tranfer. +// to perform an ICS20 transfer. // This packet is then used to test the IBC callbacks (Timeout, Ack) func (s *PrecompileTestSuite) makePacket( senderAddr, diff --git a/proto/ethermint/evm/v1/tx.proto b/proto/ethermint/evm/v1/tx.proto index dd6bc7e289..1e7e0f2fa9 100644 --- a/proto/ethermint/evm/v1/tx.proto +++ b/proto/ethermint/evm/v1/tx.proto @@ -101,7 +101,7 @@ message AccessListTx { bytes s = 11; } -// DynamicFeeTx is the data of EIP-1559 dinamic fee transactions. +// DynamicFeeTx is the data of EIP-1559 dynamic fee transactions. message DynamicFeeTx { option (gogoproto.goproto_getters) = false; option (cosmos_proto.implements_interface) = "TxData"; diff --git a/rpc/backend/node_info.go b/rpc/backend/node_info.go index 1242ad9b24..0125c7f012 100644 --- a/rpc/backend/node_info.go +++ b/rpc/backend/node_info.go @@ -104,10 +104,10 @@ func (b *Backend) SetEtherbase(etherbase common.Address) bool { return false } - // Fetch minimun gas price to calculate fees using the configuration. + // Fetch minimum gas price to calculate fees using the configuration. minGasPrices := b.cfg.GetMinGasPrices() if len(minGasPrices) == 0 || minGasPrices.Empty() { - b.logger.Debug("the minimun fee is not set") + b.logger.Debug("the minimum fee is not set") return false } minGasPriceValue := minGasPrices[0].Amount diff --git a/rpc/types/events.go b/rpc/types/events.go index d0853f35d6..83f13ba849 100644 --- a/rpc/types/events.go +++ b/rpc/types/events.go @@ -25,9 +25,9 @@ const ( // Event Format 1 (the format used before PR #1062): // ``` - // ethereum_tx(amount, ethereumTxHash, [txIndex, txGasUsed], txHash, [receipient], ethereumTxFailed) + // ethereum_tx(amount, ethereumTxHash, [txIndex, txGasUsed], txHash, [recipient], ethereumTxFailed) // tx_log(txLog, txLog, ...) - // ethereum_tx(amount, ethereumTxHash, [txIndex, txGasUsed], txHash, [receipient], ethereumTxFailed) + // ethereum_tx(amount, ethereumTxHash, [txIndex, txGasUsed], txHash, [recipient], ethereumTxFailed) // tx_log(txLog, txLog, ...) // ... // ``` @@ -38,9 +38,9 @@ const ( // ethereum_tx(ethereumTxHash, txIndex) // ethereum_tx(ethereumTxHash, txIndex) // ... - // ethereum_tx(amount, ethereumTxHash, txIndex, txGasUsed, txHash, [receipient], ethereumTxFailed) + // ethereum_tx(amount, ethereumTxHash, txIndex, txGasUsed, txHash, [recipient], ethereumTxFailed) // tx_log(txLog, txLog, ...) - // ethereum_tx(amount, ethereumTxHash, txIndex, txGasUsed, txHash, [receipient], ethereumTxFailed) + // ethereum_tx(amount, ethereumTxHash, txIndex, txGasUsed, txHash, [recipient], ethereumTxFailed) // tx_log(txLog, txLog, ...) // ... // ``` diff --git a/x/erc20/keeper/integration_test.go b/x/erc20/keeper/integration_test.go index cc4772cc8d..d756ec2159 100644 --- a/x/erc20/keeper/integration_test.go +++ b/x/erc20/keeper/integration_test.go @@ -282,7 +282,7 @@ var _ = Describe("ERC20:", Ordered, func() { Expect(balanceERC20.Int64()).To(Equal(amt.Int64())) }) - It("should send coins to the recevier account", func() { + It("should send coins to the receiver account", func() { balanceCoin := s.app.BankKeeper.GetBalance(s.ctx, accAddr, pair.Denom) Expect(balanceCoin).To(Equal(coin)) }) @@ -306,7 +306,7 @@ var _ = Describe("ERC20:", Ordered, func() { Expect(balanceERC20.Int64()).To(Equal(int64(0))) }) - It("should burn coins to the recevier account", func() { + It("should burn coins to the receiver account", func() { balanceCoin := s.app.BankKeeper.GetBalance(s.ctx, accAddr, pair.Denom) Expect(balanceCoin.IsZero()).To(BeTrue()) }) diff --git a/x/evm/types/tx.pb.go b/x/evm/types/tx.pb.go index 691790f6cf..797d22cef6 100644 --- a/x/evm/types/tx.pb.go +++ b/x/evm/types/tx.pb.go @@ -197,7 +197,7 @@ func (m *AccessListTx) XXX_DiscardUnknown() { var xxx_messageInfo_AccessListTx proto.InternalMessageInfo -// DynamicFeeTx is the data of EIP-1559 dinamic fee transactions. +// DynamicFeeTx is the data of EIP-1559 dynamic fee transactions. type DynamicFeeTx struct { // chain_id of the destination EVM chain ChainID *cosmossdk_io_math.Int `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3,customtype=cosmossdk.io/math.Int" json:"chainID"` From 7dfc497e7a9ad8190f14e21b5fbfa5bcad131f80 Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Mon, 18 Dec 2023 10:32:55 -0300 Subject: [PATCH 038/345] chore(upgrade): remove deprecated gov proposals (incentives) (#2196) * wip - add remove proposal logic * add incentives code * keep only incentives types * update tests * update upgrade logic * remove unnecessary types * update upgrade logic * update comments * make format * fix lint issues * add changelog entry * update upgrade logic --- CHANGELOG.md | 1 + app/app.go | 3 + app/upgrades/v16/proposals.go | 47 + app/upgrades/v16/upgrades.go | 19 +- app/upgrades/v16/upgrades_test.go | 74 + proto/evmos/incentives/v1/genesis.proto | 33 + proto/evmos/incentives/v1/incentives.proto | 61 + x/incentives/module.go | 117 ++ x/incentives/types/codec.go | 34 + x/incentives/types/genesis.pb.go | 772 +++++++++++ x/incentives/types/incentives.pb.go | 1445 ++++++++++++++++++++ x/incentives/types/keys.go | 55 + x/incentives/types/proposal.go | 60 + 13 files changed, 2715 insertions(+), 6 deletions(-) create mode 100644 app/upgrades/v16/proposals.go create mode 100644 proto/evmos/incentives/v1/genesis.proto create mode 100644 proto/evmos/incentives/v1/incentives.proto create mode 100644 x/incentives/module.go create mode 100644 x/incentives/types/codec.go create mode 100644 x/incentives/types/genesis.pb.go create mode 100644 x/incentives/types/incentives.pb.go create mode 100644 x/incentives/types/keys.go create mode 100644 x/incentives/types/proposal.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 94555ce942..d332385fc4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -150,6 +150,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (evm) [#1943](https://github.com/evmos/evmos/pull/1943) Fix gas estimation (`eth_estimateGas`) to be consistent with gas used in EVM extensions transactions. - (test) [#1989](https://github.com/evmos/evmos/pull/1989) Fix the problem about deliverTxSimulate in test app/ante/cosmos/min_price_test.go - (db) [#2072](https://github.com/evmos/evmos/pull/2072) Change VersionDb directory permission from 777 (insecure) to 750 (general) +- (api) [#2196](https://github.com/evmos/evmos/pull/2196) Remove governance proposals related to the deprecated `x/incentives` module to fix the governance proposals query. ## [v15.0.0] - 2023-10-31 diff --git a/app/app.go b/app/app.go index 9da54a5350..6bdd1ee9b8 100644 --- a/app/app.go +++ b/app/app.go @@ -143,6 +143,7 @@ import ( "github.com/evmos/evmos/v16/x/feemarket" feemarketkeeper "github.com/evmos/evmos/v16/x/feemarket/keeper" feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" + "github.com/evmos/evmos/v16/x/incentives" inflation "github.com/evmos/evmos/v16/x/inflation/v1" inflationkeeper "github.com/evmos/evmos/v16/x/inflation/v1/keeper" inflationtypes "github.com/evmos/evmos/v16/x/inflation/v1/types" @@ -226,6 +227,7 @@ var ( epochs.AppModuleBasic{}, revenue.AppModuleBasic{}, consensus.AppModuleBasic{}, + incentives.AppModuleBasic{}, ) // module account permissions @@ -1136,6 +1138,7 @@ func (app *Evmos) setupUpgradeHandlers() { app.BankKeeper, app.InflationKeeper, app.AccountKeeper, + app.GovKeeper, ), ) diff --git a/app/upgrades/v16/proposals.go b/app/upgrades/v16/proposals.go new file mode 100644 index 0000000000..f55ac3113a --- /dev/null +++ b/app/upgrades/v16/proposals.go @@ -0,0 +1,47 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package v16 + +import ( + "github.com/cometbft/cometbft/libs/log" + + sdk "github.com/cosmos/cosmos-sdk/types" + govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1" + incentives "github.com/evmos/evmos/v16/x/incentives/types" +) + +// DeleteIncentivesProposals deletes the RegisterIncentives & CancelIncentiveProposal proposals from the store +// because the module was deprecated +func DeleteIncentivesProposals(ctx sdk.Context, gk govkeeper.Keeper, logger log.Logger) { + // Delete the only incentives module proposals + gk.IterateProposals(ctx, func(proposal govtypes.Proposal) bool { + // Check if proposal is a RegisterIncentives or CancelIncentiveProposal proposal + msgs, err := proposal.GetMsgs() + if err != nil { + logger.Error("failed to get proposal messages", "error", err.Error()) + return false + } + + for _, msg := range msgs { + legacyContentMsg, ok := msg.(*govtypes.MsgExecLegacyContent) + if !ok { + continue + } + + _, ok = legacyContentMsg.Content.GetCachedValue().(*incentives.RegisterIncentiveProposal) + if ok { + gk.DeleteProposal(ctx, proposal.Id) + continue + } + + _, ok = legacyContentMsg.Content.GetCachedValue().(*incentives.CancelIncentiveProposal) + if ok { + gk.DeleteProposal(ctx, proposal.Id) + continue + } + } + return false + }) +} diff --git a/app/upgrades/v16/upgrades.go b/app/upgrades/v16/upgrades.go index f0f2e412bb..5b5f95f9d3 100644 --- a/app/upgrades/v16/upgrades.go +++ b/app/upgrades/v16/upgrades.go @@ -7,6 +7,7 @@ import ( "github.com/cosmos/cosmos-sdk/types/module" authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" + govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" "github.com/evmos/evmos/v16/precompiles/bech32" osmosisoutpost "github.com/evmos/evmos/v16/precompiles/outposts/osmosis" @@ -24,7 +25,8 @@ func CreateUpgradeHandler( ek *evmkeeper.Keeper, _ bankkeeper.Keeper, inflationKeeper inflationkeeper.Keeper, - _ authkeeper.AccountKeeper, + ak authkeeper.AccountKeeper, + gk govkeeper.Keeper, ) upgradetypes.UpgradeHandler { return func(ctx sdk.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { logger := ctx.Logger().With("upgrade", UpgradeName) @@ -45,12 +47,13 @@ func CreateUpgradeHandler( logger.Error("failed to enable outposts", "error", err.Error()) } - // TODO: uncomment when ready // Migrate the FeeCollector module account to include the Burner permission. - // if err := MigrateFeeCollector(ak, ctx); err != nil { - // logger.Error("failed to migrate the fee collector", "error", err.Error()) - // } - // + // This is required when including the postHandler to burn Cosmos Tx fees + if err := MigrateFeeCollector(ak, ctx); err != nil { + logger.Error("failed to migrate the fee collector", "error", err.Error()) + } + + // TODO: uncomment when ready // if err := BurnUsageIncentivesPool(ctx, bankKeeper); err != nil { // logger.Error("failed to burn inflation pool", "error", err.Error()) // } @@ -59,6 +62,10 @@ func CreateUpgradeHandler( logger.Error("failed to update inflation params", "error", err.Error()) } + // Remove the deprecated governance proposals from store + logger.Debug("deleting deprecated incentives module proposals...") + DeleteIncentivesProposals(ctx, gk, logger) + // recovery module is deprecated logger.Debug("deleting recovery module from version map...") delete(vm, "recovery") diff --git a/app/upgrades/v16/upgrades_test.go b/app/upgrades/v16/upgrades_test.go index 1b32420d4e..20ea07f1cb 100644 --- a/app/upgrades/v16/upgrades_test.go +++ b/app/upgrades/v16/upgrades_test.go @@ -4,13 +4,22 @@ package v16_test import ( + "time" + "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth/types" + govtypesv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" + govtypesv1beta "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" + upgrade "github.com/cosmos/cosmos-sdk/x/upgrade/types" v16 "github.com/evmos/evmos/v16/app/upgrades/v16" + "github.com/evmos/evmos/v16/crypto/ethsecp256k1" + "github.com/evmos/evmos/v16/testutil" testnetwork "github.com/evmos/evmos/v16/testutil/integration/evmos/network" + utiltx "github.com/evmos/evmos/v16/testutil/tx" "github.com/evmos/evmos/v16/utils" + incentives "github.com/evmos/evmos/v16/x/incentives/types" ) func (its *IntegrationTestSuite) TestMigrateFeeCollector() { @@ -70,3 +79,68 @@ func (its *IntegrationTestSuite) TestUpdateInflationParams() { finalParams := its.network.App.InflationKeeper.GetParams(its.network.GetContext()) its.Require().Equal(math.LegacyZeroDec(), finalParams.InflationDistribution.UsageIncentives) //nolint:staticcheck } + +func (its *IntegrationTestSuite) TestDeleteIncentivesProposals() { + its.SetupTest() + + // Create 3 proposals. 2 will be deleted because correspond to the incentives module + expInitialProps := 3 + expFinalProps := 1 + prop1 := &incentives.RegisterIncentiveProposal{ + Title: "Test", + Description: "Test Register Incentive Proposal", + Contract: utiltx.GenerateAddress().String(), + Allocations: sdk.DecCoins{sdk.NewDecCoinFromDec("aevmos", sdk.NewDecWithPrec(5, 2))}, + Epochs: 100, + } + + prop2 := &upgrade.SoftwareUpgradeProposal{ //nolint:staticcheck + Title: "Test", + Description: "Test Software Upgrade Proposal", + Plan: upgrade.Plan{}, + } + + prop3 := &incentives.CancelIncentiveProposal{ + Title: "Test", + Description: "Test Cancel Incentive Proposal", + Contract: utiltx.GenerateAddress().String(), + } + + privKey, _ := ethsecp256k1.GenerateKey() + addrBz := privKey.PubKey().Address().Bytes() + accAddr := sdk.AccAddress(addrBz) + coins := sdk.NewCoins(sdk.NewCoin(its.network.GetDenom(), math.NewInt(5e18))) + err := testutil.FundAccount(its.network.GetContext(), its.network.App.BankKeeper, accAddr, coins) + its.Require().NoError(err) + + for _, prop := range []govtypesv1beta.Content{prop1, prop2, prop3} { + its.createProposal(prop, accAddr) + } + + // check the creation of the 3 proposals was successful + allProposalsBefore := its.network.App.GovKeeper.GetProposals(its.network.GetContext()) + its.Require().Len(allProposalsBefore, expInitialProps) + + // Delete the corresponding proposals + logger := its.network.GetContext().Logger() + v16.DeleteIncentivesProposals(its.network.GetContext(), its.network.App.GovKeeper, logger) + + allProposalsAfter := its.network.App.GovKeeper.GetProposals(its.network.GetContext()) + its.Require().Len(allProposalsAfter, expFinalProps) +} + +func (its *IntegrationTestSuite) createProposal(content govtypesv1beta.Content, acc sdk.AccAddress) { + allProposalsBefore := its.network.App.GovKeeper.GetProposals(its.network.GetContext()) + propID := len(allProposalsBefore) + 1 + + legacyContent, err := govtypesv1.NewLegacyContent( + content, + sdk.MustBech32ifyAddressBytes(sdk.GetConfig().GetBech32AccountAddrPrefix(), acc), + ) + its.Require().NoError(err) + + proposalMsgs := []sdk.Msg{legacyContent} + newProposal, err := govtypesv1.NewProposal(proposalMsgs, uint64(propID), time.Now(), time.Now().Add(time.Hour*5), "", "Test", "Test", acc) + its.Require().NoError(err) + its.network.App.GovKeeper.SetProposal(its.network.GetContext(), newProposal) +} diff --git a/proto/evmos/incentives/v1/genesis.proto b/proto/evmos/incentives/v1/genesis.proto new file mode 100644 index 0000000000..f6b1a33bf9 --- /dev/null +++ b/proto/evmos/incentives/v1/genesis.proto @@ -0,0 +1,33 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) +syntax = "proto3"; +package evmos.incentives.v1; +import "evmos/incentives/v1/incentives.proto"; + +import "gogoproto/gogo.proto"; + +option go_package = "github.com/evmos/evmos/v16/x/incentives/types"; + +// GenesisState defines the module's genesis state. +message GenesisState { + // params are the incentives module parameters + Params params = 1 [(gogoproto.nullable) = false]; + // incentives is a slice of active incentives + repeated Incentive incentives = 2 [(gogoproto.nullable) = false]; + // gas_meters is a slice of active Gasmeters + repeated GasMeter gas_meters = 3 [(gogoproto.nullable) = false]; +} + +// Params defines the incentives module params +message Params { + // enable_incentives is the parameter to enable incentives + bool enable_incentives = 1; + // allocation_limit is the maximum percentage an incentive can allocate per denomination + string allocation_limit = 2 + [(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.nullable) = false]; + // incentives_epoch_identifier for the epochs module hooks + string incentives_epoch_identifier = 3; + // reward_scaler is the scaling factor for capping rewards + string reward_scaler = 4 + [(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.nullable) = false]; +} \ No newline at end of file diff --git a/proto/evmos/incentives/v1/incentives.proto b/proto/evmos/incentives/v1/incentives.proto new file mode 100644 index 0000000000..019233d6eb --- /dev/null +++ b/proto/evmos/incentives/v1/incentives.proto @@ -0,0 +1,61 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) +syntax = "proto3"; +package evmos.incentives.v1; + +import "cosmos/base/v1beta1/coin.proto"; +import "gogoproto/gogo.proto"; +import "google/protobuf/timestamp.proto"; +option go_package = "github.com/evmos/evmos/v16/x/incentives/types"; + +// Incentive defines an instance that organizes distribution conditions for a +// given smart contract +message Incentive { + // contract address of the smart contract to be incentivized + string contract = 1; + // allocations is a slice of denoms and percentages of rewards to be allocated + repeated cosmos.base.v1beta1.DecCoin allocations = 2 + [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.DecCoins"]; + // epochs defines the number of remaining epochs for the incentive + uint32 epochs = 3; + // start_time of the incentive distribution + google.protobuf.Timestamp start_time = 4 [(gogoproto.stdtime) = true, (gogoproto.nullable) = false]; + // total_gas is the cumulative gas spent by all gas meters of the incentive during the epoch + uint64 total_gas = 5; +} +// GasMeter tracks the cumulative gas spent per participant in one epoch +message GasMeter { + // contract is the hex address of the incentivized smart contract + string contract = 1; + // participant address that interacts with the incentive + string participant = 2; + // cumulative_gas spent during the epoch + uint64 cumulative_gas = 3; +} + +// RegisterIncentiveProposal is a gov Content type to register an incentive +message RegisterIncentiveProposal { + option (gogoproto.equal) = false; + // title of the proposal + string title = 1; + // description of the proposal + string description = 2; + // contract address to be registered + string contract = 3; + // allocations defines the denoms and percentage of rewards to be allocated + repeated cosmos.base.v1beta1.DecCoin allocations = 4 + [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.DecCoins"]; + // epochs is the number of remaining epochs for the incentive + uint32 epochs = 5; +} + +// CancelIncentiveProposal is a gov Content type to cancel an incentive +message CancelIncentiveProposal { + option (gogoproto.equal) = false; + // title of the proposal + string title = 1; + // description of the proposal + string description = 2; + // contract address of the incentivized smart contract + string contract = 3; +} \ No newline at end of file diff --git a/x/incentives/module.go b/x/incentives/module.go new file mode 100644 index 0000000000..f8de2791e5 --- /dev/null +++ b/x/incentives/module.go @@ -0,0 +1,117 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package incentives + +// NOTE: THIS MODULE IS DEPRECATED +// WE'RE KEEPING THIS CODE FOR v16 RELEASE +// TO HAVE THE INTERFACES REGISTERED TO REMOVE THE +// EXISTING PROPOSALS FROM STORE +// REMOVE THIS MODULE IN THE FOLLOWING RELEASE AFTER DELETING +// THE GOV PROPOSALS + +import ( + "encoding/json" + + abci "github.com/cometbft/cometbft/abci/types" + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/codec" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/gorilla/mux" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/spf13/cobra" + + "github.com/evmos/evmos/v16/x/incentives/types" +) + +// consensusVersion defines the current x/incentives module consensus version. +var consensusVersion uint64 = 2 + +// type check to ensure the interface is properly implemented +var ( + _ module.AppModule = AppModule{} + _ module.AppModuleBasic = AppModuleBasic{} + _ module.AppModuleSimulation = AppModule{} +) + +// app module Basics object +type AppModuleBasic struct{} + +func (AppModuleBasic) Name() string { + return types.ModuleName +} + +// RegisterLegacyAminoCodec performs a no-op as the incentives doesn't support Amino encoding +func (AppModuleBasic) RegisterLegacyAminoCodec(_ *codec.LegacyAmino) {} + +// ConsensusVersion returns the consensus state-breaking version for the module. +func (AppModuleBasic) ConsensusVersion() uint64 { + return consensusVersion +} + +// RegisterInterfaces registers interfaces and implementations of the incentives +// module. +func (AppModuleBasic) RegisterInterfaces(interfaceRegistry codectypes.InterfaceRegistry) { + types.RegisterInterfaces(interfaceRegistry) +} + +// DefaultGenesis returns default genesis state as raw bytes for the incentives +// module. +func (AppModuleBasic) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { + return cdc.MustMarshalJSON(&types.GenesisState{}) +} + +func (b AppModuleBasic) ValidateGenesis(_ codec.JSONCodec, _ client.TxEncodingConfig, _ json.RawMessage) error { + return nil +} + +// RegisterRESTRoutes performs a no-op as the incentives module doesn't expose REST +// endpoints +func (AppModuleBasic) RegisterRESTRoutes(_ client.Context, _ *mux.Router) {} + +func (b AppModuleBasic) RegisterGRPCGatewayRoutes(_ client.Context, _ *runtime.ServeMux) { +} + +// GetTxCmd returns the root tx command for the incentives module. +func (AppModuleBasic) GetTxCmd() *cobra.Command { return nil } + +// GetQueryCmd returns no root query command for the incentives module. +func (AppModuleBasic) GetQueryCmd() *cobra.Command { return nil } + +type AppModule struct { + AppModuleBasic +} + +func (AppModule) Name() string { + return types.ModuleName +} + +func (am AppModule) RegisterInvariants(_ sdk.InvariantRegistry) {} + +// NewHandler returns nil incentives module doesn't expose tx gRPC endpoints +func (am AppModule) NewHandler() sdk.Handler { + return nil +} + +func (am AppModule) RegisterServices(_ module.Configurator) {} + +func (am AppModule) InitGenesis(_ sdk.Context, _ codec.JSONCodec, _ json.RawMessage) []abci.ValidatorUpdate { + return []abci.ValidatorUpdate{} +} + +func (am AppModule) ExportGenesis(_ sdk.Context, cdc codec.JSONCodec) json.RawMessage { + return cdc.MustMarshalJSON(&types.GenesisState{}) +} + +func (am AppModule) GenerateGenesisState(_ *module.SimulationState) { +} + +func (am AppModule) RegisterStoreDecoder(_ sdk.StoreDecoderRegistry) { +} + +func (am AppModule) WeightedOperations(_ module.SimulationState) []simtypes.WeightedOperation { + return []simtypes.WeightedOperation{} +} diff --git a/x/incentives/types/codec.go b/x/incentives/types/codec.go new file mode 100644 index 0000000000..f39489219a --- /dev/null +++ b/x/incentives/types/codec.go @@ -0,0 +1,34 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package types + +import ( + "github.com/cosmos/cosmos-sdk/codec" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" +) + +var ( + amino = codec.NewLegacyAmino() + // ModuleCdc references the global evm module codec. Note, the codec should + // ONLY be used in certain instances of tests and for JSON encoding. + ModuleCdc = codec.NewProtoCodec(codectypes.NewInterfaceRegistry()) + + // AminoCdc is a amino codec created to support amino JSON compatible msgs. + AminoCdc = codec.NewAminoCodec(amino) +) + +// NOTE: This is required for the GetSignBytes function +func init() { + amino.Seal() +} + +// RegisterInterfaces register implementations +func RegisterInterfaces(registry codectypes.InterfaceRegistry) { + registry.RegisterImplementations( + (*govv1beta1.Content)(nil), + &RegisterIncentiveProposal{}, + &CancelIncentiveProposal{}, + ) +} diff --git a/x/incentives/types/genesis.pb.go b/x/incentives/types/genesis.pb.go new file mode 100644 index 0000000000..df4efbd006 --- /dev/null +++ b/x/incentives/types/genesis.pb.go @@ -0,0 +1,772 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: evmos/incentives/v1/genesis.proto + +package types + +import ( + fmt "fmt" + github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// GenesisState defines the module's genesis state. +type GenesisState struct { + // params are the incentives module parameters + Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"` + // incentives is a slice of active incentives + Incentives []Incentive `protobuf:"bytes,2,rep,name=incentives,proto3" json:"incentives"` + // gas_meters is a slice of active Gasmeters + GasMeters []GasMeter `protobuf:"bytes,3,rep,name=gas_meters,json=gasMeters,proto3" json:"gas_meters"` +} + +func (m *GenesisState) Reset() { *m = GenesisState{} } +func (m *GenesisState) String() string { return proto.CompactTextString(m) } +func (*GenesisState) ProtoMessage() {} +func (*GenesisState) Descriptor() ([]byte, []int) { + return fileDescriptor_7bb1f7c7e8ad160b, []int{0} +} +func (m *GenesisState) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GenesisState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GenesisState.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *GenesisState) XXX_Merge(src proto.Message) { + xxx_messageInfo_GenesisState.Merge(m, src) +} +func (m *GenesisState) XXX_Size() int { + return m.Size() +} +func (m *GenesisState) XXX_DiscardUnknown() { + xxx_messageInfo_GenesisState.DiscardUnknown(m) +} + +var xxx_messageInfo_GenesisState proto.InternalMessageInfo + +func (m *GenesisState) GetParams() Params { + if m != nil { + return m.Params + } + return Params{} +} + +func (m *GenesisState) GetIncentives() []Incentive { + if m != nil { + return m.Incentives + } + return nil +} + +func (m *GenesisState) GetGasMeters() []GasMeter { + if m != nil { + return m.GasMeters + } + return nil +} + +// Params defines the incentives module params +type Params struct { + // enable_incentives is the parameter to enable incentives + EnableIncentives bool `protobuf:"varint,1,opt,name=enable_incentives,json=enableIncentives,proto3" json:"enable_incentives,omitempty"` + // allocation_limit is the maximum percentage an incentive can allocate per denomination + AllocationLimit github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=allocation_limit,json=allocationLimit,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"allocation_limit"` + // incentives_epoch_identifier for the epochs module hooks + IncentivesEpochIdentifier string `protobuf:"bytes,3,opt,name=incentives_epoch_identifier,json=incentivesEpochIdentifier,proto3" json:"incentives_epoch_identifier,omitempty"` + // reward_scaler is the scaling factor for capping rewards + RewardScaler github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,4,opt,name=reward_scaler,json=rewardScaler,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"reward_scaler"` +} + +func (m *Params) Reset() { *m = Params{} } +func (m *Params) String() string { return proto.CompactTextString(m) } +func (*Params) ProtoMessage() {} +func (*Params) Descriptor() ([]byte, []int) { + return fileDescriptor_7bb1f7c7e8ad160b, []int{1} +} +func (m *Params) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Params) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Params.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Params) XXX_Merge(src proto.Message) { + xxx_messageInfo_Params.Merge(m, src) +} +func (m *Params) XXX_Size() int { + return m.Size() +} +func (m *Params) XXX_DiscardUnknown() { + xxx_messageInfo_Params.DiscardUnknown(m) +} + +var xxx_messageInfo_Params proto.InternalMessageInfo + +func (m *Params) GetEnableIncentives() bool { + if m != nil { + return m.EnableIncentives + } + return false +} + +func (m *Params) GetIncentivesEpochIdentifier() string { + if m != nil { + return m.IncentivesEpochIdentifier + } + return "" +} + +func init() { + proto.RegisterType((*GenesisState)(nil), "evmos.incentives.v1.GenesisState") + proto.RegisterType((*Params)(nil), "evmos.incentives.v1.Params") +} + +func init() { proto.RegisterFile("evmos/incentives/v1/genesis.proto", fileDescriptor_7bb1f7c7e8ad160b) } + +var fileDescriptor_7bb1f7c7e8ad160b = []byte{ + // 404 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x92, 0xc1, 0xea, 0xd3, 0x40, + 0x10, 0x87, 0x93, 0xf6, 0x4f, 0xb1, 0xdb, 0x8a, 0x35, 0x7a, 0x88, 0x2d, 0xa6, 0xb5, 0x88, 0x14, + 0xa4, 0x1b, 0x5a, 0x41, 0xf0, 0xe2, 0x21, 0x54, 0x4a, 0x41, 0x41, 0xd2, 0x93, 0x5e, 0xc2, 0x36, + 0x1d, 0xd3, 0xc5, 0x24, 0x1b, 0xb2, 0x6b, 0xd4, 0xb7, 0xf0, 0x25, 0x7c, 0x97, 0x1e, 0x0b, 0x5e, + 0xc4, 0x43, 0x91, 0xf6, 0x45, 0x64, 0x77, 0xa3, 0xc9, 0x21, 0x27, 0x2f, 0xc9, 0x4e, 0xf2, 0xcd, + 0xf7, 0x9b, 0x84, 0x41, 0x8f, 0xa0, 0x48, 0x18, 0x77, 0x69, 0x1a, 0x42, 0x2a, 0x68, 0x01, 0xdc, + 0x2d, 0x16, 0x6e, 0x04, 0x29, 0x70, 0xca, 0x71, 0x96, 0x33, 0xc1, 0xac, 0x7b, 0x0a, 0xc1, 0x15, + 0x82, 0x8b, 0xc5, 0xf0, 0x71, 0x53, 0x5f, 0x0d, 0x51, 0xad, 0xc3, 0xfb, 0x11, 0x8b, 0x98, 0x3a, + 0xba, 0xf2, 0xa4, 0x9f, 0x4e, 0x7f, 0x98, 0xa8, 0xbf, 0xd6, 0x11, 0x5b, 0x41, 0x04, 0x58, 0x2f, + 0x50, 0x27, 0x23, 0x39, 0x49, 0xb8, 0x6d, 0x4e, 0xcc, 0x59, 0x6f, 0x39, 0xc2, 0x0d, 0x91, 0xf8, + 0xad, 0x42, 0xbc, 0x9b, 0xe3, 0x79, 0x6c, 0xf8, 0x65, 0x83, 0xb5, 0x42, 0xa8, 0xa2, 0xec, 0xd6, + 0xa4, 0x3d, 0xeb, 0x2d, 0x9d, 0xc6, 0xf6, 0xcd, 0xdf, 0xaa, 0x34, 0xd4, 0xfa, 0x2c, 0x0f, 0xa1, + 0x88, 0xf0, 0x20, 0x01, 0x01, 0x39, 0xb7, 0xdb, 0xca, 0xf2, 0xb0, 0xd1, 0xb2, 0x26, 0xfc, 0x8d, + 0xa4, 0x4a, 0x49, 0x37, 0x2a, 0x6b, 0x3e, 0xfd, 0xde, 0x42, 0x1d, 0x3d, 0xa2, 0xf5, 0x14, 0xdd, + 0x85, 0x94, 0xec, 0x62, 0x08, 0x6a, 0xb3, 0xc9, 0x4f, 0xbb, 0xe5, 0x0f, 0xf4, 0x8b, 0x4d, 0x95, + 0xfd, 0x0e, 0x0d, 0x48, 0x1c, 0xb3, 0x90, 0x08, 0xca, 0xd2, 0x20, 0xa6, 0x09, 0x15, 0x76, 0x6b, + 0x62, 0xce, 0xba, 0x1e, 0x96, 0x11, 0xbf, 0xce, 0xe3, 0x27, 0x11, 0x15, 0x87, 0x4f, 0x3b, 0x1c, + 0xb2, 0xc4, 0x0d, 0x19, 0x97, 0xff, 0x5d, 0xdf, 0xe6, 0x7c, 0xff, 0xd1, 0x15, 0x5f, 0x33, 0xe0, + 0x78, 0x05, 0xa1, 0x7f, 0xa7, 0xf2, 0xbc, 0x96, 0x1a, 0xeb, 0x25, 0x1a, 0x55, 0x03, 0x04, 0x90, + 0xb1, 0xf0, 0x10, 0xd0, 0xbd, 0xac, 0x3f, 0x50, 0xc8, 0xed, 0xb6, 0x4c, 0xf1, 0x1f, 0x54, 0xc8, + 0x2b, 0x49, 0x6c, 0xfe, 0x01, 0xd6, 0x16, 0xdd, 0xce, 0xe1, 0x33, 0xc9, 0xf7, 0x01, 0x0f, 0x49, + 0x0c, 0xb9, 0x7d, 0xf3, 0x5f, 0x73, 0xf5, 0xb5, 0x64, 0xab, 0x1c, 0xde, 0xfa, 0x78, 0x71, 0xcc, + 0xd3, 0xc5, 0x31, 0x7f, 0x5f, 0x1c, 0xf3, 0xdb, 0xd5, 0x31, 0x4e, 0x57, 0xc7, 0xf8, 0x79, 0x75, + 0x8c, 0xf7, 0xf3, 0x9a, 0x4f, 0xaf, 0x97, 0xbe, 0x16, 0x8b, 0xe7, 0xee, 0x97, 0xfa, 0xaa, 0x29, + 0xf5, 0xae, 0xa3, 0xb6, 0xe9, 0xd9, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x20, 0xc0, 0x72, 0x15, + 0xc3, 0x02, 0x00, 0x00, +} + +func (m *GenesisState) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *GenesisState) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.GasMeters) > 0 { + for iNdEx := len(m.GasMeters) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.GasMeters[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if len(m.Incentives) > 0 { + for iNdEx := len(m.Incentives) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Incentives[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + { + size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *Params) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Params) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size := m.RewardScaler.Size() + i -= size + if _, err := m.RewardScaler.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + if len(m.IncentivesEpochIdentifier) > 0 { + i -= len(m.IncentivesEpochIdentifier) + copy(dAtA[i:], m.IncentivesEpochIdentifier) + i = encodeVarintGenesis(dAtA, i, uint64(len(m.IncentivesEpochIdentifier))) + i-- + dAtA[i] = 0x1a + } + { + size := m.AllocationLimit.Size() + i -= size + if _, err := m.AllocationLimit.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + if m.EnableIncentives { + i-- + if m.EnableIncentives { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func encodeVarintGenesis(dAtA []byte, offset int, v uint64) int { + offset -= sovGenesis(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *GenesisState) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Params.Size() + n += 1 + l + sovGenesis(uint64(l)) + if len(m.Incentives) > 0 { + for _, e := range m.Incentives { + l = e.Size() + n += 1 + l + sovGenesis(uint64(l)) + } + } + if len(m.GasMeters) > 0 { + for _, e := range m.GasMeters { + l = e.Size() + n += 1 + l + sovGenesis(uint64(l)) + } + } + return n +} + +func (m *Params) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.EnableIncentives { + n += 2 + } + l = m.AllocationLimit.Size() + n += 1 + l + sovGenesis(uint64(l)) + l = len(m.IncentivesEpochIdentifier) + if l > 0 { + n += 1 + l + sovGenesis(uint64(l)) + } + l = m.RewardScaler.Size() + n += 1 + l + sovGenesis(uint64(l)) + return n +} + +func sovGenesis(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozGenesis(x uint64) (n int) { + return sovGenesis(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *GenesisState) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GenesisState: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GenesisState: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Incentives", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Incentives = append(m.Incentives, Incentive{}) + if err := m.Incentives[len(m.Incentives)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GasMeters", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.GasMeters = append(m.GasMeters, GasMeter{}) + if err := m.GasMeters[len(m.GasMeters)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenesis(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenesis + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Params) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Params: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Params: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field EnableIncentives", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.EnableIncentives = bool(v != 0) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AllocationLimit", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.AllocationLimit.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IncentivesEpochIdentifier", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.IncentivesEpochIdentifier = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RewardScaler", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.RewardScaler.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenesis(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenesis + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipGenesis(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenesis + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenesis + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenesis + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthGenesis + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupGenesis + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthGenesis + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthGenesis = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowGenesis = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupGenesis = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/incentives/types/incentives.pb.go b/x/incentives/types/incentives.pb.go new file mode 100644 index 0000000000..79c3522ca7 --- /dev/null +++ b/x/incentives/types/incentives.pb.go @@ -0,0 +1,1445 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: evmos/incentives/v1/incentives.proto + +package types + +import ( + fmt "fmt" + github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" + types "github.com/cosmos/cosmos-sdk/types" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" + github_com_cosmos_gogoproto_types "github.com/cosmos/gogoproto/types" + _ "google.golang.org/protobuf/types/known/timestamppb" + io "io" + math "math" + math_bits "math/bits" + time "time" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf +var _ = time.Kitchen + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// Incentive defines an instance that organizes distribution conditions for a +// given smart contract +type Incentive struct { + // contract address of the smart contract to be incentivized + Contract string `protobuf:"bytes,1,opt,name=contract,proto3" json:"contract,omitempty"` + // allocations is a slice of denoms and percentages of rewards to be allocated + Allocations github_com_cosmos_cosmos_sdk_types.DecCoins `protobuf:"bytes,2,rep,name=allocations,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.DecCoins" json:"allocations"` + // epochs defines the number of remaining epochs for the incentive + Epochs uint32 `protobuf:"varint,3,opt,name=epochs,proto3" json:"epochs,omitempty"` + // start_time of the incentive distribution + StartTime time.Time `protobuf:"bytes,4,opt,name=start_time,json=startTime,proto3,stdtime" json:"start_time"` + // total_gas is the cumulative gas spent by all gas meters of the incentive during the epoch + TotalGas uint64 `protobuf:"varint,5,opt,name=total_gas,json=totalGas,proto3" json:"total_gas,omitempty"` +} + +func (m *Incentive) Reset() { *m = Incentive{} } +func (m *Incentive) String() string { return proto.CompactTextString(m) } +func (*Incentive) ProtoMessage() {} +func (*Incentive) Descriptor() ([]byte, []int) { + return fileDescriptor_95b81e40854aec77, []int{0} +} +func (m *Incentive) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Incentive) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Incentive.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Incentive) XXX_Merge(src proto.Message) { + xxx_messageInfo_Incentive.Merge(m, src) +} +func (m *Incentive) XXX_Size() int { + return m.Size() +} +func (m *Incentive) XXX_DiscardUnknown() { + xxx_messageInfo_Incentive.DiscardUnknown(m) +} + +var xxx_messageInfo_Incentive proto.InternalMessageInfo + +func (m *Incentive) GetContract() string { + if m != nil { + return m.Contract + } + return "" +} + +func (m *Incentive) GetAllocations() github_com_cosmos_cosmos_sdk_types.DecCoins { + if m != nil { + return m.Allocations + } + return nil +} + +func (m *Incentive) GetEpochs() uint32 { + if m != nil { + return m.Epochs + } + return 0 +} + +func (m *Incentive) GetStartTime() time.Time { + if m != nil { + return m.StartTime + } + return time.Time{} +} + +func (m *Incentive) GetTotalGas() uint64 { + if m != nil { + return m.TotalGas + } + return 0 +} + +// GasMeter tracks the cumulative gas spent per participant in one epoch +type GasMeter struct { + // contract is the hex address of the incentivized smart contract + Contract string `protobuf:"bytes,1,opt,name=contract,proto3" json:"contract,omitempty"` + // participant address that interacts with the incentive + Participant string `protobuf:"bytes,2,opt,name=participant,proto3" json:"participant,omitempty"` + // cumulative_gas spent during the epoch + CumulativeGas uint64 `protobuf:"varint,3,opt,name=cumulative_gas,json=cumulativeGas,proto3" json:"cumulative_gas,omitempty"` +} + +func (m *GasMeter) Reset() { *m = GasMeter{} } +func (m *GasMeter) String() string { return proto.CompactTextString(m) } +func (*GasMeter) ProtoMessage() {} +func (*GasMeter) Descriptor() ([]byte, []int) { + return fileDescriptor_95b81e40854aec77, []int{1} +} +func (m *GasMeter) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GasMeter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GasMeter.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *GasMeter) XXX_Merge(src proto.Message) { + xxx_messageInfo_GasMeter.Merge(m, src) +} +func (m *GasMeter) XXX_Size() int { + return m.Size() +} +func (m *GasMeter) XXX_DiscardUnknown() { + xxx_messageInfo_GasMeter.DiscardUnknown(m) +} + +var xxx_messageInfo_GasMeter proto.InternalMessageInfo + +func (m *GasMeter) GetContract() string { + if m != nil { + return m.Contract + } + return "" +} + +func (m *GasMeter) GetParticipant() string { + if m != nil { + return m.Participant + } + return "" +} + +func (m *GasMeter) GetCumulativeGas() uint64 { + if m != nil { + return m.CumulativeGas + } + return 0 +} + +// RegisterIncentiveProposal is a gov Content type to register an incentive +type RegisterIncentiveProposal struct { + // title of the proposal + Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` + // description of the proposal + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + // contract address to be registered + Contract string `protobuf:"bytes,3,opt,name=contract,proto3" json:"contract,omitempty"` + // allocations defines the denoms and percentage of rewards to be allocated + Allocations github_com_cosmos_cosmos_sdk_types.DecCoins `protobuf:"bytes,4,rep,name=allocations,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.DecCoins" json:"allocations"` + // epochs is the number of remaining epochs for the incentive + Epochs uint32 `protobuf:"varint,5,opt,name=epochs,proto3" json:"epochs,omitempty"` +} + +func (m *RegisterIncentiveProposal) Reset() { *m = RegisterIncentiveProposal{} } +func (m *RegisterIncentiveProposal) String() string { return proto.CompactTextString(m) } +func (*RegisterIncentiveProposal) ProtoMessage() {} +func (*RegisterIncentiveProposal) Descriptor() ([]byte, []int) { + return fileDescriptor_95b81e40854aec77, []int{2} +} +func (m *RegisterIncentiveProposal) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RegisterIncentiveProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RegisterIncentiveProposal.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RegisterIncentiveProposal) XXX_Merge(src proto.Message) { + xxx_messageInfo_RegisterIncentiveProposal.Merge(m, src) +} +func (m *RegisterIncentiveProposal) XXX_Size() int { + return m.Size() +} +func (m *RegisterIncentiveProposal) XXX_DiscardUnknown() { + xxx_messageInfo_RegisterIncentiveProposal.DiscardUnknown(m) +} + +var xxx_messageInfo_RegisterIncentiveProposal proto.InternalMessageInfo + +func (m *RegisterIncentiveProposal) GetTitle() string { + if m != nil { + return m.Title + } + return "" +} + +func (m *RegisterIncentiveProposal) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *RegisterIncentiveProposal) GetContract() string { + if m != nil { + return m.Contract + } + return "" +} + +func (m *RegisterIncentiveProposal) GetAllocations() github_com_cosmos_cosmos_sdk_types.DecCoins { + if m != nil { + return m.Allocations + } + return nil +} + +func (m *RegisterIncentiveProposal) GetEpochs() uint32 { + if m != nil { + return m.Epochs + } + return 0 +} + +// CancelIncentiveProposal is a gov Content type to cancel an incentive +type CancelIncentiveProposal struct { + // title of the proposal + Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` + // description of the proposal + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + // contract address of the incentivized smart contract + Contract string `protobuf:"bytes,3,opt,name=contract,proto3" json:"contract,omitempty"` +} + +func (m *CancelIncentiveProposal) Reset() { *m = CancelIncentiveProposal{} } +func (m *CancelIncentiveProposal) String() string { return proto.CompactTextString(m) } +func (*CancelIncentiveProposal) ProtoMessage() {} +func (*CancelIncentiveProposal) Descriptor() ([]byte, []int) { + return fileDescriptor_95b81e40854aec77, []int{3} +} +func (m *CancelIncentiveProposal) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CancelIncentiveProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_CancelIncentiveProposal.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *CancelIncentiveProposal) XXX_Merge(src proto.Message) { + xxx_messageInfo_CancelIncentiveProposal.Merge(m, src) +} +func (m *CancelIncentiveProposal) XXX_Size() int { + return m.Size() +} +func (m *CancelIncentiveProposal) XXX_DiscardUnknown() { + xxx_messageInfo_CancelIncentiveProposal.DiscardUnknown(m) +} + +var xxx_messageInfo_CancelIncentiveProposal proto.InternalMessageInfo + +func (m *CancelIncentiveProposal) GetTitle() string { + if m != nil { + return m.Title + } + return "" +} + +func (m *CancelIncentiveProposal) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *CancelIncentiveProposal) GetContract() string { + if m != nil { + return m.Contract + } + return "" +} + +func init() { + proto.RegisterType((*Incentive)(nil), "evmos.incentives.v1.Incentive") + proto.RegisterType((*GasMeter)(nil), "evmos.incentives.v1.GasMeter") + proto.RegisterType((*RegisterIncentiveProposal)(nil), "evmos.incentives.v1.RegisterIncentiveProposal") + proto.RegisterType((*CancelIncentiveProposal)(nil), "evmos.incentives.v1.CancelIncentiveProposal") +} + +func init() { + proto.RegisterFile("evmos/incentives/v1/incentives.proto", fileDescriptor_95b81e40854aec77) +} + +var fileDescriptor_95b81e40854aec77 = []byte{ + // 489 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x53, 0xbf, 0x6f, 0xd4, 0x30, + 0x18, 0x4d, 0xee, 0x47, 0x75, 0xe7, 0x53, 0x19, 0x42, 0x05, 0xe1, 0x40, 0x49, 0x74, 0x02, 0x29, + 0x12, 0xaa, 0xad, 0xb4, 0x12, 0x03, 0xe3, 0x1d, 0xd2, 0x89, 0x01, 0x09, 0x45, 0x4c, 0x2c, 0x95, + 0xe3, 0x9a, 0xd4, 0x22, 0x89, 0xa3, 0xf8, 0xbb, 0x08, 0x56, 0xfe, 0x82, 0x4e, 0xcc, 0xcc, 0xfc, + 0x25, 0x1d, 0x3b, 0x32, 0x51, 0x74, 0xb7, 0xf0, 0x67, 0x20, 0x3b, 0x49, 0x49, 0x97, 0x8e, 0xb7, + 0x24, 0x7e, 0xcf, 0xfe, 0xf4, 0xde, 0xfb, 0x3e, 0x1b, 0x3d, 0xe7, 0x75, 0x2e, 0x15, 0x11, 0x05, + 0xe3, 0x05, 0x88, 0x9a, 0x2b, 0x52, 0x47, 0x3d, 0x84, 0xcb, 0x4a, 0x82, 0x74, 0x1e, 0x9a, 0x53, + 0xb8, 0xc7, 0xd7, 0xd1, 0xdc, 0x63, 0x52, 0xe9, 0xda, 0x84, 0x2a, 0x4e, 0xea, 0x28, 0xe1, 0x40, + 0x23, 0xc2, 0xa4, 0x28, 0x9a, 0xa2, 0xf9, 0x51, 0x2a, 0x53, 0x69, 0x96, 0x44, 0xaf, 0x5a, 0xd6, + 0x4f, 0xa5, 0x4c, 0x33, 0x4e, 0x0c, 0x4a, 0x36, 0x9f, 0x08, 0x88, 0x9c, 0x2b, 0xa0, 0x79, 0xd9, + 0x1c, 0x58, 0x7c, 0x1f, 0xa0, 0xe9, 0xdb, 0x4e, 0xc8, 0x99, 0xa3, 0x09, 0x93, 0x05, 0x54, 0x94, + 0x81, 0x6b, 0x07, 0x76, 0x38, 0x8d, 0x6f, 0xb1, 0xa3, 0xd0, 0x8c, 0x66, 0x99, 0x64, 0x14, 0x84, + 0x2c, 0x94, 0x3b, 0x08, 0x86, 0xe1, 0xec, 0xe4, 0x19, 0x6e, 0x6c, 0x61, 0x6d, 0x0b, 0xb7, 0xb6, + 0xf0, 0x1b, 0xce, 0x56, 0x52, 0x14, 0xcb, 0xd3, 0xab, 0xdf, 0xbe, 0xf5, 0xf3, 0xc6, 0x7f, 0x99, + 0x0a, 0xb8, 0xd8, 0x24, 0x98, 0xc9, 0x9c, 0xb4, 0x31, 0x9a, 0xdf, 0xb1, 0x3a, 0xff, 0x4c, 0xe0, + 0x6b, 0xc9, 0x55, 0x57, 0xa3, 0xe2, 0xbe, 0x8a, 0xf3, 0x08, 0x1d, 0xf0, 0x52, 0xb2, 0x0b, 0xe5, + 0x0e, 0x03, 0x3b, 0x3c, 0x8c, 0x5b, 0xe4, 0xac, 0x10, 0x52, 0x40, 0x2b, 0x38, 0xd3, 0x79, 0xdc, + 0x51, 0x60, 0x87, 0xb3, 0x93, 0x39, 0x6e, 0xc2, 0xe2, 0x2e, 0x2c, 0xfe, 0xd0, 0x85, 0x5d, 0x4e, + 0xb4, 0x93, 0xcb, 0x1b, 0xdf, 0x8e, 0xa7, 0xa6, 0x4e, 0xef, 0x38, 0x4f, 0xd1, 0x14, 0x24, 0xd0, + 0xec, 0x2c, 0xa5, 0xca, 0x1d, 0x07, 0x76, 0x38, 0x8a, 0x27, 0x86, 0x58, 0x53, 0xb5, 0x90, 0x68, + 0xb2, 0xa6, 0xea, 0x1d, 0x07, 0x5e, 0xdd, 0xdb, 0x96, 0x00, 0xcd, 0x4a, 0x5a, 0x81, 0x60, 0xa2, + 0xa4, 0x05, 0xb8, 0x03, 0xb3, 0xdd, 0xa7, 0x9c, 0x17, 0xe8, 0x01, 0xdb, 0xe4, 0x9b, 0x8c, 0xea, + 0x16, 0x1b, 0xad, 0xa1, 0xd1, 0x3a, 0xfc, 0xcf, 0x6a, 0xc1, 0x6f, 0x03, 0xf4, 0x24, 0xe6, 0xa9, + 0x50, 0xc0, 0xab, 0xdb, 0x89, 0xbc, 0xaf, 0x64, 0x29, 0x15, 0xcd, 0x9c, 0x23, 0x34, 0x06, 0x01, + 0x19, 0x6f, 0xf5, 0x1b, 0xa0, 0xc5, 0xcf, 0xb9, 0x62, 0x95, 0x28, 0x75, 0xbb, 0x3a, 0xf1, 0x1e, + 0x75, 0xc7, 0xfa, 0xf0, 0xfe, 0x89, 0x8e, 0xf6, 0x3c, 0xd1, 0x71, 0x7f, 0xa2, 0xaf, 0x47, 0x7f, + 0x7f, 0xf8, 0xd6, 0x42, 0xa1, 0xc7, 0x2b, 0x5a, 0x30, 0x9e, 0xed, 0xa5, 0x03, 0x8d, 0xe8, 0x72, + 0x7d, 0xb5, 0xf5, 0xec, 0xeb, 0xad, 0x67, 0xff, 0xd9, 0x7a, 0xf6, 0xe5, 0xce, 0xb3, 0xae, 0x77, + 0x9e, 0xf5, 0x6b, 0xe7, 0x59, 0x1f, 0x8f, 0x7b, 0x31, 0x9b, 0xa7, 0xdb, 0x7c, 0xeb, 0xe8, 0x15, + 0xf9, 0xd2, 0x7f, 0xc6, 0x26, 0x71, 0x72, 0x60, 0x6e, 0xde, 0xe9, 0xbf, 0x00, 0x00, 0x00, 0xff, + 0xff, 0x51, 0xe7, 0x94, 0xfc, 0xe7, 0x03, 0x00, 0x00, +} + +func (m *Incentive) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Incentive) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Incentive) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.TotalGas != 0 { + i = encodeVarintIncentives(dAtA, i, uint64(m.TotalGas)) + i-- + dAtA[i] = 0x28 + } + n1, err1 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.StartTime):]) + if err1 != nil { + return 0, err1 + } + i -= n1 + i = encodeVarintIncentives(dAtA, i, uint64(n1)) + i-- + dAtA[i] = 0x22 + if m.Epochs != 0 { + i = encodeVarintIncentives(dAtA, i, uint64(m.Epochs)) + i-- + dAtA[i] = 0x18 + } + if len(m.Allocations) > 0 { + for iNdEx := len(m.Allocations) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Allocations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintIncentives(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Contract) > 0 { + i -= len(m.Contract) + copy(dAtA[i:], m.Contract) + i = encodeVarintIncentives(dAtA, i, uint64(len(m.Contract))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *GasMeter) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *GasMeter) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GasMeter) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.CumulativeGas != 0 { + i = encodeVarintIncentives(dAtA, i, uint64(m.CumulativeGas)) + i-- + dAtA[i] = 0x18 + } + if len(m.Participant) > 0 { + i -= len(m.Participant) + copy(dAtA[i:], m.Participant) + i = encodeVarintIncentives(dAtA, i, uint64(len(m.Participant))) + i-- + dAtA[i] = 0x12 + } + if len(m.Contract) > 0 { + i -= len(m.Contract) + copy(dAtA[i:], m.Contract) + i = encodeVarintIncentives(dAtA, i, uint64(len(m.Contract))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *RegisterIncentiveProposal) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RegisterIncentiveProposal) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RegisterIncentiveProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Epochs != 0 { + i = encodeVarintIncentives(dAtA, i, uint64(m.Epochs)) + i-- + dAtA[i] = 0x28 + } + if len(m.Allocations) > 0 { + for iNdEx := len(m.Allocations) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Allocations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintIncentives(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + } + if len(m.Contract) > 0 { + i -= len(m.Contract) + copy(dAtA[i:], m.Contract) + i = encodeVarintIncentives(dAtA, i, uint64(len(m.Contract))) + i-- + dAtA[i] = 0x1a + } + if len(m.Description) > 0 { + i -= len(m.Description) + copy(dAtA[i:], m.Description) + i = encodeVarintIncentives(dAtA, i, uint64(len(m.Description))) + i-- + dAtA[i] = 0x12 + } + if len(m.Title) > 0 { + i -= len(m.Title) + copy(dAtA[i:], m.Title) + i = encodeVarintIncentives(dAtA, i, uint64(len(m.Title))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *CancelIncentiveProposal) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CancelIncentiveProposal) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CancelIncentiveProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Contract) > 0 { + i -= len(m.Contract) + copy(dAtA[i:], m.Contract) + i = encodeVarintIncentives(dAtA, i, uint64(len(m.Contract))) + i-- + dAtA[i] = 0x1a + } + if len(m.Description) > 0 { + i -= len(m.Description) + copy(dAtA[i:], m.Description) + i = encodeVarintIncentives(dAtA, i, uint64(len(m.Description))) + i-- + dAtA[i] = 0x12 + } + if len(m.Title) > 0 { + i -= len(m.Title) + copy(dAtA[i:], m.Title) + i = encodeVarintIncentives(dAtA, i, uint64(len(m.Title))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintIncentives(dAtA []byte, offset int, v uint64) int { + offset -= sovIncentives(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *Incentive) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Contract) + if l > 0 { + n += 1 + l + sovIncentives(uint64(l)) + } + if len(m.Allocations) > 0 { + for _, e := range m.Allocations { + l = e.Size() + n += 1 + l + sovIncentives(uint64(l)) + } + } + if m.Epochs != 0 { + n += 1 + sovIncentives(uint64(m.Epochs)) + } + l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.StartTime) + n += 1 + l + sovIncentives(uint64(l)) + if m.TotalGas != 0 { + n += 1 + sovIncentives(uint64(m.TotalGas)) + } + return n +} + +func (m *GasMeter) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Contract) + if l > 0 { + n += 1 + l + sovIncentives(uint64(l)) + } + l = len(m.Participant) + if l > 0 { + n += 1 + l + sovIncentives(uint64(l)) + } + if m.CumulativeGas != 0 { + n += 1 + sovIncentives(uint64(m.CumulativeGas)) + } + return n +} + +func (m *RegisterIncentiveProposal) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Title) + if l > 0 { + n += 1 + l + sovIncentives(uint64(l)) + } + l = len(m.Description) + if l > 0 { + n += 1 + l + sovIncentives(uint64(l)) + } + l = len(m.Contract) + if l > 0 { + n += 1 + l + sovIncentives(uint64(l)) + } + if len(m.Allocations) > 0 { + for _, e := range m.Allocations { + l = e.Size() + n += 1 + l + sovIncentives(uint64(l)) + } + } + if m.Epochs != 0 { + n += 1 + sovIncentives(uint64(m.Epochs)) + } + return n +} + +func (m *CancelIncentiveProposal) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Title) + if l > 0 { + n += 1 + l + sovIncentives(uint64(l)) + } + l = len(m.Description) + if l > 0 { + n += 1 + l + sovIncentives(uint64(l)) + } + l = len(m.Contract) + if l > 0 { + n += 1 + l + sovIncentives(uint64(l)) + } + return n +} + +func sovIncentives(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozIncentives(x uint64) (n int) { + return sovIncentives(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Incentive) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIncentives + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Incentive: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Incentive: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Contract", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIncentives + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthIncentives + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthIncentives + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Contract = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Allocations", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIncentives + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthIncentives + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthIncentives + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Allocations = append(m.Allocations, types.DecCoin{}) + if err := m.Allocations[len(m.Allocations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Epochs", wireType) + } + m.Epochs = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIncentives + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Epochs |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StartTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIncentives + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthIncentives + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthIncentives + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.StartTime, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TotalGas", wireType) + } + m.TotalGas = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIncentives + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.TotalGas |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipIncentives(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthIncentives + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GasMeter) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIncentives + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GasMeter: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GasMeter: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Contract", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIncentives + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthIncentives + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthIncentives + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Contract = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Participant", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIncentives + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthIncentives + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthIncentives + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Participant = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CumulativeGas", wireType) + } + m.CumulativeGas = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIncentives + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CumulativeGas |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipIncentives(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthIncentives + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RegisterIncentiveProposal) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIncentives + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RegisterIncentiveProposal: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RegisterIncentiveProposal: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Title", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIncentives + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthIncentives + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthIncentives + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Title = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIncentives + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthIncentives + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthIncentives + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Description = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Contract", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIncentives + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthIncentives + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthIncentives + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Contract = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Allocations", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIncentives + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthIncentives + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthIncentives + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Allocations = append(m.Allocations, types.DecCoin{}) + if err := m.Allocations[len(m.Allocations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Epochs", wireType) + } + m.Epochs = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIncentives + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Epochs |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipIncentives(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthIncentives + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CancelIncentiveProposal) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIncentives + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CancelIncentiveProposal: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CancelIncentiveProposal: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Title", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIncentives + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthIncentives + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthIncentives + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Title = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIncentives + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthIncentives + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthIncentives + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Description = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Contract", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIncentives + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthIncentives + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthIncentives + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Contract = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipIncentives(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthIncentives + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipIncentives(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowIncentives + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowIncentives + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowIncentives + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthIncentives + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupIncentives + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthIncentives + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthIncentives = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowIncentives = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupIncentives = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/incentives/types/keys.go b/x/incentives/types/keys.go new file mode 100644 index 0000000000..4a981f1e25 --- /dev/null +++ b/x/incentives/types/keys.go @@ -0,0 +1,55 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package types + +import ( + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + "github.com/ethereum/go-ethereum/common" +) + +// constants +const ( + // module name + ModuleName = "incentives" + + // StoreKey to be used when creating the KVStore + StoreKey = ModuleName + + // RouterKey to be used for message routing + RouterKey = ModuleName +) + +// ModuleAddress is the native module address for incentives module +var ModuleAddress common.Address + +func init() { + ModuleAddress = common.BytesToAddress(authtypes.NewModuleAddress(ModuleName).Bytes()) +} + +// prefix bytes for the incentives persistent store +const ( + prefixIncentive = iota + 1 + prefixGasMeter + prefixAllocationMeter +) + +// KVStore key prefixes +var ( + KeyPrefixIncentive = []byte{prefixIncentive} + KeyPrefixGasMeter = []byte{prefixGasMeter} + KeyPrefixAllocationMeter = []byte{prefixAllocationMeter} +) + +// SplitGasMeterKey is a helper to split up KV-store keys in a +// `prefix||` format +func SplitGasMeterKey(key []byte) (contract, userAddr common.Address) { + // with prefix + if len(key) == 41 { + key = key[1:] + } + + contract = common.BytesToAddress(key[:common.AddressLength]) + userAddr = common.BytesToAddress(key[common.AddressLength:]) + return contract, userAddr +} diff --git a/x/incentives/types/proposal.go b/x/incentives/types/proposal.go new file mode 100644 index 0000000000..85d764c528 --- /dev/null +++ b/x/incentives/types/proposal.go @@ -0,0 +1,60 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package types + +import ( + "errors" + + govcdc "github.com/cosmos/cosmos-sdk/x/gov/codec" + govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" + evmostypes "github.com/evmos/evmos/v16/types" +) + +// constants +const ( + ProposalTypeRegisterIncentive string = "RegisterIncentive" + ProposalTypeCancelIncentive string = "CancelIncentive" +) + +// Implements Proposal Interface +var ( + _ govv1beta1.Content = &RegisterIncentiveProposal{} + _ govv1beta1.Content = &CancelIncentiveProposal{} +) + +func init() { + govv1beta1.RegisterProposalType(ProposalTypeRegisterIncentive) + govv1beta1.RegisterProposalType(ProposalTypeCancelIncentive) + govcdc.ModuleCdc.Amino.RegisterConcrete(&RegisterIncentiveProposal{}, "incentives/RegisterIncentiveProposal", nil) + govcdc.ModuleCdc.Amino.RegisterConcrete(&CancelIncentiveProposal{}, "incentives/CancelIncentiveProposal", nil) +} + +// ProposalRoute returns router key for this proposal +func (*RegisterIncentiveProposal) ProposalRoute() string { return RouterKey } + +// ProposalType returns proposal type for this proposal +func (*RegisterIncentiveProposal) ProposalType() string { + return ProposalTypeRegisterIncentive +} + +// ValidateBasic performs a stateless check of the proposal fields +func (rip *RegisterIncentiveProposal) ValidateBasic() error { + return errors.New("Deprecated") +} + +// ProposalRoute returns router key for this proposal +func (*CancelIncentiveProposal) ProposalRoute() string { return RouterKey } + +// ProposalType returns proposal type for this proposal +func (*CancelIncentiveProposal) ProposalType() string { + return ProposalTypeCancelIncentive +} + +// ValidateBasic performs a stateless check of the proposal fields +func (rip *CancelIncentiveProposal) ValidateBasic() error { + if err := evmostypes.ValidateAddress(rip.Contract); err != nil { + return err + } + return errors.New("Deprecated") +} From 877529e25b22b52a195537f891fe243b82127b2b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Dec 2023 09:50:44 -0300 Subject: [PATCH 039/345] build(deps): bump github.com/btcsuite/btcd/btcutil from 1.1.3 to 1.1.4 (#2204) * build(deps): bump github.com/btcsuite/btcd/btcutil from 1.1.3 to 1.1.4 Bumps [github.com/btcsuite/btcd/btcutil](https://github.com/btcsuite/btcd) from 1.1.3 to 1.1.4. - [Release notes](https://github.com/btcsuite/btcd/releases) - [Changelog](https://github.com/btcsuite/btcd/blob/master/CHANGES) - [Commits](https://github.com/btcsuite/btcd/compare/btcutil/v1.1.3...btcutil/v1.1.4) --- updated-dependencies: - dependency-name: github.com/btcsuite/btcd/btcutil dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * gomod2nix generate --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: tom --- go.mod | 6 +++--- go.sum | 13 +++++++------ gomod2nix.toml | 12 ++++++------ 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index 95b91b5ae0..646dab4cd6 100644 --- a/go.mod +++ b/go.mod @@ -9,8 +9,8 @@ require ( cosmossdk.io/simapp v0.0.0-20230608160436-666c345ad23d cosmossdk.io/tools/rosetta v0.2.1 github.com/armon/go-metrics v0.4.1 - github.com/btcsuite/btcd v0.23.3 - github.com/btcsuite/btcd/btcutil v1.1.3 + github.com/btcsuite/btcd v0.23.5-0.20231215221805-96c9fd8078fd + github.com/btcsuite/btcd/btcutil v1.1.4 github.com/cometbft/cometbft v0.37.3-0.20230920093934-46df7b597e3c github.com/cometbft/cometbft-db v0.8.0 github.com/cosmos/cosmos-proto v1.0.0-beta.3 @@ -79,7 +79,7 @@ require ( github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect - github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 // indirect + github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 // indirect github.com/cenkalti/backoff/v4 v4.1.3 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect diff --git a/go.sum b/go.sum index 7c0369d6b3..8862333660 100644 --- a/go.sum +++ b/go.sum @@ -270,20 +270,20 @@ github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2 github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= -github.com/btcsuite/btcd v0.23.0/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= -github.com/btcsuite/btcd v0.23.3 h1:4KH/JKy9WiCd+iUS9Mu0Zp7Dnj17TGdKrg9xc/FGj24= -github.com/btcsuite/btcd v0.23.3/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= +github.com/btcsuite/btcd v0.23.5-0.20231215221805-96c9fd8078fd h1:js1gPwhcFflTZ7Nzl7WHaOTlTr5hIrR4n1NM4v9n4Kw= +github.com/btcsuite/btcd v0.23.5-0.20231215221805-96c9fd8078fd/go.mod h1:nm3Bko6zh6bWP60UxwoT5LzdGJsQJaPo6HjduXq9p6A= github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA= github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A= github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE= -github.com/btcsuite/btcd/btcutil v1.1.3 h1:xfbtw8lwpp0G6NwSHb+UE67ryTFHJAiNuipusjXSohQ= -github.com/btcsuite/btcd/btcutil v1.1.3/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= +github.com/btcsuite/btcd/btcutil v1.1.4 h1:mWvWRLRIPuoeZsVRpc0xNCkfeNxWy1E4jIZ06ZpGI1A= +github.com/btcsuite/btcd/btcutil v1.1.4/go.mod h1:PSZZ4UitpLBWzxGd5VGOrLnmOjtPP/a6HaFo12zMs00= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 h1:59Kx4K6lzOW5w6nFlA0v5+lk/6sjybR934QNHSJZPTQ= +github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= @@ -691,6 +691,7 @@ github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= diff --git a/gomod2nix.toml b/gomod2nix.toml index 8d2fb30352..61cc7a0e81 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -87,17 +87,17 @@ schema = 3 version = "v0.1.1-0.20220910012023-760eaf8b6816" hash = "sha256-Tx3sPuhsoVwrCfJdIwf4ipn7pD92OQNYvpCxl1Z9Wt0=" [mod."github.com/btcsuite/btcd"] - version = "v0.23.3" - hash = "sha256-/FimjFJye25/cpKOdNYJjPw1TUyu+7HuyfPggNcIsBY=" + version = "v0.23.5-0.20231215221805-96c9fd8078fd" + hash = "sha256-qT6BFW9KhsVgRzX2HPEcArquGuhvvfXF6ayLijYaXIM=" [mod."github.com/btcsuite/btcd/btcec/v2"] version = "v2.3.2" hash = "sha256-natWs+yIAuD1UI07iZtjPilroQLfXizFn3lNOiOT83U=" [mod."github.com/btcsuite/btcd/btcutil"] - version = "v1.1.3" - hash = "sha256-6Y9sP1yvPBO8PhqmFVVXNV7dxsXlERDAB+TPTEfW3kI=" + version = "v1.1.4" + hash = "sha256-fv7mejlBIA3ZumZ5Qa2QnP7KcqjkPX4UvEfi3fdogQY=" [mod."github.com/btcsuite/btcd/chaincfg/chainhash"] - version = "v1.0.1" - hash = "sha256-vix0j/KGNvoKjhlKgVeSLY6un2FHeIEoZWMC4z3yvZ4=" + version = "v1.1.0" + hash = "sha256-F+EqvufC+KBslZV/vL8ph6MqDoVD5ic5rVaM27reDqo=" [mod."github.com/cenkalti/backoff/v4"] version = "v4.1.3" hash = "sha256-u6MEDopHoTWAZoVvvXOKnAg++xre53YgQx0gmf6t2KU=" From 881b724d16a57e9ed73dc37f053e9051486a6a32 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Dec 2023 12:59:42 +0000 Subject: [PATCH 040/345] build(deps): bump google.golang.org/grpc from 1.60.0 to 1.60.1 (#2203) * build(deps): bump google.golang.org/grpc from 1.60.0 to 1.60.1 Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.60.0 to 1.60.1. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.60.0...v1.60.1) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * gomod2nix generate --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: tom Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 646dab4cd6..6fe5b4e5b3 100644 --- a/go.mod +++ b/go.mod @@ -50,7 +50,7 @@ require ( golang.org/x/net v0.19.0 golang.org/x/text v0.14.0 google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 - google.golang.org/grpc v1.60.0 + google.golang.org/grpc v1.60.1 google.golang.org/protobuf v1.31.0 sigs.k8s.io/yaml v1.4.0 ) diff --git a/go.sum b/go.sum index 8862333660..ec1622922c 100644 --- a/go.sum +++ b/go.sum @@ -1800,8 +1800,8 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.60.0 h1:6FQAR0kM31P6MRdeluor2w2gPaS4SVNrD/DNTxrQ15k= -google.golang.org/grpc v1.60.0/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= +google.golang.org/grpc v1.60.1 h1:26+wFr+cNqSGFcOXcabYC0lUVJVRa2Sb2ortSK7VrEU= +google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= diff --git a/gomod2nix.toml b/gomod2nix.toml index 61cc7a0e81..d22d326405 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -685,8 +685,8 @@ schema = 3 version = "v0.0.0-20231002182017-d307bd883b97" hash = "sha256-QnSDeqAVIouw9YoQ+AFpgkRcZqQqLuaeA0yKDThRugs=" [mod."google.golang.org/grpc"] - version = "v1.60.0" - hash = "sha256-L8NmvIG8gYSWlfjnEL+Cm83kF8dNnHWh4t7gNWHO4jY=" + version = "v1.60.1" + hash = "sha256-JJ3X6DTUZWYtM8i8izWTH9nDvCydzea31iZt6ULDvsw=" [mod."google.golang.org/protobuf"] version = "v1.31.0" hash = "sha256-UdIk+xRaMfdhVICvKRk1THe3R1VU+lWD8hqoW/y8jT0=" From 1db2527afa9ae49a2a6bf3f6d82aa8eb669e0f08 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Dec 2023 13:07:50 +0000 Subject: [PATCH 041/345] build(deps): bump golang.org/x/crypto from 0.16.0 to 0.17.0 (#2202) * build(deps): bump golang.org/x/crypto from 0.16.0 to 0.17.0 Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.16.0 to 0.17.0. - [Commits](https://github.com/golang/crypto/compare/v0.16.0...v0.17.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: direct:production ... Signed-off-by: dependabot[bot] * gomod2nix generate --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: tom Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 6fe5b4e5b3..6e3ab82067 100644 --- a/go.mod +++ b/go.mod @@ -45,7 +45,7 @@ require ( github.com/tyler-smith/go-bip39 v1.1.0 github.com/zondax/hid v0.9.2 go.opencensus.io v0.24.0 - golang.org/x/crypto v0.16.0 + golang.org/x/crypto v0.17.0 golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb golang.org/x/net v0.19.0 golang.org/x/text v0.14.0 diff --git a/go.sum b/go.sum index ec1622922c..793e1d8a5f 100644 --- a/go.sum +++ b/go.sum @@ -1212,8 +1212,8 @@ golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= -golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= diff --git a/gomod2nix.toml b/gomod2nix.toml index d22d326405..128addfc7d 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -637,8 +637,8 @@ schema = 3 version = "v0.24.0" hash = "sha256-4H+mGZgG2c9I1y0m8avF4qmt8LUKxxVsTqR8mKgP4yo=" [mod."golang.org/x/crypto"] - version = "v0.16.0" - hash = "sha256-DgSVOnXRK8GF01p5rLtq4qPBcglwEoOk8qhW2EGfJfA=" + version = "v0.17.0" + hash = "sha256-/vzBaeD/Ymyc7cpjBvSfJfuZ57zWa9LOaZM7b33eIx0=" [mod."golang.org/x/exp"] version = "v0.0.0-20230711153332-06a737ee72cb" hash = "sha256-Cbw10ZJ+jATPV232G47xZrn6ExO1FDtiT6nlMRCH7EI=" From 428ad7440141963702cd7016bfa515360ecc3952 Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Tue, 19 Dec 2023 10:18:43 -0300 Subject: [PATCH 042/345] chore(upgrade): remove deprecated register coin proposals (#2198) * wip - add remove proposal logic * add incentives code * keep only incentives types * update tests * update upgrade logic * remove unnecessary types * update upgrade logic * update comments * make format * fix lint issues * add changelog entry * add back the type and register it * chore(upgrade) add logic to remove registerCoin proposals * add changelog entry * Update app/upgrades/v16/proposals.go Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> * update comments * nit test * update upgrade logic * Apply suggestions from code review Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> --------- Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> --- CHANGELOG.md | 1 + app/upgrades/v16/proposals.go | 28 +- app/upgrades/v16/upgrades.go | 4 +- app/upgrades/v16/upgrades_test.go | 18 +- proto/evmos/erc20/v1/erc20.proto | 24 ++ x/erc20/types/codec.go | 1 + x/erc20/types/erc20.pb.go | 540 ++++++++++++++++++++++++++++-- x/erc20/types/proposal.go | 21 ++ 8 files changed, 586 insertions(+), 51 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d332385fc4..9ab68ac278 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -143,6 +143,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (app) [#2139](https://github.com/evmos/evmos/pull/2139) Remove old upgrade handlers logic. - (outpost) [#2171](https://github.com/evmos/evmos/pull/2171) Add channelID selector based on the ChainID. - (db) [#2182](https://github.com/evmos/evmos/pull/2182) Bump RocksDB version to `v8.8.1`. +- (api) [#2198] (https://github.com/evmos/evmos/pull/2198) Remove deprecated `RegisterCoinProposal` from store to avoid breaking the governance proposals query. ### Bug Fixes diff --git a/app/upgrades/v16/proposals.go b/app/upgrades/v16/proposals.go index f55ac3113a..0dd38a0ebc 100644 --- a/app/upgrades/v16/proposals.go +++ b/app/upgrades/v16/proposals.go @@ -9,15 +9,21 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1" - incentives "github.com/evmos/evmos/v16/x/incentives/types" ) -// DeleteIncentivesProposals deletes the RegisterIncentives & CancelIncentiveProposal proposals from the store -// because the module was deprecated -func DeleteIncentivesProposals(ctx sdk.Context, gk govkeeper.Keeper, logger log.Logger) { - // Delete the only incentives module proposals +// deprecatedProposals is a map of the TypeURL +// of the deprecated proposal types +var deprecatedProposals = map[string]struct{}{ + "/evmos.incentives.v1.RegisterIncentiveProposal": {}, + "/evmos.incentives.v1.CancelIncentiveProposal": {}, + "/evmos.erc20.v1.RegisterCoinProposal": {}, +} + +// DeleteDeprecatedProposals deletes the RegisterCoin, RegisterIncentives & CancelIncentiveProposal +// proposals from the store because were deprecated +func DeleteDeprecatedProposals(ctx sdk.Context, gk govkeeper.Keeper, logger log.Logger) { gk.IterateProposals(ctx, func(proposal govtypes.Proposal) bool { - // Check if proposal is a RegisterIncentives or CancelIncentiveProposal proposal + // Check if proposal is a deprecated proposal msgs, err := proposal.GetMsgs() if err != nil { logger.Error("failed to get proposal messages", "error", err.Error()) @@ -30,17 +36,11 @@ func DeleteIncentivesProposals(ctx sdk.Context, gk govkeeper.Keeper, logger log. continue } - _, ok = legacyContentMsg.Content.GetCachedValue().(*incentives.RegisterIncentiveProposal) - if ok { - gk.DeleteProposal(ctx, proposal.Id) + if _, deprecated := deprecatedProposals[legacyContentMsg.Content.TypeUrl]; !deprecated { continue } - _, ok = legacyContentMsg.Content.GetCachedValue().(*incentives.CancelIncentiveProposal) - if ok { - gk.DeleteProposal(ctx, proposal.Id) - continue - } + gk.DeleteProposal(ctx, proposal.Id) } return false }) diff --git a/app/upgrades/v16/upgrades.go b/app/upgrades/v16/upgrades.go index 5b5f95f9d3..a830f842d6 100644 --- a/app/upgrades/v16/upgrades.go +++ b/app/upgrades/v16/upgrades.go @@ -63,8 +63,8 @@ func CreateUpgradeHandler( } // Remove the deprecated governance proposals from store - logger.Debug("deleting deprecated incentives module proposals...") - DeleteIncentivesProposals(ctx, gk, logger) + logger.Debug("deleting deprecated proposals...") + DeleteDeprecatedProposals(ctx, gk, logger) // recovery module is deprecated logger.Debug("deleting recovery module from version map...") diff --git a/app/upgrades/v16/upgrades_test.go b/app/upgrades/v16/upgrades_test.go index 20ea07f1cb..cef19e27e9 100644 --- a/app/upgrades/v16/upgrades_test.go +++ b/app/upgrades/v16/upgrades_test.go @@ -9,6 +9,7 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth/types" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" govtypesv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" govtypesv1beta "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" upgrade "github.com/cosmos/cosmos-sdk/x/upgrade/types" @@ -19,6 +20,7 @@ import ( testnetwork "github.com/evmos/evmos/v16/testutil/integration/evmos/network" utiltx "github.com/evmos/evmos/v16/testutil/tx" "github.com/evmos/evmos/v16/utils" + erc20 "github.com/evmos/evmos/v16/x/erc20/types" incentives "github.com/evmos/evmos/v16/x/incentives/types" ) @@ -80,11 +82,11 @@ func (its *IntegrationTestSuite) TestUpdateInflationParams() { its.Require().Equal(math.LegacyZeroDec(), finalParams.InflationDistribution.UsageIncentives) //nolint:staticcheck } -func (its *IntegrationTestSuite) TestDeleteIncentivesProposals() { +func (its *IntegrationTestSuite) TestDeleteDeprecatedProposals() { its.SetupTest() - // Create 3 proposals. 2 will be deleted because correspond to the incentives module - expInitialProps := 3 + // Create 4 proposals. 3 will be deleted which correspond to the deprecated proposals + expInitialProps := 4 expFinalProps := 1 prop1 := &incentives.RegisterIncentiveProposal{ Title: "Test", @@ -106,6 +108,12 @@ func (its *IntegrationTestSuite) TestDeleteIncentivesProposals() { Contract: utiltx.GenerateAddress().String(), } + prop4 := &erc20.RegisterCoinProposal{ //nolint:staticcheck + Title: "Test", + Description: "Test Register Coin Proposal", + Metadata: []banktypes.Metadata{}, + } + privKey, _ := ethsecp256k1.GenerateKey() addrBz := privKey.PubKey().Address().Bytes() accAddr := sdk.AccAddress(addrBz) @@ -113,7 +121,7 @@ func (its *IntegrationTestSuite) TestDeleteIncentivesProposals() { err := testutil.FundAccount(its.network.GetContext(), its.network.App.BankKeeper, accAddr, coins) its.Require().NoError(err) - for _, prop := range []govtypesv1beta.Content{prop1, prop2, prop3} { + for _, prop := range []govtypesv1beta.Content{prop1, prop2, prop3, prop4} { its.createProposal(prop, accAddr) } @@ -123,7 +131,7 @@ func (its *IntegrationTestSuite) TestDeleteIncentivesProposals() { // Delete the corresponding proposals logger := its.network.GetContext().Logger() - v16.DeleteIncentivesProposals(its.network.GetContext(), its.network.App.GovKeeper, logger) + v16.DeleteDeprecatedProposals(its.network.GetContext(), its.network.App.GovKeeper, logger) allProposalsAfter := its.network.App.GovKeeper.GetProposals(its.network.GetContext()) its.Require().Len(allProposalsAfter, expFinalProps) diff --git a/proto/evmos/erc20/v1/erc20.proto b/proto/evmos/erc20/v1/erc20.proto index 6579b17b90..68d1be81b7 100644 --- a/proto/evmos/erc20/v1/erc20.proto +++ b/proto/evmos/erc20/v1/erc20.proto @@ -3,6 +3,7 @@ syntax = "proto3"; package evmos.erc20.v1; +import "cosmos/bank/v1beta1/bank.proto"; import "gogoproto/gogo.proto"; option go_package = "github.com/evmos/evmos/v16/x/erc20/types"; @@ -31,6 +32,29 @@ message TokenPair { Owner contract_owner = 4; } +// protolint:disable MESSAGES_HAVE_COMMENT + +// Deprecated: RegisterCoinProposal is a gov Content type to register a token pair for a +// native Cosmos coin. We're keeping it to remove the existing proposals from +// store. After that, remove this message. +message RegisterCoinProposal { + option (gogoproto.equal) = false; + // title of the proposal + string title = 1; + // description of the proposal + string description = 2; + // metadata slice of the native Cosmos coins + repeated cosmos.bank.v1beta1.Metadata metadata = 3 [(gogoproto.nullable) = false]; +} + +// Deprecated: ProposalMetadata is used to parse a slice of denom metadata and generate +// the RegisterCoinProposal content. We're keeping it to remove the existing proposals from +// store. After that, remove this message. +message ProposalMetadata { + // metadata slice of the native Cosmos coins + repeated cosmos.bank.v1beta1.Metadata metadata = 1 [(gogoproto.nullable) = false]; +} + // RegisterERC20Proposal is a gov Content type to register a token pair for an // ERC20 token message RegisterERC20Proposal { diff --git a/x/erc20/types/codec.go b/x/erc20/types/codec.go index d04c1d4071..61c9da0afe 100644 --- a/x/erc20/types/codec.go +++ b/x/erc20/types/codec.go @@ -48,6 +48,7 @@ func RegisterInterfaces(registry codectypes.InterfaceRegistry) { ) registry.RegisterImplementations( (*govv1beta1.Content)(nil), + &RegisterCoinProposal{}, &RegisterERC20Proposal{}, &ToggleTokenConversionProposal{}, ) diff --git a/x/erc20/types/erc20.pb.go b/x/erc20/types/erc20.pb.go index 370b9d3e70..10e106b035 100644 --- a/x/erc20/types/erc20.pb.go +++ b/x/erc20/types/erc20.pb.go @@ -5,6 +5,7 @@ package types import ( fmt "fmt" + types "github.com/cosmos/cosmos-sdk/x/bank/types" _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" io "io" @@ -129,6 +130,120 @@ func (m *TokenPair) GetContractOwner() Owner { return OWNER_UNSPECIFIED } +// Deprecated: RegisterCoinProposal is a gov Content type to register a token pair for a +// native Cosmos coin. We're keeping it to remove the existing proposals from +// store. After that, remove this message. +type RegisterCoinProposal struct { + // title of the proposal + Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` + // description of the proposal + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + // metadata slice of the native Cosmos coins + Metadata []types.Metadata `protobuf:"bytes,3,rep,name=metadata,proto3" json:"metadata"` +} + +func (m *RegisterCoinProposal) Reset() { *m = RegisterCoinProposal{} } +func (m *RegisterCoinProposal) String() string { return proto.CompactTextString(m) } +func (*RegisterCoinProposal) ProtoMessage() {} +func (*RegisterCoinProposal) Descriptor() ([]byte, []int) { + return fileDescriptor_668d5dc537f45142, []int{1} +} +func (m *RegisterCoinProposal) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RegisterCoinProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RegisterCoinProposal.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RegisterCoinProposal) XXX_Merge(src proto.Message) { + xxx_messageInfo_RegisterCoinProposal.Merge(m, src) +} +func (m *RegisterCoinProposal) XXX_Size() int { + return m.Size() +} +func (m *RegisterCoinProposal) XXX_DiscardUnknown() { + xxx_messageInfo_RegisterCoinProposal.DiscardUnknown(m) +} + +var xxx_messageInfo_RegisterCoinProposal proto.InternalMessageInfo + +func (m *RegisterCoinProposal) GetTitle() string { + if m != nil { + return m.Title + } + return "" +} + +func (m *RegisterCoinProposal) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *RegisterCoinProposal) GetMetadata() []types.Metadata { + if m != nil { + return m.Metadata + } + return nil +} + +// Deprecated: ProposalMetadata is used to parse a slice of denom metadata and generate +// the RegisterCoinProposal content. We're keeping it to remove the existing proposals from +// store. After that, remove this message. +type ProposalMetadata struct { + // metadata slice of the native Cosmos coins + Metadata []types.Metadata `protobuf:"bytes,1,rep,name=metadata,proto3" json:"metadata"` +} + +func (m *ProposalMetadata) Reset() { *m = ProposalMetadata{} } +func (m *ProposalMetadata) String() string { return proto.CompactTextString(m) } +func (*ProposalMetadata) ProtoMessage() {} +func (*ProposalMetadata) Descriptor() ([]byte, []int) { + return fileDescriptor_668d5dc537f45142, []int{2} +} +func (m *ProposalMetadata) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ProposalMetadata) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ProposalMetadata.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ProposalMetadata) XXX_Merge(src proto.Message) { + xxx_messageInfo_ProposalMetadata.Merge(m, src) +} +func (m *ProposalMetadata) XXX_Size() int { + return m.Size() +} +func (m *ProposalMetadata) XXX_DiscardUnknown() { + xxx_messageInfo_ProposalMetadata.DiscardUnknown(m) +} + +var xxx_messageInfo_ProposalMetadata proto.InternalMessageInfo + +func (m *ProposalMetadata) GetMetadata() []types.Metadata { + if m != nil { + return m.Metadata + } + return nil +} + // RegisterERC20Proposal is a gov Content type to register a token pair for an // ERC20 token type RegisterERC20Proposal struct { @@ -144,7 +259,7 @@ func (m *RegisterERC20Proposal) Reset() { *m = RegisterERC20Proposal{} } func (m *RegisterERC20Proposal) String() string { return proto.CompactTextString(m) } func (*RegisterERC20Proposal) ProtoMessage() {} func (*RegisterERC20Proposal) Descriptor() ([]byte, []int) { - return fileDescriptor_668d5dc537f45142, []int{1} + return fileDescriptor_668d5dc537f45142, []int{3} } func (m *RegisterERC20Proposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -210,7 +325,7 @@ func (m *ToggleTokenConversionProposal) Reset() { *m = ToggleTokenConver func (m *ToggleTokenConversionProposal) String() string { return proto.CompactTextString(m) } func (*ToggleTokenConversionProposal) ProtoMessage() {} func (*ToggleTokenConversionProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_668d5dc537f45142, []int{2} + return fileDescriptor_668d5dc537f45142, []int{4} } func (m *ToggleTokenConversionProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -263,6 +378,8 @@ func (m *ToggleTokenConversionProposal) GetToken() string { func init() { proto.RegisterEnum("evmos.erc20.v1.Owner", Owner_name, Owner_value) proto.RegisterType((*TokenPair)(nil), "evmos.erc20.v1.TokenPair") + proto.RegisterType((*RegisterCoinProposal)(nil), "evmos.erc20.v1.RegisterCoinProposal") + proto.RegisterType((*ProposalMetadata)(nil), "evmos.erc20.v1.ProposalMetadata") proto.RegisterType((*RegisterERC20Proposal)(nil), "evmos.erc20.v1.RegisterERC20Proposal") proto.RegisterType((*ToggleTokenConversionProposal)(nil), "evmos.erc20.v1.ToggleTokenConversionProposal") } @@ -270,34 +387,39 @@ func init() { func init() { proto.RegisterFile("evmos/erc20/v1/erc20.proto", fileDescriptor_668d5dc537f45142) } var fileDescriptor_668d5dc537f45142 = []byte{ - // 425 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x52, 0x41, 0x8b, 0xd3, 0x40, - 0x14, 0xce, 0x6c, 0xbb, 0x6a, 0xc7, 0xdd, 0x50, 0x87, 0x2d, 0x84, 0x82, 0x31, 0x54, 0x90, 0xe0, - 0x21, 0xd9, 0x56, 0xf0, 0x20, 0x5e, 0x76, 0xbb, 0x11, 0x56, 0xd6, 0xb6, 0xc4, 0x2e, 0x8a, 0x97, - 0x92, 0x26, 0x8f, 0x18, 0x6c, 0xe7, 0x85, 0x99, 0x31, 0xea, 0xc1, 0xbb, 0x47, 0x7f, 0x82, 0xa0, - 0x3f, 0xc6, 0xe3, 0x1e, 0x3d, 0x4a, 0x7b, 0xf1, 0x67, 0x48, 0x66, 0x52, 0x50, 0xaf, 0x5e, 0x86, - 0xf7, 0x7d, 0xdf, 0x7b, 0xf3, 0xbe, 0xf7, 0x78, 0xb4, 0x0f, 0xd5, 0x1a, 0x65, 0x08, 0x22, 0x1d, - 0x1d, 0x87, 0xd5, 0xd0, 0x04, 0x41, 0x29, 0x50, 0x21, 0xb3, 0xb5, 0x16, 0x18, 0xaa, 0x1a, 0xf6, - 0x8f, 0x72, 0xcc, 0x51, 0x4b, 0x61, 0x1d, 0x99, 0xac, 0xc1, 0x37, 0x42, 0x3b, 0x73, 0x7c, 0x03, - 0x7c, 0x96, 0x14, 0x82, 0xdd, 0xa5, 0x87, 0x3a, 0x7f, 0x91, 0x64, 0x99, 0x00, 0x29, 0x1d, 0xe2, - 0x11, 0xbf, 0x13, 0x1f, 0x68, 0xf2, 0xc4, 0x70, 0xec, 0x88, 0xee, 0x67, 0xc0, 0x71, 0xed, 0xec, - 0x69, 0xd1, 0x00, 0xe6, 0xd0, 0xeb, 0xc0, 0x93, 0xe5, 0x0a, 0x32, 0xa7, 0xe5, 0x11, 0xff, 0x46, - 0xbc, 0x83, 0xec, 0x31, 0xb5, 0x53, 0xe4, 0x4a, 0x24, 0xa9, 0x5a, 0xe0, 0x3b, 0x0e, 0xc2, 0x69, - 0x7b, 0xc4, 0xb7, 0x47, 0xbd, 0xe0, 0x6f, 0x87, 0xc1, 0xb4, 0x16, 0xe3, 0xc3, 0x5d, 0xb2, 0x86, - 0x8f, 0xda, 0xbf, 0xbe, 0xdc, 0x21, 0x83, 0x8f, 0xb4, 0x17, 0x43, 0x5e, 0x48, 0x05, 0x22, 0x8a, - 0xc7, 0xa3, 0xe3, 0x99, 0xc0, 0x12, 0x65, 0xb2, 0xaa, 0xcd, 0xa8, 0x42, 0xad, 0xa0, 0x71, 0x6a, - 0x00, 0xf3, 0xe8, 0xcd, 0x0c, 0x64, 0x2a, 0x8a, 0x52, 0x15, 0xc8, 0x1b, 0xa3, 0x7f, 0x52, 0xec, - 0x1e, 0xb5, 0x75, 0xdf, 0x66, 0x50, 0x90, 0x4e, 0xcb, 0x6b, 0xf9, 0x9d, 0xf8, 0x1f, 0x56, 0xb7, - 0xb7, 0x06, 0x92, 0xde, 0x9e, 0x63, 0x9e, 0xaf, 0x40, 0xaf, 0x6a, 0x8c, 0xbc, 0x02, 0x21, 0x0b, - 0xe4, 0xff, 0x6d, 0xa3, 0xae, 0xab, 0xbf, 0xd4, 0x3b, 0xab, 0xeb, 0x6a, 0x60, 0x66, 0xbe, 0xff, - 0x94, 0xee, 0xeb, 0x15, 0xb0, 0x1e, 0xbd, 0x35, 0x7d, 0x31, 0x89, 0xe2, 0xc5, 0xe5, 0xe4, 0xf9, - 0x2c, 0x1a, 0x9f, 0x3f, 0x39, 0x8f, 0xce, 0xba, 0x16, 0xeb, 0xd2, 0x03, 0x43, 0x3f, 0x9b, 0x9e, - 0x5d, 0x5e, 0x44, 0x5d, 0xc2, 0x18, 0xb5, 0x0d, 0x13, 0xbd, 0x9c, 0x47, 0xf1, 0xe4, 0xe4, 0xa2, - 0xbb, 0xd7, 0x6f, 0x7f, 0xfa, 0xea, 0x5a, 0xa7, 0xa7, 0xdf, 0x37, 0x2e, 0xb9, 0xda, 0xb8, 0xe4, - 0xe7, 0xc6, 0x25, 0x9f, 0xb7, 0xae, 0x75, 0xb5, 0x75, 0xad, 0x1f, 0x5b, 0xd7, 0x7a, 0xe5, 0xe7, - 0x85, 0x7a, 0xfd, 0x76, 0x19, 0xa4, 0xb8, 0x0e, 0x9b, 0x6b, 0xd2, 0x6f, 0x35, 0x7c, 0x18, 0xbe, - 0x6f, 0x2e, 0x4b, 0x7d, 0x28, 0x41, 0x2e, 0xaf, 0xe9, 0x8b, 0x79, 0xf0, 0x3b, 0x00, 0x00, 0xff, - 0xff, 0x87, 0x11, 0x69, 0x94, 0x75, 0x02, 0x00, 0x00, + // 506 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x53, 0xcf, 0x6b, 0xd4, 0x40, + 0x14, 0xce, 0x74, 0xb7, 0xda, 0x9d, 0xb6, 0x21, 0x0e, 0xbb, 0x10, 0x16, 0x9a, 0x86, 0x15, 0x24, + 0x78, 0x48, 0x9a, 0x15, 0x3c, 0x88, 0x20, 0xdd, 0x6d, 0x84, 0x4a, 0xbb, 0xbb, 0xa4, 0x5b, 0x14, + 0x2f, 0xcb, 0x24, 0x19, 0x62, 0xe8, 0x6e, 0x66, 0x99, 0x19, 0xa3, 0x1e, 0xbc, 0x7b, 0xf4, 0xe2, + 0x5d, 0xd0, 0x3f, 0xa6, 0xc7, 0x1e, 0x3d, 0x89, 0xec, 0x5e, 0xfc, 0x33, 0x24, 0x33, 0x89, 0x58, + 0x8f, 0xed, 0x65, 0x78, 0xdf, 0xf7, 0x7e, 0xf0, 0xde, 0xf7, 0xe6, 0xc1, 0x2e, 0x29, 0x16, 0x94, + 0x7b, 0x84, 0xc5, 0xfd, 0x03, 0xaf, 0xf0, 0x95, 0xe1, 0x2e, 0x19, 0x15, 0x14, 0xe9, 0xd2, 0xe7, + 0x2a, 0xaa, 0xf0, 0xbb, 0x56, 0x4c, 0x79, 0x19, 0x1c, 0xe1, 0xfc, 0xc2, 0x2b, 0xfc, 0x88, 0x08, + 0xec, 0x4b, 0xa0, 0xe2, 0xbb, 0xed, 0x94, 0xa6, 0x54, 0x9a, 0x5e, 0x69, 0x29, 0xb6, 0xf7, 0x1d, + 0xc0, 0xd6, 0x94, 0x5e, 0x90, 0x7c, 0x82, 0x33, 0x86, 0xee, 0xc3, 0x5d, 0x59, 0x6f, 0x86, 0x93, + 0x84, 0x11, 0xce, 0x4d, 0x60, 0x03, 0xa7, 0x15, 0xee, 0x48, 0xf2, 0x50, 0x71, 0xa8, 0x0d, 0x37, + 0x13, 0x92, 0xd3, 0x85, 0xb9, 0x21, 0x9d, 0x0a, 0x20, 0x13, 0xde, 0x25, 0x39, 0x8e, 0xe6, 0x24, + 0x31, 0x1b, 0x36, 0x70, 0xb6, 0xc2, 0x1a, 0xa2, 0xa7, 0x50, 0x8f, 0x69, 0x2e, 0x18, 0x8e, 0xc5, + 0x8c, 0xbe, 0xcb, 0x09, 0x33, 0x9b, 0x36, 0x70, 0xf4, 0x7e, 0xc7, 0xbd, 0x3e, 0x81, 0x3b, 0x2e, + 0x9d, 0xe1, 0x6e, 0x1d, 0x2c, 0xe1, 0x93, 0xe6, 0xef, 0xaf, 0xfb, 0xa0, 0xf7, 0x05, 0xc0, 0x76, + 0x48, 0xd2, 0x8c, 0x0b, 0xc2, 0x86, 0x34, 0xcb, 0x27, 0x8c, 0x2e, 0x29, 0xc7, 0xf3, 0xb2, 0x19, + 0x91, 0x89, 0x39, 0xa9, 0x3a, 0x55, 0x00, 0xd9, 0x70, 0x3b, 0x21, 0x3c, 0x66, 0xd9, 0x52, 0x64, + 0x34, 0xaf, 0x1a, 0xfd, 0x97, 0x42, 0xcf, 0xe0, 0xd6, 0x82, 0x08, 0x9c, 0x60, 0x81, 0xcd, 0x86, + 0xdd, 0x70, 0xb6, 0xfb, 0x7b, 0xae, 0x12, 0xd0, 0x95, 0x9a, 0x55, 0x02, 0xba, 0xa7, 0x55, 0xd0, + 0xa0, 0x79, 0xf9, 0x73, 0x5f, 0x0b, 0xff, 0x26, 0xc9, 0xbe, 0xb4, 0xde, 0x19, 0x34, 0xea, 0x56, + 0xea, 0xc8, 0x6b, 0xa5, 0xc1, 0x0d, 0x4a, 0xf7, 0x3e, 0xc2, 0x4e, 0x3d, 0x6b, 0x10, 0x0e, 0xfb, + 0x07, 0xb7, 0x1e, 0xf6, 0x01, 0xd4, 0xa5, 0xc8, 0xd5, 0x56, 0x09, 0x97, 0x23, 0xb7, 0xc2, 0xff, + 0xd8, 0x6a, 0x26, 0x0e, 0xf7, 0xa6, 0x34, 0x4d, 0xe7, 0x44, 0xfe, 0x8b, 0x21, 0xcd, 0x0b, 0xc2, + 0x78, 0x46, 0x6f, 0xaf, 0x79, 0x99, 0x57, 0x96, 0x94, 0x1f, 0xa4, 0xcc, 0x2b, 0x81, 0x5a, 0xf0, + 0xc3, 0x17, 0x70, 0x53, 0xee, 0x1b, 0x75, 0xe0, 0xbd, 0xf1, 0xcb, 0x51, 0x10, 0xce, 0xce, 0x47, + 0x67, 0x93, 0x60, 0x78, 0xfc, 0xfc, 0x38, 0x38, 0x32, 0x34, 0x64, 0xc0, 0x1d, 0x45, 0x9f, 0x8e, + 0x8f, 0xce, 0x4f, 0x02, 0x03, 0x20, 0x04, 0x75, 0xc5, 0x04, 0xaf, 0xa6, 0x41, 0x38, 0x3a, 0x3c, + 0x31, 0x36, 0xba, 0xcd, 0x4f, 0xdf, 0x2c, 0x6d, 0x30, 0xb8, 0x5c, 0x59, 0xe0, 0x6a, 0x65, 0x81, + 0x5f, 0x2b, 0x0b, 0x7c, 0x5e, 0x5b, 0xda, 0xd5, 0xda, 0xd2, 0x7e, 0xac, 0x2d, 0xed, 0xb5, 0x93, + 0x66, 0xe2, 0xcd, 0xdb, 0xc8, 0x8d, 0xe9, 0xc2, 0xab, 0x4e, 0x4b, 0xbe, 0x85, 0xff, 0xd8, 0x7b, + 0x5f, 0x9d, 0x99, 0xf8, 0xb0, 0x24, 0x3c, 0xba, 0x23, 0xcf, 0xe3, 0xd1, 0x9f, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x45, 0x20, 0x88, 0xdc, 0x82, 0x03, 0x00, 0x00, } func (this *TokenPair) Equal(that interface{}) bool { @@ -415,6 +537,94 @@ func (m *TokenPair) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *RegisterCoinProposal) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RegisterCoinProposal) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RegisterCoinProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Metadata) > 0 { + for iNdEx := len(m.Metadata) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Metadata[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintErc20(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if len(m.Description) > 0 { + i -= len(m.Description) + copy(dAtA[i:], m.Description) + i = encodeVarintErc20(dAtA, i, uint64(len(m.Description))) + i-- + dAtA[i] = 0x12 + } + if len(m.Title) > 0 { + i -= len(m.Title) + copy(dAtA[i:], m.Title) + i = encodeVarintErc20(dAtA, i, uint64(len(m.Title))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ProposalMetadata) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ProposalMetadata) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ProposalMetadata) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Metadata) > 0 { + for iNdEx := len(m.Metadata) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Metadata[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintErc20(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func (m *RegisterERC20Proposal) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -539,6 +749,44 @@ func (m *TokenPair) Size() (n int) { return n } +func (m *RegisterCoinProposal) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Title) + if l > 0 { + n += 1 + l + sovErc20(uint64(l)) + } + l = len(m.Description) + if l > 0 { + n += 1 + l + sovErc20(uint64(l)) + } + if len(m.Metadata) > 0 { + for _, e := range m.Metadata { + l = e.Size() + n += 1 + l + sovErc20(uint64(l)) + } + } + return n +} + +func (m *ProposalMetadata) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Metadata) > 0 { + for _, e := range m.Metadata { + l = e.Size() + n += 1 + l + sovErc20(uint64(l)) + } + } + return n +} + func (m *RegisterERC20Proposal) Size() (n int) { if m == nil { return 0 @@ -742,6 +990,238 @@ func (m *TokenPair) Unmarshal(dAtA []byte) error { } return nil } +func (m *RegisterCoinProposal) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowErc20 + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RegisterCoinProposal: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RegisterCoinProposal: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Title", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowErc20 + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthErc20 + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthErc20 + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Title = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowErc20 + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthErc20 + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthErc20 + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Description = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowErc20 + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthErc20 + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthErc20 + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Metadata = append(m.Metadata, types.Metadata{}) + if err := m.Metadata[len(m.Metadata)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipErc20(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthErc20 + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ProposalMetadata) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowErc20 + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ProposalMetadata: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ProposalMetadata: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowErc20 + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthErc20 + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthErc20 + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Metadata = append(m.Metadata, types.Metadata{}) + if err := m.Metadata[len(m.Metadata)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipErc20(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthErc20 + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *RegisterERC20Proposal) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/x/erc20/types/proposal.go b/x/erc20/types/proposal.go index 506b66723d..e3e091adc4 100644 --- a/x/erc20/types/proposal.go +++ b/x/erc20/types/proposal.go @@ -4,6 +4,7 @@ package types import ( + "errors" "fmt" "strings" @@ -16,12 +17,16 @@ import ( // constants const ( + // ProposalTypeRegisterCoin is DEPRECATED, remove after v16 upgrade + ProposalTypeRegisterCoin string = "RegisterCoin" ProposalTypeRegisterERC20 string = "RegisterERC20" ProposalTypeToggleTokenConversion string = "ToggleTokenConversion" // #nosec ) // Implements Proposal Interface var ( + // RegisterCoinProposal is DEPRECATED, remove after v16 upgrade + _ v1beta1.Content = &RegisterCoinProposal{} _ v1beta1.Content = &RegisterERC20Proposal{} _ v1beta1.Content = &ToggleTokenConversionProposal{} ) @@ -112,3 +117,19 @@ func (ttcp *ToggleTokenConversionProposal) ValidateBasic() error { return v1beta1.ValidateAbstract(ttcp) } + +// ProposalRoute returns router key for this proposal. +// RegisterCoinProposal is DEPRECATED remove after v16 upgrade +func (*RegisterCoinProposal) ProposalRoute() string { return RouterKey } + +// ProposalType returns proposal type for this proposal. +// RegisterCoinProposal is DEPRECATED remove after v16 upgrade +func (*RegisterCoinProposal) ProposalType() string { + return ProposalTypeRegisterCoin +} + +// ValidateBasic performs a stateless check of the proposal fields. +// RegisterCoinProposal is DEPRECATED remove after v16 upgrade +func (rtbp *RegisterCoinProposal) ValidateBasic() error { + return errors.New("deprecated") +} From 4dc26f5f9d631b1085d971da2e9389014e085299 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jan 2024 12:03:12 +0100 Subject: [PATCH 043/345] build(deps): bump github.com/btcsuite/btcd from 0.23.5-0.20231215221805-96c9fd8078fd to 0.24.0 (#2213) build(deps): bump github.com/btcsuite/btcd Bumps [github.com/btcsuite/btcd](https://github.com/btcsuite/btcd) from 0.23.5-0.20231215221805-96c9fd8078fd to 0.24.0. - [Release notes](https://github.com/btcsuite/btcd/releases) - [Changelog](https://github.com/btcsuite/btcd/blob/master/CHANGES) - [Commits](https://github.com/btcsuite/btcd/commits/v0.24.0) --- updated-dependencies: - dependency-name: github.com/btcsuite/btcd dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 6e3ab82067..255c544a51 100644 --- a/go.mod +++ b/go.mod @@ -9,8 +9,8 @@ require ( cosmossdk.io/simapp v0.0.0-20230608160436-666c345ad23d cosmossdk.io/tools/rosetta v0.2.1 github.com/armon/go-metrics v0.4.1 - github.com/btcsuite/btcd v0.23.5-0.20231215221805-96c9fd8078fd - github.com/btcsuite/btcd/btcutil v1.1.4 + github.com/btcsuite/btcd v0.24.0 + github.com/btcsuite/btcd/btcutil v1.1.5 github.com/cometbft/cometbft v0.37.3-0.20230920093934-46df7b597e3c github.com/cometbft/cometbft-db v0.8.0 github.com/cosmos/cosmos-proto v1.0.0-beta.3 diff --git a/go.sum b/go.sum index 793e1d8a5f..5c807f5846 100644 --- a/go.sum +++ b/go.sum @@ -270,16 +270,17 @@ github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2 github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= -github.com/btcsuite/btcd v0.23.5-0.20231215221805-96c9fd8078fd h1:js1gPwhcFflTZ7Nzl7WHaOTlTr5hIrR4n1NM4v9n4Kw= github.com/btcsuite/btcd v0.23.5-0.20231215221805-96c9fd8078fd/go.mod h1:nm3Bko6zh6bWP60UxwoT5LzdGJsQJaPo6HjduXq9p6A= +github.com/btcsuite/btcd v0.24.0 h1:gL3uHE/IaFj6fcZSu03SvqPMSx7s/dPzfpG/atRwWdo= +github.com/btcsuite/btcd v0.24.0/go.mod h1:K4IDc1593s8jKXIF7yS7yCTSxrknB9z0STzc2j6XgE4= github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA= github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A= github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE= -github.com/btcsuite/btcd/btcutil v1.1.4 h1:mWvWRLRIPuoeZsVRpc0xNCkfeNxWy1E4jIZ06ZpGI1A= -github.com/btcsuite/btcd/btcutil v1.1.4/go.mod h1:PSZZ4UitpLBWzxGd5VGOrLnmOjtPP/a6HaFo12zMs00= +github.com/btcsuite/btcd/btcutil v1.1.5 h1:+wER79R5670vs/ZusMTF1yTcRYE5GUsFbdjdisflzM8= +github.com/btcsuite/btcd/btcutil v1.1.5/go.mod h1:PSZZ4UitpLBWzxGd5VGOrLnmOjtPP/a6HaFo12zMs00= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 h1:59Kx4K6lzOW5w6nFlA0v5+lk/6sjybR934QNHSJZPTQ= From a79a8033c6a01c60c030c0819edcc31a89da6bc2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jan 2024 10:04:22 -0300 Subject: [PATCH 044/345] build(deps): bump github.com/dvsekhvalnov/jose2go from 1.5.0 to 1.6.0 (#2214) * build(deps): bump github.com/dvsekhvalnov/jose2go from 1.5.0 to 1.6.0 Bumps [github.com/dvsekhvalnov/jose2go](https://github.com/dvsekhvalnov/jose2go) from 1.5.0 to 1.6.0. - [Commits](https://github.com/dvsekhvalnov/jose2go/compare/v1.5...v1.6.0) --- updated-dependencies: - dependency-name: github.com/dvsekhvalnov/jose2go dependency-type: indirect ... Signed-off-by: dependabot[bot] * gomod2nix generate --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: tom --- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 255c544a51..cda45171d8 100644 --- a/go.mod +++ b/go.mod @@ -112,7 +112,7 @@ require ( github.com/docker/go-units v0.5.0 // indirect github.com/dop251/goja v0.0.0-20220405120441-9037c2b61cbf // indirect github.com/dustin/go-humanize v1.0.1 // indirect - github.com/dvsekhvalnov/jose2go v1.5.0 // indirect + github.com/dvsekhvalnov/jose2go v1.6.0 // indirect github.com/edsrzf/mmap-go v1.1.0 // indirect github.com/felixge/httpsnoop v1.0.2 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect diff --git a/go.sum b/go.sum index 5c807f5846..86587d330d 100644 --- a/go.sum +++ b/go.sum @@ -452,8 +452,8 @@ github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:Htrtb github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/dvsekhvalnov/jose2go v1.5.0 h1:3j8ya4Z4kMCwT5nXIKFSV84YS+HdqSSO0VsTQxaLAeM= -github.com/dvsekhvalnov/jose2go v1.5.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= +github.com/dvsekhvalnov/jose2go v1.6.0 h1:Y9gnSnP4qEI0+/uQkHvFXeD2PLPJeXEL+ySMEA2EjTY= +github.com/dvsekhvalnov/jose2go v1.6.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= diff --git a/gomod2nix.toml b/gomod2nix.toml index 128addfc7d..03fffc6ab4 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -87,14 +87,14 @@ schema = 3 version = "v0.1.1-0.20220910012023-760eaf8b6816" hash = "sha256-Tx3sPuhsoVwrCfJdIwf4ipn7pD92OQNYvpCxl1Z9Wt0=" [mod."github.com/btcsuite/btcd"] - version = "v0.23.5-0.20231215221805-96c9fd8078fd" - hash = "sha256-qT6BFW9KhsVgRzX2HPEcArquGuhvvfXF6ayLijYaXIM=" + version = "v0.24.0" + hash = "sha256-ZZhmKXC9nqPFiWpftSnu/X3QVJlgCp3F6ElQ0Oi61cY=" [mod."github.com/btcsuite/btcd/btcec/v2"] version = "v2.3.2" hash = "sha256-natWs+yIAuD1UI07iZtjPilroQLfXizFn3lNOiOT83U=" [mod."github.com/btcsuite/btcd/btcutil"] - version = "v1.1.4" - hash = "sha256-fv7mejlBIA3ZumZ5Qa2QnP7KcqjkPX4UvEfi3fdogQY=" + version = "v1.1.5" + hash = "sha256-eLIT+g0bkwBiy0MGU//lH+Iw4OffxVe0ZW8WoMFM+Ds=" [mod."github.com/btcsuite/btcd/chaincfg/chainhash"] version = "v1.1.0" hash = "sha256-F+EqvufC+KBslZV/vL8ph6MqDoVD5ic5rVaM27reDqo=" @@ -229,8 +229,8 @@ schema = 3 version = "v1.0.1" hash = "sha256-yuvxYYngpfVkUg9yAmG99IUVmADTQA0tMbBXe0Fq0Mc=" [mod."github.com/dvsekhvalnov/jose2go"] - version = "v1.5.0" - hash = "sha256-dsju6Xt83pe5SRPN/pUOnDUQByZ6hrhKIXWs3sSu7t8=" + version = "v1.6.0" + hash = "sha256-IXn2BuUp4fi/i2zf1tGGW1m9xoYh3VCksB6GJ5Sf06g=" [mod."github.com/edsrzf/mmap-go"] version = "v1.1.0" hash = "sha256-LFcJue98awAFkSPRc93tVvon3kWS7AvumrluxxRzt4c=" From 05eea03b7db03dc59074e261a4415f2209ded2fc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jan 2024 13:12:27 +0000 Subject: [PATCH 045/345] build(deps): bump google.golang.org/protobuf from 1.31.0 to 1.32.0 (#2208) * build(deps): bump google.golang.org/protobuf from 1.31.0 to 1.32.0 Bumps google.golang.org/protobuf from 1.31.0 to 1.32.0. --- updated-dependencies: - dependency-name: google.golang.org/protobuf dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * gomod2nix generate * gomod2nix generate --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: tom Co-authored-by: Vladislav Varadinov --- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index cda45171d8..4fed71560c 100644 --- a/go.mod +++ b/go.mod @@ -51,7 +51,7 @@ require ( golang.org/x/text v0.14.0 google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 google.golang.org/grpc v1.60.1 - google.golang.org/protobuf v1.31.0 + google.golang.org/protobuf v1.32.0 sigs.k8s.io/yaml v1.4.0 ) diff --git a/go.sum b/go.sum index 86587d330d..033b7f8845 100644 --- a/go.sum +++ b/go.sum @@ -1820,8 +1820,8 @@ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/gomod2nix.toml b/gomod2nix.toml index 03fffc6ab4..ba8fc3d82c 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -688,8 +688,8 @@ schema = 3 version = "v1.60.1" hash = "sha256-JJ3X6DTUZWYtM8i8izWTH9nDvCydzea31iZt6ULDvsw=" [mod."google.golang.org/protobuf"] - version = "v1.31.0" - hash = "sha256-UdIk+xRaMfdhVICvKRk1THe3R1VU+lWD8hqoW/y8jT0=" + version = "v1.32.0" + hash = "sha256-GJuTkMGHCzHbyK4yD5kY4oMn8wQWqgkeBK//yVDqHJk=" [mod."gopkg.in/ini.v1"] version = "v1.67.0" hash = "sha256-V10ahGNGT+NLRdKUyRg1dos5RxLBXBk1xutcnquc/+4=" From 3bcd7ab756dbc2b28a23aa21b437e9d902819042 Mon Sep 17 00:00:00 2001 From: Vladislav Varadinov Date: Tue, 2 Jan 2024 15:52:09 +0200 Subject: [PATCH 046/345] imp(osmosis-outpost): Make the input to the swap function a struct and refactor tests (#2206) * fix(osmosis-outpost): Make the input params a struct and modify tests * fix(tests): make contract a constant * fix(tests): fix nix tests * fix(test): get XCS contract * fix: use address * tests: delete no longer needed patch for Osmosis outpost * fix: lint python code * fix: add ValidateBasic * fmt and lint --- CHANGELOG.md | 1 + .../outposts/osmosis/IOsmosisOutpost.sol | 37 ++- precompiles/outposts/osmosis/abi.json | 90 ++++--- precompiles/outposts/osmosis/osmosis.go | 36 +-- precompiles/outposts/osmosis/osmosis_test.go | 78 ------ precompiles/outposts/osmosis/setup_test.go | 8 +- precompiles/outposts/osmosis/tx.go | 14 +- precompiles/outposts/osmosis/tx_test.go | 236 +++++++++++------- precompiles/outposts/osmosis/types.go | 86 +++---- precompiles/outposts/osmosis/types_test.go | 128 ++-------- .../outposts/stride/IStrideOutpost.sol | 4 +- tests/nix_tests/configs/osmosis-outpost.nix | 15 -- .../configs/xcs-osmosis-contract.patch | 16 -- tests/nix_tests/test_osmosis_outpost.py | 30 +-- x/evm/keeper/precompiles.go | 9 +- 15 files changed, 308 insertions(+), 480 deletions(-) delete mode 100644 precompiles/outposts/osmosis/osmosis_test.go delete mode 100644 tests/nix_tests/configs/osmosis-outpost.nix delete mode 100644 tests/nix_tests/configs/xcs-osmosis-contract.patch diff --git a/CHANGELOG.md b/CHANGELOG.md index 9ab68ac278..51e4642251 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -56,6 +56,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (erc20) [#2154] (https://github.com/evmos/evmos/pull/2154) Remove evm hooks from `erc20` module. - (erc20) [#2155] (https://github.com/evmos/evmos/pull/2155) Remove CLI commands for register and convert Coin. - (erc20) [#2157] (https://github.com/evmos/evmos/pull/2157) Remove `RegisterCoinProposal` logic, protos and related tests. +- (osmosis-outpost) [#2206](https://github.com/evmos/evmos/pull/2206) Update swap function input to custom struct. ### API Breaking diff --git a/precompiles/outposts/osmosis/IOsmosisOutpost.sol b/precompiles/outposts/osmosis/IOsmosisOutpost.sol index b4571a4318..f3407c9267 100644 --- a/precompiles/outposts/osmosis/IOsmosisOutpost.sol +++ b/precompiles/outposts/osmosis/IOsmosisOutpost.sol @@ -10,9 +10,22 @@ IOsmosisOutpost constant OSMOSIS_OUTPOST_CONTRACT = IOsmosisOutpost( ); /// @dev The default value used for the slippage_percentage in the swap. -string constant DEFAULT_TWAP_SLIPPAGE_PERCENTAGE = "5"; +string constant DEFAULT_TWAP_SLIPPAGE_PERCENTAGE = "10"; /// @dev The default value used for window_seconds in the swap. -uint64 constant DEFAULT_TWAP_WINDOW_SECONDS = 10; +uint64 constant DEFAULT_TWAP_WINDOW_SECONDS = 30; + +/// @dev The SwapParams struct contains the parameters of an Osmosis swap. +struct SwapParams { + string channelID; + string xcsContract; + address sender; + address input; + address output; + uint256 amount; + uint8 slippagePercentage; + uint64 windowSeconds; + string swapReceiver; +} /// @author Evmos Core Team. /// @dev Interface for directly interacting with Osmosis Outpost. @@ -51,23 +64,7 @@ interface IOsmosisOutpost { ); /// @dev This function is used to swap tokens on Osmosis. - /// @param sender The address of the sender. - /// @param input The ERC-20 token contract address to be swapped for. - /// @param output The ERC-20 token contract address to be swapped to (received). - /// @param amount The amount of input tokens to be swapped. - /// @param receiver The bech32-formatted address of the receiver of the newly swapped - /// tokens. It can be only an address on the Evmos chain. - /// @param slippage_percentage The percentage of slippage accepted for the swap. - /// @param window_seconds The amount of seconds considered to compute TWAP price. - /// @return nextSequence The sequence number of the transfer packet sent. + /// @param payload The SwapParams struct containing the parameters of the swap. /// @return success The boolean value indicating whether the operation succeeded or not. - function swap( - address sender, - address input, - address output, - uint256 amount, - uint8 slippage_percentage, - uint64 window_seconds, - string calldata receiver - ) external returns (uint64 nextSequence, bool success); + function swap(SwapParams calldata payload) external returns (bool success); } diff --git a/precompiles/outposts/osmosis/abi.json b/precompiles/outposts/osmosis/abi.json index 065c80ed89..6d8e793df2 100644 --- a/precompiles/outposts/osmosis/abi.json +++ b/precompiles/outposts/osmosis/abi.json @@ -88,48 +88,60 @@ { "inputs": [ { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "input", - "type": "address" - }, - { - "internalType": "address", - "name": "output", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "slippage_percentage", - "type": "uint8" - }, - { - "internalType": "uint64", - "name": "window_seconds", - "type": "uint64" - }, - { - "internalType": "string", - "name": "receiver", - "type": "string" + "components": [ + { + "internalType": "string", + "name": "channelID", + "type": "string" + }, + { + "internalType": "string", + "name": "xcsContract", + "type": "string" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "input", + "type": "address" + }, + { + "internalType": "address", + "name": "output", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "slippagePercentage", + "type": "uint8" + }, + { + "internalType": "uint64", + "name": "windowSeconds", + "type": "uint64" + }, + { + "internalType": "string", + "name": "swapReceiver", + "type": "string" + } + ], + "internalType": "struct SwapParams", + "name": "payload", + "type": "tuple" } ], "name": "swap", "outputs": [ - { - "internalType": "uint64", - "name": "nextSequence", - "type": "uint64" - }, { "internalType": "bool", "name": "success", @@ -139,4 +151,4 @@ "stateMutability": "nonpayable", "type": "function" } -] +] \ No newline at end of file diff --git a/precompiles/outposts/osmosis/osmosis.go b/precompiles/outposts/osmosis/osmosis.go index 123a2d1189..0fa61b6be4 100644 --- a/precompiles/outposts/osmosis/osmosis.go +++ b/precompiles/outposts/osmosis/osmosis.go @@ -25,15 +25,8 @@ import ( const ( // OsmosisPrefix represents the human readable part for bech32 addresses on the Osmosis chain. OsmosisPrefix = "osmo" - // OsmosisOutpostAddress is the address of the Osmosis outpost precompile. OsmosisOutpostAddress = "0x0000000000000000000000000000000000000901" - - // XCSContract address for Osmosis testnet. - XCSContractTestnet = "osmo1a34wxsxjwvtz3ua4hnkh4lv3d4qrgry0fhkasppplphwu5k538tqcyms9x" - // - // TODO: change it with the correct mainnet one - XCSContractMainnet = "osmo18rj46qcpr57m3qncrj9cuzm0gn3km08w5jxxlnw002c9y7xex5xsu74ytz" ) var _ vm.PrecompiledContract = &Precompile{} @@ -48,14 +41,9 @@ var f embed.FS type Precompile struct { cmn.Precompile // IBC - portID string - channelID string timeoutHeight clienttypes.Height timeoutTimestamp uint64 - // Osmosis - osmosisXCSContract string - // Keepers bankKeeper bankkeeper.Keeper transferKeeper transferkeeper.Keeper @@ -67,8 +55,6 @@ type Precompile struct { // NewPrecompile creates a new Osmosis outpost Precompile instance as a // PrecompiledContract interface. func NewPrecompile( - portID, channelID string, - osmosisXCSContract string, authzKeeper authzkeeper.Keeper, bankKeeper bankkeeper.Keeper, transferKeeper transferkeeper.Keeper, @@ -81,11 +67,6 @@ func NewPrecompile( return nil, err } - err = ValidateOsmosisContractAddress(osmosisXCSContract) - if err != nil { - return nil, err - } - return &Precompile{ Precompile: cmn.Precompile{ ABI: newAbi, @@ -94,16 +75,13 @@ func NewPrecompile( ApprovalExpiration: cmn.DefaultExpirationDuration, AuthzKeeper: authzKeeper, }, - portID: portID, - channelID: channelID, - timeoutHeight: clienttypes.NewHeight(ics20.DefaultTimeoutHeight, ics20.DefaultTimeoutHeight), - timeoutTimestamp: ics20.DefaultTimeoutTimestamp, - osmosisXCSContract: osmosisXCSContract, - bankKeeper: bankKeeper, - transferKeeper: transferKeeper, - stakingKeeper: stakingKeeper, - erc20Keeper: erc20Keeper, - channelKeeper: channelKeeper, + timeoutHeight: clienttypes.NewHeight(ics20.DefaultTimeoutHeight, ics20.DefaultTimeoutHeight), + timeoutTimestamp: ics20.DefaultTimeoutTimestamp, + bankKeeper: bankKeeper, + transferKeeper: transferKeeper, + stakingKeeper: stakingKeeper, + erc20Keeper: erc20Keeper, + channelKeeper: channelKeeper, }, nil } diff --git a/precompiles/outposts/osmosis/osmosis_test.go b/precompiles/outposts/osmosis/osmosis_test.go deleted file mode 100644 index 2ad404f7c2..0000000000 --- a/precompiles/outposts/osmosis/osmosis_test.go +++ /dev/null @@ -1,78 +0,0 @@ -package osmosis_test - -import ( - "fmt" - "testing" - - "github.com/stretchr/testify/require" - - "github.com/evmos/evmos/v16/precompiles/outposts/osmosis" - testkeyring "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v16/testutil/integration/evmos/network" -) - -func TestNewPrecompile(t *testing.T) { - portID := "transfer" //nolint:goconst - channelID := "channel-0" //nolint:goconst - keyring := testkeyring.New(2) - unitNetwork := network.NewUnitTestNetwork( - network.WithPreFundedAccounts(keyring.GetAllAccAddrs()...), - ) - - testCases := []struct { - name string - contractAddress string - expPass bool - errContains string - }{ - { - name: "fail - empty contract address", - contractAddress: "", - expPass: false, - errContains: fmt.Sprintf(osmosis.ErrInvalidContractAddress), - }, - { - name: "pass - not contract address", - contractAddress: "osmo1qql8ag4cluz6r4dz28p3w00dnc9w8ueuhnecd2", - expPass: false, - errContains: fmt.Sprintf(osmosis.ErrInvalidContractAddress), - }, - { - name: "fail - not osmosis smart contract", - contractAddress: "evmos18rj46qcpr57m3qncrj9cuzm0gn3km08w5jxxlnw002c9y7xex5xsu74ytz", - expPass: false, - errContains: fmt.Sprintf(osmosis.ErrInvalidContractAddress), - }, - { - name: "pass - valid contract address", - contractAddress: osmosis.XCSContractTestnet, - expPass: true, - }, - } - - for _, tc := range testCases { - tc := tc - - t.Run(tc.name, func(t *testing.T) { - _, err := osmosis.NewPrecompile( - portID, - channelID, - tc.contractAddress, - unitNetwork.App.AuthzKeeper, - unitNetwork.App.BankKeeper, - unitNetwork.App.TransferKeeper, - unitNetwork.App.StakingKeeper, - unitNetwork.App.Erc20Keeper, - unitNetwork.App.IBCKeeper.ChannelKeeper, - ) - - if tc.expPass { - require.NoError(t, err, "expected no error while validating the contract address") - } else { - require.Error(t, err, "expected error while validating the contract address") - require.Contains(t, err.Error(), tc.errContains) - } - }) - - } -} diff --git a/precompiles/outposts/osmosis/setup_test.go b/precompiles/outposts/osmosis/setup_test.go index c53db336de..e329ae5aa5 100644 --- a/precompiles/outposts/osmosis/setup_test.go +++ b/precompiles/outposts/osmosis/setup_test.go @@ -14,8 +14,9 @@ import ( ) const ( - PortID = "transfer" - ChannelID = "channel-0" + PortID = "transfer" + ChannelID = "channel-0" + XCSContract = "osmo1a34wxsxjwvtz3ua4hnkh4lv3d4qrgry0fhkasppplphwu5k538tqcyms9x" ) type PrecompileTestSuite struct { @@ -39,9 +40,6 @@ func (s *PrecompileTestSuite) SetupTest() { ) precompile, err := osmosis.NewPrecompile( - PortID, - ChannelID, - osmosis.XCSContractTestnet, unitNetwork.App.AuthzKeeper, unitNetwork.App.BankKeeper, unitNetwork.App.TransferKeeper, diff --git a/precompiles/outposts/osmosis/tx.go b/precompiles/outposts/osmosis/tx.go index 8d0a634570..0ca72eb60a 100644 --- a/precompiles/outposts/osmosis/tx.go +++ b/precompiles/outposts/osmosis/tx.go @@ -4,12 +4,14 @@ // Osmosis package contains the logic of the Osmosis outpost on the Evmos chain. // This outpost uses the ics20 precompile to relay IBC packets to the Osmosis // chain, targeting the Cross-Chain Swap Contract V1 (XCS V1) + package osmosis import ( errorsmod "cosmossdk.io/errors" "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" + transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" "github.com/ethereum/go-ethereum/accounts/abi" @@ -39,7 +41,7 @@ func (p Precompile) Swap( method *abi.Method, args []interface{}, ) ([]byte, error) { - swapPacketData, err := ParseSwapPacketData(args) + swapPacketData, err := ParseSwapPacketData(method, args) if err != nil { return nil, err } @@ -70,7 +72,7 @@ func (p Precompile) Swap( return nil, err } - evmosChannel := NewIBCChannel(p.portID, p.channelID) + evmosChannel := NewIBCChannel(transfertypes.PortID, swapPacketData.ChannelID) bondDenom := p.stakingKeeper.GetParams(ctx).BondDenom err = ValidateInputOutput(inputDenom, outputDenom, bondDenom, evmosChannel) if err != nil { @@ -98,7 +100,7 @@ func (p Precompile) Swap( packet := CreatePacketWithMemo( outputOnOsmosis, swapPacketData.SwapReceiver, - p.osmosisXCSContract, + swapPacketData.XcsContract, swapPacketData.SlippagePercentage, swapPacketData.WindowSeconds, onFailedDelivery, @@ -117,7 +119,7 @@ func (p Precompile) Swap( evmosChannel.ChannelID, coin, sdk.AccAddress(sender.Bytes()).String(), - p.osmosisXCSContract, + swapPacketData.XcsContract, p.timeoutHeight, p.timeoutTimestamp, packetString, @@ -140,7 +142,7 @@ func (p Precompile) Swap( } // Execute the ICS20 Transfer. - res, err := p.transferKeeper.Transfer(sdk.WrapSDKContext(ctx), msg) + _, err = p.transferKeeper.Transfer(sdk.WrapSDKContext(ctx), msg) if err != nil { return nil, err } @@ -171,5 +173,5 @@ func (p Precompile) Swap( return nil, err } - return method.Outputs.Pack(res.Sequence, true) + return method.Outputs.Pack(true) } diff --git a/precompiles/outposts/osmosis/tx_test.go b/precompiles/outposts/osmosis/tx_test.go index 01c233184e..e9eab7678f 100644 --- a/precompiles/outposts/osmosis/tx_test.go +++ b/precompiles/outposts/osmosis/tx_test.go @@ -49,7 +49,7 @@ func (s *PrecompileTestSuite) TestSwap() { return []interface{}{} }, expError: true, - errContains: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 7, 0), + errContains: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 1, 0), }, { name: "fail - origin different from sender", @@ -57,13 +57,17 @@ func (s *PrecompileTestSuite) TestSwap() { origin: senderAddress, malleate: func() []interface{} { return []interface{}{ - randomAddress, - randomAddress, - randomAddress, - transferAmount, - slippagePercentage, - windowSeconds, - receiver, + osmosis.SwapPacketData{ + ChannelID: ChannelID, + XcsContract: XCSContract, + Sender: randomAddress, + Input: randomAddress, + Output: randomAddress, + Amount: transferAmount, + SlippagePercentage: slippagePercentage, + WindowSeconds: windowSeconds, + SwapReceiver: receiver, + }, } }, expError: true, @@ -78,13 +82,17 @@ func (s *PrecompileTestSuite) TestSwap() { s.Require().NoError(err, "expected no error during evmos erc20 registration") return []interface{}{ - senderAddress, - randomAddress, - evmosTokenPair.GetERC20Contract(), - transferAmount, - slippagePercentage, - windowSeconds, - receiver, + osmosis.SwapPacketData{ + ChannelID: ChannelID, + XcsContract: XCSContract, + Sender: senderAddress, + Input: randomAddress, + Output: evmosTokenPair.GetERC20Contract(), + Amount: transferAmount, + SlippagePercentage: slippagePercentage, + WindowSeconds: windowSeconds, + SwapReceiver: receiver, + }, } }, expError: true, @@ -99,13 +107,17 @@ func (s *PrecompileTestSuite) TestSwap() { s.Require().NoError(err, "expected no error during evmos erc20 registration") return []interface{}{ - senderAddress, - evmosTokenPair.GetERC20Contract(), - randomAddress, - transferAmount, - slippagePercentage, - windowSeconds, - receiver, + osmosis.SwapPacketData{ + ChannelID: ChannelID, + XcsContract: XCSContract, + Sender: senderAddress, + Input: evmosTokenPair.GetERC20Contract(), + Output: randomAddress, + Amount: transferAmount, + SlippagePercentage: slippagePercentage, + WindowSeconds: windowSeconds, + SwapReceiver: receiver, + }, } }, expError: true, @@ -120,13 +132,17 @@ func (s *PrecompileTestSuite) TestSwap() { s.Require().NoError(err, "expected no error during evmos erc20 registration") return []interface{}{ - senderAddress, - common.HexToAddress("0x1D54EcB8583Ca25895c512A8308389fFD581F9c9"), - evmosTokenPair.GetERC20Contract(), - transferAmount, - slippagePercentage, - windowSeconds, - receiver, + osmosis.SwapPacketData{ + ChannelID: ChannelID, + XcsContract: XCSContract, + Sender: senderAddress, + Input: common.HexToAddress("0x1D54EcB8583Ca25895c512A8308389fFD581F9c9"), + Output: evmosTokenPair.GetERC20Contract(), + Amount: transferAmount, + SlippagePercentage: slippagePercentage, + WindowSeconds: windowSeconds, + SwapReceiver: receiver, + }, } }, expError: true, @@ -149,13 +165,17 @@ func (s *PrecompileTestSuite) TestSwap() { s.Require().NoError(err, "expected no error during ibc erc20 registration") return []interface{}{ - senderAddress, - wrongOsmoTokenPair.GetERC20Contract(), - evmosTokenPair.GetERC20Contract(), - transferAmount, - slippagePercentage, - windowSeconds, - receiver, + osmosis.SwapPacketData{ + ChannelID: ChannelID, + XcsContract: XCSContract, + Sender: senderAddress, + Input: wrongOsmoTokenPair.GetERC20Contract(), + Output: evmosTokenPair.GetERC20Contract(), + Amount: transferAmount, + SlippagePercentage: slippagePercentage, + WindowSeconds: windowSeconds, + SwapReceiver: receiver, + }, } }, expError: true, @@ -171,13 +191,17 @@ func (s *PrecompileTestSuite) TestSwap() { s.Require().NoError(err, "expected no error during evmos erc20 registration") return []interface{}{ - senderAddress, - evmosTokenPair.GetERC20Contract(), - evmosTokenPair.GetERC20Contract(), - transferAmount, - slippagePercentage, - windowSeconds, - receiver, + osmosis.SwapPacketData{ + ChannelID: ChannelID, + XcsContract: XCSContract, + Sender: senderAddress, + Input: evmosTokenPair.GetERC20Contract(), + Output: evmosTokenPair.GetERC20Contract(), + Amount: transferAmount, + SlippagePercentage: slippagePercentage, + WindowSeconds: windowSeconds, + SwapReceiver: receiver, + }, } }, expError: true, @@ -196,13 +220,17 @@ func (s *PrecompileTestSuite) TestSwap() { s.Require().NoError(err, "expected no error during ibc erc20 registration") return []interface{}{ - senderAddress, - wrongTokenPair.GetERC20Contract(), - evmosTokenPair.GetERC20Contract(), - transferAmount, - slippagePercentage, - windowSeconds, - receiver, + osmosis.SwapPacketData{ + ChannelID: ChannelID, + XcsContract: XCSContract, + Sender: senderAddress, + Input: wrongTokenPair.GetERC20Contract(), + Output: evmosTokenPair.GetERC20Contract(), + Amount: transferAmount, + SlippagePercentage: slippagePercentage, + WindowSeconds: windowSeconds, + SwapReceiver: receiver, + }, } }, expError: true, @@ -224,13 +252,17 @@ func (s *PrecompileTestSuite) TestSwap() { s.Require().NoError(err, "expected no error during ibc erc20 registration") return []interface{}{ - senderAddress, - osmoTokenPair.GetERC20Contract(), - evmosTokenPair.GetERC20Contract(), - transferAmount, - slippagePercentage, - windowSeconds, - receiver, + osmosis.SwapPacketData{ + ChannelID: ChannelID, + XcsContract: XCSContract, + Sender: senderAddress, + Input: osmoTokenPair.GetERC20Contract(), + Output: evmosTokenPair.GetERC20Contract(), + Amount: transferAmount, + SlippagePercentage: slippagePercentage, + WindowSeconds: windowSeconds, + SwapReceiver: receiver, + }, } }, expError: true, @@ -250,13 +282,17 @@ func (s *PrecompileTestSuite) TestSwap() { s.Require().NoError(err, "expected no error during ibc erc20 registration") return []interface{}{ - senderAddress, - osmoTokenPair.GetERC20Contract(), - evmosTokenPair.GetERC20Contract(), - transferAmount, - slippagePercentage, - windowSeconds, - "invalidbec32", + osmosis.SwapPacketData{ + ChannelID: ChannelID, + XcsContract: XCSContract, + Sender: senderAddress, + Input: osmoTokenPair.GetERC20Contract(), + Output: evmosTokenPair.GetERC20Contract(), + Amount: transferAmount, + SlippagePercentage: slippagePercentage, + WindowSeconds: windowSeconds, + SwapReceiver: "invalidbec32", + }, } }, expError: true, @@ -277,13 +313,17 @@ func (s *PrecompileTestSuite) TestSwap() { s.Require().NoError(err, "expected no error during ibc erc20 registration") return []interface{}{ - senderAddress, - osmoTokenPair.GetERC20Contract(), - evmosTokenPair.GetERC20Contract(), - transferAmount, - slippagePercentage, - windowSeconds, - receiver, + osmosis.SwapPacketData{ + ChannelID: ChannelID, + XcsContract: XCSContract, + Sender: senderAddress, + Input: osmoTokenPair.GetERC20Contract(), + Output: evmosTokenPair.GetERC20Contract(), + Amount: transferAmount, + SlippagePercentage: slippagePercentage, + WindowSeconds: windowSeconds, + SwapReceiver: receiver, + }, } }, expError: true, @@ -303,13 +343,17 @@ func (s *PrecompileTestSuite) TestSwap() { s.Require().NoError(err, "expected no error during ibc erc20 registration") return []interface{}{ - senderAddress, - osmoTokenPair.GetERC20Contract(), - evmosTokenPair.GetERC20Contract(), - transferAmount, - slippagePercentage, - windowSeconds, - receiver, + osmosis.SwapPacketData{ + ChannelID: ChannelID, + XcsContract: XCSContract, + Sender: senderAddress, + Input: osmoTokenPair.GetERC20Contract(), + Output: evmosTokenPair.GetERC20Contract(), + Amount: transferAmount, + SlippagePercentage: slippagePercentage, + WindowSeconds: windowSeconds, + SwapReceiver: receiver, + }, } }, expError: true, @@ -328,13 +372,17 @@ func (s *PrecompileTestSuite) TestSwap() { s.Require().NoError(err, "expected no error during ibc erc20 registration") return []interface{}{ - senderAddress, - osmoTokenPair.GetERC20Contract(), - evmosTokenPair.GetERC20Contract(), - transferAmount, - slippagePercentage, - windowSeconds, - receiver, + osmosis.SwapPacketData{ + ChannelID: ChannelID, + XcsContract: XCSContract, + Sender: senderAddress, + Input: osmoTokenPair.GetERC20Contract(), + Output: evmosTokenPair.GetERC20Contract(), + Amount: transferAmount, + SlippagePercentage: slippagePercentage, + WindowSeconds: windowSeconds, + SwapReceiver: receiver, + }, } }, expError: false, @@ -353,13 +401,17 @@ func (s *PrecompileTestSuite) TestSwap() { s.Require().NoError(err, "expected no error during ibc erc20 registration") return []interface{}{ - senderAddress, - evmosTokenPair.GetERC20Contract(), - osmoTokenPair.GetERC20Contract(), - transferAmount, - slippagePercentage, - windowSeconds, - receiver, + osmosis.SwapPacketData{ + ChannelID: ChannelID, + XcsContract: XCSContract, + Sender: senderAddress, + Input: evmosTokenPair.GetERC20Contract(), + Output: osmoTokenPair.GetERC20Contract(), + Amount: transferAmount, + SlippagePercentage: slippagePercentage, + WindowSeconds: windowSeconds, + SwapReceiver: receiver, + }, } }, expError: false, diff --git a/precompiles/outposts/osmosis/types.go b/precompiles/outposts/osmosis/types.go index 1f0116c9ba..b357c481fd 100644 --- a/precompiles/outposts/osmosis/types.go +++ b/precompiles/outposts/osmosis/types.go @@ -9,6 +9,8 @@ import ( "math/big" "strconv" + "github.com/ethereum/go-ethereum/accounts/abi" + "golang.org/x/exp/slices" sdk "github.com/cosmos/cosmos-sdk/types" @@ -300,71 +302,45 @@ func ValidateOsmosisContractAddress(contractAddress string) (err error) { return err } -// SwapPacketData is an utility structure used to wrap args received by the +// SwapPacketData is a utility structure used to wrap args received by the // Solidity interface of the Swap function. type SwapPacketData struct { - Sender common.Address - Input common.Address - Output common.Address - Amount *big.Int - SlippagePercentage uint8 - WindowSeconds uint64 - SwapReceiver string + ChannelID string `abi:"channelID"` + XcsContract string `abi:"xcsContract"` + Sender common.Address `abi:"sender"` + Input common.Address `abi:"input"` + Output common.Address `abi:"output"` + Amount *big.Int `abi:"amount"` + SlippagePercentage uint8 `abi:"slippagePercentage"` + WindowSeconds uint64 `abi:"windowSeconds"` + SwapReceiver string `abi:"swapReceiver"` } -// ParseSwapPacketData parses the packet data from the outpost precompiled contract. -func ParseSwapPacketData(args []interface{}) ( - swapPacketData SwapPacketData, - err error, -) { - if len(args) != 7 { - return SwapPacketData{}, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 7, len(args)) - } - - sender, ok := args[0].(common.Address) - if !ok { - return SwapPacketData{}, fmt.Errorf(cmn.ErrInvalidType, "sender", common.Address{}, args[0]) - } - - input, ok := args[1].(common.Address) - if !ok { - return SwapPacketData{}, fmt.Errorf(cmn.ErrInvalidType, "input", common.Address{}, args[1]) - } - - output, ok := args[2].(common.Address) - if !ok { - return SwapPacketData{}, fmt.Errorf(cmn.ErrInvalidType, "output", common.Address{}, args[2]) - } - - amount, ok := args[3].(*big.Int) - if !ok { - return SwapPacketData{}, fmt.Errorf(cmn.ErrInvalidType, "amount", big.Int{}, args[3]) - } +// SwapPayload is the same as the expected input of the Swap function in the Solidity interface. +type SwapPayload struct { + SwapPacketData SwapPacketData +} - slippagePercentage, ok := args[4].(uint8) - if !ok { - return SwapPacketData{}, fmt.Errorf(cmn.ErrInvalidType, "slippagePercentage", uint8(0), args[4]) - } +// ValidateBasic performs basic validation of the SwapPacketData. +func (s SwapPacketData) ValidateBasic() error { + return ValidateOsmosisContractAddress(s.XcsContract) +} - windowSeconds, ok := args[5].(uint64) - if !ok { - return SwapPacketData{}, fmt.Errorf(cmn.ErrInvalidType, "windowSeconds", uint64(0), args[5]) +// ParseSwapPacketData parses the packet data from the outpost precompiled contract. +func ParseSwapPacketData(method *abi.Method, args []interface{}) (SwapPacketData, error) { + if len(args) != 1 { + return SwapPacketData{}, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 1, len(args)) } - receiver, ok := args[6].(string) - if !ok { - return SwapPacketData{}, fmt.Errorf(cmn.ErrInvalidType, "receiver", "", args[6]) + var swapPayload SwapPayload + if err := method.Inputs.Copy(&swapPayload, args); err != nil { + return SwapPacketData{}, fmt.Errorf("error while unpacking args to SwapPayload struct: %s", err) } - swapPacketData = SwapPacketData{ - Sender: sender, - Input: input, - Output: output, - Amount: amount, - SlippagePercentage: slippagePercentage, - WindowSeconds: windowSeconds, - SwapReceiver: receiver, + // Perform validation of the SwapPacketData. + if err := swapPayload.SwapPacketData.ValidateBasic(); err != nil { + return SwapPacketData{}, err } - return swapPacketData, nil + return swapPayload.SwapPacketData, nil } diff --git a/precompiles/outposts/osmosis/types_test.go b/precompiles/outposts/osmosis/types_test.go index 72192c2283..c372a8d678 100644 --- a/precompiles/outposts/osmosis/types_test.go +++ b/precompiles/outposts/osmosis/types_test.go @@ -87,9 +87,7 @@ func TestCreatePacketWithMemo(t *testing.T) { // TestParseSwapPacketData is mainly to test that the returned error of the // parser is clear and contains the correct data type. For this reason the // expected error has been hardcoded as a string litera. -func TestParseSwapPacketData(t *testing.T) { - t.Parallel() - +func (s *PrecompileTestSuite) TestParseSwapPacketData() { sender := common.HexToAddress("sender") input := common.HexToAddress("input") output := common.HexToAddress("output") @@ -105,116 +103,44 @@ func TestParseSwapPacketData(t *testing.T) { errContains string }{ { - name: "pass - valid payload", + name: "pass - valid payload of type SwapPayload", args: []interface{}{ - sender, - input, - output, - amount, - slippagePercentage, - windowSeconds, - receiver, + osmosisoutpost.SwapPacketData{ + ChannelID: ChannelID, + XcsContract: XCSContract, + Sender: sender, + Input: input, + Output: output, + Amount: amount, + SlippagePercentage: slippagePercentage, + WindowSeconds: windowSeconds, + SwapReceiver: receiver, + }, }, expPass: true, - }, { + }, + { name: "fail - invalid number of args", args: []interface{}{}, expPass: false, - errContains: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 7, 0), - }, { - name: "fail - wrong sender type", - args: []interface{}{ - "sender", - input, - output, - amount, - slippagePercentage, - windowSeconds, - receiver, - }, - expPass: false, - errContains: "invalid type for sender: expected common.Address, received string", - }, { - name: "fail - wrong input type", - args: []interface{}{ - sender, - "input", - output, - amount, - slippagePercentage, - windowSeconds, - receiver, - }, - expPass: false, - errContains: "invalid type for input: expected common.Address, received string", - }, { - name: "fail - wrong output type", - args: []interface{}{ - sender, - input, - "output", - amount, - slippagePercentage, - windowSeconds, - receiver, - }, - expPass: false, - errContains: "invalid type for output: expected common.Address, received string", - }, { - name: "fail - wrong amount type", - args: []interface{}{ - sender, - input, - output, - 3, - slippagePercentage, - windowSeconds, - receiver, - }, - expPass: false, - errContains: "invalid type for amount: expected big.Int, received int", - }, { - name: "fail - wrong slippage percentage type", - args: []interface{}{ - sender, - input, - output, - amount, - 10, - windowSeconds, - receiver, - }, - expPass: false, - errContains: "invalid type for slippagePercentage: expected uint8, received int", - }, { - name: "fail - wrong window seconds type", - args: []interface{}{ - sender, - input, - output, - amount, - slippagePercentage, - uint16(20), - receiver, - }, - expPass: false, - errContains: "invalid type for windowSeconds: expected uint64, received uint16", + errContains: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 1, 0), }, } for _, tc := range testCases { tc := tc - t.Run(tc.name, func(t *testing.T) { - t.Parallel() + s.Run(tc.name, func() { + method := s.precompile.Methods[osmosisoutpost.SwapMethod] - swapPacketData, err := osmosisoutpost.ParseSwapPacketData(tc.args) + swapPacketData, err := osmosisoutpost.ParseSwapPacketData(&method, tc.args) if tc.expPass { - require.NoError(t, err, "expected no error while creating memo") - require.Equal( - t, + s.NoError(err, "expected no error while creating memo") + s.Equal( osmosisoutpost.SwapPacketData{ + ChannelID: ChannelID, + XcsContract: XCSContract, Sender: sender, Input: input, Output: output, @@ -226,8 +152,8 @@ func TestParseSwapPacketData(t *testing.T) { swapPacketData, ) } else { - require.Error(t, err, "expected error while validating the memo") - require.Contains(t, err.Error(), tc.errContains, "expected different error") + s.Error(err, "expected error while validating the memo") + s.Contains(err.Error(), tc.errContains, "expected different error") } }) } @@ -237,7 +163,7 @@ func TestValidateMemo(t *testing.T) { t.Parallel() receiver := "evmos1vl0x3xr0zwgrllhdzxxlkal7txnnk56q3552x7" - contract := osmosisoutpost.XCSContractTestnet + contract := "osmo1a34wxsxjwvtz3ua4hnkh4lv3d4qrgry0fhkasppplphwu5k538tqcyms9x" onFailedDelivery := "do_nothing" slippagePercentage := uint8(10) windowSeconds := uint64(30) @@ -564,7 +490,7 @@ func TestValidateOsmosisContractAddress(t *testing.T) { }, { name: "pass - valid contract address", - contractAddress: osmosisoutpost.XCSContractTestnet, + contractAddress: "osmo1a34wxsxjwvtz3ua4hnkh4lv3d4qrgry0fhkasppplphwu5k538tqcyms9x", expPass: true, }, } diff --git a/precompiles/outposts/stride/IStrideOutpost.sol b/precompiles/outposts/stride/IStrideOutpost.sol index 9d2502bb32..15ac32c47a 100644 --- a/precompiles/outposts/stride/IStrideOutpost.sol +++ b/precompiles/outposts/stride/IStrideOutpost.sol @@ -62,14 +62,14 @@ interface IStrideOutpost { /// @param sender The sender of the liquid stake transaction. /// @param token The hex ERC20 address of the token pair. /// @param amount The amount that will be liquid staked. - /// @param receiver The bech32 address of the receiver. + /// @param strideForwarder The bech32-formatted address of the receiver on Stride. /// @return nextSequence The sequence number of the transfer packet sent /// @return success True if the ICS20 transfer was successful. function liquidStake( address sender, address token, uint256 amount, - string calldata receiver + string calldata strideForwarder ) external returns (uint64 nextSequence, bool success); /// @dev This method unstakes the LSD Coin (ex. stEvmos, stAtom) and redeems diff --git a/tests/nix_tests/configs/osmosis-outpost.nix b/tests/nix_tests/configs/osmosis-outpost.nix deleted file mode 100644 index 98bb8c115d..0000000000 --- a/tests/nix_tests/configs/osmosis-outpost.nix +++ /dev/null @@ -1,15 +0,0 @@ -{ pkgs ? import ../../../nix { } }: -let evmosd = (pkgs.callPackage ../../../. { }); -in -evmosd.overrideAttrs (oldAttrs: { - # Patch the evmos binary to: - # - allow to register WEVMOS token pair - # - use the CrossChainSwap contract address in the testing setup - # - update the corresponding IBC channel to match the tests setup - patches = oldAttrs.patches or [ ] ++ [ - ./allow-wevmos-register.patch - ./xcs-osmosis-contract.patch - ./osmosis-channel.patch - ]; -}) - diff --git a/tests/nix_tests/configs/xcs-osmosis-contract.patch b/tests/nix_tests/configs/xcs-osmosis-contract.patch deleted file mode 100644 index 32aac8684b..0000000000 --- a/tests/nix_tests/configs/xcs-osmosis-contract.patch +++ /dev/null @@ -1,16 +0,0 @@ -diff --git a/precompiles/outposts/osmosis/osmosis.go b/precompiles/outposts/osmosis/osmosis.go -index 84ec3b48..bee61b7e 100644 ---- a/precompiles/outposts/osmosis/osmosis.go -+++ b/precompiles/outposts/osmosis/osmosis.go -@@ -29,8 +29,10 @@ const ( - // OsmosisOutpostAddress is the address of the Osmosis outpost precompile. - OsmosisOutpostAddress = "0x0000000000000000000000000000000000000901" - -+ // Update the XCSContractTestnet to match the contract -+ // address in the testing setup - // XCSContract address for Osmosis testnet. -- XCSContractTestnet = "osmo18rj46qcpr57m3qncrj9cuzm0gn3km08w5jxxlnw002c9y7xex5xsu74ytz" -+ XCSContractTestnet = "osmo14sfz9e7t6nfxlfyqtdq3zngn5aryn9900gwzdjsp4u334pn089hs9lqdwx" - // XCSContract address for Osmosis mainnet. - XCSContractMainnet = "" - ) diff --git a/tests/nix_tests/test_osmosis_outpost.py b/tests/nix_tests/test_osmosis_outpost.py index 6fccfa2bbb..c6c4a6c160 100644 --- a/tests/nix_tests/test_osmosis_outpost.py +++ b/tests/nix_tests/test_osmosis_outpost.py @@ -37,9 +37,7 @@ def ibc(request, tmp_path_factory): evmos_build = request.param path = tmp_path_factory.mktemp(name) # Setup the IBC connections - network = prepare_network( - path, name, [evmos_build, "osmosis"], custom_scenario=name - ) + network = prepare_network(path, name, [evmos_build, "osmosis"]) yield from network @@ -57,7 +55,7 @@ def test_osmosis_swap(ibc): # 100aevmos is 98uosmo exp_swap_amount = 98 - setup_osmos_chains(ibc) + xcs_contract = setup_osmos_chains(ibc) # --------- Register Evmos token (this could be wrapevmos I think) wevmos_addr = wrap_evmos(ibc.chains["evmos"], evmos_addr, amt) @@ -77,16 +75,18 @@ def test_osmosis_swap(ibc): w3 = evmos.w3 pc = get_precompile_contract(w3, "IOsmosisOutpost") evmos_gas_price = w3.eth.gas_price - - tx = pc.functions.swap( - evmos_addr, - wevmos_addr, - osmo_erc20_addr, - amt, - testSlippagePercentage, - testWindowSeconds, - eth_to_bech32(evmos_addr), - ).build_transaction( + swap_params = { + "channelID": "channel-0", + "xcsContract": xcs_contract, + "sender": evmos_addr, + "input": wevmos_addr, + "output": osmo_erc20_addr, + "amount": amt, + "slippagePercentage": testSlippagePercentage, + "windowSeconds": testWindowSeconds, + "swapReceiver": eth_to_bech32(evmos_addr), + } + tx = pc.functions.swap(swap_params).build_transaction( {"from": evmos_addr, "gasPrice": evmos_gas_price, "gas": 30000000} ) gas_estimation = evmos.w3.eth.estimate_gas(tx) @@ -163,6 +163,8 @@ def setup_osmos_chains(ibc): osmosis_cli, osmosis_addr, swap_contract_addr, pool_id, EVMOS_IBC_DENOM, "uosmo" ) + return swap_contract_addr + def send_evmos_to_osmos(ibc): src_chain = ibc.chains["evmos"] diff --git a/x/evm/keeper/precompiles.go b/x/evm/keeper/precompiles.go index 94b9221f23..baf0a6ebaf 100644 --- a/x/evm/keeper/precompiles.go +++ b/x/evm/keeper/precompiles.go @@ -85,15 +85,11 @@ func AvailablePrecompiles( panic(fmt.Errorf("failed to instantiate bank precompile: %w", err)) } - var strideChannelID, osmosisChannelID, xcsv1Contract string + var strideChannelID string if utils.IsMainnet(chainID) { - osmosisChannelID = evmostransfertypes.OsmosisMainnetChannelID strideChannelID = evmostransfertypes.StrideMainnetChannelID - xcsv1Contract = osmosisoutpost.XCSContractMainnet } else { - osmosisChannelID = evmostransfertypes.OsmosisTestnetChannelID strideChannelID = evmostransfertypes.StrideTestnetChannelID - xcsv1Contract = osmosisoutpost.XCSContractMainnet } strideOutpost, err := strideoutpost.NewPrecompile( @@ -109,9 +105,6 @@ func AvailablePrecompiles( } osmosisOutpost, err := osmosisoutpost.NewPrecompile( - transfertypes.PortID, - osmosisChannelID, - xcsv1Contract, authzKeeper, bankKeeper, transferKeeper, From fde1a5ee0f2f4e1711c9ad8b7512790c4883444c Mon Sep 17 00:00:00 2001 From: Vladislav Varadinov Date: Tue, 2 Jan 2024 16:17:40 +0200 Subject: [PATCH 047/345] imp(stride-outpost): Refactor Stride outpost for additional client side arguments (#2207) * fix: add new interface * fix(stride-outpost): refactor according to ADR 003 * CHANGELOG * fix: include wevmos_addr * update stride setup in nix e2e test * revert change in nix test script * fix: refactor and rename some tests, add explainer comment to fields in Solidity struct * fix: update comments on Autopilot struct * gomod2nix generate * fix: remove unused hardcoded values * fix: remove unused chainID --------- Co-authored-by: tom Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- CHANGELOG.md | 1 + app/app.go | 2 - .../outposts/stride/IStrideOutpost.sol | 44 +++--- precompiles/outposts/stride/abi.json | 121 ++++++++------- precompiles/outposts/stride/setup_test.go | 2 - precompiles/outposts/stride/stride.go | 5 - precompiles/outposts/stride/tx.go | 43 ++++-- precompiles/outposts/stride/tx_test.go | 144 +++++++++++------- precompiles/outposts/stride/types.go | 115 +++++--------- precompiles/outposts/stride/types_test.go | 4 +- .../configs/stride-outpost-channel.patch | 16 -- tests/nix_tests/configs/stride-outpost.nix | 12 -- tests/nix_tests/ibc_utils.py | 20 ++- tests/nix_tests/test_stride_outpost.py | 19 ++- x/evm/keeper/precompiles.go | 13 -- 15 files changed, 277 insertions(+), 284 deletions(-) delete mode 100644 tests/nix_tests/configs/stride-outpost-channel.patch delete mode 100644 tests/nix_tests/configs/stride-outpost.nix diff --git a/CHANGELOG.md b/CHANGELOG.md index 51e4642251..0396923a8b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -57,6 +57,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (erc20) [#2155] (https://github.com/evmos/evmos/pull/2155) Remove CLI commands for register and convert Coin. - (erc20) [#2157] (https://github.com/evmos/evmos/pull/2157) Remove `RegisterCoinProposal` logic, protos and related tests. - (osmosis-outpost) [#2206](https://github.com/evmos/evmos/pull/2206) Update swap function input to custom struct. +- (stride-outpost) [#2207](https://github.com/evmos/evmos/pull/2207) Update Stride Outpost to include additional arguments. ### API Breaking diff --git a/app/app.go b/app/app.go index 6bdd1ee9b8..d8061e10ff 100644 --- a/app/app.go +++ b/app/app.go @@ -506,11 +506,9 @@ func NewEvmos( app.AccountKeeper, app.BankKeeper, scopedTransferKeeper, app.Erc20Keeper, // Add ERC20 Keeper for ERC20 transfers ) - chainID := bApp.ChainID() // We call this after setting the hooks to ensure that the hooks are set on the keeper evmKeeper.WithPrecompiles( evmkeeper.AvailablePrecompiles( - chainID, *stakingKeeper, app.DistrKeeper, app.BankKeeper, diff --git a/precompiles/outposts/stride/IStrideOutpost.sol b/precompiles/outposts/stride/IStrideOutpost.sol index 15ac32c47a..79a898d470 100644 --- a/precompiles/outposts/stride/IStrideOutpost.sol +++ b/precompiles/outposts/stride/IStrideOutpost.sol @@ -11,6 +11,20 @@ IStrideOutpost constant STRIDE_OUTPOST_CONTRACT = IStrideOutpost( STRIDE_OUTPOST_ADDRESS ); +/// @dev AutopilotParams is a struct containing the parameters for a liquid stake and redeem transactions. +/// @param receiver - The address on the Evmos chain that will redeem or receive LSD. +/// @param strideForwarder - The bech32-formatted address on the Stride chain that will be used to execute +/// LiquidStake or Redeem transactions. +struct AutopilotParams { + string channelID; + address sender; + address receiver; + address token; + uint256 amount; + string strideForwarder; +} + + /// @author Evmos Team /// @title StrideOutpost Precompiled Contract /// @dev The interface through which solidity contracts will interact with Stride Outpost that uses ICS20 under the hood @@ -59,33 +73,11 @@ interface IStrideOutpost { ); /// @dev Liquid stake a native Coin on the Stride chain and return it to the Evmos chain. - /// @param sender The sender of the liquid stake transaction. - /// @param token The hex ERC20 address of the token pair. - /// @param amount The amount that will be liquid staked. - /// @param strideForwarder The bech32-formatted address of the receiver on Stride. - /// @return nextSequence The sequence number of the transfer packet sent - /// @return success True if the ICS20 transfer was successful. - function liquidStake( - address sender, - address token, - uint256 amount, - string calldata strideForwarder - ) external returns (uint64 nextSequence, bool success); + /// @param payload The AutopilotParams struct containing the parameters for the liquid stake transaction. + function liquidStake(AutopilotParams calldata payload) external returns (bool success); /// @dev This method unstakes the LSD Coin (ex. stEvmos, stAtom) and redeems /// the native Coin by sending an ICS20 Transfer to the specified chain. - /// @param sender The sender of the redeem transaction. - /// @param receiver the address of the receiver on Evmos. - /// @param token The hex address of the token to be redeemed. - /// @param amount The amount of tokens unstaked. - /// @param strideForwarder The bech32-formatted address of the receiver on Stride. - /// @return nextSequence The sequence number of the transfer packet sent - /// @return success The boolean value indicating whether the operation succeeded. - function redeemStake( - address sender, - address receiver, - address token, - string calldata strideForwarder, - uint256 amount - ) external returns (uint64 nextSequence, bool success); + /// @param payload The AutopilotParams struct containing the parameters for the redeem stake transaction. + function redeemStake(AutopilotParams calldata payload) external returns (bool success); } \ No newline at end of file diff --git a/precompiles/outposts/stride/abi.json b/precompiles/outposts/stride/abi.json index fa9f85342e..1b48d74c56 100644 --- a/precompiles/outposts/stride/abi.json +++ b/precompiles/outposts/stride/abi.json @@ -113,33 +113,45 @@ { "inputs": [ { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "string", - "name": "receiver", - "type": "string" + "components": [ + { + "internalType": "string", + "name": "channelID", + "type": "string" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "string", + "name": "strideForwarder", + "type": "string" + } + ], + "internalType": "struct AutopilotParams", + "name": "payload", + "type": "tuple" } ], "name": "liquidStake", "outputs": [ - { - "internalType": "uint64", - "name": "nextSequence", - "type": "uint64" - }, { "internalType": "bool", "name": "success", @@ -152,38 +164,45 @@ { "inputs": [ { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "receiver", - "type": "address" - }, - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "string", - "name": "strideForwarder", - "type": "string" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "components": [ + { + "internalType": "string", + "name": "channelID", + "type": "string" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "string", + "name": "strideForwarder", + "type": "string" + } + ], + "internalType": "struct AutopilotParams", + "name": "payload", + "type": "tuple" } ], "name": "redeemStake", "outputs": [ - { - "internalType": "uint64", - "name": "nextSequence", - "type": "uint64" - }, { "internalType": "bool", "name": "success", diff --git a/precompiles/outposts/stride/setup_test.go b/precompiles/outposts/stride/setup_test.go index 6d9ff438a6..c4b16e82e2 100644 --- a/precompiles/outposts/stride/setup_test.go +++ b/precompiles/outposts/stride/setup_test.go @@ -36,8 +36,6 @@ func (s *PrecompileTestSuite) SetupTest() { ) precompile, err := stride.NewPrecompile( - portID, - channelID, network.App.TransferKeeper, network.App.Erc20Keeper, network.App.AuthzKeeper, diff --git a/precompiles/outposts/stride/stride.go b/precompiles/outposts/stride/stride.go index 8452dc93f0..83f7278a51 100644 --- a/precompiles/outposts/stride/stride.go +++ b/precompiles/outposts/stride/stride.go @@ -30,8 +30,6 @@ var f embed.FS type Precompile struct { cmn.Precompile - portID string - channelID string timeoutHeight clienttypes.Height transferKeeper transferkeeper.Keeper erc20Keeper erc20keeper.Keeper @@ -41,7 +39,6 @@ type Precompile struct { // NewPrecompile creates a new Stride outpost Precompile instance as a // PrecompiledContract interface. func NewPrecompile( - portID, channelID string, transferKeeper transferkeeper.Keeper, erc20Keeper erc20keeper.Keeper, authzKeeper authzkeeper.Keeper, @@ -60,8 +57,6 @@ func NewPrecompile( TransientKVGasConfig: storetypes.TransientGasConfig(), ApprovalExpiration: cmn.DefaultExpirationDuration, // should be configurable in the future. }, - portID: portID, - channelID: channelID, timeoutHeight: clienttypes.NewHeight(ics20.DefaultTimeoutHeight, ics20.DefaultTimeoutHeight), transferKeeper: transferKeeper, erc20Keeper: erc20Keeper, diff --git a/precompiles/outposts/stride/tx.go b/precompiles/outposts/stride/tx.go index 350d74c86c..6c8e8b6722 100644 --- a/precompiles/outposts/stride/tx.go +++ b/precompiles/outposts/stride/tx.go @@ -6,6 +6,8 @@ package stride import ( "fmt" + transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" + "cosmossdk.io/math" "github.com/evmos/evmos/v16/utils" @@ -25,8 +27,6 @@ const ( LiquidStakeAction = "LiquidStake" // RedeemStakeAction is the action name needed in the memo field RedeemStakeAction = "RedeemStake" - // NoReceiver is the string used in the memo field when the receiver is not needed - NoReceiver = "" ) // LiquidStake is a transaction that liquid stakes tokens using @@ -39,11 +39,17 @@ func (p Precompile) LiquidStake( method *abi.Method, args []interface{}, ) ([]byte, error) { - sender, token, amount, receiver, err := parseLiquidStakeArgs(args) + autopilotArgs, err := parseAutopilotArgs(method, args) if err != nil { return nil, err } + sender := autopilotArgs.Sender + receiver := autopilotArgs.Receiver + token := autopilotArgs.Token + amount := autopilotArgs.Amount + strideForwarder := autopilotArgs.StrideForwarder + // The provided sender address should always be equal to the origin address. // In case the contract caller address is the same as the sender address provided, // update the sender address to be equal to the origin address. @@ -72,18 +78,18 @@ func (p Precompile) LiquidStake( coin := sdk.Coin{Denom: tokenPair.Denom, Amount: math.NewIntFromBigInt(amount)} // Create the memo for the ICS20 transfer packet - memo, err := CreateMemo(LiquidStakeAction, receiver, NoReceiver) + memo, err := CreateMemo(LiquidStakeAction, strideForwarder, sdk.AccAddress(receiver.Bytes()).String()) if err != nil { return nil, err } // Build the MsgTransfer with the memo and coin msg, err := ics20.CreateAndValidateMsgTransfer( - p.portID, - p.channelID, + transfertypes.PortID, + autopilotArgs.ChannelID, coin, sdk.AccAddress(sender.Bytes()).String(), - receiver, + strideForwarder, p.timeoutHeight, 0, memo, @@ -100,7 +106,7 @@ func (p Precompile) LiquidStake( } // Execute the ICS20 Transfer - res, err := p.transferKeeper.Transfer(sdk.WrapSDKContext(ctx), msg) + _, err = p.transferKeeper.Transfer(sdk.WrapSDKContext(ctx), msg) if err != nil { return nil, err } @@ -131,7 +137,7 @@ func (p Precompile) LiquidStake( return nil, err } - return method.Outputs.Pack(res.Sequence, true) + return method.Outputs.Pack(true) } // RedeemStake is a transaction that redeems the native tokens using the liquid stake @@ -145,11 +151,18 @@ func (p Precompile) RedeemStake( method *abi.Method, args []interface{}, ) ([]byte, error) { - sender, receiver, token, strideForwarder, amount, err := parseRedeemStakeArgs(args) + autopilotArgs, err := parseAutopilotArgs(method, args) if err != nil { return nil, err } + sender := autopilotArgs.Sender + receiver := autopilotArgs.Receiver + token := autopilotArgs.Token + amount := autopilotArgs.Amount + strideForwarder := autopilotArgs.StrideForwarder + channelID := autopilotArgs.ChannelID + // The provided sender address should always be equal to the origin address. // In case the contract caller address is the same as the sender address provided, // update the sender address to be equal to the origin address. @@ -163,7 +176,7 @@ func (p Precompile) RedeemStake( bondDenom := p.stakingKeeper.BondDenom(ctx) stToken := "st" + bondDenom - ibcDenom := utils.ComputeIBCDenom(p.portID, p.channelID, stToken) + ibcDenom := utils.ComputeIBCDenom(transfertypes.PortID, channelID, stToken) tokenPairID := p.erc20Keeper.GetDenomMap(ctx, ibcDenom) tokenPair, found := p.erc20Keeper.GetTokenPair(ctx, tokenPairID) @@ -185,8 +198,8 @@ func (p Precompile) RedeemStake( // Build the MsgTransfer with the memo and coin msg, err := ics20.CreateAndValidateMsgTransfer( - p.portID, - p.channelID, + transfertypes.PortID, + channelID, coin, sdk.AccAddress(sender.Bytes()).String(), strideForwarder, @@ -206,7 +219,7 @@ func (p Precompile) RedeemStake( } // Execute the ICS20 Transfer - res, err := p.transferKeeper.Transfer(sdk.WrapSDKContext(ctx), msg) + _, err = p.transferKeeper.Transfer(sdk.WrapSDKContext(ctx), msg) if err != nil { return nil, err } @@ -237,5 +250,5 @@ func (p Precompile) RedeemStake( return nil, err } - return method.Outputs.Pack(res.Sequence, true) + return method.Outputs.Pack(true) } diff --git a/precompiles/outposts/stride/tx_test.go b/precompiles/outposts/stride/tx_test.go index dfc3747d79..f00b3f2ac2 100644 --- a/precompiles/outposts/stride/tx_test.go +++ b/precompiles/outposts/stride/tx_test.go @@ -16,12 +16,18 @@ import ( "github.com/evmos/evmos/v16/precompiles/outposts/stride" ) +const ( + // RandomAddress is a token that is not supported by the Stride Outpost + RandomAddress = "0x1FD55A1B9FC24967C4dB09C513C3BA0DFa7FF687" +) + func (s *PrecompileTestSuite) TestLiquidStake() { method := s.precompile.Methods[stride.LiquidStakeMethod] denomID := s.network.App.Erc20Keeper.GetDenomMap(s.network.GetContext(), utils.BaseDenom) tokenPair, ok := s.network.App.Erc20Keeper.GetTokenPair(s.network.GetContext(), denomID) s.Require().True(ok, "expected token pair to be found") + //nolint:dupl //test case testCases := []struct { name string malleate func() []interface{} @@ -36,7 +42,7 @@ func (s *PrecompileTestSuite) TestLiquidStake() { }, 200000, true, - fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 4, 0), + fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 1, 0), }, { "fail - token not found", @@ -44,10 +50,14 @@ func (s *PrecompileTestSuite) TestLiquidStake() { err := s.network.App.StakingKeeper.SetParams(s.network.GetContext(), stakingtypes.DefaultParams()) s.Require().NoError(err) return []interface{}{ - s.keyring.GetAddr(0), - common.HexToAddress("0x1FD55A1B9FC24967C4dB09C513C3BA0DFa7FF687"), - big.NewInt(1e18), - "stride1mdna37zrprxl7kn0rj4e58ndp084fzzwcxhrh2", + stride.AutopilotArgs{ + ChannelID: channelID, + Sender: s.keyring.GetAddr(0), + Receiver: s.keyring.GetAddr(0), + Token: common.HexToAddress(RandomAddress), + Amount: big.NewInt(1e18), + StrideForwarder: "stride1mdna37zrprxl7kn0rj4e58ndp084fzzwcxhrh2", + }, } }, 200000, @@ -58,10 +68,14 @@ func (s *PrecompileTestSuite) TestLiquidStake() { "fail - unsupported token", func() []interface{} { return []interface{}{ - s.keyring.GetAddr(0), - common.HexToAddress("0x1FD55A1B9FC24967C4dB09C513C3BA0DFa7FF687"), - big.NewInt(1e18), - "stride1mdna37zrprxl7kn0rj4e58ndp084fzzwcxhrh2", + stride.AutopilotArgs{ + ChannelID: channelID, + Sender: s.keyring.GetAddr(0), + Receiver: s.keyring.GetAddr(0), + Token: common.HexToAddress(RandomAddress), + Amount: big.NewInt(1e18), + StrideForwarder: "stride1mdna37zrprxl7kn0rj4e58ndp084fzzwcxhrh2", + }, } }, 200000, @@ -72,24 +86,32 @@ func (s *PrecompileTestSuite) TestLiquidStake() { "fail - invalid strideForwarder address (not a stride address)", func() []interface{} { return []interface{}{ - s.keyring.GetAddr(0), - common.HexToAddress(tokenPair.Erc20Address), - big.NewInt(1e18), - "cosmos1xv9tklw7d82sezh9haa573wufgy59vmwe6xxe5", + stride.AutopilotArgs{ + ChannelID: channelID, + Sender: s.keyring.GetAddr(0), + Receiver: s.keyring.GetAddr(0), + Token: common.HexToAddress(tokenPair.Erc20Address), + Amount: big.NewInt(1e18), + StrideForwarder: "cosmos1xv9tklw7d82sezh9haa573wufgy59vmwe6xxe5", + }, } }, 200000, true, - "receiver is not a stride address", + "invalid stride bech32 address", }, { "fail - strideForwarder address is an invalid stride bech32 address", func() []interface{} { return []interface{}{ - s.keyring.GetAddr(0), - common.HexToAddress(tokenPair.Erc20Address), - big.NewInt(1e18), - "stride1xv9tklw7d82sezh9haa573wufgy59vmwe6xxe", + stride.AutopilotArgs{ + ChannelID: channelID, + Sender: s.keyring.GetAddr(0), + Receiver: s.keyring.GetAddr(0), + Token: common.HexToAddress(tokenPair.Erc20Address), + Amount: big.NewInt(1e18), + StrideForwarder: "stride1xv9tklw7d82sezh9haa573wufgy59vmwe6xx", + }, } }, 200000, @@ -100,10 +122,14 @@ func (s *PrecompileTestSuite) TestLiquidStake() { "success", func() []interface{} { return []interface{}{ - s.keyring.GetAddr(0), - common.HexToAddress(tokenPair.Erc20Address), - big.NewInt(1e18), - "stride1rhe5leyt5w0mcwd9rpp93zqn99yktsxvyaqgd0", + stride.AutopilotArgs{ + ChannelID: channelID, + Sender: s.keyring.GetAddr(0), + Receiver: s.keyring.GetAddr(0), + Token: common.HexToAddress(tokenPair.Erc20Address), + Amount: big.NewInt(1e18), + StrideForwarder: "stride1rhe5leyt5w0mcwd9rpp93zqn99yktsxvyaqgd0", + }, } }, 200000, @@ -141,6 +167,7 @@ func (s *PrecompileTestSuite) TestRedeem() { tokenPair, ok := s.network.App.Erc20Keeper.GetTokenPair(s.network.GetContext(), denomID) s.Require().True(ok, "expected token pair to be found") + //nolint:dupl //test case testCases := []struct { name string malleate func() []interface{} @@ -155,7 +182,7 @@ func (s *PrecompileTestSuite) TestRedeem() { }, 200000, true, - fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 5, 0), + fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 1, 0), }, { "fail - token not found", @@ -163,11 +190,14 @@ func (s *PrecompileTestSuite) TestRedeem() { err := s.network.App.StakingKeeper.SetParams(s.network.GetContext(), stakingtypes.DefaultParams()) s.Require().NoError(err) return []interface{}{ - s.keyring.GetAddr(0), - s.keyring.GetAddr(0), - common.HexToAddress("0x1FD55A1B9FC24967C4dB09C513C3BA0DFa7FF687"), - big.NewInt(1e18), - "stride1mdna37zrprxl7kn0rj4e58ndp084fzzwcxhrh2", + stride.AutopilotArgs{ + ChannelID: channelID, + Sender: s.keyring.GetAddr(0), + Receiver: s.keyring.GetAddr(0), + Token: common.HexToAddress(RandomAddress), + Amount: big.NewInt(1e18), + StrideForwarder: "stride1mdna37zrprxl7kn0rj4e58ndp084fzzwcxhrh2", + }, } }, 200000, @@ -178,11 +208,14 @@ func (s *PrecompileTestSuite) TestRedeem() { "fail - unsupported token", func() []interface{} { return []interface{}{ - s.keyring.GetAddr(0), - s.keyring.GetAddr(0), - common.HexToAddress("0x1FD55A1B9FC24967C4dB09C513C3BA0DFa7FF687"), - big.NewInt(1e18), - "stride1mdna37zrprxl7kn0rj4e58ndp084fzzwcxhrh2", + stride.AutopilotArgs{ + ChannelID: channelID, + Sender: s.keyring.GetAddr(0), + Receiver: s.keyring.GetAddr(0), + Token: common.HexToAddress(RandomAddress), + Amount: big.NewInt(1e18), + StrideForwarder: "stride1mdna37zrprxl7kn0rj4e58ndp084fzzwcxhrh2", + }, } }, 200000, @@ -190,29 +223,35 @@ func (s *PrecompileTestSuite) TestRedeem() { "The only supported token contract for Stride Outpost v1 is 0xd567B3d7B8FE3C79a1AD8dA978812cfC4Fa05e75", }, { - "fail - invalid receiver address (not a stride address)", + "fail - invalid stride forwarder address (not a stride address)", func() []interface{} { return []interface{}{ - s.keyring.GetAddr(0), - s.keyring.GetAddr(0), - common.HexToAddress(tokenPair.Erc20Address), - big.NewInt(1e18), - "cosmos1xv9tklw7d82sezh9haa573wufgy59vmwe6xxe5", + stride.AutopilotArgs{ + ChannelID: channelID, + Sender: s.keyring.GetAddr(0), + Receiver: s.keyring.GetAddr(0), + Token: common.HexToAddress(tokenPair.Erc20Address), + Amount: big.NewInt(1e18), + StrideForwarder: "cosmos1xv9tklw7d82sezh9haa573wufgy59vmwe6xxe5", + }, } }, 200000, true, - "receiver is not a stride address", + "invalid stride bech32 address", }, { - "fail - receiver address is an invalid stride bech32 address", + "fail - stride forwarder address is an invalid stride bech32 address", func() []interface{} { return []interface{}{ - s.keyring.GetAddr(0), - s.keyring.GetAddr(0), - common.HexToAddress(tokenPair.Erc20Address), - big.NewInt(1e18), - "stride1xv9tklw7d82sezh9haa573wufgy59vmwe6xxe", + stride.AutopilotArgs{ + ChannelID: channelID, + Sender: s.keyring.GetAddr(0), + Receiver: s.keyring.GetAddr(0), + Token: common.HexToAddress(tokenPair.Erc20Address), + Amount: big.NewInt(1e18), + StrideForwarder: "stride1xv9tklw7d82sezh9haa573wufgy59vmwe6xxe", + }, } }, 200000, @@ -223,11 +262,14 @@ func (s *PrecompileTestSuite) TestRedeem() { "success", func() []interface{} { return []interface{}{ - s.keyring.GetAddr(0), - s.keyring.GetAddr(0), - common.HexToAddress(tokenPair.Erc20Address), - big.NewInt(1e18), - "stride1rhe5leyt5w0mcwd9rpp93zqn99yktsxvyaqgd0", + stride.AutopilotArgs{ + ChannelID: channelID, + Sender: s.keyring.GetAddr(0), + Receiver: s.keyring.GetAddr(0), + Token: common.HexToAddress(tokenPair.Erc20Address), + Amount: big.NewInt(1e18), + StrideForwarder: "stride1rhe5leyt5w0mcwd9rpp93zqn99yktsxvyaqgd0", + }, } }, 200000, diff --git a/precompiles/outposts/stride/types.go b/precompiles/outposts/stride/types.go index 81506369b4..e1f6e9855e 100644 --- a/precompiles/outposts/stride/types.go +++ b/precompiles/outposts/stride/types.go @@ -8,6 +8,8 @@ import ( "fmt" "math/big" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/evmos/evmos/v16/utils" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" @@ -55,6 +57,21 @@ type RawPacketMetadata struct { Autopilot *Autopilot `json:"autopilot"` } +// AutopilotArgs is the arguments struct for the LiquidStake and RedeemStake methods +type AutopilotArgs struct { + ChannelID string + Sender common.Address + Token common.Address + Receiver common.Address + Amount *big.Int + StrideForwarder string +} + +// AutopilotPayload is the payload struct for the LiquidStake and RedeemStake method +type AutopilotPayload struct { + Payload AutopilotArgs +} + // ValidateBasic validates the RawPacketMetadata structure and fields func (r RawPacketMetadata) ValidateBasic() error { if r.Autopilot.StakeIBC.Action == "" { @@ -72,89 +89,33 @@ func (r RawPacketMetadata) ValidateBasic() error { return nil } -// parseLiquidStakeArgs parses the arguments from the Liquid Stake method call -func parseLiquidStakeArgs(args []interface{}) (common.Address, common.Address, *big.Int, string, error) { - if len(args) != 4 { - return common.Address{}, common.Address{}, nil, "", fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 4, len(args)) - } - - sender, ok := args[0].(common.Address) - if !ok { - return common.Address{}, common.Address{}, nil, "", fmt.Errorf(cmn.ErrInvalidType, "sender", common.Address{}, args[0]) - } - - token, ok := args[1].(common.Address) - if !ok { - return common.Address{}, common.Address{}, nil, "", fmt.Errorf(cmn.ErrInvalidType, "token", common.Address{}, args[1]) - } - - amount, ok := args[2].(*big.Int) - if !ok { - return common.Address{}, common.Address{}, nil, "", fmt.Errorf(cmn.ErrInvalidType, "amount", &big.Int{}, args[2]) - } - - receiver, ok := args[3].(string) - if !ok { - return common.Address{}, common.Address{}, nil, "", fmt.Errorf(cmn.ErrInvalidType, "receiver", "", fmt.Sprintf("%T", args[3])) - } - - // Check if the receiver address has stride before - if receiver[:6] != StrideBech32Prefix { - return common.Address{}, common.Address{}, nil, "", fmt.Errorf("receiver is not a stride address") - } - - // Check if account is a valid bech32 address - _, err := utils.CreateAccAddressFromBech32(receiver, StrideBech32Prefix) +// ValidateBasic validates the AutopilotArgs structure and fields +func (a AutopilotArgs) ValidateBasic() error { + // Check if stride forwarder is a valid bech32 address + _, err := utils.CreateAccAddressFromBech32(a.StrideForwarder, StrideBech32Prefix) if err != nil { - return common.Address{}, common.Address{}, nil, "", sdkerrors.ErrInvalidAddress.Wrapf("invalid stride bech32 address: %s", err) + return sdkerrors.ErrInvalidAddress.Wrapf("invalid stride bech32 address: %s", err) } - - return sender, token, amount, receiver, nil + return nil } -// parseRedeemStakeArgs parses the arguments from the Redeem Stake method call -func parseRedeemStakeArgs(args []interface{}) (common.Address, common.Address, common.Address, string, *big.Int, error) { - if len(args) != 5 { - return common.Address{}, common.Address{}, common.Address{}, "", nil, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 5, len(args)) - } - - sender, ok := args[0].(common.Address) - if !ok { - return common.Address{}, common.Address{}, common.Address{}, "", nil, fmt.Errorf(cmn.ErrInvalidType, "sender", common.Address{}, args[0]) - } - - receiver, ok := args[1].(common.Address) - if !ok { - return common.Address{}, common.Address{}, common.Address{}, "", nil, fmt.Errorf(cmn.ErrInvalidType, "receiver", common.Address{}, args[1]) +// parseAutopilotArgs parses the arguments from the Liquid Stake and for Redeem Stake method calls +func parseAutopilotArgs(method *abi.Method, args []interface{}) (AutopilotArgs, error) { + if len(args) != 1 { + return AutopilotArgs{}, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 1, len(args)) } - token, ok := args[2].(common.Address) - if !ok { - return common.Address{}, common.Address{}, common.Address{}, "", nil, fmt.Errorf(cmn.ErrInvalidType, "token", common.Address{}, args[2]) + var autopilotPayload AutopilotPayload + if err := method.Inputs.Copy(&autopilotPayload, args); err != nil { + return AutopilotArgs{}, fmt.Errorf("error while unpacking args to AutopilotArgs struct: %s", err) } - amount, ok := args[3].(*big.Int) - if !ok { - return common.Address{}, common.Address{}, common.Address{}, "", nil, fmt.Errorf(cmn.ErrInvalidType, "amount", &big.Int{}, args[3]) + // Validate the AutopilotArgs struct + if err := autopilotPayload.Payload.ValidateBasic(); err != nil { + return AutopilotArgs{}, err } - strideForwarder, ok := args[4].(string) - if !ok { - return common.Address{}, common.Address{}, common.Address{}, "", nil, fmt.Errorf(cmn.ErrInvalidType, "strideForwardeer", "", fmt.Sprintf("%T", args[4])) - } - - // Check if the receiver address has stride before - if strideForwarder[:6] != StrideBech32Prefix { - return common.Address{}, common.Address{}, common.Address{}, "", nil, fmt.Errorf("receiver is not a stride address") - } - - // Check if account is a valid bech32 address - _, err := utils.CreateAccAddressFromBech32(strideForwarder, StrideBech32Prefix) - if err != nil { - return common.Address{}, common.Address{}, common.Address{}, "", nil, sdkerrors.ErrInvalidAddress.Wrapf("invalid stride bech32 address: %s", err) - } - - return sender, receiver, token, strideForwarder, amount, nil + return autopilotPayload.Payload, nil } // CreateMemo creates the memo for the StakeIBC actions - LiquidStake and RedeemStake. @@ -164,16 +125,12 @@ func CreateMemo(action, strideForwarder, receiver string) (string, error) { Autopilot: &Autopilot{ Receiver: strideForwarder, StakeIBC: &StakeIBCPacketMetadata{ - Action: action, + Action: action, + IBCReceiver: receiver, }, }, } - // Populate the IBC Receiver field if the action is RedeemStake - if action == RedeemStakeAction { - data.Autopilot.StakeIBC.IBCReceiver = receiver - } - if err := data.ValidateBasic(); err != nil { return "", err } diff --git a/precompiles/outposts/stride/types_test.go b/precompiles/outposts/stride/types_test.go index 7b1192a07c..01f6d1ff5d 100644 --- a/precompiles/outposts/stride/types_test.go +++ b/precompiles/outposts/stride/types_test.go @@ -23,9 +23,9 @@ func TestCreateMemo(t *testing.T) { name: "success - liquid stake", action: strideoutpost.LiquidStakeAction, receiver: "stride1xv9tklw7d82sezh9haa573wufgy59vmwe6xxe5", - evmosReceiver: strideoutpost.NoReceiver, + evmosReceiver: "evmos1xv9tklw7d82sezh9haa573wufgy59vmwe6xxe5", expPass: true, - expMemo: "{\"autopilot\":{\"receiver\":\"stride1xv9tklw7d82sezh9haa573wufgy59vmwe6xxe5\",\"stakeibc\":{\"action\":\"LiquidStake\"}}}", + expMemo: "{\"autopilot\":{\"receiver\":\"stride1xv9tklw7d82sezh9haa573wufgy59vmwe6xxe5\",\"stakeibc\":{\"action\":\"LiquidStake\",\"ibcreceiver\":\"evmos1xv9tklw7d82sezh9haa573wufgy59vmwe6xxe5\"}}}", }, { name: "success - redeem stake", diff --git a/tests/nix_tests/configs/stride-outpost-channel.patch b/tests/nix_tests/configs/stride-outpost-channel.patch deleted file mode 100644 index b38296bc99..0000000000 --- a/tests/nix_tests/configs/stride-outpost-channel.patch +++ /dev/null @@ -1,16 +0,0 @@ -diff --git a/x/evm/keeper/precompiles.go b/x/evm/keeper/precompiles.go -index 4a9f1ac9..8a2830e8 100644 ---- a/x/evm/keeper/precompiles.go -+++ b/x/evm/keeper/precompiles.go -@@ -64,7 +64,10 @@ func AvailablePrecompiles( - panic(fmt.Errorf("failed to load vesting precompile: %w", err)) - } - -- strideOutpost, err := strideoutpost.NewPrecompile(transfertypes.PortID, "channel-25", transferKeeper, erc20Keeper, authzKeeper, stakingKeeper) -+ // Update the stride outpost channel to channel-0 -+ // This patch is useful for e2e tests that setup -+ // a connection with Stride chain on channel-0 -+ strideOutpost, err := strideoutpost.NewPrecompile(transfertypes.PortID, "channel-0", transferKeeper, erc20Keeper, authzKeeper, stakingKeeper) - if err != nil { - panic(fmt.Errorf("failed to load stride outpost: %w", err)) - } diff --git a/tests/nix_tests/configs/stride-outpost.nix b/tests/nix_tests/configs/stride-outpost.nix deleted file mode 100644 index 4685426243..0000000000 --- a/tests/nix_tests/configs/stride-outpost.nix +++ /dev/null @@ -1,12 +0,0 @@ -{ pkgs ? import ../../../nix { } }: -let evmosd = (pkgs.callPackage ../../../. { }); -in -evmosd.overrideAttrs (oldAttrs: { - # Patch the evmos binary to: - # - allow to register WEVMOS token pair - # - use channel-0 for the stride outpost - patches = oldAttrs.patches or [ ] ++ [ - ./allow-wevmos-register.patch - ./stride-outpost-channel.patch - ]; -}) diff --git a/tests/nix_tests/ibc_utils.py b/tests/nix_tests/ibc_utils.py index 7c875bf9d8..261b1a5ce3 100644 --- a/tests/nix_tests/ibc_utils.py +++ b/tests/nix_tests/ibc_utils.py @@ -16,6 +16,7 @@ ADDRS, eth_to_bech32, memiavl_config, + setup_stride, update_evmos_bin, update_evmosd_and_setup_stride, wait_for_port, @@ -72,12 +73,14 @@ def get_evmos_generator( tmp_path: Path, file: str, is_rocksdb: bool = False, + stride_included: bool = False, custom_scenario: str | None = None, ): """ setup evmos with custom config depending on the build """ + post_init_func = None if is_rocksdb: file = memiavl_config(tmp_path, file) gen = setup_custom_evmos( @@ -93,7 +96,7 @@ def get_evmos_generator( # build the binary modified for a custom scenario modified_bin = build_patched_evmosd(custom_scenario) post_init_func = update_evmos_bin(modified_bin) - if "stride" in custom_scenario: + if stride_included: post_init_func = update_evmosd_and_setup_stride(modified_bin) gen = setup_custom_evmos( tmp_path, @@ -103,7 +106,14 @@ def get_evmos_generator( chain_binary=modified_bin, ) else: - gen = setup_custom_evmos(tmp_path, 28700, Path(__file__).parent / file) + if stride_included: + post_init_func = setup_stride() + gen = setup_custom_evmos( + tmp_path, + 28700, + Path(__file__).parent / file, + post_init=post_init_func, + ) return gen @@ -128,7 +138,11 @@ def prepare_network( # setup evmos with the custom config # depending on the build gen = get_evmos_generator( - tmp_path, file, "-rocksdb" in chain, custom_scenario + tmp_path, + file, + "-rocksdb" in chain, + "stride" in chain_names, + custom_scenario, ) evmos = next(gen) # wait for grpc ready diff --git a/tests/nix_tests/test_stride_outpost.py b/tests/nix_tests/test_stride_outpost.py index cc0d7a951e..1fce6a3eed 100644 --- a/tests/nix_tests/test_stride_outpost.py +++ b/tests/nix_tests/test_stride_outpost.py @@ -22,7 +22,7 @@ def ibc(request, tmp_path_factory): # specify the custom_scenario # to patch evmos to use channel-0 for Stride outpost # and allow to register WEVMOS token - network = prepare_network(path, name, [evmos_build, "stride"], custom_scenario=name) + network = prepare_network(path, name, [evmos_build, "stride"]) yield from network @@ -65,12 +65,17 @@ def test_liquid_stake(ibc): pc = get_precompile_contract(ibc.chains["evmos"].w3, "IStrideOutpost") evmos_gas_price = ibc.chains["evmos"].w3.eth.gas_price - tx = pc.functions.liquidStake( - sender_addr, - wevmos_addr, - amt, - dst_addr, - ).build_transaction({"from": sender_addr, "gasPrice": evmos_gas_price}) + liquid_stake_params = { + "channelID": "channel-0", + "sender": sender_addr, + "receiver": sender_addr, + "strideForwarder": dst_addr, + "token": wevmos_addr, + "amount": amt, + } + tx = pc.functions.liquidStake(liquid_stake_params).build_transaction( + {"from": sender_addr, "gasPrice": evmos_gas_price} + ) gas_estimation = ibc.chains["evmos"].w3.eth.estimate_gas(tx) receipt = send_transaction(ibc.chains["evmos"].w3, tx, KEYS["signer2"]) diff --git a/x/evm/keeper/precompiles.go b/x/evm/keeper/precompiles.go index baf0a6ebaf..78bfc972db 100644 --- a/x/evm/keeper/precompiles.go +++ b/x/evm/keeper/precompiles.go @@ -19,7 +19,6 @@ import ( bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" distributionkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" - transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" channelkeeper "github.com/cosmos/ibc-go/v7/modules/core/04-channel/keeper" bankprecompile "github.com/evmos/evmos/v16/precompiles/bank" distprecompile "github.com/evmos/evmos/v16/precompiles/distribution" @@ -29,17 +28,14 @@ import ( "github.com/evmos/evmos/v16/precompiles/p256" stakingprecompile "github.com/evmos/evmos/v16/precompiles/staking" vestingprecompile "github.com/evmos/evmos/v16/precompiles/vesting" - "github.com/evmos/evmos/v16/utils" erc20Keeper "github.com/evmos/evmos/v16/x/erc20/keeper" transferkeeper "github.com/evmos/evmos/v16/x/ibc/transfer/keeper" - evmostransfertypes "github.com/evmos/evmos/v16/x/ibc/transfer/types" vestingkeeper "github.com/evmos/evmos/v16/x/vesting/keeper" ) // AvailablePrecompiles returns the list of all available precompiled contracts. // NOTE: this should only be used during initialization of the Keeper. func AvailablePrecompiles( - chainID string, stakingKeeper stakingkeeper.Keeper, distributionKeeper distributionkeeper.Keeper, bankKeeper bankkeeper.Keeper, @@ -85,16 +81,7 @@ func AvailablePrecompiles( panic(fmt.Errorf("failed to instantiate bank precompile: %w", err)) } - var strideChannelID string - if utils.IsMainnet(chainID) { - strideChannelID = evmostransfertypes.StrideMainnetChannelID - } else { - strideChannelID = evmostransfertypes.StrideTestnetChannelID - } - strideOutpost, err := strideoutpost.NewPrecompile( - transfertypes.PortID, - strideChannelID, transferKeeper, erc20Keeper, authzKeeper, From f1b0beec8e33b81502e4f32b5745e20fbaa491a1 Mon Sep 17 00:00:00 2001 From: Luke Ma Date: Wed, 3 Jan 2024 19:18:39 +0800 Subject: [PATCH 048/345] imp(cli): remove ValidateBasic in cli (#2212) * remove ValidateBasic in cli * remove ValidateBasic in erc20 cli * update CHANGELOG.md --------- Co-authored-by: Vladislav Varadinov --- CHANGELOG.md | 1 + x/erc20/client/cli/tx.go | 12 ------------ x/revenue/v1/client/cli/tx.go | 12 ------------ x/vesting/client/cli/tx.go | 19 ------------------- 4 files changed, 1 insertion(+), 43 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0396923a8b..61357cc5ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -146,6 +146,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (outpost) [#2171](https://github.com/evmos/evmos/pull/2171) Add channelID selector based on the ChainID. - (db) [#2182](https://github.com/evmos/evmos/pull/2182) Bump RocksDB version to `v8.8.1`. - (api) [#2198] (https://github.com/evmos/evmos/pull/2198) Remove deprecated `RegisterCoinProposal` from store to avoid breaking the governance proposals query. +- (cli) [#2212](https://github.com/evmos/evmos/pull/2212) Remove ValidateBasic in cli. ### Bug Fixes diff --git a/x/erc20/client/cli/tx.go b/x/erc20/client/cli/tx.go index b5905f631e..c36a0e4423 100644 --- a/x/erc20/client/cli/tx.go +++ b/x/erc20/client/cli/tx.go @@ -79,10 +79,6 @@ func NewConvertERC20Cmd() *cobra.Command { Sender: from.Hex(), } - if err := msg.ValidateBasic(); err != nil { - return err - } - return tx.GenerateOrBroadcastTxCLI(cliCtx, cmd.Flags(), msg) }, } @@ -134,10 +130,6 @@ func NewRegisterERC20ProposalCmd() *cobra.Command { return err } - if err := msg.ValidateBasic(); err != nil { - return err - } - return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) }, } @@ -200,10 +192,6 @@ func NewToggleTokenConversionProposalCmd() *cobra.Command { return err } - if err := msg.ValidateBasic(); err != nil { - return err - } - return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) }, } diff --git a/x/revenue/v1/client/cli/tx.go b/x/revenue/v1/client/cli/tx.go index eef3c5f9c2..7c8fac3695 100644 --- a/x/revenue/v1/client/cli/tx.go +++ b/x/revenue/v1/client/cli/tx.go @@ -85,10 +85,6 @@ func NewRegisterRevenue() *cobra.Command { Nonces: nonces, } - if err := msg.ValidateBasic(); err != nil { - return err - } - return tx.GenerateOrBroadcastTxCLI(cliCtx, cmd.Flags(), msg) }, } @@ -123,10 +119,6 @@ func NewCancelRevenue() *cobra.Command { DeployerAddress: deployer.String(), } - if err := msg.ValidateBasic(); err != nil { - return err - } - return tx.GenerateOrBroadcastTxCLI(cliCtx, cmd.Flags(), msg) }, } @@ -167,10 +159,6 @@ func NewUpdateRevenue() *cobra.Command { WithdrawerAddress: withdrawer, } - if err := msg.ValidateBasic(); err != nil { - return err - } - return tx.GenerateOrBroadcastTxCLI(cliCtx, cmd.Flags(), msg) }, } diff --git a/x/vesting/client/cli/tx.go b/x/vesting/client/cli/tx.go index 94334517f5..aa4a683877 100644 --- a/x/vesting/client/cli/tx.go +++ b/x/vesting/client/cli/tx.go @@ -80,9 +80,6 @@ using the fund-vesting-account subcommand. Clawback via governance is enabled th } msg := types.NewMsgCreateClawbackVestingAccount(funder, clientCtx.GetFromAddress(), enableGovClawback) - if err := msg.ValidateBasic(); err != nil { - return err - } return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) }, @@ -158,9 +155,6 @@ with a start time and an array of coins strings and durations relative to the st commonStart, _ := types.AlignSchedules(lockupStart, vestingStart, lockupPeriods, vestingPeriods) msg := types.NewMsgFundVestingAccount(clientCtx.GetFromAddress(), toAddr, time.Unix(commonStart, 0), lockupPeriods, vestingPeriods) - if err := msg.ValidateBasic(); err != nil { - return err - } return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) }, @@ -203,9 +197,6 @@ func NewMsgClawbackCmd() *cobra.Command { } msg := types.NewMsgClawback(clientCtx.GetFromAddress(), addr, dest) - if err := msg.ValidateBasic(); err != nil { - return err - } return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) }, @@ -242,9 +233,6 @@ func NewMsgUpdateVestingFunderCmd() *cobra.Command { } msg := types.NewMsgUpdateVestingFunder(clientCtx.GetFromAddress(), newFunder, vestingAcc) - if err := msg.ValidateBasic(); err != nil { - return err - } return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) }, @@ -275,9 +263,6 @@ func NewMsgConvertVestingAccountCmd() *cobra.Command { } msg := types.NewMsgConvertVestingAccount(addr) - if err := msg.ValidateBasic(); err != nil { - return err - } return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) }, @@ -348,10 +333,6 @@ func NewClawbackProposalCmd() *cobra.Command { return err } - if err := msg.ValidateBasic(); err != nil { - return err - } - return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) }, } From 3771f9a19e55e37cf160bade301c1eb8a727d470 Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Wed, 3 Jan 2024 13:51:59 +0100 Subject: [PATCH 049/345] fix(swagger): update Swagger configuration (#2219) --- CHANGELOG.md | 1 + Makefile | 2 +- client/docs/config.json | 30 +- client/docs/swagger-ui/swagger.json | 76509 ++++++++++++-------------- 4 files changed, 36247 insertions(+), 40295 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 61357cc5ad..481241e9c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -147,6 +147,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (db) [#2182](https://github.com/evmos/evmos/pull/2182) Bump RocksDB version to `v8.8.1`. - (api) [#2198] (https://github.com/evmos/evmos/pull/2198) Remove deprecated `RegisterCoinProposal` from store to avoid breaking the governance proposals query. - (cli) [#2212](https://github.com/evmos/evmos/pull/2212) Remove ValidateBasic in cli. +- (swagger) [#2219](https://github.com/evmos/evmos/pull/2219) Update Swagger configuration to remove outdated entries and update vesting module version. ### Bug Fixes diff --git a/Makefile b/Makefile index 16c0e23642..2a2cd762ef 100644 --- a/Makefile +++ b/Makefile @@ -419,7 +419,7 @@ protoImage=$(DOCKER) run --rm -v $(CURDIR):/workspace --workdir /workspace --use # NOTE: If you are experiencing problems running these commands, try deleting # the docker images and execute the desired command again. # -proto-all: proto-format proto-lint proto-gen +proto-all: proto-format proto-lint proto-gen proto-swagger-gen proto-gen: @echo "Generating Protobuf files" diff --git a/client/docs/config.json b/client/docs/config.json index 8a5b7ffcc0..a0c9f6cb4c 100644 --- a/client/docs/config.json +++ b/client/docs/config.json @@ -6,14 +6,6 @@ "version": "1.0.0" }, "apis": [ - { - "url": "./tmp-swagger-gen/evmos/claims/v1/query.swagger.json", - "operationIds": { - "rename": { - "Params": "ClaimsParams" - } - } - }, { "url": "./tmp-swagger-gen/evmos/epochs/v1/query.swagger.json" }, @@ -25,14 +17,6 @@ } } }, - { - "url": "./tmp-swagger-gen/evmos/incentives/v1/query.swagger.json", - "operationIds": { - "rename": { - "Params": "IncentivesParams" - } - } - }, { "url": "./tmp-swagger-gen/evmos/inflation/v1/query.swagger.json", "operationIds": { @@ -43,24 +27,16 @@ } }, { - "url": "./tmp-swagger-gen/evmos/vesting/v1/query.swagger.json" + "url": "./tmp-swagger-gen/evmos/vesting/v2/query.swagger.json" }, { - "url": "./tmp-swagger-gen/evmos/recovery/v1/query.swagger.json", + "url": "./tmp-swagger-gen/evmos/revenue/v1/query.swagger.json", "operationIds": { "rename": { - "Params": "RecoveryParams" + "Params": "RevenueParams" } } }, - { - "url": "./tmp-swagger-gen/evmos/revenue/v1/query.swagger.json", - "operationIds": { - "rename": { - "Params": "RevenueParams" - } - } - }, { "url": "./tmp-swagger-gen/ethermint/evm/v1/query.swagger.json", "operationIds": { diff --git a/client/docs/swagger-ui/swagger.json b/client/docs/swagger-ui/swagger.json index 683a99fafc..0134fcd886 100644 --- a/client/docs/swagger-ui/swagger.json +++ b/client/docs/swagger-ui/swagger.json @@ -1,152 +1,283 @@ { - "openapi": "3.0.1", + "swagger": "2.0", "info": { "title": "Evmos Chain - gRPC Gateway docs", "description": "A REST interface for state queries and transactions", "version": "1.0.0" }, - "servers": [ - ], "paths": { - "/evmos/claims/v1/claims_records": { + "/evmos/epochs/v1/current_epoch": { "get": { + "summary": "CurrentEpoch provide current epoch of specified identifier", + "operationId": "CurrentEpoch", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "type": "object", + "properties": { + "current_epoch": { + "type": "string", + "format": "int64", + "title": "current_epoch is the number of the current epoch" + } + }, + "description": "QueryCurrentEpochResponse is the response type for the Query/EpochInfos RPC\nmethod." + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" + } + } + } + } + } + } + } + }, + "parameters": [ + { + "name": "identifier", + "description": "identifier of the current epoch.", + "in": "query", + "required": false, + "type": "string" + } + ], "tags": [ "Query" - ], - "summary": "ClaimsRecords returns all claims records", - "operationId": "ClaimsRecords", + ] + } + }, + "/evmos/epochs/v1/epochs": { + "get": { + "summary": "EpochInfos provide running epochInfos", + "operationId": "EpochInfos", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "type": "object", + "properties": { + "epochs": { + "type": "array", + "items": { + "type": "object", + "properties": { + "identifier": { + "type": "string", + "title": "identifier of the epoch" + }, + "start_time": { + "type": "string", + "format": "date-time", + "title": "start_time of the epoch" + }, + "duration": { + "type": "string", + "title": "duration of the epoch" + }, + "current_epoch": { + "type": "string", + "format": "int64", + "title": "current_epoch is the integer identifier of the epoch" + }, + "current_epoch_start_time": { + "type": "string", + "format": "date-time", + "title": "current_epoch_start_time defines the timestamp of the start of the epoch" + }, + "epoch_counting_started": { + "type": "boolean", + "title": "epoch_counting_started reflects if the counting for the epoch has started" + }, + "current_epoch_start_height": { + "type": "string", + "format": "int64", + "title": "current_epoch_start_height of the epoch" + } + }, + "description": "EpochInfo defines the message interface containing the relevant informations about\nan epoch." + }, + "title": "epochs is a slice of all EpochInfos" + }, + "pagination": { + "description": "pagination defines an optional pagination for the request.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "description": "QueryEpochsInfoResponse is the response type for the Query/EpochInfos RPC\nmethod." + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" + } + } + } + } + } + } + } + }, "parameters": [ { "name": "pagination.key", - "in": "query", "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } + "in": "query", + "required": false, + "type": "string", + "format": "byte" }, { "name": "pagination.offset", - "in": "query", "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.limit", - "in": "query", "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.count_total", - "in": "query", "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } + "in": "query", + "required": false, + "type": "boolean" }, { "name": "pagination.reverse", - "in": "query", "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } + "in": "query", + "required": false, + "type": "boolean" } ], + "tags": [ + "Query" + ] + } + }, + "/evmos/erc20/v1/params": { + "get": { + "summary": "Params retrieves the erc20 module params", + "operationId": "ERC20Params", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "params": { + "title": "params are the erc20 module parameters", "type": "object", "properties": { - "claims": { - "title": "claims defines all claims records", - "type": "array", - "items": { - "type": "object", - "properties": { - "address": { - "title": "address of claiming user in either bech32 or hex format", - "type": "string" - }, - "initial_claimable_amount": { - "title": "initial_claimable_amount for the user", - "type": "string" - }, - "actions_completed": { - "title": "actions_completed is a slice that describes which actions were completed", - "type": "array", - "items": { - "type": "boolean" - } - } - }, - "description": "ClaimsRecordAddress is the claims metadata per address that is used at\nGenesis." - } + "enable_erc20": { + "type": "boolean", + "description": "enable_erc20 is the parameter to enable the conversion of Cosmos coins <--> ERC20 tokens." }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." + "enable_evm_hook": { + "type": "boolean", + "description": "enable_evm_hook is the parameter to enable the EVM hook that converts an ERC20 token to a Cosmos\nCoin by transferring the Tokens through a MsgEthereumTx to the ModuleAddress Ethereum address." } - }, - "description": "QueryClaimsRecordsResponse is the response type for the Query/ClaimsRecords\nRPC method." + } } - } + }, + "description": "QueryParamsResponse is the response type for the Query/Params RPC\nmethod." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" } } } @@ -154,107 +285,101 @@ } } } - } + }, + "tags": [ + "Query" + ] } }, - "/evmos/claims/v1/claims_records/{address}": { + "/evmos/erc20/v1/token_pairs": { "get": { - "tags": [ - "Query" - ], - "summary": "ClaimsRecord returns the claims record for a given address", - "operationId": "ClaimsRecord", - "parameters": [ - { - "name": "address", - "in": "path", - "description": "address defines the user to query claims record for", - "required": true, - "schema": { - "type": "string" - } - } - ], + "summary": "TokenPairs retrieves registered token pairs", + "operationId": "TokenPairs", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "token_pairs": { + "type": "array", + "items": { + "type": "object", + "properties": { + "erc20_address": { + "type": "string", + "title": "erc20_address is the hex address of ERC20 contract token" + }, + "denom": { + "type": "string", + "title": "denom defines the cosmos base denomination to be mapped to" + }, + "enabled": { + "type": "boolean", + "title": "enabled defines the token mapping enable status" + }, + "contract_owner": { + "title": "contract_owner is the an ENUM specifying the type of ERC20 owner (0 invalid, 1 ModuleAccount, 2 external address)", + "type": "string", + "enum": [ + "OWNER_UNSPECIFIED", + "OWNER_MODULE", + "OWNER_EXTERNAL" + ], + "default": "OWNER_UNSPECIFIED", + "description": "Owner enumerates the ownership of a ERC20 contract.\n\n - OWNER_UNSPECIFIED: OWNER_UNSPECIFIED defines an invalid/undefined owner.\n - OWNER_MODULE: OWNER_MODULE - erc20 is owned by the erc20 module account.\n - OWNER_EXTERNAL: OWNER_EXTERNAL - erc20 is owned by an external account." + } + }, + "description": "TokenPair defines an instance that records a pairing consisting of a native\nCosmos Coin and an ERC20 token address." + }, + "title": "token_pairs is a slice of registered token pairs for the erc20 module" + }, + "pagination": { + "description": "pagination defines the pagination in the response.", "type": "object", "properties": { - "initial_claimable_amount": { - "title": "initial_claimable_amount of the user", - "type": "string" + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." }, - "claims": { - "title": "claims of the user", - "type": "array", - "items": { - "type": "object", - "properties": { - "action": { - "title": "action enum", - "type": "string", - "description": "Action defines the list of available actions to claim the airdrop tokens.\n\n - ACTION_UNSPECIFIED: ACTION_UNSPECIFIED defines an invalid action.\n - ACTION_VOTE: ACTION_VOTE defines a proposal vote.\n - ACTION_DELEGATE: ACTION_DELEGATE defines an staking delegation.\n - ACTION_EVM: ACTION_EVM defines an EVM transaction.\n - ACTION_IBC_TRANSFER: ACTION_IBC_TRANSFER defines a fungible token transfer transaction via IBC.", - "default": "ACTION_UNSPECIFIED", - "enum": [ - "ACTION_UNSPECIFIED", - "ACTION_VOTE", - "ACTION_DELEGATE", - "ACTION_EVM", - "ACTION_IBC_TRANSFER" - ] - }, - "completed": { - "title": "completed is true if the action has been completed", - "type": "boolean" - }, - "claimable_amount": { - "title": "claimable_amount of tokens for the action. Zero if completed", - "type": "string" - } - }, - "description": "Claim defines the action, completed flag and the remaining claimable amount\nfor a given user. This is only used during client queries." - } + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" } - }, - "description": "QueryClaimsRecordResponse is the response type for the Query/ClaimsRecord RPC\nmethod." + } } - } + }, + "description": "QueryTokenPairsResponse is the response type for the Query/TokenPairs RPC\nmethod." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" } } } @@ -262,102 +387,122 @@ } } } - } + }, + "parameters": [ + { + "name": "pagination.key", + "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", + "in": "query", + "required": false, + "type": "string", + "format": "byte" + }, + { + "name": "pagination.offset", + "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.limit", + "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.count_total", + "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", + "in": "query", + "required": false, + "type": "boolean" + }, + { + "name": "pagination.reverse", + "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", + "in": "query", + "required": false, + "type": "boolean" + } + ], + "tags": [ + "Query" + ] } }, - "/evmos/claims/v1/params": { + "/evmos/erc20/v1/token_pairs/{token}": { "get": { - "tags": [ - "Query" - ], - "summary": "Params returns the claims module parameters", - "operationId": "ClaimsParams", + "summary": "TokenPair retrieves a registered token pair", + "operationId": "TokenPair", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "token_pair": { "type": "object", "properties": { - "params": { - "type": "object", - "properties": { - "enable_claims": { - "title": "enable_claims is the parameter to enable the claiming process", - "type": "boolean" - }, - "airdrop_start_time": { - "title": "airdrop_start_time defines the timestamp of the airdrop start", - "type": "string", - "format": "date-time" - }, - "duration_until_decay": { - "title": "duration_until_decay of claimable tokens begin", - "type": "string" - }, - "duration_of_decay": { - "title": "duration_of_decay for token claim decay period", - "type": "string" - }, - "claims_denom": { - "title": "claims_denom is the denomination of the claimable coin", - "type": "string" - }, - "authorized_channels": { - "type": "array", - "description": "authorized_channels is the list of authorized channel identifiers that can perform address\nattestations via IBC.", - "items": { - "type": "string" - } - }, - "evm_channels": { - "title": "evm_channels is the list of channel identifiers from EVM compatible chains", - "type": "array", - "items": { - "type": "string" - } - } - }, - "description": "params defines the parameters of the module." + "erc20_address": { + "type": "string", + "title": "erc20_address is the hex address of ERC20 contract token" + }, + "denom": { + "type": "string", + "title": "denom defines the cosmos base denomination to be mapped to" + }, + "enabled": { + "type": "boolean", + "title": "enabled defines the token mapping enable status" + }, + "contract_owner": { + "title": "contract_owner is the an ENUM specifying the type of ERC20 owner (0 invalid, 1 ModuleAccount, 2 external address)", + "type": "string", + "enum": [ + "OWNER_UNSPECIFIED", + "OWNER_MODULE", + "OWNER_EXTERNAL" + ], + "default": "OWNER_UNSPECIFIED", + "description": "Owner enumerates the ownership of a ERC20 contract.\n\n - OWNER_UNSPECIFIED: OWNER_UNSPECIFIED defines an invalid/undefined owner.\n - OWNER_MODULE: OWNER_MODULE - erc20 is owned by the erc20 module account.\n - OWNER_EXTERNAL: OWNER_EXTERNAL - erc20 is owned by an external account." } }, - "description": "QueryParamsResponse is the response type for the Query/Params RPC method." + "description": "TokenPair defines an instance that records a pairing consisting of a native\nCosmos Coin and an ERC20 token address.", + "title": "token_pairs returns the info about a registered token pair for the erc20 module" } - } + }, + "description": "QueryTokenPairResponse is the response type for the Query/TokenPair RPC\nmethod." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" } } } @@ -365,77 +510,74 @@ } } } - } + }, + "parameters": [ + { + "name": "token", + "description": "token identifier can be either the hex contract address of the ERC20 or the\nCosmos base denomination", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "Query" + ] } }, - "/evmos/claims/v1/total_unclaimed": { + "/evmos/inflation/v1/circulating_supply": { "get": { - "tags": [ - "Query" - ], - "summary": "TotalUnclaimed queries the total unclaimed tokens from the airdrop", - "operationId": "TotalUnclaimed", + "summary": "CirculatingSupply retrieves the total number of tokens that are in\ncirculation (i.e. excluding unvested tokens).", + "operationId": "CirculatingSupply", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "circulating_supply": { + "title": "circulating_supply is the total amount of coins in circulation", "type": "object", "properties": { - "coins": { - "title": "coins defines the unclaimed coins", - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } + "denom": { + "type": "string" + }, + "amount": { + "type": "string" } }, - "description": "QueryTotalUnclaimedResponse is the response type for the Query/TotalUnclaimed\nRPC method." + "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." } - } + }, + "description": "QueryCirculatingSupplyResponse is the response type for the\nQuery/CirculatingSupply RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" } } } @@ -443,76 +585,64 @@ } } } - } + }, + "tags": [ + "Query" + ] } }, - "/evmos/epochs/v1/current_epoch": { + "/evmos/inflation/v1/epoch_mint_provision": { "get": { - "tags": [ - "Query" - ], - "summary": "CurrentEpoch provide current epoch of specified identifier", - "operationId": "CurrentEpoch", - "parameters": [ - { - "name": "identifier", - "in": "query", - "description": "identifier of the current epoch.", - "schema": { - "type": "string" - } - } - ], + "summary": "EpochMintProvision retrieves current minting epoch provision value.", + "operationId": "EpochMintProvision", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "epoch_mint_provision": { + "description": "epoch_mint_provision is the current minting per epoch provision value.", "type": "object", "properties": { - "current_epoch": { - "title": "current_epoch is the number of the current epoch", - "type": "string", - "format": "int64" + "denom": { + "type": "string" + }, + "amount": { + "type": "string" } - }, - "description": "QueryCurrentEpochResponse is the response type for the Query/EpochInfos RPC\nmethod." + } } - } + }, + "description": "QueryEpochMintProvisionResponse is the response type for the\nQuery/EpochMintProvision RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" } } } @@ -520,165 +650,167 @@ } } } - } + }, + "tags": [ + "Query" + ] } }, - "/evmos/epochs/v1/epochs": { + "/evmos/inflation/v1/inflation_rate": { "get": { - "tags": [ - "Query" - ], - "summary": "EpochInfos provide running epochInfos", - "operationId": "EpochInfos", - "parameters": [ - { - "name": "pagination.key", - "in": "query", - "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } - }, - { - "name": "pagination.offset", - "in": "query", - "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.limit", - "in": "query", - "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.count_total", - "in": "query", - "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", + "summary": "InflationRate retrieves the inflation rate of the current period.", + "operationId": "InflationRate", + "responses": { + "200": { + "description": "A successful response.", "schema": { - "type": "boolean" + "type": "object", + "properties": { + "inflation_rate": { + "type": "string", + "title": "inflation_rate by which the total supply increases within one period" + } + }, + "description": "QueryInflationRateResponse is the response type for the Query/InflationRate\nRPC method." } }, - { - "name": "pagination.reverse", - "in": "query", - "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", + "default": { + "description": "An unexpected error response.", "schema": { - "type": "boolean" + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" + } + } + } + } + } } } - ], + }, + "tags": [ + "Query" + ] + } + }, + "/evmos/inflation/v1/params": { + "get": { + "summary": "Params retrieves the total set of minting parameters.", + "operationId": "InflationParams", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "params": { + "description": "params defines the parameters of the module.", "type": "object", "properties": { - "epochs": { - "title": "epochs is a slice of all EpochInfos", - "type": "array", - "items": { - "type": "object", - "properties": { - "identifier": { - "title": "identifier of the epoch", - "type": "string" - }, - "start_time": { - "title": "start_time of the epoch", - "type": "string", - "format": "date-time" - }, - "duration": { - "title": "duration of the epoch", - "type": "string" - }, - "current_epoch": { - "title": "current_epoch is the integer identifier of the epoch", - "type": "string", - "format": "int64" - }, - "current_epoch_start_time": { - "title": "current_epoch_start_time defines the timestamp of the start of the epoch", - "type": "string", - "format": "date-time" - }, - "epoch_counting_started": { - "title": "epoch_counting_started reflects if the counting for the epoch has started", - "type": "boolean" - }, - "current_epoch_start_height": { - "title": "current_epoch_start_height of the epoch", - "type": "string", - "format": "int64" - } + "mint_denom": { + "type": "string", + "title": "mint_denom specifies the type of coin to mint" + }, + "exponential_calculation": { + "title": "exponential_calculation takes in the variables to calculate exponential inflation", + "type": "object", + "properties": { + "a": { + "type": "string", + "title": "a defines the initial value" }, - "description": "EpochInfo defines the message interface containing the relevant informations about\nan epoch." + "r": { + "type": "string", + "title": "r defines the reduction factor" + }, + "c": { + "type": "string", + "title": "c defines the parameter for long term inflation" + }, + "bonding_target": { + "type": "string", + "title": "bonding_target" + }, + "max_variance": { + "type": "string", + "title": "max_variance" + } } }, - "pagination": { + "inflation_distribution": { + "title": "inflation_distribution of the minted denom", "type": "object", "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "staking_rewards": { "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" + "title": "staking_rewards defines the proportion of the minted minted_denom that is\nto be allocated as staking rewards" }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", + "usage_incentives": { "type": "string", - "format": "uint64" + "title": "Deprecated: usage_incentives defines the proportion of the minted minted_denom that is\nto be allocated to the incentives module address" + }, + "community_pool": { + "type": "string", + "title": "community_pool defines the proportion of the minted minted_denom that is to\nbe allocated to the community pool" } - }, - "description": "pagination defines an optional pagination for the request." + } + }, + "enable_inflation": { + "type": "boolean", + "title": "enable_inflation is the parameter that enables inflation and halts increasing the skipped_epochs" } - }, - "description": "QueryEpochsInfoResponse is the response type for the Query/EpochInfos RPC\nmethod." + } } - } + }, + "description": "QueryParamsResponse is the response type for the Query/Params RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" } } } @@ -686,75 +818,57 @@ } } } - } + }, + "tags": [ + "Query" + ] } }, - "/evmos/erc20/v1/params": { + "/evmos/inflation/v1/period": { "get": { - "tags": [ - "Query" - ], - "summary": "Params retrieves the erc20 module params", - "operationId": "ERC20Params", + "summary": "Period retrieves current period.", + "operationId": "Period", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "params": { - "title": "params are the erc20 module parameters", - "type": "object", - "properties": { - "enable_erc20": { - "type": "boolean", - "description": "enable_erc20 is the parameter to enable the conversion of Cosmos coins <--> ERC20 tokens." - }, - "enable_evm_hook": { - "type": "boolean", - "description": "enable_evm_hook is the parameter to enable the EVM hook that converts an ERC20 token to a Cosmos\nCoin by transferring the Tokens through a MsgEthereumTx to the ModuleAddress Ethereum address." - } - } - } - }, - "description": "QueryParamsResponse is the response type for the Query/Params RPC\nmethod." + "schema": { + "type": "object", + "properties": { + "period": { + "type": "string", + "format": "uint64", + "description": "period is the current minting per epoch provision value." } - } + }, + "description": "QueryPeriodResponse is the response type for the Query/Period RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" } } } @@ -762,156 +876,158 @@ } } } - } + }, + "tags": [ + "Query" + ] } }, - "/evmos/erc20/v1/token_pairs": { + "/evmos/inflation/v1/skipped_epochs": { "get": { - "tags": [ - "Query" - ], - "summary": "TokenPairs retrieves registered token pairs", - "operationId": "TokenPairs", - "parameters": [ - { - "name": "pagination.key", - "in": "query", - "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } - }, - { - "name": "pagination.offset", - "in": "query", - "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.limit", - "in": "query", - "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.count_total", - "in": "query", - "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", + "summary": "SkippedEpochs retrieves the total number of skipped epochs.", + "operationId": "SkippedEpochs", + "responses": { + "200": { + "description": "A successful response.", "schema": { - "type": "boolean" + "type": "object", + "properties": { + "skipped_epochs": { + "type": "string", + "format": "uint64", + "description": "skipped_epochs is the number of epochs that the inflation module has been disabled." + } + }, + "description": "QuerySkippedEpochsResponse is the response type for the Query/SkippedEpochs\nRPC method." } }, - { - "name": "pagination.reverse", - "in": "query", - "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", + "default": { + "description": "An unexpected error response.", "schema": { - "type": "boolean" + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" + } + } + } + } + } } } - ], - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "token_pairs": { - "title": "token_pairs is a slice of registered token pairs for the erc20 module", - "type": "array", - "items": { - "type": "object", - "properties": { - "erc20_address": { - "title": "erc20_address is the hex address of ERC20 contract token", - "type": "string" - }, - "denom": { - "title": "denom defines the cosmos base denomination to be mapped to", - "type": "string" - }, - "enabled": { - "title": "enabled defines the token mapping enable status", - "type": "boolean" - }, - "contract_owner": { - "title": "contract_owner is the an ENUM specifying the type of ERC20 owner (0 invalid, 1 ModuleAccount, 2 external address)", - "type": "string", - "description": "Owner enumerates the ownership of a ERC20 contract.\n\n - OWNER_UNSPECIFIED: OWNER_UNSPECIFIED defines an invalid/undefined owner.\n - OWNER_MODULE: OWNER_MODULE - erc20 is owned by the erc20 module account.\n - OWNER_EXTERNAL: OWNER_EXTERNAL - erc20 is owned by an external account.", - "default": "OWNER_UNSPECIFIED", - "enum": [ - "OWNER_UNSPECIFIED", - "OWNER_MODULE", - "OWNER_EXTERNAL" - ] - } - }, - "description": "TokenPair defines an instance that records a pairing consisting of a native\n Cosmos Coin and an ERC20 token address." + }, + "tags": [ + "Query" + ] + } + }, + "/evmos/vesting/v2/balances/{address}": { + "get": { + "summary": "Balances retrieves the unvested, vested and locked tokens for a vesting account", + "operationId": "Balances", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "type": "object", + "properties": { + "locked": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" } }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "title": "locked defines the current amount of locked tokens" + }, + "unvested": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" }, - "description": "pagination defines the pagination in the response." - } + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "title": "unvested defines the current amount of unvested tokens" + }, + "vested": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." }, - "description": "QueryTokenPairsResponse is the response type for the Query/TokenPairs RPC\nmethod." + "title": "vested defines the current amount of vested tokens" } - } + }, + "description": "QueryBalancesResponse is the response type for the Query/Balances RPC\nmethod." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" } } } @@ -919,102 +1035,80 @@ } } } - } - } - }, - "/evmos/erc20/v1/token_pairs/{token}": { - "get": { - "tags": [ - "Query" - ], - "summary": "TokenPair retrieves a registered token pair", - "operationId": "TokenPair", + }, "parameters": [ { - "name": "token", + "name": "address", + "description": "address of the clawback vesting account", "in": "path", - "description": "token identifier can be either the hex contract address of the ERC20 or the\nCosmos base denomination", "required": true, - "schema": { - "type": "string" - } + "type": "string" } ], + "tags": [ + "Query" + ] + } + }, + "/evmos/revenue/v1/params": { + "get": { + "summary": "Params retrieves the revenue module params", + "operationId": "RevenueParams", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "params": { + "title": "params is the returned revenue parameter", "type": "object", "properties": { - "token_pair": { - "title": "token_pairs returns the info about a registered token pair for the erc20 module", - "type": "object", - "properties": { - "erc20_address": { - "title": "erc20_address is the hex address of ERC20 contract token", - "type": "string" - }, - "denom": { - "title": "denom defines the cosmos base denomination to be mapped to", - "type": "string" - }, - "enabled": { - "title": "enabled defines the token mapping enable status", - "type": "boolean" - }, - "contract_owner": { - "title": "contract_owner is the an ENUM specifying the type of ERC20 owner (0 invalid, 1 ModuleAccount, 2 external address)", - "type": "string", - "description": "Owner enumerates the ownership of a ERC20 contract.\n\n - OWNER_UNSPECIFIED: OWNER_UNSPECIFIED defines an invalid/undefined owner.\n - OWNER_MODULE: OWNER_MODULE - erc20 is owned by the erc20 module account.\n - OWNER_EXTERNAL: OWNER_EXTERNAL - erc20 is owned by an external account.", - "default": "OWNER_UNSPECIFIED", - "enum": [ - "OWNER_UNSPECIFIED", - "OWNER_MODULE", - "OWNER_EXTERNAL" - ] - } - }, - "description": "TokenPair defines an instance that records a pairing consisting of a native\n Cosmos Coin and an ERC20 token address." + "enable_revenue": { + "type": "boolean", + "title": "enable_revenue defines a parameter to enable the revenue module" + }, + "developer_shares": { + "type": "string", + "title": "developer_shares defines the proportion of the transaction fees to be\ndistributed to the registered contract owner" + }, + "addr_derivation_cost_create": { + "type": "string", + "format": "uint64", + "title": "addr_derivation_cost_create defines the cost of address derivation for\nverifying the contract deployer at fee registration" } - }, - "description": "QueryTokenPairResponse is the response type for the Query/TokenPair RPC\nmethod." + } } - } + }, + "description": "QueryParamsResponse is the response type for the Query/Params RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" } } } @@ -1022,139 +1116,201 @@ } } } - } + }, + "tags": [ + "Query" + ] } }, - "/evmos/incentives/v1/allocation_meters": { + "/evmos/revenue/v1/revenues": { "get": { - "tags": [ - "Query" - ], - "summary": "AllocationMeters retrieves active allocation meters for a given\ndenomination", - "operationId": "AllocationMeters", - "parameters": [ - { - "name": "pagination.key", - "in": "query", - "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } - }, - { - "name": "pagination.offset", - "in": "query", - "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", + "summary": "Revenues retrieves all registered revenues", + "operationId": "Revenues", + "responses": { + "200": { + "description": "A successful response.", "schema": { - "type": "string", - "format": "uint64" - } - }, + "type": "object", + "properties": { + "revenues": { + "type": "array", + "items": { + "type": "object", + "properties": { + "contract_address": { + "type": "string", + "title": "contract_address is the hex address of a registered contract" + }, + "deployer_address": { + "type": "string", + "title": "deployer_address is the bech32 address of message sender. It must be the same as the origin EOA\nsending the transaction which deploys the contract" + }, + "withdrawer_address": { + "type": "string", + "title": "withdrawer_address is the bech32 address of account receiving the transaction fees it defaults to\ndeployer_address" + } + }, + "title": "Revenue defines an instance that organizes fee distribution conditions for\nthe owner of a given smart contract" + }, + "title": "revenues is a slice of all stored Reveneue" + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "description": "QueryRevenuesResponse is the response type for the Query/Revenues RPC method." + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" + } + } + } + } + } + } + } + }, + "parameters": [ { - "name": "pagination.limit", + "name": "pagination.key", + "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", + "in": "query", + "required": false, + "type": "string", + "format": "byte" + }, + { + "name": "pagination.offset", + "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.limit", "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.count_total", - "in": "query", "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } + "in": "query", + "required": false, + "type": "boolean" }, { "name": "pagination.reverse", - "in": "query", "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } + "in": "query", + "required": false, + "type": "boolean" } ], + "tags": [ + "Query" + ] + } + }, + "/evmos/revenue/v1/revenues/{contract_address}": { + "get": { + "summary": "Revenue retrieves a registered revenue for a given contract address", + "operationId": "Revenue", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "revenue": { "type": "object", "properties": { - "allocation_meters": { - "title": "allocation_meters is a slice of all allocations", - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." - } + "contract_address": { + "type": "string", + "title": "contract_address is the hex address of a registered contract" }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." + "deployer_address": { + "type": "string", + "title": "deployer_address is the bech32 address of message sender. It must be the same as the origin EOA\nsending the transaction which deploys the contract" + }, + "withdrawer_address": { + "type": "string", + "title": "withdrawer_address is the bech32 address of account receiving the transaction fees it defaults to\ndeployer_address" } }, - "description": "QueryAllocationMetersResponse is the response type for the\nQuery/AllocationMeters RPC method." + "title": "Revenue defines an instance that organizes fee distribution conditions for\nthe owner of a given smart contract" } - } + }, + "description": "QueryRevenueResponse is the response type for the Query/Revenue RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" } } } @@ -1162,241 +1318,207 @@ } } } - } - } - }, - "/evmos/incentives/v1/allocation_meters/{denom}": { - "get": { - "tags": [ - "Query" - ], - "summary": "AllocationMeter retrieves a active gas meter", - "operationId": "AllocationMeter", + }, "parameters": [ { - "name": "denom", + "name": "contract_address", + "description": "contract_address of a registered contract in hex format", "in": "path", - "description": "denom is the coin denom to query an allocation meter for.", "required": true, - "schema": { - "type": "string" - } + "type": "string" } ], + "tags": [ + "Query" + ] + } + }, + "/evmos/revenue/v1/revenues/{deployer_address}": { + "get": { + "summary": "DeployerRevenues retrieves all revenues that a given deployer has\nregistered", + "operationId": "DeployerRevenues", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "allocation_meter": { - "title": "allocation_meter defines the allocation of the queried denom", - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." - } + "schema": { + "type": "object", + "properties": { + "contract_addresses": { + "type": "array", + "items": { + "type": "string" }, - "description": "QueryAllocationMeterResponse is the response type for the\nQuery/AllocationMeter RPC method." - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { + "title": "contract_addresses is the slice of registered contract addresses for a deployer" + }, + "pagination": { + "description": "pagination defines the pagination in the response.", "type": "object", "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" } } } - } + }, + "description": "QueryDeployerRevenuesResponse is the response type for the\nQuery/DeployerRevenues RPC method." } - } - } - } - }, - "/evmos/incentives/v1/gas_meters/{contract}": { - "get": { - "tags": [ - "Query" - ], - "summary": "GasMeters retrieves active gas meters for a given contract", - "operationId": "GasMeters", + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" + } + } + } + } + } + } + } + }, "parameters": [ { - "name": "contract", + "name": "deployer_address", + "description": "deployer_address in bech32 format", "in": "path", - "description": "contract is the hex contract address of a incentivized smart contract", "required": true, - "schema": { - "type": "string" - } + "type": "string" }, { "name": "pagination.key", - "in": "query", "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } + "in": "query", + "required": false, + "type": "string", + "format": "byte" }, { "name": "pagination.offset", - "in": "query", "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.limit", - "in": "query", "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.count_total", - "in": "query", "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } + "in": "query", + "required": false, + "type": "boolean" }, { "name": "pagination.reverse", - "in": "query", "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } + "in": "query", + "required": false, + "type": "boolean" } ], + "tags": [ + "Query" + ] + } + }, + "/evmos/revenue/v1/revenues/{withdrawer_address}": { + "get": { + "summary": "WithdrawerRevenues retrieves all revenues with a given withdrawer\naddress", + "operationId": "WithdrawerRevenues", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "contract_addresses": { + "type": "array", + "items": { + "type": "string" + }, + "title": "contract_addresses is the slice of registered contract addresses for a withdrawer" + }, + "pagination": { + "description": "pagination defines the pagination in the response.", "type": "object", "properties": { - "gas_meters": { - "title": "gas_meters is a slice of the gas meters for an incentivized smart contract", - "type": "array", - "items": { - "title": "GasMeter tracks the cumulative gas spent per participant in one epoch", - "type": "object", - "properties": { - "contract": { - "title": "contract is the hex address of the incentivized smart contract", - "type": "string" - }, - "participant": { - "title": "participant address that interacts with the incentive", - "type": "string" - }, - "cumulative_gas": { - "title": "cumulative_gas spent during the epoch", - "type": "string", - "format": "uint64" - } - } - } + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" } - }, - "description": "QueryGasMetersResponse is the response type for the Query/Incentives RPC\nmethod." + } } - } + }, + "description": "QueryWithdrawerRevenuesResponse is the response type for the\nQuery/WithdrawerRevenues RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" } } } @@ -1404,2598 +1526,1721 @@ } } } - } - } - }, - "/evmos/incentives/v1/gas_meters/{contract}/{participant}": { - "get": { - "tags": [ - "Query" - ], - "summary": "GasMeter retrieves a active gas meter", - "operationId": "GasMeter", + }, "parameters": [ { - "name": "contract", + "name": "withdrawer_address", + "description": "withdrawer_address in bech32 format", "in": "path", - "description": "contract is the hex contract address of a contract", "required": true, - "schema": { - "type": "string" - } + "type": "string" }, { - "name": "participant", - "in": "path", - "description": "participant is the hex address of a user", - "required": true, - "schema": { - "type": "string" - } + "name": "pagination.key", + "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", + "in": "query", + "required": false, + "type": "string", + "format": "byte" + }, + { + "name": "pagination.offset", + "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.limit", + "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.count_total", + "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", + "in": "query", + "required": false, + "type": "boolean" + }, + { + "name": "pagination.reverse", + "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", + "in": "query", + "required": false, + "type": "boolean" } ], + "tags": [ + "Query" + ] + } + }, + "/evmos/evm/v1/account/{address}": { + "get": { + "summary": "Account queries an Ethereum account.", + "operationId": "Account", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "gas_meter": { - "title": "gas_meter is a gas meter for one participant on an incentivized smart contract", - "type": "string", - "format": "uint64" - } - }, - "description": "QueryGasMeterResponse is the response type for the Query/Incentive RPC\nmethod." + "schema": { + "type": "object", + "properties": { + "balance": { + "type": "string", + "description": "balance is the balance of the EVM denomination." + }, + "code_hash": { + "type": "string", + "description": "code_hash is the hex-formatted code bytes from the EOA." + }, + "nonce": { + "type": "string", + "format": "uint64", + "description": "nonce is the account's sequence number." } - } + }, + "description": "QueryAccountResponse is the response type for the Query/Account RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/evmos/incentives/v1/incentives": { - "get": { - "tags": [ - "Query" - ], - "summary": "Incentives retrieves registered incentives", - "operationId": "Incentives", + }, "parameters": [ { - "name": "pagination.key", - "in": "query", - "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } - }, - { - "name": "pagination.offset", - "in": "query", - "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.limit", - "in": "query", - "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.count_total", - "in": "query", - "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } - }, - { - "name": "pagination.reverse", - "in": "query", - "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } + "name": "address", + "description": "address is the ethereum hex address to query the account for.", + "in": "path", + "required": true, + "type": "string" } ], + "tags": [ + "Query" + ] + } + }, + "/evmos/evm/v1/balances/{address}": { + "get": { + "summary": "Balance queries the balance of a the EVM denomination for a single\nEthAccount.", + "operationId": "Balance", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "incentives": { - "title": "incentives is a slice of all incentives", - "type": "array", - "items": { - "title": "Incentive defines an instance that organizes distribution conditions for a\ngiven smart contract", - "type": "object", - "properties": { - "contract": { - "title": "contract address of the smart contract to be incentivized", - "type": "string" - }, - "allocations": { - "title": "allocations is a slice of denoms and percentages of rewards to be allocated", - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." - } - }, - "epochs": { - "title": "epochs defines the number of remaining epochs for the incentive", - "type": "integer", - "format": "int64" - }, - "start_time": { - "title": "start_time of the incentive distribution", - "type": "string", - "format": "date-time" - }, - "total_gas": { - "title": "total_gas is the cumulative gas spent by all gas meters of the incentive during the epoch", - "type": "string", - "format": "uint64" - } - } - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QueryIncentivesResponse is the response type for the Query/Incentives RPC\nmethod." + "schema": { + "type": "object", + "properties": { + "balance": { + "type": "string", + "description": "balance is the balance of the EVM denomination." } - } + }, + "description": "QueryBalanceResponse is the response type for the Query/Balance RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/evmos/incentives/v1/incentives/{contract}": { - "get": { - "tags": [ - "Query" - ], - "summary": "Incentive retrieves a registered incentive", - "operationId": "Incentive", + }, "parameters": [ { - "name": "contract", + "name": "address", + "description": "address is the ethereum hex address to query the balance for.", "in": "path", - "description": "contract is the hex contract address of a incentivized smart contract", "required": true, - "schema": { - "type": "string" - } + "type": "string" } ], + "tags": [ + "Query" + ] + } + }, + "/evmos/evm/v1/base_fee": { + "get": { + "summary": "BaseFee queries the base fee of the parent block of the current block,\nit's similar to feemarket module's method, but also checks london hardfork status.", + "operationId": "BaseFee", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "incentive": { - "title": "Incentive defines an instance that organizes distribution conditions for a\ngiven smart contract", - "type": "object", - "properties": { - "contract": { - "title": "contract address of the smart contract to be incentivized", - "type": "string" - }, - "allocations": { - "title": "allocations is a slice of denoms and percentages of rewards to be allocated", - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." - } - }, - "epochs": { - "title": "epochs defines the number of remaining epochs for the incentive", - "type": "integer", - "format": "int64" - }, - "start_time": { - "title": "start_time of the incentive distribution", - "type": "string", - "format": "date-time" - }, - "total_gas": { - "title": "total_gas is the cumulative gas spent by all gas meters of the incentive during the epoch", - "type": "string", - "format": "uint64" - } - } - } - }, - "description": "QueryIncentiveResponse is the response type for the Query/Incentive RPC\nmethod." + "schema": { + "type": "object", + "properties": { + "base_fee": { + "type": "string", + "title": "base_fee is the EIP1559 base fee" } - } + }, + "description": "QueryBaseFeeResponse returns the EIP1559 base fee." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } + }, + "tags": [ + "Query" + ] } }, - "/evmos/incentives/v1/params": { + "/evmos/evm/v1/codes/{address}": { "get": { - "tags": [ - "Query" - ], - "summary": "Params retrieves the incentives module params", - "operationId": "IncentivesParams", + "summary": "Code queries the balance of all coins for a single account.", + "operationId": "Code", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "params": { - "title": "params are the incentives module parameters", - "type": "object", - "properties": { - "enable_incentives": { - "title": "enable_incentives is the parameter to enable incentives", - "type": "boolean" - }, - "allocation_limit": { - "title": "allocation_limit is the maximum percentage an incentive can allocate per denomination", - "type": "string" - }, - "incentives_epoch_identifier": { - "title": "incentives_epoch_identifier for the epochs module hooks", - "type": "string" - }, - "reward_scaler": { - "title": "reward_scaler is the scaling factor for capping rewards", - "type": "string" - } - } - } - }, - "description": "QueryParamsResponse is the response type for the Query/Params RPC\nmethod." + "schema": { + "type": "object", + "properties": { + "code": { + "type": "string", + "format": "byte", + "description": "code represents the code bytes from an ethereum address." } - } + }, + "description": "QueryCodeResponse is the response type for the Query/Code RPC\nmethod." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } + }, + "parameters": [ + { + "name": "address", + "description": "address is the ethereum hex address to query the code for.", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "Query" + ] } }, - "/evmos/inflation/v1/circulating_supply": { + "/evmos/evm/v1/cosmos_account/{address}": { "get": { - "tags": [ - "Query" - ], - "summary": "CirculatingSupply retrieves the total number of tokens that are in\ncirculation (i.e. excluding unvested tokens).", - "operationId": "CirculatingSupply", + "summary": "CosmosAccount queries an Ethereum account's Cosmos Address.", + "operationId": "CosmosAccount", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "circulating_supply": { - "title": "circulating_supply is the total amount of coins in circulation", - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." - } - }, - "description": "QueryCirculatingSupplyResponse is the response type for the\nQuery/CirculatingSupply RPC method." + "schema": { + "type": "object", + "properties": { + "cosmos_address": { + "type": "string", + "description": "cosmos_address is the cosmos address of the account." + }, + "sequence": { + "type": "string", + "format": "uint64", + "description": "sequence is the account's sequence number." + }, + "account_number": { + "type": "string", + "format": "uint64", + "title": "account_number is the account number" } - } + }, + "description": "QueryCosmosAccountResponse is the response type for the Query/CosmosAccount\nRPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } + }, + "parameters": [ + { + "name": "address", + "description": "address is the ethereum hex address to query the account for.", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "Query" + ] } }, - "/evmos/inflation/v1/epoch_mint_provision": { + "/evmos/evm/v1/estimate_gas": { "get": { - "tags": [ - "Query" - ], - "summary": "EpochMintProvision retrieves current minting epoch provision value.", - "operationId": "EpochMintProvision", + "summary": "EstimateGas implements the `eth_estimateGas` rpc api", + "operationId": "EstimateGas", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "epoch_mint_provision": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "epoch_mint_provision is the current minting per epoch provision value." - } - }, - "description": "QueryEpochMintProvisionResponse is the response type for the\nQuery/EpochMintProvision RPC method." + "schema": { + "type": "object", + "properties": { + "gas": { + "type": "string", + "format": "uint64", + "title": "gas returns the estimated gas" } - } + }, + "title": "EstimateGasResponse defines EstimateGas response" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } + }, + "parameters": [ + { + "name": "args", + "description": "args uses the same json format as the json rpc api.", + "in": "query", + "required": false, + "type": "string", + "format": "byte" + }, + { + "name": "gas_cap", + "description": "gas_cap defines the default gas cap to be used.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "proposer_address", + "description": "proposer_address of the requested block in hex format.", + "in": "query", + "required": false, + "type": "string", + "format": "byte" + }, + { + "name": "chain_id", + "description": "chain_id is the eip155 chain id parsed from the requested block header.", + "in": "query", + "required": false, + "type": "string", + "format": "int64" + } + ], + "tags": [ + "Query" + ] } }, - "/evmos/inflation/v1/inflation_rate": { + "/evmos/evm/v1/eth_call": { "get": { - "tags": [ - "Query" - ], - "summary": "InflationRate retrieves the inflation rate of the current period.", - "operationId": "InflationRate", + "summary": "EthCall implements the `eth_call` rpc api", + "operationId": "EthCall", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "inflation_rate": { - "title": "inflation_rate by which the total supply increases within one period", - "type": "string" - } + "schema": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "title": "hash of the ethereum transaction in hex format. This hash differs from the\nTendermint sha256 hash of the transaction bytes. See\nhttps://github.com/tendermint/tendermint/issues/6539 for reference" + }, + "logs": { + "type": "array", + "items": { + "type": "object", + "properties": { + "address": { + "type": "string", + "title": "address of the contract that generated the event" + }, + "topics": { + "type": "array", + "items": { + "type": "string" + }, + "description": "topics is a list of topics provided by the contract." + }, + "data": { + "type": "string", + "format": "byte", + "title": "data which is supplied by the contract, usually ABI-encoded" + }, + "block_number": { + "type": "string", + "format": "uint64", + "title": "block_number of the block in which the transaction was included" + }, + "tx_hash": { + "type": "string", + "title": "tx_hash is the transaction hash" + }, + "tx_index": { + "type": "string", + "format": "uint64", + "title": "tx_index of the transaction in the block" + }, + "block_hash": { + "type": "string", + "title": "block_hash of the block in which the transaction was included" + }, + "index": { + "type": "string", + "format": "uint64", + "title": "index of the log in the block" + }, + "removed": { + "type": "boolean", + "description": "removed is true if this log was reverted due to a chain\nreorganisation. You must pay attention to this field if you receive logs\nthrough a filter query." + } + }, + "description": "Log represents an protobuf compatible Ethereum Log that defines a contract\nlog event. These events are generated by the LOG opcode and stored/indexed by\nthe node.\n\nNOTE: address, topics and data are consensus fields. The rest of the fields\nare derived, i.e. filled in by the nodes, but not secured by consensus." }, - "description": "QueryInflationRateResponse is the response type for the Query/InflationRate\nRPC method." + "description": "logs contains the transaction hash and the proto-compatible ethereum\nlogs." + }, + "ret": { + "type": "string", + "format": "byte", + "title": "ret is the returned data from evm function (result or data supplied with revert\nopcode)" + }, + "vm_error": { + "type": "string", + "title": "vm_error is the error returned by vm execution" + }, + "gas_used": { + "type": "string", + "format": "uint64", + "title": "gas_used specifies how much gas was consumed by the transaction" } - } + }, + "description": "MsgEthereumTxResponse defines the Msg/EthereumTx response type." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } + }, + "parameters": [ + { + "name": "args", + "description": "args uses the same json format as the json rpc api.", + "in": "query", + "required": false, + "type": "string", + "format": "byte" + }, + { + "name": "gas_cap", + "description": "gas_cap defines the default gas cap to be used.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "proposer_address", + "description": "proposer_address of the requested block in hex format.", + "in": "query", + "required": false, + "type": "string", + "format": "byte" + }, + { + "name": "chain_id", + "description": "chain_id is the eip155 chain id parsed from the requested block header.", + "in": "query", + "required": false, + "type": "string", + "format": "int64" + } + ], + "tags": [ + "Query" + ] } }, - "/evmos/inflation/v1/params": { + "/evmos/evm/v1/params": { "get": { - "tags": [ - "Query" - ], - "summary": "Params retrieves the total set of minting parameters.", - "operationId": "InflationParams", + "summary": "Params queries the parameters of x/evm module.", + "operationId": "EvmParams", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "params": { + "description": "params define the evm module parameters.", "type": "object", "properties": { - "params": { - "type": "object", - "properties": { - "mint_denom": { - "title": "mint_denom specifies the type of coin to mint", - "type": "string" - }, - "exponential_calculation": { - "title": "exponential_calculation takes in the variables to calculate exponential inflation", - "type": "object", - "properties": { - "a": { - "title": "a defines the initial value", - "type": "string" - }, - "r": { - "title": "r defines the reduction factor", - "type": "string" - }, - "c": { - "title": "c defines the parameter for long term inflation", - "type": "string" - }, - "bonding_target": { - "title": "bonding_target", - "type": "string" - }, - "max_variance": { - "title": "max_variance", - "type": "string" - } - } + "evm_denom": { + "type": "string", + "description": "evm_denom represents the token denomination used to run the EVM state\ntransitions." + }, + "enable_create": { + "type": "boolean", + "title": "enable_create toggles state transitions that use the vm.Create function" + }, + "enable_call": { + "type": "boolean", + "title": "enable_call toggles state transitions that use the vm.Call function" + }, + "extra_eips": { + "type": "array", + "items": { + "type": "string", + "format": "int64" + }, + "title": "extra_eips defines the additional EIPs for the vm.Config" + }, + "chain_config": { + "title": "chain_config defines the EVM chain configuration parameters", + "type": "object", + "properties": { + "homestead_block": { + "type": "string", + "title": "homestead_block switch (nil no fork, 0 = already homestead)" }, - "inflation_distribution": { - "title": "inflation_distribution of the minted denom", - "type": "object", - "properties": { - "staking_rewards": { - "title": "staking_rewards defines the proportion of the minted minted_denom that is\nto be allocated as staking rewards", - "type": "string" - }, - "usage_incentives": { - "title": "usage_incentives defines the proportion of the minted minted_denom that is\nto be allocated to the incentives module address", - "type": "string" - }, - "community_pool": { - "title": "community_pool defines the proportion of the minted minted_denom that is to\nbe allocated to the community pool", - "type": "string" - } - } + "dao_fork_block": { + "type": "string", + "title": "dao_fork_block corresponds to TheDAO hard-fork switch block (nil no fork)" }, - "enable_inflation": { - "title": "enable_inflation is the parameter that enables inflation and halts increasing the skipped_epochs", - "type": "boolean" + "dao_fork_support": { + "type": "boolean", + "title": "dao_fork_support defines whether the nodes supports or opposes the DAO hard-fork" + }, + "eip150_block": { + "type": "string", + "title": "eip150_block: EIP150 implements the Gas price changes\n(https://github.com/ethereum/EIPs/issues/150) EIP150 HF block (nil no fork)" + }, + "eip150_hash": { + "type": "string", + "title": "eip150_hash: EIP150 HF hash (needed for header only clients as only gas pricing changed)" + }, + "eip155_block": { + "type": "string", + "title": "eip155_block: EIP155Block HF block" + }, + "eip158_block": { + "type": "string", + "title": "eip158_block: EIP158 HF block" + }, + "byzantium_block": { + "type": "string", + "title": "byzantium_block: Byzantium switch block (nil no fork, 0 = already on byzantium)" + }, + "constantinople_block": { + "type": "string", + "title": "constantinople_block: Constantinople switch block (nil no fork, 0 = already activated)" + }, + "petersburg_block": { + "type": "string", + "title": "petersburg_block: Petersburg switch block (nil same as Constantinople)" + }, + "istanbul_block": { + "type": "string", + "title": "istanbul_block: Istanbul switch block (nil no fork, 0 = already on istanbul)" + }, + "muir_glacier_block": { + "type": "string", + "title": "muir_glacier_block: Eip-2384 (bomb delay) switch block (nil no fork, 0 = already activated)" + }, + "berlin_block": { + "type": "string", + "title": "berlin_block: Berlin switch block (nil = no fork, 0 = already on berlin)" + }, + "london_block": { + "type": "string", + "title": "london_block: London switch block (nil = no fork, 0 = already on london)" + }, + "arrow_glacier_block": { + "type": "string", + "title": "arrow_glacier_block: Eip-4345 (bomb delay) switch block (nil = no fork, 0 = already activated)" + }, + "gray_glacier_block": { + "type": "string", + "title": "gray_glacier_block: EIP-5133 (bomb delay) switch block (nil = no fork, 0 = already activated)" + }, + "merge_netsplit_block": { + "type": "string", + "title": "merge_netsplit_block: Virtual fork after The Merge to use as a network splitter" + }, + "shanghai_block": { + "type": "string", + "title": "shanghai_block switch block (nil = no fork, 0 = already on shanghai)" + }, + "cancun_block": { + "type": "string", + "title": "cancun_block switch block (nil = no fork, 0 = already on cancun)" } }, - "description": "params defines the parameters of the module." + "description": "ChainConfig defines the Ethereum ChainConfig parameters using *sdk.Int values\ninstead of *big.Int." + }, + "allow_unprotected_txs": { + "type": "boolean", + "description": "allow_unprotected_txs defines if replay-protected (i.e non EIP155\nsigned) transactions can be executed on the state machine." + }, + "active_precompiles": { + "type": "array", + "items": { + "type": "string" + }, + "title": "active_precompiles defines the slice of hex addresses of the precompiled\ncontracts that are active" + }, + "evm_channels": { + "type": "array", + "items": { + "type": "string" + }, + "title": "evm_channels is the list of channel identifiers from EVM compatible chains" } }, - "description": "QueryParamsResponse is the response type for the Query/Params RPC method." + "title": "Params defines the EVM module parameters" } - } + }, + "description": "QueryParamsResponse defines the response type for querying x/evm parameters." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } + }, + "tags": [ + "Query" + ] } }, - "/evmos/inflation/v1/period": { + "/evmos/evm/v1/storage/{address}/{key}": { "get": { - "tags": [ - "Query" - ], - "summary": "Period retrieves current period.", - "operationId": "Period", + "summary": "Storage queries the balance of all coins for a single account.", + "operationId": "Storage", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "period": { - "type": "string", - "description": "period is the current minting per epoch provision value.", - "format": "uint64" - } - }, - "description": "QueryPeriodResponse is the response type for the Query/Period RPC method." + "schema": { + "type": "object", + "properties": { + "value": { + "type": "string", + "description": "value defines the storage state value hash associated with the given key." } - } + }, + "description": "QueryStorageResponse is the response type for the Query/Storage RPC\nmethod." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } + }, + "parameters": [ + { + "name": "address", + "description": "address is the ethereum hex address to query the storage state for.", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "key", + "description": "key defines the key of the storage state", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "Query" + ] } }, - "/evmos/inflation/v1/skipped_epochs": { + "/evmos/evm/v1/trace_block": { "get": { - "tags": [ - "Query" - ], - "summary": "SkippedEpochs retrieves the total number of skipped epochs.", - "operationId": "SkippedEpochs", + "summary": "TraceBlock implements the `debug_traceBlockByNumber` and `debug_traceBlockByHash` rpc api", + "operationId": "TraceBlock", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "skipped_epochs": { - "type": "string", - "description": "skipped_epochs is the number of epochs that the inflation module has been disabled.", - "format": "uint64" - } - }, - "description": "QuerySkippedEpochsResponse is the response type for the Query/SkippedEpochs\nRPC method." + "schema": { + "type": "object", + "properties": { + "data": { + "type": "string", + "format": "byte", + "title": "data is the response serialized in bytes" } - } + }, + "title": "QueryTraceBlockResponse defines TraceBlock response" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/evmos/vesting/v1/balances/{address}": { - "get": { - "tags": [ - "Query" - ], - "summary": "Balances retrieves the unvested, vested and locked tokens for a vesting account", - "operationId": "Balances", + }, "parameters": [ { - "name": "address", - "in": "path", - "description": "address of the clawback vesting account", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "locked": { - "title": "locked defines the current amount of locked tokens", - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "unvested": { - "title": "unvested defines the current amount of unvested tokens", - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "vested": { - "title": "vested defines the current amount of vested tokens", - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - } - }, - "description": "QueryBalancesResponse is the response type for the Query/Balances RPC\nmethod." - } - } - } + "name": "trace_config.tracer", + "description": "tracer is a custom javascript tracer.", + "in": "query", + "required": false, + "type": "string" }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - } - } - } - } - } - } - } - }, - "/evmos/recovery/v1/params": { - "get": { - "tags": [ - "Query" - ], - "summary": "Params retrieves the total set of recovery parameters.", - "operationId": "RecoveryParams", - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "params": { - "title": "Params holds parameters for the recovery module", - "type": "object", - "properties": { - "enable_recovery": { - "title": "enable_recovery IBC middleware", - "type": "boolean" - }, - "packet_timeout_duration": { - "title": "packet_timeout_duration is the duration added to timeout timestamp for balances recovered via IBC packets", - "type": "string" - } - }, - "description": "params defines the parameters of the module." - } - }, - "description": "QueryParamsResponse is the response type for the Query/Params RPC method." - } - } - } + { + "name": "trace_config.timeout", + "description": "timeout overrides the default timeout of 5 seconds for JavaScript-based tracing\ncalls.", + "in": "query", + "required": false, + "type": "string" }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - } - } - } - } - } - } - } - }, - "/evmos/revenue/v1/params": { - "get": { - "tags": [ - "Query" - ], - "summary": "Params retrieves the revenue module params", - "operationId": "RevenueParams", - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "params": { - "title": "params is the returned revenue parameter", - "type": "object", - "properties": { - "enable_revenue": { - "title": "enable_revenue defines a parameter to enable the revenue module", - "type": "boolean" - }, - "developer_shares": { - "title": "developer_shares defines the proportion of the transaction fees to be\ndistributed to the registered contract owner", - "type": "string" - }, - "addr_derivation_cost_create": { - "title": "addr_derivation_cost_create defines the cost of address derivation for\nverifying the contract deployer at fee registration", - "type": "string", - "format": "uint64" - } - } - } - }, - "description": "QueryParamsResponse is the response type for the Query/Params RPC method." - } - } - } + { + "name": "trace_config.reexec", + "description": "reexec defines the number of blocks the tracer is willing to go back.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - } - } - } - } - } - } - } - }, - "/evmos/revenue/v1/revenues": { - "get": { - "tags": [ - "Query" - ], - "summary": "Revenues retrieves all registered revenues", - "operationId": "Revenues", - "parameters": [ { - "name": "pagination.key", + "name": "trace_config.disable_stack", + "description": "disable_stack switches stack capture.", "in": "query", - "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } + "required": false, + "type": "boolean" }, { - "name": "pagination.offset", + "name": "trace_config.disable_storage", + "description": "disable_storage switches storage capture.", "in": "query", - "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } + "required": false, + "type": "boolean" }, { - "name": "pagination.limit", + "name": "trace_config.debug", + "description": "debug can be used to print output during capture end.", "in": "query", - "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } + "required": false, + "type": "boolean" }, { - "name": "pagination.count_total", + "name": "trace_config.limit", + "description": "limit defines the maximum length of output, but zero means unlimited.", "in": "query", - "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } + "required": false, + "type": "integer", + "format": "int32" }, { - "name": "pagination.reverse", + "name": "trace_config.overrides.homestead_block", + "description": "homestead_block switch (nil no fork, 0 = already homestead).", "in": "query", - "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } - } - ], - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "revenues": { - "title": "revenues is a slice of all stored Reveneue", - "type": "array", - "items": { - "title": "Revenue defines an instance that organizes fee distribution conditions for\nthe owner of a given smart contract", - "type": "object", - "properties": { - "contract_address": { - "title": "contract_address is the hex address of a registered contract", - "type": "string" - }, - "deployer_address": { - "title": "deployer_address is the bech32 address of message sender. It must be the same as the origin EOA\nsending the transaction which deploys the contract", - "type": "string" - }, - "withdrawer_address": { - "title": "withdrawer_address is the bech32 address of account receiving the transaction fees it defaults to\ndeployer_address", - "type": "string" - } - } - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QueryRevenuesResponse is the response type for the Query/Revenues RPC method." - } - } - } + "required": false, + "type": "string" }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - } - } - } - } - } - } - } - }, - "/evmos/revenue/v1/revenues/{contract_address}": { - "get": { - "tags": [ - "Query" - ], - "summary": "Revenue retrieves a registered revenue for a given contract address", - "operationId": "Revenue", - "parameters": [ { - "name": "contract_address", - "in": "path", - "description": "contract_address of a registered contract in hex format", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "revenue": { - "title": "Revenue defines an instance that organizes fee distribution conditions for\nthe owner of a given smart contract", - "type": "object", - "properties": { - "contract_address": { - "title": "contract_address is the hex address of a registered contract", - "type": "string" - }, - "deployer_address": { - "title": "deployer_address is the bech32 address of message sender. It must be the same as the origin EOA\nsending the transaction which deploys the contract", - "type": "string" - }, - "withdrawer_address": { - "title": "withdrawer_address is the bech32 address of account receiving the transaction fees it defaults to\ndeployer_address", - "type": "string" - } - } - } - }, - "description": "QueryRevenueResponse is the response type for the Query/Revenue RPC method." - } - } - } + "name": "trace_config.overrides.dao_fork_block", + "description": "dao_fork_block corresponds to TheDAO hard-fork switch block (nil no fork).", + "in": "query", + "required": false, + "type": "string" }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - } - } - } - } - } - } - } - }, - "/evmos/revenue/v1/revenues/{deployer_address}": { - "get": { - "tags": [ - "Query" - ], - "summary": "DeployerRevenues retrieves all revenues that a given deployer has\nregistered", - "operationId": "DeployerRevenues", - "parameters": [ { - "name": "deployer_address", - "in": "path", - "description": "deployer_address in bech32 format", - "required": true, - "schema": { - "type": "string" - } + "name": "trace_config.overrides.dao_fork_support", + "description": "dao_fork_support defines whether the nodes supports or opposes the DAO hard-fork.", + "in": "query", + "required": false, + "type": "boolean" }, { - "name": "pagination.key", + "name": "trace_config.overrides.eip150_block", + "description": "eip150_block: EIP150 implements the Gas price changes\n(https://github.com/ethereum/EIPs/issues/150) EIP150 HF block (nil no fork).", "in": "query", - "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } + "required": false, + "type": "string" }, { - "name": "pagination.offset", + "name": "trace_config.overrides.eip150_hash", + "description": "eip150_hash: EIP150 HF hash (needed for header only clients as only gas pricing changed).", "in": "query", - "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } + "required": false, + "type": "string" }, { - "name": "pagination.limit", + "name": "trace_config.overrides.eip155_block", + "description": "eip155_block: EIP155Block HF block.", "in": "query", - "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } + "required": false, + "type": "string" }, { - "name": "pagination.count_total", + "name": "trace_config.overrides.eip158_block", + "description": "eip158_block: EIP158 HF block.", "in": "query", - "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } + "required": false, + "type": "string" }, { - "name": "pagination.reverse", + "name": "trace_config.overrides.byzantium_block", + "description": "byzantium_block: Byzantium switch block (nil no fork, 0 = already on byzantium).", "in": "query", - "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } - } - ], - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "contract_addresses": { - "title": "contract_addresses is the slice of registered contract addresses for a deployer", - "type": "array", - "items": { - "type": "string" - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QueryDeployerRevenuesResponse is the response type for the\nQuery/DeployerRevenues RPC method." - } - } - } + "required": false, + "type": "string" }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - } - } - } - } - } - } - } - }, - "/evmos/revenue/v1/revenues/{withdrawer_address}": { - "get": { - "tags": [ - "Query" - ], - "summary": "WithdrawerRevenues retrieves all revenues with a given withdrawer\naddress", - "operationId": "WithdrawerRevenues", - "parameters": [ { - "name": "withdrawer_address", - "in": "path", - "description": "withdrawer_address in bech32 format", - "required": true, - "schema": { - "type": "string" - } + "name": "trace_config.overrides.constantinople_block", + "description": "constantinople_block: Constantinople switch block (nil no fork, 0 = already activated).", + "in": "query", + "required": false, + "type": "string" }, { - "name": "pagination.key", + "name": "trace_config.overrides.petersburg_block", + "description": "petersburg_block: Petersburg switch block (nil same as Constantinople).", "in": "query", - "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } + "required": false, + "type": "string" }, { - "name": "pagination.offset", + "name": "trace_config.overrides.istanbul_block", + "description": "istanbul_block: Istanbul switch block (nil no fork, 0 = already on istanbul).", "in": "query", - "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } + "required": false, + "type": "string" }, { - "name": "pagination.limit", + "name": "trace_config.overrides.muir_glacier_block", + "description": "muir_glacier_block: Eip-2384 (bomb delay) switch block (nil no fork, 0 = already activated).", "in": "query", - "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } + "required": false, + "type": "string" }, { - "name": "pagination.count_total", + "name": "trace_config.overrides.berlin_block", + "description": "berlin_block: Berlin switch block (nil = no fork, 0 = already on berlin).", "in": "query", - "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } + "required": false, + "type": "string" }, { - "name": "pagination.reverse", + "name": "trace_config.overrides.london_block", + "description": "london_block: London switch block (nil = no fork, 0 = already on london).", "in": "query", - "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } + "required": false, + "type": "string" + }, + { + "name": "trace_config.overrides.arrow_glacier_block", + "description": "arrow_glacier_block: Eip-4345 (bomb delay) switch block (nil = no fork, 0 = already activated).", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "trace_config.overrides.gray_glacier_block", + "description": "gray_glacier_block: EIP-5133 (bomb delay) switch block (nil = no fork, 0 = already activated).", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "trace_config.overrides.merge_netsplit_block", + "description": "merge_netsplit_block: Virtual fork after The Merge to use as a network splitter.", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "trace_config.overrides.shanghai_block", + "description": "shanghai_block switch block (nil = no fork, 0 = already on shanghai).", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "trace_config.overrides.cancun_block", + "description": "cancun_block switch block (nil = no fork, 0 = already on cancun).", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "trace_config.enable_memory", + "description": "enable_memory switches memory capture.", + "in": "query", + "required": false, + "type": "boolean" + }, + { + "name": "trace_config.enable_return_data", + "description": "enable_return_data switches the capture of return data.", + "in": "query", + "required": false, + "type": "boolean" + }, + { + "name": "trace_config.tracer_json_config", + "description": "tracer_json_config configures the tracer using a JSON string.", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "block_number", + "description": "block_number of the traced block.", + "in": "query", + "required": false, + "type": "string", + "format": "int64" + }, + { + "name": "block_hash", + "description": "block_hash (hex) of the traced block.", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "block_time", + "description": "block_time of the traced block.", + "in": "query", + "required": false, + "type": "string", + "format": "date-time" + }, + { + "name": "proposer_address", + "description": "proposer_address is the address of the requested block.", + "in": "query", + "required": false, + "type": "string", + "format": "byte" + }, + { + "name": "chain_id", + "description": "chain_id is the eip155 chain id parsed from the requested block header.", + "in": "query", + "required": false, + "type": "string", + "format": "int64" + }, + { + "name": "block_max_gas", + "description": "block_max_gas of the traced block.", + "in": "query", + "required": false, + "type": "string", + "format": "int64" } ], + "tags": [ + "Query" + ] + } + }, + "/evmos/evm/v1/trace_tx": { + "get": { + "summary": "TraceTx implements the `debug_traceTransaction` rpc api", + "operationId": "TraceTx", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "contract_addresses": { - "title": "contract_addresses is the slice of registered contract addresses for a withdrawer", - "type": "array", - "items": { - "type": "string" - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QueryWithdrawerRevenuesResponse is the response type for the\nQuery/WithdrawerRevenues RPC method." + "schema": { + "type": "object", + "properties": { + "data": { + "type": "string", + "format": "byte", + "title": "data is the response serialized in bytes" } - } + }, + "title": "QueryTraceTxResponse defines TraceTx response" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/evmos/evm/v1/account/{address}": { - "get": { - "tags": [ - "Query" - ], - "summary": "Account queries an Ethereum account.", - "operationId": "Account", + }, "parameters": [ { - "name": "address", - "in": "path", - "description": "address is the ethereum hex address to query the account for.", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "balance": { - "type": "string", - "description": "balance is the balance of the EVM denomination." - }, - "code_hash": { - "type": "string", - "description": "code_hash is the hex-formatted code bytes from the EOA." - }, - "nonce": { - "type": "string", - "description": "nonce is the account's sequence number.", - "format": "uint64" - } - }, - "description": "QueryAccountResponse is the response type for the Query/Account RPC method." - } - } - } + "name": "msg.data.type_url", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics.", + "in": "query", + "required": false, + "type": "string" }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - } - } - } - } - } - } - } - }, - "/evmos/evm/v1/balances/{address}": { - "get": { - "tags": [ - "Query" - ], - "summary": "Balance queries the balance of a the EVM denomination for a single\nEthAccount.", - "operationId": "Balance", - "parameters": [ { - "name": "address", - "in": "path", - "description": "address is the ethereum hex address to query the balance for.", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "balance": { - "type": "string", - "description": "balance is the balance of the EVM denomination." - } - }, - "description": "QueryBalanceResponse is the response type for the Query/Balance RPC method." - } - } - } + "name": "msg.data.value", + "description": "Must be a valid serialized protocol buffer of the above specified type.", + "in": "query", + "required": false, + "type": "string", + "format": "byte" }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - } - } - } - } - } - } - } - }, - "/evmos/evm/v1/base_fee": { - "get": { - "tags": [ - "Query" - ], - "summary": "BaseFee queries the base fee of the parent block of the current block,\nit's similar to feemarket module's method, but also checks london hardfork status.", - "operationId": "BaseFee", - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "base_fee": { - "title": "base_fee is the EIP1559 base fee", - "type": "string" - } - }, - "description": "QueryBaseFeeResponse returns the EIP1559 base fee." - } - } - } + { + "name": "msg.size", + "description": "size is the encoded storage size of the transaction (DEPRECATED).", + "in": "query", + "required": false, + "type": "number", + "format": "double" }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - } - } - } - } - } - } - } - }, - "/evmos/evm/v1/codes/{address}": { - "get": { - "tags": [ - "Query" - ], - "summary": "Code queries the balance of all coins for a single account.", - "operationId": "Code", - "parameters": [ { - "name": "address", - "in": "path", - "description": "address is the ethereum hex address to query the code for.", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "code": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "code represents the code bytes from an ethereum address.", - "format": "byte" - } - }, - "description": "QueryCodeResponse is the response type for the Query/Code RPC\nmethod." - } - } - } + "name": "msg.hash", + "description": "hash of the transaction in hex format.", + "in": "query", + "required": false, + "type": "string" }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - } - } - } - } - } - } - } - }, - "/evmos/evm/v1/cosmos_account/{address}": { - "get": { - "tags": [ - "Query" - ], - "summary": "CosmosAccount queries an Ethereum account's Cosmos Address.", - "operationId": "CosmosAccount", - "parameters": [ { - "name": "address", - "in": "path", - "description": "address is the ethereum hex address to query the account for.", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "cosmos_address": { - "type": "string", - "description": "cosmos_address is the cosmos address of the account." - }, - "sequence": { - "type": "string", - "description": "sequence is the account's sequence number.", - "format": "uint64" - }, - "account_number": { - "title": "account_number is the account number", - "type": "string", - "format": "uint64" - } - }, - "description": "QueryCosmosAccountResponse is the response type for the Query/CosmosAccount\nRPC method." - } - } - } + "name": "msg.from", + "description": "from is the ethereum signer address in hex format. This address value is checked\nagainst the address derived from the signature (V, R, S) using the\nsecp256k1 elliptic curve.", + "in": "query", + "required": false, + "type": "string" }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - } - } - } - } - } - } - } - }, - "/evmos/evm/v1/estimate_gas": { - "get": { - "tags": [ - "Query" - ], - "summary": "EstimateGas implements the `eth_estimateGas` rpc api", - "operationId": "EstimateGas", - "parameters": [ { - "name": "args", + "name": "trace_config.tracer", + "description": "tracer is a custom javascript tracer.", "in": "query", - "description": "args uses the same json format as the json rpc api.", - "schema": { - "type": "string", - "format": "byte" - } + "required": false, + "type": "string" }, { - "name": "gas_cap", + "name": "trace_config.timeout", + "description": "timeout overrides the default timeout of 5 seconds for JavaScript-based tracing\ncalls.", "in": "query", - "description": "gas_cap defines the default gas cap to be used.", - "schema": { - "type": "string", - "format": "uint64" - } + "required": false, + "type": "string" }, { - "name": "proposer_address", + "name": "trace_config.reexec", + "description": "reexec defines the number of blocks the tracer is willing to go back.", "in": "query", - "description": "proposer_address of the requested block in hex format.", - "schema": { - "type": "string", - "format": "byte" - } + "required": false, + "type": "string", + "format": "uint64" }, { - "name": "chain_id", + "name": "trace_config.disable_stack", + "description": "disable_stack switches stack capture.", "in": "query", - "description": "chain_id is the eip155 chain id parsed from the requested block header.", - "schema": { - "type": "string", - "format": "int64" - } - } - ], - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "title": "EstimateGasResponse defines EstimateGas response", - "type": "object", - "properties": { - "gas": { - "title": "gas returns the estimated gas", - "type": "string", - "format": "uint64" - } - } - } - } - } + "required": false, + "type": "boolean" }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - } - } - } - } - } - } - } - }, - "/evmos/evm/v1/eth_call": { - "get": { - "tags": [ - "Query" - ], - "summary": "EthCall implements the `eth_call` rpc api", - "operationId": "EthCall", - "parameters": [ { - "name": "args", + "name": "trace_config.disable_storage", + "description": "disable_storage switches storage capture.", "in": "query", - "description": "args uses the same json format as the json rpc api.", - "schema": { - "type": "string", - "format": "byte" - } + "required": false, + "type": "boolean" }, { - "name": "gas_cap", + "name": "trace_config.debug", + "description": "debug can be used to print output during capture end.", "in": "query", - "description": "gas_cap defines the default gas cap to be used.", - "schema": { - "type": "string", - "format": "uint64" - } + "required": false, + "type": "boolean" + }, + { + "name": "trace_config.limit", + "description": "limit defines the maximum length of output, but zero means unlimited.", + "in": "query", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "trace_config.overrides.homestead_block", + "description": "homestead_block switch (nil no fork, 0 = already homestead).", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "trace_config.overrides.dao_fork_block", + "description": "dao_fork_block corresponds to TheDAO hard-fork switch block (nil no fork).", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "trace_config.overrides.dao_fork_support", + "description": "dao_fork_support defines whether the nodes supports or opposes the DAO hard-fork.", + "in": "query", + "required": false, + "type": "boolean" + }, + { + "name": "trace_config.overrides.eip150_block", + "description": "eip150_block: EIP150 implements the Gas price changes\n(https://github.com/ethereum/EIPs/issues/150) EIP150 HF block (nil no fork).", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "trace_config.overrides.eip150_hash", + "description": "eip150_hash: EIP150 HF hash (needed for header only clients as only gas pricing changed).", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "trace_config.overrides.eip155_block", + "description": "eip155_block: EIP155Block HF block.", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "trace_config.overrides.eip158_block", + "description": "eip158_block: EIP158 HF block.", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "trace_config.overrides.byzantium_block", + "description": "byzantium_block: Byzantium switch block (nil no fork, 0 = already on byzantium).", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "trace_config.overrides.constantinople_block", + "description": "constantinople_block: Constantinople switch block (nil no fork, 0 = already activated).", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "trace_config.overrides.petersburg_block", + "description": "petersburg_block: Petersburg switch block (nil same as Constantinople).", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "trace_config.overrides.istanbul_block", + "description": "istanbul_block: Istanbul switch block (nil no fork, 0 = already on istanbul).", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "trace_config.overrides.muir_glacier_block", + "description": "muir_glacier_block: Eip-2384 (bomb delay) switch block (nil no fork, 0 = already activated).", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "trace_config.overrides.berlin_block", + "description": "berlin_block: Berlin switch block (nil = no fork, 0 = already on berlin).", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "trace_config.overrides.london_block", + "description": "london_block: London switch block (nil = no fork, 0 = already on london).", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "trace_config.overrides.arrow_glacier_block", + "description": "arrow_glacier_block: Eip-4345 (bomb delay) switch block (nil = no fork, 0 = already activated).", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "trace_config.overrides.gray_glacier_block", + "description": "gray_glacier_block: EIP-5133 (bomb delay) switch block (nil = no fork, 0 = already activated).", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "trace_config.overrides.merge_netsplit_block", + "description": "merge_netsplit_block: Virtual fork after The Merge to use as a network splitter.", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "trace_config.overrides.shanghai_block", + "description": "shanghai_block switch block (nil = no fork, 0 = already on shanghai).", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "trace_config.overrides.cancun_block", + "description": "cancun_block switch block (nil = no fork, 0 = already on cancun).", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "trace_config.enable_memory", + "description": "enable_memory switches memory capture.", + "in": "query", + "required": false, + "type": "boolean" + }, + { + "name": "trace_config.enable_return_data", + "description": "enable_return_data switches the capture of return data.", + "in": "query", + "required": false, + "type": "boolean" + }, + { + "name": "trace_config.tracer_json_config", + "description": "tracer_json_config configures the tracer using a JSON string.", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "block_number", + "description": "block_number of requested transaction.", + "in": "query", + "required": false, + "type": "string", + "format": "int64" + }, + { + "name": "block_hash", + "description": "block_hash of requested transaction.", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "block_time", + "description": "block_time of requested transaction.", + "in": "query", + "required": false, + "type": "string", + "format": "date-time" }, { "name": "proposer_address", + "description": "proposer_address is the proposer of the requested block.", "in": "query", - "description": "proposer_address of the requested block in hex format.", - "schema": { - "type": "string", - "format": "byte" - } + "required": false, + "type": "string", + "format": "byte" }, { "name": "chain_id", + "description": "chain_id is the the eip155 chain id parsed from the requested block header.", "in": "query", - "description": "chain_id is the eip155 chain id parsed from the requested block header.", - "schema": { - "type": "string", - "format": "int64" - } + "required": false, + "type": "string", + "format": "int64" + }, + { + "name": "block_max_gas", + "description": "block_max_gas of the block of the requested transaction.", + "in": "query", + "required": false, + "type": "string", + "format": "int64" } ], + "tags": [ + "Query" + ] + } + }, + "/evmos/evm/v1/validator_account/{cons_address}": { + "get": { + "summary": "ValidatorAccount queries an Ethereum account's from a validator consensus\nAddress.", + "operationId": "ValidatorAccount", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "hash": { - "title": "hash of the ethereum transaction in hex format. This hash differs from the\nTendermint sha256 hash of the transaction bytes. See\nhttps://github.com/tendermint/tendermint/issues/6539 for reference", - "type": "string" - }, - "logs": { - "type": "array", - "description": "logs contains the transaction hash and the proto-compatible ethereum\nlogs.", - "items": { - "type": "object", - "properties": { - "address": { - "title": "address of the contract that generated the event", - "type": "string" - }, - "topics": { - "type": "array", - "description": "topics is a list of topics provided by the contract.", - "items": { - "type": "string" - } - }, - "data": { - "title": "data which is supplied by the contract, usually ABI-encoded", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "block_number": { - "title": "block_number of the block in which the transaction was included", - "type": "string", - "format": "uint64" - }, - "tx_hash": { - "title": "tx_hash is the transaction hash", - "type": "string" - }, - "tx_index": { - "title": "tx_index of the transaction in the block", - "type": "string", - "format": "uint64" - }, - "block_hash": { - "title": "block_hash of the block in which the transaction was included", - "type": "string" - }, - "index": { - "title": "index of the log in the block", - "type": "string", - "format": "uint64" - }, - "removed": { - "type": "boolean", - "description": "removed is true if this log was reverted due to a chain\nreorganisation. You must pay attention to this field if you receive logs\nthrough a filter query." - } - }, - "description": "Log represents an protobuf compatible Ethereum Log that defines a contract\nlog event. These events are generated by the LOG opcode and stored/indexed by\nthe node.\n\nNOTE: address, topics and data are consensus fields. The rest of the fields\nare derived, i.e. filled in by the nodes, but not secured by consensus." - } - }, - "ret": { - "title": "ret is the returned data from evm function (result or data supplied with revert\nopcode)", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "vm_error": { - "title": "vm_error is the error returned by vm execution", - "type": "string" - }, - "gas_used": { - "title": "gas_used specifies how much gas was consumed by the transaction", - "type": "string", - "format": "uint64" - } - }, - "description": "MsgEthereumTxResponse defines the Msg/EthereumTx response type." + "schema": { + "type": "object", + "properties": { + "account_address": { + "type": "string", + "description": "account_address is the cosmos address of the account in bech32 format." + }, + "sequence": { + "type": "string", + "format": "uint64", + "description": "sequence is the account's sequence number." + }, + "account_number": { + "type": "string", + "format": "uint64", + "title": "account_number is the account number" } - } + }, + "description": "QueryValidatorAccountResponse is the response type for the\nQuery/ValidatorAccount RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } + }, + "parameters": [ + { + "name": "cons_address", + "description": "cons_address is the validator cons address to query the account for.", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "Query" + ] } }, - "/evmos/evm/v1/params": { + "/evmos/feemarket/v1/base_fee": { "get": { - "tags": [ - "Query" - ], - "summary": "Params queries the parameters of x/evm module.", - "operationId": "EvmParams", + "summary": "BaseFee queries the base fee of the parent block of the current block.", + "operationId": "FeeMarketBaseFee", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "params": { - "title": "Params defines the EVM module parameters", - "type": "object", - "properties": { - "evm_denom": { - "type": "string", - "description": "evm_denom represents the token denomination used to run the EVM state\ntransitions." - }, - "enable_create": { - "title": "enable_create toggles state transitions that use the vm.Create function", - "type": "boolean" - }, - "enable_call": { - "title": "enable_call toggles state transitions that use the vm.Call function", - "type": "boolean" - }, - "extra_eips": { - "title": "extra_eips defines the additional EIPs for the vm.Config", - "type": "array", - "items": { - "type": "string", - "format": "int64" - } - }, - "chain_config": { - "title": "chain_config defines the EVM chain configuration parameters", - "type": "object", - "properties": { - "homestead_block": { - "title": "homestead_block switch (nil no fork, 0 = already homestead)", - "type": "string" - }, - "dao_fork_block": { - "title": "dao_fork_block corresponds to TheDAO hard-fork switch block (nil no fork)", - "type": "string" - }, - "dao_fork_support": { - "title": "dao_fork_support defines whether the nodes supports or opposes the DAO hard-fork", - "type": "boolean" - }, - "eip150_block": { - "title": "eip150_block: EIP150 implements the Gas price changes\n(https://github.com/ethereum/EIPs/issues/150) EIP150 HF block (nil no fork)", - "type": "string" - }, - "eip150_hash": { - "title": "eip150_hash: EIP150 HF hash (needed for header only clients as only gas pricing changed)", - "type": "string" - }, - "eip155_block": { - "title": "eip155_block: EIP155Block HF block", - "type": "string" - }, - "eip158_block": { - "title": "eip158_block: EIP158 HF block", - "type": "string" - }, - "byzantium_block": { - "title": "byzantium_block: Byzantium switch block (nil no fork, 0 = already on byzantium)", - "type": "string" - }, - "constantinople_block": { - "title": "constantinople_block: Constantinople switch block (nil no fork, 0 = already activated)", - "type": "string" - }, - "petersburg_block": { - "title": "petersburg_block: Petersburg switch block (nil same as Constantinople)", - "type": "string" - }, - "istanbul_block": { - "title": "istanbul_block: Istanbul switch block (nil no fork, 0 = already on istanbul)", - "type": "string" - }, - "muir_glacier_block": { - "title": "muir_glacier_block: Eip-2384 (bomb delay) switch block (nil no fork, 0 = already activated)", - "type": "string" - }, - "berlin_block": { - "title": "berlin_block: Berlin switch block (nil = no fork, 0 = already on berlin)", - "type": "string" - }, - "london_block": { - "title": "london_block: London switch block (nil = no fork, 0 = already on london)", - "type": "string" - }, - "arrow_glacier_block": { - "title": "arrow_glacier_block: Eip-4345 (bomb delay) switch block (nil = no fork, 0 = already activated)", - "type": "string" - }, - "gray_glacier_block": { - "title": "gray_glacier_block: EIP-5133 (bomb delay) switch block (nil = no fork, 0 = already activated)", - "type": "string" - }, - "merge_netsplit_block": { - "title": "merge_netsplit_block: Virtual fork after The Merge to use as a network splitter", - "type": "string" - }, - "shanghai_block": { - "title": "shanghai_block switch block (nil = no fork, 0 = already on shanghai)", - "type": "string" - }, - "cancun_block": { - "title": "cancun_block switch block (nil = no fork, 0 = already on cancun)", - "type": "string" - } - }, - "description": "ChainConfig defines the Ethereum ChainConfig parameters using *sdk.Int values\ninstead of *big.Int." - }, - "allow_unprotected_txs": { - "type": "boolean", - "description": "allow_unprotected_txs defines if replay-protected (i.e non EIP155\nsigned) transactions can be executed on the state machine." - }, - "active_precompiles": { - "title": "active_precompiles defines the slice of hex addresses of the precompiled\ncontracts that are active", - "type": "array", - "items": { - "type": "string" - } - } - }, - "description": "params define the evm module parameters." - } - }, - "description": "QueryParamsResponse defines the response type for querying x/evm parameters." + "schema": { + "type": "object", + "properties": { + "base_fee": { + "type": "string", + "title": "base_fee is the EIP1559 base fee" } - } + }, + "description": "QueryBaseFeeResponse returns the EIP1559 base fee." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" } } } @@ -4003,88 +3248,148 @@ } } } - } + }, + "tags": [ + "Query" + ] } }, - "/evmos/evm/v1/storage/{address}/{key}": { + "/evmos/feemarket/v1/block_gas": { "get": { - "tags": [ - "Query" - ], - "summary": "Storage queries the balance of all coins for a single account.", - "operationId": "Storage", - "parameters": [ - { - "name": "address", - "in": "path", - "description": "address is the ethereum hex address to query the storage state for.", - "required": true, + "summary": "BlockGas queries the gas used at a given block height", + "operationId": "BlockGas", + "responses": { + "200": { + "description": "A successful response.", "schema": { - "type": "string" + "type": "object", + "properties": { + "gas": { + "type": "string", + "format": "int64", + "title": "gas is the returned block gas" + } + }, + "description": "QueryBlockGasResponse returns block gas used for a given height." } }, - { - "name": "key", - "in": "path", - "description": "key defines the key of the storage state", - "required": true, + "default": { + "description": "An unexpected error response.", "schema": { - "type": "string" + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" + } + } + } + } + } } } - ], + }, + "tags": [ + "Query" + ] + } + }, + "/evmos/feemarket/v1/params": { + "get": { + "summary": "Params queries the parameters of x/feemarket module.", + "operationId": "FeeMarketParams", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "params": { + "description": "params define the evm module parameters.", "type": "object", "properties": { - "value": { + "no_base_fee": { + "type": "boolean", + "title": "no_base_fee forces the EIP-1559 base fee to 0 (needed for 0 price calls)" + }, + "base_fee_change_denominator": { + "type": "integer", + "format": "int64", + "description": "base_fee_change_denominator bounds the amount the base fee can change\nbetween blocks." + }, + "elasticity_multiplier": { + "type": "integer", + "format": "int64", + "description": "elasticity_multiplier bounds the maximum gas limit an EIP-1559 block may\nhave." + }, + "enable_height": { + "type": "string", + "format": "int64", + "description": "enable_height defines at which block height the base fee calculation is enabled." + }, + "base_fee": { + "type": "string", + "description": "base_fee for EIP-1559 blocks." + }, + "min_gas_price": { + "type": "string", + "title": "min_gas_price defines the minimum gas price value for cosmos and eth transactions" + }, + "min_gas_multiplier": { "type": "string", - "description": "value defines the storage state value hash associated with the given key." + "title": "min_gas_multiplier bounds the minimum gas used to be charged\nto senders based on gas limit" } }, - "description": "QueryStorageResponse is the response type for the Query/Storage RPC\nmethod." + "title": "Params defines the EVM module parameters" } - } + }, + "description": "QueryParamsResponse defines the response type for querying x/evm parameters." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" } } } @@ -4092,4639 +3397,5492 @@ } } } - } + }, + "tags": [ + "Query" + ] } }, - "/evmos/evm/v1/trace_block": { + "/ibc/apps/transfer/v1/channels/{channel_id}/ports/{port_id}/escrow_address": { "get": { - "tags": [ - "Query" - ], - "summary": "TraceBlock implements the `debug_traceBlockByNumber` and `debug_traceBlockByHash` rpc api", - "operationId": "TraceBlock", - "parameters": [ - { - "name": "trace_config.tracer", - "in": "query", - "description": "tracer is a custom javascript tracer.", + "summary": "EscrowAddress returns the escrow address for a particular port and channel id.", + "operationId": "EscrowAddress", + "responses": { + "200": { + "description": "A successful response.", "schema": { - "type": "string" + "type": "object", + "properties": { + "escrow_address": { + "type": "string", + "title": "the escrow account address" + } + }, + "description": "QueryEscrowAddressResponse is the response type of the EscrowAddress RPC method." } }, - { - "name": "trace_config.timeout", - "in": "query", - "description": "timeout overrides the default timeout of 5 seconds for JavaScript-based tracing\ncalls.", + "default": { + "description": "An unexpected error response.", "schema": { - "type": "string" + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" + } + } + } + } + } } + } + }, + "parameters": [ + { + "name": "channel_id", + "description": "unique channel identifier", + "in": "path", + "required": true, + "type": "string" }, { - "name": "trace_config.reexec", - "in": "query", - "description": "reexec defines the number of blocks the tracer is willing to go back.", + "name": "port_id", + "description": "unique port identifier", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "Query" + ] + } + }, + "/ibc/apps/transfer/v1/denom_hashes/{trace}": { + "get": { + "summary": "DenomHash queries a denomination hash information.", + "operationId": "DenomHash", + "responses": { + "200": { + "description": "A successful response.", "schema": { - "type": "string", - "format": "uint64" + "type": "object", + "properties": { + "hash": { + "type": "string", + "description": "hash (in hex format) of the denomination trace information." + } + }, + "description": "QueryDenomHashResponse is the response type for the Query/DenomHash RPC\nmethod." } }, - { - "name": "trace_config.disable_stack", - "in": "query", - "description": "disable_stack switches stack capture.", + "default": { + "description": "An unexpected error response.", "schema": { - "type": "boolean" + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" + } + } + } + } + } } - }, + } + }, + "parameters": [ { - "name": "trace_config.disable_storage", - "in": "query", - "description": "disable_storage switches storage capture.", + "name": "trace", + "description": "The denomination trace ([port_id]/[channel_id])+/[denom]", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "Query" + ] + } + }, + "/ibc/apps/transfer/v1/denom_traces": { + "get": { + "summary": "DenomTraces queries all denomination traces.", + "operationId": "DenomTraces", + "responses": { + "200": { + "description": "A successful response.", "schema": { - "type": "boolean" + "type": "object", + "properties": { + "denom_traces": { + "type": "array", + "items": { + "type": "object", + "properties": { + "path": { + "type": "string", + "description": "path defines the chain of port/channel identifiers used for tracing the\nsource of the fungible token." + }, + "base_denom": { + "type": "string", + "description": "base denomination of the relayed fungible token." + } + }, + "description": "DenomTrace contains the base denomination for ICS20 fungible tokens and the\nsource tracing information path." + }, + "description": "denom_traces returns all denominations trace information." + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "description": "QueryConnectionsResponse is the response type for the Query/DenomTraces RPC\nmethod." } }, - { - "name": "trace_config.debug", - "in": "query", - "description": "debug can be used to print output during capture end.", + "default": { + "description": "An unexpected error response.", "schema": { - "type": "boolean" + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" + } + } + } + } + } } - }, + } + }, + "parameters": [ { - "name": "trace_config.limit", + "name": "pagination.key", + "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", "in": "query", - "description": "limit defines the maximum length of output, but zero means unlimited.", - "schema": { - "type": "integer", - "format": "int32" - } + "required": false, + "type": "string", + "format": "byte" }, { - "name": "trace_config.overrides.homestead_block", + "name": "pagination.offset", + "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", "in": "query", - "description": "homestead_block switch (nil no fork, 0 = already homestead).", - "schema": { - "type": "string" - } + "required": false, + "type": "string", + "format": "uint64" }, { - "name": "trace_config.overrides.dao_fork_block", + "name": "pagination.limit", + "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", "in": "query", - "description": "dao_fork_block corresponds to TheDAO hard-fork switch block (nil no fork).", - "schema": { - "type": "string" - } + "required": false, + "type": "string", + "format": "uint64" }, { - "name": "trace_config.overrides.dao_fork_support", + "name": "pagination.count_total", + "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", "in": "query", - "description": "dao_fork_support defines whether the nodes supports or opposes the DAO hard-fork.", - "schema": { - "type": "boolean" - } + "required": false, + "type": "boolean" }, { - "name": "trace_config.overrides.eip150_block", + "name": "pagination.reverse", + "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", "in": "query", - "description": "eip150_block: EIP150 implements the Gas price changes\n(https://github.com/ethereum/EIPs/issues/150) EIP150 HF block (nil no fork).", + "required": false, + "type": "boolean" + } + ], + "tags": [ + "Query" + ] + } + }, + "/ibc/apps/transfer/v1/denom_traces/{hash}": { + "get": { + "summary": "DenomTrace queries a denomination trace information.", + "operationId": "DenomTrace", + "responses": { + "200": { + "description": "A successful response.", "schema": { - "type": "string" + "type": "object", + "properties": { + "denom_trace": { + "type": "object", + "properties": { + "path": { + "type": "string", + "description": "path defines the chain of port/channel identifiers used for tracing the\nsource of the fungible token." + }, + "base_denom": { + "type": "string", + "description": "base denomination of the relayed fungible token." + } + }, + "description": "DenomTrace contains the base denomination for ICS20 fungible tokens and the\nsource tracing information path." + } + }, + "description": "QueryDenomTraceResponse is the response type for the Query/DenomTrace RPC\nmethod." } }, - { - "name": "trace_config.overrides.eip150_hash", - "in": "query", - "description": "eip150_hash: EIP150 HF hash (needed for header only clients as only gas pricing changed).", + "default": { + "description": "An unexpected error response.", "schema": { - "type": "string" + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" + } + } + } + } + } } - }, + } + }, + "parameters": [ { - "name": "trace_config.overrides.eip155_block", - "in": "query", - "description": "eip155_block: EIP155Block HF block.", + "name": "hash", + "description": "hash (in hex format) or denom (full denom with ibc prefix) of the denomination trace information.", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "Query" + ] + } + }, + "/ibc/apps/transfer/v1/denoms/{denom}/total_escrow": { + "get": { + "summary": "TotalEscrowForDenom returns the total amount of tokens in escrow based on the denom.", + "operationId": "TotalEscrowForDenom", + "responses": { + "200": { + "description": "A successful response.", "schema": { - "type": "string" + "type": "object", + "properties": { + "amount": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + } + }, + "description": "QueryTotalEscrowForDenomResponse is the response type for TotalEscrowForDenom RPC method." } }, - { - "name": "trace_config.overrides.eip158_block", - "in": "query", - "description": "eip158_block: EIP158 HF block.", + "default": { + "description": "An unexpected error response.", "schema": { - "type": "string" + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" + } + } + } + } + } } - }, + } + }, + "parameters": [ { - "name": "trace_config.overrides.byzantium_block", - "in": "query", - "description": "byzantium_block: Byzantium switch block (nil no fork, 0 = already on byzantium).", - "schema": { - "type": "string" - } - }, - { - "name": "trace_config.overrides.constantinople_block", - "in": "query", - "description": "constantinople_block: Constantinople switch block (nil no fork, 0 = already activated).", + "name": "denom", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "Query" + ] + } + }, + "/ibc/apps/transfer/v1/params": { + "get": { + "summary": "Params queries all parameters of the ibc-transfer module.", + "operationId": "TransferParams", + "responses": { + "200": { + "description": "A successful response.", "schema": { - "type": "string" + "type": "object", + "properties": { + "params": { + "description": "params defines the parameters of the module.", + "type": "object", + "properties": { + "send_enabled": { + "type": "boolean", + "description": "send_enabled enables or disables all cross-chain token transfers from this\nchain." + }, + "receive_enabled": { + "type": "boolean", + "description": "receive_enabled enables or disables all cross-chain token transfers to this\nchain." + } + } + } + }, + "description": "QueryParamsResponse is the response type for the Query/Params RPC method." } }, - { - "name": "trace_config.overrides.petersburg_block", - "in": "query", - "description": "petersburg_block: Petersburg switch block (nil same as Constantinople).", + "default": { + "description": "An unexpected error response.", "schema": { - "type": "string" + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" + } + } + } + } + } } - }, - { - "name": "trace_config.overrides.istanbul_block", - "in": "query", - "description": "istanbul_block: Istanbul switch block (nil no fork, 0 = already on istanbul).", + } + }, + "tags": [ + "Query" + ] + } + }, + "/ibc/core/client/v1/client_states": { + "get": { + "summary": "ClientStates queries all the IBC light clients of a chain.", + "operationId": "ClientStates", + "responses": { + "200": { + "description": "A successful response.", "schema": { - "type": "string" + "type": "object", + "properties": { + "client_states": { + "type": "array", + "items": { + "type": "object", + "properties": { + "client_id": { + "type": "string", + "title": "client identifier" + }, + "client_state": { + "title": "client state", + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } + }, + "description": "IdentifiedClientState defines a client state with an additional client\nidentifier field." + }, + "description": "list of stored ClientStates of the chain." + }, + "pagination": { + "title": "pagination response", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + }, + "description": "PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }" + } + }, + "description": "QueryClientStatesResponse is the response type for the Query/ClientStates RPC\nmethod." } }, - { - "name": "trace_config.overrides.muir_glacier_block", - "in": "query", - "description": "muir_glacier_block: Eip-2384 (bomb delay) switch block (nil no fork, 0 = already activated).", + "default": { + "description": "An unexpected error response.", "schema": { - "type": "string" + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } + } + } } - }, + } + }, + "parameters": [ { - "name": "trace_config.overrides.berlin_block", + "name": "pagination.key", + "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", "in": "query", - "description": "berlin_block: Berlin switch block (nil = no fork, 0 = already on berlin).", - "schema": { - "type": "string" - } + "required": false, + "type": "string", + "format": "byte" }, { - "name": "trace_config.overrides.london_block", + "name": "pagination.offset", + "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", "in": "query", - "description": "london_block: London switch block (nil = no fork, 0 = already on london).", - "schema": { - "type": "string" - } + "required": false, + "type": "string", + "format": "uint64" }, { - "name": "trace_config.overrides.arrow_glacier_block", + "name": "pagination.limit", + "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", "in": "query", - "description": "arrow_glacier_block: Eip-4345 (bomb delay) switch block (nil = no fork, 0 = already activated).", - "schema": { - "type": "string" - } + "required": false, + "type": "string", + "format": "uint64" }, { - "name": "trace_config.overrides.gray_glacier_block", + "name": "pagination.count_total", + "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", "in": "query", - "description": "gray_glacier_block: EIP-5133 (bomb delay) switch block (nil = no fork, 0 = already activated).", - "schema": { - "type": "string" - } + "required": false, + "type": "boolean" }, { - "name": "trace_config.overrides.merge_netsplit_block", + "name": "pagination.reverse", + "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", "in": "query", - "description": "merge_netsplit_block: Virtual fork after The Merge to use as a network splitter.", + "required": false, + "type": "boolean" + } + ], + "tags": [ + "Query" + ] + } + }, + "/ibc/core/client/v1/client_states/{client_id}": { + "get": { + "summary": "ClientState queries an IBC light client.", + "operationId": "ClientState", + "responses": { + "200": { + "description": "A successful response.", "schema": { - "type": "string" + "type": "object", + "properties": { + "client_state": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }", + "title": "client state associated with the request identifier" + }, + "proof": { + "type": "string", + "format": "byte", + "title": "merkle proof of existence" + }, + "proof_height": { + "title": "height at which the proof was retrieved", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + } + }, + "description": "QueryClientStateResponse is the response type for the Query/ClientState RPC\nmethod. Besides the client state, it includes a proof and the height from\nwhich the proof was retrieved." } }, - { - "name": "trace_config.overrides.shanghai_block", - "in": "query", - "description": "shanghai_block switch block (nil = no fork, 0 = already on shanghai).", + "default": { + "description": "An unexpected error response.", "schema": { - "type": "string" - } - }, - { - "name": "trace_config.overrides.cancun_block", - "in": "query", - "description": "cancun_block switch block (nil = no fork, 0 = already on cancun).", - "schema": { - "type": "string" + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } + } + } } - }, + } + }, + "parameters": [ { - "name": "trace_config.enable_memory", - "in": "query", - "description": "enable_memory switches memory capture.", + "name": "client_id", + "description": "client state unique identifier", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "Query" + ] + } + }, + "/ibc/core/client/v1/client_status/{client_id}": { + "get": { + "summary": "Status queries the status of an IBC client.", + "operationId": "ClientStatus", + "responses": { + "200": { + "description": "A successful response.", "schema": { - "type": "boolean" + "type": "object", + "properties": { + "status": { + "type": "string" + } + }, + "description": "QueryClientStatusResponse is the response type for the Query/ClientStatus RPC\nmethod. It returns the current status of the IBC client." } }, - { - "name": "trace_config.enable_return_data", - "in": "query", - "description": "enable_return_data switches the capture of return data.", + "default": { + "description": "An unexpected error response.", "schema": { - "type": "boolean" + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } + } + } } - }, + } + }, + "parameters": [ { - "name": "trace_config.tracer_json_config", - "in": "query", - "description": "tracer_json_config configures the tracer using a JSON string.", + "name": "client_id", + "description": "client unique identifier", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "Query" + ] + } + }, + "/ibc/core/client/v1/consensus_states/{client_id}": { + "get": { + "summary": "ConsensusStates queries all the consensus state associated with a given\nclient.", + "operationId": "ConsensusStates", + "responses": { + "200": { + "description": "A successful response.", "schema": { - "type": "string" + "type": "object", + "properties": { + "consensus_states": { + "type": "array", + "items": { + "type": "object", + "properties": { + "height": { + "title": "consensus state height", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + }, + "consensus_state": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }", + "title": "consensus state" + } + }, + "description": "ConsensusStateWithHeight defines a consensus state with an additional height\nfield." + }, + "title": "consensus states associated with the identifier" + }, + "pagination": { + "title": "pagination response", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + }, + "description": "PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }" + } + }, + "title": "QueryConsensusStatesResponse is the response type for the\nQuery/ConsensusStates RPC method" } }, - { - "name": "block_number", - "in": "query", - "description": "block_number of the traced block.", + "default": { + "description": "An unexpected error response.", "schema": { - "type": "string", - "format": "int64" + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } + } + } } + } + }, + "parameters": [ + { + "name": "client_id", + "description": "client identifier", + "in": "path", + "required": true, + "type": "string" }, { - "name": "block_hash", + "name": "pagination.key", + "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", "in": "query", - "description": "block_hash (hex) of the traced block.", - "schema": { - "type": "string" - } + "required": false, + "type": "string", + "format": "byte" }, { - "name": "block_time", + "name": "pagination.offset", + "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", "in": "query", - "description": "block_time of the traced block.", - "schema": { - "type": "string", - "format": "date-time" - } + "required": false, + "type": "string", + "format": "uint64" }, { - "name": "proposer_address", + "name": "pagination.limit", + "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", "in": "query", - "description": "proposer_address is the address of the requested block.", - "schema": { - "type": "string", - "format": "byte" - } + "required": false, + "type": "string", + "format": "uint64" }, { - "name": "chain_id", + "name": "pagination.count_total", + "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", "in": "query", - "description": "chain_id is the eip155 chain id parsed from the requested block header.", - "schema": { - "type": "string", - "format": "int64" - } + "required": false, + "type": "boolean" }, { - "name": "block_max_gas", + "name": "pagination.reverse", + "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", "in": "query", - "description": "block_max_gas of the traced block.", - "schema": { - "type": "string", - "format": "int64" - } + "required": false, + "type": "boolean" } ], - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "title": "QueryTraceBlockResponse defines TraceBlock response", + "tags": [ + "Query" + ] + } + }, + "/ibc/core/client/v1/consensus_states/{client_id}/heights": { + "get": { + "summary": "ConsensusStateHeights queries the height of every consensus states associated with a given client.", + "operationId": "ConsensusStateHeights", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "type": "object", + "properties": { + "consensus_state_heights": { + "type": "array", + "items": { + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset", + "title": "Height is a monotonically increasing data type\nthat can be compared against another Height for the purposes of updating and\nfreezing clients" + }, + "title": "consensus state heights" + }, + "pagination": { + "title": "pagination response", "type": "object", "properties": { - "data": { - "title": "data is the response serialized in bytes", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "next_key": { "type": "string", - "format": "byte" + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" } - } + }, + "description": "PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }" } - } + }, + "title": "QueryConsensusStateHeightsResponse is the response type for the\nQuery/ConsensusStateHeights RPC method" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/evmos/evm/v1/trace_tx": { - "get": { - "tags": [ - "Query" - ], - "summary": "TraceTx implements the `debug_traceTransaction` rpc api", - "operationId": "TraceTx", + }, "parameters": [ { - "name": "msg.data.type_url", - "in": "query", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics.", - "schema": { - "type": "string" - } + "name": "client_id", + "description": "client identifier", + "in": "path", + "required": true, + "type": "string" }, { - "name": "msg.data.value", + "name": "pagination.key", + "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", "in": "query", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "schema": { - "type": "string", - "format": "byte" - } + "required": false, + "type": "string", + "format": "byte" }, { - "name": "msg.size", + "name": "pagination.offset", + "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", "in": "query", - "description": "size is the encoded storage size of the transaction (DEPRECATED).", - "schema": { - "type": "number", - "format": "double" - } + "required": false, + "type": "string", + "format": "uint64" }, { - "name": "msg.hash", + "name": "pagination.limit", + "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", "in": "query", - "description": "hash of the transaction in hex format.", - "schema": { - "type": "string" - } + "required": false, + "type": "string", + "format": "uint64" }, { - "name": "msg.from", + "name": "pagination.count_total", + "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", "in": "query", - "description": "from is the ethereum signer address in hex format. This address value is checked\nagainst the address derived from the signature (V, R, S) using the\nsecp256k1 elliptic curve.", - "schema": { - "type": "string" - } + "required": false, + "type": "boolean" }, { - "name": "trace_config.tracer", + "name": "pagination.reverse", + "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", "in": "query", - "description": "tracer is a custom javascript tracer.", + "required": false, + "type": "boolean" + } + ], + "tags": [ + "Query" + ] + } + }, + "/ibc/core/client/v1/consensus_states/{client_id}/revision/{revision_number}/height/{revision_height}": { + "get": { + "summary": "ConsensusState queries a consensus state associated with a client state at\na given height.", + "operationId": "ConsensusState", + "responses": { + "200": { + "description": "A successful response.", "schema": { - "type": "string" + "type": "object", + "properties": { + "consensus_state": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }", + "title": "consensus state associated with the client identifier at the given height" + }, + "proof": { + "type": "string", + "format": "byte", + "title": "merkle proof of existence" + }, + "proof_height": { + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset", + "title": "Height is a monotonically increasing data type\nthat can be compared against another Height for the purposes of updating and\nfreezing clients" + } + }, + "title": "QueryConsensusStateResponse is the response type for the Query/ConsensusState\nRPC method" } }, - { - "name": "trace_config.timeout", - "in": "query", - "description": "timeout overrides the default timeout of 5 seconds for JavaScript-based tracing\ncalls.", + "default": { + "description": "An unexpected error response.", "schema": { - "type": "string" + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } + } + } } + } + }, + "parameters": [ + { + "name": "client_id", + "description": "client identifier", + "in": "path", + "required": true, + "type": "string" }, { - "name": "trace_config.reexec", - "in": "query", - "description": "reexec defines the number of blocks the tracer is willing to go back.", - "schema": { - "type": "string", - "format": "uint64" - } + "name": "revision_number", + "description": "consensus state revision number", + "in": "path", + "required": true, + "type": "string", + "format": "uint64" }, { - "name": "trace_config.disable_stack", - "in": "query", - "description": "disable_stack switches stack capture.", - "schema": { - "type": "boolean" - } + "name": "revision_height", + "description": "consensus state revision height", + "in": "path", + "required": true, + "type": "string", + "format": "uint64" }, { - "name": "trace_config.disable_storage", + "name": "latest_height", + "description": "latest_height overrides the height field and queries the latest stored\nConsensusState.", "in": "query", - "description": "disable_storage switches storage capture.", - "schema": { - "type": "boolean" - } - }, - { - "name": "trace_config.debug", - "in": "query", - "description": "debug can be used to print output during capture end.", + "required": false, + "type": "boolean" + } + ], + "tags": [ + "Query" + ] + } + }, + "/ibc/core/client/v1/params": { + "get": { + "summary": "ClientParams queries all parameters of the ibc client submodule.", + "operationId": "ClientParams", + "responses": { + "200": { + "description": "A successful response.", "schema": { - "type": "boolean" + "type": "object", + "properties": { + "params": { + "description": "params defines the parameters of the module.", + "type": "object", + "properties": { + "allowed_clients": { + "type": "array", + "items": { + "type": "string" + }, + "description": "allowed_clients defines the list of allowed client state types which can be created\nand interacted with. If a client type is removed from the allowed clients list, usage\nof this client will be disabled until it is added again to the list." + } + } + } + }, + "description": "QueryClientParamsResponse is the response type for the Query/ClientParams RPC\nmethod." } }, - { - "name": "trace_config.limit", - "in": "query", - "description": "limit defines the maximum length of output, but zero means unlimited.", + "default": { + "description": "An unexpected error response.", "schema": { - "type": "integer", - "format": "int32" + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } + } + } } - }, - { - "name": "trace_config.overrides.homestead_block", - "in": "query", - "description": "homestead_block switch (nil no fork, 0 = already homestead).", + } + }, + "tags": [ + "Query" + ] + } + }, + "/ibc/core/client/v1/upgraded_client_states": { + "get": { + "summary": "UpgradedClientState queries an Upgraded IBC light client.", + "operationId": "UpgradedClientState", + "responses": { + "200": { + "description": "A successful response.", "schema": { - "type": "string" + "type": "object", + "properties": { + "upgraded_client_state": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }", + "title": "client state associated with the request identifier" + } + }, + "description": "QueryUpgradedClientStateResponse is the response type for the\nQuery/UpgradedClientState RPC method." } }, - { - "name": "trace_config.overrides.dao_fork_block", - "in": "query", - "description": "dao_fork_block corresponds to TheDAO hard-fork switch block (nil no fork).", + "default": { + "description": "An unexpected error response.", "schema": { - "type": "string" + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } + } + } } - }, - { - "name": "trace_config.overrides.dao_fork_support", - "in": "query", - "description": "dao_fork_support defines whether the nodes supports or opposes the DAO hard-fork.", + } + }, + "tags": [ + "Query" + ] + } + }, + "/ibc/core/client/v1/upgraded_consensus_states": { + "get": { + "summary": "UpgradedConsensusState queries an Upgraded IBC consensus state.", + "operationId": "UpgradedConsensusState", + "responses": { + "200": { + "description": "A successful response.", "schema": { - "type": "boolean" + "type": "object", + "properties": { + "upgraded_consensus_state": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }", + "title": "Consensus state associated with the request identifier" + } + }, + "description": "QueryUpgradedConsensusStateResponse is the response type for the\nQuery/UpgradedConsensusState RPC method." } }, - { - "name": "trace_config.overrides.eip150_block", - "in": "query", - "description": "eip150_block: EIP150 implements the Gas price changes\n(https://github.com/ethereum/EIPs/issues/150) EIP150 HF block (nil no fork).", + "default": { + "description": "An unexpected error response.", "schema": { - "type": "string" + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } + } + } } - }, - { - "name": "trace_config.overrides.eip150_hash", - "in": "query", - "description": "eip150_hash: EIP150 HF hash (needed for header only clients as only gas pricing changed).", + } + }, + "tags": [ + "Query" + ] + } + }, + "/ibc/core/connection/v1/client_connections/{client_id}": { + "get": { + "summary": "ClientConnections queries the connection paths associated with a client\nstate.", + "operationId": "ClientConnections", + "responses": { + "200": { + "description": "A successful response.", "schema": { - "type": "string" + "type": "object", + "properties": { + "connection_paths": { + "type": "array", + "items": { + "type": "string" + }, + "description": "slice of all the connection paths associated with a client." + }, + "proof": { + "type": "string", + "format": "byte", + "title": "merkle proof of existence" + }, + "proof_height": { + "title": "height at which the proof was generated", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + } + }, + "title": "QueryClientConnectionsResponse is the response type for the\nQuery/ClientConnections RPC method" } }, - { - "name": "trace_config.overrides.eip155_block", - "in": "query", - "description": "eip155_block: EIP155Block HF block.", + "default": { + "description": "An unexpected error response.", "schema": { - "type": "string" - } - }, - { - "name": "trace_config.overrides.eip158_block", - "in": "query", - "description": "eip158_block: EIP158 HF block.", - "schema": { - "type": "string" - } - }, - { - "name": "trace_config.overrides.byzantium_block", - "in": "query", - "description": "byzantium_block: Byzantium switch block (nil no fork, 0 = already on byzantium).", - "schema": { - "type": "string" - } - }, - { - "name": "trace_config.overrides.constantinople_block", - "in": "query", - "description": "constantinople_block: Constantinople switch block (nil no fork, 0 = already activated).", - "schema": { - "type": "string" - } - }, - { - "name": "trace_config.overrides.petersburg_block", - "in": "query", - "description": "petersburg_block: Petersburg switch block (nil same as Constantinople).", - "schema": { - "type": "string" - } - }, - { - "name": "trace_config.overrides.istanbul_block", - "in": "query", - "description": "istanbul_block: Istanbul switch block (nil no fork, 0 = already on istanbul).", - "schema": { - "type": "string" - } - }, - { - "name": "trace_config.overrides.muir_glacier_block", - "in": "query", - "description": "muir_glacier_block: Eip-2384 (bomb delay) switch block (nil no fork, 0 = already activated).", - "schema": { - "type": "string" + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } + } + } } - }, + } + }, + "parameters": [ { - "name": "trace_config.overrides.berlin_block", - "in": "query", - "description": "berlin_block: Berlin switch block (nil = no fork, 0 = already on berlin).", + "name": "client_id", + "description": "client identifier associated with a connection", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "Query" + ] + } + }, + "/ibc/core/connection/v1/connections": { + "get": { + "summary": "Connections queries all the IBC connections of a chain.", + "operationId": "Connections", + "responses": { + "200": { + "description": "A successful response.", "schema": { - "type": "string" + "type": "object", + "properties": { + "connections": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "connection identifier." + }, + "client_id": { + "type": "string", + "description": "client associated with this connection." + }, + "versions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "identifier": { + "type": "string", + "title": "unique version identifier" + }, + "features": { + "type": "array", + "items": { + "type": "string" + }, + "title": "list of features compatible with the specified identifier" + } + }, + "description": "Version defines the versioning scheme used to negotiate the IBC version in\nthe connection handshake." + }, + "title": "IBC version which can be utilised to determine encodings or protocols for\nchannels or packets utilising this connection" + }, + "state": { + "description": "current state of the connection end.", + "type": "string", + "enum": [ + "STATE_UNINITIALIZED_UNSPECIFIED", + "STATE_INIT", + "STATE_TRYOPEN", + "STATE_OPEN" + ], + "default": "STATE_UNINITIALIZED_UNSPECIFIED" + }, + "counterparty": { + "description": "counterparty chain associated with this connection.", + "type": "object", + "properties": { + "client_id": { + "type": "string", + "description": "identifies the client on the counterparty chain associated with a given\nconnection." + }, + "connection_id": { + "type": "string", + "description": "identifies the connection end on the counterparty chain associated with a\ngiven connection." + }, + "prefix": { + "description": "commitment merkle prefix of the counterparty chain.", + "type": "object", + "properties": { + "key_prefix": { + "type": "string", + "format": "byte" + } + }, + "title": "MerklePrefix is merkle path prefixed to the key.\nThe constructed key from the Path and the key will be append(Path.KeyPath,\nappend(Path.KeyPrefix, key...))" + } + } + }, + "delay_period": { + "type": "string", + "format": "uint64", + "description": "delay period associated with this connection." + } + }, + "description": "IdentifiedConnection defines a connection with additional connection\nidentifier field." + }, + "description": "list of stored connections of the chain." + }, + "pagination": { + "title": "pagination response", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + }, + "description": "PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }" + }, + "height": { + "title": "query block height", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + } + }, + "description": "QueryConnectionsResponse is the response type for the Query/Connections RPC\nmethod." } }, - { - "name": "trace_config.overrides.london_block", - "in": "query", - "description": "london_block: London switch block (nil = no fork, 0 = already on london).", + "default": { + "description": "An unexpected error response.", "schema": { - "type": "string" + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } + } + } } - }, + } + }, + "parameters": [ { - "name": "trace_config.overrides.arrow_glacier_block", + "name": "pagination.key", + "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", "in": "query", - "description": "arrow_glacier_block: Eip-4345 (bomb delay) switch block (nil = no fork, 0 = already activated).", - "schema": { - "type": "string" - } + "required": false, + "type": "string", + "format": "byte" }, { - "name": "trace_config.overrides.gray_glacier_block", + "name": "pagination.offset", + "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", "in": "query", - "description": "gray_glacier_block: EIP-5133 (bomb delay) switch block (nil = no fork, 0 = already activated).", - "schema": { - "type": "string" - } + "required": false, + "type": "string", + "format": "uint64" }, { - "name": "trace_config.overrides.merge_netsplit_block", + "name": "pagination.limit", + "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", "in": "query", - "description": "merge_netsplit_block: Virtual fork after The Merge to use as a network splitter.", - "schema": { - "type": "string" - } + "required": false, + "type": "string", + "format": "uint64" }, { - "name": "trace_config.overrides.shanghai_block", + "name": "pagination.count_total", + "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", "in": "query", - "description": "shanghai_block switch block (nil = no fork, 0 = already on shanghai).", - "schema": { - "type": "string" - } + "required": false, + "type": "boolean" }, { - "name": "trace_config.overrides.cancun_block", + "name": "pagination.reverse", + "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", "in": "query", - "description": "cancun_block switch block (nil = no fork, 0 = already on cancun).", + "required": false, + "type": "boolean" + } + ], + "tags": [ + "Query" + ] + } + }, + "/ibc/core/connection/v1/connections/{connection_id}": { + "get": { + "summary": "Connection queries an IBC connection end.", + "operationId": "Connection", + "responses": { + "200": { + "description": "A successful response.", "schema": { - "type": "string" - } - }, - { - "name": "trace_config.enable_memory", - "in": "query", - "description": "enable_memory switches memory capture.", - "schema": { - "type": "boolean" - } - }, - { - "name": "trace_config.enable_return_data", - "in": "query", - "description": "enable_return_data switches the capture of return data.", - "schema": { - "type": "boolean" - } - }, - { - "name": "trace_config.tracer_json_config", - "in": "query", - "description": "tracer_json_config configures the tracer using a JSON string.", - "schema": { - "type": "string" - } - }, - { - "name": "block_number", - "in": "query", - "description": "block_number of requested transaction.", - "schema": { - "type": "string", - "format": "int64" - } - }, - { - "name": "block_hash", - "in": "query", - "description": "block_hash of requested transaction.", - "schema": { - "type": "string" - } - }, - { - "name": "block_time", - "in": "query", - "description": "block_time of requested transaction.", - "schema": { - "type": "string", - "format": "date-time" - } - }, - { - "name": "proposer_address", - "in": "query", - "description": "proposer_address is the proposer of the requested block.", - "schema": { - "type": "string", - "format": "byte" - } - }, - { - "name": "chain_id", - "in": "query", - "description": "chain_id is the the eip155 chain id parsed from the requested block header.", - "schema": { - "type": "string", - "format": "int64" - } - }, - { - "name": "block_max_gas", - "in": "query", - "description": "block_max_gas of the block of the requested transaction.", - "schema": { - "type": "string", - "format": "int64" - } - } - ], - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "title": "QueryTraceTxResponse defines TraceTx response", + "type": "object", + "properties": { + "connection": { + "title": "connection associated with the request identifier", "type": "object", "properties": { - "data": { - "title": "data is the response serialized in bytes", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "client_id": { "type": "string", - "format": "byte" - } - } - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" + "description": "client associated with this connection." }, - "message": { - "type": "string" - }, - "details": { + "versions": { "type": "array", "items": { "type": "object", "properties": { - "type_url": { + "identifier": { "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + "title": "unique version identifier" }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" + "features": { + "type": "array", + "items": { + "type": "string" + }, + "title": "list of features compatible with the specified identifier" } }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "description": "Version defines the versioning scheme used to negotiate the IBC version in\nthe connection handshake." + }, + "description": "IBC version which can be utilised to determine encodings or protocols for\nchannels or packets utilising this connection." + }, + "state": { + "description": "current state of the connection end.", + "type": "string", + "enum": [ + "STATE_UNINITIALIZED_UNSPECIFIED", + "STATE_INIT", + "STATE_TRYOPEN", + "STATE_OPEN" + ], + "default": "STATE_UNINITIALIZED_UNSPECIFIED" + }, + "counterparty": { + "description": "counterparty chain associated with this connection.", + "type": "object", + "properties": { + "client_id": { + "type": "string", + "description": "identifies the client on the counterparty chain associated with a given\nconnection." + }, + "connection_id": { + "type": "string", + "description": "identifies the connection end on the counterparty chain associated with a\ngiven connection." + }, + "prefix": { + "description": "commitment merkle prefix of the counterparty chain.", + "type": "object", + "properties": { + "key_prefix": { + "type": "string", + "format": "byte" + } + }, + "title": "MerklePrefix is merkle path prefixed to the key.\nThe constructed key from the Path and the key will be append(Path.KeyPath,\nappend(Path.KeyPrefix, key...))" + } } + }, + "delay_period": { + "type": "string", + "format": "uint64", + "description": "delay period that must pass before a consensus state can be used for\npacket-verification NOTE: delay period logic is only implemented by some\nclients." + } + }, + "description": "ConnectionEnd defines a stateful object on a chain connected to another\nseparate one.\nNOTE: there must only be 2 defined ConnectionEnds to establish\na connection between two chains." + }, + "proof": { + "type": "string", + "format": "byte", + "title": "merkle proof of existence" + }, + "proof_height": { + "title": "height at which the proof was retrieved", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + } + }, + "description": "QueryConnectionResponse is the response type for the Query/Connection RPC\nmethod. Besides the connection end, it includes a proof and the height from\nwhich the proof was retrieved." + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/evmos/evm/v1/validator_account/{cons_address}": { - "get": { - "tags": [ - "Query" - ], - "summary": "ValidatorAccount queries an Ethereum account's from a validator consensus\nAddress.", - "operationId": "ValidatorAccount", + }, "parameters": [ { - "name": "cons_address", + "name": "connection_id", + "description": "connection unique identifier", "in": "path", - "description": "cons_address is the validator cons address to query the account for.", "required": true, - "schema": { - "type": "string" - } + "type": "string" } ], + "tags": [ + "Query" + ] + } + }, + "/ibc/core/connection/v1/connections/{connection_id}/client_state": { + "get": { + "summary": "ConnectionClientState queries the client state associated with the\nconnection.", + "operationId": "ConnectionClientState", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "identified_client_state": { + "title": "client state associated with the channel", "type": "object", "properties": { - "account_address": { + "client_id": { "type": "string", - "description": "account_address is the cosmos address of the account in bech32 format." + "title": "client identifier" }, - "sequence": { + "client_state": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }", + "title": "client state" + } + }, + "description": "IdentifiedClientState defines a client state with an additional client\nidentifier field." + }, + "proof": { + "type": "string", + "format": "byte", + "title": "merkle proof of existence" + }, + "proof_height": { + "title": "height at which the proof was retrieved", + "type": "object", + "properties": { + "revision_number": { "type": "string", - "description": "sequence is the account's sequence number.", - "format": "uint64" + "format": "uint64", + "title": "the revision that the client is currently on" }, - "account_number": { - "title": "account_number is the account number", + "revision_height": { "type": "string", - "format": "uint64" + "format": "uint64", + "title": "the height within the given revision" } }, - "description": "QueryValidatorAccountResponse is the response type for the\nQuery/ValidatorAccount RPC method." + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" } - } + }, + "title": "QueryConnectionClientStateResponse is the response type for the\nQuery/ConnectionClientState RPC method" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } + }, + "parameters": [ + { + "name": "connection_id", + "description": "connection identifier", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "Query" + ] } }, - "/evmos/feemarket/v1/base_fee": { + "/ibc/core/connection/v1/connections/{connection_id}/consensus_state/revision/{revision_number}/height/{revision_height}": { "get": { - "tags": [ - "Query" - ], - "summary": "BaseFee queries the base fee of the parent block of the current block.", - "operationId": "FeeMarketBaseFee", + "summary": "ConnectionConsensusState queries the consensus state associated with the\nconnection.", + "operationId": "ConnectionConsensusState", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "consensus_state": { "type": "object", "properties": { - "base_fee": { - "title": "base_fee is the EIP1559 base fee", - "type": "string" + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }", + "title": "consensus state associated with the channel" + }, + "client_id": { + "type": "string", + "title": "client ID associated with the consensus state" + }, + "proof": { + "type": "string", + "format": "byte", + "title": "merkle proof of existence" + }, + "proof_height": { + "title": "height at which the proof was retrieved", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" } }, - "description": "QueryBaseFeeResponse returns the EIP1559 base fee." + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" } - } + }, + "title": "QueryConnectionConsensusStateResponse is the response type for the\nQuery/ConnectionConsensusState RPC method" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } + }, + "parameters": [ + { + "name": "connection_id", + "description": "connection identifier", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "revision_number", + "in": "path", + "required": true, + "type": "string", + "format": "uint64" + }, + { + "name": "revision_height", + "in": "path", + "required": true, + "type": "string", + "format": "uint64" + } + ], + "tags": [ + "Query" + ] } }, - "/evmos/feemarket/v1/block_gas": { + "/ibc/core/connection/v1/params": { "get": { - "tags": [ - "Query" - ], - "summary": "BlockGas queries the gas used at a given block height", - "operationId": "BlockGas", + "summary": "ConnectionParams queries all parameters of the ibc connection submodule.", + "operationId": "ConnectionParams", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "params": { + "description": "params defines the parameters of the module.", "type": "object", "properties": { - "gas": { - "title": "gas is the returned block gas", + "max_expected_time_per_block": { "type": "string", - "format": "int64" + "format": "uint64", + "description": "maximum expected time per block (in nanoseconds), used to enforce block delay. This parameter should reflect the\nlargest amount of time that the chain might reasonably take to produce the next block under normal operating\nconditions. A safe choice is 3-5x the expected time per block." } - }, - "description": "QueryBlockGasResponse returns block gas used for a given height." + } } - } + }, + "description": "QueryConnectionParamsResponse is the response type for the Query/ConnectionParams RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } + }, + "tags": [ + "Query" + ] } }, - "/evmos/feemarket/v1/params": { + "/ibc/core/channel/v1/channels": { "get": { - "tags": [ - "Query" - ], - "summary": "Params queries the parameters of x/feemarket module.", - "operationId": "FeeMarketParams", + "summary": "Channels queries all the IBC channels of a chain.", + "operationId": "Channels", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "params": { - "title": "Params defines the EVM module parameters", - "type": "object", - "properties": { - "no_base_fee": { - "title": "no_base_fee forces the EIP-1559 base fee to 0 (needed for 0 price calls)", - "type": "boolean" - }, - "base_fee_change_denominator": { - "type": "integer", - "description": "base_fee_change_denominator bounds the amount the base fee can change\nbetween blocks.", - "format": "int64" - }, - "elasticity_multiplier": { - "type": "integer", - "description": "elasticity_multiplier bounds the maximum gas limit an EIP-1559 block may\nhave.", - "format": "int64" - }, - "enable_height": { - "type": "string", - "description": "enable_height defines at which block height the base fee calculation is enabled.", - "format": "int64" - }, - "base_fee": { - "type": "string", - "description": "base_fee for EIP-1559 blocks." - }, - "min_gas_price": { - "title": "min_gas_price defines the minimum gas price value for cosmos and eth transactions", - "type": "string" - }, - "min_gas_multiplier": { - "title": "min_gas_multiplier bounds the minimum gas used to be charged\nto senders based on gas limit", - "type": "string" - } + "schema": { + "type": "object", + "properties": { + "channels": { + "type": "array", + "items": { + "type": "object", + "properties": { + "state": { + "title": "current state of the channel end", + "type": "string", + "enum": [ + "STATE_UNINITIALIZED_UNSPECIFIED", + "STATE_INIT", + "STATE_TRYOPEN", + "STATE_OPEN", + "STATE_CLOSED", + "STATE_FLUSHING", + "STATE_FLUSHCOMPLETE" + ], + "default": "STATE_UNINITIALIZED_UNSPECIFIED", + "description": "State defines if a channel is in one of the following states:\nCLOSED, INIT, TRYOPEN, OPEN, FLUSHING, FLUSHCOMPLETE or UNINITIALIZED.\n\n - STATE_UNINITIALIZED_UNSPECIFIED: Default State\n - STATE_INIT: A channel has just started the opening handshake.\n - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain.\n - STATE_OPEN: A channel has completed the handshake. Open channels are\nready to send and receive packets.\n - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive\npackets.\n - STATE_FLUSHING: A channel has just accepted the upgrade handshake attempt and is flushing in-flight packets.\n - STATE_FLUSHCOMPLETE: A channel has just completed flushing any in-flight packets." }, - "description": "params define the evm module parameters." - } - }, - "description": "QueryParamsResponse defines the response type for querying x/evm parameters." - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { + "ordering": { + "title": "whether the channel is ordered or unordered", + "type": "string", + "enum": [ + "ORDER_NONE_UNSPECIFIED", + "ORDER_UNORDERED", + "ORDER_ORDERED" + ], + "default": "ORDER_NONE_UNSPECIFIED", + "description": "- ORDER_NONE_UNSPECIFIED: zero-value for channel ordering\n - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in\nwhich they were sent.\n - ORDER_ORDERED: packets are delivered exactly in the order which they were sent" + }, + "counterparty": { + "title": "counterparty channel end", "type": "object", "properties": { - "type_url": { - "type": "string" + "port_id": { + "type": "string", + "description": "port on the counterparty chain which owns the other end of the channel." }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "channel_id": { "type": "string", - "format": "byte" + "title": "channel end on the counterparty chain" } } + }, + "connection_hops": { + "type": "array", + "items": { + "type": "string" + }, + "title": "list of connection identifiers, in order, along which packets sent on\nthis channel will travel" + }, + "version": { + "type": "string", + "title": "opaque channel version, which is agreed upon during the handshake" + }, + "port_id": { + "type": "string", + "title": "port identifier" + }, + "channel_id": { + "type": "string", + "title": "channel identifier" + }, + "upgrade_sequence": { + "type": "string", + "format": "uint64", + "title": "upgrade sequence indicates the latest upgrade attempt performed by this channel\nthe value of 0 indicates the channel has never been upgraded" } - } - } - } - } - } - } - } - } - }, - "/ibc/apps/transfer/v1/channels/{channel_id}/ports/{port_id}/escrow_address": { - "get": { - "tags": [ - "Query" - ], - "summary": "EscrowAddress returns the escrow address for a particular port and channel id.", - "operationId": "EscrowAddress", - "parameters": [ - { - "name": "channel_id", - "in": "path", - "description": "unique channel identifier", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "port_id", - "in": "path", - "description": "unique port identifier", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "escrow_address": { - "title": "the escrow account address", - "type": "string" - } + }, + "description": "IdentifiedChannel defines a channel with additional port and channel\nidentifier fields." }, - "description": "QueryEscrowAddressResponse is the response type of the EscrowAddress RPC method." - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { + "description": "list of stored channels of the chain." + }, + "pagination": { + "title": "pagination response", "type": "object", "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" } - } - } - } - } - } - } - } - }, - "/ibc/apps/transfer/v1/denom_hashes/{trace}": { - "get": { - "tags": [ - "Query" - ], - "summary": "DenomHash queries a denomination hash information.", - "operationId": "DenomHash", - "parameters": [ - { - "name": "trace", - "in": "path", - "description": "The denomination trace ([port_id]/[channel_id])+/[denom]", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { + }, + "description": "PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }" + }, + "height": { + "title": "query block height", "type": "object", "properties": { - "hash": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { "type": "string", - "description": "hash (in hex format) of the denomination trace information." + "format": "uint64", + "title": "the height within the given revision" } }, - "description": "QueryDenomHashResponse is the response type for the Query/DenomHash RPC\nmethod." + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" } - } + }, + "description": "QueryChannelsResponse is the response type for the Query/Channels RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/ibc/apps/transfer/v1/denom_traces": { - "get": { - "tags": [ - "Query" - ], - "summary": "DenomTraces queries all denomination traces.", - "operationId": "DenomTraces", + }, "parameters": [ { "name": "pagination.key", - "in": "query", "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } + "in": "query", + "required": false, + "type": "string", + "format": "byte" }, { "name": "pagination.offset", - "in": "query", "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.limit", - "in": "query", "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.count_total", - "in": "query", "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } + "in": "query", + "required": false, + "type": "boolean" }, { "name": "pagination.reverse", - "in": "query", "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } + "in": "query", + "required": false, + "type": "boolean" } ], + "tags": [ + "Query" + ] + } + }, + "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}": { + "get": { + "summary": "Channel queries an IBC Channel.", + "operationId": "Channel", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "channel": { + "title": "channel associated with the request identifiers", "type": "object", "properties": { - "denom_traces": { - "type": "array", - "description": "denom_traces returns all denominations trace information.", - "items": { - "type": "object", - "properties": { - "path": { - "type": "string", - "description": "path defines the chain of port/channel identifiers used for tracing the\nsource of the fungible token." - }, - "base_denom": { - "type": "string", - "description": "base denomination of the relayed fungible token." - } - }, - "description": "DenomTrace contains the base denomination for ICS20 fungible tokens and the\nsource tracing information path." - } - }, - "pagination": { + "state": { + "title": "current state of the channel end", + "type": "string", + "enum": [ + "STATE_UNINITIALIZED_UNSPECIFIED", + "STATE_INIT", + "STATE_TRYOPEN", + "STATE_OPEN", + "STATE_CLOSED", + "STATE_FLUSHING", + "STATE_FLUSHCOMPLETE" + ], + "default": "STATE_UNINITIALIZED_UNSPECIFIED", + "description": "State defines if a channel is in one of the following states:\nCLOSED, INIT, TRYOPEN, OPEN, FLUSHING, FLUSHCOMPLETE or UNINITIALIZED.\n\n - STATE_UNINITIALIZED_UNSPECIFIED: Default State\n - STATE_INIT: A channel has just started the opening handshake.\n - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain.\n - STATE_OPEN: A channel has completed the handshake. Open channels are\nready to send and receive packets.\n - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive\npackets.\n - STATE_FLUSHING: A channel has just accepted the upgrade handshake attempt and is flushing in-flight packets.\n - STATE_FLUSHCOMPLETE: A channel has just completed flushing any in-flight packets." + }, + "ordering": { + "title": "whether the channel is ordered or unordered", + "type": "string", + "enum": [ + "ORDER_NONE_UNSPECIFIED", + "ORDER_UNORDERED", + "ORDER_ORDERED" + ], + "default": "ORDER_NONE_UNSPECIFIED", + "description": "- ORDER_NONE_UNSPECIFIED: zero-value for channel ordering\n - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in\nwhich they were sent.\n - ORDER_ORDERED: packets are delivered exactly in the order which they were sent" + }, + "counterparty": { + "title": "counterparty channel end", "type": "object", "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "port_id": { "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" + "description": "port on the counterparty chain which owns the other end of the channel." }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", + "channel_id": { "type": "string", - "format": "uint64" + "title": "channel end on the counterparty chain" } + } + }, + "connection_hops": { + "type": "array", + "items": { + "type": "string" }, - "description": "pagination defines the pagination in the response." + "title": "list of connection identifiers, in order, along which packets sent on\nthis channel will travel" + }, + "version": { + "type": "string", + "title": "opaque channel version, which is agreed upon during the handshake" + }, + "upgrade_sequence": { + "type": "string", + "format": "uint64", + "title": "upgrade sequence indicates the latest upgrade attempt performed by this channel\nthe value of 0 indicates the channel has never been upgraded" + } + }, + "description": "Channel defines pipeline for exactly-once packet delivery between specific\nmodules on separate blockchains, which has at least one end capable of\nsending packets and one end capable of receiving packets." + }, + "proof": { + "type": "string", + "format": "byte", + "title": "merkle proof of existence" + }, + "proof_height": { + "title": "height at which the proof was retrieved", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" } }, - "description": "QueryConnectionsResponse is the response type for the Query/DenomTraces RPC\nmethod." + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" } - } + }, + "description": "QueryChannelResponse is the response type for the Query/Channel RPC method.\nBesides the Channel end, it includes a proof and the height from which the\nproof was retrieved." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/ibc/apps/transfer/v1/denom_traces/{hash}": { - "get": { - "tags": [ - "Query" - ], - "summary": "DenomTrace queries a denomination trace information.", - "operationId": "DenomTrace", + }, "parameters": [ { - "name": "hash", + "name": "channel_id", + "description": "channel unique identifier", "in": "path", - "description": "hash (in hex format) or denom (full denom with ibc prefix) of the denomination trace information.", "required": true, - "schema": { - "type": "string" - } + "type": "string" + }, + { + "name": "port_id", + "description": "port unique identifier", + "in": "path", + "required": true, + "type": "string" } ], + "tags": [ + "Query" + ] + } + }, + "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/client_state": { + "get": { + "summary": "ChannelClientState queries for the client state for the channel associated\nwith the provided channel identifiers.", + "operationId": "ChannelClientState", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "identified_client_state": { + "title": "client state associated with the channel", "type": "object", "properties": { - "denom_trace": { + "client_id": { + "type": "string", + "title": "client identifier" + }, + "client_state": { "type": "object", "properties": { - "path": { + "type_url": { "type": "string", - "description": "path defines the chain of port/channel identifiers used for tracing the\nsource of the fungible token." + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." }, - "base_denom": { + "value": { "type": "string", - "description": "base denomination of the relayed fungible token." + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } }, - "description": "DenomTrace contains the base denomination for ICS20 fungible tokens and the\nsource tracing information path." + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }", + "title": "client state" + } + }, + "description": "IdentifiedClientState defines a client state with an additional client\nidentifier field." + }, + "proof": { + "type": "string", + "format": "byte", + "title": "merkle proof of existence" + }, + "proof_height": { + "title": "height at which the proof was retrieved", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" } }, - "description": "QueryDenomTraceResponse is the response type for the Query/DenomTrace RPC\nmethod." + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" } - } + }, + "title": "QueryChannelClientStateResponse is the Response type for the\nQuery/QueryChannelClientState RPC method" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/ibc/apps/transfer/v1/denoms/{denom}/total_escrow": { - "get": { - "tags": [ - "Query" - ], - "summary": "TotalEscrowForDenom returns the total amount of tokens in escrow based on the denom.", - "operationId": "TotalEscrowForDenom", + }, "parameters": [ { - "name": "denom", + "name": "channel_id", + "description": "channel unique identifier", "in": "path", "required": true, - "schema": { - "type": "string" - } + "type": "string" + }, + { + "name": "port_id", + "description": "port unique identifier", + "in": "path", + "required": true, + "type": "string" } ], + "tags": [ + "Query" + ] + } + }, + "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/consensus_state/revision/{revision_number}/height/{revision_height}": { + "get": { + "summary": "ChannelConsensusState queries for the consensus state for the channel\nassociated with the provided channel identifiers.", + "operationId": "ChannelConsensusState", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "consensus_state": { "type": "object", "properties": { - "amount": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }", + "title": "consensus state associated with the channel" + }, + "client_id": { + "type": "string", + "title": "client ID associated with the consensus state" + }, + "proof": { + "type": "string", + "format": "byte", + "title": "merkle proof of existence" + }, + "proof_height": { + "title": "height at which the proof was retrieved", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" } }, - "description": "QueryTotalEscrowForDenomResponse is the response type for TotalEscrowForDenom RPC method." + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" } - } + }, + "title": "QueryChannelClientStateResponse is the Response type for the\nQuery/QueryChannelClientState RPC method" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } + }, + "parameters": [ + { + "name": "channel_id", + "description": "channel unique identifier", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "port_id", + "description": "port unique identifier", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "revision_number", + "description": "revision number of the consensus state", + "in": "path", + "required": true, + "type": "string", + "format": "uint64" + }, + { + "name": "revision_height", + "description": "revision height of the consensus state", + "in": "path", + "required": true, + "type": "string", + "format": "uint64" + } + ], + "tags": [ + "Query" + ] } }, - "/ibc/apps/transfer/v1/params": { + "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/next_sequence": { "get": { - "tags": [ - "Query" - ], - "summary": "Params queries all parameters of the ibc-transfer module.", - "operationId": "TransferParams", + "summary": "NextSequenceReceive returns the next receive sequence for a given channel.", + "operationId": "NextSequenceReceive", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "next_sequence_receive": { + "type": "string", + "format": "uint64", + "title": "next sequence receive number" + }, + "proof": { + "type": "string", + "format": "byte", + "title": "merkle proof of existence" + }, + "proof_height": { + "title": "height at which the proof was retrieved", "type": "object", "properties": { - "params": { - "type": "object", - "properties": { - "send_enabled": { - "type": "boolean", - "description": "send_enabled enables or disables all cross-chain token transfers from this\nchain." - }, - "receive_enabled": { - "type": "boolean", - "description": "receive_enabled enables or disables all cross-chain token transfers to this\nchain." - } - }, - "description": "params defines the parameters of the module." + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" } }, - "description": "QueryParamsResponse is the response type for the Query/Params RPC method." + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" } - } + }, + "title": "QuerySequenceResponse is the response type for the\nQuery/QueryNextSequenceReceiveResponse RPC method" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/ibc/core/client/v1/client_states": { - "get": { - "tags": [ - "Query" - ], - "summary": "ClientStates queries all the IBC light clients of a chain.", - "operationId": "ClientStates", + }, "parameters": [ { - "name": "pagination.key", - "in": "query", - "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } - }, - { - "name": "pagination.offset", - "in": "query", - "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.limit", - "in": "query", - "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } + "name": "channel_id", + "description": "channel unique identifier", + "in": "path", + "required": true, + "type": "string" }, { - "name": "pagination.count_total", - "in": "query", - "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } - }, - { - "name": "pagination.reverse", - "in": "query", - "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } + "name": "port_id", + "description": "port unique identifier", + "in": "path", + "required": true, + "type": "string" } ], + "tags": [ + "Query" + ] + } + }, + "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/next_sequence_send": { + "get": { + "summary": "NextSequenceSend returns the next send sequence for a given channel.", + "operationId": "NextSequenceSend", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "next_sequence_send": { + "type": "string", + "format": "uint64", + "title": "next sequence send number" + }, + "proof": { + "type": "string", + "format": "byte", + "title": "merkle proof of existence" + }, + "proof_height": { + "title": "height at which the proof was retrieved", "type": "object", "properties": { - "client_states": { - "type": "array", - "description": "list of stored ClientStates of the chain.", - "items": { - "type": "object", - "properties": { - "client_id": { - "title": "client identifier", - "type": "string" - }, - "client_state": { - "title": "client state", - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - }, - "description": "IdentifiedClientState defines a client state with an additional client\nidentifier field." - } + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" }, - "pagination": { - "title": "pagination response", - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }" + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" } }, - "description": "QueryClientStatesResponse is the response type for the Query/ClientStates RPC\nmethod." + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" } - } + }, + "title": "QueryNextSequenceSendResponse is the request type for the\nQuery/QueryNextSequenceSend RPC method" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/ibc/core/client/v1/client_states/{client_id}": { - "get": { - "tags": [ - "Query" - ], - "summary": "ClientState queries an IBC light client.", - "operationId": "ClientState", + }, "parameters": [ { - "name": "client_id", + "name": "channel_id", + "description": "channel unique identifier", "in": "path", - "description": "client state unique identifier", "required": true, - "schema": { - "type": "string" - } + "type": "string" + }, + { + "name": "port_id", + "description": "port unique identifier", + "in": "path", + "required": true, + "type": "string" } ], + "tags": [ + "Query" + ] + } + }, + "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_acknowledgements": { + "get": { + "summary": "PacketAcknowledgements returns all the packet acknowledgements associated\nwith a channel.", + "operationId": "PacketAcknowledgements", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "acknowledgements": { + "type": "array", + "items": { + "type": "object", + "properties": { + "port_id": { + "type": "string", + "description": "channel port identifier." + }, + "channel_id": { + "type": "string", + "description": "channel unique identifier." + }, + "sequence": { + "type": "string", + "format": "uint64", + "description": "packet sequence." + }, + "data": { + "type": "string", + "format": "byte", + "description": "embedded data that represents packet state." + } + }, + "description": "PacketState defines the generic type necessary to retrieve and store\npacket commitments, acknowledgements, and receipts.\nCaller is responsible for knowing the context necessary to interpret this\nstate as a commitment, acknowledgement, or a receipt." + } + }, + "pagination": { + "title": "pagination response", "type": "object", "properties": { - "client_state": { - "title": "client state associated with the request identifier", - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." }, - "proof": { - "title": "merkle proof of existence", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "total": { "type": "string", - "format": "byte" + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + }, + "description": "PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }" + }, + "height": { + "title": "query block height", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" }, - "proof_height": { - "title": "height at which the proof was retrieved", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" } }, - "description": "QueryClientStateResponse is the response type for the Query/ClientState RPC\nmethod. Besides the client state, it includes a proof and the height from\nwhich the proof was retrieved." + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" } - } + }, + "title": "QueryPacketAcknowledgemetsResponse is the request type for the\nQuery/QueryPacketAcknowledgements RPC method" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/ibc/core/client/v1/client_status/{client_id}": { - "get": { - "tags": [ - "Query" - ], - "summary": "Status queries the status of an IBC client.", - "operationId": "ClientStatus", + }, "parameters": [ { - "name": "client_id", + "name": "channel_id", + "description": "channel unique identifier", "in": "path", - "description": "client unique identifier", "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "status": { - "type": "string" - } - }, - "description": "QueryClientStatusResponse is the response type for the Query/ClientStatus RPC\nmethod. It returns the current status of the IBC client." - } - } - } + "type": "string" }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - } - } - } - } - } - } - } - }, - "/ibc/core/client/v1/consensus_states/{client_id}": { - "get": { - "tags": [ - "Query" - ], - "summary": "ConsensusStates queries all the consensus state associated with a given\nclient.", - "operationId": "ConsensusStates", - "parameters": [ { - "name": "client_id", + "name": "port_id", + "description": "port unique identifier", "in": "path", - "description": "client identifier", "required": true, - "schema": { - "type": "string" - } + "type": "string" }, { "name": "pagination.key", - "in": "query", "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } + "in": "query", + "required": false, + "type": "string", + "format": "byte" }, { "name": "pagination.offset", - "in": "query", "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.limit", - "in": "query", "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.count_total", - "in": "query", "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } + "in": "query", + "required": false, + "type": "boolean" }, { "name": "pagination.reverse", - "in": "query", "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } + "in": "query", + "required": false, + "type": "boolean" + }, + { + "name": "packet_commitment_sequences", + "description": "list of packet sequences.", + "in": "query", + "required": false, + "type": "array", + "items": { + "type": "string", + "format": "uint64" + }, + "collectionFormat": "multi" } ], + "tags": [ + "Query" + ] + } + }, + "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_acks/{sequence}": { + "get": { + "summary": "PacketAcknowledgement queries a stored packet acknowledgement hash.", + "operationId": "PacketAcknowledgement", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "title": "QueryConsensusStatesResponse is the response type for the\nQuery/ConsensusStates RPC method", + "schema": { + "type": "object", + "properties": { + "acknowledgement": { + "type": "string", + "format": "byte", + "title": "packet associated with the request fields" + }, + "proof": { + "type": "string", + "format": "byte", + "title": "merkle proof of existence" + }, + "proof_height": { + "title": "height at which the proof was retrieved", "type": "object", "properties": { - "consensus_states": { - "title": "consensus states associated with the identifier", - "type": "array", - "items": { - "type": "object", - "properties": { - "height": { - "title": "consensus state height", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - }, - "consensus_state": { - "title": "consensus state", - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - }, - "description": "ConsensusStateWithHeight defines a consensus state with an additional height\nfield." - } + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" }, - "pagination": { - "title": "pagination response", - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }" + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" } - } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" } - } + }, + "title": "QueryPacketAcknowledgementResponse defines the client query response for a\npacket which also includes a proof and the height from which the\nproof was retrieved" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/ibc/core/client/v1/consensus_states/{client_id}/heights": { - "get": { - "tags": [ - "Query" - ], - "summary": "ConsensusStateHeights queries the height of every consensus states associated with a given client.", - "operationId": "ConsensusStateHeights", + }, "parameters": [ { - "name": "client_id", + "name": "channel_id", + "description": "channel unique identifier", "in": "path", - "description": "client identifier", "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "pagination.key", - "in": "query", - "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } - }, - { - "name": "pagination.offset", - "in": "query", - "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.limit", - "in": "query", - "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } + "type": "string" }, { - "name": "pagination.count_total", - "in": "query", - "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } + "name": "port_id", + "description": "port unique identifier", + "in": "path", + "required": true, + "type": "string" }, { - "name": "pagination.reverse", - "in": "query", - "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } + "name": "sequence", + "description": "packet sequence", + "in": "path", + "required": true, + "type": "string", + "format": "uint64" } ], + "tags": [ + "Query" + ] + } + }, + "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_commitments": { + "get": { + "summary": "PacketCommitments returns all the packet commitments hashes associated\nwith a channel.", + "operationId": "PacketCommitments", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "title": "QueryConsensusStateHeightsResponse is the response type for the\nQuery/ConsensusStateHeights RPC method", + "schema": { + "type": "object", + "properties": { + "commitments": { + "type": "array", + "items": { + "type": "object", + "properties": { + "port_id": { + "type": "string", + "description": "channel port identifier." + }, + "channel_id": { + "type": "string", + "description": "channel unique identifier." + }, + "sequence": { + "type": "string", + "format": "uint64", + "description": "packet sequence." + }, + "data": { + "type": "string", + "format": "byte", + "description": "embedded data that represents packet state." + } + }, + "description": "PacketState defines the generic type necessary to retrieve and store\npacket commitments, acknowledgements, and receipts.\nCaller is responsible for knowing the context necessary to interpret this\nstate as a commitment, acknowledgement, or a receipt." + } + }, + "pagination": { + "title": "pagination response", "type": "object", "properties": { - "consensus_state_heights": { - "title": "consensus state heights", - "type": "array", - "items": { - "title": "Height is a monotonically increasing data type\nthat can be compared against another Height for the purposes of updating and\nfreezing clients", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - } + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." }, - "pagination": { - "title": "pagination response", - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }" + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" } - } + }, + "description": "PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }" + }, + "height": { + "title": "query block height", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" } - } + }, + "title": "QueryPacketCommitmentsResponse is the request type for the\nQuery/QueryPacketCommitments RPC method" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/ibc/core/client/v1/consensus_states/{client_id}/revision/{revision_number}/height/{revision_height}": { - "get": { - "tags": [ - "Query" - ], - "summary": "ConsensusState queries a consensus state associated with a client state at\na given height.", - "operationId": "ConsensusState", + }, "parameters": [ { - "name": "client_id", + "name": "channel_id", + "description": "channel unique identifier", "in": "path", - "description": "client identifier", "required": true, - "schema": { - "type": "string" - } + "type": "string" }, { - "name": "revision_number", + "name": "port_id", + "description": "port unique identifier", "in": "path", - "description": "consensus state revision number", "required": true, - "schema": { - "type": "string", - "format": "uint64" - } + "type": "string" }, { - "name": "revision_height", - "in": "path", - "description": "consensus state revision height", - "required": true, - "schema": { - "type": "string", - "format": "uint64" - } + "name": "pagination.key", + "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", + "in": "query", + "required": false, + "type": "string", + "format": "byte" }, { - "name": "latest_height", + "name": "pagination.offset", + "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", "in": "query", - "description": "latest_height overrrides the height field and queries the latest stored\nConsensusState.", - "schema": { - "type": "boolean" - } + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.limit", + "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.count_total", + "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", + "in": "query", + "required": false, + "type": "boolean" + }, + { + "name": "pagination.reverse", + "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", + "in": "query", + "required": false, + "type": "boolean" } ], - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "title": "QueryConsensusStateResponse is the response type for the Query/ConsensusState\nRPC method", + "tags": [ + "Query" + ] + } + }, + "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_commitments/{packet_ack_sequences}/unreceived_acks": { + "get": { + "summary": "UnreceivedAcks returns all the unreceived IBC acknowledgements associated\nwith a channel and sequences.", + "operationId": "UnreceivedAcks", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "type": "object", + "properties": { + "sequences": { + "type": "array", + "items": { + "type": "string", + "format": "uint64" + }, + "title": "list of unreceived acknowledgement sequences" + }, + "height": { + "title": "query block height", "type": "object", "properties": { - "consensus_state": { - "title": "consensus state associated with the client identifier at the given height", - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "proof": { - "title": "merkle proof of existence", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "revision_number": { "type": "string", - "format": "byte" + "format": "uint64", + "title": "the revision that the client is currently on" }, - "proof_height": { - "title": "Height is a monotonically increasing data type\nthat can be compared against another Height for the purposes of updating and\nfreezing clients", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" } - } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" } - } + }, + "title": "QueryUnreceivedAcksResponse is the response type for the\nQuery/UnreceivedAcks RPC method" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } + }, + "parameters": [ + { + "name": "channel_id", + "description": "channel unique identifier", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "port_id", + "description": "port unique identifier", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "packet_ack_sequences", + "description": "list of acknowledgement sequences", + "in": "path", + "required": true, + "type": "array", + "items": { + "type": "string", + "format": "uint64" + }, + "collectionFormat": "csv", + "minItems": 1 + } + ], + "tags": [ + "Query" + ] } }, - "/ibc/core/client/v1/params": { + "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_commitments/{packet_commitment_sequences}/unreceived_packets": { "get": { - "tags": [ - "Query" - ], - "summary": "ClientParams queries all parameters of the ibc client submodule.", - "operationId": "ClientParams", + "summary": "UnreceivedPackets returns all the unreceived IBC packets associated with a\nchannel and sequences.", + "operationId": "UnreceivedPackets", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "sequences": { + "type": "array", + "items": { + "type": "string", + "format": "uint64" + }, + "title": "list of unreceived packet sequences" + }, + "height": { + "title": "query block height", "type": "object", "properties": { - "params": { - "type": "object", - "properties": { - "allowed_clients": { - "type": "array", - "description": "allowed_clients defines the list of allowed client state types which can be created\nand interacted with. If a client type is removed from the allowed clients list, usage\nof this client will be disabled until it is added again to the list.", - "items": { - "type": "string" - } - } - }, - "description": "params defines the parameters of the module." + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" } }, - "description": "QueryClientParamsResponse is the response type for the Query/ClientParams RPC\nmethod." + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" } - } + }, + "title": "QueryUnreceivedPacketsResponse is the response type for the\nQuery/UnreceivedPacketCommitments RPC method" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } + }, + "parameters": [ + { + "name": "channel_id", + "description": "channel unique identifier", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "port_id", + "description": "port unique identifier", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "packet_commitment_sequences", + "description": "list of packet sequences", + "in": "path", + "required": true, + "type": "array", + "items": { + "type": "string", + "format": "uint64" + }, + "collectionFormat": "csv", + "minItems": 1 + } + ], + "tags": [ + "Query" + ] } }, - "/ibc/core/client/v1/upgraded_client_states": { + "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_commitments/{sequence}": { "get": { - "tags": [ - "Query" - ], - "summary": "UpgradedClientState queries an Upgraded IBC light client.", - "operationId": "UpgradedClientState", + "summary": "PacketCommitment queries a stored packet commitment hash.", + "operationId": "PacketCommitment", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "commitment": { + "type": "string", + "format": "byte", + "title": "packet associated with the request fields" + }, + "proof": { + "type": "string", + "format": "byte", + "title": "merkle proof of existence" + }, + "proof_height": { + "title": "height at which the proof was retrieved", "type": "object", "properties": { - "upgraded_client_state": { - "title": "client state associated with the request identifier", - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" } }, - "description": "QueryUpgradedClientStateResponse is the response type for the\nQuery/UpgradedClientState RPC method." + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" } - } + }, + "title": "QueryPacketCommitmentResponse defines the client query response for a packet\nwhich also includes a proof and the height from which the proof was\nretrieved" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } + }, + "parameters": [ + { + "name": "channel_id", + "description": "channel unique identifier", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "port_id", + "description": "port unique identifier", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "sequence", + "description": "packet sequence", + "in": "path", + "required": true, + "type": "string", + "format": "uint64" + } + ], + "tags": [ + "Query" + ] } }, - "/ibc/core/client/v1/upgraded_consensus_states": { + "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_receipts/{sequence}": { "get": { - "tags": [ - "Query" - ], - "summary": "UpgradedConsensusState queries an Upgraded IBC consensus state.", - "operationId": "UpgradedConsensusState", + "summary": "PacketReceipt queries if a given packet sequence has been received on the\nqueried chain", + "operationId": "PacketReceipt", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "received": { + "type": "boolean", + "title": "success flag for if receipt exists" + }, + "proof": { + "type": "string", + "format": "byte", + "title": "merkle proof of existence" + }, + "proof_height": { + "title": "height at which the proof was retrieved", "type": "object", "properties": { - "upgraded_consensus_state": { - "title": "Consensus state associated with the request identifier", - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" } }, - "description": "QueryUpgradedConsensusStateResponse is the response type for the\nQuery/UpgradedConsensusState RPC method." + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" } - } + }, + "title": "QueryPacketReceiptResponse defines the client query response for a packet\nreceipt which also includes a proof, and the height from which the proof was\nretrieved" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/ibc/core/connection/v1/client_connections/{client_id}": { - "get": { - "tags": [ - "Query" - ], - "summary": "ClientConnections queries the connection paths associated with a client\nstate.", - "operationId": "ClientConnections", + }, "parameters": [ { - "name": "client_id", + "name": "channel_id", + "description": "channel unique identifier", "in": "path", - "description": "client identifier associated with a connection", "required": true, - "schema": { - "type": "string" - } + "type": "string" + }, + { + "name": "port_id", + "description": "port unique identifier", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "sequence", + "description": "packet sequence", + "in": "path", + "required": true, + "type": "string", + "format": "uint64" } ], + "tags": [ + "Query" + ] + } + }, + "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/upgrade": { + "get": { + "summary": "Upgrade returns the upgrade for a given port and channel id.", + "operationId": "Upgrade", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "title": "QueryClientConnectionsResponse is the response type for the\nQuery/ClientConnections RPC method", + "schema": { + "type": "object", + "properties": { + "upgrade": { "type": "object", "properties": { - "connection_paths": { - "type": "array", - "description": "slice of all the connection paths associated with a client.", - "items": { - "type": "string" - } - }, - "proof": { - "title": "merkle proof of existence", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proof_height": { - "title": "height at which the proof was generated", + "fields": { "type": "object", "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", + "ordering": { "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + "enum": [ + "ORDER_NONE_UNSPECIFIED", + "ORDER_UNORDERED", + "ORDER_ORDERED" + ], + "default": "ORDER_NONE_UNSPECIFIED", + "description": "- ORDER_NONE_UNSPECIFIED: zero-value for channel ordering\n - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in\nwhich they were sent.\n - ORDER_ORDERED: packets are delivered exactly in the order which they were sent", + "title": "Order defines if a channel is ORDERED or UNORDERED" + }, + "connection_hops": { + "type": "array", + "items": { + "type": "string" + } + }, + "version": { + "type": "string" + } + }, + "description": "UpgradeFields are the fields in a channel end which may be changed\nduring a channel upgrade." + }, + "timeout": { + "type": "object", + "properties": { + "height": { + "title": "block height after which the packet or upgrade times out", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + }, + "timestamp": { + "type": "string", + "format": "uint64", + "title": "block timestamp (in nanoseconds) after which the packet or upgrade times out" + } + }, + "description": "Timeout defines an execution deadline structure for 04-channel handlers.\nThis includes packet lifecycle handlers as well as the upgrade handshake handlers.\nA valid Timeout contains either one or both of a timestamp and block height (sequence)." + }, + "next_sequence_send": { + "type": "string", + "format": "uint64" } - } + }, + "description": "Upgrade is a verifiable type which contains the relevant information\nfor an attempted upgrade. It provides the proposed changes to the channel\nend, the timeout for this upgrade attempt and the next packet sequence\nwhich allows the counterparty to efficiently know the highest sequence it has received.\nThe next sequence send is used for pruning and upgrading from unordered to ordered channels." + }, + "proof": { + "type": "string", + "format": "byte", + "title": "merkle proof of existence" + }, + "proof_height": { + "title": "height at which the proof was retrieved", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" } - } + }, + "title": "QueryUpgradeResponse is the response type for the QueryUpgradeResponse RPC method" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/ibc/core/connection/v1/connections": { - "get": { - "tags": [ - "Query" - ], - "summary": "Connections queries all the IBC connections of a chain.", - "operationId": "Connections", + }, "parameters": [ { - "name": "pagination.key", - "in": "query", - "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } + "name": "channel_id", + "in": "path", + "required": true, + "type": "string" }, { - "name": "pagination.offset", - "in": "query", - "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", + "name": "port_id", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "Query" + ] + } + }, + "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/upgrade_error": { + "get": { + "summary": "UpgradeError returns the error receipt if the upgrade handshake failed.", + "operationId": "UpgradeError", + "responses": { + "200": { + "description": "A successful response.", "schema": { - "type": "string", - "format": "uint64" + "type": "object", + "properties": { + "error_receipt": { + "type": "object", + "properties": { + "sequence": { + "type": "string", + "format": "uint64", + "title": "the channel upgrade sequence" + }, + "message": { + "type": "string", + "title": "the error message detailing the cause of failure" + } + }, + "description": "ErrorReceipt defines a type which encapsulates the upgrade sequence and error associated with the\nupgrade handshake failure. When a channel upgrade handshake is aborted both chains are expected to increment to the\nnext sequence." + }, + "proof": { + "type": "string", + "format": "byte", + "title": "merkle proof of existence" + }, + "proof_height": { + "title": "height at which the proof was retrieved", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + } + }, + "title": "QueryUpgradeErrorResponse is the response type for the Query/QueryUpgradeError RPC method" } }, - { - "name": "pagination.limit", - "in": "query", - "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", + "default": { + "description": "An unexpected error response.", "schema": { - "type": "string", - "format": "uint64" + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } + } + } } - }, + } + }, + "parameters": [ { - "name": "pagination.count_total", - "in": "query", - "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } + "name": "channel_id", + "in": "path", + "required": true, + "type": "string" }, { - "name": "pagination.reverse", - "in": "query", - "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } + "name": "port_id", + "in": "path", + "required": true, + "type": "string" } ], + "tags": [ + "Query" + ] + } + }, + "/ibc/core/channel/v1/connections/{connection}/channels": { + "get": { + "summary": "ConnectionChannels queries all the channels associated with a connection\nend.", + "operationId": "ConnectionChannels", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "connections": { - "type": "array", - "description": "list of stored connections of the chain.", - "items": { + "schema": { + "type": "object", + "properties": { + "channels": { + "type": "array", + "items": { + "type": "object", + "properties": { + "state": { + "title": "current state of the channel end", + "type": "string", + "enum": [ + "STATE_UNINITIALIZED_UNSPECIFIED", + "STATE_INIT", + "STATE_TRYOPEN", + "STATE_OPEN", + "STATE_CLOSED", + "STATE_FLUSHING", + "STATE_FLUSHCOMPLETE" + ], + "default": "STATE_UNINITIALIZED_UNSPECIFIED", + "description": "State defines if a channel is in one of the following states:\nCLOSED, INIT, TRYOPEN, OPEN, FLUSHING, FLUSHCOMPLETE or UNINITIALIZED.\n\n - STATE_UNINITIALIZED_UNSPECIFIED: Default State\n - STATE_INIT: A channel has just started the opening handshake.\n - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain.\n - STATE_OPEN: A channel has completed the handshake. Open channels are\nready to send and receive packets.\n - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive\npackets.\n - STATE_FLUSHING: A channel has just accepted the upgrade handshake attempt and is flushing in-flight packets.\n - STATE_FLUSHCOMPLETE: A channel has just completed flushing any in-flight packets." + }, + "ordering": { + "title": "whether the channel is ordered or unordered", + "type": "string", + "enum": [ + "ORDER_NONE_UNSPECIFIED", + "ORDER_UNORDERED", + "ORDER_ORDERED" + ], + "default": "ORDER_NONE_UNSPECIFIED", + "description": "- ORDER_NONE_UNSPECIFIED: zero-value for channel ordering\n - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in\nwhich they were sent.\n - ORDER_ORDERED: packets are delivered exactly in the order which they were sent" + }, + "counterparty": { + "title": "counterparty channel end", "type": "object", "properties": { - "id": { + "port_id": { "type": "string", - "description": "connection identifier." + "description": "port on the counterparty chain which owns the other end of the channel." }, - "client_id": { - "type": "string", - "description": "client associated with this connection." - }, - "versions": { - "title": "IBC version which can be utilised to determine encodings or protocols for\nchannels or packets utilising this connection", - "type": "array", - "items": { - "type": "object", - "properties": { - "identifier": { - "title": "unique version identifier", - "type": "string" - }, - "features": { - "title": "list of features compatible with the specified identifier", - "type": "array", - "items": { - "type": "string" - } - } - }, - "description": "Version defines the versioning scheme used to negotiate the IBC verison in\nthe connection handshake." - } - }, - "state": { - "type": "string", - "description": "current state of the connection end.", - "default": "STATE_UNINITIALIZED_UNSPECIFIED", - "enum": [ - "STATE_UNINITIALIZED_UNSPECIFIED", - "STATE_INIT", - "STATE_TRYOPEN", - "STATE_OPEN" - ] - }, - "counterparty": { - "type": "object", - "properties": { - "client_id": { - "type": "string", - "description": "identifies the client on the counterparty chain associated with a given\nconnection." - }, - "connection_id": { - "type": "string", - "description": "identifies the connection end on the counterparty chain associated with a\ngiven connection." - }, - "prefix": { - "title": "MerklePrefix is merkle path prefixed to the key.\nThe constructed key from the Path and the key will be append(Path.KeyPath,\nappend(Path.KeyPrefix, key...))", - "type": "object", - "properties": { - "key_prefix": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "commitment merkle prefix of the counterparty chain." - } - }, - "description": "counterparty chain associated with this connection." - }, - "delay_period": { + "channel_id": { "type": "string", - "description": "delay period associated with this connection.", - "format": "uint64" + "title": "channel end on the counterparty chain" } - }, - "description": "IdentifiedConnection defines a connection with additional connection\nidentifier field." - } - }, - "pagination": { - "title": "pagination response", - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" } }, - "description": "PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }" - }, - "height": { - "title": "query block height", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" + "connection_hops": { + "type": "array", + "items": { + "type": "string" }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } + "title": "list of connection identifiers, in order, along which packets sent on\nthis channel will travel" + }, + "version": { + "type": "string", + "title": "opaque channel version, which is agreed upon during the handshake" + }, + "port_id": { + "type": "string", + "title": "port identifier" }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + "channel_id": { + "type": "string", + "title": "channel identifier" + }, + "upgrade_sequence": { + "type": "string", + "format": "uint64", + "title": "upgrade sequence indicates the latest upgrade attempt performed by this channel\nthe value of 0 indicates the channel has never been upgraded" + } + }, + "description": "IdentifiedChannel defines a channel with additional port and channel\nidentifier fields." + }, + "description": "list of channels associated with a connection." + }, + "pagination": { + "title": "pagination response", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + }, + "description": "PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }" + }, + "height": { + "title": "query block height", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" } }, - "description": "QueryConnectionsResponse is the response type for the Query/Connections RPC\nmethod." + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" } - } + }, + "title": "QueryConnectionChannelsResponse is the Response type for the\nQuery/QueryConnectionChannels RPC method" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/ibc/core/connection/v1/connections/{connection_id}": { - "get": { - "tags": [ - "Query" - ], - "summary": "Connection queries an IBC connection end.", - "operationId": "Connection", + }, "parameters": [ { - "name": "connection_id", - "in": "path", + "name": "connection", "description": "connection unique identifier", + "in": "path", "required": true, - "schema": { - "type": "string" - } + "type": "string" + }, + { + "name": "pagination.key", + "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", + "in": "query", + "required": false, + "type": "string", + "format": "byte" + }, + { + "name": "pagination.offset", + "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.limit", + "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.count_total", + "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", + "in": "query", + "required": false, + "type": "boolean" + }, + { + "name": "pagination.reverse", + "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", + "in": "query", + "required": false, + "type": "boolean" } ], + "tags": [ + "Query" + ] + } + }, + "/ibc/core/channel/v1/params": { + "get": { + "summary": "ChannelParams queries all parameters of the ibc channel submodule.", + "operationId": "ChannelParams", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "params": { + "description": "params defines the parameters of the module.", "type": "object", "properties": { - "connection": { - "title": "connection associated with the request identifier", + "upgrade_timeout": { "type": "object", "properties": { - "client_id": { - "type": "string", - "description": "client associated with this connection." - }, - "versions": { - "type": "array", - "description": "IBC version which can be utilised to determine encodings or protocols for\nchannels or packets utilising this connection.", - "items": { - "type": "object", - "properties": { - "identifier": { - "title": "unique version identifier", - "type": "string" - }, - "features": { - "title": "list of features compatible with the specified identifier", - "type": "array", - "items": { - "type": "string" - } - } - }, - "description": "Version defines the versioning scheme used to negotiate the IBC verison in\nthe connection handshake." - } - }, - "state": { - "type": "string", - "description": "current state of the connection end.", - "default": "STATE_UNINITIALIZED_UNSPECIFIED", - "enum": [ - "STATE_UNINITIALIZED_UNSPECIFIED", - "STATE_INIT", - "STATE_TRYOPEN", - "STATE_OPEN" - ] - }, - "counterparty": { + "height": { + "title": "block height after which the packet or upgrade times out", "type": "object", "properties": { - "client_id": { + "revision_number": { "type": "string", - "description": "identifies the client on the counterparty chain associated with a given\nconnection." + "format": "uint64", + "title": "the revision that the client is currently on" }, - "connection_id": { + "revision_height": { "type": "string", - "description": "identifies the connection end on the counterparty chain associated with a\ngiven connection." - }, - "prefix": { - "title": "MerklePrefix is merkle path prefixed to the key.\nThe constructed key from the Path and the key will be append(Path.KeyPath,\nappend(Path.KeyPrefix, key...))", - "type": "object", - "properties": { - "key_prefix": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "commitment merkle prefix of the counterparty chain." + "format": "uint64", + "title": "the height within the given revision" } }, - "description": "counterparty chain associated with this connection." - }, - "delay_period": { - "type": "string", - "description": "delay period that must pass before a consensus state can be used for\npacket-verification NOTE: delay period logic is only implemented by some\nclients.", - "format": "uint64" - } - }, - "description": "ConnectionEnd defines a stateful object on a chain connected to another\nseparate one.\nNOTE: there must only be 2 defined ConnectionEnds to establish\na connection between two chains." - }, - "proof": { - "title": "merkle proof of existence", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proof_height": { - "title": "height at which the proof was retrieved", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" }, - "revision_height": { - "title": "the height within the given revision", + "timestamp": { "type": "string", - "format": "uint64" + "format": "uint64", + "title": "block timestamp (in nanoseconds) after which the packet or upgrade times out" } }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + "description": "Timeout defines an execution deadline structure for 04-channel handlers.\nThis includes packet lifecycle handlers as well as the upgrade handshake handlers.\nA valid Timeout contains either one or both of a timestamp and block height (sequence)." } - }, - "description": "QueryConnectionResponse is the response type for the Query/Connection RPC\nmethod. Besides the connection end, it includes a proof and the height from\nwhich the proof was retrieved." + } } - } + }, + "description": "QueryChannelParamsResponse is the response type for the Query/ChannelParams RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } + }, + "tags": [ + "Query" + ] } }, - "/ibc/core/connection/v1/connections/{connection_id}/client_state": { + "/cosmos/auth/v1beta1/account_info/{address}": { "get": { - "tags": [ - "Query" - ], - "summary": "ConnectionClientState queries the client state associated with the\nconnection.", - "operationId": "ConnectionClientState", - "parameters": [ - { - "name": "connection_id", - "in": "path", - "description": "connection identifier", - "required": true, - "schema": { - "type": "string" - } - } - ], + "summary": "AccountInfo queries account info which is common to all account types.", + "description": "Since: cosmos-sdk 0.47", + "operationId": "AccountInfo", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "title": "QueryConnectionClientStateResponse is the response type for the\nQuery/ConnectionClientState RPC method", + "schema": { + "type": "object", + "properties": { + "info": { + "description": "info is the account info which is represented by BaseAccount.", "type": "object", "properties": { - "identified_client_state": { - "title": "client state associated with the channel", - "type": "object", - "properties": { - "client_id": { - "title": "client identifier", - "type": "string" - }, - "client_state": { - "title": "client state", - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - }, - "description": "IdentifiedClientState defines a client state with an additional client\nidentifier field." - }, - "proof": { - "title": "merkle proof of existence", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" + "address": { + "type": "string" }, - "proof_height": { - "title": "height at which the proof was retrieved", + "pub_key": { "type": "object", "properties": { - "revision_number": { - "title": "the revision that the client is currently on", + "type_url": { "type": "string", - "format": "uint64" + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." }, - "revision_height": { - "title": "the height within the given revision", + "value": { "type": "string", - "format": "uint64" + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "account_number": { + "type": "string", + "format": "uint64" + }, + "sequence": { + "type": "string", + "format": "uint64" } } } - } + }, + "description": "QueryAccountInfoResponse is the Query/AccountInfo response type.\n\nSince: cosmos-sdk 0.47" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/ibc/core/connection/v1/connections/{connection_id}/consensus_state/revision/{revision_number}/height/{revision_height}": { - "get": { - "tags": [ - "Query" - ], - "summary": "ConnectionConsensusState queries the consensus state associated with the\nconnection.", - "operationId": "ConnectionConsensusState", + }, "parameters": [ { - "name": "connection_id", - "in": "path", - "description": "connection identifier", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "revision_number", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "revision_height", + "name": "address", + "description": "address is the account address string.", "in": "path", "required": true, - "schema": { - "type": "string", - "format": "uint64" - } + "type": "string" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/auth/v1beta1/accounts": { + "get": { + "summary": "Accounts returns all the existing accounts.", + "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.\n\nSince: cosmos-sdk 0.43", + "operationId": "Accounts", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "title": "QueryConnectionConsensusStateResponse is the response type for the\nQuery/ConnectionConsensusState RPC method", - "type": "object", - "properties": { - "consensus_state": { - "title": "consensus state associated with the channel", - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } + "schema": { + "type": "object", + "properties": { + "accounts": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "client_id": { - "title": "client ID associated with the consensus state", - "type": "string" + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } }, - "proof": { - "title": "merkle proof of existence", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "title": "accounts are the existing accounts" + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { "type": "string", - "format": "byte" + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." }, - "proof_height": { - "title": "height at which the proof was retrieved", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - } - } - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" } } } - } - } - } - } - } - }, - "/ibc/core/connection/v1/params": { - "get": { - "tags": [ - "Query" - ], - "summary": "ConnectionParams queries all parameters of the ibc connection submodule.", - "operationId": "ConnectionParams", - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "params": { - "type": "object", - "properties": { - "max_expected_time_per_block": { - "type": "string", - "description": "maximum expected time per block (in nanoseconds), used to enforce block delay. This parameter should reflect the\nlargest amount of time that the chain might reasonably take to produce the next block under normal operating\nconditions. A safe choice is 3-5x the expected time per block.", - "format": "uint64" - } - }, - "description": "params defines the parameters of the module." - } - }, - "description": "QueryConnectionParamsResponse is the response type for the Query/ConnectionParams RPC method." - } - } + }, + "description": "QueryAccountsResponse is the response type for the Query/Accounts RPC method.\n\nSince: cosmos-sdk 0.43" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/ibc/core/channel/v1/channels": { - "get": { - "tags": [ - "Query" - ], - "summary": "Channels queries all the IBC channels of a chain.", - "operationId": "Channels", + }, "parameters": [ { "name": "pagination.key", - "in": "query", "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } + "in": "query", + "required": false, + "type": "string", + "format": "byte" }, { "name": "pagination.offset", - "in": "query", "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.limit", - "in": "query", "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.count_total", - "in": "query", "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } + "in": "query", + "required": false, + "type": "boolean" }, { "name": "pagination.reverse", - "in": "query", "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } + "in": "query", + "required": false, + "type": "boolean" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/auth/v1beta1/accounts/{address}": { + "get": { + "summary": "Account returns account details based on address.", + "operationId": "AuthAccount", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "account": { "type": "object", "properties": { - "channels": { - "type": "array", - "description": "list of stored channels of the chain.", - "items": { - "type": "object", - "properties": { - "state": { - "title": "current state of the channel end", - "type": "string", - "description": "State defines if a channel is in one of the following states:\nCLOSED, INIT, TRYOPEN, OPEN or UNINITIALIZED.\n\n - STATE_UNINITIALIZED_UNSPECIFIED: Default State\n - STATE_INIT: A channel has just started the opening handshake.\n - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain.\n - STATE_OPEN: A channel has completed the handshake. Open channels are\nready to send and receive packets.\n - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive\npackets.", - "default": "STATE_UNINITIALIZED_UNSPECIFIED", - "enum": [ - "STATE_UNINITIALIZED_UNSPECIFIED", - "STATE_INIT", - "STATE_TRYOPEN", - "STATE_OPEN", - "STATE_CLOSED" - ] - }, - "ordering": { - "title": "whether the channel is ordered or unordered", - "type": "string", - "description": "- ORDER_NONE_UNSPECIFIED: zero-value for channel ordering\n - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in\nwhich they were sent.\n - ORDER_ORDERED: packets are delivered exactly in the order which they were sent", - "default": "ORDER_NONE_UNSPECIFIED", - "enum": [ - "ORDER_NONE_UNSPECIFIED", - "ORDER_UNORDERED", - "ORDER_ORDERED" - ] - }, - "counterparty": { - "title": "counterparty channel end", - "type": "object", - "properties": { - "port_id": { - "type": "string", - "description": "port on the counterparty chain which owns the other end of the channel." - }, - "channel_id": { - "title": "channel end on the counterparty chain", - "type": "string" - } - } - }, - "connection_hops": { - "title": "list of connection identifiers, in order, along which packets sent on\nthis channel will travel", - "type": "array", - "items": { - "type": "string" - } - }, - "version": { - "title": "opaque channel version, which is agreed upon during the handshake", - "type": "string" - }, - "port_id": { - "title": "port identifier", - "type": "string" - }, - "channel_id": { - "title": "channel identifier", - "type": "string" - } - }, - "description": "IdentifiedChannel defines a channel with additional port and channel\nidentifier fields." - } - }, - "pagination": { - "title": "pagination response", - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }" + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." }, - "height": { - "title": "query block height", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } }, - "description": "QueryChannelsResponse is the response type for the Query/Channels RPC method." + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } - } + }, + "description": "QueryAccountResponse is the response type for the Query/Account RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}": { - "get": { - "tags": [ - "Query" - ], - "summary": "Channel queries an IBC Channel.", - "operationId": "Channel", + }, "parameters": [ { - "name": "channel_id", - "in": "path", - "description": "channel unique identifier", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "port_id", + "name": "address", + "description": "address defines the address to query for.", "in": "path", - "description": "port unique identifier", "required": true, - "schema": { - "type": "string" - } + "type": "string" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/auth/v1beta1/address_by_id/{id}": { + "get": { + "summary": "AccountAddressByID returns account address based on account number.", + "description": "Since: cosmos-sdk 0.46.2", + "operationId": "AccountAddressByID", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "channel": { - "title": "channel associated with the request identifiers", - "type": "object", - "properties": { - "state": { - "title": "current state of the channel end", - "type": "string", - "description": "State defines if a channel is in one of the following states:\nCLOSED, INIT, TRYOPEN, OPEN or UNINITIALIZED.\n\n - STATE_UNINITIALIZED_UNSPECIFIED: Default State\n - STATE_INIT: A channel has just started the opening handshake.\n - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain.\n - STATE_OPEN: A channel has completed the handshake. Open channels are\nready to send and receive packets.\n - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive\npackets.", - "default": "STATE_UNINITIALIZED_UNSPECIFIED", - "enum": [ - "STATE_UNINITIALIZED_UNSPECIFIED", - "STATE_INIT", - "STATE_TRYOPEN", - "STATE_OPEN", - "STATE_CLOSED" - ] - }, - "ordering": { - "title": "whether the channel is ordered or unordered", - "type": "string", - "description": "- ORDER_NONE_UNSPECIFIED: zero-value for channel ordering\n - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in\nwhich they were sent.\n - ORDER_ORDERED: packets are delivered exactly in the order which they were sent", - "default": "ORDER_NONE_UNSPECIFIED", - "enum": [ - "ORDER_NONE_UNSPECIFIED", - "ORDER_UNORDERED", - "ORDER_ORDERED" - ] - }, - "counterparty": { - "title": "counterparty channel end", - "type": "object", - "properties": { - "port_id": { - "type": "string", - "description": "port on the counterparty chain which owns the other end of the channel." - }, - "channel_id": { - "title": "channel end on the counterparty chain", - "type": "string" - } - } - }, - "connection_hops": { - "title": "list of connection identifiers, in order, along which packets sent on\nthis channel will travel", - "type": "array", - "items": { - "type": "string" - } - }, - "version": { - "title": "opaque channel version, which is agreed upon during the handshake", - "type": "string" - } - }, - "description": "Channel defines pipeline for exactly-once packet delivery between specific\nmodules on separate blockchains, which has at least one end capable of\nsending packets and one end capable of receiving packets." - }, - "proof": { - "title": "merkle proof of existence", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proof_height": { - "title": "height at which the proof was retrieved", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - } - }, - "description": "QueryChannelResponse is the response type for the Query/Channel RPC method.\nBesides the Channel end, it includes a proof and the height from which the\nproof was retrieved." + "schema": { + "type": "object", + "properties": { + "account_address": { + "type": "string" } - } + }, + "description": "Since: cosmos-sdk 0.46.2", + "title": "QueryAccountAddressByIDResponse is the response type for AccountAddressByID rpc method" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/client_state": { - "get": { - "tags": [ - "Query" - ], - "summary": "ChannelClientState queries for the client state for the channel associated\nwith the provided channel identifiers.", - "operationId": "ChannelClientState", + }, "parameters": [ { - "name": "channel_id", + "name": "id", + "description": "Deprecated, use account_id instead\n\nid is the account number of the address to be queried. This field\nshould have been an uint64 (like all account numbers), and will be\nupdated to uint64 in a future version of the auth query.", "in": "path", - "description": "channel unique identifier", "required": true, - "schema": { - "type": "string" - } + "type": "string", + "format": "int64" }, { - "name": "port_id", - "in": "path", - "description": "port unique identifier", - "required": true, - "schema": { - "type": "string" - } + "name": "account_id", + "description": "account_id is the account number of the address to be queried.\n\nSince: cosmos-sdk 0.47", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/auth/v1beta1/bech32": { + "get": { + "summary": "Bech32Prefix queries bech32Prefix", + "description": "Since: cosmos-sdk 0.46", + "operationId": "Bech32Prefix", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "title": "QueryChannelClientStateResponse is the Response type for the\nQuery/QueryChannelClientState RPC method", - "type": "object", - "properties": { - "identified_client_state": { - "title": "client state associated with the channel", - "type": "object", - "properties": { - "client_id": { - "title": "client identifier", - "type": "string" - }, - "client_state": { - "title": "client state", - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - }, - "description": "IdentifiedClientState defines a client state with an additional client\nidentifier field." - }, - "proof": { - "title": "merkle proof of existence", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proof_height": { - "title": "height at which the proof was retrieved", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - } - } - } - } + "schema": { + "type": "object", + "properties": { + "bech32_prefix": { + "type": "string" + } + }, + "description": "Bech32PrefixResponse is the response type for Bech32Prefix rpc method.\n\nSince: cosmos-sdk 0.46" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } + }, + "tags": [ + "Query" + ] } }, - "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/consensus_state/revision/{revision_number}/height/{revision_height}": { + "/cosmos/auth/v1beta1/bech32/{address_bytes}": { "get": { - "tags": [ - "Query" - ], - "summary": "ChannelConsensusState queries for the consensus state for the channel\nassociated with the provided channel identifiers.", - "operationId": "ChannelConsensusState", - "parameters": [ - { - "name": "channel_id", - "in": "path", - "description": "channel unique identifier", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "port_id", - "in": "path", - "description": "port unique identifier", - "required": true, + "summary": "AddressBytesToString converts Account Address bytes to string", + "description": "Since: cosmos-sdk 0.46", + "operationId": "AddressBytesToString", + "responses": { + "200": { + "description": "A successful response.", "schema": { - "type": "string" + "type": "object", + "properties": { + "address_string": { + "type": "string" + } + }, + "description": "AddressBytesToStringResponse is the response type for AddressString rpc method.\n\nSince: cosmos-sdk 0.46" } }, - { - "name": "revision_number", - "in": "path", - "description": "revision number of the consensus state", - "required": true, + "default": { + "description": "An unexpected error response.", "schema": { - "type": "string", - "format": "uint64" + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } + } + } } - }, + } + }, + "parameters": [ { - "name": "revision_height", + "name": "address_bytes", "in": "path", - "description": "revision height of the consensus state", "required": true, - "schema": { - "type": "string", - "format": "uint64" - } + "type": "string", + "format": "byte" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/auth/v1beta1/bech32/{address_string}": { + "get": { + "summary": "AddressStringToBytes converts Address string to bytes", + "description": "Since: cosmos-sdk 0.46", + "operationId": "AddressStringToBytes", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "title": "QueryChannelClientStateResponse is the Response type for the\nQuery/QueryChannelClientState RPC method", - "type": "object", - "properties": { - "consensus_state": { - "title": "consensus state associated with the channel", - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "client_id": { - "title": "client ID associated with the consensus state", - "type": "string" - }, - "proof": { - "title": "merkle proof of existence", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proof_height": { - "title": "height at which the proof was retrieved", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - } - } + "schema": { + "type": "object", + "properties": { + "address_bytes": { + "type": "string", + "format": "byte" } - } + }, + "description": "AddressStringToBytesResponse is the response type for AddressBytes rpc method.\n\nSince: cosmos-sdk 0.46" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/next_sequence": { - "get": { - "tags": [ - "Query" - ], - "summary": "NextSequenceReceive returns the next receive sequence for a given channel.", - "operationId": "NextSequenceReceive", + }, "parameters": [ { - "name": "channel_id", + "name": "address_string", "in": "path", - "description": "channel unique identifier", "required": true, - "schema": { - "type": "string" + "type": "string" + } + ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/auth/v1beta1/module_accounts": { + "get": { + "summary": "ModuleAccounts returns all the existing module accounts.", + "description": "Since: cosmos-sdk 0.46", + "operationId": "ModuleAccounts", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "type": "object", + "properties": { + "accounts": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } + } + }, + "description": "QueryModuleAccountsResponse is the response type for the Query/ModuleAccounts RPC method.\n\nSince: cosmos-sdk 0.46" } }, - { - "name": "port_id", - "in": "path", - "description": "port unique identifier", - "required": true, + "default": { + "description": "An unexpected error response.", "schema": { - "type": "string" + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } + } + } } } - ], + }, + "tags": [ + "Query" + ] + } + }, + "/cosmos/auth/v1beta1/module_accounts/{name}": { + "get": { + "summary": "ModuleAccountByName returns the module account info by module name", + "operationId": "ModuleAccountByName", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "title": "QuerySequenceResponse is the request type for the\nQuery/QueryNextSequenceReceiveResponse RPC method", + "schema": { + "type": "object", + "properties": { + "account": { "type": "object", "properties": { - "next_sequence_receive": { - "title": "next sequence receive number", + "type_url": { "type": "string", - "format": "uint64" + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." }, - "proof": { - "title": "merkle proof of existence", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "value": { "type": "string", - "format": "byte" - }, - "proof_height": { - "title": "height at which the proof was retrieved", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } - } + }, + "description": "QueryModuleAccountByNameResponse is the response type for the Query/ModuleAccountByName RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/next_sequence_send": { - "get": { - "tags": [ - "Query" - ], - "summary": "NextSequenceSend returns the next send sequence for a given channel.", - "operationId": "NextSequenceSend", + }, "parameters": [ { - "name": "channel_id", - "in": "path", - "description": "channel unique identifier", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "port_id", + "name": "name", "in": "path", - "description": "port unique identifier", "required": true, - "schema": { - "type": "string" - } + "type": "string" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/auth/v1beta1/params": { + "get": { + "summary": "Params queries all parameters.", + "operationId": "AuthParams", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "title": "QueryNextSequenceSendResponse is the request type for the\nQuery/QueryNextSequenceSend RPC method", + "schema": { + "type": "object", + "properties": { + "params": { + "description": "params defines the parameters of the module.", "type": "object", "properties": { - "next_sequence_send": { - "title": "next sequence send number", + "max_memo_characters": { "type": "string", "format": "uint64" }, - "proof": { - "title": "merkle proof of existence", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "tx_sig_limit": { "type": "string", - "format": "byte" + "format": "uint64" }, - "proof_height": { - "title": "height at which the proof was retrieved", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + "tx_size_cost_per_byte": { + "type": "string", + "format": "uint64" + }, + "sig_verify_cost_ed25519": { + "type": "string", + "format": "uint64" + }, + "sig_verify_cost_secp256k1": { + "type": "string", + "format": "uint64" } } } - } + }, + "description": "QueryParamsResponse is the response type for the Query/Params RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } + } + } + } + } + }, + "tags": [ + "Query" + ] + } + }, + "/cosmos/authz/v1beta1/grants": { + "get": { + "summary": "Returns list of `Authorization`, granted to the grantee by the granter.", + "operationId": "Grants", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "type": "object", + "properties": { + "grants": { + "type": "array", + "items": { + "type": "object", + "properties": { + "authorization": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } }, "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "expiration": { + "type": "string", + "format": "date-time", + "title": "time when the grant will expire and will be pruned. If null, then the grant\ndoesn't have a time expiration (other conditions in `authorization`\nmay apply to invalidate the grant)" } + }, + "description": "Grant gives permissions to execute\nthe provide method with expiration time." + }, + "description": "authorizations is a list of grants granted for grantee by granter." + }, + "pagination": { + "description": "pagination defines an pagination for the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" } } } + }, + "description": "QueryGrantsResponse is the response type for the Query/Authorizations RPC method." + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } + } } } } - } - } - }, - "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_acknowledgements": { - "get": { - "tags": [ - "Query" - ], - "summary": "PacketAcknowledgements returns all the packet acknowledgements associated\nwith a channel.", - "operationId": "PacketAcknowledgements", + }, "parameters": [ { - "name": "channel_id", - "in": "path", - "description": "channel unique identifier", - "required": true, - "schema": { - "type": "string" - } + "name": "granter", + "in": "query", + "required": false, + "type": "string" }, { - "name": "port_id", - "in": "path", - "description": "port unique identifier", - "required": true, - "schema": { - "type": "string" - } + "name": "grantee", + "in": "query", + "required": false, + "type": "string" }, { - "name": "pagination.key", + "name": "msg_type_url", + "description": "Optional, msg_type_url, when set, will query only grants matching given msg type.", "in": "query", + "required": false, + "type": "string" + }, + { + "name": "pagination.key", "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } + "in": "query", + "required": false, + "type": "string", + "format": "byte" }, { "name": "pagination.offset", - "in": "query", "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.limit", - "in": "query", "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.count_total", - "in": "query", "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } + "in": "query", + "required": false, + "type": "boolean" }, { "name": "pagination.reverse", - "in": "query", "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } - }, - { - "name": "packet_commitment_sequences", "in": "query", - "description": "list of packet sequences.", - "style": "form", - "explode": true, - "schema": { - "type": "array", - "items": { - "type": "string", - "format": "uint64" - } - } + "required": false, + "type": "boolean" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/authz/v1beta1/grants/grantee/{grantee}": { + "get": { + "summary": "GranteeGrants returns a list of `GrantAuthorization` by grantee.", + "description": "Since: cosmos-sdk 0.46", + "operationId": "GranteeGrants", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "title": "QueryPacketAcknowledgemetsResponse is the request type for the\nQuery/QueryPacketAcknowledgements RPC method", - "type": "object", - "properties": { - "acknowledgements": { - "type": "array", - "items": { - "type": "object", - "properties": { - "port_id": { - "type": "string", - "description": "channel port identifier." - }, - "channel_id": { - "type": "string", - "description": "channel unique identifier." - }, - "sequence": { - "type": "string", - "description": "packet sequence.", - "format": "uint64" - }, - "data": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "embedded data that represents packet state.", - "format": "byte" - } - }, - "description": "PacketState defines the generic type necessary to retrieve and store\npacket commitments, acknowledgements, and receipts.\nCaller is responsible for knowing the context necessary to interpret this\nstate as a commitment, acknowledgement, or a receipt." - } - }, - "pagination": { - "title": "pagination response", - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } + "schema": { + "type": "object", + "properties": { + "grants": { + "type": "array", + "items": { + "type": "object", + "properties": { + "granter": { + "type": "string" }, - "description": "PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }" - }, - "height": { - "title": "query block height", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } + "grantee": { + "type": "string" }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - } - } - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { + "authorization": { "type": "object", "properties": { "type_url": { @@ -8732,123 +8890,153 @@ "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." }, "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } }, "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "expiration": { + "type": "string", + "format": "date-time" } + }, + "title": "GrantAuthorization extends a grant with both the addresses of the grantee and granter.\nIt is used in genesis.proto and query.proto" + }, + "description": "grants is a list of grants granted to the grantee." + }, + "pagination": { + "description": "pagination defines an pagination for the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" } } } - } + }, + "description": "QueryGranteeGrantsResponse is the response type for the Query/GranteeGrants RPC method." + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } + } + } } } - } - } - }, - "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_acks/{sequence}": { - "get": { - "tags": [ - "Query" - ], - "summary": "PacketAcknowledgement queries a stored packet acknowledgement hash.", - "operationId": "PacketAcknowledgement", + }, "parameters": [ { - "name": "channel_id", + "name": "grantee", "in": "path", - "description": "channel unique identifier", "required": true, - "schema": { - "type": "string" - } + "type": "string" }, { - "name": "port_id", - "in": "path", - "description": "port unique identifier", - "required": true, - "schema": { - "type": "string" - } + "name": "pagination.key", + "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", + "in": "query", + "required": false, + "type": "string", + "format": "byte" }, { - "name": "sequence", - "in": "path", - "description": "packet sequence", - "required": true, - "schema": { - "type": "string", - "format": "uint64" - } + "name": "pagination.offset", + "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.limit", + "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.count_total", + "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", + "in": "query", + "required": false, + "type": "boolean" + }, + { + "name": "pagination.reverse", + "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", + "in": "query", + "required": false, + "type": "boolean" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/authz/v1beta1/grants/granter/{granter}": { + "get": { + "summary": "GranterGrants returns list of `GrantAuthorization`, granted by granter.", + "description": "Since: cosmos-sdk 0.46", + "operationId": "GranterGrants", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "title": "QueryPacketAcknowledgementResponse defines the client query response for a\npacket which also includes a proof and the height from which the\nproof was retrieved", - "type": "object", - "properties": { - "acknowledgement": { - "title": "packet associated with the request fields", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proof": { - "title": "merkle proof of existence", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proof_height": { - "title": "height at which the proof was retrieved", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } + "schema": { + "type": "object", + "properties": { + "grants": { + "type": "array", + "items": { + "type": "object", + "properties": { + "granter": { + "type": "string" }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - } - } - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { + "grantee": { + "type": "string" + }, + "authorization": { "type": "object", "properties": { "type_url": { @@ -8856,204 +9044,203 @@ "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." }, "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } }, "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "expiration": { + "type": "string", + "format": "date-time" } + }, + "title": "GrantAuthorization extends a grant with both the addresses of the grantee and granter.\nIt is used in genesis.proto and query.proto" + }, + "description": "grants is a list of grants granted by the granter." + }, + "pagination": { + "description": "pagination defines an pagination for the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" } } } + }, + "description": "QueryGranterGrantsResponse is the response type for the Query/GranterGrants RPC method." + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } + } } } } - } - } - }, - "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_commitments": { - "get": { - "tags": [ - "Query" - ], - "summary": "PacketCommitments returns all the packet commitments hashes associated\nwith a channel.", - "operationId": "PacketCommitments", + }, "parameters": [ { - "name": "channel_id", - "in": "path", - "description": "channel unique identifier", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "port_id", + "name": "granter", "in": "path", - "description": "port unique identifier", "required": true, - "schema": { - "type": "string" - } + "type": "string" }, { "name": "pagination.key", - "in": "query", "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } + "in": "query", + "required": false, + "type": "string", + "format": "byte" }, { "name": "pagination.offset", - "in": "query", "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.limit", - "in": "query", "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.count_total", - "in": "query", "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } + "in": "query", + "required": false, + "type": "boolean" }, { "name": "pagination.reverse", - "in": "query", "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } - } + "in": "query", + "required": false, + "type": "boolean" + } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/bank/v1beta1/balances/{address}": { + "get": { + "summary": "AllBalances queries the balance of all coins for a single account.", + "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", + "operationId": "AllBalances", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "title": "QueryPacketCommitmentsResponse is the request type for the\nQuery/QueryPacketCommitments RPC method", - "type": "object", - "properties": { - "commitments": { - "type": "array", - "items": { - "type": "object", - "properties": { - "port_id": { - "type": "string", - "description": "channel port identifier." - }, - "channel_id": { - "type": "string", - "description": "channel unique identifier." - }, - "sequence": { - "type": "string", - "description": "packet sequence.", - "format": "uint64" - }, - "data": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "embedded data that represents packet state.", - "format": "byte" - } - }, - "description": "PacketState defines the generic type necessary to retrieve and store\npacket commitments, acknowledgements, and receipts.\nCaller is responsible for knowing the context necessary to interpret this\nstate as a commitment, acknowledgement, or a receipt." + "schema": { + "type": "object", + "properties": { + "balances": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" } }, - "pagination": { - "title": "pagination response", - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }" + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "description": "balances is the balances of all the coins." + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." }, - "height": { - "title": "query block height", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" } } } - } + }, + "description": "QueryAllBalancesResponse is the response type for the Query/AllBalances RPC\nmethod." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" } } } @@ -9061,125 +9248,118 @@ } } } - } - } - }, - "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_commitments/{packet_ack_sequences}/unreceived_acks": { - "get": { - "tags": [ - "Query" - ], - "summary": "UnreceivedAcks returns all the unreceived IBC acknowledgements associated\nwith a channel and sequences.", - "operationId": "UnreceivedAcks", + }, "parameters": [ { - "name": "channel_id", + "name": "address", + "description": "address is the address to query balances for.", "in": "path", - "description": "channel unique identifier", "required": true, - "schema": { - "type": "string" - } + "type": "string" }, { - "name": "port_id", - "in": "path", - "description": "port unique identifier", - "required": true, - "schema": { - "type": "string" - } + "name": "pagination.key", + "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", + "in": "query", + "required": false, + "type": "string", + "format": "byte" }, { - "name": "packet_ack_sequences", - "in": "path", - "description": "list of acknowledgement sequences", - "required": true, - "style": "simple", - "explode": false, - "schema": { - "minItems": 1, - "type": "array", - "items": { - "type": "string", - "format": "uint64" - } - } + "name": "pagination.offset", + "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.limit", + "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.count_total", + "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", + "in": "query", + "required": false, + "type": "boolean" + }, + { + "name": "pagination.reverse", + "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", + "in": "query", + "required": false, + "type": "boolean" + }, + { + "name": "resolve_denom", + "description": "resolve_denom is the flag to resolve the denom into a human-readable form from the metadata.\n\nSince: cosmos-sdk 0.50", + "in": "query", + "required": false, + "type": "boolean" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/bank/v1beta1/balances/{address}/by_denom": { + "get": { + "summary": "Balance queries the balance of a single coin for a single account.", + "operationId": "BankBalance", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "title": "QueryUnreceivedAcksResponse is the response type for the\nQuery/UnreceivedAcks RPC method", + "schema": { + "type": "object", + "properties": { + "balance": { "type": "object", "properties": { - "sequences": { - "title": "list of unreceived acknowledgement sequences", - "type": "array", - "items": { - "type": "string", - "format": "uint64" - } + "denom": { + "type": "string" }, - "height": { - "title": "query block height", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + "amount": { + "type": "string" } - } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." } - } + }, + "description": "QueryBalanceResponse is the response type for the Query/Balance RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" } } } @@ -9187,125 +9367,110 @@ } } } - } - } - }, - "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_commitments/{packet_commitment_sequences}/unreceived_packets": { - "get": { - "tags": [ - "Query" - ], - "summary": "UnreceivedPackets returns all the unreceived IBC packets associated with a\nchannel and sequences.", - "operationId": "UnreceivedPackets", + }, "parameters": [ { - "name": "channel_id", - "in": "path", - "description": "channel unique identifier", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "port_id", + "name": "address", + "description": "address is the address to query balances for.", "in": "path", - "description": "port unique identifier", "required": true, - "schema": { - "type": "string" - } + "type": "string" }, { - "name": "packet_commitment_sequences", - "in": "path", - "description": "list of packet sequences", - "required": true, - "style": "simple", - "explode": false, - "schema": { - "minItems": 1, - "type": "array", - "items": { - "type": "string", - "format": "uint64" - } - } + "name": "denom", + "description": "denom is the coin denom to query balances for.", + "in": "query", + "required": false, + "type": "string" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/bank/v1beta1/denom_owners/{denom}": { + "get": { + "summary": "DenomOwners queries for all account addresses that own a particular token\ndenomination.", + "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.\n\nSince: cosmos-sdk 0.46", + "operationId": "DenomOwners", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "title": "QueryUnreceivedPacketsResponse is the response type for the\nQuery/UnreceivedPacketCommitments RPC method", - "type": "object", - "properties": { - "sequences": { - "title": "list of unreceived packet sequences", - "type": "array", - "items": { + "schema": { + "type": "object", + "properties": { + "denom_owners": { + "type": "array", + "items": { + "type": "object", + "properties": { + "address": { "type": "string", - "format": "uint64" + "description": "address defines the address that owns a particular denomination." + }, + "balance": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." } }, - "height": { - "title": "query block height", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + "description": "DenomOwner defines structure representing an account that owns or holds a\nparticular denominated token. It contains the account address and account\nbalance of the denominated token.\n\nSince: cosmos-sdk 0.46" + } + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" } } } - } + }, + "description": "QueryDenomOwnersResponse defines the RPC response of a DenomOwners RPC query.\n\nSince: cosmos-sdk 0.46" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" } } } @@ -9313,245 +9478,179 @@ } } } - } - } - }, - "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_commitments/{sequence}": { - "get": { - "tags": [ - "Query" - ], - "summary": "PacketCommitment queries a stored packet commitment hash.", - "operationId": "PacketCommitment", + }, "parameters": [ { - "name": "channel_id", + "name": "denom", + "description": "denom defines the coin denomination to query all account holders for.", "in": "path", - "description": "channel unique identifier", "required": true, - "schema": { - "type": "string" - } + "type": "string" }, { - "name": "port_id", - "in": "path", - "description": "port unique identifier", - "required": true, - "schema": { - "type": "string" - } + "name": "pagination.key", + "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", + "in": "query", + "required": false, + "type": "string", + "format": "byte" }, { - "name": "sequence", - "in": "path", - "description": "packet sequence", - "required": true, - "schema": { - "type": "string", - "format": "uint64" - } + "name": "pagination.offset", + "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.limit", + "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.count_total", + "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", + "in": "query", + "required": false, + "type": "boolean" + }, + { + "name": "pagination.reverse", + "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", + "in": "query", + "required": false, + "type": "boolean" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/bank/v1beta1/denoms_metadata": { + "get": { + "summary": "DenomsMetadata queries the client metadata for all registered coin\ndenominations.", + "operationId": "DenomsMetadata", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "title": "QueryPacketCommitmentResponse defines the client query response for a packet\nwhich also includes a proof and the height from which the proof was\nretrieved", - "type": "object", - "properties": { - "commitment": { - "title": "packet associated with the request fields", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proof": { - "title": "merkle proof of existence", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proof_height": { - "title": "height at which the proof was retrieved", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - } - } - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + "schema": { + "type": "object", + "properties": { + "metadatas": { + "type": "array", + "items": { + "type": "object", + "properties": { + "description": { + "type": "string" + }, + "denom_units": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string", + "description": "denom represents the string name of the given denom unit (e.g uatom)." + }, + "exponent": { + "type": "integer", + "format": "int64", + "description": "exponent represents power of 10 exponent that one must\nraise the base_denom to in order to equal the given DenomUnit's denom\n1 denom = 10^exponent base_denom\n(e.g. with a base_denom of uatom, one can create a DenomUnit of 'atom' with\nexponent = 6, thus: 1 atom = 10^6 uatom)." + }, + "aliases": { + "type": "array", + "items": { + "type": "string" + }, + "title": "aliases is a list of string aliases for the given denom" + } }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } + "description": "DenomUnit represents a struct that describes a given\ndenomination unit of the basic token." }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "title": "denom_units represents the list of DenomUnit's for a given coin" + }, + "base": { + "type": "string", + "description": "base represents the base denom (should be the DenomUnit with exponent = 0)." + }, + "display": { + "type": "string", + "description": "display indicates the suggested denom that should be\ndisplayed in clients." + }, + "name": { + "type": "string", + "description": "Since: cosmos-sdk 0.43", + "title": "name defines the name of the token (eg: Cosmos Atom)" + }, + "symbol": { + "type": "string", + "description": "symbol is the token symbol usually shown on exchanges (eg: ATOM). This can\nbe the same as the display.\n\nSince: cosmos-sdk 0.43" + }, + "uri": { + "type": "string", + "description": "URI to a document (on or off-chain) that contains additional information. Optional.\n\nSince: cosmos-sdk 0.46" + }, + "uri_hash": { + "type": "string", + "description": "URIHash is a sha256 hash of a document pointed by URI. It's used to verify that\nthe document didn't change. Optional.\n\nSince: cosmos-sdk 0.46" } - } - } - } - } - } - } - } - } - }, - "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_receipts/{sequence}": { - "get": { - "tags": [ - "Query" - ], - "summary": "PacketReceipt queries if a given packet sequence has been received on the\nqueried chain", - "operationId": "PacketReceipt", - "parameters": [ - { - "name": "channel_id", - "in": "path", - "description": "channel unique identifier", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "port_id", - "in": "path", - "description": "port unique identifier", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "sequence", - "in": "path", - "description": "packet sequence", - "required": true, - "schema": { - "type": "string", - "format": "uint64" - } - } - ], - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "title": "QueryPacketReceiptResponse defines the client query response for a packet\nreceipt which also includes a proof, and the height from which the proof was\nretrieved", + }, + "description": "Metadata represents a struct that describes\na basic token." + }, + "description": "metadata provides the client information for all the registered tokens." + }, + "pagination": { + "description": "pagination defines the pagination in the response.", "type": "object", "properties": { - "received": { - "title": "success flag for if receipt exists", - "type": "boolean" - }, - "proof": { - "title": "merkle proof of existence", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "next_key": { "type": "string", - "format": "byte" + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." }, - "proof_height": { - "title": "height at which the proof was retrieved", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" } } } - } + }, + "description": "QueryDenomsMetadataResponse is the response type for the Query/DenomsMetadata RPC\nmethod." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" } } } @@ -9559,220 +9658,152 @@ } } } - } - } - }, - "/ibc/core/channel/v1/connections/{connection}/channels": { - "get": { - "tags": [ - "Query" - ], - "summary": "ConnectionChannels queries all the channels associated with a connection\nend.", - "operationId": "ConnectionChannels", + }, "parameters": [ - { - "name": "connection", - "in": "path", - "description": "connection unique identifier", - "required": true, - "schema": { - "type": "string" - } - }, { "name": "pagination.key", - "in": "query", "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } + "in": "query", + "required": false, + "type": "string", + "format": "byte" }, { "name": "pagination.offset", - "in": "query", "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.limit", - "in": "query", "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.count_total", - "in": "query", "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } + "in": "query", + "required": false, + "type": "boolean" }, { "name": "pagination.reverse", - "in": "query", "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } + "in": "query", + "required": false, + "type": "boolean" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/bank/v1beta1/denoms_metadata/{denom}": { + "get": { + "summary": "DenomsMetadata queries the client metadata of a given coin denomination.", + "operationId": "DenomMetadata", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "title": "QueryConnectionChannelsResponse is the Response type for the\nQuery/QueryConnectionChannels RPC method", + "schema": { + "type": "object", + "properties": { + "metadata": { "type": "object", "properties": { - "channels": { + "description": { + "type": "string" + }, + "denom_units": { "type": "array", - "description": "list of channels associated with a connection.", "items": { "type": "object", "properties": { - "state": { - "title": "current state of the channel end", - "type": "string", - "description": "State defines if a channel is in one of the following states:\nCLOSED, INIT, TRYOPEN, OPEN or UNINITIALIZED.\n\n - STATE_UNINITIALIZED_UNSPECIFIED: Default State\n - STATE_INIT: A channel has just started the opening handshake.\n - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain.\n - STATE_OPEN: A channel has completed the handshake. Open channels are\nready to send and receive packets.\n - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive\npackets.", - "default": "STATE_UNINITIALIZED_UNSPECIFIED", - "enum": [ - "STATE_UNINITIALIZED_UNSPECIFIED", - "STATE_INIT", - "STATE_TRYOPEN", - "STATE_OPEN", - "STATE_CLOSED" - ] - }, - "ordering": { - "title": "whether the channel is ordered or unordered", + "denom": { "type": "string", - "description": "- ORDER_NONE_UNSPECIFIED: zero-value for channel ordering\n - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in\nwhich they were sent.\n - ORDER_ORDERED: packets are delivered exactly in the order which they were sent", - "default": "ORDER_NONE_UNSPECIFIED", - "enum": [ - "ORDER_NONE_UNSPECIFIED", - "ORDER_UNORDERED", - "ORDER_ORDERED" - ] + "description": "denom represents the string name of the given denom unit (e.g uatom)." }, - "counterparty": { - "title": "counterparty channel end", - "type": "object", - "properties": { - "port_id": { - "type": "string", - "description": "port on the counterparty chain which owns the other end of the channel." - }, - "channel_id": { - "title": "channel end on the counterparty chain", - "type": "string" - } - } + "exponent": { + "type": "integer", + "format": "int64", + "description": "exponent represents power of 10 exponent that one must\nraise the base_denom to in order to equal the given DenomUnit's denom\n1 denom = 10^exponent base_denom\n(e.g. with a base_denom of uatom, one can create a DenomUnit of 'atom' with\nexponent = 6, thus: 1 atom = 10^6 uatom)." }, - "connection_hops": { - "title": "list of connection identifiers, in order, along which packets sent on\nthis channel will travel", + "aliases": { "type": "array", "items": { "type": "string" - } - }, - "version": { - "title": "opaque channel version, which is agreed upon during the handshake", - "type": "string" - }, - "port_id": { - "title": "port identifier", - "type": "string" - }, - "channel_id": { - "title": "channel identifier", - "type": "string" + }, + "title": "aliases is a list of string aliases for the given denom" } }, - "description": "IdentifiedChannel defines a channel with additional port and channel\nidentifier fields." - } - }, - "pagination": { - "title": "pagination response", - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } + "description": "DenomUnit represents a struct that describes a given\ndenomination unit of the basic token." }, - "description": "PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }" + "title": "denom_units represents the list of DenomUnit's for a given coin" }, - "height": { - "title": "query block height", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + "base": { + "type": "string", + "description": "base represents the base denom (should be the DenomUnit with exponent = 0)." + }, + "display": { + "type": "string", + "description": "display indicates the suggested denom that should be\ndisplayed in clients." + }, + "name": { + "type": "string", + "description": "Since: cosmos-sdk 0.43", + "title": "name defines the name of the token (eg: Cosmos Atom)" + }, + "symbol": { + "type": "string", + "description": "symbol is the token symbol usually shown on exchanges (eg: ATOM). This can\nbe the same as the display.\n\nSince: cosmos-sdk 0.43" + }, + "uri": { + "type": "string", + "description": "URI to a document (on or off-chain) that contains additional information. Optional.\n\nSince: cosmos-sdk 0.46" + }, + "uri_hash": { + "type": "string", + "description": "URIHash is a sha256 hash of a document pointed by URI. It's used to verify that\nthe document didn't change. Optional.\n\nSince: cosmos-sdk 0.46" } - } + }, + "description": "Metadata represents a struct that describes\na basic token." } - } + }, + "description": "QueryDenomMetadataResponse is the response type for the Query/DenomMetadata RPC\nmethod." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" } } } @@ -9780,109 +9811,121 @@ } } } - } - } - }, - "/cosmos/auth/v1beta1/account_info/{address}": { - "get": { - "tags": [ - "Query" - ], - "summary": "AccountInfo queries account info which is common to all account types.", - "description": "Since: cosmos-sdk 0.47", - "operationId": "AccountInfo", + }, "parameters": [ { - "name": "address", + "name": "denom", + "description": "denom is the coin denom to query the metadata for.", "in": "path", - "description": "address is the account address string.", "required": true, - "schema": { - "type": "string" - } + "type": "string" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/bank/v1beta1/denoms_metadata_by_query_string": { + "get": { + "summary": "DenomsMetadata queries the client metadata of a given coin denomination.", + "operationId": "DenomMetadataByQueryString", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "info": { - "type": "object", - "properties": { - "address": { - "type": "string" - }, - "pub_key": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "account_number": { - "type": "string", - "format": "uint64" - }, - "sequence": { - "type": "string", - "format": "uint64" - } - }, - "description": "info is the account info which is represented by BaseAccount." - } - }, - "description": "QueryAccountInfoResponse is the Query/AccountInfo response type.\n\nSince: cosmos-sdk 0.47" - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "metadata": { "type": "object", "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { + "description": { "type": "string" }, - "details": { + "denom_units": { "type": "array", "items": { "type": "object", "properties": { - "type_url": { + "denom": { "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + "description": "denom represents the string name of the given denom unit (e.g uatom)." }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" + "exponent": { + "type": "integer", + "format": "int64", + "description": "exponent represents power of 10 exponent that one must\nraise the base_denom to in order to equal the given DenomUnit's denom\n1 denom = 10^exponent base_denom\n(e.g. with a base_denom of uatom, one can create a DenomUnit of 'atom' with\nexponent = 6, thus: 1 atom = 10^6 uatom)." + }, + "aliases": { + "type": "array", + "items": { + "type": "string" + }, + "title": "aliases is a list of string aliases for the given denom" } }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "description": "DenomUnit represents a struct that describes a given\ndenomination unit of the basic token." + }, + "title": "denom_units represents the list of DenomUnit's for a given coin" + }, + "base": { + "type": "string", + "description": "base represents the base denom (should be the DenomUnit with exponent = 0)." + }, + "display": { + "type": "string", + "description": "display indicates the suggested denom that should be\ndisplayed in clients." + }, + "name": { + "type": "string", + "description": "Since: cosmos-sdk 0.43", + "title": "name defines the name of the token (eg: Cosmos Atom)" + }, + "symbol": { + "type": "string", + "description": "symbol is the token symbol usually shown on exchanges (eg: ATOM). This can\nbe the same as the display.\n\nSince: cosmos-sdk 0.43" + }, + "uri": { + "type": "string", + "description": "URI to a document (on or off-chain) that contains additional information. Optional.\n\nSince: cosmos-sdk 0.46" + }, + "uri_hash": { + "type": "string", + "description": "URIHash is a sha256 hash of a document pointed by URI. It's used to verify that\nthe document didn't change. Optional.\n\nSince: cosmos-sdk 0.46" + } + }, + "description": "Metadata represents a struct that describes\na basic token." + } + }, + "description": "QueryDenomMetadataByQueryStringResponse is the response type for the Query/DenomMetadata RPC\nmethod. Identical with QueryDenomMetadataResponse but receives denom as query string in request." + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" } } } @@ -9890,147 +9933,86 @@ } } } - } - } - }, - "/cosmos/auth/v1beta1/accounts": { - "get": { - "tags": [ - "Query" - ], - "summary": "Accounts returns all the existing accounts.", - "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.\n\nSince: cosmos-sdk 0.43", - "operationId": "Accounts", + }, "parameters": [ { - "name": "pagination.key", + "name": "denom", + "description": "denom is the coin denom to query the metadata for.", "in": "query", - "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } - }, - { - "name": "pagination.offset", - "in": "query", - "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.limit", - "in": "query", - "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.count_total", - "in": "query", - "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } - }, - { - "name": "pagination.reverse", - "in": "query", - "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } + "required": false, + "type": "string" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/bank/v1beta1/params": { + "get": { + "summary": "Params queries the parameters of x/bank module.", + "operationId": "BankParams", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "params": { + "description": "params provides the parameters of the bank module.", "type": "object", "properties": { - "accounts": { - "title": "accounts are the existing accounts", + "send_enabled": { "type": "array", "items": { "type": "object", "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + "denom": { + "type": "string" }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" + "enabled": { + "type": "boolean" } }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } + "description": "SendEnabled maps coin denom to a send_enabled status (whether a denom is\nsendable)." }, - "description": "pagination defines the pagination in the response." + "description": "Deprecated: Use of SendEnabled in params is deprecated.\nFor genesis, use the newly added send_enabled field in the genesis object.\nStorage, lookup, and manipulation of this information is now in the keeper.\n\nAs of cosmos-sdk 0.47, this only exists for backwards compatibility of genesis files." + }, + "default_send_enabled": { + "type": "boolean" } - }, - "description": "QueryAccountsResponse is the response type for the Query/Accounts RPC method.\n\nSince: cosmos-sdk 0.43" + } } - } + }, + "description": "QueryParamsResponse defines the response type for querying x/bank parameters." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" } } } @@ -10038,91 +10020,84 @@ } } } - } + }, + "tags": [ + "Query" + ] } }, - "/cosmos/auth/v1beta1/accounts/{address}": { + "/cosmos/bank/v1beta1/send_enabled": { "get": { - "tags": [ - "Query" - ], - "summary": "Account returns account details based on address.", - "operationId": "AuthAccount", - "parameters": [ - { - "name": "address", - "in": "path", - "description": "address defines the address to query for.", - "required": true, - "schema": { - "type": "string" - } - } - ], + "summary": "SendEnabled queries for SendEnabled entries.", + "description": "This query only returns denominations that have specific SendEnabled settings.\nAny denomination that does not have a specific setting will use the default\nparams.default_send_enabled, and will not be returned by this query.\n\nSince: cosmos-sdk 0.47", + "operationId": "SendEnabled", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "send_enabled": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "enabled": { + "type": "boolean" + } + }, + "description": "SendEnabled maps coin denom to a send_enabled status (whether a denom is\nsendable)." + } + }, + "pagination": { + "description": "pagination defines the pagination in the response. This field is only\npopulated if the denoms field in the request is empty.", "type": "object", "properties": { - "account": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" } - }, - "description": "QueryAccountResponse is the response type for the Query/Account RPC method." + } } - } + }, + "description": "QuerySendEnabledResponse defines the RPC response of a SendEnable query.\n\nSince: cosmos-sdk 0.47" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" } } } @@ -10130,90 +10105,136 @@ } } } - } - } - }, - "/cosmos/auth/v1beta1/address_by_id/{id}": { - "get": { - "tags": [ - "Query" - ], - "summary": "AccountAddressByID returns account address based on account number.", - "description": "Since: cosmos-sdk 0.46.2", - "operationId": "AccountAddressByID", + }, "parameters": [ { - "name": "id", - "in": "path", - "description": "Deprecated, use account_id instead\n\nid is the account number of the address to be queried. This field\nshould have been an uint64 (like all account numbers), and will be\nupdated to uint64 in a future version of the auth query.", - "required": true, - "schema": { - "type": "string", - "format": "int64" - } + "name": "denoms", + "description": "denoms is the specific denoms you want look up. Leave empty to get all entries.", + "in": "query", + "required": false, + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "multi" }, { - "name": "account_id", + "name": "pagination.key", + "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", "in": "query", - "description": "account_id is the account number of the address to be queried.\n\nSince: cosmos-sdk 0.47", - "schema": { - "type": "string", - "format": "uint64" - } + "required": false, + "type": "string", + "format": "byte" + }, + { + "name": "pagination.offset", + "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.limit", + "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.count_total", + "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", + "in": "query", + "required": false, + "type": "boolean" + }, + { + "name": "pagination.reverse", + "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", + "in": "query", + "required": false, + "type": "boolean" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/bank/v1beta1/spendable_balances/{address}": { + "get": { + "summary": "SpendableBalances queries the spendable balance of all coins for a single\naccount.", + "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.\n\nSince: cosmos-sdk 0.46", + "operationId": "SpendableBalances", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "title": "QueryAccountAddressByIDResponse is the response type for AccountAddressByID rpc method", + "schema": { + "type": "object", + "properties": { + "balances": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "description": "balances is the spendable balances of all the coins." + }, + "pagination": { + "description": "pagination defines the pagination in the response.", "type": "object", "properties": { - "account_address": { - "type": "string" + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" } - }, - "description": "Since: cosmos-sdk 0.46.2" + } } - } + }, + "description": "QuerySpendableBalancesResponse defines the gRPC response structure for querying\nan account's spendable balances.\n\nSince: cosmos-sdk 0.46" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" } } } @@ -10221,68 +10242,112 @@ } } } - } + }, + "parameters": [ + { + "name": "address", + "description": "address is the address to query spendable balances for.", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "pagination.key", + "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", + "in": "query", + "required": false, + "type": "string", + "format": "byte" + }, + { + "name": "pagination.offset", + "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.limit", + "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.count_total", + "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", + "in": "query", + "required": false, + "type": "boolean" + }, + { + "name": "pagination.reverse", + "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", + "in": "query", + "required": false, + "type": "boolean" + } + ], + "tags": [ + "Query" + ] } }, - "/cosmos/auth/v1beta1/bech32": { + "/cosmos/bank/v1beta1/spendable_balances/{address}/by_denom": { "get": { - "tags": [ - "Query" - ], - "summary": "Bech32Prefix queries bech32Prefix", - "description": "Since: cosmos-sdk 0.46", - "operationId": "Bech32Prefix", + "summary": "SpendableBalanceByDenom queries the spendable balance of a single denom for\na single account.", + "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.\n\nSince: cosmos-sdk 0.47", + "operationId": "SpendableBalanceByDenom", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "balance": { "type": "object", "properties": { - "bech32_prefix": { + "denom": { + "type": "string" + }, + "amount": { "type": "string" } }, - "description": "Bech32PrefixResponse is the response type for Bech32Prefix rpc method.\n\nSince: cosmos-sdk 0.46" + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." } - } + }, + "description": "QuerySpendableBalanceByDenomResponse defines the gRPC response structure for\nquerying an account's spendable balance for a specific denom.\n\nSince: cosmos-sdk 0.47" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" } } } @@ -10290,79 +10355,101 @@ } } } - } - } - }, - "/cosmos/auth/v1beta1/bech32/{address_bytes}": { - "get": { - "tags": [ - "Query" - ], - "summary": "AddressBytesToString converts Account Address bytes to string", - "description": "Since: cosmos-sdk 0.46", - "operationId": "AddressBytesToString", + }, "parameters": [ { - "name": "address_bytes", - "in": "path", + "name": "address", + "description": "address is the address to query balances for.", + "in": "path", "required": true, - "schema": { - "type": "string", - "format": "byte" - } + "type": "string" + }, + { + "name": "denom", + "description": "denom is the coin denom to query balances for.", + "in": "query", + "required": false, + "type": "string" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/bank/v1beta1/supply": { + "get": { + "summary": "TotalSupply queries the total supply of all coins.", + "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", + "operationId": "TotalSupply", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "supply": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "title": "supply is the supply of the coins" + }, + "pagination": { + "description": "pagination defines the pagination in the response.\n\nSince: cosmos-sdk 0.43", "type": "object", "properties": { - "address_string": { - "type": "string" + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" } - }, - "description": "AddressBytesToStringResponse is the response type for AddressString rpc method.\n\nSince: cosmos-sdk 0.46" + } } - } + }, + "title": "QueryTotalSupplyResponse is the response type for the Query/TotalSupply RPC\nmethod" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" } } } @@ -10370,80 +10457,105 @@ } } } - } - } - }, - "/cosmos/auth/v1beta1/bech32/{address_string}": { - "get": { - "tags": [ - "Query" - ], - "summary": "AddressStringToBytes converts Address string to bytes", - "description": "Since: cosmos-sdk 0.46", - "operationId": "AddressStringToBytes", + }, "parameters": [ { - "name": "address_string", - "in": "path", - "required": true, - "schema": { - "type": "string" - } + "name": "pagination.key", + "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", + "in": "query", + "required": false, + "type": "string", + "format": "byte" + }, + { + "name": "pagination.offset", + "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.limit", + "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.count_total", + "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", + "in": "query", + "required": false, + "type": "boolean" + }, + { + "name": "pagination.reverse", + "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", + "in": "query", + "required": false, + "type": "boolean" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/bank/v1beta1/supply/by_denom": { + "get": { + "summary": "SupplyOf queries the supply of a single coin.", + "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", + "operationId": "SupplyOf", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "amount": { "type": "object", "properties": { - "address_bytes": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" + "denom": { + "type": "string" + }, + "amount": { + "type": "string" } }, - "description": "AddressStringToBytesResponse is the response type for AddressBytes rpc method.\n\nSince: cosmos-sdk 0.46" + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." } - } + }, + "description": "QuerySupplyOfResponse is the response type for the Query/SupplyOf RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" } } } @@ -10451,84 +10563,78 @@ } } } - } + }, + "parameters": [ + { + "name": "denom", + "description": "denom is the coin denom to query balances for.", + "in": "query", + "required": false, + "type": "string" + } + ], + "tags": [ + "Query" + ] } }, - "/cosmos/auth/v1beta1/module_accounts": { + "/cosmos/distribution/v1beta1/community_pool": { "get": { - "tags": [ - "Query" - ], - "summary": "ModuleAccounts returns all the existing module accounts.", - "description": "Since: cosmos-sdk 0.46", - "operationId": "ModuleAccounts", + "summary": "CommunityPool queries the community pool coins.", + "description": "Deprecated: Prefer to use x/protocolpool module's CommunityPool rpc method.\nSince: cosmos-sdk 0.50", + "operationId": "CommunityPool", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "accounts": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "pool": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" } - } + }, + "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." }, - "description": "QueryModuleAccountsResponse is the response type for the Query/ModuleAccounts RPC method.\n\nSince: cosmos-sdk 0.46" + "description": "pool defines community pool's coins." } - } + }, + "description": "QueryCommunityPoolResponse is the response type for the Query/CommunityPool\nRPC method.\n\nDeprecated\nSince: cosmos-sdk 0.50" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" } } } @@ -10536,90 +10642,96 @@ } } } - } + }, + "tags": [ + "Query" + ] } }, - "/cosmos/auth/v1beta1/module_accounts/{name}": { + "/cosmos/distribution/v1beta1/delegators/{delegator_address}/rewards": { "get": { - "tags": [ - "Query" - ], - "summary": "ModuleAccountByName returns the module account info by module name", - "operationId": "ModuleAccountByName", - "parameters": [ - { - "name": "name", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], + "summary": "DelegationTotalRewards queries the total rewards accrued by each\nvalidator.", + "operationId": "DelegationTotalRewards", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "account": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" + "schema": { + "type": "object", + "properties": { + "rewards": { + "type": "array", + "items": { + "type": "object", + "properties": { + "validator_address": { + "type": "string" + }, + "reward": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." } + } + }, + "description": "DelegationDelegatorReward represents the properties\nof a delegator's delegation reward." + }, + "description": "rewards defines all the rewards accrued by a delegator." + }, + "total": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } + "amount": { + "type": "string" + } + }, + "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." }, - "description": "QueryModuleAccountByNameResponse is the response type for the Query/ModuleAccountByName RPC method." + "description": "total defines the sum of all the rewards." } - } + }, + "description": "QueryDelegationTotalRewardsResponse is the response type for the\nQuery/DelegationTotalRewards RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" } } } @@ -10627,90 +10739,77 @@ } } } - } + }, + "parameters": [ + { + "name": "delegator_address", + "description": "delegator_address defines the delegator address to query for.", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "Query" + ] } }, - "/cosmos/auth/v1beta1/params": { + "/cosmos/distribution/v1beta1/delegators/{delegator_address}/rewards/{validator_address}": { "get": { - "tags": [ - "Query" - ], - "summary": "Params queries all parameters.", - "operationId": "AuthParams", + "summary": "DelegationRewards queries the total rewards accrued by a delegation.", + "operationId": "DelegationRewards", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "params": { - "type": "object", - "properties": { - "max_memo_characters": { - "type": "string", - "format": "uint64" - }, - "tx_sig_limit": { - "type": "string", - "format": "uint64" - }, - "tx_size_cost_per_byte": { - "type": "string", - "format": "uint64" - }, - "sig_verify_cost_ed25519": { - "type": "string", - "format": "uint64" - }, - "sig_verify_cost_secp256k1": { - "type": "string", - "format": "uint64" - } + "schema": { + "type": "object", + "properties": { + "rewards": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" }, - "description": "params defines the parameters of the module." - } + "amount": { + "type": "string" + } + }, + "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." }, - "description": "QueryParamsResponse is the response type for the Query/Params RPC method." + "description": "rewards defines the rewards accrued by a delegation." } - } + }, + "description": "QueryDelegationRewardsResponse is the response type for the\nQuery/DelegationRewards RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" } } } @@ -10718,179 +10817,75 @@ } } } - } - } - }, - "/cosmos/authz/v1beta1/grants": { - "get": { - "tags": [ - "Query" - ], - "summary": "Returns list of `Authorization`, granted to the grantee by the granter.", - "operationId": "Grants", + }, "parameters": [ { - "name": "granter", - "in": "query", - "schema": { - "type": "string" - } - }, - { - "name": "grantee", - "in": "query", - "schema": { - "type": "string" - } - }, - { - "name": "msg_type_url", - "in": "query", - "description": "Optional, msg_type_url, when set, will query only grants matching given msg type.", - "schema": { - "type": "string" - } - }, - { - "name": "pagination.key", - "in": "query", - "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } - }, - { - "name": "pagination.offset", - "in": "query", - "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.limit", - "in": "query", - "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.count_total", - "in": "query", - "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } + "name": "delegator_address", + "description": "delegator_address defines the delegator address to query for.", + "in": "path", + "required": true, + "type": "string" }, { - "name": "pagination.reverse", - "in": "query", - "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } + "name": "validator_address", + "description": "validator_address defines the validator address to query for.", + "in": "path", + "required": true, + "type": "string" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/distribution/v1beta1/delegators/{delegator_address}/validators": { + "get": { + "summary": "DelegatorValidators queries the validators of a delegator.", + "operationId": "DistDelegatorValidators", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "grants": { - "type": "array", - "description": "authorizations is a list of grants granted for grantee by granter.", - "items": { - "type": "object", - "properties": { - "authorization": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "expiration": { - "title": "time when the grant will expire and will be pruned. If null, then the grant\ndoesn't have a time expiration (other conditions in `authorization`\nmay apply to invalidate the grant)", - "type": "string", - "format": "date-time" - } - }, - "description": "Grant gives permissions to execute\nthe provide method with expiration time." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines an pagination for the response." - } + "schema": { + "type": "object", + "properties": { + "validators": { + "type": "array", + "items": { + "type": "string" }, - "description": "QueryGrantsResponse is the response type for the Query/Authorizations RPC method." + "description": "validators defines the validators a delegator is delegating for." } - } + }, + "description": "QueryDelegatorValidatorsResponse is the response type for the\nQuery/DelegatorValidators RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" } } } @@ -10898,171 +10893,319 @@ } } } - } - } - }, - "/cosmos/authz/v1beta1/grants/grantee/{grantee}": { - "get": { - "tags": [ - "Query" - ], - "summary": "GranteeGrants returns a list of `GrantAuthorization` by grantee.", - "description": "Since: cosmos-sdk 0.46", - "operationId": "GranteeGrants", + }, "parameters": [ { - "name": "grantee", + "name": "delegator_address", + "description": "delegator_address defines the delegator address to query for.", "in": "path", "required": true, + "type": "string" + } + ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/distribution/v1beta1/delegators/{delegator_address}/withdraw_address": { + "get": { + "summary": "DelegatorWithdrawAddress queries withdraw address of a delegator.", + "operationId": "DelegatorWithdrawAddress", + "responses": { + "200": { + "description": "A successful response.", "schema": { - "type": "string" + "type": "object", + "properties": { + "withdraw_address": { + "type": "string", + "description": "withdraw_address defines the delegator address to query for." + } + }, + "description": "QueryDelegatorWithdrawAddressResponse is the response type for the\nQuery/DelegatorWithdrawAddress RPC method." } }, - { - "name": "pagination.key", - "in": "query", - "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", + "default": { + "description": "An unexpected error response.", "schema": { - "type": "string", - "format": "byte" + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" + } + } + } + } + } } - }, + } + }, + "parameters": [ { - "name": "pagination.offset", - "in": "query", - "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", + "name": "delegator_address", + "description": "delegator_address defines the delegator address to query for.", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/distribution/v1beta1/params": { + "get": { + "summary": "Params queries params of the distribution module.", + "operationId": "DistributionParams", + "responses": { + "200": { + "description": "A successful response.", "schema": { - "type": "string", - "format": "uint64" + "type": "object", + "properties": { + "params": { + "description": "params defines the parameters of the module.", + "type": "object", + "properties": { + "community_tax": { + "type": "string" + }, + "base_proposer_reward": { + "type": "string", + "description": "Deprecated: The base_proposer_reward field is deprecated and is no longer used\nin the x/distribution module's reward mechanism." + }, + "bonus_proposer_reward": { + "type": "string", + "description": "Deprecated: The bonus_proposer_reward field is deprecated and is no longer used\nin the x/distribution module's reward mechanism." + }, + "withdraw_addr_enabled": { + "type": "boolean" + } + } + } + }, + "description": "QueryParamsResponse is the response type for the Query/Params RPC method." } }, - { - "name": "pagination.limit", - "in": "query", - "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", + "default": { + "description": "An unexpected error response.", "schema": { - "type": "string", - "format": "uint64" + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" + } + } + } + } + } } - }, - { - "name": "pagination.count_total", - "in": "query", - "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", + } + }, + "tags": [ + "Query" + ] + } + }, + "/cosmos/distribution/v1beta1/validators/{validator_address}": { + "get": { + "summary": "ValidatorDistributionInfo queries validator commission and self-delegation rewards for validator", + "operationId": "ValidatorDistributionInfo", + "responses": { + "200": { + "description": "A successful response.", "schema": { - "type": "boolean" + "type": "object", + "properties": { + "operator_address": { + "type": "string", + "description": "operator_address defines the validator operator address." + }, + "self_bond_rewards": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." + }, + "description": "self_bond_rewards defines the self delegations rewards." + }, + "commission": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." + }, + "description": "commission defines the commission the validator received." + } + }, + "description": "QueryValidatorDistributionInfoResponse is the response type for the Query/ValidatorDistributionInfo RPC method." } }, - { - "name": "pagination.reverse", - "in": "query", - "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", + "default": { + "description": "An unexpected error response.", "schema": { - "type": "boolean" + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" + } + } + } + } + } } } + }, + "parameters": [ + { + "name": "validator_address", + "description": "validator_address defines the validator address to query for.", + "in": "path", + "required": true, + "type": "string" + } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/distribution/v1beta1/validators/{validator_address}/commission": { + "get": { + "summary": "ValidatorCommission queries accumulated commission for a validator.", + "operationId": "ValidatorCommission", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "commission": { + "description": "commission defines the commission the validator received.", "type": "object", "properties": { - "grants": { + "commission": { "type": "array", - "description": "grants is a list of grants granted to the grantee.", "items": { - "title": "GrantAuthorization extends a grant with both the addresses of the grantee and granter.\nIt is used in genesis.proto and query.proto", "type": "object", "properties": { - "granter": { + "denom": { "type": "string" }, - "grantee": { + "amount": { "type": "string" - }, - "authorization": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "expiration": { - "type": "string", - "format": "date-time" } - } - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines an pagination for the response." + "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." + } } - }, - "description": "QueryGranteeGrantsResponse is the response type for the Query/GranteeGrants RPC method." + } } - } + }, + "title": "QueryValidatorCommissionResponse is the response type for the\nQuery/ValidatorCommission RPC method" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" } } } @@ -11070,171 +11213,82 @@ } } } - } - } - }, - "/cosmos/authz/v1beta1/grants/granter/{granter}": { - "get": { - "tags": [ - "Query" - ], - "summary": "GranterGrants returns list of `GrantAuthorization`, granted by granter.", - "description": "Since: cosmos-sdk 0.46", - "operationId": "GranterGrants", + }, "parameters": [ { - "name": "granter", + "name": "validator_address", + "description": "validator_address defines the validator address to query for.", "in": "path", "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "pagination.key", - "in": "query", - "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } - }, - { - "name": "pagination.offset", - "in": "query", - "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.limit", - "in": "query", - "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.count_total", - "in": "query", - "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } - }, - { - "name": "pagination.reverse", - "in": "query", - "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } + "type": "string" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/distribution/v1beta1/validators/{validator_address}/outstanding_rewards": { + "get": { + "summary": "ValidatorOutstandingRewards queries rewards of a validator address.", + "operationId": "ValidatorOutstandingRewards", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "rewards": { "type": "object", "properties": { - "grants": { + "rewards": { "type": "array", - "description": "grants is a list of grants granted by the granter.", "items": { - "title": "GrantAuthorization extends a grant with both the addresses of the grantee and granter.\nIt is used in genesis.proto and query.proto", "type": "object", "properties": { - "granter": { + "denom": { "type": "string" }, - "grantee": { + "amount": { "type": "string" - }, - "authorization": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "expiration": { - "type": "string", - "format": "date-time" } - } - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines an pagination for the response." + "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." + } } }, - "description": "QueryGranterGrantsResponse is the response type for the Query/GranterGrants RPC method." + "description": "ValidatorOutstandingRewards represents outstanding (un-withdrawn) rewards\nfor a validator inexpensive to track, allows simple sanity checks." } - } + }, + "description": "QueryValidatorOutstandingRewardsResponse is the response type for the\nQuery/ValidatorOutstandingRewards RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" } } } @@ -11242,1034 +11296,1238 @@ } } } - } - } - }, - "/cosmos/bank/v1beta1/balances/{address}": { - "get": { - "tags": [ - "Query" - ], - "summary": "AllBalances queries the balance of all coins for a single account.", - "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", - "operationId": "AllBalances", + }, "parameters": [ { - "name": "address", + "name": "validator_address", + "description": "validator_address defines the validator address to query for.", "in": "path", - "description": "address is the address to query balances for.", "required": true, + "type": "string" + } + ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/distribution/v1beta1/validators/{validator_address}/slashes": { + "get": { + "summary": "ValidatorSlashes queries slash events of a validator.", + "operationId": "ValidatorSlashes", + "responses": { + "200": { + "description": "A successful response.", "schema": { - "type": "string" + "type": "object", + "properties": { + "slashes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "validator_period": { + "type": "string", + "format": "uint64" + }, + "fraction": { + "type": "string" + } + }, + "description": "ValidatorSlashEvent represents a validator slash event.\nHeight is implicit within the store key.\nThis is needed to calculate appropriate amount of staking tokens\nfor delegations which are withdrawn after a slash has occurred." + }, + "description": "slashes defines the slashes the validator received." + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "description": "QueryValidatorSlashesResponse is the response type for the\nQuery/ValidatorSlashes RPC method." } }, - { - "name": "pagination.key", - "in": "query", - "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", + "default": { + "description": "An unexpected error response.", "schema": { - "type": "string", - "format": "byte" + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" + } + } + } + } + } } + } + }, + "parameters": [ + { + "name": "validator_address", + "description": "validator_address defines the validator address to query for.", + "in": "path", + "required": true, + "type": "string" }, { - "name": "pagination.offset", + "name": "starting_height", + "description": "starting_height defines the optional starting height to query the slashes.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "ending_height", + "description": "starting_height defines the optional ending height to query the slashes.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.key", + "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", "in": "query", + "required": false, + "type": "string", + "format": "byte" + }, + { + "name": "pagination.offset", "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.limit", - "in": "query", "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.count_total", - "in": "query", "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } + "in": "query", + "required": false, + "type": "boolean" }, { "name": "pagination.reverse", - "in": "query", "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } - }, - { - "name": "resolve_denom", "in": "query", - "description": "resolve_denom is the flag to resolve the denom into a human-readable form from the metadata.\n\nSince: cosmos-sdk 0.50", - "schema": { - "type": "boolean" - } + "required": false, + "type": "boolean" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/feegrant/v1beta1/allowance/{granter}/{grantee}": { + "get": { + "summary": "Allowance returns granted allwance to the grantee by the granter.", + "operationId": "Allowance", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "allowance": { + "description": "allowance is a allowance granted for grantee by granter.", "type": "object", "properties": { - "balances": { - "type": "array", - "description": "balances is the balances of all the coins.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } + "granter": { + "type": "string", + "description": "granter is the address of the user granting an allowance of their funds." }, - "pagination": { + "grantee": { + "type": "string", + "description": "grantee is the address of the user being granted an allowance of another user's funds." + }, + "allowance": { + "description": "allowance can be any of basic, periodic, allowed fee allowance.", "type": "object", "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "type_url": { "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", + "value": { "type": "string", - "format": "uint64" + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - }, - "description": "pagination defines the pagination in the response." + } } }, - "description": "QueryAllBalancesResponse is the response type for the Query/AllBalances RPC\nmethod." + "title": "Grant is stored in the KVStore to record a grant with full context" } - } + }, + "description": "QueryAllowanceResponse is the response type for the Query/Allowance RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/cosmos/bank/v1beta1/balances/{address}/by_denom": { - "get": { - "tags": [ - "Query" - ], - "summary": "Balance queries the balance of a single coin for a single account.", - "operationId": "BankBalance", + }, "parameters": [ { - "name": "address", + "name": "granter", + "description": "granter is the address of the user granting an allowance of their funds.", "in": "path", - "description": "address is the address to query balances for.", "required": true, - "schema": { - "type": "string" - } + "type": "string" }, { - "name": "denom", - "in": "query", - "description": "denom is the coin denom to query balances for.", - "schema": { - "type": "string" - } + "name": "grantee", + "description": "grantee is the address of the user being granted an allowance of another user's funds.", + "in": "path", + "required": true, + "type": "string" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/feegrant/v1beta1/allowances/{grantee}": { + "get": { + "summary": "Allowances returns all the grants for the given grantee address.", + "operationId": "Allowances", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "balance": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } + "schema": { + "type": "object", + "properties": { + "allowances": { + "type": "array", + "items": { + "type": "object", + "properties": { + "granter": { + "type": "string", + "description": "granter is the address of the user granting an allowance of their funds." }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } + "grantee": { + "type": "string", + "description": "grantee is the address of the user being granted an allowance of another user's funds." + }, + "allowance": { + "description": "allowance can be any of basic, periodic, allowed fee allowance.", + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + } + } + }, + "title": "Grant is stored in the KVStore to record a grant with full context" }, - "description": "QueryBalanceResponse is the response type for the Query/Balance RPC method." - } - } + "description": "allowances are allowance's granted for grantee by granter." + }, + "pagination": { + "description": "pagination defines an pagination for the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "description": "QueryAllowancesResponse is the response type for the Query/Allowances RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/cosmos/bank/v1beta1/denom_owners/{denom}": { - "get": { - "tags": [ - "Query" - ], - "summary": "DenomOwners queries for all account addresses that own a particular token\ndenomination.", - "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.\n\nSince: cosmos-sdk 0.46", - "operationId": "DenomOwners", + }, "parameters": [ { - "name": "denom", + "name": "grantee", "in": "path", - "description": "denom defines the coin denomination to query all account holders for.", "required": true, - "schema": { - "type": "string" - } + "type": "string" }, { "name": "pagination.key", - "in": "query", "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } + "in": "query", + "required": false, + "type": "string", + "format": "byte" }, { "name": "pagination.offset", - "in": "query", "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.limit", - "in": "query", "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.count_total", - "in": "query", "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } + "in": "query", + "required": false, + "type": "boolean" }, { "name": "pagination.reverse", - "in": "query", "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } + "in": "query", + "required": false, + "type": "boolean" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/feegrant/v1beta1/issued/{granter}": { + "get": { + "summary": "AllowancesByGranter returns all the grants given by an address", + "description": "Since: cosmos-sdk 0.46", + "operationId": "AllowancesByGranter", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "denom_owners": { - "type": "array", - "items": { + "schema": { + "type": "object", + "properties": { + "allowances": { + "type": "array", + "items": { + "type": "object", + "properties": { + "granter": { + "type": "string", + "description": "granter is the address of the user granting an allowance of their funds." + }, + "grantee": { + "type": "string", + "description": "grantee is the address of the user being granted an allowance of another user's funds." + }, + "allowance": { + "description": "allowance can be any of basic, periodic, allowed fee allowance.", "type": "object", "properties": { - "address": { + "type_url": { "type": "string", - "description": "address defines the address that owns a particular denomination." + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." }, - "balance": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - }, - "description": "DenomOwner defines structure representing an account that owns or holds a\nparticular denominated token. It contains the account address and account\nbalance of the denominated token.\n\nSince: cosmos-sdk 0.46" + } } }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } + "title": "Grant is stored in the KVStore to record a grant with full context" }, - "description": "QueryDenomOwnersResponse defines the RPC response of a DenomOwners RPC query.\n\nSince: cosmos-sdk 0.46" + "description": "allowances that have been issued by the granter." + }, + "pagination": { + "description": "pagination defines an pagination for the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } } - } + }, + "description": "QueryAllowancesByGranterResponse is the response type for the Query/AllowancesByGranter RPC method.\n\nSince: cosmos-sdk 0.46" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/cosmos/bank/v1beta1/denoms_metadata": { - "get": { - "tags": [ - "Query" - ], - "summary": "DenomsMetadata queries the client metadata for all registered coin\ndenominations.", - "operationId": "DenomsMetadata", + }, "parameters": [ + { + "name": "granter", + "in": "path", + "required": true, + "type": "string" + }, { "name": "pagination.key", - "in": "query", "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } + "in": "query", + "required": false, + "type": "string", + "format": "byte" }, { "name": "pagination.offset", - "in": "query", "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.limit", "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.limit", "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.count_total", - "in": "query", "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } + "in": "query", + "required": false, + "type": "boolean" }, { "name": "pagination.reverse", - "in": "query", "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } + "in": "query", + "required": false, + "type": "boolean" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/evidence/v1beta1/evidence": { + "get": { + "summary": "AllEvidence queries all evidence.", + "operationId": "AllEvidence", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "evidence": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "description": "evidence returns all evidences." + }, + "pagination": { + "description": "pagination defines the pagination in the response.", "type": "object", "properties": { - "metadatas": { - "type": "array", - "description": "metadata provides the client information for all the registered tokens.", - "items": { - "type": "object", - "properties": { - "description": { - "type": "string" - }, - "denom_units": { - "title": "denom_units represents the list of DenomUnit's for a given coin", - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string", - "description": "denom represents the string name of the given denom unit (e.g uatom)." - }, - "exponent": { - "type": "integer", - "description": "exponent represents power of 10 exponent that one must\nraise the base_denom to in order to equal the given DenomUnit's denom\n1 denom = 10^exponent base_denom\n(e.g. with a base_denom of uatom, one can create a DenomUnit of 'atom' with\nexponent = 6, thus: 1 atom = 10^6 uatom).", - "format": "int64" - }, - "aliases": { - "title": "aliases is a list of string aliases for the given denom", - "type": "array", - "items": { - "type": "string" - } - } - }, - "description": "DenomUnit represents a struct that describes a given\ndenomination unit of the basic token." - } - }, - "base": { - "type": "string", - "description": "base represents the base denom (should be the DenomUnit with exponent = 0)." - }, - "display": { - "type": "string", - "description": "display indicates the suggested denom that should be\ndisplayed in clients." - }, - "name": { - "title": "name defines the name of the token (eg: Cosmos Atom)", - "type": "string", - "description": "Since: cosmos-sdk 0.43" - }, - "symbol": { - "type": "string", - "description": "symbol is the token symbol usually shown on exchanges (eg: ATOM). This can\nbe the same as the display.\n\nSince: cosmos-sdk 0.43" - }, - "uri": { - "type": "string", - "description": "URI to a document (on or off-chain) that contains additional information. Optional.\n\nSince: cosmos-sdk 0.46" - }, - "uri_hash": { - "type": "string", - "description": "URIHash is a sha256 hash of a document pointed by URI. It's used to verify that\nthe document didn't change. Optional.\n\nSince: cosmos-sdk 0.46" - } - }, - "description": "Metadata represents a struct that describes\na basic token." - } + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" } - }, - "description": "QueryDenomsMetadataResponse is the response type for the Query/DenomsMetadata RPC\nmethod." + } } - } + }, + "description": "QueryAllEvidenceResponse is the response type for the Query/AllEvidence RPC\nmethod." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/cosmos/bank/v1beta1/denoms_metadata/{denom}": { - "get": { - "tags": [ - "Query" - ], - "summary": "DenomsMetadata queries the client metadata of a given coin denomination.", - "operationId": "DenomMetadata", + }, "parameters": [ { - "name": "denom", - "in": "path", - "description": "denom is the coin denom to query the metadata for.", - "required": true, - "schema": { - "type": "string" - } + "name": "pagination.key", + "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", + "in": "query", + "required": false, + "type": "string", + "format": "byte" + }, + { + "name": "pagination.offset", + "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.limit", + "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.count_total", + "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", + "in": "query", + "required": false, + "type": "boolean" + }, + { + "name": "pagination.reverse", + "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", + "in": "query", + "required": false, + "type": "boolean" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/evidence/v1beta1/evidence/{hash}": { + "get": { + "summary": "Evidence queries evidence based on evidence hash.", + "operationId": "Evidence", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "evidence": { "type": "object", "properties": { - "metadata": { - "type": "object", - "properties": { - "description": { - "type": "string" - }, - "denom_units": { - "title": "denom_units represents the list of DenomUnit's for a given coin", - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string", - "description": "denom represents the string name of the given denom unit (e.g uatom)." - }, - "exponent": { - "type": "integer", - "description": "exponent represents power of 10 exponent that one must\nraise the base_denom to in order to equal the given DenomUnit's denom\n1 denom = 10^exponent base_denom\n(e.g. with a base_denom of uatom, one can create a DenomUnit of 'atom' with\nexponent = 6, thus: 1 atom = 10^6 uatom).", - "format": "int64" - }, - "aliases": { - "title": "aliases is a list of string aliases for the given denom", - "type": "array", - "items": { - "type": "string" - } - } - }, - "description": "DenomUnit represents a struct that describes a given\ndenomination unit of the basic token." - } - }, - "base": { - "type": "string", - "description": "base represents the base denom (should be the DenomUnit with exponent = 0)." - }, - "display": { - "type": "string", - "description": "display indicates the suggested denom that should be\ndisplayed in clients." - }, - "name": { - "title": "name defines the name of the token (eg: Cosmos Atom)", - "type": "string", - "description": "Since: cosmos-sdk 0.43" - }, - "symbol": { - "type": "string", - "description": "symbol is the token symbol usually shown on exchanges (eg: ATOM). This can\nbe the same as the display.\n\nSince: cosmos-sdk 0.43" - }, - "uri": { - "type": "string", - "description": "URI to a document (on or off-chain) that contains additional information. Optional.\n\nSince: cosmos-sdk 0.46" - }, - "uri_hash": { - "type": "string", - "description": "URIHash is a sha256 hash of a document pointed by URI. It's used to verify that\nthe document didn't change. Optional.\n\nSince: cosmos-sdk 0.46" - } - }, - "description": "Metadata represents a struct that describes\na basic token." - } - }, - "description": "QueryDenomMetadataResponse is the response type for the Query/DenomMetadata RPC\nmethod." - } - } + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } + }, + "description": "QueryEvidenceResponse is the response type for the Query/Evidence RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/cosmos/bank/v1beta1/denoms_metadata_by_query_string": { - "get": { - "tags": [ - "Query" - ], - "summary": "DenomsMetadata queries the client metadata of a given coin denomination.", - "operationId": "DenomMetadataByQueryString", + }, "parameters": [ { - "name": "denom", + "name": "hash", + "description": "hash defines the evidence hash of the requested evidence.\n\nSince: cosmos-sdk 0.47", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "evidence_hash", + "description": "evidence_hash defines the hash of the requested evidence.\nDeprecated: Use hash, a HEX encoded string, instead.", "in": "query", - "description": "denom is the coin denom to query the metadata for.", - "schema": { - "type": "string" - } + "required": false, + "type": "string", + "format": "byte" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/gov/v1beta1/params/{params_type}": { + "get": { + "summary": "Params queries all parameters of the gov module.", + "operationId": "GovParams", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "voting_params": { + "description": "voting_params defines the parameters related to voting.", "type": "object", "properties": { - "metadata": { - "type": "object", - "properties": { - "description": { - "type": "string" - }, - "denom_units": { - "title": "denom_units represents the list of DenomUnit's for a given coin", - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string", - "description": "denom represents the string name of the given denom unit (e.g uatom)." - }, - "exponent": { - "type": "integer", - "description": "exponent represents power of 10 exponent that one must\nraise the base_denom to in order to equal the given DenomUnit's denom\n1 denom = 10^exponent base_denom\n(e.g. with a base_denom of uatom, one can create a DenomUnit of 'atom' with\nexponent = 6, thus: 1 atom = 10^6 uatom).", - "format": "int64" - }, - "aliases": { - "title": "aliases is a list of string aliases for the given denom", - "type": "array", - "items": { - "type": "string" - } - } - }, - "description": "DenomUnit represents a struct that describes a given\ndenomination unit of the basic token." - } - }, - "base": { - "type": "string", - "description": "base represents the base denom (should be the DenomUnit with exponent = 0)." - }, - "display": { - "type": "string", - "description": "display indicates the suggested denom that should be\ndisplayed in clients." - }, - "name": { - "title": "name defines the name of the token (eg: Cosmos Atom)", - "type": "string", - "description": "Since: cosmos-sdk 0.43" - }, - "symbol": { - "type": "string", - "description": "symbol is the token symbol usually shown on exchanges (eg: ATOM). This can\nbe the same as the display.\n\nSince: cosmos-sdk 0.43" - }, - "uri": { - "type": "string", - "description": "URI to a document (on or off-chain) that contains additional information. Optional.\n\nSince: cosmos-sdk 0.46" - }, - "uri_hash": { - "type": "string", - "description": "URIHash is a sha256 hash of a document pointed by URI. It's used to verify that\nthe document didn't change. Optional.\n\nSince: cosmos-sdk 0.46" - } - }, - "description": "Metadata represents a struct that describes\na basic token." + "voting_period": { + "type": "string", + "description": "Duration of the voting period." } - }, - "description": "QueryDenomMetadataByQueryStringResponse is the response type for the Query/DenomMetadata RPC\nmethod. Identical with QueryDenomMetadataResponse but receives denom as query string in request." - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { + } + }, + "deposit_params": { + "description": "deposit_params defines the parameters related to deposit.", "type": "object", "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { + "min_deposit": { "type": "array", "items": { "type": "object", "properties": { - "type_url": { + "denom": { "type": "string" }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" + "amount": { + "type": "string" } - } - } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "description": "Minimum deposit for a proposal to enter voting period." + }, + "max_deposit_period": { + "type": "string", + "description": "Maximum period for Atom holders to deposit on a proposal. Initial value: 2\nmonths." + } + } + }, + "tally_params": { + "description": "tally_params defines the parameters related to tally.", + "type": "object", + "properties": { + "quorum": { + "type": "string", + "format": "byte", + "description": "Minimum percentage of total stake needed to vote for a result to be\nconsidered valid." + }, + "threshold": { + "type": "string", + "format": "byte", + "description": "Minimum proportion of Yes votes for proposal to pass. Default value: 0.5." + }, + "veto_threshold": { + "type": "string", + "format": "byte", + "description": "Minimum value of Veto votes to Total votes ratio for proposal to be\nvetoed. Default value: 1/3." } } } + }, + "description": "QueryParamsResponse is the response type for the Query/Params RPC method." + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } + } } } } - } + }, + "parameters": [ + { + "name": "params_type", + "description": "params_type defines which parameters to query for, can be one of \"voting\",\n\"tallying\" or \"deposit\".", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "Query" + ] } }, - "/cosmos/bank/v1beta1/params": { + "/cosmos/gov/v1beta1/proposals": { "get": { - "tags": [ - "Query" - ], - "summary": "Params queries the parameters of x/bank module.", - "operationId": "BankParams", + "summary": "Proposals queries all proposals based on given status.", + "operationId": "Proposals", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "params": { - "type": "object", - "properties": { - "send_enabled": { - "type": "array", - "description": "Deprecated: Use of SendEnabled in params is deprecated.\nFor genesis, use the newly added send_enabled field in the genesis object.\nStorage, lookup, and manipulation of this information is now in the keeper.\n\nAs of cosmos-sdk 0.47, this only exists for backwards compatibility of genesis files.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "enabled": { - "type": "boolean" - } - }, - "description": "SendEnabled maps coin denom to a send_enabled status (whether a denom is\nsendable)." - } - }, - "default_send_enabled": { - "type": "boolean" - } + "schema": { + "type": "object", + "properties": { + "proposals": { + "type": "array", + "items": { + "type": "object", + "properties": { + "proposal_id": { + "type": "string", + "format": "uint64", + "description": "proposal_id defines the unique id of the proposal." }, - "description": "params provides the parameters of the bank module." - } - }, - "description": "QueryParamsResponse defines the response type for querying x/bank parameters." - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { + "content": { "type": "object", "properties": { "type_url": { - "type": "string" + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." }, "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", - "format": "byte" + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "status": { + "description": "status defines the proposal status.", + "type": "string", + "enum": [ + "PROPOSAL_STATUS_UNSPECIFIED", + "PROPOSAL_STATUS_DEPOSIT_PERIOD", + "PROPOSAL_STATUS_VOTING_PERIOD", + "PROPOSAL_STATUS_PASSED", + "PROPOSAL_STATUS_REJECTED", + "PROPOSAL_STATUS_FAILED" + ], + "default": "PROPOSAL_STATUS_UNSPECIFIED" + }, + "final_tally_result": { + "description": "final_tally_result is the final tally result of the proposal. When\nquerying a proposal via gRPC, this field is not populated until the\nproposal's voting period has ended.", + "type": "object", + "properties": { + "yes": { + "type": "string", + "description": "yes is the number of yes votes on a proposal." + }, + "abstain": { + "type": "string", + "description": "abstain is the number of abstain votes on a proposal." + }, + "no": { + "type": "string", + "description": "no is the number of no votes on a proposal." + }, + "no_with_veto": { + "type": "string", + "description": "no_with_veto is the number of no with veto votes on a proposal." } } + }, + "submit_time": { + "type": "string", + "format": "date-time", + "description": "submit_time is the time of proposal submission." + }, + "deposit_end_time": { + "type": "string", + "format": "date-time", + "description": "deposit_end_time is the end time for deposition." + }, + "total_deposit": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "description": "total_deposit is the total deposit on the proposal." + }, + "voting_start_time": { + "type": "string", + "format": "date-time", + "description": "voting_start_time is the starting time to vote on a proposal." + }, + "voting_end_time": { + "type": "string", + "format": "date-time", + "description": "voting_end_time is the end time of voting on a proposal." } + }, + "description": "Proposal defines the core field members of a governance proposal." + }, + "description": "proposals defines all the requested governance proposals." + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" } } } + }, + "description": "QueryProposalsResponse is the response type for the Query/Proposals RPC\nmethod." + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } + } } } } - } - } - }, - "/cosmos/bank/v1beta1/send_enabled": { - "get": { - "tags": [ - "Query" - ], - "summary": "SendEnabled queries for SendEnabled entries.", - "description": "This query only returns denominations that have specific SendEnabled settings.\nAny denomination that does not have a specific setting will use the default\nparams.default_send_enabled, and will not be returned by this query.\n\nSince: cosmos-sdk 0.47", - "operationId": "SendEnabled", + }, "parameters": [ { - "name": "denoms", + "name": "proposal_status", + "description": "proposal_status defines the status of the proposals.\n\n - PROPOSAL_STATUS_UNSPECIFIED: PROPOSAL_STATUS_UNSPECIFIED defines the default proposal status.\n - PROPOSAL_STATUS_DEPOSIT_PERIOD: PROPOSAL_STATUS_DEPOSIT_PERIOD defines a proposal status during the deposit\nperiod.\n - PROPOSAL_STATUS_VOTING_PERIOD: PROPOSAL_STATUS_VOTING_PERIOD defines a proposal status during the voting\nperiod.\n - PROPOSAL_STATUS_PASSED: PROPOSAL_STATUS_PASSED defines a proposal status of a proposal that has\npassed.\n - PROPOSAL_STATUS_REJECTED: PROPOSAL_STATUS_REJECTED defines a proposal status of a proposal that has\nbeen rejected.\n - PROPOSAL_STATUS_FAILED: PROPOSAL_STATUS_FAILED defines a proposal status of a proposal that has\nfailed.", "in": "query", - "description": "denoms is the specific denoms you want look up. Leave empty to get all entries.", - "style": "form", - "explode": true, - "schema": { - "type": "array", - "items": { - "type": "string" - } - } + "required": false, + "type": "string", + "enum": [ + "PROPOSAL_STATUS_UNSPECIFIED", + "PROPOSAL_STATUS_DEPOSIT_PERIOD", + "PROPOSAL_STATUS_VOTING_PERIOD", + "PROPOSAL_STATUS_PASSED", + "PROPOSAL_STATUS_REJECTED", + "PROPOSAL_STATUS_FAILED" + ], + "default": "PROPOSAL_STATUS_UNSPECIFIED" }, { - "name": "pagination.key", + "name": "voter", + "description": "voter defines the voter address for the proposals.", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "depositor", + "description": "depositor defines the deposit addresses from the proposals.", "in": "query", + "required": false, + "type": "string" + }, + { + "name": "pagination.key", "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } + "in": "query", + "required": false, + "type": "string", + "format": "byte" }, { "name": "pagination.offset", - "in": "query", "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.limit", - "in": "query", "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.count_total", - "in": "query", "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } + "in": "query", + "required": false, + "type": "boolean" }, { "name": "pagination.reverse", - "in": "query", "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } + "in": "query", + "required": false, + "type": "boolean" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/gov/v1beta1/proposals/{proposal_id}": { + "get": { + "summary": "Proposal queries proposal details based on ProposalID.", + "operationId": "Proposal", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "proposal": { "type": "object", "properties": { - "send_enabled": { + "proposal_id": { + "type": "string", + "format": "uint64", + "description": "proposal_id defines the unique id of the proposal." + }, + "content": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "status": { + "description": "status defines the proposal status.", + "type": "string", + "enum": [ + "PROPOSAL_STATUS_UNSPECIFIED", + "PROPOSAL_STATUS_DEPOSIT_PERIOD", + "PROPOSAL_STATUS_VOTING_PERIOD", + "PROPOSAL_STATUS_PASSED", + "PROPOSAL_STATUS_REJECTED", + "PROPOSAL_STATUS_FAILED" + ], + "default": "PROPOSAL_STATUS_UNSPECIFIED" + }, + "final_tally_result": { + "description": "final_tally_result is the final tally result of the proposal. When\nquerying a proposal via gRPC, this field is not populated until the\nproposal's voting period has ended.", + "type": "object", + "properties": { + "yes": { + "type": "string", + "description": "yes is the number of yes votes on a proposal." + }, + "abstain": { + "type": "string", + "description": "abstain is the number of abstain votes on a proposal." + }, + "no": { + "type": "string", + "description": "no is the number of no votes on a proposal." + }, + "no_with_veto": { + "type": "string", + "description": "no_with_veto is the number of no with veto votes on a proposal." + } + } + }, + "submit_time": { + "type": "string", + "format": "date-time", + "description": "submit_time is the time of proposal submission." + }, + "deposit_end_time": { + "type": "string", + "format": "date-time", + "description": "deposit_end_time is the end time for deposition." + }, + "total_deposit": { "type": "array", "items": { "type": "object", @@ -12277,150 +12535,262 @@ "denom": { "type": "string" }, - "enabled": { - "type": "boolean" + "amount": { + "type": "string" } }, - "description": "SendEnabled maps coin denom to a send_enabled status (whether a denom is\nsendable)." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." }, - "description": "pagination defines the pagination in the response. This field is only\npopulated if the denoms field in the request is empty." + "description": "total_deposit is the total deposit on the proposal." + }, + "voting_start_time": { + "type": "string", + "format": "date-time", + "description": "voting_start_time is the starting time to vote on a proposal." + }, + "voting_end_time": { + "type": "string", + "format": "date-time", + "description": "voting_end_time is the end time of voting on a proposal." } }, - "description": "QuerySendEnabledResponse defines the RPC response of a SendEnable query.\n\nSince: cosmos-sdk 0.47" + "description": "Proposal defines the core field members of a governance proposal." } - } + }, + "description": "QueryProposalResponse is the response type for the Query/Proposal RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } + }, + "parameters": [ + { + "name": "proposal_id", + "description": "proposal_id defines the unique id of the proposal.", + "in": "path", + "required": true, + "type": "string", + "format": "uint64" + } + ], + "tags": [ + "Query" + ] } }, - "/cosmos/bank/v1beta1/spendable_balances/{address}": { + "/cosmos/gov/v1beta1/proposals/{proposal_id}/deposits": { "get": { - "tags": [ - "Query" - ], - "summary": "SpendableBalances queries the spendable balance of all coins for a single\naccount.", - "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.\n\nSince: cosmos-sdk 0.46", - "operationId": "SpendableBalances", + "summary": "Deposits queries all deposits of a single proposal.", + "operationId": "Deposits", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "type": "object", + "properties": { + "deposits": { + "type": "array", + "items": { + "type": "object", + "properties": { + "proposal_id": { + "type": "string", + "format": "uint64", + "description": "proposal_id defines the unique id of the proposal." + }, + "depositor": { + "type": "string", + "description": "depositor defines the deposit addresses from the proposals." + }, + "amount": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "description": "amount to be deposited by depositor." + } + }, + "description": "Deposit defines an amount deposited by an account address to an active\nproposal." + }, + "description": "deposits defines the requested deposits." + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "description": "QueryDepositsResponse is the response type for the Query/Deposits RPC method." + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } + } + } + } + } + }, "parameters": [ { - "name": "address", + "name": "proposal_id", + "description": "proposal_id defines the unique id of the proposal.", "in": "path", - "description": "address is the address to query spendable balances for.", "required": true, - "schema": { - "type": "string" - } + "type": "string", + "format": "uint64" }, { "name": "pagination.key", - "in": "query", "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } + "in": "query", + "required": false, + "type": "string", + "format": "byte" }, { "name": "pagination.offset", - "in": "query", "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.limit", - "in": "query", "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.count_total", - "in": "query", "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } + "in": "query", + "required": false, + "type": "boolean" }, { "name": "pagination.reverse", - "in": "query", "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } + "in": "query", + "required": false, + "type": "boolean" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/gov/v1beta1/proposals/{proposal_id}/deposits/{depositor}": { + "get": { + "summary": "Deposit queries single deposit information based on proposalID, depositor address.", + "operationId": "Deposit", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "deposit": { "type": "object", "properties": { - "balances": { + "proposal_id": { + "type": "string", + "format": "uint64", + "description": "proposal_id defines the unique id of the proposal." + }, + "depositor": { + "type": "string", + "description": "depositor defines the deposit addresses from the proposals." + }, + "amount": { "type": "array", - "description": "balances is the spendable balances of all the coins.", "items": { "type": "object", "properties": { @@ -12432,527 +12802,595 @@ } }, "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } }, - "description": "pagination defines the pagination in the response." + "description": "amount to be deposited by depositor." } }, - "description": "QuerySpendableBalancesResponse defines the gRPC response structure for querying\nan account's spendable balances.\n\nSince: cosmos-sdk 0.46" + "description": "Deposit defines an amount deposited by an account address to an active\nproposal." } - } + }, + "description": "QueryDepositResponse is the response type for the Query/Deposit RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/cosmos/bank/v1beta1/spendable_balances/{address}/by_denom": { - "get": { - "tags": [ - "Query" - ], - "summary": "SpendableBalanceByDenom queries the spendable balance of a single denom for\na single account.", - "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.\n\nSince: cosmos-sdk 0.47", - "operationId": "SpendableBalanceByDenom", + }, "parameters": [ { - "name": "address", + "name": "proposal_id", + "description": "proposal_id defines the unique id of the proposal.", "in": "path", - "description": "address is the address to query balances for.", "required": true, - "schema": { - "type": "string" - } + "type": "string", + "format": "uint64" }, { - "name": "denom", - "in": "query", - "description": "denom is the coin denom to query balances for.", - "schema": { - "type": "string" - } + "name": "depositor", + "description": "depositor defines the deposit addresses from the proposals.", + "in": "path", + "required": true, + "type": "string" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/gov/v1beta1/proposals/{proposal_id}/tally": { + "get": { + "summary": "TallyResult queries the tally of a proposal vote.", + "operationId": "TallyResult", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "tally": { + "description": "tally defines the requested tally.", "type": "object", "properties": { - "balance": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + "yes": { + "type": "string", + "description": "yes is the number of yes votes on a proposal." + }, + "abstain": { + "type": "string", + "description": "abstain is the number of abstain votes on a proposal." + }, + "no": { + "type": "string", + "description": "no is the number of no votes on a proposal." + }, + "no_with_veto": { + "type": "string", + "description": "no_with_veto is the number of no with veto votes on a proposal." } - }, - "description": "QuerySpendableBalanceByDenomResponse defines the gRPC response structure for\nquerying an account's spendable balance for a specific denom.\n\nSince: cosmos-sdk 0.47" + } } - } + }, + "description": "QueryTallyResultResponse is the response type for the Query/Tally RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/cosmos/bank/v1beta1/supply": { - "get": { - "tags": [ - "Query" - ], - "summary": "TotalSupply queries the total supply of all coins.", - "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", - "operationId": "TotalSupply", + }, "parameters": [ { - "name": "pagination.key", - "in": "query", - "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } - }, - { - "name": "pagination.offset", - "in": "query", - "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.limit", - "in": "query", - "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.count_total", - "in": "query", - "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } - }, - { - "name": "pagination.reverse", - "in": "query", - "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } + "name": "proposal_id", + "description": "proposal_id defines the unique id of the proposal.", + "in": "path", + "required": true, + "type": "string", + "format": "uint64" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/gov/v1beta1/proposals/{proposal_id}/votes": { + "get": { + "summary": "Votes queries votes of a given proposal.", + "operationId": "Votes", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "title": "QueryTotalSupplyResponse is the response type for the Query/TotalSupply RPC\nmethod", - "type": "object", - "properties": { - "supply": { - "title": "supply is the supply of the coins", - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" + "schema": { + "type": "object", + "properties": { + "votes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "proposal_id": { + "type": "string", + "format": "uint64", + "description": "proposal_id defines the unique id of the proposal." + }, + "voter": { + "type": "string", + "description": "voter is the voter address of the proposal." + }, + "option": { + "description": "Deprecated: Prefer to use `options` instead. This field is set in queries\nif and only if `len(options) == 1` and that option has weight 1. In all\nother cases, this field will default to VOTE_OPTION_UNSPECIFIED.", + "type": "string", + "enum": [ + "VOTE_OPTION_UNSPECIFIED", + "VOTE_OPTION_YES", + "VOTE_OPTION_ABSTAIN", + "VOTE_OPTION_NO", + "VOTE_OPTION_NO_WITH_VETO" + ], + "default": "VOTE_OPTION_UNSPECIFIED" + }, + "options": { + "type": "array", + "items": { + "type": "object", + "properties": { + "option": { + "description": "option defines the valid vote options, it must not contain duplicate vote options.", + "type": "string", + "enum": [ + "VOTE_OPTION_UNSPECIFIED", + "VOTE_OPTION_YES", + "VOTE_OPTION_ABSTAIN", + "VOTE_OPTION_NO", + "VOTE_OPTION_NO_WITH_VETO" + ], + "default": "VOTE_OPTION_UNSPECIFIED" + }, + "weight": { + "type": "string", + "description": "weight is the vote weight associated with the vote option." + } }, - "amount": { - "type": "string" - } + "description": "WeightedVoteOption defines a unit of vote for vote split.\n\nSince: cosmos-sdk 0.43" }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + "description": "options is the weighted vote options.\n\nSince: cosmos-sdk 0.43" } }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response.\n\nSince: cosmos-sdk 0.43" + "description": "Vote defines a vote on a governance proposal.\nA Vote consists of a proposal ID, the voter, and the vote option." + }, + "description": "votes defines the queried votes." + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" } } } - } + }, + "description": "QueryVotesResponse is the response type for the Query/Votes RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/cosmos/bank/v1beta1/supply/by_denom": { - "get": { - "tags": [ - "Query" - ], - "summary": "SupplyOf queries the supply of a single coin.", - "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", - "operationId": "SupplyOf", + }, "parameters": [ { - "name": "denom", + "name": "proposal_id", + "description": "proposal_id defines the unique id of the proposal.", + "in": "path", + "required": true, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.key", + "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", "in": "query", - "description": "denom is the coin denom to query balances for.", - "schema": { - "type": "string" - } + "required": false, + "type": "string", + "format": "byte" + }, + { + "name": "pagination.offset", + "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.limit", + "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.count_total", + "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", + "in": "query", + "required": false, + "type": "boolean" + }, + { + "name": "pagination.reverse", + "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", + "in": "query", + "required": false, + "type": "boolean" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/gov/v1beta1/proposals/{proposal_id}/votes/{voter}": { + "get": { + "summary": "Vote queries voted information based on proposalID, voterAddr.\nDue to how we handle state, this query would error for proposals that has already been finished.", + "operationId": "Vote", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "amount": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "description": "QuerySupplyOfResponse is the response type for the Query/SupplyOf RPC method." - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "vote": { "type": "object", "properties": { - "error": { - "type": "string" + "proposal_id": { + "type": "string", + "format": "uint64", + "description": "proposal_id defines the unique id of the proposal." }, - "code": { - "type": "integer", - "format": "int32" + "voter": { + "type": "string", + "description": "voter is the voter address of the proposal." }, - "message": { - "type": "string" + "option": { + "description": "Deprecated: Prefer to use `options` instead. This field is set in queries\nif and only if `len(options) == 1` and that option has weight 1. In all\nother cases, this field will default to VOTE_OPTION_UNSPECIFIED.", + "type": "string", + "enum": [ + "VOTE_OPTION_UNSPECIFIED", + "VOTE_OPTION_YES", + "VOTE_OPTION_ABSTAIN", + "VOTE_OPTION_NO", + "VOTE_OPTION_NO_WITH_VETO" + ], + "default": "VOTE_OPTION_UNSPECIFIED" }, - "details": { + "options": { "type": "array", "items": { "type": "object", "properties": { - "type_url": { - "type": "string" + "option": { + "description": "option defines the valid vote options, it must not contain duplicate vote options.", + "type": "string", + "enum": [ + "VOTE_OPTION_UNSPECIFIED", + "VOTE_OPTION_YES", + "VOTE_OPTION_ABSTAIN", + "VOTE_OPTION_NO", + "VOTE_OPTION_NO_WITH_VETO" + ], + "default": "VOTE_OPTION_UNSPECIFIED" }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "weight": { "type": "string", - "format": "byte" + "description": "weight is the vote weight associated with the vote option." } - } - } + }, + "description": "WeightedVoteOption defines a unit of vote for vote split.\n\nSince: cosmos-sdk 0.43" + }, + "description": "options is the weighted vote options.\n\nSince: cosmos-sdk 0.43" } + }, + "description": "Vote defines a vote on a governance proposal.\nA Vote consists of a proposal ID, the voter, and the vote option." + } + }, + "description": "QueryVoteResponse is the response type for the Query/Vote RPC method." + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } + }, + "parameters": [ + { + "name": "proposal_id", + "description": "proposal_id defines the unique id of the proposal.", + "in": "path", + "required": true, + "type": "string", + "format": "uint64" + }, + { + "name": "voter", + "description": "voter defines the voter address for the proposals.", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "Query" + ] } }, - "/cosmos/distribution/v1beta1/community_pool": { + "/cosmos/gov/v1/constitution": { "get": { - "tags": [ - "Query" - ], - "summary": "CommunityPool queries the community pool coins.", - "operationId": "CommunityPool", + "summary": "Constitution queries the chain's constitution.", + "operationId": "Constitution", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "pool": { - "type": "array", - "description": "pool defines community pool's coins.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." - } - } - }, - "description": "QueryCommunityPoolResponse is the response type for the Query/CommunityPool\nRPC method." + "schema": { + "type": "object", + "properties": { + "constitution": { + "type": "string" } - } + }, + "title": "QueryConstitutionResponse is the response type for the Query/Constitution RPC method" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } + }, + "tags": [ + "Query" + ] } }, - "/cosmos/distribution/v1beta1/delegators/{delegator_address}/rewards": { + "/cosmos/gov/v1/params/{params_type}": { "get": { - "tags": [ - "Query" - ], - "summary": "DelegationTotalRewards queries the total rewards accrued by each\nvalidator.", - "operationId": "DelegationTotalRewards", - "parameters": [ - { - "name": "delegator_address", - "in": "path", - "description": "delegator_address defines the delegator address to query for.", - "required": true, - "schema": { - "type": "string" - } - } - ], + "summary": "Params queries all parameters of the gov module.", + "operationId": "GovV1Params", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "voting_params": { + "description": "Deprecated: Prefer to use `params` instead.\nvoting_params defines the parameters related to voting.", "type": "object", "properties": { - "rewards": { + "voting_period": { + "type": "string", + "description": "Duration of the voting period." + } + } + }, + "deposit_params": { + "description": "Deprecated: Prefer to use `params` instead.\ndeposit_params defines the parameters related to deposit.", + "type": "object", + "properties": { + "min_deposit": { "type": "array", - "description": "rewards defines all the rewards accrued by a delegator.", "items": { "type": "object", "properties": { - "validator_address": { + "denom": { "type": "string" }, - "reward": { - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." - } + "amount": { + "type": "string" } }, - "description": "DelegationDelegatorReward represents the properties\nof a delegator's delegation reward." - } + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "description": "Minimum deposit for a proposal to enter voting period." }, - "total": { + "max_deposit_period": { + "type": "string", + "description": "Maximum period for Atom holders to deposit on a proposal. Initial value: 2\nmonths." + } + } + }, + "tally_params": { + "description": "Deprecated: Prefer to use `params` instead.\ntally_params defines the parameters related to tally.", + "type": "object", + "properties": { + "quorum": { + "type": "string", + "description": "Minimum percentage of total stake needed to vote for a result to be\nconsidered valid." + }, + "threshold": { + "type": "string", + "description": "Minimum proportion of Yes votes for proposal to pass. Default value: 0.5." + }, + "veto_threshold": { + "type": "string", + "description": "Minimum value of Veto votes to Total votes ratio for proposal to be\nvetoed. Default value: 1/3." + } + } + }, + "params": { + "description": "params defines all the parameters of x/gov module.\n\nSince: cosmos-sdk 0.47", + "type": "object", + "properties": { + "min_deposit": { "type": "array", - "description": "total defines the sum of all the rewards.", "items": { "type": "object", "properties": { @@ -12963,964 +13401,1377 @@ "type": "string" } }, - "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." - } - } - }, - "description": "QueryDelegationTotalRewardsResponse is the response type for the\nQuery/DelegationTotalRewards RPC method." - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "description": "Minimum deposit for a proposal to enter voting period." }, - "code": { - "type": "integer", - "format": "int32" + "max_deposit_period": { + "type": "string", + "description": "Maximum period for Atom holders to deposit on a proposal. Initial value: 2\nmonths." }, - "message": { - "type": "string" + "voting_period": { + "type": "string", + "description": "Duration of the voting period." + }, + "quorum": { + "type": "string", + "description": "Minimum percentage of total stake needed to vote for a result to be\n considered valid." + }, + "threshold": { + "type": "string", + "description": "Minimum proportion of Yes votes for proposal to pass. Default value: 0.5." + }, + "veto_threshold": { + "type": "string", + "description": "Minimum value of Veto votes to Total votes ratio for proposal to be\n vetoed. Default value: 1/3." + }, + "min_initial_deposit_ratio": { + "type": "string", + "description": "The ratio representing the proportion of the deposit value that must be paid at proposal submission." + }, + "proposal_cancel_ratio": { + "type": "string", + "description": "The cancel ratio which will not be returned back to the depositors when a proposal is cancelled.\n\nSince: cosmos-sdk 0.50" + }, + "proposal_cancel_dest": { + "type": "string", + "description": "The address which will receive (proposal_cancel_ratio * deposit) proposal deposits.\nIf empty, the (proposal_cancel_ratio * deposit) proposal deposits will be burned.\n\nSince: cosmos-sdk 0.50" + }, + "expedited_voting_period": { + "type": "string", + "description": "Duration of the voting period of an expedited proposal.\n\nSince: cosmos-sdk 0.50" + }, + "expedited_threshold": { + "type": "string", + "description": "Minimum proportion of Yes votes for proposal to pass. Default value: 0.67.\n\nSince: cosmos-sdk 0.50" }, - "details": { + "expedited_min_deposit": { "type": "array", "items": { "type": "object", "properties": { - "type_url": { + "denom": { "type": "string" }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" + "amount": { + "type": "string" } - } - } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "description": "Minimum expedited deposit for a proposal to enter voting period." + }, + "burn_vote_quorum": { + "type": "boolean", + "description": "Since: cosmos-sdk 0.47", + "title": "burn deposits if a proposal does not meet quorum" + }, + "burn_proposal_deposit_prevote": { + "type": "boolean", + "description": "Since: cosmos-sdk 0.47", + "title": "burn deposits if the proposal does not enter voting period" + }, + "burn_vote_veto": { + "type": "boolean", + "description": "Since: cosmos-sdk 0.47", + "title": "burn deposits if quorum with vote type no_veto is met" + }, + "min_deposit_ratio": { + "type": "string", + "description": "The ratio representing the proportion of the deposit value minimum that must be met when making a deposit.\nDefault value: 0.01. Meaning that for a chain with a min_deposit of 100stake, a deposit of 1stake would be\nrequired.\n\nSince: cosmos-sdk 0.50" + }, + "proposal_cancel_max_period": { + "type": "string", + "description": "proposal_cancel_max_period defines how far in the voting period a proposer can cancel a proposal.\nIf the proposal is cancelled before the max cancel period, the deposit will be returned/burn to the\ndepositors, according to the proposal_cancel_ratio and proposal_cancel_dest parameters.\nAfter the max cancel period, the proposal cannot be cancelled anymore." + }, + "optimistic_authorized_addresses": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Since: x/gov v1.0.0", + "title": "optimistic_authorized_addresses is an optional governance parameter that limits the authorized accounts than can\nsubmit optimistic proposals" + }, + "optimistic_rejected_threshold": { + "type": "string", + "description": "optimistic rejected threshold defines at which percentage of NO votes, the optimistic proposal should fail and be\nconverted to a standard proposal. The threshold is expressed as a percentage of the total bonded tokens.\n\nSince: x/gov v1.0.0" } } } + }, + "description": "QueryParamsResponse is the response type for the Query/Params RPC method." + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } + } } } } - } - } - }, - "/cosmos/distribution/v1beta1/delegators/{delegator_address}/rewards/{validator_address}": { - "get": { - "tags": [ - "Query" - ], - "summary": "DelegationRewards queries the total rewards accrued by a delegation.", - "operationId": "DelegationRewards", + }, "parameters": [ { - "name": "delegator_address", - "in": "path", - "description": "delegator_address defines the delegator address to query for.", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "validator_address", + "name": "params_type", + "description": "params_type defines which parameters to query for, can be one of \"voting\",\n\"tallying\" or \"deposit\".", "in": "path", - "description": "validator_address defines the validator address to query for.", "required": true, - "schema": { - "type": "string" - } + "type": "string" } ], - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "rewards": { - "type": "array", - "description": "rewards defines the rewards accrued by a delegation.", - "items": { + "tags": [ + "Query" + ] + } + }, + "/cosmos/gov/v1/proposals": { + "get": { + "summary": "Proposals queries all proposals based on given status.", + "operationId": "GovV1Proposal", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "type": "object", + "properties": { + "proposals": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uint64", + "description": "id defines the unique id of the proposal." + }, + "messages": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "description": "messages are the arbitrary messages to be executed if the proposal passes." + }, + "status": { + "description": "status defines the proposal status.", + "type": "string", + "enum": [ + "PROPOSAL_STATUS_UNSPECIFIED", + "PROPOSAL_STATUS_DEPOSIT_PERIOD", + "PROPOSAL_STATUS_VOTING_PERIOD", + "PROPOSAL_STATUS_PASSED", + "PROPOSAL_STATUS_REJECTED", + "PROPOSAL_STATUS_FAILED" + ], + "default": "PROPOSAL_STATUS_UNSPECIFIED" + }, + "final_tally_result": { + "description": "final_tally_result is the final tally result of the proposal. When\nquerying a proposal via gRPC, this field is not populated until the\nproposal's voting period has ended.", "type": "object", "properties": { - "denom": { - "type": "string" + "yes_count": { + "type": "string", + "description": "yes_count is the number of yes votes on a proposal." }, - "amount": { - "type": "string" + "abstain_count": { + "type": "string", + "description": "abstain_count is the number of abstain votes on a proposal." + }, + "no_count": { + "type": "string", + "description": "no_count is the number of no votes on a proposal." + }, + "no_with_veto_count": { + "type": "string", + "description": "no_with_veto_count is the number of no with veto votes on a proposal." + }, + "spam_count": { + "type": "string", + "description": "spam_count is the number of spam votes on a proposal." } + } + }, + "submit_time": { + "type": "string", + "format": "date-time", + "description": "submit_time is the time of proposal submission." + }, + "deposit_end_time": { + "type": "string", + "format": "date-time", + "description": "deposit_end_time is the end time for deposition." + }, + "total_deposit": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." }, - "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." + "description": "total_deposit is the total deposit on the proposal." + }, + "voting_start_time": { + "type": "string", + "format": "date-time", + "description": "voting_start_time is the starting time to vote on a proposal." + }, + "voting_end_time": { + "type": "string", + "format": "date-time", + "description": "voting_end_time is the end time of voting on a proposal." + }, + "metadata": { + "type": "string", + "title": "metadata is any arbitrary metadata attached to the proposal.\nthe recommended format of the metadata is to be found here:\nhttps://docs.cosmos.network/v0.47/modules/gov#proposal-3" + }, + "title": { + "type": "string", + "description": "Since: cosmos-sdk 0.47", + "title": "title is the title of the proposal" + }, + "summary": { + "type": "string", + "description": "Since: cosmos-sdk 0.47", + "title": "summary is a short summary of the proposal" + }, + "proposer": { + "type": "string", + "description": "Since: cosmos-sdk 0.47", + "title": "proposer is the address of the proposal sumbitter" + }, + "expedited": { + "type": "boolean", + "description": "Since: cosmos-sdk 0.50\nDeprecated: Use ProposalType instead.", + "title": "expedited defines if the proposal is expedited" + }, + "failed_reason": { + "type": "string", + "description": "Since: cosmos-sdk 0.50", + "title": "failed_reason defines the reason why the proposal failed" + }, + "proposal_type": { + "description": "Since: cosmos-sdk 0.51", + "title": "proposal_type defines the type of the proposal", + "type": "string", + "enum": [ + "PROPOSAL_TYPE_UNSPECIFIED", + "PROPOSAL_TYPE_STANDARD", + "PROPOSAL_TYPE_MULTIPLE_CHOICE", + "PROPOSAL_TYPE_OPTIMISTIC", + "PROPOSAL_TYPE_EXPEDITED" + ], + "default": "PROPOSAL_TYPE_UNSPECIFIED" } - } + }, + "description": "Proposal defines the core field members of a governance proposal." }, - "description": "QueryDelegationRewardsResponse is the response type for the\nQuery/DelegationRewards RPC method." + "description": "proposals defines all the requested governance proposals." + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } } - } + }, + "description": "QueryProposalsResponse is the response type for the Query/Proposals RPC\nmethod." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/cosmos/distribution/v1beta1/delegators/{delegator_address}/validators": { - "get": { - "tags": [ - "Query" - ], - "summary": "DelegatorValidators queries the validators of a delegator.", - "operationId": "DistDelegatorValidators", + }, "parameters": [ { - "name": "delegator_address", - "in": "path", - "description": "delegator_address defines the delegator address to query for.", - "required": true, - "schema": { - "type": "string" - } + "name": "proposal_status", + "description": "proposal_status defines the status of the proposals.\n\n - PROPOSAL_STATUS_UNSPECIFIED: PROPOSAL_STATUS_UNSPECIFIED defines the default proposal status.\n - PROPOSAL_STATUS_DEPOSIT_PERIOD: PROPOSAL_STATUS_DEPOSIT_PERIOD defines a proposal status during the deposit\nperiod.\n - PROPOSAL_STATUS_VOTING_PERIOD: PROPOSAL_STATUS_VOTING_PERIOD defines a proposal status during the voting\nperiod.\n - PROPOSAL_STATUS_PASSED: PROPOSAL_STATUS_PASSED defines a proposal status of a proposal that has\npassed.\n - PROPOSAL_STATUS_REJECTED: PROPOSAL_STATUS_REJECTED defines a proposal status of a proposal that has\nbeen rejected.\n - PROPOSAL_STATUS_FAILED: PROPOSAL_STATUS_FAILED defines a proposal status of a proposal that has\nfailed.", + "in": "query", + "required": false, + "type": "string", + "enum": [ + "PROPOSAL_STATUS_UNSPECIFIED", + "PROPOSAL_STATUS_DEPOSIT_PERIOD", + "PROPOSAL_STATUS_VOTING_PERIOD", + "PROPOSAL_STATUS_PASSED", + "PROPOSAL_STATUS_REJECTED", + "PROPOSAL_STATUS_FAILED" + ], + "default": "PROPOSAL_STATUS_UNSPECIFIED" + }, + { + "name": "voter", + "description": "voter defines the voter address for the proposals.", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "depositor", + "description": "depositor defines the deposit addresses from the proposals.", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "pagination.key", + "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", + "in": "query", + "required": false, + "type": "string", + "format": "byte" + }, + { + "name": "pagination.offset", + "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.limit", + "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.count_total", + "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", + "in": "query", + "required": false, + "type": "boolean" + }, + { + "name": "pagination.reverse", + "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", + "in": "query", + "required": false, + "type": "boolean" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/gov/v1/proposals/{proposal_id}": { + "get": { + "summary": "Proposal queries proposal details based on ProposalID.", + "operationId": "GovV1Proposal", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "proposal": { "type": "object", "properties": { - "validators": { - "type": "array", - "description": "validators defines the validators a delegator is delegating for.", - "items": { - "type": "string" - } - } - }, - "description": "QueryDelegatorValidatorsResponse is the response type for the\nQuery/DelegatorValidators RPC method." - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { + "id": { + "type": "string", + "format": "uint64", + "description": "id defines the unique id of the proposal." + }, + "messages": { "type": "array", "items": { "type": "object", "properties": { "type_url": { - "type": "string" + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." }, "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", - "format": "byte" + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "description": "messages are the arbitrary messages to be executed if the proposal passes." + }, + "status": { + "description": "status defines the proposal status.", + "type": "string", + "enum": [ + "PROPOSAL_STATUS_UNSPECIFIED", + "PROPOSAL_STATUS_DEPOSIT_PERIOD", + "PROPOSAL_STATUS_VOTING_PERIOD", + "PROPOSAL_STATUS_PASSED", + "PROPOSAL_STATUS_REJECTED", + "PROPOSAL_STATUS_FAILED" + ], + "default": "PROPOSAL_STATUS_UNSPECIFIED" + }, + "final_tally_result": { + "description": "final_tally_result is the final tally result of the proposal. When\nquerying a proposal via gRPC, this field is not populated until the\nproposal's voting period has ended.", + "type": "object", + "properties": { + "yes_count": { + "type": "string", + "description": "yes_count is the number of yes votes on a proposal." + }, + "abstain_count": { + "type": "string", + "description": "abstain_count is the number of abstain votes on a proposal." + }, + "no_count": { + "type": "string", + "description": "no_count is the number of no votes on a proposal." + }, + "no_with_veto_count": { + "type": "string", + "description": "no_with_veto_count is the number of no with veto votes on a proposal." + }, + "spam_count": { + "type": "string", + "description": "spam_count is the number of spam votes on a proposal." } } - } - } - } - } - } - } - } - } - }, - "/cosmos/distribution/v1beta1/delegators/{delegator_address}/withdraw_address": { - "get": { - "tags": [ - "Query" - ], - "summary": "DelegatorWithdrawAddress queries withdraw address of a delegator.", - "operationId": "DelegatorWithdrawAddress", - "parameters": [ - { - "name": "delegator_address", - "in": "path", - "description": "delegator_address defines the delegator address to query for.", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "withdraw_address": { - "type": "string", - "description": "withdraw_address defines the delegator address to query for." - } - }, - "description": "QueryDelegatorWithdrawAddressResponse is the response type for the\nQuery/DelegatorWithdrawAddress RPC method." - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" }, - "code": { - "type": "integer", - "format": "int32" + "submit_time": { + "type": "string", + "format": "date-time", + "description": "submit_time is the time of proposal submission." }, - "message": { - "type": "string" + "deposit_end_time": { + "type": "string", + "format": "date-time", + "description": "deposit_end_time is the end time for deposition." }, - "details": { + "total_deposit": { "type": "array", "items": { "type": "object", "properties": { - "type_url": { + "denom": { "type": "string" }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" + "amount": { + "type": "string" } - } - } - } - } - } - } - } - } - } - } - }, - "/cosmos/distribution/v1beta1/params": { - "get": { - "tags": [ - "Query" - ], - "summary": "Params queries params of the distribution module.", - "operationId": "DistributionParams", - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "params": { - "type": "object", - "properties": { - "community_tax": { - "type": "string" - }, - "base_proposer_reward": { - "type": "string", - "description": "Deprecated: The base_proposer_reward field is deprecated and is no longer used\nin the x/distribution module's reward mechanism." - }, - "bonus_proposer_reward": { - "type": "string", - "description": "Deprecated: The bonus_proposer_reward field is deprecated and is no longer used\nin the x/distribution module's reward mechanism." }, - "withdraw_addr_enabled": { - "type": "boolean" - } + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." }, - "description": "params defines the parameters of the module." + "description": "total_deposit is the total deposit on the proposal." + }, + "voting_start_time": { + "type": "string", + "format": "date-time", + "description": "voting_start_time is the starting time to vote on a proposal." + }, + "voting_end_time": { + "type": "string", + "format": "date-time", + "description": "voting_end_time is the end time of voting on a proposal." + }, + "metadata": { + "type": "string", + "title": "metadata is any arbitrary metadata attached to the proposal.\nthe recommended format of the metadata is to be found here:\nhttps://docs.cosmos.network/v0.47/modules/gov#proposal-3" + }, + "title": { + "type": "string", + "description": "Since: cosmos-sdk 0.47", + "title": "title is the title of the proposal" + }, + "summary": { + "type": "string", + "description": "Since: cosmos-sdk 0.47", + "title": "summary is a short summary of the proposal" + }, + "proposer": { + "type": "string", + "description": "Since: cosmos-sdk 0.47", + "title": "proposer is the address of the proposal sumbitter" + }, + "expedited": { + "type": "boolean", + "description": "Since: cosmos-sdk 0.50\nDeprecated: Use ProposalType instead.", + "title": "expedited defines if the proposal is expedited" + }, + "failed_reason": { + "type": "string", + "description": "Since: cosmos-sdk 0.50", + "title": "failed_reason defines the reason why the proposal failed" + }, + "proposal_type": { + "description": "Since: cosmos-sdk 0.51", + "title": "proposal_type defines the type of the proposal", + "type": "string", + "enum": [ + "PROPOSAL_TYPE_UNSPECIFIED", + "PROPOSAL_TYPE_STANDARD", + "PROPOSAL_TYPE_MULTIPLE_CHOICE", + "PROPOSAL_TYPE_OPTIMISTIC", + "PROPOSAL_TYPE_EXPEDITED" + ], + "default": "PROPOSAL_TYPE_UNSPECIFIED" } }, - "description": "QueryParamsResponse is the response type for the Query/Params RPC method." + "description": "Proposal defines the core field members of a governance proposal." } - } + }, + "description": "QueryProposalResponse is the response type for the Query/Proposal RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/cosmos/distribution/v1beta1/validators/{validator_address}": { - "get": { - "tags": [ - "Query" - ], - "summary": "ValidatorDistributionInfo queries validator commission and self-delegation rewards for validator", - "operationId": "ValidatorDistributionInfo", + }, "parameters": [ { - "name": "validator_address", + "name": "proposal_id", + "description": "proposal_id defines the unique id of the proposal.", "in": "path", - "description": "validator_address defines the validator address to query for.", "required": true, - "schema": { - "type": "string" - } + "type": "string", + "format": "uint64" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/gov/v1/proposals/{proposal_id}/deposits": { + "get": { + "summary": "Deposits queries all deposits of a single proposal.", + "operationId": "GovV1Deposit", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "operator_address": { - "type": "string", - "description": "operator_address defines the validator operator address." - }, - "self_bond_rewards": { - "type": "array", - "description": "self_bond_rewards defines the self delegations rewards.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." - } - }, - "commission": { - "type": "array", - "description": "commission defines the commission the validator received.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" + "schema": { + "type": "object", + "properties": { + "deposits": { + "type": "array", + "items": { + "type": "object", + "properties": { + "proposal_id": { + "type": "string", + "format": "uint64", + "description": "proposal_id defines the unique id of the proposal." + }, + "depositor": { + "type": "string", + "description": "depositor defines the deposit addresses from the proposals." + }, + "amount": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } }, - "amount": { - "type": "string" - } + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." }, - "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." + "description": "amount to be deposited by depositor." } - } + }, + "description": "Deposit defines an amount deposited by an account address to an active\nproposal." }, - "description": "QueryValidatorDistributionInfoResponse is the response type for the Query/ValidatorDistributionInfo RPC method." + "description": "deposits defines the requested deposits." + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } } - } + }, + "description": "QueryDepositsResponse is the response type for the Query/Deposits RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/cosmos/distribution/v1beta1/validators/{validator_address}/commission": { - "get": { - "tags": [ - "Query" - ], - "summary": "ValidatorCommission queries accumulated commission for a validator.", - "operationId": "ValidatorCommission", + }, "parameters": [ { - "name": "validator_address", + "name": "proposal_id", + "description": "proposal_id defines the unique id of the proposal.", "in": "path", - "description": "validator_address defines the validator address to query for.", "required": true, - "schema": { - "type": "string" - } + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.key", + "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", + "in": "query", + "required": false, + "type": "string", + "format": "byte" + }, + { + "name": "pagination.offset", + "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.limit", + "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.count_total", + "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", + "in": "query", + "required": false, + "type": "boolean" + }, + { + "name": "pagination.reverse", + "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", + "in": "query", + "required": false, + "type": "boolean" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/gov/v1/proposals/{proposal_id}/deposits/{depositor}": { + "get": { + "summary": "Deposit queries single deposit information based on proposalID, depositAddr.", + "operationId": "GovV1Deposit", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "title": "QueryValidatorCommissionResponse is the response type for the\nQuery/ValidatorCommission RPC method", - "type": "object", - "properties": { - "commission": { - "type": "object", - "properties": { - "commission": { - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." - } - } - }, - "description": "commission defines the commission the validator received." - } - } - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "deposit": { "type": "object", "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" + "proposal_id": { + "type": "string", + "format": "uint64", + "description": "proposal_id defines the unique id of the proposal." }, - "message": { - "type": "string" + "depositor": { + "type": "string", + "description": "depositor defines the deposit addresses from the proposals." }, - "details": { + "amount": { "type": "array", "items": { "type": "object", "properties": { - "type_url": { + "denom": { "type": "string" }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" + "amount": { + "type": "string" } - } - } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "description": "amount to be deposited by depositor." } + }, + "description": "Deposit defines an amount deposited by an account address to an active\nproposal." + } + }, + "description": "QueryDepositResponse is the response type for the Query/Deposit RPC method." + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/cosmos/distribution/v1beta1/validators/{validator_address}/outstanding_rewards": { - "get": { - "tags": [ - "Query" - ], - "summary": "ValidatorOutstandingRewards queries rewards of a validator address.", - "operationId": "ValidatorOutstandingRewards", + }, "parameters": [ { - "name": "validator_address", + "name": "proposal_id", + "description": "proposal_id defines the unique id of the proposal.", "in": "path", - "description": "validator_address defines the validator address to query for.", "required": true, - "schema": { - "type": "string" - } - } - ], + "type": "string", + "format": "uint64" + }, + { + "name": "depositor", + "description": "depositor defines the deposit addresses from the proposals.", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/gov/v1/proposals/{proposal_id}/tally": { + "get": { + "summary": "TallyResult queries the tally of a proposal vote.", + "operationId": "GovV1TallyResult", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "tally": { + "description": "tally defines the requested tally.", "type": "object", "properties": { - "rewards": { - "type": "object", - "properties": { - "rewards": { - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." - } - } - }, - "description": "ValidatorOutstandingRewards represents outstanding (un-withdrawn) rewards\nfor a validator inexpensive to track, allows simple sanity checks." + "yes_count": { + "type": "string", + "description": "yes_count is the number of yes votes on a proposal." + }, + "abstain_count": { + "type": "string", + "description": "abstain_count is the number of abstain votes on a proposal." + }, + "no_count": { + "type": "string", + "description": "no_count is the number of no votes on a proposal." + }, + "no_with_veto_count": { + "type": "string", + "description": "no_with_veto_count is the number of no with veto votes on a proposal." + }, + "spam_count": { + "type": "string", + "description": "spam_count is the number of spam votes on a proposal." } - }, - "description": "QueryValidatorOutstandingRewardsResponse is the response type for the\nQuery/ValidatorOutstandingRewards RPC method." + } } - } + }, + "description": "QueryTallyResultResponse is the response type for the Query/Tally RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/cosmos/distribution/v1beta1/validators/{validator_address}/slashes": { - "get": { - "tags": [ - "Query" - ], - "summary": "ValidatorSlashes queries slash events of a validator.", - "operationId": "ValidatorSlashes", + }, "parameters": [ { - "name": "validator_address", + "name": "proposal_id", + "description": "proposal_id defines the unique id of the proposal.", "in": "path", - "description": "validator_address defines the validator address to query for.", "required": true, + "type": "string", + "format": "uint64" + } + ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/gov/v1/proposals/{proposal_id}/votes": { + "get": { + "summary": "Votes queries votes of a given proposal.", + "operationId": "GovV1Votes", + "responses": { + "200": { + "description": "A successful response.", "schema": { - "type": "string" + "type": "object", + "properties": { + "votes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "proposal_id": { + "type": "string", + "format": "uint64", + "description": "proposal_id defines the unique id of the proposal." + }, + "voter": { + "type": "string", + "description": "voter is the voter address of the proposal." + }, + "options": { + "type": "array", + "items": { + "type": "object", + "properties": { + "option": { + "description": "option defines the valid vote options, it must not contain duplicate vote options.", + "type": "string", + "enum": [ + "VOTE_OPTION_UNSPECIFIED", + "VOTE_OPTION_ONE", + "VOTE_OPTION_YES", + "VOTE_OPTION_TWO", + "VOTE_OPTION_ABSTAIN", + "VOTE_OPTION_THREE", + "VOTE_OPTION_NO", + "VOTE_OPTION_FOUR", + "VOTE_OPTION_NO_WITH_VETO", + "VOTE_OPTION_SPAM" + ], + "default": "VOTE_OPTION_UNSPECIFIED" + }, + "weight": { + "type": "string", + "description": "weight is the vote weight associated with the vote option." + } + }, + "description": "WeightedVoteOption defines a unit of vote for vote split." + }, + "description": "options is the weighted vote options." + }, + "metadata": { + "type": "string", + "title": "metadata is any arbitrary metadata attached to the vote.\nthe recommended format of the metadata is to be found here: https://docs.cosmos.network/v0.47/modules/gov#vote-5" + } + }, + "description": "Vote defines a vote on a governance proposal.\nA Vote consists of a proposal ID, the voter, and the vote option." + }, + "description": "votes defines the queried votes." + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "description": "QueryVotesResponse is the response type for the Query/Votes RPC method." } }, - { - "name": "starting_height", - "in": "query", - "description": "starting_height defines the optional starting height to query the slashes.", + "default": { + "description": "An unexpected error response.", "schema": { - "type": "string", - "format": "uint64" + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } + } + } } - }, + } + }, + "parameters": [ { - "name": "ending_height", - "in": "query", - "description": "starting_height defines the optional ending height to query the slashes.", - "schema": { - "type": "string", - "format": "uint64" - } + "name": "proposal_id", + "description": "proposal_id defines the unique id of the proposal.", + "in": "path", + "required": true, + "type": "string", + "format": "uint64" }, { "name": "pagination.key", - "in": "query", "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } + "in": "query", + "required": false, + "type": "string", + "format": "byte" }, { "name": "pagination.offset", - "in": "query", "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.limit", - "in": "query", "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.count_total", - "in": "query", "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } + "in": "query", + "required": false, + "type": "boolean" }, { "name": "pagination.reverse", - "in": "query", "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } + "in": "query", + "required": false, + "type": "boolean" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/gov/v1/proposals/{proposal_id}/votes/{voter}": { + "get": { + "summary": "Vote queries voted information based on proposalID, voterAddr.", + "operationId": "GovV1Vote", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "vote": { "type": "object", "properties": { - "slashes": { + "proposal_id": { + "type": "string", + "format": "uint64", + "description": "proposal_id defines the unique id of the proposal." + }, + "voter": { + "type": "string", + "description": "voter is the voter address of the proposal." + }, + "options": { "type": "array", - "description": "slashes defines the slashes the validator received.", "items": { "type": "object", "properties": { - "validator_period": { + "option": { + "description": "option defines the valid vote options, it must not contain duplicate vote options.", "type": "string", - "format": "uint64" + "enum": [ + "VOTE_OPTION_UNSPECIFIED", + "VOTE_OPTION_ONE", + "VOTE_OPTION_YES", + "VOTE_OPTION_TWO", + "VOTE_OPTION_ABSTAIN", + "VOTE_OPTION_THREE", + "VOTE_OPTION_NO", + "VOTE_OPTION_FOUR", + "VOTE_OPTION_NO_WITH_VETO", + "VOTE_OPTION_SPAM" + ], + "default": "VOTE_OPTION_UNSPECIFIED" }, - "fraction": { - "type": "string" + "weight": { + "type": "string", + "description": "weight is the vote weight associated with the vote option." } }, - "description": "ValidatorSlashEvent represents a validator slash event.\nHeight is implicit within the store key.\nThis is needed to calculate appropriate amount of staking tokens\nfor delegations which are withdrawn after a slash has occurred." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } + "description": "WeightedVoteOption defines a unit of vote for vote split." }, - "description": "pagination defines the pagination in the response." + "description": "options is the weighted vote options." + }, + "metadata": { + "type": "string", + "title": "metadata is any arbitrary metadata attached to the vote.\nthe recommended format of the metadata is to be found here: https://docs.cosmos.network/v0.47/modules/gov#vote-5" } }, - "description": "QueryValidatorSlashesResponse is the response type for the\nQuery/ValidatorSlashes RPC method." + "description": "Vote defines a vote on a governance proposal.\nA Vote consists of a proposal ID, the voter, and the vote option." } - } + }, + "description": "QueryVoteResponse is the response type for the Query/Vote RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/cosmos/feegrant/v1beta1/allowance/{granter}/{grantee}": { - "get": { - "tags": [ - "Query" - ], - "summary": "Allowance returns granted allwance to the grantee by the granter.", - "operationId": "Allowance", + }, "parameters": [ { - "name": "granter", + "name": "proposal_id", + "description": "proposal_id defines the unique id of the proposal.", "in": "path", - "description": "granter is the address of the user granting an allowance of their funds.", "required": true, - "schema": { - "type": "string" - } + "type": "string", + "format": "uint64" }, { - "name": "grantee", + "name": "voter", + "description": "voter defines the voter address for the proposals.", "in": "path", - "description": "grantee is the address of the user being granted an allowance of another user's funds.", "required": true, - "schema": { - "type": "string" - } + "type": "string" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/slashing/v1beta1/params": { + "get": { + "summary": "Params queries the parameters of slashing module", + "operationId": "SlashingParams", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "params": { "type": "object", "properties": { - "allowance": { - "title": "Grant is stored in the KVStore to record a grant with full context", - "type": "object", - "properties": { - "granter": { - "type": "string", - "description": "granter is the address of the user granting an allowance of their funds." - }, - "grantee": { - "type": "string", - "description": "grantee is the address of the user being granted an allowance of another user's funds." - }, - "allowance": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "allowance can be any of basic, periodic, allowed fee allowance." - } - }, - "description": "allowance is a allowance granted for grantee by granter." + "signed_blocks_window": { + "type": "string", + "format": "int64" + }, + "min_signed_per_window": { + "type": "string", + "format": "byte" + }, + "downtime_jail_duration": { + "type": "string" + }, + "slash_fraction_double_sign": { + "type": "string", + "format": "byte" + }, + "slash_fraction_downtime": { + "type": "string", + "format": "byte" } }, - "description": "QueryAllowanceResponse is the response type for the Query/Allowance RPC method." + "description": "Params represents the parameters used for by the slashing module." } - } + }, + "title": "QueryParamsResponse is the response type for the Query/Params RPC method" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" } } } @@ -13928,168 +14779,105 @@ } } } - } + }, + "tags": [ + "Query" + ] } }, - "/cosmos/feegrant/v1beta1/allowances/{grantee}": { + "/cosmos/slashing/v1beta1/signing_infos": { "get": { - "tags": [ - "Query" - ], - "summary": "Allowances returns all the grants for the given grantee address.", - "operationId": "Allowances", - "parameters": [ - { - "name": "grantee", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "pagination.key", - "in": "query", - "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } - }, - { - "name": "pagination.offset", - "in": "query", - "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", + "summary": "SigningInfos queries signing info of all validators", + "operationId": "SigningInfos", + "responses": { + "200": { + "description": "A successful response.", "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.limit", - "in": "query", - "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.count_total", - "in": "query", - "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } - }, - { - "name": "pagination.reverse", - "in": "query", - "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } - } - ], - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "type": "object", + "properties": { + "info": { + "type": "array", + "items": { + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "start_height": { + "type": "string", + "format": "int64", + "title": "Height at which validator was first a candidate OR was un-jailed" + }, + "index_offset": { + "type": "string", + "format": "int64", + "description": "Index which is incremented every time a validator is bonded in a block and\n_may_ have signed a pre-commit or not. This in conjunction with the\nsigned_blocks_window param determines the index in the missed block bitmap." + }, + "jailed_until": { + "type": "string", + "format": "date-time", + "description": "Timestamp until which the validator is jailed due to liveness downtime." + }, + "tombstoned": { + "type": "boolean", + "description": "Whether or not a validator has been tombstoned (killed out of validator\nset). It is set once the validator commits an equivocation or for any other\nconfigured misbehavior." + }, + "missed_blocks_counter": { + "type": "string", + "format": "int64", + "description": "A counter of missed (unsigned) blocks. It is used to avoid unnecessary\nreads in the missed block bitmap." + } + }, + "description": "ValidatorSigningInfo defines a validator's signing info for monitoring their\nliveness activity." + }, + "title": "info is the signing info of all validators" + }, + "pagination": { "type": "object", "properties": { - "allowances": { - "type": "array", - "description": "allowances are allowance's granted for grantee by granter.", - "items": { - "title": "Grant is stored in the KVStore to record a grant with full context", - "type": "object", - "properties": { - "granter": { - "type": "string", - "description": "granter is the address of the user granting an allowance of their funds." - }, - "grantee": { - "type": "string", - "description": "grantee is the address of the user being granted an allowance of another user's funds." - }, - "allowance": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "allowance can be any of basic, periodic, allowed fee allowance." - } - } - } + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines an pagination for the response." + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" } }, - "description": "QueryAllowancesResponse is the response type for the Query/Allowances RPC method." + "description": "PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }" } - } + }, + "title": "QuerySigningInfosResponse is the response type for the Query/SigningInfos RPC\nmethod" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" } } } @@ -14097,2658 +14885,3056 @@ } } } - } - } - }, - "/cosmos/feegrant/v1beta1/issued/{granter}": { - "get": { - "tags": [ - "Query" - ], - "summary": "AllowancesByGranter returns all the grants given by an address", - "description": "Since: cosmos-sdk 0.46", - "operationId": "AllowancesByGranter", + }, "parameters": [ - { - "name": "granter", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, { "name": "pagination.key", - "in": "query", "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } + "in": "query", + "required": false, + "type": "string", + "format": "byte" }, { "name": "pagination.offset", - "in": "query", "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.limit", - "in": "query", "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.count_total", - "in": "query", "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } + "in": "query", + "required": false, + "type": "boolean" }, { "name": "pagination.reverse", - "in": "query", "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } + "in": "query", + "required": false, + "type": "boolean" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/slashing/v1beta1/signing_infos/{cons_address}": { + "get": { + "summary": "SigningInfo queries the signing info of given cons address", + "operationId": "SigningInfo", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "val_signing_info": { "type": "object", "properties": { - "allowances": { - "type": "array", - "description": "allowances that have been issued by the granter.", - "items": { - "title": "Grant is stored in the KVStore to record a grant with full context", - "type": "object", - "properties": { - "granter": { - "type": "string", - "description": "granter is the address of the user granting an allowance of their funds." - }, - "grantee": { - "type": "string", - "description": "grantee is the address of the user being granted an allowance of another user's funds." - }, - "allowance": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "allowance can be any of basic, periodic, allowed fee allowance." - } - } - } + "address": { + "type": "string" }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines an pagination for the response." + "start_height": { + "type": "string", + "format": "int64", + "title": "Height at which validator was first a candidate OR was un-jailed" + }, + "index_offset": { + "type": "string", + "format": "int64", + "description": "Index which is incremented every time a validator is bonded in a block and\n_may_ have signed a pre-commit or not. This in conjunction with the\nsigned_blocks_window param determines the index in the missed block bitmap." + }, + "jailed_until": { + "type": "string", + "format": "date-time", + "description": "Timestamp until which the validator is jailed due to liveness downtime." + }, + "tombstoned": { + "type": "boolean", + "description": "Whether or not a validator has been tombstoned (killed out of validator\nset). It is set once the validator commits an equivocation or for any other\nconfigured misbehavior." + }, + "missed_blocks_counter": { + "type": "string", + "format": "int64", + "description": "A counter of missed (unsigned) blocks. It is used to avoid unnecessary\nreads in the missed block bitmap." } }, - "description": "QueryAllowancesByGranterResponse is the response type for the Query/AllowancesByGranter RPC method.\n\nSince: cosmos-sdk 0.46" + "description": "ValidatorSigningInfo defines a validator's signing info for monitoring their\nliveness activity.", + "title": "val_signing_info is the signing info of requested val cons address" } - } + }, + "title": "QuerySigningInfoResponse is the response type for the Query/SigningInfo RPC\nmethod" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" + } + } + } + } + } + } + } + }, + "parameters": [ + { + "name": "cons_address", + "description": "cons_address is the address to query signing info of", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/staking/v1beta1/delegations/{delegator_addr}": { + "get": { + "summary": "DelegatorDelegations queries all delegations of a given delegator address.", + "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", + "operationId": "DelegatorDelegations", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "type": "object", + "properties": { + "delegation_responses": { + "type": "array", + "items": { + "type": "object", + "properties": { + "delegation": { "type": "object", "properties": { - "type_url": { + "delegator_address": { "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + "description": "delegator_address is the encoded address of the delegator." }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "validator_address": { "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" + "description": "validator_address is the encoded address of the validator." + }, + "shares": { + "type": "string", + "description": "shares define the delegation shares received." } }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "description": "Delegation represents the bond with tokens held by an account. It is\nowned by one delegator, and is associated with the voting power of one\nvalidator." + }, + "balance": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." } + }, + "description": "DelegationResponse is equivalent to Delegation except that it contains a\nbalance in addition to shares which is more suitable for client responses." + }, + "description": "delegation_responses defines all the delegations' info of a delegator." + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" } } } + }, + "description": "QueryDelegatorDelegationsResponse is response type for the\nQuery/DelegatorDelegations RPC method." + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } + } } } } - } - } - }, - "/cosmos/evidence/v1beta1/evidence": { - "get": { - "tags": [ - "Query" - ], - "summary": "AllEvidence queries all evidence.", - "operationId": "AllEvidence", + }, "parameters": [ + { + "name": "delegator_addr", + "description": "delegator_addr defines the delegator address to query for.", + "in": "path", + "required": true, + "type": "string" + }, { "name": "pagination.key", - "in": "query", "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } + "in": "query", + "required": false, + "type": "string", + "format": "byte" }, { "name": "pagination.offset", - "in": "query", "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.limit", - "in": "query", "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.count_total", - "in": "query", "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } + "in": "query", + "required": false, + "type": "boolean" }, { "name": "pagination.reverse", - "in": "query", "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } + "in": "query", + "required": false, + "type": "boolean" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/staking/v1beta1/delegators/{delegator_addr}/redelegations": { + "get": { + "summary": "Redelegations queries redelegations of given address.", + "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", + "operationId": "Redelegations", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "evidence": { - "type": "array", - "description": "evidence returns all evidences.", - "items": { + "schema": { + "type": "object", + "properties": { + "redelegation_responses": { + "type": "array", + "items": { + "type": "object", + "properties": { + "redelegation": { "type": "object", "properties": { - "type_url": { + "delegator_address": { "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + "description": "delegator_address is the bech32-encoded address of the delegator." }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "validator_src_address": { "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" + "description": "validator_src_address is the validator redelegation source operator address." + }, + "validator_dst_address": { + "type": "string", + "description": "validator_dst_address is the validator redelegation destination operator address." + }, + "entries": { + "type": "array", + "items": { + "type": "object", + "properties": { + "creation_height": { + "type": "string", + "format": "int64", + "description": "creation_height defines the height which the redelegation took place." + }, + "completion_time": { + "type": "string", + "format": "date-time", + "description": "completion_time defines the unix time for redelegation completion." + }, + "initial_balance": { + "type": "string", + "description": "initial_balance defines the initial balance when redelegation started." + }, + "shares_dst": { + "type": "string", + "description": "shares_dst is the amount of destination-validator shares created by redelegation." + }, + "unbonding_id": { + "type": "string", + "format": "uint64", + "title": "Incrementing id that uniquely identifies this entry" + }, + "unbonding_on_hold_ref_count": { + "type": "string", + "format": "int64", + "title": "Strictly positive if this entry's unbonding has been stopped by external modules" + } + }, + "description": "RedelegationEntry defines a redelegation object with relevant metadata." + }, + "description": "entries are the redelegation entries." } }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } + "description": "Redelegation contains the list of a particular delegator's redelegating bonds\nfrom a particular source validator to a particular destination validator." }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QueryAllEvidenceResponse is the response type for the Query/AllEvidence RPC\nmethod." - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { + "entries": { + "type": "array", + "items": { + "type": "object", + "properties": { + "redelegation_entry": { + "type": "object", + "properties": { + "creation_height": { + "type": "string", + "format": "int64", + "description": "creation_height defines the height which the redelegation took place." + }, + "completion_time": { + "type": "string", + "format": "date-time", + "description": "completion_time defines the unix time for redelegation completion." + }, + "initial_balance": { + "type": "string", + "description": "initial_balance defines the initial balance when redelegation started." + }, + "shares_dst": { + "type": "string", + "description": "shares_dst is the amount of destination-validator shares created by redelegation." + }, + "unbonding_id": { + "type": "string", + "format": "uint64", + "title": "Incrementing id that uniquely identifies this entry" + }, + "unbonding_on_hold_ref_count": { + "type": "string", + "format": "int64", + "title": "Strictly positive if this entry's unbonding has been stopped by external modules" + } + }, + "description": "RedelegationEntry defines a redelegation object with relevant metadata." + }, + "balance": { + "type": "string" + } + }, + "description": "RedelegationEntryResponse is equivalent to a RedelegationEntry except that it\ncontains a balance in addition to shares which is more suitable for client\nresponses." + } + } + }, + "description": "RedelegationResponse is equivalent to a Redelegation except that its entries\ncontain a balance in addition to shares which is more suitable for client\nresponses." + } + }, + "pagination": { + "description": "pagination defines the pagination in the response.", "type": "object", "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" } } } + }, + "description": "QueryRedelegationsResponse is response type for the Query/Redelegations RPC\nmethod." + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } + } } } } - } - } - }, - "/cosmos/evidence/v1beta1/evidence/{hash}": { - "get": { - "tags": [ - "Query" - ], - "summary": "Evidence queries evidence based on evidence hash.", - "operationId": "Evidence", + }, "parameters": [ { - "name": "hash", + "name": "delegator_addr", + "description": "delegator_addr defines the delegator address to query for.", "in": "path", - "description": "hash defines the evidence hash of the requested evidence.\n\nSince: cosmos-sdk 0.47", "required": true, - "schema": { - "type": "string" - } + "type": "string" }, { - "name": "evidence_hash", + "name": "src_validator_addr", + "description": "src_validator_addr defines the validator address to redelegate from.", "in": "query", - "description": "evidence_hash defines the hash of the requested evidence.\nDeprecated: Use hash, a HEX encoded string, instead.", - "schema": { - "type": "string", - "format": "byte" - } + "required": false, + "type": "string" + }, + { + "name": "dst_validator_addr", + "description": "dst_validator_addr defines the validator address to redelegate to.", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "pagination.key", + "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", + "in": "query", + "required": false, + "type": "string", + "format": "byte" + }, + { + "name": "pagination.offset", + "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.limit", + "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.count_total", + "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", + "in": "query", + "required": false, + "type": "boolean" + }, + { + "name": "pagination.reverse", + "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", + "in": "query", + "required": false, + "type": "boolean" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/staking/v1beta1/delegators/{delegator_addr}/unbonding_delegations": { + "get": { + "summary": "DelegatorUnbondingDelegations queries all unbonding delegations of a given\ndelegator address.", + "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", + "operationId": "DelegatorUnbondingDelegations", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "unbonding_responses": { + "type": "array", + "items": { + "type": "object", + "properties": { + "delegator_address": { + "type": "string", + "description": "delegator_address is the encoded address of the delegator." + }, + "validator_address": { + "type": "string", + "description": "validator_address is the encoded address of the validator." + }, + "entries": { + "type": "array", + "items": { + "type": "object", + "properties": { + "creation_height": { + "type": "string", + "format": "int64", + "description": "creation_height is the height which the unbonding took place." + }, + "completion_time": { + "type": "string", + "format": "date-time", + "description": "completion_time is the unix time for unbonding completion." + }, + "initial_balance": { + "type": "string", + "description": "initial_balance defines the tokens initially scheduled to receive at completion." + }, + "balance": { + "type": "string", + "description": "balance defines the tokens to receive at completion." + }, + "unbonding_id": { + "type": "string", + "format": "uint64", + "title": "Incrementing id that uniquely identifies this entry" + }, + "unbonding_on_hold_ref_count": { + "type": "string", + "format": "int64", + "title": "Strictly positive if this entry's unbonding has been stopped by external modules" + } + }, + "description": "UnbondingDelegationEntry defines an unbonding object with relevant metadata." + }, + "description": "entries are the unbonding delegation entries." + } + }, + "description": "UnbondingDelegation stores all of a single delegator's unbonding bonds\nfor a single validator in an time-ordered list." + } + }, + "pagination": { + "description": "pagination defines the pagination in the response.", "type": "object", "properties": { - "evidence": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" } - }, - "description": "QueryEvidenceResponse is the response type for the Query/Evidence RPC method." + } } - } + }, + "description": "QueryUnbondingDelegatorDelegationsResponse is response type for the\nQuery/UnbondingDelegatorDelegations RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/cosmos/gov/v1beta1/params/{params_type}": { - "get": { - "tags": [ - "Query" - ], - "summary": "Params queries all parameters of the gov module.", - "operationId": "GovParams", + }, "parameters": [ { - "name": "params_type", + "name": "delegator_addr", + "description": "delegator_addr defines the delegator address to query for.", "in": "path", - "description": "params_type defines which parameters to query for, can be one of \"voting\",\n\"tallying\" or \"deposit\".", "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "voting_params": { - "type": "object", - "properties": { - "voting_period": { - "type": "string", - "description": "Duration of the voting period." - } - }, - "description": "voting_params defines the parameters related to voting." - }, - "deposit_params": { - "type": "object", - "properties": { - "min_deposit": { - "type": "array", - "description": "Minimum deposit for a proposal to enter voting period.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "max_deposit_period": { - "type": "string", - "description": "Maximum period for Atom holders to deposit on a proposal. Initial value: 2\nmonths." - } - }, - "description": "deposit_params defines the parameters related to deposit." - }, - "tally_params": { - "type": "object", - "properties": { - "quorum": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Minimum percentage of total stake needed to vote for a result to be\nconsidered valid.", - "format": "byte" - }, - "threshold": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Minimum proportion of Yes votes for proposal to pass. Default value: 0.5.", - "format": "byte" - }, - "veto_threshold": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Minimum value of Veto votes to Total votes ratio for proposal to be\nvetoed. Default value: 1/3.", - "format": "byte" - } - }, - "description": "tally_params defines the parameters related to tally." - } - }, - "description": "QueryParamsResponse is the response type for the Query/Params RPC method." - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - } - } - } - } - } - } - } - }, - "/cosmos/gov/v1beta1/proposals": { - "get": { - "tags": [ - "Query" - ], - "summary": "Proposals queries all proposals based on given status.", - "operationId": "Proposals", - "parameters": [ - { - "name": "proposal_status", - "in": "query", - "description": "proposal_status defines the status of the proposals.\n\n - PROPOSAL_STATUS_UNSPECIFIED: PROPOSAL_STATUS_UNSPECIFIED defines the default proposal status.\n - PROPOSAL_STATUS_DEPOSIT_PERIOD: PROPOSAL_STATUS_DEPOSIT_PERIOD defines a proposal status during the deposit\nperiod.\n - PROPOSAL_STATUS_VOTING_PERIOD: PROPOSAL_STATUS_VOTING_PERIOD defines a proposal status during the voting\nperiod.\n - PROPOSAL_STATUS_PASSED: PROPOSAL_STATUS_PASSED defines a proposal status of a proposal that has\npassed.\n - PROPOSAL_STATUS_REJECTED: PROPOSAL_STATUS_REJECTED defines a proposal status of a proposal that has\nbeen rejected.\n - PROPOSAL_STATUS_FAILED: PROPOSAL_STATUS_FAILED defines a proposal status of a proposal that has\nfailed.", - "schema": { - "type": "string", - "default": "PROPOSAL_STATUS_UNSPECIFIED", - "enum": [ - "PROPOSAL_STATUS_UNSPECIFIED", - "PROPOSAL_STATUS_DEPOSIT_PERIOD", - "PROPOSAL_STATUS_VOTING_PERIOD", - "PROPOSAL_STATUS_PASSED", - "PROPOSAL_STATUS_REJECTED", - "PROPOSAL_STATUS_FAILED" - ] - } - }, - { - "name": "voter", - "in": "query", - "description": "voter defines the voter address for the proposals.", - "schema": { - "type": "string" - } - }, - { - "name": "depositor", - "in": "query", - "description": "depositor defines the deposit addresses from the proposals.", - "schema": { - "type": "string" - } + "type": "string" }, { "name": "pagination.key", - "in": "query", "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } + "in": "query", + "required": false, + "type": "string", + "format": "byte" }, { "name": "pagination.offset", - "in": "query", "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.limit", - "in": "query", "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.count_total", - "in": "query", "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } + "in": "query", + "required": false, + "type": "boolean" }, { "name": "pagination.reverse", - "in": "query", "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } + "in": "query", + "required": false, + "type": "boolean" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/staking/v1beta1/delegators/{delegator_addr}/validators": { + "get": { + "summary": "DelegatorValidators queries all validators info for given delegator\naddress.", + "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", + "operationId": "DelegatorValidators", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "proposals": { - "type": "array", - "description": "proposals defines all the requested governance proposals.", - "items": { + "schema": { + "type": "object", + "properties": { + "validators": { + "type": "array", + "items": { + "type": "object", + "properties": { + "operator_address": { + "type": "string", + "description": "operator_address defines the address of the validator's operator; bech encoded in JSON." + }, + "consensus_pubkey": { "type": "object", "properties": { - "proposal_id": { + "type_url": { "type": "string", - "description": "proposal_id defines the unique id of the proposal.", - "format": "uint64" + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." }, - "content": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "jailed": { + "type": "boolean", + "description": "jailed defined whether the validator has been jailed from bonded status or not." + }, + "status": { + "description": "status is the validator status (bonded/unbonding/unbonded).", + "type": "string", + "enum": [ + "BOND_STATUS_UNSPECIFIED", + "BOND_STATUS_UNBONDED", + "BOND_STATUS_UNBONDING", + "BOND_STATUS_BONDED" + ], + "default": "BOND_STATUS_UNSPECIFIED" + }, + "tokens": { + "type": "string", + "description": "tokens define the delegated tokens (incl. self-delegation)." + }, + "delegator_shares": { + "type": "string", + "description": "delegator_shares defines total shares issued to a validator's delegators." + }, + "description": { + "description": "description defines the description terms for the validator.", + "type": "object", + "properties": { + "moniker": { + "type": "string", + "description": "moniker defines a human-readable name for the validator." }, - "status": { + "identity": { "type": "string", - "description": "status defines the proposal status.", - "default": "PROPOSAL_STATUS_UNSPECIFIED", - "enum": [ - "PROPOSAL_STATUS_UNSPECIFIED", - "PROPOSAL_STATUS_DEPOSIT_PERIOD", - "PROPOSAL_STATUS_VOTING_PERIOD", - "PROPOSAL_STATUS_PASSED", - "PROPOSAL_STATUS_REJECTED", - "PROPOSAL_STATUS_FAILED" - ] + "description": "identity defines an optional identity signature (ex. UPort or Keybase)." }, - "final_tally_result": { - "type": "object", - "properties": { - "yes": { - "type": "string", - "description": "yes is the number of yes votes on a proposal." - }, - "abstain": { + "website": { + "type": "string", + "description": "website defines an optional website link." + }, + "security_contact": { + "type": "string", + "description": "security_contact defines an optional email for security contact." + }, + "details": { + "type": "string", + "description": "details define other optional details." + } + } + }, + "unbonding_height": { + "type": "string", + "format": "int64", + "description": "unbonding_height defines, if unbonding, the height at which this validator has begun unbonding." + }, + "unbonding_time": { + "type": "string", + "format": "date-time", + "description": "unbonding_time defines, if unbonding, the min time for the validator to complete unbonding." + }, + "commission": { + "description": "commission defines the commission parameters.", + "type": "object", + "properties": { + "commission_rates": { + "description": "commission_rates defines the initial commission rates to be used for creating a validator.", + "type": "object", + "properties": { + "rate": { "type": "string", - "description": "abstain is the number of abstain votes on a proposal." + "description": "rate is the commission rate charged to delegators, as a fraction." }, - "no": { + "max_rate": { "type": "string", - "description": "no is the number of no votes on a proposal." + "description": "max_rate defines the maximum commission rate which validator can ever charge, as a fraction." }, - "no_with_veto": { + "max_change_rate": { "type": "string", - "description": "no_with_veto is the number of no with veto votes on a proposal." + "description": "max_change_rate defines the maximum daily increase of the validator commission, as a fraction." } - }, - "description": "final_tally_result is the final tally result of the proposal. When\nquerying a proposal via gRPC, this field is not populated until the\nproposal's voting period has ended." - }, - "submit_time": { - "type": "string", - "description": "submit_time is the time of proposal submission.", - "format": "date-time" - }, - "deposit_end_time": { - "type": "string", - "description": "deposit_end_time is the end time for deposition.", - "format": "date-time" - }, - "total_deposit": { - "type": "array", - "description": "total_deposit is the total deposit on the proposal.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." } }, - "voting_start_time": { - "type": "string", - "description": "voting_start_time is the starting time to vote on a proposal.", - "format": "date-time" - }, - "voting_end_time": { + "update_time": { "type": "string", - "description": "voting_end_time is the end time of voting on a proposal.", - "format": "date-time" + "format": "date-time", + "description": "update_time is the last time the commission rate was changed." } + } + }, + "min_self_delegation": { + "type": "string", + "description": "min_self_delegation is the validator's self declared minimum self delegation.\n\nSince: cosmos-sdk 0.46" + }, + "unbonding_on_hold_ref_count": { + "type": "string", + "format": "int64", + "title": "strictly positive if this validator's unbonding has been stopped by external modules" + }, + "unbonding_ids": { + "type": "array", + "items": { + "type": "string", + "format": "uint64" }, - "description": "Proposal defines the core field members of a governance proposal." + "title": "list of unbonding ids, each uniquely identifying an unbonding of this validator" } }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } + "description": "Validator defines a validator, together with the total amount of the\nValidator's bond shares and their exchange rate to coins. Slashing results in\na decrease in the exchange rate, allowing correct calculation of future\nundelegations without iterating over delegators. When coins are delegated to\nthis validator, the validator is credited with a delegation whose number of\nbond shares is based on the amount of coins delegated divided by the current\nexchange rate. Voting power can be calculated as total bonded shares\nmultiplied by exchange rate." }, - "description": "QueryProposalsResponse is the response type for the Query/Proposals RPC\nmethod." + "description": "validators defines the validators' info of a delegator." + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } } - } + }, + "description": "QueryDelegatorValidatorsResponse is response type for the\nQuery/DelegatorValidators RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/cosmos/gov/v1beta1/proposals/{proposal_id}": { - "get": { - "tags": [ - "Query" - ], - "summary": "Proposal queries proposal details based on ProposalID.", - "operationId": "Proposal", + }, "parameters": [ { - "name": "proposal_id", + "name": "delegator_addr", + "description": "delegator_addr defines the delegator address to query for.", "in": "path", - "description": "proposal_id defines the unique id of the proposal.", "required": true, - "schema": { - "type": "string", - "format": "uint64" - } + "type": "string" + }, + { + "name": "pagination.key", + "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", + "in": "query", + "required": false, + "type": "string", + "format": "byte" + }, + { + "name": "pagination.offset", + "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.limit", + "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.count_total", + "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", + "in": "query", + "required": false, + "type": "boolean" + }, + { + "name": "pagination.reverse", + "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", + "in": "query", + "required": false, + "type": "boolean" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/staking/v1beta1/delegators/{delegator_addr}/validators/{validator_addr}": { + "get": { + "summary": "DelegatorValidator queries validator info for given delegator validator\npair.", + "operationId": "DelegatorValidator", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "validator": { "type": "object", "properties": { - "proposal": { + "operator_address": { + "type": "string", + "description": "operator_address defines the address of the validator's operator; bech encoded in JSON." + }, + "consensus_pubkey": { "type": "object", "properties": { - "proposal_id": { + "type_url": { "type": "string", - "description": "proposal_id defines the unique id of the proposal.", - "format": "uint64" - }, - "content": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." }, - "status": { + "value": { "type": "string", - "description": "status defines the proposal status.", - "default": "PROPOSAL_STATUS_UNSPECIFIED", - "enum": [ - "PROPOSAL_STATUS_UNSPECIFIED", - "PROPOSAL_STATUS_DEPOSIT_PERIOD", - "PROPOSAL_STATUS_VOTING_PERIOD", - "PROPOSAL_STATUS_PASSED", - "PROPOSAL_STATUS_REJECTED", - "PROPOSAL_STATUS_FAILED" - ] - }, - "final_tally_result": { - "type": "object", - "properties": { - "yes": { - "type": "string", - "description": "yes is the number of yes votes on a proposal." - }, - "abstain": { - "type": "string", - "description": "abstain is the number of abstain votes on a proposal." - }, - "no": { - "type": "string", - "description": "no is the number of no votes on a proposal." - }, - "no_with_veto": { - "type": "string", - "description": "no_with_veto is the number of no with veto votes on a proposal." - } - }, - "description": "final_tally_result is the final tally result of the proposal. When\nquerying a proposal via gRPC, this field is not populated until the\nproposal's voting period has ended." - }, - "submit_time": { + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "jailed": { + "type": "boolean", + "description": "jailed defined whether the validator has been jailed from bonded status or not." + }, + "status": { + "description": "status is the validator status (bonded/unbonding/unbonded).", + "type": "string", + "enum": [ + "BOND_STATUS_UNSPECIFIED", + "BOND_STATUS_UNBONDED", + "BOND_STATUS_UNBONDING", + "BOND_STATUS_BONDED" + ], + "default": "BOND_STATUS_UNSPECIFIED" + }, + "tokens": { + "type": "string", + "description": "tokens define the delegated tokens (incl. self-delegation)." + }, + "delegator_shares": { + "type": "string", + "description": "delegator_shares defines total shares issued to a validator's delegators." + }, + "description": { + "description": "description defines the description terms for the validator.", + "type": "object", + "properties": { + "moniker": { "type": "string", - "description": "submit_time is the time of proposal submission.", - "format": "date-time" + "description": "moniker defines a human-readable name for the validator." }, - "deposit_end_time": { + "identity": { "type": "string", - "description": "deposit_end_time is the end time for deposition.", - "format": "date-time" + "description": "identity defines an optional identity signature (ex. UPort or Keybase)." }, - "total_deposit": { - "type": "array", - "description": "total_deposit is the total deposit on the proposal.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } + "website": { + "type": "string", + "description": "website defines an optional website link." }, - "voting_start_time": { + "security_contact": { "type": "string", - "description": "voting_start_time is the starting time to vote on a proposal.", - "format": "date-time" + "description": "security_contact defines an optional email for security contact." }, - "voting_end_time": { + "details": { "type": "string", - "description": "voting_end_time is the end time of voting on a proposal.", - "format": "date-time" + "description": "details define other optional details." + } + } + }, + "unbonding_height": { + "type": "string", + "format": "int64", + "description": "unbonding_height defines, if unbonding, the height at which this validator has begun unbonding." + }, + "unbonding_time": { + "type": "string", + "format": "date-time", + "description": "unbonding_time defines, if unbonding, the min time for the validator to complete unbonding." + }, + "commission": { + "description": "commission defines the commission parameters.", + "type": "object", + "properties": { + "commission_rates": { + "description": "commission_rates defines the initial commission rates to be used for creating a validator.", + "type": "object", + "properties": { + "rate": { + "type": "string", + "description": "rate is the commission rate charged to delegators, as a fraction." + }, + "max_rate": { + "type": "string", + "description": "max_rate defines the maximum commission rate which validator can ever charge, as a fraction." + }, + "max_change_rate": { + "type": "string", + "description": "max_change_rate defines the maximum daily increase of the validator commission, as a fraction." + } + } + }, + "update_time": { + "type": "string", + "format": "date-time", + "description": "update_time is the last time the commission rate was changed." } + } + }, + "min_self_delegation": { + "type": "string", + "description": "min_self_delegation is the validator's self declared minimum self delegation.\n\nSince: cosmos-sdk 0.46" + }, + "unbonding_on_hold_ref_count": { + "type": "string", + "format": "int64", + "title": "strictly positive if this validator's unbonding has been stopped by external modules" + }, + "unbonding_ids": { + "type": "array", + "items": { + "type": "string", + "format": "uint64" }, - "description": "Proposal defines the core field members of a governance proposal." + "title": "list of unbonding ids, each uniquely identifying an unbonding of this validator" } }, - "description": "QueryProposalResponse is the response type for the Query/Proposal RPC method." + "description": "Validator defines a validator, together with the total amount of the\nValidator's bond shares and their exchange rate to coins. Slashing results in\na decrease in the exchange rate, allowing correct calculation of future\nundelegations without iterating over delegators. When coins are delegated to\nthis validator, the validator is credited with a delegation whose number of\nbond shares is based on the amount of coins delegated divided by the current\nexchange rate. Voting power can be calculated as total bonded shares\nmultiplied by exchange rate." } - } + }, + "description": "QueryDelegatorValidatorResponse response type for the\nQuery/DelegatorValidator RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/cosmos/gov/v1beta1/proposals/{proposal_id}/deposits": { - "get": { - "tags": [ - "Query" - ], - "summary": "Deposits queries all deposits of a single proposal.", - "operationId": "Deposits", + }, "parameters": [ { - "name": "proposal_id", + "name": "delegator_addr", + "description": "delegator_addr defines the delegator address to query for.", "in": "path", - "description": "proposal_id defines the unique id of the proposal.", "required": true, - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.key", - "in": "query", - "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } - }, - { - "name": "pagination.offset", - "in": "query", - "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.limit", - "in": "query", - "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.count_total", - "in": "query", - "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } + "type": "string" }, { - "name": "pagination.reverse", - "in": "query", - "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } + "name": "validator_addr", + "description": "validator_addr defines the validator address to query for.", + "in": "path", + "required": true, + "type": "string" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/staking/v1beta1/historical_info/{height}": { + "get": { + "summary": "HistoricalInfo queries the historical info for given height.", + "operationId": "HistoricalInfo", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "hist": { + "description": "hist defines the historical info at the given height.", "type": "object", "properties": { - "deposits": { - "type": "array", - "description": "deposits defines the requested deposits.", - "items": { - "type": "object", - "properties": { - "proposal_id": { - "type": "string", - "description": "proposal_id defines the unique id of the proposal.", - "format": "uint64" - }, - "depositor": { - "type": "string", - "description": "depositor defines the deposit addresses from the proposals." + "header": { + "type": "object", + "properties": { + "version": { + "title": "basic block info", + "type": "object", + "properties": { + "block": { + "type": "string", + "format": "uint64" + }, + "app": { + "type": "string", + "format": "uint64" + } }, - "amount": { - "type": "array", - "description": "amount to be deposited by depositor.", - "items": { + "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." + }, + "chain_id": { + "type": "string" + }, + "height": { + "type": "string", + "format": "int64" + }, + "time": { + "type": "string", + "format": "date-time" + }, + "last_block_id": { + "title": "prev block info", + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { "type": "object", "properties": { - "denom": { - "type": "string" + "total": { + "type": "integer", + "format": "int64" }, - "amount": { - "type": "string" + "hash": { + "type": "string", + "format": "byte" } }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + "title": "PartsetHeader" } } }, - "description": "Deposit defines an amount deposited by an account address to an active\nproposal." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "last_commit_hash": { + "type": "string", + "format": "byte", + "title": "hashes of block data" + }, + "data_hash": { "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", "format": "byte" }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", + "validators_hash": { "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QueryDepositsResponse is the response type for the Query/Deposits RPC method." - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" + "format": "byte", + "title": "hashes from the app output from the prev block" + }, + "next_validators_hash": { + "type": "string", + "format": "byte" + }, + "consensus_hash": { + "type": "string", + "format": "byte" + }, + "app_hash": { + "type": "string", + "format": "byte" + }, + "last_results_hash": { + "type": "string", + "format": "byte" + }, + "evidence_hash": { + "type": "string", + "format": "byte", + "title": "consensus info" + }, + "proposer_address": { + "type": "string", + "format": "byte" + } + }, + "description": "Header defines the structure of a block header." }, - "details": { + "valset": { "type": "array", "items": { "type": "object", "properties": { - "type_url": { + "operator_address": { "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + "description": "operator_address defines the address of the validator's operator; bech encoded in JSON." }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "consensus_pubkey": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "jailed": { + "type": "boolean", + "description": "jailed defined whether the validator has been jailed from bonded status or not." + }, + "status": { + "description": "status is the validator status (bonded/unbonding/unbonded).", "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" + "enum": [ + "BOND_STATUS_UNSPECIFIED", + "BOND_STATUS_UNBONDED", + "BOND_STATUS_UNBONDING", + "BOND_STATUS_BONDED" + ], + "default": "BOND_STATUS_UNSPECIFIED" + }, + "tokens": { + "type": "string", + "description": "tokens define the delegated tokens (incl. self-delegation)." + }, + "delegator_shares": { + "type": "string", + "description": "delegator_shares defines total shares issued to a validator's delegators." + }, + "description": { + "description": "description defines the description terms for the validator.", + "type": "object", + "properties": { + "moniker": { + "type": "string", + "description": "moniker defines a human-readable name for the validator." + }, + "identity": { + "type": "string", + "description": "identity defines an optional identity signature (ex. UPort or Keybase)." + }, + "website": { + "type": "string", + "description": "website defines an optional website link." + }, + "security_contact": { + "type": "string", + "description": "security_contact defines an optional email for security contact." + }, + "details": { + "type": "string", + "description": "details define other optional details." + } + } + }, + "unbonding_height": { + "type": "string", + "format": "int64", + "description": "unbonding_height defines, if unbonding, the height at which this validator has begun unbonding." + }, + "unbonding_time": { + "type": "string", + "format": "date-time", + "description": "unbonding_time defines, if unbonding, the min time for the validator to complete unbonding." + }, + "commission": { + "description": "commission defines the commission parameters.", + "type": "object", + "properties": { + "commission_rates": { + "description": "commission_rates defines the initial commission rates to be used for creating a validator.", + "type": "object", + "properties": { + "rate": { + "type": "string", + "description": "rate is the commission rate charged to delegators, as a fraction." + }, + "max_rate": { + "type": "string", + "description": "max_rate defines the maximum commission rate which validator can ever charge, as a fraction." + }, + "max_change_rate": { + "type": "string", + "description": "max_change_rate defines the maximum daily increase of the validator commission, as a fraction." + } + } + }, + "update_time": { + "type": "string", + "format": "date-time", + "description": "update_time is the last time the commission rate was changed." + } + } + }, + "min_self_delegation": { + "type": "string", + "description": "min_self_delegation is the validator's self declared minimum self delegation.\n\nSince: cosmos-sdk 0.46" + }, + "unbonding_on_hold_ref_count": { + "type": "string", + "format": "int64", + "title": "strictly positive if this validator's unbonding has been stopped by external modules" + }, + "unbonding_ids": { + "type": "array", + "items": { + "type": "string", + "format": "uint64" + }, + "title": "list of unbonding ids, each uniquely identifying an unbonding of this validator" } }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "description": "Validator defines a validator, together with the total amount of the\nValidator's bond shares and their exchange rate to coins. Slashing results in\na decrease in the exchange rate, allowing correct calculation of future\nundelegations without iterating over delegators. When coins are delegated to\nthis validator, the validator is credited with a delegation whose number of\nbond shares is based on the amount of coins delegated divided by the current\nexchange rate. Voting power can be calculated as total bonded shares\nmultiplied by exchange rate." } } } + }, + "historical_record": { + "type": "object", + "properties": { + "apphash": { + "type": "string", + "format": "byte" + }, + "time": { + "type": "string", + "format": "date-time" + }, + "validators_hash": { + "type": "string", + "format": "byte" + } + }, + "description": "Historical contains a set of minimum values needed for evaluating historical validator sets and blocks.\nIt is stored as part of staking module's state, which persists the `n` most\nrecent HistoricalInfo\n(`n` is set by the staking module's `historical_entries` parameter)." + } + }, + "description": "QueryHistoricalInfoResponse is response type for the Query/HistoricalInfo RPC\nmethod." + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } } } } } - } - } - }, - "/cosmos/gov/v1beta1/proposals/{proposal_id}/deposits/{depositor}": { - "get": { - "tags": [ - "Query" - ], - "summary": "Deposit queries single deposit information based on proposalID, depositor address.", - "operationId": "Deposit", + }, "parameters": [ { - "name": "proposal_id", - "in": "path", - "description": "proposal_id defines the unique id of the proposal.", - "required": true, - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "depositor", + "name": "height", + "description": "height defines at which height to query the historical info.", "in": "path", - "description": "depositor defines the deposit addresses from the proposals.", "required": true, - "schema": { - "type": "string" - } + "type": "string", + "format": "int64" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/staking/v1beta1/params": { + "get": { + "summary": "Parameters queries the staking parameters.", + "operationId": "StakingParams", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "params": { + "description": "params holds all the parameters of this module.", "type": "object", "properties": { - "deposit": { + "unbonding_time": { + "type": "string", + "description": "unbonding_time is the time duration of unbonding." + }, + "max_validators": { + "type": "integer", + "format": "int64", + "description": "max_validators is the maximum number of validators." + }, + "max_entries": { + "type": "integer", + "format": "int64", + "description": "max_entries is the max entries for either unbonding delegation or redelegation (per pair/trio)." + }, + "historical_entries": { + "type": "integer", + "format": "int64", + "description": "historical_entries is the number of historical entries to persist." + }, + "bond_denom": { + "type": "string", + "description": "bond_denom defines the bondable coin denomination." + }, + "min_commission_rate": { + "type": "string", + "title": "min_commission_rate is the chain-wide minimum commission rate that a validator can charge their delegators" + }, + "key_rotation_fee": { "type": "object", "properties": { - "proposal_id": { - "type": "string", - "description": "proposal_id defines the unique id of the proposal.", - "format": "uint64" - }, - "depositor": { - "type": "string", - "description": "depositor defines the deposit addresses from the proposals." + "denom": { + "type": "string" }, "amount": { - "type": "array", - "description": "amount to be deposited by depositor.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } + "type": "string" } }, - "description": "Deposit defines an amount deposited by an account address to an active\nproposal." + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto.", + "title": "key_rotation_fee is fee to be spent when rotating validator's key\n(either consensus pubkey or operator key)" } - }, - "description": "QueryDepositResponse is the response type for the Query/Deposit RPC method." + } } - } + }, + "description": "QueryParamsResponse is response type for the Query/Params RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } + }, + "tags": [ + "Query" + ] } }, - "/cosmos/gov/v1beta1/proposals/{proposal_id}/tally": { + "/cosmos/staking/v1beta1/pool": { "get": { - "tags": [ - "Query" - ], - "summary": "TallyResult queries the tally of a proposal vote.", - "operationId": "TallyResult", - "parameters": [ - { - "name": "proposal_id", - "in": "path", - "description": "proposal_id defines the unique id of the proposal.", - "required": true, - "schema": { - "type": "string", - "format": "uint64" - } - } - ], + "summary": "Pool queries the pool info.", + "operationId": "Pool", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "pool": { + "description": "pool defines the pool info.", "type": "object", "properties": { - "tally": { - "type": "object", - "properties": { - "yes": { - "type": "string", - "description": "yes is the number of yes votes on a proposal." - }, - "abstain": { - "type": "string", - "description": "abstain is the number of abstain votes on a proposal." - }, - "no": { - "type": "string", - "description": "no is the number of no votes on a proposal." - }, - "no_with_veto": { - "type": "string", - "description": "no_with_veto is the number of no with veto votes on a proposal." - } - }, - "description": "tally defines the requested tally." + "not_bonded_tokens": { + "type": "string" + }, + "bonded_tokens": { + "type": "string" } - }, - "description": "QueryTallyResultResponse is the response type for the Query/Tally RPC method." + } } - } + }, + "description": "QueryPoolResponse is response type for the Query/Pool RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } + }, + "tags": [ + "Query" + ] } }, - "/cosmos/gov/v1beta1/proposals/{proposal_id}/votes": { + "/cosmos/staking/v1beta1/validators": { "get": { - "tags": [ - "Query" - ], - "summary": "Votes queries votes of a given proposal.", - "operationId": "Votes", - "parameters": [ - { - "name": "proposal_id", - "in": "path", - "description": "proposal_id defines the unique id of the proposal.", - "required": true, - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.key", - "in": "query", - "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } - }, - { - "name": "pagination.offset", - "in": "query", - "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.limit", - "in": "query", - "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.count_total", - "in": "query", - "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } - }, - { - "name": "pagination.reverse", - "in": "query", - "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } - } - ], + "summary": "Validators queries all validators that match the given status.", + "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", + "operationId": "Validators", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "votes": { - "type": "array", - "description": "votes defines the queried votes.", - "items": { + "schema": { + "type": "object", + "properties": { + "validators": { + "type": "array", + "items": { + "type": "object", + "properties": { + "operator_address": { + "type": "string", + "description": "operator_address defines the address of the validator's operator; bech encoded in JSON." + }, + "consensus_pubkey": { "type": "object", "properties": { - "proposal_id": { - "type": "string", - "description": "proposal_id defines the unique id of the proposal.", - "format": "uint64" - }, - "voter": { + "type_url": { "type": "string", - "description": "voter is the voter address of the proposal." + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." }, - "option": { + "value": { "type": "string", - "description": "Deprecated: Prefer to use `options` instead. This field is set in queries\nif and only if `len(options) == 1` and that option has weight 1. In all\nother cases, this field will default to VOTE_OPTION_UNSPECIFIED.", - "default": "VOTE_OPTION_UNSPECIFIED", - "enum": [ - "VOTE_OPTION_UNSPECIFIED", - "VOTE_OPTION_YES", - "VOTE_OPTION_ABSTAIN", - "VOTE_OPTION_NO", - "VOTE_OPTION_NO_WITH_VETO" - ] + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "jailed": { + "type": "boolean", + "description": "jailed defined whether the validator has been jailed from bonded status or not." + }, + "status": { + "description": "status is the validator status (bonded/unbonding/unbonded).", + "type": "string", + "enum": [ + "BOND_STATUS_UNSPECIFIED", + "BOND_STATUS_UNBONDED", + "BOND_STATUS_UNBONDING", + "BOND_STATUS_BONDED" + ], + "default": "BOND_STATUS_UNSPECIFIED" + }, + "tokens": { + "type": "string", + "description": "tokens define the delegated tokens (incl. self-delegation)." + }, + "delegator_shares": { + "type": "string", + "description": "delegator_shares defines total shares issued to a validator's delegators." + }, + "description": { + "description": "description defines the description terms for the validator.", + "type": "object", + "properties": { + "moniker": { + "type": "string", + "description": "moniker defines a human-readable name for the validator." }, - "options": { - "type": "array", - "description": "options is the weighted vote options.\n\nSince: cosmos-sdk 0.43", - "items": { - "type": "object", - "properties": { - "option": { - "type": "string", - "description": "option defines the valid vote options, it must not contain duplicate vote options.", - "default": "VOTE_OPTION_UNSPECIFIED", - "enum": [ - "VOTE_OPTION_UNSPECIFIED", - "VOTE_OPTION_YES", - "VOTE_OPTION_ABSTAIN", - "VOTE_OPTION_NO", - "VOTE_OPTION_NO_WITH_VETO" - ] - }, - "weight": { - "type": "string", - "description": "weight is the vote weight associated with the vote option." - } + "identity": { + "type": "string", + "description": "identity defines an optional identity signature (ex. UPort or Keybase)." + }, + "website": { + "type": "string", + "description": "website defines an optional website link." + }, + "security_contact": { + "type": "string", + "description": "security_contact defines an optional email for security contact." + }, + "details": { + "type": "string", + "description": "details define other optional details." + } + } + }, + "unbonding_height": { + "type": "string", + "format": "int64", + "description": "unbonding_height defines, if unbonding, the height at which this validator has begun unbonding." + }, + "unbonding_time": { + "type": "string", + "format": "date-time", + "description": "unbonding_time defines, if unbonding, the min time for the validator to complete unbonding." + }, + "commission": { + "description": "commission defines the commission parameters.", + "type": "object", + "properties": { + "commission_rates": { + "description": "commission_rates defines the initial commission rates to be used for creating a validator.", + "type": "object", + "properties": { + "rate": { + "type": "string", + "description": "rate is the commission rate charged to delegators, as a fraction." }, - "description": "WeightedVoteOption defines a unit of vote for vote split.\n\nSince: cosmos-sdk 0.43" + "max_rate": { + "type": "string", + "description": "max_rate defines the maximum commission rate which validator can ever charge, as a fraction." + }, + "max_change_rate": { + "type": "string", + "description": "max_change_rate defines the maximum daily increase of the validator commission, as a fraction." + } } + }, + "update_time": { + "type": "string", + "format": "date-time", + "description": "update_time is the last time the commission rate was changed." } + } + }, + "min_self_delegation": { + "type": "string", + "description": "min_self_delegation is the validator's self declared minimum self delegation.\n\nSince: cosmos-sdk 0.46" + }, + "unbonding_on_hold_ref_count": { + "type": "string", + "format": "int64", + "title": "strictly positive if this validator's unbonding has been stopped by external modules" + }, + "unbonding_ids": { + "type": "array", + "items": { + "type": "string", + "format": "uint64" }, - "description": "Vote defines a vote on a governance proposal.\nA Vote consists of a proposal ID, the voter, and the vote option." + "title": "list of unbonding ids, each uniquely identifying an unbonding of this validator" } }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } + "description": "Validator defines a validator, together with the total amount of the\nValidator's bond shares and their exchange rate to coins. Slashing results in\na decrease in the exchange rate, allowing correct calculation of future\nundelegations without iterating over delegators. When coins are delegated to\nthis validator, the validator is credited with a delegation whose number of\nbond shares is based on the amount of coins delegated divided by the current\nexchange rate. Voting power can be calculated as total bonded shares\nmultiplied by exchange rate." }, - "description": "QueryVotesResponse is the response type for the Query/Votes RPC method." + "description": "validators contains all the queried validators." + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } } - } + }, + "title": "QueryValidatorsResponse is response type for the Query/Validators RPC method" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/cosmos/gov/v1beta1/proposals/{proposal_id}/votes/{voter}": { - "get": { - "tags": [ - "Query" - ], - "summary": "Vote queries voted information based on proposalID, voterAddr.\nDue to how we handle state, this query would error for proposals that has already been finished.", - "operationId": "Vote", + }, "parameters": [ { - "name": "proposal_id", - "in": "path", - "description": "proposal_id defines the unique id of the proposal.", - "required": true, - "schema": { - "type": "string", - "format": "uint64" - } + "name": "status", + "description": "status enables to query for validators matching a given status.", + "in": "query", + "required": false, + "type": "string" }, { - "name": "voter", - "in": "path", - "description": "voter defines the voter address for the proposals.", - "required": true, - "schema": { - "type": "string" - } + "name": "pagination.key", + "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", + "in": "query", + "required": false, + "type": "string", + "format": "byte" + }, + { + "name": "pagination.offset", + "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.limit", + "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.count_total", + "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", + "in": "query", + "required": false, + "type": "boolean" + }, + { + "name": "pagination.reverse", + "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", + "in": "query", + "required": false, + "type": "boolean" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/staking/v1beta1/validators/{validator_addr}": { + "get": { + "summary": "Validator queries validator info for given validator address.", + "operationId": "Validator", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "validator": { "type": "object", "properties": { - "vote": { + "operator_address": { + "type": "string", + "description": "operator_address defines the address of the validator's operator; bech encoded in JSON." + }, + "consensus_pubkey": { "type": "object", "properties": { - "proposal_id": { - "type": "string", - "description": "proposal_id defines the unique id of the proposal.", - "format": "uint64" - }, - "voter": { + "type_url": { "type": "string", - "description": "voter is the voter address of the proposal." + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." }, - "option": { + "value": { "type": "string", - "description": "Deprecated: Prefer to use `options` instead. This field is set in queries\nif and only if `len(options) == 1` and that option has weight 1. In all\nother cases, this field will default to VOTE_OPTION_UNSPECIFIED.", - "default": "VOTE_OPTION_UNSPECIFIED", - "enum": [ - "VOTE_OPTION_UNSPECIFIED", - "VOTE_OPTION_YES", - "VOTE_OPTION_ABSTAIN", - "VOTE_OPTION_NO", - "VOTE_OPTION_NO_WITH_VETO" - ] - }, - "options": { - "type": "array", - "description": "options is the weighted vote options.\n\nSince: cosmos-sdk 0.43", - "items": { - "type": "object", - "properties": { - "option": { - "type": "string", - "description": "option defines the valid vote options, it must not contain duplicate vote options.", - "default": "VOTE_OPTION_UNSPECIFIED", - "enum": [ - "VOTE_OPTION_UNSPECIFIED", - "VOTE_OPTION_YES", - "VOTE_OPTION_ABSTAIN", - "VOTE_OPTION_NO", - "VOTE_OPTION_NO_WITH_VETO" - ] - }, - "weight": { - "type": "string", - "description": "weight is the vote weight associated with the vote option." - } - }, - "description": "WeightedVoteOption defines a unit of vote for vote split.\n\nSince: cosmos-sdk 0.43" - } + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } }, - "description": "Vote defines a vote on a governance proposal.\nA Vote consists of a proposal ID, the voter, and the vote option." - } - }, - "description": "QueryVoteResponse is the response type for the Query/Vote RPC method." - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" }, - "message": { - "type": "string" + "jailed": { + "type": "boolean", + "description": "jailed defined whether the validator has been jailed from bonded status or not." }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" + "status": { + "description": "status is the validator status (bonded/unbonding/unbonded).", + "type": "string", + "enum": [ + "BOND_STATUS_UNSPECIFIED", + "BOND_STATUS_UNBONDED", + "BOND_STATUS_UNBONDING", + "BOND_STATUS_BONDED" + ], + "default": "BOND_STATUS_UNSPECIFIED" + }, + "tokens": { + "type": "string", + "description": "tokens define the delegated tokens (incl. self-delegation)." + }, + "delegator_shares": { + "type": "string", + "description": "delegator_shares defines total shares issued to a validator's delegators." + }, + "description": { + "description": "description defines the description terms for the validator.", + "type": "object", + "properties": { + "moniker": { + "type": "string", + "description": "moniker defines a human-readable name for the validator." + }, + "identity": { + "type": "string", + "description": "identity defines an optional identity signature (ex. UPort or Keybase)." + }, + "website": { + "type": "string", + "description": "website defines an optional website link." + }, + "security_contact": { + "type": "string", + "description": "security_contact defines an optional email for security contact." + }, + "details": { + "type": "string", + "description": "details define other optional details." + } + } + }, + "unbonding_height": { + "type": "string", + "format": "int64", + "description": "unbonding_height defines, if unbonding, the height at which this validator has begun unbonding." + }, + "unbonding_time": { + "type": "string", + "format": "date-time", + "description": "unbonding_time defines, if unbonding, the min time for the validator to complete unbonding." + }, + "commission": { + "description": "commission defines the commission parameters.", + "type": "object", + "properties": { + "commission_rates": { + "description": "commission_rates defines the initial commission rates to be used for creating a validator.", + "type": "object", + "properties": { + "rate": { + "type": "string", + "description": "rate is the commission rate charged to delegators, as a fraction." + }, + "max_rate": { + "type": "string", + "description": "max_rate defines the maximum commission rate which validator can ever charge, as a fraction." + }, + "max_change_rate": { + "type": "string", + "description": "max_change_rate defines the maximum daily increase of the validator commission, as a fraction." + } } }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "update_time": { + "type": "string", + "format": "date-time", + "description": "update_time is the last time the commission rate was changed." + } } + }, + "min_self_delegation": { + "type": "string", + "description": "min_self_delegation is the validator's self declared minimum self delegation.\n\nSince: cosmos-sdk 0.46" + }, + "unbonding_on_hold_ref_count": { + "type": "string", + "format": "int64", + "title": "strictly positive if this validator's unbonding has been stopped by external modules" + }, + "unbonding_ids": { + "type": "array", + "items": { + "type": "string", + "format": "uint64" + }, + "title": "list of unbonding ids, each uniquely identifying an unbonding of this validator" } + }, + "description": "Validator defines a validator, together with the total amount of the\nValidator's bond shares and their exchange rate to coins. Slashing results in\na decrease in the exchange rate, allowing correct calculation of future\nundelegations without iterating over delegators. When coins are delegated to\nthis validator, the validator is credited with a delegation whose number of\nbond shares is based on the amount of coins delegated divided by the current\nexchange rate. Voting power can be calculated as total bonded shares\nmultiplied by exchange rate." + } + }, + "title": "QueryValidatorResponse is response type for the Query/Validator RPC method" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } + }, + "parameters": [ + { + "name": "validator_addr", + "description": "validator_addr defines the validator address to query for.", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "Query" + ] } }, - "/cosmos/gov/v1/constitution": { + "/cosmos/staking/v1beta1/validators/{validator_addr}/delegations": { "get": { - "tags": [ - "Query" - ], - "summary": "Constitution queries the chain's constitution.", - "operationId": "Constitution", + "summary": "ValidatorDelegations queries delegate info for given validator.", + "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", + "operationId": "ValidatorDelegations", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "title": "QueryConstitutionResponse is the response type for the Query/Constitution RPC method", + "schema": { + "type": "object", + "properties": { + "delegation_responses": { + "type": "array", + "items": { + "type": "object", + "properties": { + "delegation": { + "type": "object", + "properties": { + "delegator_address": { + "type": "string", + "description": "delegator_address is the encoded address of the delegator." + }, + "validator_address": { + "type": "string", + "description": "validator_address is the encoded address of the validator." + }, + "shares": { + "type": "string", + "description": "shares define the delegation shares received." + } + }, + "description": "Delegation represents the bond with tokens held by an account. It is\nowned by one delegator, and is associated with the voting power of one\nvalidator." + }, + "balance": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + } + }, + "description": "DelegationResponse is equivalent to Delegation except that it contains a\nbalance in addition to shares which is more suitable for client responses." + } + }, + "pagination": { + "description": "pagination defines the pagination in the response.", "type": "object", "properties": { - "constitution": { - "type": "string" + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" } } } - } + }, + "title": "QueryValidatorDelegationsResponse is response type for the\nQuery/ValidatorDelegations RPC method" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/cosmos/gov/v1/params/{params_type}": { - "get": { - "tags": [ - "Query" - ], - "summary": "Params queries all parameters of the gov module.", - "operationId": "GovV1Params", + }, "parameters": [ { - "name": "params_type", + "name": "validator_addr", + "description": "validator_addr defines the validator address to query for.", "in": "path", - "description": "params_type defines which parameters to query for, can be one of \"voting\",\n\"tallying\" or \"deposit\".", "required": true, - "schema": { - "type": "string" - } + "type": "string" + }, + { + "name": "pagination.key", + "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", + "in": "query", + "required": false, + "type": "string", + "format": "byte" + }, + { + "name": "pagination.offset", + "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.limit", + "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.count_total", + "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", + "in": "query", + "required": false, + "type": "boolean" + }, + { + "name": "pagination.reverse", + "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", + "in": "query", + "required": false, + "type": "boolean" } ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/staking/v1beta1/validators/{validator_addr}/delegations/{delegator_addr}": { + "get": { + "summary": "Delegation queries delegate info for given validator delegator pair.", + "operationId": "Delegation", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "delegation_response": { "type": "object", "properties": { - "voting_params": { - "type": "object", - "properties": { - "voting_period": { - "type": "string", - "description": "Duration of the voting period." - } - }, - "description": "Deprecated: Prefer to use `params` instead.\nvoting_params defines the parameters related to voting." - }, - "deposit_params": { - "type": "object", - "properties": { - "min_deposit": { - "type": "array", - "description": "Minimum deposit for a proposal to enter voting period.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "max_deposit_period": { - "type": "string", - "description": "Maximum period for Atom holders to deposit on a proposal. Initial value: 2\nmonths." - } - }, - "description": "Deprecated: Prefer to use `params` instead.\ndeposit_params defines the parameters related to deposit." - }, - "tally_params": { + "delegation": { "type": "object", "properties": { - "quorum": { + "delegator_address": { "type": "string", - "description": "Minimum percentage of total stake needed to vote for a result to be\nconsidered valid." + "description": "delegator_address is the encoded address of the delegator." }, - "threshold": { + "validator_address": { "type": "string", - "description": "Minimum proportion of Yes votes for proposal to pass. Default value: 0.5." + "description": "validator_address is the encoded address of the validator." }, - "veto_threshold": { + "shares": { "type": "string", - "description": "Minimum value of Veto votes to Total votes ratio for proposal to be\nvetoed. Default value: 1/3." + "description": "shares define the delegation shares received." } }, - "description": "Deprecated: Prefer to use `params` instead.\ntally_params defines the parameters related to tally." + "description": "Delegation represents the bond with tokens held by an account. It is\nowned by one delegator, and is associated with the voting power of one\nvalidator." }, - "params": { + "balance": { "type": "object", "properties": { - "min_deposit": { - "type": "array", - "description": "Minimum deposit for a proposal to enter voting period.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "max_deposit_period": { - "type": "string", - "description": "Maximum period for Atom holders to deposit on a proposal. Initial value: 2\nmonths." - }, - "voting_period": { - "type": "string", - "description": "Duration of the voting period." - }, - "quorum": { - "type": "string", - "description": "Minimum percentage of total stake needed to vote for a result to be\n considered valid." - }, - "threshold": { - "type": "string", - "description": "Minimum proportion of Yes votes for proposal to pass. Default value: 0.5." - }, - "veto_threshold": { - "type": "string", - "description": "Minimum value of Veto votes to Total votes ratio for proposal to be\n vetoed. Default value: 1/3." - }, - "min_initial_deposit_ratio": { - "type": "string", - "description": "The ratio representing the proportion of the deposit value that must be paid at proposal submission." - }, - "proposal_cancel_ratio": { - "type": "string", - "description": "The cancel ratio which will not be returned back to the depositors when a proposal is cancelled.\n\nSince: cosmos-sdk 0.50" - }, - "proposal_cancel_dest": { - "type": "string", - "description": "The address which will receive (proposal_cancel_ratio * deposit) proposal deposits.\nIf empty, the (proposal_cancel_ratio * deposit) proposal deposits will be burned.\n\nSince: cosmos-sdk 0.50" - }, - "expedited_voting_period": { - "type": "string", - "description": "Duration of the voting period of an expedited proposal.\n\nSince: cosmos-sdk 0.50" - }, - "expedited_threshold": { - "type": "string", - "description": "Minimum proportion of Yes votes for proposal to pass. Default value: 0.67.\n\nSince: cosmos-sdk 0.50" - }, - "expedited_min_deposit": { - "type": "array", - "description": "Minimum expedited deposit for a proposal to enter voting period.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "burn_vote_quorum": { - "title": "burn deposits if a proposal does not meet quorum", - "type": "boolean" - }, - "burn_proposal_deposit_prevote": { - "title": "burn deposits if the proposal does not enter voting period", - "type": "boolean" + "denom": { + "type": "string" }, - "burn_vote_veto": { - "title": "burn deposits if quorum with vote type no_veto is met", - "type": "boolean" + "amount": { + "type": "string" } }, - "description": "params defines all the paramaters of x/gov module.\n\nSince: cosmos-sdk 0.47" + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." } }, - "description": "QueryParamsResponse is the response type for the Query/Params RPC method." + "description": "DelegationResponse is equivalent to Delegation except that it contains a\nbalance in addition to shares which is more suitable for client responses." } - } + }, + "description": "QueryDelegationResponse is response type for the Query/Delegation RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } + } + } + } + } + }, + "parameters": [ + { + "name": "validator_addr", + "description": "validator_addr defines the validator address to query for.", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "delegator_addr", + "description": "delegator_addr defines the delegator address to query for.", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/staking/v1beta1/validators/{validator_addr}/delegations/{delegator_addr}/unbonding_delegation": { + "get": { + "summary": "UnbondingDelegation queries unbonding info for given validator delegator\npair.", + "operationId": "UnbondingDelegation", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "type": "object", + "properties": { + "unbond": { "type": "object", "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" + "delegator_address": { + "type": "string", + "description": "delegator_address is the encoded address of the delegator." }, - "message": { - "type": "string" + "validator_address": { + "type": "string", + "description": "validator_address is the encoded address of the validator." }, - "details": { + "entries": { "type": "array", "items": { "type": "object", "properties": { - "type_url": { + "creation_height": { "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + "format": "int64", + "description": "creation_height is the height which the unbonding took place." }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "completion_time": { "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" + "format": "date-time", + "description": "completion_time is the unix time for unbonding completion." + }, + "initial_balance": { + "type": "string", + "description": "initial_balance defines the tokens initially scheduled to receive at completion." + }, + "balance": { + "type": "string", + "description": "balance defines the tokens to receive at completion." + }, + "unbonding_id": { + "type": "string", + "format": "uint64", + "title": "Incrementing id that uniquely identifies this entry" + }, + "unbonding_on_hold_ref_count": { + "type": "string", + "format": "int64", + "title": "Strictly positive if this entry's unbonding has been stopped by external modules" } }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } + "description": "UnbondingDelegationEntry defines an unbonding object with relevant metadata." + }, + "description": "entries are the unbonding delegation entries." } + }, + "description": "UnbondingDelegation stores all of a single delegator's unbonding bonds\nfor a single validator in an time-ordered list." + } + }, + "description": "QueryDelegationResponse is response type for the Query/UnbondingDelegation\nRPC method." + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/cosmos/gov/v1/proposals": { - "get": { - "tags": [ - "Query" - ], - "summary": "Proposals queries all proposals based on given status.", - "operationId": "GovV1Proposal", + }, "parameters": [ { - "name": "proposal_status", - "in": "query", - "description": "proposal_status defines the status of the proposals.\n\n - PROPOSAL_STATUS_UNSPECIFIED: PROPOSAL_STATUS_UNSPECIFIED defines the default proposal status.\n - PROPOSAL_STATUS_DEPOSIT_PERIOD: PROPOSAL_STATUS_DEPOSIT_PERIOD defines a proposal status during the deposit\nperiod.\n - PROPOSAL_STATUS_VOTING_PERIOD: PROPOSAL_STATUS_VOTING_PERIOD defines a proposal status during the voting\nperiod.\n - PROPOSAL_STATUS_PASSED: PROPOSAL_STATUS_PASSED defines a proposal status of a proposal that has\npassed.\n - PROPOSAL_STATUS_REJECTED: PROPOSAL_STATUS_REJECTED defines a proposal status of a proposal that has\nbeen rejected.\n - PROPOSAL_STATUS_FAILED: PROPOSAL_STATUS_FAILED defines a proposal status of a proposal that has\nfailed.", - "schema": { - "type": "string", - "default": "PROPOSAL_STATUS_UNSPECIFIED", - "enum": [ - "PROPOSAL_STATUS_UNSPECIFIED", - "PROPOSAL_STATUS_DEPOSIT_PERIOD", - "PROPOSAL_STATUS_VOTING_PERIOD", - "PROPOSAL_STATUS_PASSED", - "PROPOSAL_STATUS_REJECTED", - "PROPOSAL_STATUS_FAILED" - ] - } + "name": "validator_addr", + "description": "validator_addr defines the validator address to query for.", + "in": "path", + "required": true, + "type": "string" }, { - "name": "voter", - "in": "query", - "description": "voter defines the voter address for the proposals.", + "name": "delegator_addr", + "description": "delegator_addr defines the delegator address to query for.", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/staking/v1beta1/validators/{validator_addr}/unbonding_delegations": { + "get": { + "summary": "ValidatorUnbondingDelegations queries unbonding delegations of a validator.", + "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", + "operationId": "ValidatorUnbondingDelegations", + "responses": { + "200": { + "description": "A successful response.", "schema": { - "type": "string" + "type": "object", + "properties": { + "unbonding_responses": { + "type": "array", + "items": { + "type": "object", + "properties": { + "delegator_address": { + "type": "string", + "description": "delegator_address is the encoded address of the delegator." + }, + "validator_address": { + "type": "string", + "description": "validator_address is the encoded address of the validator." + }, + "entries": { + "type": "array", + "items": { + "type": "object", + "properties": { + "creation_height": { + "type": "string", + "format": "int64", + "description": "creation_height is the height which the unbonding took place." + }, + "completion_time": { + "type": "string", + "format": "date-time", + "description": "completion_time is the unix time for unbonding completion." + }, + "initial_balance": { + "type": "string", + "description": "initial_balance defines the tokens initially scheduled to receive at completion." + }, + "balance": { + "type": "string", + "description": "balance defines the tokens to receive at completion." + }, + "unbonding_id": { + "type": "string", + "format": "uint64", + "title": "Incrementing id that uniquely identifies this entry" + }, + "unbonding_on_hold_ref_count": { + "type": "string", + "format": "int64", + "title": "Strictly positive if this entry's unbonding has been stopped by external modules" + } + }, + "description": "UnbondingDelegationEntry defines an unbonding object with relevant metadata." + }, + "description": "entries are the unbonding delegation entries." + } + }, + "description": "UnbondingDelegation stores all of a single delegator's unbonding bonds\nfor a single validator in an time-ordered list." + } + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "description": "QueryValidatorUnbondingDelegationsResponse is response type for the\nQuery/ValidatorUnbondingDelegations RPC method." } }, - { - "name": "depositor", - "in": "query", - "description": "depositor defines the deposit addresses from the proposals.", + "default": { + "description": "An unexpected error response.", "schema": { - "type": "string" + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } + } + } } + } + }, + "parameters": [ + { + "name": "validator_addr", + "description": "validator_addr defines the validator address to query for.", + "in": "path", + "required": true, + "type": "string" }, { "name": "pagination.key", - "in": "query", "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } + "in": "query", + "required": false, + "type": "string", + "format": "byte" }, { "name": "pagination.offset", - "in": "query", "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.limit", - "in": "query", "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.count_total", - "in": "query", "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } + "in": "query", + "required": false, + "type": "boolean" }, { "name": "pagination.reverse", - "in": "query", "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", + "in": "query", + "required": false, + "type": "boolean" + } + ], + "tags": [ + "Query" + ] + } + }, + "/cosmos/tx/v1beta1/decode": { + "post": { + "summary": "TxDecode decodes the transaction.", + "description": "Since: cosmos-sdk 0.47", + "operationId": "TxDecode", + "responses": { + "200": { + "description": "A successful response.", "schema": { - "type": "boolean" + "$ref": "#/definitions/cosmos.tx.v1beta1.TxDecodeResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } + } + } + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "tx_bytes": { + "type": "string", + "format": "byte", + "description": "tx_bytes is the raw transaction." + } + }, + "description": "TxDecodeRequest is the request type for the Service.TxDecode\nRPC method.\n\nSince: cosmos-sdk 0.47" } } ], + "tags": [ + "Service" + ] + } + }, + "/cosmos/tx/v1beta1/decode/amino": { + "post": { + "summary": "TxDecodeAmino decodes an Amino transaction from encoded bytes to JSON.", + "description": "Since: cosmos-sdk 0.47", + "operationId": "TxDecodeAmino", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "proposals": { - "type": "array", - "description": "proposals defines all the requested governance proposals.", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "id defines the unique id of the proposal.", - "format": "uint64" - }, - "messages": { - "type": "array", - "description": "messages are the arbitrary messages to be executed if the proposal passes.", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - }, - "status": { - "type": "string", - "description": "status defines the proposal status.", - "default": "PROPOSAL_STATUS_UNSPECIFIED", - "enum": [ - "PROPOSAL_STATUS_UNSPECIFIED", - "PROPOSAL_STATUS_DEPOSIT_PERIOD", - "PROPOSAL_STATUS_VOTING_PERIOD", - "PROPOSAL_STATUS_PASSED", - "PROPOSAL_STATUS_REJECTED", - "PROPOSAL_STATUS_FAILED" - ] - }, - "final_tally_result": { - "type": "object", - "properties": { - "yes_count": { - "type": "string", - "description": "yes_count is the number of yes votes on a proposal." - }, - "abstain_count": { - "type": "string", - "description": "abstain_count is the number of abstain votes on a proposal." - }, - "no_count": { - "type": "string", - "description": "no_count is the number of no votes on a proposal." - }, - "no_with_veto_count": { - "type": "string", - "description": "no_with_veto_count is the number of no with veto votes on a proposal." - } - }, - "description": "final_tally_result is the final tally result of the proposal. When\nquerying a proposal via gRPC, this field is not populated until the\nproposal's voting period has ended." - }, - "submit_time": { - "type": "string", - "description": "submit_time is the time of proposal submission.", - "format": "date-time" - }, - "deposit_end_time": { - "type": "string", - "description": "deposit_end_time is the end time for deposition.", - "format": "date-time" - }, - "total_deposit": { - "type": "array", - "description": "total_deposit is the total deposit on the proposal.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "voting_start_time": { - "type": "string", - "description": "voting_start_time is the starting time to vote on a proposal.", - "format": "date-time" - }, - "voting_end_time": { - "type": "string", - "description": "voting_end_time is the end time of voting on a proposal.", - "format": "date-time" - }, - "metadata": { - "title": "metadata is any arbitrary metadata attached to the proposal.\nthe recommended format of the metadata is to be found here:\nhttps://docs.cosmos.network/v0.47/modules/gov#proposal-3", - "type": "string" - }, - "title": { - "title": "title is the title of the proposal", - "type": "string", - "description": "Since: cosmos-sdk 0.47" - }, - "summary": { - "title": "summary is a short summary of the proposal", - "type": "string", - "description": "Since: cosmos-sdk 0.47" - }, - "proposer": { - "title": "proposer is the address of the proposal sumbitter", - "type": "string", - "description": "Since: cosmos-sdk 0.47" - }, - "expedited": { - "title": "expedited defines if the proposal is expedited", - "type": "boolean", - "description": "Since: cosmos-sdk 0.50" - }, - "failed_reason": { - "title": "failed_reason defines the reason why the proposal failed", - "type": "string", - "description": "Since: cosmos-sdk 0.50" - } - }, - "description": "Proposal defines the core field members of a governance proposal." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QueryProposalsResponse is the response type for the Query/Proposals RPC\nmethod." + "schema": { + "type": "object", + "properties": { + "amino_json": { + "type": "string" } - } + }, + "description": "TxDecodeAminoResponse is the response type for the Service.TxDecodeAmino\nRPC method.\n\nSince: cosmos-sdk 0.47" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/cosmos/gov/v1/proposals/{proposal_id}": { - "get": { - "tags": [ - "Query" - ], - "summary": "Proposal queries proposal details based on ProposalID.", - "operationId": "GovV1Proposal", + }, "parameters": [ { - "name": "proposal_id", - "in": "path", - "description": "proposal_id defines the unique id of the proposal.", + "name": "body", + "in": "body", "required": true, "schema": { - "type": "string", - "format": "uint64" + "type": "object", + "properties": { + "amino_binary": { + "type": "string", + "format": "byte" + } + }, + "description": "TxDecodeAminoRequest is the request type for the Service.TxDecodeAmino\nRPC method.\n\nSince: cosmos-sdk 0.47" } } ], + "tags": [ + "Service" + ] + } + }, + "/cosmos/tx/v1beta1/encode": { + "post": { + "summary": "TxEncode encodes the transaction.", + "description": "Since: cosmos-sdk 0.47", + "operationId": "TxEncode", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "proposal": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "id defines the unique id of the proposal.", - "format": "uint64" - }, - "messages": { - "type": "array", - "description": "messages are the arbitrary messages to be executed if the proposal passes.", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - }, - "status": { - "type": "string", - "description": "status defines the proposal status.", - "default": "PROPOSAL_STATUS_UNSPECIFIED", - "enum": [ - "PROPOSAL_STATUS_UNSPECIFIED", - "PROPOSAL_STATUS_DEPOSIT_PERIOD", - "PROPOSAL_STATUS_VOTING_PERIOD", - "PROPOSAL_STATUS_PASSED", - "PROPOSAL_STATUS_REJECTED", - "PROPOSAL_STATUS_FAILED" - ] - }, - "final_tally_result": { - "type": "object", - "properties": { - "yes_count": { - "type": "string", - "description": "yes_count is the number of yes votes on a proposal." - }, - "abstain_count": { - "type": "string", - "description": "abstain_count is the number of abstain votes on a proposal." - }, - "no_count": { - "type": "string", - "description": "no_count is the number of no votes on a proposal." - }, - "no_with_veto_count": { - "type": "string", - "description": "no_with_veto_count is the number of no with veto votes on a proposal." - } - }, - "description": "final_tally_result is the final tally result of the proposal. When\nquerying a proposal via gRPC, this field is not populated until the\nproposal's voting period has ended." - }, - "submit_time": { - "type": "string", - "description": "submit_time is the time of proposal submission.", - "format": "date-time" - }, - "deposit_end_time": { - "type": "string", - "description": "deposit_end_time is the end time for deposition.", - "format": "date-time" - }, - "total_deposit": { - "type": "array", - "description": "total_deposit is the total deposit on the proposal.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "voting_start_time": { - "type": "string", - "description": "voting_start_time is the starting time to vote on a proposal.", - "format": "date-time" - }, - "voting_end_time": { - "type": "string", - "description": "voting_end_time is the end time of voting on a proposal.", - "format": "date-time" - }, - "metadata": { - "title": "metadata is any arbitrary metadata attached to the proposal.\nthe recommended format of the metadata is to be found here:\nhttps://docs.cosmos.network/v0.47/modules/gov#proposal-3", - "type": "string" - }, - "title": { - "title": "title is the title of the proposal", - "type": "string", - "description": "Since: cosmos-sdk 0.47" - }, - "summary": { - "title": "summary is a short summary of the proposal", - "type": "string", - "description": "Since: cosmos-sdk 0.47" - }, - "proposer": { - "title": "proposer is the address of the proposal sumbitter", - "type": "string", - "description": "Since: cosmos-sdk 0.47" - }, - "expedited": { - "title": "expedited defines if the proposal is expedited", - "type": "boolean", - "description": "Since: cosmos-sdk 0.50" - }, - "failed_reason": { - "title": "failed_reason defines the reason why the proposal failed", - "type": "string", - "description": "Since: cosmos-sdk 0.50" - } - }, - "description": "Proposal defines the core field members of a governance proposal." - } - }, - "description": "QueryProposalResponse is the response type for the Query/Proposal RPC method." + "schema": { + "type": "object", + "properties": { + "tx_bytes": { + "type": "string", + "format": "byte", + "description": "tx_bytes is the encoded transaction bytes." } - } + }, + "description": "TxEncodeResponse is the response type for the\nService.TxEncode method.\n\nSince: cosmos-sdk 0.47" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/cosmos/gov/v1/proposals/{proposal_id}/deposits": { - "get": { - "tags": [ - "Query" - ], - "summary": "Deposits queries all deposits of a single proposal.", - "operationId": "GovV1Deposit", + }, "parameters": [ { - "name": "proposal_id", - "in": "path", - "description": "proposal_id defines the unique id of the proposal.", + "name": "body", + "in": "body", "required": true, "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.key", - "in": "query", - "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } - }, - { - "name": "pagination.offset", - "in": "query", - "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" + "$ref": "#/definitions/cosmos.tx.v1beta1.TxEncodeRequest" } - }, - { - "name": "pagination.limit", - "in": "query", - "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", + } + ], + "tags": [ + "Service" + ] + } + }, + "/cosmos/tx/v1beta1/encode/amino": { + "post": { + "summary": "TxEncodeAmino encodes an Amino transaction from JSON to encoded bytes.", + "description": "Since: cosmos-sdk 0.47", + "operationId": "TxEncodeAmino", + "responses": { + "200": { + "description": "A successful response.", "schema": { - "type": "string", - "format": "uint64" + "type": "object", + "properties": { + "amino_binary": { + "type": "string", + "format": "byte" + } + }, + "description": "TxEncodeAminoResponse is the response type for the Service.TxEncodeAmino\nRPC method.\n\nSince: cosmos-sdk 0.47" } }, - { - "name": "pagination.count_total", - "in": "query", - "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", + "default": { + "description": "An unexpected error response.", "schema": { - "type": "boolean" + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } + } + } } - }, + } + }, + "parameters": [ { - "name": "pagination.reverse", - "in": "query", - "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", + "name": "body", + "in": "body", + "required": true, "schema": { - "type": "boolean" + "type": "object", + "properties": { + "amino_json": { + "type": "string" + } + }, + "description": "TxEncodeAminoRequest is the request type for the Service.TxEncodeAmino\nRPC method.\n\nSince: cosmos-sdk 0.47" } } ], + "tags": [ + "Service" + ] + } + }, + "/cosmos/tx/v1beta1/simulate": { + "post": { + "summary": "Simulate simulates executing a transaction for estimating gas usage.", + "operationId": "Simulate", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "gas_info": { + "description": "gas_info is the information about gas used in the simulation.", + "type": "object", + "properties": { + "gas_wanted": { + "type": "string", + "format": "uint64", + "description": "GasWanted is the maximum units of work we allow this tx to perform." + }, + "gas_used": { + "type": "string", + "format": "uint64", + "description": "GasUsed is the amount of gas actually consumed." + } + } + }, + "result": { + "description": "result is the result of the simulation.", "type": "object", "properties": { - "deposits": { + "data": { + "type": "string", + "format": "byte", + "description": "Data is any data returned from message or handler execution. It MUST be\nlength prefixed in order to separate data from multiple message executions.\nDeprecated. This field is still populated, but prefer msg_response instead\nbecause it also contains the Msg response typeURL." + }, + "log": { + "type": "string", + "description": "Log contains the log information from message or handler execution." + }, + "events": { "type": "array", - "description": "deposits defines the requested deposits.", "items": { "type": "object", "properties": { - "proposal_id": { - "type": "string", - "description": "proposal_id defines the unique id of the proposal.", - "format": "uint64" - }, - "depositor": { - "type": "string", - "description": "depositor defines the deposit addresses from the proposals." + "type": { + "type": "string" }, - "amount": { + "attributes": { "type": "array", - "description": "amount to be deposited by depositor.", "items": { "type": "object", "properties": { - "denom": { + "key": { "type": "string" }, - "amount": { + "value": { "type": "string" + }, + "index": { + "type": "boolean" } }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + "description": "EventAttribute is a single key-value pair, associated with an event." } } }, - "description": "Deposit defines an amount deposited by an account address to an active\nproposal." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } + "description": "Event allows application developers to attach additional information to\nResponseFinalizeBlock and ResponseCheckTx.\nLater, transactions may be queried using these events." }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QueryDepositsResponse is the response type for the Query/Deposits RPC method." - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" + "description": "Events contains a slice of Event objects that were emitted during message\nor handler execution." }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { + "msg_responses": { "type": "array", "items": { "type": "object", @@ -16758,4701 +17944,3827 @@ "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." }, "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } }, "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } + }, + "description": "msg_responses contains the Msg handler responses type packed in Anys.\n\nSince: cosmos-sdk 0.46" } } } + }, + "description": "SimulateResponse is the response type for the\nService.SimulateRPC method." + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } + } } } } - } - } - }, - "/cosmos/gov/v1/proposals/{proposal_id}/deposits/{depositor}": { - "get": { - "tags": [ - "Query" - ], - "summary": "Deposit queries single deposit information based on proposalID, depositAddr.", - "operationId": "GovV1Deposit", + }, "parameters": [ { - "name": "proposal_id", - "in": "path", - "description": "proposal_id defines the unique id of the proposal.", + "name": "body", + "in": "body", "required": true, "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "depositor", - "in": "path", - "description": "depositor defines the deposit addresses from the proposals.", - "required": true, - "schema": { - "type": "string" + "$ref": "#/definitions/cosmos.tx.v1beta1.SimulateRequest" } } ], - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "deposit": { - "type": "object", - "properties": { - "proposal_id": { - "type": "string", - "description": "proposal_id defines the unique id of the proposal.", - "format": "uint64" - }, - "depositor": { - "type": "string", - "description": "depositor defines the deposit addresses from the proposals." - }, - "amount": { - "type": "array", - "description": "amount to be deposited by depositor.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - } - }, - "description": "Deposit defines an amount deposited by an account address to an active\nproposal." - } - }, - "description": "QueryDepositResponse is the response type for the Query/Deposit RPC method." - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - } - } - } - } - } - } + "tags": [ + "Service" + ] } }, - "/cosmos/gov/v1/proposals/{proposal_id}/tally": { + "/cosmos/tx/v1beta1/txs": { "get": { - "tags": [ - "Query" - ], - "summary": "TallyResult queries the tally of a proposal vote.", - "operationId": "GovV1TallyResult", - "parameters": [ - { - "name": "proposal_id", - "in": "path", - "description": "proposal_id defines the unique id of the proposal.", - "required": true, - "schema": { - "type": "string", - "format": "uint64" - } - } - ], + "summary": "GetTxsEvent fetches txs by event.", + "operationId": "GetTxsEvent", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "tally": { - "type": "object", - "properties": { - "yes_count": { - "type": "string", - "description": "yes_count is the number of yes votes on a proposal." - }, - "abstain_count": { - "type": "string", - "description": "abstain_count is the number of abstain votes on a proposal." - }, - "no_count": { - "type": "string", - "description": "no_count is the number of no votes on a proposal." - }, - "no_with_veto_count": { - "type": "string", - "description": "no_with_veto_count is the number of no with veto votes on a proposal." - } - }, - "description": "tally defines the requested tally." - } - }, - "description": "QueryTallyResultResponse is the response type for the Query/Tally RPC method." - } - } + "schema": { + "$ref": "#/definitions/cosmos.tx.v1beta1.GetTxsEventResponse" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/cosmos/gov/v1/proposals/{proposal_id}/votes": { - "get": { - "tags": [ - "Query" - ], - "summary": "Votes queries votes of a given proposal.", - "operationId": "GovV1Votes", + }, "parameters": [ { - "name": "proposal_id", - "in": "path", - "description": "proposal_id defines the unique id of the proposal.", - "required": true, - "schema": { - "type": "string", - "format": "uint64" - } + "name": "events", + "description": "events is the list of transaction event type.\nDeprecated: post v0.47.x use query instead, which should contain a valid\nevents query.", + "in": "query", + "required": false, + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "multi" }, { "name": "pagination.key", - "in": "query", "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } + "in": "query", + "required": false, + "type": "string", + "format": "byte" }, { "name": "pagination.offset", - "in": "query", "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.limit", - "in": "query", "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.count_total", - "in": "query", "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } + "in": "query", + "required": false, + "type": "boolean" }, { "name": "pagination.reverse", - "in": "query", "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } - } - ], - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "votes": { - "type": "array", - "description": "votes defines the queried votes.", - "items": { - "type": "object", - "properties": { - "proposal_id": { - "type": "string", - "description": "proposal_id defines the unique id of the proposal.", - "format": "uint64" - }, - "voter": { - "type": "string", - "description": "voter is the voter address of the proposal." - }, - "options": { - "type": "array", - "description": "options is the weighted vote options.", - "items": { - "type": "object", - "properties": { - "option": { - "type": "string", - "description": "option defines the valid vote options, it must not contain duplicate vote options.", - "default": "VOTE_OPTION_UNSPECIFIED", - "enum": [ - "VOTE_OPTION_UNSPECIFIED", - "VOTE_OPTION_YES", - "VOTE_OPTION_ABSTAIN", - "VOTE_OPTION_NO", - "VOTE_OPTION_NO_WITH_VETO" - ] + "in": "query", + "required": false, + "type": "boolean" + }, + { + "name": "order_by", + "description": " - ORDER_BY_UNSPECIFIED: ORDER_BY_UNSPECIFIED specifies an unknown sorting order. OrderBy defaults\nto ASC in this case.\n - ORDER_BY_ASC: ORDER_BY_ASC defines ascending order\n - ORDER_BY_DESC: ORDER_BY_DESC defines descending order", + "in": "query", + "required": false, + "type": "string", + "enum": [ + "ORDER_BY_UNSPECIFIED", + "ORDER_BY_ASC", + "ORDER_BY_DESC" + ], + "default": "ORDER_BY_UNSPECIFIED" + }, + { + "name": "page", + "description": "page is the page number to query, starts at 1. If not provided, will\ndefault to first page.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "limit", + "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "query", + "description": "query defines the transaction event query that is proxied to Tendermint's\nTxSearch RPC method. The query must be valid.\n\nSince cosmos-sdk 0.50", + "in": "query", + "required": false, + "type": "string" + } + ], + "tags": [ + "Service" + ] + }, + "post": { + "summary": "BroadcastTx broadcast transaction.", + "operationId": "BroadcastTx", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "type": "object", + "properties": { + "tx_response": { + "type": "object", + "properties": { + "height": { + "type": "string", + "format": "int64", + "title": "The block height" + }, + "txhash": { + "type": "string", + "description": "The transaction hash." + }, + "codespace": { + "type": "string", + "title": "Namespace for the Code" + }, + "code": { + "type": "integer", + "format": "int64", + "description": "Response code." + }, + "data": { + "type": "string", + "description": "Result bytes, if any." + }, + "raw_log": { + "type": "string", + "description": "The output of the application's logger (raw string). May be\nnon-deterministic." + }, + "logs": { + "type": "array", + "items": { + "type": "object", + "properties": { + "msg_index": { + "type": "integer", + "format": "int64" + }, + "log": { + "type": "string" + }, + "events": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string" }, - "weight": { - "type": "string", - "description": "weight is the vote weight associated with the vote option." + "attributes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "description": "Attribute defines an attribute wrapper where the key and value are\nstrings instead of raw bytes." + } } }, - "description": "WeightedVoteOption defines a unit of vote for vote split." - } - }, - "metadata": { - "title": "metadata is any arbitrary metadata attached to the vote.\nthe recommended format of the metadata is to be found here: https://docs.cosmos.network/v0.47/modules/gov#vote-5", - "type": "string" + "description": "StringEvent defines en Event object wrapper where all the attributes\ncontain key/value pairs that are strings instead of raw bytes." + }, + "description": "Events contains a slice of Event objects that were emitted during some\nexecution." } }, - "description": "Vote defines a vote on a governance proposal.\nA Vote consists of a proposal ID, the voter, and the vote option." - } + "description": "ABCIMessageLog defines a structure containing an indexed tx ABCI message log." + }, + "description": "The output of the application's logger (typed). May be non-deterministic." + }, + "info": { + "type": "string", + "description": "Additional information. May be non-deterministic." + }, + "gas_wanted": { + "type": "string", + "format": "int64", + "description": "Amount of gas requested for transaction." + }, + "gas_used": { + "type": "string", + "format": "int64", + "description": "Amount of gas consumed by transaction." }, - "pagination": { + "tx": { "type": "object", "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "type_url": { "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", + "value": { "type": "string", - "format": "uint64" + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QueryVotesResponse is the response type for the Query/Votes RPC method." - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" }, - "message": { - "type": "string" + "timestamp": { + "type": "string", + "description": "Time of the previous block. For heights > 1, it's the weighted median of\nthe timestamps of the valid votes in the block.LastCommit. For height == 1,\nit's genesis time." }, - "details": { + "events": { "type": "array", "items": { "type": "object", "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + "type": { + "type": "string" }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" + "attributes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "type": "string" + }, + "index": { + "type": "boolean" + } + }, + "description": "EventAttribute is a single key-value pair, associated with an event." + } } }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } + "description": "Event allows application developers to attach additional information to\nResponseFinalizeBlock and ResponseCheckTx.\nLater, transactions may be queried using these events." + }, + "description": "Events defines all the events emitted by processing a transaction. Note,\nthese events include those emitted by processing all the messages and those\nemitted from the ante. Whereas Logs contains the events, with\nadditional metadata, emitted only by processing the messages.\n\nSince: cosmos-sdk 0.42.11, 0.44.5, 0.45" } + }, + "description": "TxResponse defines a structure containing relevant tx data and metadata. The\ntags are stringified and the log is JSON decoded." + } + }, + "description": "BroadcastTxResponse is the response type for the\nService.BroadcastTx method." + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/cosmos/gov/v1/proposals/{proposal_id}/votes/{voter}": { - "get": { - "tags": [ - "Query" - ], - "summary": "Vote queries voted information based on proposalID, voterAddr.", - "operationId": "GovV1Vote", + }, "parameters": [ { - "name": "proposal_id", - "in": "path", - "description": "proposal_id defines the unique id of the proposal.", - "required": true, - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "voter", - "in": "path", - "description": "voter defines the voter address for the proposals.", + "name": "body", + "in": "body", "required": true, "schema": { - "type": "string" + "type": "object", + "properties": { + "tx_bytes": { + "type": "string", + "format": "byte", + "description": "tx_bytes is the raw transaction." + }, + "mode": { + "type": "string", + "enum": [ + "BROADCAST_MODE_UNSPECIFIED", + "BROADCAST_MODE_BLOCK", + "BROADCAST_MODE_SYNC", + "BROADCAST_MODE_ASYNC" + ], + "default": "BROADCAST_MODE_UNSPECIFIED", + "description": "BroadcastMode specifies the broadcast mode for the TxService.Broadcast RPC\nmethod.\n\n - BROADCAST_MODE_UNSPECIFIED: zero-value for mode ordering\n - BROADCAST_MODE_BLOCK: Deprecated: use BROADCAST_MODE_SYNC instead,\nBROADCAST_MODE_BLOCK is not supported by the SDK from v0.47.x onwards.\n - BROADCAST_MODE_SYNC: BROADCAST_MODE_SYNC defines a tx broadcasting mode where the client waits\nfor a CheckTx execution response only.\n - BROADCAST_MODE_ASYNC: BROADCAST_MODE_ASYNC defines a tx broadcasting mode where the client\nreturns immediately." + } + }, + "description": "BroadcastTxRequest is the request type for the Service.BroadcastTxRequest\nRPC method." } } ], + "tags": [ + "Service" + ] + } + }, + "/cosmos/tx/v1beta1/txs/block/{height}": { + "get": { + "summary": "GetBlockWithTxs fetches a block with decoded txs.", + "description": "Since: cosmos-sdk 0.45.2", + "operationId": "GetBlockWithTxs", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "vote": { - "type": "object", - "properties": { - "proposal_id": { - "type": "string", - "description": "proposal_id defines the unique id of the proposal.", - "format": "uint64" - }, - "voter": { - "type": "string", - "description": "voter is the voter address of the proposal." - }, - "options": { - "type": "array", - "description": "options is the weighted vote options.", - "items": { - "type": "object", - "properties": { - "option": { - "type": "string", - "description": "option defines the valid vote options, it must not contain duplicate vote options.", - "default": "VOTE_OPTION_UNSPECIFIED", - "enum": [ - "VOTE_OPTION_UNSPECIFIED", - "VOTE_OPTION_YES", - "VOTE_OPTION_ABSTAIN", - "VOTE_OPTION_NO", - "VOTE_OPTION_NO_WITH_VETO" - ] - }, - "weight": { - "type": "string", - "description": "weight is the vote weight associated with the vote option." - } - }, - "description": "WeightedVoteOption defines a unit of vote for vote split." - } - }, - "metadata": { - "title": "metadata is any arbitrary metadata attached to the vote.\nthe recommended format of the metadata is to be found here: https://docs.cosmos.network/v0.47/modules/gov#vote-5", - "type": "string" - } - }, - "description": "Vote defines a vote on a governance proposal.\nA Vote consists of a proposal ID, the voter, and the vote option." - } - }, - "description": "QueryVoteResponse is the response type for the Query/Vote RPC method." - } - } + "schema": { + "$ref": "#/definitions/cosmos.tx.v1beta1.GetBlockWithTxsResponse" } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - } - } - } - } - } - } - } - }, - "/cosmos/slashing/v1beta1/params": { - "get": { - "tags": [ - "Query" - ], - "summary": "Params queries the parameters of slashing module", - "operationId": "SlashingParams", - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "title": "QueryParamsResponse is the response type for the Query/Params RPC method", - "type": "object", - "properties": { - "params": { - "type": "object", - "properties": { - "signed_blocks_window": { - "type": "string", - "format": "int64" - }, - "min_signed_per_window": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "downtime_jail_duration": { - "type": "string" - }, - "slash_fraction_double_sign": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "slash_fraction_downtime": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." }, - "description": "Params represents the parameters used for by the slashing module." - } - } - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/cosmos/slashing/v1beta1/signing_infos": { - "get": { - "tags": [ - "Query" - ], - "summary": "SigningInfos queries signing info of all validators", - "operationId": "SigningInfos", + }, "parameters": [ + { + "name": "height", + "description": "height is the height of the block to query.", + "in": "path", + "required": true, + "type": "string", + "format": "int64" + }, { "name": "pagination.key", - "in": "query", "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } + "in": "query", + "required": false, + "type": "string", + "format": "byte" }, { "name": "pagination.offset", - "in": "query", "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.limit", - "in": "query", "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } + "in": "query", + "required": false, + "type": "string", + "format": "uint64" }, { "name": "pagination.count_total", - "in": "query", "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } + "in": "query", + "required": false, + "type": "boolean" }, { "name": "pagination.reverse", - "in": "query", "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } + "in": "query", + "required": false, + "type": "boolean" } ], + "tags": [ + "Service" + ] + } + }, + "/cosmos/tx/v1beta1/txs/{hash}": { + "get": { + "summary": "GetTx fetches a tx by hash.", + "operationId": "GetTx", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "title": "QuerySigningInfosResponse is the response type for the Query/SigningInfos RPC\nmethod", - "type": "object", - "properties": { - "info": { - "title": "info is the signing info of all validators", - "type": "array", - "items": { - "type": "object", - "properties": { - "address": { - "type": "string" - }, - "start_height": { - "title": "Height at which validator was first a candidate OR was un-jailed", - "type": "string", - "format": "int64" - }, - "index_offset": { - "type": "string", - "description": "Index which is incremented every time a validator is bonded in a block and\n_may_ have signed a pre-commit or not. This in conjunction with the\nsigned_blocks_window param determines the index in the missed block bitmap.", - "format": "int64" - }, - "jailed_until": { - "type": "string", - "description": "Timestamp until which the validator is jailed due to liveness downtime.", - "format": "date-time" - }, - "tombstoned": { - "type": "boolean", - "description": "Whether or not a validator has been tombstoned (killed out of validator\nset). It is set once the validator commits an equivocation or for any other\nconfigured misbehavior." - }, - "missed_blocks_counter": { - "type": "string", - "description": "A counter of missed (unsigned) blocks. It is used to avoid unnecessary\nreads in the missed block bitmap.", - "format": "int64" - } - }, - "description": "ValidatorSigningInfo defines a validator's signing info for monitoring their\nliveness activity." + "schema": { + "$ref": "#/definitions/cosmos.tx.v1beta1.GetTxResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }" - } - } - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/cosmos/slashing/v1beta1/signing_infos/{cons_address}": { - "get": { - "tags": [ - "Query" - ], - "summary": "SigningInfo queries the signing info of given cons address", - "operationId": "SigningInfo", + }, "parameters": [ { - "name": "cons_address", + "name": "hash", + "description": "hash is the tx hash to query, encoded as a hex string.", "in": "path", - "description": "cons_address is the address to query signing info of", "required": true, - "schema": { - "type": "string" - } + "type": "string" } ], + "tags": [ + "Service" + ] + } + }, + "/cosmos/base/tendermint/v1beta1/abci_query": { + "get": { + "summary": "ABCIQuery defines a query handler that supports ABCI queries directly to the\napplication, bypassing Tendermint completely. The ABCI query must contain\na valid and supported path, including app, custom, p2p, and store.", + "description": "Since: cosmos-sdk 0.46", + "operationId": "ABCIQuery", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "title": "QuerySigningInfoResponse is the response type for the Query/SigningInfo RPC\nmethod", - "type": "object", - "properties": { - "val_signing_info": { - "title": "val_signing_info is the signing info of requested val cons address", - "type": "object", - "properties": { - "address": { - "type": "string" - }, - "start_height": { - "title": "Height at which validator was first a candidate OR was un-jailed", - "type": "string", - "format": "int64" - }, - "index_offset": { - "type": "string", - "description": "Index which is incremented every time a validator is bonded in a block and\n_may_ have signed a pre-commit or not. This in conjunction with the\nsigned_blocks_window param determines the index in the missed block bitmap.", - "format": "int64" - }, - "jailed_until": { - "type": "string", - "description": "Timestamp until which the validator is jailed due to liveness downtime.", - "format": "date-time" - }, - "tombstoned": { - "type": "boolean", - "description": "Whether or not a validator has been tombstoned (killed out of validator\nset). It is set once the validator commits an equivocation or for any other\nconfigured misbehavior." - }, - "missed_blocks_counter": { - "type": "string", - "description": "A counter of missed (unsigned) blocks. It is used to avoid unnecessary\nreads in the missed block bitmap.", - "format": "int64" - } - }, - "description": "ValidatorSigningInfo defines a validator's signing info for monitoring their\nliveness activity." - } - } - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "format": "int64" + }, + "log": { + "type": "string" + }, + "info": { + "type": "string" + }, + "index": { + "type": "string", + "format": "int64" + }, + "key": { + "type": "string", + "format": "byte" + }, + "value": { + "type": "string", + "format": "byte" + }, + "proof_ops": { "type": "object", "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { + "ops": { "type": "array", "items": { "type": "object", "properties": { - "type_url": { + "type": { "type": "string" }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "key": { + "type": "string", + "format": "byte" + }, + "data": { "type": "string", "format": "byte" } - } + }, + "description": "ProofOp defines an operation used for calculating Merkle root. The data could\nbe arbitrary format, providing necessary data for example neighbouring node\nhash.\n\nNote: This type is a duplicate of the ProofOp proto type defined in Tendermint." } } + }, + "description": "ProofOps is Merkle proof defined by the list of ProofOps.\n\nNote: This type is a duplicate of the ProofOps proto type defined in Tendermint." + }, + "height": { + "type": "string", + "format": "int64" + }, + "codespace": { + "type": "string" + } + }, + "description": "ABCIQueryResponse defines the response structure for the ABCIQuery gRPC query.\n\nNote: This type is a duplicate of the ResponseQuery proto type defined in\nTendermint." + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } - } - }, - "/cosmos/staking/v1beta1/delegations/{delegator_addr}": { - "get": { - "tags": [ - "Query" - ], - "summary": "DelegatorDelegations queries all delegations of a given delegator address.", - "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", - "operationId": "DelegatorDelegations", + }, "parameters": [ { - "name": "delegator_addr", - "in": "path", - "description": "delegator_addr defines the delegator address to query for.", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "pagination.key", - "in": "query", - "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } - }, - { - "name": "pagination.offset", + "name": "data", "in": "query", - "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } + "required": false, + "type": "string", + "format": "byte" }, { - "name": "pagination.limit", + "name": "path", "in": "query", - "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } + "required": false, + "type": "string" }, { - "name": "pagination.count_total", + "name": "height", "in": "query", - "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } + "required": false, + "type": "string", + "format": "int64" }, { - "name": "pagination.reverse", + "name": "prove", "in": "query", - "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } + "required": false, + "type": "boolean" } ], + "tags": [ + "Service" + ] + } + }, + "/cosmos/base/tendermint/v1beta1/blocks/latest": { + "get": { + "summary": "GetLatestBlock returns the latest block.", + "operationId": "GetLatestBlock", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "block_id": { "type": "object", "properties": { - "delegation_responses": { - "type": "array", - "description": "delegation_responses defines all the delegations' info of a delegator.", - "items": { - "type": "object", - "properties": { - "delegation": { - "type": "object", - "properties": { - "delegator_address": { - "type": "string", - "description": "delegator_address is the encoded address of the delegator." - }, - "validator_address": { - "type": "string", - "description": "validator_address is the encoded address of the validator." - }, - "shares": { - "type": "string", - "description": "shares define the delegation shares received." - } - }, - "description": "Delegation represents the bond with tokens held by an account. It is\nowned by one delegator, and is associated with the voting power of one\nvalidator." - }, - "balance": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "description": "DelegationResponse is equivalent to Delegation except that it contains a\nbalance in addition to shares which is more suitable for client responses." - } + "hash": { + "type": "string", + "format": "byte" }, - "pagination": { + "part_set_header": { "type": "object", "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", + "type": "integer", + "format": "int64" + }, + "hash": { "type": "string", - "format": "uint64" + "format": "byte" } }, - "description": "pagination defines the pagination in the response." + "title": "PartsetHeader" } }, - "description": "QueryDelegatorDelegationsResponse is response type for the\nQuery/DelegatorDelegations RPC method." - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { + "title": "BlockID" + }, + "block": { + "title": "Deprecated: please use `sdk_block` instead", "type": "object", "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + "header": { + "type": "object", + "properties": { + "version": { + "title": "basic block info", + "type": "object", + "properties": { + "block": { + "type": "string", + "format": "uint64" + }, + "app": { + "type": "string", + "format": "uint64" + } }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } + "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - } - } - } - } - } - } - } - }, - "/cosmos/staking/v1beta1/delegators/{delegator_addr}/redelegations": { - "get": { - "tags": [ - "Query" - ], - "summary": "Redelegations queries redelegations of given address.", - "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", - "operationId": "Redelegations", - "parameters": [ - { - "name": "delegator_addr", - "in": "path", - "description": "delegator_addr defines the delegator address to query for.", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "src_validator_addr", - "in": "query", - "description": "src_validator_addr defines the validator address to redelegate from.", - "schema": { - "type": "string" - } - }, - { - "name": "dst_validator_addr", - "in": "query", - "description": "dst_validator_addr defines the validator address to redelegate to.", - "schema": { - "type": "string" - } - }, - { - "name": "pagination.key", - "in": "query", - "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } - }, - { - "name": "pagination.offset", - "in": "query", - "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.limit", - "in": "query", - "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.count_total", - "in": "query", - "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } - }, - { - "name": "pagination.reverse", - "in": "query", - "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } - } - ], - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "redelegation_responses": { - "type": "array", - "items": { - "type": "object", - "properties": { - "redelegation": { - "type": "object", - "properties": { - "delegator_address": { - "type": "string", - "description": "delegator_address is the bech32-encoded address of the delegator." - }, - "validator_src_address": { - "type": "string", - "description": "validator_src_address is the validator redelegation source operator address." - }, - "validator_dst_address": { - "type": "string", - "description": "validator_dst_address is the validator redelegation destination operator address." - }, - "entries": { - "type": "array", - "description": "entries are the redelegation entries.", - "items": { - "type": "object", - "properties": { - "creation_height": { - "type": "string", - "description": "creation_height defines the height which the redelegation took place.", - "format": "int64" - }, - "completion_time": { - "type": "string", - "description": "completion_time defines the unix time for redelegation completion.", - "format": "date-time" - }, - "initial_balance": { - "type": "string", - "description": "initial_balance defines the initial balance when redelegation started." - }, - "shares_dst": { - "type": "string", - "description": "shares_dst is the amount of destination-validator shares created by redelegation." - }, - "unbonding_id": { - "title": "Incrementing id that uniquely identifies this entry", - "type": "string", - "format": "uint64" - }, - "unbonding_on_hold_ref_count": { - "title": "Strictly positive if this entry's unbonding has been stopped by external modules", - "type": "string", - "format": "int64" - } - }, - "description": "RedelegationEntry defines a redelegation object with relevant metadata." - } - } + "chain_id": { + "type": "string" + }, + "height": { + "type": "string", + "format": "int64" + }, + "time": { + "type": "string", + "format": "date-time" + }, + "last_block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" }, - "description": "Redelegation contains the list of a particular delegator's redelegating bonds\nfrom a particular source validator to a particular destination validator." - }, - "entries": { - "type": "array", - "items": { + "part_set_header": { "type": "object", "properties": { - "redelegation_entry": { - "type": "object", - "properties": { - "creation_height": { - "type": "string", - "description": "creation_height defines the height which the redelegation took place.", - "format": "int64" - }, - "completion_time": { - "type": "string", - "description": "completion_time defines the unix time for redelegation completion.", - "format": "date-time" - }, - "initial_balance": { - "type": "string", - "description": "initial_balance defines the initial balance when redelegation started." - }, - "shares_dst": { - "type": "string", - "description": "shares_dst is the amount of destination-validator shares created by redelegation." - }, - "unbonding_id": { - "title": "Incrementing id that uniquely identifies this entry", - "type": "string", - "format": "uint64" - }, - "unbonding_on_hold_ref_count": { - "title": "Strictly positive if this entry's unbonding has been stopped by external modules", - "type": "string", - "format": "int64" - } - }, - "description": "RedelegationEntry defines a redelegation object with relevant metadata." + "total": { + "type": "integer", + "format": "int64" }, - "balance": { - "type": "string" + "hash": { + "type": "string", + "format": "byte" } }, - "description": "RedelegationEntryResponse is equivalent to a RedelegationEntry except that it\ncontains a balance in addition to shares which is more suitable for client\nresponses." + "title": "PartsetHeader" } - } + }, + "title": "BlockID" }, - "description": "RedelegationResponse is equivalent to a Redelegation except that its entries\ncontain a balance in addition to shares which is more suitable for client\nresponses." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "last_commit_hash": { + "type": "string", + "format": "byte", + "title": "hashes of block data" + }, + "data_hash": { "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", "format": "byte" }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", + "validators_hash": { "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QueryRedelegationsResponse is response type for the Query/Redelegations RPC\nmethod." - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } + "format": "byte", + "title": "hashes from the app output from the prev block" }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - } - } - } - } - } - } - } - }, - "/cosmos/staking/v1beta1/delegators/{delegator_addr}/unbonding_delegations": { - "get": { - "tags": [ - "Query" - ], - "summary": "DelegatorUnbondingDelegations queries all unbonding delegations of a given\ndelegator address.", - "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", - "operationId": "DelegatorUnbondingDelegations", - "parameters": [ - { - "name": "delegator_addr", - "in": "path", - "description": "delegator_addr defines the delegator address to query for.", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "pagination.key", - "in": "query", - "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } - }, - { - "name": "pagination.offset", - "in": "query", - "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.limit", - "in": "query", - "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.count_total", - "in": "query", - "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } - }, - { - "name": "pagination.reverse", - "in": "query", - "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } - } - ], - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "unbonding_responses": { - "type": "array", - "items": { - "type": "object", - "properties": { - "delegator_address": { - "type": "string", - "description": "delegator_address is the encoded address of the delegator." - }, - "validator_address": { - "type": "string", - "description": "validator_address is the encoded address of the validator." - }, - "entries": { - "type": "array", - "description": "entries are the unbonding delegation entries.", - "items": { - "type": "object", - "properties": { - "creation_height": { - "type": "string", - "description": "creation_height is the height which the unbonding took place.", - "format": "int64" - }, - "completion_time": { - "type": "string", - "description": "completion_time is the unix time for unbonding completion.", - "format": "date-time" - }, - "initial_balance": { - "type": "string", - "description": "initial_balance defines the tokens initially scheduled to receive at completion." - }, - "balance": { - "type": "string", - "description": "balance defines the tokens to receive at completion." - }, - "unbonding_id": { - "title": "Incrementing id that uniquely identifies this entry", - "type": "string", - "format": "uint64" - }, - "unbonding_on_hold_ref_count": { - "title": "Strictly positive if this entry's unbonding has been stopped by external modules", - "type": "string", - "format": "int64" - } - }, - "description": "UnbondingDelegationEntry defines an unbonding object with relevant metadata." - } - } + "next_validators_hash": { + "type": "string", + "format": "byte" }, - "description": "UnbondingDelegation stores all of a single delegator's unbonding bonds\nfor a single validator in an time-ordered list." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "consensus_hash": { "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", "format": "byte" }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", + "app_hash": { "type": "string", - "format": "uint64" + "format": "byte" + }, + "last_results_hash": { + "type": "string", + "format": "byte" + }, + "evidence_hash": { + "type": "string", + "format": "byte", + "title": "consensus info" + }, + "proposer_address": { + "type": "string", + "format": "byte" } }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QueryUnbondingDelegatorDelegationsResponse is response type for the\nQuery/UnbondingDelegatorDelegations RPC method." - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" + "description": "Header defines the structure of a block header." }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "data": { + "type": "object", + "properties": { + "txs": { + "type": "array", + "items": { "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - } - } - } - } - } - } - } - }, - "/cosmos/staking/v1beta1/delegators/{delegator_addr}/validators": { - "get": { - "tags": [ - "Query" - ], - "summary": "DelegatorValidators queries all validators info for given delegator\naddress.", - "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", - "operationId": "DelegatorValidators", - "parameters": [ - { - "name": "delegator_addr", - "in": "path", - "description": "delegator_addr defines the delegator address to query for.", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "pagination.key", - "in": "query", - "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } - }, - { - "name": "pagination.offset", - "in": "query", - "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.limit", - "in": "query", - "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.count_total", - "in": "query", - "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } - }, - { - "name": "pagination.reverse", - "in": "query", - "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } - } - ], - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "validators": { - "type": "array", - "description": "validators defines the validators' info of a delegator.", - "items": { - "type": "object", - "properties": { - "operator_address": { - "type": "string", - "description": "operator_address defines the address of the validator's operator; bech encoded in JSON." - }, - "consensus_pubkey": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "jailed": { - "type": "boolean", - "description": "jailed defined whether the validator has been jailed from bonded status or not." - }, - "status": { - "type": "string", - "description": "status is the validator status (bonded/unbonding/unbonded).", - "default": "BOND_STATUS_UNSPECIFIED", - "enum": [ - "BOND_STATUS_UNSPECIFIED", - "BOND_STATUS_UNBONDED", - "BOND_STATUS_UNBONDING", - "BOND_STATUS_BONDED" - ] - }, - "tokens": { - "type": "string", - "description": "tokens define the delegated tokens (incl. self-delegation)." - }, - "delegator_shares": { - "type": "string", - "description": "delegator_shares defines total shares issued to a validator's delegators." - }, - "description": { - "type": "object", - "properties": { - "moniker": { - "type": "string", - "description": "moniker defines a human-readable name for the validator." - }, - "identity": { - "type": "string", - "description": "identity defines an optional identity signature (ex. UPort or Keybase)." - }, - "website": { - "type": "string", - "description": "website defines an optional website link." - }, - "security_contact": { - "type": "string", - "description": "security_contact defines an optional email for security contact." - }, - "details": { - "type": "string", - "description": "details define other optional details." - } - }, - "description": "description defines the description terms for the validator." - }, - "unbonding_height": { - "type": "string", - "description": "unbonding_height defines, if unbonding, the height at which this validator has begun unbonding.", - "format": "int64" - }, - "unbonding_time": { - "type": "string", - "description": "unbonding_time defines, if unbonding, the min time for the validator to complete unbonding.", - "format": "date-time" }, - "commission": { + "description": "Txs that will be applied by state @ block.Height+1.\nNOTE: not all txs here are valid. We're just agreeing on the order first.\nThis means that block.AppHash does not include these txs." + } + }, + "title": "Data contains the set of transactions included in the block" + }, + "evidence": { + "type": "object", + "properties": { + "evidence": { + "type": "array", + "items": { "type": "object", "properties": { - "commission_rates": { + "duplicate_vote_evidence": { "type": "object", "properties": { - "rate": { + "vote_a": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "SIGNED_MSG_TYPE_UNKNOWN", + "SIGNED_MSG_TYPE_PREVOTE", + "SIGNED_MSG_TYPE_PRECOMMIT", + "SIGNED_MSG_TYPE_PROPOSAL" + ], + "default": "SIGNED_MSG_TYPE_UNKNOWN", + "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals" + }, + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "validator_index": { + "type": "integer", + "format": "int32" + }, + "signature": { + "type": "string", + "format": "byte", + "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." + }, + "extension": { + "type": "string", + "format": "byte", + "description": "Vote extension provided by the application. Only valid for precommit\nmessages." + }, + "extension_signature": { + "type": "string", + "format": "byte", + "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + } + }, + "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + }, + "vote_b": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "SIGNED_MSG_TYPE_UNKNOWN", + "SIGNED_MSG_TYPE_PREVOTE", + "SIGNED_MSG_TYPE_PRECOMMIT", + "SIGNED_MSG_TYPE_PROPOSAL" + ], + "default": "SIGNED_MSG_TYPE_UNKNOWN", + "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals" + }, + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "validator_index": { + "type": "integer", + "format": "int32" + }, + "signature": { + "type": "string", + "format": "byte", + "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." + }, + "extension": { + "type": "string", + "format": "byte", + "description": "Vote extension provided by the application. Only valid for precommit\nmessages." + }, + "extension_signature": { + "type": "string", + "format": "byte", + "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + } + }, + "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + }, + "total_voting_power": { "type": "string", - "description": "rate is the commission rate charged to delegators, as a fraction." + "format": "int64" }, - "max_rate": { + "validator_power": { "type": "string", - "description": "max_rate defines the maximum commission rate which validator can ever charge, as a fraction." + "format": "int64" }, - "max_change_rate": { + "timestamp": { "type": "string", - "description": "max_change_rate defines the maximum daily increase of the validator commission, as a fraction." + "format": "date-time" } }, - "description": "commission_rates defines the initial commission rates to be used for creating a validator." + "description": "DuplicateVoteEvidence contains evidence of a validator signed two conflicting votes." }, - "update_time": { - "type": "string", - "description": "update_time is the last time the commission rate was changed.", - "format": "date-time" - } - }, - "description": "commission defines the commission parameters." - }, - "min_self_delegation": { - "type": "string", - "description": "min_self_delegation is the validator's self declared minimum self delegation.\n\nSince: cosmos-sdk 0.46" - }, - "unbonding_on_hold_ref_count": { - "title": "strictly positive if this validator's unbonding has been stopped by external modules", - "type": "string", - "format": "int64" - }, - "unbonding_ids": { - "title": "list of unbonding ids, each uniquely identifing an unbonding of this validator", - "type": "array", - "items": { - "type": "string", - "format": "uint64" - } - } - }, - "description": "Validator defines a validator, together with the total amount of the\nValidator's bond shares and their exchange rate to coins. Slashing results in\na decrease in the exchange rate, allowing correct calculation of future\nundelegations without iterating over delegators. When coins are delegated to\nthis validator, the validator is credited with a delegation whose number of\nbond shares is based on the amount of coins delegated divided by the current\nexchange rate. Voting power can be calculated as total bonded shares\nmultiplied by exchange rate." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QueryDelegatorValidatorsResponse is response type for the\nQuery/DelegatorValidators RPC method." - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" + "light_client_attack_evidence": { + "type": "object", + "properties": { + "conflicting_block": { + "type": "object", + "properties": { + "signed_header": { + "type": "object", + "properties": { + "header": { + "type": "object", + "properties": { + "version": { + "title": "basic block info", + "type": "object", + "properties": { + "block": { + "type": "string", + "format": "uint64" + }, + "app": { + "type": "string", + "format": "uint64" + } + }, + "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." + }, + "chain_id": { + "type": "string" + }, + "height": { + "type": "string", + "format": "int64" + }, + "time": { + "type": "string", + "format": "date-time" + }, + "last_block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "last_commit_hash": { + "type": "string", + "format": "byte", + "title": "hashes of block data" + }, + "data_hash": { + "type": "string", + "format": "byte" + }, + "validators_hash": { + "type": "string", + "format": "byte", + "title": "hashes from the app output from the prev block" + }, + "next_validators_hash": { + "type": "string", + "format": "byte" + }, + "consensus_hash": { + "type": "string", + "format": "byte" + }, + "app_hash": { + "type": "string", + "format": "byte" + }, + "last_results_hash": { + "type": "string", + "format": "byte" + }, + "evidence_hash": { + "type": "string", + "format": "byte", + "title": "consensus info" + }, + "proposer_address": { + "type": "string", + "format": "byte" + } + }, + "description": "Header defines the structure of a block header." + }, + "commit": { + "type": "object", + "properties": { + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "signatures": { + "type": "array", + "items": { + "type": "object", + "properties": { + "block_id_flag": { + "type": "string", + "enum": [ + "BLOCK_ID_FLAG_UNKNOWN", + "BLOCK_ID_FLAG_ABSENT", + "BLOCK_ID_FLAG_COMMIT", + "BLOCK_ID_FLAG_NIL" + ], + "default": "BLOCK_ID_FLAG_UNKNOWN", + "title": "BlockIdFlag indicates which BlockID the signature is for" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "signature": { + "type": "string", + "format": "byte" + } + }, + "description": "CommitSig is a part of the Vote included in a Commit." + } + } + }, + "description": "Commit contains the evidence that a block was committed by a set of validators." + } + } + }, + "validator_set": { + "type": "object", + "properties": { + "validators": { + "type": "array", + "items": { + "type": "object", + "properties": { + "address": { + "type": "string", + "format": "byte" + }, + "pub_key": { + "type": "object", + "properties": { + "ed25519": { + "type": "string", + "format": "byte" + }, + "secp256k1": { + "type": "string", + "format": "byte" + } + }, + "title": "PublicKey defines the keys available for use with Validators" + }, + "voting_power": { + "type": "string", + "format": "int64" + }, + "proposer_priority": { + "type": "string", + "format": "int64" + } + } + } + }, + "proposer": { + "type": "object", + "properties": { + "address": { + "type": "string", + "format": "byte" + }, + "pub_key": { + "type": "object", + "properties": { + "ed25519": { + "type": "string", + "format": "byte" + }, + "secp256k1": { + "type": "string", + "format": "byte" + } + }, + "title": "PublicKey defines the keys available for use with Validators" + }, + "voting_power": { + "type": "string", + "format": "int64" + }, + "proposer_priority": { + "type": "string", + "format": "int64" + } + } + }, + "total_voting_power": { + "type": "string", + "format": "int64" + } + } + } + } + }, + "common_height": { + "type": "string", + "format": "int64" + }, + "byzantine_validators": { + "type": "array", + "items": { + "type": "object", + "properties": { + "address": { + "type": "string", + "format": "byte" + }, + "pub_key": { + "type": "object", + "properties": { + "ed25519": { + "type": "string", + "format": "byte" + }, + "secp256k1": { + "type": "string", + "format": "byte" + } + }, + "title": "PublicKey defines the keys available for use with Validators" + }, + "voting_power": { + "type": "string", + "format": "int64" + }, + "proposer_priority": { + "type": "string", + "format": "int64" + } + } + } + }, + "total_voting_power": { + "type": "string", + "format": "int64" + }, + "timestamp": { + "type": "string", + "format": "date-time" + } + }, + "description": "LightClientAttackEvidence contains evidence of a set of validators attempting to mislead a light client." + } + } + } + } + } }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + "last_commit": { + "type": "object", + "properties": { + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } + "title": "BlockID" }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } + "signatures": { + "type": "array", + "items": { + "type": "object", + "properties": { + "block_id_flag": { + "type": "string", + "enum": [ + "BLOCK_ID_FLAG_UNKNOWN", + "BLOCK_ID_FLAG_ABSENT", + "BLOCK_ID_FLAG_COMMIT", + "BLOCK_ID_FLAG_NIL" + ], + "default": "BLOCK_ID_FLAG_UNKNOWN", + "title": "BlockIdFlag indicates which BlockID the signature is for" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "signature": { + "type": "string", + "format": "byte" + } + }, + "description": "CommitSig is a part of the Vote included in a Commit." + } + } + }, + "description": "Commit contains the evidence that a block was committed by a set of validators." } } - } - } - } - } - } - } - }, - "/cosmos/staking/v1beta1/delegators/{delegator_addr}/validators/{validator_addr}": { - "get": { - "tags": [ - "Query" - ], - "summary": "DelegatorValidator queries validator info for given delegator validator\npair.", - "operationId": "DelegatorValidator", - "parameters": [ - { - "name": "delegator_addr", - "in": "path", - "description": "delegator_addr defines the delegator address to query for.", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "validator_addr", - "in": "path", - "description": "validator_addr defines the validator address to query for.", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { + }, + "sdk_block": { + "title": "Since: cosmos-sdk 0.47", "type": "object", "properties": { - "validator": { + "header": { "type": "object", "properties": { - "operator_address": { - "type": "string", - "description": "operator_address defines the address of the validator's operator; bech encoded in JSON." - }, - "consensus_pubkey": { + "version": { + "title": "basic block info", "type": "object", "properties": { - "type_url": { + "block": { "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + "format": "uint64" }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "app": { "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" + "format": "uint64" } }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "jailed": { - "type": "boolean", - "description": "jailed defined whether the validator has been jailed from bonded status or not." - }, - "status": { - "type": "string", - "description": "status is the validator status (bonded/unbonding/unbonded).", - "default": "BOND_STATUS_UNSPECIFIED", - "enum": [ - "BOND_STATUS_UNSPECIFIED", - "BOND_STATUS_UNBONDED", - "BOND_STATUS_UNBONDING", - "BOND_STATUS_BONDED" - ] - }, - "tokens": { - "type": "string", - "description": "tokens define the delegated tokens (incl. self-delegation)." + "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." }, - "delegator_shares": { - "type": "string", - "description": "delegator_shares defines total shares issued to a validator's delegators." - }, - "description": { - "type": "object", - "properties": { - "moniker": { - "type": "string", - "description": "moniker defines a human-readable name for the validator." - }, - "identity": { - "type": "string", - "description": "identity defines an optional identity signature (ex. UPort or Keybase)." - }, - "website": { - "type": "string", - "description": "website defines an optional website link." - }, - "security_contact": { - "type": "string", - "description": "security_contact defines an optional email for security contact." - }, - "details": { - "type": "string", - "description": "details define other optional details." - } - }, - "description": "description defines the description terms for the validator." + "chain_id": { + "type": "string" }, - "unbonding_height": { + "height": { "type": "string", - "description": "unbonding_height defines, if unbonding, the height at which this validator has begun unbonding.", "format": "int64" }, - "unbonding_time": { + "time": { "type": "string", - "description": "unbonding_time defines, if unbonding, the min time for the validator to complete unbonding.", "format": "date-time" }, - "commission": { + "last_block_id": { "type": "object", "properties": { - "commission_rates": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { "type": "object", "properties": { - "rate": { - "type": "string", - "description": "rate is the commission rate charged to delegators, as a fraction." - }, - "max_rate": { - "type": "string", - "description": "max_rate defines the maximum commission rate which validator can ever charge, as a fraction." + "total": { + "type": "integer", + "format": "int64" }, - "max_change_rate": { + "hash": { "type": "string", - "description": "max_change_rate defines the maximum daily increase of the validator commission, as a fraction." + "format": "byte" } }, - "description": "commission_rates defines the initial commission rates to be used for creating a validator." - }, - "update_time": { - "type": "string", - "description": "update_time is the last time the commission rate was changed.", - "format": "date-time" + "title": "PartsetHeader" } }, - "description": "commission defines the commission parameters." + "title": "BlockID" }, - "min_self_delegation": { + "last_commit_hash": { "type": "string", - "description": "min_self_delegation is the validator's self declared minimum self delegation.\n\nSince: cosmos-sdk 0.46" + "format": "byte", + "title": "hashes of block data" }, - "unbonding_on_hold_ref_count": { - "title": "strictly positive if this validator's unbonding has been stopped by external modules", + "data_hash": { "type": "string", - "format": "int64" + "format": "byte" + }, + "validators_hash": { + "type": "string", + "format": "byte", + "title": "hashes from the app output from the prev block" + }, + "next_validators_hash": { + "type": "string", + "format": "byte" + }, + "consensus_hash": { + "type": "string", + "format": "byte" + }, + "app_hash": { + "type": "string", + "format": "byte" + }, + "last_results_hash": { + "type": "string", + "format": "byte" + }, + "evidence_hash": { + "type": "string", + "format": "byte", + "title": "consensus info" }, - "unbonding_ids": { - "title": "list of unbonding ids, each uniquely identifing an unbonding of this validator", + "proposer_address": { + "type": "string", + "description": "proposer_address is the original block proposer address, formatted as a Bech32 string.\nIn Tendermint, this type is `bytes`, but in the SDK, we convert it to a Bech32 string\nfor better UX." + } + }, + "description": "Header defines the structure of a Tendermint block header." + }, + "data": { + "type": "object", + "properties": { + "txs": { "type": "array", "items": { "type": "string", - "format": "uint64" - } + "format": "byte" + }, + "description": "Txs that will be applied by state @ block.Height+1.\nNOTE: not all txs here are valid. We're just agreeing on the order first.\nThis means that block.AppHash does not include these txs." } }, - "description": "Validator defines a validator, together with the total amount of the\nValidator's bond shares and their exchange rate to coins. Slashing results in\na decrease in the exchange rate, allowing correct calculation of future\nundelegations without iterating over delegators. When coins are delegated to\nthis validator, the validator is credited with a delegation whose number of\nbond shares is based on the amount of coins delegated divided by the current\nexchange rate. Voting power can be calculated as total bonded shares\nmultiplied by exchange rate." - } - }, - "description": "QueryDelegatorValidatorResponse response type for the\nQuery/DelegatorValidator RPC method." - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" + "title": "Data contains the set of transactions included in the block" }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - } - } - } - } - } - } - } - }, - "/cosmos/staking/v1beta1/historical_info/{height}": { - "get": { - "tags": [ - "Query" - ], - "summary": "HistoricalInfo queries the historical info for given height.", - "operationId": "HistoricalInfo", - "parameters": [ - { - "name": "height", - "in": "path", - "description": "height defines at which height to query the historical info.", - "required": true, - "schema": { - "type": "string", - "format": "int64" - } - } - ], - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "hist": { + "evidence": { "type": "object", "properties": { - "header": { - "type": "object", - "properties": { - "version": { - "title": "basic block info", - "type": "object", - "properties": { - "block": { - "type": "string", - "format": "uint64" - }, - "app": { - "type": "string", - "format": "uint64" - } - }, - "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." - }, - "chain_id": { - "type": "string" - }, - "height": { - "type": "string", - "format": "int64" - }, - "time": { - "type": "string", - "format": "date-time" - }, - "last_block_id": { - "title": "prev block info", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "last_commit_hash": { - "title": "hashes of block data", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "data_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validators_hash": { - "title": "hashes from the app output from the prev block", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "next_validators_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "consensus_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "app_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "last_results_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "evidence_hash": { - "title": "consensus info", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proposer_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "Header defines the structure of a block header." - }, - "valset": { + "evidence": { "type": "array", "items": { "type": "object", "properties": { - "operator_address": { - "type": "string", - "description": "operator_address defines the address of the validator's operator; bech encoded in JSON." - }, - "consensus_pubkey": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "jailed": { - "type": "boolean", - "description": "jailed defined whether the validator has been jailed from bonded status or not." - }, - "status": { - "type": "string", - "description": "status is the validator status (bonded/unbonding/unbonded).", - "default": "BOND_STATUS_UNSPECIFIED", - "enum": [ - "BOND_STATUS_UNSPECIFIED", - "BOND_STATUS_UNBONDED", - "BOND_STATUS_UNBONDING", - "BOND_STATUS_BONDED" - ] - }, - "tokens": { - "type": "string", - "description": "tokens define the delegated tokens (incl. self-delegation)." - }, - "delegator_shares": { - "type": "string", - "description": "delegator_shares defines total shares issued to a validator's delegators." - }, - "description": { + "duplicate_vote_evidence": { "type": "object", "properties": { - "moniker": { - "type": "string", - "description": "moniker defines a human-readable name for the validator." - }, - "identity": { - "type": "string", - "description": "identity defines an optional identity signature (ex. UPort or Keybase)." - }, - "website": { - "type": "string", - "description": "website defines an optional website link." - }, - "security_contact": { - "type": "string", - "description": "security_contact defines an optional email for security contact." + "vote_a": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "SIGNED_MSG_TYPE_UNKNOWN", + "SIGNED_MSG_TYPE_PREVOTE", + "SIGNED_MSG_TYPE_PRECOMMIT", + "SIGNED_MSG_TYPE_PROPOSAL" + ], + "default": "SIGNED_MSG_TYPE_UNKNOWN", + "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals" + }, + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "validator_index": { + "type": "integer", + "format": "int32" + }, + "signature": { + "type": "string", + "format": "byte", + "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." + }, + "extension": { + "type": "string", + "format": "byte", + "description": "Vote extension provided by the application. Only valid for precommit\nmessages." + }, + "extension_signature": { + "type": "string", + "format": "byte", + "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + } + }, + "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." }, - "details": { - "type": "string", - "description": "details define other optional details." - } - }, - "description": "description defines the description terms for the validator." - }, - "unbonding_height": { - "type": "string", - "description": "unbonding_height defines, if unbonding, the height at which this validator has begun unbonding.", - "format": "int64" - }, - "unbonding_time": { - "type": "string", - "description": "unbonding_time defines, if unbonding, the min time for the validator to complete unbonding.", - "format": "date-time" - }, - "commission": { - "type": "object", - "properties": { - "commission_rates": { + "vote_b": { "type": "object", "properties": { - "rate": { + "type": { + "type": "string", + "enum": [ + "SIGNED_MSG_TYPE_UNKNOWN", + "SIGNED_MSG_TYPE_PREVOTE", + "SIGNED_MSG_TYPE_PRECOMMIT", + "SIGNED_MSG_TYPE_PROPOSAL" + ], + "default": "SIGNED_MSG_TYPE_UNKNOWN", + "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals" + }, + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "validator_address": { "type": "string", - "description": "rate is the commission rate charged to delegators, as a fraction." + "format": "byte" + }, + "validator_index": { + "type": "integer", + "format": "int32" + }, + "signature": { + "type": "string", + "format": "byte", + "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." }, - "max_rate": { + "extension": { "type": "string", - "description": "max_rate defines the maximum commission rate which validator can ever charge, as a fraction." + "format": "byte", + "description": "Vote extension provided by the application. Only valid for precommit\nmessages." }, - "max_change_rate": { + "extension_signature": { "type": "string", - "description": "max_change_rate defines the maximum daily increase of the validator commission, as a fraction." + "format": "byte", + "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." } }, - "description": "commission_rates defines the initial commission rates to be used for creating a validator." + "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + }, + "total_voting_power": { + "type": "string", + "format": "int64" }, - "update_time": { + "validator_power": { + "type": "string", + "format": "int64" + }, + "timestamp": { "type": "string", - "description": "update_time is the last time the commission rate was changed.", "format": "date-time" } }, - "description": "commission defines the commission parameters." - }, - "min_self_delegation": { - "type": "string", - "description": "min_self_delegation is the validator's self declared minimum self delegation.\n\nSince: cosmos-sdk 0.46" - }, - "unbonding_on_hold_ref_count": { - "title": "strictly positive if this validator's unbonding has been stopped by external modules", - "type": "string", - "format": "int64" + "description": "DuplicateVoteEvidence contains evidence of a validator signed two conflicting votes." }, - "unbonding_ids": { - "title": "list of unbonding ids, each uniquely identifing an unbonding of this validator", - "type": "array", - "items": { - "type": "string", - "format": "uint64" - } - } - }, - "description": "Validator defines a validator, together with the total amount of the\nValidator's bond shares and their exchange rate to coins. Slashing results in\na decrease in the exchange rate, allowing correct calculation of future\nundelegations without iterating over delegators. When coins are delegated to\nthis validator, the validator is credited with a delegation whose number of\nbond shares is based on the amount of coins delegated divided by the current\nexchange rate. Voting power can be calculated as total bonded shares\nmultiplied by exchange rate." - } - } - }, - "description": "hist defines the historical info at the given height." - } - }, - "description": "QueryHistoricalInfoResponse is response type for the Query/HistoricalInfo RPC\nmethod." - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - } - } - } - } - } - } - } - }, - "/cosmos/staking/v1beta1/params": { - "get": { - "tags": [ - "Query" - ], - "summary": "Parameters queries the staking parameters.", - "operationId": "StakingParams", - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "params": { - "type": "object", - "properties": { - "unbonding_time": { - "type": "string", - "description": "unbonding_time is the time duration of unbonding." - }, - "max_validators": { - "type": "integer", - "description": "max_validators is the maximum number of validators.", - "format": "int64" - }, - "max_entries": { - "type": "integer", - "description": "max_entries is the max entries for either unbonding delegation or redelegation (per pair/trio).", - "format": "int64" - }, - "historical_entries": { - "type": "integer", - "description": "historical_entries is the number of historical entries to persist.", - "format": "int64" - }, - "bond_denom": { - "type": "string", - "description": "bond_denom defines the bondable coin denomination." - }, - "min_commission_rate": { - "title": "min_commission_rate is the chain-wide minimum commission rate that a validator can charge their delegators", - "type": "string" - } - }, - "description": "params holds all the parameters of this module." - } - }, - "description": "QueryParamsResponse is response type for the Query/Params RPC method." - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" + "light_client_attack_evidence": { + "type": "object", + "properties": { + "conflicting_block": { + "type": "object", + "properties": { + "signed_header": { + "type": "object", + "properties": { + "header": { + "type": "object", + "properties": { + "version": { + "title": "basic block info", + "type": "object", + "properties": { + "block": { + "type": "string", + "format": "uint64" + }, + "app": { + "type": "string", + "format": "uint64" + } + }, + "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." + }, + "chain_id": { + "type": "string" + }, + "height": { + "type": "string", + "format": "int64" + }, + "time": { + "type": "string", + "format": "date-time" + }, + "last_block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "last_commit_hash": { + "type": "string", + "format": "byte", + "title": "hashes of block data" + }, + "data_hash": { + "type": "string", + "format": "byte" + }, + "validators_hash": { + "type": "string", + "format": "byte", + "title": "hashes from the app output from the prev block" + }, + "next_validators_hash": { + "type": "string", + "format": "byte" + }, + "consensus_hash": { + "type": "string", + "format": "byte" + }, + "app_hash": { + "type": "string", + "format": "byte" + }, + "last_results_hash": { + "type": "string", + "format": "byte" + }, + "evidence_hash": { + "type": "string", + "format": "byte", + "title": "consensus info" + }, + "proposer_address": { + "type": "string", + "format": "byte" + } + }, + "description": "Header defines the structure of a block header." + }, + "commit": { + "type": "object", + "properties": { + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "signatures": { + "type": "array", + "items": { + "type": "object", + "properties": { + "block_id_flag": { + "type": "string", + "enum": [ + "BLOCK_ID_FLAG_UNKNOWN", + "BLOCK_ID_FLAG_ABSENT", + "BLOCK_ID_FLAG_COMMIT", + "BLOCK_ID_FLAG_NIL" + ], + "default": "BLOCK_ID_FLAG_UNKNOWN", + "title": "BlockIdFlag indicates which BlockID the signature is for" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "signature": { + "type": "string", + "format": "byte" + } + }, + "description": "CommitSig is a part of the Vote included in a Commit." + } + } + }, + "description": "Commit contains the evidence that a block was committed by a set of validators." + } + } + }, + "validator_set": { + "type": "object", + "properties": { + "validators": { + "type": "array", + "items": { + "type": "object", + "properties": { + "address": { + "type": "string", + "format": "byte" + }, + "pub_key": { + "type": "object", + "properties": { + "ed25519": { + "type": "string", + "format": "byte" + }, + "secp256k1": { + "type": "string", + "format": "byte" + } + }, + "title": "PublicKey defines the keys available for use with Validators" + }, + "voting_power": { + "type": "string", + "format": "int64" + }, + "proposer_priority": { + "type": "string", + "format": "int64" + } + } + } + }, + "proposer": { + "type": "object", + "properties": { + "address": { + "type": "string", + "format": "byte" + }, + "pub_key": { + "type": "object", + "properties": { + "ed25519": { + "type": "string", + "format": "byte" + }, + "secp256k1": { + "type": "string", + "format": "byte" + } + }, + "title": "PublicKey defines the keys available for use with Validators" + }, + "voting_power": { + "type": "string", + "format": "int64" + }, + "proposer_priority": { + "type": "string", + "format": "int64" + } + } + }, + "total_voting_power": { + "type": "string", + "format": "int64" + } + } + } + } + }, + "common_height": { + "type": "string", + "format": "int64" + }, + "byzantine_validators": { + "type": "array", + "items": { + "type": "object", + "properties": { + "address": { + "type": "string", + "format": "byte" + }, + "pub_key": { + "type": "object", + "properties": { + "ed25519": { + "type": "string", + "format": "byte" + }, + "secp256k1": { + "type": "string", + "format": "byte" + } + }, + "title": "PublicKey defines the keys available for use with Validators" + }, + "voting_power": { + "type": "string", + "format": "int64" + }, + "proposer_priority": { + "type": "string", + "format": "int64" + } + } + } + }, + "total_voting_power": { + "type": "string", + "format": "int64" + }, + "timestamp": { + "type": "string", + "format": "date-time" + } + }, + "description": "LightClientAttackEvidence contains evidence of a set of validators attempting to mislead a light client." + } + } } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } } - } - } - } - } - } - } - } - } - }, - "/cosmos/staking/v1beta1/pool": { - "get": { - "tags": [ - "Query" - ], - "summary": "Pool queries the pool info.", - "operationId": "Pool", - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "pool": { + }, + "last_commit": { "type": "object", "properties": { - "not_bonded_tokens": { - "type": "string" + "height": { + "type": "string", + "format": "int64" }, - "bonded_tokens": { - "type": "string" - } - }, - "description": "pool defines the pool info." - } - }, - "description": "QueryPoolResponse is response type for the Query/Pool RPC method." - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } + "round": { + "type": "integer", + "format": "int32" }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - } - } - } - } - } - } - } - }, - "/cosmos/staking/v1beta1/validators": { - "get": { - "tags": [ - "Query" - ], - "summary": "Validators queries all validators that match the given status.", - "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", - "operationId": "Validators", - "parameters": [ - { - "name": "status", - "in": "query", - "description": "status enables to query for validators matching a given status.", - "schema": { - "type": "string" - } - }, - { - "name": "pagination.key", - "in": "query", - "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } - }, - { - "name": "pagination.offset", - "in": "query", - "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.limit", - "in": "query", - "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.count_total", - "in": "query", - "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } - }, - { - "name": "pagination.reverse", - "in": "query", - "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } - } - ], - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "title": "QueryValidatorsResponse is response type for the Query/Validators RPC method", - "type": "object", - "properties": { - "validators": { - "type": "array", - "description": "validators contains all the queried validators.", - "items": { - "type": "object", - "properties": { - "operator_address": { - "type": "string", - "description": "operator_address defines the address of the validator's operator; bech encoded in JSON." - }, - "consensus_pubkey": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "jailed": { - "type": "boolean", - "description": "jailed defined whether the validator has been jailed from bonded status or not." - }, - "status": { - "type": "string", - "description": "status is the validator status (bonded/unbonding/unbonded).", - "default": "BOND_STATUS_UNSPECIFIED", - "enum": [ - "BOND_STATUS_UNSPECIFIED", - "BOND_STATUS_UNBONDED", - "BOND_STATUS_UNBONDING", - "BOND_STATUS_BONDED" - ] - }, - "tokens": { - "type": "string", - "description": "tokens define the delegated tokens (incl. self-delegation)." - }, - "delegator_shares": { - "type": "string", - "description": "delegator_shares defines total shares issued to a validator's delegators." + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } }, - "description": { + "title": "BlockID" + }, + "signatures": { + "type": "array", + "items": { "type": "object", "properties": { - "moniker": { - "type": "string", - "description": "moniker defines a human-readable name for the validator." - }, - "identity": { - "type": "string", - "description": "identity defines an optional identity signature (ex. UPort or Keybase)." - }, - "website": { + "block_id_flag": { "type": "string", - "description": "website defines an optional website link." + "enum": [ + "BLOCK_ID_FLAG_UNKNOWN", + "BLOCK_ID_FLAG_ABSENT", + "BLOCK_ID_FLAG_COMMIT", + "BLOCK_ID_FLAG_NIL" + ], + "default": "BLOCK_ID_FLAG_UNKNOWN", + "title": "BlockIdFlag indicates which BlockID the signature is for" }, - "security_contact": { + "validator_address": { "type": "string", - "description": "security_contact defines an optional email for security contact." + "format": "byte" }, - "details": { + "timestamp": { "type": "string", - "description": "details define other optional details." - } - }, - "description": "description defines the description terms for the validator." - }, - "unbonding_height": { - "type": "string", - "description": "unbonding_height defines, if unbonding, the height at which this validator has begun unbonding.", - "format": "int64" - }, - "unbonding_time": { - "type": "string", - "description": "unbonding_time defines, if unbonding, the min time for the validator to complete unbonding.", - "format": "date-time" - }, - "commission": { - "type": "object", - "properties": { - "commission_rates": { - "type": "object", - "properties": { - "rate": { - "type": "string", - "description": "rate is the commission rate charged to delegators, as a fraction." - }, - "max_rate": { - "type": "string", - "description": "max_rate defines the maximum commission rate which validator can ever charge, as a fraction." - }, - "max_change_rate": { - "type": "string", - "description": "max_change_rate defines the maximum daily increase of the validator commission, as a fraction." - } - }, - "description": "commission_rates defines the initial commission rates to be used for creating a validator." + "format": "date-time" }, - "update_time": { + "signature": { "type": "string", - "description": "update_time is the last time the commission rate was changed.", - "format": "date-time" + "format": "byte" } }, - "description": "commission defines the commission parameters." - }, - "min_self_delegation": { - "type": "string", - "description": "min_self_delegation is the validator's self declared minimum self delegation.\n\nSince: cosmos-sdk 0.46" - }, - "unbonding_on_hold_ref_count": { - "title": "strictly positive if this validator's unbonding has been stopped by external modules", - "type": "string", - "format": "int64" - }, - "unbonding_ids": { - "title": "list of unbonding ids, each uniquely identifing an unbonding of this validator", - "type": "array", - "items": { - "type": "string", - "format": "uint64" - } + "description": "CommitSig is a part of the Vote included in a Commit." } - }, - "description": "Validator defines a validator, together with the total amount of the\nValidator's bond shares and their exchange rate to coins. Slashing results in\na decrease in the exchange rate, allowing correct calculation of future\nundelegations without iterating over delegators. When coins are delegated to\nthis validator, the validator is credited with a delegation whose number of\nbond shares is based on the amount of coins delegated divided by the current\nexchange rate. Voting power can be calculated as total bonded shares\nmultiplied by exchange rate." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" } }, - "description": "pagination defines the pagination in the response." + "description": "Commit contains the evidence that a block was committed by a set of validators." } - } + }, + "description": "Block is tendermint type Block, with the Header proposer address\nfield converted to bech32 string." } - } + }, + "description": "GetLatestBlockResponse is the response type for the Query/GetLatestBlock RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } + }, + "tags": [ + "Service" + ] } }, - "/cosmos/staking/v1beta1/validators/{validator_addr}": { + "/cosmos/base/tendermint/v1beta1/blocks/{height}": { "get": { - "tags": [ - "Query" - ], - "summary": "Validator queries validator info for given validator address.", - "operationId": "Validator", - "parameters": [ - { - "name": "validator_addr", - "in": "path", - "description": "validator_addr defines the validator address to query for.", - "required": true, - "schema": { - "type": "string" - } - } - ], + "summary": "GetBlockByHeight queries block for given height.", + "operationId": "GetBlockByHeight", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "title": "QueryValidatorResponse is response type for the Query/Validator RPC method", + "schema": { + "type": "object", + "properties": { + "block_id": { "type": "object", "properties": { - "validator": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { "type": "object", "properties": { - "operator_address": { - "type": "string", - "description": "operator_address defines the address of the validator's operator; bech encoded in JSON." - }, - "consensus_pubkey": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "jailed": { - "type": "boolean", - "description": "jailed defined whether the validator has been jailed from bonded status or not." - }, - "status": { - "type": "string", - "description": "status is the validator status (bonded/unbonding/unbonded).", - "default": "BOND_STATUS_UNSPECIFIED", - "enum": [ - "BOND_STATUS_UNSPECIFIED", - "BOND_STATUS_UNBONDED", - "BOND_STATUS_UNBONDING", - "BOND_STATUS_BONDED" - ] - }, - "tokens": { - "type": "string", - "description": "tokens define the delegated tokens (incl. self-delegation)." + "total": { + "type": "integer", + "format": "int64" }, - "delegator_shares": { + "hash": { "type": "string", - "description": "delegator_shares defines total shares issued to a validator's delegators." - }, - "description": { + "format": "byte" + } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "block": { + "title": "Deprecated: please use `sdk_block` instead", + "type": "object", + "properties": { + "header": { + "type": "object", + "properties": { + "version": { + "title": "basic block info", "type": "object", "properties": { - "moniker": { - "type": "string", - "description": "moniker defines a human-readable name for the validator." - }, - "identity": { - "type": "string", - "description": "identity defines an optional identity signature (ex. UPort or Keybase)." - }, - "website": { - "type": "string", - "description": "website defines an optional website link." - }, - "security_contact": { + "block": { "type": "string", - "description": "security_contact defines an optional email for security contact." + "format": "uint64" }, - "details": { + "app": { "type": "string", - "description": "details define other optional details." + "format": "uint64" } }, - "description": "description defines the description terms for the validator." + "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." + }, + "chain_id": { + "type": "string" }, - "unbonding_height": { + "height": { "type": "string", - "description": "unbonding_height defines, if unbonding, the height at which this validator has begun unbonding.", "format": "int64" }, - "unbonding_time": { + "time": { "type": "string", - "description": "unbonding_time defines, if unbonding, the min time for the validator to complete unbonding.", "format": "date-time" }, - "commission": { + "last_block_id": { "type": "object", "properties": { - "commission_rates": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { "type": "object", "properties": { - "rate": { - "type": "string", - "description": "rate is the commission rate charged to delegators, as a fraction." - }, - "max_rate": { - "type": "string", - "description": "max_rate defines the maximum commission rate which validator can ever charge, as a fraction." + "total": { + "type": "integer", + "format": "int64" }, - "max_change_rate": { + "hash": { "type": "string", - "description": "max_change_rate defines the maximum daily increase of the validator commission, as a fraction." + "format": "byte" } }, - "description": "commission_rates defines the initial commission rates to be used for creating a validator." - }, - "update_time": { - "type": "string", - "description": "update_time is the last time the commission rate was changed.", - "format": "date-time" + "title": "PartsetHeader" } }, - "description": "commission defines the commission parameters." + "title": "BlockID" }, - "min_self_delegation": { + "last_commit_hash": { "type": "string", - "description": "min_self_delegation is the validator's self declared minimum self delegation.\n\nSince: cosmos-sdk 0.46" + "format": "byte", + "title": "hashes of block data" }, - "unbonding_on_hold_ref_count": { - "title": "strictly positive if this validator's unbonding has been stopped by external modules", + "data_hash": { "type": "string", - "format": "int64" + "format": "byte" + }, + "validators_hash": { + "type": "string", + "format": "byte", + "title": "hashes from the app output from the prev block" + }, + "next_validators_hash": { + "type": "string", + "format": "byte" + }, + "consensus_hash": { + "type": "string", + "format": "byte" + }, + "app_hash": { + "type": "string", + "format": "byte" + }, + "last_results_hash": { + "type": "string", + "format": "byte" + }, + "evidence_hash": { + "type": "string", + "format": "byte", + "title": "consensus info" }, - "unbonding_ids": { - "title": "list of unbonding ids, each uniquely identifing an unbonding of this validator", + "proposer_address": { + "type": "string", + "format": "byte" + } + }, + "description": "Header defines the structure of a block header." + }, + "data": { + "type": "object", + "properties": { + "txs": { "type": "array", "items": { "type": "string", - "format": "uint64" - } + "format": "byte" + }, + "description": "Txs that will be applied by state @ block.Height+1.\nNOTE: not all txs here are valid. We're just agreeing on the order first.\nThis means that block.AppHash does not include these txs." } }, - "description": "Validator defines a validator, together with the total amount of the\nValidator's bond shares and their exchange rate to coins. Slashing results in\na decrease in the exchange rate, allowing correct calculation of future\nundelegations without iterating over delegators. When coins are delegated to\nthis validator, the validator is credited with a delegation whose number of\nbond shares is based on the amount of coins delegated divided by the current\nexchange rate. Voting power can be calculated as total bonded shares\nmultiplied by exchange rate." - } - } - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" + "title": "Data contains the set of transactions included in the block" }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - } - } - } - } - } - } - } - }, - "/cosmos/staking/v1beta1/validators/{validator_addr}/delegations": { - "get": { - "tags": [ - "Query" - ], - "summary": "ValidatorDelegations queries delegate info for given validator.", - "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", - "operationId": "ValidatorDelegations", - "parameters": [ - { - "name": "validator_addr", - "in": "path", - "description": "validator_addr defines the validator address to query for.", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "pagination.key", - "in": "query", - "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } - }, - { - "name": "pagination.offset", - "in": "query", - "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.limit", - "in": "query", - "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.count_total", - "in": "query", - "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } - }, - { - "name": "pagination.reverse", - "in": "query", - "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } - } - ], - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "title": "QueryValidatorDelegationsResponse is response type for the\nQuery/ValidatorDelegations RPC method", - "type": "object", - "properties": { - "delegation_responses": { - "type": "array", - "items": { - "type": "object", - "properties": { - "delegation": { - "type": "object", - "properties": { - "delegator_address": { - "type": "string", - "description": "delegator_address is the encoded address of the delegator." - }, - "validator_address": { - "type": "string", - "description": "validator_address is the encoded address of the validator." - }, - "shares": { - "type": "string", - "description": "shares define the delegation shares received." - } - }, - "description": "Delegation represents the bond with tokens held by an account. It is\nowned by one delegator, and is associated with the voting power of one\nvalidator." - }, - "balance": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "description": "DelegationResponse is equivalent to Delegation except that it contains a\nbalance in addition to shares which is more suitable for client responses." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } - } - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - } - } - } - } - } - } - } - }, - "/cosmos/staking/v1beta1/validators/{validator_addr}/delegations/{delegator_addr}": { - "get": { - "tags": [ - "Query" - ], - "summary": "Delegation queries delegate info for given validator delegator pair.", - "operationId": "Delegation", - "parameters": [ - { - "name": "validator_addr", - "in": "path", - "description": "validator_addr defines the validator address to query for.", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "delegator_addr", - "in": "path", - "description": "delegator_addr defines the delegator address to query for.", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "delegation_response": { - "type": "object", - "properties": { - "delegation": { - "type": "object", - "properties": { - "delegator_address": { - "type": "string", - "description": "delegator_address is the encoded address of the delegator." - }, - "validator_address": { - "type": "string", - "description": "validator_address is the encoded address of the validator." - }, - "shares": { - "type": "string", - "description": "shares define the delegation shares received." - } - }, - "description": "Delegation represents the bond with tokens held by an account. It is\nowned by one delegator, and is associated with the voting power of one\nvalidator." - }, - "balance": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "description": "DelegationResponse is equivalent to Delegation except that it contains a\nbalance in addition to shares which is more suitable for client responses." - } - }, - "description": "QueryDelegationResponse is response type for the Query/Delegation RPC method." - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - } - } - } - } - } - } - } - }, - "/cosmos/staking/v1beta1/validators/{validator_addr}/delegations/{delegator_addr}/unbonding_delegation": { - "get": { - "tags": [ - "Query" - ], - "summary": "UnbondingDelegation queries unbonding info for given validator delegator\npair.", - "operationId": "UnbondingDelegation", - "parameters": [ - { - "name": "validator_addr", - "in": "path", - "description": "validator_addr defines the validator address to query for.", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "delegator_addr", - "in": "path", - "description": "delegator_addr defines the delegator address to query for.", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "unbond": { + "evidence": { "type": "object", "properties": { - "delegator_address": { - "type": "string", - "description": "delegator_address is the encoded address of the delegator." - }, - "validator_address": { - "type": "string", - "description": "validator_address is the encoded address of the validator." - }, - "entries": { + "evidence": { "type": "array", - "description": "entries are the unbonding delegation entries.", "items": { "type": "object", "properties": { - "creation_height": { - "type": "string", - "description": "creation_height is the height which the unbonding took place.", - "format": "int64" - }, - "completion_time": { - "type": "string", - "description": "completion_time is the unix time for unbonding completion.", - "format": "date-time" - }, - "initial_balance": { - "type": "string", - "description": "initial_balance defines the tokens initially scheduled to receive at completion." - }, - "balance": { - "type": "string", - "description": "balance defines the tokens to receive at completion." - }, - "unbonding_id": { - "title": "Incrementing id that uniquely identifies this entry", - "type": "string", - "format": "uint64" - }, - "unbonding_on_hold_ref_count": { - "title": "Strictly positive if this entry's unbonding has been stopped by external modules", - "type": "string", - "format": "int64" - } - }, - "description": "UnbondingDelegationEntry defines an unbonding object with relevant metadata." - } - } - }, - "description": "UnbondingDelegation stores all of a single delegator's unbonding bonds\nfor a single validator in an time-ordered list." - } - }, - "description": "QueryDelegationResponse is response type for the Query/UnbondingDelegation\nRPC method." - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - } - } - } - } - } - } - } - }, - "/cosmos/staking/v1beta1/validators/{validator_addr}/unbonding_delegations": { - "get": { - "tags": [ - "Query" - ], - "summary": "ValidatorUnbondingDelegations queries unbonding delegations of a validator.", - "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", - "operationId": "ValidatorUnbondingDelegations", - "parameters": [ - { - "name": "validator_addr", - "in": "path", - "description": "validator_addr defines the validator address to query for.", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "pagination.key", - "in": "query", - "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } - }, - { - "name": "pagination.offset", - "in": "query", - "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.limit", - "in": "query", - "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.count_total", - "in": "query", - "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } - }, - { - "name": "pagination.reverse", - "in": "query", - "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } - } - ], - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "unbonding_responses": { - "type": "array", - "items": { - "type": "object", - "properties": { - "delegator_address": { - "type": "string", - "description": "delegator_address is the encoded address of the delegator." - }, - "validator_address": { - "type": "string", - "description": "validator_address is the encoded address of the validator." - }, - "entries": { - "type": "array", - "description": "entries are the unbonding delegation entries.", - "items": { - "type": "object", - "properties": { - "creation_height": { - "type": "string", - "description": "creation_height is the height which the unbonding took place.", - "format": "int64" - }, - "completion_time": { - "type": "string", - "description": "completion_time is the unix time for unbonding completion.", - "format": "date-time" - }, - "initial_balance": { - "type": "string", - "description": "initial_balance defines the tokens initially scheduled to receive at completion." - }, - "balance": { - "type": "string", - "description": "balance defines the tokens to receive at completion." + "duplicate_vote_evidence": { + "type": "object", + "properties": { + "vote_a": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "SIGNED_MSG_TYPE_UNKNOWN", + "SIGNED_MSG_TYPE_PREVOTE", + "SIGNED_MSG_TYPE_PRECOMMIT", + "SIGNED_MSG_TYPE_PROPOSAL" + ], + "default": "SIGNED_MSG_TYPE_UNKNOWN", + "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals" + }, + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "validator_index": { + "type": "integer", + "format": "int32" + }, + "signature": { + "type": "string", + "format": "byte", + "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." + }, + "extension": { + "type": "string", + "format": "byte", + "description": "Vote extension provided by the application. Only valid for precommit\nmessages." + }, + "extension_signature": { + "type": "string", + "format": "byte", + "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + } + }, + "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + }, + "vote_b": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "SIGNED_MSG_TYPE_UNKNOWN", + "SIGNED_MSG_TYPE_PREVOTE", + "SIGNED_MSG_TYPE_PRECOMMIT", + "SIGNED_MSG_TYPE_PROPOSAL" + ], + "default": "SIGNED_MSG_TYPE_UNKNOWN", + "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals" + }, + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "validator_index": { + "type": "integer", + "format": "int32" + }, + "signature": { + "type": "string", + "format": "byte", + "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." + }, + "extension": { + "type": "string", + "format": "byte", + "description": "Vote extension provided by the application. Only valid for precommit\nmessages." + }, + "extension_signature": { + "type": "string", + "format": "byte", + "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + } + }, + "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + }, + "total_voting_power": { + "type": "string", + "format": "int64" + }, + "validator_power": { + "type": "string", + "format": "int64" + }, + "timestamp": { + "type": "string", + "format": "date-time" + } }, - "unbonding_id": { - "title": "Incrementing id that uniquely identifies this entry", - "type": "string", - "format": "uint64" - }, - "unbonding_on_hold_ref_count": { - "title": "Strictly positive if this entry's unbonding has been stopped by external modules", - "type": "string", - "format": "int64" - } + "description": "DuplicateVoteEvidence contains evidence of a validator signed two conflicting votes." }, - "description": "UnbondingDelegationEntry defines an unbonding object with relevant metadata." + "light_client_attack_evidence": { + "type": "object", + "properties": { + "conflicting_block": { + "type": "object", + "properties": { + "signed_header": { + "type": "object", + "properties": { + "header": { + "type": "object", + "properties": { + "version": { + "title": "basic block info", + "type": "object", + "properties": { + "block": { + "type": "string", + "format": "uint64" + }, + "app": { + "type": "string", + "format": "uint64" + } + }, + "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." + }, + "chain_id": { + "type": "string" + }, + "height": { + "type": "string", + "format": "int64" + }, + "time": { + "type": "string", + "format": "date-time" + }, + "last_block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "last_commit_hash": { + "type": "string", + "format": "byte", + "title": "hashes of block data" + }, + "data_hash": { + "type": "string", + "format": "byte" + }, + "validators_hash": { + "type": "string", + "format": "byte", + "title": "hashes from the app output from the prev block" + }, + "next_validators_hash": { + "type": "string", + "format": "byte" + }, + "consensus_hash": { + "type": "string", + "format": "byte" + }, + "app_hash": { + "type": "string", + "format": "byte" + }, + "last_results_hash": { + "type": "string", + "format": "byte" + }, + "evidence_hash": { + "type": "string", + "format": "byte", + "title": "consensus info" + }, + "proposer_address": { + "type": "string", + "format": "byte" + } + }, + "description": "Header defines the structure of a block header." + }, + "commit": { + "type": "object", + "properties": { + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "signatures": { + "type": "array", + "items": { + "type": "object", + "properties": { + "block_id_flag": { + "type": "string", + "enum": [ + "BLOCK_ID_FLAG_UNKNOWN", + "BLOCK_ID_FLAG_ABSENT", + "BLOCK_ID_FLAG_COMMIT", + "BLOCK_ID_FLAG_NIL" + ], + "default": "BLOCK_ID_FLAG_UNKNOWN", + "title": "BlockIdFlag indicates which BlockID the signature is for" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "signature": { + "type": "string", + "format": "byte" + } + }, + "description": "CommitSig is a part of the Vote included in a Commit." + } + } + }, + "description": "Commit contains the evidence that a block was committed by a set of validators." + } + } + }, + "validator_set": { + "type": "object", + "properties": { + "validators": { + "type": "array", + "items": { + "type": "object", + "properties": { + "address": { + "type": "string", + "format": "byte" + }, + "pub_key": { + "type": "object", + "properties": { + "ed25519": { + "type": "string", + "format": "byte" + }, + "secp256k1": { + "type": "string", + "format": "byte" + } + }, + "title": "PublicKey defines the keys available for use with Validators" + }, + "voting_power": { + "type": "string", + "format": "int64" + }, + "proposer_priority": { + "type": "string", + "format": "int64" + } + } + } + }, + "proposer": { + "type": "object", + "properties": { + "address": { + "type": "string", + "format": "byte" + }, + "pub_key": { + "type": "object", + "properties": { + "ed25519": { + "type": "string", + "format": "byte" + }, + "secp256k1": { + "type": "string", + "format": "byte" + } + }, + "title": "PublicKey defines the keys available for use with Validators" + }, + "voting_power": { + "type": "string", + "format": "int64" + }, + "proposer_priority": { + "type": "string", + "format": "int64" + } + } + }, + "total_voting_power": { + "type": "string", + "format": "int64" + } + } + } + } + }, + "common_height": { + "type": "string", + "format": "int64" + }, + "byzantine_validators": { + "type": "array", + "items": { + "type": "object", + "properties": { + "address": { + "type": "string", + "format": "byte" + }, + "pub_key": { + "type": "object", + "properties": { + "ed25519": { + "type": "string", + "format": "byte" + }, + "secp256k1": { + "type": "string", + "format": "byte" + } + }, + "title": "PublicKey defines the keys available for use with Validators" + }, + "voting_power": { + "type": "string", + "format": "int64" + }, + "proposer_priority": { + "type": "string", + "format": "int64" + } + } + } + }, + "total_voting_power": { + "type": "string", + "format": "int64" + }, + "timestamp": { + "type": "string", + "format": "date-time" + } + }, + "description": "LightClientAttackEvidence contains evidence of a set of validators attempting to mislead a light client." + } } } - }, - "description": "UnbondingDelegation stores all of a single delegator's unbonding bonds\nfor a single validator in an time-ordered list." + } } }, - "pagination": { + "last_commit": { "type": "object", "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", + "height": { "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QueryValidatorUnbondingDelegationsResponse is response type for the\nQuery/ValidatorUnbondingDelegations RPC method." - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } + "format": "int64" }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - } - } - } - } - } - } - } - }, - "/cosmos/tx/v1beta1/decode": { - "post": { - "tags": [ - "Service" - ], - "summary": "TxDecode decodes the transaction.", - "description": "Since: cosmos-sdk 0.47", - "operationId": "TxDecode", - "requestBody": { - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "tx_bytes": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "tx_bytes is the raw transaction.", - "format": "byte" - } - }, - "description": "TxDecodeRequest is the request type for the Service.TxDecode\nRPC method.\n\nSince: cosmos-sdk 0.47" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/cosmos.tx.v1beta1.TxDecodeResponse" - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } + "title": "BlockID" }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } + "signatures": { + "type": "array", + "items": { + "type": "object", + "properties": { + "block_id_flag": { + "type": "string", + "enum": [ + "BLOCK_ID_FLAG_UNKNOWN", + "BLOCK_ID_FLAG_ABSENT", + "BLOCK_ID_FLAG_COMMIT", + "BLOCK_ID_FLAG_NIL" + ], + "default": "BLOCK_ID_FLAG_UNKNOWN", + "title": "BlockIdFlag indicates which BlockID the signature is for" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "signature": { + "type": "string", + "format": "byte" + } + }, + "description": "CommitSig is a part of the Vote included in a Commit." + } + } + }, + "description": "Commit contains the evidence that a block was committed by a set of validators." } } - } - } - } - } - }, - "x-codegen-request-body-name": "body" - } - }, - "/cosmos/tx/v1beta1/decode/amino": { - "post": { - "tags": [ - "Service" - ], - "summary": "TxDecodeAmino decodes an Amino transaction from encoded bytes to JSON.", - "description": "Since: cosmos-sdk 0.47", - "operationId": "TxDecodeAmino", - "requestBody": { - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "amino_binary": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } }, - "description": "TxDecodeAminoRequest is the request type for the Service.TxDecodeAmino\nRPC method.\n\nSince: cosmos-sdk 0.47" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "amino_json": { - "type": "string" - } - }, - "description": "TxDecodeAminoResponse is the response type for the Service.TxDecodeAmino\nRPC method.\n\nSince: cosmos-sdk 0.47" - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { + "sdk_block": { + "title": "Since: cosmos-sdk 0.47", "type": "object", "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + "header": { + "type": "object", + "properties": { + "version": { + "title": "basic block info", + "type": "object", + "properties": { + "block": { + "type": "string", + "format": "uint64" + }, + "app": { + "type": "string", + "format": "uint64" + } }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } + "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - } - } - } - } - } - }, - "x-codegen-request-body-name": "body" - } - }, - "/cosmos/tx/v1beta1/encode": { - "post": { - "tags": [ - "Service" - ], - "summary": "TxEncode encodes the transaction.", - "description": "Since: cosmos-sdk 0.47", - "operationId": "TxEncode", - "requestBody": { - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/cosmos.tx.v1beta1.TxEncodeRequest" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "tx_bytes": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "tx_bytes is the encoded transaction bytes.", - "format": "byte" - } - }, - "description": "TxEncodeResponse is the response type for the\nService.TxEncode method.\n\nSince: cosmos-sdk 0.47" - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } + "chain_id": { + "type": "string" }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - } - } - } - } - } - }, - "x-codegen-request-body-name": "body" - } - }, - "/cosmos/tx/v1beta1/encode/amino": { - "post": { - "tags": [ - "Service" - ], - "summary": "TxEncodeAmino encodes an Amino transaction from JSON to encoded bytes.", - "description": "Since: cosmos-sdk 0.47", - "operationId": "TxEncodeAmino", - "requestBody": { - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "amino_json": { - "type": "string" - } - }, - "description": "TxEncodeAminoRequest is the request type for the Service.TxEncodeAmino\nRPC method.\n\nSince: cosmos-sdk 0.47" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "amino_binary": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "TxEncodeAminoResponse is the response type for the Service.TxEncodeAmino\nRPC method.\n\nSince: cosmos-sdk 0.47" - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + "height": { + "type": "string", + "format": "int64" + }, + "time": { + "type": "string", + "format": "date-time" + }, + "last_block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } + "title": "BlockID" }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - } - } - } - } - } - }, - "x-codegen-request-body-name": "body" - } - }, - "/cosmos/tx/v1beta1/simulate": { - "post": { - "tags": [ - "Service" - ], - "summary": "Simulate simulates executing a transaction for estimating gas usage.", - "operationId": "Simulate", - "requestBody": { - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/cosmos.tx.v1beta1.SimulateRequest" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "gas_info": { - "type": "object", - "properties": { - "gas_wanted": { + "last_commit_hash": { "type": "string", - "description": "GasWanted is the maximum units of work we allow this tx to perform.", - "format": "uint64" + "format": "byte", + "title": "hashes of block data" }, - "gas_used": { + "data_hash": { "type": "string", - "description": "GasUsed is the amount of gas actually consumed.", - "format": "uint64" - } - }, - "description": "gas_info is the information about gas used in the simulation." - }, - "result": { - "type": "object", - "properties": { - "data": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "format": "byte" + }, + "validators_hash": { + "type": "string", + "format": "byte", + "title": "hashes from the app output from the prev block" + }, + "next_validators_hash": { + "type": "string", + "format": "byte" + }, + "consensus_hash": { + "type": "string", + "format": "byte" + }, + "app_hash": { + "type": "string", + "format": "byte" + }, + "last_results_hash": { "type": "string", - "description": "Data is any data returned from message or handler execution. It MUST be\nlength prefixed in order to separate data from multiple message executions.\nDeprecated. This field is still populated, but prefer msg_response instead\nbecause it also contains the Msg response typeURL.", "format": "byte" }, - "log": { + "evidence_hash": { "type": "string", - "description": "Log contains the log information from message or handler execution." + "format": "byte", + "title": "consensus info" }, - "events": { + "proposer_address": { + "type": "string", + "description": "proposer_address is the original block proposer address, formatted as a Bech32 string.\nIn Tendermint, this type is `bytes`, but in the SDK, we convert it to a Bech32 string\nfor better UX." + } + }, + "description": "Header defines the structure of a Tendermint block header." + }, + "data": { + "type": "object", + "properties": { + "txs": { + "type": "array", + "items": { + "type": "string", + "format": "byte" + }, + "description": "Txs that will be applied by state @ block.Height+1.\nNOTE: not all txs here are valid. We're just agreeing on the order first.\nThis means that block.AppHash does not include these txs." + } + }, + "title": "Data contains the set of transactions included in the block" + }, + "evidence": { + "type": "object", + "properties": { + "evidence": { "type": "array", - "description": "Events contains a slice of Event objects that were emitted during message\nor handler execution.", "items": { "type": "object", "properties": { - "type": { - "type": "string" - }, - "attributes": { - "type": "array", - "items": { - "type": "object", - "properties": { - "key": { - "type": "string" + "duplicate_vote_evidence": { + "type": "object", + "properties": { + "vote_a": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "SIGNED_MSG_TYPE_UNKNOWN", + "SIGNED_MSG_TYPE_PREVOTE", + "SIGNED_MSG_TYPE_PRECOMMIT", + "SIGNED_MSG_TYPE_PROPOSAL" + ], + "default": "SIGNED_MSG_TYPE_UNKNOWN", + "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals" + }, + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "validator_index": { + "type": "integer", + "format": "int32" + }, + "signature": { + "type": "string", + "format": "byte", + "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." + }, + "extension": { + "type": "string", + "format": "byte", + "description": "Vote extension provided by the application. Only valid for precommit\nmessages." + }, + "extension_signature": { + "type": "string", + "format": "byte", + "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + } }, - "value": { - "type": "string" + "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + }, + "vote_b": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "SIGNED_MSG_TYPE_UNKNOWN", + "SIGNED_MSG_TYPE_PREVOTE", + "SIGNED_MSG_TYPE_PRECOMMIT", + "SIGNED_MSG_TYPE_PROPOSAL" + ], + "default": "SIGNED_MSG_TYPE_UNKNOWN", + "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals" + }, + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "validator_index": { + "type": "integer", + "format": "int32" + }, + "signature": { + "type": "string", + "format": "byte", + "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." + }, + "extension": { + "type": "string", + "format": "byte", + "description": "Vote extension provided by the application. Only valid for precommit\nmessages." + }, + "extension_signature": { + "type": "string", + "format": "byte", + "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + } }, - "index": { - "type": "boolean" - } + "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." }, - "description": "EventAttribute is a single key-value pair, associated with an event." - } - } - }, - "description": "Event allows application developers to attach additional information to\nResponseFinalizeBlock and ResponseCheckTx.\nLater, transactions may be queried using these events." - } - }, - "msg_responses": { - "type": "array", - "description": "msg_responses contains the Msg handler responses type packed in Anys.\n\nSince: cosmos-sdk 0.46", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + "total_voting_power": { + "type": "string", + "format": "int64" + }, + "validator_power": { + "type": "string", + "format": "int64" + }, + "timestamp": { + "type": "string", + "format": "date-time" + } + }, + "description": "DuplicateVoteEvidence contains evidence of a validator signed two conflicting votes." }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" + "light_client_attack_evidence": { + "type": "object", + "properties": { + "conflicting_block": { + "type": "object", + "properties": { + "signed_header": { + "type": "object", + "properties": { + "header": { + "type": "object", + "properties": { + "version": { + "title": "basic block info", + "type": "object", + "properties": { + "block": { + "type": "string", + "format": "uint64" + }, + "app": { + "type": "string", + "format": "uint64" + } + }, + "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." + }, + "chain_id": { + "type": "string" + }, + "height": { + "type": "string", + "format": "int64" + }, + "time": { + "type": "string", + "format": "date-time" + }, + "last_block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "last_commit_hash": { + "type": "string", + "format": "byte", + "title": "hashes of block data" + }, + "data_hash": { + "type": "string", + "format": "byte" + }, + "validators_hash": { + "type": "string", + "format": "byte", + "title": "hashes from the app output from the prev block" + }, + "next_validators_hash": { + "type": "string", + "format": "byte" + }, + "consensus_hash": { + "type": "string", + "format": "byte" + }, + "app_hash": { + "type": "string", + "format": "byte" + }, + "last_results_hash": { + "type": "string", + "format": "byte" + }, + "evidence_hash": { + "type": "string", + "format": "byte", + "title": "consensus info" + }, + "proposer_address": { + "type": "string", + "format": "byte" + } + }, + "description": "Header defines the structure of a block header." + }, + "commit": { + "type": "object", + "properties": { + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "signatures": { + "type": "array", + "items": { + "type": "object", + "properties": { + "block_id_flag": { + "type": "string", + "enum": [ + "BLOCK_ID_FLAG_UNKNOWN", + "BLOCK_ID_FLAG_ABSENT", + "BLOCK_ID_FLAG_COMMIT", + "BLOCK_ID_FLAG_NIL" + ], + "default": "BLOCK_ID_FLAG_UNKNOWN", + "title": "BlockIdFlag indicates which BlockID the signature is for" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "signature": { + "type": "string", + "format": "byte" + } + }, + "description": "CommitSig is a part of the Vote included in a Commit." + } + } + }, + "description": "Commit contains the evidence that a block was committed by a set of validators." + } + } + }, + "validator_set": { + "type": "object", + "properties": { + "validators": { + "type": "array", + "items": { + "type": "object", + "properties": { + "address": { + "type": "string", + "format": "byte" + }, + "pub_key": { + "type": "object", + "properties": { + "ed25519": { + "type": "string", + "format": "byte" + }, + "secp256k1": { + "type": "string", + "format": "byte" + } + }, + "title": "PublicKey defines the keys available for use with Validators" + }, + "voting_power": { + "type": "string", + "format": "int64" + }, + "proposer_priority": { + "type": "string", + "format": "int64" + } + } + } + }, + "proposer": { + "type": "object", + "properties": { + "address": { + "type": "string", + "format": "byte" + }, + "pub_key": { + "type": "object", + "properties": { + "ed25519": { + "type": "string", + "format": "byte" + }, + "secp256k1": { + "type": "string", + "format": "byte" + } + }, + "title": "PublicKey defines the keys available for use with Validators" + }, + "voting_power": { + "type": "string", + "format": "int64" + }, + "proposer_priority": { + "type": "string", + "format": "int64" + } + } + }, + "total_voting_power": { + "type": "string", + "format": "int64" + } + } + } + } + }, + "common_height": { + "type": "string", + "format": "int64" + }, + "byzantine_validators": { + "type": "array", + "items": { + "type": "object", + "properties": { + "address": { + "type": "string", + "format": "byte" + }, + "pub_key": { + "type": "object", + "properties": { + "ed25519": { + "type": "string", + "format": "byte" + }, + "secp256k1": { + "type": "string", + "format": "byte" + } + }, + "title": "PublicKey defines the keys available for use with Validators" + }, + "voting_power": { + "type": "string", + "format": "int64" + }, + "proposer_priority": { + "type": "string", + "format": "int64" + } + } + } + }, + "total_voting_power": { + "type": "string", + "format": "int64" + }, + "timestamp": { + "type": "string", + "format": "date-time" + } + }, + "description": "LightClientAttackEvidence contains evidence of a set of validators attempting to mislead a light client." } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } } } - }, - "description": "result is the result of the simulation." - } - }, - "description": "SimulateResponse is the response type for the\nService.SimulateRPC method." - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" + } }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } + "last_commit": { + "type": "object", + "properties": { + "height": { + "type": "string", + "format": "int64" }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "signatures": { + "type": "array", + "items": { + "type": "object", + "properties": { + "block_id_flag": { + "type": "string", + "enum": [ + "BLOCK_ID_FLAG_UNKNOWN", + "BLOCK_ID_FLAG_ABSENT", + "BLOCK_ID_FLAG_COMMIT", + "BLOCK_ID_FLAG_NIL" + ], + "default": "BLOCK_ID_FLAG_UNKNOWN", + "title": "BlockIdFlag indicates which BlockID the signature is for" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "signature": { + "type": "string", + "format": "byte" + } + }, + "description": "CommitSig is a part of the Vote included in a Commit." + } + } + }, + "description": "Commit contains the evidence that a block was committed by a set of validators." } + }, + "description": "Block is tendermint type Block, with the Header proposer address\nfield converted to bech32 string." + } + }, + "description": "GetBlockByHeightResponse is the response type for the Query/GetBlockByHeight RPC method." + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } }, - "x-codegen-request-body-name": "body" - } - }, - "/cosmos/tx/v1beta1/txs": { - "get": { - "tags": [ - "Service" - ], - "summary": "GetTxsEvent fetches txs by event.", - "operationId": "GetTxsEvent", "parameters": [ { - "name": "events", - "in": "query", - "description": "events is the list of transaction event type.\nDeprecated post v0.47.x: use query instead, which should contain a valid\nevents query.", - "style": "form", - "explode": true, - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - }, - { - "name": "pagination.key", - "in": "query", - "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } - }, - { - "name": "pagination.offset", - "in": "query", - "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.limit", - "in": "query", - "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.count_total", - "in": "query", - "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } - }, - { - "name": "pagination.reverse", - "in": "query", - "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } - }, - { - "name": "order_by", - "in": "query", - "description": " - ORDER_BY_UNSPECIFIED: ORDER_BY_UNSPECIFIED specifies an unknown sorting order. OrderBy defaults\nto ASC in this case.\n - ORDER_BY_ASC: ORDER_BY_ASC defines ascending order\n - ORDER_BY_DESC: ORDER_BY_DESC defines descending order", - "schema": { - "type": "string", - "default": "ORDER_BY_UNSPECIFIED", - "enum": [ - "ORDER_BY_UNSPECIFIED", - "ORDER_BY_ASC", - "ORDER_BY_DESC" - ] - } - }, - { - "name": "page", - "in": "query", - "description": "page is the page number to query, starts at 1. If not provided, will\ndefault to first page.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "limit", - "in": "query", - "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "query", - "in": "query", - "description": "query defines the transaction event query that is proxied to Tendermint's\nTxSearch RPC method. The query must be valid.\n\nSince cosmos-sdk 0.50", - "schema": { - "type": "string" - } + "name": "height", + "in": "path", + "required": true, + "type": "string", + "format": "int64" } ], + "tags": [ + "Service" + ] + } + }, + "/cosmos/base/tendermint/v1beta1/node_info": { + "get": { + "summary": "GetNodeInfo queries the current node info.", + "operationId": "GetNodeInfo", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/cosmos.tx.v1beta1.GetTxsEventResponse" - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "default_node_info": { "type": "object", "properties": { - "error": { + "protocol_version": { + "type": "object", + "properties": { + "p2p": { + "type": "string", + "format": "uint64" + }, + "block": { + "type": "string", + "format": "uint64" + }, + "app": { + "type": "string", + "format": "uint64" + } + } + }, + "default_node_id": { "type": "string" }, - "code": { - "type": "integer", - "format": "int32" + "listen_addr": { + "type": "string" }, - "message": { + "network": { "type": "string" }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } + "version": { + "type": "string" + }, + "channels": { + "type": "string", + "format": "byte" + }, + "moniker": { + "type": "string" + }, + "other": { + "type": "object", + "properties": { + "tx_index": { + "type": "string" }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "rpc_address": { + "type": "string" + } } } } - } - } - } - } - } - }, - "post": { - "tags": [ - "Service" - ], - "summary": "BroadcastTx broadcast transaction.", - "operationId": "BroadcastTx", - "requestBody": { - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "tx_bytes": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "tx_bytes is the raw transaction.", - "format": "byte" - }, - "mode": { - "type": "string", - "description": "BroadcastMode specifies the broadcast mode for the TxService.Broadcast RPC\nmethod.\n\n - BROADCAST_MODE_UNSPECIFIED: zero-value for mode ordering\n - BROADCAST_MODE_BLOCK: DEPRECATED: use BROADCAST_MODE_SYNC instead,\nBROADCAST_MODE_BLOCK is not supported by the SDK from v0.47.x onwards.\n - BROADCAST_MODE_SYNC: BROADCAST_MODE_SYNC defines a tx broadcasting mode where the client waits\nfor a CheckTx execution response only.\n - BROADCAST_MODE_ASYNC: BROADCAST_MODE_ASYNC defines a tx broadcasting mode where the client\nreturns immediately.", - "default": "BROADCAST_MODE_UNSPECIFIED", - "enum": [ - "BROADCAST_MODE_UNSPECIFIED", - "BROADCAST_MODE_BLOCK", - "BROADCAST_MODE_SYNC", - "BROADCAST_MODE_ASYNC" - ] - } }, - "description": "BroadcastTxRequest is the request type for the Service.BroadcastTxRequest\nRPC method." - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "tx_response": { - "type": "object", - "properties": { - "height": { - "title": "The block height", - "type": "string", - "format": "int64" - }, - "txhash": { - "type": "string", - "description": "The transaction hash." - }, - "codespace": { - "title": "Namespace for the Code", - "type": "string" - }, - "code": { - "type": "integer", - "description": "Response code.", - "format": "int64" - }, - "data": { - "type": "string", - "description": "Result bytes, if any." - }, - "raw_log": { - "type": "string", - "description": "The output of the application's logger (raw string). May be\nnon-deterministic." - }, - "logs": { - "type": "array", - "description": "The output of the application's logger (typed). May be non-deterministic.", - "items": { - "type": "object", - "properties": { - "msg_index": { - "type": "integer", - "format": "int64" - }, - "log": { - "type": "string" - }, - "events": { - "type": "array", - "description": "Events contains a slice of Event objects that were emitted during some\nexecution.", - "items": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "attributes": { - "type": "array", - "items": { - "type": "object", - "properties": { - "key": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "description": "Attribute defines an attribute wrapper where the key and value are\nstrings instead of raw bytes." - } - } - }, - "description": "StringEvent defines en Event object wrapper where all the attributes\ncontain key/value pairs that are strings instead of raw bytes." - } - } - }, - "description": "ABCIMessageLog defines a structure containing an indexed tx ABCI message log." - } - }, - "info": { - "type": "string", - "description": "Additional information. May be non-deterministic." - }, - "gas_wanted": { - "type": "string", - "description": "Amount of gas requested for transaction.", - "format": "int64" - }, - "gas_used": { - "type": "string", - "description": "Amount of gas consumed by transaction.", - "format": "int64" - }, - "tx": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "timestamp": { - "type": "string", - "description": "Time of the previous block. For heights > 1, it's the weighted median of\nthe timestamps of the valid votes in the block.LastCommit. For height == 1,\nit's genesis time." - }, - "events": { - "type": "array", - "description": "Events defines all the events emitted by processing a transaction. Note,\nthese events include those emitted by processing all the messages and those\nemitted from the ante. Whereas Logs contains the events, with\nadditional metadata, emitted only by processing the messages.\n\nSince: cosmos-sdk 0.42.11, 0.44.5, 0.45", - "items": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "attributes": { - "type": "array", - "items": { - "type": "object", - "properties": { - "key": { - "type": "string" - }, - "value": { - "type": "string" - }, - "index": { - "type": "boolean" - } - }, - "description": "EventAttribute is a single key-value pair, associated with an event." - } - } - }, - "description": "Event allows application developers to attach additional information to\nResponseFinalizeBlock and ResponseCheckTx.\nLater, transactions may be queried using these events." - } - } - }, - "description": "TxResponse defines a structure containing relevant tx data and metadata. The\ntags are stringified and the log is JSON decoded." - } - }, - "description": "BroadcastTxResponse is the response type for the\nService.BroadcastTx method." - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { + "application_version": { "type": "object", "properties": { - "error": { + "name": { "type": "string" }, - "code": { - "type": "integer", - "format": "int32" + "app_name": { + "type": "string" }, - "message": { + "version": { + "type": "string" + }, + "git_commit": { + "type": "string" + }, + "build_tags": { "type": "string" }, - "details": { + "go_version": { + "type": "string" + }, + "build_deps": { "type": "array", "items": { "type": "object", "properties": { - "type_url": { + "path": { "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + "title": "module path" }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "version": { "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" + "title": "module version" + }, + "sum": { + "type": "string", + "title": "checksum" } }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "title": "Module is the type for VersionInfo" } + }, + "cosmos_sdk_version": { + "type": "string", + "title": "Since: cosmos-sdk 0.43" } + }, + "description": "VersionInfo is the type for the GetNodeInfoResponse message." + } + }, + "description": "GetNodeInfoResponse is the response type for the Query/GetNodeInfo RPC method." + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } }, - "x-codegen-request-body-name": "body" + "tags": [ + "Service" + ] } }, - "/cosmos/tx/v1beta1/txs/block/{height}": { + "/cosmos/base/tendermint/v1beta1/syncing": { "get": { - "tags": [ - "Service" - ], - "summary": "GetBlockWithTxs fetches a block with decoded txs.", - "description": "Since: cosmos-sdk 0.45.2", - "operationId": "GetBlockWithTxs", - "parameters": [ - { - "name": "height", - "in": "path", - "description": "height is the height of the block to query.", - "required": true, - "schema": { - "type": "string", - "format": "int64" - } - }, - { - "name": "pagination.key", - "in": "query", - "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } - }, - { - "name": "pagination.offset", - "in": "query", - "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.limit", - "in": "query", - "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.count_total", - "in": "query", - "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } - }, - { - "name": "pagination.reverse", - "in": "query", - "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } - } - ], + "summary": "GetSyncing queries node syncing.", + "operationId": "GetSyncing", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/cosmos.tx.v1beta1.GetBlockWithTxsResponse" + "schema": { + "type": "object", + "properties": { + "syncing": { + "type": "boolean" } - } + }, + "description": "GetSyncingResponse is the response type for the Query/GetSyncing RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } - } + }, + "tags": [ + "Service" + ] } }, - "/cosmos/tx/v1beta1/txs/{hash}": { + "/cosmos/base/tendermint/v1beta1/validatorsets/latest": { "get": { - "tags": [ - "Service" - ], - "summary": "GetTx fetches a tx by hash.", - "operationId": "GetTx", - "parameters": [ - { - "name": "hash", - "in": "path", - "description": "hash is the tx hash to query, encoded as a hex string.", - "required": true, - "schema": { - "type": "string" - } - } - ], + "summary": "GetLatestValidatorSet queries latest validator-set.", + "operationId": "GetLatestValidatorSet", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/cosmos.tx.v1beta1.GetTxResponse" - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { + "schema": { + "type": "object", + "properties": { + "block_height": { + "type": "string", + "format": "int64" + }, + "validators": { + "type": "array", + "items": { + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "pub_key": { "type": "object", "properties": { "type_url": { @@ -21460,16615 +21772,11151 @@ "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." }, "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } }, "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "voting_power": { + "type": "string", + "format": "int64" + }, + "proposer_priority": { + "type": "string", + "format": "int64" } + }, + "description": "Validator is the type for the validator-set." + } + }, + "pagination": { + "description": "pagination defines an pagination for the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" } } } + }, + "description": "GetLatestValidatorSetResponse is the response type for the Query/GetValidatorSetByHeight RPC method." + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } + } } } } - } - } - }, - "/cosmos/base/tendermint/v1beta1/abci_query": { - "get": { - "tags": [ - "Service" - ], - "summary": "ABCIQuery defines a query handler that supports ABCI queries directly to the\napplication, bypassing Tendermint completely. The ABCI query must contain\na valid and supported path, including app, custom, p2p, and store.", - "description": "Since: cosmos-sdk 0.46", - "operationId": "ABCIQuery", + }, "parameters": [ { - "name": "data", + "name": "pagination.key", + "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", "in": "query", - "schema": { - "type": "string", - "format": "byte" - } + "required": false, + "type": "string", + "format": "byte" }, { - "name": "path", + "name": "pagination.offset", + "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", "in": "query", - "schema": { - "type": "string" - } + "required": false, + "type": "string", + "format": "uint64" }, { - "name": "height", + "name": "pagination.limit", + "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", "in": "query", - "schema": { - "type": "string", - "format": "int64" - } + "required": false, + "type": "string", + "format": "uint64" }, { - "name": "prove", + "name": "pagination.count_total", + "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", "in": "query", - "schema": { - "type": "boolean" - } + "required": false, + "type": "boolean" + }, + { + "name": "pagination.reverse", + "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", + "in": "query", + "required": false, + "type": "boolean" } ], + "tags": [ + "Service" + ] + } + }, + "/cosmos/base/tendermint/v1beta1/validatorsets/{height}": { + "get": { + "summary": "GetValidatorSetByHeight queries validator-set at a given height.", + "operationId": "GetValidatorSetByHeight", "responses": { "200": { "description": "A successful response.", - "content": { - "*/*": { - "schema": { + "schema": { + "type": "object", + "properties": { + "block_height": { + "type": "string", + "format": "int64" + }, + "validators": { + "type": "array", + "items": { + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "pub_key": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "voting_power": { + "type": "string", + "format": "int64" + }, + "proposer_priority": { + "type": "string", + "format": "int64" + } + }, + "description": "Validator is the type for the validator-set." + } + }, + "pagination": { + "description": "pagination defines an pagination for the response.", "type": "object", "properties": { - "code": { - "type": "integer", - "format": "int64" - }, - "log": { - "type": "string" - }, - "info": { - "type": "string" - }, - "index": { - "type": "string", - "format": "int64" - }, - "key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "next_key": { "type": "string", - "format": "byte" - }, - "proof_ops": { - "type": "object", - "properties": { - "ops": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "data": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "ProofOp defines an operation used for calculating Merkle root. The data could\nbe arbitrary format, providing necessary data for example neighbouring node\nhash.\n\nNote: This type is a duplicate of the ProofOp proto type defined in Tendermint." - } - } - }, - "description": "ProofOps is Merkle proof defined by the list of ProofOps.\n\nNote: This type is a duplicate of the ProofOps proto type defined in Tendermint." + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." }, - "height": { + "total": { "type": "string", - "format": "int64" - }, - "codespace": { - "type": "string" + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" } - }, - "description": "ABCIQueryResponse defines the response structure for the ABCIQuery gRPC query.\n\nNote: This type is a duplicate of the ResponseQuery proto type defined in\nTendermint." + } } - } + }, + "description": "GetValidatorSetByHeightResponse is the response type for the Query/GetValidatorSetByHeight RPC method." } }, "default": { "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" } } } } } + }, + "parameters": [ + { + "name": "height", + "in": "path", + "required": true, + "type": "string", + "format": "int64" + }, + { + "name": "pagination.key", + "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", + "in": "query", + "required": false, + "type": "string", + "format": "byte" + }, + { + "name": "pagination.offset", + "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.limit", + "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", + "in": "query", + "required": false, + "type": "string", + "format": "uint64" + }, + { + "name": "pagination.count_total", + "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", + "in": "query", + "required": false, + "type": "boolean" + }, + { + "name": "pagination.reverse", + "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", + "in": "query", + "required": false, + "type": "boolean" + } + ], + "tags": [ + "Service" + ] + } + } + }, + "definitions": { + "cosmos.base.query.v1beta1.PageRequest": { + "type": "object", + "properties": { + "key": { + "type": "string", + "format": "byte", + "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set." + }, + "offset": { + "type": "string", + "format": "uint64", + "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set." + }, + "limit": { + "type": "string", + "format": "uint64", + "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app." + }, + "count_total": { + "type": "boolean", + "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set." + }, + "reverse": { + "type": "boolean", + "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43" + } + }, + "description": "message SomeRequest {\n Foo some_parameter = 1;\n PageRequest pagination = 2;\n }", + "title": "PageRequest is to be embedded in gRPC request messages for efficient\npagination. Ex:" + }, + "cosmos.base.query.v1beta1.PageResponse": { + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + }, + "description": "PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }" + }, + "evmos.epochs.v1.EpochInfo": { + "type": "object", + "properties": { + "identifier": { + "type": "string", + "title": "identifier of the epoch" + }, + "start_time": { + "type": "string", + "format": "date-time", + "title": "start_time of the epoch" + }, + "duration": { + "type": "string", + "title": "duration of the epoch" + }, + "current_epoch": { + "type": "string", + "format": "int64", + "title": "current_epoch is the integer identifier of the epoch" + }, + "current_epoch_start_time": { + "type": "string", + "format": "date-time", + "title": "current_epoch_start_time defines the timestamp of the start of the epoch" + }, + "epoch_counting_started": { + "type": "boolean", + "title": "epoch_counting_started reflects if the counting for the epoch has started" + }, + "current_epoch_start_height": { + "type": "string", + "format": "int64", + "title": "current_epoch_start_height of the epoch" + } + }, + "description": "EpochInfo defines the message interface containing the relevant informations about\nan epoch." + }, + "evmos.epochs.v1.QueryCurrentEpochResponse": { + "type": "object", + "properties": { + "current_epoch": { + "type": "string", + "format": "int64", + "title": "current_epoch is the number of the current epoch" + } + }, + "description": "QueryCurrentEpochResponse is the response type for the Query/EpochInfos RPC\nmethod." + }, + "evmos.epochs.v1.QueryEpochsInfoResponse": { + "type": "object", + "properties": { + "epochs": { + "type": "array", + "items": { + "type": "object", + "properties": { + "identifier": { + "type": "string", + "title": "identifier of the epoch" + }, + "start_time": { + "type": "string", + "format": "date-time", + "title": "start_time of the epoch" + }, + "duration": { + "type": "string", + "title": "duration of the epoch" + }, + "current_epoch": { + "type": "string", + "format": "int64", + "title": "current_epoch is the integer identifier of the epoch" + }, + "current_epoch_start_time": { + "type": "string", + "format": "date-time", + "title": "current_epoch_start_time defines the timestamp of the start of the epoch" + }, + "epoch_counting_started": { + "type": "boolean", + "title": "epoch_counting_started reflects if the counting for the epoch has started" + }, + "current_epoch_start_height": { + "type": "string", + "format": "int64", + "title": "current_epoch_start_height of the epoch" + } + }, + "description": "EpochInfo defines the message interface containing the relevant informations about\nan epoch." + }, + "title": "epochs is a slice of all EpochInfos" + }, + "pagination": { + "description": "pagination defines an optional pagination for the request.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "description": "QueryEpochsInfoResponse is the response type for the Query/EpochInfos RPC\nmethod." + }, + "google.protobuf.Any": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "grpc.gateway.runtime.Error": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } } } }, - "/cosmos/base/tendermint/v1beta1/blocks/latest": { - "get": { - "tags": [ - "Service" - ], - "summary": "GetLatestBlock returns the latest block.", - "operationId": "GetLatestBlock", - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "block": { - "title": "Deprecated: please use `sdk_block` instead", - "type": "object", - "properties": { - "header": { - "type": "object", - "properties": { - "version": { - "title": "basic block info", - "type": "object", - "properties": { - "block": { - "type": "string", - "format": "uint64" - }, - "app": { - "type": "string", - "format": "uint64" - } - }, - "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." - }, - "chain_id": { - "type": "string" - }, - "height": { - "type": "string", - "format": "int64" - }, - "time": { - "type": "string", - "format": "date-time" - }, - "last_block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "last_commit_hash": { - "title": "hashes of block data", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "data_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validators_hash": { - "title": "hashes from the app output from the prev block", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "next_validators_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "consensus_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "app_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "last_results_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "evidence_hash": { - "title": "consensus info", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proposer_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "Header defines the structure of a block header." - }, - "data": { - "title": "Data contains the set of transactions included in the block", - "type": "object", - "properties": { - "txs": { - "type": "array", - "description": "Txs that will be applied by state @ block.Height+1.\nNOTE: not all txs here are valid. We're just agreeing on the order first.\nThis means that block.AppHash does not include these txs.", - "items": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - }, - "evidence": { - "type": "object", - "properties": { - "evidence": { - "type": "array", - "items": { - "type": "object", - "properties": { - "duplicate_vote_evidence": { - "type": "object", - "properties": { - "vote_a": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals", - "default": "SIGNED_MSG_TYPE_UNKNOWN", - "enum": [ - "SIGNED_MSG_TYPE_UNKNOWN", - "SIGNED_MSG_TYPE_PREVOTE", - "SIGNED_MSG_TYPE_PRECOMMIT", - "SIGNED_MSG_TYPE_PROPOSAL" - ] - }, - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validator_index": { - "type": "integer", - "format": "int32" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block.", - "format": "byte" - }, - "extension": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages.", - "format": "byte" - }, - "extension_signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages.", - "format": "byte" - } - }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." - }, - "vote_b": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals", - "default": "SIGNED_MSG_TYPE_UNKNOWN", - "enum": [ - "SIGNED_MSG_TYPE_UNKNOWN", - "SIGNED_MSG_TYPE_PREVOTE", - "SIGNED_MSG_TYPE_PRECOMMIT", - "SIGNED_MSG_TYPE_PROPOSAL" - ] - }, - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validator_index": { - "type": "integer", - "format": "int32" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block.", - "format": "byte" - }, - "extension": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages.", - "format": "byte" - }, - "extension_signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages.", - "format": "byte" - } - }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." - }, - "total_voting_power": { - "type": "string", - "format": "int64" - }, - "validator_power": { - "type": "string", - "format": "int64" - }, - "timestamp": { - "type": "string", - "format": "date-time" - } - }, - "description": "DuplicateVoteEvidence contains evidence of a validator signed two conflicting votes." - }, - "light_client_attack_evidence": { - "type": "object", - "properties": { - "conflicting_block": { - "type": "object", - "properties": { - "signed_header": { - "type": "object", - "properties": { - "header": { - "type": "object", - "properties": { - "version": { - "title": "basic block info", - "type": "object", - "properties": { - "block": { - "type": "string", - "format": "uint64" - }, - "app": { - "type": "string", - "format": "uint64" - } - }, - "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." - }, - "chain_id": { - "type": "string" - }, - "height": { - "type": "string", - "format": "int64" - }, - "time": { - "type": "string", - "format": "date-time" - }, - "last_block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "last_commit_hash": { - "title": "hashes of block data", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "data_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validators_hash": { - "title": "hashes from the app output from the prev block", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "next_validators_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "consensus_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "app_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "last_results_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "evidence_hash": { - "title": "consensus info", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proposer_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "Header defines the structure of a block header." - }, - "commit": { - "type": "object", - "properties": { - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "signatures": { - "type": "array", - "items": { - "type": "object", - "properties": { - "block_id_flag": { - "title": "BlockIdFlag indicates which BlockID the signature is for", - "type": "string", - "default": "BLOCK_ID_FLAG_UNKNOWN", - "enum": [ - "BLOCK_ID_FLAG_UNKNOWN", - "BLOCK_ID_FLAG_ABSENT", - "BLOCK_ID_FLAG_COMMIT", - "BLOCK_ID_FLAG_NIL" - ] - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "CommitSig is a part of the Vote included in a Commit." - } - } - }, - "description": "Commit contains the evidence that a block was committed by a set of validators." - } - } - }, - "validator_set": { - "type": "object", - "properties": { - "validators": { - "type": "array", - "items": { - "type": "object", - "properties": { - "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", - "type": "object", - "properties": { - "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - }, - "voting_power": { - "type": "string", - "format": "int64" - }, - "proposer_priority": { - "type": "string", - "format": "int64" - } - } - } - }, - "proposer": { - "type": "object", - "properties": { - "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", - "type": "object", - "properties": { - "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - }, - "voting_power": { - "type": "string", - "format": "int64" - }, - "proposer_priority": { - "type": "string", - "format": "int64" - } - } - }, - "total_voting_power": { - "type": "string", - "format": "int64" - } - } - } - } - }, - "common_height": { - "type": "string", - "format": "int64" - }, - "byzantine_validators": { - "type": "array", - "items": { - "type": "object", - "properties": { - "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", - "type": "object", - "properties": { - "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - }, - "voting_power": { - "type": "string", - "format": "int64" - }, - "proposer_priority": { - "type": "string", - "format": "int64" - } - } - } - }, - "total_voting_power": { - "type": "string", - "format": "int64" - }, - "timestamp": { - "type": "string", - "format": "date-time" - } - }, - "description": "LightClientAttackEvidence contains evidence of a set of validators attempting to mislead a light client." - } - } - } - } - } - }, - "last_commit": { - "type": "object", - "properties": { - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "signatures": { - "type": "array", - "items": { - "type": "object", - "properties": { - "block_id_flag": { - "title": "BlockIdFlag indicates which BlockID the signature is for", - "type": "string", - "default": "BLOCK_ID_FLAG_UNKNOWN", - "enum": [ - "BLOCK_ID_FLAG_UNKNOWN", - "BLOCK_ID_FLAG_ABSENT", - "BLOCK_ID_FLAG_COMMIT", - "BLOCK_ID_FLAG_NIL" - ] - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "CommitSig is a part of the Vote included in a Commit." - } - } - }, - "description": "Commit contains the evidence that a block was committed by a set of validators." - } - } - }, - "sdk_block": { - "title": "Since: cosmos-sdk 0.47", - "type": "object", - "properties": { - "header": { - "type": "object", - "properties": { - "version": { - "title": "basic block info", - "type": "object", - "properties": { - "block": { - "type": "string", - "format": "uint64" - }, - "app": { - "type": "string", - "format": "uint64" - } - }, - "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." - }, - "chain_id": { - "type": "string" - }, - "height": { - "type": "string", - "format": "int64" - }, - "time": { - "type": "string", - "format": "date-time" - }, - "last_block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "last_commit_hash": { - "title": "hashes of block data", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "data_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validators_hash": { - "title": "hashes from the app output from the prev block", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "next_validators_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "consensus_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "app_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "last_results_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "evidence_hash": { - "title": "consensus info", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proposer_address": { - "type": "string", - "description": "proposer_address is the original block proposer address, formatted as a Bech32 string.\nIn Tendermint, this type is `bytes`, but in the SDK, we convert it to a Bech32 string\nfor better UX." - } - }, - "description": "Header defines the structure of a Tendermint block header." - }, - "data": { - "title": "Data contains the set of transactions included in the block", - "type": "object", - "properties": { - "txs": { - "type": "array", - "description": "Txs that will be applied by state @ block.Height+1.\nNOTE: not all txs here are valid. We're just agreeing on the order first.\nThis means that block.AppHash does not include these txs.", - "items": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - }, - "evidence": { - "type": "object", - "properties": { - "evidence": { - "type": "array", - "items": { - "type": "object", - "properties": { - "duplicate_vote_evidence": { - "type": "object", - "properties": { - "vote_a": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals", - "default": "SIGNED_MSG_TYPE_UNKNOWN", - "enum": [ - "SIGNED_MSG_TYPE_UNKNOWN", - "SIGNED_MSG_TYPE_PREVOTE", - "SIGNED_MSG_TYPE_PRECOMMIT", - "SIGNED_MSG_TYPE_PROPOSAL" - ] - }, - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validator_index": { - "type": "integer", - "format": "int32" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block.", - "format": "byte" - }, - "extension": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages.", - "format": "byte" - }, - "extension_signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages.", - "format": "byte" - } - }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." - }, - "vote_b": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals", - "default": "SIGNED_MSG_TYPE_UNKNOWN", - "enum": [ - "SIGNED_MSG_TYPE_UNKNOWN", - "SIGNED_MSG_TYPE_PREVOTE", - "SIGNED_MSG_TYPE_PRECOMMIT", - "SIGNED_MSG_TYPE_PROPOSAL" - ] - }, - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validator_index": { - "type": "integer", - "format": "int32" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block.", - "format": "byte" - }, - "extension": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages.", - "format": "byte" - }, - "extension_signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages.", - "format": "byte" - } - }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." - }, - "total_voting_power": { - "type": "string", - "format": "int64" - }, - "validator_power": { - "type": "string", - "format": "int64" - }, - "timestamp": { - "type": "string", - "format": "date-time" - } - }, - "description": "DuplicateVoteEvidence contains evidence of a validator signed two conflicting votes." - }, - "light_client_attack_evidence": { - "type": "object", - "properties": { - "conflicting_block": { - "type": "object", - "properties": { - "signed_header": { - "type": "object", - "properties": { - "header": { - "type": "object", - "properties": { - "version": { - "title": "basic block info", - "type": "object", - "properties": { - "block": { - "type": "string", - "format": "uint64" - }, - "app": { - "type": "string", - "format": "uint64" - } - }, - "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." - }, - "chain_id": { - "type": "string" - }, - "height": { - "type": "string", - "format": "int64" - }, - "time": { - "type": "string", - "format": "date-time" - }, - "last_block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "last_commit_hash": { - "title": "hashes of block data", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "data_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validators_hash": { - "title": "hashes from the app output from the prev block", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "next_validators_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "consensus_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "app_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "last_results_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "evidence_hash": { - "title": "consensus info", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proposer_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "Header defines the structure of a block header." - }, - "commit": { - "type": "object", - "properties": { - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "signatures": { - "type": "array", - "items": { - "type": "object", - "properties": { - "block_id_flag": { - "title": "BlockIdFlag indicates which BlockID the signature is for", - "type": "string", - "default": "BLOCK_ID_FLAG_UNKNOWN", - "enum": [ - "BLOCK_ID_FLAG_UNKNOWN", - "BLOCK_ID_FLAG_ABSENT", - "BLOCK_ID_FLAG_COMMIT", - "BLOCK_ID_FLAG_NIL" - ] - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "CommitSig is a part of the Vote included in a Commit." - } - } - }, - "description": "Commit contains the evidence that a block was committed by a set of validators." - } - } - }, - "validator_set": { - "type": "object", - "properties": { - "validators": { - "type": "array", - "items": { - "type": "object", - "properties": { - "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", - "type": "object", - "properties": { - "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - }, - "voting_power": { - "type": "string", - "format": "int64" - }, - "proposer_priority": { - "type": "string", - "format": "int64" - } - } - } - }, - "proposer": { - "type": "object", - "properties": { - "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", - "type": "object", - "properties": { - "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - }, - "voting_power": { - "type": "string", - "format": "int64" - }, - "proposer_priority": { - "type": "string", - "format": "int64" - } - } - }, - "total_voting_power": { - "type": "string", - "format": "int64" - } - } - } - } - }, - "common_height": { - "type": "string", - "format": "int64" - }, - "byzantine_validators": { - "type": "array", - "items": { - "type": "object", - "properties": { - "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", - "type": "object", - "properties": { - "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - }, - "voting_power": { - "type": "string", - "format": "int64" - }, - "proposer_priority": { - "type": "string", - "format": "int64" - } - } - } - }, - "total_voting_power": { - "type": "string", - "format": "int64" - }, - "timestamp": { - "type": "string", - "format": "date-time" - } - }, - "description": "LightClientAttackEvidence contains evidence of a set of validators attempting to mislead a light client." - } - } - } - } - } - }, - "last_commit": { - "type": "object", - "properties": { - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "signatures": { - "type": "array", - "items": { - "type": "object", - "properties": { - "block_id_flag": { - "title": "BlockIdFlag indicates which BlockID the signature is for", - "type": "string", - "default": "BLOCK_ID_FLAG_UNKNOWN", - "enum": [ - "BLOCK_ID_FLAG_UNKNOWN", - "BLOCK_ID_FLAG_ABSENT", - "BLOCK_ID_FLAG_COMMIT", - "BLOCK_ID_FLAG_NIL" - ] - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "CommitSig is a part of the Vote included in a Commit." - } - } - }, - "description": "Commit contains the evidence that a block was committed by a set of validators." - } - }, - "description": "Block is tendermint type Block, with the Header proposer address\nfield converted to bech32 string." - } - }, - "description": "GetLatestBlockResponse is the response type for the Query/GetLatestBlock RPC method." - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - } - } - } - } - } - } - } - }, - "/cosmos/base/tendermint/v1beta1/blocks/{height}": { - "get": { - "tags": [ - "Service" - ], - "summary": "GetBlockByHeight queries block for given height.", - "operationId": "GetBlockByHeight", - "parameters": [ - { - "name": "height", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "int64" - } - } - ], - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "block": { - "title": "Deprecated: please use `sdk_block` instead", - "type": "object", - "properties": { - "header": { - "type": "object", - "properties": { - "version": { - "title": "basic block info", - "type": "object", - "properties": { - "block": { - "type": "string", - "format": "uint64" - }, - "app": { - "type": "string", - "format": "uint64" - } - }, - "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." - }, - "chain_id": { - "type": "string" - }, - "height": { - "type": "string", - "format": "int64" - }, - "time": { - "type": "string", - "format": "date-time" - }, - "last_block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "last_commit_hash": { - "title": "hashes of block data", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "data_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validators_hash": { - "title": "hashes from the app output from the prev block", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "next_validators_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "consensus_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "app_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "last_results_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "evidence_hash": { - "title": "consensus info", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proposer_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "Header defines the structure of a block header." - }, - "data": { - "title": "Data contains the set of transactions included in the block", - "type": "object", - "properties": { - "txs": { - "type": "array", - "description": "Txs that will be applied by state @ block.Height+1.\nNOTE: not all txs here are valid. We're just agreeing on the order first.\nThis means that block.AppHash does not include these txs.", - "items": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - }, - "evidence": { - "type": "object", - "properties": { - "evidence": { - "type": "array", - "items": { - "type": "object", - "properties": { - "duplicate_vote_evidence": { - "type": "object", - "properties": { - "vote_a": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals", - "default": "SIGNED_MSG_TYPE_UNKNOWN", - "enum": [ - "SIGNED_MSG_TYPE_UNKNOWN", - "SIGNED_MSG_TYPE_PREVOTE", - "SIGNED_MSG_TYPE_PRECOMMIT", - "SIGNED_MSG_TYPE_PROPOSAL" - ] - }, - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validator_index": { - "type": "integer", - "format": "int32" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block.", - "format": "byte" - }, - "extension": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages.", - "format": "byte" - }, - "extension_signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages.", - "format": "byte" - } - }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." - }, - "vote_b": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals", - "default": "SIGNED_MSG_TYPE_UNKNOWN", - "enum": [ - "SIGNED_MSG_TYPE_UNKNOWN", - "SIGNED_MSG_TYPE_PREVOTE", - "SIGNED_MSG_TYPE_PRECOMMIT", - "SIGNED_MSG_TYPE_PROPOSAL" - ] - }, - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validator_index": { - "type": "integer", - "format": "int32" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block.", - "format": "byte" - }, - "extension": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages.", - "format": "byte" - }, - "extension_signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages.", - "format": "byte" - } - }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." - }, - "total_voting_power": { - "type": "string", - "format": "int64" - }, - "validator_power": { - "type": "string", - "format": "int64" - }, - "timestamp": { - "type": "string", - "format": "date-time" - } - }, - "description": "DuplicateVoteEvidence contains evidence of a validator signed two conflicting votes." - }, - "light_client_attack_evidence": { - "type": "object", - "properties": { - "conflicting_block": { - "type": "object", - "properties": { - "signed_header": { - "type": "object", - "properties": { - "header": { - "type": "object", - "properties": { - "version": { - "title": "basic block info", - "type": "object", - "properties": { - "block": { - "type": "string", - "format": "uint64" - }, - "app": { - "type": "string", - "format": "uint64" - } - }, - "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." - }, - "chain_id": { - "type": "string" - }, - "height": { - "type": "string", - "format": "int64" - }, - "time": { - "type": "string", - "format": "date-time" - }, - "last_block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "last_commit_hash": { - "title": "hashes of block data", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "data_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validators_hash": { - "title": "hashes from the app output from the prev block", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "next_validators_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "consensus_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "app_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "last_results_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "evidence_hash": { - "title": "consensus info", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proposer_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "Header defines the structure of a block header." - }, - "commit": { - "type": "object", - "properties": { - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "signatures": { - "type": "array", - "items": { - "type": "object", - "properties": { - "block_id_flag": { - "title": "BlockIdFlag indicates which BlockID the signature is for", - "type": "string", - "default": "BLOCK_ID_FLAG_UNKNOWN", - "enum": [ - "BLOCK_ID_FLAG_UNKNOWN", - "BLOCK_ID_FLAG_ABSENT", - "BLOCK_ID_FLAG_COMMIT", - "BLOCK_ID_FLAG_NIL" - ] - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "CommitSig is a part of the Vote included in a Commit." - } - } - }, - "description": "Commit contains the evidence that a block was committed by a set of validators." - } - } - }, - "validator_set": { - "type": "object", - "properties": { - "validators": { - "type": "array", - "items": { - "type": "object", - "properties": { - "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", - "type": "object", - "properties": { - "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - }, - "voting_power": { - "type": "string", - "format": "int64" - }, - "proposer_priority": { - "type": "string", - "format": "int64" - } - } - } - }, - "proposer": { - "type": "object", - "properties": { - "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", - "type": "object", - "properties": { - "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - }, - "voting_power": { - "type": "string", - "format": "int64" - }, - "proposer_priority": { - "type": "string", - "format": "int64" - } - } - }, - "total_voting_power": { - "type": "string", - "format": "int64" - } - } - } - } - }, - "common_height": { - "type": "string", - "format": "int64" - }, - "byzantine_validators": { - "type": "array", - "items": { - "type": "object", - "properties": { - "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", - "type": "object", - "properties": { - "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - }, - "voting_power": { - "type": "string", - "format": "int64" - }, - "proposer_priority": { - "type": "string", - "format": "int64" - } - } - } - }, - "total_voting_power": { - "type": "string", - "format": "int64" - }, - "timestamp": { - "type": "string", - "format": "date-time" - } - }, - "description": "LightClientAttackEvidence contains evidence of a set of validators attempting to mislead a light client." - } - } - } - } - } - }, - "last_commit": { - "type": "object", - "properties": { - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "signatures": { - "type": "array", - "items": { - "type": "object", - "properties": { - "block_id_flag": { - "title": "BlockIdFlag indicates which BlockID the signature is for", - "type": "string", - "default": "BLOCK_ID_FLAG_UNKNOWN", - "enum": [ - "BLOCK_ID_FLAG_UNKNOWN", - "BLOCK_ID_FLAG_ABSENT", - "BLOCK_ID_FLAG_COMMIT", - "BLOCK_ID_FLAG_NIL" - ] - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "CommitSig is a part of the Vote included in a Commit." - } - } - }, - "description": "Commit contains the evidence that a block was committed by a set of validators." - } - } - }, - "sdk_block": { - "title": "Since: cosmos-sdk 0.47", - "type": "object", - "properties": { - "header": { - "type": "object", - "properties": { - "version": { - "title": "basic block info", - "type": "object", - "properties": { - "block": { - "type": "string", - "format": "uint64" - }, - "app": { - "type": "string", - "format": "uint64" - } - }, - "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." - }, - "chain_id": { - "type": "string" - }, - "height": { - "type": "string", - "format": "int64" - }, - "time": { - "type": "string", - "format": "date-time" - }, - "last_block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "last_commit_hash": { - "title": "hashes of block data", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "data_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validators_hash": { - "title": "hashes from the app output from the prev block", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "next_validators_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "consensus_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "app_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "last_results_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "evidence_hash": { - "title": "consensus info", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proposer_address": { - "type": "string", - "description": "proposer_address is the original block proposer address, formatted as a Bech32 string.\nIn Tendermint, this type is `bytes`, but in the SDK, we convert it to a Bech32 string\nfor better UX." - } - }, - "description": "Header defines the structure of a Tendermint block header." - }, - "data": { - "title": "Data contains the set of transactions included in the block", - "type": "object", - "properties": { - "txs": { - "type": "array", - "description": "Txs that will be applied by state @ block.Height+1.\nNOTE: not all txs here are valid. We're just agreeing on the order first.\nThis means that block.AppHash does not include these txs.", - "items": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - }, - "evidence": { - "type": "object", - "properties": { - "evidence": { - "type": "array", - "items": { - "type": "object", - "properties": { - "duplicate_vote_evidence": { - "type": "object", - "properties": { - "vote_a": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals", - "default": "SIGNED_MSG_TYPE_UNKNOWN", - "enum": [ - "SIGNED_MSG_TYPE_UNKNOWN", - "SIGNED_MSG_TYPE_PREVOTE", - "SIGNED_MSG_TYPE_PRECOMMIT", - "SIGNED_MSG_TYPE_PROPOSAL" - ] - }, - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validator_index": { - "type": "integer", - "format": "int32" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block.", - "format": "byte" - }, - "extension": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages.", - "format": "byte" - }, - "extension_signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages.", - "format": "byte" - } - }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." - }, - "vote_b": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals", - "default": "SIGNED_MSG_TYPE_UNKNOWN", - "enum": [ - "SIGNED_MSG_TYPE_UNKNOWN", - "SIGNED_MSG_TYPE_PREVOTE", - "SIGNED_MSG_TYPE_PRECOMMIT", - "SIGNED_MSG_TYPE_PROPOSAL" - ] - }, - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validator_index": { - "type": "integer", - "format": "int32" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block.", - "format": "byte" - }, - "extension": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages.", - "format": "byte" - }, - "extension_signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages.", - "format": "byte" - } - }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." - }, - "total_voting_power": { - "type": "string", - "format": "int64" - }, - "validator_power": { - "type": "string", - "format": "int64" - }, - "timestamp": { - "type": "string", - "format": "date-time" - } - }, - "description": "DuplicateVoteEvidence contains evidence of a validator signed two conflicting votes." - }, - "light_client_attack_evidence": { - "type": "object", - "properties": { - "conflicting_block": { - "type": "object", - "properties": { - "signed_header": { - "type": "object", - "properties": { - "header": { - "type": "object", - "properties": { - "version": { - "title": "basic block info", - "type": "object", - "properties": { - "block": { - "type": "string", - "format": "uint64" - }, - "app": { - "type": "string", - "format": "uint64" - } - }, - "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." - }, - "chain_id": { - "type": "string" - }, - "height": { - "type": "string", - "format": "int64" - }, - "time": { - "type": "string", - "format": "date-time" - }, - "last_block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "last_commit_hash": { - "title": "hashes of block data", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "data_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validators_hash": { - "title": "hashes from the app output from the prev block", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "next_validators_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "consensus_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "app_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "last_results_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "evidence_hash": { - "title": "consensus info", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proposer_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "Header defines the structure of a block header." - }, - "commit": { - "type": "object", - "properties": { - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "signatures": { - "type": "array", - "items": { - "type": "object", - "properties": { - "block_id_flag": { - "title": "BlockIdFlag indicates which BlockID the signature is for", - "type": "string", - "default": "BLOCK_ID_FLAG_UNKNOWN", - "enum": [ - "BLOCK_ID_FLAG_UNKNOWN", - "BLOCK_ID_FLAG_ABSENT", - "BLOCK_ID_FLAG_COMMIT", - "BLOCK_ID_FLAG_NIL" - ] - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "CommitSig is a part of the Vote included in a Commit." - } - } - }, - "description": "Commit contains the evidence that a block was committed by a set of validators." - } - } - }, - "validator_set": { - "type": "object", - "properties": { - "validators": { - "type": "array", - "items": { - "type": "object", - "properties": { - "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", - "type": "object", - "properties": { - "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - }, - "voting_power": { - "type": "string", - "format": "int64" - }, - "proposer_priority": { - "type": "string", - "format": "int64" - } - } - } - }, - "proposer": { - "type": "object", - "properties": { - "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", - "type": "object", - "properties": { - "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - }, - "voting_power": { - "type": "string", - "format": "int64" - }, - "proposer_priority": { - "type": "string", - "format": "int64" - } - } - }, - "total_voting_power": { - "type": "string", - "format": "int64" - } - } - } - } - }, - "common_height": { - "type": "string", - "format": "int64" - }, - "byzantine_validators": { - "type": "array", - "items": { - "type": "object", - "properties": { - "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", - "type": "object", - "properties": { - "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - }, - "voting_power": { - "type": "string", - "format": "int64" - }, - "proposer_priority": { - "type": "string", - "format": "int64" - } - } - } - }, - "total_voting_power": { - "type": "string", - "format": "int64" - }, - "timestamp": { - "type": "string", - "format": "date-time" - } - }, - "description": "LightClientAttackEvidence contains evidence of a set of validators attempting to mislead a light client." - } - } - } - } - } - }, - "last_commit": { - "type": "object", - "properties": { - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "signatures": { - "type": "array", - "items": { - "type": "object", - "properties": { - "block_id_flag": { - "title": "BlockIdFlag indicates which BlockID the signature is for", - "type": "string", - "default": "BLOCK_ID_FLAG_UNKNOWN", - "enum": [ - "BLOCK_ID_FLAG_UNKNOWN", - "BLOCK_ID_FLAG_ABSENT", - "BLOCK_ID_FLAG_COMMIT", - "BLOCK_ID_FLAG_NIL" - ] - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "CommitSig is a part of the Vote included in a Commit." - } - } - }, - "description": "Commit contains the evidence that a block was committed by a set of validators." - } - }, - "description": "Block is tendermint type Block, with the Header proposer address\nfield converted to bech32 string." - } - }, - "description": "GetBlockByHeightResponse is the response type for the Query/GetBlockByHeight RPC method." - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - } - } - } - } - } - } - } - }, - "/cosmos/base/tendermint/v1beta1/node_info": { - "get": { - "tags": [ - "Service" - ], - "summary": "GetNodeInfo queries the current node info.", - "operationId": "GetNodeInfo", - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "default_node_info": { - "type": "object", - "properties": { - "protocol_version": { - "type": "object", - "properties": { - "p2p": { - "type": "string", - "format": "uint64" - }, - "block": { - "type": "string", - "format": "uint64" - }, - "app": { - "type": "string", - "format": "uint64" - } - } - }, - "default_node_id": { - "type": "string" - }, - "listen_addr": { - "type": "string" - }, - "network": { - "type": "string" - }, - "version": { - "type": "string" - }, - "channels": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "moniker": { - "type": "string" - }, - "other": { - "type": "object", - "properties": { - "tx_index": { - "type": "string" - }, - "rpc_address": { - "type": "string" - } - } - } - } - }, - "application_version": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "app_name": { - "type": "string" - }, - "version": { - "type": "string" - }, - "git_commit": { - "type": "string" - }, - "build_tags": { - "type": "string" - }, - "go_version": { - "type": "string" - }, - "build_deps": { - "type": "array", - "items": { - "title": "Module is the type for VersionInfo", - "type": "object", - "properties": { - "path": { - "title": "module path", - "type": "string" - }, - "version": { - "title": "module version", - "type": "string" - }, - "sum": { - "title": "checksum", - "type": "string" - } - } - } - }, - "cosmos_sdk_version": { - "title": "Since: cosmos-sdk 0.43", - "type": "string" - } - }, - "description": "VersionInfo is the type for the GetNodeInfoResponse message." - } - }, - "description": "GetNodeInfoResponse is the response type for the Query/GetNodeInfo RPC method." - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - } - } - } - } - } - } - } - }, - "/cosmos/base/tendermint/v1beta1/syncing": { - "get": { - "tags": [ - "Service" - ], - "summary": "GetSyncing queries node syncing.", - "operationId": "GetSyncing", - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "syncing": { - "type": "boolean" - } - }, - "description": "GetSyncingResponse is the response type for the Query/GetSyncing RPC method." - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - } - } - } - } - } - } - } - }, - "/cosmos/base/tendermint/v1beta1/validatorsets/latest": { - "get": { - "tags": [ - "Service" - ], - "summary": "GetLatestValidatorSet queries latest validator-set.", - "operationId": "GetLatestValidatorSet", - "parameters": [ - { - "name": "pagination.key", - "in": "query", - "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } - }, - { - "name": "pagination.offset", - "in": "query", - "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.limit", - "in": "query", - "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.count_total", - "in": "query", - "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } - }, - { - "name": "pagination.reverse", - "in": "query", - "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } - } - ], - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "block_height": { - "type": "string", - "format": "int64" - }, - "validators": { - "type": "array", - "items": { - "type": "object", - "properties": { - "address": { - "type": "string" - }, - "pub_key": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "voting_power": { - "type": "string", - "format": "int64" - }, - "proposer_priority": { - "type": "string", - "format": "int64" - } - }, - "description": "Validator is the type for the validator-set." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines an pagination for the response." - } - }, - "description": "GetLatestValidatorSetResponse is the response type for the Query/GetValidatorSetByHeight RPC method." - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - } - } - } - } - } - } - } - }, - "/cosmos/base/tendermint/v1beta1/validatorsets/{height}": { - "get": { - "tags": [ - "Service" - ], - "summary": "GetValidatorSetByHeight queries validator-set at a given height.", - "operationId": "GetValidatorSetByHeight", - "parameters": [ - { - "name": "height", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "int64" - } - }, - { - "name": "pagination.key", - "in": "query", - "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "schema": { - "type": "string", - "format": "byte" - } - }, - { - "name": "pagination.offset", - "in": "query", - "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.limit", - "in": "query", - "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "schema": { - "type": "string", - "format": "uint64" - } - }, - { - "name": "pagination.count_total", - "in": "query", - "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "schema": { - "type": "boolean" - } - }, - { - "name": "pagination.reverse", - "in": "query", - "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "schema": { - "type": "boolean" - } - } - ], - "responses": { - "200": { - "description": "A successful response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "block_height": { - "type": "string", - "format": "int64" - }, - "validators": { - "type": "array", - "items": { - "type": "object", - "properties": { - "address": { - "type": "string" - }, - "pub_key": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "voting_power": { - "type": "string", - "format": "int64" - }, - "proposer_priority": { - "type": "string", - "format": "int64" - } - }, - "description": "Validator is the type for the validator-set." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines an pagination for the response." - } - }, - "description": "GetValidatorSetByHeightResponse is the response type for the Query/GetValidatorSetByHeight RPC method." - } - } - } - }, - "default": { - "description": "An unexpected error response.", - "content": { - "*/*": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - } - } - } - } - } - } - } - } - }, - "components": { - "schemas": { - "cosmos.base.query.v1beta1.PageRequest": { - "title": "PageRequest is to be embedded in gRPC request messages for efficient\npagination. Ex:", - "type": "object", - "properties": { - "key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "format": "byte" - }, - "offset": { - "type": "string", - "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "format": "uint64" - }, - "limit": { - "type": "string", - "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "format": "uint64" - }, - "count_total": { - "type": "boolean", - "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set." - }, - "reverse": { - "type": "boolean", - "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43" - } - }, - "description": "message SomeRequest {\n Foo some_parameter = 1;\n PageRequest pagination = 2;\n }" - }, - "cosmos.base.query.v1beta1.PageResponse": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }" - }, - "cosmos.base.v1beta1.Coin": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - }, - "evmos.claims.v1.Action": { - "type": "string", - "description": "Action defines the list of available actions to claim the airdrop tokens.\n\n - ACTION_UNSPECIFIED: ACTION_UNSPECIFIED defines an invalid action.\n - ACTION_VOTE: ACTION_VOTE defines a proposal vote.\n - ACTION_DELEGATE: ACTION_DELEGATE defines an staking delegation.\n - ACTION_EVM: ACTION_EVM defines an EVM transaction.\n - ACTION_IBC_TRANSFER: ACTION_IBC_TRANSFER defines a fungible token transfer transaction via IBC.", - "default": "ACTION_UNSPECIFIED", - "enum": [ - "ACTION_UNSPECIFIED", - "ACTION_VOTE", - "ACTION_DELEGATE", - "ACTION_EVM", - "ACTION_IBC_TRANSFER" - ] - }, - "evmos.claims.v1.Claim": { - "type": "object", - "properties": { - "action": { - "title": "action enum", - "type": "string", - "description": "Action defines the list of available actions to claim the airdrop tokens.\n\n - ACTION_UNSPECIFIED: ACTION_UNSPECIFIED defines an invalid action.\n - ACTION_VOTE: ACTION_VOTE defines a proposal vote.\n - ACTION_DELEGATE: ACTION_DELEGATE defines an staking delegation.\n - ACTION_EVM: ACTION_EVM defines an EVM transaction.\n - ACTION_IBC_TRANSFER: ACTION_IBC_TRANSFER defines a fungible token transfer transaction via IBC.", - "default": "ACTION_UNSPECIFIED", - "enum": [ - "ACTION_UNSPECIFIED", - "ACTION_VOTE", - "ACTION_DELEGATE", - "ACTION_EVM", - "ACTION_IBC_TRANSFER" - ] - }, - "completed": { - "title": "completed is true if the action has been completed", - "type": "boolean" - }, - "claimable_amount": { - "title": "claimable_amount of tokens for the action. Zero if completed", - "type": "string" - } - }, - "description": "Claim defines the action, completed flag and the remaining claimable amount\nfor a given user. This is only used during client queries." - }, - "evmos.claims.v1.ClaimsRecordAddress": { - "type": "object", - "properties": { - "address": { - "title": "address of claiming user in either bech32 or hex format", - "type": "string" - }, - "initial_claimable_amount": { - "title": "initial_claimable_amount for the user", - "type": "string" - }, - "actions_completed": { - "title": "actions_completed is a slice that describes which actions were completed", - "type": "array", - "items": { - "type": "boolean" - } - } - }, - "description": "ClaimsRecordAddress is the claims metadata per address that is used at\nGenesis." - }, - "evmos.claims.v1.Params": { - "type": "object", - "properties": { - "enable_claims": { - "title": "enable_claims is the parameter to enable the claiming process", - "type": "boolean" - }, - "airdrop_start_time": { - "title": "airdrop_start_time defines the timestamp of the airdrop start", - "type": "string", - "format": "date-time" - }, - "duration_until_decay": { - "title": "duration_until_decay of claimable tokens begin", - "type": "string" - }, - "duration_of_decay": { - "title": "duration_of_decay for token claim decay period", - "type": "string" - }, - "claims_denom": { - "title": "claims_denom is the denomination of the claimable coin", - "type": "string" - }, - "authorized_channels": { - "type": "array", - "description": "authorized_channels is the list of authorized channel identifiers that can perform address\nattestations via IBC.", - "items": { - "type": "string" - } - }, - "evm_channels": { - "title": "evm_channels is the list of channel identifiers from EVM compatible chains", - "type": "array", - "items": { - "type": "string" - } - } - }, - "description": "Params defines the claims module's parameters." - }, - "evmos.claims.v1.QueryClaimsRecordResponse": { - "type": "object", - "properties": { - "initial_claimable_amount": { - "title": "initial_claimable_amount of the user", - "type": "string" - }, - "claims": { - "title": "claims of the user", - "type": "array", - "items": { - "type": "object", - "properties": { - "action": { - "title": "action enum", - "type": "string", - "description": "Action defines the list of available actions to claim the airdrop tokens.\n\n - ACTION_UNSPECIFIED: ACTION_UNSPECIFIED defines an invalid action.\n - ACTION_VOTE: ACTION_VOTE defines a proposal vote.\n - ACTION_DELEGATE: ACTION_DELEGATE defines an staking delegation.\n - ACTION_EVM: ACTION_EVM defines an EVM transaction.\n - ACTION_IBC_TRANSFER: ACTION_IBC_TRANSFER defines a fungible token transfer transaction via IBC.", - "default": "ACTION_UNSPECIFIED", - "enum": [ - "ACTION_UNSPECIFIED", - "ACTION_VOTE", - "ACTION_DELEGATE", - "ACTION_EVM", - "ACTION_IBC_TRANSFER" - ] - }, - "completed": { - "title": "completed is true if the action has been completed", - "type": "boolean" - }, - "claimable_amount": { - "title": "claimable_amount of tokens for the action. Zero if completed", - "type": "string" - } - }, - "description": "Claim defines the action, completed flag and the remaining claimable amount\nfor a given user. This is only used during client queries." - } - } - }, - "description": "QueryClaimsRecordResponse is the response type for the Query/ClaimsRecord RPC\nmethod." - }, - "evmos.claims.v1.QueryClaimsRecordsResponse": { - "type": "object", - "properties": { - "claims": { - "title": "claims defines all claims records", - "type": "array", - "items": { - "type": "object", - "properties": { - "address": { - "title": "address of claiming user in either bech32 or hex format", - "type": "string" - }, - "initial_claimable_amount": { - "title": "initial_claimable_amount for the user", - "type": "string" - }, - "actions_completed": { - "title": "actions_completed is a slice that describes which actions were completed", - "type": "array", - "items": { - "type": "boolean" - } - } - }, - "description": "ClaimsRecordAddress is the claims metadata per address that is used at\nGenesis." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QueryClaimsRecordsResponse is the response type for the Query/ClaimsRecords\nRPC method." - }, - "evmos.claims.v1.QueryParamsResponse": { - "type": "object", - "properties": { - "params": { - "type": "object", - "properties": { - "enable_claims": { - "title": "enable_claims is the parameter to enable the claiming process", - "type": "boolean" - }, - "airdrop_start_time": { - "title": "airdrop_start_time defines the timestamp of the airdrop start", - "type": "string", - "format": "date-time" - }, - "duration_until_decay": { - "title": "duration_until_decay of claimable tokens begin", - "type": "string" - }, - "duration_of_decay": { - "title": "duration_of_decay for token claim decay period", - "type": "string" - }, - "claims_denom": { - "title": "claims_denom is the denomination of the claimable coin", - "type": "string" - }, - "authorized_channels": { - "type": "array", - "description": "authorized_channels is the list of authorized channel identifiers that can perform address\nattestations via IBC.", - "items": { - "type": "string" - } - }, - "evm_channels": { - "title": "evm_channels is the list of channel identifiers from EVM compatible chains", - "type": "array", - "items": { - "type": "string" - } - } - }, - "description": "params defines the parameters of the module." - } - }, - "description": "QueryParamsResponse is the response type for the Query/Params RPC method." - }, - "evmos.claims.v1.QueryTotalUnclaimedResponse": { - "type": "object", - "properties": { - "coins": { - "title": "coins defines the unclaimed coins", - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - } - }, - "description": "QueryTotalUnclaimedResponse is the response type for the Query/TotalUnclaimed\nRPC method." - }, - "google.protobuf.Any": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "grpc.gateway.runtime.Error": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - } - }, - "evmos.epochs.v1.EpochInfo": { - "type": "object", - "properties": { - "identifier": { - "title": "identifier of the epoch", - "type": "string" - }, - "start_time": { - "title": "start_time of the epoch", - "type": "string", - "format": "date-time" - }, - "duration": { - "title": "duration of the epoch", - "type": "string" - }, - "current_epoch": { - "title": "current_epoch is the integer identifier of the epoch", - "type": "string", - "format": "int64" - }, - "current_epoch_start_time": { - "title": "current_epoch_start_time defines the timestamp of the start of the epoch", - "type": "string", - "format": "date-time" - }, - "epoch_counting_started": { - "title": "epoch_counting_started reflects if the counting for the epoch has started", - "type": "boolean" - }, - "current_epoch_start_height": { - "title": "current_epoch_start_height of the epoch", - "type": "string", - "format": "int64" - } - }, - "description": "EpochInfo defines the message interface containing the relevant informations about\nan epoch." - }, - "evmos.epochs.v1.QueryCurrentEpochResponse": { - "type": "object", - "properties": { - "current_epoch": { - "title": "current_epoch is the number of the current epoch", - "type": "string", - "format": "int64" - } - }, - "description": "QueryCurrentEpochResponse is the response type for the Query/EpochInfos RPC\nmethod." - }, - "evmos.epochs.v1.QueryEpochsInfoResponse": { - "type": "object", - "properties": { - "epochs": { - "title": "epochs is a slice of all EpochInfos", - "type": "array", - "items": { - "type": "object", - "properties": { - "identifier": { - "title": "identifier of the epoch", - "type": "string" - }, - "start_time": { - "title": "start_time of the epoch", - "type": "string", - "format": "date-time" - }, - "duration": { - "title": "duration of the epoch", - "type": "string" - }, - "current_epoch": { - "title": "current_epoch is the integer identifier of the epoch", - "type": "string", - "format": "int64" - }, - "current_epoch_start_time": { - "title": "current_epoch_start_time defines the timestamp of the start of the epoch", - "type": "string", - "format": "date-time" - }, - "epoch_counting_started": { - "title": "epoch_counting_started reflects if the counting for the epoch has started", - "type": "boolean" - }, - "current_epoch_start_height": { - "title": "current_epoch_start_height of the epoch", - "type": "string", - "format": "int64" - } - }, - "description": "EpochInfo defines the message interface containing the relevant informations about\nan epoch." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines an optional pagination for the request." - } - }, - "description": "QueryEpochsInfoResponse is the response type for the Query/EpochInfos RPC\nmethod." - }, - "evmos.erc20.v1.Owner": { - "type": "string", - "description": "Owner enumerates the ownership of a ERC20 contract.\n\n - OWNER_UNSPECIFIED: OWNER_UNSPECIFIED defines an invalid/undefined owner.\n - OWNER_MODULE: OWNER_MODULE - erc20 is owned by the erc20 module account.\n - OWNER_EXTERNAL: OWNER_EXTERNAL - erc20 is owned by an external account.", - "default": "OWNER_UNSPECIFIED", - "enum": [ - "OWNER_UNSPECIFIED", - "OWNER_MODULE", - "OWNER_EXTERNAL" - ] - }, - "evmos.erc20.v1.Params": { - "title": "Params defines the erc20 module params", - "type": "object", - "properties": { - "enable_erc20": { - "type": "boolean", - "description": "enable_erc20 is the parameter to enable the conversion of Cosmos coins <--> ERC20 tokens." - }, - "enable_evm_hook": { - "type": "boolean", - "description": "enable_evm_hook is the parameter to enable the EVM hook that converts an ERC20 token to a Cosmos\nCoin by transferring the Tokens through a MsgEthereumTx to the ModuleAddress Ethereum address." - } - } - }, - "evmos.erc20.v1.QueryParamsResponse": { - "type": "object", - "properties": { - "params": { - "title": "params are the erc20 module parameters", - "type": "object", - "properties": { - "enable_erc20": { - "type": "boolean", - "description": "enable_erc20 is the parameter to enable the conversion of Cosmos coins <--> ERC20 tokens." - }, - "enable_evm_hook": { - "type": "boolean", - "description": "enable_evm_hook is the parameter to enable the EVM hook that converts an ERC20 token to a Cosmos\nCoin by transferring the Tokens through a MsgEthereumTx to the ModuleAddress Ethereum address." - } - } - } - }, - "description": "QueryParamsResponse is the response type for the Query/Params RPC\nmethod." - }, - "evmos.erc20.v1.QueryTokenPairResponse": { - "type": "object", - "properties": { - "token_pair": { - "title": "token_pairs returns the info about a registered token pair for the erc20 module", - "type": "object", - "properties": { - "erc20_address": { - "title": "erc20_address is the hex address of ERC20 contract token", - "type": "string" - }, - "denom": { - "title": "denom defines the cosmos base denomination to be mapped to", - "type": "string" - }, - "enabled": { - "title": "enabled defines the token mapping enable status", - "type": "boolean" - }, - "contract_owner": { - "title": "contract_owner is the an ENUM specifying the type of ERC20 owner (0 invalid, 1 ModuleAccount, 2 external address)", - "type": "string", - "description": "Owner enumerates the ownership of a ERC20 contract.\n\n - OWNER_UNSPECIFIED: OWNER_UNSPECIFIED defines an invalid/undefined owner.\n - OWNER_MODULE: OWNER_MODULE - erc20 is owned by the erc20 module account.\n - OWNER_EXTERNAL: OWNER_EXTERNAL - erc20 is owned by an external account.", - "default": "OWNER_UNSPECIFIED", - "enum": [ - "OWNER_UNSPECIFIED", - "OWNER_MODULE", - "OWNER_EXTERNAL" - ] - } - }, - "description": "TokenPair defines an instance that records a pairing consisting of a native\n Cosmos Coin and an ERC20 token address." - } - }, - "description": "QueryTokenPairResponse is the response type for the Query/TokenPair RPC\nmethod." - }, - "evmos.erc20.v1.QueryTokenPairsResponse": { - "type": "object", - "properties": { - "token_pairs": { - "title": "token_pairs is a slice of registered token pairs for the erc20 module", - "type": "array", - "items": { - "type": "object", - "properties": { - "erc20_address": { - "title": "erc20_address is the hex address of ERC20 contract token", - "type": "string" - }, - "denom": { - "title": "denom defines the cosmos base denomination to be mapped to", - "type": "string" - }, - "enabled": { - "title": "enabled defines the token mapping enable status", - "type": "boolean" - }, - "contract_owner": { - "title": "contract_owner is the an ENUM specifying the type of ERC20 owner (0 invalid, 1 ModuleAccount, 2 external address)", - "type": "string", - "description": "Owner enumerates the ownership of a ERC20 contract.\n\n - OWNER_UNSPECIFIED: OWNER_UNSPECIFIED defines an invalid/undefined owner.\n - OWNER_MODULE: OWNER_MODULE - erc20 is owned by the erc20 module account.\n - OWNER_EXTERNAL: OWNER_EXTERNAL - erc20 is owned by an external account.", - "default": "OWNER_UNSPECIFIED", - "enum": [ - "OWNER_UNSPECIFIED", - "OWNER_MODULE", - "OWNER_EXTERNAL" - ] - } - }, - "description": "TokenPair defines an instance that records a pairing consisting of a native\n Cosmos Coin and an ERC20 token address." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QueryTokenPairsResponse is the response type for the Query/TokenPairs RPC\nmethod." - }, - "evmos.erc20.v1.TokenPair": { - "type": "object", - "properties": { - "erc20_address": { - "title": "erc20_address is the hex address of ERC20 contract token", - "type": "string" - }, - "denom": { - "title": "denom defines the cosmos base denomination to be mapped to", - "type": "string" - }, - "enabled": { - "title": "enabled defines the token mapping enable status", - "type": "boolean" - }, - "contract_owner": { - "title": "contract_owner is the an ENUM specifying the type of ERC20 owner (0 invalid, 1 ModuleAccount, 2 external address)", - "type": "string", - "description": "Owner enumerates the ownership of a ERC20 contract.\n\n - OWNER_UNSPECIFIED: OWNER_UNSPECIFIED defines an invalid/undefined owner.\n - OWNER_MODULE: OWNER_MODULE - erc20 is owned by the erc20 module account.\n - OWNER_EXTERNAL: OWNER_EXTERNAL - erc20 is owned by an external account.", - "default": "OWNER_UNSPECIFIED", - "enum": [ - "OWNER_UNSPECIFIED", - "OWNER_MODULE", - "OWNER_EXTERNAL" - ] - } - }, - "description": "TokenPair defines an instance that records a pairing consisting of a native\n Cosmos Coin and an ERC20 token address." - }, - "cosmos.base.v1beta1.DecCoin": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." - }, - "evmos.incentives.v1.GasMeter": { - "title": "GasMeter tracks the cumulative gas spent per participant in one epoch", - "type": "object", - "properties": { - "contract": { - "title": "contract is the hex address of the incentivized smart contract", - "type": "string" - }, - "participant": { - "title": "participant address that interacts with the incentive", - "type": "string" - }, - "cumulative_gas": { - "title": "cumulative_gas spent during the epoch", - "type": "string", - "format": "uint64" - } - } - }, - "evmos.incentives.v1.Incentive": { - "title": "Incentive defines an instance that organizes distribution conditions for a\ngiven smart contract", - "type": "object", - "properties": { - "contract": { - "title": "contract address of the smart contract to be incentivized", - "type": "string" - }, - "allocations": { - "title": "allocations is a slice of denoms and percentages of rewards to be allocated", - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." - } - }, - "epochs": { - "title": "epochs defines the number of remaining epochs for the incentive", - "type": "integer", - "format": "int64" - }, - "start_time": { - "title": "start_time of the incentive distribution", - "type": "string", - "format": "date-time" - }, - "total_gas": { - "title": "total_gas is the cumulative gas spent by all gas meters of the incentive during the epoch", - "type": "string", - "format": "uint64" - } - } - }, - "evmos.incentives.v1.Params": { - "title": "Params defines the incentives module params", - "type": "object", - "properties": { - "enable_incentives": { - "title": "enable_incentives is the parameter to enable incentives", - "type": "boolean" - }, - "allocation_limit": { - "title": "allocation_limit is the maximum percentage an incentive can allocate per denomination", - "type": "string" - }, - "incentives_epoch_identifier": { - "title": "incentives_epoch_identifier for the epochs module hooks", - "type": "string" - }, - "reward_scaler": { - "title": "reward_scaler is the scaling factor for capping rewards", - "type": "string" - } - } - }, - "evmos.incentives.v1.QueryAllocationMeterResponse": { - "type": "object", - "properties": { - "allocation_meter": { - "title": "allocation_meter defines the allocation of the queried denom", - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." - } - }, - "description": "QueryAllocationMeterResponse is the response type for the\nQuery/AllocationMeter RPC method." - }, - "evmos.incentives.v1.QueryAllocationMetersResponse": { - "type": "object", - "properties": { - "allocation_meters": { - "title": "allocation_meters is a slice of all allocations", - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QueryAllocationMetersResponse is the response type for the\nQuery/AllocationMeters RPC method." - }, - "evmos.incentives.v1.QueryGasMeterResponse": { - "type": "object", - "properties": { - "gas_meter": { - "title": "gas_meter is a gas meter for one participant on an incentivized smart contract", - "type": "string", - "format": "uint64" - } - }, - "description": "QueryGasMeterResponse is the response type for the Query/Incentive RPC\nmethod." - }, - "evmos.incentives.v1.QueryGasMetersResponse": { - "type": "object", - "properties": { - "gas_meters": { - "title": "gas_meters is a slice of the gas meters for an incentivized smart contract", - "type": "array", - "items": { - "title": "GasMeter tracks the cumulative gas spent per participant in one epoch", - "type": "object", - "properties": { - "contract": { - "title": "contract is the hex address of the incentivized smart contract", - "type": "string" - }, - "participant": { - "title": "participant address that interacts with the incentive", - "type": "string" - }, - "cumulative_gas": { - "title": "cumulative_gas spent during the epoch", - "type": "string", - "format": "uint64" - } - } - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QueryGasMetersResponse is the response type for the Query/Incentives RPC\nmethod." - }, - "evmos.incentives.v1.QueryIncentiveResponse": { - "type": "object", - "properties": { - "incentive": { - "title": "Incentive defines an instance that organizes distribution conditions for a\ngiven smart contract", - "type": "object", - "properties": { - "contract": { - "title": "contract address of the smart contract to be incentivized", - "type": "string" - }, - "allocations": { - "title": "allocations is a slice of denoms and percentages of rewards to be allocated", - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." - } - }, - "epochs": { - "title": "epochs defines the number of remaining epochs for the incentive", - "type": "integer", - "format": "int64" - }, - "start_time": { - "title": "start_time of the incentive distribution", - "type": "string", - "format": "date-time" - }, - "total_gas": { - "title": "total_gas is the cumulative gas spent by all gas meters of the incentive during the epoch", - "type": "string", - "format": "uint64" - } - } - } - }, - "description": "QueryIncentiveResponse is the response type for the Query/Incentive RPC\nmethod." - }, - "evmos.incentives.v1.QueryIncentivesResponse": { - "type": "object", - "properties": { - "incentives": { - "title": "incentives is a slice of all incentives", - "type": "array", - "items": { - "title": "Incentive defines an instance that organizes distribution conditions for a\ngiven smart contract", - "type": "object", - "properties": { - "contract": { - "title": "contract address of the smart contract to be incentivized", - "type": "string" - }, - "allocations": { - "title": "allocations is a slice of denoms and percentages of rewards to be allocated", - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." - } - }, - "epochs": { - "title": "epochs defines the number of remaining epochs for the incentive", - "type": "integer", - "format": "int64" - }, - "start_time": { - "title": "start_time of the incentive distribution", - "type": "string", - "format": "date-time" - }, - "total_gas": { - "title": "total_gas is the cumulative gas spent by all gas meters of the incentive during the epoch", - "type": "string", - "format": "uint64" - } - } - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QueryIncentivesResponse is the response type for the Query/Incentives RPC\nmethod." - }, - "evmos.incentives.v1.QueryParamsResponse": { - "type": "object", - "properties": { - "params": { - "title": "params are the incentives module parameters", - "type": "object", - "properties": { - "enable_incentives": { - "title": "enable_incentives is the parameter to enable incentives", - "type": "boolean" - }, - "allocation_limit": { - "title": "allocation_limit is the maximum percentage an incentive can allocate per denomination", - "type": "string" - }, - "incentives_epoch_identifier": { - "title": "incentives_epoch_identifier for the epochs module hooks", - "type": "string" - }, - "reward_scaler": { - "title": "reward_scaler is the scaling factor for capping rewards", - "type": "string" - } - } - } - }, - "description": "QueryParamsResponse is the response type for the Query/Params RPC\nmethod." - }, - "evmos.inflation.v1.ExponentialCalculation": { - "title": "ExponentialCalculation holds factors to calculate exponential inflation on\neach period. Calculation reference:\nperiodProvision = exponentialDecay * bondingIncentive\nf(x) = (a * (1 - r) ^ x + c) * (1 + max_variance - bondedRatio *\n(max_variance / bonding_target))", - "type": "object", - "properties": { - "a": { - "title": "a defines the initial value", - "type": "string" - }, - "r": { - "title": "r defines the reduction factor", - "type": "string" - }, - "c": { - "title": "c defines the parameter for long term inflation", - "type": "string" - }, - "bonding_target": { - "title": "bonding_target", - "type": "string" - }, - "max_variance": { - "title": "max_variance", - "type": "string" - } - } - }, - "evmos.inflation.v1.InflationDistribution": { - "title": "InflationDistribution defines the distribution in which inflation is\nallocated through minting on each epoch (staking, incentives, community). It\nexcludes the team vesting distribution, as this is minted once at genesis.\nThe initial InflationDistribution can be calculated from the Evmos Token\nModel like this:\nmintDistribution1 = distribution1 / (1 - teamVestingDistribution)\n0.5333333 = 40% / (1 - 25%)", - "type": "object", - "properties": { - "staking_rewards": { - "title": "staking_rewards defines the proportion of the minted minted_denom that is\nto be allocated as staking rewards", - "type": "string" - }, - "usage_incentives": { - "title": "usage_incentives defines the proportion of the minted minted_denom that is\nto be allocated to the incentives module address", - "type": "string" - }, - "community_pool": { - "title": "community_pool defines the proportion of the minted minted_denom that is to\nbe allocated to the community pool", - "type": "string" - } - } - }, - "evmos.inflation.v1.Params": { - "type": "object", - "properties": { - "mint_denom": { - "title": "mint_denom specifies the type of coin to mint", - "type": "string" - }, - "exponential_calculation": { - "title": "exponential_calculation takes in the variables to calculate exponential inflation", - "type": "object", - "properties": { - "a": { - "title": "a defines the initial value", - "type": "string" - }, - "r": { - "title": "r defines the reduction factor", - "type": "string" - }, - "c": { - "title": "c defines the parameter for long term inflation", - "type": "string" - }, - "bonding_target": { - "title": "bonding_target", - "type": "string" - }, - "max_variance": { - "title": "max_variance", - "type": "string" - } - } - }, - "inflation_distribution": { - "title": "inflation_distribution of the minted denom", - "type": "object", - "properties": { - "staking_rewards": { - "title": "staking_rewards defines the proportion of the minted minted_denom that is\nto be allocated as staking rewards", - "type": "string" - }, - "usage_incentives": { - "title": "usage_incentives defines the proportion of the minted minted_denom that is\nto be allocated to the incentives module address", - "type": "string" - }, - "community_pool": { - "title": "community_pool defines the proportion of the minted minted_denom that is to\nbe allocated to the community pool", - "type": "string" - } - } - }, - "enable_inflation": { - "title": "enable_inflation is the parameter that enables inflation and halts increasing the skipped_epochs", - "type": "boolean" - } - }, - "description": "Params holds parameters for the inflation module." - }, - "evmos.inflation.v1.QueryCirculatingSupplyResponse": { - "type": "object", - "properties": { - "circulating_supply": { - "title": "circulating_supply is the total amount of coins in circulation", - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." - } - }, - "description": "QueryCirculatingSupplyResponse is the response type for the\nQuery/CirculatingSupply RPC method." - }, - "evmos.inflation.v1.QueryEpochMintProvisionResponse": { - "type": "object", - "properties": { - "epoch_mint_provision": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "epoch_mint_provision is the current minting per epoch provision value." - } - }, - "description": "QueryEpochMintProvisionResponse is the response type for the\nQuery/EpochMintProvision RPC method." - }, - "evmos.inflation.v1.QueryInflationRateResponse": { - "type": "object", - "properties": { - "inflation_rate": { - "title": "inflation_rate by which the total supply increases within one period", - "type": "string" - } - }, - "description": "QueryInflationRateResponse is the response type for the Query/InflationRate\nRPC method." - }, - "evmos.inflation.v1.QueryParamsResponse": { - "type": "object", - "properties": { - "params": { - "type": "object", - "properties": { - "mint_denom": { - "title": "mint_denom specifies the type of coin to mint", - "type": "string" - }, - "exponential_calculation": { - "title": "exponential_calculation takes in the variables to calculate exponential inflation", - "type": "object", - "properties": { - "a": { - "title": "a defines the initial value", - "type": "string" - }, - "r": { - "title": "r defines the reduction factor", - "type": "string" - }, - "c": { - "title": "c defines the parameter for long term inflation", - "type": "string" - }, - "bonding_target": { - "title": "bonding_target", - "type": "string" - }, - "max_variance": { - "title": "max_variance", - "type": "string" - } - } - }, - "inflation_distribution": { - "title": "inflation_distribution of the minted denom", - "type": "object", - "properties": { - "staking_rewards": { - "title": "staking_rewards defines the proportion of the minted minted_denom that is\nto be allocated as staking rewards", - "type": "string" - }, - "usage_incentives": { - "title": "usage_incentives defines the proportion of the minted minted_denom that is\nto be allocated to the incentives module address", - "type": "string" - }, - "community_pool": { - "title": "community_pool defines the proportion of the minted minted_denom that is to\nbe allocated to the community pool", - "type": "string" - } - } - }, - "enable_inflation": { - "title": "enable_inflation is the parameter that enables inflation and halts increasing the skipped_epochs", - "type": "boolean" - } - }, - "description": "params defines the parameters of the module." - } - }, - "description": "QueryParamsResponse is the response type for the Query/Params RPC method." - }, - "evmos.inflation.v1.QueryPeriodResponse": { - "type": "object", - "properties": { - "period": { - "type": "string", - "description": "period is the current minting per epoch provision value.", - "format": "uint64" - } - }, - "description": "QueryPeriodResponse is the response type for the Query/Period RPC method." - }, - "evmos.inflation.v1.QuerySkippedEpochsResponse": { - "type": "object", - "properties": { - "skipped_epochs": { - "type": "string", - "description": "skipped_epochs is the number of epochs that the inflation module has been disabled.", - "format": "uint64" - } - }, - "description": "QuerySkippedEpochsResponse is the response type for the Query/SkippedEpochs\nRPC method." - }, - "evmos.vesting.v1.QueryBalancesResponse": { - "type": "object", - "properties": { - "locked": { - "title": "locked defines the current amount of locked tokens", - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "unvested": { - "title": "unvested defines the current amount of unvested tokens", - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "vested": { - "title": "vested defines the current amount of vested tokens", - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - } - }, - "description": "QueryBalancesResponse is the response type for the Query/Balances RPC\nmethod." - }, - "evmos.recovery.v1.Params": { - "title": "Params holds parameters for the recovery module", - "type": "object", - "properties": { - "enable_recovery": { - "title": "enable_recovery IBC middleware", - "type": "boolean" - }, - "packet_timeout_duration": { - "title": "packet_timeout_duration is the duration added to timeout timestamp for balances recovered via IBC packets", - "type": "string" - } - } - }, - "evmos.recovery.v1.QueryParamsResponse": { - "type": "object", - "properties": { - "params": { - "title": "Params holds parameters for the recovery module", - "type": "object", - "properties": { - "enable_recovery": { - "title": "enable_recovery IBC middleware", - "type": "boolean" - }, - "packet_timeout_duration": { - "title": "packet_timeout_duration is the duration added to timeout timestamp for balances recovered via IBC packets", - "type": "string" - } - }, - "description": "params defines the parameters of the module." - } - }, - "description": "QueryParamsResponse is the response type for the Query/Params RPC method." - }, - "evmos.revenue.v1.Params": { - "title": "Params defines the revenue module params", - "type": "object", - "properties": { - "enable_revenue": { - "title": "enable_revenue defines a parameter to enable the revenue module", - "type": "boolean" - }, - "developer_shares": { - "title": "developer_shares defines the proportion of the transaction fees to be\ndistributed to the registered contract owner", - "type": "string" - }, - "addr_derivation_cost_create": { - "title": "addr_derivation_cost_create defines the cost of address derivation for\nverifying the contract deployer at fee registration", - "type": "string", - "format": "uint64" - } - } - }, - "evmos.revenue.v1.QueryDeployerRevenuesResponse": { - "type": "object", - "properties": { - "contract_addresses": { - "title": "contract_addresses is the slice of registered contract addresses for a deployer", - "type": "array", - "items": { - "type": "string" - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QueryDeployerRevenuesResponse is the response type for the\nQuery/DeployerRevenues RPC method." - }, - "evmos.revenue.v1.QueryParamsResponse": { - "type": "object", - "properties": { - "params": { - "title": "params is the returned revenue parameter", - "type": "object", - "properties": { - "enable_revenue": { - "title": "enable_revenue defines a parameter to enable the revenue module", - "type": "boolean" - }, - "developer_shares": { - "title": "developer_shares defines the proportion of the transaction fees to be\ndistributed to the registered contract owner", - "type": "string" - }, - "addr_derivation_cost_create": { - "title": "addr_derivation_cost_create defines the cost of address derivation for\nverifying the contract deployer at fee registration", - "type": "string", - "format": "uint64" - } - } - } - }, - "description": "QueryParamsResponse is the response type for the Query/Params RPC method." - }, - "evmos.revenue.v1.QueryRevenueResponse": { - "type": "object", - "properties": { - "revenue": { - "title": "Revenue defines an instance that organizes fee distribution conditions for\nthe owner of a given smart contract", - "type": "object", - "properties": { - "contract_address": { - "title": "contract_address is the hex address of a registered contract", - "type": "string" - }, - "deployer_address": { - "title": "deployer_address is the bech32 address of message sender. It must be the same as the origin EOA\nsending the transaction which deploys the contract", - "type": "string" - }, - "withdrawer_address": { - "title": "withdrawer_address is the bech32 address of account receiving the transaction fees it defaults to\ndeployer_address", - "type": "string" - } - } - } - }, - "description": "QueryRevenueResponse is the response type for the Query/Revenue RPC method." - }, - "evmos.revenue.v1.QueryRevenuesResponse": { - "type": "object", - "properties": { - "revenues": { - "title": "revenues is a slice of all stored Reveneue", - "type": "array", - "items": { - "title": "Revenue defines an instance that organizes fee distribution conditions for\nthe owner of a given smart contract", - "type": "object", - "properties": { - "contract_address": { - "title": "contract_address is the hex address of a registered contract", - "type": "string" - }, - "deployer_address": { - "title": "deployer_address is the bech32 address of message sender. It must be the same as the origin EOA\nsending the transaction which deploys the contract", - "type": "string" - }, - "withdrawer_address": { - "title": "withdrawer_address is the bech32 address of account receiving the transaction fees it defaults to\ndeployer_address", - "type": "string" - } - } - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QueryRevenuesResponse is the response type for the Query/Revenues RPC method." - }, - "evmos.revenue.v1.QueryWithdrawerRevenuesResponse": { - "type": "object", - "properties": { - "contract_addresses": { - "title": "contract_addresses is the slice of registered contract addresses for a withdrawer", - "type": "array", - "items": { - "type": "string" - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QueryWithdrawerRevenuesResponse is the response type for the\nQuery/WithdrawerRevenues RPC method." - }, - "evmos.revenue.v1.Revenue": { - "title": "Revenue defines an instance that organizes fee distribution conditions for\nthe owner of a given smart contract", - "type": "object", - "properties": { - "contract_address": { - "title": "contract_address is the hex address of a registered contract", - "type": "string" - }, - "deployer_address": { - "title": "deployer_address is the bech32 address of message sender. It must be the same as the origin EOA\nsending the transaction which deploys the contract", - "type": "string" - }, - "withdrawer_address": { - "title": "withdrawer_address is the bech32 address of account receiving the transaction fees it defaults to\ndeployer_address", - "type": "string" - } - } - }, - "ethermint.evm.v1.ChainConfig": { - "type": "object", - "properties": { - "homestead_block": { - "title": "homestead_block switch (nil no fork, 0 = already homestead)", - "type": "string" - }, - "dao_fork_block": { - "title": "dao_fork_block corresponds to TheDAO hard-fork switch block (nil no fork)", - "type": "string" - }, - "dao_fork_support": { - "title": "dao_fork_support defines whether the nodes supports or opposes the DAO hard-fork", - "type": "boolean" - }, - "eip150_block": { - "title": "eip150_block: EIP150 implements the Gas price changes\n(https://github.com/ethereum/EIPs/issues/150) EIP150 HF block (nil no fork)", - "type": "string" - }, - "eip150_hash": { - "title": "eip150_hash: EIP150 HF hash (needed for header only clients as only gas pricing changed)", - "type": "string" - }, - "eip155_block": { - "title": "eip155_block: EIP155Block HF block", - "type": "string" - }, - "eip158_block": { - "title": "eip158_block: EIP158 HF block", - "type": "string" - }, - "byzantium_block": { - "title": "byzantium_block: Byzantium switch block (nil no fork, 0 = already on byzantium)", - "type": "string" - }, - "constantinople_block": { - "title": "constantinople_block: Constantinople switch block (nil no fork, 0 = already activated)", - "type": "string" - }, - "petersburg_block": { - "title": "petersburg_block: Petersburg switch block (nil same as Constantinople)", - "type": "string" - }, - "istanbul_block": { - "title": "istanbul_block: Istanbul switch block (nil no fork, 0 = already on istanbul)", - "type": "string" - }, - "muir_glacier_block": { - "title": "muir_glacier_block: Eip-2384 (bomb delay) switch block (nil no fork, 0 = already activated)", - "type": "string" - }, - "berlin_block": { - "title": "berlin_block: Berlin switch block (nil = no fork, 0 = already on berlin)", - "type": "string" - }, - "london_block": { - "title": "london_block: London switch block (nil = no fork, 0 = already on london)", - "type": "string" - }, - "arrow_glacier_block": { - "title": "arrow_glacier_block: Eip-4345 (bomb delay) switch block (nil = no fork, 0 = already activated)", - "type": "string" - }, - "gray_glacier_block": { - "title": "gray_glacier_block: EIP-5133 (bomb delay) switch block (nil = no fork, 0 = already activated)", - "type": "string" - }, - "merge_netsplit_block": { - "title": "merge_netsplit_block: Virtual fork after The Merge to use as a network splitter", - "type": "string" - }, - "shanghai_block": { - "title": "shanghai_block switch block (nil = no fork, 0 = already on shanghai)", - "type": "string" - }, - "cancun_block": { - "title": "cancun_block switch block (nil = no fork, 0 = already on cancun)", - "type": "string" - } - }, - "description": "ChainConfig defines the Ethereum ChainConfig parameters using *sdk.Int values\ninstead of *big.Int." - }, - "ethermint.evm.v1.EstimateGasResponse": { - "title": "EstimateGasResponse defines EstimateGas response", - "type": "object", - "properties": { - "gas": { - "title": "gas returns the estimated gas", - "type": "string", - "format": "uint64" - } - } - }, - "ethermint.evm.v1.Log": { - "type": "object", - "properties": { - "address": { - "title": "address of the contract that generated the event", - "type": "string" - }, - "topics": { - "type": "array", - "description": "topics is a list of topics provided by the contract.", - "items": { - "type": "string" - } - }, - "data": { - "title": "data which is supplied by the contract, usually ABI-encoded", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "block_number": { - "title": "block_number of the block in which the transaction was included", - "type": "string", - "format": "uint64" - }, - "tx_hash": { - "title": "tx_hash is the transaction hash", - "type": "string" - }, - "tx_index": { - "title": "tx_index of the transaction in the block", - "type": "string", - "format": "uint64" - }, - "block_hash": { - "title": "block_hash of the block in which the transaction was included", - "type": "string" - }, - "index": { - "title": "index of the log in the block", - "type": "string", - "format": "uint64" - }, - "removed": { - "type": "boolean", - "description": "removed is true if this log was reverted due to a chain\nreorganisation. You must pay attention to this field if you receive logs\nthrough a filter query." - } - }, - "description": "Log represents an protobuf compatible Ethereum Log that defines a contract\nlog event. These events are generated by the LOG opcode and stored/indexed by\nthe node.\n\nNOTE: address, topics and data are consensus fields. The rest of the fields\nare derived, i.e. filled in by the nodes, but not secured by consensus." - }, - "ethermint.evm.v1.MsgEthereumTx": { - "type": "object", - "properties": { - "data": { - "title": "data is inner transaction data of the Ethereum transaction", - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "size": { - "title": "size is the encoded storage size of the transaction (DEPRECATED)", - "type": "number", - "format": "double" - }, - "hash": { - "title": "hash of the transaction in hex format", - "type": "string" - }, - "from": { - "title": "from is the ethereum signer address in hex format. This address value is checked\nagainst the address derived from the signature (V, R, S) using the\nsecp256k1 elliptic curve", - "type": "string" - } - }, - "description": "MsgEthereumTx encapsulates an Ethereum transaction as an SDK message." - }, - "ethermint.evm.v1.MsgEthereumTxResponse": { - "type": "object", - "properties": { - "hash": { - "title": "hash of the ethereum transaction in hex format. This hash differs from the\nTendermint sha256 hash of the transaction bytes. See\nhttps://github.com/tendermint/tendermint/issues/6539 for reference", - "type": "string" - }, - "logs": { - "type": "array", - "description": "logs contains the transaction hash and the proto-compatible ethereum\nlogs.", - "items": { - "type": "object", - "properties": { - "address": { - "title": "address of the contract that generated the event", - "type": "string" - }, - "topics": { - "type": "array", - "description": "topics is a list of topics provided by the contract.", - "items": { - "type": "string" - } - }, - "data": { - "title": "data which is supplied by the contract, usually ABI-encoded", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "block_number": { - "title": "block_number of the block in which the transaction was included", - "type": "string", - "format": "uint64" - }, - "tx_hash": { - "title": "tx_hash is the transaction hash", - "type": "string" - }, - "tx_index": { - "title": "tx_index of the transaction in the block", - "type": "string", - "format": "uint64" - }, - "block_hash": { - "title": "block_hash of the block in which the transaction was included", - "type": "string" - }, - "index": { - "title": "index of the log in the block", - "type": "string", - "format": "uint64" - }, - "removed": { - "type": "boolean", - "description": "removed is true if this log was reverted due to a chain\nreorganisation. You must pay attention to this field if you receive logs\nthrough a filter query." - } - }, - "description": "Log represents an protobuf compatible Ethereum Log that defines a contract\nlog event. These events are generated by the LOG opcode and stored/indexed by\nthe node.\n\nNOTE: address, topics and data are consensus fields. The rest of the fields\nare derived, i.e. filled in by the nodes, but not secured by consensus." - } - }, - "ret": { - "title": "ret is the returned data from evm function (result or data supplied with revert\nopcode)", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "vm_error": { - "title": "vm_error is the error returned by vm execution", - "type": "string" - }, - "gas_used": { - "title": "gas_used specifies how much gas was consumed by the transaction", - "type": "string", - "format": "uint64" - } - }, - "description": "MsgEthereumTxResponse defines the Msg/EthereumTx response type." - }, - "ethermint.evm.v1.Params": { - "title": "Params defines the EVM module parameters", - "type": "object", - "properties": { - "evm_denom": { - "type": "string", - "description": "evm_denom represents the token denomination used to run the EVM state\ntransitions." - }, - "enable_create": { - "title": "enable_create toggles state transitions that use the vm.Create function", - "type": "boolean" - }, - "enable_call": { - "title": "enable_call toggles state transitions that use the vm.Call function", - "type": "boolean" - }, - "extra_eips": { - "title": "extra_eips defines the additional EIPs for the vm.Config", - "type": "array", - "items": { - "type": "string", - "format": "int64" - } - }, - "chain_config": { - "title": "chain_config defines the EVM chain configuration parameters", - "type": "object", - "properties": { - "homestead_block": { - "title": "homestead_block switch (nil no fork, 0 = already homestead)", - "type": "string" - }, - "dao_fork_block": { - "title": "dao_fork_block corresponds to TheDAO hard-fork switch block (nil no fork)", - "type": "string" - }, - "dao_fork_support": { - "title": "dao_fork_support defines whether the nodes supports or opposes the DAO hard-fork", - "type": "boolean" - }, - "eip150_block": { - "title": "eip150_block: EIP150 implements the Gas price changes\n(https://github.com/ethereum/EIPs/issues/150) EIP150 HF block (nil no fork)", - "type": "string" - }, - "eip150_hash": { - "title": "eip150_hash: EIP150 HF hash (needed for header only clients as only gas pricing changed)", - "type": "string" - }, - "eip155_block": { - "title": "eip155_block: EIP155Block HF block", - "type": "string" - }, - "eip158_block": { - "title": "eip158_block: EIP158 HF block", - "type": "string" - }, - "byzantium_block": { - "title": "byzantium_block: Byzantium switch block (nil no fork, 0 = already on byzantium)", - "type": "string" - }, - "constantinople_block": { - "title": "constantinople_block: Constantinople switch block (nil no fork, 0 = already activated)", - "type": "string" - }, - "petersburg_block": { - "title": "petersburg_block: Petersburg switch block (nil same as Constantinople)", - "type": "string" - }, - "istanbul_block": { - "title": "istanbul_block: Istanbul switch block (nil no fork, 0 = already on istanbul)", - "type": "string" - }, - "muir_glacier_block": { - "title": "muir_glacier_block: Eip-2384 (bomb delay) switch block (nil no fork, 0 = already activated)", - "type": "string" - }, - "berlin_block": { - "title": "berlin_block: Berlin switch block (nil = no fork, 0 = already on berlin)", - "type": "string" - }, - "london_block": { - "title": "london_block: London switch block (nil = no fork, 0 = already on london)", - "type": "string" - }, - "arrow_glacier_block": { - "title": "arrow_glacier_block: Eip-4345 (bomb delay) switch block (nil = no fork, 0 = already activated)", - "type": "string" - }, - "gray_glacier_block": { - "title": "gray_glacier_block: EIP-5133 (bomb delay) switch block (nil = no fork, 0 = already activated)", - "type": "string" - }, - "merge_netsplit_block": { - "title": "merge_netsplit_block: Virtual fork after The Merge to use as a network splitter", - "type": "string" - }, - "shanghai_block": { - "title": "shanghai_block switch block (nil = no fork, 0 = already on shanghai)", - "type": "string" - }, - "cancun_block": { - "title": "cancun_block switch block (nil = no fork, 0 = already on cancun)", - "type": "string" - } - }, - "description": "ChainConfig defines the Ethereum ChainConfig parameters using *sdk.Int values\ninstead of *big.Int." - }, - "allow_unprotected_txs": { - "type": "boolean", - "description": "allow_unprotected_txs defines if replay-protected (i.e non EIP155\nsigned) transactions can be executed on the state machine." - }, - "active_precompiles": { - "title": "active_precompiles defines the slice of hex addresses of the precompiled\ncontracts that are active", - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "ethermint.evm.v1.QueryAccountResponse": { - "type": "object", - "properties": { - "balance": { - "type": "string", - "description": "balance is the balance of the EVM denomination." - }, - "code_hash": { - "type": "string", - "description": "code_hash is the hex-formatted code bytes from the EOA." - }, - "nonce": { - "type": "string", - "description": "nonce is the account's sequence number.", - "format": "uint64" - } - }, - "description": "QueryAccountResponse is the response type for the Query/Account RPC method." - }, - "ethermint.evm.v1.QueryBalanceResponse": { - "type": "object", - "properties": { - "balance": { - "type": "string", - "description": "balance is the balance of the EVM denomination." - } - }, - "description": "QueryBalanceResponse is the response type for the Query/Balance RPC method." - }, - "ethermint.evm.v1.QueryBaseFeeResponse": { - "type": "object", - "properties": { - "base_fee": { - "title": "base_fee is the EIP1559 base fee", - "type": "string" - } - }, - "description": "QueryBaseFeeResponse returns the EIP1559 base fee." - }, - "ethermint.evm.v1.QueryCodeResponse": { - "type": "object", - "properties": { - "code": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "code represents the code bytes from an ethereum address.", - "format": "byte" - } - }, - "description": "QueryCodeResponse is the response type for the Query/Code RPC\nmethod." - }, - "ethermint.evm.v1.QueryCosmosAccountResponse": { - "type": "object", - "properties": { - "cosmos_address": { - "type": "string", - "description": "cosmos_address is the cosmos address of the account." - }, - "sequence": { - "type": "string", - "description": "sequence is the account's sequence number.", - "format": "uint64" - }, - "account_number": { - "title": "account_number is the account number", - "type": "string", - "format": "uint64" - } - }, - "description": "QueryCosmosAccountResponse is the response type for the Query/CosmosAccount\nRPC method." - }, - "ethermint.evm.v1.QueryParamsResponse": { - "type": "object", - "properties": { - "params": { - "title": "Params defines the EVM module parameters", - "type": "object", - "properties": { - "evm_denom": { - "type": "string", - "description": "evm_denom represents the token denomination used to run the EVM state\ntransitions." - }, - "enable_create": { - "title": "enable_create toggles state transitions that use the vm.Create function", - "type": "boolean" - }, - "enable_call": { - "title": "enable_call toggles state transitions that use the vm.Call function", - "type": "boolean" - }, - "extra_eips": { - "title": "extra_eips defines the additional EIPs for the vm.Config", - "type": "array", - "items": { - "type": "string", - "format": "int64" - } - }, - "chain_config": { - "title": "chain_config defines the EVM chain configuration parameters", - "type": "object", - "properties": { - "homestead_block": { - "title": "homestead_block switch (nil no fork, 0 = already homestead)", - "type": "string" - }, - "dao_fork_block": { - "title": "dao_fork_block corresponds to TheDAO hard-fork switch block (nil no fork)", - "type": "string" - }, - "dao_fork_support": { - "title": "dao_fork_support defines whether the nodes supports or opposes the DAO hard-fork", - "type": "boolean" - }, - "eip150_block": { - "title": "eip150_block: EIP150 implements the Gas price changes\n(https://github.com/ethereum/EIPs/issues/150) EIP150 HF block (nil no fork)", - "type": "string" - }, - "eip150_hash": { - "title": "eip150_hash: EIP150 HF hash (needed for header only clients as only gas pricing changed)", - "type": "string" - }, - "eip155_block": { - "title": "eip155_block: EIP155Block HF block", - "type": "string" - }, - "eip158_block": { - "title": "eip158_block: EIP158 HF block", - "type": "string" - }, - "byzantium_block": { - "title": "byzantium_block: Byzantium switch block (nil no fork, 0 = already on byzantium)", - "type": "string" - }, - "constantinople_block": { - "title": "constantinople_block: Constantinople switch block (nil no fork, 0 = already activated)", - "type": "string" - }, - "petersburg_block": { - "title": "petersburg_block: Petersburg switch block (nil same as Constantinople)", - "type": "string" - }, - "istanbul_block": { - "title": "istanbul_block: Istanbul switch block (nil no fork, 0 = already on istanbul)", - "type": "string" - }, - "muir_glacier_block": { - "title": "muir_glacier_block: Eip-2384 (bomb delay) switch block (nil no fork, 0 = already activated)", - "type": "string" - }, - "berlin_block": { - "title": "berlin_block: Berlin switch block (nil = no fork, 0 = already on berlin)", - "type": "string" - }, - "london_block": { - "title": "london_block: London switch block (nil = no fork, 0 = already on london)", - "type": "string" - }, - "arrow_glacier_block": { - "title": "arrow_glacier_block: Eip-4345 (bomb delay) switch block (nil = no fork, 0 = already activated)", - "type": "string" - }, - "gray_glacier_block": { - "title": "gray_glacier_block: EIP-5133 (bomb delay) switch block (nil = no fork, 0 = already activated)", - "type": "string" - }, - "merge_netsplit_block": { - "title": "merge_netsplit_block: Virtual fork after The Merge to use as a network splitter", - "type": "string" - }, - "shanghai_block": { - "title": "shanghai_block switch block (nil = no fork, 0 = already on shanghai)", - "type": "string" - }, - "cancun_block": { - "title": "cancun_block switch block (nil = no fork, 0 = already on cancun)", - "type": "string" - } - }, - "description": "ChainConfig defines the Ethereum ChainConfig parameters using *sdk.Int values\ninstead of *big.Int." - }, - "allow_unprotected_txs": { - "type": "boolean", - "description": "allow_unprotected_txs defines if replay-protected (i.e non EIP155\nsigned) transactions can be executed on the state machine." - }, - "active_precompiles": { - "title": "active_precompiles defines the slice of hex addresses of the precompiled\ncontracts that are active", - "type": "array", - "items": { - "type": "string" - } - } - }, - "description": "params define the evm module parameters." - } - }, - "description": "QueryParamsResponse defines the response type for querying x/evm parameters." - }, - "ethermint.evm.v1.QueryStorageResponse": { - "type": "object", - "properties": { - "value": { - "type": "string", - "description": "value defines the storage state value hash associated with the given key." - } - }, - "description": "QueryStorageResponse is the response type for the Query/Storage RPC\nmethod." - }, - "ethermint.evm.v1.QueryTraceBlockResponse": { - "title": "QueryTraceBlockResponse defines TraceBlock response", - "type": "object", - "properties": { - "data": { - "title": "data is the response serialized in bytes", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - }, - "ethermint.evm.v1.QueryTraceTxResponse": { - "title": "QueryTraceTxResponse defines TraceTx response", - "type": "object", - "properties": { - "data": { - "title": "data is the response serialized in bytes", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - }, - "ethermint.evm.v1.QueryValidatorAccountResponse": { - "type": "object", - "properties": { - "account_address": { - "type": "string", - "description": "account_address is the cosmos address of the account in bech32 format." - }, - "sequence": { - "type": "string", - "description": "sequence is the account's sequence number.", - "format": "uint64" - }, - "account_number": { - "title": "account_number is the account number", - "type": "string", - "format": "uint64" - } - }, - "description": "QueryValidatorAccountResponse is the response type for the\nQuery/ValidatorAccount RPC method." - }, - "ethermint.evm.v1.TraceConfig": { - "type": "object", - "properties": { - "tracer": { - "title": "tracer is a custom javascript tracer", - "type": "string" - }, - "timeout": { - "title": "timeout overrides the default timeout of 5 seconds for JavaScript-based tracing\ncalls", - "type": "string" - }, - "reexec": { - "title": "reexec defines the number of blocks the tracer is willing to go back", - "type": "string", - "format": "uint64" - }, - "disable_stack": { - "title": "disable_stack switches stack capture", - "type": "boolean" - }, - "disable_storage": { - "title": "disable_storage switches storage capture", - "type": "boolean" - }, - "debug": { - "title": "debug can be used to print output during capture end", - "type": "boolean" - }, - "limit": { - "title": "limit defines the maximum length of output, but zero means unlimited", - "type": "integer", - "format": "int32" - }, - "overrides": { - "title": "overrides can be used to execute a trace using future fork rules", - "type": "object", - "properties": { - "homestead_block": { - "title": "homestead_block switch (nil no fork, 0 = already homestead)", - "type": "string" - }, - "dao_fork_block": { - "title": "dao_fork_block corresponds to TheDAO hard-fork switch block (nil no fork)", - "type": "string" - }, - "dao_fork_support": { - "title": "dao_fork_support defines whether the nodes supports or opposes the DAO hard-fork", - "type": "boolean" - }, - "eip150_block": { - "title": "eip150_block: EIP150 implements the Gas price changes\n(https://github.com/ethereum/EIPs/issues/150) EIP150 HF block (nil no fork)", - "type": "string" - }, - "eip150_hash": { - "title": "eip150_hash: EIP150 HF hash (needed for header only clients as only gas pricing changed)", - "type": "string" - }, - "eip155_block": { - "title": "eip155_block: EIP155Block HF block", - "type": "string" - }, - "eip158_block": { - "title": "eip158_block: EIP158 HF block", - "type": "string" - }, - "byzantium_block": { - "title": "byzantium_block: Byzantium switch block (nil no fork, 0 = already on byzantium)", - "type": "string" - }, - "constantinople_block": { - "title": "constantinople_block: Constantinople switch block (nil no fork, 0 = already activated)", - "type": "string" - }, - "petersburg_block": { - "title": "petersburg_block: Petersburg switch block (nil same as Constantinople)", - "type": "string" - }, - "istanbul_block": { - "title": "istanbul_block: Istanbul switch block (nil no fork, 0 = already on istanbul)", - "type": "string" - }, - "muir_glacier_block": { - "title": "muir_glacier_block: Eip-2384 (bomb delay) switch block (nil no fork, 0 = already activated)", - "type": "string" - }, - "berlin_block": { - "title": "berlin_block: Berlin switch block (nil = no fork, 0 = already on berlin)", - "type": "string" - }, - "london_block": { - "title": "london_block: London switch block (nil = no fork, 0 = already on london)", - "type": "string" - }, - "arrow_glacier_block": { - "title": "arrow_glacier_block: Eip-4345 (bomb delay) switch block (nil = no fork, 0 = already activated)", - "type": "string" - }, - "gray_glacier_block": { - "title": "gray_glacier_block: EIP-5133 (bomb delay) switch block (nil = no fork, 0 = already activated)", - "type": "string" - }, - "merge_netsplit_block": { - "title": "merge_netsplit_block: Virtual fork after The Merge to use as a network splitter", - "type": "string" - }, - "shanghai_block": { - "title": "shanghai_block switch block (nil = no fork, 0 = already on shanghai)", - "type": "string" - }, - "cancun_block": { - "title": "cancun_block switch block (nil = no fork, 0 = already on cancun)", - "type": "string" - } - }, - "description": "ChainConfig defines the Ethereum ChainConfig parameters using *sdk.Int values\ninstead of *big.Int." - }, - "enable_memory": { - "title": "enable_memory switches memory capture", - "type": "boolean" - }, - "enable_return_data": { - "title": "enable_return_data switches the capture of return data", - "type": "boolean" - }, - "tracer_json_config": { - "title": "tracer_json_config configures the tracer using a JSON string", - "type": "string" - } - }, - "description": "TraceConfig holds extra parameters to trace functions." - }, - "ethermint.feemarket.v1.Params": { - "title": "Params defines the EVM module parameters", - "type": "object", - "properties": { - "no_base_fee": { - "title": "no_base_fee forces the EIP-1559 base fee to 0 (needed for 0 price calls)", - "type": "boolean" - }, - "base_fee_change_denominator": { - "type": "integer", - "description": "base_fee_change_denominator bounds the amount the base fee can change\nbetween blocks.", - "format": "int64" - }, - "elasticity_multiplier": { - "type": "integer", - "description": "elasticity_multiplier bounds the maximum gas limit an EIP-1559 block may\nhave.", - "format": "int64" - }, - "enable_height": { - "type": "string", - "description": "enable_height defines at which block height the base fee calculation is enabled.", - "format": "int64" - }, - "base_fee": { - "type": "string", - "description": "base_fee for EIP-1559 blocks." - }, - "min_gas_price": { - "title": "min_gas_price defines the minimum gas price value for cosmos and eth transactions", - "type": "string" - }, - "min_gas_multiplier": { - "title": "min_gas_multiplier bounds the minimum gas used to be charged\nto senders based on gas limit", - "type": "string" - } - } - }, - "ethermint.feemarket.v1.QueryBaseFeeResponse": { - "type": "object", - "properties": { - "base_fee": { - "title": "base_fee is the EIP1559 base fee", - "type": "string" - } - }, - "description": "QueryBaseFeeResponse returns the EIP1559 base fee." - }, - "ethermint.feemarket.v1.QueryBlockGasResponse": { - "type": "object", - "properties": { - "gas": { - "title": "gas is the returned block gas", - "type": "string", - "format": "int64" - } - }, - "description": "QueryBlockGasResponse returns block gas used for a given height." - }, - "ethermint.feemarket.v1.QueryParamsResponse": { - "type": "object", - "properties": { - "params": { - "title": "Params defines the EVM module parameters", - "type": "object", - "properties": { - "no_base_fee": { - "title": "no_base_fee forces the EIP-1559 base fee to 0 (needed for 0 price calls)", - "type": "boolean" - }, - "base_fee_change_denominator": { - "type": "integer", - "description": "base_fee_change_denominator bounds the amount the base fee can change\nbetween blocks.", - "format": "int64" - }, - "elasticity_multiplier": { - "type": "integer", - "description": "elasticity_multiplier bounds the maximum gas limit an EIP-1559 block may\nhave.", - "format": "int64" - }, - "enable_height": { - "type": "string", - "description": "enable_height defines at which block height the base fee calculation is enabled.", - "format": "int64" - }, - "base_fee": { - "type": "string", - "description": "base_fee for EIP-1559 blocks." - }, - "min_gas_price": { - "title": "min_gas_price defines the minimum gas price value for cosmos and eth transactions", - "type": "string" - }, - "min_gas_multiplier": { - "title": "min_gas_multiplier bounds the minimum gas used to be charged\nto senders based on gas limit", - "type": "string" - } - }, - "description": "params define the evm module parameters." - } - }, - "description": "QueryParamsResponse defines the response type for querying x/evm parameters." - }, - "ibc.applications.transfer.v1.DenomTrace": { - "type": "object", - "properties": { - "path": { - "type": "string", - "description": "path defines the chain of port/channel identifiers used for tracing the\nsource of the fungible token." - }, - "base_denom": { - "type": "string", - "description": "base denomination of the relayed fungible token." - } - }, - "description": "DenomTrace contains the base denomination for ICS20 fungible tokens and the\nsource tracing information path." - }, - "ibc.applications.transfer.v1.Params": { - "type": "object", - "properties": { - "send_enabled": { - "type": "boolean", - "description": "send_enabled enables or disables all cross-chain token transfers from this\nchain." - }, - "receive_enabled": { - "type": "boolean", - "description": "receive_enabled enables or disables all cross-chain token transfers to this\nchain." - } - }, - "description": "Params defines the set of IBC transfer parameters.\nNOTE: To prevent a single token from being transferred, set the\nTransfersEnabled parameter to true and then set the bank module's SendEnabled\nparameter for the denomination to false." - }, - "ibc.applications.transfer.v1.QueryDenomHashResponse": { - "type": "object", - "properties": { - "hash": { - "type": "string", - "description": "hash (in hex format) of the denomination trace information." - } - }, - "description": "QueryDenomHashResponse is the response type for the Query/DenomHash RPC\nmethod." - }, - "ibc.applications.transfer.v1.QueryDenomTraceResponse": { - "type": "object", - "properties": { - "denom_trace": { - "type": "object", - "properties": { - "path": { - "type": "string", - "description": "path defines the chain of port/channel identifiers used for tracing the\nsource of the fungible token." - }, - "base_denom": { - "type": "string", - "description": "base denomination of the relayed fungible token." - } - }, - "description": "DenomTrace contains the base denomination for ICS20 fungible tokens and the\nsource tracing information path." - } - }, - "description": "QueryDenomTraceResponse is the response type for the Query/DenomTrace RPC\nmethod." - }, - "ibc.applications.transfer.v1.QueryDenomTracesResponse": { - "type": "object", - "properties": { - "denom_traces": { - "type": "array", - "description": "denom_traces returns all denominations trace information.", - "items": { - "type": "object", - "properties": { - "path": { - "type": "string", - "description": "path defines the chain of port/channel identifiers used for tracing the\nsource of the fungible token." - }, - "base_denom": { - "type": "string", - "description": "base denomination of the relayed fungible token." - } - }, - "description": "DenomTrace contains the base denomination for ICS20 fungible tokens and the\nsource tracing information path." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QueryConnectionsResponse is the response type for the Query/DenomTraces RPC\nmethod." - }, - "ibc.applications.transfer.v1.QueryEscrowAddressResponse": { - "type": "object", - "properties": { - "escrow_address": { - "title": "the escrow account address", - "type": "string" - } - }, - "description": "QueryEscrowAddressResponse is the response type of the EscrowAddress RPC method." - }, - "ibc.applications.transfer.v1.QueryParamsResponse": { - "type": "object", - "properties": { - "params": { - "type": "object", - "properties": { - "send_enabled": { - "type": "boolean", - "description": "send_enabled enables or disables all cross-chain token transfers from this\nchain." - }, - "receive_enabled": { - "type": "boolean", - "description": "receive_enabled enables or disables all cross-chain token transfers to this\nchain." - } - }, - "description": "params defines the parameters of the module." - } - }, - "description": "QueryParamsResponse is the response type for the Query/Params RPC method." - }, - "ibc.applications.transfer.v1.QueryTotalEscrowForDenomResponse": { - "type": "object", - "properties": { - "amount": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "description": "QueryTotalEscrowForDenomResponse is the response type for TotalEscrowForDenom RPC method." - }, - "ibc.core.client.v1.ConsensusStateWithHeight": { - "type": "object", - "properties": { - "height": { - "title": "consensus state height", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - }, - "consensus_state": { - "title": "consensus state", - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - }, - "description": "ConsensusStateWithHeight defines a consensus state with an additional height\nfield." - }, - "ibc.core.client.v1.Height": { - "title": "Height is a monotonically increasing data type\nthat can be compared against another Height for the purposes of updating and\nfreezing clients", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - }, - "ibc.core.client.v1.IdentifiedClientState": { - "type": "object", - "properties": { - "client_id": { - "title": "client identifier", - "type": "string" - }, - "client_state": { - "title": "client state", - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - }, - "description": "IdentifiedClientState defines a client state with an additional client\nidentifier field." - }, - "ibc.core.client.v1.Params": { - "type": "object", - "properties": { - "allowed_clients": { - "type": "array", - "description": "allowed_clients defines the list of allowed client state types which can be created\nand interacted with. If a client type is removed from the allowed clients list, usage\nof this client will be disabled until it is added again to the list.", - "items": { - "type": "string" - } - } - }, - "description": "Params defines the set of IBC light client parameters." - }, - "ibc.core.client.v1.QueryClientParamsResponse": { - "type": "object", - "properties": { - "params": { - "type": "object", - "properties": { - "allowed_clients": { - "type": "array", - "description": "allowed_clients defines the list of allowed client state types which can be created\nand interacted with. If a client type is removed from the allowed clients list, usage\nof this client will be disabled until it is added again to the list.", - "items": { - "type": "string" - } - } - }, - "description": "params defines the parameters of the module." - } - }, - "description": "QueryClientParamsResponse is the response type for the Query/ClientParams RPC\nmethod." - }, - "ibc.core.client.v1.QueryClientStateResponse": { - "type": "object", - "properties": { - "client_state": { - "title": "client state associated with the request identifier", - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "proof": { - "title": "merkle proof of existence", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proof_height": { - "title": "height at which the proof was retrieved", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - } - }, - "description": "QueryClientStateResponse is the response type for the Query/ClientState RPC\nmethod. Besides the client state, it includes a proof and the height from\nwhich the proof was retrieved." - }, - "ibc.core.client.v1.QueryClientStatesResponse": { - "type": "object", - "properties": { - "client_states": { - "type": "array", - "description": "list of stored ClientStates of the chain.", - "items": { - "type": "object", - "properties": { - "client_id": { - "title": "client identifier", - "type": "string" - }, - "client_state": { - "title": "client state", - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - }, - "description": "IdentifiedClientState defines a client state with an additional client\nidentifier field." - } - }, - "pagination": { - "title": "pagination response", - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }" - } - }, - "description": "QueryClientStatesResponse is the response type for the Query/ClientStates RPC\nmethod." - }, - "ibc.core.client.v1.QueryClientStatusResponse": { - "type": "object", - "properties": { - "status": { - "type": "string" - } - }, - "description": "QueryClientStatusResponse is the response type for the Query/ClientStatus RPC\nmethod. It returns the current status of the IBC client." - }, - "ibc.core.client.v1.QueryConsensusStateHeightsResponse": { - "title": "QueryConsensusStateHeightsResponse is the response type for the\nQuery/ConsensusStateHeights RPC method", - "type": "object", - "properties": { - "consensus_state_heights": { - "title": "consensus state heights", - "type": "array", - "items": { - "title": "Height is a monotonically increasing data type\nthat can be compared against another Height for the purposes of updating and\nfreezing clients", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - } - }, - "pagination": { - "title": "pagination response", - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }" - } - } - }, - "ibc.core.client.v1.QueryConsensusStateResponse": { - "title": "QueryConsensusStateResponse is the response type for the Query/ConsensusState\nRPC method", - "type": "object", - "properties": { - "consensus_state": { - "title": "consensus state associated with the client identifier at the given height", - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "proof": { - "title": "merkle proof of existence", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proof_height": { - "title": "Height is a monotonically increasing data type\nthat can be compared against another Height for the purposes of updating and\nfreezing clients", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - } - } - }, - "ibc.core.client.v1.QueryConsensusStatesResponse": { - "title": "QueryConsensusStatesResponse is the response type for the\nQuery/ConsensusStates RPC method", - "type": "object", - "properties": { - "consensus_states": { - "title": "consensus states associated with the identifier", - "type": "array", - "items": { - "type": "object", - "properties": { - "height": { - "title": "consensus state height", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - }, - "consensus_state": { - "title": "consensus state", - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - }, - "description": "ConsensusStateWithHeight defines a consensus state with an additional height\nfield." - } - }, - "pagination": { - "title": "pagination response", - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }" - } - } - }, - "ibc.core.client.v1.QueryUpgradedClientStateResponse": { - "type": "object", - "properties": { - "upgraded_client_state": { - "title": "client state associated with the request identifier", - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - }, - "description": "QueryUpgradedClientStateResponse is the response type for the\nQuery/UpgradedClientState RPC method." - }, - "ibc.core.client.v1.QueryUpgradedConsensusStateResponse": { - "type": "object", - "properties": { - "upgraded_consensus_state": { - "title": "Consensus state associated with the request identifier", - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - }, - "description": "QueryUpgradedConsensusStateResponse is the response type for the\nQuery/UpgradedConsensusState RPC method." - }, - "ibc.core.commitment.v1.MerklePrefix": { - "title": "MerklePrefix is merkle path prefixed to the key.\nThe constructed key from the Path and the key will be append(Path.KeyPath,\nappend(Path.KeyPrefix, key...))", - "type": "object", - "properties": { - "key_prefix": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - }, - "ibc.core.connection.v1.ConnectionEnd": { - "type": "object", - "properties": { - "client_id": { - "type": "string", - "description": "client associated with this connection." - }, - "versions": { - "type": "array", - "description": "IBC version which can be utilised to determine encodings or protocols for\nchannels or packets utilising this connection.", - "items": { - "type": "object", - "properties": { - "identifier": { - "title": "unique version identifier", - "type": "string" - }, - "features": { - "title": "list of features compatible with the specified identifier", - "type": "array", - "items": { - "type": "string" - } - } - }, - "description": "Version defines the versioning scheme used to negotiate the IBC verison in\nthe connection handshake." - } - }, - "state": { - "type": "string", - "description": "current state of the connection end.", - "default": "STATE_UNINITIALIZED_UNSPECIFIED", - "enum": [ - "STATE_UNINITIALIZED_UNSPECIFIED", - "STATE_INIT", - "STATE_TRYOPEN", - "STATE_OPEN" - ] - }, - "counterparty": { - "type": "object", - "properties": { - "client_id": { - "type": "string", - "description": "identifies the client on the counterparty chain associated with a given\nconnection." - }, - "connection_id": { - "type": "string", - "description": "identifies the connection end on the counterparty chain associated with a\ngiven connection." - }, - "prefix": { - "title": "MerklePrefix is merkle path prefixed to the key.\nThe constructed key from the Path and the key will be append(Path.KeyPath,\nappend(Path.KeyPrefix, key...))", - "type": "object", - "properties": { - "key_prefix": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "commitment merkle prefix of the counterparty chain." - } - }, - "description": "counterparty chain associated with this connection." - }, - "delay_period": { - "type": "string", - "description": "delay period that must pass before a consensus state can be used for\npacket-verification NOTE: delay period logic is only implemented by some\nclients.", - "format": "uint64" - } - }, - "description": "ConnectionEnd defines a stateful object on a chain connected to another\nseparate one.\nNOTE: there must only be 2 defined ConnectionEnds to establish\na connection between two chains." - }, - "ibc.core.connection.v1.Counterparty": { - "type": "object", - "properties": { - "client_id": { - "type": "string", - "description": "identifies the client on the counterparty chain associated with a given\nconnection." - }, - "connection_id": { - "type": "string", - "description": "identifies the connection end on the counterparty chain associated with a\ngiven connection." - }, - "prefix": { - "title": "MerklePrefix is merkle path prefixed to the key.\nThe constructed key from the Path and the key will be append(Path.KeyPath,\nappend(Path.KeyPrefix, key...))", - "type": "object", - "properties": { - "key_prefix": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "commitment merkle prefix of the counterparty chain." - } - }, - "description": "Counterparty defines the counterparty chain associated with a connection end." - }, - "ibc.core.connection.v1.IdentifiedConnection": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "connection identifier." - }, - "client_id": { - "type": "string", - "description": "client associated with this connection." - }, - "versions": { - "title": "IBC version which can be utilised to determine encodings or protocols for\nchannels or packets utilising this connection", - "type": "array", - "items": { - "type": "object", - "properties": { - "identifier": { - "title": "unique version identifier", - "type": "string" - }, - "features": { - "title": "list of features compatible with the specified identifier", - "type": "array", - "items": { - "type": "string" - } - } - }, - "description": "Version defines the versioning scheme used to negotiate the IBC verison in\nthe connection handshake." - } - }, - "state": { - "type": "string", - "description": "current state of the connection end.", - "default": "STATE_UNINITIALIZED_UNSPECIFIED", - "enum": [ - "STATE_UNINITIALIZED_UNSPECIFIED", - "STATE_INIT", - "STATE_TRYOPEN", - "STATE_OPEN" - ] - }, - "counterparty": { - "type": "object", - "properties": { - "client_id": { - "type": "string", - "description": "identifies the client on the counterparty chain associated with a given\nconnection." - }, - "connection_id": { - "type": "string", - "description": "identifies the connection end on the counterparty chain associated with a\ngiven connection." - }, - "prefix": { - "title": "MerklePrefix is merkle path prefixed to the key.\nThe constructed key from the Path and the key will be append(Path.KeyPath,\nappend(Path.KeyPrefix, key...))", - "type": "object", - "properties": { - "key_prefix": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "commitment merkle prefix of the counterparty chain." - } - }, - "description": "counterparty chain associated with this connection." - }, - "delay_period": { - "type": "string", - "description": "delay period associated with this connection.", - "format": "uint64" - } - }, - "description": "IdentifiedConnection defines a connection with additional connection\nidentifier field." - }, - "ibc.core.connection.v1.Params": { - "type": "object", - "properties": { - "max_expected_time_per_block": { - "type": "string", - "description": "maximum expected time per block (in nanoseconds), used to enforce block delay. This parameter should reflect the\nlargest amount of time that the chain might reasonably take to produce the next block under normal operating\nconditions. A safe choice is 3-5x the expected time per block.", - "format": "uint64" - } - }, - "description": "Params defines the set of Connection parameters." - }, - "ibc.core.connection.v1.QueryClientConnectionsResponse": { - "title": "QueryClientConnectionsResponse is the response type for the\nQuery/ClientConnections RPC method", - "type": "object", - "properties": { - "connection_paths": { - "type": "array", - "description": "slice of all the connection paths associated with a client.", - "items": { - "type": "string" - } - }, - "proof": { - "title": "merkle proof of existence", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proof_height": { - "title": "height at which the proof was generated", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - } - } - }, - "ibc.core.connection.v1.QueryConnectionClientStateResponse": { - "title": "QueryConnectionClientStateResponse is the response type for the\nQuery/ConnectionClientState RPC method", - "type": "object", - "properties": { - "identified_client_state": { - "title": "client state associated with the channel", - "type": "object", - "properties": { - "client_id": { - "title": "client identifier", - "type": "string" - }, - "client_state": { - "title": "client state", - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - }, - "description": "IdentifiedClientState defines a client state with an additional client\nidentifier field." - }, - "proof": { - "title": "merkle proof of existence", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proof_height": { - "title": "height at which the proof was retrieved", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - } - } - }, - "ibc.core.connection.v1.QueryConnectionConsensusStateResponse": { - "title": "QueryConnectionConsensusStateResponse is the response type for the\nQuery/ConnectionConsensusState RPC method", - "type": "object", - "properties": { - "consensus_state": { - "title": "consensus state associated with the channel", - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "client_id": { - "title": "client ID associated with the consensus state", - "type": "string" - }, - "proof": { - "title": "merkle proof of existence", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proof_height": { - "title": "height at which the proof was retrieved", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - } - } - }, - "ibc.core.connection.v1.QueryConnectionParamsResponse": { - "type": "object", - "properties": { - "params": { - "type": "object", - "properties": { - "max_expected_time_per_block": { - "type": "string", - "description": "maximum expected time per block (in nanoseconds), used to enforce block delay. This parameter should reflect the\nlargest amount of time that the chain might reasonably take to produce the next block under normal operating\nconditions. A safe choice is 3-5x the expected time per block.", - "format": "uint64" - } - }, - "description": "params defines the parameters of the module." - } - }, - "description": "QueryConnectionParamsResponse is the response type for the Query/ConnectionParams RPC method." - }, - "ibc.core.connection.v1.QueryConnectionResponse": { - "type": "object", - "properties": { - "connection": { - "title": "connection associated with the request identifier", - "type": "object", - "properties": { - "client_id": { - "type": "string", - "description": "client associated with this connection." - }, - "versions": { - "type": "array", - "description": "IBC version which can be utilised to determine encodings or protocols for\nchannels or packets utilising this connection.", - "items": { - "type": "object", - "properties": { - "identifier": { - "title": "unique version identifier", - "type": "string" - }, - "features": { - "title": "list of features compatible with the specified identifier", - "type": "array", - "items": { - "type": "string" - } - } - }, - "description": "Version defines the versioning scheme used to negotiate the IBC verison in\nthe connection handshake." - } - }, - "state": { - "type": "string", - "description": "current state of the connection end.", - "default": "STATE_UNINITIALIZED_UNSPECIFIED", - "enum": [ - "STATE_UNINITIALIZED_UNSPECIFIED", - "STATE_INIT", - "STATE_TRYOPEN", - "STATE_OPEN" - ] - }, - "counterparty": { - "type": "object", - "properties": { - "client_id": { - "type": "string", - "description": "identifies the client on the counterparty chain associated with a given\nconnection." - }, - "connection_id": { - "type": "string", - "description": "identifies the connection end on the counterparty chain associated with a\ngiven connection." - }, - "prefix": { - "title": "MerklePrefix is merkle path prefixed to the key.\nThe constructed key from the Path and the key will be append(Path.KeyPath,\nappend(Path.KeyPrefix, key...))", - "type": "object", - "properties": { - "key_prefix": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "commitment merkle prefix of the counterparty chain." - } - }, - "description": "counterparty chain associated with this connection." - }, - "delay_period": { - "type": "string", - "description": "delay period that must pass before a consensus state can be used for\npacket-verification NOTE: delay period logic is only implemented by some\nclients.", - "format": "uint64" - } - }, - "description": "ConnectionEnd defines a stateful object on a chain connected to another\nseparate one.\nNOTE: there must only be 2 defined ConnectionEnds to establish\na connection between two chains." - }, - "proof": { - "title": "merkle proof of existence", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proof_height": { - "title": "height at which the proof was retrieved", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - } - }, - "description": "QueryConnectionResponse is the response type for the Query/Connection RPC\nmethod. Besides the connection end, it includes a proof and the height from\nwhich the proof was retrieved." - }, - "ibc.core.connection.v1.QueryConnectionsResponse": { - "type": "object", - "properties": { - "connections": { - "type": "array", - "description": "list of stored connections of the chain.", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "connection identifier." - }, - "client_id": { - "type": "string", - "description": "client associated with this connection." - }, - "versions": { - "title": "IBC version which can be utilised to determine encodings or protocols for\nchannels or packets utilising this connection", - "type": "array", - "items": { - "type": "object", - "properties": { - "identifier": { - "title": "unique version identifier", - "type": "string" - }, - "features": { - "title": "list of features compatible with the specified identifier", - "type": "array", - "items": { - "type": "string" - } - } - }, - "description": "Version defines the versioning scheme used to negotiate the IBC verison in\nthe connection handshake." - } - }, - "state": { - "type": "string", - "description": "current state of the connection end.", - "default": "STATE_UNINITIALIZED_UNSPECIFIED", - "enum": [ - "STATE_UNINITIALIZED_UNSPECIFIED", - "STATE_INIT", - "STATE_TRYOPEN", - "STATE_OPEN" - ] - }, - "counterparty": { - "type": "object", - "properties": { - "client_id": { - "type": "string", - "description": "identifies the client on the counterparty chain associated with a given\nconnection." - }, - "connection_id": { - "type": "string", - "description": "identifies the connection end on the counterparty chain associated with a\ngiven connection." - }, - "prefix": { - "title": "MerklePrefix is merkle path prefixed to the key.\nThe constructed key from the Path and the key will be append(Path.KeyPath,\nappend(Path.KeyPrefix, key...))", - "type": "object", - "properties": { - "key_prefix": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "commitment merkle prefix of the counterparty chain." - } - }, - "description": "counterparty chain associated with this connection." - }, - "delay_period": { - "type": "string", - "description": "delay period associated with this connection.", - "format": "uint64" - } - }, - "description": "IdentifiedConnection defines a connection with additional connection\nidentifier field." - } - }, - "pagination": { - "title": "pagination response", - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }" - }, - "height": { - "title": "query block height", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - } - }, - "description": "QueryConnectionsResponse is the response type for the Query/Connections RPC\nmethod." - }, - "ibc.core.connection.v1.State": { - "type": "string", - "description": "State defines if a connection is in one of the following states:\nINIT, TRYOPEN, OPEN or UNINITIALIZED.\n\n - STATE_UNINITIALIZED_UNSPECIFIED: Default State\n - STATE_INIT: A connection end has just started the opening handshake.\n - STATE_TRYOPEN: A connection end has acknowledged the handshake step on the counterparty\nchain.\n - STATE_OPEN: A connection end has completed the handshake.", - "default": "STATE_UNINITIALIZED_UNSPECIFIED", - "enum": [ - "STATE_UNINITIALIZED_UNSPECIFIED", - "STATE_INIT", - "STATE_TRYOPEN", - "STATE_OPEN" - ] - }, - "ibc.core.connection.v1.Version": { - "type": "object", - "properties": { - "identifier": { - "title": "unique version identifier", - "type": "string" - }, - "features": { - "title": "list of features compatible with the specified identifier", - "type": "array", - "items": { - "type": "string" - } - } - }, - "description": "Version defines the versioning scheme used to negotiate the IBC verison in\nthe connection handshake." - }, - "ibc.core.channel.v1.Channel": { - "type": "object", - "properties": { - "state": { - "title": "current state of the channel end", - "type": "string", - "description": "State defines if a channel is in one of the following states:\nCLOSED, INIT, TRYOPEN, OPEN or UNINITIALIZED.\n\n - STATE_UNINITIALIZED_UNSPECIFIED: Default State\n - STATE_INIT: A channel has just started the opening handshake.\n - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain.\n - STATE_OPEN: A channel has completed the handshake. Open channels are\nready to send and receive packets.\n - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive\npackets.", - "default": "STATE_UNINITIALIZED_UNSPECIFIED", - "enum": [ - "STATE_UNINITIALIZED_UNSPECIFIED", - "STATE_INIT", - "STATE_TRYOPEN", - "STATE_OPEN", - "STATE_CLOSED" - ] - }, - "ordering": { - "title": "whether the channel is ordered or unordered", - "type": "string", - "description": "- ORDER_NONE_UNSPECIFIED: zero-value for channel ordering\n - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in\nwhich they were sent.\n - ORDER_ORDERED: packets are delivered exactly in the order which they were sent", - "default": "ORDER_NONE_UNSPECIFIED", - "enum": [ - "ORDER_NONE_UNSPECIFIED", - "ORDER_UNORDERED", - "ORDER_ORDERED" - ] - }, - "counterparty": { - "title": "counterparty channel end", - "type": "object", - "properties": { - "port_id": { - "type": "string", - "description": "port on the counterparty chain which owns the other end of the channel." - }, - "channel_id": { - "title": "channel end on the counterparty chain", - "type": "string" - } - } - }, - "connection_hops": { - "title": "list of connection identifiers, in order, along which packets sent on\nthis channel will travel", - "type": "array", - "items": { - "type": "string" - } - }, - "version": { - "title": "opaque channel version, which is agreed upon during the handshake", - "type": "string" - } - }, - "description": "Channel defines pipeline for exactly-once packet delivery between specific\nmodules on separate blockchains, which has at least one end capable of\nsending packets and one end capable of receiving packets." - }, - "ibc.core.channel.v1.Counterparty": { - "title": "Counterparty defines a channel end counterparty", - "type": "object", - "properties": { - "port_id": { - "type": "string", - "description": "port on the counterparty chain which owns the other end of the channel." - }, - "channel_id": { - "title": "channel end on the counterparty chain", - "type": "string" - } - } - }, - "ibc.core.channel.v1.IdentifiedChannel": { - "type": "object", - "properties": { - "state": { - "title": "current state of the channel end", - "type": "string", - "description": "State defines if a channel is in one of the following states:\nCLOSED, INIT, TRYOPEN, OPEN or UNINITIALIZED.\n\n - STATE_UNINITIALIZED_UNSPECIFIED: Default State\n - STATE_INIT: A channel has just started the opening handshake.\n - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain.\n - STATE_OPEN: A channel has completed the handshake. Open channels are\nready to send and receive packets.\n - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive\npackets.", - "default": "STATE_UNINITIALIZED_UNSPECIFIED", - "enum": [ - "STATE_UNINITIALIZED_UNSPECIFIED", - "STATE_INIT", - "STATE_TRYOPEN", - "STATE_OPEN", - "STATE_CLOSED" - ] - }, - "ordering": { - "title": "whether the channel is ordered or unordered", - "type": "string", - "description": "- ORDER_NONE_UNSPECIFIED: zero-value for channel ordering\n - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in\nwhich they were sent.\n - ORDER_ORDERED: packets are delivered exactly in the order which they were sent", - "default": "ORDER_NONE_UNSPECIFIED", - "enum": [ - "ORDER_NONE_UNSPECIFIED", - "ORDER_UNORDERED", - "ORDER_ORDERED" - ] - }, - "counterparty": { - "title": "counterparty channel end", - "type": "object", - "properties": { - "port_id": { - "type": "string", - "description": "port on the counterparty chain which owns the other end of the channel." - }, - "channel_id": { - "title": "channel end on the counterparty chain", - "type": "string" - } - } - }, - "connection_hops": { - "title": "list of connection identifiers, in order, along which packets sent on\nthis channel will travel", - "type": "array", - "items": { - "type": "string" - } - }, - "version": { - "title": "opaque channel version, which is agreed upon during the handshake", - "type": "string" - }, - "port_id": { - "title": "port identifier", - "type": "string" - }, - "channel_id": { - "title": "channel identifier", - "type": "string" - } - }, - "description": "IdentifiedChannel defines a channel with additional port and channel\nidentifier fields." - }, - "ibc.core.channel.v1.Order": { - "title": "Order defines if a channel is ORDERED or UNORDERED", - "type": "string", - "description": "- ORDER_NONE_UNSPECIFIED: zero-value for channel ordering\n - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in\nwhich they were sent.\n - ORDER_ORDERED: packets are delivered exactly in the order which they were sent", - "default": "ORDER_NONE_UNSPECIFIED", - "enum": [ - "ORDER_NONE_UNSPECIFIED", - "ORDER_UNORDERED", - "ORDER_ORDERED" - ] - }, - "ibc.core.channel.v1.PacketState": { - "type": "object", - "properties": { - "port_id": { - "type": "string", - "description": "channel port identifier." - }, - "channel_id": { - "type": "string", - "description": "channel unique identifier." - }, - "sequence": { - "type": "string", - "description": "packet sequence.", - "format": "uint64" - }, - "data": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "embedded data that represents packet state.", - "format": "byte" - } - }, - "description": "PacketState defines the generic type necessary to retrieve and store\npacket commitments, acknowledgements, and receipts.\nCaller is responsible for knowing the context necessary to interpret this\nstate as a commitment, acknowledgement, or a receipt." - }, - "ibc.core.channel.v1.QueryChannelClientStateResponse": { - "title": "QueryChannelClientStateResponse is the Response type for the\nQuery/QueryChannelClientState RPC method", - "type": "object", - "properties": { - "identified_client_state": { - "title": "client state associated with the channel", - "type": "object", - "properties": { - "client_id": { - "title": "client identifier", - "type": "string" - }, - "client_state": { - "title": "client state", - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - }, - "description": "IdentifiedClientState defines a client state with an additional client\nidentifier field." - }, - "proof": { - "title": "merkle proof of existence", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proof_height": { - "title": "height at which the proof was retrieved", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - } - } - }, - "ibc.core.channel.v1.QueryChannelConsensusStateResponse": { - "title": "QueryChannelClientStateResponse is the Response type for the\nQuery/QueryChannelClientState RPC method", - "type": "object", - "properties": { - "consensus_state": { - "title": "consensus state associated with the channel", - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "client_id": { - "title": "client ID associated with the consensus state", - "type": "string" - }, - "proof": { - "title": "merkle proof of existence", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proof_height": { - "title": "height at which the proof was retrieved", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - } - } - }, - "ibc.core.channel.v1.QueryChannelResponse": { - "type": "object", - "properties": { - "channel": { - "title": "channel associated with the request identifiers", - "type": "object", - "properties": { - "state": { - "title": "current state of the channel end", - "type": "string", - "description": "State defines if a channel is in one of the following states:\nCLOSED, INIT, TRYOPEN, OPEN or UNINITIALIZED.\n\n - STATE_UNINITIALIZED_UNSPECIFIED: Default State\n - STATE_INIT: A channel has just started the opening handshake.\n - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain.\n - STATE_OPEN: A channel has completed the handshake. Open channels are\nready to send and receive packets.\n - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive\npackets.", - "default": "STATE_UNINITIALIZED_UNSPECIFIED", - "enum": [ - "STATE_UNINITIALIZED_UNSPECIFIED", - "STATE_INIT", - "STATE_TRYOPEN", - "STATE_OPEN", - "STATE_CLOSED" - ] - }, - "ordering": { - "title": "whether the channel is ordered or unordered", - "type": "string", - "description": "- ORDER_NONE_UNSPECIFIED: zero-value for channel ordering\n - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in\nwhich they were sent.\n - ORDER_ORDERED: packets are delivered exactly in the order which they were sent", - "default": "ORDER_NONE_UNSPECIFIED", - "enum": [ - "ORDER_NONE_UNSPECIFIED", - "ORDER_UNORDERED", - "ORDER_ORDERED" - ] - }, - "counterparty": { - "title": "counterparty channel end", - "type": "object", - "properties": { - "port_id": { - "type": "string", - "description": "port on the counterparty chain which owns the other end of the channel." - }, - "channel_id": { - "title": "channel end on the counterparty chain", - "type": "string" - } - } - }, - "connection_hops": { - "title": "list of connection identifiers, in order, along which packets sent on\nthis channel will travel", - "type": "array", - "items": { - "type": "string" - } - }, - "version": { - "title": "opaque channel version, which is agreed upon during the handshake", - "type": "string" - } - }, - "description": "Channel defines pipeline for exactly-once packet delivery between specific\nmodules on separate blockchains, which has at least one end capable of\nsending packets and one end capable of receiving packets." - }, - "proof": { - "title": "merkle proof of existence", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proof_height": { - "title": "height at which the proof was retrieved", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - } - }, - "description": "QueryChannelResponse is the response type for the Query/Channel RPC method.\nBesides the Channel end, it includes a proof and the height from which the\nproof was retrieved." - }, - "ibc.core.channel.v1.QueryChannelsResponse": { - "type": "object", - "properties": { - "channels": { - "type": "array", - "description": "list of stored channels of the chain.", - "items": { - "type": "object", - "properties": { - "state": { - "title": "current state of the channel end", - "type": "string", - "description": "State defines if a channel is in one of the following states:\nCLOSED, INIT, TRYOPEN, OPEN or UNINITIALIZED.\n\n - STATE_UNINITIALIZED_UNSPECIFIED: Default State\n - STATE_INIT: A channel has just started the opening handshake.\n - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain.\n - STATE_OPEN: A channel has completed the handshake. Open channels are\nready to send and receive packets.\n - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive\npackets.", - "default": "STATE_UNINITIALIZED_UNSPECIFIED", - "enum": [ - "STATE_UNINITIALIZED_UNSPECIFIED", - "STATE_INIT", - "STATE_TRYOPEN", - "STATE_OPEN", - "STATE_CLOSED" - ] - }, - "ordering": { - "title": "whether the channel is ordered or unordered", - "type": "string", - "description": "- ORDER_NONE_UNSPECIFIED: zero-value for channel ordering\n - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in\nwhich they were sent.\n - ORDER_ORDERED: packets are delivered exactly in the order which they were sent", - "default": "ORDER_NONE_UNSPECIFIED", - "enum": [ - "ORDER_NONE_UNSPECIFIED", - "ORDER_UNORDERED", - "ORDER_ORDERED" - ] - }, - "counterparty": { - "title": "counterparty channel end", - "type": "object", - "properties": { - "port_id": { - "type": "string", - "description": "port on the counterparty chain which owns the other end of the channel." - }, - "channel_id": { - "title": "channel end on the counterparty chain", - "type": "string" - } - } - }, - "connection_hops": { - "title": "list of connection identifiers, in order, along which packets sent on\nthis channel will travel", - "type": "array", - "items": { - "type": "string" - } - }, - "version": { - "title": "opaque channel version, which is agreed upon during the handshake", - "type": "string" - }, - "port_id": { - "title": "port identifier", - "type": "string" - }, - "channel_id": { - "title": "channel identifier", - "type": "string" - } - }, - "description": "IdentifiedChannel defines a channel with additional port and channel\nidentifier fields." - } - }, - "pagination": { - "title": "pagination response", - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }" - }, - "height": { - "title": "query block height", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - } - }, - "description": "QueryChannelsResponse is the response type for the Query/Channels RPC method." - }, - "ibc.core.channel.v1.QueryConnectionChannelsResponse": { - "title": "QueryConnectionChannelsResponse is the Response type for the\nQuery/QueryConnectionChannels RPC method", - "type": "object", - "properties": { - "channels": { - "type": "array", - "description": "list of channels associated with a connection.", - "items": { - "type": "object", - "properties": { - "state": { - "title": "current state of the channel end", - "type": "string", - "description": "State defines if a channel is in one of the following states:\nCLOSED, INIT, TRYOPEN, OPEN or UNINITIALIZED.\n\n - STATE_UNINITIALIZED_UNSPECIFIED: Default State\n - STATE_INIT: A channel has just started the opening handshake.\n - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain.\n - STATE_OPEN: A channel has completed the handshake. Open channels are\nready to send and receive packets.\n - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive\npackets.", - "default": "STATE_UNINITIALIZED_UNSPECIFIED", - "enum": [ - "STATE_UNINITIALIZED_UNSPECIFIED", - "STATE_INIT", - "STATE_TRYOPEN", - "STATE_OPEN", - "STATE_CLOSED" - ] - }, - "ordering": { - "title": "whether the channel is ordered or unordered", - "type": "string", - "description": "- ORDER_NONE_UNSPECIFIED: zero-value for channel ordering\n - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in\nwhich they were sent.\n - ORDER_ORDERED: packets are delivered exactly in the order which they were sent", - "default": "ORDER_NONE_UNSPECIFIED", - "enum": [ - "ORDER_NONE_UNSPECIFIED", - "ORDER_UNORDERED", - "ORDER_ORDERED" - ] - }, - "counterparty": { - "title": "counterparty channel end", - "type": "object", - "properties": { - "port_id": { - "type": "string", - "description": "port on the counterparty chain which owns the other end of the channel." - }, - "channel_id": { - "title": "channel end on the counterparty chain", - "type": "string" - } - } - }, - "connection_hops": { - "title": "list of connection identifiers, in order, along which packets sent on\nthis channel will travel", - "type": "array", - "items": { - "type": "string" - } - }, - "version": { - "title": "opaque channel version, which is agreed upon during the handshake", - "type": "string" - }, - "port_id": { - "title": "port identifier", - "type": "string" - }, - "channel_id": { - "title": "channel identifier", - "type": "string" - } - }, - "description": "IdentifiedChannel defines a channel with additional port and channel\nidentifier fields." - } - }, - "pagination": { - "title": "pagination response", - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }" - }, - "height": { - "title": "query block height", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - } - } - }, - "ibc.core.channel.v1.QueryNextSequenceReceiveResponse": { - "title": "QuerySequenceResponse is the request type for the\nQuery/QueryNextSequenceReceiveResponse RPC method", - "type": "object", - "properties": { - "next_sequence_receive": { - "title": "next sequence receive number", - "type": "string", - "format": "uint64" - }, - "proof": { - "title": "merkle proof of existence", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proof_height": { - "title": "height at which the proof was retrieved", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - } - } - }, - "ibc.core.channel.v1.QueryNextSequenceSendResponse": { - "title": "QueryNextSequenceSendResponse is the request type for the\nQuery/QueryNextSequenceSend RPC method", - "type": "object", - "properties": { - "next_sequence_send": { - "title": "next sequence send number", - "type": "string", - "format": "uint64" - }, - "proof": { - "title": "merkle proof of existence", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proof_height": { - "title": "height at which the proof was retrieved", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - } - } - }, - "ibc.core.channel.v1.QueryPacketAcknowledgementResponse": { - "title": "QueryPacketAcknowledgementResponse defines the client query response for a\npacket which also includes a proof and the height from which the\nproof was retrieved", - "type": "object", - "properties": { - "acknowledgement": { - "title": "packet associated with the request fields", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proof": { - "title": "merkle proof of existence", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proof_height": { - "title": "height at which the proof was retrieved", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - } - } - }, - "ibc.core.channel.v1.QueryPacketAcknowledgementsResponse": { - "title": "QueryPacketAcknowledgemetsResponse is the request type for the\nQuery/QueryPacketAcknowledgements RPC method", - "type": "object", - "properties": { - "acknowledgements": { - "type": "array", - "items": { - "type": "object", - "properties": { - "port_id": { - "type": "string", - "description": "channel port identifier." - }, - "channel_id": { - "type": "string", - "description": "channel unique identifier." - }, - "sequence": { - "type": "string", - "description": "packet sequence.", - "format": "uint64" - }, - "data": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "embedded data that represents packet state.", - "format": "byte" - } - }, - "description": "PacketState defines the generic type necessary to retrieve and store\npacket commitments, acknowledgements, and receipts.\nCaller is responsible for knowing the context necessary to interpret this\nstate as a commitment, acknowledgement, or a receipt." - } - }, - "pagination": { - "title": "pagination response", - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }" - }, - "height": { - "title": "query block height", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - } - } - }, - "ibc.core.channel.v1.QueryPacketCommitmentResponse": { - "title": "QueryPacketCommitmentResponse defines the client query response for a packet\nwhich also includes a proof and the height from which the proof was\nretrieved", - "type": "object", - "properties": { - "commitment": { - "title": "packet associated with the request fields", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proof": { - "title": "merkle proof of existence", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proof_height": { - "title": "height at which the proof was retrieved", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - } - } - }, - "ibc.core.channel.v1.QueryPacketCommitmentsResponse": { - "title": "QueryPacketCommitmentsResponse is the request type for the\nQuery/QueryPacketCommitments RPC method", - "type": "object", - "properties": { - "commitments": { - "type": "array", - "items": { - "type": "object", - "properties": { - "port_id": { - "type": "string", - "description": "channel port identifier." - }, - "channel_id": { - "type": "string", - "description": "channel unique identifier." - }, - "sequence": { - "type": "string", - "description": "packet sequence.", - "format": "uint64" - }, - "data": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "embedded data that represents packet state.", - "format": "byte" - } - }, - "description": "PacketState defines the generic type necessary to retrieve and store\npacket commitments, acknowledgements, and receipts.\nCaller is responsible for knowing the context necessary to interpret this\nstate as a commitment, acknowledgement, or a receipt." - } - }, - "pagination": { - "title": "pagination response", - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }" - }, - "height": { - "title": "query block height", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - } - } - }, - "ibc.core.channel.v1.QueryPacketReceiptResponse": { - "title": "QueryPacketReceiptResponse defines the client query response for a packet\nreceipt which also includes a proof, and the height from which the proof was\nretrieved", - "type": "object", - "properties": { - "received": { - "title": "success flag for if receipt exists", - "type": "boolean" - }, - "proof": { - "title": "merkle proof of existence", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proof_height": { - "title": "height at which the proof was retrieved", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - } - } - }, - "ibc.core.channel.v1.QueryUnreceivedAcksResponse": { - "title": "QueryUnreceivedAcksResponse is the response type for the\nQuery/UnreceivedAcks RPC method", - "type": "object", - "properties": { - "sequences": { - "title": "list of unreceived acknowledgement sequences", - "type": "array", - "items": { - "type": "string", - "format": "uint64" - } - }, - "height": { - "title": "query block height", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - } - } - }, - "ibc.core.channel.v1.QueryUnreceivedPacketsResponse": { - "title": "QueryUnreceivedPacketsResponse is the response type for the\nQuery/UnreceivedPacketCommitments RPC method", - "type": "object", - "properties": { - "sequences": { - "title": "list of unreceived packet sequences", - "type": "array", - "items": { - "type": "string", - "format": "uint64" - } - }, - "height": { - "title": "query block height", - "type": "object", - "properties": { - "revision_number": { - "title": "the revision that the client is currently on", - "type": "string", - "format": "uint64" - }, - "revision_height": { - "title": "the height within the given revision", - "type": "string", - "format": "uint64" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - } - } - }, - "ibc.core.channel.v1.State": { - "type": "string", - "description": "State defines if a channel is in one of the following states:\nCLOSED, INIT, TRYOPEN, OPEN or UNINITIALIZED.\n\n - STATE_UNINITIALIZED_UNSPECIFIED: Default State\n - STATE_INIT: A channel has just started the opening handshake.\n - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain.\n - STATE_OPEN: A channel has completed the handshake. Open channels are\nready to send and receive packets.\n - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive\npackets.", - "default": "STATE_UNINITIALIZED_UNSPECIFIED", - "enum": [ - "STATE_UNINITIALIZED_UNSPECIFIED", - "STATE_INIT", - "STATE_TRYOPEN", - "STATE_OPEN", - "STATE_CLOSED" - ] - }, - "cosmos.auth.v1beta1.AddressBytesToStringResponse": { - "type": "object", - "properties": { - "address_string": { - "type": "string" - } - }, - "description": "AddressBytesToStringResponse is the response type for AddressString rpc method.\n\nSince: cosmos-sdk 0.46" - }, - "cosmos.auth.v1beta1.AddressStringToBytesResponse": { - "type": "object", - "properties": { - "address_bytes": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "AddressStringToBytesResponse is the response type for AddressBytes rpc method.\n\nSince: cosmos-sdk 0.46" - }, - "cosmos.auth.v1beta1.BaseAccount": { - "type": "object", - "properties": { - "address": { - "type": "string" - }, - "pub_key": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "account_number": { - "type": "string", - "format": "uint64" - }, - "sequence": { - "type": "string", - "format": "uint64" - } - }, - "description": "BaseAccount defines a base account type. It contains all the necessary fields\nfor basic account functionality. Any custom account type should extend this\ntype for additional functionality (e.g. vesting)." - }, - "cosmos.auth.v1beta1.Bech32PrefixResponse": { - "type": "object", - "properties": { - "bech32_prefix": { - "type": "string" - } - }, - "description": "Bech32PrefixResponse is the response type for Bech32Prefix rpc method.\n\nSince: cosmos-sdk 0.46" - }, - "cosmos.auth.v1beta1.Params": { - "type": "object", - "properties": { - "max_memo_characters": { - "type": "string", - "format": "uint64" - }, - "tx_sig_limit": { - "type": "string", - "format": "uint64" - }, - "tx_size_cost_per_byte": { - "type": "string", - "format": "uint64" - }, - "sig_verify_cost_ed25519": { - "type": "string", - "format": "uint64" - }, - "sig_verify_cost_secp256k1": { - "type": "string", - "format": "uint64" - } - }, - "description": "Params defines the parameters for the auth module." - }, - "cosmos.auth.v1beta1.QueryAccountAddressByIDResponse": { - "title": "QueryAccountAddressByIDResponse is the response type for AccountAddressByID rpc method", - "type": "object", - "properties": { - "account_address": { - "type": "string" - } - }, - "description": "Since: cosmos-sdk 0.46.2" - }, - "cosmos.auth.v1beta1.QueryAccountInfoResponse": { - "type": "object", - "properties": { - "info": { - "type": "object", - "properties": { - "address": { - "type": "string" - }, - "pub_key": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "account_number": { - "type": "string", - "format": "uint64" - }, - "sequence": { - "type": "string", - "format": "uint64" - } - }, - "description": "info is the account info which is represented by BaseAccount." - } - }, - "description": "QueryAccountInfoResponse is the Query/AccountInfo response type.\n\nSince: cosmos-sdk 0.47" - }, - "cosmos.auth.v1beta1.QueryAccountResponse": { - "type": "object", - "properties": { - "account": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - }, - "description": "QueryAccountResponse is the response type for the Query/Account RPC method." - }, - "cosmos.auth.v1beta1.QueryAccountsResponse": { - "type": "object", - "properties": { - "accounts": { - "title": "accounts are the existing accounts", - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QueryAccountsResponse is the response type for the Query/Accounts RPC method.\n\nSince: cosmos-sdk 0.43" - }, - "cosmos.auth.v1beta1.QueryModuleAccountByNameResponse": { - "type": "object", - "properties": { - "account": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - }, - "description": "QueryModuleAccountByNameResponse is the response type for the Query/ModuleAccountByName RPC method." - }, - "cosmos.auth.v1beta1.QueryModuleAccountsResponse": { - "type": "object", - "properties": { - "accounts": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - }, - "description": "QueryModuleAccountsResponse is the response type for the Query/ModuleAccounts RPC method.\n\nSince: cosmos-sdk 0.46" - }, - "cosmos.auth.v1beta1.QueryParamsResponse": { - "type": "object", - "properties": { - "params": { - "type": "object", - "properties": { - "max_memo_characters": { - "type": "string", - "format": "uint64" - }, - "tx_sig_limit": { - "type": "string", - "format": "uint64" - }, - "tx_size_cost_per_byte": { - "type": "string", - "format": "uint64" - }, - "sig_verify_cost_ed25519": { - "type": "string", - "format": "uint64" - }, - "sig_verify_cost_secp256k1": { - "type": "string", - "format": "uint64" - } - }, - "description": "params defines the parameters of the module." - } - }, - "description": "QueryParamsResponse is the response type for the Query/Params RPC method." - }, - "cosmos.authz.v1beta1.Grant": { - "type": "object", - "properties": { - "authorization": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "expiration": { - "title": "time when the grant will expire and will be pruned. If null, then the grant\ndoesn't have a time expiration (other conditions in `authorization`\nmay apply to invalidate the grant)", - "type": "string", - "format": "date-time" - } - }, - "description": "Grant gives permissions to execute\nthe provide method with expiration time." - }, - "cosmos.authz.v1beta1.GrantAuthorization": { - "title": "GrantAuthorization extends a grant with both the addresses of the grantee and granter.\nIt is used in genesis.proto and query.proto", - "type": "object", - "properties": { - "granter": { - "type": "string" - }, - "grantee": { - "type": "string" - }, - "authorization": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "expiration": { - "type": "string", - "format": "date-time" - } - } - }, - "cosmos.authz.v1beta1.QueryGranteeGrantsResponse": { - "type": "object", - "properties": { - "grants": { - "type": "array", - "description": "grants is a list of grants granted to the grantee.", - "items": { - "title": "GrantAuthorization extends a grant with both the addresses of the grantee and granter.\nIt is used in genesis.proto and query.proto", - "type": "object", - "properties": { - "granter": { - "type": "string" - }, - "grantee": { - "type": "string" - }, - "authorization": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "expiration": { - "type": "string", - "format": "date-time" - } - } - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines an pagination for the response." - } - }, - "description": "QueryGranteeGrantsResponse is the response type for the Query/GranteeGrants RPC method." - }, - "cosmos.authz.v1beta1.QueryGranterGrantsResponse": { - "type": "object", - "properties": { - "grants": { - "type": "array", - "description": "grants is a list of grants granted by the granter.", - "items": { - "title": "GrantAuthorization extends a grant with both the addresses of the grantee and granter.\nIt is used in genesis.proto and query.proto", - "type": "object", - "properties": { - "granter": { - "type": "string" - }, - "grantee": { - "type": "string" - }, - "authorization": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "expiration": { - "type": "string", - "format": "date-time" - } - } - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines an pagination for the response." - } - }, - "description": "QueryGranterGrantsResponse is the response type for the Query/GranterGrants RPC method." - }, - "cosmos.authz.v1beta1.QueryGrantsResponse": { - "type": "object", - "properties": { - "grants": { - "type": "array", - "description": "authorizations is a list of grants granted for grantee by granter.", - "items": { - "type": "object", - "properties": { - "authorization": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "expiration": { - "title": "time when the grant will expire and will be pruned. If null, then the grant\ndoesn't have a time expiration (other conditions in `authorization`\nmay apply to invalidate the grant)", - "type": "string", - "format": "date-time" - } - }, - "description": "Grant gives permissions to execute\nthe provide method with expiration time." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines an pagination for the response." - } - }, - "description": "QueryGrantsResponse is the response type for the Query/Authorizations RPC method." - }, - "cosmos.bank.v1beta1.DenomOwner": { - "type": "object", - "properties": { - "address": { - "type": "string", - "description": "address defines the address that owns a particular denomination." - }, - "balance": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "description": "DenomOwner defines structure representing an account that owns or holds a\nparticular denominated token. It contains the account address and account\nbalance of the denominated token.\n\nSince: cosmos-sdk 0.46" - }, - "cosmos.bank.v1beta1.DenomUnit": { - "type": "object", - "properties": { - "denom": { - "type": "string", - "description": "denom represents the string name of the given denom unit (e.g uatom)." - }, - "exponent": { - "type": "integer", - "description": "exponent represents power of 10 exponent that one must\nraise the base_denom to in order to equal the given DenomUnit's denom\n1 denom = 10^exponent base_denom\n(e.g. with a base_denom of uatom, one can create a DenomUnit of 'atom' with\nexponent = 6, thus: 1 atom = 10^6 uatom).", - "format": "int64" - }, - "aliases": { - "title": "aliases is a list of string aliases for the given denom", - "type": "array", - "items": { - "type": "string" - } - } - }, - "description": "DenomUnit represents a struct that describes a given\ndenomination unit of the basic token." - }, - "cosmos.bank.v1beta1.Metadata": { - "type": "object", - "properties": { - "description": { - "type": "string" - }, - "denom_units": { - "title": "denom_units represents the list of DenomUnit's for a given coin", - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string", - "description": "denom represents the string name of the given denom unit (e.g uatom)." - }, - "exponent": { - "type": "integer", - "description": "exponent represents power of 10 exponent that one must\nraise the base_denom to in order to equal the given DenomUnit's denom\n1 denom = 10^exponent base_denom\n(e.g. with a base_denom of uatom, one can create a DenomUnit of 'atom' with\nexponent = 6, thus: 1 atom = 10^6 uatom).", - "format": "int64" - }, - "aliases": { - "title": "aliases is a list of string aliases for the given denom", - "type": "array", - "items": { - "type": "string" - } - } - }, - "description": "DenomUnit represents a struct that describes a given\ndenomination unit of the basic token." - } - }, - "base": { - "type": "string", - "description": "base represents the base denom (should be the DenomUnit with exponent = 0)." - }, - "display": { - "type": "string", - "description": "display indicates the suggested denom that should be\ndisplayed in clients." - }, - "name": { - "title": "name defines the name of the token (eg: Cosmos Atom)", - "type": "string", - "description": "Since: cosmos-sdk 0.43" - }, - "symbol": { - "type": "string", - "description": "symbol is the token symbol usually shown on exchanges (eg: ATOM). This can\nbe the same as the display.\n\nSince: cosmos-sdk 0.43" - }, - "uri": { - "type": "string", - "description": "URI to a document (on or off-chain) that contains additional information. Optional.\n\nSince: cosmos-sdk 0.46" - }, - "uri_hash": { - "type": "string", - "description": "URIHash is a sha256 hash of a document pointed by URI. It's used to verify that\nthe document didn't change. Optional.\n\nSince: cosmos-sdk 0.46" - } - }, - "description": "Metadata represents a struct that describes\na basic token." - }, - "cosmos.bank.v1beta1.Params": { - "type": "object", - "properties": { - "send_enabled": { - "type": "array", - "description": "Deprecated: Use of SendEnabled in params is deprecated.\nFor genesis, use the newly added send_enabled field in the genesis object.\nStorage, lookup, and manipulation of this information is now in the keeper.\n\nAs of cosmos-sdk 0.47, this only exists for backwards compatibility of genesis files.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "enabled": { - "type": "boolean" - } - }, - "description": "SendEnabled maps coin denom to a send_enabled status (whether a denom is\nsendable)." - } - }, - "default_send_enabled": { - "type": "boolean" - } - }, - "description": "Params defines the parameters for the bank module." - }, - "cosmos.bank.v1beta1.QueryAllBalancesResponse": { - "type": "object", - "properties": { - "balances": { - "type": "array", - "description": "balances is the balances of all the coins.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QueryAllBalancesResponse is the response type for the Query/AllBalances RPC\nmethod." - }, - "cosmos.bank.v1beta1.QueryBalanceResponse": { - "type": "object", - "properties": { - "balance": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "description": "QueryBalanceResponse is the response type for the Query/Balance RPC method." - }, - "cosmos.bank.v1beta1.QueryDenomMetadataByQueryStringResponse": { - "type": "object", - "properties": { - "metadata": { - "type": "object", - "properties": { - "description": { - "type": "string" - }, - "denom_units": { - "title": "denom_units represents the list of DenomUnit's for a given coin", - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string", - "description": "denom represents the string name of the given denom unit (e.g uatom)." - }, - "exponent": { - "type": "integer", - "description": "exponent represents power of 10 exponent that one must\nraise the base_denom to in order to equal the given DenomUnit's denom\n1 denom = 10^exponent base_denom\n(e.g. with a base_denom of uatom, one can create a DenomUnit of 'atom' with\nexponent = 6, thus: 1 atom = 10^6 uatom).", - "format": "int64" - }, - "aliases": { - "title": "aliases is a list of string aliases for the given denom", - "type": "array", - "items": { - "type": "string" - } - } - }, - "description": "DenomUnit represents a struct that describes a given\ndenomination unit of the basic token." - } - }, - "base": { - "type": "string", - "description": "base represents the base denom (should be the DenomUnit with exponent = 0)." - }, - "display": { - "type": "string", - "description": "display indicates the suggested denom that should be\ndisplayed in clients." - }, - "name": { - "title": "name defines the name of the token (eg: Cosmos Atom)", - "type": "string", - "description": "Since: cosmos-sdk 0.43" - }, - "symbol": { - "type": "string", - "description": "symbol is the token symbol usually shown on exchanges (eg: ATOM). This can\nbe the same as the display.\n\nSince: cosmos-sdk 0.43" - }, - "uri": { - "type": "string", - "description": "URI to a document (on or off-chain) that contains additional information. Optional.\n\nSince: cosmos-sdk 0.46" - }, - "uri_hash": { - "type": "string", - "description": "URIHash is a sha256 hash of a document pointed by URI. It's used to verify that\nthe document didn't change. Optional.\n\nSince: cosmos-sdk 0.46" - } - }, - "description": "Metadata represents a struct that describes\na basic token." - } - }, - "description": "QueryDenomMetadataByQueryStringResponse is the response type for the Query/DenomMetadata RPC\nmethod. Identical with QueryDenomMetadataResponse but receives denom as query string in request." - }, - "cosmos.bank.v1beta1.QueryDenomMetadataResponse": { - "type": "object", - "properties": { - "metadata": { - "type": "object", - "properties": { - "description": { - "type": "string" - }, - "denom_units": { - "title": "denom_units represents the list of DenomUnit's for a given coin", - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string", - "description": "denom represents the string name of the given denom unit (e.g uatom)." - }, - "exponent": { - "type": "integer", - "description": "exponent represents power of 10 exponent that one must\nraise the base_denom to in order to equal the given DenomUnit's denom\n1 denom = 10^exponent base_denom\n(e.g. with a base_denom of uatom, one can create a DenomUnit of 'atom' with\nexponent = 6, thus: 1 atom = 10^6 uatom).", - "format": "int64" - }, - "aliases": { - "title": "aliases is a list of string aliases for the given denom", - "type": "array", - "items": { - "type": "string" - } - } - }, - "description": "DenomUnit represents a struct that describes a given\ndenomination unit of the basic token." - } - }, - "base": { - "type": "string", - "description": "base represents the base denom (should be the DenomUnit with exponent = 0)." - }, - "display": { - "type": "string", - "description": "display indicates the suggested denom that should be\ndisplayed in clients." - }, - "name": { - "title": "name defines the name of the token (eg: Cosmos Atom)", - "type": "string", - "description": "Since: cosmos-sdk 0.43" - }, - "symbol": { - "type": "string", - "description": "symbol is the token symbol usually shown on exchanges (eg: ATOM). This can\nbe the same as the display.\n\nSince: cosmos-sdk 0.43" - }, - "uri": { - "type": "string", - "description": "URI to a document (on or off-chain) that contains additional information. Optional.\n\nSince: cosmos-sdk 0.46" - }, - "uri_hash": { - "type": "string", - "description": "URIHash is a sha256 hash of a document pointed by URI. It's used to verify that\nthe document didn't change. Optional.\n\nSince: cosmos-sdk 0.46" - } - }, - "description": "Metadata represents a struct that describes\na basic token." - } - }, - "description": "QueryDenomMetadataResponse is the response type for the Query/DenomMetadata RPC\nmethod." - }, - "cosmos.bank.v1beta1.QueryDenomOwnersResponse": { - "type": "object", - "properties": { - "denom_owners": { - "type": "array", - "items": { - "type": "object", - "properties": { - "address": { - "type": "string", - "description": "address defines the address that owns a particular denomination." - }, - "balance": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "description": "DenomOwner defines structure representing an account that owns or holds a\nparticular denominated token. It contains the account address and account\nbalance of the denominated token.\n\nSince: cosmos-sdk 0.46" - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QueryDenomOwnersResponse defines the RPC response of a DenomOwners RPC query.\n\nSince: cosmos-sdk 0.46" - }, - "cosmos.bank.v1beta1.QueryDenomsMetadataResponse": { - "type": "object", - "properties": { - "metadatas": { - "type": "array", - "description": "metadata provides the client information for all the registered tokens.", - "items": { - "type": "object", - "properties": { - "description": { - "type": "string" - }, - "denom_units": { - "title": "denom_units represents the list of DenomUnit's for a given coin", - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string", - "description": "denom represents the string name of the given denom unit (e.g uatom)." - }, - "exponent": { - "type": "integer", - "description": "exponent represents power of 10 exponent that one must\nraise the base_denom to in order to equal the given DenomUnit's denom\n1 denom = 10^exponent base_denom\n(e.g. with a base_denom of uatom, one can create a DenomUnit of 'atom' with\nexponent = 6, thus: 1 atom = 10^6 uatom).", - "format": "int64" - }, - "aliases": { - "title": "aliases is a list of string aliases for the given denom", - "type": "array", - "items": { - "type": "string" - } - } - }, - "description": "DenomUnit represents a struct that describes a given\ndenomination unit of the basic token." - } - }, - "base": { - "type": "string", - "description": "base represents the base denom (should be the DenomUnit with exponent = 0)." - }, - "display": { - "type": "string", - "description": "display indicates the suggested denom that should be\ndisplayed in clients." - }, - "name": { - "title": "name defines the name of the token (eg: Cosmos Atom)", - "type": "string", - "description": "Since: cosmos-sdk 0.43" - }, - "symbol": { - "type": "string", - "description": "symbol is the token symbol usually shown on exchanges (eg: ATOM). This can\nbe the same as the display.\n\nSince: cosmos-sdk 0.43" - }, - "uri": { - "type": "string", - "description": "URI to a document (on or off-chain) that contains additional information. Optional.\n\nSince: cosmos-sdk 0.46" - }, - "uri_hash": { - "type": "string", - "description": "URIHash is a sha256 hash of a document pointed by URI. It's used to verify that\nthe document didn't change. Optional.\n\nSince: cosmos-sdk 0.46" - } - }, - "description": "Metadata represents a struct that describes\na basic token." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QueryDenomsMetadataResponse is the response type for the Query/DenomsMetadata RPC\nmethod." - }, - "cosmos.bank.v1beta1.QueryParamsResponse": { - "type": "object", - "properties": { - "params": { - "type": "object", - "properties": { - "send_enabled": { - "type": "array", - "description": "Deprecated: Use of SendEnabled in params is deprecated.\nFor genesis, use the newly added send_enabled field in the genesis object.\nStorage, lookup, and manipulation of this information is now in the keeper.\n\nAs of cosmos-sdk 0.47, this only exists for backwards compatibility of genesis files.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "enabled": { - "type": "boolean" - } - }, - "description": "SendEnabled maps coin denom to a send_enabled status (whether a denom is\nsendable)." - } - }, - "default_send_enabled": { - "type": "boolean" - } - }, - "description": "params provides the parameters of the bank module." - } - }, - "description": "QueryParamsResponse defines the response type for querying x/bank parameters." - }, - "cosmos.bank.v1beta1.QuerySendEnabledResponse": { - "type": "object", - "properties": { - "send_enabled": { - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "enabled": { - "type": "boolean" - } - }, - "description": "SendEnabled maps coin denom to a send_enabled status (whether a denom is\nsendable)." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response. This field is only\npopulated if the denoms field in the request is empty." - } - }, - "description": "QuerySendEnabledResponse defines the RPC response of a SendEnable query.\n\nSince: cosmos-sdk 0.47" - }, - "cosmos.bank.v1beta1.QuerySpendableBalanceByDenomResponse": { - "type": "object", - "properties": { - "balance": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "description": "QuerySpendableBalanceByDenomResponse defines the gRPC response structure for\nquerying an account's spendable balance for a specific denom.\n\nSince: cosmos-sdk 0.47" - }, - "cosmos.bank.v1beta1.QuerySpendableBalancesResponse": { - "type": "object", - "properties": { - "balances": { - "type": "array", - "description": "balances is the spendable balances of all the coins.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QuerySpendableBalancesResponse defines the gRPC response structure for querying\nan account's spendable balances.\n\nSince: cosmos-sdk 0.46" - }, - "cosmos.bank.v1beta1.QuerySupplyOfResponse": { - "type": "object", - "properties": { - "amount": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "description": "QuerySupplyOfResponse is the response type for the Query/SupplyOf RPC method." - }, - "cosmos.bank.v1beta1.QueryTotalSupplyResponse": { - "title": "QueryTotalSupplyResponse is the response type for the Query/TotalSupply RPC\nmethod", - "type": "object", - "properties": { - "supply": { - "title": "supply is the supply of the coins", - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response.\n\nSince: cosmos-sdk 0.43" - } - } - }, - "cosmos.bank.v1beta1.SendEnabled": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "enabled": { - "type": "boolean" - } - }, - "description": "SendEnabled maps coin denom to a send_enabled status (whether a denom is\nsendable)." - }, - "cosmos.distribution.v1beta1.DelegationDelegatorReward": { - "type": "object", - "properties": { - "validator_address": { - "type": "string" - }, - "reward": { - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." - } - } - }, - "description": "DelegationDelegatorReward represents the properties\nof a delegator's delegation reward." - }, - "cosmos.distribution.v1beta1.Params": { - "type": "object", - "properties": { - "community_tax": { - "type": "string" - }, - "base_proposer_reward": { - "type": "string", - "description": "Deprecated: The base_proposer_reward field is deprecated and is no longer used\nin the x/distribution module's reward mechanism." - }, - "bonus_proposer_reward": { - "type": "string", - "description": "Deprecated: The bonus_proposer_reward field is deprecated and is no longer used\nin the x/distribution module's reward mechanism." - }, - "withdraw_addr_enabled": { - "type": "boolean" - } - }, - "description": "Params defines the set of params for the distribution module." - }, - "cosmos.distribution.v1beta1.QueryCommunityPoolResponse": { - "type": "object", - "properties": { - "pool": { - "type": "array", - "description": "pool defines community pool's coins.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." - } - } - }, - "description": "QueryCommunityPoolResponse is the response type for the Query/CommunityPool\nRPC method." - }, - "cosmos.distribution.v1beta1.QueryDelegationRewardsResponse": { - "type": "object", - "properties": { - "rewards": { - "type": "array", - "description": "rewards defines the rewards accrued by a delegation.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." - } - } - }, - "description": "QueryDelegationRewardsResponse is the response type for the\nQuery/DelegationRewards RPC method." - }, - "cosmos.distribution.v1beta1.QueryDelegationTotalRewardsResponse": { - "type": "object", - "properties": { - "rewards": { - "type": "array", - "description": "rewards defines all the rewards accrued by a delegator.", - "items": { - "type": "object", - "properties": { - "validator_address": { - "type": "string" - }, - "reward": { - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." - } - } - }, - "description": "DelegationDelegatorReward represents the properties\nof a delegator's delegation reward." - } - }, - "total": { - "type": "array", - "description": "total defines the sum of all the rewards.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." - } - } - }, - "description": "QueryDelegationTotalRewardsResponse is the response type for the\nQuery/DelegationTotalRewards RPC method." - }, - "cosmos.distribution.v1beta1.QueryDelegatorValidatorsResponse": { - "type": "object", - "properties": { - "validators": { - "type": "array", - "description": "validators defines the validators a delegator is delegating for.", - "items": { - "type": "string" - } - } - }, - "description": "QueryDelegatorValidatorsResponse is the response type for the\nQuery/DelegatorValidators RPC method." - }, - "cosmos.distribution.v1beta1.QueryDelegatorWithdrawAddressResponse": { - "type": "object", - "properties": { - "withdraw_address": { - "type": "string", - "description": "withdraw_address defines the delegator address to query for." - } - }, - "description": "QueryDelegatorWithdrawAddressResponse is the response type for the\nQuery/DelegatorWithdrawAddress RPC method." - }, - "cosmos.distribution.v1beta1.QueryParamsResponse": { - "type": "object", - "properties": { - "params": { - "type": "object", - "properties": { - "community_tax": { - "type": "string" - }, - "base_proposer_reward": { - "type": "string", - "description": "Deprecated: The base_proposer_reward field is deprecated and is no longer used\nin the x/distribution module's reward mechanism." - }, - "bonus_proposer_reward": { - "type": "string", - "description": "Deprecated: The bonus_proposer_reward field is deprecated and is no longer used\nin the x/distribution module's reward mechanism." - }, - "withdraw_addr_enabled": { - "type": "boolean" - } - }, - "description": "params defines the parameters of the module." - } - }, - "description": "QueryParamsResponse is the response type for the Query/Params RPC method." - }, - "cosmos.distribution.v1beta1.QueryValidatorCommissionResponse": { - "title": "QueryValidatorCommissionResponse is the response type for the\nQuery/ValidatorCommission RPC method", - "type": "object", - "properties": { - "commission": { - "type": "object", - "properties": { - "commission": { - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." - } - } - }, - "description": "commission defines the commission the validator received." - } - } - }, - "cosmos.distribution.v1beta1.QueryValidatorDistributionInfoResponse": { - "type": "object", - "properties": { - "operator_address": { - "type": "string", - "description": "operator_address defines the validator operator address." - }, - "self_bond_rewards": { - "type": "array", - "description": "self_bond_rewards defines the self delegations rewards.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." - } - }, - "commission": { - "type": "array", - "description": "commission defines the commission the validator received.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." - } - } - }, - "description": "QueryValidatorDistributionInfoResponse is the response type for the Query/ValidatorDistributionInfo RPC method." - }, - "cosmos.distribution.v1beta1.QueryValidatorOutstandingRewardsResponse": { - "type": "object", - "properties": { - "rewards": { - "type": "object", - "properties": { - "rewards": { - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." - } - } - }, - "description": "ValidatorOutstandingRewards represents outstanding (un-withdrawn) rewards\nfor a validator inexpensive to track, allows simple sanity checks." - } - }, - "description": "QueryValidatorOutstandingRewardsResponse is the response type for the\nQuery/ValidatorOutstandingRewards RPC method." - }, - "cosmos.distribution.v1beta1.QueryValidatorSlashesResponse": { - "type": "object", - "properties": { - "slashes": { - "type": "array", - "description": "slashes defines the slashes the validator received.", - "items": { - "type": "object", - "properties": { - "validator_period": { - "type": "string", - "format": "uint64" - }, - "fraction": { - "type": "string" - } - }, - "description": "ValidatorSlashEvent represents a validator slash event.\nHeight is implicit within the store key.\nThis is needed to calculate appropriate amount of staking tokens\nfor delegations which are withdrawn after a slash has occurred." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QueryValidatorSlashesResponse is the response type for the\nQuery/ValidatorSlashes RPC method." - }, - "cosmos.distribution.v1beta1.ValidatorAccumulatedCommission": { - "type": "object", - "properties": { - "commission": { - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." - } - } - }, - "description": "ValidatorAccumulatedCommission represents accumulated commission\nfor a validator kept as a running counter, can be withdrawn at any time." - }, - "cosmos.distribution.v1beta1.ValidatorOutstandingRewards": { - "type": "object", - "properties": { - "rewards": { - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." - } - } - }, - "description": "ValidatorOutstandingRewards represents outstanding (un-withdrawn) rewards\nfor a validator inexpensive to track, allows simple sanity checks." - }, - "cosmos.distribution.v1beta1.ValidatorSlashEvent": { - "type": "object", - "properties": { - "validator_period": { - "type": "string", - "format": "uint64" - }, - "fraction": { - "type": "string" - } - }, - "description": "ValidatorSlashEvent represents a validator slash event.\nHeight is implicit within the store key.\nThis is needed to calculate appropriate amount of staking tokens\nfor delegations which are withdrawn after a slash has occurred." - }, - "cosmos.feegrant.v1beta1.Grant": { - "title": "Grant is stored in the KVStore to record a grant with full context", - "type": "object", - "properties": { - "granter": { - "type": "string", - "description": "granter is the address of the user granting an allowance of their funds." - }, - "grantee": { - "type": "string", - "description": "grantee is the address of the user being granted an allowance of another user's funds." - }, - "allowance": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "allowance can be any of basic, periodic, allowed fee allowance." - } - } - }, - "cosmos.feegrant.v1beta1.QueryAllowanceResponse": { - "type": "object", - "properties": { - "allowance": { - "title": "Grant is stored in the KVStore to record a grant with full context", - "type": "object", - "properties": { - "granter": { - "type": "string", - "description": "granter is the address of the user granting an allowance of their funds." - }, - "grantee": { - "type": "string", - "description": "grantee is the address of the user being granted an allowance of another user's funds." - }, - "allowance": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "allowance can be any of basic, periodic, allowed fee allowance." - } - }, - "description": "allowance is a allowance granted for grantee by granter." - } - }, - "description": "QueryAllowanceResponse is the response type for the Query/Allowance RPC method." - }, - "cosmos.feegrant.v1beta1.QueryAllowancesByGranterResponse": { - "type": "object", - "properties": { - "allowances": { - "type": "array", - "description": "allowances that have been issued by the granter.", - "items": { - "title": "Grant is stored in the KVStore to record a grant with full context", - "type": "object", - "properties": { - "granter": { - "type": "string", - "description": "granter is the address of the user granting an allowance of their funds." - }, - "grantee": { - "type": "string", - "description": "grantee is the address of the user being granted an allowance of another user's funds." - }, - "allowance": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "allowance can be any of basic, periodic, allowed fee allowance." - } - } - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines an pagination for the response." - } - }, - "description": "QueryAllowancesByGranterResponse is the response type for the Query/AllowancesByGranter RPC method.\n\nSince: cosmos-sdk 0.46" - }, - "cosmos.feegrant.v1beta1.QueryAllowancesResponse": { - "type": "object", - "properties": { - "allowances": { - "type": "array", - "description": "allowances are allowance's granted for grantee by granter.", - "items": { - "title": "Grant is stored in the KVStore to record a grant with full context", - "type": "object", - "properties": { - "granter": { - "type": "string", - "description": "granter is the address of the user granting an allowance of their funds." - }, - "grantee": { - "type": "string", - "description": "grantee is the address of the user being granted an allowance of another user's funds." - }, - "allowance": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "allowance can be any of basic, periodic, allowed fee allowance." - } - } - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines an pagination for the response." - } - }, - "description": "QueryAllowancesResponse is the response type for the Query/Allowances RPC method." - }, - "cosmos.evidence.v1beta1.QueryAllEvidenceResponse": { - "type": "object", - "properties": { - "evidence": { - "type": "array", - "description": "evidence returns all evidences.", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QueryAllEvidenceResponse is the response type for the Query/AllEvidence RPC\nmethod." - }, - "cosmos.evidence.v1beta1.QueryEvidenceResponse": { - "type": "object", - "properties": { - "evidence": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - }, - "description": "QueryEvidenceResponse is the response type for the Query/Evidence RPC method." - }, - "cosmos.gov.v1beta1.Deposit": { - "type": "object", - "properties": { - "proposal_id": { - "type": "string", - "description": "proposal_id defines the unique id of the proposal.", - "format": "uint64" - }, - "depositor": { - "type": "string", - "description": "depositor defines the deposit addresses from the proposals." - }, - "amount": { - "type": "array", - "description": "amount to be deposited by depositor.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - } - }, - "description": "Deposit defines an amount deposited by an account address to an active\nproposal." - }, - "cosmos.gov.v1beta1.DepositParams": { - "type": "object", - "properties": { - "min_deposit": { - "type": "array", - "description": "Minimum deposit for a proposal to enter voting period.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "max_deposit_period": { - "type": "string", - "description": "Maximum period for Atom holders to deposit on a proposal. Initial value: 2\nmonths." - } - }, - "description": "DepositParams defines the params for deposits on governance proposals." - }, - "cosmos.gov.v1beta1.Proposal": { - "type": "object", - "properties": { - "proposal_id": { - "type": "string", - "description": "proposal_id defines the unique id of the proposal.", - "format": "uint64" - }, - "content": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "status": { - "type": "string", - "description": "status defines the proposal status.", - "default": "PROPOSAL_STATUS_UNSPECIFIED", - "enum": [ - "PROPOSAL_STATUS_UNSPECIFIED", - "PROPOSAL_STATUS_DEPOSIT_PERIOD", - "PROPOSAL_STATUS_VOTING_PERIOD", - "PROPOSAL_STATUS_PASSED", - "PROPOSAL_STATUS_REJECTED", - "PROPOSAL_STATUS_FAILED" - ] - }, - "final_tally_result": { - "type": "object", - "properties": { - "yes": { - "type": "string", - "description": "yes is the number of yes votes on a proposal." - }, - "abstain": { - "type": "string", - "description": "abstain is the number of abstain votes on a proposal." - }, - "no": { - "type": "string", - "description": "no is the number of no votes on a proposal." - }, - "no_with_veto": { - "type": "string", - "description": "no_with_veto is the number of no with veto votes on a proposal." - } - }, - "description": "final_tally_result is the final tally result of the proposal. When\nquerying a proposal via gRPC, this field is not populated until the\nproposal's voting period has ended." - }, - "submit_time": { - "type": "string", - "description": "submit_time is the time of proposal submission.", - "format": "date-time" - }, - "deposit_end_time": { - "type": "string", - "description": "deposit_end_time is the end time for deposition.", - "format": "date-time" - }, - "total_deposit": { - "type": "array", - "description": "total_deposit is the total deposit on the proposal.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "voting_start_time": { - "type": "string", - "description": "voting_start_time is the starting time to vote on a proposal.", - "format": "date-time" - }, - "voting_end_time": { - "type": "string", - "description": "voting_end_time is the end time of voting on a proposal.", - "format": "date-time" - } - }, - "description": "Proposal defines the core field members of a governance proposal." - }, - "cosmos.gov.v1beta1.ProposalStatus": { - "type": "string", - "description": "ProposalStatus enumerates the valid statuses of a proposal.\n\n - PROPOSAL_STATUS_UNSPECIFIED: PROPOSAL_STATUS_UNSPECIFIED defines the default proposal status.\n - PROPOSAL_STATUS_DEPOSIT_PERIOD: PROPOSAL_STATUS_DEPOSIT_PERIOD defines a proposal status during the deposit\nperiod.\n - PROPOSAL_STATUS_VOTING_PERIOD: PROPOSAL_STATUS_VOTING_PERIOD defines a proposal status during the voting\nperiod.\n - PROPOSAL_STATUS_PASSED: PROPOSAL_STATUS_PASSED defines a proposal status of a proposal that has\npassed.\n - PROPOSAL_STATUS_REJECTED: PROPOSAL_STATUS_REJECTED defines a proposal status of a proposal that has\nbeen rejected.\n - PROPOSAL_STATUS_FAILED: PROPOSAL_STATUS_FAILED defines a proposal status of a proposal that has\nfailed.", - "default": "PROPOSAL_STATUS_UNSPECIFIED", - "enum": [ - "PROPOSAL_STATUS_UNSPECIFIED", - "PROPOSAL_STATUS_DEPOSIT_PERIOD", - "PROPOSAL_STATUS_VOTING_PERIOD", - "PROPOSAL_STATUS_PASSED", - "PROPOSAL_STATUS_REJECTED", - "PROPOSAL_STATUS_FAILED" - ] - }, - "cosmos.gov.v1beta1.QueryDepositResponse": { - "type": "object", - "properties": { - "deposit": { - "type": "object", - "properties": { - "proposal_id": { - "type": "string", - "description": "proposal_id defines the unique id of the proposal.", - "format": "uint64" - }, - "depositor": { - "type": "string", - "description": "depositor defines the deposit addresses from the proposals." - }, - "amount": { - "type": "array", - "description": "amount to be deposited by depositor.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - } - }, - "description": "Deposit defines an amount deposited by an account address to an active\nproposal." - } - }, - "description": "QueryDepositResponse is the response type for the Query/Deposit RPC method." - }, - "cosmos.gov.v1beta1.QueryDepositsResponse": { - "type": "object", - "properties": { - "deposits": { - "type": "array", - "description": "deposits defines the requested deposits.", - "items": { - "type": "object", - "properties": { - "proposal_id": { - "type": "string", - "description": "proposal_id defines the unique id of the proposal.", - "format": "uint64" - }, - "depositor": { - "type": "string", - "description": "depositor defines the deposit addresses from the proposals." - }, - "amount": { - "type": "array", - "description": "amount to be deposited by depositor.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - } - }, - "description": "Deposit defines an amount deposited by an account address to an active\nproposal." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QueryDepositsResponse is the response type for the Query/Deposits RPC method." - }, - "cosmos.gov.v1beta1.QueryParamsResponse": { - "type": "object", - "properties": { - "voting_params": { - "type": "object", - "properties": { - "voting_period": { - "type": "string", - "description": "Duration of the voting period." - } - }, - "description": "voting_params defines the parameters related to voting." - }, - "deposit_params": { - "type": "object", - "properties": { - "min_deposit": { - "type": "array", - "description": "Minimum deposit for a proposal to enter voting period.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "max_deposit_period": { - "type": "string", - "description": "Maximum period for Atom holders to deposit on a proposal. Initial value: 2\nmonths." - } - }, - "description": "deposit_params defines the parameters related to deposit." - }, - "tally_params": { - "type": "object", - "properties": { - "quorum": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Minimum percentage of total stake needed to vote for a result to be\nconsidered valid.", - "format": "byte" - }, - "threshold": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Minimum proportion of Yes votes for proposal to pass. Default value: 0.5.", - "format": "byte" - }, - "veto_threshold": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Minimum value of Veto votes to Total votes ratio for proposal to be\nvetoed. Default value: 1/3.", - "format": "byte" - } - }, - "description": "tally_params defines the parameters related to tally." - } - }, - "description": "QueryParamsResponse is the response type for the Query/Params RPC method." - }, - "cosmos.gov.v1beta1.QueryProposalResponse": { - "type": "object", - "properties": { - "proposal": { - "type": "object", - "properties": { - "proposal_id": { - "type": "string", - "description": "proposal_id defines the unique id of the proposal.", - "format": "uint64" - }, - "content": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "status": { - "type": "string", - "description": "status defines the proposal status.", - "default": "PROPOSAL_STATUS_UNSPECIFIED", - "enum": [ - "PROPOSAL_STATUS_UNSPECIFIED", - "PROPOSAL_STATUS_DEPOSIT_PERIOD", - "PROPOSAL_STATUS_VOTING_PERIOD", - "PROPOSAL_STATUS_PASSED", - "PROPOSAL_STATUS_REJECTED", - "PROPOSAL_STATUS_FAILED" - ] - }, - "final_tally_result": { - "type": "object", - "properties": { - "yes": { - "type": "string", - "description": "yes is the number of yes votes on a proposal." - }, - "abstain": { - "type": "string", - "description": "abstain is the number of abstain votes on a proposal." - }, - "no": { - "type": "string", - "description": "no is the number of no votes on a proposal." - }, - "no_with_veto": { - "type": "string", - "description": "no_with_veto is the number of no with veto votes on a proposal." - } - }, - "description": "final_tally_result is the final tally result of the proposal. When\nquerying a proposal via gRPC, this field is not populated until the\nproposal's voting period has ended." - }, - "submit_time": { - "type": "string", - "description": "submit_time is the time of proposal submission.", - "format": "date-time" - }, - "deposit_end_time": { - "type": "string", - "description": "deposit_end_time is the end time for deposition.", - "format": "date-time" - }, - "total_deposit": { - "type": "array", - "description": "total_deposit is the total deposit on the proposal.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "voting_start_time": { - "type": "string", - "description": "voting_start_time is the starting time to vote on a proposal.", - "format": "date-time" - }, - "voting_end_time": { - "type": "string", - "description": "voting_end_time is the end time of voting on a proposal.", - "format": "date-time" - } - }, - "description": "Proposal defines the core field members of a governance proposal." - } - }, - "description": "QueryProposalResponse is the response type for the Query/Proposal RPC method." - }, - "cosmos.gov.v1beta1.QueryProposalsResponse": { - "type": "object", - "properties": { - "proposals": { - "type": "array", - "description": "proposals defines all the requested governance proposals.", - "items": { - "type": "object", - "properties": { - "proposal_id": { - "type": "string", - "description": "proposal_id defines the unique id of the proposal.", - "format": "uint64" - }, - "content": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "status": { - "type": "string", - "description": "status defines the proposal status.", - "default": "PROPOSAL_STATUS_UNSPECIFIED", - "enum": [ - "PROPOSAL_STATUS_UNSPECIFIED", - "PROPOSAL_STATUS_DEPOSIT_PERIOD", - "PROPOSAL_STATUS_VOTING_PERIOD", - "PROPOSAL_STATUS_PASSED", - "PROPOSAL_STATUS_REJECTED", - "PROPOSAL_STATUS_FAILED" - ] - }, - "final_tally_result": { - "type": "object", - "properties": { - "yes": { - "type": "string", - "description": "yes is the number of yes votes on a proposal." - }, - "abstain": { - "type": "string", - "description": "abstain is the number of abstain votes on a proposal." - }, - "no": { - "type": "string", - "description": "no is the number of no votes on a proposal." - }, - "no_with_veto": { - "type": "string", - "description": "no_with_veto is the number of no with veto votes on a proposal." - } - }, - "description": "final_tally_result is the final tally result of the proposal. When\nquerying a proposal via gRPC, this field is not populated until the\nproposal's voting period has ended." - }, - "submit_time": { - "type": "string", - "description": "submit_time is the time of proposal submission.", - "format": "date-time" - }, - "deposit_end_time": { - "type": "string", - "description": "deposit_end_time is the end time for deposition.", - "format": "date-time" - }, - "total_deposit": { - "type": "array", - "description": "total_deposit is the total deposit on the proposal.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "voting_start_time": { - "type": "string", - "description": "voting_start_time is the starting time to vote on a proposal.", - "format": "date-time" - }, - "voting_end_time": { - "type": "string", - "description": "voting_end_time is the end time of voting on a proposal.", - "format": "date-time" - } - }, - "description": "Proposal defines the core field members of a governance proposal." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QueryProposalsResponse is the response type for the Query/Proposals RPC\nmethod." - }, - "cosmos.gov.v1beta1.QueryTallyResultResponse": { - "type": "object", - "properties": { - "tally": { - "type": "object", - "properties": { - "yes": { - "type": "string", - "description": "yes is the number of yes votes on a proposal." - }, - "abstain": { - "type": "string", - "description": "abstain is the number of abstain votes on a proposal." - }, - "no": { - "type": "string", - "description": "no is the number of no votes on a proposal." - }, - "no_with_veto": { - "type": "string", - "description": "no_with_veto is the number of no with veto votes on a proposal." - } - }, - "description": "tally defines the requested tally." - } - }, - "description": "QueryTallyResultResponse is the response type for the Query/Tally RPC method." - }, - "cosmos.gov.v1beta1.QueryVoteResponse": { - "type": "object", - "properties": { - "vote": { - "type": "object", - "properties": { - "proposal_id": { - "type": "string", - "description": "proposal_id defines the unique id of the proposal.", - "format": "uint64" - }, - "voter": { - "type": "string", - "description": "voter is the voter address of the proposal." - }, - "option": { - "type": "string", - "description": "Deprecated: Prefer to use `options` instead. This field is set in queries\nif and only if `len(options) == 1` and that option has weight 1. In all\nother cases, this field will default to VOTE_OPTION_UNSPECIFIED.", - "default": "VOTE_OPTION_UNSPECIFIED", - "enum": [ - "VOTE_OPTION_UNSPECIFIED", - "VOTE_OPTION_YES", - "VOTE_OPTION_ABSTAIN", - "VOTE_OPTION_NO", - "VOTE_OPTION_NO_WITH_VETO" - ] - }, - "options": { - "type": "array", - "description": "options is the weighted vote options.\n\nSince: cosmos-sdk 0.43", - "items": { - "type": "object", - "properties": { - "option": { - "type": "string", - "description": "option defines the valid vote options, it must not contain duplicate vote options.", - "default": "VOTE_OPTION_UNSPECIFIED", - "enum": [ - "VOTE_OPTION_UNSPECIFIED", - "VOTE_OPTION_YES", - "VOTE_OPTION_ABSTAIN", - "VOTE_OPTION_NO", - "VOTE_OPTION_NO_WITH_VETO" - ] - }, - "weight": { - "type": "string", - "description": "weight is the vote weight associated with the vote option." - } - }, - "description": "WeightedVoteOption defines a unit of vote for vote split.\n\nSince: cosmos-sdk 0.43" - } - } - }, - "description": "Vote defines a vote on a governance proposal.\nA Vote consists of a proposal ID, the voter, and the vote option." - } - }, - "description": "QueryVoteResponse is the response type for the Query/Vote RPC method." - }, - "cosmos.gov.v1beta1.QueryVotesResponse": { - "type": "object", - "properties": { - "votes": { - "type": "array", - "description": "votes defines the queried votes.", - "items": { - "type": "object", - "properties": { - "proposal_id": { - "type": "string", - "description": "proposal_id defines the unique id of the proposal.", - "format": "uint64" - }, - "voter": { - "type": "string", - "description": "voter is the voter address of the proposal." - }, - "option": { - "type": "string", - "description": "Deprecated: Prefer to use `options` instead. This field is set in queries\nif and only if `len(options) == 1` and that option has weight 1. In all\nother cases, this field will default to VOTE_OPTION_UNSPECIFIED.", - "default": "VOTE_OPTION_UNSPECIFIED", - "enum": [ - "VOTE_OPTION_UNSPECIFIED", - "VOTE_OPTION_YES", - "VOTE_OPTION_ABSTAIN", - "VOTE_OPTION_NO", - "VOTE_OPTION_NO_WITH_VETO" - ] - }, - "options": { - "type": "array", - "description": "options is the weighted vote options.\n\nSince: cosmos-sdk 0.43", - "items": { - "type": "object", - "properties": { - "option": { - "type": "string", - "description": "option defines the valid vote options, it must not contain duplicate vote options.", - "default": "VOTE_OPTION_UNSPECIFIED", - "enum": [ - "VOTE_OPTION_UNSPECIFIED", - "VOTE_OPTION_YES", - "VOTE_OPTION_ABSTAIN", - "VOTE_OPTION_NO", - "VOTE_OPTION_NO_WITH_VETO" - ] - }, - "weight": { - "type": "string", - "description": "weight is the vote weight associated with the vote option." - } - }, - "description": "WeightedVoteOption defines a unit of vote for vote split.\n\nSince: cosmos-sdk 0.43" - } - } - }, - "description": "Vote defines a vote on a governance proposal.\nA Vote consists of a proposal ID, the voter, and the vote option." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QueryVotesResponse is the response type for the Query/Votes RPC method." - }, - "cosmos.gov.v1beta1.TallyParams": { - "type": "object", - "properties": { - "quorum": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Minimum percentage of total stake needed to vote for a result to be\nconsidered valid.", - "format": "byte" - }, - "threshold": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Minimum proportion of Yes votes for proposal to pass. Default value: 0.5.", - "format": "byte" - }, - "veto_threshold": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Minimum value of Veto votes to Total votes ratio for proposal to be\nvetoed. Default value: 1/3.", - "format": "byte" - } - }, - "description": "TallyParams defines the params for tallying votes on governance proposals." - }, - "cosmos.gov.v1beta1.TallyResult": { - "type": "object", - "properties": { - "yes": { - "type": "string", - "description": "yes is the number of yes votes on a proposal." - }, - "abstain": { - "type": "string", - "description": "abstain is the number of abstain votes on a proposal." - }, - "no": { - "type": "string", - "description": "no is the number of no votes on a proposal." - }, - "no_with_veto": { - "type": "string", - "description": "no_with_veto is the number of no with veto votes on a proposal." - } - }, - "description": "TallyResult defines a standard tally for a governance proposal." - }, - "cosmos.gov.v1beta1.Vote": { - "type": "object", - "properties": { - "proposal_id": { - "type": "string", - "description": "proposal_id defines the unique id of the proposal.", - "format": "uint64" - }, - "voter": { - "type": "string", - "description": "voter is the voter address of the proposal." - }, - "option": { - "type": "string", - "description": "Deprecated: Prefer to use `options` instead. This field is set in queries\nif and only if `len(options) == 1` and that option has weight 1. In all\nother cases, this field will default to VOTE_OPTION_UNSPECIFIED.", - "default": "VOTE_OPTION_UNSPECIFIED", - "enum": [ - "VOTE_OPTION_UNSPECIFIED", - "VOTE_OPTION_YES", - "VOTE_OPTION_ABSTAIN", - "VOTE_OPTION_NO", - "VOTE_OPTION_NO_WITH_VETO" - ] - }, - "options": { - "type": "array", - "description": "options is the weighted vote options.\n\nSince: cosmos-sdk 0.43", - "items": { - "type": "object", - "properties": { - "option": { - "type": "string", - "description": "option defines the valid vote options, it must not contain duplicate vote options.", - "default": "VOTE_OPTION_UNSPECIFIED", - "enum": [ - "VOTE_OPTION_UNSPECIFIED", - "VOTE_OPTION_YES", - "VOTE_OPTION_ABSTAIN", - "VOTE_OPTION_NO", - "VOTE_OPTION_NO_WITH_VETO" - ] - }, - "weight": { - "type": "string", - "description": "weight is the vote weight associated with the vote option." - } - }, - "description": "WeightedVoteOption defines a unit of vote for vote split.\n\nSince: cosmos-sdk 0.43" - } - } - }, - "description": "Vote defines a vote on a governance proposal.\nA Vote consists of a proposal ID, the voter, and the vote option." - }, - "cosmos.gov.v1beta1.VoteOption": { - "type": "string", - "description": "VoteOption enumerates the valid vote options for a given governance proposal.\n\n - VOTE_OPTION_UNSPECIFIED: VOTE_OPTION_UNSPECIFIED defines a no-op vote option.\n - VOTE_OPTION_YES: VOTE_OPTION_YES defines a yes vote option.\n - VOTE_OPTION_ABSTAIN: VOTE_OPTION_ABSTAIN defines an abstain vote option.\n - VOTE_OPTION_NO: VOTE_OPTION_NO defines a no vote option.\n - VOTE_OPTION_NO_WITH_VETO: VOTE_OPTION_NO_WITH_VETO defines a no with veto vote option.", - "default": "VOTE_OPTION_UNSPECIFIED", - "enum": [ - "VOTE_OPTION_UNSPECIFIED", - "VOTE_OPTION_YES", - "VOTE_OPTION_ABSTAIN", - "VOTE_OPTION_NO", - "VOTE_OPTION_NO_WITH_VETO" - ] - }, - "cosmos.gov.v1beta1.VotingParams": { - "type": "object", - "properties": { - "voting_period": { - "type": "string", - "description": "Duration of the voting period." - } - }, - "description": "VotingParams defines the params for voting on governance proposals." - }, - "cosmos.gov.v1beta1.WeightedVoteOption": { - "type": "object", - "properties": { - "option": { - "type": "string", - "description": "option defines the valid vote options, it must not contain duplicate vote options.", - "default": "VOTE_OPTION_UNSPECIFIED", - "enum": [ - "VOTE_OPTION_UNSPECIFIED", - "VOTE_OPTION_YES", - "VOTE_OPTION_ABSTAIN", - "VOTE_OPTION_NO", - "VOTE_OPTION_NO_WITH_VETO" - ] - }, - "weight": { - "type": "string", - "description": "weight is the vote weight associated with the vote option." - } - }, - "description": "WeightedVoteOption defines a unit of vote for vote split.\n\nSince: cosmos-sdk 0.43" - }, - "cosmos.gov.v1.Deposit": { - "type": "object", - "properties": { - "proposal_id": { - "type": "string", - "description": "proposal_id defines the unique id of the proposal.", - "format": "uint64" - }, - "depositor": { - "type": "string", - "description": "depositor defines the deposit addresses from the proposals." - }, - "amount": { - "type": "array", - "description": "amount to be deposited by depositor.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - } - }, - "description": "Deposit defines an amount deposited by an account address to an active\nproposal." - }, - "cosmos.gov.v1.DepositParams": { - "type": "object", - "properties": { - "min_deposit": { - "type": "array", - "description": "Minimum deposit for a proposal to enter voting period.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "max_deposit_period": { - "type": "string", - "description": "Maximum period for Atom holders to deposit on a proposal. Initial value: 2\nmonths." - } - }, - "description": "DepositParams defines the params for deposits on governance proposals." - }, - "cosmos.gov.v1.Params": { - "type": "object", - "properties": { - "min_deposit": { - "type": "array", - "description": "Minimum deposit for a proposal to enter voting period.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "max_deposit_period": { - "type": "string", - "description": "Maximum period for Atom holders to deposit on a proposal. Initial value: 2\nmonths." - }, - "voting_period": { - "type": "string", - "description": "Duration of the voting period." - }, - "quorum": { - "type": "string", - "description": "Minimum percentage of total stake needed to vote for a result to be\n considered valid." - }, - "threshold": { - "type": "string", - "description": "Minimum proportion of Yes votes for proposal to pass. Default value: 0.5." - }, - "veto_threshold": { - "type": "string", - "description": "Minimum value of Veto votes to Total votes ratio for proposal to be\n vetoed. Default value: 1/3." - }, - "min_initial_deposit_ratio": { - "type": "string", - "description": "The ratio representing the proportion of the deposit value that must be paid at proposal submission." - }, - "proposal_cancel_ratio": { - "type": "string", - "description": "The cancel ratio which will not be returned back to the depositors when a proposal is cancelled.\n\nSince: cosmos-sdk 0.50" - }, - "proposal_cancel_dest": { - "type": "string", - "description": "The address which will receive (proposal_cancel_ratio * deposit) proposal deposits.\nIf empty, the (proposal_cancel_ratio * deposit) proposal deposits will be burned.\n\nSince: cosmos-sdk 0.50" - }, - "expedited_voting_period": { - "type": "string", - "description": "Duration of the voting period of an expedited proposal.\n\nSince: cosmos-sdk 0.50" - }, - "expedited_threshold": { - "type": "string", - "description": "Minimum proportion of Yes votes for proposal to pass. Default value: 0.67.\n\nSince: cosmos-sdk 0.50" - }, - "expedited_min_deposit": { - "type": "array", - "description": "Minimum expedited deposit for a proposal to enter voting period.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "burn_vote_quorum": { - "title": "burn deposits if a proposal does not meet quorum", - "type": "boolean" - }, - "burn_proposal_deposit_prevote": { - "title": "burn deposits if the proposal does not enter voting period", - "type": "boolean" - }, - "burn_vote_veto": { - "title": "burn deposits if quorum with vote type no_veto is met", - "type": "boolean" - } - }, - "description": "Params defines the parameters for the x/gov module.\n\nSince: cosmos-sdk 0.47" - }, - "cosmos.gov.v1.Proposal": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "id defines the unique id of the proposal.", - "format": "uint64" - }, - "messages": { - "type": "array", - "description": "messages are the arbitrary messages to be executed if the proposal passes.", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - }, - "status": { - "type": "string", - "description": "status defines the proposal status.", - "default": "PROPOSAL_STATUS_UNSPECIFIED", - "enum": [ - "PROPOSAL_STATUS_UNSPECIFIED", - "PROPOSAL_STATUS_DEPOSIT_PERIOD", - "PROPOSAL_STATUS_VOTING_PERIOD", - "PROPOSAL_STATUS_PASSED", - "PROPOSAL_STATUS_REJECTED", - "PROPOSAL_STATUS_FAILED" - ] - }, - "final_tally_result": { - "type": "object", - "properties": { - "yes_count": { - "type": "string", - "description": "yes_count is the number of yes votes on a proposal." - }, - "abstain_count": { - "type": "string", - "description": "abstain_count is the number of abstain votes on a proposal." - }, - "no_count": { - "type": "string", - "description": "no_count is the number of no votes on a proposal." - }, - "no_with_veto_count": { - "type": "string", - "description": "no_with_veto_count is the number of no with veto votes on a proposal." - } - }, - "description": "final_tally_result is the final tally result of the proposal. When\nquerying a proposal via gRPC, this field is not populated until the\nproposal's voting period has ended." - }, - "submit_time": { - "type": "string", - "description": "submit_time is the time of proposal submission.", - "format": "date-time" - }, - "deposit_end_time": { - "type": "string", - "description": "deposit_end_time is the end time for deposition.", - "format": "date-time" - }, - "total_deposit": { - "type": "array", - "description": "total_deposit is the total deposit on the proposal.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "voting_start_time": { - "type": "string", - "description": "voting_start_time is the starting time to vote on a proposal.", - "format": "date-time" - }, - "voting_end_time": { - "type": "string", - "description": "voting_end_time is the end time of voting on a proposal.", - "format": "date-time" - }, - "metadata": { - "title": "metadata is any arbitrary metadata attached to the proposal.\nthe recommended format of the metadata is to be found here:\nhttps://docs.cosmos.network/v0.47/modules/gov#proposal-3", - "type": "string" - }, - "title": { - "title": "title is the title of the proposal", - "type": "string", - "description": "Since: cosmos-sdk 0.47" - }, - "summary": { - "title": "summary is a short summary of the proposal", - "type": "string", - "description": "Since: cosmos-sdk 0.47" - }, - "proposer": { - "title": "proposer is the address of the proposal sumbitter", - "type": "string", - "description": "Since: cosmos-sdk 0.47" - }, - "expedited": { - "title": "expedited defines if the proposal is expedited", - "type": "boolean", - "description": "Since: cosmos-sdk 0.50" - }, - "failed_reason": { - "title": "failed_reason defines the reason why the proposal failed", - "type": "string", - "description": "Since: cosmos-sdk 0.50" - } - }, - "description": "Proposal defines the core field members of a governance proposal." - }, - "cosmos.gov.v1.ProposalStatus": { - "type": "string", - "description": "ProposalStatus enumerates the valid statuses of a proposal.\n\n - PROPOSAL_STATUS_UNSPECIFIED: PROPOSAL_STATUS_UNSPECIFIED defines the default proposal status.\n - PROPOSAL_STATUS_DEPOSIT_PERIOD: PROPOSAL_STATUS_DEPOSIT_PERIOD defines a proposal status during the deposit\nperiod.\n - PROPOSAL_STATUS_VOTING_PERIOD: PROPOSAL_STATUS_VOTING_PERIOD defines a proposal status during the voting\nperiod.\n - PROPOSAL_STATUS_PASSED: PROPOSAL_STATUS_PASSED defines a proposal status of a proposal that has\npassed.\n - PROPOSAL_STATUS_REJECTED: PROPOSAL_STATUS_REJECTED defines a proposal status of a proposal that has\nbeen rejected.\n - PROPOSAL_STATUS_FAILED: PROPOSAL_STATUS_FAILED defines a proposal status of a proposal that has\nfailed.", - "default": "PROPOSAL_STATUS_UNSPECIFIED", - "enum": [ - "PROPOSAL_STATUS_UNSPECIFIED", - "PROPOSAL_STATUS_DEPOSIT_PERIOD", - "PROPOSAL_STATUS_VOTING_PERIOD", - "PROPOSAL_STATUS_PASSED", - "PROPOSAL_STATUS_REJECTED", - "PROPOSAL_STATUS_FAILED" - ] - }, - "cosmos.gov.v1.QueryConstitutionResponse": { - "title": "QueryConstitutionResponse is the response type for the Query/Constitution RPC method", - "type": "object", - "properties": { - "constitution": { - "type": "string" - } - } - }, - "cosmos.gov.v1.QueryDepositResponse": { - "type": "object", - "properties": { - "deposit": { - "type": "object", - "properties": { - "proposal_id": { - "type": "string", - "description": "proposal_id defines the unique id of the proposal.", - "format": "uint64" - }, - "depositor": { - "type": "string", - "description": "depositor defines the deposit addresses from the proposals." - }, - "amount": { - "type": "array", - "description": "amount to be deposited by depositor.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - } - }, - "description": "Deposit defines an amount deposited by an account address to an active\nproposal." - } - }, - "description": "QueryDepositResponse is the response type for the Query/Deposit RPC method." - }, - "cosmos.gov.v1.QueryDepositsResponse": { - "type": "object", - "properties": { - "deposits": { - "type": "array", - "description": "deposits defines the requested deposits.", - "items": { - "type": "object", - "properties": { - "proposal_id": { - "type": "string", - "description": "proposal_id defines the unique id of the proposal.", - "format": "uint64" - }, - "depositor": { - "type": "string", - "description": "depositor defines the deposit addresses from the proposals." - }, - "amount": { - "type": "array", - "description": "amount to be deposited by depositor.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - } - }, - "description": "Deposit defines an amount deposited by an account address to an active\nproposal." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QueryDepositsResponse is the response type for the Query/Deposits RPC method." - }, - "cosmos.gov.v1.QueryParamsResponse": { - "type": "object", - "properties": { - "voting_params": { - "type": "object", - "properties": { - "voting_period": { - "type": "string", - "description": "Duration of the voting period." - } - }, - "description": "Deprecated: Prefer to use `params` instead.\nvoting_params defines the parameters related to voting." - }, - "deposit_params": { - "type": "object", - "properties": { - "min_deposit": { - "type": "array", - "description": "Minimum deposit for a proposal to enter voting period.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "max_deposit_period": { - "type": "string", - "description": "Maximum period for Atom holders to deposit on a proposal. Initial value: 2\nmonths." - } - }, - "description": "Deprecated: Prefer to use `params` instead.\ndeposit_params defines the parameters related to deposit." - }, - "tally_params": { - "type": "object", - "properties": { - "quorum": { - "type": "string", - "description": "Minimum percentage of total stake needed to vote for a result to be\nconsidered valid." - }, - "threshold": { - "type": "string", - "description": "Minimum proportion of Yes votes for proposal to pass. Default value: 0.5." - }, - "veto_threshold": { - "type": "string", - "description": "Minimum value of Veto votes to Total votes ratio for proposal to be\nvetoed. Default value: 1/3." - } - }, - "description": "Deprecated: Prefer to use `params` instead.\ntally_params defines the parameters related to tally." - }, - "params": { - "type": "object", - "properties": { - "min_deposit": { - "type": "array", - "description": "Minimum deposit for a proposal to enter voting period.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "max_deposit_period": { - "type": "string", - "description": "Maximum period for Atom holders to deposit on a proposal. Initial value: 2\nmonths." - }, - "voting_period": { - "type": "string", - "description": "Duration of the voting period." - }, - "quorum": { - "type": "string", - "description": "Minimum percentage of total stake needed to vote for a result to be\n considered valid." - }, - "threshold": { - "type": "string", - "description": "Minimum proportion of Yes votes for proposal to pass. Default value: 0.5." - }, - "veto_threshold": { - "type": "string", - "description": "Minimum value of Veto votes to Total votes ratio for proposal to be\n vetoed. Default value: 1/3." - }, - "min_initial_deposit_ratio": { - "type": "string", - "description": "The ratio representing the proportion of the deposit value that must be paid at proposal submission." - }, - "proposal_cancel_ratio": { - "type": "string", - "description": "The cancel ratio which will not be returned back to the depositors when a proposal is cancelled.\n\nSince: cosmos-sdk 0.50" - }, - "proposal_cancel_dest": { - "type": "string", - "description": "The address which will receive (proposal_cancel_ratio * deposit) proposal deposits.\nIf empty, the (proposal_cancel_ratio * deposit) proposal deposits will be burned.\n\nSince: cosmos-sdk 0.50" - }, - "expedited_voting_period": { - "type": "string", - "description": "Duration of the voting period of an expedited proposal.\n\nSince: cosmos-sdk 0.50" - }, - "expedited_threshold": { - "type": "string", - "description": "Minimum proportion of Yes votes for proposal to pass. Default value: 0.67.\n\nSince: cosmos-sdk 0.50" - }, - "expedited_min_deposit": { - "type": "array", - "description": "Minimum expedited deposit for a proposal to enter voting period.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "burn_vote_quorum": { - "title": "burn deposits if a proposal does not meet quorum", - "type": "boolean" - }, - "burn_proposal_deposit_prevote": { - "title": "burn deposits if the proposal does not enter voting period", - "type": "boolean" - }, - "burn_vote_veto": { - "title": "burn deposits if quorum with vote type no_veto is met", - "type": "boolean" - } - }, - "description": "params defines all the paramaters of x/gov module.\n\nSince: cosmos-sdk 0.47" - } - }, - "description": "QueryParamsResponse is the response type for the Query/Params RPC method." - }, - "cosmos.gov.v1.QueryProposalResponse": { - "type": "object", - "properties": { - "proposal": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "id defines the unique id of the proposal.", - "format": "uint64" - }, - "messages": { - "type": "array", - "description": "messages are the arbitrary messages to be executed if the proposal passes.", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - }, - "status": { - "type": "string", - "description": "status defines the proposal status.", - "default": "PROPOSAL_STATUS_UNSPECIFIED", - "enum": [ - "PROPOSAL_STATUS_UNSPECIFIED", - "PROPOSAL_STATUS_DEPOSIT_PERIOD", - "PROPOSAL_STATUS_VOTING_PERIOD", - "PROPOSAL_STATUS_PASSED", - "PROPOSAL_STATUS_REJECTED", - "PROPOSAL_STATUS_FAILED" - ] - }, - "final_tally_result": { - "type": "object", - "properties": { - "yes_count": { - "type": "string", - "description": "yes_count is the number of yes votes on a proposal." - }, - "abstain_count": { - "type": "string", - "description": "abstain_count is the number of abstain votes on a proposal." - }, - "no_count": { - "type": "string", - "description": "no_count is the number of no votes on a proposal." - }, - "no_with_veto_count": { - "type": "string", - "description": "no_with_veto_count is the number of no with veto votes on a proposal." - } - }, - "description": "final_tally_result is the final tally result of the proposal. When\nquerying a proposal via gRPC, this field is not populated until the\nproposal's voting period has ended." - }, - "submit_time": { - "type": "string", - "description": "submit_time is the time of proposal submission.", - "format": "date-time" - }, - "deposit_end_time": { - "type": "string", - "description": "deposit_end_time is the end time for deposition.", - "format": "date-time" - }, - "total_deposit": { - "type": "array", - "description": "total_deposit is the total deposit on the proposal.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "voting_start_time": { - "type": "string", - "description": "voting_start_time is the starting time to vote on a proposal.", - "format": "date-time" - }, - "voting_end_time": { - "type": "string", - "description": "voting_end_time is the end time of voting on a proposal.", - "format": "date-time" - }, - "metadata": { - "title": "metadata is any arbitrary metadata attached to the proposal.\nthe recommended format of the metadata is to be found here:\nhttps://docs.cosmos.network/v0.47/modules/gov#proposal-3", - "type": "string" - }, - "title": { - "title": "title is the title of the proposal", - "type": "string", - "description": "Since: cosmos-sdk 0.47" - }, - "summary": { - "title": "summary is a short summary of the proposal", - "type": "string", - "description": "Since: cosmos-sdk 0.47" - }, - "proposer": { - "title": "proposer is the address of the proposal sumbitter", - "type": "string", - "description": "Since: cosmos-sdk 0.47" - }, - "expedited": { - "title": "expedited defines if the proposal is expedited", - "type": "boolean", - "description": "Since: cosmos-sdk 0.50" - }, - "failed_reason": { - "title": "failed_reason defines the reason why the proposal failed", - "type": "string", - "description": "Since: cosmos-sdk 0.50" - } - }, - "description": "Proposal defines the core field members of a governance proposal." - } - }, - "description": "QueryProposalResponse is the response type for the Query/Proposal RPC method." - }, - "cosmos.gov.v1.QueryProposalsResponse": { - "type": "object", - "properties": { - "proposals": { - "type": "array", - "description": "proposals defines all the requested governance proposals.", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "id defines the unique id of the proposal.", - "format": "uint64" - }, - "messages": { - "type": "array", - "description": "messages are the arbitrary messages to be executed if the proposal passes.", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - }, - "status": { - "type": "string", - "description": "status defines the proposal status.", - "default": "PROPOSAL_STATUS_UNSPECIFIED", - "enum": [ - "PROPOSAL_STATUS_UNSPECIFIED", - "PROPOSAL_STATUS_DEPOSIT_PERIOD", - "PROPOSAL_STATUS_VOTING_PERIOD", - "PROPOSAL_STATUS_PASSED", - "PROPOSAL_STATUS_REJECTED", - "PROPOSAL_STATUS_FAILED" - ] - }, - "final_tally_result": { - "type": "object", - "properties": { - "yes_count": { - "type": "string", - "description": "yes_count is the number of yes votes on a proposal." - }, - "abstain_count": { - "type": "string", - "description": "abstain_count is the number of abstain votes on a proposal." - }, - "no_count": { - "type": "string", - "description": "no_count is the number of no votes on a proposal." - }, - "no_with_veto_count": { - "type": "string", - "description": "no_with_veto_count is the number of no with veto votes on a proposal." - } - }, - "description": "final_tally_result is the final tally result of the proposal. When\nquerying a proposal via gRPC, this field is not populated until the\nproposal's voting period has ended." - }, - "submit_time": { - "type": "string", - "description": "submit_time is the time of proposal submission.", - "format": "date-time" - }, - "deposit_end_time": { - "type": "string", - "description": "deposit_end_time is the end time for deposition.", - "format": "date-time" - }, - "total_deposit": { - "type": "array", - "description": "total_deposit is the total deposit on the proposal.", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "voting_start_time": { - "type": "string", - "description": "voting_start_time is the starting time to vote on a proposal.", - "format": "date-time" - }, - "voting_end_time": { - "type": "string", - "description": "voting_end_time is the end time of voting on a proposal.", - "format": "date-time" - }, - "metadata": { - "title": "metadata is any arbitrary metadata attached to the proposal.\nthe recommended format of the metadata is to be found here:\nhttps://docs.cosmos.network/v0.47/modules/gov#proposal-3", - "type": "string" - }, - "title": { - "title": "title is the title of the proposal", - "type": "string", - "description": "Since: cosmos-sdk 0.47" - }, - "summary": { - "title": "summary is a short summary of the proposal", - "type": "string", - "description": "Since: cosmos-sdk 0.47" - }, - "proposer": { - "title": "proposer is the address of the proposal sumbitter", - "type": "string", - "description": "Since: cosmos-sdk 0.47" - }, - "expedited": { - "title": "expedited defines if the proposal is expedited", - "type": "boolean", - "description": "Since: cosmos-sdk 0.50" - }, - "failed_reason": { - "title": "failed_reason defines the reason why the proposal failed", - "type": "string", - "description": "Since: cosmos-sdk 0.50" - } - }, - "description": "Proposal defines the core field members of a governance proposal." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QueryProposalsResponse is the response type for the Query/Proposals RPC\nmethod." - }, - "cosmos.gov.v1.QueryTallyResultResponse": { - "type": "object", - "properties": { - "tally": { - "type": "object", - "properties": { - "yes_count": { - "type": "string", - "description": "yes_count is the number of yes votes on a proposal." - }, - "abstain_count": { - "type": "string", - "description": "abstain_count is the number of abstain votes on a proposal." - }, - "no_count": { - "type": "string", - "description": "no_count is the number of no votes on a proposal." - }, - "no_with_veto_count": { - "type": "string", - "description": "no_with_veto_count is the number of no with veto votes on a proposal." - } - }, - "description": "tally defines the requested tally." - } - }, - "description": "QueryTallyResultResponse is the response type for the Query/Tally RPC method." - }, - "cosmos.gov.v1.QueryVoteResponse": { - "type": "object", - "properties": { - "vote": { - "type": "object", - "properties": { - "proposal_id": { - "type": "string", - "description": "proposal_id defines the unique id of the proposal.", - "format": "uint64" - }, - "voter": { - "type": "string", - "description": "voter is the voter address of the proposal." - }, - "options": { - "type": "array", - "description": "options is the weighted vote options.", - "items": { - "type": "object", - "properties": { - "option": { - "type": "string", - "description": "option defines the valid vote options, it must not contain duplicate vote options.", - "default": "VOTE_OPTION_UNSPECIFIED", - "enum": [ - "VOTE_OPTION_UNSPECIFIED", - "VOTE_OPTION_YES", - "VOTE_OPTION_ABSTAIN", - "VOTE_OPTION_NO", - "VOTE_OPTION_NO_WITH_VETO" - ] - }, - "weight": { - "type": "string", - "description": "weight is the vote weight associated with the vote option." - } - }, - "description": "WeightedVoteOption defines a unit of vote for vote split." - } - }, - "metadata": { - "title": "metadata is any arbitrary metadata attached to the vote.\nthe recommended format of the metadata is to be found here: https://docs.cosmos.network/v0.47/modules/gov#vote-5", - "type": "string" - } - }, - "description": "Vote defines a vote on a governance proposal.\nA Vote consists of a proposal ID, the voter, and the vote option." - } - }, - "description": "QueryVoteResponse is the response type for the Query/Vote RPC method." - }, - "cosmos.gov.v1.QueryVotesResponse": { - "type": "object", - "properties": { - "votes": { - "type": "array", - "description": "votes defines the queried votes.", - "items": { - "type": "object", - "properties": { - "proposal_id": { - "type": "string", - "description": "proposal_id defines the unique id of the proposal.", - "format": "uint64" - }, - "voter": { - "type": "string", - "description": "voter is the voter address of the proposal." - }, - "options": { - "type": "array", - "description": "options is the weighted vote options.", - "items": { - "type": "object", - "properties": { - "option": { - "type": "string", - "description": "option defines the valid vote options, it must not contain duplicate vote options.", - "default": "VOTE_OPTION_UNSPECIFIED", - "enum": [ - "VOTE_OPTION_UNSPECIFIED", - "VOTE_OPTION_YES", - "VOTE_OPTION_ABSTAIN", - "VOTE_OPTION_NO", - "VOTE_OPTION_NO_WITH_VETO" - ] - }, - "weight": { - "type": "string", - "description": "weight is the vote weight associated with the vote option." - } - }, - "description": "WeightedVoteOption defines a unit of vote for vote split." - } - }, - "metadata": { - "title": "metadata is any arbitrary metadata attached to the vote.\nthe recommended format of the metadata is to be found here: https://docs.cosmos.network/v0.47/modules/gov#vote-5", - "type": "string" - } - }, - "description": "Vote defines a vote on a governance proposal.\nA Vote consists of a proposal ID, the voter, and the vote option." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QueryVotesResponse is the response type for the Query/Votes RPC method." - }, - "cosmos.gov.v1.TallyParams": { - "type": "object", - "properties": { - "quorum": { - "type": "string", - "description": "Minimum percentage of total stake needed to vote for a result to be\nconsidered valid." - }, - "threshold": { - "type": "string", - "description": "Minimum proportion of Yes votes for proposal to pass. Default value: 0.5." - }, - "veto_threshold": { - "type": "string", - "description": "Minimum value of Veto votes to Total votes ratio for proposal to be\nvetoed. Default value: 1/3." - } - }, - "description": "TallyParams defines the params for tallying votes on governance proposals." - }, - "cosmos.gov.v1.TallyResult": { - "type": "object", - "properties": { - "yes_count": { - "type": "string", - "description": "yes_count is the number of yes votes on a proposal." - }, - "abstain_count": { - "type": "string", - "description": "abstain_count is the number of abstain votes on a proposal." - }, - "no_count": { - "type": "string", - "description": "no_count is the number of no votes on a proposal." - }, - "no_with_veto_count": { - "type": "string", - "description": "no_with_veto_count is the number of no with veto votes on a proposal." - } - }, - "description": "TallyResult defines a standard tally for a governance proposal." - }, - "cosmos.gov.v1.Vote": { - "type": "object", - "properties": { - "proposal_id": { - "type": "string", - "description": "proposal_id defines the unique id of the proposal.", - "format": "uint64" - }, - "voter": { - "type": "string", - "description": "voter is the voter address of the proposal." - }, - "options": { - "type": "array", - "description": "options is the weighted vote options.", - "items": { - "type": "object", - "properties": { - "option": { - "type": "string", - "description": "option defines the valid vote options, it must not contain duplicate vote options.", - "default": "VOTE_OPTION_UNSPECIFIED", - "enum": [ - "VOTE_OPTION_UNSPECIFIED", - "VOTE_OPTION_YES", - "VOTE_OPTION_ABSTAIN", - "VOTE_OPTION_NO", - "VOTE_OPTION_NO_WITH_VETO" - ] - }, - "weight": { - "type": "string", - "description": "weight is the vote weight associated with the vote option." - } - }, - "description": "WeightedVoteOption defines a unit of vote for vote split." - } - }, - "metadata": { - "title": "metadata is any arbitrary metadata attached to the vote.\nthe recommended format of the metadata is to be found here: https://docs.cosmos.network/v0.47/modules/gov#vote-5", - "type": "string" - } - }, - "description": "Vote defines a vote on a governance proposal.\nA Vote consists of a proposal ID, the voter, and the vote option." - }, - "cosmos.gov.v1.VoteOption": { - "type": "string", - "description": "VoteOption enumerates the valid vote options for a given governance proposal.\n\n - VOTE_OPTION_UNSPECIFIED: VOTE_OPTION_UNSPECIFIED defines a no-op vote option.\n - VOTE_OPTION_YES: VOTE_OPTION_YES defines a yes vote option.\n - VOTE_OPTION_ABSTAIN: VOTE_OPTION_ABSTAIN defines an abstain vote option.\n - VOTE_OPTION_NO: VOTE_OPTION_NO defines a no vote option.\n - VOTE_OPTION_NO_WITH_VETO: VOTE_OPTION_NO_WITH_VETO defines a no with veto vote option.", - "default": "VOTE_OPTION_UNSPECIFIED", - "enum": [ - "VOTE_OPTION_UNSPECIFIED", - "VOTE_OPTION_YES", - "VOTE_OPTION_ABSTAIN", - "VOTE_OPTION_NO", - "VOTE_OPTION_NO_WITH_VETO" - ] - }, - "cosmos.gov.v1.VotingParams": { - "type": "object", - "properties": { - "voting_period": { - "type": "string", - "description": "Duration of the voting period." - } - }, - "description": "VotingParams defines the params for voting on governance proposals." - }, - "cosmos.gov.v1.WeightedVoteOption": { - "type": "object", - "properties": { - "option": { - "type": "string", - "description": "option defines the valid vote options, it must not contain duplicate vote options.", - "default": "VOTE_OPTION_UNSPECIFIED", - "enum": [ - "VOTE_OPTION_UNSPECIFIED", - "VOTE_OPTION_YES", - "VOTE_OPTION_ABSTAIN", - "VOTE_OPTION_NO", - "VOTE_OPTION_NO_WITH_VETO" - ] - }, - "weight": { - "type": "string", - "description": "weight is the vote weight associated with the vote option." - } - }, - "description": "WeightedVoteOption defines a unit of vote for vote split." - }, - "cosmos.slashing.v1beta1.Params": { - "type": "object", - "properties": { - "signed_blocks_window": { - "type": "string", - "format": "int64" - }, - "min_signed_per_window": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "downtime_jail_duration": { - "type": "string" - }, - "slash_fraction_double_sign": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "slash_fraction_downtime": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "Params represents the parameters used for by the slashing module." - }, - "cosmos.slashing.v1beta1.QueryParamsResponse": { - "title": "QueryParamsResponse is the response type for the Query/Params RPC method", - "type": "object", - "properties": { - "params": { - "type": "object", - "properties": { - "signed_blocks_window": { - "type": "string", - "format": "int64" - }, - "min_signed_per_window": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "downtime_jail_duration": { - "type": "string" - }, - "slash_fraction_double_sign": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "slash_fraction_downtime": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "Params represents the parameters used for by the slashing module." - } - } - }, - "cosmos.slashing.v1beta1.QuerySigningInfoResponse": { - "title": "QuerySigningInfoResponse is the response type for the Query/SigningInfo RPC\nmethod", - "type": "object", - "properties": { - "val_signing_info": { - "title": "val_signing_info is the signing info of requested val cons address", - "type": "object", - "properties": { - "address": { - "type": "string" - }, - "start_height": { - "title": "Height at which validator was first a candidate OR was un-jailed", - "type": "string", - "format": "int64" - }, - "index_offset": { - "type": "string", - "description": "Index which is incremented every time a validator is bonded in a block and\n_may_ have signed a pre-commit or not. This in conjunction with the\nsigned_blocks_window param determines the index in the missed block bitmap.", - "format": "int64" - }, - "jailed_until": { - "type": "string", - "description": "Timestamp until which the validator is jailed due to liveness downtime.", - "format": "date-time" - }, - "tombstoned": { - "type": "boolean", - "description": "Whether or not a validator has been tombstoned (killed out of validator\nset). It is set once the validator commits an equivocation or for any other\nconfigured misbehavior." - }, - "missed_blocks_counter": { - "type": "string", - "description": "A counter of missed (unsigned) blocks. It is used to avoid unnecessary\nreads in the missed block bitmap.", - "format": "int64" - } - }, - "description": "ValidatorSigningInfo defines a validator's signing info for monitoring their\nliveness activity." - } - } - }, - "cosmos.slashing.v1beta1.QuerySigningInfosResponse": { - "title": "QuerySigningInfosResponse is the response type for the Query/SigningInfos RPC\nmethod", - "type": "object", - "properties": { - "info": { - "title": "info is the signing info of all validators", - "type": "array", - "items": { - "type": "object", - "properties": { - "address": { - "type": "string" - }, - "start_height": { - "title": "Height at which validator was first a candidate OR was un-jailed", - "type": "string", - "format": "int64" - }, - "index_offset": { - "type": "string", - "description": "Index which is incremented every time a validator is bonded in a block and\n_may_ have signed a pre-commit or not. This in conjunction with the\nsigned_blocks_window param determines the index in the missed block bitmap.", - "format": "int64" - }, - "jailed_until": { - "type": "string", - "description": "Timestamp until which the validator is jailed due to liveness downtime.", - "format": "date-time" - }, - "tombstoned": { - "type": "boolean", - "description": "Whether or not a validator has been tombstoned (killed out of validator\nset). It is set once the validator commits an equivocation or for any other\nconfigured misbehavior." - }, - "missed_blocks_counter": { - "type": "string", - "description": "A counter of missed (unsigned) blocks. It is used to avoid unnecessary\nreads in the missed block bitmap.", - "format": "int64" - } - }, - "description": "ValidatorSigningInfo defines a validator's signing info for monitoring their\nliveness activity." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }" - } - } - }, - "cosmos.slashing.v1beta1.ValidatorSigningInfo": { - "type": "object", - "properties": { - "address": { - "type": "string" - }, - "start_height": { - "title": "Height at which validator was first a candidate OR was un-jailed", - "type": "string", - "format": "int64" - }, - "index_offset": { - "type": "string", - "description": "Index which is incremented every time a validator is bonded in a block and\n_may_ have signed a pre-commit or not. This in conjunction with the\nsigned_blocks_window param determines the index in the missed block bitmap.", - "format": "int64" - }, - "jailed_until": { - "type": "string", - "description": "Timestamp until which the validator is jailed due to liveness downtime.", - "format": "date-time" - }, - "tombstoned": { - "type": "boolean", - "description": "Whether or not a validator has been tombstoned (killed out of validator\nset). It is set once the validator commits an equivocation or for any other\nconfigured misbehavior." - }, - "missed_blocks_counter": { - "type": "string", - "description": "A counter of missed (unsigned) blocks. It is used to avoid unnecessary\nreads in the missed block bitmap.", - "format": "int64" - } - }, - "description": "ValidatorSigningInfo defines a validator's signing info for monitoring their\nliveness activity." - }, - "cosmos.staking.v1beta1.BondStatus": { - "type": "string", - "description": "BondStatus is the status of a validator.\n\n - BOND_STATUS_UNSPECIFIED: UNSPECIFIED defines an invalid validator status.\n - BOND_STATUS_UNBONDED: UNBONDED defines a validator that is not bonded.\n - BOND_STATUS_UNBONDING: UNBONDING defines a validator that is unbonding.\n - BOND_STATUS_BONDED: BONDED defines a validator that is bonded.", - "default": "BOND_STATUS_UNSPECIFIED", - "enum": [ - "BOND_STATUS_UNSPECIFIED", - "BOND_STATUS_UNBONDED", - "BOND_STATUS_UNBONDING", - "BOND_STATUS_BONDED" - ] - }, - "cosmos.staking.v1beta1.Commission": { - "type": "object", - "properties": { - "commission_rates": { - "type": "object", - "properties": { - "rate": { - "type": "string", - "description": "rate is the commission rate charged to delegators, as a fraction." - }, - "max_rate": { - "type": "string", - "description": "max_rate defines the maximum commission rate which validator can ever charge, as a fraction." - }, - "max_change_rate": { - "type": "string", - "description": "max_change_rate defines the maximum daily increase of the validator commission, as a fraction." - } - }, - "description": "commission_rates defines the initial commission rates to be used for creating a validator." - }, - "update_time": { - "type": "string", - "description": "update_time is the last time the commission rate was changed.", - "format": "date-time" - } - }, - "description": "Commission defines commission parameters for a given validator." - }, - "cosmos.staking.v1beta1.CommissionRates": { - "type": "object", - "properties": { - "rate": { - "type": "string", - "description": "rate is the commission rate charged to delegators, as a fraction." - }, - "max_rate": { - "type": "string", - "description": "max_rate defines the maximum commission rate which validator can ever charge, as a fraction." - }, - "max_change_rate": { - "type": "string", - "description": "max_change_rate defines the maximum daily increase of the validator commission, as a fraction." - } - }, - "description": "CommissionRates defines the initial commission rates to be used for creating\na validator." - }, - "cosmos.staking.v1beta1.Delegation": { - "type": "object", - "properties": { - "delegator_address": { - "type": "string", - "description": "delegator_address is the encoded address of the delegator." - }, - "validator_address": { - "type": "string", - "description": "validator_address is the encoded address of the validator." - }, - "shares": { - "type": "string", - "description": "shares define the delegation shares received." - } - }, - "description": "Delegation represents the bond with tokens held by an account. It is\nowned by one delegator, and is associated with the voting power of one\nvalidator." - }, - "cosmos.staking.v1beta1.DelegationResponse": { - "type": "object", - "properties": { - "delegation": { - "type": "object", - "properties": { - "delegator_address": { - "type": "string", - "description": "delegator_address is the encoded address of the delegator." - }, - "validator_address": { - "type": "string", - "description": "validator_address is the encoded address of the validator." - }, - "shares": { - "type": "string", - "description": "shares define the delegation shares received." - } - }, - "description": "Delegation represents the bond with tokens held by an account. It is\nowned by one delegator, and is associated with the voting power of one\nvalidator." - }, - "balance": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "description": "DelegationResponse is equivalent to Delegation except that it contains a\nbalance in addition to shares which is more suitable for client responses." - }, - "cosmos.staking.v1beta1.Description": { - "type": "object", - "properties": { - "moniker": { - "type": "string", - "description": "moniker defines a human-readable name for the validator." - }, - "identity": { - "type": "string", - "description": "identity defines an optional identity signature (ex. UPort or Keybase)." - }, - "website": { - "type": "string", - "description": "website defines an optional website link." - }, - "security_contact": { - "type": "string", - "description": "security_contact defines an optional email for security contact." - }, - "details": { - "type": "string", - "description": "details define other optional details." - } - }, - "description": "Description defines a validator description." - }, - "cosmos.staking.v1beta1.HistoricalInfo": { - "type": "object", - "properties": { - "header": { - "type": "object", - "properties": { - "version": { - "title": "basic block info", - "type": "object", - "properties": { - "block": { - "type": "string", - "format": "uint64" - }, - "app": { - "type": "string", - "format": "uint64" - } - }, - "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." - }, - "chain_id": { - "type": "string" - }, - "height": { - "type": "string", - "format": "int64" - }, - "time": { - "type": "string", - "format": "date-time" - }, - "last_block_id": { - "title": "prev block info", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "last_commit_hash": { - "title": "hashes of block data", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "data_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validators_hash": { - "title": "hashes from the app output from the prev block", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "next_validators_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "consensus_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "app_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "last_results_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "evidence_hash": { - "title": "consensus info", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proposer_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "Header defines the structure of a block header." - }, - "valset": { - "type": "array", - "items": { - "type": "object", - "properties": { - "operator_address": { - "type": "string", - "description": "operator_address defines the address of the validator's operator; bech encoded in JSON." - }, - "consensus_pubkey": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "jailed": { - "type": "boolean", - "description": "jailed defined whether the validator has been jailed from bonded status or not." - }, - "status": { - "type": "string", - "description": "status is the validator status (bonded/unbonding/unbonded).", - "default": "BOND_STATUS_UNSPECIFIED", - "enum": [ - "BOND_STATUS_UNSPECIFIED", - "BOND_STATUS_UNBONDED", - "BOND_STATUS_UNBONDING", - "BOND_STATUS_BONDED" - ] - }, - "tokens": { - "type": "string", - "description": "tokens define the delegated tokens (incl. self-delegation)." - }, - "delegator_shares": { - "type": "string", - "description": "delegator_shares defines total shares issued to a validator's delegators." - }, - "description": { - "type": "object", - "properties": { - "moniker": { - "type": "string", - "description": "moniker defines a human-readable name for the validator." - }, - "identity": { - "type": "string", - "description": "identity defines an optional identity signature (ex. UPort or Keybase)." - }, - "website": { - "type": "string", - "description": "website defines an optional website link." - }, - "security_contact": { - "type": "string", - "description": "security_contact defines an optional email for security contact." - }, - "details": { - "type": "string", - "description": "details define other optional details." - } - }, - "description": "description defines the description terms for the validator." - }, - "unbonding_height": { - "type": "string", - "description": "unbonding_height defines, if unbonding, the height at which this validator has begun unbonding.", - "format": "int64" - }, - "unbonding_time": { - "type": "string", - "description": "unbonding_time defines, if unbonding, the min time for the validator to complete unbonding.", - "format": "date-time" - }, - "commission": { - "type": "object", - "properties": { - "commission_rates": { - "type": "object", - "properties": { - "rate": { - "type": "string", - "description": "rate is the commission rate charged to delegators, as a fraction." - }, - "max_rate": { - "type": "string", - "description": "max_rate defines the maximum commission rate which validator can ever charge, as a fraction." - }, - "max_change_rate": { - "type": "string", - "description": "max_change_rate defines the maximum daily increase of the validator commission, as a fraction." - } - }, - "description": "commission_rates defines the initial commission rates to be used for creating a validator." - }, - "update_time": { - "type": "string", - "description": "update_time is the last time the commission rate was changed.", - "format": "date-time" - } - }, - "description": "commission defines the commission parameters." - }, - "min_self_delegation": { - "type": "string", - "description": "min_self_delegation is the validator's self declared minimum self delegation.\n\nSince: cosmos-sdk 0.46" - }, - "unbonding_on_hold_ref_count": { - "title": "strictly positive if this validator's unbonding has been stopped by external modules", - "type": "string", - "format": "int64" - }, - "unbonding_ids": { - "title": "list of unbonding ids, each uniquely identifing an unbonding of this validator", - "type": "array", - "items": { - "type": "string", - "format": "uint64" - } - } - }, - "description": "Validator defines a validator, together with the total amount of the\nValidator's bond shares and their exchange rate to coins. Slashing results in\na decrease in the exchange rate, allowing correct calculation of future\nundelegations without iterating over delegators. When coins are delegated to\nthis validator, the validator is credited with a delegation whose number of\nbond shares is based on the amount of coins delegated divided by the current\nexchange rate. Voting power can be calculated as total bonded shares\nmultiplied by exchange rate." - } - } - }, - "description": "HistoricalInfo contains header and validator information for a given block.\nIt is stored as part of staking module's state, which persists the `n` most\nrecent HistoricalInfo\n(`n` is set by the staking module's `historical_entries` parameter)." - }, - "cosmos.staking.v1beta1.Params": { - "type": "object", - "properties": { - "unbonding_time": { - "type": "string", - "description": "unbonding_time is the time duration of unbonding." - }, - "max_validators": { - "type": "integer", - "description": "max_validators is the maximum number of validators.", - "format": "int64" - }, - "max_entries": { - "type": "integer", - "description": "max_entries is the max entries for either unbonding delegation or redelegation (per pair/trio).", - "format": "int64" - }, - "historical_entries": { - "type": "integer", - "description": "historical_entries is the number of historical entries to persist.", - "format": "int64" - }, - "bond_denom": { - "type": "string", - "description": "bond_denom defines the bondable coin denomination." - }, - "min_commission_rate": { - "title": "min_commission_rate is the chain-wide minimum commission rate that a validator can charge their delegators", - "type": "string" - } - }, - "description": "Params defines the parameters for the x/staking module." - }, - "cosmos.staking.v1beta1.Pool": { - "type": "object", - "properties": { - "not_bonded_tokens": { - "type": "string" - }, - "bonded_tokens": { - "type": "string" - } - }, - "description": "Pool is used for tracking bonded and not-bonded token supply of the bond\ndenomination." - }, - "cosmos.staking.v1beta1.QueryDelegationResponse": { - "type": "object", - "properties": { - "delegation_response": { - "type": "object", - "properties": { - "delegation": { - "type": "object", - "properties": { - "delegator_address": { - "type": "string", - "description": "delegator_address is the encoded address of the delegator." - }, - "validator_address": { - "type": "string", - "description": "validator_address is the encoded address of the validator." - }, - "shares": { - "type": "string", - "description": "shares define the delegation shares received." - } - }, - "description": "Delegation represents the bond with tokens held by an account. It is\nowned by one delegator, and is associated with the voting power of one\nvalidator." - }, - "balance": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "description": "DelegationResponse is equivalent to Delegation except that it contains a\nbalance in addition to shares which is more suitable for client responses." - } - }, - "description": "QueryDelegationResponse is response type for the Query/Delegation RPC method." - }, - "cosmos.staking.v1beta1.QueryDelegatorDelegationsResponse": { - "type": "object", - "properties": { - "delegation_responses": { - "type": "array", - "description": "delegation_responses defines all the delegations' info of a delegator.", - "items": { - "type": "object", - "properties": { - "delegation": { - "type": "object", - "properties": { - "delegator_address": { - "type": "string", - "description": "delegator_address is the encoded address of the delegator." - }, - "validator_address": { - "type": "string", - "description": "validator_address is the encoded address of the validator." - }, - "shares": { - "type": "string", - "description": "shares define the delegation shares received." - } - }, - "description": "Delegation represents the bond with tokens held by an account. It is\nowned by one delegator, and is associated with the voting power of one\nvalidator." - }, - "balance": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "description": "DelegationResponse is equivalent to Delegation except that it contains a\nbalance in addition to shares which is more suitable for client responses." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QueryDelegatorDelegationsResponse is response type for the\nQuery/DelegatorDelegations RPC method." - }, - "cosmos.staking.v1beta1.QueryDelegatorUnbondingDelegationsResponse": { - "type": "object", - "properties": { - "unbonding_responses": { - "type": "array", - "items": { - "type": "object", - "properties": { - "delegator_address": { - "type": "string", - "description": "delegator_address is the encoded address of the delegator." - }, - "validator_address": { - "type": "string", - "description": "validator_address is the encoded address of the validator." - }, - "entries": { - "type": "array", - "description": "entries are the unbonding delegation entries.", - "items": { - "type": "object", - "properties": { - "creation_height": { - "type": "string", - "description": "creation_height is the height which the unbonding took place.", - "format": "int64" - }, - "completion_time": { - "type": "string", - "description": "completion_time is the unix time for unbonding completion.", - "format": "date-time" - }, - "initial_balance": { - "type": "string", - "description": "initial_balance defines the tokens initially scheduled to receive at completion." - }, - "balance": { - "type": "string", - "description": "balance defines the tokens to receive at completion." - }, - "unbonding_id": { - "title": "Incrementing id that uniquely identifies this entry", - "type": "string", - "format": "uint64" - }, - "unbonding_on_hold_ref_count": { - "title": "Strictly positive if this entry's unbonding has been stopped by external modules", - "type": "string", - "format": "int64" - } - }, - "description": "UnbondingDelegationEntry defines an unbonding object with relevant metadata." - } - } - }, - "description": "UnbondingDelegation stores all of a single delegator's unbonding bonds\nfor a single validator in an time-ordered list." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QueryUnbondingDelegatorDelegationsResponse is response type for the\nQuery/UnbondingDelegatorDelegations RPC method." - }, - "cosmos.staking.v1beta1.QueryDelegatorValidatorResponse": { - "type": "object", - "properties": { - "validator": { - "type": "object", - "properties": { - "operator_address": { - "type": "string", - "description": "operator_address defines the address of the validator's operator; bech encoded in JSON." - }, - "consensus_pubkey": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "jailed": { - "type": "boolean", - "description": "jailed defined whether the validator has been jailed from bonded status or not." - }, - "status": { - "type": "string", - "description": "status is the validator status (bonded/unbonding/unbonded).", - "default": "BOND_STATUS_UNSPECIFIED", - "enum": [ - "BOND_STATUS_UNSPECIFIED", - "BOND_STATUS_UNBONDED", - "BOND_STATUS_UNBONDING", - "BOND_STATUS_BONDED" - ] - }, - "tokens": { - "type": "string", - "description": "tokens define the delegated tokens (incl. self-delegation)." - }, - "delegator_shares": { - "type": "string", - "description": "delegator_shares defines total shares issued to a validator's delegators." - }, - "description": { - "type": "object", - "properties": { - "moniker": { - "type": "string", - "description": "moniker defines a human-readable name for the validator." - }, - "identity": { - "type": "string", - "description": "identity defines an optional identity signature (ex. UPort or Keybase)." - }, - "website": { - "type": "string", - "description": "website defines an optional website link." - }, - "security_contact": { - "type": "string", - "description": "security_contact defines an optional email for security contact." - }, - "details": { - "type": "string", - "description": "details define other optional details." - } - }, - "description": "description defines the description terms for the validator." - }, - "unbonding_height": { - "type": "string", - "description": "unbonding_height defines, if unbonding, the height at which this validator has begun unbonding.", - "format": "int64" - }, - "unbonding_time": { - "type": "string", - "description": "unbonding_time defines, if unbonding, the min time for the validator to complete unbonding.", - "format": "date-time" - }, - "commission": { - "type": "object", - "properties": { - "commission_rates": { - "type": "object", - "properties": { - "rate": { - "type": "string", - "description": "rate is the commission rate charged to delegators, as a fraction." - }, - "max_rate": { - "type": "string", - "description": "max_rate defines the maximum commission rate which validator can ever charge, as a fraction." - }, - "max_change_rate": { - "type": "string", - "description": "max_change_rate defines the maximum daily increase of the validator commission, as a fraction." - } - }, - "description": "commission_rates defines the initial commission rates to be used for creating a validator." - }, - "update_time": { - "type": "string", - "description": "update_time is the last time the commission rate was changed.", - "format": "date-time" - } - }, - "description": "commission defines the commission parameters." - }, - "min_self_delegation": { - "type": "string", - "description": "min_self_delegation is the validator's self declared minimum self delegation.\n\nSince: cosmos-sdk 0.46" - }, - "unbonding_on_hold_ref_count": { - "title": "strictly positive if this validator's unbonding has been stopped by external modules", - "type": "string", - "format": "int64" - }, - "unbonding_ids": { - "title": "list of unbonding ids, each uniquely identifing an unbonding of this validator", - "type": "array", - "items": { - "type": "string", - "format": "uint64" - } - } - }, - "description": "Validator defines a validator, together with the total amount of the\nValidator's bond shares and their exchange rate to coins. Slashing results in\na decrease in the exchange rate, allowing correct calculation of future\nundelegations without iterating over delegators. When coins are delegated to\nthis validator, the validator is credited with a delegation whose number of\nbond shares is based on the amount of coins delegated divided by the current\nexchange rate. Voting power can be calculated as total bonded shares\nmultiplied by exchange rate." - } - }, - "description": "QueryDelegatorValidatorResponse response type for the\nQuery/DelegatorValidator RPC method." - }, - "cosmos.staking.v1beta1.QueryDelegatorValidatorsResponse": { - "type": "object", - "properties": { - "validators": { - "type": "array", - "description": "validators defines the validators' info of a delegator.", - "items": { - "type": "object", - "properties": { - "operator_address": { - "type": "string", - "description": "operator_address defines the address of the validator's operator; bech encoded in JSON." - }, - "consensus_pubkey": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "jailed": { - "type": "boolean", - "description": "jailed defined whether the validator has been jailed from bonded status or not." - }, - "status": { - "type": "string", - "description": "status is the validator status (bonded/unbonding/unbonded).", - "default": "BOND_STATUS_UNSPECIFIED", - "enum": [ - "BOND_STATUS_UNSPECIFIED", - "BOND_STATUS_UNBONDED", - "BOND_STATUS_UNBONDING", - "BOND_STATUS_BONDED" - ] - }, - "tokens": { - "type": "string", - "description": "tokens define the delegated tokens (incl. self-delegation)." - }, - "delegator_shares": { - "type": "string", - "description": "delegator_shares defines total shares issued to a validator's delegators." - }, - "description": { - "type": "object", - "properties": { - "moniker": { - "type": "string", - "description": "moniker defines a human-readable name for the validator." - }, - "identity": { - "type": "string", - "description": "identity defines an optional identity signature (ex. UPort or Keybase)." - }, - "website": { - "type": "string", - "description": "website defines an optional website link." - }, - "security_contact": { - "type": "string", - "description": "security_contact defines an optional email for security contact." - }, - "details": { - "type": "string", - "description": "details define other optional details." - } - }, - "description": "description defines the description terms for the validator." - }, - "unbonding_height": { - "type": "string", - "description": "unbonding_height defines, if unbonding, the height at which this validator has begun unbonding.", - "format": "int64" - }, - "unbonding_time": { - "type": "string", - "description": "unbonding_time defines, if unbonding, the min time for the validator to complete unbonding.", - "format": "date-time" - }, - "commission": { - "type": "object", - "properties": { - "commission_rates": { - "type": "object", - "properties": { - "rate": { - "type": "string", - "description": "rate is the commission rate charged to delegators, as a fraction." - }, - "max_rate": { - "type": "string", - "description": "max_rate defines the maximum commission rate which validator can ever charge, as a fraction." - }, - "max_change_rate": { - "type": "string", - "description": "max_change_rate defines the maximum daily increase of the validator commission, as a fraction." - } - }, - "description": "commission_rates defines the initial commission rates to be used for creating a validator." - }, - "update_time": { - "type": "string", - "description": "update_time is the last time the commission rate was changed.", - "format": "date-time" - } - }, - "description": "commission defines the commission parameters." - }, - "min_self_delegation": { - "type": "string", - "description": "min_self_delegation is the validator's self declared minimum self delegation.\n\nSince: cosmos-sdk 0.46" - }, - "unbonding_on_hold_ref_count": { - "title": "strictly positive if this validator's unbonding has been stopped by external modules", - "type": "string", - "format": "int64" - }, - "unbonding_ids": { - "title": "list of unbonding ids, each uniquely identifing an unbonding of this validator", - "type": "array", - "items": { - "type": "string", - "format": "uint64" - } - } - }, - "description": "Validator defines a validator, together with the total amount of the\nValidator's bond shares and their exchange rate to coins. Slashing results in\na decrease in the exchange rate, allowing correct calculation of future\nundelegations without iterating over delegators. When coins are delegated to\nthis validator, the validator is credited with a delegation whose number of\nbond shares is based on the amount of coins delegated divided by the current\nexchange rate. Voting power can be calculated as total bonded shares\nmultiplied by exchange rate." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QueryDelegatorValidatorsResponse is response type for the\nQuery/DelegatorValidators RPC method." - }, - "cosmos.staking.v1beta1.QueryHistoricalInfoResponse": { - "type": "object", - "properties": { - "hist": { - "type": "object", - "properties": { - "header": { - "type": "object", - "properties": { - "version": { - "title": "basic block info", - "type": "object", - "properties": { - "block": { - "type": "string", - "format": "uint64" - }, - "app": { - "type": "string", - "format": "uint64" - } - }, - "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." - }, - "chain_id": { - "type": "string" - }, - "height": { - "type": "string", - "format": "int64" - }, - "time": { - "type": "string", - "format": "date-time" - }, - "last_block_id": { - "title": "prev block info", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "last_commit_hash": { - "title": "hashes of block data", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "data_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validators_hash": { - "title": "hashes from the app output from the prev block", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "next_validators_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "consensus_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "app_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "last_results_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "evidence_hash": { - "title": "consensus info", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proposer_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "Header defines the structure of a block header." - }, - "valset": { - "type": "array", - "items": { - "type": "object", - "properties": { - "operator_address": { - "type": "string", - "description": "operator_address defines the address of the validator's operator; bech encoded in JSON." - }, - "consensus_pubkey": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "jailed": { - "type": "boolean", - "description": "jailed defined whether the validator has been jailed from bonded status or not." - }, - "status": { - "type": "string", - "description": "status is the validator status (bonded/unbonding/unbonded).", - "default": "BOND_STATUS_UNSPECIFIED", - "enum": [ - "BOND_STATUS_UNSPECIFIED", - "BOND_STATUS_UNBONDED", - "BOND_STATUS_UNBONDING", - "BOND_STATUS_BONDED" - ] - }, - "tokens": { - "type": "string", - "description": "tokens define the delegated tokens (incl. self-delegation)." - }, - "delegator_shares": { - "type": "string", - "description": "delegator_shares defines total shares issued to a validator's delegators." - }, - "description": { - "type": "object", - "properties": { - "moniker": { - "type": "string", - "description": "moniker defines a human-readable name for the validator." - }, - "identity": { - "type": "string", - "description": "identity defines an optional identity signature (ex. UPort or Keybase)." - }, - "website": { - "type": "string", - "description": "website defines an optional website link." - }, - "security_contact": { - "type": "string", - "description": "security_contact defines an optional email for security contact." - }, - "details": { - "type": "string", - "description": "details define other optional details." - } - }, - "description": "description defines the description terms for the validator." - }, - "unbonding_height": { - "type": "string", - "description": "unbonding_height defines, if unbonding, the height at which this validator has begun unbonding.", - "format": "int64" - }, - "unbonding_time": { - "type": "string", - "description": "unbonding_time defines, if unbonding, the min time for the validator to complete unbonding.", - "format": "date-time" - }, - "commission": { - "type": "object", - "properties": { - "commission_rates": { - "type": "object", - "properties": { - "rate": { - "type": "string", - "description": "rate is the commission rate charged to delegators, as a fraction." - }, - "max_rate": { - "type": "string", - "description": "max_rate defines the maximum commission rate which validator can ever charge, as a fraction." - }, - "max_change_rate": { - "type": "string", - "description": "max_change_rate defines the maximum daily increase of the validator commission, as a fraction." - } - }, - "description": "commission_rates defines the initial commission rates to be used for creating a validator." - }, - "update_time": { - "type": "string", - "description": "update_time is the last time the commission rate was changed.", - "format": "date-time" - } - }, - "description": "commission defines the commission parameters." - }, - "min_self_delegation": { - "type": "string", - "description": "min_self_delegation is the validator's self declared minimum self delegation.\n\nSince: cosmos-sdk 0.46" - }, - "unbonding_on_hold_ref_count": { - "title": "strictly positive if this validator's unbonding has been stopped by external modules", - "type": "string", - "format": "int64" - }, - "unbonding_ids": { - "title": "list of unbonding ids, each uniquely identifing an unbonding of this validator", - "type": "array", - "items": { - "type": "string", - "format": "uint64" - } - } - }, - "description": "Validator defines a validator, together with the total amount of the\nValidator's bond shares and their exchange rate to coins. Slashing results in\na decrease in the exchange rate, allowing correct calculation of future\nundelegations without iterating over delegators. When coins are delegated to\nthis validator, the validator is credited with a delegation whose number of\nbond shares is based on the amount of coins delegated divided by the current\nexchange rate. Voting power can be calculated as total bonded shares\nmultiplied by exchange rate." - } - } - }, - "description": "hist defines the historical info at the given height." - } - }, - "description": "QueryHistoricalInfoResponse is response type for the Query/HistoricalInfo RPC\nmethod." - }, - "cosmos.staking.v1beta1.QueryParamsResponse": { - "type": "object", - "properties": { - "params": { - "type": "object", - "properties": { - "unbonding_time": { - "type": "string", - "description": "unbonding_time is the time duration of unbonding." - }, - "max_validators": { - "type": "integer", - "description": "max_validators is the maximum number of validators.", - "format": "int64" - }, - "max_entries": { - "type": "integer", - "description": "max_entries is the max entries for either unbonding delegation or redelegation (per pair/trio).", - "format": "int64" - }, - "historical_entries": { - "type": "integer", - "description": "historical_entries is the number of historical entries to persist.", - "format": "int64" - }, - "bond_denom": { - "type": "string", - "description": "bond_denom defines the bondable coin denomination." - }, - "min_commission_rate": { - "title": "min_commission_rate is the chain-wide minimum commission rate that a validator can charge their delegators", - "type": "string" - } - }, - "description": "params holds all the parameters of this module." - } - }, - "description": "QueryParamsResponse is response type for the Query/Params RPC method." - }, - "cosmos.staking.v1beta1.QueryPoolResponse": { - "type": "object", - "properties": { - "pool": { - "type": "object", - "properties": { - "not_bonded_tokens": { - "type": "string" - }, - "bonded_tokens": { - "type": "string" - } - }, - "description": "pool defines the pool info." - } - }, - "description": "QueryPoolResponse is response type for the Query/Pool RPC method." - }, - "cosmos.staking.v1beta1.QueryRedelegationsResponse": { - "type": "object", - "properties": { - "redelegation_responses": { - "type": "array", - "items": { - "type": "object", - "properties": { - "redelegation": { - "type": "object", - "properties": { - "delegator_address": { - "type": "string", - "description": "delegator_address is the bech32-encoded address of the delegator." - }, - "validator_src_address": { - "type": "string", - "description": "validator_src_address is the validator redelegation source operator address." - }, - "validator_dst_address": { - "type": "string", - "description": "validator_dst_address is the validator redelegation destination operator address." - }, - "entries": { - "type": "array", - "description": "entries are the redelegation entries.", - "items": { - "type": "object", - "properties": { - "creation_height": { - "type": "string", - "description": "creation_height defines the height which the redelegation took place.", - "format": "int64" - }, - "completion_time": { - "type": "string", - "description": "completion_time defines the unix time for redelegation completion.", - "format": "date-time" - }, - "initial_balance": { - "type": "string", - "description": "initial_balance defines the initial balance when redelegation started." - }, - "shares_dst": { - "type": "string", - "description": "shares_dst is the amount of destination-validator shares created by redelegation." - }, - "unbonding_id": { - "title": "Incrementing id that uniquely identifies this entry", - "type": "string", - "format": "uint64" - }, - "unbonding_on_hold_ref_count": { - "title": "Strictly positive if this entry's unbonding has been stopped by external modules", - "type": "string", - "format": "int64" - } - }, - "description": "RedelegationEntry defines a redelegation object with relevant metadata." - } - } - }, - "description": "Redelegation contains the list of a particular delegator's redelegating bonds\nfrom a particular source validator to a particular destination validator." - }, - "entries": { - "type": "array", - "items": { - "type": "object", - "properties": { - "redelegation_entry": { - "type": "object", - "properties": { - "creation_height": { - "type": "string", - "description": "creation_height defines the height which the redelegation took place.", - "format": "int64" - }, - "completion_time": { - "type": "string", - "description": "completion_time defines the unix time for redelegation completion.", - "format": "date-time" - }, - "initial_balance": { - "type": "string", - "description": "initial_balance defines the initial balance when redelegation started." - }, - "shares_dst": { - "type": "string", - "description": "shares_dst is the amount of destination-validator shares created by redelegation." - }, - "unbonding_id": { - "title": "Incrementing id that uniquely identifies this entry", - "type": "string", - "format": "uint64" - }, - "unbonding_on_hold_ref_count": { - "title": "Strictly positive if this entry's unbonding has been stopped by external modules", - "type": "string", - "format": "int64" - } - }, - "description": "RedelegationEntry defines a redelegation object with relevant metadata." - }, - "balance": { - "type": "string" - } - }, - "description": "RedelegationEntryResponse is equivalent to a RedelegationEntry except that it\ncontains a balance in addition to shares which is more suitable for client\nresponses." - } - } - }, - "description": "RedelegationResponse is equivalent to a Redelegation except that its entries\ncontain a balance in addition to shares which is more suitable for client\nresponses." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QueryRedelegationsResponse is response type for the Query/Redelegations RPC\nmethod." - }, - "cosmos.staking.v1beta1.QueryUnbondingDelegationResponse": { - "type": "object", - "properties": { - "unbond": { - "type": "object", - "properties": { - "delegator_address": { - "type": "string", - "description": "delegator_address is the encoded address of the delegator." - }, - "validator_address": { - "type": "string", - "description": "validator_address is the encoded address of the validator." - }, - "entries": { - "type": "array", - "description": "entries are the unbonding delegation entries.", - "items": { - "type": "object", - "properties": { - "creation_height": { - "type": "string", - "description": "creation_height is the height which the unbonding took place.", - "format": "int64" - }, - "completion_time": { - "type": "string", - "description": "completion_time is the unix time for unbonding completion.", - "format": "date-time" - }, - "initial_balance": { - "type": "string", - "description": "initial_balance defines the tokens initially scheduled to receive at completion." - }, - "balance": { - "type": "string", - "description": "balance defines the tokens to receive at completion." - }, - "unbonding_id": { - "title": "Incrementing id that uniquely identifies this entry", - "type": "string", - "format": "uint64" - }, - "unbonding_on_hold_ref_count": { - "title": "Strictly positive if this entry's unbonding has been stopped by external modules", - "type": "string", - "format": "int64" - } - }, - "description": "UnbondingDelegationEntry defines an unbonding object with relevant metadata." - } - } - }, - "description": "UnbondingDelegation stores all of a single delegator's unbonding bonds\nfor a single validator in an time-ordered list." - } - }, - "description": "QueryDelegationResponse is response type for the Query/UnbondingDelegation\nRPC method." - }, - "cosmos.staking.v1beta1.QueryValidatorDelegationsResponse": { - "title": "QueryValidatorDelegationsResponse is response type for the\nQuery/ValidatorDelegations RPC method", - "type": "object", - "properties": { - "delegation_responses": { - "type": "array", - "items": { - "type": "object", - "properties": { - "delegation": { - "type": "object", - "properties": { - "delegator_address": { - "type": "string", - "description": "delegator_address is the encoded address of the delegator." - }, - "validator_address": { - "type": "string", - "description": "validator_address is the encoded address of the validator." - }, - "shares": { - "type": "string", - "description": "shares define the delegation shares received." - } - }, - "description": "Delegation represents the bond with tokens held by an account. It is\nowned by one delegator, and is associated with the voting power of one\nvalidator." - }, - "balance": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "description": "DelegationResponse is equivalent to Delegation except that it contains a\nbalance in addition to shares which is more suitable for client responses." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } - } - }, - "cosmos.staking.v1beta1.QueryValidatorResponse": { - "title": "QueryValidatorResponse is response type for the Query/Validator RPC method", - "type": "object", - "properties": { - "validator": { - "type": "object", - "properties": { - "operator_address": { - "type": "string", - "description": "operator_address defines the address of the validator's operator; bech encoded in JSON." - }, - "consensus_pubkey": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "jailed": { - "type": "boolean", - "description": "jailed defined whether the validator has been jailed from bonded status or not." - }, - "status": { - "type": "string", - "description": "status is the validator status (bonded/unbonding/unbonded).", - "default": "BOND_STATUS_UNSPECIFIED", - "enum": [ - "BOND_STATUS_UNSPECIFIED", - "BOND_STATUS_UNBONDED", - "BOND_STATUS_UNBONDING", - "BOND_STATUS_BONDED" - ] - }, - "tokens": { - "type": "string", - "description": "tokens define the delegated tokens (incl. self-delegation)." - }, - "delegator_shares": { - "type": "string", - "description": "delegator_shares defines total shares issued to a validator's delegators." - }, - "description": { - "type": "object", - "properties": { - "moniker": { - "type": "string", - "description": "moniker defines a human-readable name for the validator." - }, - "identity": { - "type": "string", - "description": "identity defines an optional identity signature (ex. UPort or Keybase)." - }, - "website": { - "type": "string", - "description": "website defines an optional website link." - }, - "security_contact": { - "type": "string", - "description": "security_contact defines an optional email for security contact." - }, - "details": { - "type": "string", - "description": "details define other optional details." - } - }, - "description": "description defines the description terms for the validator." - }, - "unbonding_height": { - "type": "string", - "description": "unbonding_height defines, if unbonding, the height at which this validator has begun unbonding.", - "format": "int64" - }, - "unbonding_time": { - "type": "string", - "description": "unbonding_time defines, if unbonding, the min time for the validator to complete unbonding.", - "format": "date-time" - }, - "commission": { - "type": "object", - "properties": { - "commission_rates": { - "type": "object", - "properties": { - "rate": { - "type": "string", - "description": "rate is the commission rate charged to delegators, as a fraction." - }, - "max_rate": { - "type": "string", - "description": "max_rate defines the maximum commission rate which validator can ever charge, as a fraction." - }, - "max_change_rate": { - "type": "string", - "description": "max_change_rate defines the maximum daily increase of the validator commission, as a fraction." - } - }, - "description": "commission_rates defines the initial commission rates to be used for creating a validator." - }, - "update_time": { - "type": "string", - "description": "update_time is the last time the commission rate was changed.", - "format": "date-time" - } - }, - "description": "commission defines the commission parameters." - }, - "min_self_delegation": { - "type": "string", - "description": "min_self_delegation is the validator's self declared minimum self delegation.\n\nSince: cosmos-sdk 0.46" - }, - "unbonding_on_hold_ref_count": { - "title": "strictly positive if this validator's unbonding has been stopped by external modules", - "type": "string", - "format": "int64" - }, - "unbonding_ids": { - "title": "list of unbonding ids, each uniquely identifing an unbonding of this validator", - "type": "array", - "items": { - "type": "string", - "format": "uint64" - } - } - }, - "description": "Validator defines a validator, together with the total amount of the\nValidator's bond shares and their exchange rate to coins. Slashing results in\na decrease in the exchange rate, allowing correct calculation of future\nundelegations without iterating over delegators. When coins are delegated to\nthis validator, the validator is credited with a delegation whose number of\nbond shares is based on the amount of coins delegated divided by the current\nexchange rate. Voting power can be calculated as total bonded shares\nmultiplied by exchange rate." - } - } - }, - "cosmos.staking.v1beta1.QueryValidatorUnbondingDelegationsResponse": { - "type": "object", - "properties": { - "unbonding_responses": { - "type": "array", - "items": { - "type": "object", - "properties": { - "delegator_address": { - "type": "string", - "description": "delegator_address is the encoded address of the delegator." - }, - "validator_address": { - "type": "string", - "description": "validator_address is the encoded address of the validator." - }, - "entries": { - "type": "array", - "description": "entries are the unbonding delegation entries.", - "items": { - "type": "object", - "properties": { - "creation_height": { - "type": "string", - "description": "creation_height is the height which the unbonding took place.", - "format": "int64" - }, - "completion_time": { - "type": "string", - "description": "completion_time is the unix time for unbonding completion.", - "format": "date-time" - }, - "initial_balance": { - "type": "string", - "description": "initial_balance defines the tokens initially scheduled to receive at completion." - }, - "balance": { - "type": "string", - "description": "balance defines the tokens to receive at completion." - }, - "unbonding_id": { - "title": "Incrementing id that uniquely identifies this entry", - "type": "string", - "format": "uint64" - }, - "unbonding_on_hold_ref_count": { - "title": "Strictly positive if this entry's unbonding has been stopped by external modules", - "type": "string", - "format": "int64" - } - }, - "description": "UnbondingDelegationEntry defines an unbonding object with relevant metadata." - } - } - }, - "description": "UnbondingDelegation stores all of a single delegator's unbonding bonds\nfor a single validator in an time-ordered list." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } - }, - "description": "QueryValidatorUnbondingDelegationsResponse is response type for the\nQuery/ValidatorUnbondingDelegations RPC method." - }, - "cosmos.staking.v1beta1.QueryValidatorsResponse": { - "title": "QueryValidatorsResponse is response type for the Query/Validators RPC method", - "type": "object", - "properties": { - "validators": { - "type": "array", - "description": "validators contains all the queried validators.", - "items": { - "type": "object", - "properties": { - "operator_address": { - "type": "string", - "description": "operator_address defines the address of the validator's operator; bech encoded in JSON." - }, - "consensus_pubkey": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "jailed": { - "type": "boolean", - "description": "jailed defined whether the validator has been jailed from bonded status or not." - }, - "status": { - "type": "string", - "description": "status is the validator status (bonded/unbonding/unbonded).", - "default": "BOND_STATUS_UNSPECIFIED", - "enum": [ - "BOND_STATUS_UNSPECIFIED", - "BOND_STATUS_UNBONDED", - "BOND_STATUS_UNBONDING", - "BOND_STATUS_BONDED" - ] - }, - "tokens": { - "type": "string", - "description": "tokens define the delegated tokens (incl. self-delegation)." - }, - "delegator_shares": { - "type": "string", - "description": "delegator_shares defines total shares issued to a validator's delegators." - }, - "description": { - "type": "object", - "properties": { - "moniker": { - "type": "string", - "description": "moniker defines a human-readable name for the validator." - }, - "identity": { - "type": "string", - "description": "identity defines an optional identity signature (ex. UPort or Keybase)." - }, - "website": { - "type": "string", - "description": "website defines an optional website link." - }, - "security_contact": { - "type": "string", - "description": "security_contact defines an optional email for security contact." - }, - "details": { - "type": "string", - "description": "details define other optional details." - } - }, - "description": "description defines the description terms for the validator." - }, - "unbonding_height": { - "type": "string", - "description": "unbonding_height defines, if unbonding, the height at which this validator has begun unbonding.", - "format": "int64" - }, - "unbonding_time": { - "type": "string", - "description": "unbonding_time defines, if unbonding, the min time for the validator to complete unbonding.", - "format": "date-time" - }, - "commission": { - "type": "object", - "properties": { - "commission_rates": { - "type": "object", - "properties": { - "rate": { - "type": "string", - "description": "rate is the commission rate charged to delegators, as a fraction." - }, - "max_rate": { - "type": "string", - "description": "max_rate defines the maximum commission rate which validator can ever charge, as a fraction." - }, - "max_change_rate": { - "type": "string", - "description": "max_change_rate defines the maximum daily increase of the validator commission, as a fraction." - } - }, - "description": "commission_rates defines the initial commission rates to be used for creating a validator." - }, - "update_time": { - "type": "string", - "description": "update_time is the last time the commission rate was changed.", - "format": "date-time" - } - }, - "description": "commission defines the commission parameters." - }, - "min_self_delegation": { - "type": "string", - "description": "min_self_delegation is the validator's self declared minimum self delegation.\n\nSince: cosmos-sdk 0.46" - }, - "unbonding_on_hold_ref_count": { - "title": "strictly positive if this validator's unbonding has been stopped by external modules", - "type": "string", - "format": "int64" - }, - "unbonding_ids": { - "title": "list of unbonding ids, each uniquely identifing an unbonding of this validator", - "type": "array", - "items": { - "type": "string", - "format": "uint64" - } - } - }, - "description": "Validator defines a validator, together with the total amount of the\nValidator's bond shares and their exchange rate to coins. Slashing results in\na decrease in the exchange rate, allowing correct calculation of future\nundelegations without iterating over delegators. When coins are delegated to\nthis validator, the validator is credited with a delegation whose number of\nbond shares is based on the amount of coins delegated divided by the current\nexchange rate. Voting power can be calculated as total bonded shares\nmultiplied by exchange rate." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines the pagination in the response." - } - } - }, - "cosmos.staking.v1beta1.Redelegation": { - "type": "object", - "properties": { - "delegator_address": { - "type": "string", - "description": "delegator_address is the bech32-encoded address of the delegator." - }, - "validator_src_address": { - "type": "string", - "description": "validator_src_address is the validator redelegation source operator address." - }, - "validator_dst_address": { - "type": "string", - "description": "validator_dst_address is the validator redelegation destination operator address." - }, - "entries": { - "type": "array", - "description": "entries are the redelegation entries.", - "items": { - "type": "object", - "properties": { - "creation_height": { - "type": "string", - "description": "creation_height defines the height which the redelegation took place.", - "format": "int64" - }, - "completion_time": { - "type": "string", - "description": "completion_time defines the unix time for redelegation completion.", - "format": "date-time" - }, - "initial_balance": { - "type": "string", - "description": "initial_balance defines the initial balance when redelegation started." - }, - "shares_dst": { - "type": "string", - "description": "shares_dst is the amount of destination-validator shares created by redelegation." - }, - "unbonding_id": { - "title": "Incrementing id that uniquely identifies this entry", - "type": "string", - "format": "uint64" - }, - "unbonding_on_hold_ref_count": { - "title": "Strictly positive if this entry's unbonding has been stopped by external modules", - "type": "string", - "format": "int64" - } - }, - "description": "RedelegationEntry defines a redelegation object with relevant metadata." - } - } - }, - "description": "Redelegation contains the list of a particular delegator's redelegating bonds\nfrom a particular source validator to a particular destination validator." - }, - "cosmos.staking.v1beta1.RedelegationEntry": { - "type": "object", - "properties": { - "creation_height": { - "type": "string", - "description": "creation_height defines the height which the redelegation took place.", - "format": "int64" - }, - "completion_time": { - "type": "string", - "description": "completion_time defines the unix time for redelegation completion.", - "format": "date-time" - }, - "initial_balance": { - "type": "string", - "description": "initial_balance defines the initial balance when redelegation started." - }, - "shares_dst": { - "type": "string", - "description": "shares_dst is the amount of destination-validator shares created by redelegation." - }, - "unbonding_id": { - "title": "Incrementing id that uniquely identifies this entry", - "type": "string", - "format": "uint64" - }, - "unbonding_on_hold_ref_count": { - "title": "Strictly positive if this entry's unbonding has been stopped by external modules", - "type": "string", - "format": "int64" - } - }, - "description": "RedelegationEntry defines a redelegation object with relevant metadata." - }, - "cosmos.staking.v1beta1.RedelegationEntryResponse": { - "type": "object", - "properties": { - "redelegation_entry": { - "type": "object", - "properties": { - "creation_height": { - "type": "string", - "description": "creation_height defines the height which the redelegation took place.", - "format": "int64" - }, - "completion_time": { - "type": "string", - "description": "completion_time defines the unix time for redelegation completion.", - "format": "date-time" - }, - "initial_balance": { - "type": "string", - "description": "initial_balance defines the initial balance when redelegation started." - }, - "shares_dst": { - "type": "string", - "description": "shares_dst is the amount of destination-validator shares created by redelegation." - }, - "unbonding_id": { - "title": "Incrementing id that uniquely identifies this entry", - "type": "string", - "format": "uint64" - }, - "unbonding_on_hold_ref_count": { - "title": "Strictly positive if this entry's unbonding has been stopped by external modules", - "type": "string", - "format": "int64" - } - }, - "description": "RedelegationEntry defines a redelegation object with relevant metadata." - }, - "balance": { - "type": "string" - } - }, - "description": "RedelegationEntryResponse is equivalent to a RedelegationEntry except that it\ncontains a balance in addition to shares which is more suitable for client\nresponses." - }, - "cosmos.staking.v1beta1.RedelegationResponse": { - "type": "object", - "properties": { - "redelegation": { - "type": "object", - "properties": { - "delegator_address": { - "type": "string", - "description": "delegator_address is the bech32-encoded address of the delegator." - }, - "validator_src_address": { - "type": "string", - "description": "validator_src_address is the validator redelegation source operator address." - }, - "validator_dst_address": { - "type": "string", - "description": "validator_dst_address is the validator redelegation destination operator address." - }, - "entries": { - "type": "array", - "description": "entries are the redelegation entries.", - "items": { - "type": "object", - "properties": { - "creation_height": { - "type": "string", - "description": "creation_height defines the height which the redelegation took place.", - "format": "int64" - }, - "completion_time": { - "type": "string", - "description": "completion_time defines the unix time for redelegation completion.", - "format": "date-time" - }, - "initial_balance": { - "type": "string", - "description": "initial_balance defines the initial balance when redelegation started." - }, - "shares_dst": { - "type": "string", - "description": "shares_dst is the amount of destination-validator shares created by redelegation." - }, - "unbonding_id": { - "title": "Incrementing id that uniquely identifies this entry", - "type": "string", - "format": "uint64" - }, - "unbonding_on_hold_ref_count": { - "title": "Strictly positive if this entry's unbonding has been stopped by external modules", - "type": "string", - "format": "int64" - } - }, - "description": "RedelegationEntry defines a redelegation object with relevant metadata." - } - } - }, - "description": "Redelegation contains the list of a particular delegator's redelegating bonds\nfrom a particular source validator to a particular destination validator." - }, - "entries": { - "type": "array", - "items": { - "type": "object", - "properties": { - "redelegation_entry": { - "type": "object", - "properties": { - "creation_height": { - "type": "string", - "description": "creation_height defines the height which the redelegation took place.", - "format": "int64" - }, - "completion_time": { - "type": "string", - "description": "completion_time defines the unix time for redelegation completion.", - "format": "date-time" - }, - "initial_balance": { - "type": "string", - "description": "initial_balance defines the initial balance when redelegation started." - }, - "shares_dst": { - "type": "string", - "description": "shares_dst is the amount of destination-validator shares created by redelegation." - }, - "unbonding_id": { - "title": "Incrementing id that uniquely identifies this entry", - "type": "string", - "format": "uint64" - }, - "unbonding_on_hold_ref_count": { - "title": "Strictly positive if this entry's unbonding has been stopped by external modules", - "type": "string", - "format": "int64" - } - }, - "description": "RedelegationEntry defines a redelegation object with relevant metadata." - }, - "balance": { - "type": "string" - } - }, - "description": "RedelegationEntryResponse is equivalent to a RedelegationEntry except that it\ncontains a balance in addition to shares which is more suitable for client\nresponses." - } - } - }, - "description": "RedelegationResponse is equivalent to a Redelegation except that its entries\ncontain a balance in addition to shares which is more suitable for client\nresponses." - }, - "cosmos.staking.v1beta1.UnbondingDelegation": { - "type": "object", - "properties": { - "delegator_address": { - "type": "string", - "description": "delegator_address is the encoded address of the delegator." - }, - "validator_address": { - "type": "string", - "description": "validator_address is the encoded address of the validator." - }, - "entries": { - "type": "array", - "description": "entries are the unbonding delegation entries.", - "items": { - "type": "object", - "properties": { - "creation_height": { - "type": "string", - "description": "creation_height is the height which the unbonding took place.", - "format": "int64" - }, - "completion_time": { - "type": "string", - "description": "completion_time is the unix time for unbonding completion.", - "format": "date-time" - }, - "initial_balance": { - "type": "string", - "description": "initial_balance defines the tokens initially scheduled to receive at completion." - }, - "balance": { - "type": "string", - "description": "balance defines the tokens to receive at completion." - }, - "unbonding_id": { - "title": "Incrementing id that uniquely identifies this entry", - "type": "string", - "format": "uint64" - }, - "unbonding_on_hold_ref_count": { - "title": "Strictly positive if this entry's unbonding has been stopped by external modules", - "type": "string", - "format": "int64" - } - }, - "description": "UnbondingDelegationEntry defines an unbonding object with relevant metadata." - } - } - }, - "description": "UnbondingDelegation stores all of a single delegator's unbonding bonds\nfor a single validator in an time-ordered list." - }, - "cosmos.staking.v1beta1.UnbondingDelegationEntry": { - "type": "object", - "properties": { - "creation_height": { - "type": "string", - "description": "creation_height is the height which the unbonding took place.", - "format": "int64" - }, - "completion_time": { - "type": "string", - "description": "completion_time is the unix time for unbonding completion.", - "format": "date-time" - }, - "initial_balance": { - "type": "string", - "description": "initial_balance defines the tokens initially scheduled to receive at completion." - }, - "balance": { - "type": "string", - "description": "balance defines the tokens to receive at completion." - }, - "unbonding_id": { - "title": "Incrementing id that uniquely identifies this entry", - "type": "string", - "format": "uint64" - }, - "unbonding_on_hold_ref_count": { - "title": "Strictly positive if this entry's unbonding has been stopped by external modules", - "type": "string", - "format": "int64" - } - }, - "description": "UnbondingDelegationEntry defines an unbonding object with relevant metadata." - }, - "cosmos.staking.v1beta1.Validator": { - "type": "object", - "properties": { - "operator_address": { - "type": "string", - "description": "operator_address defines the address of the validator's operator; bech encoded in JSON." - }, - "consensus_pubkey": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "jailed": { - "type": "boolean", - "description": "jailed defined whether the validator has been jailed from bonded status or not." - }, - "status": { - "type": "string", - "description": "status is the validator status (bonded/unbonding/unbonded).", - "default": "BOND_STATUS_UNSPECIFIED", - "enum": [ - "BOND_STATUS_UNSPECIFIED", - "BOND_STATUS_UNBONDED", - "BOND_STATUS_UNBONDING", - "BOND_STATUS_BONDED" - ] - }, - "tokens": { - "type": "string", - "description": "tokens define the delegated tokens (incl. self-delegation)." - }, - "delegator_shares": { - "type": "string", - "description": "delegator_shares defines total shares issued to a validator's delegators." - }, - "description": { - "type": "object", - "properties": { - "moniker": { - "type": "string", - "description": "moniker defines a human-readable name for the validator." - }, - "identity": { - "type": "string", - "description": "identity defines an optional identity signature (ex. UPort or Keybase)." - }, - "website": { - "type": "string", - "description": "website defines an optional website link." - }, - "security_contact": { - "type": "string", - "description": "security_contact defines an optional email for security contact." - }, - "details": { - "type": "string", - "description": "details define other optional details." - } - }, - "description": "description defines the description terms for the validator." - }, - "unbonding_height": { - "type": "string", - "description": "unbonding_height defines, if unbonding, the height at which this validator has begun unbonding.", - "format": "int64" - }, - "unbonding_time": { - "type": "string", - "description": "unbonding_time defines, if unbonding, the min time for the validator to complete unbonding.", - "format": "date-time" - }, - "commission": { - "type": "object", - "properties": { - "commission_rates": { - "type": "object", - "properties": { - "rate": { - "type": "string", - "description": "rate is the commission rate charged to delegators, as a fraction." - }, - "max_rate": { - "type": "string", - "description": "max_rate defines the maximum commission rate which validator can ever charge, as a fraction." - }, - "max_change_rate": { - "type": "string", - "description": "max_change_rate defines the maximum daily increase of the validator commission, as a fraction." - } - }, - "description": "commission_rates defines the initial commission rates to be used for creating a validator." - }, - "update_time": { - "type": "string", - "description": "update_time is the last time the commission rate was changed.", - "format": "date-time" - } - }, - "description": "commission defines the commission parameters." - }, - "min_self_delegation": { - "type": "string", - "description": "min_self_delegation is the validator's self declared minimum self delegation.\n\nSince: cosmos-sdk 0.46" - }, - "unbonding_on_hold_ref_count": { - "title": "strictly positive if this validator's unbonding has been stopped by external modules", - "type": "string", - "format": "int64" - }, - "unbonding_ids": { - "title": "list of unbonding ids, each uniquely identifing an unbonding of this validator", - "type": "array", - "items": { - "type": "string", - "format": "uint64" - } - } - }, - "description": "Validator defines a validator, together with the total amount of the\nValidator's bond shares and their exchange rate to coins. Slashing results in\na decrease in the exchange rate, allowing correct calculation of future\nundelegations without iterating over delegators. When coins are delegated to\nthis validator, the validator is credited with a delegation whose number of\nbond shares is based on the amount of coins delegated divided by the current\nexchange rate. Voting power can be calculated as total bonded shares\nmultiplied by exchange rate." - }, - "tendermint.types.BlockID": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "tendermint.types.Header": { - "type": "object", - "properties": { - "version": { - "title": "basic block info", - "type": "object", - "properties": { - "block": { - "type": "string", - "format": "uint64" - }, - "app": { - "type": "string", - "format": "uint64" - } - }, - "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." - }, - "chain_id": { - "type": "string" - }, - "height": { - "type": "string", - "format": "int64" - }, - "time": { - "type": "string", - "format": "date-time" - }, - "last_block_id": { - "title": "prev block info", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "last_commit_hash": { - "title": "hashes of block data", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "data_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validators_hash": { - "title": "hashes from the app output from the prev block", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "next_validators_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "consensus_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "app_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "last_results_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "evidence_hash": { - "title": "consensus info", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proposer_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "Header defines the structure of a block header." - }, - "tendermint.types.PartSetHeader": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - }, - "tendermint.version.Consensus": { - "type": "object", - "properties": { - "block": { - "type": "string", - "format": "uint64" - }, - "app": { - "type": "string", - "format": "uint64" - } - }, - "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." - }, - "cosmos.base.abci.v1beta1.ABCIMessageLog": { - "type": "object", - "properties": { - "msg_index": { - "type": "integer", - "format": "int64" - }, - "log": { - "type": "string" - }, - "events": { - "type": "array", - "description": "Events contains a slice of Event objects that were emitted during some\nexecution.", - "items": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "attributes": { - "type": "array", - "items": { - "type": "object", - "properties": { - "key": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "description": "Attribute defines an attribute wrapper where the key and value are\nstrings instead of raw bytes." - } - } - }, - "description": "StringEvent defines en Event object wrapper where all the attributes\ncontain key/value pairs that are strings instead of raw bytes." - } - } - }, - "description": "ABCIMessageLog defines a structure containing an indexed tx ABCI message log." - }, - "cosmos.base.abci.v1beta1.Attribute": { - "type": "object", - "properties": { - "key": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "description": "Attribute defines an attribute wrapper where the key and value are\nstrings instead of raw bytes." - }, - "cosmos.base.abci.v1beta1.GasInfo": { - "type": "object", - "properties": { - "gas_wanted": { - "type": "string", - "description": "GasWanted is the maximum units of work we allow this tx to perform.", - "format": "uint64" - }, - "gas_used": { - "type": "string", - "description": "GasUsed is the amount of gas actually consumed.", - "format": "uint64" - } - }, - "description": "GasInfo defines tx execution gas context." - }, - "cosmos.base.abci.v1beta1.Result": { - "type": "object", - "properties": { - "data": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Data is any data returned from message or handler execution. It MUST be\nlength prefixed in order to separate data from multiple message executions.\nDeprecated. This field is still populated, but prefer msg_response instead\nbecause it also contains the Msg response typeURL.", - "format": "byte" - }, - "log": { - "type": "string", - "description": "Log contains the log information from message or handler execution." - }, - "events": { - "type": "array", - "description": "Events contains a slice of Event objects that were emitted during message\nor handler execution.", - "items": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "attributes": { - "type": "array", - "items": { - "type": "object", - "properties": { - "key": { - "type": "string" - }, - "value": { - "type": "string" - }, - "index": { - "type": "boolean" - } - }, - "description": "EventAttribute is a single key-value pair, associated with an event." - } - } - }, - "description": "Event allows application developers to attach additional information to\nResponseFinalizeBlock and ResponseCheckTx.\nLater, transactions may be queried using these events." - } - }, - "msg_responses": { - "type": "array", - "description": "msg_responses contains the Msg handler responses type packed in Anys.\n\nSince: cosmos-sdk 0.46", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - }, - "description": "Result is the union of ResponseFormat and ResponseCheckTx." - }, - "cosmos.base.abci.v1beta1.StringEvent": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "attributes": { - "type": "array", - "items": { - "type": "object", - "properties": { - "key": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "description": "Attribute defines an attribute wrapper where the key and value are\nstrings instead of raw bytes." - } - } - }, - "description": "StringEvent defines en Event object wrapper where all the attributes\ncontain key/value pairs that are strings instead of raw bytes." - }, - "cosmos.base.abci.v1beta1.TxResponse": { - "type": "object", - "properties": { - "height": { - "title": "The block height", - "type": "string", - "format": "int64" - }, - "txhash": { - "type": "string", - "description": "The transaction hash." - }, - "codespace": { - "title": "Namespace for the Code", - "type": "string" - }, - "code": { - "type": "integer", - "description": "Response code.", - "format": "int64" - }, - "data": { - "type": "string", - "description": "Result bytes, if any." - }, - "raw_log": { - "type": "string", - "description": "The output of the application's logger (raw string). May be\nnon-deterministic." - }, - "logs": { - "type": "array", - "description": "The output of the application's logger (typed). May be non-deterministic.", - "items": { - "type": "object", - "properties": { - "msg_index": { - "type": "integer", - "format": "int64" - }, - "log": { - "type": "string" - }, - "events": { - "type": "array", - "description": "Events contains a slice of Event objects that were emitted during some\nexecution.", - "items": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "attributes": { - "type": "array", - "items": { - "type": "object", - "properties": { - "key": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "description": "Attribute defines an attribute wrapper where the key and value are\nstrings instead of raw bytes." - } - } - }, - "description": "StringEvent defines en Event object wrapper where all the attributes\ncontain key/value pairs that are strings instead of raw bytes." - } - } - }, - "description": "ABCIMessageLog defines a structure containing an indexed tx ABCI message log." - } - }, - "info": { - "type": "string", - "description": "Additional information. May be non-deterministic." - }, - "gas_wanted": { - "type": "string", - "description": "Amount of gas requested for transaction.", - "format": "int64" - }, - "gas_used": { - "type": "string", - "description": "Amount of gas consumed by transaction.", - "format": "int64" - }, - "tx": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "timestamp": { - "type": "string", - "description": "Time of the previous block. For heights > 1, it's the weighted median of\nthe timestamps of the valid votes in the block.LastCommit. For height == 1,\nit's genesis time." - }, - "events": { - "type": "array", - "description": "Events defines all the events emitted by processing a transaction. Note,\nthese events include those emitted by processing all the messages and those\nemitted from the ante. Whereas Logs contains the events, with\nadditional metadata, emitted only by processing the messages.\n\nSince: cosmos-sdk 0.42.11, 0.44.5, 0.45", - "items": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "attributes": { - "type": "array", - "items": { - "type": "object", - "properties": { - "key": { - "type": "string" - }, - "value": { - "type": "string" - }, - "index": { - "type": "boolean" - } - }, - "description": "EventAttribute is a single key-value pair, associated with an event." - } - } - }, - "description": "Event allows application developers to attach additional information to\nResponseFinalizeBlock and ResponseCheckTx.\nLater, transactions may be queried using these events." - } - } - }, - "description": "TxResponse defines a structure containing relevant tx data and metadata. The\ntags are stringified and the log is JSON decoded." - }, - "cosmos.crypto.multisig.v1beta1.CompactBitArray": { - "type": "object", - "properties": { - "extra_bits_stored": { - "type": "integer", - "format": "int64" - }, - "elems": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "CompactBitArray is an implementation of a space efficient bit array.\nThis is used to ensure that the encoded data takes up a minimal amount of\nspace after proto encoding.\nThis is not thread safe, and is not intended for concurrent usage." - }, - "cosmos.tx.signing.v1beta1.SignMode": { - "type": "string", - "description": "SignMode represents a signing mode with its own security guarantees.\n\nThis enum should be considered a registry of all known sign modes\nin the Cosmos ecosystem. Apps are not expected to support all known\nsign modes. Apps that would like to support custom sign modes are\nencouraged to open a small PR against this file to add a new case\nto this SignMode enum describing their sign mode so that different\napps have a consistent version of this enum.\n\n - SIGN_MODE_UNSPECIFIED: SIGN_MODE_UNSPECIFIED specifies an unknown signing mode and will be\nrejected.\n - SIGN_MODE_DIRECT: SIGN_MODE_DIRECT specifies a signing mode which uses SignDoc and is\nverified with raw bytes from Tx.\n - SIGN_MODE_TEXTUAL: SIGN_MODE_TEXTUAL is a future signing mode that will verify some\nhuman-readable textual representation on top of the binary representation\nfrom SIGN_MODE_DIRECT. It is currently experimental, and should be used\nfor testing purposes only, until Textual is fully released. Please follow\nthe tracking issue https://github.com/cosmos/cosmos-sdk/issues/11970.\n - SIGN_MODE_DIRECT_AUX: SIGN_MODE_DIRECT_AUX specifies a signing mode which uses\nSignDocDirectAux. As opposed to SIGN_MODE_DIRECT, this sign mode does not\nrequire signers signing over other signers' `signer_info`. It also allows\nfor adding Tips in transactions.\n\nSince: cosmos-sdk 0.46\n - SIGN_MODE_LEGACY_AMINO_JSON: SIGN_MODE_LEGACY_AMINO_JSON is a backwards compatibility mode which uses\nAmino JSON and will be removed in the future.\n - SIGN_MODE_EIP_191: SIGN_MODE_EIP_191 specifies the sign mode for EIP 191 signing on the Cosmos\nSDK. Ref: https://eips.ethereum.org/EIPS/eip-191\n\nCurrently, SIGN_MODE_EIP_191 is registered as a SignMode enum variant,\nbut is not implemented on the SDK by default. To enable EIP-191, you need\nto pass a custom `TxConfig` that has an implementation of\n`SignModeHandler` for EIP-191. The SDK may decide to fully support\nEIP-191 in the future.\n\nSince: cosmos-sdk 0.45.2", - "default": "SIGN_MODE_UNSPECIFIED", - "enum": [ - "SIGN_MODE_UNSPECIFIED", - "SIGN_MODE_DIRECT", - "SIGN_MODE_TEXTUAL", - "SIGN_MODE_DIRECT_AUX", - "SIGN_MODE_LEGACY_AMINO_JSON", - "SIGN_MODE_EIP_191" - ] - }, - "cosmos.tx.v1beta1.AuthInfo": { - "type": "object", - "properties": { - "signer_infos": { - "type": "array", - "description": "signer_infos defines the signing modes for the required signers. The number\nand order of elements must match the required signers from TxBody's\nmessages. The first element is the primary signer and the one which pays\nthe fee.", - "items": { - "$ref": "#/components/schemas/cosmos.tx.v1beta1.SignerInfo" - } - }, - "fee": { - "type": "object", - "properties": { - "amount": { - "title": "amount is the amount of coins to be paid as a fee", - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "gas_limit": { - "title": "gas_limit is the maximum gas that can be used in transaction processing\nbefore an out of gas error occurs", - "type": "string", - "format": "uint64" - }, - "payer": { - "type": "string", - "description": "if unset, the first signer is responsible for paying the fees. If set, the specified account must pay the fees.\nthe payer must be a tx signer (and thus have signed this field in AuthInfo).\nsetting this field does *not* change the ordering of required signers for the transaction." - }, - "granter": { - "title": "if set, the fee payer (either the first signer or the value of the payer field) requests that a fee grant be used\nto pay fees instead of the fee payer's own balance. If an appropriate fee grant does not exist or the chain does\nnot support fee grants, this will fail", - "type": "string" - } - }, - "description": "Fee is the fee and gas limit for the transaction. The first signer is the\nprimary signer and the one which pays the fee. The fee can be calculated\nbased on the cost of evaluating the body and doing signature verification\nof the signers. This can be estimated via simulation." - }, - "tip": { - "type": "object", - "properties": { - "amount": { - "title": "amount is the amount of the tip", - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "tipper": { - "title": "tipper is the address of the account paying for the tip", - "type": "string" - } - }, - "description": "Tip is the optional tip used for transactions fees paid in another denom.\n\nThis field is ignored if the chain didn't enable tips, i.e. didn't add the\n`TipDecorator` in its posthandler.\n\nSince: cosmos-sdk 0.46" - } - }, - "description": "AuthInfo describes the fee and signer modes that are used to sign a\ntransaction." - }, - "cosmos.tx.v1beta1.BroadcastMode": { - "type": "string", - "description": "BroadcastMode specifies the broadcast mode for the TxService.Broadcast RPC\nmethod.\n\n - BROADCAST_MODE_UNSPECIFIED: zero-value for mode ordering\n - BROADCAST_MODE_BLOCK: DEPRECATED: use BROADCAST_MODE_SYNC instead,\nBROADCAST_MODE_BLOCK is not supported by the SDK from v0.47.x onwards.\n - BROADCAST_MODE_SYNC: BROADCAST_MODE_SYNC defines a tx broadcasting mode where the client waits\nfor a CheckTx execution response only.\n - BROADCAST_MODE_ASYNC: BROADCAST_MODE_ASYNC defines a tx broadcasting mode where the client\nreturns immediately.", - "default": "BROADCAST_MODE_UNSPECIFIED", - "enum": [ - "BROADCAST_MODE_UNSPECIFIED", - "BROADCAST_MODE_BLOCK", - "BROADCAST_MODE_SYNC", - "BROADCAST_MODE_ASYNC" - ] - }, - "cosmos.tx.v1beta1.BroadcastTxRequest": { - "type": "object", - "properties": { - "tx_bytes": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "tx_bytes is the raw transaction.", - "format": "byte" - }, - "mode": { - "type": "string", - "description": "BroadcastMode specifies the broadcast mode for the TxService.Broadcast RPC\nmethod.\n\n - BROADCAST_MODE_UNSPECIFIED: zero-value for mode ordering\n - BROADCAST_MODE_BLOCK: DEPRECATED: use BROADCAST_MODE_SYNC instead,\nBROADCAST_MODE_BLOCK is not supported by the SDK from v0.47.x onwards.\n - BROADCAST_MODE_SYNC: BROADCAST_MODE_SYNC defines a tx broadcasting mode where the client waits\nfor a CheckTx execution response only.\n - BROADCAST_MODE_ASYNC: BROADCAST_MODE_ASYNC defines a tx broadcasting mode where the client\nreturns immediately.", - "default": "BROADCAST_MODE_UNSPECIFIED", - "enum": [ - "BROADCAST_MODE_UNSPECIFIED", - "BROADCAST_MODE_BLOCK", - "BROADCAST_MODE_SYNC", - "BROADCAST_MODE_ASYNC" - ] - } - }, - "description": "BroadcastTxRequest is the request type for the Service.BroadcastTxRequest\nRPC method." - }, - "cosmos.tx.v1beta1.BroadcastTxResponse": { - "type": "object", - "properties": { - "tx_response": { - "type": "object", - "properties": { - "height": { - "title": "The block height", - "type": "string", - "format": "int64" - }, - "txhash": { - "type": "string", - "description": "The transaction hash." - }, - "codespace": { - "title": "Namespace for the Code", - "type": "string" - }, - "code": { - "type": "integer", - "description": "Response code.", - "format": "int64" - }, - "data": { - "type": "string", - "description": "Result bytes, if any." - }, - "raw_log": { - "type": "string", - "description": "The output of the application's logger (raw string). May be\nnon-deterministic." - }, - "logs": { - "type": "array", - "description": "The output of the application's logger (typed). May be non-deterministic.", - "items": { - "type": "object", - "properties": { - "msg_index": { - "type": "integer", - "format": "int64" - }, - "log": { - "type": "string" - }, - "events": { - "type": "array", - "description": "Events contains a slice of Event objects that were emitted during some\nexecution.", - "items": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "attributes": { - "type": "array", - "items": { - "type": "object", - "properties": { - "key": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "description": "Attribute defines an attribute wrapper where the key and value are\nstrings instead of raw bytes." - } - } - }, - "description": "StringEvent defines en Event object wrapper where all the attributes\ncontain key/value pairs that are strings instead of raw bytes." - } - } - }, - "description": "ABCIMessageLog defines a structure containing an indexed tx ABCI message log." - } - }, - "info": { - "type": "string", - "description": "Additional information. May be non-deterministic." - }, - "gas_wanted": { - "type": "string", - "description": "Amount of gas requested for transaction.", - "format": "int64" - }, - "gas_used": { - "type": "string", - "description": "Amount of gas consumed by transaction.", - "format": "int64" - }, - "tx": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "timestamp": { - "type": "string", - "description": "Time of the previous block. For heights > 1, it's the weighted median of\nthe timestamps of the valid votes in the block.LastCommit. For height == 1,\nit's genesis time." - }, - "events": { - "type": "array", - "description": "Events defines all the events emitted by processing a transaction. Note,\nthese events include those emitted by processing all the messages and those\nemitted from the ante. Whereas Logs contains the events, with\nadditional metadata, emitted only by processing the messages.\n\nSince: cosmos-sdk 0.42.11, 0.44.5, 0.45", - "items": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "attributes": { - "type": "array", - "items": { - "type": "object", - "properties": { - "key": { - "type": "string" - }, - "value": { - "type": "string" - }, - "index": { - "type": "boolean" - } - }, - "description": "EventAttribute is a single key-value pair, associated with an event." - } - } - }, - "description": "Event allows application developers to attach additional information to\nResponseFinalizeBlock and ResponseCheckTx.\nLater, transactions may be queried using these events." - } - } - }, - "description": "TxResponse defines a structure containing relevant tx data and metadata. The\ntags are stringified and the log is JSON decoded." - } - }, - "description": "BroadcastTxResponse is the response type for the\nService.BroadcastTx method." - }, - "cosmos.tx.v1beta1.Fee": { - "type": "object", - "properties": { - "amount": { - "title": "amount is the amount of coins to be paid as a fee", - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - } - }, - "gas_limit": { - "title": "gas_limit is the maximum gas that can be used in transaction processing\nbefore an out of gas error occurs", - "type": "string", - "format": "uint64" - }, - "payer": { - "type": "string", - "description": "if unset, the first signer is responsible for paying the fees. If set, the specified account must pay the fees.\nthe payer must be a tx signer (and thus have signed this field in AuthInfo).\nsetting this field does *not* change the ordering of required signers for the transaction." - }, - "granter": { - "title": "if set, the fee payer (either the first signer or the value of the payer field) requests that a fee grant be used\nto pay fees instead of the fee payer's own balance. If an appropriate fee grant does not exist or the chain does\nnot support fee grants, this will fail", - "type": "string" - } - }, - "description": "Fee includes the amount of coins paid in fees and the maximum\ngas to be used by the transaction. The ratio yields an effective \"gasprice\",\nwhich must be above some miminum to be accepted into the mempool." - }, - "cosmos.tx.v1beta1.GetBlockWithTxsResponse": { - "type": "object", - "properties": { - "txs": { - "type": "array", - "description": "txs are the transactions in the block.", - "items": { - "$ref": "#/components/schemas/cosmos.tx.v1beta1.Tx" - } - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "block": { - "type": "object", - "properties": { - "header": { - "type": "object", - "properties": { - "version": { - "title": "basic block info", - "type": "object", - "properties": { - "block": { - "type": "string", - "format": "uint64" - }, - "app": { - "type": "string", - "format": "uint64" - } - }, - "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." - }, - "chain_id": { - "type": "string" - }, - "height": { - "type": "string", - "format": "int64" - }, - "time": { - "type": "string", - "format": "date-time" - }, - "last_block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "last_commit_hash": { - "title": "hashes of block data", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "data_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validators_hash": { - "title": "hashes from the app output from the prev block", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "next_validators_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "consensus_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "app_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "last_results_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "evidence_hash": { - "title": "consensus info", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proposer_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "Header defines the structure of a block header." - }, - "data": { - "title": "Data contains the set of transactions included in the block", - "type": "object", - "properties": { - "txs": { - "type": "array", - "description": "Txs that will be applied by state @ block.Height+1.\nNOTE: not all txs here are valid. We're just agreeing on the order first.\nThis means that block.AppHash does not include these txs.", - "items": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - }, - "evidence": { - "type": "object", - "properties": { - "evidence": { - "type": "array", - "items": { - "type": "object", - "properties": { - "duplicate_vote_evidence": { - "type": "object", - "properties": { - "vote_a": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals", - "default": "SIGNED_MSG_TYPE_UNKNOWN", - "enum": [ - "SIGNED_MSG_TYPE_UNKNOWN", - "SIGNED_MSG_TYPE_PREVOTE", - "SIGNED_MSG_TYPE_PRECOMMIT", - "SIGNED_MSG_TYPE_PROPOSAL" - ] - }, - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validator_index": { - "type": "integer", - "format": "int32" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block.", - "format": "byte" - }, - "extension": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages.", - "format": "byte" - }, - "extension_signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages.", - "format": "byte" - } - }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." - }, - "vote_b": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals", - "default": "SIGNED_MSG_TYPE_UNKNOWN", - "enum": [ - "SIGNED_MSG_TYPE_UNKNOWN", - "SIGNED_MSG_TYPE_PREVOTE", - "SIGNED_MSG_TYPE_PRECOMMIT", - "SIGNED_MSG_TYPE_PROPOSAL" - ] - }, - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validator_index": { - "type": "integer", - "format": "int32" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block.", - "format": "byte" - }, - "extension": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages.", - "format": "byte" - }, - "extension_signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages.", - "format": "byte" - } - }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." - }, - "total_voting_power": { - "type": "string", - "format": "int64" - }, - "validator_power": { - "type": "string", - "format": "int64" - }, - "timestamp": { - "type": "string", - "format": "date-time" - } - }, - "description": "DuplicateVoteEvidence contains evidence of a validator signed two conflicting votes." - }, - "light_client_attack_evidence": { - "type": "object", - "properties": { - "conflicting_block": { - "type": "object", - "properties": { - "signed_header": { - "type": "object", - "properties": { - "header": { - "type": "object", - "properties": { - "version": { - "title": "basic block info", - "type": "object", - "properties": { - "block": { - "type": "string", - "format": "uint64" - }, - "app": { - "type": "string", - "format": "uint64" - } - }, - "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." - }, - "chain_id": { - "type": "string" - }, - "height": { - "type": "string", - "format": "int64" - }, - "time": { - "type": "string", - "format": "date-time" - }, - "last_block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "last_commit_hash": { - "title": "hashes of block data", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "data_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validators_hash": { - "title": "hashes from the app output from the prev block", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "next_validators_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "consensus_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "app_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "last_results_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "evidence_hash": { - "title": "consensus info", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proposer_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "Header defines the structure of a block header." - }, - "commit": { - "type": "object", - "properties": { - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "signatures": { - "type": "array", - "items": { - "type": "object", - "properties": { - "block_id_flag": { - "title": "BlockIdFlag indicates which BlockID the signature is for", - "type": "string", - "default": "BLOCK_ID_FLAG_UNKNOWN", - "enum": [ - "BLOCK_ID_FLAG_UNKNOWN", - "BLOCK_ID_FLAG_ABSENT", - "BLOCK_ID_FLAG_COMMIT", - "BLOCK_ID_FLAG_NIL" - ] - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "CommitSig is a part of the Vote included in a Commit." - } - } - }, - "description": "Commit contains the evidence that a block was committed by a set of validators." - } - } - }, - "validator_set": { - "type": "object", - "properties": { - "validators": { - "type": "array", - "items": { - "type": "object", - "properties": { - "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", - "type": "object", - "properties": { - "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - }, - "voting_power": { - "type": "string", - "format": "int64" - }, - "proposer_priority": { - "type": "string", - "format": "int64" - } - } - } - }, - "proposer": { - "type": "object", - "properties": { - "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", - "type": "object", - "properties": { - "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - }, - "voting_power": { - "type": "string", - "format": "int64" - }, - "proposer_priority": { - "type": "string", - "format": "int64" - } - } - }, - "total_voting_power": { - "type": "string", - "format": "int64" - } - } - } - } - }, - "common_height": { - "type": "string", - "format": "int64" - }, - "byzantine_validators": { - "type": "array", - "items": { - "type": "object", - "properties": { - "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", - "type": "object", - "properties": { - "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - }, - "voting_power": { - "type": "string", - "format": "int64" - }, - "proposer_priority": { - "type": "string", - "format": "int64" - } - } - } - }, - "total_voting_power": { - "type": "string", - "format": "int64" - }, - "timestamp": { - "type": "string", - "format": "date-time" - } + "evmos.erc20.v1.Owner": { + "type": "string", + "enum": [ + "OWNER_UNSPECIFIED", + "OWNER_MODULE", + "OWNER_EXTERNAL" + ], + "default": "OWNER_UNSPECIFIED", + "description": "Owner enumerates the ownership of a ERC20 contract.\n\n - OWNER_UNSPECIFIED: OWNER_UNSPECIFIED defines an invalid/undefined owner.\n - OWNER_MODULE: OWNER_MODULE - erc20 is owned by the erc20 module account.\n - OWNER_EXTERNAL: OWNER_EXTERNAL - erc20 is owned by an external account." + }, + "evmos.erc20.v1.Params": { + "type": "object", + "properties": { + "enable_erc20": { + "type": "boolean", + "description": "enable_erc20 is the parameter to enable the conversion of Cosmos coins <--> ERC20 tokens." + }, + "enable_evm_hook": { + "type": "boolean", + "description": "enable_evm_hook is the parameter to enable the EVM hook that converts an ERC20 token to a Cosmos\nCoin by transferring the Tokens through a MsgEthereumTx to the ModuleAddress Ethereum address." + } + }, + "title": "Params defines the erc20 module params" + }, + "evmos.erc20.v1.QueryParamsResponse": { + "type": "object", + "properties": { + "params": { + "title": "params are the erc20 module parameters", + "type": "object", + "properties": { + "enable_erc20": { + "type": "boolean", + "description": "enable_erc20 is the parameter to enable the conversion of Cosmos coins <--> ERC20 tokens." + }, + "enable_evm_hook": { + "type": "boolean", + "description": "enable_evm_hook is the parameter to enable the EVM hook that converts an ERC20 token to a Cosmos\nCoin by transferring the Tokens through a MsgEthereumTx to the ModuleAddress Ethereum address." + } + } + } + }, + "description": "QueryParamsResponse is the response type for the Query/Params RPC\nmethod." + }, + "evmos.erc20.v1.QueryTokenPairResponse": { + "type": "object", + "properties": { + "token_pair": { + "type": "object", + "properties": { + "erc20_address": { + "type": "string", + "title": "erc20_address is the hex address of ERC20 contract token" + }, + "denom": { + "type": "string", + "title": "denom defines the cosmos base denomination to be mapped to" + }, + "enabled": { + "type": "boolean", + "title": "enabled defines the token mapping enable status" + }, + "contract_owner": { + "title": "contract_owner is the an ENUM specifying the type of ERC20 owner (0 invalid, 1 ModuleAccount, 2 external address)", + "type": "string", + "enum": [ + "OWNER_UNSPECIFIED", + "OWNER_MODULE", + "OWNER_EXTERNAL" + ], + "default": "OWNER_UNSPECIFIED", + "description": "Owner enumerates the ownership of a ERC20 contract.\n\n - OWNER_UNSPECIFIED: OWNER_UNSPECIFIED defines an invalid/undefined owner.\n - OWNER_MODULE: OWNER_MODULE - erc20 is owned by the erc20 module account.\n - OWNER_EXTERNAL: OWNER_EXTERNAL - erc20 is owned by an external account." + } + }, + "description": "TokenPair defines an instance that records a pairing consisting of a native\nCosmos Coin and an ERC20 token address.", + "title": "token_pairs returns the info about a registered token pair for the erc20 module" + } + }, + "description": "QueryTokenPairResponse is the response type for the Query/TokenPair RPC\nmethod." + }, + "evmos.erc20.v1.QueryTokenPairsResponse": { + "type": "object", + "properties": { + "token_pairs": { + "type": "array", + "items": { + "type": "object", + "properties": { + "erc20_address": { + "type": "string", + "title": "erc20_address is the hex address of ERC20 contract token" + }, + "denom": { + "type": "string", + "title": "denom defines the cosmos base denomination to be mapped to" + }, + "enabled": { + "type": "boolean", + "title": "enabled defines the token mapping enable status" + }, + "contract_owner": { + "title": "contract_owner is the an ENUM specifying the type of ERC20 owner (0 invalid, 1 ModuleAccount, 2 external address)", + "type": "string", + "enum": [ + "OWNER_UNSPECIFIED", + "OWNER_MODULE", + "OWNER_EXTERNAL" + ], + "default": "OWNER_UNSPECIFIED", + "description": "Owner enumerates the ownership of a ERC20 contract.\n\n - OWNER_UNSPECIFIED: OWNER_UNSPECIFIED defines an invalid/undefined owner.\n - OWNER_MODULE: OWNER_MODULE - erc20 is owned by the erc20 module account.\n - OWNER_EXTERNAL: OWNER_EXTERNAL - erc20 is owned by an external account." + } + }, + "description": "TokenPair defines an instance that records a pairing consisting of a native\nCosmos Coin and an ERC20 token address." + }, + "title": "token_pairs is a slice of registered token pairs for the erc20 module" + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "description": "QueryTokenPairsResponse is the response type for the Query/TokenPairs RPC\nmethod." + }, + "evmos.erc20.v1.TokenPair": { + "type": "object", + "properties": { + "erc20_address": { + "type": "string", + "title": "erc20_address is the hex address of ERC20 contract token" + }, + "denom": { + "type": "string", + "title": "denom defines the cosmos base denomination to be mapped to" + }, + "enabled": { + "type": "boolean", + "title": "enabled defines the token mapping enable status" + }, + "contract_owner": { + "title": "contract_owner is the an ENUM specifying the type of ERC20 owner (0 invalid, 1 ModuleAccount, 2 external address)", + "type": "string", + "enum": [ + "OWNER_UNSPECIFIED", + "OWNER_MODULE", + "OWNER_EXTERNAL" + ], + "default": "OWNER_UNSPECIFIED", + "description": "Owner enumerates the ownership of a ERC20 contract.\n\n - OWNER_UNSPECIFIED: OWNER_UNSPECIFIED defines an invalid/undefined owner.\n - OWNER_MODULE: OWNER_MODULE - erc20 is owned by the erc20 module account.\n - OWNER_EXTERNAL: OWNER_EXTERNAL - erc20 is owned by an external account." + } + }, + "description": "TokenPair defines an instance that records a pairing consisting of a native\nCosmos Coin and an ERC20 token address." + }, + "cosmos.base.v1beta1.DecCoin": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." + }, + "evmos.inflation.v1.ExponentialCalculation": { + "type": "object", + "properties": { + "a": { + "type": "string", + "title": "a defines the initial value" + }, + "r": { + "type": "string", + "title": "r defines the reduction factor" + }, + "c": { + "type": "string", + "title": "c defines the parameter for long term inflation" + }, + "bonding_target": { + "type": "string", + "title": "bonding_target" + }, + "max_variance": { + "type": "string", + "title": "max_variance" + } + }, + "title": "ExponentialCalculation holds factors to calculate exponential inflation on\neach period. Calculation reference:\nperiodProvision = exponentialDecay * bondingIncentive\nf(x) = (a * (1 - r) ^ x + c) * (1 + max_variance - bondedRatio *\n(max_variance / bonding_target))" + }, + "evmos.inflation.v1.InflationDistribution": { + "type": "object", + "properties": { + "staking_rewards": { + "type": "string", + "title": "staking_rewards defines the proportion of the minted minted_denom that is\nto be allocated as staking rewards" + }, + "usage_incentives": { + "type": "string", + "title": "Deprecated: usage_incentives defines the proportion of the minted minted_denom that is\nto be allocated to the incentives module address" + }, + "community_pool": { + "type": "string", + "title": "community_pool defines the proportion of the minted minted_denom that is to\nbe allocated to the community pool" + } + }, + "title": "InflationDistribution defines the distribution in which inflation is\nallocated through minting on each epoch (staking, incentives, community). It\nexcludes the team vesting distribution, as this is minted once at genesis.\nThe initial InflationDistribution can be calculated from the Evmos Token\nModel like this:\nmintDistribution1 = distribution1 / (1 - teamVestingDistribution)\n0.5333333 = 40% / (1 - 25%)" + }, + "evmos.inflation.v1.Params": { + "type": "object", + "properties": { + "mint_denom": { + "type": "string", + "title": "mint_denom specifies the type of coin to mint" + }, + "exponential_calculation": { + "title": "exponential_calculation takes in the variables to calculate exponential inflation", + "type": "object", + "properties": { + "a": { + "type": "string", + "title": "a defines the initial value" + }, + "r": { + "type": "string", + "title": "r defines the reduction factor" + }, + "c": { + "type": "string", + "title": "c defines the parameter for long term inflation" + }, + "bonding_target": { + "type": "string", + "title": "bonding_target" + }, + "max_variance": { + "type": "string", + "title": "max_variance" + } + } + }, + "inflation_distribution": { + "title": "inflation_distribution of the minted denom", + "type": "object", + "properties": { + "staking_rewards": { + "type": "string", + "title": "staking_rewards defines the proportion of the minted minted_denom that is\nto be allocated as staking rewards" + }, + "usage_incentives": { + "type": "string", + "title": "Deprecated: usage_incentives defines the proportion of the minted minted_denom that is\nto be allocated to the incentives module address" + }, + "community_pool": { + "type": "string", + "title": "community_pool defines the proportion of the minted minted_denom that is to\nbe allocated to the community pool" + } + } + }, + "enable_inflation": { + "type": "boolean", + "title": "enable_inflation is the parameter that enables inflation and halts increasing the skipped_epochs" + } + }, + "description": "Params holds parameters for the inflation module." + }, + "evmos.inflation.v1.QueryCirculatingSupplyResponse": { + "type": "object", + "properties": { + "circulating_supply": { + "title": "circulating_supply is the total amount of coins in circulation", + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." + } + }, + "description": "QueryCirculatingSupplyResponse is the response type for the\nQuery/CirculatingSupply RPC method." + }, + "evmos.inflation.v1.QueryEpochMintProvisionResponse": { + "type": "object", + "properties": { + "epoch_mint_provision": { + "description": "epoch_mint_provision is the current minting per epoch provision value.", + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + } + } + }, + "description": "QueryEpochMintProvisionResponse is the response type for the\nQuery/EpochMintProvision RPC method." + }, + "evmos.inflation.v1.QueryInflationRateResponse": { + "type": "object", + "properties": { + "inflation_rate": { + "type": "string", + "title": "inflation_rate by which the total supply increases within one period" + } + }, + "description": "QueryInflationRateResponse is the response type for the Query/InflationRate\nRPC method." + }, + "evmos.inflation.v1.QueryParamsResponse": { + "type": "object", + "properties": { + "params": { + "description": "params defines the parameters of the module.", + "type": "object", + "properties": { + "mint_denom": { + "type": "string", + "title": "mint_denom specifies the type of coin to mint" + }, + "exponential_calculation": { + "title": "exponential_calculation takes in the variables to calculate exponential inflation", + "type": "object", + "properties": { + "a": { + "type": "string", + "title": "a defines the initial value" + }, + "r": { + "type": "string", + "title": "r defines the reduction factor" + }, + "c": { + "type": "string", + "title": "c defines the parameter for long term inflation" + }, + "bonding_target": { + "type": "string", + "title": "bonding_target" + }, + "max_variance": { + "type": "string", + "title": "max_variance" + } + } + }, + "inflation_distribution": { + "title": "inflation_distribution of the minted denom", + "type": "object", + "properties": { + "staking_rewards": { + "type": "string", + "title": "staking_rewards defines the proportion of the minted minted_denom that is\nto be allocated as staking rewards" + }, + "usage_incentives": { + "type": "string", + "title": "Deprecated: usage_incentives defines the proportion of the minted minted_denom that is\nto be allocated to the incentives module address" + }, + "community_pool": { + "type": "string", + "title": "community_pool defines the proportion of the minted minted_denom that is to\nbe allocated to the community pool" + } + } + }, + "enable_inflation": { + "type": "boolean", + "title": "enable_inflation is the parameter that enables inflation and halts increasing the skipped_epochs" + } + } + } + }, + "description": "QueryParamsResponse is the response type for the Query/Params RPC method." + }, + "evmos.inflation.v1.QueryPeriodResponse": { + "type": "object", + "properties": { + "period": { + "type": "string", + "format": "uint64", + "description": "period is the current minting per epoch provision value." + } + }, + "description": "QueryPeriodResponse is the response type for the Query/Period RPC method." + }, + "evmos.inflation.v1.QuerySkippedEpochsResponse": { + "type": "object", + "properties": { + "skipped_epochs": { + "type": "string", + "format": "uint64", + "description": "skipped_epochs is the number of epochs that the inflation module has been disabled." + } + }, + "description": "QuerySkippedEpochsResponse is the response type for the Query/SkippedEpochs\nRPC method." + }, + "cosmos.base.v1beta1.Coin": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "evmos.vesting.v2.QueryBalancesResponse": { + "type": "object", + "properties": { + "locked": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "title": "locked defines the current amount of locked tokens" + }, + "unvested": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "title": "unvested defines the current amount of unvested tokens" + }, + "vested": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "title": "vested defines the current amount of vested tokens" + } + }, + "description": "QueryBalancesResponse is the response type for the Query/Balances RPC\nmethod." + }, + "evmos.revenue.v1.Params": { + "type": "object", + "properties": { + "enable_revenue": { + "type": "boolean", + "title": "enable_revenue defines a parameter to enable the revenue module" + }, + "developer_shares": { + "type": "string", + "title": "developer_shares defines the proportion of the transaction fees to be\ndistributed to the registered contract owner" + }, + "addr_derivation_cost_create": { + "type": "string", + "format": "uint64", + "title": "addr_derivation_cost_create defines the cost of address derivation for\nverifying the contract deployer at fee registration" + } + }, + "title": "Params defines the revenue module params" + }, + "evmos.revenue.v1.QueryDeployerRevenuesResponse": { + "type": "object", + "properties": { + "contract_addresses": { + "type": "array", + "items": { + "type": "string" + }, + "title": "contract_addresses is the slice of registered contract addresses for a deployer" + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "description": "QueryDeployerRevenuesResponse is the response type for the\nQuery/DeployerRevenues RPC method." + }, + "evmos.revenue.v1.QueryParamsResponse": { + "type": "object", + "properties": { + "params": { + "title": "params is the returned revenue parameter", + "type": "object", + "properties": { + "enable_revenue": { + "type": "boolean", + "title": "enable_revenue defines a parameter to enable the revenue module" + }, + "developer_shares": { + "type": "string", + "title": "developer_shares defines the proportion of the transaction fees to be\ndistributed to the registered contract owner" + }, + "addr_derivation_cost_create": { + "type": "string", + "format": "uint64", + "title": "addr_derivation_cost_create defines the cost of address derivation for\nverifying the contract deployer at fee registration" + } + } + } + }, + "description": "QueryParamsResponse is the response type for the Query/Params RPC method." + }, + "evmos.revenue.v1.QueryRevenueResponse": { + "type": "object", + "properties": { + "revenue": { + "type": "object", + "properties": { + "contract_address": { + "type": "string", + "title": "contract_address is the hex address of a registered contract" + }, + "deployer_address": { + "type": "string", + "title": "deployer_address is the bech32 address of message sender. It must be the same as the origin EOA\nsending the transaction which deploys the contract" + }, + "withdrawer_address": { + "type": "string", + "title": "withdrawer_address is the bech32 address of account receiving the transaction fees it defaults to\ndeployer_address" + } + }, + "title": "Revenue defines an instance that organizes fee distribution conditions for\nthe owner of a given smart contract" + } + }, + "description": "QueryRevenueResponse is the response type for the Query/Revenue RPC method." + }, + "evmos.revenue.v1.QueryRevenuesResponse": { + "type": "object", + "properties": { + "revenues": { + "type": "array", + "items": { + "type": "object", + "properties": { + "contract_address": { + "type": "string", + "title": "contract_address is the hex address of a registered contract" + }, + "deployer_address": { + "type": "string", + "title": "deployer_address is the bech32 address of message sender. It must be the same as the origin EOA\nsending the transaction which deploys the contract" + }, + "withdrawer_address": { + "type": "string", + "title": "withdrawer_address is the bech32 address of account receiving the transaction fees it defaults to\ndeployer_address" + } + }, + "title": "Revenue defines an instance that organizes fee distribution conditions for\nthe owner of a given smart contract" + }, + "title": "revenues is a slice of all stored Reveneue" + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "description": "QueryRevenuesResponse is the response type for the Query/Revenues RPC method." + }, + "evmos.revenue.v1.QueryWithdrawerRevenuesResponse": { + "type": "object", + "properties": { + "contract_addresses": { + "type": "array", + "items": { + "type": "string" + }, + "title": "contract_addresses is the slice of registered contract addresses for a withdrawer" + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "description": "QueryWithdrawerRevenuesResponse is the response type for the\nQuery/WithdrawerRevenues RPC method." + }, + "evmos.revenue.v1.Revenue": { + "type": "object", + "properties": { + "contract_address": { + "type": "string", + "title": "contract_address is the hex address of a registered contract" + }, + "deployer_address": { + "type": "string", + "title": "deployer_address is the bech32 address of message sender. It must be the same as the origin EOA\nsending the transaction which deploys the contract" + }, + "withdrawer_address": { + "type": "string", + "title": "withdrawer_address is the bech32 address of account receiving the transaction fees it defaults to\ndeployer_address" + } + }, + "title": "Revenue defines an instance that organizes fee distribution conditions for\nthe owner of a given smart contract" + }, + "ethermint.evm.v1.ChainConfig": { + "type": "object", + "properties": { + "homestead_block": { + "type": "string", + "title": "homestead_block switch (nil no fork, 0 = already homestead)" + }, + "dao_fork_block": { + "type": "string", + "title": "dao_fork_block corresponds to TheDAO hard-fork switch block (nil no fork)" + }, + "dao_fork_support": { + "type": "boolean", + "title": "dao_fork_support defines whether the nodes supports or opposes the DAO hard-fork" + }, + "eip150_block": { + "type": "string", + "title": "eip150_block: EIP150 implements the Gas price changes\n(https://github.com/ethereum/EIPs/issues/150) EIP150 HF block (nil no fork)" + }, + "eip150_hash": { + "type": "string", + "title": "eip150_hash: EIP150 HF hash (needed for header only clients as only gas pricing changed)" + }, + "eip155_block": { + "type": "string", + "title": "eip155_block: EIP155Block HF block" + }, + "eip158_block": { + "type": "string", + "title": "eip158_block: EIP158 HF block" + }, + "byzantium_block": { + "type": "string", + "title": "byzantium_block: Byzantium switch block (nil no fork, 0 = already on byzantium)" + }, + "constantinople_block": { + "type": "string", + "title": "constantinople_block: Constantinople switch block (nil no fork, 0 = already activated)" + }, + "petersburg_block": { + "type": "string", + "title": "petersburg_block: Petersburg switch block (nil same as Constantinople)" + }, + "istanbul_block": { + "type": "string", + "title": "istanbul_block: Istanbul switch block (nil no fork, 0 = already on istanbul)" + }, + "muir_glacier_block": { + "type": "string", + "title": "muir_glacier_block: Eip-2384 (bomb delay) switch block (nil no fork, 0 = already activated)" + }, + "berlin_block": { + "type": "string", + "title": "berlin_block: Berlin switch block (nil = no fork, 0 = already on berlin)" + }, + "london_block": { + "type": "string", + "title": "london_block: London switch block (nil = no fork, 0 = already on london)" + }, + "arrow_glacier_block": { + "type": "string", + "title": "arrow_glacier_block: Eip-4345 (bomb delay) switch block (nil = no fork, 0 = already activated)" + }, + "gray_glacier_block": { + "type": "string", + "title": "gray_glacier_block: EIP-5133 (bomb delay) switch block (nil = no fork, 0 = already activated)" + }, + "merge_netsplit_block": { + "type": "string", + "title": "merge_netsplit_block: Virtual fork after The Merge to use as a network splitter" + }, + "shanghai_block": { + "type": "string", + "title": "shanghai_block switch block (nil = no fork, 0 = already on shanghai)" + }, + "cancun_block": { + "type": "string", + "title": "cancun_block switch block (nil = no fork, 0 = already on cancun)" + } + }, + "description": "ChainConfig defines the Ethereum ChainConfig parameters using *sdk.Int values\ninstead of *big.Int." + }, + "ethermint.evm.v1.EstimateGasResponse": { + "type": "object", + "properties": { + "gas": { + "type": "string", + "format": "uint64", + "title": "gas returns the estimated gas" + } + }, + "title": "EstimateGasResponse defines EstimateGas response" + }, + "ethermint.evm.v1.Log": { + "type": "object", + "properties": { + "address": { + "type": "string", + "title": "address of the contract that generated the event" + }, + "topics": { + "type": "array", + "items": { + "type": "string" + }, + "description": "topics is a list of topics provided by the contract." + }, + "data": { + "type": "string", + "format": "byte", + "title": "data which is supplied by the contract, usually ABI-encoded" + }, + "block_number": { + "type": "string", + "format": "uint64", + "title": "block_number of the block in which the transaction was included" + }, + "tx_hash": { + "type": "string", + "title": "tx_hash is the transaction hash" + }, + "tx_index": { + "type": "string", + "format": "uint64", + "title": "tx_index of the transaction in the block" + }, + "block_hash": { + "type": "string", + "title": "block_hash of the block in which the transaction was included" + }, + "index": { + "type": "string", + "format": "uint64", + "title": "index of the log in the block" + }, + "removed": { + "type": "boolean", + "description": "removed is true if this log was reverted due to a chain\nreorganisation. You must pay attention to this field if you receive logs\nthrough a filter query." + } + }, + "description": "Log represents an protobuf compatible Ethereum Log that defines a contract\nlog event. These events are generated by the LOG opcode and stored/indexed by\nthe node.\n\nNOTE: address, topics and data are consensus fields. The rest of the fields\nare derived, i.e. filled in by the nodes, but not secured by consensus." + }, + "ethermint.evm.v1.MsgEthereumTx": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }", + "title": "data is inner transaction data of the Ethereum transaction" + }, + "size": { + "type": "number", + "format": "double", + "title": "size is the encoded storage size of the transaction (DEPRECATED)" + }, + "hash": { + "type": "string", + "title": "hash of the transaction in hex format" + }, + "from": { + "type": "string", + "title": "from is the ethereum signer address in hex format. This address value is checked\nagainst the address derived from the signature (V, R, S) using the\nsecp256k1 elliptic curve" + } + }, + "description": "MsgEthereumTx encapsulates an Ethereum transaction as an SDK message." + }, + "ethermint.evm.v1.MsgEthereumTxResponse": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "title": "hash of the ethereum transaction in hex format. This hash differs from the\nTendermint sha256 hash of the transaction bytes. See\nhttps://github.com/tendermint/tendermint/issues/6539 for reference" + }, + "logs": { + "type": "array", + "items": { + "type": "object", + "properties": { + "address": { + "type": "string", + "title": "address of the contract that generated the event" + }, + "topics": { + "type": "array", + "items": { + "type": "string" + }, + "description": "topics is a list of topics provided by the contract." + }, + "data": { + "type": "string", + "format": "byte", + "title": "data which is supplied by the contract, usually ABI-encoded" + }, + "block_number": { + "type": "string", + "format": "uint64", + "title": "block_number of the block in which the transaction was included" + }, + "tx_hash": { + "type": "string", + "title": "tx_hash is the transaction hash" + }, + "tx_index": { + "type": "string", + "format": "uint64", + "title": "tx_index of the transaction in the block" + }, + "block_hash": { + "type": "string", + "title": "block_hash of the block in which the transaction was included" + }, + "index": { + "type": "string", + "format": "uint64", + "title": "index of the log in the block" + }, + "removed": { + "type": "boolean", + "description": "removed is true if this log was reverted due to a chain\nreorganisation. You must pay attention to this field if you receive logs\nthrough a filter query." + } + }, + "description": "Log represents an protobuf compatible Ethereum Log that defines a contract\nlog event. These events are generated by the LOG opcode and stored/indexed by\nthe node.\n\nNOTE: address, topics and data are consensus fields. The rest of the fields\nare derived, i.e. filled in by the nodes, but not secured by consensus." + }, + "description": "logs contains the transaction hash and the proto-compatible ethereum\nlogs." + }, + "ret": { + "type": "string", + "format": "byte", + "title": "ret is the returned data from evm function (result or data supplied with revert\nopcode)" + }, + "vm_error": { + "type": "string", + "title": "vm_error is the error returned by vm execution" + }, + "gas_used": { + "type": "string", + "format": "uint64", + "title": "gas_used specifies how much gas was consumed by the transaction" + } + }, + "description": "MsgEthereumTxResponse defines the Msg/EthereumTx response type." + }, + "ethermint.evm.v1.Params": { + "type": "object", + "properties": { + "evm_denom": { + "type": "string", + "description": "evm_denom represents the token denomination used to run the EVM state\ntransitions." + }, + "enable_create": { + "type": "boolean", + "title": "enable_create toggles state transitions that use the vm.Create function" + }, + "enable_call": { + "type": "boolean", + "title": "enable_call toggles state transitions that use the vm.Call function" + }, + "extra_eips": { + "type": "array", + "items": { + "type": "string", + "format": "int64" + }, + "title": "extra_eips defines the additional EIPs for the vm.Config" + }, + "chain_config": { + "title": "chain_config defines the EVM chain configuration parameters", + "type": "object", + "properties": { + "homestead_block": { + "type": "string", + "title": "homestead_block switch (nil no fork, 0 = already homestead)" + }, + "dao_fork_block": { + "type": "string", + "title": "dao_fork_block corresponds to TheDAO hard-fork switch block (nil no fork)" + }, + "dao_fork_support": { + "type": "boolean", + "title": "dao_fork_support defines whether the nodes supports or opposes the DAO hard-fork" + }, + "eip150_block": { + "type": "string", + "title": "eip150_block: EIP150 implements the Gas price changes\n(https://github.com/ethereum/EIPs/issues/150) EIP150 HF block (nil no fork)" + }, + "eip150_hash": { + "type": "string", + "title": "eip150_hash: EIP150 HF hash (needed for header only clients as only gas pricing changed)" + }, + "eip155_block": { + "type": "string", + "title": "eip155_block: EIP155Block HF block" + }, + "eip158_block": { + "type": "string", + "title": "eip158_block: EIP158 HF block" + }, + "byzantium_block": { + "type": "string", + "title": "byzantium_block: Byzantium switch block (nil no fork, 0 = already on byzantium)" + }, + "constantinople_block": { + "type": "string", + "title": "constantinople_block: Constantinople switch block (nil no fork, 0 = already activated)" + }, + "petersburg_block": { + "type": "string", + "title": "petersburg_block: Petersburg switch block (nil same as Constantinople)" + }, + "istanbul_block": { + "type": "string", + "title": "istanbul_block: Istanbul switch block (nil no fork, 0 = already on istanbul)" + }, + "muir_glacier_block": { + "type": "string", + "title": "muir_glacier_block: Eip-2384 (bomb delay) switch block (nil no fork, 0 = already activated)" + }, + "berlin_block": { + "type": "string", + "title": "berlin_block: Berlin switch block (nil = no fork, 0 = already on berlin)" + }, + "london_block": { + "type": "string", + "title": "london_block: London switch block (nil = no fork, 0 = already on london)" + }, + "arrow_glacier_block": { + "type": "string", + "title": "arrow_glacier_block: Eip-4345 (bomb delay) switch block (nil = no fork, 0 = already activated)" + }, + "gray_glacier_block": { + "type": "string", + "title": "gray_glacier_block: EIP-5133 (bomb delay) switch block (nil = no fork, 0 = already activated)" + }, + "merge_netsplit_block": { + "type": "string", + "title": "merge_netsplit_block: Virtual fork after The Merge to use as a network splitter" + }, + "shanghai_block": { + "type": "string", + "title": "shanghai_block switch block (nil = no fork, 0 = already on shanghai)" + }, + "cancun_block": { + "type": "string", + "title": "cancun_block switch block (nil = no fork, 0 = already on cancun)" + } + }, + "description": "ChainConfig defines the Ethereum ChainConfig parameters using *sdk.Int values\ninstead of *big.Int." + }, + "allow_unprotected_txs": { + "type": "boolean", + "description": "allow_unprotected_txs defines if replay-protected (i.e non EIP155\nsigned) transactions can be executed on the state machine." + }, + "active_precompiles": { + "type": "array", + "items": { + "type": "string" + }, + "title": "active_precompiles defines the slice of hex addresses of the precompiled\ncontracts that are active" + }, + "evm_channels": { + "type": "array", + "items": { + "type": "string" + }, + "title": "evm_channels is the list of channel identifiers from EVM compatible chains" + } + }, + "title": "Params defines the EVM module parameters" + }, + "ethermint.evm.v1.QueryAccountResponse": { + "type": "object", + "properties": { + "balance": { + "type": "string", + "description": "balance is the balance of the EVM denomination." + }, + "code_hash": { + "type": "string", + "description": "code_hash is the hex-formatted code bytes from the EOA." + }, + "nonce": { + "type": "string", + "format": "uint64", + "description": "nonce is the account's sequence number." + } + }, + "description": "QueryAccountResponse is the response type for the Query/Account RPC method." + }, + "ethermint.evm.v1.QueryBalanceResponse": { + "type": "object", + "properties": { + "balance": { + "type": "string", + "description": "balance is the balance of the EVM denomination." + } + }, + "description": "QueryBalanceResponse is the response type for the Query/Balance RPC method." + }, + "ethermint.evm.v1.QueryBaseFeeResponse": { + "type": "object", + "properties": { + "base_fee": { + "type": "string", + "title": "base_fee is the EIP1559 base fee" + } + }, + "description": "QueryBaseFeeResponse returns the EIP1559 base fee." + }, + "ethermint.evm.v1.QueryCodeResponse": { + "type": "object", + "properties": { + "code": { + "type": "string", + "format": "byte", + "description": "code represents the code bytes from an ethereum address." + } + }, + "description": "QueryCodeResponse is the response type for the Query/Code RPC\nmethod." + }, + "ethermint.evm.v1.QueryCosmosAccountResponse": { + "type": "object", + "properties": { + "cosmos_address": { + "type": "string", + "description": "cosmos_address is the cosmos address of the account." + }, + "sequence": { + "type": "string", + "format": "uint64", + "description": "sequence is the account's sequence number." + }, + "account_number": { + "type": "string", + "format": "uint64", + "title": "account_number is the account number" + } + }, + "description": "QueryCosmosAccountResponse is the response type for the Query/CosmosAccount\nRPC method." + }, + "ethermint.evm.v1.QueryParamsResponse": { + "type": "object", + "properties": { + "params": { + "description": "params define the evm module parameters.", + "type": "object", + "properties": { + "evm_denom": { + "type": "string", + "description": "evm_denom represents the token denomination used to run the EVM state\ntransitions." + }, + "enable_create": { + "type": "boolean", + "title": "enable_create toggles state transitions that use the vm.Create function" + }, + "enable_call": { + "type": "boolean", + "title": "enable_call toggles state transitions that use the vm.Call function" + }, + "extra_eips": { + "type": "array", + "items": { + "type": "string", + "format": "int64" + }, + "title": "extra_eips defines the additional EIPs for the vm.Config" + }, + "chain_config": { + "title": "chain_config defines the EVM chain configuration parameters", + "type": "object", + "properties": { + "homestead_block": { + "type": "string", + "title": "homestead_block switch (nil no fork, 0 = already homestead)" + }, + "dao_fork_block": { + "type": "string", + "title": "dao_fork_block corresponds to TheDAO hard-fork switch block (nil no fork)" + }, + "dao_fork_support": { + "type": "boolean", + "title": "dao_fork_support defines whether the nodes supports or opposes the DAO hard-fork" + }, + "eip150_block": { + "type": "string", + "title": "eip150_block: EIP150 implements the Gas price changes\n(https://github.com/ethereum/EIPs/issues/150) EIP150 HF block (nil no fork)" + }, + "eip150_hash": { + "type": "string", + "title": "eip150_hash: EIP150 HF hash (needed for header only clients as only gas pricing changed)" + }, + "eip155_block": { + "type": "string", + "title": "eip155_block: EIP155Block HF block" + }, + "eip158_block": { + "type": "string", + "title": "eip158_block: EIP158 HF block" + }, + "byzantium_block": { + "type": "string", + "title": "byzantium_block: Byzantium switch block (nil no fork, 0 = already on byzantium)" + }, + "constantinople_block": { + "type": "string", + "title": "constantinople_block: Constantinople switch block (nil no fork, 0 = already activated)" + }, + "petersburg_block": { + "type": "string", + "title": "petersburg_block: Petersburg switch block (nil same as Constantinople)" + }, + "istanbul_block": { + "type": "string", + "title": "istanbul_block: Istanbul switch block (nil no fork, 0 = already on istanbul)" + }, + "muir_glacier_block": { + "type": "string", + "title": "muir_glacier_block: Eip-2384 (bomb delay) switch block (nil no fork, 0 = already activated)" + }, + "berlin_block": { + "type": "string", + "title": "berlin_block: Berlin switch block (nil = no fork, 0 = already on berlin)" + }, + "london_block": { + "type": "string", + "title": "london_block: London switch block (nil = no fork, 0 = already on london)" + }, + "arrow_glacier_block": { + "type": "string", + "title": "arrow_glacier_block: Eip-4345 (bomb delay) switch block (nil = no fork, 0 = already activated)" + }, + "gray_glacier_block": { + "type": "string", + "title": "gray_glacier_block: EIP-5133 (bomb delay) switch block (nil = no fork, 0 = already activated)" + }, + "merge_netsplit_block": { + "type": "string", + "title": "merge_netsplit_block: Virtual fork after The Merge to use as a network splitter" + }, + "shanghai_block": { + "type": "string", + "title": "shanghai_block switch block (nil = no fork, 0 = already on shanghai)" + }, + "cancun_block": { + "type": "string", + "title": "cancun_block switch block (nil = no fork, 0 = already on cancun)" + } + }, + "description": "ChainConfig defines the Ethereum ChainConfig parameters using *sdk.Int values\ninstead of *big.Int." + }, + "allow_unprotected_txs": { + "type": "boolean", + "description": "allow_unprotected_txs defines if replay-protected (i.e non EIP155\nsigned) transactions can be executed on the state machine." + }, + "active_precompiles": { + "type": "array", + "items": { + "type": "string" + }, + "title": "active_precompiles defines the slice of hex addresses of the precompiled\ncontracts that are active" + }, + "evm_channels": { + "type": "array", + "items": { + "type": "string" + }, + "title": "evm_channels is the list of channel identifiers from EVM compatible chains" + } + }, + "title": "Params defines the EVM module parameters" + } + }, + "description": "QueryParamsResponse defines the response type for querying x/evm parameters." + }, + "ethermint.evm.v1.QueryStorageResponse": { + "type": "object", + "properties": { + "value": { + "type": "string", + "description": "value defines the storage state value hash associated with the given key." + } + }, + "description": "QueryStorageResponse is the response type for the Query/Storage RPC\nmethod." + }, + "ethermint.evm.v1.QueryTraceBlockResponse": { + "type": "object", + "properties": { + "data": { + "type": "string", + "format": "byte", + "title": "data is the response serialized in bytes" + } + }, + "title": "QueryTraceBlockResponse defines TraceBlock response" + }, + "ethermint.evm.v1.QueryTraceTxResponse": { + "type": "object", + "properties": { + "data": { + "type": "string", + "format": "byte", + "title": "data is the response serialized in bytes" + } + }, + "title": "QueryTraceTxResponse defines TraceTx response" + }, + "ethermint.evm.v1.QueryValidatorAccountResponse": { + "type": "object", + "properties": { + "account_address": { + "type": "string", + "description": "account_address is the cosmos address of the account in bech32 format." + }, + "sequence": { + "type": "string", + "format": "uint64", + "description": "sequence is the account's sequence number." + }, + "account_number": { + "type": "string", + "format": "uint64", + "title": "account_number is the account number" + } + }, + "description": "QueryValidatorAccountResponse is the response type for the\nQuery/ValidatorAccount RPC method." + }, + "ethermint.evm.v1.TraceConfig": { + "type": "object", + "properties": { + "tracer": { + "type": "string", + "title": "tracer is a custom javascript tracer" + }, + "timeout": { + "type": "string", + "title": "timeout overrides the default timeout of 5 seconds for JavaScript-based tracing\ncalls" + }, + "reexec": { + "type": "string", + "format": "uint64", + "title": "reexec defines the number of blocks the tracer is willing to go back" + }, + "disable_stack": { + "type": "boolean", + "title": "disable_stack switches stack capture" + }, + "disable_storage": { + "type": "boolean", + "title": "disable_storage switches storage capture" + }, + "debug": { + "type": "boolean", + "title": "debug can be used to print output during capture end" + }, + "limit": { + "type": "integer", + "format": "int32", + "title": "limit defines the maximum length of output, but zero means unlimited" + }, + "overrides": { + "title": "overrides can be used to execute a trace using future fork rules", + "type": "object", + "properties": { + "homestead_block": { + "type": "string", + "title": "homestead_block switch (nil no fork, 0 = already homestead)" + }, + "dao_fork_block": { + "type": "string", + "title": "dao_fork_block corresponds to TheDAO hard-fork switch block (nil no fork)" + }, + "dao_fork_support": { + "type": "boolean", + "title": "dao_fork_support defines whether the nodes supports or opposes the DAO hard-fork" + }, + "eip150_block": { + "type": "string", + "title": "eip150_block: EIP150 implements the Gas price changes\n(https://github.com/ethereum/EIPs/issues/150) EIP150 HF block (nil no fork)" + }, + "eip150_hash": { + "type": "string", + "title": "eip150_hash: EIP150 HF hash (needed for header only clients as only gas pricing changed)" + }, + "eip155_block": { + "type": "string", + "title": "eip155_block: EIP155Block HF block" + }, + "eip158_block": { + "type": "string", + "title": "eip158_block: EIP158 HF block" + }, + "byzantium_block": { + "type": "string", + "title": "byzantium_block: Byzantium switch block (nil no fork, 0 = already on byzantium)" + }, + "constantinople_block": { + "type": "string", + "title": "constantinople_block: Constantinople switch block (nil no fork, 0 = already activated)" + }, + "petersburg_block": { + "type": "string", + "title": "petersburg_block: Petersburg switch block (nil same as Constantinople)" + }, + "istanbul_block": { + "type": "string", + "title": "istanbul_block: Istanbul switch block (nil no fork, 0 = already on istanbul)" + }, + "muir_glacier_block": { + "type": "string", + "title": "muir_glacier_block: Eip-2384 (bomb delay) switch block (nil no fork, 0 = already activated)" + }, + "berlin_block": { + "type": "string", + "title": "berlin_block: Berlin switch block (nil = no fork, 0 = already on berlin)" + }, + "london_block": { + "type": "string", + "title": "london_block: London switch block (nil = no fork, 0 = already on london)" + }, + "arrow_glacier_block": { + "type": "string", + "title": "arrow_glacier_block: Eip-4345 (bomb delay) switch block (nil = no fork, 0 = already activated)" + }, + "gray_glacier_block": { + "type": "string", + "title": "gray_glacier_block: EIP-5133 (bomb delay) switch block (nil = no fork, 0 = already activated)" + }, + "merge_netsplit_block": { + "type": "string", + "title": "merge_netsplit_block: Virtual fork after The Merge to use as a network splitter" + }, + "shanghai_block": { + "type": "string", + "title": "shanghai_block switch block (nil = no fork, 0 = already on shanghai)" + }, + "cancun_block": { + "type": "string", + "title": "cancun_block switch block (nil = no fork, 0 = already on cancun)" + } + }, + "description": "ChainConfig defines the Ethereum ChainConfig parameters using *sdk.Int values\ninstead of *big.Int." + }, + "enable_memory": { + "type": "boolean", + "title": "enable_memory switches memory capture" + }, + "enable_return_data": { + "type": "boolean", + "title": "enable_return_data switches the capture of return data" + }, + "tracer_json_config": { + "type": "string", + "title": "tracer_json_config configures the tracer using a JSON string" + } + }, + "description": "TraceConfig holds extra parameters to trace functions." + }, + "ethermint.feemarket.v1.Params": { + "type": "object", + "properties": { + "no_base_fee": { + "type": "boolean", + "title": "no_base_fee forces the EIP-1559 base fee to 0 (needed for 0 price calls)" + }, + "base_fee_change_denominator": { + "type": "integer", + "format": "int64", + "description": "base_fee_change_denominator bounds the amount the base fee can change\nbetween blocks." + }, + "elasticity_multiplier": { + "type": "integer", + "format": "int64", + "description": "elasticity_multiplier bounds the maximum gas limit an EIP-1559 block may\nhave." + }, + "enable_height": { + "type": "string", + "format": "int64", + "description": "enable_height defines at which block height the base fee calculation is enabled." + }, + "base_fee": { + "type": "string", + "description": "base_fee for EIP-1559 blocks." + }, + "min_gas_price": { + "type": "string", + "title": "min_gas_price defines the minimum gas price value for cosmos and eth transactions" + }, + "min_gas_multiplier": { + "type": "string", + "title": "min_gas_multiplier bounds the minimum gas used to be charged\nto senders based on gas limit" + } + }, + "title": "Params defines the EVM module parameters" + }, + "ethermint.feemarket.v1.QueryBaseFeeResponse": { + "type": "object", + "properties": { + "base_fee": { + "type": "string", + "title": "base_fee is the EIP1559 base fee" + } + }, + "description": "QueryBaseFeeResponse returns the EIP1559 base fee." + }, + "ethermint.feemarket.v1.QueryBlockGasResponse": { + "type": "object", + "properties": { + "gas": { + "type": "string", + "format": "int64", + "title": "gas is the returned block gas" + } + }, + "description": "QueryBlockGasResponse returns block gas used for a given height." + }, + "ethermint.feemarket.v1.QueryParamsResponse": { + "type": "object", + "properties": { + "params": { + "description": "params define the evm module parameters.", + "type": "object", + "properties": { + "no_base_fee": { + "type": "boolean", + "title": "no_base_fee forces the EIP-1559 base fee to 0 (needed for 0 price calls)" + }, + "base_fee_change_denominator": { + "type": "integer", + "format": "int64", + "description": "base_fee_change_denominator bounds the amount the base fee can change\nbetween blocks." + }, + "elasticity_multiplier": { + "type": "integer", + "format": "int64", + "description": "elasticity_multiplier bounds the maximum gas limit an EIP-1559 block may\nhave." + }, + "enable_height": { + "type": "string", + "format": "int64", + "description": "enable_height defines at which block height the base fee calculation is enabled." + }, + "base_fee": { + "type": "string", + "description": "base_fee for EIP-1559 blocks." + }, + "min_gas_price": { + "type": "string", + "title": "min_gas_price defines the minimum gas price value for cosmos and eth transactions" + }, + "min_gas_multiplier": { + "type": "string", + "title": "min_gas_multiplier bounds the minimum gas used to be charged\nto senders based on gas limit" + } + }, + "title": "Params defines the EVM module parameters" + } + }, + "description": "QueryParamsResponse defines the response type for querying x/evm parameters." + }, + "ibc.applications.transfer.v1.DenomTrace": { + "type": "object", + "properties": { + "path": { + "type": "string", + "description": "path defines the chain of port/channel identifiers used for tracing the\nsource of the fungible token." + }, + "base_denom": { + "type": "string", + "description": "base denomination of the relayed fungible token." + } + }, + "description": "DenomTrace contains the base denomination for ICS20 fungible tokens and the\nsource tracing information path." + }, + "ibc.applications.transfer.v1.Params": { + "type": "object", + "properties": { + "send_enabled": { + "type": "boolean", + "description": "send_enabled enables or disables all cross-chain token transfers from this\nchain." + }, + "receive_enabled": { + "type": "boolean", + "description": "receive_enabled enables or disables all cross-chain token transfers to this\nchain." + } + }, + "description": "Params defines the set of IBC transfer parameters.\nNOTE: To prevent a single token from being transferred, set the\nTransfersEnabled parameter to true and then set the bank module's SendEnabled\nparameter for the denomination to false." + }, + "ibc.applications.transfer.v1.QueryDenomHashResponse": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "description": "hash (in hex format) of the denomination trace information." + } + }, + "description": "QueryDenomHashResponse is the response type for the Query/DenomHash RPC\nmethod." + }, + "ibc.applications.transfer.v1.QueryDenomTraceResponse": { + "type": "object", + "properties": { + "denom_trace": { + "type": "object", + "properties": { + "path": { + "type": "string", + "description": "path defines the chain of port/channel identifiers used for tracing the\nsource of the fungible token." + }, + "base_denom": { + "type": "string", + "description": "base denomination of the relayed fungible token." + } + }, + "description": "DenomTrace contains the base denomination for ICS20 fungible tokens and the\nsource tracing information path." + } + }, + "description": "QueryDenomTraceResponse is the response type for the Query/DenomTrace RPC\nmethod." + }, + "ibc.applications.transfer.v1.QueryDenomTracesResponse": { + "type": "object", + "properties": { + "denom_traces": { + "type": "array", + "items": { + "type": "object", + "properties": { + "path": { + "type": "string", + "description": "path defines the chain of port/channel identifiers used for tracing the\nsource of the fungible token." + }, + "base_denom": { + "type": "string", + "description": "base denomination of the relayed fungible token." + } + }, + "description": "DenomTrace contains the base denomination for ICS20 fungible tokens and the\nsource tracing information path." + }, + "description": "denom_traces returns all denominations trace information." + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "description": "QueryConnectionsResponse is the response type for the Query/DenomTraces RPC\nmethod." + }, + "ibc.applications.transfer.v1.QueryEscrowAddressResponse": { + "type": "object", + "properties": { + "escrow_address": { + "type": "string", + "title": "the escrow account address" + } + }, + "description": "QueryEscrowAddressResponse is the response type of the EscrowAddress RPC method." + }, + "ibc.applications.transfer.v1.QueryParamsResponse": { + "type": "object", + "properties": { + "params": { + "description": "params defines the parameters of the module.", + "type": "object", + "properties": { + "send_enabled": { + "type": "boolean", + "description": "send_enabled enables or disables all cross-chain token transfers from this\nchain." + }, + "receive_enabled": { + "type": "boolean", + "description": "receive_enabled enables or disables all cross-chain token transfers to this\nchain." + } + } + } + }, + "description": "QueryParamsResponse is the response type for the Query/Params RPC method." + }, + "ibc.applications.transfer.v1.QueryTotalEscrowForDenomResponse": { + "type": "object", + "properties": { + "amount": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + } + }, + "description": "QueryTotalEscrowForDenomResponse is the response type for TotalEscrowForDenom RPC method." + }, + "ibc.core.client.v1.ConsensusStateWithHeight": { + "type": "object", + "properties": { + "height": { + "title": "consensus state height", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + }, + "consensus_state": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }", + "title": "consensus state" + } + }, + "description": "ConsensusStateWithHeight defines a consensus state with an additional height\nfield." + }, + "ibc.core.client.v1.Height": { + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset", + "title": "Height is a monotonically increasing data type\nthat can be compared against another Height for the purposes of updating and\nfreezing clients" + }, + "ibc.core.client.v1.IdentifiedClientState": { + "type": "object", + "properties": { + "client_id": { + "type": "string", + "title": "client identifier" + }, + "client_state": { + "title": "client state", + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } + }, + "description": "IdentifiedClientState defines a client state with an additional client\nidentifier field." + }, + "ibc.core.client.v1.Params": { + "type": "object", + "properties": { + "allowed_clients": { + "type": "array", + "items": { + "type": "string" + }, + "description": "allowed_clients defines the list of allowed client state types which can be created\nand interacted with. If a client type is removed from the allowed clients list, usage\nof this client will be disabled until it is added again to the list." + } + }, + "description": "Params defines the set of IBC light client parameters." + }, + "ibc.core.client.v1.QueryClientParamsResponse": { + "type": "object", + "properties": { + "params": { + "description": "params defines the parameters of the module.", + "type": "object", + "properties": { + "allowed_clients": { + "type": "array", + "items": { + "type": "string" + }, + "description": "allowed_clients defines the list of allowed client state types which can be created\nand interacted with. If a client type is removed from the allowed clients list, usage\nof this client will be disabled until it is added again to the list." + } + } + } + }, + "description": "QueryClientParamsResponse is the response type for the Query/ClientParams RPC\nmethod." + }, + "ibc.core.client.v1.QueryClientStateResponse": { + "type": "object", + "properties": { + "client_state": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }", + "title": "client state associated with the request identifier" + }, + "proof": { + "type": "string", + "format": "byte", + "title": "merkle proof of existence" + }, + "proof_height": { + "title": "height at which the proof was retrieved", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + } + }, + "description": "QueryClientStateResponse is the response type for the Query/ClientState RPC\nmethod. Besides the client state, it includes a proof and the height from\nwhich the proof was retrieved." + }, + "ibc.core.client.v1.QueryClientStatesResponse": { + "type": "object", + "properties": { + "client_states": { + "type": "array", + "items": { + "type": "object", + "properties": { + "client_id": { + "type": "string", + "title": "client identifier" + }, + "client_state": { + "title": "client state", + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } + }, + "description": "IdentifiedClientState defines a client state with an additional client\nidentifier field." + }, + "description": "list of stored ClientStates of the chain." + }, + "pagination": { + "title": "pagination response", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + }, + "description": "PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }" + } + }, + "description": "QueryClientStatesResponse is the response type for the Query/ClientStates RPC\nmethod." + }, + "ibc.core.client.v1.QueryClientStatusResponse": { + "type": "object", + "properties": { + "status": { + "type": "string" + } + }, + "description": "QueryClientStatusResponse is the response type for the Query/ClientStatus RPC\nmethod. It returns the current status of the IBC client." + }, + "ibc.core.client.v1.QueryConsensusStateHeightsResponse": { + "type": "object", + "properties": { + "consensus_state_heights": { + "type": "array", + "items": { + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset", + "title": "Height is a monotonically increasing data type\nthat can be compared against another Height for the purposes of updating and\nfreezing clients" + }, + "title": "consensus state heights" + }, + "pagination": { + "title": "pagination response", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + }, + "description": "PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }" + } + }, + "title": "QueryConsensusStateHeightsResponse is the response type for the\nQuery/ConsensusStateHeights RPC method" + }, + "ibc.core.client.v1.QueryConsensusStateResponse": { + "type": "object", + "properties": { + "consensus_state": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }", + "title": "consensus state associated with the client identifier at the given height" + }, + "proof": { + "type": "string", + "format": "byte", + "title": "merkle proof of existence" + }, + "proof_height": { + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset", + "title": "Height is a monotonically increasing data type\nthat can be compared against another Height for the purposes of updating and\nfreezing clients" + } + }, + "title": "QueryConsensusStateResponse is the response type for the Query/ConsensusState\nRPC method" + }, + "ibc.core.client.v1.QueryConsensusStatesResponse": { + "type": "object", + "properties": { + "consensus_states": { + "type": "array", + "items": { + "type": "object", + "properties": { + "height": { + "title": "consensus state height", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + }, + "consensus_state": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }", + "title": "consensus state" + } + }, + "description": "ConsensusStateWithHeight defines a consensus state with an additional height\nfield." + }, + "title": "consensus states associated with the identifier" + }, + "pagination": { + "title": "pagination response", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + }, + "description": "PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }" + } + }, + "title": "QueryConsensusStatesResponse is the response type for the\nQuery/ConsensusStates RPC method" + }, + "ibc.core.client.v1.QueryUpgradedClientStateResponse": { + "type": "object", + "properties": { + "upgraded_client_state": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }", + "title": "client state associated with the request identifier" + } + }, + "description": "QueryUpgradedClientStateResponse is the response type for the\nQuery/UpgradedClientState RPC method." + }, + "ibc.core.client.v1.QueryUpgradedConsensusStateResponse": { + "type": "object", + "properties": { + "upgraded_consensus_state": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }", + "title": "Consensus state associated with the request identifier" + } + }, + "description": "QueryUpgradedConsensusStateResponse is the response type for the\nQuery/UpgradedConsensusState RPC method." + }, + "ibc.core.commitment.v1.MerklePrefix": { + "type": "object", + "properties": { + "key_prefix": { + "type": "string", + "format": "byte" + } + }, + "title": "MerklePrefix is merkle path prefixed to the key.\nThe constructed key from the Path and the key will be append(Path.KeyPath,\nappend(Path.KeyPrefix, key...))" + }, + "ibc.core.connection.v1.ConnectionEnd": { + "type": "object", + "properties": { + "client_id": { + "type": "string", + "description": "client associated with this connection." + }, + "versions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "identifier": { + "type": "string", + "title": "unique version identifier" + }, + "features": { + "type": "array", + "items": { + "type": "string" + }, + "title": "list of features compatible with the specified identifier" + } + }, + "description": "Version defines the versioning scheme used to negotiate the IBC version in\nthe connection handshake." + }, + "description": "IBC version which can be utilised to determine encodings or protocols for\nchannels or packets utilising this connection." + }, + "state": { + "description": "current state of the connection end.", + "type": "string", + "enum": [ + "STATE_UNINITIALIZED_UNSPECIFIED", + "STATE_INIT", + "STATE_TRYOPEN", + "STATE_OPEN" + ], + "default": "STATE_UNINITIALIZED_UNSPECIFIED" + }, + "counterparty": { + "description": "counterparty chain associated with this connection.", + "type": "object", + "properties": { + "client_id": { + "type": "string", + "description": "identifies the client on the counterparty chain associated with a given\nconnection." + }, + "connection_id": { + "type": "string", + "description": "identifies the connection end on the counterparty chain associated with a\ngiven connection." + }, + "prefix": { + "description": "commitment merkle prefix of the counterparty chain.", + "type": "object", + "properties": { + "key_prefix": { + "type": "string", + "format": "byte" + } + }, + "title": "MerklePrefix is merkle path prefixed to the key.\nThe constructed key from the Path and the key will be append(Path.KeyPath,\nappend(Path.KeyPrefix, key...))" + } + } + }, + "delay_period": { + "type": "string", + "format": "uint64", + "description": "delay period that must pass before a consensus state can be used for\npacket-verification NOTE: delay period logic is only implemented by some\nclients." + } + }, + "description": "ConnectionEnd defines a stateful object on a chain connected to another\nseparate one.\nNOTE: there must only be 2 defined ConnectionEnds to establish\na connection between two chains." + }, + "ibc.core.connection.v1.Counterparty": { + "type": "object", + "properties": { + "client_id": { + "type": "string", + "description": "identifies the client on the counterparty chain associated with a given\nconnection." + }, + "connection_id": { + "type": "string", + "description": "identifies the connection end on the counterparty chain associated with a\ngiven connection." + }, + "prefix": { + "description": "commitment merkle prefix of the counterparty chain.", + "type": "object", + "properties": { + "key_prefix": { + "type": "string", + "format": "byte" + } + }, + "title": "MerklePrefix is merkle path prefixed to the key.\nThe constructed key from the Path and the key will be append(Path.KeyPath,\nappend(Path.KeyPrefix, key...))" + } + }, + "description": "Counterparty defines the counterparty chain associated with a connection end." + }, + "ibc.core.connection.v1.IdentifiedConnection": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "connection identifier." + }, + "client_id": { + "type": "string", + "description": "client associated with this connection." + }, + "versions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "identifier": { + "type": "string", + "title": "unique version identifier" + }, + "features": { + "type": "array", + "items": { + "type": "string" + }, + "title": "list of features compatible with the specified identifier" + } + }, + "description": "Version defines the versioning scheme used to negotiate the IBC version in\nthe connection handshake." + }, + "title": "IBC version which can be utilised to determine encodings or protocols for\nchannels or packets utilising this connection" + }, + "state": { + "description": "current state of the connection end.", + "type": "string", + "enum": [ + "STATE_UNINITIALIZED_UNSPECIFIED", + "STATE_INIT", + "STATE_TRYOPEN", + "STATE_OPEN" + ], + "default": "STATE_UNINITIALIZED_UNSPECIFIED" + }, + "counterparty": { + "description": "counterparty chain associated with this connection.", + "type": "object", + "properties": { + "client_id": { + "type": "string", + "description": "identifies the client on the counterparty chain associated with a given\nconnection." + }, + "connection_id": { + "type": "string", + "description": "identifies the connection end on the counterparty chain associated with a\ngiven connection." + }, + "prefix": { + "description": "commitment merkle prefix of the counterparty chain.", + "type": "object", + "properties": { + "key_prefix": { + "type": "string", + "format": "byte" + } + }, + "title": "MerklePrefix is merkle path prefixed to the key.\nThe constructed key from the Path and the key will be append(Path.KeyPath,\nappend(Path.KeyPrefix, key...))" + } + } + }, + "delay_period": { + "type": "string", + "format": "uint64", + "description": "delay period associated with this connection." + } + }, + "description": "IdentifiedConnection defines a connection with additional connection\nidentifier field." + }, + "ibc.core.connection.v1.Params": { + "type": "object", + "properties": { + "max_expected_time_per_block": { + "type": "string", + "format": "uint64", + "description": "maximum expected time per block (in nanoseconds), used to enforce block delay. This parameter should reflect the\nlargest amount of time that the chain might reasonably take to produce the next block under normal operating\nconditions. A safe choice is 3-5x the expected time per block." + } + }, + "description": "Params defines the set of Connection parameters." + }, + "ibc.core.connection.v1.QueryClientConnectionsResponse": { + "type": "object", + "properties": { + "connection_paths": { + "type": "array", + "items": { + "type": "string" + }, + "description": "slice of all the connection paths associated with a client." + }, + "proof": { + "type": "string", + "format": "byte", + "title": "merkle proof of existence" + }, + "proof_height": { + "title": "height at which the proof was generated", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + } + }, + "title": "QueryClientConnectionsResponse is the response type for the\nQuery/ClientConnections RPC method" + }, + "ibc.core.connection.v1.QueryConnectionClientStateResponse": { + "type": "object", + "properties": { + "identified_client_state": { + "title": "client state associated with the channel", + "type": "object", + "properties": { + "client_id": { + "type": "string", + "title": "client identifier" + }, + "client_state": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }", + "title": "client state" + } + }, + "description": "IdentifiedClientState defines a client state with an additional client\nidentifier field." + }, + "proof": { + "type": "string", + "format": "byte", + "title": "merkle proof of existence" + }, + "proof_height": { + "title": "height at which the proof was retrieved", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + } + }, + "title": "QueryConnectionClientStateResponse is the response type for the\nQuery/ConnectionClientState RPC method" + }, + "ibc.core.connection.v1.QueryConnectionConsensusStateResponse": { + "type": "object", + "properties": { + "consensus_state": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }", + "title": "consensus state associated with the channel" + }, + "client_id": { + "type": "string", + "title": "client ID associated with the consensus state" + }, + "proof": { + "type": "string", + "format": "byte", + "title": "merkle proof of existence" + }, + "proof_height": { + "title": "height at which the proof was retrieved", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + } + }, + "title": "QueryConnectionConsensusStateResponse is the response type for the\nQuery/ConnectionConsensusState RPC method" + }, + "ibc.core.connection.v1.QueryConnectionParamsResponse": { + "type": "object", + "properties": { + "params": { + "description": "params defines the parameters of the module.", + "type": "object", + "properties": { + "max_expected_time_per_block": { + "type": "string", + "format": "uint64", + "description": "maximum expected time per block (in nanoseconds), used to enforce block delay. This parameter should reflect the\nlargest amount of time that the chain might reasonably take to produce the next block under normal operating\nconditions. A safe choice is 3-5x the expected time per block." + } + } + } + }, + "description": "QueryConnectionParamsResponse is the response type for the Query/ConnectionParams RPC method." + }, + "ibc.core.connection.v1.QueryConnectionResponse": { + "type": "object", + "properties": { + "connection": { + "title": "connection associated with the request identifier", + "type": "object", + "properties": { + "client_id": { + "type": "string", + "description": "client associated with this connection." + }, + "versions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "identifier": { + "type": "string", + "title": "unique version identifier" + }, + "features": { + "type": "array", + "items": { + "type": "string" + }, + "title": "list of features compatible with the specified identifier" + } + }, + "description": "Version defines the versioning scheme used to negotiate the IBC version in\nthe connection handshake." + }, + "description": "IBC version which can be utilised to determine encodings or protocols for\nchannels or packets utilising this connection." + }, + "state": { + "description": "current state of the connection end.", + "type": "string", + "enum": [ + "STATE_UNINITIALIZED_UNSPECIFIED", + "STATE_INIT", + "STATE_TRYOPEN", + "STATE_OPEN" + ], + "default": "STATE_UNINITIALIZED_UNSPECIFIED" + }, + "counterparty": { + "description": "counterparty chain associated with this connection.", + "type": "object", + "properties": { + "client_id": { + "type": "string", + "description": "identifies the client on the counterparty chain associated with a given\nconnection." + }, + "connection_id": { + "type": "string", + "description": "identifies the connection end on the counterparty chain associated with a\ngiven connection." + }, + "prefix": { + "description": "commitment merkle prefix of the counterparty chain.", + "type": "object", + "properties": { + "key_prefix": { + "type": "string", + "format": "byte" + } + }, + "title": "MerklePrefix is merkle path prefixed to the key.\nThe constructed key from the Path and the key will be append(Path.KeyPath,\nappend(Path.KeyPrefix, key...))" + } + } + }, + "delay_period": { + "type": "string", + "format": "uint64", + "description": "delay period that must pass before a consensus state can be used for\npacket-verification NOTE: delay period logic is only implemented by some\nclients." + } + }, + "description": "ConnectionEnd defines a stateful object on a chain connected to another\nseparate one.\nNOTE: there must only be 2 defined ConnectionEnds to establish\na connection between two chains." + }, + "proof": { + "type": "string", + "format": "byte", + "title": "merkle proof of existence" + }, + "proof_height": { + "title": "height at which the proof was retrieved", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + } + }, + "description": "QueryConnectionResponse is the response type for the Query/Connection RPC\nmethod. Besides the connection end, it includes a proof and the height from\nwhich the proof was retrieved." + }, + "ibc.core.connection.v1.QueryConnectionsResponse": { + "type": "object", + "properties": { + "connections": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "connection identifier." + }, + "client_id": { + "type": "string", + "description": "client associated with this connection." + }, + "versions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "identifier": { + "type": "string", + "title": "unique version identifier" + }, + "features": { + "type": "array", + "items": { + "type": "string" + }, + "title": "list of features compatible with the specified identifier" + } + }, + "description": "Version defines the versioning scheme used to negotiate the IBC version in\nthe connection handshake." + }, + "title": "IBC version which can be utilised to determine encodings or protocols for\nchannels or packets utilising this connection" + }, + "state": { + "description": "current state of the connection end.", + "type": "string", + "enum": [ + "STATE_UNINITIALIZED_UNSPECIFIED", + "STATE_INIT", + "STATE_TRYOPEN", + "STATE_OPEN" + ], + "default": "STATE_UNINITIALIZED_UNSPECIFIED" + }, + "counterparty": { + "description": "counterparty chain associated with this connection.", + "type": "object", + "properties": { + "client_id": { + "type": "string", + "description": "identifies the client on the counterparty chain associated with a given\nconnection." + }, + "connection_id": { + "type": "string", + "description": "identifies the connection end on the counterparty chain associated with a\ngiven connection." + }, + "prefix": { + "description": "commitment merkle prefix of the counterparty chain.", + "type": "object", + "properties": { + "key_prefix": { + "type": "string", + "format": "byte" + } + }, + "title": "MerklePrefix is merkle path prefixed to the key.\nThe constructed key from the Path and the key will be append(Path.KeyPath,\nappend(Path.KeyPrefix, key...))" + } + } + }, + "delay_period": { + "type": "string", + "format": "uint64", + "description": "delay period associated with this connection." + } + }, + "description": "IdentifiedConnection defines a connection with additional connection\nidentifier field." + }, + "description": "list of stored connections of the chain." + }, + "pagination": { + "title": "pagination response", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + }, + "description": "PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }" + }, + "height": { + "title": "query block height", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + } + }, + "description": "QueryConnectionsResponse is the response type for the Query/Connections RPC\nmethod." + }, + "ibc.core.connection.v1.State": { + "type": "string", + "enum": [ + "STATE_UNINITIALIZED_UNSPECIFIED", + "STATE_INIT", + "STATE_TRYOPEN", + "STATE_OPEN" + ], + "default": "STATE_UNINITIALIZED_UNSPECIFIED", + "description": "State defines if a connection is in one of the following states:\nINIT, TRYOPEN, OPEN or UNINITIALIZED.\n\n - STATE_UNINITIALIZED_UNSPECIFIED: Default State\n - STATE_INIT: A connection end has just started the opening handshake.\n - STATE_TRYOPEN: A connection end has acknowledged the handshake step on the counterparty\nchain.\n - STATE_OPEN: A connection end has completed the handshake." + }, + "ibc.core.connection.v1.Version": { + "type": "object", + "properties": { + "identifier": { + "type": "string", + "title": "unique version identifier" + }, + "features": { + "type": "array", + "items": { + "type": "string" + }, + "title": "list of features compatible with the specified identifier" + } + }, + "description": "Version defines the versioning scheme used to negotiate the IBC version in\nthe connection handshake." + }, + "ibc.core.channel.v1.Channel": { + "type": "object", + "properties": { + "state": { + "title": "current state of the channel end", + "type": "string", + "enum": [ + "STATE_UNINITIALIZED_UNSPECIFIED", + "STATE_INIT", + "STATE_TRYOPEN", + "STATE_OPEN", + "STATE_CLOSED", + "STATE_FLUSHING", + "STATE_FLUSHCOMPLETE" + ], + "default": "STATE_UNINITIALIZED_UNSPECIFIED", + "description": "State defines if a channel is in one of the following states:\nCLOSED, INIT, TRYOPEN, OPEN, FLUSHING, FLUSHCOMPLETE or UNINITIALIZED.\n\n - STATE_UNINITIALIZED_UNSPECIFIED: Default State\n - STATE_INIT: A channel has just started the opening handshake.\n - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain.\n - STATE_OPEN: A channel has completed the handshake. Open channels are\nready to send and receive packets.\n - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive\npackets.\n - STATE_FLUSHING: A channel has just accepted the upgrade handshake attempt and is flushing in-flight packets.\n - STATE_FLUSHCOMPLETE: A channel has just completed flushing any in-flight packets." + }, + "ordering": { + "title": "whether the channel is ordered or unordered", + "type": "string", + "enum": [ + "ORDER_NONE_UNSPECIFIED", + "ORDER_UNORDERED", + "ORDER_ORDERED" + ], + "default": "ORDER_NONE_UNSPECIFIED", + "description": "- ORDER_NONE_UNSPECIFIED: zero-value for channel ordering\n - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in\nwhich they were sent.\n - ORDER_ORDERED: packets are delivered exactly in the order which they were sent" + }, + "counterparty": { + "title": "counterparty channel end", + "type": "object", + "properties": { + "port_id": { + "type": "string", + "description": "port on the counterparty chain which owns the other end of the channel." + }, + "channel_id": { + "type": "string", + "title": "channel end on the counterparty chain" + } + } + }, + "connection_hops": { + "type": "array", + "items": { + "type": "string" + }, + "title": "list of connection identifiers, in order, along which packets sent on\nthis channel will travel" + }, + "version": { + "type": "string", + "title": "opaque channel version, which is agreed upon during the handshake" + }, + "upgrade_sequence": { + "type": "string", + "format": "uint64", + "title": "upgrade sequence indicates the latest upgrade attempt performed by this channel\nthe value of 0 indicates the channel has never been upgraded" + } + }, + "description": "Channel defines pipeline for exactly-once packet delivery between specific\nmodules on separate blockchains, which has at least one end capable of\nsending packets and one end capable of receiving packets." + }, + "ibc.core.channel.v1.Counterparty": { + "type": "object", + "properties": { + "port_id": { + "type": "string", + "description": "port on the counterparty chain which owns the other end of the channel." + }, + "channel_id": { + "type": "string", + "title": "channel end on the counterparty chain" + } + }, + "title": "Counterparty defines a channel end counterparty" + }, + "ibc.core.channel.v1.ErrorReceipt": { + "type": "object", + "properties": { + "sequence": { + "type": "string", + "format": "uint64", + "title": "the channel upgrade sequence" + }, + "message": { + "type": "string", + "title": "the error message detailing the cause of failure" + } + }, + "description": "ErrorReceipt defines a type which encapsulates the upgrade sequence and error associated with the\nupgrade handshake failure. When a channel upgrade handshake is aborted both chains are expected to increment to the\nnext sequence." + }, + "ibc.core.channel.v1.IdentifiedChannel": { + "type": "object", + "properties": { + "state": { + "title": "current state of the channel end", + "type": "string", + "enum": [ + "STATE_UNINITIALIZED_UNSPECIFIED", + "STATE_INIT", + "STATE_TRYOPEN", + "STATE_OPEN", + "STATE_CLOSED", + "STATE_FLUSHING", + "STATE_FLUSHCOMPLETE" + ], + "default": "STATE_UNINITIALIZED_UNSPECIFIED", + "description": "State defines if a channel is in one of the following states:\nCLOSED, INIT, TRYOPEN, OPEN, FLUSHING, FLUSHCOMPLETE or UNINITIALIZED.\n\n - STATE_UNINITIALIZED_UNSPECIFIED: Default State\n - STATE_INIT: A channel has just started the opening handshake.\n - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain.\n - STATE_OPEN: A channel has completed the handshake. Open channels are\nready to send and receive packets.\n - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive\npackets.\n - STATE_FLUSHING: A channel has just accepted the upgrade handshake attempt and is flushing in-flight packets.\n - STATE_FLUSHCOMPLETE: A channel has just completed flushing any in-flight packets." + }, + "ordering": { + "title": "whether the channel is ordered or unordered", + "type": "string", + "enum": [ + "ORDER_NONE_UNSPECIFIED", + "ORDER_UNORDERED", + "ORDER_ORDERED" + ], + "default": "ORDER_NONE_UNSPECIFIED", + "description": "- ORDER_NONE_UNSPECIFIED: zero-value for channel ordering\n - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in\nwhich they were sent.\n - ORDER_ORDERED: packets are delivered exactly in the order which they were sent" + }, + "counterparty": { + "title": "counterparty channel end", + "type": "object", + "properties": { + "port_id": { + "type": "string", + "description": "port on the counterparty chain which owns the other end of the channel." + }, + "channel_id": { + "type": "string", + "title": "channel end on the counterparty chain" + } + } + }, + "connection_hops": { + "type": "array", + "items": { + "type": "string" + }, + "title": "list of connection identifiers, in order, along which packets sent on\nthis channel will travel" + }, + "version": { + "type": "string", + "title": "opaque channel version, which is agreed upon during the handshake" + }, + "port_id": { + "type": "string", + "title": "port identifier" + }, + "channel_id": { + "type": "string", + "title": "channel identifier" + }, + "upgrade_sequence": { + "type": "string", + "format": "uint64", + "title": "upgrade sequence indicates the latest upgrade attempt performed by this channel\nthe value of 0 indicates the channel has never been upgraded" + } + }, + "description": "IdentifiedChannel defines a channel with additional port and channel\nidentifier fields." + }, + "ibc.core.channel.v1.Order": { + "type": "string", + "enum": [ + "ORDER_NONE_UNSPECIFIED", + "ORDER_UNORDERED", + "ORDER_ORDERED" + ], + "default": "ORDER_NONE_UNSPECIFIED", + "description": "- ORDER_NONE_UNSPECIFIED: zero-value for channel ordering\n - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in\nwhich they were sent.\n - ORDER_ORDERED: packets are delivered exactly in the order which they were sent", + "title": "Order defines if a channel is ORDERED or UNORDERED" + }, + "ibc.core.channel.v1.PacketState": { + "type": "object", + "properties": { + "port_id": { + "type": "string", + "description": "channel port identifier." + }, + "channel_id": { + "type": "string", + "description": "channel unique identifier." + }, + "sequence": { + "type": "string", + "format": "uint64", + "description": "packet sequence." + }, + "data": { + "type": "string", + "format": "byte", + "description": "embedded data that represents packet state." + } + }, + "description": "PacketState defines the generic type necessary to retrieve and store\npacket commitments, acknowledgements, and receipts.\nCaller is responsible for knowing the context necessary to interpret this\nstate as a commitment, acknowledgement, or a receipt." + }, + "ibc.core.channel.v1.Params": { + "type": "object", + "properties": { + "upgrade_timeout": { + "type": "object", + "properties": { + "height": { + "title": "block height after which the packet or upgrade times out", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + }, + "timestamp": { + "type": "string", + "format": "uint64", + "title": "block timestamp (in nanoseconds) after which the packet or upgrade times out" + } + }, + "description": "Timeout defines an execution deadline structure for 04-channel handlers.\nThis includes packet lifecycle handlers as well as the upgrade handshake handlers.\nA valid Timeout contains either one or both of a timestamp and block height (sequence)." + } + }, + "description": "Params defines the set of IBC channel parameters." + }, + "ibc.core.channel.v1.QueryChannelClientStateResponse": { + "type": "object", + "properties": { + "identified_client_state": { + "title": "client state associated with the channel", + "type": "object", + "properties": { + "client_id": { + "type": "string", + "title": "client identifier" + }, + "client_state": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }", + "title": "client state" + } + }, + "description": "IdentifiedClientState defines a client state with an additional client\nidentifier field." + }, + "proof": { + "type": "string", + "format": "byte", + "title": "merkle proof of existence" + }, + "proof_height": { + "title": "height at which the proof was retrieved", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + } + }, + "title": "QueryChannelClientStateResponse is the Response type for the\nQuery/QueryChannelClientState RPC method" + }, + "ibc.core.channel.v1.QueryChannelConsensusStateResponse": { + "type": "object", + "properties": { + "consensus_state": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }", + "title": "consensus state associated with the channel" + }, + "client_id": { + "type": "string", + "title": "client ID associated with the consensus state" + }, + "proof": { + "type": "string", + "format": "byte", + "title": "merkle proof of existence" + }, + "proof_height": { + "title": "height at which the proof was retrieved", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + } + }, + "title": "QueryChannelClientStateResponse is the Response type for the\nQuery/QueryChannelClientState RPC method" + }, + "ibc.core.channel.v1.QueryChannelParamsResponse": { + "type": "object", + "properties": { + "params": { + "description": "params defines the parameters of the module.", + "type": "object", + "properties": { + "upgrade_timeout": { + "type": "object", + "properties": { + "height": { + "title": "block height after which the packet or upgrade times out", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + }, + "timestamp": { + "type": "string", + "format": "uint64", + "title": "block timestamp (in nanoseconds) after which the packet or upgrade times out" + } + }, + "description": "Timeout defines an execution deadline structure for 04-channel handlers.\nThis includes packet lifecycle handlers as well as the upgrade handshake handlers.\nA valid Timeout contains either one or both of a timestamp and block height (sequence)." + } + } + } + }, + "description": "QueryChannelParamsResponse is the response type for the Query/ChannelParams RPC method." + }, + "ibc.core.channel.v1.QueryChannelResponse": { + "type": "object", + "properties": { + "channel": { + "title": "channel associated with the request identifiers", + "type": "object", + "properties": { + "state": { + "title": "current state of the channel end", + "type": "string", + "enum": [ + "STATE_UNINITIALIZED_UNSPECIFIED", + "STATE_INIT", + "STATE_TRYOPEN", + "STATE_OPEN", + "STATE_CLOSED", + "STATE_FLUSHING", + "STATE_FLUSHCOMPLETE" + ], + "default": "STATE_UNINITIALIZED_UNSPECIFIED", + "description": "State defines if a channel is in one of the following states:\nCLOSED, INIT, TRYOPEN, OPEN, FLUSHING, FLUSHCOMPLETE or UNINITIALIZED.\n\n - STATE_UNINITIALIZED_UNSPECIFIED: Default State\n - STATE_INIT: A channel has just started the opening handshake.\n - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain.\n - STATE_OPEN: A channel has completed the handshake. Open channels are\nready to send and receive packets.\n - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive\npackets.\n - STATE_FLUSHING: A channel has just accepted the upgrade handshake attempt and is flushing in-flight packets.\n - STATE_FLUSHCOMPLETE: A channel has just completed flushing any in-flight packets." + }, + "ordering": { + "title": "whether the channel is ordered or unordered", + "type": "string", + "enum": [ + "ORDER_NONE_UNSPECIFIED", + "ORDER_UNORDERED", + "ORDER_ORDERED" + ], + "default": "ORDER_NONE_UNSPECIFIED", + "description": "- ORDER_NONE_UNSPECIFIED: zero-value for channel ordering\n - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in\nwhich they were sent.\n - ORDER_ORDERED: packets are delivered exactly in the order which they were sent" + }, + "counterparty": { + "title": "counterparty channel end", + "type": "object", + "properties": { + "port_id": { + "type": "string", + "description": "port on the counterparty chain which owns the other end of the channel." + }, + "channel_id": { + "type": "string", + "title": "channel end on the counterparty chain" + } + } + }, + "connection_hops": { + "type": "array", + "items": { + "type": "string" + }, + "title": "list of connection identifiers, in order, along which packets sent on\nthis channel will travel" + }, + "version": { + "type": "string", + "title": "opaque channel version, which is agreed upon during the handshake" + }, + "upgrade_sequence": { + "type": "string", + "format": "uint64", + "title": "upgrade sequence indicates the latest upgrade attempt performed by this channel\nthe value of 0 indicates the channel has never been upgraded" + } + }, + "description": "Channel defines pipeline for exactly-once packet delivery between specific\nmodules on separate blockchains, which has at least one end capable of\nsending packets and one end capable of receiving packets." + }, + "proof": { + "type": "string", + "format": "byte", + "title": "merkle proof of existence" + }, + "proof_height": { + "title": "height at which the proof was retrieved", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + } + }, + "description": "QueryChannelResponse is the response type for the Query/Channel RPC method.\nBesides the Channel end, it includes a proof and the height from which the\nproof was retrieved." + }, + "ibc.core.channel.v1.QueryChannelsResponse": { + "type": "object", + "properties": { + "channels": { + "type": "array", + "items": { + "type": "object", + "properties": { + "state": { + "title": "current state of the channel end", + "type": "string", + "enum": [ + "STATE_UNINITIALIZED_UNSPECIFIED", + "STATE_INIT", + "STATE_TRYOPEN", + "STATE_OPEN", + "STATE_CLOSED", + "STATE_FLUSHING", + "STATE_FLUSHCOMPLETE" + ], + "default": "STATE_UNINITIALIZED_UNSPECIFIED", + "description": "State defines if a channel is in one of the following states:\nCLOSED, INIT, TRYOPEN, OPEN, FLUSHING, FLUSHCOMPLETE or UNINITIALIZED.\n\n - STATE_UNINITIALIZED_UNSPECIFIED: Default State\n - STATE_INIT: A channel has just started the opening handshake.\n - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain.\n - STATE_OPEN: A channel has completed the handshake. Open channels are\nready to send and receive packets.\n - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive\npackets.\n - STATE_FLUSHING: A channel has just accepted the upgrade handshake attempt and is flushing in-flight packets.\n - STATE_FLUSHCOMPLETE: A channel has just completed flushing any in-flight packets." + }, + "ordering": { + "title": "whether the channel is ordered or unordered", + "type": "string", + "enum": [ + "ORDER_NONE_UNSPECIFIED", + "ORDER_UNORDERED", + "ORDER_ORDERED" + ], + "default": "ORDER_NONE_UNSPECIFIED", + "description": "- ORDER_NONE_UNSPECIFIED: zero-value for channel ordering\n - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in\nwhich they were sent.\n - ORDER_ORDERED: packets are delivered exactly in the order which they were sent" + }, + "counterparty": { + "title": "counterparty channel end", + "type": "object", + "properties": { + "port_id": { + "type": "string", + "description": "port on the counterparty chain which owns the other end of the channel." + }, + "channel_id": { + "type": "string", + "title": "channel end on the counterparty chain" + } + } + }, + "connection_hops": { + "type": "array", + "items": { + "type": "string" + }, + "title": "list of connection identifiers, in order, along which packets sent on\nthis channel will travel" + }, + "version": { + "type": "string", + "title": "opaque channel version, which is agreed upon during the handshake" + }, + "port_id": { + "type": "string", + "title": "port identifier" + }, + "channel_id": { + "type": "string", + "title": "channel identifier" + }, + "upgrade_sequence": { + "type": "string", + "format": "uint64", + "title": "upgrade sequence indicates the latest upgrade attempt performed by this channel\nthe value of 0 indicates the channel has never been upgraded" + } + }, + "description": "IdentifiedChannel defines a channel with additional port and channel\nidentifier fields." + }, + "description": "list of stored channels of the chain." + }, + "pagination": { + "title": "pagination response", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + }, + "description": "PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }" + }, + "height": { + "title": "query block height", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + } + }, + "description": "QueryChannelsResponse is the response type for the Query/Channels RPC method." + }, + "ibc.core.channel.v1.QueryConnectionChannelsResponse": { + "type": "object", + "properties": { + "channels": { + "type": "array", + "items": { + "type": "object", + "properties": { + "state": { + "title": "current state of the channel end", + "type": "string", + "enum": [ + "STATE_UNINITIALIZED_UNSPECIFIED", + "STATE_INIT", + "STATE_TRYOPEN", + "STATE_OPEN", + "STATE_CLOSED", + "STATE_FLUSHING", + "STATE_FLUSHCOMPLETE" + ], + "default": "STATE_UNINITIALIZED_UNSPECIFIED", + "description": "State defines if a channel is in one of the following states:\nCLOSED, INIT, TRYOPEN, OPEN, FLUSHING, FLUSHCOMPLETE or UNINITIALIZED.\n\n - STATE_UNINITIALIZED_UNSPECIFIED: Default State\n - STATE_INIT: A channel has just started the opening handshake.\n - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain.\n - STATE_OPEN: A channel has completed the handshake. Open channels are\nready to send and receive packets.\n - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive\npackets.\n - STATE_FLUSHING: A channel has just accepted the upgrade handshake attempt and is flushing in-flight packets.\n - STATE_FLUSHCOMPLETE: A channel has just completed flushing any in-flight packets." + }, + "ordering": { + "title": "whether the channel is ordered or unordered", + "type": "string", + "enum": [ + "ORDER_NONE_UNSPECIFIED", + "ORDER_UNORDERED", + "ORDER_ORDERED" + ], + "default": "ORDER_NONE_UNSPECIFIED", + "description": "- ORDER_NONE_UNSPECIFIED: zero-value for channel ordering\n - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in\nwhich they were sent.\n - ORDER_ORDERED: packets are delivered exactly in the order which they were sent" + }, + "counterparty": { + "title": "counterparty channel end", + "type": "object", + "properties": { + "port_id": { + "type": "string", + "description": "port on the counterparty chain which owns the other end of the channel." + }, + "channel_id": { + "type": "string", + "title": "channel end on the counterparty chain" + } + } + }, + "connection_hops": { + "type": "array", + "items": { + "type": "string" + }, + "title": "list of connection identifiers, in order, along which packets sent on\nthis channel will travel" + }, + "version": { + "type": "string", + "title": "opaque channel version, which is agreed upon during the handshake" + }, + "port_id": { + "type": "string", + "title": "port identifier" + }, + "channel_id": { + "type": "string", + "title": "channel identifier" + }, + "upgrade_sequence": { + "type": "string", + "format": "uint64", + "title": "upgrade sequence indicates the latest upgrade attempt performed by this channel\nthe value of 0 indicates the channel has never been upgraded" + } + }, + "description": "IdentifiedChannel defines a channel with additional port and channel\nidentifier fields." + }, + "description": "list of channels associated with a connection." + }, + "pagination": { + "title": "pagination response", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + }, + "description": "PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }" + }, + "height": { + "title": "query block height", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + } + }, + "title": "QueryConnectionChannelsResponse is the Response type for the\nQuery/QueryConnectionChannels RPC method" + }, + "ibc.core.channel.v1.QueryNextSequenceReceiveResponse": { + "type": "object", + "properties": { + "next_sequence_receive": { + "type": "string", + "format": "uint64", + "title": "next sequence receive number" + }, + "proof": { + "type": "string", + "format": "byte", + "title": "merkle proof of existence" + }, + "proof_height": { + "title": "height at which the proof was retrieved", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + } + }, + "title": "QuerySequenceResponse is the response type for the\nQuery/QueryNextSequenceReceiveResponse RPC method" + }, + "ibc.core.channel.v1.QueryNextSequenceSendResponse": { + "type": "object", + "properties": { + "next_sequence_send": { + "type": "string", + "format": "uint64", + "title": "next sequence send number" + }, + "proof": { + "type": "string", + "format": "byte", + "title": "merkle proof of existence" + }, + "proof_height": { + "title": "height at which the proof was retrieved", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + } + }, + "title": "QueryNextSequenceSendResponse is the request type for the\nQuery/QueryNextSequenceSend RPC method" + }, + "ibc.core.channel.v1.QueryPacketAcknowledgementResponse": { + "type": "object", + "properties": { + "acknowledgement": { + "type": "string", + "format": "byte", + "title": "packet associated with the request fields" + }, + "proof": { + "type": "string", + "format": "byte", + "title": "merkle proof of existence" + }, + "proof_height": { + "title": "height at which the proof was retrieved", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + } + }, + "title": "QueryPacketAcknowledgementResponse defines the client query response for a\npacket which also includes a proof and the height from which the\nproof was retrieved" + }, + "ibc.core.channel.v1.QueryPacketAcknowledgementsResponse": { + "type": "object", + "properties": { + "acknowledgements": { + "type": "array", + "items": { + "type": "object", + "properties": { + "port_id": { + "type": "string", + "description": "channel port identifier." + }, + "channel_id": { + "type": "string", + "description": "channel unique identifier." + }, + "sequence": { + "type": "string", + "format": "uint64", + "description": "packet sequence." + }, + "data": { + "type": "string", + "format": "byte", + "description": "embedded data that represents packet state." + } + }, + "description": "PacketState defines the generic type necessary to retrieve and store\npacket commitments, acknowledgements, and receipts.\nCaller is responsible for knowing the context necessary to interpret this\nstate as a commitment, acknowledgement, or a receipt." + } + }, + "pagination": { + "title": "pagination response", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + }, + "description": "PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }" + }, + "height": { + "title": "query block height", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + } + }, + "title": "QueryPacketAcknowledgemetsResponse is the request type for the\nQuery/QueryPacketAcknowledgements RPC method" + }, + "ibc.core.channel.v1.QueryPacketCommitmentResponse": { + "type": "object", + "properties": { + "commitment": { + "type": "string", + "format": "byte", + "title": "packet associated with the request fields" + }, + "proof": { + "type": "string", + "format": "byte", + "title": "merkle proof of existence" + }, + "proof_height": { + "title": "height at which the proof was retrieved", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + } + }, + "title": "QueryPacketCommitmentResponse defines the client query response for a packet\nwhich also includes a proof and the height from which the proof was\nretrieved" + }, + "ibc.core.channel.v1.QueryPacketCommitmentsResponse": { + "type": "object", + "properties": { + "commitments": { + "type": "array", + "items": { + "type": "object", + "properties": { + "port_id": { + "type": "string", + "description": "channel port identifier." + }, + "channel_id": { + "type": "string", + "description": "channel unique identifier." + }, + "sequence": { + "type": "string", + "format": "uint64", + "description": "packet sequence." + }, + "data": { + "type": "string", + "format": "byte", + "description": "embedded data that represents packet state." + } + }, + "description": "PacketState defines the generic type necessary to retrieve and store\npacket commitments, acknowledgements, and receipts.\nCaller is responsible for knowing the context necessary to interpret this\nstate as a commitment, acknowledgement, or a receipt." + } + }, + "pagination": { + "title": "pagination response", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + }, + "description": "PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }" + }, + "height": { + "title": "query block height", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + } + }, + "title": "QueryPacketCommitmentsResponse is the request type for the\nQuery/QueryPacketCommitments RPC method" + }, + "ibc.core.channel.v1.QueryPacketReceiptResponse": { + "type": "object", + "properties": { + "received": { + "type": "boolean", + "title": "success flag for if receipt exists" + }, + "proof": { + "type": "string", + "format": "byte", + "title": "merkle proof of existence" + }, + "proof_height": { + "title": "height at which the proof was retrieved", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + } + }, + "title": "QueryPacketReceiptResponse defines the client query response for a packet\nreceipt which also includes a proof, and the height from which the proof was\nretrieved" + }, + "ibc.core.channel.v1.QueryUnreceivedAcksResponse": { + "type": "object", + "properties": { + "sequences": { + "type": "array", + "items": { + "type": "string", + "format": "uint64" + }, + "title": "list of unreceived acknowledgement sequences" + }, + "height": { + "title": "query block height", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + } + }, + "title": "QueryUnreceivedAcksResponse is the response type for the\nQuery/UnreceivedAcks RPC method" + }, + "ibc.core.channel.v1.QueryUnreceivedPacketsResponse": { + "type": "object", + "properties": { + "sequences": { + "type": "array", + "items": { + "type": "string", + "format": "uint64" + }, + "title": "list of unreceived packet sequences" + }, + "height": { + "title": "query block height", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + } + }, + "title": "QueryUnreceivedPacketsResponse is the response type for the\nQuery/UnreceivedPacketCommitments RPC method" + }, + "ibc.core.channel.v1.QueryUpgradeErrorResponse": { + "type": "object", + "properties": { + "error_receipt": { + "type": "object", + "properties": { + "sequence": { + "type": "string", + "format": "uint64", + "title": "the channel upgrade sequence" + }, + "message": { + "type": "string", + "title": "the error message detailing the cause of failure" + } + }, + "description": "ErrorReceipt defines a type which encapsulates the upgrade sequence and error associated with the\nupgrade handshake failure. When a channel upgrade handshake is aborted both chains are expected to increment to the\nnext sequence." + }, + "proof": { + "type": "string", + "format": "byte", + "title": "merkle proof of existence" + }, + "proof_height": { + "title": "height at which the proof was retrieved", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + } + }, + "title": "QueryUpgradeErrorResponse is the response type for the Query/QueryUpgradeError RPC method" + }, + "ibc.core.channel.v1.QueryUpgradeResponse": { + "type": "object", + "properties": { + "upgrade": { + "type": "object", + "properties": { + "fields": { + "type": "object", + "properties": { + "ordering": { + "type": "string", + "enum": [ + "ORDER_NONE_UNSPECIFIED", + "ORDER_UNORDERED", + "ORDER_ORDERED" + ], + "default": "ORDER_NONE_UNSPECIFIED", + "description": "- ORDER_NONE_UNSPECIFIED: zero-value for channel ordering\n - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in\nwhich they were sent.\n - ORDER_ORDERED: packets are delivered exactly in the order which they were sent", + "title": "Order defines if a channel is ORDERED or UNORDERED" + }, + "connection_hops": { + "type": "array", + "items": { + "type": "string" + } + }, + "version": { + "type": "string" + } + }, + "description": "UpgradeFields are the fields in a channel end which may be changed\nduring a channel upgrade." + }, + "timeout": { + "type": "object", + "properties": { + "height": { + "title": "block height after which the packet or upgrade times out", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + }, + "timestamp": { + "type": "string", + "format": "uint64", + "title": "block timestamp (in nanoseconds) after which the packet or upgrade times out" + } + }, + "description": "Timeout defines an execution deadline structure for 04-channel handlers.\nThis includes packet lifecycle handlers as well as the upgrade handshake handlers.\nA valid Timeout contains either one or both of a timestamp and block height (sequence)." + }, + "next_sequence_send": { + "type": "string", + "format": "uint64" + } + }, + "description": "Upgrade is a verifiable type which contains the relevant information\nfor an attempted upgrade. It provides the proposed changes to the channel\nend, the timeout for this upgrade attempt and the next packet sequence\nwhich allows the counterparty to efficiently know the highest sequence it has received.\nThe next sequence send is used for pruning and upgrading from unordered to ordered channels." + }, + "proof": { + "type": "string", + "format": "byte", + "title": "merkle proof of existence" + }, + "proof_height": { + "title": "height at which the proof was retrieved", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + } + }, + "title": "QueryUpgradeResponse is the response type for the QueryUpgradeResponse RPC method" + }, + "ibc.core.channel.v1.State": { + "type": "string", + "enum": [ + "STATE_UNINITIALIZED_UNSPECIFIED", + "STATE_INIT", + "STATE_TRYOPEN", + "STATE_OPEN", + "STATE_CLOSED", + "STATE_FLUSHING", + "STATE_FLUSHCOMPLETE" + ], + "default": "STATE_UNINITIALIZED_UNSPECIFIED", + "description": "State defines if a channel is in one of the following states:\nCLOSED, INIT, TRYOPEN, OPEN, FLUSHING, FLUSHCOMPLETE or UNINITIALIZED.\n\n - STATE_UNINITIALIZED_UNSPECIFIED: Default State\n - STATE_INIT: A channel has just started the opening handshake.\n - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain.\n - STATE_OPEN: A channel has completed the handshake. Open channels are\nready to send and receive packets.\n - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive\npackets.\n - STATE_FLUSHING: A channel has just accepted the upgrade handshake attempt and is flushing in-flight packets.\n - STATE_FLUSHCOMPLETE: A channel has just completed flushing any in-flight packets." + }, + "ibc.core.channel.v1.Timeout": { + "type": "object", + "properties": { + "height": { + "title": "block height after which the packet or upgrade times out", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + }, + "timestamp": { + "type": "string", + "format": "uint64", + "title": "block timestamp (in nanoseconds) after which the packet or upgrade times out" + } + }, + "description": "Timeout defines an execution deadline structure for 04-channel handlers.\nThis includes packet lifecycle handlers as well as the upgrade handshake handlers.\nA valid Timeout contains either one or both of a timestamp and block height (sequence)." + }, + "ibc.core.channel.v1.Upgrade": { + "type": "object", + "properties": { + "fields": { + "type": "object", + "properties": { + "ordering": { + "type": "string", + "enum": [ + "ORDER_NONE_UNSPECIFIED", + "ORDER_UNORDERED", + "ORDER_ORDERED" + ], + "default": "ORDER_NONE_UNSPECIFIED", + "description": "- ORDER_NONE_UNSPECIFIED: zero-value for channel ordering\n - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in\nwhich they were sent.\n - ORDER_ORDERED: packets are delivered exactly in the order which they were sent", + "title": "Order defines if a channel is ORDERED or UNORDERED" + }, + "connection_hops": { + "type": "array", + "items": { + "type": "string" + } + }, + "version": { + "type": "string" + } + }, + "description": "UpgradeFields are the fields in a channel end which may be changed\nduring a channel upgrade." + }, + "timeout": { + "type": "object", + "properties": { + "height": { + "title": "block height after which the packet or upgrade times out", + "type": "object", + "properties": { + "revision_number": { + "type": "string", + "format": "uint64", + "title": "the revision that the client is currently on" + }, + "revision_height": { + "type": "string", + "format": "uint64", + "title": "the height within the given revision" + } + }, + "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" + }, + "timestamp": { + "type": "string", + "format": "uint64", + "title": "block timestamp (in nanoseconds) after which the packet or upgrade times out" + } + }, + "description": "Timeout defines an execution deadline structure for 04-channel handlers.\nThis includes packet lifecycle handlers as well as the upgrade handshake handlers.\nA valid Timeout contains either one or both of a timestamp and block height (sequence)." + }, + "next_sequence_send": { + "type": "string", + "format": "uint64" + } + }, + "description": "Upgrade is a verifiable type which contains the relevant information\nfor an attempted upgrade. It provides the proposed changes to the channel\nend, the timeout for this upgrade attempt and the next packet sequence\nwhich allows the counterparty to efficiently know the highest sequence it has received.\nThe next sequence send is used for pruning and upgrading from unordered to ordered channels." + }, + "ibc.core.channel.v1.UpgradeFields": { + "type": "object", + "properties": { + "ordering": { + "type": "string", + "enum": [ + "ORDER_NONE_UNSPECIFIED", + "ORDER_UNORDERED", + "ORDER_ORDERED" + ], + "default": "ORDER_NONE_UNSPECIFIED", + "description": "- ORDER_NONE_UNSPECIFIED: zero-value for channel ordering\n - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in\nwhich they were sent.\n - ORDER_ORDERED: packets are delivered exactly in the order which they were sent", + "title": "Order defines if a channel is ORDERED or UNORDERED" + }, + "connection_hops": { + "type": "array", + "items": { + "type": "string" + } + }, + "version": { + "type": "string" + } + }, + "description": "UpgradeFields are the fields in a channel end which may be changed\nduring a channel upgrade." + }, + "cosmos.auth.v1beta1.AddressBytesToStringResponse": { + "type": "object", + "properties": { + "address_string": { + "type": "string" + } + }, + "description": "AddressBytesToStringResponse is the response type for AddressString rpc method.\n\nSince: cosmos-sdk 0.46" + }, + "cosmos.auth.v1beta1.AddressStringToBytesResponse": { + "type": "object", + "properties": { + "address_bytes": { + "type": "string", + "format": "byte" + } + }, + "description": "AddressStringToBytesResponse is the response type for AddressBytes rpc method.\n\nSince: cosmos-sdk 0.46" + }, + "cosmos.auth.v1beta1.BaseAccount": { + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "pub_key": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "account_number": { + "type": "string", + "format": "uint64" + }, + "sequence": { + "type": "string", + "format": "uint64" + } + }, + "description": "BaseAccount defines a base account type. It contains all the necessary fields\nfor basic account functionality. Any custom account type should extend this\ntype for additional functionality (e.g. vesting)." + }, + "cosmos.auth.v1beta1.Bech32PrefixResponse": { + "type": "object", + "properties": { + "bech32_prefix": { + "type": "string" + } + }, + "description": "Bech32PrefixResponse is the response type for Bech32Prefix rpc method.\n\nSince: cosmos-sdk 0.46" + }, + "cosmos.auth.v1beta1.Params": { + "type": "object", + "properties": { + "max_memo_characters": { + "type": "string", + "format": "uint64" + }, + "tx_sig_limit": { + "type": "string", + "format": "uint64" + }, + "tx_size_cost_per_byte": { + "type": "string", + "format": "uint64" + }, + "sig_verify_cost_ed25519": { + "type": "string", + "format": "uint64" + }, + "sig_verify_cost_secp256k1": { + "type": "string", + "format": "uint64" + } + }, + "description": "Params defines the parameters for the auth module." + }, + "cosmos.auth.v1beta1.QueryAccountAddressByIDResponse": { + "type": "object", + "properties": { + "account_address": { + "type": "string" + } + }, + "description": "Since: cosmos-sdk 0.46.2", + "title": "QueryAccountAddressByIDResponse is the response type for AccountAddressByID rpc method" + }, + "cosmos.auth.v1beta1.QueryAccountInfoResponse": { + "type": "object", + "properties": { + "info": { + "description": "info is the account info which is represented by BaseAccount.", + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "pub_key": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "account_number": { + "type": "string", + "format": "uint64" + }, + "sequence": { + "type": "string", + "format": "uint64" + } + } + } + }, + "description": "QueryAccountInfoResponse is the Query/AccountInfo response type.\n\nSince: cosmos-sdk 0.47" + }, + "cosmos.auth.v1beta1.QueryAccountResponse": { + "type": "object", + "properties": { + "account": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } + }, + "description": "QueryAccountResponse is the response type for the Query/Account RPC method." + }, + "cosmos.auth.v1beta1.QueryAccountsResponse": { + "type": "object", + "properties": { + "accounts": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "title": "accounts are the existing accounts" + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "description": "QueryAccountsResponse is the response type for the Query/Accounts RPC method.\n\nSince: cosmos-sdk 0.43" + }, + "cosmos.auth.v1beta1.QueryModuleAccountByNameResponse": { + "type": "object", + "properties": { + "account": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } + }, + "description": "QueryModuleAccountByNameResponse is the response type for the Query/ModuleAccountByName RPC method." + }, + "cosmos.auth.v1beta1.QueryModuleAccountsResponse": { + "type": "object", + "properties": { + "accounts": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } + } + }, + "description": "QueryModuleAccountsResponse is the response type for the Query/ModuleAccounts RPC method.\n\nSince: cosmos-sdk 0.46" + }, + "cosmos.auth.v1beta1.QueryParamsResponse": { + "type": "object", + "properties": { + "params": { + "description": "params defines the parameters of the module.", + "type": "object", + "properties": { + "max_memo_characters": { + "type": "string", + "format": "uint64" + }, + "tx_sig_limit": { + "type": "string", + "format": "uint64" + }, + "tx_size_cost_per_byte": { + "type": "string", + "format": "uint64" + }, + "sig_verify_cost_ed25519": { + "type": "string", + "format": "uint64" + }, + "sig_verify_cost_secp256k1": { + "type": "string", + "format": "uint64" + } + } + } + }, + "description": "QueryParamsResponse is the response type for the Query/Params RPC method." + }, + "cosmos.authz.v1beta1.Grant": { + "type": "object", + "properties": { + "authorization": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "expiration": { + "type": "string", + "format": "date-time", + "title": "time when the grant will expire and will be pruned. If null, then the grant\ndoesn't have a time expiration (other conditions in `authorization`\nmay apply to invalidate the grant)" + } + }, + "description": "Grant gives permissions to execute\nthe provide method with expiration time." + }, + "cosmos.authz.v1beta1.GrantAuthorization": { + "type": "object", + "properties": { + "granter": { + "type": "string" + }, + "grantee": { + "type": "string" + }, + "authorization": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "expiration": { + "type": "string", + "format": "date-time" + } + }, + "title": "GrantAuthorization extends a grant with both the addresses of the grantee and granter.\nIt is used in genesis.proto and query.proto" + }, + "cosmos.authz.v1beta1.QueryGranteeGrantsResponse": { + "type": "object", + "properties": { + "grants": { + "type": "array", + "items": { + "type": "object", + "properties": { + "granter": { + "type": "string" + }, + "grantee": { + "type": "string" + }, + "authorization": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "expiration": { + "type": "string", + "format": "date-time" + } + }, + "title": "GrantAuthorization extends a grant with both the addresses of the grantee and granter.\nIt is used in genesis.proto and query.proto" + }, + "description": "grants is a list of grants granted to the grantee." + }, + "pagination": { + "description": "pagination defines an pagination for the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "description": "QueryGranteeGrantsResponse is the response type for the Query/GranteeGrants RPC method." + }, + "cosmos.authz.v1beta1.QueryGranterGrantsResponse": { + "type": "object", + "properties": { + "grants": { + "type": "array", + "items": { + "type": "object", + "properties": { + "granter": { + "type": "string" + }, + "grantee": { + "type": "string" + }, + "authorization": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "expiration": { + "type": "string", + "format": "date-time" + } + }, + "title": "GrantAuthorization extends a grant with both the addresses of the grantee and granter.\nIt is used in genesis.proto and query.proto" + }, + "description": "grants is a list of grants granted by the granter." + }, + "pagination": { + "description": "pagination defines an pagination for the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "description": "QueryGranterGrantsResponse is the response type for the Query/GranterGrants RPC method." + }, + "cosmos.authz.v1beta1.QueryGrantsResponse": { + "type": "object", + "properties": { + "grants": { + "type": "array", + "items": { + "type": "object", + "properties": { + "authorization": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "expiration": { + "type": "string", + "format": "date-time", + "title": "time when the grant will expire and will be pruned. If null, then the grant\ndoesn't have a time expiration (other conditions in `authorization`\nmay apply to invalidate the grant)" + } + }, + "description": "Grant gives permissions to execute\nthe provide method with expiration time." + }, + "description": "authorizations is a list of grants granted for grantee by granter." + }, + "pagination": { + "description": "pagination defines an pagination for the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "description": "QueryGrantsResponse is the response type for the Query/Authorizations RPC method." + }, + "cosmos.bank.v1beta1.DenomOwner": { + "type": "object", + "properties": { + "address": { + "type": "string", + "description": "address defines the address that owns a particular denomination." + }, + "balance": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + } + }, + "description": "DenomOwner defines structure representing an account that owns or holds a\nparticular denominated token. It contains the account address and account\nbalance of the denominated token.\n\nSince: cosmos-sdk 0.46" + }, + "cosmos.bank.v1beta1.DenomUnit": { + "type": "object", + "properties": { + "denom": { + "type": "string", + "description": "denom represents the string name of the given denom unit (e.g uatom)." + }, + "exponent": { + "type": "integer", + "format": "int64", + "description": "exponent represents power of 10 exponent that one must\nraise the base_denom to in order to equal the given DenomUnit's denom\n1 denom = 10^exponent base_denom\n(e.g. with a base_denom of uatom, one can create a DenomUnit of 'atom' with\nexponent = 6, thus: 1 atom = 10^6 uatom)." + }, + "aliases": { + "type": "array", + "items": { + "type": "string" + }, + "title": "aliases is a list of string aliases for the given denom" + } + }, + "description": "DenomUnit represents a struct that describes a given\ndenomination unit of the basic token." + }, + "cosmos.bank.v1beta1.Metadata": { + "type": "object", + "properties": { + "description": { + "type": "string" + }, + "denom_units": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string", + "description": "denom represents the string name of the given denom unit (e.g uatom)." + }, + "exponent": { + "type": "integer", + "format": "int64", + "description": "exponent represents power of 10 exponent that one must\nraise the base_denom to in order to equal the given DenomUnit's denom\n1 denom = 10^exponent base_denom\n(e.g. with a base_denom of uatom, one can create a DenomUnit of 'atom' with\nexponent = 6, thus: 1 atom = 10^6 uatom)." + }, + "aliases": { + "type": "array", + "items": { + "type": "string" + }, + "title": "aliases is a list of string aliases for the given denom" + } + }, + "description": "DenomUnit represents a struct that describes a given\ndenomination unit of the basic token." + }, + "title": "denom_units represents the list of DenomUnit's for a given coin" + }, + "base": { + "type": "string", + "description": "base represents the base denom (should be the DenomUnit with exponent = 0)." + }, + "display": { + "type": "string", + "description": "display indicates the suggested denom that should be\ndisplayed in clients." + }, + "name": { + "type": "string", + "description": "Since: cosmos-sdk 0.43", + "title": "name defines the name of the token (eg: Cosmos Atom)" + }, + "symbol": { + "type": "string", + "description": "symbol is the token symbol usually shown on exchanges (eg: ATOM). This can\nbe the same as the display.\n\nSince: cosmos-sdk 0.43" + }, + "uri": { + "type": "string", + "description": "URI to a document (on or off-chain) that contains additional information. Optional.\n\nSince: cosmos-sdk 0.46" + }, + "uri_hash": { + "type": "string", + "description": "URIHash is a sha256 hash of a document pointed by URI. It's used to verify that\nthe document didn't change. Optional.\n\nSince: cosmos-sdk 0.46" + } + }, + "description": "Metadata represents a struct that describes\na basic token." + }, + "cosmos.bank.v1beta1.Params": { + "type": "object", + "properties": { + "send_enabled": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "enabled": { + "type": "boolean" + } + }, + "description": "SendEnabled maps coin denom to a send_enabled status (whether a denom is\nsendable)." + }, + "description": "Deprecated: Use of SendEnabled in params is deprecated.\nFor genesis, use the newly added send_enabled field in the genesis object.\nStorage, lookup, and manipulation of this information is now in the keeper.\n\nAs of cosmos-sdk 0.47, this only exists for backwards compatibility of genesis files." + }, + "default_send_enabled": { + "type": "boolean" + } + }, + "description": "Params defines the parameters for the bank module." + }, + "cosmos.bank.v1beta1.QueryAllBalancesResponse": { + "type": "object", + "properties": { + "balances": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "description": "balances is the balances of all the coins." + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "description": "QueryAllBalancesResponse is the response type for the Query/AllBalances RPC\nmethod." + }, + "cosmos.bank.v1beta1.QueryBalanceResponse": { + "type": "object", + "properties": { + "balance": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + } + }, + "description": "QueryBalanceResponse is the response type for the Query/Balance RPC method." + }, + "cosmos.bank.v1beta1.QueryDenomMetadataByQueryStringResponse": { + "type": "object", + "properties": { + "metadata": { + "type": "object", + "properties": { + "description": { + "type": "string" + }, + "denom_units": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string", + "description": "denom represents the string name of the given denom unit (e.g uatom)." + }, + "exponent": { + "type": "integer", + "format": "int64", + "description": "exponent represents power of 10 exponent that one must\nraise the base_denom to in order to equal the given DenomUnit's denom\n1 denom = 10^exponent base_denom\n(e.g. with a base_denom of uatom, one can create a DenomUnit of 'atom' with\nexponent = 6, thus: 1 atom = 10^6 uatom)." + }, + "aliases": { + "type": "array", + "items": { + "type": "string" + }, + "title": "aliases is a list of string aliases for the given denom" + } + }, + "description": "DenomUnit represents a struct that describes a given\ndenomination unit of the basic token." + }, + "title": "denom_units represents the list of DenomUnit's for a given coin" + }, + "base": { + "type": "string", + "description": "base represents the base denom (should be the DenomUnit with exponent = 0)." + }, + "display": { + "type": "string", + "description": "display indicates the suggested denom that should be\ndisplayed in clients." + }, + "name": { + "type": "string", + "description": "Since: cosmos-sdk 0.43", + "title": "name defines the name of the token (eg: Cosmos Atom)" + }, + "symbol": { + "type": "string", + "description": "symbol is the token symbol usually shown on exchanges (eg: ATOM). This can\nbe the same as the display.\n\nSince: cosmos-sdk 0.43" + }, + "uri": { + "type": "string", + "description": "URI to a document (on or off-chain) that contains additional information. Optional.\n\nSince: cosmos-sdk 0.46" + }, + "uri_hash": { + "type": "string", + "description": "URIHash is a sha256 hash of a document pointed by URI. It's used to verify that\nthe document didn't change. Optional.\n\nSince: cosmos-sdk 0.46" + } + }, + "description": "Metadata represents a struct that describes\na basic token." + } + }, + "description": "QueryDenomMetadataByQueryStringResponse is the response type for the Query/DenomMetadata RPC\nmethod. Identical with QueryDenomMetadataResponse but receives denom as query string in request." + }, + "cosmos.bank.v1beta1.QueryDenomMetadataResponse": { + "type": "object", + "properties": { + "metadata": { + "type": "object", + "properties": { + "description": { + "type": "string" + }, + "denom_units": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string", + "description": "denom represents the string name of the given denom unit (e.g uatom)." + }, + "exponent": { + "type": "integer", + "format": "int64", + "description": "exponent represents power of 10 exponent that one must\nraise the base_denom to in order to equal the given DenomUnit's denom\n1 denom = 10^exponent base_denom\n(e.g. with a base_denom of uatom, one can create a DenomUnit of 'atom' with\nexponent = 6, thus: 1 atom = 10^6 uatom)." + }, + "aliases": { + "type": "array", + "items": { + "type": "string" + }, + "title": "aliases is a list of string aliases for the given denom" + } + }, + "description": "DenomUnit represents a struct that describes a given\ndenomination unit of the basic token." + }, + "title": "denom_units represents the list of DenomUnit's for a given coin" + }, + "base": { + "type": "string", + "description": "base represents the base denom (should be the DenomUnit with exponent = 0)." + }, + "display": { + "type": "string", + "description": "display indicates the suggested denom that should be\ndisplayed in clients." + }, + "name": { + "type": "string", + "description": "Since: cosmos-sdk 0.43", + "title": "name defines the name of the token (eg: Cosmos Atom)" + }, + "symbol": { + "type": "string", + "description": "symbol is the token symbol usually shown on exchanges (eg: ATOM). This can\nbe the same as the display.\n\nSince: cosmos-sdk 0.43" + }, + "uri": { + "type": "string", + "description": "URI to a document (on or off-chain) that contains additional information. Optional.\n\nSince: cosmos-sdk 0.46" + }, + "uri_hash": { + "type": "string", + "description": "URIHash is a sha256 hash of a document pointed by URI. It's used to verify that\nthe document didn't change. Optional.\n\nSince: cosmos-sdk 0.46" + } + }, + "description": "Metadata represents a struct that describes\na basic token." + } + }, + "description": "QueryDenomMetadataResponse is the response type for the Query/DenomMetadata RPC\nmethod." + }, + "cosmos.bank.v1beta1.QueryDenomOwnersResponse": { + "type": "object", + "properties": { + "denom_owners": { + "type": "array", + "items": { + "type": "object", + "properties": { + "address": { + "type": "string", + "description": "address defines the address that owns a particular denomination." + }, + "balance": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + } + }, + "description": "DenomOwner defines structure representing an account that owns or holds a\nparticular denominated token. It contains the account address and account\nbalance of the denominated token.\n\nSince: cosmos-sdk 0.46" + } + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "description": "QueryDenomOwnersResponse defines the RPC response of a DenomOwners RPC query.\n\nSince: cosmos-sdk 0.46" + }, + "cosmos.bank.v1beta1.QueryDenomsMetadataResponse": { + "type": "object", + "properties": { + "metadatas": { + "type": "array", + "items": { + "type": "object", + "properties": { + "description": { + "type": "string" + }, + "denom_units": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string", + "description": "denom represents the string name of the given denom unit (e.g uatom)." + }, + "exponent": { + "type": "integer", + "format": "int64", + "description": "exponent represents power of 10 exponent that one must\nraise the base_denom to in order to equal the given DenomUnit's denom\n1 denom = 10^exponent base_denom\n(e.g. with a base_denom of uatom, one can create a DenomUnit of 'atom' with\nexponent = 6, thus: 1 atom = 10^6 uatom)." + }, + "aliases": { + "type": "array", + "items": { + "type": "string" + }, + "title": "aliases is a list of string aliases for the given denom" + } + }, + "description": "DenomUnit represents a struct that describes a given\ndenomination unit of the basic token." + }, + "title": "denom_units represents the list of DenomUnit's for a given coin" + }, + "base": { + "type": "string", + "description": "base represents the base denom (should be the DenomUnit with exponent = 0)." + }, + "display": { + "type": "string", + "description": "display indicates the suggested denom that should be\ndisplayed in clients." + }, + "name": { + "type": "string", + "description": "Since: cosmos-sdk 0.43", + "title": "name defines the name of the token (eg: Cosmos Atom)" + }, + "symbol": { + "type": "string", + "description": "symbol is the token symbol usually shown on exchanges (eg: ATOM). This can\nbe the same as the display.\n\nSince: cosmos-sdk 0.43" + }, + "uri": { + "type": "string", + "description": "URI to a document (on or off-chain) that contains additional information. Optional.\n\nSince: cosmos-sdk 0.46" + }, + "uri_hash": { + "type": "string", + "description": "URIHash is a sha256 hash of a document pointed by URI. It's used to verify that\nthe document didn't change. Optional.\n\nSince: cosmos-sdk 0.46" + } + }, + "description": "Metadata represents a struct that describes\na basic token." + }, + "description": "metadata provides the client information for all the registered tokens." + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "description": "QueryDenomsMetadataResponse is the response type for the Query/DenomsMetadata RPC\nmethod." + }, + "cosmos.bank.v1beta1.QueryParamsResponse": { + "type": "object", + "properties": { + "params": { + "description": "params provides the parameters of the bank module.", + "type": "object", + "properties": { + "send_enabled": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "enabled": { + "type": "boolean" + } + }, + "description": "SendEnabled maps coin denom to a send_enabled status (whether a denom is\nsendable)." + }, + "description": "Deprecated: Use of SendEnabled in params is deprecated.\nFor genesis, use the newly added send_enabled field in the genesis object.\nStorage, lookup, and manipulation of this information is now in the keeper.\n\nAs of cosmos-sdk 0.47, this only exists for backwards compatibility of genesis files." + }, + "default_send_enabled": { + "type": "boolean" + } + } + } + }, + "description": "QueryParamsResponse defines the response type for querying x/bank parameters." + }, + "cosmos.bank.v1beta1.QuerySendEnabledResponse": { + "type": "object", + "properties": { + "send_enabled": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "enabled": { + "type": "boolean" + } + }, + "description": "SendEnabled maps coin denom to a send_enabled status (whether a denom is\nsendable)." + } + }, + "pagination": { + "description": "pagination defines the pagination in the response. This field is only\npopulated if the denoms field in the request is empty.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "description": "QuerySendEnabledResponse defines the RPC response of a SendEnable query.\n\nSince: cosmos-sdk 0.47" + }, + "cosmos.bank.v1beta1.QuerySpendableBalanceByDenomResponse": { + "type": "object", + "properties": { + "balance": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + } + }, + "description": "QuerySpendableBalanceByDenomResponse defines the gRPC response structure for\nquerying an account's spendable balance for a specific denom.\n\nSince: cosmos-sdk 0.47" + }, + "cosmos.bank.v1beta1.QuerySpendableBalancesResponse": { + "type": "object", + "properties": { + "balances": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "description": "balances is the spendable balances of all the coins." + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "description": "QuerySpendableBalancesResponse defines the gRPC response structure for querying\nan account's spendable balances.\n\nSince: cosmos-sdk 0.46" + }, + "cosmos.bank.v1beta1.QuerySupplyOfResponse": { + "type": "object", + "properties": { + "amount": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + } + }, + "description": "QuerySupplyOfResponse is the response type for the Query/SupplyOf RPC method." + }, + "cosmos.bank.v1beta1.QueryTotalSupplyResponse": { + "type": "object", + "properties": { + "supply": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "title": "supply is the supply of the coins" + }, + "pagination": { + "description": "pagination defines the pagination in the response.\n\nSince: cosmos-sdk 0.43", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "title": "QueryTotalSupplyResponse is the response type for the Query/TotalSupply RPC\nmethod" + }, + "cosmos.bank.v1beta1.SendEnabled": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "enabled": { + "type": "boolean" + } + }, + "description": "SendEnabled maps coin denom to a send_enabled status (whether a denom is\nsendable)." + }, + "cosmos.distribution.v1beta1.DelegationDelegatorReward": { + "type": "object", + "properties": { + "validator_address": { + "type": "string" + }, + "reward": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." + } + } + }, + "description": "DelegationDelegatorReward represents the properties\nof a delegator's delegation reward." + }, + "cosmos.distribution.v1beta1.Params": { + "type": "object", + "properties": { + "community_tax": { + "type": "string" + }, + "base_proposer_reward": { + "type": "string", + "description": "Deprecated: The base_proposer_reward field is deprecated and is no longer used\nin the x/distribution module's reward mechanism." + }, + "bonus_proposer_reward": { + "type": "string", + "description": "Deprecated: The bonus_proposer_reward field is deprecated and is no longer used\nin the x/distribution module's reward mechanism." + }, + "withdraw_addr_enabled": { + "type": "boolean" + } + }, + "description": "Params defines the set of params for the distribution module." + }, + "cosmos.distribution.v1beta1.QueryCommunityPoolResponse": { + "type": "object", + "properties": { + "pool": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." + }, + "description": "pool defines community pool's coins." + } + }, + "description": "QueryCommunityPoolResponse is the response type for the Query/CommunityPool\nRPC method.\n\nDeprecated\nSince: cosmos-sdk 0.50" + }, + "cosmos.distribution.v1beta1.QueryDelegationRewardsResponse": { + "type": "object", + "properties": { + "rewards": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." + }, + "description": "rewards defines the rewards accrued by a delegation." + } + }, + "description": "QueryDelegationRewardsResponse is the response type for the\nQuery/DelegationRewards RPC method." + }, + "cosmos.distribution.v1beta1.QueryDelegationTotalRewardsResponse": { + "type": "object", + "properties": { + "rewards": { + "type": "array", + "items": { + "type": "object", + "properties": { + "validator_address": { + "type": "string" + }, + "reward": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." + } + } + }, + "description": "DelegationDelegatorReward represents the properties\nof a delegator's delegation reward." + }, + "description": "rewards defines all the rewards accrued by a delegator." + }, + "total": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." + }, + "description": "total defines the sum of all the rewards." + } + }, + "description": "QueryDelegationTotalRewardsResponse is the response type for the\nQuery/DelegationTotalRewards RPC method." + }, + "cosmos.distribution.v1beta1.QueryDelegatorValidatorsResponse": { + "type": "object", + "properties": { + "validators": { + "type": "array", + "items": { + "type": "string" + }, + "description": "validators defines the validators a delegator is delegating for." + } + }, + "description": "QueryDelegatorValidatorsResponse is the response type for the\nQuery/DelegatorValidators RPC method." + }, + "cosmos.distribution.v1beta1.QueryDelegatorWithdrawAddressResponse": { + "type": "object", + "properties": { + "withdraw_address": { + "type": "string", + "description": "withdraw_address defines the delegator address to query for." + } + }, + "description": "QueryDelegatorWithdrawAddressResponse is the response type for the\nQuery/DelegatorWithdrawAddress RPC method." + }, + "cosmos.distribution.v1beta1.QueryParamsResponse": { + "type": "object", + "properties": { + "params": { + "description": "params defines the parameters of the module.", + "type": "object", + "properties": { + "community_tax": { + "type": "string" + }, + "base_proposer_reward": { + "type": "string", + "description": "Deprecated: The base_proposer_reward field is deprecated and is no longer used\nin the x/distribution module's reward mechanism." + }, + "bonus_proposer_reward": { + "type": "string", + "description": "Deprecated: The bonus_proposer_reward field is deprecated and is no longer used\nin the x/distribution module's reward mechanism." + }, + "withdraw_addr_enabled": { + "type": "boolean" + } + } + } + }, + "description": "QueryParamsResponse is the response type for the Query/Params RPC method." + }, + "cosmos.distribution.v1beta1.QueryValidatorCommissionResponse": { + "type": "object", + "properties": { + "commission": { + "description": "commission defines the commission the validator received.", + "type": "object", + "properties": { + "commission": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." + } + } + } + } + }, + "title": "QueryValidatorCommissionResponse is the response type for the\nQuery/ValidatorCommission RPC method" + }, + "cosmos.distribution.v1beta1.QueryValidatorDistributionInfoResponse": { + "type": "object", + "properties": { + "operator_address": { + "type": "string", + "description": "operator_address defines the validator operator address." + }, + "self_bond_rewards": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." + }, + "description": "self_bond_rewards defines the self delegations rewards." + }, + "commission": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." + }, + "description": "commission defines the commission the validator received." + } + }, + "description": "QueryValidatorDistributionInfoResponse is the response type for the Query/ValidatorDistributionInfo RPC method." + }, + "cosmos.distribution.v1beta1.QueryValidatorOutstandingRewardsResponse": { + "type": "object", + "properties": { + "rewards": { + "type": "object", + "properties": { + "rewards": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." + } + } + }, + "description": "ValidatorOutstandingRewards represents outstanding (un-withdrawn) rewards\nfor a validator inexpensive to track, allows simple sanity checks." + } + }, + "description": "QueryValidatorOutstandingRewardsResponse is the response type for the\nQuery/ValidatorOutstandingRewards RPC method." + }, + "cosmos.distribution.v1beta1.QueryValidatorSlashesResponse": { + "type": "object", + "properties": { + "slashes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "validator_period": { + "type": "string", + "format": "uint64" + }, + "fraction": { + "type": "string" + } + }, + "description": "ValidatorSlashEvent represents a validator slash event.\nHeight is implicit within the store key.\nThis is needed to calculate appropriate amount of staking tokens\nfor delegations which are withdrawn after a slash has occurred." + }, + "description": "slashes defines the slashes the validator received." + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "description": "QueryValidatorSlashesResponse is the response type for the\nQuery/ValidatorSlashes RPC method." + }, + "cosmos.distribution.v1beta1.ValidatorAccumulatedCommission": { + "type": "object", + "properties": { + "commission": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." + } + } + }, + "description": "ValidatorAccumulatedCommission represents accumulated commission\nfor a validator kept as a running counter, can be withdrawn at any time." + }, + "cosmos.distribution.v1beta1.ValidatorOutstandingRewards": { + "type": "object", + "properties": { + "rewards": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "DecCoin defines a token with a denomination and a decimal amount.\n\nNOTE: The amount field is an Dec which implements the custom method\nsignatures required by gogoproto." + } + } + }, + "description": "ValidatorOutstandingRewards represents outstanding (un-withdrawn) rewards\nfor a validator inexpensive to track, allows simple sanity checks." + }, + "cosmos.distribution.v1beta1.ValidatorSlashEvent": { + "type": "object", + "properties": { + "validator_period": { + "type": "string", + "format": "uint64" + }, + "fraction": { + "type": "string" + } + }, + "description": "ValidatorSlashEvent represents a validator slash event.\nHeight is implicit within the store key.\nThis is needed to calculate appropriate amount of staking tokens\nfor delegations which are withdrawn after a slash has occurred." + }, + "cosmos.feegrant.v1beta1.Grant": { + "type": "object", + "properties": { + "granter": { + "type": "string", + "description": "granter is the address of the user granting an allowance of their funds." + }, + "grantee": { + "type": "string", + "description": "grantee is the address of the user being granted an allowance of another user's funds." + }, + "allowance": { + "description": "allowance can be any of basic, periodic, allowed fee allowance.", + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + } + } + }, + "title": "Grant is stored in the KVStore to record a grant with full context" + }, + "cosmos.feegrant.v1beta1.QueryAllowanceResponse": { + "type": "object", + "properties": { + "allowance": { + "description": "allowance is a allowance granted for grantee by granter.", + "type": "object", + "properties": { + "granter": { + "type": "string", + "description": "granter is the address of the user granting an allowance of their funds." + }, + "grantee": { + "type": "string", + "description": "grantee is the address of the user being granted an allowance of another user's funds." + }, + "allowance": { + "description": "allowance can be any of basic, periodic, allowed fee allowance.", + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + } + } + }, + "title": "Grant is stored in the KVStore to record a grant with full context" + } + }, + "description": "QueryAllowanceResponse is the response type for the Query/Allowance RPC method." + }, + "cosmos.feegrant.v1beta1.QueryAllowancesByGranterResponse": { + "type": "object", + "properties": { + "allowances": { + "type": "array", + "items": { + "type": "object", + "properties": { + "granter": { + "type": "string", + "description": "granter is the address of the user granting an allowance of their funds." + }, + "grantee": { + "type": "string", + "description": "grantee is the address of the user being granted an allowance of another user's funds." + }, + "allowance": { + "description": "allowance can be any of basic, periodic, allowed fee allowance.", + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + } + } + }, + "title": "Grant is stored in the KVStore to record a grant with full context" + }, + "description": "allowances that have been issued by the granter." + }, + "pagination": { + "description": "pagination defines an pagination for the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "description": "QueryAllowancesByGranterResponse is the response type for the Query/AllowancesByGranter RPC method.\n\nSince: cosmos-sdk 0.46" + }, + "cosmos.feegrant.v1beta1.QueryAllowancesResponse": { + "type": "object", + "properties": { + "allowances": { + "type": "array", + "items": { + "type": "object", + "properties": { + "granter": { + "type": "string", + "description": "granter is the address of the user granting an allowance of their funds." + }, + "grantee": { + "type": "string", + "description": "grantee is the address of the user being granted an allowance of another user's funds." + }, + "allowance": { + "description": "allowance can be any of basic, periodic, allowed fee allowance.", + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + } + } + }, + "title": "Grant is stored in the KVStore to record a grant with full context" + }, + "description": "allowances are allowance's granted for grantee by granter." + }, + "pagination": { + "description": "pagination defines an pagination for the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "description": "QueryAllowancesResponse is the response type for the Query/Allowances RPC method." + }, + "cosmos.evidence.v1beta1.QueryAllEvidenceResponse": { + "type": "object", + "properties": { + "evidence": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "description": "evidence returns all evidences." + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "description": "QueryAllEvidenceResponse is the response type for the Query/AllEvidence RPC\nmethod." + }, + "cosmos.evidence.v1beta1.QueryEvidenceResponse": { + "type": "object", + "properties": { + "evidence": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + } + }, + "description": "QueryEvidenceResponse is the response type for the Query/Evidence RPC method." + }, + "cosmos.gov.v1beta1.Deposit": { + "type": "object", + "properties": { + "proposal_id": { + "type": "string", + "format": "uint64", + "description": "proposal_id defines the unique id of the proposal." + }, + "depositor": { + "type": "string", + "description": "depositor defines the deposit addresses from the proposals." + }, + "amount": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "description": "amount to be deposited by depositor." + } + }, + "description": "Deposit defines an amount deposited by an account address to an active\nproposal." + }, + "cosmos.gov.v1beta1.DepositParams": { + "type": "object", + "properties": { + "min_deposit": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "description": "Minimum deposit for a proposal to enter voting period." + }, + "max_deposit_period": { + "type": "string", + "description": "Maximum period for Atom holders to deposit on a proposal. Initial value: 2\nmonths." + } + }, + "description": "DepositParams defines the params for deposits on governance proposals." + }, + "cosmos.gov.v1beta1.Proposal": { + "type": "object", + "properties": { + "proposal_id": { + "type": "string", + "format": "uint64", + "description": "proposal_id defines the unique id of the proposal." + }, + "content": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "status": { + "description": "status defines the proposal status.", + "type": "string", + "enum": [ + "PROPOSAL_STATUS_UNSPECIFIED", + "PROPOSAL_STATUS_DEPOSIT_PERIOD", + "PROPOSAL_STATUS_VOTING_PERIOD", + "PROPOSAL_STATUS_PASSED", + "PROPOSAL_STATUS_REJECTED", + "PROPOSAL_STATUS_FAILED" + ], + "default": "PROPOSAL_STATUS_UNSPECIFIED" + }, + "final_tally_result": { + "description": "final_tally_result is the final tally result of the proposal. When\nquerying a proposal via gRPC, this field is not populated until the\nproposal's voting period has ended.", + "type": "object", + "properties": { + "yes": { + "type": "string", + "description": "yes is the number of yes votes on a proposal." + }, + "abstain": { + "type": "string", + "description": "abstain is the number of abstain votes on a proposal." + }, + "no": { + "type": "string", + "description": "no is the number of no votes on a proposal." + }, + "no_with_veto": { + "type": "string", + "description": "no_with_veto is the number of no with veto votes on a proposal." + } + } + }, + "submit_time": { + "type": "string", + "format": "date-time", + "description": "submit_time is the time of proposal submission." + }, + "deposit_end_time": { + "type": "string", + "format": "date-time", + "description": "deposit_end_time is the end time for deposition." + }, + "total_deposit": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "description": "total_deposit is the total deposit on the proposal." + }, + "voting_start_time": { + "type": "string", + "format": "date-time", + "description": "voting_start_time is the starting time to vote on a proposal." + }, + "voting_end_time": { + "type": "string", + "format": "date-time", + "description": "voting_end_time is the end time of voting on a proposal." + } + }, + "description": "Proposal defines the core field members of a governance proposal." + }, + "cosmos.gov.v1beta1.ProposalStatus": { + "type": "string", + "enum": [ + "PROPOSAL_STATUS_UNSPECIFIED", + "PROPOSAL_STATUS_DEPOSIT_PERIOD", + "PROPOSAL_STATUS_VOTING_PERIOD", + "PROPOSAL_STATUS_PASSED", + "PROPOSAL_STATUS_REJECTED", + "PROPOSAL_STATUS_FAILED" + ], + "default": "PROPOSAL_STATUS_UNSPECIFIED", + "description": "ProposalStatus enumerates the valid statuses of a proposal.\n\n - PROPOSAL_STATUS_UNSPECIFIED: PROPOSAL_STATUS_UNSPECIFIED defines the default proposal status.\n - PROPOSAL_STATUS_DEPOSIT_PERIOD: PROPOSAL_STATUS_DEPOSIT_PERIOD defines a proposal status during the deposit\nperiod.\n - PROPOSAL_STATUS_VOTING_PERIOD: PROPOSAL_STATUS_VOTING_PERIOD defines a proposal status during the voting\nperiod.\n - PROPOSAL_STATUS_PASSED: PROPOSAL_STATUS_PASSED defines a proposal status of a proposal that has\npassed.\n - PROPOSAL_STATUS_REJECTED: PROPOSAL_STATUS_REJECTED defines a proposal status of a proposal that has\nbeen rejected.\n - PROPOSAL_STATUS_FAILED: PROPOSAL_STATUS_FAILED defines a proposal status of a proposal that has\nfailed." + }, + "cosmos.gov.v1beta1.QueryDepositResponse": { + "type": "object", + "properties": { + "deposit": { + "type": "object", + "properties": { + "proposal_id": { + "type": "string", + "format": "uint64", + "description": "proposal_id defines the unique id of the proposal." + }, + "depositor": { + "type": "string", + "description": "depositor defines the deposit addresses from the proposals." + }, + "amount": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "description": "amount to be deposited by depositor." + } + }, + "description": "Deposit defines an amount deposited by an account address to an active\nproposal." + } + }, + "description": "QueryDepositResponse is the response type for the Query/Deposit RPC method." + }, + "cosmos.gov.v1beta1.QueryDepositsResponse": { + "type": "object", + "properties": { + "deposits": { + "type": "array", + "items": { + "type": "object", + "properties": { + "proposal_id": { + "type": "string", + "format": "uint64", + "description": "proposal_id defines the unique id of the proposal." + }, + "depositor": { + "type": "string", + "description": "depositor defines the deposit addresses from the proposals." + }, + "amount": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "description": "amount to be deposited by depositor." + } + }, + "description": "Deposit defines an amount deposited by an account address to an active\nproposal." + }, + "description": "deposits defines the requested deposits." + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "description": "QueryDepositsResponse is the response type for the Query/Deposits RPC method." + }, + "cosmos.gov.v1beta1.QueryParamsResponse": { + "type": "object", + "properties": { + "voting_params": { + "description": "voting_params defines the parameters related to voting.", + "type": "object", + "properties": { + "voting_period": { + "type": "string", + "description": "Duration of the voting period." + } + } + }, + "deposit_params": { + "description": "deposit_params defines the parameters related to deposit.", + "type": "object", + "properties": { + "min_deposit": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "description": "Minimum deposit for a proposal to enter voting period." + }, + "max_deposit_period": { + "type": "string", + "description": "Maximum period for Atom holders to deposit on a proposal. Initial value: 2\nmonths." + } + } + }, + "tally_params": { + "description": "tally_params defines the parameters related to tally.", + "type": "object", + "properties": { + "quorum": { + "type": "string", + "format": "byte", + "description": "Minimum percentage of total stake needed to vote for a result to be\nconsidered valid." + }, + "threshold": { + "type": "string", + "format": "byte", + "description": "Minimum proportion of Yes votes for proposal to pass. Default value: 0.5." + }, + "veto_threshold": { + "type": "string", + "format": "byte", + "description": "Minimum value of Veto votes to Total votes ratio for proposal to be\nvetoed. Default value: 1/3." + } + } + } + }, + "description": "QueryParamsResponse is the response type for the Query/Params RPC method." + }, + "cosmos.gov.v1beta1.QueryProposalResponse": { + "type": "object", + "properties": { + "proposal": { + "type": "object", + "properties": { + "proposal_id": { + "type": "string", + "format": "uint64", + "description": "proposal_id defines the unique id of the proposal." + }, + "content": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "status": { + "description": "status defines the proposal status.", + "type": "string", + "enum": [ + "PROPOSAL_STATUS_UNSPECIFIED", + "PROPOSAL_STATUS_DEPOSIT_PERIOD", + "PROPOSAL_STATUS_VOTING_PERIOD", + "PROPOSAL_STATUS_PASSED", + "PROPOSAL_STATUS_REJECTED", + "PROPOSAL_STATUS_FAILED" + ], + "default": "PROPOSAL_STATUS_UNSPECIFIED" + }, + "final_tally_result": { + "description": "final_tally_result is the final tally result of the proposal. When\nquerying a proposal via gRPC, this field is not populated until the\nproposal's voting period has ended.", + "type": "object", + "properties": { + "yes": { + "type": "string", + "description": "yes is the number of yes votes on a proposal." + }, + "abstain": { + "type": "string", + "description": "abstain is the number of abstain votes on a proposal." + }, + "no": { + "type": "string", + "description": "no is the number of no votes on a proposal." + }, + "no_with_veto": { + "type": "string", + "description": "no_with_veto is the number of no with veto votes on a proposal." + } + } + }, + "submit_time": { + "type": "string", + "format": "date-time", + "description": "submit_time is the time of proposal submission." + }, + "deposit_end_time": { + "type": "string", + "format": "date-time", + "description": "deposit_end_time is the end time for deposition." + }, + "total_deposit": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "description": "total_deposit is the total deposit on the proposal." + }, + "voting_start_time": { + "type": "string", + "format": "date-time", + "description": "voting_start_time is the starting time to vote on a proposal." + }, + "voting_end_time": { + "type": "string", + "format": "date-time", + "description": "voting_end_time is the end time of voting on a proposal." + } + }, + "description": "Proposal defines the core field members of a governance proposal." + } + }, + "description": "QueryProposalResponse is the response type for the Query/Proposal RPC method." + }, + "cosmos.gov.v1beta1.QueryProposalsResponse": { + "type": "object", + "properties": { + "proposals": { + "type": "array", + "items": { + "type": "object", + "properties": { + "proposal_id": { + "type": "string", + "format": "uint64", + "description": "proposal_id defines the unique id of the proposal." + }, + "content": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "status": { + "description": "status defines the proposal status.", + "type": "string", + "enum": [ + "PROPOSAL_STATUS_UNSPECIFIED", + "PROPOSAL_STATUS_DEPOSIT_PERIOD", + "PROPOSAL_STATUS_VOTING_PERIOD", + "PROPOSAL_STATUS_PASSED", + "PROPOSAL_STATUS_REJECTED", + "PROPOSAL_STATUS_FAILED" + ], + "default": "PROPOSAL_STATUS_UNSPECIFIED" + }, + "final_tally_result": { + "description": "final_tally_result is the final tally result of the proposal. When\nquerying a proposal via gRPC, this field is not populated until the\nproposal's voting period has ended.", + "type": "object", + "properties": { + "yes": { + "type": "string", + "description": "yes is the number of yes votes on a proposal." + }, + "abstain": { + "type": "string", + "description": "abstain is the number of abstain votes on a proposal." + }, + "no": { + "type": "string", + "description": "no is the number of no votes on a proposal." + }, + "no_with_veto": { + "type": "string", + "description": "no_with_veto is the number of no with veto votes on a proposal." + } + } + }, + "submit_time": { + "type": "string", + "format": "date-time", + "description": "submit_time is the time of proposal submission." + }, + "deposit_end_time": { + "type": "string", + "format": "date-time", + "description": "deposit_end_time is the end time for deposition." + }, + "total_deposit": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "description": "total_deposit is the total deposit on the proposal." + }, + "voting_start_time": { + "type": "string", + "format": "date-time", + "description": "voting_start_time is the starting time to vote on a proposal." + }, + "voting_end_time": { + "type": "string", + "format": "date-time", + "description": "voting_end_time is the end time of voting on a proposal." + } + }, + "description": "Proposal defines the core field members of a governance proposal." + }, + "description": "proposals defines all the requested governance proposals." + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "description": "QueryProposalsResponse is the response type for the Query/Proposals RPC\nmethod." + }, + "cosmos.gov.v1beta1.QueryTallyResultResponse": { + "type": "object", + "properties": { + "tally": { + "description": "tally defines the requested tally.", + "type": "object", + "properties": { + "yes": { + "type": "string", + "description": "yes is the number of yes votes on a proposal." + }, + "abstain": { + "type": "string", + "description": "abstain is the number of abstain votes on a proposal." + }, + "no": { + "type": "string", + "description": "no is the number of no votes on a proposal." + }, + "no_with_veto": { + "type": "string", + "description": "no_with_veto is the number of no with veto votes on a proposal." + } + } + } + }, + "description": "QueryTallyResultResponse is the response type for the Query/Tally RPC method." + }, + "cosmos.gov.v1beta1.QueryVoteResponse": { + "type": "object", + "properties": { + "vote": { + "type": "object", + "properties": { + "proposal_id": { + "type": "string", + "format": "uint64", + "description": "proposal_id defines the unique id of the proposal." + }, + "voter": { + "type": "string", + "description": "voter is the voter address of the proposal." + }, + "option": { + "description": "Deprecated: Prefer to use `options` instead. This field is set in queries\nif and only if `len(options) == 1` and that option has weight 1. In all\nother cases, this field will default to VOTE_OPTION_UNSPECIFIED.", + "type": "string", + "enum": [ + "VOTE_OPTION_UNSPECIFIED", + "VOTE_OPTION_YES", + "VOTE_OPTION_ABSTAIN", + "VOTE_OPTION_NO", + "VOTE_OPTION_NO_WITH_VETO" + ], + "default": "VOTE_OPTION_UNSPECIFIED" + }, + "options": { + "type": "array", + "items": { + "type": "object", + "properties": { + "option": { + "description": "option defines the valid vote options, it must not contain duplicate vote options.", + "type": "string", + "enum": [ + "VOTE_OPTION_UNSPECIFIED", + "VOTE_OPTION_YES", + "VOTE_OPTION_ABSTAIN", + "VOTE_OPTION_NO", + "VOTE_OPTION_NO_WITH_VETO" + ], + "default": "VOTE_OPTION_UNSPECIFIED" + }, + "weight": { + "type": "string", + "description": "weight is the vote weight associated with the vote option." + } + }, + "description": "WeightedVoteOption defines a unit of vote for vote split.\n\nSince: cosmos-sdk 0.43" + }, + "description": "options is the weighted vote options.\n\nSince: cosmos-sdk 0.43" + } + }, + "description": "Vote defines a vote on a governance proposal.\nA Vote consists of a proposal ID, the voter, and the vote option." + } + }, + "description": "QueryVoteResponse is the response type for the Query/Vote RPC method." + }, + "cosmos.gov.v1beta1.QueryVotesResponse": { + "type": "object", + "properties": { + "votes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "proposal_id": { + "type": "string", + "format": "uint64", + "description": "proposal_id defines the unique id of the proposal." + }, + "voter": { + "type": "string", + "description": "voter is the voter address of the proposal." + }, + "option": { + "description": "Deprecated: Prefer to use `options` instead. This field is set in queries\nif and only if `len(options) == 1` and that option has weight 1. In all\nother cases, this field will default to VOTE_OPTION_UNSPECIFIED.", + "type": "string", + "enum": [ + "VOTE_OPTION_UNSPECIFIED", + "VOTE_OPTION_YES", + "VOTE_OPTION_ABSTAIN", + "VOTE_OPTION_NO", + "VOTE_OPTION_NO_WITH_VETO" + ], + "default": "VOTE_OPTION_UNSPECIFIED" + }, + "options": { + "type": "array", + "items": { + "type": "object", + "properties": { + "option": { + "description": "option defines the valid vote options, it must not contain duplicate vote options.", + "type": "string", + "enum": [ + "VOTE_OPTION_UNSPECIFIED", + "VOTE_OPTION_YES", + "VOTE_OPTION_ABSTAIN", + "VOTE_OPTION_NO", + "VOTE_OPTION_NO_WITH_VETO" + ], + "default": "VOTE_OPTION_UNSPECIFIED" + }, + "weight": { + "type": "string", + "description": "weight is the vote weight associated with the vote option." + } + }, + "description": "WeightedVoteOption defines a unit of vote for vote split.\n\nSince: cosmos-sdk 0.43" + }, + "description": "options is the weighted vote options.\n\nSince: cosmos-sdk 0.43" + } + }, + "description": "Vote defines a vote on a governance proposal.\nA Vote consists of a proposal ID, the voter, and the vote option." + }, + "description": "votes defines the queried votes." + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "description": "QueryVotesResponse is the response type for the Query/Votes RPC method." + }, + "cosmos.gov.v1beta1.TallyParams": { + "type": "object", + "properties": { + "quorum": { + "type": "string", + "format": "byte", + "description": "Minimum percentage of total stake needed to vote for a result to be\nconsidered valid." + }, + "threshold": { + "type": "string", + "format": "byte", + "description": "Minimum proportion of Yes votes for proposal to pass. Default value: 0.5." + }, + "veto_threshold": { + "type": "string", + "format": "byte", + "description": "Minimum value of Veto votes to Total votes ratio for proposal to be\nvetoed. Default value: 1/3." + } + }, + "description": "TallyParams defines the params for tallying votes on governance proposals." + }, + "cosmos.gov.v1beta1.TallyResult": { + "type": "object", + "properties": { + "yes": { + "type": "string", + "description": "yes is the number of yes votes on a proposal." + }, + "abstain": { + "type": "string", + "description": "abstain is the number of abstain votes on a proposal." + }, + "no": { + "type": "string", + "description": "no is the number of no votes on a proposal." + }, + "no_with_veto": { + "type": "string", + "description": "no_with_veto is the number of no with veto votes on a proposal." + } + }, + "description": "TallyResult defines a standard tally for a governance proposal." + }, + "cosmos.gov.v1beta1.Vote": { + "type": "object", + "properties": { + "proposal_id": { + "type": "string", + "format": "uint64", + "description": "proposal_id defines the unique id of the proposal." + }, + "voter": { + "type": "string", + "description": "voter is the voter address of the proposal." + }, + "option": { + "description": "Deprecated: Prefer to use `options` instead. This field is set in queries\nif and only if `len(options) == 1` and that option has weight 1. In all\nother cases, this field will default to VOTE_OPTION_UNSPECIFIED.", + "type": "string", + "enum": [ + "VOTE_OPTION_UNSPECIFIED", + "VOTE_OPTION_YES", + "VOTE_OPTION_ABSTAIN", + "VOTE_OPTION_NO", + "VOTE_OPTION_NO_WITH_VETO" + ], + "default": "VOTE_OPTION_UNSPECIFIED" + }, + "options": { + "type": "array", + "items": { + "type": "object", + "properties": { + "option": { + "description": "option defines the valid vote options, it must not contain duplicate vote options.", + "type": "string", + "enum": [ + "VOTE_OPTION_UNSPECIFIED", + "VOTE_OPTION_YES", + "VOTE_OPTION_ABSTAIN", + "VOTE_OPTION_NO", + "VOTE_OPTION_NO_WITH_VETO" + ], + "default": "VOTE_OPTION_UNSPECIFIED" + }, + "weight": { + "type": "string", + "description": "weight is the vote weight associated with the vote option." + } + }, + "description": "WeightedVoteOption defines a unit of vote for vote split.\n\nSince: cosmos-sdk 0.43" + }, + "description": "options is the weighted vote options.\n\nSince: cosmos-sdk 0.43" + } + }, + "description": "Vote defines a vote on a governance proposal.\nA Vote consists of a proposal ID, the voter, and the vote option." + }, + "cosmos.gov.v1beta1.VoteOption": { + "type": "string", + "enum": [ + "VOTE_OPTION_UNSPECIFIED", + "VOTE_OPTION_YES", + "VOTE_OPTION_ABSTAIN", + "VOTE_OPTION_NO", + "VOTE_OPTION_NO_WITH_VETO" + ], + "default": "VOTE_OPTION_UNSPECIFIED", + "description": "VoteOption enumerates the valid vote options for a given governance proposal.\n\n - VOTE_OPTION_UNSPECIFIED: VOTE_OPTION_UNSPECIFIED defines a no-op vote option.\n - VOTE_OPTION_YES: VOTE_OPTION_YES defines a yes vote option.\n - VOTE_OPTION_ABSTAIN: VOTE_OPTION_ABSTAIN defines an abstain vote option.\n - VOTE_OPTION_NO: VOTE_OPTION_NO defines a no vote option.\n - VOTE_OPTION_NO_WITH_VETO: VOTE_OPTION_NO_WITH_VETO defines a no with veto vote option." + }, + "cosmos.gov.v1beta1.VotingParams": { + "type": "object", + "properties": { + "voting_period": { + "type": "string", + "description": "Duration of the voting period." + } + }, + "description": "VotingParams defines the params for voting on governance proposals." + }, + "cosmos.gov.v1beta1.WeightedVoteOption": { + "type": "object", + "properties": { + "option": { + "description": "option defines the valid vote options, it must not contain duplicate vote options.", + "type": "string", + "enum": [ + "VOTE_OPTION_UNSPECIFIED", + "VOTE_OPTION_YES", + "VOTE_OPTION_ABSTAIN", + "VOTE_OPTION_NO", + "VOTE_OPTION_NO_WITH_VETO" + ], + "default": "VOTE_OPTION_UNSPECIFIED" + }, + "weight": { + "type": "string", + "description": "weight is the vote weight associated with the vote option." + } + }, + "description": "WeightedVoteOption defines a unit of vote for vote split.\n\nSince: cosmos-sdk 0.43" + }, + "cosmos.gov.v1.Deposit": { + "type": "object", + "properties": { + "proposal_id": { + "type": "string", + "format": "uint64", + "description": "proposal_id defines the unique id of the proposal." + }, + "depositor": { + "type": "string", + "description": "depositor defines the deposit addresses from the proposals." + }, + "amount": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "description": "amount to be deposited by depositor." + } + }, + "description": "Deposit defines an amount deposited by an account address to an active\nproposal." + }, + "cosmos.gov.v1.DepositParams": { + "type": "object", + "properties": { + "min_deposit": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "description": "Minimum deposit for a proposal to enter voting period." + }, + "max_deposit_period": { + "type": "string", + "description": "Maximum period for Atom holders to deposit on a proposal. Initial value: 2\nmonths." + } + }, + "description": "DepositParams defines the params for deposits on governance proposals." + }, + "cosmos.gov.v1.Params": { + "type": "object", + "properties": { + "min_deposit": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "description": "Minimum deposit for a proposal to enter voting period." + }, + "max_deposit_period": { + "type": "string", + "description": "Maximum period for Atom holders to deposit on a proposal. Initial value: 2\nmonths." + }, + "voting_period": { + "type": "string", + "description": "Duration of the voting period." + }, + "quorum": { + "type": "string", + "description": "Minimum percentage of total stake needed to vote for a result to be\n considered valid." + }, + "threshold": { + "type": "string", + "description": "Minimum proportion of Yes votes for proposal to pass. Default value: 0.5." + }, + "veto_threshold": { + "type": "string", + "description": "Minimum value of Veto votes to Total votes ratio for proposal to be\n vetoed. Default value: 1/3." + }, + "min_initial_deposit_ratio": { + "type": "string", + "description": "The ratio representing the proportion of the deposit value that must be paid at proposal submission." + }, + "proposal_cancel_ratio": { + "type": "string", + "description": "The cancel ratio which will not be returned back to the depositors when a proposal is cancelled.\n\nSince: cosmos-sdk 0.50" + }, + "proposal_cancel_dest": { + "type": "string", + "description": "The address which will receive (proposal_cancel_ratio * deposit) proposal deposits.\nIf empty, the (proposal_cancel_ratio * deposit) proposal deposits will be burned.\n\nSince: cosmos-sdk 0.50" + }, + "expedited_voting_period": { + "type": "string", + "description": "Duration of the voting period of an expedited proposal.\n\nSince: cosmos-sdk 0.50" + }, + "expedited_threshold": { + "type": "string", + "description": "Minimum proportion of Yes votes for proposal to pass. Default value: 0.67.\n\nSince: cosmos-sdk 0.50" + }, + "expedited_min_deposit": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "description": "Minimum expedited deposit for a proposal to enter voting period." + }, + "burn_vote_quorum": { + "type": "boolean", + "description": "Since: cosmos-sdk 0.47", + "title": "burn deposits if a proposal does not meet quorum" + }, + "burn_proposal_deposit_prevote": { + "type": "boolean", + "description": "Since: cosmos-sdk 0.47", + "title": "burn deposits if the proposal does not enter voting period" + }, + "burn_vote_veto": { + "type": "boolean", + "description": "Since: cosmos-sdk 0.47", + "title": "burn deposits if quorum with vote type no_veto is met" + }, + "min_deposit_ratio": { + "type": "string", + "description": "The ratio representing the proportion of the deposit value minimum that must be met when making a deposit.\nDefault value: 0.01. Meaning that for a chain with a min_deposit of 100stake, a deposit of 1stake would be\nrequired.\n\nSince: cosmos-sdk 0.50" + }, + "proposal_cancel_max_period": { + "type": "string", + "description": "proposal_cancel_max_period defines how far in the voting period a proposer can cancel a proposal.\nIf the proposal is cancelled before the max cancel period, the deposit will be returned/burn to the\ndepositors, according to the proposal_cancel_ratio and proposal_cancel_dest parameters.\nAfter the max cancel period, the proposal cannot be cancelled anymore." + }, + "optimistic_authorized_addresses": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Since: x/gov v1.0.0", + "title": "optimistic_authorized_addresses is an optional governance parameter that limits the authorized accounts than can\nsubmit optimistic proposals" + }, + "optimistic_rejected_threshold": { + "type": "string", + "description": "optimistic rejected threshold defines at which percentage of NO votes, the optimistic proposal should fail and be\nconverted to a standard proposal. The threshold is expressed as a percentage of the total bonded tokens.\n\nSince: x/gov v1.0.0" + } + }, + "description": "Params defines the parameters for the x/gov module.\n\nSince: cosmos-sdk 0.47" + }, + "cosmos.gov.v1.Proposal": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uint64", + "description": "id defines the unique id of the proposal." + }, + "messages": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "description": "messages are the arbitrary messages to be executed if the proposal passes." + }, + "status": { + "description": "status defines the proposal status.", + "type": "string", + "enum": [ + "PROPOSAL_STATUS_UNSPECIFIED", + "PROPOSAL_STATUS_DEPOSIT_PERIOD", + "PROPOSAL_STATUS_VOTING_PERIOD", + "PROPOSAL_STATUS_PASSED", + "PROPOSAL_STATUS_REJECTED", + "PROPOSAL_STATUS_FAILED" + ], + "default": "PROPOSAL_STATUS_UNSPECIFIED" + }, + "final_tally_result": { + "description": "final_tally_result is the final tally result of the proposal. When\nquerying a proposal via gRPC, this field is not populated until the\nproposal's voting period has ended.", + "type": "object", + "properties": { + "yes_count": { + "type": "string", + "description": "yes_count is the number of yes votes on a proposal." + }, + "abstain_count": { + "type": "string", + "description": "abstain_count is the number of abstain votes on a proposal." + }, + "no_count": { + "type": "string", + "description": "no_count is the number of no votes on a proposal." + }, + "no_with_veto_count": { + "type": "string", + "description": "no_with_veto_count is the number of no with veto votes on a proposal." + }, + "spam_count": { + "type": "string", + "description": "spam_count is the number of spam votes on a proposal." + } + } + }, + "submit_time": { + "type": "string", + "format": "date-time", + "description": "submit_time is the time of proposal submission." + }, + "deposit_end_time": { + "type": "string", + "format": "date-time", + "description": "deposit_end_time is the end time for deposition." + }, + "total_deposit": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "description": "total_deposit is the total deposit on the proposal." + }, + "voting_start_time": { + "type": "string", + "format": "date-time", + "description": "voting_start_time is the starting time to vote on a proposal." + }, + "voting_end_time": { + "type": "string", + "format": "date-time", + "description": "voting_end_time is the end time of voting on a proposal." + }, + "metadata": { + "type": "string", + "title": "metadata is any arbitrary metadata attached to the proposal.\nthe recommended format of the metadata is to be found here:\nhttps://docs.cosmos.network/v0.47/modules/gov#proposal-3" + }, + "title": { + "type": "string", + "description": "Since: cosmos-sdk 0.47", + "title": "title is the title of the proposal" + }, + "summary": { + "type": "string", + "description": "Since: cosmos-sdk 0.47", + "title": "summary is a short summary of the proposal" + }, + "proposer": { + "type": "string", + "description": "Since: cosmos-sdk 0.47", + "title": "proposer is the address of the proposal sumbitter" + }, + "expedited": { + "type": "boolean", + "description": "Since: cosmos-sdk 0.50\nDeprecated: Use ProposalType instead.", + "title": "expedited defines if the proposal is expedited" + }, + "failed_reason": { + "type": "string", + "description": "Since: cosmos-sdk 0.50", + "title": "failed_reason defines the reason why the proposal failed" + }, + "proposal_type": { + "description": "Since: cosmos-sdk 0.51", + "title": "proposal_type defines the type of the proposal", + "type": "string", + "enum": [ + "PROPOSAL_TYPE_UNSPECIFIED", + "PROPOSAL_TYPE_STANDARD", + "PROPOSAL_TYPE_MULTIPLE_CHOICE", + "PROPOSAL_TYPE_OPTIMISTIC", + "PROPOSAL_TYPE_EXPEDITED" + ], + "default": "PROPOSAL_TYPE_UNSPECIFIED" + } + }, + "description": "Proposal defines the core field members of a governance proposal." + }, + "cosmos.gov.v1.ProposalStatus": { + "type": "string", + "enum": [ + "PROPOSAL_STATUS_UNSPECIFIED", + "PROPOSAL_STATUS_DEPOSIT_PERIOD", + "PROPOSAL_STATUS_VOTING_PERIOD", + "PROPOSAL_STATUS_PASSED", + "PROPOSAL_STATUS_REJECTED", + "PROPOSAL_STATUS_FAILED" + ], + "default": "PROPOSAL_STATUS_UNSPECIFIED", + "description": "ProposalStatus enumerates the valid statuses of a proposal.\n\n - PROPOSAL_STATUS_UNSPECIFIED: PROPOSAL_STATUS_UNSPECIFIED defines the default proposal status.\n - PROPOSAL_STATUS_DEPOSIT_PERIOD: PROPOSAL_STATUS_DEPOSIT_PERIOD defines a proposal status during the deposit\nperiod.\n - PROPOSAL_STATUS_VOTING_PERIOD: PROPOSAL_STATUS_VOTING_PERIOD defines a proposal status during the voting\nperiod.\n - PROPOSAL_STATUS_PASSED: PROPOSAL_STATUS_PASSED defines a proposal status of a proposal that has\npassed.\n - PROPOSAL_STATUS_REJECTED: PROPOSAL_STATUS_REJECTED defines a proposal status of a proposal that has\nbeen rejected.\n - PROPOSAL_STATUS_FAILED: PROPOSAL_STATUS_FAILED defines a proposal status of a proposal that has\nfailed." + }, + "cosmos.gov.v1.ProposalType": { + "type": "string", + "enum": [ + "PROPOSAL_TYPE_UNSPECIFIED", + "PROPOSAL_TYPE_STANDARD", + "PROPOSAL_TYPE_MULTIPLE_CHOICE", + "PROPOSAL_TYPE_OPTIMISTIC", + "PROPOSAL_TYPE_EXPEDITED" + ], + "default": "PROPOSAL_TYPE_UNSPECIFIED", + "description": "ProposalType enumerates the valid proposal types.\nAll proposal types are v1.Proposal which have different voting periods or tallying logic.\n\n - PROPOSAL_TYPE_UNSPECIFIED: PROPOSAL_TYPE_UNSPECIFIED defines no proposal type, which fallback to PROPOSAL_TYPE_STANDARD.\n - PROPOSAL_TYPE_STANDARD: PROPOSAL_TYPE_STANDARD defines the type for a standard proposal.\n - PROPOSAL_TYPE_MULTIPLE_CHOICE: PROPOSAL_TYPE_MULTIPLE_CHOICE defines the type for a multiple choice proposal.\n - PROPOSAL_TYPE_OPTIMISTIC: PROPOSAL_TYPE_OPTIMISTIC defines the type for an optimistic proposal.\n - PROPOSAL_TYPE_EXPEDITED: PROPOSAL_TYPE_EXPEDITED defines the type for an expedited proposal." + }, + "cosmos.gov.v1.QueryConstitutionResponse": { + "type": "object", + "properties": { + "constitution": { + "type": "string" + } + }, + "title": "QueryConstitutionResponse is the response type for the Query/Constitution RPC method" + }, + "cosmos.gov.v1.QueryDepositResponse": { + "type": "object", + "properties": { + "deposit": { + "type": "object", + "properties": { + "proposal_id": { + "type": "string", + "format": "uint64", + "description": "proposal_id defines the unique id of the proposal." + }, + "depositor": { + "type": "string", + "description": "depositor defines the deposit addresses from the proposals." + }, + "amount": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "description": "amount to be deposited by depositor." + } + }, + "description": "Deposit defines an amount deposited by an account address to an active\nproposal." + } + }, + "description": "QueryDepositResponse is the response type for the Query/Deposit RPC method." + }, + "cosmos.gov.v1.QueryDepositsResponse": { + "type": "object", + "properties": { + "deposits": { + "type": "array", + "items": { + "type": "object", + "properties": { + "proposal_id": { + "type": "string", + "format": "uint64", + "description": "proposal_id defines the unique id of the proposal." + }, + "depositor": { + "type": "string", + "description": "depositor defines the deposit addresses from the proposals." + }, + "amount": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "description": "amount to be deposited by depositor." + } + }, + "description": "Deposit defines an amount deposited by an account address to an active\nproposal." + }, + "description": "deposits defines the requested deposits." + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "description": "QueryDepositsResponse is the response type for the Query/Deposits RPC method." + }, + "cosmos.gov.v1.QueryParamsResponse": { + "type": "object", + "properties": { + "voting_params": { + "description": "Deprecated: Prefer to use `params` instead.\nvoting_params defines the parameters related to voting.", + "type": "object", + "properties": { + "voting_period": { + "type": "string", + "description": "Duration of the voting period." + } + } + }, + "deposit_params": { + "description": "Deprecated: Prefer to use `params` instead.\ndeposit_params defines the parameters related to deposit.", + "type": "object", + "properties": { + "min_deposit": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "description": "Minimum deposit for a proposal to enter voting period." + }, + "max_deposit_period": { + "type": "string", + "description": "Maximum period for Atom holders to deposit on a proposal. Initial value: 2\nmonths." + } + } + }, + "tally_params": { + "description": "Deprecated: Prefer to use `params` instead.\ntally_params defines the parameters related to tally.", + "type": "object", + "properties": { + "quorum": { + "type": "string", + "description": "Minimum percentage of total stake needed to vote for a result to be\nconsidered valid." + }, + "threshold": { + "type": "string", + "description": "Minimum proportion of Yes votes for proposal to pass. Default value: 0.5." + }, + "veto_threshold": { + "type": "string", + "description": "Minimum value of Veto votes to Total votes ratio for proposal to be\nvetoed. Default value: 1/3." + } + } + }, + "params": { + "description": "params defines all the parameters of x/gov module.\n\nSince: cosmos-sdk 0.47", + "type": "object", + "properties": { + "min_deposit": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "description": "Minimum deposit for a proposal to enter voting period." + }, + "max_deposit_period": { + "type": "string", + "description": "Maximum period for Atom holders to deposit on a proposal. Initial value: 2\nmonths." + }, + "voting_period": { + "type": "string", + "description": "Duration of the voting period." + }, + "quorum": { + "type": "string", + "description": "Minimum percentage of total stake needed to vote for a result to be\n considered valid." + }, + "threshold": { + "type": "string", + "description": "Minimum proportion of Yes votes for proposal to pass. Default value: 0.5." + }, + "veto_threshold": { + "type": "string", + "description": "Minimum value of Veto votes to Total votes ratio for proposal to be\n vetoed. Default value: 1/3." + }, + "min_initial_deposit_ratio": { + "type": "string", + "description": "The ratio representing the proportion of the deposit value that must be paid at proposal submission." + }, + "proposal_cancel_ratio": { + "type": "string", + "description": "The cancel ratio which will not be returned back to the depositors when a proposal is cancelled.\n\nSince: cosmos-sdk 0.50" + }, + "proposal_cancel_dest": { + "type": "string", + "description": "The address which will receive (proposal_cancel_ratio * deposit) proposal deposits.\nIf empty, the (proposal_cancel_ratio * deposit) proposal deposits will be burned.\n\nSince: cosmos-sdk 0.50" + }, + "expedited_voting_period": { + "type": "string", + "description": "Duration of the voting period of an expedited proposal.\n\nSince: cosmos-sdk 0.50" + }, + "expedited_threshold": { + "type": "string", + "description": "Minimum proportion of Yes votes for proposal to pass. Default value: 0.67.\n\nSince: cosmos-sdk 0.50" + }, + "expedited_min_deposit": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "description": "Minimum expedited deposit for a proposal to enter voting period." + }, + "burn_vote_quorum": { + "type": "boolean", + "description": "Since: cosmos-sdk 0.47", + "title": "burn deposits if a proposal does not meet quorum" + }, + "burn_proposal_deposit_prevote": { + "type": "boolean", + "description": "Since: cosmos-sdk 0.47", + "title": "burn deposits if the proposal does not enter voting period" + }, + "burn_vote_veto": { + "type": "boolean", + "description": "Since: cosmos-sdk 0.47", + "title": "burn deposits if quorum with vote type no_veto is met" + }, + "min_deposit_ratio": { + "type": "string", + "description": "The ratio representing the proportion of the deposit value minimum that must be met when making a deposit.\nDefault value: 0.01. Meaning that for a chain with a min_deposit of 100stake, a deposit of 1stake would be\nrequired.\n\nSince: cosmos-sdk 0.50" + }, + "proposal_cancel_max_period": { + "type": "string", + "description": "proposal_cancel_max_period defines how far in the voting period a proposer can cancel a proposal.\nIf the proposal is cancelled before the max cancel period, the deposit will be returned/burn to the\ndepositors, according to the proposal_cancel_ratio and proposal_cancel_dest parameters.\nAfter the max cancel period, the proposal cannot be cancelled anymore." + }, + "optimistic_authorized_addresses": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Since: x/gov v1.0.0", + "title": "optimistic_authorized_addresses is an optional governance parameter that limits the authorized accounts than can\nsubmit optimistic proposals" + }, + "optimistic_rejected_threshold": { + "type": "string", + "description": "optimistic rejected threshold defines at which percentage of NO votes, the optimistic proposal should fail and be\nconverted to a standard proposal. The threshold is expressed as a percentage of the total bonded tokens.\n\nSince: x/gov v1.0.0" + } + } + } + }, + "description": "QueryParamsResponse is the response type for the Query/Params RPC method." + }, + "cosmos.gov.v1.QueryProposalResponse": { + "type": "object", + "properties": { + "proposal": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uint64", + "description": "id defines the unique id of the proposal." + }, + "messages": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "description": "messages are the arbitrary messages to be executed if the proposal passes." + }, + "status": { + "description": "status defines the proposal status.", + "type": "string", + "enum": [ + "PROPOSAL_STATUS_UNSPECIFIED", + "PROPOSAL_STATUS_DEPOSIT_PERIOD", + "PROPOSAL_STATUS_VOTING_PERIOD", + "PROPOSAL_STATUS_PASSED", + "PROPOSAL_STATUS_REJECTED", + "PROPOSAL_STATUS_FAILED" + ], + "default": "PROPOSAL_STATUS_UNSPECIFIED" + }, + "final_tally_result": { + "description": "final_tally_result is the final tally result of the proposal. When\nquerying a proposal via gRPC, this field is not populated until the\nproposal's voting period has ended.", + "type": "object", + "properties": { + "yes_count": { + "type": "string", + "description": "yes_count is the number of yes votes on a proposal." + }, + "abstain_count": { + "type": "string", + "description": "abstain_count is the number of abstain votes on a proposal." + }, + "no_count": { + "type": "string", + "description": "no_count is the number of no votes on a proposal." + }, + "no_with_veto_count": { + "type": "string", + "description": "no_with_veto_count is the number of no with veto votes on a proposal." + }, + "spam_count": { + "type": "string", + "description": "spam_count is the number of spam votes on a proposal." + } + } + }, + "submit_time": { + "type": "string", + "format": "date-time", + "description": "submit_time is the time of proposal submission." + }, + "deposit_end_time": { + "type": "string", + "format": "date-time", + "description": "deposit_end_time is the end time for deposition." + }, + "total_deposit": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "description": "total_deposit is the total deposit on the proposal." + }, + "voting_start_time": { + "type": "string", + "format": "date-time", + "description": "voting_start_time is the starting time to vote on a proposal." + }, + "voting_end_time": { + "type": "string", + "format": "date-time", + "description": "voting_end_time is the end time of voting on a proposal." + }, + "metadata": { + "type": "string", + "title": "metadata is any arbitrary metadata attached to the proposal.\nthe recommended format of the metadata is to be found here:\nhttps://docs.cosmos.network/v0.47/modules/gov#proposal-3" + }, + "title": { + "type": "string", + "description": "Since: cosmos-sdk 0.47", + "title": "title is the title of the proposal" + }, + "summary": { + "type": "string", + "description": "Since: cosmos-sdk 0.47", + "title": "summary is a short summary of the proposal" + }, + "proposer": { + "type": "string", + "description": "Since: cosmos-sdk 0.47", + "title": "proposer is the address of the proposal sumbitter" + }, + "expedited": { + "type": "boolean", + "description": "Since: cosmos-sdk 0.50\nDeprecated: Use ProposalType instead.", + "title": "expedited defines if the proposal is expedited" + }, + "failed_reason": { + "type": "string", + "description": "Since: cosmos-sdk 0.50", + "title": "failed_reason defines the reason why the proposal failed" + }, + "proposal_type": { + "description": "Since: cosmos-sdk 0.51", + "title": "proposal_type defines the type of the proposal", + "type": "string", + "enum": [ + "PROPOSAL_TYPE_UNSPECIFIED", + "PROPOSAL_TYPE_STANDARD", + "PROPOSAL_TYPE_MULTIPLE_CHOICE", + "PROPOSAL_TYPE_OPTIMISTIC", + "PROPOSAL_TYPE_EXPEDITED" + ], + "default": "PROPOSAL_TYPE_UNSPECIFIED" + } + }, + "description": "Proposal defines the core field members of a governance proposal." + } + }, + "description": "QueryProposalResponse is the response type for the Query/Proposal RPC method." + }, + "cosmos.gov.v1.QueryProposalsResponse": { + "type": "object", + "properties": { + "proposals": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uint64", + "description": "id defines the unique id of the proposal." + }, + "messages": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "description": "messages are the arbitrary messages to be executed if the proposal passes." + }, + "status": { + "description": "status defines the proposal status.", + "type": "string", + "enum": [ + "PROPOSAL_STATUS_UNSPECIFIED", + "PROPOSAL_STATUS_DEPOSIT_PERIOD", + "PROPOSAL_STATUS_VOTING_PERIOD", + "PROPOSAL_STATUS_PASSED", + "PROPOSAL_STATUS_REJECTED", + "PROPOSAL_STATUS_FAILED" + ], + "default": "PROPOSAL_STATUS_UNSPECIFIED" + }, + "final_tally_result": { + "description": "final_tally_result is the final tally result of the proposal. When\nquerying a proposal via gRPC, this field is not populated until the\nproposal's voting period has ended.", + "type": "object", + "properties": { + "yes_count": { + "type": "string", + "description": "yes_count is the number of yes votes on a proposal." + }, + "abstain_count": { + "type": "string", + "description": "abstain_count is the number of abstain votes on a proposal." + }, + "no_count": { + "type": "string", + "description": "no_count is the number of no votes on a proposal." + }, + "no_with_veto_count": { + "type": "string", + "description": "no_with_veto_count is the number of no with veto votes on a proposal." + }, + "spam_count": { + "type": "string", + "description": "spam_count is the number of spam votes on a proposal." + } + } + }, + "submit_time": { + "type": "string", + "format": "date-time", + "description": "submit_time is the time of proposal submission." + }, + "deposit_end_time": { + "type": "string", + "format": "date-time", + "description": "deposit_end_time is the end time for deposition." + }, + "total_deposit": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "description": "total_deposit is the total deposit on the proposal." + }, + "voting_start_time": { + "type": "string", + "format": "date-time", + "description": "voting_start_time is the starting time to vote on a proposal." + }, + "voting_end_time": { + "type": "string", + "format": "date-time", + "description": "voting_end_time is the end time of voting on a proposal." + }, + "metadata": { + "type": "string", + "title": "metadata is any arbitrary metadata attached to the proposal.\nthe recommended format of the metadata is to be found here:\nhttps://docs.cosmos.network/v0.47/modules/gov#proposal-3" + }, + "title": { + "type": "string", + "description": "Since: cosmos-sdk 0.47", + "title": "title is the title of the proposal" + }, + "summary": { + "type": "string", + "description": "Since: cosmos-sdk 0.47", + "title": "summary is a short summary of the proposal" + }, + "proposer": { + "type": "string", + "description": "Since: cosmos-sdk 0.47", + "title": "proposer is the address of the proposal sumbitter" + }, + "expedited": { + "type": "boolean", + "description": "Since: cosmos-sdk 0.50\nDeprecated: Use ProposalType instead.", + "title": "expedited defines if the proposal is expedited" + }, + "failed_reason": { + "type": "string", + "description": "Since: cosmos-sdk 0.50", + "title": "failed_reason defines the reason why the proposal failed" + }, + "proposal_type": { + "description": "Since: cosmos-sdk 0.51", + "title": "proposal_type defines the type of the proposal", + "type": "string", + "enum": [ + "PROPOSAL_TYPE_UNSPECIFIED", + "PROPOSAL_TYPE_STANDARD", + "PROPOSAL_TYPE_MULTIPLE_CHOICE", + "PROPOSAL_TYPE_OPTIMISTIC", + "PROPOSAL_TYPE_EXPEDITED" + ], + "default": "PROPOSAL_TYPE_UNSPECIFIED" + } + }, + "description": "Proposal defines the core field members of a governance proposal." + }, + "description": "proposals defines all the requested governance proposals." + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "description": "QueryProposalsResponse is the response type for the Query/Proposals RPC\nmethod." + }, + "cosmos.gov.v1.QueryTallyResultResponse": { + "type": "object", + "properties": { + "tally": { + "description": "tally defines the requested tally.", + "type": "object", + "properties": { + "yes_count": { + "type": "string", + "description": "yes_count is the number of yes votes on a proposal." + }, + "abstain_count": { + "type": "string", + "description": "abstain_count is the number of abstain votes on a proposal." + }, + "no_count": { + "type": "string", + "description": "no_count is the number of no votes on a proposal." + }, + "no_with_veto_count": { + "type": "string", + "description": "no_with_veto_count is the number of no with veto votes on a proposal." + }, + "spam_count": { + "type": "string", + "description": "spam_count is the number of spam votes on a proposal." + } + } + } + }, + "description": "QueryTallyResultResponse is the response type for the Query/Tally RPC method." + }, + "cosmos.gov.v1.QueryVoteResponse": { + "type": "object", + "properties": { + "vote": { + "type": "object", + "properties": { + "proposal_id": { + "type": "string", + "format": "uint64", + "description": "proposal_id defines the unique id of the proposal." + }, + "voter": { + "type": "string", + "description": "voter is the voter address of the proposal." + }, + "options": { + "type": "array", + "items": { + "type": "object", + "properties": { + "option": { + "description": "option defines the valid vote options, it must not contain duplicate vote options.", + "type": "string", + "enum": [ + "VOTE_OPTION_UNSPECIFIED", + "VOTE_OPTION_ONE", + "VOTE_OPTION_YES", + "VOTE_OPTION_TWO", + "VOTE_OPTION_ABSTAIN", + "VOTE_OPTION_THREE", + "VOTE_OPTION_NO", + "VOTE_OPTION_FOUR", + "VOTE_OPTION_NO_WITH_VETO", + "VOTE_OPTION_SPAM" + ], + "default": "VOTE_OPTION_UNSPECIFIED" + }, + "weight": { + "type": "string", + "description": "weight is the vote weight associated with the vote option." + } + }, + "description": "WeightedVoteOption defines a unit of vote for vote split." + }, + "description": "options is the weighted vote options." + }, + "metadata": { + "type": "string", + "title": "metadata is any arbitrary metadata attached to the vote.\nthe recommended format of the metadata is to be found here: https://docs.cosmos.network/v0.47/modules/gov#vote-5" + } + }, + "description": "Vote defines a vote on a governance proposal.\nA Vote consists of a proposal ID, the voter, and the vote option." + } + }, + "description": "QueryVoteResponse is the response type for the Query/Vote RPC method." + }, + "cosmos.gov.v1.QueryVotesResponse": { + "type": "object", + "properties": { + "votes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "proposal_id": { + "type": "string", + "format": "uint64", + "description": "proposal_id defines the unique id of the proposal." + }, + "voter": { + "type": "string", + "description": "voter is the voter address of the proposal." + }, + "options": { + "type": "array", + "items": { + "type": "object", + "properties": { + "option": { + "description": "option defines the valid vote options, it must not contain duplicate vote options.", + "type": "string", + "enum": [ + "VOTE_OPTION_UNSPECIFIED", + "VOTE_OPTION_ONE", + "VOTE_OPTION_YES", + "VOTE_OPTION_TWO", + "VOTE_OPTION_ABSTAIN", + "VOTE_OPTION_THREE", + "VOTE_OPTION_NO", + "VOTE_OPTION_FOUR", + "VOTE_OPTION_NO_WITH_VETO", + "VOTE_OPTION_SPAM" + ], + "default": "VOTE_OPTION_UNSPECIFIED" + }, + "weight": { + "type": "string", + "description": "weight is the vote weight associated with the vote option." + } + }, + "description": "WeightedVoteOption defines a unit of vote for vote split." + }, + "description": "options is the weighted vote options." + }, + "metadata": { + "type": "string", + "title": "metadata is any arbitrary metadata attached to the vote.\nthe recommended format of the metadata is to be found here: https://docs.cosmos.network/v0.47/modules/gov#vote-5" + } + }, + "description": "Vote defines a vote on a governance proposal.\nA Vote consists of a proposal ID, the voter, and the vote option." + }, + "description": "votes defines the queried votes." + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "description": "QueryVotesResponse is the response type for the Query/Votes RPC method." + }, + "cosmos.gov.v1.TallyParams": { + "type": "object", + "properties": { + "quorum": { + "type": "string", + "description": "Minimum percentage of total stake needed to vote for a result to be\nconsidered valid." + }, + "threshold": { + "type": "string", + "description": "Minimum proportion of Yes votes for proposal to pass. Default value: 0.5." + }, + "veto_threshold": { + "type": "string", + "description": "Minimum value of Veto votes to Total votes ratio for proposal to be\nvetoed. Default value: 1/3." + } + }, + "description": "TallyParams defines the params for tallying votes on governance proposals." + }, + "cosmos.gov.v1.TallyResult": { + "type": "object", + "properties": { + "yes_count": { + "type": "string", + "description": "yes_count is the number of yes votes on a proposal." + }, + "abstain_count": { + "type": "string", + "description": "abstain_count is the number of abstain votes on a proposal." + }, + "no_count": { + "type": "string", + "description": "no_count is the number of no votes on a proposal." + }, + "no_with_veto_count": { + "type": "string", + "description": "no_with_veto_count is the number of no with veto votes on a proposal." + }, + "spam_count": { + "type": "string", + "description": "spam_count is the number of spam votes on a proposal." + } + }, + "description": "TallyResult defines a standard tally for a governance proposal." + }, + "cosmos.gov.v1.Vote": { + "type": "object", + "properties": { + "proposal_id": { + "type": "string", + "format": "uint64", + "description": "proposal_id defines the unique id of the proposal." + }, + "voter": { + "type": "string", + "description": "voter is the voter address of the proposal." + }, + "options": { + "type": "array", + "items": { + "type": "object", + "properties": { + "option": { + "description": "option defines the valid vote options, it must not contain duplicate vote options.", + "type": "string", + "enum": [ + "VOTE_OPTION_UNSPECIFIED", + "VOTE_OPTION_ONE", + "VOTE_OPTION_YES", + "VOTE_OPTION_TWO", + "VOTE_OPTION_ABSTAIN", + "VOTE_OPTION_THREE", + "VOTE_OPTION_NO", + "VOTE_OPTION_FOUR", + "VOTE_OPTION_NO_WITH_VETO", + "VOTE_OPTION_SPAM" + ], + "default": "VOTE_OPTION_UNSPECIFIED" + }, + "weight": { + "type": "string", + "description": "weight is the vote weight associated with the vote option." + } + }, + "description": "WeightedVoteOption defines a unit of vote for vote split." + }, + "description": "options is the weighted vote options." + }, + "metadata": { + "type": "string", + "title": "metadata is any arbitrary metadata attached to the vote.\nthe recommended format of the metadata is to be found here: https://docs.cosmos.network/v0.47/modules/gov#vote-5" + } + }, + "description": "Vote defines a vote on a governance proposal.\nA Vote consists of a proposal ID, the voter, and the vote option." + }, + "cosmos.gov.v1.VoteOption": { + "type": "string", + "enum": [ + "VOTE_OPTION_UNSPECIFIED", + "VOTE_OPTION_ONE", + "VOTE_OPTION_YES", + "VOTE_OPTION_TWO", + "VOTE_OPTION_ABSTAIN", + "VOTE_OPTION_THREE", + "VOTE_OPTION_NO", + "VOTE_OPTION_FOUR", + "VOTE_OPTION_NO_WITH_VETO", + "VOTE_OPTION_SPAM" + ], + "default": "VOTE_OPTION_UNSPECIFIED", + "description": "VoteOption enumerates the valid vote options for a given governance proposal.\n\n - VOTE_OPTION_UNSPECIFIED: VOTE_OPTION_UNSPECIFIED defines a no-op vote option.\n - VOTE_OPTION_ONE: VOTE_OPTION_ONE defines the first proposal vote option.\n - VOTE_OPTION_YES: VOTE_OPTION_YES defines the yes proposal vote option.\n - VOTE_OPTION_TWO: VOTE_OPTION_TWO defines the second proposal vote option.\n - VOTE_OPTION_ABSTAIN: VOTE_OPTION_ABSTAIN defines the abstain proposal vote option.\n - VOTE_OPTION_THREE: VOTE_OPTION_THREE defines the third proposal vote option.\n - VOTE_OPTION_NO: VOTE_OPTION_NO defines the no proposal vote option.\n - VOTE_OPTION_FOUR: VOTE_OPTION_FOUR defines the fourth proposal vote option.\n - VOTE_OPTION_NO_WITH_VETO: VOTE_OPTION_NO_WITH_VETO defines the no with veto proposal vote option.\n - VOTE_OPTION_SPAM: VOTE_OPTION_SPAM defines the spam proposal vote option." + }, + "cosmos.gov.v1.VotingParams": { + "type": "object", + "properties": { + "voting_period": { + "type": "string", + "description": "Duration of the voting period." + } + }, + "description": "VotingParams defines the params for voting on governance proposals." + }, + "cosmos.gov.v1.WeightedVoteOption": { + "type": "object", + "properties": { + "option": { + "description": "option defines the valid vote options, it must not contain duplicate vote options.", + "type": "string", + "enum": [ + "VOTE_OPTION_UNSPECIFIED", + "VOTE_OPTION_ONE", + "VOTE_OPTION_YES", + "VOTE_OPTION_TWO", + "VOTE_OPTION_ABSTAIN", + "VOTE_OPTION_THREE", + "VOTE_OPTION_NO", + "VOTE_OPTION_FOUR", + "VOTE_OPTION_NO_WITH_VETO", + "VOTE_OPTION_SPAM" + ], + "default": "VOTE_OPTION_UNSPECIFIED" + }, + "weight": { + "type": "string", + "description": "weight is the vote weight associated with the vote option." + } + }, + "description": "WeightedVoteOption defines a unit of vote for vote split." + }, + "cosmos.slashing.v1beta1.Params": { + "type": "object", + "properties": { + "signed_blocks_window": { + "type": "string", + "format": "int64" + }, + "min_signed_per_window": { + "type": "string", + "format": "byte" + }, + "downtime_jail_duration": { + "type": "string" + }, + "slash_fraction_double_sign": { + "type": "string", + "format": "byte" + }, + "slash_fraction_downtime": { + "type": "string", + "format": "byte" + } + }, + "description": "Params represents the parameters used for by the slashing module." + }, + "cosmos.slashing.v1beta1.QueryParamsResponse": { + "type": "object", + "properties": { + "params": { + "type": "object", + "properties": { + "signed_blocks_window": { + "type": "string", + "format": "int64" + }, + "min_signed_per_window": { + "type": "string", + "format": "byte" + }, + "downtime_jail_duration": { + "type": "string" + }, + "slash_fraction_double_sign": { + "type": "string", + "format": "byte" + }, + "slash_fraction_downtime": { + "type": "string", + "format": "byte" + } + }, + "description": "Params represents the parameters used for by the slashing module." + } + }, + "title": "QueryParamsResponse is the response type for the Query/Params RPC method" + }, + "cosmos.slashing.v1beta1.QuerySigningInfoResponse": { + "type": "object", + "properties": { + "val_signing_info": { + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "start_height": { + "type": "string", + "format": "int64", + "title": "Height at which validator was first a candidate OR was un-jailed" + }, + "index_offset": { + "type": "string", + "format": "int64", + "description": "Index which is incremented every time a validator is bonded in a block and\n_may_ have signed a pre-commit or not. This in conjunction with the\nsigned_blocks_window param determines the index in the missed block bitmap." + }, + "jailed_until": { + "type": "string", + "format": "date-time", + "description": "Timestamp until which the validator is jailed due to liveness downtime." + }, + "tombstoned": { + "type": "boolean", + "description": "Whether or not a validator has been tombstoned (killed out of validator\nset). It is set once the validator commits an equivocation or for any other\nconfigured misbehavior." + }, + "missed_blocks_counter": { + "type": "string", + "format": "int64", + "description": "A counter of missed (unsigned) blocks. It is used to avoid unnecessary\nreads in the missed block bitmap." + } + }, + "description": "ValidatorSigningInfo defines a validator's signing info for monitoring their\nliveness activity.", + "title": "val_signing_info is the signing info of requested val cons address" + } + }, + "title": "QuerySigningInfoResponse is the response type for the Query/SigningInfo RPC\nmethod" + }, + "cosmos.slashing.v1beta1.QuerySigningInfosResponse": { + "type": "object", + "properties": { + "info": { + "type": "array", + "items": { + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "start_height": { + "type": "string", + "format": "int64", + "title": "Height at which validator was first a candidate OR was un-jailed" + }, + "index_offset": { + "type": "string", + "format": "int64", + "description": "Index which is incremented every time a validator is bonded in a block and\n_may_ have signed a pre-commit or not. This in conjunction with the\nsigned_blocks_window param determines the index in the missed block bitmap." + }, + "jailed_until": { + "type": "string", + "format": "date-time", + "description": "Timestamp until which the validator is jailed due to liveness downtime." + }, + "tombstoned": { + "type": "boolean", + "description": "Whether or not a validator has been tombstoned (killed out of validator\nset). It is set once the validator commits an equivocation or for any other\nconfigured misbehavior." + }, + "missed_blocks_counter": { + "type": "string", + "format": "int64", + "description": "A counter of missed (unsigned) blocks. It is used to avoid unnecessary\nreads in the missed block bitmap." + } + }, + "description": "ValidatorSigningInfo defines a validator's signing info for monitoring their\nliveness activity." + }, + "title": "info is the signing info of all validators" + }, + "pagination": { + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + }, + "description": "PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }" + } + }, + "title": "QuerySigningInfosResponse is the response type for the Query/SigningInfos RPC\nmethod" + }, + "cosmos.slashing.v1beta1.ValidatorSigningInfo": { + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "start_height": { + "type": "string", + "format": "int64", + "title": "Height at which validator was first a candidate OR was un-jailed" + }, + "index_offset": { + "type": "string", + "format": "int64", + "description": "Index which is incremented every time a validator is bonded in a block and\n_may_ have signed a pre-commit or not. This in conjunction with the\nsigned_blocks_window param determines the index in the missed block bitmap." + }, + "jailed_until": { + "type": "string", + "format": "date-time", + "description": "Timestamp until which the validator is jailed due to liveness downtime." + }, + "tombstoned": { + "type": "boolean", + "description": "Whether or not a validator has been tombstoned (killed out of validator\nset). It is set once the validator commits an equivocation or for any other\nconfigured misbehavior." + }, + "missed_blocks_counter": { + "type": "string", + "format": "int64", + "description": "A counter of missed (unsigned) blocks. It is used to avoid unnecessary\nreads in the missed block bitmap." + } + }, + "description": "ValidatorSigningInfo defines a validator's signing info for monitoring their\nliveness activity." + }, + "cosmos.staking.v1beta1.BondStatus": { + "type": "string", + "enum": [ + "BOND_STATUS_UNSPECIFIED", + "BOND_STATUS_UNBONDED", + "BOND_STATUS_UNBONDING", + "BOND_STATUS_BONDED" + ], + "default": "BOND_STATUS_UNSPECIFIED", + "description": "BondStatus is the status of a validator.\n\n - BOND_STATUS_UNSPECIFIED: UNSPECIFIED defines an invalid validator status.\n - BOND_STATUS_UNBONDED: UNBONDED defines a validator that is not bonded.\n - BOND_STATUS_UNBONDING: UNBONDING defines a validator that is unbonding.\n - BOND_STATUS_BONDED: BONDED defines a validator that is bonded." + }, + "cosmos.staking.v1beta1.Commission": { + "type": "object", + "properties": { + "commission_rates": { + "description": "commission_rates defines the initial commission rates to be used for creating a validator.", + "type": "object", + "properties": { + "rate": { + "type": "string", + "description": "rate is the commission rate charged to delegators, as a fraction." + }, + "max_rate": { + "type": "string", + "description": "max_rate defines the maximum commission rate which validator can ever charge, as a fraction." + }, + "max_change_rate": { + "type": "string", + "description": "max_change_rate defines the maximum daily increase of the validator commission, as a fraction." + } + } + }, + "update_time": { + "type": "string", + "format": "date-time", + "description": "update_time is the last time the commission rate was changed." + } + }, + "description": "Commission defines commission parameters for a given validator." + }, + "cosmos.staking.v1beta1.CommissionRates": { + "type": "object", + "properties": { + "rate": { + "type": "string", + "description": "rate is the commission rate charged to delegators, as a fraction." + }, + "max_rate": { + "type": "string", + "description": "max_rate defines the maximum commission rate which validator can ever charge, as a fraction." + }, + "max_change_rate": { + "type": "string", + "description": "max_change_rate defines the maximum daily increase of the validator commission, as a fraction." + } + }, + "description": "CommissionRates defines the initial commission rates to be used for creating\na validator." + }, + "cosmos.staking.v1beta1.Delegation": { + "type": "object", + "properties": { + "delegator_address": { + "type": "string", + "description": "delegator_address is the encoded address of the delegator." + }, + "validator_address": { + "type": "string", + "description": "validator_address is the encoded address of the validator." + }, + "shares": { + "type": "string", + "description": "shares define the delegation shares received." + } + }, + "description": "Delegation represents the bond with tokens held by an account. It is\nowned by one delegator, and is associated with the voting power of one\nvalidator." + }, + "cosmos.staking.v1beta1.DelegationResponse": { + "type": "object", + "properties": { + "delegation": { + "type": "object", + "properties": { + "delegator_address": { + "type": "string", + "description": "delegator_address is the encoded address of the delegator." + }, + "validator_address": { + "type": "string", + "description": "validator_address is the encoded address of the validator." + }, + "shares": { + "type": "string", + "description": "shares define the delegation shares received." + } + }, + "description": "Delegation represents the bond with tokens held by an account. It is\nowned by one delegator, and is associated with the voting power of one\nvalidator." + }, + "balance": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + } + }, + "description": "DelegationResponse is equivalent to Delegation except that it contains a\nbalance in addition to shares which is more suitable for client responses." + }, + "cosmos.staking.v1beta1.Description": { + "type": "object", + "properties": { + "moniker": { + "type": "string", + "description": "moniker defines a human-readable name for the validator." + }, + "identity": { + "type": "string", + "description": "identity defines an optional identity signature (ex. UPort or Keybase)." + }, + "website": { + "type": "string", + "description": "website defines an optional website link." + }, + "security_contact": { + "type": "string", + "description": "security_contact defines an optional email for security contact." + }, + "details": { + "type": "string", + "description": "details define other optional details." + } + }, + "description": "Description defines a validator description." + }, + "cosmos.staking.v1beta1.HistoricalInfo": { + "type": "object", + "properties": { + "header": { + "type": "object", + "properties": { + "version": { + "title": "basic block info", + "type": "object", + "properties": { + "block": { + "type": "string", + "format": "uint64" + }, + "app": { + "type": "string", + "format": "uint64" + } + }, + "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." + }, + "chain_id": { + "type": "string" + }, + "height": { + "type": "string", + "format": "int64" + }, + "time": { + "type": "string", + "format": "date-time" + }, + "last_block_id": { + "title": "prev block info", + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } + } + }, + "last_commit_hash": { + "type": "string", + "format": "byte", + "title": "hashes of block data" + }, + "data_hash": { + "type": "string", + "format": "byte" + }, + "validators_hash": { + "type": "string", + "format": "byte", + "title": "hashes from the app output from the prev block" + }, + "next_validators_hash": { + "type": "string", + "format": "byte" + }, + "consensus_hash": { + "type": "string", + "format": "byte" + }, + "app_hash": { + "type": "string", + "format": "byte" + }, + "last_results_hash": { + "type": "string", + "format": "byte" + }, + "evidence_hash": { + "type": "string", + "format": "byte", + "title": "consensus info" + }, + "proposer_address": { + "type": "string", + "format": "byte" + } + }, + "description": "Header defines the structure of a block header." + }, + "valset": { + "type": "array", + "items": { + "type": "object", + "properties": { + "operator_address": { + "type": "string", + "description": "operator_address defines the address of the validator's operator; bech encoded in JSON." + }, + "consensus_pubkey": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "jailed": { + "type": "boolean", + "description": "jailed defined whether the validator has been jailed from bonded status or not." + }, + "status": { + "description": "status is the validator status (bonded/unbonding/unbonded).", + "type": "string", + "enum": [ + "BOND_STATUS_UNSPECIFIED", + "BOND_STATUS_UNBONDED", + "BOND_STATUS_UNBONDING", + "BOND_STATUS_BONDED" + ], + "default": "BOND_STATUS_UNSPECIFIED" + }, + "tokens": { + "type": "string", + "description": "tokens define the delegated tokens (incl. self-delegation)." + }, + "delegator_shares": { + "type": "string", + "description": "delegator_shares defines total shares issued to a validator's delegators." + }, + "description": { + "description": "description defines the description terms for the validator.", + "type": "object", + "properties": { + "moniker": { + "type": "string", + "description": "moniker defines a human-readable name for the validator." + }, + "identity": { + "type": "string", + "description": "identity defines an optional identity signature (ex. UPort or Keybase)." + }, + "website": { + "type": "string", + "description": "website defines an optional website link." + }, + "security_contact": { + "type": "string", + "description": "security_contact defines an optional email for security contact." + }, + "details": { + "type": "string", + "description": "details define other optional details." + } + } + }, + "unbonding_height": { + "type": "string", + "format": "int64", + "description": "unbonding_height defines, if unbonding, the height at which this validator has begun unbonding." + }, + "unbonding_time": { + "type": "string", + "format": "date-time", + "description": "unbonding_time defines, if unbonding, the min time for the validator to complete unbonding." + }, + "commission": { + "description": "commission defines the commission parameters.", + "type": "object", + "properties": { + "commission_rates": { + "description": "commission_rates defines the initial commission rates to be used for creating a validator.", + "type": "object", + "properties": { + "rate": { + "type": "string", + "description": "rate is the commission rate charged to delegators, as a fraction." + }, + "max_rate": { + "type": "string", + "description": "max_rate defines the maximum commission rate which validator can ever charge, as a fraction." + }, + "max_change_rate": { + "type": "string", + "description": "max_change_rate defines the maximum daily increase of the validator commission, as a fraction." + } + } + }, + "update_time": { + "type": "string", + "format": "date-time", + "description": "update_time is the last time the commission rate was changed." + } + } + }, + "min_self_delegation": { + "type": "string", + "description": "min_self_delegation is the validator's self declared minimum self delegation.\n\nSince: cosmos-sdk 0.46" + }, + "unbonding_on_hold_ref_count": { + "type": "string", + "format": "int64", + "title": "strictly positive if this validator's unbonding has been stopped by external modules" + }, + "unbonding_ids": { + "type": "array", + "items": { + "type": "string", + "format": "uint64" + }, + "title": "list of unbonding ids, each uniquely identifying an unbonding of this validator" + } + }, + "description": "Validator defines a validator, together with the total amount of the\nValidator's bond shares and their exchange rate to coins. Slashing results in\na decrease in the exchange rate, allowing correct calculation of future\nundelegations without iterating over delegators. When coins are delegated to\nthis validator, the validator is credited with a delegation whose number of\nbond shares is based on the amount of coins delegated divided by the current\nexchange rate. Voting power can be calculated as total bonded shares\nmultiplied by exchange rate." + } + } + }, + "description": "HistoricalInfo contains header and validator information for a given block.\nIt is stored as part of staking module's state, which persists the `n` most\nrecent HistoricalInfo\n(`n` is set by the staking module's `historical_entries` parameter)." + }, + "cosmos.staking.v1beta1.HistoricalRecord": { + "type": "object", + "properties": { + "apphash": { + "type": "string", + "format": "byte" + }, + "time": { + "type": "string", + "format": "date-time" + }, + "validators_hash": { + "type": "string", + "format": "byte" + } + }, + "description": "Historical contains a set of minimum values needed for evaluating historical validator sets and blocks.\nIt is stored as part of staking module's state, which persists the `n` most\nrecent HistoricalInfo\n(`n` is set by the staking module's `historical_entries` parameter)." + }, + "cosmos.staking.v1beta1.Params": { + "type": "object", + "properties": { + "unbonding_time": { + "type": "string", + "description": "unbonding_time is the time duration of unbonding." + }, + "max_validators": { + "type": "integer", + "format": "int64", + "description": "max_validators is the maximum number of validators." + }, + "max_entries": { + "type": "integer", + "format": "int64", + "description": "max_entries is the max entries for either unbonding delegation or redelegation (per pair/trio)." + }, + "historical_entries": { + "type": "integer", + "format": "int64", + "description": "historical_entries is the number of historical entries to persist." + }, + "bond_denom": { + "type": "string", + "description": "bond_denom defines the bondable coin denomination." + }, + "min_commission_rate": { + "type": "string", + "title": "min_commission_rate is the chain-wide minimum commission rate that a validator can charge their delegators" + }, + "key_rotation_fee": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto.", + "title": "key_rotation_fee is fee to be spent when rotating validator's key\n(either consensus pubkey or operator key)" + } + }, + "description": "Params defines the parameters for the x/staking module." + }, + "cosmos.staking.v1beta1.Pool": { + "type": "object", + "properties": { + "not_bonded_tokens": { + "type": "string" + }, + "bonded_tokens": { + "type": "string" + } + }, + "description": "Pool is used for tracking bonded and not-bonded token supply of the bond\ndenomination." + }, + "cosmos.staking.v1beta1.QueryDelegationResponse": { + "type": "object", + "properties": { + "delegation_response": { + "type": "object", + "properties": { + "delegation": { + "type": "object", + "properties": { + "delegator_address": { + "type": "string", + "description": "delegator_address is the encoded address of the delegator." + }, + "validator_address": { + "type": "string", + "description": "validator_address is the encoded address of the validator." + }, + "shares": { + "type": "string", + "description": "shares define the delegation shares received." + } + }, + "description": "Delegation represents the bond with tokens held by an account. It is\nowned by one delegator, and is associated with the voting power of one\nvalidator." + }, + "balance": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + } + }, + "description": "DelegationResponse is equivalent to Delegation except that it contains a\nbalance in addition to shares which is more suitable for client responses." + } + }, + "description": "QueryDelegationResponse is response type for the Query/Delegation RPC method." + }, + "cosmos.staking.v1beta1.QueryDelegatorDelegationsResponse": { + "type": "object", + "properties": { + "delegation_responses": { + "type": "array", + "items": { + "type": "object", + "properties": { + "delegation": { + "type": "object", + "properties": { + "delegator_address": { + "type": "string", + "description": "delegator_address is the encoded address of the delegator." + }, + "validator_address": { + "type": "string", + "description": "validator_address is the encoded address of the validator." + }, + "shares": { + "type": "string", + "description": "shares define the delegation shares received." + } + }, + "description": "Delegation represents the bond with tokens held by an account. It is\nowned by one delegator, and is associated with the voting power of one\nvalidator." + }, + "balance": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + } + }, + "description": "DelegationResponse is equivalent to Delegation except that it contains a\nbalance in addition to shares which is more suitable for client responses." + }, + "description": "delegation_responses defines all the delegations' info of a delegator." + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "description": "QueryDelegatorDelegationsResponse is response type for the\nQuery/DelegatorDelegations RPC method." + }, + "cosmos.staking.v1beta1.QueryDelegatorUnbondingDelegationsResponse": { + "type": "object", + "properties": { + "unbonding_responses": { + "type": "array", + "items": { + "type": "object", + "properties": { + "delegator_address": { + "type": "string", + "description": "delegator_address is the encoded address of the delegator." + }, + "validator_address": { + "type": "string", + "description": "validator_address is the encoded address of the validator." + }, + "entries": { + "type": "array", + "items": { + "type": "object", + "properties": { + "creation_height": { + "type": "string", + "format": "int64", + "description": "creation_height is the height which the unbonding took place." + }, + "completion_time": { + "type": "string", + "format": "date-time", + "description": "completion_time is the unix time for unbonding completion." + }, + "initial_balance": { + "type": "string", + "description": "initial_balance defines the tokens initially scheduled to receive at completion." + }, + "balance": { + "type": "string", + "description": "balance defines the tokens to receive at completion." + }, + "unbonding_id": { + "type": "string", + "format": "uint64", + "title": "Incrementing id that uniquely identifies this entry" + }, + "unbonding_on_hold_ref_count": { + "type": "string", + "format": "int64", + "title": "Strictly positive if this entry's unbonding has been stopped by external modules" + } + }, + "description": "UnbondingDelegationEntry defines an unbonding object with relevant metadata." + }, + "description": "entries are the unbonding delegation entries." + } + }, + "description": "UnbondingDelegation stores all of a single delegator's unbonding bonds\nfor a single validator in an time-ordered list." + } + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "description": "QueryUnbondingDelegatorDelegationsResponse is response type for the\nQuery/UnbondingDelegatorDelegations RPC method." + }, + "cosmos.staking.v1beta1.QueryDelegatorValidatorResponse": { + "type": "object", + "properties": { + "validator": { + "type": "object", + "properties": { + "operator_address": { + "type": "string", + "description": "operator_address defines the address of the validator's operator; bech encoded in JSON." + }, + "consensus_pubkey": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "jailed": { + "type": "boolean", + "description": "jailed defined whether the validator has been jailed from bonded status or not." + }, + "status": { + "description": "status is the validator status (bonded/unbonding/unbonded).", + "type": "string", + "enum": [ + "BOND_STATUS_UNSPECIFIED", + "BOND_STATUS_UNBONDED", + "BOND_STATUS_UNBONDING", + "BOND_STATUS_BONDED" + ], + "default": "BOND_STATUS_UNSPECIFIED" + }, + "tokens": { + "type": "string", + "description": "tokens define the delegated tokens (incl. self-delegation)." + }, + "delegator_shares": { + "type": "string", + "description": "delegator_shares defines total shares issued to a validator's delegators." + }, + "description": { + "description": "description defines the description terms for the validator.", + "type": "object", + "properties": { + "moniker": { + "type": "string", + "description": "moniker defines a human-readable name for the validator." + }, + "identity": { + "type": "string", + "description": "identity defines an optional identity signature (ex. UPort or Keybase)." + }, + "website": { + "type": "string", + "description": "website defines an optional website link." + }, + "security_contact": { + "type": "string", + "description": "security_contact defines an optional email for security contact." + }, + "details": { + "type": "string", + "description": "details define other optional details." + } + } + }, + "unbonding_height": { + "type": "string", + "format": "int64", + "description": "unbonding_height defines, if unbonding, the height at which this validator has begun unbonding." + }, + "unbonding_time": { + "type": "string", + "format": "date-time", + "description": "unbonding_time defines, if unbonding, the min time for the validator to complete unbonding." + }, + "commission": { + "description": "commission defines the commission parameters.", + "type": "object", + "properties": { + "commission_rates": { + "description": "commission_rates defines the initial commission rates to be used for creating a validator.", + "type": "object", + "properties": { + "rate": { + "type": "string", + "description": "rate is the commission rate charged to delegators, as a fraction." + }, + "max_rate": { + "type": "string", + "description": "max_rate defines the maximum commission rate which validator can ever charge, as a fraction." + }, + "max_change_rate": { + "type": "string", + "description": "max_change_rate defines the maximum daily increase of the validator commission, as a fraction." + } + } + }, + "update_time": { + "type": "string", + "format": "date-time", + "description": "update_time is the last time the commission rate was changed." + } + } + }, + "min_self_delegation": { + "type": "string", + "description": "min_self_delegation is the validator's self declared minimum self delegation.\n\nSince: cosmos-sdk 0.46" + }, + "unbonding_on_hold_ref_count": { + "type": "string", + "format": "int64", + "title": "strictly positive if this validator's unbonding has been stopped by external modules" + }, + "unbonding_ids": { + "type": "array", + "items": { + "type": "string", + "format": "uint64" + }, + "title": "list of unbonding ids, each uniquely identifying an unbonding of this validator" + } + }, + "description": "Validator defines a validator, together with the total amount of the\nValidator's bond shares and their exchange rate to coins. Slashing results in\na decrease in the exchange rate, allowing correct calculation of future\nundelegations without iterating over delegators. When coins are delegated to\nthis validator, the validator is credited with a delegation whose number of\nbond shares is based on the amount of coins delegated divided by the current\nexchange rate. Voting power can be calculated as total bonded shares\nmultiplied by exchange rate." + } + }, + "description": "QueryDelegatorValidatorResponse response type for the\nQuery/DelegatorValidator RPC method." + }, + "cosmos.staking.v1beta1.QueryDelegatorValidatorsResponse": { + "type": "object", + "properties": { + "validators": { + "type": "array", + "items": { + "type": "object", + "properties": { + "operator_address": { + "type": "string", + "description": "operator_address defines the address of the validator's operator; bech encoded in JSON." + }, + "consensus_pubkey": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "jailed": { + "type": "boolean", + "description": "jailed defined whether the validator has been jailed from bonded status or not." + }, + "status": { + "description": "status is the validator status (bonded/unbonding/unbonded).", + "type": "string", + "enum": [ + "BOND_STATUS_UNSPECIFIED", + "BOND_STATUS_UNBONDED", + "BOND_STATUS_UNBONDING", + "BOND_STATUS_BONDED" + ], + "default": "BOND_STATUS_UNSPECIFIED" + }, + "tokens": { + "type": "string", + "description": "tokens define the delegated tokens (incl. self-delegation)." + }, + "delegator_shares": { + "type": "string", + "description": "delegator_shares defines total shares issued to a validator's delegators." + }, + "description": { + "description": "description defines the description terms for the validator.", + "type": "object", + "properties": { + "moniker": { + "type": "string", + "description": "moniker defines a human-readable name for the validator." + }, + "identity": { + "type": "string", + "description": "identity defines an optional identity signature (ex. UPort or Keybase)." + }, + "website": { + "type": "string", + "description": "website defines an optional website link." + }, + "security_contact": { + "type": "string", + "description": "security_contact defines an optional email for security contact." + }, + "details": { + "type": "string", + "description": "details define other optional details." + } + } + }, + "unbonding_height": { + "type": "string", + "format": "int64", + "description": "unbonding_height defines, if unbonding, the height at which this validator has begun unbonding." + }, + "unbonding_time": { + "type": "string", + "format": "date-time", + "description": "unbonding_time defines, if unbonding, the min time for the validator to complete unbonding." + }, + "commission": { + "description": "commission defines the commission parameters.", + "type": "object", + "properties": { + "commission_rates": { + "description": "commission_rates defines the initial commission rates to be used for creating a validator.", + "type": "object", + "properties": { + "rate": { + "type": "string", + "description": "rate is the commission rate charged to delegators, as a fraction." + }, + "max_rate": { + "type": "string", + "description": "max_rate defines the maximum commission rate which validator can ever charge, as a fraction." + }, + "max_change_rate": { + "type": "string", + "description": "max_change_rate defines the maximum daily increase of the validator commission, as a fraction." + } + } + }, + "update_time": { + "type": "string", + "format": "date-time", + "description": "update_time is the last time the commission rate was changed." + } + } + }, + "min_self_delegation": { + "type": "string", + "description": "min_self_delegation is the validator's self declared minimum self delegation.\n\nSince: cosmos-sdk 0.46" + }, + "unbonding_on_hold_ref_count": { + "type": "string", + "format": "int64", + "title": "strictly positive if this validator's unbonding has been stopped by external modules" + }, + "unbonding_ids": { + "type": "array", + "items": { + "type": "string", + "format": "uint64" + }, + "title": "list of unbonding ids, each uniquely identifying an unbonding of this validator" + } + }, + "description": "Validator defines a validator, together with the total amount of the\nValidator's bond shares and their exchange rate to coins. Slashing results in\na decrease in the exchange rate, allowing correct calculation of future\nundelegations without iterating over delegators. When coins are delegated to\nthis validator, the validator is credited with a delegation whose number of\nbond shares is based on the amount of coins delegated divided by the current\nexchange rate. Voting power can be calculated as total bonded shares\nmultiplied by exchange rate." + }, + "description": "validators defines the validators' info of a delegator." + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "description": "QueryDelegatorValidatorsResponse is response type for the\nQuery/DelegatorValidators RPC method." + }, + "cosmos.staking.v1beta1.QueryHistoricalInfoResponse": { + "type": "object", + "properties": { + "hist": { + "description": "hist defines the historical info at the given height.", + "type": "object", + "properties": { + "header": { + "type": "object", + "properties": { + "version": { + "title": "basic block info", + "type": "object", + "properties": { + "block": { + "type": "string", + "format": "uint64" + }, + "app": { + "type": "string", + "format": "uint64" + } + }, + "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." + }, + "chain_id": { + "type": "string" + }, + "height": { + "type": "string", + "format": "int64" + }, + "time": { + "type": "string", + "format": "date-time" + }, + "last_block_id": { + "title": "prev block info", + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } + } + }, + "last_commit_hash": { + "type": "string", + "format": "byte", + "title": "hashes of block data" + }, + "data_hash": { + "type": "string", + "format": "byte" + }, + "validators_hash": { + "type": "string", + "format": "byte", + "title": "hashes from the app output from the prev block" + }, + "next_validators_hash": { + "type": "string", + "format": "byte" + }, + "consensus_hash": { + "type": "string", + "format": "byte" + }, + "app_hash": { + "type": "string", + "format": "byte" + }, + "last_results_hash": { + "type": "string", + "format": "byte" + }, + "evidence_hash": { + "type": "string", + "format": "byte", + "title": "consensus info" + }, + "proposer_address": { + "type": "string", + "format": "byte" + } + }, + "description": "Header defines the structure of a block header." + }, + "valset": { + "type": "array", + "items": { + "type": "object", + "properties": { + "operator_address": { + "type": "string", + "description": "operator_address defines the address of the validator's operator; bech encoded in JSON." + }, + "consensus_pubkey": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "jailed": { + "type": "boolean", + "description": "jailed defined whether the validator has been jailed from bonded status or not." + }, + "status": { + "description": "status is the validator status (bonded/unbonding/unbonded).", + "type": "string", + "enum": [ + "BOND_STATUS_UNSPECIFIED", + "BOND_STATUS_UNBONDED", + "BOND_STATUS_UNBONDING", + "BOND_STATUS_BONDED" + ], + "default": "BOND_STATUS_UNSPECIFIED" + }, + "tokens": { + "type": "string", + "description": "tokens define the delegated tokens (incl. self-delegation)." + }, + "delegator_shares": { + "type": "string", + "description": "delegator_shares defines total shares issued to a validator's delegators." + }, + "description": { + "description": "description defines the description terms for the validator.", + "type": "object", + "properties": { + "moniker": { + "type": "string", + "description": "moniker defines a human-readable name for the validator." + }, + "identity": { + "type": "string", + "description": "identity defines an optional identity signature (ex. UPort or Keybase)." + }, + "website": { + "type": "string", + "description": "website defines an optional website link." + }, + "security_contact": { + "type": "string", + "description": "security_contact defines an optional email for security contact." + }, + "details": { + "type": "string", + "description": "details define other optional details." + } + } + }, + "unbonding_height": { + "type": "string", + "format": "int64", + "description": "unbonding_height defines, if unbonding, the height at which this validator has begun unbonding." + }, + "unbonding_time": { + "type": "string", + "format": "date-time", + "description": "unbonding_time defines, if unbonding, the min time for the validator to complete unbonding." + }, + "commission": { + "description": "commission defines the commission parameters.", + "type": "object", + "properties": { + "commission_rates": { + "description": "commission_rates defines the initial commission rates to be used for creating a validator.", + "type": "object", + "properties": { + "rate": { + "type": "string", + "description": "rate is the commission rate charged to delegators, as a fraction." + }, + "max_rate": { + "type": "string", + "description": "max_rate defines the maximum commission rate which validator can ever charge, as a fraction." }, - "description": "LightClientAttackEvidence contains evidence of a set of validators attempting to mislead a light client." + "max_change_rate": { + "type": "string", + "description": "max_change_rate defines the maximum daily increase of the validator commission, as a fraction." + } } + }, + "update_time": { + "type": "string", + "format": "date-time", + "description": "update_time is the last time the commission rate was changed." } } + }, + "min_self_delegation": { + "type": "string", + "description": "min_self_delegation is the validator's self declared minimum self delegation.\n\nSince: cosmos-sdk 0.46" + }, + "unbonding_on_hold_ref_count": { + "type": "string", + "format": "int64", + "title": "strictly positive if this validator's unbonding has been stopped by external modules" + }, + "unbonding_ids": { + "type": "array", + "items": { + "type": "string", + "format": "uint64" + }, + "title": "list of unbonding ids, each uniquely identifying an unbonding of this validator" + } + }, + "description": "Validator defines a validator, together with the total amount of the\nValidator's bond shares and their exchange rate to coins. Slashing results in\na decrease in the exchange rate, allowing correct calculation of future\nundelegations without iterating over delegators. When coins are delegated to\nthis validator, the validator is credited with a delegation whose number of\nbond shares is based on the amount of coins delegated divided by the current\nexchange rate. Voting power can be calculated as total bonded shares\nmultiplied by exchange rate." + } + } + } + }, + "historical_record": { + "type": "object", + "properties": { + "apphash": { + "type": "string", + "format": "byte" + }, + "time": { + "type": "string", + "format": "date-time" + }, + "validators_hash": { + "type": "string", + "format": "byte" + } + }, + "description": "Historical contains a set of minimum values needed for evaluating historical validator sets and blocks.\nIt is stored as part of staking module's state, which persists the `n` most\nrecent HistoricalInfo\n(`n` is set by the staking module's `historical_entries` parameter)." + } + }, + "description": "QueryHistoricalInfoResponse is response type for the Query/HistoricalInfo RPC\nmethod." + }, + "cosmos.staking.v1beta1.QueryParamsResponse": { + "type": "object", + "properties": { + "params": { + "description": "params holds all the parameters of this module.", + "type": "object", + "properties": { + "unbonding_time": { + "type": "string", + "description": "unbonding_time is the time duration of unbonding." + }, + "max_validators": { + "type": "integer", + "format": "int64", + "description": "max_validators is the maximum number of validators." + }, + "max_entries": { + "type": "integer", + "format": "int64", + "description": "max_entries is the max entries for either unbonding delegation or redelegation (per pair/trio)." + }, + "historical_entries": { + "type": "integer", + "format": "int64", + "description": "historical_entries is the number of historical entries to persist." + }, + "bond_denom": { + "type": "string", + "description": "bond_denom defines the bondable coin denomination." + }, + "min_commission_rate": { + "type": "string", + "title": "min_commission_rate is the chain-wide minimum commission rate that a validator can charge their delegators" + }, + "key_rotation_fee": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto.", + "title": "key_rotation_fee is fee to be spent when rotating validator's key\n(either consensus pubkey or operator key)" + } + } + } + }, + "description": "QueryParamsResponse is response type for the Query/Params RPC method." + }, + "cosmos.staking.v1beta1.QueryPoolResponse": { + "type": "object", + "properties": { + "pool": { + "description": "pool defines the pool info.", + "type": "object", + "properties": { + "not_bonded_tokens": { + "type": "string" + }, + "bonded_tokens": { + "type": "string" + } + } + } + }, + "description": "QueryPoolResponse is response type for the Query/Pool RPC method." + }, + "cosmos.staking.v1beta1.QueryRedelegationsResponse": { + "type": "object", + "properties": { + "redelegation_responses": { + "type": "array", + "items": { + "type": "object", + "properties": { + "redelegation": { + "type": "object", + "properties": { + "delegator_address": { + "type": "string", + "description": "delegator_address is the bech32-encoded address of the delegator." + }, + "validator_src_address": { + "type": "string", + "description": "validator_src_address is the validator redelegation source operator address." + }, + "validator_dst_address": { + "type": "string", + "description": "validator_dst_address is the validator redelegation destination operator address." + }, + "entries": { + "type": "array", + "items": { + "type": "object", + "properties": { + "creation_height": { + "type": "string", + "format": "int64", + "description": "creation_height defines the height which the redelegation took place." + }, + "completion_time": { + "type": "string", + "format": "date-time", + "description": "completion_time defines the unix time for redelegation completion." + }, + "initial_balance": { + "type": "string", + "description": "initial_balance defines the initial balance when redelegation started." + }, + "shares_dst": { + "type": "string", + "description": "shares_dst is the amount of destination-validator shares created by redelegation." + }, + "unbonding_id": { + "type": "string", + "format": "uint64", + "title": "Incrementing id that uniquely identifies this entry" + }, + "unbonding_on_hold_ref_count": { + "type": "string", + "format": "int64", + "title": "Strictly positive if this entry's unbonding has been stopped by external modules" + } + }, + "description": "RedelegationEntry defines a redelegation object with relevant metadata." + }, + "description": "entries are the redelegation entries." + } + }, + "description": "Redelegation contains the list of a particular delegator's redelegating bonds\nfrom a particular source validator to a particular destination validator." + }, + "entries": { + "type": "array", + "items": { + "type": "object", + "properties": { + "redelegation_entry": { + "type": "object", + "properties": { + "creation_height": { + "type": "string", + "format": "int64", + "description": "creation_height defines the height which the redelegation took place." + }, + "completion_time": { + "type": "string", + "format": "date-time", + "description": "completion_time defines the unix time for redelegation completion." + }, + "initial_balance": { + "type": "string", + "description": "initial_balance defines the initial balance when redelegation started." + }, + "shares_dst": { + "type": "string", + "description": "shares_dst is the amount of destination-validator shares created by redelegation." + }, + "unbonding_id": { + "type": "string", + "format": "uint64", + "title": "Incrementing id that uniquely identifies this entry" + }, + "unbonding_on_hold_ref_count": { + "type": "string", + "format": "int64", + "title": "Strictly positive if this entry's unbonding has been stopped by external modules" + } + }, + "description": "RedelegationEntry defines a redelegation object with relevant metadata." + }, + "balance": { + "type": "string" + } + }, + "description": "RedelegationEntryResponse is equivalent to a RedelegationEntry except that it\ncontains a balance in addition to shares which is more suitable for client\nresponses." + } + } + }, + "description": "RedelegationResponse is equivalent to a Redelegation except that its entries\ncontain a balance in addition to shares which is more suitable for client\nresponses." + } + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "description": "QueryRedelegationsResponse is response type for the Query/Redelegations RPC\nmethod." + }, + "cosmos.staking.v1beta1.QueryUnbondingDelegationResponse": { + "type": "object", + "properties": { + "unbond": { + "type": "object", + "properties": { + "delegator_address": { + "type": "string", + "description": "delegator_address is the encoded address of the delegator." + }, + "validator_address": { + "type": "string", + "description": "validator_address is the encoded address of the validator." + }, + "entries": { + "type": "array", + "items": { + "type": "object", + "properties": { + "creation_height": { + "type": "string", + "format": "int64", + "description": "creation_height is the height which the unbonding took place." + }, + "completion_time": { + "type": "string", + "format": "date-time", + "description": "completion_time is the unix time for unbonding completion." + }, + "initial_balance": { + "type": "string", + "description": "initial_balance defines the tokens initially scheduled to receive at completion." + }, + "balance": { + "type": "string", + "description": "balance defines the tokens to receive at completion." + }, + "unbonding_id": { + "type": "string", + "format": "uint64", + "title": "Incrementing id that uniquely identifies this entry" + }, + "unbonding_on_hold_ref_count": { + "type": "string", + "format": "int64", + "title": "Strictly positive if this entry's unbonding has been stopped by external modules" + } + }, + "description": "UnbondingDelegationEntry defines an unbonding object with relevant metadata." + }, + "description": "entries are the unbonding delegation entries." + } + }, + "description": "UnbondingDelegation stores all of a single delegator's unbonding bonds\nfor a single validator in an time-ordered list." + } + }, + "description": "QueryDelegationResponse is response type for the Query/UnbondingDelegation\nRPC method." + }, + "cosmos.staking.v1beta1.QueryValidatorDelegationsResponse": { + "type": "object", + "properties": { + "delegation_responses": { + "type": "array", + "items": { + "type": "object", + "properties": { + "delegation": { + "type": "object", + "properties": { + "delegator_address": { + "type": "string", + "description": "delegator_address is the encoded address of the delegator." + }, + "validator_address": { + "type": "string", + "description": "validator_address is the encoded address of the validator." + }, + "shares": { + "type": "string", + "description": "shares define the delegation shares received." + } + }, + "description": "Delegation represents the bond with tokens held by an account. It is\nowned by one delegator, and is associated with the voting power of one\nvalidator." + }, + "balance": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + } + }, + "description": "DelegationResponse is equivalent to Delegation except that it contains a\nbalance in addition to shares which is more suitable for client responses." + } + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "title": "QueryValidatorDelegationsResponse is response type for the\nQuery/ValidatorDelegations RPC method" + }, + "cosmos.staking.v1beta1.QueryValidatorResponse": { + "type": "object", + "properties": { + "validator": { + "type": "object", + "properties": { + "operator_address": { + "type": "string", + "description": "operator_address defines the address of the validator's operator; bech encoded in JSON." + }, + "consensus_pubkey": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "jailed": { + "type": "boolean", + "description": "jailed defined whether the validator has been jailed from bonded status or not." + }, + "status": { + "description": "status is the validator status (bonded/unbonding/unbonded).", + "type": "string", + "enum": [ + "BOND_STATUS_UNSPECIFIED", + "BOND_STATUS_UNBONDED", + "BOND_STATUS_UNBONDING", + "BOND_STATUS_BONDED" + ], + "default": "BOND_STATUS_UNSPECIFIED" + }, + "tokens": { + "type": "string", + "description": "tokens define the delegated tokens (incl. self-delegation)." + }, + "delegator_shares": { + "type": "string", + "description": "delegator_shares defines total shares issued to a validator's delegators." + }, + "description": { + "description": "description defines the description terms for the validator.", + "type": "object", + "properties": { + "moniker": { + "type": "string", + "description": "moniker defines a human-readable name for the validator." + }, + "identity": { + "type": "string", + "description": "identity defines an optional identity signature (ex. UPort or Keybase)." + }, + "website": { + "type": "string", + "description": "website defines an optional website link." + }, + "security_contact": { + "type": "string", + "description": "security_contact defines an optional email for security contact." + }, + "details": { + "type": "string", + "description": "details define other optional details." + } + } + }, + "unbonding_height": { + "type": "string", + "format": "int64", + "description": "unbonding_height defines, if unbonding, the height at which this validator has begun unbonding." + }, + "unbonding_time": { + "type": "string", + "format": "date-time", + "description": "unbonding_time defines, if unbonding, the min time for the validator to complete unbonding." + }, + "commission": { + "description": "commission defines the commission parameters.", + "type": "object", + "properties": { + "commission_rates": { + "description": "commission_rates defines the initial commission rates to be used for creating a validator.", + "type": "object", + "properties": { + "rate": { + "type": "string", + "description": "rate is the commission rate charged to delegators, as a fraction." + }, + "max_rate": { + "type": "string", + "description": "max_rate defines the maximum commission rate which validator can ever charge, as a fraction." + }, + "max_change_rate": { + "type": "string", + "description": "max_change_rate defines the maximum daily increase of the validator commission, as a fraction." + } + } + }, + "update_time": { + "type": "string", + "format": "date-time", + "description": "update_time is the last time the commission rate was changed." + } + } + }, + "min_self_delegation": { + "type": "string", + "description": "min_self_delegation is the validator's self declared minimum self delegation.\n\nSince: cosmos-sdk 0.46" + }, + "unbonding_on_hold_ref_count": { + "type": "string", + "format": "int64", + "title": "strictly positive if this validator's unbonding has been stopped by external modules" + }, + "unbonding_ids": { + "type": "array", + "items": { + "type": "string", + "format": "uint64" + }, + "title": "list of unbonding ids, each uniquely identifying an unbonding of this validator" + } + }, + "description": "Validator defines a validator, together with the total amount of the\nValidator's bond shares and their exchange rate to coins. Slashing results in\na decrease in the exchange rate, allowing correct calculation of future\nundelegations without iterating over delegators. When coins are delegated to\nthis validator, the validator is credited with a delegation whose number of\nbond shares is based on the amount of coins delegated divided by the current\nexchange rate. Voting power can be calculated as total bonded shares\nmultiplied by exchange rate." + } + }, + "title": "QueryValidatorResponse is response type for the Query/Validator RPC method" + }, + "cosmos.staking.v1beta1.QueryValidatorUnbondingDelegationsResponse": { + "type": "object", + "properties": { + "unbonding_responses": { + "type": "array", + "items": { + "type": "object", + "properties": { + "delegator_address": { + "type": "string", + "description": "delegator_address is the encoded address of the delegator." + }, + "validator_address": { + "type": "string", + "description": "validator_address is the encoded address of the validator." + }, + "entries": { + "type": "array", + "items": { + "type": "object", + "properties": { + "creation_height": { + "type": "string", + "format": "int64", + "description": "creation_height is the height which the unbonding took place." + }, + "completion_time": { + "type": "string", + "format": "date-time", + "description": "completion_time is the unix time for unbonding completion." + }, + "initial_balance": { + "type": "string", + "description": "initial_balance defines the tokens initially scheduled to receive at completion." + }, + "balance": { + "type": "string", + "description": "balance defines the tokens to receive at completion." + }, + "unbonding_id": { + "type": "string", + "format": "uint64", + "title": "Incrementing id that uniquely identifies this entry" + }, + "unbonding_on_hold_ref_count": { + "type": "string", + "format": "int64", + "title": "Strictly positive if this entry's unbonding has been stopped by external modules" + } + }, + "description": "UnbondingDelegationEntry defines an unbonding object with relevant metadata." + }, + "description": "entries are the unbonding delegation entries." + } + }, + "description": "UnbondingDelegation stores all of a single delegator's unbonding bonds\nfor a single validator in an time-ordered list." + } + }, + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "description": "QueryValidatorUnbondingDelegationsResponse is response type for the\nQuery/ValidatorUnbondingDelegations RPC method." + }, + "cosmos.staking.v1beta1.QueryValidatorsResponse": { + "type": "object", + "properties": { + "validators": { + "type": "array", + "items": { + "type": "object", + "properties": { + "operator_address": { + "type": "string", + "description": "operator_address defines the address of the validator's operator; bech encoded in JSON." + }, + "consensus_pubkey": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "jailed": { + "type": "boolean", + "description": "jailed defined whether the validator has been jailed from bonded status or not." + }, + "status": { + "description": "status is the validator status (bonded/unbonding/unbonded).", + "type": "string", + "enum": [ + "BOND_STATUS_UNSPECIFIED", + "BOND_STATUS_UNBONDED", + "BOND_STATUS_UNBONDING", + "BOND_STATUS_BONDED" + ], + "default": "BOND_STATUS_UNSPECIFIED" + }, + "tokens": { + "type": "string", + "description": "tokens define the delegated tokens (incl. self-delegation)." + }, + "delegator_shares": { + "type": "string", + "description": "delegator_shares defines total shares issued to a validator's delegators." + }, + "description": { + "description": "description defines the description terms for the validator.", + "type": "object", + "properties": { + "moniker": { + "type": "string", + "description": "moniker defines a human-readable name for the validator." + }, + "identity": { + "type": "string", + "description": "identity defines an optional identity signature (ex. UPort or Keybase)." + }, + "website": { + "type": "string", + "description": "website defines an optional website link." + }, + "security_contact": { + "type": "string", + "description": "security_contact defines an optional email for security contact." + }, + "details": { + "type": "string", + "description": "details define other optional details." } } }, - "last_commit": { + "unbonding_height": { + "type": "string", + "format": "int64", + "description": "unbonding_height defines, if unbonding, the height at which this validator has begun unbonding." + }, + "unbonding_time": { + "type": "string", + "format": "date-time", + "description": "unbonding_time defines, if unbonding, the min time for the validator to complete unbonding." + }, + "commission": { + "description": "commission defines the commission parameters.", "type": "object", "properties": { - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", + "commission_rates": { + "description": "commission_rates defines the initial commission rates to be used for creating a validator.", "type": "object", "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "rate": { "type": "string", - "format": "byte" + "description": "rate is the commission rate charged to delegators, as a fraction." }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "max_rate": { + "type": "string", + "description": "max_rate defines the maximum commission rate which validator can ever charge, as a fraction." + }, + "max_change_rate": { + "type": "string", + "description": "max_change_rate defines the maximum daily increase of the validator commission, as a fraction." } } }, - "signatures": { - "type": "array", - "items": { - "type": "object", - "properties": { - "block_id_flag": { - "title": "BlockIdFlag indicates which BlockID the signature is for", - "type": "string", - "default": "BLOCK_ID_FLAG_UNKNOWN", - "enum": [ - "BLOCK_ID_FLAG_UNKNOWN", - "BLOCK_ID_FLAG_ABSENT", - "BLOCK_ID_FLAG_COMMIT", - "BLOCK_ID_FLAG_NIL" - ] - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "CommitSig is a part of the Vote included in a Commit." - } + "update_time": { + "type": "string", + "format": "date-time", + "description": "update_time is the last time the commission rate was changed." } - }, - "description": "Commit contains the evidence that a block was committed by a set of validators." - } - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + } + }, + "min_self_delegation": { "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" + "description": "min_self_delegation is the validator's self declared minimum self delegation.\n\nSince: cosmos-sdk 0.46" }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", + "unbonding_on_hold_ref_count": { "type": "string", - "format": "uint64" + "format": "int64", + "title": "strictly positive if this validator's unbonding has been stopped by external modules" + }, + "unbonding_ids": { + "type": "array", + "items": { + "type": "string", + "format": "uint64" + }, + "title": "list of unbonding ids, each uniquely identifying an unbonding of this validator" } }, - "description": "pagination defines a pagination for the response." - } + "description": "Validator defines a validator, together with the total amount of the\nValidator's bond shares and their exchange rate to coins. Slashing results in\na decrease in the exchange rate, allowing correct calculation of future\nundelegations without iterating over delegators. When coins are delegated to\nthis validator, the validator is credited with a delegation whose number of\nbond shares is based on the amount of coins delegated divided by the current\nexchange rate. Voting power can be calculated as total bonded shares\nmultiplied by exchange rate." + }, + "description": "validators contains all the queried validators." }, - "description": "GetBlockWithTxsResponse is the response type for the Service.GetBlockWithTxs\nmethod.\n\nSince: cosmos-sdk 0.45.2" + "pagination": { + "description": "pagination defines the pagination in the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } }, - "cosmos.tx.v1beta1.GetTxResponse": { - "type": "object", - "properties": { - "tx": { - "$ref": "#/components/schemas/cosmos.tx.v1beta1.Tx" - }, - "tx_response": { + "title": "QueryValidatorsResponse is response type for the Query/Validators RPC method" + }, + "cosmos.staking.v1beta1.Redelegation": { + "type": "object", + "properties": { + "delegator_address": { + "type": "string", + "description": "delegator_address is the bech32-encoded address of the delegator." + }, + "validator_src_address": { + "type": "string", + "description": "validator_src_address is the validator redelegation source operator address." + }, + "validator_dst_address": { + "type": "string", + "description": "validator_dst_address is the validator redelegation destination operator address." + }, + "entries": { + "type": "array", + "items": { "type": "object", "properties": { - "height": { - "title": "The block height", - "type": "string", - "format": "int64" - }, - "txhash": { + "creation_height": { "type": "string", - "description": "The transaction hash." - }, - "codespace": { - "title": "Namespace for the Code", - "type": "string" - }, - "code": { - "type": "integer", - "description": "Response code.", - "format": "int64" + "format": "int64", + "description": "creation_height defines the height which the redelegation took place." }, - "data": { + "completion_time": { "type": "string", - "description": "Result bytes, if any." + "format": "date-time", + "description": "completion_time defines the unix time for redelegation completion." }, - "raw_log": { + "initial_balance": { "type": "string", - "description": "The output of the application's logger (raw string). May be\nnon-deterministic." - }, - "logs": { - "type": "array", - "description": "The output of the application's logger (typed). May be non-deterministic.", - "items": { - "type": "object", - "properties": { - "msg_index": { - "type": "integer", - "format": "int64" - }, - "log": { - "type": "string" - }, - "events": { - "type": "array", - "description": "Events contains a slice of Event objects that were emitted during some\nexecution.", - "items": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "attributes": { - "type": "array", - "items": { - "type": "object", - "properties": { - "key": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "description": "Attribute defines an attribute wrapper where the key and value are\nstrings instead of raw bytes." - } - } - }, - "description": "StringEvent defines en Event object wrapper where all the attributes\ncontain key/value pairs that are strings instead of raw bytes." - } - } - }, - "description": "ABCIMessageLog defines a structure containing an indexed tx ABCI message log." - } + "description": "initial_balance defines the initial balance when redelegation started." }, - "info": { + "shares_dst": { "type": "string", - "description": "Additional information. May be non-deterministic." + "description": "shares_dst is the amount of destination-validator shares created by redelegation." }, - "gas_wanted": { + "unbonding_id": { "type": "string", - "description": "Amount of gas requested for transaction.", - "format": "int64" + "format": "uint64", + "title": "Incrementing id that uniquely identifies this entry" }, - "gas_used": { + "unbonding_on_hold_ref_count": { "type": "string", - "description": "Amount of gas consumed by transaction.", - "format": "int64" + "format": "int64", + "title": "Strictly positive if this entry's unbonding has been stopped by external modules" + } + }, + "description": "RedelegationEntry defines a redelegation object with relevant metadata." + }, + "description": "entries are the redelegation entries." + } + }, + "description": "Redelegation contains the list of a particular delegator's redelegating bonds\nfrom a particular source validator to a particular destination validator." + }, + "cosmos.staking.v1beta1.RedelegationEntry": { + "type": "object", + "properties": { + "creation_height": { + "type": "string", + "format": "int64", + "description": "creation_height defines the height which the redelegation took place." + }, + "completion_time": { + "type": "string", + "format": "date-time", + "description": "completion_time defines the unix time for redelegation completion." + }, + "initial_balance": { + "type": "string", + "description": "initial_balance defines the initial balance when redelegation started." + }, + "shares_dst": { + "type": "string", + "description": "shares_dst is the amount of destination-validator shares created by redelegation." + }, + "unbonding_id": { + "type": "string", + "format": "uint64", + "title": "Incrementing id that uniquely identifies this entry" + }, + "unbonding_on_hold_ref_count": { + "type": "string", + "format": "int64", + "title": "Strictly positive if this entry's unbonding has been stopped by external modules" + } + }, + "description": "RedelegationEntry defines a redelegation object with relevant metadata." + }, + "cosmos.staking.v1beta1.RedelegationEntryResponse": { + "type": "object", + "properties": { + "redelegation_entry": { + "type": "object", + "properties": { + "creation_height": { + "type": "string", + "format": "int64", + "description": "creation_height defines the height which the redelegation took place." + }, + "completion_time": { + "type": "string", + "format": "date-time", + "description": "completion_time defines the unix time for redelegation completion." + }, + "initial_balance": { + "type": "string", + "description": "initial_balance defines the initial balance when redelegation started." + }, + "shares_dst": { + "type": "string", + "description": "shares_dst is the amount of destination-validator shares created by redelegation." + }, + "unbonding_id": { + "type": "string", + "format": "uint64", + "title": "Incrementing id that uniquely identifies this entry" + }, + "unbonding_on_hold_ref_count": { + "type": "string", + "format": "int64", + "title": "Strictly positive if this entry's unbonding has been stopped by external modules" + } + }, + "description": "RedelegationEntry defines a redelegation object with relevant metadata." + }, + "balance": { + "type": "string" + } + }, + "description": "RedelegationEntryResponse is equivalent to a RedelegationEntry except that it\ncontains a balance in addition to shares which is more suitable for client\nresponses." + }, + "cosmos.staking.v1beta1.RedelegationResponse": { + "type": "object", + "properties": { + "redelegation": { + "type": "object", + "properties": { + "delegator_address": { + "type": "string", + "description": "delegator_address is the bech32-encoded address of the delegator." + }, + "validator_src_address": { + "type": "string", + "description": "validator_src_address is the validator redelegation source operator address." + }, + "validator_dst_address": { + "type": "string", + "description": "validator_dst_address is the validator redelegation destination operator address." + }, + "entries": { + "type": "array", + "items": { + "type": "object", + "properties": { + "creation_height": { + "type": "string", + "format": "int64", + "description": "creation_height defines the height which the redelegation took place." + }, + "completion_time": { + "type": "string", + "format": "date-time", + "description": "completion_time defines the unix time for redelegation completion." + }, + "initial_balance": { + "type": "string", + "description": "initial_balance defines the initial balance when redelegation started." + }, + "shares_dst": { + "type": "string", + "description": "shares_dst is the amount of destination-validator shares created by redelegation." + }, + "unbonding_id": { + "type": "string", + "format": "uint64", + "title": "Incrementing id that uniquely identifies this entry" + }, + "unbonding_on_hold_ref_count": { + "type": "string", + "format": "int64", + "title": "Strictly positive if this entry's unbonding has been stopped by external modules" + } + }, + "description": "RedelegationEntry defines a redelegation object with relevant metadata." }, - "tx": { + "description": "entries are the redelegation entries." + } + }, + "description": "Redelegation contains the list of a particular delegator's redelegating bonds\nfrom a particular source validator to a particular destination validator." + }, + "entries": { + "type": "array", + "items": { + "type": "object", + "properties": { + "redelegation_entry": { "type": "object", "properties": { - "type_url": { + "creation_height": { "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + "format": "int64", + "description": "creation_height defines the height which the redelegation took place." }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "completion_time": { "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" + "format": "date-time", + "description": "completion_time defines the unix time for redelegation completion." + }, + "initial_balance": { + "type": "string", + "description": "initial_balance defines the initial balance when redelegation started." + }, + "shares_dst": { + "type": "string", + "description": "shares_dst is the amount of destination-validator shares created by redelegation." + }, + "unbonding_id": { + "type": "string", + "format": "uint64", + "title": "Incrementing id that uniquely identifies this entry" + }, + "unbonding_on_hold_ref_count": { + "type": "string", + "format": "int64", + "title": "Strictly positive if this entry's unbonding has been stopped by external modules" } }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "description": "RedelegationEntry defines a redelegation object with relevant metadata." + }, + "balance": { + "type": "string" + } + }, + "description": "RedelegationEntryResponse is equivalent to a RedelegationEntry except that it\ncontains a balance in addition to shares which is more suitable for client\nresponses." + } + } + }, + "description": "RedelegationResponse is equivalent to a Redelegation except that its entries\ncontain a balance in addition to shares which is more suitable for client\nresponses." + }, + "cosmos.staking.v1beta1.UnbondingDelegation": { + "type": "object", + "properties": { + "delegator_address": { + "type": "string", + "description": "delegator_address is the encoded address of the delegator." + }, + "validator_address": { + "type": "string", + "description": "validator_address is the encoded address of the validator." + }, + "entries": { + "type": "array", + "items": { + "type": "object", + "properties": { + "creation_height": { + "type": "string", + "format": "int64", + "description": "creation_height is the height which the unbonding took place." + }, + "completion_time": { + "type": "string", + "format": "date-time", + "description": "completion_time is the unix time for unbonding completion." }, - "timestamp": { + "initial_balance": { "type": "string", - "description": "Time of the previous block. For heights > 1, it's the weighted median of\nthe timestamps of the valid votes in the block.LastCommit. For height == 1,\nit's genesis time." + "description": "initial_balance defines the tokens initially scheduled to receive at completion." }, - "events": { - "type": "array", - "description": "Events defines all the events emitted by processing a transaction. Note,\nthese events include those emitted by processing all the messages and those\nemitted from the ante. Whereas Logs contains the events, with\nadditional metadata, emitted only by processing the messages.\n\nSince: cosmos-sdk 0.42.11, 0.44.5, 0.45", - "items": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "attributes": { - "type": "array", - "items": { - "type": "object", - "properties": { - "key": { - "type": "string" - }, - "value": { - "type": "string" - }, - "index": { - "type": "boolean" - } - }, - "description": "EventAttribute is a single key-value pair, associated with an event." - } - } - }, - "description": "Event allows application developers to attach additional information to\nResponseFinalizeBlock and ResponseCheckTx.\nLater, transactions may be queried using these events." - } + "balance": { + "type": "string", + "description": "balance defines the tokens to receive at completion." + }, + "unbonding_id": { + "type": "string", + "format": "uint64", + "title": "Incrementing id that uniquely identifies this entry" + }, + "unbonding_on_hold_ref_count": { + "type": "string", + "format": "int64", + "title": "Strictly positive if this entry's unbonding has been stopped by external modules" } }, - "description": "TxResponse defines a structure containing relevant tx data and metadata. The\ntags are stringified and the log is JSON decoded." - } - }, - "description": "GetTxResponse is the response type for the Service.GetTx method." + "description": "UnbondingDelegationEntry defines an unbonding object with relevant metadata." + }, + "description": "entries are the unbonding delegation entries." + } }, - "cosmos.tx.v1beta1.GetTxsEventResponse": { - "type": "object", - "properties": { - "txs": { - "type": "array", - "description": "txs is the list of queried transactions.", - "items": { - "$ref": "#/components/schemas/cosmos.tx.v1beta1.Tx" + "description": "UnbondingDelegation stores all of a single delegator's unbonding bonds\nfor a single validator in an time-ordered list." + }, + "cosmos.staking.v1beta1.UnbondingDelegationEntry": { + "type": "object", + "properties": { + "creation_height": { + "type": "string", + "format": "int64", + "description": "creation_height is the height which the unbonding took place." + }, + "completion_time": { + "type": "string", + "format": "date-time", + "description": "completion_time is the unix time for unbonding completion." + }, + "initial_balance": { + "type": "string", + "description": "initial_balance defines the tokens initially scheduled to receive at completion." + }, + "balance": { + "type": "string", + "description": "balance defines the tokens to receive at completion." + }, + "unbonding_id": { + "type": "string", + "format": "uint64", + "title": "Incrementing id that uniquely identifies this entry" + }, + "unbonding_on_hold_ref_count": { + "type": "string", + "format": "int64", + "title": "Strictly positive if this entry's unbonding has been stopped by external modules" + } + }, + "description": "UnbondingDelegationEntry defines an unbonding object with relevant metadata." + }, + "cosmos.staking.v1beta1.Validator": { + "type": "object", + "properties": { + "operator_address": { + "type": "string", + "description": "operator_address defines the address of the validator's operator; bech encoded in JSON." + }, + "consensus_pubkey": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "jailed": { + "type": "boolean", + "description": "jailed defined whether the validator has been jailed from bonded status or not." + }, + "status": { + "description": "status is the validator status (bonded/unbonding/unbonded).", + "type": "string", + "enum": [ + "BOND_STATUS_UNSPECIFIED", + "BOND_STATUS_UNBONDED", + "BOND_STATUS_UNBONDING", + "BOND_STATUS_BONDED" + ], + "default": "BOND_STATUS_UNSPECIFIED" + }, + "tokens": { + "type": "string", + "description": "tokens define the delegated tokens (incl. self-delegation)." + }, + "delegator_shares": { + "type": "string", + "description": "delegator_shares defines total shares issued to a validator's delegators." + }, + "description": { + "description": "description defines the description terms for the validator.", + "type": "object", + "properties": { + "moniker": { + "type": "string", + "description": "moniker defines a human-readable name for the validator." + }, + "identity": { + "type": "string", + "description": "identity defines an optional identity signature (ex. UPort or Keybase)." + }, + "website": { + "type": "string", + "description": "website defines an optional website link." + }, + "security_contact": { + "type": "string", + "description": "security_contact defines an optional email for security contact." + }, + "details": { + "type": "string", + "description": "details define other optional details." } - }, - "tx_responses": { - "type": "array", - "description": "tx_responses is the list of queried TxResponses.", - "items": { + } + }, + "unbonding_height": { + "type": "string", + "format": "int64", + "description": "unbonding_height defines, if unbonding, the height at which this validator has begun unbonding." + }, + "unbonding_time": { + "type": "string", + "format": "date-time", + "description": "unbonding_time defines, if unbonding, the min time for the validator to complete unbonding." + }, + "commission": { + "description": "commission defines the commission parameters.", + "type": "object", + "properties": { + "commission_rates": { + "description": "commission_rates defines the initial commission rates to be used for creating a validator.", "type": "object", "properties": { - "height": { - "title": "The block height", - "type": "string", - "format": "int64" - }, - "txhash": { - "type": "string", - "description": "The transaction hash." - }, - "codespace": { - "title": "Namespace for the Code", - "type": "string" - }, - "code": { - "type": "integer", - "description": "Response code.", - "format": "int64" - }, - "data": { - "type": "string", - "description": "Result bytes, if any." - }, - "raw_log": { + "rate": { "type": "string", - "description": "The output of the application's logger (raw string). May be\nnon-deterministic." - }, - "logs": { - "type": "array", - "description": "The output of the application's logger (typed). May be non-deterministic.", - "items": { - "type": "object", - "properties": { - "msg_index": { - "type": "integer", - "format": "int64" - }, - "log": { - "type": "string" - }, - "events": { - "type": "array", - "description": "Events contains a slice of Event objects that were emitted during some\nexecution.", - "items": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "attributes": { - "type": "array", - "items": { - "type": "object", - "properties": { - "key": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "description": "Attribute defines an attribute wrapper where the key and value are\nstrings instead of raw bytes." - } - } - }, - "description": "StringEvent defines en Event object wrapper where all the attributes\ncontain key/value pairs that are strings instead of raw bytes." - } - } - }, - "description": "ABCIMessageLog defines a structure containing an indexed tx ABCI message log." - } + "description": "rate is the commission rate charged to delegators, as a fraction." }, - "info": { + "max_rate": { "type": "string", - "description": "Additional information. May be non-deterministic." + "description": "max_rate defines the maximum commission rate which validator can ever charge, as a fraction." }, - "gas_wanted": { + "max_change_rate": { "type": "string", - "description": "Amount of gas requested for transaction.", + "description": "max_change_rate defines the maximum daily increase of the validator commission, as a fraction." + } + } + }, + "update_time": { + "type": "string", + "format": "date-time", + "description": "update_time is the last time the commission rate was changed." + } + } + }, + "min_self_delegation": { + "type": "string", + "description": "min_self_delegation is the validator's self declared minimum self delegation.\n\nSince: cosmos-sdk 0.46" + }, + "unbonding_on_hold_ref_count": { + "type": "string", + "format": "int64", + "title": "strictly positive if this validator's unbonding has been stopped by external modules" + }, + "unbonding_ids": { + "type": "array", + "items": { + "type": "string", + "format": "uint64" + }, + "title": "list of unbonding ids, each uniquely identifying an unbonding of this validator" + } + }, + "description": "Validator defines a validator, together with the total amount of the\nValidator's bond shares and their exchange rate to coins. Slashing results in\na decrease in the exchange rate, allowing correct calculation of future\nundelegations without iterating over delegators. When coins are delegated to\nthis validator, the validator is credited with a delegation whose number of\nbond shares is based on the amount of coins delegated divided by the current\nexchange rate. Voting power can be calculated as total bonded shares\nmultiplied by exchange rate." + }, + "tendermint.types.BlockID": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "tendermint.types.Header": { + "type": "object", + "properties": { + "version": { + "title": "basic block info", + "type": "object", + "properties": { + "block": { + "type": "string", + "format": "uint64" + }, + "app": { + "type": "string", + "format": "uint64" + } + }, + "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." + }, + "chain_id": { + "type": "string" + }, + "height": { + "type": "string", + "format": "int64" + }, + "time": { + "type": "string", + "format": "date-time" + }, + "last_block_id": { + "title": "prev block info", + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", "format": "int64" }, - "gas_used": { + "hash": { "type": "string", - "description": "Amount of gas consumed by transaction.", - "format": "int64" - }, - "tx": { + "format": "byte" + } + }, + "title": "PartsetHeader" + } + } + }, + "last_commit_hash": { + "type": "string", + "format": "byte", + "title": "hashes of block data" + }, + "data_hash": { + "type": "string", + "format": "byte" + }, + "validators_hash": { + "type": "string", + "format": "byte", + "title": "hashes from the app output from the prev block" + }, + "next_validators_hash": { + "type": "string", + "format": "byte" + }, + "consensus_hash": { + "type": "string", + "format": "byte" + }, + "app_hash": { + "type": "string", + "format": "byte" + }, + "last_results_hash": { + "type": "string", + "format": "byte" + }, + "evidence_hash": { + "type": "string", + "format": "byte", + "title": "consensus info" + }, + "proposer_address": { + "type": "string", + "format": "byte" + } + }, + "description": "Header defines the structure of a block header." + }, + "tendermint.types.PartSetHeader": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + }, + "tendermint.version.Consensus": { + "type": "object", + "properties": { + "block": { + "type": "string", + "format": "uint64" + }, + "app": { + "type": "string", + "format": "uint64" + } + }, + "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." + }, + "cosmos.base.abci.v1beta1.ABCIMessageLog": { + "type": "object", + "properties": { + "msg_index": { + "type": "integer", + "format": "int64" + }, + "log": { + "type": "string" + }, + "events": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "attributes": { + "type": "array", + "items": { "type": "object", "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + "key": { + "type": "string" }, "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" + "type": "string" } }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "timestamp": { - "type": "string", - "description": "Time of the previous block. For heights > 1, it's the weighted median of\nthe timestamps of the valid votes in the block.LastCommit. For height == 1,\nit's genesis time." - }, - "events": { - "type": "array", - "description": "Events defines all the events emitted by processing a transaction. Note,\nthese events include those emitted by processing all the messages and those\nemitted from the ante. Whereas Logs contains the events, with\nadditional metadata, emitted only by processing the messages.\n\nSince: cosmos-sdk 0.42.11, 0.44.5, 0.45", - "items": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "attributes": { - "type": "array", - "items": { - "type": "object", - "properties": { - "key": { - "type": "string" - }, - "value": { - "type": "string" - }, - "index": { - "type": "boolean" - } - }, - "description": "EventAttribute is a single key-value pair, associated with an event." - } - } - }, - "description": "Event allows application developers to attach additional information to\nResponseFinalizeBlock and ResponseCheckTx.\nLater, transactions may be queried using these events." - } + "description": "Attribute defines an attribute wrapper where the key and value are\nstrings instead of raw bytes." } - }, - "description": "TxResponse defines a structure containing relevant tx data and metadata. The\ntags are stringified and the log is JSON decoded." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" } }, - "description": "pagination defines a pagination for the response.\nDeprecated post v0.46.x: use total instead." + "description": "StringEvent defines en Event object wrapper where all the attributes\ncontain key/value pairs that are strings instead of raw bytes." }, - "total": { - "title": "total is total number of results available", - "type": "string", - "format": "uint64" - } - }, - "description": "GetTxsEventResponse is the response type for the Service.TxsByEvents\nRPC method." + "description": "Events contains a slice of Event objects that were emitted during some\nexecution." + } }, - "cosmos.tx.v1beta1.ModeInfo": { - "type": "object", - "properties": { - "single": { - "title": "single represents a single signer", - "type": "object", - "properties": { - "mode": { - "title": "mode is the signing mode of the single signer", - "type": "string", - "description": "SignMode represents a signing mode with its own security guarantees.\n\nThis enum should be considered a registry of all known sign modes\nin the Cosmos ecosystem. Apps are not expected to support all known\nsign modes. Apps that would like to support custom sign modes are\nencouraged to open a small PR against this file to add a new case\nto this SignMode enum describing their sign mode so that different\napps have a consistent version of this enum.\n\n - SIGN_MODE_UNSPECIFIED: SIGN_MODE_UNSPECIFIED specifies an unknown signing mode and will be\nrejected.\n - SIGN_MODE_DIRECT: SIGN_MODE_DIRECT specifies a signing mode which uses SignDoc and is\nverified with raw bytes from Tx.\n - SIGN_MODE_TEXTUAL: SIGN_MODE_TEXTUAL is a future signing mode that will verify some\nhuman-readable textual representation on top of the binary representation\nfrom SIGN_MODE_DIRECT. It is currently experimental, and should be used\nfor testing purposes only, until Textual is fully released. Please follow\nthe tracking issue https://github.com/cosmos/cosmos-sdk/issues/11970.\n - SIGN_MODE_DIRECT_AUX: SIGN_MODE_DIRECT_AUX specifies a signing mode which uses\nSignDocDirectAux. As opposed to SIGN_MODE_DIRECT, this sign mode does not\nrequire signers signing over other signers' `signer_info`. It also allows\nfor adding Tips in transactions.\n\nSince: cosmos-sdk 0.46\n - SIGN_MODE_LEGACY_AMINO_JSON: SIGN_MODE_LEGACY_AMINO_JSON is a backwards compatibility mode which uses\nAmino JSON and will be removed in the future.\n - SIGN_MODE_EIP_191: SIGN_MODE_EIP_191 specifies the sign mode for EIP 191 signing on the Cosmos\nSDK. Ref: https://eips.ethereum.org/EIPS/eip-191\n\nCurrently, SIGN_MODE_EIP_191 is registered as a SignMode enum variant,\nbut is not implemented on the SDK by default. To enable EIP-191, you need\nto pass a custom `TxConfig` that has an implementation of\n`SignModeHandler` for EIP-191. The SDK may decide to fully support\nEIP-191 in the future.\n\nSince: cosmos-sdk 0.45.2", - "default": "SIGN_MODE_UNSPECIFIED", - "enum": [ - "SIGN_MODE_UNSPECIFIED", - "SIGN_MODE_DIRECT", - "SIGN_MODE_TEXTUAL", - "SIGN_MODE_DIRECT_AUX", - "SIGN_MODE_LEGACY_AMINO_JSON", - "SIGN_MODE_EIP_191" - ] - } - } - }, - "multi": { - "$ref": "#/components/schemas/cosmos.tx.v1beta1.ModeInfo.Multi" - } - }, - "description": "ModeInfo describes the signing mode of a single or nested multisig signer." + "description": "ABCIMessageLog defines a structure containing an indexed tx ABCI message log." + }, + "cosmos.base.abci.v1beta1.Attribute": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "description": "Attribute defines an attribute wrapper where the key and value are\nstrings instead of raw bytes." + }, + "cosmos.base.abci.v1beta1.GasInfo": { + "type": "object", + "properties": { + "gas_wanted": { + "type": "string", + "format": "uint64", + "description": "GasWanted is the maximum units of work we allow this tx to perform." + }, + "gas_used": { + "type": "string", + "format": "uint64", + "description": "GasUsed is the amount of gas actually consumed." + } }, - "cosmos.tx.v1beta1.ModeInfo.Multi": { - "title": "Multi is the mode info for a multisig public key", - "type": "object", - "properties": { - "bitarray": { - "title": "bitarray specifies which keys within the multisig are signing", + "description": "GasInfo defines tx execution gas context." + }, + "cosmos.base.abci.v1beta1.Result": { + "type": "object", + "properties": { + "data": { + "type": "string", + "format": "byte", + "description": "Data is any data returned from message or handler execution. It MUST be\nlength prefixed in order to separate data from multiple message executions.\nDeprecated. This field is still populated, but prefer msg_response instead\nbecause it also contains the Msg response typeURL." + }, + "log": { + "type": "string", + "description": "Log contains the log information from message or handler execution." + }, + "events": { + "type": "array", + "items": { "type": "object", "properties": { - "extra_bits_stored": { - "type": "integer", - "format": "int64" + "type": { + "type": "string" }, - "elems": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" + "attributes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "type": "string" + }, + "index": { + "type": "boolean" + } + }, + "description": "EventAttribute is a single key-value pair, associated with an event." + } } }, - "description": "CompactBitArray is an implementation of a space efficient bit array.\nThis is used to ensure that the encoded data takes up a minimal amount of\nspace after proto encoding.\nThis is not thread safe, and is not intended for concurrent usage." + "description": "Event allows application developers to attach additional information to\nResponseFinalizeBlock and ResponseCheckTx.\nLater, transactions may be queried using these events." }, - "mode_infos": { - "title": "mode_infos is the corresponding modes of the signers of the multisig\nwhich could include nested multisig public keys", - "type": "array", - "items": { - "$ref": "#/components/schemas/cosmos.tx.v1beta1.ModeInfo" - } - } - } - }, - "cosmos.tx.v1beta1.ModeInfo.Single": { - "title": "Single is the mode info for a single signer. It is structured as a message\nto allow for additional fields such as locale for SIGN_MODE_TEXTUAL in the\nfuture", - "type": "object", - "properties": { - "mode": { - "title": "mode is the signing mode of the single signer", - "type": "string", - "description": "SignMode represents a signing mode with its own security guarantees.\n\nThis enum should be considered a registry of all known sign modes\nin the Cosmos ecosystem. Apps are not expected to support all known\nsign modes. Apps that would like to support custom sign modes are\nencouraged to open a small PR against this file to add a new case\nto this SignMode enum describing their sign mode so that different\napps have a consistent version of this enum.\n\n - SIGN_MODE_UNSPECIFIED: SIGN_MODE_UNSPECIFIED specifies an unknown signing mode and will be\nrejected.\n - SIGN_MODE_DIRECT: SIGN_MODE_DIRECT specifies a signing mode which uses SignDoc and is\nverified with raw bytes from Tx.\n - SIGN_MODE_TEXTUAL: SIGN_MODE_TEXTUAL is a future signing mode that will verify some\nhuman-readable textual representation on top of the binary representation\nfrom SIGN_MODE_DIRECT. It is currently experimental, and should be used\nfor testing purposes only, until Textual is fully released. Please follow\nthe tracking issue https://github.com/cosmos/cosmos-sdk/issues/11970.\n - SIGN_MODE_DIRECT_AUX: SIGN_MODE_DIRECT_AUX specifies a signing mode which uses\nSignDocDirectAux. As opposed to SIGN_MODE_DIRECT, this sign mode does not\nrequire signers signing over other signers' `signer_info`. It also allows\nfor adding Tips in transactions.\n\nSince: cosmos-sdk 0.46\n - SIGN_MODE_LEGACY_AMINO_JSON: SIGN_MODE_LEGACY_AMINO_JSON is a backwards compatibility mode which uses\nAmino JSON and will be removed in the future.\n - SIGN_MODE_EIP_191: SIGN_MODE_EIP_191 specifies the sign mode for EIP 191 signing on the Cosmos\nSDK. Ref: https://eips.ethereum.org/EIPS/eip-191\n\nCurrently, SIGN_MODE_EIP_191 is registered as a SignMode enum variant,\nbut is not implemented on the SDK by default. To enable EIP-191, you need\nto pass a custom `TxConfig` that has an implementation of\n`SignModeHandler` for EIP-191. The SDK may decide to fully support\nEIP-191 in the future.\n\nSince: cosmos-sdk 0.45.2", - "default": "SIGN_MODE_UNSPECIFIED", - "enum": [ - "SIGN_MODE_UNSPECIFIED", - "SIGN_MODE_DIRECT", - "SIGN_MODE_TEXTUAL", - "SIGN_MODE_DIRECT_AUX", - "SIGN_MODE_LEGACY_AMINO_JSON", - "SIGN_MODE_EIP_191" - ] - } - } - }, - "cosmos.tx.v1beta1.OrderBy": { - "title": "OrderBy defines the sorting order", - "type": "string", - "description": "- ORDER_BY_UNSPECIFIED: ORDER_BY_UNSPECIFIED specifies an unknown sorting order. OrderBy defaults\nto ASC in this case.\n - ORDER_BY_ASC: ORDER_BY_ASC defines ascending order\n - ORDER_BY_DESC: ORDER_BY_DESC defines descending order", - "default": "ORDER_BY_UNSPECIFIED", - "enum": [ - "ORDER_BY_UNSPECIFIED", - "ORDER_BY_ASC", - "ORDER_BY_DESC" - ] - }, - "cosmos.tx.v1beta1.SignerInfo": { - "type": "object", - "properties": { - "public_key": { + "description": "Events contains a slice of Event objects that were emitted during message\nor handler execution." + }, + "msg_responses": { + "type": "array", + "items": { "type": "object", "properties": { "type_url": { @@ -38076,75 +32924,85 @@ "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." }, "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } }, "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" }, - "mode_info": { - "$ref": "#/components/schemas/cosmos.tx.v1beta1.ModeInfo" - }, - "sequence": { - "type": "string", - "description": "sequence is the sequence of the account, which describes the\nnumber of committed transactions signed by a given address. It is used to\nprevent replay attacks.", - "format": "uint64" - } - }, - "description": "SignerInfo describes the public key and signing mode of a single top-level\nsigner." - }, - "cosmos.tx.v1beta1.SimulateRequest": { - "type": "object", - "properties": { - "tx": { - "$ref": "#/components/schemas/cosmos.tx.v1beta1.Tx" - }, - "tx_bytes": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "tx_bytes is the raw transaction.\n\nSince: cosmos-sdk 0.43", - "format": "byte" - } - }, - "description": "SimulateRequest is the request type for the Service.Simulate\nRPC method." + "description": "msg_responses contains the Msg handler responses type packed in Anys.\n\nSince: cosmos-sdk 0.46" + } }, - "cosmos.tx.v1beta1.SimulateResponse": { - "type": "object", - "properties": { - "gas_info": { + "description": "Result is the union of ResponseFormat and ResponseCheckTx." + }, + "cosmos.base.abci.v1beta1.StringEvent": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "attributes": { + "type": "array", + "items": { "type": "object", "properties": { - "gas_wanted": { - "type": "string", - "description": "GasWanted is the maximum units of work we allow this tx to perform.", - "format": "uint64" + "key": { + "type": "string" }, - "gas_used": { - "type": "string", - "description": "GasUsed is the amount of gas actually consumed.", - "format": "uint64" + "value": { + "type": "string" } }, - "description": "gas_info is the information about gas used in the simulation." - }, - "result": { + "description": "Attribute defines an attribute wrapper where the key and value are\nstrings instead of raw bytes." + } + } + }, + "description": "StringEvent defines en Event object wrapper where all the attributes\ncontain key/value pairs that are strings instead of raw bytes." + }, + "cosmos.base.abci.v1beta1.TxResponse": { + "type": "object", + "properties": { + "height": { + "type": "string", + "format": "int64", + "title": "The block height" + }, + "txhash": { + "type": "string", + "description": "The transaction hash." + }, + "codespace": { + "type": "string", + "title": "Namespace for the Code" + }, + "code": { + "type": "integer", + "format": "int64", + "description": "Response code." + }, + "data": { + "type": "string", + "description": "Result bytes, if any." + }, + "raw_log": { + "type": "string", + "description": "The output of the application's logger (raw string). May be\nnon-deterministic." + }, + "logs": { + "type": "array", + "items": { "type": "object", "properties": { - "data": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Data is any data returned from message or handler execution. It MUST be\nlength prefixed in order to separate data from multiple message executions.\nDeprecated. This field is still populated, but prefer msg_response instead\nbecause it also contains the Msg response typeURL.", - "format": "byte" + "msg_index": { + "type": "integer", + "format": "int64" }, "log": { - "type": "string", - "description": "Log contains the log information from message or handler execution." + "type": "string" }, "events": { "type": "array", - "description": "Events contains a slice of Event objects that were emitted during message\nor handler execution.", "items": { "type": "object", "properties": { @@ -38161,912 +33019,961 @@ }, "value": { "type": "string" - }, - "index": { - "type": "boolean" } }, - "description": "EventAttribute is a single key-value pair, associated with an event." + "description": "Attribute defines an attribute wrapper where the key and value are\nstrings instead of raw bytes." } } }, - "description": "Event allows application developers to attach additional information to\nResponseFinalizeBlock and ResponseCheckTx.\nLater, transactions may be queried using these events." - } + "description": "StringEvent defines en Event object wrapper where all the attributes\ncontain key/value pairs that are strings instead of raw bytes." + }, + "description": "Events contains a slice of Event objects that were emitted during some\nexecution." + } + }, + "description": "ABCIMessageLog defines a structure containing an indexed tx ABCI message log." + }, + "description": "The output of the application's logger (typed). May be non-deterministic." + }, + "info": { + "type": "string", + "description": "Additional information. May be non-deterministic." + }, + "gas_wanted": { + "type": "string", + "format": "int64", + "description": "Amount of gas requested for transaction." + }, + "gas_used": { + "type": "string", + "format": "int64", + "description": "Amount of gas consumed by transaction." + }, + "tx": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "timestamp": { + "type": "string", + "description": "Time of the previous block. For heights > 1, it's the weighted median of\nthe timestamps of the valid votes in the block.LastCommit. For height == 1,\nit's genesis time." + }, + "events": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string" }, - "msg_responses": { + "attributes": { "type": "array", - "description": "msg_responses contains the Msg handler responses type packed in Anys.\n\nSince: cosmos-sdk 0.46", "items": { "type": "object", "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + "key": { + "type": "string" }, "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" + "type": "string" + }, + "index": { + "type": "boolean" } }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "description": "EventAttribute is a single key-value pair, associated with an event." + } + } + }, + "description": "Event allows application developers to attach additional information to\nResponseFinalizeBlock and ResponseCheckTx.\nLater, transactions may be queried using these events." + }, + "description": "Events defines all the events emitted by processing a transaction. Note,\nthese events include those emitted by processing all the messages and those\nemitted from the ante. Whereas Logs contains the events, with\nadditional metadata, emitted only by processing the messages.\n\nSince: cosmos-sdk 0.42.11, 0.44.5, 0.45" + } + }, + "description": "TxResponse defines a structure containing relevant tx data and metadata. The\ntags are stringified and the log is JSON decoded." + }, + "cosmos.crypto.multisig.v1beta1.CompactBitArray": { + "type": "object", + "properties": { + "extra_bits_stored": { + "type": "integer", + "format": "int64" + }, + "elems": { + "type": "string", + "format": "byte" + } + }, + "description": "CompactBitArray is an implementation of a space efficient bit array.\nThis is used to ensure that the encoded data takes up a minimal amount of\nspace after proto encoding.\nThis is not thread safe, and is not intended for concurrent usage." + }, + "cosmos.tx.signing.v1beta1.SignMode": { + "type": "string", + "enum": [ + "SIGN_MODE_UNSPECIFIED", + "SIGN_MODE_DIRECT", + "SIGN_MODE_TEXTUAL", + "SIGN_MODE_DIRECT_AUX", + "SIGN_MODE_LEGACY_AMINO_JSON", + "SIGN_MODE_EIP_191" + ], + "default": "SIGN_MODE_UNSPECIFIED", + "description": "SignMode represents a signing mode with its own security guarantees.\n\nThis enum should be considered a registry of all known sign modes\nin the Cosmos ecosystem. Apps are not expected to support all known\nsign modes. Apps that would like to support custom sign modes are\nencouraged to open a small PR against this file to add a new case\nto this SignMode enum describing their sign mode so that different\napps have a consistent version of this enum.\n\n - SIGN_MODE_UNSPECIFIED: SIGN_MODE_UNSPECIFIED specifies an unknown signing mode and will be\nrejected.\n - SIGN_MODE_DIRECT: SIGN_MODE_DIRECT specifies a signing mode which uses SignDoc and is\nverified with raw bytes from Tx.\n - SIGN_MODE_TEXTUAL: SIGN_MODE_TEXTUAL is a future signing mode that will verify some\nhuman-readable textual representation on top of the binary representation\nfrom SIGN_MODE_DIRECT.\n\nSince: cosmos-sdk 0.50\n - SIGN_MODE_DIRECT_AUX: SIGN_MODE_DIRECT_AUX specifies a signing mode which uses\nSignDocDirectAux. As opposed to SIGN_MODE_DIRECT, this sign mode does not\nrequire signers signing over other signers' `signer_info`.\n\nSince: cosmos-sdk 0.46\n - SIGN_MODE_LEGACY_AMINO_JSON: SIGN_MODE_LEGACY_AMINO_JSON is a backwards compatibility mode which uses\nAmino JSON and will be removed in the future.\n - SIGN_MODE_EIP_191: SIGN_MODE_EIP_191 specifies the sign mode for EIP 191 signing on the Cosmos\nSDK. Ref: https://eips.ethereum.org/EIPS/eip-191\n\nCurrently, SIGN_MODE_EIP_191 is registered as a SignMode enum variant,\nbut is not implemented on the SDK by default. To enable EIP-191, you need\nto pass a custom `TxConfig` that has an implementation of\n`SignModeHandler` for EIP-191. The SDK may decide to fully support\nEIP-191 in the future.\n\nSince: cosmos-sdk 0.45.2\nDeprecated: post 0.47.x Sign mode refers to a method of encoding string data for\nsigning, but in the SDK, it also refers to how to encode a transaction into a string.\nThis opens the possibility for additional EIP191 sign modes, like SIGN_MODE_EIP_191_TEXTUAL,\nSIGN_MODE_EIP_191_LEGACY_JSON, and more.\nEach new EIP191 sign mode should be accompanied by an associated ADR." + }, + "cosmos.tx.v1beta1.AuthInfo": { + "type": "object", + "properties": { + "signer_infos": { + "type": "array", + "items": { + "$ref": "#/definitions/cosmos.tx.v1beta1.SignerInfo" + }, + "description": "signer_infos defines the signing modes for the required signers. The number\nand order of elements must match the required signers from TxBody's\nmessages. The first element is the primary signer and the one which pays\nthe fee." + }, + "fee": { + "description": "Fee is the fee and gas limit for the transaction. The first signer is the\nprimary signer and the one which pays the fee. The fee can be calculated\nbased on the cost of evaluating the body and doing signature verification\nof the signers. This can be estimated via simulation.", + "type": "object", + "properties": { + "amount": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "title": "amount is the amount of coins to be paid as a fee" + }, + "gas_limit": { + "type": "string", + "format": "uint64", + "title": "gas_limit is the maximum gas that can be used in transaction processing\nbefore an out of gas error occurs" + }, + "payer": { + "type": "string", + "description": "if unset, the first signer is responsible for paying the fees. If set, the specified account must pay the fees.\nthe payer must be a tx signer (and thus have signed this field in AuthInfo).\nsetting this field does *not* change the ordering of required signers for the transaction." + }, + "granter": { + "type": "string", + "title": "if set, the fee payer (either the first signer or the value of the payer field) requests that a fee grant be used\nto pay fees instead of the fee payer's own balance. If an appropriate fee grant does not exist or the chain does\nnot support fee grants, this will fail" + } + } + }, + "tip": { + "description": "Tip is the optional tip used for transactions fees paid in another denom.\n\nThis field is ignored if the chain didn't enable tips, i.e. didn't add the\n`TipDecorator` in its posthandler.\n\nSince: cosmos-sdk 0.46", + "type": "object", + "properties": { + "amount": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "title": "amount is the amount of the tip" + }, + "tipper": { + "type": "string", + "title": "tipper is the address of the account paying for the tip" + } + } + } + }, + "description": "AuthInfo describes the fee and signer modes that are used to sign a\ntransaction." + }, + "cosmos.tx.v1beta1.BroadcastMode": { + "type": "string", + "enum": [ + "BROADCAST_MODE_UNSPECIFIED", + "BROADCAST_MODE_BLOCK", + "BROADCAST_MODE_SYNC", + "BROADCAST_MODE_ASYNC" + ], + "default": "BROADCAST_MODE_UNSPECIFIED", + "description": "BroadcastMode specifies the broadcast mode for the TxService.Broadcast RPC\nmethod.\n\n - BROADCAST_MODE_UNSPECIFIED: zero-value for mode ordering\n - BROADCAST_MODE_BLOCK: Deprecated: use BROADCAST_MODE_SYNC instead,\nBROADCAST_MODE_BLOCK is not supported by the SDK from v0.47.x onwards.\n - BROADCAST_MODE_SYNC: BROADCAST_MODE_SYNC defines a tx broadcasting mode where the client waits\nfor a CheckTx execution response only.\n - BROADCAST_MODE_ASYNC: BROADCAST_MODE_ASYNC defines a tx broadcasting mode where the client\nreturns immediately." + }, + "cosmos.tx.v1beta1.BroadcastTxRequest": { + "type": "object", + "properties": { + "tx_bytes": { + "type": "string", + "format": "byte", + "description": "tx_bytes is the raw transaction." + }, + "mode": { + "type": "string", + "enum": [ + "BROADCAST_MODE_UNSPECIFIED", + "BROADCAST_MODE_BLOCK", + "BROADCAST_MODE_SYNC", + "BROADCAST_MODE_ASYNC" + ], + "default": "BROADCAST_MODE_UNSPECIFIED", + "description": "BroadcastMode specifies the broadcast mode for the TxService.Broadcast RPC\nmethod.\n\n - BROADCAST_MODE_UNSPECIFIED: zero-value for mode ordering\n - BROADCAST_MODE_BLOCK: Deprecated: use BROADCAST_MODE_SYNC instead,\nBROADCAST_MODE_BLOCK is not supported by the SDK from v0.47.x onwards.\n - BROADCAST_MODE_SYNC: BROADCAST_MODE_SYNC defines a tx broadcasting mode where the client waits\nfor a CheckTx execution response only.\n - BROADCAST_MODE_ASYNC: BROADCAST_MODE_ASYNC defines a tx broadcasting mode where the client\nreturns immediately." + } + }, + "description": "BroadcastTxRequest is the request type for the Service.BroadcastTxRequest\nRPC method." + }, + "cosmos.tx.v1beta1.BroadcastTxResponse": { + "type": "object", + "properties": { + "tx_response": { + "type": "object", + "properties": { + "height": { + "type": "string", + "format": "int64", + "title": "The block height" + }, + "txhash": { + "type": "string", + "description": "The transaction hash." + }, + "codespace": { + "type": "string", + "title": "Namespace for the Code" + }, + "code": { + "type": "integer", + "format": "int64", + "description": "Response code." + }, + "data": { + "type": "string", + "description": "Result bytes, if any." + }, + "raw_log": { + "type": "string", + "description": "The output of the application's logger (raw string). May be\nnon-deterministic." + }, + "logs": { + "type": "array", + "items": { + "type": "object", + "properties": { + "msg_index": { + "type": "integer", + "format": "int64" + }, + "log": { + "type": "string" + }, + "events": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "attributes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "description": "Attribute defines an attribute wrapper where the key and value are\nstrings instead of raw bytes." + } + } + }, + "description": "StringEvent defines en Event object wrapper where all the attributes\ncontain key/value pairs that are strings instead of raw bytes." + }, + "description": "Events contains a slice of Event objects that were emitted during some\nexecution." + } + }, + "description": "ABCIMessageLog defines a structure containing an indexed tx ABCI message log." + }, + "description": "The output of the application's logger (typed). May be non-deterministic." + }, + "info": { + "type": "string", + "description": "Additional information. May be non-deterministic." + }, + "gas_wanted": { + "type": "string", + "format": "int64", + "description": "Amount of gas requested for transaction." + }, + "gas_used": { + "type": "string", + "format": "int64", + "description": "Amount of gas consumed by transaction." + }, + "tx": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "timestamp": { + "type": "string", + "description": "Time of the previous block. For heights > 1, it's the weighted median of\nthe timestamps of the valid votes in the block.LastCommit. For height == 1,\nit's genesis time." + }, + "events": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "attributes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "type": "string" + }, + "index": { + "type": "boolean" + } + }, + "description": "EventAttribute is a single key-value pair, associated with an event." + } + } + }, + "description": "Event allows application developers to attach additional information to\nResponseFinalizeBlock and ResponseCheckTx.\nLater, transactions may be queried using these events." + }, + "description": "Events defines all the events emitted by processing a transaction. Note,\nthese events include those emitted by processing all the messages and those\nemitted from the ante. Whereas Logs contains the events, with\nadditional metadata, emitted only by processing the messages.\n\nSince: cosmos-sdk 0.42.11, 0.44.5, 0.45" + } + }, + "description": "TxResponse defines a structure containing relevant tx data and metadata. The\ntags are stringified and the log is JSON decoded." + } + }, + "description": "BroadcastTxResponse is the response type for the\nService.BroadcastTx method." + }, + "cosmos.tx.v1beta1.Fee": { + "type": "object", + "properties": { + "amount": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" + }, + "amount": { + "type": "string" } }, - "description": "result is the result of the simulation." - } + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + }, + "title": "amount is the amount of coins to be paid as a fee" + }, + "gas_limit": { + "type": "string", + "format": "uint64", + "title": "gas_limit is the maximum gas that can be used in transaction processing\nbefore an out of gas error occurs" }, - "description": "SimulateResponse is the response type for the\nService.SimulateRPC method." + "payer": { + "type": "string", + "description": "if unset, the first signer is responsible for paying the fees. If set, the specified account must pay the fees.\nthe payer must be a tx signer (and thus have signed this field in AuthInfo).\nsetting this field does *not* change the ordering of required signers for the transaction." + }, + "granter": { + "type": "string", + "title": "if set, the fee payer (either the first signer or the value of the payer field) requests that a fee grant be used\nto pay fees instead of the fee payer's own balance. If an appropriate fee grant does not exist or the chain does\nnot support fee grants, this will fail" + } }, - "cosmos.tx.v1beta1.Tip": { - "type": "object", - "properties": { - "amount": { - "title": "amount is the amount of the tip", - "type": "array", - "items": { + "description": "Fee includes the amount of coins paid in fees and the maximum\ngas to be used by the transaction. The ratio yields an effective \"gasprice\",\nwhich must be above some miminum to be accepted into the mempool." + }, + "cosmos.tx.v1beta1.GetBlockWithTxsResponse": { + "type": "object", + "properties": { + "txs": { + "type": "array", + "items": { + "$ref": "#/definitions/cosmos.tx.v1beta1.Tx" + }, + "description": "txs are the transactions in the block." + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { "type": "object", "properties": { - "denom": { - "type": "string" + "total": { + "type": "integer", + "format": "int64" }, - "amount": { - "type": "string" + "hash": { + "type": "string", + "format": "byte" } }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." + "title": "PartsetHeader" } }, - "tipper": { - "title": "tipper is the address of the account paying for the tip", - "type": "string" - } + "title": "BlockID" }, - "description": "Tip is the tip used for meta-transactions.\n\nSince: cosmos-sdk 0.46" - }, - "cosmos.tx.v1beta1.Tx": { - "type": "object", - "properties": { - "body": { - "title": "body is the processable content of the transaction", - "type": "object", - "properties": { - "messages": { - "type": "array", - "description": "messages is a list of messages to be executed. The required signers of\nthose messages define the number and order of elements in AuthInfo's\nsigner_infos and Tx's signatures. Each required signer address is added to\nthe list only the first time it occurs.\nBy convention, the first required signer (usually from the first message)\nis referred to as the primary signer and pays the fee for the whole\ntransaction.", - "items": { + "block": { + "type": "object", + "properties": { + "header": { + "type": "object", + "properties": { + "version": { + "title": "basic block info", "type": "object", "properties": { - "type_url": { + "block": { "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + "format": "uint64" }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "app": { "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" + "format": "uint64" } }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - }, - "memo": { - "type": "string", - "description": "memo is any arbitrary note/comment to be added to the transaction.\nWARNING: in clients, any publicly exposed text should not be called memo,\nbut should be called `note` instead (see https://github.com/cosmos/cosmos-sdk/issues/9122)." - }, - "timeout_height": { - "title": "timeout is the block height after which this transaction will not\nbe processed by the chain", - "type": "string", - "format": "uint64" - }, - "extension_options": { - "title": "extension_options are arbitrary options that can be added by chains\nwhen the default options are not sufficient. If any of these are present\nand can't be handled, the transaction will be rejected", - "type": "array", - "items": { + "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." + }, + "chain_id": { + "type": "string" + }, + "height": { + "type": "string", + "format": "int64" + }, + "time": { + "type": "string", + "format": "date-time" + }, + "last_block_id": { "type": "object", "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "hash": { "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - }, - "non_critical_extension_options": { - "title": "extension_options are arbitrary options that can be added by chains\nwhen the default options are not sufficient. If any of these are present\nand can't be handled, they will be ignored", - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" } }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - }, - "description": "TxBody is the body of a transaction that all signers sign over." - }, - "auth_info": { - "$ref": "#/components/schemas/cosmos.tx.v1beta1.AuthInfo" - }, - "signatures": { - "type": "array", - "description": "signatures is a list of signatures that matches the length and order of\nAuthInfo's signer_infos to allow connecting signature meta information like\npublic key and signing mode by position.", - "items": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - }, - "description": "Tx is the standard type used for broadcasting transactions." - }, - "cosmos.tx.v1beta1.TxBody": { - "type": "object", - "properties": { - "messages": { - "type": "array", - "description": "messages is a list of messages to be executed. The required signers of\nthose messages define the number and order of elements in AuthInfo's\nsigner_infos and Tx's signatures. Each required signer address is added to\nthe list only the first time it occurs.\nBy convention, the first required signer (usually from the first message)\nis referred to as the primary signer and pays the fee for the whole\ntransaction.", - "items": { - "type": "object", - "properties": { - "type_url": { + "title": "BlockID" + }, + "last_commit_hash": { "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + "format": "byte", + "title": "hashes of block data" }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "data_hash": { "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - }, - "memo": { - "type": "string", - "description": "memo is any arbitrary note/comment to be added to the transaction.\nWARNING: in clients, any publicly exposed text should not be called memo,\nbut should be called `note` instead (see https://github.com/cosmos/cosmos-sdk/issues/9122)." - }, - "timeout_height": { - "title": "timeout is the block height after which this transaction will not\nbe processed by the chain", - "type": "string", - "format": "uint64" - }, - "extension_options": { - "title": "extension_options are arbitrary options that can be added by chains\nwhen the default options are not sufficient. If any of these are present\nand can't be handled, the transaction will be rejected", - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { + }, + "validators_hash": { "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + "format": "byte", + "title": "hashes from the app output from the prev block" }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "next_validators_hash": { "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - }, - "non_critical_extension_options": { - "title": "extension_options are arbitrary options that can be added by chains\nwhen the default options are not sufficient. If any of these are present\nand can't be handled, they will be ignored", - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "consensus_hash": { "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - }, - "description": "TxBody is the body of a transaction that all signers sign over." - }, - "cosmos.tx.v1beta1.TxDecodeAminoRequest": { - "type": "object", - "properties": { - "amino_binary": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "TxDecodeAminoRequest is the request type for the Service.TxDecodeAmino\nRPC method.\n\nSince: cosmos-sdk 0.47" - }, - "cosmos.tx.v1beta1.TxDecodeAminoResponse": { - "type": "object", - "properties": { - "amino_json": { - "type": "string" - } - }, - "description": "TxDecodeAminoResponse is the response type for the Service.TxDecodeAmino\nRPC method.\n\nSince: cosmos-sdk 0.47" - }, - "cosmos.tx.v1beta1.TxDecodeRequest": { - "type": "object", - "properties": { - "tx_bytes": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "tx_bytes is the raw transaction.", - "format": "byte" - } - }, - "description": "TxDecodeRequest is the request type for the Service.TxDecode\nRPC method.\n\nSince: cosmos-sdk 0.47" - }, - "cosmos.tx.v1beta1.TxDecodeResponse": { - "type": "object", - "properties": { - "tx": { - "$ref": "#/components/schemas/cosmos.tx.v1beta1.Tx" - } - }, - "description": "TxDecodeResponse is the response type for the\nService.TxDecode method.\n\nSince: cosmos-sdk 0.47" - }, - "cosmos.tx.v1beta1.TxEncodeAminoRequest": { - "type": "object", - "properties": { - "amino_json": { - "type": "string" - } - }, - "description": "TxEncodeAminoRequest is the request type for the Service.TxEncodeAmino\nRPC method.\n\nSince: cosmos-sdk 0.47" - }, - "cosmos.tx.v1beta1.TxEncodeAminoResponse": { - "type": "object", - "properties": { - "amino_binary": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "TxEncodeAminoResponse is the response type for the Service.TxEncodeAmino\nRPC method.\n\nSince: cosmos-sdk 0.47" - }, - "cosmos.tx.v1beta1.TxEncodeRequest": { - "type": "object", - "properties": { - "tx": { - "$ref": "#/components/schemas/cosmos.tx.v1beta1.Tx" - } - }, - "description": "TxEncodeRequest is the request type for the Service.TxEncode\nRPC method.\n\nSince: cosmos-sdk 0.47" - }, - "cosmos.tx.v1beta1.TxEncodeResponse": { - "type": "object", - "properties": { - "tx_bytes": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "tx_bytes is the encoded transaction bytes.", - "format": "byte" - } - }, - "description": "TxEncodeResponse is the response type for the\nService.TxEncode method.\n\nSince: cosmos-sdk 0.47" - }, - "tendermint.abci.Event": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "attributes": { - "type": "array", - "items": { - "type": "object", - "properties": { - "key": { - "type": "string" - }, - "value": { - "type": "string" }, - "index": { - "type": "boolean" - } - }, - "description": "EventAttribute is a single key-value pair, associated with an event." - } - } - }, - "description": "Event allows application developers to attach additional information to\nResponseFinalizeBlock and ResponseCheckTx.\nLater, transactions may be queried using these events." - }, - "tendermint.abci.EventAttribute": { - "type": "object", - "properties": { - "key": { - "type": "string" - }, - "value": { - "type": "string" - }, - "index": { - "type": "boolean" - } - }, - "description": "EventAttribute is a single key-value pair, associated with an event." - }, - "tendermint.crypto.PublicKey": { - "title": "PublicKey defines the keys available for use with Validators", - "type": "object", - "properties": { - "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - }, - "tendermint.types.Block": { - "type": "object", - "properties": { - "header": { - "type": "object", - "properties": { - "version": { - "title": "basic block info", - "type": "object", - "properties": { - "block": { - "type": "string", - "format": "uint64" - }, - "app": { - "type": "string", - "format": "uint64" - } + "app_hash": { + "type": "string", + "format": "byte" }, - "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." - }, - "chain_id": { - "type": "string" - }, - "height": { - "type": "string", - "format": "int64" - }, - "time": { - "type": "string", - "format": "date-time" + "last_results_hash": { + "type": "string", + "format": "byte" + }, + "evidence_hash": { + "type": "string", + "format": "byte", + "title": "consensus info" + }, + "proposer_address": { + "type": "string", + "format": "byte" + } }, - "last_block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "description": "Header defines the structure of a block header." + }, + "data": { + "type": "object", + "properties": { + "txs": { + "type": "array", + "items": { "type": "string", "format": "byte" }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } + "description": "Txs that will be applied by state @ block.Height+1.\nNOTE: not all txs here are valid. We're just agreeing on the order first.\nThis means that block.AppHash does not include these txs." } }, - "last_commit_hash": { - "title": "hashes of block data", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "data_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validators_hash": { - "title": "hashes from the app output from the prev block", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "next_validators_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "consensus_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "app_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "last_results_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "evidence_hash": { - "title": "consensus info", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proposer_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } + "title": "Data contains the set of transactions included in the block" }, - "description": "Header defines the structure of a block header." - }, - "data": { - "title": "Data contains the set of transactions included in the block", - "type": "object", - "properties": { - "txs": { - "type": "array", - "description": "Txs that will be applied by state @ block.Height+1.\nNOTE: not all txs here are valid. We're just agreeing on the order first.\nThis means that block.AppHash does not include these txs.", - "items": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - }, - "evidence": { - "type": "object", - "properties": { - "evidence": { - "type": "array", - "items": { - "type": "object", - "properties": { - "duplicate_vote_evidence": { - "type": "object", - "properties": { - "vote_a": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals", - "default": "SIGNED_MSG_TYPE_UNKNOWN", - "enum": [ - "SIGNED_MSG_TYPE_UNKNOWN", - "SIGNED_MSG_TYPE_PREVOTE", - "SIGNED_MSG_TYPE_PRECOMMIT", - "SIGNED_MSG_TYPE_PROPOSAL" - ] - }, - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" + "evidence": { + "type": "object", + "properties": { + "evidence": { + "type": "array", + "items": { + "type": "object", + "properties": { + "duplicate_vote_evidence": { + "type": "object", + "properties": { + "vote_a": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "SIGNED_MSG_TYPE_UNKNOWN", + "SIGNED_MSG_TYPE_PREVOTE", + "SIGNED_MSG_TYPE_PRECOMMIT", + "SIGNED_MSG_TYPE_PROPOSAL" + ], + "default": "SIGNED_MSG_TYPE_UNKNOWN", + "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals" + }, + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } + "title": "PartsetHeader" } - } + }, + "title": "BlockID" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "validator_index": { + "type": "integer", + "format": "int32" + }, + "signature": { + "type": "string", + "format": "byte", + "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." + }, + "extension": { + "type": "string", + "format": "byte", + "description": "Vote extension provided by the application. Only valid for precommit\nmessages." + }, + "extension_signature": { + "type": "string", + "format": "byte", + "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." } }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validator_index": { - "type": "integer", - "format": "int32" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block.", - "format": "byte" - }, - "extension": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages.", - "format": "byte" - }, - "extension_signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages.", - "format": "byte" - } + "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." - }, - "vote_b": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals", - "default": "SIGNED_MSG_TYPE_UNKNOWN", - "enum": [ - "SIGNED_MSG_TYPE_UNKNOWN", - "SIGNED_MSG_TYPE_PREVOTE", - "SIGNED_MSG_TYPE_PRECOMMIT", - "SIGNED_MSG_TYPE_PROPOSAL" - ] - }, - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" + "vote_b": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "SIGNED_MSG_TYPE_UNKNOWN", + "SIGNED_MSG_TYPE_PREVOTE", + "SIGNED_MSG_TYPE_PRECOMMIT", + "SIGNED_MSG_TYPE_PROPOSAL" + ], + "default": "SIGNED_MSG_TYPE_UNKNOWN", + "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals" + }, + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } + "title": "PartsetHeader" } - } + }, + "title": "BlockID" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "validator_index": { + "type": "integer", + "format": "int32" + }, + "signature": { + "type": "string", + "format": "byte", + "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." + }, + "extension": { + "type": "string", + "format": "byte", + "description": "Vote extension provided by the application. Only valid for precommit\nmessages." + }, + "extension_signature": { + "type": "string", + "format": "byte", + "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." } }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validator_index": { - "type": "integer", - "format": "int32" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block.", - "format": "byte" - }, - "extension": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages.", - "format": "byte" - }, - "extension_signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages.", - "format": "byte" - } + "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." - }, - "total_voting_power": { - "type": "string", - "format": "int64" - }, - "validator_power": { - "type": "string", - "format": "int64" - }, - "timestamp": { - "type": "string", - "format": "date-time" - } + "total_voting_power": { + "type": "string", + "format": "int64" + }, + "validator_power": { + "type": "string", + "format": "int64" + }, + "timestamp": { + "type": "string", + "format": "date-time" + } + }, + "description": "DuplicateVoteEvidence contains evidence of a validator signed two conflicting votes." }, - "description": "DuplicateVoteEvidence contains evidence of a validator signed two conflicting votes." - }, - "light_client_attack_evidence": { - "type": "object", - "properties": { - "conflicting_block": { - "type": "object", - "properties": { - "signed_header": { - "type": "object", - "properties": { - "header": { - "type": "object", - "properties": { - "version": { - "title": "basic block info", - "type": "object", - "properties": { - "block": { - "type": "string", - "format": "uint64" + "light_client_attack_evidence": { + "type": "object", + "properties": { + "conflicting_block": { + "type": "object", + "properties": { + "signed_header": { + "type": "object", + "properties": { + "header": { + "type": "object", + "properties": { + "version": { + "title": "basic block info", + "type": "object", + "properties": { + "block": { + "type": "string", + "format": "uint64" + }, + "app": { + "type": "string", + "format": "uint64" + } }, - "app": { - "type": "string", - "format": "uint64" - } + "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." }, - "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." - }, - "chain_id": { - "type": "string" - }, - "height": { - "type": "string", - "format": "int64" - }, - "time": { - "type": "string", - "format": "date-time" + "chain_id": { + "type": "string" + }, + "height": { + "type": "string", + "format": "int64" + }, + "time": { + "type": "string", + "format": "date-time" + }, + "last_block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "last_commit_hash": { + "type": "string", + "format": "byte", + "title": "hashes of block data" + }, + "data_hash": { + "type": "string", + "format": "byte" + }, + "validators_hash": { + "type": "string", + "format": "byte", + "title": "hashes from the app output from the prev block" + }, + "next_validators_hash": { + "type": "string", + "format": "byte" + }, + "consensus_hash": { + "type": "string", + "format": "byte" + }, + "app_hash": { + "type": "string", + "format": "byte" + }, + "last_results_hash": { + "type": "string", + "format": "byte" + }, + "evidence_hash": { + "type": "string", + "format": "byte", + "title": "consensus info" + }, + "proposer_address": { + "type": "string", + "format": "byte" + } }, - "last_block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" + "description": "Header defines the structure of a block header." + }, + "commit": { + "type": "object", + "properties": { + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } }, - "part_set_header": { - "title": "PartsetHeader", + "title": "BlockID" + }, + "signatures": { + "type": "array", + "items": { "type": "object", "properties": { - "total": { - "type": "integer", - "format": "int64" + "block_id_flag": { + "type": "string", + "enum": [ + "BLOCK_ID_FLAG_UNKNOWN", + "BLOCK_ID_FLAG_ABSENT", + "BLOCK_ID_FLAG_COMMIT", + "BLOCK_ID_FLAG_NIL" + ], + "default": "BLOCK_ID_FLAG_UNKNOWN", + "title": "BlockIdFlag indicates which BlockID the signature is for" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "timestamp": { + "type": "string", + "format": "date-time" }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "signature": { "type": "string", "format": "byte" } - } + }, + "description": "CommitSig is a part of the Vote included in a Commit." } } }, - "last_commit_hash": { - "title": "hashes of block data", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "data_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validators_hash": { - "title": "hashes from the app output from the prev block", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "next_validators_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "consensus_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "app_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "last_results_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "evidence_hash": { - "title": "consensus info", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proposer_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "Header defines the structure of a block header." - }, - "commit": { - "type": "object", - "properties": { - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", + "description": "Commit contains the evidence that a block was committed by a set of validators." + } + } + }, + "validator_set": { + "type": "object", + "properties": { + "validators": { + "type": "array", + "items": { "type": "object", "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "address": { "type": "string", "format": "byte" }, - "part_set_header": { - "title": "PartsetHeader", + "pub_key": { "type": "object", "properties": { - "total": { - "type": "integer", - "format": "int64" + "ed25519": { + "type": "string", + "format": "byte" }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "secp256k1": { "type": "string", "format": "byte" } - } - } - } - }, - "signatures": { - "type": "array", - "items": { - "type": "object", - "properties": { - "block_id_flag": { - "title": "BlockIdFlag indicates which BlockID the signature is for", - "type": "string", - "default": "BLOCK_ID_FLAG_UNKNOWN", - "enum": [ - "BLOCK_ID_FLAG_UNKNOWN", - "BLOCK_ID_FLAG_ABSENT", - "BLOCK_ID_FLAG_COMMIT", - "BLOCK_ID_FLAG_NIL" - ] - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "timestamp": { - "type": "string", - "format": "date-time" }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } + "title": "PublicKey defines the keys available for use with Validators" + }, + "voting_power": { + "type": "string", + "format": "int64" }, - "description": "CommitSig is a part of the Vote included in a Commit." + "proposer_priority": { + "type": "string", + "format": "int64" + } } } }, - "description": "Commit contains the evidence that a block was committed by a set of validators." - } - } - }, - "validator_set": { - "type": "object", - "properties": { - "validators": { - "type": "array", - "items": { + "proposer": { "type": "object", "properties": { "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "format": "byte" }, "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", "type": "object", "properties": { "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "format": "byte" }, "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "format": "byte" } - } + }, + "title": "PublicKey defines the keys available for use with Validators" }, "voting_power": { "type": "string", @@ -39077,730 +33984,1189 @@ "format": "int64" } } + }, + "total_voting_power": { + "type": "string", + "format": "int64" } + } + } + } + }, + "common_height": { + "type": "string", + "format": "int64" + }, + "byzantine_validators": { + "type": "array", + "items": { + "type": "object", + "properties": { + "address": { + "type": "string", + "format": "byte" }, - "proposer": { + "pub_key": { "type": "object", "properties": { - "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "ed25519": { "type": "string", "format": "byte" }, - "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", - "type": "object", - "properties": { - "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - }, - "voting_power": { - "type": "string", - "format": "int64" - }, - "proposer_priority": { + "secp256k1": { "type": "string", - "format": "int64" + "format": "byte" } - } + }, + "title": "PublicKey defines the keys available for use with Validators" + }, + "voting_power": { + "type": "string", + "format": "int64" }, - "total_voting_power": { + "proposer_priority": { "type": "string", "format": "int64" } } } + }, + "total_voting_power": { + "type": "string", + "format": "int64" + }, + "timestamp": { + "type": "string", + "format": "date-time" } }, - "common_height": { + "description": "LightClientAttackEvidence contains evidence of a set of validators attempting to mislead a light client." + } + } + } + } + } + }, + "last_commit": { + "type": "object", + "properties": { + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { "type": "string", - "format": "int64" + "format": "byte" + } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "signatures": { + "type": "array", + "items": { + "type": "object", + "properties": { + "block_id_flag": { + "type": "string", + "enum": [ + "BLOCK_ID_FLAG_UNKNOWN", + "BLOCK_ID_FLAG_ABSENT", + "BLOCK_ID_FLAG_COMMIT", + "BLOCK_ID_FLAG_NIL" + ], + "default": "BLOCK_ID_FLAG_UNKNOWN", + "title": "BlockIdFlag indicates which BlockID the signature is for" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "signature": { + "type": "string", + "format": "byte" + } + }, + "description": "CommitSig is a part of the Vote included in a Commit." + } + } + }, + "description": "Commit contains the evidence that a block was committed by a set of validators." + } + } + }, + "pagination": { + "description": "pagination defines a pagination for the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } + } + } + }, + "description": "GetBlockWithTxsResponse is the response type for the Service.GetBlockWithTxs\nmethod.\n\nSince: cosmos-sdk 0.45.2" + }, + "cosmos.tx.v1beta1.GetTxResponse": { + "type": "object", + "properties": { + "tx": { + "$ref": "#/definitions/cosmos.tx.v1beta1.Tx", + "description": "tx is the queried transaction." + }, + "tx_response": { + "type": "object", + "properties": { + "height": { + "type": "string", + "format": "int64", + "title": "The block height" + }, + "txhash": { + "type": "string", + "description": "The transaction hash." + }, + "codespace": { + "type": "string", + "title": "Namespace for the Code" + }, + "code": { + "type": "integer", + "format": "int64", + "description": "Response code." + }, + "data": { + "type": "string", + "description": "Result bytes, if any." + }, + "raw_log": { + "type": "string", + "description": "The output of the application's logger (raw string). May be\nnon-deterministic." + }, + "logs": { + "type": "array", + "items": { + "type": "object", + "properties": { + "msg_index": { + "type": "integer", + "format": "int64" + }, + "log": { + "type": "string" + }, + "events": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string" }, - "byzantine_validators": { + "attributes": { "type": "array", "items": { "type": "object", "properties": { - "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", - "type": "object", - "properties": { - "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - }, - "voting_power": { - "type": "string", - "format": "int64" + "key": { + "type": "string" }, - "proposer_priority": { - "type": "string", - "format": "int64" + "value": { + "type": "string" } - } + }, + "description": "Attribute defines an attribute wrapper where the key and value are\nstrings instead of raw bytes." } + } + }, + "description": "StringEvent defines en Event object wrapper where all the attributes\ncontain key/value pairs that are strings instead of raw bytes." + }, + "description": "Events contains a slice of Event objects that were emitted during some\nexecution." + } + }, + "description": "ABCIMessageLog defines a structure containing an indexed tx ABCI message log." + }, + "description": "The output of the application's logger (typed). May be non-deterministic." + }, + "info": { + "type": "string", + "description": "Additional information. May be non-deterministic." + }, + "gas_wanted": { + "type": "string", + "format": "int64", + "description": "Amount of gas requested for transaction." + }, + "gas_used": { + "type": "string", + "format": "int64", + "description": "Amount of gas consumed by transaction." + }, + "tx": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "timestamp": { + "type": "string", + "description": "Time of the previous block. For heights > 1, it's the weighted median of\nthe timestamps of the valid votes in the block.LastCommit. For height == 1,\nit's genesis time." + }, + "events": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "attributes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string" }, - "total_voting_power": { - "type": "string", - "format": "int64" + "value": { + "type": "string" }, - "timestamp": { - "type": "string", - "format": "date-time" + "index": { + "type": "boolean" } }, - "description": "LightClientAttackEvidence contains evidence of a set of validators attempting to mislead a light client." + "description": "EventAttribute is a single key-value pair, associated with an event." } } - } - } + }, + "description": "Event allows application developers to attach additional information to\nResponseFinalizeBlock and ResponseCheckTx.\nLater, transactions may be queried using these events." + }, + "description": "Events defines all the events emitted by processing a transaction. Note,\nthese events include those emitted by processing all the messages and those\nemitted from the ante. Whereas Logs contains the events, with\nadditional metadata, emitted only by processing the messages.\n\nSince: cosmos-sdk 0.42.11, 0.44.5, 0.45" } }, - "last_commit": { + "description": "TxResponse defines a structure containing relevant tx data and metadata. The\ntags are stringified and the log is JSON decoded." + } + }, + "description": "GetTxResponse is the response type for the Service.GetTx method." + }, + "cosmos.tx.v1beta1.GetTxsEventResponse": { + "type": "object", + "properties": { + "txs": { + "type": "array", + "items": { + "$ref": "#/definitions/cosmos.tx.v1beta1.Tx" + }, + "description": "txs is the list of queried transactions." + }, + "tx_responses": { + "type": "array", + "items": { "type": "object", "properties": { "height": { "type": "string", - "format": "int64" + "format": "int64", + "title": "The block height" + }, + "txhash": { + "type": "string", + "description": "The transaction hash." + }, + "codespace": { + "type": "string", + "title": "Namespace for the Code" }, - "round": { + "code": { "type": "integer", - "format": "int32" + "format": "int64", + "description": "Response code." + }, + "data": { + "type": "string", + "description": "Result bytes, if any." + }, + "raw_log": { + "type": "string", + "description": "The output of the application's logger (raw string). May be\nnon-deterministic." + }, + "logs": { + "type": "array", + "items": { + "type": "object", + "properties": { + "msg_index": { + "type": "integer", + "format": "int64" + }, + "log": { + "type": "string" + }, + "events": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "attributes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "description": "Attribute defines an attribute wrapper where the key and value are\nstrings instead of raw bytes." + } + } + }, + "description": "StringEvent defines en Event object wrapper where all the attributes\ncontain key/value pairs that are strings instead of raw bytes." + }, + "description": "Events contains a slice of Event objects that were emitted during some\nexecution." + } + }, + "description": "ABCIMessageLog defines a structure containing an indexed tx ABCI message log." + }, + "description": "The output of the application's logger (typed). May be non-deterministic." + }, + "info": { + "type": "string", + "description": "Additional information. May be non-deterministic." + }, + "gas_wanted": { + "type": "string", + "format": "int64", + "description": "Amount of gas requested for transaction." + }, + "gas_used": { + "type": "string", + "format": "int64", + "description": "Amount of gas consumed by transaction." }, - "block_id": { - "title": "BlockID", + "tx": { "type": "object", "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "type_url": { "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "timestamp": { + "type": "string", + "description": "Time of the previous block. For heights > 1, it's the weighted median of\nthe timestamps of the valid votes in the block.LastCommit. For height == 1,\nit's genesis time." }, - "signatures": { + "events": { "type": "array", "items": { "type": "object", "properties": { - "block_id_flag": { - "title": "BlockIdFlag indicates which BlockID the signature is for", - "type": "string", - "default": "BLOCK_ID_FLAG_UNKNOWN", - "enum": [ - "BLOCK_ID_FLAG_UNKNOWN", - "BLOCK_ID_FLAG_ABSENT", - "BLOCK_ID_FLAG_COMMIT", - "BLOCK_ID_FLAG_NIL" - ] - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "timestamp": { - "type": "string", - "format": "date-time" + "type": { + "type": "string" }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" + "attributes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "type": "string" + }, + "index": { + "type": "boolean" + } + }, + "description": "EventAttribute is a single key-value pair, associated with an event." + } } }, - "description": "CommitSig is a part of the Vote included in a Commit." - } + "description": "Event allows application developers to attach additional information to\nResponseFinalizeBlock and ResponseCheckTx.\nLater, transactions may be queried using these events." + }, + "description": "Events defines all the events emitted by processing a transaction. Note,\nthese events include those emitted by processing all the messages and those\nemitted from the ante. Whereas Logs contains the events, with\nadditional metadata, emitted only by processing the messages.\n\nSince: cosmos-sdk 0.42.11, 0.44.5, 0.45" } }, - "description": "Commit contains the evidence that a block was committed by a set of validators." + "description": "TxResponse defines a structure containing relevant tx data and metadata. The\ntags are stringified and the log is JSON decoded." + }, + "description": "tx_responses is the list of queried TxResponses." + }, + "pagination": { + "description": "pagination defines a pagination for the response.\nDeprecated: post v0.46.x use total instead.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } } + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available" } }, - "tendermint.types.BlockIDFlag": { - "title": "BlockIdFlag indicates which BlockID the signature is for", - "type": "string", - "default": "BLOCK_ID_FLAG_UNKNOWN", - "enum": [ - "BLOCK_ID_FLAG_UNKNOWN", - "BLOCK_ID_FLAG_ABSENT", - "BLOCK_ID_FLAG_COMMIT", - "BLOCK_ID_FLAG_NIL" - ] - }, - "tendermint.types.Commit": { - "type": "object", - "properties": { - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "signatures": { - "type": "array", - "items": { - "type": "object", - "properties": { - "block_id_flag": { - "title": "BlockIdFlag indicates which BlockID the signature is for", - "type": "string", - "default": "BLOCK_ID_FLAG_UNKNOWN", - "enum": [ - "BLOCK_ID_FLAG_UNKNOWN", - "BLOCK_ID_FLAG_ABSENT", - "BLOCK_ID_FLAG_COMMIT", - "BLOCK_ID_FLAG_NIL" - ] - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "CommitSig is a part of the Vote included in a Commit." + "description": "GetTxsEventResponse is the response type for the Service.TxsByEvents\nRPC method." + }, + "cosmos.tx.v1beta1.ModeInfo": { + "type": "object", + "properties": { + "single": { + "title": "single represents a single signer", + "type": "object", + "properties": { + "mode": { + "title": "mode is the signing mode of the single signer", + "type": "string", + "enum": [ + "SIGN_MODE_UNSPECIFIED", + "SIGN_MODE_DIRECT", + "SIGN_MODE_TEXTUAL", + "SIGN_MODE_DIRECT_AUX", + "SIGN_MODE_LEGACY_AMINO_JSON", + "SIGN_MODE_EIP_191" + ], + "default": "SIGN_MODE_UNSPECIFIED", + "description": "SignMode represents a signing mode with its own security guarantees.\n\nThis enum should be considered a registry of all known sign modes\nin the Cosmos ecosystem. Apps are not expected to support all known\nsign modes. Apps that would like to support custom sign modes are\nencouraged to open a small PR against this file to add a new case\nto this SignMode enum describing their sign mode so that different\napps have a consistent version of this enum.\n\n - SIGN_MODE_UNSPECIFIED: SIGN_MODE_UNSPECIFIED specifies an unknown signing mode and will be\nrejected.\n - SIGN_MODE_DIRECT: SIGN_MODE_DIRECT specifies a signing mode which uses SignDoc and is\nverified with raw bytes from Tx.\n - SIGN_MODE_TEXTUAL: SIGN_MODE_TEXTUAL is a future signing mode that will verify some\nhuman-readable textual representation on top of the binary representation\nfrom SIGN_MODE_DIRECT.\n\nSince: cosmos-sdk 0.50\n - SIGN_MODE_DIRECT_AUX: SIGN_MODE_DIRECT_AUX specifies a signing mode which uses\nSignDocDirectAux. As opposed to SIGN_MODE_DIRECT, this sign mode does not\nrequire signers signing over other signers' `signer_info`.\n\nSince: cosmos-sdk 0.46\n - SIGN_MODE_LEGACY_AMINO_JSON: SIGN_MODE_LEGACY_AMINO_JSON is a backwards compatibility mode which uses\nAmino JSON and will be removed in the future.\n - SIGN_MODE_EIP_191: SIGN_MODE_EIP_191 specifies the sign mode for EIP 191 signing on the Cosmos\nSDK. Ref: https://eips.ethereum.org/EIPS/eip-191\n\nCurrently, SIGN_MODE_EIP_191 is registered as a SignMode enum variant,\nbut is not implemented on the SDK by default. To enable EIP-191, you need\nto pass a custom `TxConfig` that has an implementation of\n`SignModeHandler` for EIP-191. The SDK may decide to fully support\nEIP-191 in the future.\n\nSince: cosmos-sdk 0.45.2\nDeprecated: post 0.47.x Sign mode refers to a method of encoding string data for\nsigning, but in the SDK, it also refers to how to encode a transaction into a string.\nThis opens the possibility for additional EIP191 sign modes, like SIGN_MODE_EIP_191_TEXTUAL,\nSIGN_MODE_EIP_191_LEGACY_JSON, and more.\nEach new EIP191 sign mode should be accompanied by an associated ADR." } } }, - "description": "Commit contains the evidence that a block was committed by a set of validators." + "multi": { + "$ref": "#/definitions/cosmos.tx.v1beta1.ModeInfo.Multi", + "title": "multi represents a nested multisig signer" + } }, - "tendermint.types.CommitSig": { - "type": "object", - "properties": { - "block_id_flag": { - "title": "BlockIdFlag indicates which BlockID the signature is for", - "type": "string", - "default": "BLOCK_ID_FLAG_UNKNOWN", - "enum": [ - "BLOCK_ID_FLAG_UNKNOWN", - "BLOCK_ID_FLAG_ABSENT", - "BLOCK_ID_FLAG_COMMIT", - "BLOCK_ID_FLAG_NIL" - ] - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "timestamp": { - "type": "string", - "format": "date-time" + "description": "ModeInfo describes the signing mode of a single or nested multisig signer." + }, + "cosmos.tx.v1beta1.ModeInfo.Multi": { + "type": "object", + "properties": { + "bitarray": { + "title": "bitarray specifies which keys within the multisig are signing", + "type": "object", + "properties": { + "extra_bits_stored": { + "type": "integer", + "format": "int64" + }, + "elems": { + "type": "string", + "format": "byte" + } }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } + "description": "CompactBitArray is an implementation of a space efficient bit array.\nThis is used to ensure that the encoded data takes up a minimal amount of\nspace after proto encoding.\nThis is not thread safe, and is not intended for concurrent usage." }, - "description": "CommitSig is a part of the Vote included in a Commit." + "mode_infos": { + "type": "array", + "items": { + "$ref": "#/definitions/cosmos.tx.v1beta1.ModeInfo" + }, + "title": "mode_infos is the corresponding modes of the signers of the multisig\nwhich could include nested multisig public keys" + } }, - "tendermint.types.Data": { - "title": "Data contains the set of transactions included in the block", - "type": "object", - "properties": { - "txs": { - "type": "array", - "description": "Txs that will be applied by state @ block.Height+1.\nNOTE: not all txs here are valid. We're just agreeing on the order first.\nThis means that block.AppHash does not include these txs.", - "items": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "title": "Multi is the mode info for a multisig public key" + }, + "cosmos.tx.v1beta1.ModeInfo.Single": { + "type": "object", + "properties": { + "mode": { + "title": "mode is the signing mode of the single signer", + "type": "string", + "enum": [ + "SIGN_MODE_UNSPECIFIED", + "SIGN_MODE_DIRECT", + "SIGN_MODE_TEXTUAL", + "SIGN_MODE_DIRECT_AUX", + "SIGN_MODE_LEGACY_AMINO_JSON", + "SIGN_MODE_EIP_191" + ], + "default": "SIGN_MODE_UNSPECIFIED", + "description": "SignMode represents a signing mode with its own security guarantees.\n\nThis enum should be considered a registry of all known sign modes\nin the Cosmos ecosystem. Apps are not expected to support all known\nsign modes. Apps that would like to support custom sign modes are\nencouraged to open a small PR against this file to add a new case\nto this SignMode enum describing their sign mode so that different\napps have a consistent version of this enum.\n\n - SIGN_MODE_UNSPECIFIED: SIGN_MODE_UNSPECIFIED specifies an unknown signing mode and will be\nrejected.\n - SIGN_MODE_DIRECT: SIGN_MODE_DIRECT specifies a signing mode which uses SignDoc and is\nverified with raw bytes from Tx.\n - SIGN_MODE_TEXTUAL: SIGN_MODE_TEXTUAL is a future signing mode that will verify some\nhuman-readable textual representation on top of the binary representation\nfrom SIGN_MODE_DIRECT.\n\nSince: cosmos-sdk 0.50\n - SIGN_MODE_DIRECT_AUX: SIGN_MODE_DIRECT_AUX specifies a signing mode which uses\nSignDocDirectAux. As opposed to SIGN_MODE_DIRECT, this sign mode does not\nrequire signers signing over other signers' `signer_info`.\n\nSince: cosmos-sdk 0.46\n - SIGN_MODE_LEGACY_AMINO_JSON: SIGN_MODE_LEGACY_AMINO_JSON is a backwards compatibility mode which uses\nAmino JSON and will be removed in the future.\n - SIGN_MODE_EIP_191: SIGN_MODE_EIP_191 specifies the sign mode for EIP 191 signing on the Cosmos\nSDK. Ref: https://eips.ethereum.org/EIPS/eip-191\n\nCurrently, SIGN_MODE_EIP_191 is registered as a SignMode enum variant,\nbut is not implemented on the SDK by default. To enable EIP-191, you need\nto pass a custom `TxConfig` that has an implementation of\n`SignModeHandler` for EIP-191. The SDK may decide to fully support\nEIP-191 in the future.\n\nSince: cosmos-sdk 0.45.2\nDeprecated: post 0.47.x Sign mode refers to a method of encoding string data for\nsigning, but in the SDK, it also refers to how to encode a transaction into a string.\nThis opens the possibility for additional EIP191 sign modes, like SIGN_MODE_EIP_191_TEXTUAL,\nSIGN_MODE_EIP_191_LEGACY_JSON, and more.\nEach new EIP191 sign mode should be accompanied by an associated ADR." + } + }, + "title": "Single is the mode info for a single signer. It is structured as a message\nto allow for additional fields such as locale for SIGN_MODE_TEXTUAL in the\nfuture" + }, + "cosmos.tx.v1beta1.OrderBy": { + "type": "string", + "enum": [ + "ORDER_BY_UNSPECIFIED", + "ORDER_BY_ASC", + "ORDER_BY_DESC" + ], + "default": "ORDER_BY_UNSPECIFIED", + "description": "- ORDER_BY_UNSPECIFIED: ORDER_BY_UNSPECIFIED specifies an unknown sorting order. OrderBy defaults\nto ASC in this case.\n - ORDER_BY_ASC: ORDER_BY_ASC defines ascending order\n - ORDER_BY_DESC: ORDER_BY_DESC defines descending order", + "title": "OrderBy defines the sorting order" + }, + "cosmos.tx.v1beta1.SignerInfo": { + "type": "object", + "properties": { + "public_key": { + "type": "object", + "properties": { + "type_url": { "type": "string", - "format": "byte" + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "mode_info": { + "$ref": "#/definitions/cosmos.tx.v1beta1.ModeInfo", + "title": "mode_info describes the signing mode of the signer and is a nested\nstructure to support nested multisig pubkey's" + }, + "sequence": { + "type": "string", + "format": "uint64", + "description": "sequence is the sequence of the account, which describes the\nnumber of committed transactions signed by a given address. It is used to\nprevent replay attacks." } }, - "tendermint.types.DuplicateVoteEvidence": { - "type": "object", - "properties": { - "vote_a": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals", - "default": "SIGNED_MSG_TYPE_UNKNOWN", - "enum": [ - "SIGNED_MSG_TYPE_UNKNOWN", - "SIGNED_MSG_TYPE_PREVOTE", - "SIGNED_MSG_TYPE_PRECOMMIT", - "SIGNED_MSG_TYPE_PROPOSAL" - ] - }, - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", + "description": "SignerInfo describes the public key and signing mode of a single top-level\nsigner." + }, + "cosmos.tx.v1beta1.SimulateRequest": { + "type": "object", + "properties": { + "tx": { + "$ref": "#/definitions/cosmos.tx.v1beta1.Tx", + "description": "tx is the transaction to simulate.\nDeprecated. Send raw tx bytes instead." + }, + "tx_bytes": { + "type": "string", + "format": "byte", + "description": "tx_bytes is the raw transaction.\n\nSince: cosmos-sdk 0.43" + } + }, + "description": "SimulateRequest is the request type for the Service.Simulate\nRPC method." + }, + "cosmos.tx.v1beta1.SimulateResponse": { + "type": "object", + "properties": { + "gas_info": { + "description": "gas_info is the information about gas used in the simulation.", + "type": "object", + "properties": { + "gas_wanted": { + "type": "string", + "format": "uint64", + "description": "GasWanted is the maximum units of work we allow this tx to perform." + }, + "gas_used": { + "type": "string", + "format": "uint64", + "description": "GasUsed is the amount of gas actually consumed." + } + } + }, + "result": { + "description": "result is the result of the simulation.", + "type": "object", + "properties": { + "data": { + "type": "string", + "format": "byte", + "description": "Data is any data returned from message or handler execution. It MUST be\nlength prefixed in order to separate data from multiple message executions.\nDeprecated. This field is still populated, but prefer msg_response instead\nbecause it also contains the Msg response typeURL." + }, + "log": { + "type": "string", + "description": "Log contains the log information from message or handler execution." + }, + "events": { + "type": "array", + "items": { "type": "object", "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" + "type": { + "type": "string" }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" + "attributes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "type": "string" + }, + "index": { + "type": "boolean" + } }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } + "description": "EventAttribute is a single key-value pair, associated with an event." } } - } - }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validator_index": { - "type": "integer", - "format": "int32" + }, + "description": "Event allows application developers to attach additional information to\nResponseFinalizeBlock and ResponseCheckTx.\nLater, transactions may be queried using these events." }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block.", - "format": "byte" + "description": "Events contains a slice of Event objects that were emitted during message\nor handler execution." + }, + "msg_responses": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" }, - "extension": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages.", - "format": "byte" + "description": "msg_responses contains the Msg handler responses type packed in Anys.\n\nSince: cosmos-sdk 0.46" + } + } + } + }, + "description": "SimulateResponse is the response type for the\nService.SimulateRPC method." + }, + "cosmos.tx.v1beta1.Tip": { + "type": "object", + "properties": { + "amount": { + "type": "array", + "items": { + "type": "object", + "properties": { + "denom": { + "type": "string" }, - "extension_signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages.", - "format": "byte" + "amount": { + "type": "string" } }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." }, - "vote_b": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals", - "default": "SIGNED_MSG_TYPE_UNKNOWN", - "enum": [ - "SIGNED_MSG_TYPE_UNKNOWN", - "SIGNED_MSG_TYPE_PREVOTE", - "SIGNED_MSG_TYPE_PRECOMMIT", - "SIGNED_MSG_TYPE_PROPOSAL" - ] - }, - "height": { - "type": "string", - "format": "int64" + "title": "amount is the amount of the tip" + }, + "tipper": { + "type": "string", + "title": "tipper is the address of the account paying for the tip" + } + }, + "description": "Tip is the tip used for meta-transactions.\n\nSince: cosmos-sdk 0.46" + }, + "cosmos.tx.v1beta1.Tx": { + "type": "object", + "properties": { + "body": { + "title": "body is the processable content of the transaction", + "type": "object", + "properties": { + "messages": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" }, - "round": { - "type": "integer", - "format": "int32" + "description": "messages is a list of messages to be executed. The required signers of\nthose messages define the number and order of elements in AuthInfo's\nsigner_infos and Tx's signatures. Each required signer address is added to\nthe list only the first time it occurs.\nBy convention, the first required signer (usually from the first message)\nis referred to as the primary signer and pays the fee for the whole\ntransaction." + }, + "memo": { + "type": "string", + "description": "memo is any arbitrary note/comment to be added to the transaction.\nWARNING: in clients, any publicly exposed text should not be called memo,\nbut should be called `note` instead (see https://github.com/cosmos/cosmos-sdk/issues/9122)." + }, + "timeout_height": { + "type": "string", + "format": "uint64", + "title": "timeout is the block height after which this transaction will not\nbe processed by the chain" + }, + "extension_options": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" }, - "block_id": { - "title": "BlockID", + "title": "extension_options are arbitrary options that can be added by chains\nwhen the default options are not sufficient. If any of these are present\nand can't be handled, the transaction will be rejected" + }, + "non_critical_extension_options": { + "type": "array", + "items": { "type": "object", "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "type_url": { "type": "string", - "format": "byte" + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" }, - "timestamp": { + "title": "extension_options are arbitrary options that can be added by chains\nwhen the default options are not sufficient. If any of these are present\nand can't be handled, they will be ignored" + } + }, + "description": "TxBody is the body of a transaction that all signers sign over." + }, + "auth_info": { + "$ref": "#/definitions/cosmos.tx.v1beta1.AuthInfo", + "title": "auth_info is the authorization related content of the transaction,\nspecifically signers, signer modes and fee" + }, + "signatures": { + "type": "array", + "items": { + "type": "string", + "format": "byte" + }, + "description": "signatures is a list of signatures that matches the length and order of\nAuthInfo's signer_infos to allow connecting signature meta information like\npublic key and signing mode by position." + } + }, + "description": "Tx is the standard type used for broadcasting transactions." + }, + "cosmos.tx.v1beta1.TxBody": { + "type": "object", + "properties": { + "messages": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { "type": "string", - "format": "date-time" + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "value": { "type": "string", - "format": "byte" - }, - "validator_index": { - "type": "integer", - "format": "int32" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "description": "messages is a list of messages to be executed. The required signers of\nthose messages define the number and order of elements in AuthInfo's\nsigner_infos and Tx's signatures. Each required signer address is added to\nthe list only the first time it occurs.\nBy convention, the first required signer (usually from the first message)\nis referred to as the primary signer and pays the fee for the whole\ntransaction." + }, + "memo": { + "type": "string", + "description": "memo is any arbitrary note/comment to be added to the transaction.\nWARNING: in clients, any publicly exposed text should not be called memo,\nbut should be called `note` instead (see https://github.com/cosmos/cosmos-sdk/issues/9122)." + }, + "timeout_height": { + "type": "string", + "format": "uint64", + "title": "timeout is the block height after which this transaction will not\nbe processed by the chain" + }, + "extension_options": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { "type": "string", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block.", - "format": "byte" + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." }, - "extension": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "value": { "type": "string", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages.", - "format": "byte" + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "title": "extension_options are arbitrary options that can be added by chains\nwhen the default options are not sufficient. If any of these are present\nand can't be handled, the transaction will be rejected" + }, + "non_critical_extension_options": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." }, - "extension_signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "value": { "type": "string", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages.", - "format": "byte" + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." - }, - "total_voting_power": { - "type": "string", - "format": "int64" - }, - "validator_power": { - "type": "string", - "format": "int64" + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" }, - "timestamp": { - "type": "string", - "format": "date-time" - } - }, - "description": "DuplicateVoteEvidence contains evidence of a validator signed two conflicting votes." + "title": "extension_options are arbitrary options that can be added by chains\nwhen the default options are not sufficient. If any of these are present\nand can't be handled, they will be ignored" + } + }, + "description": "TxBody is the body of a transaction that all signers sign over." + }, + "cosmos.tx.v1beta1.TxDecodeAminoRequest": { + "type": "object", + "properties": { + "amino_binary": { + "type": "string", + "format": "byte" + } + }, + "description": "TxDecodeAminoRequest is the request type for the Service.TxDecodeAmino\nRPC method.\n\nSince: cosmos-sdk 0.47" + }, + "cosmos.tx.v1beta1.TxDecodeAminoResponse": { + "type": "object", + "properties": { + "amino_json": { + "type": "string" + } + }, + "description": "TxDecodeAminoResponse is the response type for the Service.TxDecodeAmino\nRPC method.\n\nSince: cosmos-sdk 0.47" + }, + "cosmos.tx.v1beta1.TxDecodeRequest": { + "type": "object", + "properties": { + "tx_bytes": { + "type": "string", + "format": "byte", + "description": "tx_bytes is the raw transaction." + } + }, + "description": "TxDecodeRequest is the request type for the Service.TxDecode\nRPC method.\n\nSince: cosmos-sdk 0.47" + }, + "cosmos.tx.v1beta1.TxDecodeResponse": { + "type": "object", + "properties": { + "tx": { + "$ref": "#/definitions/cosmos.tx.v1beta1.Tx", + "description": "tx is the decoded transaction." + } }, - "tendermint.types.Evidence": { - "type": "object", - "properties": { - "duplicate_vote_evidence": { + "description": "TxDecodeResponse is the response type for the\nService.TxDecode method.\n\nSince: cosmos-sdk 0.47" + }, + "cosmos.tx.v1beta1.TxEncodeAminoRequest": { + "type": "object", + "properties": { + "amino_json": { + "type": "string" + } + }, + "description": "TxEncodeAminoRequest is the request type for the Service.TxEncodeAmino\nRPC method.\n\nSince: cosmos-sdk 0.47" + }, + "cosmos.tx.v1beta1.TxEncodeAminoResponse": { + "type": "object", + "properties": { + "amino_binary": { + "type": "string", + "format": "byte" + } + }, + "description": "TxEncodeAminoResponse is the response type for the Service.TxEncodeAmino\nRPC method.\n\nSince: cosmos-sdk 0.47" + }, + "cosmos.tx.v1beta1.TxEncodeRequest": { + "type": "object", + "properties": { + "tx": { + "$ref": "#/definitions/cosmos.tx.v1beta1.Tx", + "description": "tx is the transaction to encode." + } + }, + "description": "TxEncodeRequest is the request type for the Service.TxEncode\nRPC method.\n\nSince: cosmos-sdk 0.47" + }, + "cosmos.tx.v1beta1.TxEncodeResponse": { + "type": "object", + "properties": { + "tx_bytes": { + "type": "string", + "format": "byte", + "description": "tx_bytes is the encoded transaction bytes." + } + }, + "description": "TxEncodeResponse is the response type for the\nService.TxEncode method.\n\nSince: cosmos-sdk 0.47" + }, + "tendermint.abci.Event": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "attributes": { + "type": "array", + "items": { "type": "object", "properties": { - "vote_a": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals", - "default": "SIGNED_MSG_TYPE_UNKNOWN", - "enum": [ - "SIGNED_MSG_TYPE_UNKNOWN", - "SIGNED_MSG_TYPE_PREVOTE", - "SIGNED_MSG_TYPE_PRECOMMIT", - "SIGNED_MSG_TYPE_PROPOSAL" - ] - }, - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validator_index": { - "type": "integer", - "format": "int32" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block.", - "format": "byte" - }, - "extension": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages.", - "format": "byte" - }, - "extension_signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages.", - "format": "byte" - } + "key": { + "type": "string" + }, + "value": { + "type": "string" + }, + "index": { + "type": "boolean" + } + }, + "description": "EventAttribute is a single key-value pair, associated with an event." + } + } + }, + "description": "Event allows application developers to attach additional information to\nResponseFinalizeBlock and ResponseCheckTx.\nLater, transactions may be queried using these events." + }, + "tendermint.abci.EventAttribute": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "type": "string" + }, + "index": { + "type": "boolean" + } + }, + "description": "EventAttribute is a single key-value pair, associated with an event." + }, + "tendermint.crypto.PublicKey": { + "type": "object", + "properties": { + "ed25519": { + "type": "string", + "format": "byte" + }, + "secp256k1": { + "type": "string", + "format": "byte" + } + }, + "title": "PublicKey defines the keys available for use with Validators" + }, + "tendermint.types.Block": { + "type": "object", + "properties": { + "header": { + "type": "object", + "properties": { + "version": { + "title": "basic block info", + "type": "object", + "properties": { + "block": { + "type": "string", + "format": "uint64" }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + "app": { + "type": "string", + "format": "uint64" + } }, - "vote_b": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals", - "default": "SIGNED_MSG_TYPE_UNKNOWN", - "enum": [ - "SIGNED_MSG_TYPE_UNKNOWN", - "SIGNED_MSG_TYPE_PREVOTE", - "SIGNED_MSG_TYPE_PRECOMMIT", - "SIGNED_MSG_TYPE_PROPOSAL" - ] - }, - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validator_index": { - "type": "integer", - "format": "int32" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block.", - "format": "byte" - }, - "extension": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages.", - "format": "byte" - }, - "extension_signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages.", - "format": "byte" - } + "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." + }, + "chain_id": { + "type": "string" + }, + "height": { + "type": "string", + "format": "int64" + }, + "time": { + "type": "string", + "format": "date-time" + }, + "last_block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." - }, - "total_voting_power": { - "type": "string", - "format": "int64" + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } }, - "validator_power": { + "title": "BlockID" + }, + "last_commit_hash": { + "type": "string", + "format": "byte", + "title": "hashes of block data" + }, + "data_hash": { + "type": "string", + "format": "byte" + }, + "validators_hash": { + "type": "string", + "format": "byte", + "title": "hashes from the app output from the prev block" + }, + "next_validators_hash": { + "type": "string", + "format": "byte" + }, + "consensus_hash": { + "type": "string", + "format": "byte" + }, + "app_hash": { + "type": "string", + "format": "byte" + }, + "last_results_hash": { + "type": "string", + "format": "byte" + }, + "evidence_hash": { + "type": "string", + "format": "byte", + "title": "consensus info" + }, + "proposer_address": { + "type": "string", + "format": "byte" + } + }, + "description": "Header defines the structure of a block header." + }, + "data": { + "type": "object", + "properties": { + "txs": { + "type": "array", + "items": { "type": "string", - "format": "int64" + "format": "byte" }, - "timestamp": { - "type": "string", - "format": "date-time" - } - }, - "description": "DuplicateVoteEvidence contains evidence of a validator signed two conflicting votes." + "description": "Txs that will be applied by state @ block.Height+1.\nNOTE: not all txs here are valid. We're just agreeing on the order first.\nThis means that block.AppHash does not include these txs." + } }, - "light_client_attack_evidence": { - "type": "object", - "properties": { - "conflicting_block": { + "title": "Data contains the set of transactions included in the block" + }, + "evidence": { + "type": "object", + "properties": { + "evidence": { + "type": "array", + "items": { "type": "object", "properties": { - "signed_header": { + "duplicate_vote_evidence": { "type": "object", "properties": { - "header": { + "vote_a": { "type": "object", "properties": { - "version": { - "title": "basic block info", - "type": "object", - "properties": { - "block": { - "type": "string", - "format": "uint64" - }, - "app": { - "type": "string", - "format": "uint64" - } - }, - "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." - }, - "chain_id": { - "type": "string" + "type": { + "type": "string", + "enum": [ + "SIGNED_MSG_TYPE_UNKNOWN", + "SIGNED_MSG_TYPE_PREVOTE", + "SIGNED_MSG_TYPE_PRECOMMIT", + "SIGNED_MSG_TYPE_PROPOSAL" + ], + "default": "SIGNED_MSG_TYPE_UNKNOWN", + "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals" }, "height": { "type": "string", "format": "int64" }, - "time": { - "type": "string", - "format": "date-time" + "round": { + "type": "integer", + "format": "int32" }, - "last_block_id": { - "title": "BlockID", + "block_id": { "type": "object", "properties": { "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "format": "byte" }, "part_set_header": { - "title": "PartsetHeader", "type": "object", "properties": { "total": { @@ -39808,169 +35174,414 @@ "format": "int64" }, "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "format": "byte" } - } + }, + "title": "PartsetHeader" } - } + }, + "title": "BlockID" }, - "last_commit_hash": { - "title": "hashes of block data", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "timestamp": { "type": "string", - "format": "byte" + "format": "date-time" }, - "data_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "validator_address": { "type": "string", "format": "byte" }, - "validators_hash": { - "title": "hashes from the app output from the prev block", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "validator_index": { + "type": "integer", + "format": "int32" + }, + "signature": { "type": "string", - "format": "byte" + "format": "byte", + "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." }, - "next_validators_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "extension": { "type": "string", - "format": "byte" + "format": "byte", + "description": "Vote extension provided by the application. Only valid for precommit\nmessages." }, - "consensus_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "extension_signature": { "type": "string", - "format": "byte" + "format": "byte", + "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + } + }, + "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + }, + "vote_b": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "SIGNED_MSG_TYPE_UNKNOWN", + "SIGNED_MSG_TYPE_PREVOTE", + "SIGNED_MSG_TYPE_PRECOMMIT", + "SIGNED_MSG_TYPE_PROPOSAL" + ], + "default": "SIGNED_MSG_TYPE_UNKNOWN", + "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals" }, - "app_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "height": { "type": "string", - "format": "byte" + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" }, - "last_results_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "timestamp": { "type": "string", - "format": "byte" + "format": "date-time" }, - "evidence_hash": { - "title": "consensus info", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "validator_address": { "type": "string", "format": "byte" }, - "proposer_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "validator_index": { + "type": "integer", + "format": "int32" + }, + "signature": { "type": "string", - "format": "byte" + "format": "byte", + "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." + }, + "extension": { + "type": "string", + "format": "byte", + "description": "Vote extension provided by the application. Only valid for precommit\nmessages." + }, + "extension_signature": { + "type": "string", + "format": "byte", + "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." } }, - "description": "Header defines the structure of a block header." + "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." }, - "commit": { + "total_voting_power": { + "type": "string", + "format": "int64" + }, + "validator_power": { + "type": "string", + "format": "int64" + }, + "timestamp": { + "type": "string", + "format": "date-time" + } + }, + "description": "DuplicateVoteEvidence contains evidence of a validator signed two conflicting votes." + }, + "light_client_attack_evidence": { + "type": "object", + "properties": { + "conflicting_block": { "type": "object", "properties": { - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" + "signed_header": { + "type": "object", + "properties": { + "header": { + "type": "object", + "properties": { + "version": { + "title": "basic block info", + "type": "object", + "properties": { + "block": { + "type": "string", + "format": "uint64" + }, + "app": { + "type": "string", + "format": "uint64" + } + }, + "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." + }, + "chain_id": { + "type": "string" + }, + "height": { + "type": "string", + "format": "int64" + }, + "time": { + "type": "string", + "format": "date-time" + }, + "last_block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "last_commit_hash": { + "type": "string", + "format": "byte", + "title": "hashes of block data" + }, + "data_hash": { + "type": "string", + "format": "byte" + }, + "validators_hash": { + "type": "string", + "format": "byte", + "title": "hashes from the app output from the prev block" + }, + "next_validators_hash": { + "type": "string", + "format": "byte" + }, + "consensus_hash": { + "type": "string", + "format": "byte" + }, + "app_hash": { + "type": "string", + "format": "byte" + }, + "last_results_hash": { + "type": "string", + "format": "byte" + }, + "evidence_hash": { + "type": "string", + "format": "byte", + "title": "consensus info" + }, + "proposer_address": { + "type": "string", + "format": "byte" + } + }, + "description": "Header defines the structure of a block header." + }, + "commit": { + "type": "object", + "properties": { + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "signatures": { + "type": "array", + "items": { + "type": "object", + "properties": { + "block_id_flag": { + "type": "string", + "enum": [ + "BLOCK_ID_FLAG_UNKNOWN", + "BLOCK_ID_FLAG_ABSENT", + "BLOCK_ID_FLAG_COMMIT", + "BLOCK_ID_FLAG_NIL" + ], + "default": "BLOCK_ID_FLAG_UNKNOWN", + "title": "BlockIdFlag indicates which BlockID the signature is for" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "signature": { + "type": "string", + "format": "byte" + } + }, + "description": "CommitSig is a part of the Vote included in a Commit." + } + } + }, + "description": "Commit contains the evidence that a block was committed by a set of validators." + } + } }, - "block_id": { - "title": "BlockID", + "validator_set": { "type": "object", "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" + "validators": { + "type": "array", + "items": { + "type": "object", + "properties": { + "address": { + "type": "string", + "format": "byte" + }, + "pub_key": { + "type": "object", + "properties": { + "ed25519": { + "type": "string", + "format": "byte" + }, + "secp256k1": { + "type": "string", + "format": "byte" + } + }, + "title": "PublicKey defines the keys available for use with Validators" + }, + "voting_power": { + "type": "string", + "format": "int64" + }, + "proposer_priority": { + "type": "string", + "format": "int64" + } + } + } }, - "part_set_header": { - "title": "PartsetHeader", + "proposer": { "type": "object", "properties": { - "total": { - "type": "integer", + "address": { + "type": "string", + "format": "byte" + }, + "pub_key": { + "type": "object", + "properties": { + "ed25519": { + "type": "string", + "format": "byte" + }, + "secp256k1": { + "type": "string", + "format": "byte" + } + }, + "title": "PublicKey defines the keys available for use with Validators" + }, + "voting_power": { + "type": "string", "format": "int64" }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "proposer_priority": { "type": "string", - "format": "byte" + "format": "int64" } } - } - } - }, - "signatures": { - "type": "array", - "items": { - "type": "object", - "properties": { - "block_id_flag": { - "title": "BlockIdFlag indicates which BlockID the signature is for", - "type": "string", - "default": "BLOCK_ID_FLAG_UNKNOWN", - "enum": [ - "BLOCK_ID_FLAG_UNKNOWN", - "BLOCK_ID_FLAG_ABSENT", - "BLOCK_ID_FLAG_COMMIT", - "BLOCK_ID_FLAG_NIL" - ] - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } }, - "description": "CommitSig is a part of the Vote included in a Commit." + "total_voting_power": { + "type": "string", + "format": "int64" + } } } - }, - "description": "Commit contains the evidence that a block was committed by a set of validators." - } - } - }, - "validator_set": { - "type": "object", - "properties": { - "validators": { + } + }, + "common_height": { + "type": "string", + "format": "int64" + }, + "byzantine_validators": { "type": "array", "items": { "type": "object", "properties": { "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "format": "byte" }, "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", "type": "object", "properties": { "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "format": "byte" }, "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "format": "byte" } - } + }, + "title": "PublicKey defines the keys available for use with Validators" }, "voting_power": { "type": "string", @@ -39983,146 +35594,607 @@ } } }, - "proposer": { - "type": "object", - "properties": { - "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", - "type": "object", - "properties": { - "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - }, - "voting_power": { - "type": "string", - "format": "int64" - }, - "proposer_priority": { - "type": "string", - "format": "int64" - } - } - }, "total_voting_power": { "type": "string", "format": "int64" + }, + "timestamp": { + "type": "string", + "format": "date-time" } + }, + "description": "LightClientAttackEvidence contains evidence of a set of validators attempting to mislead a light client." + } + } + } + } + } + }, + "last_commit": { + "type": "object", + "properties": { + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "signatures": { + "type": "array", + "items": { + "type": "object", + "properties": { + "block_id_flag": { + "type": "string", + "enum": [ + "BLOCK_ID_FLAG_UNKNOWN", + "BLOCK_ID_FLAG_ABSENT", + "BLOCK_ID_FLAG_COMMIT", + "BLOCK_ID_FLAG_NIL" + ], + "default": "BLOCK_ID_FLAG_UNKNOWN", + "title": "BlockIdFlag indicates which BlockID the signature is for" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "signature": { + "type": "string", + "format": "byte" + } + }, + "description": "CommitSig is a part of the Vote included in a Commit." + } + } + }, + "description": "Commit contains the evidence that a block was committed by a set of validators." + } + } + }, + "tendermint.types.BlockIDFlag": { + "type": "string", + "enum": [ + "BLOCK_ID_FLAG_UNKNOWN", + "BLOCK_ID_FLAG_ABSENT", + "BLOCK_ID_FLAG_COMMIT", + "BLOCK_ID_FLAG_NIL" + ], + "default": "BLOCK_ID_FLAG_UNKNOWN", + "title": "BlockIdFlag indicates which BlockID the signature is for" + }, + "tendermint.types.Commit": { + "type": "object", + "properties": { + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "signatures": { + "type": "array", + "items": { + "type": "object", + "properties": { + "block_id_flag": { + "type": "string", + "enum": [ + "BLOCK_ID_FLAG_UNKNOWN", + "BLOCK_ID_FLAG_ABSENT", + "BLOCK_ID_FLAG_COMMIT", + "BLOCK_ID_FLAG_NIL" + ], + "default": "BLOCK_ID_FLAG_UNKNOWN", + "title": "BlockIdFlag indicates which BlockID the signature is for" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "signature": { + "type": "string", + "format": "byte" + } + }, + "description": "CommitSig is a part of the Vote included in a Commit." + } + } + }, + "description": "Commit contains the evidence that a block was committed by a set of validators." + }, + "tendermint.types.CommitSig": { + "type": "object", + "properties": { + "block_id_flag": { + "type": "string", + "enum": [ + "BLOCK_ID_FLAG_UNKNOWN", + "BLOCK_ID_FLAG_ABSENT", + "BLOCK_ID_FLAG_COMMIT", + "BLOCK_ID_FLAG_NIL" + ], + "default": "BLOCK_ID_FLAG_UNKNOWN", + "title": "BlockIdFlag indicates which BlockID the signature is for" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "signature": { + "type": "string", + "format": "byte" + } + }, + "description": "CommitSig is a part of the Vote included in a Commit." + }, + "tendermint.types.Data": { + "type": "object", + "properties": { + "txs": { + "type": "array", + "items": { + "type": "string", + "format": "byte" + }, + "description": "Txs that will be applied by state @ block.Height+1.\nNOTE: not all txs here are valid. We're just agreeing on the order first.\nThis means that block.AppHash does not include these txs." + } + }, + "title": "Data contains the set of transactions included in the block" + }, + "tendermint.types.DuplicateVoteEvidence": { + "type": "object", + "properties": { + "vote_a": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "SIGNED_MSG_TYPE_UNKNOWN", + "SIGNED_MSG_TYPE_PREVOTE", + "SIGNED_MSG_TYPE_PRECOMMIT", + "SIGNED_MSG_TYPE_PROPOSAL" + ], + "default": "SIGNED_MSG_TYPE_UNKNOWN", + "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals" + }, + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" } - } + }, + "title": "PartsetHeader" } }, - "common_height": { - "type": "string", - "format": "int64" + "title": "BlockID" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "validator_index": { + "type": "integer", + "format": "int32" + }, + "signature": { + "type": "string", + "format": "byte", + "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." + }, + "extension": { + "type": "string", + "format": "byte", + "description": "Vote extension provided by the application. Only valid for precommit\nmessages." + }, + "extension_signature": { + "type": "string", + "format": "byte", + "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + } + }, + "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + }, + "vote_b": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "SIGNED_MSG_TYPE_UNKNOWN", + "SIGNED_MSG_TYPE_PREVOTE", + "SIGNED_MSG_TYPE_PRECOMMIT", + "SIGNED_MSG_TYPE_PROPOSAL" + ], + "default": "SIGNED_MSG_TYPE_UNKNOWN", + "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals" + }, + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } }, - "byzantine_validators": { - "type": "array", - "items": { + "title": "BlockID" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "validator_index": { + "type": "integer", + "format": "int32" + }, + "signature": { + "type": "string", + "format": "byte", + "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." + }, + "extension": { + "type": "string", + "format": "byte", + "description": "Vote extension provided by the application. Only valid for precommit\nmessages." + }, + "extension_signature": { + "type": "string", + "format": "byte", + "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + } + }, + "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + }, + "total_voting_power": { + "type": "string", + "format": "int64" + }, + "validator_power": { + "type": "string", + "format": "int64" + }, + "timestamp": { + "type": "string", + "format": "date-time" + } + }, + "description": "DuplicateVoteEvidence contains evidence of a validator signed two conflicting votes." + }, + "tendermint.types.Evidence": { + "type": "object", + "properties": { + "duplicate_vote_evidence": { + "type": "object", + "properties": { + "vote_a": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "SIGNED_MSG_TYPE_UNKNOWN", + "SIGNED_MSG_TYPE_PREVOTE", + "SIGNED_MSG_TYPE_PRECOMMIT", + "SIGNED_MSG_TYPE_PROPOSAL" + ], + "default": "SIGNED_MSG_TYPE_UNKNOWN", + "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals" + }, + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { "type": "object", "properties": { - "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "hash": { "type": "string", "format": "byte" }, - "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", + "part_set_header": { "type": "object", "properties": { - "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" + "total": { + "type": "integer", + "format": "int64" }, - "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "hash": { "type": "string", "format": "byte" } - } - }, - "voting_power": { + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "validator_index": { + "type": "integer", + "format": "int32" + }, + "signature": { + "type": "string", + "format": "byte", + "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." + }, + "extension": { + "type": "string", + "format": "byte", + "description": "Vote extension provided by the application. Only valid for precommit\nmessages." + }, + "extension_signature": { + "type": "string", + "format": "byte", + "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + } + }, + "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + }, + "vote_b": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "SIGNED_MSG_TYPE_UNKNOWN", + "SIGNED_MSG_TYPE_PREVOTE", + "SIGNED_MSG_TYPE_PRECOMMIT", + "SIGNED_MSG_TYPE_PROPOSAL" + ], + "default": "SIGNED_MSG_TYPE_UNKNOWN", + "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals" + }, + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { "type": "string", - "format": "int64" + "format": "byte" }, - "proposer_priority": { - "type": "string", - "format": "int64" + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" } - } + }, + "title": "BlockID" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "validator_index": { + "type": "integer", + "format": "int32" + }, + "signature": { + "type": "string", + "format": "byte", + "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." + }, + "extension": { + "type": "string", + "format": "byte", + "description": "Vote extension provided by the application. Only valid for precommit\nmessages." + }, + "extension_signature": { + "type": "string", + "format": "byte", + "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." } }, - "total_voting_power": { - "type": "string", - "format": "int64" - }, - "timestamp": { - "type": "string", - "format": "date-time" - } + "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." }, - "description": "LightClientAttackEvidence contains evidence of a set of validators attempting to mislead a light client." - } - } - }, - "tendermint.types.EvidenceList": { - "type": "object", - "properties": { - "evidence": { - "type": "array", - "items": { + "total_voting_power": { + "type": "string", + "format": "int64" + }, + "validator_power": { + "type": "string", + "format": "int64" + }, + "timestamp": { + "type": "string", + "format": "date-time" + } + }, + "description": "DuplicateVoteEvidence contains evidence of a validator signed two conflicting votes." + }, + "light_client_attack_evidence": { + "type": "object", + "properties": { + "conflicting_block": { "type": "object", "properties": { - "duplicate_vote_evidence": { + "signed_header": { "type": "object", "properties": { - "vote_a": { + "header": { "type": "object", "properties": { - "type": { - "type": "string", - "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals", - "default": "SIGNED_MSG_TYPE_UNKNOWN", - "enum": [ - "SIGNED_MSG_TYPE_UNKNOWN", - "SIGNED_MSG_TYPE_PREVOTE", - "SIGNED_MSG_TYPE_PRECOMMIT", - "SIGNED_MSG_TYPE_PROPOSAL" - ] + "version": { + "title": "basic block info", + "type": "object", + "properties": { + "block": { + "type": "string", + "format": "uint64" + }, + "app": { + "type": "string", + "format": "uint64" + } + }, + "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." + }, + "chain_id": { + "type": "string" }, "height": { "type": "string", "format": "int64" }, - "round": { - "type": "integer", - "format": "int32" + "time": { + "type": "string", + "format": "date-time" }, - "block_id": { - "title": "BlockID", + "last_block_id": { "type": "object", "properties": { "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "format": "byte" }, "part_set_header": { - "title": "PartsetHeader", "type": "object", "properties": { "total": { @@ -40130,62 +36202,60 @@ "format": "int64" }, "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "format": "byte" } - } + }, + "title": "PartsetHeader" } - } + }, + "title": "BlockID" }, - "timestamp": { + "last_commit_hash": { "type": "string", - "format": "date-time" + "format": "byte", + "title": "hashes of block data" }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "data_hash": { "type": "string", "format": "byte" }, - "validator_index": { - "type": "integer", - "format": "int32" + "validators_hash": { + "type": "string", + "format": "byte", + "title": "hashes from the app output from the prev block" + }, + "next_validators_hash": { + "type": "string", + "format": "byte" + }, + "consensus_hash": { + "type": "string", + "format": "byte" }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "app_hash": { "type": "string", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block.", "format": "byte" }, - "extension": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "last_results_hash": { "type": "string", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages.", "format": "byte" }, - "extension_signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "evidence_hash": { + "type": "string", + "format": "byte", + "title": "consensus info" + }, + "proposer_address": { "type": "string", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages.", "format": "byte" } }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + "description": "Header defines the structure of a block header." }, - "vote_b": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals", - "default": "SIGNED_MSG_TYPE_UNKNOWN", - "enum": [ - "SIGNED_MSG_TYPE_UNKNOWN", - "SIGNED_MSG_TYPE_PREVOTE", - "SIGNED_MSG_TYPE_PRECOMMIT", - "SIGNED_MSG_TYPE_PROPOSAL" - ] - }, + "commit": { + "type": "object", + "properties": { "height": { "type": "string", "format": "int64" @@ -40195,16 +36265,13 @@ "format": "int32" }, "block_id": { - "title": "BlockID", "type": "object", "properties": { "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "format": "byte" }, "part_set_header": { - "title": "PartsetHeader", "type": "object", "properties": { "total": { @@ -40212,317 +36279,558 @@ "format": "int64" }, "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "format": "byte" } - } + }, + "title": "PartsetHeader" } - } - }, - "timestamp": { - "type": "string", - "format": "date-time" + }, + "title": "BlockID" }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "signatures": { + "type": "array", + "items": { + "type": "object", + "properties": { + "block_id_flag": { + "type": "string", + "enum": [ + "BLOCK_ID_FLAG_UNKNOWN", + "BLOCK_ID_FLAG_ABSENT", + "BLOCK_ID_FLAG_COMMIT", + "BLOCK_ID_FLAG_NIL" + ], + "default": "BLOCK_ID_FLAG_UNKNOWN", + "title": "BlockIdFlag indicates which BlockID the signature is for" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "signature": { + "type": "string", + "format": "byte" + } + }, + "description": "CommitSig is a part of the Vote included in a Commit." + } + } + }, + "description": "Commit contains the evidence that a block was committed by a set of validators." + } + } + }, + "validator_set": { + "type": "object", + "properties": { + "validators": { + "type": "array", + "items": { + "type": "object", + "properties": { + "address": { + "type": "string", + "format": "byte" + }, + "pub_key": { + "type": "object", + "properties": { + "ed25519": { + "type": "string", + "format": "byte" + }, + "secp256k1": { + "type": "string", + "format": "byte" + } + }, + "title": "PublicKey defines the keys available for use with Validators" + }, + "voting_power": { + "type": "string", + "format": "int64" + }, + "proposer_priority": { + "type": "string", + "format": "int64" + } + } + } + }, + "proposer": { + "type": "object", + "properties": { + "address": { "type": "string", "format": "byte" }, - "validator_index": { - "type": "integer", - "format": "int32" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block.", - "format": "byte" + "pub_key": { + "type": "object", + "properties": { + "ed25519": { + "type": "string", + "format": "byte" + }, + "secp256k1": { + "type": "string", + "format": "byte" + } + }, + "title": "PublicKey defines the keys available for use with Validators" }, - "extension": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "voting_power": { "type": "string", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages.", - "format": "byte" + "format": "int64" }, - "extension_signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "proposer_priority": { "type": "string", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages.", - "format": "byte" + "format": "int64" } + } + }, + "total_voting_power": { + "type": "string", + "format": "int64" + } + } + } + } + }, + "common_height": { + "type": "string", + "format": "int64" + }, + "byzantine_validators": { + "type": "array", + "items": { + "type": "object", + "properties": { + "address": { + "type": "string", + "format": "byte" + }, + "pub_key": { + "type": "object", + "properties": { + "ed25519": { + "type": "string", + "format": "byte" + }, + "secp256k1": { + "type": "string", + "format": "byte" + } + }, + "title": "PublicKey defines the keys available for use with Validators" + }, + "voting_power": { + "type": "string", + "format": "int64" + }, + "proposer_priority": { + "type": "string", + "format": "int64" + } + } + } + }, + "total_voting_power": { + "type": "string", + "format": "int64" + }, + "timestamp": { + "type": "string", + "format": "date-time" + } + }, + "description": "LightClientAttackEvidence contains evidence of a set of validators attempting to mislead a light client." + } + } + }, + "tendermint.types.EvidenceList": { + "type": "object", + "properties": { + "evidence": { + "type": "array", + "items": { + "type": "object", + "properties": { + "duplicate_vote_evidence": { + "type": "object", + "properties": { + "vote_a": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "SIGNED_MSG_TYPE_UNKNOWN", + "SIGNED_MSG_TYPE_PREVOTE", + "SIGNED_MSG_TYPE_PRECOMMIT", + "SIGNED_MSG_TYPE_PROPOSAL" + ], + "default": "SIGNED_MSG_TYPE_UNKNOWN", + "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals" + }, + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "validator_index": { + "type": "integer", + "format": "int32" + }, + "signature": { + "type": "string", + "format": "byte", + "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." + }, + "extension": { + "type": "string", + "format": "byte", + "description": "Vote extension provided by the application. Only valid for precommit\nmessages." + }, + "extension_signature": { + "type": "string", + "format": "byte", + "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + } + }, + "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + }, + "vote_b": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "SIGNED_MSG_TYPE_UNKNOWN", + "SIGNED_MSG_TYPE_PREVOTE", + "SIGNED_MSG_TYPE_PRECOMMIT", + "SIGNED_MSG_TYPE_PROPOSAL" + ], + "default": "SIGNED_MSG_TYPE_UNKNOWN", + "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals" + }, + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "validator_index": { + "type": "integer", + "format": "int32" + }, + "signature": { + "type": "string", + "format": "byte", + "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." + }, + "extension": { + "type": "string", + "format": "byte", + "description": "Vote extension provided by the application. Only valid for precommit\nmessages." }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." - }, - "total_voting_power": { - "type": "string", - "format": "int64" - }, - "validator_power": { - "type": "string", - "format": "int64" + "extension_signature": { + "type": "string", + "format": "byte", + "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + } }, - "timestamp": { - "type": "string", - "format": "date-time" - } + "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + }, + "total_voting_power": { + "type": "string", + "format": "int64" + }, + "validator_power": { + "type": "string", + "format": "int64" }, - "description": "DuplicateVoteEvidence contains evidence of a validator signed two conflicting votes." + "timestamp": { + "type": "string", + "format": "date-time" + } }, - "light_client_attack_evidence": { - "type": "object", - "properties": { - "conflicting_block": { - "type": "object", - "properties": { - "signed_header": { - "type": "object", - "properties": { - "header": { - "type": "object", - "properties": { - "version": { - "title": "basic block info", - "type": "object", - "properties": { - "block": { - "type": "string", - "format": "uint64" - }, - "app": { - "type": "string", - "format": "uint64" - } + "description": "DuplicateVoteEvidence contains evidence of a validator signed two conflicting votes." + }, + "light_client_attack_evidence": { + "type": "object", + "properties": { + "conflicting_block": { + "type": "object", + "properties": { + "signed_header": { + "type": "object", + "properties": { + "header": { + "type": "object", + "properties": { + "version": { + "title": "basic block info", + "type": "object", + "properties": { + "block": { + "type": "string", + "format": "uint64" }, - "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." - }, - "chain_id": { - "type": "string" - }, - "height": { - "type": "string", - "format": "int64" - }, - "time": { - "type": "string", - "format": "date-time" - }, - "last_block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } + "app": { + "type": "string", + "format": "uint64" } }, - "last_commit_hash": { - "title": "hashes of block data", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "data_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validators_hash": { - "title": "hashes from the app output from the prev block", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "next_validators_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "consensus_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "app_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "last_results_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "evidence_hash": { - "title": "consensus info", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proposer_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } + "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." }, - "description": "Header defines the structure of a block header." - }, - "commit": { - "type": "object", - "properties": { - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "signatures": { - "type": "array", - "items": { + "chain_id": { + "type": "string" + }, + "height": { + "type": "string", + "format": "int64" + }, + "time": { + "type": "string", + "format": "date-time" + }, + "last_block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { "type": "object", "properties": { - "block_id_flag": { - "title": "BlockIdFlag indicates which BlockID the signature is for", - "type": "string", - "default": "BLOCK_ID_FLAG_UNKNOWN", - "enum": [ - "BLOCK_ID_FLAG_UNKNOWN", - "BLOCK_ID_FLAG_ABSENT", - "BLOCK_ID_FLAG_COMMIT", - "BLOCK_ID_FLAG_NIL" - ] - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "timestamp": { - "type": "string", - "format": "date-time" + "total": { + "type": "integer", + "format": "int64" }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "hash": { "type": "string", "format": "byte" } }, - "description": "CommitSig is a part of the Vote included in a Commit." + "title": "PartsetHeader" } - } + }, + "title": "BlockID" }, - "description": "Commit contains the evidence that a block was committed by a set of validators." - } - } - }, - "validator_set": { - "type": "object", - "properties": { - "validators": { - "type": "array", - "items": { + "last_commit_hash": { + "type": "string", + "format": "byte", + "title": "hashes of block data" + }, + "data_hash": { + "type": "string", + "format": "byte" + }, + "validators_hash": { + "type": "string", + "format": "byte", + "title": "hashes from the app output from the prev block" + }, + "next_validators_hash": { + "type": "string", + "format": "byte" + }, + "consensus_hash": { + "type": "string", + "format": "byte" + }, + "app_hash": { + "type": "string", + "format": "byte" + }, + "last_results_hash": { + "type": "string", + "format": "byte" + }, + "evidence_hash": { + "type": "string", + "format": "byte", + "title": "consensus info" + }, + "proposer_address": { + "type": "string", + "format": "byte" + } + }, + "description": "Header defines the structure of a block header." + }, + "commit": { + "type": "object", + "properties": { + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { "type": "object", "properties": { - "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "hash": { "type": "string", "format": "byte" }, - "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", + "part_set_header": { "type": "object", "properties": { - "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" + "total": { + "type": "integer", + "format": "int64" }, - "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "hash": { "type": "string", "format": "byte" } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "signatures": { + "type": "array", + "items": { + "type": "object", + "properties": { + "block_id_flag": { + "type": "string", + "enum": [ + "BLOCK_ID_FLAG_UNKNOWN", + "BLOCK_ID_FLAG_ABSENT", + "BLOCK_ID_FLAG_COMMIT", + "BLOCK_ID_FLAG_NIL" + ], + "default": "BLOCK_ID_FLAG_UNKNOWN", + "title": "BlockIdFlag indicates which BlockID the signature is for" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "signature": { + "type": "string", + "format": "byte" } }, - "voting_power": { - "type": "string", - "format": "int64" - }, - "proposer_priority": { - "type": "string", - "format": "int64" - } + "description": "CommitSig is a part of the Vote included in a Commit." } } }, - "proposer": { + "description": "Commit contains the evidence that a block was committed by a set of validators." + } + } + }, + "validator_set": { + "type": "object", + "properties": { + "validators": { + "type": "array", + "items": { "type": "object", "properties": { "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "format": "byte" }, "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", "type": "object", "properties": { "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "format": "byte" }, "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "format": "byte" } - } + }, + "title": "PublicKey defines the keys available for use with Validators" }, "voting_power": { "type": "string", @@ -40533,323 +36841,299 @@ "format": "int64" } } - }, - "total_voting_power": { - "type": "string", - "format": "int64" } - } - } - } - }, - "common_height": { - "type": "string", - "format": "int64" - }, - "byzantine_validators": { - "type": "array", - "items": { - "type": "object", - "properties": { - "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" }, - "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", + "proposer": { "type": "object", "properties": { - "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "address": { "type": "string", "format": "byte" }, - "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "pub_key": { + "type": "object", + "properties": { + "ed25519": { + "type": "string", + "format": "byte" + }, + "secp256k1": { + "type": "string", + "format": "byte" + } + }, + "title": "PublicKey defines the keys available for use with Validators" + }, + "voting_power": { "type": "string", - "format": "byte" + "format": "int64" + }, + "proposer_priority": { + "type": "string", + "format": "int64" } } }, - "voting_power": { - "type": "string", - "format": "int64" - }, - "proposer_priority": { + "total_voting_power": { "type": "string", "format": "int64" } } } - }, - "total_voting_power": { - "type": "string", - "format": "int64" - }, - "timestamp": { - "type": "string", - "format": "date-time" } }, - "description": "LightClientAttackEvidence contains evidence of a set of validators attempting to mislead a light client." - } - } - } - } - } - }, - "tendermint.types.LightBlock": { - "type": "object", - "properties": { - "signed_header": { - "type": "object", - "properties": { - "header": { - "type": "object", - "properties": { - "version": { - "title": "basic block info", - "type": "object", - "properties": { - "block": { - "type": "string", - "format": "uint64" - }, - "app": { - "type": "string", - "format": "uint64" - } - }, - "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." - }, - "chain_id": { - "type": "string" - }, - "height": { + "common_height": { "type": "string", "format": "int64" }, - "time": { - "type": "string", - "format": "date-time" - }, - "last_block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" + "byzantine_validators": { + "type": "array", + "items": { + "type": "object", + "properties": { + "address": { + "type": "string", + "format": "byte" + }, + "pub_key": { + "type": "object", + "properties": { + "ed25519": { + "type": "string", + "format": "byte" + }, + "secp256k1": { + "type": "string", + "format": "byte" + } }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } + "title": "PublicKey defines the keys available for use with Validators" + }, + "voting_power": { + "type": "string", + "format": "int64" + }, + "proposer_priority": { + "type": "string", + "format": "int64" } } } }, - "last_commit_hash": { - "title": "hashes of block data", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "data_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validators_hash": { - "title": "hashes from the app output from the prev block", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "next_validators_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "consensus_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "app_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "last_results_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "evidence_hash": { - "title": "consensus info", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "total_voting_power": { "type": "string", - "format": "byte" + "format": "int64" }, - "proposer_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "timestamp": { "type": "string", - "format": "byte" + "format": "date-time" } }, - "description": "Header defines the structure of a block header." - }, - "commit": { - "type": "object", - "properties": { - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } + "description": "LightClientAttackEvidence contains evidence of a set of validators attempting to mislead a light client." + } + } + } + } + } + }, + "tendermint.types.LightBlock": { + "type": "object", + "properties": { + "signed_header": { + "type": "object", + "properties": { + "header": { + "type": "object", + "properties": { + "version": { + "title": "basic block info", + "type": "object", + "properties": { + "block": { + "type": "string", + "format": "uint64" + }, + "app": { + "type": "string", + "format": "uint64" } }, - "signatures": { - "type": "array", - "items": { + "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." + }, + "chain_id": { + "type": "string" + }, + "height": { + "type": "string", + "format": "int64" + }, + "time": { + "type": "string", + "format": "date-time" + }, + "last_block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { "type": "object", "properties": { - "block_id_flag": { - "title": "BlockIdFlag indicates which BlockID the signature is for", - "type": "string", - "default": "BLOCK_ID_FLAG_UNKNOWN", - "enum": [ - "BLOCK_ID_FLAG_UNKNOWN", - "BLOCK_ID_FLAG_ABSENT", - "BLOCK_ID_FLAG_COMMIT", - "BLOCK_ID_FLAG_NIL" - ] - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "timestamp": { - "type": "string", - "format": "date-time" + "total": { + "type": "integer", + "format": "int64" }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "hash": { "type": "string", "format": "byte" } }, - "description": "CommitSig is a part of the Vote included in a Commit." + "title": "PartsetHeader" } - } + }, + "title": "BlockID" }, - "description": "Commit contains the evidence that a block was committed by a set of validators." - } - } - }, - "validator_set": { - "type": "object", - "properties": { - "validators": { - "type": "array", - "items": { + "last_commit_hash": { + "type": "string", + "format": "byte", + "title": "hashes of block data" + }, + "data_hash": { + "type": "string", + "format": "byte" + }, + "validators_hash": { + "type": "string", + "format": "byte", + "title": "hashes from the app output from the prev block" + }, + "next_validators_hash": { + "type": "string", + "format": "byte" + }, + "consensus_hash": { + "type": "string", + "format": "byte" + }, + "app_hash": { + "type": "string", + "format": "byte" + }, + "last_results_hash": { + "type": "string", + "format": "byte" + }, + "evidence_hash": { + "type": "string", + "format": "byte", + "title": "consensus info" + }, + "proposer_address": { + "type": "string", + "format": "byte" + } + }, + "description": "Header defines the structure of a block header." + }, + "commit": { + "type": "object", + "properties": { + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { "type": "object", "properties": { - "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "hash": { "type": "string", "format": "byte" }, - "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", + "part_set_header": { "type": "object", "properties": { - "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" + "total": { + "type": "integer", + "format": "int64" }, - "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "hash": { "type": "string", "format": "byte" } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "signatures": { + "type": "array", + "items": { + "type": "object", + "properties": { + "block_id_flag": { + "type": "string", + "enum": [ + "BLOCK_ID_FLAG_UNKNOWN", + "BLOCK_ID_FLAG_ABSENT", + "BLOCK_ID_FLAG_COMMIT", + "BLOCK_ID_FLAG_NIL" + ], + "default": "BLOCK_ID_FLAG_UNKNOWN", + "title": "BlockIdFlag indicates which BlockID the signature is for" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "signature": { + "type": "string", + "format": "byte" } }, - "voting_power": { - "type": "string", - "format": "int64" - }, - "proposer_priority": { - "type": "string", - "format": "int64" - } + "description": "CommitSig is a part of the Vote included in a Commit." } } }, - "proposer": { + "description": "Commit contains the evidence that a block was committed by a set of validators." + } + } + }, + "validator_set": { + "type": "object", + "properties": { + "validators": { + "type": "array", + "items": { "type": "object", "properties": { "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "format": "byte" }, "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", "type": "object", "properties": { "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "format": "byte" }, "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "format": "byte" } - } + }, + "title": "PublicKey defines the keys available for use with Validators" }, "voting_power": { "type": "string", @@ -40860,269 +37144,248 @@ "format": "int64" } } - }, - "total_voting_power": { - "type": "string", - "format": "int64" } + }, + "proposer": { + "type": "object", + "properties": { + "address": { + "type": "string", + "format": "byte" + }, + "pub_key": { + "type": "object", + "properties": { + "ed25519": { + "type": "string", + "format": "byte" + }, + "secp256k1": { + "type": "string", + "format": "byte" + } + }, + "title": "PublicKey defines the keys available for use with Validators" + }, + "voting_power": { + "type": "string", + "format": "int64" + }, + "proposer_priority": { + "type": "string", + "format": "int64" + } + } + }, + "total_voting_power": { + "type": "string", + "format": "int64" } } } - }, - "tendermint.types.LightClientAttackEvidence": { - "type": "object", - "properties": { - "conflicting_block": { - "type": "object", - "properties": { - "signed_header": { - "type": "object", - "properties": { - "header": { - "type": "object", - "properties": { - "version": { - "title": "basic block info", - "type": "object", - "properties": { - "block": { - "type": "string", - "format": "uint64" - }, - "app": { - "type": "string", - "format": "uint64" - } + } + }, + "tendermint.types.LightClientAttackEvidence": { + "type": "object", + "properties": { + "conflicting_block": { + "type": "object", + "properties": { + "signed_header": { + "type": "object", + "properties": { + "header": { + "type": "object", + "properties": { + "version": { + "title": "basic block info", + "type": "object", + "properties": { + "block": { + "type": "string", + "format": "uint64" }, - "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." - }, - "chain_id": { - "type": "string" - }, - "height": { - "type": "string", - "format": "int64" - }, - "time": { - "type": "string", - "format": "date-time" - }, - "last_block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } + "app": { + "type": "string", + "format": "uint64" } }, - "last_commit_hash": { - "title": "hashes of block data", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "data_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validators_hash": { - "title": "hashes from the app output from the prev block", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "next_validators_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "consensus_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "app_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "last_results_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "evidence_hash": { - "title": "consensus info", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proposer_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } + "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." }, - "description": "Header defines the structure of a block header." - }, - "commit": { - "type": "object", - "properties": { - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "signatures": { - "type": "array", - "items": { + "chain_id": { + "type": "string" + }, + "height": { + "type": "string", + "format": "int64" + }, + "time": { + "type": "string", + "format": "date-time" + }, + "last_block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { "type": "object", "properties": { - "block_id_flag": { - "title": "BlockIdFlag indicates which BlockID the signature is for", - "type": "string", - "default": "BLOCK_ID_FLAG_UNKNOWN", - "enum": [ - "BLOCK_ID_FLAG_UNKNOWN", - "BLOCK_ID_FLAG_ABSENT", - "BLOCK_ID_FLAG_COMMIT", - "BLOCK_ID_FLAG_NIL" - ] - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "timestamp": { - "type": "string", - "format": "date-time" + "total": { + "type": "integer", + "format": "int64" }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "hash": { "type": "string", "format": "byte" } }, - "description": "CommitSig is a part of the Vote included in a Commit." + "title": "PartsetHeader" } - } + }, + "title": "BlockID" }, - "description": "Commit contains the evidence that a block was committed by a set of validators." - } - } - }, - "validator_set": { - "type": "object", - "properties": { - "validators": { - "type": "array", - "items": { + "last_commit_hash": { + "type": "string", + "format": "byte", + "title": "hashes of block data" + }, + "data_hash": { + "type": "string", + "format": "byte" + }, + "validators_hash": { + "type": "string", + "format": "byte", + "title": "hashes from the app output from the prev block" + }, + "next_validators_hash": { + "type": "string", + "format": "byte" + }, + "consensus_hash": { + "type": "string", + "format": "byte" + }, + "app_hash": { + "type": "string", + "format": "byte" + }, + "last_results_hash": { + "type": "string", + "format": "byte" + }, + "evidence_hash": { + "type": "string", + "format": "byte", + "title": "consensus info" + }, + "proposer_address": { + "type": "string", + "format": "byte" + } + }, + "description": "Header defines the structure of a block header." + }, + "commit": { + "type": "object", + "properties": { + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { "type": "object", "properties": { - "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "hash": { "type": "string", "format": "byte" }, - "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", + "part_set_header": { "type": "object", "properties": { - "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" + "total": { + "type": "integer", + "format": "int64" }, - "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "hash": { "type": "string", "format": "byte" } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "signatures": { + "type": "array", + "items": { + "type": "object", + "properties": { + "block_id_flag": { + "type": "string", + "enum": [ + "BLOCK_ID_FLAG_UNKNOWN", + "BLOCK_ID_FLAG_ABSENT", + "BLOCK_ID_FLAG_COMMIT", + "BLOCK_ID_FLAG_NIL" + ], + "default": "BLOCK_ID_FLAG_UNKNOWN", + "title": "BlockIdFlag indicates which BlockID the signature is for" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "signature": { + "type": "string", + "format": "byte" } }, - "voting_power": { - "type": "string", - "format": "int64" - }, - "proposer_priority": { - "type": "string", - "format": "int64" - } + "description": "CommitSig is a part of the Vote included in a Commit." } } }, - "proposer": { + "description": "Commit contains the evidence that a block was committed by a set of validators." + } + } + }, + "validator_set": { + "type": "object", + "properties": { + "validators": { + "type": "array", + "items": { "type": "object", "properties": { "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "format": "byte" }, "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", "type": "object", "properties": { "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "format": "byte" }, "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "format": "byte" } - } + }, + "title": "PublicKey defines the keys available for use with Validators" }, "voting_power": { "type": "string", @@ -41131,362 +37394,75 @@ "proposer_priority": { "type": "string", "format": "int64" - } - } - }, - "total_voting_power": { - "type": "string", - "format": "int64" - } - } - } - } - }, - "common_height": { - "type": "string", - "format": "int64" - }, - "byzantine_validators": { - "type": "array", - "items": { - "type": "object", - "properties": { - "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", - "type": "object", - "properties": { - "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - }, - "voting_power": { - "type": "string", - "format": "int64" - }, - "proposer_priority": { - "type": "string", - "format": "int64" - } - } - } - }, - "total_voting_power": { - "type": "string", - "format": "int64" - }, - "timestamp": { - "type": "string", - "format": "date-time" - } - }, - "description": "LightClientAttackEvidence contains evidence of a set of validators attempting to mislead a light client." - }, - "tendermint.types.SignedHeader": { - "type": "object", - "properties": { - "header": { - "type": "object", - "properties": { - "version": { - "title": "basic block info", - "type": "object", - "properties": { - "block": { - "type": "string", - "format": "uint64" - }, - "app": { - "type": "string", - "format": "uint64" - } - }, - "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." - }, - "chain_id": { - "type": "string" - }, - "height": { - "type": "string", - "format": "int64" - }, - "time": { - "type": "string", - "format": "date-time" - }, - "last_block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "last_commit_hash": { - "title": "hashes of block data", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "data_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validators_hash": { - "title": "hashes from the app output from the prev block", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "next_validators_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "consensus_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "app_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "last_results_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "evidence_hash": { - "title": "consensus info", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proposer_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "Header defines the structure of a block header." - }, - "commit": { - "type": "object", - "properties": { - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "signatures": { - "type": "array", - "items": { - "type": "object", - "properties": { - "block_id_flag": { - "title": "BlockIdFlag indicates which BlockID the signature is for", - "type": "string", - "default": "BLOCK_ID_FLAG_UNKNOWN", - "enum": [ - "BLOCK_ID_FLAG_UNKNOWN", - "BLOCK_ID_FLAG_ABSENT", - "BLOCK_ID_FLAG_COMMIT", - "BLOCK_ID_FLAG_NIL" - ] - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "CommitSig is a part of the Vote included in a Commit." - } - } - }, - "description": "Commit contains the evidence that a block was committed by a set of validators." - } - } - }, - "tendermint.types.SignedMsgType": { - "type": "string", - "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals", - "default": "SIGNED_MSG_TYPE_UNKNOWN", - "enum": [ - "SIGNED_MSG_TYPE_UNKNOWN", - "SIGNED_MSG_TYPE_PREVOTE", - "SIGNED_MSG_TYPE_PRECOMMIT", - "SIGNED_MSG_TYPE_PROPOSAL" - ] - }, - "tendermint.types.Validator": { - "type": "object", - "properties": { - "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", - "type": "object", - "properties": { - "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - }, - "voting_power": { - "type": "string", - "format": "int64" - }, - "proposer_priority": { - "type": "string", - "format": "int64" - } - } - }, - "tendermint.types.ValidatorSet": { - "type": "object", - "properties": { - "validators": { - "type": "array", - "items": { - "type": "object", - "properties": { - "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" + } + } + } }, - "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", + "proposer": { "type": "object", "properties": { - "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "address": { "type": "string", "format": "byte" }, - "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "pub_key": { + "type": "object", + "properties": { + "ed25519": { + "type": "string", + "format": "byte" + }, + "secp256k1": { + "type": "string", + "format": "byte" + } + }, + "title": "PublicKey defines the keys available for use with Validators" + }, + "voting_power": { "type": "string", - "format": "byte" + "format": "int64" + }, + "proposer_priority": { + "type": "string", + "format": "int64" } } }, - "voting_power": { - "type": "string", - "format": "int64" - }, - "proposer_priority": { + "total_voting_power": { "type": "string", "format": "int64" } } } - }, - "proposer": { + } + }, + "common_height": { + "type": "string", + "format": "int64" + }, + "byzantine_validators": { + "type": "array", + "items": { "type": "object", "properties": { "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "format": "byte" }, "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", "type": "object", "properties": { "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "format": "byte" }, "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "format": "byte" } - } + }, + "title": "PublicKey defines the keys available for use with Validators" }, "voting_power": { "type": "string", @@ -41497,727 +37473,933 @@ "format": "int64" } } - }, - "total_voting_power": { - "type": "string", - "format": "int64" } + }, + "total_voting_power": { + "type": "string", + "format": "int64" + }, + "timestamp": { + "type": "string", + "format": "date-time" } }, - "tendermint.types.Vote": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals", - "default": "SIGNED_MSG_TYPE_UNKNOWN", - "enum": [ - "SIGNED_MSG_TYPE_UNKNOWN", - "SIGNED_MSG_TYPE_PREVOTE", - "SIGNED_MSG_TYPE_PRECOMMIT", - "SIGNED_MSG_TYPE_PROPOSAL" - ] + "description": "LightClientAttackEvidence contains evidence of a set of validators attempting to mislead a light client." + }, + "tendermint.types.SignedHeader": { + "type": "object", + "properties": { + "header": { + "type": "object", + "properties": { + "version": { + "title": "basic block info", + "type": "object", + "properties": { + "block": { + "type": "string", + "format": "uint64" + }, + "app": { + "type": "string", + "format": "uint64" + } + }, + "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." + }, + "chain_id": { + "type": "string" + }, + "height": { + "type": "string", + "format": "int64" + }, + "time": { + "type": "string", + "format": "date-time" + }, + "last_block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "last_commit_hash": { + "type": "string", + "format": "byte", + "title": "hashes of block data" + }, + "data_hash": { + "type": "string", + "format": "byte" + }, + "validators_hash": { + "type": "string", + "format": "byte", + "title": "hashes from the app output from the prev block" + }, + "next_validators_hash": { + "type": "string", + "format": "byte" + }, + "consensus_hash": { + "type": "string", + "format": "byte" + }, + "app_hash": { + "type": "string", + "format": "byte" + }, + "last_results_hash": { + "type": "string", + "format": "byte" + }, + "evidence_hash": { + "type": "string", + "format": "byte", + "title": "consensus info" + }, + "proposer_address": { + "type": "string", + "format": "byte" + } }, - "height": { - "type": "string", - "format": "int64" + "description": "Header defines the structure of a block header." + }, + "commit": { + "type": "object", + "properties": { + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "signatures": { + "type": "array", + "items": { + "type": "object", + "properties": { + "block_id_flag": { + "type": "string", + "enum": [ + "BLOCK_ID_FLAG_UNKNOWN", + "BLOCK_ID_FLAG_ABSENT", + "BLOCK_ID_FLAG_COMMIT", + "BLOCK_ID_FLAG_NIL" + ], + "default": "BLOCK_ID_FLAG_UNKNOWN", + "title": "BlockIdFlag indicates which BlockID the signature is for" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "signature": { + "type": "string", + "format": "byte" + } + }, + "description": "CommitSig is a part of the Vote included in a Commit." + } + } }, - "round": { - "type": "integer", - "format": "int32" + "description": "Commit contains the evidence that a block was committed by a set of validators." + } + } + }, + "tendermint.types.SignedMsgType": { + "type": "string", + "enum": [ + "SIGNED_MSG_TYPE_UNKNOWN", + "SIGNED_MSG_TYPE_PREVOTE", + "SIGNED_MSG_TYPE_PRECOMMIT", + "SIGNED_MSG_TYPE_PROPOSAL" + ], + "default": "SIGNED_MSG_TYPE_UNKNOWN", + "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals" + }, + "tendermint.types.Validator": { + "type": "object", + "properties": { + "address": { + "type": "string", + "format": "byte" + }, + "pub_key": { + "type": "object", + "properties": { + "ed25519": { + "type": "string", + "format": "byte" + }, + "secp256k1": { + "type": "string", + "format": "byte" + } }, - "block_id": { - "title": "BlockID", + "title": "PublicKey defines the keys available for use with Validators" + }, + "voting_power": { + "type": "string", + "format": "int64" + }, + "proposer_priority": { + "type": "string", + "format": "int64" + } + } + }, + "tendermint.types.ValidatorSet": { + "type": "object", + "properties": { + "validators": { + "type": "array", + "items": { "type": "object", "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "address": { "type": "string", "format": "byte" }, - "part_set_header": { - "title": "PartsetHeader", + "pub_key": { "type": "object", "properties": { - "total": { - "type": "integer", - "format": "int64" + "ed25519": { + "type": "string", + "format": "byte" }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "secp256k1": { "type": "string", "format": "byte" } - } + }, + "title": "PublicKey defines the keys available for use with Validators" + }, + "voting_power": { + "type": "string", + "format": "int64" + }, + "proposer_priority": { + "type": "string", + "format": "int64" } } - }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validator_index": { - "type": "integer", - "format": "int32" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block.", - "format": "byte" - }, - "extension": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages.", - "format": "byte" - }, - "extension_signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages.", - "format": "byte" } }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." - }, - "cosmos.base.tendermint.v1beta1.ABCIQueryResponse": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int64" - }, - "log": { - "type": "string" - }, - "info": { - "type": "string" - }, - "index": { - "type": "string", - "format": "int64" - }, - "key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proof_ops": { - "type": "object", - "properties": { - "ops": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "data": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "ProofOp defines an operation used for calculating Merkle root. The data could\nbe arbitrary format, providing necessary data for example neighbouring node\nhash.\n\nNote: This type is a duplicate of the ProofOp proto type defined in Tendermint." + "proposer": { + "type": "object", + "properties": { + "address": { + "type": "string", + "format": "byte" + }, + "pub_key": { + "type": "object", + "properties": { + "ed25519": { + "type": "string", + "format": "byte" + }, + "secp256k1": { + "type": "string", + "format": "byte" } - } + }, + "title": "PublicKey defines the keys available for use with Validators" }, - "description": "ProofOps is Merkle proof defined by the list of ProofOps.\n\nNote: This type is a duplicate of the ProofOps proto type defined in Tendermint." - }, - "height": { - "type": "string", - "format": "int64" - }, - "codespace": { - "type": "string" + "voting_power": { + "type": "string", + "format": "int64" + }, + "proposer_priority": { + "type": "string", + "format": "int64" + } } }, - "description": "ABCIQueryResponse defines the response structure for the ABCIQuery gRPC query.\n\nNote: This type is a duplicate of the ResponseQuery proto type defined in\nTendermint." + "total_voting_power": { + "type": "string", + "format": "int64" + } + } + }, + "tendermint.types.Vote": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "SIGNED_MSG_TYPE_UNKNOWN", + "SIGNED_MSG_TYPE_PREVOTE", + "SIGNED_MSG_TYPE_PRECOMMIT", + "SIGNED_MSG_TYPE_PROPOSAL" + ], + "default": "SIGNED_MSG_TYPE_UNKNOWN", + "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals" + }, + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "validator_index": { + "type": "integer", + "format": "int32" + }, + "signature": { + "type": "string", + "format": "byte", + "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." + }, + "extension": { + "type": "string", + "format": "byte", + "description": "Vote extension provided by the application. Only valid for precommit\nmessages." + }, + "extension_signature": { + "type": "string", + "format": "byte", + "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + } }, - "cosmos.base.tendermint.v1beta1.Block": { - "type": "object", - "properties": { - "header": { - "type": "object", - "properties": { - "version": { - "title": "basic block info", + "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + }, + "cosmos.base.tendermint.v1beta1.ABCIQueryResponse": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "format": "int64" + }, + "log": { + "type": "string" + }, + "info": { + "type": "string" + }, + "index": { + "type": "string", + "format": "int64" + }, + "key": { + "type": "string", + "format": "byte" + }, + "value": { + "type": "string", + "format": "byte" + }, + "proof_ops": { + "type": "object", + "properties": { + "ops": { + "type": "array", + "items": { "type": "object", "properties": { - "block": { + "type": { + "type": "string" + }, + "key": { "type": "string", - "format": "uint64" + "format": "byte" }, - "app": { + "data": { "type": "string", - "format": "uint64" + "format": "byte" } }, - "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." - }, - "chain_id": { - "type": "string" - }, - "height": { - "type": "string", - "format": "int64" - }, - "time": { - "type": "string", - "format": "date-time" + "description": "ProofOp defines an operation used for calculating Merkle root. The data could\nbe arbitrary format, providing necessary data for example neighbouring node\nhash.\n\nNote: This type is a duplicate of the ProofOp proto type defined in Tendermint." + } + } + }, + "description": "ProofOps is Merkle proof defined by the list of ProofOps.\n\nNote: This type is a duplicate of the ProofOps proto type defined in Tendermint." + }, + "height": { + "type": "string", + "format": "int64" + }, + "codespace": { + "type": "string" + } + }, + "description": "ABCIQueryResponse defines the response structure for the ABCIQuery gRPC query.\n\nNote: This type is a duplicate of the ResponseQuery proto type defined in\nTendermint." + }, + "cosmos.base.tendermint.v1beta1.Block": { + "type": "object", + "properties": { + "header": { + "type": "object", + "properties": { + "version": { + "title": "basic block info", + "type": "object", + "properties": { + "block": { + "type": "string", + "format": "uint64" + }, + "app": { + "type": "string", + "format": "uint64" + } }, - "last_block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } + "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." + }, + "chain_id": { + "type": "string" + }, + "height": { + "type": "string", + "format": "int64" + }, + "time": { + "type": "string", + "format": "date-time" + }, + "last_block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" } - } + }, + "title": "PartsetHeader" } }, - "last_commit_hash": { - "title": "hashes of block data", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "data_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validators_hash": { - "title": "hashes from the app output from the prev block", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "next_validators_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "consensus_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "app_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "last_results_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "evidence_hash": { - "title": "consensus info", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "title": "BlockID" + }, + "last_commit_hash": { + "type": "string", + "format": "byte", + "title": "hashes of block data" + }, + "data_hash": { + "type": "string", + "format": "byte" + }, + "validators_hash": { + "type": "string", + "format": "byte", + "title": "hashes from the app output from the prev block" + }, + "next_validators_hash": { + "type": "string", + "format": "byte" + }, + "consensus_hash": { + "type": "string", + "format": "byte" + }, + "app_hash": { + "type": "string", + "format": "byte" + }, + "last_results_hash": { + "type": "string", + "format": "byte" + }, + "evidence_hash": { + "type": "string", + "format": "byte", + "title": "consensus info" + }, + "proposer_address": { + "type": "string", + "description": "proposer_address is the original block proposer address, formatted as a Bech32 string.\nIn Tendermint, this type is `bytes`, but in the SDK, we convert it to a Bech32 string\nfor better UX." + } + }, + "description": "Header defines the structure of a Tendermint block header." + }, + "data": { + "type": "object", + "properties": { + "txs": { + "type": "array", + "items": { "type": "string", "format": "byte" }, - "proposer_address": { - "type": "string", - "description": "proposer_address is the original block proposer address, formatted as a Bech32 string.\nIn Tendermint, this type is `bytes`, but in the SDK, we convert it to a Bech32 string\nfor better UX." - } - }, - "description": "Header defines the structure of a Tendermint block header." - }, - "data": { - "title": "Data contains the set of transactions included in the block", - "type": "object", - "properties": { - "txs": { - "type": "array", - "description": "Txs that will be applied by state @ block.Height+1.\nNOTE: not all txs here are valid. We're just agreeing on the order first.\nThis means that block.AppHash does not include these txs.", - "items": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "description": "Txs that will be applied by state @ block.Height+1.\nNOTE: not all txs here are valid. We're just agreeing on the order first.\nThis means that block.AppHash does not include these txs." } }, - "evidence": { - "type": "object", - "properties": { - "evidence": { - "type": "array", - "items": { - "type": "object", - "properties": { - "duplicate_vote_evidence": { - "type": "object", - "properties": { - "vote_a": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals", - "default": "SIGNED_MSG_TYPE_UNKNOWN", - "enum": [ - "SIGNED_MSG_TYPE_UNKNOWN", - "SIGNED_MSG_TYPE_PREVOTE", - "SIGNED_MSG_TYPE_PRECOMMIT", - "SIGNED_MSG_TYPE_PROPOSAL" - ] - }, - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validator_index": { - "type": "integer", - "format": "int32" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block.", - "format": "byte" - }, - "extension": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages.", - "format": "byte" + "title": "Data contains the set of transactions included in the block" + }, + "evidence": { + "type": "object", + "properties": { + "evidence": { + "type": "array", + "items": { + "type": "object", + "properties": { + "duplicate_vote_evidence": { + "type": "object", + "properties": { + "vote_a": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "SIGNED_MSG_TYPE_UNKNOWN", + "SIGNED_MSG_TYPE_PREVOTE", + "SIGNED_MSG_TYPE_PRECOMMIT", + "SIGNED_MSG_TYPE_PROPOSAL" + ], + "default": "SIGNED_MSG_TYPE_UNKNOWN", + "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals" + }, + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } }, - "extension_signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages.", - "format": "byte" - } + "title": "BlockID" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "validator_address": { + "type": "string", + "format": "byte" }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + "validator_index": { + "type": "integer", + "format": "int32" + }, + "signature": { + "type": "string", + "format": "byte", + "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." + }, + "extension": { + "type": "string", + "format": "byte", + "description": "Vote extension provided by the application. Only valid for precommit\nmessages." + }, + "extension_signature": { + "type": "string", + "format": "byte", + "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + } }, - "vote_b": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals", - "default": "SIGNED_MSG_TYPE_UNKNOWN", - "enum": [ - "SIGNED_MSG_TYPE_UNKNOWN", - "SIGNED_MSG_TYPE_PREVOTE", - "SIGNED_MSG_TYPE_PRECOMMIT", - "SIGNED_MSG_TYPE_PROPOSAL" - ] - }, - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } + "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + }, + "vote_b": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "SIGNED_MSG_TYPE_UNKNOWN", + "SIGNED_MSG_TYPE_PREVOTE", + "SIGNED_MSG_TYPE_PRECOMMIT", + "SIGNED_MSG_TYPE_PROPOSAL" + ], + "default": "SIGNED_MSG_TYPE_UNKNOWN", + "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals" + }, + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" } - } + }, + "title": "PartsetHeader" } }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validator_index": { - "type": "integer", - "format": "int32" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block.", - "format": "byte" - }, - "extension": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages.", - "format": "byte" - }, - "extension_signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages.", - "format": "byte" - } + "title": "BlockID" }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." - }, - "total_voting_power": { - "type": "string", - "format": "int64" - }, - "validator_power": { - "type": "string", - "format": "int64" + "timestamp": { + "type": "string", + "format": "date-time" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "validator_index": { + "type": "integer", + "format": "int32" + }, + "signature": { + "type": "string", + "format": "byte", + "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." + }, + "extension": { + "type": "string", + "format": "byte", + "description": "Vote extension provided by the application. Only valid for precommit\nmessages." + }, + "extension_signature": { + "type": "string", + "format": "byte", + "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + } }, - "timestamp": { - "type": "string", - "format": "date-time" - } + "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + }, + "total_voting_power": { + "type": "string", + "format": "int64" }, - "description": "DuplicateVoteEvidence contains evidence of a validator signed two conflicting votes." + "validator_power": { + "type": "string", + "format": "int64" + }, + "timestamp": { + "type": "string", + "format": "date-time" + } }, - "light_client_attack_evidence": { - "type": "object", - "properties": { - "conflicting_block": { - "type": "object", - "properties": { - "signed_header": { - "type": "object", - "properties": { - "header": { - "type": "object", - "properties": { - "version": { - "title": "basic block info", - "type": "object", - "properties": { - "block": { - "type": "string", - "format": "uint64" - }, - "app": { - "type": "string", - "format": "uint64" - } + "description": "DuplicateVoteEvidence contains evidence of a validator signed two conflicting votes." + }, + "light_client_attack_evidence": { + "type": "object", + "properties": { + "conflicting_block": { + "type": "object", + "properties": { + "signed_header": { + "type": "object", + "properties": { + "header": { + "type": "object", + "properties": { + "version": { + "title": "basic block info", + "type": "object", + "properties": { + "block": { + "type": "string", + "format": "uint64" }, - "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." - }, - "chain_id": { - "type": "string" - }, - "height": { - "type": "string", - "format": "int64" - }, - "time": { - "type": "string", - "format": "date-time" - }, - "last_block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } + "app": { + "type": "string", + "format": "uint64" } }, - "last_commit_hash": { - "title": "hashes of block data", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "data_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validators_hash": { - "title": "hashes from the app output from the prev block", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "next_validators_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "consensus_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "app_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "last_results_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "evidence_hash": { - "title": "consensus info", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proposer_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } + "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." }, - "description": "Header defines the structure of a block header." - }, - "commit": { - "type": "object", - "properties": { - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "signatures": { - "type": "array", - "items": { + "chain_id": { + "type": "string" + }, + "height": { + "type": "string", + "format": "int64" + }, + "time": { + "type": "string", + "format": "date-time" + }, + "last_block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { "type": "object", "properties": { - "block_id_flag": { - "title": "BlockIdFlag indicates which BlockID the signature is for", - "type": "string", - "default": "BLOCK_ID_FLAG_UNKNOWN", - "enum": [ - "BLOCK_ID_FLAG_UNKNOWN", - "BLOCK_ID_FLAG_ABSENT", - "BLOCK_ID_FLAG_COMMIT", - "BLOCK_ID_FLAG_NIL" - ] - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "timestamp": { - "type": "string", - "format": "date-time" + "total": { + "type": "integer", + "format": "int64" }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "hash": { "type": "string", "format": "byte" } }, - "description": "CommitSig is a part of the Vote included in a Commit." + "title": "PartsetHeader" } - } + }, + "title": "BlockID" + }, + "last_commit_hash": { + "type": "string", + "format": "byte", + "title": "hashes of block data" }, - "description": "Commit contains the evidence that a block was committed by a set of validators." - } - } - }, - "validator_set": { - "type": "object", - "properties": { - "validators": { - "type": "array", - "items": { + "data_hash": { + "type": "string", + "format": "byte" + }, + "validators_hash": { + "type": "string", + "format": "byte", + "title": "hashes from the app output from the prev block" + }, + "next_validators_hash": { + "type": "string", + "format": "byte" + }, + "consensus_hash": { + "type": "string", + "format": "byte" + }, + "app_hash": { + "type": "string", + "format": "byte" + }, + "last_results_hash": { + "type": "string", + "format": "byte" + }, + "evidence_hash": { + "type": "string", + "format": "byte", + "title": "consensus info" + }, + "proposer_address": { + "type": "string", + "format": "byte" + } + }, + "description": "Header defines the structure of a block header." + }, + "commit": { + "type": "object", + "properties": { + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { "type": "object", "properties": { - "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "hash": { "type": "string", "format": "byte" }, - "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", + "part_set_header": { "type": "object", "properties": { - "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" + "total": { + "type": "integer", + "format": "int64" }, - "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "hash": { "type": "string", "format": "byte" } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "signatures": { + "type": "array", + "items": { + "type": "object", + "properties": { + "block_id_flag": { + "type": "string", + "enum": [ + "BLOCK_ID_FLAG_UNKNOWN", + "BLOCK_ID_FLAG_ABSENT", + "BLOCK_ID_FLAG_COMMIT", + "BLOCK_ID_FLAG_NIL" + ], + "default": "BLOCK_ID_FLAG_UNKNOWN", + "title": "BlockIdFlag indicates which BlockID the signature is for" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "signature": { + "type": "string", + "format": "byte" } }, - "voting_power": { - "type": "string", - "format": "int64" - }, - "proposer_priority": { - "type": "string", - "format": "int64" - } + "description": "CommitSig is a part of the Vote included in a Commit." } } }, - "proposer": { + "description": "Commit contains the evidence that a block was committed by a set of validators." + } + } + }, + "validator_set": { + "type": "object", + "properties": { + "validators": { + "type": "array", + "items": { "type": "object", "properties": { "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "format": "byte" }, "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", "type": "object", "properties": { "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "format": "byte" }, "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "format": "byte" } - } + }, + "title": "PublicKey defines the keys available for use with Validators" }, "voting_power": { "type": "string", @@ -42228,747 +38410,693 @@ "format": "int64" } } - }, - "total_voting_power": { - "type": "string", - "format": "int64" } - } - } - } - }, - "common_height": { - "type": "string", - "format": "int64" - }, - "byzantine_validators": { - "type": "array", - "items": { - "type": "object", - "properties": { - "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" }, - "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", + "proposer": { "type": "object", "properties": { - "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "address": { "type": "string", "format": "byte" }, - "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "pub_key": { + "type": "object", + "properties": { + "ed25519": { + "type": "string", + "format": "byte" + }, + "secp256k1": { + "type": "string", + "format": "byte" + } + }, + "title": "PublicKey defines the keys available for use with Validators" + }, + "voting_power": { "type": "string", - "format": "byte" + "format": "int64" + }, + "proposer_priority": { + "type": "string", + "format": "int64" } } }, - "voting_power": { - "type": "string", - "format": "int64" - }, - "proposer_priority": { + "total_voting_power": { "type": "string", "format": "int64" } } } - }, - "total_voting_power": { - "type": "string", - "format": "int64" - }, - "timestamp": { - "type": "string", - "format": "date-time" } }, - "description": "LightClientAttackEvidence contains evidence of a set of validators attempting to mislead a light client." - } - } - } - } - } - }, - "last_commit": { - "type": "object", - "properties": { - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "signatures": { - "type": "array", - "items": { - "type": "object", - "properties": { - "block_id_flag": { - "title": "BlockIdFlag indicates which BlockID the signature is for", - "type": "string", - "default": "BLOCK_ID_FLAG_UNKNOWN", - "enum": [ - "BLOCK_ID_FLAG_UNKNOWN", - "BLOCK_ID_FLAG_ABSENT", - "BLOCK_ID_FLAG_COMMIT", - "BLOCK_ID_FLAG_NIL" - ] - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "CommitSig is a part of the Vote included in a Commit." - } - } - }, - "description": "Commit contains the evidence that a block was committed by a set of validators." - } - }, - "description": "Block is tendermint type Block, with the Header proposer address\nfield converted to bech32 string." - }, - "cosmos.base.tendermint.v1beta1.GetBlockByHeightResponse": { - "type": "object", - "properties": { - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "block": { - "title": "Deprecated: please use `sdk_block` instead", - "type": "object", - "properties": { - "header": { - "type": "object", - "properties": { - "version": { - "title": "basic block info", - "type": "object", - "properties": { - "block": { - "type": "string", - "format": "uint64" - }, - "app": { - "type": "string", - "format": "uint64" - } - }, - "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." - }, - "chain_id": { - "type": "string" - }, - "height": { - "type": "string", - "format": "int64" - }, - "time": { - "type": "string", - "format": "date-time" - }, - "last_block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "common_height": { "type": "string", - "format": "byte" + "format": "int64" }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" + "byzantine_validators": { + "type": "array", + "items": { + "type": "object", + "properties": { + "address": { + "type": "string", + "format": "byte" + }, + "pub_key": { + "type": "object", + "properties": { + "ed25519": { + "type": "string", + "format": "byte" + }, + "secp256k1": { + "type": "string", + "format": "byte" + } + }, + "title": "PublicKey defines the keys available for use with Validators" + }, + "voting_power": { + "type": "string", + "format": "int64" + }, + "proposer_priority": { + "type": "string", + "format": "int64" + } } } + }, + "total_voting_power": { + "type": "string", + "format": "int64" + }, + "timestamp": { + "type": "string", + "format": "date-time" } + }, + "description": "LightClientAttackEvidence contains evidence of a set of validators attempting to mislead a light client." + } + } + } + } + } + }, + "last_commit": { + "type": "object", + "properties": { + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" } }, - "last_commit_hash": { - "title": "hashes of block data", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "data_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validators_hash": { - "title": "hashes from the app output from the prev block", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "next_validators_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "consensus_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "app_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "signatures": { + "type": "array", + "items": { + "type": "object", + "properties": { + "block_id_flag": { "type": "string", - "format": "byte" + "enum": [ + "BLOCK_ID_FLAG_UNKNOWN", + "BLOCK_ID_FLAG_ABSENT", + "BLOCK_ID_FLAG_COMMIT", + "BLOCK_ID_FLAG_NIL" + ], + "default": "BLOCK_ID_FLAG_UNKNOWN", + "title": "BlockIdFlag indicates which BlockID the signature is for" }, - "last_results_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "validator_address": { "type": "string", "format": "byte" }, - "evidence_hash": { - "title": "consensus info", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "timestamp": { "type": "string", - "format": "byte" + "format": "date-time" }, - "proposer_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "signature": { "type": "string", "format": "byte" } }, - "description": "Header defines the structure of a block header." + "description": "CommitSig is a part of the Vote included in a Commit." + } + } + }, + "description": "Commit contains the evidence that a block was committed by a set of validators." + } + }, + "description": "Block is tendermint type Block, with the Header proposer address\nfield converted to bech32 string." + }, + "cosmos.base.tendermint.v1beta1.GetBlockByHeightResponse": { + "type": "object", + "properties": { + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } }, - "data": { - "title": "Data contains the set of transactions included in the block", - "type": "object", - "properties": { - "txs": { - "type": "array", - "description": "Txs that will be applied by state @ block.Height+1.\nNOTE: not all txs here are valid. We're just agreeing on the order first.\nThis means that block.AppHash does not include these txs.", - "items": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "block": { + "title": "Deprecated: please use `sdk_block` instead", + "type": "object", + "properties": { + "header": { + "type": "object", + "properties": { + "version": { + "title": "basic block info", + "type": "object", + "properties": { + "block": { + "type": "string", + "format": "uint64" + }, + "app": { + "type": "string", + "format": "uint64" + } + }, + "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." + }, + "chain_id": { + "type": "string" + }, + "height": { + "type": "string", + "format": "int64" + }, + "time": { + "type": "string", + "format": "date-time" + }, + "last_block_id": { + "type": "object", + "properties": { + "hash": { "type": "string", "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" } - } + }, + "title": "BlockID" + }, + "last_commit_hash": { + "type": "string", + "format": "byte", + "title": "hashes of block data" + }, + "data_hash": { + "type": "string", + "format": "byte" + }, + "validators_hash": { + "type": "string", + "format": "byte", + "title": "hashes from the app output from the prev block" + }, + "next_validators_hash": { + "type": "string", + "format": "byte" + }, + "consensus_hash": { + "type": "string", + "format": "byte" + }, + "app_hash": { + "type": "string", + "format": "byte" + }, + "last_results_hash": { + "type": "string", + "format": "byte" + }, + "evidence_hash": { + "type": "string", + "format": "byte", + "title": "consensus info" + }, + "proposer_address": { + "type": "string", + "format": "byte" } }, - "evidence": { - "type": "object", - "properties": { - "evidence": { - "type": "array", - "items": { - "type": "object", - "properties": { - "duplicate_vote_evidence": { - "type": "object", - "properties": { - "vote_a": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals", - "default": "SIGNED_MSG_TYPE_UNKNOWN", - "enum": [ - "SIGNED_MSG_TYPE_UNKNOWN", - "SIGNED_MSG_TYPE_PREVOTE", - "SIGNED_MSG_TYPE_PRECOMMIT", - "SIGNED_MSG_TYPE_PROPOSAL" - ] - }, - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } + "description": "Header defines the structure of a block header." + }, + "data": { + "type": "object", + "properties": { + "txs": { + "type": "array", + "items": { + "type": "string", + "format": "byte" + }, + "description": "Txs that will be applied by state @ block.Height+1.\nNOTE: not all txs here are valid. We're just agreeing on the order first.\nThis means that block.AppHash does not include these txs." + } + }, + "title": "Data contains the set of transactions included in the block" + }, + "evidence": { + "type": "object", + "properties": { + "evidence": { + "type": "array", + "items": { + "type": "object", + "properties": { + "duplicate_vote_evidence": { + "type": "object", + "properties": { + "vote_a": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "SIGNED_MSG_TYPE_UNKNOWN", + "SIGNED_MSG_TYPE_PREVOTE", + "SIGNED_MSG_TYPE_PRECOMMIT", + "SIGNED_MSG_TYPE_PROPOSAL" + ], + "default": "SIGNED_MSG_TYPE_UNKNOWN", + "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals" + }, + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" } - } + }, + "title": "PartsetHeader" } }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validator_index": { - "type": "integer", - "format": "int32" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block.", - "format": "byte" - }, - "extension": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages.", - "format": "byte" - }, - "extension_signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages.", - "format": "byte" - } + "title": "BlockID" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "validator_index": { + "type": "integer", + "format": "int32" }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + "signature": { + "type": "string", + "format": "byte", + "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." + }, + "extension": { + "type": "string", + "format": "byte", + "description": "Vote extension provided by the application. Only valid for precommit\nmessages." + }, + "extension_signature": { + "type": "string", + "format": "byte", + "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + } }, - "vote_b": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals", - "default": "SIGNED_MSG_TYPE_UNKNOWN", - "enum": [ - "SIGNED_MSG_TYPE_UNKNOWN", - "SIGNED_MSG_TYPE_PREVOTE", - "SIGNED_MSG_TYPE_PRECOMMIT", - "SIGNED_MSG_TYPE_PROPOSAL" - ] - }, - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } + "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + }, + "vote_b": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "SIGNED_MSG_TYPE_UNKNOWN", + "SIGNED_MSG_TYPE_PREVOTE", + "SIGNED_MSG_TYPE_PRECOMMIT", + "SIGNED_MSG_TYPE_PROPOSAL" + ], + "default": "SIGNED_MSG_TYPE_UNKNOWN", + "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals" + }, + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" } - } + }, + "title": "PartsetHeader" } }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validator_index": { - "type": "integer", - "format": "int32" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block.", - "format": "byte" - }, - "extension": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages.", - "format": "byte" - }, - "extension_signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages.", - "format": "byte" - } + "title": "BlockID" }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." - }, - "total_voting_power": { - "type": "string", - "format": "int64" - }, - "validator_power": { - "type": "string", - "format": "int64" + "timestamp": { + "type": "string", + "format": "date-time" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "validator_index": { + "type": "integer", + "format": "int32" + }, + "signature": { + "type": "string", + "format": "byte", + "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." + }, + "extension": { + "type": "string", + "format": "byte", + "description": "Vote extension provided by the application. Only valid for precommit\nmessages." + }, + "extension_signature": { + "type": "string", + "format": "byte", + "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + } }, - "timestamp": { - "type": "string", - "format": "date-time" - } + "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + }, + "total_voting_power": { + "type": "string", + "format": "int64" }, - "description": "DuplicateVoteEvidence contains evidence of a validator signed two conflicting votes." + "validator_power": { + "type": "string", + "format": "int64" + }, + "timestamp": { + "type": "string", + "format": "date-time" + } }, - "light_client_attack_evidence": { - "type": "object", - "properties": { - "conflicting_block": { - "type": "object", - "properties": { - "signed_header": { - "type": "object", - "properties": { - "header": { - "type": "object", - "properties": { - "version": { - "title": "basic block info", - "type": "object", - "properties": { - "block": { - "type": "string", - "format": "uint64" - }, - "app": { - "type": "string", - "format": "uint64" - } + "description": "DuplicateVoteEvidence contains evidence of a validator signed two conflicting votes." + }, + "light_client_attack_evidence": { + "type": "object", + "properties": { + "conflicting_block": { + "type": "object", + "properties": { + "signed_header": { + "type": "object", + "properties": { + "header": { + "type": "object", + "properties": { + "version": { + "title": "basic block info", + "type": "object", + "properties": { + "block": { + "type": "string", + "format": "uint64" }, - "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." - }, - "chain_id": { - "type": "string" - }, - "height": { - "type": "string", - "format": "int64" - }, - "time": { - "type": "string", - "format": "date-time" - }, - "last_block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } + "app": { + "type": "string", + "format": "uint64" } }, - "last_commit_hash": { - "title": "hashes of block data", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "data_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validators_hash": { - "title": "hashes from the app output from the prev block", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "next_validators_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "consensus_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "app_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "last_results_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "evidence_hash": { - "title": "consensus info", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proposer_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } + "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." }, - "description": "Header defines the structure of a block header." - }, - "commit": { - "type": "object", - "properties": { - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "signatures": { - "type": "array", - "items": { + "chain_id": { + "type": "string" + }, + "height": { + "type": "string", + "format": "int64" + }, + "time": { + "type": "string", + "format": "date-time" + }, + "last_block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { "type": "object", "properties": { - "block_id_flag": { - "title": "BlockIdFlag indicates which BlockID the signature is for", - "type": "string", - "default": "BLOCK_ID_FLAG_UNKNOWN", - "enum": [ - "BLOCK_ID_FLAG_UNKNOWN", - "BLOCK_ID_FLAG_ABSENT", - "BLOCK_ID_FLAG_COMMIT", - "BLOCK_ID_FLAG_NIL" - ] - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "timestamp": { - "type": "string", - "format": "date-time" + "total": { + "type": "integer", + "format": "int64" }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "hash": { "type": "string", "format": "byte" } }, - "description": "CommitSig is a part of the Vote included in a Commit." + "title": "PartsetHeader" } - } + }, + "title": "BlockID" + }, + "last_commit_hash": { + "type": "string", + "format": "byte", + "title": "hashes of block data" + }, + "data_hash": { + "type": "string", + "format": "byte" + }, + "validators_hash": { + "type": "string", + "format": "byte", + "title": "hashes from the app output from the prev block" + }, + "next_validators_hash": { + "type": "string", + "format": "byte" + }, + "consensus_hash": { + "type": "string", + "format": "byte" + }, + "app_hash": { + "type": "string", + "format": "byte" + }, + "last_results_hash": { + "type": "string", + "format": "byte" + }, + "evidence_hash": { + "type": "string", + "format": "byte", + "title": "consensus info" + }, + "proposer_address": { + "type": "string", + "format": "byte" + } + }, + "description": "Header defines the structure of a block header." + }, + "commit": { + "type": "object", + "properties": { + "height": { + "type": "string", + "format": "int64" }, - "description": "Commit contains the evidence that a block was committed by a set of validators." - } - } - }, - "validator_set": { - "type": "object", - "properties": { - "validators": { - "type": "array", - "items": { + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { "type": "object", "properties": { - "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "hash": { "type": "string", "format": "byte" }, - "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", + "part_set_header": { "type": "object", "properties": { - "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" + "total": { + "type": "integer", + "format": "int64" }, - "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "hash": { "type": "string", "format": "byte" } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "signatures": { + "type": "array", + "items": { + "type": "object", + "properties": { + "block_id_flag": { + "type": "string", + "enum": [ + "BLOCK_ID_FLAG_UNKNOWN", + "BLOCK_ID_FLAG_ABSENT", + "BLOCK_ID_FLAG_COMMIT", + "BLOCK_ID_FLAG_NIL" + ], + "default": "BLOCK_ID_FLAG_UNKNOWN", + "title": "BlockIdFlag indicates which BlockID the signature is for" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "signature": { + "type": "string", + "format": "byte" } }, - "voting_power": { - "type": "string", - "format": "int64" - }, - "proposer_priority": { - "type": "string", - "format": "int64" - } + "description": "CommitSig is a part of the Vote included in a Commit." } } }, - "proposer": { + "description": "Commit contains the evidence that a block was committed by a set of validators." + } + } + }, + "validator_set": { + "type": "object", + "properties": { + "validators": { + "type": "array", + "items": { "type": "object", "properties": { "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "format": "byte" }, "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", "type": "object", "properties": { "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "format": "byte" }, "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "format": "byte" } - } + }, + "title": "PublicKey defines the keys available for use with Validators" }, "voting_power": { "type": "string", @@ -42979,716 +39107,665 @@ "format": "int64" } } - }, - "total_voting_power": { - "type": "string", - "format": "int64" } - } - } - } - }, - "common_height": { - "type": "string", - "format": "int64" - }, - "byzantine_validators": { - "type": "array", - "items": { - "type": "object", - "properties": { - "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" }, - "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", + "proposer": { "type": "object", "properties": { - "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "address": { "type": "string", "format": "byte" }, - "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "pub_key": { + "type": "object", + "properties": { + "ed25519": { + "type": "string", + "format": "byte" + }, + "secp256k1": { + "type": "string", + "format": "byte" + } + }, + "title": "PublicKey defines the keys available for use with Validators" + }, + "voting_power": { "type": "string", - "format": "byte" + "format": "int64" + }, + "proposer_priority": { + "type": "string", + "format": "int64" } } }, - "voting_power": { - "type": "string", - "format": "int64" - }, - "proposer_priority": { + "total_voting_power": { "type": "string", "format": "int64" } } } - }, - "total_voting_power": { - "type": "string", - "format": "int64" - }, - "timestamp": { - "type": "string", - "format": "date-time" } }, - "description": "LightClientAttackEvidence contains evidence of a set of validators attempting to mislead a light client." - } - } - } - } - } - }, - "last_commit": { - "type": "object", - "properties": { - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", + "common_height": { + "type": "string", "format": "int64" }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "byzantine_validators": { + "type": "array", + "items": { + "type": "object", + "properties": { + "address": { + "type": "string", + "format": "byte" + }, + "pub_key": { + "type": "object", + "properties": { + "ed25519": { + "type": "string", + "format": "byte" + }, + "secp256k1": { + "type": "string", + "format": "byte" + } + }, + "title": "PublicKey defines the keys available for use with Validators" + }, + "voting_power": { + "type": "string", + "format": "int64" + }, + "proposer_priority": { + "type": "string", + "format": "int64" + } + } + } + }, + "total_voting_power": { "type": "string", - "format": "byte" + "format": "int64" + }, + "timestamp": { + "type": "string", + "format": "date-time" } - } + }, + "description": "LightClientAttackEvidence contains evidence of a set of validators attempting to mislead a light client." } } - }, - "signatures": { - "type": "array", - "items": { + } + } + } + }, + "last_commit": { + "type": "object", + "properties": { + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { "type": "object", "properties": { - "block_id_flag": { - "title": "BlockIdFlag indicates which BlockID the signature is for", - "type": "string", - "default": "BLOCK_ID_FLAG_UNKNOWN", - "enum": [ - "BLOCK_ID_FLAG_UNKNOWN", - "BLOCK_ID_FLAG_ABSENT", - "BLOCK_ID_FLAG_COMMIT", - "BLOCK_ID_FLAG_NIL" - ] - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "timestamp": { - "type": "string", - "format": "date-time" + "total": { + "type": "integer", + "format": "int64" }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "hash": { "type": "string", "format": "byte" } }, - "description": "CommitSig is a part of the Vote included in a Commit." + "title": "PartsetHeader" } - } + }, + "title": "BlockID" }, - "description": "Commit contains the evidence that a block was committed by a set of validators." - } - } - }, - "sdk_block": { - "title": "Since: cosmos-sdk 0.47", - "type": "object", - "properties": { - "header": { - "type": "object", - "properties": { - "version": { - "title": "basic block info", + "signatures": { + "type": "array", + "items": { "type": "object", "properties": { - "block": { + "block_id_flag": { "type": "string", - "format": "uint64" + "enum": [ + "BLOCK_ID_FLAG_UNKNOWN", + "BLOCK_ID_FLAG_ABSENT", + "BLOCK_ID_FLAG_COMMIT", + "BLOCK_ID_FLAG_NIL" + ], + "default": "BLOCK_ID_FLAG_UNKNOWN", + "title": "BlockIdFlag indicates which BlockID the signature is for" }, - "app": { - "type": "string", - "format": "uint64" - } - }, - "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." - }, - "chain_id": { - "type": "string" - }, - "height": { - "type": "string", - "format": "int64" - }, - "time": { - "type": "string", - "format": "date-time" - }, - "last_block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "validator_address": { "type": "string", "format": "byte" }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "timestamp": { + "type": "string", + "format": "date-time" + }, + "signature": { + "type": "string", + "format": "byte" } + }, + "description": "CommitSig is a part of the Vote included in a Commit." + } + } + }, + "description": "Commit contains the evidence that a block was committed by a set of validators." + } + } + }, + "sdk_block": { + "title": "Since: cosmos-sdk 0.47", + "type": "object", + "properties": { + "header": { + "type": "object", + "properties": { + "version": { + "title": "basic block info", + "type": "object", + "properties": { + "block": { + "type": "string", + "format": "uint64" + }, + "app": { + "type": "string", + "format": "uint64" } }, - "last_commit_hash": { - "title": "hashes of block data", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "data_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validators_hash": { - "title": "hashes from the app output from the prev block", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "next_validators_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "consensus_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "app_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "last_results_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "evidence_hash": { - "title": "consensus info", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proposer_address": { - "type": "string", - "description": "proposer_address is the original block proposer address, formatted as a Bech32 string.\nIn Tendermint, this type is `bytes`, but in the SDK, we convert it to a Bech32 string\nfor better UX." - } + "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." }, - "description": "Header defines the structure of a Tendermint block header." - }, - "data": { - "title": "Data contains the set of transactions included in the block", - "type": "object", - "properties": { - "txs": { - "type": "array", - "description": "Txs that will be applied by state @ block.Height+1.\nNOTE: not all txs here are valid. We're just agreeing on the order first.\nThis means that block.AppHash does not include these txs.", - "items": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "chain_id": { + "type": "string" + }, + "height": { + "type": "string", + "format": "int64" + }, + "time": { + "type": "string", + "format": "date-time" + }, + "last_block_id": { + "type": "object", + "properties": { + "hash": { "type": "string", "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" } - } + }, + "title": "BlockID" + }, + "last_commit_hash": { + "type": "string", + "format": "byte", + "title": "hashes of block data" + }, + "data_hash": { + "type": "string", + "format": "byte" + }, + "validators_hash": { + "type": "string", + "format": "byte", + "title": "hashes from the app output from the prev block" + }, + "next_validators_hash": { + "type": "string", + "format": "byte" + }, + "consensus_hash": { + "type": "string", + "format": "byte" + }, + "app_hash": { + "type": "string", + "format": "byte" + }, + "last_results_hash": { + "type": "string", + "format": "byte" + }, + "evidence_hash": { + "type": "string", + "format": "byte", + "title": "consensus info" + }, + "proposer_address": { + "type": "string", + "description": "proposer_address is the original block proposer address, formatted as a Bech32 string.\nIn Tendermint, this type is `bytes`, but in the SDK, we convert it to a Bech32 string\nfor better UX." } }, - "evidence": { - "type": "object", - "properties": { - "evidence": { - "type": "array", - "items": { - "type": "object", - "properties": { - "duplicate_vote_evidence": { - "type": "object", - "properties": { - "vote_a": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals", - "default": "SIGNED_MSG_TYPE_UNKNOWN", - "enum": [ - "SIGNED_MSG_TYPE_UNKNOWN", - "SIGNED_MSG_TYPE_PREVOTE", - "SIGNED_MSG_TYPE_PRECOMMIT", - "SIGNED_MSG_TYPE_PROPOSAL" - ] - }, - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } + "description": "Header defines the structure of a Tendermint block header." + }, + "data": { + "type": "object", + "properties": { + "txs": { + "type": "array", + "items": { + "type": "string", + "format": "byte" + }, + "description": "Txs that will be applied by state @ block.Height+1.\nNOTE: not all txs here are valid. We're just agreeing on the order first.\nThis means that block.AppHash does not include these txs." + } + }, + "title": "Data contains the set of transactions included in the block" + }, + "evidence": { + "type": "object", + "properties": { + "evidence": { + "type": "array", + "items": { + "type": "object", + "properties": { + "duplicate_vote_evidence": { + "type": "object", + "properties": { + "vote_a": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "SIGNED_MSG_TYPE_UNKNOWN", + "SIGNED_MSG_TYPE_PREVOTE", + "SIGNED_MSG_TYPE_PRECOMMIT", + "SIGNED_MSG_TYPE_PROPOSAL" + ], + "default": "SIGNED_MSG_TYPE_UNKNOWN", + "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals" + }, + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" } - } + }, + "title": "PartsetHeader" } }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validator_index": { - "type": "integer", - "format": "int32" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block.", - "format": "byte" - }, - "extension": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages.", - "format": "byte" - }, - "extension_signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages.", - "format": "byte" - } + "title": "BlockID" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "validator_index": { + "type": "integer", + "format": "int32" + }, + "signature": { + "type": "string", + "format": "byte", + "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." + }, + "extension": { + "type": "string", + "format": "byte", + "description": "Vote extension provided by the application. Only valid for precommit\nmessages." }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + "extension_signature": { + "type": "string", + "format": "byte", + "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + } }, - "vote_b": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals", - "default": "SIGNED_MSG_TYPE_UNKNOWN", - "enum": [ - "SIGNED_MSG_TYPE_UNKNOWN", - "SIGNED_MSG_TYPE_PREVOTE", - "SIGNED_MSG_TYPE_PRECOMMIT", - "SIGNED_MSG_TYPE_PROPOSAL" - ] - }, - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } + "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + }, + "vote_b": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "SIGNED_MSG_TYPE_UNKNOWN", + "SIGNED_MSG_TYPE_PREVOTE", + "SIGNED_MSG_TYPE_PRECOMMIT", + "SIGNED_MSG_TYPE_PROPOSAL" + ], + "default": "SIGNED_MSG_TYPE_UNKNOWN", + "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals" + }, + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" } - } + }, + "title": "PartsetHeader" } }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validator_index": { - "type": "integer", - "format": "int32" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block.", - "format": "byte" - }, - "extension": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages.", - "format": "byte" - }, - "extension_signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages.", - "format": "byte" - } + "title": "BlockID" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "validator_address": { + "type": "string", + "format": "byte" }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." - }, - "total_voting_power": { - "type": "string", - "format": "int64" - }, - "validator_power": { - "type": "string", - "format": "int64" + "validator_index": { + "type": "integer", + "format": "int32" + }, + "signature": { + "type": "string", + "format": "byte", + "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." + }, + "extension": { + "type": "string", + "format": "byte", + "description": "Vote extension provided by the application. Only valid for precommit\nmessages." + }, + "extension_signature": { + "type": "string", + "format": "byte", + "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + } }, - "timestamp": { - "type": "string", - "format": "date-time" - } + "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + }, + "total_voting_power": { + "type": "string", + "format": "int64" + }, + "validator_power": { + "type": "string", + "format": "int64" }, - "description": "DuplicateVoteEvidence contains evidence of a validator signed two conflicting votes." + "timestamp": { + "type": "string", + "format": "date-time" + } }, - "light_client_attack_evidence": { - "type": "object", - "properties": { - "conflicting_block": { - "type": "object", - "properties": { - "signed_header": { - "type": "object", - "properties": { - "header": { - "type": "object", - "properties": { - "version": { - "title": "basic block info", - "type": "object", - "properties": { - "block": { - "type": "string", - "format": "uint64" - }, - "app": { - "type": "string", - "format": "uint64" - } + "description": "DuplicateVoteEvidence contains evidence of a validator signed two conflicting votes." + }, + "light_client_attack_evidence": { + "type": "object", + "properties": { + "conflicting_block": { + "type": "object", + "properties": { + "signed_header": { + "type": "object", + "properties": { + "header": { + "type": "object", + "properties": { + "version": { + "title": "basic block info", + "type": "object", + "properties": { + "block": { + "type": "string", + "format": "uint64" }, - "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." - }, - "chain_id": { - "type": "string" - }, - "height": { - "type": "string", - "format": "int64" - }, - "time": { - "type": "string", - "format": "date-time" - }, - "last_block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } + "app": { + "type": "string", + "format": "uint64" } }, - "last_commit_hash": { - "title": "hashes of block data", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "data_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validators_hash": { - "title": "hashes from the app output from the prev block", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "next_validators_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "consensus_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "app_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "last_results_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "evidence_hash": { - "title": "consensus info", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proposer_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } + "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." }, - "description": "Header defines the structure of a block header." - }, - "commit": { - "type": "object", - "properties": { - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "signatures": { - "type": "array", - "items": { + "chain_id": { + "type": "string" + }, + "height": { + "type": "string", + "format": "int64" + }, + "time": { + "type": "string", + "format": "date-time" + }, + "last_block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { "type": "object", "properties": { - "block_id_flag": { - "title": "BlockIdFlag indicates which BlockID the signature is for", - "type": "string", - "default": "BLOCK_ID_FLAG_UNKNOWN", - "enum": [ - "BLOCK_ID_FLAG_UNKNOWN", - "BLOCK_ID_FLAG_ABSENT", - "BLOCK_ID_FLAG_COMMIT", - "BLOCK_ID_FLAG_NIL" - ] - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "timestamp": { - "type": "string", - "format": "date-time" + "total": { + "type": "integer", + "format": "int64" }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "hash": { "type": "string", "format": "byte" } }, - "description": "CommitSig is a part of the Vote included in a Commit." + "title": "PartsetHeader" } - } + }, + "title": "BlockID" }, - "description": "Commit contains the evidence that a block was committed by a set of validators." - } - } - }, - "validator_set": { - "type": "object", - "properties": { - "validators": { - "type": "array", - "items": { + "last_commit_hash": { + "type": "string", + "format": "byte", + "title": "hashes of block data" + }, + "data_hash": { + "type": "string", + "format": "byte" + }, + "validators_hash": { + "type": "string", + "format": "byte", + "title": "hashes from the app output from the prev block" + }, + "next_validators_hash": { + "type": "string", + "format": "byte" + }, + "consensus_hash": { + "type": "string", + "format": "byte" + }, + "app_hash": { + "type": "string", + "format": "byte" + }, + "last_results_hash": { + "type": "string", + "format": "byte" + }, + "evidence_hash": { + "type": "string", + "format": "byte", + "title": "consensus info" + }, + "proposer_address": { + "type": "string", + "format": "byte" + } + }, + "description": "Header defines the structure of a block header." + }, + "commit": { + "type": "object", + "properties": { + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { "type": "object", "properties": { - "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "hash": { "type": "string", "format": "byte" }, - "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", + "part_set_header": { "type": "object", "properties": { - "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" + "total": { + "type": "integer", + "format": "int64" }, - "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "hash": { "type": "string", "format": "byte" } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "signatures": { + "type": "array", + "items": { + "type": "object", + "properties": { + "block_id_flag": { + "type": "string", + "enum": [ + "BLOCK_ID_FLAG_UNKNOWN", + "BLOCK_ID_FLAG_ABSENT", + "BLOCK_ID_FLAG_COMMIT", + "BLOCK_ID_FLAG_NIL" + ], + "default": "BLOCK_ID_FLAG_UNKNOWN", + "title": "BlockIdFlag indicates which BlockID the signature is for" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "signature": { + "type": "string", + "format": "byte" } }, - "voting_power": { - "type": "string", - "format": "int64" - }, - "proposer_priority": { - "type": "string", - "format": "int64" - } + "description": "CommitSig is a part of the Vote included in a Commit." } } }, - "proposer": { + "description": "Commit contains the evidence that a block was committed by a set of validators." + } + } + }, + "validator_set": { + "type": "object", + "properties": { + "validators": { + "type": "array", + "items": { "type": "object", "properties": { "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "format": "byte" }, "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", "type": "object", "properties": { "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "format": "byte" }, "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "format": "byte" } - } + }, + "title": "PublicKey defines the keys available for use with Validators" }, "voting_power": { "type": "string", @@ -43699,750 +39776,696 @@ "format": "int64" } } - }, - "total_voting_power": { - "type": "string", - "format": "int64" } - } - } - } - }, - "common_height": { - "type": "string", - "format": "int64" - }, - "byzantine_validators": { - "type": "array", - "items": { - "type": "object", - "properties": { - "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" }, - "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", + "proposer": { "type": "object", "properties": { - "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "address": { + "type": "string", + "format": "byte" + }, + "pub_key": { + "type": "object", + "properties": { + "ed25519": { + "type": "string", + "format": "byte" + }, + "secp256k1": { + "type": "string", + "format": "byte" + } + }, + "title": "PublicKey defines the keys available for use with Validators" + }, + "voting_power": { "type": "string", - "format": "byte" + "format": "int64" }, - "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "proposer_priority": { "type": "string", - "format": "byte" + "format": "int64" } } }, - "voting_power": { - "type": "string", - "format": "int64" - }, - "proposer_priority": { + "total_voting_power": { "type": "string", "format": "int64" } } } - }, - "total_voting_power": { - "type": "string", - "format": "int64" - }, - "timestamp": { - "type": "string", - "format": "date-time" } }, - "description": "LightClientAttackEvidence contains evidence of a set of validators attempting to mislead a light client." - } - } - } - } - } - }, - "last_commit": { - "type": "object", - "properties": { - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", + "common_height": { + "type": "string", "format": "int64" }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "byzantine_validators": { + "type": "array", + "items": { + "type": "object", + "properties": { + "address": { + "type": "string", + "format": "byte" + }, + "pub_key": { + "type": "object", + "properties": { + "ed25519": { + "type": "string", + "format": "byte" + }, + "secp256k1": { + "type": "string", + "format": "byte" + } + }, + "title": "PublicKey defines the keys available for use with Validators" + }, + "voting_power": { + "type": "string", + "format": "int64" + }, + "proposer_priority": { + "type": "string", + "format": "int64" + } + } + } + }, + "total_voting_power": { "type": "string", - "format": "byte" + "format": "int64" + }, + "timestamp": { + "type": "string", + "format": "date-time" } - } + }, + "description": "LightClientAttackEvidence contains evidence of a set of validators attempting to mislead a light client." } } - }, - "signatures": { - "type": "array", - "items": { + } + } + } + }, + "last_commit": { + "type": "object", + "properties": { + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { "type": "object", "properties": { - "block_id_flag": { - "title": "BlockIdFlag indicates which BlockID the signature is for", - "type": "string", - "default": "BLOCK_ID_FLAG_UNKNOWN", - "enum": [ - "BLOCK_ID_FLAG_UNKNOWN", - "BLOCK_ID_FLAG_ABSENT", - "BLOCK_ID_FLAG_COMMIT", - "BLOCK_ID_FLAG_NIL" - ] - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "timestamp": { - "type": "string", - "format": "date-time" + "total": { + "type": "integer", + "format": "int64" }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "hash": { "type": "string", "format": "byte" } }, - "description": "CommitSig is a part of the Vote included in a Commit." + "title": "PartsetHeader" } - } - }, - "description": "Commit contains the evidence that a block was committed by a set of validators." - } - }, - "description": "Block is tendermint type Block, with the Header proposer address\nfield converted to bech32 string." - } - }, - "description": "GetBlockByHeightResponse is the response type for the Query/GetBlockByHeight RPC method." - }, - "cosmos.base.tendermint.v1beta1.GetLatestBlockResponse": { - "type": "object", - "properties": { - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "block": { - "title": "Deprecated: please use `sdk_block` instead", - "type": "object", - "properties": { - "header": { - "type": "object", - "properties": { - "version": { - "title": "basic block info", + "title": "BlockID" + }, + "signatures": { + "type": "array", + "items": { "type": "object", "properties": { - "block": { + "block_id_flag": { "type": "string", - "format": "uint64" + "enum": [ + "BLOCK_ID_FLAG_UNKNOWN", + "BLOCK_ID_FLAG_ABSENT", + "BLOCK_ID_FLAG_COMMIT", + "BLOCK_ID_FLAG_NIL" + ], + "default": "BLOCK_ID_FLAG_UNKNOWN", + "title": "BlockIdFlag indicates which BlockID the signature is for" }, - "app": { - "type": "string", - "format": "uint64" - } - }, - "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." - }, - "chain_id": { - "type": "string" - }, - "height": { - "type": "string", - "format": "int64" - }, - "time": { - "type": "string", - "format": "date-time" - }, - "last_block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "validator_address": { "type": "string", "format": "byte" }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "timestamp": { + "type": "string", + "format": "date-time" + }, + "signature": { + "type": "string", + "format": "byte" } + }, + "description": "CommitSig is a part of the Vote included in a Commit." + } + } + }, + "description": "Commit contains the evidence that a block was committed by a set of validators." + } + }, + "description": "Block is tendermint type Block, with the Header proposer address\nfield converted to bech32 string." + } + }, + "description": "GetBlockByHeightResponse is the response type for the Query/GetBlockByHeight RPC method." + }, + "cosmos.base.tendermint.v1beta1.GetLatestBlockResponse": { + "type": "object", + "properties": { + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "block": { + "title": "Deprecated: please use `sdk_block` instead", + "type": "object", + "properties": { + "header": { + "type": "object", + "properties": { + "version": { + "title": "basic block info", + "type": "object", + "properties": { + "block": { + "type": "string", + "format": "uint64" + }, + "app": { + "type": "string", + "format": "uint64" } }, - "last_commit_hash": { - "title": "hashes of block data", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "data_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validators_hash": { - "title": "hashes from the app output from the prev block", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "next_validators_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "consensus_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "app_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "last_results_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" + "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." + }, + "chain_id": { + "type": "string" + }, + "height": { + "type": "string", + "format": "int64" + }, + "time": { + "type": "string", + "format": "date-time" + }, + "last_block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } }, - "evidence_hash": { - "title": "consensus info", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "title": "BlockID" + }, + "last_commit_hash": { + "type": "string", + "format": "byte", + "title": "hashes of block data" + }, + "data_hash": { + "type": "string", + "format": "byte" + }, + "validators_hash": { + "type": "string", + "format": "byte", + "title": "hashes from the app output from the prev block" + }, + "next_validators_hash": { + "type": "string", + "format": "byte" + }, + "consensus_hash": { + "type": "string", + "format": "byte" + }, + "app_hash": { + "type": "string", + "format": "byte" + }, + "last_results_hash": { + "type": "string", + "format": "byte" + }, + "evidence_hash": { + "type": "string", + "format": "byte", + "title": "consensus info" + }, + "proposer_address": { + "type": "string", + "format": "byte" + } + }, + "description": "Header defines the structure of a block header." + }, + "data": { + "type": "object", + "properties": { + "txs": { + "type": "array", + "items": { "type": "string", "format": "byte" }, - "proposer_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "Header defines the structure of a block header." - }, - "data": { - "title": "Data contains the set of transactions included in the block", - "type": "object", - "properties": { - "txs": { - "type": "array", - "description": "Txs that will be applied by state @ block.Height+1.\nNOTE: not all txs here are valid. We're just agreeing on the order first.\nThis means that block.AppHash does not include these txs.", - "items": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "description": "Txs that will be applied by state @ block.Height+1.\nNOTE: not all txs here are valid. We're just agreeing on the order first.\nThis means that block.AppHash does not include these txs." } }, - "evidence": { - "type": "object", - "properties": { - "evidence": { - "type": "array", - "items": { - "type": "object", - "properties": { - "duplicate_vote_evidence": { - "type": "object", - "properties": { - "vote_a": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals", - "default": "SIGNED_MSG_TYPE_UNKNOWN", - "enum": [ - "SIGNED_MSG_TYPE_UNKNOWN", - "SIGNED_MSG_TYPE_PREVOTE", - "SIGNED_MSG_TYPE_PRECOMMIT", - "SIGNED_MSG_TYPE_PROPOSAL" - ] - }, - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validator_index": { - "type": "integer", - "format": "int32" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block.", - "format": "byte" - }, - "extension": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages.", - "format": "byte" - }, - "extension_signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages.", - "format": "byte" - } + "title": "Data contains the set of transactions included in the block" + }, + "evidence": { + "type": "object", + "properties": { + "evidence": { + "type": "array", + "items": { + "type": "object", + "properties": { + "duplicate_vote_evidence": { + "type": "object", + "properties": { + "vote_a": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "SIGNED_MSG_TYPE_UNKNOWN", + "SIGNED_MSG_TYPE_PREVOTE", + "SIGNED_MSG_TYPE_PRECOMMIT", + "SIGNED_MSG_TYPE_PROPOSAL" + ], + "default": "SIGNED_MSG_TYPE_UNKNOWN", + "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals" }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." - }, - "vote_b": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals", - "default": "SIGNED_MSG_TYPE_UNKNOWN", - "enum": [ - "SIGNED_MSG_TYPE_UNKNOWN", - "SIGNED_MSG_TYPE_PREVOTE", - "SIGNED_MSG_TYPE_PRECOMMIT", - "SIGNED_MSG_TYPE_PROPOSAL" - ] - }, - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" } - } + }, + "title": "PartsetHeader" } }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validator_index": { - "type": "integer", - "format": "int32" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block.", - "format": "byte" - }, - "extension": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages.", - "format": "byte" - }, - "extension_signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages.", - "format": "byte" - } + "title": "BlockID" }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." - }, - "total_voting_power": { - "type": "string", - "format": "int64" - }, - "validator_power": { - "type": "string", - "format": "int64" - }, - "timestamp": { - "type": "string", - "format": "date-time" - } - }, - "description": "DuplicateVoteEvidence contains evidence of a validator signed two conflicting votes." - }, - "light_client_attack_evidence": { - "type": "object", - "properties": { - "conflicting_block": { - "type": "object", - "properties": { - "signed_header": { - "type": "object", - "properties": { - "header": { - "type": "object", - "properties": { - "version": { - "title": "basic block info", - "type": "object", - "properties": { - "block": { - "type": "string", - "format": "uint64" - }, - "app": { - "type": "string", - "format": "uint64" - } - }, - "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." - }, - "chain_id": { - "type": "string" - }, - "height": { - "type": "string", - "format": "int64" - }, - "time": { - "type": "string", - "format": "date-time" - }, - "last_block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "last_commit_hash": { - "title": "hashes of block data", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "data_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validators_hash": { - "title": "hashes from the app output from the prev block", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "next_validators_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "consensus_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "app_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "last_results_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "evidence_hash": { - "title": "consensus info", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proposer_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } + "timestamp": { + "type": "string", + "format": "date-time" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "validator_index": { + "type": "integer", + "format": "int32" + }, + "signature": { + "type": "string", + "format": "byte", + "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." + }, + "extension": { + "type": "string", + "format": "byte", + "description": "Vote extension provided by the application. Only valid for precommit\nmessages." + }, + "extension_signature": { + "type": "string", + "format": "byte", + "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + } + }, + "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + }, + "vote_b": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "SIGNED_MSG_TYPE_UNKNOWN", + "SIGNED_MSG_TYPE_PREVOTE", + "SIGNED_MSG_TYPE_PRECOMMIT", + "SIGNED_MSG_TYPE_PROPOSAL" + ], + "default": "SIGNED_MSG_TYPE_UNKNOWN", + "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals" + }, + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" }, - "description": "Header defines the structure of a block header." + "hash": { + "type": "string", + "format": "byte" + } }, - "commit": { - "type": "object", - "properties": { - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "validator_index": { + "type": "integer", + "format": "int32" + }, + "signature": { + "type": "string", + "format": "byte", + "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." + }, + "extension": { + "type": "string", + "format": "byte", + "description": "Vote extension provided by the application. Only valid for precommit\nmessages." + }, + "extension_signature": { + "type": "string", + "format": "byte", + "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + } + }, + "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + }, + "total_voting_power": { + "type": "string", + "format": "int64" + }, + "validator_power": { + "type": "string", + "format": "int64" + }, + "timestamp": { + "type": "string", + "format": "date-time" + } + }, + "description": "DuplicateVoteEvidence contains evidence of a validator signed two conflicting votes." + }, + "light_client_attack_evidence": { + "type": "object", + "properties": { + "conflicting_block": { + "type": "object", + "properties": { + "signed_header": { + "type": "object", + "properties": { + "header": { + "type": "object", + "properties": { + "version": { + "title": "basic block info", + "type": "object", + "properties": { + "block": { + "type": "string", + "format": "uint64" + }, + "app": { + "type": "string", + "format": "uint64" } }, - "signatures": { - "type": "array", - "items": { + "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." + }, + "chain_id": { + "type": "string" + }, + "height": { + "type": "string", + "format": "int64" + }, + "time": { + "type": "string", + "format": "date-time" + }, + "last_block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { "type": "object", "properties": { - "block_id_flag": { - "title": "BlockIdFlag indicates which BlockID the signature is for", - "type": "string", - "default": "BLOCK_ID_FLAG_UNKNOWN", - "enum": [ - "BLOCK_ID_FLAG_UNKNOWN", - "BLOCK_ID_FLAG_ABSENT", - "BLOCK_ID_FLAG_COMMIT", - "BLOCK_ID_FLAG_NIL" - ] - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "timestamp": { - "type": "string", - "format": "date-time" + "total": { + "type": "integer", + "format": "int64" }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "hash": { "type": "string", "format": "byte" } }, - "description": "CommitSig is a part of the Vote included in a Commit." + "title": "PartsetHeader" } - } + }, + "title": "BlockID" }, - "description": "Commit contains the evidence that a block was committed by a set of validators." - } - } - }, - "validator_set": { - "type": "object", - "properties": { - "validators": { - "type": "array", - "items": { + "last_commit_hash": { + "type": "string", + "format": "byte", + "title": "hashes of block data" + }, + "data_hash": { + "type": "string", + "format": "byte" + }, + "validators_hash": { + "type": "string", + "format": "byte", + "title": "hashes from the app output from the prev block" + }, + "next_validators_hash": { + "type": "string", + "format": "byte" + }, + "consensus_hash": { + "type": "string", + "format": "byte" + }, + "app_hash": { + "type": "string", + "format": "byte" + }, + "last_results_hash": { + "type": "string", + "format": "byte" + }, + "evidence_hash": { + "type": "string", + "format": "byte", + "title": "consensus info" + }, + "proposer_address": { + "type": "string", + "format": "byte" + } + }, + "description": "Header defines the structure of a block header." + }, + "commit": { + "type": "object", + "properties": { + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { "type": "object", "properties": { - "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "hash": { "type": "string", "format": "byte" }, - "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", + "part_set_header": { "type": "object", "properties": { - "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" + "total": { + "type": "integer", + "format": "int64" }, - "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "hash": { "type": "string", "format": "byte" } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "signatures": { + "type": "array", + "items": { + "type": "object", + "properties": { + "block_id_flag": { + "type": "string", + "enum": [ + "BLOCK_ID_FLAG_UNKNOWN", + "BLOCK_ID_FLAG_ABSENT", + "BLOCK_ID_FLAG_COMMIT", + "BLOCK_ID_FLAG_NIL" + ], + "default": "BLOCK_ID_FLAG_UNKNOWN", + "title": "BlockIdFlag indicates which BlockID the signature is for" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "signature": { + "type": "string", + "format": "byte" } }, - "voting_power": { - "type": "string", - "format": "int64" - }, - "proposer_priority": { - "type": "string", - "format": "int64" - } + "description": "CommitSig is a part of the Vote included in a Commit." } } }, - "proposer": { + "description": "Commit contains the evidence that a block was committed by a set of validators." + } + } + }, + "validator_set": { + "type": "object", + "properties": { + "validators": { + "type": "array", + "items": { "type": "object", "properties": { "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "format": "byte" }, "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", "type": "object", "properties": { "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "format": "byte" }, "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "format": "byte" } - } + }, + "title": "PublicKey defines the keys available for use with Validators" }, "voting_power": { "type": "string", @@ -44453,716 +40476,665 @@ "format": "int64" } } - }, - "total_voting_power": { - "type": "string", - "format": "int64" } - } - } - } - }, - "common_height": { - "type": "string", - "format": "int64" - }, - "byzantine_validators": { - "type": "array", - "items": { - "type": "object", - "properties": { - "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" }, - "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", + "proposer": { "type": "object", "properties": { - "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "address": { "type": "string", "format": "byte" }, - "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "pub_key": { + "type": "object", + "properties": { + "ed25519": { + "type": "string", + "format": "byte" + }, + "secp256k1": { + "type": "string", + "format": "byte" + } + }, + "title": "PublicKey defines the keys available for use with Validators" + }, + "voting_power": { "type": "string", - "format": "byte" + "format": "int64" + }, + "proposer_priority": { + "type": "string", + "format": "int64" } } }, - "voting_power": { - "type": "string", - "format": "int64" - }, - "proposer_priority": { - "type": "string", - "format": "int64" - } + "total_voting_power": { + "type": "string", + "format": "int64" + } + } + } + } + }, + "common_height": { + "type": "string", + "format": "int64" + }, + "byzantine_validators": { + "type": "array", + "items": { + "type": "object", + "properties": { + "address": { + "type": "string", + "format": "byte" + }, + "pub_key": { + "type": "object", + "properties": { + "ed25519": { + "type": "string", + "format": "byte" + }, + "secp256k1": { + "type": "string", + "format": "byte" + } + }, + "title": "PublicKey defines the keys available for use with Validators" + }, + "voting_power": { + "type": "string", + "format": "int64" + }, + "proposer_priority": { + "type": "string", + "format": "int64" } } - }, - "total_voting_power": { - "type": "string", - "format": "int64" - }, - "timestamp": { - "type": "string", - "format": "date-time" } }, - "description": "LightClientAttackEvidence contains evidence of a set of validators attempting to mislead a light client." - } - } - } - } - } - }, - "last_commit": { - "type": "object", - "properties": { - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", + "total_voting_power": { + "type": "string", "format": "int64" }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "timestamp": { "type": "string", - "format": "byte" + "format": "date-time" } - } + }, + "description": "LightClientAttackEvidence contains evidence of a set of validators attempting to mislead a light client." } } - }, - "signatures": { - "type": "array", - "items": { + } + } + } + }, + "last_commit": { + "type": "object", + "properties": { + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { "type": "object", "properties": { - "block_id_flag": { - "title": "BlockIdFlag indicates which BlockID the signature is for", - "type": "string", - "default": "BLOCK_ID_FLAG_UNKNOWN", - "enum": [ - "BLOCK_ID_FLAG_UNKNOWN", - "BLOCK_ID_FLAG_ABSENT", - "BLOCK_ID_FLAG_COMMIT", - "BLOCK_ID_FLAG_NIL" - ] - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "timestamp": { - "type": "string", - "format": "date-time" + "total": { + "type": "integer", + "format": "int64" }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "hash": { "type": "string", "format": "byte" } }, - "description": "CommitSig is a part of the Vote included in a Commit." + "title": "PartsetHeader" } - } + }, + "title": "BlockID" }, - "description": "Commit contains the evidence that a block was committed by a set of validators." - } - } - }, - "sdk_block": { - "title": "Since: cosmos-sdk 0.47", - "type": "object", - "properties": { - "header": { - "type": "object", - "properties": { - "version": { - "title": "basic block info", + "signatures": { + "type": "array", + "items": { "type": "object", "properties": { - "block": { + "block_id_flag": { "type": "string", - "format": "uint64" + "enum": [ + "BLOCK_ID_FLAG_UNKNOWN", + "BLOCK_ID_FLAG_ABSENT", + "BLOCK_ID_FLAG_COMMIT", + "BLOCK_ID_FLAG_NIL" + ], + "default": "BLOCK_ID_FLAG_UNKNOWN", + "title": "BlockIdFlag indicates which BlockID the signature is for" }, - "app": { - "type": "string", - "format": "uint64" - } - }, - "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." - }, - "chain_id": { - "type": "string" - }, - "height": { - "type": "string", - "format": "int64" - }, - "time": { - "type": "string", - "format": "date-time" - }, - "last_block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "validator_address": { "type": "string", "format": "byte" }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } + "timestamp": { + "type": "string", + "format": "date-time" + }, + "signature": { + "type": "string", + "format": "byte" } + }, + "description": "CommitSig is a part of the Vote included in a Commit." + } + } + }, + "description": "Commit contains the evidence that a block was committed by a set of validators." + } + } + }, + "sdk_block": { + "title": "Since: cosmos-sdk 0.47", + "type": "object", + "properties": { + "header": { + "type": "object", + "properties": { + "version": { + "title": "basic block info", + "type": "object", + "properties": { + "block": { + "type": "string", + "format": "uint64" + }, + "app": { + "type": "string", + "format": "uint64" } }, - "last_commit_hash": { - "title": "hashes of block data", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "data_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validators_hash": { - "title": "hashes from the app output from the prev block", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "next_validators_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "consensus_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "app_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "last_results_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "evidence_hash": { - "title": "consensus info", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proposer_address": { - "type": "string", - "description": "proposer_address is the original block proposer address, formatted as a Bech32 string.\nIn Tendermint, this type is `bytes`, but in the SDK, we convert it to a Bech32 string\nfor better UX." - } + "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." }, - "description": "Header defines the structure of a Tendermint block header." - }, - "data": { - "title": "Data contains the set of transactions included in the block", - "type": "object", - "properties": { - "txs": { - "type": "array", - "description": "Txs that will be applied by state @ block.Height+1.\nNOTE: not all txs here are valid. We're just agreeing on the order first.\nThis means that block.AppHash does not include these txs.", - "items": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "chain_id": { + "type": "string" + }, + "height": { + "type": "string", + "format": "int64" + }, + "time": { + "type": "string", + "format": "date-time" + }, + "last_block_id": { + "type": "object", + "properties": { + "hash": { "type": "string", "format": "byte" - } - } - } - }, - "evidence": { - "type": "object", - "properties": { - "evidence": { - "type": "array", - "items": { + }, + "part_set_header": { "type": "object", "properties": { - "duplicate_vote_evidence": { - "type": "object", - "properties": { - "vote_a": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals", - "default": "SIGNED_MSG_TYPE_UNKNOWN", - "enum": [ - "SIGNED_MSG_TYPE_UNKNOWN", - "SIGNED_MSG_TYPE_PREVOTE", - "SIGNED_MSG_TYPE_PRECOMMIT", - "SIGNED_MSG_TYPE_PROPOSAL" - ] - }, - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validator_index": { - "type": "integer", - "format": "int32" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block.", - "format": "byte" - }, - "extension": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages.", - "format": "byte" - }, - "extension_signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages.", - "format": "byte" - } + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "last_commit_hash": { + "type": "string", + "format": "byte", + "title": "hashes of block data" + }, + "data_hash": { + "type": "string", + "format": "byte" + }, + "validators_hash": { + "type": "string", + "format": "byte", + "title": "hashes from the app output from the prev block" + }, + "next_validators_hash": { + "type": "string", + "format": "byte" + }, + "consensus_hash": { + "type": "string", + "format": "byte" + }, + "app_hash": { + "type": "string", + "format": "byte" + }, + "last_results_hash": { + "type": "string", + "format": "byte" + }, + "evidence_hash": { + "type": "string", + "format": "byte", + "title": "consensus info" + }, + "proposer_address": { + "type": "string", + "description": "proposer_address is the original block proposer address, formatted as a Bech32 string.\nIn Tendermint, this type is `bytes`, but in the SDK, we convert it to a Bech32 string\nfor better UX." + } + }, + "description": "Header defines the structure of a Tendermint block header." + }, + "data": { + "type": "object", + "properties": { + "txs": { + "type": "array", + "items": { + "type": "string", + "format": "byte" + }, + "description": "Txs that will be applied by state @ block.Height+1.\nNOTE: not all txs here are valid. We're just agreeing on the order first.\nThis means that block.AppHash does not include these txs." + } + }, + "title": "Data contains the set of transactions included in the block" + }, + "evidence": { + "type": "object", + "properties": { + "evidence": { + "type": "array", + "items": { + "type": "object", + "properties": { + "duplicate_vote_evidence": { + "type": "object", + "properties": { + "vote_a": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "SIGNED_MSG_TYPE_UNKNOWN", + "SIGNED_MSG_TYPE_PREVOTE", + "SIGNED_MSG_TYPE_PRECOMMIT", + "SIGNED_MSG_TYPE_PROPOSAL" + ], + "default": "SIGNED_MSG_TYPE_UNKNOWN", + "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals" }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." - }, - "vote_b": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals", - "default": "SIGNED_MSG_TYPE_UNKNOWN", - "enum": [ - "SIGNED_MSG_TYPE_UNKNOWN", - "SIGNED_MSG_TYPE_PREVOTE", - "SIGNED_MSG_TYPE_PRECOMMIT", - "SIGNED_MSG_TYPE_PROPOSAL" - ] - }, - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" } - } + }, + "title": "PartsetHeader" } }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validator_index": { - "type": "integer", - "format": "int32" - }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block.", - "format": "byte" - }, - "extension": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages.", - "format": "byte" - }, - "extension_signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages.", - "format": "byte" - } + "title": "BlockID" }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." - }, - "total_voting_power": { - "type": "string", - "format": "int64" - }, - "validator_power": { - "type": "string", - "format": "int64" + "timestamp": { + "type": "string", + "format": "date-time" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "validator_index": { + "type": "integer", + "format": "int32" + }, + "signature": { + "type": "string", + "format": "byte", + "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." + }, + "extension": { + "type": "string", + "format": "byte", + "description": "Vote extension provided by the application. Only valid for precommit\nmessages." + }, + "extension_signature": { + "type": "string", + "format": "byte", + "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + } }, - "timestamp": { - "type": "string", - "format": "date-time" - } + "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." }, - "description": "DuplicateVoteEvidence contains evidence of a validator signed two conflicting votes." - }, - "light_client_attack_evidence": { - "type": "object", - "properties": { - "conflicting_block": { - "type": "object", - "properties": { - "signed_header": { - "type": "object", - "properties": { - "header": { - "type": "object", - "properties": { - "version": { - "title": "basic block info", - "type": "object", - "properties": { - "block": { - "type": "string", - "format": "uint64" - }, - "app": { - "type": "string", - "format": "uint64" - } - }, - "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." - }, - "chain_id": { - "type": "string" - }, - "height": { - "type": "string", - "format": "int64" - }, - "time": { - "type": "string", - "format": "date-time" - }, - "last_block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } - } - }, - "last_commit_hash": { - "title": "hashes of block data", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "data_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validators_hash": { - "title": "hashes from the app output from the prev block", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "next_validators_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "consensus_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "app_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "last_results_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "evidence_hash": { - "title": "consensus info", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proposer_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } + "vote_b": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "SIGNED_MSG_TYPE_UNKNOWN", + "SIGNED_MSG_TYPE_PREVOTE", + "SIGNED_MSG_TYPE_PRECOMMIT", + "SIGNED_MSG_TYPE_PROPOSAL" + ], + "default": "SIGNED_MSG_TYPE_UNKNOWN", + "description": "SignedMsgType is a type of signed message in the consensus.\n\n - SIGNED_MSG_TYPE_PREVOTE: Votes\n - SIGNED_MSG_TYPE_PROPOSAL: Proposals" + }, + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" }, - "description": "Header defines the structure of a block header." + "hash": { + "type": "string", + "format": "byte" + } }, - "commit": { - "type": "object", - "properties": { - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - } - } + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "validator_index": { + "type": "integer", + "format": "int32" + }, + "signature": { + "type": "string", + "format": "byte", + "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." + }, + "extension": { + "type": "string", + "format": "byte", + "description": "Vote extension provided by the application. Only valid for precommit\nmessages." + }, + "extension_signature": { + "type": "string", + "format": "byte", + "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + } + }, + "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + }, + "total_voting_power": { + "type": "string", + "format": "int64" + }, + "validator_power": { + "type": "string", + "format": "int64" + }, + "timestamp": { + "type": "string", + "format": "date-time" + } + }, + "description": "DuplicateVoteEvidence contains evidence of a validator signed two conflicting votes." + }, + "light_client_attack_evidence": { + "type": "object", + "properties": { + "conflicting_block": { + "type": "object", + "properties": { + "signed_header": { + "type": "object", + "properties": { + "header": { + "type": "object", + "properties": { + "version": { + "title": "basic block info", + "type": "object", + "properties": { + "block": { + "type": "string", + "format": "uint64" + }, + "app": { + "type": "string", + "format": "uint64" } }, - "signatures": { - "type": "array", - "items": { + "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." + }, + "chain_id": { + "type": "string" + }, + "height": { + "type": "string", + "format": "int64" + }, + "time": { + "type": "string", + "format": "date-time" + }, + "last_block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { "type": "object", "properties": { - "block_id_flag": { - "title": "BlockIdFlag indicates which BlockID the signature is for", - "type": "string", - "default": "BLOCK_ID_FLAG_UNKNOWN", - "enum": [ - "BLOCK_ID_FLAG_UNKNOWN", - "BLOCK_ID_FLAG_ABSENT", - "BLOCK_ID_FLAG_COMMIT", - "BLOCK_ID_FLAG_NIL" - ] - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "timestamp": { - "type": "string", - "format": "date-time" + "total": { + "type": "integer", + "format": "int64" }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "hash": { "type": "string", "format": "byte" } }, - "description": "CommitSig is a part of the Vote included in a Commit." + "title": "PartsetHeader" } - } + }, + "title": "BlockID" }, - "description": "Commit contains the evidence that a block was committed by a set of validators." - } - } - }, - "validator_set": { - "type": "object", - "properties": { - "validators": { - "type": "array", - "items": { + "last_commit_hash": { + "type": "string", + "format": "byte", + "title": "hashes of block data" + }, + "data_hash": { + "type": "string", + "format": "byte" + }, + "validators_hash": { + "type": "string", + "format": "byte", + "title": "hashes from the app output from the prev block" + }, + "next_validators_hash": { + "type": "string", + "format": "byte" + }, + "consensus_hash": { + "type": "string", + "format": "byte" + }, + "app_hash": { + "type": "string", + "format": "byte" + }, + "last_results_hash": { + "type": "string", + "format": "byte" + }, + "evidence_hash": { + "type": "string", + "format": "byte", + "title": "consensus info" + }, + "proposer_address": { + "type": "string", + "format": "byte" + } + }, + "description": "Header defines the structure of a block header." + }, + "commit": { + "type": "object", + "properties": { + "height": { + "type": "string", + "format": "int64" + }, + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { "type": "object", "properties": { - "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "hash": { "type": "string", "format": "byte" }, - "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", + "part_set_header": { "type": "object", "properties": { - "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" + "total": { + "type": "integer", + "format": "int64" }, - "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "hash": { "type": "string", "format": "byte" } + }, + "title": "PartsetHeader" + } + }, + "title": "BlockID" + }, + "signatures": { + "type": "array", + "items": { + "type": "object", + "properties": { + "block_id_flag": { + "type": "string", + "enum": [ + "BLOCK_ID_FLAG_UNKNOWN", + "BLOCK_ID_FLAG_ABSENT", + "BLOCK_ID_FLAG_COMMIT", + "BLOCK_ID_FLAG_NIL" + ], + "default": "BLOCK_ID_FLAG_UNKNOWN", + "title": "BlockIdFlag indicates which BlockID the signature is for" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "signature": { + "type": "string", + "format": "byte" } }, - "voting_power": { - "type": "string", - "format": "int64" - }, - "proposer_priority": { - "type": "string", - "format": "int64" - } + "description": "CommitSig is a part of the Vote included in a Commit." } } }, - "proposer": { + "description": "Commit contains the evidence that a block was committed by a set of validators." + } + } + }, + "validator_set": { + "type": "object", + "properties": { + "validators": { + "type": "array", + "items": { "type": "object", "properties": { "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "format": "byte" }, "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", "type": "object", "properties": { "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "format": "byte" }, "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "format": "byte" } - } + }, + "title": "PublicKey defines the keys available for use with Validators" }, "voting_power": { "type": "string", @@ -45173,728 +41145,731 @@ "format": "int64" } } - }, - "total_voting_power": { - "type": "string", - "format": "int64" } - } - } - } - }, - "common_height": { - "type": "string", - "format": "int64" - }, - "byzantine_validators": { - "type": "array", - "items": { - "type": "object", - "properties": { - "address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" }, - "pub_key": { - "title": "PublicKey defines the keys available for use with Validators", + "proposer": { "type": "object", "properties": { - "ed25519": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "address": { "type": "string", "format": "byte" }, - "secp256k1": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "pub_key": { + "type": "object", + "properties": { + "ed25519": { + "type": "string", + "format": "byte" + }, + "secp256k1": { + "type": "string", + "format": "byte" + } + }, + "title": "PublicKey defines the keys available for use with Validators" + }, + "voting_power": { "type": "string", - "format": "byte" + "format": "int64" + }, + "proposer_priority": { + "type": "string", + "format": "int64" } } }, - "voting_power": { - "type": "string", - "format": "int64" - }, - "proposer_priority": { + "total_voting_power": { "type": "string", "format": "int64" } } } - }, - "total_voting_power": { - "type": "string", - "format": "int64" - }, - "timestamp": { - "type": "string", - "format": "date-time" } }, - "description": "LightClientAttackEvidence contains evidence of a set of validators attempting to mislead a light client." - } - } - } - } - } - }, - "last_commit": { - "type": "object", - "properties": { - "height": { - "type": "string", - "format": "int64" - }, - "round": { - "type": "integer", - "format": "int32" - }, - "block_id": { - "title": "BlockID", - "type": "object", - "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "part_set_header": { - "title": "PartsetHeader", - "type": "object", - "properties": { - "total": { - "type": "integer", + "common_height": { + "type": "string", "format": "int64" }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "byzantine_validators": { + "type": "array", + "items": { + "type": "object", + "properties": { + "address": { + "type": "string", + "format": "byte" + }, + "pub_key": { + "type": "object", + "properties": { + "ed25519": { + "type": "string", + "format": "byte" + }, + "secp256k1": { + "type": "string", + "format": "byte" + } + }, + "title": "PublicKey defines the keys available for use with Validators" + }, + "voting_power": { + "type": "string", + "format": "int64" + }, + "proposer_priority": { + "type": "string", + "format": "int64" + } + } + } + }, + "total_voting_power": { "type": "string", - "format": "byte" - } - } - } - } - }, - "signatures": { - "type": "array", - "items": { - "type": "object", - "properties": { - "block_id_flag": { - "title": "BlockIdFlag indicates which BlockID the signature is for", - "type": "string", - "default": "BLOCK_ID_FLAG_UNKNOWN", - "enum": [ - "BLOCK_ID_FLAG_UNKNOWN", - "BLOCK_ID_FLAG_ABSENT", - "BLOCK_ID_FLAG_COMMIT", - "BLOCK_ID_FLAG_NIL" - ] - }, - "validator_address": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "timestamp": { - "type": "string", - "format": "date-time" + "format": "int64" + }, + "timestamp": { + "type": "string", + "format": "date-time" + } }, - "signature": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } - }, - "description": "CommitSig is a part of the Vote included in a Commit." + "description": "LightClientAttackEvidence contains evidence of a set of validators attempting to mislead a light client." + } } } - }, - "description": "Commit contains the evidence that a block was committed by a set of validators." + } } }, - "description": "Block is tendermint type Block, with the Header proposer address\nfield converted to bech32 string." - } - }, - "description": "GetLatestBlockResponse is the response type for the Query/GetLatestBlock RPC method." - }, - "cosmos.base.tendermint.v1beta1.GetLatestValidatorSetResponse": { - "type": "object", - "properties": { - "block_height": { - "type": "string", - "format": "int64" - }, - "validators": { - "type": "array", - "items": { + "last_commit": { "type": "object", "properties": { - "address": { - "type": "string" + "height": { + "type": "string", + "format": "int64" }, - "pub_key": { + "round": { + "type": "integer", + "format": "int32" + }, + "block_id": { "type": "object", "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "hash": { "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", "format": "byte" + }, + "part_set_header": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "hash": { + "type": "string", + "format": "byte" + } + }, + "title": "PartsetHeader" } }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "voting_power": { - "type": "string", - "format": "int64" + "title": "BlockID" }, - "proposer_priority": { - "type": "string", - "format": "int64" + "signatures": { + "type": "array", + "items": { + "type": "object", + "properties": { + "block_id_flag": { + "type": "string", + "enum": [ + "BLOCK_ID_FLAG_UNKNOWN", + "BLOCK_ID_FLAG_ABSENT", + "BLOCK_ID_FLAG_COMMIT", + "BLOCK_ID_FLAG_NIL" + ], + "default": "BLOCK_ID_FLAG_UNKNOWN", + "title": "BlockIdFlag indicates which BlockID the signature is for" + }, + "validator_address": { + "type": "string", + "format": "byte" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "signature": { + "type": "string", + "format": "byte" + } + }, + "description": "CommitSig is a part of the Vote included in a Commit." + } } }, - "description": "Validator is the type for the validator-set." + "description": "Commit contains the evidence that a block was committed by a set of validators." } }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" - } - }, - "description": "pagination defines an pagination for the response." - } - }, - "description": "GetLatestValidatorSetResponse is the response type for the Query/GetValidatorSetByHeight RPC method." + "description": "Block is tendermint type Block, with the Header proposer address\nfield converted to bech32 string." + } }, - "cosmos.base.tendermint.v1beta1.GetNodeInfoResponse": { - "type": "object", - "properties": { - "default_node_info": { + "description": "GetLatestBlockResponse is the response type for the Query/GetLatestBlock RPC method." + }, + "cosmos.base.tendermint.v1beta1.GetLatestValidatorSetResponse": { + "type": "object", + "properties": { + "block_height": { + "type": "string", + "format": "int64" + }, + "validators": { + "type": "array", + "items": { "type": "object", "properties": { - "protocol_version": { + "address": { + "type": "string" + }, + "pub_key": { "type": "object", "properties": { - "p2p": { - "type": "string", - "format": "uint64" - }, - "block": { + "type_url": { "type": "string", - "format": "uint64" + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." }, - "app": { + "value": { "type": "string", - "format": "uint64" + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } - }, - "default_node_id": { - "type": "string" - }, - "listen_addr": { - "type": "string" - }, - "network": { - "type": "string" - }, - "version": { - "type": "string" + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" }, - "channels": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "voting_power": { "type": "string", - "format": "byte" - }, - "moniker": { - "type": "string" - }, - "other": { - "type": "object", - "properties": { - "tx_index": { - "type": "string" - }, - "rpc_address": { - "type": "string" - } - } - } - } - }, - "application_version": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "app_name": { - "type": "string" - }, - "version": { - "type": "string" - }, - "git_commit": { - "type": "string" - }, - "build_tags": { - "type": "string" - }, - "go_version": { - "type": "string" - }, - "build_deps": { - "type": "array", - "items": { - "title": "Module is the type for VersionInfo", - "type": "object", - "properties": { - "path": { - "title": "module path", - "type": "string" - }, - "version": { - "title": "module version", - "type": "string" - }, - "sum": { - "title": "checksum", - "type": "string" - } - } - } + "format": "int64" }, - "cosmos_sdk_version": { - "title": "Since: cosmos-sdk 0.43", - "type": "string" + "proposer_priority": { + "type": "string", + "format": "int64" } }, - "description": "VersionInfo is the type for the GetNodeInfoResponse message." + "description": "Validator is the type for the validator-set." } }, - "description": "GetNodeInfoResponse is the response type for the Query/GetNodeInfo RPC method." - }, - "cosmos.base.tendermint.v1beta1.GetSyncingResponse": { - "type": "object", - "properties": { - "syncing": { - "type": "boolean" + "pagination": { + "description": "pagination defines an pagination for the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } } - }, - "description": "GetSyncingResponse is the response type for the Query/GetSyncing RPC method." + } }, - "cosmos.base.tendermint.v1beta1.GetValidatorSetByHeightResponse": { - "type": "object", - "properties": { - "block_height": { - "type": "string", - "format": "int64" - }, - "validators": { - "type": "array", - "items": { + "description": "GetLatestValidatorSetResponse is the response type for the Query/GetValidatorSetByHeight RPC method." + }, + "cosmos.base.tendermint.v1beta1.GetNodeInfoResponse": { + "type": "object", + "properties": { + "default_node_info": { + "type": "object", + "properties": { + "protocol_version": { "type": "object", "properties": { - "address": { - "type": "string" - }, - "pub_key": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", - "format": "byte" - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "p2p": { + "type": "string", + "format": "uint64" }, - "voting_power": { + "block": { "type": "string", - "format": "int64" + "format": "uint64" }, - "proposer_priority": { + "app": { "type": "string", - "format": "int64" + "format": "uint64" } - }, - "description": "Validator is the type for the validator-set." - } - }, - "pagination": { - "type": "object", - "properties": { - "next_key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.", - "format": "byte" - }, - "total": { - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise", - "type": "string", - "format": "uint64" } }, - "description": "pagination defines an pagination for the response." + "default_node_id": { + "type": "string" + }, + "listen_addr": { + "type": "string" + }, + "network": { + "type": "string" + }, + "version": { + "type": "string" + }, + "channels": { + "type": "string", + "format": "byte" + }, + "moniker": { + "type": "string" + }, + "other": { + "type": "object", + "properties": { + "tx_index": { + "type": "string" + }, + "rpc_address": { + "type": "string" + } + } + } } }, - "description": "GetValidatorSetByHeightResponse is the response type for the Query/GetValidatorSetByHeight RPC method." - }, - "cosmos.base.tendermint.v1beta1.Header": { - "type": "object", - "properties": { - "version": { - "title": "basic block info", - "type": "object", - "properties": { - "block": { - "type": "string", - "format": "uint64" - }, - "app": { - "type": "string", - "format": "uint64" + "application_version": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "app_name": { + "type": "string" + }, + "version": { + "type": "string" + }, + "git_commit": { + "type": "string" + }, + "build_tags": { + "type": "string" + }, + "go_version": { + "type": "string" + }, + "build_deps": { + "type": "array", + "items": { + "type": "object", + "properties": { + "path": { + "type": "string", + "title": "module path" + }, + "version": { + "type": "string", + "title": "module version" + }, + "sum": { + "type": "string", + "title": "checksum" + } + }, + "title": "Module is the type for VersionInfo" } }, - "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." - }, - "chain_id": { - "type": "string" - }, - "height": { - "type": "string", - "format": "int64" - }, - "time": { - "type": "string", - "format": "date-time" + "cosmos_sdk_version": { + "type": "string", + "title": "Since: cosmos-sdk 0.43" + } }, - "last_block_id": { - "title": "BlockID", + "description": "VersionInfo is the type for the GetNodeInfoResponse message." + } + }, + "description": "GetNodeInfoResponse is the response type for the Query/GetNodeInfo RPC method." + }, + "cosmos.base.tendermint.v1beta1.GetSyncingResponse": { + "type": "object", + "properties": { + "syncing": { + "type": "boolean" + } + }, + "description": "GetSyncingResponse is the response type for the Query/GetSyncing RPC method." + }, + "cosmos.base.tendermint.v1beta1.GetValidatorSetByHeightResponse": { + "type": "object", + "properties": { + "block_height": { + "type": "string", + "format": "int64" + }, + "validators": { + "type": "array", + "items": { "type": "object", "properties": { - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" + "address": { + "type": "string" }, - "part_set_header": { - "title": "PartsetHeader", + "pub_key": { "type": "object", "properties": { - "total": { - "type": "integer", - "format": "int64" + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." }, - "hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "value": { "type": "string", - "format": "byte" + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } - } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "voting_power": { + "type": "string", + "format": "int64" + }, + "proposer_priority": { + "type": "string", + "format": "int64" } - } - }, - "last_commit_hash": { - "title": "hashes of block data", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "data_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "validators_hash": { - "title": "hashes from the app output from the prev block", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "next_validators_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "consensus_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "app_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "last_results_hash": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "evidence_hash": { - "title": "consensus info", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "proposer_address": { - "type": "string", - "description": "proposer_address is the original block proposer address, formatted as a Bech32 string.\nIn Tendermint, this type is `bytes`, but in the SDK, we convert it to a Bech32 string\nfor better UX." + }, + "description": "Validator is the type for the validator-set." } }, - "description": "Header defines the structure of a Tendermint block header." - }, - "cosmos.base.tendermint.v1beta1.Module": { - "title": "Module is the type for VersionInfo", - "type": "object", - "properties": { - "path": { - "title": "module path", - "type": "string" - }, - "version": { - "title": "module version", - "type": "string" - }, - "sum": { - "title": "checksum", - "type": "string" + "pagination": { + "description": "pagination defines an pagination for the response.", + "type": "object", + "properties": { + "next_key": { + "type": "string", + "format": "byte", + "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." + }, + "total": { + "type": "string", + "format": "uint64", + "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" + } } } }, - "cosmos.base.tendermint.v1beta1.ProofOp": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" + "description": "GetValidatorSetByHeightResponse is the response type for the Query/GetValidatorSetByHeight RPC method." + }, + "cosmos.base.tendermint.v1beta1.Header": { + "type": "object", + "properties": { + "version": { + "title": "basic block info", + "type": "object", + "properties": { + "block": { + "type": "string", + "format": "uint64" + }, + "app": { + "type": "string", + "format": "uint64" + } }, - "data": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - } + "description": "Consensus captures the consensus rules for processing a block in the blockchain,\nincluding all blockchain data structures and the rules of the application's\nstate transition machine." }, - "description": "ProofOp defines an operation used for calculating Merkle root. The data could\nbe arbitrary format, providing necessary data for example neighbouring node\nhash.\n\nNote: This type is a duplicate of the ProofOp proto type defined in Tendermint." - }, - "cosmos.base.tendermint.v1beta1.ProofOps": { - "type": "object", - "properties": { - "ops": { - "type": "array", - "items": { + "chain_id": { + "type": "string" + }, + "height": { + "type": "string", + "format": "int64" + }, + "time": { + "type": "string", + "format": "date-time" + }, + "last_block_id": { + "type": "object", + "properties": { + "hash": { + "type": "string", + "format": "byte" + }, + "part_set_header": { "type": "object", "properties": { - "type": { - "type": "string" - }, - "key": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" + "total": { + "type": "integer", + "format": "int64" }, - "data": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "hash": { "type": "string", "format": "byte" } }, - "description": "ProofOp defines an operation used for calculating Merkle root. The data could\nbe arbitrary format, providing necessary data for example neighbouring node\nhash.\n\nNote: This type is a duplicate of the ProofOp proto type defined in Tendermint." + "title": "PartsetHeader" } - } + }, + "title": "BlockID" }, - "description": "ProofOps is Merkle proof defined by the list of ProofOps.\n\nNote: This type is a duplicate of the ProofOps proto type defined in Tendermint." + "last_commit_hash": { + "type": "string", + "format": "byte", + "title": "hashes of block data" + }, + "data_hash": { + "type": "string", + "format": "byte" + }, + "validators_hash": { + "type": "string", + "format": "byte", + "title": "hashes from the app output from the prev block" + }, + "next_validators_hash": { + "type": "string", + "format": "byte" + }, + "consensus_hash": { + "type": "string", + "format": "byte" + }, + "app_hash": { + "type": "string", + "format": "byte" + }, + "last_results_hash": { + "type": "string", + "format": "byte" + }, + "evidence_hash": { + "type": "string", + "format": "byte", + "title": "consensus info" + }, + "proposer_address": { + "type": "string", + "description": "proposer_address is the original block proposer address, formatted as a Bech32 string.\nIn Tendermint, this type is `bytes`, but in the SDK, we convert it to a Bech32 string\nfor better UX." + } }, - "cosmos.base.tendermint.v1beta1.Validator": { - "type": "object", - "properties": { - "address": { - "type": "string" - }, - "pub_key": { + "description": "Header defines the structure of a Tendermint block header." + }, + "cosmos.base.tendermint.v1beta1.Module": { + "type": "object", + "properties": { + "path": { + "type": "string", + "title": "module path" + }, + "version": { + "type": "string", + "title": "module version" + }, + "sum": { + "type": "string", + "title": "checksum" + } + }, + "title": "Module is the type for VersionInfo" + }, + "cosmos.base.tendermint.v1beta1.ProofOp": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "key": { + "type": "string", + "format": "byte" + }, + "data": { + "type": "string", + "format": "byte" + } + }, + "description": "ProofOp defines an operation used for calculating Merkle root. The data could\nbe arbitrary format, providing necessary data for example neighbouring node\nhash.\n\nNote: This type is a duplicate of the ProofOp proto type defined in Tendermint." + }, + "cosmos.base.tendermint.v1beta1.ProofOps": { + "type": "object", + "properties": { + "ops": { + "type": "array", + "items": { "type": "object", "properties": { - "type_url": { + "type": { + "type": "string" + }, + "key": { "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + "format": "byte" }, - "value": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "data": { "type": "string", - "description": "Must be a valid serialized protocol buffer of the above specified type.", "format": "byte" } }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "voting_power": { - "type": "string", - "format": "int64" - }, - "proposer_priority": { - "type": "string", - "format": "int64" + "description": "ProofOp defines an operation used for calculating Merkle root. The data could\nbe arbitrary format, providing necessary data for example neighbouring node\nhash.\n\nNote: This type is a duplicate of the ProofOp proto type defined in Tendermint." } - }, - "description": "Validator is the type for the validator-set." + } }, - "cosmos.base.tendermint.v1beta1.VersionInfo": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "app_name": { - "type": "string" - }, - "version": { - "type": "string" - }, - "git_commit": { - "type": "string" - }, - "build_tags": { - "type": "string" - }, - "go_version": { - "type": "string" - }, - "build_deps": { - "type": "array", - "items": { - "title": "Module is the type for VersionInfo", - "type": "object", - "properties": { - "path": { - "title": "module path", - "type": "string" - }, - "version": { - "title": "module version", - "type": "string" - }, - "sum": { - "title": "checksum", - "type": "string" - } - } + "description": "ProofOps is Merkle proof defined by the list of ProofOps.\n\nNote: This type is a duplicate of the ProofOps proto type defined in Tendermint." + }, + "cosmos.base.tendermint.v1beta1.Validator": { + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "pub_key": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } }, - "cosmos_sdk_version": { - "title": "Since: cosmos-sdk 0.43", - "type": "string" - } + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "voting_power": { + "type": "string", + "format": "int64" }, - "description": "VersionInfo is the type for the GetNodeInfoResponse message." + "proposer_priority": { + "type": "string", + "format": "int64" + } }, - "tendermint.p2p.DefaultNodeInfo": { - "type": "object", - "properties": { - "protocol_version": { + "description": "Validator is the type for the validator-set." + }, + "cosmos.base.tendermint.v1beta1.VersionInfo": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "app_name": { + "type": "string" + }, + "version": { + "type": "string" + }, + "git_commit": { + "type": "string" + }, + "build_tags": { + "type": "string" + }, + "go_version": { + "type": "string" + }, + "build_deps": { + "type": "array", + "items": { "type": "object", "properties": { - "p2p": { + "path": { "type": "string", - "format": "uint64" + "title": "module path" }, - "block": { + "version": { "type": "string", - "format": "uint64" + "title": "module version" }, - "app": { + "sum": { "type": "string", - "format": "uint64" - } - } - }, - "default_node_id": { - "type": "string" - }, - "listen_addr": { - "type": "string" - }, - "network": { - "type": "string" - }, - "version": { - "type": "string" - }, - "channels": { - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string", - "format": "byte" - }, - "moniker": { - "type": "string" - }, - "other": { - "type": "object", - "properties": { - "tx_index": { - "type": "string" - }, - "rpc_address": { - "type": "string" + "title": "checksum" } - } + }, + "title": "Module is the type for VersionInfo" } + }, + "cosmos_sdk_version": { + "type": "string", + "title": "Since: cosmos-sdk 0.43" } }, - "tendermint.p2p.DefaultNodeInfoOther": { - "type": "object", - "properties": { - "tx_index": { - "type": "string" - }, - "rpc_address": { - "type": "string" + "description": "VersionInfo is the type for the GetNodeInfoResponse message." + }, + "tendermint.p2p.DefaultNodeInfo": { + "type": "object", + "properties": { + "protocol_version": { + "type": "object", + "properties": { + "p2p": { + "type": "string", + "format": "uint64" + }, + "block": { + "type": "string", + "format": "uint64" + }, + "app": { + "type": "string", + "format": "uint64" + } } - } - }, - "tendermint.p2p.ProtocolVersion": { - "type": "object", - "properties": { - "p2p": { - "type": "string", - "format": "uint64" - }, - "block": { - "type": "string", - "format": "uint64" - }, - "app": { - "type": "string", - "format": "uint64" + }, + "default_node_id": { + "type": "string" + }, + "listen_addr": { + "type": "string" + }, + "network": { + "type": "string" + }, + "version": { + "type": "string" + }, + "channels": { + "type": "string", + "format": "byte" + }, + "moniker": { + "type": "string" + }, + "other": { + "type": "object", + "properties": { + "tx_index": { + "type": "string" + }, + "rpc_address": { + "type": "string" + } } } } + }, + "tendermint.p2p.DefaultNodeInfoOther": { + "type": "object", + "properties": { + "tx_index": { + "type": "string" + }, + "rpc_address": { + "type": "string" + } + } + }, + "tendermint.p2p.ProtocolVersion": { + "type": "object", + "properties": { + "p2p": { + "type": "string", + "format": "uint64" + }, + "block": { + "type": "string", + "format": "uint64" + }, + "app": { + "type": "string", + "format": "uint64" + } + } } } -} +} \ No newline at end of file From 27aba1facd41ee526a2f9eba58e2c11aea241a01 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 3 Jan 2024 13:04:18 +0000 Subject: [PATCH 050/345] fix(outposts): Handle cases for input and output denoms without token pair lookup (backport #2185) (#2215) * fix(outposts): Handle cases for input and output denoms without token pair lookup (#2185) * fix: add bond denom to outposts directly from staking keeper * format and lint * fix: comment out stride unit tests that don't apply * fix: cases for input and output denom * fix: use IBC denom instead of ERC20 address or plain denom * fix: remove ERC20 token pair check from liquid stake transaction and replace with the hardcoded wevmos address check * fix: stride tests * minor fix * fix: osmosis setup * fix: adapt tests to pass for both Outposts * fix: refactor to only use hardcoded WEVMOS * remove unnecessary comment * fix: no more need for custom error * fix: remove commented out lines * APPLY CHANGES FROM CODE REVIEW * update e2e test patches * update e2e test --------- Co-authored-by: stepit Co-authored-by: tom (cherry picked from commit 6179804af97fe7a71434a25230a2513d5ce9873e) # Conflicts: # precompiles/outposts/osmosis/osmosis.go # precompiles/outposts/osmosis/osmosis_test.go # precompiles/outposts/osmosis/setup_test.go # precompiles/outposts/osmosis/tx.go # precompiles/outposts/osmosis/tx_test.go # precompiles/outposts/stride/setup_test.go # precompiles/outposts/stride/stride.go # precompiles/outposts/stride/tx_test.go # tests/nix_tests/configs/osmosis-outpost.nix # tests/nix_tests/configs/osmosis-outpost.patch # tests/nix_tests/configs/stride-outpost-channel.patch # tests/nix_tests/configs/stride-outpost.nix # tests/nix_tests/test_osmosis_outpost.py # tests/nix_tests/test_stride_outpost.py # x/evm/keeper/precompiles.go * fix: fix conflicts in merge * fix(test): fix nix test conflicts * fix: lint, format and CHANGELOG * remove unnecessary files * test: register token pair on genesis * fix(tests): fix stride outpost nix test params * fix(types): fix the ordering of Autopilot args * Apply suggestions from code review Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> * address comments from PR review * fix: lint python files * fix import order --------- Co-authored-by: Vladislav Varadinov Co-authored-by: tom Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> --- CHANGELOG.md | 1 + app/app.go | 2 + precompiles/erc20/types.go | 7 ++ precompiles/outposts/osmosis/osmosis.go | 3 + precompiles/outposts/osmosis/setup_test.go | 4 ++ precompiles/outposts/osmosis/tx.go | 33 ++++++--- precompiles/outposts/osmosis/tx_test.go | 62 ++++++++--------- precompiles/outposts/stride/setup_test.go | 4 ++ precompiles/outposts/stride/stride.go | 3 + precompiles/outposts/stride/tx.go | 19 ++--- precompiles/outposts/stride/tx_test.go | 14 ++-- precompiles/outposts/stride/types.go | 12 ++-- .../configs/allow-wevmos-register.patch | 20 ------ .../nix_tests/configs/osmosis-outpost.jsonnet | 12 ++++ tests/nix_tests/test_osmosis_outpost.py | 45 ++++++------ tests/nix_tests/test_stride_outpost.py | 18 ++--- tests/nix_tests/utils.py | 69 +------------------ testutil/integration/evmos/utils/unit.go | 2 +- x/evm/keeper/precompiles.go | 13 ++++ 19 files changed, 151 insertions(+), 192 deletions(-) delete mode 100644 tests/nix_tests/configs/allow-wevmos-register.patch diff --git a/CHANGELOG.md b/CHANGELOG.md index 481241e9c3..88fc22ec8b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -146,6 +146,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (outpost) [#2171](https://github.com/evmos/evmos/pull/2171) Add channelID selector based on the ChainID. - (db) [#2182](https://github.com/evmos/evmos/pull/2182) Bump RocksDB version to `v8.8.1`. - (api) [#2198] (https://github.com/evmos/evmos/pull/2198) Remove deprecated `RegisterCoinProposal` from store to avoid breaking the governance proposals query. +- (outposts) [#2215](https://github.com/evmos/evmos/pull/2215) backport handle cases for input and output denoms without token pair lookup - (cli) [#2212](https://github.com/evmos/evmos/pull/2212) Remove ValidateBasic in cli. - (swagger) [#2219](https://github.com/evmos/evmos/pull/2219) Update Swagger configuration to remove outdated entries and update vesting module version. diff --git a/app/app.go b/app/app.go index d8061e10ff..6bdd1ee9b8 100644 --- a/app/app.go +++ b/app/app.go @@ -506,9 +506,11 @@ func NewEvmos( app.AccountKeeper, app.BankKeeper, scopedTransferKeeper, app.Erc20Keeper, // Add ERC20 Keeper for ERC20 transfers ) + chainID := bApp.ChainID() // We call this after setting the hooks to ensure that the hooks are set on the keeper evmKeeper.WithPrecompiles( evmkeeper.AvailablePrecompiles( + chainID, *stakingKeeper, app.DistrKeeper, app.BankKeeper, diff --git a/precompiles/erc20/types.go b/precompiles/erc20/types.go index 399a7e31ff..3b52ad7560 100644 --- a/precompiles/erc20/types.go +++ b/precompiles/erc20/types.go @@ -12,6 +12,13 @@ import ( "github.com/ethereum/go-ethereum/common" ) +const ( + // WEVMOSContractMainnet is the WEVMOS contract address for mainnet + WEVMOSContractMainnet = "0xD4949664cD82660AaE99bEdc034a0deA8A0bd517" + // WEVMOSContractTestnet is the WEVMOS contract address for testnet + WEVMOSContractTestnet = "0xcc491f589b45d4a3c679016195b3fb87d7848210" +) + // EventTransfer defines the event data for the ERC20 Transfer events. type EventTransfer struct { From common.Address diff --git a/precompiles/outposts/osmosis/osmosis.go b/precompiles/outposts/osmosis/osmosis.go index 0fa61b6be4..a10166b524 100644 --- a/precompiles/outposts/osmosis/osmosis.go +++ b/precompiles/outposts/osmosis/osmosis.go @@ -40,6 +40,7 @@ var f embed.FS // the common Precompile type. type Precompile struct { cmn.Precompile + wevmosAddress common.Address // IBC timeoutHeight clienttypes.Height timeoutTimestamp uint64 @@ -55,6 +56,7 @@ type Precompile struct { // NewPrecompile creates a new Osmosis outpost Precompile instance as a // PrecompiledContract interface. func NewPrecompile( + wevmosAddress common.Address, authzKeeper authzkeeper.Keeper, bankKeeper bankkeeper.Keeper, transferKeeper transferkeeper.Keeper, @@ -75,6 +77,7 @@ func NewPrecompile( ApprovalExpiration: cmn.DefaultExpirationDuration, AuthzKeeper: authzKeeper, }, + wevmosAddress: wevmosAddress, timeoutHeight: clienttypes.NewHeight(ics20.DefaultTimeoutHeight, ics20.DefaultTimeoutHeight), timeoutTimestamp: ics20.DefaultTimeoutTimestamp, bankKeeper: bankKeeper, diff --git a/precompiles/outposts/osmosis/setup_test.go b/precompiles/outposts/osmosis/setup_test.go index e329ae5aa5..8a003c06f7 100644 --- a/precompiles/outposts/osmosis/setup_test.go +++ b/precompiles/outposts/osmosis/setup_test.go @@ -6,6 +6,9 @@ package osmosis_test import ( "testing" + "github.com/evmos/evmos/v16/precompiles/erc20" + + "github.com/ethereum/go-ethereum/common" "github.com/evmos/evmos/v16/precompiles/outposts/osmosis" "github.com/evmos/evmos/v16/testutil/integration/evmos/grpc" testkeyring "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" @@ -40,6 +43,7 @@ func (s *PrecompileTestSuite) SetupTest() { ) precompile, err := osmosis.NewPrecompile( + common.HexToAddress(erc20.WEVMOSContractTestnet), unitNetwork.App.AuthzKeeper, unitNetwork.App.BankKeeper, unitNetwork.App.TransferKeeper, diff --git a/precompiles/outposts/osmosis/tx.go b/precompiles/outposts/osmosis/tx.go index 0ca72eb60a..58e8c00f83 100644 --- a/precompiles/outposts/osmosis/tx.go +++ b/precompiles/outposts/osmosis/tx.go @@ -12,7 +12,6 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" @@ -61,19 +60,32 @@ func (p Precompile) Swap( return nil, err } - // We need to check if the input and output denom exist. If they exist we retrieve their denom - // otherwise error out. - inputDenom, err := p.erc20Keeper.GetTokenDenom(ctx, input) - if err != nil { - return nil, err + bondDenom := p.stakingKeeper.GetParams(ctx).BondDenom + var inputDenom, outputDenom string + + // Case 1. Input has to be either the address of Osmosis or WEVMOS + switch input { + case p.wevmosAddress: + inputDenom = bondDenom + default: + inputDenom, err = p.erc20Keeper.GetTokenDenom(ctx, input) + if err != nil { + return nil, err + } } - outputDenom, err := p.erc20Keeper.GetTokenDenom(ctx, output) - if err != nil { - return nil, err + + // Case 2. Output has to be either the address of Osmosis or WEVMOS + switch output { + case p.wevmosAddress: + outputDenom = bondDenom + default: + outputDenom, err = p.erc20Keeper.GetTokenDenom(ctx, output) + if err != nil { + return nil, err + } } evmosChannel := NewIBCChannel(transfertypes.PortID, swapPacketData.ChannelID) - bondDenom := p.stakingKeeper.GetParams(ctx).BondDenom err = ValidateInputOutput(inputDenom, outputDenom, bondDenom, evmosChannel) if err != nil { return nil, err @@ -81,6 +93,7 @@ func (p Precompile) Swap( // Retrieve Osmosis channel and port associated with Evmos transfer app. We need these information // to reconstruct the output denom in the Osmosis chain. + channel, found := p.channelKeeper.GetChannel(ctx, evmosChannel.PortID, evmosChannel.ChannelID) if !found { return nil, errorsmod.Wrapf(channeltypes.ErrChannelNotFound, "port ID (%s) channel ID (%s)", evmosChannel.PortID, evmosChannel.ChannelID) diff --git a/precompiles/outposts/osmosis/tx_test.go b/precompiles/outposts/osmosis/tx_test.go index e9eab7678f..2794e28ece 100644 --- a/precompiles/outposts/osmosis/tx_test.go +++ b/precompiles/outposts/osmosis/tx_test.go @@ -4,6 +4,8 @@ import ( "fmt" "math/big" + "github.com/evmos/evmos/v16/precompiles/erc20" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" @@ -130,7 +132,6 @@ func (s *PrecompileTestSuite) TestSwap() { malleate: func() []interface{} { evmosTokenPair, err := testutils.RegisterEvmosERC20Coins(*s.unitNetwork, sender) s.Require().NoError(err, "expected no error during evmos erc20 registration") - return []interface{}{ osmosis.SwapPacketData{ ChannelID: ChannelID, @@ -153,17 +154,17 @@ func (s *PrecompileTestSuite) TestSwap() { sender: senderAddress, origin: senderAddress, malleate: func() []interface{} { - evmosTokenPair, err := testutils.RegisterEvmosERC20Coins(*s.unitNetwork, sender) - s.Require().NoError(err, "expected no error during evmos erc20 registration") - osmoIbcDenomTrace := utils.ComputeIBCDenomTrace(PortID, ChannelID, osmosis.OsmosisDenom) - _, err = testutils.RegisterIBCERC20Coins(*s.unitNetwork, sender, osmoIbcDenomTrace) + _, err := testutils.RegisterIBCERC20Coins(s.unitNetwork, sender, osmoIbcDenomTrace) s.Require().NoError(err, "expected no error during ibc erc20 registration") wrongOsmoIbcDenomTrace := utils.ComputeIBCDenomTrace(PortID, "channel-1", osmosis.OsmosisDenom) - wrongOsmoTokenPair, err := testutils.RegisterIBCERC20Coins(*s.unitNetwork, sender, wrongOsmoIbcDenomTrace) + wrongOsmoTokenPair, err := testutils.RegisterIBCERC20Coins(s.unitNetwork, sender, wrongOsmoIbcDenomTrace) s.Require().NoError(err, "expected no error during ibc erc20 registration") + evmosTokenPair, err := testutils.RegisterEvmosERC20Coins(*s.unitNetwork, sender) + s.Require().NoError(err, "expected no error during evmos erc20 registration") + return []interface{}{ osmosis.SwapPacketData{ ChannelID: ChannelID, @@ -179,6 +180,7 @@ func (s *PrecompileTestSuite) TestSwap() { } }, expError: true, + ibcSetup: true, // Probably there is a better way than hardcoding the expected string errContains: fmt.Sprintf(osmosis.ErrDenomNotSupported, []string{utils.BaseDenom, "ibc/ED07A3391A112B175915CD8FAF43A2DA8E4790EDE12566649D0C2F97716B8518"}), }, @@ -216,7 +218,7 @@ func (s *PrecompileTestSuite) TestSwap() { s.Require().NoError(err, "expected no error during evmos erc20 registration") wrongIbcDenomTrace := utils.ComputeIBCDenomTrace(PortID, ChannelID, "wrong") - wrongTokenPair, err := testutils.RegisterIBCERC20Coins(*s.unitNetwork, sender, wrongIbcDenomTrace) + wrongTokenPair, err := testutils.RegisterIBCERC20Coins(s.unitNetwork, sender, wrongIbcDenomTrace) s.Require().NoError(err, "expected no error during ibc erc20 registration") return []interface{}{ @@ -244,13 +246,13 @@ func (s *PrecompileTestSuite) TestSwap() { sender: senderAddress, origin: senderAddress, malleate: func() []interface{} { - evmosTokenPair, err := testutils.RegisterEvmosERC20Coins(*s.unitNetwork, sender) - s.Require().NoError(err, "expected no error during evmos erc20 registration") - osmoIbcDenomTrace := utils.ComputeIBCDenomTrace(PortID, ChannelID, osmosis.OsmosisDenom) - osmoTokenPair, err := testutils.RegisterIBCERC20Coins(*s.unitNetwork, sender, osmoIbcDenomTrace) + osmoTokenPair, err := testutils.RegisterIBCERC20Coins(s.unitNetwork, sender, osmoIbcDenomTrace) s.Require().NoError(err, "expected no error during ibc erc20 registration") + evmosTokenPair, err := testutils.RegisterEvmosERC20Coins(*s.unitNetwork, sender) + s.Require().NoError(err, "expected no error during evmos erc20 registration") + return []interface{}{ osmosis.SwapPacketData{ ChannelID: ChannelID, @@ -274,13 +276,13 @@ func (s *PrecompileTestSuite) TestSwap() { sender: senderAddress, origin: senderAddress, malleate: func() []interface{} { - evmosTokenPair, err := testutils.RegisterEvmosERC20Coins(*s.unitNetwork, sender) - s.Require().NoError(err, "expected no error during evmos erc20 registration") - osmoIbcDenomTrace := utils.ComputeIBCDenomTrace(PortID, ChannelID, osmosis.OsmosisDenom) - osmoTokenPair, err := testutils.RegisterIBCERC20Coins(*s.unitNetwork, sender, osmoIbcDenomTrace) + osmoTokenPair, err := testutils.RegisterIBCERC20Coins(s.unitNetwork, sender, osmoIbcDenomTrace) s.Require().NoError(err, "expected no error during ibc erc20 registration") + evmosTokenPair, err := testutils.RegisterEvmosERC20Coins(*s.unitNetwork, sender) + s.Require().NoError(err, "expected no error during evmos erc20 registration") + return []interface{}{ osmosis.SwapPacketData{ ChannelID: ChannelID, @@ -305,13 +307,13 @@ func (s *PrecompileTestSuite) TestSwap() { sender: senderAddress, origin: s.keyring.GetAddr(1), malleate: func() []interface{} { - evmosTokenPair, err := testutils.RegisterEvmosERC20Coins(*s.unitNetwork, sender) - s.Require().NoError(err, "expected no error during evmos erc20 registration") - osmoIbcDenomTrace := utils.ComputeIBCDenomTrace(PortID, ChannelID, osmosis.OsmosisDenom) - osmoTokenPair, err := testutils.RegisterIBCERC20Coins(*s.unitNetwork, sender, osmoIbcDenomTrace) + osmoTokenPair, err := testutils.RegisterIBCERC20Coins(s.unitNetwork, sender, osmoIbcDenomTrace) s.Require().NoError(err, "expected no error during ibc erc20 registration") + evmosTokenPair, err := testutils.RegisterEvmosERC20Coins(*s.unitNetwork, sender) + s.Require().NoError(err, "expected no error during evmos erc20 registration") + return []interface{}{ osmosis.SwapPacketData{ ChannelID: ChannelID, @@ -335,11 +337,8 @@ func (s *PrecompileTestSuite) TestSwap() { sender: senderAddress, origin: senderAddress, malleate: func() []interface{} { - evmosTokenPair, err := testutils.RegisterEvmosERC20Coins(*s.unitNetwork, sender) - s.Require().NoError(err, "expected no error during evmos erc20 registration") - osmoIbcDenomTrace := utils.ComputeIBCDenomTrace(PortID, ChannelID, osmosis.OsmosisDenom) - osmoTokenPair, err := testutils.RegisterIBCERC20Coins(*s.unitNetwork, sender, osmoIbcDenomTrace) + osmoTokenPair, err := testutils.RegisterIBCERC20Coins(s.unitNetwork, sender, osmoIbcDenomTrace) s.Require().NoError(err, "expected no error during ibc erc20 registration") return []interface{}{ @@ -348,7 +347,7 @@ func (s *PrecompileTestSuite) TestSwap() { XcsContract: XCSContract, Sender: senderAddress, Input: osmoTokenPair.GetERC20Contract(), - Output: evmosTokenPair.GetERC20Contract(), + Output: common.HexToAddress(erc20.WEVMOSContractTestnet), Amount: transferAmount, SlippagePercentage: slippagePercentage, WindowSeconds: windowSeconds, @@ -364,11 +363,8 @@ func (s *PrecompileTestSuite) TestSwap() { sender: senderAddress, origin: senderAddress, malleate: func() []interface{} { - evmosTokenPair, err := testutils.RegisterEvmosERC20Coins(*s.unitNetwork, sender) - s.Require().NoError(err, "expected no error during evmos erc20 registration") - osmoIbcDenomTrace := utils.ComputeIBCDenomTrace(PortID, ChannelID, osmosis.OsmosisDenom) - osmoTokenPair, err := testutils.RegisterIBCERC20Coins(*s.unitNetwork, sender, osmoIbcDenomTrace) + osmosisTokenPair, err := testutils.RegisterIBCERC20Coins(s.unitNetwork, sender, osmoIbcDenomTrace) s.Require().NoError(err, "expected no error during ibc erc20 registration") return []interface{}{ @@ -376,8 +372,8 @@ func (s *PrecompileTestSuite) TestSwap() { ChannelID: ChannelID, XcsContract: XCSContract, Sender: senderAddress, - Input: osmoTokenPair.GetERC20Contract(), - Output: evmosTokenPair.GetERC20Contract(), + Input: osmosisTokenPair.GetERC20Contract(), + Output: common.HexToAddress(erc20.WEVMOSContractTestnet), Amount: transferAmount, SlippagePercentage: slippagePercentage, WindowSeconds: windowSeconds, @@ -393,11 +389,11 @@ func (s *PrecompileTestSuite) TestSwap() { sender: senderAddress, origin: senderAddress, malleate: func() []interface{} { - evmosTokenPair, err := testutils.RegisterEvmosERC20Coins(*s.unitNetwork, sender) + _, err := testutils.RegisterEvmosERC20Coins(*s.unitNetwork, sender) s.Require().NoError(err, "expected no error during evmos erc20 registration") osmoIbcDenomTrace := utils.ComputeIBCDenomTrace(PortID, ChannelID, osmosis.OsmosisDenom) - osmoTokenPair, err := testutils.RegisterIBCERC20Coins(*s.unitNetwork, sender, osmoIbcDenomTrace) + osmoTokenPair, err := testutils.RegisterIBCERC20Coins(s.unitNetwork, sender, osmoIbcDenomTrace) s.Require().NoError(err, "expected no error during ibc erc20 registration") return []interface{}{ @@ -405,7 +401,7 @@ func (s *PrecompileTestSuite) TestSwap() { ChannelID: ChannelID, XcsContract: XCSContract, Sender: senderAddress, - Input: evmosTokenPair.GetERC20Contract(), + Input: common.HexToAddress(erc20.WEVMOSContractTestnet), Output: osmoTokenPair.GetERC20Contract(), Amount: transferAmount, SlippagePercentage: slippagePercentage, diff --git a/precompiles/outposts/stride/setup_test.go b/precompiles/outposts/stride/setup_test.go index c4b16e82e2..4bd9564a55 100644 --- a/precompiles/outposts/stride/setup_test.go +++ b/precompiles/outposts/stride/setup_test.go @@ -6,6 +6,9 @@ package stride_test import ( "testing" + "github.com/evmos/evmos/v16/precompiles/erc20" + + "github.com/ethereum/go-ethereum/common" "github.com/evmos/evmos/v16/precompiles/outposts/stride" "github.com/evmos/evmos/v16/testutil/integration/common/grpc" testkeyring "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" @@ -36,6 +39,7 @@ func (s *PrecompileTestSuite) SetupTest() { ) precompile, err := stride.NewPrecompile( + common.HexToAddress(erc20.WEVMOSContractTestnet), network.App.TransferKeeper, network.App.Erc20Keeper, network.App.AuthzKeeper, diff --git a/precompiles/outposts/stride/stride.go b/precompiles/outposts/stride/stride.go index 83f7278a51..d9d628c52f 100644 --- a/precompiles/outposts/stride/stride.go +++ b/precompiles/outposts/stride/stride.go @@ -30,6 +30,7 @@ var f embed.FS type Precompile struct { cmn.Precompile + wevmosAddress common.Address timeoutHeight clienttypes.Height transferKeeper transferkeeper.Keeper erc20Keeper erc20keeper.Keeper @@ -39,6 +40,7 @@ type Precompile struct { // NewPrecompile creates a new Stride outpost Precompile instance as a // PrecompiledContract interface. func NewPrecompile( + wevmosAddress common.Address, transferKeeper transferkeeper.Keeper, erc20Keeper erc20keeper.Keeper, authzKeeper authzkeeper.Keeper, @@ -57,6 +59,7 @@ func NewPrecompile( TransientKVGasConfig: storetypes.TransientGasConfig(), ApprovalExpiration: cmn.DefaultExpirationDuration, // should be configurable in the future. }, + wevmosAddress: wevmosAddress, timeoutHeight: clienttypes.NewHeight(ics20.DefaultTimeoutHeight, ics20.DefaultTimeoutHeight), transferKeeper: transferKeeper, erc20Keeper: erc20Keeper, diff --git a/precompiles/outposts/stride/tx.go b/precompiles/outposts/stride/tx.go index 6c8e8b6722..3f90753257 100644 --- a/precompiles/outposts/stride/tx.go +++ b/precompiles/outposts/stride/tx.go @@ -60,22 +60,13 @@ func (p Precompile) LiquidStake( return nil, err } - bondDenom := p.stakingKeeper.BondDenom(ctx) - - tokenPairID := p.erc20Keeper.GetDenomMap(ctx, bondDenom) - - tokenPair, found := p.erc20Keeper.GetTokenPair(ctx, tokenPairID) - // NOTE this should always exist - if !found { - return nil, fmt.Errorf(ErrTokenPairNotFound, tokenPairID) + // WEVMOS address is the only supported token for liquid staking + if token != p.wevmosAddress { + return nil, fmt.Errorf(ErrUnsupportedToken, token, p.wevmosAddress) } - // NOTE: for v1 we only support the native EVM (and staking) denomination (WEVMOS/WTEVMOS). - if token != tokenPair.GetERC20Contract() { - return nil, fmt.Errorf(ErrUnsupportedToken, token, tokenPair.Erc20Address) - } - - coin := sdk.Coin{Denom: tokenPair.Denom, Amount: math.NewIntFromBigInt(amount)} + bondDenom := p.stakingKeeper.BondDenom(ctx) + coin := sdk.Coin{Denom: bondDenom, Amount: math.NewIntFromBigInt(amount)} // Create the memo for the ICS20 transfer packet memo, err := CreateMemo(LiquidStakeAction, strideForwarder, sdk.AccAddress(receiver.Bytes()).String()) diff --git a/precompiles/outposts/stride/tx_test.go b/precompiles/outposts/stride/tx_test.go index f00b3f2ac2..1baa1a14d6 100644 --- a/precompiles/outposts/stride/tx_test.go +++ b/precompiles/outposts/stride/tx_test.go @@ -7,6 +7,8 @@ import ( "fmt" "math/big" + "github.com/evmos/evmos/v16/precompiles/erc20" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/evmos/evmos/v16/utils" @@ -27,7 +29,6 @@ func (s *PrecompileTestSuite) TestLiquidStake() { tokenPair, ok := s.network.App.Erc20Keeper.GetTokenPair(s.network.GetContext(), denomID) s.Require().True(ok, "expected token pair to be found") - //nolint:dupl //test case testCases := []struct { name string malleate func() []interface{} @@ -62,7 +63,7 @@ func (s *PrecompileTestSuite) TestLiquidStake() { }, 200000, true, - "token pair not found", + "unsupported token", }, { "fail - unsupported token", @@ -80,7 +81,7 @@ func (s *PrecompileTestSuite) TestLiquidStake() { }, 200000, true, - "The only supported token contract for Stride Outpost v1 is 0x80b5a32E4F032B2a058b4F29EC95EEfEEB87aDcd", + "unsupported token", }, { "fail - invalid strideForwarder address (not a stride address)", @@ -126,7 +127,7 @@ func (s *PrecompileTestSuite) TestLiquidStake() { ChannelID: channelID, Sender: s.keyring.GetAddr(0), Receiver: s.keyring.GetAddr(0), - Token: common.HexToAddress(tokenPair.Erc20Address), + Token: common.HexToAddress(erc20.WEVMOSContractTestnet), Amount: big.NewInt(1e18), StrideForwarder: "stride1rhe5leyt5w0mcwd9rpp93zqn99yktsxvyaqgd0", }, @@ -167,7 +168,6 @@ func (s *PrecompileTestSuite) TestRedeem() { tokenPair, ok := s.network.App.Erc20Keeper.GetTokenPair(s.network.GetContext(), denomID) s.Require().True(ok, "expected token pair to be found") - //nolint:dupl //test case testCases := []struct { name string malleate func() []interface{} @@ -223,7 +223,7 @@ func (s *PrecompileTestSuite) TestRedeem() { "The only supported token contract for Stride Outpost v1 is 0xd567B3d7B8FE3C79a1AD8dA978812cfC4Fa05e75", }, { - "fail - invalid stride forwarder address (not a stride address)", + "fail - invalid receiver address (not a stride address)", func() []interface{} { return []interface{}{ stride.AutopilotArgs{ @@ -266,7 +266,7 @@ func (s *PrecompileTestSuite) TestRedeem() { ChannelID: channelID, Sender: s.keyring.GetAddr(0), Receiver: s.keyring.GetAddr(0), - Token: common.HexToAddress(tokenPair.Erc20Address), + Token: common.HexToAddress(tokenPair.GetErc20Address()), Amount: big.NewInt(1e18), StrideForwarder: "stride1rhe5leyt5w0mcwd9rpp93zqn99yktsxvyaqgd0", }, diff --git a/precompiles/outposts/stride/types.go b/precompiles/outposts/stride/types.go index e1f6e9855e..0b628a8058 100644 --- a/precompiles/outposts/stride/types.go +++ b/precompiles/outposts/stride/types.go @@ -59,12 +59,12 @@ type RawPacketMetadata struct { // AutopilotArgs is the arguments struct for the LiquidStake and RedeemStake methods type AutopilotArgs struct { - ChannelID string - Sender common.Address - Token common.Address - Receiver common.Address - Amount *big.Int - StrideForwarder string + ChannelID string `abi:"channelID"` + Sender common.Address `abi:"sender"` + Receiver common.Address `abi:"receiver"` + Token common.Address `abi:"token"` + Amount *big.Int `abi:"amount"` + StrideForwarder string `abi:"strideForwarder"` } // AutopilotPayload is the payload struct for the LiquidStake and RedeemStake method diff --git a/tests/nix_tests/configs/allow-wevmos-register.patch b/tests/nix_tests/configs/allow-wevmos-register.patch deleted file mode 100644 index 1c2954ff2f..0000000000 --- a/tests/nix_tests/configs/allow-wevmos-register.patch +++ /dev/null @@ -1,20 +0,0 @@ -diff --git a/x/erc20/types/proposal.go b/x/erc20/types/proposal.go -index 87d4e4b9..ce8ad49f 100644 ---- a/x/erc20/types/proposal.go -+++ b/x/erc20/types/proposal.go -@@ -73,12 +73,9 @@ func (rtbp *RegisterCoinProposal) ValidateBasic() error { - return err - } - -- // Prohibit denominations that contain the evm denom -- if strings.Contains(metadata.Base, "evm") { -- return errorsmod.Wrapf( -- ErrEVMDenom, "cannot register the EVM denomination %s", metadata.Base, -- ) -- } -+ // EVM denomination check is removed in this patch -+ // to allow the registration of the WEVMOS token -+ // (erc20 representation of the 'aevmos' coin) - - if err := ibctransfertypes.ValidateIBCDenom(metadata.Base); err != nil { - return err diff --git a/tests/nix_tests/configs/osmosis-outpost.jsonnet b/tests/nix_tests/configs/osmosis-outpost.jsonnet index 76aa98f214..d9b2dbc434 100644 --- a/tests/nix_tests/configs/osmosis-outpost.jsonnet +++ b/tests/nix_tests/configs/osmosis-outpost.jsonnet @@ -9,6 +9,18 @@ config { 'enable': true, }, }, + 'genesis'+: { + 'app_state'+: { + erc20: { + 'token_pairs': [{ + 'erc20_address': '0x5db67696C3c088DfBf588d3dd849f44266ff0ffa', + 'denom': 'ibc/ED07A3391A112B175915CD8FAF43A2DA8E4790EDE12566649D0C2F97716B8518', + 'enabled': true, + 'contract_owner': 1, + }], + }, + }, + }, }, 'osmosis-1': { cmd: 'osmosisd', diff --git a/tests/nix_tests/test_osmosis_outpost.py b/tests/nix_tests/test_osmosis_outpost.py index c6c4a6c160..6d95009a9b 100644 --- a/tests/nix_tests/test_osmosis_outpost.py +++ b/tests/nix_tests/test_osmosis_outpost.py @@ -1,6 +1,7 @@ import json import pytest +from web3 import Web3 from .ibc_utils import ( EVMOS_IBC_DENOM, @@ -15,6 +16,7 @@ KEYS, OSMOSIS_POOLS, WASM_CONTRACTS, + WEVMOS_ADDRESS, approve_proposal, erc20_balance, eth_to_bech32, @@ -24,9 +26,13 @@ send_transaction, wait_for_cosmos_tx_receipt, wait_for_fn, - wrap_evmos, ) +# This contract address is provided in genesis +# as registered token pair. If need to edit this +# do so in 'osmosis-outpost.jsonnet' file +WOSMO_ADDRESS = Web3.toChecksumAddress("0x5db67696C3c088DfBf588d3dd849f44266ff0ffa") + @pytest.fixture(scope="module", params=["evmos"]) def ibc(request, tmp_path_factory): @@ -57,16 +63,9 @@ def test_osmosis_swap(ibc): xcs_contract = setup_osmos_chains(ibc) - # --------- Register Evmos token (this could be wrapevmos I think) - wevmos_addr = wrap_evmos(ibc.chains["evmos"], evmos_addr, amt) - # --------- Transfer Osmo to Evmos transfer_osmo_to_evmos(ibc, osmosis_addr, evmos_addr) - # --------- Register Osmosis ERC20 token - osmo_erc20_addr = register_osmo_token(evmos) - print(f"osmo_erc20_addr: {osmo_erc20_addr}") - # define TWAP parameters testSlippagePercentage = 20 testWindowSeconds = 10 @@ -79,8 +78,8 @@ def test_osmosis_swap(ibc): "channelID": "channel-0", "xcsContract": xcs_contract, "sender": evmos_addr, - "input": wevmos_addr, - "output": osmo_erc20_addr, + "input": WEVMOS_ADDRESS, + "output": WOSMO_ADDRESS, "amount": amt, "slippagePercentage": testSlippagePercentage, "windowSeconds": testWindowSeconds, @@ -97,18 +96,19 @@ def test_osmosis_swap(ibc): # check balance increase after swap new_erc20_balance = 0 + # the account has 200 uosmo transferred in the setup + # function transfer_osmo_to_evmos + initial_erc20_balance = 200 def check_erc20_balance_change(): nonlocal new_erc20_balance - new_erc20_balance = erc20_balance(w3, osmo_erc20_addr, evmos_addr) + new_erc20_balance = erc20_balance(w3, WOSMO_ADDRESS, evmos_addr) print(f"uosmo erc20 balance: {new_erc20_balance}") - return new_erc20_balance > 0 + return new_erc20_balance > initial_erc20_balance wait_for_fn("balance change", check_erc20_balance_change) - # the account has 200 uosmo IBC coins from the setup - # previous to registering the uosmo token pair - exp_final_balance = 200 + exp_swap_amount + exp_final_balance = initial_erc20_balance + exp_swap_amount assert new_erc20_balance == exp_final_balance @@ -234,9 +234,12 @@ def transfer_osmo_to_evmos(ibc, src_addr, dst_addr): new_dst_balance = 0 + # Osmo is registered as token pair since genesis. + # Check the ERC20 contract balance def check_balance_change(): nonlocal new_dst_balance - new_dst_balance = get_balance(dst_chain, bech_dst, OSMO_IBC_DENOM) + new_dst_balance = erc20_balance(dst_chain.w3, WOSMO_ADDRESS, dst_addr) + print(f"uosmo erc20 balance: {new_dst_balance}") return old_dst_balance != new_dst_balance wait_for_fn("balance change", check_balance_change) @@ -281,11 +284,13 @@ def register_osmo_token(evmos): print("proposal id: ", proposal_id) # vote 'yes' on proposal and wait it to pass approve_proposal(evmos, proposal_id) - # query token pairs and get WEVMOS address + # query token pairs and get contract address pairs = evmos_cli.get_token_pairs() - assert len(pairs) == 2 - assert pairs[1]["denom"] == osmos_ibc_denom - return pairs[1]["erc20_address"] + assert len(pairs) == 1, "expected exactly one token pair to be registered" + assert ( + pairs[0]["denom"] == osmos_ibc_denom + ), "expected the registered token pair to be the Osmosis IBC coin" + return pairs[0]["erc20_address"] def deploy_wasm_contract(osmosis_cli, deployer_addr, contract_file, init_args, label): diff --git a/tests/nix_tests/test_stride_outpost.py b/tests/nix_tests/test_stride_outpost.py index 1fce6a3eed..a63456fbdd 100644 --- a/tests/nix_tests/test_stride_outpost.py +++ b/tests/nix_tests/test_stride_outpost.py @@ -4,12 +4,11 @@ from .utils import ( ADDRS, KEYS, - erc20_balance, + WEVMOS_ADDRESS, get_precompile_contract, register_host_zone, send_transaction, wait_for_fn, - wrap_evmos, ) @@ -21,7 +20,6 @@ def ibc(request, tmp_path_factory): path = tmp_path_factory.mktemp(name) # specify the custom_scenario # to patch evmos to use channel-0 for Stride outpost - # and allow to register WEVMOS token network = prepare_network(path, name, [evmos_build, "stride"]) yield from network @@ -39,12 +37,6 @@ def test_liquid_stake(ibc): st_token = "staevmos" amt = 1000000000000000000 - # ATM is not required to have WEVMOS balance to be able to - # liquid stake. It will deduct 'aevmos' coins instead of WEVMOS. - # We still need to register the token pair tho. - # This is done in this function - wevmos_addr = wrap_evmos(ibc.chains["evmos"], sender_addr, amt) - dst_addr = ibc.chains["stride"].cosmos_cli().address("signer2") # need to register evmos chain as host zone in stride @@ -70,7 +62,7 @@ def test_liquid_stake(ibc): "sender": sender_addr, "receiver": sender_addr, "strideForwarder": dst_addr, - "token": wevmos_addr, + "token": WEVMOS_ADDRESS, "amount": amt, } tx = pc.functions.liquidStake(liquid_stake_params).build_transaction( @@ -100,8 +92,6 @@ def check_balance_change(): wait_for_fn("balance change", check_balance_change) assert old_dst_balance + amt == new_dst_balance new_src_balance = get_balance(ibc.chains["evmos"], src_addr, src_denom) - wevmos_balance = erc20_balance(ibc.chains["evmos"].w3, wevmos_addr, sender_addr) - # FIXME For better UX, the 'amt' should be deducted - # from WEVMOS balance instead of the native coin 'aevmos' + # NOTE the 'amt' is deducted from the 'aevmos' native coin + # not from WEVMOS balance assert old_src_balance - amt - fee == new_src_balance - assert wevmos_balance == amt diff --git a/tests/nix_tests/utils.py b/tests/nix_tests/utils.py index f3292e4393..2561b164ca 100644 --- a/tests/nix_tests/utils.py +++ b/tests/nix_tests/utils.py @@ -16,6 +16,7 @@ from eth_account import Account from hexbytes import HexBytes from pystarport.cluster import SUPERVISOR_CONFIG_FILE +from web3 import Web3 from web3._utils.transactions import fill_nonce, fill_transaction_defaults from web3.exceptions import TimeExhausted @@ -31,6 +32,7 @@ ADDRS = {name: account.address for name, account in ACCOUNTS.items()} EVMOS_ADDRESS_PREFIX = "evmos" DEFAULT_DENOM = "aevmos" +WEVMOS_ADDRESS = Web3.toChecksumAddress("0xcc491f589b45d4a3c679016195b3fb87d7848210") TEST_CONTRACTS = { "TestERC20A": "TestERC20A.sol", "Greeter": "Greeter.sol", @@ -59,18 +61,6 @@ "Swaprouter": "swaprouter.wasm", } -WEVMOS_META = { - "description": "The native staking and governance token of the Evmos chain", - "denom_units": [ - {"denom": "aevmos", "exponent": 0, "aliases": ["aevmos"]}, - {"denom": "WEVMOS", "exponent": 18}, - ], - "base": "aevmos", - "display": "WEVMOS", - "name": "Wrapped EVMOS", - "symbol": "WEVMOS", -} - def wasm_binaries_path(filename): return Path(__file__).parent / "cosmwasm/artifacts/" / filename @@ -545,61 +535,6 @@ def inner(path, base_port, config): return inner -def register_wevmos(evmos): - """ - this helper function registers the WEVMOS - token in the ERC20 module and returns the contract address. - Make sure to patch the evmosd binary with the allow-wevmos-register patch - for this to be successful - """ - cli = evmos.cosmos_cli() - proposal = { - "title": "Register WEVMOS", - "description": "EVMOS erc20 representation", - "metadata": [WEVMOS_META], - "deposit": "1aevmos", - } - proposal_id = register_ibc_coin(cli, proposal) - assert ( - int(proposal_id) > 0 - ), "expected a non-zero proposal ID for the registration of the WEVMOS token." - # vote 'yes' on proposal and wait it to pass - approve_proposal(evmos, proposal_id) - - # query token pairs and get WEVMOS address - pairs = cli.get_token_pairs() - assert len(pairs) == 1 - assert pairs[0]["denom"] == "aevmos" - - return pairs[0]["erc20_address"] - - -def wrap_evmos(evmos, addr, amt): - """ - Helper function that registers WEVMOS token - and wraps the specified amount - for the provided Ethereum address - Returns the WEVMOS contract address - """ - cli = evmos.cosmos_cli() - # submit proposal to register WEVMOS - wevmos_addr = register_wevmos(evmos) - - # convert 'aevmos' to WEVMOS (wrap) - rsp = cli.convert_coin(f"{amt}aevmos", eth_to_bech32(addr), gas=2000000) - assert rsp["code"] == 0, rsp["raw_log"] - wait_for_new_blocks(cli, 2) - txhash = rsp["txhash"] - receipt = cli.tx_search_rpc(f"tx.hash='{txhash}'")[0] - assert receipt["tx_result"]["code"] == 0 - - # check the desired amt was wrapped - wevmos_balance = erc20_balance(evmos.w3, wevmos_addr, addr) - assert wevmos_balance == amt - - return wevmos_addr - - def erc20_balance(w3, erc20_contract_addr, addr): info = json.loads(CONTRACTS["IERC20"].read_text()) contract = w3.eth.contract(erc20_contract_addr, abi=info["abi"]) diff --git a/testutil/integration/evmos/utils/unit.go b/testutil/integration/evmos/utils/unit.go index cffe01a505..21e3085a2b 100644 --- a/testutil/integration/evmos/utils/unit.go +++ b/testutil/integration/evmos/utils/unit.go @@ -76,7 +76,7 @@ func RegisterEvmosERC20Coins( // like registering the denom trace in the transfer keeper and minting the token // with the bank. Returns the TokenPair or an error. func RegisterIBCERC20Coins( - network network.UnitTestNetwork, + network *network.UnitTestNetwork, tokenReceiver sdk.AccAddress, denomTrace transfertypes.DenomTrace, ) (erc20types.TokenPair, error) { diff --git a/x/evm/keeper/precompiles.go b/x/evm/keeper/precompiles.go index 78bfc972db..3b39be957b 100644 --- a/x/evm/keeper/precompiles.go +++ b/x/evm/keeper/precompiles.go @@ -8,6 +8,8 @@ import ( "fmt" "sort" + "github.com/evmos/evmos/v16/utils" + "github.com/evmos/evmos/v16/precompiles/bech32" "github.com/ethereum/go-ethereum/common" @@ -22,6 +24,7 @@ import ( channelkeeper "github.com/cosmos/ibc-go/v7/modules/core/04-channel/keeper" bankprecompile "github.com/evmos/evmos/v16/precompiles/bank" distprecompile "github.com/evmos/evmos/v16/precompiles/distribution" + erc20precompile "github.com/evmos/evmos/v16/precompiles/erc20" ics20precompile "github.com/evmos/evmos/v16/precompiles/ics20" osmosisoutpost "github.com/evmos/evmos/v16/precompiles/outposts/osmosis" strideoutpost "github.com/evmos/evmos/v16/precompiles/outposts/stride" @@ -36,6 +39,7 @@ import ( // AvailablePrecompiles returns the list of all available precompiled contracts. // NOTE: this should only be used during initialization of the Keeper. func AvailablePrecompiles( + chainID string, stakingKeeper stakingkeeper.Keeper, distributionKeeper distributionkeeper.Keeper, bankKeeper bankkeeper.Keeper, @@ -81,7 +85,15 @@ func AvailablePrecompiles( panic(fmt.Errorf("failed to instantiate bank precompile: %w", err)) } + var WEVMOSAddress common.Address + if utils.IsMainnet(chainID) { + WEVMOSAddress = common.HexToAddress(erc20precompile.WEVMOSContractMainnet) + } else { + WEVMOSAddress = common.HexToAddress(erc20precompile.WEVMOSContractTestnet) + } + strideOutpost, err := strideoutpost.NewPrecompile( + WEVMOSAddress, transferKeeper, erc20Keeper, authzKeeper, @@ -92,6 +104,7 @@ func AvailablePrecompiles( } osmosisOutpost, err := osmosisoutpost.NewPrecompile( + WEVMOSAddress, authzKeeper, bankKeeper, transferKeeper, From e69abb02cfd6ebf3621ccb495bf5e8d3cac64d68 Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Wed, 3 Jan 2024 17:07:30 +0100 Subject: [PATCH 051/345] chore(upgrade): enable burning the usage incentives pool in the v16 handler (#2221) * enable burning the usage incentives pool in the v16 handler * add changelog entry --- CHANGELOG.md | 1 + app/upgrades/v16/upgrades.go | 9 ++++----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 88fc22ec8b..7920ad7489 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -58,6 +58,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (erc20) [#2157] (https://github.com/evmos/evmos/pull/2157) Remove `RegisterCoinProposal` logic, protos and related tests. - (osmosis-outpost) [#2206](https://github.com/evmos/evmos/pull/2206) Update swap function input to custom struct. - (stride-outpost) [#2207](https://github.com/evmos/evmos/pull/2207) Update Stride Outpost to include additional arguments. +- (incentives) [#2221](https://github.com/evmos/evmos/pull/2221) Burn the usage incentives pool balance during v16 upgrade. ### API Breaking diff --git a/app/upgrades/v16/upgrades.go b/app/upgrades/v16/upgrades.go index a830f842d6..67ca2ddcbe 100644 --- a/app/upgrades/v16/upgrades.go +++ b/app/upgrades/v16/upgrades.go @@ -23,7 +23,7 @@ func CreateUpgradeHandler( mm *module.Manager, configurator module.Configurator, ek *evmkeeper.Keeper, - _ bankkeeper.Keeper, + bk bankkeeper.Keeper, inflationKeeper inflationkeeper.Keeper, ak authkeeper.AccountKeeper, gk govkeeper.Keeper, @@ -53,10 +53,9 @@ func CreateUpgradeHandler( logger.Error("failed to migrate the fee collector", "error", err.Error()) } - // TODO: uncomment when ready - // if err := BurnUsageIncentivesPool(ctx, bankKeeper); err != nil { - // logger.Error("failed to burn inflation pool", "error", err.Error()) - // } + if err := BurnUsageIncentivesPool(ctx, bk); err != nil { + logger.Error("failed to burn inflation pool", "error", err.Error()) + } if err := UpdateInflationParams(ctx, inflationKeeper); err != nil { logger.Error("failed to update inflation params", "error", err.Error()) From 56e062b0b2c73302c9b08e5fe4d9d74261fb6849 Mon Sep 17 00:00:00 2001 From: Vladislav Varadinov Date: Wed, 3 Jan 2024 18:30:49 +0200 Subject: [PATCH 052/345] fix(outpost): Add comments to structs and ValidateBasic condition (#2223) * fix(outpost): Add comments to structs and ValidateBasic condition * fix: format, lint and changelog * Update precompiles/outposts/stride/IStrideOutpost.sol Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> --------- Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> --- CHANGELOG.md | 1 + .../outposts/osmosis/IOsmosisOutpost.sol | 10 ++++++++++ precompiles/outposts/osmosis/types.go | 18 +++++++++--------- precompiles/outposts/stride/IStrideOutpost.sol | 6 +++++- precompiles/outposts/stride/errors.go | 2 ++ precompiles/outposts/stride/types.go | 17 +++++++++++------ 6 files changed, 38 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7920ad7489..ce88a4279d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -150,6 +150,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (outposts) [#2215](https://github.com/evmos/evmos/pull/2215) backport handle cases for input and output denoms without token pair lookup - (cli) [#2212](https://github.com/evmos/evmos/pull/2212) Remove ValidateBasic in cli. - (swagger) [#2219](https://github.com/evmos/evmos/pull/2219) Update Swagger configuration to remove outdated entries and update vesting module version. +- (outposts) [#2223](https://github.com/evmos/evmos/pull/2223) Update Outposts struct documentation and `ValidateBasic`. ### Bug Fixes diff --git a/precompiles/outposts/osmosis/IOsmosisOutpost.sol b/precompiles/outposts/osmosis/IOsmosisOutpost.sol index f3407c9267..eb97d0e6d7 100644 --- a/precompiles/outposts/osmosis/IOsmosisOutpost.sol +++ b/precompiles/outposts/osmosis/IOsmosisOutpost.sol @@ -15,6 +15,16 @@ string constant DEFAULT_TWAP_SLIPPAGE_PERCENTAGE = "10"; uint64 constant DEFAULT_TWAP_WINDOW_SECONDS = 30; /// @dev The SwapParams struct contains the parameters of an Osmosis swap. +/// @param channelID - The channel ID of the IBC channel between the Evmos and Osmosis chains. +/// @param xcsContract - The address of the XCS contract on the Osmosis chain. +/// @param sender - The address on the Evmos chain that will swap tokens. +/// @param input - The address of the ERC-20 token contract that will be swapped for. +/// @param output - The address of the ERC-20 token contract that will be swapped to (received). +/// @param amount - The amount of input tokens to be swapped. +/// @param slippagePercentage - The slippage percentage of the swap. +/// @param windowSeconds - The window seconds of the swap. +/// @param swapReceiver - The bech32-formatted address of the receiver of the newly swapped +/// tokens. It can be only an address on the Evmos chain. struct SwapParams { string channelID; string xcsContract; diff --git a/precompiles/outposts/osmosis/types.go b/precompiles/outposts/osmosis/types.go index b357c481fd..998635eb6f 100644 --- a/precompiles/outposts/osmosis/types.go +++ b/precompiles/outposts/osmosis/types.go @@ -305,15 +305,15 @@ func ValidateOsmosisContractAddress(contractAddress string) (err error) { // SwapPacketData is a utility structure used to wrap args received by the // Solidity interface of the Swap function. type SwapPacketData struct { - ChannelID string `abi:"channelID"` - XcsContract string `abi:"xcsContract"` - Sender common.Address `abi:"sender"` - Input common.Address `abi:"input"` - Output common.Address `abi:"output"` - Amount *big.Int `abi:"amount"` - SlippagePercentage uint8 `abi:"slippagePercentage"` - WindowSeconds uint64 `abi:"windowSeconds"` - SwapReceiver string `abi:"swapReceiver"` + ChannelID string `abi:"channelID"` // the channel ID for the ICS20 transfer + XcsContract string `abi:"xcsContract"` // the address of the Osmosis CosmWasm contract + Sender common.Address `abi:"sender"` // the sender of the swap transaction + Input common.Address `abi:"input"` // the input token to be swapped + Output common.Address `abi:"output"` // the output token to be swapped + Amount *big.Int `abi:"amount"` // the amount to be swapped + SlippagePercentage uint8 `abi:"slippagePercentage"` // the slippage percentage for the swap + WindowSeconds uint64 `abi:"windowSeconds"` // the window seconds for the swap + SwapReceiver string `abi:"swapReceiver"` // the receiver of the swapped amount } // SwapPayload is the same as the expected input of the Swap function in the Solidity interface. diff --git a/precompiles/outposts/stride/IStrideOutpost.sol b/precompiles/outposts/stride/IStrideOutpost.sol index 79a898d470..febeba3d2b 100644 --- a/precompiles/outposts/stride/IStrideOutpost.sol +++ b/precompiles/outposts/stride/IStrideOutpost.sol @@ -11,8 +11,12 @@ IStrideOutpost constant STRIDE_OUTPOST_CONTRACT = IStrideOutpost( STRIDE_OUTPOST_ADDRESS ); -/// @dev AutopilotParams is a struct containing the parameters for a liquid stake and redeem transactions. +/// @dev AutopilotParams is a struct containing the parameters for the liquid stake and redeem transactions. +/// @param channelID - The channel ID of the IBC channel that will be used to execute the transaction. +/// @param sender - The address on the Evmos chain that will liquid stake or send LSD. /// @param receiver - The address on the Evmos chain that will redeem or receive LSD. +/// @param token - The address of the ERC-20 token pair that will be liquid staked or redeemed. +/// @param amount - The amount of tokens that will be liquid staked or redeemed. /// @param strideForwarder - The bech32-formatted address on the Stride chain that will be used to execute /// LiquidStake or Redeem transactions. struct AutopilotParams { diff --git a/precompiles/outposts/stride/errors.go b/precompiles/outposts/stride/errors.go index e012a69b96..2f97246873 100644 --- a/precompiles/outposts/stride/errors.go +++ b/precompiles/outposts/stride/errors.go @@ -15,4 +15,6 @@ const ( ErrEmptyReceiver = "receiver cannot be empty" // ErrEmptyAutopilotAction is the error returned when the autopilot action is empty ErrEmptyAutopilotAction = "autopilot action cannot be empty" + // ErrZeroOrNegativeAmount is the error returned when the amount is zero or negative + ErrZeroOrNegativeAmount = "amount must be greater than zero" ) diff --git a/precompiles/outposts/stride/types.go b/precompiles/outposts/stride/types.go index 0b628a8058..5a8d274001 100644 --- a/precompiles/outposts/stride/types.go +++ b/precompiles/outposts/stride/types.go @@ -59,12 +59,12 @@ type RawPacketMetadata struct { // AutopilotArgs is the arguments struct for the LiquidStake and RedeemStake methods type AutopilotArgs struct { - ChannelID string `abi:"channelID"` - Sender common.Address `abi:"sender"` - Receiver common.Address `abi:"receiver"` - Token common.Address `abi:"token"` - Amount *big.Int `abi:"amount"` - StrideForwarder string `abi:"strideForwarder"` + ChannelID string `abi:"channelID"` // the channel ID for the ICS20 transfer + Sender common.Address `abi:"sender"` // the sender of the liquid stake or redeem transaction + Receiver common.Address `abi:"receiver"` // the receiver of the LSD token or the redeemed token + Token common.Address `abi:"token"` // the token to be liquid staked or redeemed + Amount *big.Int `abi:"amount"` // the amount to be liquid staked or redeemed + StrideForwarder string `abi:"strideForwarder"` // the stride forwarder address } // AutopilotPayload is the payload struct for the LiquidStake and RedeemStake method @@ -96,6 +96,11 @@ func (a AutopilotArgs) ValidateBasic() error { if err != nil { return sdkerrors.ErrInvalidAddress.Wrapf("invalid stride bech32 address: %s", err) } + + if a.Amount.Sign() <= 0 { + return fmt.Errorf(ErrZeroOrNegativeAmount) + } + return nil } From 7821cb86cf7e70a78507f71c79550a9d436276c0 Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Thu, 4 Jan 2024 15:51:28 +0100 Subject: [PATCH 053/345] chore(p256): adjust p256 precompile address (#2228) * adjust p256 precompile address * add changelog entry * move changelog entry to improvements --- CHANGELOG.md | 1 + precompiles/p256/p256.go | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ce88a4279d..c8830bd1c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -151,6 +151,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (cli) [#2212](https://github.com/evmos/evmos/pull/2212) Remove ValidateBasic in cli. - (swagger) [#2219](https://github.com/evmos/evmos/pull/2219) Update Swagger configuration to remove outdated entries and update vesting module version. - (outposts) [#2223](https://github.com/evmos/evmos/pull/2223) Update Outposts struct documentation and `ValidateBasic`. +- (p256-precompile) [#2228](https://github.com/evmos/evmos/pull/2228) Adjust p256 precompile address from `0x0b` to `0x100`. ### Bug Fixes diff --git a/precompiles/p256/p256.go b/precompiles/p256/p256.go index 46fda76579..26a0686560 100644 --- a/precompiles/p256/p256.go +++ b/precompiles/p256/p256.go @@ -13,6 +13,7 @@ // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . + package p256 import ( @@ -33,7 +34,7 @@ const ( ) // PrecompileAddress defines the hex address of the p256 precompiled contract. -const PrecompileAddress = "0x000000000000000000000000000000000000000b" +const PrecompileAddress = "0x0000000000000000000000000000000000000100" // Precompile secp256r1 (P256) signature verification // implemented as a native contract as per EIP-7212. From 0be8f3e6f6d030f73620051f53ae6e4cf608d916 Mon Sep 17 00:00:00 2001 From: Victor Pham Date: Thu, 4 Jan 2024 22:00:06 +0700 Subject: [PATCH 054/345] fix(swagger): use correct version of proto dependencies to generate swagger (#2218) * use correct version of proto dependencies * update CHANGELOG.md * run make proto-swagger-gen --------- Co-authored-by: MalteHerrmann Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> --- CHANGELOG.md | 1 + Makefile | 18 +- client/docs/swagger-ui/swagger.json | 2461 +++------------------------ 3 files changed, 280 insertions(+), 2200 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c8830bd1c1..78840086fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -160,6 +160,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (test) [#1989](https://github.com/evmos/evmos/pull/1989) Fix the problem about deliverTxSimulate in test app/ante/cosmos/min_price_test.go - (db) [#2072](https://github.com/evmos/evmos/pull/2072) Change VersionDb directory permission from 777 (insecure) to 750 (general) - (api) [#2196](https://github.com/evmos/evmos/pull/2196) Remove governance proposals related to the deprecated `x/incentives` module to fix the governance proposals query. +- (swagger) [#2218](https://github.com/evmos/evmos/pull/2218) Use correct version of proto dependencies to generate swagger ## [v15.0.0] - 2023-10-31 diff --git a/Makefile b/Makefile index 2a2cd762ef..359974f285 100644 --- a/Makefile +++ b/Makefile @@ -27,6 +27,12 @@ DOCKER_TAG := $(COMMIT_HASH) MOUNT_PATH := $(shell pwd)/build/:/root/ E2E_SKIP_CLEANUP := false ROCKSDB_VERSION ?= "8.8.1" +# Deps +DEPS_COSMOS_SDK_VERSION := $(shell cat go.sum | grep 'github.com/evmos/cosmos-sdk' | grep -v -e 'go.mod' | tail -n 1 | awk '{ print $$2; }') +DEPS_IBC_GO_VERSION := $(shell cat go.sum | grep 'github.com/cosmos/ibc-go' | grep -v -e 'go.mod' | tail -n 1 | awk '{ print $$2; }') +DEPS_COSMOS_PROTO := $(shell cat go.sum | grep 'github.com/cosmos/cosmos-proto' | grep -v -e 'go.mod' | tail -n 1 | awk '{ print $$2; }') +DEPS_COSMOS_GOGOPROTO := $(shell cat go.sum | grep 'github.com/cosmos/gogoproto' | grep -v -e 'go.mod' | tail -n 1 | awk '{ print $$2; }') +DEPS_COSMOS_ICS23 := go/$(shell cat go.sum | grep 'github.com/cosmos/ics23/go' | grep -v -e 'go.mod' | tail -n 1 | awk '{ print $$2; }') export GO111MODULE = on @@ -450,10 +456,10 @@ proto-download-deps: mkdir -p "$(THIRD_PARTY_DIR)/cosmos_tmp" && \ cd "$(THIRD_PARTY_DIR)/cosmos_tmp" && \ git init && \ - git remote add origin "https://github.com/cosmos/cosmos-sdk.git" && \ + git remote add origin "https://github.com/evmos/cosmos-sdk.git" && \ git config core.sparseCheckout true && \ printf "proto\nthird_party\n" > .git/info/sparse-checkout && \ - git pull origin main && \ + git pull origin "$(DEPS_COSMOS_SDK_VERSION)" && \ rm -f ./proto/buf.* && \ mv ./proto/* .. rm -rf "$(THIRD_PARTY_DIR)/cosmos_tmp" @@ -464,7 +470,7 @@ proto-download-deps: git remote add origin "https://github.com/cosmos/ibc-go.git" && \ git config core.sparseCheckout true && \ printf "proto\n" > .git/info/sparse-checkout && \ - git pull origin main && \ + git pull origin "$(DEPS_IBC_GO_VERSION)" && \ rm -f ./proto/buf.* && \ mv ./proto/* .. rm -rf "$(THIRD_PARTY_DIR)/ibc_tmp" @@ -475,20 +481,20 @@ proto-download-deps: git remote add origin "https://github.com/cosmos/cosmos-proto.git" && \ git config core.sparseCheckout true && \ printf "proto\n" > .git/info/sparse-checkout && \ - git pull origin main && \ + git pull origin "$(DEPS_COSMOS_PROTO_VERSION)" && \ rm -f ./proto/buf.* && \ mv ./proto/* .. rm -rf "$(THIRD_PARTY_DIR)/cosmos_proto_tmp" mkdir -p "$(THIRD_PARTY_DIR)/gogoproto" && \ - curl -SSL https://raw.githubusercontent.com/cosmos/gogoproto/main/gogoproto/gogo.proto > "$(THIRD_PARTY_DIR)/gogoproto/gogo.proto" + curl -SSL "https://raw.githubusercontent.com/cosmos/gogoproto/$(DEPS_COSMOS_GOGOPROTO)/gogoproto/gogo.proto" > "$(THIRD_PARTY_DIR)/gogoproto/gogo.proto" mkdir -p "$(THIRD_PARTY_DIR)/google/api" && \ curl -sSL https://raw.githubusercontent.com/googleapis/googleapis/master/google/api/annotations.proto > "$(THIRD_PARTY_DIR)/google/api/annotations.proto" curl -sSL https://raw.githubusercontent.com/googleapis/googleapis/master/google/api/http.proto > "$(THIRD_PARTY_DIR)/google/api/http.proto" mkdir -p "$(THIRD_PARTY_DIR)/cosmos/ics23/v1" && \ - curl -sSL https://raw.githubusercontent.com/cosmos/ics23/master/proto/cosmos/ics23/v1/proofs.proto > "$(THIRD_PARTY_DIR)/cosmos/ics23/v1/proofs.proto" + curl -sSL "https://raw.githubusercontent.com/cosmos/ics23/$(DEPS_COSMOS_ICS23)/proto/cosmos/ics23/v1/proofs.proto" > "$(THIRD_PARTY_DIR)/cosmos/ics23/v1/proofs.proto" .PHONY: proto-all proto-gen proto-format proto-lint proto-check-breaking proto-swagger-gen diff --git a/client/docs/swagger-ui/swagger.json b/client/docs/swagger-ui/swagger.json index 0134fcd886..5c0fcdba3f 100644 --- a/client/docs/swagger-ui/swagger.json +++ b/client/docs/swagger-ui/swagger.json @@ -4618,7 +4618,7 @@ }, { "name": "latest_height", - "description": "latest_height overrides the height field and queries the latest stored\nConsensusState.", + "description": "latest_height overrrides the height field and queries the latest stored\nConsensusState.", "in": "query", "required": false, "type": "boolean" @@ -4976,7 +4976,7 @@ "title": "list of features compatible with the specified identifier" } }, - "description": "Version defines the versioning scheme used to negotiate the IBC version in\nthe connection handshake." + "description": "Version defines the versioning scheme used to negotiate the IBC verison in\nthe connection handshake." }, "title": "IBC version which can be utilised to determine encodings or protocols for\nchannels or packets utilising this connection" }, @@ -5181,7 +5181,7 @@ "title": "list of features compatible with the specified identifier" } }, - "description": "Version defines the versioning scheme used to negotiate the IBC version in\nthe connection handshake." + "description": "Version defines the versioning scheme used to negotiate the IBC verison in\nthe connection handshake." }, "description": "IBC version which can be utilised to determine encodings or protocols for\nchannels or packets utilising this connection." }, @@ -5631,12 +5631,10 @@ "STATE_INIT", "STATE_TRYOPEN", "STATE_OPEN", - "STATE_CLOSED", - "STATE_FLUSHING", - "STATE_FLUSHCOMPLETE" + "STATE_CLOSED" ], "default": "STATE_UNINITIALIZED_UNSPECIFIED", - "description": "State defines if a channel is in one of the following states:\nCLOSED, INIT, TRYOPEN, OPEN, FLUSHING, FLUSHCOMPLETE or UNINITIALIZED.\n\n - STATE_UNINITIALIZED_UNSPECIFIED: Default State\n - STATE_INIT: A channel has just started the opening handshake.\n - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain.\n - STATE_OPEN: A channel has completed the handshake. Open channels are\nready to send and receive packets.\n - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive\npackets.\n - STATE_FLUSHING: A channel has just accepted the upgrade handshake attempt and is flushing in-flight packets.\n - STATE_FLUSHCOMPLETE: A channel has just completed flushing any in-flight packets." + "description": "State defines if a channel is in one of the following states:\nCLOSED, INIT, TRYOPEN, OPEN or UNINITIALIZED.\n\n - STATE_UNINITIALIZED_UNSPECIFIED: Default State\n - STATE_INIT: A channel has just started the opening handshake.\n - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain.\n - STATE_OPEN: A channel has completed the handshake. Open channels are\nready to send and receive packets.\n - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive\npackets." }, "ordering": { "title": "whether the channel is ordered or unordered", @@ -5681,11 +5679,6 @@ "channel_id": { "type": "string", "title": "channel identifier" - }, - "upgrade_sequence": { - "type": "string", - "format": "uint64", - "title": "upgrade sequence indicates the latest upgrade attempt performed by this channel\nthe value of 0 indicates the channel has never been upgraded" } }, "description": "IdentifiedChannel defines a channel with additional port and channel\nidentifier fields." @@ -5834,12 +5827,10 @@ "STATE_INIT", "STATE_TRYOPEN", "STATE_OPEN", - "STATE_CLOSED", - "STATE_FLUSHING", - "STATE_FLUSHCOMPLETE" + "STATE_CLOSED" ], "default": "STATE_UNINITIALIZED_UNSPECIFIED", - "description": "State defines if a channel is in one of the following states:\nCLOSED, INIT, TRYOPEN, OPEN, FLUSHING, FLUSHCOMPLETE or UNINITIALIZED.\n\n - STATE_UNINITIALIZED_UNSPECIFIED: Default State\n - STATE_INIT: A channel has just started the opening handshake.\n - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain.\n - STATE_OPEN: A channel has completed the handshake. Open channels are\nready to send and receive packets.\n - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive\npackets.\n - STATE_FLUSHING: A channel has just accepted the upgrade handshake attempt and is flushing in-flight packets.\n - STATE_FLUSHCOMPLETE: A channel has just completed flushing any in-flight packets." + "description": "State defines if a channel is in one of the following states:\nCLOSED, INIT, TRYOPEN, OPEN or UNINITIALIZED.\n\n - STATE_UNINITIALIZED_UNSPECIFIED: Default State\n - STATE_INIT: A channel has just started the opening handshake.\n - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain.\n - STATE_OPEN: A channel has completed the handshake. Open channels are\nready to send and receive packets.\n - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive\npackets." }, "ordering": { "title": "whether the channel is ordered or unordered", @@ -5876,11 +5867,6 @@ "version": { "type": "string", "title": "opaque channel version, which is agreed upon during the handshake" - }, - "upgrade_sequence": { - "type": "string", - "format": "uint64", - "title": "upgrade sequence indicates the latest upgrade attempt performed by this channel\nthe value of 0 indicates the channel has never been upgraded" } }, "description": "Channel defines pipeline for exactly-once packet delivery between specific\nmodules on separate blockchains, which has at least one end capable of\nsending packets and one end capable of receiving packets." @@ -6258,106 +6244,7 @@ "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" } }, - "title": "QuerySequenceResponse is the response type for the\nQuery/QueryNextSequenceReceiveResponse RPC method" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "type": "string", - "format": "byte", - "description": "Must be a valid serialized protocol buffer of the above specified type." - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - } - } - } - }, - "parameters": [ - { - "name": "channel_id", - "description": "channel unique identifier", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "port_id", - "description": "port unique identifier", - "in": "path", - "required": true, - "type": "string" - } - ], - "tags": [ - "Query" - ] - } - }, - "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/next_sequence_send": { - "get": { - "summary": "NextSequenceSend returns the next send sequence for a given channel.", - "operationId": "NextSequenceSend", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "type": "object", - "properties": { - "next_sequence_send": { - "type": "string", - "format": "uint64", - "title": "next sequence send number" - }, - "proof": { - "type": "string", - "format": "byte", - "title": "merkle proof of existence" - }, - "proof_height": { - "title": "height at which the proof was retrieved", - "type": "object", - "properties": { - "revision_number": { - "type": "string", - "format": "uint64", - "title": "the revision that the client is currently on" - }, - "revision_height": { - "type": "string", - "format": "uint64", - "title": "the height within the given revision" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - } - }, - "title": "QueryNextSequenceSendResponse is the request type for the\nQuery/QueryNextSequenceSend RPC method" + "title": "QuerySequenceResponse is the request type for the\nQuery/QueryNextSequenceReceiveResponse RPC method" } }, "default": { @@ -7312,269 +7199,6 @@ ] } }, - "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/upgrade": { - "get": { - "summary": "Upgrade returns the upgrade for a given port and channel id.", - "operationId": "Upgrade", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "type": "object", - "properties": { - "upgrade": { - "type": "object", - "properties": { - "fields": { - "type": "object", - "properties": { - "ordering": { - "type": "string", - "enum": [ - "ORDER_NONE_UNSPECIFIED", - "ORDER_UNORDERED", - "ORDER_ORDERED" - ], - "default": "ORDER_NONE_UNSPECIFIED", - "description": "- ORDER_NONE_UNSPECIFIED: zero-value for channel ordering\n - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in\nwhich they were sent.\n - ORDER_ORDERED: packets are delivered exactly in the order which they were sent", - "title": "Order defines if a channel is ORDERED or UNORDERED" - }, - "connection_hops": { - "type": "array", - "items": { - "type": "string" - } - }, - "version": { - "type": "string" - } - }, - "description": "UpgradeFields are the fields in a channel end which may be changed\nduring a channel upgrade." - }, - "timeout": { - "type": "object", - "properties": { - "height": { - "title": "block height after which the packet or upgrade times out", - "type": "object", - "properties": { - "revision_number": { - "type": "string", - "format": "uint64", - "title": "the revision that the client is currently on" - }, - "revision_height": { - "type": "string", - "format": "uint64", - "title": "the height within the given revision" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - }, - "timestamp": { - "type": "string", - "format": "uint64", - "title": "block timestamp (in nanoseconds) after which the packet or upgrade times out" - } - }, - "description": "Timeout defines an execution deadline structure for 04-channel handlers.\nThis includes packet lifecycle handlers as well as the upgrade handshake handlers.\nA valid Timeout contains either one or both of a timestamp and block height (sequence)." - }, - "next_sequence_send": { - "type": "string", - "format": "uint64" - } - }, - "description": "Upgrade is a verifiable type which contains the relevant information\nfor an attempted upgrade. It provides the proposed changes to the channel\nend, the timeout for this upgrade attempt and the next packet sequence\nwhich allows the counterparty to efficiently know the highest sequence it has received.\nThe next sequence send is used for pruning and upgrading from unordered to ordered channels." - }, - "proof": { - "type": "string", - "format": "byte", - "title": "merkle proof of existence" - }, - "proof_height": { - "title": "height at which the proof was retrieved", - "type": "object", - "properties": { - "revision_number": { - "type": "string", - "format": "uint64", - "title": "the revision that the client is currently on" - }, - "revision_height": { - "type": "string", - "format": "uint64", - "title": "the height within the given revision" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - } - }, - "title": "QueryUpgradeResponse is the response type for the QueryUpgradeResponse RPC method" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "type": "string", - "format": "byte", - "description": "Must be a valid serialized protocol buffer of the above specified type." - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - } - } - } - }, - "parameters": [ - { - "name": "channel_id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "port_id", - "in": "path", - "required": true, - "type": "string" - } - ], - "tags": [ - "Query" - ] - } - }, - "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/upgrade_error": { - "get": { - "summary": "UpgradeError returns the error receipt if the upgrade handshake failed.", - "operationId": "UpgradeError", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "type": "object", - "properties": { - "error_receipt": { - "type": "object", - "properties": { - "sequence": { - "type": "string", - "format": "uint64", - "title": "the channel upgrade sequence" - }, - "message": { - "type": "string", - "title": "the error message detailing the cause of failure" - } - }, - "description": "ErrorReceipt defines a type which encapsulates the upgrade sequence and error associated with the\nupgrade handshake failure. When a channel upgrade handshake is aborted both chains are expected to increment to the\nnext sequence." - }, - "proof": { - "type": "string", - "format": "byte", - "title": "merkle proof of existence" - }, - "proof_height": { - "title": "height at which the proof was retrieved", - "type": "object", - "properties": { - "revision_number": { - "type": "string", - "format": "uint64", - "title": "the revision that the client is currently on" - }, - "revision_height": { - "type": "string", - "format": "uint64", - "title": "the height within the given revision" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - } - }, - "title": "QueryUpgradeErrorResponse is the response type for the Query/QueryUpgradeError RPC method" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "type": "string", - "format": "byte", - "description": "Must be a valid serialized protocol buffer of the above specified type." - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - } - } - } - }, - "parameters": [ - { - "name": "channel_id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "port_id", - "in": "path", - "required": true, - "type": "string" - } - ], - "tags": [ - "Query" - ] - } - }, "/ibc/core/channel/v1/connections/{connection}/channels": { "get": { "summary": "ConnectionChannels queries all the channels associated with a connection\nend.", @@ -7598,12 +7222,10 @@ "STATE_INIT", "STATE_TRYOPEN", "STATE_OPEN", - "STATE_CLOSED", - "STATE_FLUSHING", - "STATE_FLUSHCOMPLETE" + "STATE_CLOSED" ], "default": "STATE_UNINITIALIZED_UNSPECIFIED", - "description": "State defines if a channel is in one of the following states:\nCLOSED, INIT, TRYOPEN, OPEN, FLUSHING, FLUSHCOMPLETE or UNINITIALIZED.\n\n - STATE_UNINITIALIZED_UNSPECIFIED: Default State\n - STATE_INIT: A channel has just started the opening handshake.\n - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain.\n - STATE_OPEN: A channel has completed the handshake. Open channels are\nready to send and receive packets.\n - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive\npackets.\n - STATE_FLUSHING: A channel has just accepted the upgrade handshake attempt and is flushing in-flight packets.\n - STATE_FLUSHCOMPLETE: A channel has just completed flushing any in-flight packets." + "description": "State defines if a channel is in one of the following states:\nCLOSED, INIT, TRYOPEN, OPEN or UNINITIALIZED.\n\n - STATE_UNINITIALIZED_UNSPECIFIED: Default State\n - STATE_INIT: A channel has just started the opening handshake.\n - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain.\n - STATE_OPEN: A channel has completed the handshake. Open channels are\nready to send and receive packets.\n - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive\npackets." }, "ordering": { "title": "whether the channel is ordered or unordered", @@ -7648,11 +7270,6 @@ "channel_id": { "type": "string", "title": "channel identifier" - }, - "upgrade_sequence": { - "type": "string", - "format": "uint64", - "title": "upgrade sequence indicates the latest upgrade attempt performed by this channel\nthe value of 0 indicates the channel has never been upgraded" } }, "description": "IdentifiedChannel defines a channel with additional port and channel\nidentifier fields." @@ -7786,96 +7403,6 @@ ] } }, - "/ibc/core/channel/v1/params": { - "get": { - "summary": "ChannelParams queries all parameters of the ibc channel submodule.", - "operationId": "ChannelParams", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "type": "object", - "properties": { - "params": { - "description": "params defines the parameters of the module.", - "type": "object", - "properties": { - "upgrade_timeout": { - "type": "object", - "properties": { - "height": { - "title": "block height after which the packet or upgrade times out", - "type": "object", - "properties": { - "revision_number": { - "type": "string", - "format": "uint64", - "title": "the revision that the client is currently on" - }, - "revision_height": { - "type": "string", - "format": "uint64", - "title": "the height within the given revision" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - }, - "timestamp": { - "type": "string", - "format": "uint64", - "title": "block timestamp (in nanoseconds) after which the packet or upgrade times out" - } - }, - "description": "Timeout defines an execution deadline structure for 04-channel handlers.\nThis includes packet lifecycle handlers as well as the upgrade handshake handlers.\nA valid Timeout contains either one or both of a timestamp and block height (sequence)." - } - } - } - }, - "description": "QueryChannelParamsResponse is the response type for the Query/ChannelParams RPC method." - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "type": "string", - "format": "byte", - "description": "Must be a valid serialized protocol buffer of the above specified type." - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - } - } - } - }, - "tags": [ - "Query" - ] - } - }, "/cosmos/auth/v1beta1/account_info/{address}": { "get": { "summary": "AccountInfo queries account info which is common to all account types.", @@ -9294,13 +8821,6 @@ "in": "query", "required": false, "type": "boolean" - }, - { - "name": "resolve_denom", - "description": "resolve_denom is the flag to resolve the denom into a human-readable form from the metadata.\n\nSince: cosmos-sdk 0.50", - "in": "query", - "required": false, - "type": "boolean" } ], "tags": [ @@ -9826,128 +9346,6 @@ ] } }, - "/cosmos/bank/v1beta1/denoms_metadata_by_query_string": { - "get": { - "summary": "DenomsMetadata queries the client metadata of a given coin denomination.", - "operationId": "DenomMetadataByQueryString", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "type": "object", - "properties": { - "metadata": { - "type": "object", - "properties": { - "description": { - "type": "string" - }, - "denom_units": { - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string", - "description": "denom represents the string name of the given denom unit (e.g uatom)." - }, - "exponent": { - "type": "integer", - "format": "int64", - "description": "exponent represents power of 10 exponent that one must\nraise the base_denom to in order to equal the given DenomUnit's denom\n1 denom = 10^exponent base_denom\n(e.g. with a base_denom of uatom, one can create a DenomUnit of 'atom' with\nexponent = 6, thus: 1 atom = 10^6 uatom)." - }, - "aliases": { - "type": "array", - "items": { - "type": "string" - }, - "title": "aliases is a list of string aliases for the given denom" - } - }, - "description": "DenomUnit represents a struct that describes a given\ndenomination unit of the basic token." - }, - "title": "denom_units represents the list of DenomUnit's for a given coin" - }, - "base": { - "type": "string", - "description": "base represents the base denom (should be the DenomUnit with exponent = 0)." - }, - "display": { - "type": "string", - "description": "display indicates the suggested denom that should be\ndisplayed in clients." - }, - "name": { - "type": "string", - "description": "Since: cosmos-sdk 0.43", - "title": "name defines the name of the token (eg: Cosmos Atom)" - }, - "symbol": { - "type": "string", - "description": "symbol is the token symbol usually shown on exchanges (eg: ATOM). This can\nbe the same as the display.\n\nSince: cosmos-sdk 0.43" - }, - "uri": { - "type": "string", - "description": "URI to a document (on or off-chain) that contains additional information. Optional.\n\nSince: cosmos-sdk 0.46" - }, - "uri_hash": { - "type": "string", - "description": "URIHash is a sha256 hash of a document pointed by URI. It's used to verify that\nthe document didn't change. Optional.\n\nSince: cosmos-sdk 0.46" - } - }, - "description": "Metadata represents a struct that describes\na basic token." - } - }, - "description": "QueryDenomMetadataByQueryStringResponse is the response type for the Query/DenomMetadata RPC\nmethod. Identical with QueryDenomMetadataResponse but receives denom as query string in request." - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "type": "string", - "format": "byte" - } - } - } - } - } - } - } - }, - "parameters": [ - { - "name": "denom", - "description": "denom is the coin denom to query the metadata for.", - "in": "query", - "required": false, - "type": "string" - } - ], - "tags": [ - "Query" - ] - } - }, "/cosmos/bank/v1beta1/params": { "get": { "summary": "Params queries the parameters of x/bank module.", @@ -9959,7 +9357,6 @@ "type": "object", "properties": { "params": { - "description": "params provides the parameters of the bank module.", "type": "object", "properties": { "send_enabled": { @@ -9981,7 +9378,8 @@ "default_send_enabled": { "type": "boolean" } - } + }, + "description": "Params defines the parameters for the bank module." } }, "description": "QueryParamsResponse defines the response type for querying x/bank parameters." @@ -10581,7 +9979,6 @@ "/cosmos/distribution/v1beta1/community_pool": { "get": { "summary": "CommunityPool queries the community pool coins.", - "description": "Deprecated: Prefer to use x/protocolpool module's CommunityPool rpc method.\nSince: cosmos-sdk 0.50", "operationId": "CommunityPool", "responses": { "200": { @@ -10606,7 +10003,7 @@ "description": "pool defines community pool's coins." } }, - "description": "QueryCommunityPoolResponse is the response type for the Query/CommunityPool\nRPC method.\n\nDeprecated\nSince: cosmos-sdk 0.50" + "description": "QueryCommunityPoolResponse is the response type for the Query/CommunityPool\nRPC method." } }, "default": { @@ -10650,7 +10047,7 @@ }, "/cosmos/distribution/v1beta1/delegators/{delegator_address}/rewards": { "get": { - "summary": "DelegationTotalRewards queries the total rewards accrued by each\nvalidator.", + "summary": "DelegationTotalRewards queries the total rewards accrued by a each\nvalidator.", "operationId": "DelegationTotalRewards", "responses": { "200": { @@ -11462,7 +10859,7 @@ }, "/cosmos/feegrant/v1beta1/allowance/{granter}/{grantee}": { "get": { - "summary": "Allowance returns granted allwance to the grantee by the granter.", + "summary": "Allowance returns fee granted to the grantee by the granter.", "operationId": "Allowance", "responses": { "200": { @@ -11564,7 +10961,7 @@ }, "/cosmos/feegrant/v1beta1/allowances/{grantee}": { "get": { - "summary": "Allowances returns all the grants for the given grantee address.", + "summary": "Allowances returns all the grants for address.", "operationId": "Allowances", "responses": { "200": { @@ -12769,7 +12166,7 @@ }, "/cosmos/gov/v1beta1/proposals/{proposal_id}/deposits/{depositor}": { "get": { - "summary": "Deposit queries single deposit information based on proposalID, depositor address.", + "summary": "Deposit queries single deposit information based proposalID, depositAddr.", "operationId": "Deposit", "responses": { "200": { @@ -13138,7 +12535,7 @@ }, "/cosmos/gov/v1beta1/proposals/{proposal_id}/votes/{voter}": { "get": { - "summary": "Vote queries voted information based on proposalID, voterAddr.\nDue to how we handle state, this query would error for proposals that has already been finished.", + "summary": "Vote queries voted information based on proposalID, voterAddr.", "operationId": "Vote", "responses": { "200": { @@ -13262,65 +12659,6 @@ ] } }, - "/cosmos/gov/v1/constitution": { - "get": { - "summary": "Constitution queries the chain's constitution.", - "operationId": "Constitution", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "type": "object", - "properties": { - "constitution": { - "type": "string" - } - }, - "title": "QueryConstitutionResponse is the response type for the Query/Constitution RPC method" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "type": "string", - "format": "byte", - "description": "Must be a valid serialized protocol buffer of the above specified type." - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": ,\n \"lastName\": \n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } - } - } - } - }, - "tags": [ - "Query" - ] - } - }, "/cosmos/gov/v1/params/{params_type}": { "get": { "summary": "Params queries all parameters of the gov module.", @@ -13386,7 +12724,7 @@ } }, "params": { - "description": "params defines all the parameters of x/gov module.\n\nSince: cosmos-sdk 0.47", + "description": "params defines all the paramaters of x/gov module.\n\nSince: cosmos-sdk 0.47", "type": "object", "properties": { "min_deposit": { @@ -13429,72 +12767,17 @@ "type": "string", "description": "The ratio representing the proportion of the deposit value that must be paid at proposal submission." }, - "proposal_cancel_ratio": { - "type": "string", - "description": "The cancel ratio which will not be returned back to the depositors when a proposal is cancelled.\n\nSince: cosmos-sdk 0.50" - }, - "proposal_cancel_dest": { - "type": "string", - "description": "The address which will receive (proposal_cancel_ratio * deposit) proposal deposits.\nIf empty, the (proposal_cancel_ratio * deposit) proposal deposits will be burned.\n\nSince: cosmos-sdk 0.50" - }, - "expedited_voting_period": { - "type": "string", - "description": "Duration of the voting period of an expedited proposal.\n\nSince: cosmos-sdk 0.50" - }, - "expedited_threshold": { - "type": "string", - "description": "Minimum proportion of Yes votes for proposal to pass. Default value: 0.67.\n\nSince: cosmos-sdk 0.50" - }, - "expedited_min_deposit": { - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - }, - "description": "Minimum expedited deposit for a proposal to enter voting period." - }, "burn_vote_quorum": { "type": "boolean", - "description": "Since: cosmos-sdk 0.47", "title": "burn deposits if a proposal does not meet quorum" }, "burn_proposal_deposit_prevote": { "type": "boolean", - "description": "Since: cosmos-sdk 0.47", "title": "burn deposits if the proposal does not enter voting period" }, "burn_vote_veto": { "type": "boolean", - "description": "Since: cosmos-sdk 0.47", "title": "burn deposits if quorum with vote type no_veto is met" - }, - "min_deposit_ratio": { - "type": "string", - "description": "The ratio representing the proportion of the deposit value minimum that must be met when making a deposit.\nDefault value: 0.01. Meaning that for a chain with a min_deposit of 100stake, a deposit of 1stake would be\nrequired.\n\nSince: cosmos-sdk 0.50" - }, - "proposal_cancel_max_period": { - "type": "string", - "description": "proposal_cancel_max_period defines how far in the voting period a proposer can cancel a proposal.\nIf the proposal is cancelled before the max cancel period, the deposit will be returned/burn to the\ndepositors, according to the proposal_cancel_ratio and proposal_cancel_dest parameters.\nAfter the max cancel period, the proposal cannot be cancelled anymore." - }, - "optimistic_authorized_addresses": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Since: x/gov v1.0.0", - "title": "optimistic_authorized_addresses is an optional governance parameter that limits the authorized accounts than can\nsubmit optimistic proposals" - }, - "optimistic_rejected_threshold": { - "type": "string", - "description": "optimistic rejected threshold defines at which percentage of NO votes, the optimistic proposal should fail and be\nconverted to a standard proposal. The threshold is expressed as a percentage of the total bonded tokens.\n\nSince: x/gov v1.0.0" } } } @@ -13624,10 +12907,6 @@ "no_with_veto_count": { "type": "string", "description": "no_with_veto_count is the number of no with veto votes on a proposal." - }, - "spam_count": { - "type": "string", - "description": "spam_count is the number of spam votes on a proposal." } } }, @@ -13669,7 +12948,7 @@ }, "metadata": { "type": "string", - "title": "metadata is any arbitrary metadata attached to the proposal.\nthe recommended format of the metadata is to be found here:\nhttps://docs.cosmos.network/v0.47/modules/gov#proposal-3" + "description": "metadata is any arbitrary metadata attached to the proposal." }, "title": { "type": "string", @@ -13684,30 +12963,7 @@ "proposer": { "type": "string", "description": "Since: cosmos-sdk 0.47", - "title": "proposer is the address of the proposal sumbitter" - }, - "expedited": { - "type": "boolean", - "description": "Since: cosmos-sdk 0.50\nDeprecated: Use ProposalType instead.", - "title": "expedited defines if the proposal is expedited" - }, - "failed_reason": { - "type": "string", - "description": "Since: cosmos-sdk 0.50", - "title": "failed_reason defines the reason why the proposal failed" - }, - "proposal_type": { - "description": "Since: cosmos-sdk 0.51", - "title": "proposal_type defines the type of the proposal", - "type": "string", - "enum": [ - "PROPOSAL_TYPE_UNSPECIFIED", - "PROPOSAL_TYPE_STANDARD", - "PROPOSAL_TYPE_MULTIPLE_CHOICE", - "PROPOSAL_TYPE_OPTIMISTIC", - "PROPOSAL_TYPE_EXPEDITED" - ], - "default": "PROPOSAL_TYPE_UNSPECIFIED" + "title": "Proposer is the address of the proposal sumbitter" } }, "description": "Proposal defines the core field members of a governance proposal." @@ -13915,10 +13171,6 @@ "no_with_veto_count": { "type": "string", "description": "no_with_veto_count is the number of no with veto votes on a proposal." - }, - "spam_count": { - "type": "string", - "description": "spam_count is the number of spam votes on a proposal." } } }, @@ -13960,7 +13212,7 @@ }, "metadata": { "type": "string", - "title": "metadata is any arbitrary metadata attached to the proposal.\nthe recommended format of the metadata is to be found here:\nhttps://docs.cosmos.network/v0.47/modules/gov#proposal-3" + "description": "metadata is any arbitrary metadata attached to the proposal." }, "title": { "type": "string", @@ -13975,30 +13227,7 @@ "proposer": { "type": "string", "description": "Since: cosmos-sdk 0.47", - "title": "proposer is the address of the proposal sumbitter" - }, - "expedited": { - "type": "boolean", - "description": "Since: cosmos-sdk 0.50\nDeprecated: Use ProposalType instead.", - "title": "expedited defines if the proposal is expedited" - }, - "failed_reason": { - "type": "string", - "description": "Since: cosmos-sdk 0.50", - "title": "failed_reason defines the reason why the proposal failed" - }, - "proposal_type": { - "description": "Since: cosmos-sdk 0.51", - "title": "proposal_type defines the type of the proposal", - "type": "string", - "enum": [ - "PROPOSAL_TYPE_UNSPECIFIED", - "PROPOSAL_TYPE_STANDARD", - "PROPOSAL_TYPE_MULTIPLE_CHOICE", - "PROPOSAL_TYPE_OPTIMISTIC", - "PROPOSAL_TYPE_EXPEDITED" - ], - "default": "PROPOSAL_TYPE_UNSPECIFIED" + "title": "Proposer is the address of the proposal sumbitter" } }, "description": "Proposal defines the core field members of a governance proposal." @@ -14216,7 +13445,7 @@ }, "/cosmos/gov/v1/proposals/{proposal_id}/deposits/{depositor}": { "get": { - "summary": "Deposit queries single deposit information based on proposalID, depositAddr.", + "summary": "Deposit queries single deposit information based proposalID, depositAddr.", "operationId": "GovV1Deposit", "responses": { "200": { @@ -14347,10 +13576,6 @@ "no_with_veto_count": { "type": "string", "description": "no_with_veto_count is the number of no with veto votes on a proposal." - }, - "spam_count": { - "type": "string", - "description": "spam_count is the number of spam votes on a proposal." } } } @@ -14444,15 +13669,10 @@ "type": "string", "enum": [ "VOTE_OPTION_UNSPECIFIED", - "VOTE_OPTION_ONE", "VOTE_OPTION_YES", - "VOTE_OPTION_TWO", "VOTE_OPTION_ABSTAIN", - "VOTE_OPTION_THREE", "VOTE_OPTION_NO", - "VOTE_OPTION_FOUR", - "VOTE_OPTION_NO_WITH_VETO", - "VOTE_OPTION_SPAM" + "VOTE_OPTION_NO_WITH_VETO" ], "default": "VOTE_OPTION_UNSPECIFIED" }, @@ -14467,7 +13687,7 @@ }, "metadata": { "type": "string", - "title": "metadata is any arbitrary metadata attached to the vote.\nthe recommended format of the metadata is to be found here: https://docs.cosmos.network/v0.47/modules/gov#vote-5" + "description": "metadata is any arbitrary metadata to attached to the vote." } }, "description": "Vote defines a vote on a governance proposal.\nA Vote consists of a proposal ID, the voter, and the vote option." @@ -14616,15 +13836,10 @@ "type": "string", "enum": [ "VOTE_OPTION_UNSPECIFIED", - "VOTE_OPTION_ONE", "VOTE_OPTION_YES", - "VOTE_OPTION_TWO", "VOTE_OPTION_ABSTAIN", - "VOTE_OPTION_THREE", "VOTE_OPTION_NO", - "VOTE_OPTION_FOUR", - "VOTE_OPTION_NO_WITH_VETO", - "VOTE_OPTION_SPAM" + "VOTE_OPTION_NO_WITH_VETO" ], "default": "VOTE_OPTION_UNSPECIFIED" }, @@ -14639,7 +13854,7 @@ }, "metadata": { "type": "string", - "title": "metadata is any arbitrary metadata attached to the vote.\nthe recommended format of the metadata is to be found here: https://docs.cosmos.network/v0.47/modules/gov#vote-5" + "description": "metadata is any arbitrary metadata to attached to the vote." } }, "description": "Vote defines a vote on a governance proposal.\nA Vote consists of a proposal ID, the voter, and the vote option." @@ -14806,12 +14021,12 @@ "start_height": { "type": "string", "format": "int64", - "title": "Height at which validator was first a candidate OR was un-jailed" + "title": "Height at which validator was first a candidate OR was unjailed" }, "index_offset": { "type": "string", "format": "int64", - "description": "Index which is incremented every time a validator is bonded in a block and\n_may_ have signed a pre-commit or not. This in conjunction with the\nsigned_blocks_window param determines the index in the missed block bitmap." + "description": "Index which is incremented each time the validator was a bonded\nin a block and may have signed a precommit or not. This in conjunction with the\n`SignedBlocksWindow` param determines the index in the `MissedBlocksBitArray`." }, "jailed_until": { "type": "string", @@ -14820,12 +14035,12 @@ }, "tombstoned": { "type": "boolean", - "description": "Whether or not a validator has been tombstoned (killed out of validator\nset). It is set once the validator commits an equivocation or for any other\nconfigured misbehavior." + "description": "Whether or not a validator has been tombstoned (killed out of validator set). It is set\nonce the validator commits an equivocation or for any other configured misbehiavor." }, "missed_blocks_counter": { "type": "string", "format": "int64", - "description": "A counter of missed (unsigned) blocks. It is used to avoid unnecessary\nreads in the missed block bitmap." + "description": "A counter kept to avoid unnecessary array reads.\nNote that `Sum(MissedBlocksBitArray)` always equals `MissedBlocksCounter`." } }, "description": "ValidatorSigningInfo defines a validator's signing info for monitoring their\nliveness activity." @@ -14950,12 +14165,12 @@ "start_height": { "type": "string", "format": "int64", - "title": "Height at which validator was first a candidate OR was un-jailed" + "title": "Height at which validator was first a candidate OR was unjailed" }, "index_offset": { "type": "string", "format": "int64", - "description": "Index which is incremented every time a validator is bonded in a block and\n_may_ have signed a pre-commit or not. This in conjunction with the\nsigned_blocks_window param determines the index in the missed block bitmap." + "description": "Index which is incremented each time the validator was a bonded\nin a block and may have signed a precommit or not. This in conjunction with the\n`SignedBlocksWindow` param determines the index in the `MissedBlocksBitArray`." }, "jailed_until": { "type": "string", @@ -14964,12 +14179,12 @@ }, "tombstoned": { "type": "boolean", - "description": "Whether or not a validator has been tombstoned (killed out of validator\nset). It is set once the validator commits an equivocation or for any other\nconfigured misbehavior." + "description": "Whether or not a validator has been tombstoned (killed out of validator set). It is set\nonce the validator commits an equivocation or for any other configured misbehiavor." }, "missed_blocks_counter": { "type": "string", "format": "int64", - "description": "A counter of missed (unsigned) blocks. It is used to avoid unnecessary\nreads in the missed block bitmap." + "description": "A counter kept to avoid unnecessary array reads.\nNote that `Sum(MissedBlocksBitArray)` always equals `MissedBlocksCounter`." } }, "description": "ValidatorSigningInfo defines a validator's signing info for monitoring their\nliveness activity.", @@ -15048,11 +14263,11 @@ "properties": { "delegator_address": { "type": "string", - "description": "delegator_address is the encoded address of the delegator." + "description": "delegator_address is the bech32-encoded address of the delegator." }, "validator_address": { "type": "string", - "description": "validator_address is the encoded address of the validator." + "description": "validator_address is the bech32-encoded address of the validator." }, "shares": { "type": "string", @@ -15450,11 +14665,11 @@ "properties": { "delegator_address": { "type": "string", - "description": "delegator_address is the encoded address of the delegator." + "description": "delegator_address is the bech32-encoded address of the delegator." }, "validator_address": { "type": "string", - "description": "validator_address is the encoded address of the validator." + "description": "validator_address is the bech32-encoded address of the validator." }, "entries": { "type": "array", @@ -15745,7 +14960,7 @@ "type": "string", "format": "uint64" }, - "title": "list of unbonding ids, each uniquely identifying an unbonding of this validator" + "title": "list of unbonding ids, each uniquely identifing an unbonding of this validator" } }, "description": "Validator defines a validator, together with the total amount of the\nValidator's bond shares and their exchange rate to coins. Slashing results in\na decrease in the exchange rate, allowing correct calculation of future\nundelegations without iterating over delegators. When coins are delegated to\nthis validator, the validator is credited with a delegation whose number of\nbond shares is based on the amount of coins delegated divided by the current\nexchange rate. Voting power can be calculated as total bonded shares\nmultiplied by exchange rate." @@ -15996,7 +15211,7 @@ "type": "string", "format": "uint64" }, - "title": "list of unbonding ids, each uniquely identifying an unbonding of this validator" + "title": "list of unbonding ids, each uniquely identifing an unbonding of this validator" } }, "description": "Validator defines a validator, together with the total amount of the\nValidator's bond shares and their exchange rate to coins. Slashing results in\na decrease in the exchange rate, allowing correct calculation of future\nundelegations without iterating over delegators. When coins are delegated to\nthis validator, the validator is credited with a delegation whose number of\nbond shares is based on the amount of coins delegated divided by the current\nexchange rate. Voting power can be calculated as total bonded shares\nmultiplied by exchange rate." @@ -16299,31 +15514,13 @@ "type": "string", "format": "uint64" }, - "title": "list of unbonding ids, each uniquely identifying an unbonding of this validator" + "title": "list of unbonding ids, each uniquely identifing an unbonding of this validator" } }, "description": "Validator defines a validator, together with the total amount of the\nValidator's bond shares and their exchange rate to coins. Slashing results in\na decrease in the exchange rate, allowing correct calculation of future\nundelegations without iterating over delegators. When coins are delegated to\nthis validator, the validator is credited with a delegation whose number of\nbond shares is based on the amount of coins delegated divided by the current\nexchange rate. Voting power can be calculated as total bonded shares\nmultiplied by exchange rate." } } } - }, - "historical_record": { - "type": "object", - "properties": { - "apphash": { - "type": "string", - "format": "byte" - }, - "time": { - "type": "string", - "format": "date-time" - }, - "validators_hash": { - "type": "string", - "format": "byte" - } - }, - "description": "Historical contains a set of minimum values needed for evaluating historical validator sets and blocks.\nIt is stored as part of staking module's state, which persists the `n` most\nrecent HistoricalInfo\n(`n` is set by the staking module's `historical_entries` parameter)." } }, "description": "QueryHistoricalInfoResponse is response type for the Query/HistoricalInfo RPC\nmethod." @@ -16421,19 +15618,6 @@ "min_commission_rate": { "type": "string", "title": "min_commission_rate is the chain-wide minimum commission rate that a validator can charge their delegators" - }, - "key_rotation_fee": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto.", - "title": "key_rotation_fee is fee to be spent when rotating validator's key\n(either consensus pubkey or operator key)" } } } @@ -16689,7 +15873,7 @@ "type": "string", "format": "uint64" }, - "title": "list of unbonding ids, each uniquely identifying an unbonding of this validator" + "title": "list of unbonding ids, each uniquely identifing an unbonding of this validator" } }, "description": "Validator defines a validator, together with the total amount of the\nValidator's bond shares and their exchange rate to coins. Slashing results in\na decrease in the exchange rate, allowing correct calculation of future\nundelegations without iterating over delegators. When coins are delegated to\nthis validator, the validator is credited with a delegation whose number of\nbond shares is based on the amount of coins delegated divided by the current\nexchange rate. Voting power can be calculated as total bonded shares\nmultiplied by exchange rate." @@ -16940,7 +16124,7 @@ "type": "string", "format": "uint64" }, - "title": "list of unbonding ids, each uniquely identifying an unbonding of this validator" + "title": "list of unbonding ids, each uniquely identifing an unbonding of this validator" } }, "description": "Validator defines a validator, together with the total amount of the\nValidator's bond shares and their exchange rate to coins. Slashing results in\na decrease in the exchange rate, allowing correct calculation of future\nundelegations without iterating over delegators. When coins are delegated to\nthis validator, the validator is credited with a delegation whose number of\nbond shares is based on the amount of coins delegated divided by the current\nexchange rate. Voting power can be calculated as total bonded shares\nmultiplied by exchange rate." @@ -17021,11 +16205,11 @@ "properties": { "delegator_address": { "type": "string", - "description": "delegator_address is the encoded address of the delegator." + "description": "delegator_address is the bech32-encoded address of the delegator." }, "validator_address": { "type": "string", - "description": "validator_address is the encoded address of the validator." + "description": "validator_address is the bech32-encoded address of the validator." }, "shares": { "type": "string", @@ -17177,11 +16361,11 @@ "properties": { "delegator_address": { "type": "string", - "description": "delegator_address is the encoded address of the delegator." + "description": "delegator_address is the bech32-encoded address of the delegator." }, "validator_address": { "type": "string", - "description": "validator_address is the encoded address of the validator." + "description": "validator_address is the bech32-encoded address of the validator." }, "shares": { "type": "string", @@ -17282,11 +16466,11 @@ "properties": { "delegator_address": { "type": "string", - "description": "delegator_address is the encoded address of the delegator." + "description": "delegator_address is the bech32-encoded address of the delegator." }, "validator_address": { "type": "string", - "description": "validator_address is the encoded address of the validator." + "description": "validator_address is the bech32-encoded address of the validator." }, "entries": { "type": "array", @@ -17409,11 +16593,11 @@ "properties": { "delegator_address": { "type": "string", - "description": "delegator_address is the encoded address of the delegator." + "description": "delegator_address is the bech32-encoded address of the delegator." }, "validator_address": { "type": "string", - "description": "validator_address is the encoded address of the validator." + "description": "validator_address is the bech32-encoded address of the validator." }, "entries": { "type": "array", @@ -17930,7 +17114,7 @@ } } }, - "description": "Event allows application developers to attach additional information to\nResponseFinalizeBlock and ResponseCheckTx.\nLater, transactions may be queried using these events." + "description": "Event allows application developers to attach additional information to\nResponseBeginBlock, ResponseEndBlock, ResponseCheckTx and ResponseDeliverTx.\nLater, transactions may be queried using these events." }, "description": "Events contains a slice of Event objects that were emitted during message\nor handler execution." }, @@ -18062,7 +17246,7 @@ "parameters": [ { "name": "events", - "description": "events is the list of transaction event type.\nDeprecated: post v0.47.x use query instead, which should contain a valid\nevents query.", + "description": "events is the list of transaction event type.", "in": "query", "required": false, "type": "array", @@ -18111,7 +17295,7 @@ }, { "name": "order_by", - "description": " - ORDER_BY_UNSPECIFIED: ORDER_BY_UNSPECIFIED specifies an unknown sorting order. OrderBy defaults\nto ASC in this case.\n - ORDER_BY_ASC: ORDER_BY_ASC defines ascending order\n - ORDER_BY_DESC: ORDER_BY_DESC defines descending order", + "description": " - ORDER_BY_UNSPECIFIED: ORDER_BY_UNSPECIFIED specifies an unknown sorting order. OrderBy defaults to ASC in this case.\n - ORDER_BY_ASC: ORDER_BY_ASC defines ascending order\n - ORDER_BY_DESC: ORDER_BY_DESC defines descending order", "in": "query", "required": false, "type": "string", @@ -18124,7 +17308,7 @@ }, { "name": "page", - "description": "page is the page number to query, starts at 1. If not provided, will\ndefault to first page.", + "description": "page is the page number to query, starts at 1. If not provided, will default to first page.", "in": "query", "required": false, "type": "string", @@ -18137,13 +17321,6 @@ "required": false, "type": "string", "format": "uint64" - }, - { - "name": "query", - "description": "query defines the transaction event query that is proxied to Tendermint's\nTxSearch RPC method. The query must be valid.\n\nSince cosmos-sdk 0.50", - "in": "query", - "required": false, - "type": "string" } ], "tags": [ @@ -18293,7 +17470,7 @@ } } }, - "description": "Event allows application developers to attach additional information to\nResponseFinalizeBlock and ResponseCheckTx.\nLater, transactions may be queried using these events." + "description": "Event allows application developers to attach additional information to\nResponseBeginBlock, ResponseEndBlock, ResponseCheckTx and ResponseDeliverTx.\nLater, transactions may be queried using these events." }, "description": "Events defines all the events emitted by processing a transaction. Note,\nthese events include those emitted by processing all the messages and those\nemitted from the ante. Whereas Logs contains the events, with\nadditional metadata, emitted only by processing the messages.\n\nSince: cosmos-sdk 0.42.11, 0.44.5, 0.45" } @@ -18363,7 +17540,7 @@ "BROADCAST_MODE_ASYNC" ], "default": "BROADCAST_MODE_UNSPECIFIED", - "description": "BroadcastMode specifies the broadcast mode for the TxService.Broadcast RPC\nmethod.\n\n - BROADCAST_MODE_UNSPECIFIED: zero-value for mode ordering\n - BROADCAST_MODE_BLOCK: Deprecated: use BROADCAST_MODE_SYNC instead,\nBROADCAST_MODE_BLOCK is not supported by the SDK from v0.47.x onwards.\n - BROADCAST_MODE_SYNC: BROADCAST_MODE_SYNC defines a tx broadcasting mode where the client waits\nfor a CheckTx execution response only.\n - BROADCAST_MODE_ASYNC: BROADCAST_MODE_ASYNC defines a tx broadcasting mode where the client\nreturns immediately." + "description": "BroadcastMode specifies the broadcast mode for the TxService.Broadcast RPC method.\n\n - BROADCAST_MODE_UNSPECIFIED: zero-value for mode ordering\n - BROADCAST_MODE_BLOCK: DEPRECATED: use BROADCAST_MODE_SYNC instead,\nBROADCAST_MODE_BLOCK is not supported by the SDK from v0.47.x onwards.\n - BROADCAST_MODE_SYNC: BROADCAST_MODE_SYNC defines a tx broadcasting mode where the client waits for\na CheckTx execution response only.\n - BROADCAST_MODE_ASYNC: BROADCAST_MODE_ASYNC defines a tx broadcasting mode where the client returns\nimmediately." } }, "description": "BroadcastTxRequest is the request type for the Service.BroadcastTxRequest\nRPC method." @@ -18897,21 +18074,10 @@ }, "signature": { "type": "string", - "format": "byte", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." - }, - "extension": { - "type": "string", - "format": "byte", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages." - }, - "extension_signature": { - "type": "string", - "format": "byte", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + "format": "byte" } }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + "description": "Vote represents a prevote, precommit, or commit vote from validators for\nconsensus." }, "vote_b": { "type": "object", @@ -18973,21 +18139,10 @@ }, "signature": { "type": "string", - "format": "byte", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." - }, - "extension": { - "type": "string", - "format": "byte", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages." - }, - "extension_signature": { - "type": "string", - "format": "byte", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + "format": "byte" } }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + "description": "Vote represents a prevote, precommit, or commit vote from validators for\nconsensus." }, "total_voting_power": { "type": "string", @@ -19157,7 +18312,7 @@ "BLOCK_ID_FLAG_NIL" ], "default": "BLOCK_ID_FLAG_UNKNOWN", - "title": "BlockIdFlag indicates which BlockID the signature is for" + "title": "BlockIdFlag indicates which BlcokID the signature is for" }, "validator_address": { "type": "string", @@ -19359,7 +18514,7 @@ "BLOCK_ID_FLAG_NIL" ], "default": "BLOCK_ID_FLAG_UNKNOWN", - "title": "BlockIdFlag indicates which BlockID the signature is for" + "title": "BlockIdFlag indicates which BlcokID the signature is for" }, "validator_address": { "type": "string", @@ -19566,21 +18721,10 @@ }, "signature": { "type": "string", - "format": "byte", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." - }, - "extension": { - "type": "string", - "format": "byte", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages." - }, - "extension_signature": { - "type": "string", - "format": "byte", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + "format": "byte" } }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + "description": "Vote represents a prevote, precommit, or commit vote from validators for\nconsensus." }, "vote_b": { "type": "object", @@ -19642,21 +18786,10 @@ }, "signature": { "type": "string", - "format": "byte", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." - }, - "extension": { - "type": "string", - "format": "byte", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages." - }, - "extension_signature": { - "type": "string", - "format": "byte", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + "format": "byte" } }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + "description": "Vote represents a prevote, precommit, or commit vote from validators for\nconsensus." }, "total_voting_power": { "type": "string", @@ -19826,7 +18959,7 @@ "BLOCK_ID_FLAG_NIL" ], "default": "BLOCK_ID_FLAG_UNKNOWN", - "title": "BlockIdFlag indicates which BlockID the signature is for" + "title": "BlockIdFlag indicates which BlcokID the signature is for" }, "validator_address": { "type": "string", @@ -20028,7 +19161,7 @@ "BLOCK_ID_FLAG_NIL" ], "default": "BLOCK_ID_FLAG_UNKNOWN", - "title": "BlockIdFlag indicates which BlockID the signature is for" + "title": "BlockIdFlag indicates which BlcokID the signature is for" }, "validator_address": { "type": "string", @@ -20316,21 +19449,10 @@ }, "signature": { "type": "string", - "format": "byte", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." - }, - "extension": { - "type": "string", - "format": "byte", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages." - }, - "extension_signature": { - "type": "string", - "format": "byte", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + "format": "byte" } }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + "description": "Vote represents a prevote, precommit, or commit vote from validators for\nconsensus." }, "vote_b": { "type": "object", @@ -20392,21 +19514,10 @@ }, "signature": { "type": "string", - "format": "byte", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." - }, - "extension": { - "type": "string", - "format": "byte", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages." - }, - "extension_signature": { - "type": "string", - "format": "byte", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + "format": "byte" } }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + "description": "Vote represents a prevote, precommit, or commit vote from validators for\nconsensus." }, "total_voting_power": { "type": "string", @@ -20576,7 +19687,7 @@ "BLOCK_ID_FLAG_NIL" ], "default": "BLOCK_ID_FLAG_UNKNOWN", - "title": "BlockIdFlag indicates which BlockID the signature is for" + "title": "BlockIdFlag indicates which BlcokID the signature is for" }, "validator_address": { "type": "string", @@ -20778,7 +19889,7 @@ "BLOCK_ID_FLAG_NIL" ], "default": "BLOCK_ID_FLAG_UNKNOWN", - "title": "BlockIdFlag indicates which BlockID the signature is for" + "title": "BlockIdFlag indicates which BlcokID the signature is for" }, "validator_address": { "type": "string", @@ -20985,21 +20096,10 @@ }, "signature": { "type": "string", - "format": "byte", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." - }, - "extension": { - "type": "string", - "format": "byte", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages." - }, - "extension_signature": { - "type": "string", - "format": "byte", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + "format": "byte" } }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + "description": "Vote represents a prevote, precommit, or commit vote from validators for\nconsensus." }, "vote_b": { "type": "object", @@ -21061,21 +20161,10 @@ }, "signature": { "type": "string", - "format": "byte", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." - }, - "extension": { - "type": "string", - "format": "byte", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages." - }, - "extension_signature": { - "type": "string", - "format": "byte", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + "format": "byte" } }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + "description": "Vote represents a prevote, precommit, or commit vote from validators for\nconsensus." }, "total_voting_power": { "type": "string", @@ -21245,7 +20334,7 @@ "BLOCK_ID_FLAG_NIL" ], "default": "BLOCK_ID_FLAG_UNKNOWN", - "title": "BlockIdFlag indicates which BlockID the signature is for" + "title": "BlockIdFlag indicates which BlcokID the signature is for" }, "validator_address": { "type": "string", @@ -21447,7 +20536,7 @@ "BLOCK_ID_FLAG_NIL" ], "default": "BLOCK_ID_FLAG_UNKNOWN", - "title": "BlockIdFlag indicates which BlockID the signature is for" + "title": "BlockIdFlag indicates which BlcokID the signature is for" }, "validator_address": { "type": "string", @@ -24393,7 +23482,7 @@ "title": "list of features compatible with the specified identifier" } }, - "description": "Version defines the versioning scheme used to negotiate the IBC version in\nthe connection handshake." + "description": "Version defines the versioning scheme used to negotiate the IBC verison in\nthe connection handshake." }, "description": "IBC version which can be utilised to determine encodings or protocols for\nchannels or packets utilising this connection." }, @@ -24494,7 +23583,7 @@ "title": "list of features compatible with the specified identifier" } }, - "description": "Version defines the versioning scheme used to negotiate the IBC version in\nthe connection handshake." + "description": "Version defines the versioning scheme used to negotiate the IBC verison in\nthe connection handshake." }, "title": "IBC version which can be utilised to determine encodings or protocols for\nchannels or packets utilising this connection" }, @@ -24736,7 +23825,7 @@ "title": "list of features compatible with the specified identifier" } }, - "description": "Version defines the versioning scheme used to negotiate the IBC version in\nthe connection handshake." + "description": "Version defines the versioning scheme used to negotiate the IBC verison in\nthe connection handshake." }, "description": "IBC version which can be utilised to determine encodings or protocols for\nchannels or packets utilising this connection." }, @@ -24842,7 +23931,7 @@ "title": "list of features compatible with the specified identifier" } }, - "description": "Version defines the versioning scheme used to negotiate the IBC version in\nthe connection handshake." + "description": "Version defines the versioning scheme used to negotiate the IBC verison in\nthe connection handshake." }, "title": "IBC version which can be utilised to determine encodings or protocols for\nchannels or packets utilising this connection" }, @@ -24955,7 +24044,7 @@ "title": "list of features compatible with the specified identifier" } }, - "description": "Version defines the versioning scheme used to negotiate the IBC version in\nthe connection handshake." + "description": "Version defines the versioning scheme used to negotiate the IBC verison in\nthe connection handshake." }, "ibc.core.channel.v1.Channel": { "type": "object", @@ -24968,12 +24057,10 @@ "STATE_INIT", "STATE_TRYOPEN", "STATE_OPEN", - "STATE_CLOSED", - "STATE_FLUSHING", - "STATE_FLUSHCOMPLETE" + "STATE_CLOSED" ], "default": "STATE_UNINITIALIZED_UNSPECIFIED", - "description": "State defines if a channel is in one of the following states:\nCLOSED, INIT, TRYOPEN, OPEN, FLUSHING, FLUSHCOMPLETE or UNINITIALIZED.\n\n - STATE_UNINITIALIZED_UNSPECIFIED: Default State\n - STATE_INIT: A channel has just started the opening handshake.\n - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain.\n - STATE_OPEN: A channel has completed the handshake. Open channels are\nready to send and receive packets.\n - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive\npackets.\n - STATE_FLUSHING: A channel has just accepted the upgrade handshake attempt and is flushing in-flight packets.\n - STATE_FLUSHCOMPLETE: A channel has just completed flushing any in-flight packets." + "description": "State defines if a channel is in one of the following states:\nCLOSED, INIT, TRYOPEN, OPEN or UNINITIALIZED.\n\n - STATE_UNINITIALIZED_UNSPECIFIED: Default State\n - STATE_INIT: A channel has just started the opening handshake.\n - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain.\n - STATE_OPEN: A channel has completed the handshake. Open channels are\nready to send and receive packets.\n - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive\npackets." }, "ordering": { "title": "whether the channel is ordered or unordered", @@ -25010,11 +24097,6 @@ "version": { "type": "string", "title": "opaque channel version, which is agreed upon during the handshake" - }, - "upgrade_sequence": { - "type": "string", - "format": "uint64", - "title": "upgrade sequence indicates the latest upgrade attempt performed by this channel\nthe value of 0 indicates the channel has never been upgraded" } }, "description": "Channel defines pipeline for exactly-once packet delivery between specific\nmodules on separate blockchains, which has at least one end capable of\nsending packets and one end capable of receiving packets." @@ -25033,21 +24115,6 @@ }, "title": "Counterparty defines a channel end counterparty" }, - "ibc.core.channel.v1.ErrorReceipt": { - "type": "object", - "properties": { - "sequence": { - "type": "string", - "format": "uint64", - "title": "the channel upgrade sequence" - }, - "message": { - "type": "string", - "title": "the error message detailing the cause of failure" - } - }, - "description": "ErrorReceipt defines a type which encapsulates the upgrade sequence and error associated with the\nupgrade handshake failure. When a channel upgrade handshake is aborted both chains are expected to increment to the\nnext sequence." - }, "ibc.core.channel.v1.IdentifiedChannel": { "type": "object", "properties": { @@ -25059,12 +24126,10 @@ "STATE_INIT", "STATE_TRYOPEN", "STATE_OPEN", - "STATE_CLOSED", - "STATE_FLUSHING", - "STATE_FLUSHCOMPLETE" + "STATE_CLOSED" ], "default": "STATE_UNINITIALIZED_UNSPECIFIED", - "description": "State defines if a channel is in one of the following states:\nCLOSED, INIT, TRYOPEN, OPEN, FLUSHING, FLUSHCOMPLETE or UNINITIALIZED.\n\n - STATE_UNINITIALIZED_UNSPECIFIED: Default State\n - STATE_INIT: A channel has just started the opening handshake.\n - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain.\n - STATE_OPEN: A channel has completed the handshake. Open channels are\nready to send and receive packets.\n - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive\npackets.\n - STATE_FLUSHING: A channel has just accepted the upgrade handshake attempt and is flushing in-flight packets.\n - STATE_FLUSHCOMPLETE: A channel has just completed flushing any in-flight packets." + "description": "State defines if a channel is in one of the following states:\nCLOSED, INIT, TRYOPEN, OPEN or UNINITIALIZED.\n\n - STATE_UNINITIALIZED_UNSPECIFIED: Default State\n - STATE_INIT: A channel has just started the opening handshake.\n - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain.\n - STATE_OPEN: A channel has completed the handshake. Open channels are\nready to send and receive packets.\n - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive\npackets." }, "ordering": { "title": "whether the channel is ordered or unordered", @@ -25109,11 +24174,6 @@ "channel_id": { "type": "string", "title": "channel identifier" - }, - "upgrade_sequence": { - "type": "string", - "format": "uint64", - "title": "upgrade sequence indicates the latest upgrade attempt performed by this channel\nthe value of 0 indicates the channel has never been upgraded" } }, "description": "IdentifiedChannel defines a channel with additional port and channel\nidentifier fields." @@ -25153,40 +24213,6 @@ }, "description": "PacketState defines the generic type necessary to retrieve and store\npacket commitments, acknowledgements, and receipts.\nCaller is responsible for knowing the context necessary to interpret this\nstate as a commitment, acknowledgement, or a receipt." }, - "ibc.core.channel.v1.Params": { - "type": "object", - "properties": { - "upgrade_timeout": { - "type": "object", - "properties": { - "height": { - "title": "block height after which the packet or upgrade times out", - "type": "object", - "properties": { - "revision_number": { - "type": "string", - "format": "uint64", - "title": "the revision that the client is currently on" - }, - "revision_height": { - "type": "string", - "format": "uint64", - "title": "the height within the given revision" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - }, - "timestamp": { - "type": "string", - "format": "uint64", - "title": "block timestamp (in nanoseconds) after which the packet or upgrade times out" - } - }, - "description": "Timeout defines an execution deadline structure for 04-channel handlers.\nThis includes packet lifecycle handlers as well as the upgrade handshake handlers.\nA valid Timeout contains either one or both of a timestamp and block height (sequence)." - } - }, - "description": "Params defines the set of IBC channel parameters." - }, "ibc.core.channel.v1.QueryChannelClientStateResponse": { "type": "object", "properties": { @@ -25290,46 +24316,6 @@ }, "title": "QueryChannelClientStateResponse is the Response type for the\nQuery/QueryChannelClientState RPC method" }, - "ibc.core.channel.v1.QueryChannelParamsResponse": { - "type": "object", - "properties": { - "params": { - "description": "params defines the parameters of the module.", - "type": "object", - "properties": { - "upgrade_timeout": { - "type": "object", - "properties": { - "height": { - "title": "block height after which the packet or upgrade times out", - "type": "object", - "properties": { - "revision_number": { - "type": "string", - "format": "uint64", - "title": "the revision that the client is currently on" - }, - "revision_height": { - "type": "string", - "format": "uint64", - "title": "the height within the given revision" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - }, - "timestamp": { - "type": "string", - "format": "uint64", - "title": "block timestamp (in nanoseconds) after which the packet or upgrade times out" - } - }, - "description": "Timeout defines an execution deadline structure for 04-channel handlers.\nThis includes packet lifecycle handlers as well as the upgrade handshake handlers.\nA valid Timeout contains either one or both of a timestamp and block height (sequence)." - } - } - } - }, - "description": "QueryChannelParamsResponse is the response type for the Query/ChannelParams RPC method." - }, "ibc.core.channel.v1.QueryChannelResponse": { "type": "object", "properties": { @@ -25345,12 +24331,10 @@ "STATE_INIT", "STATE_TRYOPEN", "STATE_OPEN", - "STATE_CLOSED", - "STATE_FLUSHING", - "STATE_FLUSHCOMPLETE" + "STATE_CLOSED" ], "default": "STATE_UNINITIALIZED_UNSPECIFIED", - "description": "State defines if a channel is in one of the following states:\nCLOSED, INIT, TRYOPEN, OPEN, FLUSHING, FLUSHCOMPLETE or UNINITIALIZED.\n\n - STATE_UNINITIALIZED_UNSPECIFIED: Default State\n - STATE_INIT: A channel has just started the opening handshake.\n - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain.\n - STATE_OPEN: A channel has completed the handshake. Open channels are\nready to send and receive packets.\n - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive\npackets.\n - STATE_FLUSHING: A channel has just accepted the upgrade handshake attempt and is flushing in-flight packets.\n - STATE_FLUSHCOMPLETE: A channel has just completed flushing any in-flight packets." + "description": "State defines if a channel is in one of the following states:\nCLOSED, INIT, TRYOPEN, OPEN or UNINITIALIZED.\n\n - STATE_UNINITIALIZED_UNSPECIFIED: Default State\n - STATE_INIT: A channel has just started the opening handshake.\n - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain.\n - STATE_OPEN: A channel has completed the handshake. Open channels are\nready to send and receive packets.\n - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive\npackets." }, "ordering": { "title": "whether the channel is ordered or unordered", @@ -25387,11 +24371,6 @@ "version": { "type": "string", "title": "opaque channel version, which is agreed upon during the handshake" - }, - "upgrade_sequence": { - "type": "string", - "format": "uint64", - "title": "upgrade sequence indicates the latest upgrade attempt performed by this channel\nthe value of 0 indicates the channel has never been upgraded" } }, "description": "Channel defines pipeline for exactly-once packet delivery between specific\nmodules on separate blockchains, which has at least one end capable of\nsending packets and one end capable of receiving packets." @@ -25437,12 +24416,10 @@ "STATE_INIT", "STATE_TRYOPEN", "STATE_OPEN", - "STATE_CLOSED", - "STATE_FLUSHING", - "STATE_FLUSHCOMPLETE" + "STATE_CLOSED" ], "default": "STATE_UNINITIALIZED_UNSPECIFIED", - "description": "State defines if a channel is in one of the following states:\nCLOSED, INIT, TRYOPEN, OPEN, FLUSHING, FLUSHCOMPLETE or UNINITIALIZED.\n\n - STATE_UNINITIALIZED_UNSPECIFIED: Default State\n - STATE_INIT: A channel has just started the opening handshake.\n - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain.\n - STATE_OPEN: A channel has completed the handshake. Open channels are\nready to send and receive packets.\n - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive\npackets.\n - STATE_FLUSHING: A channel has just accepted the upgrade handshake attempt and is flushing in-flight packets.\n - STATE_FLUSHCOMPLETE: A channel has just completed flushing any in-flight packets." + "description": "State defines if a channel is in one of the following states:\nCLOSED, INIT, TRYOPEN, OPEN or UNINITIALIZED.\n\n - STATE_UNINITIALIZED_UNSPECIFIED: Default State\n - STATE_INIT: A channel has just started the opening handshake.\n - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain.\n - STATE_OPEN: A channel has completed the handshake. Open channels are\nready to send and receive packets.\n - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive\npackets." }, "ordering": { "title": "whether the channel is ordered or unordered", @@ -25487,11 +24464,6 @@ "channel_id": { "type": "string", "title": "channel identifier" - }, - "upgrade_sequence": { - "type": "string", - "format": "uint64", - "title": "upgrade sequence indicates the latest upgrade attempt performed by this channel\nthe value of 0 indicates the channel has never been upgraded" } }, "description": "IdentifiedChannel defines a channel with additional port and channel\nidentifier fields." @@ -25551,12 +24523,10 @@ "STATE_INIT", "STATE_TRYOPEN", "STATE_OPEN", - "STATE_CLOSED", - "STATE_FLUSHING", - "STATE_FLUSHCOMPLETE" + "STATE_CLOSED" ], "default": "STATE_UNINITIALIZED_UNSPECIFIED", - "description": "State defines if a channel is in one of the following states:\nCLOSED, INIT, TRYOPEN, OPEN, FLUSHING, FLUSHCOMPLETE or UNINITIALIZED.\n\n - STATE_UNINITIALIZED_UNSPECIFIED: Default State\n - STATE_INIT: A channel has just started the opening handshake.\n - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain.\n - STATE_OPEN: A channel has completed the handshake. Open channels are\nready to send and receive packets.\n - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive\npackets.\n - STATE_FLUSHING: A channel has just accepted the upgrade handshake attempt and is flushing in-flight packets.\n - STATE_FLUSHCOMPLETE: A channel has just completed flushing any in-flight packets." + "description": "State defines if a channel is in one of the following states:\nCLOSED, INIT, TRYOPEN, OPEN or UNINITIALIZED.\n\n - STATE_UNINITIALIZED_UNSPECIFIED: Default State\n - STATE_INIT: A channel has just started the opening handshake.\n - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain.\n - STATE_OPEN: A channel has completed the handshake. Open channels are\nready to send and receive packets.\n - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive\npackets." }, "ordering": { "title": "whether the channel is ordered or unordered", @@ -25601,11 +24571,6 @@ "channel_id": { "type": "string", "title": "channel identifier" - }, - "upgrade_sequence": { - "type": "string", - "format": "uint64", - "title": "upgrade sequence indicates the latest upgrade attempt performed by this channel\nthe value of 0 indicates the channel has never been upgraded" } }, "description": "IdentifiedChannel defines a channel with additional port and channel\nidentifier fields." @@ -25680,40 +24645,7 @@ "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" } }, - "title": "QuerySequenceResponse is the response type for the\nQuery/QueryNextSequenceReceiveResponse RPC method" - }, - "ibc.core.channel.v1.QueryNextSequenceSendResponse": { - "type": "object", - "properties": { - "next_sequence_send": { - "type": "string", - "format": "uint64", - "title": "next sequence send number" - }, - "proof": { - "type": "string", - "format": "byte", - "title": "merkle proof of existence" - }, - "proof_height": { - "title": "height at which the proof was retrieved", - "type": "object", - "properties": { - "revision_number": { - "type": "string", - "format": "uint64", - "title": "the revision that the client is currently on" - }, - "revision_height": { - "type": "string", - "format": "uint64", - "title": "the height within the given revision" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - } - }, - "title": "QueryNextSequenceSendResponse is the request type for the\nQuery/QueryNextSequenceSend RPC method" + "title": "QuerySequenceResponse is the request type for the\nQuery/QueryNextSequenceReceiveResponse RPC method" }, "ibc.core.channel.v1.QueryPacketAcknowledgementResponse": { "type": "object", @@ -25945,187 +24877,21 @@ "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" } }, - "title": "QueryPacketReceiptResponse defines the client query response for a packet\nreceipt which also includes a proof, and the height from which the proof was\nretrieved" - }, - "ibc.core.channel.v1.QueryUnreceivedAcksResponse": { - "type": "object", - "properties": { - "sequences": { - "type": "array", - "items": { - "type": "string", - "format": "uint64" - }, - "title": "list of unreceived acknowledgement sequences" - }, - "height": { - "title": "query block height", - "type": "object", - "properties": { - "revision_number": { - "type": "string", - "format": "uint64", - "title": "the revision that the client is currently on" - }, - "revision_height": { - "type": "string", - "format": "uint64", - "title": "the height within the given revision" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - } - }, - "title": "QueryUnreceivedAcksResponse is the response type for the\nQuery/UnreceivedAcks RPC method" - }, - "ibc.core.channel.v1.QueryUnreceivedPacketsResponse": { - "type": "object", - "properties": { - "sequences": { - "type": "array", - "items": { - "type": "string", - "format": "uint64" - }, - "title": "list of unreceived packet sequences" - }, - "height": { - "title": "query block height", - "type": "object", - "properties": { - "revision_number": { - "type": "string", - "format": "uint64", - "title": "the revision that the client is currently on" - }, - "revision_height": { - "type": "string", - "format": "uint64", - "title": "the height within the given revision" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - } - }, - "title": "QueryUnreceivedPacketsResponse is the response type for the\nQuery/UnreceivedPacketCommitments RPC method" - }, - "ibc.core.channel.v1.QueryUpgradeErrorResponse": { - "type": "object", - "properties": { - "error_receipt": { - "type": "object", - "properties": { - "sequence": { - "type": "string", - "format": "uint64", - "title": "the channel upgrade sequence" - }, - "message": { - "type": "string", - "title": "the error message detailing the cause of failure" - } - }, - "description": "ErrorReceipt defines a type which encapsulates the upgrade sequence and error associated with the\nupgrade handshake failure. When a channel upgrade handshake is aborted both chains are expected to increment to the\nnext sequence." - }, - "proof": { - "type": "string", - "format": "byte", - "title": "merkle proof of existence" - }, - "proof_height": { - "title": "height at which the proof was retrieved", - "type": "object", - "properties": { - "revision_number": { - "type": "string", - "format": "uint64", - "title": "the revision that the client is currently on" - }, - "revision_height": { - "type": "string", - "format": "uint64", - "title": "the height within the given revision" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - } - }, - "title": "QueryUpgradeErrorResponse is the response type for the Query/QueryUpgradeError RPC method" + "title": "QueryPacketReceiptResponse defines the client query response for a packet\nreceipt which also includes a proof, and the height from which the proof was\nretrieved" }, - "ibc.core.channel.v1.QueryUpgradeResponse": { + "ibc.core.channel.v1.QueryUnreceivedAcksResponse": { "type": "object", "properties": { - "upgrade": { - "type": "object", - "properties": { - "fields": { - "type": "object", - "properties": { - "ordering": { - "type": "string", - "enum": [ - "ORDER_NONE_UNSPECIFIED", - "ORDER_UNORDERED", - "ORDER_ORDERED" - ], - "default": "ORDER_NONE_UNSPECIFIED", - "description": "- ORDER_NONE_UNSPECIFIED: zero-value for channel ordering\n - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in\nwhich they were sent.\n - ORDER_ORDERED: packets are delivered exactly in the order which they were sent", - "title": "Order defines if a channel is ORDERED or UNORDERED" - }, - "connection_hops": { - "type": "array", - "items": { - "type": "string" - } - }, - "version": { - "type": "string" - } - }, - "description": "UpgradeFields are the fields in a channel end which may be changed\nduring a channel upgrade." - }, - "timeout": { - "type": "object", - "properties": { - "height": { - "title": "block height after which the packet or upgrade times out", - "type": "object", - "properties": { - "revision_number": { - "type": "string", - "format": "uint64", - "title": "the revision that the client is currently on" - }, - "revision_height": { - "type": "string", - "format": "uint64", - "title": "the height within the given revision" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - }, - "timestamp": { - "type": "string", - "format": "uint64", - "title": "block timestamp (in nanoseconds) after which the packet or upgrade times out" - } - }, - "description": "Timeout defines an execution deadline structure for 04-channel handlers.\nThis includes packet lifecycle handlers as well as the upgrade handshake handlers.\nA valid Timeout contains either one or both of a timestamp and block height (sequence)." - }, - "next_sequence_send": { - "type": "string", - "format": "uint64" - } + "sequences": { + "type": "array", + "items": { + "type": "string", + "format": "uint64" }, - "description": "Upgrade is a verifiable type which contains the relevant information\nfor an attempted upgrade. It provides the proposed changes to the channel\nend, the timeout for this upgrade attempt and the next packet sequence\nwhich allows the counterparty to efficiently know the highest sequence it has received.\nThe next sequence send is used for pruning and upgrading from unordered to ordered channels." - }, - "proof": { - "type": "string", - "format": "byte", - "title": "merkle proof of existence" + "title": "list of unreceived acknowledgement sequences" }, - "proof_height": { - "title": "height at which the proof was retrieved", + "height": { + "title": "query block height", "type": "object", "properties": { "revision_number": { @@ -26142,27 +24908,21 @@ "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" } }, - "title": "QueryUpgradeResponse is the response type for the QueryUpgradeResponse RPC method" - }, - "ibc.core.channel.v1.State": { - "type": "string", - "enum": [ - "STATE_UNINITIALIZED_UNSPECIFIED", - "STATE_INIT", - "STATE_TRYOPEN", - "STATE_OPEN", - "STATE_CLOSED", - "STATE_FLUSHING", - "STATE_FLUSHCOMPLETE" - ], - "default": "STATE_UNINITIALIZED_UNSPECIFIED", - "description": "State defines if a channel is in one of the following states:\nCLOSED, INIT, TRYOPEN, OPEN, FLUSHING, FLUSHCOMPLETE or UNINITIALIZED.\n\n - STATE_UNINITIALIZED_UNSPECIFIED: Default State\n - STATE_INIT: A channel has just started the opening handshake.\n - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain.\n - STATE_OPEN: A channel has completed the handshake. Open channels are\nready to send and receive packets.\n - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive\npackets.\n - STATE_FLUSHING: A channel has just accepted the upgrade handshake attempt and is flushing in-flight packets.\n - STATE_FLUSHCOMPLETE: A channel has just completed flushing any in-flight packets." + "title": "QueryUnreceivedAcksResponse is the response type for the\nQuery/UnreceivedAcks RPC method" }, - "ibc.core.channel.v1.Timeout": { + "ibc.core.channel.v1.QueryUnreceivedPacketsResponse": { "type": "object", "properties": { + "sequences": { + "type": "array", + "items": { + "type": "string", + "format": "uint64" + }, + "title": "list of unreceived packet sequences" + }, "height": { - "title": "block height after which the packet or upgrade times out", + "title": "query block height", "type": "object", "properties": { "revision_number": { @@ -26177,104 +24937,21 @@ } }, "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - }, - "timestamp": { - "type": "string", - "format": "uint64", - "title": "block timestamp (in nanoseconds) after which the packet or upgrade times out" - } - }, - "description": "Timeout defines an execution deadline structure for 04-channel handlers.\nThis includes packet lifecycle handlers as well as the upgrade handshake handlers.\nA valid Timeout contains either one or both of a timestamp and block height (sequence)." - }, - "ibc.core.channel.v1.Upgrade": { - "type": "object", - "properties": { - "fields": { - "type": "object", - "properties": { - "ordering": { - "type": "string", - "enum": [ - "ORDER_NONE_UNSPECIFIED", - "ORDER_UNORDERED", - "ORDER_ORDERED" - ], - "default": "ORDER_NONE_UNSPECIFIED", - "description": "- ORDER_NONE_UNSPECIFIED: zero-value for channel ordering\n - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in\nwhich they were sent.\n - ORDER_ORDERED: packets are delivered exactly in the order which they were sent", - "title": "Order defines if a channel is ORDERED or UNORDERED" - }, - "connection_hops": { - "type": "array", - "items": { - "type": "string" - } - }, - "version": { - "type": "string" - } - }, - "description": "UpgradeFields are the fields in a channel end which may be changed\nduring a channel upgrade." - }, - "timeout": { - "type": "object", - "properties": { - "height": { - "title": "block height after which the packet or upgrade times out", - "type": "object", - "properties": { - "revision_number": { - "type": "string", - "format": "uint64", - "title": "the revision that the client is currently on" - }, - "revision_height": { - "type": "string", - "format": "uint64", - "title": "the height within the given revision" - } - }, - "description": "Normally the RevisionHeight is incremented at each height while keeping\nRevisionNumber the same. However some consensus algorithms may choose to\nreset the height in certain conditions e.g. hard forks, state-machine\nbreaking changes In these cases, the RevisionNumber is incremented so that\nheight continues to be monitonically increasing even as the RevisionHeight\ngets reset" - }, - "timestamp": { - "type": "string", - "format": "uint64", - "title": "block timestamp (in nanoseconds) after which the packet or upgrade times out" - } - }, - "description": "Timeout defines an execution deadline structure for 04-channel handlers.\nThis includes packet lifecycle handlers as well as the upgrade handshake handlers.\nA valid Timeout contains either one or both of a timestamp and block height (sequence)." - }, - "next_sequence_send": { - "type": "string", - "format": "uint64" } }, - "description": "Upgrade is a verifiable type which contains the relevant information\nfor an attempted upgrade. It provides the proposed changes to the channel\nend, the timeout for this upgrade attempt and the next packet sequence\nwhich allows the counterparty to efficiently know the highest sequence it has received.\nThe next sequence send is used for pruning and upgrading from unordered to ordered channels." + "title": "QueryUnreceivedPacketsResponse is the response type for the\nQuery/UnreceivedPacketCommitments RPC method" }, - "ibc.core.channel.v1.UpgradeFields": { - "type": "object", - "properties": { - "ordering": { - "type": "string", - "enum": [ - "ORDER_NONE_UNSPECIFIED", - "ORDER_UNORDERED", - "ORDER_ORDERED" - ], - "default": "ORDER_NONE_UNSPECIFIED", - "description": "- ORDER_NONE_UNSPECIFIED: zero-value for channel ordering\n - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in\nwhich they were sent.\n - ORDER_ORDERED: packets are delivered exactly in the order which they were sent", - "title": "Order defines if a channel is ORDERED or UNORDERED" - }, - "connection_hops": { - "type": "array", - "items": { - "type": "string" - } - }, - "version": { - "type": "string" - } - }, - "description": "UpgradeFields are the fields in a channel end which may be changed\nduring a channel upgrade." + "ibc.core.channel.v1.State": { + "type": "string", + "enum": [ + "STATE_UNINITIALIZED_UNSPECIFIED", + "STATE_INIT", + "STATE_TRYOPEN", + "STATE_OPEN", + "STATE_CLOSED" + ], + "default": "STATE_UNINITIALIZED_UNSPECIFIED", + "description": "State defines if a channel is in one of the following states:\nCLOSED, INIT, TRYOPEN, OPEN or UNINITIALIZED.\n\n - STATE_UNINITIALIZED_UNSPECIFIED: Default State\n - STATE_INIT: A channel has just started the opening handshake.\n - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain.\n - STATE_OPEN: A channel has completed the handshake. Open channels are\nready to send and receive packets.\n - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive\npackets." }, "cosmos.auth.v1beta1.AddressBytesToStringResponse": { "type": "object", @@ -26957,72 +25634,6 @@ }, "description": "QueryBalanceResponse is the response type for the Query/Balance RPC method." }, - "cosmos.bank.v1beta1.QueryDenomMetadataByQueryStringResponse": { - "type": "object", - "properties": { - "metadata": { - "type": "object", - "properties": { - "description": { - "type": "string" - }, - "denom_units": { - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string", - "description": "denom represents the string name of the given denom unit (e.g uatom)." - }, - "exponent": { - "type": "integer", - "format": "int64", - "description": "exponent represents power of 10 exponent that one must\nraise the base_denom to in order to equal the given DenomUnit's denom\n1 denom = 10^exponent base_denom\n(e.g. with a base_denom of uatom, one can create a DenomUnit of 'atom' with\nexponent = 6, thus: 1 atom = 10^6 uatom)." - }, - "aliases": { - "type": "array", - "items": { - "type": "string" - }, - "title": "aliases is a list of string aliases for the given denom" - } - }, - "description": "DenomUnit represents a struct that describes a given\ndenomination unit of the basic token." - }, - "title": "denom_units represents the list of DenomUnit's for a given coin" - }, - "base": { - "type": "string", - "description": "base represents the base denom (should be the DenomUnit with exponent = 0)." - }, - "display": { - "type": "string", - "description": "display indicates the suggested denom that should be\ndisplayed in clients." - }, - "name": { - "type": "string", - "description": "Since: cosmos-sdk 0.43", - "title": "name defines the name of the token (eg: Cosmos Atom)" - }, - "symbol": { - "type": "string", - "description": "symbol is the token symbol usually shown on exchanges (eg: ATOM). This can\nbe the same as the display.\n\nSince: cosmos-sdk 0.43" - }, - "uri": { - "type": "string", - "description": "URI to a document (on or off-chain) that contains additional information. Optional.\n\nSince: cosmos-sdk 0.46" - }, - "uri_hash": { - "type": "string", - "description": "URIHash is a sha256 hash of a document pointed by URI. It's used to verify that\nthe document didn't change. Optional.\n\nSince: cosmos-sdk 0.46" - } - }, - "description": "Metadata represents a struct that describes\na basic token." - } - }, - "description": "QueryDenomMetadataByQueryStringResponse is the response type for the Query/DenomMetadata RPC\nmethod. Identical with QueryDenomMetadataResponse but receives denom as query string in request." - }, "cosmos.bank.v1beta1.QueryDenomMetadataResponse": { "type": "object", "properties": { @@ -27226,7 +25837,6 @@ "type": "object", "properties": { "params": { - "description": "params provides the parameters of the bank module.", "type": "object", "properties": { "send_enabled": { @@ -27248,7 +25858,8 @@ "default_send_enabled": { "type": "boolean" } - } + }, + "description": "Params defines the parameters for the bank module." } }, "description": "QueryParamsResponse defines the response type for querying x/bank parameters." @@ -27478,7 +26089,7 @@ "description": "pool defines community pool's coins." } }, - "description": "QueryCommunityPoolResponse is the response type for the Query/CommunityPool\nRPC method.\n\nDeprecated\nSince: cosmos-sdk 0.50" + "description": "QueryCommunityPoolResponse is the response type for the Query/CommunityPool\nRPC method." }, "cosmos.distribution.v1beta1.QueryDelegationRewardsResponse": { "type": "object", @@ -28984,72 +27595,17 @@ "type": "string", "description": "The ratio representing the proportion of the deposit value that must be paid at proposal submission." }, - "proposal_cancel_ratio": { - "type": "string", - "description": "The cancel ratio which will not be returned back to the depositors when a proposal is cancelled.\n\nSince: cosmos-sdk 0.50" - }, - "proposal_cancel_dest": { - "type": "string", - "description": "The address which will receive (proposal_cancel_ratio * deposit) proposal deposits.\nIf empty, the (proposal_cancel_ratio * deposit) proposal deposits will be burned.\n\nSince: cosmos-sdk 0.50" - }, - "expedited_voting_period": { - "type": "string", - "description": "Duration of the voting period of an expedited proposal.\n\nSince: cosmos-sdk 0.50" - }, - "expedited_threshold": { - "type": "string", - "description": "Minimum proportion of Yes votes for proposal to pass. Default value: 0.67.\n\nSince: cosmos-sdk 0.50" - }, - "expedited_min_deposit": { - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - }, - "description": "Minimum expedited deposit for a proposal to enter voting period." - }, "burn_vote_quorum": { "type": "boolean", - "description": "Since: cosmos-sdk 0.47", "title": "burn deposits if a proposal does not meet quorum" }, "burn_proposal_deposit_prevote": { "type": "boolean", - "description": "Since: cosmos-sdk 0.47", "title": "burn deposits if the proposal does not enter voting period" }, "burn_vote_veto": { "type": "boolean", - "description": "Since: cosmos-sdk 0.47", "title": "burn deposits if quorum with vote type no_veto is met" - }, - "min_deposit_ratio": { - "type": "string", - "description": "The ratio representing the proportion of the deposit value minimum that must be met when making a deposit.\nDefault value: 0.01. Meaning that for a chain with a min_deposit of 100stake, a deposit of 1stake would be\nrequired.\n\nSince: cosmos-sdk 0.50" - }, - "proposal_cancel_max_period": { - "type": "string", - "description": "proposal_cancel_max_period defines how far in the voting period a proposer can cancel a proposal.\nIf the proposal is cancelled before the max cancel period, the deposit will be returned/burn to the\ndepositors, according to the proposal_cancel_ratio and proposal_cancel_dest parameters.\nAfter the max cancel period, the proposal cannot be cancelled anymore." - }, - "optimistic_authorized_addresses": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Since: x/gov v1.0.0", - "title": "optimistic_authorized_addresses is an optional governance parameter that limits the authorized accounts than can\nsubmit optimistic proposals" - }, - "optimistic_rejected_threshold": { - "type": "string", - "description": "optimistic rejected threshold defines at which percentage of NO votes, the optimistic proposal should fail and be\nconverted to a standard proposal. The threshold is expressed as a percentage of the total bonded tokens.\n\nSince: x/gov v1.0.0" } }, "description": "Params defines the parameters for the x/gov module.\n\nSince: cosmos-sdk 0.47" @@ -29113,10 +27669,6 @@ "no_with_veto_count": { "type": "string", "description": "no_with_veto_count is the number of no with veto votes on a proposal." - }, - "spam_count": { - "type": "string", - "description": "spam_count is the number of spam votes on a proposal." } } }, @@ -29158,7 +27710,7 @@ }, "metadata": { "type": "string", - "title": "metadata is any arbitrary metadata attached to the proposal.\nthe recommended format of the metadata is to be found here:\nhttps://docs.cosmos.network/v0.47/modules/gov#proposal-3" + "description": "metadata is any arbitrary metadata attached to the proposal." }, "title": { "type": "string", @@ -29173,30 +27725,7 @@ "proposer": { "type": "string", "description": "Since: cosmos-sdk 0.47", - "title": "proposer is the address of the proposal sumbitter" - }, - "expedited": { - "type": "boolean", - "description": "Since: cosmos-sdk 0.50\nDeprecated: Use ProposalType instead.", - "title": "expedited defines if the proposal is expedited" - }, - "failed_reason": { - "type": "string", - "description": "Since: cosmos-sdk 0.50", - "title": "failed_reason defines the reason why the proposal failed" - }, - "proposal_type": { - "description": "Since: cosmos-sdk 0.51", - "title": "proposal_type defines the type of the proposal", - "type": "string", - "enum": [ - "PROPOSAL_TYPE_UNSPECIFIED", - "PROPOSAL_TYPE_STANDARD", - "PROPOSAL_TYPE_MULTIPLE_CHOICE", - "PROPOSAL_TYPE_OPTIMISTIC", - "PROPOSAL_TYPE_EXPEDITED" - ], - "default": "PROPOSAL_TYPE_UNSPECIFIED" + "title": "Proposer is the address of the proposal sumbitter" } }, "description": "Proposal defines the core field members of a governance proposal." @@ -29214,27 +27743,6 @@ "default": "PROPOSAL_STATUS_UNSPECIFIED", "description": "ProposalStatus enumerates the valid statuses of a proposal.\n\n - PROPOSAL_STATUS_UNSPECIFIED: PROPOSAL_STATUS_UNSPECIFIED defines the default proposal status.\n - PROPOSAL_STATUS_DEPOSIT_PERIOD: PROPOSAL_STATUS_DEPOSIT_PERIOD defines a proposal status during the deposit\nperiod.\n - PROPOSAL_STATUS_VOTING_PERIOD: PROPOSAL_STATUS_VOTING_PERIOD defines a proposal status during the voting\nperiod.\n - PROPOSAL_STATUS_PASSED: PROPOSAL_STATUS_PASSED defines a proposal status of a proposal that has\npassed.\n - PROPOSAL_STATUS_REJECTED: PROPOSAL_STATUS_REJECTED defines a proposal status of a proposal that has\nbeen rejected.\n - PROPOSAL_STATUS_FAILED: PROPOSAL_STATUS_FAILED defines a proposal status of a proposal that has\nfailed." }, - "cosmos.gov.v1.ProposalType": { - "type": "string", - "enum": [ - "PROPOSAL_TYPE_UNSPECIFIED", - "PROPOSAL_TYPE_STANDARD", - "PROPOSAL_TYPE_MULTIPLE_CHOICE", - "PROPOSAL_TYPE_OPTIMISTIC", - "PROPOSAL_TYPE_EXPEDITED" - ], - "default": "PROPOSAL_TYPE_UNSPECIFIED", - "description": "ProposalType enumerates the valid proposal types.\nAll proposal types are v1.Proposal which have different voting periods or tallying logic.\n\n - PROPOSAL_TYPE_UNSPECIFIED: PROPOSAL_TYPE_UNSPECIFIED defines no proposal type, which fallback to PROPOSAL_TYPE_STANDARD.\n - PROPOSAL_TYPE_STANDARD: PROPOSAL_TYPE_STANDARD defines the type for a standard proposal.\n - PROPOSAL_TYPE_MULTIPLE_CHOICE: PROPOSAL_TYPE_MULTIPLE_CHOICE defines the type for a multiple choice proposal.\n - PROPOSAL_TYPE_OPTIMISTIC: PROPOSAL_TYPE_OPTIMISTIC defines the type for an optimistic proposal.\n - PROPOSAL_TYPE_EXPEDITED: PROPOSAL_TYPE_EXPEDITED defines the type for an expedited proposal." - }, - "cosmos.gov.v1.QueryConstitutionResponse": { - "type": "object", - "properties": { - "constitution": { - "type": "string" - } - }, - "title": "QueryConstitutionResponse is the response type for the Query/Constitution RPC method" - }, "cosmos.gov.v1.QueryDepositResponse": { "type": "object", "properties": { @@ -29387,7 +27895,7 @@ } }, "params": { - "description": "params defines all the parameters of x/gov module.\n\nSince: cosmos-sdk 0.47", + "description": "params defines all the paramaters of x/gov module.\n\nSince: cosmos-sdk 0.47", "type": "object", "properties": { "min_deposit": { @@ -29430,72 +27938,17 @@ "type": "string", "description": "The ratio representing the proportion of the deposit value that must be paid at proposal submission." }, - "proposal_cancel_ratio": { - "type": "string", - "description": "The cancel ratio which will not be returned back to the depositors when a proposal is cancelled.\n\nSince: cosmos-sdk 0.50" - }, - "proposal_cancel_dest": { - "type": "string", - "description": "The address which will receive (proposal_cancel_ratio * deposit) proposal deposits.\nIf empty, the (proposal_cancel_ratio * deposit) proposal deposits will be burned.\n\nSince: cosmos-sdk 0.50" - }, - "expedited_voting_period": { - "type": "string", - "description": "Duration of the voting period of an expedited proposal.\n\nSince: cosmos-sdk 0.50" - }, - "expedited_threshold": { - "type": "string", - "description": "Minimum proportion of Yes votes for proposal to pass. Default value: 0.67.\n\nSince: cosmos-sdk 0.50" - }, - "expedited_min_deposit": { - "type": "array", - "items": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto." - }, - "description": "Minimum expedited deposit for a proposal to enter voting period." - }, "burn_vote_quorum": { "type": "boolean", - "description": "Since: cosmos-sdk 0.47", "title": "burn deposits if a proposal does not meet quorum" }, "burn_proposal_deposit_prevote": { "type": "boolean", - "description": "Since: cosmos-sdk 0.47", "title": "burn deposits if the proposal does not enter voting period" }, "burn_vote_veto": { "type": "boolean", - "description": "Since: cosmos-sdk 0.47", "title": "burn deposits if quorum with vote type no_veto is met" - }, - "min_deposit_ratio": { - "type": "string", - "description": "The ratio representing the proportion of the deposit value minimum that must be met when making a deposit.\nDefault value: 0.01. Meaning that for a chain with a min_deposit of 100stake, a deposit of 1stake would be\nrequired.\n\nSince: cosmos-sdk 0.50" - }, - "proposal_cancel_max_period": { - "type": "string", - "description": "proposal_cancel_max_period defines how far in the voting period a proposer can cancel a proposal.\nIf the proposal is cancelled before the max cancel period, the deposit will be returned/burn to the\ndepositors, according to the proposal_cancel_ratio and proposal_cancel_dest parameters.\nAfter the max cancel period, the proposal cannot be cancelled anymore." - }, - "optimistic_authorized_addresses": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Since: x/gov v1.0.0", - "title": "optimistic_authorized_addresses is an optional governance parameter that limits the authorized accounts than can\nsubmit optimistic proposals" - }, - "optimistic_rejected_threshold": { - "type": "string", - "description": "optimistic rejected threshold defines at which percentage of NO votes, the optimistic proposal should fail and be\nconverted to a standard proposal. The threshold is expressed as a percentage of the total bonded tokens.\n\nSince: x/gov v1.0.0" } } } @@ -29564,10 +28017,6 @@ "no_with_veto_count": { "type": "string", "description": "no_with_veto_count is the number of no with veto votes on a proposal." - }, - "spam_count": { - "type": "string", - "description": "spam_count is the number of spam votes on a proposal." } } }, @@ -29609,7 +28058,7 @@ }, "metadata": { "type": "string", - "title": "metadata is any arbitrary metadata attached to the proposal.\nthe recommended format of the metadata is to be found here:\nhttps://docs.cosmos.network/v0.47/modules/gov#proposal-3" + "description": "metadata is any arbitrary metadata attached to the proposal." }, "title": { "type": "string", @@ -29624,30 +28073,7 @@ "proposer": { "type": "string", "description": "Since: cosmos-sdk 0.47", - "title": "proposer is the address of the proposal sumbitter" - }, - "expedited": { - "type": "boolean", - "description": "Since: cosmos-sdk 0.50\nDeprecated: Use ProposalType instead.", - "title": "expedited defines if the proposal is expedited" - }, - "failed_reason": { - "type": "string", - "description": "Since: cosmos-sdk 0.50", - "title": "failed_reason defines the reason why the proposal failed" - }, - "proposal_type": { - "description": "Since: cosmos-sdk 0.51", - "title": "proposal_type defines the type of the proposal", - "type": "string", - "enum": [ - "PROPOSAL_TYPE_UNSPECIFIED", - "PROPOSAL_TYPE_STANDARD", - "PROPOSAL_TYPE_MULTIPLE_CHOICE", - "PROPOSAL_TYPE_OPTIMISTIC", - "PROPOSAL_TYPE_EXPEDITED" - ], - "default": "PROPOSAL_TYPE_UNSPECIFIED" + "title": "Proposer is the address of the proposal sumbitter" } }, "description": "Proposal defines the core field members of a governance proposal." @@ -29719,10 +28145,6 @@ "no_with_veto_count": { "type": "string", "description": "no_with_veto_count is the number of no with veto votes on a proposal." - }, - "spam_count": { - "type": "string", - "description": "spam_count is the number of spam votes on a proposal." } } }, @@ -29764,7 +28186,7 @@ }, "metadata": { "type": "string", - "title": "metadata is any arbitrary metadata attached to the proposal.\nthe recommended format of the metadata is to be found here:\nhttps://docs.cosmos.network/v0.47/modules/gov#proposal-3" + "description": "metadata is any arbitrary metadata attached to the proposal." }, "title": { "type": "string", @@ -29779,30 +28201,7 @@ "proposer": { "type": "string", "description": "Since: cosmos-sdk 0.47", - "title": "proposer is the address of the proposal sumbitter" - }, - "expedited": { - "type": "boolean", - "description": "Since: cosmos-sdk 0.50\nDeprecated: Use ProposalType instead.", - "title": "expedited defines if the proposal is expedited" - }, - "failed_reason": { - "type": "string", - "description": "Since: cosmos-sdk 0.50", - "title": "failed_reason defines the reason why the proposal failed" - }, - "proposal_type": { - "description": "Since: cosmos-sdk 0.51", - "title": "proposal_type defines the type of the proposal", - "type": "string", - "enum": [ - "PROPOSAL_TYPE_UNSPECIFIED", - "PROPOSAL_TYPE_STANDARD", - "PROPOSAL_TYPE_MULTIPLE_CHOICE", - "PROPOSAL_TYPE_OPTIMISTIC", - "PROPOSAL_TYPE_EXPEDITED" - ], - "default": "PROPOSAL_TYPE_UNSPECIFIED" + "title": "Proposer is the address of the proposal sumbitter" } }, "description": "Proposal defines the core field members of a governance proposal." @@ -29850,10 +28249,6 @@ "no_with_veto_count": { "type": "string", "description": "no_with_veto_count is the number of no with veto votes on a proposal." - }, - "spam_count": { - "type": "string", - "description": "spam_count is the number of spam votes on a proposal." } } } @@ -29885,15 +28280,10 @@ "type": "string", "enum": [ "VOTE_OPTION_UNSPECIFIED", - "VOTE_OPTION_ONE", "VOTE_OPTION_YES", - "VOTE_OPTION_TWO", "VOTE_OPTION_ABSTAIN", - "VOTE_OPTION_THREE", "VOTE_OPTION_NO", - "VOTE_OPTION_FOUR", - "VOTE_OPTION_NO_WITH_VETO", - "VOTE_OPTION_SPAM" + "VOTE_OPTION_NO_WITH_VETO" ], "default": "VOTE_OPTION_UNSPECIFIED" }, @@ -29908,7 +28298,7 @@ }, "metadata": { "type": "string", - "title": "metadata is any arbitrary metadata attached to the vote.\nthe recommended format of the metadata is to be found here: https://docs.cosmos.network/v0.47/modules/gov#vote-5" + "description": "metadata is any arbitrary metadata to attached to the vote." } }, "description": "Vote defines a vote on a governance proposal.\nA Vote consists of a proposal ID, the voter, and the vote option." @@ -29943,15 +28333,10 @@ "type": "string", "enum": [ "VOTE_OPTION_UNSPECIFIED", - "VOTE_OPTION_ONE", "VOTE_OPTION_YES", - "VOTE_OPTION_TWO", "VOTE_OPTION_ABSTAIN", - "VOTE_OPTION_THREE", "VOTE_OPTION_NO", - "VOTE_OPTION_FOUR", - "VOTE_OPTION_NO_WITH_VETO", - "VOTE_OPTION_SPAM" + "VOTE_OPTION_NO_WITH_VETO" ], "default": "VOTE_OPTION_UNSPECIFIED" }, @@ -29966,7 +28351,7 @@ }, "metadata": { "type": "string", - "title": "metadata is any arbitrary metadata attached to the vote.\nthe recommended format of the metadata is to be found here: https://docs.cosmos.network/v0.47/modules/gov#vote-5" + "description": "metadata is any arbitrary metadata to attached to the vote." } }, "description": "Vote defines a vote on a governance proposal.\nA Vote consists of a proposal ID, the voter, and the vote option." @@ -30028,10 +28413,6 @@ "no_with_veto_count": { "type": "string", "description": "no_with_veto_count is the number of no with veto votes on a proposal." - }, - "spam_count": { - "type": "string", - "description": "spam_count is the number of spam votes on a proposal." } }, "description": "TallyResult defines a standard tally for a governance proposal." @@ -30058,15 +28439,10 @@ "type": "string", "enum": [ "VOTE_OPTION_UNSPECIFIED", - "VOTE_OPTION_ONE", "VOTE_OPTION_YES", - "VOTE_OPTION_TWO", "VOTE_OPTION_ABSTAIN", - "VOTE_OPTION_THREE", "VOTE_OPTION_NO", - "VOTE_OPTION_FOUR", - "VOTE_OPTION_NO_WITH_VETO", - "VOTE_OPTION_SPAM" + "VOTE_OPTION_NO_WITH_VETO" ], "default": "VOTE_OPTION_UNSPECIFIED" }, @@ -30081,7 +28457,7 @@ }, "metadata": { "type": "string", - "title": "metadata is any arbitrary metadata attached to the vote.\nthe recommended format of the metadata is to be found here: https://docs.cosmos.network/v0.47/modules/gov#vote-5" + "description": "metadata is any arbitrary metadata to attached to the vote." } }, "description": "Vote defines a vote on a governance proposal.\nA Vote consists of a proposal ID, the voter, and the vote option." @@ -30090,18 +28466,13 @@ "type": "string", "enum": [ "VOTE_OPTION_UNSPECIFIED", - "VOTE_OPTION_ONE", "VOTE_OPTION_YES", - "VOTE_OPTION_TWO", "VOTE_OPTION_ABSTAIN", - "VOTE_OPTION_THREE", "VOTE_OPTION_NO", - "VOTE_OPTION_FOUR", - "VOTE_OPTION_NO_WITH_VETO", - "VOTE_OPTION_SPAM" + "VOTE_OPTION_NO_WITH_VETO" ], "default": "VOTE_OPTION_UNSPECIFIED", - "description": "VoteOption enumerates the valid vote options for a given governance proposal.\n\n - VOTE_OPTION_UNSPECIFIED: VOTE_OPTION_UNSPECIFIED defines a no-op vote option.\n - VOTE_OPTION_ONE: VOTE_OPTION_ONE defines the first proposal vote option.\n - VOTE_OPTION_YES: VOTE_OPTION_YES defines the yes proposal vote option.\n - VOTE_OPTION_TWO: VOTE_OPTION_TWO defines the second proposal vote option.\n - VOTE_OPTION_ABSTAIN: VOTE_OPTION_ABSTAIN defines the abstain proposal vote option.\n - VOTE_OPTION_THREE: VOTE_OPTION_THREE defines the third proposal vote option.\n - VOTE_OPTION_NO: VOTE_OPTION_NO defines the no proposal vote option.\n - VOTE_OPTION_FOUR: VOTE_OPTION_FOUR defines the fourth proposal vote option.\n - VOTE_OPTION_NO_WITH_VETO: VOTE_OPTION_NO_WITH_VETO defines the no with veto proposal vote option.\n - VOTE_OPTION_SPAM: VOTE_OPTION_SPAM defines the spam proposal vote option." + "description": "VoteOption enumerates the valid vote options for a given governance proposal.\n\n - VOTE_OPTION_UNSPECIFIED: VOTE_OPTION_UNSPECIFIED defines a no-op vote option.\n - VOTE_OPTION_YES: VOTE_OPTION_YES defines a yes vote option.\n - VOTE_OPTION_ABSTAIN: VOTE_OPTION_ABSTAIN defines an abstain vote option.\n - VOTE_OPTION_NO: VOTE_OPTION_NO defines a no vote option.\n - VOTE_OPTION_NO_WITH_VETO: VOTE_OPTION_NO_WITH_VETO defines a no with veto vote option." }, "cosmos.gov.v1.VotingParams": { "type": "object", @@ -30121,15 +28492,10 @@ "type": "string", "enum": [ "VOTE_OPTION_UNSPECIFIED", - "VOTE_OPTION_ONE", "VOTE_OPTION_YES", - "VOTE_OPTION_TWO", "VOTE_OPTION_ABSTAIN", - "VOTE_OPTION_THREE", "VOTE_OPTION_NO", - "VOTE_OPTION_FOUR", - "VOTE_OPTION_NO_WITH_VETO", - "VOTE_OPTION_SPAM" + "VOTE_OPTION_NO_WITH_VETO" ], "default": "VOTE_OPTION_UNSPECIFIED" }, @@ -30208,12 +28574,12 @@ "start_height": { "type": "string", "format": "int64", - "title": "Height at which validator was first a candidate OR was un-jailed" + "title": "Height at which validator was first a candidate OR was unjailed" }, "index_offset": { "type": "string", "format": "int64", - "description": "Index which is incremented every time a validator is bonded in a block and\n_may_ have signed a pre-commit or not. This in conjunction with the\nsigned_blocks_window param determines the index in the missed block bitmap." + "description": "Index which is incremented each time the validator was a bonded\nin a block and may have signed a precommit or not. This in conjunction with the\n`SignedBlocksWindow` param determines the index in the `MissedBlocksBitArray`." }, "jailed_until": { "type": "string", @@ -30222,12 +28588,12 @@ }, "tombstoned": { "type": "boolean", - "description": "Whether or not a validator has been tombstoned (killed out of validator\nset). It is set once the validator commits an equivocation or for any other\nconfigured misbehavior." + "description": "Whether or not a validator has been tombstoned (killed out of validator set). It is set\nonce the validator commits an equivocation or for any other configured misbehiavor." }, "missed_blocks_counter": { "type": "string", "format": "int64", - "description": "A counter of missed (unsigned) blocks. It is used to avoid unnecessary\nreads in the missed block bitmap." + "description": "A counter kept to avoid unnecessary array reads.\nNote that `Sum(MissedBlocksBitArray)` always equals `MissedBlocksCounter`." } }, "description": "ValidatorSigningInfo defines a validator's signing info for monitoring their\nliveness activity.", @@ -30250,12 +28616,12 @@ "start_height": { "type": "string", "format": "int64", - "title": "Height at which validator was first a candidate OR was un-jailed" + "title": "Height at which validator was first a candidate OR was unjailed" }, "index_offset": { "type": "string", "format": "int64", - "description": "Index which is incremented every time a validator is bonded in a block and\n_may_ have signed a pre-commit or not. This in conjunction with the\nsigned_blocks_window param determines the index in the missed block bitmap." + "description": "Index which is incremented each time the validator was a bonded\nin a block and may have signed a precommit or not. This in conjunction with the\n`SignedBlocksWindow` param determines the index in the `MissedBlocksBitArray`." }, "jailed_until": { "type": "string", @@ -30264,12 +28630,12 @@ }, "tombstoned": { "type": "boolean", - "description": "Whether or not a validator has been tombstoned (killed out of validator\nset). It is set once the validator commits an equivocation or for any other\nconfigured misbehavior." + "description": "Whether or not a validator has been tombstoned (killed out of validator set). It is set\nonce the validator commits an equivocation or for any other configured misbehiavor." }, "missed_blocks_counter": { "type": "string", "format": "int64", - "description": "A counter of missed (unsigned) blocks. It is used to avoid unnecessary\nreads in the missed block bitmap." + "description": "A counter kept to avoid unnecessary array reads.\nNote that `Sum(MissedBlocksBitArray)` always equals `MissedBlocksCounter`." } }, "description": "ValidatorSigningInfo defines a validator's signing info for monitoring their\nliveness activity." @@ -30304,12 +28670,12 @@ "start_height": { "type": "string", "format": "int64", - "title": "Height at which validator was first a candidate OR was un-jailed" + "title": "Height at which validator was first a candidate OR was unjailed" }, "index_offset": { "type": "string", "format": "int64", - "description": "Index which is incremented every time a validator is bonded in a block and\n_may_ have signed a pre-commit or not. This in conjunction with the\nsigned_blocks_window param determines the index in the missed block bitmap." + "description": "Index which is incremented each time the validator was a bonded\nin a block and may have signed a precommit or not. This in conjunction with the\n`SignedBlocksWindow` param determines the index in the `MissedBlocksBitArray`." }, "jailed_until": { "type": "string", @@ -30318,12 +28684,12 @@ }, "tombstoned": { "type": "boolean", - "description": "Whether or not a validator has been tombstoned (killed out of validator\nset). It is set once the validator commits an equivocation or for any other\nconfigured misbehavior." + "description": "Whether or not a validator has been tombstoned (killed out of validator set). It is set\nonce the validator commits an equivocation or for any other configured misbehiavor." }, "missed_blocks_counter": { "type": "string", "format": "int64", - "description": "A counter of missed (unsigned) blocks. It is used to avoid unnecessary\nreads in the missed block bitmap." + "description": "A counter kept to avoid unnecessary array reads.\nNote that `Sum(MissedBlocksBitArray)` always equals `MissedBlocksCounter`." } }, "description": "ValidatorSigningInfo defines a validator's signing info for monitoring their\nliveness activity." @@ -30391,11 +28757,11 @@ "properties": { "delegator_address": { "type": "string", - "description": "delegator_address is the encoded address of the delegator." + "description": "delegator_address is the bech32-encoded address of the delegator." }, "validator_address": { "type": "string", - "description": "validator_address is the encoded address of the validator." + "description": "validator_address is the bech32-encoded address of the validator." }, "shares": { "type": "string", @@ -30412,11 +28778,11 @@ "properties": { "delegator_address": { "type": "string", - "description": "delegator_address is the encoded address of the delegator." + "description": "delegator_address is the bech32-encoded address of the delegator." }, "validator_address": { "type": "string", - "description": "validator_address is the encoded address of the validator." + "description": "validator_address is the bech32-encoded address of the validator." }, "shares": { "type": "string", @@ -30691,7 +29057,7 @@ "type": "string", "format": "uint64" }, - "title": "list of unbonding ids, each uniquely identifying an unbonding of this validator" + "title": "list of unbonding ids, each uniquely identifing an unbonding of this validator" } }, "description": "Validator defines a validator, together with the total amount of the\nValidator's bond shares and their exchange rate to coins. Slashing results in\na decrease in the exchange rate, allowing correct calculation of future\nundelegations without iterating over delegators. When coins are delegated to\nthis validator, the validator is credited with a delegation whose number of\nbond shares is based on the amount of coins delegated divided by the current\nexchange rate. Voting power can be calculated as total bonded shares\nmultiplied by exchange rate." @@ -30700,24 +29066,6 @@ }, "description": "HistoricalInfo contains header and validator information for a given block.\nIt is stored as part of staking module's state, which persists the `n` most\nrecent HistoricalInfo\n(`n` is set by the staking module's `historical_entries` parameter)." }, - "cosmos.staking.v1beta1.HistoricalRecord": { - "type": "object", - "properties": { - "apphash": { - "type": "string", - "format": "byte" - }, - "time": { - "type": "string", - "format": "date-time" - }, - "validators_hash": { - "type": "string", - "format": "byte" - } - }, - "description": "Historical contains a set of minimum values needed for evaluating historical validator sets and blocks.\nIt is stored as part of staking module's state, which persists the `n` most\nrecent HistoricalInfo\n(`n` is set by the staking module's `historical_entries` parameter)." - }, "cosmos.staking.v1beta1.Params": { "type": "object", "properties": { @@ -30747,19 +29095,6 @@ "min_commission_rate": { "type": "string", "title": "min_commission_rate is the chain-wide minimum commission rate that a validator can charge their delegators" - }, - "key_rotation_fee": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto.", - "title": "key_rotation_fee is fee to be spent when rotating validator's key\n(either consensus pubkey or operator key)" } }, "description": "Params defines the parameters for the x/staking module." @@ -30787,11 +29122,11 @@ "properties": { "delegator_address": { "type": "string", - "description": "delegator_address is the encoded address of the delegator." + "description": "delegator_address is the bech32-encoded address of the delegator." }, "validator_address": { "type": "string", - "description": "validator_address is the encoded address of the validator." + "description": "validator_address is the bech32-encoded address of the validator." }, "shares": { "type": "string", @@ -30831,11 +29166,11 @@ "properties": { "delegator_address": { "type": "string", - "description": "delegator_address is the encoded address of the delegator." + "description": "delegator_address is the bech32-encoded address of the delegator." }, "validator_address": { "type": "string", - "description": "validator_address is the encoded address of the validator." + "description": "validator_address is the bech32-encoded address of the validator." }, "shares": { "type": "string", @@ -30890,11 +29225,11 @@ "properties": { "delegator_address": { "type": "string", - "description": "delegator_address is the encoded address of the delegator." + "description": "delegator_address is the bech32-encoded address of the delegator." }, "validator_address": { "type": "string", - "description": "validator_address is the encoded address of the validator." + "description": "validator_address is the bech32-encoded address of the validator." }, "entries": { "type": "array", @@ -31085,7 +29420,7 @@ "type": "string", "format": "uint64" }, - "title": "list of unbonding ids, each uniquely identifying an unbonding of this validator" + "title": "list of unbonding ids, each uniquely identifing an unbonding of this validator" } }, "description": "Validator defines a validator, together with the total amount of the\nValidator's bond shares and their exchange rate to coins. Slashing results in\na decrease in the exchange rate, allowing correct calculation of future\nundelegations without iterating over delegators. When coins are delegated to\nthis validator, the validator is credited with a delegation whose number of\nbond shares is based on the amount of coins delegated divided by the current\nexchange rate. Voting power can be calculated as total bonded shares\nmultiplied by exchange rate." @@ -31223,7 +29558,7 @@ "type": "string", "format": "uint64" }, - "title": "list of unbonding ids, each uniquely identifying an unbonding of this validator" + "title": "list of unbonding ids, each uniquely identifing an unbonding of this validator" } }, "description": "Validator defines a validator, together with the total amount of the\nValidator's bond shares and their exchange rate to coins. Slashing results in\na decrease in the exchange rate, allowing correct calculation of future\nundelegations without iterating over delegators. When coins are delegated to\nthis validator, the validator is credited with a delegation whose number of\nbond shares is based on the amount of coins delegated divided by the current\nexchange rate. Voting power can be calculated as total bonded shares\nmultiplied by exchange rate." @@ -31478,31 +29813,13 @@ "type": "string", "format": "uint64" }, - "title": "list of unbonding ids, each uniquely identifying an unbonding of this validator" + "title": "list of unbonding ids, each uniquely identifing an unbonding of this validator" } }, "description": "Validator defines a validator, together with the total amount of the\nValidator's bond shares and their exchange rate to coins. Slashing results in\na decrease in the exchange rate, allowing correct calculation of future\nundelegations without iterating over delegators. When coins are delegated to\nthis validator, the validator is credited with a delegation whose number of\nbond shares is based on the amount of coins delegated divided by the current\nexchange rate. Voting power can be calculated as total bonded shares\nmultiplied by exchange rate." } } } - }, - "historical_record": { - "type": "object", - "properties": { - "apphash": { - "type": "string", - "format": "byte" - }, - "time": { - "type": "string", - "format": "date-time" - }, - "validators_hash": { - "type": "string", - "format": "byte" - } - }, - "description": "Historical contains a set of minimum values needed for evaluating historical validator sets and blocks.\nIt is stored as part of staking module's state, which persists the `n` most\nrecent HistoricalInfo\n(`n` is set by the staking module's `historical_entries` parameter)." } }, "description": "QueryHistoricalInfoResponse is response type for the Query/HistoricalInfo RPC\nmethod." @@ -31540,19 +29857,6 @@ "min_commission_rate": { "type": "string", "title": "min_commission_rate is the chain-wide minimum commission rate that a validator can charge their delegators" - }, - "key_rotation_fee": { - "type": "object", - "properties": { - "denom": { - "type": "string" - }, - "amount": { - "type": "string" - } - }, - "description": "Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto.", - "title": "key_rotation_fee is fee to be spent when rotating validator's key\n(either consensus pubkey or operator key)" } } } @@ -31718,11 +30022,11 @@ "properties": { "delegator_address": { "type": "string", - "description": "delegator_address is the encoded address of the delegator." + "description": "delegator_address is the bech32-encoded address of the delegator." }, "validator_address": { "type": "string", - "description": "validator_address is the encoded address of the validator." + "description": "validator_address is the bech32-encoded address of the validator." }, "entries": { "type": "array", @@ -31781,11 +30085,11 @@ "properties": { "delegator_address": { "type": "string", - "description": "delegator_address is the encoded address of the delegator." + "description": "delegator_address is the bech32-encoded address of the delegator." }, "validator_address": { "type": "string", - "description": "validator_address is the encoded address of the validator." + "description": "validator_address is the bech32-encoded address of the validator." }, "shares": { "type": "string", @@ -31957,7 +30261,7 @@ "type": "string", "format": "uint64" }, - "title": "list of unbonding ids, each uniquely identifying an unbonding of this validator" + "title": "list of unbonding ids, each uniquely identifing an unbonding of this validator" } }, "description": "Validator defines a validator, together with the total amount of the\nValidator's bond shares and their exchange rate to coins. Slashing results in\na decrease in the exchange rate, allowing correct calculation of future\nundelegations without iterating over delegators. When coins are delegated to\nthis validator, the validator is credited with a delegation whose number of\nbond shares is based on the amount of coins delegated divided by the current\nexchange rate. Voting power can be calculated as total bonded shares\nmultiplied by exchange rate." @@ -31975,11 +30279,11 @@ "properties": { "delegator_address": { "type": "string", - "description": "delegator_address is the encoded address of the delegator." + "description": "delegator_address is the bech32-encoded address of the delegator." }, "validator_address": { "type": "string", - "description": "validator_address is the encoded address of the validator." + "description": "validator_address is the bech32-encoded address of the validator." }, "entries": { "type": "array", @@ -32172,7 +30476,7 @@ "type": "string", "format": "uint64" }, - "title": "list of unbonding ids, each uniquely identifying an unbonding of this validator" + "title": "list of unbonding ids, each uniquely identifing an unbonding of this validator" } }, "description": "Validator defines a validator, together with the total amount of the\nValidator's bond shares and their exchange rate to coins. Slashing results in\na decrease in the exchange rate, allowing correct calculation of future\nundelegations without iterating over delegators. When coins are delegated to\nthis validator, the validator is credited with a delegation whose number of\nbond shares is based on the amount of coins delegated divided by the current\nexchange rate. Voting power can be calculated as total bonded shares\nmultiplied by exchange rate." @@ -32444,11 +30748,11 @@ "properties": { "delegator_address": { "type": "string", - "description": "delegator_address is the encoded address of the delegator." + "description": "delegator_address is the bech32-encoded address of the delegator." }, "validator_address": { "type": "string", - "description": "validator_address is the encoded address of the validator." + "description": "validator_address is the bech32-encoded address of the validator." }, "entries": { "type": "array", @@ -32650,7 +30954,7 @@ "type": "string", "format": "uint64" }, - "title": "list of unbonding ids, each uniquely identifying an unbonding of this validator" + "title": "list of unbonding ids, each uniquely identifing an unbonding of this validator" } }, "description": "Validator defines a validator, together with the total amount of the\nValidator's bond shares and their exchange rate to coins. Slashing results in\na decrease in the exchange rate, allowing correct calculation of future\nundelegations without iterating over delegators. When coins are delegated to\nthis validator, the validator is credited with a delegation whose number of\nbond shares is based on the amount of coins delegated divided by the current\nexchange rate. Voting power can be calculated as total bonded shares\nmultiplied by exchange rate." @@ -32910,7 +31214,7 @@ } } }, - "description": "Event allows application developers to attach additional information to\nResponseFinalizeBlock and ResponseCheckTx.\nLater, transactions may be queried using these events." + "description": "Event allows application developers to attach additional information to\nResponseBeginBlock, ResponseEndBlock, ResponseCheckTx and ResponseDeliverTx.\nLater, transactions may be queried using these events." }, "description": "Events contains a slice of Event objects that were emitted during message\nor handler execution." }, @@ -33094,7 +31398,7 @@ } } }, - "description": "Event allows application developers to attach additional information to\nResponseFinalizeBlock and ResponseCheckTx.\nLater, transactions may be queried using these events." + "description": "Event allows application developers to attach additional information to\nResponseBeginBlock, ResponseEndBlock, ResponseCheckTx and ResponseDeliverTx.\nLater, transactions may be queried using these events." }, "description": "Events defines all the events emitted by processing a transaction. Note,\nthese events include those emitted by processing all the messages and those\nemitted from the ante. Whereas Logs contains the events, with\nadditional metadata, emitted only by processing the messages.\n\nSince: cosmos-sdk 0.42.11, 0.44.5, 0.45" } @@ -33126,7 +31430,7 @@ "SIGN_MODE_EIP_191" ], "default": "SIGN_MODE_UNSPECIFIED", - "description": "SignMode represents a signing mode with its own security guarantees.\n\nThis enum should be considered a registry of all known sign modes\nin the Cosmos ecosystem. Apps are not expected to support all known\nsign modes. Apps that would like to support custom sign modes are\nencouraged to open a small PR against this file to add a new case\nto this SignMode enum describing their sign mode so that different\napps have a consistent version of this enum.\n\n - SIGN_MODE_UNSPECIFIED: SIGN_MODE_UNSPECIFIED specifies an unknown signing mode and will be\nrejected.\n - SIGN_MODE_DIRECT: SIGN_MODE_DIRECT specifies a signing mode which uses SignDoc and is\nverified with raw bytes from Tx.\n - SIGN_MODE_TEXTUAL: SIGN_MODE_TEXTUAL is a future signing mode that will verify some\nhuman-readable textual representation on top of the binary representation\nfrom SIGN_MODE_DIRECT.\n\nSince: cosmos-sdk 0.50\n - SIGN_MODE_DIRECT_AUX: SIGN_MODE_DIRECT_AUX specifies a signing mode which uses\nSignDocDirectAux. As opposed to SIGN_MODE_DIRECT, this sign mode does not\nrequire signers signing over other signers' `signer_info`.\n\nSince: cosmos-sdk 0.46\n - SIGN_MODE_LEGACY_AMINO_JSON: SIGN_MODE_LEGACY_AMINO_JSON is a backwards compatibility mode which uses\nAmino JSON and will be removed in the future.\n - SIGN_MODE_EIP_191: SIGN_MODE_EIP_191 specifies the sign mode for EIP 191 signing on the Cosmos\nSDK. Ref: https://eips.ethereum.org/EIPS/eip-191\n\nCurrently, SIGN_MODE_EIP_191 is registered as a SignMode enum variant,\nbut is not implemented on the SDK by default. To enable EIP-191, you need\nto pass a custom `TxConfig` that has an implementation of\n`SignModeHandler` for EIP-191. The SDK may decide to fully support\nEIP-191 in the future.\n\nSince: cosmos-sdk 0.45.2\nDeprecated: post 0.47.x Sign mode refers to a method of encoding string data for\nsigning, but in the SDK, it also refers to how to encode a transaction into a string.\nThis opens the possibility for additional EIP191 sign modes, like SIGN_MODE_EIP_191_TEXTUAL,\nSIGN_MODE_EIP_191_LEGACY_JSON, and more.\nEach new EIP191 sign mode should be accompanied by an associated ADR." + "description": "SignMode represents a signing mode with its own security guarantees.\n\nThis enum should be considered a registry of all known sign modes\nin the Cosmos ecosystem. Apps are not expected to support all known\nsign modes. Apps that would like to support custom sign modes are\nencouraged to open a small PR against this file to add a new case\nto this SignMode enum describing their sign mode so that different\napps have a consistent version of this enum.\n\n - SIGN_MODE_UNSPECIFIED: SIGN_MODE_UNSPECIFIED specifies an unknown signing mode and will be\nrejected.\n - SIGN_MODE_DIRECT: SIGN_MODE_DIRECT specifies a signing mode which uses SignDoc and is\nverified with raw bytes from Tx.\n - SIGN_MODE_TEXTUAL: SIGN_MODE_TEXTUAL is a future signing mode that will verify some\nhuman-readable textual representation on top of the binary representation\nfrom SIGN_MODE_DIRECT. It is currently not supported.\n - SIGN_MODE_DIRECT_AUX: SIGN_MODE_DIRECT_AUX specifies a signing mode which uses\nSignDocDirectAux. As opposed to SIGN_MODE_DIRECT, this sign mode does not\nrequire signers signing over other signers' `signer_info`. It also allows\nfor adding Tips in transactions.\n\nSince: cosmos-sdk 0.46\n - SIGN_MODE_LEGACY_AMINO_JSON: SIGN_MODE_LEGACY_AMINO_JSON is a backwards compatibility mode which uses\nAmino JSON and will be removed in the future.\n - SIGN_MODE_EIP_191: SIGN_MODE_EIP_191 specifies the sign mode for EIP 191 signing on the Cosmos\nSDK. Ref: https://eips.ethereum.org/EIPS/eip-191\n\nCurrently, SIGN_MODE_EIP_191 is registered as a SignMode enum variant,\nbut is not implemented on the SDK by default. To enable EIP-191, you need\nto pass a custom `TxConfig` that has an implementation of\n`SignModeHandler` for EIP-191. The SDK may decide to fully support\nEIP-191 in the future.\n\nSince: cosmos-sdk 0.45.2" }, "cosmos.tx.v1beta1.AuthInfo": { "type": "object", @@ -33211,7 +31515,7 @@ "BROADCAST_MODE_ASYNC" ], "default": "BROADCAST_MODE_UNSPECIFIED", - "description": "BroadcastMode specifies the broadcast mode for the TxService.Broadcast RPC\nmethod.\n\n - BROADCAST_MODE_UNSPECIFIED: zero-value for mode ordering\n - BROADCAST_MODE_BLOCK: Deprecated: use BROADCAST_MODE_SYNC instead,\nBROADCAST_MODE_BLOCK is not supported by the SDK from v0.47.x onwards.\n - BROADCAST_MODE_SYNC: BROADCAST_MODE_SYNC defines a tx broadcasting mode where the client waits\nfor a CheckTx execution response only.\n - BROADCAST_MODE_ASYNC: BROADCAST_MODE_ASYNC defines a tx broadcasting mode where the client\nreturns immediately." + "description": "BroadcastMode specifies the broadcast mode for the TxService.Broadcast RPC method.\n\n - BROADCAST_MODE_UNSPECIFIED: zero-value for mode ordering\n - BROADCAST_MODE_BLOCK: DEPRECATED: use BROADCAST_MODE_SYNC instead,\nBROADCAST_MODE_BLOCK is not supported by the SDK from v0.47.x onwards.\n - BROADCAST_MODE_SYNC: BROADCAST_MODE_SYNC defines a tx broadcasting mode where the client waits for\na CheckTx execution response only.\n - BROADCAST_MODE_ASYNC: BROADCAST_MODE_ASYNC defines a tx broadcasting mode where the client returns\nimmediately." }, "cosmos.tx.v1beta1.BroadcastTxRequest": { "type": "object", @@ -33230,7 +31534,7 @@ "BROADCAST_MODE_ASYNC" ], "default": "BROADCAST_MODE_UNSPECIFIED", - "description": "BroadcastMode specifies the broadcast mode for the TxService.Broadcast RPC\nmethod.\n\n - BROADCAST_MODE_UNSPECIFIED: zero-value for mode ordering\n - BROADCAST_MODE_BLOCK: Deprecated: use BROADCAST_MODE_SYNC instead,\nBROADCAST_MODE_BLOCK is not supported by the SDK from v0.47.x onwards.\n - BROADCAST_MODE_SYNC: BROADCAST_MODE_SYNC defines a tx broadcasting mode where the client waits\nfor a CheckTx execution response only.\n - BROADCAST_MODE_ASYNC: BROADCAST_MODE_ASYNC defines a tx broadcasting mode where the client\nreturns immediately." + "description": "BroadcastMode specifies the broadcast mode for the TxService.Broadcast RPC method.\n\n - BROADCAST_MODE_UNSPECIFIED: zero-value for mode ordering\n - BROADCAST_MODE_BLOCK: DEPRECATED: use BROADCAST_MODE_SYNC instead,\nBROADCAST_MODE_BLOCK is not supported by the SDK from v0.47.x onwards.\n - BROADCAST_MODE_SYNC: BROADCAST_MODE_SYNC defines a tx broadcasting mode where the client waits for\na CheckTx execution response only.\n - BROADCAST_MODE_ASYNC: BROADCAST_MODE_ASYNC defines a tx broadcasting mode where the client returns\nimmediately." } }, "description": "BroadcastTxRequest is the request type for the Service.BroadcastTxRequest\nRPC method." @@ -33372,7 +31676,7 @@ } } }, - "description": "Event allows application developers to attach additional information to\nResponseFinalizeBlock and ResponseCheckTx.\nLater, transactions may be queried using these events." + "description": "Event allows application developers to attach additional information to\nResponseBeginBlock, ResponseEndBlock, ResponseCheckTx and ResponseDeliverTx.\nLater, transactions may be queried using these events." }, "description": "Events defines all the events emitted by processing a transaction. Note,\nthese events include those emitted by processing all the messages and those\nemitted from the ante. Whereas Logs contains the events, with\nadditional metadata, emitted only by processing the messages.\n\nSince: cosmos-sdk 0.42.11, 0.44.5, 0.45" } @@ -33634,21 +31938,10 @@ }, "signature": { "type": "string", - "format": "byte", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." - }, - "extension": { - "type": "string", - "format": "byte", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages." - }, - "extension_signature": { - "type": "string", - "format": "byte", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + "format": "byte" } }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + "description": "Vote represents a prevote, precommit, or commit vote from validators for\nconsensus." }, "vote_b": { "type": "object", @@ -33710,21 +32003,10 @@ }, "signature": { "type": "string", - "format": "byte", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." - }, - "extension": { - "type": "string", - "format": "byte", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages." - }, - "extension_signature": { - "type": "string", - "format": "byte", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + "format": "byte" } }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + "description": "Vote represents a prevote, precommit, or commit vote from validators for\nconsensus." }, "total_voting_power": { "type": "string", @@ -33894,7 +32176,7 @@ "BLOCK_ID_FLAG_NIL" ], "default": "BLOCK_ID_FLAG_UNKNOWN", - "title": "BlockIdFlag indicates which BlockID the signature is for" + "title": "BlockIdFlag indicates which BlcokID the signature is for" }, "validator_address": { "type": "string", @@ -34096,7 +32378,7 @@ "BLOCK_ID_FLAG_NIL" ], "default": "BLOCK_ID_FLAG_UNKNOWN", - "title": "BlockIdFlag indicates which BlockID the signature is for" + "title": "BlockIdFlag indicates which BlcokID the signature is for" }, "validator_address": { "type": "string", @@ -34136,7 +32418,7 @@ } } }, - "description": "GetBlockWithTxsResponse is the response type for the Service.GetBlockWithTxs\nmethod.\n\nSince: cosmos-sdk 0.45.2" + "description": "GetBlockWithTxsResponse is the response type for the Service.GetBlockWithTxs method.\n\nSince: cosmos-sdk 0.45.2" }, "cosmos.tx.v1beta1.GetTxResponse": { "type": "object", @@ -34279,7 +32561,7 @@ } } }, - "description": "Event allows application developers to attach additional information to\nResponseFinalizeBlock and ResponseCheckTx.\nLater, transactions may be queried using these events." + "description": "Event allows application developers to attach additional information to\nResponseBeginBlock, ResponseEndBlock, ResponseCheckTx and ResponseDeliverTx.\nLater, transactions may be queried using these events." }, "description": "Events defines all the events emitted by processing a transaction. Note,\nthese events include those emitted by processing all the messages and those\nemitted from the ante. Whereas Logs contains the events, with\nadditional metadata, emitted only by processing the messages.\n\nSince: cosmos-sdk 0.42.11, 0.44.5, 0.45" } @@ -34435,7 +32717,7 @@ } } }, - "description": "Event allows application developers to attach additional information to\nResponseFinalizeBlock and ResponseCheckTx.\nLater, transactions may be queried using these events." + "description": "Event allows application developers to attach additional information to\nResponseBeginBlock, ResponseEndBlock, ResponseCheckTx and ResponseDeliverTx.\nLater, transactions may be queried using these events." }, "description": "Events defines all the events emitted by processing a transaction. Note,\nthese events include those emitted by processing all the messages and those\nemitted from the ante. Whereas Logs contains the events, with\nadditional metadata, emitted only by processing the messages.\n\nSince: cosmos-sdk 0.42.11, 0.44.5, 0.45" } @@ -34445,7 +32727,7 @@ "description": "tx_responses is the list of queried TxResponses." }, "pagination": { - "description": "pagination defines a pagination for the response.\nDeprecated: post v0.46.x use total instead.", + "description": "pagination defines a pagination for the response.\nDeprecated post v0.46.x: use total instead.", "type": "object", "properties": { "next_key": { @@ -34487,7 +32769,7 @@ "SIGN_MODE_EIP_191" ], "default": "SIGN_MODE_UNSPECIFIED", - "description": "SignMode represents a signing mode with its own security guarantees.\n\nThis enum should be considered a registry of all known sign modes\nin the Cosmos ecosystem. Apps are not expected to support all known\nsign modes. Apps that would like to support custom sign modes are\nencouraged to open a small PR against this file to add a new case\nto this SignMode enum describing their sign mode so that different\napps have a consistent version of this enum.\n\n - SIGN_MODE_UNSPECIFIED: SIGN_MODE_UNSPECIFIED specifies an unknown signing mode and will be\nrejected.\n - SIGN_MODE_DIRECT: SIGN_MODE_DIRECT specifies a signing mode which uses SignDoc and is\nverified with raw bytes from Tx.\n - SIGN_MODE_TEXTUAL: SIGN_MODE_TEXTUAL is a future signing mode that will verify some\nhuman-readable textual representation on top of the binary representation\nfrom SIGN_MODE_DIRECT.\n\nSince: cosmos-sdk 0.50\n - SIGN_MODE_DIRECT_AUX: SIGN_MODE_DIRECT_AUX specifies a signing mode which uses\nSignDocDirectAux. As opposed to SIGN_MODE_DIRECT, this sign mode does not\nrequire signers signing over other signers' `signer_info`.\n\nSince: cosmos-sdk 0.46\n - SIGN_MODE_LEGACY_AMINO_JSON: SIGN_MODE_LEGACY_AMINO_JSON is a backwards compatibility mode which uses\nAmino JSON and will be removed in the future.\n - SIGN_MODE_EIP_191: SIGN_MODE_EIP_191 specifies the sign mode for EIP 191 signing on the Cosmos\nSDK. Ref: https://eips.ethereum.org/EIPS/eip-191\n\nCurrently, SIGN_MODE_EIP_191 is registered as a SignMode enum variant,\nbut is not implemented on the SDK by default. To enable EIP-191, you need\nto pass a custom `TxConfig` that has an implementation of\n`SignModeHandler` for EIP-191. The SDK may decide to fully support\nEIP-191 in the future.\n\nSince: cosmos-sdk 0.45.2\nDeprecated: post 0.47.x Sign mode refers to a method of encoding string data for\nsigning, but in the SDK, it also refers to how to encode a transaction into a string.\nThis opens the possibility for additional EIP191 sign modes, like SIGN_MODE_EIP_191_TEXTUAL,\nSIGN_MODE_EIP_191_LEGACY_JSON, and more.\nEach new EIP191 sign mode should be accompanied by an associated ADR." + "description": "SignMode represents a signing mode with its own security guarantees.\n\nThis enum should be considered a registry of all known sign modes\nin the Cosmos ecosystem. Apps are not expected to support all known\nsign modes. Apps that would like to support custom sign modes are\nencouraged to open a small PR against this file to add a new case\nto this SignMode enum describing their sign mode so that different\napps have a consistent version of this enum.\n\n - SIGN_MODE_UNSPECIFIED: SIGN_MODE_UNSPECIFIED specifies an unknown signing mode and will be\nrejected.\n - SIGN_MODE_DIRECT: SIGN_MODE_DIRECT specifies a signing mode which uses SignDoc and is\nverified with raw bytes from Tx.\n - SIGN_MODE_TEXTUAL: SIGN_MODE_TEXTUAL is a future signing mode that will verify some\nhuman-readable textual representation on top of the binary representation\nfrom SIGN_MODE_DIRECT. It is currently not supported.\n - SIGN_MODE_DIRECT_AUX: SIGN_MODE_DIRECT_AUX specifies a signing mode which uses\nSignDocDirectAux. As opposed to SIGN_MODE_DIRECT, this sign mode does not\nrequire signers signing over other signers' `signer_info`. It also allows\nfor adding Tips in transactions.\n\nSince: cosmos-sdk 0.46\n - SIGN_MODE_LEGACY_AMINO_JSON: SIGN_MODE_LEGACY_AMINO_JSON is a backwards compatibility mode which uses\nAmino JSON and will be removed in the future.\n - SIGN_MODE_EIP_191: SIGN_MODE_EIP_191 specifies the sign mode for EIP 191 signing on the Cosmos\nSDK. Ref: https://eips.ethereum.org/EIPS/eip-191\n\nCurrently, SIGN_MODE_EIP_191 is registered as a SignMode enum variant,\nbut is not implemented on the SDK by default. To enable EIP-191, you need\nto pass a custom `TxConfig` that has an implementation of\n`SignModeHandler` for EIP-191. The SDK may decide to fully support\nEIP-191 in the future.\n\nSince: cosmos-sdk 0.45.2" } } }, @@ -34541,7 +32823,7 @@ "SIGN_MODE_EIP_191" ], "default": "SIGN_MODE_UNSPECIFIED", - "description": "SignMode represents a signing mode with its own security guarantees.\n\nThis enum should be considered a registry of all known sign modes\nin the Cosmos ecosystem. Apps are not expected to support all known\nsign modes. Apps that would like to support custom sign modes are\nencouraged to open a small PR against this file to add a new case\nto this SignMode enum describing their sign mode so that different\napps have a consistent version of this enum.\n\n - SIGN_MODE_UNSPECIFIED: SIGN_MODE_UNSPECIFIED specifies an unknown signing mode and will be\nrejected.\n - SIGN_MODE_DIRECT: SIGN_MODE_DIRECT specifies a signing mode which uses SignDoc and is\nverified with raw bytes from Tx.\n - SIGN_MODE_TEXTUAL: SIGN_MODE_TEXTUAL is a future signing mode that will verify some\nhuman-readable textual representation on top of the binary representation\nfrom SIGN_MODE_DIRECT.\n\nSince: cosmos-sdk 0.50\n - SIGN_MODE_DIRECT_AUX: SIGN_MODE_DIRECT_AUX specifies a signing mode which uses\nSignDocDirectAux. As opposed to SIGN_MODE_DIRECT, this sign mode does not\nrequire signers signing over other signers' `signer_info`.\n\nSince: cosmos-sdk 0.46\n - SIGN_MODE_LEGACY_AMINO_JSON: SIGN_MODE_LEGACY_AMINO_JSON is a backwards compatibility mode which uses\nAmino JSON and will be removed in the future.\n - SIGN_MODE_EIP_191: SIGN_MODE_EIP_191 specifies the sign mode for EIP 191 signing on the Cosmos\nSDK. Ref: https://eips.ethereum.org/EIPS/eip-191\n\nCurrently, SIGN_MODE_EIP_191 is registered as a SignMode enum variant,\nbut is not implemented on the SDK by default. To enable EIP-191, you need\nto pass a custom `TxConfig` that has an implementation of\n`SignModeHandler` for EIP-191. The SDK may decide to fully support\nEIP-191 in the future.\n\nSince: cosmos-sdk 0.45.2\nDeprecated: post 0.47.x Sign mode refers to a method of encoding string data for\nsigning, but in the SDK, it also refers to how to encode a transaction into a string.\nThis opens the possibility for additional EIP191 sign modes, like SIGN_MODE_EIP_191_TEXTUAL,\nSIGN_MODE_EIP_191_LEGACY_JSON, and more.\nEach new EIP191 sign mode should be accompanied by an associated ADR." + "description": "SignMode represents a signing mode with its own security guarantees.\n\nThis enum should be considered a registry of all known sign modes\nin the Cosmos ecosystem. Apps are not expected to support all known\nsign modes. Apps that would like to support custom sign modes are\nencouraged to open a small PR against this file to add a new case\nto this SignMode enum describing their sign mode so that different\napps have a consistent version of this enum.\n\n - SIGN_MODE_UNSPECIFIED: SIGN_MODE_UNSPECIFIED specifies an unknown signing mode and will be\nrejected.\n - SIGN_MODE_DIRECT: SIGN_MODE_DIRECT specifies a signing mode which uses SignDoc and is\nverified with raw bytes from Tx.\n - SIGN_MODE_TEXTUAL: SIGN_MODE_TEXTUAL is a future signing mode that will verify some\nhuman-readable textual representation on top of the binary representation\nfrom SIGN_MODE_DIRECT. It is currently not supported.\n - SIGN_MODE_DIRECT_AUX: SIGN_MODE_DIRECT_AUX specifies a signing mode which uses\nSignDocDirectAux. As opposed to SIGN_MODE_DIRECT, this sign mode does not\nrequire signers signing over other signers' `signer_info`. It also allows\nfor adding Tips in transactions.\n\nSince: cosmos-sdk 0.46\n - SIGN_MODE_LEGACY_AMINO_JSON: SIGN_MODE_LEGACY_AMINO_JSON is a backwards compatibility mode which uses\nAmino JSON and will be removed in the future.\n - SIGN_MODE_EIP_191: SIGN_MODE_EIP_191 specifies the sign mode for EIP 191 signing on the Cosmos\nSDK. Ref: https://eips.ethereum.org/EIPS/eip-191\n\nCurrently, SIGN_MODE_EIP_191 is registered as a SignMode enum variant,\nbut is not implemented on the SDK by default. To enable EIP-191, you need\nto pass a custom `TxConfig` that has an implementation of\n`SignModeHandler` for EIP-191. The SDK may decide to fully support\nEIP-191 in the future.\n\nSince: cosmos-sdk 0.45.2" } }, "title": "Single is the mode info for a single signer. It is structured as a message\nto allow for additional fields such as locale for SIGN_MODE_TEXTUAL in the\nfuture" @@ -34554,7 +32836,7 @@ "ORDER_BY_DESC" ], "default": "ORDER_BY_UNSPECIFIED", - "description": "- ORDER_BY_UNSPECIFIED: ORDER_BY_UNSPECIFIED specifies an unknown sorting order. OrderBy defaults\nto ASC in this case.\n - ORDER_BY_ASC: ORDER_BY_ASC defines ascending order\n - ORDER_BY_DESC: ORDER_BY_DESC defines descending order", + "description": "- ORDER_BY_UNSPECIFIED: ORDER_BY_UNSPECIFIED specifies an unknown sorting order. OrderBy defaults to ASC in this case.\n - ORDER_BY_ASC: ORDER_BY_ASC defines ascending order\n - ORDER_BY_DESC: ORDER_BY_DESC defines descending order", "title": "OrderBy defines the sorting order" }, "cosmos.tx.v1beta1.SignerInfo": { @@ -34661,7 +32943,7 @@ } } }, - "description": "Event allows application developers to attach additional information to\nResponseFinalizeBlock and ResponseCheckTx.\nLater, transactions may be queried using these events." + "description": "Event allows application developers to attach additional information to\nResponseBeginBlock, ResponseEndBlock, ResponseCheckTx and ResponseDeliverTx.\nLater, transactions may be queried using these events." }, "description": "Events contains a slice of Event objects that were emitted during message\nor handler execution." }, @@ -34983,7 +33265,7 @@ } } }, - "description": "Event allows application developers to attach additional information to\nResponseFinalizeBlock and ResponseCheckTx.\nLater, transactions may be queried using these events." + "description": "Event allows application developers to attach additional information to\nResponseBeginBlock, ResponseEndBlock, ResponseCheckTx and ResponseDeliverTx.\nLater, transactions may be queried using these events." }, "tendermint.abci.EventAttribute": { "type": "object", @@ -35197,21 +33479,10 @@ }, "signature": { "type": "string", - "format": "byte", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." - }, - "extension": { - "type": "string", - "format": "byte", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages." - }, - "extension_signature": { - "type": "string", - "format": "byte", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + "format": "byte" } }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + "description": "Vote represents a prevote, precommit, or commit vote from validators for\nconsensus." }, "vote_b": { "type": "object", @@ -35273,21 +33544,10 @@ }, "signature": { "type": "string", - "format": "byte", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." - }, - "extension": { - "type": "string", - "format": "byte", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages." - }, - "extension_signature": { - "type": "string", - "format": "byte", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + "format": "byte" } }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + "description": "Vote represents a prevote, precommit, or commit vote from validators for\nconsensus." }, "total_voting_power": { "type": "string", @@ -35457,7 +33717,7 @@ "BLOCK_ID_FLAG_NIL" ], "default": "BLOCK_ID_FLAG_UNKNOWN", - "title": "BlockIdFlag indicates which BlockID the signature is for" + "title": "BlockIdFlag indicates which BlcokID the signature is for" }, "validator_address": { "type": "string", @@ -35659,7 +33919,7 @@ "BLOCK_ID_FLAG_NIL" ], "default": "BLOCK_ID_FLAG_UNKNOWN", - "title": "BlockIdFlag indicates which BlockID the signature is for" + "title": "BlockIdFlag indicates which BlcokID the signature is for" }, "validator_address": { "type": "string", @@ -35691,7 +33951,7 @@ "BLOCK_ID_FLAG_NIL" ], "default": "BLOCK_ID_FLAG_UNKNOWN", - "title": "BlockIdFlag indicates which BlockID the signature is for" + "title": "BlockIdFlag indicates which BlcokID the signature is for" }, "tendermint.types.Commit": { "type": "object", @@ -35742,7 +34002,7 @@ "BLOCK_ID_FLAG_NIL" ], "default": "BLOCK_ID_FLAG_UNKNOWN", - "title": "BlockIdFlag indicates which BlockID the signature is for" + "title": "BlockIdFlag indicates which BlcokID the signature is for" }, "validator_address": { "type": "string", @@ -35775,7 +34035,7 @@ "BLOCK_ID_FLAG_NIL" ], "default": "BLOCK_ID_FLAG_UNKNOWN", - "title": "BlockIdFlag indicates which BlockID the signature is for" + "title": "BlockIdFlag indicates which BlcokID the signature is for" }, "validator_address": { "type": "string", @@ -35869,21 +34129,10 @@ }, "signature": { "type": "string", - "format": "byte", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." - }, - "extension": { - "type": "string", - "format": "byte", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages." - }, - "extension_signature": { - "type": "string", - "format": "byte", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + "format": "byte" } }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + "description": "Vote represents a prevote, precommit, or commit vote from validators for\nconsensus." }, "vote_b": { "type": "object", @@ -35945,21 +34194,10 @@ }, "signature": { "type": "string", - "format": "byte", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." - }, - "extension": { - "type": "string", - "format": "byte", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages." - }, - "extension_signature": { - "type": "string", - "format": "byte", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + "format": "byte" } }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + "description": "Vote represents a prevote, precommit, or commit vote from validators for\nconsensus." }, "total_voting_power": { "type": "string", @@ -36042,21 +34280,10 @@ }, "signature": { "type": "string", - "format": "byte", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." - }, - "extension": { - "type": "string", - "format": "byte", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages." - }, - "extension_signature": { - "type": "string", - "format": "byte", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + "format": "byte" } }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + "description": "Vote represents a prevote, precommit, or commit vote from validators for\nconsensus." }, "vote_b": { "type": "object", @@ -36118,21 +34345,10 @@ }, "signature": { "type": "string", - "format": "byte", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." - }, - "extension": { - "type": "string", - "format": "byte", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages." - }, - "extension_signature": { - "type": "string", - "format": "byte", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + "format": "byte" } }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + "description": "Vote represents a prevote, precommit, or commit vote from validators for\nconsensus." }, "total_voting_power": { "type": "string", @@ -36302,7 +34518,7 @@ "BLOCK_ID_FLAG_NIL" ], "default": "BLOCK_ID_FLAG_UNKNOWN", - "title": "BlockIdFlag indicates which BlockID the signature is for" + "title": "BlockIdFlag indicates which BlcokID the signature is for" }, "validator_address": { "type": "string", @@ -36523,21 +34739,10 @@ }, "signature": { "type": "string", - "format": "byte", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." - }, - "extension": { - "type": "string", - "format": "byte", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages." - }, - "extension_signature": { - "type": "string", - "format": "byte", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + "format": "byte" } }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + "description": "Vote represents a prevote, precommit, or commit vote from validators for\nconsensus." }, "vote_b": { "type": "object", @@ -36599,21 +34804,10 @@ }, "signature": { "type": "string", - "format": "byte", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." - }, - "extension": { - "type": "string", - "format": "byte", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages." - }, - "extension_signature": { - "type": "string", - "format": "byte", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + "format": "byte" } }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + "description": "Vote represents a prevote, precommit, or commit vote from validators for\nconsensus." }, "total_voting_power": { "type": "string", @@ -36783,7 +34977,7 @@ "BLOCK_ID_FLAG_NIL" ], "default": "BLOCK_ID_FLAG_UNKNOWN", - "title": "BlockIdFlag indicates which BlockID the signature is for" + "title": "BlockIdFlag indicates which BlcokID the signature is for" }, "validator_address": { "type": "string", @@ -37086,7 +35280,7 @@ "BLOCK_ID_FLAG_NIL" ], "default": "BLOCK_ID_FLAG_UNKNOWN", - "title": "BlockIdFlag indicates which BlockID the signature is for" + "title": "BlockIdFlag indicates which BlcokID the signature is for" }, "validator_address": { "type": "string", @@ -37338,7 +35532,7 @@ "BLOCK_ID_FLAG_NIL" ], "default": "BLOCK_ID_FLAG_UNKNOWN", - "title": "BlockIdFlag indicates which BlockID the signature is for" + "title": "BlockIdFlag indicates which BlcokID the signature is for" }, "validator_address": { "type": "string", @@ -37633,7 +35827,7 @@ "BLOCK_ID_FLAG_NIL" ], "default": "BLOCK_ID_FLAG_UNKNOWN", - "title": "BlockIdFlag indicates which BlockID the signature is for" + "title": "BlockIdFlag indicates which BlcokID the signature is for" }, "validator_address": { "type": "string", @@ -37832,21 +36026,10 @@ }, "signature": { "type": "string", - "format": "byte", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." - }, - "extension": { - "type": "string", - "format": "byte", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages." - }, - "extension_signature": { - "type": "string", - "format": "byte", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + "format": "byte" } }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + "description": "Vote represents a prevote, precommit, or commit vote from validators for\nconsensus." }, "cosmos.base.tendermint.v1beta1.ABCIQueryResponse": { "type": "object", @@ -38092,21 +36275,10 @@ }, "signature": { "type": "string", - "format": "byte", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." - }, - "extension": { - "type": "string", - "format": "byte", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages." - }, - "extension_signature": { - "type": "string", - "format": "byte", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + "format": "byte" } }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + "description": "Vote represents a prevote, precommit, or commit vote from validators for\nconsensus." }, "vote_b": { "type": "object", @@ -38168,21 +36340,10 @@ }, "signature": { "type": "string", - "format": "byte", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." - }, - "extension": { - "type": "string", - "format": "byte", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages." - }, - "extension_signature": { - "type": "string", - "format": "byte", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + "format": "byte" } }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + "description": "Vote represents a prevote, precommit, or commit vote from validators for\nconsensus." }, "total_voting_power": { "type": "string", @@ -38352,7 +36513,7 @@ "BLOCK_ID_FLAG_NIL" ], "default": "BLOCK_ID_FLAG_UNKNOWN", - "title": "BlockIdFlag indicates which BlockID the signature is for" + "title": "BlockIdFlag indicates which BlcokID the signature is for" }, "validator_address": { "type": "string", @@ -38554,7 +36715,7 @@ "BLOCK_ID_FLAG_NIL" ], "default": "BLOCK_ID_FLAG_UNKNOWN", - "title": "BlockIdFlag indicates which BlockID the signature is for" + "title": "BlockIdFlag indicates which BlcokID the signature is for" }, "validator_address": { "type": "string", @@ -38789,21 +36950,10 @@ }, "signature": { "type": "string", - "format": "byte", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." - }, - "extension": { - "type": "string", - "format": "byte", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages." - }, - "extension_signature": { - "type": "string", - "format": "byte", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + "format": "byte" } }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + "description": "Vote represents a prevote, precommit, or commit vote from validators for\nconsensus." }, "vote_b": { "type": "object", @@ -38865,21 +37015,10 @@ }, "signature": { "type": "string", - "format": "byte", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." - }, - "extension": { - "type": "string", - "format": "byte", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages." - }, - "extension_signature": { - "type": "string", - "format": "byte", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + "format": "byte" } }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + "description": "Vote represents a prevote, precommit, or commit vote from validators for\nconsensus." }, "total_voting_power": { "type": "string", @@ -39049,7 +37188,7 @@ "BLOCK_ID_FLAG_NIL" ], "default": "BLOCK_ID_FLAG_UNKNOWN", - "title": "BlockIdFlag indicates which BlockID the signature is for" + "title": "BlockIdFlag indicates which BlcokID the signature is for" }, "validator_address": { "type": "string", @@ -39251,7 +37390,7 @@ "BLOCK_ID_FLAG_NIL" ], "default": "BLOCK_ID_FLAG_UNKNOWN", - "title": "BlockIdFlag indicates which BlockID the signature is for" + "title": "BlockIdFlag indicates which BlcokID the signature is for" }, "validator_address": { "type": "string", @@ -39458,21 +37597,10 @@ }, "signature": { "type": "string", - "format": "byte", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." - }, - "extension": { - "type": "string", - "format": "byte", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages." - }, - "extension_signature": { - "type": "string", - "format": "byte", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + "format": "byte" } }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + "description": "Vote represents a prevote, precommit, or commit vote from validators for\nconsensus." }, "vote_b": { "type": "object", @@ -39534,21 +37662,10 @@ }, "signature": { "type": "string", - "format": "byte", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." - }, - "extension": { - "type": "string", - "format": "byte", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages." - }, - "extension_signature": { - "type": "string", - "format": "byte", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + "format": "byte" } }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + "description": "Vote represents a prevote, precommit, or commit vote from validators for\nconsensus." }, "total_voting_power": { "type": "string", @@ -39718,7 +37835,7 @@ "BLOCK_ID_FLAG_NIL" ], "default": "BLOCK_ID_FLAG_UNKNOWN", - "title": "BlockIdFlag indicates which BlockID the signature is for" + "title": "BlockIdFlag indicates which BlcokID the signature is for" }, "validator_address": { "type": "string", @@ -39920,7 +38037,7 @@ "BLOCK_ID_FLAG_NIL" ], "default": "BLOCK_ID_FLAG_UNKNOWN", - "title": "BlockIdFlag indicates which BlockID the signature is for" + "title": "BlockIdFlag indicates which BlcokID the signature is for" }, "validator_address": { "type": "string", @@ -40158,21 +38275,10 @@ }, "signature": { "type": "string", - "format": "byte", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." - }, - "extension": { - "type": "string", - "format": "byte", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages." - }, - "extension_signature": { - "type": "string", - "format": "byte", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + "format": "byte" } }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + "description": "Vote represents a prevote, precommit, or commit vote from validators for\nconsensus." }, "vote_b": { "type": "object", @@ -40234,21 +38340,10 @@ }, "signature": { "type": "string", - "format": "byte", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." - }, - "extension": { - "type": "string", - "format": "byte", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages." - }, - "extension_signature": { - "type": "string", - "format": "byte", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + "format": "byte" } }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + "description": "Vote represents a prevote, precommit, or commit vote from validators for\nconsensus." }, "total_voting_power": { "type": "string", @@ -40418,7 +38513,7 @@ "BLOCK_ID_FLAG_NIL" ], "default": "BLOCK_ID_FLAG_UNKNOWN", - "title": "BlockIdFlag indicates which BlockID the signature is for" + "title": "BlockIdFlag indicates which BlcokID the signature is for" }, "validator_address": { "type": "string", @@ -40620,7 +38715,7 @@ "BLOCK_ID_FLAG_NIL" ], "default": "BLOCK_ID_FLAG_UNKNOWN", - "title": "BlockIdFlag indicates which BlockID the signature is for" + "title": "BlockIdFlag indicates which BlcokID the signature is for" }, "validator_address": { "type": "string", @@ -40827,21 +38922,10 @@ }, "signature": { "type": "string", - "format": "byte", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." - }, - "extension": { - "type": "string", - "format": "byte", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages." - }, - "extension_signature": { - "type": "string", - "format": "byte", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + "format": "byte" } }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + "description": "Vote represents a prevote, precommit, or commit vote from validators for\nconsensus." }, "vote_b": { "type": "object", @@ -40903,21 +38987,10 @@ }, "signature": { "type": "string", - "format": "byte", - "description": "Vote signature by the validator if they participated in consensus for the\nassociated block." - }, - "extension": { - "type": "string", - "format": "byte", - "description": "Vote extension provided by the application. Only valid for precommit\nmessages." - }, - "extension_signature": { - "type": "string", - "format": "byte", - "description": "Vote extension signature by the validator if they participated in\nconsensus for the associated block.\nOnly valid for precommit messages." + "format": "byte" } }, - "description": "Vote represents a prevote or precommit vote from validators for\nconsensus." + "description": "Vote represents a prevote, precommit, or commit vote from validators for\nconsensus." }, "total_voting_power": { "type": "string", @@ -41087,7 +39160,7 @@ "BLOCK_ID_FLAG_NIL" ], "default": "BLOCK_ID_FLAG_UNKNOWN", - "title": "BlockIdFlag indicates which BlockID the signature is for" + "title": "BlockIdFlag indicates which BlcokID the signature is for" }, "validator_address": { "type": "string", @@ -41289,7 +39362,7 @@ "BLOCK_ID_FLAG_NIL" ], "default": "BLOCK_ID_FLAG_UNKNOWN", - "title": "BlockIdFlag indicates which BlockID the signature is for" + "title": "BlockIdFlag indicates which BlcokID the signature is for" }, "validator_address": { "type": "string", From aa0b9d5d3f182a6bfa69fad8faf6a25fa6f8125e Mon Sep 17 00:00:00 2001 From: Luke Date: Fri, 5 Jan 2024 22:43:51 +0800 Subject: [PATCH 055/345] fix(staking): fix NewMsgCreateValidator return err info is wrong (#2234) --- precompiles/staking/types.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/precompiles/staking/types.go b/precompiles/staking/types.go index bdf1792e31..429b38ac6a 100644 --- a/precompiles/staking/types.go +++ b/precompiles/staking/types.go @@ -112,13 +112,13 @@ func NewMsgCreateValidator(args []interface{}, denom string) (*stakingtypes.MsgC validatorAddress, ok := args[3].(common.Address) if !ok || validatorAddress == (common.Address{}) { - return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidValidator, args[4]) + return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidValidator, args[3]) } // use cli `evmosd tendermint show-validator` get pubkey pubkeyBase64Str, ok := args[4].(string) if !ok { - return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidType, "pubkey", "string", args[5]) + return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidType, "pubkey", "string", args[4]) } pubkeyBytes, err := base64.StdEncoding.DecodeString(pubkeyBase64Str) if err != nil { From 3c42703644a51e3fcc0e6e91e00d9f43416749ca Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Fri, 5 Jan 2024 16:30:37 +0100 Subject: [PATCH 056/345] fix(changelog): add missing changelog entry for #2234 (#2238) add missing changelog entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 78840086fc..d07c995809 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -152,6 +152,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (swagger) [#2219](https://github.com/evmos/evmos/pull/2219) Update Swagger configuration to remove outdated entries and update vesting module version. - (outposts) [#2223](https://github.com/evmos/evmos/pull/2223) Update Outposts struct documentation and `ValidateBasic`. - (p256-precompile) [#2228](https://github.com/evmos/evmos/pull/2228) Adjust p256 precompile address from `0x0b` to `0x100`. +- (staking-precompile) [#2234](https://github.com/evmos/evmos/pull/2234) Fix wrong error messages in `NewMsgCreateValidator`. ### Bug Fixes From 8c88c1425392220d88ac373c29247e32dc3fa79f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Jan 2024 08:54:39 -0300 Subject: [PATCH 057/345] build(deps-dev): bump pycryptodome from 3.15.0 to 3.19.1 in /tests/nix_tests (#2242) build(deps-dev): bump pycryptodome in /tests/nix_tests Bumps [pycryptodome](https://github.com/Legrandin/pycryptodome) from 3.15.0 to 3.19.1. - [Release notes](https://github.com/Legrandin/pycryptodome/releases) - [Changelog](https://github.com/Legrandin/pycryptodome/blob/master/Changelog.rst) - [Commits](https://github.com/Legrandin/pycryptodome/compare/v3.15.0...v3.19.1) --- updated-dependencies: - dependency-name: pycryptodome dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tests/nix_tests/poetry.lock | 69 ++++++++++++++++++------------------- 1 file changed, 34 insertions(+), 35 deletions(-) diff --git a/tests/nix_tests/poetry.lock b/tests/nix_tests/poetry.lock index ae846dc66f..2cef45c6a6 100644 --- a/tests/nix_tests/poetry.lock +++ b/tests/nix_tests/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. [[package]] name = "aiohttp" @@ -1352,44 +1352,43 @@ files = [ [[package]] name = "pycryptodome" -version = "3.15.0" +version = "3.19.1" description = "Cryptographic library for Python" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ - {file = "pycryptodome-3.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ff7ae90e36c1715a54446e7872b76102baa5c63aa980917f4aa45e8c78d1a3ec"}, - {file = "pycryptodome-3.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:2ffd8b31561455453ca9f62cb4c24e6b8d119d6d531087af5f14b64bee2c23e6"}, - {file = "pycryptodome-3.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:2ea63d46157386c5053cfebcdd9bd8e0c8b7b0ac4a0507a027f5174929403884"}, - {file = "pycryptodome-3.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:7c9ed8aa31c146bef65d89a1b655f5f4eab5e1120f55fc297713c89c9e56ff0b"}, - {file = "pycryptodome-3.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:5099c9ca345b2f252f0c28e96904643153bae9258647585e5e6f649bb7a1844a"}, - {file = "pycryptodome-3.15.0-cp27-cp27m-manylinux2014_aarch64.whl", hash = "sha256:2ec709b0a58b539a4f9d33fb8508264c3678d7edb33a68b8906ba914f71e8c13"}, - {file = "pycryptodome-3.15.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:2ae53125de5b0d2c95194d957db9bb2681da8c24d0fb0fe3b056de2bcaf5d837"}, - {file = "pycryptodome-3.15.0-cp27-cp27m-win32.whl", hash = "sha256:fd2184aae6ee2a944aaa49113e6f5787cdc5e4db1eb8edb1aea914bd75f33a0c"}, - {file = "pycryptodome-3.15.0-cp27-cp27m-win_amd64.whl", hash = "sha256:7e3a8f6ee405b3bd1c4da371b93c31f7027944b2bcce0697022801db93120d83"}, - {file = "pycryptodome-3.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:b9c5b1a1977491533dfd31e01550ee36ae0249d78aae7f632590db833a5012b8"}, - {file = "pycryptodome-3.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:0926f7cc3735033061ef3cf27ed16faad6544b14666410727b31fea85a5b16eb"}, - {file = "pycryptodome-3.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:2aa55aae81f935a08d5a3c2042eb81741a43e044bd8a81ea7239448ad751f763"}, - {file = "pycryptodome-3.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:c3640deff4197fa064295aaac10ab49a0d55ef3d6a54ae1499c40d646655c89f"}, - {file = "pycryptodome-3.15.0-cp27-cp27mu-manylinux2014_aarch64.whl", hash = "sha256:045d75527241d17e6ef13636d845a12e54660aa82e823b3b3341bcf5af03fa79"}, - {file = "pycryptodome-3.15.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:eb6fce570869e70cc8ebe68eaa1c26bed56d40ad0f93431ee61d400525433c54"}, - {file = "pycryptodome-3.15.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9ee40e2168f1348ae476676a2e938ca80a2f57b14a249d8fe0d3cdf803e5a676"}, - {file = "pycryptodome-3.15.0-cp35-abi3-manylinux1_i686.whl", hash = "sha256:4c3ccad74eeb7b001f3538643c4225eac398c77d617ebb3e57571a897943c667"}, - {file = "pycryptodome-3.15.0-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:1b22bcd9ec55e9c74927f6b1f69843cb256fb5a465088ce62837f793d9ffea88"}, - {file = "pycryptodome-3.15.0-cp35-abi3-manylinux2010_i686.whl", hash = "sha256:57f565acd2f0cf6fb3e1ba553d0cb1f33405ec1f9c5ded9b9a0a5320f2c0bd3d"}, - {file = "pycryptodome-3.15.0-cp35-abi3-manylinux2010_x86_64.whl", hash = "sha256:4b52cb18b0ad46087caeb37a15e08040f3b4c2d444d58371b6f5d786d95534c2"}, - {file = "pycryptodome-3.15.0-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:092a26e78b73f2530b8bd6b3898e7453ab2f36e42fd85097d705d6aba2ec3e5e"}, - {file = "pycryptodome-3.15.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:50ca7e587b8e541eb6c192acf92449d95377d1f88908c0a32ac5ac2703ebe28b"}, - {file = "pycryptodome-3.15.0-cp35-abi3-win32.whl", hash = "sha256:e244ab85c422260de91cda6379e8e986405b4f13dc97d2876497178707f87fc1"}, - {file = "pycryptodome-3.15.0-cp35-abi3-win_amd64.whl", hash = "sha256:c77126899c4b9c9827ddf50565e93955cb3996813c18900c16b2ea0474e130e9"}, - {file = "pycryptodome-3.15.0-pp27-pypy_73-macosx_10_9_x86_64.whl", hash = "sha256:9eaadc058106344a566dc51d3d3a758ab07f8edde013712bc8d22032a86b264f"}, - {file = "pycryptodome-3.15.0-pp27-pypy_73-manylinux1_x86_64.whl", hash = "sha256:ff287bcba9fbeb4f1cccc1f2e90a08d691480735a611ee83c80a7d74ad72b9d9"}, - {file = "pycryptodome-3.15.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:60b4faae330c3624cc5a546ba9cfd7b8273995a15de94ee4538130d74953ec2e"}, - {file = "pycryptodome-3.15.0-pp27-pypy_73-win32.whl", hash = "sha256:a8f06611e691c2ce45ca09bbf983e2ff2f8f4f87313609d80c125aff9fad6e7f"}, - {file = "pycryptodome-3.15.0-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b9cc96e274b253e47ad33ae1fccc36ea386f5251a823ccb50593a935db47fdd2"}, - {file = "pycryptodome-3.15.0-pp36-pypy36_pp73-manylinux1_x86_64.whl", hash = "sha256:ecaaef2d21b365d9c5ca8427ffc10cebed9d9102749fd502218c23cb9a05feb5"}, - {file = "pycryptodome-3.15.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:d2a39a66057ab191e5c27211a7daf8f0737f23acbf6b3562b25a62df65ffcb7b"}, - {file = "pycryptodome-3.15.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:9c772c485b27967514d0df1458b56875f4b6d025566bf27399d0c239ff1b369f"}, - {file = "pycryptodome-3.15.0.tar.gz", hash = "sha256:9135dddad504592bcc18b0d2d95ce86c3a5ea87ec6447ef25cfedea12d6018b8"}, + {file = "pycryptodome-3.19.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:694020d2ff985cd714381b9da949a21028c24b86f562526186f6af7c7547e986"}, + {file = "pycryptodome-3.19.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:4464b0e8fd5508bff9baf18e6fd4c6548b1ac2ce9862d6965ff6a84ec9cb302a"}, + {file = "pycryptodome-3.19.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:420972f9c62978e852c74055d81c354079ce3c3a2213a92c9d7e37bbc63a26e2"}, + {file = "pycryptodome-3.19.1-cp27-cp27m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1bc0c49d986a1491d66d2a56570f12e960b12508b7e71f2423f532e28857f36"}, + {file = "pycryptodome-3.19.1-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:e038ab77fec0956d7aa989a3c647652937fc142ef41c9382c2ebd13c127d5b4a"}, + {file = "pycryptodome-3.19.1-cp27-cp27m-win32.whl", hash = "sha256:a991f8ffe8dfe708f86690948ae46442eebdd0fff07dc1b605987939a34ec979"}, + {file = "pycryptodome-3.19.1-cp27-cp27m-win_amd64.whl", hash = "sha256:2c16426ef49d9cba018be2340ea986837e1dfa25c2ea181787971654dd49aadd"}, + {file = "pycryptodome-3.19.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:6d0d2b97758ebf2f36c39060520447c26455acb3bcff309c28b1c816173a6ff5"}, + {file = "pycryptodome-3.19.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:b8b80ff92049fd042177282917d994d344365ab7e8ec2bc03e853d93d2401786"}, + {file = "pycryptodome-3.19.1-cp27-cp27mu-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd4e7e8bf0fc1ada854688b9b309ee607e2aa85a8b44180f91021a4dd330a928"}, + {file = "pycryptodome-3.19.1-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:8cf5d3d6cf921fa81acd1f632f6cedcc03f5f68fc50c364cd39490ba01d17c49"}, + {file = "pycryptodome-3.19.1-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:67939a3adbe637281c611596e44500ff309d547e932c449337649921b17b6297"}, + {file = "pycryptodome-3.19.1-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:11ddf6c9b52116b62223b6a9f4741bc4f62bb265392a4463282f7f34bb287180"}, + {file = "pycryptodome-3.19.1-cp35-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3e6f89480616781d2a7f981472d0cdb09b9da9e8196f43c1234eff45c915766"}, + {file = "pycryptodome-3.19.1-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27e1efcb68993b7ce5d1d047a46a601d41281bba9f1971e6be4aa27c69ab8065"}, + {file = "pycryptodome-3.19.1-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c6273ca5a03b672e504995529b8bae56da0ebb691d8ef141c4aa68f60765700"}, + {file = "pycryptodome-3.19.1-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:b0bfe61506795877ff974f994397f0c862d037f6f1c0bfc3572195fc00833b96"}, + {file = "pycryptodome-3.19.1-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:f34976c5c8eb79e14c7d970fb097482835be8d410a4220f86260695ede4c3e17"}, + {file = "pycryptodome-3.19.1-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:7c9e222d0976f68d0cf6409cfea896676ddc1d98485d601e9508f90f60e2b0a2"}, + {file = "pycryptodome-3.19.1-cp35-abi3-win32.whl", hash = "sha256:4805e053571140cb37cf153b5c72cd324bb1e3e837cbe590a19f69b6cf85fd03"}, + {file = "pycryptodome-3.19.1-cp35-abi3-win_amd64.whl", hash = "sha256:a470237ee71a1efd63f9becebc0ad84b88ec28e6784a2047684b693f458f41b7"}, + {file = "pycryptodome-3.19.1-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:ed932eb6c2b1c4391e166e1a562c9d2f020bfff44a0e1b108f67af38b390ea89"}, + {file = "pycryptodome-3.19.1-pp27-pypy_73-win32.whl", hash = "sha256:81e9d23c0316fc1b45d984a44881b220062336bbdc340aa9218e8d0656587934"}, + {file = "pycryptodome-3.19.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:37e531bf896b70fe302f003d3be5a0a8697737a8d177967da7e23eff60d6483c"}, + {file = "pycryptodome-3.19.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd4e95b0eb4b28251c825fe7aa941fe077f993e5ca9b855665935b86fbb1cc08"}, + {file = "pycryptodome-3.19.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c22c80246c3c880c6950d2a8addf156cee74ec0dc5757d01e8e7067a3c7da015"}, + {file = "pycryptodome-3.19.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:e70f5c839c7798743a948efa2a65d1fe96bb397fe6d7f2bde93d869fe4f0ad69"}, + {file = "pycryptodome-3.19.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6c3df3613592ea6afaec900fd7189d23c8c28b75b550254f4bd33fe94acb84b9"}, + {file = "pycryptodome-3.19.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08b445799d571041765e7d5c9ca09c5d3866c2f22eeb0dd4394a4169285184f4"}, + {file = "pycryptodome-3.19.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:954d156cd50130afd53f8d77f830fe6d5801bd23e97a69d358fed068f433fbfe"}, + {file = "pycryptodome-3.19.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b7efd46b0b4ac869046e814d83244aeab14ef787f4850644119b1c8b0ec2d637"}, + {file = "pycryptodome-3.19.1.tar.gz", hash = "sha256:8ae0dd1bcfada451c35f9e29a3e5db385caabc190f98e4a80ad02a61098fb776"}, ] [[package]] From 7994ffb6482a65735bc3b5263bd08208f13fcd51 Mon Sep 17 00:00:00 2001 From: Luke Date: Mon, 8 Jan 2024 21:53:27 +0800 Subject: [PATCH 058/345] imp: use const BaseDenom replace aevmos (#2233) * imp: use const BaseDenom replace aevmos * chore: make format --------- Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- precompiles/staking/integration_test.go | 5 +++-- x/erc20/keeper/integration_test.go | 8 ++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/precompiles/staking/integration_test.go b/precompiles/staking/integration_test.go index 478f4e7f8c..76a62da556 100644 --- a/precompiles/staking/integration_test.go +++ b/precompiles/staking/integration_test.go @@ -29,6 +29,7 @@ import ( "github.com/evmos/evmos/v16/precompiles/testutil/contracts" evmosutil "github.com/evmos/evmos/v16/testutil" testutiltx "github.com/evmos/evmos/v16/testutil/tx" + "github.com/evmos/evmos/v16/utils" ) // General variables used for integration tests @@ -2235,7 +2236,7 @@ var _ = Describe("Calling staking precompile via Solidity", func() { err = s.precompile.UnpackIntoInterface(&delOut, staking.DelegationMethod, ethRes.Ret) Expect(err).To(BeNil(), "error while unpacking the delegation output: %v", err) Expect(delOut.Balance.Amount.Int64()).To(Equal(int64(0)), "expected a different delegation balance") - Expect(delOut.Balance.Denom).To(Equal("aevmos"), "expected a different delegation balance") + Expect(delOut.Balance.Denom).To(Equal(utils.BaseDenom), "expected a different delegation balance") }) It("which exists should return the delegation", func() { @@ -2250,7 +2251,7 @@ var _ = Describe("Calling staking precompile via Solidity", func() { err = s.precompile.UnpackIntoInterface(&delOut, staking.DelegationMethod, ethRes.Ret) Expect(err).To(BeNil(), "error while unpacking the delegation output: %v", err) Expect(delOut.Balance).To(Equal( - cmn.Coin{Denom: "aevmos", Amount: big.NewInt(1e18)}), + cmn.Coin{Denom: utils.BaseDenom, Amount: big.NewInt(1e18)}), "expected a different delegation balance", ) }) diff --git a/x/erc20/keeper/integration_test.go b/x/erc20/keeper/integration_test.go index d756ec2159..b658d56b12 100644 --- a/x/erc20/keeper/integration_test.go +++ b/x/erc20/keeper/integration_test.go @@ -112,7 +112,7 @@ var _ = Describe("ERC20:", Ordered, func() { BeforeEach(func() { // Mint coins to pay gas fee, gov deposit and registering coins in Bankkeeper coins := sdk.NewCoins( - sdk.NewCoin("aevmos", fundsAmt), + sdk.NewCoin(utils.BaseDenom, fundsAmt), sdk.NewCoin(stakingtypes.DefaultParams().BondDenom, fundsAmt), sdk.NewCoin(metadataIbc.Base, math.NewInt(1)), sdk.NewCoin(metadataCoin.Base, math.NewInt(1)), @@ -132,7 +132,7 @@ var _ = Describe("ERC20:", Ordered, func() { s.Require().NoError(err) coins := sdk.NewCoins( - sdk.NewCoin("aevmos", fundsAmt), + sdk.NewCoin(utils.BaseDenom, fundsAmt), sdk.NewCoin(stakingtypes.DefaultParams().BondDenom, fundsAmt), ) err = testutil.FundAccount(s.ctx, s.app.BankKeeper, accAddr, coins) @@ -148,7 +148,7 @@ var _ = Describe("ERC20:", Ordered, func() { proposal, found := s.app.GovKeeper.GetProposal(s.ctx, id) s.Require().True(found) - _, err = testutil.Delegate(s.ctx, s.app, privKey, sdk.NewCoin("aevmos", math.NewInt(500000000000000000)), s.validator) + _, err = testutil.Delegate(s.ctx, s.app, privKey, sdk.NewCoin(utils.BaseDenom, math.NewInt(500000000000000000)), s.validator) s.Require().NoError(err) _, err = testutil.Vote(s.ctx, s.app, privKey, id, govv1beta1.OptionYes) @@ -174,7 +174,7 @@ var _ = Describe("ERC20:", Ordered, func() { proposal, found := s.app.GovKeeper.GetProposal(s.ctx, id) s.Require().True(found) - _, err = testutil.Delegate(s.ctx, s.app, privKey, sdk.NewCoin("aevmos", math.NewInt(500000000000000000)), s.validator) + _, err = testutil.Delegate(s.ctx, s.app, privKey, sdk.NewCoin(utils.BaseDenom, math.NewInt(500000000000000000)), s.validator) s.Require().NoError(err) _, err = testutil.Vote(s.ctx, s.app, privKey, id, govv1beta1.OptionYes) From ea75cb96037349fc27c85a8a0ec820a9b5a55b59 Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Wed, 10 Jan 2024 06:19:29 -0300 Subject: [PATCH 059/345] chore: add burnt coins metrics (#2246) * add burnt coins metrics * add changelog entry * add test case * small fix * small refactor --- CHANGELOG.md | 1 + app/post/burn.go | 24 +++++++++++++++++++++--- app/post/burn_test.go | 18 ++++++++++++++++++ 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d07c995809..d03e40674c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -153,6 +153,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (outposts) [#2223](https://github.com/evmos/evmos/pull/2223) Update Outposts struct documentation and `ValidateBasic`. - (p256-precompile) [#2228](https://github.com/evmos/evmos/pull/2228) Adjust p256 precompile address from `0x0b` to `0x100`. - (staking-precompile) [#2234](https://github.com/evmos/evmos/pull/2234) Fix wrong error messages in `NewMsgCreateValidator`. +- (metrics) [#2246](https://github.com/evmos/evmos/pull/2246) Add burnt cosmos transactions fees metric. ### Bug Fixes diff --git a/app/post/burn.go b/app/post/burn.go index ca80a21692..5cca8ac1d1 100644 --- a/app/post/burn.go +++ b/app/post/burn.go @@ -7,6 +7,8 @@ import ( errorsmod "cosmossdk.io/errors" sdkmath "cosmossdk.io/math" + "github.com/armon/go-metrics" + "github.com/cosmos/cosmos-sdk/telemetry" sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" @@ -54,7 +56,7 @@ func (bd BurnDecorator) PostHandle(ctx sdk.Context, tx sdk.Tx, simulate, success } // burn min(balance, fee) - var burnedCoins sdk.Coins + var burntCoins sdk.Coins for _, fee := range fees { balance := bd.bankKeeper.GetBalance(ctx, authtypes.NewModuleAddress(bd.feeCollectorName), fee.Denom) if !balance.IsPositive() { @@ -63,14 +65,30 @@ func (bd BurnDecorator) PostHandle(ctx sdk.Context, tx sdk.Tx, simulate, success amount := sdkmath.MinInt(fee.Amount, balance.Amount) - burnedCoins = append(burnedCoins, sdk.Coin{Denom: fee.Denom, Amount: amount}) + burntCoins = append(burntCoins, sdk.Coin{Denom: fee.Denom, Amount: amount}) } // NOTE: since all Cosmos tx fees are pooled by the fee collector module account, // we burn them directly from it - if err := bd.bankKeeper.BurnCoins(ctx, bd.feeCollectorName, burnedCoins); err != nil { + if err := bd.bankKeeper.BurnCoins(ctx, bd.feeCollectorName, burntCoins); err != nil { return ctx, err } + defer func() { + for _, c := range burntCoins { + // if fee amount is higher than uint64, skip the counter + if !c.Amount.IsUint64() { + continue + } + telemetry.IncrCounterWithLabels( + []string{"burnt", "tx", "fee", "amount"}, + float32(c.Amount.Uint64()), + []metrics.Label{ + telemetry.NewLabel("denom", c.Denom), + }, + ) + } + }() + return next(ctx, tx, simulate, success) } diff --git a/app/post/burn_test.go b/app/post/burn_test.go index bea61bb7ba..cb8117611e 100644 --- a/app/post/burn_test.go +++ b/app/post/burn_test.go @@ -130,6 +130,24 @@ func (s *PostTestSuite) TestPostHandle() { s.Require().Equal(expected, balance) }, }, + { + name: "pass - fees exceeds MaxUint64 (~18 EVMOS). Should not panic", + tx: func() sdk.Tx { + amt, ok := sdkmath.NewIntFromString("10000000000000000000000000000000000") + s.Require().True(ok) + feeAmount := sdk.Coins{sdk.Coin{Amount: amt, Denom: "evmos"}} + amount := sdk.Coins{sdk.Coin{Amount: amt, Denom: "evmos"}} + s.MintCoinsForFeeCollector(amount) + + return s.BuildCosmosTxWithNSendMsg(1, feeAmount) + }, + expPass: true, + postChecks: func() { + expected := sdk.Coins{} + balance := s.GetFeeCollectorBalance() + s.Require().Equal(expected, balance) + }, + }, } for _, tc := range testCases { From 8feb1fdfc9fd7781892f9ae403ed6e08ca56397b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jan 2024 12:03:09 -0300 Subject: [PATCH 060/345] build(deps): bump golang from 1.21.5-alpine3.18 to 1.21.6-alpine3.18 (#2250) Bumps golang from 1.21.5-alpine3.18 to 1.21.6-alpine3.18. --- updated-dependencies: - dependency-name: golang dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 082b1e5793..35d864507a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.21.5-alpine3.18 AS build-env +FROM golang:1.21.6-alpine3.18 AS build-env ARG DB_BACKEND=goleveldb ARG ROCKSDB_VERSION="8.8.1" From 67015bd58d4a8d31a9f6e2736f5a7bdfc7139233 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jan 2024 15:12:00 +0000 Subject: [PATCH 061/345] build(deps): bump golang.org/x/net from 0.19.0 to 0.20.0 (#2244) * build(deps): bump golang.org/x/net from 0.19.0 to 0.20.0 Bumps [golang.org/x/net](https://github.com/golang/net) from 0.19.0 to 0.20.0. - [Commits](https://github.com/golang/net/compare/v0.19.0...v0.20.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * gomod2nix generate --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: tom --- go.mod | 8 ++++---- go.sum | 16 ++++++++-------- gomod2nix.toml | 16 ++++++++-------- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/go.mod b/go.mod index 4fed71560c..ab9a91453e 100644 --- a/go.mod +++ b/go.mod @@ -45,9 +45,9 @@ require ( github.com/tyler-smith/go-bip39 v1.1.0 github.com/zondax/hid v0.9.2 go.opencensus.io v0.24.0 - golang.org/x/crypto v0.17.0 + golang.org/x/crypto v0.18.0 golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb - golang.org/x/net v0.19.0 + golang.org/x/net v0.20.0 golang.org/x/text v0.14.0 google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 google.golang.org/grpc v1.60.1 @@ -227,8 +227,8 @@ require ( golang.org/x/mod v0.13.0 // indirect golang.org/x/oauth2 v0.13.0 // indirect golang.org/x/sync v0.4.0 // indirect - golang.org/x/sys v0.15.0 // indirect - golang.org/x/term v0.15.0 // indirect + golang.org/x/sys v0.16.0 // indirect + golang.org/x/term v0.16.0 // indirect golang.org/x/tools v0.14.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/api v0.128.0 // indirect diff --git a/go.sum b/go.sum index 033b7f8845..f1399a075c 100644 --- a/go.sum +++ b/go.sum @@ -1213,8 +1213,8 @@ golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= -golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1322,8 +1322,8 @@ golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= -golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1479,16 +1479,16 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= -golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= +golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/gomod2nix.toml b/gomod2nix.toml index ba8fc3d82c..3da4ea32cf 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -637,8 +637,8 @@ schema = 3 version = "v0.24.0" hash = "sha256-4H+mGZgG2c9I1y0m8avF4qmt8LUKxxVsTqR8mKgP4yo=" [mod."golang.org/x/crypto"] - version = "v0.17.0" - hash = "sha256-/vzBaeD/Ymyc7cpjBvSfJfuZ57zWa9LOaZM7b33eIx0=" + version = "v0.18.0" + hash = "sha256-BuMVUxOIyfLo8MOhqYt+uQ8NDN6P2KdblKyfPxINzQ4=" [mod."golang.org/x/exp"] version = "v0.0.0-20230711153332-06a737ee72cb" hash = "sha256-Cbw10ZJ+jATPV232G47xZrn6ExO1FDtiT6nlMRCH7EI=" @@ -646,8 +646,8 @@ schema = 3 version = "v0.13.0" hash = "sha256-qh/YmxS0auZEiKzqdn+v84qs31SpkGIJn9rqKLjdKVU=" [mod."golang.org/x/net"] - version = "v0.19.0" - hash = "sha256-3M5rKEvJx4cO/q+06cGjR5sxF5JpnUWY0+fQttrWdT4=" + version = "v0.20.0" + hash = "sha256-PCttIsWSBQd6fDXL49jepszUAMLnAGAKR//5EDO3XDk=" [mod."golang.org/x/oauth2"] version = "v0.13.0" hash = "sha256-mEmRQrh6FMsenT7x406HbZCynBJCHJ4e9u0M3hpG3m4=" @@ -655,11 +655,11 @@ schema = 3 version = "v0.4.0" hash = "sha256-VCl5IerUva6XZqGXHa0J/r/ewsbOIIP7EBqyh1JGsXY=" [mod."golang.org/x/sys"] - version = "v0.15.0" - hash = "sha256-n7TlABF6179RzGq3gctPDKDPRtDfnwPdjNCMm8ps2KY=" + version = "v0.16.0" + hash = "sha256-ZkGclbp2S7NQYhbuGji6XokCn2Qi1BJy8dwyAOTV8sY=" [mod."golang.org/x/term"] - version = "v0.15.0" - hash = "sha256-rsvtsE7sKmBwtR+mhJ8iUq93ZT8fV2LU+Pd69sh2es8=" + version = "v0.16.0" + hash = "sha256-9qlHcsCI1sa7ZI4Q+fJbOp3mG5Y+uV16e+pGmG+MQe0=" [mod."golang.org/x/text"] version = "v0.14.0" hash = "sha256-yh3B0tom1RfzQBf1RNmfdNWF1PtiqxV41jW1GVS6JAg=" From a7c00de98df3aab1763ff7435d8929fff7718089 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jan 2024 12:15:40 -0300 Subject: [PATCH 062/345] build(deps-dev): bump follow-redirects from 1.15.2 to 1.15.4 in /tests/nix_tests/hardhat (#2251) build(deps-dev): bump follow-redirects in /tests/nix_tests/hardhat Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.2 to 1.15.4. - [Release notes](https://github.com/follow-redirects/follow-redirects/releases) - [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.2...v1.15.4) --- updated-dependencies: - dependency-name: follow-redirects dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tests/nix_tests/hardhat/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/nix_tests/hardhat/package-lock.json b/tests/nix_tests/hardhat/package-lock.json index 191b215ad4..897ea49672 100644 --- a/tests/nix_tests/hardhat/package-lock.json +++ b/tests/nix_tests/hardhat/package-lock.json @@ -3482,9 +3482,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", + "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", "dev": true, "funding": [ { @@ -9579,9 +9579,9 @@ "dev": true }, "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", + "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", "dev": true }, "form-data": { From 45de227e3443e55947505c6bde9da4b50f88fae7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jan 2024 15:20:15 +0000 Subject: [PATCH 063/345] build(deps): bump follow-redirects from 1.15.2 to 1.15.4 in /tests/solidity (#2252) build(deps): bump follow-redirects in /tests/solidity Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.2 to 1.15.4. - [Release notes](https://github.com/follow-redirects/follow-redirects/releases) - [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.2...v1.15.4) --- updated-dependencies: - dependency-name: follow-redirects dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- tests/solidity/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/solidity/yarn.lock b/tests/solidity/yarn.lock index 268469eb7d..32322f9b8f 100644 --- a/tests/solidity/yarn.lock +++ b/tests/solidity/yarn.lock @@ -5462,9 +5462,9 @@ flat@^5.0.2: integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== follow-redirects@^1.12.1, follow-redirects@^1.14.8, follow-redirects@^1.15.0: - version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + version "1.15.4" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.4.tgz#cdc7d308bf6493126b17ea2191ea0ccf3e535adf" + integrity sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw== for-each@^0.3.3: version "0.3.3" From a37ed8417f5326de36f9215c42e91fdbf7cf9128 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jan 2024 15:29:13 +0000 Subject: [PATCH 064/345] build(deps): bump golang.org/x/crypto from 0.17.0 to 0.18.0 (#2243) * build(deps): bump golang.org/x/crypto from 0.17.0 to 0.18.0 Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.17.0 to 0.18.0. - [Commits](https://github.com/golang/crypto/compare/v0.17.0...v0.18.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * gomod2nix generate --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: tom Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> From 0dfba9aa22aa8ed7b9408bb1ac09ece712a601c1 Mon Sep 17 00:00:00 2001 From: Jacob Kim Date: Thu, 11 Jan 2024 00:29:46 +0900 Subject: [PATCH 065/345] fix(app/ante) replace vestingtypes to anteutils from ante handler options (#2232) * remove vestingtypes from antehandler options * fix build --------- Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- app/ante/cosmos/vesting.go | 6 ++++-- app/ante/handler_options.go | 4 +--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/ante/cosmos/vesting.go b/app/ante/cosmos/vesting.go index c9dc04bb9c..82aa81fe03 100644 --- a/app/ante/cosmos/vesting.go +++ b/app/ante/cosmos/vesting.go @@ -9,6 +9,8 @@ import ( errortypes "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/x/authz" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + + anteutils "github.com/evmos/evmos/v16/app/ante/utils" evmtypes "github.com/evmos/evmos/v16/x/evm/types" vestingtypes "github.com/evmos/evmos/v16/x/vesting/types" ) @@ -18,13 +20,13 @@ import ( // VestingDelegationDecorator validates delegation of vested coins type VestingDelegationDecorator struct { ak evmtypes.AccountKeeper - sk vestingtypes.StakingKeeper + sk anteutils.StakingKeeper bk evmtypes.BankKeeper cdc codec.BinaryCodec } // NewVestingDelegationDecorator creates a new VestingDelegationDecorator -func NewVestingDelegationDecorator(ak evmtypes.AccountKeeper, sk vestingtypes.StakingKeeper, bk evmtypes.BankKeeper, cdc codec.BinaryCodec) VestingDelegationDecorator { +func NewVestingDelegationDecorator(ak evmtypes.AccountKeeper, sk anteutils.StakingKeeper, bk evmtypes.BankKeeper, cdc codec.BinaryCodec) VestingDelegationDecorator { return VestingDelegationDecorator{ ak: ak, sk: sk, diff --git a/app/ante/handler_options.go b/app/ante/handler_options.go index ef3ccba70b..51f2ada010 100644 --- a/app/ante/handler_options.go +++ b/app/ante/handler_options.go @@ -17,8 +17,6 @@ import ( evmante "github.com/evmos/evmos/v16/app/ante/evm" anteutils "github.com/evmos/evmos/v16/app/ante/utils" evmtypes "github.com/evmos/evmos/v16/x/evm/types" - - vestingtypes "github.com/evmos/evmos/v16/x/vesting/types" ) // HandlerOptions defines the list of module keepers required to run the Evmos @@ -29,7 +27,7 @@ type HandlerOptions struct { BankKeeper evmtypes.BankKeeper DistributionKeeper anteutils.DistributionKeeper IBCKeeper *ibckeeper.Keeper - StakingKeeper vestingtypes.StakingKeeper + StakingKeeper anteutils.StakingKeeper FeeMarketKeeper evmante.FeeMarketKeeper EvmKeeper evmante.EVMKeeper FeegrantKeeper ante.FeegrantKeeper From c9688f389dfb0261c87ca828555359059f4732c0 Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Thu, 11 Jan 2024 21:35:45 -0300 Subject: [PATCH 066/345] fix(erc20): add logic to deploy token pairs contracts on genesis (#2217) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(erc20): add logic to deploy token pairs contracts on genesis * add changelog entry * regenerate mock * fix lint issues * make format * refactor helper func * refactor helper func * changes based on review comments * add lic * add comments * add comments * add comments * update genesis tests * make format * add tests for setGenTokenPair fn * fix lint issues * update osmosis outpost e2e test * fix gosec issues * fix lint issues * refactor tests * add comments * address review comments * add metadata validation in test * Apply suggestions from code review * add base denom validation * remove broken PAT from nix CI flow * add getDenomDecimals tests * changes based on review comments * changes based on review comments * fix err msg --------- Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> --- .github/workflows/e2e-test.yml | 14 +- CHANGELOG.md | 1 + ibc/errors.go | 11 + ibc/utils.go | 50 ++ ibc/utils_test.go | 167 ++-- precompiles/erc20/errors.go | 7 +- precompiles/erc20/query.go | 45 +- .../nix_tests/configs/osmosis-outpost.jsonnet | 3 + tests/nix_tests/test_osmosis_outpost.py | 54 +- tests/nix_tests/utils.py | 23 - x/erc20/genesis.go | 7 +- x/erc20/genesis_test.go | 76 +- x/erc20/keeper/evm.go | 51 +- x/erc20/keeper/genesis.go | 155 ++++ x/erc20/keeper/genesis_test.go | 175 +++++ x/erc20/types/interfaces.go | 20 + x/erc20/types/mocks/EVMKeeper.go | 732 +++++++++++++++++- 17 files changed, 1356 insertions(+), 235 deletions(-) create mode 100644 ibc/errors.go create mode 100644 x/erc20/keeper/genesis.go create mode 100644 x/erc20/keeper/genesis_test.go diff --git a/.github/workflows/e2e-test.yml b/.github/workflows/e2e-test.yml index 1bcd14de01..b5a53c96d8 100644 --- a/.github/workflows/e2e-test.yml +++ b/.github/workflows/e2e-test.yml @@ -34,8 +34,9 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - with: - token: ${{ secrets.E2E_PAT }} + # TODO: create a new PAT to use here + # with: + # token: ${{ secrets.E2E_PAT }} - uses: cachix/install-nix-action@v24 with: # pin to nix-2.13 to workaround compability issue of 2.14, @@ -61,10 +62,11 @@ jobs: run: make run-nix-tests if: env.GIT_DIFF # Commit gomod2nix changes files back to the repository if necessary - - uses: stefanzweifel/git-auto-commit-action@v5 - with: - commit_message: update gomod2nix.toml file - file_pattern: '*.toml' + # TODO: uncomment this once added the new PAT to commit the changes (when needed) + # - uses: stefanzweifel/git-auto-commit-action@v5 + # with: + # commit_message: update gomod2nix.toml file + # file_pattern: '*.toml' upload-cache: if: github.event_name == 'push' diff --git a/CHANGELOG.md b/CHANGELOG.md index d03e40674c..c78db8d008 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -59,6 +59,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (osmosis-outpost) [#2206](https://github.com/evmos/evmos/pull/2206) Update swap function input to custom struct. - (stride-outpost) [#2207](https://github.com/evmos/evmos/pull/2207) Update Stride Outpost to include additional arguments. - (incentives) [#2221](https://github.com/evmos/evmos/pull/2221) Burn the usage incentives pool balance during v16 upgrade. +- (erc20) [#2217](https://github.com/evmos/evmos/pull/2217) Add logic to deploy token pairs contracts on genesis. ### API Breaking diff --git a/ibc/errors.go b/ibc/errors.go new file mode 100644 index 0000000000..fd4d7188f1 --- /dev/null +++ b/ibc/errors.go @@ -0,0 +1,11 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) +package ibc + +import "errors" + +var ( + ErrNoIBCVoucherDenom = errors.New("denom is not an IBC voucher") + ErrDenomTraceNotFound = errors.New("denom trace not found") + ErrInvalidBaseDenom = errors.New("invalid base denomination") +) diff --git a/ibc/utils.go b/ibc/utils.go index 6dc0a2d7a3..21e630cf59 100644 --- a/ibc/utils.go +++ b/ibc/utils.go @@ -4,6 +4,8 @@ package ibc import ( + "strings" + errorsmod "cosmossdk.io/errors" "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" @@ -11,6 +13,7 @@ import ( transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + transferkeeper "github.com/evmos/evmos/v16/x/ibc/transfer/keeper" "github.com/evmos/evmos/v16/utils" ) @@ -124,3 +127,50 @@ func GetSentCoin(rawDenom, rawAmt string) sdk.Coin { Amount: amount, } } + +// GetDenomTrace returns the denomination trace from the corresponding IBC denomination. If the +// denomination is not an IBC voucher or the trace is not found, it returns an error. +func GetDenomTrace( + transferKeeper transferkeeper.Keeper, + ctx sdk.Context, + denom string, +) (transfertypes.DenomTrace, error) { + if !strings.HasPrefix(denom, "ibc/") { + return transfertypes.DenomTrace{}, errorsmod.Wrapf(ErrNoIBCVoucherDenom, denom) + } + + hash, err := transfertypes.ParseHexHash(denom[4:]) + if err != nil { + return transfertypes.DenomTrace{}, err + } + + denomTrace, found := transferKeeper.GetDenomTrace(ctx, hash) + if !found { + return transfertypes.DenomTrace{}, ErrDenomTraceNotFound + } + + return denomTrace, nil +} + +// DeriveDecimalsFromDenom returns the number of decimals of an IBC coin +// depending on the prefix of the base denomination +func DeriveDecimalsFromDenom(baseDenom string) (uint8, error) { + var decimals uint8 + if len(baseDenom) == 0 { + return decimals, errorsmod.Wrapf(ErrInvalidBaseDenom, "Base denom cannot be an empty string") + } + + switch baseDenom[0] { + case 'u': // micro (u) -> 6 decimals + decimals = 6 + case 'a': // atto (a) -> 18 decimals + decimals = 18 + default: + return decimals, errorsmod.Wrapf( + ErrInvalidBaseDenom, + "Should be either micro ('u[...]') or atto ('a[...]'); got: %q", + baseDenom, + ) + } + return decimals, nil +} diff --git a/ibc/utils_test.go b/ibc/utils_test.go index b3a18aa31c..bafc8de173 100644 --- a/ibc/utils_test.go +++ b/ibc/utils_test.go @@ -28,32 +28,35 @@ func TestGetTransferSenderRecipient(t *testing.T) { expError bool }{ { - "empty packet", - channeltypes.Packet{}, - "", "", - true, + name: "empty packet", + packet: channeltypes.Packet{}, + expSender: "", + expRecipient: "", + expError: true, }, { - "invalid packet data", - channeltypes.Packet{ + name: "invalid packet data", + packet: channeltypes.Packet{ Data: ibctesting.MockFailPacketData, }, - "", "", - true, + expSender: "", + expRecipient: "", + expError: true, }, { - "empty FungibleTokenPacketData", - channeltypes.Packet{ + name: "empty FungibleTokenPacketData", + packet: channeltypes.Packet{ Data: transfertypes.ModuleCdc.MustMarshalJSON( &transfertypes.FungibleTokenPacketData{}, ), }, - "", "", - true, + expSender: "", + expRecipient: "", + expError: true, }, { - "invalid sender", - channeltypes.Packet{ + name: "invalid sender", + packet: channeltypes.Packet{ Data: transfertypes.ModuleCdc.MustMarshalJSON( &transfertypes.FungibleTokenPacketData{ Sender: "cosmos1", @@ -62,12 +65,13 @@ func TestGetTransferSenderRecipient(t *testing.T) { }, ), }, - "", "", - true, + expSender: "", + expRecipient: "", + expError: true, }, { - "invalid recipient", - channeltypes.Packet{ + name: "invalid recipient", + packet: channeltypes.Packet{ Data: transfertypes.ModuleCdc.MustMarshalJSON( &transfertypes.FungibleTokenPacketData{ Sender: "cosmos1qql8ag4cluz6r4dz28p3w00dnc9w8ueulg2gmc", @@ -76,12 +80,13 @@ func TestGetTransferSenderRecipient(t *testing.T) { }, ), }, - "", "", - true, + expSender: "", + expRecipient: "", + expError: true, }, { - "valid - cosmos sender, evmos recipient", - channeltypes.Packet{ + name: "valid - cosmos sender, evmos recipient", + packet: channeltypes.Packet{ Data: transfertypes.ModuleCdc.MustMarshalJSON( &transfertypes.FungibleTokenPacketData{ Sender: "cosmos1qql8ag4cluz6r4dz28p3w00dnc9w8ueulg2gmc", @@ -90,13 +95,13 @@ func TestGetTransferSenderRecipient(t *testing.T) { }, ), }, - "evmos1qql8ag4cluz6r4dz28p3w00dnc9w8ueuafmxps", - "evmos1x2w87cvt5mqjncav4lxy8yfreynn273xn5335v", - false, + expSender: "evmos1qql8ag4cluz6r4dz28p3w00dnc9w8ueuafmxps", + expRecipient: "evmos1x2w87cvt5mqjncav4lxy8yfreynn273xn5335v", + expError: false, }, { - "valid - evmos sender, cosmos recipient", - channeltypes.Packet{ + name: "valid - evmos sender, cosmos recipient", + packet: channeltypes.Packet{ Data: transfertypes.ModuleCdc.MustMarshalJSON( &transfertypes.FungibleTokenPacketData{ Sender: "evmos1x2w87cvt5mqjncav4lxy8yfreynn273xn5335v", @@ -105,13 +110,13 @@ func TestGetTransferSenderRecipient(t *testing.T) { }, ), }, - "evmos1x2w87cvt5mqjncav4lxy8yfreynn273xn5335v", - "evmos1qql8ag4cluz6r4dz28p3w00dnc9w8ueuafmxps", - false, + expSender: "evmos1x2w87cvt5mqjncav4lxy8yfreynn273xn5335v", + expRecipient: "evmos1qql8ag4cluz6r4dz28p3w00dnc9w8ueuafmxps", + expError: false, }, { - "valid - osmosis sender, evmos recipient", - channeltypes.Packet{ + name: "valid - osmosis sender, evmos recipient", + packet: channeltypes.Packet{ Data: transfertypes.ModuleCdc.MustMarshalJSON( &transfertypes.FungibleTokenPacketData{ Sender: "osmo1qql8ag4cluz6r4dz28p3w00dnc9w8ueuhnecd2", @@ -120,9 +125,9 @@ func TestGetTransferSenderRecipient(t *testing.T) { }, ), }, - "evmos1qql8ag4cluz6r4dz28p3w00dnc9w8ueuafmxps", - "evmos1x2w87cvt5mqjncav4lxy8yfreynn273xn5335v", - false, + expSender: "evmos1qql8ag4cluz6r4dz28p3w00dnc9w8ueuafmxps", + expRecipient: "evmos1x2w87cvt5mqjncav4lxy8yfreynn273xn5335v", + expError: false, }, } @@ -146,22 +151,20 @@ func TestGetTransferAmount(t *testing.T) { expError bool }{ { - "empty packet", - channeltypes.Packet{}, - "", - true, + name: "empty packet", + packet: channeltypes.Packet{}, + expAmount: "", + expError: true, }, { - "invalid packet data", - channeltypes.Packet{ - Data: ibctesting.MockFailPacketData, - }, - "", - true, + name: "invalid packet data", + packet: channeltypes.Packet{Data: ibctesting.MockFailPacketData}, + expAmount: "", + expError: true, }, { - "invalid amount - empty", - channeltypes.Packet{ + name: "invalid amount - empty", + packet: channeltypes.Packet{ Data: transfertypes.ModuleCdc.MustMarshalJSON( &transfertypes.FungibleTokenPacketData{ Sender: "cosmos1qql8ag4cluz6r4dz28p3w00dnc9w8ueulg2gmc", @@ -170,12 +173,12 @@ func TestGetTransferAmount(t *testing.T) { }, ), }, - "", - true, + expAmount: "", + expError: true, }, { - "invalid amount - non-int", - channeltypes.Packet{ + name: "invalid amount - non-int", + packet: channeltypes.Packet{ Data: transfertypes.ModuleCdc.MustMarshalJSON( &transfertypes.FungibleTokenPacketData{ Sender: "cosmos1qql8ag4cluz6r4dz28p3w00dnc9w8ueulg2gmc", @@ -184,12 +187,12 @@ func TestGetTransferAmount(t *testing.T) { }, ), }, - "test", - true, + expAmount: "test", + expError: true, }, { - "valid", - channeltypes.Packet{ + name: "valid", + packet: channeltypes.Packet{ Data: transfertypes.ModuleCdc.MustMarshalJSON( &transfertypes.FungibleTokenPacketData{ Sender: "cosmos1qql8ag4cluz6r4dz28p3w00dnc9w8ueulg2gmc", @@ -198,8 +201,8 @@ func TestGetTransferAmount(t *testing.T) { }, ), }, - "10000", - false, + expAmount: "10000", + expError: false, }, } @@ -317,3 +320,53 @@ func TestGetSentCoin(t *testing.T) { require.Equal(t, tc.expCoin, coin) } } + +func TestDeriveDecimalsFromDenom(t *testing.T) { + testCases := []struct { + name string + baseDenom string + expDec uint8 + expFail bool + expErrMsg string + }{ + { + name: "fail: empty string", + baseDenom: "", + expDec: 0, + expFail: true, + expErrMsg: "Base denom cannot be an empty string", + }, + { + name: "fail: invalid prefix", + baseDenom: "nevmos", + expDec: 0, + expFail: true, + expErrMsg: "Should be either micro ('u[...]') or atto ('a[...]'); got: \"nevmos\"", + }, + { + name: "success: micro 'u' prefix", + baseDenom: "uevmos", + expDec: 6, + expFail: false, + expErrMsg: "", + }, + { + name: "success: atto 'a' prefix", + baseDenom: "aevmos", + expDec: 18, + expFail: false, + expErrMsg: "", + }, + } + + for _, tc := range testCases { + dec, err := DeriveDecimalsFromDenom(tc.baseDenom) + if tc.expFail { + require.Error(t, err, tc.expErrMsg) + require.Contains(t, err.Error(), tc.expErrMsg) + } else { + require.NoError(t, err) + } + require.Equal(t, tc.expDec, dec) + } +} diff --git a/precompiles/erc20/errors.go b/precompiles/erc20/errors.go index d2b4c0763d..0a859e16a8 100644 --- a/precompiles/erc20/errors.go +++ b/precompiles/erc20/errors.go @@ -11,6 +11,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" + "github.com/evmos/evmos/v16/ibc" cmn "github.com/evmos/evmos/v16/precompiles/common" evmtypes "github.com/evmos/evmos/v16/x/evm/types" ) @@ -28,10 +29,8 @@ var ( // Precompile errors ErrDecreaseNonPositiveValue = errors.New("cannot decrease allowance with non-positive values") - ErrDenomTraceNotFound = errors.New("denom trace not found") ErrIncreaseNonPositiveValue = errors.New("cannot increase allowance with non-positive values") ErrNegativeAmount = errors.New("cannot approve negative values") - ErrNoIBCVoucherDenom = errors.New("denom is not an IBC voucher") ErrSpenderIsOwner = errors.New("spender cannot be the owner") // ERC20 errors @@ -81,8 +80,8 @@ func ConvertErrToERC20Error(err error) error { return ErrDecreasedAllowanceBelowZero case strings.Contains(err.Error(), cmn.ErrIntegerOverflow): return vm.ErrExecutionReverted - case errors.Is(err, ErrNoIBCVoucherDenom) || - errors.Is(err, ErrDenomTraceNotFound) || + case errors.Is(err, ibc.ErrNoIBCVoucherDenom) || + errors.Is(err, ibc.ErrDenomTraceNotFound) || strings.Contains(err.Error(), "invalid base denomination") || strings.Contains(err.Error(), "display denomination not found") || strings.Contains(err.Error(), "invalid decimals"): diff --git a/precompiles/erc20/query.go b/precompiles/erc20/query.go index 924e853e3a..a36aee7d7c 100644 --- a/precompiles/erc20/query.go +++ b/precompiles/erc20/query.go @@ -11,14 +11,12 @@ import ( "strings" "time" - errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/authz" authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" + "github.com/evmos/evmos/v16/ibc" auth "github.com/evmos/evmos/v16/precompiles/authorization" - transferkeeper "github.com/evmos/evmos/v16/x/ibc/transfer/keeper" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" @@ -103,22 +101,17 @@ func (p Precompile) Decimals( ) ([]byte, error) { metadata, found := p.bankKeeper.GetDenomMetaData(ctx, p.tokenPair.Denom) if !found { - denomTrace, err := GetDenomTrace(p.transferKeeper, ctx, p.tokenPair.Denom) + denomTrace, err := ibc.GetDenomTrace(p.transferKeeper, ctx, p.tokenPair.Denom) if err != nil { return nil, ConvertErrToERC20Error(err) } // we assume the decimal from the first character of the denomination - switch string(denomTrace.BaseDenom[0]) { - case "u": // micro (u) -> 6 decimals - return method.Outputs.Pack(uint8(6)) - case "a": // atto (a) -> 18 decimals - return method.Outputs.Pack(uint8(18)) + decimals, err := ibc.DeriveDecimalsFromDenom(denomTrace.BaseDenom) + if err != nil { + return nil, ConvertErrToERC20Error(err) } - return nil, ConvertErrToERC20Error(fmt.Errorf( - "invalid base denomination; should be either micro ('u[...]') or atto ('a[...]'); got: %q", - denomTrace.BaseDenom, - )) + return method.Outputs.Pack(decimals) } var ( @@ -213,30 +206,6 @@ func (p Precompile) Allowance( return method.Outputs.Pack(allowance) } -// GetDenomTrace returns the denomination trace from the corresponding IBC denomination. If the -// denomination is not an IBC voucher or the trace is not found, it returns an error. -func GetDenomTrace( - transferKeeper transferkeeper.Keeper, - ctx sdk.Context, - denom string, -) (transfertypes.DenomTrace, error) { - if !strings.HasPrefix(denom, "ibc/") { - return transfertypes.DenomTrace{}, errorsmod.Wrapf(ErrNoIBCVoucherDenom, denom) - } - - hash, err := transfertypes.ParseHexHash(denom[4:]) - if err != nil { - return transfertypes.DenomTrace{}, err - } - - denomTrace, found := transferKeeper.GetDenomTrace(ctx, hash) - if !found { - return transfertypes.DenomTrace{}, ErrDenomTraceNotFound - } - - return denomTrace, nil -} - // GetAuthzExpirationAndAllowance returns the authorization, its expiration as well as the amount of denom // that the grantee is allowed to spend on behalf of the granter. func GetAuthzExpirationAndAllowance( @@ -264,7 +233,7 @@ func GetAuthzExpirationAndAllowance( // getBaseDenomFromIBCVoucher returns the base denomination from the given IBC voucher denomination. func (p Precompile) getBaseDenomFromIBCVoucher(ctx sdk.Context, denom string) (string, error) { // Infer the denomination name from the coin denomination base denom - denomTrace, err := GetDenomTrace(p.transferKeeper, ctx, denom) + denomTrace, err := ibc.GetDenomTrace(p.transferKeeper, ctx, denom) if err != nil { // FIXME: return 'not supported' (same error as when you call the method on an ERC20.sol) return "", err diff --git a/tests/nix_tests/configs/osmosis-outpost.jsonnet b/tests/nix_tests/configs/osmosis-outpost.jsonnet index d9b2dbc434..fb29d0156f 100644 --- a/tests/nix_tests/configs/osmosis-outpost.jsonnet +++ b/tests/nix_tests/configs/osmosis-outpost.jsonnet @@ -19,6 +19,9 @@ config { 'contract_owner': 1, }], }, + transfer: { + 'denom_traces': [{"path":"transfer/channel-0","base_denom":"uosmo"}], + }, }, }, }, diff --git a/tests/nix_tests/test_osmosis_outpost.py b/tests/nix_tests/test_osmosis_outpost.py index 6d95009a9b..85cd2f7a49 100644 --- a/tests/nix_tests/test_osmosis_outpost.py +++ b/tests/nix_tests/test_osmosis_outpost.py @@ -17,12 +17,10 @@ OSMOSIS_POOLS, WASM_CONTRACTS, WEVMOS_ADDRESS, - approve_proposal, erc20_balance, eth_to_bech32, get_event_attribute_value, get_precompile_contract, - register_ibc_coin, send_transaction, wait_for_cosmos_tx_receipt, wait_for_fn, @@ -146,7 +144,7 @@ def setup_osmos_chains(ibc): # ===== Deploy CrosschainSwap V1===== cross_swap_contract = WASM_CONTRACTS["CrosschainSwap"] - deploy_wasm_contract( + xcs_contract = deploy_wasm_contract( osmosis_cli, osmosis_addr, cross_swap_contract, @@ -163,7 +161,7 @@ def setup_osmos_chains(ibc): osmosis_cli, osmosis_addr, swap_contract_addr, pool_id, EVMOS_IBC_DENOM, "uosmo" ) - return swap_contract_addr + return xcs_contract def send_evmos_to_osmos(ibc): @@ -245,54 +243,6 @@ def check_balance_change(): wait_for_fn("balance change", check_balance_change) -def register_osmo_token(evmos): - """ - Register Osmo token as ERC20 token pair. - Helper function that creates the corresponding - gov proposal, votes for it, and waits till it passes - """ - evmos_cli = evmos.cosmos_cli() - - # TODO - generate the osmos ibc denom - osmos_ibc_denom = OSMO_IBC_DENOM - ERC_OSMO_META = { - "description": "Generic IBC token description", - "denom_units": [ - # TODO - generate the osmos ibc denom - { - "denom": osmos_ibc_denom, - "exponent": 0, - }, - ], - # TODO - generate the osmos ibc denom - "base": osmos_ibc_denom, - "display": osmos_ibc_denom, - "name": "Generic IBC name", - "symbol": "IBC", - } - - proposal = { - "title": "Register Osmosis ERC20 token", - "description": "The IBC representation of OSMO on Evmos chain", - "metadata": [ERC_OSMO_META], - "deposit": "1aevmos", - } - proposal_id = register_ibc_coin(evmos_cli, proposal) - assert ( - int(proposal_id) > 0 - ), "expected a non-zero proposal ID for the registration of the OSMO token." - print("proposal id: ", proposal_id) - # vote 'yes' on proposal and wait it to pass - approve_proposal(evmos, proposal_id) - # query token pairs and get contract address - pairs = evmos_cli.get_token_pairs() - assert len(pairs) == 1, "expected exactly one token pair to be registered" - assert ( - pairs[0]["denom"] == osmos_ibc_denom - ), "expected the registered token pair to be the Osmosis IBC coin" - return pairs[0]["erc20_address"] - - def deploy_wasm_contract(osmosis_cli, deployer_addr, contract_file, init_args, label): """ Stores the contract binary and deploys one instance of it. diff --git a/tests/nix_tests/utils.py b/tests/nix_tests/utils.py index 2561b164ca..48f955d5ea 100644 --- a/tests/nix_tests/utils.py +++ b/tests/nix_tests/utils.py @@ -5,7 +5,6 @@ import socket import subprocess import sys -import tempfile import time from collections import defaultdict from pathlib import Path @@ -236,28 +235,6 @@ def deploy_contract(w3, jsonfile, args=(), key=KEYS["validator"]): return w3.eth.contract(address=address, abi=info["abi"]), txreceipt -def register_ibc_coin(cli, proposal, proposer_addr=ADDRS["validator"]): - """ - submits a register_coin proposal for the provided coin metadata - """ - proposer = eth_to_bech32(proposer_addr) - # save the coin metadata in a json file - with tempfile.NamedTemporaryFile("w") as meta_file: - json.dump({"metadata": proposal.get("metadata")}, meta_file) - meta_file.flush() - proposal["metadata"] = meta_file.name - rsp = cli.gov_legacy_proposal(proposer, "register-coin", proposal, gas=10000000) - assert rsp["code"] == 0, rsp["raw_log"] - txhash = rsp["txhash"] - wait_for_new_blocks(cli, 2) - receipt = cli.tx_search_rpc(f"tx.hash='{txhash}'")[0] - return get_event_attribute_value( - receipt["tx_result"]["events"], - "submit_proposal", - "proposal_id", - ) - - def wait_for_cosmos_tx_receipt(cli, tx_hash): print(f"waiting receipt for tx_hash: {tx_hash}...") wait_for_new_blocks(cli, 1) diff --git a/x/erc20/genesis.go b/x/erc20/genesis.go index 3d5682ef9f..d909da6d6a 100644 --- a/x/erc20/genesis.go +++ b/x/erc20/genesis.go @@ -31,11 +31,8 @@ func InitGenesis( panic("the erc20 module account has not been set") } - for _, pair := range data.TokenPairs { - id := pair.GetID() - k.SetTokenPair(ctx, pair) - k.SetDenomMap(ctx, pair.Denom, id) - k.SetERC20Map(ctx, pair.GetERC20Contract(), id) + if err := k.SetGenesisTokenPairs(ctx, data.TokenPairs); err != nil { + panic(err) } } diff --git a/x/erc20/genesis_test.go b/x/erc20/genesis_test.go index cf1102a381..1fff09f75e 100644 --- a/x/erc20/genesis_test.go +++ b/x/erc20/genesis_test.go @@ -4,6 +4,7 @@ import ( "testing" "time" + "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/suite" sdk "github.com/cosmos/cosmos-sdk/types" @@ -13,6 +14,8 @@ import ( tmversion "github.com/cometbft/cometbft/proto/tendermint/version" "github.com/cometbft/cometbft/version" + transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" + utiltx "github.com/evmos/evmos/v16/testutil/tx" "github.com/evmos/evmos/v16/utils" feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" @@ -29,6 +32,13 @@ type GenesisTestSuite struct { genesis types.GenesisState } +const osmoERC20ContractAddr = "0x5dCA2483280D9727c80b5518faC4556617fb19ZZ" + +var osmoDenomTrace = transfertypes.DenomTrace{ + BaseDenom: "uosmo", + Path: "transfer/channel-0", +} + func TestGenesisTestSuite(t *testing.T) { suite.Run(t, new(GenesisTestSuite)) } @@ -71,41 +81,61 @@ func (suite *GenesisTestSuite) TestERC20InitGenesis() { testCases := []struct { name string genesisState types.GenesisState + malleate func() }{ { - "empty genesis", - types.GenesisState{}, + name: "empty genesis", + genesisState: types.GenesisState{}, + malleate: nil, }, { - "default genesis", - *types.DefaultGenesisState(), + name: "default genesis", + genesisState: *types.DefaultGenesisState(), + malleate: nil, }, { - "custom genesis", - types.NewGenesisState( + name: "custom genesis", + genesisState: types.NewGenesisState( types.DefaultParams(), []types.TokenPair{ { - Erc20Address: "0x5dCA2483280D9727c80b5518faC4556617fb19ZZ", - Denom: "coin", + Erc20Address: osmoERC20ContractAddr, + Denom: osmoDenomTrace.IBCDenom(), Enabled: true, ContractOwner: types.OWNER_MODULE, }, - }), + }, + ), + malleate: func() { + suite.app.TransferKeeper.SetDenomTrace( + suite.ctx, + transfertypes.DenomTrace{ + BaseDenom: "uosmo", + Path: "transfer/channel-0", + }, + ) + }, }, } for _, tc := range testCases { + if tc.malleate != nil { + tc.malleate() + } suite.Require().NotPanics(func() { erc20.InitGenesis(suite.ctx, suite.app.Erc20Keeper, suite.app.AccountKeeper, tc.genesisState) }) + params := suite.app.Erc20Keeper.GetParams(suite.ctx) tokenPairs := suite.app.Erc20Keeper.GetTokenPairs(suite.ctx) suite.Require().Equal(tc.genesisState.Params, params) if len(tokenPairs) > 0 { suite.Require().Equal(tc.genesisState.TokenPairs, tokenPairs) + // check ERC20 contract was created successfully + acc := suite.app.EvmKeeper.GetAccount(suite.ctx, common.HexToAddress(osmoERC20ContractAddr)) + suite.Require().True(acc.IsContract()) } else { suite.Require().Len(tc.genesisState.TokenPairs, 0) } @@ -116,31 +146,41 @@ func (suite *GenesisTestSuite) TestErc20ExportGenesis() { testGenCases := []struct { name string genesisState types.GenesisState + malleate func() }{ { - "empty genesis", - types.GenesisState{}, + name: "empty genesis", + genesisState: types.GenesisState{}, + malleate: nil, }, { - "default genesis", - *types.DefaultGenesisState(), + name: "default genesis", + genesisState: *types.DefaultGenesisState(), + malleate: nil, }, { - "custom genesis", - types.NewGenesisState( + name: "custom genesis", + genesisState: types.NewGenesisState( types.DefaultParams(), []types.TokenPair{ { - Erc20Address: "0x5dCA2483280D9727c80b5518faC4556617fb19ZZ", - Denom: "coin", + Erc20Address: osmoERC20ContractAddr, + Denom: osmoDenomTrace.IBCDenom(), Enabled: true, ContractOwner: types.OWNER_MODULE, }, - }), + }, + ), + malleate: func() { + suite.app.TransferKeeper.SetDenomTrace(suite.ctx, osmoDenomTrace) + }, }, } for _, tc := range testGenCases { + if tc.malleate != nil { + tc.malleate() + } erc20.InitGenesis(suite.ctx, suite.app.Erc20Keeper, suite.app.AccountKeeper, tc.genesisState) suite.Require().NotPanics(func() { genesisExported := erc20.ExportGenesis(suite.ctx, suite.app.Erc20Keeper) diff --git a/x/erc20/keeper/evm.go b/x/erc20/keeper/evm.go index 2b73b15c7b..86a3e09c22 100644 --- a/x/erc20/keeper/evm.go +++ b/x/erc20/keeper/evm.go @@ -5,6 +5,8 @@ package keeper import ( "encoding/json" + "fmt" + "math" "math/big" errorsmod "cosmossdk.io/errors" @@ -29,25 +31,11 @@ func (k Keeper) DeployERC20Contract( ctx sdk.Context, coinMetadata banktypes.Metadata, ) (common.Address, error) { - decimals := uint8(0) - if len(coinMetadata.DenomUnits) > 0 { - decimalsIdx := len(coinMetadata.DenomUnits) - 1 - decimals = uint8(coinMetadata.DenomUnits[decimalsIdx].Exponent) - } - ctorArgs, err := contracts.ERC20MinterBurnerDecimalsContract.ABI.Pack( - "", - coinMetadata.Name, - coinMetadata.Symbol, - decimals, - ) + data, err := getContractDataBz(coinMetadata) if err != nil { - return common.Address{}, errorsmod.Wrapf(types.ErrABIPack, "coin metadata is invalid %s: %s", coinMetadata.Name, err.Error()) + return common.Address{}, err } - data := make([]byte, len(contracts.ERC20MinterBurnerDecimalsContract.Bin)+len(ctorArgs)) - copy(data[:len(contracts.ERC20MinterBurnerDecimalsContract.Bin)], contracts.ERC20MinterBurnerDecimalsContract.Bin) - copy(data[len(contracts.ERC20MinterBurnerDecimalsContract.Bin):], ctorArgs) - nonce, err := k.accountKeeper.GetSequence(ctx, types.ModuleAddress.Bytes()) if err != nil { return common.Address{}, err @@ -242,3 +230,34 @@ func (k Keeper) monitorApprovalEvent(res *evmtypes.MsgEthereumTxResponse) error return nil } + +// getContractDataBz is a helper function to get the contract bytecode +// needed to deploy an ERC20 contract based on the input coin metadata +func getContractDataBz(coinMetadata banktypes.Metadata) ([]byte, error) { + decimals := uint8(0) + if len(coinMetadata.DenomUnits) > 0 { + decimalsIdx := len(coinMetadata.DenomUnits) - 1 + exp := coinMetadata.DenomUnits[decimalsIdx].Exponent + if exp > math.MaxUint8 { + return nil, fmt.Errorf("coin metadata is invalid. Denom unit exponent should be less or equal than %d, got %d", math.MaxUint8, exp) + } + decimals = uint8(exp) + } + + // Get the input values for the ERC20 contract constructor method + constructorArgs, err := contracts.ERC20MinterBurnerDecimalsContract.ABI.Pack( + "", // constructor + coinMetadata.Name, + coinMetadata.Symbol, + decimals, + ) + if err != nil { + return nil, errorsmod.Wrapf(types.ErrABIPack, "coin metadata is invalid %s: %s", coinMetadata.Name, err.Error()) + } + + data := make([]byte, len(contracts.ERC20MinterBurnerDecimalsContract.Bin)+len(constructorArgs)) + copy(data[:len(contracts.ERC20MinterBurnerDecimalsContract.Bin)], contracts.ERC20MinterBurnerDecimalsContract.Bin) + copy(data[len(contracts.ERC20MinterBurnerDecimalsContract.Bin):], constructorArgs) + + return data, nil +} diff --git a/x/erc20/keeper/genesis.go b/x/erc20/keeper/genesis.go new file mode 100644 index 0000000000..f7d8480789 --- /dev/null +++ b/x/erc20/keeper/genesis.go @@ -0,0 +1,155 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) +package keeper + +import ( + "fmt" + "math/big" + "strings" + + errorsmod "cosmossdk.io/errors" + sdk "github.com/cosmos/cosmos-sdk/types" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + "github.com/ethereum/go-ethereum/common" + ethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/evmos/evmos/v16/ibc" + "github.com/evmos/evmos/v16/x/erc20/types" + "github.com/evmos/evmos/v16/x/evm/statedb" +) + +// SetGenesisTokenPairs stores in state the provided token pairs in genesis +// A genesis token pair is a token pair that will be registered from genesis. +// A current use case of this is e2e tests, +// where we may need to register a token pair to make it work. +// Currently, there's no other way to do this because the RegisterCoinProposal was deprecated. +func (k Keeper) SetGenesisTokenPairs(ctx sdk.Context, pairs []types.TokenPair) error { + if len(pairs) == 0 { + return nil + } + // We need to store the ERC20 contracts in the provided addresses at genesis. + // To do so, we'll need to seed the stateDB with those contracts. + // We cannot use EVM keeper functions for this because that will create a contract address + // dependent on the sender nonce. + stateDB := statedb.New(ctx, k.evmKeeper, statedb.TxConfig{}) + for _, pair := range pairs { + contractAddr := pair.GetERC20Contract() + coinMeta, err := k.getTokenPairMeta(ctx, pair) + if err != nil { + return fmt.Errorf("error while generating metadata for genesis pair denom %s. %w", pair.Denom, err) + } + code, err := k.generateContractCode(ctx, stateDB, coinMeta, contractAddr) + if err != nil { + return fmt.Errorf("error while getting contract code for genesis pair denom %s. %w", pair.Denom, err) + } + + // Store the ERC20 contract code in the address provided in genesis + stateDB.SetCode(contractAddr, code) + + id := pair.GetID() + k.SetTokenPair(ctx, pair) + k.SetDenomMap(ctx, pair.Denom, id) + k.SetERC20Map(ctx, contractAddr, id) + } + + // Commit the changes to effectively seed the state DB with + // the genesis token pairs ERC20 contracts + return stateDB.Commit() +} + +// getTokenPairMeta is a helper function to generate token pair metadata for the genesis token pairs +func (k Keeper) getTokenPairMeta(ctx sdk.Context, pair types.TokenPair) (banktypes.Metadata, error) { + // The corresponding IBC denom trace should be included in genesis + denomTrace, err := ibc.GetDenomTrace(*k.transferKeeper, ctx, pair.Denom) + if err != nil { + return banktypes.Metadata{}, err + } + + // validate base denom length + if len(denomTrace.BaseDenom) < 2 { + return banktypes.Metadata{}, fmt.Errorf("denom trace base denom is too short. Should be at least 2 characters long, got %q", denomTrace.BaseDenom) + } + + // check the denom prefix to define the corresponding exponent + exponent, err := ibc.DeriveDecimalsFromDenom(denomTrace.BaseDenom) + if err != nil { + return banktypes.Metadata{}, err + } + + meta := banktypes.Metadata{ + Description: fmt.Sprintf("%s IBC coin", denomTrace.BaseDenom), + DenomUnits: []*banktypes.DenomUnit{ + {Denom: pair.Denom, Exponent: 0, Aliases: []string{denomTrace.BaseDenom}}, + {Denom: denomTrace.BaseDenom[1:], Exponent: uint32(exponent)}, + }, + Base: pair.Denom, + Display: denomTrace.BaseDenom[1:], + Name: strings.ToUpper(string(denomTrace.BaseDenom[1])) + denomTrace.BaseDenom[2:], + Symbol: strings.ToUpper(denomTrace.BaseDenom[1:]), + } + + if err := k.verifyMetadata(ctx, meta); err != nil { + return banktypes.Metadata{}, errorsmod.Wrapf( + types.ErrInternalTokenPair, "coin metadata is invalid for genesis pair denom %s", pair.Denom, + ) + } + return meta, nil +} + +// generateContractCode is a helper function to generate +// the ERC20 contract code to be stored at genesis when token pairs are provided +func (k Keeper) generateContractCode(ctx sdk.Context, stateDB *statedb.StateDB, coinMeta banktypes.Metadata, contractAddr common.Address) ([]byte, error) { + evm := k.newEVM(ctx, stateDB) + data, err := getContractDataBz(coinMeta) + if err != nil { + return nil, err + } + // Initialize a new contract and set the code that is to be used by the EVM. + // The contract is a scoped environment for this execution context only. + sender := vm.AccountRef(types.ModuleAddress) + contract := vm.NewContract(sender, vm.AccountRef(contractAddr), big.NewInt(0), 1000000) + contract.Code = data + + // Run the contract's constructor function to get the contract code to + // be stored on chain + return evm.Interpreter().Run(contract, nil, false) +} + +// getEVMConfig is a helper function to get an EVM config +// needed to instantiate the EVM when token pairs are provided +// at genesis +func (k Keeper) getEVMConfig(ctx sdk.Context) *statedb.EVMConfig { + params := k.evmKeeper.GetParams(ctx) + ethCfg := params.ChainConfig.EthereumConfig(k.evmKeeper.ChainID()) + + baseFee := k.evmKeeper.GetBaseFee(ctx, ethCfg) + return &statedb.EVMConfig{ + Params: params, + ChainConfig: ethCfg, + CoinBase: common.Address{}, + BaseFee: baseFee, + } +} + +// newEVM is a helper function used during genesis +// to instantiate the EVM to set genesis state +func (k Keeper) newEVM(ctx sdk.Context, db *statedb.StateDB) *vm.EVM { + cfg := k.getEVMConfig(ctx) + + // dummy message needed to instantiate EVM + msg := ethtypes.NewMessage( + types.ModuleAddress, + nil, + 0, + big.NewInt(0), // amount + 0, // gasLimit + big.NewInt(0), // gasFeeCap + big.NewInt(0), // gasTipCap + big.NewInt(0), // gasPrice + nil, + ethtypes.AccessList{}, // AccessList + false, // isFake + ) + + return k.evmKeeper.NewEVM(ctx, msg, cfg, nil, db) +} diff --git a/x/erc20/keeper/genesis_test.go b/x/erc20/keeper/genesis_test.go new file mode 100644 index 0000000000..96c284f8ab --- /dev/null +++ b/x/erc20/keeper/genesis_test.go @@ -0,0 +1,175 @@ +package keeper_test + +import ( + transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" + "github.com/ethereum/go-ethereum/common" + + "github.com/evmos/evmos/v16/x/erc20/types" +) + +const ( + osmoERC20ContractAddr = "0x5dCA2483280D9727c80b5518faC4556617fb19ZZ" + junoERC20ContractAddr = "0x5db67696C3c088DfBf588d3dd849f44266ff0ffa" +) + +var ( + osmoDenomTrace = transfertypes.DenomTrace{ + BaseDenom: "uosmo", + Path: "transfer/channel-0", + } + junoDenomTrace = transfertypes.DenomTrace{ + BaseDenom: "ujuno", + Path: "transfer/channel-1", + } + invalidDenomTrace = transfertypes.DenomTrace{ + BaseDenom: "osmo", // missing the 'u' prefix + Path: "transfer/channel-0", + } + invalidDenomTrace2 = transfertypes.DenomTrace{ + BaseDenom: "u", // denom trace is too short + Path: "transfer/channel-0", + } +) + +func (suite *KeeperTestSuite) TestSetGenesisTokenPairs() { + testCases := []struct { + name string + pairs []types.TokenPair + malleate func() + expFail bool + expErrMsg string + }{ + { + "no-op: no token pairs", + []types.TokenPair{}, + nil, + false, + "", + }, + { + "fail: invalid denom", + []types.TokenPair{ + { + Erc20Address: osmoERC20ContractAddr, + Denom: "uosmo", + Enabled: true, + ContractOwner: types.OWNER_MODULE, + }, + }, + nil, + true, + "denom is not an IBC voucher", + }, + { + "fail: custom genesis - denom trace not in genesis", + []types.TokenPair{ + { + Erc20Address: osmoERC20ContractAddr, + Denom: osmoDenomTrace.IBCDenom(), + Enabled: true, + ContractOwner: types.OWNER_MODULE, + }, + }, + nil, + true, + "denom trace not found", + }, + { + "fail: custom genesis with invalid denom traces in genesis", + []types.TokenPair{ + { + Erc20Address: osmoERC20ContractAddr, + Denom: invalidDenomTrace.IBCDenom(), + Enabled: true, + ContractOwner: types.OWNER_MODULE, + }, + }, + func() { + suite.app.TransferKeeper.SetDenomTrace(suite.ctx, invalidDenomTrace) + }, + true, + "invalid base denomination", + }, + { + "fail: custom genesis with invalid denom traces in genesis - base denom too short", + []types.TokenPair{ + { + Erc20Address: osmoERC20ContractAddr, + Denom: invalidDenomTrace2.IBCDenom(), + Enabled: true, + ContractOwner: types.OWNER_MODULE, + }, + }, + func() { + suite.app.TransferKeeper.SetDenomTrace(suite.ctx, invalidDenomTrace2) + }, + true, + "denom trace base denom is too short", + }, + { + "success: custom genesis with denom traces in genesis", + []types.TokenPair{ + { + Erc20Address: junoERC20ContractAddr, + Denom: junoDenomTrace.IBCDenom(), + Enabled: true, + ContractOwner: types.OWNER_MODULE, + }, + { + Erc20Address: osmoERC20ContractAddr, + Denom: osmoDenomTrace.IBCDenom(), + Enabled: true, + ContractOwner: types.OWNER_MODULE, + }, + }, + func() { + suite.app.TransferKeeper.SetDenomTrace(suite.ctx, osmoDenomTrace) + suite.app.TransferKeeper.SetDenomTrace(suite.ctx, junoDenomTrace) + }, + false, + "", + }, + } + for _, tc := range testCases { + suite.SetupTest() // reset + if tc.malleate != nil { + tc.malleate() + } + err := suite.app.Erc20Keeper.SetGenesisTokenPairs(suite.ctx, tc.pairs) + + if !tc.expFail { + suite.Require().NoError(err) + tokenPairs := suite.app.Erc20Keeper.GetTokenPairs(suite.ctx) + suite.Require().Equal(tc.pairs, tokenPairs) + // check ERC20 contracts were created successfully + for _, p := range tc.pairs { + acc := suite.app.EvmKeeper.GetAccount(suite.ctx, common.HexToAddress(p.Erc20Address)) + suite.Require().True(acc.IsContract()) + // check bank metadata was stored properly + meta, found := suite.app.BankKeeper.GetDenomMetaData(suite.ctx, p.Denom) + suite.Require().True(found) + suite.Require().Len(meta.DenomUnits, 2) + + switch meta.Base { + case osmoDenomTrace.IBCDenom(): + suite.Require().Equal(meta.DenomUnits[0].Aliases, []string{"uosmo"}) + suite.Require().Equal(meta.DenomUnits[1].Denom, "osmo") + suite.Require().Equal(meta.DenomUnits[1].Exponent, uint32(6)) + suite.Require().Equal(meta.Display, "osmo") + suite.Require().Equal(meta.Name, "Osmo") + suite.Require().Equal(meta.Symbol, "OSMO") + case junoDenomTrace.IBCDenom(): + suite.Require().Equal(meta.DenomUnits[0].Aliases, []string{"ujuno"}) + suite.Require().Equal(meta.DenomUnits[1].Denom, "juno") + suite.Require().Equal(meta.DenomUnits[1].Exponent, uint32(6)) + suite.Require().Equal(meta.Display, "juno") + suite.Require().Equal(meta.Name, "Juno") + suite.Require().Equal(meta.Symbol, "JUNO") + } + } + } else { + suite.Require().Error(err) + suite.Require().Contains(err.Error(), tc.expErrMsg) + } + } +} diff --git a/x/erc20/types/interfaces.go b/x/erc20/types/interfaces.go index 159e3d6afa..6c7d2d7c50 100644 --- a/x/erc20/types/interfaces.go +++ b/x/erc20/types/interfaces.go @@ -5,6 +5,7 @@ package types import ( context "context" + "math/big" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" @@ -14,6 +15,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/vm" + gethparams "github.com/ethereum/go-ethereum/params" "github.com/evmos/evmos/v16/x/evm/statedb" evmtypes "github.com/evmos/evmos/v16/x/evm/types" @@ -40,6 +42,24 @@ type EVMKeeper interface { AddEVMExtensions(ctx sdk.Context, precompiles ...vm.PrecompiledContract) error DeleteAccount(ctx sdk.Context, addr common.Address) error IsAvailablePrecompile(addr common.Address) bool + + // Needed for genesis + NewEVM(ctx sdk.Context, msg core.Message, cfg *statedb.EVMConfig, tracer vm.EVMLogger, stateDB vm.StateDB) *vm.EVM + + // Read methods + GetAccount(ctx sdk.Context, addr common.Address) *statedb.Account + GetState(ctx sdk.Context, addr common.Address, key common.Hash) common.Hash + GetCode(ctx sdk.Context, codeHash common.Hash) []byte + // the callback returns false to break early + ForEachStorage(ctx sdk.Context, addr common.Address, cb func(key, value common.Hash) bool) + ChainID() *big.Int + GetBaseFee(ctx sdk.Context, ethCfg *gethparams.ChainConfig) *big.Int + EVMConfig(ctx sdk.Context, proposerAddress sdk.ConsAddress, chainID *big.Int) (*statedb.EVMConfig, error) + + // Write methods, only called by `StateDB.Commit()` + SetAccount(ctx sdk.Context, addr common.Address, account statedb.Account) error + SetState(ctx sdk.Context, addr common.Address, key common.Hash, value []byte) + SetCode(ctx sdk.Context, codeHash []byte, code []byte) } type ( diff --git a/x/erc20/types/mocks/EVMKeeper.go b/x/erc20/types/mocks/EVMKeeper.go index 45c3193181..a4430dffe8 100644 --- a/x/erc20/types/mocks/EVMKeeper.go +++ b/x/erc20/types/mocks/EVMKeeper.go @@ -4,18 +4,21 @@ package mocks import ( context "context" + big "math/big" common "github.com/ethereum/go-ethereum/common" core "github.com/ethereum/go-ethereum/core" + cosmos_sdktypes "github.com/cosmos/cosmos-sdk/types" + evmtypes "github.com/evmos/evmos/v16/x/evm/types" mock "github.com/stretchr/testify/mock" - statedb "github.com/evmos/evmos/v16/x/evm/statedb" + params "github.com/ethereum/go-ethereum/params" - types "github.com/cosmos/cosmos-sdk/types" + statedb "github.com/evmos/evmos/v16/x/evm/statedb" vm "github.com/ethereum/go-ethereum/core/vm" ) @@ -25,8 +28,16 @@ type EVMKeeper struct { mock.Mock } +type EVMKeeper_Expecter struct { + mock *mock.Mock +} + +func (_m *EVMKeeper) EXPECT() *EVMKeeper_Expecter { + return &EVMKeeper_Expecter{mock: &_m.Mock} +} + // AddEVMExtensions provides a mock function with given fields: ctx, precompiles -func (_m *EVMKeeper) AddEVMExtensions(ctx types.Context, precompiles ...vm.PrecompiledContract) error { +func (_m *EVMKeeper) AddEVMExtensions(ctx cosmos_sdktypes.Context, precompiles ...vm.PrecompiledContract) error { _va := make([]interface{}, len(precompiles)) for _i := range precompiles { _va[_i] = precompiles[_i] @@ -37,7 +48,7 @@ func (_m *EVMKeeper) AddEVMExtensions(ctx types.Context, precompiles ...vm.Preco ret := _m.Called(_ca...) var r0 error - if rf, ok := ret.Get(0).(func(types.Context, ...vm.PrecompiledContract) error); ok { + if rf, ok := ret.Get(0).(func(cosmos_sdktypes.Context, ...vm.PrecompiledContract) error); ok { r0 = rf(ctx, precompiles...) } else { r0 = ret.Error(0) @@ -46,16 +57,52 @@ func (_m *EVMKeeper) AddEVMExtensions(ctx types.Context, precompiles ...vm.Preco return r0 } +// MockEVMKeeper_AddEVMExtensions_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddEVMExtensions' +type MockEVMKeeper_AddEVMExtensions_Call struct { + *mock.Call +} + +// AddEVMExtensions is a helper method to define mock.On call +// - ctx cosmos_sdktypes.Context +// - precompiles ...vm.PrecompiledContract +func (_e *EVMKeeper_Expecter) AddEVMExtensions(ctx interface{}, precompiles ...interface{}) *MockEVMKeeper_AddEVMExtensions_Call { + return &MockEVMKeeper_AddEVMExtensions_Call{Call: _e.mock.On("AddEVMExtensions", + append([]interface{}{ctx}, precompiles...)...)} +} + +func (_c *MockEVMKeeper_AddEVMExtensions_Call) Run(run func(ctx cosmos_sdktypes.Context, precompiles ...vm.PrecompiledContract)) *MockEVMKeeper_AddEVMExtensions_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]vm.PrecompiledContract, len(args)-1) + for i, a := range args[1:] { + if a != nil { + variadicArgs[i] = a.(vm.PrecompiledContract) + } + } + run(args[0].(cosmos_sdktypes.Context), variadicArgs...) + }) + return _c +} + +func (_c *MockEVMKeeper_AddEVMExtensions_Call) Return(_a0 error) *MockEVMKeeper_AddEVMExtensions_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockEVMKeeper_AddEVMExtensions_Call) RunAndReturn(run func(cosmos_sdktypes.Context, ...vm.PrecompiledContract) error) *MockEVMKeeper_AddEVMExtensions_Call { + _c.Call.Return(run) + return _c +} + // ApplyMessage provides a mock function with given fields: ctx, msg, tracer, commit -func (_m *EVMKeeper) ApplyMessage(ctx types.Context, msg core.Message, tracer vm.EVMLogger, commit bool) (*evmtypes.MsgEthereumTxResponse, error) { +func (_m *EVMKeeper) ApplyMessage(ctx cosmos_sdktypes.Context, msg core.Message, tracer vm.EVMLogger, commit bool) (*evmtypes.MsgEthereumTxResponse, error) { ret := _m.Called(ctx, msg, tracer, commit) var r0 *evmtypes.MsgEthereumTxResponse var r1 error - if rf, ok := ret.Get(0).(func(types.Context, core.Message, vm.EVMLogger, bool) (*evmtypes.MsgEthereumTxResponse, error)); ok { + if rf, ok := ret.Get(0).(func(cosmos_sdktypes.Context, core.Message, vm.EVMLogger, bool) (*evmtypes.MsgEthereumTxResponse, error)); ok { return rf(ctx, msg, tracer, commit) } - if rf, ok := ret.Get(0).(func(types.Context, core.Message, vm.EVMLogger, bool) *evmtypes.MsgEthereumTxResponse); ok { + if rf, ok := ret.Get(0).(func(cosmos_sdktypes.Context, core.Message, vm.EVMLogger, bool) *evmtypes.MsgEthereumTxResponse); ok { r0 = rf(ctx, msg, tracer, commit) } else { if ret.Get(0) != nil { @@ -63,7 +110,7 @@ func (_m *EVMKeeper) ApplyMessage(ctx types.Context, msg core.Message, tracer vm } } - if rf, ok := ret.Get(1).(func(types.Context, core.Message, vm.EVMLogger, bool) error); ok { + if rf, ok := ret.Get(1).(func(cosmos_sdktypes.Context, core.Message, vm.EVMLogger, bool) error); ok { r1 = rf(ctx, msg, tracer, commit) } else { r1 = ret.Error(1) @@ -72,12 +119,86 @@ func (_m *EVMKeeper) ApplyMessage(ctx types.Context, msg core.Message, tracer vm return r0, r1 } +// MockEVMKeeper_ApplyMessage_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ApplyMessage' +type MockEVMKeeper_ApplyMessage_Call struct { + *mock.Call +} + +// ApplyMessage is a helper method to define mock.On call +// - ctx cosmos_sdktypes.Context +// - msg core.Message +// - tracer vm.EVMLogger +// - commit bool +func (_e *EVMKeeper_Expecter) ApplyMessage(ctx interface{}, msg interface{}, tracer interface{}, commit interface{}) *MockEVMKeeper_ApplyMessage_Call { + return &MockEVMKeeper_ApplyMessage_Call{Call: _e.mock.On("ApplyMessage", ctx, msg, tracer, commit)} +} + +func (_c *MockEVMKeeper_ApplyMessage_Call) Run(run func(ctx cosmos_sdktypes.Context, msg core.Message, tracer vm.EVMLogger, commit bool)) *MockEVMKeeper_ApplyMessage_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(cosmos_sdktypes.Context), args[1].(core.Message), args[2].(vm.EVMLogger), args[3].(bool)) + }) + return _c +} + +func (_c *MockEVMKeeper_ApplyMessage_Call) Return(_a0 *evmtypes.MsgEthereumTxResponse, _a1 error) *MockEVMKeeper_ApplyMessage_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *MockEVMKeeper_ApplyMessage_Call) RunAndReturn(run func(cosmos_sdktypes.Context, core.Message, vm.EVMLogger, bool) (*evmtypes.MsgEthereumTxResponse, error)) *MockEVMKeeper_ApplyMessage_Call { + _c.Call.Return(run) + return _c +} + +// ChainID provides a mock function with given fields: +func (_m *EVMKeeper) ChainID() *big.Int { + ret := _m.Called() + + var r0 *big.Int + if rf, ok := ret.Get(0).(func() *big.Int); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + return r0 +} + +// MockEVMKeeper_ChainID_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ChainID' +type MockEVMKeeper_ChainID_Call struct { + *mock.Call +} + +// ChainID is a helper method to define mock.On call +func (_e *EVMKeeper_Expecter) ChainID() *MockEVMKeeper_ChainID_Call { + return &MockEVMKeeper_ChainID_Call{Call: _e.mock.On("ChainID")} +} + +func (_c *MockEVMKeeper_ChainID_Call) Run(run func()) *MockEVMKeeper_ChainID_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *MockEVMKeeper_ChainID_Call) Return(_a0 *big.Int) *MockEVMKeeper_ChainID_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockEVMKeeper_ChainID_Call) RunAndReturn(run func() *big.Int) *MockEVMKeeper_ChainID_Call { + _c.Call.Return(run) + return _c +} + // DeleteAccount provides a mock function with given fields: ctx, addr -func (_m *EVMKeeper) DeleteAccount(ctx types.Context, addr common.Address) error { +func (_m *EVMKeeper) DeleteAccount(ctx cosmos_sdktypes.Context, addr common.Address) error { ret := _m.Called(ctx, addr) var r0 error - if rf, ok := ret.Get(0).(func(types.Context, common.Address) error); ok { + if rf, ok := ret.Get(0).(func(cosmos_sdktypes.Context, common.Address) error); ok { r0 = rf(ctx, addr) } else { r0 = ret.Error(0) @@ -86,6 +207,91 @@ func (_m *EVMKeeper) DeleteAccount(ctx types.Context, addr common.Address) error return r0 } +// MockEVMKeeper_DeleteAccount_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeleteAccount' +type MockEVMKeeper_DeleteAccount_Call struct { + *mock.Call +} + +// DeleteAccount is a helper method to define mock.On call +// - ctx cosmos_sdktypes.Context +// - addr common.Address +func (_e *EVMKeeper_Expecter) DeleteAccount(ctx interface{}, addr interface{}) *MockEVMKeeper_DeleteAccount_Call { + return &MockEVMKeeper_DeleteAccount_Call{Call: _e.mock.On("DeleteAccount", ctx, addr)} +} + +func (_c *MockEVMKeeper_DeleteAccount_Call) Run(run func(ctx cosmos_sdktypes.Context, addr common.Address)) *MockEVMKeeper_DeleteAccount_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(cosmos_sdktypes.Context), args[1].(common.Address)) + }) + return _c +} + +func (_c *MockEVMKeeper_DeleteAccount_Call) Return(_a0 error) *MockEVMKeeper_DeleteAccount_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockEVMKeeper_DeleteAccount_Call) RunAndReturn(run func(cosmos_sdktypes.Context, common.Address) error) *MockEVMKeeper_DeleteAccount_Call { + _c.Call.Return(run) + return _c +} + +// EVMConfig provides a mock function with given fields: ctx, proposerAddress, chainID +func (_m *EVMKeeper) EVMConfig(ctx cosmos_sdktypes.Context, proposerAddress cosmos_sdktypes.ConsAddress, chainID *big.Int) (*statedb.EVMConfig, error) { + ret := _m.Called(ctx, proposerAddress, chainID) + + var r0 *statedb.EVMConfig + var r1 error + if rf, ok := ret.Get(0).(func(cosmos_sdktypes.Context, cosmos_sdktypes.ConsAddress, *big.Int) (*statedb.EVMConfig, error)); ok { + return rf(ctx, proposerAddress, chainID) + } + if rf, ok := ret.Get(0).(func(cosmos_sdktypes.Context, cosmos_sdktypes.ConsAddress, *big.Int) *statedb.EVMConfig); ok { + r0 = rf(ctx, proposerAddress, chainID) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*statedb.EVMConfig) + } + } + + if rf, ok := ret.Get(1).(func(cosmos_sdktypes.Context, cosmos_sdktypes.ConsAddress, *big.Int) error); ok { + r1 = rf(ctx, proposerAddress, chainID) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// MockEVMKeeper_EVMConfig_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'EVMConfig' +type MockEVMKeeper_EVMConfig_Call struct { + *mock.Call +} + +// EVMConfig is a helper method to define mock.On call +// - ctx cosmos_sdktypes.Context +// - proposerAddress cosmos_sdktypes.ConsAddress +// - chainID *big.Int +func (_e *EVMKeeper_Expecter) EVMConfig(ctx interface{}, proposerAddress interface{}, chainID interface{}) *MockEVMKeeper_EVMConfig_Call { + return &MockEVMKeeper_EVMConfig_Call{Call: _e.mock.On("EVMConfig", ctx, proposerAddress, chainID)} +} + +func (_c *MockEVMKeeper_EVMConfig_Call) Run(run func(ctx cosmos_sdktypes.Context, proposerAddress cosmos_sdktypes.ConsAddress, chainID *big.Int)) *MockEVMKeeper_EVMConfig_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(cosmos_sdktypes.Context), args[1].(cosmos_sdktypes.ConsAddress), args[2].(*big.Int)) + }) + return _c +} + +func (_c *MockEVMKeeper_EVMConfig_Call) Return(_a0 *statedb.EVMConfig, _a1 error) *MockEVMKeeper_EVMConfig_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *MockEVMKeeper_EVMConfig_Call) RunAndReturn(run func(cosmos_sdktypes.Context, cosmos_sdktypes.ConsAddress, *big.Int) (*statedb.EVMConfig, error)) *MockEVMKeeper_EVMConfig_Call { + _c.Call.Return(run) + return _c +} + // EstimateGasInternal provides a mock function with given fields: c, req, fromType func (_m *EVMKeeper) EstimateGasInternal(c context.Context, req *evmtypes.EthCallRequest, fromType evmtypes.CallType) (*evmtypes.EstimateGasResponse, error) { ret := _m.Called(c, req, fromType) @@ -112,12 +318,122 @@ func (_m *EVMKeeper) EstimateGasInternal(c context.Context, req *evmtypes.EthCal return r0, r1 } +// MockEVMKeeper_EstimateGasInternal_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'EstimateGasInternal' +type MockEVMKeeper_EstimateGasInternal_Call struct { + *mock.Call +} + +// EstimateGasInternal is a helper method to define mock.On call +// - c context.Context +// - req *evmtypes.EthCallRequest +// - fromType evmtypes.CallType +func (_e *EVMKeeper_Expecter) EstimateGasInternal(c interface{}, req interface{}, fromType interface{}) *MockEVMKeeper_EstimateGasInternal_Call { + return &MockEVMKeeper_EstimateGasInternal_Call{Call: _e.mock.On("EstimateGasInternal", c, req, fromType)} +} + +func (_c *MockEVMKeeper_EstimateGasInternal_Call) Run(run func(c context.Context, req *evmtypes.EthCallRequest, fromType evmtypes.CallType)) *MockEVMKeeper_EstimateGasInternal_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*evmtypes.EthCallRequest), args[2].(evmtypes.CallType)) + }) + return _c +} + +func (_c *MockEVMKeeper_EstimateGasInternal_Call) Return(_a0 *evmtypes.EstimateGasResponse, _a1 error) *MockEVMKeeper_EstimateGasInternal_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *MockEVMKeeper_EstimateGasInternal_Call) RunAndReturn(run func(context.Context, *evmtypes.EthCallRequest, evmtypes.CallType) (*evmtypes.EstimateGasResponse, error)) *MockEVMKeeper_EstimateGasInternal_Call { + _c.Call.Return(run) + return _c +} + +// ForEachStorage provides a mock function with given fields: ctx, addr, cb +func (_m *EVMKeeper) ForEachStorage(ctx cosmos_sdktypes.Context, addr common.Address, cb func(common.Hash, common.Hash) bool) { + _m.Called(ctx, addr, cb) +} + +// MockEVMKeeper_ForEachStorage_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ForEachStorage' +type MockEVMKeeper_ForEachStorage_Call struct { + *mock.Call +} + +// ForEachStorage is a helper method to define mock.On call +// - ctx cosmos_sdktypes.Context +// - addr common.Address +// - cb func(common.Hash , common.Hash) bool +func (_e *EVMKeeper_Expecter) ForEachStorage(ctx interface{}, addr interface{}, cb interface{}) *MockEVMKeeper_ForEachStorage_Call { + return &MockEVMKeeper_ForEachStorage_Call{Call: _e.mock.On("ForEachStorage", ctx, addr, cb)} +} + +func (_c *MockEVMKeeper_ForEachStorage_Call) Run(run func(ctx cosmos_sdktypes.Context, addr common.Address, cb func(common.Hash, common.Hash) bool)) *MockEVMKeeper_ForEachStorage_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(cosmos_sdktypes.Context), args[1].(common.Address), args[2].(func(common.Hash, common.Hash) bool)) + }) + return _c +} + +func (_c *MockEVMKeeper_ForEachStorage_Call) Return() *MockEVMKeeper_ForEachStorage_Call { + _c.Call.Return() + return _c +} + +func (_c *MockEVMKeeper_ForEachStorage_Call) RunAndReturn(run func(cosmos_sdktypes.Context, common.Address, func(common.Hash, common.Hash) bool)) *MockEVMKeeper_ForEachStorage_Call { + _c.Call.Return(run) + return _c +} + +// GetAccount provides a mock function with given fields: ctx, addr +func (_m *EVMKeeper) GetAccount(ctx cosmos_sdktypes.Context, addr common.Address) *statedb.Account { + ret := _m.Called(ctx, addr) + + var r0 *statedb.Account + if rf, ok := ret.Get(0).(func(cosmos_sdktypes.Context, common.Address) *statedb.Account); ok { + r0 = rf(ctx, addr) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*statedb.Account) + } + } + + return r0 +} + +// MockEVMKeeper_GetAccount_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetAccount' +type MockEVMKeeper_GetAccount_Call struct { + *mock.Call +} + +// GetAccount is a helper method to define mock.On call +// - ctx cosmos_sdktypes.Context +// - addr common.Address +func (_e *EVMKeeper_Expecter) GetAccount(ctx interface{}, addr interface{}) *MockEVMKeeper_GetAccount_Call { + return &MockEVMKeeper_GetAccount_Call{Call: _e.mock.On("GetAccount", ctx, addr)} +} + +func (_c *MockEVMKeeper_GetAccount_Call) Run(run func(ctx cosmos_sdktypes.Context, addr common.Address)) *MockEVMKeeper_GetAccount_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(cosmos_sdktypes.Context), args[1].(common.Address)) + }) + return _c +} + +func (_c *MockEVMKeeper_GetAccount_Call) Return(_a0 *statedb.Account) *MockEVMKeeper_GetAccount_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockEVMKeeper_GetAccount_Call) RunAndReturn(run func(cosmos_sdktypes.Context, common.Address) *statedb.Account) *MockEVMKeeper_GetAccount_Call { + _c.Call.Return(run) + return _c +} + // GetAccountWithoutBalance provides a mock function with given fields: ctx, addr -func (_m *EVMKeeper) GetAccountWithoutBalance(ctx types.Context, addr common.Address) *statedb.Account { +func (_m *EVMKeeper) GetAccountWithoutBalance(ctx cosmos_sdktypes.Context, addr common.Address) *statedb.Account { ret := _m.Called(ctx, addr) var r0 *statedb.Account - if rf, ok := ret.Get(0).(func(types.Context, common.Address) *statedb.Account); ok { + if rf, ok := ret.Get(0).(func(cosmos_sdktypes.Context, common.Address) *statedb.Account); ok { r0 = rf(ctx, addr) } else { if ret.Get(0) != nil { @@ -128,12 +444,131 @@ func (_m *EVMKeeper) GetAccountWithoutBalance(ctx types.Context, addr common.Add return r0 } +// MockEVMKeeper_GetAccountWithoutBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetAccountWithoutBalance' +type MockEVMKeeper_GetAccountWithoutBalance_Call struct { + *mock.Call +} + +// GetAccountWithoutBalance is a helper method to define mock.On call +// - ctx cosmos_sdktypes.Context +// - addr common.Address +func (_e *EVMKeeper_Expecter) GetAccountWithoutBalance(ctx interface{}, addr interface{}) *MockEVMKeeper_GetAccountWithoutBalance_Call { + return &MockEVMKeeper_GetAccountWithoutBalance_Call{Call: _e.mock.On("GetAccountWithoutBalance", ctx, addr)} +} + +func (_c *MockEVMKeeper_GetAccountWithoutBalance_Call) Run(run func(ctx cosmos_sdktypes.Context, addr common.Address)) *MockEVMKeeper_GetAccountWithoutBalance_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(cosmos_sdktypes.Context), args[1].(common.Address)) + }) + return _c +} + +func (_c *MockEVMKeeper_GetAccountWithoutBalance_Call) Return(_a0 *statedb.Account) *MockEVMKeeper_GetAccountWithoutBalance_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockEVMKeeper_GetAccountWithoutBalance_Call) RunAndReturn(run func(cosmos_sdktypes.Context, common.Address) *statedb.Account) *MockEVMKeeper_GetAccountWithoutBalance_Call { + _c.Call.Return(run) + return _c +} + +// GetBaseFee provides a mock function with given fields: ctx, ethCfg +func (_m *EVMKeeper) GetBaseFee(ctx cosmos_sdktypes.Context, ethCfg *params.ChainConfig) *big.Int { + ret := _m.Called(ctx, ethCfg) + + var r0 *big.Int + if rf, ok := ret.Get(0).(func(cosmos_sdktypes.Context, *params.ChainConfig) *big.Int); ok { + r0 = rf(ctx, ethCfg) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + return r0 +} + +// MockEVMKeeper_GetBaseFee_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetBaseFee' +type MockEVMKeeper_GetBaseFee_Call struct { + *mock.Call +} + +// GetBaseFee is a helper method to define mock.On call +// - ctx cosmos_sdktypes.Context +// - ethCfg *params.ChainConfig +func (_e *EVMKeeper_Expecter) GetBaseFee(ctx interface{}, ethCfg interface{}) *MockEVMKeeper_GetBaseFee_Call { + return &MockEVMKeeper_GetBaseFee_Call{Call: _e.mock.On("GetBaseFee", ctx, ethCfg)} +} + +func (_c *MockEVMKeeper_GetBaseFee_Call) Run(run func(ctx cosmos_sdktypes.Context, ethCfg *params.ChainConfig)) *MockEVMKeeper_GetBaseFee_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(cosmos_sdktypes.Context), args[1].(*params.ChainConfig)) + }) + return _c +} + +func (_c *MockEVMKeeper_GetBaseFee_Call) Return(_a0 *big.Int) *MockEVMKeeper_GetBaseFee_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockEVMKeeper_GetBaseFee_Call) RunAndReturn(run func(cosmos_sdktypes.Context, *params.ChainConfig) *big.Int) *MockEVMKeeper_GetBaseFee_Call { + _c.Call.Return(run) + return _c +} + +// GetCode provides a mock function with given fields: ctx, codeHash +func (_m *EVMKeeper) GetCode(ctx cosmos_sdktypes.Context, codeHash common.Hash) []byte { + ret := _m.Called(ctx, codeHash) + + var r0 []byte + if rf, ok := ret.Get(0).(func(cosmos_sdktypes.Context, common.Hash) []byte); ok { + r0 = rf(ctx, codeHash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + return r0 +} + +// MockEVMKeeper_GetCode_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCode' +type MockEVMKeeper_GetCode_Call struct { + *mock.Call +} + +// GetCode is a helper method to define mock.On call +// - ctx cosmos_sdktypes.Context +// - codeHash common.Hash +func (_e *EVMKeeper_Expecter) GetCode(ctx interface{}, codeHash interface{}) *MockEVMKeeper_GetCode_Call { + return &MockEVMKeeper_GetCode_Call{Call: _e.mock.On("GetCode", ctx, codeHash)} +} + +func (_c *MockEVMKeeper_GetCode_Call) Run(run func(ctx cosmos_sdktypes.Context, codeHash common.Hash)) *MockEVMKeeper_GetCode_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(cosmos_sdktypes.Context), args[1].(common.Hash)) + }) + return _c +} + +func (_c *MockEVMKeeper_GetCode_Call) Return(_a0 []byte) *MockEVMKeeper_GetCode_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockEVMKeeper_GetCode_Call) RunAndReturn(run func(cosmos_sdktypes.Context, common.Hash) []byte) *MockEVMKeeper_GetCode_Call { + _c.Call.Return(run) + return _c +} + // GetParams provides a mock function with given fields: ctx -func (_m *EVMKeeper) GetParams(ctx types.Context) evmtypes.Params { +func (_m *EVMKeeper) GetParams(ctx cosmos_sdktypes.Context) evmtypes.Params { ret := _m.Called(ctx) var r0 evmtypes.Params - if rf, ok := ret.Get(0).(func(types.Context) evmtypes.Params); ok { + if rf, ok := ret.Get(0).(func(cosmos_sdktypes.Context) evmtypes.Params); ok { r0 = rf(ctx) } else { r0 = ret.Get(0).(evmtypes.Params) @@ -142,6 +577,80 @@ func (_m *EVMKeeper) GetParams(ctx types.Context) evmtypes.Params { return r0 } +// MockEVMKeeper_GetParams_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetParams' +type MockEVMKeeper_GetParams_Call struct { + *mock.Call +} + +// GetParams is a helper method to define mock.On call +// - ctx cosmos_sdktypes.Context +func (_e *EVMKeeper_Expecter) GetParams(ctx interface{}) *MockEVMKeeper_GetParams_Call { + return &MockEVMKeeper_GetParams_Call{Call: _e.mock.On("GetParams", ctx)} +} + +func (_c *MockEVMKeeper_GetParams_Call) Run(run func(ctx cosmos_sdktypes.Context)) *MockEVMKeeper_GetParams_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(cosmos_sdktypes.Context)) + }) + return _c +} + +func (_c *MockEVMKeeper_GetParams_Call) Return(_a0 evmtypes.Params) *MockEVMKeeper_GetParams_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockEVMKeeper_GetParams_Call) RunAndReturn(run func(cosmos_sdktypes.Context) evmtypes.Params) *MockEVMKeeper_GetParams_Call { + _c.Call.Return(run) + return _c +} + +// GetState provides a mock function with given fields: ctx, addr, key +func (_m *EVMKeeper) GetState(ctx cosmos_sdktypes.Context, addr common.Address, key common.Hash) common.Hash { + ret := _m.Called(ctx, addr, key) + + var r0 common.Hash + if rf, ok := ret.Get(0).(func(cosmos_sdktypes.Context, common.Address, common.Hash) common.Hash); ok { + r0 = rf(ctx, addr, key) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(common.Hash) + } + } + + return r0 +} + +// MockEVMKeeper_GetState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetState' +type MockEVMKeeper_GetState_Call struct { + *mock.Call +} + +// GetState is a helper method to define mock.On call +// - ctx cosmos_sdktypes.Context +// - addr common.Address +// - key common.Hash +func (_e *EVMKeeper_Expecter) GetState(ctx interface{}, addr interface{}, key interface{}) *MockEVMKeeper_GetState_Call { + return &MockEVMKeeper_GetState_Call{Call: _e.mock.On("GetState", ctx, addr, key)} +} + +func (_c *MockEVMKeeper_GetState_Call) Run(run func(ctx cosmos_sdktypes.Context, addr common.Address, key common.Hash)) *MockEVMKeeper_GetState_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(cosmos_sdktypes.Context), args[1].(common.Address), args[2].(common.Hash)) + }) + return _c +} + +func (_c *MockEVMKeeper_GetState_Call) Return(_a0 common.Hash) *MockEVMKeeper_GetState_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockEVMKeeper_GetState_Call) RunAndReturn(run func(cosmos_sdktypes.Context, common.Address, common.Hash) common.Hash) *MockEVMKeeper_GetState_Call { + _c.Call.Return(run) + return _c +} + // IsAvailablePrecompile provides a mock function with given fields: addr func (_m *EVMKeeper) IsAvailablePrecompile(addr common.Address) bool { ret := _m.Called(addr) @@ -156,9 +665,200 @@ func (_m *EVMKeeper) IsAvailablePrecompile(addr common.Address) bool { return r0 } -// NewEVMKeeper creates a new instance of EVMKeeper. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// MockEVMKeeper_IsAvailablePrecompile_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'IsAvailablePrecompile' +type MockEVMKeeper_IsAvailablePrecompile_Call struct { + *mock.Call +} + +// IsAvailablePrecompile is a helper method to define mock.On call +// - addr common.Address +func (_e *EVMKeeper_Expecter) IsAvailablePrecompile(addr interface{}) *MockEVMKeeper_IsAvailablePrecompile_Call { + return &MockEVMKeeper_IsAvailablePrecompile_Call{Call: _e.mock.On("IsAvailablePrecompile", addr)} +} + +func (_c *MockEVMKeeper_IsAvailablePrecompile_Call) Run(run func(addr common.Address)) *MockEVMKeeper_IsAvailablePrecompile_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *MockEVMKeeper_IsAvailablePrecompile_Call) Return(_a0 bool) *MockEVMKeeper_IsAvailablePrecompile_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockEVMKeeper_IsAvailablePrecompile_Call) RunAndReturn(run func(common.Address) bool) *MockEVMKeeper_IsAvailablePrecompile_Call { + _c.Call.Return(run) + return _c +} + +// NewEVM provides a mock function with given fields: ctx, msg, cfg, tracer, stateDB +func (_m *EVMKeeper) NewEVM(ctx cosmos_sdktypes.Context, msg core.Message, cfg *statedb.EVMConfig, tracer vm.EVMLogger, stateDB vm.StateDB) *vm.EVM { + ret := _m.Called(ctx, msg, cfg, tracer, stateDB) + + var r0 *vm.EVM + if rf, ok := ret.Get(0).(func(cosmos_sdktypes.Context, core.Message, *statedb.EVMConfig, vm.EVMLogger, vm.StateDB) *vm.EVM); ok { + r0 = rf(ctx, msg, cfg, tracer, stateDB) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*vm.EVM) + } + } + + return r0 +} + +// MockEVMKeeper_NewEVM_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NewEVM' +type MockEVMKeeper_NewEVM_Call struct { + *mock.Call +} + +// NewEVM is a helper method to define mock.On call +// - ctx cosmos_sdktypes.Context +// - msg core.Message +// - cfg *statedb.EVMConfig +// - tracer vm.EVMLogger +// - stateDB vm.StateDB +func (_e *EVMKeeper_Expecter) NewEVM(ctx interface{}, msg interface{}, cfg interface{}, tracer interface{}, stateDB interface{}) *MockEVMKeeper_NewEVM_Call { + return &MockEVMKeeper_NewEVM_Call{Call: _e.mock.On("NewEVM", ctx, msg, cfg, tracer, stateDB)} +} + +func (_c *MockEVMKeeper_NewEVM_Call) Run(run func(ctx cosmos_sdktypes.Context, msg core.Message, cfg *statedb.EVMConfig, tracer vm.EVMLogger, stateDB vm.StateDB)) *MockEVMKeeper_NewEVM_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(cosmos_sdktypes.Context), args[1].(core.Message), args[2].(*statedb.EVMConfig), args[3].(vm.EVMLogger), args[4].(vm.StateDB)) + }) + return _c +} + +func (_c *MockEVMKeeper_NewEVM_Call) Return(_a0 *vm.EVM) *MockEVMKeeper_NewEVM_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockEVMKeeper_NewEVM_Call) RunAndReturn(run func(cosmos_sdktypes.Context, core.Message, *statedb.EVMConfig, vm.EVMLogger, vm.StateDB) *vm.EVM) *MockEVMKeeper_NewEVM_Call { + _c.Call.Return(run) + return _c +} + +// SetAccount provides a mock function with given fields: ctx, addr, account +func (_m *EVMKeeper) SetAccount(ctx cosmos_sdktypes.Context, addr common.Address, account statedb.Account) error { + ret := _m.Called(ctx, addr, account) + + var r0 error + if rf, ok := ret.Get(0).(func(cosmos_sdktypes.Context, common.Address, statedb.Account) error); ok { + r0 = rf(ctx, addr, account) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// MockEVMKeeper_SetAccount_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetAccount' +type MockEVMKeeper_SetAccount_Call struct { + *mock.Call +} + +// SetAccount is a helper method to define mock.On call +// - ctx cosmos_sdktypes.Context +// - addr common.Address +// - account statedb.Account +func (_e *EVMKeeper_Expecter) SetAccount(ctx interface{}, addr interface{}, account interface{}) *MockEVMKeeper_SetAccount_Call { + return &MockEVMKeeper_SetAccount_Call{Call: _e.mock.On("SetAccount", ctx, addr, account)} +} + +func (_c *MockEVMKeeper_SetAccount_Call) Run(run func(ctx cosmos_sdktypes.Context, addr common.Address, account statedb.Account)) *MockEVMKeeper_SetAccount_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(cosmos_sdktypes.Context), args[1].(common.Address), args[2].(statedb.Account)) + }) + return _c +} + +func (_c *MockEVMKeeper_SetAccount_Call) Return(_a0 error) *MockEVMKeeper_SetAccount_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockEVMKeeper_SetAccount_Call) RunAndReturn(run func(cosmos_sdktypes.Context, common.Address, statedb.Account) error) *MockEVMKeeper_SetAccount_Call { + _c.Call.Return(run) + return _c +} + +// SetCode provides a mock function with given fields: ctx, codeHash, code +func (_m *EVMKeeper) SetCode(ctx cosmos_sdktypes.Context, codeHash []byte, code []byte) { + _m.Called(ctx, codeHash, code) +} + +// MockEVMKeeper_SetCode_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetCode' +type MockEVMKeeper_SetCode_Call struct { + *mock.Call +} + +// SetCode is a helper method to define mock.On call +// - ctx cosmos_sdktypes.Context +// - codeHash []byte +// - code []byte +func (_e *EVMKeeper_Expecter) SetCode(ctx interface{}, codeHash interface{}, code interface{}) *MockEVMKeeper_SetCode_Call { + return &MockEVMKeeper_SetCode_Call{Call: _e.mock.On("SetCode", ctx, codeHash, code)} +} + +func (_c *MockEVMKeeper_SetCode_Call) Run(run func(ctx cosmos_sdktypes.Context, codeHash []byte, code []byte)) *MockEVMKeeper_SetCode_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(cosmos_sdktypes.Context), args[1].([]byte), args[2].([]byte)) + }) + return _c +} + +func (_c *MockEVMKeeper_SetCode_Call) Return() *MockEVMKeeper_SetCode_Call { + _c.Call.Return() + return _c +} + +func (_c *MockEVMKeeper_SetCode_Call) RunAndReturn(run func(cosmos_sdktypes.Context, []byte, []byte)) *MockEVMKeeper_SetCode_Call { + _c.Call.Return(run) + return _c +} + +// SetState provides a mock function with given fields: ctx, addr, key, value +func (_m *EVMKeeper) SetState(ctx cosmos_sdktypes.Context, addr common.Address, key common.Hash, value []byte) { + _m.Called(ctx, addr, key, value) +} + +// MockEVMKeeper_SetState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetState' +type MockEVMKeeper_SetState_Call struct { + *mock.Call +} + +// SetState is a helper method to define mock.On call +// - ctx cosmos_sdktypes.Context +// - addr common.Address +// - key common.Hash +// - value []byte +func (_e *EVMKeeper_Expecter) SetState(ctx interface{}, addr interface{}, key interface{}, value interface{}) *MockEVMKeeper_SetState_Call { + return &MockEVMKeeper_SetState_Call{Call: _e.mock.On("SetState", ctx, addr, key, value)} +} + +func (_c *MockEVMKeeper_SetState_Call) Run(run func(ctx cosmos_sdktypes.Context, addr common.Address, key common.Hash, value []byte)) *MockEVMKeeper_SetState_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(cosmos_sdktypes.Context), args[1].(common.Address), args[2].(common.Hash), args[3].([]byte)) + }) + return _c +} + +func (_c *MockEVMKeeper_SetState_Call) Return() *MockEVMKeeper_SetState_Call { + _c.Call.Return() + return _c +} + +func (_c *MockEVMKeeper_SetState_Call) RunAndReturn(run func(cosmos_sdktypes.Context, common.Address, common.Hash, []byte)) *MockEVMKeeper_SetState_Call { + _c.Call.Return(run) + return _c +} + +// NewMockEVMKeeper creates a new instance of MockEVMKeeper. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. // The first argument is typically a *testing.T value. -func NewEVMKeeper(t interface { +func NewMockEVMKeeper(t interface { mock.TestingT Cleanup(func()) }, From b802946f2533def20eadccad099dbf4ee834ee28 Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Thu, 11 Jan 2024 22:19:46 -0300 Subject: [PATCH 067/345] fix: typo in burned coins metrics (#2249) * add burnt coins metrics * add changelog entry * add test case * small fix * small refactor * update name * update name * fix type * set telemetry on deliver tx only --------- Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> --- CHANGELOG.md | 2 +- app/post/burn.go | 13 ++++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c78db8d008..5fc2c514a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -154,7 +154,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (outposts) [#2223](https://github.com/evmos/evmos/pull/2223) Update Outposts struct documentation and `ValidateBasic`. - (p256-precompile) [#2228](https://github.com/evmos/evmos/pull/2228) Adjust p256 precompile address from `0x0b` to `0x100`. - (staking-precompile) [#2234](https://github.com/evmos/evmos/pull/2234) Fix wrong error messages in `NewMsgCreateValidator`. -- (metrics) [#2246](https://github.com/evmos/evmos/pull/2246) Add burnt cosmos transactions fees metric. +- (metrics) [#2246](https://github.com/evmos/evmos/pull/2246) Add burned cosmos transactions fees metric. ### Bug Fixes diff --git a/app/post/burn.go b/app/post/burn.go index 5cca8ac1d1..19703c538a 100644 --- a/app/post/burn.go +++ b/app/post/burn.go @@ -56,7 +56,7 @@ func (bd BurnDecorator) PostHandle(ctx sdk.Context, tx sdk.Tx, simulate, success } // burn min(balance, fee) - var burntCoins sdk.Coins + var burnedCoins sdk.Coins for _, fee := range fees { balance := bd.bankKeeper.GetBalance(ctx, authtypes.NewModuleAddress(bd.feeCollectorName), fee.Denom) if !balance.IsPositive() { @@ -65,23 +65,26 @@ func (bd BurnDecorator) PostHandle(ctx sdk.Context, tx sdk.Tx, simulate, success amount := sdkmath.MinInt(fee.Amount, balance.Amount) - burntCoins = append(burntCoins, sdk.Coin{Denom: fee.Denom, Amount: amount}) + burnedCoins = append(burnedCoins, sdk.Coin{Denom: fee.Denom, Amount: amount}) } // NOTE: since all Cosmos tx fees are pooled by the fee collector module account, // we burn them directly from it - if err := bd.bankKeeper.BurnCoins(ctx, bd.feeCollectorName, burntCoins); err != nil { + if err := bd.bankKeeper.BurnCoins(ctx, bd.feeCollectorName, burnedCoins); err != nil { return ctx, err } defer func() { - for _, c := range burntCoins { + if ctx.IsCheckTx() || ctx.IsReCheckTx() { + return + } + for _, c := range burnedCoins { // if fee amount is higher than uint64, skip the counter if !c.Amount.IsUint64() { continue } telemetry.IncrCounterWithLabels( - []string{"burnt", "tx", "fee", "amount"}, + []string{"burned", "tx", "fee", "amount"}, float32(c.Amount.Uint64()), []metrics.Label{ telemetry.NewLabel("denom", c.Denom), From 489c518adcde79edcf459ae1d0847681b0a8e22b Mon Sep 17 00:00:00 2001 From: Luke Date: Fri, 12 Jan 2024 11:41:30 +0800 Subject: [PATCH 068/345] imp(distribution): adjust the magic number in distribution integration test to more reasonable logic (#2240) * imp(distribution): adjust the magic number in distribution integration test to more reasonable logic * Update CHANGELOG.md --------- Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- CHANGELOG.md | 1 + precompiles/distribution/integration_test.go | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5fc2c514a7..fcb180ba26 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -153,6 +153,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (swagger) [#2219](https://github.com/evmos/evmos/pull/2219) Update Swagger configuration to remove outdated entries and update vesting module version. - (outposts) [#2223](https://github.com/evmos/evmos/pull/2223) Update Outposts struct documentation and `ValidateBasic`. - (p256-precompile) [#2228](https://github.com/evmos/evmos/pull/2228) Adjust p256 precompile address from `0x0b` to `0x100`. +- (distribution-precompile) [#2240](https://github.com/evmos/evmos/pull/2240) Replace hardcoded expected balance in distribution precompile tests with queried balance. - (staking-precompile) [#2234](https://github.com/evmos/evmos/pull/2234) Fix wrong error messages in `NewMsgCreateValidator`. - (metrics) [#2246](https://github.com/evmos/evmos/pull/2246) Add burned cosmos transactions fees metric. diff --git a/precompiles/distribution/integration_test.go b/precompiles/distribution/integration_test.go index 3be192429d..d28f55f2b5 100644 --- a/precompiles/distribution/integration_test.go +++ b/precompiles/distribution/integration_test.go @@ -962,7 +962,8 @@ var _ = Describe("Calling distribution precompile from another contract", func() }) It("should withdraw rewards successfully to a different address without origin check", func() { - expectedBalance = sdk.Coin{Denom: utils.BaseDenom, Amount: math.NewInt(6997329929187000000)} + initialBalance := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + err := s.app.DistrKeeper.SetWithdrawAddr(s.ctx, contractAddr.Bytes(), s.address.Bytes()) Expect(err).To(BeNil()) @@ -975,7 +976,7 @@ var _ = Describe("Calling distribution precompile from another contract", func() // balance should increase finalBalance := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) - Expect(finalBalance.Amount.Equal(expectedBalance.Amount)).To(BeTrue(), "expected final balance to be greater than initial balance after withdrawing rewards") + Expect(finalBalance.Amount.GT(initialBalance.Amount)).To(BeTrue(), "expected final balance to be greater than initial balance after withdrawing rewards") }) }) From e98a72901d06d61491fdd3aa873ee6685855cb0a Mon Sep 17 00:00:00 2001 From: Vladislav Varadinov Date: Mon, 15 Jan 2024 10:30:49 +0200 Subject: [PATCH 069/345] fix(outposts): Provide timeout timestamp relative to block time (#2236) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(outposts): Provide timeout timestamp relative to block height * fix: change to minutes * apply changes from code review * fix: add var for direct DefaultTimeoutHeight --------- Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> --- CHANGELOG.md | 1 + precompiles/ics20/types.go | 16 ++++++++++------ precompiles/outposts/osmosis/osmosis.go | 19 ++++++------------- precompiles/outposts/osmosis/tx.go | 7 +++++-- precompiles/outposts/stride/stride.go | 5 ----- precompiles/outposts/stride/tx.go | 11 +++++++---- 6 files changed, 29 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fcb180ba26..bcf247969e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -153,6 +153,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (swagger) [#2219](https://github.com/evmos/evmos/pull/2219) Update Swagger configuration to remove outdated entries and update vesting module version. - (outposts) [#2223](https://github.com/evmos/evmos/pull/2223) Update Outposts struct documentation and `ValidateBasic`. - (p256-precompile) [#2228](https://github.com/evmos/evmos/pull/2228) Adjust p256 precompile address from `0x0b` to `0x100`. +- (outposts) [#2217](https://github.com/evmos/evmos/pull/2217) Add default timeout timestamp for outpost transactions. - (distribution-precompile) [#2240](https://github.com/evmos/evmos/pull/2240) Replace hardcoded expected balance in distribution precompile tests with queried balance. - (staking-precompile) [#2234](https://github.com/evmos/evmos/pull/2234) Fix wrong error messages in `NewMsgCreateValidator`. - (metrics) [#2246](https://github.com/evmos/evmos/pull/2246) Add burned cosmos transactions fees metric. diff --git a/precompiles/ics20/types.go b/precompiles/ics20/types.go index 971318154f..921974ba40 100644 --- a/precompiles/ics20/types.go +++ b/precompiles/ics20/types.go @@ -25,15 +25,19 @@ import ( ) const ( - // TimeoutHeight is the default value used in the IBC timeout height for - // the client. - DefaultTimeoutHeight = 100 + // DefaultRevisionNumber is the default value used to not set a timeout revision number + DefaultRevisionNumber = 0 - // DefaultTimeoutTimestamp is the default value used in the IBC timeout - // timestamp for the client. - DefaultTimeoutTimestamp = 0 + // DefaultRevisionHeight is the default value used to not set a timeout revision height + DefaultRevisionHeight = 0 + + // DefaultTimeoutMinutes is the default value in minutes used to set a timeout timestamp + DefaultTimeoutMinutes = 10 ) +// DefaultTimeoutHeight is the default value used to set a timeout height +var DefaultTimeoutHeight = clienttypes.NewHeight(DefaultRevisionNumber, DefaultRevisionHeight) + // EventIBCTransfer is the event type emitted when a transfer is executed. type EventIBCTransfer struct { Sender common.Address diff --git a/precompiles/outposts/osmosis/osmosis.go b/precompiles/outposts/osmosis/osmosis.go index a10166b524..c12e7526de 100644 --- a/precompiles/outposts/osmosis/osmosis.go +++ b/precompiles/outposts/osmosis/osmosis.go @@ -11,13 +11,11 @@ import ( authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" - clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" channelkeeper "github.com/cosmos/ibc-go/v7/modules/core/04-channel/keeper" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" cmn "github.com/evmos/evmos/v16/precompiles/common" - "github.com/evmos/evmos/v16/precompiles/ics20" erc20keeper "github.com/evmos/evmos/v16/x/erc20/keeper" transferkeeper "github.com/evmos/evmos/v16/x/ibc/transfer/keeper" ) @@ -41,9 +39,6 @@ var f embed.FS type Precompile struct { cmn.Precompile wevmosAddress common.Address - // IBC - timeoutHeight clienttypes.Height - timeoutTimestamp uint64 // Keepers bankKeeper bankkeeper.Keeper @@ -77,14 +72,12 @@ func NewPrecompile( ApprovalExpiration: cmn.DefaultExpirationDuration, AuthzKeeper: authzKeeper, }, - wevmosAddress: wevmosAddress, - timeoutHeight: clienttypes.NewHeight(ics20.DefaultTimeoutHeight, ics20.DefaultTimeoutHeight), - timeoutTimestamp: ics20.DefaultTimeoutTimestamp, - bankKeeper: bankKeeper, - transferKeeper: transferKeeper, - stakingKeeper: stakingKeeper, - erc20Keeper: erc20Keeper, - channelKeeper: channelKeeper, + wevmosAddress: wevmosAddress, + bankKeeper: bankKeeper, + transferKeeper: transferKeeper, + stakingKeeper: stakingKeeper, + erc20Keeper: erc20Keeper, + channelKeeper: channelKeeper, }, nil } diff --git a/precompiles/outposts/osmosis/tx.go b/precompiles/outposts/osmosis/tx.go index 58e8c00f83..94d0051981 100644 --- a/precompiles/outposts/osmosis/tx.go +++ b/precompiles/outposts/osmosis/tx.go @@ -8,6 +8,8 @@ package osmosis import ( + "time" + errorsmod "cosmossdk.io/errors" "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" @@ -126,6 +128,7 @@ func (p Precompile) Swap( } packetString := packet.String() + timeoutTimestamp := ctx.BlockTime().Add(ics20.DefaultTimeoutMinutes * time.Minute).UnixNano() coin := sdk.Coin{Denom: inputDenom, Amount: math.NewIntFromBigInt(amount)} msg, err := ics20.CreateAndValidateMsgTransfer( evmosChannel.PortID, @@ -133,8 +136,8 @@ func (p Precompile) Swap( coin, sdk.AccAddress(sender.Bytes()).String(), swapPacketData.XcsContract, - p.timeoutHeight, - p.timeoutTimestamp, + ics20.DefaultTimeoutHeight, + uint64(timeoutTimestamp), packetString, ) if err != nil { diff --git a/precompiles/outposts/stride/stride.go b/precompiles/outposts/stride/stride.go index d9d628c52f..90e76383ca 100644 --- a/precompiles/outposts/stride/stride.go +++ b/precompiles/outposts/stride/stride.go @@ -10,13 +10,10 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" - clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" - "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" cmn "github.com/evmos/evmos/v16/precompiles/common" - "github.com/evmos/evmos/v16/precompiles/ics20" erc20keeper "github.com/evmos/evmos/v16/x/erc20/keeper" transferkeeper "github.com/evmos/evmos/v16/x/ibc/transfer/keeper" ) @@ -31,7 +28,6 @@ var f embed.FS type Precompile struct { cmn.Precompile wevmosAddress common.Address - timeoutHeight clienttypes.Height transferKeeper transferkeeper.Keeper erc20Keeper erc20keeper.Keeper stakingKeeper stakingkeeper.Keeper @@ -60,7 +56,6 @@ func NewPrecompile( ApprovalExpiration: cmn.DefaultExpirationDuration, // should be configurable in the future. }, wevmosAddress: wevmosAddress, - timeoutHeight: clienttypes.NewHeight(ics20.DefaultTimeoutHeight, ics20.DefaultTimeoutHeight), transferKeeper: transferKeeper, erc20Keeper: erc20Keeper, stakingKeeper: stakingKeeper, diff --git a/precompiles/outposts/stride/tx.go b/precompiles/outposts/stride/tx.go index 3f90753257..469617b709 100644 --- a/precompiles/outposts/stride/tx.go +++ b/precompiles/outposts/stride/tx.go @@ -5,6 +5,7 @@ package stride import ( "fmt" + "time" transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" @@ -75,14 +76,15 @@ func (p Precompile) LiquidStake( } // Build the MsgTransfer with the memo and coin + timeoutTimestamp := ctx.BlockTime().Add(ics20.DefaultTimeoutMinutes * time.Minute).UnixNano() msg, err := ics20.CreateAndValidateMsgTransfer( transfertypes.PortID, autopilotArgs.ChannelID, coin, sdk.AccAddress(sender.Bytes()).String(), strideForwarder, - p.timeoutHeight, - 0, + ics20.DefaultTimeoutHeight, + uint64(timeoutTimestamp), memo, ) if err != nil { @@ -187,6 +189,7 @@ func (p Precompile) RedeemStake( return nil, err } + timeoutTimestamp := ctx.BlockTime().Add(ics20.DefaultTimeoutMinutes * time.Minute).UnixNano() // Build the MsgTransfer with the memo and coin msg, err := ics20.CreateAndValidateMsgTransfer( transfertypes.PortID, @@ -194,8 +197,8 @@ func (p Precompile) RedeemStake( coin, sdk.AccAddress(sender.Bytes()).String(), strideForwarder, - p.timeoutHeight, - 0, + ics20.DefaultTimeoutHeight, + uint64(timeoutTimestamp), memo, ) if err != nil { From 26e44c0ee905b6fcc744fd66187f74c7d01e295b Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Mon, 15 Jan 2024 15:15:43 +0100 Subject: [PATCH 070/345] fix(ci): Update configuration for pull request labeler (#2268) * update configuration for pull request labeler * address linter * add changelog entry * add precompile label * address linter --- .github/labeler.yml | 86 ++++++++++++++++++++++++++++++--------------- CHANGELOG.md | 1 + 2 files changed, 58 insertions(+), 29 deletions(-) diff --git a/.github/labeler.yml b/.github/labeler.yml index ec16099e45..02a3316c3e 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -1,29 +1,57 @@ -"C:Proto": - - proto/**/* - - third_party/**/* - - /**/*.pb.go - - /**/*.pb.gw.go -"C:Types": - - types/**/* -"Type: Build": - - Makefile - - Dockerfile - - docker-compose.yml - - scripts/* - - config.yml -"Type: CI": - - .github/**/*.yml - - buf.yaml - - .mergify.yml - - .golangci.yml -"C:CLI": - - client/**/* - - x/*/client/**/* -"Type: Tests": - - tests/**/* - - /**/*/*_test.go -"Type: Docs": - - docs/**/* - - x/*/spec/**/* -"Type: ADR": - - docs/architecture/**/* \ No newline at end of file +proto: + - changed-files: + - any-glob-to-any-file: [ + "proto/**/*", + "**/*.pb.go", + "**/*.pb.gw.go" + ] +types: + - changed-files: + - any-glob-to-any-file: [ + "types/**/*", + ] +build: + - changed-files: + - any-glob-to-any-file: [ + "Makefile", + "Dockerfile", + "docker-compose.yml", + "scripts/*", + "config.yml", + ] +CI: + - changed-files: + - any-glob-to-any-file: [ + ".github/**/*", + ".mergify.yml", + ".golangci.yml", + "buf.yaml", + ] +CLI: + - changed-files: + - any-glob-to-any-file: [ + "client/**/*", + "x/*/client/**/*", + ] +tests: + - changed-files: + - any-glob-to-any-file: [ + "tests/**/*", + "testutil/**/*", + "**/*_test.go", + ] +contracts: + - changed-files: + - any-glob-to-any-file: [ + "contracts/**/*", + "*.sol", + ] +precompile: + - changed-files: + - any-glob-to-any-file: [ + "precompile/**/*", + ] +release: + - base-branch: "^release/" +feature: + - head-branch: "^feat/" diff --git a/CHANGELOG.md b/CHANGELOG.md index bcf247969e..e9f41c4117 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -157,6 +157,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (distribution-precompile) [#2240](https://github.com/evmos/evmos/pull/2240) Replace hardcoded expected balance in distribution precompile tests with queried balance. - (staking-precompile) [#2234](https://github.com/evmos/evmos/pull/2234) Fix wrong error messages in `NewMsgCreateValidator`. - (metrics) [#2246](https://github.com/evmos/evmos/pull/2246) Add burned cosmos transactions fees metric. +- (ci) [#2268](https://github.com/evmos/evmos/pull/2268) Fix and update the Pull Request Labeler workflow. ### Bug Fixes From c455311af02a5ca30a8d111eba1652352da61657 Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Mon, 15 Jan 2024 15:39:29 +0100 Subject: [PATCH 071/345] fix(ci): fix CI config for required items to always run but stop when no diff (#2259) * adjust markdown links config * adjust code ql config * add changelog entry * remove running CI items on pushes to main * remove git diff check for CodeQL to run it everytime * only run CodeQL when go or Python files are changed --- .github/workflows/ante-benchmark.yml | 17 +++++++---------- .github/workflows/auto-format.yml | 3 --- .github/workflows/codeql-analysis.yml | 9 ++------- .github/workflows/e2e-test.yml | 3 --- .github/workflows/labeler.yml | 3 --- .github/workflows/lint.yml | 3 --- .github/workflows/markdown-links.yml | 12 +++++------- .github/workflows/security.yml | 3 --- .github/workflows/semgrep.yml | 10 ++-------- .github/workflows/slither.yml | 3 --- .github/workflows/solhint.yml | 13 ++++++++++--- .github/workflows/super-linter.yml | 3 --- CHANGELOG.md | 1 + 13 files changed, 27 insertions(+), 56 deletions(-) diff --git a/.github/workflows/ante-benchmark.yml b/.github/workflows/ante-benchmark.yml index e74b253521..ad38854938 100644 --- a/.github/workflows/ante-benchmark.yml +++ b/.github/workflows/ante-benchmark.yml @@ -1,16 +1,9 @@ name: AnteHandler Benchmark Tests on: - push: - branches: - - main - paths: - - 'app/ante/**' pull_request: branches: - main - paths: - - 'app/ante/**' jobs: ante-benchmark-test: @@ -18,13 +11,17 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 - + - uses: technote-space/get-diff-action@v6.1.2 + id: git_diff + with: + PATTERNS: | + app/ante/**.go - name: Setup Golang uses: actions/setup-go@v5 with: go-version: '1.20' check-latest: true - + if: env.GIT_DIFF - name: Run benchmark tests run: go test -bench=. ./app/ante/... -benchtime=1000x - + if: env.GIT_DIFF diff --git a/.github/workflows/auto-format.yml b/.github/workflows/auto-format.yml index 59462e15ae..873a18c00d 100644 --- a/.github/workflows/auto-format.yml +++ b/.github/workflows/auto-format.yml @@ -2,9 +2,6 @@ name: Auto Format on: pull_request: - push: - branches: - - main jobs: format-go-code: diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 18ac84faf6..af0eb92467 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -12,13 +12,7 @@ name: "CodeQL" on: - push: - branches: [main] pull_request: - # The branches below must be a subset of the branches above - branches: [main] - schedule: - - cron: '37 21 * * 4' jobs: analyze: @@ -32,7 +26,7 @@ jobs: strategy: fail-fast: false matrix: - language: ['go'] + language: ['go', 'python'] # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] # Learn more: # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed @@ -47,6 +41,7 @@ jobs: go.mod go.sum *.toml + **/**.py # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL diff --git a/.github/workflows/e2e-test.yml b/.github/workflows/e2e-test.yml index b5a53c96d8..f6e88d2376 100644 --- a/.github/workflows/e2e-test.yml +++ b/.github/workflows/e2e-test.yml @@ -3,9 +3,6 @@ on: pull_request: branches: - main - push: - branches: - - main jobs: test-e2e: diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index 4d3b7b61d1..bb87367f00 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -1,9 +1,6 @@ name: "Pull Request Labeler" on: pull_request: - push: - branches: - - main jobs: triage: diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 2fafee545c..5804dc5e72 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -4,9 +4,6 @@ name: Lint # running if no *.{go, mod, sum} files have been changed. on: pull_request: - push: - branches: - - main jobs: golangci: name: Run golangci-lint diff --git a/.github/workflows/markdown-links.yml b/.github/workflows/markdown-links.yml index 8e4ce3be19..9cb7eeb2a8 100644 --- a/.github/workflows/markdown-links.yml +++ b/.github/workflows/markdown-links.yml @@ -1,22 +1,20 @@ name: Check Markdown links on: pull_request: - paths: - - '**.md' - push: - branches: - - main - paths: - - '**.md' jobs: markdown-link-check: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + - uses: technote-space/get-diff-action@v6.1.2 + with: + PATTERNS: | + **.md - uses: gaurav-nelson/github-action-markdown-link-check@master with: check-modified-files-only: "yes" use-quiet-mode: "yes" base-branch: "main" config-file: "mlc_config.json" + if: env.GIT_DIFF diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml index 0fdfe4ed6a..e3ecbd760d 100644 --- a/.github/workflows/security.yml +++ b/.github/workflows/security.yml @@ -1,9 +1,6 @@ name: Run Gosec on: pull_request: - push: - branches: - - main jobs: Gosec: diff --git a/.github/workflows/semgrep.yml b/.github/workflows/semgrep.yml index 777cdc7636..bd918cf113 100644 --- a/.github/workflows/semgrep.yml +++ b/.github/workflows/semgrep.yml @@ -1,14 +1,8 @@ name: Semgrep on: # Scan changed files in PRs, block on new issues only (existing issues ignored) - pull_request: {} - push: - branches: - - main - paths: - - .github/workflows/semgrep.yml - schedule: - - cron: '0 0 * * 0' + pull_request: + jobs: # Update from: https://semgrep.dev/docs/semgrep-ci/sample-ci-configs/#github-actions [removing GH Security Dashboard] semgrep: diff --git a/.github/workflows/slither.yml b/.github/workflows/slither.yml index d7191aab44..f1787e958e 100644 --- a/.github/workflows/slither.yml +++ b/.github/workflows/slither.yml @@ -2,9 +2,6 @@ name: Slither Analysis on: pull_request: - push: - branches: - - main jobs: analyze: diff --git a/.github/workflows/solhint.yml b/.github/workflows/solhint.yml index d410626822..e66cccff1f 100644 --- a/.github/workflows/solhint.yml +++ b/.github/workflows/solhint.yml @@ -2,8 +2,6 @@ name: Solhint # This workflow is only run when a .sol file has been changed on: pull_request: - paths: - - "contracts/**" jobs: solhint: @@ -11,7 +9,16 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + - uses: technote-space/get-diff-action@v6.1.2 + id: git_diff + with: + PATTERNS: | + **/**.sol - uses: actions/setup-node@v4 + if: env.GIT_DIFF - run: npm install -g solhint + if: env.GIT_DIFF - run: solhint --version - - run: solhint 'contracts/**/*.sol' + if: env.GIT_DIFF + - run: solhint '**/*.sol' + if: env.GIT_DIFF diff --git a/.github/workflows/super-linter.yml b/.github/workflows/super-linter.yml index 792a3aa77d..191e4e96cd 100644 --- a/.github/workflows/super-linter.yml +++ b/.github/workflows/super-linter.yml @@ -8,10 +8,7 @@ name: Lint Code Base on: - push: - branches: ["main"] pull_request: - branches: ["main"] jobs: run-lint: runs-on: ubuntu-latest diff --git a/CHANGELOG.md b/CHANGELOG.md index e9f41c4117..213eca23b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -157,6 +157,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (distribution-precompile) [#2240](https://github.com/evmos/evmos/pull/2240) Replace hardcoded expected balance in distribution precompile tests with queried balance. - (staking-precompile) [#2234](https://github.com/evmos/evmos/pull/2234) Fix wrong error messages in `NewMsgCreateValidator`. - (metrics) [#2246](https://github.com/evmos/evmos/pull/2246) Add burned cosmos transactions fees metric. +- (ci) [#2259](https://github.com/evmos/evmos/pull/2259) Adjust CI configuration to have required items always return a status. - (ci) [#2268](https://github.com/evmos/evmos/pull/2268) Fix and update the Pull Request Labeler workflow. ### Bug Fixes From 43f8e2bdeb045a21ce448a38e300f8f7d5c539f7 Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Mon, 15 Jan 2024 15:45:26 +0100 Subject: [PATCH 072/345] chore(ci): adjust codecov settings to require 90% diff hit across the board (#2256) adjust codecov settings Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: Vladislav Varadinov --- codecov.yml | 33 --------------------------------- 1 file changed, 33 deletions(-) diff --git a/codecov.yml b/codecov.yml index fbd5392b78..c58fcbaef8 100644 --- a/codecov.yml +++ b/codecov.yml @@ -13,21 +13,7 @@ coverage: project: default: threshold: 1% # allow this much decrease on project - app: - target: 70% - flags: - - app - modules: target: 90% - flags: - - modules - core: - target: 90% - flags: - - core - client: - flags: - - client changes: false comment: @@ -35,26 +21,7 @@ comment: behavior: default # update if exists else create new require_changes: true -flags: - app: - paths: - - "app" - modules: - paths: - - "x" - - "!x/**/client" # ignore client package - core: - paths: - - "core" - - "crypto" - - "types" - clients: - paths: - - "x/**/client" - - "x/**/keeper/grpc_query.go" - ignore: - - "docs" - "**/*.md" - "cmd" - "client" From d9591ed0ce69bb2b648be511ada11805485f01dc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jan 2024 15:26:11 +0000 Subject: [PATCH 073/345] build(deps): bump github.com/linxGnu/grocksdb from 1.8.10 to 1.8.11 (#2253) * build(deps): bump github.com/linxGnu/grocksdb from 1.8.10 to 1.8.11 Bumps [github.com/linxGnu/grocksdb](https://github.com/linxGnu/grocksdb) from 1.8.10 to 1.8.11. - [Release notes](https://github.com/linxGnu/grocksdb/releases) - [Commits](https://github.com/linxGnu/grocksdb/compare/v1.8.10...v1.8.11) --- updated-dependencies: - dependency-name: github.com/linxGnu/grocksdb dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * gomod2nix generate * update rocksdb version --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: tom Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- Dockerfile | 2 +- Makefile | 2 +- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- nix/rocksdb.nix | 4 ++-- scripts/install_librocksdb.sh | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Dockerfile b/Dockerfile index 35d864507a..0ffd52a791 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ FROM golang:1.21.6-alpine3.18 AS build-env ARG DB_BACKEND=goleveldb -ARG ROCKSDB_VERSION="8.8.1" +ARG ROCKSDB_VERSION="8.9.1" WORKDIR /go/src/github.com/evmos/evmos diff --git a/Makefile b/Makefile index 359974f285..8258cc23a1 100644 --- a/Makefile +++ b/Makefile @@ -26,7 +26,7 @@ DOCKER_TAG := $(COMMIT_HASH) # e2e env MOUNT_PATH := $(shell pwd)/build/:/root/ E2E_SKIP_CLEANUP := false -ROCKSDB_VERSION ?= "8.8.1" +ROCKSDB_VERSION ?= "8.9.1" # Deps DEPS_COSMOS_SDK_VERSION := $(shell cat go.sum | grep 'github.com/evmos/cosmos-sdk' | grep -v -e 'go.mod' | tail -n 1 | awk '{ print $$2; }') DEPS_IBC_GO_VERSION := $(shell cat go.sum | grep 'github.com/cosmos/ibc-go' | grep -v -e 'go.mod' | tail -n 1 | awk '{ print $$2; }') diff --git a/go.mod b/go.mod index ab9a91453e..cf17cc3059 100644 --- a/go.mod +++ b/go.mod @@ -29,7 +29,7 @@ require ( github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/hashicorp/go-version v1.6.0 github.com/improbable-eng/grpc-web v0.15.0 - github.com/linxGnu/grocksdb v1.8.10 + github.com/linxGnu/grocksdb v1.8.11 github.com/onsi/ginkgo/v2 v2.13.2 github.com/onsi/gomega v1.30.0 github.com/ory/dockertest/v3 v3.10.0 diff --git a/go.sum b/go.sum index f1399a075c..58b1ee1eea 100644 --- a/go.sum +++ b/go.sum @@ -836,8 +836,8 @@ github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6 github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/linxGnu/grocksdb v1.8.10 h1:6FAhBThErRfJaevGOZISYvkG7RD4gfzeq452X4r8pes= -github.com/linxGnu/grocksdb v1.8.10/go.mod h1:xZCIb5Muw+nhbDK4Y5UJuOrin5MceOuiXkVUR7vp4WY= +github.com/linxGnu/grocksdb v1.8.11 h1:BGol9e5gB1BrsTvOxloC88pe70TCqgrfLNwkyWW0kD8= +github.com/linxGnu/grocksdb v1.8.11/go.mod h1:xZCIb5Muw+nhbDK4Y5UJuOrin5MceOuiXkVUR7vp4WY= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= diff --git a/gomod2nix.toml b/gomod2nix.toml index 3da4ea32cf..2d65bef423 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -426,8 +426,8 @@ schema = 3 version = "v0.1.0" hash = "sha256-wQqGTtRWsfR9n0O/SXHVgECebbnNmHddxJIbG63OJBQ=" [mod."github.com/linxGnu/grocksdb"] - version = "v1.8.10" - hash = "sha256-HrhAhTVHPtsBCnWeFmoZI5qZdLIbWB5wofO+iS0xgLI=" + version = "v1.8.11" + hash = "sha256-R2svcOUzENb2o9r8lxohUYn61FCQO7ZyWkV9wjtpoXY=" [mod."github.com/magiconair/properties"] version = "v1.8.7" hash = "sha256-XQ2bnc2s7/IH3WxEO4GishZurMyKwEclZy1DXg+2xXc=" diff --git a/nix/rocksdb.nix b/nix/rocksdb.nix index 433e456d88..d9b57bdb9b 100644 --- a/nix/rocksdb.nix +++ b/nix/rocksdb.nix @@ -17,13 +17,13 @@ stdenv.mkDerivation rec { pname = "rocksdb"; - version = "8.8.1"; + version = "8.9.1"; src = fetchFromGitHub { owner = "facebook"; repo = pname; rev = "v${version}"; - sha256 = "sha256-eE29iojVhR660mXTdX7yT+oqFk5oteBjZcLkmgHQWaY="; + sha256 = "sha256-Pl7t4FVOvnORWFS+gjy2EEUQlPxjLukWW5I5gzCQwkI="; }; nativeBuildInputs = [ cmake ninja ]; diff --git a/scripts/install_librocksdb.sh b/scripts/install_librocksdb.sh index 3eca36c8ae..773de3dae2 100755 --- a/scripts/install_librocksdb.sh +++ b/scripts/install_librocksdb.sh @@ -1,6 +1,6 @@ #!/bin/bash -ROCKSDB_VERSION=${1:-"8.8.1"} +ROCKSDB_VERSION=${1:-"8.9.1"} # Check if RocksDB is already installed if [[ $(find /usr/lib -name "librocksdb.so.${ROCKSDB_VERSION}" -print -quit) ]]; then From 37c5fa16c02e72b5a61e21e3a99b889189155f88 Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Mon, 15 Jan 2024 17:16:10 +0100 Subject: [PATCH 074/345] imp(tests): Minor clean up in EIP-7212 tests (#2267) * imp(test): remove expError * add run method for individual test cases * remove unnecessary tc names in call to require * fix PR labeler to correctly place precompile label * add changelog entry --------- Co-authored-by: Anshal Shukla Co-authored-by: Vladislav Varadinov --- .github/labeler.yml | 2 +- CHANGELOG.md | 1 + precompiles/p256/p256_test.go | 31 +++++++++++++------------------ 3 files changed, 15 insertions(+), 19 deletions(-) diff --git a/.github/labeler.yml b/.github/labeler.yml index 02a3316c3e..9e532713e9 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -49,7 +49,7 @@ contracts: precompile: - changed-files: - any-glob-to-any-file: [ - "precompile/**/*", + "precompiles/**/*", ] release: - base-branch: "^release/" diff --git a/CHANGELOG.md b/CHANGELOG.md index 213eca23b9..4d735872e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -158,6 +158,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (staking-precompile) [#2234](https://github.com/evmos/evmos/pull/2234) Fix wrong error messages in `NewMsgCreateValidator`. - (metrics) [#2246](https://github.com/evmos/evmos/pull/2246) Add burned cosmos transactions fees metric. - (ci) [#2259](https://github.com/evmos/evmos/pull/2259) Adjust CI configuration to have required items always return a status. +- (ci) [#2267](https://github.com/evmos/evmos/pull/2267) Minor clean-up in EIP-7212 tests. - (ci) [#2268](https://github.com/evmos/evmos/pull/2268) Fix and update the Pull Request Labeler workflow. ### Bug Fixes diff --git a/precompiles/p256/p256_test.go b/precompiles/p256/p256_test.go index 71206ec6a6..5fae4b8759 100644 --- a/precompiles/p256/p256_test.go +++ b/precompiles/p256/p256_test.go @@ -25,10 +25,9 @@ func (s *PrecompileTestSuite) TestRequiredGas() { func (s *PrecompileTestSuite) TestRun() { testCases := []struct { - name string - sign func() []byte - expError bool - expPass bool + name string + sign func() []byte + expPass bool }{ { "pass - Sign", @@ -48,7 +47,6 @@ func (s *PrecompileTestSuite) TestRun() { return input }, - false, true, }, { @@ -72,8 +70,7 @@ func (s *PrecompileTestSuite) TestRun() { return input }, - false, - false, + true, }, { "fail - invalid signature", @@ -99,7 +96,6 @@ func (s *PrecompileTestSuite) TestRun() { return input }, - true, false, }, { @@ -113,22 +109,21 @@ func (s *PrecompileTestSuite) TestRun() { return input }, - true, false, }, } for _, tc := range testCases { - input := tc.sign() - bz, err := s.precompile.Run(nil, &vm.Contract{Input: input}, false) - if !tc.expError { - s.Require().NoError(err) + s.Run(tc.name, func() { + input := tc.sign() + bz, err := s.precompile.Run(nil, &vm.Contract{Input: input}, false) if tc.expPass { - s.Require().Equal(trueValue, bz, tc.name) + s.Require().NoError(err) + s.Require().Equal(trueValue, bz) + } else { + s.Require().NoError(err) + s.Require().Empty(bz) } - } else { - s.Require().NoError(err) - s.Require().Empty(bz, tc.name) - } + }) } } From eab8194a440ed13eb959ff955a0123aca2979061 Mon Sep 17 00:00:00 2001 From: stepit <48993133+0xstepit@users.noreply.github.com> Date: Tue, 16 Jan 2024 13:02:32 +0100 Subject: [PATCH 075/345] fix(inflation): update query to return correct inflation value (#2269) * fix query and update tests * fix test * add docstring and update CHANGELOG --- CHANGELOG.md | 3 ++- x/inflation/v1/keeper/genesis_test.go | 7 +++++-- x/inflation/v1/keeper/grpc_query_test.go | 5 +++-- x/inflation/v1/keeper/hooks.go | 2 +- x/inflation/v1/keeper/hooks_test.go | 5 ++++- x/inflation/v1/keeper/inflation.go | 8 +++++++- x/inflation/v1/keeper/inflation_test.go | 5 +++-- x/inflation/v1/keeper/integration_test.go | 9 +++++---- 8 files changed, 30 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d735872e6..bbf0ff9a14 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -168,7 +168,8 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (test) [#1989](https://github.com/evmos/evmos/pull/1989) Fix the problem about deliverTxSimulate in test app/ante/cosmos/min_price_test.go - (db) [#2072](https://github.com/evmos/evmos/pull/2072) Change VersionDb directory permission from 777 (insecure) to 750 (general) - (api) [#2196](https://github.com/evmos/evmos/pull/2196) Remove governance proposals related to the deprecated `x/incentives` module to fix the governance proposals query. -- (swagger) [#2218](https://github.com/evmos/evmos/pull/2218) Use correct version of proto dependencies to generate swagger +- (swagger) [#2218](https://github.com/evmos/evmos/pull/2218) Use correct version of proto dependencies to generate swagger. +- (inflation) [#2269](https://github.com/evmos/evmos/pull/2269) Fix inflation info returned by epoch mint provision getter. ## [v15.0.0] - 2023-10-31 diff --git a/x/inflation/v1/keeper/genesis_test.go b/x/inflation/v1/keeper/genesis_test.go index e7d2161d85..70d5708596 100644 --- a/x/inflation/v1/keeper/genesis_test.go +++ b/x/inflation/v1/keeper/genesis_test.go @@ -1,10 +1,13 @@ package keeper_test -import "cosmossdk.io/math" +import ( + "cosmossdk.io/math" + inflationkeeper "github.com/evmos/evmos/v16/x/inflation/v1/keeper" +) func (suite *KeeperTestSuite) TestInitGenesis() { // check calculated epochMintProvision at genesis epochMintProvision := suite.app.InflationKeeper.GetEpochMintProvision(suite.ctx) - expMintProvision := math.LegacyMustNewDecFromStr("847602739726027397260274.000000000000000000") + expMintProvision := math.LegacyMustNewDecFromStr("847602739726027397260274.000000000000000000").Quo(math.LegacyNewDec(inflationkeeper.ReductionFactor)) suite.Require().Equal(expMintProvision, epochMintProvision) } diff --git a/x/inflation/v1/keeper/grpc_query_test.go b/x/inflation/v1/keeper/grpc_query_test.go index 5de9860ae9..23be3b2318 100644 --- a/x/inflation/v1/keeper/grpc_query_test.go +++ b/x/inflation/v1/keeper/grpc_query_test.go @@ -7,6 +7,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" evmostypes "github.com/evmos/evmos/v16/types" + inflationkeeper "github.com/evmos/evmos/v16/x/inflation/v1/keeper" "github.com/evmos/evmos/v16/x/inflation/v1/types" ) @@ -80,7 +81,7 @@ func (suite *KeeperTestSuite) TestEpochMintProvision() { uint64(0), 365, math.LegacyOneDec(), - ) + ).Quo(math.LegacyNewDec(inflationkeeper.ReductionFactor)) req = &types.QueryEpochMintProvisionRequest{} expRes = &types.QueryEpochMintProvisionResponse{ EpochMintProvision: sdk.NewDecCoinFromDec(types.DefaultInflationDenom, defaultEpochMintProvision), @@ -190,7 +191,7 @@ func (suite *KeeperTestSuite) TestQueryInflationRate() { err := suite.app.InflationKeeper.MintCoins(suite.ctx, mintCoin) suite.Require().NoError(err) - expInflationRate := math.LegacyMustNewDecFromStr("154.687500000000000000") + expInflationRate := math.LegacyMustNewDecFromStr("154.687500000000000000").Quo(math.LegacyNewDec(inflationkeeper.ReductionFactor)) res, err := suite.queryClient.InflationRate(ctx, &types.QueryInflationRateRequest{}) suite.Require().NoError(err) suite.Require().Equal(expInflationRate, res.InflationRate) diff --git a/x/inflation/v1/keeper/hooks.go b/x/inflation/v1/keeper/hooks.go index e8804ea55c..e13ad82e6a 100644 --- a/x/inflation/v1/keeper/hooks.go +++ b/x/inflation/v1/keeper/hooks.go @@ -69,7 +69,7 @@ func (k Keeper) AfterEpochEnd(ctx sdk.Context, epochIdentifier string, epochNumb } // per proposal 258, subtract 2/3 of the prev issuance - epochMintProvision = epochMintProvision.Quo(sdkmath.LegacyNewDec(3)) + epochMintProvision = epochMintProvision.Quo(sdkmath.LegacyNewDec(ReductionFactor)) mintedCoin := sdk.Coin{ Denom: params.MintDenom, diff --git a/x/inflation/v1/keeper/hooks_test.go b/x/inflation/v1/keeper/hooks_test.go index a21a5de8b9..05adbff893 100644 --- a/x/inflation/v1/keeper/hooks_test.go +++ b/x/inflation/v1/keeper/hooks_test.go @@ -4,7 +4,10 @@ import ( "fmt" "time" + "cosmossdk.io/math" + epochstypes "github.com/evmos/evmos/v16/x/epochs/types" + inflationkeeper "github.com/evmos/evmos/v16/x/inflation/v1/keeper" "github.com/evmos/evmos/v16/x/inflation/v1/types" ) @@ -217,7 +220,7 @@ func (suite *KeeperTestSuite) TestPeriodChangesSkippedEpochsAfterEpochEnd() { period, currentEpochPeriod, bondedRatio, - ) + ).Quo(math.LegacyNewDec(inflationkeeper.ReductionFactor)) suite.Require().Equal(expectedProvision, newProvision) // mint provisions will change suite.Require().NotEqual(newProvision.BigInt().Uint64(), originalProvision.BigInt().Uint64()) diff --git a/x/inflation/v1/keeper/inflation.go b/x/inflation/v1/keeper/inflation.go index e180c387fd..94bad56479 100644 --- a/x/inflation/v1/keeper/inflation.go +++ b/x/inflation/v1/keeper/inflation.go @@ -13,6 +13,12 @@ import ( "github.com/evmos/evmos/v16/x/inflation/v1/types" ) +const ( + // ReductionFactor is the value used as denominator to divide the provision amount computed + // with the CalculateEpochMintProvision function. + ReductionFactor = 3 +) + // 200M token at year 4 allocated to the team var teamAlloc = math.NewInt(200_000_000).Mul(evmostypes.PowerReduction) @@ -168,5 +174,5 @@ func (k Keeper) GetEpochMintProvision(ctx sdk.Context) math.LegacyDec { k.GetPeriod(ctx), k.GetEpochsPerPeriod(ctx), k.BondedRatio(ctx), - ) + ).Quo(math.LegacyNewDec(ReductionFactor)) } diff --git a/x/inflation/v1/keeper/inflation_test.go b/x/inflation/v1/keeper/inflation_test.go index d762eb71c7..5e32ea2b0a 100644 --- a/x/inflation/v1/keeper/inflation_test.go +++ b/x/inflation/v1/keeper/inflation_test.go @@ -7,6 +7,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" evmostypes "github.com/evmos/evmos/v16/types" + inflationkeeper "github.com/evmos/evmos/v16/x/inflation/v1/keeper" "github.com/evmos/evmos/v16/x/inflation/v1/types" ) @@ -95,13 +96,13 @@ func (suite *KeeperTestSuite) TestGetCirculatingSupplyAndInflationRate() { "high supply", sdk.TokensFromConsensusPower(800_000_000, evmostypes.PowerReduction).Sub(bondedAmt), func() {}, - math.LegacyMustNewDecFromStr("51.562500000000000000"), + math.LegacyMustNewDecFromStr("51.562500000000000000").Quo(math.LegacyNewDec(inflationkeeper.ReductionFactor)), }, { "low supply", sdk.TokensFromConsensusPower(400_000_000, evmostypes.PowerReduction).Sub(bondedAmt), func() {}, - math.LegacyMustNewDecFromStr("154.687500000000000000"), + math.LegacyMustNewDecFromStr("154.687500000000000000").Quo(math.LegacyNewDec(inflationkeeper.ReductionFactor)), }, { "zero circulating supply", diff --git a/x/inflation/v1/keeper/integration_test.go b/x/inflation/v1/keeper/integration_test.go index 12301352d8..bdab5d34dc 100644 --- a/x/inflation/v1/keeper/integration_test.go +++ b/x/inflation/v1/keeper/integration_test.go @@ -11,6 +11,7 @@ import ( . "github.com/onsi/gomega" epochstypes "github.com/evmos/evmos/v16/x/epochs/types" + inflationkeeper "github.com/evmos/evmos/v16/x/inflation/v1/keeper" "github.com/evmos/evmos/v16/x/inflation/v1/types" ) @@ -87,7 +88,7 @@ var _ = Describe("Inflation", Ordered, func() { expected := provision.Mul(distribution) Expect(balanceCommunityPool.IsZero()).ToNot(BeTrue()) - Expect(balanceCommunityPool.AmountOf(denomMint).LT(expected)).To(BeTrue()) + Expect(balanceCommunityPool.AmountOf(denomMint).GT(expected)).To(BeTrue()) }) }) }) @@ -148,7 +149,7 @@ var _ = Describe("Inflation", Ordered, func() { expected := provision.Mul(distribution) Expect(balanceCommunityPool.IsZero()).ToNot(BeTrue()) - Expect(balanceCommunityPool.AmountOf(denomMint).LT(expected)).To(BeTrue()) + Expect(balanceCommunityPool.AmountOf(denomMint).GT(expected)).To(BeTrue()) }) }) }) @@ -202,7 +203,7 @@ var _ = Describe("Inflation", Ordered, func() { expected := provision.Mul(distribution) Expect(balanceCommunityPool.IsZero()).ToNot(BeTrue()) - Expect(balanceCommunityPool.AmountOf(denomMint).LT(expected)).To(BeTrue()) + Expect(balanceCommunityPool.AmountOf(denomMint).GT(expected)).To(BeTrue()) }) }) }) @@ -297,7 +298,7 @@ var _ = Describe("Inflation", Ordered, func() { It("should recalculate the EpochMintProvision", func() { provisionAfter := s.app.InflationKeeper.GetEpochMintProvision(s.ctx) Expect(provisionAfter).ToNot(Equal(provision)) - Expect(provisionAfter).To(Equal(math.LegacyMustNewDecFromStr("159375000000000000000000000"))) + Expect(provisionAfter).To(Equal(math.LegacyMustNewDecFromStr("159375000000000000000000000").Quo(math.LegacyNewDec(inflationkeeper.ReductionFactor)))) }) }) }) From 3a790f6b9973f7d006f5136205f14f049b9f50ac Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Jan 2024 13:19:37 +0000 Subject: [PATCH 076/345] build(deps): bump github.com/onsi/ginkgo/v2 from 2.13.2 to 2.14.0 (#2261) Bumps [github.com/onsi/ginkgo/v2](https://github.com/onsi/ginkgo) from 2.13.2 to 2.14.0. - [Release notes](https://github.com/onsi/ginkgo/releases) - [Changelog](https://github.com/onsi/ginkgo/blob/master/CHANGELOG.md) - [Commits](https://github.com/onsi/ginkgo/compare/v2.13.2...v2.14.0) --- updated-dependencies: - dependency-name: github.com/onsi/ginkgo/v2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Vladislav Varadinov --- go.mod | 8 ++++---- go.sum | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index cf17cc3059..a30dee6feb 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,7 @@ require ( github.com/hashicorp/go-version v1.6.0 github.com/improbable-eng/grpc-web v0.15.0 github.com/linxGnu/grocksdb v1.8.11 - github.com/onsi/ginkgo/v2 v2.13.2 + github.com/onsi/ginkgo/v2 v2.14.0 github.com/onsi/gomega v1.30.0 github.com/ory/dockertest/v3 v3.10.0 github.com/pkg/errors v0.9.1 @@ -224,12 +224,12 @@ require ( github.com/zbiljic/go-filelock v0.0.0-20170914061330-1dbf7103ab7d // indirect github.com/zondax/ledger-go v0.14.1 // indirect go.etcd.io/bbolt v1.3.7 // indirect - golang.org/x/mod v0.13.0 // indirect + golang.org/x/mod v0.14.0 // indirect golang.org/x/oauth2 v0.13.0 // indirect - golang.org/x/sync v0.4.0 // indirect + golang.org/x/sync v0.5.0 // indirect golang.org/x/sys v0.16.0 // indirect golang.org/x/term v0.16.0 // indirect - golang.org/x/tools v0.14.0 // indirect + golang.org/x/tools v0.16.1 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/api v0.128.0 // indirect google.golang.org/appengine v1.6.8 // indirect diff --git a/go.sum b/go.sum index 58b1ee1eea..c5a46e3025 100644 --- a/go.sum +++ b/go.sum @@ -919,8 +919,8 @@ github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= -github.com/onsi/ginkgo/v2 v2.13.2 h1:Bi2gGVkfn6gQcjNjZJVO8Gf0FHzMPf2phUei9tejVMs= -github.com/onsi/ginkgo/v2 v2.13.2/go.mod h1:XStQ8QcGwLyF4HdfcZB8SFOS/MWCgDuXMSBe6zrvLgM= +github.com/onsi/ginkgo/v2 v2.14.0 h1:vSmGj2Z5YPb9JwCWT6z6ihcUvDhuXLc3sJiqd3jMKAY= +github.com/onsi/ginkgo/v2 v2.14.0/go.mod h1:JkUdW7JkN0V6rFvsHcJ478egV3XH9NxpD27Hal/PhZw= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= @@ -1255,8 +1255,8 @@ golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY= -golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1366,8 +1366,8 @@ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1574,8 +1574,8 @@ golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.14.0 h1:jvNa2pY0M4r62jkRQ6RwEZZyPcymeL9XZMLBbV7U2nc= -golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= +golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA= +golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From cd40774cae78e8ce1faebdd0dc25714dbef259dd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Jan 2024 14:58:15 +0000 Subject: [PATCH 077/345] build(deps): bump cosmossdk.io/errors from 1.0.0 to 1.0.1 (#2254) * build(deps): bump cosmossdk.io/errors from 1.0.0 to 1.0.1 Bumps [cosmossdk.io/errors](https://github.com/cosmos/cosmos-sdk) from 1.0.0 to 1.0.1. - [Release notes](https://github.com/cosmos/cosmos-sdk/releases) - [Changelog](https://github.com/cosmos/cosmos-sdk/blob/main/CHANGELOG.md) - [Commits](https://github.com/cosmos/cosmos-sdk/compare/log/v1.0.0...math/v1.0.1) --- updated-dependencies: - dependency-name: cosmossdk.io/errors dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * gomod2nix generate --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: tom --- go.mod | 22 +++++++++++----------- go.sum | 45 ++++++++++++++++++++++----------------------- gomod2nix.toml | 44 ++++++++++++++++++++++---------------------- 3 files changed, 55 insertions(+), 56 deletions(-) diff --git a/go.mod b/go.mod index a30dee6feb..389176d4e5 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.20 require ( cosmossdk.io/api v0.3.1 - cosmossdk.io/errors v1.0.0 + cosmossdk.io/errors v1.0.1 cosmossdk.io/math v1.2.0 cosmossdk.io/simapp v0.0.0-20230608160436-666c345ad23d cosmossdk.io/tools/rosetta v0.2.1 @@ -49,17 +49,17 @@ require ( golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb golang.org/x/net v0.20.0 golang.org/x/text v0.14.0 - google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 + google.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f google.golang.org/grpc v1.60.1 google.golang.org/protobuf v1.32.0 sigs.k8s.io/yaml v1.4.0 ) require ( - cloud.google.com/go v0.110.8 // indirect - cloud.google.com/go/compute v1.23.0 // indirect + cloud.google.com/go v0.110.10 // indirect + cloud.google.com/go/compute v1.23.3 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v1.1.2 // indirect + cloud.google.com/go/iam v1.1.5 // indirect cloud.google.com/go/storage v1.30.1 // indirect cosmossdk.io/core v0.6.1 // indirect cosmossdk.io/depinject v1.0.0-alpha.4 // indirect @@ -138,10 +138,10 @@ require ( github.com/google/go-cmp v0.6.0 // indirect github.com/google/orderedcode v0.0.1 // indirect github.com/google/pprof v0.0.0-20230228050547-1710fef4ab10 // indirect - github.com/google/s2a-go v0.1.4 // indirect + github.com/google/s2a-go v0.1.7 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect - github.com/google/uuid v1.3.1 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.4 // indirect + github.com/google/uuid v1.4.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/gorilla/handlers v1.5.1 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect @@ -231,10 +231,10 @@ require ( golang.org/x/term v0.16.0 // indirect golang.org/x/tools v0.16.1 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/api v0.128.0 // indirect + google.golang.org/api v0.149.0 // indirect google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97 // indirect + google.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index c5a46e3025..c8775931a4 100644 --- a/go.sum +++ b/go.sum @@ -32,8 +32,8 @@ cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w9 cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.110.8 h1:tyNdfIxjzaWctIiLYOTalaLKZ17SI44SKFW26QbOhME= -cloud.google.com/go v0.110.8/go.mod h1:Iz8AkXJf1qmxC3Oxoep8R1T36w8B92yU29PcBhHO5fk= +cloud.google.com/go v0.110.10 h1:LXy9GEO+timppncPIAZoOj3l58LIU9k+kn48AN7IO3Y= +cloud.google.com/go v0.110.10/go.mod h1:v1OoFqYxiBkUrruItNM3eT4lLByNjxmJSV/xDKJNnic= cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= @@ -70,8 +70,8 @@ cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= -cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= +cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= @@ -111,8 +111,8 @@ cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y97 cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v1.1.2 h1:gacbrBdWcoVmGLozRuStX45YKvJtzIjJdAolzUs1sm4= -cloud.google.com/go/iam v1.1.2/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= +cloud.google.com/go/iam v1.1.5 h1:1jTsCu4bcsNsE4iiqNT5SHwrDRCfRmIaaaVFhRveTJI= +cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= @@ -193,8 +193,8 @@ cosmossdk.io/core v0.6.1 h1:OBy7TI2W+/gyn2z40vVvruK3di+cAluinA6cybFbE7s= cosmossdk.io/core v0.6.1/go.mod h1:g3MMBCBXtxbDWBURDVnJE7XML4BG5qENhs0gzkcpuFA= cosmossdk.io/depinject v1.0.0-alpha.4 h1:PLNp8ZYAMPTUKyG9IK2hsbciDWqna2z1Wsl98okJopc= cosmossdk.io/depinject v1.0.0-alpha.4/go.mod h1:HeDk7IkR5ckZ3lMGs/o91AVUc7E596vMaOmslGFM3yU= -cosmossdk.io/errors v1.0.0 h1:nxF07lmlBbB8NKQhtJ+sJm6ef5uV1XkvPXG2bUntb04= -cosmossdk.io/errors v1.0.0/go.mod h1:+hJZLuhdDE0pYN8HkOrVNwrIOYvUGnn6+4fjnJs/oV0= +cosmossdk.io/errors v1.0.1 h1:bzu+Kcr0kS/1DuPBtUFdWjzLqyUuCiyHjyJB6srBV/0= +cosmossdk.io/errors v1.0.1/go.mod h1:MeelVSZThMi4bEakzhhhE/CKqVv3nOJDA25bIqRDu/U= cosmossdk.io/log v1.2.1 h1:Xc1GgTCicniwmMiKwDxUjO4eLhPxoVdI9vtMW8Ti/uk= cosmossdk.io/log v1.2.1/go.mod h1:GNSCc/6+DhFIj1aLn/j7Id7PaO8DzNylUZoOYBL9+I4= cosmossdk.io/math v1.2.0 h1:8gudhTkkD3NxOP2YyyJIYYmt6dQ55ZfJkDOaxXpy7Ig= @@ -655,20 +655,20 @@ github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20230228050547-1710fef4ab10 h1:CqYfpuYIjnlNxM3msdyPRKabhXZWbKjf3Q8BWROFBso= github.com/google/pprof v0.0.0-20230228050547-1710fef4ab10/go.mod h1:79YE0hCXdHag9sBkw2o+N/YnZtTkXi0UT9Nnixa5eYk= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= -github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= +github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/enterprise-certificate-proxy v0.2.4 h1:uGy6JWR/uMIILU8wbf+OkstIrNiMjGpEIyhx8f6W7s4= -github.com/googleapis/enterprise-certificate-proxy v0.2.4/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= @@ -1209,7 +1209,6 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= @@ -1634,8 +1633,8 @@ google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.128.0 h1:RjPESny5CnQRn9V6siglged+DZCgfu9l6mO9dkX9VOg= -google.golang.org/api v0.128.0/go.mod h1:Y611qgqaE92On/7g65MQgxYul3c0rEB894kniWLY750= +google.golang.org/api v0.149.0 h1:b2CqT6kG+zqJIVKRQ3ELJVLN1PwHZ6DJ3dW8yl82rgY= +google.golang.org/api v0.149.0/go.mod h1:Mwn1B7JTXrzXtnvmzQE2BD6bYZQ8DShKZDZbeN9I7qI= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1754,12 +1753,12 @@ google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqw google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97 h1:SeZZZx0cP0fqUyA+oRzP9k7cSwJlvDFiROO72uwD6i0= -google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97/go.mod h1:t1VqOqqvce95G3hIDCT5FeO3YUc6Q4Oe24L/+rNMxRk= -google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 h1:W18sezcAYs+3tDZX4F80yctqa12jcP1PUS2gQu1zTPU= -google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97/go.mod h1:iargEX0SFPm3xcfMI0d1domjg0ZF4Aa0p2awqyxhvF0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97 h1:6GQBEOdGkX6MMTLT9V+TjtIRZCw9VPD5Z+yHY9wMgS0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97/go.mod h1:v7nGkzlmW8P3n/bKmWBn2WpBjpOEx8Q6gMueudAmKfY= +google.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg= +google.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic= +google.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f h1:2yNACc1O40tTnrsbk9Cv6oxiW8pxI/pXj0wRtdlYmgY= +google.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f/go.mod h1:Uy9bTZJqmfrw2rIBxgGLnamc78euZULUBrLZ9XTITKI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= diff --git a/gomod2nix.toml b/gomod2nix.toml index 2d65bef423..aaca8867e7 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -2,17 +2,17 @@ schema = 3 [mod] [mod."cloud.google.com/go"] - version = "v0.110.8" - hash = "sha256-2zRfdYe7M+PH1Q4oeh0T12pQVnp117CndMt64CkI3XA=" + version = "v0.110.10" + hash = "sha256-D+V6LaCiCdthJ6W0s220Dyqa7/iReEIv5vqxtOGvy/A=" [mod."cloud.google.com/go/compute"] - version = "v1.23.0" - hash = "sha256-Pd5tMfeatH7p/Mh4b5qUqE9vMDgwwTg6/3Hb8uFZyUw=" + version = "v1.23.3" + hash = "sha256-WwlTw/x9GSM6B4nHm9FDvHZ1Pd4KN0wxk650CosJnpQ=" [mod."cloud.google.com/go/compute/metadata"] version = "v0.2.3" hash = "sha256-kYB1FTQRdTDqCqJzSU/jJYbVUGyxbkASUKbEs36FUyU=" [mod."cloud.google.com/go/iam"] - version = "v1.1.2" - hash = "sha256-n4DefmHY9GGKc3xdsC+MN9y3tYu7Sgeol1X/Lsnggks=" + version = "v1.1.5" + hash = "sha256-nETSf8U75kLNXk82JdQaJz394z8cXMbpNYSm1KE03GA=" [mod."cloud.google.com/go/storage"] version = "v1.30.1" hash = "sha256-4lC0XaLSQDnVBmNLIauiWnGXq+Ax57r8fcMxXFMCCNE=" @@ -26,8 +26,8 @@ schema = 3 version = "v1.0.0-alpha.4" hash = "sha256-xpLH0K6ivQznFrLw2hmhWIIyYgqjstV47OhTEj/c1oQ=" [mod."cosmossdk.io/errors"] - version = "v1.0.0" - hash = "sha256-ZD1fhIefk3qkt9I4+ed9NBmBqTDvym9cXWmgFBh5qu0=" + version = "v1.0.1" + hash = "sha256-MgTocXkBzri9FKkNtkARJXPmxRrRO/diQJS5ZzvYrJY=" [mod."cosmossdk.io/log"] version = "v1.2.1" hash = "sha256-2Mb0jQ5Yvi+2fvhCVEiiacwODXM8+6vhsKOnHz+wsiY=" @@ -315,17 +315,17 @@ schema = 3 version = "v0.0.0-20230228050547-1710fef4ab10" hash = "sha256-ts+I48BUzyra4LFY+qc7I7uPliuMMAh1d1UfANDBqPo=" [mod."github.com/google/s2a-go"] - version = "v0.1.4" - hash = "sha256-amTAj6SNERMPxAA43KrzwYgu6GMooayfHCsdkoTI17c=" + version = "v0.1.7" + hash = "sha256-E+SX/3VmRI5qN7SbnRP4Tt+gQTq93pScpY9U2tTmIU0=" [mod."github.com/google/shlex"] version = "v0.0.0-20191202100458-e7afc7fbc510" hash = "sha256-1f392pCmS7AXVKXIC1SvKlYtK/rvW47F5CCkGT2G6JM=" [mod."github.com/google/uuid"] - version = "v1.3.1" - hash = "sha256-JxAEAB2bFlGPShFreyOWjUahjaGV3xYS5TpfUOikod0=" + version = "v1.4.0" + hash = "sha256-FU0gzLmS48Ik9T+quGg5z/7ESGMPSXM3SY+rdJtG+5w=" [mod."github.com/googleapis/enterprise-certificate-proxy"] - version = "v0.2.4" - hash = "sha256-4tXjS3R7qKlmA/UueJP7LFk0Tw4anuqKrEW/lnlOrY8=" + version = "v0.3.2" + hash = "sha256-wVuR3QC0mYFl5LNeKdRXdKdod7BGP5sv2h6VVib85v8=" [mod."github.com/googleapis/gax-go/v2"] version = "v2.12.0" hash = "sha256-ZcXS+1B11UaJHf8D15N3ZCh00fiMUncpHd+eNRffLZ4=" @@ -670,20 +670,20 @@ schema = 3 version = "v0.0.0-20220907171357-04be3eba64a2" hash = "sha256-6+zueutgefIYmgXinOflz8qGDDDj0Zhv+2OkGhBTKno=" [mod."google.golang.org/api"] - version = "v0.128.0" - hash = "sha256-yfyjrqpgemcsLSnVJwIGH17SJyo2jYyh5Ziyb08IN9s=" + version = "v0.149.0" + hash = "sha256-nR3mk7wAsjvMEGsOiPKvqQwt789m6a+BDThpfTx0doA=" [mod."google.golang.org/appengine"] version = "v1.6.8" hash = "sha256-decMa0MiWfW/Bzr8QPPzzpeya0YWGHhZAt4Cr/bD1wQ=" [mod."google.golang.org/genproto"] - version = "v0.0.0-20231002182017-d307bd883b97" - hash = "sha256-YsRyEjtF3D7NGg1Be6khztBgnQFfT1+SM7ro/luk9JI=" + version = "v0.0.0-20231211222908-989df2bf70f3" + hash = "sha256-7DvusxTmchjQbVzN4ph4p5EYvfQQwDg+lo9nk8qDwXY=" [mod."google.golang.org/genproto/googleapis/api"] - version = "v0.0.0-20231002182017-d307bd883b97" - hash = "sha256-zhjugz/BTV4l9UAKcWIK/Fh10RNS46VIrOqu+ULAitU=" + version = "v0.0.0-20231120223509-83a465c0220f" + hash = "sha256-hWz9HrHPPPmWxOZ+VdpayDHCN79UMxrnQ66wTDE1lvY=" [mod."google.golang.org/genproto/googleapis/rpc"] - version = "v0.0.0-20231002182017-d307bd883b97" - hash = "sha256-QnSDeqAVIouw9YoQ+AFpgkRcZqQqLuaeA0yKDThRugs=" + version = "v0.0.0-20231212172506-995d672761c0" + hash = "sha256-48aeFcLvuthyG7x9JmpeySrBkOqRhu+FgECjt1167IY=" [mod."google.golang.org/grpc"] version = "v1.60.1" hash = "sha256-JJ3X6DTUZWYtM8i8izWTH9nDvCydzea31iZt6ULDvsw=" From 72ec813d12a321ac1a1638e4f564c72192d2b02f Mon Sep 17 00:00:00 2001 From: Freddy Caceres Date: Tue, 16 Jan 2024 15:49:28 -0500 Subject: [PATCH 078/345] imp(ante): Refractor EVM ante tests and remove legacy handlers (#2147) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * imp(ante): Refractor EVM ante tests and remove legacy handlers * remove legacy decorator * factory interface * refractor test suite * fix import * fix lint * fix lint * get network chain config * update imports * imp(ante): Remove MempoolFee decorator and add tests (#2148) Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> * imp(ante): Remove legacy GlobalFee decorator and add tests (#2149) * imp(ante): Remove legacy GlobalFee decorator and add tests * remove old test * fix lint --------- Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> * imp(ante): Remove legazy IncrementSequence decorator and add tests (#2156) * imp(ante): Remove legacy IncrementSequence decorator and add tests * remove unused tests * remove unused tests * fix test regression * imp(ante): Remove old AccountVerification decorator and tests (#2150) * add account verification tests * remove legacy decorator * extend comment * fix lint * Update app/ante/evm/06_account_verification.go Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> * Update app/ante/evm/06_account_verification.go Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> * txdata method on args * fix format * refractor tests --------- Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> * imp(ante): Remove legacy CanTransfer decorator and update tests (#2151) * add can transfer test and decorator * check error * add error type check * imp(ante): Update vesting decorator tests (#2153) * fix lint * remove neede for funding accounts * Update app/ante/evm/08_vesting.go Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> * Update app/ante/evm/08_vesting.go Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> --------- Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> * format * imp(ante): ValidateMsg refractor and remove legacy decorator (#2166) * imp(ante): ValidateMsg refractor and remove legacy decorator * re organize txs * simplify function * imp(ante): Remove legacy GasWanted decorator and refractor tests (#2187) * imp(ante): Remove legacy GasWanted decorator and refractor tests * fix test * fix lintg * imp(ante): Remove legacy GasConsume decorator and add tests (#2216) * imp(ante): Remove legacy GasConsume and tests * deductFees test * checkpoint * rename function * remove comments * remove unused test file and update benchmark test * fix lint * make txType name a util function within EVM --------- Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> --- app/ante/evm.go | 22 - app/ante/evm/02_mempool_fee.go | 60 -- app/ante/evm/02_mempool_fee_test.go | 65 ++ app/ante/evm/03_global_fee.go | 60 -- app/ante/evm/03_global_fee_test.go | 60 ++ app/ante/evm/04_validate.go | 140 ++-- app/ante/evm/04_validate_test.go | 216 ++++++ app/ante/evm/06_account_verification.go | 47 +- app/ante/evm/06_account_verification_test.go | 137 ++++ app/ante/evm/07_can_transfer.go | 52 -- app/ante/evm/07_can_transfer_test.go | 105 +++ app/ante/evm/08_vesting.go | 19 +- app/ante/evm/08_vesting_test.go | 236 ++++++ app/ante/evm/09_gas_consume.go | 248 +++---- app/ante/evm/09_gas_consume_test.go | 194 +++++ app/ante/evm/10_incremenet_sequence_test.go | 72 ++ app/ante/evm/10_increment_sequence.go | 41 -- app/ante/evm/11_gas_wanted_test.go | 120 +++ app/ante/evm/ante_test.go | 2 + app/ante/evm/eth_benchmark_test.go | 23 +- app/ante/evm/eth_test.go | 682 ------------------ app/ante/evm/fees_test.go | 268 ------- app/ante/evm/mono.go | 120 ++- app/ante/evm/suite_test.go | 30 + app/ante/evm/utils_test.go | 19 - app/ante/evm/vesting_test.go | 129 ---- testutil/integration/common/grpc/bank.go | 10 +- testutil/integration/common/grpc/grpc.go | 1 + .../integration/common/network/network.go | 7 - .../integration/evmos/factory/broadcast.go | 111 +++ testutil/integration/evmos/factory/build.go | 78 ++ testutil/integration/evmos/factory/factory.go | 190 +---- testutil/integration/evmos/factory/helpers.go | 46 +- testutil/integration/evmos/factory/sign.go | 22 + testutil/integration/evmos/grpc/feemarket.go | 6 + testutil/integration/evmos/grpc/grpc.go | 1 + testutil/integration/evmos/network/abci.go | 1 - testutil/integration/evmos/network/fund.go | 27 - testutil/integration/evmos/network/network.go | 9 + testutil/integration/evmos/network/params.go | 5 + .../integration/evmos/network/unit_network.go | 13 + x/evm/types/tx.go | 6 + x/evm/types/tx_types.go | 20 + 43 files changed, 1810 insertions(+), 1910 deletions(-) create mode 100644 app/ante/evm/02_mempool_fee_test.go create mode 100644 app/ante/evm/03_global_fee_test.go create mode 100644 app/ante/evm/04_validate_test.go create mode 100644 app/ante/evm/06_account_verification_test.go create mode 100644 app/ante/evm/07_can_transfer_test.go create mode 100644 app/ante/evm/08_vesting_test.go create mode 100644 app/ante/evm/09_gas_consume_test.go create mode 100644 app/ante/evm/10_incremenet_sequence_test.go create mode 100644 app/ante/evm/11_gas_wanted_test.go delete mode 100644 app/ante/evm/eth_test.go delete mode 100644 app/ante/evm/fees_test.go create mode 100644 app/ante/evm/suite_test.go delete mode 100644 app/ante/evm/vesting_test.go create mode 100644 testutil/integration/evmos/factory/broadcast.go create mode 100644 testutil/integration/evmos/factory/build.go create mode 100644 testutil/integration/evmos/factory/sign.go delete mode 100644 testutil/integration/evmos/network/fund.go create mode 100644 x/evm/types/tx_types.go diff --git a/app/ante/evm.go b/app/ante/evm.go index 73825aff86..8c8944dd18 100644 --- a/app/ante/evm.go +++ b/app/ante/evm.go @@ -21,25 +21,3 @@ func newMonoEVMAnteHandler(options HandlerOptions) sdk.AnteHandler { ), ) } - -// newEVMAnteHandler creates the default ante handler for Ethereum transactions -func newEVMAnteHandler(options HandlerOptions) sdk.AnteHandler { //nolint: unused - return sdk.ChainAnteDecorators( - // outermost AnteDecorator. SetUpContext must be called first - evmante.NewEthSetUpContextDecorator(options.EvmKeeper), - // Check eth effective gas price against the node's minimal-gas-prices config - evmante.NewEthMempoolFeeDecorator(options.EvmKeeper), - // Check eth effective gas price against the global MinGasPrice - evmante.NewEthMinGasPriceDecorator(options.FeeMarketKeeper, options.EvmKeeper), - evmante.NewEthValidateBasicDecorator(options.EvmKeeper), - evmante.NewEthSigVerificationDecorator(options.EvmKeeper), - evmante.NewEthAccountVerificationDecorator(options.AccountKeeper, options.EvmKeeper), - evmante.NewCanTransferDecorator(options.EvmKeeper), - evmante.NewEthVestingTransactionDecorator(options.AccountKeeper, options.BankKeeper, options.EvmKeeper), - evmante.NewEthGasConsumeDecorator(options.BankKeeper, options.DistributionKeeper, options.EvmKeeper, options.StakingKeeper, options.MaxTxGasWanted), - evmante.NewEthIncrementSenderSequenceDecorator(options.AccountKeeper), - evmante.NewGasWantedDecorator(options.EvmKeeper, options.FeeMarketKeeper), - // emit eth tx hash and index at the very last ante handler. - evmante.NewEthEmitEventDecorator(options.EvmKeeper), - ) -} diff --git a/app/ante/evm/02_mempool_fee.go b/app/ante/evm/02_mempool_fee.go index fd2418f923..c24d163769 100644 --- a/app/ante/evm/02_mempool_fee.go +++ b/app/ante/evm/02_mempool_fee.go @@ -3,71 +3,11 @@ package evm import ( - "math/big" - errorsmod "cosmossdk.io/errors" sdkmath "cosmossdk.io/math" - sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" ) -// EthMempoolFeeDecorator will check if the transaction's effective fee is at least as large -// as the local validator's minimum gasFee (defined in validator config). -// If fee is too low, decorator returns error and tx is rejected from mempool. -// Note this only applies when ctx.CheckTx = true -// If fee is high enough or not CheckTx, then call next AnteHandler -// CONTRACT: Tx must implement FeeTx to use MempoolFeeDecorator -type EthMempoolFeeDecorator struct { - evmKeeper EVMKeeper -} - -// NewEthMempoolFeeDecorator creates a new NewEthMempoolFeeDecorator instance used only for -// Ethereum transactions. -func NewEthMempoolFeeDecorator(ek EVMKeeper) EthMempoolFeeDecorator { - return EthMempoolFeeDecorator{ - evmKeeper: ek, - } -} - -// AnteHandle ensures that the provided fees meet a minimum threshold for the validator. -// This check only for local mempool purposes, and thus it is only run on (Re)CheckTx. -// The logic is also skipped if the London hard fork and EIP-1559 are enabled. -func (mfd EthMempoolFeeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler) (newCtx sdk.Context, err error) { - if !ctx.IsCheckTx() || simulate { - return next(ctx, tx, simulate) - } - - evmParams := mfd.evmKeeper.GetParams(ctx) - chainCfg := evmParams.GetChainConfig() - ethCfg := chainCfg.EthereumConfig(mfd.evmKeeper.ChainID()) - isLondon := ethCfg.IsLondon(big.NewInt(ctx.BlockHeight())) - - // skip check as the London hard fork and EIP-1559 are enabled - if isLondon { - return next(ctx, tx, simulate) - } - - evmDenom := evmParams.GetEvmDenom() - minGasPrice := ctx.MinGasPrices().AmountOf(evmDenom) - - for _, msg := range tx.GetMsgs() { - _, txData, _, err := evmtypes.UnpackEthMsg(msg) - if err != nil { - return ctx, err - } - - gasLimit := sdkmath.LegacyNewDecFromBigInt(new(big.Int).SetUint64(txData.GetGas())) - fee := sdkmath.LegacyNewDecFromBigInt(txData.Fee()) - - if err := CheckMempoolFee(fee, minGasPrice, gasLimit, isLondon); err != nil { - return ctx, err - } - } - - return next(ctx, tx, simulate) -} - // CheckMempoolFee checks if the provided fee is at least as large as the local validator's func CheckMempoolFee(fee, mempoolMinGasPrice, gasLimit sdkmath.LegacyDec, isLondon bool) error { if isLondon { diff --git a/app/ante/evm/02_mempool_fee_test.go b/app/ante/evm/02_mempool_fee_test.go new file mode 100644 index 0000000000..558b06d9d2 --- /dev/null +++ b/app/ante/evm/02_mempool_fee_test.go @@ -0,0 +1,65 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) +package evm_test + +import ( + sdkmath "cosmossdk.io/math" + errortypes "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/evmos/evmos/v16/app/ante/evm" +) + +func (suite *EvmAnteTestSuite) TestMempoolFee() { + testCases := []struct { + name string + expectedError error + isLondon bool + txFee sdkmath.LegacyDec + minGasPrice sdkmath.LegacyDec + gasLimit sdkmath.LegacyDec + }{ + { + name: "success: if London fork is enabled, skip check", + expectedError: nil, + isLondon: true, + // values are not used because isLondon is true + txFee: sdkmath.LegacyOneDec(), + minGasPrice: sdkmath.LegacyOneDec(), + gasLimit: sdkmath.LegacyOneDec(), + }, + { + name: "success: fee is greater than min gas price * gas limit", + expectedError: nil, + isLondon: false, + txFee: sdkmath.LegacyNewDec(100), + minGasPrice: sdkmath.LegacyOneDec(), + gasLimit: sdkmath.LegacyOneDec(), + }, + { + name: "fail: fee is less than min gas price * gas limit", + expectedError: errortypes.ErrInsufficientFee, + isLondon: false, + txFee: sdkmath.LegacyOneDec(), + minGasPrice: sdkmath.LegacyNewDec(100), + gasLimit: sdkmath.LegacyOneDec(), + }, + } + + for _, tc := range testCases { + suite.Run(tc.name, func() { + // Function under test + err := evm.CheckMempoolFee( + tc.txFee, + tc.minGasPrice, + tc.gasLimit, + tc.isLondon, + ) + + if tc.expectedError != nil { + suite.Require().Error(err) + suite.Contains(err.Error(), tc.expectedError.Error()) + } else { + suite.Require().NoError(err) + } + }) + } +} diff --git a/app/ante/evm/03_global_fee.go b/app/ante/evm/03_global_fee.go index 65731480d4..d588e52aba 100644 --- a/app/ante/evm/03_global_fee.go +++ b/app/ante/evm/03_global_fee.go @@ -3,71 +3,11 @@ package evm import ( - "math/big" - errorsmod "cosmossdk.io/errors" "cosmossdk.io/math" - sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" - - ethtypes "github.com/ethereum/go-ethereum/core/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" ) -// EthMinGasPriceDecorator will check if the transaction's fee is at least as large -// as the MinGasPrices param. If fee is too low, decorator returns error and tx -// is rejected. This applies to both CheckTx and DeliverTx and regardless -// if London hard fork or fee market params (EIP-1559) are enabled. -// If fee is high enough, then call next AnteHandler -type EthMinGasPriceDecorator struct { - feesKeeper FeeMarketKeeper - evmKeeper EVMKeeper -} - -// NewEthMinGasPriceDecorator creates a new MinGasPriceDecorator instance used only for -// Ethereum transactions. -func NewEthMinGasPriceDecorator(fk FeeMarketKeeper, ek EVMKeeper) EthMinGasPriceDecorator { - return EthMinGasPriceDecorator{feesKeeper: fk, evmKeeper: ek} -} - -// AnteHandle ensures that the effective fee from the transaction is greater than the -// minimum global fee, which is defined by the MinGasPrice (parameter) * GasLimit (tx argument). -func (empd EthMinGasPriceDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler) (newCtx sdk.Context, err error) { - minGasPrice := empd.feesKeeper.GetParams(ctx).MinGasPrice - - // short-circuit if min gas price is 0 - if minGasPrice.IsZero() { - return next(ctx, tx, simulate) - } - - evmParams := empd.evmKeeper.GetParams(ctx) - chainCfg := evmParams.GetChainConfig() - ethCfg := chainCfg.EthereumConfig(empd.evmKeeper.ChainID()) - baseFee := empd.evmKeeper.GetBaseFee(ctx, ethCfg) - - for _, msg := range tx.GetMsgs() { - _, txData, _, err := evmtypes.UnpackEthMsg(msg) - if err != nil { - return ctx, err - } - - feeAmt := txData.Fee() - - if txData.TxType() != ethtypes.LegacyTxType { - feeAmt = txData.EffectiveFee(baseFee) - } - - gasLimit := math.LegacyNewDecFromBigInt(new(big.Int).SetUint64(txData.GetGas())) - fee := math.LegacyNewDecFromBigInt(feeAmt) - - if err := CheckGlobalFee(fee, minGasPrice, gasLimit); err != nil { - return ctx, err - } - } - - return next(ctx, tx, simulate) -} - // For dynamic transactions, GetFee() uses the GasFeeCap value, which // is the maximum gas price that the signer can pay. In practice, the // signer can pay less, if the block's BaseFee is lower. So, in this case, diff --git a/app/ante/evm/03_global_fee_test.go b/app/ante/evm/03_global_fee_test.go new file mode 100644 index 0000000000..1e6aa544e7 --- /dev/null +++ b/app/ante/evm/03_global_fee_test.go @@ -0,0 +1,60 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) +package evm_test + +import ( + sdkmath "cosmossdk.io/math" + errortypes "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/evmos/evmos/v16/app/ante/evm" +) + +func (suite *EvmAnteTestSuite) TestGlobalFee() { + testCases := []struct { + name string + expectedError error + txFee sdkmath.LegacyDec + globalMinGasPrice sdkmath.LegacyDec + gasLimit sdkmath.LegacyDec + }{ + { + name: "success: if globalMinGasPrice is 0, skip check", + expectedError: nil, + // values are not used because isLondon is true + txFee: sdkmath.LegacyOneDec(), + globalMinGasPrice: sdkmath.LegacyZeroDec(), + gasLimit: sdkmath.LegacyOneDec(), + }, + { + name: "success: fee is greater than global gas price * gas limit", + expectedError: nil, + txFee: sdkmath.LegacyNewDec(100), + globalMinGasPrice: sdkmath.LegacyOneDec(), + gasLimit: sdkmath.LegacyOneDec(), + }, + { + name: "fail: fee is less than global gas price * gas limit", + expectedError: errortypes.ErrInsufficientFee, + txFee: sdkmath.LegacyOneDec(), + globalMinGasPrice: sdkmath.LegacyNewDec(100), + gasLimit: sdkmath.LegacyOneDec(), + }, + } + + for _, tc := range testCases { + suite.Run(tc.name, func() { + // Function under test + err := evm.CheckGlobalFee( + tc.txFee, + tc.globalMinGasPrice, + tc.gasLimit, + ) + + if tc.expectedError != nil { + suite.Require().Error(err) + suite.Contains(err.Error(), tc.expectedError.Error()) + } else { + suite.Require().NoError(err) + } + }) + } +} diff --git a/app/ante/evm/04_validate.go b/app/ante/evm/04_validate.go index 1e1d37aff6..569b3646ec 100644 --- a/app/ante/evm/04_validate.go +++ b/app/ante/evm/04_validate.go @@ -4,123 +4,71 @@ package evm import ( "errors" - "math/big" errorsmod "cosmossdk.io/errors" - sdkmath "cosmossdk.io/math" - sdk "github.com/cosmos/cosmos-sdk/types" + sdktypes "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/types/tx" - "github.com/ethereum/go-ethereum/common" - ethtypes "github.com/ethereum/go-ethereum/core/types" evmtypes "github.com/evmos/evmos/v16/x/evm/types" ) -// EthValidateBasicDecorator is adapted from ValidateBasicDecorator from cosmos-sdk, it ignores ErrNoSignatures -type EthValidateBasicDecorator struct { - evmKeeper EVMKeeper -} - -// NewEthValidateBasicDecorator creates a new EthValidateBasicDecorator -func NewEthValidateBasicDecorator(ek EVMKeeper) EthValidateBasicDecorator { - return EthValidateBasicDecorator{ - evmKeeper: ek, - } -} - -// AnteHandle handles basic validation of tx -func (vbd EthValidateBasicDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler) (sdk.Context, error) { - // no need to validate basic on recheck tx, call next antehandler - if ctx.IsReCheckTx() { - return next(ctx, tx, simulate) - } - - txFeeInfo, err := ValidateTx(tx) +// ValidateMsg validates an Ethereum specific message type and returns an error if invalid +// It checks for the following conditions: +// - If the from address is not empty +// - If the transaction is a contract creation or call and it is disabled through governance +func ValidateMsg( + evmParams evmtypes.Params, + txData evmtypes.TxData, + from sdktypes.AccAddress, +) error { + err := checkValidFrom(from) if err != nil { - return ctx, err - } - - txFee := sdk.Coins{} - txGasLimit := uint64(0) - - evmParams := vbd.evmKeeper.GetParams(ctx) - chainCfg := evmParams.GetChainConfig() - chainID := vbd.evmKeeper.ChainID() - ethCfg := chainCfg.EthereumConfig(chainID) - baseFee := vbd.evmKeeper.GetBaseFee(ctx, ethCfg) - enableCreate := evmParams.GetEnableCreate() - enableCall := evmParams.GetEnableCall() - evmDenom := evmParams.GetEvmDenom() - - for _, msg := range tx.GetMsgs() { - _, txData, from, err := evmtypes.UnpackEthMsg(msg) - if err != nil { - return ctx, err - } - - txFee, txGasLimit, err = CheckDisabledCreateCallAndUpdateTxFee( - txData.GetTo(), - from, - txGasLimit, - txData.GetGas(), - enableCreate, - enableCall, - baseFee, - txData.Fee(), - txData.TxType(), - evmDenom, - txFee, - ) - if err != nil { - return ctx, err - } - } - - if err := CheckTxFee(txFeeInfo, txFee, txGasLimit); err != nil { - return ctx, err + return err } - - return next(ctx, tx, simulate) + return checkDisabledCreateCall( + txData, + evmParams.EnableCreate, + evmParams.EnableCall, + ) } -// FIXME: split this function into multiple ones -// CheckDisabledCreateCallAndUpdateTxFee checks if contract creation or call are disabled through governance -// and updates the transaction fee by adding the message fee to the cumulative transaction fee -func CheckDisabledCreateCallAndUpdateTxFee( - to *common.Address, - from sdk.AccAddress, - txGasLimit, gasLimit uint64, - enableCreate, enableCall bool, - baseFee *big.Int, - msgFee *big.Int, - txType byte, - denom string, - txFee sdk.Coins, -) (sdk.Coins, uint64, error) { - // Validate `From` field - if from != nil { - return nil, 0, errorsmod.Wrapf(errortypes.ErrInvalidRequest, "invalid from address %s, expect empty string", from) +// checkDisabledCreateCall checks if the transaction is a contract creation or call +// and it is disabled through governance +func checkDisabledCreateCall( + txData evmtypes.TxData, + enableCreate, + enableCall bool, +) error { + to := txData.GetTo() + data := txData.GetData() + // If its not a contract creation or contract call this check is irrelevant + if data == nil { + return nil } - txGasLimit += gasLimit - // return error if contract creation or call are disabled through governance + // and the transaction is trying to create a contract or call a contract if !enableCreate && to == nil { - return nil, 0, errorsmod.Wrap(evmtypes.ErrCreateDisabled, "failed to create new contract") + return errorsmod.Wrap(evmtypes.ErrCreateDisabled, "failed to create new contract") } else if !enableCall && to != nil { - return nil, 0, errorsmod.Wrap(evmtypes.ErrCallDisabled, "failed to call contract") + return errorsmod.Wrap(evmtypes.ErrCallDisabled, "failed to call contract") } + return nil +} - if baseFee == nil && txType == ethtypes.DynamicFeeTxType { - return nil, 0, errorsmod.Wrap(ethtypes.ErrTxTypeNotSupported, "dynamic fee tx not supported") +// checkValidFrom checks if the from address is empty +func checkValidFrom( + from sdktypes.AccAddress, +) error { + // Validate `From` field + if from != nil { + return errorsmod.Wrapf(errortypes.ErrInvalidRequest, "invalid from address %s, expect empty string", from) } - - txFee = txFee.Add(sdk.Coin{Denom: denom, Amount: sdkmath.NewIntFromBigInt(msgFee)}) - return txFee, txGasLimit, nil + return nil } // FIXME: this shouldn't be required if the tx was an Ethereum transaction type -func ValidateTx(tx sdk.Tx) (*tx.Fee, error) { +func ValidateTx(tx sdktypes.Tx) (*tx.Fee, error) { err := tx.ValidateBasic() // ErrNoSignatures is fine with eth tx if err != nil && !errors.Is(err, errortypes.ErrNoSignatures) { @@ -162,7 +110,7 @@ func ValidateTx(tx sdk.Tx) (*tx.Fee, error) { return authInfo.Fee, nil } -func CheckTxFee(txFeeInfo *tx.Fee, txFee sdk.Coins, txGasLimit uint64) error { +func CheckTxFee(txFeeInfo *tx.Fee, txFee sdktypes.Coins, txGasLimit uint64) error { if txFeeInfo == nil { return nil } diff --git a/app/ante/evm/04_validate_test.go b/app/ante/evm/04_validate_test.go new file mode 100644 index 0000000000..f60f4be802 --- /dev/null +++ b/app/ante/evm/04_validate_test.go @@ -0,0 +1,216 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) +package evm_test + +import ( + "math/big" + + sdktypes "github.com/cosmos/cosmos-sdk/types" + errortypes "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/ethereum/go-ethereum/common" + "github.com/evmos/evmos/v16/app/ante/evm" + testkeyring "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" + evmtypes "github.com/evmos/evmos/v16/x/evm/types" +) + +type validateMsgParams struct { + evmParams evmtypes.Params + from sdktypes.AccAddress + txData evmtypes.TxData +} + +func (suite *EvmAnteTestSuite) TestValidateMsg() { + keyring := testkeyring.New(2) + + testCases := []struct { + name string + expectedError error + getFunctionParams func() validateMsgParams + }{ + { + name: "fail: invalid from address, should be nil", + expectedError: errortypes.ErrInvalidRequest, + getFunctionParams: func() validateMsgParams { + return validateMsgParams{ + evmParams: evmtypes.DefaultParams(), + txData: nil, + from: keyring.GetAccAddr(0), + } + }, + }, + { + name: "success: transfer with default params", + expectedError: nil, + getFunctionParams: func() validateMsgParams { + txArgs := getTxByType("transfer", keyring.GetAddr(1)) + txData, err := txArgs.ToTxData() + suite.Require().NoError(err) + return validateMsgParams{ + evmParams: evmtypes.DefaultParams(), + txData: txData, + from: nil, + } + }, + }, + { + name: "success: transfer with disable call and create", + expectedError: nil, + getFunctionParams: func() validateMsgParams { + txArgs := getTxByType("transfer", keyring.GetAddr(1)) + txData, err := txArgs.ToTxData() + suite.Require().NoError(err) + + params := evmtypes.DefaultParams() + params.EnableCall = false + params.EnableCreate = false + + return validateMsgParams{ + evmParams: params, + txData: txData, + from: nil, + } + }, + }, + { + name: "success: call with default params", + expectedError: nil, + getFunctionParams: func() validateMsgParams { + txArgs := getTxByType("call", keyring.GetAddr(1)) + txData, err := txArgs.ToTxData() + suite.Require().NoError(err) + return validateMsgParams{ + evmParams: evmtypes.DefaultParams(), + txData: txData, + from: nil, + } + }, + }, + { + name: "success: call tx with disabled create", + expectedError: nil, + getFunctionParams: func() validateMsgParams { + txArgs := getTxByType("call", keyring.GetAddr(1)) + txData, err := txArgs.ToTxData() + suite.Require().NoError(err) + + params := evmtypes.DefaultParams() + params.EnableCreate = false + + return validateMsgParams{ + evmParams: params, + txData: txData, + from: nil, + } + }, + }, + { + name: "fail: call tx with disabled call", + expectedError: evmtypes.ErrCallDisabled, + getFunctionParams: func() validateMsgParams { + txArgs := getTxByType("call", keyring.GetAddr(1)) + txData, err := txArgs.ToTxData() + suite.Require().NoError(err) + + params := evmtypes.DefaultParams() + params.EnableCall = false + + return validateMsgParams{ + evmParams: params, + txData: txData, + from: nil, + } + }, + }, + { + name: "success: create with default params", + expectedError: nil, + getFunctionParams: func() validateMsgParams { + txArgs := getTxByType("create", keyring.GetAddr(1)) + txData, err := txArgs.ToTxData() + suite.Require().NoError(err) + return validateMsgParams{ + evmParams: evmtypes.DefaultParams(), + txData: txData, + from: nil, + } + }, + }, + { + name: "success: create with disable call", + expectedError: nil, + getFunctionParams: func() validateMsgParams { + txArgs := getTxByType("create", keyring.GetAddr(1)) + txData, err := txArgs.ToTxData() + suite.Require().NoError(err) + + params := evmtypes.DefaultParams() + params.EnableCall = false + + return validateMsgParams{ + evmParams: params, + txData: txData, + from: nil, + } + }, + }, + { + name: "fail: create with disable create", + expectedError: evmtypes.ErrCreateDisabled, + getFunctionParams: func() validateMsgParams { + txArgs := getTxByType("create", keyring.GetAddr(1)) + txData, err := txArgs.ToTxData() + suite.Require().NoError(err) + + params := evmtypes.DefaultParams() + params.EnableCreate = false + + return validateMsgParams{ + evmParams: params, + txData: txData, + from: nil, + } + }, + }, + } + + for _, tc := range testCases { + suite.Run(tc.name, func() { + params := tc.getFunctionParams() + + // Function under test + err := evm.ValidateMsg( + params.evmParams, + params.txData, + params.from, + ) + + if tc.expectedError != nil { + suite.Require().Error(err) + suite.Contains(err.Error(), tc.expectedError.Error()) + } else { + suite.Require().NoError(err) + } + }) + } +} + +func getTxByType(typeTx string, recipient common.Address) evmtypes.EvmTxArgs { + switch typeTx { + case "call": + return evmtypes.EvmTxArgs{ + To: &recipient, + Input: []byte("call bytes"), + } + case "create": + return evmtypes.EvmTxArgs{ + Input: []byte("create bytes"), + } + case "transfer": + return evmtypes.EvmTxArgs{ + To: &recipient, + Amount: big.NewInt(100), + } + default: + panic("invalid type") + } +} diff --git a/app/ante/evm/06_account_verification.go b/app/ante/evm/06_account_verification.go index f779339977..af9671e24a 100644 --- a/app/ante/evm/06_account_verification.go +++ b/app/ante/evm/06_account_verification.go @@ -13,52 +13,11 @@ import ( evmtypes "github.com/evmos/evmos/v16/x/evm/types" ) -// EthAccountVerificationDecorator validates an account balance checks -type EthAccountVerificationDecorator struct { - ak evmtypes.AccountKeeper - evmKeeper EVMKeeper -} - -// NewEthAccountVerificationDecorator creates a new EthAccountVerificationDecorator -func NewEthAccountVerificationDecorator(ak evmtypes.AccountKeeper, ek EVMKeeper) EthAccountVerificationDecorator { - return EthAccountVerificationDecorator{ - ak: ak, - evmKeeper: ek, - } -} - -// AnteHandle validates checks that the sender balance is greater than the total transaction cost. +// VerifyAccountBalance checks that the account balance is greater than the total transaction cost. // The account will be set to store if it doesn't exist, i.e. cannot be found on store. -// This AnteHandler decorator will fail if: -// - any of the msgs is not a MsgEthereumTx -// - from address is empty +// This method will fail if: +// - from address is NOT an EOA // - account balance is lower than the transaction cost -func (avd EthAccountVerificationDecorator) AnteHandle( - ctx sdk.Context, - tx sdk.Tx, - simulate bool, - next sdk.AnteHandler, -) (newCtx sdk.Context, err error) { - if !ctx.IsCheckTx() { - return next(ctx, tx, simulate) - } - - for _, msg := range tx.GetMsgs() { - _, txData, from, err := evmtypes.UnpackEthMsg(msg) - if err != nil { - return ctx, err - } - - fromAddr := common.BytesToAddress(from) - account := avd.evmKeeper.GetAccount(ctx, fromAddr) - if err := VerifyAccountBalance(ctx, avd.ak, account, fromAddr, txData); err != nil { - return ctx, err - } - } - return next(ctx, tx, simulate) -} - -// VerifyAccountBalance checks that the sender balance is greater than the total transaction cost. func VerifyAccountBalance( ctx sdk.Context, accountKeeper evmtypes.AccountKeeper, diff --git a/app/ante/evm/06_account_verification_test.go b/app/ante/evm/06_account_verification_test.go new file mode 100644 index 0000000000..f664ddcc8e --- /dev/null +++ b/app/ante/evm/06_account_verification_test.go @@ -0,0 +1,137 @@ +package evm_test + +import ( + "fmt" + "math/big" + + "cosmossdk.io/math" + errortypes "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/ethereum/go-ethereum/common" + "github.com/evmos/evmos/v16/app/ante/evm" + "github.com/evmos/evmos/v16/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v16/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v16/testutil/integration/evmos/network" + "github.com/evmos/evmos/v16/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v16/x/evm/types" +) + +func (suite *EvmAnteTestSuite) TestVerifyAccountBalance() { + // Setup + keyring := testkeyring.New(2) + unitNetwork := network.NewUnitTestNetwork( + network.WithPreFundedAccounts(keyring.GetAllAccAddrs()...), + ) + grpcHandler := grpc.NewIntegrationHandler(unitNetwork) + txFactory := factory.New(unitNetwork, grpcHandler) + senderKey := keyring.GetKey(1) + + testCases := []struct { + name string + expectedError error + generateAccountAndArgs func() (*statedb.Account, evmtypes.EvmTxArgs) + }{ + { + name: "fail: sender is not EOA", + expectedError: errortypes.ErrInvalidType, + generateAccountAndArgs: func() (*statedb.Account, evmtypes.EvmTxArgs) { + statedbAccount := getDefaultStateDBAccount(unitNetwork, senderKey.Addr) + txArgs, err := txFactory.GenerateDefaultTxTypeArgs(senderKey.Addr, suite.ethTxType) + suite.Require().NoError(err) + + statedbAccount.CodeHash = []byte("test") + suite.Require().NoError(err) + return statedbAccount, txArgs + }, + }, + { + name: "fail: sender balance is lower than the transaction cost", + expectedError: errortypes.ErrInsufficientFunds, + generateAccountAndArgs: func() (*statedb.Account, evmtypes.EvmTxArgs) { + statedbAccount := getDefaultStateDBAccount(unitNetwork, senderKey.Addr) + txArgs, err := txFactory.GenerateDefaultTxTypeArgs(senderKey.Addr, suite.ethTxType) + suite.Require().NoError(err) + + // Make tx cost greater than balance + balanceResp, err := grpcHandler.GetBalance(senderKey.AccAddr, unitNetwork.GetDenom()) + suite.Require().NoError(err) + + invalidaAmount := balanceResp.Balance.Amount.Add(math.NewInt(100)) + txArgs.Amount = invalidaAmount.BigInt() + return statedbAccount, txArgs + }, + }, + { + name: "fail: tx cost is negative", + expectedError: errortypes.ErrInvalidCoins, + generateAccountAndArgs: func() (*statedb.Account, evmtypes.EvmTxArgs) { + statedbAccount := getDefaultStateDBAccount(unitNetwork, senderKey.Addr) + txArgs, err := txFactory.GenerateDefaultTxTypeArgs(senderKey.Addr, suite.ethTxType) + suite.Require().NoError(err) + + // Make tx cost is negative. This has to be a big value because the + // it has to be bigger than the fee for the full cost to be negative + invalidaAmount := big.NewInt(-1e18) + txArgs.Amount = invalidaAmount + return statedbAccount, txArgs + }, + }, + { + name: "success: tx is succesfull and account is created if its nil", + expectedError: errortypes.ErrInsufficientFunds, + generateAccountAndArgs: func() (*statedb.Account, evmtypes.EvmTxArgs) { + txArgs, err := txFactory.GenerateDefaultTxTypeArgs(senderKey.Addr, suite.ethTxType) + suite.Require().NoError(err) + return nil, txArgs + }, + }, + { + name: "success: tx is succesfull if account is EOA and exists", + expectedError: nil, + generateAccountAndArgs: func() (*statedb.Account, evmtypes.EvmTxArgs) { + statedbAccount := getDefaultStateDBAccount(unitNetwork, senderKey.Addr) + txArgs, err := txFactory.GenerateDefaultTxTypeArgs(senderKey.Addr, suite.ethTxType) + suite.Require().NoError(err) + return statedbAccount, txArgs + }, + }, + } + + for _, tc := range testCases { + suite.Run(fmt.Sprintf("%v_%v", evmtypes.GetTxTypeName(suite.ethTxType), tc.name), func() { + // Perform test logic + statedbAccount, txArgs := tc.generateAccountAndArgs() + txData, err := txArgs.ToTxData() + suite.Require().NoError(err) + + // Function to be tested + err = evm.VerifyAccountBalance( + unitNetwork.GetContext(), + unitNetwork.App.AccountKeeper, + statedbAccount, + senderKey.Addr, + txData, + ) + + if tc.expectedError != nil { + suite.Require().Error(err) + suite.Contains(err.Error(), tc.expectedError.Error()) + } else { + suite.Require().NoError(err) + } + // Make sure the account is created either wa + acc, err := grpcHandler.GetAccount(senderKey.AccAddr.String()) + suite.Require().NoError(err) + suite.Require().NotEmpty(acc) + + // Clean block for next test + err = unitNetwork.NextBlock() + suite.Require().NoError(err) + }) + } +} + +func getDefaultStateDBAccount(unitNetwork *network.UnitTestNetwork, addr common.Address) *statedb.Account { + statedb := unitNetwork.GetStateDB() + return statedb.Keeper().GetAccount(unitNetwork.GetContext(), addr) +} diff --git a/app/ante/evm/07_can_transfer.go b/app/ante/evm/07_can_transfer.go index 3749af59fc..c5e2ab3251 100644 --- a/app/ante/evm/07_can_transfer.go +++ b/app/ante/evm/07_can_transfer.go @@ -10,63 +10,11 @@ import ( errortypes "github.com/cosmos/cosmos-sdk/types/errors" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" - ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/params" "github.com/evmos/evmos/v16/x/evm/statedb" evmtypes "github.com/evmos/evmos/v16/x/evm/types" ) -// CanTransferDecorator checks if the sender is allowed to transfer funds according to the EVM block -// context rules. -type CanTransferDecorator struct { - evmKeeper EVMKeeper -} - -// NewCanTransferDecorator creates a new CanTransferDecorator instance. -func NewCanTransferDecorator(evmKeeper EVMKeeper) CanTransferDecorator { - return CanTransferDecorator{ - evmKeeper: evmKeeper, - } -} - -// AnteHandle creates an EVM from the message and calls the BlockContext CanTransfer function to -// see if the address can execute the transaction. -func (ctd CanTransferDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler) (sdk.Context, error) { - params := ctd.evmKeeper.GetParams(ctx) - ethCfg := params.ChainConfig.EthereumConfig(ctd.evmKeeper.ChainID()) - signer := ethtypes.MakeSigner(ethCfg, big.NewInt(ctx.BlockHeight())) - baseFee := ctd.evmKeeper.GetBaseFee(ctx, ethCfg) - isLondon := evmtypes.IsLondon(ethCfg, ctx.BlockHeight()) - - if isLondon && baseFee == nil { - return ctx, errorsmod.Wrap( - evmtypes.ErrInvalidBaseFee, - "base fee is supported but evm block context value is nil", - ) - } - - for _, msg := range tx.GetMsgs() { - msgEthTx, ok := msg.(*evmtypes.MsgEthereumTx) - if !ok { - return ctx, errorsmod.Wrapf(errortypes.ErrUnknownRequest, "invalid message type %T, expected %T", msg, (*evmtypes.MsgEthereumTx)(nil)) - } - - coreMsg, err := msgEthTx.AsMessage(signer, baseFee) - if err != nil { - return ctx, errorsmod.Wrapf( - err, - "failed to create an ethereum core.Message from signer %T", signer, - ) - } - - if err := CanTransfer(ctx, ctd.evmKeeper, coreMsg, baseFee, ethCfg, params, isLondon); err != nil { - return ctx, err - } - } - - return next(ctx, tx, simulate) -} - // CanTransfer checks if the sender is allowed to transfer funds according to the EVM block func CanTransfer( ctx sdk.Context, diff --git a/app/ante/evm/07_can_transfer_test.go b/app/ante/evm/07_can_transfer_test.go new file mode 100644 index 0000000000..fe0b91e2e3 --- /dev/null +++ b/app/ante/evm/07_can_transfer_test.go @@ -0,0 +1,105 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) +package evm_test + +import ( + "fmt" + "math/big" + + "cosmossdk.io/math" + errortypes "github.com/cosmos/cosmos-sdk/types/errors" + gethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/evmos/evmos/v16/app/ante/evm" + "github.com/evmos/evmos/v16/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v16/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v16/testutil/integration/evmos/network" + evmtypes "github.com/evmos/evmos/v16/x/evm/types" +) + +func (suite *EvmAnteTestSuite) TestCanTransfer() { + keyring := testkeyring.New(1) + unitNetwork := network.NewUnitTestNetwork( + network.WithPreFundedAccounts(keyring.GetAllAccAddrs()...), + ) + grpcHandler := grpc.NewIntegrationHandler(unitNetwork) + txFactory := factory.New(unitNetwork, grpcHandler) + senderKey := keyring.GetKey(0) + + testCases := []struct { + name string + expectedError error + isLondon bool + malleate func(txArgs *evmtypes.EvmTxArgs) + }{ + { + name: "fail: isLondon and insufficient fee", + expectedError: errortypes.ErrInsufficientFee, + isLondon: true, + malleate: func(txArgs *evmtypes.EvmTxArgs) { + txArgs.GasFeeCap = big.NewInt(0) + }, + }, + { + name: "fail: invalid tx with insufficient balance", + expectedError: errortypes.ErrInsufficientFunds, + isLondon: true, + malleate: func(txArgs *evmtypes.EvmTxArgs) { + balanceResp, err := grpcHandler.GetBalance(senderKey.AccAddr, unitNetwork.GetDenom()) + suite.Require().NoError(err) + invalidAmount := balanceResp.Balance.Amount.Add(math.NewInt(1)).BigInt() + txArgs.Amount = invalidAmount + }, + }, + { + name: "success: valid tx and sufficient balance", + expectedError: nil, + isLondon: true, + malleate: func(txArgs *evmtypes.EvmTxArgs) { + }, + }, + } + + for _, tc := range testCases { + suite.Run(fmt.Sprintf("%v_%v", evmtypes.GetTxTypeName(suite.ethTxType), tc.name), func() { + baseFeeResp, err := grpcHandler.GetBaseFee() + suite.Require().NoError(err) + ethCfg := unitNetwork.GetEVMChainConfig() + evmParams, err := grpcHandler.GetEvmParams() + suite.Require().NoError(err) + ctx := unitNetwork.GetContext() + signer := gethtypes.MakeSigner(ethCfg, big.NewInt(ctx.BlockHeight())) + txArgs, err := txFactory.GenerateDefaultTxTypeArgs(senderKey.Addr, suite.ethTxType) + suite.Require().NoError(err) + txArgs.Amount = big.NewInt(100) + + tc.malleate(&txArgs) + + msg := evmtypes.NewTx(&txArgs) + msg.From = senderKey.Addr.String() + signMsg, err := txFactory.SignMsgEthereumTx(senderKey.Priv, *msg) + suite.Require().NoError(err) + coreMsg, err := signMsg.AsMessage(signer, baseFeeResp.BaseFee.BigInt()) + suite.Require().NoError(err) + + // Function under test + err = evm.CanTransfer( + unitNetwork.GetContext(), + unitNetwork.App.EvmKeeper, + coreMsg, + baseFeeResp.BaseFee.BigInt(), + ethCfg, + evmParams.Params, + tc.isLondon, + ) + + if tc.expectedError != nil { + suite.Require().Error(err) + suite.Contains(err.Error(), tc.expectedError.Error()) + + } else { + suite.Require().NoError(err) + } + }) + } +} diff --git a/app/ante/evm/08_vesting.go b/app/ante/evm/08_vesting.go index 9ba5bd5896..6ec1431bc8 100644 --- a/app/ante/evm/08_vesting.go +++ b/app/ante/evm/08_vesting.go @@ -25,12 +25,13 @@ type EthVestingTransactionDecorator struct { // EthVestingExpenseTracker tracks both the total transaction value to be sent across Ethereum // messages and the maximum spendable value for a given account. type EthVestingExpenseTracker struct { - // total is the total value to be spent across a transaction with one or more Ethereum message calls - total *big.Int - // spendable is the maximum value that can be spent - spendable *big.Int + // Total is the total value to be spent across a transaction with one or more Ethereum message calls + Total *big.Int + // Spendable is the maximum value that can be spent + Spendable *big.Int } +// NOTE: Can't delete the legacy decorator yet because vesting module's tests would have to be refactored // NewEthVestingTransactionDecorator returns a new EthVestingTransactionDecorator. func NewEthVestingTransactionDecorator(ak evmtypes.AccountKeeper, bk evmtypes.BankKeeper, ek EVMKeeper) EthVestingTransactionDecorator { return EthVestingTransactionDecorator{ @@ -100,8 +101,8 @@ func CheckVesting( return err } - total := expenses.total - spendable := expenses.spendable + total := expenses.Total + spendable := expenses.Spendable if total.Cmp(spendable) > 0 { return errorsmod.Wrapf(vestingtypes.ErrInsufficientUnlockedCoins, @@ -128,7 +129,7 @@ func UpdateAccountExpenses( expenses, ok := accountExpenses[addrStr] // if an expense tracker is found for the address, add the expense and return if ok { - expenses.total = expenses.total.Add(expenses.total, addedExpense) + expenses.Total = expenses.Total.Add(expenses.Total, addedExpense) return expenses, nil } @@ -154,8 +155,8 @@ func UpdateAccountExpenses( } expenses = &EthVestingExpenseTracker{ - total: addedExpense, - spendable: spendableValue, + Total: addedExpense, + Spendable: spendableValue, } accountExpenses[addrStr] = expenses diff --git a/app/ante/evm/08_vesting_test.go b/app/ante/evm/08_vesting_test.go new file mode 100644 index 0000000000..9a914c3289 --- /dev/null +++ b/app/ante/evm/08_vesting_test.go @@ -0,0 +1,236 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) +package evm_test + +import ( + "math/big" + "time" + + "cosmossdk.io/math" + sdktypes "github.com/cosmos/cosmos-sdk/types" + errortypes "github.com/cosmos/cosmos-sdk/types/errors" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + sdkvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" + "github.com/evmos/evmos/v16/app/ante/evm" + "github.com/evmos/evmos/v16/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v16/testutil/integration/evmos/network" + vestingtypes "github.com/evmos/evmos/v16/x/vesting/types" +) + +type AccountExpenses = map[string]*evm.EthVestingExpenseTracker + +func (suite *EvmAnteTestSuite) TestCheckVesting() { + keyring := testkeyring.New(1) + unitNetwork := network.NewUnitTestNetwork( + network.WithPreFundedAccounts(keyring.GetAllAccAddrs()...), + ) + grpcHandler := grpc.NewIntegrationHandler(unitNetwork) + sender := keyring.GetAccAddr(0) + addedExpense := math.NewInt(100) + + testCases := []struct { + name string + expectedError error + getAccountAndExpenses func() (authtypes.AccountI, AccountExpenses) + }{ + { + name: "success: non clawback account should be successful", + expectedError: nil, + getAccountAndExpenses: func() (authtypes.AccountI, AccountExpenses) { + account, err := grpcHandler.GetAccount(sender.String()) + suite.Require().NoError(err) + return account, defaultAccountExpenses() + }, + }, + { + name: "error: clawback account with balance 0 should fail", + expectedError: errortypes.ErrInsufficientFunds, + getAccountAndExpenses: func() (authtypes.AccountI, AccountExpenses) { + newIndex := keyring.AddKey() + unfundedAddr := keyring.GetAccAddr(newIndex) + funder := keyring.GetAccAddr(0) + vestingParams := defaultVestingParams(unitNetwork, funder, unfundedAddr) + return generateNewVestingAccount( + unitNetwork, + vestingParams, + ), defaultAccountExpenses() + }, + }, + { + name: "error: clawback account with not enough bank + not enough vested unlocked balance < total should fail", + expectedError: vestingtypes.ErrInsufficientUnlockedCoins, + getAccountAndExpenses: func() (authtypes.AccountI, AccountExpenses) { + newIndex := keyring.AddKey() + newAddr := keyring.GetAccAddr(newIndex) + funder := keyring.GetAccAddr(0) + + // have insufficient bank balance but not zero + insufficientAmount := addedExpense.Sub(math.NewInt(1)) + err := unitNetwork.FundAccount( + newAddr, + sdktypes.NewCoins( + sdktypes.NewCoin( + unitNetwork.GetDenom(), + insufficientAmount, + ), + ), + ) + suite.Require().NoError(err) + + vestingParams := defaultVestingParams(unitNetwork, funder, newAddr) + vestingAccount := generateNewVestingAccount( + unitNetwork, + vestingParams, + ) + return vestingAccount, defaultAccountExpenses() + }, + }, + { + name: "error: clawback account with not enough bank + not enough vested unlocked balance < total + previosExpenses should fail", + expectedError: vestingtypes.ErrInsufficientUnlockedCoins, + getAccountAndExpenses: func() (authtypes.AccountI, AccountExpenses) { + newIndex := keyring.AddKey() + newAddr := keyring.GetAccAddr(newIndex) + funder := keyring.GetAccAddr(0) + + // have insufficient bank balance but not zero + enoughAmount := addedExpense + err := unitNetwork.FundAccount( + newAddr, + sdktypes.NewCoins( + sdktypes.NewCoin( + unitNetwork.GetDenom(), + enoughAmount, + ), + ), + ) + suite.Require().NoError(err) + + vestingParams := defaultVestingParams(unitNetwork, funder, newAddr) + vestingAccount := generateNewVestingAccount( + unitNetwork, + vestingParams, + ) + + accExpenses := defaultAccountExpenses() + accExpenses[newAddr.String()] = &evm.EthVestingExpenseTracker{ + Total: big.NewInt(1000), + Spendable: big.NewInt(0), + } + + return vestingAccount, accExpenses + }, + }, + { + name: "success: clawback account with enough bank + not enough vested unlocked balance > total should be successful", + expectedError: nil, + getAccountAndExpenses: func() (authtypes.AccountI, AccountExpenses) { + newIndex := keyring.AddKey() + newAddr := keyring.GetAccAddr(newIndex) + funder := keyring.GetAccAddr(0) + + // have more than enough bank balance + enoughAmount := addedExpense.Add(math.NewInt(1e18)) + err := unitNetwork.FundAccount( + newAddr, + sdktypes.NewCoins( + sdktypes.NewCoin( + unitNetwork.GetDenom(), + enoughAmount, + ), + ), + ) + suite.Require().NoError(err) + + vestingParams := defaultVestingParams(unitNetwork, funder, newAddr) + vestingAccount := generateNewVestingAccount( + unitNetwork, + vestingParams, + ) + return vestingAccount, defaultAccountExpenses() + }, + }, + } + + for _, tc := range testCases { + suite.Run(tc.name, func() { + account, accountExpenses := tc.getAccountAndExpenses() + + // Function under test + err := evm.CheckVesting( + unitNetwork.GetContext(), + unitNetwork.App.BankKeeper, + account, + accountExpenses, + addedExpense.BigInt(), + unitNetwork.GetDenom(), + ) + + if tc.expectedError != nil { + suite.Require().Error(err) + suite.Contains(err.Error(), tc.expectedError.Error()) + } else { + suite.Require().NoError(err) + } + }) + } +} + +type customVestingParams struct { + FunderAddress sdktypes.AccAddress + BaseAccAddress sdktypes.AccAddress + StartVestingTime time.Time + Period sdkvesting.Period + VestingAmount math.Int +} + +func defaultAccountExpenses() AccountExpenses { + return make(map[string]*evm.EthVestingExpenseTracker) +} + +func defaultVestingParams(network network.Network, funder, baseAddress sdktypes.AccAddress) customVestingParams { + return customVestingParams{ + FunderAddress: funder, + BaseAccAddress: baseAddress, + StartVestingTime: time.Now(), + Period: sdkvesting.Period{ + Length: 1000, + Amount: sdktypes.NewCoins(sdktypes.NewInt64Coin(network.GetDenom(), 1000)), + }, + VestingAmount: sdktypes.NewInt(1e18), + } +} + +func generateNewVestingAccount( + unitNetwork *network.UnitTestNetwork, + vestingParams customVestingParams, +) authtypes.AccountI { + var ( + balances = sdktypes.NewCoins(sdktypes.NewInt64Coin(unitNetwork.GetDenom(), 1000)) + lockupPeriods = sdkvesting.Periods{{Length: 5000, Amount: balances}} + vestingPeriods = sdkvesting.Periods{ + vestingParams.Period, + vestingParams.Period, + vestingParams.Period, + vestingParams.Period, + vestingParams.Period, + } + vestingCoins = sdktypes.NewCoins( + sdktypes.NewCoin(unitNetwork.GetDenom(), vestingParams.VestingAmount), + ) + ) + + baseAcc := authtypes.NewBaseAccountWithAddress(vestingParams.BaseAccAddress) + vestingAcc := vestingtypes.NewClawbackVestingAccount( + baseAcc, + vestingParams.FunderAddress, + vestingCoins, + vestingParams.StartVestingTime, + lockupPeriods, + vestingPeriods, + ) + acc := unitNetwork.App.AccountKeeper.NewAccount(unitNetwork.GetContext(), vestingAcc) + unitNetwork.App.AccountKeeper.SetAccount(unitNetwork.GetContext(), acc) + return acc +} diff --git a/app/ante/evm/09_gas_consume.go b/app/ante/evm/09_gas_consume.go index 4628bdb7cc..397ab040d3 100644 --- a/app/ante/evm/09_gas_consume.go +++ b/app/ante/evm/09_gas_consume.go @@ -3,216 +3,120 @@ package evm import ( - "math" "math/big" errorsmod "cosmossdk.io/errors" - sdk "github.com/cosmos/cosmos-sdk/types" + sdkmath "cosmossdk.io/math" + sdktypes "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" "github.com/ethereum/go-ethereum/common" anteutils "github.com/evmos/evmos/v16/app/ante/utils" "github.com/evmos/evmos/v16/types" - "github.com/evmos/evmos/v16/x/evm/keeper" evmtypes "github.com/evmos/evmos/v16/x/evm/types" ) -// EthGasConsumeDecorator validates enough intrinsic gas for the transaction and -// gas consumption. -type EthGasConsumeDecorator struct { - bankKeeper anteutils.BankKeeper - distributionKeeper anteutils.DistributionKeeper - evmKeeper EVMKeeper - stakingKeeper anteutils.StakingKeeper - maxGasWanted uint64 -} - -// NewEthGasConsumeDecorator creates a new EthGasConsumeDecorator -func NewEthGasConsumeDecorator( - bankKeeper anteutils.BankKeeper, - distributionKeeper anteutils.DistributionKeeper, - evmKeeper EVMKeeper, - stakingKeeper anteutils.StakingKeeper, - maxGasWanted uint64, -) EthGasConsumeDecorator { - return EthGasConsumeDecorator{ - bankKeeper, - distributionKeeper, - evmKeeper, - stakingKeeper, - maxGasWanted, - } -} - -// AnteHandle validates that the Ethereum tx message has enough to cover intrinsic gas -// (during CheckTx only) and that the sender has enough balance to pay for the gas cost. -// If the balance is not sufficient, it will be attempted to withdraw enough staking rewards -// for the payment. -// -// Intrinsic gas for a transaction is the amount of gas that the transaction uses before the -// transaction is executed. The gas is a constant value plus any cost incurred by additional bytes -// of data supplied with the transaction. -// -// This AnteHandler decorator will fail if: -// - the message is not a MsgEthereumTx -// - sender account cannot be found -// - transaction's gas limit is lower than the intrinsic gas -// - user has neither enough balance nor staking rewards to deduct the transaction fees (gas_limit * gas_price) -// - transaction or block gas meter runs out of gas -// - sets the gas meter limit -// - gas limit is greater than the block gas meter limit -func (egcd EthGasConsumeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler) (sdk.Context, error) { - gasWanted := uint64(0) - // gas consumption limit already checked during CheckTx so there's no need to - // verify it again during ReCheckTx - if ctx.IsReCheckTx() { - // Use new context with gasWanted = 0 - // Otherwise, there's an error on txmempool.postCheck (tendermint) - // that is not bubbled up. Thus, the Tx never runs on DeliverMode - // Error: "gas wanted -1 is negative" - // For more information, see issue #1554 - // https://github.com/evmos/ethermint/issues/1554 - newCtx := ctx.WithGasMeter(types.NewInfiniteGasMeterWithLimit(gasWanted)) - return next(newCtx, tx, simulate) - } - - evmParams := egcd.evmKeeper.GetParams(ctx) - evmDenom := evmParams.GetEvmDenom() - chainCfg := evmParams.GetChainConfig() - ethCfg := chainCfg.EthereumConfig(egcd.evmKeeper.ChainID()) - - blockHeight := big.NewInt(ctx.BlockHeight()) - homestead := ethCfg.IsHomestead(blockHeight) - istanbul := ethCfg.IsIstanbul(blockHeight) - - // Use the lowest priority of all the messages as the final one. - minPriority := int64(math.MaxInt64) - baseFee := egcd.evmKeeper.GetBaseFee(ctx, ethCfg) - - for _, msg := range tx.GetMsgs() { - _, txData, from, err := evmtypes.UnpackEthMsg(msg) - if err != nil { - return ctx, err - } - - gasWanted, minPriority, err = ConsumeGas( - ctx, - egcd.bankKeeper, - egcd.distributionKeeper, - egcd.evmKeeper, - egcd.stakingKeeper, - from, - txData, - minPriority, - gasWanted, - egcd.maxGasWanted, - evmDenom, - baseFee, - homestead, - istanbul, - ) - - if err != nil { - return ctx, err - } - } - - newCtx, err := CheckBlockGasLimit(ctx, gasWanted, minPriority) - if err != nil { - return ctx, err - } - - return next(newCtx, tx, simulate) -} - -// ConsumeGas consumes the gas from the user balance and returns the updated gasWanted and minPriority. -func ConsumeGas( - ctx sdk.Context, - bankKeeper anteutils.BankKeeper, - distributionKeeper anteutils.DistributionKeeper, - evmKeeper EVMKeeper, - stakingKeeper anteutils.StakingKeeper, - from sdk.AccAddress, - txData evmtypes.TxData, - minPriority int64, - gasWanted, maxGasWanted uint64, - evmDenom string, - baseFee *big.Int, - isHomestead, isIstanbul bool, -) (uint64, int64, error) { - gas := txData.GetGas() - - if ctx.IsCheckTx() && maxGasWanted != 0 { +// UpdateComulativeGasWanted updates the cumulative gas wanted +func UpdateComulativeGasWanted( + ctx sdktypes.Context, + msgGasWanted uint64, + maxTxGasWanted uint64, + cumulativeGasWanted uint64, +) uint64 { + if ctx.IsCheckTx() && maxTxGasWanted != 0 { // We can't trust the tx gas limit, because we'll refund the unused gas. - if gas > maxGasWanted { - gasWanted += maxGasWanted + if msgGasWanted > maxTxGasWanted { + cumulativeGasWanted += maxTxGasWanted } else { - gasWanted += gas + cumulativeGasWanted += msgGasWanted } } else { - gasWanted += gas + cumulativeGasWanted += msgGasWanted } + return cumulativeGasWanted +} - fees, err := keeper.VerifyFee(txData, evmDenom, baseFee, isHomestead, isIstanbul, ctx.IsCheckTx()) - if err != nil { - return gasWanted, minPriority, errorsmod.Wrapf(err, "failed to verify the fees") - } +type ConsumeGasKeepers struct { + Bank anteutils.BankKeeper + Distribution anteutils.DistributionKeeper + Evm EVMKeeper + Staking anteutils.StakingKeeper +} - if err = DeductFee( +// ConsumeFeesAndEmitEvent deduces fees from sender and emits the event +func ConsumeFeesAndEmitEvent( + ctx sdktypes.Context, + keepers *ConsumeGasKeepers, + fees sdktypes.Coins, + from sdktypes.AccAddress, +) error { + if err := deductFees( ctx, - bankKeeper, - distributionKeeper, - evmKeeper, - stakingKeeper, + keepers, fees, from, ); err != nil { - return gasWanted, minPriority, err + return err } ctx.EventManager().EmitEvent( - sdk.NewEvent( - sdk.EventTypeTx, - sdk.NewAttribute(sdk.AttributeKeyFee, fees.String()), + sdktypes.NewEvent( + sdktypes.EventTypeTx, + sdktypes.NewAttribute(sdktypes.AttributeKeyFee, fees.String()), ), ) - - priority := evmtypes.GetTxPriority(txData, baseFee) - - if priority < minPriority { - minPriority = priority - } - - return gasWanted, minPriority, nil + return nil } // deductFee checks if the fee payer has enough funds to pay for the fees and deducts them. // If the spendable balance is not enough, it tries to claim enough staking rewards to cover the fees. -func DeductFee( - ctx sdk.Context, - bankKeeper anteutils.BankKeeper, - distributionKeeper anteutils.DistributionKeeper, - evmKeeper EVMKeeper, - stakingKeeper anteutils.StakingKeeper, - fees sdk.Coins, - feePayer sdk.AccAddress, +func deductFees( + ctx sdktypes.Context, + keepers *ConsumeGasKeepers, + fees sdktypes.Coins, + feePayer sdktypes.AccAddress, ) error { if fees.IsZero() { return nil } // If the account balance is not sufficient, try to withdraw enough staking rewards - if err := anteutils.ClaimStakingRewardsIfNecessary(ctx, bankKeeper, distributionKeeper, stakingKeeper, feePayer, fees); err != nil { + if err := anteutils.ClaimStakingRewardsIfNecessary( + ctx, + keepers.Bank, + keepers.Distribution, + keepers.Staking, + feePayer, + fees, + ); err != nil { return err } - if err := evmKeeper.DeductTxCostsFromUserBalance(ctx, fees, common.BytesToAddress(feePayer)); err != nil { + if err := keepers.Evm.DeductTxCostsFromUserBalance( + ctx, + fees, + common.BytesToAddress(feePayer), + ); err != nil { return errorsmod.Wrapf(err, "failed to deduct transaction costs from user balance") } return nil } +// GetMsgPriority returns the priority of a Eth Tx capped by the minimum priority +func GetMsgPriority( + txData evmtypes.TxData, + minPriority int64, + baseFee *big.Int, +) int64 { + priority := evmtypes.GetTxPriority(txData, baseFee) + + if priority < minPriority { + minPriority = priority + } + return minPriority +} + // TODO: (@fedekunze) Why is this necessary? This seems to be a duplicate from the CheckGasWanted function. -func CheckBlockGasLimit(ctx sdk.Context, gasWanted uint64, minPriority int64) (sdk.Context, error) { +func CheckBlockGasLimit(ctx sdktypes.Context, gasWanted uint64, minPriority int64) (sdktypes.Context, error) { blockGasLimit := types.BlockGasLimit(ctx) // return error if the tx gas is greater than the block limit (max gas) @@ -241,3 +145,17 @@ func CheckBlockGasLimit(ctx sdk.Context, gasWanted uint64, minPriority int64) (s return ctx, nil } + +// UpdateCumulativeTxFee updates the cumulative transaction fee +func UpdateCumulativeTxFee( + cumulativeTxFee sdktypes.Coins, + msgFee *big.Int, + denom string, +) sdktypes.Coins { + return cumulativeTxFee.Add( + sdktypes.Coin{ + Denom: denom, + Amount: sdkmath.NewIntFromBigInt(msgFee), + }, + ) +} diff --git a/app/ante/evm/09_gas_consume_test.go b/app/ante/evm/09_gas_consume_test.go new file mode 100644 index 0000000000..a70ae3f820 --- /dev/null +++ b/app/ante/evm/09_gas_consume_test.go @@ -0,0 +1,194 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) +package evm_test + +import ( + sdktypes "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + evmante "github.com/evmos/evmos/v16/app/ante/evm" + "github.com/evmos/evmos/v16/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v16/testutil/integration/evmos/network" +) + +func (suite *EvmAnteTestSuite) TestUpdateComulativeGasWanted() { + keyring := testkeyring.New(1) + unitNetwork := network.NewUnitTestNetwork( + network.WithPreFundedAccounts(keyring.GetAllAccAddrs()...), + ) + + testCases := []struct { + name string + msgGasWanted uint64 + maxTxGasWanted uint64 + cumulativeGasWanted uint64 + getCtx func() sdktypes.Context + expectedResponse uint64 + }{ + { + name: "when is NOT checkTx and cumulativeGasWanted is 0, returns msgGasWanted", + msgGasWanted: 100, + maxTxGasWanted: 150, + cumulativeGasWanted: 0, + getCtx: func() sdktypes.Context { + return unitNetwork.GetContext().WithIsCheckTx(false) + }, + expectedResponse: 100, + }, + { + name: "when is NOT checkTx and cumulativeGasWanted has value, returns cumulativeGasWanted + msgGasWanted", + msgGasWanted: 100, + maxTxGasWanted: 150, + cumulativeGasWanted: 50, + getCtx: func() sdktypes.Context { + return unitNetwork.GetContext().WithIsCheckTx(false) + }, + expectedResponse: 150, + }, + { + name: "when is checkTx, maxTxGasWanted is not 0 and msgGasWanted > maxTxGasWanted, returns cumulativeGasWanted + maxTxGasWanted", + msgGasWanted: 200, + maxTxGasWanted: 100, + cumulativeGasWanted: 50, + getCtx: func() sdktypes.Context { + return unitNetwork.GetContext().WithIsCheckTx(true) + }, + expectedResponse: 150, + }, + { + name: "when is checkTx, maxTxGasWanted is not 0 and msgGasWanted < maxTxGasWanted, returns cumulativeGasWanted + msgGasWanted", + msgGasWanted: 50, + maxTxGasWanted: 100, + cumulativeGasWanted: 50, + getCtx: func() sdktypes.Context { + return unitNetwork.GetContext().WithIsCheckTx(true) + }, + expectedResponse: 100, + }, + } + + for _, tc := range testCases { + suite.Run(tc.name, func() { + // Function under test + gasWanted := evmante.UpdateComulativeGasWanted( + tc.getCtx(), + tc.msgGasWanted, + tc.maxTxGasWanted, + tc.cumulativeGasWanted, + ) + + suite.Require().Equal(tc.expectedResponse, gasWanted) + }) + } +} + +// NOTE: claim rewards are not tested since there is an independent suite to test just that +func (suite *EvmAnteTestSuite) TestConsumeGasAndEmitEvent() { + keyring := testkeyring.New(1) + unitNetwork := network.NewUnitTestNetwork( + network.WithPreFundedAccounts(keyring.GetAllAccAddrs()...), + ) + grpcHandler := grpc.NewIntegrationHandler(unitNetwork) + + testCases := []struct { + name string + expectedError error + fees sdktypes.Coins + getSender func() sdktypes.AccAddress + }{ + { + name: "success: fees are zero and event emitted", + expectedError: nil, + fees: sdktypes.Coins{}, + getSender: func() sdktypes.AccAddress { + // Return prefunded sender + return keyring.GetKey(0).AccAddr + }, + }, + { + name: "success: there are non zero fees, user has sufficient bank balances and event emitted", + expectedError: nil, + fees: sdktypes.Coins{ + sdktypes.NewCoin(unitNetwork.GetDenom(), sdktypes.NewInt(1000)), + }, + getSender: func() sdktypes.AccAddress { + // Return prefunded sender + return keyring.GetKey(0).AccAddr + }, + }, + { + name: "fail: insufficient user balance, event is NOT emitted", + expectedError: sdkerrors.ErrInsufficientFee, + fees: sdktypes.Coins{ + sdktypes.NewCoin(unitNetwork.GetDenom(), sdktypes.NewInt(1000)), + }, + getSender: func() sdktypes.AccAddress { + // Return unfunded account + index := keyring.AddKey() + return keyring.GetKey(index).AccAddr + }, + }, + } + + for _, tc := range testCases { + suite.Run(tc.name, func() { + keepers := &evmante.ConsumeGasKeepers{ + Bank: unitNetwork.App.BankKeeper, + Distribution: unitNetwork.App.DistrKeeper, + Evm: unitNetwork.App.EvmKeeper, + Staking: unitNetwork.App.StakingKeeper, + } + sender := tc.getSender() + prevBalance, err := grpcHandler.GetAllBalances( + sender, + ) + suite.Require().NoError(err) + + // Function under test + err = evmante.ConsumeFeesAndEmitEvent( + unitNetwork.GetContext(), + keepers, + tc.fees, + sender, + ) + + if tc.expectedError != nil { + suite.Require().Error(err) + suite.Contains(err.Error(), tc.expectedError.Error()) + + // Check events are not present + events := unitNetwork.GetContext().EventManager().Events() + suite.Require().Zero(len(events)) + } else { + suite.Require().NoError(err) + + // Check fees are deducted + afterBalance, err := grpcHandler.GetAllBalances( + sender, + ) + suite.Require().NoError(err) + expectedBalance := prevBalance.Balances.Sub(tc.fees...) + suite.Require().True( + expectedBalance.IsEqual(afterBalance.Balances), + ) + + // Event to be emitted + expectedEvent := sdktypes.NewEvent( + sdktypes.EventTypeTx, + sdktypes.NewAttribute(sdktypes.AttributeKeyFee, tc.fees.String()), + ) + // Check events are present + events := unitNetwork.GetContext().EventManager().Events() + suite.Require().NotZero(len(events)) + suite.Require().Contains( + events, + expectedEvent, + ) + } + + // Reset the context + err = unitNetwork.NextBlock() + suite.Require().NoError(err) + }) + } +} diff --git a/app/ante/evm/10_incremenet_sequence_test.go b/app/ante/evm/10_incremenet_sequence_test.go new file mode 100644 index 0000000000..68a20f203c --- /dev/null +++ b/app/ante/evm/10_incremenet_sequence_test.go @@ -0,0 +1,72 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) +package evm_test + +import ( + errortypes "github.com/cosmos/cosmos-sdk/types/errors" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + "github.com/evmos/evmos/v16/app/ante/evm" + "github.com/evmos/evmos/v16/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v16/testutil/integration/evmos/network" +) + +func (suite *EvmAnteTestSuite) TestIncrementSequence() { + keyring := testkeyring.New(1) + unitNetwork := network.NewUnitTestNetwork( + network.WithPreFundedAccounts(keyring.GetAllAccAddrs()...), + ) + grpcHandler := grpc.NewIntegrationHandler(unitNetwork) + accAddr := keyring.GetAccAddr(0) + + testCases := []struct { + name string + expectedError error + malleate func(acct authtypes.AccountI) uint64 + }{ + { + name: "fail: invalid sequence", + expectedError: errortypes.ErrInvalidSequence, + malleate: func(acct authtypes.AccountI) uint64 { + return acct.GetSequence() + 1 + }, + }, + { + name: "success: increments sequence", + expectedError: nil, + malleate: func(acct authtypes.AccountI) uint64 { + return acct.GetSequence() + }, + }, + } + + for _, tc := range testCases { + suite.Run(tc.name, func() { + account, err := grpcHandler.GetAccount(accAddr.String()) + suite.Require().NoError(err) + preSequence := account.GetSequence() + + nonce := tc.malleate(account) + + // Function under test + err = evm.IncrementNonce( + unitNetwork.GetContext(), + unitNetwork.App.AccountKeeper, + account, + nonce, + ) + + if tc.expectedError != nil { + suite.Require().Error(err) + suite.Contains(err.Error(), tc.expectedError.Error()) + } else { + suite.Require().NoError(err) + + suite.Require().Equal(preSequence+1, account.GetSequence()) + updatedAccount, err := grpcHandler.GetAccount(accAddr.String()) + suite.Require().NoError(err) + suite.Require().Equal(preSequence+1, updatedAccount.GetSequence()) + } + }) + } +} diff --git a/app/ante/evm/10_increment_sequence.go b/app/ante/evm/10_increment_sequence.go index 468cc89950..ba76a52c74 100644 --- a/app/ante/evm/10_increment_sequence.go +++ b/app/ante/evm/10_increment_sequence.go @@ -11,49 +11,8 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" evmtypes "github.com/evmos/evmos/v16/x/evm/types" - - "github.com/ethereum/go-ethereum/common" ) -// EthIncrementSenderSequenceDecorator increments the sequence of the signers. -type EthIncrementSenderSequenceDecorator struct { - ak evmtypes.AccountKeeper -} - -// NewEthIncrementSenderSequenceDecorator creates a new EthIncrementSenderSequenceDecorator. -func NewEthIncrementSenderSequenceDecorator(ak evmtypes.AccountKeeper) EthIncrementSenderSequenceDecorator { - return EthIncrementSenderSequenceDecorator{ - ak: ak, - } -} - -// AnteHandle handles incrementing the sequence of the signer (i.e. sender). If the transaction is a -// contract creation, the nonce will be incremented during the transaction execution and not within -// this AnteHandler decorator. -func (issd EthIncrementSenderSequenceDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler) (sdk.Context, error) { - for _, msg := range tx.GetMsgs() { - _, txData, from, err := evmtypes.UnpackEthMsg(msg) - if err != nil { - return ctx, err - } - - // increase sequence of sender - acc := issd.ak.GetAccount(ctx, from) - if acc == nil { - return ctx, errorsmod.Wrapf( - errortypes.ErrUnknownAddress, - "account %s is nil", common.BytesToAddress(from.Bytes()), - ) - } - - if err := IncrementNonce(ctx, issd.ak, acc, txData.GetNonce()); err != nil { - return ctx, err - } - } - - return next(ctx, tx, simulate) -} - // IncrementNonce increments the sequence of the account. func IncrementNonce( ctx sdk.Context, diff --git a/app/ante/evm/11_gas_wanted_test.go b/app/ante/evm/11_gas_wanted_test.go new file mode 100644 index 0000000000..e773d859f4 --- /dev/null +++ b/app/ante/evm/11_gas_wanted_test.go @@ -0,0 +1,120 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) +package evm_test + +import ( + errortypes "github.com/cosmos/cosmos-sdk/types/errors" + + sdktypes "github.com/cosmos/cosmos-sdk/types" + "github.com/evmos/evmos/v16/app/ante/evm" + "github.com/evmos/evmos/v16/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v16/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v16/testutil/integration/evmos/network" +) + +func (suite *EvmAnteTestSuite) TestCheckGasWanted() { + keyring := testkeyring.New(1) + unitNetwork := network.NewUnitTestNetwork( + network.WithPreFundedAccounts(keyring.GetAllAccAddrs()...), + ) + grpcHandler := grpc.NewIntegrationHandler(unitNetwork) + txFactory := factory.New(unitNetwork, grpcHandler) + commonGasLimit := uint64(100000) + + testCases := []struct { + name string + expectedError error + getCtx func() sdktypes.Context + isLondon bool + expectedTransientGasWanted uint64 + }{ + { + name: "success: if isLondon false it should not error", + expectedError: nil, + getCtx: func() sdktypes.Context { + // Even if the gasWanted is more than the blockGasLimit, it should not error + blockMeter := sdktypes.NewGasMeter(commonGasLimit - 10000) + return unitNetwork.GetContext().WithBlockGasMeter(blockMeter) + }, + isLondon: false, + expectedTransientGasWanted: 0, + }, + { + name: "success: gasWanted is less than blockGasLimit", + expectedError: nil, + getCtx: func() sdktypes.Context { + blockMeter := sdktypes.NewGasMeter(commonGasLimit + 10000) + return unitNetwork.GetContext().WithBlockGasMeter(blockMeter) + }, + isLondon: true, + expectedTransientGasWanted: commonGasLimit, + }, + { + name: "fail: gasWanted is more than blockGasLimit", + expectedError: errortypes.ErrOutOfGas, + getCtx: func() sdktypes.Context { + blockMeter := sdktypes.NewGasMeter(commonGasLimit - 10000) + return unitNetwork.GetContext().WithBlockGasMeter(blockMeter) + }, + isLondon: true, + expectedTransientGasWanted: 0, + }, + { + name: "success: gasWanted is less than blockGasLimit and basefee param is disabled", + expectedError: nil, + getCtx: func() sdktypes.Context { + // Set basefee param to false + feeMarketParams, err := grpcHandler.GetFeeMarketParams() + suite.Require().NoError(err) + feeMarketParams.Params.NoBaseFee = true + err = unitNetwork.UpdateFeeMarketParams(feeMarketParams.Params) + suite.Require().NoError(err) + + blockMeter := sdktypes.NewGasMeter(commonGasLimit + 10000) + return unitNetwork.GetContext().WithBlockGasMeter(blockMeter) + }, + isLondon: true, + expectedTransientGasWanted: 0, + }, + } + + for _, tc := range testCases { + suite.Run(tc.name, func() { + sender := keyring.GetKey(0) + txArgs, err := txFactory.GenerateDefaultTxTypeArgs( + sender.Addr, + suite.ethTxType, + ) + suite.Require().NoError(err) + txArgs.GasLimit = commonGasLimit + tx, err := txFactory.GenerateSignedEthTx(sender.Priv, txArgs) + suite.Require().NoError(err) + + ctx := tc.getCtx() + + // Function under test + err = evm.CheckGasWanted( + ctx, + unitNetwork.App.FeeMarketKeeper, + tx, + tc.isLondon, + ) + + if tc.expectedError != nil { + suite.Require().Error(err) + suite.Contains(err.Error(), tc.expectedError.Error()) + } else { + suite.Require().NoError(err) + transientGasWanted := unitNetwork.App.FeeMarketKeeper.GetTransientGasWanted( + unitNetwork.GetContext(), + ) + suite.Require().Equal(tc.expectedTransientGasWanted, transientGasWanted) + } + + // Start from a fresh block and ctx + err = unitNetwork.NextBlock() + suite.Require().NoError(err) + }) + } +} diff --git a/app/ante/evm/ante_test.go b/app/ante/evm/ante_test.go index 3a410b5888..d36c5b8ba8 100644 --- a/app/ante/evm/ante_test.go +++ b/app/ante/evm/ante_test.go @@ -1148,6 +1148,7 @@ func (suite *AnteTestSuite) TestAnteHandlerWithParams() { GasLimit: 100000, GasFeeCap: big.NewInt(ethparams.InitialBaseFee + 1), GasTipCap: big.NewInt(1), + Input: []byte("create bytes"), Accesses: &types.AccessList{}, } @@ -1159,6 +1160,7 @@ func (suite *AnteTestSuite) TestAnteHandlerWithParams() { GasFeeCap: big.NewInt(ethparams.InitialBaseFee + 1), GasTipCap: big.NewInt(1), Accesses: &types.AccessList{}, + Input: []byte("call bytes"), To: &to, } diff --git a/app/ante/evm/eth_benchmark_test.go b/app/ante/evm/eth_benchmark_test.go index 0636ed8089..6930d70f80 100644 --- a/app/ante/evm/eth_benchmark_test.go +++ b/app/ante/evm/eth_benchmark_test.go @@ -9,7 +9,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" ethtypes "github.com/ethereum/go-ethereum/core/types" ethante "github.com/evmos/evmos/v16/app/ante/evm" - "github.com/evmos/evmos/v16/server/config" "github.com/evmos/evmos/v16/testutil" testutiltx "github.com/evmos/evmos/v16/testutil/tx" "github.com/evmos/evmos/v16/x/evm/statedb" @@ -21,8 +20,6 @@ func BenchmarkEthGasConsumeDecorator(b *testing.B) { s.SetT(&testing.T{}) s.SetupTest() - dec := ethante.NewEthGasConsumeDecorator(s.app.BankKeeper, s.app.DistrKeeper, s.app.EvmKeeper, s.app.StakingKeeper, config.DefaultMaxTxGasWanted) - args := &evmtypes.EvmTxArgs{ ChainID: s.app.EvmKeeper.ChainID(), Nonce: 1, @@ -66,10 +63,28 @@ func BenchmarkEthGasConsumeDecorator(b *testing.B) { vmdb = testutil.NewStateDB(cacheCtx, s.app.EvmKeeper) cacheCtx = s.prepareAccount(cacheCtx, addr.Bytes(), tc.balance, tc.rewards) s.Require().NoError(vmdb.Commit()) + keepers := ethante.ConsumeGasKeepers{ + Bank: s.app.BankKeeper, + Distribution: s.app.DistrKeeper, + Evm: s.app.EvmKeeper, + Staking: s.app.StakingKeeper, + } + + baseFee := s.app.FeeMarketKeeper.GetParams(s.ctx).BaseFee + fee := tx.GetEffectiveFee(baseFee.BigInt()) + denom := s.app.EvmKeeper.GetParams(s.ctx).EvmDenom + fees := sdk.NewCoins(sdk.NewCoin(denom, sdk.NewIntFromBigInt(fee))) + bechAddr := sdk.AccAddress(addr.Bytes()) // Benchmark only the ante handler logic - start the timer b.StartTimer() - _, err := dec.AnteHandle(cacheCtx.WithIsCheckTx(true).WithGasMeter(sdk.NewInfiniteGasMeter()), tx, false, testutil.NextFn) + + err := ethante.ConsumeFeesAndEmitEvent( + cacheCtx.WithIsCheckTx(true).WithGasMeter(sdk.NewInfiniteGasMeter()), + &keepers, + fees, + bechAddr, + ) s.Require().NoError(err) } }) diff --git a/app/ante/evm/eth_test.go b/app/ante/evm/eth_test.go deleted file mode 100644 index 6668fe30b2..0000000000 --- a/app/ante/evm/eth_test.go +++ /dev/null @@ -1,682 +0,0 @@ -package evm_test - -import ( - "math" - "math/big" - - sdkmath "cosmossdk.io/math" - storetypes "github.com/cosmos/cosmos-sdk/store/types" - sdk "github.com/cosmos/cosmos-sdk/types" - - ethante "github.com/evmos/evmos/v16/app/ante/evm" - "github.com/evmos/evmos/v16/server/config" - "github.com/evmos/evmos/v16/testutil" - testutiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/types" - "github.com/evmos/evmos/v16/utils" - "github.com/evmos/evmos/v16/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - - ethtypes "github.com/ethereum/go-ethereum/core/types" -) - -func (suite *AnteTestSuite) TestNewEthAccountVerificationDecorator() { - dec := ethante.NewEthAccountVerificationDecorator( - suite.app.AccountKeeper, suite.app.EvmKeeper, - ) - - addr := testutiltx.GenerateAddress() - - ethContractCreationTxParams := &evmtypes.EvmTxArgs{ - ChainID: suite.app.EvmKeeper.ChainID(), - Nonce: 1, - Amount: big.NewInt(10), - GasLimit: 1000, - GasPrice: big.NewInt(1), - } - - tx := evmtypes.NewTx(ethContractCreationTxParams) - tx.From = addr.Hex() - - var vmdb *statedb.StateDB - - testCases := []struct { - name string - tx sdk.Tx - malleate func() - checkTx bool - expPass bool - }{ - {"not CheckTx", nil, func() {}, false, true}, - {"invalid transaction type", &testutiltx.InvalidTx{}, func() {}, true, false}, - { - "sender not set to msg", - tx, - func() {}, - true, - false, - }, - { - "sender not EOA", - tx, - func() { - // set not as an EOA - vmdb.SetCode(addr, []byte("1")) - }, - true, - false, - }, - { - "not enough balance to cover tx cost", - tx, - func() { - // reset back to EOA - vmdb.SetCode(addr, nil) - }, - true, - false, - }, - { - "success new account", - tx, - func() { - vmdb.AddBalance(addr, big.NewInt(1000000)) - }, - true, - true, - }, - { - "success existing account", - tx, - func() { - acc := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, addr.Bytes()) - suite.app.AccountKeeper.SetAccount(suite.ctx, acc) - - vmdb.AddBalance(addr, big.NewInt(1000000)) - }, - true, - true, - }, - } - - for _, tc := range testCases { - suite.Run(tc.name, func() { - vmdb = testutil.NewStateDB(suite.ctx, suite.app.EvmKeeper) - tc.malleate() - suite.Require().NoError(vmdb.Commit()) - - _, err := dec.AnteHandle(suite.ctx.WithIsCheckTx(tc.checkTx), tc.tx, false, testutil.NextFn) - - if tc.expPass { - suite.Require().NoError(err) - } else { - suite.Require().Error(err) - } - }) - } -} - -func (suite *AnteTestSuite) TestEthNonceVerificationDecorator() { - suite.SetupTest() - dec := ethante.NewEthIncrementSenderSequenceDecorator(suite.app.AccountKeeper) - - addr := testutiltx.GenerateAddress() - - ethContractCreationTxParams := &evmtypes.EvmTxArgs{ - ChainID: suite.app.EvmKeeper.ChainID(), - Nonce: 1, - Amount: big.NewInt(10), - GasLimit: 1000, - GasPrice: big.NewInt(1), - } - - tx := evmtypes.NewTx(ethContractCreationTxParams) - tx.From = addr.Hex() - - testCases := []struct { - name string - tx sdk.Tx - malleate func() - reCheckTx bool - expPass bool - }{ - {"ReCheckTx", &testutiltx.InvalidTx{}, func() {}, true, false}, - {"invalid transaction type", &testutiltx.InvalidTx{}, func() {}, false, false}, - {"sender account not found", tx, func() {}, false, false}, - { - "sender nonce missmatch", - tx, - func() { - acc := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, addr.Bytes()) - suite.app.AccountKeeper.SetAccount(suite.ctx, acc) - }, - false, - false, - }, - { - "success", - tx, - func() { - acc := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, addr.Bytes()) - suite.Require().NoError(acc.SetSequence(1)) - suite.app.AccountKeeper.SetAccount(suite.ctx, acc) - }, - false, - true, - }, - } - - for _, tc := range testCases { - suite.Run(tc.name, func() { - tc.malleate() - _, err := dec.AnteHandle(suite.ctx.WithIsReCheckTx(tc.reCheckTx), tc.tx, false, testutil.NextFn) - - if tc.expPass { - suite.Require().NoError(err) - } else { - suite.Require().Error(err) - } - }) - } -} - -func (suite *AnteTestSuite) TestEthGasConsumeDecorator() { - chainID := suite.app.EvmKeeper.ChainID() - dec := ethante.NewEthGasConsumeDecorator(suite.app.BankKeeper, suite.app.DistrKeeper, suite.app.EvmKeeper, suite.app.StakingKeeper, config.DefaultMaxTxGasWanted) - - addr := testutiltx.GenerateAddress() - - txGasLimit := uint64(1000) - - ethContractCreationTxParams := &evmtypes.EvmTxArgs{ - ChainID: chainID, - Nonce: 1, - Amount: big.NewInt(10), - GasLimit: txGasLimit, - GasPrice: big.NewInt(1), - } - - tx := evmtypes.NewTx(ethContractCreationTxParams) - tx.From = addr.Hex() - - ethContractCreationTxParams.GasLimit = 55000 - zeroFeeTx := makeZeroFeeTx(addr, *ethContractCreationTxParams) - - ethCfg := suite.app.EvmKeeper.GetParams(suite.ctx). - ChainConfig.EthereumConfig(chainID) - baseFee := suite.app.EvmKeeper.GetBaseFee(suite.ctx, ethCfg) - suite.Require().Equal(int64(1000000000), baseFee.Int64()) - - gasPrice := new(big.Int).Add(baseFee, evmtypes.DefaultPriorityReduction.BigInt()) - - tx2GasLimit := uint64(1000000) - eth2TxContractParams := &evmtypes.EvmTxArgs{ - ChainID: chainID, - Nonce: 1, - Amount: big.NewInt(10), - GasLimit: tx2GasLimit, - GasPrice: gasPrice, - Accesses: ðtypes.AccessList{{Address: addr, StorageKeys: nil}}, - } - tx2 := evmtypes.NewTx(eth2TxContractParams) - tx2.From = addr.Hex() - tx2Priority := int64(1) - - tx3GasLimit := types.BlockGasLimit(suite.ctx) + uint64(1) - eth3TxContractParams := &evmtypes.EvmTxArgs{ - ChainID: chainID, - Nonce: 1, - Amount: big.NewInt(10), - GasLimit: tx3GasLimit, - GasPrice: gasPrice, - Accesses: ðtypes.AccessList{{Address: addr, StorageKeys: nil}}, - } - tx3 := evmtypes.NewTx(eth3TxContractParams) - - dynamicTxContractParams := &evmtypes.EvmTxArgs{ - ChainID: chainID, - Nonce: 1, - Amount: big.NewInt(10), - GasLimit: tx2GasLimit, - GasFeeCap: new(big.Int).Add(baseFee, big.NewInt(evmtypes.DefaultPriorityReduction.Int64()*2)), - GasTipCap: evmtypes.DefaultPriorityReduction.BigInt(), - Accesses: ðtypes.AccessList{{Address: addr, StorageKeys: nil}}, - } - dynamicFeeTx := evmtypes.NewTx(dynamicTxContractParams) - dynamicFeeTx.From = addr.Hex() - dynamicFeeTxPriority := int64(1) - - var vmdb *statedb.StateDB - - initialBalance := suite.app.BankKeeper.GetBalance(suite.ctx, addr.Bytes(), utils.BaseDenom) - - testCases := []struct { - name string - tx sdk.Tx - gasLimit uint64 - malleate func(ctx sdk.Context) sdk.Context - expPass bool - expPanic bool - expPriority int64 - postCheck func(ctx sdk.Context) - }{ - { - "invalid transaction type", - &testutiltx.InvalidTx{}, - math.MaxUint64, - func(ctx sdk.Context) sdk.Context { return ctx }, - false, - false, - 0, - func(ctx sdk.Context) {}, - }, - { - "sender not found", - evmtypes.NewTx(&evmtypes.EvmTxArgs{ - ChainID: chainID, - Nonce: 1, - Amount: big.NewInt(10), - GasLimit: 1000, - GasPrice: big.NewInt(1), - }), - math.MaxUint64, - func(ctx sdk.Context) sdk.Context { return ctx }, - false, false, - 0, - func(ctx sdk.Context) {}, - }, - { - "gas limit too low", - tx, - math.MaxUint64, - func(ctx sdk.Context) sdk.Context { return ctx }, - false, false, - 0, - func(ctx sdk.Context) {}, - }, - { - "gas limit above block gas limit", - tx3, - math.MaxUint64, - func(ctx sdk.Context) sdk.Context { return ctx }, - false, false, - 0, - func(ctx sdk.Context) {}, - }, - { - "not enough balance for fees", - tx2, - math.MaxUint64, - func(ctx sdk.Context) sdk.Context { return ctx }, - false, false, - 0, - func(ctx sdk.Context) {}, - }, - { - "not enough tx gas", - tx2, - 0, - func(ctx sdk.Context) sdk.Context { - vmdb.AddBalance(addr, big.NewInt(1e6)) - return ctx - }, - false, true, - 0, - func(ctx sdk.Context) {}, - }, - { - "not enough block gas", - tx2, - 0, - func(ctx sdk.Context) sdk.Context { - vmdb.AddBalance(addr, big.NewInt(1e6)) - return ctx.WithBlockGasMeter(storetypes.NewGasMeter(1)) - }, - false, true, - 0, - func(ctx sdk.Context) {}, - }, - { - "success - legacy tx", - tx2, - tx2GasLimit, // it's capped - func(ctx sdk.Context) sdk.Context { - vmdb.AddBalance(addr, big.NewInt(1e16)) - return ctx.WithBlockGasMeter(storetypes.NewGasMeter(1e19)) - }, - true, false, - tx2Priority, - func(ctx sdk.Context) {}, - }, - { - "success - dynamic fee tx", - dynamicFeeTx, - tx2GasLimit, // it's capped - func(ctx sdk.Context) sdk.Context { - vmdb.AddBalance(addr, big.NewInt(1e16)) - return ctx.WithBlockGasMeter(storetypes.NewGasMeter(1e19)) - }, - true, false, - dynamicFeeTxPriority, - func(ctx sdk.Context) {}, - }, - { - "success - gas limit on gasMeter is set on ReCheckTx mode", - dynamicFeeTx, - 0, // for reCheckTX mode, gas limit should be set to 0 - func(ctx sdk.Context) sdk.Context { - vmdb.AddBalance(addr, big.NewInt(1e15)) - return ctx.WithIsReCheckTx(true) - }, - true, false, - 0, - func(ctx sdk.Context) {}, - }, - { - "success - legacy tx - insufficient funds but enough staking rewards", - tx2, - tx2GasLimit, // it's capped - func(ctx sdk.Context) sdk.Context { - return suite.prepareAccount( - ctx, - addr.Bytes(), - sdkmath.ZeroInt(), - sdkmath.NewInt(1e16), - ) - }, - true, false, - tx2Priority, - func(ctx sdk.Context) { - balance := suite.app.BankKeeper.GetBalance(ctx, sdk.AccAddress(addr.Bytes()), utils.BaseDenom) - suite.Require().False( - balance.Amount.IsZero(), - "the fees are paid after withdrawing (a surplus amount of) staking rewards, so it should be higher than the initial balance", - ) - - rewards, err := testutil.GetTotalDelegationRewards(ctx, suite.app.DistrKeeper, sdk.AccAddress(addr.Bytes())) - suite.Require().NoError(err, "error while querying delegation total rewards") - suite.Require().Nil(rewards, "the total rewards should be nil after withdrawing all of them") - }, - }, - { - "success - legacy tx - enough funds so no staking rewards should be used", - tx2, - tx2GasLimit, // it's capped - func(ctx sdk.Context) sdk.Context { - return suite.prepareAccount( - ctx, - addr.Bytes(), - sdkmath.NewInt(1e16), - sdkmath.NewInt(1e16), - ) - }, - true, false, - tx2Priority, - func(ctx sdk.Context) { - balance := suite.app.BankKeeper.GetBalance(ctx, sdk.AccAddress(addr.Bytes()), utils.BaseDenom) - suite.Require().True( - balance.Amount.LT(sdkmath.NewInt(1e16)), - "the fees are paid using the available balance, so it should be lower than the initial balance", - ) - - rewards, err := testutil.GetTotalDelegationRewards(ctx, suite.app.DistrKeeper, sdk.AccAddress(addr.Bytes())) - suite.Require().NoError(err, "error while querying delegation total rewards") - - // NOTE: the total rewards should be the same as after the setup, since - // the fees are paid using the account balance - suite.Require().Equal( - sdk.NewDecCoins(sdk.NewDecCoin(utils.BaseDenom, sdkmath.NewInt(1e16))), - rewards, - "the total rewards should be the same as after the setup, since the fees are paid using the account balance", - ) - }, - }, - { - "success - zero fees (no base fee)", - zeroFeeTx, - zeroFeeTx.GetGas(), - func(ctx sdk.Context) sdk.Context { - suite.disableBaseFee(ctx) - return ctx - }, - true, false, - 0, - func(ctx sdk.Context) { - finalBalance := suite.app.BankKeeper.GetBalance(ctx, addr.Bytes(), utils.BaseDenom) - suite.Require().Equal(initialBalance, finalBalance) - }, - }, - { - "success - zero fees (no base fee) - legacy tx", - makeZeroFeeTx(addr, *eth2TxContractParams), - tx2GasLimit, - func(ctx sdk.Context) sdk.Context { - suite.disableBaseFee(ctx) - return ctx - }, - true, false, - 0, - func(ctx sdk.Context) { - finalBalance := suite.app.BankKeeper.GetBalance(ctx, addr.Bytes(), utils.BaseDenom) - suite.Require().Equal(initialBalance, finalBalance) - }, - }, - } - - for _, tc := range testCases { - suite.Run(tc.name, func() { - cacheCtx, _ := suite.ctx.CacheContext() - // Create new stateDB for each test case from the cached context - vmdb = testutil.NewStateDB(cacheCtx, suite.app.EvmKeeper) - cacheCtx = tc.malleate(cacheCtx) - suite.Require().NoError(vmdb.Commit()) - - if tc.expPanic { - suite.Require().Panics(func() { - _, _ = dec.AnteHandle(cacheCtx.WithIsCheckTx(true).WithGasMeter(storetypes.NewGasMeter(1)), tc.tx, false, testutil.NextFn) - }) - return - } - - ctx, err := dec.AnteHandle(cacheCtx.WithIsCheckTx(true).WithGasMeter(sdk.NewInfiniteGasMeter()), tc.tx, false, testutil.NextFn) - if tc.expPass { - suite.Require().NoError(err) - suite.Require().Equal(tc.expPriority, ctx.Priority()) - } else { - suite.Require().Error(err) - } - suite.Require().Equal(tc.gasLimit, ctx.GasMeter().Limit()) - - // check state after the test case - tc.postCheck(ctx) - }) - } -} - -func (suite *AnteTestSuite) TestCanTransferDecorator() { - dec := ethante.NewCanTransferDecorator(suite.app.EvmKeeper) - - addr, privKey := testutiltx.NewAddrKey() - - suite.app.FeeMarketKeeper.SetBaseFee(suite.ctx, big.NewInt(100)) - ethContractCreationTxParams := &evmtypes.EvmTxArgs{ - ChainID: suite.app.EvmKeeper.ChainID(), - Nonce: 1, - Amount: big.NewInt(10), - GasLimit: 1000, - GasPrice: big.NewInt(1), - GasFeeCap: big.NewInt(150), - GasTipCap: big.NewInt(200), - Accesses: ðtypes.AccessList{}, - } - - tx := evmtypes.NewTx(ethContractCreationTxParams) - tx2 := evmtypes.NewTx(ethContractCreationTxParams) - - tx.From = addr.Hex() - - err := tx.Sign(suite.ethSigner, testutiltx.NewSigner(privKey)) - suite.Require().NoError(err) - - var vmdb *statedb.StateDB - - testCases := []struct { - name string - tx sdk.Tx - malleate func() - expPass bool - }{ - {"invalid transaction type", &testutiltx.InvalidTx{}, func() {}, false}, - {"AsMessage failed", tx2, func() {}, false}, - { - "evm CanTransfer failed", - tx, - func() { - acc := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, addr.Bytes()) - suite.app.AccountKeeper.SetAccount(suite.ctx, acc) - }, - false, - }, - { - "success", - tx, - func() { - acc := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, addr.Bytes()) - suite.app.AccountKeeper.SetAccount(suite.ctx, acc) - - vmdb.AddBalance(addr, big.NewInt(1000000)) - }, - true, - }, - } - - for _, tc := range testCases { - suite.Run(tc.name, func() { - vmdb = testutil.NewStateDB(suite.ctx, suite.app.EvmKeeper) - tc.malleate() - suite.Require().NoError(vmdb.Commit()) - - _, err := dec.AnteHandle(suite.ctx.WithIsCheckTx(true), tc.tx, false, testutil.NextFn) - - if tc.expPass { - suite.Require().NoError(err) - } else { - suite.Require().Error(err) - } - }) - } -} - -func (suite *AnteTestSuite) TestEthIncrementSenderSequenceDecorator() { - dec := ethante.NewEthIncrementSenderSequenceDecorator(suite.app.AccountKeeper) - addr, privKey := testutiltx.NewAddrKey() - - ethTxContractParamsNonce0 := &evmtypes.EvmTxArgs{ - ChainID: suite.app.EvmKeeper.ChainID(), - Nonce: 0, - Amount: big.NewInt(10), - GasLimit: 1000, - GasPrice: big.NewInt(1), - } - contract := evmtypes.NewTx(ethTxContractParamsNonce0) - contract.From = addr.Hex() - err := contract.Sign(suite.ethSigner, testutiltx.NewSigner(privKey)) - suite.Require().NoError(err) - - to := testutiltx.GenerateAddress() - ethTxParamsNonce0 := &evmtypes.EvmTxArgs{ - ChainID: suite.app.EvmKeeper.ChainID(), - Nonce: 0, - To: &to, - Amount: big.NewInt(10), - GasLimit: 1000, - GasPrice: big.NewInt(1), - } - tx := evmtypes.NewTx(ethTxParamsNonce0) - tx.From = addr.Hex() - err = tx.Sign(suite.ethSigner, testutiltx.NewSigner(privKey)) - suite.Require().NoError(err) - - ethTxParamsNonce1 := &evmtypes.EvmTxArgs{ - ChainID: suite.app.EvmKeeper.ChainID(), - Nonce: 1, - To: &to, - Amount: big.NewInt(10), - GasLimit: 1000, - GasPrice: big.NewInt(1), - } - tx2 := evmtypes.NewTx(ethTxParamsNonce1) - tx2.From = addr.Hex() - err = tx2.Sign(suite.ethSigner, testutiltx.NewSigner(privKey)) - suite.Require().NoError(err) - - testCases := []struct { - name string - tx sdk.Tx - malleate func() - expPass bool - expPanic bool - }{ - { - "invalid transaction type", - &testutiltx.InvalidTx{}, - func() {}, - false, false, - }, - { - "no signers", - evmtypes.NewTx(ethTxParamsNonce1), - func() {}, - false, false, - }, - { - "account not set to store", - tx, - func() {}, - false, false, - }, - { - "success - create contract", - contract, - func() { - acc := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, addr.Bytes()) - suite.app.AccountKeeper.SetAccount(suite.ctx, acc) - }, - true, false, - }, - { - "success - call", - tx2, - func() {}, - true, false, - }, - } - - for _, tc := range testCases { - suite.Run(tc.name, func() { - tc.malleate() - - if tc.expPanic { - suite.Require().Panics(func() { - _, _ = dec.AnteHandle(suite.ctx, tc.tx, false, testutil.NextFn) - }) - return - } - - _, err := dec.AnteHandle(suite.ctx, tc.tx, false, testutil.NextFn) - - if tc.expPass { - suite.Require().NoError(err) - msg := tc.tx.(*evmtypes.MsgEthereumTx) - - txData, err := evmtypes.UnpackTxData(msg.Data) - suite.Require().NoError(err) - - nonce := suite.app.EvmKeeper.GetNonce(suite.ctx, addr) - suite.Require().Equal(txData.GetNonce()+1, nonce) - } else { - suite.Require().Error(err) - } - }) - } -} diff --git a/app/ante/evm/fees_test.go b/app/ante/evm/fees_test.go deleted file mode 100644 index 74805abead..0000000000 --- a/app/ante/evm/fees_test.go +++ /dev/null @@ -1,268 +0,0 @@ -package evm_test - -import ( - "math" - "math/big" - - sdkmath "cosmossdk.io/math" - sdk "github.com/cosmos/cosmos-sdk/types" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - ethtypes "github.com/ethereum/go-ethereum/core/types" - evmante "github.com/evmos/evmos/v16/app/ante/evm" - "github.com/evmos/evmos/v16/testutil" - testutiltx "github.com/evmos/evmos/v16/testutil/tx" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" -) - -var execTypes = []struct { - name string - isCheckTx bool - simulate bool -}{ - {"deliverTx", false, false}, - {"deliverTxSimulate", false, true}, -} - -func (suite *AnteTestSuite) TestEthMinGasPriceDecorator() { - denom := evmtypes.DefaultEVMDenom - from, privKey := testutiltx.NewAddrKey() - to := testutiltx.GenerateAddress() - emptyAccessList := ethtypes.AccessList{} - - testCases := []struct { - name string - malleate func() sdk.Tx - expPass bool - errMsg string - }{ - { - "invalid tx type", - func() sdk.Tx { - params := suite.app.FeeMarketKeeper.GetParams(suite.ctx) - params.MinGasPrice = sdkmath.LegacyNewDec(10) - err := suite.app.FeeMarketKeeper.SetParams(suite.ctx, params) - suite.Require().NoError(err) - - return &testutiltx.InvalidTx{} - }, - false, - "invalid message type", - }, - { - "wrong tx type", - func() sdk.Tx { - params := suite.app.FeeMarketKeeper.GetParams(suite.ctx) - params.MinGasPrice = sdkmath.LegacyNewDec(10) - err := suite.app.FeeMarketKeeper.SetParams(suite.ctx, params) - suite.Require().NoError(err) - testMsg := banktypes.MsgSend{ - FromAddress: "evmos1x8fhpj9nmhqk8z9kpgjt95ck2xwyue0ptzkucp", - ToAddress: "evmos1dx67l23hz9l0k9hcher8xz04uj7wf3yu26l2yn", - Amount: sdk.Coins{sdk.Coin{Amount: sdkmath.NewInt(10), Denom: denom}}, - } - txBuilder := suite.CreateTestCosmosTxBuilder(sdkmath.NewInt(0), denom, &testMsg) - return txBuilder.GetTx() - }, - false, - "invalid message type", - }, - { - "valid: invalid tx type with MinGasPrices = 0", - func() sdk.Tx { - params := suite.app.FeeMarketKeeper.GetParams(suite.ctx) - params.MinGasPrice = sdkmath.LegacyZeroDec() - err := suite.app.FeeMarketKeeper.SetParams(suite.ctx, params) - suite.Require().NoError(err) - return &testutiltx.InvalidTx{} - }, - true, - "", - }, - { - "valid legacy tx with MinGasPrices = 0, gasPrice = 0", - func() sdk.Tx { - params := suite.app.FeeMarketKeeper.GetParams(suite.ctx) - params.MinGasPrice = sdkmath.LegacyZeroDec() - err := suite.app.FeeMarketKeeper.SetParams(suite.ctx, params) - suite.Require().NoError(err) - - msg := suite.BuildTestEthTx(from, to, nil, make([]byte, 0), big.NewInt(0), nil, nil, nil) - return suite.CreateTestTx(msg, privKey, 1, false) - }, - true, - "", - }, - { - "valid legacy tx with MinGasPrices = 0, gasPrice > 0", - func() sdk.Tx { - params := suite.app.FeeMarketKeeper.GetParams(suite.ctx) - params.MinGasPrice = sdkmath.LegacyZeroDec() - err := suite.app.FeeMarketKeeper.SetParams(suite.ctx, params) - suite.Require().NoError(err) - - msg := suite.BuildTestEthTx(from, to, nil, make([]byte, 0), big.NewInt(10), nil, nil, nil) - return suite.CreateTestTx(msg, privKey, 1, false) - }, - true, - "", - }, - { - "valid legacy tx with MinGasPrices = 10, gasPrice = 10", - func() sdk.Tx { - params := suite.app.FeeMarketKeeper.GetParams(suite.ctx) - params.MinGasPrice = sdkmath.LegacyNewDec(10) - err := suite.app.FeeMarketKeeper.SetParams(suite.ctx, params) - suite.Require().NoError(err) - - msg := suite.BuildTestEthTx(from, to, nil, make([]byte, 0), big.NewInt(10), nil, nil, nil) - return suite.CreateTestTx(msg, privKey, 1, false) - }, - true, - "", - }, - { - "invalid legacy tx with MinGasPrices = 10, gasPrice = 0", - func() sdk.Tx { - params := suite.app.FeeMarketKeeper.GetParams(suite.ctx) - params.MinGasPrice = sdkmath.LegacyNewDec(10) - err := suite.app.FeeMarketKeeper.SetParams(suite.ctx, params) - suite.Require().NoError(err) - - msg := suite.BuildTestEthTx(from, to, nil, make([]byte, 0), big.NewInt(0), nil, nil, nil) - return suite.CreateTestTx(msg, privKey, 1, false) - }, - false, - "provided fee < minimum global fee", - }, - { - "valid dynamic tx with MinGasPrices = 0, EffectivePrice = 0", - func() sdk.Tx { - params := suite.app.FeeMarketKeeper.GetParams(suite.ctx) - params.MinGasPrice = sdkmath.LegacyZeroDec() - err := suite.app.FeeMarketKeeper.SetParams(suite.ctx, params) - suite.Require().NoError(err) - - msg := suite.BuildTestEthTx(from, to, nil, make([]byte, 0), nil, big.NewInt(0), big.NewInt(0), &emptyAccessList) - return suite.CreateTestTx(msg, privKey, 1, false) - }, - true, - "", - }, - { - "valid dynamic tx with MinGasPrices = 0, EffectivePrice > 0", - func() sdk.Tx { - params := suite.app.FeeMarketKeeper.GetParams(suite.ctx) - params.MinGasPrice = sdkmath.LegacyZeroDec() - err := suite.app.FeeMarketKeeper.SetParams(suite.ctx, params) - suite.Require().NoError(err) - - msg := suite.BuildTestEthTx(from, to, nil, make([]byte, 0), nil, big.NewInt(100), big.NewInt(50), &emptyAccessList) - return suite.CreateTestTx(msg, privKey, 1, false) - }, - true, - "", - }, - { - "valid dynamic tx with MinGasPrices < EffectivePrice", - func() sdk.Tx { - params := suite.app.FeeMarketKeeper.GetParams(suite.ctx) - params.MinGasPrice = sdkmath.LegacyNewDec(10) - err := suite.app.FeeMarketKeeper.SetParams(suite.ctx, params) - suite.Require().NoError(err) - - msg := suite.BuildTestEthTx(from, to, nil, make([]byte, 0), nil, big.NewInt(100), big.NewInt(100), &emptyAccessList) - return suite.CreateTestTx(msg, privKey, 1, false) - }, - true, - "", - }, - { - "invalid dynamic tx with MinGasPrices > EffectivePrice", - func() sdk.Tx { - params := suite.app.FeeMarketKeeper.GetParams(suite.ctx) - params.MinGasPrice = sdkmath.LegacyNewDec(10) - err := suite.app.FeeMarketKeeper.SetParams(suite.ctx, params) - suite.Require().NoError(err) - - msg := suite.BuildTestEthTx(from, to, nil, make([]byte, 0), nil, big.NewInt(0), big.NewInt(0), &emptyAccessList) - return suite.CreateTestTx(msg, privKey, 1, false) - }, - false, - "provided fee < minimum global fee", - }, - { - "invalid dynamic tx with MinGasPrices > BaseFee, MinGasPrices > EffectivePrice", - func() sdk.Tx { - params := suite.app.FeeMarketKeeper.GetParams(suite.ctx) - params.MinGasPrice = sdkmath.LegacyNewDec(100) - err := suite.app.FeeMarketKeeper.SetParams(suite.ctx, params) - suite.Require().NoError(err) - - feemarketParams := suite.app.FeeMarketKeeper.GetParams(suite.ctx) - feemarketParams.BaseFee = sdkmath.NewInt(10) - err = suite.app.FeeMarketKeeper.SetParams(suite.ctx, feemarketParams) - suite.Require().NoError(err) - - msg := suite.BuildTestEthTx(from, to, nil, make([]byte, 0), nil, big.NewInt(1000), big.NewInt(0), &emptyAccessList) - return suite.CreateTestTx(msg, privKey, 1, false) - }, - false, - "provided fee < minimum global fee", - }, - { - "valid dynamic tx with MinGasPrices > BaseFee, MinGasPrices < EffectivePrice (big GasTipCap)", - func() sdk.Tx { - params := suite.app.FeeMarketKeeper.GetParams(suite.ctx) - params.MinGasPrice = sdkmath.LegacyNewDec(100) - err := suite.app.FeeMarketKeeper.SetParams(suite.ctx, params) - suite.Require().NoError(err) - - feemarketParams := suite.app.FeeMarketKeeper.GetParams(suite.ctx) - feemarketParams.BaseFee = sdkmath.NewInt(10) - err = suite.app.FeeMarketKeeper.SetParams(suite.ctx, feemarketParams) - suite.Require().NoError(err) - - msg := suite.BuildTestEthTx(from, to, nil, make([]byte, 0), nil, big.NewInt(1000), big.NewInt(101), &emptyAccessList) - return suite.CreateTestTx(msg, privKey, 1, false) - }, - true, - "", - }, - { - "panic bug, requiredFee > math.MaxInt64", - func() sdk.Tx { - params := suite.app.FeeMarketKeeper.GetParams(suite.ctx) - params.MinGasPrice = sdkmath.LegacyNewDec(math.MaxInt64) - err := suite.app.FeeMarketKeeper.SetParams(suite.ctx, params) - suite.Require().NoError(err) - - msg := suite.BuildTestEthTx(from, to, nil, make([]byte, 0), nil, big.NewInt(math.MaxInt64), big.NewInt(100), &emptyAccessList) - return suite.CreateTestTx(msg, privKey, 1, false) - }, - false, - "provided fee < minimum global fee", - }, - } - - for _, et := range execTypes { - for _, tc := range testCases { - suite.Run(et.name+"_"+tc.name, func() { - // s.SetupTest(et.isCheckTx) - suite.SetupTest() - dec := evmante.NewEthMinGasPriceDecorator(suite.app.FeeMarketKeeper, suite.app.EvmKeeper) - _, err := dec.AnteHandle(suite.ctx, tc.malleate(), et.simulate, testutil.NextFn) - - if tc.expPass { - suite.Require().NoError(err, tc.name) - } else { - suite.Require().Error(err, tc.name) - suite.Require().Contains(err.Error(), tc.errMsg, tc.name) - } - }) - } - } -} - -func (suite *AnteTestSuite) TestEthMempoolFeeDecorator() { - // TODO: add test -} diff --git a/app/ante/evm/mono.go b/app/ante/evm/mono.go index f9bb421e3e..399824926a 100644 --- a/app/ante/evm/mono.go +++ b/app/ante/evm/mono.go @@ -1,6 +1,5 @@ // Copyright Tharsis Labs Ltd.(Evmos) // SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - package evm import ( @@ -16,6 +15,7 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/params" anteutils "github.com/evmos/evmos/v16/app/ante/utils" + evmkeeper "github.com/evmos/evmos/v16/x/evm/keeper" evmtypes "github.com/evmos/evmos/v16/x/evm/types" ) @@ -157,28 +157,40 @@ func (md MonoDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, ne return ctx, err } - // 4. validate basic - txFee, txGasLimit, err := CheckDisabledCreateCallAndUpdateTxFee( - txData.GetTo(), + // 4. validate basic and updates gas + // txFee, txGasLimit, err := CheckDisabledCreateCallAndUpdateTxFee( + // txData.GetTo(), + // from, + // decUtils.TxGasLimit, + // gas, + // decUtils.EvmParams.EnableCreate, + // decUtils.EvmParams.EnableCall, + // decUtils.BaseFee, + // txData.Fee(), + // txData.TxType(), + // decUtils.EvmDenom, + // decUtils.TxFee, + // ) + // if err != nil { + // return ctx, err + // } + + // 4. validate basic and updates gas + err = ValidateMsg( + decUtils.EvmParams, + txData, from, - decUtils.TxGasLimit, - gas, - decUtils.EvmParams.EnableCreate, - decUtils.EvmParams.EnableCall, - decUtils.BaseFee, - txData.Fee(), - txData.TxType(), - decUtils.EvmDenom, - decUtils.TxFee, ) if err != nil { return ctx, err } - decUtils.TxFee = txFee - decUtils.TxGasLimit = txGasLimit // 5. signature verification - if err := SignatureVerification(ethMsg, decUtils.Signer, decUtils.EvmParams.AllowUnprotectedTxs); err != nil { + if err := SignatureVerification( + ethMsg, + decUtils.Signer, + decUtils.EvmParams.AllowUnprotectedTxs, + ); err != nil { return ctx, err } @@ -187,9 +199,15 @@ func (md MonoDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, ne // 6. account balance verification fromAddr := common.HexToAddress(ethMsg.From) - // // TODO: Use account from AccountKeeper instead + // TODO: Use account from AccountKeeper instead account := md.evmKeeper.GetAccount(ctx, fromAddr) - if err := VerifyAccountBalance(ctx, md.accountKeeper, account, fromAddr, txData); err != nil { + if err := VerifyAccountBalance( + ctx, + md.accountKeeper, + account, + fromAddr, + txData, + ); err != nil { return ctx, err } @@ -202,7 +220,15 @@ func (md MonoDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, ne ) } - if err := CanTransfer(ctx, md.evmKeeper, coreMsg, decUtils.BaseFee, decUtils.EthConfig, decUtils.EvmParams, decUtils.Rules.IsLondon); err != nil { + if err := CanTransfer( + ctx, + md.evmKeeper, + coreMsg, + decUtils.BaseFee, + decUtils.EthConfig, + decUtils.EvmParams, + decUtils.Rules.IsLondon, + ); err != nil { return ctx, err } @@ -215,34 +241,68 @@ func (md MonoDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, ne "account %s does not exist", acc) } - if err := CheckVesting(ctx, md.bankKeeper, acc, accountExpenses, value, decUtils.EvmDenom); err != nil { + if err := CheckVesting( + ctx, + md.bankKeeper, + acc, + accountExpenses, + value, + decUtils.EvmDenom, + ); err != nil { return ctx, err } // 9. gas consumption - gasWanted, minPriority, err := ConsumeGas( - ctx, - md.bankKeeper, - md.distributionKeeper, - md.evmKeeper, - md.stakingKeeper, - from, + msgFees, err := evmkeeper.VerifyFee( txData, - decUtils.MinPriority, - decUtils.GasWanted, - md.maxGasWanted, decUtils.EvmDenom, decUtils.BaseFee, decUtils.Rules.IsHomestead, decUtils.Rules.IsIstanbul, + ctx.IsCheckTx(), ) if err != nil { return ctx, err } + err = ConsumeFeesAndEmitEvent( + ctx, + &ConsumeGasKeepers{ + Bank: md.bankKeeper, + Distribution: md.distributionKeeper, + Evm: md.evmKeeper, + Staking: md.stakingKeeper, + }, + msgFees, + from, + ) + if err != nil { + return ctx, err + } + + gasWanted := UpdateComulativeGasWanted( + ctx, + txData.GetGas(), + md.maxGasWanted, + decUtils.GasWanted, + ) decUtils.GasWanted = gasWanted + + minPriority := GetMsgPriority( + txData, + decUtils.MinPriority, + decUtils.BaseFee, + ) decUtils.MinPriority = minPriority + txFee := UpdateCumulativeTxFee( + decUtils.TxFee, + txData.Fee(), + decUtils.EvmDenom, + ) + decUtils.TxFee = txFee + decUtils.TxGasLimit += gas + // 10. increment sequence if err := IncrementNonce(ctx, md.accountKeeper, acc, txData.GetNonce()); err != nil { return ctx, err diff --git a/app/ante/evm/suite_test.go b/app/ante/evm/suite_test.go new file mode 100644 index 0000000000..fc2e353798 --- /dev/null +++ b/app/ante/evm/suite_test.go @@ -0,0 +1,30 @@ +package evm_test + +import ( + "testing" + + gethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/stretchr/testify/suite" +) + +// EvmAnteTestSuite aims to test all EVM ante handler unit functions. +// NOTE: the suite only holds properties related to global execution parameters +// (what type of tx to run the tests with) not independent tests values. +type EvmAnteTestSuite struct { + suite.Suite + + // To make sure that every tests is run with all the tx types + ethTxType int +} + +func TestEvmAnteTestSuite(t *testing.T) { + suite.Run(t, &EvmAnteTestSuite{ + ethTxType: gethtypes.DynamicFeeTxType, + }) + suite.Run(t, &EvmAnteTestSuite{ + ethTxType: gethtypes.LegacyTxType, + }) + suite.Run(t, &EvmAnteTestSuite{ + ethTxType: gethtypes.AccessListTxType, + }) +} diff --git a/app/ante/evm/utils_test.go b/app/ante/evm/utils_test.go index ca8c34340e..786b4ef708 100644 --- a/app/ante/evm/utils_test.go +++ b/app/ante/evm/utils_test.go @@ -665,22 +665,3 @@ func (suite *AnteTestSuite) prepareAccount(ctx sdk.Context, addr sdk.AccAddress, WithBlockGasMeter(storetypes.NewGasMeter(1e19)). WithBlockHeight(ctx.BlockHeight() + 1) } - -// disableBaseFee is a helper function that edits the -// feemarket parameters to not use base fee -func (suite *AnteTestSuite) disableBaseFee(ctx sdk.Context) { - params := suite.app.FeeMarketKeeper.GetParams(ctx) - params.NoBaseFee = true - params.MinGasPrice = math.LegacyZeroDec() - err := suite.app.FeeMarketKeeper.SetParams(ctx, params) - suite.Require().NoError(err) -} - -// makeZeroFeeTx is a helper function that sets -// the GasPrice field to zero on the provided evmTxArgs -func makeZeroFeeTx(from common.Address, args evmtypes.EvmTxArgs) *evmtypes.MsgEthereumTx { - args.GasPrice = math.ZeroInt().BigInt() - tx := evmtypes.NewTx(&args) - tx.From = from.Hex() - return tx -} diff --git a/app/ante/evm/vesting_test.go b/app/ante/evm/vesting_test.go deleted file mode 100644 index b9a522e9d3..0000000000 --- a/app/ante/evm/vesting_test.go +++ /dev/null @@ -1,129 +0,0 @@ -package evm_test - -import ( - "math/big" - "time" - - "cosmossdk.io/math" - sdk "github.com/cosmos/cosmos-sdk/types" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - sdkvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" - - ethante "github.com/evmos/evmos/v16/app/ante/evm" - "github.com/evmos/evmos/v16/testutil" - testutiltx "github.com/evmos/evmos/v16/testutil/tx" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - vestingtypes "github.com/evmos/evmos/v16/x/vesting/types" -) - -// global variables used for testing the eth vesting ante handler -var ( - balances = sdk.NewCoins(sdk.NewInt64Coin("test", 1000)) - quarter = sdk.NewCoins(sdk.NewInt64Coin("test", 250)) - lockupPeriods = sdkvesting.Periods{{Length: 5000, Amount: balances}} - vestingPeriods = sdkvesting.Periods{ - {Length: 2000, Amount: quarter}, - {Length: 2000, Amount: quarter}, - {Length: 2000, Amount: quarter}, - {Length: 2000, Amount: quarter}, - } - vestingCoins = sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(1000000000))) -) - -// TestEthVestingTransactionDecorator tests the EthVestingTransactionDecorator ante handler. -func (suite *AnteTestSuite) TestEthVestingTransactionDecorator() { - addr := testutiltx.GenerateAddress() - - ethTxParams := &evmtypes.EvmTxArgs{ - ChainID: suite.app.EvmKeeper.ChainID(), - Nonce: 1, - To: &addr, - Amount: big.NewInt(1000000000), - GasLimit: 100000, - GasPrice: big.NewInt(1000000000), - } - tx := evmtypes.NewTx(ethTxParams) - tx.From = addr.Hex() - - testcases := []struct { - name string - tx sdk.Tx - malleate func() - expPass bool - errContains string - }{ - { - "pass - valid transaction, no vesting account", - tx, - func() { - acc := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, addr.Bytes()) - suite.app.AccountKeeper.SetAccount(suite.ctx, acc) - }, - true, - "", - }, - { - "fail - invalid transaction", - &testutiltx.InvalidTx{}, - func() {}, - false, - "invalid message type", - }, - { - "fail - from address not found", - tx, - func() {}, - false, - "does not exist: unknown address", - }, - { - "pass - valid transaction, vesting account", - tx, - func() { - baseAcc := authtypes.NewBaseAccountWithAddress(addr.Bytes()) - vestingAcc := vestingtypes.NewClawbackVestingAccount( - baseAcc, addr.Bytes(), vestingCoins, time.Now(), lockupPeriods, vestingPeriods, - ) - acc := suite.app.AccountKeeper.NewAccount(suite.ctx, vestingAcc) - suite.app.AccountKeeper.SetAccount(suite.ctx, acc) - - denom := suite.app.EvmKeeper.GetParams(suite.ctx).EvmDenom - coins := sdk.NewCoins(sdk.NewCoin(denom, math.NewInt(1000000000))) - err := testutil.FundAccount(suite.ctx, suite.app.BankKeeper, addr.Bytes(), coins) - suite.Require().NoError(err, "failed to fund account") - }, - true, - "", - }, - { - "fail - valid transaction, vesting account, no balance", - tx, - func() { - baseAcc := authtypes.NewBaseAccountWithAddress(addr.Bytes()) - vestingAcc := vestingtypes.NewClawbackVestingAccount( - baseAcc, addr.Bytes(), vestingCoins, time.Now(), lockupPeriods, vestingPeriods, - ) - acc := suite.app.AccountKeeper.NewAccount(suite.ctx, vestingAcc) - suite.app.AccountKeeper.SetAccount(suite.ctx, acc) - }, - false, - "account has no balance to execute transaction", - }, - } - - for _, tc := range testcases { - suite.Run(tc.name, func() { - suite.SetupTest() - tc.malleate() - - dec := ethante.NewEthVestingTransactionDecorator(suite.app.AccountKeeper, suite.app.BankKeeper, suite.app.EvmKeeper) - _, err := dec.AnteHandle(suite.ctx, tc.tx, false, testutil.NextFn) - - if tc.expPass { - suite.Require().NoError(err, tc.name) - } else { - suite.Require().ErrorContains(err, tc.errContains, tc.name) - } - }) - } -} diff --git a/testutil/integration/common/grpc/bank.go b/testutil/integration/common/grpc/bank.go index a2baaa15e4..fe30608cb3 100644 --- a/testutil/integration/common/grpc/bank.go +++ b/testutil/integration/common/grpc/bank.go @@ -9,7 +9,7 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" ) -// GetBalance returns the balance for the given address. +// GetBalance returns the balance for the given address and denom. func (gqh *IntegrationHandler) GetBalance(address sdktypes.AccAddress, denom string) (*banktypes.QueryBalanceResponse, error) { bankClient := gqh.network.GetBankClient() return bankClient.Balance(context.Background(), &banktypes.QueryBalanceRequest{ @@ -17,3 +17,11 @@ func (gqh *IntegrationHandler) GetBalance(address sdktypes.AccAddress, denom str Denom: denom, }) } + +// GetAllBalance returns all the balances for the given address. +func (gqh *IntegrationHandler) GetAllBalances(address sdktypes.AccAddress) (*banktypes.QueryAllBalancesResponse, error) { + bankClient := gqh.network.GetBankClient() + return bankClient.AllBalances(context.Background(), &banktypes.QueryAllBalancesRequest{ + Address: address.String(), + }) +} diff --git a/testutil/integration/common/grpc/grpc.go b/testutil/integration/common/grpc/grpc.go index cd4103eec2..6e8ea9e485 100644 --- a/testutil/integration/common/grpc/grpc.go +++ b/testutil/integration/common/grpc/grpc.go @@ -28,6 +28,7 @@ type Handler interface { // Bank methods GetBalance(address sdktypes.AccAddress, denom string) (*banktypes.QueryBalanceResponse, error) + GetAllBalances(address sdktypes.AccAddress) (*banktypes.QueryAllBalancesResponse, error) // Staking methods GetDelegation(delegatorAddress string, validatorAddress string) (*stakingtypes.QueryDelegationResponse, error) diff --git a/testutil/integration/common/network/network.go b/testutil/integration/common/network/network.go index e5e9b757d8..52c77ba137 100644 --- a/testutil/integration/common/network/network.go +++ b/testutil/integration/common/network/network.go @@ -7,7 +7,6 @@ import ( "testing" "time" - sdkmath "cosmossdk.io/math" abcitypes "github.com/cometbft/cometbft/abci/types" sdktypes "github.com/cosmos/cosmos-sdk/types" txtypes "github.com/cosmos/cosmos-sdk/types/tx" @@ -44,10 +43,4 @@ type Network interface { // NOTE: this is only used for testing IBC related functionality. // The idea is to deprecate this eventually. GetIBCChain(t *testing.T, coord *ibctesting.Coordinator) *ibctesting.TestChain - - // FundAccount funds the given account with the given amount. - FundAccount(address sdktypes.AccAddress, amount sdktypes.Coins) error - // FundAccountWithBaseDenom funds the given account with the given amount of the network's - // base denomination. - FundAccountWithBaseDenom(address sdktypes.AccAddress, amount sdkmath.Int) error } diff --git a/testutil/integration/evmos/factory/broadcast.go b/testutil/integration/evmos/factory/broadcast.go new file mode 100644 index 0000000000..fe18e572b2 --- /dev/null +++ b/testutil/integration/evmos/factory/broadcast.go @@ -0,0 +1,111 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) +package factory + +import ( + errorsmod "cosmossdk.io/errors" + abcitypes "github.com/cometbft/cometbft/abci/types" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/evmos/evmos/v16/precompiles/testutil" + evmtypes "github.com/evmos/evmos/v16/x/evm/types" +) + +// ExecuteEthTx executes an Ethereum transaction - contract call with the provided private key and txArgs +// It first builds a MsgEthereumTx and then broadcasts it to the network. +func (tf *IntegrationTxFactory) ExecuteEthTx( + priv cryptotypes.PrivKey, + txArgs evmtypes.EvmTxArgs, +) (abcitypes.ResponseDeliverTx, error) { + signedMsg, err := tf.GenerateSignedEthTx(priv, txArgs) + if err != nil { + return abcitypes.ResponseDeliverTx{}, errorsmod.Wrap(err, "failed to generate signed ethereum tx") + } + + txBytes, err := tf.encodeTx(signedMsg) + if err != nil { + return abcitypes.ResponseDeliverTx{}, errorsmod.Wrap(err, "failed to encode ethereum tx") + } + + res, err := tf.network.BroadcastTxSync(txBytes) + if err != nil { + return abcitypes.ResponseDeliverTx{}, errorsmod.Wrap(err, "failed to broadcast ethereum tx") + } + + if err := tf.checkEthTxResponse(&res); err != nil { + return res, errorsmod.Wrap(err, "failed ETH tx") + } + return res, nil +} + +// ExecuteContractCall executes a contract call with the provided private key +func (tf *IntegrationTxFactory) ExecuteContractCall(privKey cryptotypes.PrivKey, txArgs evmtypes.EvmTxArgs, callArgs CallArgs) (abcitypes.ResponseDeliverTx, error) { + // Create MsgEthereumTx that calls the contract + input, err := callArgs.ContractABI.Pack(callArgs.MethodName, callArgs.Args...) + if err != nil { + return abcitypes.ResponseDeliverTx{}, errorsmod.Wrap(err, "failed to pack contract arguments") + } + txArgs.Input = input + + return tf.ExecuteEthTx(privKey, txArgs) +} + +// DeployContract deploys a contract with the provided private key, +// compiled contract data and constructor arguments. +// TxArgs Input and Nonce fields are overwritten. +func (tf *IntegrationTxFactory) DeployContract( + priv cryptotypes.PrivKey, + txArgs evmtypes.EvmTxArgs, + deploymentData ContractDeploymentData, +) (common.Address, error) { + // Get account's nonce to create contract hash + from := common.BytesToAddress(priv.PubKey().Address().Bytes()) + account, err := tf.grpcHandler.GetEvmAccount(from) + if err != nil { + return common.Address{}, errorsmod.Wrapf(err, "failed to get evm account: %s", from.String()) + } + nonce := account.GetNonce() + + ctorArgs, err := deploymentData.Contract.ABI.Pack("", deploymentData.ConstructorArgs...) + if err != nil { + return common.Address{}, errorsmod.Wrap(err, "failed to pack constructor arguments") + } + data := deploymentData.Contract.Bin + data = append(data, ctorArgs...) + + txArgs.Input = data + txArgs.Nonce = nonce + res, err := tf.ExecuteEthTx(priv, txArgs) + if err != nil || !res.IsOK() { + return common.Address{}, errorsmod.Wrap(err, "failed to execute eth tx") + } + return crypto.CreateAddress(from, nonce), nil +} + +// CallContractAndCheckLogs is a helper function to call a contract and check the logs using +// the integration test utilities. +// +// It returns the Cosmos Tx response, the decoded Ethereum Tx response and an error. This error value +// is nil, if the expected logs are found and the VM error is the expected one, should one be expected. +func (tf *IntegrationTxFactory) CallContractAndCheckLogs( + priv cryptotypes.PrivKey, + txArgs evmtypes.EvmTxArgs, + callArgs CallArgs, + logCheckArgs testutil.LogCheckArgs, +) (abcitypes.ResponseDeliverTx, *evmtypes.MsgEthereumTxResponse, error) { + res, err := tf.ExecuteContractCall(priv, txArgs, callArgs) + logCheckArgs.Res = res + if err != nil { + // NOTE: here we are still passing the response to the log check function, + // because we want to check the logs and expected error in case of a VM error. + return abcitypes.ResponseDeliverTx{}, nil, CheckError(err, logCheckArgs) + } + + ethRes, err := evmtypes.DecodeTxResponse(res.Data) + if err != nil { + return abcitypes.ResponseDeliverTx{}, nil, err + } + + return res, ethRes, testutil.CheckLogs(logCheckArgs) +} diff --git a/testutil/integration/evmos/factory/build.go b/testutil/integration/evmos/factory/build.go new file mode 100644 index 0000000000..ef197b9728 --- /dev/null +++ b/testutil/integration/evmos/factory/build.go @@ -0,0 +1,78 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) +package factory + +import ( + "encoding/json" + "errors" + "math/big" + + errorsmod "cosmossdk.io/errors" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + "github.com/cosmos/cosmos-sdk/x/auth/signing" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + gethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/evmos/evmos/v16/server/config" + evmtypes "github.com/evmos/evmos/v16/x/evm/types" +) + +func (tf *IntegrationTxFactory) GenerateDefaultTxTypeArgs(sender common.Address, txType int) (evmtypes.EvmTxArgs, error) { + defaultArgs := evmtypes.EvmTxArgs{} + switch txType { + case gethtypes.DynamicFeeTxType: + return tf.populateEvmTxArgs(sender, defaultArgs) + case gethtypes.AccessListTxType: + defaultArgs.Accesses = &gethtypes.AccessList{{ + Address: sender, + StorageKeys: []common.Hash{{0}}, + }} + defaultArgs.GasPrice = big.NewInt(1e9) + return tf.populateEvmTxArgs(sender, defaultArgs) + case gethtypes.LegacyTxType: + defaultArgs.GasPrice = big.NewInt(1e9) + return tf.populateEvmTxArgs(sender, defaultArgs) + default: + return evmtypes.EvmTxArgs{}, errors.New("tx type not supported") + } +} + +// EstimateGasLimit estimates the gas limit for a tx with the provided address and txArgs +func (tf *IntegrationTxFactory) EstimateGasLimit(from *common.Address, txArgs *evmtypes.EvmTxArgs) (uint64, error) { + args, err := json.Marshal(evmtypes.TransactionArgs{ + Data: (*hexutil.Bytes)(&txArgs.Input), + From: from, + To: txArgs.To, + AccessList: txArgs.Accesses, + }) + if err != nil { + return 0, errorsmod.Wrap(err, "failed to marshal tx args") + } + + res, err := tf.grpcHandler.EstimateGas(args, config.DefaultGasCap) + if err != nil { + return 0, errorsmod.Wrap(err, "failed to estimate gas") + } + gas := res.Gas + return gas, nil +} + +// GenerateSignedEthTx generates an Ethereum tx with the provided private key and txArgs but does not broadcast it. +func (tf *IntegrationTxFactory) GenerateSignedEthTx(privKey cryptotypes.PrivKey, txArgs evmtypes.EvmTxArgs) (signing.Tx, error) { + msgEthereumTx, err := tf.createMsgEthereumTx(privKey, txArgs) + if err != nil { + return nil, errorsmod.Wrap(err, "failed to create ethereum tx") + } + + signedMsg, err := tf.SignMsgEthereumTx(privKey, msgEthereumTx) + if err != nil { + return nil, errorsmod.Wrap(err, "failed to sign ethereum tx") + } + + // Validate the transaction to avoid unrealistic behavior + if err = signedMsg.ValidateBasic(); err != nil { + return nil, errorsmod.Wrap(err, "failed to validate transaction") + } + + return tf.buildSignedTx(signedMsg) +} diff --git a/testutil/integration/evmos/factory/factory.go b/testutil/integration/evmos/factory/factory.go index 3a4a17bd6e..83868aebbc 100644 --- a/testutil/integration/evmos/factory/factory.go +++ b/testutil/integration/evmos/factory/factory.go @@ -4,10 +4,8 @@ package factory import ( - "encoding/json" "fmt" "math/big" - "strings" errorsmod "cosmossdk.io/errors" abcitypes "github.com/cometbft/cometbft/abci/types" @@ -17,11 +15,8 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/signing" "github.com/cosmos/gogoproto/proto" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/crypto" "github.com/evmos/evmos/v16/app" "github.com/evmos/evmos/v16/precompiles/testutil" - "github.com/evmos/evmos/v16/server/config" commonfactory "github.com/evmos/evmos/v16/testutil/integration/common/factory" "github.com/evmos/evmos/v16/testutil/integration/evmos/grpc" "github.com/evmos/evmos/v16/testutil/integration/evmos/network" @@ -29,27 +24,36 @@ import ( evmtypes "github.com/evmos/evmos/v16/x/evm/types" ) +// TxFactory defines a struct that can build and broadcast transactions for the Evmos +// network. +// Methods are organized by build sign and broadcast type methods. type TxFactory interface { commonfactory.TxFactory + // GenerateDefaultTxTypeArgs generates a default ETH tx args for the desired tx type + GenerateDefaultTxTypeArgs(sender common.Address, txType int) (evmtypes.EvmTxArgs, error) + // EstimateGasLimit estimates the gas limit for a tx with the provided address and txArgs + EstimateGasLimit(from *common.Address, txArgs *evmtypes.EvmTxArgs) (uint64, error) + // GenerateSignedEthTx generates an Ethereum tx with the provided private key and txArgs but does not broadcast it. + GenerateSignedEthTx(privKey cryptotypes.PrivKey, txArgs evmtypes.EvmTxArgs) (signing.Tx, error) + + // SignMsgEthereumTx signs a MsgEthereumTx with the provided private key. + SignMsgEthereumTx(privKey cryptotypes.PrivKey, msgEthereumTx evmtypes.MsgEthereumTx) (evmtypes.MsgEthereumTx, error) + + // ExecuteEthTx builds, signs and broadcasts an Ethereum tx with the provided private key and txArgs. + // If the txArgs are not provided, they will be populated with default values or gas estimations. + ExecuteEthTx(privKey cryptotypes.PrivKey, txArgs evmtypes.EvmTxArgs) (abcitypes.ResponseDeliverTx, error) + // ExecuteContractCall executes a contract call with the provided private key + ExecuteContractCall(privKey cryptotypes.PrivKey, txArgs evmtypes.EvmTxArgs, callArgs CallArgs) (abcitypes.ResponseDeliverTx, error) + // DeployContract deploys a contract with the provided private key, + // compiled contract data and constructor arguments + DeployContract(privKey cryptotypes.PrivKey, txArgs evmtypes.EvmTxArgs, deploymentData ContractDeploymentData) (common.Address, error) // CallContractAndCheckLogs is a helper function to call a contract and check the logs using // the integration test utilities. // // It returns the Cosmos Tx response, the decoded Ethereum Tx response and an error. This error value // is nil, if the expected logs are found and the VM error is the expected one, should one be expected. CallContractAndCheckLogs(privKey cryptotypes.PrivKey, txArgs evmtypes.EvmTxArgs, callArgs CallArgs, logCheckArgs testutil.LogCheckArgs) (abcitypes.ResponseDeliverTx, *evmtypes.MsgEthereumTxResponse, error) - // DeployContract deploys a contract with the provided private key, - // compiled contract data and constructor arguments - DeployContract(privKey cryptotypes.PrivKey, txArgs evmtypes.EvmTxArgs, deploymentData ContractDeploymentData) (common.Address, error) - // ExecuteContractCall executes a contract call with the provided private key - ExecuteContractCall(privKey cryptotypes.PrivKey, txArgs evmtypes.EvmTxArgs, callArgs CallArgs) (abcitypes.ResponseDeliverTx, error) - // GenerateSignedEthTx generates an Ethereum tx with the provided private key and txArgs but does not broadcast it. - GenerateSignedEthTx(privKey cryptotypes.PrivKey, txArgs evmtypes.EvmTxArgs) (signing.Tx, error) - // ExecuteEthTx builds, signs and broadcasts an Ethereum tx with the provided private key and txArgs. - // If the txArgs are not provided, they will be populated with default values or gas estimations. - ExecuteEthTx(privKey cryptotypes.PrivKey, txArgs evmtypes.EvmTxArgs) (abcitypes.ResponseDeliverTx, error) - // EstimateGasLimit estimates the gas limit for a tx with the provided address and txArgs - EstimateGasLimit(from *common.Address, txArgs *evmtypes.EvmTxArgs) (uint64, error) } var _ TxFactory = (*IntegrationTxFactory)(nil) @@ -77,158 +81,6 @@ func New( } } -// GenerateSignedEthTx generates an Ethereum tx with the provided private key and txArgs but does not broadcast it. -func (tf *IntegrationTxFactory) GenerateSignedEthTx(privKey cryptotypes.PrivKey, txArgs evmtypes.EvmTxArgs) (signing.Tx, error) { - msgEthereumTx, err := tf.createMsgEthereumTx(privKey, txArgs) - if err != nil { - return nil, errorsmod.Wrap(err, "failed to create ethereum tx") - } - - signedMsg, err := signMsgEthereumTx(msgEthereumTx, privKey, tf.network.GetChainID()) - if err != nil { - return nil, errorsmod.Wrap(err, "failed to sign ethereum tx") - } - - return tf.buildSignedTx(signedMsg) -} - -// CallContractAndCheckLogs is a helper function to call a contract and check the logs using -// the integration test utilities. -// -// It returns the Cosmos Tx response, the decoded Ethereum Tx response and an error. This error value -// is nil, if the expected logs are found and the VM error is the expected one, should one be expected. -func (tf *IntegrationTxFactory) CallContractAndCheckLogs( - priv cryptotypes.PrivKey, - txArgs evmtypes.EvmTxArgs, - callArgs CallArgs, - logCheckArgs testutil.LogCheckArgs, -) (abcitypes.ResponseDeliverTx, *evmtypes.MsgEthereumTxResponse, error) { - res, err := tf.ExecuteContractCall(priv, txArgs, callArgs) - logCheckArgs.Res = res - if err != nil { - // NOTE: here we are still passing the response to the log check function, - // because we want to check the logs and expected error in case of a VM error. - return abcitypes.ResponseDeliverTx{}, nil, CheckError(err, logCheckArgs) - } - - ethRes, err := evmtypes.DecodeTxResponse(res.Data) - if err != nil { - return abcitypes.ResponseDeliverTx{}, nil, err - } - - return res, ethRes, testutil.CheckLogs(logCheckArgs) -} - -// CheckError is a helper function to check if the error is the expected one. -func CheckError(err error, logCheckArgs testutil.LogCheckArgs) error { - switch { - case logCheckArgs.ExpPass && err == nil: - return nil - case !logCheckArgs.ExpPass && err == nil: - return errorsmod.Wrap(err, "expected error but got none") - case logCheckArgs.ExpPass && err != nil: - return errorsmod.Wrap(err, "expected no error but got one") - case logCheckArgs.ErrContains == "": - // NOTE: if err contains is empty, we return the error as it is - return errorsmod.Wrap(err, "ErrContains needs to be filled") - case !strings.Contains(err.Error(), logCheckArgs.ErrContains): - return errorsmod.Wrapf(err, "expected different error; wanted %q", logCheckArgs.ErrContains) - } - - return nil -} - -// DeployContract deploys a contract with the provided private key, -// compiled contract data and constructor arguments. -// TxArgs Input and Nonce fields are overwritten. -func (tf *IntegrationTxFactory) DeployContract( - priv cryptotypes.PrivKey, - txArgs evmtypes.EvmTxArgs, - deploymentData ContractDeploymentData, -) (common.Address, error) { - // Get account's nonce to create contract hash - from := common.BytesToAddress(priv.PubKey().Address().Bytes()) - account, err := tf.grpcHandler.GetEvmAccount(from) - if err != nil { - return common.Address{}, errorsmod.Wrapf(err, "failed to get evm account: %s", from.String()) - } - nonce := account.GetNonce() - - ctorArgs, err := deploymentData.Contract.ABI.Pack("", deploymentData.ConstructorArgs...) - if err != nil { - return common.Address{}, errorsmod.Wrap(err, "failed to pack constructor arguments") - } - data := deploymentData.Contract.Bin - data = append(data, ctorArgs...) - - txArgs.Input = data - txArgs.Nonce = nonce - res, err := tf.ExecuteEthTx(priv, txArgs) - if err != nil || !res.IsOK() { - return common.Address{}, errorsmod.Wrap(err, "failed to execute eth tx") - } - return crypto.CreateAddress(from, nonce), nil -} - -// ExecuteContractCall executes a contract call with the provided private key -func (tf *IntegrationTxFactory) ExecuteContractCall(privKey cryptotypes.PrivKey, txArgs evmtypes.EvmTxArgs, callArgs CallArgs) (abcitypes.ResponseDeliverTx, error) { - // Create MsgEthereumTx that calls the contract - input, err := callArgs.ContractABI.Pack(callArgs.MethodName, callArgs.Args...) - if err != nil { - return abcitypes.ResponseDeliverTx{}, errorsmod.Wrap(err, "failed to pack contract arguments") - } - txArgs.Input = input - - return tf.ExecuteEthTx(privKey, txArgs) -} - -// ExecuteEthTx executes an Ethereum transaction - contract call with the provided private key and txArgs -// It first builds a MsgEthereumTx and then broadcasts it to the network. -func (tf *IntegrationTxFactory) ExecuteEthTx( - priv cryptotypes.PrivKey, - txArgs evmtypes.EvmTxArgs, -) (abcitypes.ResponseDeliverTx, error) { - signedMsg, err := tf.GenerateSignedEthTx(priv, txArgs) - if err != nil { - return abcitypes.ResponseDeliverTx{}, errorsmod.Wrap(err, "failed to generate signed ethereum tx") - } - - txBytes, err := tf.encodeTx(signedMsg) - if err != nil { - return abcitypes.ResponseDeliverTx{}, errorsmod.Wrap(err, "failed to encode ethereum tx") - } - - res, err := tf.network.BroadcastTxSync(txBytes) - if err != nil { - return abcitypes.ResponseDeliverTx{}, errorsmod.Wrap(err, "failed to broadcast ethereum tx") - } - - if err := tf.checkEthTxResponse(&res); err != nil { - return res, errorsmod.Wrap(err, "failed ETH tx") - } - return res, nil -} - -// EstimateGasLimit estimates the gas limit for a tx with the provided address and txArgs -func (tf *IntegrationTxFactory) EstimateGasLimit(from *common.Address, txArgs *evmtypes.EvmTxArgs) (uint64, error) { - args, err := json.Marshal(evmtypes.TransactionArgs{ - Data: (*hexutil.Bytes)(&txArgs.Input), - From: from, - To: txArgs.To, - AccessList: txArgs.Accesses, - }) - if err != nil { - return 0, errorsmod.Wrap(err, "failed to marshal tx args") - } - - res, err := tf.grpcHandler.EstimateGas(args, config.DefaultGasCap) - if err != nil { - return 0, errorsmod.Wrap(err, "failed to estimate gas") - } - gas := res.Gas - return gas, nil -} - // createMsgEthereumTx creates a new MsgEthereumTx with the provided arguments. // If any of the arguments are not provided, they will be populated with default values. func (tf *IntegrationTxFactory) createMsgEthereumTx( diff --git a/testutil/integration/evmos/factory/helpers.go b/testutil/integration/evmos/factory/helpers.go index 2b0f148309..eb1a1c0bbd 100644 --- a/testutil/integration/evmos/factory/helpers.go +++ b/testutil/integration/evmos/factory/helpers.go @@ -3,20 +3,19 @@ package factory import ( + "strings" + "github.com/ethereum/go-ethereum/common" evmtypes "github.com/evmos/evmos/v16/x/evm/types" errorsmod "cosmossdk.io/errors" amino "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" - cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/cosmos/cosmos-sdk/types/module" testutiltypes "github.com/cosmos/cosmos-sdk/types/module/testutil" authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" - ethtypes "github.com/ethereum/go-ethereum/core/types" enccodec "github.com/evmos/evmos/v16/encoding/codec" - "github.com/evmos/evmos/v16/testutil/tx" - evmostypes "github.com/evmos/evmos/v16/types" + "github.com/evmos/evmos/v16/precompiles/testutil" ) // buildMsgEthereumTx builds an Ethereum transaction from the given arguments and populates the From field. @@ -26,26 +25,6 @@ func buildMsgEthereumTx(txArgs evmtypes.EvmTxArgs, fromAddr common.Address) evmt return *msgEthereumTx } -// signMsgEthereumTx signs a MsgEthereumTx with the provided private key and chainID. -func signMsgEthereumTx(msgEthereumTx evmtypes.MsgEthereumTx, privKey cryptotypes.PrivKey, chainID string) (evmtypes.MsgEthereumTx, error) { - ethChainID, err := evmostypes.ParseChainID(chainID) - if err != nil { - return evmtypes.MsgEthereumTx{}, errorsmod.Wrapf(err, "failed to parse chainID: %v", chainID) - } - - signer := ethtypes.LatestSignerForChainID(ethChainID) - err = msgEthereumTx.Sign(signer, tx.NewSigner(privKey)) - if err != nil { - return evmtypes.MsgEthereumTx{}, errorsmod.Wrap(err, "failed to sign transaction") - } - - // Validate the transaction to avoid unrealistic behavior - if err = msgEthereumTx.ValidateBasic(); err != nil { - return evmtypes.MsgEthereumTx{}, errorsmod.Wrap(err, "failed to validate transaction") - } - return msgEthereumTx, nil -} - // makeConfig creates an EncodingConfig for testing func makeConfig(mb module.BasicManager) testutiltypes.TestEncodingConfig { cdc := amino.NewLegacyAmino() @@ -65,3 +44,22 @@ func makeConfig(mb module.BasicManager) testutiltypes.TestEncodingConfig { mb.RegisterInterfaces(encodingConfig.InterfaceRegistry) return encodingConfig } + +// CheckError is a helper function to check if the error is the expected one. +func CheckError(err error, logCheckArgs testutil.LogCheckArgs) error { + switch { + case logCheckArgs.ExpPass && err == nil: + return nil + case !logCheckArgs.ExpPass && err == nil: + return errorsmod.Wrap(err, "expected error but got none") + case logCheckArgs.ExpPass && err != nil: + return errorsmod.Wrap(err, "expected no error but got one") + case logCheckArgs.ErrContains == "": + // NOTE: if err contains is empty, we return the error as it is + return errorsmod.Wrap(err, "ErrContains needs to be filled") + case !strings.Contains(err.Error(), logCheckArgs.ErrContains): + return errorsmod.Wrapf(err, "expected different error; wanted %q", logCheckArgs.ErrContains) + } + + return nil +} diff --git a/testutil/integration/evmos/factory/sign.go b/testutil/integration/evmos/factory/sign.go new file mode 100644 index 0000000000..803b985c75 --- /dev/null +++ b/testutil/integration/evmos/factory/sign.go @@ -0,0 +1,22 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) +package factory + +import ( + errorsmod "cosmossdk.io/errors" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + gethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/evmos/evmos/v16/testutil/tx" + evmtypes "github.com/evmos/evmos/v16/x/evm/types" +) + +// SignMsgEthereumTx signs a MsgEthereumTx with the provided private key and chainID. +func (tf *IntegrationTxFactory) SignMsgEthereumTx(privKey cryptotypes.PrivKey, msgEthereumTx evmtypes.MsgEthereumTx) (evmtypes.MsgEthereumTx, error) { + ethChainID := tf.network.GetEIP155ChainID() + signer := gethtypes.LatestSignerForChainID(ethChainID) + err := msgEthereumTx.Sign(signer, tx.NewSigner(privKey)) + if err != nil { + return evmtypes.MsgEthereumTx{}, errorsmod.Wrap(err, "failed to sign transaction") + } + return msgEthereumTx, nil +} diff --git a/testutil/integration/evmos/grpc/feemarket.go b/testutil/integration/evmos/grpc/feemarket.go index 5ed1578956..62153882ef 100644 --- a/testutil/integration/evmos/grpc/feemarket.go +++ b/testutil/integration/evmos/grpc/feemarket.go @@ -13,3 +13,9 @@ func (gqh *IntegrationHandler) GetBaseFee() (*feemarkettypes.QueryBaseFeeRespons feeMarketClient := gqh.network.GetFeeMarketClient() return feeMarketClient.BaseFee(context.Background(), &feemarkettypes.QueryBaseFeeRequest{}) } + +// GetBaseFee returns the base fee from the feemarket module. +func (gqh *IntegrationHandler) GetFeeMarketParams() (*feemarkettypes.QueryParamsResponse, error) { + feeMarketClient := gqh.network.GetFeeMarketClient() + return feeMarketClient.Params(context.Background(), &feemarkettypes.QueryParamsRequest{}) +} diff --git a/testutil/integration/evmos/grpc/grpc.go b/testutil/integration/evmos/grpc/grpc.go index e45ca327b7..f6a8f6cfcd 100644 --- a/testutil/integration/evmos/grpc/grpc.go +++ b/testutil/integration/evmos/grpc/grpc.go @@ -24,6 +24,7 @@ type Handler interface { // FeeMarket methods GetBaseFee() (*feemarkettypes.QueryBaseFeeResponse, error) + GetFeeMarketParams() (*feemarkettypes.QueryParamsResponse, error) // Gov methods GetProposal(proposalID uint64) (*govtypes.QueryProposalResponse, error) diff --git a/testutil/integration/evmos/network/abci.go b/testutil/integration/evmos/network/abci.go index a2ffb842e9..efca125de6 100644 --- a/testutil/integration/evmos/network/abci.go +++ b/testutil/integration/evmos/network/abci.go @@ -37,7 +37,6 @@ func (n *IntegrationNetwork) NextBlockAfter(duration time.Duration) error { // Update context header newCtx := n.app.BaseApp.NewContext(false, header) newCtx = newCtx.WithMinGasPrices(n.ctx.MinGasPrices()) - newCtx = newCtx.WithEventManager(n.ctx.EventManager()) newCtx = newCtx.WithKVGasConfig(n.ctx.KVGasConfig()) newCtx = newCtx.WithTransientKVGasConfig(n.ctx.TransientKVGasConfig()) newCtx = newCtx.WithConsensusParams(n.ctx.ConsensusParams()) diff --git a/testutil/integration/evmos/network/fund.go b/testutil/integration/evmos/network/fund.go deleted file mode 100644 index cf5eebff23..0000000000 --- a/testutil/integration/evmos/network/fund.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package network - -import ( - sdkmath "cosmossdk.io/math" - sdk "github.com/cosmos/cosmos-sdk/types" - inflationtypes "github.com/evmos/evmos/v16/x/inflation/v1/types" -) - -// FundAccount funds the given account with the given amount of coins. -func (n *IntegrationNetwork) FundAccount(addr sdk.AccAddress, coins sdk.Coins) error { - ctx := n.GetContext() - - if err := n.app.BankKeeper.MintCoins(ctx, inflationtypes.ModuleName, coins); err != nil { - return err - } - - return n.app.BankKeeper.SendCoinsFromModuleToAccount(ctx, inflationtypes.ModuleName, addr, coins) -} - -// FundAccountWithBaseDenom funds the given account with the given amount of the network's -// base denomination. -func (n *IntegrationNetwork) FundAccountWithBaseDenom(addr sdk.AccAddress, amount sdkmath.Int) error { - return n.FundAccount(addr, sdk.NewCoins(sdk.NewCoin(n.GetDenom(), amount))) -} diff --git a/testutil/integration/evmos/network/network.go b/testutil/integration/evmos/network/network.go index a69448d974..bab529ed8d 100644 --- a/testutil/integration/evmos/network/network.go +++ b/testutil/integration/evmos/network/network.go @@ -10,6 +10,7 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + gethparams "github.com/ethereum/go-ethereum/params" "github.com/evmos/evmos/v16/app" "github.com/evmos/evmos/v16/types" @@ -36,6 +37,7 @@ type Network interface { commonnetwork.Network GetEIP155ChainID() *big.Int + GetEVMChainConfig() *gethparams.ChainConfig // Clients GetERC20Client() erc20types.QueryClient @@ -51,6 +53,7 @@ type Network interface { UpdateGovParams(params govtypes.Params) error UpdateInflationParams(params infltypes.Params) error UpdateRevenueParams(params revtypes.Params) error + UpdateFeeMarketParams(params feemarkettypes.Params) error } var _ Network = (*IntegrationNetwork)(nil) @@ -227,6 +230,12 @@ func (n *IntegrationNetwork) GetEIP155ChainID() *big.Int { return n.cfg.eip155ChainID } +// GetChainConfig returns the network's chain config +func (n *IntegrationNetwork) GetEVMChainConfig() *gethparams.ChainConfig { + params := n.app.EvmKeeper.GetParams(n.ctx) + return params.ChainConfig.EthereumConfig(n.cfg.eip155ChainID) +} + // GetDenom returns the network's denom func (n *IntegrationNetwork) GetDenom() string { return n.cfg.denom diff --git a/testutil/integration/evmos/network/params.go b/testutil/integration/evmos/network/params.go index 82fa103d4a..a44a7887e2 100644 --- a/testutil/integration/evmos/network/params.go +++ b/testutil/integration/evmos/network/params.go @@ -6,6 +6,7 @@ package network import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1" evmtypes "github.com/evmos/evmos/v16/x/evm/types" + feemarketypes "github.com/evmos/evmos/v16/x/feemarket/types" infltypes "github.com/evmos/evmos/v16/x/inflation/v1/types" revtypes "github.com/evmos/evmos/v16/x/revenue/v1/types" ) @@ -14,6 +15,10 @@ func (n *IntegrationNetwork) UpdateEvmParams(params evmtypes.Params) error { return n.app.EvmKeeper.SetParams(n.ctx, params) } +func (n *IntegrationNetwork) UpdateFeeMarketParams(params feemarketypes.Params) error { + return n.app.FeeMarketKeeper.SetParams(n.ctx, params) +} + func (n *IntegrationNetwork) UpdateRevenueParams(params revtypes.Params) error { return n.app.RevenueKeeper.SetParams(n.ctx, params) } diff --git a/testutil/integration/evmos/network/unit_network.go b/testutil/integration/evmos/network/unit_network.go index f4259fe387..42f64b63a0 100644 --- a/testutil/integration/evmos/network/unit_network.go +++ b/testutil/integration/evmos/network/unit_network.go @@ -3,9 +3,11 @@ package network import ( + sdktypes "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" "github.com/evmos/evmos/v16/app" "github.com/evmos/evmos/v16/x/evm/statedb" + inflationtypes "github.com/evmos/evmos/v16/x/inflation/v1/types" ) // UnitTestNetwork is the implementation of the Network interface for unit tests. @@ -41,3 +43,14 @@ func (n *UnitTestNetwork) GetStateDB() *statedb.StateDB { statedb.NewEmptyTxConfig(common.BytesToHash(headerHash.Bytes())), ) } + +// FundAccount funds the given account with the given amount of coins. +func (n *UnitTestNetwork) FundAccount(addr sdktypes.AccAddress, coins sdktypes.Coins) error { + ctx := n.GetContext() + + if err := n.app.BankKeeper.MintCoins(ctx, inflationtypes.ModuleName, coins); err != nil { + return err + } + + return n.app.BankKeeper.SendCoinsFromModuleToAccount(ctx, inflationtypes.ModuleName, addr, coins) +} diff --git a/x/evm/types/tx.go b/x/evm/types/tx.go index a60866f4c4..df1a1e39b3 100644 --- a/x/evm/types/tx.go +++ b/x/evm/types/tx.go @@ -27,6 +27,12 @@ type EvmTxArgs struct { Accesses *ethtypes.AccessList } +// ToTxData converts the EvmTxArgs to TxData +func (args *EvmTxArgs) ToTxData() (TxData, error) { + ethTx := NewTx(args).AsTransaction() + return NewTxDataFromTx(ethTx) +} + // GetTxPriority returns the priority of a given Ethereum tx. It relies of the // priority reduction global variable to calculate the tx priority given the tx // tip price: diff --git a/x/evm/types/tx_types.go b/x/evm/types/tx_types.go new file mode 100644 index 0000000000..f1debce932 --- /dev/null +++ b/x/evm/types/tx_types.go @@ -0,0 +1,20 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) +package types + +import ( + gethtypes "github.com/ethereum/go-ethereum/core/types" +) + +func GetTxTypeName(txType int) string { + switch txType { + case gethtypes.DynamicFeeTxType: + return "DynamicFeeTxType" + case gethtypes.LegacyTxType: + return "LegacyTxType" + case gethtypes.AccessListTxType: + return "AccessListTxType" + default: + panic("unknown tx type") + } +} From 98a59b9869a01e9f7ea8c4aba7d72738a1b1e365 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 Jan 2024 14:18:49 +0100 Subject: [PATCH 079/345] build(deps): bump github.com/onsi/gomega from 1.30.0 to 1.31.0 (#2279) Bumps [github.com/onsi/gomega](https://github.com/onsi/gomega) from 1.30.0 to 1.31.0. - [Release notes](https://github.com/onsi/gomega/releases) - [Changelog](https://github.com/onsi/gomega/blob/master/CHANGELOG.md) - [Commits](https://github.com/onsi/gomega/compare/v1.30.0...v1.31.0) --- updated-dependencies: - dependency-name: github.com/onsi/gomega dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 389176d4e5..8414d3c0d5 100644 --- a/go.mod +++ b/go.mod @@ -31,7 +31,7 @@ require ( github.com/improbable-eng/grpc-web v0.15.0 github.com/linxGnu/grocksdb v1.8.11 github.com/onsi/ginkgo/v2 v2.14.0 - github.com/onsi/gomega v1.30.0 + github.com/onsi/gomega v1.31.0 github.com/ory/dockertest/v3 v3.10.0 github.com/pkg/errors v0.9.1 github.com/rakyll/statik v0.1.7 diff --git a/go.sum b/go.sum index c8775931a4..8edd12f698 100644 --- a/go.sum +++ b/go.sum @@ -925,8 +925,8 @@ github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5 github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= -github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= +github.com/onsi/gomega v1.31.0 h1:54UJxxj6cPInHS3a35wm6BK/F9nHYueZ1NVujHDrnXE= +github.com/onsi/gomega v1.31.0/go.mod h1:DW9aCi7U6Yi40wNVAvT6kzFnEVEI5n3DloYBiKiT6zk= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= From 85fc04204dd2822124dc999bb550bf5905c7d07a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 Jan 2024 14:39:21 +0100 Subject: [PATCH 080/345] build(deps): bump github.com/onsi/ginkgo/v2 from 2.14.0 to 2.15.0 (#2278) Bumps [github.com/onsi/ginkgo/v2](https://github.com/onsi/ginkgo) from 2.14.0 to 2.15.0. - [Release notes](https://github.com/onsi/ginkgo/releases) - [Changelog](https://github.com/onsi/ginkgo/blob/master/CHANGELOG.md) - [Commits](https://github.com/onsi/ginkgo/compare/v2.14.0...v2.15.0) --- updated-dependencies: - dependency-name: github.com/onsi/ginkgo/v2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 8414d3c0d5..0f6f705071 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,7 @@ require ( github.com/hashicorp/go-version v1.6.0 github.com/improbable-eng/grpc-web v0.15.0 github.com/linxGnu/grocksdb v1.8.11 - github.com/onsi/ginkgo/v2 v2.14.0 + github.com/onsi/ginkgo/v2 v2.15.0 github.com/onsi/gomega v1.31.0 github.com/ory/dockertest/v3 v3.10.0 github.com/pkg/errors v0.9.1 diff --git a/go.sum b/go.sum index 8edd12f698..ba75885859 100644 --- a/go.sum +++ b/go.sum @@ -919,8 +919,8 @@ github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= -github.com/onsi/ginkgo/v2 v2.14.0 h1:vSmGj2Z5YPb9JwCWT6z6ihcUvDhuXLc3sJiqd3jMKAY= -github.com/onsi/ginkgo/v2 v2.14.0/go.mod h1:JkUdW7JkN0V6rFvsHcJ478egV3XH9NxpD27Hal/PhZw= +github.com/onsi/ginkgo/v2 v2.15.0 h1:79HwNRBAZHOEwrczrgSOPy+eFTTlIGELKy5as+ClttY= +github.com/onsi/ginkgo/v2 v2.15.0/go.mod h1:HlxMHtYF57y6Dpf+mc5529KKmSq9h2FpCF+/ZkwUxKM= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= From e244f16fe894f7477806c851c9346bd38673bbd8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Jan 2024 10:00:08 +0100 Subject: [PATCH 081/345] build(deps): bump cachix/install-nix-action from 24 to 25 (#2266) Bumps [cachix/install-nix-action](https://github.com/cachix/install-nix-action) from 24 to 25. - [Release notes](https://github.com/cachix/install-nix-action/releases) - [Commits](https://github.com/cachix/install-nix-action/compare/v24...v25) --- updated-dependencies: - dependency-name: cachix/install-nix-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> --- .github/workflows/e2e-test-release.yml | 4 ++-- .github/workflows/e2e-test.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/e2e-test-release.yml b/.github/workflows/e2e-test-release.yml index 56179a2da9..4dab8408bd 100644 --- a/.github/workflows/e2e-test-release.yml +++ b/.github/workflows/e2e-test-release.yml @@ -23,7 +23,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: cachix/install-nix-action@v24 + - uses: cachix/install-nix-action@v25 with: # pin to nix-2.13 to workaround compability issue of 2.14, # see: https://github.com/cachix/install-nix-action/issues/161 @@ -57,7 +57,7 @@ jobs: runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 - - uses: cachix/install-nix-action@v24 + - uses: cachix/install-nix-action@v25 with: # pin to nix-2.13 to workaround compability issue of 2.14, # see: https://github.com/cachix/install-nix-action/issues/161 diff --git a/.github/workflows/e2e-test.yml b/.github/workflows/e2e-test.yml index f6e88d2376..e558c17e06 100644 --- a/.github/workflows/e2e-test.yml +++ b/.github/workflows/e2e-test.yml @@ -34,7 +34,7 @@ jobs: # TODO: create a new PAT to use here # with: # token: ${{ secrets.E2E_PAT }} - - uses: cachix/install-nix-action@v24 + - uses: cachix/install-nix-action@v25 with: # pin to nix-2.13 to workaround compability issue of 2.14, # see: https://github.com/cachix/install-nix-action/issues/161 @@ -74,7 +74,7 @@ jobs: runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 - - uses: cachix/install-nix-action@v24 + - uses: cachix/install-nix-action@v25 with: # pin to nix-2.13 to workaround compability issue of 2.14, # see: https://github.com/cachix/install-nix-action/issues/161 From 6c81105178eb4c574d4cbafe427c1e6d781e5718 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Jan 2024 15:59:33 +0000 Subject: [PATCH 082/345] build(deps): bump cachix/cachix-action from 13 to 14 (#2265) * build(deps): bump cachix/cachix-action from 13 to 14 Bumps [cachix/cachix-action](https://github.com/cachix/cachix-action) from 13 to 14. - [Release notes](https://github.com/cachix/cachix-action/releases) - [Commits](https://github.com/cachix/cachix-action/compare/v13...v14) --- updated-dependencies: - dependency-name: cachix/cachix-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] * have e2e tests run on changes to the yml file too * add in missing places --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: MalteHerrmann Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> --- .github/workflows/e2e-test-release.yml | 5 +++-- .github/workflows/e2e-test.yml | 6 ++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.github/workflows/e2e-test-release.yml b/.github/workflows/e2e-test-release.yml index 4dab8408bd..db971a35e0 100644 --- a/.github/workflows/e2e-test-release.yml +++ b/.github/workflows/e2e-test-release.yml @@ -31,7 +31,7 @@ jobs: nix_path: nixpkgs=channel:nixos-22.11 extra_nix_config: | access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} - - uses: cachix/cachix-action@v13 + - uses: cachix/cachix-action@v14 with: name: evmosd authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}" @@ -44,6 +44,7 @@ jobs: go.sum *.toml tests/nix_tests/** + .github/workflows/e2e-test* - name: Run nix tests run: make run-nix-tests if: env.GIT_DIFF @@ -65,7 +66,7 @@ jobs: nix_path: nixpkgs=channel:nixos-22.11 extra_nix_config: | access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} - - uses: cachix/cachix-action@v13 + - uses: cachix/cachix-action@v14 with: name: evmosd authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}" diff --git a/.github/workflows/e2e-test.yml b/.github/workflows/e2e-test.yml index e558c17e06..ebbb6213ba 100644 --- a/.github/workflows/e2e-test.yml +++ b/.github/workflows/e2e-test.yml @@ -23,6 +23,7 @@ jobs: *.toml tests/e2e/* Dockerfile + .github/workflows/e2e-test* - name: Test E2E run: | make test-e2e @@ -42,7 +43,7 @@ jobs: nix_path: nixpkgs=channel:nixos-22.11 extra_nix_config: | access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} - - uses: cachix/cachix-action@v13 + - uses: cachix/cachix-action@v14 with: name: evmosd authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}" @@ -55,6 +56,7 @@ jobs: go.sum *.toml tests/nix_tests/** + .github/workflows/e2e-test* - name: Run nix tests run: make run-nix-tests if: env.GIT_DIFF @@ -82,7 +84,7 @@ jobs: nix_path: nixpkgs=channel:nixos-22.11 extra_nix_config: | access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} - - uses: cachix/cachix-action@v13 + - uses: cachix/cachix-action@v14 with: name: evmosd authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}" From 539c696c31f8b7bd1e9c8810c9bc6618177ba552 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jan 2024 15:18:42 +0100 Subject: [PATCH 083/345] build(deps): bump actions/dependency-review-action from 3 to 4 (#2282) Bumps [actions/dependency-review-action](https://github.com/actions/dependency-review-action) from 3 to 4. - [Release notes](https://github.com/actions/dependency-review-action/releases) - [Commits](https://github.com/actions/dependency-review-action/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/dependency-review-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/dependencies.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dependencies.yml b/.github/workflows/dependencies.yml index 4270835659..52482aba49 100644 --- a/.github/workflows/dependencies.yml +++ b/.github/workflows/dependencies.yml @@ -22,7 +22,7 @@ jobs: go.sum *.toml - name: "Dependency Review" - uses: actions/dependency-review-action@v3 + uses: actions/dependency-review-action@v4 if: env.GIT_DIFF - name: "Go vulnerability check" run: make vulncheck From 55ddb49a1f2ad0faaa8b348ed655e06a3db1030c Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Mon, 22 Jan 2024 16:34:18 +0100 Subject: [PATCH 084/345] imp(changelog): Add changelog checker (#2140) * commit first version of checker * commit WIP * complete functionality and add tests * add makefile command and CI job * fix changelog * make errors more precise for entry formatting * address markdown linters * address CodeQL linter * address linters * commit refactor WIP * move python script files into separate subfolders * finish entry implementation * refactor spelling check util * add implementation for change type * fix tests * add release implementation * delete outdated changelog checker tests and build new failing case * add scripts tests to CI * catch multiple spelling problems in one line * remove duplicate entry tests * add fixing functionality * add more allowed categories * clean up main script * ignore matches in links, codeblocks or in bigger words * fix parsing descriptions that contain links * check for duplicate PRs and auto-generate allowed categories * check for whitespace in link * check for backslash in pr link * allow cases where first desc char is not a letter * commit WIP fixing Changelog entries * address more errors in Changelog * move config into own file and allow legacy changelog entries * add output in success case * add readme for changelog checker * add testdata to ignored files for markdown linter * align test file name * address linters * address more linters * address more linters * run black formatter * address more linters * address more linters * fix changelog tests * fix linters in license checker --------- Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: Vladislav Varadinov --- .github/workflows/changelog.yml | 16 +- .github/workflows/test.yml | 24 + .markdownlintignore | 1 + CHANGELOG.md | 786 +++++++++--------- Makefile | 16 +- scripts/changelog_checker/README.md | 28 + scripts/changelog_checker/change_type.py | 56 ++ scripts/changelog_checker/check_changelog.py | 168 ++++ scripts/changelog_checker/config.py | 147 ++++ scripts/changelog_checker/entry.py | 255 ++++++ scripts/changelog_checker/release.py | 108 +++ scripts/changelog_checker/test_change_type.py | 29 + .../changelog_checker/test_check_changelog.py | 135 +++ scripts/changelog_checker/test_config.py | 18 + scripts/changelog_checker/test_entry.py | 229 +++++ scripts/changelog_checker/test_release.py | 54 ++ .../testdata/changelog_fail.md | 47 ++ .../testdata/changelog_ok.md | 44 + .../{ => license_checker}/check_licenses.py | 29 +- .../test_check_licenses.py | 11 + 20 files changed, 1785 insertions(+), 416 deletions(-) create mode 100644 scripts/changelog_checker/README.md create mode 100644 scripts/changelog_checker/change_type.py create mode 100644 scripts/changelog_checker/check_changelog.py create mode 100644 scripts/changelog_checker/config.py create mode 100644 scripts/changelog_checker/entry.py create mode 100644 scripts/changelog_checker/release.py create mode 100644 scripts/changelog_checker/test_change_type.py create mode 100644 scripts/changelog_checker/test_check_changelog.py create mode 100644 scripts/changelog_checker/test_config.py create mode 100644 scripts/changelog_checker/test_entry.py create mode 100644 scripts/changelog_checker/test_release.py create mode 100644 scripts/changelog_checker/testdata/changelog_fail.md create mode 100644 scripts/changelog_checker/testdata/changelog_ok.md rename scripts/{ => license_checker}/check_licenses.py (84%) rename scripts/{ => license_checker}/test_check_licenses.py (74%) diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml index 9de2497dd7..6536139d0d 100644 --- a/.github/workflows/changelog.yml +++ b/.github/workflows/changelog.yml @@ -1,14 +1,24 @@ -name: Changelog Diff +name: Changelog Checks on: pull_request: - branches: [main] + branches: + - main + - release/** jobs: - check_changelog: + check_diff: runs-on: ubuntu-latest steps: - name: Check Changelog for changes uses: tarides/changelog-check-action@v2 with: changelog: CHANGELOG.md + + check_changelog: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Check Changelog Integrity + run: | + make check-changelog diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8256cffc7d..fc3da7fc03 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -40,3 +40,27 @@ jobs: file: ./coverage.txt fail_ci_if_error: true if: env.GIT_DIFF + + test-scripts: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: technote-space/get-diff-action@v6.1.2 + with: + PATTERNS: | + ./scripts/** + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: '3.11' + cache: 'pip' # caching pip dependencies + if: env.GIT_DIFF + - name: Install Pytest + run: | + python -m pip install --upgrade pip + pip install pytest + if: env.GIT_DIFF + - name: Test Scripts + run: | + make test-scripts + if: env.GIT_DIFF diff --git a/.markdownlintignore b/.markdownlintignore index 1725ceb118..d9639ad9cc 100644 --- a/.markdownlintignore +++ b/.markdownlintignore @@ -1,3 +1,4 @@ CHANGELOG.md docs/protocol/proto-docs.md docs/node_modules +scripts/changelog_checker/testdata diff --git a/CHANGELOG.md b/CHANGELOG.md index bbf0ff9a14..a143977f59 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -52,29 +52,29 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (incentives) [#2070](https://github.com/evmos/evmos/pull/2070) Remove `x/incentives` module and burn incentives pool balance. - (evm) [#2084](https://github.com/evmos/evmos/pull/2084) Remove `x/claims` params and migrate the `EVMChannels` param to the `x/evm` module params. - (post) [#2128](https://github.com/evmos/evmos/pull/2128) Add `BurnDecorator` to `PostHandler` to burn cosmos transaction fees. -- (fee-collector) [#2129] (https://github.com/evmos/evmos/pull/2129) Add `Burner` role to `FeeCollector` module. -- (erc20) [#2154] (https://github.com/evmos/evmos/pull/2154) Remove evm hooks from `erc20` module. -- (erc20) [#2155] (https://github.com/evmos/evmos/pull/2155) Remove CLI commands for register and convert Coin. -- (erc20) [#2157] (https://github.com/evmos/evmos/pull/2157) Remove `RegisterCoinProposal` logic, protos and related tests. +- (upgrade) [#2129](https://github.com/evmos/evmos/pull/2129) Add `Burner` role to `FeeCollector` module. +- (erc20) [#2154](https://github.com/evmos/evmos/pull/2154) Remove EVM hooks from `erc20` module. +- (erc20) [#2155](https://github.com/evmos/evmos/pull/2155) Remove CLI commands for register and convert Coin. +- (erc20) [#2157](https://github.com/evmos/evmos/pull/2157) Remove `RegisterCoinProposal` logic, protos and related tests. - (osmosis-outpost) [#2206](https://github.com/evmos/evmos/pull/2206) Update swap function input to custom struct. -- (stride-outpost) [#2207](https://github.com/evmos/evmos/pull/2207) Update Stride Outpost to include additional arguments. +- (stride-outpost) [#2207](https://github.com/evmos/evmos/pull/2207) Update Stride outpost to include additional arguments. - (incentives) [#2221](https://github.com/evmos/evmos/pull/2221) Burn the usage incentives pool balance during v16 upgrade. - (erc20) [#2217](https://github.com/evmos/evmos/pull/2217) Add logic to deploy token pairs contracts on genesis. ### API Breaking - (inflation) [#2015](https://github.com/evmos/evmos/pull/2015) Rename `inflation` module to `inflation/v1`. -- (ante) [#2078](https://github.com/evmos/evmos/pull/2078) deprecate legacy EIP712 ante handler +- (ante) [#2078](https://github.com/evmos/evmos/pull/2078) Deprecate legacy EIP-712 ante handler. ### Improvements - (testnet) [#1864](https://github.com/evmos/evmos/pull/1864) Add `--base-fee` and `--min-gas-price` flags to the command `evmosd testnet init-files`. -- (stride-outpost) [#1912](https://github.com/evmos/evmos/pull/1912) Add Stride Outpost interface and ABI. -- (stride-outpost) [#1913](https://github.com/evmos/evmos/pull/1913) Add Run function, Precompile struct and tx definitions. +- (stride-outpost) [#1912](https://github.com/evmos/evmos/pull/1912) Add Stride outpost interface and ABI. +- (stride-outpost) [#1913](https://github.com/evmos/evmos/pull/1913) Add Run function, precompile struct and tx definitions. - (stride-outpost) [#1914](https://github.com/evmos/evmos/pull/1914) Add types, events and common util function. -- (osmosis-outpost) [#1915](https://github.com/evmos/evmos/pull/1915) Add Osmosis Outpost interface and ABI. -- (ics20-precompile) [#1916](https://github.com/evmos/evmos/pull/1916) Make ICS20 Transfer event a common function. -- (ics20-precompile) [#1917](https://github.com/evmos/evmos/pull/1917) Make timeout height a const in the ics20 precompile. +- (osmosis-outpost) [#1915](https://github.com/evmos/evmos/pull/1915) Add Osmosis outpost interface and ABI. +- (ics20-precompile) [#1916](https://github.com/evmos/evmos/pull/1916) Make ICS-20 Transfer event a common function. +- (ics20-precompile) [#1917](https://github.com/evmos/evmos/pull/1917) Make timeout height a const in the ICS-20 precompile. - (stride-outpost) [#1926](https://github.com/evmos/evmos/pull/1926) Refactor event names and definitions. - (stride-outpost) [#1931](https://github.com/evmos/evmos/pull/1931) Add Stride unit testing setup. - (stride-outpost) [#1932](https://github.com/evmos/evmos/pull/1932) Add transaction implementation and events unit tests. @@ -84,57 +84,56 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (distribution-precompile) [#1954](https://github.com/evmos/evmos/pull/1954) Add `ClaimRewards` unit and event tests. - (osmosis-outpost) [#1944](https://github.com/evmos/evmos/pull/1944) Add more validation to Osmosis outpost. - (precompiles) [#1973](https://github.com/evmos/evmos/pull/1973) Use `LoadABI` from precompiles common package in outposts. -- (erc20-precompile) [#1983](https://github.com/evmos/evmos/pull/1983) Add ERC-20 Precompile queries. -- (erc20-precompile) [#1984](https://github.com/evmos/evmos/pull/1984) Add tests for ERC20 precompile events. +- (erc20-precompile) [#1983](https://github.com/evmos/evmos/pull/1983) Add ERC-20 precompile queries. +- (erc20-precompile) [#1984](https://github.com/evmos/evmos/pull/1984) Add tests for ERC-20 precompile events. - (ci) [#1985](https://github.com/evmos/evmos/pull/1985) Add CI action to check for a Changelog entry on PRs to `main`. -- (erc20-precompile) [#1983](https://github.com/evmos/evmos/pull/1983) Add ERC-20 Precompile queries. - (osmosis-outpost) [#1986](https://github.com/evmos/evmos/pull/1986) Add Osmosis outpost transaction. -- (werc20-precompile) [#1990](https://github.com/evmos/evmos/pull/1990) Add WERC-20 Precompile events. -- (werc20-precompile) [#1991](https://github.com/evmos/evmos/pull/1991) Add WERC-20 Precompile transactions. +- (werc20-precompile) [#1990](https://github.com/evmos/evmos/pull/1990) Add WERC-20 precompile events. +- (werc20-precompile) [#1991](https://github.com/evmos/evmos/pull/1991) Add WERC-20 precompile transactions. - (distribution-precompile) [#1992](https://github.com/evmos/evmos/pull/1992) Remove outdated check utility for distribution approval. -- (erc20-precompile) [#1993](https://github.com/evmos/evmos/pull/1993) Add ERC-20 Precompile transactions. -- (erc20-precompile) [#1994](https://github.com/evmos/evmos/pull/1994) Add tests for ERC20 precompile type utilities. +- (erc20-precompile) [#1993](https://github.com/evmos/evmos/pull/1993) Add ERC-20 precompile transactions. +- (erc20-precompile) [#1994](https://github.com/evmos/evmos/pull/1994) Add tests for ERC-20 precompile type utilities. - (erc20-precompile) [#1995](https://github.com/evmos/evmos/pull/1995) Add ERC-20 precompile approvals and authorizations. - (erc20-precompile) [#1997](https://github.com/evmos/evmos/pull/1997) Add logic for ERC-20 precompile registration. -- (erc20-precompile) [#2005](https://github.com/evmos/evmos/pull/2005) Add tests for ERC20 precompile approvals. -- (bin) [#2007](https://github.com/evmos/evmos/pull/2007) Add commands in Makefile for building binary with rocksDB and pebbleDB -- (erc20-precompile) [#2009](https://github.com/evmos/evmos/pull/2009) Add ERC20 precompile transaction unit tests. +- (erc20-precompile) [#2005](https://github.com/evmos/evmos/pull/2005) Add tests for ERC-20 precompile approvals. +- (make) [#2007](https://github.com/evmos/evmos/pull/2007) Add commands in Makefile for building binary with rocksDB and pebbleDB. +- (erc20-precompile) [#2009](https://github.com/evmos/evmos/pull/2009) Add ERC-20 precompile transaction unit tests. - (osmosis-outpost) [#2011](https://github.com/evmos/evmos/pull/2011) Update outpost swap ABI to return IBC next sequence. -- (utils) [#2010](https://github.com/evmos/evmos/pull/2010) Add utils function to create ibc denom trace. -- (erc20-precompile) [#2012](https://github.com/evmos/evmos/pull/2012) Adjust ERC20 extension approvals to handle multiple denominations. +- (utils) [#2010](https://github.com/evmos/evmos/pull/2010) Add utils function to create IBC denom trace. +- (erc20-precompile) [#2012](https://github.com/evmos/evmos/pull/2012) Adjust ERC-20 extension approvals to handle multiple denominations. - (osmosis-outpost) [#2017](https://github.com/evmos/evmos/pull/2017) Refactor types, errors and precompile struct. -- (erc20-precompile) [#2023](https://github.com/evmos/evmos/pull/2023) Add tests for ERC20 precompile queries. +- (erc20-precompile) [#2023](https://github.com/evmos/evmos/pull/2023) Add tests for ERC-20 precompile queries. - (osmosis-outpost) [#2025](https://github.com/evmos/evmos/pull/2025) Use a struct to wrap parsed parameters from Solidity. - (ante) [#2028](https://github.com/evmos/evmos/pull/2028) MonoAnteHandler for EVM transaction. -- (erc20-precompile) [#2037](https://github.com/evmos/evmos/pull/2037) Add IsTransactions and RequiredGas tests for the ERC20 extension. +- (erc20-precompile) [#2037](https://github.com/evmos/evmos/pull/2037) Add IsTransactions and RequiredGas tests for the ERC-20 extension. - (bank-precompile) [#2040](https://github.com/evmos/evmos/pull/2040) Add bank extension unit tests for queries. - (bank-precompile) [#2041](https://github.com/evmos/evmos/pull/2041) Add `supplyOf` query to bank extension. - (staking-precompile) [#2046](https://github.com/evmos/evmos/pull/2046) Format any type ConsensusPubkey into a base64 string. - (bank-precompile) [#2045](https://github.com/evmos/evmos/pull/2045) Add unit tests for `supplyOf` query. -- (osmosis-outpost) [#2042](https://github.com/evmos/evmos/pull/2042) Add Osmosis's wasm hook validation functions to test +- (osmosis-outpost) [#2042](https://github.com/evmos/evmos/pull/2042) Add Osmosis's wasm hook validation functions to test. - (staking-precompile) [#2050](https://github.com/evmos/evmos/pull/2050) Add CreateValidator unit test for precompiled contract staking. -- (make) [#2052](https://github.com/evmos/evmos/pull/2052) Fix Makefile targets to compile ERC20 contracts. -- (werc20-precompile) [#2057](https://github.com/evmos/evmos/pull/2057) WERC20 refactors and handling of fallback and receive functions. -- (werc20-precompile) [#2059](https://github.com/evmos/evmos/pull/2059) Add WERC20 base integration tests. +- (make) [#2052](https://github.com/evmos/evmos/pull/2052) Fix Makefile targets to compile ERC-20 contracts. +- (werc20-precompile) [#2057](https://github.com/evmos/evmos/pull/2057) WERC-20 refactors and handling of fallback and receive functions. +- (werc20-precompile) [#2059](https://github.com/evmos/evmos/pull/2059) Add WERC-20 base integration tests. - (werc20-precompile) [#2062](https://github.com/evmos/evmos/pull/2062) Remove name checking for `fallback` and `receive` functions. - (osmosis-outpost) [#2063](https://github.com/evmos/evmos/pull/2063) Check that receiver address is bech32 with "evmos" as human readable part. -- (cmn-precompile) [#2064](https://github.com/evmos/evmos/pull/2064) Handle all `fallback` and `receive` function cases -- (erc20-precompile) [#2066](https://github.com/evmos/evmos/pull/2066) Adjust ERC20 EVM extension allowance behavior to align with standard ERC20 smart contracts. -- (erc20-precompile) [#2067](https://github.com/evmos/evmos/pull/2067) Further alignments between ERC20 smart contracts and EVM extension. +- (precompiles) [#2064](https://github.com/evmos/evmos/pull/2064) Handle all `fallback` and `receive` function cases. +- (erc20-precompile) [#2066](https://github.com/evmos/evmos/pull/2066) Adjust ERC-20 EVM extension allowance behavior to align with standard ERC-20 smart contracts. +- (erc20-precompile) [#2067](https://github.com/evmos/evmos/pull/2067) Further alignments between ERC-20 smart contracts and EVM extension. - (stride-outpost) [#2069](https://github.com/evmos/evmos/pull/2069) Refactor `osmosis` and `stride` testing. -- (erc20-precompile) [#2073](https://github.com/evmos/evmos/pull/2073) Align metadata query errors with ERC20 contracts. +- (erc20-precompile) [#2073](https://github.com/evmos/evmos/pull/2073) Align metadata query errors with ERC-20 contracts. - (werc20-precompile) [#2074](https://github.com/evmos/evmos/pull/2074) Add `werc20` EVM Extension acceptance tests with `WEVMOS` contract. -- (erc20-precompile) [#2075](https://github.com/evmos/evmos/pull/2075) Align allowance adjustment errors with ERC20 contracts. -- (erc20-precompile) [#2080](https://github.com/evmos/evmos/pull/2080) Add ERC20 integration test setup. -- (erc20-precompile) [#2081](https://github.com/evmos/evmos/pull/2081) Add ERC20 query integration tests. -- (erc20-precompile) [#2083](https://github.com/evmos/evmos/pull/2083) Add integration tests for ERC20 allowance transactions. -- (erc20-precompile) [#2085](https://github.com/evmos/evmos/pull/2085) Add ERC20 transfer integration tests. -- (erc20-precompile) [#2086](https://github.com/evmos/evmos/pull/2086) Add ERC20 metadata query integration tests. +- (erc20-precompile) [#2075](https://github.com/evmos/evmos/pull/2075) Align allowance adjustment errors with ERC-20 contracts. +- (erc20-precompile) [#2080](https://github.com/evmos/evmos/pull/2080) Add ERC-20 integration test setup. +- (erc20-precompile) [#2081](https://github.com/evmos/evmos/pull/2081) Add ERC-20 query integration tests. +- (erc20-precompile) [#2083](https://github.com/evmos/evmos/pull/2083) Add integration tests for ERC-20 allowance transactions. +- (erc20-precompile) [#2085](https://github.com/evmos/evmos/pull/2085) Add ERC-20 transfer integration tests. +- (erc20-precompile) [#2086](https://github.com/evmos/evmos/pull/2086) Add ERC-20 metadata query integration tests. - (erc20-precompile) [#2088](https://github.com/evmos/evmos/pull/2088) Emit additional approval event in case of `transferFrom`. -- (erc20-precompile) [#2097](https://github.com/evmos/evmos/pull/2097) Adjust ERC20 allowance behavior for same spender. +- (erc20-precompile) [#2097](https://github.com/evmos/evmos/pull/2097) Adjust ERC-20 allowance behavior for same spender. - (bank-precompile) [#2096](https://github.com/evmos/evmos/pull/2096) Add `bank` precompile integration tests. - (osmosis-outpost) [#2077](https://github.com/evmos/evmos/pull/2077) Update Osmosis outpost to use cross-chain swap contract V1. -- (app) [#2104](https://github.com/evmos/evmos/pull/2104) Refactor code to use `sdkmath.Int` and `sdkmath.LegacyDec` instead of the SDK types +- (app) [#2104](https://github.com/evmos/evmos/pull/2104) Refactor code to use `sdkmath.Int` and `sdkmath.LegacyDec` instead of the SDK types. - (staking-precompile) [#2105](https://github.com/evmos/evmos/pull/2105) Detect the length of the ed25519 pubkey in precompile `CreateValidator` to prevent panic. - (p256-precompile) [#2110](https://github.com/evmos/evmos/pull/2110) Adjust `p256` precompile address. - (upgrade) [#2117](https://github.com/evmos/evmos/pull/2117) Enable Stride and Osmosis outposts in v16 upgrade handler. @@ -143,17 +142,17 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (upgrade) [#2131](https://github.com/evmos/evmos/pull/2131) Remove incentives pool burning logic from upgrade handler. - (staking-precompile) [#2122](https://github.com/evmos/evmos/pull/2122) Replace bech32 address with EVM hex address for `CreateValidator` function and remove delegator address argument. - (inflation) [#2137](https://github.com/evmos/evmos/pull/2137) Reduce daily inflation by 2/3s. -- (app) [#2138](https://github.com/evmos/evmos/pull/2138) Replace imports of store related types and functions to use Cosmos-SDK `store/types` package. +- (app) [#2138](https://github.com/evmos/evmos/pull/2138) Replace imports of store related types and functions to use Cosmos-SDK `store/types` package. . - (app) [#2139](https://github.com/evmos/evmos/pull/2139) Remove old upgrade handlers logic. -- (outpost) [#2171](https://github.com/evmos/evmos/pull/2171) Add channelID selector based on the ChainID. +- (outposts) [#2171](https://github.com/evmos/evmos/pull/2171) Add channelID selector based on the ChainID. - (db) [#2182](https://github.com/evmos/evmos/pull/2182) Bump RocksDB version to `v8.8.1`. -- (api) [#2198] (https://github.com/evmos/evmos/pull/2198) Remove deprecated `RegisterCoinProposal` from store to avoid breaking the governance proposals query. -- (outposts) [#2215](https://github.com/evmos/evmos/pull/2215) backport handle cases for input and output denoms without token pair lookup -- (cli) [#2212](https://github.com/evmos/evmos/pull/2212) Remove ValidateBasic in cli. +- (api) [#2198](https://github.com/evmos/evmos/pull/2198) Remove deprecated `RegisterCoinProposal` from store to avoid breaking the governance proposals query. +- (outposts) [#2215](https://github.com/evmos/evmos/pull/2215) Backport handle cases for input and output denoms without token pair lookup. +- (cli) [#2212](https://github.com/evmos/evmos/pull/2212) Remove ValidateBasic in CLI. - (swagger) [#2219](https://github.com/evmos/evmos/pull/2219) Update Swagger configuration to remove outdated entries and update vesting module version. - (outposts) [#2223](https://github.com/evmos/evmos/pull/2223) Update Outposts struct documentation and `ValidateBasic`. - (p256-precompile) [#2228](https://github.com/evmos/evmos/pull/2228) Adjust p256 precompile address from `0x0b` to `0x100`. -- (outposts) [#2217](https://github.com/evmos/evmos/pull/2217) Add default timeout timestamp for outpost transactions. +- (outposts) [#2236](https://github.com/evmos/evmos/pull/2236) Add default timeout timestamp for outpost transactions. - (distribution-precompile) [#2240](https://github.com/evmos/evmos/pull/2240) Replace hardcoded expected balance in distribution precompile tests with queried balance. - (staking-precompile) [#2234](https://github.com/evmos/evmos/pull/2234) Fix wrong error messages in `NewMsgCreateValidator`. - (metrics) [#2246](https://github.com/evmos/evmos/pull/2246) Add burned cosmos transactions fees metric. @@ -163,72 +162,72 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### Bug Fixes -- (evm) [#1801](https://github.com/evmos/evmos/pull/1801) Fixed the problem gas_used is 0 when using evm type tx to transfer token to module account. +- (evm) [#1801](https://github.com/evmos/evmos/pull/1801) Fixed the problem gas_used is 0 when using EVM type tx to transfer token to module account. - (evm) [#1943](https://github.com/evmos/evmos/pull/1943) Fix gas estimation (`eth_estimateGas`) to be consistent with gas used in EVM extensions transactions. -- (test) [#1989](https://github.com/evmos/evmos/pull/1989) Fix the problem about deliverTxSimulate in test app/ante/cosmos/min_price_test.go -- (db) [#2072](https://github.com/evmos/evmos/pull/2072) Change VersionDb directory permission from 777 (insecure) to 750 (general) +- (tests) [#1989](https://github.com/evmos/evmos/pull/1989) Fix the problem about deliverTxSimulate in test app/ante/cosmos/min_price_test.go. +- (db) [#2072](https://github.com/evmos/evmos/pull/2072) Change VersionDb directory permission from 777 (insecure) to 750 (general). - (api) [#2196](https://github.com/evmos/evmos/pull/2196) Remove governance proposals related to the deprecated `x/incentives` module to fix the governance proposals query. - (swagger) [#2218](https://github.com/evmos/evmos/pull/2218) Use correct version of proto dependencies to generate swagger. - (inflation) [#2269](https://github.com/evmos/evmos/pull/2269) Fix inflation info returned by epoch mint provision getter. -## [v15.0.0] - 2023-10-31 +## [v15.0.0](https://github.com/evmos/evmos/releases/tag/v15.0.0) - 2023-10-31 ### API Breaking - (vesting) [#1862](https://github.com/evmos/evmos/pull/1862) Add Authorization Grants to the Vesting extension. -- (ics20) [#1848](https://github.com/evmos/evmos/pull/1848) Refactor ICS20 Authorization and remove Revoke Event. -- (staking) [#2076](https://github.com/evmos/evmos/pull/2076) Replace bech32 address with evm hex address for query validator. +- (ics20) [#1848](https://github.com/evmos/evmos/pull/1848) Refactor ICS-20 Authorization and remove Revoke Event. +- (staking) [#2076](https://github.com/evmos/evmos/pull/2076) Replace bech32 address with EVM hex address for query validator. ### State Machine Breaking -- (staking)[#1734](https://github.com/evmos/evmos/pull/1734) Return single struct from staking precompile queries. +- (staking) [#1734](https://github.com/evmos/evmos/pull/1734) Return single struct from staking precompile queries. - (deps) [#1780](https://github.com/evmos/evmos/pull/1780) Bump ibc-go version to `v7.3.0`. - (upgrade) [#1845](https://github.com/evmos/evmos/pull/1845) Include remaining strategic reserve migrations. -- (imp) [#1847](https://github.com/evmos/evmos/pull/1847) Remove crisis module in v15 upgrade handler. +- (crisis) [#1847](https://github.com/evmos/evmos/pull/1847) Remove crisis module in v15 upgrade handler. - (evm) [#1851](https://github.com/evmos/evmos/pull/1851) Enable [EIP 3855](https://eips.ethereum.org/EIPS/eip-3855) (`PUSH0` opcode) during upgrade. -- (sdk) [#1869](https://github.com/evmos/evmos/pull/1869) Bump Cosmos SDK to v0.47.5. +- (deps) [#1869](https://github.com/evmos/evmos/pull/1869) Bump Cosmos-SDK to v0.47.5. - (evm) [#1900](https://github.com/evmos/evmos/pull/1900) Enable [EIP 3855](https://eips.ethereum.org/EIPS/eip-3855) (`PUSH0` opcode) by default. -- (db) [1964](https://github.com/evmos/evmos/pull/1964) Bump versionDB dependecy to fix memory store bug. +- (db) [#1964](https://github.com/evmos/evmos/pull/1964) Bump versionDB dependency to fix memory store bug. ### Improvements - (ics20) [#1850](https://github.com/evmos/evmos/pull/1850) Extract common Grant checking and accepting methods. -- (ics20) [#1849](https://github.com/evmos/evmos/pull/1849) Extract common approval methods for ICS20 Authorizations. -- (test) [#1728](https://github.com/evmos/evmos/pull/1728) Add integration test suite using network methods. -- (ci) [#1725](https://github.com/evmos/evmos/pull/1725) Add nix integration test setup to CI flow +- (ics20) [#1849](https://github.com/evmos/evmos/pull/1849) Extract common approval methods for ICS-20 Authorizations. +- (tests) [#1728](https://github.com/evmos/evmos/pull/1728) Add integration test suite using network methods. +- (ci) [#1725](https://github.com/evmos/evmos/pull/1725) Add nix integration test setup to CI flow. - (evm) [#1737](https://github.com/evmos/evmos/pull/1737) Update EVM extensions file name to match interface naming convention. - (app) [#1842](https://github.com/evmos/evmos/pull/1842) Add support for [MemIAVL](https://github.com/crypto-org-chain/cronos/wiki/MemIAVL) and [versionDB](https://github.com/crypto-org-chain/cronos/blob/main/versiondb/README.md). - (upgrade) [#1834](https://github.com/evmos/evmos/pull/1834) Improve v14 migration tests and utilities. - (app) [#1835](https://github.com/evmos/evmos/pull/1835) Remove migration logic from the app's `BeginBlocker`. - (tests) [#1805](https://github.com/evmos/evmos/pull/1805) Improve local node script by using predefined keys and adding configuration flags. - (docker) [#1743](https://github.com/evmos/evmos/pull/1743) Add rclone binary to Docker image. -- (config) [#1893](https://github.com/evmos/evmos/pull/1893) Add default config for MemIAVL. +- (app) [#1893](https://github.com/evmos/evmos/pull/1893) Add default config for MemIAVL. ### Bug Fixes - (consensus) [#1740](https://github.com/evmos/evmos/pull/1740) Enable setting block gas limit to max by specifying it as -1 in the genesis file. -- (ante) [#1753](https://github.com/evmos/evmos/pull/1753) Handle zero fee case on evm transactions. -- (rpc) [#1829](https://github.com/evmos/evmos/pull/1829) Bump IAVL to v0.20.1 to fix concurrency issue +- (ante) [#1753](https://github.com/evmos/evmos/pull/1753) Handle zero fee case on EVM transactions. +- (rpc) [#1829](https://github.com/evmos/evmos/pull/1829) Bump IAVL to v0.20.1 to fix concurrency issue. - (testnet) [#1857](https://github.com/evmos/evmos/pull/1857) Remove the crisis module causing an error when using the `evmosd testnet init-files` command. - (rpc) [#1863](https://github.com/evmos/evmos/pull/1863) Handle error gracefully on RPC calls when node is not persisting ABCI responses. - (ibc) [#1918](https://github.com/evmos/evmos/pull/1918) Upgrade ibc-go to `v7.3.1`, which (among other things) fixes the `DenomTraces` REST endpoint. -- (gov) [#1981](https://github.com/evmos/evmos/pull/1981) Remove deprecated `cosmos.params.v1beta1/ParameterChangeProposal` handler +- (gov) [#1981](https://github.com/evmos/evmos/pull/1981) Remove deprecated `cosmos.params.v1beta1/ParameterChangeProposal` handler. - (revenue) [#2032](https://github.com/evmos/evmos/pull/2032) Fixed the problem that users cannot send transactions with gasPrice of 0 to precompiled contracts. -## [v14.1.0] - 2023-09-25 +## [v14.1.0](https://github.com/evmos/evmos/releases/tag/v14.1.0) - 2023-09-25 ### Bug Fixes - (upgrade) [#1803](https://github.com/evmos/evmos/pull/1803) Fix the upgrade procedure on v14.0.0. -## [v14.0.0] - 2023-09-19 +## [v14.0.0](https://github.com/evmos/evmos/releases/tag/v14.0.0) - 2023-09-19 ### State Machine Breaking - (vesting) [#1754](https://github.com/evmos/evmos/pull/1754) Implement further vesting module refactors. - (deps) [#1732](https://github.com/evmos/evmos/pull/1732) Bump ibc-go version with error message fix. -- (vesting) [#1730](https://github.com/evmos/evmos/pull/1730) Remove smart contract conversion to `ClawbackVestingAccount` -- (evm) [#1727](https://github.com/evmos/evmos/pull/1727) Return an error when calling inactive EVM extensions +- (vesting) [#1730](https://github.com/evmos/evmos/pull/1730) Remove smart contract conversion to `ClawbackVestingAccount`. +- (evm) [#1727](https://github.com/evmos/evmos/pull/1727) Return an error when calling inactive EVM extensions. - (deps) [#1662](https://github.com/evmos/evmos/pull/1662) Bump Cosmos-SDK to v0.47.4 and ibc-go to v7.2.0. ### Improvements @@ -236,529 +235,515 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (gov) [#1791](https://github.com/evmos/evmos/pull/1791) Extend maximum proposal metadata length. - (cli) [#1786](https://github.com/evmos/evmos/pull/1786) Add `block` CLI command to query a block from local db. - (cli) [#1714](https://github.com/evmos/evmos/pull/1714) Use empty string as default value in `chain-id` flag to use the chain id from the genesis file when not specified. -- (vesting) [#1709](https://github.com/evmos/evmos/pull/1709) Add clawed back coins to `MsgClawbackResponse` -- (vesting) [#1708](https://github.com/evmos/evmos/pull/1708) Minor improvements to `vesting` module +- (vesting) [#1709](https://github.com/evmos/evmos/pull/1709) Add clawed back coins to `MsgClawbackResponse`. +- (vesting) [#1708](https://github.com/evmos/evmos/pull/1708) Minor improvements to `vesting` module. - (cli) [#1706](https://github.com/evmos/evmos/pull/1706) Update `DefaultGasAdjustment` factor used in transactions. -- (staking) [#1702](https://github.com/evmos/evmos/pull/1702) Change authorization names to `grantee` / `granter` in the `staking` precompile -- (ics20) [#1688](https://github.com/evmos/evmos/pull/1688) Change authorization names to `grantee` / `granter` in the `ICS20` precompile -- (mod) [#1687](https://github.com/evmos/evmos/pull/1687) Bump Evmos version to v14. -- (proto) [#1684](https://github.com/evmos/evmos/pull/1684) Update proto files to use `evmos/v14` +- (staking) [#1702](https://github.com/evmos/evmos/pull/1702) Change authorization names to `grantee` / `granter` in the `staking` precompile. +- (ics20) [#1688](https://github.com/evmos/evmos/pull/1688) Change authorization names to `grantee` / `granter` in the `ICS20` precompile. +- (go) [#1687](https://github.com/evmos/evmos/pull/1687) Bump Evmos version to v14. +- (proto) [#1684](https://github.com/evmos/evmos/pull/1684) Update proto files to use `evmos/v14`. - (deps) [#1682](https://github.com/evmos/evmos/pull/1682) Migrate `evmos-ledger-go` logic to this repository. -- (cli) [#1677](https://github.com/evmos/evmos/pull/1677) Update docs for `vesting` cli -- (mod) [#1674](https://github.com/evmos/evmos/pull/1674) Update `evmos` module name to `evmos/v14` -- (vesting)[#1672](https://github.com/evmos/evmos/pull/1672) Port `vesting` precompile code and refactor integration tests -- (vesting)[#1667](https://github.com/evmos/evmos/pull/1667) Add support for vesting precompile in the `evm` module +- (cli) [#1677](https://github.com/evmos/evmos/pull/1677) Update docs for `vesting` CLI. +- (go) [#1674](https://github.com/evmos/evmos/pull/1674) Update `evmos` module name to `evmos/v14`. +- (vesting) [#1672](https://github.com/evmos/evmos/pull/1672) Port `vesting` precompile code and refactor integration tests. +- (vesting) [#1667](https://github.com/evmos/evmos/pull/1667) Add support for vesting precompile in the `evm` module. - (cli) [#1647](https://github.com/evmos/evmos/pull/1647) Update defaults on `evmosd start` flags. -- (vesting) Refactor vesting flow +- (vesting) Refactor vesting flow. ### Bug Fixes - (deps) [#1718](https://github.com/evmos/evmos/pull/1718) Update rosetta types import. -- (proto) [#1713](https://github.com/evmos/evmos/pull/1713) Add proto file for v1 vesting module account +- (proto) [#1713](https://github.com/evmos/evmos/pull/1713) Add proto file for v1 vesting module account. - (evm) [#1703](https://github.com/evmos/evmos/pull/1703) Prevent panic on uint64 conversion in EVM keeper `ApplyMessageWithConfig` function. - (ante) [#1693](https://github.com/evmos/evmos/pull/1693) Prevent panic on int64 conversion in EVM fees antehandler. - (cli) [#1681](https://github.com/evmos/evmos/pull/1681) Add `bootstrap-state` command. -- (e2e) [#1678](https://github.com/evmos/evmos/pull/1678) Fix e2e tests after recent changes to `evmosd start` default flags +- (tests) [#1678](https://github.com/evmos/evmos/pull/1678) Fix e2e tests after recent changes to `evmosd start` default flags. - (rpc) [#1676](https://github.com/evmos/evmos/pull/1676) Fix gas meter stacking gas from predecessors in `TraceTx` & `TraceBlock` functions. -- (rpc) [#1663](https://github.com/evmos/evmos/pull/1663) Fix block number returned in opcode for debug trace related api. -- (revenue) [#1659](https://github.com/evmos/evmos/pull/1659) Check if DevelopersShares are set to 0 +- (rpc) [#1663](https://github.com/evmos/evmos/pull/1663) Fix block number returned in opcode for debug trace related API. +- (revenue) [#1659](https://github.com/evmos/evmos/pull/1659) Check if DevelopersShares are set to 0. - (rpc) [#1655](https://github.com/evmos/evmos/pull/1655) Avoid channel get changed when concurrent subscribe happens. -- (rpc) [#1650](https://github.com/evmos/evmos/pull/1650) Fix racing conditions on RPC PubSub logic +- (rpc) [#1650](https://github.com/evmos/evmos/pull/1650) Fix racing conditions on RPC PubSub logic. - (vesting) Fix vesting bug. -## [v13.0.2] - 2023-07-05 +## [v13.0.2](https://github.com/evmos/evmos/releases/tag/v13.0.2) - 2023-07-05 ### Bug Fixes -- (upgrade) [#1644](https://github.com/evmos/evmos/pull/1644) Adjust upgrade constants -- (ci) [#1642](https://github.com/evmos/evmos/pull/1642) Fix target folder in GH action to push to the [Buf Schema Registry](https://buf.build/evmos/evmos) upon release +- (upgrade) [#1644](https://github.com/evmos/evmos/pull/1644) Adjust upgrade constants. +- (ci) [#1642](https://github.com/evmos/evmos/pull/1642) Fix target folder in GH action to push to the [Buf Schema Registry](https://buf.build/evmos/evmos) upon release. -## [v13.0.1] - 2023-07-04 +## [v13.0.1](https://github.com/evmos/evmos/releases/tag/v13.0.1) - 2023-07-04 ### Improvements - (deps) [#1635](https://github.com/evmos/evmos/pull/1635) Update cometbft `v0.34.29` with several minor bug fixes and low-severity security-fixes. -## [v13.0.0] - 2023-07-03 +## [v13.0.0](https://github.com/evmos/evmos/releases/tag/v13.0.0) - 2023-07-03 ### Improvements -- (app) [#1623](https://github.com/evmos/evmos/pull/1623) Adjust default app config to disable all server options -- (app) [#1619](https://github.com/evmos/evmos/pull/1619) Add snapshot commands to CLI -- (revenue) [#1607](https://github.com/evmos/evmos/pull/1607) Route gas fees from calling EVM extensions to community pool -- (docker) [#1606](https://github.com/evmos/evmos/pull/1606) Improve Dockerfile to reduce image size -- (deps) [#1597](https://github.com/evmos/evmos/pull/1597) Bump geth fork -- (deps) [#1595](https://github.com/evmos/evmos/pull/1595) Bump cometbft and goleveldb -- (evm) [#1578](https://github.com/evmos/evmos/pull/1578#) Add support of ICS20 transfer extension -- (test) [#1486](https://github.com/evmos/evmos/pull/1486) Add benchmark tests for `DeductFeeDecorator` and `EthGasConsumeDecorator` ante handler decorators -- (deps) [#1488](https://github.com/evmos/evmos/pull/1488) Bump btcd version to [`v0.23.3`](https://github.com/btcsuite/btcd/releases/tag/v0.23.3) -- (deps) [#1492](https://github.com/evmos/evmos/pull/1492) Bump Cosmos SDK version to [`v0.46.11-alpha.ledger`](https://github.com/evmos/cosmos-sdk/releases/tag/v0.46.11-alpha.ledger) & use cometbft [`v0.34.27`](https://github.com/cometbft/cometbft/releases/tag/v0.34.27) replacement for Tendermint import +- (app) [#1623](https://github.com/evmos/evmos/pull/1623) Adjust default app config to disable all server options. +- (app) [#1619](https://github.com/evmos/evmos/pull/1619) Add snapshot commands to CLI. +- (revenue) [#1607](https://github.com/evmos/evmos/pull/1607) Route gas fees from calling EVM extensions to community pool. +- (docker) [#1606](https://github.com/evmos/evmos/pull/1606) Improve Dockerfile to reduce image size. +- (deps) [#1597](https://github.com/evmos/evmos/pull/1597) Bump geth fork. +- (deps) [#1595](https://github.com/evmos/evmos/pull/1595) Bump cometbft and goleveldb. +- (evm) [#1578](https://github.com/evmos/evmos/pull/1578#) Add support of ICS-20 transfer extension. +- (tests) [#1486](https://github.com/evmos/evmos/pull/1486) Add benchmark tests for `DeductFeeDecorator` and `EthGasConsumeDecorator` ante handler decorators. +- (deps) [#1488](https://github.com/evmos/evmos/pull/1488) Bump btcd version to [`v0.23.3`](https://github.com/btcsuite/btcd/releases/tag/v0.23.3). +- (deps) [#1492](https://github.com/evmos/evmos/pull/1492) Bump Cosmos SDK version to [`v0.46.11-alpha.ledger`](https://github.com/evmos/cosmos-sdk/releases/tag/v0.46.11-alpha.ledger) & use cometbft [`v0.34.27`](https://github.com/cometbft/cometbft/releases/tag/v0.34.27) replacement for Tendermint import. ### State Machine Breaking -- (evm) [#1625](https://github.com/evmos/evmos/pull/1625) Migrate updated EVM extensions -- (vesting) [#1596](https://github.com/evmos/evmos/pull/1596) Add MsgCreateClawbackVestingAccount period validation -- (evm) [#1535](https://github.com/evmos/evmos/pull/1535) Add EVM extensions support +- (evm) [#1625](https://github.com/evmos/evmos/pull/1625) Migrate updated EVM extensions. +- (vesting) [#1596](https://github.com/evmos/evmos/pull/1596) Add MsgCreateClawbackVestingAccount period validation. +- (evm) [#1535](https://github.com/evmos/evmos/pull/1535) Add EVM extensions support. ### Bug Fixes -- (evm) [1602](https://github.com/evmos/evmos/pull/1602) Fixed hard coded BaseDenom and wrong comparison for MaxUint256 -- (deps) [#1567](https://github.com/evmos/evmos/pull/1567) Bump cosmos-sdk version to `v0.46.11-alpha.ledger.7`. +- (evm) [#1602](https://github.com/evmos/evmos/pull/1602) Fixed hard coded BaseDenom and wrong comparison for MaxUint256. +- (deps) [#1567](https://github.com/evmos/evmos/pull/1567) Bump Cosmos-SDK version to `v0.46.11-alpha.ledger.7`. Fix memory leak in `cosmos/iavl` package. -## [v12.1.6] - 2023-07-04 +## [v12.1.6](https://github.com/evmos/evmos/releases/tag/v12.1.6) - 2023-07-04 ### Improvements - (deps) [#1635](https://github.com/evmos/evmos/pull/1635) Update cometbft `v0.34.29` with several minor bug fixes and low-severity security-fixes. -## [v12.1.5] - 2023-06-08 +## [v12.1.5](https://github.com/evmos/evmos/releases/tag/v12.1.5) - 2023-06-08 ### Bug Fixes - (vesting) [GHSA-2q3r-p2m3-898g](https://github.com/evmos/evmos/commit/39b750cdaf1d69158ab93da85bd43ae4a7da1456) Apply ClawbackVestingAccount Barberry patch & Bump SDK to v0.46.13 -## [v12.1.4] - 2023-05-26 +## [v12.1.4](https://github.com/evmos/evmos/releases/tag/v12.1.4) - 2023-05-26 ### Improvements -- (deps) [#1571](https://github.com/evmos/evmos/pull/1571) Bump IBC-go version to [`v6.1.1`](https://github.com/cosmos/ibc-go/releases/tag/v6.1.1) +- (deps) [#1571](https://github.com/evmos/evmos/pull/1571) Bump IBC-go version to [`v6.1.1`](https://github.com/cosmos/ibc-go/releases/tag/v6.1.1). ### Bug Fixes -- (ci) [#1546](https://github.com/evmos/evmos/pull/1546) Fix docker image push on release action -- (ci) [#1475](https://github.com/evmos/evmos/pull/1475) Fix version of GitHub action to push to the [Buf Schema Registry](https://buf.build/evmos/evmos) upon releases +- (ci) [#1546](https://github.com/evmos/evmos/pull/1546) Fix docker image push on release action. +- (ci) [#1475](https://github.com/evmos/evmos/pull/1475) Fix version of GitHub action to push to the [Buf Schema Registry](https://buf.build/evmos/evmos) upon releases. -## [v12.1.3] - 2023-05-24 +## [v12.1.3](https://github.com/evmos/evmos/releases/tag/v12.1.3) - 2023-05-24 ### Improvements -- (cli) [#1556](https://github.com/evmos/evmos/pull/1556) Add CLI subcommand to debug legacy EIP712 transaction data +- (cli) [#1556](https://github.com/evmos/evmos/pull/1556) Add CLI subcommand to debug legacy EIP-712 transaction data. ### Bug Fixes -- (deps) [#1566](https://github.com/evmos/evmos/pull/1566) Bump cosmos-sdk version to `v0.46.10-ledger.3`. +- (deps) [#1566](https://github.com/evmos/evmos/pull/1566) Bump Cosmos-SDK version to `v0.46.10-ledger.3`. Fix memory leak in `cosmos/iavl` package. -## [v12.1.2] - 2023-04-14 +## [v12.1.2](https://github.com/evmos/evmos/releases/tag/v12.1.2) - 2023-04-14 ### Bug Fixes -- (rpc) [#1431](https://github.com/evmos/evmos/pull/1431) Fix websocket connection id parsing +- (rpc) [#1431](https://github.com/evmos/evmos/pull/1431) Fix websocket connection id parsing. -## [v12.1.1] - 2023-04-14 +## [v12.1.1](https://github.com/evmos/evmos/releases/tag/v12.1.1) - 2023-04-14 ### Improvements -- (config) [#1513](https://github.com/evmos/evmos/pull/1513) Set default `timeout_commit` to `3s` +- (cli) [#1513](https://github.com/evmos/evmos/pull/1513) Set default `timeout_commit` to `3s`. -## [v12.1.0] - 2023-03-24 +## [v12.1.0](https://github.com/evmos/evmos/releases/tag/v12.1.0) - 2023-03-24 ### Improvements -- (deps) [#1498](https://github.com/evmos/evmos/pull/1498) Bump Cosmos SDK version to [v0.46.10-ledger.1](https://github.com/evmos/cosmos-sdk/releases/tag/v0.46.10-ledger.1) -- (lint) [#1487](https://github.com/evmos/evmos/pull/1487) Fix lint issues created by new `golangci-lint` version +- (deps) [#1498](https://github.com/evmos/evmos/pull/1498) Bump Cosmos-SDK version to [v0.46.10-ledger.1](https://github.com/evmos/Cosmos-SDK/releases/tag/v0.46.10-ledger.1). +- (ci) [#1487](https://github.com/evmos/evmos/pull/1487) Fix lint issues created by new `golangci-lint` version. -## [v12.0.0] - 2023-03-23 +## [v12.0.0](https://github.com/evmos/evmos/releases/tag/v12.0.0) - 2023-03-23 ### State Machine Breaking -- (evm)[#1308](https://github.com/evmos/evmos/pull/1308) Migrate `evm` and `feemarket` types -- (contracts) [#1306](https://github.com/evmos/evmos/pull/1306) Migrate `contracts` directory to evmos repository -- (proto) [#1305](https://github.com/evmos/evmos/pull/1305) Migrate Ethermint proto files +- (evm) [#1308](https://github.com/evmos/evmos/pull/1308) Migrate `evm` and `feemarket` types. +- (erc20) [#1306](https://github.com/evmos/evmos/pull/1306) Migrate `contracts` directory to evmos repository. +- (proto) [#1305](https://github.com/evmos/evmos/pull/1305) Migrate Ethermint proto files. - (ante) [#1266](https://github.com/evmos/evmos/pull/1266) Use `DynamicFeeChecker` for Cosmos txs. -- (ante) [#1403](https://github.com/evmos/evmos/pull/1403) Update `AnteHandler` decorator for `x/authz` messages to run in deliverTx mode -- (eip712) [#1390](https://github.com/evmos/evmos/pull/1390) Refactor EIP-712 message handling to support multiple message schemas -- (ante) [#1405](https://github.com/evmos/evmos/pull/1405) Enable fees to be deducted from unclaimed staking rewards +- (ante) [#1403](https://github.com/evmos/evmos/pull/1403) Update `AnteHandler` decorator for `x/authz` messages to run in deliverTx mode. +- (eip712) [#1390](https://github.com/evmos/evmos/pull/1390) Refactor EIP-712 message handling to support multiple message schemas. +- (ante) [#1405](https://github.com/evmos/evmos/pull/1405) Enable fees to be deducted from unclaimed staking rewards. ### API Breaking -- [#1426](https://github.com/evmos/evmos/pull/1426) Move `revenue` module files into `v1` directory. -- [#1355](https://github.com/evmos/evmos/pull/1355) Remove `vm` package from EVM. +- (revenue) [#1426](https://github.com/evmos/evmos/pull/1426) Move `revenue` module files into `v1` directory. +- (evm) [#1355](https://github.com/evmos/evmos/pull/1355) Remove `vm` package from EVM. ### Improvements -- (tests) [#1434](https://github.com/evmos/evmos/pull/1434) Set default staking denom to `aevmos` in `evm` and `feemarket` tests -- (test) [#1402](https://github.com/evmos/evmos/pull/1402) Refactor NewTx function arguments -- (test) [#1415](https://github.com/evmos/evmos/pull/1415) Refactor InvalidTx type and NextFn used in AnteHandler tests -- (vesting) [#1400](https://github.com/evmos/evmos/pull/1400) Add convert vesting account message -- (test) [#1393](https://github.com/evmos/evmos/pull/1393) Move utilities from `tests` folder to `testutil` package -- (test) [\#1391](https://github.com/evmos/evmos/pull/1391) Refactor test files -- (claims) [#1378](https://github.com/evmos/evmos/pull/1378) Validate authorized channels when updating claims params -- (test) [#1348](https://github.com/evmos/evmos/pull/1348) Add query executions to e2e upgrade test suite -- (deps) [#1370](https://github.com/evmos/evmos/pull/1370) Bump Cosmos SDK version to [`v0.46.9-ledger`](https://github.com/evmos/cosmos-sdk/releases/tag/v0.46.9-ledger) -- (deps) [#1370](https://github.com/evmos/evmos/pull/1370) Bump Tendermint version to [`v0.34.26`](https://github.com/informalsystems/tendermint/releases/tag/v0.34.26) +- (tests) [#1434](https://github.com/evmos/evmos/pull/1434) Set default staking denom to `aevmos` in `evm` and `feemarket` tests. +- (tests) [#1402](https://github.com/evmos/evmos/pull/1402) Refactor NewTx function arguments. +- (tests) [#1415](https://github.com/evmos/evmos/pull/1415) Refactor InvalidTx type and NextFn used in AnteHandler tests. +- (vesting) [#1400](https://github.com/evmos/evmos/pull/1400) Add convert vesting account message. +- (tests) [#1393](https://github.com/evmos/evmos/pull/1393) Move utilities from `tests` folder to `testutil` package. +- (tests) [#1391](https://github.com/evmos/evmos/pull/1391) Refactor test files. +- (claims) [#1378](https://github.com/evmos/evmos/pull/1378) Validate authorized channels when updating claims params. +- (tests) [#1348](https://github.com/evmos/evmos/pull/1348) Add query executions to e2e upgrade test suite. +- (deps) [#1370](https://github.com/evmos/evmos/pull/1370) Bump Cosmos-SDK to [`v0.46.9-ledger`](https://github.com/evmos/Cosmos-SDK/releases/tag/v0.46.9-ledger) and Tendermint to [`v0.34.26`](https://github.com/informalsystems/tendermint/releases/tag/v0.34.26). - (evm) [#1354](https://github.com/evmos/evmos/pull/1354) Expose `Context` from the `StateDB` instance. -- (proto)[#1311](https://github.com/evmos/evmos/pull/1311) Also generate common types with `make proto-gen` -- (revenue)[#1153](https://github.com/evmos/evmos/pull/1153) Migrate revenue module event emitting to `TypedEvent` -- (erc20) [#1152](https://github.com/evmos/evmos/pull/1152) Migrate event emitting to `TypedEvent` -- (claims) [#1126](https://github.com/evmos/evmos/pull/1126) Remove old x/params migration logic -- (vesting) [#1155](https://github.com/evmos/evmos/pull/1155) Migrate deprecated event emitting to new `TypedEvent` -- (docs) [#1361](https://github.com/evmos/evmos/pull/1361) Update `vesting` module docs with new behavior for `ClawbackVestingAccounts` -- (evm) [#1349](https://github.com/evmos/evmos/pull/1349) Restrict the Evmos codebase from working with chain IDs other than `9000` and `9001` -- (test) [#1352](https://github.com/evmos/evmos/pull/1352) Deprecate usage of `aphoton` as denomination on tests -- (test) [#1369](https://github.com/evmos/evmos/pull/1369) Refactor code to use `BaseDenom` for simplification -- (cli) [#1371](https://github.com/evmos/evmos/pull/1371) Improve cli error messages -- (ante) [#1380](https://github.com/evmos/evmos/pull/1380) Split vesting decorators between `evm` and `cosmos` packages -- (cli) [#1386](https://github.com/evmos/evmos/pull/1386) Use required fees (i.e `--fees=auto`) as default if fees are not specified -- (test) [#1408](https://github.com/evmos/evmos/pull/1408) Refactor `DeployContract` and `DeployContractWithFactory` functions used for tests -- (test) [#1417](https://github.com/evmos/evmos/pull/1417) Refactor EIP-712 transactions helper functions used on tests -- (ante) [#1468](https://github.com/evmos/evmos/pull/1468) Add TxFeeChecker requirement -- (deps) [#1473](https://github.com/evmos/evmos/pull/1473) Bump Cosmos SDK version to [v0.46.10-alpha.ledger.2](https://github.com/evmos/cosmos-sdk/releases/tag/v0.46.10-alpha.ledger.2) -- (ante) [#1470](https://github.com/evmos/evmos/pull/1470) Improve error message on `DynamicFeeChecker` ante handler -- (test) [#1484](https://github.com/evmos/evmos/pull/1484) Update e2e test: refactor Makefile command and use latest changes for the tests +- (proto) [#1311](https://github.com/evmos/evmos/pull/1311) Also generate common types with `make proto-gen`. +- (revenue) [#1153](https://github.com/evmos/evmos/pull/1153) Migrate revenue module event emitting to `TypedEvent`. +- (erc20) [#1152](https://github.com/evmos/evmos/pull/1152) Migrate event emitting to `TypedEvent`. +- (claims) [#1126](https://github.com/evmos/evmos/pull/1126) Remove old x/params migration logic. +- (vesting) [#1155](https://github.com/evmos/evmos/pull/1155) Migrate deprecated event emitting to new `TypedEvent`. +- (docs) [#1361](https://github.com/evmos/evmos/pull/1361) Update `vesting` module docs with new behavior for `ClawbackVestingAccounts`. +- (evm) [#1349](https://github.com/evmos/evmos/pull/1349) Restrict the Evmos codebase from working with chain IDs other than `9000` and `9001`. +- (tests) [#1352](https://github.com/evmos/evmos/pull/1352) Deprecate usage of `aphoton` as denomination on tests. +- (tests) [#1369](https://github.com/evmos/evmos/pull/1369) Refactor code to use `BaseDenom` for simplification. +- (cli) [#1371](https://github.com/evmos/evmos/pull/1371) Improve CLI error messages. +- (ante) [#1380](https://github.com/evmos/evmos/pull/1380) Split vesting decorators between `evm` and `cosmos` packages. +- (cli) [#1386](https://github.com/evmos/evmos/pull/1386) Use required fees (i.e `--fees=auto`) as default if fees are not specified. +- (tests) [#1408](https://github.com/evmos/evmos/pull/1408) Refactor `DeployContract` and `DeployContractWithFactory` functions used for tests. +- (tests) [#1417](https://github.com/evmos/evmos/pull/1417) Refactor EIP-712 transactions helper functions used on tests. +- (ante) [#1468](https://github.com/evmos/evmos/pull/1468) Add TxFeeChecker requirement. +- (deps) [#1473](https://github.com/evmos/evmos/pull/1473) Bump Cosmos-SDK version to [v0.46.10-alpha.ledger.2](https://github.com/evmos/Cosmos-SDK/releases/tag/v0.46.10-alpha.ledger.2). +- (ante) [#1470](https://github.com/evmos/evmos/pull/1470) Improve error message on `DynamicFeeChecker` ante handler. +- (tests) [#1484](https://github.com/evmos/evmos/pull/1484) Update e2e test: refactor Makefile command and use latest changes for the tests. ### Bug Fixes - (ante) [#1433](https://github.com/evmos/evmos/pull/1433) Add max priority fee check on `FeeChecker`. -- (ci) [#1383](https://github.com/evmos/evmos/pull/1383) Fix go-releaser error when building macOS binaries -- (ante) [#1435](https://github.com/evmos/evmos/pull/1435) Add block gas limit check for cosmos transactions -- (evm) [#1452](https://github.com/evmos/evmos/pull/1452) Consider refund amount on `gasUsed` calculation -- (evm) [#1466](https://github.com/evmos/evmos/pull/1466) Add `gasUsed` field in Ethereum transaction receipt -- (cli) [#1467](https://github.com/evmos/evmos/pull/1467) Rollback fees `auto` flag logic -- (ci) [#1476](https://github.com/evmos/evmos/pull/1476) Fix go-releaser configuration to be consistent with previous version binaries naming -- (upgrade) [#1493](https://github.com/evmos/evmos/pull/1493) Add decay bug affected accounts +- (ci) [#1383](https://github.com/evmos/evmos/pull/1383) Fix go-releaser error when building macOS binaries. +- (ante) [#1435](https://github.com/evmos/evmos/pull/1435) Add block gas limit check for cosmos transactions. +- (evm) [#1452](https://github.com/evmos/evmos/pull/1452) Consider refund amount on `gasUsed` calculation. +- (evm) [#1466](https://github.com/evmos/evmos/pull/1466) Add `gasUsed` field in Ethereum transaction receipt. +- (cli) [#1467](https://github.com/evmos/evmos/pull/1467) Rollback fees `auto` flag logic. +- (ci) [#1476](https://github.com/evmos/evmos/pull/1476) Fix go-releaser configuration to be consistent with previous version binaries naming. +- (upgrade) [#1493](https://github.com/evmos/evmos/pull/1493) Add decay bug affected accounts. -## [v11.0.2] - 2023-02-10 +## [v11.0.2](https://github.com/evmos/evmos/releases/tag/v11.0.2) - 2023-02-10 ### Improvements -- (deps) [#1370](https://github.com/evmos/evmos/pull/1370) Bump Cosmos SDK version to [`v0.46.9-ledger`](https://github.com/evmos/cosmos-sdk/releases/tag/v0.46.9-ledger) -- (deps) [#1370](https://github.com/evmos/evmos/pull/1370) Bump Tendermint version to [`v0.34.26`](https://github.com/informalsystems/tendermint/releases/tag/v0.34.26) -- (deps) [#1374](https://github.com/evmos/evmos/pull/1374) Bump Gin version to [`v1.7.7`](https://github.com/gin-gonic/gin/releases/tag/v1.7.7) -- (ante) [#1382](https://github.com/evmos/evmos/pull/1382) Add `AnteHandler` decorator for `x/authz` messages +- (deps) [#1370](https://github.com/evmos/evmos/pull/1370) Bump Cosmos-SDK to [`v0.46.9-ledger`](https://github.com/evmos/Cosmos-SDK/releases/tag/v0.46.9-ledger) and Tendermint to [`v0.34.26`](https://github.com/informalsystems/tendermint/releases/tag/v0.34.26). +- (deps) [#1374](https://github.com/evmos/evmos/pull/1374) Bump Gin version to [`v1.7.7`](https://github.com/gin-gonic/gin/releases/tag/v1.7.7). +- (ante) [#1382](https://github.com/evmos/evmos/pull/1382) Add `AnteHandler` decorator for `x/authz` messages. -## [v11.0.1] - 2023-02-04 +## [v11.0.1](https://github.com/evmos/evmos/releases/tag/v11.0.1) - 2023-02-04 ### Improvements -- (deps) [#1248](https://github.com/evmos/evmos/pull/1248) Use the Informal Systems Tendermint Core fork +- (deps) [#1248](https://github.com/evmos/evmos/pull/1248) Use the Informal Systems Tendermint Core fork. ### Bug Fixes -- (deps) [#1342](https://github.com/evmos/evmos/pull/1342) Bump `tendermint` to [`v0.34.25`](https://github.com/informalsystems/tendermint/releases/tag/v0.34.25) +- (deps) [#1342](https://github.com/evmos/evmos/pull/1342) Bump `tendermint` to [`v0.34.25`](https://github.com/informalsystems/tendermint/releases/tag/v0.34.25). -## [v11.0.0] - 2023-01-27 +## [v11.0.0](https://github.com/evmos/evmos/releases/tag/v11.0.0) - 2023-01-27 ### State Machine Breaking -- (deps) [#1288](https://github.com/evmos/evmos/pull/1288) Bump `ethermint` to [`v0.21.0`](https://github.com/evmos/ethermint/releases/v0.21.0) -- (ica) [#1101](https://github.com/evmos/evmos/pull/1101) Add ICA host submodule -- (inflation) [#1210](https://github.com/evmos/evmos/pull/1210) Delete `EpochMintProvision` from `KVStore` in a migration -- (deps) [\#1196](https://github.com/evmos/evmos/pull/1196) Bump `ibc-go` to [`v6.1.0`](https://github.com/cosmos/ibc-go/releases/tag/v6.1.0) -- (inflation) [#1193](https://github.com/evmos/evmos/pull/1193) Remove `EpochMintProvision` setters and getters to calculate on the fly -- (erc20) [#1100](https://github.com/evmos/evmos/pull/1100) Deprecate usage of `x/params` in `x/erc20` -- (inflation) [#1107](https://github.com/evmos/evmos/pull/1107) Deprecate usage of `x/params` in `x/inflation` -- (incentives) [#1130](https://github.com/evmos/evmos/pull/1130) Deprecate usage of `x/params` in `x/incentives` -- (claims) [#1125](https://github.com/evmos/evmos/pull/1125) Deprecate usage of `x/params` in `x/claims` -- (revenue) [#1129](https://github.com/evmos/evmos/pull/1129) Deprecate usage of `x/params` in `x/revenue` -- (vesting) [#1268](https://github.com/evmos/evmos/pull/1268) Allow usage of vested and unlocked tokens in EVM interactions - -### Features - +- (deps) [#1288](https://github.com/evmos/evmos/pull/1288) Bump `ethermint` to [`v0.21.0`](https://github.com/evmos/ethermint/releases/v0.21.0). +- (app) [#1101](https://github.com/evmos/evmos/pull/1101) Add ICA host submodule. +- (inflation) [#1210](https://github.com/evmos/evmos/pull/1210) Delete `EpochMintProvision` from `KVStore` in a migration. +- (deps) [#1196](https://github.com/evmos/evmos/pull/1196) Bump `ibc-go` to [`v6.1.0`](https://github.com/cosmos/ibc-go/releases/tag/v6.1.0). +- (inflation) [#1193](https://github.com/evmos/evmos/pull/1193) Remove `EpochMintProvision` setters and getters to calculate on the fly. +- (erc20) [#1100](https://github.com/evmos/evmos/pull/1100) Deprecate usage of `x/params` in `x/erc20`. +- (inflation) [#1107](https://github.com/evmos/evmos/pull/1107) Deprecate usage of `x/params` in `x/inflation`. +- (incentives) [#1130](https://github.com/evmos/evmos/pull/1130) Deprecate usage of `x/params` in `x/incentives`. +- (claims) [#1125](https://github.com/evmos/evmos/pull/1125) Deprecate usage of `x/params` in `x/claims`. +- (revenue) [#1129](https://github.com/evmos/evmos/pull/1129) Deprecate usage of `x/params` in `x/revenue`. +- (vesting) [#1268](https://github.com/evmos/evmos/pull/1268) Allow usage of vested and unlocked tokens in EVM interactions. - (upgrade) [#1209](https://github.com/evmos/evmos/pull/1209) Incentivized testnet reward distribution logic. ### Improvements -- (tests) [#1283](https://github.com/evmos/evmos/pull/1283) Enable multiple upgrades for automated upgrade tests -- (deps) [#1279](https://github.com/evmos/evmos/pull/1279) Bump Cosmos SDK version to [`v0.46.8-ledger`](https://github.com/evmos/cosmos-sdk/releases/tag/v0.46.8-ledger) -- (inflation) [#1258](https://github.com/evmos/evmos/pull/1258) Remove unnecessary `Coin` validation and store calls for `Params` +- (tests) [#1283](https://github.com/evmos/evmos/pull/1283) Enable multiple upgrades for automated upgrade tests. +- (deps) [#1279](https://github.com/evmos/evmos/pull/1279) Bump Cosmos-SDK version to [`v0.46.8-ledger`](https://github.com/evmos/Cosmos-SDK/releases/tag/v0.46.8-ledger). +- (inflation) [#1258](https://github.com/evmos/evmos/pull/1258) Remove unnecessary `Coin` validation and store calls for `Params`. ### Bug Fixes - (app) [#1276](https://github.com/evmos/evmos/pull/1276) Fix store uploader for `x/recovery` module. -- (inflation) [#1259](https://github.com/evmos/evmos/pull/1259) Re-add missing key to not disrupt order in store -- (upgrade) [#1257](https://github.com/evmos/evmos/pull/1257) Add `recovery` module store to `StoreUpgrades` +- (inflation) [#1259](https://github.com/evmos/evmos/pull/1259) Re-add missing key to not disrupt order in store. +- (upgrade) [#1257](https://github.com/evmos/evmos/pull/1257) Add `recovery` module store to `StoreUpgrades`. - (upgrade) [#1252](https://github.com/evmos/evmos/pull/1252) Add account number and sequence to migrated IBC transfer escrow accounts. -- (upgrade) [#1242](https://github.com/evmos/evmos/pull/1242) Fix Ethermint params upgrade +- (upgrade) [#1242](https://github.com/evmos/evmos/pull/1242) Fix Ethermint params upgrade. - (ibc) [#1156](https://github.com/evmos/evmos/pull/1156) Migrate IBC transfer escrow accounts to `ModuleAccount` type. -- (upgrade) [#1252](https://github.com/evmos/evmos/pull/1252) Add account number and sequence to migrated IBC transfer escrow accounts. -## [v10.0.1] - 2023-01-03 +## [v10.0.1](https://github.com/evmos/evmos/releases/tag/v10.0.1) - 2023-01-03 ### Improvements -- (deps) [#1201](https://github.com/evmos/evmos/pull/1201) Bump `ics23/go` to v0.9.0 +- (deps) [#1201](https://github.com/evmos/evmos/pull/1201) Bump `ics23/go` to v0.9.0. -## [v10.0.0] - 2022-12-28 +## [v10.0.0](https://github.com/evmos/evmos/releases/tag/v10.0.0) - 2022-12-28 ### State Machine Breaking -- (deps) [#1184](https://github.com/evmos/evmos/pull/1184) Bump Ethermint version to [`v0.20.0-rc5`](https://github.com/evmos/ethermint/releases/tag/v0.20.0-rc5) -- (deps) [\#1176](https://github.com/evmos/evmos/pull/1176) Bump `ibc-go` to [`v5.2.0`](https://github.com/cosmos/ibc-go/releases/tag/v5.2.0) -- (vesting) [\#1070](https://github.com/evmos/evmos/pull/1070) Add Amino encoding support to the vesting module for EIP-712 signing. +- (deps) [#1184](https://github.com/evmos/evmos/pull/1184) Bump Ethermint version to [`v0.20.0-rc5`](https://github.com/evmos/ethermint/releases/tag/v0.20.0-rc5). +- (deps) [#1176](https://github.com/evmos/evmos/pull/1176) Bump `ibc-go` to [`v5.2.0`](https://github.com/cosmos/ibc-go/releases/tag/v5.2.0) and Cosmos-SDK to [`v0.46.7`](https://github.com/cosmos/Cosmos-SDK/releases/tag/v0.46.7). +- (vesting) [#1070](https://github.com/evmos/evmos/pull/1070) Add Amino encoding support to the vesting module for EIP-712 signing. - (ante) [#1054](https://github.com/evmos/evmos/pull/1054) Remove validator commission `AnteHandler` decorator and replace it with the new `MinCommissionRate` staking parameter. -- (deps) [\#1041](https://github.com/evmos/evmos/pull/1041) Add ICS-23 dragon-berry replace in `go.mod` as mentioned in the [Cosmos SDK release](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.46.4) +- (deps) [#1041](https://github.com/evmos/evmos/pull/1041) Add ICS-23 dragon-berry replace in `go.mod` as mentioned in the [Cosmos SDK release](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.46.4). +- (ibc) [#1085](https://github.com/evmos/evmos/pull/1085) Added wrapper for ICS-20 `transfer` to automatically convert ERC-20 tokens to native Cosmos coins. ### API Breaking -- (erc20) [\#914](https://github.com/evmos/evmos/pull/914) Support registering multiple assets on `RegisterCoinProposal` and `RegisterERC20Proposal` - -### Features - -- (app) [\#1114](https://github.com/evmos/evmos/pull/1114) Add default File store listener for application from [ADR38](https://docs.cosmos.network/v0.47/architecture/adr-038-state-listening) -- (transfer, erc20) [\#1085](https://github.com/evmos/evmos/pull/1085) Added wrapper for ICS-20 `transfer` to automatically convert ERC-20 tokens to native Cosmos coins. +- (erc20) [#914](https://github.com/evmos/evmos/pull/914) Support registering multiple assets on `RegisterCoinProposal` and `RegisterERC20Proposal`. ### Improvements -- (tests) [\1194](https://github.com/evmos/evmos/pull/1194) Lint tests so they are consistent with non-test code. -- (deps) [\#1176](https://github.com/evmos/evmos/pull/1176) Bump Cosmos SDK to [`v0.46.7`](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.46.7) +- (tests) [#1194](https://github.com/evmos/evmos/pull/1194) Lint tests so they are consistent with non-test code. - (ci) [#1138](https://github.com/evmos/evmos/pull/1138) Add Golang dependency vulnerability checker. -- (docs) [\#1090](https://github.com/evmos/evmos/pull/1090) Add audits page to documentation. -- (vesting) [\#1087](https://github.com/evmos/evmos/pull/1087) Add new `MsgUpdateVestingFunder` that updates the `Funder` field of a given clawback vesting account -- (ibc) [\#1081](https://github.com/evmos/evmos/pull/1081) Added utils functions for ibc denoms. -- (erc20) [\#1059](https://github.com/evmos/evmos/pull/1059) Add util functions (iterator and params) for ERC20 module. -- (go) [\#1039](https://github.com/evmos/evmos/pull/1039) Bump go v1.19 -- (test) [#1028](https://github.com/evmos/evmos/pull/1028) Add node upgrade end-to-end test suite. -- (cmd) [\#1027](https://github.com/evmos/evmos/pull/1027) Apply Google CLI Syntax for required and optional args. -- (ante) [\#993](https://github.com/evmos/evmos/pull/993) Re-order AnteHandlers for better performance -- (docs) [\#985](https://github.com/evmos/evmos/pull/985) Specify repo branch name on markdown-link-check configuration. -- (docs) [\#883](https://github.com/evmos/evmos/pull/883) Add Ethereum tx indexer documentation. -- (docs) [\#980](https://github.com/evmos/evmos/pull/980) Fix documentation links to cosmos-sdk docs. -- (cmd) [\#974](https://github.com/evmos/evmos/pull/974) Add `prune` command. +- (app) [#1114](https://github.com/evmos/evmos/pull/1114) Add default File store listener for application from [ADR38](https://docs.cosmos.network/v0.47/architecture/adr-038-state-listening). +- (docs) [#1090](https://github.com/evmos/evmos/pull/1090) Add audits page to documentation. +- (vesting) [#1087](https://github.com/evmos/evmos/pull/1087) Add new `MsgUpdateVestingFunder` that updates the `Funder` field of a given clawback vesting account. +- (ibc) [#1081](https://github.com/evmos/evmos/pull/1081) Added utils functions for IBC denoms. +- (erc20) [#1059](https://github.com/evmos/evmos/pull/1059) Add util functions (iterator and params) for ERC-20 module. +- (deps) [#1039](https://github.com/evmos/evmos/pull/1039) Bump go v1.19. +- (tests) [#1028](https://github.com/evmos/evmos/pull/1028) Add node upgrade end-to-end test suite. +- (cli) [#1027](https://github.com/evmos/evmos/pull/1027) Apply Google CLI Syntax for required and optional args. +- (ante) [#993](https://github.com/evmos/evmos/pull/993) Re-order AnteHandlers for better performance. +- (docs) [#985](https://github.com/evmos/evmos/pull/985) Specify repo branch name on markdown-link-check configuration. +- (docs) [#883](https://github.com/evmos/evmos/pull/883) Add Ethereum tx indexer documentation. +- (docs) [#980](https://github.com/evmos/evmos/pull/980) Fix documentation links to Cosmos-SDK docs. +- (cli) [#974](https://github.com/evmos/evmos/pull/974) Add `prune` command. - (cli) [#816](https://github.com/evmos/evmos/pull/816) Add Ledger CLI support. ### Bug Fixes -- (app) [#1165](https://github.com/evmos/evmos/pull/1165) Update Ledger supported algorithms to only consist of `EthSecp256k1` -- (cmd) [#1172](https://github.com/evmos/evmos/pull/1172) Update default node snapshot interval to `5000` -- (cmd) [\#1121](https://github.com/evmos/evmos/pull/1121) Fix `evmosd version` to show either tag or last commit. -- (cmd) [\#1120](https://github.com/evmos/evmos/pull/1120) Fix snapshot configuration -- (app) [\#1118](https://github.com/evmos/evmos/pull/1118) Setup gRPC node service with the application. -- (analytics) [\#1094](https://github.com/evmos/evmos/pull/1094) Fix unbound metrics and remove labels that keep increasing. +- (app) [#1165](https://github.com/evmos/evmos/pull/1165) Update Ledger supported algorithms to only consist of `EthSecp256k1`. +- (cli) [#1172](https://github.com/evmos/evmos/pull/1172) Update default node snapshot interval to `5000`. +- (cli) [#1121](https://github.com/evmos/evmos/pull/1121) Fix `evmosd version` to show either tag or last commit. +- (cli) [#1120](https://github.com/evmos/evmos/pull/1120) Fix snapshot configuration. +- (app) [#1118](https://github.com/evmos/evmos/pull/1118) Setup gRPC node service with the application. +- (metrics) [#1094](https://github.com/evmos/evmos/pull/1094) Fix unbound metrics and remove labels that keep increasing. -## [v9.1.0] - 2022-10-25 +## [v9.1.0](https://github.com/evmos/evmos/releases/tag/v9.1.0) - 2022-10-25 ### Improvements -- (deps) [\#1011](https://github.com/evmos/evmos/pull/1011) Bump Cosmos SDK to [`v0.45.10`](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.45.10) +- (deps) [#1011](https://github.com/evmos/evmos/pull/1011) Bump Cosmos-SDK to [`v0.45.10`](https://github.com/cosmos/Cosmos-SDK/releases/tag/v0.45.10). -## [v9.0.0] - 2022-10-21 +## [v9.0.0](https://github.com/evmos/evmos/releases/tag/v9.0.0) - 2022-10-21 ### Bug Fixes -- (claims) [#951](https://github.com/evmos/evmos/pull/951) Fix ClawbackEmptyAccounts logic +- (claims) [#951](https://github.com/evmos/evmos/pull/951) Fix ClawbackEmptyAccounts logic. -## [v8.2.3] - 2022-10-15 +## [v8.2.3](https://github.com/evmos/evmos/releases/tag/v8.2.3) - 2022-10-15 ### Improvements -- (cmd) [#988](https://github.com/evmos/evmos/pull/988) Set IAVL config +- (cli) [#988](https://github.com/evmos/evmos/pull/988) Set IAVL config. - (cli) [#971](https://github.com/evmos/evmos/pull/971) Add `prune` command. -## [v8.2.2] - 2022-10-14 +## [v8.2.2](https://github.com/evmos/evmos/releases/tag/v8.2.2) - 2022-10-14 ### Improvements -- (deps)[#965](https://github.com/evmos/evmos/pull/965) Bump SDK to v0.45.9 and Ethermint to v0.19.3 +- (deps) [#965](https://github.com/evmos/evmos/pull/965) Bump SDK to v0.45.9 and Ethermint to v0.19.3. -## [v8.2.0] - 2022-09-23 +## [v8.2.0](https://github.com/evmos/evmos/releases/tag/v8.2.0) - 2022-09-23 ### State Machine Breaking -- (app) [\#918](https://github.com/evmos/evmos/pull/918) Fix unregistered `revenue` module for `v8.1.0` store upgrade +- (app) [#918](https://github.com/evmos/evmos/pull/918) Fix unregistered `revenue` module for `v8.1.0` store upgrade. ### Bug Fixes -- (app,docs) [\#933](https://github.com/evmos/evmos/pull/933) Replace invalid linux `x86_64` [architecture](https://go.dev/doc/install/source#environment) to `amd64`. +- (app) [#933](https://github.com/evmos/evmos/pull/933) Replace invalid linux `x86_64` [architecture](https://go.dev/doc/install/source#environment) to `amd64`. -## [v8.1.1] - 2022-09-23 +## [v8.1.1](https://github.com/evmos/evmos/releases/tag/v8.1.1) - 2022-09-23 ### Bug Fixes -- (app) [\#922](https://github.com/evmos/evmos/pull/922) Add hard fork logic for `v8.2.0` +- (app) [#922](https://github.com/evmos/evmos/pull/922) Add hard fork logic for `v8.2.0`. -## [v8.1.0] - 2022-08-30 +## [v8.1.0](https://github.com/evmos/evmos/releases/tag/v8.1.0) - 2022-08-30 ### State Machine Breaking -- (revenue) [\#859](https://github.com/evmos/evmos/pull/859) Add amino codecs to `x/revenue` module to support EIP-712 signatures. -- (deps) Bump Ethermint version to [`v0.19.2`](https://github.com/evmos/ethermint/releases/tag/v0.19.2) +- (revenue) [#859](https://github.com/evmos/evmos/pull/859) Add amino codecs to `x/revenue` module to support EIP-712 signatures. +- (deps) [#875](https://github.com/evmos/evmos/pull/875) Bump Ethermint version to [`v0.19.2`](https://github.com/evmos/ethermint/releases/tag/v0.19.2). -## [v8.0.0] - 2022-08-16 +## [v8.0.0](https://github.com/evmos/evmos/releases/tag/v8.0.0) - 2022-08-16 ### State Machine Breaking -- (deps) [\#845](https://github.com/evmos/evmos/pull/845) Bump Ethermint version to [`v0.19.0`](https://github.com/evmos/ethermint/releases/tag/v0.19.0) -- (revenue) Add `x/revenue` module +- (deps) [#845](https://github.com/evmos/evmos/pull/845) Bump Ethermint version to [`v0.19.0`](https://github.com/evmos/ethermint/releases/tag/v0.19.0). +- (revenue) [#929](https://github.com/evmos/evmos/pull/929) Add `x/revenue` module. ### Improvements -- (deps) [\#839](https://github.com/evmos/evmos/pull/839) Bump ibc-go to [`v3.2.0`](https://github.com/cosmos/ibc-go/releases/tag/v3.2.0) and Cosmos SDK to [`v0.45.7`](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.45.7). -- (build) [\#725](https://github.com/evmos/evmos/pull/725) Migrate Protobuf code generator to [Protobuf Workspaces](https://docs.buf.build/reference/workspaces) +- (deps) [#839](https://github.com/evmos/evmos/pull/839) Bump ibc-go to [`v3.2.0`](https://github.com/cosmos/ibc-go/releases/tag/v3.2.0) and Cosmos SDK to [`v0.45.7`](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.45.7). +- (build) [#725](https://github.com/evmos/evmos/pull/725) Migrate Protobuf code generator to [Protobuf Workspaces](https://docs.buf.build/reference/workspaces). ### Bug Fixes -- (build) [\#856](https://github.com/evmos/evmos/pull/856) Update docker base image to use golang:1.18.5-bullseye and expose other relevant ports +- (build) [#856](https://github.com/evmos/evmos/pull/856) Update docker base image to use golang:1.18.5-bullseye and expose other relevant ports. -## [v7.0.0] - 2022-08-04 +## [v7.0.0](https://github.com/evmos/evmos/releases/tag/v7.0.0) - 2022-08-04 ### State Machine Breaking -- (deps) Bump Ethermint version to [`v0.18.0`](https://github.com/evmos/ethermint/releases/tag/v0.18.0) +- (deps) [#825](https://github.com/evmos/evmos/pull/825) Bump Ethermint version to [`v0.18.0`](https://github.com/evmos/ethermint/releases/tag/v0.18.0). ### Bug Fixes -- (app) [\#760](https://github.com/evmos/evmos/pull/760) Migrate inaccessible balance of testnet faucet account to new address -- (inflation) [\#748](https://github.com/evmos/evmos/pull/748) Remove overcounted epochs from `skippedEpochs` value in store +- (app) [#760](https://github.com/evmos/evmos/pull/760) Migrate inaccessible balance of testnet faucet account to new address. +- (inflation) [#748](https://github.com/evmos/evmos/pull/748) Remove overcounted epochs from `skippedEpochs` value in store. -## [v6.0.3] - 2022-07-26 +## [v6.0.3](https://github.com/evmos/evmos/releases/tag/v6.0.3) - 2022-07-26 ### Bug Fixes -- (deps) [\#803](https://github.com/evmos/evmos/pull/803) Bump Ethermint version to [`v0.17.2`](https://github.com/evmos/ethermint/releases/tag/v0.17.2) +- (deps) [#803](https://github.com/evmos/evmos/pull/803) Bump Ethermint version to [`v0.17.2`](https://github.com/evmos/ethermint/releases/tag/v0.17.2). -## [v6.0.2] - 2022-07-13 +## [v6.0.2](https://github.com/evmos/evmos/releases/tag/v6.0.2) - 2022-07-13 ### Bug Fixes -- (deps) [\#769](https://github.com/evmos/evmos/pull/769) Bump Ethermint version to [`v0.17.1`](https://github.com/evmos/ethermint/releases/tag/v0.17.1) +- (deps) [#769](https://github.com/evmos/evmos/pull/769) Bump Ethermint version to [`v0.17.1`](https://github.com/evmos/ethermint/releases/tag/v0.17.1). -## [v6.0.1] - 2022-06-28 +## [v6.0.1](https://github.com/evmos/evmos/releases/tag/v6.0.1) - 2022-06-28 ### Improvements -- (ci) [\#729](https://github.com/evmos/evmos/pull/729) Remove unshallow action in goreleaser. +- (ci) [#729](https://github.com/evmos/evmos/pull/729) Remove unshallow action in goreleaser. -## [v6.0.0] - 2022-06-28 +## [v6.0.0](https://github.com/evmos/evmos/releases/tag/v6.0.0) - 2022-06-28 ### State Machine Breaking -- (deps) [\#719](https://github.com/evmos/evmos/pull/719) Bump Ethermint version to [`v0.17.0`](https://github.com/evmos/ethermint/releases/tag/v0.17.0) +- (deps) [#719](https://github.com/evmos/evmos/pull/719) Bump Ethermint version to [`v0.17.0`](https://github.com/evmos/ethermint/releases/tag/v0.17.0). ### API Breaking -- (all) [\#701](https://github.com/evmos/evmos/pull/703) Rename Go module to `evmos/evmos` +- (all) [#701](https://github.com/evmos/evmos/pull/701) Rename Go module to `evmos/evmos`. ### Improvements -- (deps) [\#714](https://github.com/evmos/evmos/pull/714) Bump Go version to `1.18`. -- (cmd) [\#696](https://github.com/evmos/evmos/pull/696) Set a custom tendermint node configuration on initialization. -- (revenue) [\#685](https://github.com/evmos/evmos/pull/685) Internal Specification audit. -- (revenue) [\#691](https://github.com/evmos/evmos/pull/691) Internal API audit. -- (revenue) [\#715](https://github.com/evmos/evmos/pull/715) Internal state machine audit. +- (deps) [#714](https://github.com/evmos/evmos/pull/714) Bump Go version to `1.18`. +- (cli) [#696](https://github.com/evmos/evmos/pull/696) Set a custom tendermint node configuration on initialization. +- (revenue) [#685](https://github.com/evmos/evmos/pull/685) Internal Specification audit. +- (revenue) [#691](https://github.com/evmos/evmos/pull/691) Internal API audit. +- (revenue) [#715](https://github.com/evmos/evmos/pull/715) Internal state machine audit. -## [v5.0.0] - 2022-06-14 +## [v5.0.0](https://github.com/evmos/evmos/releases/tag/v5.0.0) - 2022-06-14 ### State Machine Breaking -- (deps) [\#684](https://github.com/evmos/evmos/pull/684) Bump ibc-go version to [`v3.1.0`](https://github.com/cosmos/ibc-go/releases/tag/v3.1.0) -- (vesting) [\#666](https://github.com/evmos/evmos/pull/666) Remove support of Cosmos SDK `VestingAccount` types. -- (deps) [\#663](https://github.com/evmos/evmos/pull/663) Bump Ethermint version to [`v0.16.1`](https://github.com/evmos/ethermint/releases/tag/v0.16.1) -- (claims) [\#605](https://github.com/evmos/evmos/pull/605) Remove duplicated `SetClaimsRecord`. -- (erc20) [\#602](https://github.com/evmos/evmos/pull/602) Modified `RegisterERC20` proposals. +- (deps) [#684](https://github.com/evmos/evmos/pull/684) Bump ibc-go version to [`v3.1.0`](https://github.com/cosmos/ibc-go/releases/tag/v3.1.0). +- (vesting) [#666](https://github.com/evmos/evmos/pull/666) Remove support of Cosmos-SDK `VestingAccount` types. +- (deps) [#663](https://github.com/evmos/evmos/pull/663) Bump Ethermint version to [`v0.16.1`](https://github.com/evmos/ethermint/releases/tag/v0.16.1). +- (claims) [#605](https://github.com/evmos/evmos/pull/605) Remove duplicated `SetClaimsRecord` and `claims-` prefix from CLI query commands. +- (erc20) [#602](https://github.com/evmos/evmos/pull/602) Modified `RegisterERC20` proposals. Fix erc20 name sanitization to allow spaces on token name. ### API Breaking -- (claims) [\#605](https://github.com/evmos/evmos/pull/605) Remove `claims-` prefix in CLI query commands. -- (erc20) [\#592](https://github.com/evmos/evmos/pull/592) Finish module completeness audit. -- (analytics) [\#637](https://github.com/evmos/evmos/pull/637) Add telemetry to Evmos modules. -- (vesting) [\#643](https://github.com/evmos/evmos/pull/643) Remove the `create-vesting-account` CLI command from Cosmos SDK in favor of the clawback vesting accounts. +- (erc20) [#592](https://github.com/evmos/evmos/pull/592) Finish module completeness audit. +- (metrics) [#637](https://github.com/evmos/evmos/pull/637) Add telemetry to Evmos modules. +- (vesting) [#643](https://github.com/evmos/evmos/pull/643) Remove the `create-vesting-account` CLI command from Cosmos-SDK in favor of the clawback vesting accounts. ### Improvements -- (erc20) [\#677](https://github.com/evmos/evmos/pull/677) Add Amino registration to `ConvertCoin` and `ConvertERC20` msgs for ERC712 compatibility. -- (deps) [\#668](https://github.com/evmos/evmos/pull/668) Bump Cosmos SDK to [`v0.45.5`](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.45.5) -- (erc20) [\#642](https://github.com/evmos/evmos/pull/642) Remove enforcing ibc and channel names during `RegisterCoin` +- (erc20) [#677](https://github.com/evmos/evmos/pull/677) Add Amino registration to `ConvertCoin` and `ConvertERC20` msgs for ERC712 compatibility. +- (deps) [#668](https://github.com/evmos/evmos/pull/668) Bump Cosmos-SDK to [`v0.45.5`](https://github.com/cosmos/Cosmos-SDK/releases/tag/v0.45.5). +- (erc20) [#642](https://github.com/evmos/evmos/pull/642) Remove enforcing IBC and channel names during `RegisterCoin`. ### Bug Fixes -- (app) [\#682](https://github.com/evmos/evmos/pull/682) Fix Tendermint consensus params (Evidence `MaxAgeNumBlocks` and `MaxAgeDuration`) -- (incentives) [\#656](https://github.com/evmos/evmos/pull/656) Fix incentives that were previously only allocated to `EthAccount`s. -- (revenue) [\#612](https://github.com/evmos/evmos/pull/612) Fix fees registration cli command and description -- (inflation) [\#554](https://github.com/evmos/evmos/pull/554) Changing erroneous epoch skips to `daily` instead of `weekly` -- (claims) [\#626](https://github.com/evmos/evmos/pull/626) fix durations denominated in `nanoseconds` -- (epochs) [\#629](https://github.com/evmos/evmos/pull/629) fix epochs durations denominated in `nanoseconds` +- (app) [#682](https://github.com/evmos/evmos/pull/682) Fix Tendermint consensus params (Evidence `MaxAgeNumBlocks` and `MaxAgeDuration`). +- (incentives) [#656](https://github.com/evmos/evmos/pull/656) Fix incentives that were previously only allocated to `EthAccount`s. +- (revenue) [#612](https://github.com/evmos/evmos/pull/612) Fix fees registration CLI command and description. +- (inflation) [#554](https://github.com/evmos/evmos/pull/554) Changing erroneous epoch skips to `daily` instead of `weekly`. +- (claims) [#626](https://github.com/evmos/evmos/pull/626) Fix durations denominated in `nanoseconds`. +- (epochs) [#629](https://github.com/evmos/evmos/pull/629) Fix epochs durations denominated in `nanoseconds`. -## [v4.0.1] - 2022-05-10 +## [v4.0.1](https://github.com/evmos/evmos/releases/tag/v4.0.1) - 2022-05-10 ### Bug Fixes (erc20) [\#588](https://github.com/evmos/evmos/pull/588) Revert PR [\#556](https://github.com/evmos/evmos/pull/556). -## [v4.0.0] - 2022-05-09 +## [v4.0.0](https://github.com/evmos/evmos/releases/tag/v4.0.0) - 2022-05-09 ### State Machine Breaking -- (app) [\#537](https://github.com/evmos/evmos/pull/537) Fix router key for IBC client proposals. -- (erc20) [\#530](https://github.com/evmos/evmos/pull/530) Use the highest denom unit when deploying an ERC20 contract. +- (app) [#537](https://github.com/evmos/evmos/pull/537) Fix router key for IBC client proposals. +- (erc20) [#530](https://github.com/evmos/evmos/pull/530) Use the highest denom unit when deploying an ERC-20 contract and fix `Metadata` equality check for denom units. ### API Breaking -- (upgrade) [\#557](https://github.com/evmos/evmos/pull/557) Update Evmos go.mod version `v3` -> `v4` -- (erc20) [\#544](https://github.com/evmos/evmos/pull/544) Remove `updateTokenPairERC20Proposal` functionality rename `relay` to `conversion` -- (inflation) [\#536](https://github.com/evmos/evmos/pull/536) Rename inflation endpoint `/evmos/inflation/v1/total_supply` -> `/evmos/inflation/v1/circulating_supply` +- (upgrade) [#557](https://github.com/evmos/evmos/pull/557) Update Evmos go.mod version `v3` -> `v4`. +- (erc20) [#544](https://github.com/evmos/evmos/pull/544) Remove `updateTokenPairERC20Proposal` functionality rename `relay` to `conversion`. +- (inflation) [#536](https://github.com/evmos/evmos/pull/536) Rename inflation endpoint `/evmos/inflation/v1/total_supply` -> `/evmos/inflation/v1/circulating_supply`. ### Improvements -- (deps) [\#580](https://github.com/evmos/evmos/pull/580) Bump Ethermint to [`v0.15.0`](https://github.com/evmos/ethermint/releases/tag/v0.15.0) -- (gitpod) [\#564](https://github.com/evmos/evmos/pull/564) Add one-click development environment -- (erc20) [\#556](https://github.com/evmos/evmos/pull/556) Remove deprecated migrations. -- (incentives) [\#551](https://github.com/evmos/evmos/pull/551) Add additional check to only distribute incentives to EOAs. -- (cmd) [\#543](https://github.com/evmos/evmos/pull/543) Update mainnet default `min-gas-price` to `0.0025aevmos`. -- (epochs) [\#539](https://github.com/evmos/evmos/pull/539) Use constants for epoch identifiers. +- (deps) [#580](https://github.com/evmos/evmos/pull/580) Bump Ethermint to [`v0.15.0`](https://github.com/evmos/ethermint/releases/tag/v0.15.0). +- (ci) [#564](https://github.com/evmos/evmos/pull/564) Add one-click development environment. +- (erc20) [#556](https://github.com/evmos/evmos/pull/556) Remove deprecated migrations. +- (incentives) [#551](https://github.com/evmos/evmos/pull/551) Add additional check to only distribute incentives to EOAs. +- (cli) [#543](https://github.com/evmos/evmos/pull/543) Update mainnet default `min-gas-price` to `0.0025aevmos`. +- (epochs) [#539](https://github.com/evmos/evmos/pull/539) Use constants for epoch identifiers. ### Bug Fixes -- (erc20) [\#530](https://github.com/evmos/evmos/pull/530) Fix `Metadata` equal check for denom units. -- (app) [\#523](https://github.com/evmos/evmos/pull/523) Fix testnet upgrade store loader. +- (app) [#523](https://github.com/evmos/evmos/pull/523) Fix testnet upgrade store loader. -## [v3.0.1] - 2022-05-09 +## [v3.0.1](https://github.com/evmos/evmos/releases/tag/v3.0.1) - 2022-05-09 ### Improvements -- (app) [\#555](https://github.com/evmos/evmos/pull/555) `v4.0.0` upgrade logic. -- (p2p) [\#541](https://github.com/evmos/evmos/pull/541) Increase default inbound connections and use 8:1 ratio of inbound:outbound. +- (app) [#555](https://github.com/evmos/evmos/pull/555) `v4.0.0` upgrade logic. +- (cli) [#541](https://github.com/evmos/evmos/pull/541) Increase default inbound connections and use 8:1 ratio of inbound:outbound. Add default seeds to reduce the need for configuration. -- (deps) [\#528](https://github.com/evmos/evmos/pull/528) Bump Cosmos SDK to [`v0.45.4`](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.45.4) +- (deps) [#528](https://github.com/evmos/evmos/pull/528) Bump Cosmos-SDK to [`v0.45.4`](https://github.com/cosmos/Cosmos-SDK/releases/tag/v0.45.4). -## [v3.0.0] - 2022-04-22 +## [v3.0.0](https://github.com/evmos/evmos/releases/tag/v3.0.0) - 2022-04-22 ### State Machine Breaking -- [\#342](https://github.com/evmos/evmos/pull/342) Implement IBC middleware to recover stuck funds +- (ibc) [#342](https://github.com/evmos/evmos/pull/342) Implement IBC middleware to recover stuck funds. ### API Breaking -- [\#415](https://github.com/evmos/evmos/pull/415) Bump Evmos go version to v3 +- (go) [#415](https://github.com/evmos/evmos/pull/415) Bump Evmos go version to v3. ### Bug Fixes -- (vesting) [\#502](https://github.com/evmos/evmos/pull/502) Fix gas exhaustion bug by removing `SpendableCoins` during vesting account clawback. -- (vesting) [\#483](https://github.com/evmos/evmos/pull/483) Fix balance clawback when vesting start time is in the future -- (claims) [\#381](https://github.com/evmos/evmos/pull/381) Fix claim migration and deletion for EVM chains via IBC attestation. -- (claims) [\#374](https://github.com/evmos/evmos/pull/374) Fix balance invariant in Claims `InitGenesis` -- (erc20) [\#366](https://github.com/evmos/evmos/issues/366) Delete ERC20 denom map when deleting pair. -- (claims) [\#505](https://github.com/evmos/evmos/pull/505) Fix IBC attestation ordering +- (vesting) [#502](https://github.com/evmos/evmos/pull/502) Fix gas exhaustion bug by removing `SpendableCoins` during vesting account clawback. +- (vesting) [#483](https://github.com/evmos/evmos/pull/483) Fix balance clawback when vesting start time is in the future. +- (claims) [#381](https://github.com/evmos/evmos/pull/381) Fix claim migration and deletion for EVM chains via IBC attestation. +- (claims) [#374](https://github.com/evmos/evmos/pull/374) Fix balance invariant in Claims `InitGenesis`. +- (erc20) [#366](https://github.com/evmos/evmos/pull/366) Delete ERC-20 denom map when deleting pair. +- (claims) [#505](https://github.com/evmos/evmos/pull/505) Fix IBC attestation ordering. ### Improvements -- (vesting) [\#486](https://github.com/evmos/evmos/pull/486) Refactor `x/vesting` types and tests. -- (erc20) [\#484](https://github.com/evmos/evmos/pull/484) Avoid unnecessary commits to the StateDB and don't estimate gas when performing a query -- (deps) [\#478](https://github.com/evmos/evmos/pull/478) Bump Cosmos SDK to [`v0.45.3`](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.45.3) -- (deps) [\#478](https://github.com/evmos/evmos/pull/478) Bump Ethermint to [`v0.14.0`](https://github.com/evmos/ethermint/releases/tag/v0.14.0) -- (vesting) [\#468](https://github.com/evmos/evmos/pull/468) Use coins `Min` function from Cosmos SDK. -- (cmd) [\#446](https://github.com/evmos/evmos/pull/446) Update `migrate` command to migrate Evmos, Ethermint and Cosmos SDK modules. -- (app) [\#446](https://github.com/evmos/evmos/pull/446) Refactor upgrade code. -- (ibc) [\#412](https://github.com/evmos/evmos/pull/412) Introduce boilerplate struct for IBC applications. -- (deps) [\#402](https://github.com/evmos/evmos/pull/402) Bump IBC go to [`v3.0.0`](https://github.com/cosmos/ibc-go/releases/tag/v3.0.0) -- (ibctesting) [\#388](https://github.com/evmos/evmos/pull/388) Support Cosmos and EVM chains in IBC testing `Coordinator`. -- (claims) [\#385](https://github.com/evmos/evmos/pull/385) Add claims invariant. -- (inflation) [\#383](https://github.com/evmos/evmos/pull/383) Add gRPC endpoints for inflation rate and total supply -- (inflation) [\#369](https://github.com/evmos/evmos/pull/369) Add `enableInflation` parameter. -- (claims) [\#432](https://github.com/evmos/evmos/pull/432) Add IBC trigger amount to claims merge/migrate IBC callbacks. -- (claims) [\#442](https://github.com/evmos/evmos/pull/443) Remove claims merge/migrate cases where sender already completed an action as they are never reached -- (claims) [\#507](https://github.com/evmos/evmos/pull/507) Always return claimable amount on grpc queries regarding of claims status. -- (claims) [\#516](https://github.com/evmos/evmos/pull/516) Retain claims records when all actions have been completed. +- (vesting) [#486](https://github.com/evmos/evmos/pull/486) Refactor `x/vesting` types and tests. +- (erc20) [#484](https://github.com/evmos/evmos/pull/484) Avoid unnecessary commits to the StateDB and don't estimate gas when performing a query. +- (deps) [#478](https://github.com/evmos/evmos/pull/478) Bump Cosmos-SDK to [`v0.45.3`](https://github.com/cosmos/Cosmos-SDK/releases/tag/v0.45.3) and Ethermint to [`v0.14.0`](https://github.com/evmos/ethermint/releases/tag/v0.14.0). +- (vesting) [#468](https://github.com/evmos/evmos/pull/468) Use coins `Min` function from Cosmos-SDK. +- (cli) [#446](https://github.com/evmos/evmos/pull/446) Update `migrate` command to migrate Evmos, Ethermint and Cosmos-SDK modules and upgrade code refactors. +- (ibc) [#412](https://github.com/evmos/evmos/pull/412) Introduce boilerplate struct for IBC applications. +- (deps) [#402](https://github.com/evmos/evmos/pull/402) Bump IBC go to [`v3.0.0`](https://github.com/cosmos/ibc-go/releases/tag/v3.0.0). +- (tests) [#388](https://github.com/evmos/evmos/pull/388) Support Cosmos and EVM chains in IBC testing `Coordinator`. +- (claims) [#385](https://github.com/evmos/evmos/pull/385) Add claims invariant. +- (inflation) [#383](https://github.com/evmos/evmos/pull/383) Add gRPC endpoints for inflation rate and total supply. +- (inflation) [#369](https://github.com/evmos/evmos/pull/369) Add `enableInflation` parameter. +- (claims) [#432](https://github.com/evmos/evmos/pull/432) Add IBC trigger amount to claims merge/migrate IBC callbacks. +- (claims) [#442](https://github.com/evmos/evmos/pull/442) Remove claims merge/migrate cases where sender already completed an action as they are never reached. +- (claims) [#507](https://github.com/evmos/evmos/pull/507) Always return claimable amount on grpc queries regarding of claims status. +- (claims) [#516](https://github.com/evmos/evmos/pull/516) Retain claims records when all actions have been completed. -## [v2.0.1] - 2022-03-06 +## [v2.0.1](https://github.com/evmos/evmos/releases/tag/v2.0.1) - 2022-03-06 ### Bug Fixes -- (upgrade) [#\363](https://github.com/evmos/evmos/pull/363) Don't use `GetParams` for upgrades. +- (upgrade) [#363](https://github.com/evmos/evmos/pull/363) Don't use `GetParams` for upgrades. -## [v2.0.0] - 2022-03-06 +## [v2.0.0](https://github.com/evmos/evmos/releases/tag/v2.0.0) - 2022-03-06 ### State Machine Breaking @@ -766,55 +751,50 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### Improvements -- (deps) [\#360](https://github.com/evmos/evmos/pull/360) Bump Ethermint to [`v0.11.0`](https://github.com/evmos/ethermint/releases/tag/v0.11.0) -- (deps) [\#282](https://github.com/evmos/evmos/pull/282) Bump IBC go to [`v3.0.0-rc1`](https://github.com/cosmos/ibc-go/releases/tag/v3.0.0-rc1) +- (deps) [#360](https://github.com/evmos/evmos/pull/360) Bump Ethermint to [`v0.11.0`](https://github.com/evmos/ethermint/releases/tag/v0.11.0). +- (deps) [#282](https://github.com/evmos/evmos/pull/282) Bump IBC go to [`v3.0.0-rc1`](https://github.com/cosmos/ibc-go/releases/tag/v3.0.0-rc1). ### Bug Fixes -- (erc20) [\#337](https://github.com/evmos/evmos/pull/337) Ignore errors in ERC20 module's EVM hook. -- (erc20) [\#336](https://github.com/evmos/evmos/pull/336) Return `nil` for disabled ERC20 module or ERC20 EVM hook. +- (erc20) [#337](https://github.com/evmos/evmos/pull/337) Ignore errors in ERC-20 module's EVM hook. +- (erc20) [#336](https://github.com/evmos/evmos/pull/336) Return `nil` for disabled ERC-20 module or ERC-20 EVM hook. -## [v1.1.2] - 2022-03-06 +## [v1.1.2](https://github.com/evmos/evmos/releases/tag/v1.1.2) - 2022-03-06 ### Bug Fixes -- (app) [\#354](https://github.com/evmos/evmos/pull/354) Add v2 version upgrade logic +- (app) [#354](https://github.com/evmos/evmos/pull/354) Add v2 version upgrade logic. -## [v1.1.1] - 2022-03-04 +## [v1.1.1](https://github.com/evmos/evmos/releases/tag/v1.1.1) - 2022-03-04 ### Improvements -- (deps) [\#345](https://github.com/evmos/evmos/pull/345) Bump Ethermint to [`v0.10.2`](https://github.com/evmos/ethermint/releases/tag/v0.10.2) +- (deps) [#345](https://github.com/evmos/evmos/pull/345) Bump Ethermint to [`v0.10.2`](https://github.com/evmos/ethermint/releases/tag/v0.10.2). ### Bug Fixes -- (app) [\#341](https://github.com/evmos/evmos/pull/341) Return error when `--ledger` flag is passed in CLI +- (app) [#341](https://github.com/evmos/evmos/pull/341) Return error when `--ledger` flag is passed in CLI. -## [v1.1.0] - 2022-03-02 +## [v1.1.0](https://github.com/evmos/evmos/releases/tag/v1.1.0) - 2022-03-02 ### Bug Fixes -- (ante) [\#318](https://github.com/evmos/evmos/pull/318) Add authz check in vesting and min commission `AnteHandler` decorators. -- (vesting) [\#317](https://github.com/evmos/evmos/pull/317) Fix clawback for vested coins. +- (ante) [#318](https://github.com/evmos/evmos/pull/318) Add authz check in vesting and min commission `AnteHandler` decorators. +- (vesting) [#317](https://github.com/evmos/evmos/pull/317) Fix clawback for vested coins. -## [v1.0.0] - 2022-02-28 +## [v1.0.0](https://github.com/evmos/evmos/releases/tag/v1.0.0) - 2022-02-28 ### State Machine Breaking -- (ante) [\#302](https://github.com/evmos/evmos/pull/302) Add AnteHandler decorator to enforce global min validator commission rate. -- (app) [\#224](https://github.com/evmos/evmos/pull/224) Fix power reduction my setting the correct value on app initialization. -- (keys) [\#189](https://github.com/evmos/evmos/pull/189) Remove support for Tendermint's `secp256k1` keys. -- [\#173](https://github.com/evmos/evmos/pull/173) Rename `intrarelayer` module to `erc20` -- [\#190](https://github.com/evmos/evmos/pull/190) Remove governance hook from `erc20` module - -### Features - -- [\#286](https://github.com/evmos/evmos/pull/286) Add `x/vesting` module. -- [\#184](https://github.com/evmos/evmos/pull/184) Add claims module for claiming the airdrop tokens. -- [\#183](https://github.com/evmos/evmos/pull/183) Add epoch module for incentives. -- [\#202](https://github.com/evmos/evmos/pull/202) Add custom configuration for state sync snapshots and tendermint p2p peers. - This introduces a custom `InitCmd` function. -- [\#176](https://github.com/evmos/evmos/pull/176) Add `x/incentives` module. +- (ante) [#302](https://github.com/evmos/evmos/pull/302) Add AnteHandler decorator to enforce global min validator commission rate. +- (app) [#224](https://github.com/evmos/evmos/pull/224) Fix power reduction my setting the correct value on app initialization. +- (app) [#189](https://github.com/evmos/evmos/pull/189) Remove support for Tendermint's `secp256k1` keys. +- (erc20) [#173](https://github.com/evmos/evmos/pull/173) Rename `intrarelayer` module to `erc20`. +- (erc20) [#190](https://github.com/evmos/evmos/pull/190) Remove governance hook from `erc20` module. +- (vesting) [#286](https://github.com/evmos/evmos/pull/286) Add `x/vesting` module. +- (claims) [#184](https://github.com/evmos/evmos/pull/184) Add claims module for claiming the airdrop tokens. +- (incentives) [#183](https://github.com/evmos/evmos/pull/183) Add epoch module for incentives. +- (incentives) [#176](https://github.com/evmos/evmos/pull/176) Add `x/incentives` module. ### Improvements @@ -822,106 +802,108 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (deps) Bumped IBC-go to `v3.0.0-rc0` - (deps) Bumped Cosmos SDK to [`v0.45.1`](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.45.1) - (deps) bumped Tendermint to `v0.34.15` and tm-db to `v0.6.6`. -- [\#180](https://github.com/evmos/evmos/pull/180) Delete `TokenPair` if ERC20 contract has been selfdestructed. +- (erc20) [#180](https://github.com/evmos/evmos/pull/180) Delete `TokenPair` if ERC-20 contract has been selfdestructed. +- (cli) [#202](https://github.com/evmos/evmos/pull/202) Add custom configuration for state sync snapshots and tendermint p2p peers. + This introduces a custom `InitCmd` function. ### Bug Fixes -- (erc20) [\#169](https://github.com/evmos/evmos/pull/169) Fixes several testnet bugs: +- (erc20) [#169](https://github.com/evmos/evmos/pull/169) Fixes several testnet bugs:. - Check if supply exists for a token before when submitting a `RegisterCoinProposal`, allowing users to create an ERC20 representation of an invalid Cosmos Coin. - Sanitize the ERC20 token name when creating coin metadata on ER `RegisterERC20Proposal`. - Fix coin metadata validation error when registering an ERC20 with 0 denom units. -- (erc20) [\#191](https://github.com/evmos/evmos/pull/191) Add direct balance protection (IF-ETHERMINT-06). -- (erc20) [\#192](https://github.com/evmos/evmos/pull/192) Add delayed malicious effect protection (IF-ETHERMINT-06). -- (erc20) [\#200](https://github.com/evmos/evmos/pull/200) Match coin and token decimals for erc20 deployment during registerCoin -- (erc20) [\#201](https://github.com/evmos/evmos/pull/201) bug(erc-20): Compile built-in contracts in the build process (IF-ETHERMINT-02). +- (erc20) [#191](https://github.com/evmos/evmos/pull/191) Add direct balance protection (IF-ETHERMINT-06). +- (erc20) [#192](https://github.com/evmos/evmos/pull/192) Add delayed malicious effect protection (IF-ETHERMINT-06). +- (erc20) [#200](https://github.com/evmos/evmos/pull/200) Match coin and token decimals for ERC-20 deployment during registerCoin. +- (erc20) [#201](https://github.com/evmos/evmos/pull/201) Bug(erc-20): Compile built-in contracts in the build process (IF-ETHERMINT-02). -## [v0.4.2] - 2021-12-11 +## [v0.4.2](https://github.com/evmos/evmos/releases/tag/v0.4.2) - 2021-12-11 ### Bug Fixes -- (app) [\#166](https://github.com/evmos/evmos/pull/166) Fix `UpgradeHandler`. +- (app) [#166](https://github.com/evmos/evmos/pull/166) Fix `UpgradeHandler`. -## [v0.4.1] - 2021-12-07 +## [v0.4.1](https://github.com/evmos/evmos/releases/tag/v0.4.1) - 2021-12-07 ### Improvements -- (build) [\#143](https://github.com/evmos/evmos/pull/143) Added `build-reproducible` rule in `Makefile` to build docker containers +- (build) [#143](https://github.com/evmos/evmos/pull/143) Added `build-reproducible` rule in `Makefile` to build docker containers. ### Bug Fixes -- (build) [\#151](https://github.com/evmos/evmos/pull/151) Fixes `version` command by picking the latest tag in the current branch instead of across all branches as the current version +- (build) [#151](https://github.com/evmos/evmos/pull/151) Fixes `version` command by picking the latest tag in the current branch instead of across all branches as the current version. -## [v0.4.0] - 2021-12-02 +## [v0.4.0](https://github.com/evmos/evmos/releases/tag/v0.4.0) - 2021-12-02 ### State Machine Breaking -- (erc20) [\#119](https://github.com/evmos/evmos/issues/119) Register `x/erc20` proposal types on governance module. +- (erc20) [#119](https://github.com/evmos/evmos/pull/119) Register `x/erc20` proposal types on governance module. ### Improvements -- (app) [\#128](https://github.com/evmos/evmos/pull/128) Add ibc-go `TestingApp` interface. -- (ci) [\#117](https://github.com/evmos/evmos/pull/117) Enable automatic backport of PRs. -- (deps) [\#135](https://github.com/evmos/evmos/pull/135) Bump Ethermint version to [`v0.9.0`](https://github.com/evmos/ethermint/releases/tag/v0.9.0) -- (ci) [\#136](https://github.com/evmos/evmos/pull/136) Deploy `evmos` docker container to [docker hub](https://hub.docker.com/u/tharsishq) for every versioned releases +- (app) [#128](https://github.com/evmos/evmos/pull/128) Add ibc-go `TestingApp` interface. +- (ci) [#117](https://github.com/evmos/evmos/pull/117) Enable automatic backport of PRs. +- (deps) [#135](https://github.com/evmos/evmos/pull/135) Bump Ethermint version to [`v0.9.0`](https://github.com/evmos/ethermint/releases/tag/v0.9.0). +- (ci) [#136](https://github.com/evmos/evmos/pull/136) Deploy `evmos` docker container to [docker hub](https://hub.docker.com/u/tharsishq) for every versioned releases. ### Bug Fixes -- (build) [\#116](https://github.com/evmos/evmos/pull/116) Fix `build-docker` command +- (build) [#116](https://github.com/evmos/evmos/pull/116) Fix `build-docker` command. -## [v0.3.0] - 2021-11-24 +## [v0.3.0](https://github.com/evmos/evmos/releases/tag/v0.3.0) - 2021-11-24 ### API Breaking -- (erc20) [\#99](https://github.com/evmos/evmos/pull/99) Rename `enable_e_v_m_hook` json parameter to `enable_evm_hook`. +- (erc20) [#99](https://github.com/evmos/evmos/pull/99) Rename `enable_e_v_m_hook` json parameter to `enable_evm_hook`. ### Improvements -- (deps) [\#110](https://github.com/evmos/evmos/pull/110) Bump Ethermint version to [`v0.8.1`](https://github.com/evmos/ethermint/releases/tag/v0.8.1) -- (erc20) [\#107](https://github.com/evmos/evmos/pull/107) Add IBC validation -- (cmd) [\#105](https://github.com/evmos/evmos/pull/105) Improve testnet command to include JSON-RPC client. +- (deps) [#110](https://github.com/evmos/evmos/pull/110) Bump Ethermint version to [`v0.8.1`](https://github.com/evmos/ethermint/releases/tag/v0.8.1). +- (erc20) [#107](https://github.com/evmos/evmos/pull/107) Add IBC validation. +- (cli) [#105](https://github.com/evmos/evmos/pull/105) Improve testnet command to include JSON-RPC client. -## Bug Fixes +### Bug Fixes -- (erc20) [\#109](https://github.com/evmos/evmos/pull/109) Fix hardcoded erc20 nonce and `UpdateTokenPairERC20` proposal to support ERC20s with 0 decimals. -- (erc20) [\#102](https://github.com/evmos/evmos/pull/102) Add `convert-erc20` cmd +- (erc20) [#109](https://github.com/evmos/evmos/pull/109) Fix hardcoded erc20 nonce and `UpdateTokenPairERC20` proposal to support ERC20s with 0 decimals. +- (erc20) [#102](https://github.com/evmos/evmos/pull/102) Add `convert-erc20` cmd. -## [v0.2.0] - 2021-11-17 +## [v0.2.0](https://github.com/evmos/evmos/releases/tag/v0.2.0) - 2021-11-17 ### Features -- (erc20) [\#82](https://github.com/evmos/evmos/pull/82) ERC20 module -- (cmd) [\#32](https://github.com/evmos/evmos/pull/32) Create `testnet` command that spins up a new local testnet with N nodes. +- (erc20) [#82](https://github.com/evmos/evmos/pull/82) ERC-20 module. +- (cli) [#32](https://github.com/evmos/evmos/pull/32) Create `testnet` command that spins up a new local testnet with N nodes. ### Improvements -- (deps) [\#94](https://github.com/evmos/evmos/pull/94) Bump Ethermint version to [`v0.8.0`](https://github.com/evmos/ethermint/releases/tag/v0.8.0) -- (deps) [\#80](https://github.com/evmos/evmos/pull/80) Bump ibc-go to [`v2.0.0`](https://github.com/cosmos/ibc-go/releases/tag/v2.0.0) +- (deps) [#94](https://github.com/evmos/evmos/pull/94) Bump Ethermint version to [`v0.8.0`](https://github.com/evmos/ethermint/releases/tag/v0.8.0). +- (deps) [#80](https://github.com/evmos/evmos/pull/80) Bump ibc-go to [`v2.0.0`](https://github.com/cosmos/ibc-go/releases/tag/v2.0.0). -## [v0.1.3] - 2021-10-24 +## [v0.1.3](https://github.com/evmos/evmos/releases/tag/v0.1.3) - 2021-10-24 ### Improvements -- (deps) [\#64](https://github.com/evmos/evmos/pull/64) Bump Ethermint version to `v0.7.2` +- (deps) [#64](https://github.com/evmos/evmos/pull/64) Bump Ethermint version to `v0.7.2`. ### Bug Fixes -- (cmd) [\#41](https://github.com/evmos/evmos/pull/41) Fix `debug` command. +- (cli) [#41](https://github.com/evmos/evmos/pull/41) Fix `debug` command. -## [v0.1.2] - 2021-10-08 +## [v0.1.2](https://github.com/evmos/evmos/releases/tag/v0.1.2) - 2021-10-08 ### Improvements -- (deps) [\#34](https://github.com/evmos/evmos/pull/34) Bump Ethermint version to `v0.7.1` +- (deps) [#34](https://github.com/evmos/evmos/pull/34) Bump Ethermint version to `v0.7.1`. -## [v0.1.1] - 2021-10-07 +## [v0.1.1](https://github.com/evmos/evmos/releases/tag/v0.1.1) - 2021-10-07 ### Bug Fixes -- (build) [\#30](https://github.com/evmos/evmos/pull/30) Fix `version` command. +- (build) [#30](https://github.com/evmos/evmos/pull/30) Fix `version` command. -## [v0.1.0] - 2021-10-07 +## [v0.1.0](https://github.com/evmos/evmos/releases/tag/v0.1.0) - 2021-10-07 ### Improvements -- (cmd) [\#26](https://github.com/evmos/evmos/pull/26) Use config on genesis accounts. -- (deps) [\#28](https://github.com/evmos/evmos/pull/28) Bump Ethermint version to `v0.7.0` +- (cli) [#26](https://github.com/evmos/evmos/pull/26) Use config on genesis accounts. +- (deps) [#28](https://github.com/evmos/evmos/pull/28) Bump Ethermint version to `v0.7.0`. diff --git a/Makefile b/Makefile index 8258cc23a1..8e3c30dab6 100644 --- a/Makefile +++ b/Makefile @@ -369,6 +369,10 @@ test-rpc: test-rpc-pending: ./scripts/integration-test-all.sh -t "pending" -q 1 -z 1 -s 2 -m "pending" -r "true" +test-scripts: + @echo "Running scripts tests" + @pytest -s -vv ./scripts + test-solidity: @echo "Beginning solidity tests..." ./scripts/run-solidity-tests.sh @@ -635,9 +639,17 @@ create-contracts-json: @rm -rf $(TMP) ############################################################################### -### Licenses ### +### Miscellaneous Checks ### ############################################################################### check-licenses: @echo "Checking licenses..." - @python3 scripts/check_licenses.py . + @python3 scripts/license_checker/check_licenses.py . + +check-changelog: + @echo "Checking changelog..." + @python3 scripts/changelog_checker/check_changelog.py ./CHANGELOG.md + +fix-changelog: + @echo "Fixing changelog..." + @python3 scripts/changelog_checker/check_changelog.py ./CHANGELOG.md --fix diff --git a/scripts/changelog_checker/README.md b/scripts/changelog_checker/README.md new file mode 100644 index 0000000000..8e4c3687d5 --- /dev/null +++ b/scripts/changelog_checker/README.md @@ -0,0 +1,28 @@ +# Changelog Checker + +This utility checks if the contents of the changelog fit the desired formatting and spelling requirements. +Run the checker by executing `make check-changelog` in the root directory of the repository. + +```bash +make check-changelog +``` + +It is also possible to have the script fix some easily fixable issues automatically. + +```bash +make fix-changelog +``` + +## Configuration + +It is possible to adjust the configuration of the changelog checker +by adjusting the contents of `config.py`. + +Things that can be adjusted include: + +- the allowed change types with a release +- the allowed description categories (i.e. the `(...)` portion at the beginning of an entry) +- PRs that are allowed to occur twice in the changelog (e.g. backports of bug fixes) +- a set of known patterns in PR descriptions and their preferred way of spelling +- known exceptions that do not need to follow the formatting rules +- the legacy version at which to stop the checking diff --git a/scripts/changelog_checker/change_type.py b/scripts/changelog_checker/change_type.py new file mode 100644 index 0000000000..47f6bab223 --- /dev/null +++ b/scripts/changelog_checker/change_type.py @@ -0,0 +1,56 @@ +""" +This file contains the definition for the ChangeType class. It is used to parse the section header for a +given type of changes like improvements or bug fixes. +""" + +import re +from typing import List + +from config import ALLOWED_CHANGE_TYPES +from entry import check_spelling + +# Allowed change type pattern, e.g. `### Bug Fixes` +CHANGE_TYPE_PATTERN = re.compile( + r"^### (?P[a-zA-Z0-9\- ]+)\s*$", +) + + +class ChangeType: + """ + This class represents a section header in the changelog. + """ + + def __init__(self, line: str): + self.line: str = line + self.fixed: str = line + self.type: str = "" + self.problems: List[str] = [] + + def parse(self) -> bool: + """ + Parses a change type entry from a line of text. + + :return: boolean indicating whether the parsing was successful + """ + + problems: List[str] = [] + match = CHANGE_TYPE_PATTERN.match(self.line) + if not match: + problems.append(f'Malformed change type: "{self.line}"') + self.problems = problems + return False + + self.type = match.group("type") + + type_found, fixed_type, spelling_problems = check_spelling( + self.type, ALLOWED_CHANGE_TYPES + ) + if not type_found: + problems.append(f'"{self.type}" is not a valid change type') + if spelling_problems: + problems.extend(spelling_problems) + + self.fixed = f"### {fixed_type}" + self.problems = problems + + return problems == [] diff --git a/scripts/changelog_checker/check_changelog.py b/scripts/changelog_checker/check_changelog.py new file mode 100644 index 0000000000..69dd0b7a8d --- /dev/null +++ b/scripts/changelog_checker/check_changelog.py @@ -0,0 +1,168 @@ +""" +This file contains the logic to check the changelog contents. + +It is possible to run this script with the `--fix` flag to automatically +fix a selection of common problems in the changelog. + +Usage: + python3 check_changelog.py [--fix] + +""" + +import io +import os +import sys +from typing import Dict, List, Union + +from change_type import ChangeType +from config import ALLOWED_DUPLICATES, LEGACY_VERSION +from entry import Entry +from release import Release + + +def write(file: Union[None, io.TextIOWrapper], line: str): + """ + This function writes a line to a file. + + :param file: The file to write to. + :param line: The line to write. + """ + + if file is not None: + file.write(line) + + +class Changelog: + """ + This class represents the contents of the changelog and provides methods to parse it. + """ + + def __init__(self, filename: str): + self.contents: List[str] + self.filename: str = filename + + self.problems: List[str] = [] + self.releases: Dict[str, Dict[str, Dict[int, Dict[str, str]]]] = {} + + if not os.path.exists(self.filename): + raise FileNotFoundError(f'Changelog file "{self.filename}" not found') + + with open(self.filename, "r") as file: + self.contents = file.read().split("\n") + + def parse(self, fix: bool = False) -> bool: + """ + This function parses the changelog and checks if the structure is as expected. + + :param fix: An optional parameter specifying if the changelog should be fixed automatically. + """ + + current_release: str = "" + current_category: str = "" + f = None + is_legacy: bool = False + seen_prs: List[int] = [] + + if fix: + f = open(self.filename, "w") + + try: + for line in self.contents: + if is_legacy: + if fix: + write(f, line + "\n") + continue + + # Check for Header 2 (##) to identify releases + stripped_line = line.strip() + if stripped_line[:3] == "## ": + release = Release(line) + release.parse() + current_release = release.version + if current_release in self.releases: + self.problems.append( + f'Release "{current_release}" is duplicated in the changelog' + ) + else: + self.releases[current_release] = {} + self.problems.extend(release.problems) + + if release <= LEGACY_VERSION: + is_legacy = True + + if fix: + write(f, release.fixed + "\n") + + continue + + # Check for Header 3 (###) to identify change types + if stripped_line[:4] == "### ": + change_type = ChangeType(line) + change_type.parse() + current_category = change_type.type + if current_category in self.releases[current_release]: + self.problems.append( + f'Change type "{current_category}" is duplicated in {current_release}' + ) + else: + self.releases[current_release][current_category] = {} + self.problems.extend(change_type.problems) + + if fix: + write(f, change_type.fixed + "\n") + + continue + + # Check for individual entries + if stripped_line[:2] != "- ": + if fix: + write(f, line + "\n") + + continue + + entry = Entry(line) + entry.parse() + self.problems.extend(entry.problems) + if fix: + write(f, entry.fixed + "\n") + + if not current_category: + raise ValueError(f'Entry "{line}" is missing a category') + + if entry.pr_number in seen_prs: + if ( + not entry.is_exception + and entry.pr_number not in ALLOWED_DUPLICATES + ): + self.problems.append( + f"PR #{entry.pr_number} is duplicated in the changelog" + ) + else: + seen_prs.append(entry.pr_number) + + self.releases[current_release][current_category][entry.pr_number] = { + "description": entry.description + } + finally: + if f is not None: + f.close() + + return self.problems == [] + + +if __name__ == "__main__": + changelog = Changelog(sys.argv[1]) + + fix_mode = False + if len(sys.argv) > 2 and sys.argv[2] == "--fix": + fix_mode = True + + passed = changelog.parse(fix=fix_mode) + if passed: + print(" -> Changelog is valid.") + else: + print( + f"Changelog file is not valid - check the following {len(changelog.problems)} problems:\n" + ) + print("\n".join(changelog.problems)) + sys.exit(1) diff --git a/scripts/changelog_checker/config.py b/scripts/changelog_checker/config.py new file mode 100644 index 0000000000..752cbce851 --- /dev/null +++ b/scripts/changelog_checker/config.py @@ -0,0 +1,147 @@ +""" +This file contains the configurations for the changelog checker. +You can adjust the variables in this file to change the results of the checker. + +Things that can be adjusted are: + + - the allowed change types with a release + - the allowed description categories (i.e. the `(...)` portion at the beginning of an entry) + - PRs that are allowed to occur twice in the changelog (e.g. backports of bug fixes) + - a set of known patterns in PR descriptions and their preferred way of spelling + - known exceptions that do not need to follow the formatting rules + - the legacy version at which to stop the checking + +""" + +import os +import re +from typing import List + + +def get_allowed_categories() -> List[str]: + """ + Returns a list of allowed categories for an individual changelog entry. + + It is using a set of predefined categories, that are extended by the entries in + - the `x/...` modules + - the `precompiles/...` subdirectories + - the `precompiles/outposts/...` subdirectories + + :return: a list of allowed categories for an individual changelog entry + """ + + allowed_categories = [ + "all", + "ante", + "api", + "app", + "build", + "ci", + "cli", + "crisis", + "db", + "deps", + "docs", + "docker", + "eip712", + "fees", + "go", + "make", + "metrics", + "outposts", + "post", + "precompiles", + "proto", + "release", + "rpc", + "swagger", + "testnet", + "tests", + "types", + "utils", + "upgrade", + # third party modules + "bank", + "distribution", + "gov", + "ics20", + "staking", + # outdated modules (we have to keep them since they're in the changelog) + "claims", + "consensus", + "recovery", + "incentives", + ] + + base_path = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) + + module_path = os.path.join(base_path, "x") + for module in os.listdir(module_path): + if os.path.isdir(os.path.join(module_path, module)): + allowed_categories.append(module) + + precompile_path = os.path.join(base_path, "precompiles") + for precompile in os.listdir(precompile_path): + if os.path.isdir(os.path.join(precompile_path, precompile)): + allowed_categories.append(precompile + "-precompile") + + outpost_path = os.path.join(base_path, "precompiles", "outposts") + for outpost in os.listdir(outpost_path): + if os.path.isdir(os.path.join(outpost_path, outpost)): + allowed_categories.append(outpost + "-outpost") + + return allowed_categories + + +# List of allowed categories for an individual changelog entry. +ALLOWED_CATEGORIES = get_allowed_categories() + +# A dictionary of allowed spellings for some common patterns in changelog entries. +ALLOWED_SPELLINGS = { + "ABI": re.compile("abi", re.IGNORECASE), + "API": re.compile("api", re.IGNORECASE), + "CI": re.compile("ci", re.IGNORECASE), + "Cosmos-SDK": re.compile(r"cosmos[\s-]*sdk", re.IGNORECASE), + "CLI": re.compile("cli", re.IGNORECASE), + "EIP-712": re.compile(r"eip[\s-]*712", re.IGNORECASE), + "ERC-20": re.compile(r"erc[\s-]*20", re.IGNORECASE), + "EVM": re.compile("evm", re.IGNORECASE), + "IBC": re.compile("ibc", re.IGNORECASE), + "ICS": re.compile("ics", re.IGNORECASE), + "ICS-20": re.compile(r"ics[\s-]*20", re.IGNORECASE), + "outpost": re.compile("outpost", re.IGNORECASE), + "Osmosis": re.compile("osmosis", re.IGNORECASE), + "PR": re.compile(r"(pr)(\s|$)", re.IGNORECASE), + "precompile": re.compile("precompile", re.IGNORECASE), + "SDK": re.compile("sdk", re.IGNORECASE), + "Stride": re.compile("stride", re.IGNORECASE), + "WERC-20": re.compile(r"werc[\s-]*20", re.IGNORECASE), +} + +# Collection of allowed change types and the matching patterns. +ALLOWED_CHANGE_TYPES = { + "API Breaking": re.compile(r"api\s*breaking", re.IGNORECASE), + "Bug Fixes": re.compile(r"bug\s*fixes", re.IGNORECASE), + "Features": re.compile("features", re.IGNORECASE), + "Improvements": re.compile("improvements", re.IGNORECASE), + "State Machine Breaking": re.compile(r"state\s*machine\s*breaking", re.IGNORECASE), +} + +# A list of pull requests that are allowed to be mentioned multiple times in the changelog. +# Usually, this only applies to bug fixes that were patched on two versions (e.g. v12.1.6 and v13.0.0). +ALLOWED_DUPLICATES = [ + 1370, + 1635, +] + +# A list of known exceptions to the formattiing. This usually applies to PRs that e.g. merged contents from +# a security advisory. +KNOWN_EXCEPTIONS = [ + "- (vesting) Refactor vesting flow.", + "- (vesting) Fix vesting bug.", + "- (vesting) [GHSA-2q3r-p2m3-898g](https://github.com/evmos/evmos/commit/39b750cdaf1d69158ab93da85bd43ae4a7da1456" + + ") Apply ClawbackVestingAccount Barberry patch & Bump SDK to v0.46.13", +] + +# The legacy major version at which to stop the checking. +LEGACY_VERSION: int = 2 diff --git a/scripts/changelog_checker/entry.py b/scripts/changelog_checker/entry.py new file mode 100644 index 0000000000..1ee67fd357 --- /dev/null +++ b/scripts/changelog_checker/entry.py @@ -0,0 +1,255 @@ +""" +This file contains the definition for the Entry class. It is used to parse the individual entries, that +relate to the changes in a specific pull request. + +The expected structure of an entry is: `- (category) [#PR](link) description` +""" + +import re +from typing import Dict, List, Tuple + +from config import ALLOWED_CATEGORIES, ALLOWED_SPELLINGS, KNOWN_EXCEPTIONS + +# Allowed entry pattern: `- (category) [#PR](link) - description` +ENTRY_PATTERN = re.compile( + r"^-(?P\s*)\((?P[a-zA-Z0-9\-]+)\)" + + r"(?P\s*)\[(?P\\)?#(?P\d+)](?P\s*)\((?P[^)]*)\)" + + r"(?P\s*)(?P.+)$", +) + + +class Entry: + """ + This class represents an individual changelog entry that is describing the changes on one specific PR. + """ + + def __init__(self, line: str): + self.line: str = line + self.fixed: str = line + self.backslash: bool = False + self.category: str = "" + self.description: str = "" + self.is_exception: bool = False + self.link: str = "" + self.pr_number: int = 0 + self.problems: List[str] = [] + self.whitespaces: List[str] = [] + + def parse(self) -> bool: + """ + Parses a changelog entry from a line of text. + + :return: a tuple indicating whether the parsing was successful and an error message in case of failure + """ + + problems: List[str] = [] + match = ENTRY_PATTERN.match(self.line) + if not match: + if self.line in KNOWN_EXCEPTIONS: + self.is_exception = True + + return True + + problems.append(f'Malformed entry: "{self.line}"') + self.problems = problems + return False + + self.pr_number = int(match.group("pr")) + self.category = match.group("category") + self.backslash = True if match.group("bs") else False + self.link = match.group("link") + self.description = match.group("desc") + self.whitespaces = [ + match.group("ws1"), + match.group("ws2"), + match.group("ws3"), + match.group("ws4"), + ] + + if self.backslash: + problems.append( + "There should be no backslash in front of the # in the PR link" + ) + + ws_problems = check_whitespace(self.whitespaces) + if ws_problems: + problems.extend(ws_problems) + + fixed_cat, cat_problems = check_category(self.category) + if cat_problems: + problems.extend(cat_problems) + + fixed_link, link_problems = check_link(self.link, self.pr_number) + if link_problems: + problems.extend(link_problems) + + fixed_desc, description_problems = check_description(self.description) + if description_problems: + problems.extend(description_problems) + + self.fixed = f"- ({fixed_cat}) [#{self.pr_number}]({fixed_link}) {fixed_desc}" + self.problems = problems + + return problems == [] + + +def check_whitespace(whitespaces: List[str]) -> List[str]: + """ + Check if the whitespaces are valid. + + :param whitespaces: the whitespaces to check + :return: a list of problems, empty if there are none + """ + + problems: List[str] = [] + + if whitespaces[0] != " ": + problems.append( + "There should be exactly one space between the leading dash and the category" + ) + + if whitespaces[1] != " ": + problems.append( + "There should be exactly one space between the category and PR link" + ) + + if whitespaces[2] != "": + problems.append("There should be no whitespace inside of the markdown link") + + if whitespaces[3] != " ": + problems.append( + "There should be exactly one space between the PR link and the description" + ) + + return problems + + +def check_category(category: str) -> Tuple[str, List[str]]: + """ + Check if the category is valid. + + :param category: the category to check + :return: a tuple containing the fixed category and a list of problems, which is empty if there are none + """ + + problems: List[str] = [] + fixed: str = category + + if not category.islower(): + problems.append(f'Category should be lowercase: "({category})"') + fixed = category.lower() + + if category.lower() not in ALLOWED_CATEGORIES: + problems.append(f'Invalid change category: "({category})"') + + return fixed, problems + + +def check_link(link: str, pr_number: int) -> Tuple[str, List[str]]: + """ + Check if the link is valid. + + :param link: the link to check + :param pr_number: the PR number to match in the link + :return: a tuple containing the fixed link and a list of problems, which is empty if there are none + """ + + problems: List[str] = [] + fixed = link + + if not link.startswith("https://github.com/evmos/evmos/pull/"): + fixed = f"https://github.com/evmos/evmos/pull/{pr_number}" + problems.append(f'PR link should point to evmos repository: "{link}"') + + if str(pr_number) not in link: + fixed = f"https://github.com/evmos/evmos/pull/{pr_number}" + problems.append(f'PR link is not matching PR number {pr_number}: "{link}"') + + return fixed, problems + + +def check_description(description: str) -> Tuple[str, List[str]]: + """ + Check if the description is valid. + + :param description: the description to check + :return: a tuple containing the fixed description and a list of problems, which is empty if there are none + """ + + problems: List[str] = [] + fixed: str = description + + if re.search(r"\w", description[0]) and not description[0].isupper(): + fixed = description[0].upper() + description[1:] + problems.append( + f'PR description should start with capital letter: "{description}"' + ) + + if description[-1] != ".": + problems.append(f'PR description should end with a dot: "{description}"') + fixed += "." + + _, fixed, abbreviation_problems = check_spelling(fixed, ALLOWED_SPELLINGS) + if abbreviation_problems: + problems.extend(abbreviation_problems) + + return fixed, problems + + +def check_spelling( + description: str, expected_spellings: Dict[str, re.Pattern] +) -> Tuple[bool, str, List[str]]: + """ + Checks some common spelling requirements. + Any matches that occur inside of code blocks, are part of a link or inside a word are ignored. + + :param expected_spellings: a dictionary of expected spellings and the matching patterns + :param description: the description to check + :return: a tuple containing a boolean value indicating whether a matching pattern was found and + a list of problems with the match + """ + + problems: List[str] = [] + found: bool = False + fixed: str = description + + for spelling, pattern in expected_spellings.items(): + match = get_match(pattern, description) + if match: + if match != spelling: + problems.append(f'"{spelling}" should be used instead of "{match}"') + fixed = pattern.sub(spelling, fixed) + found = True + + return found, fixed, problems + + +def get_match(pattern: re.Pattern, text: str) -> str: + """ + Returns the first match of the pattern in the text. + Matching patterns inside of code blocks, inside of links or inside of words are ignored. + + :param pattern: the pattern to match + :param text: the text to match against + :return: the first match of the pattern in the text + """ + + codeblocks_pattern = re.compile( + r"`[^`]*(" + pattern.pattern + r")[^`]*`", pattern.flags + ) + match = codeblocks_pattern.search(text) + if match: + return "" + + isolated_word_pattern = re.compile( + r"(^|\s)(" + pattern.pattern + r")(?=$|[\s.])", pattern.flags + ) + match = isolated_word_pattern.search(text) + if match: + return match.group(2) + + return "" + + +if __name__ == "__main__": + print("This is a library file and should not be executed directly.") diff --git a/scripts/changelog_checker/release.py b/scripts/changelog_checker/release.py new file mode 100644 index 0000000000..503e4af3d8 --- /dev/null +++ b/scripts/changelog_checker/release.py @@ -0,0 +1,108 @@ +""" +This file contains the definition of the Release class. It is used to parse a release section header in the +changelog. +""" + +import re +from typing import List, Tuple + +# Allowed unreleased pattern +UNRELEASED_PATTERN = re.compile(r"^## Unreleased$") + +# Unreleased version +UNRELEASED_VERSION = "Unreleased" + +# Allowed release pattern: [vX.Y.Z(-rcN)](LINK) - (YYYY-MM-DD) +RELEASE_PATTERN = re.compile( + r"^## \[(?Pv\d+\.\d+\.\d+(-rc\d+)?)](?P\(.*\))? - (?P\d{4}-\d{2}-\d{2})$", +) + + +class Release: + """ + This class represents a release in the changelog. + """ + + def __init__(self, line: str): + self.line: str = line + self.fixed: str = "" + self.link: str = "" + self.version: str = "" + self.problems: List[str] = [] + + def parse(self) -> bool: + """ + This function parses the release section header. + + :return: a boolean value indicating if the parsing was successful. + """ + + problems: List[str] = [] + + if UNRELEASED_PATTERN.match(self.line): + self.fixed = self.line + self.version = UNRELEASED_VERSION + return True + + release_match = RELEASE_PATTERN.match(self.line) + if not release_match: + problems.append(f'Malformed release header: "{self.line}"') + self.problems = problems + return False + + date = release_match.group("date") + self.link = release_match.group("link") + self.version = release_match.group("version") + + fixed_link, link_problems = check_link(self.link, self.version) + if link_problems: + problems.extend(link_problems) + + fixed = f"## [{self.version}]{fixed_link} - {date}" + self.fixed = fixed + self.problems = problems + + return problems == [] + + def __le__(self, other: int): + if self.version == UNRELEASED_VERSION: + return False + + version_match = re.match( + r"^v(?P\d+)\.(\d+)\.(\d+)(-rc\d+)?$", self.version + ) + if not version_match: + raise ValueError(f'Invalid version "{self.version}"') + + major = int(version_match.group("major")) + return major <= other + + +def check_link(link: str, version: str) -> Tuple[str, List[str]]: + """ + This function checks if the link in the release header is correct. + + :param link: the link in the release header. + :param version: the version in the release header. + :return: a tuple containing the fixed link and a list of problems, which is empty if there are none. + """ + + base_url: str = "https://github.com/evmos/evmos/releases/tag/" + problems: List[str] = [] + # NOTE: the fixed link is the same for all problems + fixed: str = f"({base_url}{version})" + + if link == "" or link is None: + problems.append(f'Release link is missing for "{version}"') + return fixed, problems + + link = link[1:-1] + if not link.startswith(base_url): + problems.append(f'Release link should point to an Evmos release: "{link}"') + + if version not in link: + problems.append( + f'Release header version "{version}" does not match version in link "{link}"' + ) + + return fixed, problems diff --git a/scripts/changelog_checker/test_change_type.py b/scripts/changelog_checker/test_change_type.py new file mode 100644 index 0000000000..d99be79c49 --- /dev/null +++ b/scripts/changelog_checker/test_change_type.py @@ -0,0 +1,29 @@ +from change_type import ChangeType + + +class TestChangeType: + def test_pass(self): + change_type = ChangeType("### Bug Fixes") + assert change_type.parse() is True + assert change_type.type == "Bug Fixes" + assert change_type.problems == [] + + def test_malformed(self): + change_type = ChangeType("###Bug Fixes") + assert change_type.parse() is False + assert change_type.type == "" + assert change_type.problems == ['Malformed change type: "###Bug Fixes"'] + + def test_spelling(self): + change_type = ChangeType("### BugFixes") + assert change_type.parse() is False + assert change_type.type == "BugFixes" + assert change_type.problems == [ + '"Bug Fixes" should be used instead of "BugFixes"' + ] + + def test_invalid_type(self): + change_type = ChangeType("### Invalid Type") + assert change_type.parse() is False + assert change_type.type == "Invalid Type" + assert change_type.problems == ['"Invalid Type" is not a valid change type'] diff --git a/scripts/changelog_checker/test_check_changelog.py b/scripts/changelog_checker/test_check_changelog.py new file mode 100644 index 0000000000..b5dc7928af --- /dev/null +++ b/scripts/changelog_checker/test_check_changelog.py @@ -0,0 +1,135 @@ +import os +from shutil import copyfile + +import pytest # type: ignore +from check_changelog import Changelog # type: ignore + +# Get the directory of this script +SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__)) + + +@pytest.fixture +def create_tmp_copy(): + tmp_file = os.path.join(SCRIPT_DIR, "testdata", "changelog_tmp.md") + copyfile( + os.path.join(SCRIPT_DIR, "testdata", "changelog_fail.md"), + tmp_file, + ) + yield tmp_file + os.remove(tmp_file) + + +class TestParseChangelog: + """ + This class collects all tests that are actually parsing dummy changelogs stored in + markdown files in the testdata directory. + """ + + def test_pass(self): + expected_result = { + "Unreleased": { + "State Machine Breaking": { + 1922: {"description": "Add `secp256r1` curve precompile."}, + 1949: {"description": "Add `ClaimRewards` custom transaction."}, + 2218: { + "description": "Use correct version of proto dependencies to generate swagger." + }, + 1687: {"description": "Bump Evmos version to v14."}, + }, + "API Breaking": { + 2015: { + "description": "Rename `inflation` module to `inflation/v1`." + }, + 2078: {"description": "Deprecate legacy EIP-712 ante handler."}, + 1851: { + "description": "Enable [EIP 3855](https://eips.ethereum.org/EIPS/eip-3855) " + + "(`PUSH0` opcode) during upgrade." + }, + }, + "Improvements": { + 1864: { + "description": "Add `--base-fee` and `--min-gas-price` flags.", + }, + 1912: {"description": "Add Stride outpost interface and ABI."}, + 2104: { + "description": "Refactor to use `sdkmath.Int` and `sdkmath.LegacyDec` instead of SDK types." + }, + 701: {"description": "Rename Go module to `evmos/evmos`."}, + }, + "Bug Fixes": { + 1801: {"description": "Fixed the problem `gas_used` is 0."}, + 109: { + "description": "Fix hardcoded ERC-20 nonce and `UpdateTokenPairERC20` proposal " + + "to support ERC-20s with 0 decimals." + }, + }, + }, + "v15.0.0": { + "API Breaking": { + 1862: { + "description": "Add Authorization Grants to the Vesting extension." + }, + 555: {"description": "`v4.0.0` upgrade logic."}, + }, + }, + "v2.0.0": {}, + } + + changelog = Changelog(os.path.join(SCRIPT_DIR, "testdata", "changelog_ok.md")) + ok = changelog.parse() + assert changelog.problems == [], "expected no failed entries" + assert ok is True + assert changelog.releases == expected_result, "expected different parsed result" + + def test_fail(self): + changelog = Changelog(os.path.join(SCRIPT_DIR, "testdata", "changelog_fail.md")) + assert changelog.parse() is False + assert changelog.problems == [ + 'PR link is not matching PR number 1948: "https://github.com/evmos/evmos/pull/1949"', + "There should be no backslash in front of the # in the PR link", + '"ABI" should be used instead of "ABi"', + '"outpost" should be used instead of "Outpost"', + 'PR description should end with a dot: "Fixed the problem `gas_used` is 0"', + '"Invalid Category" is not a valid change type', + 'Change type "Bug Fixes" is duplicated in Unreleased', + "PR #1801 is duplicated in the changelog", + 'Release "v15.0.0" is duplicated in the changelog', + 'Change type "API Breaking" is duplicated in v15.0.0', + "PR #1862 is duplicated in the changelog", + 'Malformed entry: "- malformed entry in changelog"', + ] + + def test_fix(self, create_tmp_copy): + changelog = Changelog(create_tmp_copy) + assert changelog.parse(fix=True) is False + assert changelog.problems == [ + 'PR link is not matching PR number 1948: "https://github.com/evmos/evmos/pull/1949"', + "There should be no backslash in front of the # in the PR link", + '"ABI" should be used instead of "ABi"', + '"outpost" should be used instead of "Outpost"', + 'PR description should end with a dot: "Fixed the problem `gas_used` is 0"', + '"Invalid Category" is not a valid change type', + 'Change type "Bug Fixes" is duplicated in Unreleased', + "PR #1801 is duplicated in the changelog", + 'Release "v15.0.0" is duplicated in the changelog', + 'Change type "API Breaking" is duplicated in v15.0.0', + "PR #1862 is duplicated in the changelog", + 'Malformed entry: "- malformed entry in changelog"', + ] + + # Here we parse the fixed changelog again and check that the automatic fixes were applied. + fixed_changelog = Changelog(changelog.filename) + assert fixed_changelog.parse(fix=False) is False + assert fixed_changelog.problems == [ + '"Invalid Category" is not a valid change type', + 'Change type "Bug Fixes" is duplicated in Unreleased', + "PR #1801 is duplicated in the changelog", + 'Release "v15.0.0" is duplicated in the changelog', + 'Change type "API Breaking" is duplicated in v15.0.0', + "PR #1862 is duplicated in the changelog", + 'Malformed entry: "- malformed entry in changelog"', + ] + + def test_parse_changelog_nonexistent_file(self): + with pytest.raises(FileNotFoundError): + Changelog(os.path.join(SCRIPT_DIR, "testdata", "nonexistent_file.md")) diff --git a/scripts/changelog_checker/test_config.py b/scripts/changelog_checker/test_config.py new file mode 100644 index 0000000000..473b3bced4 --- /dev/null +++ b/scripts/changelog_checker/test_config.py @@ -0,0 +1,18 @@ +from config import get_allowed_categories + + +class TestGetAllowedCategories: + def test_pass(self): + allowed_categories = get_allowed_categories() + assert ( + "app" in allowed_categories + ), "expected pre-configured value to be in allowed categories" + assert ( + "evm" in allowed_categories + ), "expected module to be in allowed categories" + assert ( + "osmosis-outpost" in allowed_categories + ), "expected outpost to be in allowed categories" + assert ( + "distribution-precompile" in allowed_categories + ), "expected precompile to be in allowed categories" diff --git a/scripts/changelog_checker/test_entry.py b/scripts/changelog_checker/test_entry.py new file mode 100644 index 0000000000..d5280e30fa --- /dev/null +++ b/scripts/changelog_checker/test_entry.py @@ -0,0 +1,229 @@ +import re + +from entry import ( # type: ignore + ALLOWED_SPELLINGS, + Entry, + check_category, + check_description, + check_link, + check_spelling, + check_whitespace, + get_match, +) + + +class TestEntry: + """ + This class collects all tests that are checking individual changelog entries. + """ + + example = ( + "- (distribution-precompile) [#1949](https://github.com/evmos/evmos/pull/1949) " + + "Add `ClaimRewards` custom transaction." + ) + + def test_pass(self): + entry = Entry(self.example) + ok = entry.parse() + assert entry.problems == [] + assert ok is True + assert entry.fixed == self.example + + def test_pass_includes_link(self): + example = ( + "- (evm) [#1851](https://github.com/evmos/evmos/pull/1851) " + + "Enable [EIP 3855](https://eips.ethereum.org/EIPS/eip-3855) (`PUSH0` opcode) during upgrade." + ) + entry = Entry(example) + ok = entry.parse() + assert entry.link == "https://github.com/evmos/evmos/pull/1851" + assert entry.description == ( + "Enable [EIP 3855](https://eips.ethereum.org/EIPS/eip-3855) (`PUSH0` opcode) during upgrade." + ) + assert entry.problems == [] + assert ok is True + assert entry.fixed == example + + def test_fail_has_backslash_in_link(self): + example = r"- (evm) [\#1851](https://github.com/evmos/evmos/pull/1851) Test." + entry = Entry(example) + ok = entry.parse() + assert entry.problems == [ + "There should be no backslash in front of the # in the PR link" + ] + assert ok is False + assert entry.fixed == example.replace(r"\#", "#") + + def test_entry_wrong_pr_link_and_missing_dot(self): + entry = Entry( + "- (distribution-precompile) [#1949](https://github.com/evmos/evmos/pull/1948) " + + "Add `ClaimRewards` custom transaction" + ) + assert entry.parse() is False + assert entry.fixed == self.example + assert entry.problems == [ + 'PR link is not matching PR number 1949: "https://github.com/evmos/evmos/pull/1948"', + 'PR description should end with a dot: "Add `ClaimRewards` custom transaction"', + ] + + def test_malformed_entry(self): + malformed_example = ( + "- (distribution-precompile) [#194tps://github.com/evmos/evmos/pull/1" + ) + entry = Entry(malformed_example) + assert entry.parse() is False + assert entry.fixed == malformed_example + assert entry.problems == [ + 'Malformed entry: "- (distribution-precompile) [#194tps://github.com/evmos/evmos/pull/1"' + ] + + +class TestCheckCategory: + def test_pass(self): + fixed, problems = check_category("evm") + assert fixed == "evm" + assert problems == [] + + def test_invalid_category(self): + fixed, problems = check_category("invalid") + assert fixed == "invalid" + assert problems == ['Invalid change category: "(invalid)"'] + + def test_non_lower_category(self): + fixed, problems = check_category("eVm") + assert fixed == "evm" + assert problems == ['Category should be lowercase: "(eVm)"'] + + +class TestCheckLink: + example = "https://github.com/evmos/evmos/pull/1949" + + def test_pass(self): + fixed, problems = check_link(self.example, 1949) + assert fixed == self.example + assert problems == [] + + def test_wrong_base_url(self): + fixed, problems = check_link("https://github.com/evmds/evmos/pull/1949", 1949) + assert fixed == self.example + assert problems == [ + 'PR link should point to evmos repository: "https://github.com/evmds/evmos/pull/1949"' + ] + + def test_wrong_pr_number(self): + fixed, problems = check_link("https://github.com/evmos/evmos/pull/1948", 1949) + assert fixed == self.example + assert problems == [ + 'PR link is not matching PR number 1949: "https://github.com/evmos/evmos/pull/1948"' + ] + + +class TestCheckDescription: + def test_pass(self): + example = "Add `ClaimRewards` custom transaction." + fixed, problems = check_description(example) + assert fixed == example + assert problems == [] + + def test_start_with_lowercase(self): + fixed, problems = check_description("add `ClaimRewards` custom transaction.") + assert fixed == "Add `ClaimRewards` custom transaction." + assert problems == [ + 'PR description should start with capital letter: "add `ClaimRewards` custom transaction."' + ] + + def test_end_with_dot(self): + fixed, problems = check_description("Add `ClaimRewards` custom transaction") + assert fixed == "Add `ClaimRewards` custom transaction." + assert problems == [ + 'PR description should end with a dot: "Add `ClaimRewards` custom transaction"' + ] + + def test_start_with_codeblock(self): + fixed, problems = check_description( + "```\nAdd `ClaimRewards` custom transaction." + ) + assert fixed == "```\nAdd `ClaimRewards` custom transaction." + assert problems == [] + + +class TestCheckWhitespace: + def test_missing_whitespace(self): + assert check_whitespace(["", " ", "", " "]) == [ + "There should be exactly one space between the leading dash and the category" + ] + + def test_multiple_spaces(self): + assert check_whitespace([" ", " ", "", " "]) == [ + "There should be exactly one space between the PR link and the description" + ] + + def test_space_in_link(self): + assert check_whitespace([" ", " ", " ", " "]) == [ + "There should be no whitespace inside of the markdown link" + ] + + +class TestCheckSpelling: + def test_pass(self): + found, fixed, problems = check_spelling("Fix API.", ALLOWED_SPELLINGS) + assert found is True + assert fixed == "Fix API." + assert problems == [] + + def test_spelling(self): + found, fixed, problems = check_spelling("Fix APi.", ALLOWED_SPELLINGS) + assert found is True + assert fixed == "Fix API." + assert problems == ['"API" should be used instead of "APi"'] + + def test_multiple_problems(self): + found, fixed, problems = check_spelling( + "Fix Stride Outpost and AbI.", ALLOWED_SPELLINGS + ) + assert found is True + assert fixed == "Fix Stride outpost and ABI." + assert problems == [ + '"ABI" should be used instead of "AbI"', + '"outpost" should be used instead of "Outpost"', + ] + + def test_pass_codeblocks(self): + found, fixed, problems = check_spelling("Fix `in evm code`.", ALLOWED_SPELLINGS) + assert found is False + assert fixed == "Fix `in evm code`." + assert problems == [] + + def test_fail_in_word(self): + found, fixed, problems = check_spelling("FixAbI in word.", ALLOWED_SPELLINGS) + assert found is False + assert fixed == "FixAbI in word." + assert problems == [] + + def test_erc_20(self): + found, fixed, problems = check_spelling( + "Add ERC20 contract.", ALLOWED_SPELLINGS + ) + assert found is True + assert fixed == "Add ERC-20 contract." + assert problems == ['"ERC-20" should be used instead of "ERC20"'] + + +class TestGetMatch: + def test_pass(self): + assert get_match(re.compile("abi", re.IGNORECASE), "Fix ABI.") == "ABI" + + def test_fail_codeblocks(self): + assert get_match(re.compile("abi", re.IGNORECASE), "Fix `in AbI code`.") == "" + + def test_fail_in_word(self): + assert get_match(re.compile("abi", re.IGNORECASE), "FixAbI in word.") == "" + + def test_fail_in_link(self): + assert ( + get_match( + re.compile("abi", re.IGNORECASE), + "Fix [abcdef](https://example/aBi.com).", + ) + == "" + ) diff --git a/scripts/changelog_checker/test_release.py b/scripts/changelog_checker/test_release.py new file mode 100644 index 0000000000..35429da8ed --- /dev/null +++ b/scripts/changelog_checker/test_release.py @@ -0,0 +1,54 @@ +from release import Release + + +class TestRelease: + def test_pass(self): + release = Release( + "## [v15.0.2](https://github.com/evmos/evmos/releases/tag/v15.0.2) - 2021-08-02" + ) + assert release.parse() is True + assert release.version == "v15.0.2" + assert release.problems == [] + + # Check version comparisons + assert (release <= 15) is True + assert (release <= 14) is False + + def test_pass_unreleased(self): + release = Release("## Unreleased") + assert release.parse() is True + assert release.version == "Unreleased" + assert release.problems == [] + + def test_malformed(self): + release = Release("## `v15.0.2])") + assert release.parse() is False + assert release.version == "" + assert release.problems == ['Malformed release header: "## `v15.0.2])"'] + + def test_missing_link(self): + release = Release("## [v15.0.2] - 2021-08-02") + assert release.parse() is False + assert release.version == "v15.0.2" + assert release.problems == ['Release link is missing for "v15.0.2"'] + + def test_wrong_version_in_link(self): + release = Release( + "## [v15.0.2](https://github.com/evmos/evmos/releases/tag/v16.0.0) - 2021-08-02" + ) + assert release.parse() is False + assert release.version == "v15.0.2" + assert release.problems == [ + 'Release header version "v15.0.2" does not match version in link ' + + '"https://github.com/evmos/evmos/releases/tag/v16.0.0"' + ] + + def test_wrong_base_url(self): + release = Release( + "## [v15.0.2](https://github.com/evmos/evmds/releases/tag/v15.0.2) - 2021-08-02" + ) + assert release.parse() is False + assert release.version == "v15.0.2" + assert release.problems == [ + 'Release link should point to an Evmos release: "https://github.com/evmos/evmds/releases/tag/v15.0.2"' + ] diff --git a/scripts/changelog_checker/testdata/changelog_fail.md b/scripts/changelog_checker/testdata/changelog_fail.md new file mode 100644 index 0000000000..7de9d5b6fa --- /dev/null +++ b/scripts/changelog_checker/testdata/changelog_fail.md @@ -0,0 +1,47 @@ + +# Changelog + +## Unreleased + +### State Machine Breaking + +- (p256-precompile) [#1922](https://github.com/evmos/evmos/pull/1922) Add `secp256r1` curve precompile. +- (distribution-precompile) [#1948](https://github.com/evmos/evmos/pull/1949) Add `ClaimRewards` custom transaction. + +### API Breaking + +- (inflation) [#2015](https://github.com/evmos/evmos/pull/2015) Rename `inflation` module to `inflation/v1`. +- (ante) [#2078](https://github.com/evmos/evmos/pull/2078) Deprecate legacy EIP-712 ante handler. + +### Improvements + +- (testnet) [\#1864](https://github.com/evmos/evmos/pull/1864) Add `--base-fee` and `--min-gas-price` flags. +- (stride-outpost) [#1912](https://github.com/evmos/evmos/pull/1912) Add Stride Outpost interface and ABi. + +### Bug Fixes + +- (evm) [#1801](https://github.com/evmos/evmos/pull/1801) Fixed the problem `gas_used` is 0 + +### Invalid Category + +- (evm) [#1802](https://github.com/evmos/evmos/pull/1802) Fixed the problem `gas_used` is 0. + +### Bug Fixes + +- (evm) [#1803](https://github.com/evmos/evmos/pull/1803) Fixed the problem `gas_used` is 0. + +## [v15.0.0](https://github.com/evmos/evmos/releases/tag/v15.0.0) - 2023-10-31 + +### API Breaking + +- (vesting) [#1862](https://github.com/evmos/evmos/pull/1862) Add Authorization Grants to the Vesting extension. +- (evm) [#1801](https://github.com/evmos/evmos/pull/1801) Fixed the problem `gas_used` is 0. + +## [v15.0.0](https://github.com/evmos/evmos/releases/tag/v15.0.0) - 2023-10-31 + +### API Breaking + +- (vesting) [#1862](https://github.com/evmos/evmos/pull/1862) Add Authorization Grants to the Vesting extension. +- malformed entry in changelog diff --git a/scripts/changelog_checker/testdata/changelog_ok.md b/scripts/changelog_checker/testdata/changelog_ok.md new file mode 100644 index 0000000000..bc5feb5d6f --- /dev/null +++ b/scripts/changelog_checker/testdata/changelog_ok.md @@ -0,0 +1,44 @@ + +# Changelog + +## Unreleased + +### State Machine Breaking + +- (p256-precompile) [#1922](https://github.com/evmos/evmos/pull/1922) Add `secp256r1` curve precompile. +- (distribution-precompile) [#1949](https://github.com/evmos/evmos/pull/1949) Add `ClaimRewards` custom transaction. +- (swagger) [#2218](https://github.com/evmos/evmos/pull/2218) Use correct version of proto dependencies to generate swagger. +- (go) [#1687](https://github.com/evmos/evmos/pull/1687) Bump Evmos version to v14. + +### API Breaking + +- (inflation) [#2015](https://github.com/evmos/evmos/pull/2015) Rename `inflation` module to `inflation/v1`. +- (ante) [#2078](https://github.com/evmos/evmos/pull/2078) Deprecate legacy EIP-712 ante handler. +- (evm) [#1851](https://github.com/evmos/evmos/pull/1851) Enable [EIP 3855](https://eips.ethereum.org/EIPS/eip-3855) (`PUSH0` opcode) during upgrade. + +### Improvements + +- (testnet) [#1864](https://github.com/evmos/evmos/pull/1864) Add `--base-fee` and `--min-gas-price` flags. +- (stride-outpost) [#1912](https://github.com/evmos/evmos/pull/1912) Add Stride outpost interface and ABI. +- (app) [#2104](https://github.com/evmos/evmos/pull/2104) Refactor to use `sdkmath.Int` and `sdkmath.LegacyDec` instead of SDK types. +- (all) [#701](https://github.com/evmos/evmos/pull/701) Rename Go module to `evmos/evmos`. + +### Bug Fixes + +- (evm) [#1801](https://github.com/evmos/evmos/pull/1801) Fixed the problem `gas_used` is 0. +- (erc20) [#109](https://github.com/evmos/evmos/pull/109) Fix hardcoded ERC-20 nonce and `UpdateTokenPairERC20` proposal to support ERC-20s with 0 decimals. + +## [v15.0.0](https://github.com/evmos/evmos/releases/tag/v15.0.0) - 2023-10-31 + +### API Breaking + +- (vesting) [#1862](https://github.com/evmos/evmos/pull/1862) Add Authorization Grants to the Vesting extension. +- (app) [#555](https://github.com/evmos/evmos/pull/555) `v4.0.0` upgrade logic. + +## [v2.0.0](https://github.com/evmos/evmos/releases/tag/v2.0.0) - 2021-10-31 + +### State Machine Breaking + +- legacy entries do not have to be fully correct diff --git a/scripts/check_licenses.py b/scripts/license_checker/check_licenses.py similarity index 84% rename from scripts/check_licenses.py rename to scripts/license_checker/check_licenses.py index 00f4a77fab..8621cc8522 100644 --- a/scripts/check_licenses.py +++ b/scripts/license_checker/check_licenses.py @@ -12,9 +12,8 @@ import sys from typing import Dict, List -# Check all Go or Protobuf files, that are neither generated nor test files. -FILTER: re.Pattern = re.compile( - r"^((?!(_test|\.pb|\.pb\.gw)\.go$).)*\.(go|proto)$") +# Check only files, that are neither auto-generated nor test files. +IGNORED_FILETYPES: re.Pattern = re.compile(r"(_test|\.pb|\.pb\.gw)\.") # List of files with a LGPL3 license. EXEMPT_FILES: List[str] = [ @@ -33,12 +32,12 @@ LGPL3_LICENSE = [ "// Copyright Tharsis Labs Ltd.(Evmos)\n", - "// SPDX-License-Identifier:LGPL-3.0-only\n" + "// SPDX-License-Identifier:LGPL-3.0-only\n", ] ENCL_LICENSE = [ "// Copyright Tharsis Labs Ltd.(Evmos)\n", - "// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE)\n" + "// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE)\n", ] @@ -65,7 +64,8 @@ def check_licenses_in_path( continue for file in files: full_path = os.path.join(root, file) - if not name_filter.search(full_path): + if ignore(full_path, name_filter): + # In case the filter is not matching we skip the file continue n_files += 1 @@ -73,8 +73,7 @@ def check_licenses_in_path( lgpl3 = check_if_in_exempt_files(full_path) checked_license = LGPL3_LICENSE if lgpl3 else ENCL_LICENSE - found = check_license_in_file( - os.path.join(root, file), checked_license) + found = check_license_in_file(os.path.join(root, file), checked_license) if found is True: n_files_with += 1 if lgpl3: @@ -127,6 +126,18 @@ def check_if_in_exempt_files(file: str) -> bool: return False +def ignore(path: str, name_filter: re.Pattern) -> bool: + """ + Returns a boolean value stating if a file should be ignored or not. + """ + + if not path.endswith(".go") and not path.endswith(".proto"): + return True + + match = name_filter.search(path) + return match is not None + + def check_license_in_file(file: str, checked_license: List[str]) -> bool | str: """ Check if the file has the license. @@ -149,6 +160,6 @@ def check_license_in_file(file: str, checked_license: List[str]) -> bool | str: if __name__ == "__main__": - result = check_licenses_in_path(sys.argv[1], FILTER) + result = check_licenses_in_path(sys.argv[1], IGNORED_FILETYPES) if result["wrong_license"] > 0: sys.exit(1) diff --git a/scripts/test_check_licenses.py b/scripts/license_checker/test_check_licenses.py similarity index 74% rename from scripts/test_check_licenses.py rename to scripts/license_checker/test_check_licenses.py index 9d4bcd04c8..2fab12238a 100644 --- a/scripts/test_check_licenses.py +++ b/scripts/license_checker/test_check_licenses.py @@ -57,3 +57,14 @@ def test_check_if_in_exempt_files_included(): file = "/Users/malte/dev/go/evmos/evmos/x/evm/genesis.go" assert cl.check_if_in_exempt_files(file) is False + + +def test_ignore(): + assert cl.ignore("app/ante/ante.go", cl.IGNORED_FILETYPES) is False + assert cl.ignore("proto/ethermint/evm/v1/tx.proto", cl.IGNORED_FILETYPES) is False + assert cl.ignore(".go.mod", cl.IGNORED_FILETYPES) is True + assert cl.ignore(".markdownlint", cl.IGNORED_FILETYPES) is True + assert cl.ignore("README.md", cl.IGNORED_FILETYPES) is True + assert cl.ignore("app/ante/ante_test.go", cl.IGNORED_FILETYPES) is True + assert cl.ignore("x/evm/types/tx.pb.go", cl.IGNORED_FILETYPES) is True + assert cl.ignore("x/evm/types/tx.pb.gw.go", cl.IGNORED_FILETYPES) is True From 82862b3e6fd1fcc12fd69a9056565a11457909ca Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Mon, 22 Jan 2024 21:09:12 +0100 Subject: [PATCH 085/345] imp(tests): Check voting has concluded in automated upgrade tests (#2235) * commit WIP * run gofumpt * dynamically calculate upgrade height * remove outdated const * uncomment CLI tx tests * add changelog entry * run gofumpt * turn todo into doc comment --- CHANGELOG.md | 1 + tests/e2e/e2e_suite_test.go | 49 ++++++++++++++---- tests/e2e/init-node.sh | 8 +-- tests/e2e/upgrade/govexec.go | 6 +-- tests/e2e/upgrade/manager.go | 95 ++++++++++++++++++++++++++++++++++ tests/e2e/upgrade/params.go | 1 + tests/e2e/upgrade/queryexec.go | 3 +- 7 files changed, 146 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a143977f59..5548ccc3da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -155,6 +155,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (outposts) [#2236](https://github.com/evmos/evmos/pull/2236) Add default timeout timestamp for outpost transactions. - (distribution-precompile) [#2240](https://github.com/evmos/evmos/pull/2240) Replace hardcoded expected balance in distribution precompile tests with queried balance. - (staking-precompile) [#2234](https://github.com/evmos/evmos/pull/2234) Fix wrong error messages in `NewMsgCreateValidator`. +- (tests) [#2235](https://github.com/evmos/evmos/pull/2235) Ensure voting has concluded in automated upgrade tests. - (metrics) [#2246](https://github.com/evmos/evmos/pull/2246) Add burned cosmos transactions fees metric. - (ci) [#2259](https://github.com/evmos/evmos/pull/2259) Adjust CI configuration to have required items always return a status. - (ci) [#2267](https://github.com/evmos/evmos/pull/2267) Minor clean-up in EIP-7212 tests. diff --git a/tests/e2e/e2e_suite_test.go b/tests/e2e/e2e_suite_test.go index e77030b20d..6696d48f16 100644 --- a/tests/e2e/e2e_suite_test.go +++ b/tests/e2e/e2e_suite_test.go @@ -8,10 +8,13 @@ import ( "strings" "testing" - "github.com/stretchr/testify/suite" - + "github.com/cosmos/cosmos-sdk/codec" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1" + "github.com/evmos/evmos/v16/app" + "github.com/evmos/evmos/v16/encoding" "github.com/evmos/evmos/v16/tests/e2e/upgrade" "github.com/evmos/evmos/v16/utils" + "github.com/stretchr/testify/suite" ) const ( @@ -25,9 +28,6 @@ const ( // relatedBuildPath defines the path where the build data is stored relatedBuildPath = "../../build/" - // upgradeHeightDelta defines the number of blocks after the proposal and the scheduled upgrade - upgradeHeightDelta = 10 - // upgradePath defines the relative path from this folder to the upgrade folder upgradePath = "../../app/upgrades" @@ -129,9 +129,9 @@ func (s *IntegrationTestSuite) proposeUpgrade(name, target string) { defer cancel() // calculate upgrade height for the proposal - nodeHeight, err := s.upgradeManager.GetNodeHeight(ctx) - s.Require().NoError(err, "can't get block height from running node") - s.upgradeManager.UpgradeHeight = uint(nodeHeight + upgradeHeightDelta) + upgradeHeight, err := s.upgradeManager.GetUpgradeHeight(ctx, s.upgradeParams.ChainID) + s.Require().NoError(err, "can't get upgrade height") + s.upgradeManager.UpgradeHeight = upgradeHeight // if Evmos is lower than v10.x.x no need to use the legacy proposal currentVersion, err := s.upgradeManager.GetNodeVersion(ctx) @@ -198,7 +198,7 @@ func (s *IntegrationTestSuite) upgrade(targetRepo, targetVersion string) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - s.T().Log("wait for node to reach upgrade height...") + s.T().Logf("wait for node to reach upgrade height %d...", s.upgradeManager.UpgradeHeight) // wait for proposed upgrade height _, err := s.upgradeManager.WaitForHeight(ctx, int(s.upgradeManager.UpgradeHeight)) s.Require().NoError(err, "can't reach upgrade height") @@ -206,6 +206,9 @@ func (s *IntegrationTestSuite) upgrade(targetRepo, targetVersion string) { buildDir := dirs[0] rootDir := dirs[1] + // check that the proposal has passed before stopping the node + s.checkProposalPassed(ctx) + s.T().Log("exporting state to local...") // export node .evmosd to local build/ err = s.upgradeManager.ExportState(buildDir) @@ -255,6 +258,34 @@ func (s *IntegrationTestSuite) upgrade(targetRepo, targetVersion string) { } } +// checkProposalPassed queries the (most recent) upgrade proposal and checks that it has passed. +// +// NOTE: This was a problem in the past, where the upgrade height was reached before the proposal actually passed. +// This is a safety check to make sure this doesn't happen again, as this was not obvious from the log output. +func (s *IntegrationTestSuite) checkProposalPassed(ctx context.Context) { + exec, err := s.upgradeManager.CreateModuleQueryExec("gov", "proposals", s.upgradeParams.ChainID) + s.Require().NoError(err, "can't create query proposals exec") + + outBuf, errBuf, err := s.upgradeManager.RunExec(ctx, exec) + s.Require().NoErrorf( + err, + "failed to query proposals;\nstdout: %s,\nstderr: %s", outBuf.String(), errBuf.String(), + ) + + encodingConfig := encoding.MakeConfig(app.ModuleBasics) + protoCodec, ok := encodingConfig.Codec.(*codec.ProtoCodec) + s.Require().True(ok, "encoding config codec is not a proto codec") + + var proposalsRes govtypes.QueryProposalsResponse + err = protoCodec.UnmarshalJSON(outBuf.Bytes(), &proposalsRes) + s.Require().NoError(err, "can't unmarshal proposals response\n%s", outBuf.String()) + s.Require().GreaterOrEqual(len(proposalsRes.Proposals), 1, "no proposals found") + + // check that the most recent proposal has passed + proposal := proposalsRes.Proposals[len(proposalsRes.Proposals)-1] + s.Require().Equal(govtypes.ProposalStatus_PROPOSAL_STATUS_PASSED.String(), proposal.Status.String(), "expected proposal to have passed already") +} + // executeQueries executes all the module queries func (s *IntegrationTestSuite) executeQueries() { ctx, cancel := context.WithCancel(context.Background()) diff --git a/tests/e2e/init-node.sh b/tests/e2e/init-node.sh index 80c9df2b06..e00e5b6f4f 100755 --- a/tests/e2e/init-node.sh +++ b/tests/e2e/init-node.sh @@ -75,15 +75,15 @@ jq '.app_state.evm.params.evm_denom="aevmos"' "$GENESIS" >"$TMP_GENESIS" && mv " jq '.app_state.inflation.params.mint_denom="aevmos"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" # set gov proposing && voting period -jq '.app_state.gov.deposit_params.max_deposit_period="30s"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" -jq '.app_state.gov.voting_params.voting_period="30s"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" +jq '.app_state.gov.deposit_params.max_deposit_period="10s"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" +jq '.app_state.gov.voting_params.voting_period="10s"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" # When upgrade to cosmos-sdk v0.47, use gov.params to edit the deposit params # check if the 'params' field exists in the genesis file if jq '.app_state.gov.params != null' "$GENESIS" | grep -q "true"; then jq '.app_state.gov.params.min_deposit[0].denom="aevmos"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" - jq '.app_state.gov.params.max_deposit_period="30s"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" - jq '.app_state.gov.params.voting_period="30s"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" + jq '.app_state.gov.params.max_deposit_period="10s"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" + jq '.app_state.gov.params.voting_period="10s"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" fi # Set gas limit in genesis diff --git a/tests/e2e/upgrade/govexec.go b/tests/e2e/upgrade/govexec.go index c4a2b7b047..991f6445f3 100644 --- a/tests/e2e/upgrade/govexec.go +++ b/tests/e2e/upgrade/govexec.go @@ -66,7 +66,7 @@ func (m *Manager) CreateSubmitProposalExec(targetVersion, chainID string, upgrad "--from=mykey", "--yes", "--keyring-backend=test", - "--log_format=json", + "--output=text", } cmd = append(cmd, flags...) // increment proposal counter to use proposal number for deposit && voting @@ -87,7 +87,7 @@ func (m *Manager) CreateDepositProposalExec(chainID string, id int) (string, err fmt.Sprintf("--chain-id=%s", chainID), "--yes", "--keyring-backend=test", - "--log_format=json", + "--output=text", "--fees=500aevmos", "--gas=500000", } @@ -108,7 +108,7 @@ func (m *Manager) CreateVoteProposalExec(chainID string, id int, flags ...string fmt.Sprintf("--chain-id=%s", chainID), "--yes", "--keyring-backend=test", - "--log_format=json", + "--output=text", } cmd = append(cmd, flags...) return m.CreateExec(cmd, m.ContainerID()) diff --git a/tests/e2e/upgrade/manager.go b/tests/e2e/upgrade/manager.go index 7e5ac6f6e5..a0b982737a 100644 --- a/tests/e2e/upgrade/manager.go +++ b/tests/e2e/upgrade/manager.go @@ -8,16 +8,24 @@ import ( "context" "fmt" "io" + "math/big" "net/http" "os" + "regexp" "strconv" "strings" "time" + errorsmod "cosmossdk.io/errors" + "github.com/ethereum/go-ethereum/common" "github.com/ory/dockertest/v3" "github.com/ory/dockertest/v3/docker" ) +// safetyDelta is the number of blocks that are added to the upgrade height to make sure +// the proposal has concluded when reaching the upgrade height. +const safetyDelta = 2 + // Manager defines a docker pool instance, used to build, run, interact with and stop docker containers // running Evmos nodes. type Manager struct { @@ -257,6 +265,93 @@ func (m *Manager) GetNodeVersion(ctx context.Context) (string, error) { return outBuff.String(), nil } +// GetUpgradeHeight calculates the height for the scheduled software upgrade. +// +// It checks the timeout commit that is configured on the node and checks the voting duration. +// From this information, the height at which the upgrade will be scheduled is calculated. +func (m *Manager) GetUpgradeHeight(ctx context.Context, chainID string) (uint, error) { + currentHeight, err := m.GetNodeHeight(ctx) + if err != nil { + return 0, err + } + + timeoutCommit, err := m.getTimeoutCommit(ctx) + if err != nil { + return 0, errorsmod.Wrap(err, "failed to get timeout commit") + } + + votingPeriod, err := m.getVotingPeriod(ctx, chainID) + if err != nil { + return 0, errorsmod.Wrap(err, "failed to get voting period") + } + + heightDelta := new(big.Int).Quo(votingPeriod, timeoutCommit) + upgradeHeight := uint(currentHeight) + uint(heightDelta.Int64()) + safetyDelta + + // return the height at which the upgrade will be scheduled + return upgradeHeight, nil +} + +// getTimeoutCommit returns the timeout commit duration for the current node +func (m *Manager) getTimeoutCommit(ctx context.Context) (*big.Int, error) { + exec, err := m.CreateExec([]string{"grep", `\s*timeout_commit =`, "/root/.evmosd/config/config.toml"}, m.ContainerID()) + if err != nil { + return common.Big0, fmt.Errorf("create exec error: %w", err) + } + + outBuff, errBuff, err := m.RunExec(ctx, exec) + if err != nil { + return common.Big0, fmt.Errorf("failed to execute command: " + err.Error()) + } + + if errBuff.String() != "" { + return common.Big0, fmt.Errorf("evmos version error: %s", errBuff.String()) + } + + re := regexp.MustCompile(`timeout_commit = "(?P\d+)s"`) + match := re.FindStringSubmatch(outBuff.String()) + if len(match) != 2 { + return common.Big0, fmt.Errorf("failed to parse timeout_commit: %s", outBuff.String()) + } + + tc, err := strconv.Atoi(match[1]) + if err != nil { + return common.Big0, err + } + + return big.NewInt(int64(tc)), nil +} + +// getVotingPeriod returns the voting period for the current node +func (m *Manager) getVotingPeriod(ctx context.Context, chainID string) (*big.Int, error) { + exec, err := m.CreateModuleQueryExec("gov", "params", chainID) + if err != nil { + return common.Big0, fmt.Errorf("create exec error: %w", err) + } + + outBuff, errBuff, err := m.RunExec(ctx, exec) + if err != nil { + return common.Big0, fmt.Errorf("failed to execute command: " + err.Error()) + } + + if errBuff.String() != "" { + return common.Big0, fmt.Errorf("evmos version error: %s", errBuff.String()) + } + + re := regexp.MustCompile(`"voting_period":"(?P\d+)s"`) + match := re.FindStringSubmatch(outBuff.String()) + if len(match) != 2 { + return common.Big0, fmt.Errorf("failed to parse voting_period: %s", outBuff.String()) + } + + vp, err := strconv.Atoi(match[1]) + if err != nil { + return common.Big0, err + } + + return big.NewInt(int64(vp)), nil +} + // ContainerID returns the docker container ID of the currently running Node func (m *Manager) ContainerID() string { return m.CurrentNode.Container.ID diff --git a/tests/e2e/upgrade/params.go b/tests/e2e/upgrade/params.go index 78f873eb90..429e088042 100644 --- a/tests/e2e/upgrade/params.go +++ b/tests/e2e/upgrade/params.go @@ -1,5 +1,6 @@ // Copyright Tharsis Labs Ltd.(Evmos) // SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + package upgrade import ( diff --git a/tests/e2e/upgrade/queryexec.go b/tests/e2e/upgrade/queryexec.go index 59ea53e84b..242f802a91 100644 --- a/tests/e2e/upgrade/queryexec.go +++ b/tests/e2e/upgrade/queryexec.go @@ -1,5 +1,6 @@ // Copyright Tharsis Labs Ltd.(Evmos) // SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + package upgrade import ( @@ -15,7 +16,7 @@ func (m *Manager) CreateModuleQueryExec(moduleName, subCommand, chainID string) subCommand, fmt.Sprintf("--chain-id=%s", chainID), "--keyring-backend=test", - "--log_format=json", + "--output=json", } return m.CreateExec(cmd, m.ContainerID()) } From bcf24ce9646c9b8a63d6efdcd8d578896ee259c0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jan 2024 20:18:47 +0000 Subject: [PATCH 086/345] build(deps): bump github.com/onsi/gomega from 1.31.0 to 1.31.1 (#2284) Bumps [github.com/onsi/gomega](https://github.com/onsi/gomega) from 1.31.0 to 1.31.1. - [Release notes](https://github.com/onsi/gomega/releases) - [Changelog](https://github.com/onsi/gomega/blob/master/CHANGELOG.md) - [Commits](https://github.com/onsi/gomega/compare/v1.31.0...v1.31.1) --- updated-dependencies: - dependency-name: github.com/onsi/gomega dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Guillermo Paoletti Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 0f6f705071..d08bd3a609 100644 --- a/go.mod +++ b/go.mod @@ -31,7 +31,7 @@ require ( github.com/improbable-eng/grpc-web v0.15.0 github.com/linxGnu/grocksdb v1.8.11 github.com/onsi/ginkgo/v2 v2.15.0 - github.com/onsi/gomega v1.31.0 + github.com/onsi/gomega v1.31.1 github.com/ory/dockertest/v3 v3.10.0 github.com/pkg/errors v0.9.1 github.com/rakyll/statik v0.1.7 diff --git a/go.sum b/go.sum index ba75885859..92b09da439 100644 --- a/go.sum +++ b/go.sum @@ -925,8 +925,8 @@ github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5 github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.31.0 h1:54UJxxj6cPInHS3a35wm6BK/F9nHYueZ1NVujHDrnXE= -github.com/onsi/gomega v1.31.0/go.mod h1:DW9aCi7U6Yi40wNVAvT6kzFnEVEI5n3DloYBiKiT6zk= +github.com/onsi/gomega v1.31.1 h1:KYppCUK+bUgAZwHOu7EXVBKyQA6ILvOESHkn/tgoqvo= +github.com/onsi/gomega v1.31.1/go.mod h1:y40C95dwAD1Nz36SsEnxvfFe8FFfNxzI5eJ0EYGyAy0= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= From 47bfa0452833cef6d3705f2b56f3630f3ea67119 Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Mon, 22 Jan 2024 21:28:04 +0100 Subject: [PATCH 087/345] imp(tests): Add post-upgrade transactions to E2E upgrade test suite (#2230) * commit WIP * finish implementation for bank send * add changelog entry and missing license * query balance after executing transfer * fix retrieving upgrade list if extra file is in upgrades directory * address review comment * address linter --- CHANGELOG.md | 1 + app/upgrades/v16/constants.go | 1 + tests/e2e/e2e_suite_test.go | 39 ++++++++++++++++++++++++++++++++++- tests/e2e/upgrade/exec.go | 37 +++++++++++++++++++++++++++++++++ tests/e2e/upgrade/utils.go | 24 ++++++++++++++------- 5 files changed, 94 insertions(+), 8 deletions(-) create mode 100644 tests/e2e/upgrade/exec.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 5548ccc3da..754bb1482d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -152,6 +152,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (swagger) [#2219](https://github.com/evmos/evmos/pull/2219) Update Swagger configuration to remove outdated entries and update vesting module version. - (outposts) [#2223](https://github.com/evmos/evmos/pull/2223) Update Outposts struct documentation and `ValidateBasic`. - (p256-precompile) [#2228](https://github.com/evmos/evmos/pull/2228) Adjust p256 precompile address from `0x0b` to `0x100`. +- (tests) [#2230](https://github.com/evmos/evmos/pull/2230) Send bank transfer during automated upgrade tests. - (outposts) [#2236](https://github.com/evmos/evmos/pull/2236) Add default timeout timestamp for outpost transactions. - (distribution-precompile) [#2240](https://github.com/evmos/evmos/pull/2240) Replace hardcoded expected balance in distribution precompile tests with queried balance. - (staking-precompile) [#2234](https://github.com/evmos/evmos/pull/2234) Fix wrong error messages in `NewMsgCreateValidator`. diff --git a/app/upgrades/v16/constants.go b/app/upgrades/v16/constants.go index b213e5544c..fe992c30ad 100644 --- a/app/upgrades/v16/constants.go +++ b/app/upgrades/v16/constants.go @@ -1,5 +1,6 @@ // Copyright Tharsis Labs Ltd.(Evmos) // SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + package v16 const ( diff --git a/tests/e2e/e2e_suite_test.go b/tests/e2e/e2e_suite_test.go index 6696d48f16..1baff3a822 100644 --- a/tests/e2e/e2e_suite_test.go +++ b/tests/e2e/e2e_suite_test.go @@ -231,6 +231,9 @@ func (s *IntegrationTestSuite) upgrade(targetRepo, targetVersion string) { s.T().Logf("executing all module queries") s.executeQueries() + s.T().Logf("executing sample transactions") + s.executeTransactions() + // make sure node produce blocks after upgrade s.T().Logf("height to wait for is %d", int(s.upgradeManager.UpgradeHeight)+blocksAfterUpgrade) // make sure node produces blocks after upgrade @@ -286,7 +289,7 @@ func (s *IntegrationTestSuite) checkProposalPassed(ctx context.Context) { s.Require().Equal(govtypes.ProposalStatus_PROPOSAL_STATUS_PASSED.String(), proposal.Status.String(), "expected proposal to have passed already") } -// executeQueries executes all the module queries +// executeQueries executes all the module queries to check they are still working after the upgrade. func (s *IntegrationTestSuite) executeQueries() { ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -326,6 +329,40 @@ func (s *IntegrationTestSuite) executeQueries() { s.T().Logf("executed all queries successfully") } +// executeTransactions executes some sample transactions to check they are still working after the upgrade. +func (s *IntegrationTestSuite) executeTransactions() { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + chainID := utils.TestnetChainID + "-1" + + // send some tokens between accounts to check transactions are still working + exec, err := s.upgradeManager.CreateModuleTxExec(upgrade.E2ETxArgs{ + ModuleName: "bank", + SubCommand: "send", + Args: []string{"mykey", "evmos1jcltmuhplrdcwp7stlr4hlhlhgd4htqh3a79sq", "10000000000aevmos"}, + ChainID: chainID, + From: "mykey", + }) + s.Require().NoError(err, "failed to create bank send tx command") + + _, errBuf, err := s.upgradeManager.RunExec(ctx, exec) + s.Require().NoError(err, "failed to execute bank send tx") + s.Require().Empty(errBuf.String()) + + // query the balances of the sending and receiving accounts to check the transaction was successful + exec, err = s.upgradeManager.CreateExec( + []string{"evmosd", "q", "bank", "balances", "evmos1jcltmuhplrdcwp7stlr4hlhlhgd4htqh3a79sq"}, + s.upgradeManager.ContainerID(), + ) + s.Require().NoError(err, "failed to create bank balances query command") + + outBuf, errBuf, err := s.upgradeManager.RunExec(ctx, exec) + s.Require().NoError(err, "failed to execute bank balances query") + s.Require().Empty(errBuf.String()) + s.Require().Contains(outBuf.String(), "10000000000aevmos") +} + // TearDownSuite kills the running container, removes the network and mount path func (s *IntegrationTestSuite) TearDownSuite() { if s.upgradeParams.SkipCleanup { diff --git a/tests/e2e/upgrade/exec.go b/tests/e2e/upgrade/exec.go new file mode 100644 index 0000000000..70828ae656 --- /dev/null +++ b/tests/e2e/upgrade/exec.go @@ -0,0 +1,37 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package upgrade + +import ( + "fmt" +) + +// E2ETxArgs contains the arguments to build a CLI transaction command from. +type E2ETxArgs struct { + ModuleName string + SubCommand string + Args []string + ChainID string + From string +} + +// CreateModuleTxExec creates the execution command for an Evmos transaction. +func (m *Manager) CreateModuleTxExec(txArgs E2ETxArgs) (string, error) { + cmd := []string{ + "evmosd", + "tx", + txArgs.ModuleName, + txArgs.SubCommand, + } + cmd = append(cmd, txArgs.Args...) + cmd = append(cmd, + fmt.Sprintf("--chain-id=%s", txArgs.ChainID), + "--keyring-backend=test", + "--log_format=json", + "--fees=500aevmos", + "--gas=auto", + fmt.Sprintf("--from=%s", txArgs.From), + ) + return m.CreateExec(cmd, m.ContainerID()) +} diff --git a/tests/e2e/upgrade/utils.go b/tests/e2e/upgrade/utils.go index addfe20bb0..7791fb3d35 100644 --- a/tests/e2e/upgrade/utils.go +++ b/tests/e2e/upgrade/utils.go @@ -5,7 +5,6 @@ package upgrade import ( "fmt" - "log" "os" "os/exec" "regexp" @@ -18,7 +17,7 @@ import ( // EvmosVersions is a custom comparator for sorting semver version strings. type EvmosVersions []string -// Len is the number of stored versions.. +// Len is the number of stored versions. func (v EvmosVersions) Len() int { return len(v) } // Swap swaps the elements with indexes i and j. It is needed to sort the slice. @@ -28,12 +27,14 @@ func (v EvmosVersions) Swap(i, j int) { v[i], v[j] = v[j], v[i] } func (v EvmosVersions) Less(i, j int) bool { v1, err := version.NewVersion(v[i]) if err != nil { - log.Fatalf("couldn't interpret version as SemVer string: %s: %s", v[i], err.Error()) + panic(fmt.Sprintf("couldn't interpret version as SemVer string: %s: %s", v[i], err.Error())) } + v2, err := version.NewVersion(v[j]) if err != nil { - log.Fatalf("couldn't interpret version as SemVer string: %s: %s", v[j], err.Error()) + panic(fmt.Sprintf("couldn't interpret version as SemVer string: %s: %s", v[j], err.Error())) } + return v1.LessThan(v2) } @@ -60,21 +61,30 @@ func RetrieveUpgradesList(upgradesPath string) ([]string, error) { } // preallocate slice to store versions - versions := make([]string, len(dirs)) + versions := make([]string, 0, len(dirs)) // pattern to find quoted string(upgrade version) in a file e.g. "v10.0.0" pattern := regexp.MustCompile(`"(.*?)"`) - for i, d := range dirs { + for _, d := range dirs { + if !d.IsDir() { + continue + } + // creating path to upgrade dir file with constant upgrade version constantsPath := fmt.Sprintf("%s/%s/constants.go", upgradesPath, d.Name()) + if _, err = os.Stat(constantsPath); os.IsNotExist(err) { + continue + } + f, err := os.ReadFile(constantsPath) if err != nil { return nil, err } + v := pattern.FindString(string(f)) // v[1 : len(v)-1] subslice used to remove quotes from version string - versions[i] = v[1 : len(v)-1] + versions = append(versions, v[1:len(v)-1]) } sort.Sort(EvmosVersions(versions)) From 5644749e3451c34ba92c1801c7af09651d1998b4 Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Mon, 22 Jan 2024 21:59:49 +0100 Subject: [PATCH 088/345] imp(tests): Enable specifying the prefunded balances for the integration test setup (#2280) * enable specifying the prefunded balances for the integration test setup * add changelog entry * add unit test for WithBalances * address linter * address review comments --- CHANGELOG.md | 1 + testutil/integration/common/grpc/bank.go | 3 +- testutil/integration/evmos/grpc/grpc.go | 1 + testutil/integration/evmos/network/config.go | 39 ++++++++++++-- .../integration/evmos/network/config_test.go | 51 +++++++++++++++++++ testutil/integration/evmos/network/network.go | 10 ++-- testutil/integration/evmos/network/setup.go | 12 +++++ 7 files changed, 106 insertions(+), 11 deletions(-) create mode 100644 testutil/integration/evmos/network/config_test.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 754bb1482d..30ce1b69aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -161,6 +161,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (ci) [#2259](https://github.com/evmos/evmos/pull/2259) Adjust CI configuration to have required items always return a status. - (ci) [#2267](https://github.com/evmos/evmos/pull/2267) Minor clean-up in EIP-7212 tests. - (ci) [#2268](https://github.com/evmos/evmos/pull/2268) Fix and update the Pull Request Labeler workflow. +- (tests) [#2280](https://github.com/evmos/evmos/pull/2280) Enable specifying the prefunded balances for the integration test setup. ### Bug Fixes diff --git a/testutil/integration/common/grpc/bank.go b/testutil/integration/common/grpc/bank.go index fe30608cb3..cc988f8514 100644 --- a/testutil/integration/common/grpc/bank.go +++ b/testutil/integration/common/grpc/bank.go @@ -1,5 +1,6 @@ // Copyright Tharsis Labs Ltd.(Evmos) // SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + package grpc import ( @@ -18,7 +19,7 @@ func (gqh *IntegrationHandler) GetBalance(address sdktypes.AccAddress, denom str }) } -// GetAllBalance returns all the balances for the given address. +// GetAllBalances returns all the balances for the given address. func (gqh *IntegrationHandler) GetAllBalances(address sdktypes.AccAddress) (*banktypes.QueryAllBalancesResponse, error) { bankClient := gqh.network.GetBankClient() return bankClient.AllBalances(context.Background(), &banktypes.QueryAllBalancesRequest{ diff --git a/testutil/integration/evmos/grpc/grpc.go b/testutil/integration/evmos/grpc/grpc.go index f6a8f6cfcd..b7d301d9d8 100644 --- a/testutil/integration/evmos/grpc/grpc.go +++ b/testutil/integration/evmos/grpc/grpc.go @@ -1,5 +1,6 @@ // Copyright Tharsis Labs Ltd.(Evmos) // SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + package grpc import ( diff --git a/testutil/integration/evmos/network/config.go b/testutil/integration/evmos/network/config.go index aad0e595b7..4344fdae8e 100644 --- a/testutil/integration/evmos/network/config.go +++ b/testutil/integration/evmos/network/config.go @@ -1,15 +1,17 @@ // Copyright Tharsis Labs Ltd.(Evmos) // SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + package network import ( "math/big" - testtx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/utils" - sdktypes "github.com/cosmos/cosmos-sdk/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + testtx "github.com/evmos/evmos/v16/testutil/tx" evmostypes "github.com/evmos/evmos/v16/types" + "github.com/evmos/evmos/v16/utils" ) // Config defines the configuration for a chain. @@ -20,6 +22,7 @@ type Config struct { eip155ChainID *big.Int amountOfValidators int preFundedAccounts []sdktypes.AccAddress + balances []banktypes.Balance denom string } @@ -32,8 +35,28 @@ func DefaultConfig() Config { amountOfValidators: 3, // No funded accounts besides the validators by default preFundedAccounts: []sdktypes.AccAddress{account}, - denom: utils.BaseDenom, + // NOTE: Per default, the balances are left empty, and the pre-funded accounts are used. + balances: nil, + denom: utils.BaseDenom, + } +} + +// getGenAccountsAndBalances takes the network configuration and returns the used +// genesis accounts and balances. +// +// NOTE: If the balances are set, the pre-funded accounts are ignored. +func getGenAccountsAndBalances(cfg Config) (genAccounts []authtypes.GenesisAccount, balances []banktypes.Balance) { + if len(cfg.balances) > 0 { + balances = cfg.balances + accounts := getAccAddrsFromBalances(balances) + genAccounts = createGenesisAccounts(accounts) + } else { + coin := sdktypes.NewCoin(cfg.denom, PrefundedAccountInitialBalance) + genAccounts = createGenesisAccounts(cfg.preFundedAccounts) + balances = createBalances(cfg.preFundedAccounts, coin) } + + return } // ConfigOption defines a function that can modify the NetworkConfig. @@ -67,6 +90,14 @@ func WithPreFundedAccounts(accounts ...sdktypes.AccAddress) ConfigOption { } } +// WithBalances sets the specific balances for the pre-funded accounts, that +// are being set up for the network. +func WithBalances(balances ...banktypes.Balance) ConfigOption { + return func(cfg *Config) { + cfg.balances = append(cfg.balances, balances...) + } +} + // WithDenom sets the denom for the network. func WithDenom(denom string) ConfigOption { return func(cfg *Config) { diff --git a/testutil/integration/evmos/network/config_test.go b/testutil/integration/evmos/network/config_test.go new file mode 100644 index 0000000000..fca4751603 --- /dev/null +++ b/testutil/integration/evmos/network/config_test.go @@ -0,0 +1,51 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package network_test + +import ( + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + grpchandler "github.com/evmos/evmos/v16/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v16/testutil/integration/evmos/network" + "github.com/evmos/evmos/v16/utils" + "github.com/stretchr/testify/require" +) + +func TestWithBalances(t *testing.T) { + key1Balance := sdk.NewCoins(sdk.NewInt64Coin(utils.BaseDenom, 1e18)) + key2Balance := sdk.NewCoins( + sdk.NewInt64Coin(utils.BaseDenom, 2e18), + sdk.NewInt64Coin("other", 3e18), + ) + + // Create a new network with 2 pre-funded accounts + keyring := testkeyring.New(2) + balances := []banktypes.Balance{ + { + Address: keyring.GetAccAddr(0).String(), + Coins: key1Balance, + }, + { + Address: keyring.GetAccAddr(1).String(), + Coins: key2Balance, + }, + } + nw := network.New( + network.WithBalances(balances...), + ) + handler := grpchandler.NewIntegrationHandler(nw) + + req, err := handler.GetAllBalances(keyring.GetAccAddr(0)) + require.NoError(t, err, "error getting balances") + require.Len(t, req.Balances, 1, "wrong number of balances") + require.Equal(t, balances[0].Coins, req.Balances, "wrong balances") + + req, err = handler.GetAllBalances(keyring.GetAccAddr(1)) + require.NoError(t, err, "error getting balances") + require.Len(t, req.Balances, 2, "wrong number of balances") + require.Equal(t, balances[1].Coins, req.Balances, "wrong balances") +} diff --git a/testutil/integration/evmos/network/network.go b/testutil/integration/evmos/network/network.go index bab529ed8d..6d7e32f658 100644 --- a/testutil/integration/evmos/network/network.go +++ b/testutil/integration/evmos/network/network.go @@ -108,9 +108,7 @@ var ( func (n *IntegrationNetwork) configureAndInitChain() error { // Create funded accounts based on the config and // create genesis accounts - coin := sdktypes.NewCoin(n.cfg.denom, PrefundedAccountInitialBalance) - genAccounts := createGenesisAccounts(n.cfg.preFundedAccounts) - fundedAccountBalances := createBalances(n.cfg.preFundedAccounts, coin) + genAccounts, fundedAccountBalances := getGenAccountsAndBalances(n.cfg) // Create validator set with the amount of validators specified in the config // with the default power of 1. @@ -157,7 +155,7 @@ func (n *IntegrationNetwork) configureAndInitChain() error { return err } - consnsusParams := app.DefaultConsensusParams + consensusParams := app.DefaultConsensusParams evmosApp.InitChain( abcitypes.RequestInitChain{ ChainId: n.cfg.chainID, @@ -181,9 +179,9 @@ func (n *IntegrationNetwork) configureAndInitChain() error { // Set networks global parameters n.app = evmosApp - // TODO - this might not be the best way to initilize the context + // TODO - this might not be the best way to initialize the context n.ctx = evmosApp.BaseApp.NewContext(false, header) - n.ctx = n.ctx.WithConsensusParams(consnsusParams) + n.ctx = n.ctx.WithConsensusParams(consensusParams) n.ctx = n.ctx.WithBlockGasMeter(sdktypes.NewInfiniteGasMeter()) n.validators = validators diff --git a/testutil/integration/evmos/network/setup.go b/testutil/integration/evmos/network/setup.go index e3353d8682..aa41b3e58e 100644 --- a/testutil/integration/evmos/network/setup.go +++ b/testutil/integration/evmos/network/setup.go @@ -1,5 +1,6 @@ // Copyright Tharsis Labs Ltd.(Evmos) // SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + package network import ( @@ -57,6 +58,17 @@ func createGenesisAccounts(accounts []sdktypes.AccAddress) []authtypes.GenesisAc return genAccounts } +// getAccAddrsFromBalances returns a slice of genesis accounts from the +// given balances. +func getAccAddrsFromBalances(balances []banktypes.Balance) []sdktypes.AccAddress { + numberOfBalances := len(balances) + genAccounts := make([]sdktypes.AccAddress, 0, numberOfBalances) + for _, balance := range balances { + genAccounts = append(genAccounts, balance.GetAddress()) + } + return genAccounts +} + // createBalances creates balances for the given accounts and coin func createBalances(accounts []sdktypes.AccAddress, coin sdktypes.Coin) []banktypes.Balance { numberOfAccounts := len(accounts) From 808bfa0effe0940078abb28d512405091c5a487e Mon Sep 17 00:00:00 2001 From: Martin <58041408+maxnberlin@users.noreply.github.com> Date: Tue, 23 Jan 2024 16:44:37 +0100 Subject: [PATCH 089/345] Update LICENSE (#2286) Missing .md in the URL. --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 1f030f7efa..e589e0e08d 100644 --- a/LICENSE +++ b/LICENSE @@ -70,4 +70,4 @@ Software or any part of it. ----------------------------------------------------------------------------- For more information, please refer to the official ENCL-1.0 FAQ -(https://github.com/evmos/evmos/blob/main/LICENSE_FAQ). +(https://github.com/evmos/evmos/blob/main/LICENSE_FAQ.md). From 484c8a455dad26d93a4678c5f2ec97c7dadd75fb Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Wed, 24 Jan 2024 18:52:12 +0100 Subject: [PATCH 090/345] imp(tests): add utility to check balances in tests (#2289) * add utility to check balances to testutils * add changelog entry * add missing license --- CHANGELOG.md | 1 + testutil/integration/evmos/utils/bank.go | 34 ++++++++++ testutil/integration/evmos/utils/bank_test.go | 65 +++++++++++++++++++ 3 files changed, 100 insertions(+) create mode 100644 testutil/integration/evmos/utils/bank.go create mode 100644 testutil/integration/evmos/utils/bank_test.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 30ce1b69aa..81227f8b2e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -162,6 +162,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (ci) [#2267](https://github.com/evmos/evmos/pull/2267) Minor clean-up in EIP-7212 tests. - (ci) [#2268](https://github.com/evmos/evmos/pull/2268) Fix and update the Pull Request Labeler workflow. - (tests) [#2280](https://github.com/evmos/evmos/pull/2280) Enable specifying the prefunded balances for the integration test setup. +- (tests) [#2289](https://github.com/evmos/evmos/pull/2289) Add utility to check balances during tests. ### Bug Fixes diff --git a/testutil/integration/evmos/utils/bank.go b/testutil/integration/evmos/utils/bank.go new file mode 100644 index 0000000000..7e077266d2 --- /dev/null +++ b/testutil/integration/evmos/utils/bank.go @@ -0,0 +1,34 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package utils + +import ( + "fmt" + + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + "github.com/evmos/evmos/v16/testutil/integration/common/grpc" +) + +// CheckBalances checks that the given accounts have the expected balances and +// returns an error if that is not the case. +func CheckBalances(handler grpc.Handler, balances []banktypes.Balance) error { + for _, balance := range balances { + addr := balance.GetAddress() + for _, coin := range balance.GetCoins() { + balance, err := handler.GetBalance(addr, coin.Denom) + if err != nil { + return err + } + + if !balance.Balance.IsEqual(coin) { + return fmt.Errorf( + "expected balance %s, got %s for address %s", + coin, balance.Balance, addr, + ) + } + } + } + + return nil +} diff --git a/testutil/integration/evmos/utils/bank_test.go b/testutil/integration/evmos/utils/bank_test.go new file mode 100644 index 0000000000..ecd9331e21 --- /dev/null +++ b/testutil/integration/evmos/utils/bank_test.go @@ -0,0 +1,65 @@ +package utils_test + +import ( + "testing" + + "cosmossdk.io/math" + sdk "github.com/cosmos/cosmos-sdk/types" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + grpchandler "github.com/evmos/evmos/v16/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v16/testutil/integration/evmos/network" + "github.com/evmos/evmos/v16/testutil/integration/evmos/utils" + "github.com/stretchr/testify/require" +) + +func TestCheckBalances(t *testing.T) { + testDenom := "atest" + keyring := testkeyring.New(1) + nw := network.New( + network.WithDenom(testDenom), + network.WithPreFundedAccounts(keyring.GetAllAccAddrs()...), + ) + handler := grpchandler.NewIntegrationHandler(nw) + + testcases := []struct { + name string + address string + expAmount math.Int + expPass bool + errContains string + }{ + { + name: "pass", + address: keyring.GetAccAddr(0).String(), + expAmount: network.PrefundedAccountInitialBalance, + expPass: true, + }, + { + name: "fail - wrong amount", + address: keyring.GetAccAddr(0).String(), + expAmount: sdk.NewInt(1), + errContains: "expected balance", + }, + } + + for _, tc := range testcases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + balances := []banktypes.Balance{{ + Address: tc.address, + Coins: sdk.NewCoins( + sdk.NewCoin(testDenom, tc.expAmount), + ), + }} + + err := utils.CheckBalances(handler, balances) + if tc.expPass { + require.NoError(t, err, "unexpected error checking balances") + } else { + require.Error(t, err, "expected error checking balances") + require.ErrorContains(t, err, tc.errContains, "expected different error checking balances") + } + }) + } +} From efdb7fc7bbfcf12c26146b4a582309792ec3c0ca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Jan 2024 15:55:07 -0300 Subject: [PATCH 091/345] build(deps): bump google.golang.org/grpc from 1.60.1 to 1.61.0 (#2288) * build(deps): bump google.golang.org/grpc from 1.60.1 to 1.61.0 Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.60.1 to 1.61.0. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.60.1...v1.61.0) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * gomod2nix generate --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Guillermo Paoletti Co-authored-by: tom --- go.mod | 4 ++-- go.sum | 8 ++++---- gomod2nix.toml | 28 ++++++++++++++-------------- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/go.mod b/go.mod index d08bd3a609..a4ef2e7409 100644 --- a/go.mod +++ b/go.mod @@ -50,7 +50,7 @@ require ( golang.org/x/net v0.20.0 golang.org/x/text v0.14.0 google.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f - google.golang.org/grpc v1.60.1 + google.golang.org/grpc v1.61.0 google.golang.org/protobuf v1.32.0 sigs.k8s.io/yaml v1.4.0 ) @@ -225,7 +225,7 @@ require ( github.com/zondax/ledger-go v0.14.1 // indirect go.etcd.io/bbolt v1.3.7 // indirect golang.org/x/mod v0.14.0 // indirect - golang.org/x/oauth2 v0.13.0 // indirect + golang.org/x/oauth2 v0.14.0 // indirect golang.org/x/sync v0.5.0 // indirect golang.org/x/sys v0.16.0 // indirect golang.org/x/term v0.16.0 // indirect diff --git a/go.sum b/go.sum index 92b09da439..0e1fe3fbe0 100644 --- a/go.sum +++ b/go.sum @@ -1348,8 +1348,8 @@ golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= -golang.org/x/oauth2 v0.13.0 h1:jDDenyj+WgFtmV3zYVoi8aE2BwtXFLWOA67ZfNWftiY= -golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= +golang.org/x/oauth2 v0.14.0 h1:P0Vrf/2538nmC0H+pEQ3MNFRRnVR7RlqyVw+bvm26z0= +golang.org/x/oauth2 v0.14.0/go.mod h1:lAtNWgaWfL4cm7j2OV8TxGi9Qb7ECORx8DktCY74OwM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1800,8 +1800,8 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.60.1 h1:26+wFr+cNqSGFcOXcabYC0lUVJVRa2Sb2ortSK7VrEU= -google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= +google.golang.org/grpc v1.61.0 h1:TOvOcuXn30kRao+gfcvsebNEa5iZIiLkisYEkf7R7o0= +google.golang.org/grpc v1.61.0/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= diff --git a/gomod2nix.toml b/gomod2nix.toml index aaca8867e7..b2c33d73ee 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -471,11 +471,11 @@ schema = 3 version = "v0.0.5" hash = "sha256-/5i70IkH/qSW5KjGzv8aQNKh9tHoz98tqtL0K2DMFn4=" [mod."github.com/onsi/ginkgo/v2"] - version = "v2.13.2" - hash = "sha256-pHxVWo/jrw4us0u5bmlxAD1UKfkPg7/Rgb5VfxfLzHY=" + version = "v2.15.0" + hash = "sha256-E+f2d0RZ6DSpdh4OasCbT1vGckXsziM3hFt4HkI5x1s=" [mod."github.com/onsi/gomega"] - version = "v1.30.0" - hash = "sha256-MfCZQnS0Id9S2a0K2J+bnSJVd6kb7dkJuckR2o0Hfmo=" + version = "v1.31.1" + hash = "sha256-f2DB/0bOyy+MCQdFdiRI1y4wSXjumfPtLvYN3PN7vaQ=" [mod."github.com/opencontainers/go-digest"] version = "v1.0.0" hash = "sha256-cfVDjHyWItmUGZ2dzQhCHgmOmou8v7N+itDkLZVkqkQ=" @@ -643,17 +643,17 @@ schema = 3 version = "v0.0.0-20230711153332-06a737ee72cb" hash = "sha256-Cbw10ZJ+jATPV232G47xZrn6ExO1FDtiT6nlMRCH7EI=" [mod."golang.org/x/mod"] - version = "v0.13.0" - hash = "sha256-qh/YmxS0auZEiKzqdn+v84qs31SpkGIJn9rqKLjdKVU=" + version = "v0.14.0" + hash = "sha256-sx3hWp5l99DBfIrn821ohfoBwvaITSHMWbzPvX0btLM=" [mod."golang.org/x/net"] version = "v0.20.0" hash = "sha256-PCttIsWSBQd6fDXL49jepszUAMLnAGAKR//5EDO3XDk=" [mod."golang.org/x/oauth2"] - version = "v0.13.0" - hash = "sha256-mEmRQrh6FMsenT7x406HbZCynBJCHJ4e9u0M3hpG3m4=" + version = "v0.14.0" + hash = "sha256-1wCXYvhtiGksL75rrOTDc6P82WuKBeaReqy1l7CahAE=" [mod."golang.org/x/sync"] - version = "v0.4.0" - hash = "sha256-VCl5IerUva6XZqGXHa0J/r/ewsbOIIP7EBqyh1JGsXY=" + version = "v0.5.0" + hash = "sha256-EAKeODSsct5HhXPmpWJfulKSCkuUu6kkDttnjyZMNcI=" [mod."golang.org/x/sys"] version = "v0.16.0" hash = "sha256-ZkGclbp2S7NQYhbuGji6XokCn2Qi1BJy8dwyAOTV8sY=" @@ -664,8 +664,8 @@ schema = 3 version = "v0.14.0" hash = "sha256-yh3B0tom1RfzQBf1RNmfdNWF1PtiqxV41jW1GVS6JAg=" [mod."golang.org/x/tools"] - version = "v0.14.0" - hash = "sha256-BC/AesMg7LpIg0/e4a7Ab37rfyP2KaWBFrsonIp+JbE=" + version = "v0.16.1" + hash = "sha256-zIAwVvY/5/rPDebMDpR67CR7b+GtFmGWw6AOhxIkcfI=" [mod."golang.org/x/xerrors"] version = "v0.0.0-20220907171357-04be3eba64a2" hash = "sha256-6+zueutgefIYmgXinOflz8qGDDDj0Zhv+2OkGhBTKno=" @@ -685,8 +685,8 @@ schema = 3 version = "v0.0.0-20231212172506-995d672761c0" hash = "sha256-48aeFcLvuthyG7x9JmpeySrBkOqRhu+FgECjt1167IY=" [mod."google.golang.org/grpc"] - version = "v1.60.1" - hash = "sha256-JJ3X6DTUZWYtM8i8izWTH9nDvCydzea31iZt6ULDvsw=" + version = "v1.61.0" + hash = "sha256-+LvlQyeIaM0GgOQoa3rVmM9OS0UtbdK54Fvl3dgJEt8=" [mod."google.golang.org/protobuf"] version = "v1.32.0" hash = "sha256-GJuTkMGHCzHbyK4yD5kY4oMn8wQWqgkeBK//yVDqHJk=" From 51cc816e7533679a188992822eecc10e7ffaf793 Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Wed, 24 Jan 2024 23:03:18 +0100 Subject: [PATCH 092/345] chore(upgrade): Add v17 handler (#2291) add v17 handler Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- app/app.go | 11 +++++++++++ app/upgrades/v17/constants.go | 11 +++++++++++ app/upgrades/v17/upgrades.go | 24 ++++++++++++++++++++++++ 3 files changed, 46 insertions(+) create mode 100644 app/upgrades/v17/constants.go create mode 100644 app/upgrades/v17/upgrades.go diff --git a/app/app.go b/app/app.go index 6bdd1ee9b8..9e511bafe3 100644 --- a/app/app.go +++ b/app/app.go @@ -125,6 +125,7 @@ import ( ethante "github.com/evmos/evmos/v16/app/ante/evm" "github.com/evmos/evmos/v16/app/post" v16 "github.com/evmos/evmos/v16/app/upgrades/v16" + v17 "github.com/evmos/evmos/v16/app/upgrades/v17" "github.com/evmos/evmos/v16/encoding" "github.com/evmos/evmos/v16/ethereum/eip712" "github.com/evmos/evmos/v16/precompiles/common" @@ -1142,6 +1143,14 @@ func (app *Evmos) setupUpgradeHandlers() { ), ) + // v17 upgrade handler + app.UpgradeKeeper.SetUpgradeHandler( + v17.UpgradeName, + v17.CreateUpgradeHandler( + app.mm, app.configurator, + ), + ) + // When a planned update height is reached, the old binary will panic // writing on disk the height and name of the update that triggered it // This will read that value, and execute the preparations for the upgrade. @@ -1162,6 +1171,8 @@ func (app *Evmos) setupUpgradeHandlers() { storeUpgrades = &storetypes.StoreUpgrades{ Deleted: []string{"recoveryv1", "incentives", "claims"}, } + case v17.UpgradeName: + // no store upgrades default: // no-op } diff --git a/app/upgrades/v17/constants.go b/app/upgrades/v17/constants.go new file mode 100644 index 0000000000..61b31fac89 --- /dev/null +++ b/app/upgrades/v17/constants.go @@ -0,0 +1,11 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package v17 + +const ( + // UpgradeName is the shared upgrade plan name for mainnet + UpgradeName = "v17.0.0" + // UpgradeInfo defines the binaries that will be used for the upgrade + UpgradeInfo = `'{"binaries":{"darwin/amd64":"https://github.com/evmos/evmos/releases/download/v17.0.0/evmos_17.0.0_Darwin_arm64.tar.gz","darwin/x86_64":"https://github.com/evmos/evmos/releases/download/v17.0.0/evmos_17.0.0_Darwin_x86_64.tar.gz","linux/arm64":"https://github.com/evmos/evmos/releases/download/v17.0.0/evmos_17.0.0_Linux_arm64.tar.gz","linux/amd64":"https://github.com/evmos/evmos/releases/download/v17.0.0/evmos_17.0.0_Linux_amd64.tar.gz","windows/x86_64":"https://github.com/evmos/evmos/releases/download/v17.0.0/evmos_17.0.0_Windows_x86_64.zip"}}'` +) diff --git a/app/upgrades/v17/upgrades.go b/app/upgrades/v17/upgrades.go new file mode 100644 index 0000000000..de286aaf61 --- /dev/null +++ b/app/upgrades/v17/upgrades.go @@ -0,0 +1,24 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package v17 + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" +) + +// CreateUpgradeHandler creates an SDK upgrade handler for v17.0.0 +func CreateUpgradeHandler( + mm *module.Manager, + configurator module.Configurator, +) upgradetypes.UpgradeHandler { + return func(ctx sdk.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { + logger := ctx.Logger().With("upgrade", UpgradeName) + + // Leave modules are as-is to avoid running InitGenesis. + logger.Debug("running module migrations ...") + return mm.RunMigrations(ctx, configurator, vm) + } +} From 96404c639dbc97fc037d3898abd1d09a1c9fd752 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jan 2024 14:24:25 +0100 Subject: [PATCH 093/345] build(deps): bump bufbuild/buf-setup-action from 1.28.1 to 1.29.0 (#2293) Bumps [bufbuild/buf-setup-action](https://github.com/bufbuild/buf-setup-action) from 1.28.1 to 1.29.0. - [Release notes](https://github.com/bufbuild/buf-setup-action/releases) - [Commits](https://github.com/bufbuild/buf-setup-action/compare/v1.28.1...v1.29.0) --- updated-dependencies: - dependency-name: bufbuild/buf-setup-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/bsr-push.yml | 2 +- .github/workflows/proto.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/bsr-push.yml b/.github/workflows/bsr-push.yml index b0db1d05fa..4e5956910d 100644 --- a/.github/workflows/bsr-push.yml +++ b/.github/workflows/bsr-push.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: bufbuild/buf-setup-action@v1.28.1 + - uses: bufbuild/buf-setup-action@v1.29.0 # Push Evmos protos to the Buf Schema Registry - uses: bufbuild/buf-push-action@v1.2.0 with: diff --git a/.github/workflows/proto.yml b/.github/workflows/proto.yml index 473760eb18..cebcd5412b 100644 --- a/.github/workflows/proto.yml +++ b/.github/workflows/proto.yml @@ -28,7 +28,7 @@ jobs: timeout-minutes: 5 steps: - uses: actions/checkout@v4 - - uses: bufbuild/buf-setup-action@v1.28.1 + - uses: bufbuild/buf-setup-action@v1.29.0 - uses: bufbuild/buf-lint-action@v1 with: input: "proto" @@ -37,7 +37,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: bufbuild/buf-setup-action@v1.28.1 + - uses: bufbuild/buf-setup-action@v1.29.0 - uses: bufbuild/buf-breaking-action@v1 with: input: "proto" From 92c35a2b1ea963a68e5b86c8096873c64487f957 Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Thu, 25 Jan 2024 14:22:52 -0300 Subject: [PATCH 094/345] chore(erc20): revert unnecessary logic on genesis (#2292) * gomod2nix generate * add corresponding contract and acc * Revert "fix(erc20): add logic to deploy token pairs contracts on genesis (#2217)" This reverts commit c9688f389dfb0261c87ca828555359059f4732c0. * add changelog entry * dont lint jsonnet files * revert changes on test * revert changes on test --- .github/workflows/super-linter.yml | 1 + CHANGELOG.md | 1 + .../nix_tests/configs/osmosis-outpost.jsonnet | 100 +++ x/erc20/genesis.go | 7 +- x/erc20/genesis_test.go | 30 - x/erc20/keeper/evm.go | 51 +- x/erc20/keeper/genesis.go | 155 ---- x/erc20/keeper/genesis_test.go | 175 ----- x/erc20/types/interfaces.go | 20 - x/erc20/types/mocks/EVMKeeper.go | 732 +----------------- 10 files changed, 139 insertions(+), 1133 deletions(-) delete mode 100644 x/erc20/keeper/genesis.go delete mode 100644 x/erc20/keeper/genesis_test.go diff --git a/.github/workflows/super-linter.yml b/.github/workflows/super-linter.yml index 191e4e96cd..794ac8d59e 100644 --- a/.github/workflows/super-linter.yml +++ b/.github/workflows/super-linter.yml @@ -33,3 +33,4 @@ jobs: VALIDATE_GO: false DEFAULT_BRANCH: "main" GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + FILTER_REGEX_EXCLUDE: .*.jsonnet diff --git a/CHANGELOG.md b/CHANGELOG.md index 81227f8b2e..63772d7762 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -60,6 +60,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (stride-outpost) [#2207](https://github.com/evmos/evmos/pull/2207) Update Stride outpost to include additional arguments. - (incentives) [#2221](https://github.com/evmos/evmos/pull/2221) Burn the usage incentives pool balance during v16 upgrade. - (erc20) [#2217](https://github.com/evmos/evmos/pull/2217) Add logic to deploy token pairs contracts on genesis. +- (erc20) [#2292](https://github.com/evmos/evmos/pull/2292) Revert unnecessary logic on genesis (reverts #2217). ### API Breaking diff --git a/tests/nix_tests/configs/osmosis-outpost.jsonnet b/tests/nix_tests/configs/osmosis-outpost.jsonnet index fb29d0156f..22b358a899 100644 --- a/tests/nix_tests/configs/osmosis-outpost.jsonnet +++ b/tests/nix_tests/configs/osmosis-outpost.jsonnet @@ -11,6 +11,20 @@ config { }, 'genesis'+: { 'app_state'+: { + auth: { + 'accounts'+: [ + { + "@type": "/ethermint.types.v1.EthAccount", + "base_account": { + "account_number": "12", + "address": "evmos1tkm8d9krczydl06c357asj05gfn07rl6vw239z", + "pub_key": null, + "sequence": "0" + }, + "code_hash": "0xc103ecaeab07c23a0723cfe69c567c9891d634ab674165faf9cb33a053abfea9" + } + ] + }, erc20: { 'token_pairs': [{ 'erc20_address': '0x5db67696C3c088DfBf588d3dd849f44266ff0ffa', @@ -19,6 +33,92 @@ config { 'contract_owner': 1, }], }, + evm: { + 'accounts': [ + { + "address": "0x5db67696C3c088DfBf588d3dd849f44266ff0ffa", + "code": "608060405234801561000f575f80fd5b50600436106101d8575f3560e01c80635c975abb11610102578063a217fddf116100a0578063d53913931161006f578063d53913931461057a578063d547741f14610598578063dd62ed3e146105b4578063e63ab1e9146105e4576101d8565b8063a217fddf146104cc578063a457c2d7146104ea578063a9059cbb1461051a578063ca15c8731461054a576101d8565b80638456cb59116100dc5780638456cb59146104445780639010d07c1461044e57806391d148541461047e57806395d89b41146104ae576101d8565b80635c975abb146103da57806370a08231146103f857806379cc679014610428576101d8565b8063282c51f31161017a578063395093511161014957806339509351146103685780633f4ba83a1461039857806340c10f19146103a257806342966c68146103be576101d8565b8063282c51f3146102f45780632f2ff15d14610312578063313ce5671461032e57806336568abe1461034c576101d8565b806318160ddd116101b657806318160ddd1461025a5780631cf2c7e21461027857806323b872dd14610294578063248a9ca3146102c4576101d8565b806301ffc9a7146101dc57806306fdde031461020c578063095ea7b31461022a575b5f80fd5b6101f660048036038101906101f19190612005565b610602565b604051610203919061204a565b60405180910390f35b61021461067b565b60405161022191906120ed565b60405180910390f35b610244600480360381019061023f919061219a565b61070b565b604051610251919061204a565b60405180910390f35b61026261072d565b60405161026f91906121e7565b60405180910390f35b610292600480360381019061028d919061219a565b610736565b005b6102ae60048036038101906102a99190612200565b6107b4565b6040516102bb919061204a565b60405180910390f35b6102de60048036038101906102d99190612283565b6107e2565b6040516102eb91906122bd565b60405180910390f35b6102fc6107fe565b60405161030991906122bd565b60405180910390f35b61032c600480360381019061032791906122d6565b610822565b005b610336610843565b604051610343919061232f565b60405180910390f35b610366600480360381019061036191906122d6565b610859565b005b610382600480360381019061037d919061219a565b6108dc565b60405161038f919061204a565b60405180910390f35b6103a0610912565b005b6103bc60048036038101906103b7919061219a565b61098c565b005b6103d860048036038101906103d39190612348565b610a0a565b005b6103e2610a1e565b6040516103ef919061204a565b60405180910390f35b610412600480360381019061040d9190612373565b610a33565b60405161041f91906121e7565b60405180910390f35b610442600480360381019061043d919061219a565b610a79565b005b61044c610a99565b005b6104686004803603810190610463919061239e565b610b13565b60405161047591906123eb565b60405180910390f35b610498600480360381019061049391906122d6565b610b3f565b6040516104a5919061204a565b60405180910390f35b6104b6610ba2565b6040516104c391906120ed565b60405180910390f35b6104d4610c32565b6040516104e191906122bd565b60405180910390f35b61050460048036038101906104ff919061219a565b610c38565b604051610511919061204a565b60405180910390f35b610534600480360381019061052f919061219a565b610cad565b604051610541919061204a565b60405180910390f35b610564600480360381019061055f9190612283565b610ccf565b60405161057191906121e7565b60405180910390f35b610582610cf0565b60405161058f91906122bd565b60405180910390f35b6105b260048036038101906105ad91906122d6565b610d14565b005b6105ce60048036038101906105c99190612404565b610d35565b6040516105db91906121e7565b60405180910390f35b6105ec610db7565b6040516105f991906122bd565b60405180910390f35b5f7f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610674575061067382610ddb565b5b9050919050565b60606005805461068a9061246f565b80601f01602080910402602001604051908101604052809291908181526020018280546106b69061246f565b80156107015780601f106106d857610100808354040283529160200191610701565b820191905f5260205f20905b8154815290600101906020018083116106e457829003601f168201915b5050505050905090565b5f80610715610e54565b9050610722818585610e5b565b600191505092915050565b5f600454905090565b6107677f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a848610762610e54565b610b3f565b6107a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079d9061250f565b60405180910390fd5b6107b0828261101e565b5050565b5f806107be610e54565b90506107cb8582856111e3565b6107d685858561126e565b60019150509392505050565b5f805f8381526020019081526020015f20600101549050919050565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84881565b61082b826107e2565b610834816114dd565b61083e83836114f1565b505050565b5f600760019054906101000a900460ff16905090565b610861610e54565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146108ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c59061259d565b60405180910390fd5b6108d88282611523565b5050565b5f806108e6610e54565b90506109078185856108f88589610d35565b61090291906125e8565b610e5b565b600191505092915050565b6109437f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61093e610e54565b610b3f565b610982576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109799061268b565b60405180910390fd5b61098a611555565b565b6109bd7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66109b8610e54565b610b3f565b6109fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f390612719565b60405180910390fd5b610a0682826115b6565b5050565b610a1b610a15610e54565b8261101e565b50565b5f60075f9054906101000a900460ff16905090565b5f60025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610a8b82610a85610e54565b836111e3565b610a95828261101e565b5050565b610aca7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610ac5610e54565b610b3f565b610b09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b00906127a7565b60405180910390fd5b610b11611705565b565b5f610b378260015f8681526020019081526020015f2061176790919063ffffffff16565b905092915050565b5f805f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b606060068054610bb19061246f565b80601f0160208091040260200160405190810160405280929190818152602001828054610bdd9061246f565b8015610c285780601f10610bff57610100808354040283529160200191610c28565b820191905f5260205f20905b815481529060010190602001808311610c0b57829003601f168201915b5050505050905090565b5f801b81565b5f80610c42610e54565b90505f610c4f8286610d35565b905083811015610c94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8b90612835565b60405180910390fd5b610ca18286868403610e5b565b60019250505092915050565b5f80610cb7610e54565b9050610cc481858561126e565b600191505092915050565b5f610ce960015f8481526020019081526020015f2061177e565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610d1d826107e2565b610d26816114dd565b610d308383611523565b505050565b5f60035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e4d5750610e4c82611791565b5b9050919050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ec9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec0906128c3565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2e90612951565b60405180910390fd5b8060035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161101191906121e7565b60405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361108c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611083906129df565b60405180910390fd5b611097825f836117fa565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508181101561111b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111290612a6d565b60405180910390fd5b81810360025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160045f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516111cb91906121e7565b60405180910390a36111de835f8461180a565b505050565b5f6111ee8484610d35565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611268578181101561125a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125190612ad5565b60405180910390fd5b6112678484848403610e5b565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390612b63565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361134a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134190612bf1565b60405180910390fd5b6113558383836117fa565b5f60025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156113d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d090612c7f565b60405180910390fd5b81810360025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114c491906121e7565b60405180910390a36114d784848461180a565b50505050565b6114ee816114e9610e54565b61180f565b50565b6114fb8282611893565b61151e8160015f8581526020019081526020015f2061196d90919063ffffffff16565b505050565b61152d828261199a565b6115508160015f8581526020019081526020015f20611a7490919063ffffffff16565b505050565b61155d611aa1565b5f60075f6101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61159f610e54565b6040516115ac91906123eb565b60405180910390a1565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161b90612ce7565b60405180910390fd5b61162f5f83836117fa565b8060045f82825461164091906125e8565b925050819055508060025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516116ee91906121e7565b60405180910390a36117015f838361180a565b5050565b61170d611aea565b600160075f6101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611750610e54565b60405161175d91906123eb565b60405180910390a1565b5f611774835f0183611b34565b5f1c905092915050565b5f61178a825f01611b5b565b9050919050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611805838383611b6a565b505050565b505050565b6118198282610b3f565b61188f5761182681611bc2565b611833835f1c6020611bef565b604051602001611844929190612dd3565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188691906120ed565b60405180910390fd5b5050565b61189d8282610b3f565b6119695760015f808481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061190e610e54565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b5f611992835f018373ffffffffffffffffffffffffffffffffffffffff165f1b611e24565b905092915050565b6119a48282610b3f565b15611a70575f805f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550611a15610e54565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b5f611a99835f018373ffffffffffffffffffffffffffffffffffffffff165f1b611e8b565b905092915050565b611aa9610a1e565b611ae8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adf90612e56565b60405180910390fd5b565b611af2610a1e565b15611b32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2990612ebe565b60405180910390fd5b565b5f825f018281548110611b4a57611b49612edc565b5b905f5260205f200154905092915050565b5f815f01805490509050919050565b611b75838383611f87565b611b7d610a1e565b15611bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb490612f79565b60405180910390fd5b505050565b6060611be88273ffffffffffffffffffffffffffffffffffffffff16601460ff16611bef565b9050919050565b60605f6002836002611c019190612f97565b611c0b91906125e8565b67ffffffffffffffff811115611c2457611c23612fd8565b5b6040519080825280601f01601f191660200182016040528015611c565781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110611c8d57611c8c612edc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611cf057611cef612edc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f6001846002611d2e9190612f97565b611d3891906125e8565b90505b6001811115611dd7577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611d7a57611d79612edc565b5b1a60f81b828281518110611d9157611d90612edc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600485901c945080611dd090613005565b9050611d3b565b505f8414611e1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1190613076565b60405180910390fd5b8091505092915050565b5f611e2f8383611f8c565b611e8157825f0182908060018154018082558091505060019003905f5260205f20015f9091909190915055825f0180549050836001015f8481526020019081526020015f208190555060019050611e85565b5f90505b92915050565b5f80836001015f8481526020019081526020015f205490505f8114611f7c575f600182611eb89190613094565b90505f6001865f0180549050611ece9190613094565b9050818114611f34575f865f018281548110611eed57611eec612edc565b5b905f5260205f200154905080875f018481548110611f0e57611f0d612edc565b5b905f5260205f20018190555083876001015f8381526020019081526020015f2081905550505b855f01805480611f4757611f466130c7565b5b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611f81565b5f9150505b92915050565b505050565b5f80836001015f8481526020019081526020015f20541415905092915050565b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611fe481611fb0565b8114611fee575f80fd5b50565b5f81359050611fff81611fdb565b92915050565b5f6020828403121561201a57612019611fac565b5b5f61202784828501611ff1565b91505092915050565b5f8115159050919050565b61204481612030565b82525050565b5f60208201905061205d5f83018461203b565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561209a57808201518184015260208101905061207f565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6120bf82612063565b6120c9818561206d565b93506120d981856020860161207d565b6120e2816120a5565b840191505092915050565b5f6020820190508181035f83015261210581846120b5565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6121368261210d565b9050919050565b6121468161212c565b8114612150575f80fd5b50565b5f813590506121618161213d565b92915050565b5f819050919050565b61217981612167565b8114612183575f80fd5b50565b5f8135905061219481612170565b92915050565b5f80604083850312156121b0576121af611fac565b5b5f6121bd85828601612153565b92505060206121ce85828601612186565b9150509250929050565b6121e181612167565b82525050565b5f6020820190506121fa5f8301846121d8565b92915050565b5f805f6060848603121561221757612216611fac565b5b5f61222486828701612153565b935050602061223586828701612153565b925050604061224686828701612186565b9150509250925092565b5f819050919050565b61226281612250565b811461226c575f80fd5b50565b5f8135905061227d81612259565b92915050565b5f6020828403121561229857612297611fac565b5b5f6122a58482850161226f565b91505092915050565b6122b781612250565b82525050565b5f6020820190506122d05f8301846122ae565b92915050565b5f80604083850312156122ec576122eb611fac565b5b5f6122f98582860161226f565b925050602061230a85828601612153565b9150509250929050565b5f60ff82169050919050565b61232981612314565b82525050565b5f6020820190506123425f830184612320565b92915050565b5f6020828403121561235d5761235c611fac565b5b5f61236a84828501612186565b91505092915050565b5f6020828403121561238857612387611fac565b5b5f61239584828501612153565b91505092915050565b5f80604083850312156123b4576123b3611fac565b5b5f6123c18582860161226f565b92505060206123d285828601612186565b9150509250929050565b6123e58161212c565b82525050565b5f6020820190506123fe5f8301846123dc565b92915050565b5f806040838503121561241a57612419611fac565b5b5f61242785828601612153565b925050602061243885828601612153565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061248657607f821691505b60208210810361249957612498612442565b5b50919050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d757374205f8201527f68617665206275726e657220726f6c6520746f206275726e0000000000000000602082015250565b5f6124f960388361206d565b91506125048261249f565b604082019050919050565b5f6020820190508181035f830152612526816124ed565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e63655f8201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b5f612587602f8361206d565b91506125928261252d565b604082019050919050565b5f6020820190508181035f8301526125b48161257b565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6125f282612167565b91506125fd83612167565b9250828201905080821115612615576126146125bb565b5b92915050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d757374205f8201527f686176652070617573657220726f6c6520746f20756e70617573650000000000602082015250565b5f612675603b8361206d565b91506126808261261b565b604082019050919050565b5f6020820190508181035f8301526126a281612669565b9050919050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d757374205f8201527f68617665206d696e74657220726f6c6520746f206d696e740000000000000000602082015250565b5f61270360388361206d565b915061270e826126a9565b604082019050919050565b5f6020820190508181035f830152612730816126f7565b9050919050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d757374205f8201527f686176652070617573657220726f6c6520746f20706175736500000000000000602082015250565b5f61279160398361206d565b915061279c82612737565b604082019050919050565b5f6020820190508181035f8301526127be81612785565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f61281f60258361206d565b915061282a826127c5565b604082019050919050565b5f6020820190508181035f83015261284c81612813565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f6128ad60248361206d565b91506128b882612853565b604082019050919050565b5f6020820190508181035f8301526128da816128a1565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f61293b60228361206d565b9150612946826128e1565b604082019050919050565b5f6020820190508181035f8301526129688161292f565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f206164647265735f8201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b5f6129c960218361206d565b91506129d48261296f565b604082019050919050565b5f6020820190508181035f8301526129f6816129bd565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f612a5760228361206d565b9150612a62826129fd565b604082019050919050565b5f6020820190508181035f830152612a8481612a4b565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f612abf601d8361206d565b9150612aca82612a8b565b602082019050919050565b5f6020820190508181035f830152612aec81612ab3565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f612b4d60258361206d565b9150612b5882612af3565b604082019050919050565b5f6020820190508181035f830152612b7a81612b41565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f612bdb60238361206d565b9150612be682612b81565b604082019050919050565b5f6020820190508181035f830152612c0881612bcf565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f612c6960268361206d565b9150612c7482612c0f565b604082019050919050565b5f6020820190508181035f830152612c9681612c5d565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f612cd1601f8361206d565b9150612cdc82612c9d565b602082019050919050565b5f6020820190508181035f830152612cfe81612cc5565b9050919050565b5f81905092915050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000005f82015250565b5f612d43601783612d05565b9150612d4e82612d0f565b601782019050919050565b5f612d6382612063565b612d6d8185612d05565b9350612d7d81856020860161207d565b80840191505092915050565b7f206973206d697373696e6720726f6c65200000000000000000000000000000005f82015250565b5f612dbd601183612d05565b9150612dc882612d89565b601182019050919050565b5f612ddd82612d37565b9150612de98285612d59565b9150612df482612db1565b9150612e008284612d59565b91508190509392505050565b7f5061757361626c653a206e6f74207061757365640000000000000000000000005f82015250565b5f612e4060148361206d565b9150612e4b82612e0c565b602082019050919050565b5f6020820190508181035f830152612e6d81612e34565b9050919050565b7f5061757361626c653a20706175736564000000000000000000000000000000005f82015250565b5f612ea860108361206d565b9150612eb382612e74565b602082019050919050565b5f6020820190508181035f830152612ed581612e9c565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f45524332305061757361626c653a20746f6b656e207472616e736665722077685f8201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b5f612f63602a8361206d565b9150612f6e82612f09565b604082019050919050565b5f6020820190508181035f830152612f9081612f57565b9050919050565b5f612fa182612167565b9150612fac83612167565b9250828202612fba81612167565b91508282048414831517612fd157612fd06125bb565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f61300f82612167565b91505f8203613021576130206125bb565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e745f82015250565b5f61306060208361206d565b915061306b8261302c565b602082019050919050565b5f6020820190508181035f83015261308d81613054565b9050919050565b5f61309e82612167565b91506130a983612167565b92508282039050818111156130c1576130c06125bb565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea26469706673582212208e17db436f847258cc8b148f2ec3689c9d1043000f9acacdf5a893071a6136a964736f6c63430008170033", + "storage": [ + { + "key": "0x0000000000000000000000000000000000000000000000000000000000000005", + "value": "0x4f736d6f00000000000000000000000000000000000000000000000000000008" + }, + { + "key": "0x0000000000000000000000000000000000000000000000000000000000000006", + "value": "0x4f534d4f00000000000000000000000000000000000000000000000000000008" + }, + { + "key": "0x0000000000000000000000000000000000000000000000000000000000000007", + "value": "0x0000000000000000000000000000000000000000000000000000000000000600" + }, + { + "key": "0x0eb5be412f275a18f6e4d622aee4ff40b21467c926224771b782d4c095d1444b", + "value": "0x00000000000000000000000047eeb2eac350e1923b8cbdfa4396a077b36e62a0" + }, + { + "key": "0x0ef55e0cc676cf0b0dcbdc7d53c3b797e88e44b10ecee85d45144bc7392574c7", + "value": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "key": "0x26bde78f605f19d1d853933fa781096670ea82ad96c9a3fb49f407e9600b316a", + "value": "0x00000000000000000000000047eeb2eac350e1923b8cbdfa4396a077b36e62a0" + }, + { + "key": "0x28bcb2563cf7895ce732c75018c5f73c44037088fc4505201fc28c3147d1d4a0", + "value": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "key": "0x2e681a43037a582fb0535432b520e9dc97303bf239f82648091f9be82f4b677e", + "value": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "key": "0x42aa905ad67e072b45e9dae81c8fa8bc705cc25014d5e9f10fa5114ae9c0dcf1", + "value": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "key": "0x4796a5437e25bdc491b74d328cf6b437c8587e216f52049c7df56421f51ae30f", + "value": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "key": "0x64e21244e91af723e1b962171ed4828dcecc0d7b89872e516a5db8266da80000", + "value": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "key": "0x6d2487ab6e76634bbe98b9d5b39803d625a8f9249da9e03e70c638bf76d9e29b", + "value": "0x00000000000000000000000047eeb2eac350e1923b8cbdfa4396a077b36e62a0" + }, + { + "key": "0x97c12224ac75d13d2d9a9e30dd25212b81a4e2c19743b211209b4bca3db99142", + "value": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "key": "0xa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49", + "value": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "key": "0xb009fbc347bffd144efd545cc4b15a37592e1dd7063753564d9ecc6fea764b6f", + "value": "0x00000000000000000000000047eeb2eac350e1923b8cbdfa4396a077b36e62a0" + }, + { + "key": "0xb9cbbae02fe941283ec0eefd7b121e3bc7f89fae077b27bdd75a7fd4cf1543a8", + "value": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "key": "0xc5724e8640ef1f7915e4839c81ad4b592af3c601230608793acd429a848553e9", + "value": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "key": "0xfac4953099c6f6272238a038333d99c9cd0475cb85c72b761909fadae4b6cbcd", + "value": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "key": "0xfd061ffb53f8d83182630fadee503ca39e0bae885f162932fe84d25caddbc888", + "value": "0x0000000000000000000000000000000000000000000000000000000000000001" + } + ] + } + ] + }, transfer: { 'denom_traces': [{"path":"transfer/channel-0","base_denom":"uosmo"}], }, diff --git a/x/erc20/genesis.go b/x/erc20/genesis.go index d909da6d6a..3d5682ef9f 100644 --- a/x/erc20/genesis.go +++ b/x/erc20/genesis.go @@ -31,8 +31,11 @@ func InitGenesis( panic("the erc20 module account has not been set") } - if err := k.SetGenesisTokenPairs(ctx, data.TokenPairs); err != nil { - panic(err) + for _, pair := range data.TokenPairs { + id := pair.GetID() + k.SetTokenPair(ctx, pair) + k.SetDenomMap(ctx, pair.Denom, id) + k.SetERC20Map(ctx, pair.GetERC20Contract(), id) } } diff --git a/x/erc20/genesis_test.go b/x/erc20/genesis_test.go index 1fff09f75e..47244f5ed9 100644 --- a/x/erc20/genesis_test.go +++ b/x/erc20/genesis_test.go @@ -4,7 +4,6 @@ import ( "testing" "time" - "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/suite" sdk "github.com/cosmos/cosmos-sdk/types" @@ -81,17 +80,14 @@ func (suite *GenesisTestSuite) TestERC20InitGenesis() { testCases := []struct { name string genesisState types.GenesisState - malleate func() }{ { name: "empty genesis", genesisState: types.GenesisState{}, - malleate: nil, }, { name: "default genesis", genesisState: *types.DefaultGenesisState(), - malleate: nil, }, { name: "custom genesis", @@ -106,23 +102,10 @@ func (suite *GenesisTestSuite) TestERC20InitGenesis() { }, }, ), - malleate: func() { - suite.app.TransferKeeper.SetDenomTrace( - suite.ctx, - transfertypes.DenomTrace{ - BaseDenom: "uosmo", - Path: "transfer/channel-0", - }, - ) - }, }, } for _, tc := range testCases { - if tc.malleate != nil { - tc.malleate() - } - suite.Require().NotPanics(func() { erc20.InitGenesis(suite.ctx, suite.app.Erc20Keeper, suite.app.AccountKeeper, tc.genesisState) }) @@ -133,9 +116,6 @@ func (suite *GenesisTestSuite) TestERC20InitGenesis() { suite.Require().Equal(tc.genesisState.Params, params) if len(tokenPairs) > 0 { suite.Require().Equal(tc.genesisState.TokenPairs, tokenPairs) - // check ERC20 contract was created successfully - acc := suite.app.EvmKeeper.GetAccount(suite.ctx, common.HexToAddress(osmoERC20ContractAddr)) - suite.Require().True(acc.IsContract()) } else { suite.Require().Len(tc.genesisState.TokenPairs, 0) } @@ -146,17 +126,14 @@ func (suite *GenesisTestSuite) TestErc20ExportGenesis() { testGenCases := []struct { name string genesisState types.GenesisState - malleate func() }{ { name: "empty genesis", genesisState: types.GenesisState{}, - malleate: nil, }, { name: "default genesis", genesisState: *types.DefaultGenesisState(), - malleate: nil, }, { name: "custom genesis", @@ -171,16 +148,10 @@ func (suite *GenesisTestSuite) TestErc20ExportGenesis() { }, }, ), - malleate: func() { - suite.app.TransferKeeper.SetDenomTrace(suite.ctx, osmoDenomTrace) - }, }, } for _, tc := range testGenCases { - if tc.malleate != nil { - tc.malleate() - } erc20.InitGenesis(suite.ctx, suite.app.Erc20Keeper, suite.app.AccountKeeper, tc.genesisState) suite.Require().NotPanics(func() { genesisExported := erc20.ExportGenesis(suite.ctx, suite.app.Erc20Keeper) @@ -194,6 +165,5 @@ func (suite *GenesisTestSuite) TestErc20ExportGenesis() { suite.Require().Len(genesisExported.TokenPairs, 0) } }) - // } } } diff --git a/x/erc20/keeper/evm.go b/x/erc20/keeper/evm.go index 86a3e09c22..2b73b15c7b 100644 --- a/x/erc20/keeper/evm.go +++ b/x/erc20/keeper/evm.go @@ -5,8 +5,6 @@ package keeper import ( "encoding/json" - "fmt" - "math" "math/big" errorsmod "cosmossdk.io/errors" @@ -31,11 +29,25 @@ func (k Keeper) DeployERC20Contract( ctx sdk.Context, coinMetadata banktypes.Metadata, ) (common.Address, error) { - data, err := getContractDataBz(coinMetadata) + decimals := uint8(0) + if len(coinMetadata.DenomUnits) > 0 { + decimalsIdx := len(coinMetadata.DenomUnits) - 1 + decimals = uint8(coinMetadata.DenomUnits[decimalsIdx].Exponent) + } + ctorArgs, err := contracts.ERC20MinterBurnerDecimalsContract.ABI.Pack( + "", + coinMetadata.Name, + coinMetadata.Symbol, + decimals, + ) if err != nil { - return common.Address{}, err + return common.Address{}, errorsmod.Wrapf(types.ErrABIPack, "coin metadata is invalid %s: %s", coinMetadata.Name, err.Error()) } + data := make([]byte, len(contracts.ERC20MinterBurnerDecimalsContract.Bin)+len(ctorArgs)) + copy(data[:len(contracts.ERC20MinterBurnerDecimalsContract.Bin)], contracts.ERC20MinterBurnerDecimalsContract.Bin) + copy(data[len(contracts.ERC20MinterBurnerDecimalsContract.Bin):], ctorArgs) + nonce, err := k.accountKeeper.GetSequence(ctx, types.ModuleAddress.Bytes()) if err != nil { return common.Address{}, err @@ -230,34 +242,3 @@ func (k Keeper) monitorApprovalEvent(res *evmtypes.MsgEthereumTxResponse) error return nil } - -// getContractDataBz is a helper function to get the contract bytecode -// needed to deploy an ERC20 contract based on the input coin metadata -func getContractDataBz(coinMetadata banktypes.Metadata) ([]byte, error) { - decimals := uint8(0) - if len(coinMetadata.DenomUnits) > 0 { - decimalsIdx := len(coinMetadata.DenomUnits) - 1 - exp := coinMetadata.DenomUnits[decimalsIdx].Exponent - if exp > math.MaxUint8 { - return nil, fmt.Errorf("coin metadata is invalid. Denom unit exponent should be less or equal than %d, got %d", math.MaxUint8, exp) - } - decimals = uint8(exp) - } - - // Get the input values for the ERC20 contract constructor method - constructorArgs, err := contracts.ERC20MinterBurnerDecimalsContract.ABI.Pack( - "", // constructor - coinMetadata.Name, - coinMetadata.Symbol, - decimals, - ) - if err != nil { - return nil, errorsmod.Wrapf(types.ErrABIPack, "coin metadata is invalid %s: %s", coinMetadata.Name, err.Error()) - } - - data := make([]byte, len(contracts.ERC20MinterBurnerDecimalsContract.Bin)+len(constructorArgs)) - copy(data[:len(contracts.ERC20MinterBurnerDecimalsContract.Bin)], contracts.ERC20MinterBurnerDecimalsContract.Bin) - copy(data[len(contracts.ERC20MinterBurnerDecimalsContract.Bin):], constructorArgs) - - return data, nil -} diff --git a/x/erc20/keeper/genesis.go b/x/erc20/keeper/genesis.go deleted file mode 100644 index f7d8480789..0000000000 --- a/x/erc20/keeper/genesis.go +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) -package keeper - -import ( - "fmt" - "math/big" - "strings" - - errorsmod "cosmossdk.io/errors" - sdk "github.com/cosmos/cosmos-sdk/types" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/ethereum/go-ethereum/common" - ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v16/ibc" - "github.com/evmos/evmos/v16/x/erc20/types" - "github.com/evmos/evmos/v16/x/evm/statedb" -) - -// SetGenesisTokenPairs stores in state the provided token pairs in genesis -// A genesis token pair is a token pair that will be registered from genesis. -// A current use case of this is e2e tests, -// where we may need to register a token pair to make it work. -// Currently, there's no other way to do this because the RegisterCoinProposal was deprecated. -func (k Keeper) SetGenesisTokenPairs(ctx sdk.Context, pairs []types.TokenPair) error { - if len(pairs) == 0 { - return nil - } - // We need to store the ERC20 contracts in the provided addresses at genesis. - // To do so, we'll need to seed the stateDB with those contracts. - // We cannot use EVM keeper functions for this because that will create a contract address - // dependent on the sender nonce. - stateDB := statedb.New(ctx, k.evmKeeper, statedb.TxConfig{}) - for _, pair := range pairs { - contractAddr := pair.GetERC20Contract() - coinMeta, err := k.getTokenPairMeta(ctx, pair) - if err != nil { - return fmt.Errorf("error while generating metadata for genesis pair denom %s. %w", pair.Denom, err) - } - code, err := k.generateContractCode(ctx, stateDB, coinMeta, contractAddr) - if err != nil { - return fmt.Errorf("error while getting contract code for genesis pair denom %s. %w", pair.Denom, err) - } - - // Store the ERC20 contract code in the address provided in genesis - stateDB.SetCode(contractAddr, code) - - id := pair.GetID() - k.SetTokenPair(ctx, pair) - k.SetDenomMap(ctx, pair.Denom, id) - k.SetERC20Map(ctx, contractAddr, id) - } - - // Commit the changes to effectively seed the state DB with - // the genesis token pairs ERC20 contracts - return stateDB.Commit() -} - -// getTokenPairMeta is a helper function to generate token pair metadata for the genesis token pairs -func (k Keeper) getTokenPairMeta(ctx sdk.Context, pair types.TokenPair) (banktypes.Metadata, error) { - // The corresponding IBC denom trace should be included in genesis - denomTrace, err := ibc.GetDenomTrace(*k.transferKeeper, ctx, pair.Denom) - if err != nil { - return banktypes.Metadata{}, err - } - - // validate base denom length - if len(denomTrace.BaseDenom) < 2 { - return banktypes.Metadata{}, fmt.Errorf("denom trace base denom is too short. Should be at least 2 characters long, got %q", denomTrace.BaseDenom) - } - - // check the denom prefix to define the corresponding exponent - exponent, err := ibc.DeriveDecimalsFromDenom(denomTrace.BaseDenom) - if err != nil { - return banktypes.Metadata{}, err - } - - meta := banktypes.Metadata{ - Description: fmt.Sprintf("%s IBC coin", denomTrace.BaseDenom), - DenomUnits: []*banktypes.DenomUnit{ - {Denom: pair.Denom, Exponent: 0, Aliases: []string{denomTrace.BaseDenom}}, - {Denom: denomTrace.BaseDenom[1:], Exponent: uint32(exponent)}, - }, - Base: pair.Denom, - Display: denomTrace.BaseDenom[1:], - Name: strings.ToUpper(string(denomTrace.BaseDenom[1])) + denomTrace.BaseDenom[2:], - Symbol: strings.ToUpper(denomTrace.BaseDenom[1:]), - } - - if err := k.verifyMetadata(ctx, meta); err != nil { - return banktypes.Metadata{}, errorsmod.Wrapf( - types.ErrInternalTokenPair, "coin metadata is invalid for genesis pair denom %s", pair.Denom, - ) - } - return meta, nil -} - -// generateContractCode is a helper function to generate -// the ERC20 contract code to be stored at genesis when token pairs are provided -func (k Keeper) generateContractCode(ctx sdk.Context, stateDB *statedb.StateDB, coinMeta banktypes.Metadata, contractAddr common.Address) ([]byte, error) { - evm := k.newEVM(ctx, stateDB) - data, err := getContractDataBz(coinMeta) - if err != nil { - return nil, err - } - // Initialize a new contract and set the code that is to be used by the EVM. - // The contract is a scoped environment for this execution context only. - sender := vm.AccountRef(types.ModuleAddress) - contract := vm.NewContract(sender, vm.AccountRef(contractAddr), big.NewInt(0), 1000000) - contract.Code = data - - // Run the contract's constructor function to get the contract code to - // be stored on chain - return evm.Interpreter().Run(contract, nil, false) -} - -// getEVMConfig is a helper function to get an EVM config -// needed to instantiate the EVM when token pairs are provided -// at genesis -func (k Keeper) getEVMConfig(ctx sdk.Context) *statedb.EVMConfig { - params := k.evmKeeper.GetParams(ctx) - ethCfg := params.ChainConfig.EthereumConfig(k.evmKeeper.ChainID()) - - baseFee := k.evmKeeper.GetBaseFee(ctx, ethCfg) - return &statedb.EVMConfig{ - Params: params, - ChainConfig: ethCfg, - CoinBase: common.Address{}, - BaseFee: baseFee, - } -} - -// newEVM is a helper function used during genesis -// to instantiate the EVM to set genesis state -func (k Keeper) newEVM(ctx sdk.Context, db *statedb.StateDB) *vm.EVM { - cfg := k.getEVMConfig(ctx) - - // dummy message needed to instantiate EVM - msg := ethtypes.NewMessage( - types.ModuleAddress, - nil, - 0, - big.NewInt(0), // amount - 0, // gasLimit - big.NewInt(0), // gasFeeCap - big.NewInt(0), // gasTipCap - big.NewInt(0), // gasPrice - nil, - ethtypes.AccessList{}, // AccessList - false, // isFake - ) - - return k.evmKeeper.NewEVM(ctx, msg, cfg, nil, db) -} diff --git a/x/erc20/keeper/genesis_test.go b/x/erc20/keeper/genesis_test.go deleted file mode 100644 index 96c284f8ab..0000000000 --- a/x/erc20/keeper/genesis_test.go +++ /dev/null @@ -1,175 +0,0 @@ -package keeper_test - -import ( - transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - "github.com/ethereum/go-ethereum/common" - - "github.com/evmos/evmos/v16/x/erc20/types" -) - -const ( - osmoERC20ContractAddr = "0x5dCA2483280D9727c80b5518faC4556617fb19ZZ" - junoERC20ContractAddr = "0x5db67696C3c088DfBf588d3dd849f44266ff0ffa" -) - -var ( - osmoDenomTrace = transfertypes.DenomTrace{ - BaseDenom: "uosmo", - Path: "transfer/channel-0", - } - junoDenomTrace = transfertypes.DenomTrace{ - BaseDenom: "ujuno", - Path: "transfer/channel-1", - } - invalidDenomTrace = transfertypes.DenomTrace{ - BaseDenom: "osmo", // missing the 'u' prefix - Path: "transfer/channel-0", - } - invalidDenomTrace2 = transfertypes.DenomTrace{ - BaseDenom: "u", // denom trace is too short - Path: "transfer/channel-0", - } -) - -func (suite *KeeperTestSuite) TestSetGenesisTokenPairs() { - testCases := []struct { - name string - pairs []types.TokenPair - malleate func() - expFail bool - expErrMsg string - }{ - { - "no-op: no token pairs", - []types.TokenPair{}, - nil, - false, - "", - }, - { - "fail: invalid denom", - []types.TokenPair{ - { - Erc20Address: osmoERC20ContractAddr, - Denom: "uosmo", - Enabled: true, - ContractOwner: types.OWNER_MODULE, - }, - }, - nil, - true, - "denom is not an IBC voucher", - }, - { - "fail: custom genesis - denom trace not in genesis", - []types.TokenPair{ - { - Erc20Address: osmoERC20ContractAddr, - Denom: osmoDenomTrace.IBCDenom(), - Enabled: true, - ContractOwner: types.OWNER_MODULE, - }, - }, - nil, - true, - "denom trace not found", - }, - { - "fail: custom genesis with invalid denom traces in genesis", - []types.TokenPair{ - { - Erc20Address: osmoERC20ContractAddr, - Denom: invalidDenomTrace.IBCDenom(), - Enabled: true, - ContractOwner: types.OWNER_MODULE, - }, - }, - func() { - suite.app.TransferKeeper.SetDenomTrace(suite.ctx, invalidDenomTrace) - }, - true, - "invalid base denomination", - }, - { - "fail: custom genesis with invalid denom traces in genesis - base denom too short", - []types.TokenPair{ - { - Erc20Address: osmoERC20ContractAddr, - Denom: invalidDenomTrace2.IBCDenom(), - Enabled: true, - ContractOwner: types.OWNER_MODULE, - }, - }, - func() { - suite.app.TransferKeeper.SetDenomTrace(suite.ctx, invalidDenomTrace2) - }, - true, - "denom trace base denom is too short", - }, - { - "success: custom genesis with denom traces in genesis", - []types.TokenPair{ - { - Erc20Address: junoERC20ContractAddr, - Denom: junoDenomTrace.IBCDenom(), - Enabled: true, - ContractOwner: types.OWNER_MODULE, - }, - { - Erc20Address: osmoERC20ContractAddr, - Denom: osmoDenomTrace.IBCDenom(), - Enabled: true, - ContractOwner: types.OWNER_MODULE, - }, - }, - func() { - suite.app.TransferKeeper.SetDenomTrace(suite.ctx, osmoDenomTrace) - suite.app.TransferKeeper.SetDenomTrace(suite.ctx, junoDenomTrace) - }, - false, - "", - }, - } - for _, tc := range testCases { - suite.SetupTest() // reset - if tc.malleate != nil { - tc.malleate() - } - err := suite.app.Erc20Keeper.SetGenesisTokenPairs(suite.ctx, tc.pairs) - - if !tc.expFail { - suite.Require().NoError(err) - tokenPairs := suite.app.Erc20Keeper.GetTokenPairs(suite.ctx) - suite.Require().Equal(tc.pairs, tokenPairs) - // check ERC20 contracts were created successfully - for _, p := range tc.pairs { - acc := suite.app.EvmKeeper.GetAccount(suite.ctx, common.HexToAddress(p.Erc20Address)) - suite.Require().True(acc.IsContract()) - // check bank metadata was stored properly - meta, found := suite.app.BankKeeper.GetDenomMetaData(suite.ctx, p.Denom) - suite.Require().True(found) - suite.Require().Len(meta.DenomUnits, 2) - - switch meta.Base { - case osmoDenomTrace.IBCDenom(): - suite.Require().Equal(meta.DenomUnits[0].Aliases, []string{"uosmo"}) - suite.Require().Equal(meta.DenomUnits[1].Denom, "osmo") - suite.Require().Equal(meta.DenomUnits[1].Exponent, uint32(6)) - suite.Require().Equal(meta.Display, "osmo") - suite.Require().Equal(meta.Name, "Osmo") - suite.Require().Equal(meta.Symbol, "OSMO") - case junoDenomTrace.IBCDenom(): - suite.Require().Equal(meta.DenomUnits[0].Aliases, []string{"ujuno"}) - suite.Require().Equal(meta.DenomUnits[1].Denom, "juno") - suite.Require().Equal(meta.DenomUnits[1].Exponent, uint32(6)) - suite.Require().Equal(meta.Display, "juno") - suite.Require().Equal(meta.Name, "Juno") - suite.Require().Equal(meta.Symbol, "JUNO") - } - } - } else { - suite.Require().Error(err) - suite.Require().Contains(err.Error(), tc.expErrMsg) - } - } -} diff --git a/x/erc20/types/interfaces.go b/x/erc20/types/interfaces.go index 6c7d2d7c50..159e3d6afa 100644 --- a/x/erc20/types/interfaces.go +++ b/x/erc20/types/interfaces.go @@ -5,7 +5,6 @@ package types import ( context "context" - "math/big" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" @@ -15,7 +14,6 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/vm" - gethparams "github.com/ethereum/go-ethereum/params" "github.com/evmos/evmos/v16/x/evm/statedb" evmtypes "github.com/evmos/evmos/v16/x/evm/types" @@ -42,24 +40,6 @@ type EVMKeeper interface { AddEVMExtensions(ctx sdk.Context, precompiles ...vm.PrecompiledContract) error DeleteAccount(ctx sdk.Context, addr common.Address) error IsAvailablePrecompile(addr common.Address) bool - - // Needed for genesis - NewEVM(ctx sdk.Context, msg core.Message, cfg *statedb.EVMConfig, tracer vm.EVMLogger, stateDB vm.StateDB) *vm.EVM - - // Read methods - GetAccount(ctx sdk.Context, addr common.Address) *statedb.Account - GetState(ctx sdk.Context, addr common.Address, key common.Hash) common.Hash - GetCode(ctx sdk.Context, codeHash common.Hash) []byte - // the callback returns false to break early - ForEachStorage(ctx sdk.Context, addr common.Address, cb func(key, value common.Hash) bool) - ChainID() *big.Int - GetBaseFee(ctx sdk.Context, ethCfg *gethparams.ChainConfig) *big.Int - EVMConfig(ctx sdk.Context, proposerAddress sdk.ConsAddress, chainID *big.Int) (*statedb.EVMConfig, error) - - // Write methods, only called by `StateDB.Commit()` - SetAccount(ctx sdk.Context, addr common.Address, account statedb.Account) error - SetState(ctx sdk.Context, addr common.Address, key common.Hash, value []byte) - SetCode(ctx sdk.Context, codeHash []byte, code []byte) } type ( diff --git a/x/erc20/types/mocks/EVMKeeper.go b/x/erc20/types/mocks/EVMKeeper.go index a4430dffe8..45c3193181 100644 --- a/x/erc20/types/mocks/EVMKeeper.go +++ b/x/erc20/types/mocks/EVMKeeper.go @@ -4,22 +4,19 @@ package mocks import ( context "context" - big "math/big" common "github.com/ethereum/go-ethereum/common" core "github.com/ethereum/go-ethereum/core" - cosmos_sdktypes "github.com/cosmos/cosmos-sdk/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" mock "github.com/stretchr/testify/mock" - params "github.com/ethereum/go-ethereum/params" - statedb "github.com/evmos/evmos/v16/x/evm/statedb" + types "github.com/cosmos/cosmos-sdk/types" + vm "github.com/ethereum/go-ethereum/core/vm" ) @@ -28,16 +25,8 @@ type EVMKeeper struct { mock.Mock } -type EVMKeeper_Expecter struct { - mock *mock.Mock -} - -func (_m *EVMKeeper) EXPECT() *EVMKeeper_Expecter { - return &EVMKeeper_Expecter{mock: &_m.Mock} -} - // AddEVMExtensions provides a mock function with given fields: ctx, precompiles -func (_m *EVMKeeper) AddEVMExtensions(ctx cosmos_sdktypes.Context, precompiles ...vm.PrecompiledContract) error { +func (_m *EVMKeeper) AddEVMExtensions(ctx types.Context, precompiles ...vm.PrecompiledContract) error { _va := make([]interface{}, len(precompiles)) for _i := range precompiles { _va[_i] = precompiles[_i] @@ -48,7 +37,7 @@ func (_m *EVMKeeper) AddEVMExtensions(ctx cosmos_sdktypes.Context, precompiles . ret := _m.Called(_ca...) var r0 error - if rf, ok := ret.Get(0).(func(cosmos_sdktypes.Context, ...vm.PrecompiledContract) error); ok { + if rf, ok := ret.Get(0).(func(types.Context, ...vm.PrecompiledContract) error); ok { r0 = rf(ctx, precompiles...) } else { r0 = ret.Error(0) @@ -57,52 +46,16 @@ func (_m *EVMKeeper) AddEVMExtensions(ctx cosmos_sdktypes.Context, precompiles . return r0 } -// MockEVMKeeper_AddEVMExtensions_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddEVMExtensions' -type MockEVMKeeper_AddEVMExtensions_Call struct { - *mock.Call -} - -// AddEVMExtensions is a helper method to define mock.On call -// - ctx cosmos_sdktypes.Context -// - precompiles ...vm.PrecompiledContract -func (_e *EVMKeeper_Expecter) AddEVMExtensions(ctx interface{}, precompiles ...interface{}) *MockEVMKeeper_AddEVMExtensions_Call { - return &MockEVMKeeper_AddEVMExtensions_Call{Call: _e.mock.On("AddEVMExtensions", - append([]interface{}{ctx}, precompiles...)...)} -} - -func (_c *MockEVMKeeper_AddEVMExtensions_Call) Run(run func(ctx cosmos_sdktypes.Context, precompiles ...vm.PrecompiledContract)) *MockEVMKeeper_AddEVMExtensions_Call { - _c.Call.Run(func(args mock.Arguments) { - variadicArgs := make([]vm.PrecompiledContract, len(args)-1) - for i, a := range args[1:] { - if a != nil { - variadicArgs[i] = a.(vm.PrecompiledContract) - } - } - run(args[0].(cosmos_sdktypes.Context), variadicArgs...) - }) - return _c -} - -func (_c *MockEVMKeeper_AddEVMExtensions_Call) Return(_a0 error) *MockEVMKeeper_AddEVMExtensions_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockEVMKeeper_AddEVMExtensions_Call) RunAndReturn(run func(cosmos_sdktypes.Context, ...vm.PrecompiledContract) error) *MockEVMKeeper_AddEVMExtensions_Call { - _c.Call.Return(run) - return _c -} - // ApplyMessage provides a mock function with given fields: ctx, msg, tracer, commit -func (_m *EVMKeeper) ApplyMessage(ctx cosmos_sdktypes.Context, msg core.Message, tracer vm.EVMLogger, commit bool) (*evmtypes.MsgEthereumTxResponse, error) { +func (_m *EVMKeeper) ApplyMessage(ctx types.Context, msg core.Message, tracer vm.EVMLogger, commit bool) (*evmtypes.MsgEthereumTxResponse, error) { ret := _m.Called(ctx, msg, tracer, commit) var r0 *evmtypes.MsgEthereumTxResponse var r1 error - if rf, ok := ret.Get(0).(func(cosmos_sdktypes.Context, core.Message, vm.EVMLogger, bool) (*evmtypes.MsgEthereumTxResponse, error)); ok { + if rf, ok := ret.Get(0).(func(types.Context, core.Message, vm.EVMLogger, bool) (*evmtypes.MsgEthereumTxResponse, error)); ok { return rf(ctx, msg, tracer, commit) } - if rf, ok := ret.Get(0).(func(cosmos_sdktypes.Context, core.Message, vm.EVMLogger, bool) *evmtypes.MsgEthereumTxResponse); ok { + if rf, ok := ret.Get(0).(func(types.Context, core.Message, vm.EVMLogger, bool) *evmtypes.MsgEthereumTxResponse); ok { r0 = rf(ctx, msg, tracer, commit) } else { if ret.Get(0) != nil { @@ -110,7 +63,7 @@ func (_m *EVMKeeper) ApplyMessage(ctx cosmos_sdktypes.Context, msg core.Message, } } - if rf, ok := ret.Get(1).(func(cosmos_sdktypes.Context, core.Message, vm.EVMLogger, bool) error); ok { + if rf, ok := ret.Get(1).(func(types.Context, core.Message, vm.EVMLogger, bool) error); ok { r1 = rf(ctx, msg, tracer, commit) } else { r1 = ret.Error(1) @@ -119,86 +72,12 @@ func (_m *EVMKeeper) ApplyMessage(ctx cosmos_sdktypes.Context, msg core.Message, return r0, r1 } -// MockEVMKeeper_ApplyMessage_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ApplyMessage' -type MockEVMKeeper_ApplyMessage_Call struct { - *mock.Call -} - -// ApplyMessage is a helper method to define mock.On call -// - ctx cosmos_sdktypes.Context -// - msg core.Message -// - tracer vm.EVMLogger -// - commit bool -func (_e *EVMKeeper_Expecter) ApplyMessage(ctx interface{}, msg interface{}, tracer interface{}, commit interface{}) *MockEVMKeeper_ApplyMessage_Call { - return &MockEVMKeeper_ApplyMessage_Call{Call: _e.mock.On("ApplyMessage", ctx, msg, tracer, commit)} -} - -func (_c *MockEVMKeeper_ApplyMessage_Call) Run(run func(ctx cosmos_sdktypes.Context, msg core.Message, tracer vm.EVMLogger, commit bool)) *MockEVMKeeper_ApplyMessage_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(cosmos_sdktypes.Context), args[1].(core.Message), args[2].(vm.EVMLogger), args[3].(bool)) - }) - return _c -} - -func (_c *MockEVMKeeper_ApplyMessage_Call) Return(_a0 *evmtypes.MsgEthereumTxResponse, _a1 error) *MockEVMKeeper_ApplyMessage_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *MockEVMKeeper_ApplyMessage_Call) RunAndReturn(run func(cosmos_sdktypes.Context, core.Message, vm.EVMLogger, bool) (*evmtypes.MsgEthereumTxResponse, error)) *MockEVMKeeper_ApplyMessage_Call { - _c.Call.Return(run) - return _c -} - -// ChainID provides a mock function with given fields: -func (_m *EVMKeeper) ChainID() *big.Int { - ret := _m.Called() - - var r0 *big.Int - if rf, ok := ret.Get(0).(func() *big.Int); ok { - r0 = rf() - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*big.Int) - } - } - - return r0 -} - -// MockEVMKeeper_ChainID_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ChainID' -type MockEVMKeeper_ChainID_Call struct { - *mock.Call -} - -// ChainID is a helper method to define mock.On call -func (_e *EVMKeeper_Expecter) ChainID() *MockEVMKeeper_ChainID_Call { - return &MockEVMKeeper_ChainID_Call{Call: _e.mock.On("ChainID")} -} - -func (_c *MockEVMKeeper_ChainID_Call) Run(run func()) *MockEVMKeeper_ChainID_Call { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *MockEVMKeeper_ChainID_Call) Return(_a0 *big.Int) *MockEVMKeeper_ChainID_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockEVMKeeper_ChainID_Call) RunAndReturn(run func() *big.Int) *MockEVMKeeper_ChainID_Call { - _c.Call.Return(run) - return _c -} - // DeleteAccount provides a mock function with given fields: ctx, addr -func (_m *EVMKeeper) DeleteAccount(ctx cosmos_sdktypes.Context, addr common.Address) error { +func (_m *EVMKeeper) DeleteAccount(ctx types.Context, addr common.Address) error { ret := _m.Called(ctx, addr) var r0 error - if rf, ok := ret.Get(0).(func(cosmos_sdktypes.Context, common.Address) error); ok { + if rf, ok := ret.Get(0).(func(types.Context, common.Address) error); ok { r0 = rf(ctx, addr) } else { r0 = ret.Error(0) @@ -207,91 +86,6 @@ func (_m *EVMKeeper) DeleteAccount(ctx cosmos_sdktypes.Context, addr common.Addr return r0 } -// MockEVMKeeper_DeleteAccount_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeleteAccount' -type MockEVMKeeper_DeleteAccount_Call struct { - *mock.Call -} - -// DeleteAccount is a helper method to define mock.On call -// - ctx cosmos_sdktypes.Context -// - addr common.Address -func (_e *EVMKeeper_Expecter) DeleteAccount(ctx interface{}, addr interface{}) *MockEVMKeeper_DeleteAccount_Call { - return &MockEVMKeeper_DeleteAccount_Call{Call: _e.mock.On("DeleteAccount", ctx, addr)} -} - -func (_c *MockEVMKeeper_DeleteAccount_Call) Run(run func(ctx cosmos_sdktypes.Context, addr common.Address)) *MockEVMKeeper_DeleteAccount_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(cosmos_sdktypes.Context), args[1].(common.Address)) - }) - return _c -} - -func (_c *MockEVMKeeper_DeleteAccount_Call) Return(_a0 error) *MockEVMKeeper_DeleteAccount_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockEVMKeeper_DeleteAccount_Call) RunAndReturn(run func(cosmos_sdktypes.Context, common.Address) error) *MockEVMKeeper_DeleteAccount_Call { - _c.Call.Return(run) - return _c -} - -// EVMConfig provides a mock function with given fields: ctx, proposerAddress, chainID -func (_m *EVMKeeper) EVMConfig(ctx cosmos_sdktypes.Context, proposerAddress cosmos_sdktypes.ConsAddress, chainID *big.Int) (*statedb.EVMConfig, error) { - ret := _m.Called(ctx, proposerAddress, chainID) - - var r0 *statedb.EVMConfig - var r1 error - if rf, ok := ret.Get(0).(func(cosmos_sdktypes.Context, cosmos_sdktypes.ConsAddress, *big.Int) (*statedb.EVMConfig, error)); ok { - return rf(ctx, proposerAddress, chainID) - } - if rf, ok := ret.Get(0).(func(cosmos_sdktypes.Context, cosmos_sdktypes.ConsAddress, *big.Int) *statedb.EVMConfig); ok { - r0 = rf(ctx, proposerAddress, chainID) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*statedb.EVMConfig) - } - } - - if rf, ok := ret.Get(1).(func(cosmos_sdktypes.Context, cosmos_sdktypes.ConsAddress, *big.Int) error); ok { - r1 = rf(ctx, proposerAddress, chainID) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// MockEVMKeeper_EVMConfig_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'EVMConfig' -type MockEVMKeeper_EVMConfig_Call struct { - *mock.Call -} - -// EVMConfig is a helper method to define mock.On call -// - ctx cosmos_sdktypes.Context -// - proposerAddress cosmos_sdktypes.ConsAddress -// - chainID *big.Int -func (_e *EVMKeeper_Expecter) EVMConfig(ctx interface{}, proposerAddress interface{}, chainID interface{}) *MockEVMKeeper_EVMConfig_Call { - return &MockEVMKeeper_EVMConfig_Call{Call: _e.mock.On("EVMConfig", ctx, proposerAddress, chainID)} -} - -func (_c *MockEVMKeeper_EVMConfig_Call) Run(run func(ctx cosmos_sdktypes.Context, proposerAddress cosmos_sdktypes.ConsAddress, chainID *big.Int)) *MockEVMKeeper_EVMConfig_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(cosmos_sdktypes.Context), args[1].(cosmos_sdktypes.ConsAddress), args[2].(*big.Int)) - }) - return _c -} - -func (_c *MockEVMKeeper_EVMConfig_Call) Return(_a0 *statedb.EVMConfig, _a1 error) *MockEVMKeeper_EVMConfig_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *MockEVMKeeper_EVMConfig_Call) RunAndReturn(run func(cosmos_sdktypes.Context, cosmos_sdktypes.ConsAddress, *big.Int) (*statedb.EVMConfig, error)) *MockEVMKeeper_EVMConfig_Call { - _c.Call.Return(run) - return _c -} - // EstimateGasInternal provides a mock function with given fields: c, req, fromType func (_m *EVMKeeper) EstimateGasInternal(c context.Context, req *evmtypes.EthCallRequest, fromType evmtypes.CallType) (*evmtypes.EstimateGasResponse, error) { ret := _m.Called(c, req, fromType) @@ -318,122 +112,12 @@ func (_m *EVMKeeper) EstimateGasInternal(c context.Context, req *evmtypes.EthCal return r0, r1 } -// MockEVMKeeper_EstimateGasInternal_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'EstimateGasInternal' -type MockEVMKeeper_EstimateGasInternal_Call struct { - *mock.Call -} - -// EstimateGasInternal is a helper method to define mock.On call -// - c context.Context -// - req *evmtypes.EthCallRequest -// - fromType evmtypes.CallType -func (_e *EVMKeeper_Expecter) EstimateGasInternal(c interface{}, req interface{}, fromType interface{}) *MockEVMKeeper_EstimateGasInternal_Call { - return &MockEVMKeeper_EstimateGasInternal_Call{Call: _e.mock.On("EstimateGasInternal", c, req, fromType)} -} - -func (_c *MockEVMKeeper_EstimateGasInternal_Call) Run(run func(c context.Context, req *evmtypes.EthCallRequest, fromType evmtypes.CallType)) *MockEVMKeeper_EstimateGasInternal_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*evmtypes.EthCallRequest), args[2].(evmtypes.CallType)) - }) - return _c -} - -func (_c *MockEVMKeeper_EstimateGasInternal_Call) Return(_a0 *evmtypes.EstimateGasResponse, _a1 error) *MockEVMKeeper_EstimateGasInternal_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *MockEVMKeeper_EstimateGasInternal_Call) RunAndReturn(run func(context.Context, *evmtypes.EthCallRequest, evmtypes.CallType) (*evmtypes.EstimateGasResponse, error)) *MockEVMKeeper_EstimateGasInternal_Call { - _c.Call.Return(run) - return _c -} - -// ForEachStorage provides a mock function with given fields: ctx, addr, cb -func (_m *EVMKeeper) ForEachStorage(ctx cosmos_sdktypes.Context, addr common.Address, cb func(common.Hash, common.Hash) bool) { - _m.Called(ctx, addr, cb) -} - -// MockEVMKeeper_ForEachStorage_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ForEachStorage' -type MockEVMKeeper_ForEachStorage_Call struct { - *mock.Call -} - -// ForEachStorage is a helper method to define mock.On call -// - ctx cosmos_sdktypes.Context -// - addr common.Address -// - cb func(common.Hash , common.Hash) bool -func (_e *EVMKeeper_Expecter) ForEachStorage(ctx interface{}, addr interface{}, cb interface{}) *MockEVMKeeper_ForEachStorage_Call { - return &MockEVMKeeper_ForEachStorage_Call{Call: _e.mock.On("ForEachStorage", ctx, addr, cb)} -} - -func (_c *MockEVMKeeper_ForEachStorage_Call) Run(run func(ctx cosmos_sdktypes.Context, addr common.Address, cb func(common.Hash, common.Hash) bool)) *MockEVMKeeper_ForEachStorage_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(cosmos_sdktypes.Context), args[1].(common.Address), args[2].(func(common.Hash, common.Hash) bool)) - }) - return _c -} - -func (_c *MockEVMKeeper_ForEachStorage_Call) Return() *MockEVMKeeper_ForEachStorage_Call { - _c.Call.Return() - return _c -} - -func (_c *MockEVMKeeper_ForEachStorage_Call) RunAndReturn(run func(cosmos_sdktypes.Context, common.Address, func(common.Hash, common.Hash) bool)) *MockEVMKeeper_ForEachStorage_Call { - _c.Call.Return(run) - return _c -} - -// GetAccount provides a mock function with given fields: ctx, addr -func (_m *EVMKeeper) GetAccount(ctx cosmos_sdktypes.Context, addr common.Address) *statedb.Account { - ret := _m.Called(ctx, addr) - - var r0 *statedb.Account - if rf, ok := ret.Get(0).(func(cosmos_sdktypes.Context, common.Address) *statedb.Account); ok { - r0 = rf(ctx, addr) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*statedb.Account) - } - } - - return r0 -} - -// MockEVMKeeper_GetAccount_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetAccount' -type MockEVMKeeper_GetAccount_Call struct { - *mock.Call -} - -// GetAccount is a helper method to define mock.On call -// - ctx cosmos_sdktypes.Context -// - addr common.Address -func (_e *EVMKeeper_Expecter) GetAccount(ctx interface{}, addr interface{}) *MockEVMKeeper_GetAccount_Call { - return &MockEVMKeeper_GetAccount_Call{Call: _e.mock.On("GetAccount", ctx, addr)} -} - -func (_c *MockEVMKeeper_GetAccount_Call) Run(run func(ctx cosmos_sdktypes.Context, addr common.Address)) *MockEVMKeeper_GetAccount_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(cosmos_sdktypes.Context), args[1].(common.Address)) - }) - return _c -} - -func (_c *MockEVMKeeper_GetAccount_Call) Return(_a0 *statedb.Account) *MockEVMKeeper_GetAccount_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockEVMKeeper_GetAccount_Call) RunAndReturn(run func(cosmos_sdktypes.Context, common.Address) *statedb.Account) *MockEVMKeeper_GetAccount_Call { - _c.Call.Return(run) - return _c -} - // GetAccountWithoutBalance provides a mock function with given fields: ctx, addr -func (_m *EVMKeeper) GetAccountWithoutBalance(ctx cosmos_sdktypes.Context, addr common.Address) *statedb.Account { +func (_m *EVMKeeper) GetAccountWithoutBalance(ctx types.Context, addr common.Address) *statedb.Account { ret := _m.Called(ctx, addr) var r0 *statedb.Account - if rf, ok := ret.Get(0).(func(cosmos_sdktypes.Context, common.Address) *statedb.Account); ok { + if rf, ok := ret.Get(0).(func(types.Context, common.Address) *statedb.Account); ok { r0 = rf(ctx, addr) } else { if ret.Get(0) != nil { @@ -444,131 +128,12 @@ func (_m *EVMKeeper) GetAccountWithoutBalance(ctx cosmos_sdktypes.Context, addr return r0 } -// MockEVMKeeper_GetAccountWithoutBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetAccountWithoutBalance' -type MockEVMKeeper_GetAccountWithoutBalance_Call struct { - *mock.Call -} - -// GetAccountWithoutBalance is a helper method to define mock.On call -// - ctx cosmos_sdktypes.Context -// - addr common.Address -func (_e *EVMKeeper_Expecter) GetAccountWithoutBalance(ctx interface{}, addr interface{}) *MockEVMKeeper_GetAccountWithoutBalance_Call { - return &MockEVMKeeper_GetAccountWithoutBalance_Call{Call: _e.mock.On("GetAccountWithoutBalance", ctx, addr)} -} - -func (_c *MockEVMKeeper_GetAccountWithoutBalance_Call) Run(run func(ctx cosmos_sdktypes.Context, addr common.Address)) *MockEVMKeeper_GetAccountWithoutBalance_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(cosmos_sdktypes.Context), args[1].(common.Address)) - }) - return _c -} - -func (_c *MockEVMKeeper_GetAccountWithoutBalance_Call) Return(_a0 *statedb.Account) *MockEVMKeeper_GetAccountWithoutBalance_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockEVMKeeper_GetAccountWithoutBalance_Call) RunAndReturn(run func(cosmos_sdktypes.Context, common.Address) *statedb.Account) *MockEVMKeeper_GetAccountWithoutBalance_Call { - _c.Call.Return(run) - return _c -} - -// GetBaseFee provides a mock function with given fields: ctx, ethCfg -func (_m *EVMKeeper) GetBaseFee(ctx cosmos_sdktypes.Context, ethCfg *params.ChainConfig) *big.Int { - ret := _m.Called(ctx, ethCfg) - - var r0 *big.Int - if rf, ok := ret.Get(0).(func(cosmos_sdktypes.Context, *params.ChainConfig) *big.Int); ok { - r0 = rf(ctx, ethCfg) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*big.Int) - } - } - - return r0 -} - -// MockEVMKeeper_GetBaseFee_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetBaseFee' -type MockEVMKeeper_GetBaseFee_Call struct { - *mock.Call -} - -// GetBaseFee is a helper method to define mock.On call -// - ctx cosmos_sdktypes.Context -// - ethCfg *params.ChainConfig -func (_e *EVMKeeper_Expecter) GetBaseFee(ctx interface{}, ethCfg interface{}) *MockEVMKeeper_GetBaseFee_Call { - return &MockEVMKeeper_GetBaseFee_Call{Call: _e.mock.On("GetBaseFee", ctx, ethCfg)} -} - -func (_c *MockEVMKeeper_GetBaseFee_Call) Run(run func(ctx cosmos_sdktypes.Context, ethCfg *params.ChainConfig)) *MockEVMKeeper_GetBaseFee_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(cosmos_sdktypes.Context), args[1].(*params.ChainConfig)) - }) - return _c -} - -func (_c *MockEVMKeeper_GetBaseFee_Call) Return(_a0 *big.Int) *MockEVMKeeper_GetBaseFee_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockEVMKeeper_GetBaseFee_Call) RunAndReturn(run func(cosmos_sdktypes.Context, *params.ChainConfig) *big.Int) *MockEVMKeeper_GetBaseFee_Call { - _c.Call.Return(run) - return _c -} - -// GetCode provides a mock function with given fields: ctx, codeHash -func (_m *EVMKeeper) GetCode(ctx cosmos_sdktypes.Context, codeHash common.Hash) []byte { - ret := _m.Called(ctx, codeHash) - - var r0 []byte - if rf, ok := ret.Get(0).(func(cosmos_sdktypes.Context, common.Hash) []byte); ok { - r0 = rf(ctx, codeHash) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).([]byte) - } - } - - return r0 -} - -// MockEVMKeeper_GetCode_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCode' -type MockEVMKeeper_GetCode_Call struct { - *mock.Call -} - -// GetCode is a helper method to define mock.On call -// - ctx cosmos_sdktypes.Context -// - codeHash common.Hash -func (_e *EVMKeeper_Expecter) GetCode(ctx interface{}, codeHash interface{}) *MockEVMKeeper_GetCode_Call { - return &MockEVMKeeper_GetCode_Call{Call: _e.mock.On("GetCode", ctx, codeHash)} -} - -func (_c *MockEVMKeeper_GetCode_Call) Run(run func(ctx cosmos_sdktypes.Context, codeHash common.Hash)) *MockEVMKeeper_GetCode_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(cosmos_sdktypes.Context), args[1].(common.Hash)) - }) - return _c -} - -func (_c *MockEVMKeeper_GetCode_Call) Return(_a0 []byte) *MockEVMKeeper_GetCode_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockEVMKeeper_GetCode_Call) RunAndReturn(run func(cosmos_sdktypes.Context, common.Hash) []byte) *MockEVMKeeper_GetCode_Call { - _c.Call.Return(run) - return _c -} - // GetParams provides a mock function with given fields: ctx -func (_m *EVMKeeper) GetParams(ctx cosmos_sdktypes.Context) evmtypes.Params { +func (_m *EVMKeeper) GetParams(ctx types.Context) evmtypes.Params { ret := _m.Called(ctx) var r0 evmtypes.Params - if rf, ok := ret.Get(0).(func(cosmos_sdktypes.Context) evmtypes.Params); ok { + if rf, ok := ret.Get(0).(func(types.Context) evmtypes.Params); ok { r0 = rf(ctx) } else { r0 = ret.Get(0).(evmtypes.Params) @@ -577,80 +142,6 @@ func (_m *EVMKeeper) GetParams(ctx cosmos_sdktypes.Context) evmtypes.Params { return r0 } -// MockEVMKeeper_GetParams_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetParams' -type MockEVMKeeper_GetParams_Call struct { - *mock.Call -} - -// GetParams is a helper method to define mock.On call -// - ctx cosmos_sdktypes.Context -func (_e *EVMKeeper_Expecter) GetParams(ctx interface{}) *MockEVMKeeper_GetParams_Call { - return &MockEVMKeeper_GetParams_Call{Call: _e.mock.On("GetParams", ctx)} -} - -func (_c *MockEVMKeeper_GetParams_Call) Run(run func(ctx cosmos_sdktypes.Context)) *MockEVMKeeper_GetParams_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(cosmos_sdktypes.Context)) - }) - return _c -} - -func (_c *MockEVMKeeper_GetParams_Call) Return(_a0 evmtypes.Params) *MockEVMKeeper_GetParams_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockEVMKeeper_GetParams_Call) RunAndReturn(run func(cosmos_sdktypes.Context) evmtypes.Params) *MockEVMKeeper_GetParams_Call { - _c.Call.Return(run) - return _c -} - -// GetState provides a mock function with given fields: ctx, addr, key -func (_m *EVMKeeper) GetState(ctx cosmos_sdktypes.Context, addr common.Address, key common.Hash) common.Hash { - ret := _m.Called(ctx, addr, key) - - var r0 common.Hash - if rf, ok := ret.Get(0).(func(cosmos_sdktypes.Context, common.Address, common.Hash) common.Hash); ok { - r0 = rf(ctx, addr, key) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(common.Hash) - } - } - - return r0 -} - -// MockEVMKeeper_GetState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetState' -type MockEVMKeeper_GetState_Call struct { - *mock.Call -} - -// GetState is a helper method to define mock.On call -// - ctx cosmos_sdktypes.Context -// - addr common.Address -// - key common.Hash -func (_e *EVMKeeper_Expecter) GetState(ctx interface{}, addr interface{}, key interface{}) *MockEVMKeeper_GetState_Call { - return &MockEVMKeeper_GetState_Call{Call: _e.mock.On("GetState", ctx, addr, key)} -} - -func (_c *MockEVMKeeper_GetState_Call) Run(run func(ctx cosmos_sdktypes.Context, addr common.Address, key common.Hash)) *MockEVMKeeper_GetState_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(cosmos_sdktypes.Context), args[1].(common.Address), args[2].(common.Hash)) - }) - return _c -} - -func (_c *MockEVMKeeper_GetState_Call) Return(_a0 common.Hash) *MockEVMKeeper_GetState_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockEVMKeeper_GetState_Call) RunAndReturn(run func(cosmos_sdktypes.Context, common.Address, common.Hash) common.Hash) *MockEVMKeeper_GetState_Call { - _c.Call.Return(run) - return _c -} - // IsAvailablePrecompile provides a mock function with given fields: addr func (_m *EVMKeeper) IsAvailablePrecompile(addr common.Address) bool { ret := _m.Called(addr) @@ -665,200 +156,9 @@ func (_m *EVMKeeper) IsAvailablePrecompile(addr common.Address) bool { return r0 } -// MockEVMKeeper_IsAvailablePrecompile_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'IsAvailablePrecompile' -type MockEVMKeeper_IsAvailablePrecompile_Call struct { - *mock.Call -} - -// IsAvailablePrecompile is a helper method to define mock.On call -// - addr common.Address -func (_e *EVMKeeper_Expecter) IsAvailablePrecompile(addr interface{}) *MockEVMKeeper_IsAvailablePrecompile_Call { - return &MockEVMKeeper_IsAvailablePrecompile_Call{Call: _e.mock.On("IsAvailablePrecompile", addr)} -} - -func (_c *MockEVMKeeper_IsAvailablePrecompile_Call) Run(run func(addr common.Address)) *MockEVMKeeper_IsAvailablePrecompile_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(common.Address)) - }) - return _c -} - -func (_c *MockEVMKeeper_IsAvailablePrecompile_Call) Return(_a0 bool) *MockEVMKeeper_IsAvailablePrecompile_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockEVMKeeper_IsAvailablePrecompile_Call) RunAndReturn(run func(common.Address) bool) *MockEVMKeeper_IsAvailablePrecompile_Call { - _c.Call.Return(run) - return _c -} - -// NewEVM provides a mock function with given fields: ctx, msg, cfg, tracer, stateDB -func (_m *EVMKeeper) NewEVM(ctx cosmos_sdktypes.Context, msg core.Message, cfg *statedb.EVMConfig, tracer vm.EVMLogger, stateDB vm.StateDB) *vm.EVM { - ret := _m.Called(ctx, msg, cfg, tracer, stateDB) - - var r0 *vm.EVM - if rf, ok := ret.Get(0).(func(cosmos_sdktypes.Context, core.Message, *statedb.EVMConfig, vm.EVMLogger, vm.StateDB) *vm.EVM); ok { - r0 = rf(ctx, msg, cfg, tracer, stateDB) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*vm.EVM) - } - } - - return r0 -} - -// MockEVMKeeper_NewEVM_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NewEVM' -type MockEVMKeeper_NewEVM_Call struct { - *mock.Call -} - -// NewEVM is a helper method to define mock.On call -// - ctx cosmos_sdktypes.Context -// - msg core.Message -// - cfg *statedb.EVMConfig -// - tracer vm.EVMLogger -// - stateDB vm.StateDB -func (_e *EVMKeeper_Expecter) NewEVM(ctx interface{}, msg interface{}, cfg interface{}, tracer interface{}, stateDB interface{}) *MockEVMKeeper_NewEVM_Call { - return &MockEVMKeeper_NewEVM_Call{Call: _e.mock.On("NewEVM", ctx, msg, cfg, tracer, stateDB)} -} - -func (_c *MockEVMKeeper_NewEVM_Call) Run(run func(ctx cosmos_sdktypes.Context, msg core.Message, cfg *statedb.EVMConfig, tracer vm.EVMLogger, stateDB vm.StateDB)) *MockEVMKeeper_NewEVM_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(cosmos_sdktypes.Context), args[1].(core.Message), args[2].(*statedb.EVMConfig), args[3].(vm.EVMLogger), args[4].(vm.StateDB)) - }) - return _c -} - -func (_c *MockEVMKeeper_NewEVM_Call) Return(_a0 *vm.EVM) *MockEVMKeeper_NewEVM_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockEVMKeeper_NewEVM_Call) RunAndReturn(run func(cosmos_sdktypes.Context, core.Message, *statedb.EVMConfig, vm.EVMLogger, vm.StateDB) *vm.EVM) *MockEVMKeeper_NewEVM_Call { - _c.Call.Return(run) - return _c -} - -// SetAccount provides a mock function with given fields: ctx, addr, account -func (_m *EVMKeeper) SetAccount(ctx cosmos_sdktypes.Context, addr common.Address, account statedb.Account) error { - ret := _m.Called(ctx, addr, account) - - var r0 error - if rf, ok := ret.Get(0).(func(cosmos_sdktypes.Context, common.Address, statedb.Account) error); ok { - r0 = rf(ctx, addr, account) - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// MockEVMKeeper_SetAccount_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetAccount' -type MockEVMKeeper_SetAccount_Call struct { - *mock.Call -} - -// SetAccount is a helper method to define mock.On call -// - ctx cosmos_sdktypes.Context -// - addr common.Address -// - account statedb.Account -func (_e *EVMKeeper_Expecter) SetAccount(ctx interface{}, addr interface{}, account interface{}) *MockEVMKeeper_SetAccount_Call { - return &MockEVMKeeper_SetAccount_Call{Call: _e.mock.On("SetAccount", ctx, addr, account)} -} - -func (_c *MockEVMKeeper_SetAccount_Call) Run(run func(ctx cosmos_sdktypes.Context, addr common.Address, account statedb.Account)) *MockEVMKeeper_SetAccount_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(cosmos_sdktypes.Context), args[1].(common.Address), args[2].(statedb.Account)) - }) - return _c -} - -func (_c *MockEVMKeeper_SetAccount_Call) Return(_a0 error) *MockEVMKeeper_SetAccount_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockEVMKeeper_SetAccount_Call) RunAndReturn(run func(cosmos_sdktypes.Context, common.Address, statedb.Account) error) *MockEVMKeeper_SetAccount_Call { - _c.Call.Return(run) - return _c -} - -// SetCode provides a mock function with given fields: ctx, codeHash, code -func (_m *EVMKeeper) SetCode(ctx cosmos_sdktypes.Context, codeHash []byte, code []byte) { - _m.Called(ctx, codeHash, code) -} - -// MockEVMKeeper_SetCode_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetCode' -type MockEVMKeeper_SetCode_Call struct { - *mock.Call -} - -// SetCode is a helper method to define mock.On call -// - ctx cosmos_sdktypes.Context -// - codeHash []byte -// - code []byte -func (_e *EVMKeeper_Expecter) SetCode(ctx interface{}, codeHash interface{}, code interface{}) *MockEVMKeeper_SetCode_Call { - return &MockEVMKeeper_SetCode_Call{Call: _e.mock.On("SetCode", ctx, codeHash, code)} -} - -func (_c *MockEVMKeeper_SetCode_Call) Run(run func(ctx cosmos_sdktypes.Context, codeHash []byte, code []byte)) *MockEVMKeeper_SetCode_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(cosmos_sdktypes.Context), args[1].([]byte), args[2].([]byte)) - }) - return _c -} - -func (_c *MockEVMKeeper_SetCode_Call) Return() *MockEVMKeeper_SetCode_Call { - _c.Call.Return() - return _c -} - -func (_c *MockEVMKeeper_SetCode_Call) RunAndReturn(run func(cosmos_sdktypes.Context, []byte, []byte)) *MockEVMKeeper_SetCode_Call { - _c.Call.Return(run) - return _c -} - -// SetState provides a mock function with given fields: ctx, addr, key, value -func (_m *EVMKeeper) SetState(ctx cosmos_sdktypes.Context, addr common.Address, key common.Hash, value []byte) { - _m.Called(ctx, addr, key, value) -} - -// MockEVMKeeper_SetState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetState' -type MockEVMKeeper_SetState_Call struct { - *mock.Call -} - -// SetState is a helper method to define mock.On call -// - ctx cosmos_sdktypes.Context -// - addr common.Address -// - key common.Hash -// - value []byte -func (_e *EVMKeeper_Expecter) SetState(ctx interface{}, addr interface{}, key interface{}, value interface{}) *MockEVMKeeper_SetState_Call { - return &MockEVMKeeper_SetState_Call{Call: _e.mock.On("SetState", ctx, addr, key, value)} -} - -func (_c *MockEVMKeeper_SetState_Call) Run(run func(ctx cosmos_sdktypes.Context, addr common.Address, key common.Hash, value []byte)) *MockEVMKeeper_SetState_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(cosmos_sdktypes.Context), args[1].(common.Address), args[2].(common.Hash), args[3].([]byte)) - }) - return _c -} - -func (_c *MockEVMKeeper_SetState_Call) Return() *MockEVMKeeper_SetState_Call { - _c.Call.Return() - return _c -} - -func (_c *MockEVMKeeper_SetState_Call) RunAndReturn(run func(cosmos_sdktypes.Context, common.Address, common.Hash, []byte)) *MockEVMKeeper_SetState_Call { - _c.Call.Return(run) - return _c -} - -// NewMockEVMKeeper creates a new instance of MockEVMKeeper. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// NewEVMKeeper creates a new instance of EVMKeeper. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. // The first argument is typically a *testing.T value. -func NewMockEVMKeeper(t interface { +func NewEVMKeeper(t interface { mock.TestingT Cleanup(func()) }, From b61b9da8f54738eac44d9c362e957b503b821a3b Mon Sep 17 00:00:00 2001 From: Freddy Caceres Date: Sat, 27 Jan 2024 04:02:56 -0500 Subject: [PATCH 095/345] imp(test): Add custom genesis config functionality to integration setup (#2296) * first working version * remove unnecessary genesisState * update changelog * fix changelog --------- Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- CHANGELOG.md | 1 + testutil/integration/evmos/network/config.go | 15 +- testutil/integration/evmos/network/network.go | 31 ++-- testutil/integration/evmos/network/setup.go | 136 ++++++++++++++++-- 4 files changed, 156 insertions(+), 27 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 63772d7762..f2dc0e1a84 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -164,6 +164,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (ci) [#2268](https://github.com/evmos/evmos/pull/2268) Fix and update the Pull Request Labeler workflow. - (tests) [#2280](https://github.com/evmos/evmos/pull/2280) Enable specifying the prefunded balances for the integration test setup. - (tests) [#2289](https://github.com/evmos/evmos/pull/2289) Add utility to check balances during tests. +- (tests) [#2296](https://github.com/evmos/evmos/pull/2296) Add custom genesis config functionality to integration setup. ### Bug Fixes diff --git a/testutil/integration/evmos/network/config.go b/testutil/integration/evmos/network/config.go index 4344fdae8e..9c7101e08d 100644 --- a/testutil/integration/evmos/network/config.go +++ b/testutil/integration/evmos/network/config.go @@ -24,8 +24,11 @@ type Config struct { preFundedAccounts []sdktypes.AccAddress balances []banktypes.Balance denom string + customGenesisState CustomGenesisState } +type CustomGenesisState map[string]interface{} + // DefaultConfig returns the default configuration for a chain. func DefaultConfig() Config { account, _ := testtx.NewAccAddressAndKey() @@ -36,8 +39,9 @@ func DefaultConfig() Config { // No funded accounts besides the validators by default preFundedAccounts: []sdktypes.AccAddress{account}, // NOTE: Per default, the balances are left empty, and the pre-funded accounts are used. - balances: nil, - denom: utils.BaseDenom, + balances: nil, + denom: utils.BaseDenom, + customGenesisState: nil, } } @@ -104,3 +108,10 @@ func WithDenom(denom string) ConfigOption { cfg.denom = denom } } + +// WithCustomGenesis sets the custom genesis of the network for specific modules. +func WithCustomGenesis(customGenesis CustomGenesisState) ConfigOption { + return func(cfg *Config) { + cfg.customGenesisState = customGenesis + } +} diff --git a/testutil/integration/evmos/network/network.go b/testutil/integration/evmos/network/network.go index 6d7e32f658..a932d04273 100644 --- a/testutil/integration/evmos/network/network.go +++ b/testutil/integration/evmos/network/network.go @@ -121,33 +121,44 @@ func (n *IntegrationNetwork) configureAndInitChain() error { return err } - fundedAccountBalances = addBondedModuleAccountToFundedBalances(fundedAccountBalances, sdktypes.NewCoin(n.cfg.denom, totalBonded)) + fundedAccountBalances = addBondedModuleAccountToFundedBalances( + fundedAccountBalances, + sdktypes.NewCoin(n.cfg.denom, totalBonded), + ) delegations := createDelegations(valSet.Validators, genAccounts[0].GetAddress()) // Create a new EvmosApp with the following params evmosApp := createEvmosApp(n.cfg.chainID) - // Configure Genesis state - genesisState := app.NewDefaultGenesisState() - - genesisState = setAuthGenesisState(evmosApp, genesisState, genAccounts) - stakingParams := StakingCustomGenesisState{ denom: n.cfg.denom, validators: validators, delegations: delegations, } - genesisState = setStakingGenesisState(evmosApp, genesisState, stakingParams) - - genesisState = setInflationGenesisState(evmosApp, genesisState) totalSupply := calculateTotalSupply(fundedAccountBalances) bankParams := BankCustomGenesisState{ totalSupply: totalSupply, balances: fundedAccountBalances, } - genesisState = setBankGenesisState(evmosApp, genesisState, bankParams) + + // Configure Genesis state + genesisState := newDefaultGenesisState( + evmosApp, + defaultGenesisParams{ + genAccounts: genAccounts, + staking: stakingParams, + bank: bankParams, + }, + ) + + // modify genesis state if there're any custom genesis state + // for specific modules + genesisState, err = customizeGenesis(evmosApp, n.cfg.customGenesisState, genesisState) + if err != nil { + return err + } // Init chain stateBytes, err := json.MarshalIndent(genesisState, "", " ") diff --git a/testutil/integration/evmos/network/setup.go b/testutil/integration/evmos/network/setup.go index aa41b3e58e..839246895b 100644 --- a/testutil/integration/evmos/network/setup.go +++ b/testutil/integration/evmos/network/setup.go @@ -4,6 +4,7 @@ package network import ( + "fmt" "time" "github.com/evmos/evmos/v16/app" @@ -12,6 +13,7 @@ import ( "cosmossdk.io/simapp" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/testutil/mock" + "github.com/cosmos/gogoproto/proto" sdkmath "cosmossdk.io/math" dbm "github.com/cometbft/cometbft-db" @@ -23,9 +25,14 @@ import ( sdktypes "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + govtypesv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" epochstypes "github.com/evmos/evmos/v16/x/epochs/types" infltypes "github.com/evmos/evmos/v16/x/inflation/v1/types" + + evmosutil "github.com/evmos/evmos/v16/utils" + evmtypes "github.com/evmos/evmos/v16/x/evm/types" ) // createValidatorSetAndSigners creates validator set with the amount of validators specified @@ -174,26 +181,23 @@ type StakingCustomGenesisState struct { delegations []stakingtypes.Delegation } -// setStakingGenesisState sets the staking genesis state -func setStakingGenesisState(evmosApp *app.Evmos, genesisState simapp.GenesisState, overwriteParams StakingCustomGenesisState) simapp.GenesisState { +// setDefaultStakingGenesisState sets the staking genesis state +func setDefaultStakingGenesisState(evmosApp *app.Evmos, genesisState simapp.GenesisState, overwriteParams StakingCustomGenesisState) simapp.GenesisState { // Set staking params stakingParams := stakingtypes.DefaultParams() stakingParams.BondDenom = overwriteParams.denom - stakingGenesis := stakingtypes.NewGenesisState(stakingParams, overwriteParams.validators, overwriteParams.delegations) + stakingGenesis := stakingtypes.NewGenesisState( + stakingParams, + overwriteParams.validators, + overwriteParams.delegations, + ) genesisState[stakingtypes.ModuleName] = evmosApp.AppCodec().MustMarshalJSON(stakingGenesis) return genesisState } -// setAuthGenesisState sets the auth genesis state -func setAuthGenesisState(evmosApp *app.Evmos, genesisState simapp.GenesisState, genAccounts []authtypes.GenesisAccount) simapp.GenesisState { - authGenesis := authtypes.NewGenesisState(authtypes.DefaultParams(), genAccounts) - genesisState[authtypes.ModuleName] = evmosApp.AppCodec().MustMarshalJSON(authGenesis) - return genesisState -} - -// setInflationGenesisState sets the inflation genesis state -func setInflationGenesisState(evmosApp *app.Evmos, genesisState simapp.GenesisState) simapp.GenesisState { +// setDefaultInflationGenesisState sets the inflation genesis state +func setDefaultInflationGenesisState(evmosApp *app.Evmos, genesisState simapp.GenesisState) simapp.GenesisState { inflationParams := infltypes.DefaultParams() inflationParams.EnableInflation = false @@ -207,8 +211,12 @@ type BankCustomGenesisState struct { balances []banktypes.Balance } -// setBankGenesisState sets the bank genesis state -func setBankGenesisState(evmosApp *app.Evmos, genesisState simapp.GenesisState, overwriteParams BankCustomGenesisState) simapp.GenesisState { +// setDefaultBankGenesisState sets the bank genesis state +func setDefaultBankGenesisState( + evmosApp *app.Evmos, + genesisState simapp.GenesisState, + overwriteParams BankCustomGenesisState, +) simapp.GenesisState { bankGenesis := banktypes.NewGenesisState( banktypes.DefaultGenesisState().Params, overwriteParams.balances, @@ -220,6 +228,101 @@ func setBankGenesisState(evmosApp *app.Evmos, genesisState simapp.GenesisState, return genesisState } +// genSetupFn is the type for the module genesis setup functions +type genSetupFn func( + evmosApp *app.Evmos, + genesisState simapp.GenesisState, + customGenesis interface{}, +) (simapp.GenesisState, error) + +// defaultGenesisParams contains the params that are needed to +// setup the default genesis for the testing setup +type defaultGenesisParams struct { + genAccounts []authtypes.GenesisAccount + staking StakingCustomGenesisState + bank BankCustomGenesisState +} + +// genStateSetter is a generic function to set module-specific genesis state +func genStateSetter[T proto.Message](moduleName string) genSetupFn { + return func( + evmosApp *app.Evmos, + genesisState simapp.GenesisState, + customGenesis interface{}, + ) (simapp.GenesisState, error) { + moduleGenesis, ok := customGenesis.(T) + if !ok { + return nil, fmt.Errorf("invalid type %T for %s module genesis state", customGenesis, moduleName) + } + + genesisState[moduleName] = evmosApp.AppCodec().MustMarshalJSON(moduleGenesis) + return genesisState, nil + } +} + +// genesisSetupFunctions contains the available genesis setup functions +// that can be used to customize the network genesis +var genesisSetupFunctions = map[string]genSetupFn{ + evmtypes.ModuleName: genStateSetter[*evmtypes.GenesisState](evmtypes.ModuleName), + govtypes.ModuleName: genStateSetter[*govtypesv1.GenesisState](govtypes.ModuleName), + infltypes.ModuleName: genStateSetter[*infltypes.GenesisState](infltypes.ModuleName), +} + +// setDefaultAuthGenesisState sets the default auth genesis state +func setDefaultAuthGenesisState( + evmosApp *app.Evmos, + genesisState simapp.GenesisState, + genAccs []authtypes.GenesisAccount, +) simapp.GenesisState { + defaultAuthGen := authtypes.NewGenesisState(authtypes.DefaultParams(), genAccs) + genesisState[authtypes.ModuleName] = evmosApp.AppCodec().MustMarshalJSON(defaultAuthGen) + return genesisState +} + +// setDefaultGovGenesisState sets the default gov genesis state +func setDefaultGovGenesisState(evmosApp *app.Evmos, genesisState simapp.GenesisState) simapp.GenesisState { + govGen := govtypesv1.DefaultGenesisState() + updatedParams := govGen.Params + // set 'aevmos' as deposit denom + updatedParams.MinDeposit = sdktypes.NewCoins(sdktypes.NewCoin(evmosutil.BaseDenom, sdkmath.NewInt(1e18))) + govGen.Params = updatedParams + genesisState[govtypes.ModuleName] = evmosApp.AppCodec().MustMarshalJSON(govGen) + return genesisState +} + +// defaultAuthGenesisState sets the default genesis state +// for the testing setup +func newDefaultGenesisState(evmosApp *app.Evmos, params defaultGenesisParams) simapp.GenesisState { + genesisState := app.NewDefaultGenesisState() + + genesisState = setDefaultAuthGenesisState(evmosApp, genesisState, params.genAccounts) + genesisState = setDefaultStakingGenesisState(evmosApp, genesisState, params.staking) + genesisState = setDefaultBankGenesisState(evmosApp, genesisState, params.bank) + genesisState = setDefaultInflationGenesisState(evmosApp, genesisState) + genesisState = setDefaultGovGenesisState(evmosApp, genesisState) + + return genesisState +} + +// customizeGenesis modifies genesis state if there're any custom genesis state +// for specific modules +func customizeGenesis( + evmosApp *app.Evmos, + customGen CustomGenesisState, + genesisState simapp.GenesisState, +) (simapp.GenesisState, error) { + var err error + for mod, modGenState := range customGen { + if fn, found := genesisSetupFunctions[mod]; found { + genesisState, err = fn(evmosApp, genesisState, modGenState) + if err != nil { + return genesisState, err + } + } + } + return genesisState, err +} + // calculateTotalSupply calculates the total supply from the given balances func calculateTotalSupply(fundedAccountsBalances []banktypes.Balance) sdktypes.Coins { totalSupply := sdktypes.NewCoins() @@ -230,7 +333,10 @@ func calculateTotalSupply(fundedAccountsBalances []banktypes.Balance) sdktypes.C } // addBondedModuleAccountToFundedBalances adds bonded amount to bonded pool module account and include it on funded accounts -func addBondedModuleAccountToFundedBalances(fundedAccountsBalances []banktypes.Balance, totalBonded sdktypes.Coin) []banktypes.Balance { +func addBondedModuleAccountToFundedBalances( + fundedAccountsBalances []banktypes.Balance, + totalBonded sdktypes.Coin, +) []banktypes.Balance { return append(fundedAccountsBalances, banktypes.Balance{ Address: authtypes.NewModuleAddress(stakingtypes.BondedPoolName).String(), Coins: sdktypes.Coins{totalBonded}, From 2ceae7370135283e521e420d41f45f81870aed48 Mon Sep 17 00:00:00 2001 From: yihuang Date: Tue, 30 Jan 2024 08:34:55 +0800 Subject: [PATCH 096/345] Problem: versiondb version checking on startup is too strict (#2297) * Problem: versiondb version checking on startup is too strict there was the version equality checking on startup between versiondb and iavl, for two purposes: - if versiondb lag behind iavl, when commit new blocks, it creates gap in versiondb. this can happen because cms is committed before versiondb. - if versiondb is beyond iavl, and when commit new blocks, versiondb will write some duplicated data, this is actually not harmful, if the rewritten data is identical to the old ones. this can happen with memiavl async-commit. the latter case is not harmful, so we can relax the checking to improve UX. * bump cronos deps * add comment * add changelog entry --------- Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: tom --- CHANGELOG.md | 1 + app/app.go | 11 +++++++++-- go.mod | 6 +++--- go.sum | 6 ++++++ gomod2nix.toml | 12 ++++++------ 5 files changed, 25 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f2dc0e1a84..d3fccfebd4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -165,6 +165,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (tests) [#2280](https://github.com/evmos/evmos/pull/2280) Enable specifying the prefunded balances for the integration test setup. - (tests) [#2289](https://github.com/evmos/evmos/pull/2289) Add utility to check balances during tests. - (tests) [#2296](https://github.com/evmos/evmos/pull/2296) Add custom genesis config functionality to integration setup. +- (db) [#2297](https://github.com/evmos/evmos/pull/2297) Patch versionDB dependency to avoid lagging behind on OS reboot and update version check logic. ### Bug Fixes diff --git a/app/app.go b/app/app.go index 9e511bafe3..2bfab4e2ae 100644 --- a/app/app.go +++ b/app/app.go @@ -815,8 +815,15 @@ func NewEvmos( if queryMultiStore != nil { v1 := queryMultiStore.LatestVersion() v2 := app.LastBlockHeight() - if v1 > 0 && v1 != v2 { - tmos.Exit(fmt.Sprintf("versiondb lastest version %d don't match iavl latest version %d", v1, v2)) + // Prevent creating gaps in versiondb + // - if versiondb lag behind iavl, when commit new blocks, it creates gap in versiondb. + // This can happen because cms is committed before versiondb. + // - if versiondb is beyond iavl, and when commit new blocks, versiondb will write some duplicated data. + // This is actually not harmful, if the rewritten data is identical to the old ones. + // This can happen with memiavl async-commit. + // The latter case is not harmful, so we can relax the checking to improve UX. + if v1 > 0 && v1 < v2 { + tmos.Exit(fmt.Sprintf("versiondb lastest version %d lag behind iavl latest version %d", v1, v2)) } } } diff --git a/go.mod b/go.mod index a4ef2e7409..51055cb1ee 100644 --- a/go.mod +++ b/go.mod @@ -18,9 +18,9 @@ require ( github.com/cosmos/go-bip39 v1.0.0 github.com/cosmos/gogoproto v1.4.10 github.com/cosmos/ibc-go/v7 v7.3.1 - github.com/crypto-org-chain/cronos/memiavl v0.0.5-0.20231027074119-c05c9c61c90e - github.com/crypto-org-chain/cronos/store v0.0.5-0.20231027074119-c05c9c61c90e - github.com/crypto-org-chain/cronos/versiondb v0.0.0-20231027074119-c05c9c61c90e + github.com/crypto-org-chain/cronos/memiavl v0.0.5-0.20240129013154-12efd9b7643f + github.com/crypto-org-chain/cronos/store v0.0.5-0.20240129013154-12efd9b7643f + github.com/crypto-org-chain/cronos/versiondb v0.0.0-20240129013154-12efd9b7643f github.com/davecgh/go-spew v1.1.1 github.com/ethereum/go-ethereum v1.11.5 github.com/golang/protobuf v1.5.3 diff --git a/go.sum b/go.sum index 0e1fe3fbe0..cf3538ba15 100644 --- a/go.sum +++ b/go.sum @@ -403,10 +403,16 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3 github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/crypto-org-chain/cronos/memiavl v0.0.5-0.20231027074119-c05c9c61c90e h1:1+NtTl/lzVNKXZUv41HYQ76gtxojDi6gbQrxM2lgDpo= github.com/crypto-org-chain/cronos/memiavl v0.0.5-0.20231027074119-c05c9c61c90e/go.mod h1:PMRblIxBPdkHeEw36YxCWLO0DylfmEJYIgmdo6VgwZo= +github.com/crypto-org-chain/cronos/memiavl v0.0.5-0.20240129013154-12efd9b7643f h1:1iOcVkGzlyf69VmH0HRMa6Hx5RQQiV3ojdII6sqmtcc= +github.com/crypto-org-chain/cronos/memiavl v0.0.5-0.20240129013154-12efd9b7643f/go.mod h1:b2P7ilsxOWAhl9augFxBeRVeqecnQtzqfzpqsglj5ik= github.com/crypto-org-chain/cronos/store v0.0.5-0.20231027074119-c05c9c61c90e h1:3mq9zn5+49covVejnfwPIIx0i6pzRXxKJzz4PuVVn9g= github.com/crypto-org-chain/cronos/store v0.0.5-0.20231027074119-c05c9c61c90e/go.mod h1:N6IfJDLTTo0vxyuY4MSMMX2TOdBd/tozpjnYGJmAfmE= +github.com/crypto-org-chain/cronos/store v0.0.5-0.20240129013154-12efd9b7643f h1:A9n61ZEpG2HXOMJ0Q8EHGGzEAp9IUA4E9PiydqVeJy0= +github.com/crypto-org-chain/cronos/store v0.0.5-0.20240129013154-12efd9b7643f/go.mod h1:puaAzL204Ni6axMuMNfZREz9gazZbhAbb4ksRhdLBdI= github.com/crypto-org-chain/cronos/versiondb v0.0.0-20231027074119-c05c9c61c90e h1:kN1HNLp2xmy8vIHpGWjsX8dCL6sXID2Tw4qZZk7XYd4= github.com/crypto-org-chain/cronos/versiondb v0.0.0-20231027074119-c05c9c61c90e/go.mod h1:8W9LCw+FhR2sFI+nkjSi0ItZ0IeSyUjc6CSvuaYTU2s= +github.com/crypto-org-chain/cronos/versiondb v0.0.0-20240129013154-12efd9b7643f h1:crbxFPAPS4LaTSimB4JeZF8apfDYy39E2+JFGwFEKFQ= +github.com/crypto-org-chain/cronos/versiondb v0.0.0-20240129013154-12efd9b7643f/go.mod h1:8L1WprpzpqIz6erpQjd/qOvMNpYDG4qzR5vWgAqv6Jw= github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= diff --git a/gomod2nix.toml b/gomod2nix.toml index b2c33d73ee..2ca76156a2 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -175,14 +175,14 @@ schema = 3 version = "v0.4.2" hash = "sha256-AjtQRoLKLSAbyKd8YlaXcYn0pek6oo5U3R28dvtKv14=" [mod."github.com/crypto-org-chain/cronos/memiavl"] - version = "v0.0.5-0.20231027074119-c05c9c61c90e" - hash = "sha256-k5hola5/RYNclUT7tJfH0yhBbcXOcOpebZ3EmIojmlI=" + version = "v0.0.5-0.20240129013154-12efd9b7643f" + hash = "sha256-9YpEfHwpr7MsJ38fSlqxOnbFd6GEkBHOEVPYI2Chm9w=" [mod."github.com/crypto-org-chain/cronos/store"] - version = "v0.0.5-0.20231027074119-c05c9c61c90e" - hash = "sha256-4nY3GTFMcvw0y96kdD96+hC+i2fuLKp8lZv49hZBpRs=" + version = "v0.0.5-0.20240129013154-12efd9b7643f" + hash = "sha256-Lay2qvu3+bI5eitVO7AJAH02v8kjHnEavSiRvUlQ6xA=" [mod."github.com/crypto-org-chain/cronos/versiondb"] - version = "v0.0.0-20231027074119-c05c9c61c90e" - hash = "sha256-IIv9jQZHX5VCVhHDEUtKA86llIj15ujYvrQYsNujB8s=" + version = "v0.0.0-20240129013154-12efd9b7643f" + hash = "sha256-lZVFHisnXlHoBO8meHI7Hw61ecZH56yKw2bFQ9E5FtY=" [mod."github.com/danieljoos/wincred"] version = "v1.1.2" hash = "sha256-Nnklfg12vmWCOhELGyoRqEF4w4srp0WbPwreaChYLKs=" From 68fae2758f3976b69b2636ce02e92df03409b1d4 Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Tue, 30 Jan 2024 12:12:38 +0100 Subject: [PATCH 097/345] chore(upgrade): Merge changes from v16 release branch to main (#2295) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(p256): adjust p256 precompile address (backport #2110) (#2112) chore(p256): adjust p256 precompile address (#2110) * adjust p256 precompile address * address linter * add changelog entry (cherry picked from commit 56b1993a2f5bba4758982bf1e2950ddc4702f6f1) Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> * revert deprecation of EIP-712 ante handler for v16.0.0-rc1 (#2113) revert deprecattion of EIP-712 ante handler * chore(proto): run make proto-all (backport #2111) (#2114) chore(proto): run make proto-all (#2111) run make proto-all Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> (cherry picked from commit 836a6d7cf112b74c0e8fa216d9b1d69616a1c0fc) Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> * feat(stride,osmosis): enable stride and osmosis outposts during upgrade (backport #2117) (#2120) feat(stride,osmosis): enable stride and osmosis outposts during upgrade (#2117) * enable stride and osmosis outposts during upgrade * add changelog entry (cherry picked from commit 303aa87fc859b62645cd94e8e68bba4cba0f8a95) Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> * chore(osmosis): add osmosis outpost to available EVM extensions (backport #2109) (#2119) chore(osmosis): add osmosis outpost to available EVM extensions (#2109) * adjust call signature to match other precompiles * add osmosis outpost to available extensions * update channel ID for osmosis outpost * adjust expected gas values * add changelog entry (cherry picked from commit 7761a2551083ef6edf459f30f685277379aeeffb) # Conflicts: # CHANGELOG.md Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> * chore(post): Revert post handler changes for v16.0.0-rc1 (#2118) Revert "feat(post): burn cosmos transaction fees (#2013)" This reverts commit 3dd60c0a Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> * chore(ante): revert mono ante handler for v16.0.0-rc1 (#2116) revert mono ante handler Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> * imp(changelog): Changelog clean up (backport #2107) (#2123) * imp(changelog): Changelog clean up (#2107) * wip clean up * wip clean up 2 * add precompile suffix to make distinction between modules and precompiles clear * move some more state breaking changes to section * Update CHANGELOG.md Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> * adjust entry --------- Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> (cherry picked from commit 5de9abfa3630609c8f6b7261ead6fa1e4fb37e4f) # Conflicts: # CHANGELOG.md * fix merge conflicts --------- Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Co-authored-by: MalteHerrmann * chore(upgrade): Activate bech32 precompile during upgrade (#2124) * chore(upgrade): Activate bech32 precompile * format * fix: add both activations together * CHANGELOG * fix(incentives): remove incentives burning logic from upgrade handler (backport #2131) (#2132) fix(incentives): remove incentives burning logic from upgrade handler (#2131) * remove incentives burning logic from upgrade handler * add changelog entry (cherry picked from commit b587e58a9e31c05d5167b324beddd21f3ddaf514) Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> * chore(upgrade): Prepare v16.0.0-rc1 (#2133) * prepare v16.0.0-rc1 * fix changelog * tests(e2e): Osmosis e2e tests (backport #2029) (#2170) tests(e2e): Osmosis e2e tests (#2029) * cosmoswasm artifacts * first pass * run make format * add comments * run make format * fix lint * fix wrong params * lint code * lint code * refactor utils func * update osmosis ver * update compile contracts script * enable osmosis outpost * update bins & add contract patch * remove unnecessary dump to file * update app.go with bank keeper in availablePrecompiles * refactor * update test setup for contract v1 * remove unnecessary changes * make format * fix lint issues * fix lint issues * add channel patch * update comment * fix lint issues * fix lint issues * Apply suggestions from code review Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> * address review comments * fix onFailDelivery unit test * fix gosec issues * Update precompiles/outposts/osmosis/types.go --------- Co-authored-by: facs95 Co-authored-by: tom Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> (cherry picked from commit 8a890e22ff2d71bc7e72eb565752045218501b0a) Co-authored-by: Freddy Caceres * Add channel selector from chainID (backport #2172) (#2173) * Add channel selector from chainID (#2172) * bump cosmos sdk fork and port selector * update xcs contract testnet * add CHANGELOG entry (cherry picked from commit f9754afc892581ca24d47907196c770233b181ca) # Conflicts: # CHANGELOG.md * CHANGELOG FIX --------- Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: Vlad * imp(docker): update jq and curl dependencies (backport #2168) (#2177) imp(docker): update jq and curl dependencies (#2168) update jq and curl dependencies (cherry picked from commit cc07bbbc908e12e40d8b3b5f8df4132a8ad74b7c) Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> * chore: update gomod2nix (#2174) Co-authored-by: Vladislav Varadinov * imp(inflation): Reduce inflation by 2/3 (backport #2137) (#2178) imp(inflation): Reduce inflation by 2/3 (#2137) * imp(inflation): Reduce inflation by 2/3 * changelog * fix(tests): fix integration tests * fix(tests): add back case for incentives * fix(tests): fix linter * Update x/inflation/v1/keeper/hooks.go Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> --------- Co-authored-by: Vladislav Varadinov Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> (cherry picked from commit 05cf01da265693cc6af1e76c28e0032aaba0ab6d) Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> * chore(tests): update patches (#2179) chore: update patches * feat(post): burn cosmos transaction fees (backport #2128) (#2181) feat(post): burn cosmos transaction fees (#2128) * feat(post): burn cosmos transaction fees * changelog * handler options * tests(post): unit test for burn cosmos transaction fees. (#2027) * add posthandler unit test suite * add HandlerOptions validation tests * add Burner auth to FeeCollectorName * add test setup + post handler test * add burn tests * run make format * add tests with balance check for post burn * fix * run make format * linter --------- Co-authored-by: 0xstepit <0xstepit@users.noreply.github.com> * Update app/post/post.go Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> * format test * add safety check * check for zero len coins * fix(post): fix post handler * update imports * update changelog --------- Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: 0xstepit <0xstepit@users.noreply.github.com> Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> (cherry picked from commit f4ede8dabc29033a6746373ec35fe491785d569c) Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> * chore(upgrade): Create v16-rc2 upgrade case and modify constants (#2175) * chore(upgrade): delete old upgrade handler and logic * fix: delete * fix: create another upgrade name so we can keep mainnet upgrade name * UPDATE CHANGELOG * UPDATE CHANGELOG * UPDATE CHANGELOG --------- Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> * fix(upgrade): Add upgrade handler for rc2 (#2184) * fix: add upgrade handler for rc2 * fix: add missing * fix(outposts): Handle cases for input and output denoms without token pair lookup (#2185) * fix: add bond denom to outposts directly from staking keeper * format and lint * fix: comment out stride unit tests that don't apply * fix: cases for input and output denom * fix: use IBC denom instead of ERC20 address or plain denom * fix: remove ERC20 token pair check from liquid stake transaction and replace with the hardcoded wevmos address check * fix: stride tests * minor fix * fix: osmosis setup * fix: adapt tests to pass for both Outposts * fix: refactor to only use hardcoded WEVMOS * remove unnecessary comment * fix: no more need for custom error * fix: remove commented out lines * APPLY CHANGES FROM CODE REVIEW * update e2e test patches * update e2e test --------- Co-authored-by: stepit Co-authored-by: tom * fix(feecollector): Add FeeCollector burner role, UpgradeHandler for fork (#2186) * fix(upgrade): add fee collector burner role * add hard fork logic * make format * apply changes from code review * fix: delete the only RegisterIncentive proposal from the store to fix the proposals query * fix: add the iteration of proposals and deletion of RegisterIncentive proposal type * fix: remove old fork block height * fix: push test thus far * fix: add test for deletion of proposal * FORMAT AND LINT * fix: add license to new file * merge + conflicts * fix typo * fix: add comments * fix: add error checking * fix: delete old code and comment out deletion + tests * FORMAT AND LINT * fix: add hardfork height and remove protos * fix: add final testnet hardfork height --------- Co-authored-by: tom Co-authored-by: stepit * chore(upgrade): Prepare v16-rc4 UpgradeHandler (#2188) * add rc3 tag preparation * fix: add upgrade height for Dec 14th 2023, 10:13 AM * fix: add RC4 changes * FORMAT AND LINT * FORMAT AND LINT * Update app/upgrades/v16/upgrades.go Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> * Update app/forks.go Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> * update golang version in go linter * Revert "update golang version in go linter" This reverts commit 96636fde02d2d0976af9bd6364019a1180874b86. --------- Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: tom * chore(upgrade): Add changelog entries for upgrade (#2189) * add rc3 tag preparation * fix: add upgrade height for Dec 14th 2023, 10:13 AM * chore(changelog): Changelog entry * fix(osmosis-outpost): Fix XCS contract address (#2192) * add rc3 tag preparation * fix: add upgrade height for Dec 14th 2023, 10:13 AM * fix(outposts): add correct XCS contract * CHANGELOG * CHANGELOG * chore(upgrade): remove deprecated gov proposals (incentives) (backport #2196) (#2201) * chore(upgrade): remove deprecated gov proposals (incentives) (#2196) * wip - add remove proposal logic * add incentives code * keep only incentives types * update tests * update upgrade logic * remove unnecessary types * update upgrade logic * update comments * make format * fix lint issues * add changelog entry * update upgrade logic (cherry picked from commit 7dfc497e7a9ad8190f14e21b5fbfa5bcad131f80) # Conflicts: # app/app.go # app/upgrades/v16/proposals.go # app/upgrades/v16/upgrades.go # app/upgrades/v16/upgrades_test.go * fix conflicts --------- Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: tom * fix(release): Add required Outpost refactors to release branch (#2220) * add rc3 tag preparation * fix: add upgrade height for Dec 14th 2023, 10:13 AM * fix(outposts): add correct XCS contract * fix: add outpost refactored logic * fix(test): fix register Coin helper * fix: remove unused file * fix: refactor nix tests * update osmosis outpost e2e test * fix stride outpost input params order * update test setup for stride * revert remove RegisterCoinProposal * fix app.go * fix: use xcs contract addr --------- Co-authored-by: tom * chore(upgrade): enable burning the usage incentives pool in the v16 handler (backport #2221) (#2224) * chore(upgrade): enable burning the usage incentives pool in the v16 handler (#2221) * enable burning the usage incentives pool in the v16 handler * add changelog entry (cherry picked from commit e69abb02cfd6ebf3621ccb495bf5e8d3cac64d68) # Conflicts: # CHANGELOG.md # app/upgrades/v16/upgrades.go * fix merge conflicts * pass bank keeper to upgrade handler --------- Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Co-authored-by: MalteHerrmann * fix(outpost): Add comments to structs and ValidateBasic condition (backport #2223) (#2225) * fix(outpost): Add comments to structs and ValidateBasic condition (#2223) * fix(outpost): Add comments to structs and ValidateBasic condition * fix: format, lint and changelog * Update precompiles/outposts/stride/IStrideOutpost.sol Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> --------- Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> (cherry picked from commit 56e062b0b2c73302c9b08e5fe4d9d74261fb6849) # Conflicts: # CHANGELOG.md * CHANGELOG fix --------- Co-authored-by: Vladislav Varadinov * chore(upgrade): Prepare v16.0.0-rc5 (#2226) * reduce upgrade handler for rc5 * adjust upgrade name * adjust changelog * add logic specifically for rc5 * Revert "adjust upgrade name" This reverts commit 6a11af4817f86914baadf27adf7e8f5fe6c4799b. * Revert "reduce upgrade handler for rc5" This reverts commit 9ce18769acb26750b2503b94e2f74183ef94d664. * adjust upgrade info * chore(p256): adjust p256 precompile address (backport #2228) (#2229) * chore(p256): adjust p256 precompile address (#2228) * adjust p256 precompile address * add changelog entry * move changelog entry to improvements (cherry picked from commit 7821cb86cf7e70a78507f71c79550a9d436276c0) * move changelog to correct place --------- Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Co-authored-by: MalteHerrmann * chore(upgrade): combine v16 upgrade handlers (#2231) * combine upgrade handlers into one * remove rc upgrade constants and comment out hard fork logic * update changelog - remove not-included PR --------- Co-authored-by: tom * chore(changelog): Prepare changelog for v16.0.0 (#2239) prepare changelog for v16.0.0 * chore: add burned coins metrics (backport #2246) (#2248) * chore: add burnt coins metrics (#2246) * add burnt coins metrics * add changelog entry * add test case * small fix * small refactor (cherry picked from commit ea75cb96037349fc27c85a8a0ec820a9b5a55b59) # Conflicts: # CHANGELOG.md * fix conflicts * remove unincluded change * set telemetry on deliver tx only --------- Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: tom * chore(upgrade): Prepare changelog for v16.0.1 (#2257) prepare changelog * fix(inflation): update query to return correct inflation value (backport #2269) (#2272) * fix(inflation): update query to return correct inflation value (#2269) * fix query and update tests * fix test * add docstring and update CHANGELOG (cherry picked from commit eab8194a440ed13eb959ff955a0123aca2979061) # Conflicts: # CHANGELOG.md * fix CHANGELOG conflict * fix CHANGELOG --------- Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: stepit * fix changelog * fix failed merge * copy ante folder from main * revert changes in testutils * revert changes to werc20 precompile * remove duplicate function definitions in Python utils * Update CHANGELOG.md * remove outdated nix files * Apply suggestions from code review --------- Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> Co-authored-by: Vladislav Varadinov Co-authored-by: Freddy Caceres Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: stepit Co-authored-by: tom --- CHANGELOG.md | 72 ++++++++++++------- app/app.go | 6 +- app/upgrades/v16/proposals.go | 28 ++++---- app/upgrades/v16/upgrades.go | 14 ++-- app/upgrades/v16/upgrades_test.go | 56 +++++++-------- .../integration/common/factory/factory.go | 1 + testutil/integration/common/factory/helper.go | 1 + x/evm/types/utils.go | 1 + 8 files changed, 99 insertions(+), 80 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d3fccfebd4..283968259e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,6 +39,46 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### State Machine Breaking +- (erc20) [#2154](https://github.com/evmos/evmos/pull/2154) Remove EVM hooks from `erc20` module. +- (erc20) [#2155](https://github.com/evmos/evmos/pull/2155) Remove CLI commands for register and convert Coin. +- (osmosis-outpost) [#2206](https://github.com/evmos/evmos/pull/2206) Update swap function input to custom struct. +- (stride-outpost) [#2207](https://github.com/evmos/evmos/pull/2207) Update Stride outpost to include additional arguments. +- (erc20) [#2217](https://github.com/evmos/evmos/pull/2217) Add logic to deploy token pairs contracts on genesis. +- (erc20) [#2292](https://github.com/evmos/evmos/pull/2292) Revert unnecessary logic on genesis (reverts #2217). + +### Improvements + +- (ante) [#2028](https://github.com/evmos/evmos/pull/2028) MonoAnteHandler for EVM transaction. +- (staking-precompile) [#2105](https://github.com/evmos/evmos/pull/2105) Detect the length of the ed25519 pubkey in precompile `CreateValidator` to prevent panic. +- (tests) [#2230](https://github.com/evmos/evmos/pull/2230) Send bank transfer during automated upgrade tests. +- (outposts) [#2236](https://github.com/evmos/evmos/pull/2236) Add default timeout timestamp for outpost transactions. +- (distribution-precompile) [#2240](https://github.com/evmos/evmos/pull/2240) Replace hardcoded expected balance in distribution precompile tests with queried balance. +- (staking-precompile) [#2234](https://github.com/evmos/evmos/pull/2234) Fix wrong error messages in `NewMsgCreateValidator`. +- (tests) [#2235](https://github.com/evmos/evmos/pull/2235) Ensure voting has concluded in automated upgrade tests. +- (ci) [#2259](https://github.com/evmos/evmos/pull/2259) Adjust CI configuration to have required items always return a status. +- (ci) [#2267](https://github.com/evmos/evmos/pull/2267) Minor clean-up in EIP-7212 tests. +- (ci) [#2268](https://github.com/evmos/evmos/pull/2268) Fix and update the Pull Request Labeler workflow. +- (tests) [#2280](https://github.com/evmos/evmos/pull/2280) Enable specifying the prefunded balances for the integration test setup. +- (tests) [#2289](https://github.com/evmos/evmos/pull/2289) Add utility to check balances during tests. +- (tests) [#2296](https://github.com/evmos/evmos/pull/2296) Add custom genesis config functionality to integration setup. +- (db) [#2297](https://github.com/evmos/evmos/pull/2297) Patch versionDB dependency to avoid lagging behind on OS reboot and update version check logic. + +## [v16.0.2](https://github.com/evmos/evmos/releases/tag/v16.0.2) - 2024-01-16 + +### Bug Fixes + +- (inflation) [#2269](https://github.com/evmos/evmos/pull/2269) Fix inflation info returned by epoch mint provision getter. + +## [v16.0.1](https://github.com/evmos/evmos/releases/tag/v16.0.1) - 2024-01-11 + +### Improvements + +- (metrics) [#2246](https://github.com/evmos/evmos/pull/2246) Add burned cosmos transactions fees metric. + +## [v16.0.0](https://github.com/evmos/evmos/releases/tag/v16.0.0) - 2024-01-05 + +### State Machine Breaking + - (p256-precompile) [#1922](https://github.com/evmos/evmos/pull/1922) [EIP-7212](https://eips.ethereum.org/EIPS/eip-7212) `secp256r1` curve precompile. - (distribution-precompile) [#1949](https://github.com/evmos/evmos/pull/1949) Add `ClaimRewards` custom transaction. - (bech32-precompile) [#2038](https://github.com/evmos/evmos/pull/2038) Add `bech32` conversion precompile. @@ -52,15 +92,11 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (incentives) [#2070](https://github.com/evmos/evmos/pull/2070) Remove `x/incentives` module and burn incentives pool balance. - (evm) [#2084](https://github.com/evmos/evmos/pull/2084) Remove `x/claims` params and migrate the `EVMChannels` param to the `x/evm` module params. - (post) [#2128](https://github.com/evmos/evmos/pull/2128) Add `BurnDecorator` to `PostHandler` to burn cosmos transaction fees. -- (upgrade) [#2129](https://github.com/evmos/evmos/pull/2129) Add `Burner` role to `FeeCollector` module. -- (erc20) [#2154](https://github.com/evmos/evmos/pull/2154) Remove EVM hooks from `erc20` module. -- (erc20) [#2155](https://github.com/evmos/evmos/pull/2155) Remove CLI commands for register and convert Coin. -- (erc20) [#2157](https://github.com/evmos/evmos/pull/2157) Remove `RegisterCoinProposal` logic, protos and related tests. -- (osmosis-outpost) [#2206](https://github.com/evmos/evmos/pull/2206) Update swap function input to custom struct. -- (stride-outpost) [#2207](https://github.com/evmos/evmos/pull/2207) Update Stride outpost to include additional arguments. +- (evm) [#2172](https://github.com/evmos/evmos/pull/2172) Add channel selector from chain id. +- (inflation) [#2137](https://github.com/evmos/evmos/pull/2137) Reduce inflation by 2/3. +- (outposts) [#2185](https://github.com/evmos/evmos/pull/2185) Refactor `Stride` and `Osmosis` outposts to hardcode WEVMOS address. +- (upgrade) [#2186](https://github.com/evmos/evmos/pull/2186) Add `feecollector` Burner role in upgrade handler. - (incentives) [#2221](https://github.com/evmos/evmos/pull/2221) Burn the usage incentives pool balance during v16 upgrade. -- (erc20) [#2217](https://github.com/evmos/evmos/pull/2217) Add logic to deploy token pairs contracts on genesis. -- (erc20) [#2292](https://github.com/evmos/evmos/pull/2292) Revert unnecessary logic on genesis (reverts #2217). ### API Breaking @@ -105,7 +141,6 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (osmosis-outpost) [#2017](https://github.com/evmos/evmos/pull/2017) Refactor types, errors and precompile struct. - (erc20-precompile) [#2023](https://github.com/evmos/evmos/pull/2023) Add tests for ERC-20 precompile queries. - (osmosis-outpost) [#2025](https://github.com/evmos/evmos/pull/2025) Use a struct to wrap parsed parameters from Solidity. -- (ante) [#2028](https://github.com/evmos/evmos/pull/2028) MonoAnteHandler for EVM transaction. - (erc20-precompile) [#2037](https://github.com/evmos/evmos/pull/2037) Add IsTransactions and RequiredGas tests for the ERC-20 extension. - (bank-precompile) [#2040](https://github.com/evmos/evmos/pull/2040) Add bank extension unit tests for queries. - (bank-precompile) [#2041](https://github.com/evmos/evmos/pull/2041) Add `supplyOf` query to bank extension. @@ -135,37 +170,21 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (bank-precompile) [#2096](https://github.com/evmos/evmos/pull/2096) Add `bank` precompile integration tests. - (osmosis-outpost) [#2077](https://github.com/evmos/evmos/pull/2077) Update Osmosis outpost to use cross-chain swap contract V1. - (app) [#2104](https://github.com/evmos/evmos/pull/2104) Refactor code to use `sdkmath.Int` and `sdkmath.LegacyDec` instead of the SDK types. -- (staking-precompile) [#2105](https://github.com/evmos/evmos/pull/2105) Detect the length of the ed25519 pubkey in precompile `CreateValidator` to prevent panic. - (p256-precompile) [#2110](https://github.com/evmos/evmos/pull/2110) Adjust `p256` precompile address. - (upgrade) [#2117](https://github.com/evmos/evmos/pull/2117) Enable Stride and Osmosis outposts in v16 upgrade handler. - (osmosis-outpost) [#2109](https://github.com/evmos/evmos/pull/2109) Add Osmosis outpost to available EVM extensions. - (osmosis-outpost) [#2029](https://github.com/evmos/evmos/pull/2029) Add Osmosis outpost end-to-end tests. - (upgrade) [#2131](https://github.com/evmos/evmos/pull/2131) Remove incentives pool burning logic from upgrade handler. - (staking-precompile) [#2122](https://github.com/evmos/evmos/pull/2122) Replace bech32 address with EVM hex address for `CreateValidator` function and remove delegator address argument. -- (inflation) [#2137](https://github.com/evmos/evmos/pull/2137) Reduce daily inflation by 2/3s. - (app) [#2138](https://github.com/evmos/evmos/pull/2138) Replace imports of store related types and functions to use Cosmos-SDK `store/types` package. . - (app) [#2139](https://github.com/evmos/evmos/pull/2139) Remove old upgrade handlers logic. - (outposts) [#2171](https://github.com/evmos/evmos/pull/2171) Add channelID selector based on the ChainID. - (db) [#2182](https://github.com/evmos/evmos/pull/2182) Bump RocksDB version to `v8.8.1`. -- (api) [#2198](https://github.com/evmos/evmos/pull/2198) Remove deprecated `RegisterCoinProposal` from store to avoid breaking the governance proposals query. - (outposts) [#2215](https://github.com/evmos/evmos/pull/2215) Backport handle cases for input and output denoms without token pair lookup. - (cli) [#2212](https://github.com/evmos/evmos/pull/2212) Remove ValidateBasic in CLI. - (swagger) [#2219](https://github.com/evmos/evmos/pull/2219) Update Swagger configuration to remove outdated entries and update vesting module version. - (outposts) [#2223](https://github.com/evmos/evmos/pull/2223) Update Outposts struct documentation and `ValidateBasic`. - (p256-precompile) [#2228](https://github.com/evmos/evmos/pull/2228) Adjust p256 precompile address from `0x0b` to `0x100`. -- (tests) [#2230](https://github.com/evmos/evmos/pull/2230) Send bank transfer during automated upgrade tests. -- (outposts) [#2236](https://github.com/evmos/evmos/pull/2236) Add default timeout timestamp for outpost transactions. -- (distribution-precompile) [#2240](https://github.com/evmos/evmos/pull/2240) Replace hardcoded expected balance in distribution precompile tests with queried balance. -- (staking-precompile) [#2234](https://github.com/evmos/evmos/pull/2234) Fix wrong error messages in `NewMsgCreateValidator`. -- (tests) [#2235](https://github.com/evmos/evmos/pull/2235) Ensure voting has concluded in automated upgrade tests. -- (metrics) [#2246](https://github.com/evmos/evmos/pull/2246) Add burned cosmos transactions fees metric. -- (ci) [#2259](https://github.com/evmos/evmos/pull/2259) Adjust CI configuration to have required items always return a status. -- (ci) [#2267](https://github.com/evmos/evmos/pull/2267) Minor clean-up in EIP-7212 tests. -- (ci) [#2268](https://github.com/evmos/evmos/pull/2268) Fix and update the Pull Request Labeler workflow. -- (tests) [#2280](https://github.com/evmos/evmos/pull/2280) Enable specifying the prefunded balances for the integration test setup. -- (tests) [#2289](https://github.com/evmos/evmos/pull/2289) Add utility to check balances during tests. -- (tests) [#2296](https://github.com/evmos/evmos/pull/2296) Add custom genesis config functionality to integration setup. -- (db) [#2297](https://github.com/evmos/evmos/pull/2297) Patch versionDB dependency to avoid lagging behind on OS reboot and update version check logic. ### Bug Fixes @@ -173,9 +192,9 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (evm) [#1943](https://github.com/evmos/evmos/pull/1943) Fix gas estimation (`eth_estimateGas`) to be consistent with gas used in EVM extensions transactions. - (tests) [#1989](https://github.com/evmos/evmos/pull/1989) Fix the problem about deliverTxSimulate in test app/ante/cosmos/min_price_test.go. - (db) [#2072](https://github.com/evmos/evmos/pull/2072) Change VersionDb directory permission from 777 (insecure) to 750 (general). +- (osmosis-outpost) [#2192](https://github.com/evmos/evmos/pull/2192) Fix Osmosis XCS contract address for testnet. - (api) [#2196](https://github.com/evmos/evmos/pull/2196) Remove governance proposals related to the deprecated `x/incentives` module to fix the governance proposals query. - (swagger) [#2218](https://github.com/evmos/evmos/pull/2218) Use correct version of proto dependencies to generate swagger. -- (inflation) [#2269](https://github.com/evmos/evmos/pull/2269) Fix inflation info returned by epoch mint provision getter. ## [v15.0.0](https://github.com/evmos/evmos/releases/tag/v15.0.0) - 2023-10-31 @@ -914,3 +933,4 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (cli) [#26](https://github.com/evmos/evmos/pull/26) Use config on genesis accounts. - (deps) [#28](https://github.com/evmos/evmos/pull/28) Bump Ethermint version to `v0.7.0`. + diff --git a/app/app.go b/app/app.go index 2bfab4e2ae..9912df7806 100644 --- a/app/app.go +++ b/app/app.go @@ -1142,11 +1142,11 @@ func (app *Evmos) setupUpgradeHandlers() { v16.UpgradeName, v16.CreateUpgradeHandler( app.mm, app.configurator, - app.EvmKeeper, - app.BankKeeper, - app.InflationKeeper, app.AccountKeeper, + app.BankKeeper, + app.EvmKeeper, app.GovKeeper, + app.InflationKeeper, ), ) diff --git a/app/upgrades/v16/proposals.go b/app/upgrades/v16/proposals.go index 0dd38a0ebc..f55ac3113a 100644 --- a/app/upgrades/v16/proposals.go +++ b/app/upgrades/v16/proposals.go @@ -9,21 +9,15 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1" + incentives "github.com/evmos/evmos/v16/x/incentives/types" ) -// deprecatedProposals is a map of the TypeURL -// of the deprecated proposal types -var deprecatedProposals = map[string]struct{}{ - "/evmos.incentives.v1.RegisterIncentiveProposal": {}, - "/evmos.incentives.v1.CancelIncentiveProposal": {}, - "/evmos.erc20.v1.RegisterCoinProposal": {}, -} - -// DeleteDeprecatedProposals deletes the RegisterCoin, RegisterIncentives & CancelIncentiveProposal -// proposals from the store because were deprecated -func DeleteDeprecatedProposals(ctx sdk.Context, gk govkeeper.Keeper, logger log.Logger) { +// DeleteIncentivesProposals deletes the RegisterIncentives & CancelIncentiveProposal proposals from the store +// because the module was deprecated +func DeleteIncentivesProposals(ctx sdk.Context, gk govkeeper.Keeper, logger log.Logger) { + // Delete the only incentives module proposals gk.IterateProposals(ctx, func(proposal govtypes.Proposal) bool { - // Check if proposal is a deprecated proposal + // Check if proposal is a RegisterIncentives or CancelIncentiveProposal proposal msgs, err := proposal.GetMsgs() if err != nil { logger.Error("failed to get proposal messages", "error", err.Error()) @@ -36,11 +30,17 @@ func DeleteDeprecatedProposals(ctx sdk.Context, gk govkeeper.Keeper, logger log. continue } - if _, deprecated := deprecatedProposals[legacyContentMsg.Content.TypeUrl]; !deprecated { + _, ok = legacyContentMsg.Content.GetCachedValue().(*incentives.RegisterIncentiveProposal) + if ok { + gk.DeleteProposal(ctx, proposal.Id) continue } - gk.DeleteProposal(ctx, proposal.Id) + _, ok = legacyContentMsg.Content.GetCachedValue().(*incentives.CancelIncentiveProposal) + if ok { + gk.DeleteProposal(ctx, proposal.Id) + continue + } } return false }) diff --git a/app/upgrades/v16/upgrades.go b/app/upgrades/v16/upgrades.go index 67ca2ddcbe..879990b857 100644 --- a/app/upgrades/v16/upgrades.go +++ b/app/upgrades/v16/upgrades.go @@ -22,11 +22,11 @@ import ( func CreateUpgradeHandler( mm *module.Manager, configurator module.Configurator, - ek *evmkeeper.Keeper, - bk bankkeeper.Keeper, - inflationKeeper inflationkeeper.Keeper, ak authkeeper.AccountKeeper, + bk bankkeeper.Keeper, + ek *evmkeeper.Keeper, gk govkeeper.Keeper, + inflationKeeper inflationkeeper.Keeper, ) upgradetypes.UpgradeHandler { return func(ctx sdk.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { logger := ctx.Logger().With("upgrade", UpgradeName) @@ -47,8 +47,7 @@ func CreateUpgradeHandler( logger.Error("failed to enable outposts", "error", err.Error()) } - // Migrate the FeeCollector module account to include the Burner permission. - // This is required when including the postHandler to burn Cosmos Tx fees + // Add Burner role to fee collector if err := MigrateFeeCollector(ak, ctx); err != nil { logger.Error("failed to migrate the fee collector", "error", err.Error()) } @@ -62,8 +61,8 @@ func CreateUpgradeHandler( } // Remove the deprecated governance proposals from store - logger.Debug("deleting deprecated proposals...") - DeleteDeprecatedProposals(ctx, gk, logger) + logger.Debug("deleting deprecated incentives module proposals...") + DeleteIncentivesProposals(ctx, gk, logger) // recovery module is deprecated logger.Debug("deleting recovery module from version map...") @@ -75,6 +74,7 @@ func CreateUpgradeHandler( // Leave modules are as-is to avoid running InitGenesis. logger.Debug("running module migrations ...") + return mm.RunMigrations(ctx, configurator, vm) } } diff --git a/app/upgrades/v16/upgrades_test.go b/app/upgrades/v16/upgrades_test.go index cef19e27e9..a83592d2da 100644 --- a/app/upgrades/v16/upgrades_test.go +++ b/app/upgrades/v16/upgrades_test.go @@ -8,8 +8,7 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/auth/types" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" govtypesv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" govtypesv1beta "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" upgrade "github.com/cosmos/cosmos-sdk/x/upgrade/types" @@ -20,32 +19,35 @@ import ( testnetwork "github.com/evmos/evmos/v16/testutil/integration/evmos/network" utiltx "github.com/evmos/evmos/v16/testutil/tx" "github.com/evmos/evmos/v16/utils" - erc20 "github.com/evmos/evmos/v16/x/erc20/types" incentives "github.com/evmos/evmos/v16/x/incentives/types" ) -func (its *IntegrationTestSuite) TestMigrateFeeCollector() { +func (its *IntegrationTestSuite) TestFeeCollectorMigration() { its.SetupTest() + context := its.network.GetContext() - feeCollectorModuleAccount := its.network.App.AccountKeeper.GetModuleAccount(its.network.GetContext(), types.FeeCollectorName) - modAcc, ok := feeCollectorModuleAccount.(*types.ModuleAccount) - its.Require().True(ok) + // get current fee collector + feeCollectorModuleAccount := its.network.App.AccountKeeper.GetModuleAccount(context, authtypes.FeeCollectorName) - oldFeeCollector := types.NewModuleAccount(modAcc.BaseAccount, types.FeeCollectorName) + modAcc, ok := feeCollectorModuleAccount.(*authtypes.ModuleAccount) + its.Require().Equal(true, ok) - its.Require().NotNil(oldFeeCollector) - its.Require().Len(oldFeeCollector.GetPermissions(), 0) + // save fee collector without burner auth + feeCollectorModuleAccountNoBurner := authtypes.NewModuleAccount(modAcc.BaseAccount, authtypes.FeeCollectorName) + its.network.App.AccountKeeper.SetModuleAccount(context, feeCollectorModuleAccountNoBurner) - // Create a new FeeCollector module account with the same address and the new permissions. - newFeeCollectorModuleAccount := types.NewModuleAccount(modAcc.BaseAccount, types.FeeCollectorName, types.Burner) - its.network.App.AccountKeeper.SetModuleAccount(its.network.GetContext(), newFeeCollectorModuleAccount) + // check fee collector is without burner auth + feeCollectorNoBurner := its.network.App.AccountKeeper.GetModuleAccount(context, authtypes.FeeCollectorName) + hasBurnerPermission := feeCollectorNoBurner.HasPermission(authtypes.Burner) + its.Require().True(!hasBurnerPermission) - newFeeCollector := its.network.App.AccountKeeper.GetModuleAccount(its.network.GetContext(), types.FeeCollectorName) - its.Require().True(ok) - its.Require().Equal(feeCollectorModuleAccount.GetAccountNumber(), newFeeCollector.GetAccountNumber()) - its.Require().Equal(feeCollectorModuleAccount.GetAddress(), newFeeCollector.GetAddress()) - its.Require().Equal(feeCollectorModuleAccount.GetName(), newFeeCollector.GetName()) - its.Require().Equal(feeCollectorModuleAccount.GetPermissions(), newFeeCollector.GetPermissions()) + err := v16.MigrateFeeCollector(its.network.App.AccountKeeper, context) + its.Require().NoError(err) + + // check fee collector has burner permission + feeCollectorAfterMigration := its.network.App.AccountKeeper.GetModuleAccount(context, authtypes.FeeCollectorName) + hasBurnerPermission = feeCollectorAfterMigration.HasPermission(authtypes.Burner) + its.Require().True(hasBurnerPermission) } func (its *IntegrationTestSuite) TestBurnUsageIncentivesPool() { @@ -82,11 +84,11 @@ func (its *IntegrationTestSuite) TestUpdateInflationParams() { its.Require().Equal(math.LegacyZeroDec(), finalParams.InflationDistribution.UsageIncentives) //nolint:staticcheck } -func (its *IntegrationTestSuite) TestDeleteDeprecatedProposals() { +func (its *IntegrationTestSuite) TestDeleteIncentivesProposals() { its.SetupTest() - // Create 4 proposals. 3 will be deleted which correspond to the deprecated proposals - expInitialProps := 4 + // Create 3 proposals. 2 will be deleted because correspond to the incentives module + expInitialProps := 3 expFinalProps := 1 prop1 := &incentives.RegisterIncentiveProposal{ Title: "Test", @@ -108,12 +110,6 @@ func (its *IntegrationTestSuite) TestDeleteDeprecatedProposals() { Contract: utiltx.GenerateAddress().String(), } - prop4 := &erc20.RegisterCoinProposal{ //nolint:staticcheck - Title: "Test", - Description: "Test Register Coin Proposal", - Metadata: []banktypes.Metadata{}, - } - privKey, _ := ethsecp256k1.GenerateKey() addrBz := privKey.PubKey().Address().Bytes() accAddr := sdk.AccAddress(addrBz) @@ -121,7 +117,7 @@ func (its *IntegrationTestSuite) TestDeleteDeprecatedProposals() { err := testutil.FundAccount(its.network.GetContext(), its.network.App.BankKeeper, accAddr, coins) its.Require().NoError(err) - for _, prop := range []govtypesv1beta.Content{prop1, prop2, prop3, prop4} { + for _, prop := range []govtypesv1beta.Content{prop1, prop2, prop3} { its.createProposal(prop, accAddr) } @@ -131,7 +127,7 @@ func (its *IntegrationTestSuite) TestDeleteDeprecatedProposals() { // Delete the corresponding proposals logger := its.network.GetContext().Logger() - v16.DeleteDeprecatedProposals(its.network.GetContext(), its.network.App.GovKeeper, logger) + v16.DeleteIncentivesProposals(its.network.GetContext(), its.network.App.GovKeeper, logger) allProposalsAfter := its.network.App.GovKeeper.GetProposals(its.network.GetContext()) its.Require().Len(allProposalsAfter, expFinalProps) diff --git a/testutil/integration/common/factory/factory.go b/testutil/integration/common/factory/factory.go index 95532518f4..ec07d59d85 100644 --- a/testutil/integration/common/factory/factory.go +++ b/testutil/integration/common/factory/factory.go @@ -1,5 +1,6 @@ // Copyright Tharsis Labs Ltd.(Evmos) // SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + package factory import ( diff --git a/testutil/integration/common/factory/helper.go b/testutil/integration/common/factory/helper.go index 0137a2c513..80b5d0f00c 100644 --- a/testutil/integration/common/factory/helper.go +++ b/testutil/integration/common/factory/helper.go @@ -1,5 +1,6 @@ // Copyright Tharsis Labs Ltd.(Evmos) // SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + package factory import ( diff --git a/x/evm/types/utils.go b/x/evm/types/utils.go index 9d2560a3a8..5d27b90192 100644 --- a/x/evm/types/utils.go +++ b/x/evm/types/utils.go @@ -1,5 +1,6 @@ // Copyright Tharsis Labs Ltd.(Evmos) // SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + package types import ( From c1dfc2a9bf2997827700e11d7ec8c8033f07b0c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Federico=20Kunze=20K=C3=BCllmer?= <31522760+fedekunze@users.noreply.github.com> Date: Tue, 30 Jan 2024 19:38:37 +0100 Subject: [PATCH 098/345] [Snyk] Security upgrade golang from 1.21.3-bullseye to 1.22rc2-bullseye (#2294) fix: tests/e2e/Dockerfile.repo to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-DEBIAN11-CURL-6100976 - https://snyk.io/vuln/SNYK-DEBIAN11-CURL-6100976 - https://snyk.io/vuln/SNYK-DEBIAN11-NGHTTP2-5953384 - https://snyk.io/vuln/SNYK-DEBIAN11-OPENSSH-1660415 - https://snyk.io/vuln/SNYK-DEBIAN11-OPENSSH-6130525 Co-authored-by: snyk-bot --- tests/e2e/Dockerfile.repo | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/e2e/Dockerfile.repo b/tests/e2e/Dockerfile.repo index 7f8ce6634a..2ee1724724 100644 --- a/tests/e2e/Dockerfile.repo +++ b/tests/e2e/Dockerfile.repo @@ -1,4 +1,4 @@ -FROM golang:1.21.3-bullseye AS build-env +FROM golang:1.22rc2-bullseye AS build-env ARG BRANCH_NAME @@ -14,7 +14,7 @@ RUN git checkout ${BRANCH_NAME} RUN make build -FROM golang:1.21.3-bullseye +FROM golang:1.22rc2-bullseye RUN apt-get update \ && apt-get install jq=1.6-2.1 -y --no-install-recommends \ From cb0e574ff7147ff22ca82f96abed57a4d6094b59 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Jan 2024 23:56:22 +0000 Subject: [PATCH 099/345] build(deps-dev): bump aiohttp from 3.9.0 to 3.9.2 in /tests/nix_tests (#2303) Bumps [aiohttp](https://github.com/aio-libs/aiohttp) from 3.9.0 to 3.9.2. - [Release notes](https://github.com/aio-libs/aiohttp/releases) - [Changelog](https://github.com/aio-libs/aiohttp/blob/master/CHANGES.rst) - [Commits](https://github.com/aio-libs/aiohttp/compare/v3.9.0...v3.9.2) --- updated-dependencies: - dependency-name: aiohttp dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> --- tests/nix_tests/poetry.lock | 155 ++++++++++++++++++------------------ 1 file changed, 78 insertions(+), 77 deletions(-) diff --git a/tests/nix_tests/poetry.lock b/tests/nix_tests/poetry.lock index 2cef45c6a6..211f86c5df 100644 --- a/tests/nix_tests/poetry.lock +++ b/tests/nix_tests/poetry.lock @@ -2,87 +2,87 @@ [[package]] name = "aiohttp" -version = "3.9.0" +version = "3.9.2" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.8" files = [ - {file = "aiohttp-3.9.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6896b8416be9ada4d22cd359d7cb98955576ce863eadad5596b7cdfbf3e17c6c"}, - {file = "aiohttp-3.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1736d87dad8ef46a8ec9cddd349fa9f7bd3a064c47dd6469c0d6763d3d49a4fc"}, - {file = "aiohttp-3.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8c9e5f4d7208cda1a2bb600e29069eecf857e6980d0ccc922ccf9d1372c16f4b"}, - {file = "aiohttp-3.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8488519aa05e636c5997719fe543c8daf19f538f4fa044f3ce94bee608817cff"}, - {file = "aiohttp-3.9.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ab16c254e2312efeb799bc3c06897f65a133b38b69682bf75d1f1ee1a9c43a9"}, - {file = "aiohttp-3.9.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7a94bde005a8f926d0fa38b88092a03dea4b4875a61fbcd9ac6f4351df1b57cd"}, - {file = "aiohttp-3.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b777c9286b6c6a94f50ddb3a6e730deec327e9e2256cb08b5530db0f7d40fd8"}, - {file = "aiohttp-3.9.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:571760ad7736b34d05597a1fd38cbc7d47f7b65deb722cb8e86fd827404d1f6b"}, - {file = "aiohttp-3.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:deac0a32aec29608eb25d730f4bc5a261a65b6c48ded1ed861d2a1852577c932"}, - {file = "aiohttp-3.9.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:4ee1b4152bc3190cc40ddd6a14715e3004944263ea208229ab4c297712aa3075"}, - {file = "aiohttp-3.9.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:3607375053df58ed6f23903aa10cf3112b1240e8c799d243bbad0f7be0666986"}, - {file = "aiohttp-3.9.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:65b0a70a25456d329a5e1426702dde67be0fb7a4ead718005ba2ca582d023a94"}, - {file = "aiohttp-3.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5a2eb5311a37fe105aa35f62f75a078537e1a9e4e1d78c86ec9893a3c97d7a30"}, - {file = "aiohttp-3.9.0-cp310-cp310-win32.whl", hash = "sha256:2cbc14a13fb6b42d344e4f27746a4b03a2cb0c1c3c5b932b0d6ad8881aa390e3"}, - {file = "aiohttp-3.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ac9669990e2016d644ba8ae4758688534aabde8dbbc81f9af129c3f5f01ca9cd"}, - {file = "aiohttp-3.9.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f8e05f5163528962ce1d1806fce763ab893b1c5b7ace0a3538cd81a90622f844"}, - {file = "aiohttp-3.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4afa8f71dba3a5a2e1e1282a51cba7341ae76585345c43d8f0e624882b622218"}, - {file = "aiohttp-3.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f929f4c9b9a00f3e6cc0587abb95ab9c05681f8b14e0fe1daecfa83ea90f8318"}, - {file = "aiohttp-3.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28185e36a78d247c55e9fbea2332d16aefa14c5276a582ce7a896231c6b1c208"}, - {file = "aiohttp-3.9.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a486ddf57ab98b6d19ad36458b9f09e6022de0381674fe00228ca7b741aacb2f"}, - {file = "aiohttp-3.9.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70e851f596c00f40a2f00a46126c95c2e04e146015af05a9da3e4867cfc55911"}, - {file = "aiohttp-3.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5b7bf8fe4d39886adc34311a233a2e01bc10eb4e842220235ed1de57541a896"}, - {file = "aiohttp-3.9.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c67a51ea415192c2e53e4e048c78bab82d21955b4281d297f517707dc836bf3d"}, - {file = "aiohttp-3.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:694df243f394629bcae2d8ed94c589a181e8ba8604159e6e45e7b22e58291113"}, - {file = "aiohttp-3.9.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3dd8119752dd30dd7bca7d4bc2a92a59be6a003e4e5c2cf7e248b89751b8f4b7"}, - {file = "aiohttp-3.9.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:eb6dfd52063186ac97b4caa25764cdbcdb4b10d97f5c5f66b0fa95052e744eb7"}, - {file = "aiohttp-3.9.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:d97c3e286d0ac9af6223bc132dc4bad6540b37c8d6c0a15fe1e70fb34f9ec411"}, - {file = "aiohttp-3.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:816f4db40555026e4cdda604a1088577c1fb957d02f3f1292e0221353403f192"}, - {file = "aiohttp-3.9.0-cp311-cp311-win32.whl", hash = "sha256:3abf0551874fecf95f93b58f25ef4fc9a250669a2257753f38f8f592db85ddea"}, - {file = "aiohttp-3.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:e18d92c3e9e22553a73e33784fcb0ed484c9874e9a3e96c16a8d6a1e74a0217b"}, - {file = "aiohttp-3.9.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:99ae01fb13a618b9942376df77a1f50c20a281390dad3c56a6ec2942e266220d"}, - {file = "aiohttp-3.9.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:05857848da443c8c12110d99285d499b4e84d59918a21132e45c3f0804876994"}, - {file = "aiohttp-3.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:317719d7f824eba55857fe0729363af58e27c066c731bc62cd97bc9c3d9c7ea4"}, - {file = "aiohttp-3.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1e3b3c107ccb0e537f309f719994a55621acd2c8fdf6d5ce5152aed788fb940"}, - {file = "aiohttp-3.9.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45820ddbb276113ead8d4907a7802adb77548087ff5465d5c554f9aa3928ae7d"}, - {file = "aiohttp-3.9.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:05a183f1978802588711aed0dea31e697d760ce9055292db9dc1604daa9a8ded"}, - {file = "aiohttp-3.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51a4cd44788ea0b5e6bb8fa704597af3a30be75503a7ed1098bc5b8ffdf6c982"}, - {file = "aiohttp-3.9.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:673343fbc0c1ac44d0d2640addc56e97a052504beacd7ade0dc5e76d3a4c16e8"}, - {file = "aiohttp-3.9.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7e8a3b79b6d186a9c99761fd4a5e8dd575a48d96021f220ac5b5fa856e5dd029"}, - {file = "aiohttp-3.9.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6777a390e41e78e7c45dab43a4a0196c55c3b8c30eebe017b152939372a83253"}, - {file = "aiohttp-3.9.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7ae5f99a32c53731c93ac3075abd3e1e5cfbe72fc3eaac4c27c9dd64ba3b19fe"}, - {file = "aiohttp-3.9.0-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:f1e4f254e9c35d8965d377e065c4a8a55d396fe87c8e7e8429bcfdeeb229bfb3"}, - {file = "aiohttp-3.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:11ca808f9a6b63485059f5f6e164ef7ec826483c1212a44f268b3653c91237d8"}, - {file = "aiohttp-3.9.0-cp312-cp312-win32.whl", hash = "sha256:de3cc86f4ea8b4c34a6e43a7306c40c1275e52bfa9748d869c6b7d54aa6dad80"}, - {file = "aiohttp-3.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:ca4fddf84ac7d8a7d0866664936f93318ff01ee33e32381a115b19fb5a4d1202"}, - {file = "aiohttp-3.9.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f09960b5bb1017d16c0f9e9f7fc42160a5a49fa1e87a175fd4a2b1a1833ea0af"}, - {file = "aiohttp-3.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8303531e2c17b1a494ffaeba48f2da655fe932c4e9a2626c8718403c83e5dd2b"}, - {file = "aiohttp-3.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4790e44f46a4aa07b64504089def5744d3b6780468c4ec3a1a36eb7f2cae9814"}, - {file = "aiohttp-3.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1d7edf74a36de0e5ca50787e83a77cf352f5504eb0ffa3f07000a911ba353fb"}, - {file = "aiohttp-3.9.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:94697c7293199c2a2551e3e3e18438b4cba293e79c6bc2319f5fd652fccb7456"}, - {file = "aiohttp-3.9.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a1b66dbb8a7d5f50e9e2ea3804b01e766308331d0cac76eb30c563ac89c95985"}, - {file = "aiohttp-3.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9623cfd9e85b76b83ef88519d98326d4731f8d71869867e47a0b979ffec61c73"}, - {file = "aiohttp-3.9.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f32c86dc967ab8c719fd229ce71917caad13cc1e8356ee997bf02c5b368799bf"}, - {file = "aiohttp-3.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f50b4663c3e0262c3a361faf440761fbef60ccdde5fe8545689a4b3a3c149fb4"}, - {file = "aiohttp-3.9.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:dcf71c55ec853826cd70eadb2b6ac62ec577416442ca1e0a97ad875a1b3a0305"}, - {file = "aiohttp-3.9.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:42fe4fd9f0dfcc7be4248c162d8056f1d51a04c60e53366b0098d1267c4c9da8"}, - {file = "aiohttp-3.9.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:76a86a9989ebf82ee61e06e2bab408aec4ea367dc6da35145c3352b60a112d11"}, - {file = "aiohttp-3.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f9e09a1c83521d770d170b3801eea19b89f41ccaa61d53026ed111cb6f088887"}, - {file = "aiohttp-3.9.0-cp38-cp38-win32.whl", hash = "sha256:a00ce44c21612d185c5275c5cba4bab8d7c1590f248638b667ed8a782fa8cd6f"}, - {file = "aiohttp-3.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:d5b9345ab92ebe6003ae11d8092ce822a0242146e6fa270889b9ba965457ca40"}, - {file = "aiohttp-3.9.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:98d21092bf2637c5fa724a428a69e8f5955f2182bff61f8036827cf6ce1157bf"}, - {file = "aiohttp-3.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:35a68cd63ca6aaef5707888f17a70c36efe62b099a4e853d33dc2e9872125be8"}, - {file = "aiohttp-3.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d7f6235c7475658acfc1769d968e07ab585c79f6ca438ddfecaa9a08006aee2"}, - {file = "aiohttp-3.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db04d1de548f7a62d1dd7e7cdf7c22893ee168e22701895067a28a8ed51b3735"}, - {file = "aiohttp-3.9.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:536b01513d67d10baf6f71c72decdf492fb7433c5f2f133e9a9087379d4b6f31"}, - {file = "aiohttp-3.9.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c8b0a6487e8109427ccf638580865b54e2e3db4a6e0e11c02639231b41fc0f"}, - {file = "aiohttp-3.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7276fe0017664414fdc3618fca411630405f1aaf0cc3be69def650eb50441787"}, - {file = "aiohttp-3.9.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:23170247ef89ffa842a02bbfdc425028574d9e010611659abeb24d890bc53bb8"}, - {file = "aiohttp-3.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b1a2ea8252cacc7fd51df5a56d7a2bb1986ed39be9397b51a08015727dfb69bd"}, - {file = "aiohttp-3.9.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2d71abc15ff7047412ef26bf812dfc8d0d1020d664617f4913df2df469f26b76"}, - {file = "aiohttp-3.9.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:2d820162c8c2bdbe97d328cd4f417c955ca370027dce593345e437b2e9ffdc4d"}, - {file = "aiohttp-3.9.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:2779f5e7c70f7b421915fd47db332c81de365678180a9f3ab404088f87ba5ff9"}, - {file = "aiohttp-3.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:366bc870d7ac61726f32a489fbe3d1d8876e87506870be66b01aeb84389e967e"}, - {file = "aiohttp-3.9.0-cp39-cp39-win32.whl", hash = "sha256:1df43596b826022b14998f0460926ce261544fedefe0d2f653e1b20f49e96454"}, - {file = "aiohttp-3.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:9c196b30f1b1aa3363a69dd69079ae9bec96c2965c4707eaa6914ba099fb7d4f"}, - {file = "aiohttp-3.9.0.tar.gz", hash = "sha256:09f23292d29135025e19e8ff4f0a68df078fe4ee013bca0105b2e803989de92d"}, + {file = "aiohttp-3.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:772fbe371788e61c58d6d3d904268e48a594ba866804d08c995ad71b144f94cb"}, + {file = "aiohttp-3.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:edd4f1af2253f227ae311ab3d403d0c506c9b4410c7fc8d9573dec6d9740369f"}, + {file = "aiohttp-3.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cfee9287778399fdef6f8a11c9e425e1cb13cc9920fd3a3df8f122500978292b"}, + {file = "aiohttp-3.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cc158466f6a980a6095ee55174d1de5730ad7dec251be655d9a6a9dd7ea1ff9"}, + {file = "aiohttp-3.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:54ec82f45d57c9a65a1ead3953b51c704f9587440e6682f689da97f3e8defa35"}, + {file = "aiohttp-3.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abeb813a18eb387f0d835ef51f88568540ad0325807a77a6e501fed4610f864e"}, + {file = "aiohttp-3.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc91d07280d7d169f3a0f9179d8babd0ee05c79d4d891447629ff0d7d8089ec2"}, + {file = "aiohttp-3.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b65e861f4bebfb660f7f0f40fa3eb9f2ab9af10647d05dac824390e7af8f75b7"}, + {file = "aiohttp-3.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:04fd8ffd2be73d42bcf55fd78cde7958eeee6d4d8f73c3846b7cba491ecdb570"}, + {file = "aiohttp-3.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3d8d962b439a859b3ded9a1e111a4615357b01620a546bc601f25b0211f2da81"}, + {file = "aiohttp-3.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:8ceb658afd12b27552597cf9a65d9807d58aef45adbb58616cdd5ad4c258c39e"}, + {file = "aiohttp-3.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:0e4ee4df741670560b1bc393672035418bf9063718fee05e1796bf867e995fad"}, + {file = "aiohttp-3.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2dec87a556f300d3211decf018bfd263424f0690fcca00de94a837949fbcea02"}, + {file = "aiohttp-3.9.2-cp310-cp310-win32.whl", hash = "sha256:3e1a800f988ce7c4917f34096f81585a73dbf65b5c39618b37926b1238cf9bc4"}, + {file = "aiohttp-3.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:ea510718a41b95c236c992b89fdfc3d04cc7ca60281f93aaada497c2b4e05c46"}, + {file = "aiohttp-3.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6aaa6f99256dd1b5756a50891a20f0d252bd7bdb0854c5d440edab4495c9f973"}, + {file = "aiohttp-3.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a27d8c70ad87bcfce2e97488652075a9bdd5b70093f50b10ae051dfe5e6baf37"}, + {file = "aiohttp-3.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:54287bcb74d21715ac8382e9de146d9442b5f133d9babb7e5d9e453faadd005e"}, + {file = "aiohttp-3.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb3d05569aa83011fcb346b5266e00b04180105fcacc63743fc2e4a1862a891"}, + {file = "aiohttp-3.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c8534e7d69bb8e8d134fe2be9890d1b863518582f30c9874ed7ed12e48abe3c4"}, + {file = "aiohttp-3.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4bd9d5b989d57b41e4ff56ab250c5ddf259f32db17159cce630fd543376bd96b"}, + {file = "aiohttp-3.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa6904088e6642609981f919ba775838ebf7df7fe64998b1a954fb411ffb4663"}, + {file = "aiohttp-3.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bda42eb410be91b349fb4ee3a23a30ee301c391e503996a638d05659d76ea4c2"}, + {file = "aiohttp-3.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:193cc1ccd69d819562cc7f345c815a6fc51d223b2ef22f23c1a0f67a88de9a72"}, + {file = "aiohttp-3.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b9f1cb839b621f84a5b006848e336cf1496688059d2408e617af33e3470ba204"}, + {file = "aiohttp-3.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:d22a0931848b8c7a023c695fa2057c6aaac19085f257d48baa24455e67df97ec"}, + {file = "aiohttp-3.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4112d8ba61fbd0abd5d43a9cb312214565b446d926e282a6d7da3f5a5aa71d36"}, + {file = "aiohttp-3.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c4ad4241b52bb2eb7a4d2bde060d31c2b255b8c6597dd8deac2f039168d14fd7"}, + {file = "aiohttp-3.9.2-cp311-cp311-win32.whl", hash = "sha256:ee2661a3f5b529f4fc8a8ffee9f736ae054adfb353a0d2f78218be90617194b3"}, + {file = "aiohttp-3.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:4deae2c165a5db1ed97df2868ef31ca3cc999988812e82386d22937d9d6fed52"}, + {file = "aiohttp-3.9.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:6f4cdba12539215aaecf3c310ce9d067b0081a0795dd8a8805fdb67a65c0572a"}, + {file = "aiohttp-3.9.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:84e843b33d5460a5c501c05539809ff3aee07436296ff9fbc4d327e32aa3a326"}, + {file = "aiohttp-3.9.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8008d0f451d66140a5aa1c17e3eedc9d56e14207568cd42072c9d6b92bf19b52"}, + {file = "aiohttp-3.9.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61c47ab8ef629793c086378b1df93d18438612d3ed60dca76c3422f4fbafa792"}, + {file = "aiohttp-3.9.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc71f748e12284312f140eaa6599a520389273174b42c345d13c7e07792f4f57"}, + {file = "aiohttp-3.9.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a1c3a4d0ab2f75f22ec80bca62385db2e8810ee12efa8c9e92efea45c1849133"}, + {file = "aiohttp-3.9.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a87aa0b13bbee025faa59fa58861303c2b064b9855d4c0e45ec70182bbeba1b"}, + {file = "aiohttp-3.9.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2cc0d04688b9f4a7854c56c18aa7af9e5b0a87a28f934e2e596ba7e14783192"}, + {file = "aiohttp-3.9.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1956e3ac376b1711c1533266dec4efd485f821d84c13ce1217d53e42c9e65f08"}, + {file = "aiohttp-3.9.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:114da29f39eccd71b93a0fcacff178749a5c3559009b4a4498c2c173a6d74dff"}, + {file = "aiohttp-3.9.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:3f17999ae3927d8a9a823a1283b201344a0627272f92d4f3e3a4efe276972fe8"}, + {file = "aiohttp-3.9.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:f31df6a32217a34ae2f813b152a6f348154f948c83213b690e59d9e84020925c"}, + {file = "aiohttp-3.9.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7a75307ffe31329928a8d47eae0692192327c599113d41b278d4c12b54e1bd11"}, + {file = "aiohttp-3.9.2-cp312-cp312-win32.whl", hash = "sha256:972b63d589ff8f305463593050a31b5ce91638918da38139b9d8deaba9e0fed7"}, + {file = "aiohttp-3.9.2-cp312-cp312-win_amd64.whl", hash = "sha256:200dc0246f0cb5405c80d18ac905c8350179c063ea1587580e3335bfc243ba6a"}, + {file = "aiohttp-3.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:158564d0d1020e0d3fe919a81d97aadad35171e13e7b425b244ad4337fc6793a"}, + {file = "aiohttp-3.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:da1346cd0ccb395f0ed16b113ebb626fa43b7b07fd7344fce33e7a4f04a8897a"}, + {file = "aiohttp-3.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:eaa9256de26ea0334ffa25f1913ae15a51e35c529a1ed9af8e6286dd44312554"}, + {file = "aiohttp-3.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1543e7fb00214fb4ccead42e6a7d86f3bb7c34751ec7c605cca7388e525fd0b4"}, + {file = "aiohttp-3.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:186e94570433a004e05f31f632726ae0f2c9dee4762a9ce915769ce9c0a23d89"}, + {file = "aiohttp-3.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d52d20832ac1560f4510d68e7ba8befbc801a2b77df12bd0cd2bcf3b049e52a4"}, + {file = "aiohttp-3.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c45e4e815ac6af3b72ca2bde9b608d2571737bb1e2d42299fc1ffdf60f6f9a1"}, + {file = "aiohttp-3.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa906b9bdfd4a7972dd0628dbbd6413d2062df5b431194486a78f0d2ae87bd55"}, + {file = "aiohttp-3.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:68bbee9e17d66f17bb0010aa15a22c6eb28583edcc8b3212e2b8e3f77f3ebe2a"}, + {file = "aiohttp-3.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4c189b64bd6d9a403a1a3f86a3ab3acbc3dc41a68f73a268a4f683f89a4dec1f"}, + {file = "aiohttp-3.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:8a7876f794523123bca6d44bfecd89c9fec9ec897a25f3dd202ee7fc5c6525b7"}, + {file = "aiohttp-3.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:d23fba734e3dd7b1d679b9473129cd52e4ec0e65a4512b488981a56420e708db"}, + {file = "aiohttp-3.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b141753be581fab842a25cb319f79536d19c2a51995d7d8b29ee290169868eab"}, + {file = "aiohttp-3.9.2-cp38-cp38-win32.whl", hash = "sha256:103daf41ff3b53ba6fa09ad410793e2e76c9d0269151812e5aba4b9dd674a7e8"}, + {file = "aiohttp-3.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:328918a6c2835861ff7afa8c6d2c70c35fdaf996205d5932351bdd952f33fa2f"}, + {file = "aiohttp-3.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5264d7327c9464786f74e4ec9342afbbb6ee70dfbb2ec9e3dfce7a54c8043aa3"}, + {file = "aiohttp-3.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:07205ae0015e05c78b3288c1517afa000823a678a41594b3fdc870878d645305"}, + {file = "aiohttp-3.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ae0a1e638cffc3ec4d4784b8b4fd1cf28968febc4bd2718ffa25b99b96a741bd"}, + {file = "aiohttp-3.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d43302a30ba1166325974858e6ef31727a23bdd12db40e725bec0f759abce505"}, + {file = "aiohttp-3.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16a967685907003765855999af11a79b24e70b34dc710f77a38d21cd9fc4f5fe"}, + {file = "aiohttp-3.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6fa3ee92cd441d5c2d07ca88d7a9cef50f7ec975f0117cd0c62018022a184308"}, + {file = "aiohttp-3.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b500c5ad9c07639d48615a770f49618130e61be36608fc9bc2d9bae31732b8f"}, + {file = "aiohttp-3.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c07327b368745b1ce2393ae9e1aafed7073d9199e1dcba14e035cc646c7941bf"}, + {file = "aiohttp-3.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:cc7d6502c23a0ec109687bf31909b3fb7b196faf198f8cff68c81b49eb316ea9"}, + {file = "aiohttp-3.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:07be2be7071723c3509ab5c08108d3a74f2181d4964e869f2504aaab68f8d3e8"}, + {file = "aiohttp-3.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:122468f6fee5fcbe67cb07014a08c195b3d4c41ff71e7b5160a7bcc41d585a5f"}, + {file = "aiohttp-3.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:00a9abcea793c81e7f8778ca195a1714a64f6d7436c4c0bb168ad2a212627000"}, + {file = "aiohttp-3.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7a9825fdd64ecac5c670234d80bb52bdcaa4139d1f839165f548208b3779c6c6"}, + {file = "aiohttp-3.9.2-cp39-cp39-win32.whl", hash = "sha256:5422cd9a4a00f24c7244e1b15aa9b87935c85fb6a00c8ac9b2527b38627a9211"}, + {file = "aiohttp-3.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:7d579dcd5d82a86a46f725458418458fa43686f6a7b252f2966d359033ffc8ab"}, + {file = "aiohttp-3.9.2.tar.gz", hash = "sha256:b0ad0a5e86ce73f5368a164c10ada10504bf91869c05ab75d982c6048217fbf7"}, ] [package.dependencies] @@ -1619,6 +1619,7 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, From e09e55bd2b67ab5428743ea408d7e0d9cd920c1f Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Wed, 31 Jan 2024 11:35:46 -0300 Subject: [PATCH 100/345] imp(tests): add parallel execution on nix tests (#2301) * imp(tests): add parallel execution on nix tests * Revert "imp(tests): add parallel execution on nix tests" This reverts commit fb1c12583cf44cb8918a9848893f51ce12beb9d2. * use matrix strategy * add nix build step * use make cmd * add nix to path * use nix abs path * refactor to use make cmd and build on all * fix typo * fix make cmd * build matrix programmatically * fix yaml * use env * refactor * fix * add print * fix matrix * fix matrix * fix matrix * add fromJson * fix * fix * fix * fix * simplify * simplify * simplify * fix syntax * test * use str * fix input * refactor * refactor * refactor * fix args * fix args in pytest * address lint issues * address lint issues * add changelog entry * address lint issues * Update scripts/run-nix-tests.sh Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> * fix lint issues --------- Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> --- .github/workflows/e2e-test.yml | 69 ++++++++++++++++++++++++++++++---- CHANGELOG.md | 1 + scripts/run-nix-tests.sh | 5 ++- 3 files changed, 66 insertions(+), 9 deletions(-) diff --git a/.github/workflows/e2e-test.yml b/.github/workflows/e2e-test.yml index ebbb6213ba..294190122e 100644 --- a/.github/workflows/e2e-test.yml +++ b/.github/workflows/e2e-test.yml @@ -27,26 +27,77 @@ jobs: - name: Test E2E run: | make test-e2e - if: env.GIT_DIFF + if: env.GIT_DIFF + test-files-matrix: + runs-on: ubuntu-latest + outputs: + test_matrix: ${{ steps.set_matrix.outputs.test_matrix }} + steps: + - uses: actions/checkout@v4 + - name: Set up test file matrix to run nix tests in parallel + id: set_matrix + run: | + cd ./tests/nix_tests || exit 1 + + # Define parallel test files + PARALLEL_TESTS=( + "test_account.py" + "test_filters.py" + "test_fee_history.py" + "test_grpc_only.py" + "test_ibc.py" + "test_no_abci_resp.py" + "test_osmosis_outpost.py" + "test_precompiles.py" + "test_priority.py" + "test_pruned_node.py" + "test_rollback.py" + "test_stride_outpost.py" + "test_storage_proof.py" + "test_zero_fee.py" + ) + + # Get all test files + # shellcheck disable=SC2207 + ALL_FILES=($(ls test_*.py)) + + # Determine remaining test files + # (the test files that will run all together in one process) + REMAINING_FILES=() + for file in "${ALL_FILES[@]}"; do + if [[ ! " ${PARALLEL_TESTS[*]} " =~ $file ]]; then + REMAINING_FILES+=("$file") + fi + done + + # Construct test matrix + # shellcheck disable=SC2076,SC2124,SC2048,SC2086,SC2089,SC2027 + TEST_FILES="[$(printf '"%s",' ${PARALLEL_TESTS[*]}) \"${REMAINING_FILES[*]}\"]" + echo "test_matrix=${TEST_FILES}" >> "$GITHUB_OUTPUT" + echo "Test matrix: ${TEST_FILES}" test-nix: + needs: test-files-matrix runs-on: ubuntu-latest + strategy: + matrix: + test_files: ${{fromJson(needs.test-files-matrix.outputs.test_matrix)}} steps: - uses: actions/checkout@v4 # TODO: create a new PAT to use here # with: - # token: ${{ secrets.E2E_PAT }} - - uses: cachix/install-nix-action@v25 + # token: ${{ secrets.E2E_PAT }} + - name: Install Nix + uses: cachix/install-nix-action@v25 with: - # pin to nix-2.13 to workaround compability issue of 2.14, - # see: https://github.com/cachix/install-nix-action/issues/161 install_url: https://releases.nixos.org/nix/nix-2.13.3/install nix_path: nixpkgs=channel:nixos-22.11 extra_nix_config: | access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} - - uses: cachix/cachix-action@v14 + - name: Setup Cachix + uses: cachix/cachix-action@v14 with: name: evmosd - authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}" + authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}" - uses: technote-space/get-diff-action@v6.1.2 with: PATTERNS: | @@ -56,8 +107,10 @@ jobs: go.sum *.toml tests/nix_tests/** - .github/workflows/e2e-test* + .github/workflows/e2e-test* - name: Run nix tests + env: + ARGS: "${{ matrix.test_files }}" run: make run-nix-tests if: env.GIT_DIFF # Commit gomod2nix changes files back to the repository if necessary diff --git a/CHANGELOG.md b/CHANGELOG.md index 283968259e..05feaa5d77 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -62,6 +62,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (tests) [#2289](https://github.com/evmos/evmos/pull/2289) Add utility to check balances during tests. - (tests) [#2296](https://github.com/evmos/evmos/pull/2296) Add custom genesis config functionality to integration setup. - (db) [#2297](https://github.com/evmos/evmos/pull/2297) Patch versionDB dependency to avoid lagging behind on OS reboot and update version check logic. +- (tests) [#2301](https://github.com/evmos/evmos/pull/2301) Run Nix tests in parallel. ## [v16.0.2](https://github.com/evmos/evmos/releases/tag/v16.0.2) - 2024-01-16 diff --git a/scripts/run-nix-tests.sh b/scripts/run-nix-tests.sh index 0b9dfdcf4d..6e8a8b1712 100755 --- a/scripts/run-nix-tests.sh +++ b/scripts/run-nix-tests.sh @@ -21,4 +21,7 @@ cd ../tests/nix_tests/hardhat npm install npm run typechain cd .. -pytest -vv -s + +# we want to pass the arguments as separate words instead of one string +# shellcheck disable=SC2086 +pytest $ARGS -vv -s From 755945a9fc0fa87ccc42498e1fe3fdd4c709be22 Mon Sep 17 00:00:00 2001 From: Freddy Caceres Date: Wed, 31 Jan 2024 10:10:39 -0500 Subject: [PATCH 101/345] fix(evm): Fix TraceTx KVGasConfig setup (#2302) * fix(evm): Fix TraceTx KVGasConfig setup * add transient config * add transientConfig to TraceTx * update changelog --------- Co-authored-by: Vladislav Varadinov --- CHANGELOG.md | 2 +- x/evm/keeper/grpc_query.go | 17 +++++++++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 05feaa5d77..d4e8f2530a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -69,6 +69,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### Bug Fixes - (inflation) [#2269](https://github.com/evmos/evmos/pull/2269) Fix inflation info returned by epoch mint provision getter. +- (evm) [#2302](https://github.com/evmos/evmos/pull/2302) Fix TraceTx KVGasConfig setup ## [v16.0.1](https://github.com/evmos/evmos/releases/tag/v16.0.1) - 2024-01-11 @@ -934,4 +935,3 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (cli) [#26](https://github.com/evmos/evmos/pull/26) Use config on genesis accounts. - (deps) [#28](https://github.com/evmos/evmos/pull/28) Bump Ethermint version to `v0.7.0`. - diff --git a/x/evm/keeper/grpc_query.go b/x/evm/keeper/grpc_query.go index b415eb055e..ce4919f559 100644 --- a/x/evm/keeper/grpc_query.go +++ b/x/evm/keeper/grpc_query.go @@ -476,7 +476,9 @@ func (k Keeper) TraceTx(c context.Context, req *types.QueryTraceTxRequest) (*typ txConfig.TxHash = ethTx.Hash() txConfig.TxIndex = uint(i) // reset gas meter for each transaction - ctx = ctx.WithGasMeter(evmostypes.NewInfiniteGasMeterWithLimit(msg.Gas())) + ctx = ctx.WithGasMeter(evmostypes.NewInfiniteGasMeterWithLimit(msg.Gas())). + WithKVGasConfig(storetypes.GasConfig{}). + WithTransientKVGasConfig(storetypes.GasConfig{}) rsp, err := k.ApplyMessageWithConfig(ctx, msg, types.NewNoOpTracer(), true, cfg, txConfig) if err != nil { continue @@ -661,9 +663,16 @@ func (k *Keeper) traceTx( } }() - // reset gas meter for tx - // to be consistent with tx execution gas meter - ctx = ctx.WithGasMeter(evmostypes.NewInfiniteGasMeterWithLimit(msg.Gas())) + // In order to be on in sync with the tx execution gas meter, + // we need to: + // 1. Reset GasMeter with InfiniteGasMeterWithLimit + // 2. Setup an empty KV gas config for gas to be calculated by opcodes + // and not kvstore actions + // 3. Setup an empty transient KV gas config for transient gas to be + // calculated by opcodes + ctx = ctx.WithGasMeter(evmostypes.NewInfiniteGasMeterWithLimit(msg.Gas())). + WithKVGasConfig(storetypes.GasConfig{}). + WithTransientKVGasConfig(storetypes.GasConfig{}) res, err := k.ApplyMessageWithConfig(ctx, msg, tracer, commitMessage, cfg, txConfig) if err != nil { return nil, 0, status.Error(codes.Internal, err.Error()) From f097735a66e25fc52f20458aa2226379e7c363cd Mon Sep 17 00:00:00 2001 From: stepit <48993133+0xstepit@users.noreply.github.com> Date: Thu, 1 Feb 2024 11:23:14 +0100 Subject: [PATCH 102/345] fix(inflation): Move inflation reduction factor in emission function (#2299) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix inflation function * move reduction factor inside inflation calculation file * fix tests * fix test * update CHANGELOG * lint * gofumpt file * Update x/inflation/v1/keeper/hooks.go --------- Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> --- .github/workflows/auto-format.yml | 3 ++ CHANGELOG.md | 6 ++- tests/e2e/upgrade/manager.go | 1 - x/inflation/v1/keeper/genesis_test.go | 3 +- x/inflation/v1/keeper/grpc_query_test.go | 7 ++- x/inflation/v1/keeper/hooks.go | 4 -- x/inflation/v1/keeper/hooks_test.go | 5 +-- x/inflation/v1/keeper/inflation.go | 8 +--- x/inflation/v1/keeper/inflation_test.go | 5 +-- x/inflation/v1/keeper/integration_test.go | 4 +- x/inflation/v1/keeper/utils_test.go | 2 +- x/inflation/v1/types/inflation_calculation.go | 38 ++++++++++++---- .../v1/types/inflation_calculation_test.go | 44 +++++++++++++------ 13 files changed, 79 insertions(+), 51 deletions(-) diff --git a/.github/workflows/auto-format.yml b/.github/workflows/auto-format.yml index 873a18c00d..a41c36b524 100644 --- a/.github/workflows/auto-format.yml +++ b/.github/workflows/auto-format.yml @@ -7,6 +7,9 @@ jobs: format-go-code: runs-on: ubuntu-latest + permissions: + contents: write + steps: - uses: actions/setup-go@v5 with: diff --git a/CHANGELOG.md b/CHANGELOG.md index d4e8f2530a..0db6ee791f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,6 +46,10 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (erc20) [#2217](https://github.com/evmos/evmos/pull/2217) Add logic to deploy token pairs contracts on genesis. - (erc20) [#2292](https://github.com/evmos/evmos/pull/2292) Revert unnecessary logic on genesis (reverts #2217). +### Bug Fixes + +- (inflation) [#2299](https://github.com/evmos/evmos/pull/2299) Fix emission function and tests. + ### Improvements - (ante) [#2028](https://github.com/evmos/evmos/pull/2028) MonoAnteHandler for EVM transaction. @@ -69,7 +73,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### Bug Fixes - (inflation) [#2269](https://github.com/evmos/evmos/pull/2269) Fix inflation info returned by epoch mint provision getter. -- (evm) [#2302](https://github.com/evmos/evmos/pull/2302) Fix TraceTx KVGasConfig setup +- (evm) [#2302](https://github.com/evmos/evmos/pull/2302) Fix TraceTx KVGasConfig setup. ## [v16.0.1](https://github.com/evmos/evmos/releases/tag/v16.0.1) - 2024-01-11 diff --git a/tests/e2e/upgrade/manager.go b/tests/e2e/upgrade/manager.go index a0b982737a..275b2ff6c2 100644 --- a/tests/e2e/upgrade/manager.go +++ b/tests/e2e/upgrade/manager.go @@ -143,7 +143,6 @@ func (m *Manager) RunNode(node *Node) error { return nil }, ) - if err != nil { stdOut, stdErr, _ := m.GetLogs(resource.Container.ID) return fmt.Errorf( diff --git a/x/inflation/v1/keeper/genesis_test.go b/x/inflation/v1/keeper/genesis_test.go index 70d5708596..259215d0f7 100644 --- a/x/inflation/v1/keeper/genesis_test.go +++ b/x/inflation/v1/keeper/genesis_test.go @@ -2,12 +2,11 @@ package keeper_test import ( "cosmossdk.io/math" - inflationkeeper "github.com/evmos/evmos/v16/x/inflation/v1/keeper" ) func (suite *KeeperTestSuite) TestInitGenesis() { // check calculated epochMintProvision at genesis epochMintProvision := suite.app.InflationKeeper.GetEpochMintProvision(suite.ctx) - expMintProvision := math.LegacyMustNewDecFromStr("847602739726027397260274.000000000000000000").Quo(math.LegacyNewDec(inflationkeeper.ReductionFactor)) + expMintProvision := math.LegacyMustNewDecFromStr("282534246575342465753425.000000000000000000") suite.Require().Equal(expMintProvision, epochMintProvision) } diff --git a/x/inflation/v1/keeper/grpc_query_test.go b/x/inflation/v1/keeper/grpc_query_test.go index 23be3b2318..281d4d19c1 100644 --- a/x/inflation/v1/keeper/grpc_query_test.go +++ b/x/inflation/v1/keeper/grpc_query_test.go @@ -7,7 +7,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" evmostypes "github.com/evmos/evmos/v16/types" - inflationkeeper "github.com/evmos/evmos/v16/x/inflation/v1/keeper" "github.com/evmos/evmos/v16/x/inflation/v1/types" ) @@ -81,7 +80,7 @@ func (suite *KeeperTestSuite) TestEpochMintProvision() { uint64(0), 365, math.LegacyOneDec(), - ).Quo(math.LegacyNewDec(inflationkeeper.ReductionFactor)) + ) req = &types.QueryEpochMintProvisionRequest{} expRes = &types.QueryEpochMintProvisionResponse{ EpochMintProvision: sdk.NewDecCoinFromDec(types.DefaultInflationDenom, defaultEpochMintProvision), @@ -183,7 +182,7 @@ func (suite *KeeperTestSuite) TestQueryInflationRate() { ctx := sdk.WrapSDKContext(suite.ctx) // the total bonded tokens for the 2 accounts initialized on the setup - bondedAmt := math.NewInt(1000100000000000000) + bondedAmt := math.NewInt(1_000_100_000_000_000_000) // Mint coins to increase supply mintDenom := suite.app.InflationKeeper.GetParams(suite.ctx).MintDenom @@ -191,7 +190,7 @@ func (suite *KeeperTestSuite) TestQueryInflationRate() { err := suite.app.InflationKeeper.MintCoins(suite.ctx, mintCoin) suite.Require().NoError(err) - expInflationRate := math.LegacyMustNewDecFromStr("154.687500000000000000").Quo(math.LegacyNewDec(inflationkeeper.ReductionFactor)) + expInflationRate := math.LegacyMustNewDecFromStr("51.562500000000000000") res, err := suite.queryClient.InflationRate(ctx, &types.QueryInflationRateRequest{}) suite.Require().NoError(err) suite.Require().Equal(expInflationRate, res.InflationRate) diff --git a/x/inflation/v1/keeper/hooks.go b/x/inflation/v1/keeper/hooks.go index e13ad82e6a..101d24298e 100644 --- a/x/inflation/v1/keeper/hooks.go +++ b/x/inflation/v1/keeper/hooks.go @@ -8,7 +8,6 @@ import ( "github.com/armon/go-metrics" - sdkmath "cosmossdk.io/math" "github.com/cosmos/cosmos-sdk/telemetry" sdk "github.com/cosmos/cosmos-sdk/types" epochstypes "github.com/evmos/evmos/v16/x/epochs/types" @@ -68,9 +67,6 @@ func (k Keeper) AfterEpochEnd(ctx sdk.Context, epochIdentifier string, epochNumb return } - // per proposal 258, subtract 2/3 of the prev issuance - epochMintProvision = epochMintProvision.Quo(sdkmath.LegacyNewDec(ReductionFactor)) - mintedCoin := sdk.Coin{ Denom: params.MintDenom, Amount: epochMintProvision.TruncateInt(), diff --git a/x/inflation/v1/keeper/hooks_test.go b/x/inflation/v1/keeper/hooks_test.go index 05adbff893..a21a5de8b9 100644 --- a/x/inflation/v1/keeper/hooks_test.go +++ b/x/inflation/v1/keeper/hooks_test.go @@ -4,10 +4,7 @@ import ( "fmt" "time" - "cosmossdk.io/math" - epochstypes "github.com/evmos/evmos/v16/x/epochs/types" - inflationkeeper "github.com/evmos/evmos/v16/x/inflation/v1/keeper" "github.com/evmos/evmos/v16/x/inflation/v1/types" ) @@ -220,7 +217,7 @@ func (suite *KeeperTestSuite) TestPeriodChangesSkippedEpochsAfterEpochEnd() { period, currentEpochPeriod, bondedRatio, - ).Quo(math.LegacyNewDec(inflationkeeper.ReductionFactor)) + ) suite.Require().Equal(expectedProvision, newProvision) // mint provisions will change suite.Require().NotEqual(newProvision.BigInt().Uint64(), originalProvision.BigInt().Uint64()) diff --git a/x/inflation/v1/keeper/inflation.go b/x/inflation/v1/keeper/inflation.go index 94bad56479..e180c387fd 100644 --- a/x/inflation/v1/keeper/inflation.go +++ b/x/inflation/v1/keeper/inflation.go @@ -13,12 +13,6 @@ import ( "github.com/evmos/evmos/v16/x/inflation/v1/types" ) -const ( - // ReductionFactor is the value used as denominator to divide the provision amount computed - // with the CalculateEpochMintProvision function. - ReductionFactor = 3 -) - // 200M token at year 4 allocated to the team var teamAlloc = math.NewInt(200_000_000).Mul(evmostypes.PowerReduction) @@ -174,5 +168,5 @@ func (k Keeper) GetEpochMintProvision(ctx sdk.Context) math.LegacyDec { k.GetPeriod(ctx), k.GetEpochsPerPeriod(ctx), k.BondedRatio(ctx), - ).Quo(math.LegacyNewDec(ReductionFactor)) + ) } diff --git a/x/inflation/v1/keeper/inflation_test.go b/x/inflation/v1/keeper/inflation_test.go index 5e32ea2b0a..8823c67acc 100644 --- a/x/inflation/v1/keeper/inflation_test.go +++ b/x/inflation/v1/keeper/inflation_test.go @@ -7,7 +7,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" evmostypes "github.com/evmos/evmos/v16/types" - inflationkeeper "github.com/evmos/evmos/v16/x/inflation/v1/keeper" "github.com/evmos/evmos/v16/x/inflation/v1/types" ) @@ -96,13 +95,13 @@ func (suite *KeeperTestSuite) TestGetCirculatingSupplyAndInflationRate() { "high supply", sdk.TokensFromConsensusPower(800_000_000, evmostypes.PowerReduction).Sub(bondedAmt), func() {}, - math.LegacyMustNewDecFromStr("51.562500000000000000").Quo(math.LegacyNewDec(inflationkeeper.ReductionFactor)), + math.LegacyMustNewDecFromStr("17.187500000000000000"), }, { "low supply", sdk.TokensFromConsensusPower(400_000_000, evmostypes.PowerReduction).Sub(bondedAmt), func() {}, - math.LegacyMustNewDecFromStr("154.687500000000000000").Quo(math.LegacyNewDec(inflationkeeper.ReductionFactor)), + math.LegacyMustNewDecFromStr("51.562500000000000000"), }, { "zero circulating supply", diff --git a/x/inflation/v1/keeper/integration_test.go b/x/inflation/v1/keeper/integration_test.go index bdab5d34dc..4b665f4632 100644 --- a/x/inflation/v1/keeper/integration_test.go +++ b/x/inflation/v1/keeper/integration_test.go @@ -11,7 +11,6 @@ import ( . "github.com/onsi/gomega" epochstypes "github.com/evmos/evmos/v16/x/epochs/types" - inflationkeeper "github.com/evmos/evmos/v16/x/inflation/v1/keeper" "github.com/evmos/evmos/v16/x/inflation/v1/types" ) @@ -298,7 +297,8 @@ var _ = Describe("Inflation", Ordered, func() { It("should recalculate the EpochMintProvision", func() { provisionAfter := s.app.InflationKeeper.GetEpochMintProvision(s.ctx) Expect(provisionAfter).ToNot(Equal(provision)) - Expect(provisionAfter).To(Equal(math.LegacyMustNewDecFromStr("159375000000000000000000000").Quo(math.LegacyNewDec(inflationkeeper.ReductionFactor)))) + + Expect(provisionAfter).To(Equal(math.LegacyMustNewDecFromStr("53125000000000000000000000"))) }) }) }) diff --git a/x/inflation/v1/keeper/utils_test.go b/x/inflation/v1/keeper/utils_test.go index c36e30ec53..75303f5081 100644 --- a/x/inflation/v1/keeper/utils_test.go +++ b/x/inflation/v1/keeper/utils_test.go @@ -25,7 +25,7 @@ func (suite *KeeperTestSuite) DoSetupTest() { header := testutil.NewHeader( 1, time.Now().UTC(), chainID, suite.consAddress, nil, nil, ) - suite.ctx = suite.app.BaseApp.NewContext(checkTx, header) + suite.ctx = suite.app.NewContext(checkTx, header) // setup query helpers queryHelper := baseapp.NewQueryServerTestHelper(suite.ctx, suite.app.InterfaceRegistry()) diff --git a/x/inflation/v1/types/inflation_calculation.go b/x/inflation/v1/types/inflation_calculation.go index cb43e355e2..3ac10c9ed0 100644 --- a/x/inflation/v1/types/inflation_calculation.go +++ b/x/inflation/v1/types/inflation_calculation.go @@ -9,7 +9,21 @@ import ( evmostypes "github.com/evmos/evmos/v16/types" ) -// CalculateEpochProvisions returns mint provision per epoch +const ( + // ReductionFactor is the value used as denominator to divide the provision amount computed + // with the CalculateEpochMintProvision function. + ReductionFactor = 3 +) + +// CalculateEpochProvisions returns mint provision per epoch. The function used to compute the +// emission is the half life times a reduction factor: +// +// f(x) = { a * (1 -r ) ^ x * [1 + maxVariance * (1 - bondedRatio / bTarget)] + c} / reductionFactor +// +// where x represents years. This means that the equation is computed fixing the number of the +// current year with respect to the starting year. Then, f(x) is computed and from this, the epoch +// emission. For example, having x=0, the tokens minted for a specific epochs are proportional to +// f(0) / numberOfEpochs. func CalculateEpochMintProvision( params Params, period uint64, @@ -23,24 +37,30 @@ func CalculateEpochMintProvision( bTarget := params.ExponentialCalculation.BondingTarget // bonding target maxVariance := params.ExponentialCalculation.MaxVariance // max percentage that inflation can be increased by - // exponentialDecay := a * (1 - r) ^ x + c + // exponentialDecay := a * (1 - r) ^ x decay := math.LegacyOneDec().Sub(r) - exponentialDecay := a.Mul(decay.Power(x)).Add(c) + exponentialDecay := a.Mul(decay.Power(x)) // bondingIncentive doesn't increase beyond bonding target (0 < b < bonding_target) if bondedRatio.GTE(bTarget) { bondedRatio = bTarget } - // bondingIncentive = 1 + max_variance - bondingRatio * (max_variance / bonding_target) - sub := bondedRatio.Mul(maxVariance.Quo(bTarget)) - bondingIncentive := math.LegacyOneDec().Add(maxVariance).Sub(sub) + // bondingIncentive = 1 + max_variance - max_variance * (bondingRatio / bonding_target) + var bondingIncentive math.LegacyDec + if maxVariance != math.LegacyZeroDec() { + sub := maxVariance.Mul(bondedRatio.Quo(bTarget)) + bondingIncentive = math.LegacyOneDec().Add(maxVariance).Sub(sub) + } else { + bondingIncentive = math.LegacyOneDec() + } - // periodProvision = exponentialDecay * bondingIncentive - periodProvision := exponentialDecay.Mul(bondingIncentive) + // reducedPeriodProvision = (exponentialDecay * bondingIncentive + c) / reductionFactor + periodProvision := exponentialDecay.Mul(bondingIncentive).Add(c) + reducedPeriodProvision := periodProvision.Quo(math.LegacyNewDec(ReductionFactor)) // epochProvision = periodProvision / epochsPerPeriod - epochProvision := periodProvision.Quo(math.LegacyNewDec(epochsPerPeriod)) + epochProvision := reducedPeriodProvision.Quo(math.LegacyNewDec(epochsPerPeriod)) // Multiply epochMintProvision with power reduction (10^18 for evmos) as the // calculation is based on `evmos` and the issued tokens need to be given in diff --git a/x/inflation/v1/types/inflation_calculation_test.go b/x/inflation/v1/types/inflation_calculation_test.go index f2b49f7dbd..7e7dd65525 100644 --- a/x/inflation/v1/types/inflation_calculation_test.go +++ b/x/inflation/v1/types/inflation_calculation_test.go @@ -34,7 +34,8 @@ func (suite *InflationTestSuite) TestCalculateEpochMintProvision() { DefaultParams(), uint64(0), math.LegacyOneDec(), - math.LegacyMustNewDecFromStr("847602739726027397260274.000000000000000000"), + // (300_000_000 * (1 - 0.5) ** 0 + 9_375_000) / 3 / 365 * 10 ** 18 + math.LegacyMustNewDecFromStr("282534246575342465753425.000000000000000000"), true, }, { @@ -42,7 +43,8 @@ func (suite *InflationTestSuite) TestCalculateEpochMintProvision() { DefaultParams(), uint64(1), math.LegacyOneDec(), - math.LegacyMustNewDecFromStr("436643835616438356164384.000000000000000000"), + // (300_000_000 * (1 - 0.5) ** 1 + 9_375_000) / 3 / 365 * 10 ** 18 + math.LegacyMustNewDecFromStr("145547945205479452054795.000000000000000000"), true, }, { @@ -50,7 +52,8 @@ func (suite *InflationTestSuite) TestCalculateEpochMintProvision() { DefaultParams(), uint64(2), math.LegacyOneDec(), - math.LegacyMustNewDecFromStr("231164383561643835616438.000000000000000000"), + // (300_000_000 * (1 - 0.5) ** 2 + 9_375_000) / 3 / 365 * 10 ** 18 + math.LegacyMustNewDecFromStr("77054794520547945205479.000000000000000000"), true, }, { @@ -58,7 +61,8 @@ func (suite *InflationTestSuite) TestCalculateEpochMintProvision() { DefaultParams(), uint64(3), math.LegacyOneDec(), - math.LegacyMustNewDecFromStr("128424657534246575342466.000000000000000000"), + // (300_000_000 * (1 - 0.5) ** 3 + 9_375_000) / 3 / 365 * 10 ** 18 + math.LegacyMustNewDecFromStr("42808219178082191780822.000000000000000000"), true, }, { @@ -66,7 +70,8 @@ func (suite *InflationTestSuite) TestCalculateEpochMintProvision() { DefaultParams(), uint64(20), math.LegacyOneDec(), - math.LegacyMustNewDecFromStr("25685715348753210410959.000000000000000000"), + // (300_000_000 * (1 - 0.5) ** 20 + 9_375_000) / 3 / 365 * 10 ** 18 + math.LegacyMustNewDecFromStr("8561905116251070205479.000000000000000000"), true, }, { @@ -74,7 +79,8 @@ func (suite *InflationTestSuite) TestCalculateEpochMintProvision() { DefaultParams(), uint64(21), math.LegacyOneDec(), - math.LegacyMustNewDecFromStr("25685323427801262739726.000000000000000000"), + // (300_000_000 * (1 - 0.5) ** 21 + 9_375_000) / 3 / 365 * 10 ** 18 + math.LegacyMustNewDecFromStr("8561774475933754280822.000000000000000000"), true, }, { @@ -82,7 +88,8 @@ func (suite *InflationTestSuite) TestCalculateEpochMintProvision() { bondingParams, uint64(0), math.LegacyZeroDec(), - math.LegacyMustNewDecFromStr("1186643835616438356164384.000000000000000000"), + // (300_000_000 * (1 - 0.5) ** 0 * (1 + 0.4)+ 9_375_000) / 3 / 365 * 10 ** 18 + math.LegacyMustNewDecFromStr("392123287671232882795743.000000000000000000"), true, }, { @@ -90,7 +97,8 @@ func (suite *InflationTestSuite) TestCalculateEpochMintProvision() { bondingParams, uint64(1), math.LegacyZeroDec(), - math.LegacyMustNewDecFromStr("611301369863013698630137.000000000000000000"), + // (300_000_000 * (1 - 0.5) ** 1 * (1 + 0.4)+ 9_375_000) / 3 / 365 * 10 ** 18 + math.LegacyMustNewDecFromStr("200342465753424660575954.000000000000000000"), true, }, { @@ -98,7 +106,8 @@ func (suite *InflationTestSuite) TestCalculateEpochMintProvision() { bondingParams, uint64(2), math.LegacyZeroDec(), - math.LegacyMustNewDecFromStr("323630136986301369863014.000000000000000000"), + // (300_000_000 * (1 - 0.5) ** 2 * (1 + 0.4)+ 9_375_000) / 3 / 365 * 10 ** 18 + math.LegacyMustNewDecFromStr("104452054794520549466059.000000000000000000"), true, }, { @@ -106,7 +115,8 @@ func (suite *InflationTestSuite) TestCalculateEpochMintProvision() { bondingParams, uint64(3), math.LegacyZeroDec(), - math.LegacyMustNewDecFromStr("179794520547945205479452.000000000000000000"), + // (300_000_000 * (1 - 0.5) ** 3 * (1 + 0.4)+ 9_375_000) / 3 / 365 * 10 ** 18 + math.LegacyMustNewDecFromStr("56506849315068493911112.000000000000000000"), true, }, { @@ -114,7 +124,8 @@ func (suite *InflationTestSuite) TestCalculateEpochMintProvision() { bondingParams, uint64(20), math.LegacyZeroDec(), - math.LegacyMustNewDecFromStr("35960001488254494575342.000000000000000000"), + // (300_000_000 * (1 - 0.5) ** 20 * (1 + 0.4)+ 9_375_000) / 3 / 365 * 10 ** 18 + math.LegacyMustNewDecFromStr("8562009628504922945212.000000000000000000"), true, }, { @@ -122,7 +133,8 @@ func (suite *InflationTestSuite) TestCalculateEpochMintProvision() { bondingParams, uint64(21), math.LegacyZeroDec(), - math.LegacyMustNewDecFromStr("35959452798921767835616.000000000000000000"), + // (300_000_000 * (1 - 0.5) ** 21 * (1 + 0.4)+ 9_375_000) / 3 / 365 * 10 ** 18 + math.LegacyMustNewDecFromStr("8561826732060680650688.000000000000000000"), true, }, } @@ -135,7 +147,13 @@ func (suite *InflationTestSuite) TestCalculateEpochMintProvision() { tc.bondedRatio, ) - suite.Require().Equal(tc.expEpochProvision, epochMintProvisions) + // Here we use a relative error because the expected values are computed with another + // software and can be slightly differences. Accepted error is less than 0.001%. + tol := math.LegacyNewDecWithPrec(1, 5) + relativeError := tc.expEpochProvision.Sub(epochMintProvisions).Abs().Quo(tc.expEpochProvision) + valid := relativeError.LTE(tol) + + suite.Require().True(valid) }) } } From be891ba7da7418fbeff6303f06b668fc08c376d6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Feb 2024 14:39:56 +0100 Subject: [PATCH 103/345] build(deps): bump crytic/slither-action from 0.3.0 to 0.3.1 (#2315) Bumps [crytic/slither-action](https://github.com/crytic/slither-action) from 0.3.0 to 0.3.1. - [Release notes](https://github.com/crytic/slither-action/releases) - [Commits](https://github.com/crytic/slither-action/compare/v0.3.0...v0.3.1) --- updated-dependencies: - dependency-name: crytic/slither-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/slither.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/slither.yml b/.github/workflows/slither.yml index f1787e958e..3b7fd2e672 100644 --- a/.github/workflows/slither.yml +++ b/.github/workflows/slither.yml @@ -23,7 +23,7 @@ jobs: cd contracts && npm i cp -r node_modules/@openzeppelin . - name: Run Slither Action - uses: crytic/slither-action@v0.3.0 + uses: crytic/slither-action@v0.3.1 continue-on-error: true id: slither with: From b9c772c7f01f3e1f860a5d593c6963eb659575f1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Feb 2024 14:42:19 +0100 Subject: [PATCH 104/345] build(deps): bump codecov/codecov-action from 3 to 4 (#2314) Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 3 to 4. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v3...v4) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index fc3da7fc03..d25bac87cc 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -35,7 +35,7 @@ jobs: run: | make test-unit-cover if: env.GIT_DIFF - - uses: codecov/codecov-action@v3 + - uses: codecov/codecov-action@v4 with: file: ./coverage.txt fail_ci_if_error: true From 15a40aec355231d376d86ba664eb7e943a4469f3 Mon Sep 17 00:00:00 2001 From: Vladislav Varadinov Date: Fri, 2 Feb 2024 14:50:21 +0200 Subject: [PATCH 105/345] chore(ci): add markdown lint and build targets for release branch (#2321) * chore(ci): add markdown lint and build targets for release branch * CHANGELOG --- .github/workflows/build.yml | 1 + .github/workflows/markdown-links.yml | 3 +++ CHANGELOG.md | 1 + 3 files changed, 5 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 96764eecdc..9f0ae26578 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,6 +3,7 @@ on: pull_request: branches: - main + - release/** jobs: cleanup-runs: diff --git a/.github/workflows/markdown-links.yml b/.github/workflows/markdown-links.yml index 9cb7eeb2a8..0e5d485988 100644 --- a/.github/workflows/markdown-links.yml +++ b/.github/workflows/markdown-links.yml @@ -1,6 +1,9 @@ name: Check Markdown links on: pull_request: + branches: + - main + - release/** jobs: markdown-link-check: diff --git a/CHANGELOG.md b/CHANGELOG.md index 0db6ee791f..f183e11ede 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -67,6 +67,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (tests) [#2296](https://github.com/evmos/evmos/pull/2296) Add custom genesis config functionality to integration setup. - (db) [#2297](https://github.com/evmos/evmos/pull/2297) Patch versionDB dependency to avoid lagging behind on OS reboot and update version check logic. - (tests) [#2301](https://github.com/evmos/evmos/pull/2301) Run Nix tests in parallel. +- (ci) [#2321](https://github.com/evmos/evmos/pull/2321) Add build and markdown lint checker for `main` and `release` branches. ## [v16.0.2](https://github.com/evmos/evmos/releases/tag/v16.0.2) - 2024-01-16 From 99b90379a16f9f5ff0a9027d010011a88ae07875 Mon Sep 17 00:00:00 2001 From: Ramiro Carlucho Date: Fri, 2 Feb 2024 10:29:06 -0300 Subject: [PATCH 106/345] chore(github): Update Issues and PR templates (#2309) * updated issues and PR templates * address pr comment * fix lint --------- Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> --- .github/ISSUE_TEMPLATE/1-bug.yml | 41 +++++++++++++++ .github/ISSUE_TEMPLATE/2-feature-request.yml | 41 +++++++++++++++ .github/ISSUE_TEMPLATE/bug_report.md | 42 --------------- .github/ISSUE_TEMPLATE/config.yml | 1 + .github/PULL_REQUEST_TEMPLATE.md | 55 ++++++-------------- 5 files changed, 100 insertions(+), 80 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/1-bug.yml create mode 100644 .github/ISSUE_TEMPLATE/2-feature-request.yml delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/config.yml diff --git a/.github/ISSUE_TEMPLATE/1-bug.yml b/.github/ISSUE_TEMPLATE/1-bug.yml new file mode 100644 index 0000000000..6e9fd286dd --- /dev/null +++ b/.github/ISSUE_TEMPLATE/1-bug.yml @@ -0,0 +1,41 @@ +name: Bug report +description: Create a report to help us squash bugs! +title: "[Bug]: " +labels: ["T:bug"] +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out this bug report! + Before smashing the submit button please review the template. + - type: checkboxes + attributes: + label: Is there an existing issue for this? + description: Please search existing issues to avoid creating duplicates. + options: + - label: I have searched the existing issues + required: true + + - type: textarea + id: what-happened + attributes: + label: What happened? + description: What did you expect to happen? If applicable add screenshots to explain your problem + placeholder: Tell us what you see! + validations: + required: true + - type: input + attributes: + label: Evmos Version + description: If applicable, specify which version you're using + placeholder: 0.16.0, 0.16.1, main, etc. + validations: + required: true + - type: textarea + id: reproduce + attributes: + label: How to reproduce? + description: If applicable could you describe how we could reproduce the bug + placeholder: Tell us what how to reproduce the bug! + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/2-feature-request.yml b/.github/ISSUE_TEMPLATE/2-feature-request.yml new file mode 100644 index 0000000000..33dbf97440 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/2-feature-request.yml @@ -0,0 +1,41 @@ +name: Feature Request +description: Create a proposal to request a feature +title: "[Feature]: " +labels: ["T:feature-request"] +body: + - type: markdown + attributes: + value: | + ✰ Thanks for opening an issue! ✰ + - type: textarea + id: summary + attributes: + label: Summary + description: | + What are the user needs? + How could this solution fix the user facing problem? + placeholder: Short, concise description of the proposed feature/changes to the repository + validations: + required: true + - type: textarea + id: issue + attributes: + label: Issue Definition + description: | + If applicable please answer the below questions + Why do we need this feature? + What issues may be addressed by introducing this feature? + What benefits does Evmos stand to gain by including this feature? + Are there any disadvantages to including this feature? + placeholder: Description of the issue being faced + validations: + required: false + - type: textarea + id: proposal + attributes: + label: Proposed Feature + description: | + Description of the proposed features or changes to an existing feature to meet your needs + placeholder: Description of the proposed feature(s) + validations: + required: true diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 8a56652455..0000000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -name: Bug Report -about: Create a report to help us squash bugs! ---- - - - - - -## Summary of Bug - - - -## Version - - - -## Steps to Reproduce - - - -## Screenshots - - - -## Additional context - - -____ - -## For Admin Use - -- [ ] Not duplicate issue -- [ ] Appropriate labels applied -- [ ] Appropriate contributors tagged -- [ ] Contributor assigned/self-assigned diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000000..3ba13e0cec --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1 @@ +blank_issues_enabled: false diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index f4ad46f481..78d590ad5d 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,48 +1,28 @@ -## Description +# Description +are the most critical to review. --> ----- + -Closes #XXX + - \ No newline at end of file +- [ ] reviewed content +- [ ] tested instructions (if applicable) +- [ ] confirmed all CI checks have passed From 8f488c1f06dcece2f5d634f4500b3f70d3b490d2 Mon Sep 17 00:00:00 2001 From: stepit <48993133+0xstepit@users.noreply.github.com> Date: Fri, 2 Feb 2024 16:40:15 +0100 Subject: [PATCH 107/345] chore(ci): Add codecov token to workflow (#2317) * add codecov token to workflow * run tests on PRs with changes to the workflow file * adjust pattern * update action version * Revert "update action version" This reverts commit e77d2b218df454d47b842b54bd0a17d0dba8f619. * update flag --------- Co-authored-by: MalteHerrmann Co-authored-by: tom Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- .github/workflows/test.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d25bac87cc..ee985e2feb 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -26,6 +26,7 @@ jobs: - uses: technote-space/get-diff-action@v6.1.2 with: PATTERNS: | + .github/workflows/test.yml **/**.sol **/**.go go.mod @@ -38,8 +39,12 @@ jobs: - uses: codecov/codecov-action@v4 with: file: ./coverage.txt - fail_ci_if_error: true + # We were getting a 500 error on codecov servers + # so we decided to avoid blocking the CI if this fails + fail_ci_if_error: false if: env.GIT_DIFF + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} test-scripts: runs-on: ubuntu-latest @@ -48,6 +53,7 @@ jobs: - uses: technote-space/get-diff-action@v6.1.2 with: PATTERNS: | + .github/workflows/test.yml ./scripts/** - name: Setup Python uses: actions/setup-python@v5 From eec726e8520ae1f2ad646c5b8b41deb6f33101d4 Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Fri, 2 Feb 2024 17:33:31 +0100 Subject: [PATCH 108/345] fix(tests): Fix post-upgrade transactions in automated upgrade tests (#2311) * fix transaction after upgrade * add balances utils * refactor module queries and send bank transfer method refactor * move transactions into own file * run gofumpt * add changelog entry * add missing license * rename file to tx_test.go --------- Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> --- CHANGELOG.md | 1 + tests/e2e/e2e_suite_test.go | 46 +++++--------------- tests/e2e/tx_test.go | 64 +++++++++++++++++++++++++++ tests/e2e/upgrade/balances.go | 49 +++++++++++++++++++++ tests/e2e/upgrade/balances_test.go | 70 ++++++++++++++++++++++++++++++ tests/e2e/upgrade/exec.go | 5 ++- tests/e2e/upgrade/manager.go | 24 ++++++++-- tests/e2e/upgrade/queryexec.go | 53 +++++++++++++++++++--- 8 files changed, 264 insertions(+), 48 deletions(-) create mode 100644 tests/e2e/tx_test.go create mode 100644 tests/e2e/upgrade/balances.go create mode 100644 tests/e2e/upgrade/balances_test.go diff --git a/CHANGELOG.md b/CHANGELOG.md index f183e11ede..f1550ca70f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -67,6 +67,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (tests) [#2296](https://github.com/evmos/evmos/pull/2296) Add custom genesis config functionality to integration setup. - (db) [#2297](https://github.com/evmos/evmos/pull/2297) Patch versionDB dependency to avoid lagging behind on OS reboot and update version check logic. - (tests) [#2301](https://github.com/evmos/evmos/pull/2301) Run Nix tests in parallel. +- (tests) [#2311](https://github.com/evmos/evmos/pull/2311) Fix post-upgrade transactions in automated upgrade tests. - (ci) [#2321](https://github.com/evmos/evmos/pull/2321) Add build and markdown lint checker for `main` and `release` branches. ## [v16.0.2](https://github.com/evmos/evmos/releases/tag/v16.0.2) - 2024-01-16 diff --git a/tests/e2e/e2e_suite_test.go b/tests/e2e/e2e_suite_test.go index 1baff3a822..90e9a9a2bc 100644 --- a/tests/e2e/e2e_suite_test.go +++ b/tests/e2e/e2e_suite_test.go @@ -266,7 +266,11 @@ func (s *IntegrationTestSuite) upgrade(targetRepo, targetVersion string) { // NOTE: This was a problem in the past, where the upgrade height was reached before the proposal actually passed. // This is a safety check to make sure this doesn't happen again, as this was not obvious from the log output. func (s *IntegrationTestSuite) checkProposalPassed(ctx context.Context) { - exec, err := s.upgradeManager.CreateModuleQueryExec("gov", "proposals", s.upgradeParams.ChainID) + exec, err := s.upgradeManager.CreateModuleQueryExec(upgrade.QueryArgs{ + Module: "gov", + SubCommand: "proposals", + ChainID: s.upgradeParams.ChainID, + }) s.Require().NoError(err, "can't create query proposals exec") outBuf, errBuf, err := s.upgradeManager.RunExec(ctx, exec) @@ -319,7 +323,11 @@ func (s *IntegrationTestSuite) executeQueries() { for _, tc := range testCases { s.T().Logf("executing %s", tc.name) - exec, err := s.upgradeManager.CreateModuleQueryExec(tc.moduleName, tc.subCommand, chainID) + exec, err := s.upgradeManager.CreateModuleQueryExec(upgrade.QueryArgs{ + Module: tc.moduleName, + SubCommand: tc.subCommand, + ChainID: chainID, + }) s.Require().NoError(err) _, errBuf, err := s.upgradeManager.RunExec(ctx, exec) @@ -329,40 +337,6 @@ func (s *IntegrationTestSuite) executeQueries() { s.T().Logf("executed all queries successfully") } -// executeTransactions executes some sample transactions to check they are still working after the upgrade. -func (s *IntegrationTestSuite) executeTransactions() { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - chainID := utils.TestnetChainID + "-1" - - // send some tokens between accounts to check transactions are still working - exec, err := s.upgradeManager.CreateModuleTxExec(upgrade.E2ETxArgs{ - ModuleName: "bank", - SubCommand: "send", - Args: []string{"mykey", "evmos1jcltmuhplrdcwp7stlr4hlhlhgd4htqh3a79sq", "10000000000aevmos"}, - ChainID: chainID, - From: "mykey", - }) - s.Require().NoError(err, "failed to create bank send tx command") - - _, errBuf, err := s.upgradeManager.RunExec(ctx, exec) - s.Require().NoError(err, "failed to execute bank send tx") - s.Require().Empty(errBuf.String()) - - // query the balances of the sending and receiving accounts to check the transaction was successful - exec, err = s.upgradeManager.CreateExec( - []string{"evmosd", "q", "bank", "balances", "evmos1jcltmuhplrdcwp7stlr4hlhlhgd4htqh3a79sq"}, - s.upgradeManager.ContainerID(), - ) - s.Require().NoError(err, "failed to create bank balances query command") - - outBuf, errBuf, err := s.upgradeManager.RunExec(ctx, exec) - s.Require().NoError(err, "failed to execute bank balances query") - s.Require().Empty(errBuf.String()) - s.Require().Contains(outBuf.String(), "10000000000aevmos") -} - // TearDownSuite kills the running container, removes the network and mount path func (s *IntegrationTestSuite) TearDownSuite() { if s.upgradeParams.SkipCleanup { diff --git a/tests/e2e/tx_test.go b/tests/e2e/tx_test.go new file mode 100644 index 0000000000..df68440071 --- /dev/null +++ b/tests/e2e/tx_test.go @@ -0,0 +1,64 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package e2e + +import ( + "context" + "regexp" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/evmos/evmos/v16/tests/e2e/upgrade" + "github.com/evmos/evmos/v16/utils" +) + +// executeTransactions executes some sample transactions to check they are still working after the upgrade. +func (s *IntegrationTestSuite) executeTransactions() { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + chainID := utils.TestnetChainID + "-1" + + // TODO: Add more transactions in future (e.g. staking precompile) + s.sendBankTransfer(ctx, chainID) +} + +// SendBankTransfer sends a bank transfer to check that the transactions are still working after the upgrade. +func (s *IntegrationTestSuite) sendBankTransfer(ctx context.Context, chainID string) { + receiver := "evmos1jcltmuhplrdcwp7stlr4hlhlhgd4htqh3a79sq" + sentCoins := sdk.Coins{sdk.NewInt64Coin("aevmos", 10000000000)} + + balancePre, err := s.upgradeManager.GetBalance(ctx, s.upgradeParams.ChainID, receiver) + s.Require().NoError(err, "can't get balance of receiver account") + + // send some tokens between accounts to check transactions are still working + exec, err := s.upgradeManager.CreateModuleTxExec(upgrade.E2ETxArgs{ + ModuleName: "bank", + SubCommand: "send", + Args: []string{"mykey", receiver, sentCoins.String()}, + ChainID: chainID, + From: "mykey", + }) + s.Require().NoError(err, "failed to create bank send tx command") + + _, errBuf, err := s.upgradeManager.RunExec(ctx, exec) + s.Require().NoError(err, "failed to execute bank send tx") + // NOTE: The only message in the errBuf that is allowed is `gas estimate: ...` + gasEstimateMatch, err := regexp.MatchString(`^\s*gas estimate: \d+\s*$`, errBuf.String()) + s.Require().NoError(err, "failed to match gas estimate message") + s.Require().True( + gasEstimateMatch, + "expected message in errBuf to be `gas estimate: ...`; got: %q\n", + errBuf.String(), + ) + + // Wait until the transaction has succeeded and is included in the chain + err = s.upgradeManager.WaitNBlocks(ctx, 2) + s.Require().NoError(err, "failed to wait for blocks") + + balancePost, err := s.upgradeManager.GetBalance(ctx, s.upgradeParams.ChainID, receiver) + s.Require().NoError(err, "can't get balance of receiver account") + + diff := balancePost.Sub(balancePre...) + s.Require().Equal(diff.String(), sentCoins.String(), "unexpected difference in bank balance") +} diff --git a/tests/e2e/upgrade/balances.go b/tests/e2e/upgrade/balances.go new file mode 100644 index 0000000000..884442fdf3 --- /dev/null +++ b/tests/e2e/upgrade/balances.go @@ -0,0 +1,49 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package upgrade + +import ( + "context" + "fmt" + + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" +) + +// GetBalance returns the account balance for the given address bech32 string through +// the CLI query. +func (m *Manager) GetBalance(ctx context.Context, chainID, address string) (sdk.Coins, error) { + queryArgs := QueryArgs{ + Module: "bank", + SubCommand: "balances", + Args: []string{address}, + ChainID: chainID, + } + + exec, err := m.CreateModuleQueryExec(queryArgs) + if err != nil { + return sdk.Coins{}, fmt.Errorf("create exec error: %w", err) + } + + outBuff, errBuff, err := m.RunExec(ctx, exec) + if err != nil { + return sdk.Coins{}, fmt.Errorf("run exec error: %w", err) + } + if errBuff.String() != "" { + return sdk.Coins{}, fmt.Errorf("evmos query error: %s", errBuff.String()) + } + + return UnpackBalancesResponse(m.ProtoCodec, outBuff.String()) +} + +// UnpackBalancesResponse unpacks the balances response from the given output of the bank balances query. +func UnpackBalancesResponse(cdc *codec.ProtoCodec, out string) (sdk.Coins, error) { + var balances banktypes.QueryAllBalancesResponse + if err := cdc.UnmarshalJSON([]byte(out), &balances); err != nil { + return sdk.Coins{}, fmt.Errorf("failed to unmarshal balances: %w", err) + } + + return balances.Balances, nil +} diff --git a/tests/e2e/upgrade/balances_test.go b/tests/e2e/upgrade/balances_test.go new file mode 100644 index 0000000000..368dadc3bd --- /dev/null +++ b/tests/e2e/upgrade/balances_test.go @@ -0,0 +1,70 @@ +package upgrade_test + +import ( + "fmt" + "testing" + + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/evmos/evmos/v16/app" + "github.com/evmos/evmos/v16/encoding" + "github.com/evmos/evmos/v16/tests/e2e/upgrade" + "github.com/stretchr/testify/require" +) + +func TestUnpackBalancesResponse(t *testing.T) { + t.Parallel() + + expAmount, ok := sdk.NewIntFromString("1000000000000000000000") + require.True(t, ok, "failed to convert amount to int") + + encodingConfig := encoding.MakeConfig(app.ModuleBasics) + protoCodec, ok := encodingConfig.Codec.(*codec.ProtoCodec) + require.True(t, ok, "failed to cast codec to proto codec") + + testcases := []struct { + name string + output string + want sdk.Coins + expPass bool + errContains string + }{ + { + name: "success", + output: fmt.Sprintf( + `{"balances":[{"denom":"aevmos","amount":"%s"}],`+ + `"pagination":{"next_key":null,"total":"0"}}`, + expAmount, + ), + want: sdk.Coins{sdk.NewCoin("aevmos", expAmount)}, + expPass: true, + }, + { + name: "pass - empty balances", + output: `{"balances":[],"pagination":{"next_key":null,"total":"0"}}`, + want: sdk.Coins{}, + expPass: true, + }, + { + name: "fail - invalid output", + output: `invalid`, + errContains: "failed to unmarshal balances", + }, + } + + for _, tc := range testcases { + tc := tc // Added for parallel testing, check https://pkg.go.dev/testing#hdr-Subtests_and_Sub_benchmarks + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + got, err := upgrade.UnpackBalancesResponse(protoCodec, tc.output) + if tc.expPass { + require.NoError(t, err, "unexpected error") + require.Equal(t, tc.want, got, "expected different balances") + } else { + require.Error(t, err, "expected error but got none") + require.ErrorContains(t, err, tc.errContains, "expected different error") + } + }) + } +} diff --git a/tests/e2e/upgrade/exec.go b/tests/e2e/upgrade/exec.go index 70828ae656..d83dca0731 100644 --- a/tests/e2e/upgrade/exec.go +++ b/tests/e2e/upgrade/exec.go @@ -28,10 +28,11 @@ func (m *Manager) CreateModuleTxExec(txArgs E2ETxArgs) (string, error) { cmd = append(cmd, fmt.Sprintf("--chain-id=%s", txArgs.ChainID), "--keyring-backend=test", - "--log_format=json", - "--fees=500aevmos", + "--output=json", + "--fees=500000000000aevmos", "--gas=auto", fmt.Sprintf("--from=%s", txArgs.From), + "--yes", ) return m.CreateExec(cmd, m.ContainerID()) } diff --git a/tests/e2e/upgrade/manager.go b/tests/e2e/upgrade/manager.go index 275b2ff6c2..aee54f7cf2 100644 --- a/tests/e2e/upgrade/manager.go +++ b/tests/e2e/upgrade/manager.go @@ -17,7 +17,10 @@ import ( "time" errorsmod "cosmossdk.io/errors" + "github.com/cosmos/cosmos-sdk/codec" "github.com/ethereum/go-ethereum/common" + "github.com/evmos/evmos/v16/app" + "github.com/evmos/evmos/v16/encoding" "github.com/ory/dockertest/v3" "github.com/ory/dockertest/v3/docker" ) @@ -42,6 +45,9 @@ type Manager struct { // proposalCounter keeps track of the number of proposals that have been submitted proposalCounter uint + // ProtoCodec is the codec used to marshal/unmarshal protobuf messages + ProtoCodec *codec.ProtoCodec + // UpgradeHeight stores the upgrade height for the latest upgrade proposal that was submitted UpgradeHeight uint } @@ -57,9 +63,17 @@ func NewManager(networkName string) (*Manager, error) { if err != nil { return nil, fmt.Errorf("docker network creation error: %w", err) } + + encodingConfig := encoding.MakeConfig(app.ModuleBasics) + protoCodec, ok := encodingConfig.Codec.(*codec.ProtoCodec) + if !ok { + return nil, fmt.Errorf("failed to get proto codec") + } + return &Manager{ - pool: pool, - network: network, + pool: pool, + network: network, + ProtoCodec: protoCodec, }, nil } @@ -323,7 +337,11 @@ func (m *Manager) getTimeoutCommit(ctx context.Context) (*big.Int, error) { // getVotingPeriod returns the voting period for the current node func (m *Manager) getVotingPeriod(ctx context.Context, chainID string) (*big.Int, error) { - exec, err := m.CreateModuleQueryExec("gov", "params", chainID) + exec, err := m.CreateModuleQueryExec(QueryArgs{ + Module: "gov", + SubCommand: "params", + ChainID: chainID, + }) if err != nil { return common.Big0, fmt.Errorf("create exec error: %w", err) } diff --git a/tests/e2e/upgrade/queryexec.go b/tests/e2e/upgrade/queryexec.go index 242f802a91..8f532ce49f 100644 --- a/tests/e2e/upgrade/queryexec.go +++ b/tests/e2e/upgrade/queryexec.go @@ -7,16 +7,55 @@ import ( "fmt" ) -// CreateModuleQueryExec creates a Evmos module query -func (m *Manager) CreateModuleQueryExec(moduleName, subCommand, chainID string) (string, error) { +// QueryArgs is a struct to hold the relevant information for the query commands. +type QueryArgs struct { + // Module is the module name to query + Module string + // SubCommand is the subcommand to query + SubCommand string + // Args are the arguments to the query command + Args []string + // ChainID is the chain ID to query + ChainID string +} + +// Validate performs basic validation on the QueryArgs. +func (q QueryArgs) Validate() error { + if q.Module == "" { + return fmt.Errorf("module cannot be empty") + } + if q.SubCommand == "" { + return fmt.Errorf("subcommand cannot be empty") + } + if q.ChainID == "" { + return fmt.Errorf("chain ID cannot be empty") + } + return nil +} + +// CreateModuleQueryExec creates a Evmos module query. +func (m *Manager) CreateModuleQueryExec(args QueryArgs) (string, error) { + // Check that valid args were provided + if err := args.Validate(); err != nil { + return "", err + } + + // Build the query command cmd := []string{ "evmosd", "q", - moduleName, - subCommand, - fmt.Sprintf("--chain-id=%s", chainID), - "--keyring-backend=test", - "--output=json", + args.Module, + args.SubCommand, + } + + if len(args.Args) > 0 { + cmd = append(cmd, args.Args...) } + + cmd = append(cmd, + fmt.Sprintf("--chain-id=%s", args.ChainID), + "--output=json", + ) + return m.CreateExec(cmd, m.ContainerID()) } From cd1cef1ae4d4b88ff738870f030f19bf8167c9f0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Feb 2024 11:54:08 +0000 Subject: [PATCH 109/345] build(deps): bump github.com/opencontainers/runc from 1.1.5 to 1.1.12 (#2310) * build(deps): bump github.com/opencontainers/runc from 1.1.5 to 1.1.12 Bumps [github.com/opencontainers/runc](https://github.com/opencontainers/runc) from 1.1.5 to 1.1.12. - [Release notes](https://github.com/opencontainers/runc/releases) - [Changelog](https://github.com/opencontainers/runc/blob/v1.1.12/CHANGELOG.md) - [Commits](https://github.com/opencontainers/runc/compare/v1.1.5...v1.1.12) --- updated-dependencies: - dependency-name: github.com/opencontainers/runc dependency-type: indirect ... Signed-off-by: dependabot[bot] * gomod2nix generate --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: tom Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- go.mod | 2 +- go.sum | 32 ++------------------------------ gomod2nix.toml | 4 ++-- 3 files changed, 5 insertions(+), 33 deletions(-) diff --git a/go.mod b/go.mod index 51055cb1ee..0905faa894 100644 --- a/go.mod +++ b/go.mod @@ -186,7 +186,7 @@ require ( github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0-rc2 // indirect - github.com/opencontainers/runc v1.1.5 // indirect + github.com/opencontainers/runc v1.1.12 // indirect github.com/pelletier/go-toml/v2 v2.0.9 // indirect github.com/petermattis/goid v0.0.0-20230518223814-80aa455d8761 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect diff --git a/go.sum b/go.sum index cf3538ba15..60df186a7b 100644 --- a/go.sum +++ b/go.sum @@ -311,7 +311,6 @@ github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghf github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= @@ -325,7 +324,6 @@ github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObk github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= -github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= @@ -357,14 +355,12 @@ github.com/cometbft/cometbft-db v0.8.0 h1:vUMDaH3ApkX8m0KZvOFFy9b5DZHBAjsnEuo9AK github.com/cometbft/cometbft-db v0.8.0/go.mod h1:6ASCP4pfhmrCBpfk01/9E1SI29nD3HfVHrY4PG8x5c0= github.com/confio/ics23/go v0.9.0 h1:cWs+wdbS2KRPZezoaaj+qBleXgUk5WOQFMP3CQFGTr4= github.com/confio/ics23/go v0.9.0/go.mod h1:4LPZ2NYqnYIVRklaozjNR1FScgDJ2s5Xrp+e/mYVRak= -github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= @@ -401,19 +397,12 @@ github.com/creachadair/taskgroup v0.4.2/go.mod h1:qiXUOSrbwAY3u0JPGTzObbE3yf9hcX github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= -github.com/crypto-org-chain/cronos/memiavl v0.0.5-0.20231027074119-c05c9c61c90e h1:1+NtTl/lzVNKXZUv41HYQ76gtxojDi6gbQrxM2lgDpo= -github.com/crypto-org-chain/cronos/memiavl v0.0.5-0.20231027074119-c05c9c61c90e/go.mod h1:PMRblIxBPdkHeEw36YxCWLO0DylfmEJYIgmdo6VgwZo= github.com/crypto-org-chain/cronos/memiavl v0.0.5-0.20240129013154-12efd9b7643f h1:1iOcVkGzlyf69VmH0HRMa6Hx5RQQiV3ojdII6sqmtcc= github.com/crypto-org-chain/cronos/memiavl v0.0.5-0.20240129013154-12efd9b7643f/go.mod h1:b2P7ilsxOWAhl9augFxBeRVeqecnQtzqfzpqsglj5ik= -github.com/crypto-org-chain/cronos/store v0.0.5-0.20231027074119-c05c9c61c90e h1:3mq9zn5+49covVejnfwPIIx0i6pzRXxKJzz4PuVVn9g= -github.com/crypto-org-chain/cronos/store v0.0.5-0.20231027074119-c05c9c61c90e/go.mod h1:N6IfJDLTTo0vxyuY4MSMMX2TOdBd/tozpjnYGJmAfmE= github.com/crypto-org-chain/cronos/store v0.0.5-0.20240129013154-12efd9b7643f h1:A9n61ZEpG2HXOMJ0Q8EHGGzEAp9IUA4E9PiydqVeJy0= github.com/crypto-org-chain/cronos/store v0.0.5-0.20240129013154-12efd9b7643f/go.mod h1:puaAzL204Ni6axMuMNfZREz9gazZbhAbb4ksRhdLBdI= -github.com/crypto-org-chain/cronos/versiondb v0.0.0-20231027074119-c05c9c61c90e h1:kN1HNLp2xmy8vIHpGWjsX8dCL6sXID2Tw4qZZk7XYd4= -github.com/crypto-org-chain/cronos/versiondb v0.0.0-20231027074119-c05c9c61c90e/go.mod h1:8W9LCw+FhR2sFI+nkjSi0ItZ0IeSyUjc6CSvuaYTU2s= github.com/crypto-org-chain/cronos/versiondb v0.0.0-20240129013154-12efd9b7643f h1:crbxFPAPS4LaTSimB4JeZF8apfDYy39E2+JFGwFEKFQ= github.com/crypto-org-chain/cronos/versiondb v0.0.0-20240129013154-12efd9b7643f/go.mod h1:8L1WprpzpqIz6erpQjd/qOvMNpYDG4qzR5vWgAqv6Jw= -github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -448,7 +437,6 @@ github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dop251/goja v0.0.0-20220405120441-9037c2b61cbf h1:Yt+4K30SdjOkRoRRm3vYNQgR+/ZIy0RmeUDZo7Y8zeQ= @@ -489,7 +477,6 @@ github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlK github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= -github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= @@ -555,7 +542,6 @@ github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MG github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= @@ -887,7 +873,6 @@ github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= -github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= github.com/moby/term v0.0.0-20221205130635-1aeaba878587 h1:HfkjXDfhgVaN5rmueG8cL8KKeFNecRCXFhaJ2qZ5SKA= github.com/moby/term v0.0.0-20221205130635-1aeaba878587/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -897,7 +882,6 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -938,10 +922,8 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0-rc2 h1:2zx/Stx4Wc5pIPDvIxHXvXtQFW/7XWJGmnM7r3wg034= github.com/opencontainers/image-spec v1.1.0-rc2/go.mod h1:3OVijpioIKYWTqjiG0zfF6wvoJ4fAXGbjdZuI2NgsRQ= -github.com/opencontainers/runc v1.1.5 h1:L44KXEpKmfWDcS02aeGm8QNTFXTo2D+8MYGDIJ/GDEs= -github.com/opencontainers/runc v1.1.5/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= -github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= +github.com/opencontainers/runc v1.1.12 h1:BOIssBaW1La0/qbNZHXOOa71dZfZEQOzW7dqQf3phss= +github.com/opencontainers/runc v1.1.12/go.mod h1:S+lQwSfncpBha7XTy/5lBwWgm5+y5Ma/O44Ekby9FK8= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -1042,7 +1024,6 @@ github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0 github.com/sasha-s/go-deadlock v0.3.1 h1:sqv7fDNShgjcaxkO0JNcOAlr8B9+cV5Ey/OB71efZx0= github.com/sasha-s/go-deadlock v0.3.1/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= @@ -1050,7 +1031,6 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= @@ -1105,7 +1085,6 @@ github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcU github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= @@ -1146,8 +1125,6 @@ github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijb github.com/urfave/cli v1.22.1 h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.10.2 h1:x3p8awjp/2arX+Nl/G2040AZpOCHS/eMJJ1/a+mye4Y= -github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= -github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= @@ -1391,7 +1368,6 @@ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1401,7 +1377,6 @@ golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1431,7 +1406,6 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1451,11 +1425,9 @@ golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/gomod2nix.toml b/gomod2nix.toml index 2ca76156a2..32753b5133 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -483,8 +483,8 @@ schema = 3 version = "v1.1.0-rc2" hash = "sha256-833S8D86IumLRpfrKBzpZCtLsTEnGBWbI3dTYd6BdFg=" [mod."github.com/opencontainers/runc"] - version = "v1.1.5" - hash = "sha256-ZbB659QpIXPXdzT2hqwrBiTd14mlgGYeWhYx39nt9RY=" + version = "v1.1.12" + hash = "sha256-YM12Tl1/9dFV9dDAImg56Cf38R+8KsTWvDd1Kh7eD7Q=" [mod."github.com/ory/dockertest/v3"] version = "v3.10.0" hash = "sha256-lu+21U7zG00tsTSXBuc2Aq8Ao320OlNxnsLA1LV0qeo=" From 4fae0fe07273e2b91a5416c50d9174a630e349f3 Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Mon, 5 Feb 2024 09:34:54 -0300 Subject: [PATCH 110/345] chore(dep): bump go to 1.21 (#2319) * bump go to 1.21 * add changelog entry * add changelog entry * update chglog * address lint issues --------- Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> --- .github/workflows/ante-benchmark.yml | 2 +- .github/workflows/auto-format.yml | 2 +- .github/workflows/build.yml | 2 +- .github/workflows/dependencies.yml | 2 +- .github/workflows/e2e-test-release.yml | 2 +- .github/workflows/e2e-test.yml | 2 +- .github/workflows/goreleaser.yml | 2 +- .github/workflows/lint.yml | 2 +- .github/workflows/solidity-test.yml | 2 +- .github/workflows/test.yml | 2 +- .golangci.yml | 2 +- CHANGELOG.md | 1 + Makefile | 2 +- default.nix | 8 +++++++- go.mod | 2 +- go.sum | 27 ++++++++++++++++++++++++++ networks/local/evmos/Dockerfile | 9 ++++++--- nix/default.nix | 18 ++++++++--------- 18 files changed, 63 insertions(+), 26 deletions(-) diff --git a/.github/workflows/ante-benchmark.yml b/.github/workflows/ante-benchmark.yml index ad38854938..8e7a6cfb44 100644 --- a/.github/workflows/ante-benchmark.yml +++ b/.github/workflows/ante-benchmark.yml @@ -19,7 +19,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v5 with: - go-version: '1.20' + go-version: '1.21' check-latest: true if: env.GIT_DIFF - name: Run benchmark tests diff --git a/.github/workflows/auto-format.yml b/.github/workflows/auto-format.yml index a41c36b524..9f9c72d897 100644 --- a/.github/workflows/auto-format.yml +++ b/.github/workflows/auto-format.yml @@ -13,7 +13,7 @@ jobs: steps: - uses: actions/setup-go@v5 with: - go-version: "1.20" + go-version: "1.21" check-latest: true - uses: actions/checkout@v4 with: diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9f0ae26578..bc9f02dfc1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -20,7 +20,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: '1.20' + go-version: '1.21' check-latest: true - uses: technote-space/get-diff-action@v6.1.2 id: git_diff diff --git a/.github/workflows/dependencies.yml b/.github/workflows/dependencies.yml index 52482aba49..3acc5739fb 100644 --- a/.github/workflows/dependencies.yml +++ b/.github/workflows/dependencies.yml @@ -10,7 +10,7 @@ jobs: steps: - uses: actions/setup-go@v5 with: - go-version: '1.20' + go-version: '1.21' check-latest: true - name: "Checkout Repository" uses: actions/checkout@v4 diff --git a/.github/workflows/e2e-test-release.yml b/.github/workflows/e2e-test-release.yml index db971a35e0..46291f14b2 100644 --- a/.github/workflows/e2e-test-release.yml +++ b/.github/workflows/e2e-test-release.yml @@ -13,7 +13,7 @@ jobs: steps: - uses: actions/setup-go@v5 with: - go-version: '1.20' + go-version: '1.21' check-latest: true - uses: actions/checkout@v4 - name: Test E2E diff --git a/.github/workflows/e2e-test.yml b/.github/workflows/e2e-test.yml index 294190122e..11405f3b96 100644 --- a/.github/workflows/e2e-test.yml +++ b/.github/workflows/e2e-test.yml @@ -10,7 +10,7 @@ jobs: steps: - uses: actions/setup-go@v5 with: - go-version: '1.20' + go-version: '1.21' check-latest: true - uses: actions/checkout@v4 - uses: technote-space/get-diff-action@v6.1.2 diff --git a/.github/workflows/goreleaser.yml b/.github/workflows/goreleaser.yml index 37e9650783..7c55cdd1fe 100644 --- a/.github/workflows/goreleaser.yml +++ b/.github/workflows/goreleaser.yml @@ -15,7 +15,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: '1.20' + go-version: '1.21' check-latest: true - name: release dry run run: make release-dry-run diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 5804dc5e72..f9db99febf 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -13,7 +13,7 @@ jobs: # Required: setup-go, for all versions v3.0.0+ of golangci-lint - uses: actions/setup-go@v5 with: - go-version: '1.20' + go-version: '1.21' check-latest: true - uses: actions/checkout@v4 - uses: technote-space/get-diff-action@v6.1.2 diff --git a/.github/workflows/solidity-test.yml b/.github/workflows/solidity-test.yml index 18ce2717fa..86adb96edb 100644 --- a/.github/workflows/solidity-test.yml +++ b/.github/workflows/solidity-test.yml @@ -11,7 +11,7 @@ jobs: steps: - uses: actions/setup-go@v5 with: - go-version: '1.20' + go-version: '1.21' check-latest: true - uses: actions/checkout@v4 - uses: technote-space/get-diff-action@v6.1.2 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ee985e2feb..83362af140 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -20,7 +20,7 @@ jobs: steps: - uses: actions/setup-go@v5 with: - go-version: '1.20' + go-version: '1.21' check-latest: true - uses: actions/checkout@v4 - uses: technote-space/get-diff-action@v6.1.2 diff --git a/.golangci.yml b/.golangci.yml index 44644c5f50..1f36f7db6e 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -50,7 +50,7 @@ linters-settings: require-explanation: false require-specific: false gofumpt: - lang-version: "1.20" + lang-version: "1.21" gomodguard: blocked: versions: # List of blocked module version constraints diff --git a/CHANGELOG.md b/CHANGELOG.md index f1550ca70f..95bbe2689b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -68,6 +68,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (db) [#2297](https://github.com/evmos/evmos/pull/2297) Patch versionDB dependency to avoid lagging behind on OS reboot and update version check logic. - (tests) [#2301](https://github.com/evmos/evmos/pull/2301) Run Nix tests in parallel. - (tests) [#2311](https://github.com/evmos/evmos/pull/2311) Fix post-upgrade transactions in automated upgrade tests. +- (build) [#2319](https://github.com/evmos/evmos/pull/2319) Bump go.mod golang version to v1.21. - (ci) [#2321](https://github.com/evmos/evmos/pull/2321) Add build and markdown lint checker for `main` and `release` branches. ## [v16.0.2](https://github.com/evmos/evmos/releases/tag/v16.0.2) - 2024-01-16 diff --git a/Makefile b/Makefile index 8e3c30dab6..8bfe384b2a 100644 --- a/Makefile +++ b/Makefile @@ -551,7 +551,7 @@ localnet-show-logstream: ############################################################################### PACKAGE_NAME:=github.com/evmos/evmos -GOLANG_CROSS_VERSION = v1.20 +GOLANG_CROSS_VERSION = v1.21 GOPATH ?= '$(HOME)/go' release-dry-run: docker run \ diff --git a/default.nix b/default.nix index f922e6b2cf..e1a2b24a5d 100644 --- a/default.nix +++ b/default.nix @@ -20,10 +20,16 @@ let "-X github.com/cosmos/cosmos-sdk/types.DBBackend=${dbBackend}" ]); buildInputs = lib.optionals (dbBackend == "rocksdb") [ rocksdb ]; + # use a newer version of nixpkgs to get go_1_21 + # We're not updating this on the whole setup because breaks other stuff + # but we can import the needed packages from the newer version + nixpkgsUrl = "https://github.com/NixOS/nixpkgs/archive/23.11.tar.gz"; + nixpkgs = import (fetchTarball nixpkgsUrl) {}; + go_1_21 = nixpkgs.pkgs.go_1_21; in buildGoApplication rec { inherit pname version buildInputs tags ldflags; - go = buildPackages.go_1_20; + go = go_1_21; src = ./.; modules = ./gomod2nix.toml; doCheck = false; diff --git a/go.mod b/go.mod index 0905faa894..1742203ebe 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/evmos/evmos/v16 -go 1.20 +go 1.21 require ( cosmossdk.io/api v0.3.1 diff --git a/go.sum b/go.sum index 60df186a7b..2ac0ac6597 100644 --- a/go.sum +++ b/go.sum @@ -231,6 +231,7 @@ github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNu github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/adlio/schema v1.3.3 h1:oBJn8I02PyTB466pZO1UZEn1TV5XLlifBSyMrmHl/1I= +github.com/adlio/schema v1.3.3/go.mod h1:1EsRssiv9/Ce2CMzq5DoL7RiMshhuigQxrR4DMV9fHg= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -295,6 +296,7 @@ github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA= +github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8= github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= @@ -306,6 +308,7 @@ github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8 github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= +github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -397,6 +400,7 @@ github.com/creachadair/taskgroup v0.4.2/go.mod h1:qiXUOSrbwAY3u0JPGTzObbE3yf9hcX github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= +github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/crypto-org-chain/cronos/memiavl v0.0.5-0.20240129013154-12efd9b7643f h1:1iOcVkGzlyf69VmH0HRMa6Hx5RQQiV3ojdII6sqmtcc= github.com/crypto-org-chain/cronos/memiavl v0.0.5-0.20240129013154-12efd9b7643f/go.mod h1:b2P7ilsxOWAhl9augFxBeRVeqecnQtzqfzpqsglj5ik= github.com/crypto-org-chain/cronos/store v0.0.5-0.20240129013154-12efd9b7643f h1:A9n61ZEpG2HXOMJ0Q8EHGGzEAp9IUA4E9PiydqVeJy0= @@ -413,6 +417,7 @@ github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsP github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= @@ -474,10 +479,13 @@ github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSw github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= +github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= @@ -494,6 +502,7 @@ github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -526,6 +535,7 @@ github.com/go-sourcemap/sourcemap v2.1.3+incompatible h1:W1iEw64niKVGogNgBN3ePyL github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= @@ -553,6 +563,7 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog= +github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= @@ -621,12 +632,14 @@ github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= github.com/google/orderedcode v0.0.1/go.mod h1:iVyU4/qPKHY5h/wSd6rZZCDcLJNxiWO6dvsYES2Sb20= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= @@ -706,6 +719,7 @@ github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoP github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= +github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= @@ -770,6 +784,7 @@ github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+ github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jhump/protoreflect v1.15.1 h1:HUMERORf3I3ZdX05WaQ6MIpd/NJ434hTp5YiKgfCL6c= +github.com/jhump/protoreflect v1.15.1/go.mod h1:jD/2GMKKE6OqX8qTjhADU1e6DShO+gavG9e0Q693nKo= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= @@ -873,6 +888,8 @@ github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= +github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= +github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= github.com/moby/term v0.0.0-20221205130635-1aeaba878587 h1:HfkjXDfhgVaN5rmueG8cL8KKeFNecRCXFhaJ2qZ5SKA= github.com/moby/term v0.0.0-20221205130635-1aeaba878587/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -898,6 +915,7 @@ github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OS github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= @@ -909,6 +927,7 @@ github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo/v2 v2.15.0 h1:79HwNRBAZHOEwrczrgSOPy+eFTTlIGELKy5as+ClttY= github.com/onsi/ginkgo/v2 v2.15.0/go.mod h1:HlxMHtYF57y6Dpf+mc5529KKmSq9h2FpCF+/ZkwUxKM= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= @@ -933,6 +952,7 @@ github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJ github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA= +github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= github.com/ory/dockertest/v3 v3.10.0 h1:4K3z2VMe8Woe++invjaTB7VRyQXQy5UY+loujO4aNE4= github.com/ory/dockertest/v3 v3.10.0/go.mod h1:nr57ZbRWMqfsdGdFNLHz5jjNdDb7VVFnzAeW1n5N1Lg= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= @@ -951,6 +971,7 @@ github.com/petermattis/goid v0.0.0-20230518223814-80aa455d8761/go.mod h1:pxMtw7c github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -1125,6 +1146,9 @@ github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijb github.com/urfave/cli v1.22.1 h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.10.2 h1:x3p8awjp/2arX+Nl/G2040AZpOCHS/eMJJ1/a+mye4Y= +github.com/urfave/cli/v2 v2.10.2/go.mod h1:f8iq5LtQ/bLxafbdBSLPPNsgaW0l/2fYYEHhAyPlwvo= +github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= +github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= @@ -1135,6 +1159,7 @@ github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQ github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -1487,6 +1512,7 @@ golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1836,6 +1862,7 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= +gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/networks/local/evmos/Dockerfile b/networks/local/evmos/Dockerfile index c2aa401928..ebc85a4667 100644 --- a/networks/local/evmos/Dockerfile +++ b/networks/local/evmos/Dockerfile @@ -1,9 +1,12 @@ -FROM golang:1.20-bullseye as build-env +FROM golang:1.22rc2-bullseye as build-env # Install minimum necessary dependencies ENV PACKAGES curl make git libc-dev bash gcc +# Ignoring the lint about pinning version because +# the build breaks whenever a new version comes out +# hadolint ignore=DL3008 RUN apt-get update && apt-get upgrade -y && \ - apt-get install -y $PACKAGES + apt-get install -y $PACKAGES --no-install-recommends # Set working directory for the build WORKDIR /go/src/github.com/evmos/evmos @@ -15,7 +18,7 @@ COPY . . RUN make build-linux # Final image -FROM golang:1.20-bullseye as final +FROM golang:1.22rc2-bullseye as final WORKDIR / diff --git a/nix/default.nix b/nix/default.nix index 0be206799c..db72430d2b 100644 --- a/nix/default.nix +++ b/nix/default.nix @@ -1,16 +1,16 @@ { sources ? import ./sources.nix, system ? builtins.currentSystem, ... }: - +let + # use a newer version of nixpkgs to get go_1_21 + # We're not updating this on the whole setup because breaks other stuff + # but we can import the needed packages from the newer version + nixpkgsUrl = "https://github.com/NixOS/nixpkgs/archive/23.11.tar.gz"; + nixpkgs = import (fetchTarball nixpkgsUrl) {}; + go_1_21 = nixpkgs.pkgs.go_1_21; +in import sources.nixpkgs { overlays = [ (final: pkgs: rec { - go_1_20 = pkgs.go_1_20.overrideAttrs (_: rec { - version = "1.20.2"; - src = final.fetchurl { - url = "https://go.dev/dl/go${version}.src.tar.gz"; - hash = "sha256-TQ4oUNGXtN2tO9sBljABedCVuzrv1N+8OzZwLDco+Ks="; - }; - }); - go = go_1_20; + go = go_1_21; go-ethereum = pkgs.callPackage ./go-ethereum.nix { inherit (pkgs.darwin) libobjc; inherit (pkgs.darwin.apple_sdk.frameworks) IOKit; From c014196a913290078ca7af0dcbb5a5310625e791 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Feb 2024 12:51:47 +0000 Subject: [PATCH 111/345] build(deps): bump github.com/cosmos/ibc-go/v7 from 7.3.1 to 7.3.2 (#2305) * build(deps): bump github.com/cosmos/ibc-go/v7 from 7.3.1 to 7.3.2 Bumps [github.com/cosmos/ibc-go/v7](https://github.com/cosmos/ibc-go) from 7.3.1 to 7.3.2. - [Release notes](https://github.com/cosmos/ibc-go/releases) - [Changelog](https://github.com/cosmos/ibc-go/blob/v7.3.2/CHANGELOG.md) - [Commits](https://github.com/cosmos/ibc-go/compare/v7.3.1...v7.3.2) --- updated-dependencies: - dependency-name: github.com/cosmos/ibc-go/v7 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * gomod2nix generate --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: tom Co-authored-by: Vladislav Varadinov Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> --- go.mod | 29 ++++++++++++---------- go.sum | 65 ++++++++++++++++++++++++++++---------------------- gomod2nix.toml | 59 ++++++++++++++++++++++++++------------------- 3 files changed, 86 insertions(+), 67 deletions(-) diff --git a/go.mod b/go.mod index 1742203ebe..cd574e115b 100644 --- a/go.mod +++ b/go.mod @@ -11,13 +11,13 @@ require ( github.com/armon/go-metrics v0.4.1 github.com/btcsuite/btcd v0.24.0 github.com/btcsuite/btcd/btcutil v1.1.5 - github.com/cometbft/cometbft v0.37.3-0.20230920093934-46df7b597e3c + github.com/cometbft/cometbft v0.37.4 github.com/cometbft/cometbft-db v0.8.0 github.com/cosmos/cosmos-proto v1.0.0-beta.3 - github.com/cosmos/cosmos-sdk v0.47.5 + github.com/cosmos/cosmos-sdk v0.47.8 github.com/cosmos/go-bip39 v1.0.0 github.com/cosmos/gogoproto v1.4.10 - github.com/cosmos/ibc-go/v7 v7.3.1 + github.com/cosmos/ibc-go/v7 v7.3.2 github.com/crypto-org-chain/cronos/memiavl v0.0.5-0.20240129013154-12efd9b7643f github.com/crypto-org-chain/cronos/store v0.0.5-0.20240129013154-12efd9b7643f github.com/crypto-org-chain/cronos/versiondb v0.0.0-20240129013154-12efd9b7643f @@ -49,21 +49,21 @@ require ( golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb golang.org/x/net v0.20.0 golang.org/x/text v0.14.0 - google.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f + google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0 google.golang.org/grpc v1.61.0 google.golang.org/protobuf v1.32.0 sigs.k8s.io/yaml v1.4.0 ) require ( - cloud.google.com/go v0.110.10 // indirect + cloud.google.com/go v0.111.0 // indirect cloud.google.com/go/compute v1.23.3 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect cloud.google.com/go/iam v1.1.5 // indirect cloud.google.com/go/storage v1.30.1 // indirect cosmossdk.io/core v0.6.1 // indirect cosmossdk.io/depinject v1.0.0-alpha.4 // indirect - cosmossdk.io/log v1.2.1 // indirect + cosmossdk.io/log v1.3.0 // indirect filippo.io/edwards25519 v1.0.0 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect github.com/99designs/keyring v1.2.1 // indirect @@ -95,7 +95,7 @@ require ( github.com/cosmos/gogogateway v1.2.0 // indirect github.com/cosmos/iavl v0.21.0-alpha.1.0.20230904092046-df3db2d96583 // indirect github.com/cosmos/ics23/go v0.10.0 // indirect - github.com/cosmos/ledger-cosmos-go v0.12.2 // indirect + github.com/cosmos/ledger-cosmos-go v0.12.4 // indirect github.com/cosmos/rosetta-sdk-go v0.10.0 // indirect github.com/creachadair/taskgroup v0.4.2 // indirect github.com/danieljoos/wincred v1.1.2 // indirect @@ -123,6 +123,7 @@ require ( github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/go-logr/logr v1.3.0 // indirect + github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-sourcemap/sourcemap v2.1.3+incompatible // indirect github.com/go-stack/stack v1.8.1 // indirect @@ -173,7 +174,7 @@ require ( github.com/magiconair/properties v1.8.7 // indirect github.com/manifoldco/promptui v0.9.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.19 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.9 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect @@ -198,7 +199,7 @@ require ( github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/rjeczalik/notify v0.9.3 // indirect github.com/rogpeppe/go-internal v1.11.0 // indirect - github.com/rs/zerolog v1.30.0 // indirect + github.com/rs/zerolog v1.31.0 // indirect github.com/sasha-s/go-deadlock v0.3.1 // indirect github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect github.com/sirupsen/logrus v1.9.0 // indirect @@ -222,19 +223,21 @@ require ( github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect github.com/zbiljic/go-filelock v0.0.0-20170914061330-1dbf7103ab7d // indirect - github.com/zondax/ledger-go v0.14.1 // indirect + github.com/zondax/ledger-go v0.14.3 // indirect go.etcd.io/bbolt v1.3.7 // indirect + go.opentelemetry.io/otel v1.19.0 // indirect + go.opentelemetry.io/otel/metric v1.19.0 // indirect + go.opentelemetry.io/otel/trace v1.19.0 // indirect golang.org/x/mod v0.14.0 // indirect golang.org/x/oauth2 v0.14.0 // indirect golang.org/x/sync v0.5.0 // indirect golang.org/x/sys v0.16.0 // indirect golang.org/x/term v0.16.0 // indirect golang.org/x/tools v0.16.1 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/api v0.149.0 // indirect google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect + google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index 2ac0ac6597..706a8ca600 100644 --- a/go.sum +++ b/go.sum @@ -32,8 +32,8 @@ cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w9 cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.110.10 h1:LXy9GEO+timppncPIAZoOj3l58LIU9k+kn48AN7IO3Y= -cloud.google.com/go v0.110.10/go.mod h1:v1OoFqYxiBkUrruItNM3eT4lLByNjxmJSV/xDKJNnic= +cloud.google.com/go v0.111.0 h1:YHLKNupSD1KqjDbQ3+LVdQ81h/UJbJyZG203cEfnQgM= +cloud.google.com/go v0.111.0/go.mod h1:0mibmpKP1TyOOFYQY5izo0LnT+ecvOQ0Sg3OdmMiNRU= cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= @@ -195,8 +195,8 @@ cosmossdk.io/depinject v1.0.0-alpha.4 h1:PLNp8ZYAMPTUKyG9IK2hsbciDWqna2z1Wsl98ok cosmossdk.io/depinject v1.0.0-alpha.4/go.mod h1:HeDk7IkR5ckZ3lMGs/o91AVUc7E596vMaOmslGFM3yU= cosmossdk.io/errors v1.0.1 h1:bzu+Kcr0kS/1DuPBtUFdWjzLqyUuCiyHjyJB6srBV/0= cosmossdk.io/errors v1.0.1/go.mod h1:MeelVSZThMi4bEakzhhhE/CKqVv3nOJDA25bIqRDu/U= -cosmossdk.io/log v1.2.1 h1:Xc1GgTCicniwmMiKwDxUjO4eLhPxoVdI9vtMW8Ti/uk= -cosmossdk.io/log v1.2.1/go.mod h1:GNSCc/6+DhFIj1aLn/j7Id7PaO8DzNylUZoOYBL9+I4= +cosmossdk.io/log v1.3.0 h1:L0Z0XstClo2kOU4h3V1iDoE5Ji64sg5HLOogzGg67Oo= +cosmossdk.io/log v1.3.0/go.mod h1:HIDyvWLqZe2ovlWabsDN4aPMpY/nUEquAhgfTf2ZzB8= cosmossdk.io/math v1.2.0 h1:8gudhTkkD3NxOP2YyyJIYYmt6dQ55ZfJkDOaxXpy7Ig= cosmossdk.io/math v1.2.0/go.mod h1:l2Gnda87F0su8a/7FEKJfFdJrM0JZRXQaohlgJeyQh0= cosmossdk.io/simapp v0.0.0-20230608160436-666c345ad23d h1:E/8y0oG3u9hBR8l4F9MtC0LdZIamPCUwUoLlrHrX86I= @@ -352,8 +352,8 @@ github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZ github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/coinbase/rosetta-sdk-go/types v1.0.0 h1:jpVIwLcPoOeCR6o1tU+Xv7r5bMONNbHU7MuEHboiFuA= github.com/coinbase/rosetta-sdk-go/types v1.0.0/go.mod h1:eq7W2TMRH22GTW0N0beDnN931DW0/WOI1R2sdHNHG4c= -github.com/cometbft/cometbft v0.37.3-0.20230920093934-46df7b597e3c h1:o3vkm7zuHKPELQPzThaKpsglhGjK91FH1voA6w+WNEE= -github.com/cometbft/cometbft v0.37.3-0.20230920093934-46df7b597e3c/go.mod h1:gC4iJBO09opzl1pLiPl4fYWn8rRrfO713rRM5tZn5E4= +github.com/cometbft/cometbft v0.37.4 h1:xyvvEqlyfK8MgNIIKVJaMsuIp03wxOcFmVkT26+Ikpg= +github.com/cometbft/cometbft v0.37.4/go.mod h1:Cmg5Hp4sNpapm7j+x0xRyt2g0juQfmB752ous+pA0G8= github.com/cometbft/cometbft-db v0.8.0 h1:vUMDaH3ApkX8m0KZvOFFy9b5DZHBAjsnEuo9AKVZpjo= github.com/cometbft/cometbft-db v0.8.0/go.mod h1:6ASCP4pfhmrCBpfk01/9E1SI29nD3HfVHrY4PG8x5c0= github.com/confio/ics23/go v0.9.0 h1:cWs+wdbS2KRPZezoaaj+qBleXgUk5WOQFMP3CQFGTr4= @@ -380,14 +380,14 @@ github.com/cosmos/gogoproto v1.4.10 h1:QH/yT8X+c0F4ZDacDv3z+xE3WU1P1Z3wQoLMBRJoK github.com/cosmos/gogoproto v1.4.10/go.mod h1:3aAZzeRWpAwr+SS/LLkICX2/kDFyaYVzckBDzygIxek= github.com/cosmos/iavl v0.21.0-alpha.1.0.20230904092046-df3db2d96583 h1:3Matt7/LjZiZkIBPalYazOZcw2B05Ch14dU5TJyqJEc= github.com/cosmos/iavl v0.21.0-alpha.1.0.20230904092046-df3db2d96583/go.mod h1:WO7FyvaZJoH65+HFOsDir7xU9FWk2w9cHXNW1XHcl7A= -github.com/cosmos/ibc-go/v7 v7.3.1 h1:bil1IjnHdyWDASFYKfwdRiNtFP6WK3osW7QFEAgU4I8= -github.com/cosmos/ibc-go/v7 v7.3.1/go.mod h1:wvx4pPBofe5ZdMNV3OFRxSI4auEP5Qfqf8JXLLNV04g= +github.com/cosmos/ibc-go/v7 v7.3.2 h1:FeUDcBX7VYY0e0iRmcVkPPUjYfAqIc//QuHXo8JHz9c= +github.com/cosmos/ibc-go/v7 v7.3.2/go.mod h1:IMeOXb7gwpZ+/nOG5BuUkdW4weM1ezvN4PQPws4uzOI= github.com/cosmos/ics23/go v0.10.0 h1:iXqLLgp2Lp+EdpIuwXTYIQU+AiHj9mOC2X9ab++bZDM= github.com/cosmos/ics23/go v0.10.0/go.mod h1:ZfJSmng/TBNTBkFemHHHj5YY7VAU/MBU980F4VU1NG0= github.com/cosmos/keyring v1.2.0 h1:8C1lBP9xhImmIabyXW4c3vFjjLiBdGCmfLUfeZlV1Yo= github.com/cosmos/keyring v1.2.0/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA= -github.com/cosmos/ledger-cosmos-go v0.12.2 h1:/XYaBlE2BJxtvpkHiBm97gFGSGmYGKunKyF3nNqAXZA= -github.com/cosmos/ledger-cosmos-go v0.12.2/go.mod h1:ZcqYgnfNJ6lAXe4HPtWgarNEY+B74i+2/8MhZw4ziiI= +github.com/cosmos/ledger-cosmos-go v0.12.4 h1:drvWt+GJP7Aiw550yeb3ON/zsrgW0jgh5saFCr7pDnw= +github.com/cosmos/ledger-cosmos-go v0.12.4/go.mod h1:fjfVWRf++Xkygt9wzCsjEBdjcf7wiiY35fv3ctT+k4M= github.com/cosmos/rosetta-sdk-go v0.10.0 h1:E5RhTruuoA7KTIXUcMicL76cffyeoyvNybzUGSKFTcM= github.com/cosmos/rosetta-sdk-go v0.10.0/go.mod h1:SImAZkb96YbwvoRkzSMQB6noNJXFgWl/ENIznEoYQI4= github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= @@ -519,8 +519,11 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= @@ -852,15 +855,14 @@ github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3v github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= @@ -889,7 +891,6 @@ github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyua github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= -github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= github.com/moby/term v0.0.0-20221205130635-1aeaba878587 h1:HfkjXDfhgVaN5rmueG8cL8KKeFNecRCXFhaJ2qZ5SKA= github.com/moby/term v0.0.0-20221205130635-1aeaba878587/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -1033,8 +1034,8 @@ github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.30.0 h1:SymVODrcRsaRaSInD9yQtKbtWqwsfoPcRff/oRXLj4c= -github.com/rs/zerolog v1.30.0/go.mod h1:/tk+P47gFdPXq4QYjvCmT5/Gsug2nagsFWBWhAiSi1w= +github.com/rs/zerolog v1.31.0 h1:FcTR3NnLWW+NnTwwhFWiJSZr4ECLpqCm6QsEnyvbV4A= +github.com/rs/zerolog v1.31.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -1147,8 +1148,6 @@ github.com/urfave/cli v1.22.1 h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.10.2 h1:x3p8awjp/2arX+Nl/G2040AZpOCHS/eMJJ1/a+mye4Y= github.com/urfave/cli/v2 v2.10.2/go.mod h1:f8iq5LtQ/bLxafbdBSLPPNsgaW0l/2fYYEHhAyPlwvo= -github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= -github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= @@ -1170,8 +1169,8 @@ github.com/zbiljic/go-filelock v0.0.0-20170914061330-1dbf7103ab7d h1:XQyeLr7N9iY github.com/zbiljic/go-filelock v0.0.0-20170914061330-1dbf7103ab7d/go.mod h1:hoMeDjlNXTNqVwrCk8YDyaBS2g5vFfEX2ezMi4vb6CY= github.com/zondax/hid v0.9.2 h1:WCJFnEDMiqGF64nlZz28E9qLVZ0KSJ7xpc5DLEyma2U= github.com/zondax/hid v0.9.2/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= -github.com/zondax/ledger-go v0.14.1 h1:Pip65OOl4iJ84WTpA4BKChvOufMhhbxED3BaihoZN4c= -github.com/zondax/ledger-go v0.14.1/go.mod h1:fZ3Dqg6qcdXWSOJFKMG8GCTnD7slO/RL2feOQv8K320= +github.com/zondax/ledger-go v0.14.3 h1:wEpJt2CEcBJ428md/5MgSLsXLBos98sBOyxNmCjfUCw= +github.com/zondax/ledger-go v0.14.3/go.mod h1:IKKaoxupuB43g4NxeQmbLXv7T9AlQyie1UpHb342ycI= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= @@ -1187,6 +1186,14 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs= +go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= +go.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE= +go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= +go.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o= +go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= +go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg= +go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -1451,7 +1458,6 @@ golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1481,6 +1487,7 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -1757,12 +1764,12 @@ google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqw google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg= -google.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic= -google.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f h1:2yNACc1O40tTnrsbk9Cv6oxiW8pxI/pXj0wRtdlYmgY= -google.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f/go.mod h1:Uy9bTZJqmfrw2rIBxgGLnamc78euZULUBrLZ9XTITKI= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA= +google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917 h1:nz5NESFLZbJGPFxDT/HCn+V1mZ8JGNoY4nUpmW/Y2eg= +google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917/go.mod h1:pZqR+glSb11aJ+JQcczCvgf47+duRuzNSKqE8YAQnV0= +google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0 h1:s1w3X6gQxwrLEpxnLd/qXTVLgQE2yXwaOaoa6IlY/+o= +google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0/go.mod h1:CAny0tYF+0/9rmDB9fahA9YLzX3+AEVl1qXbv5hhj6c= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1 h1:gphdwh0npgs8elJ4T6J+DQJHPVF7RsuJHCfwztUb4J4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1/go.mod h1:daQN87bsDqDoe316QbbvX60nMoJQa4r6Ds0ZuoAe5yA= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -1861,8 +1868,8 @@ gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= -gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= -gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/gomod2nix.toml b/gomod2nix.toml index 32753b5133..f6f28e4baa 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -2,8 +2,8 @@ schema = 3 [mod] [mod."cloud.google.com/go"] - version = "v0.110.10" - hash = "sha256-D+V6LaCiCdthJ6W0s220Dyqa7/iReEIv5vqxtOGvy/A=" + version = "v0.111.0" + hash = "sha256-i8tQyny5W/PcPY5W5h2Zo6wKDKgYHpQlK77QU9TUdI4=" [mod."cloud.google.com/go/compute"] version = "v1.23.3" hash = "sha256-WwlTw/x9GSM6B4nHm9FDvHZ1Pd4KN0wxk650CosJnpQ=" @@ -29,8 +29,8 @@ schema = 3 version = "v1.0.1" hash = "sha256-MgTocXkBzri9FKkNtkARJXPmxRrRO/diQJS5ZzvYrJY=" [mod."cosmossdk.io/log"] - version = "v1.2.1" - hash = "sha256-2Mb0jQ5Yvi+2fvhCVEiiacwODXM8+6vhsKOnHz+wsiY=" + version = "v1.3.0" + hash = "sha256-ti835PlPIWxP8c2Drfo5asi2Kd6kBkmXaadQZ/BiMqw=" [mod."cosmossdk.io/math"] version = "v1.2.0" hash = "sha256-yLPUAsJPQxuI0C22cPbP/BzclWb9eBzGFntGDQmdVUc=" @@ -126,8 +126,8 @@ schema = 3 version = "v1.0.0" hash = "sha256-z/0E0NiEGo7zxM7d94ImgUf8P0/KG6hbP9T4Vuym4p0=" [mod."github.com/cometbft/cometbft"] - version = "v0.37.3-0.20230920093934-46df7b597e3c" - hash = "sha256-142EHlufWebjs4MvQ7LHBo7duqJHVIV394xuEPrr0zA=" + version = "v0.37.4" + hash = "sha256-rEzIdkxeE5FsIGwvzZiPdifPr0v9SmKHQw78I7v2WUA=" [mod."github.com/cometbft/cometbft-db"] version = "v0.8.0" hash = "sha256-Tlm2V9zDs/wVoFvMmJSdCzCdZKiFRC7Qk8FS3FaqQyk=" @@ -160,14 +160,14 @@ schema = 3 version = "v0.21.0-alpha.1.0.20230904092046-df3db2d96583" hash = "sha256-3Va8Ljq63IXty0oHlRpqfsC6WsMut6TWZ2R+/nYtfTU=" [mod."github.com/cosmos/ibc-go/v7"] - version = "v7.3.1" - hash = "sha256-5lRAQaQRscTMVKeKlsiWtLFauK/gjL9cD7gTJgUbddQ=" + version = "v7.3.2" + hash = "sha256-nzfVl2BNqrQCcKBBf5bq47EUuVCcEeg6cBEyfG/5XKM=" [mod."github.com/cosmos/ics23/go"] version = "v0.10.0" hash = "sha256-KYEv727BO/ht63JO02xiKFGFAddg41Ve9l2vSSZZBq0=" [mod."github.com/cosmos/ledger-cosmos-go"] - version = "v0.12.2" - hash = "sha256-fLkveUWxn0nZzvgsY0KTU/T1TUUQ8Ap6XTYSnJs6XXo=" + version = "v0.12.4" + hash = "sha256-SYABql9QYhuZaNxRnvfHw/KqDTTzjYWgzbN7PDKVmGA=" [mod."github.com/cosmos/rosetta-sdk-go"] version = "v0.10.0" hash = "sha256-WmLq9E9mYV+ms6Tdb43lCoAy6cowkDnK4bvX/ApDzLY=" @@ -266,6 +266,9 @@ schema = 3 [mod."github.com/go-logr/logr"] version = "v1.3.0" hash = "sha256-N8JYtQlwpLWTaCczfhfA/YmHExko0ObPMYVGw8JwbSw=" + [mod."github.com/go-logr/stdr"] + version = "v1.2.2" + hash = "sha256-rRweAP7XIb4egtT1f2gkz4sYOu7LDHmcJ5iNsJUd0sE=" [mod."github.com/go-ole/go-ole"] version = "v1.2.6" hash = "sha256-+oxitLeJxYF19Z6g+6CgmCHJ1Y5D8raMi2Cb3M6nXCs=" @@ -438,8 +441,8 @@ schema = 3 version = "v0.1.13" hash = "sha256-qb3Qbo0CELGRIzvw7NVM1g/aayaz4Tguppk9MD2/OI8=" [mod."github.com/mattn/go-isatty"] - version = "v0.0.19" - hash = "sha256-wYQqGxeqV3Elkmn26Md8mKZ/viw598R4Ych3vtt72YE=" + version = "v0.0.20" + hash = "sha256-qhw9hWtU5wnyFyuMbKx+7RB8ckQaFQ8D+8GKPkN3HHQ=" [mod."github.com/mattn/go-runewidth"] version = "v0.0.9" hash = "sha256-dK/kIPe1tcxEubwI4CWfov/HWRBgD/fqlPC3d5i30CY=" @@ -531,8 +534,8 @@ schema = 3 version = "v1.10.1" hash = "sha256-um4INJM5/675MLK42npIsDbSQ1/Iy5ZiUNuAFReUfeM=" [mod."github.com/rs/zerolog"] - version = "v1.30.0" - hash = "sha256-fOJEpuiJmsp9ONqvmPGOyoBEDfJHBfUH8liiRCWDe1E=" + version = "v1.31.0" + hash = "sha256-OF4VM+Rv6M5EAaUVD2nOzcbZLQ4b7OAMteyyTqIoU0M=" [mod."github.com/sasha-s/go-deadlock"] version = "v0.3.1" hash = "sha256-2CBEi9/iN/OMt7wEIG+hRjgDH6CRWIgibGGGy1dQ78I=" @@ -628,14 +631,23 @@ schema = 3 version = "v0.9.2" hash = "sha256-9h1gEJ/loyaJvu9AsmslztiA8U9ixDTC6TBw9lCU2BE=" [mod."github.com/zondax/ledger-go"] - version = "v0.14.1" - hash = "sha256-iQmShSaty50yYTbYPNd4fnOyrcEG7P2fWmj+fLJQW4s=" + version = "v0.14.3" + hash = "sha256-tldEok5ebZ4R4B7H8dSlYS5oVuLvh89n9wUaVlDjYwg=" [mod."go.etcd.io/bbolt"] version = "v1.3.7" hash = "sha256-poZk8tPLDWwW95oCOkTJcQtEvOJTD9UXAZ2TqGJutwk=" [mod."go.opencensus.io"] version = "v0.24.0" hash = "sha256-4H+mGZgG2c9I1y0m8avF4qmt8LUKxxVsTqR8mKgP4yo=" + [mod."go.opentelemetry.io/otel"] + version = "v1.19.0" + hash = "sha256-y51fwO/y73QBdwwRnCp+wrvVuWLeqfSnU/I8i4mBK84=" + [mod."go.opentelemetry.io/otel/metric"] + version = "v1.19.0" + hash = "sha256-eYeeR8XUPjoF6lY3Yg1VUL0dPum/18KAcpo5k6zY67E=" + [mod."go.opentelemetry.io/otel/trace"] + version = "v1.19.0" + hash = "sha256-EVsShx1IO0zpMztSfqYQ32Gm+hV4wrVM8wWkEfHOaoM=" [mod."golang.org/x/crypto"] version = "v0.18.0" hash = "sha256-BuMVUxOIyfLo8MOhqYt+uQ8NDN6P2KdblKyfPxINzQ4=" @@ -666,9 +678,6 @@ schema = 3 [mod."golang.org/x/tools"] version = "v0.16.1" hash = "sha256-zIAwVvY/5/rPDebMDpR67CR7b+GtFmGWw6AOhxIkcfI=" - [mod."golang.org/x/xerrors"] - version = "v0.0.0-20220907171357-04be3eba64a2" - hash = "sha256-6+zueutgefIYmgXinOflz8qGDDDj0Zhv+2OkGhBTKno=" [mod."google.golang.org/api"] version = "v0.149.0" hash = "sha256-nR3mk7wAsjvMEGsOiPKvqQwt789m6a+BDThpfTx0doA=" @@ -676,14 +685,14 @@ schema = 3 version = "v1.6.8" hash = "sha256-decMa0MiWfW/Bzr8QPPzzpeya0YWGHhZAt4Cr/bD1wQ=" [mod."google.golang.org/genproto"] - version = "v0.0.0-20231211222908-989df2bf70f3" - hash = "sha256-7DvusxTmchjQbVzN4ph4p5EYvfQQwDg+lo9nk8qDwXY=" + version = "v0.0.0-20240102182953-50ed04b92917" + hash = "sha256-iTzbVZIeGfcI/ZnDJqJZDxBCJ2J6vlYVdpE7wJX0sXI=" [mod."google.golang.org/genproto/googleapis/api"] - version = "v0.0.0-20231120223509-83a465c0220f" - hash = "sha256-hWz9HrHPPPmWxOZ+VdpayDHCN79UMxrnQ66wTDE1lvY=" - [mod."google.golang.org/genproto/googleapis/rpc"] version = "v0.0.0-20231212172506-995d672761c0" - hash = "sha256-48aeFcLvuthyG7x9JmpeySrBkOqRhu+FgECjt1167IY=" + hash = "sha256-K85oYmTXZlQ+dOtyL4k1Oy6Qql2uqRUBOk+9TvRlPpE=" + [mod."google.golang.org/genproto/googleapis/rpc"] + version = "v0.0.0-20240108191215-35c7eff3a6b1" + hash = "sha256-bwWoFG+H827aJ3VunK7emdQz3BQlTTjWlM513kTZqSo=" [mod."google.golang.org/grpc"] version = "v1.61.0" hash = "sha256-+LvlQyeIaM0GgOQoa3rVmM9OS0UtbdK54Fvl3dgJEt8=" From 4e73d19d312113f66694ac74c6601ab23dd45cf8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Feb 2024 11:26:33 -0300 Subject: [PATCH 112/345] build(deps): bump github.com/linxGnu/grocksdb from 1.8.11 to 1.8.12 (#2304) * build(deps): bump github.com/linxGnu/grocksdb from 1.8.11 to 1.8.12 Bumps [github.com/linxGnu/grocksdb](https://github.com/linxGnu/grocksdb) from 1.8.11 to 1.8.12. - [Release notes](https://github.com/linxGnu/grocksdb/releases) - [Commits](https://github.com/linxGnu/grocksdb/compare/v1.8.11...v1.8.12) --- updated-dependencies: - dependency-name: github.com/linxGnu/grocksdb dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * gomod2nix generate --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: tom Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index cd574e115b..6674a10ad7 100644 --- a/go.mod +++ b/go.mod @@ -29,7 +29,7 @@ require ( github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/hashicorp/go-version v1.6.0 github.com/improbable-eng/grpc-web v0.15.0 - github.com/linxGnu/grocksdb v1.8.11 + github.com/linxGnu/grocksdb v1.8.12 github.com/onsi/ginkgo/v2 v2.15.0 github.com/onsi/gomega v1.31.1 github.com/ory/dockertest/v3 v3.10.0 diff --git a/go.sum b/go.sum index 706a8ca600..41827f194c 100644 --- a/go.sum +++ b/go.sum @@ -846,8 +846,8 @@ github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6 github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/linxGnu/grocksdb v1.8.11 h1:BGol9e5gB1BrsTvOxloC88pe70TCqgrfLNwkyWW0kD8= -github.com/linxGnu/grocksdb v1.8.11/go.mod h1:xZCIb5Muw+nhbDK4Y5UJuOrin5MceOuiXkVUR7vp4WY= +github.com/linxGnu/grocksdb v1.8.12 h1:1/pCztQUOa3BX/1gR3jSZDoaKFpeHFvQ1XrqZpSvZVo= +github.com/linxGnu/grocksdb v1.8.12/go.mod h1:xZCIb5Muw+nhbDK4Y5UJuOrin5MceOuiXkVUR7vp4WY= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= diff --git a/gomod2nix.toml b/gomod2nix.toml index f6f28e4baa..cb35dbb16e 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -429,8 +429,8 @@ schema = 3 version = "v0.1.0" hash = "sha256-wQqGTtRWsfR9n0O/SXHVgECebbnNmHddxJIbG63OJBQ=" [mod."github.com/linxGnu/grocksdb"] - version = "v1.8.11" - hash = "sha256-R2svcOUzENb2o9r8lxohUYn61FCQO7ZyWkV9wjtpoXY=" + version = "v1.8.12" + hash = "sha256-1tlgs/JnopLI8eoWJlv9hP4jf0OTm1qMZTSg0jAkG7A=" [mod."github.com/magiconair/properties"] version = "v1.8.7" hash = "sha256-XQ2bnc2s7/IH3WxEO4GishZurMyKwEclZy1DXg+2xXc=" From e0529484b0e242f2c5d612b6f5a68b0578fca7c1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Feb 2024 12:24:21 -0300 Subject: [PATCH 113/345] build(deps): bump github.com/cometbft/cometbft-db from 0.8.0 to 0.10.0 (#2298) * build(deps): bump github.com/cometbft/cometbft-db from 0.8.0 to 0.10.0 Bumps [github.com/cometbft/cometbft-db](https://github.com/cometbft/cometbft-db) from 0.8.0 to 0.10.0. - [Release notes](https://github.com/cometbft/cometbft-db/releases) - [Changelog](https://github.com/cometbft/cometbft-db/blob/main/CHANGELOG.md) - [Commits](https://github.com/cometbft/cometbft-db/compare/v0.8.0...v0.10.0) --- updated-dependencies: - dependency-name: github.com/cometbft/cometbft-db dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * remove deprecated replacement on pebbledb build * update dockerfile * gomod2nix generate --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: tom Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- Dockerfile | 8 +++----- Makefile | 4 ---- go.mod | 6 ++++-- go.sum | 14 ++++++++++---- gomod2nix.toml | 14 ++++++++++---- 5 files changed, 27 insertions(+), 19 deletions(-) diff --git a/Dockerfile b/Dockerfile index 0ffd52a791..940d722f6d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,16 +17,14 @@ COPY . . RUN mkdir -p /target/usr/lib /target/usr/local/lib /target/usr/include -RUN if [ "$DB_BACKEND" = "pebbledb" ]; then \ - make build-pebbledb; \ -elif [ "$DB_BACKEND" = "rocksdb" ]; then \ +RUN if [ "$DB_BACKEND" = "rocksdb" ]; then \ make build-rocksdb; \ cp -r /usr/lib/* /target/usr/lib/ && \ cp -r /usr/local/lib/* /target/usr/local/lib/ && \ cp -r /usr/include/* /target/usr/include/; \ else \ - # Build default binary (LevelDB) - make build; \ + # Build default binary with corresponding db backend + COSMOS_BUILD_OPTIONS=$DB_BACKEND make build; \ fi RUN go install github.com/MinseokOh/toml-cli@latest diff --git a/Makefile b/Makefile index 8bfe384b2a..0b8e50f4f4 100644 --- a/Makefile +++ b/Makefile @@ -176,10 +176,6 @@ build-docker: echo 'docker run -it --rm -v $${SCRIPT_PATH}/.evmosd:/home/evmos/.evmosd $$IMAGE_NAME evmosd "$$@"' >> ./build/evmosd chmod +x ./build/evmosd -build-pebbledb: - @go mod edit -replace github.com/cometbft/cometbft-db=github.com/notional-labs/cometbft-db@pebble - @go mod tidy - COSMOS_BUILD_OPTIONS=pebbledb $(MAKE) build build-rocksdb: # Make sure to run this command with root permission diff --git a/go.mod b/go.mod index 6674a10ad7..1469ee6538 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/btcsuite/btcd v0.24.0 github.com/btcsuite/btcd/btcutil v1.1.5 github.com/cometbft/cometbft v0.37.4 - github.com/cometbft/cometbft-db v0.8.0 + github.com/cometbft/cometbft-db v0.10.0 github.com/cosmos/cosmos-proto v1.0.0-beta.3 github.com/cosmos/cosmos-sdk v0.47.8 github.com/cosmos/go-bip39 v1.0.0 @@ -69,6 +69,7 @@ require ( github.com/99designs/keyring v1.2.1 // indirect github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect github.com/ChainSafe/go-schnorrkel v1.0.0 // indirect + github.com/DataDog/zstd v1.5.2 // indirect github.com/Microsoft/go-winio v0.6.0 // indirect github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect github.com/StackExchange/wmi v1.2.1 // indirect @@ -87,6 +88,7 @@ require ( github.com/cockroachdb/apd/v2 v2.0.2 // indirect github.com/cockroachdb/errors v1.10.0 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect + github.com/cockroachdb/pebble v1.0.0 // indirect github.com/cockroachdb/redact v1.1.5 // indirect github.com/coinbase/rosetta-sdk-go/types v1.0.0 // indirect github.com/confio/ics23/go v0.9.0 // indirect @@ -224,7 +226,7 @@ require ( github.com/xeipuuv/gojsonschema v1.2.0 // indirect github.com/zbiljic/go-filelock v0.0.0-20170914061330-1dbf7103ab7d // indirect github.com/zondax/ledger-go v0.14.3 // indirect - go.etcd.io/bbolt v1.3.7 // indirect + go.etcd.io/bbolt v1.3.8 // indirect go.opentelemetry.io/otel v1.19.0 // indirect go.opentelemetry.io/otel/metric v1.19.0 // indirect go.opentelemetry.io/otel/trace v1.19.0 // indirect diff --git a/go.sum b/go.sum index 41827f194c..e01bdfd4a8 100644 --- a/go.sum +++ b/go.sum @@ -215,6 +215,8 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym github.com/ChainSafe/go-schnorrkel v1.0.0 h1:3aDA67lAykLaG1y3AOjs88dMxC88PgUuHRrLeDnvGIM= github.com/ChainSafe/go-schnorrkel v1.0.0/go.mod h1:dpzHYVxLZcp8pjlV+O+UR8K0Hp/z7vcchBSbMBEhCw4= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= +github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE= @@ -343,10 +345,14 @@ github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWH github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= +github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.10.0 h1:lfxS8zZz1+OjtV4MtNWgboi/W5tyLEB6VQZBXN+0VUU= github.com/cockroachdb/errors v1.10.0/go.mod h1:lknhIsEVQ9Ss/qKDBQS/UqFSvPQjOwNq2qyKAxtHRqE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/pebble v1.0.0 h1:WZWlV/s78glZbY2ylUITDOWSVBD3cLjcWPLRPFbHNYg= +github.com/cockroachdb/pebble v1.0.0/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= @@ -354,8 +360,8 @@ github.com/coinbase/rosetta-sdk-go/types v1.0.0 h1:jpVIwLcPoOeCR6o1tU+Xv7r5bMONN github.com/coinbase/rosetta-sdk-go/types v1.0.0/go.mod h1:eq7W2TMRH22GTW0N0beDnN931DW0/WOI1R2sdHNHG4c= github.com/cometbft/cometbft v0.37.4 h1:xyvvEqlyfK8MgNIIKVJaMsuIp03wxOcFmVkT26+Ikpg= github.com/cometbft/cometbft v0.37.4/go.mod h1:Cmg5Hp4sNpapm7j+x0xRyt2g0juQfmB752ous+pA0G8= -github.com/cometbft/cometbft-db v0.8.0 h1:vUMDaH3ApkX8m0KZvOFFy9b5DZHBAjsnEuo9AKVZpjo= -github.com/cometbft/cometbft-db v0.8.0/go.mod h1:6ASCP4pfhmrCBpfk01/9E1SI29nD3HfVHrY4PG8x5c0= +github.com/cometbft/cometbft-db v0.10.0 h1:VMBQh88zXn64jXVvj39tlu/IgsGR84T7ImjS523DCiU= +github.com/cometbft/cometbft-db v0.10.0/go.mod h1:7RR7NRv99j7keWJ5IkE9iZibUTKYdtepXTp7Ra0FxKk= github.com/confio/ics23/go v0.9.0 h1:cWs+wdbS2KRPZezoaaj+qBleXgUk5WOQFMP3CQFGTr4= github.com/confio/ics23/go v0.9.0/go.mod h1:4LPZ2NYqnYIVRklaozjNR1FScgDJ2s5Xrp+e/mYVRak= github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= @@ -1172,8 +1178,8 @@ github.com/zondax/hid v0.9.2/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWp github.com/zondax/ledger-go v0.14.3 h1:wEpJt2CEcBJ428md/5MgSLsXLBos98sBOyxNmCjfUCw= github.com/zondax/ledger-go v0.14.3/go.mod h1:IKKaoxupuB43g4NxeQmbLXv7T9AlQyie1UpHb342ycI= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= -go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= +go.etcd.io/bbolt v1.3.8 h1:xs88BrvEv273UsB79e0hcVrlUWmS0a8upikMFhSyAtA= +go.etcd.io/bbolt v1.3.8/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= diff --git a/gomod2nix.toml b/gomod2nix.toml index cb35dbb16e..c712260aaa 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -56,6 +56,9 @@ schema = 3 [mod."github.com/ChainSafe/go-schnorrkel"] version = "v1.0.0" hash = "sha256-atJ2waz124m0DVHjol8v3NfCLKidU3fYu5AgzT9xCBA=" + [mod."github.com/DataDog/zstd"] + version = "v1.5.2" + hash = "sha256-LVkZHLG8O4CzmqyQVbGn+0r6AKIMABej8a4HKMFw/xo=" [mod."github.com/Microsoft/go-winio"] version = "v0.6.0" hash = "sha256-TQ0AvXZfuT3PDnb4p/h5zmyT8m9VPcwxlXMJuVD6ltE=" @@ -119,6 +122,9 @@ schema = 3 [mod."github.com/cockroachdb/logtags"] version = "v0.0.0-20230118201751-21c54148d20b" hash = "sha256-7dQH6j1o99fuxHKkw0RhNC5wJKkvRLMDJpUiVnDx6h8=" + [mod."github.com/cockroachdb/pebble"] + version = "v1.0.0" + hash = "sha256-oIMajhqta96d74XxTvMizFmtlPQ/QGIKg+cUzH/1ycU=" [mod."github.com/cockroachdb/redact"] version = "v1.1.5" hash = "sha256-0rtT7LRO0wxf9XovOK8GXRrhmx8OcbdPK/mXOKbJdog=" @@ -129,8 +135,8 @@ schema = 3 version = "v0.37.4" hash = "sha256-rEzIdkxeE5FsIGwvzZiPdifPr0v9SmKHQw78I7v2WUA=" [mod."github.com/cometbft/cometbft-db"] - version = "v0.8.0" - hash = "sha256-Tlm2V9zDs/wVoFvMmJSdCzCdZKiFRC7Qk8FS3FaqQyk=" + version = "v0.10.0" + hash = "sha256-+X0bghfGcsudcjWrdXijx0FnimzGF6ZsLp52cbImjEE=" [mod."github.com/confio/ics23/go"] version = "v0.9.0" hash = "sha256-guD8w7YygfUp7lpTAUyXQuCPx8F3lXkcg+yR5+JOCbk=" @@ -634,8 +640,8 @@ schema = 3 version = "v0.14.3" hash = "sha256-tldEok5ebZ4R4B7H8dSlYS5oVuLvh89n9wUaVlDjYwg=" [mod."go.etcd.io/bbolt"] - version = "v1.3.7" - hash = "sha256-poZk8tPLDWwW95oCOkTJcQtEvOJTD9UXAZ2TqGJutwk=" + version = "v1.3.8" + hash = "sha256-ekKy8198B2GfPldHLYZnvNjID6x07dUPYKgFx84TgVs=" [mod."go.opencensus.io"] version = "v0.24.0" hash = "sha256-4H+mGZgG2c9I1y0m8avF4qmt8LUKxxVsTqR8mKgP4yo=" From 9d4959173451619e27342a6b7d706f92a223bb94 Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Mon, 5 Feb 2024 15:31:32 -0300 Subject: [PATCH 114/345] fix(ci): remove upload cache step nix tests (#2326) * fix(ci): trigger upload cache on nix tests * try with job id * fix * add cache in test-nix job * fix * fix * fix * fix * fix * add comment * changes based on review comments --- .github/workflows/e2e-test.yml | 38 +++++++--------------------------- 1 file changed, 7 insertions(+), 31 deletions(-) diff --git a/.github/workflows/e2e-test.yml b/.github/workflows/e2e-test.yml index 11405f3b96..a869b5c6da 100644 --- a/.github/workflows/e2e-test.yml +++ b/.github/workflows/e2e-test.yml @@ -27,12 +27,12 @@ jobs: - name: Test E2E run: | make test-e2e - if: env.GIT_DIFF + if: env.GIT_DIFF test-files-matrix: runs-on: ubuntu-latest outputs: test_matrix: ${{ steps.set_matrix.outputs.test_matrix }} - steps: + steps: - uses: actions/checkout@v4 - name: Set up test file matrix to run nix tests in parallel id: set_matrix @@ -69,7 +69,7 @@ jobs: REMAINING_FILES+=("$file") fi done - + # Construct test matrix # shellcheck disable=SC2076,SC2124,SC2048,SC2086,SC2089,SC2027 TEST_FILES="[$(printf '"%s",' ${PARALLEL_TESTS[*]}) \"${REMAINING_FILES[*]}\"]" @@ -85,7 +85,7 @@ jobs: - uses: actions/checkout@v4 # TODO: create a new PAT to use here # with: - # token: ${{ secrets.E2E_PAT }} + # token: ${{ secrets.E2E_PAT }} - name: Install Nix uses: cachix/install-nix-action@v25 with: @@ -97,7 +97,7 @@ jobs: uses: cachix/cachix-action@v14 with: name: evmosd - authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}" + authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}" - uses: technote-space/get-diff-action@v6.1.2 with: PATTERNS: | @@ -107,10 +107,10 @@ jobs: go.sum *.toml tests/nix_tests/** - .github/workflows/e2e-test* + .github/workflows/e2e-test* - name: Run nix tests env: - ARGS: "${{ matrix.test_files }}" + ARGS: "${{ matrix.test_files }}" run: make run-nix-tests if: env.GIT_DIFF # Commit gomod2nix changes files back to the repository if necessary @@ -119,27 +119,3 @@ jobs: # with: # commit_message: update gomod2nix.toml file # file_pattern: '*.toml' - - upload-cache: - if: github.event_name == 'push' - needs: ["test-nix"] - strategy: - matrix: - os: [macos-latest] - runs-on: ${{ matrix.os }} - steps: - - uses: actions/checkout@v4 - - uses: cachix/install-nix-action@v25 - with: - # pin to nix-2.13 to workaround compability issue of 2.14, - # see: https://github.com/cachix/install-nix-action/issues/161 - install_url: https://releases.nixos.org/nix/nix-2.13.3/install - nix_path: nixpkgs=channel:nixos-22.11 - extra_nix_config: | - access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} - - uses: cachix/cachix-action@v14 - with: - name: evmosd - authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}" - - name: 'instantiate nix test env' - run: nix-store -r "$(nix-instantiate tests/nix_tests/shell.nix)" From d1325b75e70dfdc1183cef5920e1f0bf3574c872 Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Wed, 7 Feb 2024 14:51:14 -0300 Subject: [PATCH 115/345] imp(ci): remove duplicated yaml file (#2320) * remove duplicated yaml file * comment out PAT related logic * add pattern for runnng e2e test --- .github/workflows/e2e-test-release.yml | 74 -------------------------- .github/workflows/e2e-test.yml | 23 ++++---- 2 files changed, 12 insertions(+), 85 deletions(-) delete mode 100644 .github/workflows/e2e-test-release.yml diff --git a/.github/workflows/e2e-test-release.yml b/.github/workflows/e2e-test-release.yml deleted file mode 100644 index 46291f14b2..0000000000 --- a/.github/workflows/e2e-test-release.yml +++ /dev/null @@ -1,74 +0,0 @@ -name: E2E Test Release -on: - pull_request: - branches: - - release/** - push: - branches: - - release/** - -jobs: - test-e2e: - runs-on: ubuntu-latest - steps: - - uses: actions/setup-go@v5 - with: - go-version: '1.21' - check-latest: true - - uses: actions/checkout@v4 - - name: Test E2E - run: | - make test-e2e - test-nix: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: cachix/install-nix-action@v25 - with: - # pin to nix-2.13 to workaround compability issue of 2.14, - # see: https://github.com/cachix/install-nix-action/issues/161 - install_url: https://releases.nixos.org/nix/nix-2.13.3/install - nix_path: nixpkgs=channel:nixos-22.11 - extra_nix_config: | - access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} - - uses: cachix/cachix-action@v14 - with: - name: evmosd - authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}" - - uses: technote-space/get-diff-action@v6.1.2 - with: - PATTERNS: | - **/**.sol - **/**.go - go.mod - go.sum - *.toml - tests/nix_tests/** - .github/workflows/e2e-test* - - name: Run nix tests - run: make run-nix-tests - if: env.GIT_DIFF - - upload-cache: - if: github.event_name == 'push' - needs: ["test-nix"] - strategy: - matrix: - os: [macos-latest] - runs-on: ${{ matrix.os }} - steps: - - uses: actions/checkout@v4 - - uses: cachix/install-nix-action@v25 - with: - # pin to nix-2.13 to workaround compability issue of 2.14, - # see: https://github.com/cachix/install-nix-action/issues/161 - install_url: https://releases.nixos.org/nix/nix-2.13.3/install - nix_path: nixpkgs=channel:nixos-22.11 - extra_nix_config: | - access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} - - uses: cachix/cachix-action@v14 - with: - name: evmosd - authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}" - - name: 'instantiate nix test env' - run: nix-store -r "$(nix-instantiate tests/nix_tests/shell.nix)" diff --git a/.github/workflows/e2e-test.yml b/.github/workflows/e2e-test.yml index a869b5c6da..f70afedbcb 100644 --- a/.github/workflows/e2e-test.yml +++ b/.github/workflows/e2e-test.yml @@ -3,6 +3,10 @@ on: pull_request: branches: - main + - release/** + push: + branches: + - release/** jobs: test-e2e: @@ -16,14 +20,13 @@ jobs: - uses: technote-space/get-diff-action@v6.1.2 with: PATTERNS: | - app/app.go - app/upgrades/* go.mod go.sum + **/*.go *.toml tests/e2e/* Dockerfile - .github/workflows/e2e-test* + .github/workflows/e2e-test* - name: Test E2E run: | make test-e2e @@ -83,9 +86,8 @@ jobs: test_files: ${{fromJson(needs.test-files-matrix.outputs.test_matrix)}} steps: - uses: actions/checkout@v4 - # TODO: create a new PAT to use here - # with: - # token: ${{ secrets.E2E_PAT }} + with: + token: ${{ secrets.E2E_PAT }} - name: Install Nix uses: cachix/install-nix-action@v25 with: @@ -114,8 +116,7 @@ jobs: run: make run-nix-tests if: env.GIT_DIFF # Commit gomod2nix changes files back to the repository if necessary - # TODO: uncomment this once added the new PAT to commit the changes (when needed) - # - uses: stefanzweifel/git-auto-commit-action@v5 - # with: - # commit_message: update gomod2nix.toml file - # file_pattern: '*.toml' + - uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_message: update gomod2nix.toml file + file_pattern: '*.toml' \ No newline at end of file From 679d45700c6edbc8e386b418c7b44f7fb5d52dd7 Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Wed, 7 Feb 2024 21:40:15 +0100 Subject: [PATCH 116/345] fix(tests): create home dir in temp directory in test (#2332) * create home dir in temp directory as home in test * add changelog entry --------- Co-authored-by: Vladislav Varadinov --- CHANGELOG.md | 1 + cmd/evmosd/cmd_test.go | 3 +++ 2 files changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 95bbe2689b..69ade2307c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -45,6 +45,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (stride-outpost) [#2207](https://github.com/evmos/evmos/pull/2207) Update Stride outpost to include additional arguments. - (erc20) [#2217](https://github.com/evmos/evmos/pull/2217) Add logic to deploy token pairs contracts on genesis. - (erc20) [#2292](https://github.com/evmos/evmos/pull/2292) Revert unnecessary logic on genesis (reverts #2217). +- (tests) [#2332](https://github.com/evmos/evmos/pull/2332) Create configuration in temporary directory in `Init` command test. ### Bug Fixes diff --git a/cmd/evmosd/cmd_test.go b/cmd/evmosd/cmd_test.go index 8132fec2c9..60f7f7396d 100644 --- a/cmd/evmosd/cmd_test.go +++ b/cmd/evmosd/cmd_test.go @@ -15,10 +15,13 @@ import ( ) func TestInitCmd(t *testing.T) { + target := t.TempDir() + rootCmd, _ := evmosd.NewRootCmd() rootCmd.SetArgs([]string{ "init", // Test the init cmd "evmos-test", // Moniker + fmt.Sprintf("--home=%s", target), fmt.Sprintf("--%s=%s", cli.FlagOverwrite, "true"), // Overwrite genesis.json, in case it already exists fmt.Sprintf("--%s=%s", flags.FlagChainID, utils.TestnetChainID+"-1"), }) From c4c473097aad6e795da40fb345c446eb08341437 Mon Sep 17 00:00:00 2001 From: Vladislav Varadinov Date: Thu, 8 Feb 2024 15:47:23 +0200 Subject: [PATCH 117/345] fix(wevmos): make WEVMOS deposit and withdraw functions real no-ops and fix tests (#2329) * fix: make WEVMOS deposit and withdraw functions real no-ops and modify tests * CHANGELOG * fix: add tests that confirm no events are emitted --- CHANGELOG.md | 1 + precompiles/werc20/events.go | 70 ------------------- precompiles/werc20/integration_test.go | 95 ++++++++++---------------- precompiles/werc20/tx.go | 48 +------------ precompiles/werc20/types.go | 19 ------ precompiles/werc20/werc20.go | 4 +- 6 files changed, 42 insertions(+), 195 deletions(-) delete mode 100644 precompiles/werc20/events.go delete mode 100644 precompiles/werc20/types.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 69ade2307c..487ce8dda5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -71,6 +71,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (tests) [#2311](https://github.com/evmos/evmos/pull/2311) Fix post-upgrade transactions in automated upgrade tests. - (build) [#2319](https://github.com/evmos/evmos/pull/2319) Bump go.mod golang version to v1.21. - (ci) [#2321](https://github.com/evmos/evmos/pull/2321) Add build and markdown lint checker for `main` and `release` branches. +- (wevmos) [#2329](https://github.com/evmos/evmos/pull/2329) Make WEVMOS precompile `deposit` and `withdraw` functions no-ops. ## [v16.0.2](https://github.com/evmos/evmos/releases/tag/v16.0.2) - 2024-01-16 diff --git a/precompiles/werc20/events.go b/precompiles/werc20/events.go deleted file mode 100644 index a3e6586d88..0000000000 --- a/precompiles/werc20/events.go +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package werc20 - -import ( - "math/big" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/common" - ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v16/precompiles/common" -) - -const ( - // EventTypeDeposit defines the event type for the Deposit transaction. - EventTypeDeposit = "Deposit" - // EventTypeWithdrawal defines the event type for the Withdraw transaction. - EventTypeWithdrawal = "Withdrawal" -) - -// EmitDepositEvent creates a new Deposit event emitted on a Deposit transaction. -func (p Precompile) EmitDepositEvent(ctx sdk.Context, stateDB vm.StateDB, dst common.Address, amount *big.Int) error { - event := p.ABI.Events[EventTypeDeposit] - return p.createWERC20Event(ctx, stateDB, event, dst, amount) -} - -// EmitWithdrawalEvent creates a new Withdrawal event emitted on Withdraw transaction. -func (p Precompile) EmitWithdrawalEvent(ctx sdk.Context, stateDB vm.StateDB, src common.Address, amount *big.Int) error { - event := p.ABI.Events[EventTypeWithdrawal] - return p.createWERC20Event(ctx, stateDB, event, src, amount) -} - -func (p Precompile) createWERC20Event( - ctx sdk.Context, - stateDB vm.StateDB, - event abi.Event, - address common.Address, - amount *big.Int, -) error { - // Prepare the event topics - topics := make([]common.Hash, 2) - - // The first topic is always the signature of the event. - topics[0] = event.ID - - var err error - topics[1], err = cmn.MakeTopic(address) - if err != nil { - return err - } - - arguments := abi.Arguments{event.Inputs[1]} - packed, err := arguments.Pack(amount) - if err != nil { - return err - } - - stateDB.AddLog(ðtypes.Log{ - Address: p.Address(), - Topics: topics, - Data: packed, - BlockNumber: uint64(ctx.BlockHeight()), - }) - - return nil -} diff --git a/precompiles/werc20/integration_test.go b/precompiles/werc20/integration_test.go index 61856cd28f..545ecf61fc 100644 --- a/precompiles/werc20/integration_test.go +++ b/precompiles/werc20/integration_test.go @@ -23,6 +23,13 @@ import ( . "github.com/onsi/gomega" ) +const ( + // EventTypeDeposit defines the event type for the Deposit transaction. + EventTypeDeposit = "Deposit" + // EventTypeWithdrawal defines the event type for the Withdraw transaction. + EventTypeWithdrawal = "Withdrawal" +) + var _ = Describe("WEVMOS Extension -", func() { var ( WERC20ContractAddr common.Address @@ -93,19 +100,18 @@ var _ = Describe("WEVMOS Extension -", func() { Context("WEVMOS specific functions", func() { When("calling deposit correctly", func() { - It("should emit the Deposit event but not modify the balance", func() { - depositCheck := passCheck.WithExpPass(true).WithExpEvents(werc20.EventTypeDeposit) + It("should not emit events", func() { + depositCheck := passCheck.WithExpPass(true) txArgs, callArgs := s.getTxAndCallArgs(erc20Call, contractData, werc20.DepositMethod) txArgs.Amount = amount - _, _, err := s.factory.CallContractAndCheckLogs(sender.Priv, txArgs, callArgs, depositCheck) + _, ethRes, err := s.factory.CallContractAndCheckLogs(sender.Priv, txArgs, callArgs, depositCheck) Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - - s.checkBalances(failCheck, sender, contractData) + Expect(ethRes.Logs).To(BeEmpty(), "expected no events") }) It("should spend the correct minimum gas", func() { - depositCheck := passCheck.WithExpPass(true).WithExpEvents(werc20.EventTypeDeposit) + depositCheck := passCheck.WithExpPass(true) txArgs, callArgs := s.getTxAndCallArgs(erc20Call, contractData, werc20.DepositMethod) txArgs.Amount = amount @@ -117,18 +123,18 @@ var _ = Describe("WEVMOS Extension -", func() { }) When("calling withdraw correctly", func() { - It("should emit the Withdrawal event but not modify the balance", func() { - withdrawCheck := passCheck.WithExpPass(true).WithExpEvents(werc20.EventTypeWithdrawal) + It("should not emit events", func() { + depositCheck := passCheck.WithExpPass(true) txArgs, callArgs := s.getTxAndCallArgs(erc20Call, contractData, werc20.WithdrawMethod, amount) + txArgs.Amount = amount - _, _, err := s.factory.CallContractAndCheckLogs(sender.Priv, txArgs, callArgs, withdrawCheck) + _, ethRes, err := s.factory.CallContractAndCheckLogs(sender.Priv, txArgs, callArgs, depositCheck) Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - - s.checkBalances(failCheck, sender, contractData) + Expect(ethRes.Logs).To(BeEmpty(), "expected no events") }) It("should spend the correct minimum gas", func() { - withdrawCheck := passCheck.WithExpPass(true).WithExpEvents(werc20.EventTypeWithdrawal) + withdrawCheck := passCheck.WithExpPass(true) txArgs, callArgs := s.getTxAndCallArgs(erc20Call, contractData, werc20.WithdrawMethod, amount) _, ethRes, err := s.factory.CallContractAndCheckLogs(sender.Priv, txArgs, callArgs, withdrawCheck) @@ -147,7 +153,7 @@ var _ = Describe("WEVMOS Extension -", func() { res, err := s.factory.ExecuteContractCall(sender.Priv, txArgs, callArgs) Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - depositCheck := passCheck.WithExpPass(true).WithExpEvents(werc20.EventTypeDeposit) + depositCheck := passCheck.WithExpPass(true) depositCheck.Res = res err = testutil.CheckLogs(depositCheck) Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") @@ -163,7 +169,7 @@ var _ = Describe("WEVMOS Extension -", func() { res, err := s.factory.ExecuteEthTx(sender.Priv, txArgs) Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - depositCheck := passCheck.WithExpPass(true).WithExpEvents(werc20.EventTypeDeposit) + depositCheck := passCheck.WithExpPass(true) depositCheck.Res = res err = testutil.CheckLogs(depositCheck) Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") @@ -179,7 +185,7 @@ var _ = Describe("WEVMOS Extension -", func() { res, err := s.factory.ExecuteEthTx(sender.Priv, txArgs) Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - depositCheck := passCheck.WithExpPass(true).WithExpEvents(werc20.EventTypeDeposit) + depositCheck := passCheck.WithExpPass(true) depositCheck.Res = res err = testutil.CheckLogs(depositCheck) Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") @@ -193,7 +199,7 @@ var _ = Describe("WEVMOS Extension -", func() { res, err := s.factory.ExecuteEthTx(sender.Priv, txArgs) Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - depositCheck := passCheck.WithExpPass(true).WithExpEvents(werc20.EventTypeDeposit) + depositCheck := passCheck.WithExpPass(true) depositCheck.Res = res err = testutil.CheckLogs(depositCheck) Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") @@ -208,7 +214,7 @@ var _ = Describe("WEVMOS Extension -", func() { res, err := s.factory.ExecuteEthTx(sender.Priv, txArgs) Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - depositCheck := passCheck.WithExpPass(true).WithExpEvents(werc20.EventTypeDeposit) + depositCheck := passCheck.WithExpPass(true) depositCheck.Res = res err = testutil.CheckLogs(depositCheck) Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") @@ -223,7 +229,7 @@ var _ = Describe("WEVMOS Extension -", func() { res, err := s.factory.ExecuteEthTx(sender.Priv, txArgs) Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - depositCheck := passCheck.WithExpPass(true).WithExpEvents(werc20.EventTypeDeposit) + depositCheck := passCheck.WithExpPass(true) depositCheck.Res = res err = testutil.CheckLogs(depositCheck) Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") @@ -252,24 +258,8 @@ var _ = Describe("WEVMOS Extension -", func() { }) When("calling deposit", func() { - It("should emit the Deposit event", func() { - depositCheck := passCheck.WithExpPass(true).WithExpEvents(werc20.EventTypeDeposit) - txArgsPrecompile, callArgsPrecompile := s.getTxAndCallArgs(erc20Call, contractData, werc20.DepositMethod) - txArgsPrecompile.Amount = amount - - _, _, err := s.factory.CallContractAndCheckLogs(sender.Priv, txArgsPrecompile, callArgsPrecompile, depositCheck) - Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - - txArgsContract, callArgsContract := s.getTxAndCallArgs(erc20Call, contractDataOriginal, werc20.DepositMethod) - txArgsContract.Amount = amount - txArgsContract.GasLimit = 50_000 - - _, _, err = s.factory.CallContractAndCheckLogs(sender.Priv, txArgsContract, callArgsContract, depositCheck) - Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - }) - It("should have exact gas consumption", func() { - depositCheck := passCheck.WithExpPass(true).WithExpEvents(werc20.EventTypeDeposit) + depositCheck := passCheck.WithExpPass(true) txArgsPrecompile, callArgsPrecompile := s.getTxAndCallArgs(erc20Call, contractData, werc20.DepositMethod) txArgsPrecompile.Amount = amount @@ -280,14 +270,15 @@ var _ = Describe("WEVMOS Extension -", func() { txArgsContract.Amount = amount txArgsContract.GasLimit = 50_000 - _, ethResOriginal, err := s.factory.CallContractAndCheckLogs(sender.Priv, txArgsContract, callArgsContract, depositCheck) + depositCheckContract := passCheck.WithExpPass(true).WithExpEvents(EventTypeDeposit) + _, ethResOriginal, err := s.factory.CallContractAndCheckLogs(sender.Priv, txArgsContract, callArgsContract, depositCheckContract) Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") Expect(ethResOriginal.GasUsed).To(Equal(ethResPrecompile.GasUsed), "expected exact gas used") }) It("should return the same error", func() { - depositCheck := passCheck.WithExpPass(true).WithExpEvents(werc20.EventTypeDeposit) + depositCheck := passCheck.WithExpPass(true) txArgsPrecompile, callArgsPrecompile := s.getTxAndCallArgs(erc20Call, contractData, werc20.DepositMethod) // Increase the amount to 9e18 to trigger the insufficient balance error txArgsPrecompile.Amount = big.NewInt(9e18) @@ -308,7 +299,7 @@ var _ = Describe("WEVMOS Extension -", func() { }) It("should reflect the correct balances", func() { - depositCheck := passCheck.WithExpPass(true).WithExpEvents(werc20.EventTypeDeposit) + depositCheck := passCheck.WithExpPass(true) txArgsPrecompile, callArgsPrecompile := s.getTxAndCallArgs(erc20Call, contractData, werc20.DepositMethod) txArgsPrecompile.Amount = amount @@ -319,7 +310,8 @@ var _ = Describe("WEVMOS Extension -", func() { txArgsContract.Amount = amount txArgsContract.GasLimit = 50_000 - _, _, errOriginal := s.factory.CallContractAndCheckLogs(sender.Priv, txArgsContract, callArgsContract, depositCheck) + depositCheckContract := passCheck.WithExpPass(true).WithExpEvents(EventTypeDeposit) + _, _, errOriginal := s.factory.CallContractAndCheckLogs(sender.Priv, txArgsContract, callArgsContract, depositCheckContract) Expect(errOriginal).ToNot(HaveOccurred(), "unexpected result calling contract") // Check balances after calling precompile @@ -343,31 +335,17 @@ var _ = Describe("WEVMOS Extension -", func() { When("calling withdraw", func() { BeforeEach(func() { // Deposit into the WEVMOS contract to have something to withdraw - depositCheck := passCheck.WithExpPass(true).WithExpEvents(werc20.EventTypeDeposit) + depositCheck := passCheck.WithExpPass(true).WithExpEvents(EventTypeDeposit) txArgsContract, callArgsContract := s.getTxAndCallArgs(erc20Call, contractDataOriginal, werc20.DepositMethod) txArgsContract.Amount = amount txArgsContract.GasLimit = 50_000 - _, _, err = s.factory.CallContractAndCheckLogs(sender.Priv, txArgsContract, callArgsContract, depositCheck) - Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - }) - - It("should emit the Withdraw event", func() { - withdrawCheck := passCheck.WithExpPass(true).WithExpEvents(werc20.EventTypeWithdrawal) - txArgsPrecompile, callArgsPrecompile := s.getTxAndCallArgs(erc20Call, contractData, werc20.WithdrawMethod, amount) - - _, _, err := s.factory.CallContractAndCheckLogs(sender.Priv, txArgsPrecompile, callArgsPrecompile, withdrawCheck) - Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - - txArgsContract, callArgsContract := s.getTxAndCallArgs(erc20Call, contractDataOriginal, werc20.WithdrawMethod, amount) - txArgsContract.GasLimit = 50_000 - - _, _, err = s.factory.CallContractAndCheckLogs(sender.Priv, txArgsContract, callArgsContract, withdrawCheck) + _, _, err := s.factory.CallContractAndCheckLogs(sender.Priv, txArgsContract, callArgsContract, depositCheck) Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") }) It("should have exact gas consumption", func() { - withdrawCheck := passCheck.WithExpPass(true).WithExpEvents(werc20.EventTypeWithdrawal) + withdrawCheck := passCheck.WithExpPass(true) txArgsPrecompile, callArgsPrecompile := s.getTxAndCallArgs(erc20Call, contractData, werc20.WithdrawMethod, amount) _, ethResPrecompile, err := s.factory.CallContractAndCheckLogs(sender.Priv, txArgsPrecompile, callArgsPrecompile, withdrawCheck) @@ -375,14 +353,15 @@ var _ = Describe("WEVMOS Extension -", func() { txArgsContract, callArgsContract := s.getTxAndCallArgs(erc20Call, contractDataOriginal, werc20.WithdrawMethod, amount) - _, ethResOriginal, err := s.factory.CallContractAndCheckLogs(sender.Priv, txArgsContract, callArgsContract, withdrawCheck) + withdrawCheckContract := passCheck.WithExpPass(true).WithExpEvents(EventTypeWithdrawal) + _, ethResOriginal, err := s.factory.CallContractAndCheckLogs(sender.Priv, txArgsContract, callArgsContract, withdrawCheckContract) Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") Expect(ethResOriginal.GasUsed).To(Equal(ethResPrecompile.GasUsed), "expected exact gas used") }) It("should return the same error", func() { - withdrawCheck := passCheck.WithExpPass(true).WithExpEvents(werc20.EventTypeWithdrawal) + withdrawCheck := passCheck.WithExpPass(true) txArgsPrecompile, callArgsPrecompile := s.getTxAndCallArgs(erc20Call, contractData, werc20.WithdrawMethod) _, _, errPrecompile := s.factory.CallContractAndCheckLogs(sender.Priv, txArgsPrecompile, callArgsPrecompile, withdrawCheck) diff --git a/precompiles/werc20/tx.go b/precompiles/werc20/tx.go index fc66564322..ac595aaa5a 100644 --- a/precompiles/werc20/tx.go +++ b/precompiles/werc20/tx.go @@ -3,15 +3,6 @@ package werc20 -import ( - "fmt" - "math/big" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/core/vm" -) - const ( // DepositMethod defines the ABI method name for the IWERC20 deposit // transaction. @@ -24,48 +15,13 @@ const ( // Deposit is a no-op and mock function that provides the same interface as the // WETH contract to support equality between the native coin and its wrapped // ERC-20 (eg. EVMOS and WEVMOS). It only emits the Deposit event. -func (p Precompile) Deposit( - ctx sdk.Context, - contract *vm.Contract, - stateDB vm.StateDB, - _ *abi.Method, - _ []interface{}, -) ([]byte, error) { - dst := contract.Caller() - amount := contract.Value() - - if err := p.EmitDepositEvent(ctx, stateDB, dst, amount); err != nil { - return nil, err - } - - // NOTE: To avoid triggering the minting/burning mechanism we override the - // balances of the contract and the sender manually to perform a no-op so - // the balances are kept in sync. - stateDB.AddBalance(dst, amount) - stateDB.SubBalance(contract.Address(), amount) - +func (p Precompile) Deposit() ([]byte, error) { return nil, nil } // Withdraw is a no-op and mock function that provides the same interface as the // WETH contract to support equality between the native coin and its wrapped // ERC-20 (eg. EVMOS and WEVMOS). It only emits the Withdraw event. -func (p Precompile) Withdraw( - ctx sdk.Context, - contract *vm.Contract, - stateDB vm.StateDB, - _ *abi.Method, - args []interface{}, -) ([]byte, error) { - src := contract.Caller() - amount, ok := args[0].(*big.Int) - if !ok { - return nil, fmt.Errorf("invalid argument type: %T", args[0]) - } - - if err := p.EmitWithdrawalEvent(ctx, stateDB, src, amount); err != nil { - return nil, err - } - +func (p Precompile) Withdraw() ([]byte, error) { return nil, nil } diff --git a/precompiles/werc20/types.go b/precompiles/werc20/types.go deleted file mode 100644 index 8b8e4f5c00..0000000000 --- a/precompiles/werc20/types.go +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package werc20 - -import ( - "math/big" - - "github.com/ethereum/go-ethereum/common" -) - -// EventDepositWithdraw defines the common event data for the WERC20 Deposit -// and Withdraw events. -type EventDepositWithdraw struct { - // source or destination address - Address common.Address - // amount deposited or withdrawn - Amount *big.Int -} diff --git a/precompiles/werc20/werc20.go b/precompiles/werc20/werc20.go index 8d7ec5bd6b..ed6e9f8296 100644 --- a/precompiles/werc20/werc20.go +++ b/precompiles/werc20/werc20.go @@ -114,10 +114,10 @@ func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, readOnly bool) (bz [ method.Type == abi.Receive, method.Name == DepositMethod: // WERC20 transactions - bz, err = p.Deposit(ctx, contract, stateDB, method, args) + bz, err = p.Deposit() case method.Name == WithdrawMethod: // Withdraw Method - bz, err = p.Withdraw(ctx, contract, stateDB, method, args) + bz, err = p.Withdraw() default: // ERC20 transactions and queries bz, err = p.Precompile.HandleMethod(ctx, contract, stateDB, method, args) From 8e1dcc4a570be3e022abf8452881f0cd811119f3 Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Thu, 8 Feb 2024 11:44:37 -0300 Subject: [PATCH 118/345] fix(ci): add token in checkout action (#2337) * add token in checkout action * add conditional to token * fix lint issues * refactor --- .github/workflows/e2e-test.yml | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/.github/workflows/e2e-test.yml b/.github/workflows/e2e-test.yml index f70afedbcb..eca9cb245e 100644 --- a/.github/workflows/e2e-test.yml +++ b/.github/workflows/e2e-test.yml @@ -36,7 +36,7 @@ jobs: outputs: test_matrix: ${{ steps.set_matrix.outputs.test_matrix }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v4 - name: Set up test file matrix to run nix tests in parallel id: set_matrix run: | @@ -85,9 +85,18 @@ jobs: matrix: test_files: ${{fromJson(needs.test-files-matrix.outputs.test_matrix)}} steps: + - name: Determine token + id: token_check + run: | + if [ -n "${{ secrets.E2E_PAT }}" ]; then + TOKEN=${{ secrets.E2E_PAT }} + else + TOKEN=${{ secrets.GITHUB_TOKEN }} + fi + echo "token=${TOKEN}" >> "$GITHUB_OUTPUT" - uses: actions/checkout@v4 with: - token: ${{ secrets.E2E_PAT }} + token: ${{ steps.token_check.outputs.token }} - name: Install Nix uses: cachix/install-nix-action@v25 with: @@ -119,4 +128,4 @@ jobs: - uses: stefanzweifel/git-auto-commit-action@v5 with: commit_message: update gomod2nix.toml file - file_pattern: '*.toml' \ No newline at end of file + file_pattern: '*.toml' From c2a3304c050578f3e0ad909908af927989861e2c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 8 Feb 2024 19:30:41 +0000 Subject: [PATCH 119/345] build(deps): bump golang from 1.21.6-alpine3.18 to 1.22.0-alpine3.18 (#2336) Bumps golang from 1.21.6-alpine3.18 to 1.22.0-alpine3.18. --- updated-dependencies: - dependency-name: golang dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 940d722f6d..caead353a6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.21.6-alpine3.18 AS build-env +FROM golang:1.22.0-alpine3.18 AS build-env ARG DB_BACKEND=goleveldb ARG ROCKSDB_VERSION="8.9.1" From 118a80b9e15289aa5b3fcaab4c1a690ecd4aea88 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 8 Feb 2024 19:44:02 +0000 Subject: [PATCH 120/345] build(deps): bump golang.org/x/crypto from 0.18.0 to 0.19.0 (#2335) Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.18.0 to 0.19.0. - [Commits](https://github.com/golang/crypto/compare/v0.18.0...v0.19.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- go.mod | 6 +++--- go.sum | 12 ++++++------ gomod2nix.toml | 12 ++++++------ 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index 1469ee6538..5edea0025b 100644 --- a/go.mod +++ b/go.mod @@ -45,7 +45,7 @@ require ( github.com/tyler-smith/go-bip39 v1.1.0 github.com/zondax/hid v0.9.2 go.opencensus.io v0.24.0 - golang.org/x/crypto v0.18.0 + golang.org/x/crypto v0.19.0 golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb golang.org/x/net v0.20.0 golang.org/x/text v0.14.0 @@ -233,8 +233,8 @@ require ( golang.org/x/mod v0.14.0 // indirect golang.org/x/oauth2 v0.14.0 // indirect golang.org/x/sync v0.5.0 // indirect - golang.org/x/sys v0.16.0 // indirect - golang.org/x/term v0.16.0 // indirect + golang.org/x/sys v0.17.0 // indirect + golang.org/x/term v0.17.0 // indirect golang.org/x/tools v0.16.1 // indirect google.golang.org/api v0.149.0 // indirect google.golang.org/appengine v1.6.8 // indirect diff --git a/go.sum b/go.sum index e01bdfd4a8..6e38371de5 100644 --- a/go.sum +++ b/go.sum @@ -1233,8 +1233,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= -golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1494,16 +1494,16 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= -golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/gomod2nix.toml b/gomod2nix.toml index c712260aaa..4e7e2d9c4d 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -655,8 +655,8 @@ schema = 3 version = "v1.19.0" hash = "sha256-EVsShx1IO0zpMztSfqYQ32Gm+hV4wrVM8wWkEfHOaoM=" [mod."golang.org/x/crypto"] - version = "v0.18.0" - hash = "sha256-BuMVUxOIyfLo8MOhqYt+uQ8NDN6P2KdblKyfPxINzQ4=" + version = "v0.19.0" + hash = "sha256-Vi6vY/eWNlYQ9l3Y+gA+X2+h2CmzEOrBRVFO/cnrPWc=" [mod."golang.org/x/exp"] version = "v0.0.0-20230711153332-06a737ee72cb" hash = "sha256-Cbw10ZJ+jATPV232G47xZrn6ExO1FDtiT6nlMRCH7EI=" @@ -673,11 +673,11 @@ schema = 3 version = "v0.5.0" hash = "sha256-EAKeODSsct5HhXPmpWJfulKSCkuUu6kkDttnjyZMNcI=" [mod."golang.org/x/sys"] - version = "v0.16.0" - hash = "sha256-ZkGclbp2S7NQYhbuGji6XokCn2Qi1BJy8dwyAOTV8sY=" + version = "v0.17.0" + hash = "sha256-e0qnE+SitE02IzvnJKI4Uzpq9EOZY+zvE8Wf5b2e6Kg=" [mod."golang.org/x/term"] - version = "v0.16.0" - hash = "sha256-9qlHcsCI1sa7ZI4Q+fJbOp3mG5Y+uV16e+pGmG+MQe0=" + version = "v0.17.0" + hash = "sha256-lCo7WPHe8Q9q76f0D8FrfoX90MTvwa21O+Dwr1mOAcA=" [mod."golang.org/x/text"] version = "v0.14.0" hash = "sha256-yh3B0tom1RfzQBf1RNmfdNWF1PtiqxV41jW1GVS6JAg=" From 232f0019ab93bf94df79881a197cb3a5882db28b Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Fri, 9 Feb 2024 05:15:15 -0300 Subject: [PATCH 121/345] chore: fix lint issues (#2341) fix lint issues --- app/ante/evm/07_can_transfer_test.go | 2 +- app/ante/sigverify_test.go | 3 +- app/ante/utils/claim_rewards_test.go | 6 +- client/block/block.go | 2 +- precompiles/bech32/bech32_test.go | 6 +- precompiles/bech32/methods_test.go | 16 ++--- precompiles/distribution/events_test.go | 2 +- precompiles/distribution/query_test.go | 26 ++++---- precompiles/distribution/tx_test.go | 28 ++++---- precompiles/erc20/query_test.go | 2 +- precompiles/ics20/approve_test.go | 22 +++---- precompiles/ics20/query_test.go | 18 +++--- precompiles/ics20/tx_test.go | 30 ++++----- precompiles/outposts/osmosis/tx_test.go | 2 +- precompiles/outposts/stride/utils_test.go | 2 +- precompiles/staking/approve_test.go | 56 ++++++++-------- precompiles/staking/query_test.go | 42 ++++++------ precompiles/staking/tx_test.go | 64 +++++++++---------- precompiles/vesting/query_test.go | 6 +- precompiles/vesting/tx_test.go | 12 ++-- rpc/backend/account_info_test.go | 16 ++--- rpc/backend/blocks_test.go | 40 ++++++------ rpc/backend/chain_info_test.go | 8 +-- rpc/backend/tx_info_test.go | 2 +- rpc/websockets.go | 2 +- tests/integration/ledger/ledger_test.go | 2 +- .../ibc/coordinator/coordinator.go | 16 ++--- testutil/tx/eip712.go | 3 +- x/evm/keeper/hooks_test.go | 2 +- x/evm/statedb/statedb_test.go | 2 +- x/evm/types/utils_test.go | 2 +- x/feemarket/client/cli/query.go | 4 +- x/vesting/keeper/msg_server_test.go | 6 +- x/vesting/proposal_handler_test.go | 6 +- 34 files changed, 230 insertions(+), 228 deletions(-) diff --git a/app/ante/evm/07_can_transfer_test.go b/app/ante/evm/07_can_transfer_test.go index fe0b91e2e3..696d4d3fb0 100644 --- a/app/ante/evm/07_can_transfer_test.go +++ b/app/ante/evm/07_can_transfer_test.go @@ -55,7 +55,7 @@ func (suite *EvmAnteTestSuite) TestCanTransfer() { name: "success: valid tx and sufficient balance", expectedError: nil, isLondon: true, - malleate: func(txArgs *evmtypes.EvmTxArgs) { + malleate: func(*evmtypes.EvmTxArgs) { }, }, } diff --git a/app/ante/sigverify_test.go b/app/ante/sigverify_test.go index 5b93058e46..0740586123 100644 --- a/app/ante/sigverify_test.go +++ b/app/ante/sigverify_test.go @@ -37,7 +37,8 @@ func TestConsumeSignatureVerificationGas(t *testing.T) { expectedCost1 := expectedGasCostByKeys(pkSet1) for i := 0; i < len(pkSet1); i++ { - stdSig := legacytx.StdSignature{PubKey: pkSet1[i], Signature: sigSet1[i]} //nolint:staticcheck + // using nolint:all because the staticcheck nolint is not working as expected + stdSig := legacytx.StdSignature{PubKey: pkSet1[i], Signature: sigSet1[i]} //nolint:all sigV2, err := legacytx.StdSignatureToSignatureV2(cdc, stdSig) require.NoError(t, err) err = multisig.AddSignatureV2(multisignature1, sigV2, pkSet1) diff --git a/app/ante/utils/claim_rewards_test.go b/app/ante/utils/claim_rewards_test.go index fa943aa8a2..fe1f426117 100644 --- a/app/ante/utils/claim_rewards_test.go +++ b/app/ante/utils/claim_rewards_test.go @@ -120,20 +120,20 @@ func (suite *AnteTestSuite) TestClaimStakingRewardsIfNecessary() { }, { name: "fail - insufficient staking rewards to withdraw", - malleate: func(addr sdk.AccAddress) {}, + malleate: func(sdk.AccAddress) {}, amount: sdk.Coins{sdk.Coin{Denom: utils.BaseDenom, Amount: math.NewInt(1000)}}, expErr: true, errContains: "insufficient staking rewards to cover transaction fees", }, { name: "pass - zero amount to be claimed", - malleate: func(addr sdk.AccAddress) {}, + malleate: func(sdk.AccAddress) {}, amount: sdk.Coins{sdk.Coin{Denom: utils.BaseDenom, Amount: math.ZeroInt()}}, expErr: false, }, { name: "fail - wrong coin denom", - malleate: func(addr sdk.AccAddress) {}, + malleate: func(sdk.AccAddress) {}, amount: sdk.Coins{sdk.Coin{Denom: "wrongCoin", Amount: math.NewInt(1000)}}, expErr: true, errContains: "wrong fee denomination", diff --git a/client/block/block.go b/client/block/block.go index afb8329585..40fda32e3e 100644 --- a/client/block/block.go +++ b/client/block/block.go @@ -24,7 +24,7 @@ func Cmd() *cobra.Command { serverCtx := server.GetServerContextFromCmd(cmd) return serverCtx.Viper.BindPFlags(cmd.Flags()) }, - RunE: func(cmd *cobra.Command, args []string) error { + RunE: func(cmd *cobra.Command, _ []string) error { serverCtx := server.GetServerContextFromCmd(cmd) cfg := serverCtx.Config home := cfg.RootDir diff --git a/precompiles/bech32/bech32_test.go b/precompiles/bech32/bech32_test.go index c1f6bf0d5f..8114156529 100644 --- a/precompiles/bech32/bech32_test.go +++ b/precompiles/bech32/bech32_test.go @@ -71,7 +71,7 @@ func (s *PrecompileTestSuite) TestRun() { contract.Input = []byte("invalid") return contract }, - func(data []byte) {}, + func([]byte) {}, false, "no method with id", }, @@ -82,7 +82,7 @@ func (s *PrecompileTestSuite) TestRun() { contract.Input = s.precompile.Methods[bech32.HexToBech32Method].ID return contract }, - func(data []byte) {}, + func([]byte) {}, false, "abi: attempting to unmarshall an empty string while arguments are expected", }, @@ -100,7 +100,7 @@ func (s *PrecompileTestSuite) TestRun() { contract.Input = input return contract }, - func(data []byte) {}, + func([]byte) {}, false, "invalid bech32 human readable prefix (HRP)", }, diff --git a/precompiles/bech32/methods_test.go b/precompiles/bech32/methods_test.go index c0400b451d..c8a91be40a 100644 --- a/precompiles/bech32/methods_test.go +++ b/precompiles/bech32/methods_test.go @@ -28,7 +28,7 @@ func (s *PrecompileTestSuite) TestHexToBech32() { func() []interface{} { return []interface{}{} }, - func(data []byte) {}, + func([]byte) {}, true, fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 2, 0), }, @@ -40,7 +40,7 @@ func (s *PrecompileTestSuite) TestHexToBech32() { "", } }, - func(data []byte) {}, + func([]byte) {}, true, "invalid hex address", }, @@ -52,7 +52,7 @@ func (s *PrecompileTestSuite) TestHexToBech32() { "", } }, - func(data []byte) {}, + func([]byte) {}, true, "invalid bech32 human readable prefix (HRP)", }, @@ -114,7 +114,7 @@ func (s *PrecompileTestSuite) TestBech32ToHex() { func() []interface{} { return []interface{}{} }, - func(data []byte) {}, + func([]byte) {}, true, fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 1, 0), }, @@ -125,7 +125,7 @@ func (s *PrecompileTestSuite) TestBech32ToHex() { "", } }, - func(data []byte) {}, + func([]byte) {}, true, "invalid bech32 address", }, @@ -136,7 +136,7 @@ func (s *PrecompileTestSuite) TestBech32ToHex() { config.Bech32Prefix, } }, - func(data []byte) {}, + func([]byte) {}, true, fmt.Sprintf("invalid bech32 address: %s", config.Bech32Prefix), }, @@ -147,7 +147,7 @@ func (s *PrecompileTestSuite) TestBech32ToHex() { config.Bech32Prefix + "1", } }, - func(data []byte) {}, + func([]byte) {}, true, "decoding bech32 failed", }, @@ -158,7 +158,7 @@ func (s *PrecompileTestSuite) TestBech32ToHex() { sdk.AccAddress(make([]byte, 256)).String(), } }, - func(data []byte) {}, + func([]byte) {}, true, "address max length is 255", }, diff --git a/precompiles/distribution/events_test.go b/precompiles/distribution/events_test.go index a667c3a813..7989b59b5d 100644 --- a/precompiles/distribution/events_test.go +++ b/precompiles/distribution/events_test.go @@ -26,7 +26,7 @@ func (s *PrecompileTestSuite) TestSetWithdrawAddressEvent() { }{ { "success - the correct event is emitted", - func(operatorAddress string) []interface{} { + func(string) []interface{} { return []interface{}{ s.address, s.address.String(), diff --git a/precompiles/distribution/query_test.go b/precompiles/distribution/query_test.go index c5ac9a9e99..5a4973f6df 100644 --- a/precompiles/distribution/query_test.go +++ b/precompiles/distribution/query_test.go @@ -40,7 +40,7 @@ var baseTestCases = []distrTestCases{ func() []interface{} { return []interface{}{} }, - func(bz []byte) {}, + func([]byte) {}, 100000, true, "invalid number of arguments", @@ -52,7 +52,7 @@ var baseTestCases = []distrTestCases{ "invalid", } }, - func(bz []byte) {}, + func([]byte) {}, 100000, true, "invalid bech32 string", @@ -73,7 +73,7 @@ func (s *PrecompileTestSuite) TestValidatorDistributionInfo() { sdk.ValAddress(pk.Address().Bytes()).String(), } }, - func(bz []byte) {}, + func([]byte) {}, 100000, true, "validator does not exist", @@ -85,7 +85,7 @@ func (s *PrecompileTestSuite) TestValidatorDistributionInfo() { s.validators[0].OperatorAddress, } }, - func(bz []byte) {}, + func([]byte) {}, 100000, true, "delegation does not exist", @@ -321,7 +321,7 @@ func (s *PrecompileTestSuite) TestValidatorSlashes() { "invalid", uint64(1), uint64(5), query.PageRequest{}, } }, - func(bz []byte) { + func([]byte) { }, 100000, true, @@ -336,7 +336,7 @@ func (s *PrecompileTestSuite) TestValidatorSlashes() { query.PageRequest{}, } }, - func(bz []byte) { + func([]byte) { }, 100000, true, @@ -351,7 +351,7 @@ func (s *PrecompileTestSuite) TestValidatorSlashes() { query.PageRequest{}, } }, - func(bz []byte) { + func([]byte) { }, 100000, true, @@ -483,7 +483,7 @@ func (s *PrecompileTestSuite) TestDelegationRewards() { "invalid", } }, - func(bz []byte) {}, + func([]byte) {}, 100000, true, "invalid bech32 string", @@ -499,7 +499,7 @@ func (s *PrecompileTestSuite) TestDelegationRewards() { sdk.ValAddress(pk.Address().Bytes()).String(), } }, - func(bz []byte) {}, + func([]byte) {}, 100000, true, "validator does not exist", @@ -513,7 +513,7 @@ func (s *PrecompileTestSuite) TestDelegationRewards() { s.validators[0].OperatorAddress, } }, - func(bz []byte) {}, + func([]byte) {}, 100000, true, "delegation does not exist", @@ -591,7 +591,7 @@ func (s *PrecompileTestSuite) TestDelegationTotalRewards() { "invalid", } }, - func(bz []byte) {}, + func([]byte) {}, 100000, true, fmt.Sprintf(cmn.ErrInvalidDelegator, "invalid"), @@ -719,7 +719,7 @@ func (s *PrecompileTestSuite) TestDelegatorValidators() { "invalid", } }, - func(bz []byte) {}, + func([]byte) {}, 100000, true, fmt.Sprintf(cmn.ErrInvalidDelegator, "invalid"), @@ -800,7 +800,7 @@ func (s *PrecompileTestSuite) TestDelegatorWithdrawAddress() { "invalid", } }, - func(bz []byte) {}, + func([]byte) {}, 100000, true, fmt.Sprintf(cmn.ErrInvalidDelegator, "invalid"), diff --git a/precompiles/distribution/tx_test.go b/precompiles/distribution/tx_test.go index f097334452..7d336b9db7 100644 --- a/precompiles/distribution/tx_test.go +++ b/precompiles/distribution/tx_test.go @@ -132,10 +132,10 @@ func (s *PrecompileTestSuite) TestWithdrawDelegatorRewards() { }{ { "fail - empty input args", - func(operatorAddress string) []interface{} { + func(string) []interface{} { return []interface{}{} }, - func(data []byte) {}, + func([]byte) {}, 200000, true, fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 2, 0), @@ -148,20 +148,20 @@ func (s *PrecompileTestSuite) TestWithdrawDelegatorRewards() { operatorAddress, } }, - func(data []byte) {}, + func([]byte) {}, 200000, true, fmt.Sprintf(cmn.ErrInvalidDelegator, ""), }, { "fail - invalid validator address", - func(operatorAddress string) []interface{} { + func(string) []interface{} { return []interface{}{ s.address, nil, } }, - func(data []byte) {}, + func([]byte) {}, 200000, true, "invalid validator address", @@ -231,22 +231,22 @@ func (s *PrecompileTestSuite) TestWithdrawValidatorCommission() { }{ { "fail - empty input args", - func(operatorAddress string) []interface{} { + func(string) []interface{} { return []interface{}{} }, - func(data []byte) {}, + func([]byte) {}, 200000, true, fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 1, 0), }, { "fail - invalid validator address", - func(operatorAddress string) []interface{} { + func(string) []interface{} { return []interface{}{ nil, } }, - func(data []byte) {}, + func([]byte) {}, 200000, true, "invalid validator address", @@ -323,7 +323,7 @@ func (s *PrecompileTestSuite) TestClaimRewards() { func() []interface{} { return []interface{}{} }, - func(data []byte) {}, + func([]byte) {}, 200000, true, fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 2, 0), @@ -336,7 +336,7 @@ func (s *PrecompileTestSuite) TestClaimRewards() { 10, } }, - func(data []byte) {}, + func([]byte) {}, 200000, true, "invalid delegator address", @@ -349,7 +349,7 @@ func (s *PrecompileTestSuite) TestClaimRewards() { big.NewInt(100000000000000000), } }, - func(data []byte) {}, + func([]byte) {}, 200000, true, "invalid type for maxRetrieve: expected uint32", @@ -362,7 +362,7 @@ func (s *PrecompileTestSuite) TestClaimRewards() { uint32(2), } }, - func(data []byte) { + func([]byte) { balance := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), utils.BaseDenom) s.Require().Equal(balance.Amount.BigInt(), big.NewInt(7e18)) }, @@ -378,7 +378,7 @@ func (s *PrecompileTestSuite) TestClaimRewards() { uint32(1), } }, - func(data []byte) { + func([]byte) { balance := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), utils.BaseDenom) s.Require().Equal(balance.Amount.BigInt(), big.NewInt(6e18)) }, diff --git a/precompiles/erc20/query_test.go b/precompiles/erc20/query_test.go index 4674501259..0d3a0befee 100644 --- a/precompiles/erc20/query_test.go +++ b/precompiles/erc20/query_test.go @@ -550,7 +550,7 @@ func (s *PrecompileTestSuite) TestAllowance() { }, { name: "pass - allowance exists for precompile token pair denom", - malleate: func(ctx sdk.Context, app *app.Evmos, amount *big.Int) []interface{} { + malleate: func(_ sdk.Context, _ *app.Evmos, amount *big.Int) []interface{} { granterIdx := 0 granteeIdx := 1 diff --git a/precompiles/ics20/approve_test.go b/precompiles/ics20/approve_test.go index 1ebf0f0e4f..51bebf3e0e 100644 --- a/precompiles/ics20/approve_test.go +++ b/precompiles/ics20/approve_test.go @@ -31,7 +31,7 @@ var defaultAllowanceCases = []allowanceTestCase{ func() []interface{} { return []interface{}{} }, - func(data []byte, inputArgs []interface{}) {}, + func([]byte, []interface{}) {}, 200000, true, fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 5, 0), @@ -63,7 +63,7 @@ var defaultAllowanceCases = []allowanceTestCase{ big.NewInt(1e18), } }, - func(data []byte, inputArgs []interface{}) {}, + func([]byte, []interface{}) {}, 200000, true, "does not exist", @@ -83,7 +83,7 @@ var defaultAllowanceCases = []allowanceTestCase{ big.NewInt(1e18), } }, - func(data []byte, inputArgs []interface{}) { + func([]byte, []interface{}) { }, 200000, true, @@ -104,7 +104,7 @@ var defaultAllowanceCases = []allowanceTestCase{ big.NewInt(1e18), } }, - func(data []byte, inputArgs []interface{}) { + func([]byte, []interface{}) { }, 200000, true, @@ -128,7 +128,7 @@ func (s *PrecompileTestSuite) TestApprove() { func() []interface{} { return []interface{}{} }, - func(data []byte, inputArgs []interface{}) {}, + func([]byte, []interface{}) {}, 200000, true, fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 2, 0), @@ -148,7 +148,7 @@ func (s *PrecompileTestSuite) TestApprove() { }, } }, - func(data []byte, inputArgs []interface{}) {}, + func([]byte, []interface{}) {}, 200000, true, channeltypes.ErrChannelNotFound.Error(), @@ -335,7 +335,7 @@ func (s *PrecompileTestSuite) TestIncreaseAllowance() { big.NewInt(2e18), } }, - func(data []byte, inputArgs []interface{}) {}, + func([]byte, []interface{}) {}, 200000, true, cmn.ErrIntegerOverflow, @@ -357,7 +357,7 @@ func (s *PrecompileTestSuite) TestIncreaseAllowance() { big.NewInt(1e18), } }, - func(data []byte, inputArgs []interface{}) { + func([]byte, []interface{}) { transferAuthz := s.GetTransferAuthorization(s.ctx, differentAddress, s.address) s.Require().Equal(transferAuthz.Allocations[0].SpendLimit[0].Amount, math.NewInt(2e18)) s.Require().Equal(transferAuthz.Allocations[0].SpendLimit[0].Denom, utils.BaseDenom) @@ -383,7 +383,7 @@ func (s *PrecompileTestSuite) TestIncreaseAllowance() { big.NewInt(1e18), } }, - func(data []byte, inputArgs []interface{}) { + func([]byte, []interface{}) { transferAuthz := s.GetTransferAuthorization(s.ctx, differentAddress, s.address) s.Require().Equal(transferAuthz.Allocations[0].SpendLimit[1].Amount, math.NewInt(2e18)) s.Require().Equal(transferAuthz.Allocations[0].SpendLimit[1].Denom, "uatom") @@ -424,7 +424,7 @@ func (s *PrecompileTestSuite) TestIncreaseAllowance() { big.NewInt(1e18), } }, - func(data []byte, inputArgs []interface{}) { + func([]byte, []interface{}) { transferAuthz := s.GetTransferAuthorization(s.ctx, differentAddress, s.address) s.Require().Equal(transferAuthz.Allocations[0].SpendLimit, atomCoins) s.Require().Equal(transferAuthz.Allocations[1].SpendLimit[0].Amount, math.NewInt(2e18)) @@ -479,7 +479,7 @@ func (s *PrecompileTestSuite) TestDecreaseAllowance() { big.NewInt(2e18), } }, - func(data []byte, inputArgs []interface{}) {}, + func([]byte, []interface{}) {}, 200000, true, cmn.ErrNegativeAmount, diff --git a/precompiles/ics20/query_test.go b/precompiles/ics20/query_test.go index c0052a651f..40ff5e86a7 100644 --- a/precompiles/ics20/query_test.go +++ b/precompiles/ics20/query_test.go @@ -26,7 +26,7 @@ func (s *PrecompileTestSuite) TestDenomTrace() { { "fail - empty args", func() []interface{} { return []interface{}{} }, - func(data []byte, inputArgs []interface{}) {}, + func([]byte, []interface{}) {}, 200000, true, "invalid input arguments", @@ -36,7 +36,7 @@ func (s *PrecompileTestSuite) TestDenomTrace() { func() []interface{} { return []interface{}{"invalid denom trace"} }, - func(data []byte, inputArgs []interface{}) {}, + func([]byte, []interface{}) {}, 200000, true, "invalid denom trace", @@ -50,7 +50,7 @@ func (s *PrecompileTestSuite) TestDenomTrace() { expTrace.IBCDenom(), } }, - func(data []byte, inputArgs []interface{}) { + func(data []byte, _ []interface{}) { var out ics20.DenomTraceResponse err := s.precompile.UnpackIntoInterface(&out, ics20.DenomTraceMethod, data) s.Require().NoError(err, "failed to unpack output", err) @@ -71,7 +71,7 @@ func (s *PrecompileTestSuite) TestDenomTrace() { expTrace.IBCDenom(), } }, - func(data []byte, inputArgs []interface{}) { + func(data []byte, _ []interface{}) { var out ics20.DenomTraceResponse err := s.precompile.UnpackIntoInterface(&out, ics20.DenomTraceMethod, data) s.Require().NoError(err, "failed to unpack output", err) @@ -116,7 +116,7 @@ func (s *PrecompileTestSuite) TestDenomTraces() { { "fail - empty args", func() []interface{} { return []interface{}{} }, - func(data []byte, inputArgs []interface{}) {}, + func([]byte, []interface{}) {}, 200000, true, "invalid number of arguments", @@ -138,7 +138,7 @@ func (s *PrecompileTestSuite) TestDenomTraces() { }, } }, - func(data []byte, inputArgs []interface{}) { + func(data []byte, _ []interface{}) { var denomTraces ics20.DenomTracesResponse err := s.precompile.UnpackIntoInterface(&denomTraces, ics20.DenomTracesMethod, data) s.Require().Equal(denomTraces.PageResponse.Total, uint64(3)) @@ -189,7 +189,7 @@ func (s *PrecompileTestSuite) TestDenomHash() { { "success - trace not found, returns empty string", func() []interface{} { return []interface{}{"transfer/channelToB/transfer/channelToA"} }, - func(data []byte, inputArgs []interface{}) { + func(data []byte, _ []interface{}) { var hash string err := s.precompile.UnpackIntoInterface(&hash, ics20.DenomHashMethod, data) s.Require().NoError(err, "failed to unpack output", err) @@ -207,7 +207,7 @@ func (s *PrecompileTestSuite) TestDenomHash() { reqTrace.GetFullDenomPath(), } }, - func(data []byte, inputArgs []interface{}) { + func(data []byte, _ []interface{}) { var hash string err := s.precompile.UnpackIntoInterface(&hash, ics20.DenomHashMethod, data) s.Require().NoError(err, "failed to unpack output", err) @@ -262,7 +262,7 @@ func (s *PrecompileTestSuite) TestAllowance() { func() []interface{} { return []interface{}{} }, - func(bz []byte) {}, + func([]byte) {}, 100000, true, fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 3, 1), diff --git a/precompiles/ics20/tx_test.go b/precompiles/ics20/tx_test.go index 3f18cad668..2af80e842b 100644 --- a/precompiles/ics20/tx_test.go +++ b/precompiles/ics20/tx_test.go @@ -35,10 +35,10 @@ func (s *PrecompileTestSuite) TestTransfer() { }{ { "fail - empty args", - func(sender, receiver sdk.AccAddress) []interface{} { + func(sdk.AccAddress, sdk.AccAddress) []interface{} { return []interface{}{} }, - func(sender, receiver sdk.AccAddress, data []byte, inputArgs []interface{}) { + func(sdk.AccAddress, sdk.AccAddress, []byte, []interface{}) { }, 200000, true, @@ -46,7 +46,7 @@ func (s *PrecompileTestSuite) TestTransfer() { }, { "fail - no transfer authorization", - func(sender, receiver sdk.AccAddress) []interface{} { + func(sdk.AccAddress, sdk.AccAddress) []interface{} { path := NewTransferPath(s.chainA, s.chainB) s.coordinator.Setup(path) return []interface{}{ @@ -61,7 +61,7 @@ func (s *PrecompileTestSuite) TestTransfer() { "memo", } }, - func(sender, receiver sdk.AccAddress, data []byte, inputArgs []interface{}) { + func(sdk.AccAddress, sdk.AccAddress, []byte, []interface{}) { }, 200000, true, @@ -69,7 +69,7 @@ func (s *PrecompileTestSuite) TestTransfer() { }, { "fail - channel does not exist", - func(sender, receiver sdk.AccAddress) []interface{} { + func(sdk.AccAddress, sdk.AccAddress) []interface{} { return []interface{}{ "port", "channel-01", @@ -82,7 +82,7 @@ func (s *PrecompileTestSuite) TestTransfer() { "memo", } }, - func(sender, receiver sdk.AccAddress, data []byte, inputArgs []interface{}) { + func(sdk.AccAddress, sdk.AccAddress, []byte, []interface{}) { }, 200000, true, @@ -90,7 +90,7 @@ func (s *PrecompileTestSuite) TestTransfer() { }, { "fail - non authorized denom", - func(sender, receiver sdk.AccAddress) []interface{} { + func(sender, _ sdk.AccAddress) []interface{} { path := NewTransferPath(s.chainA, s.chainB) s.coordinator.Setup(path) err := s.NewTransferAuthorization(s.ctx, s.app, callingContractAddr, common.BytesToAddress(sender), path, defaultCoins, nil) @@ -107,7 +107,7 @@ func (s *PrecompileTestSuite) TestTransfer() { "memo", } }, - func(sender, receiver sdk.AccAddress, data []byte, inputArgs []interface{}) { + func(sdk.AccAddress, sdk.AccAddress, []byte, []interface{}) { }, 200000, true, @@ -115,7 +115,7 @@ func (s *PrecompileTestSuite) TestTransfer() { }, { "fail - allowance is less than transfer amount", - func(sender, receiver sdk.AccAddress) []interface{} { + func(sender, _ sdk.AccAddress) []interface{} { path := NewTransferPath(s.chainA, s.chainB) s.coordinator.Setup(path) err := s.NewTransferAuthorization(s.ctx, s.app, callingContractAddr, common.BytesToAddress(sender), path, defaultCoins, nil) @@ -132,7 +132,7 @@ func (s *PrecompileTestSuite) TestTransfer() { "memo", } }, - func(sender, receiver sdk.AccAddress, data []byte, inputArgs []interface{}) { + func(sdk.AccAddress, sdk.AccAddress, []byte, []interface{}) { }, 200000, true, @@ -161,7 +161,7 @@ func (s *PrecompileTestSuite) TestTransfer() { "memo", } }, - func(sender, receiver sdk.AccAddress, data []byte, inputArgs []interface{}) { + func(sender, _ sdk.AccAddress, _ []byte, _ []interface{}) { // The allowance is spent after the transfer thus the authorization is deleted authz, _ := s.app.AuthzKeeper.GetAuthorization(s.ctx, sender, sender, ics20.TransferMsgURL) transferAuthz := authz.(*transfertypes.TransferAuthorization) @@ -195,7 +195,7 @@ func (s *PrecompileTestSuite) TestTransfer() { "memo", } }, - func(sender, receiver sdk.AccAddress, data []byte, inputArgs []interface{}) { + func(sender, _ sdk.AccAddress, _ []byte, _ []interface{}) { // Check allowance was deleted authz, _ := s.app.AuthzKeeper.GetAuthorization(s.ctx, callingContractAddr.Bytes(), sender, ics20.TransferMsgURL) s.Require().Nil(authz) @@ -228,7 +228,7 @@ func (s *PrecompileTestSuite) TestTransfer() { "memo", } }, - func(sender, receiver sdk.AccAddress, data []byte, inputArgs []interface{}) { + func(sender, _ sdk.AccAddress, _ []byte, _ []interface{}) { // The allowance is spent after the transfer thus the authorization is deleted authz, _ := s.app.AuthzKeeper.GetAuthorization(s.ctx, callingContractAddr.Bytes(), sender, ics20.TransferMsgURL) transferAuthz := authz.(*transfertypes.TransferAuthorization) @@ -262,7 +262,7 @@ func (s *PrecompileTestSuite) TestTransfer() { "memo", } }, - func(sender, receiver sdk.AccAddress, data []byte, inputArgs []interface{}) { + func(sender, _ sdk.AccAddress, _ []byte, _ []interface{}) { // The allowance is spent after the transfer thus the authorization is deleted authz, _ := s.app.AuthzKeeper.GetAuthorization(s.ctx, callingContractAddr.Bytes(), sender, ics20.TransferMsgURL) transferAuthz := authz.(*transfertypes.TransferAuthorization) @@ -309,7 +309,7 @@ func (s *PrecompileTestSuite) TestTransfer() { "memo", } }, - func(sender, receiver sdk.AccAddress, data []byte, inputArgs []interface{}) { + func(sender, _ sdk.AccAddress, _ []byte, _ []interface{}) { // The allowance is spent after the transfer thus the authorization is deleted authz, _ := s.app.AuthzKeeper.GetAuthorization(s.ctx, callingContractAddr.Bytes(), sender, ics20.TransferMsgURL) transferAuthz := authz.(*transfertypes.TransferAuthorization) diff --git a/precompiles/outposts/osmosis/tx_test.go b/precompiles/outposts/osmosis/tx_test.go index 2794e28ece..bd966bcde2 100644 --- a/precompiles/outposts/osmosis/tx_test.go +++ b/precompiles/outposts/osmosis/tx_test.go @@ -434,7 +434,7 @@ func (s *PrecompileTestSuite) TestSwap() { ) coordinator.SetDefaultSignerForChain(s.unitNetwork.GetChainID(), ibcSenderPrivKey, ibcAcc) - coordinator.Setup(s.unitNetwork.GetChainID(), coordinator.GetDummyChainsIds()[0]) + coordinator.Setup(s.unitNetwork.GetChainID(), coordinator.GetDummyChainsIDs()[0]) err = coordinator.CommitAll() s.Require().NoError(err) diff --git a/precompiles/outposts/stride/utils_test.go b/precompiles/outposts/stride/utils_test.go index 3570105576..d40f389d65 100644 --- a/precompiles/outposts/stride/utils_test.go +++ b/precompiles/outposts/stride/utils_test.go @@ -96,7 +96,7 @@ func (s *PrecompileTestSuite) setupIBCCoordinator() { ) IBCCoordinator.SetDefaultSignerForChain(s.network.GetChainID(), ibcSenderPrivKey, ibcAcc) - IBCCoordinator.Setup(s.network.GetChainID(), IBCCoordinator.GetDummyChainsIds()[0]) + IBCCoordinator.Setup(s.network.GetChainID(), IBCCoordinator.GetDummyChainsIDs()[0]) err = IBCCoordinator.CommitAll() s.Require().NoError(err) diff --git a/precompiles/staking/approve_test.go b/precompiles/staking/approve_test.go index b4720bcd51..aa4281e85a 100644 --- a/precompiles/staking/approve_test.go +++ b/precompiles/staking/approve_test.go @@ -36,7 +36,7 @@ func (s *PrecompileTestSuite) TestApprove() { func(_ *vm.Contract) []interface{} { return []interface{}{} }, - func(data []byte, inputArgs []interface{}) {}, + func([]byte, []interface{}) {}, 200000, true, fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 3, 0), @@ -50,7 +50,7 @@ func (s *PrecompileTestSuite) TestApprove() { []string{"invalid"}, } }, - func(data []byte, inputArgs []interface{}) {}, + func([]byte, []interface{}) {}, 200000, true, fmt.Sprintf(cmn.ErrInvalidMsgType, "staking", "invalid"), @@ -65,7 +65,7 @@ func (s *PrecompileTestSuite) TestApprove() { // []string{"invalid"}, // } // }, - // func(data []byte, inputArgs []interface{}) {}, + // (data []byte inputArgs []interface{}) {}, // 200000, // true, // "is the same as spender", @@ -79,7 +79,7 @@ func (s *PrecompileTestSuite) TestApprove() { []string{staking.DelegateMsg}, } }, - func(data []byte, inputArgs []interface{}) { + func(data []byte, _ []interface{}) { s.Require().Equal(data, cmn.TrueValue) authz, expirationTime := s.CheckAuthorization(staking.DelegateAuthz, s.address, s.address) @@ -102,7 +102,7 @@ func (s *PrecompileTestSuite) TestApprove() { []string{staking.UndelegateMsg}, } }, - func(data []byte, inputArgs []interface{}) { + func(data []byte, _ []interface{}) { s.Require().Equal(data, cmn.TrueValue) authz, expirationTime := s.CheckAuthorization(staking.UndelegateAuthz, s.address, s.address) @@ -125,7 +125,7 @@ func (s *PrecompileTestSuite) TestApprove() { []string{staking.RedelegateMsg}, } }, - func(data []byte, inputArgs []interface{}) { + func(data []byte, _ []interface{}) { s.Require().Equal(data, cmn.TrueValue) authz, expirationTime := s.CheckAuthorization(staking.RedelegateAuthz, s.address, s.address) @@ -152,7 +152,7 @@ func (s *PrecompileTestSuite) TestApprove() { }, } }, - func(data []byte, inputArgs []interface{}) { + func(data []byte, _ []interface{}) { s.Require().Equal(data, cmn.TrueValue) allAuthz, err := s.app.AuthzKeeper.GetAuthorizations(s.ctx, s.address.Bytes(), s.address.Bytes()) @@ -165,7 +165,7 @@ func (s *PrecompileTestSuite) TestApprove() { }, { "success - remove MsgDelegate authorization", - func(contract *vm.Contract) []interface{} { + func(*vm.Contract) []interface{} { res, err := s.precompile.Approve(s.ctx, s.address, s.stateDB, &method, []interface{}{s.address, big.NewInt(1), []string{staking.DelegateMsg}}) s.Require().NoError(err) s.Require().Equal(res, cmn.TrueValue) @@ -180,7 +180,7 @@ func (s *PrecompileTestSuite) TestApprove() { []string{staking.DelegateMsg}, } }, - func(data []byte, inputArgs []interface{}) { + func(data []byte, _ []interface{}) { s.Require().Equal(data, cmn.TrueValue) authz, expirationTime := s.CheckAuthorization(staking.DelegateAuthz, s.address, s.address) @@ -200,7 +200,7 @@ func (s *PrecompileTestSuite) TestApprove() { []string{staking.DelegateMsg}, } }, - func(data []byte, inputArgs []interface{}) { + func(data []byte, _ []interface{}) { s.Require().Equal(data, cmn.TrueValue) authz, expirationTime := s.CheckAuthorization(staking.DelegateAuthz, s.address, s.address) @@ -243,7 +243,7 @@ func (s *PrecompileTestSuite) TestApprove() { []string{staking.DelegateMsg}, } }, - func(data []byte, inputArgs []interface{}) { + func(data []byte, _ []interface{}) { s.Require().Equal(data, cmn.TrueValue) authz, expirationTime := s.CheckAuthorization(staking.DelegateAuthz, s.address, s.address) @@ -267,7 +267,7 @@ func (s *PrecompileTestSuite) TestApprove() { []string{staking.UndelegateMsg}, } }, - func(data []byte, inputArgs []interface{}) { + func(data []byte, _ []interface{}) { s.Require().Equal(data, cmn.TrueValue) authz, expirationTime := s.CheckAuthorization(staking.UndelegateAuthz, s.address, s.address) @@ -289,7 +289,7 @@ func (s *PrecompileTestSuite) TestApprove() { []string{staking.RedelegateMsg}, } }, - func(data []byte, inputArgs []interface{}) { + func(data []byte, _ []interface{}) { s.Require().Equal(data, cmn.TrueValue) authz, expirationTime := s.CheckAuthorization(staking.RedelegateAuthz, s.address, s.address) @@ -313,7 +313,7 @@ func (s *PrecompileTestSuite) TestApprove() { }, } }, - func(data []byte, inputArgs []interface{}) { + func(data []byte, _ []interface{}) { s.Require().Equal(data, cmn.TrueValue) authz, expirationTime := s.CheckAuthorization(staking.DelegateAuthz, s.address, s.address) @@ -385,7 +385,7 @@ func (s *PrecompileTestSuite) TestDecreaseAllowance() { func(_ *vm.Contract) []interface{} { return []interface{}{} }, - func(data []byte, inputArgs []interface{}) {}, + func([]byte, []interface{}) {}, 200000, true, fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 3, 0), @@ -400,7 +400,7 @@ func (s *PrecompileTestSuite) TestDecreaseAllowance() { // []string{staking.DelegateMsg}, // } // }, - // func(data []byte, inputArgs []interface{}) {}, + // (data []byte inputArgs []interface{}) {}, // 200000, // true, // "is the same as spender", @@ -414,7 +414,7 @@ func (s *PrecompileTestSuite) TestDecreaseAllowance() { []string{staking.DelegateMsg}, } }, - func(data []byte, inputArgs []interface{}) { + func([]byte, []interface{}) { }, 200000, true, @@ -433,7 +433,7 @@ func (s *PrecompileTestSuite) TestDecreaseAllowance() { []string{staking.DelegateMsg}, } }, - func(data []byte, inputArgs []interface{}) { + func([]byte, []interface{}) { }, 200000, true, @@ -441,7 +441,7 @@ func (s *PrecompileTestSuite) TestDecreaseAllowance() { }, { "fail - decrease allowance amount is greater than the authorization limit", - func(contract *vm.Contract) []interface{} { + func(*vm.Contract) []interface{} { approveArgs := []interface{}{ s.address, big.NewInt(1e18), @@ -462,7 +462,7 @@ func (s *PrecompileTestSuite) TestDecreaseAllowance() { []string{staking.DelegateMsg}, } }, - func(data []byte, inputArgs []interface{}) {}, + func([]byte, []interface{}) {}, 200000, true, "amount by which the allowance should be decreased is greater than the authorization limit", @@ -477,7 +477,7 @@ func (s *PrecompileTestSuite) TestDecreaseAllowance() { []string{staking.DelegateMsg}, } }, - func(data []byte, inputArgs []interface{}) { + func([]byte, []interface{}) { authz, _ := s.CheckAuthorization(staking.DelegateAuthz, s.address, s.address) s.Require().NotNil(authz) s.Require().Equal(authz.AuthorizationType, staking.DelegateAuthz) @@ -527,7 +527,7 @@ func (s *PrecompileTestSuite) TestIncreaseAllowance() { func() []interface{} { return []interface{}{} }, - func(data []byte, inputArgs []interface{}) {}, + func([]byte, []interface{}) {}, 200000, true, fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 3, 0), @@ -542,7 +542,7 @@ func (s *PrecompileTestSuite) TestIncreaseAllowance() { // []string{staking.DelegateMsg}, // } // }, - // func(data []byte, inputArgs []interface{}) {}, + // (data []byte inputArgs []interface{}) {}, // 200000, // true, // "is the same as spender", @@ -556,7 +556,7 @@ func (s *PrecompileTestSuite) TestIncreaseAllowance() { []string{staking.DelegateMsg}, } }, - func(data []byte, inputArgs []interface{}) { + func([]byte, []interface{}) { }, 200000, true, @@ -586,7 +586,7 @@ func (s *PrecompileTestSuite) TestIncreaseAllowance() { []string{staking.DelegateMsg}, } }, - func(data []byte, inputArgs []interface{}) {}, + func([]byte, []interface{}) {}, 200000, false, "", @@ -601,7 +601,7 @@ func (s *PrecompileTestSuite) TestIncreaseAllowance() { []string{staking.DelegateMsg}, } }, - func(data []byte, inputArgs []interface{}) { + func([]byte, []interface{}) { authz, _ := s.CheckAuthorization(staking.DelegateAuthz, s.address, s.address) s.Require().NotNil(authz) s.Require().Equal(authz.AuthorizationType, staking.DelegateAuthz) @@ -662,7 +662,7 @@ func (s *PrecompileTestSuite) TestRevoke() { []string{staking.UndelegateMsg}, } }, - postCheck: func(data []byte, inputArgs []interface{}) { + postCheck: func([]byte, []interface{}) { // expect authorization to still be there authz, _ := s.CheckAuthorization(createdAuthz, granteeAddr, granterAddr) s.Require().NotNil(authz) @@ -678,7 +678,7 @@ func (s *PrecompileTestSuite) TestRevoke() { []string{staking.DelegateMsg}, } }, - postCheck: func(data []byte, inputArgs []interface{}) { + postCheck: func([]byte, []interface{}) { // expect authorization to be removed authz, _ := s.CheckAuthorization(createdAuthz, granteeAddr, granterAddr) s.Require().Nil(authz, "expected authorization to be removed") diff --git a/precompiles/staking/query_test.go b/precompiles/staking/query_test.go index 5ac4675f8f..7e057590b0 100644 --- a/precompiles/staking/query_test.go +++ b/precompiles/staking/query_test.go @@ -29,10 +29,10 @@ func (s *PrecompileTestSuite) TestDelegation() { }{ { "fail - empty input args", - func(operatorAddress string) []interface{} { + func(string) []interface{} { return []interface{}{} }, - func(bz []byte) {}, + func([]byte) {}, 100000, true, fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 2, 0), @@ -45,20 +45,20 @@ func (s *PrecompileTestSuite) TestDelegation() { operatorAddress, } }, - func(bz []byte) {}, + func([]byte) {}, 100000, true, fmt.Sprintf(cmn.ErrInvalidDelegator, "invalid"), }, { "fail - invalid operator address", - func(operatorAddress string) []interface{} { + func(string) []interface{} { return []interface{}{ s.address, "invalid", } }, - func(bz []byte) {}, + func([]byte) {}, 100000, true, "decoding bech32 failed: invalid bech32 string", @@ -134,10 +134,10 @@ func (s *PrecompileTestSuite) TestUnbondingDelegation() { }{ { "fail - empty input args", - func(operatorAddress string) []interface{} { + func(string) []interface{} { return []interface{}{} }, - func(bz []byte) {}, + func([]byte) {}, 100000, true, fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 2, 0), @@ -150,7 +150,7 @@ func (s *PrecompileTestSuite) TestUnbondingDelegation() { operatorAddress, } }, - func(bz []byte) {}, + func([]byte) {}, 100000, true, fmt.Sprintf(cmn.ErrInvalidDelegator, "invalid"), @@ -231,7 +231,7 @@ func (s *PrecompileTestSuite) TestValidator() { }{ { "fail - empty input args", - func(operatorAddress common.Address) []interface{} { + func(common.Address) []interface{} { return []interface{}{} }, func(_ []byte) {}, @@ -425,10 +425,10 @@ func (s *PrecompileTestSuite) TestRedelegation() { }{ { "fail - empty input args", - func(srcOperatorAddr, destOperatorAddr string) []interface{} { + func(string, string) []interface{} { return []interface{}{} }, - func(bz []byte) {}, + func([]byte) {}, 100000, true, fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 3, 0), @@ -442,35 +442,35 @@ func (s *PrecompileTestSuite) TestRedelegation() { destOperatorAddr, } }, - func(bz []byte) {}, + func([]byte) {}, 100000, true, fmt.Sprintf(cmn.ErrInvalidDelegator, "invalid"), }, { "fail - empty src validator addr", - func(srcOperatorAddr, destOperatorAddr string) []interface{} { + func(_, destOperatorAddr string) []interface{} { return []interface{}{ s.address, "", destOperatorAddr, } }, - func(bz []byte) {}, + func([]byte) {}, 100000, true, "empty address string is not allowed", }, { "fail - empty destination addr", - func(srcOperatorAddr, destOperatorAddr string) []interface{} { + func(srcOperatorAddr, _ string) []interface{} { return []interface{}{ s.address, srcOperatorAddr, "", } }, - func(bz []byte) {}, + func([]byte) {}, 100000, true, "empty address string is not allowed", @@ -568,7 +568,7 @@ func (s *PrecompileTestSuite) TestRedelegations() { func() []interface{} { return []interface{}{} }, - func(bz []byte) {}, + func([]byte) {}, 100000, true, fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 4, 0), @@ -583,7 +583,7 @@ func (s *PrecompileTestSuite) TestRedelegations() { query.PageRequest{}, } }, - func(bz []byte) {}, + func([]byte) {}, 100000, true, "redelegation not found", @@ -598,7 +598,7 @@ func (s *PrecompileTestSuite) TestRedelegations() { query.PageRequest{}, } }, - func(data []byte) {}, + func([]byte) {}, 100000, true, "invalid query. Need to specify at least a source validator address or delegator address", @@ -613,7 +613,7 @@ func (s *PrecompileTestSuite) TestRedelegations() { query.PageRequest{}, } }, - func(data []byte) {}, + func([]byte) {}, 100000, true, "invalid query. Need to specify at least a source validator address or delegator address", @@ -718,7 +718,7 @@ func (s *PrecompileTestSuite) TestAllowance() { func() []interface{} { return []interface{}{} }, - func(bz []byte) {}, + func([]byte) {}, 100000, true, fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 3, 0), diff --git a/precompiles/staking/tx_test.go b/precompiles/staking/tx_test.go index 62674b5c70..d3b4cf7112 100644 --- a/precompiles/staking/tx_test.go +++ b/precompiles/staking/tx_test.go @@ -51,7 +51,7 @@ func (s *PrecompileTestSuite) TestCreateValidator() { return []interface{}{} }, 200000, - func(data []byte) {}, + func([]byte) {}, true, fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 6, 0), }, @@ -69,7 +69,7 @@ func (s *PrecompileTestSuite) TestCreateValidator() { } }, 200000, - func(data []byte) {}, + func([]byte) {}, true, "is not the same as delegator address", }, @@ -86,7 +86,7 @@ func (s *PrecompileTestSuite) TestCreateValidator() { } }, 200000, - func(data []byte) {}, + func([]byte) {}, true, "invalid description", }, @@ -103,7 +103,7 @@ func (s *PrecompileTestSuite) TestCreateValidator() { } }, 200000, - func(data []byte) {}, + func([]byte) {}, true, "invalid commission", }, @@ -120,7 +120,7 @@ func (s *PrecompileTestSuite) TestCreateValidator() { } }, 200000, - func(data []byte) {}, + func([]byte) {}, true, "invalid amount", }, @@ -137,7 +137,7 @@ func (s *PrecompileTestSuite) TestCreateValidator() { } }, 200000, - func(data []byte) {}, + func([]byte) {}, true, "invalid validator address", }, @@ -154,7 +154,7 @@ func (s *PrecompileTestSuite) TestCreateValidator() { } }, 200000, - func(data []byte) {}, + func([]byte) {}, true, "invalid type for", }, @@ -171,7 +171,7 @@ func (s *PrecompileTestSuite) TestCreateValidator() { } }, 200000, - func(data []byte) {}, + func([]byte) {}, true, "illegal base64 data", }, @@ -188,7 +188,7 @@ func (s *PrecompileTestSuite) TestCreateValidator() { } }, 200000, - func(data []byte) {}, + func([]byte) {}, true, "consensus pubkey len is invalid", }, @@ -205,7 +205,7 @@ func (s *PrecompileTestSuite) TestCreateValidator() { } }, 200000, - func(data []byte) {}, + func([]byte) {}, true, "invalid amount", }, @@ -311,12 +311,12 @@ func (s *PrecompileTestSuite) TestDelegate() { }{ { "fail - empty input args", - func(operatorAddress string) []interface{} { + func(string) []interface{} { return []interface{}{} }, 200000, big.NewInt(0), - func(data []byte) {}, + func([]byte) {}, true, fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 3, 0), }, @@ -346,7 +346,7 @@ func (s *PrecompileTestSuite) TestDelegate() { }, 200000, big.NewInt(1), - func(data []byte) {}, + func([]byte) {}, true, fmt.Sprintf(cmn.ErrInvalidDelegator, ""), }, @@ -361,7 +361,7 @@ func (s *PrecompileTestSuite) TestDelegate() { }, 200000, big.NewInt(1), - func(data []byte) {}, + func([]byte) {}, true, fmt.Sprintf(cmn.ErrInvalidAmount, nil), }, @@ -378,7 +378,7 @@ func (s *PrecompileTestSuite) TestDelegate() { }, 200000, big.NewInt(15), - func(data []byte) {}, + func([]byte) {}, true, "insufficient funds", }, @@ -401,7 +401,7 @@ func (s *PrecompileTestSuite) TestDelegate() { // }, // 200000, // big.NewInt(15), - // func(data []byte) {}, + // func( []byte) {}, // true, // "cannot delegate/undelegate", // }, @@ -521,10 +521,10 @@ func (s *PrecompileTestSuite) TestUndelegate() { }{ { "fail - empty input args", - func(operatorAddress string) []interface{} { + func(string) []interface{} { return []interface{}{} }, - func(data []byte) {}, + func([]byte) {}, 200000, big.NewInt(0), true, @@ -554,7 +554,7 @@ func (s *PrecompileTestSuite) TestUndelegate() { big.NewInt(1), } }, - func(data []byte) {}, + func([]byte) {}, 200000, big.NewInt(1), true, @@ -569,7 +569,7 @@ func (s *PrecompileTestSuite) TestUndelegate() { nil, } }, - func(data []byte) {}, + func([]byte) {}, 200000, big.NewInt(1), true, @@ -650,10 +650,10 @@ func (s *PrecompileTestSuite) TestRedelegate() { }{ { "fail - empty input args", - func(srcOperatorAddr, dstOperatorAddr string) []interface{} { + func(string, string) []interface{} { return []interface{}{} }, - func(data []byte) {}, + func([]byte) {}, 200000, big.NewInt(0), true, @@ -685,7 +685,7 @@ func (s *PrecompileTestSuite) TestRedelegate() { big.NewInt(1), } }, - func(data []byte) {}, + func([]byte) {}, 200000, big.NewInt(1), true, @@ -701,7 +701,7 @@ func (s *PrecompileTestSuite) TestRedelegate() { nil, } }, - func(data []byte) {}, + func([]byte) {}, 200000, big.NewInt(1), true, @@ -717,7 +717,7 @@ func (s *PrecompileTestSuite) TestRedelegate() { big.NewInt(-1), } }, - func(data []byte) {}, + func([]byte) {}, 200000, big.NewInt(1), true, @@ -797,10 +797,10 @@ func (s *PrecompileTestSuite) TestCancelUnbondingDelegation() { }{ { "fail - empty input args", - func(operatorAddress string) []interface{} { + func(string) []interface{} { return []interface{}{} }, - func(data []byte) {}, + func([]byte) {}, 200000, big.NewInt(0), true, @@ -816,7 +816,7 @@ func (s *PrecompileTestSuite) TestCancelUnbondingDelegation() { big.NewInt(1), } }, - func(data []byte) {}, + func([]byte) {}, 200000, big.NewInt(1), true, @@ -832,7 +832,7 @@ func (s *PrecompileTestSuite) TestCancelUnbondingDelegation() { nil, } }, - func(data []byte) {}, + func([]byte) {}, 200000, big.NewInt(1), true, @@ -848,7 +848,7 @@ func (s *PrecompileTestSuite) TestCancelUnbondingDelegation() { big.NewInt(1), } }, - func(data []byte) {}, + func([]byte) {}, 200000, big.NewInt(1), true, @@ -864,7 +864,7 @@ func (s *PrecompileTestSuite) TestCancelUnbondingDelegation() { big.NewInt(1), } }, - func(data []byte) {}, + func([]byte) {}, 200000, big.NewInt(1), true, @@ -880,7 +880,7 @@ func (s *PrecompileTestSuite) TestCancelUnbondingDelegation() { big.NewInt(1), } }, - func(data []byte) {}, + func([]byte) {}, 200000, big.NewInt(1), true, diff --git a/precompiles/vesting/query_test.go b/precompiles/vesting/query_test.go index 5e2c11260e..7f7c8cc131 100644 --- a/precompiles/vesting/query_test.go +++ b/precompiles/vesting/query_test.go @@ -26,7 +26,7 @@ func (s *PrecompileTestSuite) TestBalances() { return []interface{}{} }, 200000, - func(data []byte) {}, + func([]byte) {}, true, fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 1, 0), }, @@ -38,7 +38,7 @@ func (s *PrecompileTestSuite) TestBalances() { } }, 200000, - func(data []byte) {}, + func([]byte) {}, true, "invalid type for vestingAddress", }, @@ -50,7 +50,7 @@ func (s *PrecompileTestSuite) TestBalances() { } }, 200000, - func(data []byte) {}, + func([]byte) {}, true, "is not a vesting account", }, diff --git a/precompiles/vesting/tx_test.go b/precompiles/vesting/tx_test.go index 1d784bf406..f799f79251 100644 --- a/precompiles/vesting/tx_test.go +++ b/precompiles/vesting/tx_test.go @@ -54,7 +54,7 @@ func (s *PrecompileTestSuite) TestCreateClawbackVestingAccount() { return []interface{}{} }, 200000, - func(data []byte) {}, + func([]byte) {}, true, fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 3, 0), }, @@ -130,7 +130,7 @@ func (s *PrecompileTestSuite) TestFundVestingAccount() { return []interface{}{} }, 200000, - func(data []byte) {}, + func([]byte) {}, true, fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 5, 0), }, @@ -217,7 +217,7 @@ func (s *PrecompileTestSuite) TestClawback() { return []interface{}{} }, 200000, - func(data []byte) {}, + func([]byte) {}, true, fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 3, 0), }, @@ -295,7 +295,7 @@ func (s *PrecompileTestSuite) TestUpdateVestingFunder() { return []interface{}{} }, 200000, - func(data []byte) {}, + func([]byte) {}, true, fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 3, 0), }, @@ -381,7 +381,7 @@ func (s *PrecompileTestSuite) TestConvertVestingAccount() { return []interface{}{} }, 200000, - func(data []byte) {}, + func([]byte) {}, true, fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 1, 0), }, @@ -393,7 +393,7 @@ func (s *PrecompileTestSuite) TestConvertVestingAccount() { } }, 200000, - func(data []byte) {}, + func([]byte) {}, true, "invalid type for vestingAddress", }, diff --git a/rpc/backend/account_info_test.go b/rpc/backend/account_info_test.go index a660e92423..68650af129 100644 --- a/rpc/backend/account_info_test.go +++ b/rpc/backend/account_info_test.go @@ -33,7 +33,7 @@ func (suite *BackendTestSuite) TestGetCode() { "fail - BlockHash and BlockNumber are both nil ", utiltx.GenerateAddress(), rpctypes.BlockNumberOrHash{}, - func(addr common.Address) {}, + func(_ common.Address) {}, false, nil, }, @@ -110,7 +110,7 @@ func (suite *BackendTestSuite) TestGetProof() { address1, []string{}, rpctypes.BlockNumberOrHash{BlockNumber: &blockNrInvalid}, - func(bn rpctypes.BlockNumber, addr common.Address) { + func(bn rpctypes.BlockNumber, _ common.Address) { client := suite.backend.clientCtx.Client.(*mocks.Client) RegisterBlockError(client, bn.Int64()) }, @@ -200,7 +200,7 @@ func (suite *BackendTestSuite) TestGetStorageAt() { utiltx.GenerateAddress(), "0x0", rpctypes.BlockNumberOrHash{}, - func(addr common.Address, key string, storage string) {}, + func(common.Address, string, string) {}, false, nil, }, @@ -209,7 +209,7 @@ func (suite *BackendTestSuite) TestGetStorageAt() { utiltx.GenerateAddress(), "0x0", rpctypes.BlockNumberOrHash{BlockNumber: &blockNr}, - func(addr common.Address, key string, storage string) { + func(addr common.Address, key string, _ string) { queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) RegisterStorageAtError(queryClient, addr, key) }, @@ -260,7 +260,7 @@ func (suite *BackendTestSuite) TestGetBalance() { "fail - BlockHash and BlockNumber are both nil", utiltx.GenerateAddress(), rpctypes.BlockNumberOrHash{}, - func(bn rpctypes.BlockNumber, addr common.Address) { + func(rpctypes.BlockNumber, common.Address) { }, false, nil, @@ -269,7 +269,7 @@ func (suite *BackendTestSuite) TestGetBalance() { "fail - tendermint client failed to get block", utiltx.GenerateAddress(), rpctypes.BlockNumberOrHash{BlockNumber: &blockNr}, - func(bn rpctypes.BlockNumber, addr common.Address) { + func(bn rpctypes.BlockNumber, _ common.Address) { client := suite.backend.clientCtx.Client.(*mocks.Client) RegisterBlockError(client, bn.Int64()) }, @@ -366,7 +366,7 @@ func (suite *BackendTestSuite) TestGetTransactionCount() { "pass - account doesn't exist", false, rpctypes.NewBlockNumber(big.NewInt(1)), - func(addr common.Address, bn rpctypes.BlockNumber) { + func(common.Address, rpctypes.BlockNumber) { var header metadata.MD queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) RegisterParams(queryClient, &header, 1) @@ -378,7 +378,7 @@ func (suite *BackendTestSuite) TestGetTransactionCount() { "fail - block height is in the future", false, rpctypes.NewBlockNumber(big.NewInt(10000)), - func(addr common.Address, bn rpctypes.BlockNumber) { + func(common.Address, rpctypes.BlockNumber) { var header metadata.MD queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) RegisterParams(queryClient, &header, 1) diff --git a/rpc/backend/blocks_test.go b/rpc/backend/blocks_test.go index eda24f3db4..2d842abceb 100644 --- a/rpc/backend/blocks_test.go +++ b/rpc/backend/blocks_test.go @@ -123,7 +123,7 @@ func (suite *BackendTestSuite) TestGetBlockByNumber() { sdk.AccAddress(utiltx.GenerateAddress().Bytes()), nil, nil, - func(blockNum ethrpc.BlockNumber, baseFee math.Int, validator sdk.AccAddress, txBz []byte) { + func(blockNum ethrpc.BlockNumber, _ math.Int, _ sdk.AccAddress, _ []byte) { height := blockNum.Int64() client := suite.backend.clientCtx.Client.(*mocks.Client) resBlock, _ = RegisterBlockNotFound(client, height) @@ -139,7 +139,7 @@ func (suite *BackendTestSuite) TestGetBlockByNumber() { sdk.AccAddress(utiltx.GenerateAddress().Bytes()), nil, nil, - func(blockNum ethrpc.BlockNumber, baseFee math.Int, validator sdk.AccAddress, txBz []byte) { + func(blockNum ethrpc.BlockNumber, _ math.Int, _ sdk.AccAddress, txBz []byte) { height := blockNum.Int64() client := suite.backend.clientCtx.Client.(*mocks.Client) resBlock, _ = RegisterBlock(client, height, txBz) @@ -252,7 +252,7 @@ func (suite *BackendTestSuite) TestGetBlockByHash() { sdk.AccAddress(utiltx.GenerateAddress().Bytes()), nil, nil, - func(hash common.Hash, baseFee math.Int, validator sdk.AccAddress, txBz []byte) { + func(hash common.Hash, _ math.Int, _ sdk.AccAddress, txBz []byte) { client := suite.backend.clientCtx.Client.(*mocks.Client) RegisterBlockByHashError(client, hash, txBz) }, @@ -267,7 +267,7 @@ func (suite *BackendTestSuite) TestGetBlockByHash() { sdk.AccAddress(utiltx.GenerateAddress().Bytes()), nil, nil, - func(hash common.Hash, baseFee math.Int, validator sdk.AccAddress, txBz []byte) { + func(hash common.Hash, _ math.Int, _ sdk.AccAddress, txBz []byte) { client := suite.backend.clientCtx.Client.(*mocks.Client) RegisterBlockByHashNotFound(client, hash, txBz) }, @@ -282,7 +282,7 @@ func (suite *BackendTestSuite) TestGetBlockByHash() { sdk.AccAddress(utiltx.GenerateAddress().Bytes()), nil, nil, - func(hash common.Hash, baseFee math.Int, validator sdk.AccAddress, txBz []byte) { + func(hash common.Hash, _ math.Int, _ sdk.AccAddress, txBz []byte) { height := int64(1) client := suite.backend.clientCtx.Client.(*mocks.Client) resBlock, _ = RegisterBlockByHash(client, hash, txBz) @@ -576,7 +576,7 @@ func (suite *BackendTestSuite) TestTendermintBlockByNumber() { { "pass - blockNum < 0 with app state height >= 1", ethrpc.BlockNumber(-1), - func(blockNum ethrpc.BlockNumber) { + func(ethrpc.BlockNumber) { var header metadata.MD appHeight := int64(1) queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) @@ -704,7 +704,7 @@ func (suite *BackendTestSuite) TestBlockNumberFromTendermint() { "error - without blockHash or blockNum", nil, nil, - func(hash *common.Hash) {}, + func(*common.Hash) {}, false, }, { @@ -731,7 +731,7 @@ func (suite *BackendTestSuite) TestBlockNumberFromTendermint() { "pass - without blockHash & with blockNumber", &blockNum, nil, - func(hash *common.Hash) {}, + func(*common.Hash) {}, true, }, } @@ -937,7 +937,7 @@ func (suite *BackendTestSuite) TestGetEthBlockFromTendermint() { TxsResults: []*types.ResponseDeliverTx{{Code: 0, GasUsed: 0}}, }, true, - func(baseFee math.Int, validator sdk.AccAddress, height int64) { + func(_ math.Int, validator sdk.AccAddress, height int64) { queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) RegisterBaseFeeError(queryClient) RegisterValidatorAccount(queryClient, validator) @@ -961,7 +961,7 @@ func (suite *BackendTestSuite) TestGetEthBlockFromTendermint() { TxsResults: []*types.ResponseDeliverTx{{Code: 0, GasUsed: 0}}, }, true, - func(baseFee math.Int, validator sdk.AccAddress, height int64) { + func(baseFee math.Int, _ sdk.AccAddress, height int64) { queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) RegisterBaseFee(queryClient, baseFee) RegisterValidatorAccountError(queryClient) @@ -1211,7 +1211,7 @@ func (suite *BackendTestSuite) TestHeaderByNumber() { "fail - tendermint client failed to get block", ethrpc.BlockNumber(1), math.NewInt(1).BigInt(), - func(blockNum ethrpc.BlockNumber, baseFee math.Int) { + func(blockNum ethrpc.BlockNumber, _ math.Int) { height := blockNum.Int64() client := suite.backend.clientCtx.Client.(*mocks.Client) RegisterBlockError(client, height) @@ -1222,7 +1222,7 @@ func (suite *BackendTestSuite) TestHeaderByNumber() { "fail - block not found for height", ethrpc.BlockNumber(1), math.NewInt(1).BigInt(), - func(blockNum ethrpc.BlockNumber, baseFee math.Int) { + func(blockNum ethrpc.BlockNumber, _ math.Int) { height := blockNum.Int64() client := suite.backend.clientCtx.Client.(*mocks.Client) _, err := RegisterBlockNotFound(client, height) @@ -1234,7 +1234,7 @@ func (suite *BackendTestSuite) TestHeaderByNumber() { "fail - block not found for height", ethrpc.BlockNumber(1), math.NewInt(1).BigInt(), - func(blockNum ethrpc.BlockNumber, baseFee math.Int) { + func(blockNum ethrpc.BlockNumber, _ math.Int) { height := blockNum.Int64() client := suite.backend.clientCtx.Client.(*mocks.Client) _, err := RegisterBlock(client, height, nil) @@ -1247,7 +1247,7 @@ func (suite *BackendTestSuite) TestHeaderByNumber() { "pass - without Base Fee, failed to fetch from prunned block", ethrpc.BlockNumber(1), nil, - func(blockNum ethrpc.BlockNumber, baseFee math.Int) { + func(blockNum ethrpc.BlockNumber, _ math.Int) { height := blockNum.Int64() client := suite.backend.clientCtx.Client.(*mocks.Client) expResultBlock, _ = RegisterBlock(client, height, nil) @@ -1325,7 +1325,7 @@ func (suite *BackendTestSuite) TestHeaderByHash() { "fail - tendermint client failed to get block", common.BytesToHash(block.Hash()), math.NewInt(1).BigInt(), - func(hash common.Hash, baseFee math.Int) { + func(hash common.Hash, _ math.Int) { client := suite.backend.clientCtx.Client.(*mocks.Client) RegisterBlockByHashError(client, hash, bz) }, @@ -1335,7 +1335,7 @@ func (suite *BackendTestSuite) TestHeaderByHash() { "fail - block not found for height", common.BytesToHash(block.Hash()), math.NewInt(1).BigInt(), - func(hash common.Hash, baseFee math.Int) { + func(hash common.Hash, _ math.Int) { client := suite.backend.clientCtx.Client.(*mocks.Client) RegisterBlockByHashNotFound(client, hash, bz) }, @@ -1345,7 +1345,7 @@ func (suite *BackendTestSuite) TestHeaderByHash() { "fail - block not found for height", common.BytesToHash(block.Hash()), math.NewInt(1).BigInt(), - func(hash common.Hash, baseFee math.Int) { + func(hash common.Hash, _ math.Int) { height := int64(1) client := suite.backend.clientCtx.Client.(*mocks.Client) _, err := RegisterBlockByHash(client, hash, bz) @@ -1358,7 +1358,7 @@ func (suite *BackendTestSuite) TestHeaderByHash() { "pass - without Base Fee, failed to fetch from prunned block", common.BytesToHash(block.Hash()), nil, - func(hash common.Hash, baseFee math.Int) { + func(hash common.Hash, _ math.Int) { height := int64(1) client := suite.backend.clientCtx.Client.(*mocks.Client) expResultBlock, _ = RegisterBlockByHash(client, hash, bz) @@ -1554,7 +1554,7 @@ func (suite *BackendTestSuite) TestEthBlockFromTendermintBlock() { Height: 1, TxsResults: []*types.ResponseDeliverTx{{Code: 0, GasUsed: 0}}, }, - func(baseFee math.Int, blockNum int64) { + func(baseFee math.Int, _ int64) { queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) RegisterBaseFee(queryClient, baseFee) }, @@ -1589,7 +1589,7 @@ func (suite *BackendTestSuite) TestEthBlockFromTendermintBlock() { }, }, }, - func(baseFee math.Int, blockNum int64) { + func(baseFee math.Int, _ int64) { queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) RegisterBaseFee(queryClient, baseFee) }, diff --git a/rpc/backend/chain_info_test.go b/rpc/backend/chain_info_test.go index ec600c4f76..4b660635a5 100644 --- a/rpc/backend/chain_info_test.go +++ b/rpc/backend/chain_info_test.go @@ -333,7 +333,7 @@ func (suite *BackendTestSuite) TestFeeHistory() { }{ { "fail - can't get params ", - func(validator sdk.AccAddress) { + func(_ sdk.AccAddress) { var header metadata.MD queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) suite.backend.cfg.JSONRPC.FeeHistoryCap = 0 @@ -347,7 +347,7 @@ func (suite *BackendTestSuite) TestFeeHistory() { }, { "fail - user block count higher than max block count ", - func(validator sdk.AccAddress) { + func(_ sdk.AccAddress) { var header metadata.MD queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) suite.backend.cfg.JSONRPC.FeeHistoryCap = 0 @@ -361,7 +361,7 @@ func (suite *BackendTestSuite) TestFeeHistory() { }, { "fail - Tendermint block fetching error ", - func(validator sdk.AccAddress) { + func(_ sdk.AccAddress) { client := suite.backend.clientCtx.Client.(*mocks.Client) suite.backend.cfg.JSONRPC.FeeHistoryCap = 2 RegisterBlockError(client, ethrpc.BlockNumber(1).Int64()) @@ -374,7 +374,7 @@ func (suite *BackendTestSuite) TestFeeHistory() { }, { "fail - Eth block fetching error", - func(validator sdk.AccAddress) { + func(sdk.AccAddress) { client := suite.backend.clientCtx.Client.(*mocks.Client) suite.backend.cfg.JSONRPC.FeeHistoryCap = 2 _, err := RegisterBlock(client, ethrpc.BlockNumber(1).Int64(), nil) diff --git a/rpc/backend/tx_info_test.go b/rpc/backend/tx_info_test.go index faa93a4c8e..eed0c8690d 100644 --- a/rpc/backend/tx_info_test.go +++ b/rpc/backend/tx_info_test.go @@ -516,7 +516,7 @@ func (suite *BackendTestSuite) TestQueryTendermintTxIndexer() { client := suite.backend.clientCtx.Client.(*mocks.Client) RegisterTxSearchEmpty(client, "") }, - func(txs *rpctypes.ParsedTxs) *rpctypes.ParsedTx { + func(_ *rpctypes.ParsedTxs) *rpctypes.ParsedTx { return &rpctypes.ParsedTx{} }, "", diff --git a/rpc/websockets.go b/rpc/websockets.go index 79cf756ecc..7c3b161466 100644 --- a/rpc/websockets.go +++ b/rpc/websockets.go @@ -117,7 +117,7 @@ func (s *websocketsServer) Start() { func (s *websocketsServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { upgrader := websocket.Upgrader{ - CheckOrigin: func(r *http.Request) bool { + CheckOrigin: func(_ *http.Request) bool { return true }, } diff --git a/tests/integration/ledger/ledger_test.go b/tests/integration/ledger/ledger_test.go index 96fd6cc387..7263d6278c 100644 --- a/tests/integration/ledger/ledger_test.go +++ b/tests/integration/ledger/ledger_test.go @@ -33,7 +33,7 @@ var ( return s.privKey.Sign(msg) } - signErrMock = func(_ []uint32, msg []byte) ([]byte, error) { + signErrMock = func([]uint32, []byte) ([]byte, error) { return nil, mocks.ErrMockedSigning } ) diff --git a/testutil/integration/ibc/coordinator/coordinator.go b/testutil/integration/ibc/coordinator/coordinator.go index 213e640058..66e98123c4 100644 --- a/testutil/integration/ibc/coordinator/coordinator.go +++ b/testutil/integration/ibc/coordinator/coordinator.go @@ -26,8 +26,8 @@ type Coordinator interface { UpdateTimeForChain(chainID string) // GetChain returns the TestChain for a given chainID. GetChain(chainID string) ibcchain.Chain - // GetDummyChainsIds returns the chainIDs for all dummy chains. - GetDummyChainsIds() []string + // GetDummyChainsIDs returns the chainIDs for all dummy chains. + GetDummyChainsIDs() []string // SetDefaultSignerForChain sets the default signer for the chain with the given chainID. SetDefaultSignerForChain(chainID string, priv cryptotypes.PrivKey, acc authtypes.AccountI) // Setup constructs a TM client, connection, and channel on both chains provided. It will @@ -55,7 +55,7 @@ var _ Coordinator = (*IntegrationCoordinator)(nil) // sync with the network interface. type IntegrationCoordinator struct { coord *ibctesting.Coordinator - dummyChainsIds []string + dummyChainsIDs []string } // NewIntegrationCoordinator returns a new IntegrationCoordinator with N TestChain's. @@ -65,12 +65,12 @@ func NewIntegrationCoordinator(t *testing.T, preConfiguredChains []network.Netwo CurrentTime: GlobalTime, } ibcChains := getIBCChains(t, coord, preConfiguredChains) - dummyChains, dummyChainsIds := generateDummyChains(t, coord, AmountOfDummyChains) + dummyChains, dummyChainsIDs := generateDummyChains(t, coord, AmountOfDummyChains) totalChains := mergeMaps(ibcChains, dummyChains) coord.Chains = totalChains return &IntegrationCoordinator{ coord: coord, - dummyChainsIds: dummyChainsIds, + dummyChainsIDs: dummyChainsIDs, } } @@ -79,9 +79,9 @@ func (c *IntegrationCoordinator) GetChain(chainID string) ibcchain.Chain { return c.coord.Chains[chainID] } -// GetDummyChainsIds returns the chainIDs for all dummy chains. -func (c *IntegrationCoordinator) GetDummyChainsIds() []string { - return c.dummyChainsIds +// GetDummyChainsIDs returns the chainIDs for all dummy chains. +func (c *IntegrationCoordinator) GetDummyChainsIDs() []string { + return c.dummyChainsIDs } // IncrementTime iterates through all the TestChain's and increments their current header time diff --git a/testutil/tx/eip712.go b/testutil/tx/eip712.go index e364545410..422ca770c8 100644 --- a/testutil/tx/eip712.go +++ b/testutil/tx/eip712.go @@ -80,7 +80,8 @@ func PrepareEIP712CosmosTx( return nil, err } - fee := legacytx.NewStdFee(txArgs.Gas, txArgs.Fees) //nolint:staticcheck + // using nolint:all because the staticcheck nolint is not working as expected + fee := legacytx.NewStdFee(txArgs.Gas, txArgs.Fees) //nolint:all msgs := txArgs.Msgs data := legacytx.StdSignBytes(ctx.ChainID(), accNumber, nonce, 0, fee, msgs, "", nil) diff --git a/x/evm/keeper/hooks_test.go b/x/evm/keeper/hooks_test.go index e9651bac57..d0cb6f8b04 100644 --- a/x/evm/keeper/hooks_test.go +++ b/x/evm/keeper/hooks_test.go @@ -52,7 +52,7 @@ func (suite *KeeperTestSuite) TestEvmHooks() { func() types.EvmHooks { return &FailureHook{} }, - func(hook types.EvmHooks, result error) { + func(_ types.EvmHooks, result error) { suite.Require().Error(result) }, }, diff --git a/x/evm/statedb/statedb_test.go b/x/evm/statedb/statedb_test.go index 9cf932cc4b..8bc7183a6d 100644 --- a/x/evm/statedb/statedb_test.go +++ b/x/evm/statedb/statedb_test.go @@ -193,7 +193,7 @@ func (suite *StateDBTestSuite) TestState() { malleate func(*statedb.StateDB) expStates statedb.Storage }{ - {"empty state", func(db *statedb.StateDB) { + {"empty state", func(_ *statedb.StateDB) { }, nil}, {"set empty value", func(db *statedb.StateDB) { db.SetState(address, key1, common.Hash{}) diff --git a/x/evm/types/utils_test.go b/x/evm/types/utils_test.go index 09cc4048fa..e4ada53032 100644 --- a/x/evm/types/utils_test.go +++ b/x/evm/types/utils_test.go @@ -86,7 +86,7 @@ func TestBinSearch(t *testing.T) { target := uint64(21000) return gas < target, nil, nil } - failedExecutable := func(gas uint64) (bool, *evmtypes.MsgEthereumTxResponse, error) { + failedExecutable := func(_ uint64) (bool, *evmtypes.MsgEthereumTxResponse, error) { return true, nil, errors.New("contract failed") } diff --git a/x/feemarket/client/cli/query.go b/x/feemarket/client/cli/query.go index d8d12aa52b..1c1b5f5e42 100644 --- a/x/feemarket/client/cli/query.go +++ b/x/feemarket/client/cli/query.go @@ -37,7 +37,7 @@ func GetBlockGasCmd() *cobra.Command { Long: `Get the block gas used at a given block height. If the height is not provided, it will use the latest height from context`, Args: cobra.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { + RunE: func(cmd *cobra.Command, _ []string) error { clientCtx, err := client.GetClientQueryContext(cmd) if err != nil { return err @@ -95,7 +95,7 @@ func GetBaseFeeCmd() *cobra.Command { Long: `Get the base fee amount at a given block height. If the height is not provided, it will use the latest height from context.`, Args: cobra.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { + RunE: func(cmd *cobra.Command, _ []string) error { clientCtx, err := client.GetClientQueryContext(cmd) if err != nil { return err diff --git a/x/vesting/keeper/msg_server_test.go b/x/vesting/keeper/msg_server_test.go index 453a31d294..4318fa4c88 100644 --- a/x/vesting/keeper/msg_server_test.go +++ b/x/vesting/keeper/msg_server_test.go @@ -219,7 +219,7 @@ func (suite *KeeperTestSuite) TestMsgCreateClawbackVestingAccount() { }{ { name: "fail - account does not exist", - malleate: func(funder sdk.AccAddress, vestingAddr sdk.AccAddress) {}, + malleate: func(sdk.AccAddress, sdk.AccAddress) {}, funder: funderAddr, vestingAddr: vestingAddr, expPass: false, @@ -227,7 +227,7 @@ func (suite *KeeperTestSuite) TestMsgCreateClawbackVestingAccount() { }, { name: "fail - account is not an eth account", - malleate: func(funder sdk.AccAddress, vestingAddr sdk.AccAddress) { + malleate: func(_ sdk.AccAddress, vestingAddr sdk.AccAddress) { acc := authtypes.NewBaseAccountWithAddress(vestingAddr) s.app.AccountKeeper.SetAccount(s.ctx, acc) }, @@ -256,7 +256,7 @@ func (suite *KeeperTestSuite) TestMsgCreateClawbackVestingAccount() { }, { name: "fail - vesting address is in the blocked addresses list", - malleate: func(funder sdk.AccAddress, vestingAddr sdk.AccAddress) { + malleate: func(funder sdk.AccAddress, _ sdk.AccAddress) { // fund the funder and vesting accounts from Bankkeeper err := testutil.FundAccount(s.ctx, s.app.BankKeeper, funder, balances) suite.Require().NoError(err) diff --git a/x/vesting/proposal_handler_test.go b/x/vesting/proposal_handler_test.go index 5ec1829acc..ed39bb9e79 100644 --- a/x/vesting/proposal_handler_test.go +++ b/x/vesting/proposal_handler_test.go @@ -66,7 +66,7 @@ func (s *VestingTestSuite) TestHandleClawbackProposal() { vestingAddr: vestingAddr.String(), skipCreating: true, errContains: vestingtypes.ErrNotSubjectToClawback.Error(), - postCheck: func(proposal vestingtypes.ClawbackProposal) {}, + postCheck: func(vestingtypes.ClawbackProposal) {}, }, { name: "fail - vesting account only initialized (no schedules)", @@ -74,7 +74,7 @@ func (s *VestingTestSuite) TestHandleClawbackProposal() { skipFunding: true, enableGovClawback: true, errContains: "has no vesting or lockup periods", - postCheck: func(proposal vestingtypes.ClawbackProposal) {}, + postCheck: func(vestingtypes.ClawbackProposal) {}, }, { name: "fail - account does not exist", @@ -82,7 +82,7 @@ func (s *VestingTestSuite) TestHandleClawbackProposal() { skipCreating: true, enableGovClawback: true, errContains: fmt.Sprintf("account at address '%s' does not exist", notFoundAddr.String()), - postCheck: func(proposal vestingtypes.ClawbackProposal) {}, + postCheck: func(vestingtypes.ClawbackProposal) {}, }, { name: "fail - gov clawback not enabled", From ff566b4134adb0b14bec0400cf1f761f1b455e58 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 9 Feb 2024 09:05:55 +0000 Subject: [PATCH 122/345] build(deps): bump golang.org/x/net from 0.20.0 to 0.21.0 (#2334) Bumps [golang.org/x/net](https://github.com/golang/net) from 0.20.0 to 0.21.0. - [Commits](https://github.com/golang/net/compare/v0.20.0...v0.21.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 5edea0025b..e4125fd7a2 100644 --- a/go.mod +++ b/go.mod @@ -47,7 +47,7 @@ require ( go.opencensus.io v0.24.0 golang.org/x/crypto v0.19.0 golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb - golang.org/x/net v0.20.0 + golang.org/x/net v0.21.0 golang.org/x/text v0.14.0 google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0 google.golang.org/grpc v1.61.0 diff --git a/go.sum b/go.sum index 6e38371de5..26db6e2fcc 100644 --- a/go.sum +++ b/go.sum @@ -1342,8 +1342,8 @@ golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= -golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= diff --git a/gomod2nix.toml b/gomod2nix.toml index 4e7e2d9c4d..e5cf19f787 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -664,8 +664,8 @@ schema = 3 version = "v0.14.0" hash = "sha256-sx3hWp5l99DBfIrn821ohfoBwvaITSHMWbzPvX0btLM=" [mod."golang.org/x/net"] - version = "v0.20.0" - hash = "sha256-PCttIsWSBQd6fDXL49jepszUAMLnAGAKR//5EDO3XDk=" + version = "v0.21.0" + hash = "sha256-LfiqMpPtqvW/eLkfx6Ebr5ksqKbQli6uq06c/+XrBsw=" [mod."golang.org/x/oauth2"] version = "v0.14.0" hash = "sha256-1wCXYvhtiGksL75rrOTDc6P82WuKBeaReqy1l7CahAE=" From 08717655b96e70c4a4677cc00ab158efdfae9ad8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 9 Feb 2024 14:05:11 +0100 Subject: [PATCH 123/345] build(deps): bump golangci/golangci-lint-action from 3.7.0 to 3.7.1 (#2342) Bumps [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action) from 3.7.0 to 3.7.1. - [Release notes](https://github.com/golangci/golangci-lint-action/releases) - [Commits](https://github.com/golangci/golangci-lint-action/compare/v3.7.0...v3.7.1) --- updated-dependencies: - dependency-name: golangci/golangci-lint-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index f9db99febf..8afe73c85a 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -23,7 +23,7 @@ jobs: go.mod go.sum *.toml - - uses: golangci/golangci-lint-action@v3.7.0 + - uses: golangci/golangci-lint-action@v3.7.1 with: # Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version. version: latest From 817fac2a423eedd88b5e1dafba1976c21d6e9e5c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Feb 2024 11:18:36 +0100 Subject: [PATCH 124/345] build(deps): bump grpcio from 1.53.0 to 1.53.2 in /tests/nix_tests (#2344) Bumps [grpcio](https://github.com/grpc/grpc) from 1.53.0 to 1.53.2. - [Release notes](https://github.com/grpc/grpc/releases) - [Changelog](https://github.com/grpc/grpc/blob/master/doc/grpc_release_schedule.md) - [Commits](https://github.com/grpc/grpc/compare/v1.53.0...v1.53.2) --- updated-dependencies: - dependency-name: grpcio dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tests/nix_tests/poetry.lock | 96 +++++++++++++++++----------------- tests/nix_tests/pyproject.toml | 2 +- 2 files changed, 49 insertions(+), 49 deletions(-) diff --git a/tests/nix_tests/poetry.lock b/tests/nix_tests/poetry.lock index 211f86c5df..7ddfe97cdd 100644 --- a/tests/nix_tests/poetry.lock +++ b/tests/nix_tests/poetry.lock @@ -823,60 +823,60 @@ files = [ [[package]] name = "grpcio" -version = "1.53.0" +version = "1.53.2" description = "HTTP/2-based RPC framework" optional = false python-versions = ">=3.7" files = [ - {file = "grpcio-1.53.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:752d2949b40e12e6ad3ed8cc552a65b54d226504f6b1fb67cab2ccee502cc06f"}, - {file = "grpcio-1.53.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:8a48fd3a7222be226bb86b7b413ad248f17f3101a524018cdc4562eeae1eb2a3"}, - {file = "grpcio-1.53.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:f3e837d29f0e1b9d6e7b29d569e2e9b0da61889e41879832ea15569c251c303a"}, - {file = "grpcio-1.53.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aef7d30242409c3aa5839b501e877e453a2c8d3759ca8230dd5a21cda029f046"}, - {file = "grpcio-1.53.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6f90698b5d1c5dd7b3236cd1fa959d7b80e17923f918d5be020b65f1c78b173"}, - {file = "grpcio-1.53.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a96c3c7f564b263c5d7c0e49a337166c8611e89c4c919f66dba7b9a84abad137"}, - {file = "grpcio-1.53.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ee81349411648d1abc94095c68cd25e3c2812e4e0367f9a9355be1e804a5135c"}, - {file = "grpcio-1.53.0-cp310-cp310-win32.whl", hash = "sha256:fdc6191587de410a184550d4143e2b24a14df495c86ca15e59508710681690ac"}, - {file = "grpcio-1.53.0-cp310-cp310-win_amd64.whl", hash = "sha256:658ffe1e39171be00490db5bd3b966f79634ac4215a1eb9a85c6cd6783bf7f6e"}, - {file = "grpcio-1.53.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:1b172e6d497191940c4b8d75b53de82dc252e15b61de2951d577ec5b43316b29"}, - {file = "grpcio-1.53.0-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:82434ba3a5935e47908bc861ce1ebc43c2edfc1001d235d6e31e5d3ed55815f7"}, - {file = "grpcio-1.53.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:1c734a2d4843e4e14ececf5600c3c4750990ec319e1299db7e4f0d02c25c1467"}, - {file = "grpcio-1.53.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6a2ead3de3b2d53119d473aa2f224030257ef33af1e4ddabd4afee1dea5f04c"}, - {file = "grpcio-1.53.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a34d6e905f071f9b945cabbcc776e2055de1fdb59cd13683d9aa0a8f265b5bf9"}, - {file = "grpcio-1.53.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eaf8e3b97caaf9415227a3c6ca5aa8d800fecadd526538d2bf8f11af783f1550"}, - {file = "grpcio-1.53.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:da95778d37be8e4e9afca771a83424f892296f5dfb2a100eda2571a1d8bbc0dc"}, - {file = "grpcio-1.53.0-cp311-cp311-win32.whl", hash = "sha256:e4f513d63df6336fd84b74b701f17d1bb3b64e9d78a6ed5b5e8a198bbbe8bbfa"}, - {file = "grpcio-1.53.0-cp311-cp311-win_amd64.whl", hash = "sha256:ddb2511fbbb440ed9e5c9a4b9b870f2ed649b7715859fd6f2ebc585ee85c0364"}, - {file = "grpcio-1.53.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:2a912397eb8d23c177d6d64e3c8bc46b8a1c7680b090d9f13a640b104aaec77c"}, - {file = "grpcio-1.53.0-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:55930c56b8f5b347d6c8c609cc341949a97e176c90f5cbb01d148d778f3bbd23"}, - {file = "grpcio-1.53.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:6601d812105583948ab9c6e403a7e2dba6e387cc678c010e74f2d6d589d1d1b3"}, - {file = "grpcio-1.53.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c705e0c21acb0e8478a00e7e773ad0ecdb34bd0e4adc282d3d2f51ba3961aac7"}, - {file = "grpcio-1.53.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba074af9ca268ad7b05d3fc2b920b5fb3c083da94ab63637aaf67f4f71ecb755"}, - {file = "grpcio-1.53.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:14817de09317dd7d3fbc8272864288320739973ef0f4b56bf2c0032349da8cdf"}, - {file = "grpcio-1.53.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c7ad9fbedb93f331c2e9054e202e95cf825b885811f1bcbbdfdc301e451442db"}, - {file = "grpcio-1.53.0-cp37-cp37m-win_amd64.whl", hash = "sha256:dad5b302a4c21c604d88a5d441973f320134e6ff6a84ecef9c1139e5ffd466f6"}, - {file = "grpcio-1.53.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:fa8eaac75d3107e3f5465f2c9e3bbd13db21790c6e45b7de1756eba16b050aca"}, - {file = "grpcio-1.53.0-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:104a2210edd3776c38448b4f76c2f16e527adafbde171fc72a8a32976c20abc7"}, - {file = "grpcio-1.53.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:dbc1ba968639c1d23476f75c356e549e7bbf2d8d6688717dcab5290e88e8482b"}, - {file = "grpcio-1.53.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:95952d3fe795b06af29bb8ec7bbf3342cdd867fc17b77cc25e6733d23fa6c519"}, - {file = "grpcio-1.53.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f144a790f14c51b8a8e591eb5af40507ffee45ea6b818c2482f0457fec2e1a2e"}, - {file = "grpcio-1.53.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0698c094688a2dd4c7c2f2c0e3e142cac439a64d1cef6904c97f6cde38ba422f"}, - {file = "grpcio-1.53.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6b6d60b0958be711bab047e9f4df5dbbc40367955f8651232bfdcdd21450b9ab"}, - {file = "grpcio-1.53.0-cp38-cp38-win32.whl", hash = "sha256:1948539ce78805d4e6256ab0e048ec793956d54787dc9d6777df71c1d19c7f81"}, - {file = "grpcio-1.53.0-cp38-cp38-win_amd64.whl", hash = "sha256:df9ba1183b3f649210788cf80c239041dddcb375d6142d8bccafcfdf549522cd"}, - {file = "grpcio-1.53.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:19caa5b7282a89b799e63776ff602bb39604f7ca98db6df27e2de06756ae86c3"}, - {file = "grpcio-1.53.0-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:b5bd026ac928c96cc23149e6ef79183125542062eb6d1ccec34c0a37e02255e7"}, - {file = "grpcio-1.53.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:7dc8584ca6c015ad82e186e82f4c0fe977394588f66b8ecfc4ec873285314619"}, - {file = "grpcio-1.53.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2eddaae8af625e45b5c8500dcca1043264d751a6872cde2eda5022df8a336959"}, - {file = "grpcio-1.53.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5fb6f3d7824696c1c9f2ad36ddb080ba5a86f2d929ef712d511b4d9972d3d27"}, - {file = "grpcio-1.53.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8270d1dc2c98ab57e6dbf36fa187db8df4c036f04a398e5d5e25b4e01a766d70"}, - {file = "grpcio-1.53.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:976a7f24eb213e8429cab78d5e120500dfcdeb01041f1f5a77b17b9101902615"}, - {file = "grpcio-1.53.0-cp39-cp39-win32.whl", hash = "sha256:9c84a481451e7174f3a764a44150f93b041ab51045aa33d7b5b68b6979114e48"}, - {file = "grpcio-1.53.0-cp39-cp39-win_amd64.whl", hash = "sha256:6beb84f83360ff29a3654f43f251ec11b809dcb5524b698d711550243debd289"}, - {file = "grpcio-1.53.0.tar.gz", hash = "sha256:a4952899b4931a6ba12951f9a141ef3e74ff8a6ec9aa2dc602afa40f63595e33"}, + {file = "grpcio-1.53.2-cp310-cp310-linux_armv7l.whl", hash = "sha256:18afdda2bbe0c615da4daff754cab0df9bbd859c415d85e7e741a2975b3208b4"}, + {file = "grpcio-1.53.2-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:33f7678287ac330c94e25f96cdb951e0861e206115ba4d8ea66cf6546b1a09d0"}, + {file = "grpcio-1.53.2-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:1af074f28a56425e4f4d99761708981543a27ae963f5b4b0a36ff71f3483479d"}, + {file = "grpcio-1.53.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df07843c8c0dc71a56d3af3dfe19165fb0d3af7d3354a72185f6fa1b4ac05cab"}, + {file = "grpcio-1.53.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b403c4ad22f3ba37c7720547d8888a1e4b74ad980a94332bbbc50330b623abc"}, + {file = "grpcio-1.53.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6275a54b41d6b1ec539b019bc3affaf6d05b0a0ba36af1a65b8a2810ef69e07d"}, + {file = "grpcio-1.53.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0e92dc6a85cd1de42527812ef1276095e62169d002d86c888b6e889fcda1dd29"}, + {file = "grpcio-1.53.2-cp310-cp310-win32.whl", hash = "sha256:6be86e8d5cf47415968588e5dfbfb92ee8757fb41139584192b67050d1a72c58"}, + {file = "grpcio-1.53.2-cp310-cp310-win_amd64.whl", hash = "sha256:5b49f372df33f5f84865aef5d46cacd23180b586c80e8cbe0ce149b96dfa8c4c"}, + {file = "grpcio-1.53.2-cp311-cp311-linux_armv7l.whl", hash = "sha256:8166ac6671472d172cc0db50323b7a7504bd534de54aa31354465a00ca44409d"}, + {file = "grpcio-1.53.2-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:f7e66d8b31ef2bada7029275debbe12c97397ec7ac70a659837a7b8a6a9dc916"}, + {file = "grpcio-1.53.2-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:712113946b303db9ae4245a13de213710367850a6c3c53530b70e87989feb8e0"}, + {file = "grpcio-1.53.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3761f9a6817e32898eaa5aecd0b0ad69d0c68ab45ea7bf206e8dc4548f025f0"}, + {file = "grpcio-1.53.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24c63592103fded38b258f1e520ba8b0a7a0bbc397cddd6520a1f74dc4b5dec0"}, + {file = "grpcio-1.53.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:53d34cbf212f03634d74ba366d595b4a06a3b60fcc731eddbd6fd7ebe4acf981"}, + {file = "grpcio-1.53.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3b789472e9ef75d179295d0c6a1f7f0aefd08189cd1c822b068b0523365a1dbe"}, + {file = "grpcio-1.53.2-cp311-cp311-win32.whl", hash = "sha256:7b44ed75b9d67d17e5a098a0f99a8fd3e5861fd3c4eb54212277a0acdf298434"}, + {file = "grpcio-1.53.2-cp311-cp311-win_amd64.whl", hash = "sha256:1d1a320230e0d020880178b8eb453300bd57700b44c3744268370502e7376a9b"}, + {file = "grpcio-1.53.2-cp37-cp37m-linux_armv7l.whl", hash = "sha256:69e99fe6bdc2cdacd04cef6b6585b00630d958c98e36d825de3eea406e15fb31"}, + {file = "grpcio-1.53.2-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:590c7206f764cfe37a65003a75977358e20919ed488f970935f54efa2741b497"}, + {file = "grpcio-1.53.2-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:1fcced1abb13cdb6a5d8b105765d30212a6cb29ab0dfb01eedecf2ff6c84371b"}, + {file = "grpcio-1.53.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07b83c06e7d113044cf3da15ca52f578c5f3dca299af711e9a589c1b71eb8be5"}, + {file = "grpcio-1.53.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3bee217bda6b2c81d9e2866f523217135a03a007a89043eee074e93d76706b0"}, + {file = "grpcio-1.53.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9efbedc737ba342d8a2459afc9bd5c5df31adcdf774b772a4e663739f2cf0d06"}, + {file = "grpcio-1.53.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0f76287d98ec79a38cba8292d0bdcd6ab9b9daf568dce1d53b9eb0135fc14d26"}, + {file = "grpcio-1.53.2-cp37-cp37m-win_amd64.whl", hash = "sha256:d406cf2f6ccf39883a24b048c448a37bac16939408c1b6fbb4d021f3cd961448"}, + {file = "grpcio-1.53.2-cp38-cp38-linux_armv7l.whl", hash = "sha256:f9f7c0dd17f24e1774cc3a8df738246772994e853c28b28ed6ba7711ccf0abb4"}, + {file = "grpcio-1.53.2-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:f14a82d12d53eb93298c35edf88d8c3ef37243b95f94dd3c75fddcba575d34ab"}, + {file = "grpcio-1.53.2-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:1deeb84bb344351434f999cea4704ac6f1e07b3d861e34c44b50d8afa06caaa1"}, + {file = "grpcio-1.53.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7cbf1e3aaec3edf734ef90182363a395d234cd4790544be914cedbe1b9fec99a"}, + {file = "grpcio-1.53.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ea235cecb9df14b49a75cbd27a634683a96bb76576363407ec820ae454ce2b2"}, + {file = "grpcio-1.53.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1df931fbb4c36363d2cb985c2c26fda8f060b541a89c6c1191fdb59151a8c934"}, + {file = "grpcio-1.53.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7734d1b91f1f3b1f186debf8ec4d168ee088a54e8186c14d89a95f7e51d3198d"}, + {file = "grpcio-1.53.2-cp38-cp38-win32.whl", hash = "sha256:b16258a31269b97e26a08d71b5deb56499e86077d26e453fad8f6ec4c06fe666"}, + {file = "grpcio-1.53.2-cp38-cp38-win_amd64.whl", hash = "sha256:b676c4365a5753bc8c49f922a5f88bdb5df6746c670a9d859d2ba2f5f97d9269"}, + {file = "grpcio-1.53.2-cp39-cp39-linux_armv7l.whl", hash = "sha256:8fc7667564c8c15748354dea1bb4035c5118df4e9dc5154ccdb6e62a3e5a2bac"}, + {file = "grpcio-1.53.2-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:80a8867746cff41c2db436dd9eea18ebbfcd0449d65b64b3ed3c995207898971"}, + {file = "grpcio-1.53.2-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:431f864f2642a97d0aa8c6b606c307f03d22f919b1a226af90488426aed35809"}, + {file = "grpcio-1.53.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bea6a20c5a732a27b64623d43614b3022e6fcfc081a75236b7f9aa069d2eaa4d"}, + {file = "grpcio-1.53.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:504af9e86ab01c9c33d8a452fe846aa931d024945f2e897537ccb8f7d76778ee"}, + {file = "grpcio-1.53.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2b4f5671f9e88b7f51f54adda37a23277b7fdebd1557c47543b3e8a8044dd510"}, + {file = "grpcio-1.53.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d9c51ca201326b49cfee38336c6e7dd1cb8a6b6d0dcf84aeaecbae310a736dbc"}, + {file = "grpcio-1.53.2-cp39-cp39-win32.whl", hash = "sha256:7e6885a8431939f1ee547e965fa3cb801a518b83d3d3509e90dbef78f0b5fd29"}, + {file = "grpcio-1.53.2-cp39-cp39-win_amd64.whl", hash = "sha256:ea84becb5cbd6a94a810c5214eb263ae57e915a9ed1bdcd5b4a6baf13d8c5177"}, + {file = "grpcio-1.53.2.tar.gz", hash = "sha256:0c9e42f2499c8603af1d88771dc97e2c6b0310c278337058fd7fd1ddb35ab853"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.53.0)"] +protobuf = ["grpcio-tools (>=1.53.2)"] [[package]] name = "hexbytes" @@ -2070,4 +2070,4 @@ testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools" [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "191a35313c25dbaca42dd6ebba71b1803c4ba34e5dd1054ea64108ddf0d25835" +content-hash = "6bb31a0bcaea7689b9387a8cb74c3c3f42de546f9708facab0c7c6a5d1d1a8d2" diff --git a/tests/nix_tests/pyproject.toml b/tests/nix_tests/pyproject.toml index fc8730b0c3..3642e7533e 100644 --- a/tests/nix_tests/pyproject.toml +++ b/tests/nix_tests/pyproject.toml @@ -14,7 +14,7 @@ flake8-black = "^0.3.2" flake8-isort = "^4.1.1" pep8-naming = "^0.11.1" protobuf = "^3.13.0" -grpcio = "^1.53.0" +grpcio = "^1.53.2" PyYAML = "^5.3.1" python-dateutil = "^2.8.1" web3 = "^6.0.0b6" From 9b0e8daa62505d0c5574e28c8e0eedfb3d764fb6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Feb 2024 12:57:14 +0100 Subject: [PATCH 125/345] build(deps): bump golangci/golangci-lint-action from 3.7.1 to 4.0.0 (#2345) Bumps [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action) from 3.7.1 to 4.0.0. - [Release notes](https://github.com/golangci/golangci-lint-action/releases) - [Commits](https://github.com/golangci/golangci-lint-action/compare/v3.7.1...v4.0.0) --- updated-dependencies: - dependency-name: golangci/golangci-lint-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 8afe73c85a..f3a9e68732 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -23,7 +23,7 @@ jobs: go.mod go.sum *.toml - - uses: golangci/golangci-lint-action@v3.7.1 + - uses: golangci/golangci-lint-action@v4.0.0 with: # Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version. version: latest From 35871aee29993a1dd373d14db6c90d4c39b7015c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Feb 2024 08:15:01 +0000 Subject: [PATCH 126/345] build(deps): bump github.com/cometbft/cometbft-db from 0.10.0 to 0.11.0 (#2333) * build(deps): bump github.com/cometbft/cometbft-db from 0.10.0 to 0.11.0 Bumps [github.com/cometbft/cometbft-db](https://github.com/cometbft/cometbft-db) from 0.10.0 to 0.11.0. - [Release notes](https://github.com/cometbft/cometbft-db/releases) - [Changelog](https://github.com/cometbft/cometbft-db/blob/main/CHANGELOG.md) - [Commits](https://github.com/cometbft/cometbft-db/compare/v0.10.0...v0.11.0) --- updated-dependencies: - dependency-name: github.com/cometbft/cometbft-db dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * update gomod2nix.toml file --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: GAtom22 --- go.mod | 7 ++++--- go.sum | 18 ++++++++++-------- gomod2nix.toml | 15 +++++++++------ 3 files changed, 23 insertions(+), 17 deletions(-) diff --git a/go.mod b/go.mod index e4125fd7a2..8ab4bf2f27 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/btcsuite/btcd v0.24.0 github.com/btcsuite/btcd/btcutil v1.1.5 github.com/cometbft/cometbft v0.37.4 - github.com/cometbft/cometbft-db v0.10.0 + github.com/cometbft/cometbft-db v0.11.0 github.com/cosmos/cosmos-proto v1.0.0-beta.3 github.com/cosmos/cosmos-sdk v0.47.8 github.com/cosmos/go-bip39 v1.0.0 @@ -86,10 +86,11 @@ require ( github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/chzyer/readline v1.5.1 // indirect github.com/cockroachdb/apd/v2 v2.0.2 // indirect - github.com/cockroachdb/errors v1.10.0 // indirect + github.com/cockroachdb/errors v1.11.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v1.0.0 // indirect + github.com/cockroachdb/pebble v1.1.0 // indirect github.com/cockroachdb/redact v1.1.5 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/coinbase/rosetta-sdk-go/types v1.0.0 // indirect github.com/confio/ics23/go v0.9.0 // indirect github.com/containerd/continuity v0.3.0 // indirect diff --git a/go.sum b/go.sum index 26db6e2fcc..9c30e36865 100644 --- a/go.sum +++ b/go.sum @@ -345,23 +345,25 @@ github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWH github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= -github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.10.0 h1:lfxS8zZz1+OjtV4MtNWgboi/W5tyLEB6VQZBXN+0VUU= -github.com/cockroachdb/errors v1.10.0/go.mod h1:lknhIsEVQ9Ss/qKDBQS/UqFSvPQjOwNq2qyKAxtHRqE= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= +github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v1.0.0 h1:WZWlV/s78glZbY2ylUITDOWSVBD3cLjcWPLRPFbHNYg= -github.com/cockroachdb/pebble v1.0.0/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= +github.com/cockroachdb/pebble v1.1.0 h1:pcFh8CdCIt2kmEpK0OIatq67Ln9uGDYY3d5XnE0LJG4= +github.com/cockroachdb/pebble v1.1.0/go.mod h1:sEHm5NOXxyiAoKWhoFxT8xMgd/f3RA6qUqQ1BXKrh2E= github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/coinbase/rosetta-sdk-go/types v1.0.0 h1:jpVIwLcPoOeCR6o1tU+Xv7r5bMONNbHU7MuEHboiFuA= github.com/coinbase/rosetta-sdk-go/types v1.0.0/go.mod h1:eq7W2TMRH22GTW0N0beDnN931DW0/WOI1R2sdHNHG4c= github.com/cometbft/cometbft v0.37.4 h1:xyvvEqlyfK8MgNIIKVJaMsuIp03wxOcFmVkT26+Ikpg= github.com/cometbft/cometbft v0.37.4/go.mod h1:Cmg5Hp4sNpapm7j+x0xRyt2g0juQfmB752ous+pA0G8= -github.com/cometbft/cometbft-db v0.10.0 h1:VMBQh88zXn64jXVvj39tlu/IgsGR84T7ImjS523DCiU= -github.com/cometbft/cometbft-db v0.10.0/go.mod h1:7RR7NRv99j7keWJ5IkE9iZibUTKYdtepXTp7Ra0FxKk= +github.com/cometbft/cometbft-db v0.11.0 h1:M3Lscmpogx5NTbb1EGyGDaFRdsoLWrUWimFEyf7jej8= +github.com/cometbft/cometbft-db v0.11.0/go.mod h1:GDPJAC/iFHNjmZZPN8V8C1yr/eyityhi2W1hz2MGKSc= github.com/confio/ics23/go v0.9.0 h1:cWs+wdbS2KRPZezoaaj+qBleXgUk5WOQFMP3CQFGTr4= github.com/confio/ics23/go v0.9.0/go.mod h1:4LPZ2NYqnYIVRklaozjNR1FScgDJ2s5Xrp+e/mYVRak= github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= diff --git a/gomod2nix.toml b/gomod2nix.toml index e5cf19f787..343d5c6168 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -117,17 +117,20 @@ schema = 3 version = "v2.0.2" hash = "sha256-UrPHkvqVF8V78+kXKmjTHl79XsgDBnqFsje5BMYh0E4=" [mod."github.com/cockroachdb/errors"] - version = "v1.10.0" - hash = "sha256-l6CCw3FKGNaGlwzLfAaF0cruf3E9MZr6GK1GZ+vQm2c=" + version = "v1.11.1" + hash = "sha256-ufKtavyfW/i3ZemiqDqKGc0JM+f0IBi6bZWkZyb/jdc=" [mod."github.com/cockroachdb/logtags"] version = "v0.0.0-20230118201751-21c54148d20b" hash = "sha256-7dQH6j1o99fuxHKkw0RhNC5wJKkvRLMDJpUiVnDx6h8=" [mod."github.com/cockroachdb/pebble"] - version = "v1.0.0" - hash = "sha256-oIMajhqta96d74XxTvMizFmtlPQ/QGIKg+cUzH/1ycU=" + version = "v1.1.0" + hash = "sha256-igtoXdKzENNqaL3mLSUzZvqaSAmkNlrWN/ZnVTwA7Bk=" [mod."github.com/cockroachdb/redact"] version = "v1.1.5" hash = "sha256-0rtT7LRO0wxf9XovOK8GXRrhmx8OcbdPK/mXOKbJdog=" + [mod."github.com/cockroachdb/tokenbucket"] + version = "v0.0.0-20230807174530-cc333fc44b06" + hash = "sha256-yZdBXkTVzPxRYntI9I2Gu4gkI11m52Nwl8RNNdlXSrA=" [mod."github.com/coinbase/rosetta-sdk-go/types"] version = "v1.0.0" hash = "sha256-z/0E0NiEGo7zxM7d94ImgUf8P0/KG6hbP9T4Vuym4p0=" @@ -135,8 +138,8 @@ schema = 3 version = "v0.37.4" hash = "sha256-rEzIdkxeE5FsIGwvzZiPdifPr0v9SmKHQw78I7v2WUA=" [mod."github.com/cometbft/cometbft-db"] - version = "v0.10.0" - hash = "sha256-+X0bghfGcsudcjWrdXijx0FnimzGF6ZsLp52cbImjEE=" + version = "v0.11.0" + hash = "sha256-qs3J+9ZW7gStN2W+5SQf/JSmgX5Q5kmIau1BLxze5iE=" [mod."github.com/confio/ics23/go"] version = "v0.9.0" hash = "sha256-guD8w7YygfUp7lpTAUyXQuCPx8F3lXkcg+yR5+JOCbk=" From 57cba411c2c1003e3e5ee7ec7ab113de8003a0d8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 14 Feb 2024 14:51:15 +0100 Subject: [PATCH 127/345] build(deps): bump google.golang.org/grpc from 1.61.0 to 1.61.1 (#2349) * build(deps): bump google.golang.org/grpc from 1.61.0 to 1.61.1 Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.61.0 to 1.61.1. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.61.0...v1.61.1) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * gomod2nix generate --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: tom --- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 8ab4bf2f27..5953bd5420 100644 --- a/go.mod +++ b/go.mod @@ -50,7 +50,7 @@ require ( golang.org/x/net v0.21.0 golang.org/x/text v0.14.0 google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0 - google.golang.org/grpc v1.61.0 + google.golang.org/grpc v1.61.1 google.golang.org/protobuf v1.32.0 sigs.k8s.io/yaml v1.4.0 ) diff --git a/go.sum b/go.sum index 9c30e36865..95d592f2cb 100644 --- a/go.sum +++ b/go.sum @@ -1819,8 +1819,8 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.61.0 h1:TOvOcuXn30kRao+gfcvsebNEa5iZIiLkisYEkf7R7o0= -google.golang.org/grpc v1.61.0/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= +google.golang.org/grpc v1.61.1 h1:kLAiWrZs7YeDM6MumDe7m3y4aM6wacLzM1Y/wiLP9XY= +google.golang.org/grpc v1.61.1/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= diff --git a/gomod2nix.toml b/gomod2nix.toml index 343d5c6168..d572a30d8f 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -703,8 +703,8 @@ schema = 3 version = "v0.0.0-20240108191215-35c7eff3a6b1" hash = "sha256-bwWoFG+H827aJ3VunK7emdQz3BQlTTjWlM513kTZqSo=" [mod."google.golang.org/grpc"] - version = "v1.61.0" - hash = "sha256-+LvlQyeIaM0GgOQoa3rVmM9OS0UtbdK54Fvl3dgJEt8=" + version = "v1.61.1" + hash = "sha256-IhktITVoap1VEFwRjjZp5Kx6EM7DNF0+xPWA9zeZaOU=" [mod."google.golang.org/protobuf"] version = "v1.32.0" hash = "sha256-GJuTkMGHCzHbyK4yD5kY4oMn8wQWqgkeBK//yVDqHJk=" From b812bbc0476f50e22bd4aab7e57b2b29b1924ceb Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Fri, 16 Feb 2024 08:49:59 -0300 Subject: [PATCH 128/345] chore(deps): bump sdk to v0.47.8 (#2355) * chore(dep) bump sdk to v0.47.8 * add changelog entry * gomod2nix generate * fix chlog * fix changelog --------- Co-authored-by: MalteHerrmann --- CHANGELOG.md | 3 ++- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 487ce8dda5..3e52e3225f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,6 +46,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (erc20) [#2217](https://github.com/evmos/evmos/pull/2217) Add logic to deploy token pairs contracts on genesis. - (erc20) [#2292](https://github.com/evmos/evmos/pull/2292) Revert unnecessary logic on genesis (reverts #2217). - (tests) [#2332](https://github.com/evmos/evmos/pull/2332) Create configuration in temporary directory in `Init` command test. +- (deps) [#2355](https://github.com/evmos/evmos/pull/2355) Bump Cosmos-SDK to v0.47.8-evmos. ### Bug Fixes @@ -71,7 +72,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (tests) [#2311](https://github.com/evmos/evmos/pull/2311) Fix post-upgrade transactions in automated upgrade tests. - (build) [#2319](https://github.com/evmos/evmos/pull/2319) Bump go.mod golang version to v1.21. - (ci) [#2321](https://github.com/evmos/evmos/pull/2321) Add build and markdown lint checker for `main` and `release` branches. -- (wevmos) [#2329](https://github.com/evmos/evmos/pull/2329) Make WEVMOS precompile `deposit` and `withdraw` functions no-ops. +- (werc20-precompile) [#2329](https://github.com/evmos/evmos/pull/2329) Make WEVMOS precompile `deposit` and `withdraw` functions no-ops. ## [v16.0.2](https://github.com/evmos/evmos/releases/tag/v16.0.2) - 2024-01-16 diff --git a/go.mod b/go.mod index 5953bd5420..ef78f6f756 100644 --- a/go.mod +++ b/go.mod @@ -253,7 +253,7 @@ replace ( // use cosmos fork of keyring github.com/99designs/keyring => github.com/cosmos/keyring v1.2.0 // use Cosmos-SDK fork to enable Ledger functionality - github.com/cosmos/cosmos-sdk => github.com/evmos/cosmos-sdk v0.47.5-evmos.2 + github.com/cosmos/cosmos-sdk => github.com/evmos/cosmos-sdk v0.47.8-evmos // use Evmos geth fork github.com/ethereum/go-ethereum => github.com/evmos/go-ethereum v1.10.26-evmos-rc2 // Security Advisory https://github.com/advisories/GHSA-h395-qcrw-5vmq diff --git a/go.sum b/go.sum index 95d592f2cb..734d2ad247 100644 --- a/go.sum +++ b/go.sum @@ -478,8 +478,8 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.m github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evmos/cosmos-sdk v0.47.5-evmos.2 h1:fyhM0NYw/FnP4ZBXzQ7k+G4fXhfdU07MONoYrGlOCpc= -github.com/evmos/cosmos-sdk v0.47.5-evmos.2/go.mod h1:EHwCeN9IXonsjKcjpS12MqeStdZvIdxt3VYXhus3G3c= +github.com/evmos/cosmos-sdk v0.47.8-evmos h1:XOkJq3MeWDnTrNfDZk1bvCdrmjyyoxyL5gaTrguHPuA= +github.com/evmos/cosmos-sdk v0.47.8-evmos/go.mod h1:VTAtthIsmfplanhFfUTfT6ED4F+kkJxT7nmvmKXRthI= github.com/evmos/go-ethereum v1.10.26-evmos-rc2 h1:tYghk1ZZ8X4/OQ4YI9hvtm8aSN8OSqO0g9vo/sCMdBo= github.com/evmos/go-ethereum v1.10.26-evmos-rc2/go.mod h1:/6CsT5Ceen2WPLI/oCA3xMcZ5sWMF/D46SjM/ayY0Oo= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= diff --git a/gomod2nix.toml b/gomod2nix.toml index d572a30d8f..70cb837c1e 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -153,8 +153,8 @@ schema = 3 version = "v1.0.0-beta.3" hash = "sha256-V0/ZhRdqK7Cqcv8X30gr33/hlI54bRXeHhI9LZKyLt8=" [mod."github.com/cosmos/cosmos-sdk"] - version = "v0.47.5-evmos.2" - hash = "sha256-tFVpEPPxOGoIbEz0lYCTUnOsExmXmIFJKEzPgWiBjq8=" + version = "v0.47.8-evmos" + hash = "sha256-B+0qa8x/FKNcTV4iQIStB7zz26JXzruoTBRP4voZlbo=" replaced = "github.com/evmos/cosmos-sdk" [mod."github.com/cosmos/go-bip39"] version = "v1.0.0" From 0984dda9993aca5fa0635cc52abd4d97f2a2690e Mon Sep 17 00:00:00 2001 From: Freddy Caceres Date: Sat, 17 Feb 2024 21:43:00 -0500 Subject: [PATCH 129/345] imp(tests): Upstream Integration tests suite from sdk50 branch (#2348) * imp(tests): Upstream Integration tests suite from sdk50 branch * Apply suggestions from code review Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> * review comments * update changelog * Update CHANGELOG.md --------- Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> --- CHANGELOG.md | 1 + .../integration/evmos/factory/broadcast.go | 28 ++---- testutil/integration/evmos/factory/build.go | 87 ++++++++++++++++++- testutil/integration/evmos/factory/factory.go | 39 +++++---- 4 files changed, 112 insertions(+), 43 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3e52e3225f..9d91368870 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -73,6 +73,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (build) [#2319](https://github.com/evmos/evmos/pull/2319) Bump go.mod golang version to v1.21. - (ci) [#2321](https://github.com/evmos/evmos/pull/2321) Add build and markdown lint checker for `main` and `release` branches. - (werc20-precompile) [#2329](https://github.com/evmos/evmos/pull/2329) Make WEVMOS precompile `deposit` and `withdraw` functions no-ops. +- (tests) [#2348](https://github.com/evmos/evmos/pull/2348) Extend integration transaction factory utils. ## [v16.0.2](https://github.com/evmos/evmos/releases/tag/v16.0.2) - 2024-01-16 diff --git a/testutil/integration/evmos/factory/broadcast.go b/testutil/integration/evmos/factory/broadcast.go index fe18e572b2..13e7fbb819 100644 --- a/testutil/integration/evmos/factory/broadcast.go +++ b/testutil/integration/evmos/factory/broadcast.go @@ -39,16 +39,14 @@ func (tf *IntegrationTxFactory) ExecuteEthTx( return res, nil } -// ExecuteContractCall executes a contract call with the provided private key +// ExecuteContractCall executes a contract call with the provided private key. func (tf *IntegrationTxFactory) ExecuteContractCall(privKey cryptotypes.PrivKey, txArgs evmtypes.EvmTxArgs, callArgs CallArgs) (abcitypes.ResponseDeliverTx, error) { - // Create MsgEthereumTx that calls the contract - input, err := callArgs.ContractABI.Pack(callArgs.MethodName, callArgs.Args...) + completeTxArgs, err := tf.GenerateContractCallArgs(txArgs, callArgs) if err != nil { - return abcitypes.ResponseDeliverTx{}, errorsmod.Wrap(err, "failed to pack contract arguments") + return abcitypes.ResponseDeliverTx{}, errorsmod.Wrap(err, "failed to generate contract call args") } - txArgs.Input = input - return tf.ExecuteEthTx(privKey, txArgs) + return tf.ExecuteEthTx(privKey, completeTxArgs) } // DeployContract deploys a contract with the provided private key, @@ -61,26 +59,16 @@ func (tf *IntegrationTxFactory) DeployContract( ) (common.Address, error) { // Get account's nonce to create contract hash from := common.BytesToAddress(priv.PubKey().Address().Bytes()) - account, err := tf.grpcHandler.GetEvmAccount(from) + completeTxArgs, err := tf.GenerateDeployContractArgs(from, txArgs, deploymentData) if err != nil { - return common.Address{}, errorsmod.Wrapf(err, "failed to get evm account: %s", from.String()) + return common.Address{}, errorsmod.Wrap(err, "failed to generate contract call args") } - nonce := account.GetNonce() - ctorArgs, err := deploymentData.Contract.ABI.Pack("", deploymentData.ConstructorArgs...) - if err != nil { - return common.Address{}, errorsmod.Wrap(err, "failed to pack constructor arguments") - } - data := deploymentData.Contract.Bin - data = append(data, ctorArgs...) - - txArgs.Input = data - txArgs.Nonce = nonce - res, err := tf.ExecuteEthTx(priv, txArgs) + res, err := tf.ExecuteEthTx(priv, completeTxArgs) if err != nil || !res.IsOK() { return common.Address{}, errorsmod.Wrap(err, "failed to execute eth tx") } - return crypto.CreateAddress(from, nonce), nil + return crypto.CreateAddress(from, completeTxArgs.Nonce), nil } // CallContractAndCheckLogs is a helper function to call a contract and check the logs using diff --git a/testutil/integration/evmos/factory/build.go b/testutil/integration/evmos/factory/build.go index ef197b9728..326818da0d 100644 --- a/testutil/integration/evmos/factory/build.go +++ b/testutil/integration/evmos/factory/build.go @@ -12,6 +12,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/signing" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core" gethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/evmos/evmos/v16/server/config" evmtypes "github.com/evmos/evmos/v16/x/evm/types" @@ -21,17 +22,17 @@ func (tf *IntegrationTxFactory) GenerateDefaultTxTypeArgs(sender common.Address, defaultArgs := evmtypes.EvmTxArgs{} switch txType { case gethtypes.DynamicFeeTxType: - return tf.populateEvmTxArgs(sender, defaultArgs) + return tf.populateEvmTxArgsWithDefault(sender, defaultArgs) case gethtypes.AccessListTxType: defaultArgs.Accesses = &gethtypes.AccessList{{ Address: sender, StorageKeys: []common.Hash{{0}}, }} defaultArgs.GasPrice = big.NewInt(1e9) - return tf.populateEvmTxArgs(sender, defaultArgs) + return tf.populateEvmTxArgsWithDefault(sender, defaultArgs) case gethtypes.LegacyTxType: defaultArgs.GasPrice = big.NewInt(1e9) - return tf.populateEvmTxArgs(sender, defaultArgs) + return tf.populateEvmTxArgsWithDefault(sender, defaultArgs) default: return evmtypes.EvmTxArgs{}, errors.New("tx type not supported") } @@ -59,7 +60,7 @@ func (tf *IntegrationTxFactory) EstimateGasLimit(from *common.Address, txArgs *e // GenerateSignedEthTx generates an Ethereum tx with the provided private key and txArgs but does not broadcast it. func (tf *IntegrationTxFactory) GenerateSignedEthTx(privKey cryptotypes.PrivKey, txArgs evmtypes.EvmTxArgs) (signing.Tx, error) { - msgEthereumTx, err := tf.createMsgEthereumTx(privKey, txArgs) + msgEthereumTx, err := tf.GenerateMsgEthereumTx(privKey, txArgs) if err != nil { return nil, errorsmod.Wrap(err, "failed to create ethereum tx") } @@ -76,3 +77,81 @@ func (tf *IntegrationTxFactory) GenerateSignedEthTx(privKey cryptotypes.PrivKey, return tf.buildSignedTx(signedMsg) } + +// GenerateMsgEthereumTx creates a new MsgEthereumTx with the provided arguments. +// If any of the arguments are not provided, they will be populated with default values. +func (tf *IntegrationTxFactory) GenerateMsgEthereumTx( + privKey cryptotypes.PrivKey, + txArgs evmtypes.EvmTxArgs, +) (evmtypes.MsgEthereumTx, error) { + fromAddr := common.BytesToAddress(privKey.PubKey().Address().Bytes()) + // Fill TxArgs with default values + txArgs, err := tf.populateEvmTxArgsWithDefault(fromAddr, txArgs) + if err != nil { + return evmtypes.MsgEthereumTx{}, errorsmod.Wrap(err, "failed to populate tx args") + } + msg := buildMsgEthereumTx(txArgs, fromAddr) + + return msg, nil +} + +// GenerateGethCoreMsg creates a new GethCoreMsg with the provided arguments. +func (tf *IntegrationTxFactory) GenerateGethCoreMsg( + privKey cryptotypes.PrivKey, + txArgs evmtypes.EvmTxArgs, +) (core.Message, error) { + msg, err := tf.GenerateMsgEthereumTx(privKey, txArgs) + if err != nil { + return nil, errorsmod.Wrap(err, "failed to generate ethereum tx") + } + + signedMsg, err := tf.SignMsgEthereumTx(privKey, msg) + if err != nil { + return nil, errorsmod.Wrap(err, "failed to sign ethereum tx") + } + + baseFeeResp, err := tf.grpcHandler.GetBaseFee() + if err != nil { + return nil, errorsmod.Wrap(err, "failed to get base fee") + } + signer := gethtypes.LatestSignerForChainID( + tf.network.GetEIP155ChainID(), + ) + return signedMsg.AsMessage(signer, baseFeeResp.BaseFee.BigInt()) +} + +// GenerateContractCallArgs generates the txArgs for a contract call. +func (tf *IntegrationTxFactory) GenerateContractCallArgs( + txArgs evmtypes.EvmTxArgs, + callArgs CallArgs, +) (evmtypes.EvmTxArgs, error) { + input, err := callArgs.ContractABI.Pack(callArgs.MethodName, callArgs.Args...) + if err != nil { + return evmtypes.EvmTxArgs{}, errorsmod.Wrap(err, "failed to pack contract arguments") + } + txArgs.Input = input + return txArgs, nil +} + +// GenerateDeployContractArgs generates the txArgs for a contract deployment. +func (tf *IntegrationTxFactory) GenerateDeployContractArgs( + from common.Address, + txArgs evmtypes.EvmTxArgs, + deploymentData ContractDeploymentData, +) (evmtypes.EvmTxArgs, error) { + account, err := tf.grpcHandler.GetEvmAccount(from) + if err != nil { + return evmtypes.EvmTxArgs{}, errorsmod.Wrapf(err, "failed to get evm account: %s", from.String()) + } + txArgs.Nonce = account.GetNonce() + + ctorArgs, err := deploymentData.Contract.ABI.Pack("", deploymentData.ConstructorArgs...) + if err != nil { + return evmtypes.EvmTxArgs{}, errorsmod.Wrap(err, "failed to pack constructor arguments") + } + data := deploymentData.Contract.Bin + data = append(data, ctorArgs...) + + txArgs.Input = data + return txArgs, nil +} diff --git a/testutil/integration/evmos/factory/factory.go b/testutil/integration/evmos/factory/factory.go index 83868aebbc..1eba200939 100644 --- a/testutil/integration/evmos/factory/factory.go +++ b/testutil/integration/evmos/factory/factory.go @@ -15,6 +15,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/signing" "github.com/cosmos/gogoproto/proto" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" "github.com/evmos/evmos/v16/app" "github.com/evmos/evmos/v16/precompiles/testutil" commonfactory "github.com/evmos/evmos/v16/testutil/integration/common/factory" @@ -32,8 +33,6 @@ type TxFactory interface { // GenerateDefaultTxTypeArgs generates a default ETH tx args for the desired tx type GenerateDefaultTxTypeArgs(sender common.Address, txType int) (evmtypes.EvmTxArgs, error) - // EstimateGasLimit estimates the gas limit for a tx with the provided address and txArgs - EstimateGasLimit(from *common.Address, txArgs *evmtypes.EvmTxArgs) (uint64, error) // GenerateSignedEthTx generates an Ethereum tx with the provided private key and txArgs but does not broadcast it. GenerateSignedEthTx(privKey cryptotypes.PrivKey, txArgs evmtypes.EvmTxArgs) (signing.Tx, error) @@ -54,6 +53,18 @@ type TxFactory interface { // It returns the Cosmos Tx response, the decoded Ethereum Tx response and an error. This error value // is nil, if the expected logs are found and the VM error is the expected one, should one be expected. CallContractAndCheckLogs(privKey cryptotypes.PrivKey, txArgs evmtypes.EvmTxArgs, callArgs CallArgs, logCheckArgs testutil.LogCheckArgs) (abcitypes.ResponseDeliverTx, *evmtypes.MsgEthereumTxResponse, error) + // GenerateDeployContractArgs generates the txArgs for a contract deployment. + GenerateDeployContractArgs(from common.Address, txArgs evmtypes.EvmTxArgs, deploymentData ContractDeploymentData) (evmtypes.EvmTxArgs, error) + // GenerateContractCallArgs generates the txArgs for a contract call. + GenerateContractCallArgs(txArgs evmtypes.EvmTxArgs, callArgs CallArgs) (evmtypes.EvmTxArgs, error) + // GenerateMsgEthereumTx creates a new MsgEthereumTx with the provided arguments. + GenerateMsgEthereumTx(privKey cryptotypes.PrivKey, txArgs evmtypes.EvmTxArgs) (evmtypes.MsgEthereumTx, error) + // GenerateGethCoreMsg creates a new GethCoreMsg with the provided arguments. + GenerateGethCoreMsg(privKey cryptotypes.PrivKey, txArgs evmtypes.EvmTxArgs) (core.Message, error) + // EstimateGasLimit estimates the gas limit for a tx with the provided address and txArgs. + EstimateGasLimit(from *common.Address, txArgs *evmtypes.EvmTxArgs) (uint64, error) + // GetEvmTxResponseFromTxResult returns the MsgEthereumTxResponse from the provided txResult. + GetEvmTxResponseFromTxResult(txResult abcitypes.ResponseDeliverTx) (*evmtypes.MsgEthereumTxResponse, error) } var _ TxFactory = (*IntegrationTxFactory)(nil) @@ -81,26 +92,16 @@ func New( } } -// createMsgEthereumTx creates a new MsgEthereumTx with the provided arguments. -// If any of the arguments are not provided, they will be populated with default values. -func (tf *IntegrationTxFactory) createMsgEthereumTx( - privKey cryptotypes.PrivKey, - txArgs evmtypes.EvmTxArgs, -) (evmtypes.MsgEthereumTx, error) { - fromAddr := common.BytesToAddress(privKey.PubKey().Address().Bytes()) - // Fill TxArgs with default values - txArgs, err := tf.populateEvmTxArgs(fromAddr, txArgs) - if err != nil { - return evmtypes.MsgEthereumTx{}, errorsmod.Wrap(err, "failed to populate tx args") - } - msg := buildMsgEthereumTx(txArgs, fromAddr) - - return msg, nil +// GetEvmTxResponseFromTxResult returns the MsgEthereumTxResponse from the provided txResult. +func (tf *IntegrationTxFactory) GetEvmTxResponseFromTxResult( + txResult abcitypes.ResponseDeliverTx, +) (*evmtypes.MsgEthereumTxResponse, error) { + return evmtypes.DecodeTxResponse(txResult.Data) } -// populateEvmTxArgs populates the missing fields in the provided EvmTxArgs with default values. +// populateEvmTxArgsWithDefault populates the missing fields in the provided EvmTxArgs with default values. // If no GasLimit is present it will estimate the gas needed for the transaction. -func (tf *IntegrationTxFactory) populateEvmTxArgs( +func (tf *IntegrationTxFactory) populateEvmTxArgsWithDefault( fromAddr common.Address, txArgs evmtypes.EvmTxArgs, ) (evmtypes.EvmTxArgs, error) { From 7148f5656b0b61605b2fc18cc768e68aba7af222 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 Feb 2024 11:26:54 +0100 Subject: [PATCH 130/345] build(deps): bump undici from 5.26.3 to 5.28.3 in /tests/solidity (#2358) Bumps [undici](https://github.com/nodejs/undici) from 5.26.3 to 5.28.3. - [Release notes](https://github.com/nodejs/undici/releases) - [Commits](https://github.com/nodejs/undici/compare/v5.26.3...v5.28.3) --- updated-dependencies: - dependency-name: undici dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Vladislav Varadinov --- tests/solidity/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/solidity/yarn.lock b/tests/solidity/yarn.lock index 32322f9b8f..a6afa450f4 100644 --- a/tests/solidity/yarn.lock +++ b/tests/solidity/yarn.lock @@ -10962,9 +10962,9 @@ unbox-primitive@^1.0.2: which-boxed-primitive "^1.0.2" undici@^5.14.0: - version "5.26.3" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.26.3.tgz#ab3527b3d5bb25b12f898dfd22165d472dd71b79" - integrity sha512-H7n2zmKEWgOllKkIUkLvFmsJQj062lSm3uA4EYApG8gLuiOM0/go9bIoC3HVaSnfg4xunowDE2i9p8drkXuvDw== + version "5.28.3" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.3.tgz#a731e0eff2c3fcfd41c1169a869062be222d1e5b" + integrity sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA== dependencies: "@fastify/busboy" "^2.0.0" From e1a3bbd789cb2260f517885dce5d502a78778409 Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Mon, 19 Feb 2024 10:34:00 -0300 Subject: [PATCH 131/345] chore(tests): update hardhat version (#2362) --- .../solidity/suites/precompiles/package.json | 2 +- tests/solidity/yarn.lock | 422 +++++++++--------- 2 files changed, 202 insertions(+), 222 deletions(-) diff --git a/tests/solidity/suites/precompiles/package.json b/tests/solidity/suites/precompiles/package.json index e55eecdafc..4324180a8f 100644 --- a/tests/solidity/suites/precompiles/package.json +++ b/tests/solidity/suites/precompiles/package.json @@ -21,7 +21,7 @@ "@types/chai": "^4.3.5", "@types/mocha": "^10.0.1", "chai": "^4.3.7", - "hardhat": "^2.17.1", + "hardhat": "^2.20.0", "hardhat-gas-reporter": "^1.0.9", "solidity-coverage": "^0.8.4", "ts-node": "^10.9.1", diff --git a/tests/solidity/yarn.lock b/tests/solidity/yarn.lock index a6afa450f4..4068cd425c 100644 --- a/tests/solidity/yarn.lock +++ b/tests/solidity/yarn.lock @@ -230,42 +230,6 @@ "@babel/helper-validator-identifier" "^7.22.5" to-fast-properties "^2.0.0" -"@chainsafe/as-sha256@^0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz#3639df0e1435cab03f4d9870cc3ac079e57a6fc9" - integrity sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg== - -"@chainsafe/persistent-merkle-tree@^0.4.2": - version "0.4.2" - resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz#4c9ee80cc57cd3be7208d98c40014ad38f36f7ff" - integrity sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ== - dependencies: - "@chainsafe/as-sha256" "^0.3.1" - -"@chainsafe/persistent-merkle-tree@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz#2b4a62c9489a5739dedd197250d8d2f5427e9f63" - integrity sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw== - dependencies: - "@chainsafe/as-sha256" "^0.3.1" - -"@chainsafe/ssz@^0.10.0": - version "0.10.2" - resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.10.2.tgz#c782929e1bb25fec66ba72e75934b31fd087579e" - integrity sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg== - dependencies: - "@chainsafe/as-sha256" "^0.3.1" - "@chainsafe/persistent-merkle-tree" "^0.5.0" - -"@chainsafe/ssz@^0.9.2": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.9.4.tgz#696a8db46d6975b600f8309ad3a12f7c0e310497" - integrity sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ== - dependencies: - "@chainsafe/as-sha256" "^0.3.1" - "@chainsafe/persistent-merkle-tree" "^0.4.2" - case "^1.6.3" - "@consento/sync-randombytes@^1.0.4", "@consento/sync-randombytes@^1.0.5": version "1.0.5" resolved "https://registry.yarnpkg.com/@consento/sync-randombytes/-/sync-randombytes-1.0.5.tgz#5be6bc58c6a6fa6e09f04cc684d037e29e6c28d5" @@ -547,7 +511,7 @@ dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.7.1", "@ethersproject/providers@^5.7.2": +"@ethersproject/providers@5.7.2": version "5.7.2" resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== @@ -941,139 +905,141 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@nomicfoundation/ethereumjs-block@5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.1.tgz#6f89664f55febbd723195b6d0974773d29ee133d" - integrity sha512-u1Yioemi6Ckj3xspygu/SfFvm8vZEO8/Yx5a1QLzi6nVU0jz3Pg2OmHKJ5w+D9Ogk1vhwRiqEBAqcb0GVhCyHw== - dependencies: - "@nomicfoundation/ethereumjs-common" "4.0.1" - "@nomicfoundation/ethereumjs-rlp" "5.0.1" - "@nomicfoundation/ethereumjs-trie" "6.0.1" - "@nomicfoundation/ethereumjs-tx" "5.0.1" - "@nomicfoundation/ethereumjs-util" "9.0.1" +"@nomicfoundation/ethereumjs-block@5.0.4": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.4.tgz#ff2acb98a86b9290e35e315a6abfb9aebb9cf39e" + integrity sha512-AcyacJ9eX/uPEvqsPiB+WO1ymE+kyH48qGGiGV+YTojdtas8itUTW5dehDSOXEEItWGbbzEJ4PRqnQZlWaPvDw== + dependencies: + "@nomicfoundation/ethereumjs-common" "4.0.4" + "@nomicfoundation/ethereumjs-rlp" "5.0.4" + "@nomicfoundation/ethereumjs-trie" "6.0.4" + "@nomicfoundation/ethereumjs-tx" "5.0.4" + "@nomicfoundation/ethereumjs-util" "9.0.4" ethereum-cryptography "0.1.3" - ethers "^5.7.1" -"@nomicfoundation/ethereumjs-blockchain@7.0.1": - version "7.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.1.tgz#80e0bd3535bfeb9baa29836b6f25123dab06a726" - integrity sha512-NhzndlGg829XXbqJEYrF1VeZhAwSPgsK/OB7TVrdzft3y918hW5KNd7gIZ85sn6peDZOdjBsAXIpXZ38oBYE5A== - dependencies: - "@nomicfoundation/ethereumjs-block" "5.0.1" - "@nomicfoundation/ethereumjs-common" "4.0.1" - "@nomicfoundation/ethereumjs-ethash" "3.0.1" - "@nomicfoundation/ethereumjs-rlp" "5.0.1" - "@nomicfoundation/ethereumjs-trie" "6.0.1" - "@nomicfoundation/ethereumjs-tx" "5.0.1" - "@nomicfoundation/ethereumjs-util" "9.0.1" - abstract-level "^1.0.3" +"@nomicfoundation/ethereumjs-blockchain@7.0.4": + version "7.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.4.tgz#b77511b389290b186c8d999e70f4b15c27ef44ea" + integrity sha512-jYsd/kwzbmpnxx86tXsYV8wZ5xGvFL+7/P0c6OlzpClHsbFzeF41KrYA9scON8Rg6bZu3ZTv6JOAgj3t7USUfg== + dependencies: + "@nomicfoundation/ethereumjs-block" "5.0.4" + "@nomicfoundation/ethereumjs-common" "4.0.4" + "@nomicfoundation/ethereumjs-ethash" "3.0.4" + "@nomicfoundation/ethereumjs-rlp" "5.0.4" + "@nomicfoundation/ethereumjs-trie" "6.0.4" + "@nomicfoundation/ethereumjs-tx" "5.0.4" + "@nomicfoundation/ethereumjs-util" "9.0.4" debug "^4.3.3" ethereum-cryptography "0.1.3" - level "^8.0.0" - lru-cache "^5.1.1" - memory-level "^1.0.0" + lru-cache "^10.0.0" -"@nomicfoundation/ethereumjs-common@4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.1.tgz#4702d82df35b07b5407583b54a45bf728e46a2f0" - integrity sha512-OBErlkfp54GpeiE06brBW/TTbtbuBJV5YI5Nz/aB2evTDo+KawyEzPjBlSr84z/8MFfj8wS2wxzQX1o32cev5g== +"@nomicfoundation/ethereumjs-common@4.0.4": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.4.tgz#9901f513af2d4802da87c66d6f255b510bef5acb" + integrity sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg== dependencies: - "@nomicfoundation/ethereumjs-util" "9.0.1" - crc-32 "^1.2.0" + "@nomicfoundation/ethereumjs-util" "9.0.4" -"@nomicfoundation/ethereumjs-ethash@3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.1.tgz#65ca494d53e71e8415c9a49ef48bc921c538fc41" - integrity sha512-KDjGIB5igzWOp8Ik5I6QiRH5DH+XgILlplsHR7TEuWANZA759G6krQ6o8bvj+tRUz08YygMQu/sGd9mJ1DYT8w== - dependencies: - "@nomicfoundation/ethereumjs-block" "5.0.1" - "@nomicfoundation/ethereumjs-rlp" "5.0.1" - "@nomicfoundation/ethereumjs-util" "9.0.1" - abstract-level "^1.0.3" - bigint-crypto-utils "^3.0.23" +"@nomicfoundation/ethereumjs-ethash@3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.4.tgz#06cb2502b3012fb6c11cffd44af08aecf71310da" + integrity sha512-xvIrwIMl9sSaiYKRem68+O7vYdj7Q2XWv5P7JXiIkn83918QzWHvqbswTRsH7+r6X1UEvdsURRnZbvZszEjAaQ== + dependencies: + "@nomicfoundation/ethereumjs-block" "5.0.4" + "@nomicfoundation/ethereumjs-rlp" "5.0.4" + "@nomicfoundation/ethereumjs-util" "9.0.4" + bigint-crypto-utils "^3.2.2" ethereum-cryptography "0.1.3" -"@nomicfoundation/ethereumjs-evm@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.1.tgz#f35681e203363f69ce2b3d3bf9f44d4e883ca1f1" - integrity sha512-oL8vJcnk0Bx/onl+TgQOQ1t/534GKFaEG17fZmwtPFeH8S5soiBYPCLUrvANOl4sCp9elYxIMzIiTtMtNNN8EQ== - dependencies: - "@ethersproject/providers" "^5.7.1" - "@nomicfoundation/ethereumjs-common" "4.0.1" - "@nomicfoundation/ethereumjs-tx" "5.0.1" - "@nomicfoundation/ethereumjs-util" "9.0.1" +"@nomicfoundation/ethereumjs-evm@2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.4.tgz#c9c761767283ac53946185474362230b169f8f63" + integrity sha512-lTyZZi1KpeMHzaO6cSVisR2tjiTTedjo7PcmhI/+GNFo9BmyY6QYzGeSti0sFttmjbEMioHgXxl5yrLNRg6+1w== + dependencies: + "@nomicfoundation/ethereumjs-common" "4.0.4" + "@nomicfoundation/ethereumjs-statemanager" "2.0.4" + "@nomicfoundation/ethereumjs-tx" "5.0.4" + "@nomicfoundation/ethereumjs-util" "9.0.4" + "@types/debug" "^4.1.9" debug "^4.3.3" ethereum-cryptography "0.1.3" - mcl-wasm "^0.7.1" - rustbn.js "~0.2.0" + rustbn-wasm "^0.2.0" -"@nomicfoundation/ethereumjs-rlp@5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.1.tgz#0b30c1cf77d125d390408e391c4bb5291ef43c28" - integrity sha512-xtxrMGa8kP4zF5ApBQBtjlSbN5E2HI8m8FYgVSYAnO6ssUoY5pVPGy2H8+xdf/bmMa22Ce8nWMH3aEW8CcqMeQ== +"@nomicfoundation/ethereumjs-rlp@5.0.4": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.4.tgz#66c95256fc3c909f6fb18f6a586475fc9762fa30" + integrity sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw== -"@nomicfoundation/ethereumjs-statemanager@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.1.tgz#8824a97938db4471911e2d2f140f79195def5935" - integrity sha512-B5ApMOnlruVOR7gisBaYwFX+L/AP7i/2oAahatssjPIBVDF6wTX1K7Qpa39E/nzsH8iYuL3krkYeUFIdO3EMUQ== +"@nomicfoundation/ethereumjs-statemanager@2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.4.tgz#bf14415e1f31b5ea8b98a0c027c547d0555059b6" + integrity sha512-HPDjeFrxw6llEi+BzqXkZ+KkvFnTOPczuHBtk21hRlDiuKuZz32dPzlhpRsDBGV1b5JTmRDUVqCS1lp3Gghw4Q== dependencies: - "@nomicfoundation/ethereumjs-common" "4.0.1" - "@nomicfoundation/ethereumjs-rlp" "5.0.1" + "@nomicfoundation/ethereumjs-common" "4.0.4" + "@nomicfoundation/ethereumjs-rlp" "5.0.4" + "@nomicfoundation/ethereumjs-trie" "6.0.4" + "@nomicfoundation/ethereumjs-util" "9.0.4" debug "^4.3.3" ethereum-cryptography "0.1.3" - ethers "^5.7.1" js-sdsl "^4.1.4" + lru-cache "^10.0.0" -"@nomicfoundation/ethereumjs-trie@6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.1.tgz#662c55f6b50659fd4b22ea9f806a7401cafb7717" - integrity sha512-A64It/IMpDVODzCgxDgAAla8jNjNtsoQZIzZUfIV5AY6Coi4nvn7+VReBn5itlxMiL2yaTlQr9TRWp3CSI6VoA== +"@nomicfoundation/ethereumjs-trie@6.0.4": + version "6.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.4.tgz#688a3f76646c209365ee6d959c3d7330ede5e609" + integrity sha512-3nSwQiFMvr2VFe/aZUyinuohYvtytUqZCUCvIWcPJ/BwJH6oQdZRB42aNFBJ/8nAh2s3OcroWpBLskzW01mFKA== dependencies: - "@nomicfoundation/ethereumjs-rlp" "5.0.1" - "@nomicfoundation/ethereumjs-util" "9.0.1" + "@nomicfoundation/ethereumjs-rlp" "5.0.4" + "@nomicfoundation/ethereumjs-util" "9.0.4" "@types/readable-stream" "^2.3.13" ethereum-cryptography "0.1.3" + lru-cache "^10.0.0" readable-stream "^3.6.0" -"@nomicfoundation/ethereumjs-tx@5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.1.tgz#7629dc2036b4a33c34e9f0a592b43227ef4f0c7d" - integrity sha512-0HwxUF2u2hrsIM1fsasjXvlbDOq1ZHFV2dd1yGq8CA+MEYhaxZr8OTScpVkkxqMwBcc5y83FyPl0J9MZn3kY0w== - dependencies: - "@chainsafe/ssz" "^0.9.2" - "@ethersproject/providers" "^5.7.2" - "@nomicfoundation/ethereumjs-common" "4.0.1" - "@nomicfoundation/ethereumjs-rlp" "5.0.1" - "@nomicfoundation/ethereumjs-util" "9.0.1" +"@nomicfoundation/ethereumjs-tx@5.0.4": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.4.tgz#b0ceb58c98cc34367d40a30d255d6315b2f456da" + integrity sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw== + dependencies: + "@nomicfoundation/ethereumjs-common" "4.0.4" + "@nomicfoundation/ethereumjs-rlp" "5.0.4" + "@nomicfoundation/ethereumjs-util" "9.0.4" ethereum-cryptography "0.1.3" -"@nomicfoundation/ethereumjs-util@9.0.1": - version "9.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.1.tgz#530cda8bae33f8b5020a8f199ed1d0a2ce48ec89" - integrity sha512-TwbhOWQ8QoSCFhV/DDfSmyfFIHjPjFBj957219+V3jTZYZ2rf9PmDtNOeZWAE3p3vlp8xb02XGpd0v6nTUPbsA== +"@nomicfoundation/ethereumjs-util@9.0.4": + version "9.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.4.tgz#84c5274e82018b154244c877b76bc049a4ed7b38" + integrity sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q== dependencies: - "@chainsafe/ssz" "^0.10.0" - "@nomicfoundation/ethereumjs-rlp" "5.0.1" + "@nomicfoundation/ethereumjs-rlp" "5.0.4" ethereum-cryptography "0.1.3" -"@nomicfoundation/ethereumjs-vm@7.0.1": - version "7.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.1.tgz#7d035e0993bcad10716c8b36e61dfb87fa3ca05f" - integrity sha512-rArhyn0jPsS/D+ApFsz3yVJMQ29+pVzNZ0VJgkzAZ+7FqXSRtThl1C1prhmlVr3YNUlfpZ69Ak+RUT4g7VoOuQ== - dependencies: - "@nomicfoundation/ethereumjs-block" "5.0.1" - "@nomicfoundation/ethereumjs-blockchain" "7.0.1" - "@nomicfoundation/ethereumjs-common" "4.0.1" - "@nomicfoundation/ethereumjs-evm" "2.0.1" - "@nomicfoundation/ethereumjs-rlp" "5.0.1" - "@nomicfoundation/ethereumjs-statemanager" "2.0.1" - "@nomicfoundation/ethereumjs-trie" "6.0.1" - "@nomicfoundation/ethereumjs-tx" "5.0.1" - "@nomicfoundation/ethereumjs-util" "9.0.1" +"@nomicfoundation/ethereumjs-verkle@0.0.2": + version "0.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-verkle/-/ethereumjs-verkle-0.0.2.tgz#7686689edec775b2efea5a71548f417c18f7dea4" + integrity sha512-bjnfZElpYGK/XuuVRmLS3yDvr+cDs85D9oonZ0YUa5A3lgFgokWMp76zXrxX2jVQ0BfHaw12y860n1+iOi6yFQ== + dependencies: + "@nomicfoundation/ethereumjs-rlp" "5.0.4" + "@nomicfoundation/ethereumjs-util" "9.0.4" + lru-cache "^10.0.0" + rust-verkle-wasm "^0.0.1" + +"@nomicfoundation/ethereumjs-vm@7.0.4": + version "7.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.4.tgz#e5a6eec4877dc62dda93003c6d7afd1fe4b9625b" + integrity sha512-gsA4IhmtWHI4BofKy3kio9W+dqZQs5Ji5mLjLYxHCkat+JQBUt5szjRKra2F9nGDJ2XcI/wWb0YWUFNgln4zRQ== + dependencies: + "@nomicfoundation/ethereumjs-block" "5.0.4" + "@nomicfoundation/ethereumjs-blockchain" "7.0.4" + "@nomicfoundation/ethereumjs-common" "4.0.4" + "@nomicfoundation/ethereumjs-evm" "2.0.4" + "@nomicfoundation/ethereumjs-rlp" "5.0.4" + "@nomicfoundation/ethereumjs-statemanager" "2.0.4" + "@nomicfoundation/ethereumjs-trie" "6.0.4" + "@nomicfoundation/ethereumjs-tx" "5.0.4" + "@nomicfoundation/ethereumjs-util" "9.0.4" debug "^4.3.3" ethereum-cryptography "0.1.3" - mcl-wasm "^0.7.1" - rustbn.js "~0.2.0" "@nomicfoundation/hardhat-chai-matchers@^2.0.2": version "2.0.2" @@ -1337,6 +1303,11 @@ resolved "https://registry.yarnpkg.com/@repeaterjs/repeater/-/repeater-3.0.4.tgz#a04d63f4d1bf5540a41b01a921c9a7fddc3bd1ca" integrity sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA== +"@scure/base@^1.1.1": + version "1.1.5" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.5.tgz#1d85d17269fe97694b9c592552dd9e5e33552157" + integrity sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ== + "@scure/base@~1.1.0": version "1.1.1" resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.1.tgz#ebb651ee52ff84f420097055f4bf46cfba403938" @@ -2290,6 +2261,13 @@ resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.12.tgz#6b2c510a7ad7039e98e7b8d3d6598f4359e5c080" integrity sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw== +"@types/debug@^4.1.9": + version "4.1.12" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== + dependencies: + "@types/ms" "*" + "@types/ed2curve@^0.2.2": version "0.2.2" resolved "https://registry.yarnpkg.com/@types/ed2curve/-/ed2curve-0.2.2.tgz#8f8bc7e2c9a5895a941c63a4f7acd7a6a62a5b15" @@ -2398,6 +2376,11 @@ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.1.tgz#2f4f65bb08bc368ac39c96da7b2f09140b26851b" integrity sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q== +"@types/ms@*": + version "0.7.34" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" + integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== + "@types/node@*", "@types/node@>=13.7.0": version "20.4.9" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.9.tgz#c7164e0f8d3f12dfae336af0b1f7fdec8c6b204f" @@ -2560,7 +2543,7 @@ abortcontroller-polyfill@^1.7.3: resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz#6738495f4e901fbb57b6c0611d0c75f76c485bed" integrity sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ== -abstract-level@1.0.3, abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3: +abstract-level@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.3.tgz#78a67d3d84da55ee15201486ab44c09560070741" integrity sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA== @@ -2722,6 +2705,13 @@ amdefine@>=0.0.4: resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" integrity sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg== +ansi-align@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== + dependencies: + string-width "^4.1.0" + ansi-colors@3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" @@ -3215,7 +3205,7 @@ bigi@^1.1.0, bigi@^1.4.2: resolved "https://registry.yarnpkg.com/bigi/-/bigi-1.4.2.tgz#9c665a95f88b8b08fc05cfd731f561859d725825" integrity sha512-ddkU+dFIuEIW8lE7ZwdIAf2UPoM90eaprg5m3YXAVVTmKlqV/9BX4A2M8BOK2yOq6/VgZFVhK6QAxJebhlbhzw== -bigint-crypto-utils@^3.0.23: +bigint-crypto-utils@^3.2.2: version "3.3.0" resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz#72ad00ae91062cf07f2b1def9594006c279c1d77" integrity sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg== @@ -3385,6 +3375,20 @@ borc@^2.1.2: json-text-sequence "~0.1.0" readable-stream "^3.6.0" +boxen@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" + integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== + dependencies: + ansi-align "^3.0.0" + camelcase "^6.2.0" + chalk "^4.1.0" + cli-boxes "^2.2.1" + string-width "^4.2.2" + type-fest "^0.20.2" + widest-line "^3.1.0" + wrap-ansi "^7.0.0" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -3417,16 +3421,6 @@ browser-headers@^0.4.0, browser-headers@^0.4.1: resolved "https://registry.yarnpkg.com/browser-headers/-/browser-headers-0.4.1.tgz#4308a7ad3b240f4203dbb45acedb38dc2d65dd02" integrity sha512-CA9hsySZVo9371qEHjHZtYxV2cFtVj5Wj/ZHi8ooEsrtm4vOnl9Y9HmyYWk9q+05d7K3rdoAE0j3MVEFVvtQtg== -browser-level@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browser-level/-/browser-level-1.0.1.tgz#36e8c3183d0fe1c405239792faaab5f315871011" - integrity sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ== - dependencies: - abstract-level "^1.0.2" - catering "^2.1.1" - module-error "^1.0.2" - run-parallel-limit "^1.1.0" - browser-readablestream-to-it@^1.0.1, browser-readablestream-to-it@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/browser-readablestream-to-it/-/browser-readablestream-to-it-1.0.3.tgz#ac3e406c7ee6cdf0a502dd55db33bab97f7fba76" @@ -3665,7 +3659,7 @@ camelcase@^5.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^6.0.0: +camelcase@^6.0.0, camelcase@^6.2.0: version "6.3.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== @@ -3675,17 +3669,12 @@ caniuse-lite@^1.0.30001517: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001519.tgz#3e7b8b8a7077e78b0eb054d69e6edf5c7df35601" integrity sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg== -case@^1.6.3: - version "1.6.3" - resolved "https://registry.yarnpkg.com/case/-/case-1.6.3.tgz#0a4386e3e9825351ca2e6216c60467ff5f1ea1c9" - integrity sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ== - caseless@^0.12.0, caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== -catering@^2.0.0, catering@^2.1.0, catering@^2.1.1: +catering@^2.0.0, catering@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== @@ -3864,22 +3853,16 @@ class-is@^1.1.0: resolved "https://registry.yarnpkg.com/class-is/-/class-is-1.1.0.tgz#9d3c0fba0440d211d843cec3dedfa48055005825" integrity sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw== -classic-level@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/classic-level/-/classic-level-1.3.0.tgz#5e36680e01dc6b271775c093f2150844c5edd5c8" - integrity sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg== - dependencies: - abstract-level "^1.0.2" - catering "^2.1.0" - module-error "^1.0.1" - napi-macros "^2.2.2" - node-gyp-build "^4.3.0" - clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== +cli-boxes@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== + cli-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" @@ -5127,7 +5110,7 @@ ethers@^4.0.32, ethers@^4.0.40: uuid "2.0.1" xmlhttprequest "1.8.0" -ethers@^5.0.13, ethers@^5.7.1: +ethers@^5.0.13: version "5.7.2" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== @@ -5988,23 +5971,24 @@ hardhat-gas-reporter@^1.0.9: eth-gas-reporter "^0.2.25" sha1 "^1.1.1" -hardhat@^2.17.1: - version "2.17.1" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.17.1.tgz#4b6c8c8f624fd23d9f40185a4af24815d05a486a" - integrity sha512-1PxRkfjhEzXs/wDxI5YgzYBxNmvzifBTjYzuopwel+vXpAhCudplusJthN5eig0FTs4qbi828DBIITEDh8x9LA== +hardhat@^2.20.0: + version "2.20.1" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.20.1.tgz#3ad8f2b003a96c9ce80a55fec3575580ff2ddcd4" + integrity sha512-q75xDQiQtCZcTMBwjTovrXEU5ECr49baxr4/OBkIu/ULTPzlB20yk1dRWNmD2IFbAeAeXggaWvQAdpiScaHtPw== dependencies: "@ethersproject/abi" "^5.1.2" "@metamask/eth-sig-util" "^4.0.0" - "@nomicfoundation/ethereumjs-block" "5.0.1" - "@nomicfoundation/ethereumjs-blockchain" "7.0.1" - "@nomicfoundation/ethereumjs-common" "4.0.1" - "@nomicfoundation/ethereumjs-evm" "2.0.1" - "@nomicfoundation/ethereumjs-rlp" "5.0.1" - "@nomicfoundation/ethereumjs-statemanager" "2.0.1" - "@nomicfoundation/ethereumjs-trie" "6.0.1" - "@nomicfoundation/ethereumjs-tx" "5.0.1" - "@nomicfoundation/ethereumjs-util" "9.0.1" - "@nomicfoundation/ethereumjs-vm" "7.0.1" + "@nomicfoundation/ethereumjs-block" "5.0.4" + "@nomicfoundation/ethereumjs-blockchain" "7.0.4" + "@nomicfoundation/ethereumjs-common" "4.0.4" + "@nomicfoundation/ethereumjs-evm" "2.0.4" + "@nomicfoundation/ethereumjs-rlp" "5.0.4" + "@nomicfoundation/ethereumjs-statemanager" "2.0.4" + "@nomicfoundation/ethereumjs-trie" "6.0.4" + "@nomicfoundation/ethereumjs-tx" "5.0.4" + "@nomicfoundation/ethereumjs-util" "9.0.4" + "@nomicfoundation/ethereumjs-verkle" "0.0.2" + "@nomicfoundation/ethereumjs-vm" "7.0.4" "@nomicfoundation/solidity-analyzer" "^0.1.0" "@sentry/node" "^5.18.1" "@types/bn.js" "^5.1.0" @@ -6012,6 +5996,7 @@ hardhat@^2.17.1: adm-zip "^0.4.16" aggregate-error "^3.0.0" ansi-escapes "^4.3.0" + boxen "^5.1.2" chalk "^2.4.2" chokidar "^3.4.0" ci-info "^2.0.0" @@ -7245,14 +7230,6 @@ level@6.0.1: level-packager "^5.1.0" leveldown "^5.4.0" -level@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/level/-/level-8.0.0.tgz#41b4c515dabe28212a3e881b61c161ffead14394" - integrity sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ== - dependencies: - browser-level "^1.0.1" - classic-level "^1.2.0" - leveldown@5.6.0, leveldown@^5.4.0: version "5.6.0" resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-5.6.0.tgz#16ba937bb2991c6094e13ac5a6898ee66d3eee98" @@ -7500,6 +7477,11 @@ lowercase-keys@^3.0.0: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.13.1.tgz#267a81fbd0881327c46a81c5922606a2cfe336c4" integrity sha512-CHqbAq7NFlW3RSnoWXLJBxCWaZVBrfa9UEHId2M3AW8iEBurbqduNexEUCGc3SHc6iCYXNJCDi903LajSVAEPQ== +lru-cache@^10.0.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" + integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -7534,11 +7516,6 @@ markdown-table@^1.1.3: resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.3.tgz#9fcb69bcfdb8717bfd0398c6ec2d93036ef8de60" integrity sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q== -mcl-wasm@^0.7.1: - version "0.7.9" - resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.9.tgz#c1588ce90042a8700c3b60e40efb339fc07ab87f" - integrity sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ== - md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -7565,15 +7542,6 @@ memdown@1.4.1, memdown@^1.0.0: ltgt "~2.2.0" safe-buffer "~5.1.1" -memory-level@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/memory-level/-/memory-level-1.0.0.tgz#7323c3fd368f9af2f71c3cd76ba403a17ac41692" - integrity sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og== - dependencies: - abstract-level "^1.0.0" - functional-red-black-tree "^1.0.1" - module-error "^1.0.1" - memorystream@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" @@ -7927,7 +7895,7 @@ mock-fs@^4.1.0: resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18" integrity sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw== -module-error@^1.0.1, module-error@^1.0.2: +module-error@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86" integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== @@ -8114,11 +8082,6 @@ nanoid@^3.1.12, nanoid@^3.1.3: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== -napi-macros@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.2.2.tgz#817fef20c3e0e40a963fbf7b37d1600bd0201044" - integrity sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g== - napi-macros@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" @@ -9709,13 +9672,6 @@ rpc-websockets@^7.4.17: bufferutil "^4.0.1" utf-8-validate "^5.0.2" -run-parallel-limit@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz#be80e936f5768623a38a963262d6bef8ff11e7ba" - integrity sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw== - dependencies: - queue-microtask "^1.2.2" - run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -9730,6 +9686,18 @@ run@^1.4.0: dependencies: minimatch "*" +rust-verkle-wasm@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/rust-verkle-wasm/-/rust-verkle-wasm-0.0.1.tgz#fd8396a7060d8ee8ea10da50ab6e862948095a74" + integrity sha512-BN6fiTsxcd2dCECz/cHtGTt9cdLJR925nh7iAuRcj8ymKw7OOaPmCneQZ7JePOJ/ia27TjEL91VdOi88Yf+mcA== + +rustbn-wasm@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/rustbn-wasm/-/rustbn-wasm-0.2.0.tgz#0407521fb55ae69eeb4968d01885d63efd1c4ff9" + integrity sha512-FThvYFNTqrEKGqXuseeg0zR7yROh/6U1617mCHF68OVqrN1tNKRN7Tdwy4WayPVsCmmK+eMxtIZX1qL6JxTkMg== + dependencies: + "@scure/base" "^1.1.1" + rustbn.js@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" @@ -10265,7 +10233,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -10785,6 +10753,11 @@ type-detect@^4.0.0, type-detect@^4.0.5: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + type-fest@^0.21.3: version "0.21.3" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" @@ -11747,6 +11720,13 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2 || 3 || 4" +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + wif@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/wif/-/wif-2.0.6.tgz#08d3f52056c66679299726fade0d432ae74b4704" From d476338631bd0d7ec3c9b15ceaa536c223989090 Mon Sep 17 00:00:00 2001 From: stepit <48993133+0xstepit@users.noreply.github.com> Date: Mon, 19 Feb 2024 18:32:53 +0100 Subject: [PATCH 132/345] chore: fix solidity warnings (#2361) * add license and pure function * update license * linter --- precompiles/ics20/ICS20I.sol | 6 ++++-- precompiles/staking/StakingI.sol | 3 ++- precompiles/staking/testdata/StakingCaller.sol | 10 +++++++--- precompiles/vesting/testdata/VestingCaller.sol | 6 +++++- tests/solidity/suites/basic/contracts/Counter.sol | 2 ++ tests/solidity/suites/basic/contracts/Storage.sol | 4 ++-- .../solidity/suites/opcode/contracts/OpCodes.sol | 15 +++++++++------ 7 files changed, 31 insertions(+), 15 deletions(-) diff --git a/precompiles/ics20/ICS20I.sol b/precompiles/ics20/ICS20I.sol index d17d030f7d..80af1db6b8 100644 --- a/precompiles/ics20/ICS20I.sol +++ b/precompiles/ics20/ICS20I.sol @@ -50,8 +50,10 @@ interface ICS20I is IICS20Authorization { /// @param amount the amount of the Coin to be transferred to the receiver /// @param sender the hex address of the sender /// @param receiver the bech32 address of the receiver - /// @param timeoutHeight the timeout height relative to the current block height. The timeout is disabled when set to 0 - /// @param timeoutTimestamp the timeout timestamp in absolute nanoseconds since unix epoch. The timeout is disabled when set to 0 + /// @param timeoutHeight the timeout height relative to the current block height. + /// The timeout is disabled when set to 0 + /// @param timeoutTimestamp the timeout timestamp in absolute nanoseconds since unix epoch. + /// The timeout is disabled when set to 0 /// @param memo optional memo /// @return nextSequence sequence number of the transfer packet sent function transfer( diff --git a/precompiles/staking/StakingI.sol b/precompiles/staking/StakingI.sol index 113cd1725c..6f74c9eacc 100644 --- a/precompiles/staking/StakingI.sol +++ b/precompiles/staking/StakingI.sol @@ -237,7 +237,8 @@ interface StakingI is authorization.AuthorizationI { /// @param delegatorAddress The address of the delegator. /// @param srcValidatorAddress Defines the validator address to redelegate from. /// @param dstValidatorAddress Defines the validator address to redelegate to. - /// @return redelegation The active redelegations for the given delegator, source and destination validator combination. + /// @return redelegation The active redelegations for the given delegator, source and destination + /// validator combination. function redelegation( address delegatorAddress, string memory srcValidatorAddress, diff --git a/precompiles/staking/testdata/StakingCaller.sol b/precompiles/staking/testdata/StakingCaller.sol index b61e77cfd8..7c440e7130 100644 --- a/precompiles/staking/testdata/StakingCaller.sol +++ b/precompiles/staking/testdata/StakingCaller.sol @@ -7,7 +7,8 @@ import "../StakingI.sol" as staking; /// @author Evmos Core Team /// @dev This contract is used to test external contract calls to the staking precompile. contract StakingCaller { - /// counter is used to test the state persistence bug, when EVM and Cosmos state were both changed in the same function. + /// counter is used to test the state persistence bug, when EVM and Cosmos state were both + /// changed in the same function. uint256 public counter; string[] private delegateMethod = [staking.MSG_DELEGATE]; @@ -239,7 +240,8 @@ contract StakingCaller { ); } - /// @dev This function is used to test the behaviour when executing transactions using special function calling opcodes, + /// @dev This function is used to test the behaviour when executing transactions using special + /// function calling opcodes, /// like call, delegatecall, staticcall, and callcode. /// @param _addr The address to approve. /// @param _validatorAddr The validator address to delegate from. @@ -392,7 +394,9 @@ contract StakingCaller { revert(0, 0) } } - coin = staking.Coin(denom, amt); // NOTE: this is returning a blank denom because unpacking the denom is not straightforward and hasn't been solved, which is okay for this generic test case + // NOTE: this is returning a blank denom because unpacking the denom is not + // straightforward and hasn't been solved, which is okay for this generic test case. + coin = staking.Coin(denom, amt); } else { revert("invalid calltype"); } diff --git a/precompiles/vesting/testdata/VestingCaller.sol b/precompiles/vesting/testdata/VestingCaller.sol index c16e1b835e..1a12e3ab3e 100644 --- a/precompiles/vesting/testdata/VestingCaller.sol +++ b/precompiles/vesting/testdata/VestingCaller.sol @@ -92,7 +92,11 @@ contract VestingCaller { /// @dev Defines a method to test getting the balances of a vesting account. /// @param vestingAddr The address of the vesting account. - function balances(address vestingAddr) public view returns (Coin[] memory locked, Coin[] memory unvested, Coin[] memory vested) { + function balances(address vestingAddr) public view returns ( + Coin[] memory locked, + Coin[] memory unvested, + Coin[] memory vested + ) { return vesting.VESTING_CONTRACT.balances(vestingAddr); } } diff --git a/tests/solidity/suites/basic/contracts/Counter.sol b/tests/solidity/suites/basic/contracts/Counter.sol index d5c6e2d693..0025c5e291 100644 --- a/tests/solidity/suites/basic/contracts/Counter.sol +++ b/tests/solidity/suites/basic/contracts/Counter.sol @@ -1,3 +1,5 @@ +// SPDX-License-Identifier: GPL-3.0 + pragma solidity >=0.7.0 <0.9.0; contract Counter { diff --git a/tests/solidity/suites/basic/contracts/Storage.sol b/tests/solidity/suites/basic/contracts/Storage.sol index f72e16eff6..0dae5322ee 100644 --- a/tests/solidity/suites/basic/contracts/Storage.sol +++ b/tests/solidity/suites/basic/contracts/Storage.sol @@ -26,7 +26,7 @@ contract Storage { return number; } - function shouldRevert() public { + function shouldRevert() pure public { require(false, 'This must REVERT'); } -} \ No newline at end of file +} diff --git a/tests/solidity/suites/opcode/contracts/OpCodes.sol b/tests/solidity/suites/opcode/contracts/OpCodes.sol index 1de7c5af35..c2ab0dd19e 100644 --- a/tests/solidity/suites/opcode/contracts/OpCodes.sol +++ b/tests/solidity/suites/opcode/contracts/OpCodes.sol @@ -185,8 +185,9 @@ contract OpCodes { mstore(x,sig) //Place signature at beginning of empty storage mstore(add(x,0x04),a) // first address parameter. just after signature mstore(add(x,0x24),a) // 2nd address parameter - first padded. add 32 bytes (not 20 bytes) - mstore(0x40,add(x,0x64)) // this is missing in other examples. Set free pointer before function call. so it is used by called function. - // new free pointer position after the output values of the called function. + mstore(0x40,add(x,0x64)) // this is missing in other examples. Set free pointer before + // function call. so it is used by called function. + // new free pointer position after the output values of the called function. let success := call( 5000, //5k gas @@ -204,8 +205,9 @@ contract OpCodes { mstore(x,sig) //Place signature at beginning of empty storage mstore(add(x,0x04),a) // first address parameter. just after signature mstore(add(x,0x24),a) // 2nd address parameter - first padded. add 32 bytes (not 20 bytes) - mstore(0x40,add(x,0x64)) // this is missing in other examples. Set free pointer before function call. so it is used by called function. - // new free pointer position after the output values of the called function. + mstore(0x40,add(x,0x64)) // this is missing in other examples. Set free pointer before + // function call. so it is used by called function. + // new free pointer position after the output values of the called function. let success := callcode( 5000, //5k gas @@ -223,8 +225,9 @@ contract OpCodes { mstore(x,sig) //Place signature at beginning of empty storage mstore(add(x,0x04),a) // first address parameter. just after signature mstore(add(x,0x24),a) // 2nd address parameter - first padded. add 32 bytes (not 20 bytes) - mstore(0x40,add(x,0x64)) // this is missing in other examples. Set free pointer before function call. so it is used by called function. - // new free pointer position after the output values of the called function. + mstore(0x40,add(x,0x64)) // this is missing in other examples. Set free pointer before + // function call. so it is used by called function. + // new free pointer position after the output values of the called function. let success := delegatecall( 5000, //5k gas From 5eef42b92df5e4ebb25db90b2661c41d54abc832 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Feb 2024 09:19:22 -0300 Subject: [PATCH 133/345] build(deps): bump github.com/tidwall/gjson from 1.17.0 to 1.17.1 (#2351) * build(deps): bump github.com/tidwall/gjson from 1.17.0 to 1.17.1 Bumps [github.com/tidwall/gjson](https://github.com/tidwall/gjson) from 1.17.0 to 1.17.1. - [Commits](https://github.com/tidwall/gjson/compare/v1.17.0...v1.17.1) --- updated-dependencies: - dependency-name: github.com/tidwall/gjson dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * update gomod2nix.toml file --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: 0xstepit <0xstepit@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: Vladislav Varadinov --- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index ef78f6f756..7a815c0559 100644 --- a/go.mod +++ b/go.mod @@ -40,7 +40,7 @@ require ( github.com/spf13/cobra v1.8.0 github.com/spf13/viper v1.16.0 github.com/stretchr/testify v1.8.4 - github.com/tidwall/gjson v1.17.0 + github.com/tidwall/gjson v1.17.1 github.com/tidwall/sjson v1.2.5 github.com/tyler-smith/go-bip39 v1.1.0 github.com/zondax/hid v0.9.2 diff --git a/go.sum b/go.sum index 734d2ad247..5b89207fe7 100644 --- a/go.sum +++ b/go.sum @@ -1123,8 +1123,8 @@ github.com/tidwall/btree v1.6.0 h1:LDZfKfQIBHGHWSwckhXI0RPSXzlo+KYdjK7FWSqOzzg= github.com/tidwall/btree v1.6.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= github.com/tidwall/gjson v1.10.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM= -github.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.17.1 h1:wlYEnwqAHgzmhNUFfw7Xalt2JzQvsMx2Se4PcoFCT/U= +github.com/tidwall/gjson v1.17.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= diff --git a/gomod2nix.toml b/gomod2nix.toml index 70cb837c1e..b8d42738a8 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -595,8 +595,8 @@ schema = 3 version = "v1.6.0" hash = "sha256-H4S46Yk3tVfOtrEhVWUrF4S1yWYmzU43W80HlzS9rcY=" [mod."github.com/tidwall/gjson"] - version = "v1.17.0" - hash = "sha256-eS+Ble3UZClAH/XpulH+MuxyZFsF7/yvWeBIn1D9ryk=" + version = "v1.17.1" + hash = "sha256-5R38cFZFaVbdem2B+9rsbr+0hRxbtDQ0i5PYWPT6kj0=" [mod."github.com/tidwall/match"] version = "v1.1.1" hash = "sha256-M2klhPId3Q3T3VGkSbOkYl/2nLHnsG+yMbXkPkyrRdg=" From 07df0f5c77c2344202cc99b884268dbb2bfad3a0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Feb 2024 13:32:34 +0100 Subject: [PATCH 134/345] build(deps-dev): bump undici from 5.26.3 to 5.28.3 in /tests/nix_tests/hardhat (#2357) * build(deps-dev): bump undici in /tests/nix_tests/hardhat Bumps [undici](https://github.com/nodejs/undici) from 5.26.3 to 5.28.3. - [Release notes](https://github.com/nodejs/undici/releases) - [Commits](https://github.com/nodejs/undici/compare/v5.26.3...v5.28.3) --- updated-dependencies: - dependency-name: undici dependency-type: indirect ... Signed-off-by: dependabot[bot] * update hardhat dep --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: tom Co-authored-by: Vladislav Varadinov Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- tests/nix_tests/hardhat/package-lock.json | 1716 +++++++++------------ tests/nix_tests/hardhat/package.json | 2 +- 2 files changed, 708 insertions(+), 1010 deletions(-) diff --git a/tests/nix_tests/hardhat/package-lock.json b/tests/nix_tests/hardhat/package-lock.json index 897ea49672..659a63ef8f 100644 --- a/tests/nix_tests/hardhat/package-lock.json +++ b/tests/nix_tests/hardhat/package-lock.json @@ -24,7 +24,7 @@ "@types/chai": "^4.3.5", "@types/mocha": "^10.0.1", "chai": "^4.3.7", - "hardhat": "^2.17.1", + "hardhat": "^2.20.0", "hardhat-gas-reporter": "^1.0.9", "solidity-coverage": "^0.8.5", "ts-node": "^10.9.1", @@ -37,32 +37,6 @@ "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.9.2.tgz", "integrity": "sha512-0h+FrQDqe2Wn+IIGFkTCd4aAwTJ+7834Ek1COohCyV26AXhwQ7WQaz+4F/nLOeVl/3BtWHOHLPsq46V8YB46Eg==" }, - "node_modules/@chainsafe/as-sha256": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz", - "integrity": "sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg==", - "dev": true - }, - "node_modules/@chainsafe/persistent-merkle-tree": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz", - "integrity": "sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ==", - "dev": true, - "dependencies": { - "@chainsafe/as-sha256": "^0.3.1" - } - }, - "node_modules/@chainsafe/ssz": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.9.4.tgz", - "integrity": "sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ==", - "dev": true, - "dependencies": { - "@chainsafe/as-sha256": "^0.3.1", - "@chainsafe/persistent-merkle-tree": "^0.4.2", - "case": "^1.6.3" - } - }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -1015,303 +989,219 @@ } }, "node_modules/@nomicfoundation/ethereumjs-block": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.1.tgz", - "integrity": "sha512-u1Yioemi6Ckj3xspygu/SfFvm8vZEO8/Yx5a1QLzi6nVU0jz3Pg2OmHKJ5w+D9Ogk1vhwRiqEBAqcb0GVhCyHw==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.4.tgz", + "integrity": "sha512-AcyacJ9eX/uPEvqsPiB+WO1ymE+kyH48qGGiGV+YTojdtas8itUTW5dehDSOXEEItWGbbzEJ4PRqnQZlWaPvDw==", "dev": true, "dependencies": { - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-trie": "6.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "ethereum-cryptography": "0.1.3", - "ethers": "^5.7.1" + "@nomicfoundation/ethereumjs-common": "4.0.4", + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "@nomicfoundation/ethereumjs-trie": "6.0.4", + "@nomicfoundation/ethereumjs-tx": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", + "ethereum-cryptography": "0.1.3" }, "engines": { - "node": ">=14" + "node": ">=18" } }, - "node_modules/@nomicfoundation/ethereumjs-block/node_modules/ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "node_modules/@nomicfoundation/ethereumjs-blockchain": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.4.tgz", + "integrity": "sha512-jYsd/kwzbmpnxx86tXsYV8wZ5xGvFL+7/P0c6OlzpClHsbFzeF41KrYA9scON8Rg6bZu3ZTv6JOAgj3t7USUfg==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], "dependencies": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/base64": "5.7.0", - "@ethersproject/basex": "5.7.0", - "@ethersproject/bignumber": "5.7.0", - "@ethersproject/bytes": "5.7.0", - "@ethersproject/constants": "5.7.0", - "@ethersproject/contracts": "5.7.0", - "@ethersproject/hash": "5.7.0", - "@ethersproject/hdnode": "5.7.0", - "@ethersproject/json-wallets": "5.7.0", - "@ethersproject/keccak256": "5.7.0", - "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.2", - "@ethersproject/random": "5.7.0", - "@ethersproject/rlp": "5.7.0", - "@ethersproject/sha2": "5.7.0", - "@ethersproject/signing-key": "5.7.0", - "@ethersproject/solidity": "5.7.0", - "@ethersproject/strings": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@ethersproject/units": "5.7.0", - "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", - "@ethersproject/wordlists": "5.7.0" - } - }, - "node_modules/@nomicfoundation/ethereumjs-blockchain": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.1.tgz", - "integrity": "sha512-NhzndlGg829XXbqJEYrF1VeZhAwSPgsK/OB7TVrdzft3y918hW5KNd7gIZ85sn6peDZOdjBsAXIpXZ38oBYE5A==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-block": "5.0.1", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-ethash": "3.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-trie": "6.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "abstract-level": "^1.0.3", + "@nomicfoundation/ethereumjs-block": "5.0.4", + "@nomicfoundation/ethereumjs-common": "4.0.4", + "@nomicfoundation/ethereumjs-ethash": "3.0.4", + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "@nomicfoundation/ethereumjs-trie": "6.0.4", + "@nomicfoundation/ethereumjs-tx": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", "debug": "^4.3.3", "ethereum-cryptography": "0.1.3", - "level": "^8.0.0", - "lru-cache": "^5.1.1", - "memory-level": "^1.0.0" + "lru-cache": "^10.0.0" }, "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/@nomicfoundation/ethereumjs-common": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.1.tgz", - "integrity": "sha512-OBErlkfp54GpeiE06brBW/TTbtbuBJV5YI5Nz/aB2evTDo+KawyEzPjBlSr84z/8MFfj8wS2wxzQX1o32cev5g==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.4.tgz", + "integrity": "sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==", "dev": true, "dependencies": { - "@nomicfoundation/ethereumjs-util": "9.0.1", - "crc-32": "^1.2.0" + "@nomicfoundation/ethereumjs-util": "9.0.4" } }, "node_modules/@nomicfoundation/ethereumjs-ethash": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.1.tgz", - "integrity": "sha512-KDjGIB5igzWOp8Ik5I6QiRH5DH+XgILlplsHR7TEuWANZA759G6krQ6o8bvj+tRUz08YygMQu/sGd9mJ1DYT8w==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.4.tgz", + "integrity": "sha512-xvIrwIMl9sSaiYKRem68+O7vYdj7Q2XWv5P7JXiIkn83918QzWHvqbswTRsH7+r6X1UEvdsURRnZbvZszEjAaQ==", "dev": true, "dependencies": { - "@nomicfoundation/ethereumjs-block": "5.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "abstract-level": "^1.0.3", - "bigint-crypto-utils": "^3.0.23", + "@nomicfoundation/ethereumjs-block": "5.0.4", + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", + "bigint-crypto-utils": "^3.2.2", "ethereum-cryptography": "0.1.3" }, "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/@nomicfoundation/ethereumjs-evm": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.1.tgz", - "integrity": "sha512-oL8vJcnk0Bx/onl+TgQOQ1t/534GKFaEG17fZmwtPFeH8S5soiBYPCLUrvANOl4sCp9elYxIMzIiTtMtNNN8EQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.4.tgz", + "integrity": "sha512-lTyZZi1KpeMHzaO6cSVisR2tjiTTedjo7PcmhI/+GNFo9BmyY6QYzGeSti0sFttmjbEMioHgXxl5yrLNRg6+1w==", "dev": true, "dependencies": { - "@ethersproject/providers": "^5.7.1", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", + "@nomicfoundation/ethereumjs-common": "4.0.4", + "@nomicfoundation/ethereumjs-statemanager": "2.0.4", + "@nomicfoundation/ethereumjs-tx": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", + "@types/debug": "^4.1.9", "debug": "^4.3.3", "ethereum-cryptography": "0.1.3", - "mcl-wasm": "^0.7.1", - "rustbn.js": "~0.2.0" + "rustbn-wasm": "^0.2.0" }, "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/@nomicfoundation/ethereumjs-rlp": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.1.tgz", - "integrity": "sha512-xtxrMGa8kP4zF5ApBQBtjlSbN5E2HI8m8FYgVSYAnO6ssUoY5pVPGy2H8+xdf/bmMa22Ce8nWMH3aEW8CcqMeQ==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.4.tgz", + "integrity": "sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==", "dev": true, "bin": { - "rlp": "bin/rlp" + "rlp": "bin/rlp.cjs" }, "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/@nomicfoundation/ethereumjs-statemanager": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.1.tgz", - "integrity": "sha512-B5ApMOnlruVOR7gisBaYwFX+L/AP7i/2oAahatssjPIBVDF6wTX1K7Qpa39E/nzsH8iYuL3krkYeUFIdO3EMUQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.4.tgz", + "integrity": "sha512-HPDjeFrxw6llEi+BzqXkZ+KkvFnTOPczuHBtk21hRlDiuKuZz32dPzlhpRsDBGV1b5JTmRDUVqCS1lp3Gghw4Q==", "dev": true, "dependencies": { - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-common": "4.0.4", + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "@nomicfoundation/ethereumjs-trie": "6.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", "debug": "^4.3.3", "ethereum-cryptography": "0.1.3", - "ethers": "^5.7.1", - "js-sdsl": "^4.1.4" - } - }, - "node_modules/@nomicfoundation/ethereumjs-statemanager/node_modules/ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" + "js-sdsl": "^4.1.4", + "lru-cache": "^10.0.0" + }, + "peerDependencies": { + "@nomicfoundation/ethereumjs-verkle": "0.0.2" + }, + "peerDependenciesMeta": { + "@nomicfoundation/ethereumjs-verkle": { + "optional": true } - ], - "dependencies": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/base64": "5.7.0", - "@ethersproject/basex": "5.7.0", - "@ethersproject/bignumber": "5.7.0", - "@ethersproject/bytes": "5.7.0", - "@ethersproject/constants": "5.7.0", - "@ethersproject/contracts": "5.7.0", - "@ethersproject/hash": "5.7.0", - "@ethersproject/hdnode": "5.7.0", - "@ethersproject/json-wallets": "5.7.0", - "@ethersproject/keccak256": "5.7.0", - "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.2", - "@ethersproject/random": "5.7.0", - "@ethersproject/rlp": "5.7.0", - "@ethersproject/sha2": "5.7.0", - "@ethersproject/signing-key": "5.7.0", - "@ethersproject/solidity": "5.7.0", - "@ethersproject/strings": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@ethersproject/units": "5.7.0", - "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", - "@ethersproject/wordlists": "5.7.0" } }, "node_modules/@nomicfoundation/ethereumjs-trie": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.1.tgz", - "integrity": "sha512-A64It/IMpDVODzCgxDgAAla8jNjNtsoQZIzZUfIV5AY6Coi4nvn7+VReBn5itlxMiL2yaTlQr9TRWp3CSI6VoA==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.4.tgz", + "integrity": "sha512-3nSwQiFMvr2VFe/aZUyinuohYvtytUqZCUCvIWcPJ/BwJH6oQdZRB42aNFBJ/8nAh2s3OcroWpBLskzW01mFKA==", "dev": true, "dependencies": { - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", "@types/readable-stream": "^2.3.13", "ethereum-cryptography": "0.1.3", + "lru-cache": "^10.0.0", "readable-stream": "^3.6.0" }, "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/@nomicfoundation/ethereumjs-tx": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.1.tgz", - "integrity": "sha512-0HwxUF2u2hrsIM1fsasjXvlbDOq1ZHFV2dd1yGq8CA+MEYhaxZr8OTScpVkkxqMwBcc5y83FyPl0J9MZn3kY0w==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.4.tgz", + "integrity": "sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw==", "dev": true, "dependencies": { - "@chainsafe/ssz": "^0.9.2", - "@ethersproject/providers": "^5.7.2", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", + "@nomicfoundation/ethereumjs-common": "4.0.4", + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", "ethereum-cryptography": "0.1.3" }, "engines": { - "node": ">=14" + "node": ">=18" + }, + "peerDependencies": { + "c-kzg": "^2.1.2" + }, + "peerDependenciesMeta": { + "c-kzg": { + "optional": true + } } }, "node_modules/@nomicfoundation/ethereumjs-util": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.1.tgz", - "integrity": "sha512-TwbhOWQ8QoSCFhV/DDfSmyfFIHjPjFBj957219+V3jTZYZ2rf9PmDtNOeZWAE3p3vlp8xb02XGpd0v6nTUPbsA==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.4.tgz", + "integrity": "sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q==", "dev": true, "dependencies": { - "@chainsafe/ssz": "^0.10.0", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.4", "ethereum-cryptography": "0.1.3" }, "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-util/node_modules/@chainsafe/persistent-merkle-tree": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz", - "integrity": "sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw==", - "dev": true, - "dependencies": { - "@chainsafe/as-sha256": "^0.3.1" + "node": ">=18" + }, + "peerDependencies": { + "c-kzg": "^2.1.2" + }, + "peerDependenciesMeta": { + "c-kzg": { + "optional": true + } } }, - "node_modules/@nomicfoundation/ethereumjs-util/node_modules/@chainsafe/ssz": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.10.2.tgz", - "integrity": "sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg==", + "node_modules/@nomicfoundation/ethereumjs-verkle": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-verkle/-/ethereumjs-verkle-0.0.2.tgz", + "integrity": "sha512-bjnfZElpYGK/XuuVRmLS3yDvr+cDs85D9oonZ0YUa5A3lgFgokWMp76zXrxX2jVQ0BfHaw12y860n1+iOi6yFQ==", "dev": true, "dependencies": { - "@chainsafe/as-sha256": "^0.3.1", - "@chainsafe/persistent-merkle-tree": "^0.5.0" + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", + "lru-cache": "^10.0.0", + "rust-verkle-wasm": "^0.0.1" + }, + "engines": { + "node": ">=18" } }, "node_modules/@nomicfoundation/ethereumjs-vm": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.1.tgz", - "integrity": "sha512-rArhyn0jPsS/D+ApFsz3yVJMQ29+pVzNZ0VJgkzAZ+7FqXSRtThl1C1prhmlVr3YNUlfpZ69Ak+RUT4g7VoOuQ==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-block": "5.0.1", - "@nomicfoundation/ethereumjs-blockchain": "7.0.1", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-evm": "2.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-statemanager": "2.0.1", - "@nomicfoundation/ethereumjs-trie": "6.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.4.tgz", + "integrity": "sha512-gsA4IhmtWHI4BofKy3kio9W+dqZQs5Ji5mLjLYxHCkat+JQBUt5szjRKra2F9nGDJ2XcI/wWb0YWUFNgln4zRQ==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-block": "5.0.4", + "@nomicfoundation/ethereumjs-blockchain": "7.0.4", + "@nomicfoundation/ethereumjs-common": "4.0.4", + "@nomicfoundation/ethereumjs-evm": "2.0.4", + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "@nomicfoundation/ethereumjs-statemanager": "2.0.4", + "@nomicfoundation/ethereumjs-trie": "6.0.4", + "@nomicfoundation/ethereumjs-tx": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "mcl-wasm": "^0.7.1", - "rustbn.js": "~0.2.0" + "ethereum-cryptography": "0.1.3" }, "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/@nomicfoundation/hardhat-chai-matchers": { @@ -1857,6 +1747,15 @@ "@types/node": "*" } }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dev": true, + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/form-data": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", @@ -1894,6 +1793,12 @@ "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", "dev": true }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", + "dev": true + }, "node_modules/@types/node": { "version": "20.5.6", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.6.tgz", @@ -1952,48 +1857,6 @@ "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", "dev": true }, - "node_modules/abstract-level": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", - "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", - "dev": true, - "dependencies": { - "buffer": "^6.0.3", - "catering": "^2.1.0", - "is-buffer": "^2.0.5", - "level-supports": "^4.0.0", - "level-transcoder": "^1.0.1", - "module-error": "^1.0.1", - "queue-microtask": "^1.2.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/abstract-level/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/acorn": { "version": "8.10.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", @@ -2073,6 +1936,38 @@ "node": ">=0.4.2" } }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dev": true, + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", @@ -2247,26 +2142,6 @@ "safe-buffer": "^5.0.1" } }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/bech32": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", @@ -2303,6 +2178,133 @@ "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "dev": true }, + "node_modules/boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "dev": true, + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/boxen/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/boxen/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/boxen/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/boxen/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -2331,18 +2333,6 @@ "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", "dev": true }, - "node_modules/browser-level": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", - "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", - "dev": true, - "dependencies": { - "abstract-level": "^1.0.2", - "catering": "^2.1.1", - "module-error": "^1.0.2", - "run-parallel-limit": "^1.1.0" - } - }, "node_modules/browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -2416,30 +2406,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/case": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/case/-/case-1.6.3.tgz", - "integrity": "sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "dev": true }, - "node_modules/catering": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", - "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/cbor": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", @@ -2557,23 +2529,6 @@ "safe-buffer": "^5.0.1" } }, - "node_modules/classic-level": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.3.0.tgz", - "integrity": "sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "abstract-level": "^1.0.2", - "catering": "^2.1.0", - "module-error": "^1.0.1", - "napi-macros": "^2.2.2", - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -2583,6 +2538,18 @@ "node": ">=6" } }, + "node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cli-table3": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", @@ -2795,18 +2762,6 @@ "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", "dev": true }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "dev": true, - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", @@ -3562,12 +3517,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -3722,23 +3671,24 @@ } }, "node_modules/hardhat": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.17.1.tgz", - "integrity": "sha512-1PxRkfjhEzXs/wDxI5YgzYBxNmvzifBTjYzuopwel+vXpAhCudplusJthN5eig0FTs4qbi828DBIITEDh8x9LA==", + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.20.1.tgz", + "integrity": "sha512-q75xDQiQtCZcTMBwjTovrXEU5ECr49baxr4/OBkIu/ULTPzlB20yk1dRWNmD2IFbAeAeXggaWvQAdpiScaHtPw==", "dev": true, "dependencies": { "@ethersproject/abi": "^5.1.2", "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/ethereumjs-block": "5.0.1", - "@nomicfoundation/ethereumjs-blockchain": "7.0.1", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-evm": "2.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-statemanager": "2.0.1", - "@nomicfoundation/ethereumjs-trie": "6.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "@nomicfoundation/ethereumjs-vm": "7.0.1", + "@nomicfoundation/ethereumjs-block": "5.0.4", + "@nomicfoundation/ethereumjs-blockchain": "7.0.4", + "@nomicfoundation/ethereumjs-common": "4.0.4", + "@nomicfoundation/ethereumjs-evm": "2.0.4", + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "@nomicfoundation/ethereumjs-statemanager": "2.0.4", + "@nomicfoundation/ethereumjs-trie": "6.0.4", + "@nomicfoundation/ethereumjs-tx": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", + "@nomicfoundation/ethereumjs-verkle": "0.0.2", + "@nomicfoundation/ethereumjs-vm": "7.0.4", "@nomicfoundation/solidity-analyzer": "^0.1.0", "@sentry/node": "^5.18.1", "@types/bn.js": "^5.1.0", @@ -3746,6 +3696,7 @@ "adm-zip": "^0.4.16", "aggregate-error": "^3.0.0", "ansi-escapes": "^4.3.0", + "boxen": "^5.1.2", "chalk": "^2.4.2", "chokidar": "^3.4.0", "ci-info": "^2.0.0", @@ -4046,26 +3997,6 @@ "node": ">=0.10.0" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/ignore": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", @@ -4122,47 +4053,24 @@ } }, "node_modules/io-ts": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", - "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", - "dev": true, - "dependencies": { - "fp-ts": "^1.0.0" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", + "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", + "dev": true, + "dependencies": { + "fp-ts": "^1.0.0" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/is-extglob": { @@ -4329,69 +4237,6 @@ "graceful-fs": "^4.1.9" } }, - "node_modules/level": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", - "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", - "dev": true, - "dependencies": { - "browser-level": "^1.0.1", - "classic-level": "^1.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/level" - } - }, - "node_modules/level-supports": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", - "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/level-transcoder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", - "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", - "dev": true, - "dependencies": { - "buffer": "^6.0.3", - "module-error": "^1.0.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/level-transcoder/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -4550,12 +4395,12 @@ "dev": true }, "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", "dev": true, - "dependencies": { - "yallist": "^3.0.2" + "engines": { + "node": "14 || >=16.14" } }, "node_modules/make-error": { @@ -4570,15 +4415,6 @@ "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", "dev": true }, - "node_modules/mcl-wasm": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz", - "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==", - "dev": true, - "engines": { - "node": ">=8.9.0" - } - }, "node_modules/md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -4590,20 +4426,6 @@ "safe-buffer": "^5.1.2" } }, - "node_modules/memory-level": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz", - "integrity": "sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==", - "dev": true, - "dependencies": { - "abstract-level": "^1.0.0", - "functional-red-black-tree": "^1.0.1", - "module-error": "^1.0.1" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/memorystream": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", @@ -4898,15 +4720,6 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/module-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", - "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -4925,12 +4738,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/napi-macros": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", - "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==", - "dev": true - }, "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -5498,35 +5305,21 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/run-parallel-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", - "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", + "node_modules/rust-verkle-wasm": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/rust-verkle-wasm/-/rust-verkle-wasm-0.0.1.tgz", + "integrity": "sha512-BN6fiTsxcd2dCECz/cHtGTt9cdLJR925nh7iAuRcj8ymKw7OOaPmCneQZ7JePOJ/ia27TjEL91VdOi88Yf+mcA==", + "dev": true + }, + "node_modules/rustbn-wasm": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/rustbn-wasm/-/rustbn-wasm-0.2.0.tgz", + "integrity": "sha512-FThvYFNTqrEKGqXuseeg0zR7yROh/6U1617mCHF68OVqrN1tNKRN7Tdwy4WayPVsCmmK+eMxtIZX1qL6JxTkMg==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], "dependencies": { - "queue-microtask": "^1.2.2" + "@scure/base": "^1.1.1" } }, - "node_modules/rustbn.js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", - "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==", - "dev": true - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -6671,9 +6464,9 @@ } }, "node_modules/undici": { - "version": "5.26.3", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.3.tgz", - "integrity": "sha512-H7n2zmKEWgOllKkIUkLvFmsJQj062lSm3uA4EYApG8gLuiOM0/go9bIoC3HVaSnfg4xunowDE2i9p8drkXuvDw==", + "version": "5.28.3", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.3.tgz", + "integrity": "sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==", "dev": true, "dependencies": { "@fastify/busboy": "^2.0.0" @@ -6791,6 +6584,41 @@ "which": "bin/which" } }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/widest-line/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/widest-line/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -6942,12 +6770,6 @@ "node": ">=10" } }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, "node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -7041,32 +6863,6 @@ "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.9.2.tgz", "integrity": "sha512-0h+FrQDqe2Wn+IIGFkTCd4aAwTJ+7834Ek1COohCyV26AXhwQ7WQaz+4F/nLOeVl/3BtWHOHLPsq46V8YB46Eg==" }, - "@chainsafe/as-sha256": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz", - "integrity": "sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg==", - "dev": true - }, - "@chainsafe/persistent-merkle-tree": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz", - "integrity": "sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ==", - "dev": true, - "requires": { - "@chainsafe/as-sha256": "^0.3.1" - } - }, - "@chainsafe/ssz": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.9.4.tgz", - "integrity": "sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ==", - "dev": true, - "requires": { - "@chainsafe/as-sha256": "^0.3.1", - "@chainsafe/persistent-merkle-tree": "^0.4.2", - "case": "^1.6.3" - } - }, "@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -7658,259 +7454,162 @@ } }, "@nomicfoundation/ethereumjs-block": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.1.tgz", - "integrity": "sha512-u1Yioemi6Ckj3xspygu/SfFvm8vZEO8/Yx5a1QLzi6nVU0jz3Pg2OmHKJ5w+D9Ogk1vhwRiqEBAqcb0GVhCyHw==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.4.tgz", + "integrity": "sha512-AcyacJ9eX/uPEvqsPiB+WO1ymE+kyH48qGGiGV+YTojdtas8itUTW5dehDSOXEEItWGbbzEJ4PRqnQZlWaPvDw==", "dev": true, "requires": { - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-trie": "6.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "ethereum-cryptography": "0.1.3", - "ethers": "^5.7.1" - }, - "dependencies": { - "ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", - "dev": true, - "requires": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/base64": "5.7.0", - "@ethersproject/basex": "5.7.0", - "@ethersproject/bignumber": "5.7.0", - "@ethersproject/bytes": "5.7.0", - "@ethersproject/constants": "5.7.0", - "@ethersproject/contracts": "5.7.0", - "@ethersproject/hash": "5.7.0", - "@ethersproject/hdnode": "5.7.0", - "@ethersproject/json-wallets": "5.7.0", - "@ethersproject/keccak256": "5.7.0", - "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.2", - "@ethersproject/random": "5.7.0", - "@ethersproject/rlp": "5.7.0", - "@ethersproject/sha2": "5.7.0", - "@ethersproject/signing-key": "5.7.0", - "@ethersproject/solidity": "5.7.0", - "@ethersproject/strings": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@ethersproject/units": "5.7.0", - "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", - "@ethersproject/wordlists": "5.7.0" - } - } + "@nomicfoundation/ethereumjs-common": "4.0.4", + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "@nomicfoundation/ethereumjs-trie": "6.0.4", + "@nomicfoundation/ethereumjs-tx": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", + "ethereum-cryptography": "0.1.3" } }, "@nomicfoundation/ethereumjs-blockchain": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.1.tgz", - "integrity": "sha512-NhzndlGg829XXbqJEYrF1VeZhAwSPgsK/OB7TVrdzft3y918hW5KNd7gIZ85sn6peDZOdjBsAXIpXZ38oBYE5A==", - "dev": true, - "requires": { - "@nomicfoundation/ethereumjs-block": "5.0.1", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-ethash": "3.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-trie": "6.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "abstract-level": "^1.0.3", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.4.tgz", + "integrity": "sha512-jYsd/kwzbmpnxx86tXsYV8wZ5xGvFL+7/P0c6OlzpClHsbFzeF41KrYA9scON8Rg6bZu3ZTv6JOAgj3t7USUfg==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-block": "5.0.4", + "@nomicfoundation/ethereumjs-common": "4.0.4", + "@nomicfoundation/ethereumjs-ethash": "3.0.4", + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "@nomicfoundation/ethereumjs-trie": "6.0.4", + "@nomicfoundation/ethereumjs-tx": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", "debug": "^4.3.3", "ethereum-cryptography": "0.1.3", - "level": "^8.0.0", - "lru-cache": "^5.1.1", - "memory-level": "^1.0.0" + "lru-cache": "^10.0.0" } }, "@nomicfoundation/ethereumjs-common": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.1.tgz", - "integrity": "sha512-OBErlkfp54GpeiE06brBW/TTbtbuBJV5YI5Nz/aB2evTDo+KawyEzPjBlSr84z/8MFfj8wS2wxzQX1o32cev5g==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.4.tgz", + "integrity": "sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==", "dev": true, "requires": { - "@nomicfoundation/ethereumjs-util": "9.0.1", - "crc-32": "^1.2.0" + "@nomicfoundation/ethereumjs-util": "9.0.4" } }, "@nomicfoundation/ethereumjs-ethash": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.1.tgz", - "integrity": "sha512-KDjGIB5igzWOp8Ik5I6QiRH5DH+XgILlplsHR7TEuWANZA759G6krQ6o8bvj+tRUz08YygMQu/sGd9mJ1DYT8w==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.4.tgz", + "integrity": "sha512-xvIrwIMl9sSaiYKRem68+O7vYdj7Q2XWv5P7JXiIkn83918QzWHvqbswTRsH7+r6X1UEvdsURRnZbvZszEjAaQ==", "dev": true, "requires": { - "@nomicfoundation/ethereumjs-block": "5.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "abstract-level": "^1.0.3", - "bigint-crypto-utils": "^3.0.23", + "@nomicfoundation/ethereumjs-block": "5.0.4", + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", + "bigint-crypto-utils": "^3.2.2", "ethereum-cryptography": "0.1.3" } }, "@nomicfoundation/ethereumjs-evm": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.1.tgz", - "integrity": "sha512-oL8vJcnk0Bx/onl+TgQOQ1t/534GKFaEG17fZmwtPFeH8S5soiBYPCLUrvANOl4sCp9elYxIMzIiTtMtNNN8EQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.4.tgz", + "integrity": "sha512-lTyZZi1KpeMHzaO6cSVisR2tjiTTedjo7PcmhI/+GNFo9BmyY6QYzGeSti0sFttmjbEMioHgXxl5yrLNRg6+1w==", "dev": true, "requires": { - "@ethersproject/providers": "^5.7.1", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", + "@nomicfoundation/ethereumjs-common": "4.0.4", + "@nomicfoundation/ethereumjs-statemanager": "2.0.4", + "@nomicfoundation/ethereumjs-tx": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", + "@types/debug": "^4.1.9", "debug": "^4.3.3", "ethereum-cryptography": "0.1.3", - "mcl-wasm": "^0.7.1", - "rustbn.js": "~0.2.0" + "rustbn-wasm": "^0.2.0" } - }, - "@nomicfoundation/ethereumjs-rlp": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.1.tgz", - "integrity": "sha512-xtxrMGa8kP4zF5ApBQBtjlSbN5E2HI8m8FYgVSYAnO6ssUoY5pVPGy2H8+xdf/bmMa22Ce8nWMH3aEW8CcqMeQ==", - "dev": true - }, - "@nomicfoundation/ethereumjs-statemanager": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.1.tgz", - "integrity": "sha512-B5ApMOnlruVOR7gisBaYwFX+L/AP7i/2oAahatssjPIBVDF6wTX1K7Qpa39E/nzsH8iYuL3krkYeUFIdO3EMUQ==", - "dev": true, - "requires": { - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "ethers": "^5.7.1", - "js-sdsl": "^4.1.4" - }, - "dependencies": { - "ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", - "dev": true, - "requires": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/base64": "5.7.0", - "@ethersproject/basex": "5.7.0", - "@ethersproject/bignumber": "5.7.0", - "@ethersproject/bytes": "5.7.0", - "@ethersproject/constants": "5.7.0", - "@ethersproject/contracts": "5.7.0", - "@ethersproject/hash": "5.7.0", - "@ethersproject/hdnode": "5.7.0", - "@ethersproject/json-wallets": "5.7.0", - "@ethersproject/keccak256": "5.7.0", - "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.2", - "@ethersproject/random": "5.7.0", - "@ethersproject/rlp": "5.7.0", - "@ethersproject/sha2": "5.7.0", - "@ethersproject/signing-key": "5.7.0", - "@ethersproject/solidity": "5.7.0", - "@ethersproject/strings": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@ethersproject/units": "5.7.0", - "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", - "@ethersproject/wordlists": "5.7.0" - } - } + }, + "@nomicfoundation/ethereumjs-rlp": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.4.tgz", + "integrity": "sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==", + "dev": true + }, + "@nomicfoundation/ethereumjs-statemanager": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.4.tgz", + "integrity": "sha512-HPDjeFrxw6llEi+BzqXkZ+KkvFnTOPczuHBtk21hRlDiuKuZz32dPzlhpRsDBGV1b5JTmRDUVqCS1lp3Gghw4Q==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-common": "4.0.4", + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "@nomicfoundation/ethereumjs-trie": "6.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "js-sdsl": "^4.1.4", + "lru-cache": "^10.0.0" } }, "@nomicfoundation/ethereumjs-trie": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.1.tgz", - "integrity": "sha512-A64It/IMpDVODzCgxDgAAla8jNjNtsoQZIzZUfIV5AY6Coi4nvn7+VReBn5itlxMiL2yaTlQr9TRWp3CSI6VoA==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.4.tgz", + "integrity": "sha512-3nSwQiFMvr2VFe/aZUyinuohYvtytUqZCUCvIWcPJ/BwJH6oQdZRB42aNFBJ/8nAh2s3OcroWpBLskzW01mFKA==", "dev": true, "requires": { - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", "@types/readable-stream": "^2.3.13", "ethereum-cryptography": "0.1.3", + "lru-cache": "^10.0.0", "readable-stream": "^3.6.0" } }, "@nomicfoundation/ethereumjs-tx": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.1.tgz", - "integrity": "sha512-0HwxUF2u2hrsIM1fsasjXvlbDOq1ZHFV2dd1yGq8CA+MEYhaxZr8OTScpVkkxqMwBcc5y83FyPl0J9MZn3kY0w==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.4.tgz", + "integrity": "sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw==", "dev": true, "requires": { - "@chainsafe/ssz": "^0.9.2", - "@ethersproject/providers": "^5.7.2", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", + "@nomicfoundation/ethereumjs-common": "4.0.4", + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", "ethereum-cryptography": "0.1.3" } }, "@nomicfoundation/ethereumjs-util": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.1.tgz", - "integrity": "sha512-TwbhOWQ8QoSCFhV/DDfSmyfFIHjPjFBj957219+V3jTZYZ2rf9PmDtNOeZWAE3p3vlp8xb02XGpd0v6nTUPbsA==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.4.tgz", + "integrity": "sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q==", "dev": true, "requires": { - "@chainsafe/ssz": "^0.10.0", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.4", "ethereum-cryptography": "0.1.3" - }, - "dependencies": { - "@chainsafe/persistent-merkle-tree": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz", - "integrity": "sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw==", - "dev": true, - "requires": { - "@chainsafe/as-sha256": "^0.3.1" - } - }, - "@chainsafe/ssz": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.10.2.tgz", - "integrity": "sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg==", - "dev": true, - "requires": { - "@chainsafe/as-sha256": "^0.3.1", - "@chainsafe/persistent-merkle-tree": "^0.5.0" - } - } + } + }, + "@nomicfoundation/ethereumjs-verkle": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-verkle/-/ethereumjs-verkle-0.0.2.tgz", + "integrity": "sha512-bjnfZElpYGK/XuuVRmLS3yDvr+cDs85D9oonZ0YUa5A3lgFgokWMp76zXrxX2jVQ0BfHaw12y860n1+iOi6yFQ==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", + "lru-cache": "^10.0.0", + "rust-verkle-wasm": "^0.0.1" } }, "@nomicfoundation/ethereumjs-vm": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.1.tgz", - "integrity": "sha512-rArhyn0jPsS/D+ApFsz3yVJMQ29+pVzNZ0VJgkzAZ+7FqXSRtThl1C1prhmlVr3YNUlfpZ69Ak+RUT4g7VoOuQ==", - "dev": true, - "requires": { - "@nomicfoundation/ethereumjs-block": "5.0.1", - "@nomicfoundation/ethereumjs-blockchain": "7.0.1", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-evm": "2.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-statemanager": "2.0.1", - "@nomicfoundation/ethereumjs-trie": "6.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.4.tgz", + "integrity": "sha512-gsA4IhmtWHI4BofKy3kio9W+dqZQs5Ji5mLjLYxHCkat+JQBUt5szjRKra2F9nGDJ2XcI/wWb0YWUFNgln4zRQ==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-block": "5.0.4", + "@nomicfoundation/ethereumjs-blockchain": "7.0.4", + "@nomicfoundation/ethereumjs-common": "4.0.4", + "@nomicfoundation/ethereumjs-evm": "2.0.4", + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "@nomicfoundation/ethereumjs-statemanager": "2.0.4", + "@nomicfoundation/ethereumjs-trie": "6.0.4", + "@nomicfoundation/ethereumjs-tx": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "mcl-wasm": "^0.7.1", - "rustbn.js": "~0.2.0" + "ethereum-cryptography": "0.1.3" } }, "@nomicfoundation/hardhat-chai-matchers": { @@ -8277,6 +7976,15 @@ "@types/node": "*" } }, + "@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dev": true, + "requires": { + "@types/ms": "*" + } + }, "@types/form-data": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", @@ -8314,6 +8022,12 @@ "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", "dev": true }, + "@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", + "dev": true + }, "@types/node": { "version": "20.5.6", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.6.tgz", @@ -8374,33 +8088,6 @@ "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", "dev": true }, - "abstract-level": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", - "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", - "dev": true, - "requires": { - "buffer": "^6.0.3", - "catering": "^2.1.0", - "is-buffer": "^2.0.5", - "level-supports": "^4.0.0", - "level-transcoder": "^1.0.1", - "module-error": "^1.0.1", - "queue-microtask": "^1.2.3" - }, - "dependencies": { - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - } - } - }, "acorn": { "version": "8.10.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", @@ -8456,6 +8143,34 @@ "dev": true, "optional": true }, + "ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dev": true, + "requires": { + "string-width": "^4.1.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + } + } + }, "ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", @@ -8594,12 +8309,6 @@ "safe-buffer": "^5.0.1" } }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, "bech32": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", @@ -8630,6 +8339,96 @@ "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "dev": true }, + "boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "dev": true, + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -8655,18 +8454,6 @@ "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", "dev": true }, - "browser-level": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", - "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", - "dev": true, - "requires": { - "abstract-level": "^1.0.2", - "catering": "^2.1.1", - "module-error": "^1.0.2", - "run-parallel-limit": "^1.1.0" - } - }, "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -8731,24 +8518,12 @@ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true }, - "case": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/case/-/case-1.6.3.tgz", - "integrity": "sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==", - "dev": true - }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "dev": true }, - "catering": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", - "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", - "dev": true - }, "cbor": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", @@ -8837,25 +8612,18 @@ "safe-buffer": "^5.0.1" } }, - "classic-level": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.3.0.tgz", - "integrity": "sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==", - "dev": true, - "requires": { - "abstract-level": "^1.0.2", - "catering": "^2.1.0", - "module-error": "^1.0.1", - "napi-macros": "^2.2.2", - "node-gyp-build": "^4.3.0" - } - }, "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true }, + "cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "dev": true + }, "cli-table3": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", @@ -9039,12 +8807,6 @@ "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", "dev": true }, - "crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "dev": true - }, "create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", @@ -9632,12 +9394,6 @@ "dev": true, "optional": true }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -9753,23 +9509,24 @@ } }, "hardhat": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.17.1.tgz", - "integrity": "sha512-1PxRkfjhEzXs/wDxI5YgzYBxNmvzifBTjYzuopwel+vXpAhCudplusJthN5eig0FTs4qbi828DBIITEDh8x9LA==", + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.20.1.tgz", + "integrity": "sha512-q75xDQiQtCZcTMBwjTovrXEU5ECr49baxr4/OBkIu/ULTPzlB20yk1dRWNmD2IFbAeAeXggaWvQAdpiScaHtPw==", "dev": true, "requires": { "@ethersproject/abi": "^5.1.2", "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/ethereumjs-block": "5.0.1", - "@nomicfoundation/ethereumjs-blockchain": "7.0.1", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-evm": "2.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-statemanager": "2.0.1", - "@nomicfoundation/ethereumjs-trie": "6.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "@nomicfoundation/ethereumjs-vm": "7.0.1", + "@nomicfoundation/ethereumjs-block": "5.0.4", + "@nomicfoundation/ethereumjs-blockchain": "7.0.4", + "@nomicfoundation/ethereumjs-common": "4.0.4", + "@nomicfoundation/ethereumjs-evm": "2.0.4", + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "@nomicfoundation/ethereumjs-statemanager": "2.0.4", + "@nomicfoundation/ethereumjs-trie": "6.0.4", + "@nomicfoundation/ethereumjs-tx": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", + "@nomicfoundation/ethereumjs-verkle": "0.0.2", + "@nomicfoundation/ethereumjs-vm": "7.0.4", "@nomicfoundation/solidity-analyzer": "^0.1.0", "@sentry/node": "^5.18.1", "@types/bn.js": "^5.1.0", @@ -9777,6 +9534,7 @@ "adm-zip": "^0.4.16", "aggregate-error": "^3.0.0", "ansi-escapes": "^4.3.0", + "boxen": "^5.1.2", "chalk": "^2.4.2", "chokidar": "^3.4.0", "ci-info": "^2.0.0", @@ -10004,12 +9762,6 @@ "safer-buffer": ">= 2.1.2 < 3" } }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, "ignore": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", @@ -10074,12 +9826,6 @@ "binary-extensions": "^2.0.0" } }, - "is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true - }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -10200,44 +9946,6 @@ "graceful-fs": "^4.1.9" } }, - "level": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", - "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", - "dev": true, - "requires": { - "browser-level": "^1.0.1", - "classic-level": "^1.2.0" - } - }, - "level-supports": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", - "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", - "dev": true - }, - "level-transcoder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", - "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", - "dev": true, - "requires": { - "buffer": "^6.0.3", - "module-error": "^1.0.1" - }, - "dependencies": { - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - } - } - }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -10365,13 +10073,10 @@ "dev": true }, "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true }, "make-error": { "version": "1.3.6", @@ -10385,12 +10090,6 @@ "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", "dev": true }, - "mcl-wasm": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz", - "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==", - "dev": true - }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -10402,17 +10101,6 @@ "safe-buffer": "^5.1.2" } }, - "memory-level": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz", - "integrity": "sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==", - "dev": true, - "requires": { - "abstract-level": "^1.0.0", - "functional-red-black-tree": "^1.0.1", - "module-error": "^1.0.1" - } - }, "memorystream": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", @@ -10626,12 +10314,6 @@ } } }, - "module-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", - "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", - "dev": true - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -10644,12 +10326,6 @@ "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", "dev": true }, - "napi-macros": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", - "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==", - "dev": true - }, "neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -11061,21 +10737,21 @@ "queue-microtask": "^1.2.2" } }, - "run-parallel-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", - "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", + "rust-verkle-wasm": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/rust-verkle-wasm/-/rust-verkle-wasm-0.0.1.tgz", + "integrity": "sha512-BN6fiTsxcd2dCECz/cHtGTt9cdLJR925nh7iAuRcj8ymKw7OOaPmCneQZ7JePOJ/ia27TjEL91VdOi88Yf+mcA==", + "dev": true + }, + "rustbn-wasm": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/rustbn-wasm/-/rustbn-wasm-0.2.0.tgz", + "integrity": "sha512-FThvYFNTqrEKGqXuseeg0zR7yROh/6U1617mCHF68OVqrN1tNKRN7Tdwy4WayPVsCmmK+eMxtIZX1qL6JxTkMg==", "dev": true, "requires": { - "queue-microtask": "^1.2.2" + "@scure/base": "^1.1.1" } }, - "rustbn.js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", - "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==", - "dev": true - }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -11959,9 +11635,9 @@ "optional": true }, "undici": { - "version": "5.26.3", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.3.tgz", - "integrity": "sha512-H7n2zmKEWgOllKkIUkLvFmsJQj062lSm3uA4EYApG8gLuiOM0/go9bIoC3HVaSnfg4xunowDE2i9p8drkXuvDw==", + "version": "5.28.3", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.3.tgz", + "integrity": "sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==", "dev": true, "requires": { "@fastify/busboy": "^2.0.0" @@ -12057,6 +11733,34 @@ "isexe": "^2.0.0" } }, + "widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "requires": { + "string-width": "^4.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + } + } + }, "word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -12165,12 +11869,6 @@ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, "yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", diff --git a/tests/nix_tests/hardhat/package.json b/tests/nix_tests/hardhat/package.json index 8e04d2f081..3a018acb53 100644 --- a/tests/nix_tests/hardhat/package.json +++ b/tests/nix_tests/hardhat/package.json @@ -20,7 +20,7 @@ "@types/chai": "^4.3.5", "@types/mocha": "^10.0.1", "chai": "^4.3.7", - "hardhat": "^2.17.1", + "hardhat": "^2.20.0", "hardhat-gas-reporter": "^1.0.9", "solidity-coverage": "^0.8.5", "ts-node": "^10.9.1", From 90532cfe9e69f0232f3e07eb307333c793168489 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Feb 2024 13:45:26 +0100 Subject: [PATCH 135/345] build(deps): bump github.com/cosmos/cosmos-proto from 1.0.0-beta.3 to 1.0.0-beta.4 (#2360) * build(deps): bump github.com/cosmos/cosmos-proto Bumps [github.com/cosmos/cosmos-proto](https://github.com/cosmos/cosmos-proto) from 1.0.0-beta.3 to 1.0.0-beta.4. - [Release notes](https://github.com/cosmos/cosmos-proto/releases) - [Commits](https://github.com/cosmos/cosmos-proto/compare/v1.0.0-beta.3...v1.0.0-beta.4) --- updated-dependencies: - dependency-name: github.com/cosmos/cosmos-proto dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * update gomod2nix.toml file --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: 0xstepit <0xstepit@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: Vladislav Varadinov --- go.mod | 4 ++-- go.sum | 8 ++++---- gomod2nix.toml | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index 7a815c0559..94c609956e 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,7 @@ require ( github.com/btcsuite/btcd/btcutil v1.1.5 github.com/cometbft/cometbft v0.37.4 github.com/cometbft/cometbft-db v0.11.0 - github.com/cosmos/cosmos-proto v1.0.0-beta.3 + github.com/cosmos/cosmos-proto v1.0.0-beta.4 github.com/cosmos/cosmos-sdk v0.47.8 github.com/cosmos/go-bip39 v1.0.0 github.com/cosmos/gogoproto v1.4.10 @@ -246,7 +246,7 @@ require ( gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect nhooyr.io/websocket v1.8.7 // indirect - pgregory.net/rapid v0.5.5 // indirect + pgregory.net/rapid v1.1.0 // indirect ) replace ( diff --git a/go.sum b/go.sum index 5b89207fe7..74ca174664 100644 --- a/go.sum +++ b/go.sum @@ -376,8 +376,8 @@ github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= -github.com/cosmos/cosmos-proto v1.0.0-beta.3 h1:VitvZ1lPORTVxkmF2fAp3IiA61xVwArQYKXTdEcpW6o= -github.com/cosmos/cosmos-proto v1.0.0-beta.3/go.mod h1:t8IASdLaAq+bbHbjq4p960BvcTqtwuAxid3b/2rOD6I= +github.com/cosmos/cosmos-proto v1.0.0-beta.4 h1:aEL7tU/rLOmxZQ9z4i7mzxcLbSCY48OdY7lIWTLG7oU= +github.com/cosmos/cosmos-proto v1.0.0-beta.4/go.mod h1:oeB+FyVzG3XrQJbJng0EnV8Vljfk9XvTIpGILNU/9Co= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= @@ -1889,8 +1889,8 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= -pgregory.net/rapid v0.5.5 h1:jkgx1TjbQPD/feRoK+S/mXw9e1uj6WilpHrXJowi6oA= -pgregory.net/rapid v0.5.5/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= +pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= +pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= diff --git a/gomod2nix.toml b/gomod2nix.toml index b8d42738a8..4c73a9a999 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -150,8 +150,8 @@ schema = 3 version = "v1.0.5" hash = "sha256-t572Sr5iiHcuMKLMWa2i+LBAt192oa+G1oA371tG/eI=" [mod."github.com/cosmos/cosmos-proto"] - version = "v1.0.0-beta.3" - hash = "sha256-V0/ZhRdqK7Cqcv8X30gr33/hlI54bRXeHhI9LZKyLt8=" + version = "v1.0.0-beta.4" + hash = "sha256-5Kn82nsZfiEtuwhhLZqmMxdAY1tX/Fi3HJ0/MEaRohw=" [mod."github.com/cosmos/cosmos-sdk"] version = "v0.47.8-evmos" hash = "sha256-B+0qa8x/FKNcTV4iQIStB7zz26JXzruoTBRP4voZlbo=" @@ -724,8 +724,8 @@ schema = 3 version = "v1.8.7" hash = "sha256-6pQ35gFvbyMhNo0gv4bPxYDUrwDF/ok1GMA+BHfsRRM=" [mod."pgregory.net/rapid"] - version = "v0.5.5" - hash = "sha256-VUgKDG+AcSVdsqKk5H4doz2rvehsWgt8rdZPDMKFDtE=" + version = "v1.1.0" + hash = "sha256-sVQY9EQ9Y5blYyVYfaOa+y12e+399OqdHiEY3BaDnqo=" [mod."sigs.k8s.io/yaml"] version = "v1.4.0" hash = "sha256-Hd/M0vIfIVobDd87eb58p1HyVOjYWNlGq2bRXfmtVno=" From 92a73928826cc0da07f1b307cc1c50c488875987 Mon Sep 17 00:00:00 2001 From: Sandoche ADITTANE Date: Wed, 21 Feb 2024 13:02:48 +0000 Subject: [PATCH 136/345] [Snyk] Security upgrade golang from 1.22rc2-bullseye to bullseye (#2368) fix: networks/local/evmos/Dockerfile to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-DEBIAN11-GLIB20-5670987 - https://snyk.io/vuln/SNYK-DEBIAN11-PERL-6085272 - https://snyk.io/vuln/SNYK-DEBIAN11-PERL-6085272 - https://snyk.io/vuln/SNYK-DEBIAN11-PERL-6085272 - https://snyk.io/vuln/SNYK-DEBIAN11-PERL-6085272 Co-authored-by: snyk-bot Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- networks/local/evmos/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/networks/local/evmos/Dockerfile b/networks/local/evmos/Dockerfile index ebc85a4667..d4e74b2f8d 100644 --- a/networks/local/evmos/Dockerfile +++ b/networks/local/evmos/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.22rc2-bullseye as build-env +FROM golang:bullseye as build-env # Install minimum necessary dependencies ENV PACKAGES curl make git libc-dev bash gcc @@ -18,7 +18,7 @@ COPY . . RUN make build-linux # Final image -FROM golang:1.22rc2-bullseye as final +FROM golang:bullseye as final WORKDIR / From affc6b642196bb7616f089e3350e7bb5bb88a35d Mon Sep 17 00:00:00 2001 From: Freddy Caceres Date: Fri, 23 Feb 2024 05:03:26 -0500 Subject: [PATCH 137/345] imp(evm): Remove ChainID constraint (#2373) --- x/evm/keeper/keeper.go | 4 ---- x/evm/keeper/keeper_test.go | 6 ------ x/evm/types/access_list_tx.go | 11 +---------- x/evm/types/dynamic_fee_tx.go | 11 +---------- x/evm/types/legacy_tx.go | 11 +---------- x/evm/types/msg_test.go | 13 ------------- 6 files changed, 3 insertions(+), 53 deletions(-) diff --git a/x/evm/keeper/keeper.go b/x/evm/keeper/keeper.go index d3e64e58b1..a21345f3b3 100644 --- a/x/evm/keeper/keeper.go +++ b/x/evm/keeper/keeper.go @@ -119,10 +119,6 @@ func (k *Keeper) WithChainID(ctx sdk.Context) { panic("chain id already set") } - if !(chainID.Cmp(big.NewInt(9001)) == 0 || chainID.Cmp(big.NewInt(9000)) == 0) { - panic("EVM only supports Evmos chain identifiers (9000 or 9001)") - } - k.eip155ChainID = chainID } diff --git a/x/evm/keeper/keeper_test.go b/x/evm/keeper/keeper_test.go index f875f29b0b..bded6523b7 100644 --- a/x/evm/keeper/keeper_test.go +++ b/x/evm/keeper/keeper_test.go @@ -29,12 +29,6 @@ func (suite *KeeperTestSuite) TestWithChainID() { 0, true, }, - { - "fail - other chainID", - "chain_7701-1", - 0, - true, - }, { "success - Evmos mainnet chain ID", "evmos_9001-2", diff --git a/x/evm/types/access_list_tx.go b/x/evm/types/access_list_tx.go index ebb57e7e68..466adac994 100644 --- a/x/evm/types/access_list_tx.go +++ b/x/evm/types/access_list_tx.go @@ -215,22 +215,13 @@ func (tx AccessListTx) Validate() error { } } - chainID := tx.GetChainID() - - if chainID == nil { + if tx.GetChainID() == nil { return errorsmod.Wrap( errortypes.ErrInvalidChainID, "chain ID must be present on AccessList txs", ) } - if !(chainID.Cmp(big.NewInt(9001)) == 0 || chainID.Cmp(big.NewInt(9000)) == 0) { - return errorsmod.Wrapf( - errortypes.ErrInvalidChainID, - "chain ID must be 9000 or 9001 on Evmos, got %s", chainID, - ) - } - return nil } diff --git a/x/evm/types/dynamic_fee_tx.go b/x/evm/types/dynamic_fee_tx.go index 965e46dcf1..05f1bc6819 100644 --- a/x/evm/types/dynamic_fee_tx.go +++ b/x/evm/types/dynamic_fee_tx.go @@ -247,22 +247,13 @@ func (tx DynamicFeeTx) Validate() error { } } - chainID := tx.GetChainID() - - if chainID == nil { + if tx.GetChainID() == nil { return errorsmod.Wrap( errortypes.ErrInvalidChainID, "chain ID must be present on AccessList txs", ) } - if !(chainID.Cmp(big.NewInt(9001)) == 0 || chainID.Cmp(big.NewInt(9000)) == 0) { - return errorsmod.Wrapf( - errortypes.ErrInvalidChainID, - "chain ID must be 9000 or 9001 on Evmos, got %s", chainID, - ) - } - return nil } diff --git a/x/evm/types/legacy_tx.go b/x/evm/types/legacy_tx.go index 802abb96d7..c0e72c6a62 100644 --- a/x/evm/types/legacy_tx.go +++ b/x/evm/types/legacy_tx.go @@ -192,22 +192,13 @@ func (tx LegacyTx) Validate() error { } } - chainID := tx.GetChainID() - - if chainID == nil { + if tx.GetChainID() == nil { return errorsmod.Wrap( errortypes.ErrInvalidChainID, "chain ID must be derived from LegacyTx txs", ) } - if !(chainID.Cmp(big.NewInt(9001)) == 0 || chainID.Cmp(big.NewInt(9000)) == 0) { - return errorsmod.Wrapf( - errortypes.ErrInvalidChainID, - "chain ID must be 9000 or 9001 on Evmos, got %s", chainID, - ) - } - return nil } diff --git a/x/evm/types/msg_test.go b/x/evm/types/msg_test.go index e3fe698006..85c4a210a8 100644 --- a/x/evm/types/msg_test.go +++ b/x/evm/types/msg_test.go @@ -430,19 +430,6 @@ func (suite *MsgsTestSuite) TestMsgEthereumTx_ValidateBasic() { expectPass: false, errMsg: "failed to unpack tx data", }, - { - msg: "invalid chain ID (neither 9000 nor 9001)", - to: suite.to.Hex(), - amount: hundredInt, - gasLimit: 1000, - gasPrice: zeroInt, - gasFeeCap: nil, - gasTipCap: nil, - accessList: ðtypes.AccessList{}, - chainID: hundredInt, - expectPass: false, - errMsg: "chain ID must be 9000 or 9001 on Evmos", - }, } for _, tc := range testCases { From 6e49da24bb97ada2e0c186ed62804d32c50d1501 Mon Sep 17 00:00:00 2001 From: Luke Date: Mon, 26 Feb 2024 17:56:07 +0800 Subject: [PATCH 138/345] imp(debug): update convert an address between hex and bech32 (#2245) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * imp(debug): update convert an address between hex and bech32 * chore: update CHANGELOG.md * Apply suggestions from code review --------- Co-authored-by: Ramiro Carlucho Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> --- CHANGELOG.md | 1 + client/debug/debug.go | 63 ++++++++++++++++++++++++++++--------------- cmd/evmosd/root.go | 5 ++-- 3 files changed, 45 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d91368870..a1a09b90b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -72,6 +72,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (tests) [#2311](https://github.com/evmos/evmos/pull/2311) Fix post-upgrade transactions in automated upgrade tests. - (build) [#2319](https://github.com/evmos/evmos/pull/2319) Bump go.mod golang version to v1.21. - (ci) [#2321](https://github.com/evmos/evmos/pull/2321) Add build and markdown lint checker for `main` and `release` branches. +- (debug) [#2245](https://github.com/evmos/evmos/pull/2245) Update convert an address between hex and bech32. - (werc20-precompile) [#2329](https://github.com/evmos/evmos/pull/2329) Make WEVMOS precompile `deposit` and `withdraw` functions no-ops. - (tests) [#2348](https://github.com/evmos/evmos/pull/2348) Extend integration transaction factory utils. diff --git a/client/debug/debug.go b/client/debug/debug.go index 3c0ee520db..79a7ddbe8e 100644 --- a/client/debug/debug.go +++ b/client/debug/debug.go @@ -9,12 +9,10 @@ import ( "strconv" "strings" - authclient "github.com/cosmos/cosmos-sdk/x/auth/client" "github.com/evmos/evmos/v16/ethereum/eip712" evmos "github.com/evmos/evmos/v16/types" - "github.com/pkg/errors" - "github.com/cometbft/cometbft/libs/bytes" + "github.com/pkg/errors" "github.com/spf13/cobra" "github.com/ethereum/go-ethereum/common" @@ -23,8 +21,11 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/version" + authclient "github.com/cosmos/cosmos-sdk/x/auth/client" ) +var flagPrefix = "prefix" + // Cmd creates a main CLI command func Cmd() *cobra.Command { cmd := &cobra.Command{ @@ -75,38 +76,58 @@ func PubkeyCmd() *cobra.Command { } func AddrCmd() *cobra.Command { - return &cobra.Command{ + cmd := &cobra.Command{ Use: "addr [address]", Short: "Convert an address between hex and bech32", Long: "Convert an address between hex encoding and bech32.", Example: fmt.Sprintf( - `$ %s debug addr ethm10jmp6sgh4cc6zt3e8gw05wavvejgr5pw2unfju -$ %s debug addr 0xA588C66983a81e800Db4dF74564F09f91c026351`, version.AppName, version.AppName), + `$ %s debug addr evmos1qqqqhe5pnaq5qq39wqkn957aydnrm45sdn8583 +$ %s debug addr 0x00000Be6819f41400225702D32d3dd23663Dd690 --prefix evmos`, version.AppName, version.AppName), Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { addrString := args[0] - cfg := sdk.GetConfig() - - var addr []byte switch { case common.IsHexAddress(addrString): - addr = common.HexToAddress(addrString).Bytes() - case strings.HasPrefix(addrString, cfg.GetBech32ValidatorAddrPrefix()): - addr, _ = sdk.ValAddressFromBech32(addrString) - case strings.HasPrefix(addrString, cfg.GetBech32AccountAddrPrefix()): - addr, _ = sdk.AccAddressFromBech32(addrString) + addr := common.HexToAddress(addrString).Bytes() + cmd.Println("Address bytes:", addr) + + prefix, err := cmd.Flags().GetString(flagPrefix) + if err != nil { + return err + } + if prefix == "" { + bech32AccAddress := sdk.AccAddress(addr) + + bech32ValAddress := sdk.ValAddress(addr) + + cmd.Printf("Bech32 Acc %s\n", bech32AccAddress) + cmd.Printf("Bech32 Val %s\n", bech32ValAddress) + } else { + bech32Address, err := sdk.Bech32ifyAddressBytes(prefix, addr) + if err != nil { + return err + } + + cmd.Printf("Bech32 %s\n", bech32Address) + } default: - return fmt.Errorf("expected a valid hex or bech32 address (acc prefix %s), got '%s'", cfg.GetBech32AccountAddrPrefix(), addrString) - } + prefix := strings.SplitN(addrString, "1", 2)[0] + hexAddr, err := sdk.GetFromBech32(addrString, prefix) + if err != nil { + return err + } - cmd.Println("Address bytes:", addr) - cmd.Printf("Address (hex): %s\n", bytes.HexBytes(addr)) - cmd.Printf("Address (EIP-55): %s\n", common.BytesToAddress(addr)) - cmd.Printf("Bech32 Acc: %s\n", sdk.AccAddress(addr)) - cmd.Printf("Bech32 Val: %s\n", sdk.ValAddress(addr)) + hexAddrString := common.BytesToAddress(hexAddr).String() + + cmd.Println("Address bytes:", hexAddr) + cmd.Printf("Address hex: %s\n", hexAddrString) + } return nil }, } + + cmd.Flags().String(flagPrefix, "", "Bech32 encoded account prefix, for example evmos, evmosvaloper") + return cmd } func RawBytesCmd() *cobra.Command { diff --git a/cmd/evmosd/root.go b/cmd/evmosd/root.go index 7bf27e7167..424d8c9182 100644 --- a/cmd/evmosd/root.go +++ b/cmd/evmosd/root.go @@ -15,13 +15,12 @@ import ( "github.com/spf13/cobra" "github.com/spf13/viper" + "cosmossdk.io/simapp/params" + rosettaCmd "cosmossdk.io/tools/rosetta/cmd" dbm "github.com/cometbft/cometbft-db" tmcfg "github.com/cometbft/cometbft/config" tmcli "github.com/cometbft/cometbft/libs/cli" "github.com/cometbft/cometbft/libs/log" - - "cosmossdk.io/simapp/params" - rosettaCmd "cosmossdk.io/tools/rosetta/cmd" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/config" From 7b97378d2d5c2571c9ba8e7486265a58d45562a5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Feb 2024 14:42:34 +0100 Subject: [PATCH 139/345] build(deps): bump cosmossdk.io/math from 1.2.0 to 1.3.0 (#2376) * build(deps): bump cosmossdk.io/math from 1.2.0 to 1.3.0 Bumps [cosmossdk.io/math](https://github.com/cosmos/cosmos-sdk) from 1.2.0 to 1.3.0. - [Release notes](https://github.com/cosmos/cosmos-sdk/releases) - [Changelog](https://github.com/cosmos/cosmos-sdk/blob/main/CHANGELOG.md) - [Commits](https://github.com/cosmos/cosmos-sdk/compare/log/v1.2.0...log/v1.3.0) --- updated-dependencies: - dependency-name: cosmossdk.io/math dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * update gomod2nix.toml file --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: GAtom22 --- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 94c609956e..3b8094804a 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.21 require ( cosmossdk.io/api v0.3.1 cosmossdk.io/errors v1.0.1 - cosmossdk.io/math v1.2.0 + cosmossdk.io/math v1.3.0 cosmossdk.io/simapp v0.0.0-20230608160436-666c345ad23d cosmossdk.io/tools/rosetta v0.2.1 github.com/armon/go-metrics v0.4.1 diff --git a/go.sum b/go.sum index 74ca174664..4f8c762c1a 100644 --- a/go.sum +++ b/go.sum @@ -197,8 +197,8 @@ cosmossdk.io/errors v1.0.1 h1:bzu+Kcr0kS/1DuPBtUFdWjzLqyUuCiyHjyJB6srBV/0= cosmossdk.io/errors v1.0.1/go.mod h1:MeelVSZThMi4bEakzhhhE/CKqVv3nOJDA25bIqRDu/U= cosmossdk.io/log v1.3.0 h1:L0Z0XstClo2kOU4h3V1iDoE5Ji64sg5HLOogzGg67Oo= cosmossdk.io/log v1.3.0/go.mod h1:HIDyvWLqZe2ovlWabsDN4aPMpY/nUEquAhgfTf2ZzB8= -cosmossdk.io/math v1.2.0 h1:8gudhTkkD3NxOP2YyyJIYYmt6dQ55ZfJkDOaxXpy7Ig= -cosmossdk.io/math v1.2.0/go.mod h1:l2Gnda87F0su8a/7FEKJfFdJrM0JZRXQaohlgJeyQh0= +cosmossdk.io/math v1.3.0 h1:RC+jryuKeytIiictDslBP9i1fhkVm6ZDmZEoNP316zE= +cosmossdk.io/math v1.3.0/go.mod h1:vnRTxewy+M7BtXBNFybkuhSH4WfedVAAnERHgVFhp3k= cosmossdk.io/simapp v0.0.0-20230608160436-666c345ad23d h1:E/8y0oG3u9hBR8l4F9MtC0LdZIamPCUwUoLlrHrX86I= cosmossdk.io/simapp v0.0.0-20230608160436-666c345ad23d/go.mod h1:xbjky3L3DJEylaho6gXplkrMvJ5sFgv+qNX+Nn47bzY= cosmossdk.io/tools/rosetta v0.2.1 h1:ddOMatOH+pbxWbrGJKRAawdBkPYLfKXutK9IETnjYxw= diff --git a/gomod2nix.toml b/gomod2nix.toml index 4c73a9a999..7e2dd512e2 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -32,8 +32,8 @@ schema = 3 version = "v1.3.0" hash = "sha256-ti835PlPIWxP8c2Drfo5asi2Kd6kBkmXaadQZ/BiMqw=" [mod."cosmossdk.io/math"] - version = "v1.2.0" - hash = "sha256-yLPUAsJPQxuI0C22cPbP/BzclWb9eBzGFntGDQmdVUc=" + version = "v1.3.0" + hash = "sha256-EEFK43Cr0g0ndhQhkIKher0FqV3mvkmE9z0sP7uVSHg=" [mod."cosmossdk.io/simapp"] version = "v0.0.0-20230608160436-666c345ad23d" hash = "sha256-6BMBA98BpK3jG6++ZE4LdPQwwpS+lZ0GLMRF1fO4UfM=" From bcf45a928b1532abd1eecb96fdd1c3e3aecb5f11 Mon Sep 17 00:00:00 2001 From: Freddy Caceres Date: Mon, 26 Feb 2024 14:50:31 -0500 Subject: [PATCH 140/345] imp(evm): Add global BuildEVMExecutionCtx function (#2307) * imp(evm): Add global BuildEVMExecutionCtx function * run make format * update import name * add licenses * fix review comments * update changelog * fix changelog --------- Co-authored-by: Vladislav Varadinov Co-authored-by: Vvaradinov Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> --- CHANGELOG.md | 1 + app/ante/evm/01_setup_ctx.go | 17 ++++++++--------- x/evm/ante/ctx.go | 21 +++++++++++++++++++++ x/evm/ante/ctx_test.go | 19 +++++++++++++++++++ x/evm/ante/suite_test.go | 18 ++++++++++++++++++ x/evm/keeper/grpc_query.go | 25 +++++++------------------ 6 files changed, 74 insertions(+), 27 deletions(-) create mode 100644 x/evm/ante/ctx.go create mode 100644 x/evm/ante/ctx_test.go create mode 100644 x/evm/ante/suite_test.go diff --git a/CHANGELOG.md b/CHANGELOG.md index a1a09b90b1..2ae63b7e42 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -69,6 +69,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (tests) [#2296](https://github.com/evmos/evmos/pull/2296) Add custom genesis config functionality to integration setup. - (db) [#2297](https://github.com/evmos/evmos/pull/2297) Patch versionDB dependency to avoid lagging behind on OS reboot and update version check logic. - (tests) [#2301](https://github.com/evmos/evmos/pull/2301) Run Nix tests in parallel. +- (evm) [#2307](https://github.com/evmos/evmos/pull/2307) Add global BuildEVMExecutionCtx function. - (tests) [#2311](https://github.com/evmos/evmos/pull/2311) Fix post-upgrade transactions in automated upgrade tests. - (build) [#2319](https://github.com/evmos/evmos/pull/2319) Bump go.mod golang version to v1.21. - (ci) [#2321](https://github.com/evmos/evmos/pull/2321) Add build and markdown lint checker for `main` and `release` branches. diff --git a/app/ante/evm/01_setup_ctx.go b/app/ante/evm/01_setup_ctx.go index 65a4861971..0f85f8c0f8 100644 --- a/app/ante/evm/01_setup_ctx.go +++ b/app/ante/evm/01_setup_ctx.go @@ -1,16 +1,17 @@ // Copyright Tharsis Labs Ltd.(Evmos) // SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + package evm import ( errorsmod "cosmossdk.io/errors" - storetypes "github.com/cosmos/cosmos-sdk/store/types" - sdk "github.com/cosmos/cosmos-sdk/types" + sdktypes "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" authante "github.com/cosmos/cosmos-sdk/x/auth/ante" + evmante "github.com/evmos/evmos/v16/x/evm/ante" ) -var _ sdk.AnteDecorator = &EthSetupContextDecorator{} +var _ sdktypes.AnteDecorator = &EthSetupContextDecorator{} // EthSetupContextDecorator is adapted from SetUpContextDecorator from cosmos-sdk, it ignores gas consumption // by setting the gas meter to infinite @@ -24,7 +25,7 @@ func NewEthSetUpContextDecorator(evmKeeper EVMKeeper) EthSetupContextDecorator { } } -func (esc EthSetupContextDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler) (newCtx sdk.Context, err error) { +func (esc EthSetupContextDecorator) AnteHandle(ctx sdktypes.Context, tx sdktypes.Tx, simulate bool, next sdktypes.AnteHandler) (newCtx sdktypes.Context, err error) { newCtx, err = SetupContext(ctx, tx, esc.evmKeeper) if err != nil { return ctx, err @@ -32,7 +33,7 @@ func (esc EthSetupContextDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simul return next(newCtx, tx, simulate) } -func SetupContext(ctx sdk.Context, tx sdk.Tx, evmKeeper EVMKeeper) (sdk.Context, error) { +func SetupContext(ctx sdktypes.Context, tx sdktypes.Tx, evmKeeper EVMKeeper) (sdktypes.Context, error) { // all transactions must implement GasTx _, ok := tx.(authante.GasTx) if !ok { @@ -40,10 +41,8 @@ func SetupContext(ctx sdk.Context, tx sdk.Tx, evmKeeper EVMKeeper) (sdk.Context, } // We need to setup an empty gas config so that the gas is consistent with Ethereum. - newCtx := ctx.WithGasMeter(sdk.NewInfiniteGasMeter()). - WithKVGasConfig(storetypes.GasConfig{}). - WithTransientKVGasConfig(storetypes.GasConfig{}) - + newCtx := evmante.BuildEvmExecutionCtx(ctx). + WithGasMeter(sdktypes.NewInfiniteGasMeter()) // Reset transient gas used to prepare the execution of current cosmos tx. // Transient gas-used is necessary to sum the gas-used of cosmos tx, when it contains multiple eth msgs. evmKeeper.ResetTransientGasUsed(ctx) diff --git a/x/evm/ante/ctx.go b/x/evm/ante/ctx.go new file mode 100644 index 0000000000..b14a917baa --- /dev/null +++ b/x/evm/ante/ctx.go @@ -0,0 +1,21 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package ante + +import ( + storetypes "github.com/cosmos/cosmos-sdk/store/types" + sdktypes "github.com/cosmos/cosmos-sdk/types" +) + +// BuildEvmExecutionCtx builds the context needed prior to executing an EVM transaction. +// It does the following: +// 1. Sets an empty KV gas config for gas to be calculated by opcodes +// and not kvstore actions +// 2. Setup an empty transient KV gas config for transient gas to be +// calculated by opcodes +func BuildEvmExecutionCtx(ctx sdktypes.Context) sdktypes.Context { + // We need to setup an empty gas config so that the gas is consistent with Ethereum. + return ctx.WithKVGasConfig(storetypes.GasConfig{}). + WithTransientKVGasConfig(storetypes.GasConfig{}) +} diff --git a/x/evm/ante/ctx_test.go b/x/evm/ante/ctx_test.go new file mode 100644 index 0000000000..fe20dd698a --- /dev/null +++ b/x/evm/ante/ctx_test.go @@ -0,0 +1,19 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package ante_test + +import ( + storetypes "github.com/cosmos/cosmos-sdk/store/types" + "github.com/evmos/evmos/v16/testutil/integration/evmos/network" + evmante "github.com/evmos/evmos/v16/x/evm/ante" +) + +func (suite *EvmAnteTestSuite) TestBuildEvmExecutionCtx() { + network := network.New() + + ctx := evmante.BuildEvmExecutionCtx(network.GetContext()) + + suite.Equal(storetypes.GasConfig{}, ctx.KVGasConfig()) + suite.Equal(storetypes.GasConfig{}, ctx.TransientKVGasConfig()) +} diff --git a/x/evm/ante/suite_test.go b/x/evm/ante/suite_test.go new file mode 100644 index 0000000000..0fbc229eb0 --- /dev/null +++ b/x/evm/ante/suite_test.go @@ -0,0 +1,18 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package ante_test + +import ( + "testing" + + "github.com/stretchr/testify/suite" +) + +type EvmAnteTestSuite struct { + suite.Suite +} + +func TestEvmAnteTestSuite(t *testing.T) { + suite.Run(t, &EvmAnteTestSuite{}) +} diff --git a/x/evm/keeper/grpc_query.go b/x/evm/keeper/grpc_query.go index ce4919f559..7191a4db97 100644 --- a/x/evm/keeper/grpc_query.go +++ b/x/evm/keeper/grpc_query.go @@ -10,8 +10,6 @@ import ( "math/big" "time" - storetypes "github.com/cosmos/cosmos-sdk/store/types" - "github.com/ethereum/go-ethereum/eth/tracers" "github.com/ethereum/go-ethereum/eth/tracers/logger" @@ -30,6 +28,7 @@ import ( ethparams "github.com/ethereum/go-ethereum/params" evmostypes "github.com/evmos/evmos/v16/types" + evmante "github.com/evmos/evmos/v16/x/evm/ante" "github.com/evmos/evmos/v16/x/evm/statedb" "github.com/evmos/evmos/v16/x/evm/types" ) @@ -373,9 +372,7 @@ func (k Keeper) EstimateGasInternal(c context.Context, req *types.EthCallRequest } // resetting the gasMeter after increasing the sequence to have an accurate gas estimation on EVM extensions transactions gasMeter := evmostypes.NewInfiniteGasMeterWithLimit(msg.Gas()) - tmpCtx = tmpCtx.WithGasMeter(gasMeter). - WithKVGasConfig(storetypes.GasConfig{}). - WithTransientKVGasConfig(storetypes.GasConfig{}) + tmpCtx = evmante.BuildEvmExecutionCtx(tmpCtx).WithGasMeter(gasMeter) } // pass false to not commit StateDB rsp, err = k.ApplyMessageWithConfig(tmpCtx, msg, nil, false, cfg, txConfig) @@ -476,9 +473,8 @@ func (k Keeper) TraceTx(c context.Context, req *types.QueryTraceTxRequest) (*typ txConfig.TxHash = ethTx.Hash() txConfig.TxIndex = uint(i) // reset gas meter for each transaction - ctx = ctx.WithGasMeter(evmostypes.NewInfiniteGasMeterWithLimit(msg.Gas())). - WithKVGasConfig(storetypes.GasConfig{}). - WithTransientKVGasConfig(storetypes.GasConfig{}) + ctx = evmante.BuildEvmExecutionCtx(ctx). + WithGasMeter(evmostypes.NewInfiniteGasMeterWithLimit(msg.Gas())) rsp, err := k.ApplyMessageWithConfig(ctx, msg, types.NewNoOpTracer(), true, cfg, txConfig) if err != nil { continue @@ -663,16 +659,9 @@ func (k *Keeper) traceTx( } }() - // In order to be on in sync with the tx execution gas meter, - // we need to: - // 1. Reset GasMeter with InfiniteGasMeterWithLimit - // 2. Setup an empty KV gas config for gas to be calculated by opcodes - // and not kvstore actions - // 3. Setup an empty transient KV gas config for transient gas to be - // calculated by opcodes - ctx = ctx.WithGasMeter(evmostypes.NewInfiniteGasMeterWithLimit(msg.Gas())). - WithKVGasConfig(storetypes.GasConfig{}). - WithTransientKVGasConfig(storetypes.GasConfig{}) + // Build EVM execution context + ctx = evmante.BuildEvmExecutionCtx(ctx). + WithGasMeter(evmostypes.NewInfiniteGasMeterWithLimit(msg.Gas())) res, err := k.ApplyMessageWithConfig(ctx, msg, tracer, commitMessage, cfg, txConfig) if err != nil { return nil, 0, status.Error(codes.Internal, err.Error()) From 7a3c23c60eb647d3569fc88171f8a30c3f406253 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Feb 2024 12:17:33 -0300 Subject: [PATCH 141/345] build(deps): bump google.golang.org/grpc from 1.61.1 to 1.62.0 (#2371) Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.61.1 to 1.62.0. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.61.1...v1.62.0) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> --- go.mod | 33 ++++++++++++---------- go.sum | 76 ++++++++++++++++++++++++++++---------------------- gomod2nix.toml | 69 +++++++++++++++++++++++++-------------------- 3 files changed, 99 insertions(+), 79 deletions(-) diff --git a/go.mod b/go.mod index 3b8094804a..1812165941 100644 --- a/go.mod +++ b/go.mod @@ -49,18 +49,18 @@ require ( golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb golang.org/x/net v0.21.0 golang.org/x/text v0.14.0 - google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0 - google.golang.org/grpc v1.61.1 + google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 + google.golang.org/grpc v1.62.0 google.golang.org/protobuf v1.32.0 sigs.k8s.io/yaml v1.4.0 ) require ( - cloud.google.com/go v0.111.0 // indirect + cloud.google.com/go v0.112.0 // indirect cloud.google.com/go/compute v1.23.3 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect cloud.google.com/go/iam v1.1.5 // indirect - cloud.google.com/go/storage v1.30.1 // indirect + cloud.google.com/go/storage v1.36.0 // indirect cosmossdk.io/core v0.6.1 // indirect cosmossdk.io/depinject v1.0.0-alpha.4 // indirect cosmossdk.io/log v1.3.0 // indirect @@ -117,7 +117,7 @@ require ( github.com/dustin/go-humanize v1.0.1 // indirect github.com/dvsekhvalnov/jose2go v1.6.0 // indirect github.com/edsrzf/mmap-go v1.1.0 // indirect - github.com/felixge/httpsnoop v1.0.2 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff // indirect github.com/getsentry/sentry-go v0.23.0 // indirect @@ -134,7 +134,7 @@ require ( github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/gogo/googleapis v1.4.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/glog v1.1.2 // indirect + github.com/golang/glog v1.2.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/mock v1.6.0 // indirect github.com/golang/snappy v0.0.4 // indirect @@ -144,7 +144,7 @@ require ( github.com/google/pprof v0.0.0-20230228050547-1710fef4ab10 // indirect github.com/google/s2a-go v0.1.7 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect - github.com/google/uuid v1.4.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/gorilla/handlers v1.5.1 // indirect @@ -228,19 +228,22 @@ require ( github.com/zbiljic/go-filelock v0.0.0-20170914061330-1dbf7103ab7d // indirect github.com/zondax/ledger-go v0.14.3 // indirect go.etcd.io/bbolt v1.3.8 // indirect - go.opentelemetry.io/otel v1.19.0 // indirect - go.opentelemetry.io/otel/metric v1.19.0 // indirect - go.opentelemetry.io/otel/trace v1.19.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // indirect + go.opentelemetry.io/otel v1.21.0 // indirect + go.opentelemetry.io/otel/metric v1.21.0 // indirect + go.opentelemetry.io/otel/trace v1.21.0 // indirect golang.org/x/mod v0.14.0 // indirect - golang.org/x/oauth2 v0.14.0 // indirect - golang.org/x/sync v0.5.0 // indirect + golang.org/x/oauth2 v0.16.0 // indirect + golang.org/x/sync v0.6.0 // indirect golang.org/x/sys v0.17.0 // indirect golang.org/x/term v0.17.0 // indirect + golang.org/x/time v0.5.0 // indirect golang.org/x/tools v0.16.1 // indirect - google.golang.org/api v0.149.0 // indirect + google.golang.org/api v0.155.0 // indirect google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1 // indirect + google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index 4f8c762c1a..074421974c 100644 --- a/go.sum +++ b/go.sum @@ -32,8 +32,8 @@ cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w9 cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.111.0 h1:YHLKNupSD1KqjDbQ3+LVdQ81h/UJbJyZG203cEfnQgM= -cloud.google.com/go v0.111.0/go.mod h1:0mibmpKP1TyOOFYQY5izo0LnT+ecvOQ0Sg3OdmMiNRU= +cloud.google.com/go v0.112.0 h1:tpFCD7hpHFlQ8yPwT3x+QeXqc2T6+n6T+hmABHfDUSM= +cloud.google.com/go v0.112.0/go.mod h1:3jEEVwZ/MHU4djK5t5RHuKOA/GbLddgTdVubX1qnPD4= cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= @@ -174,8 +174,8 @@ cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3f cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cloud.google.com/go/storage v1.30.1 h1:uOdMxAs8HExqBlnLtnQyP0YkvbiDpdGShGKtx6U/oNM= -cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= +cloud.google.com/go/storage v1.36.0 h1:P0mOkAcaJxhCTvAkMhxMfrTKiNcub4YmmPBtlhAyTr8= +cloud.google.com/go/storage v1.36.0/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= @@ -342,6 +342,8 @@ github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa h1:jQCWAUqqlij9Pgj2i/PB79y4KOPYVyFYdROxgaCwdTQ= +github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM= github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= @@ -478,14 +480,16 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.m github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= +github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= github.com/evmos/cosmos-sdk v0.47.8-evmos h1:XOkJq3MeWDnTrNfDZk1bvCdrmjyyoxyL5gaTrguHPuA= github.com/evmos/cosmos-sdk v0.47.8-evmos/go.mod h1:VTAtthIsmfplanhFfUTfT6ED4F+kkJxT7nmvmKXRthI= github.com/evmos/go-ethereum v1.10.26-evmos-rc2 h1:tYghk1ZZ8X4/OQ4YI9hvtm8aSN8OSqO0g9vo/sCMdBo= github.com/evmos/go-ethereum v1.10.26-evmos-rc2/go.mod h1:/6CsT5Ceen2WPLI/oCA3xMcZ5sWMF/D46SjM/ayY0Oo= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= -github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= @@ -576,8 +580,8 @@ github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69 github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog= github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= -github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= +github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= +github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -678,8 +682,8 @@ github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3 github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= @@ -1194,14 +1198,18 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs= -go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= -go.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE= -go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= -go.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o= -go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= -go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg= -go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 h1:SpGay3w+nEwMpfVnbqOLH5gY52/foP8RE8UzTZ1pdSE= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1/go.mod h1:4UoMYEZOC0yN/sPGH76KPkkU7zgiEWYWL9vwmbnTJPE= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 h1:aFJWCqJMNjENlcleuuOkGAPH82y0yULBScfXcIEdS24= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1/go.mod h1:sEGXWArGqc3tVa+ekntsN65DmVbVeW+7lTKTjZF3/Fo= +go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= +go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= +go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4= +go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= +go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8= +go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= +go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= +go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -1371,8 +1379,8 @@ golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= -golang.org/x/oauth2 v0.14.0 h1:P0Vrf/2538nmC0H+pEQ3MNFRRnVR7RlqyVw+bvm26z0= -golang.org/x/oauth2 v0.14.0/go.mod h1:lAtNWgaWfL4cm7j2OV8TxGi9Qb7ECORx8DktCY74OwM= +golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= +golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1388,8 +1396,8 @@ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1526,8 +1534,8 @@ golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1652,8 +1660,8 @@ google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.149.0 h1:b2CqT6kG+zqJIVKRQ3ELJVLN1PwHZ6DJ3dW8yl82rgY= -google.golang.org/api v0.149.0/go.mod h1:Mwn1B7JTXrzXtnvmzQE2BD6bYZQ8DShKZDZbeN9I7qI= +google.golang.org/api v0.155.0 h1:vBmGhCYs0djJttDNynWo44zosHlPvHmA0XiN2zP2DtA= +google.golang.org/api v0.155.0/go.mod h1:GI5qK5f40kCpHfPn6+YzGAByIKWv8ujFnmoWm7Igduk= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1772,12 +1780,12 @@ google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqw google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917 h1:nz5NESFLZbJGPFxDT/HCn+V1mZ8JGNoY4nUpmW/Y2eg= -google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917/go.mod h1:pZqR+glSb11aJ+JQcczCvgf47+duRuzNSKqE8YAQnV0= -google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0 h1:s1w3X6gQxwrLEpxnLd/qXTVLgQE2yXwaOaoa6IlY/+o= -google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0/go.mod h1:CAny0tYF+0/9rmDB9fahA9YLzX3+AEVl1qXbv5hhj6c= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1 h1:gphdwh0npgs8elJ4T6J+DQJHPVF7RsuJHCfwztUb4J4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1/go.mod h1:daQN87bsDqDoe316QbbvX60nMoJQa4r6Ds0ZuoAe5yA= +google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 h1:KAeGQVN3M9nD0/bQXnr/ClcEMJ968gUXJQ9pwfSynuQ= +google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80/go.mod h1:cc8bqMqtv9gMOr0zHg2Vzff5ULhhL2IXP4sbcn32Dro= +google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 h1:Lj5rbfG876hIAYFjqiJnPHfhXbv+nzTWfm04Fg/XSVU= +google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 h1:AjyfHzEPEFp/NpvfN5g+KDla3EMojjhRVZc1i7cj+oM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -1819,8 +1827,8 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.61.1 h1:kLAiWrZs7YeDM6MumDe7m3y4aM6wacLzM1Y/wiLP9XY= -google.golang.org/grpc v1.61.1/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= +google.golang.org/grpc v1.62.0 h1:HQKZ/fa1bXkX1oFOvSjmZEUL8wLSaZTjCcLAlmZRtdk= +google.golang.org/grpc v1.62.0/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= diff --git a/gomod2nix.toml b/gomod2nix.toml index 7e2dd512e2..8282c0513c 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -2,8 +2,8 @@ schema = 3 [mod] [mod."cloud.google.com/go"] - version = "v0.111.0" - hash = "sha256-i8tQyny5W/PcPY5W5h2Zo6wKDKgYHpQlK77QU9TUdI4=" + version = "v0.112.0" + hash = "sha256-lmNLoqmLURfxu+a6V/SeoP8xVn0Wi2SD7uxxAtSjm+o=" [mod."cloud.google.com/go/compute"] version = "v1.23.3" hash = "sha256-WwlTw/x9GSM6B4nHm9FDvHZ1Pd4KN0wxk650CosJnpQ=" @@ -14,8 +14,8 @@ schema = 3 version = "v1.1.5" hash = "sha256-nETSf8U75kLNXk82JdQaJz394z8cXMbpNYSm1KE03GA=" [mod."cloud.google.com/go/storage"] - version = "v1.30.1" - hash = "sha256-4lC0XaLSQDnVBmNLIauiWnGXq+Ax57r8fcMxXFMCCNE=" + version = "v1.36.0" + hash = "sha256-dRKH1NEyAfEpVo5Mma677L7z0JO9Mfd1bv1lr1uFngI=" [mod."cosmossdk.io/api"] version = "v0.3.1" hash = "sha256-yQUn04n0/s3DpNWu7TF3NG+awWKxgvRpV9CYIV+dR7k=" @@ -248,8 +248,8 @@ schema = 3 hash = "sha256-hHTSv2zX22f3aoOKR6E2xvGqO8gZqJxw1y9YIMavpXk=" replaced = "github.com/evmos/go-ethereum" [mod."github.com/felixge/httpsnoop"] - version = "v1.0.2" - hash = "sha256-hj6FZQ1fDAV+1wGIViAt8XaAkWZ1I5vJzgjIJa7XRBA=" + version = "v1.0.4" + hash = "sha256-c1JKoRSndwwOyOxq9ddCe+8qn7mG9uRq2o/822x5O/c=" [mod."github.com/fsnotify/fsnotify"] version = "v1.6.0" hash = "sha256-DQesOCweQPEwmAn6s7DCP/Dwy8IypC+osbpfsvpkdP0=" @@ -300,8 +300,8 @@ schema = 3 version = "v1.3.2" hash = "sha256-pogILFrrk+cAtb0ulqn9+gRZJ7sGnnLLdtqITvxvG6c=" [mod."github.com/golang/glog"] - version = "v1.1.2" - hash = "sha256-sxvf1xMel10gNBqyGIFGFcyjupdM+nVMKUQ/lMLh3Ak=" + version = "v1.2.0" + hash = "sha256-eCWkUlsWbHSjsuTw8HcNpj3KxT+QPvW5SSIv88hAsxA=" [mod."github.com/golang/groupcache"] version = "v0.0.0-20210331224755-41bb18bfe9da" hash = "sha256-7Gs7CS9gEYZkbu5P4hqPGBpeGZWC64VDwraSKFF+VR0=" @@ -333,8 +333,8 @@ schema = 3 version = "v0.0.0-20191202100458-e7afc7fbc510" hash = "sha256-1f392pCmS7AXVKXIC1SvKlYtK/rvW47F5CCkGT2G6JM=" [mod."github.com/google/uuid"] - version = "v1.4.0" - hash = "sha256-FU0gzLmS48Ik9T+quGg5z/7ESGMPSXM3SY+rdJtG+5w=" + version = "v1.6.0" + hash = "sha256-VWl9sqUzdOuhW0KzQlv0gwwUQClYkmZwSydHG2sALYw=" [mod."github.com/googleapis/enterprise-certificate-proxy"] version = "v0.3.2" hash = "sha256-wVuR3QC0mYFl5LNeKdRXdKdod7BGP5sv2h6VVib85v8=" @@ -648,15 +648,21 @@ schema = 3 [mod."go.opencensus.io"] version = "v0.24.0" hash = "sha256-4H+mGZgG2c9I1y0m8avF4qmt8LUKxxVsTqR8mKgP4yo=" + [mod."go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc"] + version = "v0.46.1" + hash = "sha256-4af3ezbi/at7jZJfEiJ3+a4a1NnxYJPpzZp0tHQq8EA=" + [mod."go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"] + version = "v0.46.1" + hash = "sha256-H7GeyxyGcxVRCnR0J7HvpWi3QhwsXGF/IunQMpfkXhw=" [mod."go.opentelemetry.io/otel"] - version = "v1.19.0" - hash = "sha256-y51fwO/y73QBdwwRnCp+wrvVuWLeqfSnU/I8i4mBK84=" + version = "v1.21.0" + hash = "sha256-MWC1fp41z3w3Y1wlECY12Q7sLeU4PRACZEesWTmDD9E=" [mod."go.opentelemetry.io/otel/metric"] - version = "v1.19.0" - hash = "sha256-eYeeR8XUPjoF6lY3Yg1VUL0dPum/18KAcpo5k6zY67E=" + version = "v1.21.0" + hash = "sha256-UH5fN59juP5GRiTpr5VUv4JGAE2o47LOyR7Ic6Yl/v4=" [mod."go.opentelemetry.io/otel/trace"] - version = "v1.19.0" - hash = "sha256-EVsShx1IO0zpMztSfqYQ32Gm+hV4wrVM8wWkEfHOaoM=" + version = "v1.21.0" + hash = "sha256-vjZsOaQCgTjz6WYim0YZHLnB/PC3CvTSpS97qkL2vz8=" [mod."golang.org/x/crypto"] version = "v0.19.0" hash = "sha256-Vi6vY/eWNlYQ9l3Y+gA+X2+h2CmzEOrBRVFO/cnrPWc=" @@ -670,11 +676,11 @@ schema = 3 version = "v0.21.0" hash = "sha256-LfiqMpPtqvW/eLkfx6Ebr5ksqKbQli6uq06c/+XrBsw=" [mod."golang.org/x/oauth2"] - version = "v0.14.0" - hash = "sha256-1wCXYvhtiGksL75rrOTDc6P82WuKBeaReqy1l7CahAE=" + version = "v0.16.0" + hash = "sha256-fJfS9dKaq82WaYSVWHMnxNLWH8+L4aip/C1AfJi4FFI=" [mod."golang.org/x/sync"] - version = "v0.5.0" - hash = "sha256-EAKeODSsct5HhXPmpWJfulKSCkuUu6kkDttnjyZMNcI=" + version = "v0.6.0" + hash = "sha256-LLims/wjDZtIqlYCVHREewcUOX4hwRwplEuZKPOJ/HI=" [mod."golang.org/x/sys"] version = "v0.17.0" hash = "sha256-e0qnE+SitE02IzvnJKI4Uzpq9EOZY+zvE8Wf5b2e6Kg=" @@ -684,27 +690,30 @@ schema = 3 [mod."golang.org/x/text"] version = "v0.14.0" hash = "sha256-yh3B0tom1RfzQBf1RNmfdNWF1PtiqxV41jW1GVS6JAg=" + [mod."golang.org/x/time"] + version = "v0.5.0" + hash = "sha256-W6RgwgdYTO3byIPOFxrP2IpAZdgaGowAaVfYby7AULU=" [mod."golang.org/x/tools"] version = "v0.16.1" hash = "sha256-zIAwVvY/5/rPDebMDpR67CR7b+GtFmGWw6AOhxIkcfI=" [mod."google.golang.org/api"] - version = "v0.149.0" - hash = "sha256-nR3mk7wAsjvMEGsOiPKvqQwt789m6a+BDThpfTx0doA=" + version = "v0.155.0" + hash = "sha256-lfQZ5XNJYLOSlu+lrwYYIA3qXrraLC/PIVRHha5mlqI=" [mod."google.golang.org/appengine"] version = "v1.6.8" hash = "sha256-decMa0MiWfW/Bzr8QPPzzpeya0YWGHhZAt4Cr/bD1wQ=" [mod."google.golang.org/genproto"] - version = "v0.0.0-20240102182953-50ed04b92917" - hash = "sha256-iTzbVZIeGfcI/ZnDJqJZDxBCJ2J6vlYVdpE7wJX0sXI=" + version = "v0.0.0-20240123012728-ef4313101c80" + hash = "sha256-tRjQ7Nr0ytEhAcRMKW66isgaDNoNL6UKmjfS27s+8d8=" [mod."google.golang.org/genproto/googleapis/api"] - version = "v0.0.0-20231212172506-995d672761c0" - hash = "sha256-K85oYmTXZlQ+dOtyL4k1Oy6Qql2uqRUBOk+9TvRlPpE=" + version = "v0.0.0-20240123012728-ef4313101c80" + hash = "sha256-m1wAOo4INg46fIrGdISN5m5X29Z6OdR151xdKqrD9V4=" [mod."google.golang.org/genproto/googleapis/rpc"] - version = "v0.0.0-20240108191215-35c7eff3a6b1" - hash = "sha256-bwWoFG+H827aJ3VunK7emdQz3BQlTTjWlM513kTZqSo=" + version = "v0.0.0-20240123012728-ef4313101c80" + hash = "sha256-b22XLgjrH5i0wUw4iseepgLzjOpFgixWHfGPgl11kbo=" [mod."google.golang.org/grpc"] - version = "v1.61.1" - hash = "sha256-IhktITVoap1VEFwRjjZp5Kx6EM7DNF0+xPWA9zeZaOU=" + version = "v1.62.0" + hash = "sha256-OnEEt6J1d9uQazORCpD6jbAKph8/dKlDHcUEEkLQyjQ=" [mod."google.golang.org/protobuf"] version = "v1.32.0" hash = "sha256-GJuTkMGHCzHbyK4yD5kY4oMn8wQWqgkeBK//yVDqHJk=" From 7a9158711fefd7984a6ac9b2c41a9e999019b79e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 28 Feb 2024 14:19:15 +0100 Subject: [PATCH 142/345] build(deps): bump golang.org/x/crypto from 0.19.0 to 0.20.0 (#2377) * build(deps): bump golang.org/x/crypto from 0.19.0 to 0.20.0 Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.19.0 to 0.20.0. - [Commits](https://github.com/golang/crypto/compare/v0.19.0...v0.20.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * gomod2nix generate --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: tom Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 1812165941..c92f1023fc 100644 --- a/go.mod +++ b/go.mod @@ -45,7 +45,7 @@ require ( github.com/tyler-smith/go-bip39 v1.1.0 github.com/zondax/hid v0.9.2 go.opencensus.io v0.24.0 - golang.org/x/crypto v0.19.0 + golang.org/x/crypto v0.20.0 golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb golang.org/x/net v0.21.0 golang.org/x/text v0.14.0 diff --git a/go.sum b/go.sum index 074421974c..417240db1d 100644 --- a/go.sum +++ b/go.sum @@ -1243,8 +1243,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo= -golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.20.0 h1:jmAMJJZXr5KiCw05dfYK9QnqaqKLYXijU23lsEdcQqg= +golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= diff --git a/gomod2nix.toml b/gomod2nix.toml index 8282c0513c..44c1c0d86d 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -664,8 +664,8 @@ schema = 3 version = "v1.21.0" hash = "sha256-vjZsOaQCgTjz6WYim0YZHLnB/PC3CvTSpS97qkL2vz8=" [mod."golang.org/x/crypto"] - version = "v0.19.0" - hash = "sha256-Vi6vY/eWNlYQ9l3Y+gA+X2+h2CmzEOrBRVFO/cnrPWc=" + version = "v0.20.0" + hash = "sha256-7C0tDus5x3xRsSE08yOtZzMpOFym1Q9XP+U+CJ1sWmc=" [mod."golang.org/x/exp"] version = "v0.0.0-20230711153332-06a737ee72cb" hash = "sha256-Cbw10ZJ+jATPV232G47xZrn6ExO1FDtiT6nlMRCH7EI=" From b0cf9f325aefdf59656fd34b2023ebf11e8d2d60 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 28 Feb 2024 15:09:36 +0100 Subject: [PATCH 143/345] build(deps): bump es5-ext from 0.10.62 to 0.10.63 in /tests/solidity (#2378) Bumps [es5-ext](https://github.com/medikoo/es5-ext) from 0.10.62 to 0.10.63. - [Release notes](https://github.com/medikoo/es5-ext/releases) - [Changelog](https://github.com/medikoo/es5-ext/blob/main/CHANGELOG.md) - [Commits](https://github.com/medikoo/es5-ext/compare/v0.10.62...v0.10.63) --- updated-dependencies: - dependency-name: es5-ext dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Vladislav Varadinov --- tests/solidity/yarn.lock | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/tests/solidity/yarn.lock b/tests/solidity/yarn.lock index 4068cd425c..2ebb5e454b 100644 --- a/tests/solidity/yarn.lock +++ b/tests/solidity/yarn.lock @@ -4725,13 +4725,14 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -es5-ext@^0.10.35, es5-ext@^0.10.50: - version "0.10.62" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5" - integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA== +es5-ext@^0.10.35, es5-ext@^0.10.50, es5-ext@^0.10.62, es5-ext@~0.10.14: + version "0.10.63" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.63.tgz#9c222a63b6a332ac80b1e373b426af723b895bd6" + integrity sha512-hUCZd2Byj/mNKjfP9jXrdVZ62B8KuA/VoK7X8nUh5qT+AxDmcbvZz041oDVZdbIN1qW6XY9VDNwzkvKnZvK2TQ== dependencies: es6-iterator "^2.0.3" es6-symbol "^3.1.3" + esniff "^2.0.1" next-tick "^1.1.0" es6-iterator@^2.0.3: @@ -4788,6 +4789,16 @@ escodegen@1.8.x: optionalDependencies: source-map "~0.2.0" +esniff@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/esniff/-/esniff-2.0.1.tgz#a4d4b43a5c71c7ec51c51098c1d8a29081f9b308" + integrity sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg== + dependencies: + d "^1.0.1" + es5-ext "^0.10.62" + event-emitter "^0.3.5" + type "^2.7.2" + esprima@2.7.x, esprima@^2.7.1: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" @@ -5175,6 +5186,14 @@ ethjs-util@0.1.6, ethjs-util@^0.1.3, ethjs-util@^0.1.6: is-hex-prefixed "1.0.0" strip-hex-prefix "1.0.0" +event-emitter@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + integrity sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA== + dependencies: + d "1" + es5-ext "~0.10.14" + event-iterator@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/event-iterator/-/event-iterator-1.2.0.tgz#2e71dc6ca56f1cf8ebcb2b9be7fdfd10acabbb76" From e71079ad4db3037e6937f1f49ffc421aadbb1f6e Mon Sep 17 00:00:00 2001 From: stepit <48993133+0xstepit@users.noreply.github.com> Date: Thu, 29 Feb 2024 15:50:23 +0100 Subject: [PATCH 144/345] chore(revenue): deprecate revenue module (#2379) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * remove revenue directory * remove revenue proto * remove revenue from testutil * add revenue module to upgrade handler * remove revenue module wirings * add entry to changelog * remove revenue from swagger, tests, and CI scripts * format and lint * add revenue to changelog checker config * update changelog entry to use only allowed keys * add twitter to markdown link ignore * Update app/app.go --------- Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> --- CHANGELOG.md | 3 +- README.md | 1 - app/app.go | 45 +- app/keys.go | 2 - app/upgrades/v17/upgrades.go | 6 +- client/docs/config.json | 8 - client/docs/swagger-ui/swagger.json | 719 +---- mlc_config.json | 9 +- proto/evmos/revenue/v1/events.proto | 52 - proto/evmos/revenue/v1/genesis.proto | 29 - proto/evmos/revenue/v1/query.proto | 113 - proto/evmos/revenue/v1/revenue.proto | 19 - proto/evmos/revenue/v1/tx.proto | 94 - scripts/changelog_checker/config.py | 1 + scripts/license_checker/check_licenses.py | 2 - .../license_checker/test_check_licenses.py | 6 - tests/e2e/e2e_suite_test.go | 2 - testutil/integration/evmos/grpc/grpc.go | 5 - testutil/integration/evmos/grpc/revenue.go | 24 - testutil/integration/evmos/network/clients.go | 7 - testutil/integration/evmos/network/network.go | 3 - testutil/integration/evmos/network/params.go | 5 - x/revenue/v1/client/cli/query.go | 214 -- x/revenue/v1/client/cli/tx.go | 168 -- x/revenue/v1/genesis.go | 46 - x/revenue/v1/genesis_test.go | 119 - x/revenue/v1/handler.go | 37 - x/revenue/v1/keeper/evm_hooks.go | 120 - x/revenue/v1/keeper/grpc_query.go | 195 -- x/revenue/v1/keeper/grpc_query_test.go | 408 --- x/revenue/v1/keeper/integration_test.go | 936 ------- x/revenue/v1/keeper/keeper.go | 57 - x/revenue/v1/keeper/migrations.go | 29 - x/revenue/v1/keeper/msg_server.go | 283 -- x/revenue/v1/keeper/msg_server_test.go | 668 ----- x/revenue/v1/keeper/params.go | 35 - x/revenue/v1/keeper/params_test.go | 14 - x/revenue/v1/keeper/revenues.go | 160 -- x/revenue/v1/keeper/revenues_test.go | 338 --- x/revenue/v1/keeper/setup_test.go | 65 - x/revenue/v1/keeper/utils_test.go | 196 -- x/revenue/v1/migrations/v2/migrate.go | 40 - x/revenue/v1/migrations/v2/migrate_test.go | 62 - .../v1/migrations/v2/types/genesis.pb.go | 662 ----- x/revenue/v1/migrations/v2/types/params.go | 116 - x/revenue/v1/module.go | 185 -- x/revenue/v1/types/codec.go | 62 - x/revenue/v1/types/codec_test.go | 33 - x/revenue/v1/types/errors.go | 18 - x/revenue/v1/types/events.go | 14 - x/revenue/v1/types/events.pb.go | 1266 --------- x/revenue/v1/types/genesis.go | 42 - x/revenue/v1/types/genesis.pb.go | 644 ----- x/revenue/v1/types/genesis_test.go | 173 -- x/revenue/v1/types/interfaces.go | 53 - x/revenue/v1/types/keys.go | 44 - x/revenue/v1/types/msg.go | 197 -- x/revenue/v1/types/msg_test.go | 294 -- x/revenue/v1/types/params.go | 97 - x/revenue/v1/types/params_test.go | 120 - x/revenue/v1/types/query.pb.go | 2431 ----------------- x/revenue/v1/types/query.pb.gw.go | 575 ---- x/revenue/v1/types/revenue.go | 65 - x/revenue/v1/types/revenue.pb.go | 426 --- x/revenue/v1/types/revenue_test.go | 173 -- x/revenue/v1/types/tx.pb.go | 1979 -------------- x/revenue/v1/types/tx.pb.gw.go | 337 --- 67 files changed, 20 insertions(+), 15331 deletions(-) delete mode 100644 proto/evmos/revenue/v1/events.proto delete mode 100644 proto/evmos/revenue/v1/genesis.proto delete mode 100644 proto/evmos/revenue/v1/query.proto delete mode 100644 proto/evmos/revenue/v1/revenue.proto delete mode 100644 proto/evmos/revenue/v1/tx.proto delete mode 100644 testutil/integration/evmos/grpc/revenue.go delete mode 100644 x/revenue/v1/client/cli/query.go delete mode 100644 x/revenue/v1/client/cli/tx.go delete mode 100644 x/revenue/v1/genesis.go delete mode 100644 x/revenue/v1/genesis_test.go delete mode 100644 x/revenue/v1/handler.go delete mode 100644 x/revenue/v1/keeper/evm_hooks.go delete mode 100644 x/revenue/v1/keeper/grpc_query.go delete mode 100644 x/revenue/v1/keeper/grpc_query_test.go delete mode 100644 x/revenue/v1/keeper/integration_test.go delete mode 100644 x/revenue/v1/keeper/keeper.go delete mode 100644 x/revenue/v1/keeper/migrations.go delete mode 100644 x/revenue/v1/keeper/msg_server.go delete mode 100644 x/revenue/v1/keeper/msg_server_test.go delete mode 100644 x/revenue/v1/keeper/params.go delete mode 100644 x/revenue/v1/keeper/params_test.go delete mode 100644 x/revenue/v1/keeper/revenues.go delete mode 100644 x/revenue/v1/keeper/revenues_test.go delete mode 100644 x/revenue/v1/keeper/setup_test.go delete mode 100644 x/revenue/v1/keeper/utils_test.go delete mode 100644 x/revenue/v1/migrations/v2/migrate.go delete mode 100644 x/revenue/v1/migrations/v2/migrate_test.go delete mode 100644 x/revenue/v1/migrations/v2/types/genesis.pb.go delete mode 100644 x/revenue/v1/migrations/v2/types/params.go delete mode 100644 x/revenue/v1/module.go delete mode 100644 x/revenue/v1/types/codec.go delete mode 100644 x/revenue/v1/types/codec_test.go delete mode 100644 x/revenue/v1/types/errors.go delete mode 100644 x/revenue/v1/types/events.go delete mode 100644 x/revenue/v1/types/events.pb.go delete mode 100644 x/revenue/v1/types/genesis.go delete mode 100644 x/revenue/v1/types/genesis.pb.go delete mode 100644 x/revenue/v1/types/genesis_test.go delete mode 100644 x/revenue/v1/types/interfaces.go delete mode 100644 x/revenue/v1/types/keys.go delete mode 100644 x/revenue/v1/types/msg.go delete mode 100644 x/revenue/v1/types/msg_test.go delete mode 100644 x/revenue/v1/types/params.go delete mode 100644 x/revenue/v1/types/params_test.go delete mode 100644 x/revenue/v1/types/query.pb.go delete mode 100644 x/revenue/v1/types/query.pb.gw.go delete mode 100644 x/revenue/v1/types/revenue.go delete mode 100644 x/revenue/v1/types/revenue.pb.go delete mode 100644 x/revenue/v1/types/revenue_test.go delete mode 100644 x/revenue/v1/types/tx.pb.go delete mode 100644 x/revenue/v1/types/tx.pb.gw.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ae63b7e42..7605a1a291 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,6 +47,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (erc20) [#2292](https://github.com/evmos/evmos/pull/2292) Revert unnecessary logic on genesis (reverts #2217). - (tests) [#2332](https://github.com/evmos/evmos/pull/2332) Create configuration in temporary directory in `Init` command test. - (deps) [#2355](https://github.com/evmos/evmos/pull/2355) Bump Cosmos-SDK to v0.47.8-evmos. +- (revenue) [#2379](https://github.com/evmos/evmos/pull/2379) Remove `x/revenue` module. ### Bug Fixes @@ -73,7 +74,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (tests) [#2311](https://github.com/evmos/evmos/pull/2311) Fix post-upgrade transactions in automated upgrade tests. - (build) [#2319](https://github.com/evmos/evmos/pull/2319) Bump go.mod golang version to v1.21. - (ci) [#2321](https://github.com/evmos/evmos/pull/2321) Add build and markdown lint checker for `main` and `release` branches. -- (debug) [#2245](https://github.com/evmos/evmos/pull/2245) Update convert an address between hex and bech32. +- (cli) [#2245](https://github.com/evmos/evmos/pull/2245) Update convert an address between hex and bech32. - (werc20-precompile) [#2329](https://github.com/evmos/evmos/pull/2329) Make WEVMOS precompile `deposit` and `withdraw` functions no-ops. - (tests) [#2348](https://github.com/evmos/evmos/pull/2348) Extend integration transaction factory utils. diff --git a/README.md b/README.md index 92222c8572..607f230bce 100644 --- a/README.md +++ b/README.md @@ -94,7 +94,6 @@ License 1.0 (ENCL-1.0)](./LICENSE). This license applies to all software release version 13 or later, except for specific files, as follows, which will continue to be licensed under LGPLv3: -- `x/revenue/v1/` (all files in this folder) - `x/claims/genesis.go` - `x/erc20/keeper/proposals.go` - `x/erc20/types/utils.go` diff --git a/app/app.go b/app/app.go index 9912df7806..71ffa114c0 100644 --- a/app/app.go +++ b/app/app.go @@ -124,7 +124,6 @@ import ( "github.com/evmos/evmos/v16/app/ante" ethante "github.com/evmos/evmos/v16/app/ante/evm" "github.com/evmos/evmos/v16/app/post" - v16 "github.com/evmos/evmos/v16/app/upgrades/v16" v17 "github.com/evmos/evmos/v16/app/upgrades/v17" "github.com/evmos/evmos/v16/encoding" "github.com/evmos/evmos/v16/ethereum/eip712" @@ -148,9 +147,6 @@ import ( inflation "github.com/evmos/evmos/v16/x/inflation/v1" inflationkeeper "github.com/evmos/evmos/v16/x/inflation/v1/keeper" inflationtypes "github.com/evmos/evmos/v16/x/inflation/v1/types" - revenue "github.com/evmos/evmos/v16/x/revenue/v1" - revenuekeeper "github.com/evmos/evmos/v16/x/revenue/v1/keeper" - revenuetypes "github.com/evmos/evmos/v16/x/revenue/v1/types" "github.com/evmos/evmos/v16/x/vesting" vestingclient "github.com/evmos/evmos/v16/x/vesting/client" vestingkeeper "github.com/evmos/evmos/v16/x/vesting/keeper" @@ -226,7 +222,6 @@ var ( inflation.AppModuleBasic{}, erc20.AppModuleBasic{}, epochs.AppModuleBasic{}, - revenue.AppModuleBasic{}, consensus.AppModuleBasic{}, incentives.AppModuleBasic{}, ) @@ -301,7 +296,6 @@ type Evmos struct { Erc20Keeper erc20keeper.Keeper EpochsKeeper epochskeeper.Keeper VestingKeeper vestingkeeper.Keeper - RevenueKeeper revenuekeeper.Keeper // the module manager mm *module.Manager @@ -494,12 +488,6 @@ func NewEvmos( app.AuthzKeeper, &app.TransferKeeper, ) - app.RevenueKeeper = revenuekeeper.NewKeeper( - keys[revenuetypes.StoreKey], appCodec, authtypes.NewModuleAddress(govtypes.ModuleName), - app.BankKeeper, app.DistrKeeper, app.AccountKeeper, app.EvmKeeper, - authtypes.FeeCollectorName, - ) - app.TransferKeeper = transferkeeper.NewKeeper( appCodec, keys[ibctransfertypes.StoreKey], app.GetSubspace(ibctransfertypes.ModuleName), app.IBCKeeper.ChannelKeeper, // ICS4 Wrapper: claims IBC middleware @@ -538,11 +526,8 @@ func NewEvmos( ) app.EvmKeeper = app.EvmKeeper.SetHooks( - evmkeeper.NewMultiEvmHooks( - app.RevenueKeeper.Hooks(), - ), + evmkeeper.NewMultiEvmHooks(), ) - // NOTE: app.Erc20Keeper is already initialized elsewhere // Override the ICS20 app module @@ -638,8 +623,6 @@ func NewEvmos( app.GetSubspace(erc20types.ModuleName)), epochs.NewAppModule(appCodec, app.EpochsKeeper), vesting.NewAppModule(app.VestingKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), - revenue.NewAppModule(app.RevenueKeeper, app.AccountKeeper, - app.GetSubspace(revenuetypes.ModuleName)), ) // During begin block slashing happens after distr.BeginBlocker so that @@ -673,7 +656,6 @@ func NewEvmos( vestingtypes.ModuleName, inflationtypes.ModuleName, erc20types.ModuleName, - revenuetypes.ModuleName, consensusparamtypes.ModuleName, ) @@ -704,7 +686,6 @@ func NewEvmos( vestingtypes.ModuleName, inflationtypes.ModuleName, erc20types.ModuleName, - revenuetypes.ModuleName, consensusparamtypes.ModuleName, ) @@ -724,7 +705,6 @@ func NewEvmos( govtypes.ModuleName, ibcexported.ModuleName, // Ethermint modules - // evm module denomination is used by the revenue module, in AnteHandle evmtypes.ModuleName, // NOTE: feemarket module needs to be initialized before genutil module: // gentx transactions use MinGasPriceDecorator.AnteHandle @@ -742,7 +722,6 @@ func NewEvmos( inflationtypes.ModuleName, erc20types.ModuleName, epochstypes.ModuleName, - revenuetypes.ModuleName, consensusparamtypes.ModuleName, ) @@ -1132,24 +1111,10 @@ func initParamsKeeper( // evmos subspaces paramsKeeper.Subspace(inflationtypes.ModuleName) paramsKeeper.Subspace(erc20types.ModuleName) - paramsKeeper.Subspace(revenuetypes.ModuleName) return paramsKeeper } func (app *Evmos) setupUpgradeHandlers() { - // v16 upgrade handler - app.UpgradeKeeper.SetUpgradeHandler( - v16.UpgradeName, - v16.CreateUpgradeHandler( - app.mm, app.configurator, - app.AccountKeeper, - app.BankKeeper, - app.EvmKeeper, - app.GovKeeper, - app.InflationKeeper, - ), - ) - // v17 upgrade handler app.UpgradeKeeper.SetUpgradeHandler( v17.UpgradeName, @@ -1173,13 +1138,11 @@ func (app *Evmos) setupUpgradeHandlers() { var storeUpgrades *storetypes.StoreUpgrades switch upgradeInfo.Name { - case v16.UpgradeName: - // recovery and incentives modules are deprecated in v16 + case v17.UpgradeName: + // revenue module is deprecated in v17 storeUpgrades = &storetypes.StoreUpgrades{ - Deleted: []string{"recoveryv1", "incentives", "claims"}, + Deleted: []string{"revenue"}, } - case v17.UpgradeName: - // no store upgrades default: // no-op } diff --git a/app/keys.go b/app/keys.go index 85d63bbbe5..bcb5130450 100644 --- a/app/keys.go +++ b/app/keys.go @@ -27,7 +27,6 @@ import ( evmtypes "github.com/evmos/evmos/v16/x/evm/types" feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" inflationtypes "github.com/evmos/evmos/v16/x/inflation/v1/types" - revenuetypes "github.com/evmos/evmos/v16/x/revenue/v1/types" vestingtypes "github.com/evmos/evmos/v16/x/vesting/types" ) @@ -54,7 +53,6 @@ func StoreKeys() ( // evmos keys inflationtypes.StoreKey, erc20types.StoreKey, epochstypes.StoreKey, vestingtypes.StoreKey, - revenuetypes.StoreKey, } keys := sdk.NewKVStoreKeys(storeKeys...) diff --git a/app/upgrades/v17/upgrades.go b/app/upgrades/v17/upgrades.go index de286aaf61..d4bbbc96fd 100644 --- a/app/upgrades/v17/upgrades.go +++ b/app/upgrades/v17/upgrades.go @@ -17,7 +17,11 @@ func CreateUpgradeHandler( return func(ctx sdk.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { logger := ctx.Logger().With("upgrade", UpgradeName) - // Leave modules are as-is to avoid running InitGenesis. + // revenue module is deprecated + logger.Debug("deleting revenue module from version map...") + delete(vm, "revenue") + + // Leave modules as-is to avoid running InitGenesis. logger.Debug("running module migrations ...") return mm.RunMigrations(ctx, configurator, vm) } diff --git a/client/docs/config.json b/client/docs/config.json index a0c9f6cb4c..ef8ac457f6 100644 --- a/client/docs/config.json +++ b/client/docs/config.json @@ -29,14 +29,6 @@ { "url": "./tmp-swagger-gen/evmos/vesting/v2/query.swagger.json" }, - { - "url": "./tmp-swagger-gen/evmos/revenue/v1/query.swagger.json", - "operationIds": { - "rename": { - "Params": "RevenueParams" - } - } - }, { "url": "./tmp-swagger-gen/ethermint/evm/v1/query.swagger.json", "operationIds": { diff --git a/client/docs/swagger-ui/swagger.json b/client/docs/swagger-ui/swagger.json index 5c0fcdba3f..17179c48df 100644 --- a/client/docs/swagger-ui/swagger.json +++ b/client/docs/swagger-ui/swagger.json @@ -1050,535 +1050,6 @@ ] } }, - "/evmos/revenue/v1/params": { - "get": { - "summary": "Params retrieves the revenue module params", - "operationId": "RevenueParams", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "type": "object", - "properties": { - "params": { - "title": "params is the returned revenue parameter", - "type": "object", - "properties": { - "enable_revenue": { - "type": "boolean", - "title": "enable_revenue defines a parameter to enable the revenue module" - }, - "developer_shares": { - "type": "string", - "title": "developer_shares defines the proportion of the transaction fees to be\ndistributed to the registered contract owner" - }, - "addr_derivation_cost_create": { - "type": "string", - "format": "uint64", - "title": "addr_derivation_cost_create defines the cost of address derivation for\nverifying the contract deployer at fee registration" - } - } - } - }, - "description": "QueryParamsResponse is the response type for the Query/Params RPC method." - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "type": "string", - "format": "byte" - } - } - } - } - } - } - } - }, - "tags": [ - "Query" - ] - } - }, - "/evmos/revenue/v1/revenues": { - "get": { - "summary": "Revenues retrieves all registered revenues", - "operationId": "Revenues", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "type": "object", - "properties": { - "revenues": { - "type": "array", - "items": { - "type": "object", - "properties": { - "contract_address": { - "type": "string", - "title": "contract_address is the hex address of a registered contract" - }, - "deployer_address": { - "type": "string", - "title": "deployer_address is the bech32 address of message sender. It must be the same as the origin EOA\nsending the transaction which deploys the contract" - }, - "withdrawer_address": { - "type": "string", - "title": "withdrawer_address is the bech32 address of account receiving the transaction fees it defaults to\ndeployer_address" - } - }, - "title": "Revenue defines an instance that organizes fee distribution conditions for\nthe owner of a given smart contract" - }, - "title": "revenues is a slice of all stored Reveneue" - }, - "pagination": { - "description": "pagination defines the pagination in the response.", - "type": "object", - "properties": { - "next_key": { - "type": "string", - "format": "byte", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." - }, - "total": { - "type": "string", - "format": "uint64", - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" - } - } - } - }, - "description": "QueryRevenuesResponse is the response type for the Query/Revenues RPC method." - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "type": "string", - "format": "byte" - } - } - } - } - } - } - } - }, - "parameters": [ - { - "name": "pagination.key", - "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "in": "query", - "required": false, - "type": "string", - "format": "byte" - }, - { - "name": "pagination.offset", - "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "in": "query", - "required": false, - "type": "string", - "format": "uint64" - }, - { - "name": "pagination.limit", - "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "in": "query", - "required": false, - "type": "string", - "format": "uint64" - }, - { - "name": "pagination.count_total", - "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "in": "query", - "required": false, - "type": "boolean" - }, - { - "name": "pagination.reverse", - "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "in": "query", - "required": false, - "type": "boolean" - } - ], - "tags": [ - "Query" - ] - } - }, - "/evmos/revenue/v1/revenues/{contract_address}": { - "get": { - "summary": "Revenue retrieves a registered revenue for a given contract address", - "operationId": "Revenue", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "type": "object", - "properties": { - "revenue": { - "type": "object", - "properties": { - "contract_address": { - "type": "string", - "title": "contract_address is the hex address of a registered contract" - }, - "deployer_address": { - "type": "string", - "title": "deployer_address is the bech32 address of message sender. It must be the same as the origin EOA\nsending the transaction which deploys the contract" - }, - "withdrawer_address": { - "type": "string", - "title": "withdrawer_address is the bech32 address of account receiving the transaction fees it defaults to\ndeployer_address" - } - }, - "title": "Revenue defines an instance that organizes fee distribution conditions for\nthe owner of a given smart contract" - } - }, - "description": "QueryRevenueResponse is the response type for the Query/Revenue RPC method." - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "type": "string", - "format": "byte" - } - } - } - } - } - } - } - }, - "parameters": [ - { - "name": "contract_address", - "description": "contract_address of a registered contract in hex format", - "in": "path", - "required": true, - "type": "string" - } - ], - "tags": [ - "Query" - ] - } - }, - "/evmos/revenue/v1/revenues/{deployer_address}": { - "get": { - "summary": "DeployerRevenues retrieves all revenues that a given deployer has\nregistered", - "operationId": "DeployerRevenues", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "type": "object", - "properties": { - "contract_addresses": { - "type": "array", - "items": { - "type": "string" - }, - "title": "contract_addresses is the slice of registered contract addresses for a deployer" - }, - "pagination": { - "description": "pagination defines the pagination in the response.", - "type": "object", - "properties": { - "next_key": { - "type": "string", - "format": "byte", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." - }, - "total": { - "type": "string", - "format": "uint64", - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" - } - } - } - }, - "description": "QueryDeployerRevenuesResponse is the response type for the\nQuery/DeployerRevenues RPC method." - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "type": "string", - "format": "byte" - } - } - } - } - } - } - } - }, - "parameters": [ - { - "name": "deployer_address", - "description": "deployer_address in bech32 format", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "pagination.key", - "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "in": "query", - "required": false, - "type": "string", - "format": "byte" - }, - { - "name": "pagination.offset", - "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "in": "query", - "required": false, - "type": "string", - "format": "uint64" - }, - { - "name": "pagination.limit", - "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "in": "query", - "required": false, - "type": "string", - "format": "uint64" - }, - { - "name": "pagination.count_total", - "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "in": "query", - "required": false, - "type": "boolean" - }, - { - "name": "pagination.reverse", - "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "in": "query", - "required": false, - "type": "boolean" - } - ], - "tags": [ - "Query" - ] - } - }, - "/evmos/revenue/v1/revenues/{withdrawer_address}": { - "get": { - "summary": "WithdrawerRevenues retrieves all revenues with a given withdrawer\naddress", - "operationId": "WithdrawerRevenues", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "type": "object", - "properties": { - "contract_addresses": { - "type": "array", - "items": { - "type": "string" - }, - "title": "contract_addresses is the slice of registered contract addresses for a withdrawer" - }, - "pagination": { - "description": "pagination defines the pagination in the response.", - "type": "object", - "properties": { - "next_key": { - "type": "string", - "format": "byte", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." - }, - "total": { - "type": "string", - "format": "uint64", - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" - } - } - } - }, - "description": "QueryWithdrawerRevenuesResponse is the response type for the\nQuery/WithdrawerRevenues RPC method." - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "type": "string", - "format": "byte" - } - } - } - } - } - } - } - }, - "parameters": [ - { - "name": "withdrawer_address", - "description": "withdrawer_address in bech32 format", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "pagination.key", - "description": "key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.", - "in": "query", - "required": false, - "type": "string", - "format": "byte" - }, - { - "name": "pagination.offset", - "description": "offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.", - "in": "query", - "required": false, - "type": "string", - "format": "uint64" - }, - { - "name": "pagination.limit", - "description": "limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.", - "in": "query", - "required": false, - "type": "string", - "format": "uint64" - }, - { - "name": "pagination.count_total", - "description": "count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.", - "in": "query", - "required": false, - "type": "boolean" - }, - { - "name": "pagination.reverse", - "description": "reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43", - "in": "query", - "required": false, - "type": "boolean" - } - ], - "tags": [ - "Query" - ] - } - }, "/evmos/evm/v1/account/{address}": { "get": { "summary": "Account queries an Ethereum account.", @@ -21826,194 +21297,6 @@ }, "description": "QueryBalancesResponse is the response type for the Query/Balances RPC\nmethod." }, - "evmos.revenue.v1.Params": { - "type": "object", - "properties": { - "enable_revenue": { - "type": "boolean", - "title": "enable_revenue defines a parameter to enable the revenue module" - }, - "developer_shares": { - "type": "string", - "title": "developer_shares defines the proportion of the transaction fees to be\ndistributed to the registered contract owner" - }, - "addr_derivation_cost_create": { - "type": "string", - "format": "uint64", - "title": "addr_derivation_cost_create defines the cost of address derivation for\nverifying the contract deployer at fee registration" - } - }, - "title": "Params defines the revenue module params" - }, - "evmos.revenue.v1.QueryDeployerRevenuesResponse": { - "type": "object", - "properties": { - "contract_addresses": { - "type": "array", - "items": { - "type": "string" - }, - "title": "contract_addresses is the slice of registered contract addresses for a deployer" - }, - "pagination": { - "description": "pagination defines the pagination in the response.", - "type": "object", - "properties": { - "next_key": { - "type": "string", - "format": "byte", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." - }, - "total": { - "type": "string", - "format": "uint64", - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" - } - } - } - }, - "description": "QueryDeployerRevenuesResponse is the response type for the\nQuery/DeployerRevenues RPC method." - }, - "evmos.revenue.v1.QueryParamsResponse": { - "type": "object", - "properties": { - "params": { - "title": "params is the returned revenue parameter", - "type": "object", - "properties": { - "enable_revenue": { - "type": "boolean", - "title": "enable_revenue defines a parameter to enable the revenue module" - }, - "developer_shares": { - "type": "string", - "title": "developer_shares defines the proportion of the transaction fees to be\ndistributed to the registered contract owner" - }, - "addr_derivation_cost_create": { - "type": "string", - "format": "uint64", - "title": "addr_derivation_cost_create defines the cost of address derivation for\nverifying the contract deployer at fee registration" - } - } - } - }, - "description": "QueryParamsResponse is the response type for the Query/Params RPC method." - }, - "evmos.revenue.v1.QueryRevenueResponse": { - "type": "object", - "properties": { - "revenue": { - "type": "object", - "properties": { - "contract_address": { - "type": "string", - "title": "contract_address is the hex address of a registered contract" - }, - "deployer_address": { - "type": "string", - "title": "deployer_address is the bech32 address of message sender. It must be the same as the origin EOA\nsending the transaction which deploys the contract" - }, - "withdrawer_address": { - "type": "string", - "title": "withdrawer_address is the bech32 address of account receiving the transaction fees it defaults to\ndeployer_address" - } - }, - "title": "Revenue defines an instance that organizes fee distribution conditions for\nthe owner of a given smart contract" - } - }, - "description": "QueryRevenueResponse is the response type for the Query/Revenue RPC method." - }, - "evmos.revenue.v1.QueryRevenuesResponse": { - "type": "object", - "properties": { - "revenues": { - "type": "array", - "items": { - "type": "object", - "properties": { - "contract_address": { - "type": "string", - "title": "contract_address is the hex address of a registered contract" - }, - "deployer_address": { - "type": "string", - "title": "deployer_address is the bech32 address of message sender. It must be the same as the origin EOA\nsending the transaction which deploys the contract" - }, - "withdrawer_address": { - "type": "string", - "title": "withdrawer_address is the bech32 address of account receiving the transaction fees it defaults to\ndeployer_address" - } - }, - "title": "Revenue defines an instance that organizes fee distribution conditions for\nthe owner of a given smart contract" - }, - "title": "revenues is a slice of all stored Reveneue" - }, - "pagination": { - "description": "pagination defines the pagination in the response.", - "type": "object", - "properties": { - "next_key": { - "type": "string", - "format": "byte", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." - }, - "total": { - "type": "string", - "format": "uint64", - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" - } - } - } - }, - "description": "QueryRevenuesResponse is the response type for the Query/Revenues RPC method." - }, - "evmos.revenue.v1.QueryWithdrawerRevenuesResponse": { - "type": "object", - "properties": { - "contract_addresses": { - "type": "array", - "items": { - "type": "string" - }, - "title": "contract_addresses is the slice of registered contract addresses for a withdrawer" - }, - "pagination": { - "description": "pagination defines the pagination in the response.", - "type": "object", - "properties": { - "next_key": { - "type": "string", - "format": "byte", - "description": "next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results." - }, - "total": { - "type": "string", - "format": "uint64", - "title": "total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise" - } - } - } - }, - "description": "QueryWithdrawerRevenuesResponse is the response type for the\nQuery/WithdrawerRevenues RPC method." - }, - "evmos.revenue.v1.Revenue": { - "type": "object", - "properties": { - "contract_address": { - "type": "string", - "title": "contract_address is the hex address of a registered contract" - }, - "deployer_address": { - "type": "string", - "title": "deployer_address is the bech32 address of message sender. It must be the same as the origin EOA\nsending the transaction which deploys the contract" - }, - "withdrawer_address": { - "type": "string", - "title": "withdrawer_address is the bech32 address of account receiving the transaction fees it defaults to\ndeployer_address" - } - }, - "title": "Revenue defines an instance that organizes fee distribution conditions for\nthe owner of a given smart contract" - }, "ethermint.evm.v1.ChainConfig": { "type": "object", "properties": { @@ -39945,4 +39228,4 @@ } } } -} \ No newline at end of file +} diff --git a/mlc_config.json b/mlc_config.json index 7b442ec3de..7d5b67563f 100644 --- a/mlc_config.json +++ b/mlc_config.json @@ -1,5 +1,10 @@ { "retryOn429": true, "retryCount": 3, - "fallbackRetryDelay": "20s" -} \ No newline at end of file + "fallbackRetryDelay": "20s", + "ignorePatterns": [ + { + "pattern": "^https://twitter.com/.*" + } + ] +} diff --git a/proto/evmos/revenue/v1/events.proto b/proto/evmos/revenue/v1/events.proto deleted file mode 100644 index ed576e4ba8..0000000000 --- a/proto/evmos/revenue/v1/events.proto +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:LGPL-3.0-only -syntax = "proto3"; -package evmos.revenue.v1; - -option go_package = "github.com/evmos/evmos/v16/x/revenue/v1/types"; - -// EventRegisterRevenue is an event emitted when a contract is registered to receive a percentage of tx fees. -message EventRegisterRevenue { - // deployer_address is the bech32 address of message sender. It must be the same as the origin EOA - // sending the transaction which deploys the contract - string deployer_address = 1; - // contract_address in hex format - string contract_address = 2; - // effective_withdrawer is the withdrawer address that is stored after the - // revenue registration is completed. It defaults to the deployer address if - // the withdrawer address in the msg is omitted. When omitted, the withdraw map - // doesn't need to be set. - string effective_withdrawer = 3; -} - -// EventUpdateRevenue is an event emitted when a withdrawer address is updated for a contract. -message EventUpdateRevenue { - // contract_address in hex format - string contract_address = 1; - // deployer_address is the bech32 address of message sender. It must be the same as the origin EOA - // sending the transaction which deploys the contract - string deployer_address = 2; - // withdrawer_address is the bech32 address of account receiving the transaction fees - string withdrawer_address = 3; -} - -// EventCancelRevenue is an event emitted when a contract is unregistered from receiving tx fees. -message EventCancelRevenue { - // deployer_address is the bech32 address of message sender. It must be the same as the origin EOA - // sending the transaction which deploys the contract - string deployer_address = 1; - // contract_address in hex format - string contract_address = 2; -} - -// EventDistributeRevenue is an event emitted when a contract receives a percentage of tx fees. -message EventDistributeRevenue { - // sender is the address of message sender. - string sender = 1; - // contract address in hex format - string contract = 2; - // withdrawer_address is the bech32 address of account receiving the transaction fees - string withdrawer_address = 3; - // amount of revenue distributed - string amount = 4; -} diff --git a/proto/evmos/revenue/v1/genesis.proto b/proto/evmos/revenue/v1/genesis.proto deleted file mode 100644 index 3c093eb5a5..0000000000 --- a/proto/evmos/revenue/v1/genesis.proto +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:LGPL-3.0-only -syntax = "proto3"; -package evmos.revenue.v1; - -import "evmos/revenue/v1/revenue.proto"; -import "gogoproto/gogo.proto"; - -option go_package = "github.com/evmos/evmos/v16/x/revenue/v1/types"; - -// GenesisState defines the module's genesis state. -message GenesisState { - // params are the revenue module parameters - Params params = 1 [(gogoproto.nullable) = false]; - // revenues is a slice of active registered contracts for fee distribution - repeated Revenue revenues = 2 [(gogoproto.nullable) = false]; -} - -// Params defines the revenue module params -message Params { - // enable_revenue defines a parameter to enable the revenue module - bool enable_revenue = 1; - // developer_shares defines the proportion of the transaction fees to be - // distributed to the registered contract owner - string developer_shares = 2 [(gogoproto.customtype) = "cosmossdk.io/math.LegacyDec", (gogoproto.nullable) = false]; - // addr_derivation_cost_create defines the cost of address derivation for - // verifying the contract deployer at fee registration - uint64 addr_derivation_cost_create = 3; -} diff --git a/proto/evmos/revenue/v1/query.proto b/proto/evmos/revenue/v1/query.proto deleted file mode 100644 index 06fcbd7da6..0000000000 --- a/proto/evmos/revenue/v1/query.proto +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:LGPL-3.0-only -syntax = "proto3"; -package evmos.revenue.v1; - -import "cosmos/base/query/v1beta1/pagination.proto"; -import "evmos/revenue/v1/genesis.proto"; -import "evmos/revenue/v1/revenue.proto"; -import "gogoproto/gogo.proto"; -import "google/api/annotations.proto"; - -option go_package = "github.com/evmos/evmos/v16/x/revenue/v1/types"; - -// Query defines the gRPC querier service. -service Query { - // Revenues retrieves all registered revenues - rpc Revenues(QueryRevenuesRequest) returns (QueryRevenuesResponse) { - option (google.api.http).get = "/evmos/revenue/v1/revenues"; - } - - // Revenue retrieves a registered revenue for a given contract address - rpc Revenue(QueryRevenueRequest) returns (QueryRevenueResponse) { - option (google.api.http).get = "/evmos/revenue/v1/revenues/{contract_address}"; - } - - // Params retrieves the revenue module params - rpc Params(QueryParamsRequest) returns (QueryParamsResponse) { - option (google.api.http).get = "/evmos/revenue/v1/params"; - } - - // DeployerRevenues retrieves all revenues that a given deployer has - // registered - rpc DeployerRevenues(QueryDeployerRevenuesRequest) returns (QueryDeployerRevenuesResponse) { - option (google.api.http).get = "/evmos/revenue/v1/revenues/{deployer_address}"; - } - - // WithdrawerRevenues retrieves all revenues with a given withdrawer - // address - rpc WithdrawerRevenues(QueryWithdrawerRevenuesRequest) returns (QueryWithdrawerRevenuesResponse) { - option (google.api.http).get = "/evmos/revenue/v1/revenues/{withdrawer_address}"; - } -} - -// QueryRevenuesRequest is the request type for the Query/Revenues RPC method. -message QueryRevenuesRequest { - // pagination defines an optional pagination for the request. - cosmos.base.query.v1beta1.PageRequest pagination = 1; -} - -// QueryRevenuesResponse is the response type for the Query/Revenues RPC method. -message QueryRevenuesResponse { - // revenues is a slice of all stored Reveneue - repeated Revenue revenues = 1 [(gogoproto.nullable) = false]; - // pagination defines the pagination in the response. - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} - -// QueryRevenueRequest is the request type for the Query/Revenue RPC method. -message QueryRevenueRequest { - // contract_address of a registered contract in hex format - string contract_address = 1; -} - -// QueryRevenueResponse is the response type for the Query/Revenue RPC method. -message QueryRevenueResponse { - // revenue is a stored Reveneue for the queried contract - Revenue revenue = 1 [(gogoproto.nullable) = false]; -} - -// QueryParamsRequest is the request type for the Query/Params RPC method. -message QueryParamsRequest {} - -// QueryParamsResponse is the response type for the Query/Params RPC method. -message QueryParamsResponse { - // params is the returned revenue parameter - Params params = 1 [(gogoproto.nullable) = false]; -} - -// QueryDeployerRevenuesRequest is the request type for the -// Query/DeployerRevenues RPC method. -message QueryDeployerRevenuesRequest { - // deployer_address in bech32 format - string deployer_address = 1; - // pagination defines an optional pagination for the request. - cosmos.base.query.v1beta1.PageRequest pagination = 2; -} - -// QueryDeployerRevenuesResponse is the response type for the -// Query/DeployerRevenues RPC method. -message QueryDeployerRevenuesResponse { - // contract_addresses is the slice of registered contract addresses for a deployer - repeated string contract_addresses = 1; - // pagination defines the pagination in the response. - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} - -// QueryWithdrawerRevenuesRequest is the request type for the -// Query/WithdrawerRevenues RPC method. -message QueryWithdrawerRevenuesRequest { - // withdrawer_address in bech32 format - string withdrawer_address = 1; - // pagination defines an optional pagination for the request. - cosmos.base.query.v1beta1.PageRequest pagination = 2; -} - -// QueryWithdrawerRevenuesResponse is the response type for the -// Query/WithdrawerRevenues RPC method. -message QueryWithdrawerRevenuesResponse { - // contract_addresses is the slice of registered contract addresses for a withdrawer - repeated string contract_addresses = 1; - // pagination defines the pagination in the response. - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} diff --git a/proto/evmos/revenue/v1/revenue.proto b/proto/evmos/revenue/v1/revenue.proto deleted file mode 100644 index ccd5315e95..0000000000 --- a/proto/evmos/revenue/v1/revenue.proto +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:LGPL-3.0-only -syntax = "proto3"; -package evmos.revenue.v1; - -option go_package = "github.com/evmos/evmos/v16/x/revenue/v1/types"; - -// Revenue defines an instance that organizes fee distribution conditions for -// the owner of a given smart contract -message Revenue { - // contract_address is the hex address of a registered contract - string contract_address = 1; - // deployer_address is the bech32 address of message sender. It must be the same as the origin EOA - // sending the transaction which deploys the contract - string deployer_address = 2; - // withdrawer_address is the bech32 address of account receiving the transaction fees it defaults to - // deployer_address - string withdrawer_address = 3; -} diff --git a/proto/evmos/revenue/v1/tx.proto b/proto/evmos/revenue/v1/tx.proto deleted file mode 100644 index 44a58e7ead..0000000000 --- a/proto/evmos/revenue/v1/tx.proto +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:LGPL-3.0-only -syntax = "proto3"; -package evmos.revenue.v1; - -import "cosmos/msg/v1/msg.proto"; -import "cosmos_proto/cosmos.proto"; -import "evmos/revenue/v1/genesis.proto"; -import "gogoproto/gogo.proto"; -import "google/api/annotations.proto"; - -option go_package = "github.com/evmos/evmos/v16/x/revenue/v1/types"; - -// Msg defines the fees Msg service. -service Msg { - // RegisterRevenue registers a new contract for receiving transaction fees - rpc RegisterRevenue(MsgRegisterRevenue) returns (MsgRegisterRevenueResponse) { - option (google.api.http).post = "/evmos/revenue/v1/tx/register_revenue"; - }; - // UpdateRevenue updates the withdrawer address of a revenue - rpc UpdateRevenue(MsgUpdateRevenue) returns (MsgUpdateRevenueResponse) { - option (google.api.http).post = "/evmos/revenue/v1/tx/update_revenue"; - }; - // CancelRevenue cancels a contract's fee registration and further receival - // of transaction fees - rpc CancelRevenue(MsgCancelRevenue) returns (MsgCancelRevenueResponse) { - option (google.api.http).post = "/evmos/revenue/v1/tx/cancel_revenue"; - }; - // UpdateParams defined a governance operation for updating the x/revenue module parameters. - // The authority is hard-coded to the Cosmos SDK x/gov module account - rpc UpdateParams(MsgUpdateParams) returns (MsgUpdateParamsResponse); -} - -// MsgRegisterRevenue defines a message that registers a Revenue -message MsgRegisterRevenue { - option (gogoproto.equal) = false; - // contract_address in hex format - string contract_address = 1; - // deployer_address is the bech32 address of message sender. It must be the same as the origin EOA - // sending the transaction which deploys the contract - string deployer_address = 2; - // withdrawer_address is the bech32 address of account receiving the transaction fees - string withdrawer_address = 3; - // nonces is an array of nonces from the address path, where the last nonce is the nonce - // that determines the contract's address - it can be an EOA nonce or a - // factory contract nonce - repeated uint64 nonces = 4; -} - -// MsgRegisterRevenueResponse defines the MsgRegisterRevenue response type -message MsgRegisterRevenueResponse {} - -// MsgUpdateRevenue defines a message that updates the withdrawer address for a -// registered Revenue -message MsgUpdateRevenue { - option (gogoproto.equal) = false; - // contract_address in hex format - string contract_address = 1; - // deployer_address is the bech32 address of message sender. It must be the same as the origin EOA - // sending the transaction which deploys the contract - string deployer_address = 2; - // withdrawer_address is the bech32 address of account receiving the transaction fees - string withdrawer_address = 3; -} - -// MsgUpdateRevenueResponse defines the MsgUpdateRevenue response type -message MsgUpdateRevenueResponse {} - -// MsgCancelRevenue defines a message that cancels a registered Revenue -message MsgCancelRevenue { - option (gogoproto.equal) = false; - // contract_address in hex format - string contract_address = 1; - // deployer_address is the bech32 address of message sender. It must be the same as the origin EOA - // sending the transaction which deploys the contract - string deployer_address = 2; -} - -// MsgCancelRevenueResponse defines the MsgCancelRevenue response type -message MsgCancelRevenueResponse {} - -// MsgUpdateParams defines a Msg for updating the x/revenue module parameters. -message MsgUpdateParams { - option (cosmos.msg.v1.signer) = "authority"; - // authority is the address of the governance account. - string authority = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"]; - // params defines the x/revenue parameters to update. - // NOTE: All parameters must be supplied. - Params params = 2 [(gogoproto.nullable) = false]; -} - -// MsgUpdateParamsResponse defines the response structure for executing a -// MsgUpdateParams message. -message MsgUpdateParamsResponse {} diff --git a/scripts/changelog_checker/config.py b/scripts/changelog_checker/config.py index 752cbce851..3fabb006eb 100644 --- a/scripts/changelog_checker/config.py +++ b/scripts/changelog_checker/config.py @@ -71,6 +71,7 @@ def get_allowed_categories() -> List[str]: "consensus", "recovery", "incentives", + "revenue", ] base_path = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) diff --git a/scripts/license_checker/check_licenses.py b/scripts/license_checker/check_licenses.py index 8621cc8522..0642976bee 100644 --- a/scripts/license_checker/check_licenses.py +++ b/scripts/license_checker/check_licenses.py @@ -17,11 +17,9 @@ # List of files with a LGPL3 license. EXEMPT_FILES: List[str] = [ - r"x/revenue/v1/", # All files in this folder r"x/claims/genesis\.go$", r"x/erc20/keeper/proposals\.go$", r"x/erc20/types/utils\.go$", - r"proto/evmos/revenue/v1/", # All files in this folder r"proto/evmos/claims/v1/genesis\.proto$", ] diff --git a/scripts/license_checker/test_check_licenses.py b/scripts/license_checker/test_check_licenses.py index 2fab12238a..8297a7c7c8 100644 --- a/scripts/license_checker/test_check_licenses.py +++ b/scripts/license_checker/test_check_licenses.py @@ -43,12 +43,6 @@ def test_check_if_in_exempt_files_not_included(): def test_check_if_in_exempt_files_included(): - file = "/Users/malte/dev/go/evmos/evmos/x/revenue/v1/genesis.go" - assert cl.check_if_in_exempt_files(file) is True - - file = "/Users/malte/dev/go/evmos/evmos/x/claims/genesis.go" - assert cl.check_if_in_exempt_files(file) is True - file = "/Users/malte/dev/go/evmos/evmos/x/erc20/keeper/proposals.go" assert cl.check_if_in_exempt_files(file) is True diff --git a/tests/e2e/e2e_suite_test.go b/tests/e2e/e2e_suite_test.go index 90e9a9a2bc..0abe395c3e 100644 --- a/tests/e2e/e2e_suite_test.go +++ b/tests/e2e/e2e_suite_test.go @@ -317,8 +317,6 @@ func (s *IntegrationTestSuite) executeQueries() { {"feemarket: base-fee", "feemarket", "base-fee"}, {"feemarket: block-gas", "feemarket", "block-gas"}, {"feemarket: block-gas", "feemarket", "block-gas"}, - {"revenue: params", "revenue", "params"}, - {"revenue: contracts", "revenue", "contracts"}, } for _, tc := range testCases { diff --git a/testutil/integration/evmos/grpc/grpc.go b/testutil/integration/evmos/grpc/grpc.go index b7d301d9d8..674c239cc5 100644 --- a/testutil/integration/evmos/grpc/grpc.go +++ b/testutil/integration/evmos/grpc/grpc.go @@ -10,7 +10,6 @@ import ( "github.com/evmos/evmos/v16/testutil/integration/evmos/network" evmtypes "github.com/evmos/evmos/v16/x/evm/types" feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" - revtypes "github.com/evmos/evmos/v16/x/revenue/v1/types" ) // Handler is an interface that defines the methods that are used to query @@ -30,10 +29,6 @@ type Handler interface { // Gov methods GetProposal(proposalID uint64) (*govtypes.QueryProposalResponse, error) GetGovParams(paramsType string) (*govtypes.QueryParamsResponse, error) - - // Revenue methods - GetRevenue(address common.Address) (*revtypes.QueryRevenueResponse, error) - GetRevenueParams() (*revtypes.QueryParamsResponse, error) } var _ Handler = (*IntegrationHandler)(nil) diff --git a/testutil/integration/evmos/grpc/revenue.go b/testutil/integration/evmos/grpc/revenue.go deleted file mode 100644 index d4ab151e5f..0000000000 --- a/testutil/integration/evmos/grpc/revenue.go +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) -package grpc - -import ( - "context" - - "github.com/ethereum/go-ethereum/common" - revtypes "github.com/evmos/evmos/v16/x/revenue/v1/types" -) - -// GetRevenue returns the revenue for the given address. -func (gqh *IntegrationHandler) GetRevenue(address common.Address) (*revtypes.QueryRevenueResponse, error) { - revenueClient := gqh.network.GetRevenueClient() - return revenueClient.Revenue(context.Background(), &revtypes.QueryRevenueRequest{ - ContractAddress: address.String(), - }) -} - -// GetRevenueParams gets the revenue module params. -func (gqh *IntegrationHandler) GetRevenueParams() (*revtypes.QueryParamsResponse, error) { - revenueClient := gqh.network.GetRevenueClient() - return revenueClient.Params(context.Background(), &revtypes.QueryParamsRequest{}) -} diff --git a/testutil/integration/evmos/network/clients.go b/testutil/integration/evmos/network/clients.go index ce0ab9c7b9..66d8a5845d 100644 --- a/testutil/integration/evmos/network/clients.go +++ b/testutil/integration/evmos/network/clients.go @@ -17,7 +17,6 @@ import ( evmtypes "github.com/evmos/evmos/v16/x/evm/types" feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" infltypes "github.com/evmos/evmos/v16/x/inflation/v1/types" - revtypes "github.com/evmos/evmos/v16/x/revenue/v1/types" ) func getQueryHelper(ctx sdktypes.Context) *baseapp.QueryServiceTestHelper { @@ -47,12 +46,6 @@ func (n *IntegrationNetwork) GetGovClient() govtypes.QueryClient { return govtypes.NewQueryClient(queryHelper) } -func (n *IntegrationNetwork) GetRevenueClient() revtypes.QueryClient { - queryHelper := getQueryHelper(n.GetContext()) - revtypes.RegisterQueryServer(queryHelper, n.app.RevenueKeeper) - return revtypes.NewQueryClient(queryHelper) -} - func (n *IntegrationNetwork) GetBankClient() banktypes.QueryClient { queryHelper := getQueryHelper(n.GetContext()) banktypes.RegisterQueryServer(queryHelper, n.app.BankKeeper) diff --git a/testutil/integration/evmos/network/network.go b/testutil/integration/evmos/network/network.go index a932d04273..a1cf865bdc 100644 --- a/testutil/integration/evmos/network/network.go +++ b/testutil/integration/evmos/network/network.go @@ -26,7 +26,6 @@ import ( evmtypes "github.com/evmos/evmos/v16/x/evm/types" feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" infltypes "github.com/evmos/evmos/v16/x/inflation/v1/types" - revtypes "github.com/evmos/evmos/v16/x/revenue/v1/types" ) // Network is the interface that wraps the methods to interact with integration test network. @@ -43,7 +42,6 @@ type Network interface { GetERC20Client() erc20types.QueryClient GetEvmClient() evmtypes.QueryClient GetGovClient() govtypes.QueryClient - GetRevenueClient() revtypes.QueryClient GetInflationClient() infltypes.QueryClient GetFeeMarketClient() feemarkettypes.QueryClient @@ -52,7 +50,6 @@ type Network interface { UpdateEvmParams(params evmtypes.Params) error UpdateGovParams(params govtypes.Params) error UpdateInflationParams(params infltypes.Params) error - UpdateRevenueParams(params revtypes.Params) error UpdateFeeMarketParams(params feemarkettypes.Params) error } diff --git a/testutil/integration/evmos/network/params.go b/testutil/integration/evmos/network/params.go index a44a7887e2..ce60983030 100644 --- a/testutil/integration/evmos/network/params.go +++ b/testutil/integration/evmos/network/params.go @@ -8,7 +8,6 @@ import ( evmtypes "github.com/evmos/evmos/v16/x/evm/types" feemarketypes "github.com/evmos/evmos/v16/x/feemarket/types" infltypes "github.com/evmos/evmos/v16/x/inflation/v1/types" - revtypes "github.com/evmos/evmos/v16/x/revenue/v1/types" ) func (n *IntegrationNetwork) UpdateEvmParams(params evmtypes.Params) error { @@ -19,10 +18,6 @@ func (n *IntegrationNetwork) UpdateFeeMarketParams(params feemarketypes.Params) return n.app.FeeMarketKeeper.SetParams(n.ctx, params) } -func (n *IntegrationNetwork) UpdateRevenueParams(params revtypes.Params) error { - return n.app.RevenueKeeper.SetParams(n.ctx, params) -} - func (n *IntegrationNetwork) UpdateInflationParams(params infltypes.Params) error { return n.app.InflationKeeper.SetParams(n.ctx, params) } diff --git a/x/revenue/v1/client/cli/query.go b/x/revenue/v1/client/cli/query.go deleted file mode 100644 index f9d1226207..0000000000 --- a/x/revenue/v1/client/cli/query.go +++ /dev/null @@ -1,214 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:LGPL-3.0-only - -package cli - -import ( - "context" - "fmt" - - "github.com/spf13/cobra" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/version" - - "github.com/evmos/evmos/v16/x/revenue/v1/types" -) - -// GetQueryCmd returns the cli query commands for this module -func GetQueryCmd() *cobra.Command { - feesQueryCmd := &cobra.Command{ - Use: types.ModuleName, - Short: fmt.Sprintf("Querying commands for the %s module", types.ModuleName), - DisableFlagParsing: true, - SuggestionsMinimumDistance: 2, - RunE: client.ValidateCmd, - } - - feesQueryCmd.AddCommand( - GetCmdQueryRevenues(), - GetCmdQueryRevenue(), - GetCmdQueryParams(), - GetCmdQueryDeployerRevenues(), - GetCmdQueryWithdrawerRevenues(), - ) - - return feesQueryCmd -} - -// GetCmdQueryRevenues implements a command to return all registered contracts -// for fee distribution -func GetCmdQueryRevenues() *cobra.Command { - cmd := &cobra.Command{ - Use: "contracts", - Short: "Query all revenues", - Args: cobra.NoArgs, - RunE: func(cmd *cobra.Command, _ []string) error { - clientCtx, err := client.GetClientQueryContext(cmd) - if err != nil { - return err - } - queryClient := types.NewQueryClient(clientCtx) - - pageReq, err := client.ReadPageRequest(cmd.Flags()) - if err != nil { - return err - } - - req := &types.QueryRevenuesRequest{ - Pagination: pageReq, - } - - res, err := queryClient.Revenues(context.Background(), req) - if err != nil { - return err - } - - return clientCtx.PrintProto(res) - }, - } - - flags.AddQueryFlagsToCmd(cmd) - - return cmd -} - -// GetCmdQueryRevenue implements a command to return a registered contract for fee -// distribution -func GetCmdQueryRevenue() *cobra.Command { - cmd := &cobra.Command{ - Use: "contract CONTRACT_ADDRESS", - Args: cobra.ExactArgs(1), - Short: "Query a registered contract for fee distribution by hex address", - Long: "Query a registered contract for fee distribution by hex address", - Example: fmt.Sprintf("%s query revenue contract ", version.AppName), - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx, err := client.GetClientQueryContext(cmd) - if err != nil { - return err - } - - queryClient := types.NewQueryClient(clientCtx) - - req := &types.QueryRevenueRequest{ContractAddress: args[0]} - - // Query store - res, err := queryClient.Revenue(context.Background(), req) - if err != nil { - return err - } - - return clientCtx.PrintProto(res) - }, - } - flags.AddQueryFlagsToCmd(cmd) - return cmd -} - -// GetCmdQueryParams implements a command to return the current revenue -// parameters. -func GetCmdQueryParams() *cobra.Command { - cmd := &cobra.Command{ - Use: "params", - Short: "Query the current revenue module parameters", - Args: cobra.NoArgs, - RunE: func(cmd *cobra.Command, _ []string) error { - clientCtx, err := client.GetClientQueryContext(cmd) - if err != nil { - return err - } - queryClient := types.NewQueryClient(clientCtx) - - params := &types.QueryParamsRequest{} - - res, err := queryClient.Params(context.Background(), params) - if err != nil { - return err - } - - return clientCtx.PrintProto(&res.Params) - }, - } - - flags.AddQueryFlagsToCmd(cmd) - - return cmd -} - -// GetCmdQueryDeployerRevenues implements a command that returns all contracts -// that a deployer has registered for fee distribution -func GetCmdQueryDeployerRevenues() *cobra.Command { - cmd := &cobra.Command{ - Use: "deployer-contracts DEPLOYER_ADDRESS", - Args: cobra.ExactArgs(1), - Short: "Query all contracts that a given deployer has registered for fee distribution", - Long: "Query all contracts that a given deployer has registered for fee distribution", - Example: fmt.Sprintf("%s query revenue deployer-contracts ", version.AppName), - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx, err := client.GetClientQueryContext(cmd) - if err != nil { - return err - } - - queryClient := types.NewQueryClient(clientCtx) - - pageReq, err := client.ReadPageRequest(cmd.Flags()) - if err != nil { - return err - } - - // Query store - res, err := queryClient.DeployerRevenues(context.Background(), &types.QueryDeployerRevenuesRequest{ - DeployerAddress: args[0], - Pagination: pageReq, - }) - if err != nil { - return err - } - - return clientCtx.PrintProto(res) - }, - } - flags.AddQueryFlagsToCmd(cmd) - return cmd -} - -// GetCmdQueryWithdrawerRevenues implements a command that returns all -// contracts that have registered for fee distribution with a given withdraw -// address -func GetCmdQueryWithdrawerRevenues() *cobra.Command { - cmd := &cobra.Command{ - Use: "withdrawer-contracts WITHDRAWER_ADDRESS", - Args: cobra.ExactArgs(1), - Short: "Query all contracts that have been registered for fee distribution with a given withdrawer address", - Long: "Query all contracts that have been registered for fee distribution with a given withdrawer address", - Example: fmt.Sprintf("%s query revenue withdrawer-contracts ", version.AppName), - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx, err := client.GetClientQueryContext(cmd) - if err != nil { - return err - } - - queryClient := types.NewQueryClient(clientCtx) - - pageReq, err := client.ReadPageRequest(cmd.Flags()) - if err != nil { - return err - } - - // Query store - res, err := queryClient.WithdrawerRevenues(context.Background(), &types.QueryWithdrawerRevenuesRequest{ - WithdrawerAddress: args[0], - Pagination: pageReq, - }) - if err != nil { - return err - } - - return clientCtx.PrintProto(res) - }, - } - flags.AddQueryFlagsToCmd(cmd) - return cmd -} diff --git a/x/revenue/v1/client/cli/tx.go b/x/revenue/v1/client/cli/tx.go deleted file mode 100644 index 7c8fac3695..0000000000 --- a/x/revenue/v1/client/cli/tx.go +++ /dev/null @@ -1,168 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:LGPL-3.0-only - -package cli - -import ( - "encoding/json" - "fmt" - - "github.com/spf13/cobra" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/client/tx" - sdk "github.com/cosmos/cosmos-sdk/types" - - evmostypes "github.com/evmos/evmos/v16/types" - - "github.com/evmos/evmos/v16/x/revenue/v1/types" -) - -// NewTxCmd returns a root CLI command handler for certain modules/revenue -// transaction commands. -func NewTxCmd() *cobra.Command { - txCmd := &cobra.Command{ - Use: types.ModuleName, - Short: "revenue subcommands", - DisableFlagParsing: true, - SuggestionsMinimumDistance: 2, - RunE: client.ValidateCmd, - } - - txCmd.AddCommand( - NewRegisterRevenue(), - NewCancelRevenue(), - NewUpdateRevenue(), - ) - return txCmd -} - -// NewRegisterRevenue returns a CLI command handler for registering a -// contract for fee distribution -func NewRegisterRevenue() *cobra.Command { - cmd := &cobra.Command{ - Use: "register CONTRACT_HEX NONCE... [WITHDRAWER_BECH32]", - Short: "Register a contract for fee distribution. **NOTE** Please ensure, that the deployer of the contract (or the factory that deployes the contract) is an account that is owned by your project, to avoid that an individual deployer who leaves your project becomes malicious.", - Long: "Register a contract for fee distribution.\nOnly the contract deployer can register a contract.\nProvide the account nonce(s) used to derive the contract address. E.g.: you have an account nonce of 4 when you send a deployment transaction for a contract A; you use this contract as a factory, to create another contract B. If you register A, the nonces value is \"4\". If you register B, the nonces value is \"4,1\" (B is the first contract created by A). \nThe withdrawer address defaults to the deployer address if not provided.", - Args: cobra.RangeArgs(2, 3), - RunE: func(cmd *cobra.Command, args []string) error { - cliCtx, err := client.GetClientTxContext(cmd) - if err != nil { - return err - } - - var withdrawer string - deployer := cliCtx.GetFromAddress() - - contract := args[0] - if err := evmostypes.ValidateNonZeroAddress(contract); err != nil { - return fmt.Errorf("invalid contract hex address %w", err) - } - - var nonces []uint64 - if err = json.Unmarshal([]byte("["+args[1]+"]"), &nonces); err != nil { - return fmt.Errorf("invalid nonces %w", err) - } - - if len(args) == 3 { - withdrawer = args[2] - if _, err := sdk.AccAddressFromBech32(withdrawer); err != nil { - return fmt.Errorf("invalid withdrawer bech32 address %w", err) - } - } - - // If withdraw address is the same as contract deployer, remove the - // field for avoiding storage bloat - if deployer.String() == withdrawer { - withdrawer = "" - } - - msg := &types.MsgRegisterRevenue{ - ContractAddress: contract, - DeployerAddress: deployer.String(), - WithdrawerAddress: withdrawer, - Nonces: nonces, - } - - return tx.GenerateOrBroadcastTxCLI(cliCtx, cmd.Flags(), msg) - }, - } - - flags.AddTxFlagsToCmd(cmd) - return cmd -} - -// NewCancelRevenue returns a CLI command handler for canceling a -// contract for fee distribution -func NewCancelRevenue() *cobra.Command { - cmd := &cobra.Command{ - Use: "cancel CONTRACT_HEX", - Short: "Cancel a contract from fee distribution", - Long: "Cancel a contract from fee distribution. The deployer will no longer receive fees from users interacting with the contract. \nOnly the contract deployer can cancel a contract.", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - cliCtx, err := client.GetClientTxContext(cmd) - if err != nil { - return err - } - - deployer := cliCtx.GetFromAddress() - - contract := args[0] - if err := evmostypes.ValidateNonZeroAddress(contract); err != nil { - return fmt.Errorf("invalid contract hex address %w", err) - } - - msg := &types.MsgCancelRevenue{ - ContractAddress: contract, - DeployerAddress: deployer.String(), - } - - return tx.GenerateOrBroadcastTxCLI(cliCtx, cmd.Flags(), msg) - }, - } - - flags.AddTxFlagsToCmd(cmd) - return cmd -} - -// NewUpdateRevenue returns a CLI command handler for updating the withdraw -// address of a contract for fee distribution -func NewUpdateRevenue() *cobra.Command { - cmd := &cobra.Command{ - Use: "update CONTRACT_HEX WITHDRAWER_BECH32", - Short: "Update withdrawer address for a contract registered for fee distribution.", - Long: "Update withdrawer address for a contract registered for fee distribution. \nOnly the contract deployer can update the withdrawer address.", - Args: cobra.ExactArgs(2), - RunE: func(cmd *cobra.Command, args []string) error { - cliCtx, err := client.GetClientTxContext(cmd) - if err != nil { - return err - } - - deployer := cliCtx.GetFromAddress() - - contract := args[0] - if err := evmostypes.ValidateNonZeroAddress(contract); err != nil { - return fmt.Errorf("invalid contract hex address %w", err) - } - - withdrawer := args[1] - if _, err := sdk.AccAddressFromBech32(withdrawer); err != nil { - return fmt.Errorf("invalid withdrawer bech32 address %w", err) - } - - msg := &types.MsgUpdateRevenue{ - ContractAddress: contract, - DeployerAddress: deployer.String(), - WithdrawerAddress: withdrawer, - } - - return tx.GenerateOrBroadcastTxCLI(cliCtx, cmd.Flags(), msg) - }, - } - - flags.AddTxFlagsToCmd(cmd) - return cmd -} diff --git a/x/revenue/v1/genesis.go b/x/revenue/v1/genesis.go deleted file mode 100644 index 1dd68f0e34..0000000000 --- a/x/revenue/v1/genesis.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:LGPL-3.0-only - -package revenue - -import ( - errorsmod "cosmossdk.io/errors" - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/evmos/evmos/v16/x/revenue/v1/keeper" - "github.com/evmos/evmos/v16/x/revenue/v1/types" -) - -// InitGenesis import module genesis -func InitGenesis( - ctx sdk.Context, - k keeper.Keeper, - data types.GenesisState, -) { - err := k.SetParams(ctx, data.Params) - if err != nil { - panic(errorsmod.Wrapf(err, "failed setting params")) - } - - for _, revenue := range data.Revenues { - contract := revenue.GetContractAddr() - deployer := revenue.GetDeployerAddr() - withdrawer := revenue.GetWithdrawerAddr() - - // Set initial contracts receiving transaction fees - k.SetRevenue(ctx, revenue) - k.SetDeployerMap(ctx, deployer, contract) - - if len(withdrawer) != 0 { - k.SetWithdrawerMap(ctx, withdrawer, contract) - } - } -} - -// ExportGenesis export module state -func ExportGenesis(ctx sdk.Context, k keeper.Keeper) *types.GenesisState { - return &types.GenesisState{ - Params: k.GetParams(ctx), - Revenues: k.GetRevenues(ctx), - } -} diff --git a/x/revenue/v1/genesis_test.go b/x/revenue/v1/genesis_test.go deleted file mode 100644 index edaa77492f..0000000000 --- a/x/revenue/v1/genesis_test.go +++ /dev/null @@ -1,119 +0,0 @@ -package revenue_test - -import ( - "fmt" - "testing" - "time" - - "github.com/cometbft/cometbft/crypto/tmhash" - tmproto "github.com/cometbft/cometbft/proto/tendermint/types" - tmversion "github.com/cometbft/cometbft/proto/tendermint/version" - "github.com/cometbft/cometbft/version" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/suite" - - utiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/utils" - feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" - - "github.com/evmos/evmos/v16/app" - revenue "github.com/evmos/evmos/v16/x/revenue/v1" - "github.com/evmos/evmos/v16/x/revenue/v1/types" -) - -type GenesisTestSuite struct { - suite.Suite - - ctx sdk.Context - - app *app.Evmos - genesis types.GenesisState -} - -func (suite *GenesisTestSuite) SetupTest() { - // consensus key - consAddress := sdk.ConsAddress(utiltx.GenerateAddress().Bytes()) - chainID := utils.TestnetChainID + "-1" - suite.app = app.Setup(false, feemarkettypes.DefaultGenesisState(), chainID) - suite.ctx = suite.app.BaseApp.NewContext(false, tmproto.Header{ - Height: 1, - ChainID: chainID, - Time: time.Now().UTC(), - ProposerAddress: consAddress.Bytes(), - - Version: tmversion.Consensus{ - Block: version.BlockProtocol, - }, - LastBlockId: tmproto.BlockID{ - Hash: tmhash.Sum([]byte("block_id")), - PartSetHeader: tmproto.PartSetHeader{ - Total: 11, - Hash: tmhash.Sum([]byte("partset_header")), - }, - }, - AppHash: tmhash.Sum([]byte("app")), - DataHash: tmhash.Sum([]byte("data")), - EvidenceHash: tmhash.Sum([]byte("evidence")), - ValidatorsHash: tmhash.Sum([]byte("validators")), - NextValidatorsHash: tmhash.Sum([]byte("next_validators")), - ConsensusHash: tmhash.Sum([]byte("consensus")), - LastResultsHash: tmhash.Sum([]byte("last_result")), - }) - - suite.genesis = *types.DefaultGenesisState() -} - -func TestGenesisTestSuite(t *testing.T) { - suite.Run(t, new(GenesisTestSuite)) -} - -func (suite *GenesisTestSuite) TestRevenueInitGenesis() { - testCases := []struct { - name string - genesis types.GenesisState - expPanic bool - }{ - { - "default genesis", - suite.genesis, - false, - }, - { - "custom genesis - revenue disabled", - types.GenesisState{ - Params: types.Params{ - EnableRevenue: false, - DeveloperShares: types.DefaultDeveloperShares, - AddrDerivationCostCreate: types.DefaultAddrDerivationCostCreate, - }, - }, - false, - }, - } - - for _, tc := range testCases { - suite.Run(fmt.Sprintf("Case %s", tc.name), func() { - suite.SetupTest() // reset - - if tc.expPanic { - suite.Require().Panics(func() { - revenue.InitGenesis(suite.ctx, suite.app.RevenueKeeper, tc.genesis) - }) - } else { - suite.Require().NotPanics(func() { - revenue.InitGenesis(suite.ctx, suite.app.RevenueKeeper, tc.genesis) - }) - - params := suite.app.RevenueKeeper.GetParams(suite.ctx) - suite.Require().Equal(tc.genesis.Params, params) - } - }) - } -} - -func (suite *GenesisTestSuite) TestRevenueExportGenesis() { - revenue.InitGenesis(suite.ctx, suite.app.RevenueKeeper, suite.genesis) - - genesisExported := revenue.ExportGenesis(suite.ctx, suite.app.RevenueKeeper) - suite.Require().Equal(genesisExported.Params, suite.genesis.Params) -} diff --git a/x/revenue/v1/handler.go b/x/revenue/v1/handler.go deleted file mode 100644 index bc990904dc..0000000000 --- a/x/revenue/v1/handler.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:LGPL-3.0-only - -package revenue - -import ( - errorsmod "cosmossdk.io/errors" - sdk "github.com/cosmos/cosmos-sdk/types" - errortypes "github.com/cosmos/cosmos-sdk/types/errors" - - "github.com/evmos/evmos/v16/x/revenue/v1/types" -) - -// NewHandler defines the fees module handler instance -func NewHandler(server types.MsgServer) sdk.Handler { - return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { - ctx = ctx.WithEventManager(sdk.NewEventManager()) - - switch msg := msg.(type) { - case *types.MsgRegisterRevenue: - res, err := server.RegisterRevenue(sdk.WrapSDKContext(ctx), msg) - return sdk.WrapServiceResult(ctx, res, err) - case *types.MsgUpdateRevenue: - res, err := server.UpdateRevenue(sdk.WrapSDKContext(ctx), msg) - return sdk.WrapServiceResult(ctx, res, err) - case *types.MsgCancelRevenue: - res, err := server.CancelRevenue(sdk.WrapSDKContext(ctx), msg) - return sdk.WrapServiceResult(ctx, res, err) - case *types.MsgUpdateParams: - res, err := server.UpdateParams(sdk.WrapSDKContext(ctx), msg) - return sdk.WrapServiceResult(ctx, res, err) - - default: - return nil, errorsmod.Wrapf(errortypes.ErrUnknownRequest, "unrecognized %s message type: %T", types.ModuleName, msg) - } - } -} diff --git a/x/revenue/v1/keeper/evm_hooks.go b/x/revenue/v1/keeper/evm_hooks.go deleted file mode 100644 index 0a7b9d1a60..0000000000 --- a/x/revenue/v1/keeper/evm_hooks.go +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:LGPL-3.0-only - -package keeper - -import ( - errorsmod "cosmossdk.io/errors" - "cosmossdk.io/math" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/ethereum/go-ethereum/core" - ethtypes "github.com/ethereum/go-ethereum/core/types" - "golang.org/x/exp/slices" - - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - - "github.com/evmos/evmos/v16/x/revenue/v1/types" -) - -var _ evmtypes.EvmHooks = Hooks{} - -// Hooks wrapper struct for fees keeper -type Hooks struct { - k Keeper -} - -// Hooks return the wrapper hooks struct for the Keeper -func (k Keeper) Hooks() Hooks { - return Hooks{k} -} - -// PostTxProcessing is a wrapper for calling the EVM PostTxProcessing hook on -// the module keeper -func (h Hooks) PostTxProcessing(ctx sdk.Context, msg core.Message, receipt *ethtypes.Receipt) error { - return h.k.PostTxProcessing(ctx, msg, receipt) -} - -// PostTxProcessing implements EvmHooks.PostTxProcessing. After each successful -// interaction with a registered contract, the contract deployer (or, if set, -// the withdraw address) receives a share from the transaction fees paid by the -// transaction sender. -func (k Keeper) PostTxProcessing( - ctx sdk.Context, - msg core.Message, - receipt *ethtypes.Receipt, -) error { - contract := msg.To() - // when baseFee and minGasPrice in freemarker module are both 0 - // the user may send a transaction with gasPrice of 0 to the precompiled contract - if contract == nil || msg.GasPrice().Sign() <= 0 { - return nil - } - - // check if the fees are globally enabled or if the - // developer shares are set to zero - params := k.GetParams(ctx) - if !params.EnableRevenue || params.DeveloperShares.IsZero() { - return nil - } - - evmParams := k.evmKeeper.GetParams(ctx) - - var withdrawer sdk.AccAddress - containsPrecompile := slices.Contains(evmParams.ActivePrecompiles, contract.String()) - // if the contract is not a precompile, check if the contract is registered in the revenue module. - // else, return and avoid performing unnecessary logic - if !containsPrecompile { - // if the contract is not registered to receive fees, do nothing - revenue, found := k.GetRevenue(ctx, *contract) - if !found { - return nil - } - - withdrawer = revenue.GetWithdrawerAddr() - if len(withdrawer) == 0 { - withdrawer = revenue.GetDeployerAddr() - } - } - - // calculate fees to be paid - txFee := math.NewIntFromUint64(receipt.GasUsed).Mul(math.NewIntFromBigInt(msg.GasPrice())) - developerFee := (params.DeveloperShares).MulInt(txFee).TruncateInt() - evmDenom := k.evmKeeper.GetParams(ctx).EvmDenom - fees := sdk.Coins{{Denom: evmDenom, Amount: developerFee}} - - // get available precompiles from evm params and check if contract is in the list - if containsPrecompile { - if err := k.distributionKeeper.FundCommunityPool(ctx, fees, k.accountKeeper.GetModuleAddress(k.feeCollectorName)); err != nil { - return err - } - } else { - // distribute the fees to the contract deployer / withdraw address - err := k.bankKeeper.SendCoinsFromModuleToAccount( - ctx, - k.feeCollectorName, - withdrawer, - fees, - ) - if err != nil { - return errorsmod.Wrapf( - err, - "fee collector account failed to distribute developer fees (%s) to withdraw address %s. contract %s", - fees, withdrawer, contract, - ) - } - } - - ctx.EventManager().EmitEvents( - sdk.Events{ - sdk.NewEvent( - types.EventTypeDistributeDevRevenue, - sdk.NewAttribute(sdk.AttributeKeySender, msg.From().String()), - sdk.NewAttribute(types.AttributeKeyContract, contract.String()), - sdk.NewAttribute(types.AttributeKeyWithdrawerAddress, withdrawer.String()), - sdk.NewAttribute(sdk.AttributeKeyAmount, developerFee.String()), - ), - }, - ) - - return nil -} diff --git a/x/revenue/v1/keeper/grpc_query.go b/x/revenue/v1/keeper/grpc_query.go deleted file mode 100644 index ad11d63e1a..0000000000 --- a/x/revenue/v1/keeper/grpc_query.go +++ /dev/null @@ -1,195 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:LGPL-3.0-only - -package keeper - -import ( - "context" - "strings" - - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" - - "github.com/cosmos/cosmos-sdk/store/prefix" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/query" - "github.com/ethereum/go-ethereum/common" - evmostypes "github.com/evmos/evmos/v16/types" - - "github.com/evmos/evmos/v16/x/revenue/v1/types" -) - -var _ types.QueryServer = Keeper{} - -// Revenues returns all Revenues that have been registered for fee distribution -func (k Keeper) Revenues( - c context.Context, - req *types.QueryRevenuesRequest, -) (*types.QueryRevenuesResponse, error) { - if req == nil { - return nil, status.Error(codes.InvalidArgument, "empty request") - } - - ctx := sdk.UnwrapSDKContext(c) - - var revenues []types.Revenue - store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefixRevenue) - - pageRes, err := query.Paginate(store, req.Pagination, func(_, value []byte) error { - var revenue types.Revenue - if err := k.cdc.Unmarshal(value, &revenue); err != nil { - return err - } - revenues = append(revenues, revenue) - return nil - }) - if err != nil { - return nil, status.Error(codes.Internal, err.Error()) - } - return &types.QueryRevenuesResponse{ - Revenues: revenues, - Pagination: pageRes, - }, nil -} - -// Revenue returns the Revenue that has been registered for fee distribution for a given -// contract -func (k Keeper) Revenue( - c context.Context, - req *types.QueryRevenueRequest, -) (*types.QueryRevenueResponse, error) { - if req == nil { - return nil, status.Error(codes.InvalidArgument, "empty request") - } - - ctx := sdk.UnwrapSDKContext(c) - - if strings.TrimSpace(req.ContractAddress) == "" { - return nil, status.Error( - codes.InvalidArgument, - "contract address is empty", - ) - } - - // check if the contract is a non-zero hex address - if err := evmostypes.ValidateNonZeroAddress(req.ContractAddress); err != nil { - return nil, status.Errorf( - codes.InvalidArgument, - "invalid format for contract %s, should be non-zero hex ('0x...')", req.ContractAddress, - ) - } - - revenue, found := k.GetRevenue(ctx, common.HexToAddress(req.ContractAddress)) - if !found { - return nil, status.Errorf( - codes.NotFound, - "fees registered contract '%s'", - req.ContractAddress, - ) - } - - return &types.QueryRevenueResponse{Revenue: revenue}, nil -} - -// Params returns the fees module params -func (k Keeper) Params( - c context.Context, - _ *types.QueryParamsRequest, -) (*types.QueryParamsResponse, error) { - ctx := sdk.UnwrapSDKContext(c) - params := k.GetParams(ctx) - return &types.QueryParamsResponse{Params: params}, nil -} - -// DeployerRevenues returns all contracts that have been registered for fee -// distribution by a given deployer -func (k Keeper) DeployerRevenues( //nolint: dupl - c context.Context, - req *types.QueryDeployerRevenuesRequest, -) (*types.QueryDeployerRevenuesResponse, error) { - if req == nil { - return nil, status.Error(codes.InvalidArgument, "empty request") - } - - ctx := sdk.UnwrapSDKContext(c) - - if strings.TrimSpace(req.DeployerAddress) == "" { - return nil, status.Error( - codes.InvalidArgument, - "deployer address is empty", - ) - } - - deployer, err := sdk.AccAddressFromBech32(req.DeployerAddress) - if err != nil { - return nil, status.Errorf( - codes.InvalidArgument, - "invalid format for deployer %s, should be bech32 ('evmos...')", req.DeployerAddress, - ) - } - - var contracts []string - store := prefix.NewStore( - ctx.KVStore(k.storeKey), - types.GetKeyPrefixDeployer(deployer), - ) - - pageRes, err := query.Paginate(store, req.Pagination, func(key, _ []byte) error { - contracts = append(contracts, common.BytesToAddress(key).Hex()) - return nil - }) - if err != nil { - return nil, status.Error(codes.Internal, err.Error()) - } - - return &types.QueryDeployerRevenuesResponse{ - ContractAddresses: contracts, - Pagination: pageRes, - }, nil -} - -// WithdrawerRevenues returns all fees for a given withdraw address -func (k Keeper) WithdrawerRevenues( //nolint: dupl - c context.Context, - req *types.QueryWithdrawerRevenuesRequest, -) (*types.QueryWithdrawerRevenuesResponse, error) { - if req == nil { - return nil, status.Error(codes.InvalidArgument, "empty request") - } - - ctx := sdk.UnwrapSDKContext(c) - - if strings.TrimSpace(req.WithdrawerAddress) == "" { - return nil, status.Error( - codes.InvalidArgument, - "withdraw address is empty", - ) - } - - deployer, err := sdk.AccAddressFromBech32(req.WithdrawerAddress) - if err != nil { - return nil, status.Errorf( - codes.InvalidArgument, - "invalid format for withdraw addr %s, should be bech32 ('evmos...')", req.WithdrawerAddress, - ) - } - - var contracts []string - store := prefix.NewStore( - ctx.KVStore(k.storeKey), - types.GetKeyPrefixWithdrawer(deployer), - ) - - pageRes, err := query.Paginate(store, req.Pagination, func(key, _ []byte) error { - contracts = append(contracts, common.BytesToAddress(key).Hex()) - - return nil - }) - if err != nil { - return nil, status.Error(codes.Internal, err.Error()) - } - return &types.QueryWithdrawerRevenuesResponse{ - ContractAddresses: contracts, - Pagination: pageRes, - }, nil -} diff --git a/x/revenue/v1/keeper/grpc_query_test.go b/x/revenue/v1/keeper/grpc_query_test.go deleted file mode 100644 index 95aeb76e5d..0000000000 --- a/x/revenue/v1/keeper/grpc_query_test.go +++ /dev/null @@ -1,408 +0,0 @@ -package keeper_test - -import ( - "fmt" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/query" - - utiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/x/revenue/v1/types" -) - -func (suite *KeeperTestSuite) TestRevenues() { - var ( - req *types.QueryRevenuesRequest - expRes *types.QueryRevenuesResponse - ) - - testCases := []struct { - name string - malleate func() - expPass bool - }{ - { - "no fee infos registered", - func() { - req = &types.QueryRevenuesRequest{} - expRes = &types.QueryRevenuesResponse{Pagination: &query.PageResponse{}} - }, - true, - }, - { - "1 fee infos registered w/pagination", - func() { - req = &types.QueryRevenuesRequest{ - Pagination: &query.PageRequest{Limit: 10, CountTotal: true}, - } - revenue := types.NewRevenue(contract, deployer, withdraw) - suite.app.RevenueKeeper.SetRevenue(suite.ctx, revenue) - - expRes = &types.QueryRevenuesResponse{ - Pagination: &query.PageResponse{Total: 1}, - Revenues: []types.Revenue{ - { - ContractAddress: contract.Hex(), - DeployerAddress: deployer.String(), - WithdrawerAddress: withdraw.String(), - }, - }, - } - }, - true, - }, - { - "2 fee infos registered wo/pagination", - func() { - req = &types.QueryRevenuesRequest{} - contract2 := utiltx.GenerateAddress() - revenue := types.NewRevenue(contract, deployer, withdraw) - feeSplit2 := types.NewRevenue(contract2, deployer, nil) - suite.app.RevenueKeeper.SetRevenue(suite.ctx, revenue) - suite.app.RevenueKeeper.SetRevenue(suite.ctx, feeSplit2) - - expRes = &types.QueryRevenuesResponse{ - Pagination: &query.PageResponse{Total: 2}, - Revenues: []types.Revenue{ - { - ContractAddress: contract.Hex(), - DeployerAddress: deployer.String(), - WithdrawerAddress: withdraw.String(), - }, - { - ContractAddress: contract2.Hex(), - DeployerAddress: deployer.String(), - }, - }, - } - }, - true, - }, - } - for _, tc := range testCases { - suite.Run(fmt.Sprintf("Case %s", tc.name), func() { - suite.SetupTest() // reset - - ctx := sdk.WrapSDKContext(suite.ctx) - tc.malleate() - - res, err := suite.queryClient.Revenues(ctx, req) - if tc.expPass { - suite.Require().NoError(err) - suite.Require().Equal(expRes.Pagination, res.Pagination) - suite.Require().ElementsMatch(expRes.Revenues, res.Revenues) - } else { - suite.Require().Error(err) - } - }) - } -} - -// Cases that cannot be tested in TestFees -func (suite *KeeperTestSuite) TestRevenueKeeper() { - suite.SetupTest() - ctx := sdk.WrapSDKContext(suite.ctx) - res, err := suite.app.RevenueKeeper.Revenues(ctx, nil) - suite.Require().Error(err) - suite.Require().Nil(res) -} - -func (suite *KeeperTestSuite) TestFee() { - var ( - req *types.QueryRevenueRequest - expRes *types.QueryRevenueResponse - ) - - testCases := []struct { - name string - malleate func() - expPass bool - }{ - { - "empty contract address", - func() { - req = &types.QueryRevenueRequest{} - expRes = &types.QueryRevenueResponse{} - }, - false, - }, - { - "invalid contract address", - func() { - req = &types.QueryRevenueRequest{ - ContractAddress: "1234", - } - expRes = &types.QueryRevenueResponse{} - }, - false, - }, - { - "fee info not found", - func() { - req = &types.QueryRevenueRequest{ - ContractAddress: contract.String(), - } - expRes = &types.QueryRevenueResponse{} - }, - false, - }, - { - "fee info found", - func() { - revenue := types.NewRevenue(contract, deployer, withdraw) - suite.app.RevenueKeeper.SetRevenue(suite.ctx, revenue) - - req = &types.QueryRevenueRequest{ - ContractAddress: contract.Hex(), - } - expRes = &types.QueryRevenueResponse{Revenue: types.Revenue{ - ContractAddress: contract.Hex(), - DeployerAddress: deployer.String(), - WithdrawerAddress: withdraw.String(), - }} - }, - true, - }, - } - for _, tc := range testCases { - suite.Run(fmt.Sprintf("Case %s", tc.name), func() { - suite.SetupTest() // reset - - ctx := sdk.WrapSDKContext(suite.ctx) - tc.malleate() - - res, err := suite.queryClient.Revenue(ctx, req) - if tc.expPass { - suite.Require().NoError(err) - suite.Require().Equal(expRes, res) - } else { - suite.Require().Error(err) - } - }) - } -} - -func (suite *KeeperTestSuite) TestDeployerFees() { - var ( - req *types.QueryDeployerRevenuesRequest - expRes *types.QueryDeployerRevenuesResponse - ) - - testCases := []struct { - name string - malleate func() - expPass bool - }{ - { - "no contract registered", - func() { - req = &types.QueryDeployerRevenuesRequest{} - expRes = &types.QueryDeployerRevenuesResponse{Pagination: &query.PageResponse{}} - }, - false, - }, - { - "invalid deployer address", - func() { - req = &types.QueryDeployerRevenuesRequest{ - DeployerAddress: "123", - } - expRes = &types.QueryDeployerRevenuesResponse{Pagination: &query.PageResponse{}} - }, - false, - }, - { - "1 fee registered w/pagination", - func() { - req = &types.QueryDeployerRevenuesRequest{ - Pagination: &query.PageRequest{Limit: 10, CountTotal: true}, - DeployerAddress: deployer.String(), - } - - revenue := types.NewRevenue(contract, deployer, withdraw) - suite.app.RevenueKeeper.SetRevenue(suite.ctx, revenue) - suite.app.RevenueKeeper.SetDeployerMap(suite.ctx, deployer, contract) - suite.app.RevenueKeeper.SetWithdrawerMap(suite.ctx, withdraw, contract) - - expRes = &types.QueryDeployerRevenuesResponse{ - Pagination: &query.PageResponse{Total: 1}, - ContractAddresses: []string{ - contract.Hex(), - }, - } - }, - true, - }, - { - "2 fee infos registered for one contract wo/pagination", - func() { - req = &types.QueryDeployerRevenuesRequest{ - DeployerAddress: deployer.String(), - } - contract2 := utiltx.GenerateAddress() - revenue := types.NewRevenue(contract, deployer, withdraw) - suite.app.RevenueKeeper.SetRevenue(suite.ctx, revenue) - suite.app.RevenueKeeper.SetDeployerMap(suite.ctx, deployer, contract) - suite.app.RevenueKeeper.SetWithdrawerMap(suite.ctx, withdraw, contract) - - feeSplit2 := types.NewRevenue(contract2, deployer, nil) - suite.app.RevenueKeeper.SetRevenue(suite.ctx, feeSplit2) - suite.app.RevenueKeeper.SetDeployerMap(suite.ctx, deployer, contract2) - - expRes = &types.QueryDeployerRevenuesResponse{ - Pagination: &query.PageResponse{Total: 2}, - ContractAddresses: []string{ - contract.Hex(), - contract2.Hex(), - }, - } - }, - true, - }, - } - for _, tc := range testCases { - suite.Run(fmt.Sprintf("Case %s", tc.name), func() { - suite.SetupTest() // reset - - ctx := sdk.WrapSDKContext(suite.ctx) - tc.malleate() - - res, err := suite.queryClient.DeployerRevenues(ctx, req) - if tc.expPass { - suite.Require().NoError(err) - suite.Require().Equal(expRes.Pagination, res.Pagination) - suite.Require().ElementsMatch(expRes.ContractAddresses, res.ContractAddresses) - } else { - suite.Require().Error(err) - } - }) - } -} - -// Cases that cannot be tested in TestDeployerFees -func (suite *KeeperTestSuite) TestDeployerRevenueKeeper() { - suite.SetupTest() - ctx := sdk.WrapSDKContext(suite.ctx) - res, err := suite.app.RevenueKeeper.DeployerRevenues(ctx, nil) - suite.Require().Error(err) - suite.Require().Nil(res) -} - -func (suite *KeeperTestSuite) TestWithdrawerRevenues() { - var ( - req *types.QueryWithdrawerRevenuesRequest - expRes *types.QueryWithdrawerRevenuesResponse - ) - - testCases := []struct { - name string - malleate func() - expPass bool - }{ - { - "no contract registered", - func() { - req = &types.QueryWithdrawerRevenuesRequest{} - expRes = &types.QueryWithdrawerRevenuesResponse{Pagination: &query.PageResponse{}} - }, - false, - }, - { - "invalid withdraw address", - func() { - req = &types.QueryWithdrawerRevenuesRequest{ - WithdrawerAddress: "123", - } - expRes = &types.QueryWithdrawerRevenuesResponse{Pagination: &query.PageResponse{}} - }, - false, - }, - { - "1 fee registered w/pagination", - func() { - req = &types.QueryWithdrawerRevenuesRequest{ - Pagination: &query.PageRequest{Limit: 10, CountTotal: true}, - WithdrawerAddress: withdraw.String(), - } - - revenue := types.NewRevenue(contract, deployer, withdraw) - suite.app.RevenueKeeper.SetRevenue(suite.ctx, revenue) - suite.app.RevenueKeeper.SetDeployerMap(suite.ctx, deployer, contract) - suite.app.RevenueKeeper.SetWithdrawerMap(suite.ctx, withdraw, contract) - - expRes = &types.QueryWithdrawerRevenuesResponse{ - Pagination: &query.PageResponse{Total: 1}, - ContractAddresses: []string{ - contract.Hex(), - }, - } - }, - true, - }, - { - "2 fees registered for one withdraw address wo/pagination", - func() { - req = &types.QueryWithdrawerRevenuesRequest{ - WithdrawerAddress: withdraw.String(), - } - contract2 := utiltx.GenerateAddress() - deployer2 := sdk.AccAddress(utiltx.GenerateAddress().Bytes()) - - revenue := types.NewRevenue(contract, deployer, withdraw) - suite.app.RevenueKeeper.SetRevenue(suite.ctx, revenue) - suite.app.RevenueKeeper.SetDeployerMap(suite.ctx, deployer, contract) - suite.app.RevenueKeeper.SetWithdrawerMap(suite.ctx, withdraw, contract) - - feeSplit2 := types.NewRevenue(contract2, deployer2, withdraw) - suite.app.RevenueKeeper.SetRevenue(suite.ctx, feeSplit2) - suite.app.RevenueKeeper.SetDeployerMap(suite.ctx, deployer2, contract2) - suite.app.RevenueKeeper.SetWithdrawerMap(suite.ctx, withdraw, contract2) - - expRes = &types.QueryWithdrawerRevenuesResponse{ - Pagination: &query.PageResponse{Total: 2}, - ContractAddresses: []string{ - contract.Hex(), - contract2.Hex(), - }, - } - }, - true, - }, - } - for _, tc := range testCases { - suite.Run(fmt.Sprintf("Case %s", tc.name), func() { - suite.SetupTest() // reset - - ctx := sdk.WrapSDKContext(suite.ctx) - tc.malleate() - - res, err := suite.queryClient.WithdrawerRevenues(ctx, req) - if tc.expPass { - suite.Require().NoError(err) - suite.Require().Equal(expRes.Pagination, res.Pagination) - suite.Require().ElementsMatch(expRes.ContractAddresses, res.ContractAddresses) - } else { - suite.Require().Error(err) - } - }) - } -} - -// Cases that cannot be tested in TestWithdrawerFees -func (suite *KeeperTestSuite) TestWithdrawerRevenueKeeper() { - suite.SetupTest() - ctx := sdk.WrapSDKContext(suite.ctx) - res, err := suite.app.RevenueKeeper.WithdrawerRevenues(ctx, nil) - suite.Require().Error(err) - suite.Require().Nil(res) -} - -func (suite *KeeperTestSuite) TestQueryParams() { - ctx := sdk.WrapSDKContext(suite.ctx) - expParams := types.DefaultParams() - expParams.EnableRevenue = true - - res, err := suite.queryClient.Params(ctx, &types.QueryParamsRequest{}) - suite.Require().NoError(err) - suite.Require().Equal(expParams, res.Params) -} diff --git a/x/revenue/v1/keeper/integration_test.go b/x/revenue/v1/keeper/integration_test.go deleted file mode 100644 index c2bcf306e7..0000000000 --- a/x/revenue/v1/keeper/integration_test.go +++ /dev/null @@ -1,936 +0,0 @@ -package keeper_test - -import ( - "fmt" - "math" - "math/big" - "strings" - - "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/precompiles/staking" - - //nolint:revive // dot imports are fine for Ginkgo - . "github.com/onsi/ginkgo/v2" - //nolint:revive // dot imports are fine for Ginkgo - . "github.com/onsi/gomega" - - sdkmath "cosmossdk.io/math" - sdk "github.com/cosmos/cosmos-sdk/types" - ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" - "github.com/evmos/evmos/v16/testutil" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - "github.com/evmos/evmos/v16/x/revenue/v1/types" - - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" -) - -var contractCode = "600661000e60003960066000f300612222600055" - -// Uses CREATE opcode to deploy the above contract and emits -// log1(0, 0, contractAddress) -var factoryCode = "603061000e60003960306000f3007f600661000e60003960066000f300612222600055000000000000000000000000600052601460006000f060006000a1" - -// Creates the above factory -var doubleFactoryCode = "605461000e60003960546000f3007f603061000e60003960306000f3007f600661000e60003960066000f3006122226000527f600055000000000000000000000000600052601460006000f060006000a10000602052603e60006000f060006000a1" - -//nolint:goconst -var _ = Describe("Fee distribution:", Ordered, func() { - feeCollectorAddr := s.app.AccountKeeper.GetModuleAddress(authtypes.FeeCollectorName) - denom := s.denom - - // account initial balances - initAmount := sdkmath.NewInt(int64(math.Pow10(18) * 4)) - initBalance := sdk.NewCoins(sdk.NewCoin(denom, initAmount)) - - var ( - deployerKey *ethsecp256k1.PrivKey - userKey *ethsecp256k1.PrivKey - deployerAddress sdk.AccAddress - userAddress sdk.AccAddress - params types.Params - factoryAddress common.Address - factoryNonce uint64 - ) - - BeforeAll(func() { - s.SetupTest() - - params = s.app.RevenueKeeper.GetParams(s.ctx) - params.EnableRevenue = true - s.app.RevenueKeeper.SetParams(s.ctx, params) //nolint:errcheck - - // setup deployer account - deployerAddress, deployerKey = utiltx.NewAccAddressAndKey() - err := testutil.FundAccount(s.ctx, s.app.BankKeeper, deployerAddress, initBalance) - Expect(err).To(BeNil()) - - // setup account interacting with registered contracts - userAddress, userKey = utiltx.NewAccAddressAndKey() - err = testutil.FundAccount(s.ctx, s.app.BankKeeper, userAddress, initBalance) - Expect(err).To(BeNil()) - acc := s.app.AccountKeeper.NewAccountWithAddress(s.ctx, userAddress) - s.app.AccountKeeper.SetAccount(s.ctx, acc) - s.Commit() - - // deploy a factory - factoryNonce = getNonce(deployerAddress.Bytes()) - factoryAddress, err = testutil.DeployContract( - s.ctx, - s.app, - deployerKey, - s.queryClientEvm, - evmtypes.CompiledContract{ - Bin: common.Hex2Bytes(factoryCode), - }, - ) - s.Require().NoError(err) - s.Commit() - }) - - Context("with revenue param disabled", func() { - var registeredContract common.Address - - BeforeAll(func() { - // revenue registered before disabling params - var err error - nonce := getNonce(deployerAddress.Bytes()) - registeredContract, err = testutil.DeployContract( - s.ctx, - s.app, - deployerKey, - s.queryClientEvm, - evmtypes.CompiledContract{ - Bin: common.Hex2Bytes(contractCode), - }, - ) - s.Require().NoError(err) - s.Commit() - res := registerFee(deployerKey, ®isteredContract, nil, []uint64{nonce}) - Expect(res.IsOK()).To(Equal(true), "contract registration failed: "+res.GetLog()) - - fee, isRegistered := s.app.RevenueKeeper.GetRevenue(s.ctx, registeredContract) - Expect(isRegistered).To(Equal(true)) - Expect(fee.ContractAddress).To(Equal(registeredContract.Hex())) - Expect(fee.DeployerAddress).To(Equal(deployerAddress.String())) - Expect(fee.WithdrawerAddress).To(Equal("")) - s.Commit() - - // Disable revenue module - params = s.app.RevenueKeeper.GetParams(s.ctx) - params.EnableRevenue = false - s.app.RevenueKeeper.SetParams(s.ctx, params) //nolint:errcheck - }) - - It("should not allow new contract registrations", func() { - contractAddress, err := testutil.DeployContract( - s.ctx, - s.app, - deployerKey, - s.queryClientEvm, - evmtypes.CompiledContract{ - Bin: common.Hex2Bytes(contractCode), - }, - ) - s.Require().NoError(err) - s.Commit() - msg := types.NewMsgRegisterRevenue( - contractAddress, - deployerAddress, - withdraw, - []uint64{1}, - ) - - _, err = testutil.DeliverTx(s.ctx, s.app, deployerKey, nil, msg) - Expect(err).ToNot(BeNil(), "registration should have failed") - Expect( - strings.Contains(err.Error(), - "revenue module is disabled by governance"), - ).To(BeTrue()) - s.Commit() - - _, isRegistered := s.app.RevenueKeeper.GetRevenue(s.ctx, contractAddress) - Expect(isRegistered).To(Equal(false)) - }) - - It("should not distribute tx fees for previously registered contracts", func() { - preBalance := s.app.BankKeeper.GetBalance(s.ctx, deployerAddress, denom) - gasPrice := big.NewInt(2000000000) - data := make([]byte, 0) - contractInteract(userKey, ®isteredContract, gasPrice, nil, nil, data, nil) - s.Commit() - - balance := s.app.BankKeeper.GetBalance(s.ctx, deployerAddress, denom) - Expect(balance).To(Equal(preBalance)) - }) - - It("should not allow revenue updates for previously registered contracts", func() { - withdrawerAddress := sdk.AccAddress(utiltx.GenerateAddress().Bytes()) - msg := types.NewMsgUpdateRevenue( - registeredContract, - deployerAddress, - withdrawerAddress, - ) - _, err := testutil.DeliverTx(s.ctx, s.app, deployerKey, nil, msg) - Expect(err).ToNot(BeNil(), "update should have failed") - Expect( - strings.Contains(err.Error(), - "revenue module is disabled by governance"), - ).To(BeTrue()) - s.Commit() - }) - - It("should not allow cancellations of previously registered contracts", func() { - msg := types.NewMsgCancelRevenue(registeredContract, deployerAddress) - _, err := testutil.DeliverTx(s.ctx, s.app, deployerKey, nil, msg) - Expect(err).ToNot(BeNil(), "cancel should have failed") - Expect( - strings.Contains(err.Error(), - "revenue module is disabled by governance"), - ).To(BeTrue()) - s.Commit() - }) - }) - - Context("with revenue param enabled", func() { - BeforeEach(func() { - params = types.DefaultParams() - params.EnableRevenue = true - s.app.RevenueKeeper.SetParams(s.ctx, params) //nolint:errcheck - }) - - Describe("Registering a contract for receiving tx fees", func() { - Context("with an empty withdrawer address", Ordered, func() { - var contractAddress common.Address - var nonce uint64 - - BeforeAll(func() { - var err error - nonce = getNonce(deployerAddress.Bytes()) - contractAddress, err = testutil.DeployContract( - s.ctx, - s.app, - deployerKey, - s.queryClientEvm, - evmtypes.CompiledContract{ - Bin: common.Hex2Bytes(contractCode), - }, - ) - s.Require().NoError(err) - s.Commit() - }) - - It("should be possible", func() { - res := registerFee(deployerKey, &contractAddress, nil, []uint64{nonce}) - Expect(res.IsOK()).To(Equal(true), "contract registration failed: "+res.GetLog()) - - fee, isRegistered := s.app.RevenueKeeper.GetRevenue(s.ctx, contractAddress) - Expect(isRegistered).To(Equal(true)) - Expect(fee.ContractAddress).To(Equal(contractAddress.Hex())) - Expect(fee.DeployerAddress).To(Equal(deployerAddress.String())) - Expect(fee.WithdrawerAddress).To(Equal("")) - s.Commit() - }) - - It("should result in sending the tx fees to the deployer address", func() { - preBalance := s.app.BankKeeper.GetBalance(s.ctx, deployerAddress, denom) - gasPrice := big.NewInt(2000000000) - data := make([]byte, 0) - res := contractInteract(userKey, &contractAddress, gasPrice, nil, nil, data, nil) - s.Commit() - - developerCoins, _ := calculateFees(denom, params, res, gasPrice) - balance := s.app.BankKeeper.GetBalance(s.ctx, deployerAddress, denom) - Expect(developerCoins.IsPositive()).To(BeTrue()) - Expect(balance).To(Equal(preBalance.Add(developerCoins))) - }) - }) - - Context("with a withdrawer address equal to the deployer address", func() { - It("should be possible", func() { - nonce := getNonce(deployerAddress.Bytes()) - contractAddress, err := testutil.DeployContract( - s.ctx, - s.app, - deployerKey, - s.queryClientEvm, - evmtypes.CompiledContract{ - Bin: common.Hex2Bytes(contractCode), - }, - ) - s.Require().NoError(err) - s.Commit() - res := registerFee(deployerKey, &contractAddress, deployerAddress, []uint64{nonce}) - Expect(res.IsOK()).To(BeTrue()) - - _, isRegistered := s.app.RevenueKeeper.GetRevenue(s.ctx, contractAddress) - Expect(isRegistered).To(BeTrue()) - s.Commit() - }) - }) - - Context("with an empty withdrawer address", func() { - It("should be possible", func() { - nonce := getNonce(deployerAddress.Bytes()) - contractAddress, err := testutil.DeployContract( - s.ctx, - s.app, - deployerKey, - s.queryClientEvm, - evmtypes.CompiledContract{ - Bin: common.Hex2Bytes(contractCode), - }, - ) - s.Require().NoError(err) - s.Commit() - res := registerFee(deployerKey, &contractAddress, nil, []uint64{nonce}) - Expect(res.IsOK()).To(Equal(true), "contract registration failed: "+res.GetLog()) - - fee, isRegistered := s.app.RevenueKeeper.GetRevenue(s.ctx, contractAddress) - Expect(isRegistered).To(Equal(true)) - Expect(fee.ContractAddress).To(Equal(contractAddress.Hex())) - Expect(fee.DeployerAddress).To(Equal(deployerAddress.String())) - Expect(fee.WithdrawerAddress).To(Equal("")) - s.Commit() - }) - }) - - Context("with a withdrawer address different than deployer", Ordered, func() { - var withdrawerAddress sdk.AccAddress - var contractAddress common.Address - var nonce uint64 - - BeforeAll(func() { - var err error - nonce = getNonce(deployerAddress.Bytes()) - contractAddress, err = testutil.DeployContract( - s.ctx, - s.app, - deployerKey, - s.queryClientEvm, - evmtypes.CompiledContract{ - Bin: common.Hex2Bytes(contractCode), - }, - ) - s.Require().NoError(err) - s.Commit() - withdrawerAddress = sdk.AccAddress(utiltx.GenerateAddress().Bytes()) - }) - - It("should be possible", func() { - res := registerFee(deployerKey, &contractAddress, withdrawerAddress, []uint64{nonce}) - Expect(res.IsOK()).To(Equal(true), "contract registration failed: "+res.GetLog()) - - registerEvent := res.GetEvents()[8] - Expect(registerEvent.Attributes[2].Value).ToNot(Equal(deployerAddress.String())) - - fee, isRegistered := s.app.RevenueKeeper.GetRevenue(s.ctx, contractAddress) - Expect(isRegistered).To(Equal(true)) - Expect(fee.ContractAddress).To(Equal(contractAddress.Hex())) - Expect(fee.DeployerAddress).To(Equal(deployerAddress.String())) - Expect(fee.WithdrawerAddress).To(Equal(withdrawerAddress.String())) - }) - - It("should send the fees to the withdraw address", func() { - preBalance := s.app.BankKeeper.GetBalance(s.ctx, withdrawerAddress, denom) - gasPrice := big.NewInt(2000000000) - data := make([]byte, 0) - res := contractInteract(userKey, &contractAddress, gasPrice, nil, nil, data, nil) - s.Commit() - - developerCoins, _ := calculateFees(denom, params, res, gasPrice) - balance := s.app.BankKeeper.GetBalance(s.ctx, withdrawerAddress, denom) - Expect(developerCoins.IsPositive()).To(BeTrue()) - Expect(balance).To(Equal(preBalance.Add(developerCoins))) - }) - }) - }) - - Describe("Interacting with a registered revenue contract", func() { - var contractAddress common.Address - var nonce uint64 - - BeforeAll(func() { - var err error - nonce = getNonce(deployerAddress.Bytes()) - contractAddress, err = testutil.DeployContract( - s.ctx, - s.app, - deployerKey, - s.queryClientEvm, - evmtypes.CompiledContract{ - Bin: common.Hex2Bytes(contractCode), - }, - ) - s.Require().NoError(err) - s.Commit() - res := registerFee(deployerKey, &contractAddress, nil, []uint64{nonce}) - Expect(res.IsOK()).To(Equal(true), "contract registration failed: "+res.GetLog()) - }) - - Context("with a 50/50 validators-developers revenue", func() { - BeforeEach(func() { - params = s.app.RevenueKeeper.GetParams(s.ctx) - params.DeveloperShares = sdkmath.LegacyNewDecWithPrec(50, 2) - s.app.RevenueKeeper.SetParams(s.ctx, params) //nolint:errcheck - }) - - It("should transfer legacy tx fees to validators and contract developer evenly", func() { - preFeeColectorBalance := s.app.BankKeeper.GetBalance(s.ctx, feeCollectorAddr, denom) - preBalance := s.app.BankKeeper.GetBalance(s.ctx, deployerAddress, denom) - gasPrice := big.NewInt(2000000000) - data := make([]byte, 0) - res := contractInteract(userKey, &contractAddress, gasPrice, nil, nil, data, nil) - - developerCoins, validatorCoins := calculateFees(denom, params, res, gasPrice) - feeColectorBalance := s.app.BankKeeper.GetBalance(s.ctx, feeCollectorAddr, denom) - balance := s.app.BankKeeper.GetBalance(s.ctx, deployerAddress, denom) - - Expect(balance).To(Equal(preBalance.Add(developerCoins))) - Expect(feeColectorBalance).To(Equal( - preFeeColectorBalance.Add(validatorCoins), - )) - s.Commit() - }) - - It("should transfer dynamic tx fees to validators and contract developer evenly", func() { - preFeeColectorBalance := s.app.BankKeeper.GetBalance(s.ctx, feeCollectorAddr, denom) - preBalance := s.app.BankKeeper.GetBalance(s.ctx, deployerAddress, denom) - gasTipCap := big.NewInt(10000) - gasFeeCap := new(big.Int).Add(s.app.FeeMarketKeeper.GetBaseFee(s.ctx), gasTipCap) - data := make([]byte, 0) - res := contractInteract( - userKey, - &contractAddress, - nil, - gasFeeCap, - gasTipCap, - data, - ðtypes.AccessList{}, - ) - - developerCoins, validatorCoins := calculateFees(denom, params, res, gasFeeCap) - feeColectorBalance := s.app.BankKeeper.GetBalance(s.ctx, feeCollectorAddr, denom) - balance := s.app.BankKeeper.GetBalance(s.ctx, deployerAddress, denom) - Expect(balance).To(Equal(preBalance.Add(developerCoins))) - Expect(feeColectorBalance).To(Equal(preFeeColectorBalance.Add(validatorCoins))) - s.Commit() - }) - }) - - Context("with a 100/0 validators-developers revenue", func() { - BeforeEach(func() { - params = s.app.RevenueKeeper.GetParams(s.ctx) - params.DeveloperShares = sdkmath.LegacyNewDec(0) - s.app.RevenueKeeper.SetParams(s.ctx, params) //nolint:errcheck - }) - - It("should transfer all tx fees to validators", func() { - preFeeColectorBalance := s.app.BankKeeper.GetBalance(s.ctx, feeCollectorAddr, denom) - preBalance := s.app.BankKeeper.GetBalance(s.ctx, deployerAddress, denom) - gasTipCap := big.NewInt(10000) - gasFeeCap := new(big.Int).Add(s.app.FeeMarketKeeper.GetBaseFee(s.ctx), gasTipCap) - data := make([]byte, 0) - res := contractInteract( - userKey, - &contractAddress, - nil, - gasFeeCap, - gasTipCap, - data, - ðtypes.AccessList{}, - ) - - _, validatorCoins := calculateFees(denom, params, res, gasFeeCap) - feeColectorBalance := s.app.BankKeeper.GetBalance(s.ctx, feeCollectorAddr, denom) - balance := s.app.BankKeeper.GetBalance(s.ctx, deployerAddress, denom) - Expect(balance).To(Equal(preBalance)) - Expect(feeColectorBalance).To(Equal(preFeeColectorBalance.Add(validatorCoins))) - s.Commit() - }) - }) - - Context("with a 0/100 validators-developers revenue", func() { - BeforeEach(func() { - params = s.app.RevenueKeeper.GetParams(s.ctx) - params.DeveloperShares = sdkmath.LegacyNewDec(1) - s.app.RevenueKeeper.SetParams(s.ctx, params) //nolint:errcheck - }) - - It("should transfer all tx fees to developers", func() { - preFeeColectorBalance := s.app.BankKeeper.GetBalance(s.ctx, feeCollectorAddr, denom) - preBalance := s.app.BankKeeper.GetBalance(s.ctx, deployerAddress, denom) - gasTipCap := big.NewInt(10000) - gasFeeCap := new(big.Int).Add(s.app.FeeMarketKeeper.GetBaseFee(s.ctx), gasTipCap) - data := make([]byte, 0) - res := contractInteract( - userKey, - &contractAddress, - nil, - gasFeeCap, - gasTipCap, - data, - ðtypes.AccessList{}, - ) - - developerCoins, _ := calculateFees(denom, params, res, gasFeeCap) - feeColectorBalance := s.app.BankKeeper.GetBalance(s.ctx, feeCollectorAddr, denom) - balance := s.app.BankKeeper.GetBalance(s.ctx, deployerAddress, denom) - Expect(balance).To(Equal(preBalance.Add(developerCoins))) - Expect(feeColectorBalance).To(Equal(preFeeColectorBalance)) - s.Commit() - }) - }) - }) - - Describe("Funding community pool from precompiled contract calls", func() { - Context("calling a precompiled registered contract with 100/0 community pool revenue", func() { - var params types.Params - - BeforeEach(func() { - params = s.app.RevenueKeeper.GetParams(s.ctx) - params.DeveloperShares = sdkmath.LegacyNewDec(1) - err := s.app.RevenueKeeper.SetParams(s.ctx, params) - if err != nil { - fmt.Println(err) - return - } - }) - - It("should transfer all tx fees to the community pool", func() { - communityPoolBefore := s.app.DistrKeeper.GetFeePoolCommunityCoins(s.ctx) - contractAddress := common.HexToAddress("0x0000000000000000000000000000000000000800") - gasTipCap := big.NewInt(100000) - gasFeeCap := new(big.Int).Add(s.app.FeeMarketKeeper.GetBaseFee(s.ctx), gasTipCap) - stakingPrecompile := s.app.EvmKeeper.Precompiles(contractAddress)[contractAddress].(*staking.Precompile) - data, err := stakingPrecompile.ABI.Pack("delegate", common.BytesToAddress(userAddress), s.validator.OperatorAddress, big.NewInt(1e18)) - Expect(err).To(BeNil()) - res := contractInteract( - userKey, - &contractAddress, - nil, - gasFeeCap, - gasTipCap, - data, - ðtypes.AccessList{}, - ) - Expect(res.IsOK()).To(BeTrue()) - communityCoins, _ := calculateFees(denom, params, res, gasFeeCap) - communityCoinsDec := sdk.NewDecCoinFromCoin(communityCoins) - communityPoolAfter := s.app.DistrKeeper.GetFeePoolCommunityCoins(s.ctx) - Expect(communityPoolAfter).To(Equal(communityPoolBefore.Add(communityCoinsDec))) - s.Commit() - }) - }) - }) - - Describe("Updating registered revenue", func() { - Context("with a withdraw address that is different from the deployer address", Ordered, func() { - var withdrawerAddress sdk.AccAddress - var contractAddress common.Address - var nonce uint64 - - BeforeAll(func() { - var err error - nonce = getNonce(deployerAddress.Bytes()) - withdrawerAddress = sdk.AccAddress(utiltx.GenerateAddress().Bytes()) - contractAddress, err = testutil.DeployContract( - s.ctx, - s.app, - deployerKey, - s.queryClientEvm, - evmtypes.CompiledContract{ - Bin: common.Hex2Bytes(contractCode), - }, - ) - s.Require().NoError(err) - s.Commit() - res := registerFee(deployerKey, &contractAddress, nil, []uint64{nonce}) - Expect(res.IsOK()).To(Equal(true), "contract registration failed: "+res.GetLog()) - - fee, isRegistered := s.app.RevenueKeeper.GetRevenue(s.ctx, contractAddress) - Expect(isRegistered).To(Equal(true)) - Expect(fee.ContractAddress).To(Equal(contractAddress.Hex())) - Expect(fee.DeployerAddress).To(Equal(deployerAddress.String())) - Expect(fee.WithdrawerAddress).To(Equal("")) - }) - - It("should update revenue successfully", func() { - msg := types.NewMsgUpdateRevenue( - contractAddress, - deployerAddress, - withdrawerAddress, - ) - - res, err := testutil.DeliverTx(s.ctx, s.app, deployerKey, nil, msg) - Expect(err).To(BeNil()) - Expect(res.IsOK()).To( - Equal(true), - "withdraw update failed: "+res.GetLog(), - ) - s.Commit() - - fee, isRegistered := s.app.RevenueKeeper.GetRevenue(s.ctx, contractAddress) - Expect(isRegistered).To(Equal(true)) - Expect(fee.ContractAddress).To(Equal(contractAddress.Hex())) - Expect(fee.DeployerAddress).To(Equal(deployerAddress.String())) - Expect(fee.WithdrawerAddress).To(Equal(withdrawerAddress.String())) - s.Commit() - }) - - It("should send tx fees to the new withdraw address", func() { - preBalanceD := s.app.BankKeeper.GetBalance(s.ctx, deployerAddress, denom) - preBalanceW := s.app.BankKeeper.GetBalance(s.ctx, withdrawerAddress, denom) - gasPrice := big.NewInt(2000000000) - data := make([]byte, 0) - res := contractInteract(userKey, &contractAddress, gasPrice, nil, nil, data, nil) - s.Commit() - - developerCoins, _ := calculateFees(denom, params, res, gasPrice) - balanceD := s.app.BankKeeper.GetBalance(s.ctx, deployerAddress, denom) - balanceW := s.app.BankKeeper.GetBalance(s.ctx, withdrawerAddress, denom) - Expect(balanceW).To(Equal(preBalanceW.Add(developerCoins))) - Expect(balanceD).To(Equal(preBalanceD)) - }) - }) - - Context("with a withdraw address equal to the deployer's address", func() { - var contractAddress common.Address - var nonce uint64 - - BeforeAll(func() { - var err error - nonce = getNonce(deployerAddress.Bytes()) - contractAddress, err = testutil.DeployContract( - s.ctx, - s.app, - deployerKey, - s.queryClientEvm, - evmtypes.CompiledContract{ - Bin: common.Hex2Bytes(contractCode), - }, - ) - s.Require().NoError(err) - s.Commit() - res := registerFee(deployerKey, &contractAddress, nil, []uint64{nonce}) - Expect(res.IsOK()).To(Equal(true), "contract registration failed: "+res.GetLog()) - - fee, isRegistered := s.app.RevenueKeeper.GetRevenue(s.ctx, contractAddress) - Expect(isRegistered).To(Equal(true)) - Expect(fee.ContractAddress).To(Equal(contractAddress.Hex())) - Expect(fee.DeployerAddress).To(Equal(deployerAddress.String())) - Expect(fee.WithdrawerAddress).To(Equal("")) - }) - - It("should not update revenue", func() { - msg := types.NewMsgUpdateRevenue( - contractAddress, - deployerAddress, - deployerAddress, - ) - - res, err := testutil.DeliverTx(s.ctx, s.app, deployerKey, nil, msg) - Expect(err).NotTo( - BeNil(), - "withdraw update failed: "+res.GetLog(), - ) - Expect( - strings.Contains(err.Error(), - "revenue already exists for given contract"), - ).To(BeTrue(), err.Error()) - s.Commit() - }) - }) - - Context("for a contract that was not registered", func() { - It("should fail", func() { - contractAddress := utiltx.GenerateAddress() - withdrawerAddress := sdk.AccAddress(utiltx.GenerateAddress().Bytes()) - msg := types.NewMsgUpdateRevenue( - contractAddress, - deployerAddress, - withdrawerAddress, - ) - - res, err := testutil.DeliverTx(s.ctx, s.app, deployerKey, nil, msg) - Expect(err).ToNot( - BeNil(), - "withdraw update failed: "+res.GetLog(), - ) - Expect( - strings.Contains(err.Error(), - "is not registered"), - ).To(BeTrue(), err.Error()) - s.Commit() - }) - }) - }) - - Describe("Canceling a revenue registration", func() { - When("the registered revenue exists", Ordered, func() { - var contractAddress common.Address - var nonce uint64 - - BeforeAll(func() { - var err error - nonce = getNonce(deployerAddress.Bytes()) - contractAddress, err = testutil.DeployContract( - s.ctx, - s.app, - deployerKey, - s.queryClientEvm, - evmtypes.CompiledContract{ - Bin: common.Hex2Bytes(contractCode), - }, - ) - s.Require().NoError(err) - s.Commit() - registerFee(deployerKey, &contractAddress, nil, []uint64{nonce}) - fee, isRegistered := s.app.RevenueKeeper.GetRevenue(s.ctx, contractAddress) - - Expect(isRegistered).To(Equal(true)) - Expect(fee.ContractAddress).To(Equal(contractAddress.Hex())) - Expect(fee.DeployerAddress).To(Equal(deployerAddress.String())) - Expect(fee.WithdrawerAddress).To(Equal("")) - }) - - It("should be possible", func() { - msg := types.NewMsgCancelRevenue(contractAddress, deployerAddress) - res, err := testutil.DeliverTx(s.ctx, s.app, deployerKey, nil, msg) - Expect(err).To(BeNil()) - Expect(res.IsOK()).To(Equal(true), "withdraw update failed: "+res.GetLog()) - s.Commit() - - fee, isRegistered := s.app.RevenueKeeper.GetRevenue(s.ctx, contractAddress) - Expect(isRegistered).To(Equal(false)) - Expect(fee.ContractAddress).To(Equal("")) - Expect(fee.DeployerAddress).To(Equal("")) - Expect(fee.WithdrawerAddress).To(Equal("")) - s.Commit() - }) - - It("should no longer distribute fees to the contract deployer", func() { - preBalanceD := s.app.BankKeeper.GetBalance(s.ctx, deployerAddress, denom) - gasPrice := big.NewInt(2000000000) - data := make([]byte, 0) - contractInteract(userKey, &contractAddress, gasPrice, nil, nil, data, nil) - s.Commit() - - balanceD := s.app.BankKeeper.GetBalance(s.ctx, deployerAddress, denom) - Expect(balanceD).To(Equal(preBalanceD)) - }) - }) - - When("the revenue does not exist", func() { - It("should not be possible", func() { - contractAddress := utiltx.GenerateAddress() - msg := types.NewMsgCancelRevenue(contractAddress, deployerAddress) - res, err := testutil.DeliverTx(s.ctx, s.app, deployerKey, nil, msg) - Expect(err).ToNot( - BeNil(), - "canceling failed: "+res.GetLog(), - ) - Expect( - strings.Contains(err.Error(), - "is not registered"), - ).To(BeTrue(), err.Error()) - s.Commit() - }) - }) - }) - - Describe("Registering contracts created by a factory contract with CREATE opcode", func() { - Context("with one factory", Ordered, func() { - var contractNonce uint64 - var contractAddress common.Address - - BeforeAll(func() { - var err error - contractNonce = getNonce(factoryAddress.Bytes()) - contractAddress, _, err = testutil.DeployContractWithFactory( - s.ctx, - s.app, - deployerKey, - factoryAddress, - ) - Expect(err).To(BeNil()) - s.Commit() - }) - - It("should be possible", func() { - msg := types.NewMsgRegisterRevenue( - contractAddress, - deployerAddress, - nil, - []uint64{factoryNonce, contractNonce}, - ) - res, err := testutil.DeliverTx(s.ctx, s.app, deployerKey, nil, msg) - Expect(err).To(BeNil()) - Expect(res.IsOK()).To(Equal(true), "contract registration failed: "+res.GetLog()) - s.Commit() - - fee, isRegistered := s.app.RevenueKeeper.GetRevenue(s.ctx, contractAddress) - Expect(isRegistered).To(Equal(true)) - Expect(fee.ContractAddress).To(Equal(contractAddress.Hex())) - Expect(fee.DeployerAddress).To(Equal(deployerAddress.String())) - Expect(fee.WithdrawerAddress).To(Equal("")) - }) - - It("should transfer legacy tx fees evenly to validator and deployer", func() { - preBalance := s.app.BankKeeper.GetBalance(s.ctx, deployerAddress, denom) - - // User interaction with registered contract - gasPrice := big.NewInt(2000000000) - data := make([]byte, 0) - res := contractInteract(userKey, &contractAddress, gasPrice, nil, nil, data, nil) - - developerCoins, _ := calculateFees(denom, params, res, gasPrice) - balance := s.app.BankKeeper.GetBalance(s.ctx, deployerAddress, denom) - Expect(balance).To(Equal(preBalance.Add(developerCoins))) - s.Commit() - }) - - It("should transfer dynamic tx fees evenly to validator and deployer", func() { - preBalance := s.app.BankKeeper.GetBalance(s.ctx, deployerAddress, denom) - - // User interaction with registered contract - gasTipCap := big.NewInt(10000) - gasFeeCap := new(big.Int).Add(s.app.FeeMarketKeeper.GetBaseFee(s.ctx), gasTipCap) - data := make([]byte, 0) - res := contractInteract( - userKey, - &contractAddress, - nil, - gasFeeCap, - gasTipCap, - data, - ðtypes.AccessList{}, - ) - - developerCoins, _ := calculateFees(denom, params, res, gasFeeCap) - balance := s.app.BankKeeper.GetBalance(s.ctx, deployerAddress, denom) - Expect(balance).To(Equal(preBalance.Add(developerCoins))) - s.Commit() - }) - }) - - Context("With factory-created factory contract", func() { - var ( - gasUsedOneDerivation int64 - factory1Nonce uint64 - factory2Nonce uint64 - contractNonce uint64 - factory1Address common.Address - factory2Address common.Address - contractAddress common.Address - ) - deployerAddress1, deployerKey1 := utiltx.NewAccAddressAndKey() - deployerAddress2, deployerKey2 := utiltx.NewAccAddressAndKey() - - BeforeEach(func() { - err := testutil.FundAccount(s.ctx, s.app.BankKeeper, deployerAddress1, initBalance) - s.Require().NoError(err) - err = testutil.FundAccount(s.ctx, s.app.BankKeeper, deployerAddress2, initBalance) - s.Require().NoError(err) - - // Create contract: deployerKey1 -> factory1 -> factory2 -> contract - // Create factory1 - factory1Nonce = getNonce(deployerAddress1.Bytes()) - factory1Address, err = testutil.DeployContract( - s.ctx, - s.app, - deployerKey1, - s.queryClientEvm, - evmtypes.CompiledContract{ - Bin: common.Hex2Bytes(doubleFactoryCode), - }, - ) - s.Require().NoError(err) - s.Commit() - - // Create factory2 - factory2Nonce = getNonce(factory1Address.Bytes()) - factory2Address, _, err = testutil.DeployContractWithFactory( - s.ctx, - s.app, - deployerKey1, - factory1Address, - ) - Expect(err).To(BeNil()) - s.Commit() - - // Create contract - contractNonce = getNonce(factory2Address.Bytes()) - contractAddress, _, err = testutil.DeployContractWithFactory( - s.ctx, - s.app, - deployerKey1, - factory2Address, - ) - Expect(err).To(BeNil()) - s.Commit() - }) - - DescribeTable("should consume gas for three address derivation iterations", - func(gasCost int) { - params = s.app.RevenueKeeper.GetParams(s.ctx) - params.AddrDerivationCostCreate = uint64(gasCost) - s.app.RevenueKeeper.SetParams(s.ctx, params) //nolint:errcheck - - // Cost for registration with one address derivation - // We use another deployer, to have the same storage cost for - // SetDeployerFees - factory1Nonce2 := getNonce(deployerAddress2.Bytes()) - factory1Address2, err := testutil.DeployContract( - s.ctx, - s.app, - deployerKey2, - s.queryClientEvm, - evmtypes.CompiledContract{ - Bin: common.Hex2Bytes(doubleFactoryCode), - }, - ) - s.Require().NoError(err) - s.Commit() - res := registerFee( - deployerKey2, - &factory1Address2, - nil, - []uint64{factory1Nonce2}, - ) - gasUsedOneDerivation = res.GetGasUsed() - Expect(res.IsOK()).To(Equal(true), "contract registration failed: "+res.GetLog()) - - s.Commit() - - // Registering contract for receiving fees - // Use a new deployer, to pay the same storage costs for SetDeployerFees - res = registerFee( - deployerKey1, - &contractAddress, - nil, - []uint64{factory1Nonce, factory2Nonce, contractNonce}, - ) - Expect(res.IsOK()).To(Equal(true), "contract registration failed: "+res.GetLog()) - s.Commit() - - fee, isRegistered := s.app.RevenueKeeper.GetRevenue(s.ctx, contractAddress) - Expect(isRegistered).To(Equal(true)) - Expect(fee.ContractAddress).To(Equal(contractAddress.Hex())) - Expect(fee.DeployerAddress).To(Equal(deployerAddress1.String())) - Expect(fee.WithdrawerAddress).To(Equal("")) - - // Check addressDerivationCostCreate is subtracted 3 times - setFeeInverseCost := int64(20) - Expect(res.GetGasUsed()).To(Equal( - gasUsedOneDerivation + int64(gasCost)*2 + setFeeInverseCost, - )) - }, - Entry("with address derivation cost of 50", 50), - Entry("with address derivation cost of 500", 500), - ) - }) - }) - }) -}) diff --git a/x/revenue/v1/keeper/keeper.go b/x/revenue/v1/keeper/keeper.go deleted file mode 100644 index 1971cbac40..0000000000 --- a/x/revenue/v1/keeper/keeper.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:LGPL-3.0-only - -package keeper - -import ( - "fmt" - - "github.com/cometbft/cometbft/libs/log" - "github.com/cosmos/cosmos-sdk/codec" - storetypes "github.com/cosmos/cosmos-sdk/store/types" - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/evmos/evmos/v16/x/revenue/v1/types" -) - -// Keeper of this module maintains collections of revenues for contracts -// registered to receive transaction fees. -type Keeper struct { - storeKey storetypes.StoreKey - cdc codec.BinaryCodec - // the address capable of executing a MsgUpdateParams message. Typically, this should be the x/gov module account. - authority sdk.AccAddress - bankKeeper types.BankKeeper - evmKeeper types.EVMKeeper - accountKeeper types.AccountKeeper - distributionKeeper types.DistributionKeeper - feeCollectorName string -} - -// NewKeeper creates new instances of the fees Keeper -func NewKeeper( - storeKey storetypes.StoreKey, - cdc codec.BinaryCodec, - authority sdk.AccAddress, - bk types.BankKeeper, - dk types.DistributionKeeper, - ak types.AccountKeeper, - evmKeeper types.EVMKeeper, - feeCollector string, -) Keeper { - return Keeper{ - storeKey: storeKey, - cdc: cdc, - authority: authority, - bankKeeper: bk, - distributionKeeper: dk, - evmKeeper: evmKeeper, - accountKeeper: ak, - feeCollectorName: feeCollector, - } -} - -// Logger returns a module-specific logger. -func (k Keeper) Logger(ctx sdk.Context) log.Logger { - return ctx.Logger().With("module", fmt.Sprintf("x/%s", types.ModuleName)) -} diff --git a/x/revenue/v1/keeper/migrations.go b/x/revenue/v1/keeper/migrations.go deleted file mode 100644 index ef29dcb845..0000000000 --- a/x/revenue/v1/keeper/migrations.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:LGPL-3.0-only - -package keeper - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - v2 "github.com/evmos/evmos/v16/x/revenue/v1/migrations/v2" - "github.com/evmos/evmos/v16/x/revenue/v1/types" -) - -// Migrator is a struct for handling in-place store migrations. -type Migrator struct { - keeper Keeper - legacySubspace types.Subspace -} - -// NewMigrator returns a new Migrator. -func NewMigrator(keeper Keeper, legacySubspace types.Subspace) Migrator { - return Migrator{ - keeper: keeper, - legacySubspace: legacySubspace, - } -} - -// Migrate1to2 migrates the store from consensus version 1 to 2 -func (m Migrator) Migrate1to2(ctx sdk.Context) error { - return v2.MigrateStore(ctx, m.keeper.storeKey, m.legacySubspace, m.keeper.cdc) -} diff --git a/x/revenue/v1/keeper/msg_server.go b/x/revenue/v1/keeper/msg_server.go deleted file mode 100644 index 997f931e26..0000000000 --- a/x/revenue/v1/keeper/msg_server.go +++ /dev/null @@ -1,283 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:LGPL-3.0-only - -package keeper - -import ( - "context" - - errorsmod "cosmossdk.io/errors" - sdk "github.com/cosmos/cosmos-sdk/types" - errortypes "github.com/cosmos/cosmos-sdk/types/errors" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - - "github.com/evmos/evmos/v16/x/revenue/v1/types" -) - -var _ types.MsgServer = &Keeper{} - -// RegisterRevenue registers a contract to receive transaction fees -func (k Keeper) RegisterRevenue( - goCtx context.Context, - msg *types.MsgRegisterRevenue, -) (*types.MsgRegisterRevenueResponse, error) { - ctx := sdk.UnwrapSDKContext(goCtx) - - params := k.GetParams(ctx) - if !params.EnableRevenue { - return nil, types.ErrRevenueDisabled - } - - contract := common.HexToAddress(msg.ContractAddress) - - if k.IsRevenueRegistered(ctx, contract) { - return nil, errorsmod.Wrapf( - types.ErrRevenueAlreadyRegistered, - "contract is already registered %s", contract, - ) - } - - deployer := sdk.MustAccAddressFromBech32(msg.DeployerAddress) - deployerAccount := k.evmKeeper.GetAccountWithoutBalance(ctx, common.BytesToAddress(deployer)) - if deployerAccount == nil { - return nil, errorsmod.Wrapf( - errortypes.ErrNotFound, - "deployer account not found %s", msg.DeployerAddress, - ) - } - - if deployerAccount.IsContract() { - return nil, errorsmod.Wrapf( - types.ErrRevenueDeployerIsNotEOA, - "deployer cannot be a contract %s", msg.DeployerAddress, - ) - } - - // contract must already be deployed, to avoid spam registrations - contractAccount := k.evmKeeper.GetAccountWithoutBalance(ctx, contract) - - if contractAccount == nil || !contractAccount.IsContract() { - return nil, errorsmod.Wrapf( - types.ErrRevenueNoContractDeployed, - "no contract code found at address %s", msg.ContractAddress, - ) - } - - var withdrawer sdk.AccAddress - if msg.WithdrawerAddress != "" && msg.WithdrawerAddress != msg.DeployerAddress { - withdrawer = sdk.MustAccAddressFromBech32(msg.WithdrawerAddress) - } - - derivedContract := common.BytesToAddress(deployer) - - // the contract can be directly deployed by an EOA or created through one - // or more factory contracts. If it was deployed by an EOA account, then - // msg.Nonces contains the EOA nonce for the deployment transaction. - // If it was deployed by one or more factories, msg.Nonces contains the EOA - // nonce for the origin factory contract, then the nonce of the factory - // for the creation of the next factory/contract. - for _, nonce := range msg.Nonces { - ctx.GasMeter().ConsumeGas( - params.AddrDerivationCostCreate, - "revenue registration: address derivation CREATE opcode", - ) - - derivedContract = crypto.CreateAddress(derivedContract, nonce) - } - - if contract != derivedContract { - return nil, errorsmod.Wrapf( - errortypes.ErrorInvalidSigner, - "not contract deployer or wrong nonce: expected %s instead of %s", - derivedContract, msg.ContractAddress, - ) - } - - // prevent storing the same address for deployer and withdrawer - revenue := types.NewRevenue(contract, deployer, withdrawer) - k.SetRevenue(ctx, revenue) - k.SetDeployerMap(ctx, deployer, contract) - - // The effective withdrawer is the withdraw address that is stored after the - // revenue registration is completed. It defaults to the deployer address if - // the withdraw address in the msg is omitted. When omitted, the withdraw map - // dosn't need to be set. - effectiveWithdrawer := msg.DeployerAddress - - if len(withdrawer) != 0 { - k.SetWithdrawerMap(ctx, withdrawer, contract) - effectiveWithdrawer = msg.WithdrawerAddress - } - - k.Logger(ctx).Debug( - "registering contract for transaction fees", - "contract", msg.ContractAddress, "deployer", msg.DeployerAddress, - "withdraw", effectiveWithdrawer, - ) - - ctx.EventManager().EmitEvents( - sdk.Events{ - sdk.NewEvent( - types.EventTypeRegisterRevenue, - sdk.NewAttribute(sdk.AttributeKeySender, msg.DeployerAddress), - sdk.NewAttribute(types.AttributeKeyContract, msg.ContractAddress), - sdk.NewAttribute(types.AttributeKeyWithdrawerAddress, effectiveWithdrawer), - ), - }, - ) - - return &types.MsgRegisterRevenueResponse{}, nil -} - -// UpdateRevenue updates the withdraw address of a given Revenue. If the given -// withdraw address is empty or the same as the deployer address, the withdraw -// address is removed. -func (k Keeper) UpdateRevenue( - goCtx context.Context, - msg *types.MsgUpdateRevenue, -) (*types.MsgUpdateRevenueResponse, error) { - ctx := sdk.UnwrapSDKContext(goCtx) - - params := k.GetParams(ctx) - if !params.EnableRevenue { - return nil, types.ErrRevenueDisabled - } - - contract := common.HexToAddress(msg.ContractAddress) - revenue, found := k.GetRevenue(ctx, contract) - if !found { - return nil, errorsmod.Wrapf( - types.ErrRevenueContractNotRegistered, - "contract %s is not registered", msg.ContractAddress, - ) - } - - // error if the msg deployer address is not the same as the fee's deployer - if msg.DeployerAddress != revenue.DeployerAddress { - return nil, errorsmod.Wrapf( - errortypes.ErrUnauthorized, - "%s is not the contract deployer", msg.DeployerAddress, - ) - } - - // check if updating revenue to default withdrawer - if msg.WithdrawerAddress == revenue.DeployerAddress { - msg.WithdrawerAddress = "" - } - - // revenue with the given withdraw address is already registered - if msg.WithdrawerAddress == revenue.WithdrawerAddress { - return nil, errorsmod.Wrapf( - types.ErrRevenueAlreadyRegistered, - "revenue with withdraw address %s", msg.WithdrawerAddress, - ) - } - - // only delete withdrawer map if is not default - if revenue.WithdrawerAddress != "" { - k.DeleteWithdrawerMap(ctx, sdk.MustAccAddressFromBech32(revenue.WithdrawerAddress), contract) - } - - // only add withdrawer map if new entry is not default - if msg.WithdrawerAddress != "" { - k.SetWithdrawerMap( - ctx, - sdk.MustAccAddressFromBech32(msg.WithdrawerAddress), - contract, - ) - } - // update revenue - revenue.WithdrawerAddress = msg.WithdrawerAddress - k.SetRevenue(ctx, revenue) - - ctx.EventManager().EmitEvents( - sdk.Events{ - sdk.NewEvent( - types.EventTypeUpdateRevenue, - sdk.NewAttribute(types.AttributeKeyContract, msg.ContractAddress), - sdk.NewAttribute(sdk.AttributeKeySender, msg.DeployerAddress), - sdk.NewAttribute(types.AttributeKeyWithdrawerAddress, msg.WithdrawerAddress), - ), - }, - ) - - return &types.MsgUpdateRevenueResponse{}, nil -} - -// CancelRevenue deletes the Revenue for a given contract -func (k Keeper) CancelRevenue( - goCtx context.Context, - msg *types.MsgCancelRevenue, -) (*types.MsgCancelRevenueResponse, error) { - ctx := sdk.UnwrapSDKContext(goCtx) - - params := k.GetParams(ctx) - if !params.EnableRevenue { - return nil, types.ErrRevenueDisabled - } - - contract := common.HexToAddress(msg.ContractAddress) - - fee, found := k.GetRevenue(ctx, contract) - if !found { - return nil, errorsmod.Wrapf( - types.ErrRevenueContractNotRegistered, - "contract %s is not registered", msg.ContractAddress, - ) - } - - if msg.DeployerAddress != fee.DeployerAddress { - return nil, errorsmod.Wrapf( - errortypes.ErrUnauthorized, - "%s is not the contract deployer", msg.DeployerAddress, - ) - } - - k.DeleteRevenue(ctx, fee) - k.DeleteDeployerMap( - ctx, - fee.GetDeployerAddr(), - contract, - ) - - // delete entry from withdrawer map if not default - if fee.WithdrawerAddress != "" { - k.DeleteWithdrawerMap( - ctx, - fee.GetWithdrawerAddr(), - contract, - ) - } - - ctx.EventManager().EmitEvents( - sdk.Events{ - sdk.NewEvent( - types.EventTypeCancelRevenue, - sdk.NewAttribute(sdk.AttributeKeySender, msg.DeployerAddress), - sdk.NewAttribute(types.AttributeKeyContract, msg.ContractAddress), - ), - }, - ) - - return &types.MsgCancelRevenueResponse{}, nil -} - -// UpdateParams implements the gRPC MsgServer interface. When an UpdateParams -// proposal passes, it updates the module parameters. The update can only be -// performed if the requested authority is the Cosmos SDK governance module -// account. -func (k *Keeper) UpdateParams(goCtx context.Context, req *types.MsgUpdateParams) (*types.MsgUpdateParamsResponse, error) { - if k.authority.String() != req.Authority { - return nil, errorsmod.Wrapf(govtypes.ErrInvalidSigner, "invalid authority; expected %s, got %s", k.authority.String(), req.Authority) - } - - ctx := sdk.UnwrapSDKContext(goCtx) - if err := k.SetParams(ctx, req.Params); err != nil { - return nil, err - } - - return &types.MsgUpdateParamsResponse{}, nil -} diff --git a/x/revenue/v1/keeper/msg_server_test.go b/x/revenue/v1/keeper/msg_server_test.go deleted file mode 100644 index 94e719f976..0000000000 --- a/x/revenue/v1/keeper/msg_server_test.go +++ /dev/null @@ -1,668 +0,0 @@ -package keeper_test - -import ( - "fmt" - "math/big" - - sdk "github.com/cosmos/cosmos-sdk/types" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - - utiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/x/evm/statedb" - "github.com/evmos/evmos/v16/x/revenue/v1/types" -) - -func (suite *KeeperTestSuite) TestRegisterRevenue() { - deployer := utiltx.GenerateAddress() - fakeDeployer := utiltx.GenerateAddress() - contract1 := crypto.CreateAddress(deployer, 1) - factory1 := contract1 - factory2 := crypto.CreateAddress(factory1, 0) - codeHash := common.Hex2Bytes("fa98cd094c09bb300de0037ba34e94f569b145ce8baa36ed863a08d7b7433f8d") - contractAccount := statedb.Account{ - Nonce: 1, - Balance: big.NewInt(0), - CodeHash: codeHash, - } - deployerAccount := statedb.Account{ - Balance: big.NewInt(0), - CodeHash: crypto.Keccak256(nil), - } - - testCases := []struct { - name string - deployer sdk.AccAddress - withdraw sdk.AccAddress - contract common.Address - nonces []uint64 - malleate func() - expPass bool - errorMessage string - }{ - { - "ok - contract deployed by EOA", - sdk.AccAddress(deployer.Bytes()), - sdk.AccAddress(deployer.Bytes()), - contract1, - []uint64{1}, - func() { - // set deployer and contract accounts - err := s.app.EvmKeeper.SetAccount(s.ctx, deployer, deployerAccount) - s.Require().NoError(err) - err = s.app.EvmKeeper.SetAccount(s.ctx, contract1, contractAccount) - s.Require().NoError(err) - }, - true, - "", - }, - { - "ok - contract deployed by factory in factory", - sdk.AccAddress(deployer.Bytes()), - sdk.AccAddress(deployer.Bytes()), - crypto.CreateAddress(factory2, 1), - []uint64{1, 0, 1}, - func() { - // set deployer and contract accounts - err := s.app.EvmKeeper.SetAccount(s.ctx, deployer, deployerAccount) - s.Require().NoError(err) - err = s.app.EvmKeeper.SetAccount(s.ctx, crypto.CreateAddress(factory2, 1), contractAccount) - s.Require().NoError(err) - }, - true, - "", - }, - { - "ok - omit withdraw address, it is stored as empty string", - sdk.AccAddress(deployer.Bytes()), - nil, - contract1, - []uint64{1}, - func() { - // set deployer and contract accounts - err := s.app.EvmKeeper.SetAccount(s.ctx, deployer, deployerAccount) - s.Require().NoError(err) - err = s.app.EvmKeeper.SetAccount(s.ctx, contract1, contractAccount) - s.Require().NoError(err) - }, - true, - "", - }, - { - "ok - deployer == withdraw, withdraw is stored as empty string", - sdk.AccAddress(deployer.Bytes()), - sdk.AccAddress(deployer.Bytes()), - contract1, - []uint64{1}, - func() { - // set deployer and contract accounts - err := s.app.EvmKeeper.SetAccount(s.ctx, deployer, deployerAccount) - s.Require().NoError(err) - err = s.app.EvmKeeper.SetAccount(s.ctx, contract1, contractAccount) - s.Require().NoError(err) - }, - true, - "", - }, - { - "not ok - deployer account not found", - sdk.AccAddress(deployer.Bytes()), - sdk.AccAddress(deployer.Bytes()), - contract1, - []uint64{1}, - func() { - // set only contract account - err := s.app.EvmKeeper.SetAccount(s.ctx, contract1, contractAccount) - s.Require().NoError(err) - }, - false, - "deployer account not found", - }, - { - "not ok - deployer cannot be a contract", - sdk.AccAddress(contract1.Bytes()), - sdk.AccAddress(contract1.Bytes()), - contract1, - []uint64{1}, - func() { - // set contract account - err := s.app.EvmKeeper.SetAccount(s.ctx, contract1, contractAccount) - s.Require().NoError(err) - }, - false, - "deployer cannot be a contract", - }, - { - "not ok - contract is already registered", - sdk.AccAddress(deployer.Bytes()), - sdk.AccAddress(deployer.Bytes()), - contract1, - []uint64{1}, - func() { - // set deployer and contract accounts - err := s.app.EvmKeeper.SetAccount(s.ctx, deployer, deployerAccount) - s.Require().NoError(err) - err = s.app.EvmKeeper.SetAccount(s.ctx, contract1, contractAccount) - s.Require().NoError(err) - msg := types.NewMsgRegisterRevenue( - contract1, - sdk.AccAddress(deployer.Bytes()), - sdk.AccAddress(deployer.Bytes()), - []uint64{1}, - ) - ctx := sdk.WrapSDKContext(suite.ctx) - suite.app.RevenueKeeper.RegisterRevenue(ctx, msg) //nolint:errcheck - }, - false, - types.ErrRevenueAlreadyRegistered.Error(), - }, - { - "not ok - not contract deployer", - sdk.AccAddress(fakeDeployer.Bytes()), - sdk.AccAddress(deployer.Bytes()), - contract1, - []uint64{1}, - func() { - // set deployer, fakeDeployer and contract accounts - err := s.app.EvmKeeper.SetAccount(s.ctx, deployer, deployerAccount) - s.Require().NoError(err) - err = s.app.EvmKeeper.SetAccount(s.ctx, fakeDeployer, deployerAccount) - s.Require().NoError(err) - err = s.app.EvmKeeper.SetAccount(s.ctx, contract1, contractAccount) - s.Require().NoError(err) - }, - false, - "not contract deployer", - }, - { - "not ok - contract not deployed", - sdk.AccAddress(deployer.Bytes()), - sdk.AccAddress(deployer.Bytes()), - contract1, - []uint64{1}, - func() { - // set deployer account - err := s.app.EvmKeeper.SetAccount(s.ctx, deployer, deployerAccount) - s.Require().NoError(err) - }, - false, - "no contract code found at address", - }, - } - for _, tc := range testCases { - suite.Run(fmt.Sprintf("Case %s", tc.name), func() { - suite.SetupTest() - tc.malleate() - - ctx := sdk.WrapSDKContext(suite.ctx) - msg := types.NewMsgRegisterRevenue(tc.contract, tc.deployer, tc.withdraw, tc.nonces) - - res, err := suite.app.RevenueKeeper.RegisterRevenue(ctx, msg) - expRes := &types.MsgRegisterRevenueResponse{} - suite.Commit() - - if tc.expPass { - suite.Require().NoError(err, tc.name) - suite.Require().Equal(expRes, res, tc.name) - - revenue, ok := suite.app.RevenueKeeper.GetRevenue(suite.ctx, tc.contract) - suite.Require().True(ok, "unregistered revenue") - suite.Require().Equal(tc.contract.String(), revenue.ContractAddress, "wrong contract") - suite.Require().Equal(tc.deployer.String(), revenue.DeployerAddress, "wrong deployer") - if tc.withdraw.String() != tc.deployer.String() { - suite.Require().Equal(tc.withdraw.String(), revenue.WithdrawerAddress, "wrong withdraw address") - } else { - suite.Require().Equal("", revenue.WithdrawerAddress, "wrong withdraw address") - } - } else { - suite.Require().Error(err, tc.name) - suite.Require().Contains(err.Error(), tc.errorMessage) - } - }) - } -} - -func (suite *KeeperTestSuite) TestUpdateRevenue() { - deployer := utiltx.GenerateAddress() - deployerAddr := sdk.AccAddress(deployer.Bytes()) - withdrawer := sdk.AccAddress(utiltx.GenerateAddress().Bytes()) - newWithdrawer := sdk.AccAddress(utiltx.GenerateAddress().Bytes()) - contract1 := crypto.CreateAddress(deployer, 1) - codeHash := common.Hex2Bytes("fa98cd094c09bb300de0037ba34e94f569b145ce8baa36ed863a08d7b7433f8d") - contractAccount := statedb.Account{ - Nonce: 1, - Balance: big.NewInt(0), - CodeHash: codeHash, - } - deployerAccount := statedb.Account{ - Balance: big.NewInt(0), - CodeHash: crypto.Keccak256(nil), - } - testCases := []struct { - name string - deployer sdk.AccAddress - withdraw sdk.AccAddress - newWithdrawer sdk.AccAddress - contract common.Address - nonces []uint64 - malleate func() - expPass bool - errorMessage string - }{ - { - "ok - change withdrawer to deployer", - deployerAddr, - withdrawer, - deployerAddr, - contract1, - []uint64{1}, - func() { - err := s.app.EvmKeeper.SetAccount(s.ctx, deployer, deployerAccount) - s.Require().NoError(err) - err = s.app.EvmKeeper.SetAccount(s.ctx, contract1, contractAccount) - s.Require().NoError(err) - - // Prepare - ctx := sdk.WrapSDKContext(suite.ctx) - msg := types.NewMsgRegisterRevenue(contract1, deployerAddr, withdrawer, []uint64{1}) - - _, err = suite.app.RevenueKeeper.RegisterRevenue(ctx, msg) - suite.Require().NoError(err) - suite.Commit() - }, - true, - "", - }, - { - "ok - change withdrawer to newWithdrawer", - deployerAddr, - withdrawer, - newWithdrawer, - contract1, - []uint64{1}, - func() { - err := s.app.EvmKeeper.SetAccount(s.ctx, deployer, deployerAccount) - s.Require().NoError(err) - err = s.app.EvmKeeper.SetAccount(s.ctx, contract1, contractAccount) - s.Require().NoError(err) - - // Prepare - ctx := sdk.WrapSDKContext(suite.ctx) - msg := types.NewMsgRegisterRevenue(contract1, deployerAddr, withdrawer, []uint64{1}) - - _, err = suite.app.RevenueKeeper.RegisterRevenue(ctx, msg) - suite.Require().NoError(err) - suite.Commit() - }, - true, - "", - }, - { - "fail - revenue disabled", - deployerAddr, - withdrawer, - newWithdrawer, - contract1, - []uint64{1}, - func() { - err := s.app.EvmKeeper.SetAccount(s.ctx, deployer, deployerAccount) - s.Require().NoError(err) - err = s.app.EvmKeeper.SetAccount(s.ctx, contract1, contractAccount) - s.Require().NoError(err) - - // register contract - ctx := sdk.WrapSDKContext(suite.ctx) - msg := types.NewMsgRegisterRevenue(contract1, deployerAddr, withdrawer, []uint64{1}) - _, err = suite.app.RevenueKeeper.RegisterRevenue(ctx, msg) - suite.Require().NoError(err) - suite.Commit() - - params := types.DefaultParams() - params.EnableRevenue = false - suite.app.RevenueKeeper.SetParams(suite.ctx, params) //nolint:errcheck - }, - false, - "", - }, - { - "fail - contract not registered", - deployerAddr, - withdrawer, - newWithdrawer, - contract1, - []uint64{1}, - func() { - err := s.app.EvmKeeper.SetAccount(s.ctx, deployer, deployerAccount) - s.Require().NoError(err) - err = s.app.EvmKeeper.SetAccount(s.ctx, contract1, contractAccount) - s.Require().NoError(err) - }, - false, - "", - }, - { - "fail - deployer not the one registered", - newWithdrawer, - withdrawer, - newWithdrawer, - contract1, - []uint64{1}, - func() { - err := s.app.EvmKeeper.SetAccount(s.ctx, deployer, deployerAccount) - s.Require().NoError(err) - err = s.app.EvmKeeper.SetAccount(s.ctx, contract1, contractAccount) - s.Require().NoError(err) - - // register contract - ctx := sdk.WrapSDKContext(suite.ctx) - msg := types.NewMsgRegisterRevenue(contract1, deployerAddr, withdrawer, []uint64{1}) - _, err = suite.app.RevenueKeeper.RegisterRevenue(ctx, msg) - suite.Require().NoError(err) - suite.Commit() - }, - false, - "", - }, - { - "fail - everything is the same", - deployerAddr, - withdrawer, - withdrawer, - contract1, - []uint64{1}, - func() { - err := s.app.EvmKeeper.SetAccount(s.ctx, deployer, deployerAccount) - s.Require().NoError(err) - err = s.app.EvmKeeper.SetAccount(s.ctx, contract1, contractAccount) - s.Require().NoError(err) - - // register contract - ctx := sdk.WrapSDKContext(suite.ctx) - msg := types.NewMsgRegisterRevenue(contract1, deployerAddr, withdrawer, []uint64{1}) - _, err = suite.app.RevenueKeeper.RegisterRevenue(ctx, msg) - suite.Require().NoError(err) - suite.Commit() - }, - false, - "", - }, - { - "fail - previously canceled contract", - deployerAddr, - withdrawer, - withdrawer, - contract1, - []uint64{1}, - func() { - err := s.app.EvmKeeper.SetAccount(s.ctx, deployer, deployerAccount) - s.Require().NoError(err) - err = s.app.EvmKeeper.SetAccount(s.ctx, contract1, contractAccount) - s.Require().NoError(err) - - // register contract - ctx := sdk.WrapSDKContext(suite.ctx) - msg := types.NewMsgRegisterRevenue(contract1, deployerAddr, withdrawer, []uint64{1}) - _, err = suite.app.RevenueKeeper.RegisterRevenue(ctx, msg) - suite.Require().NoError(err) - suite.Commit() - - msgCancel := types.NewMsgCancelRevenue(contract1, deployerAddr) - _, err = suite.app.RevenueKeeper.CancelRevenue(ctx, msgCancel) - suite.Require().NoError(err) - suite.Commit() - }, - false, - "", - }, - } - for _, tc := range testCases { - suite.Run(fmt.Sprintf("Case %s", tc.name), func() { - suite.SetupTest() - - tc.malleate() - - msgUpdate := types.NewMsgUpdateRevenue(tc.contract, tc.deployer, tc.newWithdrawer) - - ctx := sdk.WrapSDKContext(suite.ctx) - res, err := suite.app.RevenueKeeper.UpdateRevenue(ctx, msgUpdate) - expRes := &types.MsgUpdateRevenueResponse{} - suite.Commit() - - if tc.expPass { - suite.Require().NoError(err, tc.name) - suite.Require().Equal(expRes, res, tc.name) - - revenue, ok := suite.app.RevenueKeeper.GetRevenue(suite.ctx, tc.contract) - suite.Require().True(ok, "unregistered revenue") - suite.Require().Equal(tc.contract.String(), revenue.ContractAddress, "wrong contract") - suite.Require().Equal(tc.deployer.String(), revenue.DeployerAddress, "wrong deployer") - - found := suite.app.RevenueKeeper.IsWithdrawerMapSet(suite.ctx, tc.withdraw, tc.contract) - suite.Require().False(found) - if tc.newWithdrawer.String() != tc.deployer.String() { - suite.Require().Equal(tc.newWithdrawer.String(), revenue.WithdrawerAddress, "wrong withdraw address") - found := suite.app.RevenueKeeper.IsWithdrawerMapSet(suite.ctx, tc.newWithdrawer, tc.contract) - suite.Require().True(found) - } else { - suite.Require().Equal("", revenue.WithdrawerAddress, "wrong withdraw address") - found := suite.app.RevenueKeeper.IsWithdrawerMapSet(suite.ctx, tc.newWithdrawer, tc.contract) - suite.Require().False(found) - } - } else { - suite.Require().Error(err, tc.name) - suite.Require().Contains(err.Error(), tc.errorMessage) - } - }) - } -} - -func (suite *KeeperTestSuite) TestCancelRevenue() { - deployer := utiltx.GenerateAddress() - deployerAddr := sdk.AccAddress(deployer.Bytes()) - withdrawer := sdk.AccAddress(utiltx.GenerateAddress().Bytes()) - fakeDeployer := sdk.AccAddress(utiltx.GenerateAddress().Bytes()) - contract1 := crypto.CreateAddress(deployer, 1) - codeHash := common.Hex2Bytes("fa98cd094c09bb300de0037ba34e94f569b145ce8baa36ed863a08d7b7433f8d") - contractAccount := statedb.Account{ - Nonce: 1, - Balance: big.NewInt(0), - CodeHash: codeHash, - } - deployerAccount := statedb.Account{ - Balance: big.NewInt(0), - CodeHash: crypto.Keccak256(nil), - } - testCases := []struct { - name string - deployer sdk.AccAddress - contract common.Address - nonces []uint64 - malleate func() - expPass bool - errorMessage string - }{ - { - "ok - canceled", - deployerAddr, - contract1, - []uint64{1}, - func() { - err := s.app.EvmKeeper.SetAccount(s.ctx, deployer, deployerAccount) - s.Require().NoError(err) - err = s.app.EvmKeeper.SetAccount(s.ctx, contract1, contractAccount) - s.Require().NoError(err) - - // Prepare - ctx := sdk.WrapSDKContext(suite.ctx) - msg := types.NewMsgRegisterRevenue(contract1, deployerAddr, withdrawer, []uint64{1}) - - _, err = suite.app.RevenueKeeper.RegisterRevenue(ctx, msg) - suite.Require().NoError(err) - suite.Commit() - }, - true, - "", - }, - { - "ok - canceled - no withdrawer", - deployerAddr, - contract1, - []uint64{1}, - func() { - err := s.app.EvmKeeper.SetAccount(s.ctx, deployer, deployerAccount) - s.Require().NoError(err) - err = s.app.EvmKeeper.SetAccount(s.ctx, contract1, contractAccount) - s.Require().NoError(err) - - // Prepare - ctx := sdk.WrapSDKContext(suite.ctx) - msg := types.NewMsgRegisterRevenue(contract1, deployerAddr, deployerAddr, []uint64{1}) - - _, err = suite.app.RevenueKeeper.RegisterRevenue(ctx, msg) - suite.Require().NoError(err) - suite.Commit() - }, - true, - "", - }, - { - "fail - revenue disabled", - deployerAddr, - contract1, - []uint64{1}, - func() { - err := s.app.EvmKeeper.SetAccount(s.ctx, deployer, deployerAccount) - s.Require().NoError(err) - err = s.app.EvmKeeper.SetAccount(s.ctx, contract1, contractAccount) - s.Require().NoError(err) - - // register contract - ctx := sdk.WrapSDKContext(suite.ctx) - msg := types.NewMsgRegisterRevenue(contract1, deployerAddr, withdrawer, []uint64{1}) - _, err = suite.app.RevenueKeeper.RegisterRevenue(ctx, msg) - suite.Require().NoError(err) - suite.Commit() - - params := types.DefaultParams() - params.EnableRevenue = false - suite.app.RevenueKeeper.SetParams(suite.ctx, params) //nolint:errcheck - }, - false, - "", - }, - { - "fail - contract not registered", - deployerAddr, - contract1, - []uint64{1}, - func() { - err := s.app.EvmKeeper.SetAccount(s.ctx, deployer, deployerAccount) - s.Require().NoError(err) - err = s.app.EvmKeeper.SetAccount(s.ctx, contract1, contractAccount) - s.Require().NoError(err) - }, - false, - "", - }, - { - "fail - deployer not the one registered", - fakeDeployer, - contract1, - []uint64{1}, - func() { - err := s.app.EvmKeeper.SetAccount(s.ctx, deployer, deployerAccount) - s.Require().NoError(err) - err = s.app.EvmKeeper.SetAccount(s.ctx, contract1, contractAccount) - s.Require().NoError(err) - - // register contract - ctx := sdk.WrapSDKContext(suite.ctx) - msg := types.NewMsgRegisterRevenue(contract1, deployerAddr, withdrawer, []uint64{1}) - _, err = suite.app.RevenueKeeper.RegisterRevenue(ctx, msg) - suite.Require().NoError(err) - suite.Commit() - }, - false, - "", - }, - { - "fail - everything is the same", - deployerAddr, - contract1, - []uint64{1}, - func() { - err := s.app.EvmKeeper.SetAccount(s.ctx, deployer, deployerAccount) - s.Require().NoError(err) - err = s.app.EvmKeeper.SetAccount(s.ctx, contract1, contractAccount) - s.Require().NoError(err) - }, - false, - "", - }, - } - for _, tc := range testCases { - suite.Run(fmt.Sprintf("Case %s", tc.name), func() { - suite.SetupTest() - - tc.malleate() - - msgCancel := types.NewMsgCancelRevenue(tc.contract, tc.deployer) - - ctx := sdk.WrapSDKContext(suite.ctx) - res, err := suite.app.RevenueKeeper.CancelRevenue(ctx, msgCancel) - expRes := &types.MsgCancelRevenueResponse{} - suite.Commit() - - if tc.expPass { - suite.Require().NoError(err, tc.name) - suite.Require().Equal(expRes, res, tc.name) - - _, ok := suite.app.RevenueKeeper.GetRevenue(suite.ctx, tc.contract) - suite.Require().False(ok, "registered revenue") - - found := suite.app.RevenueKeeper.IsWithdrawerMapSet(suite.ctx, withdrawer, tc.contract) - suite.Require().False(found) - } else { - suite.Require().Error(err, tc.name) - suite.Require().Contains(err.Error(), tc.errorMessage) - } - }) - } -} - -func (suite *KeeperTestSuite) TestUpdateParams() { - testCases := []struct { - name string - request *types.MsgUpdateParams - expectErr bool - }{ - { - name: "fail - invalid authority", - request: &types.MsgUpdateParams{Authority: "foobar"}, - expectErr: true, - }, - { - name: "pass - valid Update msg", - request: &types.MsgUpdateParams{ - Authority: authtypes.NewModuleAddress(govtypes.ModuleName).String(), - Params: types.DefaultParams(), - }, - expectErr: false, - }, - } - - for _, tc := range testCases { - tc := tc - suite.Run("MsgUpdateParams", func() { - _, err := suite.app.RevenueKeeper.UpdateParams(suite.ctx, tc.request) - if tc.expectErr { - suite.Require().Error(err) - } else { - suite.Require().NoError(err) - } - }) - } -} diff --git a/x/revenue/v1/keeper/params.go b/x/revenue/v1/keeper/params.go deleted file mode 100644 index b67224a9ba..0000000000 --- a/x/revenue/v1/keeper/params.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:LGPL-3.0-only - -package keeper - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/evmos/evmos/v16/x/revenue/v1/types" -) - -// GetParams returns the total set of revenue parameters. -func (k Keeper) GetParams(ctx sdk.Context) (params types.Params) { - store := ctx.KVStore(k.storeKey) - bz := store.Get(types.ParamsKey) - if bz == nil { - return params - } - - k.cdc.MustUnmarshal(bz, ¶ms) - return params -} - -// SetParams sets the revenue params in a single key -func (k Keeper) SetParams(ctx sdk.Context, params types.Params) error { - store := ctx.KVStore(k.storeKey) - bz, err := k.cdc.Marshal(¶ms) - if err != nil { - return err - } - - store.Set(types.ParamsKey, bz) - - return nil -} diff --git a/x/revenue/v1/keeper/params_test.go b/x/revenue/v1/keeper/params_test.go deleted file mode 100644 index 871d872365..0000000000 --- a/x/revenue/v1/keeper/params_test.go +++ /dev/null @@ -1,14 +0,0 @@ -package keeper_test - -import "github.com/evmos/evmos/v16/x/revenue/v1/types" - -func (suite *KeeperTestSuite) TestParams() { - params := suite.app.RevenueKeeper.GetParams(suite.ctx) - params.EnableRevenue = true - suite.Require().Equal(types.DefaultParams(), params) - params.EnableRevenue = false - err := suite.app.RevenueKeeper.SetParams(suite.ctx, params) - suite.Require().NoError(err) - newParams := suite.app.RevenueKeeper.GetParams(suite.ctx) - suite.Require().Equal(newParams, params) -} diff --git a/x/revenue/v1/keeper/revenues.go b/x/revenue/v1/keeper/revenues.go deleted file mode 100644 index 7577c4be61..0000000000 --- a/x/revenue/v1/keeper/revenues.go +++ /dev/null @@ -1,160 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:LGPL-3.0-only - -package keeper - -import ( - "github.com/cosmos/cosmos-sdk/store/prefix" - storetypes "github.com/cosmos/cosmos-sdk/store/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/ethereum/go-ethereum/common" - - "github.com/evmos/evmos/v16/x/revenue/v1/types" -) - -// GetRevenues returns all registered Revenues. -func (k Keeper) GetRevenues(ctx sdk.Context) []types.Revenue { - revenues := []types.Revenue{} - - store := ctx.KVStore(k.storeKey) - iterator := storetypes.KVStorePrefixIterator(store, types.KeyPrefixRevenue) - defer iterator.Close() - - for ; iterator.Valid(); iterator.Next() { - var revenue types.Revenue - k.cdc.MustUnmarshal(iterator.Value(), &revenue) - - revenues = append(revenues, revenue) - } - - return revenues -} - -// IterateRevenues iterates over all registered contracts and performs a -// callback with the corresponding Revenue. -func (k Keeper) IterateRevenues( - ctx sdk.Context, - handlerFn func(fee types.Revenue) (stop bool), -) { - store := ctx.KVStore(k.storeKey) - iterator := storetypes.KVStorePrefixIterator(store, types.KeyPrefixRevenue) - defer iterator.Close() - - for ; iterator.Valid(); iterator.Next() { - var revenue types.Revenue - k.cdc.MustUnmarshal(iterator.Value(), &revenue) - - if handlerFn(revenue) { - break - } - } -} - -// GetRevenue returns the Revenue for a registered contract -func (k Keeper) GetRevenue( - ctx sdk.Context, - contract common.Address, -) (types.Revenue, bool) { - store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefixRevenue) - bz := store.Get(contract.Bytes()) - if len(bz) == 0 { - return types.Revenue{}, false - } - - var revenue types.Revenue - k.cdc.MustUnmarshal(bz, &revenue) - return revenue, true -} - -// SetRevenue stores the Revenue for a registered contract. -func (k Keeper) SetRevenue(ctx sdk.Context, revenue types.Revenue) { - store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefixRevenue) - key := revenue.GetContractAddr() - bz := k.cdc.MustMarshal(&revenue) - store.Set(key.Bytes(), bz) -} - -// DeleteRevenue deletes a Revenue of a registered contract. -func (k Keeper) DeleteRevenue(ctx sdk.Context, fee types.Revenue) { - store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefixRevenue) - key := fee.GetContractAddr() - store.Delete(key.Bytes()) -} - -// SetDeployerMap stores a contract-by-deployer mapping -func (k Keeper) SetDeployerMap( - ctx sdk.Context, - deployer sdk.AccAddress, - contract common.Address, -) { - store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefixDeployer) - key := append(deployer.Bytes(), contract.Bytes()...) - store.Set(key, []byte{1}) -} - -// DeleteDeployerMap deletes a contract-by-deployer mapping -func (k Keeper) DeleteDeployerMap( - ctx sdk.Context, - deployer sdk.AccAddress, - contract common.Address, -) { - store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefixDeployer) - key := append(deployer.Bytes(), contract.Bytes()...) - store.Delete(key) -} - -// SetWithdrawerMap stores a contract-by-withdrawer mapping -func (k Keeper) SetWithdrawerMap( - ctx sdk.Context, - withdrawer sdk.AccAddress, - contract common.Address, -) { - store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefixWithdrawer) - key := append(withdrawer.Bytes(), contract.Bytes()...) - store.Set(key, []byte{1}) -} - -// DeleteWithdrawMap deletes a contract-by-withdrawer mapping -func (k Keeper) DeleteWithdrawerMap( - ctx sdk.Context, - withdrawer sdk.AccAddress, - contract common.Address, -) { - store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefixWithdrawer) - key := append(withdrawer.Bytes(), contract.Bytes()...) - store.Delete(key) -} - -// IsRevenueRegistered checks if a contract was registered for receiving -// transaction fees -func (k Keeper) IsRevenueRegistered( - ctx sdk.Context, - contract common.Address, -) bool { - store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefixRevenue) - return store.Has(contract.Bytes()) -} - -// IsDeployerMapSet checks if a given contract-by-withdrawer mapping is set in -// store -func (k Keeper) IsDeployerMapSet( - ctx sdk.Context, - deployer sdk.AccAddress, - contract common.Address, -) bool { - store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefixDeployer) - key := append(deployer.Bytes(), contract.Bytes()...) - return store.Has(key) -} - -// IsWithdrawerMapSet checks if a giveb contract-by-withdrawer mapping is set in -// store -func (k Keeper) IsWithdrawerMapSet( - ctx sdk.Context, - withdrawer sdk.AccAddress, - contract common.Address, -) bool { - store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefixWithdrawer) - key := append(withdrawer.Bytes(), contract.Bytes()...) - return store.Has(key) -} diff --git a/x/revenue/v1/keeper/revenues_test.go b/x/revenue/v1/keeper/revenues_test.go deleted file mode 100644 index 9160817e03..0000000000 --- a/x/revenue/v1/keeper/revenues_test.go +++ /dev/null @@ -1,338 +0,0 @@ -package keeper_test - -import ( - "fmt" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/ethereum/go-ethereum/common" - - utiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/x/revenue/v1/types" -) - -func (suite *KeeperTestSuite) TestGetFees() { - var expRes []types.Revenue - - testCases := []struct { - name string - malleate func() - }{ - { - "no revenues registered", - func() { expRes = []types.Revenue{} }, - }, - { - "one revenue registered with withdraw address", - func() { - revenue := types.NewRevenue(contract, deployer, withdraw) - suite.app.RevenueKeeper.SetRevenue(suite.ctx, revenue) - expRes = []types.Revenue{revenue} - }, - }, - { - "one revenue registered with no withdraw address", - func() { - revenue := types.NewRevenue(contract, deployer, nil) - suite.app.RevenueKeeper.SetRevenue(suite.ctx, revenue) - expRes = []types.Revenue{revenue} - }, - }, - { - "multiple revenues registered", - func() { - deployer2 := sdk.AccAddress(utiltx.GenerateAddress().Bytes()) - contract2 := utiltx.GenerateAddress() - contract3 := utiltx.GenerateAddress() - revenue := types.NewRevenue(contract, deployer, withdraw) - feeSplit2 := types.NewRevenue(contract2, deployer, nil) - feeSplit3 := types.NewRevenue(contract3, deployer2, nil) - suite.app.RevenueKeeper.SetRevenue(suite.ctx, revenue) - suite.app.RevenueKeeper.SetRevenue(suite.ctx, feeSplit2) - suite.app.RevenueKeeper.SetRevenue(suite.ctx, feeSplit3) - expRes = []types.Revenue{revenue, feeSplit2, feeSplit3} - }, - }, - } - for _, tc := range testCases { - suite.Run(fmt.Sprintf("Case %s", tc.name), func() { - suite.SetupTest() // reset - tc.malleate() - - res := suite.app.RevenueKeeper.GetRevenues(suite.ctx) - suite.Require().ElementsMatch(expRes, res, tc.name) - }) - } -} - -func (suite *KeeperTestSuite) TestIterateFees() { - var expRes []types.Revenue - - testCases := []struct { - name string - malleate func() - }{ - { - "no revenues registered", - func() { expRes = []types.Revenue{} }, - }, - { - "one revenue registered with withdraw address", - func() { - revenue := types.NewRevenue(contract, deployer, withdraw) - suite.app.RevenueKeeper.SetRevenue(suite.ctx, revenue) - expRes = []types.Revenue{ - types.NewRevenue(contract, deployer, withdraw), - } - }, - }, - { - "one revenue registered with no withdraw address", - func() { - revenue := types.NewRevenue(contract, deployer, nil) - suite.app.RevenueKeeper.SetRevenue(suite.ctx, revenue) - expRes = []types.Revenue{ - types.NewRevenue(contract, deployer, nil), - } - }, - }, - { - "multiple revenues registered", - func() { - deployer2 := sdk.AccAddress(utiltx.GenerateAddress().Bytes()) - contract2 := utiltx.GenerateAddress() - contract3 := utiltx.GenerateAddress() - revenue := types.NewRevenue(contract, deployer, withdraw) - feeSplit2 := types.NewRevenue(contract2, deployer, nil) - feeSplit3 := types.NewRevenue(contract3, deployer2, nil) - suite.app.RevenueKeeper.SetRevenue(suite.ctx, revenue) - suite.app.RevenueKeeper.SetRevenue(suite.ctx, feeSplit2) - suite.app.RevenueKeeper.SetRevenue(suite.ctx, feeSplit3) - expRes = []types.Revenue{revenue, feeSplit2, feeSplit3} - }, - }, - } - for _, tc := range testCases { - suite.Run(fmt.Sprintf("Case %s", tc.name), func() { - suite.SetupTest() // reset - tc.malleate() - - suite.app.RevenueKeeper.IterateRevenues(suite.ctx, func(revenue types.Revenue) (stop bool) { - suite.Require().Contains(expRes, revenue, tc.name) - return false - }) - }) - } -} - -func (suite *KeeperTestSuite) TestGetRevenue() { - testCases := []struct { - name string - contract common.Address - deployer sdk.AccAddress - withdraw sdk.AccAddress - found bool - expWithdraw bool - }{ - { - "fee with no withdraw address", - contract, - deployer, - nil, - true, - false, - }, - { - "fee with withdraw address same as deployer", - contract, - deployer, - deployer, - true, - false, - }, - { - "fee with withdraw address same as contract", - contract, - deployer, - sdk.AccAddress(contract.Bytes()), - true, - true, - }, - { - "fee with withdraw address different than deployer", - contract, - deployer, - withdraw, - true, - true, - }, - { - "no fee", - common.Address{}, - nil, - nil, - false, - false, - }, - } - for _, tc := range testCases { - suite.Run(fmt.Sprintf("Case %s", tc.name), func() { - suite.SetupTest() // reset - - if tc.found { - revenue := types.NewRevenue(tc.contract, tc.deployer, tc.withdraw) - if tc.deployer.Equals(tc.withdraw) { - revenue.WithdrawerAddress = "" - } - - suite.app.RevenueKeeper.SetRevenue(suite.ctx, revenue) - suite.app.RevenueKeeper.SetDeployerMap(suite.ctx, tc.deployer, tc.contract) - } - - if tc.expWithdraw { - suite.app.RevenueKeeper.SetWithdrawerMap(suite.ctx, tc.withdraw, tc.contract) - } - - revenue, found := suite.app.RevenueKeeper.GetRevenue(suite.ctx, tc.contract) - foundD := suite.app.RevenueKeeper.IsDeployerMapSet(suite.ctx, tc.deployer, tc.contract) - foundW := suite.app.RevenueKeeper.IsWithdrawerMapSet(suite.ctx, tc.withdraw, tc.contract) - - if tc.found { - suite.Require().True(found, tc.name) - suite.Require().Equal(tc.deployer.String(), revenue.DeployerAddress, tc.name) - suite.Require().Equal(tc.contract.Hex(), revenue.ContractAddress, tc.name) - - suite.Require().True(foundD, tc.name) - - if tc.expWithdraw { - suite.Require().Equal(tc.withdraw.String(), revenue.WithdrawerAddress, tc.name) - suite.Require().True(foundW, tc.name) - } else { - suite.Require().Equal("", revenue.WithdrawerAddress, tc.name) - suite.Require().False(foundW, tc.name) - } - } else { - suite.Require().False(found, tc.name) - } - }) - } -} - -func (suite *KeeperTestSuite) TestDeleteRevenue() { - revenue := types.NewRevenue(contract, deployer, withdraw) - suite.app.RevenueKeeper.SetRevenue(suite.ctx, revenue) - - initialFee, found := suite.app.RevenueKeeper.GetRevenue(suite.ctx, contract) - suite.Require().True(found) - - testCases := []struct { - name string - malleate func() - ok bool - }{ - {"existing revenue", func() {}, true}, - { - "deleted revenue", - func() { - suite.app.RevenueKeeper.DeleteRevenue(suite.ctx, revenue) - }, - false, - }, - } - for _, tc := range testCases { - tc.malleate() - revenue, found := suite.app.RevenueKeeper.GetRevenue(suite.ctx, contract) - if tc.ok { - suite.Require().True(found, tc.name) - suite.Require().Equal(initialFee, revenue, tc.name) - } else { - suite.Require().False(found, tc.name) - suite.Require().Equal(types.Revenue{}, revenue, tc.name) - } - } -} - -func (suite *KeeperTestSuite) TestDeleteDeployerMap() { - suite.app.RevenueKeeper.SetDeployerMap(suite.ctx, deployer, contract) - found := suite.app.RevenueKeeper.IsDeployerMapSet(suite.ctx, deployer, contract) - suite.Require().True(found) - - testCases := []struct { - name string - malleate func() - ok bool - }{ - {"existing deployer", func() {}, true}, - { - "deleted deployer", - func() { - suite.app.RevenueKeeper.DeleteDeployerMap(suite.ctx, deployer, contract) - }, - false, - }, - } - for _, tc := range testCases { - tc.malleate() - found := suite.app.RevenueKeeper.IsDeployerMapSet(suite.ctx, deployer, contract) - if tc.ok { - suite.Require().True(found, tc.name) - } else { - suite.Require().False(found, tc.name) - } - } -} - -func (suite *KeeperTestSuite) TestDeleteWithdrawMap() { - suite.app.RevenueKeeper.SetWithdrawerMap(suite.ctx, withdraw, contract) - found := suite.app.RevenueKeeper.IsWithdrawerMapSet(suite.ctx, withdraw, contract) - suite.Require().True(found) - - testCases := []struct { - name string - malleate func() - ok bool - }{ - {"existing withdraw", func() {}, true}, - { - "deleted withdraw", - func() { - suite.app.RevenueKeeper.DeleteWithdrawerMap(suite.ctx, withdraw, contract) - }, - false, - }, - } - for _, tc := range testCases { - tc.malleate() - found := suite.app.RevenueKeeper.IsWithdrawerMapSet(suite.ctx, withdraw, contract) - if tc.ok { - suite.Require().True(found, tc.name) - } else { - suite.Require().False(found, tc.name) - } - } -} - -func (suite *KeeperTestSuite) TestIsRevenueRegistered() { - revenue := types.NewRevenue(contract, deployer, withdraw) - suite.app.RevenueKeeper.SetRevenue(suite.ctx, revenue) - _, found := suite.app.RevenueKeeper.GetRevenue(suite.ctx, contract) - suite.Require().True(found) - - testCases := []struct { - name string - contract common.Address - ok bool - }{ - {"registered revenue", contract, true}, - {"revenue not registered", common.Address{}, false}, - {"revenue not registered", utiltx.GenerateAddress(), false}, - } - for _, tc := range testCases { - found := suite.app.RevenueKeeper.IsRevenueRegistered(suite.ctx, tc.contract) - if tc.ok { - suite.Require().True(found, tc.name) - } else { - suite.Require().False(found, tc.name) - } - } -} diff --git a/x/revenue/v1/keeper/setup_test.go b/x/revenue/v1/keeper/setup_test.go deleted file mode 100644 index 188ce4d156..0000000000 --- a/x/revenue/v1/keeper/setup_test.go +++ /dev/null @@ -1,65 +0,0 @@ -package keeper_test - -import ( - "testing" - - "github.com/ethereum/go-ethereum/common" - - //nolint:revive // dot imports are fine for Ginkgo - . "github.com/onsi/ginkgo/v2" - //nolint:revive // dot imports are fine for Ginkgo - . "github.com/onsi/gomega" - - "github.com/cosmos/cosmos-sdk/crypto/keyring" - sdk "github.com/cosmos/cosmos-sdk/types" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - ethtypes "github.com/ethereum/go-ethereum/core/types" - - "github.com/evmos/evmos/v16/app" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/utils" - evm "github.com/evmos/evmos/v16/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" - "github.com/evmos/evmos/v16/x/revenue/v1/types" - - "github.com/stretchr/testify/suite" -) - -type KeeperTestSuite struct { - suite.Suite - - ctx sdk.Context - - app *app.Evmos - queryClient types.QueryClient - queryClientEvm evm.QueryClient - address common.Address - signer keyring.Signer - ethSigner ethtypes.Signer - consAddress sdk.ConsAddress - validator stakingtypes.Validator - denom string -} - -var s *KeeperTestSuite - -var ( - contract = utiltx.GenerateAddress() - deployer = sdk.AccAddress(utiltx.GenerateAddress().Bytes()) - withdraw = sdk.AccAddress(utiltx.GenerateAddress().Bytes()) -) - -func TestKeeperTestSuite(t *testing.T) { - s = new(KeeperTestSuite) - suite.Run(t, s) - - // Run Ginkgo integration tests - RegisterFailHandler(Fail) - RunSpecs(t, "Keeper Suite") -} - -func (suite *KeeperTestSuite) SetupTest() { - chainID := utils.TestnetChainID + "-1" - suite.app = app.Setup(false, feemarkettypes.DefaultGenesisState(), chainID) - suite.SetupApp(chainID) -} diff --git a/x/revenue/v1/keeper/utils_test.go b/x/revenue/v1/keeper/utils_test.go deleted file mode 100644 index 76b16cb591..0000000000 --- a/x/revenue/v1/keeper/utils_test.go +++ /dev/null @@ -1,196 +0,0 @@ -package keeper_test - -import ( - "math/big" - "time" - - "cosmossdk.io/math" - //nolint:revive // dot imports are fine for Ginkgo - . "github.com/onsi/gomega" - - abci "github.com/cometbft/cometbft/abci/types" - "github.com/cosmos/cosmos-sdk/baseapp" - sdk "github.com/cosmos/cosmos-sdk/types" - stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/ethereum/go-ethereum/common" - ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" - "github.com/evmos/evmos/v16/testutil" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/utils" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - "github.com/evmos/evmos/v16/x/revenue/v1/types" - "github.com/stretchr/testify/require" -) - -func (suite *KeeperTestSuite) SetupApp(chainID string) { - t := suite.T() - // account key - priv, err := ethsecp256k1.GenerateKey() - require.NoError(t, err) - suite.address = common.BytesToAddress(priv.PubKey().Address().Bytes()) - suite.signer = utiltx.NewSigner(priv) - - suite.denom = utils.BaseDenom - - // consensus key - privCons, err := ethsecp256k1.GenerateKey() - require.NoError(t, err) - suite.consAddress = sdk.ConsAddress(privCons.PubKey().Address()) - header := testutil.NewHeader( - 1, time.Now().UTC(), chainID, suite.consAddress, nil, nil, - ) - suite.ctx = suite.app.BaseApp.NewContext(false, header) - queryHelper := baseapp.NewQueryServerTestHelper(suite.ctx, suite.app.InterfaceRegistry()) - types.RegisterQueryServer(queryHelper, suite.app.RevenueKeeper) - suite.queryClient = types.NewQueryClient(queryHelper) - - queryHelperEvm := baseapp.NewQueryServerTestHelper(suite.ctx, suite.app.InterfaceRegistry()) - evmtypes.RegisterQueryServer(queryHelperEvm, suite.app.EvmKeeper) - suite.queryClientEvm = evmtypes.NewQueryClient(queryHelperEvm) - - params := types.DefaultParams() - params.EnableRevenue = true - err = suite.app.RevenueKeeper.SetParams(suite.ctx, params) - require.NoError(t, err) - - stakingParams := suite.app.StakingKeeper.GetParams(suite.ctx) - stakingParams.BondDenom = suite.denom - err = suite.app.StakingKeeper.SetParams(suite.ctx, stakingParams) - require.NoError(t, err) - - evmParams := suite.app.EvmKeeper.GetParams(suite.ctx) - evmParams.EvmDenom = suite.denom - err = suite.app.EvmKeeper.SetParams(suite.ctx, evmParams) - require.NoError(t, err) - - inflationParams := suite.app.InflationKeeper.GetParams(suite.ctx) - inflationParams.EnableInflation = false - err = suite.app.InflationKeeper.SetParams(suite.ctx, inflationParams) - require.NoError(t, err) - - // Set Validator - valAddr := sdk.ValAddress(suite.address.Bytes()) - validator, err := stakingtypes.NewValidator(valAddr, privCons.PubKey(), stakingtypes.Description{}) - require.NoError(t, err) - validator = stakingkeeper.TestingUpdateValidator(&suite.app.StakingKeeper, suite.ctx, validator, true) - err = suite.app.StakingKeeper.Hooks().AfterValidatorCreated(suite.ctx, validator.GetOperator()) - require.NoError(t, err) - err = suite.app.StakingKeeper.SetValidatorByConsAddr(suite.ctx, validator) - require.NoError(t, err) - validators := s.app.StakingKeeper.GetBondedValidatorsByPower(s.ctx) - suite.validator = validators[0] - - suite.ethSigner = ethtypes.LatestSignerForChainID(s.app.EvmKeeper.ChainID()) -} - -// Commit commits and starts a new block with an updated context. -func (suite *KeeperTestSuite) Commit() { - suite.CommitAfter(time.Second * 0) -} - -// Commit commits a block at a given time. -func (suite *KeeperTestSuite) CommitAfter(t time.Duration) { - var err error - suite.ctx, err = testutil.CommitAndCreateNewCtx(suite.ctx, suite.app, t, nil) - suite.Require().NoError(err) - queryHelper := baseapp.NewQueryServerTestHelper(suite.ctx, suite.app.InterfaceRegistry()) - - types.RegisterQueryServer(queryHelper, suite.app.RevenueKeeper) - suite.queryClient = types.NewQueryClient(queryHelper) - - queryHelperEvm := baseapp.NewQueryServerTestHelper(suite.ctx, suite.app.InterfaceRegistry()) - evmtypes.RegisterQueryServer(queryHelperEvm, suite.app.EvmKeeper) - suite.queryClientEvm = evmtypes.NewQueryClient(queryHelperEvm) -} - -func calculateFees( - denom string, - params types.Params, - res abci.ResponseDeliverTx, - gasPrice *big.Int, -) (sdk.Coin, sdk.Coin) { - feeDistribution := math.NewInt(res.GasUsed).Mul(math.NewIntFromBigInt(gasPrice)) - developerFee := math.LegacyNewDecFromInt(feeDistribution).Mul(params.DeveloperShares) - developerCoins := sdk.NewCoin(denom, developerFee.TruncateInt()) - validatorShares := math.LegacyOneDec().Sub(params.DeveloperShares) - validatorFee := math.LegacyNewDecFromInt(feeDistribution).Mul(validatorShares) - validatorCoins := sdk.NewCoin(denom, validatorFee.TruncateInt()) - return developerCoins, validatorCoins -} - -func getNonce(addressBytes []byte) uint64 { - return s.app.EvmKeeper.GetNonce( - s.ctx, - common.BytesToAddress(addressBytes), - ) -} - -func registerFee( - priv *ethsecp256k1.PrivKey, - contractAddress *common.Address, - withdrawerAddress sdk.AccAddress, - nonces []uint64, -) abci.ResponseDeliverTx { - deployerAddress := sdk.AccAddress(priv.PubKey().Address()) - msg := types.NewMsgRegisterRevenue(*contractAddress, deployerAddress, withdrawerAddress, nonces) - - res, err := testutil.DeliverTx(s.ctx, s.app, priv, nil, msg) - s.Require().NoError(err) - s.Commit() - - if res.IsOK() { - registerEvent := res.GetEvents()[8] - Expect(registerEvent.Type).To(Equal(types.EventTypeRegisterRevenue)) - Expect(registerEvent.Attributes[0].Key).To(Equal(sdk.AttributeKeySender)) - Expect(registerEvent.Attributes[1].Key).To(Equal(types.AttributeKeyContract)) - Expect(registerEvent.Attributes[2].Key).To(Equal(types.AttributeKeyWithdrawerAddress)) - } - return res -} - -func contractInteract( - priv *ethsecp256k1.PrivKey, - contractAddr *common.Address, - gasPrice *big.Int, - gasFeeCap *big.Int, - gasTipCap *big.Int, - data []byte, - accesses *ethtypes.AccessList, -) abci.ResponseDeliverTx { - msgEthereumTx := buildEthTx(priv, contractAddr, gasPrice, gasFeeCap, gasTipCap, data, accesses) - res, err := testutil.DeliverEthTx(s.app, priv, msgEthereumTx) - Expect(err).To(BeNil()) - Expect(res.IsOK()).To(Equal(true), res.GetLog()) - return res -} - -func buildEthTx( - priv *ethsecp256k1.PrivKey, - to *common.Address, - gasPrice *big.Int, - gasFeeCap *big.Int, - gasTipCap *big.Int, - data []byte, - accesses *ethtypes.AccessList, -) *evmtypes.MsgEthereumTx { - chainID := s.app.EvmKeeper.ChainID() - from := common.BytesToAddress(priv.PubKey().Address().Bytes()) - nonce := getNonce(from.Bytes()) - gasLimit := uint64(10000000) - ethTxParams := evmtypes.EvmTxArgs{ - ChainID: chainID, - Nonce: nonce, - To: to, - GasPrice: gasPrice, - GasLimit: gasLimit, - GasTipCap: gasTipCap, - GasFeeCap: gasFeeCap, - Input: data, - Accesses: accesses, - } - msgEthereumTx := evmtypes.NewTx(ðTxParams) - msgEthereumTx.From = from.String() - return msgEthereumTx -} diff --git a/x/revenue/v1/migrations/v2/migrate.go b/x/revenue/v1/migrations/v2/migrate.go deleted file mode 100644 index df0b1b21b8..0000000000 --- a/x/revenue/v1/migrations/v2/migrate.go +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:LGPL-3.0-only - -package v2 - -import ( - "github.com/cosmos/cosmos-sdk/codec" - storetypes "github.com/cosmos/cosmos-sdk/store/types" - sdk "github.com/cosmos/cosmos-sdk/types" - v2types "github.com/evmos/evmos/v16/x/revenue/v1/migrations/v2/types" - "github.com/evmos/evmos/v16/x/revenue/v1/types" -) - -// MigrateStore migrates the x/revenue module state from the consensus version 1 to -// version 2. Specifically, it takes the parameters that are currently stored -// and managed by the Cosmos SDK params module and stores them directly into the x/evm module state. -func MigrateStore( - ctx sdk.Context, - storeKey storetypes.StoreKey, - legacySubspace types.Subspace, - cdc codec.BinaryCodec, -) error { - store := ctx.KVStore(storeKey) - var params v2types.V2Params - - legacySubspace = legacySubspace.WithKeyTable(v2types.ParamKeyTable()) - legacySubspace.GetParamSetIfExists(ctx, ¶ms) - if err := params.Validate(); err != nil { - return err - } - - bz, err := cdc.Marshal(¶ms) - if err != nil { - return err - } - - store.Set(types.ParamsKey, bz) - - return nil -} diff --git a/x/revenue/v1/migrations/v2/migrate_test.go b/x/revenue/v1/migrations/v2/migrate_test.go deleted file mode 100644 index 171296c859..0000000000 --- a/x/revenue/v1/migrations/v2/migrate_test.go +++ /dev/null @@ -1,62 +0,0 @@ -package v2_test - -import ( - "testing" - - storetypes "github.com/cosmos/cosmos-sdk/store/types" - paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - - "github.com/evmos/evmos/v16/encoding" - v2 "github.com/evmos/evmos/v16/x/revenue/v1/migrations/v2" - v2types "github.com/evmos/evmos/v16/x/revenue/v1/migrations/v2/types" - "github.com/evmos/evmos/v16/x/revenue/v1/types" - - "github.com/cosmos/cosmos-sdk/testutil" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/app" - "github.com/stretchr/testify/require" -) - -type mockSubspace struct { - ps v2types.V2Params - storeKey storetypes.StoreKey - transientKey storetypes.StoreKey -} - -func newMockSubspace(ps v2types.V2Params, storeKey, transientKey storetypes.StoreKey) mockSubspace { - return mockSubspace{ps: ps, storeKey: storeKey, transientKey: transientKey} -} - -func (ms mockSubspace) GetParamSetIfExists(_ sdk.Context, ps types.LegacyParams) { - *ps.(*v2types.V2Params) = ms.ps -} - -func (ms mockSubspace) WithKeyTable(keyTable paramtypes.KeyTable) paramtypes.Subspace { - encCfg := encoding.MakeConfig(app.ModuleBasics) - cdc := encCfg.Codec - return paramtypes.NewSubspace(cdc, encCfg.Amino, ms.storeKey, ms.transientKey, "test").WithKeyTable(keyTable) -} - -func TestMigrate(t *testing.T) { - encCfg := encoding.MakeConfig(app.ModuleBasics) - cdc := encCfg.Codec - storeKey := sdk.NewKVStoreKey(types.ModuleName) - tKey := sdk.NewTransientStoreKey("transient_test") - ctx := testutil.DefaultContext(storeKey, tKey) - store := ctx.KVStore(storeKey) - - var outputParams v2types.V2Params - inputParams := v2types.DefaultParams() - legacySubspace := newMockSubspace(v2types.DefaultParams(), storeKey, tKey).WithKeyTable(v2types.ParamKeyTable()) - legacySubspace.SetParamSet(ctx, &inputParams) - legacySubspace.GetParamSetIfExists(ctx, &outputParams) - - mockSubspace := newMockSubspace(v2types.DefaultParams(), storeKey, tKey) - require.NoError(t, v2.MigrateStore(ctx, storeKey, mockSubspace, cdc)) - - paramsBz := store.Get(v2types.ParamsKey) - var params v2types.V2Params - cdc.MustUnmarshal(paramsBz, ¶ms) - - require.Equal(t, params, outputParams) -} diff --git a/x/revenue/v1/migrations/v2/types/genesis.pb.go b/x/revenue/v1/migrations/v2/types/genesis.pb.go deleted file mode 100644 index 1aff3bcf4e..0000000000 --- a/x/revenue/v1/migrations/v2/types/genesis.pb.go +++ /dev/null @@ -1,662 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: evmos/revenue/v1/genesis.proto - -package types - -import ( - fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - - cosmossdk_io_math "cosmossdk.io/math" - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" - "github.com/evmos/evmos/v16/x/revenue/v1/types" -) - -// Reference imports to suppress errors if they are not otherwise used. -var ( - _ = proto.Marshal - _ = fmt.Errorf - _ = math.Inf -) - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// V2GenesisState defines the module's genesis state. -type V2GenesisState struct { - // V2Params are the revenue module parameters - V2Params V2Params `protobuf:"bytes,1,opt,name=V2Params,proto3" json:"V2Params"` - // revenues is a slice of active registered contracts for fee distribution - Revenues []types.Revenue `protobuf:"bytes,2,rep,name=revenues,proto3" json:"revenues"` -} - -func (m *V2GenesisState) Reset() { *m = V2GenesisState{} } -func (m *V2GenesisState) String() string { return proto.CompactTextString(m) } -func (*V2GenesisState) ProtoMessage() {} -func (*V2GenesisState) Descriptor() ([]byte, []int) { - return fileDescriptor_649d64d9c3438055, []int{0} -} - -func (m *V2GenesisState) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *V2GenesisState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_V2GenesisState.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} - -func (m *V2GenesisState) XXX_Merge(src proto.Message) { - xxx_messageInfo_V2GenesisState.Merge(m, src) -} - -func (m *V2GenesisState) XXX_Size() int { - return m.Size() -} - -func (m *V2GenesisState) XXX_DiscardUnknown() { - xxx_messageInfo_V2GenesisState.DiscardUnknown(m) -} - -var xxx_messageInfo_V2GenesisState proto.InternalMessageInfo - -func (m *V2GenesisState) GetV2Params() V2Params { - if m != nil { - return m.V2Params - } - return V2Params{} -} - -func (m *V2GenesisState) GetRevenues() []types.Revenue { - if m != nil { - return m.Revenues - } - return nil -} - -// V2Params defines the revenue module V2Params -type V2Params struct { - // enable_revenue defines a parameter to enable the revenue module - EnableRevenue bool `protobuf:"varint,1,opt,name=enable_revenue,json=enableRevenue,proto3" json:"enable_revenue,omitempty"` - // developer_shares defines the proportion of the transaction fees to be - // distributed to the registered contract owner - DeveloperShares cosmossdk_io_math.LegacyDec `protobuf:"bytes,2,opt,name=developer_shares,json=developerShares,proto3,customtype=cosmossdk.io/math.LegacyDec" json:"developer_shares"` - // addr_derivation_cost_create defines the cost of address derivation for - // verifying the contract deployer at fee registration - AddrDerivationCostCreate uint64 `protobuf:"varint,3,opt,name=addr_derivation_cost_create,json=addrDerivationCostCreate,proto3" json:"addr_derivation_cost_create,omitempty"` -} - -func (m *V2Params) Reset() { *m = V2Params{} } -func (m *V2Params) String() string { return proto.CompactTextString(m) } -func (*V2Params) ProtoMessage() {} -func (*V2Params) Descriptor() ([]byte, []int) { - return fileDescriptor_649d64d9c3438055, []int{1} -} - -func (m *V2Params) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *V2Params) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_V2Params.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} - -func (m *V2Params) XXX_Merge(src proto.Message) { - xxx_messageInfo_V2Params.Merge(m, src) -} - -func (m *V2Params) XXX_Size() int { - return m.Size() -} - -func (m *V2Params) XXX_DiscardUnknown() { - xxx_messageInfo_V2Params.DiscardUnknown(m) -} - -var xxx_messageInfo_V2Params proto.InternalMessageInfo - -func (m *V2Params) GetEnableRevenue() bool { - if m != nil { - return m.EnableRevenue - } - return false -} - -func (m *V2Params) GetAddrDerivationCostCreate() uint64 { - if m != nil { - return m.AddrDerivationCostCreate - } - return 0 -} - -func init() { - proto.RegisterType((*V2GenesisState)(nil), "evmos.revenue.v1.V2GenesisState") - proto.RegisterType((*V2Params)(nil), "evmos.revenue.v1.V2Params") -} - -func init() { proto.RegisterFile("evmos/revenue/v1/genesis.proto", fileDescriptor_649d64d9c3438055) } - -var fileDescriptor_649d64d9c3438055 = []byte{ - // 351 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x91, 0x4f, 0x4b, 0xf3, 0x40, - 0x10, 0xc6, 0xb3, 0x6f, 0x4b, 0xe9, 0xbb, 0xf5, 0x4f, 0x09, 0x1e, 0x62, 0x85, 0xb4, 0x14, 0x94, - 0x20, 0xb8, 0xb1, 0x15, 0xbc, 0x88, 0x97, 0xb6, 0xe0, 0x55, 0xd2, 0x93, 0x5e, 0xc2, 0x36, 0x19, - 0xd2, 0x60, 0x9b, 0x0d, 0xbb, 0xdb, 0xa0, 0x67, 0xbf, 0x80, 0x1f, 0xab, 0xde, 0x7a, 0x14, 0x0f, - 0x45, 0xda, 0x2f, 0x22, 0xd9, 0x8d, 0x41, 0xec, 0x25, 0x19, 0xe6, 0x79, 0x9e, 0xdf, 0x0c, 0x3b, - 0xd8, 0x86, 0x6c, 0xce, 0x84, 0xcb, 0x21, 0x83, 0x64, 0x01, 0x6e, 0xd6, 0x73, 0x23, 0x48, 0x40, - 0xc4, 0x82, 0xa4, 0x9c, 0x49, 0x66, 0x36, 0x95, 0x4e, 0x0a, 0x9d, 0x64, 0xbd, 0xd6, 0x6e, 0xe2, - 0x47, 0x54, 0x89, 0xd6, 0x51, 0xc4, 0x22, 0xa6, 0x4a, 0x37, 0xaf, 0x74, 0xb7, 0xfb, 0x8a, 0xf0, - 0xde, 0x9d, 0x26, 0x8f, 0x25, 0x95, 0x60, 0x5e, 0xe3, 0x5a, 0x4a, 0x39, 0x9d, 0x0b, 0x0b, 0x75, - 0x90, 0xd3, 0xe8, 0x5b, 0xe4, 0xef, 0x24, 0x72, 0xaf, 0xf4, 0x41, 0x75, 0xb9, 0x6e, 0x1b, 0x5e, - 0xe1, 0x36, 0x6f, 0x70, 0xbd, 0xb0, 0x08, 0xeb, 0x5f, 0xa7, 0xe2, 0x34, 0xfa, 0xc7, 0xbb, 0x49, - 0x4f, 0x97, 0x45, 0xb4, 0x0c, 0x74, 0xdf, 0x11, 0xae, 0x69, 0xaa, 0x79, 0x8a, 0x0f, 0x20, 0xa1, - 0x93, 0x19, 0xf8, 0x85, 0xaa, 0xf6, 0xa8, 0x7b, 0xfb, 0xba, 0x5b, 0x10, 0xcc, 0x07, 0xdc, 0x0c, - 0x21, 0x83, 0x19, 0x4b, 0x81, 0xfb, 0x62, 0x4a, 0xb9, 0x1a, 0x8b, 0x9c, 0xff, 0x03, 0x92, 0xb3, - 0x3f, 0xd7, 0xed, 0xb3, 0x28, 0x96, 0xd3, 0xc5, 0x84, 0x04, 0x6c, 0xee, 0x06, 0x4c, 0xe4, 0x6f, - 0xa3, 0x7f, 0x17, 0x22, 0x7c, 0x72, 0xe5, 0x4b, 0x0a, 0x82, 0x8c, 0x20, 0xf0, 0x0e, 0x4b, 0xce, - 0x58, 0x61, 0xcc, 0x5b, 0x7c, 0x42, 0xc3, 0x90, 0xfb, 0x21, 0xf0, 0x38, 0xa3, 0x32, 0x66, 0x89, - 0x1f, 0x30, 0x21, 0xfd, 0x80, 0x03, 0x95, 0x60, 0x55, 0x3a, 0xc8, 0xa9, 0x7a, 0x56, 0x6e, 0x19, - 0x95, 0x8e, 0x21, 0x13, 0x72, 0xa8, 0xf4, 0xc1, 0x68, 0xb9, 0xb1, 0xd1, 0x6a, 0x63, 0xa3, 0xaf, - 0x8d, 0x8d, 0xde, 0xb6, 0xb6, 0xb1, 0xda, 0xda, 0xc6, 0xc7, 0xd6, 0x36, 0x1e, 0xcf, 0x7f, 0x6d, - 0xa4, 0x8f, 0xa5, 0xbf, 0x59, 0xef, 0xd2, 0x7d, 0x2e, 0x0f, 0xa7, 0x36, 0x9b, 0xd4, 0xd4, 0x79, - 0xae, 0xbe, 0x03, 0x00, 0x00, 0xff, 0xff, 0x16, 0xe7, 0x21, 0x0b, 0x08, 0x02, 0x00, 0x00, -} - -func (m *V2GenesisState) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *V2GenesisState) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *V2GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Revenues) > 0 { - for iNdEx := len(m.Revenues) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Revenues[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - { - size, err := m.V2Params.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *V2Params) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *V2Params) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *V2Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.AddrDerivationCostCreate != 0 { - i = encodeVarintGenesis(dAtA, i, uint64(m.AddrDerivationCostCreate)) - i-- - dAtA[i] = 0x18 - } - { - size := m.DeveloperShares.Size() - i -= size - if _, err := m.DeveloperShares.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - if m.EnableRevenue { - i-- - if m.EnableRevenue { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func encodeVarintGenesis(dAtA []byte, offset int, v uint64) int { - offset -= sovGenesis(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} - -func (m *V2GenesisState) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.V2Params.Size() - n += 1 + l + sovGenesis(uint64(l)) - if len(m.Revenues) > 0 { - for _, e := range m.Revenues { - l = e.Size() - n += 1 + l + sovGenesis(uint64(l)) - } - } - return n -} - -func (m *V2Params) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.EnableRevenue { - n += 2 - } - l = m.DeveloperShares.Size() - n += 1 + l + sovGenesis(uint64(l)) - if m.AddrDerivationCostCreate != 0 { - n += 1 + sovGenesis(uint64(m.AddrDerivationCostCreate)) - } - return n -} - -func sovGenesis(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} - -func sozGenesis(x uint64) (n int) { - return sovGenesis(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} - -func (m *V2GenesisState) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: V2GenesisState: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: V2GenesisState: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field V2Params", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.V2Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Revenues", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Revenues = append(m.Revenues, types.Revenue{}) - if err := m.Revenues[len(m.Revenues)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenesis(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenesis - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *V2Params) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: V2Params: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: V2Params: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field EnableRevenue", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.EnableRevenue = bool(v != 0) - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DeveloperShares", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.DeveloperShares.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field AddrDerivationCostCreate", wireType) - } - m.AddrDerivationCostCreate = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.AddrDerivationCostCreate |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipGenesis(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenesis - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func skipGenesis(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenesis - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenesis - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenesis - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthGenesis - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupGenesis - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthGenesis - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthGenesis = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowGenesis = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupGenesis = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/revenue/v1/migrations/v2/types/params.go b/x/revenue/v1/migrations/v2/types/params.go deleted file mode 100644 index fed7786b9a..0000000000 --- a/x/revenue/v1/migrations/v2/types/params.go +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:LGPL-3.0-only - -package types - -import ( - "fmt" - - "cosmossdk.io/math" - "github.com/evmos/evmos/v16/x/revenue/v1/types" - - paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" -) - -var _ types.LegacyParams = &V2Params{} - -// Parameter store key -var ( - DefaultEnableRevenue = true - DefaultDeveloperShares = math.LegacyNewDecWithPrec(50, 2) // 50% - // DefaultAddrDerivationCostCreate Cost for executing `crypto.CreateAddress` must be at least 36 gas for the - // contained keccak256(word) operation - DefaultAddrDerivationCostCreate = uint64(50) -) - -var ( - ParamsKey = []byte("Params") - ParamStoreKeyEnableRevenue = []byte("EnableRevenue") - ParamStoreKeyDeveloperShares = []byte("DeveloperShares") - ParamStoreKeyAddrDerivationCostCreate = []byte("AddrDerivationCostCreate") -) - -// ParamKeyTable returns the parameter key table. -func ParamKeyTable() paramtypes.KeyTable { - return paramtypes.NewKeyTable().RegisterParamSet(&V2Params{}) -} - -// NewParams creates a new Params object -func NewParams( - enableRevenue bool, - developerShares math.LegacyDec, - addrDerivationCostCreate uint64, -) V2Params { - return V2Params{ - EnableRevenue: enableRevenue, - DeveloperShares: developerShares, - AddrDerivationCostCreate: addrDerivationCostCreate, - } -} - -func DefaultParams() V2Params { - return V2Params{ - EnableRevenue: DefaultEnableRevenue, - DeveloperShares: DefaultDeveloperShares, - AddrDerivationCostCreate: DefaultAddrDerivationCostCreate, - } -} - -// ParamSetPairs returns the parameter set pairs. -func (p *V2Params) ParamSetPairs() paramtypes.ParamSetPairs { - return paramtypes.ParamSetPairs{ - paramtypes.NewParamSetPair(ParamStoreKeyEnableRevenue, &p.EnableRevenue, validateBool), - paramtypes.NewParamSetPair(ParamStoreKeyDeveloperShares, &p.DeveloperShares, validateShares), - paramtypes.NewParamSetPair(ParamStoreKeyAddrDerivationCostCreate, &p.AddrDerivationCostCreate, validateUint64), - } -} - -func validateUint64(i interface{}) error { - _, ok := i.(uint64) - if !ok { - return fmt.Errorf("invalid parameter type: %T", i) - } - - return nil -} - -func validateBool(i interface{}) error { - _, ok := i.(bool) - if !ok { - return fmt.Errorf("invalid parameter type: %T", i) - } - - return nil -} - -func validateShares(i interface{}) error { - v, ok := i.(math.LegacyDec) - - if !ok { - return fmt.Errorf("invalid parameter type: %T", i) - } - - if v.IsNil() { - return fmt.Errorf("invalid parameter: nil") - } - - if v.IsNegative() { - return fmt.Errorf("value cannot be negative: %T", i) - } - - if v.GT(math.LegacyOneDec()) { - return fmt.Errorf("value cannot be greater than 1: %T", i) - } - - return nil -} - -func (p V2Params) Validate() error { - if err := validateBool(p.EnableRevenue); err != nil { - return err - } - if err := validateShares(p.DeveloperShares); err != nil { - return err - } - return validateUint64(p.AddrDerivationCostCreate) -} diff --git a/x/revenue/v1/module.go b/x/revenue/v1/module.go deleted file mode 100644 index 08e8315450..0000000000 --- a/x/revenue/v1/module.go +++ /dev/null @@ -1,185 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:LGPL-3.0-only - -package revenue - -import ( - "context" - "encoding/json" - "fmt" - - errorsmod "cosmossdk.io/errors" - - abci "github.com/cometbft/cometbft/abci/types" - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/codec" - codectypes "github.com/cosmos/cosmos-sdk/codec/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/module" - simtypes "github.com/cosmos/cosmos-sdk/types/simulation" - authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" - "github.com/gorilla/mux" - "github.com/grpc-ecosystem/grpc-gateway/runtime" - "github.com/spf13/cobra" - - "github.com/evmos/evmos/v16/x/revenue/v1/client/cli" - "github.com/evmos/evmos/v16/x/revenue/v1/keeper" - "github.com/evmos/evmos/v16/x/revenue/v1/types" -) - -// consensusVersion defines the current x/v1/revenue module consensus version. -const consensusVersion = 2 - -// type check to ensure the interface is properly implemented -var ( - _ module.AppModule = AppModule{} - _ module.AppModuleBasic = AppModuleBasic{} - _ module.AppModuleSimulation = AppModule{} -) - -// AppModuleBasic type for the fees module -type AppModuleBasic struct{} - -// Name returns the fees module's name. -func (AppModuleBasic) Name() string { - return types.ModuleName -} - -// RegisterLegacyAminoCodec performs a no-op as the fees do not support Amino -// encoding. -func (AppModuleBasic) RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { - types.RegisterLegacyAminoCodec(cdc) -} - -// ConsensusVersion returns the consensus state-breaking version for the module. -func (AppModuleBasic) ConsensusVersion() uint64 { - return consensusVersion -} - -// RegisterInterfaces registers interfaces and implementations of the fees -// module. -func (AppModuleBasic) RegisterInterfaces(interfaceRegistry codectypes.InterfaceRegistry) { - types.RegisterInterfaces(interfaceRegistry) -} - -// DefaultGenesis returns default genesis state as raw bytes for the fees -// module. -func (AppModuleBasic) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { - return cdc.MustMarshalJSON(types.DefaultGenesisState()) -} - -// ValidateGenesis performs genesis state validation for the fees module. -func (b AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, _ client.TxEncodingConfig, bz json.RawMessage) error { - var genesisState types.GenesisState - if err := cdc.UnmarshalJSON(bz, &genesisState); err != nil { - return fmt.Errorf("failed to unmarshal %s genesis state: %w", types.ModuleName, err) - } - - return genesisState.Validate() -} - -// RegisterRESTRoutes performs a no-op as the fees module doesn't expose REST -// endpoints -func (AppModuleBasic) RegisterRESTRoutes(_ client.Context, _ *mux.Router) {} - -// RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the fees -// module. -func (b AppModuleBasic) RegisterGRPCGatewayRoutes(c client.Context, serveMux *runtime.ServeMux) { - if err := types.RegisterQueryHandlerClient(context.Background(), serveMux, types.NewQueryClient(c)); err != nil { - panic(err) - } -} - -// GetTxCmd returns the root tx command for the fees module. -func (AppModuleBasic) GetTxCmd() *cobra.Command { - return cli.NewTxCmd() -} - -// GetQueryCmd returns the fees module's root query command. -func (AppModuleBasic) GetQueryCmd() *cobra.Command { - return cli.GetQueryCmd() -} - -// ___________________________________________________________________________ - -// AppModule implements the AppModule interface for the fees module. -type AppModule struct { - AppModuleBasic - keeper keeper.Keeper - ak authkeeper.AccountKeeper - // legacySubspace is used solely for migration of x/params managed parameters - legacySubspace types.Subspace -} - -// NewAppModule creates a new AppModule Object -func NewAppModule( - k keeper.Keeper, - ak authkeeper.AccountKeeper, - ss types.Subspace, -) AppModule { - return AppModule{ - AppModuleBasic: AppModuleBasic{}, - keeper: k, - ak: ak, - legacySubspace: ss, - } -} - -// Name returns the fees module's name. -func (AppModule) Name() string { - return types.ModuleName -} - -// RegisterInvariants registers the fees module's invariants. -func (am AppModule) RegisterInvariants(_ sdk.InvariantRegistry) {} - -// NewHandler returns nil - fees module doesn't expose tx gRPC endpoints -func (am AppModule) NewHandler() sdk.Handler { - return nil -} - -// RegisterServices registers a GRPC query service to respond to the -// module-specific GRPC queries. -func (am AppModule) RegisterServices(cfg module.Configurator) { - types.RegisterMsgServer(cfg.MsgServer(), &am.keeper) - types.RegisterQueryServer(cfg.QueryServer(), am.keeper) - - m := keeper.NewMigrator(am.keeper, am.legacySubspace) - err := cfg.RegisterMigration(types.ModuleName, 1, m.Migrate1to2) - if err != nil { - panic(errorsmod.Wrapf(err, "error running store migration")) - } -} - -// InitGenesis performs the fees module's genesis initialization. It returns -// no validator updates. -func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, data json.RawMessage) []abci.ValidatorUpdate { - var genesisState types.GenesisState - - cdc.MustUnmarshalJSON(data, &genesisState) - InitGenesis(ctx, am.keeper, genesisState) - return []abci.ValidatorUpdate{} -} - -// ExportGenesis returns the fees module's exported genesis state as raw JSON bytes. -func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.RawMessage { - gs := ExportGenesis(ctx, am.keeper) - return cdc.MustMarshalJSON(gs) -} - -// ___________________________________________________________________________ - -// AppModuleSimulation functions - -// GenerateGenesisState creates a randomized GenState of the fees module. -func (am AppModule) GenerateGenesisState(_ *module.SimulationState) { -} - -// RegisterStoreDecoder registers a decoder for fees module's types. -func (am AppModule) RegisterStoreDecoder(_ sdk.StoreDecoderRegistry) { -} - -// WeightedOperations returns fees module weighted operations -func (am AppModule) WeightedOperations(_ module.SimulationState) []simtypes.WeightedOperation { - return []simtypes.WeightedOperation{} -} diff --git a/x/revenue/v1/types/codec.go b/x/revenue/v1/types/codec.go deleted file mode 100644 index 88d967408e..0000000000 --- a/x/revenue/v1/types/codec.go +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:LGPL-3.0-only - -package types - -import ( - "github.com/cosmos/cosmos-sdk/codec" - codectypes "github.com/cosmos/cosmos-sdk/codec/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/msgservice" -) - -var ( - amino = codec.NewLegacyAmino() - - // ModuleCdc references the global erc20 module codec. Note, the codec should - // ONLY be used in certain instances of tests and for JSON encoding. - // - // The actual codec used for serialization should be provided to modules/erc20 and - // defined at the application level. - ModuleCdc = codec.NewProtoCodec(codectypes.NewInterfaceRegistry()) - - // AminoCdc is a amino codec created to support amino JSON compatible msgs. - AminoCdc = codec.NewAminoCodec(amino) -) - -const ( - // Amino names - cancelRevenueName = "evmos/MsgCancelRevenue" - registerRevenueName = "evmos/MsgRegisterRevenue" - updateRevenueName = "evmos/MsgUpdateRevenue" - updateParamsName = "evmos/MsgUpdateParams" -) - -// NOTE: This is required for the GetSignBytes function -func init() { - RegisterLegacyAminoCodec(amino) - amino.Seal() -} - -// RegisterInterfaces register implementations -func RegisterInterfaces(registry codectypes.InterfaceRegistry) { - registry.RegisterImplementations( - (*sdk.Msg)(nil), - &MsgRegisterRevenue{}, - &MsgCancelRevenue{}, - &MsgUpdateRevenue{}, - &MsgUpdateParams{}, - ) - - msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) -} - -// RegisterLegacyAminoCodec registers the necessary x/revenue interfaces and -// concrete types on the provided LegacyAmino codec. These types are used for -// Amino JSON serialization and EIP-712 compatibility. -func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { - cdc.RegisterConcrete(&MsgUpdateParams{}, updateParamsName, nil) - cdc.RegisterConcrete(&MsgCancelRevenue{}, cancelRevenueName, nil) - cdc.RegisterConcrete(&MsgRegisterRevenue{}, registerRevenueName, nil) - cdc.RegisterConcrete(&MsgUpdateRevenue{}, updateRevenueName, nil) -} diff --git a/x/revenue/v1/types/codec_test.go b/x/revenue/v1/types/codec_test.go deleted file mode 100644 index de88cc240b..0000000000 --- a/x/revenue/v1/types/codec_test.go +++ /dev/null @@ -1,33 +0,0 @@ -package types - -import ( - "testing" - - codectypes "github.com/cosmos/cosmos-sdk/codec/types" - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/stretchr/testify/suite" -) - -type CodecTestSuite struct { - suite.Suite -} - -func TestCodecSuite(t *testing.T) { - suite.Run(t, new(CodecTestSuite)) -} - -func (suite *CodecTestSuite) TestRegisterInterfaces() { - registry := codectypes.NewInterfaceRegistry() - registry.RegisterInterface(sdk.MsgInterfaceProtoName, (*sdk.Msg)(nil)) - RegisterInterfaces(registry) - - impls := registry.ListImplementations(sdk.MsgInterfaceProtoName) - suite.Require().Equal(4, len(impls)) - suite.Require().ElementsMatch([]string{ - "/evmos.revenue.v1.MsgRegisterRevenue", - "/evmos.revenue.v1.MsgCancelRevenue", - "/evmos.revenue.v1.MsgUpdateRevenue", - "/evmos.revenue.v1.MsgUpdateParams", - }, impls) -} diff --git a/x/revenue/v1/types/errors.go b/x/revenue/v1/types/errors.go deleted file mode 100644 index 4d779edb3f..0000000000 --- a/x/revenue/v1/types/errors.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:LGPL-3.0-only - -package types - -import ( - errorsmod "cosmossdk.io/errors" -) - -// errors -var ( - ErrInternalRevenue = errorsmod.Register(ModuleName, 2, "internal revenue error") - ErrRevenueDisabled = errorsmod.Register(ModuleName, 3, "revenue module is disabled by governance") - ErrRevenueAlreadyRegistered = errorsmod.Register(ModuleName, 4, "revenue already exists for given contract") - ErrRevenueNoContractDeployed = errorsmod.Register(ModuleName, 5, "no contract deployed") - ErrRevenueContractNotRegistered = errorsmod.Register(ModuleName, 6, "no revenue registered for contract") - ErrRevenueDeployerIsNotEOA = errorsmod.Register(ModuleName, 7, "no revenue registered for contract") -) diff --git a/x/revenue/v1/types/events.go b/x/revenue/v1/types/events.go deleted file mode 100644 index d4a4d3ae02..0000000000 --- a/x/revenue/v1/types/events.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:LGPL-3.0-only -package types - -// revenue events -const ( - EventTypeRegisterRevenue = "register_revenue" - EventTypeCancelRevenue = "cancel_revenue" - EventTypeUpdateRevenue = "update_revenue" - EventTypeDistributeDevRevenue = "distribute_dev_revenue" - - AttributeKeyContract = "contract" - AttributeKeyWithdrawerAddress = "withdrawer_address" -) diff --git a/x/revenue/v1/types/events.pb.go b/x/revenue/v1/types/events.pb.go deleted file mode 100644 index 6a7066dfa7..0000000000 --- a/x/revenue/v1/types/events.pb.go +++ /dev/null @@ -1,1266 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: evmos/revenue/v1/events.proto - -package types - -import ( - fmt "fmt" - proto "github.com/cosmos/gogoproto/proto" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// EventRegisterRevenue is an event emitted when a contract is registered to receive a percentage of tx fees. -type EventRegisterRevenue struct { - // deployer_address is the bech32 address of message sender. It must be the same as the origin EOA - // sending the transaction which deploys the contract - DeployerAddress string `protobuf:"bytes,1,opt,name=deployer_address,json=deployerAddress,proto3" json:"deployer_address,omitempty"` - // contract_address in hex format - ContractAddress string `protobuf:"bytes,2,opt,name=contract_address,json=contractAddress,proto3" json:"contract_address,omitempty"` - // effective_withdrawer is the withdrawer address that is stored after the - // revenue registration is completed. It defaults to the deployer address if - // the withdrawer address in the msg is omitted. When omitted, the withdraw map - // doesn't need to be set. - EffectiveWithdrawer string `protobuf:"bytes,3,opt,name=effective_withdrawer,json=effectiveWithdrawer,proto3" json:"effective_withdrawer,omitempty"` -} - -func (m *EventRegisterRevenue) Reset() { *m = EventRegisterRevenue{} } -func (m *EventRegisterRevenue) String() string { return proto.CompactTextString(m) } -func (*EventRegisterRevenue) ProtoMessage() {} -func (*EventRegisterRevenue) Descriptor() ([]byte, []int) { - return fileDescriptor_56d63fc43f5946c2, []int{0} -} -func (m *EventRegisterRevenue) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *EventRegisterRevenue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_EventRegisterRevenue.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *EventRegisterRevenue) XXX_Merge(src proto.Message) { - xxx_messageInfo_EventRegisterRevenue.Merge(m, src) -} -func (m *EventRegisterRevenue) XXX_Size() int { - return m.Size() -} -func (m *EventRegisterRevenue) XXX_DiscardUnknown() { - xxx_messageInfo_EventRegisterRevenue.DiscardUnknown(m) -} - -var xxx_messageInfo_EventRegisterRevenue proto.InternalMessageInfo - -func (m *EventRegisterRevenue) GetDeployerAddress() string { - if m != nil { - return m.DeployerAddress - } - return "" -} - -func (m *EventRegisterRevenue) GetContractAddress() string { - if m != nil { - return m.ContractAddress - } - return "" -} - -func (m *EventRegisterRevenue) GetEffectiveWithdrawer() string { - if m != nil { - return m.EffectiveWithdrawer - } - return "" -} - -// EventUpdateRevenue is an event emitted when a withdrawer address is updated for a contract. -type EventUpdateRevenue struct { - // contract_address in hex format - ContractAddress string `protobuf:"bytes,1,opt,name=contract_address,json=contractAddress,proto3" json:"contract_address,omitempty"` - // deployer_address is the bech32 address of message sender. It must be the same as the origin EOA - // sending the transaction which deploys the contract - DeployerAddress string `protobuf:"bytes,2,opt,name=deployer_address,json=deployerAddress,proto3" json:"deployer_address,omitempty"` - // withdrawer_address is the bech32 address of account receiving the transaction fees - WithdrawerAddress string `protobuf:"bytes,3,opt,name=withdrawer_address,json=withdrawerAddress,proto3" json:"withdrawer_address,omitempty"` -} - -func (m *EventUpdateRevenue) Reset() { *m = EventUpdateRevenue{} } -func (m *EventUpdateRevenue) String() string { return proto.CompactTextString(m) } -func (*EventUpdateRevenue) ProtoMessage() {} -func (*EventUpdateRevenue) Descriptor() ([]byte, []int) { - return fileDescriptor_56d63fc43f5946c2, []int{1} -} -func (m *EventUpdateRevenue) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *EventUpdateRevenue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_EventUpdateRevenue.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *EventUpdateRevenue) XXX_Merge(src proto.Message) { - xxx_messageInfo_EventUpdateRevenue.Merge(m, src) -} -func (m *EventUpdateRevenue) XXX_Size() int { - return m.Size() -} -func (m *EventUpdateRevenue) XXX_DiscardUnknown() { - xxx_messageInfo_EventUpdateRevenue.DiscardUnknown(m) -} - -var xxx_messageInfo_EventUpdateRevenue proto.InternalMessageInfo - -func (m *EventUpdateRevenue) GetContractAddress() string { - if m != nil { - return m.ContractAddress - } - return "" -} - -func (m *EventUpdateRevenue) GetDeployerAddress() string { - if m != nil { - return m.DeployerAddress - } - return "" -} - -func (m *EventUpdateRevenue) GetWithdrawerAddress() string { - if m != nil { - return m.WithdrawerAddress - } - return "" -} - -// EventCancelRevenue is an event emitted when a contract is unregistered from receiving tx fees. -type EventCancelRevenue struct { - // deployer_address is the bech32 address of message sender. It must be the same as the origin EOA - // sending the transaction which deploys the contract - DeployerAddress string `protobuf:"bytes,1,opt,name=deployer_address,json=deployerAddress,proto3" json:"deployer_address,omitempty"` - // contract_address in hex format - ContractAddress string `protobuf:"bytes,2,opt,name=contract_address,json=contractAddress,proto3" json:"contract_address,omitempty"` -} - -func (m *EventCancelRevenue) Reset() { *m = EventCancelRevenue{} } -func (m *EventCancelRevenue) String() string { return proto.CompactTextString(m) } -func (*EventCancelRevenue) ProtoMessage() {} -func (*EventCancelRevenue) Descriptor() ([]byte, []int) { - return fileDescriptor_56d63fc43f5946c2, []int{2} -} -func (m *EventCancelRevenue) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *EventCancelRevenue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_EventCancelRevenue.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *EventCancelRevenue) XXX_Merge(src proto.Message) { - xxx_messageInfo_EventCancelRevenue.Merge(m, src) -} -func (m *EventCancelRevenue) XXX_Size() int { - return m.Size() -} -func (m *EventCancelRevenue) XXX_DiscardUnknown() { - xxx_messageInfo_EventCancelRevenue.DiscardUnknown(m) -} - -var xxx_messageInfo_EventCancelRevenue proto.InternalMessageInfo - -func (m *EventCancelRevenue) GetDeployerAddress() string { - if m != nil { - return m.DeployerAddress - } - return "" -} - -func (m *EventCancelRevenue) GetContractAddress() string { - if m != nil { - return m.ContractAddress - } - return "" -} - -// EventDistributeRevenue is an event emitted when a contract receives a percentage of tx fees. -type EventDistributeRevenue struct { - // sender is the address of message sender. - Sender string `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty"` - // contract address in hex format - Contract string `protobuf:"bytes,2,opt,name=contract,proto3" json:"contract,omitempty"` - // withdrawer_address is the bech32 address of account receiving the transaction fees - WithdrawerAddress string `protobuf:"bytes,3,opt,name=withdrawer_address,json=withdrawerAddress,proto3" json:"withdrawer_address,omitempty"` - // amount of revenue distributed - Amount string `protobuf:"bytes,4,opt,name=amount,proto3" json:"amount,omitempty"` -} - -func (m *EventDistributeRevenue) Reset() { *m = EventDistributeRevenue{} } -func (m *EventDistributeRevenue) String() string { return proto.CompactTextString(m) } -func (*EventDistributeRevenue) ProtoMessage() {} -func (*EventDistributeRevenue) Descriptor() ([]byte, []int) { - return fileDescriptor_56d63fc43f5946c2, []int{3} -} -func (m *EventDistributeRevenue) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *EventDistributeRevenue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_EventDistributeRevenue.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *EventDistributeRevenue) XXX_Merge(src proto.Message) { - xxx_messageInfo_EventDistributeRevenue.Merge(m, src) -} -func (m *EventDistributeRevenue) XXX_Size() int { - return m.Size() -} -func (m *EventDistributeRevenue) XXX_DiscardUnknown() { - xxx_messageInfo_EventDistributeRevenue.DiscardUnknown(m) -} - -var xxx_messageInfo_EventDistributeRevenue proto.InternalMessageInfo - -func (m *EventDistributeRevenue) GetSender() string { - if m != nil { - return m.Sender - } - return "" -} - -func (m *EventDistributeRevenue) GetContract() string { - if m != nil { - return m.Contract - } - return "" -} - -func (m *EventDistributeRevenue) GetWithdrawerAddress() string { - if m != nil { - return m.WithdrawerAddress - } - return "" -} - -func (m *EventDistributeRevenue) GetAmount() string { - if m != nil { - return m.Amount - } - return "" -} - -func init() { - proto.RegisterType((*EventRegisterRevenue)(nil), "evmos.revenue.v1.EventRegisterRevenue") - proto.RegisterType((*EventUpdateRevenue)(nil), "evmos.revenue.v1.EventUpdateRevenue") - proto.RegisterType((*EventCancelRevenue)(nil), "evmos.revenue.v1.EventCancelRevenue") - proto.RegisterType((*EventDistributeRevenue)(nil), "evmos.revenue.v1.EventDistributeRevenue") -} - -func init() { proto.RegisterFile("evmos/revenue/v1/events.proto", fileDescriptor_56d63fc43f5946c2) } - -var fileDescriptor_56d63fc43f5946c2 = []byte{ - // 337 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x92, 0xcf, 0x4a, 0xc3, 0x40, - 0x10, 0xc6, 0xbb, 0x55, 0x8a, 0xee, 0xc5, 0x1a, 0x4b, 0x29, 0x82, 0x41, 0x72, 0xd2, 0x43, 0x13, - 0x82, 0xe0, 0xdd, 0x7f, 0x78, 0x2f, 0x88, 0xe0, 0xa5, 0xa4, 0xd9, 0x69, 0xbb, 0xd2, 0x66, 0xc3, - 0xee, 0x64, 0x6b, 0xdf, 0x42, 0xf0, 0xe4, 0xc9, 0xd7, 0xf1, 0xd8, 0xa3, 0x47, 0x69, 0x5f, 0x44, - 0x92, 0xdd, 0xa4, 0x05, 0x7b, 0xf1, 0xe0, 0x25, 0x64, 0xe6, 0xfb, 0xb1, 0xdf, 0x37, 0xc3, 0xd0, - 0x13, 0xd0, 0x53, 0xa1, 0x02, 0x09, 0x1a, 0x92, 0x0c, 0x02, 0x1d, 0x06, 0xf9, 0x1f, 0x2a, 0x3f, - 0x95, 0x02, 0x85, 0xd3, 0x2c, 0x64, 0xdf, 0xca, 0xbe, 0x0e, 0xbd, 0x0f, 0x42, 0x5b, 0x77, 0x39, - 0xd2, 0x83, 0x11, 0x57, 0x08, 0xb2, 0x67, 0x34, 0xe7, 0x9c, 0x36, 0x19, 0xa4, 0x13, 0x31, 0x07, - 0xd9, 0x8f, 0x18, 0x93, 0xa0, 0x54, 0x87, 0x9c, 0x92, 0xb3, 0xfd, 0xde, 0x41, 0xd9, 0xbf, 0x32, - 0xed, 0x1c, 0x8d, 0x45, 0x82, 0x32, 0x8a, 0xb1, 0x42, 0xeb, 0x06, 0x2d, 0xfb, 0x25, 0x1a, 0xd2, - 0x16, 0x0c, 0x87, 0x10, 0x23, 0xd7, 0xd0, 0x9f, 0x71, 0x1c, 0x33, 0x19, 0xcd, 0x40, 0x76, 0x76, - 0x0a, 0xfc, 0xa8, 0xd2, 0x1e, 0x2b, 0xc9, 0x7b, 0x27, 0xd4, 0x29, 0x12, 0x3e, 0xa4, 0x2c, 0x42, - 0xd8, 0xc8, 0xf7, 0xcb, 0x94, 0x6c, 0x37, 0xdd, 0x36, 0x4a, 0x7d, 0xfb, 0x28, 0x5d, 0xea, 0xac, - 0x53, 0x55, 0xb0, 0x49, 0x77, 0xb8, 0x56, 0x2c, 0xee, 0x3d, 0xdb, 0x68, 0x37, 0x51, 0x12, 0xc3, - 0xe4, 0x5f, 0x57, 0xe7, 0xbd, 0x11, 0xda, 0x2e, 0xcc, 0x6e, 0xb9, 0x42, 0xc9, 0x07, 0xd9, 0x7a, - 0x17, 0x6d, 0xda, 0x50, 0x90, 0x30, 0x90, 0xd6, 0xc6, 0x56, 0xce, 0x31, 0xdd, 0x2b, 0x5f, 0xb1, - 0xaf, 0x56, 0xf5, 0x1f, 0x27, 0xcd, 0x2d, 0xa2, 0xa9, 0xc8, 0x12, 0xec, 0xec, 0x1a, 0x0b, 0x53, - 0x5d, 0xdf, 0x7f, 0x2e, 0x5d, 0xb2, 0x58, 0xba, 0xe4, 0x7b, 0xe9, 0x92, 0xd7, 0x95, 0x5b, 0x5b, - 0xac, 0xdc, 0xda, 0xd7, 0xca, 0xad, 0x3d, 0x75, 0x47, 0x1c, 0xc7, 0xd9, 0xc0, 0x8f, 0xc5, 0x34, - 0x30, 0x57, 0x69, 0xbe, 0x3a, 0xbc, 0x0c, 0x5e, 0x36, 0x2f, 0x14, 0xe7, 0x29, 0xa8, 0x41, 0xa3, - 0xb8, 0xd0, 0x8b, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3e, 0x09, 0xec, 0x92, 0xc2, 0x02, 0x00, - 0x00, -} - -func (m *EventRegisterRevenue) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *EventRegisterRevenue) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EventRegisterRevenue) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.EffectiveWithdrawer) > 0 { - i -= len(m.EffectiveWithdrawer) - copy(dAtA[i:], m.EffectiveWithdrawer) - i = encodeVarintEvents(dAtA, i, uint64(len(m.EffectiveWithdrawer))) - i-- - dAtA[i] = 0x1a - } - if len(m.ContractAddress) > 0 { - i -= len(m.ContractAddress) - copy(dAtA[i:], m.ContractAddress) - i = encodeVarintEvents(dAtA, i, uint64(len(m.ContractAddress))) - i-- - dAtA[i] = 0x12 - } - if len(m.DeployerAddress) > 0 { - i -= len(m.DeployerAddress) - copy(dAtA[i:], m.DeployerAddress) - i = encodeVarintEvents(dAtA, i, uint64(len(m.DeployerAddress))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *EventUpdateRevenue) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *EventUpdateRevenue) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EventUpdateRevenue) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.WithdrawerAddress) > 0 { - i -= len(m.WithdrawerAddress) - copy(dAtA[i:], m.WithdrawerAddress) - i = encodeVarintEvents(dAtA, i, uint64(len(m.WithdrawerAddress))) - i-- - dAtA[i] = 0x1a - } - if len(m.DeployerAddress) > 0 { - i -= len(m.DeployerAddress) - copy(dAtA[i:], m.DeployerAddress) - i = encodeVarintEvents(dAtA, i, uint64(len(m.DeployerAddress))) - i-- - dAtA[i] = 0x12 - } - if len(m.ContractAddress) > 0 { - i -= len(m.ContractAddress) - copy(dAtA[i:], m.ContractAddress) - i = encodeVarintEvents(dAtA, i, uint64(len(m.ContractAddress))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *EventCancelRevenue) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *EventCancelRevenue) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EventCancelRevenue) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.ContractAddress) > 0 { - i -= len(m.ContractAddress) - copy(dAtA[i:], m.ContractAddress) - i = encodeVarintEvents(dAtA, i, uint64(len(m.ContractAddress))) - i-- - dAtA[i] = 0x12 - } - if len(m.DeployerAddress) > 0 { - i -= len(m.DeployerAddress) - copy(dAtA[i:], m.DeployerAddress) - i = encodeVarintEvents(dAtA, i, uint64(len(m.DeployerAddress))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *EventDistributeRevenue) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *EventDistributeRevenue) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EventDistributeRevenue) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Amount) > 0 { - i -= len(m.Amount) - copy(dAtA[i:], m.Amount) - i = encodeVarintEvents(dAtA, i, uint64(len(m.Amount))) - i-- - dAtA[i] = 0x22 - } - if len(m.WithdrawerAddress) > 0 { - i -= len(m.WithdrawerAddress) - copy(dAtA[i:], m.WithdrawerAddress) - i = encodeVarintEvents(dAtA, i, uint64(len(m.WithdrawerAddress))) - i-- - dAtA[i] = 0x1a - } - if len(m.Contract) > 0 { - i -= len(m.Contract) - copy(dAtA[i:], m.Contract) - i = encodeVarintEvents(dAtA, i, uint64(len(m.Contract))) - i-- - dAtA[i] = 0x12 - } - if len(m.Sender) > 0 { - i -= len(m.Sender) - copy(dAtA[i:], m.Sender) - i = encodeVarintEvents(dAtA, i, uint64(len(m.Sender))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func encodeVarintEvents(dAtA []byte, offset int, v uint64) int { - offset -= sovEvents(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *EventRegisterRevenue) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.DeployerAddress) - if l > 0 { - n += 1 + l + sovEvents(uint64(l)) - } - l = len(m.ContractAddress) - if l > 0 { - n += 1 + l + sovEvents(uint64(l)) - } - l = len(m.EffectiveWithdrawer) - if l > 0 { - n += 1 + l + sovEvents(uint64(l)) - } - return n -} - -func (m *EventUpdateRevenue) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.ContractAddress) - if l > 0 { - n += 1 + l + sovEvents(uint64(l)) - } - l = len(m.DeployerAddress) - if l > 0 { - n += 1 + l + sovEvents(uint64(l)) - } - l = len(m.WithdrawerAddress) - if l > 0 { - n += 1 + l + sovEvents(uint64(l)) - } - return n -} - -func (m *EventCancelRevenue) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.DeployerAddress) - if l > 0 { - n += 1 + l + sovEvents(uint64(l)) - } - l = len(m.ContractAddress) - if l > 0 { - n += 1 + l + sovEvents(uint64(l)) - } - return n -} - -func (m *EventDistributeRevenue) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Sender) - if l > 0 { - n += 1 + l + sovEvents(uint64(l)) - } - l = len(m.Contract) - if l > 0 { - n += 1 + l + sovEvents(uint64(l)) - } - l = len(m.WithdrawerAddress) - if l > 0 { - n += 1 + l + sovEvents(uint64(l)) - } - l = len(m.Amount) - if l > 0 { - n += 1 + l + sovEvents(uint64(l)) - } - return n -} - -func sovEvents(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozEvents(x uint64) (n int) { - return sovEvents(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *EventRegisterRevenue) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: EventRegisterRevenue: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EventRegisterRevenue: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DeployerAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.DeployerAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ContractAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ContractAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EffectiveWithdrawer", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.EffectiveWithdrawer = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvents(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvents - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *EventUpdateRevenue) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: EventUpdateRevenue: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EventUpdateRevenue: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ContractAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ContractAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DeployerAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.DeployerAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field WithdrawerAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.WithdrawerAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvents(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvents - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *EventCancelRevenue) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: EventCancelRevenue: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EventCancelRevenue: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DeployerAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.DeployerAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ContractAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ContractAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvents(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvents - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *EventDistributeRevenue) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: EventDistributeRevenue: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EventDistributeRevenue: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Sender = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Contract", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Contract = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field WithdrawerAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.WithdrawerAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Amount", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Amount = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvents(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvents - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipEvents(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowEvents - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowEvents - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowEvents - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthEvents - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupEvents - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthEvents - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthEvents = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowEvents = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupEvents = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/revenue/v1/types/genesis.go b/x/revenue/v1/types/genesis.go deleted file mode 100644 index 7181581add..0000000000 --- a/x/revenue/v1/types/genesis.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:LGPL-3.0-only - -package types - -import "fmt" - -// NewGenesisState creates a new genesis state. -func NewGenesisState(params Params, revenues []Revenue) GenesisState { - return GenesisState{ - Params: params, - Revenues: revenues, - } -} - -// DefaultGenesisState sets default evm genesis state with empty accounts and -// default params and chain config values. -func DefaultGenesisState() *GenesisState { - return &GenesisState{ - Params: DefaultParams(), - } -} - -// Validate performs basic genesis state validation returning an error upon any -// failure. -func (gs GenesisState) Validate() error { - seenContract := make(map[string]bool) - for _, fs := range gs.Revenues { - // only one fee per contract - if seenContract[fs.ContractAddress] { - return fmt.Errorf("contract duplicated on genesis '%s'", fs.ContractAddress) - } - - if err := fs.Validate(); err != nil { - return err - } - - seenContract[fs.ContractAddress] = true - } - - return gs.Params.Validate() -} diff --git a/x/revenue/v1/types/genesis.pb.go b/x/revenue/v1/types/genesis.pb.go deleted file mode 100644 index 8cf1e9ab64..0000000000 --- a/x/revenue/v1/types/genesis.pb.go +++ /dev/null @@ -1,644 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: evmos/revenue/v1/genesis.proto - -package types - -import ( - cosmossdk_io_math "cosmossdk.io/math" - fmt "fmt" - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// GenesisState defines the module's genesis state. -type GenesisState struct { - // params are the revenue module parameters - Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"` - // revenues is a slice of active registered contracts for fee distribution - Revenues []Revenue `protobuf:"bytes,2,rep,name=revenues,proto3" json:"revenues"` -} - -func (m *GenesisState) Reset() { *m = GenesisState{} } -func (m *GenesisState) String() string { return proto.CompactTextString(m) } -func (*GenesisState) ProtoMessage() {} -func (*GenesisState) Descriptor() ([]byte, []int) { - return fileDescriptor_649d64d9c3438055, []int{0} -} -func (m *GenesisState) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GenesisState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GenesisState.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *GenesisState) XXX_Merge(src proto.Message) { - xxx_messageInfo_GenesisState.Merge(m, src) -} -func (m *GenesisState) XXX_Size() int { - return m.Size() -} -func (m *GenesisState) XXX_DiscardUnknown() { - xxx_messageInfo_GenesisState.DiscardUnknown(m) -} - -var xxx_messageInfo_GenesisState proto.InternalMessageInfo - -func (m *GenesisState) GetParams() Params { - if m != nil { - return m.Params - } - return Params{} -} - -func (m *GenesisState) GetRevenues() []Revenue { - if m != nil { - return m.Revenues - } - return nil -} - -// Params defines the revenue module params -type Params struct { - // enable_revenue defines a parameter to enable the revenue module - EnableRevenue bool `protobuf:"varint,1,opt,name=enable_revenue,json=enableRevenue,proto3" json:"enable_revenue,omitempty"` - // developer_shares defines the proportion of the transaction fees to be - // distributed to the registered contract owner - DeveloperShares cosmossdk_io_math.LegacyDec `protobuf:"bytes,2,opt,name=developer_shares,json=developerShares,proto3,customtype=cosmossdk.io/math.LegacyDec" json:"developer_shares"` - // addr_derivation_cost_create defines the cost of address derivation for - // verifying the contract deployer at fee registration - AddrDerivationCostCreate uint64 `protobuf:"varint,3,opt,name=addr_derivation_cost_create,json=addrDerivationCostCreate,proto3" json:"addr_derivation_cost_create,omitempty"` -} - -func (m *Params) Reset() { *m = Params{} } -func (m *Params) String() string { return proto.CompactTextString(m) } -func (*Params) ProtoMessage() {} -func (*Params) Descriptor() ([]byte, []int) { - return fileDescriptor_649d64d9c3438055, []int{1} -} -func (m *Params) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Params) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Params.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Params) XXX_Merge(src proto.Message) { - xxx_messageInfo_Params.Merge(m, src) -} -func (m *Params) XXX_Size() int { - return m.Size() -} -func (m *Params) XXX_DiscardUnknown() { - xxx_messageInfo_Params.DiscardUnknown(m) -} - -var xxx_messageInfo_Params proto.InternalMessageInfo - -func (m *Params) GetEnableRevenue() bool { - if m != nil { - return m.EnableRevenue - } - return false -} - -func (m *Params) GetAddrDerivationCostCreate() uint64 { - if m != nil { - return m.AddrDerivationCostCreate - } - return 0 -} - -func init() { - proto.RegisterType((*GenesisState)(nil), "evmos.revenue.v1.GenesisState") - proto.RegisterType((*Params)(nil), "evmos.revenue.v1.Params") -} - -func init() { proto.RegisterFile("evmos/revenue/v1/genesis.proto", fileDescriptor_649d64d9c3438055) } - -var fileDescriptor_649d64d9c3438055 = []byte{ - // 354 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x91, 0x41, 0x6b, 0xea, 0x40, - 0x14, 0x85, 0x33, 0x4f, 0x11, 0xdf, 0xf8, 0x5e, 0x2b, 0xa1, 0x8b, 0x54, 0x21, 0x8a, 0xa5, 0x90, - 0x4d, 0x27, 0x68, 0xc1, 0x4d, 0xe9, 0x46, 0x05, 0x37, 0xa5, 0x94, 0xb8, 0xeb, 0x26, 0x8c, 0xc9, - 0x25, 0x86, 0x9a, 0x4c, 0x98, 0x19, 0x43, 0x5d, 0xf7, 0x0f, 0xf4, 0x17, 0x75, 0xed, 0xd2, 0x65, - 0xe9, 0x42, 0x8a, 0xfe, 0x91, 0xe2, 0x4c, 0x2a, 0xa5, 0x6e, 0x86, 0xcb, 0x3d, 0xe7, 0x3b, 0x77, - 0xe0, 0x60, 0x1b, 0xf2, 0x84, 0x09, 0x97, 0x43, 0x0e, 0xe9, 0x02, 0xdc, 0xbc, 0xeb, 0x46, 0x90, - 0x82, 0x88, 0x05, 0xc9, 0x38, 0x93, 0xcc, 0xac, 0x2b, 0x9d, 0x14, 0x3a, 0xc9, 0xbb, 0x8d, 0x63, - 0xe2, 0x5b, 0x54, 0x44, 0xe3, 0x2c, 0x62, 0x11, 0x53, 0xa3, 0xbb, 0x9f, 0xf4, 0xb6, 0xf3, 0x82, - 0xf0, 0xbf, 0xb1, 0x4e, 0x9e, 0x48, 0x2a, 0xc1, 0xec, 0xe3, 0x4a, 0x46, 0x39, 0x4d, 0x84, 0x85, - 0xda, 0xc8, 0xa9, 0xf5, 0x2c, 0xf2, 0xfb, 0x12, 0x79, 0x50, 0xfa, 0xa0, 0xbc, 0xda, 0xb4, 0x0c, - 0xaf, 0x70, 0x9b, 0x37, 0xb8, 0x5a, 0x58, 0x84, 0xf5, 0xa7, 0x5d, 0x72, 0x6a, 0xbd, 0xf3, 0x63, - 0xd2, 0xd3, 0x63, 0x81, 0x1e, 0x80, 0xce, 0x1b, 0xc2, 0x15, 0x9d, 0x6a, 0x5e, 0xe2, 0x13, 0x48, - 0xe9, 0x74, 0x0e, 0x7e, 0xa1, 0xaa, 0x7f, 0x54, 0xbd, 0xff, 0x7a, 0x5b, 0x24, 0x98, 0xf7, 0xb8, - 0x1e, 0x42, 0x0e, 0x73, 0x96, 0x01, 0xf7, 0xc5, 0x8c, 0x72, 0x75, 0x16, 0x39, 0x7f, 0x07, 0x17, - 0xfb, 0xec, 0x8f, 0x4d, 0xab, 0x19, 0x30, 0x91, 0x30, 0x21, 0xc2, 0x27, 0x12, 0x33, 0x37, 0xa1, - 0x72, 0x46, 0xee, 0x20, 0xa2, 0xc1, 0x72, 0x04, 0x81, 0x77, 0x7a, 0x80, 0x27, 0x8a, 0x35, 0x6f, - 0x71, 0x93, 0x86, 0x21, 0xf7, 0x43, 0xe0, 0x71, 0x4e, 0x65, 0xcc, 0x52, 0x3f, 0x60, 0x42, 0xfa, - 0x01, 0x07, 0x2a, 0xc1, 0x2a, 0xb5, 0x91, 0x53, 0xf6, 0xac, 0xbd, 0x65, 0x74, 0x70, 0x0c, 0x99, - 0x90, 0x43, 0xa5, 0x0f, 0xc6, 0xab, 0xad, 0x8d, 0xd6, 0x5b, 0x1b, 0x7d, 0x6e, 0x6d, 0xf4, 0xba, - 0xb3, 0x8d, 0xf5, 0xce, 0x36, 0xde, 0x77, 0xb6, 0xf1, 0x78, 0x15, 0xc5, 0x72, 0xb6, 0x98, 0x92, - 0x80, 0x25, 0xae, 0x6e, 0x48, 0xbf, 0x79, 0xb7, 0xef, 0x3e, 0xff, 0x6c, 0x4b, 0x2e, 0x33, 0x10, - 0xd3, 0x8a, 0xaa, 0xe5, 0xfa, 0x2b, 0x00, 0x00, 0xff, 0xff, 0xf2, 0xb9, 0x03, 0xf9, 0x00, 0x02, - 0x00, 0x00, -} - -func (m *GenesisState) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GenesisState) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Revenues) > 0 { - for iNdEx := len(m.Revenues) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Revenues[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - { - size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *Params) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Params) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.AddrDerivationCostCreate != 0 { - i = encodeVarintGenesis(dAtA, i, uint64(m.AddrDerivationCostCreate)) - i-- - dAtA[i] = 0x18 - } - { - size := m.DeveloperShares.Size() - i -= size - if _, err := m.DeveloperShares.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - if m.EnableRevenue { - i-- - if m.EnableRevenue { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func encodeVarintGenesis(dAtA []byte, offset int, v uint64) int { - offset -= sovGenesis(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *GenesisState) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Params.Size() - n += 1 + l + sovGenesis(uint64(l)) - if len(m.Revenues) > 0 { - for _, e := range m.Revenues { - l = e.Size() - n += 1 + l + sovGenesis(uint64(l)) - } - } - return n -} - -func (m *Params) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.EnableRevenue { - n += 2 - } - l = m.DeveloperShares.Size() - n += 1 + l + sovGenesis(uint64(l)) - if m.AddrDerivationCostCreate != 0 { - n += 1 + sovGenesis(uint64(m.AddrDerivationCostCreate)) - } - return n -} - -func sovGenesis(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozGenesis(x uint64) (n int) { - return sovGenesis(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *GenesisState) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: GenesisState: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GenesisState: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Revenues", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Revenues = append(m.Revenues, Revenue{}) - if err := m.Revenues[len(m.Revenues)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenesis(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenesis - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Params) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Params: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Params: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field EnableRevenue", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.EnableRevenue = bool(v != 0) - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DeveloperShares", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.DeveloperShares.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field AddrDerivationCostCreate", wireType) - } - m.AddrDerivationCostCreate = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.AddrDerivationCostCreate |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipGenesis(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenesis - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipGenesis(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenesis - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenesis - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenesis - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthGenesis - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupGenesis - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthGenesis - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthGenesis = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowGenesis = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupGenesis = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/revenue/v1/types/genesis_test.go b/x/revenue/v1/types/genesis_test.go deleted file mode 100644 index 7ca9aeaa47..0000000000 --- a/x/revenue/v1/types/genesis_test.go +++ /dev/null @@ -1,173 +0,0 @@ -package types_test - -import ( - "testing" - - sdk "github.com/cosmos/cosmos-sdk/types" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/x/revenue/v1/types" - "github.com/stretchr/testify/suite" -) - -type GenesisTestSuite struct { - suite.Suite - address1 string - address2 string -} - -func TestGenesisTestSuite(t *testing.T) { - suite.Run(t, new(GenesisTestSuite)) -} - -func (suite *GenesisTestSuite) SetupTest() { - suite.address1 = sdk.AccAddress(utiltx.GenerateAddress().Bytes()).String() - suite.address2 = sdk.AccAddress(utiltx.GenerateAddress().Bytes()).String() -} - -func (suite *GenesisTestSuite) TestValidateGenesis() { - newGen := types.NewGenesisState(types.DefaultParams(), []types.Revenue{}) - testCases := []struct { - name string - genState *types.GenesisState - expPass bool - }{ - { - name: "valid genesis constructor", - genState: &newGen, - expPass: true, - }, - { - name: "default", - genState: types.DefaultGenesisState(), - expPass: true, - }, - { - name: "valid genesis", - genState: &types.GenesisState{ - Params: types.DefaultParams(), - Revenues: []types.Revenue{}, - }, - expPass: true, - }, - { - name: "valid genesis - with fee", - genState: &types.GenesisState{ - Params: types.DefaultParams(), - Revenues: []types.Revenue{ - { - ContractAddress: "0xdac17f958d2ee523a2206206994597c13d831ec7", - DeployerAddress: suite.address1, - }, - { - ContractAddress: "0xdac17f958d2ee523a2206206994597c13d831ec8", - DeployerAddress: suite.address2, - WithdrawerAddress: suite.address2, - }, - }, - }, - expPass: true, - }, - { - name: "empty genesis", - genState: &types.GenesisState{}, - expPass: false, - }, - { - name: "invalid genesis - duplicated fee", - genState: &types.GenesisState{ - Params: types.DefaultParams(), - Revenues: []types.Revenue{ - { - ContractAddress: "0xdac17f958d2ee523a2206206994597c13d831ec7", - DeployerAddress: suite.address1, - }, - { - ContractAddress: "0xdac17f958d2ee523a2206206994597c13d831ec7", - DeployerAddress: suite.address1, - }, - }, - }, - expPass: false, - }, - { - name: "invalid genesis - duplicated fee with different deployer address", - genState: &types.GenesisState{ - Params: types.DefaultParams(), - Revenues: []types.Revenue{ - { - ContractAddress: "0xdac17f958d2ee523a2206206994597c13d831ec7", - DeployerAddress: suite.address1, - }, - { - ContractAddress: "0xdac17f958d2ee523a2206206994597c13d831ec7", - DeployerAddress: suite.address2, - }, - }, - }, - expPass: false, - }, - { - name: "invalid genesis - invalid contract address", - genState: &types.GenesisState{ - Params: types.DefaultParams(), - Revenues: []types.Revenue{ - { - ContractAddress: suite.address1, - DeployerAddress: suite.address1, - }, - }, - }, - expPass: false, - }, - { - name: "invalid genesis - invalid deployer address", - genState: &types.GenesisState{ - Params: types.DefaultParams(), - Revenues: []types.Revenue{ - { - ContractAddress: "0xdac17f958d2ee523a2206206994597c13d831ec7", - DeployerAddress: "0xdac17f958d2ee523a2206206994597c13d831ec7", - }, - }, - }, - expPass: false, - }, - { - name: "invalid genesis - invalid withdraw address", - genState: &types.GenesisState{ - Params: types.DefaultParams(), - Revenues: []types.Revenue{ - { - ContractAddress: "0xdac17f958d2ee523a2206206994597c13d831ec7", - DeployerAddress: suite.address1, - WithdrawerAddress: "0xdac17f958d2ee523a2206206994597c13d831ec7", - }, - }, - }, - expPass: false, - }, - { - name: "invalid genesis - invalid withdrawer address", - genState: &types.GenesisState{ - Params: types.DefaultParams(), - Revenues: []types.Revenue{ - { - ContractAddress: "0xdac17f958d2ee523a2206206994597c13d831ec7", - DeployerAddress: suite.address1, - WithdrawerAddress: "withdraw", - }, - }, - }, - expPass: false, - }, - } - - for _, tc := range testCases { - err := tc.genState.Validate() - if tc.expPass { - suite.Require().NoError(err, tc.name) - } else { - suite.Require().Error(err, tc.name) - } - } -} diff --git a/x/revenue/v1/types/interfaces.go b/x/revenue/v1/types/interfaces.go deleted file mode 100644 index 40b1a87e1f..0000000000 --- a/x/revenue/v1/types/interfaces.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:LGPL-3.0-only - -package types - -import ( - "math/big" - - paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - - "github.com/ethereum/go-ethereum/common" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/evmos/evmos/v16/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" -) - -// AccountKeeper defines the expected interface needed to retrieve account info. -type AccountKeeper interface { - GetModuleAddress(moduleName string) sdk.AccAddress -} - -// BankKeeper defines the expected interface needed to retrieve account balances. -type BankKeeper interface { - SendCoinsFromModuleToAccount(ctx sdk.Context, senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins) error - SendCoinsFromAccountToModule(ctx sdk.Context, senderAddr sdk.AccAddress, recipientModule string, amt sdk.Coins) error - BurnCoins(ctx sdk.Context, moduleName string, amt sdk.Coins) error - GetBalance(ctx sdk.Context, addr sdk.AccAddress, denom string) sdk.Coin - GetAllBalances(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins -} - -// DistributionKeeper defines the expected interface needed to send funds to the community pool. -type DistributionKeeper interface { - FundCommunityPool(ctx sdk.Context, amount sdk.Coins, sender sdk.AccAddress) error -} - -// EVMKeeper defines the expected EVM keeper interface used on erc20 -type EVMKeeper interface { - EVMConfig(ctx sdk.Context, proposerAddress sdk.ConsAddress, chainID *big.Int) (*statedb.EVMConfig, error) - GetParams(ctx sdk.Context) evmtypes.Params - GetAccountWithoutBalance(ctx sdk.Context, addr common.Address) *statedb.Account -} - -type ( - LegacyParams = paramtypes.ParamSet - // Subspace defines an interface that implements the legacy Cosmos SDK x/params Subspace type. - // NOTE: This is used solely for migration of the Cosmos SDK x/params managed parameters. - Subspace interface { - GetParamSetIfExists(ctx sdk.Context, ps LegacyParams) - WithKeyTable(table paramtypes.KeyTable) paramtypes.Subspace - } -) diff --git a/x/revenue/v1/types/keys.go b/x/revenue/v1/types/keys.go deleted file mode 100644 index ac3a86cb43..0000000000 --- a/x/revenue/v1/types/keys.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:LGPL-3.0-only - -package types - -import sdk "github.com/cosmos/cosmos-sdk/types" - -// constants -const ( - // module name - ModuleName = "revenue" - - // StoreKey to be used when creating the KVStore - StoreKey = ModuleName - - // RouterKey to be used for message routing - RouterKey = ModuleName -) - -// prefix bytes for the fees persistent store -const ( - prefixRevenue = iota + 1 - prefixDeployer - prefixWithdrawer -) - -// KVStore key prefixes -var ( - KeyPrefixRevenue = []byte{prefixRevenue} - KeyPrefixDeployer = []byte{prefixDeployer} - KeyPrefixWithdrawer = []byte{prefixWithdrawer} -) - -// GetKeyPrefixDeployer returns the KVStore key prefix for storing -// registered revenue contract for a deployer -func GetKeyPrefixDeployer(deployerAddress sdk.AccAddress) []byte { - return append(KeyPrefixDeployer, deployerAddress.Bytes()...) -} - -// GetKeyPrefixWithdrawer returns the KVStore key prefix for storing -// registered revenue contract for a withdrawer -func GetKeyPrefixWithdrawer(withdrawerAddress sdk.AccAddress) []byte { - return append(KeyPrefixWithdrawer, withdrawerAddress.Bytes()...) -} diff --git a/x/revenue/v1/types/msg.go b/x/revenue/v1/types/msg.go deleted file mode 100644 index 85d7bd5f5d..0000000000 --- a/x/revenue/v1/types/msg.go +++ /dev/null @@ -1,197 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:LGPL-3.0-only - -package types - -import ( - errorsmod "cosmossdk.io/errors" - sdk "github.com/cosmos/cosmos-sdk/types" - errortypes "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/ethereum/go-ethereum/common" - evmostypes "github.com/evmos/evmos/v16/types" -) - -var ( - _ sdk.Msg = &MsgRegisterRevenue{} - _ sdk.Msg = &MsgCancelRevenue{} - _ sdk.Msg = &MsgUpdateRevenue{} - _ sdk.Msg = &MsgUpdateParams{} -) - -const ( - TypeMsgRegisterRevenue = "register_revenue" - TypeMsgCancelRevenue = "cancel_revenue" - TypeMsgUpdateRevenue = "update_revenue" -) - -// NewMsgRegisterRevenue creates new instance of MsgRegisterRevenue -func NewMsgRegisterRevenue( - contract common.Address, - deployer, - withdrawer sdk.AccAddress, - nonces []uint64, -) *MsgRegisterRevenue { - withdrawerAddress := "" - if withdrawer != nil { - withdrawerAddress = withdrawer.String() - } - - return &MsgRegisterRevenue{ - ContractAddress: contract.String(), - DeployerAddress: deployer.String(), - WithdrawerAddress: withdrawerAddress, - Nonces: nonces, - } -} - -// Route returns the name of the module -func (msg MsgRegisterRevenue) Route() string { return RouterKey } - -// Type returns the the action -func (msg MsgRegisterRevenue) Type() string { return TypeMsgRegisterRevenue } - -// ValidateBasic runs stateless checks on the message -func (msg MsgRegisterRevenue) ValidateBasic() error { - if _, err := sdk.AccAddressFromBech32(msg.DeployerAddress); err != nil { - return errorsmod.Wrapf(err, "invalid deployer address %s", msg.DeployerAddress) - } - - if err := evmostypes.ValidateNonZeroAddress(msg.ContractAddress); err != nil { - return errorsmod.Wrapf(err, "invalid contract address %s", msg.ContractAddress) - } - - if msg.WithdrawerAddress != "" { - if _, err := sdk.AccAddressFromBech32(msg.WithdrawerAddress); err != nil { - return errorsmod.Wrapf(err, "invalid withdraw address %s", msg.WithdrawerAddress) - } - } - - if len(msg.Nonces) < 1 { - return errorsmod.Wrapf(errortypes.ErrInvalidRequest, "invalid nonces - empty array") - } - - if len(msg.Nonces) > 20 { - return errorsmod.Wrapf(errortypes.ErrInvalidRequest, "invalid nonces - array length must be less than 20") - } - - return nil -} - -// GetSignBytes encodes the message for signing -func (msg *MsgRegisterRevenue) GetSignBytes() []byte { - return sdk.MustSortJSON(AminoCdc.MustMarshalJSON(msg)) -} - -// GetSigners defines whose signature is required -func (msg MsgRegisterRevenue) GetSigners() []sdk.AccAddress { - from := sdk.MustAccAddressFromBech32(msg.DeployerAddress) - return []sdk.AccAddress{from} -} - -// NewMsgCancelRevenue creates new instance of MsgCancelRevenue. -func NewMsgCancelRevenue( - contract common.Address, - deployer sdk.AccAddress, -) *MsgCancelRevenue { - return &MsgCancelRevenue{ - ContractAddress: contract.String(), - DeployerAddress: deployer.String(), - } -} - -// Route returns the message route for a MsgCancelRevenue. -func (msg MsgCancelRevenue) Route() string { return RouterKey } - -// Type returns the message type for a MsgCancelRevenue. -func (msg MsgCancelRevenue) Type() string { return TypeMsgCancelRevenue } - -// ValidateBasic runs stateless checks on the message -func (msg MsgCancelRevenue) ValidateBasic() error { - if _, err := sdk.AccAddressFromBech32(msg.DeployerAddress); err != nil { - return errorsmod.Wrapf(err, "invalid deployer address %s", msg.DeployerAddress) - } - - if err := evmostypes.ValidateNonZeroAddress(msg.ContractAddress); err != nil { - return errorsmod.Wrapf(err, "invalid contract address %s", msg.ContractAddress) - } - - return nil -} - -// GetSignBytes encodes the message for signing -func (msg *MsgCancelRevenue) GetSignBytes() []byte { - return sdk.MustSortJSON(AminoCdc.MustMarshalJSON(msg)) -} - -// GetSigners defines whose signature is required -func (msg MsgCancelRevenue) GetSigners() []sdk.AccAddress { - funder := sdk.MustAccAddressFromBech32(msg.DeployerAddress) - return []sdk.AccAddress{funder} -} - -// NewMsgUpdateRevenue creates new instance of MsgUpdateRevenue -func NewMsgUpdateRevenue( - contract common.Address, - deployer, - withdraw sdk.AccAddress, -) *MsgUpdateRevenue { - return &MsgUpdateRevenue{ - ContractAddress: contract.String(), - DeployerAddress: deployer.String(), - WithdrawerAddress: withdraw.String(), - } -} - -// Route returns the name of the module -func (msg MsgUpdateRevenue) Route() string { return RouterKey } - -// Type returns the the action -func (msg MsgUpdateRevenue) Type() string { return TypeMsgUpdateRevenue } - -// ValidateBasic runs stateless checks on the message -func (msg MsgUpdateRevenue) ValidateBasic() error { - if _, err := sdk.AccAddressFromBech32(msg.DeployerAddress); err != nil { - return errorsmod.Wrapf(err, "invalid deployer address %s", msg.DeployerAddress) - } - - if err := evmostypes.ValidateNonZeroAddress(msg.ContractAddress); err != nil { - return errorsmod.Wrapf(err, "invalid contract address %s", msg.ContractAddress) - } - - if _, err := sdk.AccAddressFromBech32(msg.WithdrawerAddress); err != nil { - return errorsmod.Wrapf(err, "invalid withdraw address %s", msg.WithdrawerAddress) - } - - return nil -} - -// GetSignBytes encodes the message for signing -func (msg *MsgUpdateRevenue) GetSignBytes() []byte { - return sdk.MustSortJSON(AminoCdc.MustMarshalJSON(msg)) -} - -// GetSigners defines whose signature is required -func (msg MsgUpdateRevenue) GetSigners() []sdk.AccAddress { - from := sdk.MustAccAddressFromBech32(msg.DeployerAddress) - return []sdk.AccAddress{from} -} - -// GetSigners returns the expected signers for a MsgUpdateParams message. -func (m *MsgUpdateParams) GetSigners() []sdk.AccAddress { - addr := sdk.MustAccAddressFromBech32(m.Authority) - return []sdk.AccAddress{addr} -} - -// ValidateBasic does a sanity check of the provided data -func (m *MsgUpdateParams) ValidateBasic() error { - if _, err := sdk.AccAddressFromBech32(m.Authority); err != nil { - return errorsmod.Wrap(err, "invalid authority address") - } - - return m.Params.Validate() -} - -// GetSignBytes implements the LegacyMsg interface. -func (m MsgUpdateParams) GetSignBytes() []byte { - return sdk.MustSortJSON(AminoCdc.MustMarshalJSON(&m)) -} diff --git a/x/revenue/v1/types/msg_test.go b/x/revenue/v1/types/msg_test.go deleted file mode 100644 index 54bf6976af..0000000000 --- a/x/revenue/v1/types/msg_test.go +++ /dev/null @@ -1,294 +0,0 @@ -package types_test - -import ( - "testing" - - "github.com/stretchr/testify/suite" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - - utiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/x/revenue/v1/types" -) - -type MsgsTestSuite struct { - suite.Suite - contract common.Address - deployer sdk.AccAddress - deployerStr string - withdrawerStr string -} - -func TestMsgsTestSuite(t *testing.T) { - suite.Run(t, new(MsgsTestSuite)) -} - -func (suite *MsgsTestSuite) SetupTest() { - deployer := utiltx.GenerateAddress() - suite.contract = crypto.CreateAddress(deployer, 1) - suite.deployer = sdk.AccAddress(deployer.Bytes()) - suite.deployerStr = suite.deployer.String() - suite.withdrawerStr = sdk.AccAddress(utiltx.GenerateAddress().Bytes()).String() -} - -func (suite *MsgsTestSuite) TestMsgRegisterRevenueGetters() { - msgInvalid := types.MsgRegisterRevenue{} - msg := types.NewMsgRegisterRevenue( - suite.contract, - suite.deployer, - suite.deployer, - []uint64{1}, - ) - suite.Require().Equal(types.RouterKey, msg.Route()) - suite.Require().Equal(types.TypeMsgRegisterRevenue, msg.Type()) - suite.Require().NotNil(msgInvalid.GetSignBytes()) - suite.Require().NotNil(msg.GetSigners()) -} - -func (suite *MsgsTestSuite) TestMsgRegisterRevenueNew() { - testCases := []struct { - msg string - contract string - deployer string - withdraw string - nonces []uint64 - expectPass bool - }{ - { - "pass", - suite.contract.String(), - suite.deployerStr, - suite.withdrawerStr, - []uint64{1}, - true, - }, - { - "pass - empty withdrawer address", - suite.contract.String(), - suite.deployerStr, - "", - []uint64{1}, - true, - }, - { - "pass - same withdrawer and deployer address", - suite.contract.String(), - suite.deployerStr, - suite.deployerStr, - []uint64{1}, - true, - }, - { - "invalid contract address", - "", - suite.deployerStr, - suite.withdrawerStr, - []uint64{1}, - false, - }, - { - "must not be zero: invalid address", - "0x0000000000000000000000000000000000000000", - suite.deployerStr, - suite.withdrawerStr, - []uint64{1}, - false, - }, - { - "invalid deployer address", - suite.contract.String(), - "", - suite.withdrawerStr, - []uint64{1}, - false, - }, - { - "invalid withdraw address", - suite.contract.String(), - suite.deployerStr, - "withdraw", - []uint64{1}, - false, - }, - { - "invalid nonces", - suite.contract.String(), - suite.deployerStr, - suite.withdrawerStr, - []uint64{}, - false, - }, - { - "invalid nonces - array length must be less than 20", - suite.contract.String(), - suite.deployerStr, - suite.withdrawerStr, - []uint64{1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - false, - }, - } - - for i, tc := range testCases { - tx := types.MsgRegisterRevenue{ - ContractAddress: tc.contract, - DeployerAddress: tc.deployer, - WithdrawerAddress: tc.withdraw, - Nonces: tc.nonces, - } - err := tx.ValidateBasic() - - if tc.expectPass { - suite.Require().NoError(err, "valid test %d failed: %s", i, tc.msg) - } else { - suite.Require().Error(err, "invalid test %d passed: %s", i, tc.msg) - suite.Require().Contains(err.Error(), tc.msg) - } - } -} - -func (suite *MsgsTestSuite) TestMsgCancelRevenueGetters() { - msgInvalid := types.MsgCancelRevenue{} - msg := types.NewMsgCancelRevenue( - suite.contract, - sdk.AccAddress(suite.deployer.Bytes()), - ) - suite.Require().Equal(types.RouterKey, msg.Route()) - suite.Require().Equal(types.TypeMsgCancelRevenue, msg.Type()) - suite.Require().NotNil(msgInvalid.GetSignBytes()) - suite.Require().NotNil(msg.GetSigners()) -} - -func (suite *MsgsTestSuite) TestMsgCancelRevenueNew() { - testCases := []struct { - msg string - contract string - deployer string - expectPass bool - }{ - { - "msg cancel contract fee - pass", - suite.contract.String(), - suite.deployerStr, - true, - }, - { - "invalid contract address", - "", - suite.deployerStr, - false, - }, - { - "must not be zero: invalid address", - "0x0000000000000000000000000000000000000000", - suite.deployerStr, - false, - }, - { - "invalid deployer address", - suite.contract.String(), - "", - false, - }, - } - - for i, tc := range testCases { - tx := types.MsgCancelRevenue{ - ContractAddress: tc.contract, - DeployerAddress: tc.deployer, - } - err := tx.ValidateBasic() - - if tc.expectPass { - suite.Require().NoError(err, "valid test %d failed: %s, %v", i, tc.msg) - } else { - suite.Require().Error(err, "invalid test %d passed: %s, %v", i, tc.msg) - suite.Require().Contains(err.Error(), tc.msg) - } - } -} - -func (suite *MsgsTestSuite) TestMsgUpdateRevenueGetters() { - msgInvalid := types.MsgUpdateRevenue{} - msg := types.NewMsgUpdateRevenue( - suite.contract, - sdk.AccAddress(suite.deployer.Bytes()), - sdk.AccAddress(suite.deployer.Bytes()), - ) - suite.Require().Equal(types.RouterKey, msg.Route()) - suite.Require().Equal(types.TypeMsgUpdateRevenue, msg.Type()) - suite.Require().NotNil(msgInvalid.GetSignBytes()) - suite.Require().NotNil(msg.GetSigners()) -} - -func (suite *MsgsTestSuite) TestMsgUpdateRevenueNew() { - withdrawerStr := sdk.AccAddress(utiltx.GenerateAddress().Bytes()).String() - testCases := []struct { - msg string - contract string - deployer string - withdraw string - expectPass bool - }{ - { - "msg update fee - pass", - suite.contract.String(), - suite.deployerStr, - withdrawerStr, - true, - }, - { - "invalid contract address", - "", - suite.deployerStr, - withdrawerStr, - false, - }, - { - "must not be zero: invalid address", - "0x0000000000000000000000000000000000000000", - suite.deployerStr, - withdrawerStr, - false, - }, - { - "invalid deployer address", - suite.contract.String(), - "", - suite.deployerStr, - false, - }, - { - "invalid withdraw address", - suite.contract.String(), - suite.deployerStr, - "withdraw", - false, - }, - { - "change fee withdrawer to deployer - pass", - suite.contract.String(), - suite.deployerStr, - suite.deployerStr, - true, - }, - } - - for i, tc := range testCases { - tx := types.MsgUpdateRevenue{ - ContractAddress: tc.contract, - DeployerAddress: tc.deployer, - WithdrawerAddress: tc.withdraw, - } - err := tx.ValidateBasic() - - if tc.expectPass { - suite.Require().NoError(err, "valid test %d failed: %s, %v", i, tc.msg) - } else { - suite.Require().Error(err, "invalid test %d passed: %s, %v", i, tc.msg) - suite.Require().Contains(err.Error(), tc.msg) - } - } -} diff --git a/x/revenue/v1/types/params.go b/x/revenue/v1/types/params.go deleted file mode 100644 index 7ba42e0e98..0000000000 --- a/x/revenue/v1/types/params.go +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:LGPL-3.0-only - -package types - -import ( - "fmt" - - "cosmossdk.io/math" -) - -// Parameter store key -var ( - DefaultEnableRevenue = true - DefaultDeveloperShares = math.LegacyNewDecWithPrec(50, 2) // 50% - // DefaultAddrDerivationCostCreate Cost for executing `crypto.CreateAddress` must be at least 36 gas for the - // contained keccak256(word) operation - DefaultAddrDerivationCostCreate = uint64(50) -) - -var ( - ParamsKey = []byte("Params") - ParamStoreKeyEnableRevenue = []byte("EnableRevenue") - ParamStoreKeyDeveloperShares = []byte("DeveloperShares") - ParamStoreKeyAddrDerivationCostCreate = []byte("AddrDerivationCostCreate") -) - -// NewParams creates a new Params object -func NewParams( - enableRevenue bool, - developerShares math.LegacyDec, - addrDerivationCostCreate uint64, -) Params { - return Params{ - EnableRevenue: enableRevenue, - DeveloperShares: developerShares, - AddrDerivationCostCreate: addrDerivationCostCreate, - } -} - -func DefaultParams() Params { - return Params{ - EnableRevenue: DefaultEnableRevenue, - DeveloperShares: DefaultDeveloperShares, - AddrDerivationCostCreate: DefaultAddrDerivationCostCreate, - } -} - -func validateUint64(i interface{}) error { - _, ok := i.(uint64) - if !ok { - return fmt.Errorf("invalid parameter type: %T", i) - } - - return nil -} - -func validateBool(i interface{}) error { - _, ok := i.(bool) - if !ok { - return fmt.Errorf("invalid parameter type: %T", i) - } - - return nil -} - -func validateShares(i interface{}) error { - v, ok := i.(math.LegacyDec) - - if !ok { - return fmt.Errorf("invalid parameter type: %T", i) - } - - if v.IsNil() { - return fmt.Errorf("invalid parameter: nil") - } - - if v.IsNegative() { - return fmt.Errorf("value cannot be negative: %T", i) - } - - if v.GT(math.LegacyOneDec()) { - return fmt.Errorf("value cannot be greater than 1: %T", i) - } - - return nil -} - -func (p Params) Validate() error { - if err := validateBool(p.EnableRevenue); err != nil { - return err - } - if err := validateShares(p.DeveloperShares); err != nil { - return err - } - return validateUint64(p.AddrDerivationCostCreate) -} diff --git a/x/revenue/v1/types/params_test.go b/x/revenue/v1/types/params_test.go deleted file mode 100644 index 528e46ae2d..0000000000 --- a/x/revenue/v1/types/params_test.go +++ /dev/null @@ -1,120 +0,0 @@ -package types - -import ( - "testing" - - "cosmossdk.io/math" - "github.com/stretchr/testify/require" -) - -func TestParamsValidate(t *testing.T) { - devShares := math.LegacyNewDecWithPrec(60, 2) - derivCostCreate := uint64(50) - - testCases := []struct { - name string - params Params - expError bool - }{ - {"default", DefaultParams(), false}, - { - "valid: enabled", - NewParams(true, devShares, derivCostCreate), - false, - }, - { - "valid: disabled", - NewParams(false, devShares, derivCostCreate), - false, - }, - { - "valid: 100% devs", - Params{true, math.LegacyNewDecFromInt(math.NewInt(1)), derivCostCreate}, - false, - }, - { - "empty", - Params{}, - true, - }, - { - "invalid: share > 1", - Params{true, math.LegacyNewDecFromInt(math.NewInt(2)), derivCostCreate}, - true, - }, - { - "invalid: share < 0", - Params{true, math.LegacyNewDecFromInt(math.NewInt(-1)), derivCostCreate}, - true, - }, - { - "invalid: wrong address derivation cost", - NewParams(true, devShares, 50), - false, - }, - } - for _, tc := range testCases { - err := tc.params.Validate() - - if tc.expError { - require.Error(t, err, tc.name) - } else { - require.NoError(t, err, tc.name) - } - } -} - -func TestParamsValidateShares(t *testing.T) { - testCases := []struct { - name string - value interface{} - expError bool - }{ - {"default", DefaultDeveloperShares, false}, - {"valid", math.LegacyNewDecFromInt(math.NewInt(1)), false}, - {"invalid - wrong type - bool", false, true}, - {"invalid - wrong type - string", "", true}, - {"invalid - wrong type - int64", int64(123), true}, - {"invalid - wrong type - math.Int", math.NewInt(1), true}, - {"invalid - is nil", nil, true}, - {"invalid - is negative", math.LegacyNewDecFromInt(math.NewInt(-1)), true}, - {"invalid - is > 1", math.LegacyNewDecFromInt(math.NewInt(2)), true}, - } - for _, tc := range testCases { - err := validateShares(tc.value) - - if tc.expError { - require.Error(t, err, tc.name) - } else { - require.NoError(t, err, tc.name) - } - } -} - -func TestParamsValidateBool(t *testing.T) { - err := validateBool(DefaultEnableRevenue) - require.NoError(t, err) - err = validateBool(true) - require.NoError(t, err) - err = validateBool(false) - require.NoError(t, err) - err = validateBool("") - require.Error(t, err) - err = validateBool(int64(123)) - require.Error(t, err) -} - -func TestParamsValidateUint64(t *testing.T) { - err := validateUint64(DefaultAddrDerivationCostCreate) - require.NoError(t, err) - err = validateUint64(uint64(0)) - require.NoError(t, err) - err = validateUint64(uint64(1)) - require.NoError(t, err) - err = validateUint64("") - require.Error(t, err) - err = validateUint64(int64(123)) - require.Error(t, err) - err = validateUint64(int64(-1)) - require.Error(t, err) -} diff --git a/x/revenue/v1/types/query.pb.go b/x/revenue/v1/types/query.pb.go deleted file mode 100644 index f028c7a172..0000000000 --- a/x/revenue/v1/types/query.pb.go +++ /dev/null @@ -1,2431 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: evmos/revenue/v1/query.proto - -package types - -import ( - context "context" - fmt "fmt" - query "github.com/cosmos/cosmos-sdk/types/query" - _ "github.com/cosmos/gogoproto/gogoproto" - grpc1 "github.com/cosmos/gogoproto/grpc" - proto "github.com/cosmos/gogoproto/proto" - _ "google.golang.org/genproto/googleapis/api/annotations" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// QueryRevenuesRequest is the request type for the Query/Revenues RPC method. -type QueryRevenuesRequest struct { - // pagination defines an optional pagination for the request. - Pagination *query.PageRequest `protobuf:"bytes,1,opt,name=pagination,proto3" json:"pagination,omitempty"` -} - -func (m *QueryRevenuesRequest) Reset() { *m = QueryRevenuesRequest{} } -func (m *QueryRevenuesRequest) String() string { return proto.CompactTextString(m) } -func (*QueryRevenuesRequest) ProtoMessage() {} -func (*QueryRevenuesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_5e4b17cda6e8e927, []int{0} -} -func (m *QueryRevenuesRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryRevenuesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryRevenuesRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryRevenuesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryRevenuesRequest.Merge(m, src) -} -func (m *QueryRevenuesRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryRevenuesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryRevenuesRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryRevenuesRequest proto.InternalMessageInfo - -func (m *QueryRevenuesRequest) GetPagination() *query.PageRequest { - if m != nil { - return m.Pagination - } - return nil -} - -// QueryRevenuesResponse is the response type for the Query/Revenues RPC method. -type QueryRevenuesResponse struct { - // revenues is a slice of all stored Reveneue - Revenues []Revenue `protobuf:"bytes,1,rep,name=revenues,proto3" json:"revenues"` - // pagination defines the pagination in the response. - Pagination *query.PageResponse `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` -} - -func (m *QueryRevenuesResponse) Reset() { *m = QueryRevenuesResponse{} } -func (m *QueryRevenuesResponse) String() string { return proto.CompactTextString(m) } -func (*QueryRevenuesResponse) ProtoMessage() {} -func (*QueryRevenuesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_5e4b17cda6e8e927, []int{1} -} -func (m *QueryRevenuesResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryRevenuesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryRevenuesResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryRevenuesResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryRevenuesResponse.Merge(m, src) -} -func (m *QueryRevenuesResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryRevenuesResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryRevenuesResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryRevenuesResponse proto.InternalMessageInfo - -func (m *QueryRevenuesResponse) GetRevenues() []Revenue { - if m != nil { - return m.Revenues - } - return nil -} - -func (m *QueryRevenuesResponse) GetPagination() *query.PageResponse { - if m != nil { - return m.Pagination - } - return nil -} - -// QueryRevenueRequest is the request type for the Query/Revenue RPC method. -type QueryRevenueRequest struct { - // contract_address of a registered contract in hex format - ContractAddress string `protobuf:"bytes,1,opt,name=contract_address,json=contractAddress,proto3" json:"contract_address,omitempty"` -} - -func (m *QueryRevenueRequest) Reset() { *m = QueryRevenueRequest{} } -func (m *QueryRevenueRequest) String() string { return proto.CompactTextString(m) } -func (*QueryRevenueRequest) ProtoMessage() {} -func (*QueryRevenueRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_5e4b17cda6e8e927, []int{2} -} -func (m *QueryRevenueRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryRevenueRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryRevenueRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryRevenueRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryRevenueRequest.Merge(m, src) -} -func (m *QueryRevenueRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryRevenueRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryRevenueRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryRevenueRequest proto.InternalMessageInfo - -func (m *QueryRevenueRequest) GetContractAddress() string { - if m != nil { - return m.ContractAddress - } - return "" -} - -// QueryRevenueResponse is the response type for the Query/Revenue RPC method. -type QueryRevenueResponse struct { - // revenue is a stored Reveneue for the queried contract - Revenue Revenue `protobuf:"bytes,1,opt,name=revenue,proto3" json:"revenue"` -} - -func (m *QueryRevenueResponse) Reset() { *m = QueryRevenueResponse{} } -func (m *QueryRevenueResponse) String() string { return proto.CompactTextString(m) } -func (*QueryRevenueResponse) ProtoMessage() {} -func (*QueryRevenueResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_5e4b17cda6e8e927, []int{3} -} -func (m *QueryRevenueResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryRevenueResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryRevenueResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryRevenueResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryRevenueResponse.Merge(m, src) -} -func (m *QueryRevenueResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryRevenueResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryRevenueResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryRevenueResponse proto.InternalMessageInfo - -func (m *QueryRevenueResponse) GetRevenue() Revenue { - if m != nil { - return m.Revenue - } - return Revenue{} -} - -// QueryParamsRequest is the request type for the Query/Params RPC method. -type QueryParamsRequest struct { -} - -func (m *QueryParamsRequest) Reset() { *m = QueryParamsRequest{} } -func (m *QueryParamsRequest) String() string { return proto.CompactTextString(m) } -func (*QueryParamsRequest) ProtoMessage() {} -func (*QueryParamsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_5e4b17cda6e8e927, []int{4} -} -func (m *QueryParamsRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryParamsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryParamsRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryParamsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryParamsRequest.Merge(m, src) -} -func (m *QueryParamsRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryParamsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryParamsRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryParamsRequest proto.InternalMessageInfo - -// QueryParamsResponse is the response type for the Query/Params RPC method. -type QueryParamsResponse struct { - // params is the returned revenue parameter - Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"` -} - -func (m *QueryParamsResponse) Reset() { *m = QueryParamsResponse{} } -func (m *QueryParamsResponse) String() string { return proto.CompactTextString(m) } -func (*QueryParamsResponse) ProtoMessage() {} -func (*QueryParamsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_5e4b17cda6e8e927, []int{5} -} -func (m *QueryParamsResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryParamsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryParamsResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryParamsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryParamsResponse.Merge(m, src) -} -func (m *QueryParamsResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryParamsResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryParamsResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryParamsResponse proto.InternalMessageInfo - -func (m *QueryParamsResponse) GetParams() Params { - if m != nil { - return m.Params - } - return Params{} -} - -// QueryDeployerRevenuesRequest is the request type for the -// Query/DeployerRevenues RPC method. -type QueryDeployerRevenuesRequest struct { - // deployer_address in bech32 format - DeployerAddress string `protobuf:"bytes,1,opt,name=deployer_address,json=deployerAddress,proto3" json:"deployer_address,omitempty"` - // pagination defines an optional pagination for the request. - Pagination *query.PageRequest `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` -} - -func (m *QueryDeployerRevenuesRequest) Reset() { *m = QueryDeployerRevenuesRequest{} } -func (m *QueryDeployerRevenuesRequest) String() string { return proto.CompactTextString(m) } -func (*QueryDeployerRevenuesRequest) ProtoMessage() {} -func (*QueryDeployerRevenuesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_5e4b17cda6e8e927, []int{6} -} -func (m *QueryDeployerRevenuesRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryDeployerRevenuesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryDeployerRevenuesRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryDeployerRevenuesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryDeployerRevenuesRequest.Merge(m, src) -} -func (m *QueryDeployerRevenuesRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryDeployerRevenuesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryDeployerRevenuesRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryDeployerRevenuesRequest proto.InternalMessageInfo - -func (m *QueryDeployerRevenuesRequest) GetDeployerAddress() string { - if m != nil { - return m.DeployerAddress - } - return "" -} - -func (m *QueryDeployerRevenuesRequest) GetPagination() *query.PageRequest { - if m != nil { - return m.Pagination - } - return nil -} - -// QueryDeployerRevenuesResponse is the response type for the -// Query/DeployerRevenues RPC method. -type QueryDeployerRevenuesResponse struct { - // contract_addresses is the slice of registered contract addresses for a deployer - ContractAddresses []string `protobuf:"bytes,1,rep,name=contract_addresses,json=contractAddresses,proto3" json:"contract_addresses,omitempty"` - // pagination defines the pagination in the response. - Pagination *query.PageResponse `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` -} - -func (m *QueryDeployerRevenuesResponse) Reset() { *m = QueryDeployerRevenuesResponse{} } -func (m *QueryDeployerRevenuesResponse) String() string { return proto.CompactTextString(m) } -func (*QueryDeployerRevenuesResponse) ProtoMessage() {} -func (*QueryDeployerRevenuesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_5e4b17cda6e8e927, []int{7} -} -func (m *QueryDeployerRevenuesResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryDeployerRevenuesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryDeployerRevenuesResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryDeployerRevenuesResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryDeployerRevenuesResponse.Merge(m, src) -} -func (m *QueryDeployerRevenuesResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryDeployerRevenuesResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryDeployerRevenuesResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryDeployerRevenuesResponse proto.InternalMessageInfo - -func (m *QueryDeployerRevenuesResponse) GetContractAddresses() []string { - if m != nil { - return m.ContractAddresses - } - return nil -} - -func (m *QueryDeployerRevenuesResponse) GetPagination() *query.PageResponse { - if m != nil { - return m.Pagination - } - return nil -} - -// QueryWithdrawerRevenuesRequest is the request type for the -// Query/WithdrawerRevenues RPC method. -type QueryWithdrawerRevenuesRequest struct { - // withdrawer_address in bech32 format - WithdrawerAddress string `protobuf:"bytes,1,opt,name=withdrawer_address,json=withdrawerAddress,proto3" json:"withdrawer_address,omitempty"` - // pagination defines an optional pagination for the request. - Pagination *query.PageRequest `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` -} - -func (m *QueryWithdrawerRevenuesRequest) Reset() { *m = QueryWithdrawerRevenuesRequest{} } -func (m *QueryWithdrawerRevenuesRequest) String() string { return proto.CompactTextString(m) } -func (*QueryWithdrawerRevenuesRequest) ProtoMessage() {} -func (*QueryWithdrawerRevenuesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_5e4b17cda6e8e927, []int{8} -} -func (m *QueryWithdrawerRevenuesRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryWithdrawerRevenuesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryWithdrawerRevenuesRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryWithdrawerRevenuesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryWithdrawerRevenuesRequest.Merge(m, src) -} -func (m *QueryWithdrawerRevenuesRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryWithdrawerRevenuesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryWithdrawerRevenuesRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryWithdrawerRevenuesRequest proto.InternalMessageInfo - -func (m *QueryWithdrawerRevenuesRequest) GetWithdrawerAddress() string { - if m != nil { - return m.WithdrawerAddress - } - return "" -} - -func (m *QueryWithdrawerRevenuesRequest) GetPagination() *query.PageRequest { - if m != nil { - return m.Pagination - } - return nil -} - -// QueryWithdrawerRevenuesResponse is the response type for the -// Query/WithdrawerRevenues RPC method. -type QueryWithdrawerRevenuesResponse struct { - // contract_addresses is the slice of registered contract addresses for a withdrawer - ContractAddresses []string `protobuf:"bytes,1,rep,name=contract_addresses,json=contractAddresses,proto3" json:"contract_addresses,omitempty"` - // pagination defines the pagination in the response. - Pagination *query.PageResponse `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` -} - -func (m *QueryWithdrawerRevenuesResponse) Reset() { *m = QueryWithdrawerRevenuesResponse{} } -func (m *QueryWithdrawerRevenuesResponse) String() string { return proto.CompactTextString(m) } -func (*QueryWithdrawerRevenuesResponse) ProtoMessage() {} -func (*QueryWithdrawerRevenuesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_5e4b17cda6e8e927, []int{9} -} -func (m *QueryWithdrawerRevenuesResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryWithdrawerRevenuesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryWithdrawerRevenuesResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryWithdrawerRevenuesResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryWithdrawerRevenuesResponse.Merge(m, src) -} -func (m *QueryWithdrawerRevenuesResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryWithdrawerRevenuesResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryWithdrawerRevenuesResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryWithdrawerRevenuesResponse proto.InternalMessageInfo - -func (m *QueryWithdrawerRevenuesResponse) GetContractAddresses() []string { - if m != nil { - return m.ContractAddresses - } - return nil -} - -func (m *QueryWithdrawerRevenuesResponse) GetPagination() *query.PageResponse { - if m != nil { - return m.Pagination - } - return nil -} - -func init() { - proto.RegisterType((*QueryRevenuesRequest)(nil), "evmos.revenue.v1.QueryRevenuesRequest") - proto.RegisterType((*QueryRevenuesResponse)(nil), "evmos.revenue.v1.QueryRevenuesResponse") - proto.RegisterType((*QueryRevenueRequest)(nil), "evmos.revenue.v1.QueryRevenueRequest") - proto.RegisterType((*QueryRevenueResponse)(nil), "evmos.revenue.v1.QueryRevenueResponse") - proto.RegisterType((*QueryParamsRequest)(nil), "evmos.revenue.v1.QueryParamsRequest") - proto.RegisterType((*QueryParamsResponse)(nil), "evmos.revenue.v1.QueryParamsResponse") - proto.RegisterType((*QueryDeployerRevenuesRequest)(nil), "evmos.revenue.v1.QueryDeployerRevenuesRequest") - proto.RegisterType((*QueryDeployerRevenuesResponse)(nil), "evmos.revenue.v1.QueryDeployerRevenuesResponse") - proto.RegisterType((*QueryWithdrawerRevenuesRequest)(nil), "evmos.revenue.v1.QueryWithdrawerRevenuesRequest") - proto.RegisterType((*QueryWithdrawerRevenuesResponse)(nil), "evmos.revenue.v1.QueryWithdrawerRevenuesResponse") -} - -func init() { proto.RegisterFile("evmos/revenue/v1/query.proto", fileDescriptor_5e4b17cda6e8e927) } - -var fileDescriptor_5e4b17cda6e8e927 = []byte{ - // 662 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x55, 0x4d, 0x6b, 0x13, 0x4f, - 0x18, 0xcf, 0xf4, 0xff, 0xef, 0xdb, 0xd3, 0x83, 0xe9, 0x58, 0x21, 0x2e, 0x71, 0x5b, 0x16, 0xfb, - 0x26, 0x64, 0xc7, 0xad, 0x58, 0x11, 0x2f, 0x5a, 0xc4, 0x9e, 0x84, 0x76, 0x2f, 0x82, 0x07, 0x65, - 0x92, 0x0c, 0xdb, 0x85, 0x76, 0x67, 0xbb, 0xb3, 0xd9, 0x5a, 0x24, 0x08, 0x7e, 0x01, 0x15, 0x0f, - 0xc5, 0x83, 0x5f, 0xc0, 0xa3, 0x9f, 0xa2, 0xc7, 0x82, 0x17, 0x4f, 0x22, 0x89, 0x5f, 0xc1, 0xbb, - 0x64, 0x66, 0x36, 0x4d, 0x76, 0xdd, 0xc6, 0x4a, 0xc1, 0x4b, 0x58, 0x9e, 0xb7, 0xdf, 0xef, 0xf9, - 0xcd, 0xf3, 0x3c, 0x81, 0x2a, 0x4b, 0xf6, 0xb8, 0x20, 0x11, 0x4b, 0x58, 0xd0, 0x62, 0x24, 0x71, - 0xc8, 0x7e, 0x8b, 0x45, 0x87, 0x76, 0x18, 0xf1, 0x98, 0xe3, 0xb2, 0xf4, 0xda, 0xda, 0x6b, 0x27, - 0x8e, 0x71, 0xa3, 0xc1, 0x45, 0x2f, 0xa1, 0x4e, 0x05, 0x53, 0xa1, 0x24, 0x71, 0xea, 0x2c, 0xa6, - 0x0e, 0x09, 0xa9, 0xe7, 0x07, 0x34, 0xf6, 0x79, 0xa0, 0xb2, 0x0d, 0x33, 0x57, 0xdb, 0x63, 0x01, - 0x13, 0xbe, 0x28, 0xf4, 0xa7, 0x40, 0xca, 0x3f, 0xe7, 0x71, 0x8f, 0xcb, 0x4f, 0xd2, 0xfb, 0xd2, - 0xd6, 0xaa, 0xc7, 0xb9, 0xb7, 0xcb, 0x08, 0x0d, 0x7d, 0x42, 0x83, 0x80, 0xc7, 0x12, 0x52, 0xd7, - 0xb4, 0x9e, 0xc1, 0xdc, 0x76, 0x8f, 0x95, 0xab, 0x2a, 0x09, 0x97, 0xed, 0xb7, 0x98, 0x88, 0xf1, - 0x23, 0x80, 0x53, 0x7e, 0x15, 0xb4, 0x80, 0x56, 0x66, 0xd6, 0x96, 0x6c, 0xd5, 0x8c, 0xdd, 0x6b, - 0xc6, 0x56, 0x7d, 0xeb, 0x66, 0xec, 0x2d, 0xea, 0x31, 0x9d, 0xeb, 0x0e, 0x64, 0x5a, 0x1f, 0x11, - 0x5c, 0xc9, 0x00, 0x88, 0x90, 0x07, 0x82, 0xe1, 0x7b, 0x30, 0xa5, 0xe9, 0x8b, 0x0a, 0x5a, 0xf8, - 0x6f, 0x65, 0x66, 0xed, 0xaa, 0x9d, 0x95, 0xcf, 0xd6, 0x59, 0x1b, 0xff, 0x1f, 0x7f, 0x9b, 0x2f, - 0xb9, 0xfd, 0x04, 0xbc, 0x39, 0x44, 0x6f, 0x4c, 0xd2, 0x5b, 0x1e, 0x49, 0x4f, 0x21, 0x0f, 0xf1, - 0xbb, 0x0f, 0x97, 0x07, 0xe9, 0xa5, 0xed, 0xaf, 0x42, 0xb9, 0xc1, 0x83, 0x38, 0xa2, 0x8d, 0xf8, - 0x39, 0x6d, 0x36, 0x23, 0x26, 0x84, 0x14, 0x61, 0xda, 0xbd, 0x94, 0xda, 0x1f, 0x28, 0xb3, 0xb5, - 0x3d, 0xac, 0x60, 0xbf, 0xbf, 0xbb, 0x30, 0xa9, 0xe9, 0x6a, 0xf9, 0x46, 0xb6, 0x97, 0xc6, 0x5b, - 0x73, 0x80, 0x65, 0xc9, 0x2d, 0x1a, 0xd1, 0xbd, 0xf4, 0x49, 0xac, 0xc7, 0x9a, 0x6a, 0x6a, 0xd5, - 0x38, 0xeb, 0x30, 0x11, 0x4a, 0x8b, 0x86, 0xa9, 0xe4, 0x61, 0x54, 0x86, 0x46, 0xd1, 0xd1, 0xd6, - 0x3b, 0x04, 0x55, 0x59, 0xef, 0x21, 0x0b, 0x77, 0xf9, 0x21, 0x8b, 0xb2, 0x23, 0xb0, 0x0a, 0xe5, - 0xa6, 0x76, 0x65, 0x35, 0x48, 0xed, 0x5a, 0x83, 0xcc, 0xb4, 0x8c, 0xfd, 0xf5, 0xb4, 0x1c, 0x21, - 0xb8, 0x56, 0xc0, 0x49, 0x77, 0x5b, 0x03, 0x9c, 0x7d, 0x18, 0x3d, 0x3f, 0xd3, 0xee, 0x6c, 0xe6, - 0x69, 0x2e, 0x72, 0x4e, 0x8e, 0x10, 0x98, 0x92, 0xd9, 0x13, 0x3f, 0xde, 0x69, 0x46, 0xf4, 0x20, - 0xaf, 0x57, 0x0d, 0xf0, 0x41, 0xdf, 0x99, 0x51, 0x6c, 0xf6, 0xd4, 0x73, 0xd1, 0x9a, 0x7d, 0x40, - 0x30, 0x5f, 0xc8, 0xec, 0xdf, 0xaa, 0xb6, 0xf6, 0x73, 0x1c, 0xc6, 0x25, 0x37, 0xfc, 0x0a, 0xa6, - 0x52, 0x56, 0x78, 0x29, 0x3f, 0xa1, 0xbf, 0xbb, 0x41, 0xc6, 0xf2, 0xc8, 0x38, 0x05, 0x69, 0x59, - 0xaf, 0xbf, 0xfc, 0x78, 0x3f, 0x56, 0xc5, 0x06, 0x29, 0xba, 0x90, 0x02, 0xbf, 0x41, 0x30, 0xa9, - 0x13, 0xf1, 0xe2, 0xd9, 0x85, 0x53, 0xfc, 0xa5, 0x51, 0x61, 0x1a, 0xfe, 0xb6, 0x84, 0x27, 0xb8, - 0x56, 0x0c, 0x4f, 0x5e, 0x66, 0xf5, 0x6f, 0xe3, 0x03, 0x98, 0x50, 0x8b, 0x89, 0xaf, 0x17, 0x00, - 0x0d, 0xed, 0xbf, 0xb1, 0x38, 0x22, 0x4a, 0xb3, 0x59, 0x90, 0x6c, 0x0c, 0x5c, 0xc9, 0xb3, 0x51, - 0x9b, 0x8f, 0x3f, 0x21, 0x28, 0x67, 0x17, 0x0c, 0xdb, 0x05, 0xd5, 0x0b, 0xae, 0x83, 0x41, 0xfe, - 0x38, 0xfe, 0x3c, 0x2a, 0x65, 0x0f, 0x4e, 0x1b, 0x7f, 0x46, 0x80, 0xf3, 0x93, 0x8d, 0x6f, 0x16, - 0xc0, 0x17, 0xae, 0xa7, 0xe1, 0x9c, 0x23, 0x43, 0x53, 0xbe, 0x23, 0x29, 0x3b, 0x98, 0x9c, 0x45, - 0x39, 0xbf, 0xf3, 0xed, 0x8d, 0xcd, 0xe3, 0x8e, 0x89, 0x4e, 0x3a, 0x26, 0xfa, 0xde, 0x31, 0xd1, - 0xdb, 0xae, 0x59, 0x3a, 0xe9, 0x9a, 0xa5, 0xaf, 0x5d, 0xb3, 0xf4, 0xb4, 0xe6, 0xf9, 0xf1, 0x4e, - 0xab, 0x6e, 0x37, 0xf8, 0x9e, 0x2e, 0xaa, 0x7e, 0x13, 0x67, 0x9d, 0xbc, 0x18, 0x04, 0x88, 0x0f, - 0x43, 0x26, 0xea, 0x13, 0xf2, 0x5f, 0xfa, 0xd6, 0xaf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xad, 0x77, - 0xa0, 0x45, 0x77, 0x08, 0x00, 0x00, -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConn - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion4 - -// QueryClient is the client API for Query service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type QueryClient interface { - // Revenues retrieves all registered revenues - Revenues(ctx context.Context, in *QueryRevenuesRequest, opts ...grpc.CallOption) (*QueryRevenuesResponse, error) - // Revenue retrieves a registered revenue for a given contract address - Revenue(ctx context.Context, in *QueryRevenueRequest, opts ...grpc.CallOption) (*QueryRevenueResponse, error) - // Params retrieves the revenue module params - Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) - // DeployerRevenues retrieves all revenues that a given deployer has - // registered - DeployerRevenues(ctx context.Context, in *QueryDeployerRevenuesRequest, opts ...grpc.CallOption) (*QueryDeployerRevenuesResponse, error) - // WithdrawerRevenues retrieves all revenues with a given withdrawer - // address - WithdrawerRevenues(ctx context.Context, in *QueryWithdrawerRevenuesRequest, opts ...grpc.CallOption) (*QueryWithdrawerRevenuesResponse, error) -} - -type queryClient struct { - cc grpc1.ClientConn -} - -func NewQueryClient(cc grpc1.ClientConn) QueryClient { - return &queryClient{cc} -} - -func (c *queryClient) Revenues(ctx context.Context, in *QueryRevenuesRequest, opts ...grpc.CallOption) (*QueryRevenuesResponse, error) { - out := new(QueryRevenuesResponse) - err := c.cc.Invoke(ctx, "/evmos.revenue.v1.Query/Revenues", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) Revenue(ctx context.Context, in *QueryRevenueRequest, opts ...grpc.CallOption) (*QueryRevenueResponse, error) { - out := new(QueryRevenueResponse) - err := c.cc.Invoke(ctx, "/evmos.revenue.v1.Query/Revenue", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) { - out := new(QueryParamsResponse) - err := c.cc.Invoke(ctx, "/evmos.revenue.v1.Query/Params", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) DeployerRevenues(ctx context.Context, in *QueryDeployerRevenuesRequest, opts ...grpc.CallOption) (*QueryDeployerRevenuesResponse, error) { - out := new(QueryDeployerRevenuesResponse) - err := c.cc.Invoke(ctx, "/evmos.revenue.v1.Query/DeployerRevenues", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) WithdrawerRevenues(ctx context.Context, in *QueryWithdrawerRevenuesRequest, opts ...grpc.CallOption) (*QueryWithdrawerRevenuesResponse, error) { - out := new(QueryWithdrawerRevenuesResponse) - err := c.cc.Invoke(ctx, "/evmos.revenue.v1.Query/WithdrawerRevenues", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// QueryServer is the server API for Query service. -type QueryServer interface { - // Revenues retrieves all registered revenues - Revenues(context.Context, *QueryRevenuesRequest) (*QueryRevenuesResponse, error) - // Revenue retrieves a registered revenue for a given contract address - Revenue(context.Context, *QueryRevenueRequest) (*QueryRevenueResponse, error) - // Params retrieves the revenue module params - Params(context.Context, *QueryParamsRequest) (*QueryParamsResponse, error) - // DeployerRevenues retrieves all revenues that a given deployer has - // registered - DeployerRevenues(context.Context, *QueryDeployerRevenuesRequest) (*QueryDeployerRevenuesResponse, error) - // WithdrawerRevenues retrieves all revenues with a given withdrawer - // address - WithdrawerRevenues(context.Context, *QueryWithdrawerRevenuesRequest) (*QueryWithdrawerRevenuesResponse, error) -} - -// UnimplementedQueryServer can be embedded to have forward compatible implementations. -type UnimplementedQueryServer struct { -} - -func (*UnimplementedQueryServer) Revenues(ctx context.Context, req *QueryRevenuesRequest) (*QueryRevenuesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Revenues not implemented") -} -func (*UnimplementedQueryServer) Revenue(ctx context.Context, req *QueryRevenueRequest) (*QueryRevenueResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Revenue not implemented") -} -func (*UnimplementedQueryServer) Params(ctx context.Context, req *QueryParamsRequest) (*QueryParamsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Params not implemented") -} -func (*UnimplementedQueryServer) DeployerRevenues(ctx context.Context, req *QueryDeployerRevenuesRequest) (*QueryDeployerRevenuesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeployerRevenues not implemented") -} -func (*UnimplementedQueryServer) WithdrawerRevenues(ctx context.Context, req *QueryWithdrawerRevenuesRequest) (*QueryWithdrawerRevenuesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method WithdrawerRevenues not implemented") -} - -func RegisterQueryServer(s grpc1.Server, srv QueryServer) { - s.RegisterService(&_Query_serviceDesc, srv) -} - -func _Query_Revenues_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryRevenuesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).Revenues(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/evmos.revenue.v1.Query/Revenues", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).Revenues(ctx, req.(*QueryRevenuesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_Revenue_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryRevenueRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).Revenue(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/evmos.revenue.v1.Query/Revenue", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).Revenue(ctx, req.(*QueryRevenueRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_Params_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryParamsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).Params(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/evmos.revenue.v1.Query/Params", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).Params(ctx, req.(*QueryParamsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_DeployerRevenues_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryDeployerRevenuesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).DeployerRevenues(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/evmos.revenue.v1.Query/DeployerRevenues", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).DeployerRevenues(ctx, req.(*QueryDeployerRevenuesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_WithdrawerRevenues_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryWithdrawerRevenuesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).WithdrawerRevenues(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/evmos.revenue.v1.Query/WithdrawerRevenues", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).WithdrawerRevenues(ctx, req.(*QueryWithdrawerRevenuesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _Query_serviceDesc = grpc.ServiceDesc{ - ServiceName: "evmos.revenue.v1.Query", - HandlerType: (*QueryServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "Revenues", - Handler: _Query_Revenues_Handler, - }, - { - MethodName: "Revenue", - Handler: _Query_Revenue_Handler, - }, - { - MethodName: "Params", - Handler: _Query_Params_Handler, - }, - { - MethodName: "DeployerRevenues", - Handler: _Query_DeployerRevenues_Handler, - }, - { - MethodName: "WithdrawerRevenues", - Handler: _Query_WithdrawerRevenues_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "evmos/revenue/v1/query.proto", -} - -func (m *QueryRevenuesRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryRevenuesRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryRevenuesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Pagination != nil { - { - size, err := m.Pagination.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *QueryRevenuesResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryRevenuesResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryRevenuesResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Pagination != nil { - { - size, err := m.Pagination.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if len(m.Revenues) > 0 { - for iNdEx := len(m.Revenues) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Revenues[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *QueryRevenueRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryRevenueRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryRevenueRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.ContractAddress) > 0 { - i -= len(m.ContractAddress) - copy(dAtA[i:], m.ContractAddress) - i = encodeVarintQuery(dAtA, i, uint64(len(m.ContractAddress))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *QueryRevenueResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryRevenueResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryRevenueResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Revenue.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *QueryParamsRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryParamsRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryParamsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *QueryParamsResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryParamsResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *QueryDeployerRevenuesRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryDeployerRevenuesRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryDeployerRevenuesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Pagination != nil { - { - size, err := m.Pagination.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if len(m.DeployerAddress) > 0 { - i -= len(m.DeployerAddress) - copy(dAtA[i:], m.DeployerAddress) - i = encodeVarintQuery(dAtA, i, uint64(len(m.DeployerAddress))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *QueryDeployerRevenuesResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryDeployerRevenuesResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryDeployerRevenuesResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Pagination != nil { - { - size, err := m.Pagination.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if len(m.ContractAddresses) > 0 { - for iNdEx := len(m.ContractAddresses) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.ContractAddresses[iNdEx]) - copy(dAtA[i:], m.ContractAddresses[iNdEx]) - i = encodeVarintQuery(dAtA, i, uint64(len(m.ContractAddresses[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *QueryWithdrawerRevenuesRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryWithdrawerRevenuesRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryWithdrawerRevenuesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Pagination != nil { - { - size, err := m.Pagination.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if len(m.WithdrawerAddress) > 0 { - i -= len(m.WithdrawerAddress) - copy(dAtA[i:], m.WithdrawerAddress) - i = encodeVarintQuery(dAtA, i, uint64(len(m.WithdrawerAddress))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *QueryWithdrawerRevenuesResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryWithdrawerRevenuesResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryWithdrawerRevenuesResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Pagination != nil { - { - size, err := m.Pagination.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if len(m.ContractAddresses) > 0 { - for iNdEx := len(m.ContractAddresses) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.ContractAddresses[iNdEx]) - copy(dAtA[i:], m.ContractAddresses[iNdEx]) - i = encodeVarintQuery(dAtA, i, uint64(len(m.ContractAddresses[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { - offset -= sovQuery(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *QueryRevenuesRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Pagination != nil { - l = m.Pagination.Size() - n += 1 + l + sovQuery(uint64(l)) - } - return n -} - -func (m *QueryRevenuesResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Revenues) > 0 { - for _, e := range m.Revenues { - l = e.Size() - n += 1 + l + sovQuery(uint64(l)) - } - } - if m.Pagination != nil { - l = m.Pagination.Size() - n += 1 + l + sovQuery(uint64(l)) - } - return n -} - -func (m *QueryRevenueRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.ContractAddress) - if l > 0 { - n += 1 + l + sovQuery(uint64(l)) - } - return n -} - -func (m *QueryRevenueResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Revenue.Size() - n += 1 + l + sovQuery(uint64(l)) - return n -} - -func (m *QueryParamsRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *QueryParamsResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Params.Size() - n += 1 + l + sovQuery(uint64(l)) - return n -} - -func (m *QueryDeployerRevenuesRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.DeployerAddress) - if l > 0 { - n += 1 + l + sovQuery(uint64(l)) - } - if m.Pagination != nil { - l = m.Pagination.Size() - n += 1 + l + sovQuery(uint64(l)) - } - return n -} - -func (m *QueryDeployerRevenuesResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.ContractAddresses) > 0 { - for _, s := range m.ContractAddresses { - l = len(s) - n += 1 + l + sovQuery(uint64(l)) - } - } - if m.Pagination != nil { - l = m.Pagination.Size() - n += 1 + l + sovQuery(uint64(l)) - } - return n -} - -func (m *QueryWithdrawerRevenuesRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.WithdrawerAddress) - if l > 0 { - n += 1 + l + sovQuery(uint64(l)) - } - if m.Pagination != nil { - l = m.Pagination.Size() - n += 1 + l + sovQuery(uint64(l)) - } - return n -} - -func (m *QueryWithdrawerRevenuesResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.ContractAddresses) > 0 { - for _, s := range m.ContractAddresses { - l = len(s) - n += 1 + l + sovQuery(uint64(l)) - } - } - if m.Pagination != nil { - l = m.Pagination.Size() - n += 1 + l + sovQuery(uint64(l)) - } - return n -} - -func sovQuery(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozQuery(x uint64) (n int) { - return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *QueryRevenuesRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryRevenuesRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryRevenuesRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Pagination == nil { - m.Pagination = &query.PageRequest{} - } - if err := m.Pagination.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryRevenuesResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryRevenuesResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryRevenuesResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Revenues", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Revenues = append(m.Revenues, Revenue{}) - if err := m.Revenues[len(m.Revenues)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Pagination == nil { - m.Pagination = &query.PageResponse{} - } - if err := m.Pagination.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryRevenueRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryRevenueRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryRevenueRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ContractAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ContractAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryRevenueResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryRevenueResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryRevenueResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Revenue", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Revenue.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryParamsRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryParamsRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryParamsRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryParamsResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryParamsResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryParamsResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryDeployerRevenuesRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryDeployerRevenuesRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryDeployerRevenuesRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DeployerAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.DeployerAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Pagination == nil { - m.Pagination = &query.PageRequest{} - } - if err := m.Pagination.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryDeployerRevenuesResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryDeployerRevenuesResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryDeployerRevenuesResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ContractAddresses", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ContractAddresses = append(m.ContractAddresses, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Pagination == nil { - m.Pagination = &query.PageResponse{} - } - if err := m.Pagination.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryWithdrawerRevenuesRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryWithdrawerRevenuesRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryWithdrawerRevenuesRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field WithdrawerAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.WithdrawerAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Pagination == nil { - m.Pagination = &query.PageRequest{} - } - if err := m.Pagination.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryWithdrawerRevenuesResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryWithdrawerRevenuesResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryWithdrawerRevenuesResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ContractAddresses", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ContractAddresses = append(m.ContractAddresses, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Pagination == nil { - m.Pagination = &query.PageResponse{} - } - if err := m.Pagination.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipQuery(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowQuery - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowQuery - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowQuery - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthQuery - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupQuery - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthQuery - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthQuery = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowQuery = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupQuery = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/revenue/v1/types/query.pb.gw.go b/x/revenue/v1/types/query.pb.gw.go deleted file mode 100644 index c4a0769202..0000000000 --- a/x/revenue/v1/types/query.pb.gw.go +++ /dev/null @@ -1,575 +0,0 @@ -// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. -// source: evmos/revenue/v1/query.proto - -/* -Package types is a reverse proxy. - -It translates gRPC into RESTful JSON APIs. -*/ -package types - -import ( - "context" - "io" - "net/http" - - "github.com/golang/protobuf/descriptor" - "github.com/golang/protobuf/proto" - "github.com/grpc-ecosystem/grpc-gateway/runtime" - "github.com/grpc-ecosystem/grpc-gateway/utilities" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/status" -) - -// Suppress "imported and not used" errors -var _ codes.Code -var _ io.Reader -var _ status.Status -var _ = runtime.String -var _ = utilities.NewDoubleArray -var _ = descriptor.ForMessage -var _ = metadata.Join - -var ( - filter_Query_Revenues_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - -func request_Query_Revenues_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryRevenuesRequest - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_Revenues_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.Revenues(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_Revenues_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryRevenuesRequest - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_Revenues_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.Revenues(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Query_Revenue_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryRevenueRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["contract_address"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "contract_address") - } - - protoReq.ContractAddress, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "contract_address", err) - } - - msg, err := client.Revenue(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_Revenue_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryRevenueRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["contract_address"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "contract_address") - } - - protoReq.ContractAddress, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "contract_address", err) - } - - msg, err := server.Revenue(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryParamsRequest - var metadata runtime.ServerMetadata - - msg, err := client.Params(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryParamsRequest - var metadata runtime.ServerMetadata - - msg, err := server.Params(ctx, &protoReq) - return msg, metadata, err - -} - -var ( - filter_Query_DeployerRevenues_0 = &utilities.DoubleArray{Encoding: map[string]int{"deployer_address": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) - -func request_Query_DeployerRevenues_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryDeployerRevenuesRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["deployer_address"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "deployer_address") - } - - protoReq.DeployerAddress, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "deployer_address", err) - } - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_DeployerRevenues_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.DeployerRevenues(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_DeployerRevenues_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryDeployerRevenuesRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["deployer_address"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "deployer_address") - } - - protoReq.DeployerAddress, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "deployer_address", err) - } - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_DeployerRevenues_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.DeployerRevenues(ctx, &protoReq) - return msg, metadata, err - -} - -var ( - filter_Query_WithdrawerRevenues_0 = &utilities.DoubleArray{Encoding: map[string]int{"withdrawer_address": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) - -func request_Query_WithdrawerRevenues_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryWithdrawerRevenuesRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["withdrawer_address"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "withdrawer_address") - } - - protoReq.WithdrawerAddress, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "withdrawer_address", err) - } - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_WithdrawerRevenues_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.WithdrawerRevenues(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_WithdrawerRevenues_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryWithdrawerRevenuesRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["withdrawer_address"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "withdrawer_address") - } - - protoReq.WithdrawerAddress, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "withdrawer_address", err) - } - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_WithdrawerRevenues_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.WithdrawerRevenues(ctx, &protoReq) - return msg, metadata, err - -} - -// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". -// UnaryRPC :call QueryServer directly. -// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. -// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. -func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { - - mux.Handle("GET", pattern_Query_Revenues_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Revenues_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Revenues_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_Revenue_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Revenue_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Revenue_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Params_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_DeployerRevenues_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_DeployerRevenues_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_DeployerRevenues_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_WithdrawerRevenues_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_WithdrawerRevenues_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_WithdrawerRevenues_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - -// RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but -// automatically dials to "endpoint" and closes the connection when "ctx" gets done. -func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { - conn, err := grpc.Dial(endpoint, opts...) - if err != nil { - return err - } - defer func() { - if err != nil { - if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) - } - return - } - go func() { - <-ctx.Done() - if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) - } - }() - }() - - return RegisterQueryHandler(ctx, mux, conn) -} - -// RegisterQueryHandler registers the http handlers for service Query to "mux". -// The handlers forward requests to the grpc endpoint over "conn". -func RegisterQueryHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { - return RegisterQueryHandlerClient(ctx, mux, NewQueryClient(conn)) -} - -// RegisterQueryHandlerClient registers the http handlers for service Query -// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "QueryClient". -// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "QueryClient" -// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in -// "QueryClient" to call the correct interceptors. -func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, client QueryClient) error { - - mux.Handle("GET", pattern_Query_Revenues_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_Revenues_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Revenues_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_Revenue_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_Revenue_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Revenue_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_Params_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_DeployerRevenues_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_DeployerRevenues_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_DeployerRevenues_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_WithdrawerRevenues_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_WithdrawerRevenues_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_WithdrawerRevenues_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - -var ( - pattern_Query_Revenues_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"evmos", "revenue", "v1", "revenues"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_Revenue_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"evmos", "revenue", "v1", "revenues", "contract_address"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_Params_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"evmos", "revenue", "v1", "params"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_DeployerRevenues_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"evmos", "revenue", "v1", "revenues", "deployer_address"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_WithdrawerRevenues_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"evmos", "revenue", "v1", "revenues", "withdrawer_address"}, "", runtime.AssumeColonVerbOpt(false))) -) - -var ( - forward_Query_Revenues_0 = runtime.ForwardResponseMessage - - forward_Query_Revenue_0 = runtime.ForwardResponseMessage - - forward_Query_Params_0 = runtime.ForwardResponseMessage - - forward_Query_DeployerRevenues_0 = runtime.ForwardResponseMessage - - forward_Query_WithdrawerRevenues_0 = runtime.ForwardResponseMessage -) diff --git a/x/revenue/v1/types/revenue.go b/x/revenue/v1/types/revenue.go deleted file mode 100644 index 7dcfa91837..0000000000 --- a/x/revenue/v1/types/revenue.go +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:LGPL-3.0-only - -package types - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/ethereum/go-ethereum/common" - evmostypes "github.com/evmos/evmos/v16/types" -) - -// NewRevenue returns an instance of Revenue. If the provided withdrawer -// address is empty, it sets the value to an empty string. -func NewRevenue(contract common.Address, deployer, withdrawer sdk.AccAddress) Revenue { - withdrawerAddr := "" - if len(withdrawer) > 0 { - withdrawerAddr = withdrawer.String() - } - - return Revenue{ - ContractAddress: contract.String(), - DeployerAddress: deployer.String(), - WithdrawerAddress: withdrawerAddr, - } -} - -// GetContractAddr returns the contract address -func (fs Revenue) GetContractAddr() common.Address { - return common.HexToAddress(fs.ContractAddress) -} - -// GetDeployerAddr returns the contract deployer address -func (fs Revenue) GetDeployerAddr() sdk.AccAddress { - return sdk.MustAccAddressFromBech32(fs.DeployerAddress) -} - -// GetWithdrawerAddr returns the account address to where the funds proceeding -// from the fees will be received. If the withdraw address is not defined, it -// defaults to the deployer address. -func (fs Revenue) GetWithdrawerAddr() sdk.AccAddress { - if fs.WithdrawerAddress == "" { - return nil - } - - return sdk.MustAccAddressFromBech32(fs.WithdrawerAddress) -} - -// Validate performs a stateless validation of a Revenue -func (fs Revenue) Validate() error { - if err := evmostypes.ValidateNonZeroAddress(fs.ContractAddress); err != nil { - return err - } - - if _, err := sdk.AccAddressFromBech32(fs.DeployerAddress); err != nil { - return err - } - - if fs.WithdrawerAddress != "" { - if _, err := sdk.AccAddressFromBech32(fs.WithdrawerAddress); err != nil { - return err - } - } - - return nil -} diff --git a/x/revenue/v1/types/revenue.pb.go b/x/revenue/v1/types/revenue.pb.go deleted file mode 100644 index e5dc50c0c5..0000000000 --- a/x/revenue/v1/types/revenue.pb.go +++ /dev/null @@ -1,426 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: evmos/revenue/v1/revenue.proto - -package types - -import ( - fmt "fmt" - proto "github.com/cosmos/gogoproto/proto" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// Revenue defines an instance that organizes fee distribution conditions for -// the owner of a given smart contract -type Revenue struct { - // contract_address is the hex address of a registered contract - ContractAddress string `protobuf:"bytes,1,opt,name=contract_address,json=contractAddress,proto3" json:"contract_address,omitempty"` - // deployer_address is the bech32 address of message sender. It must be the same as the origin EOA - // sending the transaction which deploys the contract - DeployerAddress string `protobuf:"bytes,2,opt,name=deployer_address,json=deployerAddress,proto3" json:"deployer_address,omitempty"` - // withdrawer_address is the bech32 address of account receiving the transaction fees it defaults to - // deployer_address - WithdrawerAddress string `protobuf:"bytes,3,opt,name=withdrawer_address,json=withdrawerAddress,proto3" json:"withdrawer_address,omitempty"` -} - -func (m *Revenue) Reset() { *m = Revenue{} } -func (m *Revenue) String() string { return proto.CompactTextString(m) } -func (*Revenue) ProtoMessage() {} -func (*Revenue) Descriptor() ([]byte, []int) { - return fileDescriptor_33d087165192e447, []int{0} -} -func (m *Revenue) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Revenue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Revenue.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Revenue) XXX_Merge(src proto.Message) { - xxx_messageInfo_Revenue.Merge(m, src) -} -func (m *Revenue) XXX_Size() int { - return m.Size() -} -func (m *Revenue) XXX_DiscardUnknown() { - xxx_messageInfo_Revenue.DiscardUnknown(m) -} - -var xxx_messageInfo_Revenue proto.InternalMessageInfo - -func (m *Revenue) GetContractAddress() string { - if m != nil { - return m.ContractAddress - } - return "" -} - -func (m *Revenue) GetDeployerAddress() string { - if m != nil { - return m.DeployerAddress - } - return "" -} - -func (m *Revenue) GetWithdrawerAddress() string { - if m != nil { - return m.WithdrawerAddress - } - return "" -} - -func init() { - proto.RegisterType((*Revenue)(nil), "evmos.revenue.v1.Revenue") -} - -func init() { proto.RegisterFile("evmos/revenue/v1/revenue.proto", fileDescriptor_33d087165192e447) } - -var fileDescriptor_33d087165192e447 = []byte{ - // 201 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4b, 0x2d, 0xcb, 0xcd, - 0x2f, 0xd6, 0x2f, 0x4a, 0x2d, 0x4b, 0xcd, 0x2b, 0x4d, 0xd5, 0x2f, 0x33, 0x84, 0x31, 0xf5, 0x0a, - 0x8a, 0xf2, 0x4b, 0xf2, 0x85, 0x04, 0xc0, 0xf2, 0x7a, 0x30, 0xc1, 0x32, 0x43, 0xa5, 0x3e, 0x46, - 0x2e, 0xf6, 0x20, 0x08, 0x57, 0x48, 0x93, 0x4b, 0x20, 0x39, 0x3f, 0xaf, 0xa4, 0x28, 0x31, 0xb9, - 0x24, 0x3e, 0x31, 0x25, 0xa5, 0x28, 0xb5, 0xb8, 0x58, 0x82, 0x51, 0x81, 0x51, 0x83, 0x33, 0x88, - 0x1f, 0x26, 0xee, 0x08, 0x11, 0x06, 0x29, 0x4d, 0x49, 0x2d, 0xc8, 0xc9, 0xaf, 0x4c, 0x2d, 0x82, - 0x2b, 0x65, 0x82, 0x28, 0x85, 0x89, 0xc3, 0x94, 0xea, 0x72, 0x09, 0x95, 0x67, 0x96, 0x64, 0xa4, - 0x14, 0x25, 0x96, 0x23, 0x29, 0x66, 0x06, 0x2b, 0x16, 0x44, 0xc8, 0x40, 0x95, 0x3b, 0xb9, 0x9f, - 0x78, 0x24, 0xc7, 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x13, 0x1e, 0xcb, 0x31, - 0x5c, 0x78, 0x2c, 0xc7, 0x70, 0xe3, 0xb1, 0x1c, 0x43, 0x94, 0x6e, 0x7a, 0x66, 0x49, 0x46, 0x69, - 0x92, 0x5e, 0x72, 0x7e, 0xae, 0x3e, 0xc4, 0x9f, 0x10, 0xb2, 0xcc, 0xd0, 0x4c, 0xbf, 0x02, 0xd9, - 0xcf, 0x25, 0x95, 0x05, 0xa9, 0xc5, 0x49, 0x6c, 0x60, 0x2f, 0x1b, 0x03, 0x02, 0x00, 0x00, 0xff, - 0xff, 0xf5, 0xd8, 0x3d, 0xe1, 0x14, 0x01, 0x00, 0x00, -} - -func (m *Revenue) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Revenue) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Revenue) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.WithdrawerAddress) > 0 { - i -= len(m.WithdrawerAddress) - copy(dAtA[i:], m.WithdrawerAddress) - i = encodeVarintRevenue(dAtA, i, uint64(len(m.WithdrawerAddress))) - i-- - dAtA[i] = 0x1a - } - if len(m.DeployerAddress) > 0 { - i -= len(m.DeployerAddress) - copy(dAtA[i:], m.DeployerAddress) - i = encodeVarintRevenue(dAtA, i, uint64(len(m.DeployerAddress))) - i-- - dAtA[i] = 0x12 - } - if len(m.ContractAddress) > 0 { - i -= len(m.ContractAddress) - copy(dAtA[i:], m.ContractAddress) - i = encodeVarintRevenue(dAtA, i, uint64(len(m.ContractAddress))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func encodeVarintRevenue(dAtA []byte, offset int, v uint64) int { - offset -= sovRevenue(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *Revenue) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.ContractAddress) - if l > 0 { - n += 1 + l + sovRevenue(uint64(l)) - } - l = len(m.DeployerAddress) - if l > 0 { - n += 1 + l + sovRevenue(uint64(l)) - } - l = len(m.WithdrawerAddress) - if l > 0 { - n += 1 + l + sovRevenue(uint64(l)) - } - return n -} - -func sovRevenue(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozRevenue(x uint64) (n int) { - return sovRevenue(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *Revenue) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRevenue - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Revenue: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Revenue: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ContractAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRevenue - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthRevenue - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthRevenue - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ContractAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DeployerAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRevenue - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthRevenue - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthRevenue - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.DeployerAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field WithdrawerAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRevenue - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthRevenue - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthRevenue - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.WithdrawerAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipRevenue(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthRevenue - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipRevenue(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowRevenue - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowRevenue - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowRevenue - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthRevenue - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupRevenue - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthRevenue - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthRevenue = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowRevenue = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupRevenue = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/revenue/v1/types/revenue_test.go b/x/revenue/v1/types/revenue_test.go deleted file mode 100644 index 844034cc67..0000000000 --- a/x/revenue/v1/types/revenue_test.go +++ /dev/null @@ -1,173 +0,0 @@ -package types_test - -import ( - "testing" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/ethereum/go-ethereum/common" - - utiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/x/revenue/v1/types" - - "github.com/stretchr/testify/suite" -) - -type RevenueTestSuite struct { - suite.Suite - address1 sdk.AccAddress - address2 sdk.AccAddress -} - -func TestRevenueSuite(t *testing.T) { - suite.Run(t, new(RevenueTestSuite)) -} - -func (suite *RevenueTestSuite) SetupTest() { - suite.address1 = sdk.AccAddress(utiltx.GenerateAddress().Bytes()) - suite.address2 = sdk.AccAddress(utiltx.GenerateAddress().Bytes()) -} - -func (suite *RevenueTestSuite) TestFeeNew() { - testCases := []struct { - name string - contract common.Address - deployer sdk.AccAddress - withdraw sdk.AccAddress - expectPass bool - }{ - { - "Create revenue- pass", - utiltx.GenerateAddress(), - suite.address1, - suite.address2, - true, - }, - { - "Create fee, omit withdraw - pass", - utiltx.GenerateAddress(), - suite.address1, - nil, - true, - }, - { - "Create revenue- invalid contract address", - common.Address{}, - suite.address1, - suite.address2, - false, - }, - { - "Create revenue- invalid deployer address", - utiltx.GenerateAddress(), - sdk.AccAddress{}, - suite.address2, - false, - }, - } - - for _, tc := range testCases { - i := types.NewRevenue(tc.contract, tc.deployer, tc.withdraw) - err := i.Validate() - - if tc.expectPass { - suite.Require().NoError(err, tc.name) - } else { - suite.Require().Error(err, tc.name) - } - } -} - -func (suite *RevenueTestSuite) TestFee() { - testCases := []struct { - msg string - revenue types.Revenue - expectPass bool - }{ - { - "Create revenue- pass", - types.Revenue{ - utiltx.GenerateAddress().String(), - suite.address1.String(), - suite.address2.String(), - }, - true, - }, - { - "Create revenue- invalid contract address (not hex)", - types.Revenue{ - "0x5dCA2483280D9727c80b5518faC4556617fb19ZZ", - suite.address1.String(), - suite.address2.String(), - }, - false, - }, - { - "Create revenue- invalid contract address (invalid length 1)", - types.Revenue{ - "0x5dCA2483280D9727c80b5518faC4556617fb19", - suite.address1.String(), - suite.address2.String(), - }, - false, - }, - { - "Create revenue- invalid contract address (invalid length 2)", - types.Revenue{ - "0x5dCA2483280D9727c80b5518faC4556617fb194FFF", - suite.address1.String(), - suite.address2.String(), - }, - false, - }, - { - "Create revenue- invalid deployer address", - types.Revenue{ - utiltx.GenerateAddress().String(), - "evmos14mq5c8yn9jx295ahaxye2f0xw3tlell0lt542Z", - suite.address2.String(), - }, - false, - }, - { - "Create revenue- invalid withdraw address", - types.Revenue{ - utiltx.GenerateAddress().String(), - suite.address1.String(), - "evmos14mq5c8yn9jx295ahaxye2f0xw3tlell0lt542Z", - }, - false, - }, - } - - for _, tc := range testCases { - err := tc.revenue.Validate() - - if tc.expectPass { - suite.Require().NoError(err, tc.msg) - } else { - suite.Require().Error(err, tc.msg) - } - } -} - -func (suite *RevenueTestSuite) TestRevenueGetters() { - contract := utiltx.GenerateAddress() - fs := types.Revenue{ - contract.String(), - suite.address1.String(), - suite.address2.String(), - } - suite.Equal(fs.GetContractAddr(), contract) - suite.Equal(fs.GetDeployerAddr(), suite.address1) - suite.Equal(fs.GetWithdrawerAddr(), suite.address2) - - fs = types.Revenue{ - contract.String(), - suite.address1.String(), - "", - } - suite.Equal(fs.GetContractAddr(), contract) - suite.Equal(fs.GetDeployerAddr(), suite.address1) - suite.Equal(len(fs.GetWithdrawerAddr()), 0) -} diff --git a/x/revenue/v1/types/tx.pb.go b/x/revenue/v1/types/tx.pb.go deleted file mode 100644 index 869f125d9f..0000000000 --- a/x/revenue/v1/types/tx.pb.go +++ /dev/null @@ -1,1979 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: evmos/revenue/v1/tx.proto - -package types - -import ( - context "context" - fmt "fmt" - _ "github.com/cosmos/cosmos-proto" - _ "github.com/cosmos/cosmos-sdk/types/msgservice" - _ "github.com/cosmos/gogoproto/gogoproto" - grpc1 "github.com/cosmos/gogoproto/grpc" - proto "github.com/cosmos/gogoproto/proto" - _ "google.golang.org/genproto/googleapis/api/annotations" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// MsgRegisterRevenue defines a message that registers a Revenue -type MsgRegisterRevenue struct { - // contract_address in hex format - ContractAddress string `protobuf:"bytes,1,opt,name=contract_address,json=contractAddress,proto3" json:"contract_address,omitempty"` - // deployer_address is the bech32 address of message sender. It must be the same as the origin EOA - // sending the transaction which deploys the contract - DeployerAddress string `protobuf:"bytes,2,opt,name=deployer_address,json=deployerAddress,proto3" json:"deployer_address,omitempty"` - // withdrawer_address is the bech32 address of account receiving the transaction fees - WithdrawerAddress string `protobuf:"bytes,3,opt,name=withdrawer_address,json=withdrawerAddress,proto3" json:"withdrawer_address,omitempty"` - // nonces is an array of nonces from the address path, where the last nonce is the nonce - // that determines the contract's address - it can be an EOA nonce or a - // factory contract nonce - Nonces []uint64 `protobuf:"varint,4,rep,packed,name=nonces,proto3" json:"nonces,omitempty"` -} - -func (m *MsgRegisterRevenue) Reset() { *m = MsgRegisterRevenue{} } -func (m *MsgRegisterRevenue) String() string { return proto.CompactTextString(m) } -func (*MsgRegisterRevenue) ProtoMessage() {} -func (*MsgRegisterRevenue) Descriptor() ([]byte, []int) { - return fileDescriptor_2a6d23524264890a, []int{0} -} -func (m *MsgRegisterRevenue) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgRegisterRevenue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgRegisterRevenue.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgRegisterRevenue) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgRegisterRevenue.Merge(m, src) -} -func (m *MsgRegisterRevenue) XXX_Size() int { - return m.Size() -} -func (m *MsgRegisterRevenue) XXX_DiscardUnknown() { - xxx_messageInfo_MsgRegisterRevenue.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgRegisterRevenue proto.InternalMessageInfo - -func (m *MsgRegisterRevenue) GetContractAddress() string { - if m != nil { - return m.ContractAddress - } - return "" -} - -func (m *MsgRegisterRevenue) GetDeployerAddress() string { - if m != nil { - return m.DeployerAddress - } - return "" -} - -func (m *MsgRegisterRevenue) GetWithdrawerAddress() string { - if m != nil { - return m.WithdrawerAddress - } - return "" -} - -func (m *MsgRegisterRevenue) GetNonces() []uint64 { - if m != nil { - return m.Nonces - } - return nil -} - -// MsgRegisterRevenueResponse defines the MsgRegisterRevenue response type -type MsgRegisterRevenueResponse struct { -} - -func (m *MsgRegisterRevenueResponse) Reset() { *m = MsgRegisterRevenueResponse{} } -func (m *MsgRegisterRevenueResponse) String() string { return proto.CompactTextString(m) } -func (*MsgRegisterRevenueResponse) ProtoMessage() {} -func (*MsgRegisterRevenueResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_2a6d23524264890a, []int{1} -} -func (m *MsgRegisterRevenueResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgRegisterRevenueResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgRegisterRevenueResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgRegisterRevenueResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgRegisterRevenueResponse.Merge(m, src) -} -func (m *MsgRegisterRevenueResponse) XXX_Size() int { - return m.Size() -} -func (m *MsgRegisterRevenueResponse) XXX_DiscardUnknown() { - xxx_messageInfo_MsgRegisterRevenueResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgRegisterRevenueResponse proto.InternalMessageInfo - -// MsgUpdateRevenue defines a message that updates the withdrawer address for a -// registered Revenue -type MsgUpdateRevenue struct { - // contract_address in hex format - ContractAddress string `protobuf:"bytes,1,opt,name=contract_address,json=contractAddress,proto3" json:"contract_address,omitempty"` - // deployer_address is the bech32 address of message sender. It must be the same as the origin EOA - // sending the transaction which deploys the contract - DeployerAddress string `protobuf:"bytes,2,opt,name=deployer_address,json=deployerAddress,proto3" json:"deployer_address,omitempty"` - // withdrawer_address is the bech32 address of account receiving the transaction fees - WithdrawerAddress string `protobuf:"bytes,3,opt,name=withdrawer_address,json=withdrawerAddress,proto3" json:"withdrawer_address,omitempty"` -} - -func (m *MsgUpdateRevenue) Reset() { *m = MsgUpdateRevenue{} } -func (m *MsgUpdateRevenue) String() string { return proto.CompactTextString(m) } -func (*MsgUpdateRevenue) ProtoMessage() {} -func (*MsgUpdateRevenue) Descriptor() ([]byte, []int) { - return fileDescriptor_2a6d23524264890a, []int{2} -} -func (m *MsgUpdateRevenue) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgUpdateRevenue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgUpdateRevenue.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgUpdateRevenue) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgUpdateRevenue.Merge(m, src) -} -func (m *MsgUpdateRevenue) XXX_Size() int { - return m.Size() -} -func (m *MsgUpdateRevenue) XXX_DiscardUnknown() { - xxx_messageInfo_MsgUpdateRevenue.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgUpdateRevenue proto.InternalMessageInfo - -func (m *MsgUpdateRevenue) GetContractAddress() string { - if m != nil { - return m.ContractAddress - } - return "" -} - -func (m *MsgUpdateRevenue) GetDeployerAddress() string { - if m != nil { - return m.DeployerAddress - } - return "" -} - -func (m *MsgUpdateRevenue) GetWithdrawerAddress() string { - if m != nil { - return m.WithdrawerAddress - } - return "" -} - -// MsgUpdateRevenueResponse defines the MsgUpdateRevenue response type -type MsgUpdateRevenueResponse struct { -} - -func (m *MsgUpdateRevenueResponse) Reset() { *m = MsgUpdateRevenueResponse{} } -func (m *MsgUpdateRevenueResponse) String() string { return proto.CompactTextString(m) } -func (*MsgUpdateRevenueResponse) ProtoMessage() {} -func (*MsgUpdateRevenueResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_2a6d23524264890a, []int{3} -} -func (m *MsgUpdateRevenueResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgUpdateRevenueResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgUpdateRevenueResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgUpdateRevenueResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgUpdateRevenueResponse.Merge(m, src) -} -func (m *MsgUpdateRevenueResponse) XXX_Size() int { - return m.Size() -} -func (m *MsgUpdateRevenueResponse) XXX_DiscardUnknown() { - xxx_messageInfo_MsgUpdateRevenueResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgUpdateRevenueResponse proto.InternalMessageInfo - -// MsgCancelRevenue defines a message that cancels a registered Revenue -type MsgCancelRevenue struct { - // contract_address in hex format - ContractAddress string `protobuf:"bytes,1,opt,name=contract_address,json=contractAddress,proto3" json:"contract_address,omitempty"` - // deployer_address is the bech32 address of message sender. It must be the same as the origin EOA - // sending the transaction which deploys the contract - DeployerAddress string `protobuf:"bytes,2,opt,name=deployer_address,json=deployerAddress,proto3" json:"deployer_address,omitempty"` -} - -func (m *MsgCancelRevenue) Reset() { *m = MsgCancelRevenue{} } -func (m *MsgCancelRevenue) String() string { return proto.CompactTextString(m) } -func (*MsgCancelRevenue) ProtoMessage() {} -func (*MsgCancelRevenue) Descriptor() ([]byte, []int) { - return fileDescriptor_2a6d23524264890a, []int{4} -} -func (m *MsgCancelRevenue) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgCancelRevenue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgCancelRevenue.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgCancelRevenue) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgCancelRevenue.Merge(m, src) -} -func (m *MsgCancelRevenue) XXX_Size() int { - return m.Size() -} -func (m *MsgCancelRevenue) XXX_DiscardUnknown() { - xxx_messageInfo_MsgCancelRevenue.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgCancelRevenue proto.InternalMessageInfo - -func (m *MsgCancelRevenue) GetContractAddress() string { - if m != nil { - return m.ContractAddress - } - return "" -} - -func (m *MsgCancelRevenue) GetDeployerAddress() string { - if m != nil { - return m.DeployerAddress - } - return "" -} - -// MsgCancelRevenueResponse defines the MsgCancelRevenue response type -type MsgCancelRevenueResponse struct { -} - -func (m *MsgCancelRevenueResponse) Reset() { *m = MsgCancelRevenueResponse{} } -func (m *MsgCancelRevenueResponse) String() string { return proto.CompactTextString(m) } -func (*MsgCancelRevenueResponse) ProtoMessage() {} -func (*MsgCancelRevenueResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_2a6d23524264890a, []int{5} -} -func (m *MsgCancelRevenueResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgCancelRevenueResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgCancelRevenueResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgCancelRevenueResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgCancelRevenueResponse.Merge(m, src) -} -func (m *MsgCancelRevenueResponse) XXX_Size() int { - return m.Size() -} -func (m *MsgCancelRevenueResponse) XXX_DiscardUnknown() { - xxx_messageInfo_MsgCancelRevenueResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgCancelRevenueResponse proto.InternalMessageInfo - -// MsgUpdateParams defines a Msg for updating the x/revenue module parameters. -type MsgUpdateParams struct { - // authority is the address of the governance account. - Authority string `protobuf:"bytes,1,opt,name=authority,proto3" json:"authority,omitempty"` - // params defines the x/revenue parameters to update. - // NOTE: All parameters must be supplied. - Params Params `protobuf:"bytes,2,opt,name=params,proto3" json:"params"` -} - -func (m *MsgUpdateParams) Reset() { *m = MsgUpdateParams{} } -func (m *MsgUpdateParams) String() string { return proto.CompactTextString(m) } -func (*MsgUpdateParams) ProtoMessage() {} -func (*MsgUpdateParams) Descriptor() ([]byte, []int) { - return fileDescriptor_2a6d23524264890a, []int{6} -} -func (m *MsgUpdateParams) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgUpdateParams) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgUpdateParams.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgUpdateParams) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgUpdateParams.Merge(m, src) -} -func (m *MsgUpdateParams) XXX_Size() int { - return m.Size() -} -func (m *MsgUpdateParams) XXX_DiscardUnknown() { - xxx_messageInfo_MsgUpdateParams.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgUpdateParams proto.InternalMessageInfo - -func (m *MsgUpdateParams) GetAuthority() string { - if m != nil { - return m.Authority - } - return "" -} - -func (m *MsgUpdateParams) GetParams() Params { - if m != nil { - return m.Params - } - return Params{} -} - -// MsgUpdateParamsResponse defines the response structure for executing a -// MsgUpdateParams message. -type MsgUpdateParamsResponse struct { -} - -func (m *MsgUpdateParamsResponse) Reset() { *m = MsgUpdateParamsResponse{} } -func (m *MsgUpdateParamsResponse) String() string { return proto.CompactTextString(m) } -func (*MsgUpdateParamsResponse) ProtoMessage() {} -func (*MsgUpdateParamsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_2a6d23524264890a, []int{7} -} -func (m *MsgUpdateParamsResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgUpdateParamsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgUpdateParamsResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgUpdateParamsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgUpdateParamsResponse.Merge(m, src) -} -func (m *MsgUpdateParamsResponse) XXX_Size() int { - return m.Size() -} -func (m *MsgUpdateParamsResponse) XXX_DiscardUnknown() { - xxx_messageInfo_MsgUpdateParamsResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgUpdateParamsResponse proto.InternalMessageInfo - -func init() { - proto.RegisterType((*MsgRegisterRevenue)(nil), "evmos.revenue.v1.MsgRegisterRevenue") - proto.RegisterType((*MsgRegisterRevenueResponse)(nil), "evmos.revenue.v1.MsgRegisterRevenueResponse") - proto.RegisterType((*MsgUpdateRevenue)(nil), "evmos.revenue.v1.MsgUpdateRevenue") - proto.RegisterType((*MsgUpdateRevenueResponse)(nil), "evmos.revenue.v1.MsgUpdateRevenueResponse") - proto.RegisterType((*MsgCancelRevenue)(nil), "evmos.revenue.v1.MsgCancelRevenue") - proto.RegisterType((*MsgCancelRevenueResponse)(nil), "evmos.revenue.v1.MsgCancelRevenueResponse") - proto.RegisterType((*MsgUpdateParams)(nil), "evmos.revenue.v1.MsgUpdateParams") - proto.RegisterType((*MsgUpdateParamsResponse)(nil), "evmos.revenue.v1.MsgUpdateParamsResponse") -} - -func init() { proto.RegisterFile("evmos/revenue/v1/tx.proto", fileDescriptor_2a6d23524264890a) } - -var fileDescriptor_2a6d23524264890a = []byte{ - // 566 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x94, 0x4f, 0x6b, 0x13, 0x41, - 0x14, 0xc0, 0x33, 0x4d, 0x08, 0x74, 0xfc, 0x93, 0xb8, 0x14, 0x9b, 0x2c, 0x65, 0x5b, 0x57, 0x8b, - 0x6d, 0x35, 0xbb, 0xa4, 0x42, 0x0e, 0xbd, 0x19, 0x0f, 0x9e, 0x02, 0xb2, 0xe2, 0x45, 0x84, 0x30, - 0xdd, 0x0c, 0x93, 0x85, 0x64, 0x66, 0x99, 0x99, 0xa4, 0xcd, 0xb5, 0x67, 0x0f, 0x8a, 0x1e, 0xbc, - 0x08, 0x7e, 0x04, 0x0f, 0x82, 0x5f, 0xa1, 0xc7, 0xa2, 0x17, 0x4f, 0x22, 0x89, 0xa0, 0x1f, 0x43, - 0x32, 0x33, 0xbb, 0x71, 0x93, 0xd8, 0x7a, 0x11, 0xbc, 0x84, 0xcc, 0x7b, 0xbf, 0xf7, 0xde, 0x6f, - 0xc2, 0x9b, 0xc0, 0x2a, 0x1e, 0xf6, 0x99, 0xf0, 0x39, 0x1e, 0x62, 0x3a, 0xc0, 0xfe, 0xb0, 0xee, - 0xcb, 0x63, 0x2f, 0xe6, 0x4c, 0x32, 0xab, 0xac, 0x52, 0x9e, 0x49, 0x79, 0xc3, 0xba, 0xbd, 0x1e, - 0x32, 0x31, 0xa5, 0xfb, 0x82, 0x4c, 0xc9, 0xbe, 0x20, 0x1a, 0xb5, 0xab, 0x3a, 0xd1, 0x56, 0x27, - 0x5f, 0x1f, 0x4c, 0xca, 0x59, 0x18, 0x40, 0x30, 0xc5, 0x22, 0x4a, 0xf2, 0x6b, 0x84, 0x11, 0xa6, - 0xeb, 0xa6, 0xdf, 0x4c, 0x74, 0x83, 0x30, 0x46, 0x7a, 0xd8, 0x47, 0x71, 0xe4, 0x23, 0x4a, 0x99, - 0x44, 0x32, 0x62, 0xd4, 0xd4, 0xb8, 0x1f, 0x01, 0xb4, 0x5a, 0x82, 0x04, 0x98, 0x44, 0x42, 0x62, - 0x1e, 0xe8, 0xde, 0xd6, 0x2e, 0x2c, 0x87, 0x8c, 0x4a, 0x8e, 0x42, 0xd9, 0x46, 0x9d, 0x0e, 0xc7, - 0x42, 0x54, 0xc0, 0x16, 0xd8, 0x59, 0x0d, 0x4a, 0x49, 0xfc, 0xbe, 0x0e, 0x4f, 0xd1, 0x0e, 0x8e, - 0x7b, 0x6c, 0x84, 0x79, 0x8a, 0xae, 0x68, 0x34, 0x89, 0x27, 0x68, 0x0d, 0x5a, 0x47, 0x91, 0xec, - 0x76, 0x38, 0x3a, 0xfa, 0x0d, 0xce, 0x2b, 0xf8, 0xda, 0x2c, 0x93, 0xe0, 0xd7, 0x61, 0x91, 0x32, - 0x1a, 0x62, 0x51, 0x29, 0x6c, 0xe5, 0x77, 0x0a, 0x81, 0x39, 0x1d, 0x14, 0x7e, 0xbe, 0xdb, 0xcc, - 0xb9, 0x1b, 0xd0, 0x5e, 0x14, 0x0f, 0xb0, 0x88, 0x19, 0x15, 0xd8, 0x7d, 0x0b, 0x60, 0xb9, 0x25, - 0xc8, 0x93, 0xb8, 0x83, 0x24, 0xfe, 0x9f, 0x6e, 0x65, 0xec, 0x6d, 0x58, 0x99, 0xd7, 0x4b, 0xdd, - 0xa9, 0x52, 0x7f, 0x80, 0x68, 0x88, 0x7b, 0xff, 0x54, 0x3d, 0xe3, 0x92, 0x99, 0x97, 0xba, 0xbc, - 0x04, 0xb0, 0x94, 0x8a, 0x3e, 0x42, 0x1c, 0xf5, 0x85, 0xd5, 0x80, 0xab, 0x68, 0x20, 0xbb, 0x8c, - 0x47, 0x72, 0xa4, 0x25, 0x9a, 0x95, 0x4f, 0x1f, 0x6a, 0x6b, 0x66, 0x59, 0x4d, 0xf3, 0xc7, 0x92, - 0x47, 0x94, 0x04, 0x33, 0xd4, 0x6a, 0xc0, 0x62, 0xac, 0x3a, 0x28, 0x9d, 0x4b, 0xfb, 0x15, 0x6f, - 0xfe, 0x59, 0x78, 0x7a, 0x42, 0xb3, 0x70, 0xfa, 0x75, 0x33, 0x17, 0x18, 0xfa, 0xe0, 0xea, 0xc9, - 0x8f, 0xf7, 0x7b, 0xb3, 0x3e, 0x6e, 0x15, 0xae, 0xcf, 0x29, 0x25, 0xba, 0xfb, 0x6f, 0x0a, 0x30, - 0xdf, 0x12, 0xc4, 0x7a, 0x0d, 0x60, 0x69, 0x7e, 0xa7, 0x6f, 0x2d, 0x8e, 0x5b, 0x5c, 0x20, 0xfb, - 0xee, 0xdf, 0x50, 0xe9, 0xcf, 0x53, 0x3b, 0xf9, 0xfc, 0xfd, 0xd5, 0xca, 0x6d, 0x77, 0xdb, 0x5f, - 0xf2, 0xf8, 0x7d, 0x6e, 0xaa, 0xda, 0x26, 0x6c, 0x3d, 0x07, 0xf0, 0x4a, 0x76, 0x25, 0xdd, 0xa5, - 0xe3, 0x32, 0x8c, 0xbd, 0x77, 0x31, 0x93, 0x0a, 0xdd, 0x51, 0x42, 0xdb, 0xee, 0xcd, 0xa5, 0x42, - 0x03, 0x55, 0x93, 0xd1, 0xc9, 0xae, 0xd9, 0x72, 0x9d, 0x0c, 0xf3, 0x07, 0x9d, 0xe5, 0xeb, 0x73, - 0xbe, 0x4e, 0xa8, 0x6a, 0x52, 0x9d, 0x67, 0xf0, 0x72, 0x66, 0xcf, 0x6e, 0x9c, 0x73, 0x6f, 0x8d, - 0xd8, 0xbb, 0x17, 0x22, 0x89, 0x4a, 0xf3, 0xe1, 0xe9, 0xd8, 0x01, 0x67, 0x63, 0x07, 0x7c, 0x1b, - 0x3b, 0xe0, 0xc5, 0xc4, 0xc9, 0x9d, 0x4d, 0x9c, 0xdc, 0x97, 0x89, 0x93, 0x7b, 0x5a, 0x23, 0x91, - 0xec, 0x0e, 0x0e, 0xbd, 0x90, 0xf5, 0x8d, 0xa6, 0xfe, 0x1c, 0xd6, 0x1b, 0xfe, 0x71, 0x46, 0x79, - 0x14, 0x63, 0x71, 0x58, 0x54, 0xff, 0x9c, 0xf7, 0x7e, 0x05, 0x00, 0x00, 0xff, 0xff, 0x54, 0x11, - 0xed, 0x56, 0xf0, 0x05, 0x00, 0x00, -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConn - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion4 - -// MsgClient is the client API for Msg service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type MsgClient interface { - // RegisterRevenue registers a new contract for receiving transaction fees - RegisterRevenue(ctx context.Context, in *MsgRegisterRevenue, opts ...grpc.CallOption) (*MsgRegisterRevenueResponse, error) - // UpdateRevenue updates the withdrawer address of a revenue - UpdateRevenue(ctx context.Context, in *MsgUpdateRevenue, opts ...grpc.CallOption) (*MsgUpdateRevenueResponse, error) - // CancelRevenue cancels a contract's fee registration and further receival - // of transaction fees - CancelRevenue(ctx context.Context, in *MsgCancelRevenue, opts ...grpc.CallOption) (*MsgCancelRevenueResponse, error) - // UpdateParams defined a governance operation for updating the x/revenue module parameters. - // The authority is hard-coded to the Cosmos SDK x/gov module account - UpdateParams(ctx context.Context, in *MsgUpdateParams, opts ...grpc.CallOption) (*MsgUpdateParamsResponse, error) -} - -type msgClient struct { - cc grpc1.ClientConn -} - -func NewMsgClient(cc grpc1.ClientConn) MsgClient { - return &msgClient{cc} -} - -func (c *msgClient) RegisterRevenue(ctx context.Context, in *MsgRegisterRevenue, opts ...grpc.CallOption) (*MsgRegisterRevenueResponse, error) { - out := new(MsgRegisterRevenueResponse) - err := c.cc.Invoke(ctx, "/evmos.revenue.v1.Msg/RegisterRevenue", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *msgClient) UpdateRevenue(ctx context.Context, in *MsgUpdateRevenue, opts ...grpc.CallOption) (*MsgUpdateRevenueResponse, error) { - out := new(MsgUpdateRevenueResponse) - err := c.cc.Invoke(ctx, "/evmos.revenue.v1.Msg/UpdateRevenue", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *msgClient) CancelRevenue(ctx context.Context, in *MsgCancelRevenue, opts ...grpc.CallOption) (*MsgCancelRevenueResponse, error) { - out := new(MsgCancelRevenueResponse) - err := c.cc.Invoke(ctx, "/evmos.revenue.v1.Msg/CancelRevenue", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *msgClient) UpdateParams(ctx context.Context, in *MsgUpdateParams, opts ...grpc.CallOption) (*MsgUpdateParamsResponse, error) { - out := new(MsgUpdateParamsResponse) - err := c.cc.Invoke(ctx, "/evmos.revenue.v1.Msg/UpdateParams", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// MsgServer is the server API for Msg service. -type MsgServer interface { - // RegisterRevenue registers a new contract for receiving transaction fees - RegisterRevenue(context.Context, *MsgRegisterRevenue) (*MsgRegisterRevenueResponse, error) - // UpdateRevenue updates the withdrawer address of a revenue - UpdateRevenue(context.Context, *MsgUpdateRevenue) (*MsgUpdateRevenueResponse, error) - // CancelRevenue cancels a contract's fee registration and further receival - // of transaction fees - CancelRevenue(context.Context, *MsgCancelRevenue) (*MsgCancelRevenueResponse, error) - // UpdateParams defined a governance operation for updating the x/revenue module parameters. - // The authority is hard-coded to the Cosmos SDK x/gov module account - UpdateParams(context.Context, *MsgUpdateParams) (*MsgUpdateParamsResponse, error) -} - -// UnimplementedMsgServer can be embedded to have forward compatible implementations. -type UnimplementedMsgServer struct { -} - -func (*UnimplementedMsgServer) RegisterRevenue(ctx context.Context, req *MsgRegisterRevenue) (*MsgRegisterRevenueResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method RegisterRevenue not implemented") -} -func (*UnimplementedMsgServer) UpdateRevenue(ctx context.Context, req *MsgUpdateRevenue) (*MsgUpdateRevenueResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateRevenue not implemented") -} -func (*UnimplementedMsgServer) CancelRevenue(ctx context.Context, req *MsgCancelRevenue) (*MsgCancelRevenueResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method CancelRevenue not implemented") -} -func (*UnimplementedMsgServer) UpdateParams(ctx context.Context, req *MsgUpdateParams) (*MsgUpdateParamsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateParams not implemented") -} - -func RegisterMsgServer(s grpc1.Server, srv MsgServer) { - s.RegisterService(&_Msg_serviceDesc, srv) -} - -func _Msg_RegisterRevenue_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MsgRegisterRevenue) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MsgServer).RegisterRevenue(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/evmos.revenue.v1.Msg/RegisterRevenue", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).RegisterRevenue(ctx, req.(*MsgRegisterRevenue)) - } - return interceptor(ctx, in, info, handler) -} - -func _Msg_UpdateRevenue_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MsgUpdateRevenue) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MsgServer).UpdateRevenue(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/evmos.revenue.v1.Msg/UpdateRevenue", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).UpdateRevenue(ctx, req.(*MsgUpdateRevenue)) - } - return interceptor(ctx, in, info, handler) -} - -func _Msg_CancelRevenue_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MsgCancelRevenue) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MsgServer).CancelRevenue(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/evmos.revenue.v1.Msg/CancelRevenue", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).CancelRevenue(ctx, req.(*MsgCancelRevenue)) - } - return interceptor(ctx, in, info, handler) -} - -func _Msg_UpdateParams_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MsgUpdateParams) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MsgServer).UpdateParams(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/evmos.revenue.v1.Msg/UpdateParams", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).UpdateParams(ctx, req.(*MsgUpdateParams)) - } - return interceptor(ctx, in, info, handler) -} - -var _Msg_serviceDesc = grpc.ServiceDesc{ - ServiceName: "evmos.revenue.v1.Msg", - HandlerType: (*MsgServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "RegisterRevenue", - Handler: _Msg_RegisterRevenue_Handler, - }, - { - MethodName: "UpdateRevenue", - Handler: _Msg_UpdateRevenue_Handler, - }, - { - MethodName: "CancelRevenue", - Handler: _Msg_CancelRevenue_Handler, - }, - { - MethodName: "UpdateParams", - Handler: _Msg_UpdateParams_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "evmos/revenue/v1/tx.proto", -} - -func (m *MsgRegisterRevenue) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgRegisterRevenue) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgRegisterRevenue) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Nonces) > 0 { - dAtA2 := make([]byte, len(m.Nonces)*10) - var j1 int - for _, num := range m.Nonces { - for num >= 1<<7 { - dAtA2[j1] = uint8(uint64(num)&0x7f | 0x80) - num >>= 7 - j1++ - } - dAtA2[j1] = uint8(num) - j1++ - } - i -= j1 - copy(dAtA[i:], dAtA2[:j1]) - i = encodeVarintTx(dAtA, i, uint64(j1)) - i-- - dAtA[i] = 0x22 - } - if len(m.WithdrawerAddress) > 0 { - i -= len(m.WithdrawerAddress) - copy(dAtA[i:], m.WithdrawerAddress) - i = encodeVarintTx(dAtA, i, uint64(len(m.WithdrawerAddress))) - i-- - dAtA[i] = 0x1a - } - if len(m.DeployerAddress) > 0 { - i -= len(m.DeployerAddress) - copy(dAtA[i:], m.DeployerAddress) - i = encodeVarintTx(dAtA, i, uint64(len(m.DeployerAddress))) - i-- - dAtA[i] = 0x12 - } - if len(m.ContractAddress) > 0 { - i -= len(m.ContractAddress) - copy(dAtA[i:], m.ContractAddress) - i = encodeVarintTx(dAtA, i, uint64(len(m.ContractAddress))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *MsgRegisterRevenueResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgRegisterRevenueResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgRegisterRevenueResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *MsgUpdateRevenue) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgUpdateRevenue) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgUpdateRevenue) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.WithdrawerAddress) > 0 { - i -= len(m.WithdrawerAddress) - copy(dAtA[i:], m.WithdrawerAddress) - i = encodeVarintTx(dAtA, i, uint64(len(m.WithdrawerAddress))) - i-- - dAtA[i] = 0x1a - } - if len(m.DeployerAddress) > 0 { - i -= len(m.DeployerAddress) - copy(dAtA[i:], m.DeployerAddress) - i = encodeVarintTx(dAtA, i, uint64(len(m.DeployerAddress))) - i-- - dAtA[i] = 0x12 - } - if len(m.ContractAddress) > 0 { - i -= len(m.ContractAddress) - copy(dAtA[i:], m.ContractAddress) - i = encodeVarintTx(dAtA, i, uint64(len(m.ContractAddress))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *MsgUpdateRevenueResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgUpdateRevenueResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgUpdateRevenueResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *MsgCancelRevenue) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgCancelRevenue) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgCancelRevenue) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.DeployerAddress) > 0 { - i -= len(m.DeployerAddress) - copy(dAtA[i:], m.DeployerAddress) - i = encodeVarintTx(dAtA, i, uint64(len(m.DeployerAddress))) - i-- - dAtA[i] = 0x12 - } - if len(m.ContractAddress) > 0 { - i -= len(m.ContractAddress) - copy(dAtA[i:], m.ContractAddress) - i = encodeVarintTx(dAtA, i, uint64(len(m.ContractAddress))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *MsgCancelRevenueResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgCancelRevenueResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgCancelRevenueResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *MsgUpdateParams) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgUpdateParams) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgUpdateParams) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - if len(m.Authority) > 0 { - i -= len(m.Authority) - copy(dAtA[i:], m.Authority) - i = encodeVarintTx(dAtA, i, uint64(len(m.Authority))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *MsgUpdateParamsResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgUpdateParamsResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgUpdateParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func encodeVarintTx(dAtA []byte, offset int, v uint64) int { - offset -= sovTx(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *MsgRegisterRevenue) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.ContractAddress) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - l = len(m.DeployerAddress) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - l = len(m.WithdrawerAddress) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - if len(m.Nonces) > 0 { - l = 0 - for _, e := range m.Nonces { - l += sovTx(uint64(e)) - } - n += 1 + sovTx(uint64(l)) + l - } - return n -} - -func (m *MsgRegisterRevenueResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *MsgUpdateRevenue) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.ContractAddress) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - l = len(m.DeployerAddress) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - l = len(m.WithdrawerAddress) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - return n -} - -func (m *MsgUpdateRevenueResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *MsgCancelRevenue) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.ContractAddress) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - l = len(m.DeployerAddress) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - return n -} - -func (m *MsgCancelRevenueResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *MsgUpdateParams) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Authority) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - l = m.Params.Size() - n += 1 + l + sovTx(uint64(l)) - return n -} - -func (m *MsgUpdateParamsResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func sovTx(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozTx(x uint64) (n int) { - return sovTx(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *MsgRegisterRevenue) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgRegisterRevenue: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgRegisterRevenue: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ContractAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ContractAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DeployerAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.DeployerAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field WithdrawerAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.WithdrawerAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType == 0 { - var v uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Nonces = append(m.Nonces, v) - } else if wireType == 2 { - var packedLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - packedLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if packedLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + packedLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var elementCount int - var count int - for _, integer := range dAtA[iNdEx:postIndex] { - if integer < 128 { - count++ - } - } - elementCount = count - if elementCount != 0 && len(m.Nonces) == 0 { - m.Nonces = make([]uint64, 0, elementCount) - } - for iNdEx < postIndex { - var v uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Nonces = append(m.Nonces, v) - } - } else { - return fmt.Errorf("proto: wrong wireType = %d for field Nonces", wireType) - } - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgRegisterRevenueResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgRegisterRevenueResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgRegisterRevenueResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgUpdateRevenue) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgUpdateRevenue: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgUpdateRevenue: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ContractAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ContractAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DeployerAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.DeployerAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field WithdrawerAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.WithdrawerAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgUpdateRevenueResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgUpdateRevenueResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgUpdateRevenueResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgCancelRevenue) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgCancelRevenue: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgCancelRevenue: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ContractAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ContractAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DeployerAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.DeployerAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgCancelRevenueResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgCancelRevenueResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgCancelRevenueResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgUpdateParams) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgUpdateParams: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgUpdateParams: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Authority", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Authority = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgUpdateParamsResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgUpdateParamsResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgUpdateParamsResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipTx(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowTx - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowTx - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowTx - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthTx - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupTx - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthTx - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthTx = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowTx = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupTx = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/revenue/v1/types/tx.pb.gw.go b/x/revenue/v1/types/tx.pb.gw.go deleted file mode 100644 index 179a239b45..0000000000 --- a/x/revenue/v1/types/tx.pb.gw.go +++ /dev/null @@ -1,337 +0,0 @@ -// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. -// source: evmos/revenue/v1/tx.proto - -/* -Package types is a reverse proxy. - -It translates gRPC into RESTful JSON APIs. -*/ -package types - -import ( - "context" - "io" - "net/http" - - "github.com/golang/protobuf/descriptor" - "github.com/golang/protobuf/proto" - "github.com/grpc-ecosystem/grpc-gateway/runtime" - "github.com/grpc-ecosystem/grpc-gateway/utilities" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/status" -) - -// Suppress "imported and not used" errors -var _ codes.Code -var _ io.Reader -var _ status.Status -var _ = runtime.String -var _ = utilities.NewDoubleArray -var _ = descriptor.ForMessage -var _ = metadata.Join - -var ( - filter_Msg_RegisterRevenue_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - -func request_Msg_RegisterRevenue_0(ctx context.Context, marshaler runtime.Marshaler, client MsgClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq MsgRegisterRevenue - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Msg_RegisterRevenue_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.RegisterRevenue(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Msg_RegisterRevenue_0(ctx context.Context, marshaler runtime.Marshaler, server MsgServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq MsgRegisterRevenue - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Msg_RegisterRevenue_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.RegisterRevenue(ctx, &protoReq) - return msg, metadata, err - -} - -var ( - filter_Msg_UpdateRevenue_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - -func request_Msg_UpdateRevenue_0(ctx context.Context, marshaler runtime.Marshaler, client MsgClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq MsgUpdateRevenue - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Msg_UpdateRevenue_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.UpdateRevenue(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Msg_UpdateRevenue_0(ctx context.Context, marshaler runtime.Marshaler, server MsgServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq MsgUpdateRevenue - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Msg_UpdateRevenue_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.UpdateRevenue(ctx, &protoReq) - return msg, metadata, err - -} - -var ( - filter_Msg_CancelRevenue_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - -func request_Msg_CancelRevenue_0(ctx context.Context, marshaler runtime.Marshaler, client MsgClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq MsgCancelRevenue - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Msg_CancelRevenue_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.CancelRevenue(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Msg_CancelRevenue_0(ctx context.Context, marshaler runtime.Marshaler, server MsgServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq MsgCancelRevenue - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Msg_CancelRevenue_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.CancelRevenue(ctx, &protoReq) - return msg, metadata, err - -} - -// RegisterMsgHandlerServer registers the http handlers for service Msg to "mux". -// UnaryRPC :call MsgServer directly. -// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. -// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterMsgHandlerFromEndpoint instead. -func RegisterMsgHandlerServer(ctx context.Context, mux *runtime.ServeMux, server MsgServer) error { - - mux.Handle("POST", pattern_Msg_RegisterRevenue_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Msg_RegisterRevenue_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Msg_RegisterRevenue_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_Msg_UpdateRevenue_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Msg_UpdateRevenue_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Msg_UpdateRevenue_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_Msg_CancelRevenue_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Msg_CancelRevenue_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Msg_CancelRevenue_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - -// RegisterMsgHandlerFromEndpoint is same as RegisterMsgHandler but -// automatically dials to "endpoint" and closes the connection when "ctx" gets done. -func RegisterMsgHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { - conn, err := grpc.Dial(endpoint, opts...) - if err != nil { - return err - } - defer func() { - if err != nil { - if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) - } - return - } - go func() { - <-ctx.Done() - if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) - } - }() - }() - - return RegisterMsgHandler(ctx, mux, conn) -} - -// RegisterMsgHandler registers the http handlers for service Msg to "mux". -// The handlers forward requests to the grpc endpoint over "conn". -func RegisterMsgHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { - return RegisterMsgHandlerClient(ctx, mux, NewMsgClient(conn)) -} - -// RegisterMsgHandlerClient registers the http handlers for service Msg -// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "MsgClient". -// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "MsgClient" -// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in -// "MsgClient" to call the correct interceptors. -func RegisterMsgHandlerClient(ctx context.Context, mux *runtime.ServeMux, client MsgClient) error { - - mux.Handle("POST", pattern_Msg_RegisterRevenue_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Msg_RegisterRevenue_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Msg_RegisterRevenue_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_Msg_UpdateRevenue_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Msg_UpdateRevenue_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Msg_UpdateRevenue_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_Msg_CancelRevenue_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Msg_CancelRevenue_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Msg_CancelRevenue_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - -var ( - pattern_Msg_RegisterRevenue_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"evmos", "revenue", "v1", "tx", "register_revenue"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Msg_UpdateRevenue_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"evmos", "revenue", "v1", "tx", "update_revenue"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Msg_CancelRevenue_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"evmos", "revenue", "v1", "tx", "cancel_revenue"}, "", runtime.AssumeColonVerbOpt(false))) -) - -var ( - forward_Msg_RegisterRevenue_0 = runtime.ForwardResponseMessage - - forward_Msg_UpdateRevenue_0 = runtime.ForwardResponseMessage - - forward_Msg_CancelRevenue_0 = runtime.ForwardResponseMessage -) From 07a8a4e4bd7d069b3bc84f0dba2fcdbb7ef11a2f Mon Sep 17 00:00:00 2001 From: stepit <48993133+0xstepit@users.noreply.github.com> Date: Fri, 1 Mar 2024 17:20:58 +0100 Subject: [PATCH 145/345] chore(evm): remove evm hooks (#2380) * remove hooks files * remove wirings * update state transition without hooks * remove references to evm hook and update tests * run make format * update changelog * make changelog checker happy * make changelog checker happy again * fix errors * run make format --------- Co-authored-by: 0xstepit <0xstepit@users.noreply.github.com> --- CHANGELOG.md | 1 + app/app.go | 5 - x/evm/handler_test.go | 196 +++++++++++-------------------- x/evm/keeper/hooks.go | 31 ----- x/evm/keeper/hooks_test.go | 90 -------------- x/evm/keeper/keeper.go | 28 ----- x/evm/keeper/state_transition.go | 78 ++---------- x/evm/types/interfaces.go | 11 -- 8 files changed, 83 insertions(+), 357 deletions(-) delete mode 100644 x/evm/keeper/hooks.go delete mode 100644 x/evm/keeper/hooks_test.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 7605a1a291..251e8a8f87 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -48,6 +48,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (tests) [#2332](https://github.com/evmos/evmos/pull/2332) Create configuration in temporary directory in `Init` command test. - (deps) [#2355](https://github.com/evmos/evmos/pull/2355) Bump Cosmos-SDK to v0.47.8-evmos. - (revenue) [#2379](https://github.com/evmos/evmos/pull/2379) Remove `x/revenue` module. +- (evm) [#2380](https://github.com/evmos/evmos/pull/2380) Remove EVM hooks from app and EVM module. ### Bug Fixes diff --git a/app/app.go b/app/app.go index 71ffa114c0..efe8ef9c2d 100644 --- a/app/app.go +++ b/app/app.go @@ -525,11 +525,6 @@ func NewEvmos( ), ) - app.EvmKeeper = app.EvmKeeper.SetHooks( - evmkeeper.NewMultiEvmHooks(), - ) - // NOTE: app.Erc20Keeper is already initialized elsewhere - // Override the ICS20 app module transferModule := transfer.NewAppModule(app.TransferKeeper) diff --git a/x/evm/handler_test.go b/x/evm/handler_test.go index 17879d8764..8dff858744 100644 --- a/x/evm/handler_test.go +++ b/x/evm/handler_test.go @@ -616,153 +616,95 @@ func (suite *EvmTestSuite) deployERC20Contract() common.Address { // - when transaction reverted, nonce is still increased. func (suite *EvmTestSuite) TestERC20TransferReverted() { intrinsicGas := uint64(21572) - // test different hooks scenarios - testCases := []struct { - msg string - gasLimit uint64 - hooks types.EvmHooks - expErr string - }{ - { - "no hooks", - intrinsicGas, // enough for intrinsicGas, but not enough for execution - nil, - "out of gas", - }, - { - "success hooks", - intrinsicGas, // enough for intrinsicGas, but not enough for execution - &DummyHook{}, - "out of gas", - }, - { - "failure hooks", - 1000000, // enough gas limit, but hooks fails. - &FailureHook{}, - "failed to execute post processing", - }, - } - for _, tc := range testCases { - suite.Run(tc.msg, func() { - suite.SetupTest() - k := suite.app.EvmKeeper.CleanHooks() - k.SetHooks(tc.hooks) - - // add some fund to pay gas fee - err := k.SetBalance(suite.ctx, suite.from, big.NewInt(1000000000000000)) - suite.Require().NoError(err) - - contract := suite.deployERC20Contract() - - data, err := types.ERC20Contract.ABI.Pack("transfer", suite.from, big.NewInt(10)) - suite.Require().NoError(err) - - gasPrice := big.NewInt(1000000000) // must be bigger than or equal to baseFee - nonce := k.GetNonce(suite.ctx, suite.from) - ethTxParams := &types.EvmTxArgs{ - ChainID: suite.chainID, - Nonce: nonce, - To: &contract, - Amount: big.NewInt(0), - GasPrice: gasPrice, - GasLimit: tc.gasLimit, - Input: data, - } - tx := types.NewTx(ethTxParams) - suite.SignTx(tx) + suite.SetupTest() + k := suite.app.EvmKeeper - before := k.GetBalance(suite.ctx, suite.from) + // add some fund to pay gas fee + err := k.SetBalance(suite.ctx, suite.from, big.NewInt(1000000000000000)) + suite.Require().NoError(err) - evmParams := suite.app.EvmKeeper.GetParams(suite.ctx) - ethCfg := evmParams.GetChainConfig().EthereumConfig(nil) - baseFee := suite.app.EvmKeeper.GetBaseFee(suite.ctx, ethCfg) + contract := suite.deployERC20Contract() - txData, err := types.UnpackTxData(tx.Data) - suite.Require().NoError(err) - fees, err := keeper.VerifyFee(txData, types.DefaultEVMDenom, baseFee, true, true, suite.ctx.IsCheckTx()) - suite.Require().NoError(err) - err = k.DeductTxCostsFromUserBalance(suite.ctx, fees, common.HexToAddress(tx.From)) - suite.Require().NoError(err) + data, err := types.ERC20Contract.ABI.Pack("transfer", suite.from, big.NewInt(10)) + suite.Require().NoError(err) - res, err := k.EthereumTx(sdk.WrapSDKContext(suite.ctx), tx) - suite.Require().NoError(err) + gasPrice := big.NewInt(1000000000) // must be bigger than or equal to baseFee + nonce := k.GetNonce(suite.ctx, suite.from) + ethTxParams := &types.EvmTxArgs{ + ChainID: suite.chainID, + Nonce: nonce, + To: &contract, + Amount: big.NewInt(0), + GasPrice: gasPrice, + GasLimit: intrinsicGas, + Input: data, + } + tx := types.NewTx(ethTxParams) + suite.SignTx(tx) - suite.Require().True(res.Failed()) - suite.Require().Equal(tc.expErr, res.VmError) - suite.Require().Empty(res.Logs) + before := k.GetBalance(suite.ctx, suite.from) - after := k.GetBalance(suite.ctx, suite.from) + evmParams := suite.app.EvmKeeper.GetParams(suite.ctx) + ethCfg := evmParams.GetChainConfig().EthereumConfig(nil) + baseFee := suite.app.EvmKeeper.GetBaseFee(suite.ctx, ethCfg) - if tc.expErr == "out of gas" { - suite.Require().Equal(tc.gasLimit, res.GasUsed) - } else { - suite.Require().Greater(tc.gasLimit, res.GasUsed) - } + txData, err := types.UnpackTxData(tx.Data) + suite.Require().NoError(err) + fees, err := keeper.VerifyFee(txData, types.DefaultEVMDenom, baseFee, true, true, suite.ctx.IsCheckTx()) + suite.Require().NoError(err) + err = k.DeductTxCostsFromUserBalance(suite.ctx, fees, common.HexToAddress(tx.From)) + suite.Require().NoError(err) - // check gas refund works: only deducted fee for gas used, rather than gas limit. - suite.Require().Equal(new(big.Int).Mul(gasPrice, big.NewInt(int64(res.GasUsed))), new(big.Int).Sub(before, after)) + res, err := k.EthereumTx(sdk.WrapSDKContext(suite.ctx), tx) + suite.Require().NoError(err) - // nonce should not be increased. - nonce2 := k.GetNonce(suite.ctx, suite.from) - suite.Require().Equal(nonce, nonce2) - }) - } + suite.Require().True(res.Failed()) + suite.Require().Equal("out of gas", res.VmError) + suite.Require().Empty(res.Logs) + + after := k.GetBalance(suite.ctx, suite.from) + + suite.Require().Equal(intrinsicGas, res.GasUsed) + + // check gas refund works: only deducted fee for gas used, rather than gas limit. + suite.Require().Equal(new(big.Int).Mul(gasPrice, big.NewInt(int64(res.GasUsed))), new(big.Int).Sub(before, after)) + + // nonce should not be increased. + nonce2 := k.GetNonce(suite.ctx, suite.from) + suite.Require().Equal(nonce, nonce2) } func (suite *EvmTestSuite) TestContractDeploymentRevert() { intrinsicGas := uint64(134180) - testCases := []struct { - msg string - gasLimit uint64 - hooks types.EvmHooks - }{ - { - "no hooks", - intrinsicGas, - nil, - }, - { - "success hooks", - intrinsicGas, - &DummyHook{}, - }, - } - for _, tc := range testCases { - suite.Run(tc.msg, func() { - suite.SetupTest() - k := suite.app.EvmKeeper.CleanHooks() - - // test with different hooks scenarios - k.SetHooks(tc.hooks) + suite.SetupTest() + k := suite.app.EvmKeeper - nonce := k.GetNonce(suite.ctx, suite.from) - ctorArgs, err := types.ERC20Contract.ABI.Pack("", suite.from, big.NewInt(0)) - suite.Require().NoError(err) + nonce := k.GetNonce(suite.ctx, suite.from) + ctorArgs, err := types.ERC20Contract.ABI.Pack("", suite.from, big.NewInt(0)) + suite.Require().NoError(err) - ethTxParams := &types.EvmTxArgs{ - Nonce: nonce, - GasLimit: tc.gasLimit, - Input: append(types.ERC20Contract.Bin, ctorArgs...), - } - tx := types.NewTx(ethTxParams) - suite.SignTx(tx) + ethTxParams := &types.EvmTxArgs{ + Nonce: nonce, + GasLimit: intrinsicGas, + Input: append(types.ERC20Contract.Bin, ctorArgs...), + } + tx := types.NewTx(ethTxParams) + suite.SignTx(tx) - // simulate nonce increment in ante handler - db := suite.StateDB() - db.SetNonce(suite.from, nonce+1) - suite.Require().NoError(db.Commit()) + // simulate nonce increment in ante handler + db := suite.StateDB() + db.SetNonce(suite.from, nonce+1) + suite.Require().NoError(db.Commit()) - rsp, err := k.EthereumTx(sdk.WrapSDKContext(suite.ctx), tx) - suite.Require().NoError(err) - suite.Require().True(rsp.Failed()) + rsp, err := k.EthereumTx(sdk.WrapSDKContext(suite.ctx), tx) + suite.Require().NoError(err) + suite.Require().True(rsp.Failed()) - // nonce don't change - nonce2 := k.GetNonce(suite.ctx, suite.from) - suite.Require().Equal(nonce+1, nonce2) - }) - } + // nonce don't change + nonce2 := k.GetNonce(suite.ctx, suite.from) + suite.Require().Equal(nonce+1, nonce2) } // DummyHook implements EvmHooks interface diff --git a/x/evm/keeper/hooks.go b/x/evm/keeper/hooks.go deleted file mode 100644 index adb076625d..0000000000 --- a/x/evm/keeper/hooks.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) -package keeper - -import ( - errorsmod "cosmossdk.io/errors" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/ethereum/go-ethereum/core" - ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v16/x/evm/types" -) - -var _ types.EvmHooks = MultiEvmHooks{} - -// MultiEvmHooks combine multiple evm hooks, all hook functions are run in array sequence -type MultiEvmHooks []types.EvmHooks - -// NewMultiEvmHooks combine multiple evm hooks -func NewMultiEvmHooks(hooks ...types.EvmHooks) MultiEvmHooks { - return hooks -} - -// PostTxProcessing delegate the call to underlying hooks -func (mh MultiEvmHooks) PostTxProcessing(ctx sdk.Context, msg core.Message, receipt *ethtypes.Receipt) error { - for i := range mh { - if err := mh[i].PostTxProcessing(ctx, msg, receipt); err != nil { - return errorsmod.Wrapf(err, "EVM hook %T failed", mh[i]) - } - } - return nil -} diff --git a/x/evm/keeper/hooks_test.go b/x/evm/keeper/hooks_test.go deleted file mode 100644 index d0cb6f8b04..0000000000 --- a/x/evm/keeper/hooks_test.go +++ /dev/null @@ -1,90 +0,0 @@ -package keeper_test - -import ( - "errors" - "math/big" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" - ethtypes "github.com/ethereum/go-ethereum/core/types" - - "github.com/evmos/evmos/v16/x/evm/keeper" - "github.com/evmos/evmos/v16/x/evm/statedb" - "github.com/evmos/evmos/v16/x/evm/types" -) - -// LogRecordHook records all the logs -type LogRecordHook struct { - Logs []*ethtypes.Log -} - -func (dh *LogRecordHook) PostTxProcessing(_ sdk.Context, _ core.Message, receipt *ethtypes.Receipt) error { - dh.Logs = receipt.Logs - return nil -} - -// FailureHook always fail -type FailureHook struct{} - -func (dh FailureHook) PostTxProcessing(_ sdk.Context, _ core.Message, _ *ethtypes.Receipt) error { - return errors.New("post tx processing failed") -} - -func (suite *KeeperTestSuite) TestEvmHooks() { - testCases := []struct { - msg string - setupHook func() types.EvmHooks - expFunc func(hook types.EvmHooks, result error) - }{ - { - "log collect hook", - func() types.EvmHooks { - return &LogRecordHook{} - }, - func(hook types.EvmHooks, result error) { - suite.Require().NoError(result) - suite.Require().Equal(1, len((hook.(*LogRecordHook).Logs))) - }, - }, - { - "always fail hook", - func() types.EvmHooks { - return &FailureHook{} - }, - func(_ types.EvmHooks, result error) { - suite.Require().Error(result) - }, - }, - } - - for _, tc := range testCases { - suite.SetupTest() - suite.app.EvmKeeper = suite.app.EvmKeeper.CleanHooks() - hook := tc.setupHook() - suite.app.EvmKeeper.SetHooks(keeper.NewMultiEvmHooks(hook)) - - k := suite.app.EvmKeeper - ctx := suite.ctx - txHash := common.BigToHash(big.NewInt(1)) - vmdb := statedb.New(ctx, k, statedb.NewTxConfig( - common.BytesToHash(ctx.HeaderHash().Bytes()), - txHash, - 0, - 0, - )) - - vmdb.AddLog(ðtypes.Log{ - Topics: []common.Hash{}, - Address: suite.address, - }) - logs := vmdb.Logs() - receipt := ðtypes.Receipt{ - TxHash: txHash, - Logs: logs, - } - result := k.PostTxProcessing(ctx, ethtypes.Message{}, receipt) - - tc.expFunc(hook, result) - } -} diff --git a/x/evm/keeper/keeper.go b/x/evm/keeper/keeper.go index a21345f3b3..f4555d12dc 100644 --- a/x/evm/keeper/keeper.go +++ b/x/evm/keeper/keeper.go @@ -55,8 +55,6 @@ type Keeper struct { // Tracer used to collect execution traces from the EVM transaction execution tracer string - // EVM Hooks for tx post-processing - hooks types.EvmHooks // Legacy subspace ss paramstypes.Subspace @@ -230,32 +228,6 @@ func (k Keeper) GetAccountStorage(ctx sdk.Context, address common.Address) types // Account // ---------------------------------------------------------------------------- -// SetHooks sets the hooks for the EVM module -// It should be called only once during initialization, it panic if called more than once. -func (k *Keeper) SetHooks(eh types.EvmHooks) *Keeper { - if k.hooks != nil { - panic("cannot set evm hooks twice") - } - - k.hooks = eh - return k -} - -// CleanHooks resets the hooks for the EVM module -// NOTE: Should only be used for testing purposes -func (k *Keeper) CleanHooks() *Keeper { - k.hooks = nil - return k -} - -// PostTxProcessing delegate the call to the hooks. If no hook has been registered, this function returns with a `nil` error -func (k *Keeper) PostTxProcessing(ctx sdk.Context, msg core.Message, receipt *ethtypes.Receipt) error { - if k.hooks == nil { - return nil - } - return k.hooks.PostTxProcessing(ctx, msg, receipt) -} - // Tracer return a default vm.Tracer based on current keeper state func (k Keeper) Tracer(ctx sdk.Context, msg core.Message, ethCfg *params.ChainConfig) vm.EVMLogger { return types.NewTracer(k.tracer, msg, ethCfg, ctx.BlockHeight()) diff --git a/x/evm/keeper/state_transition.go b/x/evm/keeper/state_transition.go index f96af44386..e0b0836f88 100644 --- a/x/evm/keeper/state_transition.go +++ b/x/evm/keeper/state_transition.go @@ -21,7 +21,6 @@ import ( "github.com/ethereum/go-ethereum/core" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/params" ) @@ -136,10 +135,7 @@ func (k Keeper) GetHashFn(ctx sdk.Context) vm.GetHashFunc { // // For relevant discussion see: https://github.com/cosmos/cosmos-sdk/discussions/9072 func (k *Keeper) ApplyTransaction(ctx sdk.Context, tx *ethtypes.Transaction) (*types.MsgEthereumTxResponse, error) { - var ( - bloom *big.Int - bloomReceipt ethtypes.Bloom - ) + var bloom *big.Int cfg, err := k.EVMConfig(ctx, sdk.ConsAddress(ctx.BlockHeader().ProposerAddress), k.eip155ChainID) if err != nil { @@ -154,23 +150,17 @@ func (k *Keeper) ApplyTransaction(ctx sdk.Context, tx *ethtypes.Transaction) (*t return nil, errorsmod.Wrap(err, "failed to return ethereum transaction as core message") } - // snapshot to contain the tx processing and post processing in same scope - var commit func() - tmpCtx := ctx - if k.hooks != nil { - // Create a cache context to revert state when tx hooks fails, - // the cache context is only committed when both tx and hooks executed successfully. - // Didn't use `Snapshot` because the context stack has exponential complexity on certain operations, - // thus restricted to be used only inside `ApplyMessage`. - tmpCtx, commit = ctx.CacheContext() - } + // Create a cache context to revert state. The cache context is only committed when both tx and hooks executed successfully. + // Didn't use `Snapshot` because the context stack has exponential complexity on certain operations, + // thus restricted to be used only inside `ApplyMessage`. + tmpCtx, commit := ctx.CacheContext() // pass true to commit the StateDB res, err := k.ApplyMessageWithConfig(tmpCtx, msg, nil, true, cfg, txConfig) if err != nil { // when a transaction contains multiple msg, as long as one of the msg fails // all gas will be deducted. so is not msg.Gas() - k.ResetGasMeterAndConsumeGas(ctx, ctx.GasMeter().Limit()) + k.ResetGasMeterAndConsumeGas(tmpCtx, tmpCtx.GasMeter().Limit()) return nil, errorsmod.Wrap(err, "failed to apply ethereum core message") } @@ -180,54 +170,11 @@ func (k *Keeper) ApplyTransaction(ctx sdk.Context, tx *ethtypes.Transaction) (*t if len(logs) > 0 { bloom = k.GetBlockBloomTransient(ctx) bloom.Or(bloom, big.NewInt(0).SetBytes(ethtypes.LogsBloom(logs))) - bloomReceipt = ethtypes.BytesToBloom(bloom.Bytes()) - } - - cumulativeGasUsed := res.GasUsed - if ctx.BlockGasMeter() != nil { - limit := ctx.BlockGasMeter().Limit() - cumulativeGasUsed += ctx.BlockGasMeter().GasConsumed() - if cumulativeGasUsed > limit { - cumulativeGasUsed = limit - } - } - - var contractAddr common.Address - if msg.To() == nil { - contractAddr = crypto.CreateAddress(msg.From(), msg.Nonce()) - } - - receipt := ðtypes.Receipt{ - Type: tx.Type(), - PostState: nil, // TODO: intermediate state root - CumulativeGasUsed: cumulativeGasUsed, - Bloom: bloomReceipt, - Logs: logs, - TxHash: txConfig.TxHash, - ContractAddress: contractAddr, - GasUsed: res.GasUsed, - BlockHash: txConfig.BlockHash, - BlockNumber: big.NewInt(ctx.BlockHeight()), - TransactionIndex: txConfig.TxIndex, } if !res.Failed() { - receipt.Status = ethtypes.ReceiptStatusSuccessful - // Only call hooks if tx executed successfully. - if err = k.PostTxProcessing(tmpCtx, msg, receipt); err != nil { - // If hooks return error, revert the whole tx. - res.VmError = types.ErrPostTxProcessing.Error() - k.Logger(ctx).Error("tx post processing failed", "error", err) - - // If the tx failed in post processing hooks, we should clear the logs - res.Logs = nil - } else if commit != nil { - // PostTxProcessing is successful, commit the tmpCtx - commit() - // Since the post-processing can alter the log, we need to update the result - res.Logs = types.NewLogsFromEth(receipt.Logs) - ctx.EventManager().EmitEvents(tmpCtx.EventManager().Events()) - } + commit() + ctx.EventManager().EmitEvents(tmpCtx.EventManager().Events()) } // refund gas in order to match the Ethereum gas consumption instead of the default SDK one. @@ -235,10 +182,10 @@ func (k *Keeper) ApplyTransaction(ctx sdk.Context, tx *ethtypes.Transaction) (*t return nil, errorsmod.Wrapf(err, "failed to refund gas leftover gas to sender %s", msg.From()) } - if len(receipt.Logs) > 0 { + if len(logs) > 0 { // Update transient block bloom filter - k.SetBlockBloomTransient(ctx, receipt.Bloom.Big()) - k.SetLogSizeTransient(ctx, uint64(txConfig.LogIndex)+uint64(len(receipt.Logs))) + k.SetBlockBloomTransient(ctx, bloom) + k.SetLogSizeTransient(ctx, uint64(txConfig.LogIndex)+uint64(len(logs))) } k.SetTxIndexTransient(ctx, uint64(txConfig.TxIndex)+1) @@ -302,7 +249,8 @@ func (k *Keeper) ApplyMessage(ctx sdk.Context, msg core.Message, tracer vm.EVMLo // # Commit parameter // // If commit is true, the `StateDB` will be committed, otherwise discarded. -func (k *Keeper) ApplyMessageWithConfig(ctx sdk.Context, +func (k *Keeper) ApplyMessageWithConfig( + ctx sdk.Context, msg core.Message, tracer vm.EVMLogger, commit bool, diff --git a/x/evm/types/interfaces.go b/x/evm/types/interfaces.go index 762fb0a9f5..7ebb6020e2 100644 --- a/x/evm/types/interfaces.go +++ b/x/evm/types/interfaces.go @@ -11,8 +11,6 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/ethereum/go-ethereum/core" - ethtypes "github.com/ethereum/go-ethereum/core/types" feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" ) @@ -52,15 +50,6 @@ type FeeMarketKeeper interface { CalculateBaseFee(ctx sdk.Context) *big.Int } -// Event Hooks -// These can be utilized to customize evm transaction processing. - -// EvmHooks event hooks for evm tx processing -type EvmHooks interface { - // Must be called after tx is processed successfully, if return an error, the whole transaction is reverted. - PostTxProcessing(ctx sdk.Context, msg core.Message, receipt *ethtypes.Receipt) error -} - type ( LegacyParams = paramtypes.ParamSet // Subspace defines an interface that implements the legacy Cosmos SDK x/params Subspace type. From dd6af0dd78db36f80915139db4eb60198094c248 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Mar 2024 13:06:58 +0000 Subject: [PATCH 146/345] build(deps-dev): bump @openzeppelin/contracts-upgradeable from 4.9.3 to 4.9.6 in /tests/nix_tests/hardhat (#2381) build(deps-dev): bump @openzeppelin/contracts-upgradeable Bumps [@openzeppelin/contracts-upgradeable](https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable) from 4.9.3 to 4.9.6. - [Release notes](https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable/releases) - [Changelog](https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable/blob/master/CHANGELOG.md) - [Commits](https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable/compare/v4.9.3...v4.9.6) --- updated-dependencies: - dependency-name: "@openzeppelin/contracts-upgradeable" dependency-type: direct:development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> --- tests/nix_tests/hardhat/package-lock.json | 14 +++++++------- tests/nix_tests/hardhat/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/nix_tests/hardhat/package-lock.json b/tests/nix_tests/hardhat/package-lock.json index 659a63ef8f..eeac03f595 100644 --- a/tests/nix_tests/hardhat/package-lock.json +++ b/tests/nix_tests/hardhat/package-lock.json @@ -18,7 +18,7 @@ "@nomicfoundation/hardhat-toolbox": "^3.0.0", "@nomicfoundation/hardhat-verify": "^1.1.1", "@openzeppelin/contracts": "^4.9.3", - "@openzeppelin/contracts-upgradeable": "^4.9.3", + "@openzeppelin/contracts-upgradeable": "^4.9.6", "@typechain/ethers-v6": "^0.4.3", "@typechain/hardhat": "^8.0.3", "@types/chai": "^4.3.5", @@ -1481,9 +1481,9 @@ "dev": true }, "node_modules/@openzeppelin/contracts-upgradeable": { - "version": "4.9.3", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.3.tgz", - "integrity": "sha512-jjaHAVRMrE4UuZNfDwjlLGDxTHWIOwTJS2ldnc278a0gevfXfPr8hxKEVBGFBE96kl2G3VHDZhUimw/+G3TG2A==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.6.tgz", + "integrity": "sha512-m4iHazOsOCv1DgM7eD7GupTJ+NFVujRZt1wzddDPSVGpWdKq1SKkla5htKG7+IS4d2XOCtzkUNwRZ7Vq5aEUMA==", "dev": true }, "node_modules/@scure/base": { @@ -7762,9 +7762,9 @@ "dev": true }, "@openzeppelin/contracts-upgradeable": { - "version": "4.9.3", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.3.tgz", - "integrity": "sha512-jjaHAVRMrE4UuZNfDwjlLGDxTHWIOwTJS2ldnc278a0gevfXfPr8hxKEVBGFBE96kl2G3VHDZhUimw/+G3TG2A==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.6.tgz", + "integrity": "sha512-m4iHazOsOCv1DgM7eD7GupTJ+NFVujRZt1wzddDPSVGpWdKq1SKkla5htKG7+IS4d2XOCtzkUNwRZ7Vq5aEUMA==", "dev": true }, "@scure/base": { diff --git a/tests/nix_tests/hardhat/package.json b/tests/nix_tests/hardhat/package.json index 3a018acb53..34b1d8dc65 100644 --- a/tests/nix_tests/hardhat/package.json +++ b/tests/nix_tests/hardhat/package.json @@ -14,7 +14,7 @@ "@nomicfoundation/hardhat-toolbox": "^3.0.0", "@nomicfoundation/hardhat-verify": "^1.1.1", "@openzeppelin/contracts": "^4.9.3", - "@openzeppelin/contracts-upgradeable": "^4.9.3", + "@openzeppelin/contracts-upgradeable": "^4.9.6", "@typechain/ethers-v6": "^0.4.3", "@typechain/hardhat": "^8.0.3", "@types/chai": "^4.3.5", From ce056289551022e04bbf731c5193c835d7634174 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Mar 2024 13:13:31 +0000 Subject: [PATCH 147/345] build(deps): bump @openzeppelin/contracts from 4.9.5 to 4.9.6 in /contracts (#2383) build(deps): bump @openzeppelin/contracts in /contracts Bumps [@openzeppelin/contracts](https://github.com/OpenZeppelin/openzeppelin-contracts) from 4.9.5 to 4.9.6. - [Release notes](https://github.com/OpenZeppelin/openzeppelin-contracts/releases) - [Changelog](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/CHANGELOG.md) - [Commits](https://github.com/OpenZeppelin/openzeppelin-contracts/compare/v4.9.5...v4.9.6) --- updated-dependencies: - dependency-name: "@openzeppelin/contracts" dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> --- contracts/package-lock.json | 8 ++++---- contracts/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/contracts/package-lock.json b/contracts/package-lock.json index 3bab9dfb81..17d95d98fd 100644 --- a/contracts/package-lock.json +++ b/contracts/package-lock.json @@ -9,14 +9,14 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@openzeppelin/contracts": "^4.9.5" + "@openzeppelin/contracts": "^4.9.6" }, "devDependencies": {} }, "node_modules/@openzeppelin/contracts": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.5.tgz", - "integrity": "sha512-ZK+W5mVhRppff9BE6YdR8CC52C8zAvsVAiWhEtQ5+oNxFE6h1WdeWo+FJSF8KKvtxxVYZ7MTP/5KoVpAU3aSWg==" + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.6.tgz", + "integrity": "sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA==" } } } diff --git a/contracts/package.json b/contracts/package.json index 4cb6c1254f..3b92c9ed1e 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -7,7 +7,7 @@ "doc": "docs" }, "dependencies": { - "@openzeppelin/contracts": "^4.9.5" + "@openzeppelin/contracts": "^4.9.6" }, "devDependencies": {}, "scripts": { From 14fd6ddcc9a55bf3f570435faf4958043d6eacc2 Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Mon, 4 Mar 2024 17:30:46 +0100 Subject: [PATCH 148/345] chore(all): remove legacy handler files from repo (#2388) * remove unnecessary handler files * rework evm genesis tests * address linters * add changelog entry --- CHANGELOG.md | 1 + x/erc20/handler.go | 34 -- x/erc20/module.go | 4 - x/evm/genesis_test.go | 142 +++++--- x/evm/handler.go | 30 -- x/evm/handler_test.go | 722 -------------------------------------- x/feemarket/handler.go | 28 -- x/inflation/v1/handler.go | 27 -- x/vesting/module.go | 4 - 9 files changed, 88 insertions(+), 904 deletions(-) delete mode 100644 x/erc20/handler.go delete mode 100644 x/evm/handler.go delete mode 100644 x/evm/handler_test.go delete mode 100644 x/feemarket/handler.go delete mode 100644 x/inflation/v1/handler.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 251e8a8f87..b6efd0fe1b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -78,6 +78,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (cli) [#2245](https://github.com/evmos/evmos/pull/2245) Update convert an address between hex and bech32. - (werc20-precompile) [#2329](https://github.com/evmos/evmos/pull/2329) Make WEVMOS precompile `deposit` and `withdraw` functions no-ops. - (tests) [#2348](https://github.com/evmos/evmos/pull/2348) Extend integration transaction factory utils. +- (all) [#2388](https://github.com/evmos/evmos/pull/2388) Remove legacy handler files from repository. ## [v16.0.2](https://github.com/evmos/evmos/releases/tag/v16.0.2) - 2024-01-16 diff --git a/x/erc20/handler.go b/x/erc20/handler.go deleted file mode 100644 index 82b937b063..0000000000 --- a/x/erc20/handler.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package erc20 - -import ( - errorsmod "cosmossdk.io/errors" - sdk "github.com/cosmos/cosmos-sdk/types" - errortypes "github.com/cosmos/cosmos-sdk/types/errors" - - "github.com/evmos/evmos/v16/x/erc20/types" -) - -// NewHandler defines the erc20 module handler instance -func NewHandler(server types.MsgServer) sdk.Handler { - return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { - ctx = ctx.WithEventManager(sdk.NewEventManager()) - - switch msg := msg.(type) { - case *types.MsgConvertCoin: - res, err := server.ConvertCoin(sdk.WrapSDKContext(ctx), msg) - return sdk.WrapServiceResult(ctx, res, err) - case *types.MsgConvertERC20: - res, err := server.ConvertERC20(sdk.WrapSDKContext(ctx), msg) - return sdk.WrapServiceResult(ctx, res, err) - case *types.MsgUpdateParams: - res, err := server.UpdateParams(sdk.WrapSDKContext(ctx), msg) - return sdk.WrapServiceResult(ctx, res, err) - default: - err := errorsmod.Wrapf(errortypes.ErrUnknownRequest, "unrecognized %s message type: %T", types.ModuleName, msg) - return nil, err - } - } -} diff --git a/x/erc20/module.go b/x/erc20/module.go index fb918d685b..6225eda5a5 100644 --- a/x/erc20/module.go +++ b/x/erc20/module.go @@ -120,10 +120,6 @@ func (AppModule) Name() string { func (am AppModule) RegisterInvariants(_ sdk.InvariantRegistry) {} -func (am AppModule) NewHandler() sdk.Handler { - return NewHandler(&am.keeper) -} - func (am AppModule) RegisterServices(cfg module.Configurator) { types.RegisterMsgServer(cfg.MsgServer(), &am.keeper) types.RegisterQueryServer(cfg.QueryServer(), am.keeper) diff --git a/x/evm/genesis_test.go b/x/evm/genesis_test.go index 38c90f7c54..b1a5786824 100644 --- a/x/evm/genesis_test.go +++ b/x/evm/genesis_test.go @@ -2,20 +2,39 @@ package evm_test import ( "math/big" - - "github.com/ethereum/go-ethereum/common" + "testing" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + "github.com/ethereum/go-ethereum/common" "github.com/evmos/evmos/v16/crypto/ethsecp256k1" + testkeyring "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" + testnetwork "github.com/evmos/evmos/v16/testutil/integration/evmos/network" evmostypes "github.com/evmos/evmos/v16/types" "github.com/evmos/evmos/v16/x/evm" "github.com/evmos/evmos/v16/x/evm/statedb" "github.com/evmos/evmos/v16/x/evm/types" + "github.com/stretchr/testify/require" ) -func (suite *EvmTestSuite) TestInitGenesis() { +type GenesisTestSuite struct { + keyring testkeyring.Keyring + network *testnetwork.UnitTestNetwork +} + +func SetupTest() *GenesisTestSuite { + keyring := testkeyring.New(1) + network := testnetwork.NewUnitTestNetwork( + testnetwork.WithPreFundedAccounts(keyring.GetAllAccAddrs()...), + ) + return &GenesisTestSuite{ + keyring: keyring, + network: network, + } +} + +func TestInitGenesis(t *testing.T) { privkey, err := ethsecp256k1.GenerateKey() - suite.Require().NoError(err) + require.NoError(t, err, "failed to generate private key") address := common.HexToAddress(privkey.PubKey().Address().String()) @@ -23,22 +42,22 @@ func (suite *EvmTestSuite) TestInitGenesis() { testCases := []struct { name string - malleate func() + malleate func(*testnetwork.UnitTestNetwork) genState *types.GenesisState expPanic bool }{ { - "default", - func() {}, - types.DefaultGenesisState(), - false, + name: "default", + malleate: func(_ *testnetwork.UnitTestNetwork) {}, + genState: types.DefaultGenesisState(), + expPanic: false, }, { - "valid account", - func() { + name: "valid account", + malleate: func(_ *testnetwork.UnitTestNetwork) { vmdb.AddBalance(address, big.NewInt(1)) }, - &types.GenesisState{ + genState: &types.GenesisState{ Params: types.DefaultParams(), Accounts: []types.GenesisAccount{ { @@ -49,12 +68,12 @@ func (suite *EvmTestSuite) TestInitGenesis() { }, }, }, - false, + expPanic: false, }, { - "account not found", - func() {}, - &types.GenesisState{ + name: "account not found", + malleate: func(_ *testnetwork.UnitTestNetwork) {}, + genState: &types.GenesisState{ Params: types.DefaultParams(), Accounts: []types.GenesisAccount{ { @@ -62,15 +81,15 @@ func (suite *EvmTestSuite) TestInitGenesis() { }, }, }, - true, + expPanic: true, }, { - "invalid account type", - func() { + name: "invalid account type", + malleate: func(network *testnetwork.UnitTestNetwork) { acc := authtypes.NewBaseAccountWithAddress(address.Bytes()) - suite.app.AccountKeeper.SetAccount(suite.ctx, acc) + network.App.AccountKeeper.SetAccount(network.GetContext(), acc) }, - &types.GenesisState{ + genState: &types.GenesisState{ Params: types.DefaultParams(), Accounts: []types.GenesisAccount{ { @@ -78,15 +97,16 @@ func (suite *EvmTestSuite) TestInitGenesis() { }, }, }, - true, + expPanic: true, }, { - "invalid code hash", - func() { - acc := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, address.Bytes()) - suite.app.AccountKeeper.SetAccount(suite.ctx, acc) + name: "invalid code hash", + malleate: func(network *testnetwork.UnitTestNetwork) { + ctx := network.GetContext() + acc := network.App.AccountKeeper.NewAccountWithAddress(ctx, address.Bytes()) + network.App.AccountKeeper.SetAccount(ctx, acc) }, - &types.GenesisState{ + genState: &types.GenesisState{ Params: types.DefaultParams(), Accounts: []types.GenesisAccount{ { @@ -95,16 +115,16 @@ func (suite *EvmTestSuite) TestInitGenesis() { }, }, }, - true, + expPanic: true, }, { - "ignore empty account code checking", - func() { - acc := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, address.Bytes()) - - suite.app.AccountKeeper.SetAccount(suite.ctx, acc) + name: "ignore empty account code checking", + malleate: func(network *testnetwork.UnitTestNetwork) { + ctx := network.GetContext() + acc := network.App.AccountKeeper.NewAccountWithAddress(ctx, address.Bytes()) + network.App.AccountKeeper.SetAccount(ctx, acc) }, - &types.GenesisState{ + genState: &types.GenesisState{ Params: types.DefaultParams(), Accounts: []types.GenesisAccount{ { @@ -113,19 +133,19 @@ func (suite *EvmTestSuite) TestInitGenesis() { }, }, }, - false, + expPanic: false, }, { - "ignore empty account code checking with non-empty codehash", - func() { + name: "ignore empty account code checking with non-empty codehash", + malleate: func(network *testnetwork.UnitTestNetwork) { ethAcc := &evmostypes.EthAccount{ BaseAccount: authtypes.NewBaseAccount(address.Bytes(), nil, 0, 0), CodeHash: common.BytesToHash([]byte{1, 2, 3}).Hex(), } - suite.app.AccountKeeper.SetAccount(suite.ctx, ethAcc) + network.App.AccountKeeper.SetAccount(network.GetContext(), ethAcc) }, - &types.GenesisState{ + genState: &types.GenesisState{ Params: types.DefaultParams(), Accounts: []types.GenesisAccount{ { @@ -134,31 +154,43 @@ func (suite *EvmTestSuite) TestInitGenesis() { }, }, }, - false, + expPanic: false, }, } for _, tc := range testCases { - suite.Run(tc.name, func() { - suite.SetupTest() // reset values - vmdb = suite.StateDB() + t.Run(tc.name, func(t *testing.T) { + ts := SetupTest() + ctx := ts.network.GetContext() - tc.malleate() + vmdb = statedb.New( + ctx, + ts.network.App.EvmKeeper, + statedb.NewEmptyTxConfig(common.BytesToHash(ctx.HeaderHash().Bytes())), + ) + + tc.malleate(ts.network) err := vmdb.Commit() - suite.Require().NoError(err) + require.NoError(t, err, "failed to commit to state db") if tc.expPanic { - suite.Require().Panics( - func() { - _ = evm.InitGenesis(suite.ctx, suite.app.EvmKeeper, suite.app.AccountKeeper, *tc.genState) - }, - ) + require.Panics(t, func() { + _ = evm.InitGenesis( + ts.network.GetContext(), + ts.network.App.EvmKeeper, + ts.network.App.AccountKeeper, + *tc.genState, + ) + }) } else { - suite.Require().NotPanics( - func() { - _ = evm.InitGenesis(suite.ctx, suite.app.EvmKeeper, suite.app.AccountKeeper, *tc.genState) - }, - ) + require.NotPanics(t, func() { + _ = evm.InitGenesis( + ctx, + ts.network.App.EvmKeeper, + ts.network.App.AccountKeeper, + *tc.genState, + ) + }) } }) } diff --git a/x/evm/handler.go b/x/evm/handler.go deleted file mode 100644 index e226af9a9d..0000000000 --- a/x/evm/handler.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) -package evm - -import ( - errorsmod "cosmossdk.io/errors" - sdk "github.com/cosmos/cosmos-sdk/types" - errortypes "github.com/cosmos/cosmos-sdk/types/errors" - - "github.com/evmos/evmos/v16/x/evm/types" -) - -// NewHandler returns a handler for Ethermint type messages. -func NewHandler(server types.MsgServer) sdk.Handler { - return func(ctx sdk.Context, msg sdk.Msg) (result *sdk.Result, err error) { - ctx = ctx.WithEventManager(sdk.NewEventManager()) - - switch msg := msg.(type) { - case *types.MsgEthereumTx: - res, err := server.EthereumTx(sdk.WrapSDKContext(ctx), msg) - return sdk.WrapServiceResult(ctx, res, err) - case *types.MsgUpdateParams: - res, err := server.UpdateParams(sdk.WrapSDKContext(ctx), msg) - return sdk.WrapServiceResult(ctx, res, err) - default: - err := errorsmod.Wrapf(errortypes.ErrUnknownRequest, "unrecognized %s message type: %T", types.ModuleName, msg) - return nil, err - } - } -} diff --git a/x/evm/handler_test.go b/x/evm/handler_test.go deleted file mode 100644 index 8dff858744..0000000000 --- a/x/evm/handler_test.go +++ /dev/null @@ -1,722 +0,0 @@ -package evm_test - -import ( - "errors" - "math/big" - "testing" - "time" - - "github.com/evmos/evmos/v16/utils" - "github.com/evmos/evmos/v16/x/evm/keeper" - - sdkmath "cosmossdk.io/math" - "github.com/cosmos/gogoproto/proto" - - abci "github.com/cometbft/cometbft/abci/types" - tmjson "github.com/cometbft/cometbft/libs/json" - - "cosmossdk.io/simapp" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - - feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" - - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" - ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" - "github.com/stretchr/testify/require" - "github.com/stretchr/testify/suite" - - "github.com/cosmos/cosmos-sdk/baseapp" - "github.com/cosmos/cosmos-sdk/crypto/keyring" - storetypes "github.com/cosmos/cosmos-sdk/store/types" - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - evmostypes "github.com/evmos/evmos/v16/types" - "github.com/evmos/evmos/v16/x/evm" - "github.com/evmos/evmos/v16/x/evm/statedb" - "github.com/evmos/evmos/v16/x/evm/types" - - "github.com/cometbft/cometbft/crypto/tmhash" - tmproto "github.com/cometbft/cometbft/proto/tendermint/types" - tmversion "github.com/cometbft/cometbft/proto/tendermint/version" - - "github.com/cometbft/cometbft/version" -) - -type EvmTestSuite struct { - suite.Suite - - ctx sdk.Context - handler sdk.Handler - app *app.Evmos - chainID *big.Int - - signer keyring.Signer - ethSigner ethtypes.Signer - from common.Address - to sdk.AccAddress - - dynamicTxFee bool -} - -// DoSetupTest setup test environment, it uses`require.TestingT` to support both `testing.T` and `testing.B`. -func (suite *EvmTestSuite) DoSetupTest(t require.TestingT) { - checkTx := false - - // account key - priv, err := ethsecp256k1.GenerateKey() - require.NoError(t, err) - address := common.BytesToAddress(priv.PubKey().Address().Bytes()) - suite.signer = utiltx.NewSigner(priv) - suite.from = address - // consensus key - priv, err = ethsecp256k1.GenerateKey() - require.NoError(t, err) - consAddress := sdk.ConsAddress(priv.PubKey().Address()) - - suite.app = app.EthSetup(checkTx, func(app *app.Evmos, genesis simapp.GenesisState) simapp.GenesisState { - if suite.dynamicTxFee { - feemarketGenesis := feemarkettypes.DefaultGenesisState() - feemarketGenesis.Params.EnableHeight = 1 - feemarketGenesis.Params.NoBaseFee = false - genesis[feemarkettypes.ModuleName] = app.AppCodec().MustMarshalJSON(feemarketGenesis) - } - return genesis - }) - - coins := sdk.NewCoins(sdk.NewCoin(types.DefaultEVMDenom, sdkmath.NewInt(100000000000000))) - genesisState := app.NewTestGenesisState(suite.app.AppCodec()) - b32address := sdk.MustBech32ifyAddressBytes(sdk.GetConfig().GetBech32AccountAddrPrefix(), priv.PubKey().Address().Bytes()) - balances := []banktypes.Balance{ - { - Address: b32address, - Coins: coins, - }, - { - Address: suite.app.AccountKeeper.GetModuleAddress(authtypes.FeeCollectorName).String(), - Coins: coins, - }, - } - var bankGenesis banktypes.GenesisState - suite.app.AppCodec().MustUnmarshalJSON(genesisState[banktypes.ModuleName], &bankGenesis) - // Update balances and total supply - bankGenesis.Balances = append(bankGenesis.Balances, balances...) - bankGenesis.Supply = bankGenesis.Supply.Add(coins...).Add(coins...) - genesisState[banktypes.ModuleName] = suite.app.AppCodec().MustMarshalJSON(&bankGenesis) - - stateBytes, err := tmjson.MarshalIndent(genesisState, "", " ") - require.NoError(t, err) - - // Initialize the chain - req := abci.RequestInitChain{ - ChainId: utils.TestnetChainID + "-1", - Validators: []abci.ValidatorUpdate{}, - ConsensusParams: app.DefaultConsensusParams, - AppStateBytes: stateBytes, - } - suite.app.InitChain(req) - - suite.ctx = suite.app.BaseApp.NewContext(checkTx, tmproto.Header{ - Height: 1, - ChainID: req.ChainId, - Time: time.Now().UTC(), - ProposerAddress: consAddress.Bytes(), - Version: tmversion.Consensus{ - Block: version.BlockProtocol, - }, - LastBlockId: tmproto.BlockID{ - Hash: tmhash.Sum([]byte("block_id")), - PartSetHeader: tmproto.PartSetHeader{ - Total: 11, - Hash: tmhash.Sum([]byte("partset_header")), - }, - }, - AppHash: tmhash.Sum([]byte("app")), - DataHash: tmhash.Sum([]byte("data")), - EvidenceHash: tmhash.Sum([]byte("evidence")), - ValidatorsHash: tmhash.Sum([]byte("validators")), - NextValidatorsHash: tmhash.Sum([]byte("next_validators")), - ConsensusHash: tmhash.Sum([]byte("consensus")), - LastResultsHash: tmhash.Sum([]byte("last_result")), - }) - - queryHelper := baseapp.NewQueryServerTestHelper(suite.ctx, suite.app.InterfaceRegistry()) - types.RegisterQueryServer(queryHelper, suite.app.EvmKeeper) - - acc := &evmostypes.EthAccount{ - BaseAccount: authtypes.NewBaseAccount(sdk.AccAddress(address.Bytes()), nil, 0, 0), - CodeHash: common.BytesToHash(crypto.Keccak256(nil)).String(), - } - - suite.app.AccountKeeper.SetAccount(suite.ctx, acc) - - valAddr := sdk.ValAddress(address.Bytes()) - validator, err := stakingtypes.NewValidator(valAddr, priv.PubKey(), stakingtypes.Description{}) - require.NoError(t, err) - - err = suite.app.StakingKeeper.SetValidatorByConsAddr(suite.ctx, validator) - require.NoError(t, err) - err = suite.app.StakingKeeper.SetValidatorByConsAddr(suite.ctx, validator) - require.NoError(t, err) - suite.app.StakingKeeper.SetValidator(suite.ctx, validator) - - suite.ethSigner = ethtypes.LatestSignerForChainID(suite.app.EvmKeeper.ChainID()) - suite.handler = evm.NewHandler(suite.app.EvmKeeper) -} - -func (suite *EvmTestSuite) SetupTest() { - suite.DoSetupTest(suite.T()) -} - -func (suite *EvmTestSuite) SignTx(tx *types.MsgEthereumTx) { - tx.From = suite.from.String() - err := tx.Sign(suite.ethSigner, suite.signer) - suite.Require().NoError(err) -} - -func (suite *EvmTestSuite) StateDB() *statedb.StateDB { - return statedb.New(suite.ctx, suite.app.EvmKeeper, statedb.NewEmptyTxConfig(common.BytesToHash(suite.ctx.HeaderHash().Bytes()))) -} - -func TestEvmTestSuite(t *testing.T) { - suite.Run(t, new(EvmTestSuite)) -} - -func (suite *EvmTestSuite) TestHandleMsgEthereumTx() { - var tx *types.MsgEthereumTx - - defaultEthTxParams := &types.EvmTxArgs{ - ChainID: suite.chainID, - Nonce: 0, - Amount: big.NewInt(100), - GasLimit: 0, - GasPrice: big.NewInt(10000), - } - - testCases := []struct { - msg string - malleate func() - expPass bool - }{ - { - "passed", - func() { - to := common.BytesToAddress(suite.to) - ethTxParams := &types.EvmTxArgs{ - ChainID: suite.chainID, - Nonce: 0, - To: &to, - Amount: big.NewInt(10), - GasLimit: 10_000_000, - GasPrice: big.NewInt(10000), - } - tx = types.NewTx(ethTxParams) - suite.SignTx(tx) - }, - true, - }, - { - "insufficient balance", - func() { - tx = types.NewTx(defaultEthTxParams) - suite.SignTx(tx) - }, - false, - }, - { - "tx encoding failed", - func() { - tx = types.NewTx(defaultEthTxParams) - }, - false, - }, - { - "invalid chain ID", - func() { - suite.ctx = suite.ctx.WithChainID("chainID") - }, - false, - }, - { - "VerifySig failed", - func() { - tx = types.NewTx(defaultEthTxParams) - }, - false, - }, - } - - for _, tc := range testCases { - suite.Run(tc.msg, func() { - suite.SetupTest() // reset - - tc.malleate() - res, err := suite.handler(suite.ctx, tx) - - if tc.expPass { - suite.Require().NoError(err) - suite.Require().NotNil(res) - } else { - suite.Require().Error(err) - suite.Require().Nil(res) - } - }) - } -} - -func (suite *EvmTestSuite) TestHandlerLogs() { - // Test contract: - - // pragma solidity ^0.5.1; - - // contract Test { - // event Hello(uint256 indexed world); - - // constructor() public { - // emit Hello(17); - // } - // } - - // { - // "linkReferences": {}, - // "object": "6080604052348015600f57600080fd5b5060117f775a94827b8fd9b519d36cd827093c664f93347070a554f65e4a6f56cd73889860405160405180910390a2603580604b6000396000f3fe6080604052600080fdfea165627a7a723058206cab665f0f557620554bb45adf266708d2bd349b8a4314bdff205ee8440e3c240029", - // "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH1 0xF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x11 PUSH32 0x775A94827B8FD9B519D36CD827093C664F93347070A554F65E4A6F56CD738898 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x35 DUP1 PUSH1 0x4B PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 PUSH13 0xAB665F0F557620554BB45ADF26 PUSH8 0x8D2BD349B8A4314 0xbd SELFDESTRUCT KECCAK256 0x5e 0xe8 DIFFICULTY 0xe EXTCODECOPY 0x24 STOP 0x29 ", - // "sourceMap": "25:119:0:-;;;90:52;8:9:-1;5:2;;;30:1;27;20:12;5:2;90:52:0;132:2;126:9;;;;;;;;;;25:119;;;;;;" - // } - - gasLimit := uint64(100000) - gasPrice := big.NewInt(1000000) - - bytecode := common.FromHex("0x6080604052348015600f57600080fd5b5060117f775a94827b8fd9b519d36cd827093c664f93347070a554f65e4a6f56cd73889860405160405180910390a2603580604b6000396000f3fe6080604052600080fdfea165627a7a723058206cab665f0f557620554bb45adf266708d2bd349b8a4314bdff205ee8440e3c240029") - - ethTxParams := &types.EvmTxArgs{ - ChainID: suite.chainID, - Nonce: 1, - Amount: big.NewInt(0), - GasPrice: gasPrice, - GasLimit: gasLimit, - Input: bytecode, - } - tx := types.NewTx(ethTxParams) - suite.SignTx(tx) - - result, err := suite.handler(suite.ctx, tx) - suite.Require().NoError(err, "failed to handle eth tx msg") - - var txResponse types.MsgEthereumTxResponse - - err = proto.Unmarshal(result.Data, &txResponse) - suite.Require().NoError(err, "failed to decode result data") - - suite.Require().Equal(len(txResponse.Logs), 1) - suite.Require().Equal(len(txResponse.Logs[0].Topics), 2) -} - -func (suite *EvmTestSuite) TestDeployAndCallContract() { - // Test contract: - // http://remix.ethereum.org/#optimize=false&evmVersion=istanbul&version=soljson-v0.5.15+commit.6a57276f.js - // 2_Owner.sol - // - // pragma solidity >=0.4.22 <0.7.0; - // - ///** - // * @title Owner - // * @dev Set & change owner - // */ - // contract Owner { - // - // address private owner; - // - // // event for EVM logging - // event OwnerSet(address indexed oldOwner, address indexed newOwner); - // - // // modifier to check if caller is owner - // modifier isOwner() { - // // If the first argument of 'require' evaluates to 'false', execution terminates and all - // // changes to the state and to Ether balances are reverted. - // // This used to consume all gas in old EVM versions, but not anymore. - // // It is often a good idea to use 'require' to check if functions are called correctly. - // // As a second argument, you can also provide an explanation about what went wrong. - // require(msg.sender == owner, "Caller is not owner"); - // _; - //} - // - // /** - // * @dev Set contract deployer as owner - // */ - // constructor() public { - // owner = msg.sender; // 'msg.sender' is sender of current call, contract deployer for a constructor - // emit OwnerSet(address(0), owner); - //} - // - // /** - // * @dev Change owner - // * @param newOwner address of new owner - // */ - // function changeOwner(address newOwner) public isOwner { - // emit OwnerSet(owner, newOwner); - // owner = newOwner; - //} - // - // /** - // * @dev Return owner address - // * @return address of owner - // */ - // function getOwner() external view returns (address) { - // return owner; - //} - //} - - // Deploy contract - Owner.sol - gasLimit := uint64(100000000) - gasPrice := big.NewInt(10000) - - bytecode := common.FromHex("0x608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73560405160405180910390a36102c4806100dc6000396000f3fe608060405234801561001057600080fd5b5060043610610053576000357c010000000000000000000000000000000000000000000000000000000090048063893d20e814610058578063a6f9dae1146100a2575b600080fd5b6100606100e6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6100e4600480360360208110156100b857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061010f565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f43616c6c6572206973206e6f74206f776e65720000000000000000000000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73560405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505056fea265627a7a72315820f397f2733a89198bc7fed0764083694c5b828791f39ebcbc9e414bccef14b48064736f6c63430005100032") - ethTxParams := &types.EvmTxArgs{ - ChainID: suite.chainID, - Nonce: 1, - Amount: big.NewInt(0), - GasPrice: gasPrice, - GasLimit: gasLimit, - Input: bytecode, - } - tx := types.NewTx(ethTxParams) - suite.SignTx(tx) - - result, err := suite.handler(suite.ctx, tx) - suite.Require().NoError(err, "failed to handle eth tx msg") - - var res types.MsgEthereumTxResponse - - err = proto.Unmarshal(result.Data, &res) - suite.Require().NoError(err, "failed to decode result data") - suite.Require().Equal(res.VmError, "", "failed to handle eth tx msg") - - // store - changeOwner - gasLimit = uint64(100000000000) - gasPrice = big.NewInt(100) - receiver := crypto.CreateAddress(suite.from, 1) - - storeAddr := "0xa6f9dae10000000000000000000000006a82e4a67715c8412a9114fbd2cbaefbc8181424" - bytecode = common.FromHex(storeAddr) - - ethTxParams = &types.EvmTxArgs{ - ChainID: suite.chainID, - Nonce: 2, - To: &receiver, - Amount: big.NewInt(0), - GasPrice: gasPrice, - GasLimit: gasLimit, - Input: bytecode, - } - tx = types.NewTx(ethTxParams) - suite.SignTx(tx) - - result, err = suite.handler(suite.ctx, tx) - suite.Require().NoError(err, "failed to handle eth tx msg") - - err = proto.Unmarshal(result.Data, &res) - suite.Require().NoError(err, "failed to decode result data") - suite.Require().Equal(res.VmError, "", "failed to handle eth tx msg") - - // query - getOwner - bytecode = common.FromHex("0x893d20e8") - - ethTxParams = &types.EvmTxArgs{ - ChainID: suite.chainID, - Nonce: 2, - To: &receiver, - Amount: big.NewInt(0), - GasPrice: gasPrice, - GasLimit: gasLimit, - Input: bytecode, - } - tx = types.NewTx(ethTxParams) - suite.SignTx(tx) - - result, err = suite.handler(suite.ctx, tx) - suite.Require().NoError(err, "failed to handle eth tx msg") - - err = proto.Unmarshal(result.Data, &res) - suite.Require().NoError(err, "failed to decode result data") - suite.Require().Equal(res.VmError, "", "failed to handle eth tx msg") - - // FIXME: correct owner? - // getAddr := strings.ToLower(hexutils.BytesToHex(res.Ret)) - // suite.Require().Equal(true, strings.HasSuffix(storeAddr, getAddr), "Fail to query the address") -} - -func (suite *EvmTestSuite) TestSendTransaction() { - gasLimit := uint64(21000) - gasPrice := big.NewInt(0x55ae82600) - - // send simple value transfer with gasLimit=21000 - ethTxParams := &types.EvmTxArgs{ - ChainID: suite.chainID, - Nonce: 1, - To: &common.Address{0x1}, - Amount: big.NewInt(1), - GasPrice: gasPrice, - GasLimit: gasLimit, - } - tx := types.NewTx(ethTxParams) - suite.SignTx(tx) - - result, err := suite.handler(suite.ctx, tx) - suite.Require().NoError(err) - suite.Require().NotNil(result) -} - -func (suite *EvmTestSuite) TestOutOfGasWhenDeployContract() { - // Test contract: - // http://remix.ethereum.org/#optimize=false&evmVersion=istanbul&version=soljson-v0.5.15+commit.6a57276f.js - // 2_Owner.sol - // - // pragma solidity >=0.4.22 <0.7.0; - // - ///** - // * @title Owner - // * @dev Set & change owner - // */ - // contract Owner { - // - // address private owner; - // - // // event for EVM logging - // event OwnerSet(address indexed oldOwner, address indexed newOwner); - // - // // modifier to check if caller is owner - // modifier isOwner() { - // // If the first argument of 'require' evaluates to 'false', execution terminates and all - // // changes to the state and to Ether balances are reverted. - // // This used to consume all gas in old EVM versions, but not anymore. - // // It is often a good idea to use 'require' to check if functions are called correctly. - // // As a second argument, you can also provide an explanation about what went wrong. - // require(msg.sender == owner, "Caller is not owner"); - // _; - //} - // - // /** - // * @dev Set contract deployer as owner - // */ - // constructor() public { - // owner = msg.sender; // 'msg.sender' is sender of current call, contract deployer for a constructor - // emit OwnerSet(address(0), owner); - //} - // - // /** - // * @dev Change owner - // * @param newOwner address of new owner - // */ - // function changeOwner(address newOwner) public isOwner { - // emit OwnerSet(owner, newOwner); - // owner = newOwner; - //} - // - // /** - // * @dev Return owner address - // * @return address of owner - // */ - // function getOwner() external view returns (address) { - // return owner; - //} - //} - - // Deploy contract - Owner.sol - gasLimit := uint64(1) - suite.ctx = suite.ctx.WithGasMeter(storetypes.NewGasMeter(gasLimit)) - gasPrice := big.NewInt(10000) - - bytecode := common.FromHex("0x608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73560405160405180910390a36102c4806100dc6000396000f3fe608060405234801561001057600080fd5b5060043610610053576000357c010000000000000000000000000000000000000000000000000000000090048063893d20e814610058578063a6f9dae1146100a2575b600080fd5b6100606100e6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6100e4600480360360208110156100b857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061010f565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f43616c6c6572206973206e6f74206f776e65720000000000000000000000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73560405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505056fea265627a7a72315820f397f2733a89198bc7fed0764083694c5b828791f39ebcbc9e414bccef14b48064736f6c63430005100032") - ethTxParams := &types.EvmTxArgs{ - ChainID: suite.chainID, - Nonce: 1, - Amount: big.NewInt(0), - GasPrice: gasPrice, - GasLimit: gasLimit, - Input: bytecode, - } - tx := types.NewTx(ethTxParams) - suite.SignTx(tx) - - defer func() { - //nolint:revive // allow empty code block that just contains TODO in test code - if r := recover(); r != nil { - // TODO: snapshotting logic - } else { - suite.Require().Fail("panic did not happen") - } - }() - - _, err := suite.handler(suite.ctx, tx) - suite.Require().NoError(err) - - suite.Require().Fail("panic did not happen") -} - -func (suite *EvmTestSuite) TestErrorWhenDeployContract() { - gasLimit := uint64(1000000) - gasPrice := big.NewInt(10000) - - bytecode := common.FromHex("0xa6f9dae10000000000000000000000006a82e4a67715c8412a9114fbd2cbaefbc8181424") - - ethTxParams := &types.EvmTxArgs{ - ChainID: suite.chainID, - Nonce: 1, - Amount: big.NewInt(0), - GasPrice: gasPrice, - GasLimit: gasLimit, - Input: bytecode, - } - tx := types.NewTx(ethTxParams) - suite.SignTx(tx) - - result, _ := suite.handler(suite.ctx, tx) - var res types.MsgEthereumTxResponse - - _ = proto.Unmarshal(result.Data, &res) - - suite.Require().Equal("invalid opcode: opcode 0xa6 not defined", res.VmError, "correct evm error") - - // TODO: snapshot checking -} - -func (suite *EvmTestSuite) deployERC20Contract() common.Address { - k := suite.app.EvmKeeper - nonce := k.GetNonce(suite.ctx, suite.from) - ctorArgs, err := types.ERC20Contract.ABI.Pack("", suite.from, big.NewInt(10000000000)) - suite.Require().NoError(err) - msg := ethtypes.NewMessage( - suite.from, - nil, - nonce, - big.NewInt(0), - 2000000, - big.NewInt(1), - nil, - nil, - append(types.ERC20Contract.Bin, ctorArgs...), - nil, - true, - ) - rsp, err := k.ApplyMessage(suite.ctx, msg, nil, true) - suite.Require().NoError(err) - suite.Require().False(rsp.Failed()) - return crypto.CreateAddress(suite.from, nonce) -} - -// TestERC20TransferReverted checks: -// - when transaction reverted, gas refund works. -// - when transaction reverted, nonce is still increased. -func (suite *EvmTestSuite) TestERC20TransferReverted() { - intrinsicGas := uint64(21572) - - suite.SetupTest() - k := suite.app.EvmKeeper - - // add some fund to pay gas fee - err := k.SetBalance(suite.ctx, suite.from, big.NewInt(1000000000000000)) - suite.Require().NoError(err) - - contract := suite.deployERC20Contract() - - data, err := types.ERC20Contract.ABI.Pack("transfer", suite.from, big.NewInt(10)) - suite.Require().NoError(err) - - gasPrice := big.NewInt(1000000000) // must be bigger than or equal to baseFee - nonce := k.GetNonce(suite.ctx, suite.from) - ethTxParams := &types.EvmTxArgs{ - ChainID: suite.chainID, - Nonce: nonce, - To: &contract, - Amount: big.NewInt(0), - GasPrice: gasPrice, - GasLimit: intrinsicGas, - Input: data, - } - tx := types.NewTx(ethTxParams) - suite.SignTx(tx) - - before := k.GetBalance(suite.ctx, suite.from) - - evmParams := suite.app.EvmKeeper.GetParams(suite.ctx) - ethCfg := evmParams.GetChainConfig().EthereumConfig(nil) - baseFee := suite.app.EvmKeeper.GetBaseFee(suite.ctx, ethCfg) - - txData, err := types.UnpackTxData(tx.Data) - suite.Require().NoError(err) - fees, err := keeper.VerifyFee(txData, types.DefaultEVMDenom, baseFee, true, true, suite.ctx.IsCheckTx()) - suite.Require().NoError(err) - err = k.DeductTxCostsFromUserBalance(suite.ctx, fees, common.HexToAddress(tx.From)) - suite.Require().NoError(err) - - res, err := k.EthereumTx(sdk.WrapSDKContext(suite.ctx), tx) - suite.Require().NoError(err) - - suite.Require().True(res.Failed()) - suite.Require().Equal("out of gas", res.VmError) - suite.Require().Empty(res.Logs) - - after := k.GetBalance(suite.ctx, suite.from) - - suite.Require().Equal(intrinsicGas, res.GasUsed) - - // check gas refund works: only deducted fee for gas used, rather than gas limit. - suite.Require().Equal(new(big.Int).Mul(gasPrice, big.NewInt(int64(res.GasUsed))), new(big.Int).Sub(before, after)) - - // nonce should not be increased. - nonce2 := k.GetNonce(suite.ctx, suite.from) - suite.Require().Equal(nonce, nonce2) -} - -func (suite *EvmTestSuite) TestContractDeploymentRevert() { - intrinsicGas := uint64(134180) - - suite.SetupTest() - k := suite.app.EvmKeeper - - nonce := k.GetNonce(suite.ctx, suite.from) - ctorArgs, err := types.ERC20Contract.ABI.Pack("", suite.from, big.NewInt(0)) - suite.Require().NoError(err) - - ethTxParams := &types.EvmTxArgs{ - Nonce: nonce, - GasLimit: intrinsicGas, - Input: append(types.ERC20Contract.Bin, ctorArgs...), - } - tx := types.NewTx(ethTxParams) - suite.SignTx(tx) - - // simulate nonce increment in ante handler - db := suite.StateDB() - db.SetNonce(suite.from, nonce+1) - suite.Require().NoError(db.Commit()) - - rsp, err := k.EthereumTx(sdk.WrapSDKContext(suite.ctx), tx) - suite.Require().NoError(err) - suite.Require().True(rsp.Failed()) - - // nonce don't change - nonce2 := k.GetNonce(suite.ctx, suite.from) - suite.Require().Equal(nonce+1, nonce2) -} - -// DummyHook implements EvmHooks interface -type DummyHook struct{} - -func (dh *DummyHook) PostTxProcessing(_ sdk.Context, _ core.Message, _ *ethtypes.Receipt) error { - return nil -} - -// FailureHook implements EvmHooks interface -type FailureHook struct{} - -func (dh *FailureHook) PostTxProcessing(_ sdk.Context, _ core.Message, _ *ethtypes.Receipt) error { - return errors.New("mock error") -} diff --git a/x/feemarket/handler.go b/x/feemarket/handler.go deleted file mode 100644 index b0afdf9769..0000000000 --- a/x/feemarket/handler.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) -package feemarket - -import ( - errorsmod "cosmossdk.io/errors" - sdk "github.com/cosmos/cosmos-sdk/types" - errortypes "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/evmos/evmos/v16/x/feemarket/types" -) - -// NewHandler returns a handler for Ethermint type messages. -func NewHandler(server types.MsgServer) sdk.Handler { - return func(ctx sdk.Context, msg sdk.Msg) (result *sdk.Result, err error) { - ctx = ctx.WithEventManager(sdk.NewEventManager()) - - switch msg := msg.(type) { - case *types.MsgUpdateParams: - // execute state transition - res, err := server.UpdateParams(sdk.WrapSDKContext(ctx), msg) - return sdk.WrapServiceResult(ctx, res, err) - - default: - err := errorsmod.Wrapf(errortypes.ErrUnknownRequest, "unrecognized %s message type: %T", types.ModuleName, msg) - return nil, err - } - } -} diff --git a/x/inflation/v1/handler.go b/x/inflation/v1/handler.go deleted file mode 100644 index 12bbd17715..0000000000 --- a/x/inflation/v1/handler.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package inflation - -import ( - errorsmod "cosmossdk.io/errors" - sdk "github.com/cosmos/cosmos-sdk/types" - errortypes "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/evmos/evmos/v16/x/inflation/v1/types" -) - -// NewHandler returns a handler for Inflation type messages. -func NewHandler(server types.MsgServer) sdk.Handler { - return func(ctx sdk.Context, msg sdk.Msg) (result *sdk.Result, err error) { - ctx = ctx.WithEventManager(sdk.NewEventManager()) - - switch msg := msg.(type) { - case *types.MsgUpdateParams: - res, err := server.UpdateParams(ctx, msg) - return sdk.WrapServiceResult(ctx, res, err) - default: - err := errorsmod.Wrapf(errortypes.ErrUnknownRequest, "unrecognized %s message type: %T", types.ModuleName, msg) - return nil, err - } - } -} diff --git a/x/vesting/module.go b/x/vesting/module.go index 74c50f90a4..9a99580215 100644 --- a/x/vesting/module.go +++ b/x/vesting/module.go @@ -119,10 +119,6 @@ func (AppModule) Name() string { // RegisterInvariants performs a no-op; there are no invariants to enforce. func (AppModule) RegisterInvariants(_ sdk.InvariantRegistry) {} -func (am AppModule) NewHandler() sdk.Handler { - return NewHandler(am.keeper) -} - // RegisterServices registers module services. func (am AppModule) RegisterServices(cfg module.Configurator) { types.RegisterMsgServer(cfg.MsgServer(), am.keeper) From cff385dc5d62281ba1388342c825d5ea5fff21a7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Mar 2024 08:29:21 +0000 Subject: [PATCH 149/345] build(deps): bump github.com/stretchr/testify from 1.8.4 to 1.9.0 (#2386) * build(deps): bump github.com/stretchr/testify from 1.8.4 to 1.9.0 Bumps [github.com/stretchr/testify](https://github.com/stretchr/testify) from 1.8.4 to 1.9.0. - [Release notes](https://github.com/stretchr/testify/releases) - [Commits](https://github.com/stretchr/testify/compare/v1.8.4...v1.9.0) --- updated-dependencies: - dependency-name: github.com/stretchr/testify dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * gomod2nix generate --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: tom Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 6 ++++-- gomod2nix.toml | 8 ++++---- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index c92f1023fc..8d53b66d11 100644 --- a/go.mod +++ b/go.mod @@ -39,7 +39,7 @@ require ( github.com/spf13/cast v1.6.0 github.com/spf13/cobra v1.8.0 github.com/spf13/viper v1.16.0 - github.com/stretchr/testify v1.8.4 + github.com/stretchr/testify v1.9.0 github.com/tidwall/gjson v1.17.1 github.com/tidwall/sjson v1.2.5 github.com/tyler-smith/go-bip39 v1.1.0 @@ -210,7 +210,7 @@ require ( github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/status-im/keycard-go v0.2.0 // indirect - github.com/stretchr/objx v0.5.0 // indirect + github.com/stretchr/objx v0.5.2 // indirect github.com/subosito/gotenv v1.4.2 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect github.com/tendermint/go-amino v0.16.0 // indirect diff --git a/go.sum b/go.sum index 417240db1d..f92b2be713 100644 --- a/go.sum +++ b/go.sum @@ -1102,8 +1102,9 @@ github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5J github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -1115,8 +1116,9 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= diff --git a/gomod2nix.toml b/gomod2nix.toml index 44c1c0d86d..c48104b89a 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -576,11 +576,11 @@ schema = 3 version = "v0.2.0" hash = "sha256-UUiGmlgaIZDeMUJv3fdZBoQ9hJeSsg2ixRGmm6TgHug=" [mod."github.com/stretchr/objx"] - version = "v0.5.0" - hash = "sha256-nY4mvP0f0Ry1IKMKQAYNuioA5h4red4mmQqeGZw6EF0=" + version = "v0.5.2" + hash = "sha256-VKYxrrFb1nkX6Wu3tE5DoP9+fCttwSl9pgLN6567nck=" [mod."github.com/stretchr/testify"] - version = "v1.8.4" - hash = "sha256-MoOmRzbz9QgiJ+OOBo5h5/LbilhJfRUryvzHJmXAWjo=" + version = "v1.9.0" + hash = "sha256-uUp/On+1nK+lARkTVtb5RxlW15zxtw2kaAFuIASA+J0=" [mod."github.com/subosito/gotenv"] version = "v1.4.2" hash = "sha256-LnrDR1k/AoCFWBMcU7vQsoQLkZ65evT2hoQHLDudTsg=" From 49c3a0b45b4425556badaa7c899c762be5727331 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 6 Mar 2024 09:22:24 +0100 Subject: [PATCH 150/345] build(deps): bump golang.org/x/net from 0.21.0 to 0.22.0 (#2394) * build(deps): bump golang.org/x/net from 0.21.0 to 0.22.0 Bumps [golang.org/x/net](https://github.com/golang/net) from 0.21.0 to 0.22.0. - [Commits](https://github.com/golang/net/compare/v0.21.0...v0.22.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * gomod2nix generate --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: tom --- go.mod | 8 ++++---- go.sum | 16 ++++++++-------- gomod2nix.toml | 16 ++++++++-------- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/go.mod b/go.mod index 8d53b66d11..b997127855 100644 --- a/go.mod +++ b/go.mod @@ -45,9 +45,9 @@ require ( github.com/tyler-smith/go-bip39 v1.1.0 github.com/zondax/hid v0.9.2 go.opencensus.io v0.24.0 - golang.org/x/crypto v0.20.0 + golang.org/x/crypto v0.21.0 golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb - golang.org/x/net v0.21.0 + golang.org/x/net v0.22.0 golang.org/x/text v0.14.0 google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 google.golang.org/grpc v1.62.0 @@ -236,8 +236,8 @@ require ( golang.org/x/mod v0.14.0 // indirect golang.org/x/oauth2 v0.16.0 // indirect golang.org/x/sync v0.6.0 // indirect - golang.org/x/sys v0.17.0 // indirect - golang.org/x/term v0.17.0 // indirect + golang.org/x/sys v0.18.0 // indirect + golang.org/x/term v0.18.0 // indirect golang.org/x/time v0.5.0 // indirect golang.org/x/tools v0.16.1 // indirect google.golang.org/api v0.155.0 // indirect diff --git a/go.sum b/go.sum index f92b2be713..0ac1877569 100644 --- a/go.sum +++ b/go.sum @@ -1245,8 +1245,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.20.0 h1:jmAMJJZXr5KiCw05dfYK9QnqaqKLYXijU23lsEdcQqg= -golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1354,8 +1354,8 @@ golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1506,16 +1506,16 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U= -golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/gomod2nix.toml b/gomod2nix.toml index c48104b89a..261c37c255 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -664,8 +664,8 @@ schema = 3 version = "v1.21.0" hash = "sha256-vjZsOaQCgTjz6WYim0YZHLnB/PC3CvTSpS97qkL2vz8=" [mod."golang.org/x/crypto"] - version = "v0.20.0" - hash = "sha256-7C0tDus5x3xRsSE08yOtZzMpOFym1Q9XP+U+CJ1sWmc=" + version = "v0.21.0" + hash = "sha256-Z4k1LvFh4Jai7HUe6TTuXSG3VnuiRpMwdARIdZZqSYk=" [mod."golang.org/x/exp"] version = "v0.0.0-20230711153332-06a737ee72cb" hash = "sha256-Cbw10ZJ+jATPV232G47xZrn6ExO1FDtiT6nlMRCH7EI=" @@ -673,8 +673,8 @@ schema = 3 version = "v0.14.0" hash = "sha256-sx3hWp5l99DBfIrn821ohfoBwvaITSHMWbzPvX0btLM=" [mod."golang.org/x/net"] - version = "v0.21.0" - hash = "sha256-LfiqMpPtqvW/eLkfx6Ebr5ksqKbQli6uq06c/+XrBsw=" + version = "v0.22.0" + hash = "sha256-pcefO4noO9I6mATKBWF6shgIjZvFg0kDsV1Jo/NsFns=" [mod."golang.org/x/oauth2"] version = "v0.16.0" hash = "sha256-fJfS9dKaq82WaYSVWHMnxNLWH8+L4aip/C1AfJi4FFI=" @@ -682,11 +682,11 @@ schema = 3 version = "v0.6.0" hash = "sha256-LLims/wjDZtIqlYCVHREewcUOX4hwRwplEuZKPOJ/HI=" [mod."golang.org/x/sys"] - version = "v0.17.0" - hash = "sha256-e0qnE+SitE02IzvnJKI4Uzpq9EOZY+zvE8Wf5b2e6Kg=" + version = "v0.18.0" + hash = "sha256-bIFhfFp7Sj0E1gcE3X3l/jecCfSRLgrkb8f0Yr6tVR0=" [mod."golang.org/x/term"] - version = "v0.17.0" - hash = "sha256-lCo7WPHe8Q9q76f0D8FrfoX90MTvwa21O+Dwr1mOAcA=" + version = "v0.18.0" + hash = "sha256-lpze9arFZIhBV8Ht3VZyoiUwqPkeH2IwfXt8M3xljiM=" [mod."golang.org/x/text"] version = "v0.14.0" hash = "sha256-yh3B0tom1RfzQBf1RNmfdNWF1PtiqxV41jW1GVS6JAg=" From d767a4049d647d021b19a73be4107fb27df202c6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 6 Mar 2024 10:32:52 +0100 Subject: [PATCH 151/345] build(deps): bump golang.org/x/crypto from 0.20.0 to 0.21.0 (#2393) * build(deps): bump golang.org/x/crypto from 0.20.0 to 0.21.0 Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.20.0 to 0.21.0. - [Commits](https://github.com/golang/crypto/compare/v0.20.0...v0.21.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * gomod2nix generate --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: tom Co-authored-by: Vladislav Varadinov From 2682c4058fef95262a144b85071c5f82c3e7ef5a Mon Sep 17 00:00:00 2001 From: racerole <148756161+racerole@users.noreply.github.com> Date: Wed, 6 Mar 2024 21:31:20 +0800 Subject: [PATCH 152/345] fix some typos (#2395) Signed-off-by: racerole Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- precompiles/bech32/methods.go | 2 +- precompiles/erc20/IERC20MetadataAllowance.sol | 2 +- precompiles/staking/testdata/StakingCaller.sol | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/precompiles/bech32/methods.go b/precompiles/bech32/methods.go index 06a4fdbd98..7e110cf25c 100644 --- a/precompiles/bech32/methods.go +++ b/precompiles/bech32/methods.go @@ -48,7 +48,7 @@ func (p Precompile) HexToBech32( ) } - // NOTE: safety check, should not happen given that the address is is 20 bytes. + // NOTE: safety check, should not happen given that the address is 20 bytes. if err := sdk.VerifyAddressFormat(address.Bytes()); err != nil { return nil, err } diff --git a/precompiles/erc20/IERC20MetadataAllowance.sol b/precompiles/erc20/IERC20MetadataAllowance.sol index d904013a37..1fe29eff65 100644 --- a/precompiles/erc20/IERC20MetadataAllowance.sol +++ b/precompiles/erc20/IERC20MetadataAllowance.sol @@ -25,7 +25,7 @@ interface IERC20MetadataAllowance is IERC20Metadata { * This is an alternative to approve that can be used as a mitigation for problems described in * IERC20.approve. * @param spender The address which will spend the funds. - * @param subtractedValue The amount to be substracted from the spender allowance. + * @param subtractedValue The amount to be subtracted from the spender allowance. * @return approved Boolean value to indicate if the approval was successful. */ function decreaseAllowance( diff --git a/precompiles/staking/testdata/StakingCaller.sol b/precompiles/staking/testdata/StakingCaller.sol index 7c440e7130..21ad5f3ca9 100644 --- a/precompiles/staking/testdata/StakingCaller.sol +++ b/precompiles/staking/testdata/StakingCaller.sol @@ -358,7 +358,7 @@ contract StakingCaller { // Load the function signature and argument data onto the stack let x := mload(0x40) // Find empty storage location using "free memory pointer" - mstore(x, sig) // Place function signature at begining of empty storage + mstore(x, sig) // Place function signature at beginning of empty storage mstore(add(x, 0x04), _addr) // Place the address (input param) after the function sig mstore(add(x, 0x24), 0x40) // These are needed for mstore(add(x, 0x44), 0x33) // bytes unpacking @@ -404,7 +404,7 @@ contract StakingCaller { return (shares, coin); } - /// @dev This function showcased, that there was a bug in the EVM implementation, that occured when + /// @dev This function showcased, that there was a bug in the EVM implementation, that occurred when /// Cosmos state is modified in the same transaction as state information inside /// the EVM. /// @param _validatorAddr Address of the validator to delegate to From 2e2891abaf63724030aa9500b55df085d87814a0 Mon Sep 17 00:00:00 2001 From: Sandoche ADITTANE Date: Thu, 7 Mar 2024 12:26:18 +0000 Subject: [PATCH 153/345] [Snyk] Security upgrade golang from 1.22rc2-bullseye to 1.22.0-bullseye (#2400) fix: tests/e2e/Dockerfile.repo to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-DEBIAN11-GLIB20-5670987 - https://snyk.io/vuln/SNYK-DEBIAN11-PERL-6085272 - https://snyk.io/vuln/SNYK-DEBIAN11-PERL-6085272 - https://snyk.io/vuln/SNYK-DEBIAN11-PERL-6085272 - https://snyk.io/vuln/SNYK-DEBIAN11-PERL-6085272 Co-authored-by: snyk-bot --- tests/e2e/Dockerfile.repo | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/e2e/Dockerfile.repo b/tests/e2e/Dockerfile.repo index 2ee1724724..02f5a2fa29 100644 --- a/tests/e2e/Dockerfile.repo +++ b/tests/e2e/Dockerfile.repo @@ -1,4 +1,4 @@ -FROM golang:1.22rc2-bullseye AS build-env +FROM golang:1.22.0-bullseye AS build-env ARG BRANCH_NAME @@ -14,7 +14,7 @@ RUN git checkout ${BRANCH_NAME} RUN make build -FROM golang:1.22rc2-bullseye +FROM golang:1.22.0-bullseye RUN apt-get update \ && apt-get install jq=1.6-2.1 -y --no-install-recommends \ From 3512221ad78ccc990d19b53dbf62350e65bda1d8 Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Thu, 7 Mar 2024 15:00:02 +0100 Subject: [PATCH 154/345] fix(docker): Bump rclone version (#2404) bump rclone version --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index caead353a6..e53511bed3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -41,7 +41,7 @@ COPY --from=build-env /target/usr/lib /usr/lib COPY --from=build-env /target/usr/local/lib /usr/local/lib COPY --from=build-env /target/usr/include /usr/include -RUN apk add --no-cache ca-certificates=20230506-r0 jq=1.7.1-r0 curl=8.5.0-r0 bash=5.2.21-r0 vim=9.0.2127-r0 lz4=1.9.4-r5 rclone=1.65.0-r0 \ +RUN apk add --no-cache ca-certificates=20230506-r0 jq=1.7.1-r0 curl=8.5.0-r0 bash=5.2.21-r0 vim=9.0.2127-r0 lz4=1.9.4-r5 rclone=1.65.0-r1 \ && addgroup -g 1000 evmos \ && adduser -S -h /home/evmos -D evmos -u 1000 -G evmos From 0c1441ff2f94157bec7a83bc81a859af142bd9e0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 8 Mar 2024 22:42:29 +0000 Subject: [PATCH 155/345] build(deps): bump github.com/golang/protobuf from 1.5.3 to 1.5.4 (#2399) * build(deps): bump github.com/golang/protobuf from 1.5.3 to 1.5.4 Bumps [github.com/golang/protobuf](https://github.com/golang/protobuf) from 1.5.3 to 1.5.4. - [Release notes](https://github.com/golang/protobuf/releases) - [Commits](https://github.com/golang/protobuf/compare/v1.5.3...v1.5.4) --- updated-dependencies: - dependency-name: github.com/golang/protobuf dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * gomod2nix generate --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: tom Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- gomod2nix.toml | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index b997127855..1f068b76f1 100644 --- a/go.mod +++ b/go.mod @@ -23,7 +23,7 @@ require ( github.com/crypto-org-chain/cronos/versiondb v0.0.0-20240129013154-12efd9b7643f github.com/davecgh/go-spew v1.1.1 github.com/ethereum/go-ethereum v1.11.5 - github.com/golang/protobuf v1.5.3 + github.com/golang/protobuf v1.5.4 github.com/gorilla/mux v1.8.1 github.com/gorilla/websocket v1.5.1 github.com/grpc-ecosystem/grpc-gateway v1.16.0 @@ -51,7 +51,7 @@ require ( golang.org/x/text v0.14.0 google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 google.golang.org/grpc v1.62.0 - google.golang.org/protobuf v1.32.0 + google.golang.org/protobuf v1.33.0 sigs.k8s.io/yaml v1.4.0 ) diff --git a/go.sum b/go.sum index 0ac1877569..383fb4f298 100644 --- a/go.sum +++ b/go.sum @@ -616,8 +616,8 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -1848,8 +1848,8 @@ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= -google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/gomod2nix.toml b/gomod2nix.toml index 261c37c255..6f36a9af69 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -309,8 +309,8 @@ schema = 3 version = "v1.6.0" hash = "sha256-fWdnMQisRbiRzGT3ISrUHovquzLRHWvcv1JEsJFZRno=" [mod."github.com/golang/protobuf"] - version = "v1.5.3" - hash = "sha256-svogITcP4orUIsJFjMtp+Uv1+fKJv2Q5Zwf2dMqnpOQ=" + version = "v1.5.4" + hash = "sha256-N3+Lv9lEZjrdOWdQhFj6Y3Iap4rVLEQeI8/eFFyAMZ0=" [mod."github.com/golang/snappy"] version = "v0.0.4" hash = "sha256-Umx+5xHAQCN/Gi4HbtMhnDCSPFAXSsjVbXd8n5LhjAA=" @@ -715,8 +715,8 @@ schema = 3 version = "v1.62.0" hash = "sha256-OnEEt6J1d9uQazORCpD6jbAKph8/dKlDHcUEEkLQyjQ=" [mod."google.golang.org/protobuf"] - version = "v1.32.0" - hash = "sha256-GJuTkMGHCzHbyK4yD5kY4oMn8wQWqgkeBK//yVDqHJk=" + version = "v1.33.0" + hash = "sha256-cWwQjtUwSIEkAlAadrlxK1PYZXTRrV4NKzt7xDpJgIU=" [mod."gopkg.in/ini.v1"] version = "v1.67.0" hash = "sha256-V10ahGNGT+NLRdKUyRg1dos5RxLBXBk1xutcnquc/+4=" From 547d45d234867c882237d10169594a6c8ff928fc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Mar 2024 11:05:41 +0000 Subject: [PATCH 156/345] build(deps): bump github.com/onsi/ginkgo/v2 from 2.15.0 to 2.16.0 (#2392) * build(deps): bump github.com/onsi/ginkgo/v2 from 2.15.0 to 2.16.0 Bumps [github.com/onsi/ginkgo/v2](https://github.com/onsi/ginkgo) from 2.15.0 to 2.16.0. - [Release notes](https://github.com/onsi/ginkgo/releases) - [Changelog](https://github.com/onsi/ginkgo/blob/master/CHANGELOG.md) - [Commits](https://github.com/onsi/ginkgo/compare/v2.15.0...v2.16.0) --- updated-dependencies: - dependency-name: github.com/onsi/ginkgo/v2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * gomod2nix generate --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: tom Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- go.mod | 6 +++--- go.sum | 12 ++++++------ gomod2nix.toml | 12 ++++++------ 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index 1f068b76f1..034c059aa2 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,7 @@ require ( github.com/hashicorp/go-version v1.6.0 github.com/improbable-eng/grpc-web v0.15.0 github.com/linxGnu/grocksdb v1.8.12 - github.com/onsi/ginkgo/v2 v2.15.0 + github.com/onsi/ginkgo/v2 v2.16.0 github.com/onsi/gomega v1.31.1 github.com/ory/dockertest/v3 v3.10.0 github.com/pkg/errors v0.9.1 @@ -125,7 +125,7 @@ require ( github.com/go-kit/kit v0.12.0 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect - github.com/go-logr/logr v1.3.0 // indirect + github.com/go-logr/logr v1.4.1 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-sourcemap/sourcemap v2.1.3+incompatible // indirect @@ -239,7 +239,7 @@ require ( golang.org/x/sys v0.18.0 // indirect golang.org/x/term v0.18.0 // indirect golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.16.1 // indirect + golang.org/x/tools v0.17.0 // indirect google.golang.org/api v0.155.0 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 // indirect diff --git a/go.sum b/go.sum index 383fb4f298..0077831132 100644 --- a/go.sum +++ b/go.sum @@ -532,8 +532,8 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= -github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= @@ -941,8 +941,8 @@ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108 github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo/v2 v2.15.0 h1:79HwNRBAZHOEwrczrgSOPy+eFTTlIGELKy5as+ClttY= -github.com/onsi/ginkgo/v2 v2.15.0/go.mod h1:HlxMHtYF57y6Dpf+mc5529KKmSq9h2FpCF+/ZkwUxKM= +github.com/onsi/ginkgo/v2 v2.16.0 h1:7q1w9frJDzninhXxjZd+Y/x54XNjG/UlRLIYPZafsPM= +github.com/onsi/ginkgo/v2 v2.16.0/go.mod h1:llBI3WDLL9Z6taip6f33H76YcWtJv+7R3HigUjbIBOs= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= @@ -1602,8 +1602,8 @@ golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA= -golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= +golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= +golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/gomod2nix.toml b/gomod2nix.toml index 6f36a9af69..6dbc4077ea 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -273,8 +273,8 @@ schema = 3 version = "v0.6.0" hash = "sha256-RtIG2qARd5sT10WQ7F3LR8YJhS8exs+KiuUiVf75bWg=" [mod."github.com/go-logr/logr"] - version = "v1.3.0" - hash = "sha256-N8JYtQlwpLWTaCczfhfA/YmHExko0ObPMYVGw8JwbSw=" + version = "v1.4.1" + hash = "sha256-WM4badoqxXlBmqCRrnmtNce63dLlr/FJav3BJSYHvaY=" [mod."github.com/go-logr/stdr"] version = "v1.2.2" hash = "sha256-rRweAP7XIb4egtT1f2gkz4sYOu7LDHmcJ5iNsJUd0sE=" @@ -483,8 +483,8 @@ schema = 3 version = "v0.0.5" hash = "sha256-/5i70IkH/qSW5KjGzv8aQNKh9tHoz98tqtL0K2DMFn4=" [mod."github.com/onsi/ginkgo/v2"] - version = "v2.15.0" - hash = "sha256-E+f2d0RZ6DSpdh4OasCbT1vGckXsziM3hFt4HkI5x1s=" + version = "v2.16.0" + hash = "sha256-1bn6XAoQLXO4g/nM3QKlugOxXHG2sMe/RlO8EiN9ZQ0=" [mod."github.com/onsi/gomega"] version = "v1.31.1" hash = "sha256-f2DB/0bOyy+MCQdFdiRI1y4wSXjumfPtLvYN3PN7vaQ=" @@ -694,8 +694,8 @@ schema = 3 version = "v0.5.0" hash = "sha256-W6RgwgdYTO3byIPOFxrP2IpAZdgaGowAaVfYby7AULU=" [mod."golang.org/x/tools"] - version = "v0.16.1" - hash = "sha256-zIAwVvY/5/rPDebMDpR67CR7b+GtFmGWw6AOhxIkcfI=" + version = "v0.17.0" + hash = "sha256-CxuHfKKtUkn3VjA7D9WQjzvV1EUbyI/xMNhb5CxO6IQ=" [mod."google.golang.org/api"] version = "v0.155.0" hash = "sha256-lfQZ5XNJYLOSlu+lrwYYIA3qXrraLC/PIVRHha5mlqI=" From ef7061233a687033688ada4edc420b9a6818dafc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Mar 2024 12:16:46 +0000 Subject: [PATCH 157/345] build(deps): bump bufbuild/buf-setup-action from 1.29.0 to 1.30.0 (#2406) Bumps [bufbuild/buf-setup-action](https://github.com/bufbuild/buf-setup-action) from 1.29.0 to 1.30.0. - [Release notes](https://github.com/bufbuild/buf-setup-action/releases) - [Commits](https://github.com/bufbuild/buf-setup-action/compare/v1.29.0...v1.30.0) --- updated-dependencies: - dependency-name: bufbuild/buf-setup-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- .github/workflows/bsr-push.yml | 2 +- .github/workflows/proto.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/bsr-push.yml b/.github/workflows/bsr-push.yml index 4e5956910d..92892f3534 100644 --- a/.github/workflows/bsr-push.yml +++ b/.github/workflows/bsr-push.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: bufbuild/buf-setup-action@v1.29.0 + - uses: bufbuild/buf-setup-action@v1.30.0 # Push Evmos protos to the Buf Schema Registry - uses: bufbuild/buf-push-action@v1.2.0 with: diff --git a/.github/workflows/proto.yml b/.github/workflows/proto.yml index cebcd5412b..8e2a14af20 100644 --- a/.github/workflows/proto.yml +++ b/.github/workflows/proto.yml @@ -28,7 +28,7 @@ jobs: timeout-minutes: 5 steps: - uses: actions/checkout@v4 - - uses: bufbuild/buf-setup-action@v1.29.0 + - uses: bufbuild/buf-setup-action@v1.30.0 - uses: bufbuild/buf-lint-action@v1 with: input: "proto" @@ -37,7 +37,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: bufbuild/buf-setup-action@v1.29.0 + - uses: bufbuild/buf-setup-action@v1.30.0 - uses: bufbuild/buf-breaking-action@v1 with: input: "proto" From 5f17900e8a93838ffabcfff9594ae8c69b269112 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Mar 2024 12:17:52 +0000 Subject: [PATCH 158/345] build(deps): bump golang from 1.22.0-alpine3.18 to 1.22.1-alpine3.18 (#2396) Bumps golang from 1.22.0-alpine3.18 to 1.22.1-alpine3.18. --- updated-dependencies: - dependency-name: golang dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index e53511bed3..51405e3b41 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.22.0-alpine3.18 AS build-env +FROM golang:1.22.1-alpine3.18 AS build-env ARG DB_BACKEND=goleveldb ARG ROCKSDB_VERSION="8.9.1" From ad1e289ab0a38cddddef1e76b46a62d7fc184b4d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Mar 2024 17:26:32 +0000 Subject: [PATCH 159/345] build(deps): bump google.golang.org/grpc from 1.62.0 to 1.62.1 (#2398) * build(deps): bump google.golang.org/grpc from 1.62.0 to 1.62.1 Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.62.0 to 1.62.1. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.62.0...v1.62.1) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * gomod2nix generate --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: tom Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 034c059aa2..934f8129c8 100644 --- a/go.mod +++ b/go.mod @@ -50,7 +50,7 @@ require ( golang.org/x/net v0.22.0 golang.org/x/text v0.14.0 google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 - google.golang.org/grpc v1.62.0 + google.golang.org/grpc v1.62.1 google.golang.org/protobuf v1.33.0 sigs.k8s.io/yaml v1.4.0 ) diff --git a/go.sum b/go.sum index 0077831132..25c897a435 100644 --- a/go.sum +++ b/go.sum @@ -1829,8 +1829,8 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.62.0 h1:HQKZ/fa1bXkX1oFOvSjmZEUL8wLSaZTjCcLAlmZRtdk= -google.golang.org/grpc v1.62.0/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= +google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk= +google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= diff --git a/gomod2nix.toml b/gomod2nix.toml index 6dbc4077ea..ba4dc38b83 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -712,8 +712,8 @@ schema = 3 version = "v0.0.0-20240123012728-ef4313101c80" hash = "sha256-b22XLgjrH5i0wUw4iseepgLzjOpFgixWHfGPgl11kbo=" [mod."google.golang.org/grpc"] - version = "v1.62.0" - hash = "sha256-OnEEt6J1d9uQazORCpD6jbAKph8/dKlDHcUEEkLQyjQ=" + version = "v1.62.1" + hash = "sha256-1su6X0YT7MUflrTJijbq1CiisADZHudEx5sJq01TEaE=" [mod."google.golang.org/protobuf"] version = "v1.33.0" hash = "sha256-cWwQjtUwSIEkAlAadrlxK1PYZXTRrV4NKzt7xDpJgIU=" From 6aebc1f82cb689de1161c2c813ba33a711a32a58 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 17:22:04 +0000 Subject: [PATCH 160/345] build(deps): bump cachix/install-nix-action from 25 to 26 (#2407) Bumps [cachix/install-nix-action](https://github.com/cachix/install-nix-action) from 25 to 26. - [Release notes](https://github.com/cachix/install-nix-action/releases) - [Commits](https://github.com/cachix/install-nix-action/compare/v25...v26) --- updated-dependencies: - dependency-name: cachix/install-nix-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- .github/workflows/e2e-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-test.yml b/.github/workflows/e2e-test.yml index eca9cb245e..ea45531ce9 100644 --- a/.github/workflows/e2e-test.yml +++ b/.github/workflows/e2e-test.yml @@ -98,7 +98,7 @@ jobs: with: token: ${{ steps.token_check.outputs.token }} - name: Install Nix - uses: cachix/install-nix-action@v25 + uses: cachix/install-nix-action@v26 with: install_url: https://releases.nixos.org/nix/nix-2.13.3/install nix_path: nixpkgs=channel:nixos-22.11 From 10bfcea65b7cc634d1e0999926986fa957ef818f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 19:13:57 +0100 Subject: [PATCH 161/345] build(deps): bump follow-redirects from 1.15.4 to 1.15.6 in /tests/solidity (#2420) build(deps): bump follow-redirects in /tests/solidity Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.4 to 1.15.6. - [Release notes](https://github.com/follow-redirects/follow-redirects/releases) - [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.4...v1.15.6) --- updated-dependencies: - dependency-name: follow-redirects dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tests/solidity/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/solidity/yarn.lock b/tests/solidity/yarn.lock index 2ebb5e454b..c81bafd5a4 100644 --- a/tests/solidity/yarn.lock +++ b/tests/solidity/yarn.lock @@ -5464,9 +5464,9 @@ flat@^5.0.2: integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== follow-redirects@^1.12.1, follow-redirects@^1.14.8, follow-redirects@^1.15.0: - version "1.15.4" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.4.tgz#cdc7d308bf6493126b17ea2191ea0ccf3e535adf" - integrity sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw== + version "1.15.6" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" + integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== for-each@^0.3.3: version "0.3.3" From c7ed92eb4180a0366ee161a71d34a759af3a74a4 Mon Sep 17 00:00:00 2001 From: one230six <163239332+one230six@users.noreply.github.com> Date: Sat, 16 Mar 2024 23:18:51 +0800 Subject: [PATCH 162/345] chore: remove repetitive words (#2409) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: one230six <723682061@qq.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> --- x/erc20/keeper/ibc_callbacks.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/erc20/keeper/ibc_callbacks.go b/x/erc20/keeper/ibc_callbacks.go index 6abafd2660..bbea1ac420 100644 --- a/x/erc20/keeper/ibc_callbacks.go +++ b/x/erc20/keeper/ibc_callbacks.go @@ -132,7 +132,7 @@ func (k Keeper) OnRecvPacket( return ack } -// OnAcknowledgementPacket responds to the the success or failure of a packet +// OnAcknowledgementPacket responds to the success or failure of a packet // acknowledgement written on the receiving chain. If the acknowledgement was a // success then nothing occurs. If the acknowledgement failed, then the sender // is refunded and then the IBC Coins are converted to ERC20. From 0575fba9f07da63c05b6be06613a740ae5e1a99e Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Tue, 19 Mar 2024 17:55:51 +0100 Subject: [PATCH 163/345] chore(tests): Remove configuration for deprecated modules from local node script (#2421) * make supply calc more robust * add changelog entry * remove logic for deprecated modules * address linter --- CHANGELOG.md | 1 + local_node.sh | 27 --------------------------- 2 files changed, 1 insertion(+), 27 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b6efd0fe1b..e37389d008 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -79,6 +79,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (werc20-precompile) [#2329](https://github.com/evmos/evmos/pull/2329) Make WEVMOS precompile `deposit` and `withdraw` functions no-ops. - (tests) [#2348](https://github.com/evmos/evmos/pull/2348) Extend integration transaction factory utils. - (all) [#2388](https://github.com/evmos/evmos/pull/2388) Remove legacy handler files from repository. +- (tests) [#2421](https://github.com/evmos/evmos/pull/2421) Remove configuration for deprecated modules from local node script. ## [v16.0.2](https://github.com/evmos/evmos/releases/tag/v16.0.2) - 2024-01-16 diff --git a/local_node.sh b/local_node.sh index 67f36c1830..40d9e81416 100755 --- a/local_node.sh +++ b/local_node.sh @@ -109,10 +109,6 @@ if [[ $overwrite == "y" || $overwrite == "Y" ]]; then # Import keys from mnemonics echo "$VAL_MNEMONIC" | evmosd keys add "$VAL_KEY" --recover --keyring-backend "$KEYRING" --algo "$KEYALGO" --home "$HOMEDIR" - - # Store the validator address in a variable to use it later - node_address=$(evmosd keys show -a "$VAL_KEY" --keyring-backend "$KEYRING" --home "$HOMEDIR") - echo "$USER1_MNEMONIC" | evmosd keys add "$USER1_KEY" --recover --keyring-backend "$KEYRING" --algo "$KEYALGO" --home "$HOMEDIR" echo "$USER2_MNEMONIC" | evmosd keys add "$USER2_KEY" --recover --keyring-backend "$KEYRING" --algo "$KEYALGO" --home "$HOMEDIR" echo "$USER3_MNEMONIC" | evmosd keys add "$USER3_KEY" --recover --keyring-backend "$KEYRING" --algo "$KEYALGO" --home "$HOMEDIR" @@ -123,7 +119,6 @@ if [[ $overwrite == "y" || $overwrite == "Y" ]]; then # Change parameter token denominations to aevmos jq '.app_state["staking"]["params"]["bond_denom"]="aevmos"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" - jq '.app_state["crisis"]["constant_fee"]["denom"]="aevmos"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" jq '.app_state["gov"]["deposit_params"]["min_deposit"][0]["denom"]="aevmos"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" # When upgrade to cosmos-sdk v0.47, use gov.params to edit the deposit params jq '.app_state["gov"]["params"]["min_deposit"][0]["denom"]="aevmos"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" @@ -133,22 +128,6 @@ if [[ $overwrite == "y" || $overwrite == "Y" ]]; then # Set gas limit in genesis jq '.consensus_params["block"]["max_gas"]="10000000"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" - # Set claims start time - current_date=$(date -u +"%Y-%m-%dT%TZ") - jq -r --arg current_date "$current_date" '.app_state["claims"]["params"]["airdrop_start_time"]=$current_date' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" - - # Set claims records for validator account - amount_to_claim=10000 - jq -r --arg node_address "$node_address" --arg amount_to_claim "$amount_to_claim" '.app_state["claims"]["claims_records"]=[{"initial_claimable_amount":$amount_to_claim, "actions_completed":[false, false, false, false],"address":$node_address}]' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" - - # Set claims decay - jq '.app_state["claims"]["params"]["duration_of_decay"]="1000000s"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" - jq '.app_state["claims"]["params"]["duration_until_decay"]="100000s"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" - - # Claim module account: - # 0xA61808Fe40fEb8B3433778BBC2ecECCAA47c8c47 || evmos15cvq3ljql6utxseh0zau9m8ve2j8erz89m5wkz - jq -r --arg amount_to_claim "$amount_to_claim" '.app_state["bank"]["balances"] += [{"address":"evmos15cvq3ljql6utxseh0zau9m8ve2j8erz89m5wkz","coins":[{"denom":"aevmos", "amount":$amount_to_claim}]}]' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" - # Set base fee in genesis jq '.app_state["feemarket"]["params"]["base_fee"]="'${BASEFEE}'"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" @@ -207,12 +186,6 @@ if [[ $overwrite == "y" || $overwrite == "Y" ]]; then evmosd add-genesis-account "$(evmosd keys show "$USER3_KEY" -a --keyring-backend "$KEYRING" --home "$HOMEDIR")" 1000000000000000000000aevmos --keyring-backend "$KEYRING" --home "$HOMEDIR" evmosd add-genesis-account "$(evmosd keys show "$USER4_KEY" -a --keyring-backend "$KEYRING" --home "$HOMEDIR")" 1000000000000000000000aevmos --keyring-backend "$KEYRING" --home "$HOMEDIR" - # bc is required to add these big numbers - # NOTE: we have the validator account (1e26) plus 4 (1e21) accounts - # plus the claimed amount (1e4) - total_supply=100004000000000000000010000 - jq -r --arg total_supply "$total_supply" '.app_state["bank"]["supply"][0]["amount"]=$total_supply' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" - # Sign genesis transaction evmosd gentx "$VAL_KEY" 1000000000000000000000aevmos --gas-prices ${BASEFEE}aevmos --keyring-backend "$KEYRING" --chain-id "$CHAINID" --home "$HOMEDIR" ## In case you want to create multiple validators at genesis From fabd753328f0aab60193c92ff2a76e09f8855452 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Mar 2024 17:49:33 +0000 Subject: [PATCH 164/345] build(deps-dev): bump @openzeppelin/contracts from 4.9.3 to 4.9.6 in /tests/nix_tests/hardhat (#2382) * build(deps-dev): bump @openzeppelin/contracts Bumps [@openzeppelin/contracts](https://github.com/OpenZeppelin/openzeppelin-contracts) from 4.9.3 to 4.9.6. - [Release notes](https://github.com/OpenZeppelin/openzeppelin-contracts/releases) - [Changelog](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/CHANGELOG.md) - [Commits](https://github.com/OpenZeppelin/openzeppelin-contracts/compare/v4.9.3...v4.9.6) --- updated-dependencies: - dependency-name: "@openzeppelin/contracts" dependency-type: direct:development ... Signed-off-by: dependabot[bot] * update exp constants --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: Vladislav Varadinov Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Co-authored-by: tom --- tests/nix_tests/expected_constants.py | 4 ++-- tests/nix_tests/hardhat/package-lock.json | 14 +++++++------- tests/nix_tests/hardhat/package.json | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/tests/nix_tests/expected_constants.py b/tests/nix_tests/expected_constants.py index 0ee16679b0..788cd1e162 100644 --- a/tests/nix_tests/expected_constants.py +++ b/tests/nix_tests/expected_constants.py @@ -153,8 +153,8 @@ "from": "0x57f96e6b86cdefdb3d412547816a82e3e0ebf9d2", "gas": "0xfa0c5", "gasUsed": "0xfa0c5", - "input": "0x60806040523480156200001157600080fd5b506040518060400160405280600981526020017f54657374455243323000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f546573740000000000000000000000000000000000000000000000000000000081525081600390816200008f9190620004b8565b508060049081620000a19190620004b8565b505050620000c1336a52b7d2dcc80cd2e4000000620000c760201b60201c565b620006ba565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000139576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001309062000600565b60405180910390fd5b6200014d600083836200023460201b60201c565b806002600082825462000161919062000651565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200021491906200069d565b60405180910390a362000230600083836200023960201b60201c565b5050565b505050565b505050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002c057607f821691505b602082108103620002d657620002d562000278565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000301565b6200034c868362000301565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000399620003936200038d8462000364565b6200036e565b62000364565b9050919050565b6000819050919050565b620003b58362000378565b620003cd620003c482620003a0565b8484546200030e565b825550505050565b600090565b620003e4620003d5565b620003f1818484620003aa565b505050565b5b8181101562000419576200040d600082620003da565b600181019050620003f7565b5050565b601f82111562000468576200043281620002dc565b6200043d84620002f1565b810160208510156200044d578190505b620004656200045c85620002f1565b830182620003f6565b50505b505050565b600082821c905092915050565b60006200048d600019846008026200046d565b1980831691505092915050565b6000620004a883836200047a565b9150826002028217905092915050565b620004c3826200023e565b67ffffffffffffffff811115620004df57620004de62000249565b5b620004eb8254620002a7565b620004f88282856200041d565b600060209050601f8311600181146200053057600084156200051b578287015190505b6200052785826200049a565b86555062000597565b601f1984166200054086620002dc565b60005b828110156200056a5784890151825560018201915060208501945060208101905062000543565b868310156200058a578489015162000586601f8916826200047a565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000620005e8601f836200059f565b9150620005f582620005b0565b602082019050919050565b600060208201905081810360008301526200061b81620005d9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200065e8262000364565b91506200066b8362000364565b925082820190508082111562000686576200068562000622565b5b92915050565b620006978162000364565b82525050565b6000602082019050620006b460008301846200068c565b92915050565b61122f80620006ca6000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461016857806370a082311461019857806395d89b41146101c8578063a457c2d7146101e6578063a9059cbb14610216578063dd62ed3e14610246576100a9565b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100fc57806323b872dd1461011a578063313ce5671461014a575b600080fd5b6100b6610276565b6040516100c39190610b0c565b60405180910390f35b6100e660048036038101906100e19190610bc7565b610308565b6040516100f39190610c22565b60405180910390f35b61010461032b565b6040516101119190610c4c565b60405180910390f35b610134600480360381019061012f9190610c67565b610335565b6040516101419190610c22565b60405180910390f35b610152610364565b60405161015f9190610cd6565b60405180910390f35b610182600480360381019061017d9190610bc7565b61036d565b60405161018f9190610c22565b60405180910390f35b6101b260048036038101906101ad9190610cf1565b6103a4565b6040516101bf9190610c4c565b60405180910390f35b6101d06103ec565b6040516101dd9190610b0c565b60405180910390f35b61020060048036038101906101fb9190610bc7565b61047e565b60405161020d9190610c22565b60405180910390f35b610230600480360381019061022b9190610bc7565b6104f5565b60405161023d9190610c22565b60405180910390f35b610260600480360381019061025b9190610d1e565b610518565b60405161026d9190610c4c565b60405180910390f35b60606003805461028590610d8d565b80601f01602080910402602001604051908101604052809291908181526020018280546102b190610d8d565b80156102fe5780601f106102d3576101008083540402835291602001916102fe565b820191906000526020600020905b8154815290600101906020018083116102e157829003601f168201915b5050505050905090565b60008061031361059f565b90506103208185856105a7565b600191505092915050565b6000600254905090565b60008061034061059f565b905061034d858285610770565b6103588585856107fc565b60019150509392505050565b60006012905090565b60008061037861059f565b905061039981858561038a8589610518565b6103949190610ded565b6105a7565b600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600480546103fb90610d8d565b80601f016020809104026020016040519081016040528092919081815260200182805461042790610d8d565b80156104745780601f1061044957610100808354040283529160200191610474565b820191906000526020600020905b81548152906001019060200180831161045757829003601f168201915b5050505050905090565b60008061048961059f565b905060006104978286610518565b9050838110156104dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d390610e93565b60405180910390fd5b6104e982868684036105a7565b60019250505092915050565b60008061050061059f565b905061050d8185856107fc565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060d90610f25565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067c90610fb7565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516107639190610c4c565b60405180910390a3505050565b600061077c8484610518565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146107f657818110156107e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107df90611023565b60405180910390fd5b6107f584848484036105a7565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361086b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610862906110b5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d190611147565b60405180910390fd5b6108e5838383610a72565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561096b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610962906111d9565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610a599190610c4c565b60405180910390a3610a6c848484610a77565b50505050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610ab6578082015181840152602081019050610a9b565b60008484015250505050565b6000601f19601f8301169050919050565b6000610ade82610a7c565b610ae88185610a87565b9350610af8818560208601610a98565b610b0181610ac2565b840191505092915050565b60006020820190508181036000830152610b268184610ad3565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610b5e82610b33565b9050919050565b610b6e81610b53565b8114610b7957600080fd5b50565b600081359050610b8b81610b65565b92915050565b6000819050919050565b610ba481610b91565b8114610baf57600080fd5b50565b600081359050610bc181610b9b565b92915050565b60008060408385031215610bde57610bdd610b2e565b5b6000610bec85828601610b7c565b9250506020610bfd85828601610bb2565b9150509250929050565b60008115159050919050565b610c1c81610c07565b82525050565b6000602082019050610c376000830184610c13565b92915050565b610c4681610b91565b82525050565b6000602082019050610c616000830184610c3d565b92915050565b600080600060608486031215610c8057610c7f610b2e565b5b6000610c8e86828701610b7c565b9350506020610c9f86828701610b7c565b9250506040610cb086828701610bb2565b9150509250925092565b600060ff82169050919050565b610cd081610cba565b82525050565b6000602082019050610ceb6000830184610cc7565b92915050565b600060208284031215610d0757610d06610b2e565b5b6000610d1584828501610b7c565b91505092915050565b60008060408385031215610d3557610d34610b2e565b5b6000610d4385828601610b7c565b9250506020610d5485828601610b7c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610da557607f821691505b602082108103610db857610db7610d5e565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610df882610b91565b9150610e0383610b91565b9250828201905080821115610e1b57610e1a610dbe565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000610e7d602583610a87565b9150610e8882610e21565b604082019050919050565b60006020820190508181036000830152610eac81610e70565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000610f0f602483610a87565b9150610f1a82610eb3565b604082019050919050565b60006020820190508181036000830152610f3e81610f02565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000610fa1602283610a87565b9150610fac82610f45565b604082019050919050565b60006020820190508181036000830152610fd081610f94565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061100d601d83610a87565b915061101882610fd7565b602082019050919050565b6000602082019050818103600083015261103c81611000565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061109f602583610a87565b91506110aa82611043565b604082019050919050565b600060208201905081810360008301526110ce81611092565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000611131602383610a87565b915061113c826110d5565b604082019050919050565b6000602082019050818103600083015261116081611124565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006111c3602683610a87565b91506111ce82611167565b604082019050919050565b600060208201905081810360008301526111f2816111b6565b905091905056fea26469706673582212200e52712b5f0233156acf7441e4c7b9c91822322e8e4d11e5477a1f814ba6e07464736f6c63430008120033", # noqa: E501 - "output": "0x608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461016857806370a082311461019857806395d89b41146101c8578063a457c2d7146101e6578063a9059cbb14610216578063dd62ed3e14610246576100a9565b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100fc57806323b872dd1461011a578063313ce5671461014a575b600080fd5b6100b6610276565b6040516100c39190610b0c565b60405180910390f35b6100e660048036038101906100e19190610bc7565b610308565b6040516100f39190610c22565b60405180910390f35b61010461032b565b6040516101119190610c4c565b60405180910390f35b610134600480360381019061012f9190610c67565b610335565b6040516101419190610c22565b60405180910390f35b610152610364565b60405161015f9190610cd6565b60405180910390f35b610182600480360381019061017d9190610bc7565b61036d565b60405161018f9190610c22565b60405180910390f35b6101b260048036038101906101ad9190610cf1565b6103a4565b6040516101bf9190610c4c565b60405180910390f35b6101d06103ec565b6040516101dd9190610b0c565b60405180910390f35b61020060048036038101906101fb9190610bc7565b61047e565b60405161020d9190610c22565b60405180910390f35b610230600480360381019061022b9190610bc7565b6104f5565b60405161023d9190610c22565b60405180910390f35b610260600480360381019061025b9190610d1e565b610518565b60405161026d9190610c4c565b60405180910390f35b60606003805461028590610d8d565b80601f01602080910402602001604051908101604052809291908181526020018280546102b190610d8d565b80156102fe5780601f106102d3576101008083540402835291602001916102fe565b820191906000526020600020905b8154815290600101906020018083116102e157829003601f168201915b5050505050905090565b60008061031361059f565b90506103208185856105a7565b600191505092915050565b6000600254905090565b60008061034061059f565b905061034d858285610770565b6103588585856107fc565b60019150509392505050565b60006012905090565b60008061037861059f565b905061039981858561038a8589610518565b6103949190610ded565b6105a7565b600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600480546103fb90610d8d565b80601f016020809104026020016040519081016040528092919081815260200182805461042790610d8d565b80156104745780601f1061044957610100808354040283529160200191610474565b820191906000526020600020905b81548152906001019060200180831161045757829003601f168201915b5050505050905090565b60008061048961059f565b905060006104978286610518565b9050838110156104dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d390610e93565b60405180910390fd5b6104e982868684036105a7565b60019250505092915050565b60008061050061059f565b905061050d8185856107fc565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060d90610f25565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067c90610fb7565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516107639190610c4c565b60405180910390a3505050565b600061077c8484610518565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146107f657818110156107e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107df90611023565b60405180910390fd5b6107f584848484036105a7565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361086b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610862906110b5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d190611147565b60405180910390fd5b6108e5838383610a72565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561096b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610962906111d9565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610a599190610c4c565b60405180910390a3610a6c848484610a77565b50505050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610ab6578082015181840152602081019050610a9b565b60008484015250505050565b6000601f19601f8301169050919050565b6000610ade82610a7c565b610ae88185610a87565b9350610af8818560208601610a98565b610b0181610ac2565b840191505092915050565b60006020820190508181036000830152610b268184610ad3565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610b5e82610b33565b9050919050565b610b6e81610b53565b8114610b7957600080fd5b50565b600081359050610b8b81610b65565b92915050565b6000819050919050565b610ba481610b91565b8114610baf57600080fd5b50565b600081359050610bc181610b9b565b92915050565b60008060408385031215610bde57610bdd610b2e565b5b6000610bec85828601610b7c565b9250506020610bfd85828601610bb2565b9150509250929050565b60008115159050919050565b610c1c81610c07565b82525050565b6000602082019050610c376000830184610c13565b92915050565b610c4681610b91565b82525050565b6000602082019050610c616000830184610c3d565b92915050565b600080600060608486031215610c8057610c7f610b2e565b5b6000610c8e86828701610b7c565b9350506020610c9f86828701610b7c565b9250506040610cb086828701610bb2565b9150509250925092565b600060ff82169050919050565b610cd081610cba565b82525050565b6000602082019050610ceb6000830184610cc7565b92915050565b600060208284031215610d0757610d06610b2e565b5b6000610d1584828501610b7c565b91505092915050565b60008060408385031215610d3557610d34610b2e565b5b6000610d4385828601610b7c565b9250506020610d5485828601610b7c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610da557607f821691505b602082108103610db857610db7610d5e565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610df882610b91565b9150610e0383610b91565b9250828201905080821115610e1b57610e1a610dbe565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000610e7d602583610a87565b9150610e8882610e21565b604082019050919050565b60006020820190508181036000830152610eac81610e70565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000610f0f602483610a87565b9150610f1a82610eb3565b604082019050919050565b60006020820190508181036000830152610f3e81610f02565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000610fa1602283610a87565b9150610fac82610f45565b604082019050919050565b60006020820190508181036000830152610fd081610f94565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061100d601d83610a87565b915061101882610fd7565b602082019050919050565b6000602082019050818103600083015261103c81611000565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061109f602583610a87565b91506110aa82611043565b604082019050919050565b600060208201905081810360008301526110ce81611092565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000611131602383610a87565b915061113c826110d5565b604082019050919050565b6000602082019050818103600083015261116081611124565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006111c3602683610a87565b91506111ce82611167565b604082019050919050565b600060208201905081810360008301526111f2816111b6565b905091905056fea26469706673582212200e52712b5f0233156acf7441e4c7b9c91822322e8e4d11e5477a1f814ba6e07464736f6c63430008120033", # noqa: E501 + "input": "0x60806040523480156200001157600080fd5b506040518060400160405280600981526020017f54657374455243323000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f546573740000000000000000000000000000000000000000000000000000000081525081600390816200008f9190620004b8565b508060049081620000a19190620004b8565b505050620000c1336a52b7d2dcc80cd2e4000000620000c760201b60201c565b620006ba565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000139576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001309062000600565b60405180910390fd5b6200014d600083836200023460201b60201c565b806002600082825462000161919062000651565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200021491906200069d565b60405180910390a362000230600083836200023960201b60201c565b5050565b505050565b505050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002c057607f821691505b602082108103620002d657620002d562000278565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000301565b6200034c868362000301565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000399620003936200038d8462000364565b6200036e565b62000364565b9050919050565b6000819050919050565b620003b58362000378565b620003cd620003c482620003a0565b8484546200030e565b825550505050565b600090565b620003e4620003d5565b620003f1818484620003aa565b505050565b5b8181101562000419576200040d600082620003da565b600181019050620003f7565b5050565b601f82111562000468576200043281620002dc565b6200043d84620002f1565b810160208510156200044d578190505b620004656200045c85620002f1565b830182620003f6565b50505b505050565b600082821c905092915050565b60006200048d600019846008026200046d565b1980831691505092915050565b6000620004a883836200047a565b9150826002028217905092915050565b620004c3826200023e565b67ffffffffffffffff811115620004df57620004de62000249565b5b620004eb8254620002a7565b620004f88282856200041d565b600060209050601f8311600181146200053057600084156200051b578287015190505b6200052785826200049a565b86555062000597565b601f1984166200054086620002dc565b60005b828110156200056a5784890151825560018201915060208501945060208101905062000543565b868310156200058a578489015162000586601f8916826200047a565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000620005e8601f836200059f565b9150620005f582620005b0565b602082019050919050565b600060208201905081810360008301526200061b81620005d9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200065e8262000364565b91506200066b8362000364565b925082820190508082111562000686576200068562000622565b5b92915050565b620006978162000364565b82525050565b6000602082019050620006b460008301846200068c565b92915050565b61122f80620006ca6000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461016857806370a082311461019857806395d89b41146101c8578063a457c2d7146101e6578063a9059cbb14610216578063dd62ed3e14610246576100a9565b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100fc57806323b872dd1461011a578063313ce5671461014a575b600080fd5b6100b6610276565b6040516100c39190610b0c565b60405180910390f35b6100e660048036038101906100e19190610bc7565b610308565b6040516100f39190610c22565b60405180910390f35b61010461032b565b6040516101119190610c4c565b60405180910390f35b610134600480360381019061012f9190610c67565b610335565b6040516101419190610c22565b60405180910390f35b610152610364565b60405161015f9190610cd6565b60405180910390f35b610182600480360381019061017d9190610bc7565b61036d565b60405161018f9190610c22565b60405180910390f35b6101b260048036038101906101ad9190610cf1565b6103a4565b6040516101bf9190610c4c565b60405180910390f35b6101d06103ec565b6040516101dd9190610b0c565b60405180910390f35b61020060048036038101906101fb9190610bc7565b61047e565b60405161020d9190610c22565b60405180910390f35b610230600480360381019061022b9190610bc7565b6104f5565b60405161023d9190610c22565b60405180910390f35b610260600480360381019061025b9190610d1e565b610518565b60405161026d9190610c4c565b60405180910390f35b60606003805461028590610d8d565b80601f01602080910402602001604051908101604052809291908181526020018280546102b190610d8d565b80156102fe5780601f106102d3576101008083540402835291602001916102fe565b820191906000526020600020905b8154815290600101906020018083116102e157829003601f168201915b5050505050905090565b60008061031361059f565b90506103208185856105a7565b600191505092915050565b6000600254905090565b60008061034061059f565b905061034d858285610770565b6103588585856107fc565b60019150509392505050565b60006012905090565b60008061037861059f565b905061039981858561038a8589610518565b6103949190610ded565b6105a7565b600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600480546103fb90610d8d565b80601f016020809104026020016040519081016040528092919081815260200182805461042790610d8d565b80156104745780601f1061044957610100808354040283529160200191610474565b820191906000526020600020905b81548152906001019060200180831161045757829003601f168201915b5050505050905090565b60008061048961059f565b905060006104978286610518565b9050838110156104dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d390610e93565b60405180910390fd5b6104e982868684036105a7565b60019250505092915050565b60008061050061059f565b905061050d8185856107fc565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060d90610f25565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067c90610fb7565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516107639190610c4c565b60405180910390a3505050565b600061077c8484610518565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146107f657818110156107e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107df90611023565b60405180910390fd5b6107f584848484036105a7565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361086b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610862906110b5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d190611147565b60405180910390fd5b6108e5838383610a72565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561096b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610962906111d9565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610a599190610c4c565b60405180910390a3610a6c848484610a77565b50505050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610ab6578082015181840152602081019050610a9b565b60008484015250505050565b6000601f19601f8301169050919050565b6000610ade82610a7c565b610ae88185610a87565b9350610af8818560208601610a98565b610b0181610ac2565b840191505092915050565b60006020820190508181036000830152610b268184610ad3565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610b5e82610b33565b9050919050565b610b6e81610b53565b8114610b7957600080fd5b50565b600081359050610b8b81610b65565b92915050565b6000819050919050565b610ba481610b91565b8114610baf57600080fd5b50565b600081359050610bc181610b9b565b92915050565b60008060408385031215610bde57610bdd610b2e565b5b6000610bec85828601610b7c565b9250506020610bfd85828601610bb2565b9150509250929050565b60008115159050919050565b610c1c81610c07565b82525050565b6000602082019050610c376000830184610c13565b92915050565b610c4681610b91565b82525050565b6000602082019050610c616000830184610c3d565b92915050565b600080600060608486031215610c8057610c7f610b2e565b5b6000610c8e86828701610b7c565b9350506020610c9f86828701610b7c565b9250506040610cb086828701610bb2565b9150509250925092565b600060ff82169050919050565b610cd081610cba565b82525050565b6000602082019050610ceb6000830184610cc7565b92915050565b600060208284031215610d0757610d06610b2e565b5b6000610d1584828501610b7c565b91505092915050565b60008060408385031215610d3557610d34610b2e565b5b6000610d4385828601610b7c565b9250506020610d5485828601610b7c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610da557607f821691505b602082108103610db857610db7610d5e565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610df882610b91565b9150610e0383610b91565b9250828201905080821115610e1b57610e1a610dbe565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000610e7d602583610a87565b9150610e8882610e21565b604082019050919050565b60006020820190508181036000830152610eac81610e70565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000610f0f602483610a87565b9150610f1a82610eb3565b604082019050919050565b60006020820190508181036000830152610f3e81610f02565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000610fa1602283610a87565b9150610fac82610f45565b604082019050919050565b60006020820190508181036000830152610fd081610f94565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061100d601d83610a87565b915061101882610fd7565b602082019050919050565b6000602082019050818103600083015261103c81611000565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061109f602583610a87565b91506110aa82611043565b604082019050919050565b600060208201905081810360008301526110ce81611092565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000611131602383610a87565b915061113c826110d5565b604082019050919050565b6000602082019050818103600083015261116081611124565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006111c3602683610a87565b91506111ce82611167565b604082019050919050565b600060208201905081810360008301526111f2816111b6565b905091905056fea26469706673582212209aca84c22c4932bc0bc36dd485e79f3946cd158e6d3d8555f89efbb1607b065164736f6c63430008120033", # noqa: E501 + "output": "0x608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461016857806370a082311461019857806395d89b41146101c8578063a457c2d7146101e6578063a9059cbb14610216578063dd62ed3e14610246576100a9565b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100fc57806323b872dd1461011a578063313ce5671461014a575b600080fd5b6100b6610276565b6040516100c39190610b0c565b60405180910390f35b6100e660048036038101906100e19190610bc7565b610308565b6040516100f39190610c22565b60405180910390f35b61010461032b565b6040516101119190610c4c565b60405180910390f35b610134600480360381019061012f9190610c67565b610335565b6040516101419190610c22565b60405180910390f35b610152610364565b60405161015f9190610cd6565b60405180910390f35b610182600480360381019061017d9190610bc7565b61036d565b60405161018f9190610c22565b60405180910390f35b6101b260048036038101906101ad9190610cf1565b6103a4565b6040516101bf9190610c4c565b60405180910390f35b6101d06103ec565b6040516101dd9190610b0c565b60405180910390f35b61020060048036038101906101fb9190610bc7565b61047e565b60405161020d9190610c22565b60405180910390f35b610230600480360381019061022b9190610bc7565b6104f5565b60405161023d9190610c22565b60405180910390f35b610260600480360381019061025b9190610d1e565b610518565b60405161026d9190610c4c565b60405180910390f35b60606003805461028590610d8d565b80601f01602080910402602001604051908101604052809291908181526020018280546102b190610d8d565b80156102fe5780601f106102d3576101008083540402835291602001916102fe565b820191906000526020600020905b8154815290600101906020018083116102e157829003601f168201915b5050505050905090565b60008061031361059f565b90506103208185856105a7565b600191505092915050565b6000600254905090565b60008061034061059f565b905061034d858285610770565b6103588585856107fc565b60019150509392505050565b60006012905090565b60008061037861059f565b905061039981858561038a8589610518565b6103949190610ded565b6105a7565b600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600480546103fb90610d8d565b80601f016020809104026020016040519081016040528092919081815260200182805461042790610d8d565b80156104745780601f1061044957610100808354040283529160200191610474565b820191906000526020600020905b81548152906001019060200180831161045757829003601f168201915b5050505050905090565b60008061048961059f565b905060006104978286610518565b9050838110156104dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d390610e93565b60405180910390fd5b6104e982868684036105a7565b60019250505092915050565b60008061050061059f565b905061050d8185856107fc565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060d90610f25565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067c90610fb7565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516107639190610c4c565b60405180910390a3505050565b600061077c8484610518565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146107f657818110156107e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107df90611023565b60405180910390fd5b6107f584848484036105a7565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361086b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610862906110b5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d190611147565b60405180910390fd5b6108e5838383610a72565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561096b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610962906111d9565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610a599190610c4c565b60405180910390a3610a6c848484610a77565b50505050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610ab6578082015181840152602081019050610a9b565b60008484015250505050565b6000601f19601f8301169050919050565b6000610ade82610a7c565b610ae88185610a87565b9350610af8818560208601610a98565b610b0181610ac2565b840191505092915050565b60006020820190508181036000830152610b268184610ad3565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610b5e82610b33565b9050919050565b610b6e81610b53565b8114610b7957600080fd5b50565b600081359050610b8b81610b65565b92915050565b6000819050919050565b610ba481610b91565b8114610baf57600080fd5b50565b600081359050610bc181610b9b565b92915050565b60008060408385031215610bde57610bdd610b2e565b5b6000610bec85828601610b7c565b9250506020610bfd85828601610bb2565b9150509250929050565b60008115159050919050565b610c1c81610c07565b82525050565b6000602082019050610c376000830184610c13565b92915050565b610c4681610b91565b82525050565b6000602082019050610c616000830184610c3d565b92915050565b600080600060608486031215610c8057610c7f610b2e565b5b6000610c8e86828701610b7c565b9350506020610c9f86828701610b7c565b9250506040610cb086828701610bb2565b9150509250925092565b600060ff82169050919050565b610cd081610cba565b82525050565b6000602082019050610ceb6000830184610cc7565b92915050565b600060208284031215610d0757610d06610b2e565b5b6000610d1584828501610b7c565b91505092915050565b60008060408385031215610d3557610d34610b2e565b5b6000610d4385828601610b7c565b9250506020610d5485828601610b7c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610da557607f821691505b602082108103610db857610db7610d5e565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610df882610b91565b9150610e0383610b91565b9250828201905080821115610e1b57610e1a610dbe565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000610e7d602583610a87565b9150610e8882610e21565b604082019050919050565b60006020820190508181036000830152610eac81610e70565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000610f0f602483610a87565b9150610f1a82610eb3565b604082019050919050565b60006020820190508181036000830152610f3e81610f02565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000610fa1602283610a87565b9150610fac82610f45565b604082019050919050565b60006020820190508181036000830152610fd081610f94565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061100d601d83610a87565b915061101882610fd7565b602082019050919050565b6000602082019050818103600083015261103c81611000565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061109f602583610a87565b91506110aa82611043565b604082019050919050565b600060208201905081810360008301526110ce81611092565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000611131602383610a87565b915061113c826110d5565b604082019050919050565b6000602082019050818103600083015261116081611124565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006111c3602683610a87565b91506111ce82611167565b604082019050919050565b600060208201905081810360008301526111f2816111b6565b905091905056fea26469706673582212209aca84c22c4932bc0bc36dd485e79f3946cd158e6d3d8555f89efbb1607b065164736f6c63430008120033", # noqa: E501 "to": "0x8c76cfc1934d5120cc673b6e5ddf7b88feb1c18c", "type": "CREATE", "value": "0x0", diff --git a/tests/nix_tests/hardhat/package-lock.json b/tests/nix_tests/hardhat/package-lock.json index eeac03f595..08c10cc639 100644 --- a/tests/nix_tests/hardhat/package-lock.json +++ b/tests/nix_tests/hardhat/package-lock.json @@ -17,7 +17,7 @@ "@nomicfoundation/hardhat-network-helpers": "^1.0.8", "@nomicfoundation/hardhat-toolbox": "^3.0.0", "@nomicfoundation/hardhat-verify": "^1.1.1", - "@openzeppelin/contracts": "^4.9.3", + "@openzeppelin/contracts": "^4.9.6", "@openzeppelin/contracts-upgradeable": "^4.9.6", "@typechain/ethers-v6": "^0.4.3", "@typechain/hardhat": "^8.0.3", @@ -1475,9 +1475,9 @@ } }, "node_modules/@openzeppelin/contracts": { - "version": "4.9.3", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.3.tgz", - "integrity": "sha512-He3LieZ1pP2TNt5JbkPA4PNT9WC3gOTOlDcFGJW4Le4QKqwmiNJCRt44APfxMxvq7OugU/cqYuPcSBzOw38DAg==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.6.tgz", + "integrity": "sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA==", "dev": true }, "node_modules/@openzeppelin/contracts-upgradeable": { @@ -7756,9 +7756,9 @@ "optional": true }, "@openzeppelin/contracts": { - "version": "4.9.3", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.3.tgz", - "integrity": "sha512-He3LieZ1pP2TNt5JbkPA4PNT9WC3gOTOlDcFGJW4Le4QKqwmiNJCRt44APfxMxvq7OugU/cqYuPcSBzOw38DAg==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.6.tgz", + "integrity": "sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA==", "dev": true }, "@openzeppelin/contracts-upgradeable": { diff --git a/tests/nix_tests/hardhat/package.json b/tests/nix_tests/hardhat/package.json index 34b1d8dc65..ac23ae3fce 100644 --- a/tests/nix_tests/hardhat/package.json +++ b/tests/nix_tests/hardhat/package.json @@ -13,7 +13,7 @@ "@nomicfoundation/hardhat-network-helpers": "^1.0.8", "@nomicfoundation/hardhat-toolbox": "^3.0.0", "@nomicfoundation/hardhat-verify": "^1.1.1", - "@openzeppelin/contracts": "^4.9.3", + "@openzeppelin/contracts": "^4.9.6", "@openzeppelin/contracts-upgradeable": "^4.9.6", "@typechain/ethers-v6": "^0.4.3", "@typechain/hardhat": "^8.0.3", From 687c1f9044ea3c96cdb33c69436bbcf65ecca3d6 Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Thu, 21 Mar 2024 14:40:05 +0100 Subject: [PATCH 165/345] imp(ante): Minor improvements to readibility (#2427) * improve readibility and add safety measure * remove unnecessary util * add changelog entry --- CHANGELOG.md | 1 + app/ante/evm/04_validate.go | 24 +++++++----------------- app/ante/evm/mono.go | 20 +------------------- 3 files changed, 9 insertions(+), 36 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e37389d008..9a049215d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -80,6 +80,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (tests) [#2348](https://github.com/evmos/evmos/pull/2348) Extend integration transaction factory utils. - (all) [#2388](https://github.com/evmos/evmos/pull/2388) Remove legacy handler files from repository. - (tests) [#2421](https://github.com/evmos/evmos/pull/2421) Remove configuration for deprecated modules from local node script. +- (ante) [#2427](https://github.com/evmos/evmos/pull/2427) Minor improvements to EVM mono ante handler readability. ## [v16.0.2](https://github.com/evmos/evmos/releases/tag/v16.0.2) - 2024-01-16 diff --git a/app/ante/evm/04_validate.go b/app/ante/evm/04_validate.go index 569b3646ec..2f79a626ba 100644 --- a/app/ante/evm/04_validate.go +++ b/app/ante/evm/04_validate.go @@ -13,18 +13,19 @@ import ( ) // ValidateMsg validates an Ethereum specific message type and returns an error if invalid -// It checks for the following conditions: -// - If the from address is not empty -// - If the transaction is a contract creation or call and it is disabled through governance +// +// It checks the following requirements: +// - nil MUST be passed as the from address +// - If the transaction is a contract creation or call, the corresponding operation must be enabled in the EVM parameters func ValidateMsg( evmParams evmtypes.Params, txData evmtypes.TxData, from sdktypes.AccAddress, ) error { - err := checkValidFrom(from) - if err != nil { - return err + if from != nil { + return errorsmod.Wrapf(errortypes.ErrInvalidRequest, "invalid from address; expected nil; got: %q", from.String()) } + return checkDisabledCreateCall( txData, evmParams.EnableCreate, @@ -56,17 +57,6 @@ func checkDisabledCreateCall( return nil } -// checkValidFrom checks if the from address is empty -func checkValidFrom( - from sdktypes.AccAddress, -) error { - // Validate `From` field - if from != nil { - return errorsmod.Wrapf(errortypes.ErrInvalidRequest, "invalid from address %s, expect empty string", from) - } - return nil -} - // FIXME: this shouldn't be required if the tx was an Ethereum transaction type func ValidateTx(tx sdktypes.Tx) (*tx.Fee, error) { err := tx.ValidateBasic() diff --git a/app/ante/evm/mono.go b/app/ante/evm/mono.go index 399824926a..2bae718069 100644 --- a/app/ante/evm/mono.go +++ b/app/ante/evm/mono.go @@ -157,25 +157,7 @@ func (md MonoDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, ne return ctx, err } - // 4. validate basic and updates gas - // txFee, txGasLimit, err := CheckDisabledCreateCallAndUpdateTxFee( - // txData.GetTo(), - // from, - // decUtils.TxGasLimit, - // gas, - // decUtils.EvmParams.EnableCreate, - // decUtils.EvmParams.EnableCall, - // decUtils.BaseFee, - // txData.Fee(), - // txData.TxType(), - // decUtils.EvmDenom, - // decUtils.TxFee, - // ) - // if err != nil { - // return ctx, err - // } - - // 4. validate basic and updates gas + // 4. validate msg contents err = ValidateMsg( decUtils.EvmParams, txData, From 2ba45879bf176245b61d306118727fe81fd656e9 Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Thu, 21 Mar 2024 13:08:32 -0300 Subject: [PATCH 166/345] chore(deps): update ca-certificates docker dep (#2424) chore(deps): update docker dep --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 51405e3b41..1018e17142 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,7 +7,7 @@ WORKDIR /go/src/github.com/evmos/evmos COPY go.mod go.sum ./ -RUN set -eux; apk add --no-cache ca-certificates=20230506-r0 build-base=0.5-r3 git=2.40.1-r0 linux-headers=6.3-r0 bash=5.2.15-r5 +RUN set -eux; apk add --no-cache ca-certificates=20240226-r0 build-base=0.5-r3 git=2.40.1-r0 linux-headers=6.3-r0 bash=5.2.15-r5 RUN --mount=type=bind,target=. --mount=type=secret,id=GITHUB_TOKEN \ git config --global url."https://$(cat /run/secrets/GITHUB_TOKEN)@github.com/".insteadOf "https://github.com/"; \ @@ -41,7 +41,7 @@ COPY --from=build-env /target/usr/lib /usr/lib COPY --from=build-env /target/usr/local/lib /usr/local/lib COPY --from=build-env /target/usr/include /usr/include -RUN apk add --no-cache ca-certificates=20230506-r0 jq=1.7.1-r0 curl=8.5.0-r0 bash=5.2.21-r0 vim=9.0.2127-r0 lz4=1.9.4-r5 rclone=1.65.0-r1 \ +RUN apk add --no-cache ca-certificates=20240226-r0 jq=1.7.1-r0 curl=8.5.0-r0 bash=5.2.21-r0 vim=9.0.2127-r0 lz4=1.9.4-r5 rclone=1.65.0-r1 \ && addgroup -g 1000 evmos \ && adduser -S -h /home/evmos -D evmos -u 1000 -G evmos From 9e580f40555908edc56f534fa089dc1efce13e9c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Mar 2024 16:23:18 +0000 Subject: [PATCH 167/345] build(deps-dev): bump follow-redirects from 1.15.4 to 1.15.6 in /tests/nix_tests/hardhat (#2419) build(deps-dev): bump follow-redirects in /tests/nix_tests/hardhat Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.4 to 1.15.6. - [Release notes](https://github.com/follow-redirects/follow-redirects/releases) - [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.4...v1.15.6) --- updated-dependencies: - dependency-name: follow-redirects dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> --- tests/nix_tests/hardhat/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/nix_tests/hardhat/package-lock.json b/tests/nix_tests/hardhat/package-lock.json index 08c10cc639..5517a819e3 100644 --- a/tests/nix_tests/hardhat/package-lock.json +++ b/tests/nix_tests/hardhat/package-lock.json @@ -3437,9 +3437,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", - "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "dev": true, "funding": [ { @@ -9341,9 +9341,9 @@ "dev": true }, "follow-redirects": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", - "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "dev": true }, "form-data": { From a179614543fa1ec28ede50a0b46e3b9273648659 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 Mar 2024 10:35:05 +0100 Subject: [PATCH 168/345] build(deps): bump github.com/onsi/ginkgo/v2 from 2.16.0 to 2.17.0 (#2422) * build(deps): bump github.com/onsi/ginkgo/v2 from 2.16.0 to 2.17.0 Bumps [github.com/onsi/ginkgo/v2](https://github.com/onsi/ginkgo) from 2.16.0 to 2.17.0. - [Release notes](https://github.com/onsi/ginkgo/releases) - [Changelog](https://github.com/onsi/ginkgo/blob/master/CHANGELOG.md) - [Commits](https://github.com/onsi/ginkgo/compare/v2.16.0...v2.17.0) --- updated-dependencies: - dependency-name: github.com/onsi/ginkgo/v2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * gomod2nix generate --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: tom Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 934f8129c8..7a6cd8a65f 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,7 @@ require ( github.com/hashicorp/go-version v1.6.0 github.com/improbable-eng/grpc-web v0.15.0 github.com/linxGnu/grocksdb v1.8.12 - github.com/onsi/ginkgo/v2 v2.16.0 + github.com/onsi/ginkgo/v2 v2.17.0 github.com/onsi/gomega v1.31.1 github.com/ory/dockertest/v3 v3.10.0 github.com/pkg/errors v0.9.1 diff --git a/go.sum b/go.sum index 25c897a435..b963e60834 100644 --- a/go.sum +++ b/go.sum @@ -941,8 +941,8 @@ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108 github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo/v2 v2.16.0 h1:7q1w9frJDzninhXxjZd+Y/x54XNjG/UlRLIYPZafsPM= -github.com/onsi/ginkgo/v2 v2.16.0/go.mod h1:llBI3WDLL9Z6taip6f33H76YcWtJv+7R3HigUjbIBOs= +github.com/onsi/ginkgo/v2 v2.17.0 h1:kdnunFXpBjbzN56hcJHrXZ8M+LOkenKA7NnBzTNigTI= +github.com/onsi/ginkgo/v2 v2.17.0/go.mod h1:llBI3WDLL9Z6taip6f33H76YcWtJv+7R3HigUjbIBOs= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= diff --git a/gomod2nix.toml b/gomod2nix.toml index ba4dc38b83..7418d89781 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -483,8 +483,8 @@ schema = 3 version = "v0.0.5" hash = "sha256-/5i70IkH/qSW5KjGzv8aQNKh9tHoz98tqtL0K2DMFn4=" [mod."github.com/onsi/ginkgo/v2"] - version = "v2.16.0" - hash = "sha256-1bn6XAoQLXO4g/nM3QKlugOxXHG2sMe/RlO8EiN9ZQ0=" + version = "v2.17.0" + hash = "sha256-zKSbCHAAJ19tZJ8gb008Tg9VBpCVNfT6uGTEZHWVoGM=" [mod."github.com/onsi/gomega"] version = "v1.31.1" hash = "sha256-f2DB/0bOyy+MCQdFdiRI1y4wSXjumfPtLvYN3PN7vaQ=" From c2bdd9a7e5f407edeede34fb4afdfcf208e12600 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 Mar 2024 10:37:28 -0300 Subject: [PATCH 169/345] build(deps): bump github.com/docker/docker from 24.0.7+incompatible to 24.0.9+incompatible (#2426) --- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 7a6cd8a65f..16d1087e39 100644 --- a/go.mod +++ b/go.mod @@ -110,7 +110,7 @@ require ( github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91 // indirect github.com/docker/cli v20.10.24+incompatible // indirect - github.com/docker/docker v24.0.7+incompatible // indirect + github.com/docker/docker v24.0.9+incompatible // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/dop251/goja v0.0.0-20220405120441-9037c2b61cbf // indirect diff --git a/go.sum b/go.sum index b963e60834..302c27f01d 100644 --- a/go.sum +++ b/go.sum @@ -448,8 +448,8 @@ github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91 h1:Izz0+t1Z5nI16 github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/docker/cli v20.10.24+incompatible h1:vfV+1kv9yD0/cpL6wWY9cE+Y9J8hL/NqJDGob0B3RVw= github.com/docker/cli v20.10.24+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= -github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v24.0.9+incompatible h1:HPGzNmwfLZWdxHqK9/II92pyi1EpYKsAqcl4G0Of9v0= +github.com/docker/docker v24.0.9+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= diff --git a/gomod2nix.toml b/gomod2nix.toml index 7418d89781..1eb6c1284a 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -223,8 +223,8 @@ schema = 3 version = "v20.10.24+incompatible" hash = "sha256-5bvtx8SXoCnSN/M/Eb8TE0ctW8o0jH7mB2zF1JRx3Eg=" [mod."github.com/docker/docker"] - version = "v24.0.7+incompatible" - hash = "sha256-fgLsKDI2q2KNu40T/iFMHa6A0JWt2clExwDW3WHPNYI=" + version = "v24.0.9+incompatible" + hash = "sha256-JZToreP7NNxIoPLTsA6NTIFlYCGHi1Kty4uzuA253Xw=" [mod."github.com/docker/go-connections"] version = "v0.4.0" hash = "sha256-GHNIjOuuNp5lFQ308+nDNwQPGESCVV7bCUxSW5ZxZlc=" From 724a3c3d0c1801100fb1825aec4571956b6bfe97 Mon Sep 17 00:00:00 2001 From: Snoppy Date: Mon, 25 Mar 2024 16:11:48 +0800 Subject: [PATCH 170/345] chore: fix typos (#2431) Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- client/docs/swagger-ui/swagger-ui-bundle.js | 2 +- tests/nix_tests/utils.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/docs/swagger-ui/swagger-ui-bundle.js b/client/docs/swagger-ui/swagger-ui-bundle.js index 4491b4b284..05612895af 100644 --- a/client/docs/swagger-ui/swagger-ui-bundle.js +++ b/client/docs/swagger-ui/swagger-ui-bundle.js @@ -25428,7 +25428,7 @@ try { return e && r(e.toString) ? e.toString() : String(e) } catch (e) { - throw new TypeError("Passed argument cannot be stringifed") + throw new TypeError("Passed argument cannot be stringified") } } }, function(e, t, n) { diff --git a/tests/nix_tests/utils.py b/tests/nix_tests/utils.py index 48f955d5ea..2689c19e94 100644 --- a/tests/nix_tests/utils.py +++ b/tests/nix_tests/utils.py @@ -246,7 +246,7 @@ def wait_for_cosmos_tx_receipt(cli, tx_hash): def wait_for_ack(cli, chain): """ - Helper function to wait for acknoledgment + Helper function to wait for acknowledgment of an IBC transfer """ print(f"{chain} waiting ack...") From 46a15ffcb4bd746c3f6b3e82305480bf55206718 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Mar 2024 09:28:21 +0000 Subject: [PATCH 171/345] build(deps): bump github.com/onsi/gomega from 1.31.1 to 1.32.0 (#2423) * build(deps): bump github.com/onsi/gomega from 1.31.1 to 1.32.0 Bumps [github.com/onsi/gomega](https://github.com/onsi/gomega) from 1.31.1 to 1.32.0. - [Release notes](https://github.com/onsi/gomega/releases) - [Changelog](https://github.com/onsi/gomega/blob/master/CHANGELOG.md) - [Commits](https://github.com/onsi/gomega/compare/v1.31.1...v1.32.0) --- updated-dependencies: - dependency-name: github.com/onsi/gomega dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * gomod2nix generate --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: tom Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 16d1087e39..b4a589fee1 100644 --- a/go.mod +++ b/go.mod @@ -31,7 +31,7 @@ require ( github.com/improbable-eng/grpc-web v0.15.0 github.com/linxGnu/grocksdb v1.8.12 github.com/onsi/ginkgo/v2 v2.17.0 - github.com/onsi/gomega v1.31.1 + github.com/onsi/gomega v1.32.0 github.com/ory/dockertest/v3 v3.10.0 github.com/pkg/errors v0.9.1 github.com/rakyll/statik v0.1.7 diff --git a/go.sum b/go.sum index 302c27f01d..7e611c4a7c 100644 --- a/go.sum +++ b/go.sum @@ -947,8 +947,8 @@ github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5 github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.31.1 h1:KYppCUK+bUgAZwHOu7EXVBKyQA6ILvOESHkn/tgoqvo= -github.com/onsi/gomega v1.31.1/go.mod h1:y40C95dwAD1Nz36SsEnxvfFe8FFfNxzI5eJ0EYGyAy0= +github.com/onsi/gomega v1.32.0 h1:JRYU78fJ1LPxlckP6Txi/EYqJvjtMrDC04/MM5XRHPk= +github.com/onsi/gomega v1.32.0/go.mod h1:a4x4gW6Pz2yK1MAmvluYme5lvYTn61afQ2ETw/8n4Lg= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= diff --git a/gomod2nix.toml b/gomod2nix.toml index 1eb6c1284a..52ac587145 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -486,8 +486,8 @@ schema = 3 version = "v2.17.0" hash = "sha256-zKSbCHAAJ19tZJ8gb008Tg9VBpCVNfT6uGTEZHWVoGM=" [mod."github.com/onsi/gomega"] - version = "v1.31.1" - hash = "sha256-f2DB/0bOyy+MCQdFdiRI1y4wSXjumfPtLvYN3PN7vaQ=" + version = "v1.32.0" + hash = "sha256-FzYwmABdsJFJhATLXRJgQjZBQqL6yycRm2SZ7iJCjo0=" [mod."github.com/opencontainers/go-digest"] version = "v1.0.0" hash = "sha256-cfVDjHyWItmUGZ2dzQhCHgmOmou8v7N+itDkLZVkqkQ=" From 00685123cf1d03734c243f760b001c23b535fc6f Mon Sep 17 00:00:00 2001 From: JohnEndson <165029498+JohnEndson@users.noreply.github.com> Date: Thu, 28 Mar 2024 20:48:26 +0800 Subject: [PATCH 172/345] chore: remove repetitive words in proto file (#2439) Signed-off-by: JohnEndson --- proto/ethermint/evm/v1/query.proto | 2 +- proto/ethermint/evm/v1/tx.proto | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/proto/ethermint/evm/v1/query.proto b/proto/ethermint/evm/v1/query.proto index 4cb36a2729..dac2bc8f6e 100644 --- a/proto/ethermint/evm/v1/query.proto +++ b/proto/ethermint/evm/v1/query.proto @@ -255,7 +255,7 @@ message QueryTraceTxRequest { google.protobuf.Timestamp block_time = 7 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; // proposer_address is the proposer of the requested block bytes proposer_address = 8 [(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/types.ConsAddress"]; - // chain_id is the the eip155 chain id parsed from the requested block header + // chain_id is the eip155 chain id parsed from the requested block header int64 chain_id = 9; // block_max_gas of the block of the requested transaction int64 block_max_gas = 10; diff --git a/proto/ethermint/evm/v1/tx.proto b/proto/ethermint/evm/v1/tx.proto index 1e7e0f2fa9..3836858c22 100644 --- a/proto/ethermint/evm/v1/tx.proto +++ b/proto/ethermint/evm/v1/tx.proto @@ -122,7 +122,7 @@ message DynamicFeeTx { uint64 gas = 5 [(gogoproto.customname) = "GasLimit"]; // to is the hex formatted address of the recipient string to = 6; - // value defines the the transaction amount. + // value defines the transaction amount. string value = 7 [(gogoproto.customtype) = "cosmossdk.io/math.Int", (gogoproto.customname) = "Amount"]; // data is the data payload bytes of the transaction. bytes data = 8; From cb7974f4952c0781073293e50ac17ab8549fe38c Mon Sep 17 00:00:00 2001 From: stepit <48993133+0xstepit@users.noreply.github.com> Date: Wed, 3 Apr 2024 18:35:42 +0200 Subject: [PATCH 173/345] chore: update legal email (#2449) change legal mail --- LICENSE_FAQ.md | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/LICENSE_FAQ.md b/LICENSE_FAQ.md index 913c904044..15cea5a5d3 100644 --- a/LICENSE_FAQ.md +++ b/LICENSE_FAQ.md @@ -68,7 +68,7 @@ not refer to it as an Open Source license. **Q:How do I apply for a commercial use permit or obtain different licensing terms or inquire about terms of this license?** -**A:** You may contact the legal department of licensor: legal@thars.is. They +**A:** You may contact the legal department of licensor: os@evmos.org. They may be able to partner with you to answer your questions and figure out what will work best for you and your needs. You only need this kind of permit if you cannot meet the limitations of ENCL-1.0. diff --git a/README.md b/README.md index 607f230bce..4807564fd9 100644 --- a/README.md +++ b/README.md @@ -104,7 +104,7 @@ of the Evmos repository. For more information see [LICENSE](./LICENSE). > [!WARNING] > > **NOTE: If you are interested in using this software** -> email us at [evmos-sdk@evmos.org](mailto:evmos-sdk@evmos.org) with copy to [legal@thars.is](mailto:legal@thars.is) +> email us at [evmos-sdk@evmos.org](mailto:evmos-sdk@evmos.org) with copy to [os@evmos.org](mailto:os@evmos.org) ### SPDX Identifier From ec9205c451ab3a5980ae2946356a80d1c12af80f Mon Sep 17 00:00:00 2001 From: Sandoche ADITTANE Date: Thu, 4 Apr 2024 12:22:40 +0100 Subject: [PATCH 174/345] chore(docs): updating safu policy (#2451) * chore(docs): updating safu policy * chore: changelog updated * Update CHANGELOG.md Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> * Update CHANGELOG.md --------- Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> --- CHANGELOG.md | 1 + SAFU.pdf | Bin 107886 -> 158571 bytes 2 files changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9a049215d5..095e2123f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -56,6 +56,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### Improvements +- (all) [#2451](https://github.com/evmos/evmos/pull/2451) Updating the safu.pdf document. - (ante) [#2028](https://github.com/evmos/evmos/pull/2028) MonoAnteHandler for EVM transaction. - (staking-precompile) [#2105](https://github.com/evmos/evmos/pull/2105) Detect the length of the ed25519 pubkey in precompile `CreateValidator` to prevent panic. - (tests) [#2230](https://github.com/evmos/evmos/pull/2230) Send bank transfer during automated upgrade tests. diff --git a/SAFU.pdf b/SAFU.pdf index 7e5c97c13fd06c516279309f7121ff6b8b1a9a7a..dc2e554e2f1ce8ff5b5af47875f2ca39076a515d 100644 GIT binary patch literal 158571 zcma&MQ;aS^yRF+j+vaTBwr$(CzqW1LwrAV6ZQHip=U->-?3`rnlkB7}-i*4bs~Yck zGDsCf#Aq4m*r7=WiwC;~TL$x>nFtsN?2N3Sd3fk$Ol{4bEeM$ZqbSjfSz0@rI?{_- z8#S!enDX&KJ2^X=8rnd+XIJZJR#J~5`SSM)&4x0!zMcaUVw_tL01LySKNx%= zB5yj_|7qtqx-Co96W1kPhevlV*6gUP1iV|FSCaXB+-{aVPtx;$-=+2bICl8@czwP~ z<}4M<@PJj9nXZ(1?Dy*T_le@I*@Y_z;h3ZWWKGeQ)ZFKV7gKiJM# zsU`f-p?@h*Z}%>gVCz9U2k66}lj;1lb#Z&Y*RXZ8m1|Z`cJcyr@fJdR7Op%*x)?5H zV00cVfif|6-fkZ8cW?4`d)8@pVbkp7`lpj#JdU;cCy1+cxUUVZ2q?T1*g&6daFS)+V=H<)(PYh)R~@$Y)W@{rN&68RD!3nW;)0S4Gg zs@d6}=W@_YoqsW9Y-e{X48v4ok(N%V$rMfwS(6`6kdSyWD`mdv{5U0X@0AJih1XJsn83Sddqp6-68P&#M zR6GslH_L-;l0*w8a?+3ETuC$;HlYAoI5YM`U9)1Rwvw<>NHu9funyud!V9gl zn}`jYh*yRrhl^~0;WtPiG7P6a8fY!WD`=T=he)}5V|WoK=d6jY=)LoAnI}nYz^zFp z^~x(qHWj%sE4?yFwF7$S@;!PE=Q4TH4HXKjtvPt2(O#Wk+jUv)bJ02_uo0S||IRIV@JXtckHg`gt9>oya#HIpo24ow+mG#IFp{ zuMMSbp%^FFwnrrKYl2>h_pyXH2sdfj%D}DnGph(UvS+eupXAIpru(I;pOaQjT5FTD zD_Gu)4DR07wUXX3$Yj1 z`8J$J&^;i6&zq5#M(7D<_2N!SJwS|@a^d}MplMXkmb|NiEIiDpY4Hk98=?TX4vkeY*TB|NR2>ZSg&7k^d z^K5QOpHGsIsxx1pNeWr!>w4gy4z%k4)iQ1m{aS8V#TC$bY@RCS#|2g76xgOzXm&}0 zA-EJFrQ5@!G{ZR*SSk4+a`gcfPQ>ajQX*tf5+6v~-9~CVS6kxObunV?fR?dSaqBF9 zoy!h)3h}WQUeqLeAENcaa`r$k*PEmMH@X|7j2ud*yLbFS;IRF8HAS3jZE!aNIw+wa zo|>oC!~g?K7wglE6oPMH(->l?Hg0p#SW!L}OcU5Pq_MygZKGRS(f!;OYMhJ_!m$-A z@O<|_2*UFx28?6aqkhE+VFrrCqr-;JF(u-wsupW%2h-jKPtlV!z_!sG6k!hF1037( zJJ^k62Rsb`N<0FT6yB1dAVR&y3Au?j5G97IGf+M|j*L)i)HOln325N}5T;OrnZV!Y z{cvK;iTY($$~Bq*L{b`#4r%z(f_0tyYwJvG{0)t%|jydO$=5XbNQ@ zD=uOQE9iU@Zhiz=aant&Y+~UD5tv}?#x$b!{!bfZKw*ocFH&O!jb!Pb-RS4a$cCi* znp)i%fo14o>{J};Ym|~nr~!F9DEgO4ke4%*mMfImne{xWM3GMvpS&{ka(R;=7KrvV zU?Dk#fpY#L`h>bk$}`@EyBE;#*k|u(I2w;XtbvtO^MwOTe{XU|mPBtqBjY5;`BLeA z12eUzPgFT<=x}biY(mAbQ%F%%rOxtXhBz!DN+Oo z&0VHqpB}-T8`;o~S6x{1`V$8C0(d4=!N@S!1U5XRk<%eNoklXG4(g;8H&AbZ{JZlv zNlifqrNXBAFBB0Cu&$C3IrgBhyBK@9F zbTaGRW7AN3+1xW_L}C+c$wYyaQkY~ND*5}-rXXd?^g%=^pZ&eC)IvK)z(?;$NkHR_ zToar&2k*{%$B~$mPX%~@o8raDIAbywue@A_BHqp5)_Mjxn$6!uQnL`g5RZ5jaFDX8 zty!{@s8kZjWRktU!29r-xj!LXq=_}MU?&p(=)A+cV1+=tm7<#)p#3vNX&b_H0WBT@ z57v1W(k+<^31;c5;xnHUQgCfBY{NK$VR^X=)X<^fvbY;Q{1tdEgmxC!CNZG075(;i z7<%Qs$y3=nPGg!ELEFM}puvpO{WGaZcfr+8n=S~&ZFp-{$hkc6p- z{j>|#9NKN-`)WZN&d3980+S9S3gu7Wri8{}*Kjnrmc*$S|114Qr-dcsIkWBJf%zp& z4CEWG3CK0ZH)yP`>-kjw)H0!}@d>p7Nh=e~BjiQyPpm4vsE8p64v6NgtJ^C?Qx9V@ z6#aF?q+~%XJ?Ao4a0M;|00`%jE2mKj1$X_($y}X@XIMxE8o#los4`#4iKmbnr;&rj zVSx4C$naiai?q~Vu)vt}h?A5+7M-%QN{=d*uI%gjL#wDTU8eo;l3wCXV$~;CSrQ|w zzEB2HRw+1~A(I9>C*j&eBF#%2jxh@s;H`(&Ku7NjB9Fg7~IjdYR&s>pSUXu&Yg_`bJD^UMl?HTQ81104psuu_1 z&-9g1suj`LRhpf@Fl;^)ILKl(FsOzWliD`8KKt{`rn>!-8+z;7TD%^-A}^Gd-~EOX za#Tzn4QWn?*<(h)3Zp^iA3A2xf2ZJWNn~eqX$icUaD~&%`-n5@aA>hB4O00mT&4RN z&HrQnCJO9Uplv;^ojsX58!?w@QxpJek+>UYxf7V7whmX|BMRz+ZDQxq@%Q1K8g>-^N#BNlvidzx+y zbQ0sE0adr2qY|;(?$(2h)e6zVvydMP#W?cEyH=1OpS3m97f1R$L*nZ}I6}Wn(vAxy zC@SkV4BEDQRIIqNk~Wp3=B=VI@r0z66Bnafk;QQbd`wFrd%UpTa6j@$D4GZW{-pJK zaIHscG9YaX6`N+w&2}NEH^CD@`DF=e#-@sn+jA&?6bSV0r=I-Y<3!7o`R|J2HkL-; zbu|9J?4FV(%oW&W!2<+PHz;l*d=$Ul(%IQHQ)oGSh2J52oH9ytn>;1zO}u%Z3`BC~ zIIYo*NTr!=e%cApc^}PA92r-QWXjYXwsA`B1$nLvq)qP9=E*u&$v^+fcfsIesPY}R z7OP7~vL7=pYan`JMz5zLEUBQ&ys~{8B5zG3=8~`RjeQb!4+w9%Q%Mk8|$G4OsO8r^81~8=*#!S5NW4mi^RPJ~N2nQZ0BR{}umX zjus5*x2oqkATB@i(zD3vU?d?G*Nlx*h*Q{n+-z#;Sn|(_EKs-dv7lKJ{(YCT6YEIF zW~D#bI!3}Yyxl0EeQxRrzW^BKPgh4(dk9+R2XU4$Topl)Y9`JKh%IG~eu-5Bcc z!yxAE{}jl?gaGLBQjfu;ejyo^ZI3H>&i-aBjBk9Yv6Po zF^zM;tF}p+VPnx2j3_5W7P>+c_LkGoa$y@?Ed?naA8!@?I=spB2v4iZ=#QF)IO17S z%*5*n68mUKv2lBE;Sb=ZiN$>pYzgzTil_!x5dCp-)!@S<`GXbnZSLrEB6;fZp8$ju z=Mhd54cvoHYNXDu$juNYT#w6cZ4}oH)GH0dzy*UZ-s?BqPb;z0w8X``nHO1WD~cP!W``**SYtR*tYriAwTzySAe~nqG+Bro?f;CO+pmdjas_(WorZT;O(2Zr{vE4)H|;K zMIc&<*0M5N&BecPgxI7x;c5a;Vrrs*ayiP4`)+rLZXJ=T27vI`N@AaDoP4dp*D+g9 z>c$8q_)uZbIVaVZ;T4H%7xmZeriUGBv+lRg>MjZAipsnlNq}G^=Fs!8VWw=BPs{S8 zQLoGi9`&(8jY>KuX(r(eBwtqtlbe}?XJuZs-S@0;SDyQ8uWe?6)2A%PY^nU@1{~B1Bm>B-+ z`u`Of*%|%^*x5afu5 z@x6JCOH|92`Vc7KW@6Ph70Tw{GYeLWWxriM?Y~ct2)p0!^!#}>`rA7{E=uIhlu2@e zm$c$Okr}@~PuH9Hy&T_Ww*Pi-llTD?uXcLJ|Fig{P#rsEys8KJ%@I7yFT}> zVck96Uw7ZVejhL1KM$3gw|sIJj_tl%p{8)W8fnM!w?56Uv$`6O17vH{f38RD6vfy2 zH@n)m=)T-5&<$!WaCOS#mSAQ9V_sN0%G{&!5Il+Vz$+2g(AEkyM_r;k&^!D;yEopK z*xv;=h8_sWm|y-9HF-NtE?Md~sH!_cOl9(Zygu(hk;|!0Ts|K+S&iRw_~>qIZ>QUN zvZ4QZ*3)O}XIX1)o~!*NZepf->*2+TYkgfygwOQ5L(!F)f-dNvS%I0d-rDkeYAe{Y zEC}E6(`7lYzbZq670&bKDfGASeqoIp%g+xr%bMGJXkH#+(t^4vV+nPI{Zy?X_97s5 zXj3(;cIN)lA+h-h9BwUcZ&G>JAQDaI54p2){mP5S;YW*-&Lj`}+!|wpzg#*y)0(_* z0OPYoRbJS<3n{Pi?kzEP&KS@>aL=wJ3y-_7hA_%U= zd!CdU|4}qo8EH5M2j(5zYpz^|SCmqH4g)>gG$M*@{tft&Vi!&%$qow4@XT7SAY|!< z5iQ!~sdn0b_H~UygEdt7uNBW5<)a}@1)2RhH^zlShk)+F0ZfG#)VT6B%>g}~H5zo+ zIuS0e-1dWp&K_czs8EQOLP4Ko;v$0nLQNSmH!xvyv@0SPKyRdH&X$>z&U<DRp~Fbzim*X2QO%l#l? z5U(BFm}Hi4J5LJ5gsBB#jy`z0x1wzXkc4s-vvcS%vcerA_uY`ab&PKT`@2WFl6x7yBM@? zHYVzp(X2}coVew7PY=}}A%BRS6|l_*?=A(6{?8<1GaWPPUA!l2fxAFK&8!2sDa2=P zdGU*skv?@@6We=rG&-?^d}GH@tQVI;~&g*#OV!Ss@{Mw4y{a#zMa3aN`KN2 zvzsCxh0K_MbU`7IM2IH^L;TAS+T<1lLlc6V8PPnT&{05RRNAPlt${x@apUCT6*!oT zQ*Af3Bpg-vG*;SS8cZ0>TnT{Jn$#^sC%`jT8KHy+Ld7FHSXkIWm#pn80&|Q-rDx$NUK26|qvGs^E!zX$VN^+kyVCo3JqvJY3 zjUqDw%AsQ^3pq>!eRZ7){w3KPJM4Q8#whcMr8k)R# zsusMn#mh&es!Ct^NSKZVXbx+N-f+j(OvRTaVsu2ekm!cDA+5ho$V|H5YZYg39y5$d z{!uJo5LjEJ3#tO%_ehF+5v7-Vd)!WmSAu1^TQ^QKN-zXIO6gQRqRB3GR;AWNKTIl7 zopY>vx zW6433&-CvqT4N>ci|OUAJ4hU%0j34OfJDIN;Uxf89$_0@1DWrTZ+@=MX28BEMdNlQ z7kNpSXzH8t7oo`+^Pf%NSOA8EnVu%Uic|Ml;@`nWZ^>t?apPcw(!MaoESuFO>?*3H zP7xqHME|Ip@GasaD%+OmieeQi8@hMZs{rc^QxNWqN0q-=Rk!ODlrpIZ;L82jd{dF) zGRBpUOzF)=p~o^j1Z|-a^OdMUz3O-D3*NWCY#I~0kJSc4ds5zy0*8j93dz7OjCO&LoRQA22*+@-6NImuI^8!@t9! zlY*_9*@fuz)=kpjk&skR(Z&>;3RBmLzIk)J6aMbj*fO4!#2Z*K%Ta{t<%8=1)^*Yp z%9m4kjxrTgSpw-X z_4mAuHcHxC^utx-c1RsqX;|l61XFmM{Uds{!c!>=qE}&Ul*oO}i9)GSEqHT{jIm#Y zzbcRAGA0~!L5F|a59%!tmuZ*hUL%Q|(h^7h+lsiiX9hn;$NL5eIOt%pU9B7!b%(6AD4jXUi>#3OihSRxN@G|Jo*e z7-G>IA+s^Mw8YMJmJ0kA^l*>?yH>HDd65#r6Wr=8;RD(Zgxw*EK?RIPU3e)d_?-_u z;x;?*bfV)`Ae>Som9%d`j4?tAtWlSV6ARjwDS?b#S%jv<%2Y!24fI;(%@Wo3S#bC4 zvE!+}+&u|Pkx{tnFdTnpmkwX>iOWX=oZeVyrhJF}F))4gzRIPHh zh++XucY@4dO&{~yklh}2s)e40iKcbfV%-f3^9)P_d#QrTNk;$Kr)+h_-{4l2h&x4x z9-J+07^rn#yj~EFH$$I_JjewX0z0z#CX}(=CpnK8p3D^NvbkdX#PaBAR1U&!Or2U# zw^zEhylEqEUz5rNLxvUlO66M>!61Z&y978lj8viDPEuPWQTR|0hI-^{QK~Uccv8G{ zr5%Y}jwCPwt$a=$KsJ7n!bcZDUf9i|!n)+|yg>0XhNuO;Xg5)zN;%Qd&QzA{4XtA` zCXp9_CXUY}lZTgMDa5OgCr5DP8xF19U`?C3$Nz8RZYz4F`vj|N^(>YtuvYqe}lIw8Ge(hCEoTSa4IrdcI~;SgFncy^5-XO z5EM&?6p-twSF>xwcZ9)EaozhfkkFa9X{;K@4%T7QCCd?~(X*ji$u#{IW}Dl1bH?WI zqv}9wJ?++HQ5_RjLNrAXr1+eTd84(CG(1M#PP0Ur^pw-0lKQNnq>Dmb6)j0wG(wxM z5)qcR{i#amuRupA2fc zO8jJo^o{WLzzJq0V~#%G8Zqwykm&KU$T=qw2*nSNMa{zG6b~g$!nlGxRc}LpV=UqE z&LHWkg|&6#Vt1}qkgBAT*JNXrMmGThQS}L&MYhw855jcdpzJ(Uv88{YM7yJ4i&^3@ z`Xn7+q`^#iQ%FjY2I>Z2vRYlj%Fi!aY--<%8-(OthaP^k;;s16#Cer8xz!CPv>ukd z<0@izS(CMCWx_tX9!t-ugsV@Xclgi}NJ$LI0ZKtyQQMf6tcU2daa}YRYt@AWW1j3N^pw& zhF`q^?r>mO*VS(rNUdg2q(i9{e9tzP-Y9lid#-tweYM4*r@nO`g>4L(Ueru&1k|Bf zeJL9`%Itd>fMDRI-+v!@kVCP7=pmTJ07e=}dEcSggE<-qVtzceaAl9qs*zD;ZCbQ? zMSf8X&m!WIaLl9y^6t?8g-M=>w$qoMe6T?ipJp@v(M2Iwt^d*9Ba`s(KBvNAaLH9P z`><*gW2ORZ3BAUX%Qg9=2aRp>w9uJlT9`|X8U37#z;8(9#TuXF4#ZK9W4CEnblt(6qX7F+Pe4M=x8Yn@mg;J zqh%8@vbDm7o5Wc97mAac zNP4Kr=_$J~4O;h#nvU3Qx(eZ1z zL4ljuCOiuM9lLqr=dRe8~C?YERq0 zl&}s}{hO?7Vy@CK88$~7ugA!&ow*LW2nAzC>FF;9-hIZu^8=~*7{{Cs-g@qXUqyg;94VD%pOWj#DO-^p85#W zPnE$w84hAS0JP7AtCJ!WzHU#W<;5}Y#;i@&90%$A9kKPzU0T|LICFeVi21^0;C^`~ zAT5%IRvc~~gZGkjy!~DoDMv5SPn5@Iy;zj8X{hMLM=iI5GPlZs>$7d^(RMy8t*EAdE|{xUiO%YVi;(ocOur^^?Xu|?=AOwW>8WgtI5h=z`AyalJq z_$VoGr7@6?wo~e8mQc4Qt6PFPOfkEi48Ol>^@zoFoMzG^CNEMPZKJLrV5iOxJy!6( zHU^KMoc>S|CLziBsBMY}wHS$!T?3hl7uIFf#dvHBuSz1@m*dGB>`twfFWtlzpeX`sqj}Zc zG^VnBIq_TA(3nysBE~yQr$CPexigS3{e!L3$lX9Br?m)4wmyCW(Y^;BF#(8o6v3<~ ziq|+?XEGtKHjOOKs)(kG>&EY%LWLS6PdD8>!WW|I7`N$?6B$p7qxR8Xx>+w(noWa+s-diG zL0Z;1ej58CBz5KJ7h^0L$p=!feXgDnX9gSiS@akuA~(!nc5-MHu4*QXp1!PQ&Px@h zLCSEY7~oa@-MTcGs;XMSyh2Td{d?TcW33ViMi*Gk(`@_LM-Y=@Q>jwI5G4rwgrIWp z#HhZ<$&0>*d#5a(vr(y%>Of}wxdeO@Mq~SG{Ls1yS>>oJ(gP#N3CBvRERIP`Y>>BU z68Strmw)kjw})6-zK{gjc=9!Z3oK$Z{YF8Tq{yeLf1~q{cFnCk;#aA_nZy>9fQBtxh1s!E*YOz&MNVtR<48ece2us_Fa^)N}xoAgniN>o#B3Z znqdihALDfA-=0;FB$j9-HjehsL~`L+e@U2<#)3CtbYYXInF%wrih8%VYH6eJ>$~Q~ zCjs=kyA(Y1-!7kkQ5%k(2Xa=^_r*Adw~k+`0Lcqdh;*I4M(H2O6joo}R}zXLaHn+y z36G1Z#AJdJ)i}?{Yj<#n#GP&0SQz5IMWABrsS2hkU!a zYb9y(gT8TMx4!AAV{}y|+!FS5chvsOJXyYZ@DBFH2tIwawe6`pbm*k$`zF`|XlJsw zcBMIG;okU#DV)3DUh8hR78N1|?`TTrxjDBue|>F_?u2-a&8qz|#PEHZ1<#kbg&Kt^ zB+*8#oW8NIplcnye1r%ruqVk(z+7x-aB_S+cn1p+jW}>Pl$Ih-PEnW1R^e>7npnDM zoT-sqk;~#MvOTF=LTsgE(NpY zcg`E~Ak7kK4n!ur6aS~H^U#K<)D81o0CI;d!Y^cJlx1&q)SsYC5ga*>Q$7pyLCQA) zhoH--BaDru^$$_CKgspU`00-)*y&zgylX#MGL+^Oh1xO;Fy`H~VakeTU?Oc8z+XdX?J5 z+Vs5r+}H1%279r7RwdTQSkH9&!l?6~S_`}i%);g-&*0v=gMNa+tcT&>EIDB4htUUb znY@X8f%pUQhe6^eso&(^K)&3*5_kMxhkb2Fv`*8_U{Nc#{2%mbA3WIobj5A;26I|}o2 zn}Zf_8~dAKpP>+9KjGeUVTKkV7!{!l?1Og1Pp{Yh4)TTS^>7<>(NTBn?s!d8Qe8-P z!{|cNdLg$XyXL09guc*P=dEwX6pc9|ni-=>5hhsw!gj%mL##=?#;Q&HyX5!|NoFQE zIq}tprVldP&}y6M9gdn8V-l2? zeR_!NFUj;n%Q?ym?D$4j>QQLgpBx)4gnKp=sUVomb1d-={N(gZ@`8~5`aXN@3Ius0 z@krN()VL%5u{Oki+^bM2HCs+^Mx@NLfQuFHxNS*O9Mnxar6^i zBa$_CJ12=Tx?0G6r{&Ar0hMwnJ*Ph>%s>SlLTi+8Hb|eS=F5J+2Q2a?Uf`WxiE;*tfUyK^{Kb=R z)GGpVfXo!W0s{}L0zvq5Iv6$gkPtSfOME$>nxH+;kq^-+Mi+pJFL+y+HBbC@u^*)f zF%g{b$d*e!MM4k5EIyL3eFWE#zQxz#SJ3=ukLUy0i$5^EK7iDe^-HT2Z6#)l@eXI; z2CT5wIcMbz&jsB41?iYRjVpRQ2s74`kf8&y^or|zGd4)fSd|Y)Y*UWM8`47$Rjw%| zfd6`+FYH4vMr$%J!M@701$}ML+$4mo1;C!myL_wuO8F`~1IKu51?g@_7@0O^a6DTR zAAhX9xw+WdnC~%l+ANK!#$KrfXl^%Mb%mBlU!X6M0cQ9rJui|g##2zJCnm{~Q={?K zvni-(#^O$oPfW}$>!+eENN}LRzxZlLua$D(JEto&Oe9g=V+~Yv(wLo6R9lRT$PsL0fstyFkxG%6?OJ>#aw z=E3hDoYH{352Lfis$WThPMO^ig06wgP5WWAbnORWtI=y0ET8*rhQv1c+ASFtBD1f}ODkC$0%uXWvT z8agl&s;WjDhP&NAGP9SvDa^HMnfnX#&uOys96W1>8s@buZRVagdJc*@?J!j4FI1s6 zH?o_jsZ*aFr(;+U)c-u>%wxBmiP%4(A-l=zw@`mu25;)3TQ8qo-)wg_?R?JYrv9)* z-v$q*a{35eV0_i2*0oOa*btl#!=Rn!jO9BElW=t8Qh}qJ^R^&tvT-_0Mz;8=qS@$QMIf8EYCFH? zbj$FqEm%(AOQw-zc}Y}#8drRbu%q-@Fy@o&?xBKU@bHgV?$P7S{cx-BmER7f>|XoT z=dqp7o7K%`e%(5rZ0gvqjBd&4G?~iz@pin(0Dkr?r9UJZ@|OrUmItO(FD6>dGHuc0 zL--L5T>?OmV%8;w7}%KAc38Fe+Nv}({DjfN#by`U)lZ%Q#2CHGNJe(#ah>=}-CMSC zP%+jnw@4@5Zq-J3KvWi)vyF9t4(Ah1H8-C0noz~e@V*dYadKqhMkMTzGp)H|fZoa= zFk6j@#QxJ@{-JPnP1A@4jW@W%GkzrsgxPQ#NqVz zDRw)7iUMdr6aHms2Bgtk5~s`PvsOFk)A4A#N`R>K3qiq^1U!iq zv0KoEmYx$cMd5QMiNAHU!6Z#HM6bXi^U5qUM>a+$5@^(59zBywGP5BV zHsGxkjnXj~P2P!=$ioxwafI_O{l4^1Cz?u@FmaM{vU;%nBb*~*DMt{37vB1Z@thX} zus6XkZVv}TILP%;PD&7_DG?Q$!V8xi^i(obaKxgeB^;BleOs8vqS5WC`n3i98^01M#k z#!>);Hz7<%vfb=d_tQgYnaU0_eaqnQA5au8t!*}LL}N$%k&E8h*i#Kv|5lU|R%+L^ zK3RckS2SqN(7ny9oraUzjhZbpf0>Q!wL_kme}tf`Ht+BnzB%@f)9l7%F)qTfzYJ$< zK+Pv{Ye+O0$zJi7sf&#zjX~xlNa8%bB8EY}id=Vj<>Yh$5Q6jipUVZ$Of0OhEog8$ z&nXQ3j!1COBAb%X+;3l~Ji=qUecWwtcluskhb~>qc=|^tvg?tfD4?^MG1suy|ddAZ2+pupASu1OzxwUYzF0V+C`1(iVf?p}+L zCrp30n=oc+TadWTMYYy^Mg)PH)(kI8tCW_s45=uA2avYlz_6%1x16@6VrQ$C5|D0l z?Q{dEb{h7v16Lm$0CMz1qrM0TLg? zgxCDMgyLu#RWcCgJLjT_>ivLP$UG$tn0Sg)Mx#=hdw_67vE|3IK&G=mt0L!G4N++s z*Ft}Oa6YVtt{A>qAuU-jf%ZOoc)YI%oTb_dS9#s$-;pfV9HPevfqlb;ku%u@?w}O0 zNZd$yCHCa)B@*6HFhWceIRx9v1Sp&Svyr-^%9NW|gjJxImsOr3s1{-QFVpX_6tGOD z98UzHfD?U&jNpC~QRdGkjNq57wErdc+yABNij->K*r`OBw9=*UJ3=uLcg+@oqsRq6 z&A1Z~R%l)ar$l55U;z40Ib)XZfv^SdjukGpv>yot&tfl7jaoW39cU%ML~szx z7H)Ug<|D<_M1da^ufdMqcSHyx0yW|FOLpEH`k%<=FFtV$~FBug+0dO#L$ z_XqKP%3n9G3dDm9ksUbPn~XC_2<*k3Zv6P+k&Kht(d=kBg=Q7YG4-TblYN7obHzhD zkh>avo!(Ke!glg{qBC^UrhBGm)1%1KQ!K6eitTwIRahApd2WemrBeCo-m{KRB>Ja|%f z88pnna)8b)zv8I)CyHeB_?YWTjgb03F%Z}k&Y2bI^w>-|ox((HB!p13;pv0{KJTf> z0b?ksI4iVVV-QC0?7GjZE*!$aZh?(X`O&?UwggjHF_!%LDHaXP%09M44VN>D@l@hqI~xxX;B0E zRVgeRf%4>>*^*2xpj`tEvc^$>%4#E9{A2$i`==j?Go096XNX@8<7fh6V?^^i1L&z) zP#qM2%nGHR(pgbl>?~AN#*~ztCY#ApPn3&4I~_Mlt|pVIqIdENQS8n`uKnZz;>))O zp{s@J)ZlbT4ZorObG7g?ibk))=+bt*wep-lGJ@pHYYcXROr z1d8oU3wv#~&rm`jQgGOjM@kEAYRLCIoY6X z%Q|Yfmbh%QZ88Kbe^dJ-xAAv1FHt!gN9o zW2QxrN60yH34EW{{zP$6M)uL1>FCgQ5kSVw#z{gDS z;K}n)H=8Gn97tv!ITj9IYTX5!`>`_@c^Sjg1@kQrKuNiEmT3XPfcoFLO zw_?~|PNC*=RFY&err;^0lxVhKM}5V*3X&96ski}vWF&-EqERRl$AjL26p|_w)+_2d z=G{EdFltDwP$WJyF0ouBu@w7Da*|_fM5HYW=Qg-pDAtw-B}G>JzUKw zPHA#FA(>ft1g4Qu3L505g==~wF)E{`3jZ_)GbY>}C?ZOjQ6p7QdL*f_gHnlv#|LO9 zMgb~yKto=zAG$F25-73+`34rI0DRgY|5yr+wUb8uSj4=btqydMl@+pTbaB=jh!Pm^ zKcd{*gD&5AAu^_`_2<20ZFZf{i4mJyovyEw`b?`j7Z#WpfKpX?f zeJ=!h|AB!?sc^Np*4t=UFF3AHnZY1FR8MeJP?0HvqfkbtOes2ocw`94_&|a!JZYvM z7{l-hu|$JYt1r&<7!?5-Dkn=BT<*3o1p;rYx(Ox5!H7I zm4rFN2aKl`#T7A`0QeIqboBKOdtgz2zQ9;dt+yo8|Z(#+jW|KgoXiu7`_n|AXx+j8auToSh?`-?}o1O;fo9 zXy?6%8hAWVd``AX2@%^8K&!y6>b~H&{;m5RG~BoOe*ii_#lO6rcW_q4B7k~ecgUh7 z*#MSBn*^gjrRO3|vU%YV;W!%RqhXxJ+r03WB~uXOOkfRzq$6oTvh9N;!Gs*fR)nz? zbb1Z7NZg`@{LB11Jhz9({2<0j>q6U6=^Y!l$A)e6UUf<@OXPB?MGstp$`=K2-UJrckYC!1cfttFo#AxZ%5)W2+oWob})A_~xI=-71EiTz2TkIZ} z#f~@`TbWpc6idM#8Ozz42YX1i%cM9iQ`m5sB*vvPo1|Jksp1r!l=~X~@=4N_#$QCn zU&ctjOu#@QV<KuBF za-?&BBSoPN3s5DO&04Y8Vz(59?BSw9dr?u9eUh&-GNouvQIox?XrsNgXjSQM`!$7k z`@a)@)b1+)ag7OZ`BZKTQRt!2V+997M+%+`yB{dce_W&+C*xP zs;5va5DO-Xiz=%4s^U5P?BWKwF|kf=O>DRAvb|{g)c$G0RaxP{yjqf55h%;@23Hog z7m~tgiKE7GvtzGg#3Af;Jn8t@!8wkYMCV|G!$w6;hpwqJ0F)5gDGnR$1P4>R9C4$| z9YNOR`x_jNC>IzckM#$Ob=#$*Ay}*^)0PHr^G2f*O4S9`4HY4DdXVL_! zPtqhN(}-bhKq6C=^0IQNVazad{*CHn05SB*rF@@aP%f2-X?p_jhoqGjJC_wW*VNi_ z2g&(KM}88;)wmWfjXxO|ssL4)y)8aC^12Qj0n%!)>-YrvJZY!wx9VsWxvvUW1t6P) zH1U8=$di_aKwdDr#2g4E=0GUX$4JuEP?Gz!__9c1VvR^duW5|(nzkMzo$(E#gEqft zqm>gGXBL@mC^8XTWGbMj(wc}9CZ|bQhERPPPAZIxGfekO@oY9s67RlCt*9pwz^7r* zFd{Pg@>bohTE%RtbkHOi!-fk;Sad}l^)aLX&#UHjNV)e^{lDjHb*T>FZ$&8-_Ah-X~6bmkAP zUU0<%ufrbB%~Q6FJF9VPaO?GRlg;Ohzwp%OSD!T*zf}-b3+9*1UUh!`Sv!z!0pi|+ zaqP$Mu~F<1IMG8MQ3usObAR!i;?8(PesJVeGTUme*s0<>)mMVYgCjv+lf4eF-yIdG zwr5xD4x6Jk-G1Uo6a5^f<_FrIBR80&2pnX3p0$9&Rxd?4D@AD+?R6_dX=^r%!R*Gg z=dElE!u_YZF~X`)w6;<^JtGd*B+%LsD~5mTf*{4%aK)sG-r%Vq=?LBz>FfuvVCU2<Hnw>~BRHCLf0^_z2&iY$ zjm!)st4~)mY;78A(W97LtCT_#IEyb<8ijbf}A5 zvt@Jbt-lz03aI|H;d8kU0b4Rr5h-N&vdU@|yv5c$?>uXrSF~h=GK#HnZ*fkQb&~fS z>r8Khw9LA}`kC@ipJRMZasJskXXnq$-&1^Fu{0@bQejQ;OzX_7y22${OA1@1HCby4 zR~7dZznTAj)<-!X=eq)a(Kkr;4HQH@5(d(mR5etJRxy#83d}%M$)!nEh(?`CU3S!_ z_Ph3*J`G!B8pN95DPztkS8htrQ6>IEpE$Z zMha+k(dQ{(^v{!KqyPn_1T+*txj+DrjZw6Gpn_y#g`0{R6U$v}J|yl*vsc*!odZ^|1_xQ+e| zAbIbRcqD1keNwM0l&E;c zbl1aVBMRb4`__HQ7;*Xpi1Up8s3%U-PN(z6)DYz=FIQir-JX)cInYSU27t{0Y2?b1 zmNu-|?JkF6VP+{sq&;3_KtY;PB_@$N%8@+ zLjq^uysAsINTLjqlxlHDkV|w%Fff6lE3Uwatxc#ivL7ja4@aPnpzB1%30()B zg>})sQfRk6+e_e2eu)?xPZE`pH7X>#9n=NbA&F;p=iE_TJ zjcXBF6d*f+C@;By?s>=1dvBVV*_)#GYJ)d7!f1Ph2_6!q;*7RS%(N`2M(8OfJTrg| zAPTU7MFC@M9ZfoN^D0U~U6)iCyquI0mJc*Y6W)p72#sT<@-n~<6W1IjA$J%uaVo>Lej+I+H?>%}5uS=^7S~0}W_Gn3}BEh#%Fk z89r@IG@VH_rK#P9-Kyp!40^zvtE4kHVCm5u#uQOK0#n?T zAt^hKF|aL)&93WS77bHJ0nL!$&M;z%On(9=|r#vyVj#}SG-sg_fm0|cGt@|MqriM^opn_-~e}$8lE9CZ8Bs@4*_V{hs ze_k*^h2$`kzynP74!D_UlTs%GOvDYOr0#&%5OO}z zrS1Tm0t`^8+fLhSB!G_wa9}~0qP(99+~HGU(hHVeBTG{)c#;xt3|uZY&V zxr8EoO|@<&VFWeIs}8%~1vH)|qeefhxrK(+}m1MDOUb2XRz=7R6ltJVRlYsnC=R zTZj5@oG|O$#W!C|sy=@c2K7w9f_Gp9xKIZ1urY9nLU?hRofM{G|_8c%ZV zt&$5VKESMCt&)aU!BP8d zupFZ!CYk}|$#Xf!prA923OmhsAay(QRP_}XR$WQgDp!w-k1=W-W0cv&q;6MA>UJ@y z+r{X!i!oO=`^_dCT&C1LI`4hNEZuHOY{ur#3t-y)3;W zjYzyXSCE-DF_6hP1fvrYldvTwVbh6$g=qwW;u#aK(`9QaS~E->N>rcFDQz`9TvaY( z){hchkg|N#?ypcW%i#bGGon*l$;l>!5;f)SDn@G!9MffJe*lmRr_oz(a?5j<|7P39 z*REW3drAM0_V~8#-+$!d3-7Z{0nt~NtIt5CnFdDCzG+r@jypp2v3U5pn|BK;_LJ13_@k*0#YU9|s9okv*)uyJc zjFgzuI=U*9KuwW-B8>j>18t%O5i8M0Kb?Mo5l{G>>|DYIKO6fle$_K;hd+Pqm&2cR zJTvQwOJ6@A9R6b8Tf<*`?jfUEza@9F)kpTS<*3#GvM4%7J+9AI;=qFH;%1VqW4 z;gHg1V?RwZ9)6md3=wRG;}ig?sGsW{!lD{5@JWGW@*HKWq5!0qboFccbiqMU!=!}6 z9KicAw8|1fP>?=uX3QRkd~kl=xF zaumCm1eM26Xe#T8LjGJ1RCCiesWEqSrOye=e#YmWi@l;ESr&^dLi#|WVINAa>@B);X`cL^u zhyOl*uYbhP`-#^iYhIJAdCkG${pJ~mZ!lxYUovC))67^zpKkDd*&)p^T2a25=2Mg6 zw}=rpplvCOl|yt$c@EJQ!FJhcy3!z!N^v4`z^WjH6F@g99cU9IeeOF^m74$7-5b&! zVg@cdy8VZ92exfmcw@D2caL5vGQ@>`*ad z!Q3m~GhHa(OL{2M^3n0uSQv+MLrG7tqKv*? z#uWCTex^e)P%BZtME(+?tZ)}`t zdN+`z44@^Xz(HC_&CnJ74O*^~DXC6Y5vRt?estV=X+fM0X7tkyfck`Y($(P1eg|Rd zbw^NWg5kx`v~|8Ybm@>ysBrCEU{0AN5?d+LOB>uLJE<#mB2ja4E1NH&zAMzDnqKr7 z6Jx>zMtd@UTxO2oEsncXx9U+jG25<1kflJ1U|}4bGQDt{<;aPk>>RsIE>t48Am5^h z2|j{iY6hhb3Cb1p6XOX*i7T$S0;Lfe>iya@8o;FTq=GQcu*TyV<9TM39B&PU!@dlr zsrp7IWn6SZrmCczIc@uOxhX%MKb}mim{j={pKbVM5?!l}*Yr8ByZDj|C+2-`jI(lrd1Z61STJj6K`b%* z;`PBrD;8DeL^C`}Zh7q`E0*s)?{T13mkggvRtc{n6)n(ZuY4y)s#}s(br6^LqrDCp zu1S})*Kq;jR8HeK?s3<5Z=giEY3R&J^~_01a+z=v=|@fp8}36mPFxk0lPb$aiB9JN z%Dr>jFXu0R>WZEDXXQYf4WIiI{scQddUNRWR~mQUe&k2Pv0)93DbaRTB3l6|P>DrR zF>+gInUuX8hU);@%U$50MiFC<^pgQ&*7O9!WC!JePDP=Z8FLWF<8GtWw9md$a_qF2 zCHLeY7wwaHemR|@P|460(8bwjRZQL<>hoXo-)D6!HFPcWV@;qNr5LKC1d(4UKyjr~sYgl0A|&1Z3IRlw3S%LQg<3d7>JCA5 zH766K5u-e`Eoc~Xhor5-LWv;QtaP&Vtpv0U9LEyJ5~zfEaX|YdD-}tW^DK(jVo?xB z2uLzsjG-VP9#~|V5G+cHg+o{l(c9hiLX{ae2Jb9u?cfqOxbfZ*-s$SHKW!I(5i3KinC5SQ6JNk#38dD-^y43EEIV2roff4!x;Vu{74~`ldEq9x$-d0lQPyRF2rurPbNI;tx zB@D{E1C)7nj50rp=fRYQp4|}4eZ`7ZYtp*P+GFK)&D_d7BCL#M(Fs?^1Ffd9)M`56 z0&tu$Lw(YgP11H_7cre<^eKK&&&!e9bkgEYUp+%8)#p#kIa9vn3}?Pj1D8k0*L&>_ zo8E|~`>rj`eb+t4efN_uyYB{>`>t1a-_4vg*3mD`eV2uuV0wJ&k*OQ%BJWryUaY7N zADbz2Sb0&`=0%B^BCes*d$2~mIxo`E8Ta&|o|It&MNX61y zwm<&;ZQCCQ!S|mx*Wdh7*YL-~uYVWc{`Au8kNy0W=Z^su%o;wI`v|CDnEaGUzs_Jv zUoZfl3HVLG2~GZEW6i^9lOQ_Gr*;#trQ)Z|*d|~%0czSalS)xvYWPd1oEeJO$yvE* z$mtfXq9^HgYSyGpb23@Y87fJH-wFqhg+nU6FqbAKT}1kwQS787v@2Rw;B9a|sc=bq z(n*|JL1~3bPm;~z_S=K*d~3cf-#*DU$v)9>m&;nAJ{!k?(5zZr2U&8$8!}?^GVKKBXRU9rk{x{KflE`;hvncO;tW_5>Y{X-f^t=l58n z5#Bk&d6koMhEkQ#9k2A|cvV$E(40=2>TuBeL6~_gQRA^6Ivwc9VAPV)*5%xO;);}b`$p?o_4^Avr%0{p^sRbB{f^A zt=`5hw2jyZbilO!5+}3}sTqi9m#hmWpb3YlD<2R+>d6;WPoD^>Cjf23LG>hq02xo} zRFP6dnfmn!KocDRAgIYMhgw}NKR376v3PE8aMY9Uh`zpa|ArIA|35YSiL)R-9ahZ2!}Ar3VCq|z30g1Eq1lTlfH zW+7jnH-_IR#RY)|B(lrBQ;Vx-2V8N%I=uOrw-VX0#GeO-+iG)5FKMV4UjL|CkQ>?L z%-{=#?%H<6CELlS&wuvhw8q6$R=6D@z6hwYfF9Ik987pFQ$R8^eUOLuON2A6E}SFf z18>eOaR2Shf@u{wV;Vy~F{cznI;Ajb3elD6_nO$U-5NTHfH=0;5Xo%npeA9c!dbrC zpCP{%4uAHKCuj{0!)X^fhB#EoY7ivVAo*0UMD6Hu^d#c%gE;r`_ut7Rt|qz`k`5qD zH&vjE!f2us%YBEB9Xm!-TL?PyNzj?Yq*<4p0;6(|Vmj(tOu(6PxHbVw*waUNh2wHS zL~1;tZq6Ly-BGI)jPh3O@JTY8%eLtzRc2n*r{0(+*0I-~XLC{Nb4_LRpwhuCiw(!3 z(>>Dzi#>}2t30a$-yz@O?zTUuK1gR5Ldr(c%54<3**fe!_J?fyEeDkSHk;pejqT5b zb7Ze{wmUC}(aQWs;-!cdih7XHB}vE8DP%!TrxlHsF$zVmRle4I?QC%7I+!D-BRc}^ zHYOSx`6v|)@)~s+$qUe(`?3&!i*u!iTdOe z-8NqH846)mgD>}G2~&GDF`U-fYAuO5LrEsJHk{t+#AKvm)OS>8UTKz{PGj4OLsUDT z+z3xQPgDJ{ll2G4ZlE@)O()==t(yflXUa#Qd|`y#4yV)22Mt$stD9+FR>@o`TVkqR zrklE9zc!UEI?TE1eHkDB@Xg_Wb$)Q&6Mu+38M=J=wU0e`)yA9f)q#UA;|#1kj>#2I z-XGc2_Ux;#Kl3fx1JJ7*$!5T@v)DKYb&w8@%*XRVX3Rk(EOgMd!hFY#l&zm=Qr|-* z^I<3;C_mkO2Xu}SHX1w=vwXFr5D)I(4=*@Dm-tWMqAE$~<6uo2+t)`#io;YP2qM+=1^@?zA2xgSMYpUvm6HeUtl* z|rkK(~}O3yNqPlL(|W3UBZyG>9j7v z1MgDbRZpK}BvKdOO?K5}NbpStx2keFcgfEI&w5Tj!$o2Yth!O>Py>!&MwOMew>6{6 zmK~_#;Gp+?Syd{VOz>6V?5rwFGFoMhi$>;BmoPb3Bxz&KM->z3T*j%W7DHV;K@}(u zP!?4QP!5-mo%pKZyZ-pS@zLVE{@)JYg0Fw;%_+klkODmX>8#Re<)07RhJK09X&i2% zH247^LDYtAMJE|1``FBPYT8?|WLlBTd=I>;yFyyRouet5ohV`Z|IJx&lUIE(USsbxQ+2?&PMPqabQr}M-Hak+(a z+W#S(5jl&EHkPPcJ&C@=kXi9ffTKf+8Sa*HI~3v;HBVLrsJ*B9-TBl-?9>2U-2w~9 zVgbpkAVlPOffp++vv?s-9H%T(c5vI2H@QEH(nBK75#v&xTqRDn)Y$9ojeMiHOlq`T z%I_5JvOF*Tntxq9A$}nJOZ-&!xfMm=IG%{2WU#zwltcfwbe`09SMZZ_fIPFvLwvf2NbHEUhEr()Aqx-K`t9H8jN4qMOA zjU9j^rN{tKt^iZy`E;>WQe_zM96K9C&_36KW0tEpVhP$^71Tl2pa)6CQk+p`kux%? zDHZO^pv3sKK8;=WWmOpj00dVIL?FRrTyf+mPz%6-qkVpQdAm<#Bpfd6&c-hLtOfyL zJd$SRev8Ml*AKaQz18dlZ=LB2(wG0XFQP}M&NfX3wAB=lf#x_B&LZ-Nmx1i?qCQPR z$xfikkPb1WI9PIBJAfbiV0a^b`t9NSFBcAf@f7YI-afRJ#4Z{>AI6c0kZ=(Anp^nW zQy{OTMu;QD)AXq>yV0|H7pvxaO(C@}14&uSxG@ViQ}#5~TyiCfspX)SG^bdH34=H} z8pE9yLmrJmeHzW;jj`$J#S_h?1boWMXGvS6>KI)k=Cq|^xXnJDOeX54$;!+^M#VW&_gt)uU{Lm+1Z50 z`@qVn7ldZh9~>QU=o?KOO_or|m1Osdi^IqU`VkhLfGc*JNXMPc1^SJ`yA)$H0o{w# z1p@c6W9sY2)YlSB&DJrB*}_Kc>VBse7x9G(ImdOr>n0aRE5|0#kDHrU95&T^gOKHs^>y-8XtuXpbhFOs_DL*ilQ0rx+}&n*R3R{<)p=Q|3V z`R)?$WK`+iAzvfk$=zXl7(YTDv4Sdq4v2>xKLg_VhUI z)fHC~t|j~;WreHFb%|@YOK~YYhcN99y<yl(ma=G0JK?2e*IiR2O><+Kp?vPzh zXF`#^@H!Gwc2z{MVM)rquTK*J5{MTz~+aOidL`S zcI9$~D1&5a(o*lj?XJsR)DdK9(y9u06Mqzz zL%BnvX^zyHLIRkQ;hLEmt>5%Vjn&L@;t5dm35cc~o;!Tx@S`<+`J;#SPCVeOh_B0gf3bs$dLVcftl(EJHi0LcC{kOg{ z#PpTn{u^JJ0}a&sl(1a~CZDD6K2TnvU&oc|*MdU*nxpSZ(4Ud1UxQ(Nmx3a@TA>Mh zgeO6Q(_kdt3@y})_!4H7cn6(Af?I>YJ&0q`nWq#A8p8YEOyT__Q+Pj<)CDVziBu2p zuQ#R{mjIRedJqOQq1y72u9H((r+4@3~A!&XV|s_1lZ*A-ohVH4StxQOlv%FDbM3WkG3v??~mu5hBy z@AZ59oEYH(S=jA>Q&5g(VZY+aLTn%w!QU0QDY6f#rs|V1M)lFvo-#VY?DlzygXH98 zQ7fmufmlw~z4+4~EWfO=yKBKkw;a2Acpt91<@*!r=HJn_;ECa12#0+c^HvYP{M^IC z!;dzXJuzuQ-3Jf7_phQ%>XpBA`v_7_ zT|nC^=wiB%izx%HpsP4xEy$#ExAhLr;qan`7&E^NyXpdV$7e?E*_mE}S%;oWG?h_D z=#ymzM@vv+o_g%HW9nN!rP?6*QXxKM9Y+Be5zuo%7qbL@L#|`<`chUU=@}(wO$pEQ zCv(pCpO>?aYx8doug|$Cd}-zl;p;Q+_CFeaD*U1UJ?)I^q{|P@grEslC3Nq^* zD;>n)h|)~(s|%^88`&^GvyIiJy9LG4usfDEl@`NQ$eI?vFL*2k@TeN&?H>lX&5JeJvVeCM0azd%jYnB~B`M{8JfZb$iqQE8|9f1FKYK@ zGb0`}d`e-bZJ+X;IGaqY$QSh$U8uaw?{=wdCmLKaYSZg@!hcEg;!77!!jq0{KJW#W zp1=9z#TWhO1CPH+e*XRL3;Q0u z|KZbI#di)och3z^K562&3-DV7iZsmdTQ|5V;Y?oeX4>rmi|LtTVJpiSeQ_Z+e~J9M zzdxfD6hn_u5!hJ!5HZBQF)8WOnilHyV{G;Hk-k_RlGHtS*l0m2qrYa7qiH4=@Zv6V zt@T>xiw?meS%aj`GtYNUXnJIcXN7M?Xi;R7w8^^0)8^Y0S{2zzc8J@p7ddx{cS^Ub zF9zQvuZyo+fA0*ZiZo{1#jo95CFyDibXgdRQI~qvLM+TmJ-R>R`{w34mOZi2?FzoM zlRke++2phrWQoKCCY~5z-c&FbgtJP=iw_nyyeiNmt6AbqnBNBP7`?*^Z2aCSN0E&yg58P{Ol8V9>m`r zzT@Llcmv+}QR_7@_TK?S`y6mg!44)}D5J}3%zZ@6) zZYFoh{Np^fAWDzu-F;ahv$^wKmICZQ-pSBJscP9;OkKhwZChJ9h1 zkhD8>(SnkPQUPm1QXoRedKg#ZtC4Q@-kKP*FhbuawuVaG=EgKBQ$Ccss~S(Vw7`I`6} z_j}?8whx19A<4ESd{tzkZ4Q}fTTWWZ8@AsE|Lp%D^j_o(;>5h&8;)8fhY0k_iW~t) zIU2JJ42_wZ8C~{^=mG>MR-H-bDrb+A&t%JfGnr`OWD5|SsRam5wgAEDH$3fzb!T#? zpH8zlO~*eLoyi!^?yuPg#F(uKG`MoVvc}*`b2Q0<1}T@#g|UUb5?k0S`E}!*z7tVK z=9icB8Y_C!mK>OidFiswFYhm=Z!d;@uclCK*e0$E-3a zF1lmskA^>PfAzATZhc@V>+uV_9(r>7w(kwM5_#$ZJRVE;4PW`tO`lEYo;Y^w*%w}W z{ROH+JP6VxU1wm$Gj%U*yRo`}=Q1tIeab7KT7r^ll|kwnBUH*`Y`lh0xxWFFUP+|F zFxxI7wXi^BBC*K)yxE2km~9o&)MLkXVl@?nQ9Gw@DnHm@)r@hdFDm#SEF6;!&*?N- z({C8eH9OYq3++^a=IH{1rmbmHZKeyg9-?;^Tj^h2)l_0Q!$*n`Kllv!?3rhVMB(tzLuC19GfDr@e5lPm(B{Mky= zyErp^e*>q9qF^d9LaMt2wgEBR|4Uy7A~b1MtXUUYS6Mr(JyyXgr_X8_^BkJqPj)Es z|7?vP|JANat?_G2UpB`4+o^l|=`Z&U+Zd#(Y8TIJ6S}l;2r78|pv_ewYc^_Hrds-h zQmO>d=_WZjlUa%n%&d}=Wja_^C1r=I$l%D^2SNar=^zcwVPMjlQzbdPaCqqb=>r}B zGjuQmKpzD^+2=DSs0_l*3;~VISZw2Dge5>2J{@5UOEISCf?fB#z>&i*d@(E>{`?C5 z^3P`SJ)idg{SMRp#{gRtWG7L5=F>K6hP8`hr%%!*R4ggZn3`fSJ55aWUW!+mfMog) zq&5SSOxZ$~Q*jI$DVu;`0-_06Ou*p6$;t-zGTR2*-L^+;ZA?nWb632Tvj_2%%*zCN-9U(`Mj0nCjsUV(*DCi}HA0+Dz3WAc%h*c;ilU8(z z(AbDlw}|4(q+Lp8=Tt~NSrer_PNFOD-U>uiq7jbhrc$=%>BIr%7P;Rsh;P_OMW??} z)T3Bvpxt{aW6|pA>NC~mZce-OsSc;pY1)bGBX9S)tL%d#uO+SJRb2MCDvr;{sAjkT zT%FE4cx_2*m91xCl`R>svSml%I?kBb_&SpjN<AgBArwAhI>9V5}@Ollx+Ix%vpPU0NIw+xg8&A~sq>9DCH z1iO0aN;0y(Ki7!<96s~L8^dRAS$)l> z4Od^cZvC}W=ImK~#UoFA>+*-WNa39u?|bu|`_|o2Sp3|zPmLgqkKX(fykx^wSFT*M z>#8qC=I^P0sOMXcJwhd_%_Dyi4hgTKJp3?|w!;x`#79=;;|pXDc5}J8D9arnc_@>u ztf5;7ic2vT1DOsEki&v;JU=gYjHs2H*5A1)`<=ZZR|C#ZwER_!j-5!YBpAnvz=Mwc*q80Ak@-p5Zkj4|bxJ?p$UN=vj9bMc!viauW zSMK}W@ZN!byzuvXF}^kaWY+2f?N>juBWv<5Om4aC)Y+uwaXfUqv+EGP;CHX%u7UM~ z|54h}GymMH>aX4V-0&wo&6U`t+i>|I;OTZ0#N+k-R9ak{ykxFA*L%KtzL&S!GU<#@ zAgJ%I;2why>ASwWM>lYF$K@k{9d=_0sjN^mkeL-kcmJoIDTlQ%hW~Kz8&~qeyY~O> zHVt2OPYI=4c1`hmfx5LReFd-SpTfjz+Ku}hHnv@Z!$G%e2!8!`4P|Tr5Xs7N0h}_= zlEPc(x82(K(eR7I*W!zxy0>ZGgsXz5?iTl zmF+tDI?Ep0QQIk-RkJO$f!JV`iNSs?*k)yu6E!u4gIca)v1qd31tk$kqecWTA%X?6 z`an~VY-y2k3z3=RRZz81#y#>L8SXJo+DWpYY9+xplf8rx8sgG~g#sxRRtbBAqrxdc z5C+M${nk~F1QQ|3WvJbR9znW4Jg5NS(8*v8^E@;5Kc(BB>bsnJN9XkVkQ0Q$|Ln84 zF}=uMAc`NEyk>510mPof+$<6MHXO5zHKi{$Nt4C&l_#=n3i8Iv6HJ}V;6iGLe)em8 z>G)XoIDEtNL(hOT|J$C93oqmgKbr}7cPB!klde7C^jR{w$ZGU20BIdZXE@L3gG_eV zU5t!_Q0rn^*+q1nduh7&tIW-6L z7XxGLuFU7)=u!2RSB}!TZ>l%ZCP1bgHYTx2Es>o$cIMex&}9`$!UG|nWnTEHe{IAE=R-(=n#?l?Y3)dKZB;U&9TjKa)o@J zz1XpgJD=ZfztFMEE?bEpSJ@{y>d9PghLn`&+ow5{JIP(#?b7Y?BizH1=q5n2O9kQ; z1R{fkSt`f?%C<$$MRY|ik?CjFLA`c3RN7Cg+&ymMK1?2gfj*&6&|pAJ*l)8a=9bCE zzQ{>SgQ6vEms_#*FjU)ttq>Q6inY(le4W$xDLtc;gM$r7b9Sg$9V870H5f|F1Asiz z@1klo9Y&{{s)J0WW@`}OE}V9IqKV>lb;=Wf{=(|XlVjIsO(;dF&4icz2vpL~0b^fB zWaM>YP}$&FLHe}19aLn8LLVA>(rX8@svN~xOjkNkS>-6JWZ?dB5IWBE)uPKv*|fT@ zNZYN{>f(@XGI1K)4%44LOPZw*!Yo&g3xh&^C(gy^m-<7X|6t+BaKn?s%V0GA{g&Aa zzr%e2`t{F0pU5BoT%+Ip0-5bC;Wgwy5xj))4q`x#!$R<_>eG%pK-FG&jULZElG5nJ(i=;hqef;WT->(_}x+ zl#J($Q`VlEFEE5XPXpcSI5m<&(KVyHEa^hu0@F5T2Bc3SG&OCF?4$nWWdm(i3m0PY z7RRN{3!tnrp3bW>Ijd6N550nb5RTU1Yw@I?$J}+?Z2}(C%I(a(v2x5seW~!9+OpvLG z$5JBj&~xf@3CdP0-1^dQcAgvFnXxu}l!$%9D`%{uA0kIsNPlRj(|+9Qq8DbocK zDNRe1y2eg+(lzaD(s_^OehN=SPJA20oZRQwj}PO?lp`jssrjZou|a(6K2!fYeUeUd zCQ`azb^0_Xh}ccQq)+UU$0r2C8$6{44p>TsQY&@G;S6`2Mz++`Scw!#+7OD`Jr0N6 z&ifRm0Q!8+)Fi0W%_Ku7KdJz-)eLlB-;(rY@ zZaD9Tf=6#6Zwwu*zv`BwSnj^@^v{NHkGlK%=N`DbufE1l{`2wS?JI`Q{OW~U`i>(3 z?HGAU+zYy$6$MZP<)d;uSzjT(C$uL_Hpt;fWRTpQbOuA-U@#Pn_?)5egoOJkvKLu! z3$l^DNh=o)g*Y4u2J;GNcnreFlf8X;*635@Zj`_XO(1voXFonsr1w6!cS4dDI%v05 zoVT1cJ!|)q>~m^ECsTe~Cw1SQD#I=XZ9bti2+G$YTwa)&h@o^3IIJ? z`ts-)o(mzSs~%HW@Nk*TQDxoLA^8aj-lZnNL;Y{$K~@7{m# znydHWs_Bi(r_F$a%f9uCKjL@qy#pTXf(KJ*U|r*Ke))I*@YAOczxX`+-?CQSz zrmoMrM9ZiD!Z+Rfd-~u7{9N~UZs?{Ds6NmP8kt{s7)HtUtVbQs*)b3QMCL7=9Z?cc zN-%G+*}FK7&;e9WR+4tmyu(hp%ko!L4@_ny;cDR0jxWbN4mpgW!ghD4o`3q}0`&}? z=c95fReb1vENn~w=0^rBw3T#yhhcSjjj;koM4Tw)Ome#`o4Nfr44<4k$$5zT)<3S} zKYQYa+lJl4pAY{23H%{`;U2`XHFO{7`;?&~{I))$!-MWu$V4@MW==!Sx|}Y{RTi-| zyiMq^bXl(yuC$8zehU}OFUs_1(2oedpZ3j&_rE$xoeVZuEFO1eQBh$b(!GvinVBvm z2gfkFU>f}irmPl9LohCyzWnbc^Vl>I+h;*z{E>E@-So0m#g zZODt;qBLC_(|c{qeTk-J3l~Ef4Mvb@^25xOuABM4Sd8&yB{%Uk?n~@@hq{8BzN5#N z*JH3v&e;NG%p82#jBf-qlp?F z3g1rRkNmuA-TJF&l@!uYnSBlFK;0QV=&Fo8=x*T$-1qH=xB>eM_E*q}jDKXf9PSKPMg~_T7PyL{ zT5OiR!F!&sA+$l*lyR~9diUMjU5>k>kKhN%Bd*^#Jjjc}s#gv3bV8=Dpo$sKw1O(t zi7+4WWZJk$CT~&W&T~*)!x)ES0khLbH<(QcL4mj?V>xB$k{PDRq0E%jW6C^d=mLk6 zjIpyNVnFYjsK5i1uTx)R$2(Qk#z&aw1N6beL?0Vxehwymja|Bp$yj7Zd|o%DZv4PA zXAM95?#bcbe&UWzEP|D1Zup1M9D(LYM!gcBCn9@61qPrMfLk-!}oJ5 zr9_}dn~uKJ>r>!ma|vF}G4m^ha2z^z>=@U0?AR9%A3Fvz(jSLg`Q5{Rg&Yfw)w(rw zWgiOh(`%W3gSo0NvJcVJXbW&a&0_qc!>!-?7L>UY-_K9sMONkwERB3Y#Jprdc^uB; zh?K|kVjd9Pz2s#=$kPG}TX0CG959tU)PVY|Rq(k^@- zC0(8h6bg0Rpd;D*(?cgHS!e=cK>e+Cmuq%4KXwpFM(L)BP62cdpWyR)RfMtPR0Y+V zR0PUap`XgsV`Z-Ll4EdC0m!AFjO}y+@%(a8np7D8G66W3PaSwG% zAfUxm7a>}V3UIGc*OroFsD$l=#I`wlt}NxT$TGCK-Rv_}r;`?^im`vNY36 z!)V%lkhD29#dcF=emh^68#R5<{Ag~^=_{P43RA@+!qegr=>_@4s5HmcXj|ggWLxXF z$bFILI`>oVcf;>SPK9kxTMv3jrlQKC_);|NjYh+AG|XWlhohW56O`}=`|DlUY<&fA zT|Kg9%#N9vIc8>N#+aFX&CI@LX2;CT5HoYkF*7qW$Gpz}=FQC3?yXX()ly3>U8(Dw zQlGCONM3+i@}jT{vEg#qq}4RWu0tFHE?$8%=j5KK2_BDCft9*v%!iN}g*Yo;WN^h54V6tE?cyHYZu(dF2d#nkWaduXMwL(B9$ z7@V?`3@2$}8Qi$IqzzW*$WnEvSwhGei|^z)qUx>mp@&a(J4rv_D77de6qw0)+I0PX z$>@Ji5ZrjYc>fdMPXE5Z_b2Y~hkmE0*+c&%?@yB3a7xRHMZC_lR<}i)=Lf!aK8Eh= zZPYOWuajP@49X)f2A! zse?HkqP3n&41!&OM2O%a)Tc!cqdW^^2Xj?>96k`I<7U-X0F^E!6|Q<)VX;73Gx9NM zA}SUr+^r^Px-=KqJau`+{iH)5$eYx;0D_YyVb)!;NuyTvpp#c%2Svsa@>^`&hG=Wq&&*x zibHS$en6k-rg>d*bFYd&h0PJJBk#OlRBW+m#nPEKR+fJ?wS5_wF+~>34y-nK=P_Pm zk{TCYWOEbr&&M*7+RFqKHMxmHI=5)x1A?^vzkW;bfEOO>^I!d=$0@?u{J@k z=huL6vcu@j?sD$UZgTEry!gCAG((;3noQ;Ij=Q5B|DLPyyM3-P((}4R(xI z-r3^Vg5QBWT_sUiERC!Khqw9k;xQ_qfn^;yQT=?$49AE$N0$@fiZ)=--889>NF{~V zhLWNJD51ehKque_lBG5*(MEov%;;_hJyM>lRmh2~<$F4^WH2t}G#FT)y-m8_n6%ij zAblu6?)=ySY2Qtw=M_K1)-gGmn*0c<$5@bS|040h>Ktc%aDX`3v6oQI_h*FRIkZcz zQH%8kQyGF8zN7{zKU>M}(ZeN&VqDt=%Kn=z!y}nQ%X!$jyA0zm)s{zO4?@HpiAS)Z z%Wf)3a~*}#Te@c*8Ps~ZsYxZ#XXJAbpR9=3lZ)63Y&{H=_lGo0la7Hkfnmpfy&LR; zIhu!%Y`FN?qFBB?{9}AX4^7Wyk?iE`hd9b2N%w~$gNo}F{YC>nxRGNa zc8IC2X8%V(Hq7@zeY3mR({THD&(mSF@Kkbr3*s>7w%9_lNF^QS&n8~-oEsF{enD<} z{Kq);LUrD~Qs+4l&muiU4?)i!5!)o&`#3wP&6_xcvVIY*Jq!j-S_bx&89=?`@Cz8C z4POR6&OFF?_&%W|Yc84yD(d&>+I~%&K#cKbs0ql z6pX@eBPr$ffaajDlv6<}lXRK;`mOG0!hX9>;)B-&wHWAmUoDuw8K0-QNl_fge72=d zOKW7cGL)Jvj9yDmh-|^v)FsDMSV@{!ahxS{0gcKETqu{78>^x!t`n(ER;g9W*4b-T zwS3Q?p{2Q5rlw5%^dvS_102gVN!N_4XIuhKjSRyELU4m|{w=+`DmbI3OWbBGej|%t1+6)p! zqR3(s?zC^UXMrZnE60S3L@(_m0-uu0lkgQWJ_y<}3^*Pv`9@qsF+6JxH|?vtRai&y zwvhLubx28Nk4rO&UBOmQUeA?)vTYZkWL@glXl3|)OUD=af$Z!1(mBWyDUTng4#{d< ztt8!*1W75;PUKq-eYeTpF@!nngUHw$UbJ?#IuUA zZF2pqCo0(lU^u89IA^<{$D_jyrQs%~U7k8xhjUbBGVz=b!{_AvDFh!28P~qy0V4lo z0lJWmb0~jCcR(&5Z3ld%9K(fCT2noWfvT7yQ%~|zwns?cPv6Z(*9n<$qI1f@{C=5u z>5QTt2eV7fgKKHo8quE@R3lvaa~#QR>EJmTTE_bDWdX*@Cc}GOxcS^DN9AhT!<=I{ zSibMzvAcnq7c>HLQq6ZPS5U)-J#u~9d8LD(8JC+M>kdBV`y<$a#hs;7`w?5~8l^UC z+m!Y!rY97H=ENODC%^ubO}z%QkL{Or`i$AKGWs|Z9otAbglF&)nMPtzF_f0v6KAbE zJ`Sm=bJx~5JOuDQ%PNQ*SeQKc34YE5$(}=kDXMP>!I0PYF9g$}j-0H%RCsteFrgs< zuqRq(-fu>B#ydT)&S$>eD;f0H)xe3M8HHRFP9a&xA})g#^tRthIoK0{=3>Vupto&| z#Xs;15T9+Nh@}?s3=hJlmV>&)EhEUz*_&yn==*G-@$#bLeQoyD5$Jil zs!#Kth1VLZoa~0`aDN}xch9j;)La&j)V{`W+QHHb=fe9oEW1*>eu2(RD(qUkSZ!jI zSW=8#2ZynP@u+VkCtW36&Uul|G6t*pTadY=)MnHaoK34&cvHAG zO;r*{+oI+AP1Di*4cqkM{^BcrxD7 z!ZWI|J{Gm)TSf~!HUfTckF@v~epSDmFIG=Q}RwcZyuh}(OhRE}JBW@Gc&P~w){mKtAM4g{l&j3M~68Vwaw07 zwP!@Ab+hX{qV6WGu_l=aOH~|(vrb3?8 zX*{leK~1&7xnJsYfWm0>Bsku2gBvYdlaFc2)ZBrP&dI9a=O;P5e{OL;y^&K#Q(zaN zg#|Id!wBRPeY*Q@V%kN}WGoB^pf;_gpYyNn))3HrO6XsXYq?zWb zQZs&C<0J!w(lRb3b&n@{)rFJ<9+P?O6jky7Is~bYOr)$nJQ=Nr)3u6bdmvW`!jG)IkzSAE>;C+PxL)RG7p&D@D@R5(hmoBOa z6p2rNcX!xdz^F5l{nxu9OI#KQWk#vi@75k^OIXkmtC<(hQit-xedzWL~ z11RhI=eZ{pL<1Mpu)06vz^cTGHPA?CqzNc`s-cSsMJUIGL8tTpAu*=n>P_R)eR+N` z7kF`|Qb@6Jx5&e|cVNrE*~nLcIbfs`Gqt1ByPW$-OHdh3$D|S*%Jltzq=HVBcyK@p z5$akC;#AHj@^QzfZReZQl|!lQNqW0FN)V>$E-U8Utja?-Oj*oBBv7ahLe__u0tlQh z--0>mXT!gB-kYo>+duvmT8U`*=3>566)me$vf*m?$ORz9N_j*SFQ=^&aKu<=D`8L^ z=z`7vQxS$4^V8RvhWjLGuExLwOm=xw+^uloIJDF^ARhQT<2=iM0Pnd7jaH6&@&-K) zsy!Kg(a9dC(z4V{ zCWV)`hX1l!IY%aOI9bZeOe zstkUn@eA!bzt2c=!ESvg0|;T=a^=dMcG1Y2H^gxy#ws#m-5+ljVGRB$NJ&xkd7^<% zT>W0`Rd=K>BB{NBWQP^D-gJCJN!ZfhoxNytj?-agdI=QrWHv-6*vOC_J}=WR8VLVX_L z(=`6ftyXY~aw3Yjy#wg@Uxc7wJ(6>nS~FQ+%eJ2!p4xGvVxhkys^(NLbjMlSt|Bjo zf)8pQ!>Fs-h>OEFGpZ*u45?nU6KwwZyp6A#X>Im-9<+%wdAFw_Fd#Q%pEvOO_ za4E;eojJF@k};mM37E0f)ZL1&#a5FJ!)91nOA&U`TjgaQLE+mX4O`z_2PAQ*ex|0N zk%fthKa205I9W$>A!dDIc`th?EY~{N$#JTU-tYF5sq_;bnRByv3kdh2euolW-g8_? z*0ikvYo`=T8Cn?0FzyJZ(@I&^RF0mU#4`<1X>V=L9|y0b*doAtQt9T=*)D$hW_GCF za^xcp47SwC8l0E28N_yY^FjQ_umfB4e6H|54EoSiUzpVxS?d``9!D?7*0nRD zr_tx~L@TK)-?k{>*TJNpTq=Z5ZMyvM`oE{bbD73VPMvi1|@c~ zpT{~1niZ?<71ocI$vd=`D8_^|wJDF#eo-N(jYzl(1#pI$~H8EbzC2G zbdz4#NQWl8^mUYF!i*m&q&uRE`B?^m2E_N%?K_&1Na66ODqd8d>AHfez++^jo~H}2 zcgBOXBuBGtzr#V(=_Bm2`}qOF&D*Z!JEzV^eb!?~c6>^^!RnP7?{+yZg?3S%jgH6u zgeGn^h_yM75t9Hk)XLb;&cZRzqWjf_OHBn$Ln7nnr>HdPz?u9r_4h(awE<$K59l&2 zGzciWH-BN9Y%XE8Ngax6zg|-5`3~k~ZZWEDD|g{XlI~4Fn*x^Wgyq3>5dwTP69(z} z&v5Q$aRjX-CR=p!;~4ZZy2cpn49he|`sW-+QSrM=e}O|x z;@wzF=o!~q3_;jPg^w-jEWVB}ava7**{Qy;qR=QfQ!uZfZED_d=R56F^nNu#r#i|I z^LAL+B(ZrF+n-?ea4`U+Y}in!E$r8vX;S;5YjYTe+?VaH!~u~~$c^?Of-j-OXE-fp zz4xx}kBmLA+nRJbS#cj=_MI3TnA^+7_Pp>{ok(tF4jo`a*3e!^Ff38r(gs)rZfNrqJk-o)oFt~rnhlt%k1w+yUS%>&XmUN?d(1{<>-m-Yc})uhd`EJv_J4<4 zk|u(~`kF2bj4CD1RoO^D}56 zArwwSyeQMC2csb)!>EUd$8j=^GyJ?d2b(ds@Pz{s?se|17{rNc^-TioAbx8bPD7AA z*1CrzfmaVKc?w+Nm!B!x-ES5H*z(&-HiLFi-dN$$)WaiJ?rlQG)TTHb{$Ydo;O-uS z@Zj!IgS1{>v!4(!>Dcd~AR@SCEpS*XjHE_AQz6*FkZ?Aswab2a@GP!aj17i^>|&jnZ<{l5{@Tdu--3>GA_!#B$h?P(VQPu&ZKZwRhod*T ziiRVQU~*VWKy@g-go+T8ffOZUJWLf9kDB+1xW7 z?V68(!Hj>w4N`n)25o1`G}!+`YYtKXo-W|${S}bo#K?`#-o}4vb-N>Z0Q?+uJfwXd zX(hl_P?Ar^2X@cufCW)`^DDqE(3w@T8GpuF%<79Cm^~ElsqB71k+goqC`d%f1+@|r zjR;HO6o>=ca5MHz9-vYvBdX=FXB`r{NTFE>yIt8O|9oonWcnd`Uvp?hSY&n!$i|zO zH(p6TxS*s^vR+y?=(r52u=w+Nrrjm(0l~fbN3eCEhLz?R0Lk`Y2#*TYCQI#M17o2{ zW%-4URvdN(&ST~i&we6ZiG-zku&mTx# zT9W6p51PXp@7g{{W#2cuuIJqgG-c9H%`; zPzxMKs>t9gu&XlLXS{wJYgx7F$crtUs0pf+na|^N5#V<1TH(e&1JZTWLtaEiJBR|3 zvh5tGa~Ku{FKh8DvlbXfZ(MAe`bz;c1za{!ZK>a{#%vTe0mh0TzZmdXlDqj`I^jM_ zY%=7($-bVMH1z)BK<)3YhBUj-r(2w3#mi-zKAjoAVHuLAETHGXes2(=u`xtze8ROV z-_^Uts+{>|-0rYoRn(s-?uM0^p1g1-$AXXZ<0kL}M#3egY2YYrdTtzf#^qFvc$6}eYF?aYTKLn0 zH0b!v#7GYI2jvPJkUL`i1HFc$_9o+r@4Pj*EPgg=F!t_!p*DA5*ov=zpH93Rv!2@x z$6KR>FOiwG{$cTD`Ij+%4L2N2^`YRC--KIpA!8AC^eB&hvH1t$omhEry5{;Se75mS zY$L4+ZbLM`xVT5|V2f6UKMRBzc6X~C^1iV#8NtzcUjw_=Sc~i`7WeHu_dDh>)5+@S z28*#Tp9{@9iVMr?`tXr+pOfq#KSM|`&%twdnELVr#n6o?!Mu~*B z5tP-?_($lQg(Da>ogI@_F?kiZ)pFVa*9tu@@nAaZ#`K&1lyTNgjVT)=*G3}K_YQ1j zYjd>2(|bhScb3-Q7B8up)(z1!fYGJqHms_t7t2Pa%g?~rj@URo>48BsL^BBFm)}bKy&~#;#9K71`@TUt`q2T4`q8&(IsVq<)>eZ=0({ znaUi(b(!CtegH6LPx0sPXFzpNYt7fOr;bartN>@X+mNK?XLBGFQWz1G5bY)m*mQqu z)l68hXsvpj**2(oD#)2P=2c0r8bJ2kZl@+$wu_xrrkE;eSsJfi@IH96ChK);?ebhQJCdKq)KYxg}z@YAtBJ0e#Mr8x1$8XDn8s*YK9a0U~zU_YD`an!0z7VuY*c>){k zX2*<-8XxqdkonMWpOgzqx>x8M=B+d{rX1Y&F}POsf`(LoKbe+ZLRgT&G~_co&+SIhvbX zqHE5rZEUsY>VVqXP9@7YDjKJtaCJ9bMQ$9*J5N(FLxBUjCoc8*SSkW*yXk7y4qYKn{r*oLmrwA zs*P+6o!rb%(-+Ka99XQP=xv1O_v*fTG*;W-i^&}L~)Grv1+6dmn{aKers0lG%NmO7FsLkob=tJq zXE%ia+z(+l{5Aq{fo3 zd9*khT^lNGYzQ_tTDyWak_3Mz4MKklx-hkv7K0W4@$^jm<|1;vC?4g(I#|(=#?d5_ zWii`eZ3hT698LE+%Po=PGFw_bhXouu*BXM~hfrAfH!rxci;Pv$EiAb7AwiyL*5|c4 z@y(?*F*TsyQFT-|)`aA>2eV7Fkn&JuzfD>R!OpGC&m)kA?hLIwu&uI-#Il~w2VELLmJRm$Ko?~O95vR&>IbBV;Xx{qw&y2YHxP=PXZ!jR2rb{@=xsBZvVZ3K93 zDLWaE3Fph4u%+k4&t5nmtgZl@4#qWSG%Ck4>rFu9oG8e&D(EV88%!qd zif%120kA3bS{mIg2z5CiBlM~D1_va=MYh280PoGo!}-gegw-elEtWvVw4 zwXWlPSX|8UG&Zkr_IBV#6gPCH8Wed&7JH5SBn&m1kKTFa)4)p9%2Q+g$&&Vc+$agg zIMupG{iz1ho;vKuY|8I4eZdN*PGE0>n7uY!qfP_a{fUPY#v-~^W8?vCF+8)A5+9jD z2I@wsd3cW(?8)7C3l%G4Pw@Pym!im1@iFFtYFC27#?-D%0uNqj!E@O(OEb$g%Ldd{ zA-ZK~%W){#BIX=A_Qc#qSqIIr_3`sv;4eP-A>s?h$3GuqDta(H?|kR?mw=iNuUWm1 z?7Qd3!o_aN&Ue1!`;Sg3hOGWKubtD698`VJ%Qvr^)6F0HAK9c;uDFpm; z#wK?r1Dxhl@tOqNHWNodIql5b{NzzNw)DIOLb0OX58S#4*cXY2SQ8W;?_W+fyU5iS zwOWmyNtda>23o+?gUYwH<|xg6LAD0GyE8tFs^}1NBS3A#yr5v$isI?T!AfYiV+*q(C@&7 zr_k>Z!6)VD-=#g4cjn)9x?JRItc~4nvtXyrTD$swi*tYa>U4h^#pT)X&9mVvy64p& zz%yI7Mt9rosOOPtZ3=$Xy%VsM?7sEVkA-5Am~xORG5!I?16v$ z8rmtS-w(7lz5wr{zWo#HomrS)+!l?LF#g9gs$<>eHub8u7s3;&CrV7o_SSID)}zFY zgfkbH{3_lAoBdhvE`U=nWY?He)DaJO*>h=g!|s^StoRj=&Au|onBj94*GzaQ9G0}=)H#J)RQQ(C)?J54wcnA4zz|G z8S}XY)M^Plk$ZqZ3=Xwp*|f;(6ujUKR$|;)ap$5~7IA2%r6Q355}d zsalzmqZFXP=Z?Pd@6-BiHK?!RQjYvNck89&8?b9bC-RKYcL5W;L+d_*@jLpq(S-lW zsac0c;u}b*0T0XGxtIA8FiX_>XkZJhtOKGhSZ0|(HOwGb6yZ-v^B^g>P7yvQmYBZC z>nkZm*^cE<(MH_k4e}{$XN$EQf~?I3c+vOssc&Ult~r5RNNr_PU5xzVlUj2ER|qLS z>K*ZCYE~T~y72h=$m{RbX0L$vxVN3HvsSP@x<@o}lA$s|?{YSyF9U_IGs%rx8vDaU zDAEjMVz!7)q5sL0Q+!Dmg#@tdxu;0cY4(UYfAqLplGxaP<$pWHO zCq5}mGARry&$-xBixN{{?+rHujYslpA|zn*_k{dE>o_FMNgw)mQ>kUfZWEQRQ|L{<7;ya0Jsx93p^qMxq3T_U$ScyB6u7Cf)NXFB6-ny>YfcG z2w@9nM<5!t;4Ns(iA;~wQtBBg)%ZcVJr2+pq=41R6x17K151siAffsZ|Z7OKx%@(FBu_Isb%)(Z(`OJ1`L*7PQ`(DM|`-7pc=| z)77Gwm-$i1T&6LaV5A&^7T-~)t!Db{fGd`4s&rsVLb@!2Nl1BA$5~T46FEG~GHH-B z#WJn_icE{@jBs*q?=-SDFnhJOQD8N-Hm`M=Hoz6A!R6*r6UPGo*mjuTDpPzfFaH}q zQ5@r5jpE=z8g^2@32`?Ahqxg{hbQba7;T_?5Tq{tv5P{Wt3#Y8bl5$*a3lL%a42 z>79pPm17s_UBMHe;~K_;`_XBO41YM0J-x)~hQ#sHU9$h<>-86x_a6g4{AFg{C4aEo zyStrU-)#AWrN}TKO&SS#(CTFm^zB@y4z4aHX>%Cs+tNp(e!-6(IEJw}cF-FQH!{I%1ucbVtlIccVpuN0PmZK`CCC8n83g-}lgU!Wu%MYULzuQTMhb7hfPN-zXm zi!v5KaOkQFJmPq3l$9Z~|Ck$OqdC!XJW<=9YwW2le|$d24d~>nV6)jw7k?H!-QTHD zt63JT8K>)v=AvWqT-^IT^&qEv%@(UZHKgKXb|yk|l1#hWOtQ>eU}x!QsVjdQHTbRx zOG7=h=b}qp6A`TcV@Wt&17h4tZGVxsx-iy!x`P^^m&975Ir8bY^GnfZyUvF>eSy;_ z7<^Ju7A#%v3)gHxn&yPPt?X6P#Hd`r#;c2$Afn_-Lm4)c!vx}_dE>J zE5ECBRad4N-~R`BHy)<9Iuk%O-C1RY3$xHTG4;{Dg&5G*JPo-x8D4Go9BA&+IdXul zyAC~mPN&7&+Ir`<=TYeLR>dm$L?T_9Gt2zVPA0(eJlkZvNz%;qFTJv08@U8o&~;O>7Zm5 zC2V1tx2+jFZW?2KP}LVz@0dA*>|O$wCf>5vHksCH;#Y)eBZ4i8Iw+2E6ix6cXG=_= z6}HY;OF|(J!LFp~ZxZ#v%F(D)vWc*?GIolo4+uqs`w$pYTN5W|M^i(azm%PkB@7HJ zGY1hP(O;5Dbv>iRf6ES&5h#85xO~7+D#08Kj&ItpUbD zw&vERM2s*DLQck}w$4OcjBGFre@FRSpkroYf?*Ibw3jpmm|Hl13bJs)FsL}2+Ncq6 ze#-nEKpbFg%1p${%>JpZG7LZee@%evKNFBOwKaFPAYx-UyI_NsXI3wlfj4vvBjs*>)3|nU&FAA{VgIfCp=NicTSej&+i8b8#r>^@M?-v z?5ecx?<0e=u|r(@+GV>(9}e`*K`W;)72wIUYgF^8kF^mn>acn;bI)c`_IUK2BgJz# z!sC3~A!EmMGp9OIOwBvza=rLEUZ85_lnFQ*QDcldR4s6*Aiy5_^lVQUqJNF@@{OT> zpV@8~P<`7<&^4E$u~dHO!?Sr&JapT!w;2>Wgyd9fB_Zu(vujhD!MX6pWfobda}c?1 zn>Nt(cBu!gOxK?8x$>4W`G$5PEO+W3OSA|q}GuIsrZ}vOPy^p8w6rn=5 zQEWDF;Bx=?ajBq0pLX`LisCI|5efUmY?FZ0qGGE_X{ze=B8U5|o$ zhM~0JO6GV<8{KT~`!j^k)ZKee*`3#!`s_>WA@y6YYuTfcZuJT*O;<&2z3r81s}HE5YiB7s>BG&Xj2&S=rCc#hfBmL}0OtIkQAy+3B!QIJ`_+->-Jynp!q zw(q*l-scN1bLq<8Q)NBUa>tFhyoM<Zeu~sBTpJT?_ zt2>%cCgW@+ELJc(`QE^~#afwysykDYA0J%q-&fSHK?=Jg*nR#lMK9Q{XX# zCCD$}Mp4ucSk_Z=Wzshfoyy2dW$mcX%z$C1^;Vu`t|{sPg$$?Xb^u2o>b`x*iG6*f zRKbY(XhBAlsKhJyJW^v8vi#siMV7?x98th1U}Sx5fcR$+bzGmAPIu~ZG2Umm7E=Kn z5jP?zOK~?No>4*i2DEu2f|H;rxj!3A=(UJb5Jz4|y-TxyR+fwvfi#}zJ_w|L5D5xU z8n8|n#B`6qF8Jnf+M$l8*i8iMl}KIl5biL%k34~d>oLH9Zrm3CUJIyc zJv4uGu7GTzNe~-gsC@3@PcX_|2zT->_>UwkDN2v5_7tAsw~(RNSicRB#ILM4f`|no zKXZJ;^@czj^n-A(idvvHgD;0DC4;<0`FCAjU0zdOQ<0*w!+_Y@crR!kafo!H>Ung6 ztD#fS++pwdo#F2h?;#ULG}+;cJ5cuEIX#5PX@x&LXJjtO5Pwj%46NC#!M-{J>3y+3 zWZv<&#SK&Dh{Yz)BY^_XqIc@GCC1&L8%!cELf^sAIw4zj4DWb7!L)pFJ0ssEpP*K9 zqEmKda#MgE_?s~~JvCeU+lYqAVLme>*2)l_4{`jtvyFQ%d#*=sE`RVyFXP-s^oL6_ zdy1S`THx2fbb@gAV;p=Bs=VVEwn}d9Umf`&X;f%`qoxN*1P=vc2D2EYEq!~4xRhCx zUOaubp>;bG$fs&!#|e-5a(UwSqZ(BD^$Q=gw=dGd)}i3EZzyt(U``M9AA6jM0Ed(v z9Gy_iZP@F97Fhkr=IzUEzCU`eL_id?FHS@#QGBA*lBmZ-x_h2=(QC2@eTUE<(H&wj zKV}&nIWV_`*S=RLYftF@stVH~d2F5iX=w|D5g67V*c=z= zBi!>Pr$wU=oeb=|?Ni!T@8jCeloZWLCBcYDiHMExO%w%$%n_Z(0ZHHF79&;c>7#Vg zsOZ8lAGXkLupF+muK>f61H5%TzeRo`$o-^w4;gKxs*Fra?qACMHAblfxI zG{LbzzSomP%YEOZ6pkle;k4}ytq0_!7?c#YrufA! z5)e@!Vgn4=jj|rY(EoPi;Eglcr@o8Q0r3{n(n8_QM;*y0=}x<=jJ;mlt*|wJ> zBcu}njO7n|_v5(Ugm_|&xClajV|oUAM}FqPFe3DK-W9}g@k?y|`sWQ&v`7#4te);C zVJDH$LU>I<;P(Pa@*TW)YG+6ve}1HxFB0PrQl8W+;~#z>DwSl(h&*tv*q&$)>sqXc zuD`u{$R~x;i|IqMs-ZNM;o93k=p?d^EaNV&8wty*&`MR`$VI9s-k+jZJyISy5;hB#S= zdU@hn!ZjC^*NFlK#25#xGZv^$bt9~lfpORPt-KgO)bx|a&3;wp!F+=_uo+|-`Epkx zEaMh1#|>lr%=gTq$TK*Y1m&0q!w}fSFM^pbe`E-0*#l(&fsm&hSE;(z4bsW-6McN( z_)neG-C({ zJ3Q+TaoQ9qb*c25M5baQV*5AKX6-^Q|%&^EX_WiR0O--1R1&?poJ# z`F#Pe9g4Q{u4;@dq;c8Be@Y6A$zDDk#m9~%>sBi<>PIZ5#<-=>++z$9)$vOK>Lk4n z(1dWmb8-}B{Sk(bQsbrxl!z+K9J9h^Cd$A4uqsz{x>vU>*OGJTplG5tEu|GuC_|u% z*H?o`RO;}Sg6-i@htNtI20$_xUD-lre36#{120;sZ;}q*axLOkb{bg8nm<>aS_28} zVpd!(nw%7Yx`X@z|3z%ge*!k3|8wICXy~#R5BmMVz<%2T~Ypc^CJGrB?)Yz{X)@N&* zVD>L5CJPOhmHyRspd<@y-==U|^BTzm?EL7_xly@kY=FA{mg%#=GL(2QCon5Fy%hwR z-BoO%=!}^VAO3s$Gw>T#8lDVoP(b|6o}iV4>L>`*%5n?fR|WOP2>Fu-R3&@#PpIF? zoCd6N;BA9rSij0uN~;|*>r!Jrfra6amDIj5CM19P4WRIG9v9_N9}lv;T8sdpnfXdH zgC9?`>ZWBr?Hxgg%v=RxdRPL@No4>RfNsx;)IMrtIGCq=NSrUDl=;y3}iX!@&aCG@HwQIpdI47#e^q>+9} zI=Du0Ngg_`bSek>B64k1^4+6zkgdJI-`e)#&b`;Z7!@>Sp68X&u5Ukf=&L%azbQ7G zctk39*7M1)wjD@)tMWc@*Tjn;Q*E*zAw!5aiAe%g(c{%iqtJ>%=0|-Gk1FFK#bYEN z>yeiGwZgCO)pRmD^G-ZbTA1O-io+vPtKm#Q$3Hq;Ikk6pCUq=Tz;dx?(BU07$HuVP zsv=NU2?;(mk;Mj5WM=*{5i`BCkOVS-v*eM=D@?Gwti7JCF*UsuuR9W-o}p!kVs%Yx zpcZgI0KIiCgHY=3HG7lXuV#PU#L*0gDoee3*hDbwSC`yxP*X~qGNqF)g$g5=%MItv zFY8;4Z*%8Z4C0?&wL9$1 z$7~R&z=WRm9o2lt6oR&jBzKrKjbH(97MBCx8J)xV#yKX z@P;hl=s8LWe6#8qDOVYOKo22*MmiReAY8LJ`vd*!)#9wQ{Eu1i<#z2bwljC<^wuwV zqeJgHg`AihcmXynWNVB0r1GG9Nk-1N#V@uw#8GD0O~g-rl3bU$1Q}74bb)6GfiHA{ z-zq}cr~^&EPVaw{Q#*$&JnW^7|JqB^<5(7MN5AIquAoqo z?W%CDCnZp3;95cwxv#dWe1H?*zpB^>!7G{p(L-2IdO6N~`nYL!p_ct}=cKw^pq@3Z zxg*LksuQgrNy}e|J!nNy8#?qzA4gusagr)cDIqcBdUo0@^S)lwcG~)lOFk0xe(?Rz z_eL6l9NDKE{88kLUZ~~%Ng+-52g5`#FuVHWF$g7AZm|@m-@z`13Y>~!B#VhX#LdRct^C>9wp?7L(RFZ&> zJsFqi1b@TMM96sV;FL;sZ8b+}X-1jYc#B%db9R@fJ6GI`TEkVUG9|jMJp)Uaz5Bwg z2eeF34=9$vURvG=rx4^(P~ljOJx81h7K1fSMK+l#KSfAlQku-7i8dmg)O*hb!a7cw zWC1HHjL^Eo%KS(vk>`-5e88&;z`Gw|l*q#Swy zIZOfoZaqT-2z0E76kq~-HbVCT`|Q{;fcC371lV!@aE}4#T2!m9g!-oD_uH+3Kt!_= zafKo?y0p$FB2P={r>Ka=r)d@Mt0qD=2Hlm8ot<(%<0_K@M3~Wo%QhBi$??vyTg&Qh zuQR-}&cUUZSH7QS6j#g_%7@*t3dj61&%Z}L5<3`>+SRW{3+LNt0cjQUPMFK27t`ye zcuAXNpYhHax&gf8nJAkanuODD0k0W<5-wB=7)w`)^=fvlt!?0J+t?BG922Fx9`-g& z60GG#^z>yQNayosBdc&HlnKCvW$A=*R~XN(FjOy^s+($DUA)}a7GTf-GBB(D7{kYc z{&!IZ#rUXz-H(_q zXP>iaLf+@2DW6z=X^#fz1FPVtg9Oa^f_yo+qq;SAH-lK8*xl+%9!Jv=rCp*2bJ@^w z0XZ**tJY)dwp3#+%M<2x!D>Q#b65kK~BrvnyO~5Ka zO;_sk;8`Koyl?;{GFkLSv__Z+#gmd1QdWai7xHW8{II~>jH|8&=Y%X1<^=0a7=l~2 ze-HjKuv8Ih!iUq^lM1>8XA97Jn9DvQ5KCC;%@E( zN{u@A>QVWR$D#iQEe3OuHw_Uq4I<;lx5ZSz*JFw!pzY&-c~(tHG2zZ^oF>$7c*=U* zc#?CyV_A(z&L$xz57W1>dD`1;9v!{j9~L6Fs?I@DtjDhGR|E$^=@$j+hP0 zaAe`8nl16Le7*cs9C0K72kCK5ta)76p=NTTo93y@rM|y=sC&m}a(bhRJdES#oAQsX za)Uy?Y)Zl(rU;XE64H{NwRUTs>Nq97pIuANfoP_nfuIGhss&yW-jsHZJJajLn?;`i zt4kG$!Y(J;{Jj9h%8kMk96UZzzOG4^>H4EoFUae*VywKtM^oxX{kB6d>U-(!kYUF+ z`l?&b0j*%ipJSM2tfObsB&I`lZ%0e!u#teXYE1@zxo0F!hsomnB$+BpLfbO)B!a0HKiTjSL)nQm+*m971 z5GlkDUm;|V!r>OW;(8<}XuT{fp%>Di9}*fz{)fuyn zZ;#uI?=WUE{+WG9AC*(j)qiZhSdV=t^Q&Ri045_^5AV!B(Io@8Ob)e74ncY&ih(zv zFTwB65RHC1%zoGGUtmRzF3b$?F@=IQAh0hEUOKWsDn(N=Lm5>dB1J=w1jT^&(KW(o z1`&=T_8x$=gxd*Jo)tC1&PsZWVHcS0S?P66@CO02?ohIUe>b~up&N1hkUWO47i9e8htj{)scgO7o z{#dmBeAJCN!8r&k>P{-zK=RP+7YSdwOc%r)1D1Zru0PQ&E| z;2Y2{Ph4PJ?uGdZzb4GyA2^DkPN=7!sCC~cgGSFdeu}vX!rWUZ&GIYk`2iY#&waas zF95$!h@6mPhE!@wc3mcAUKrAxP-4Nmu??@y(9Td`Ja3rLJS?|lc^^z6Psq&B3<*a9f<)UJJ)flR z7~OKu;04-w#;b}qnQz;dgjds-%a_bq*q8Lz^P8gw@`z-7rE4F+@p0kB!5fZ_%OAP{ z5b>CDhQF6{thC;KLW?B(`k7dzHnWn1CN` zpBhj;l!SB~@Ye_kc!p5uf zlonLCeZ=BsuzZ9mHBX6}QFE(+0YoAbT{*=(>wyqnDf|Wc7l*|t$pdzx?cZH+x-XX% zZURmS+eqGrFI>d@t*1BkB1(AgsMS%t(z2A4{C`aR|2pNOe9Y<_MR`{*V@TX2-!N>M zdn>v9{f_*IG+!)P;JEc-l&zdwk#%2m65~F6FZ(hbZUKx$&thxR zM9w6nC`VCeeU;*gXrm~HFvZguPDy=7vN7>5W4?|;Y%bjnn42REDP65c zHjmUdlO||ssRml>ZnGh?+pn}M2l7s33ud&tEO~WYmy*ZFea2xr@-JRGQiBr%uH|8V z{(rK6p6FFAD5asvRPCFJ*9*%J>Ee%!_Zht_ywfbxN?4960mAk0o%Z;T5a9o?V9O`; zYBeUWnX_tKp|cGp7&2%CDo~j&O3|%@vpdU<);;{TR3TjA9*z2?jqsQjpcmyKWak<+ zw5o0(bnTl;xP%L*4dP9Z<&7bl`IBkjWN*=2_3hUaQt*a}J+AF0svh-d+icXk?$@zZ ztJbC=Z!AwEzeJs=Jy_pdrsnGqS_gBjsiA#1baV>i1;F|vlMvr#g6pH=3XuUdz$s;uhyAW0`)xKIw0zLjUSrNf@3_ut zCaQkP9C6l5jM%D%+)i&p=L_{P=cr4&8>rh2>g9_)x}&0oi@sjrQAq4M@35tT%Qt>d zOKVj%udL2n3;l=0w_KVr<8MJ9kP20w0J=g_sE`MbDfgiv z!qX|7KtWn|e5#a4^BR!xXxI!!-P}cV3?6spFB59F1nNNPFmZI}^f)d8$#AW!PQn-$bsAkXePowde4ii=_KAgvaeVj@y&rjFV;yWOwFLgIi6V7t9 znO%F@8Z}f+s-7jH)0Y#T!Lxd#&@E#oGWFP{%%Hd=cB8BzKUE9^2!mYa*@#sW`#lWy z#mmc4=qrUXYEllseWQbRSGB;%S$$P-Gb*b=L2>0+CJJ#hs@bUXqOg_{>)3GZ#6|Z# z{n@gUjai^cRkkH)(#4XLo7&&@*hNTcnrO`mKp2@h7LSWG#4E z8h&M_V;?~Go73Z*mv`0f;87ZrPE#^vvCH$?ygGUMTV|HMZSu`sY%0+m*b6~DXKdp+ zaDU%#pttc)yo@P7r$9+qjbcy4rNV-;Vqn?U;A47oIuwr|E+a0>9jU=AcTGWW?mFS+ z?%y34w0oUh;9ey4E8YG@6CS=;;7Tnc=(%}IqOD6&mQX^f@c*?GmL z0|OaY*JJD{0*n?46m;nR`>h111xl6{#E%h5yeupTvO<)H3KyZdMdnH`#qxU@#U7`3 zV3=;8lPu!_YH&KwTSWlOf3mc%|p(S1JhQ`NO|s`$fu zE@~5+;l0f{$qCK6DRVeccWM>AM5S*aC{vf%caAark zR#4_9y>|MP+p``TlCwm?1+szH*3+kx1lD;f9<;#i!At}Di9>Dnpwk9qQM69I!%my1FrROarlJ?Ehm)tF5EX+{-})N}Ihrmv&pPU> zvx+N`bZK|`BI1%u{paQ?ps$8~JS{EPZk(JR3ve)s5}obo>3dfbw$+kjN(#wJGtpn` zI+tUV8C{j^YVmX6N^8LNR^SJ>J@T}ku7gHYB_BmPS5pX*nMsnr8xEKDeLf%Fa>jaQ zdkR+A?5}Vb#PQlhI^|r0$#LSpdvlIw?sCHW4b1Con%r1?k$vfWbL?W=Vw_@RZceTY z!VrG78B`}$P%$svIS1gGkY5;Q>C8@Kj$(u96s`zD1j@`idUW}h3}?uaFDAX|%R2Wh z|JtvDde`sOF?@C1hY?|mSn+TPgp`6h=ZuW#VWeMdKC5o-uB4KzghPK%Gbx`-$Zckw z-Sw{JbsEvLDAFHm28F%U=;Zc*>?VAxI4xQEB|4oor24mq%jK7kt0-V(_VJUyA~cvR z&W~2k8}7H;cF+kUc;Nwf&fnI5CzSh(1ITo0`A$|5!^~tAQCEs5pS41=P_jPi@0d$3 z8+xkS)6;GWv!9FeuUc6ahDN>h86PBD`OyZf-GptiG>DgLSD{1HP(Wj7T(e)FiIy(>A)}> z2NFAJhjuxtZyUAG>wD-0b9DpgxN=u}>(bUM+C9Y=B8UQ}HZj@ZK1e*s-Y5CX?_$>j zk6oVle1P6hrSbFv$rq7Z(|Eg=TprC{@x{|;j6Mw~|1t8pP%-=fn0qK=nI2mej7hp} zBl-xHfcU?>zmfw6l&Tsv>zq+;RIeZ+%4Rd8P)y?*w#KsT4NQPaAP1OLt|%1yWm+~y zQXI-hu(t)Zkur;*KrXbT9UR{S0#aC`Jv_T1v<{mD|c2=!FDi=r5^@|ZYk2rLBjlI#tUg&RLh8#S3g1%INwD?gspv~p^o2KT54_8b`Q2d=vQ_%vV1sMBf^=S- zht%Oe78nA?Cz!Jn`pB#9h4Z1%wM=JeR?m#h zt}CPpg3*ZGf*?E(N(wX!$2M`eyseCa8eMii`t8?xoc2v42?}vx>d|oZ9b%9*cq066 zan{ZynbKM&>N3S`Zh?;mYp^pVPfQFxglfHpCIV*hMKe}$!$0j^DyWO}T|ztB>QqIJ z?vM_F7EQK7?B%S(!IZWY=bKaZV5-I7wl%$Gub7Pr?ER;UKbsGnfrC;~^ekb}2>%#s z%WB!BP~Kv376?yh=>=f=3o-F3U8YdL6>evd#P1QOX^!Hk%~{h(X-LbR7}QDq`7)_# z{w&S&%pc6tjcy!zJ4n0*VAP8>H}bbDtkZs`hV4cINND>62^Z1$zCyB~v6I$oZ&w3R z=K~V*dvLjc6liih4{lgC8&1kgH_b!3R;DZc1v}NW+ZdcRDeJJMyA*Ait+U3d*!e-U zkg`RJ?J28?lQxBuRYWb1>objaQM657H=o?&y_?O`EnS`(J2@4TDrh?>ZzAm{t9rlz zHGO7`hgj0;CMg?fwv6rCon)XRwkZ5JOsK3%1dQ}B+fsSDu|oXWZ1=+oHsjhwKJ_8R>C`@ zGv18Sv~K>w<;6|(+EjLum2KddB+m7lmrdWLv+hT2U%WKFkYr4d%82Q9ew2vJ@inGO zJ_hhQS^{c(xm~s2(>0rGuG*_fEsGr`(k(4^<2`*p7OQLxK%aQ*N7~$H@Y)(LZ)r>% zwqmY*cOelFwh#u>A>PKxafHiSwY2XNPY_e>`A&S#IgUAwd5#y9NmYxLifJFVCwBJS zBX?5rk-eeE(ImYdUL|CUTINe8ZjIcSyfUdq=?+>vuO++bj=C2|6!0XM*2=(33T33b z{ye@dZk5>x;99-GR4kcgDAv9ia@ajU}+RXd<+W`F_g#J zZl(~Aj%d?r$#(teIcjw#x|4A~5VmeRwaD6%6G?&bhil#=ezDZcn)CF!9TG}+&V-II zqAD`PXs#7w(Uf%0YEqhABWO+n$?oxX` z-^iKKWTx?O$%cWMqq7~kzkyHGZ3V)MZK1Rhe57~z7QUGXLI7>Wk$_14 zG76m1g@Iz}8dxohb7(6@?WFF3Mkeo^FQkQnGjYA_v_U6^-6c=yY9|VwT(-N_uE_$A zB)b^MXSXMhuoI{=5D#4CsBQ&cMww|>J2T!6q{>GM{VU#D+?!z`_J9}z+%Gzv$0QB+ z$&-`u>=;9vOO=F8eb=l+Q~>HrLr5hORo(JljJ3UY#`nd`m6EpN1aRTBRq)n^2qwtB z9KP|-0jH}%#CtEhYl;O(Y@IOYED?t@{Oo}m_t%2m@2)j2V5CAF?B<0G z5xz-e1i~SvojVwCe7UHth^wU(8gY zUR}08<2A75B$%y|cDlx@x-AO3`cu>iv9zk_#WfkEF~OnID7Mzv?K7Yj9IuDmg@2{= zEFG(9!NhdS4r`J@zX7c$In4;iPaYJBd0G4s#*{0V*BT>EGM8`HBJM?X!JNW z+F?hM#+*5)?RhKSTq9IdR+D4l!a)hG6n5Aa^33>r;~8Pb5-pq(ifu+EVbarqZhdkDsR#)?)f@Par`=VXh z9m6ZqgWPWHYilLCbN+Ufm)Py;GMob!!lCi6Csd`Sk4#QCa9QeY*xw4E& z6SDa<(YpokUM1N=V$};PL-cLbqTRNl8BXfFnSHWgd@v7Y zqT*f77bzzYr2XcSl26T~`8B*VlM9fY*XaPmCd%s*066TwL|t}|RA1YEu1%l%UUgp1 ziJqf%zmCgpw*&lrCvJrUnUeash67+SQj}C_l^i+O*<7Z(EWSoJ(6yFpZ?mJGw?A^E zs}Lr8_HHBCn&6#Q8<(QoANoCv zcHR9`;5@cdBfUB$?M8LF7R+FCt#~CzQyL!Ce>BwprV_2>x*KKF>y{_6Hi%goYrkBE=zY7KA&Q`I*|;i%X}Nah^5K==iE39 zy?h9VkrP>w1z5eBbOo;ckup#fvYU&Kv@!WRD-*h$|JYTrka%=VDgaxwtI(fziThLZn zJ$4-C(qe_w+@Cj18oS3!*E_ZvXKZtx^Q9;@3cl$*C1#f2#;l}f;Xv=8iI*1pNhkXFaC zoAG((Lp?iX;fENMm6Ci`|DN?Iqj0!+Lo8GB!{#!Vou`PFiWGBDscA(e_R@A)_POoa zzxl>Ed*?G32DcCp67UqT?OP7m0v7`3EXpnQLt&psEhI)Ii6f@GzbET~UM%i{DHQLj z=|;JXw8oX8akdzln--@7mvtMdr!_Duk5F6HWFD6iNiSsf0Pg#n|3n!FbWQOXx6c>{ znpQ>W0l2>Wk;>6q1S4i|xF-HdW+V8F`X{>)~2as4>ZFajJYI8zx8I<{z;VsOCuf}m2V`>Tuhd){dDqH)$V%0G?&WAVtD0R zv2116oKWLuq~ygQS&pkF1}J8#3;k{u^C=VCKi$wI8p}AisMnv5I>Yc@xGH?A{sm;6 z4hyC#thZb^6@Ch%nO;V*Ua2&DceKjK_BIid-xFgqqPj=V%CoMH^O<$CM}_w`G!s(o z7D=q@bPVc6r4zk!!1bi_yX>svYv6RJ0N=-ntY|ZTm4X+ua|{R2tkF63nx5cAW~>Um zHu5RvHfSHl^#{kH^T2(j!ja>4sybtfSlU)_mw~u#{)4nao-dq9$*}8JMX{#9uMGN9 zxO|Nd@!(#cML4PT6l%Ywrb`N{n%f}lHB=$i9=Zt>20U=xxzl>Qo&BDro|T@R?@ry@ zoY?3U(_L8IQRmGrBz)2B&7c`K4M!}@2Zih?u4q7?T51<$<=J`b^Uo+a3eRZlOTCQjc!`^WBFsAcYHYncB`5VrigLXQt+4;3>*MaSbYTcI4;IBhdTQ@?FV;;SX4gC|vj-~Jq zvj|Qa&C%rU*Yq#8o8rtq&y7p)?`Ux)dj~X6eR^fHZ4M3Cs_fogoa5EjEDKKh89Sv?`e4xeySpD+D0COfW|ZB zgvfvJn8FEQ(EY@O1#?DNL$c+1dF<@bCt-1H_N4t6afRv8>CpoFn3+*dxk~VOg4_sD zwMd%q&@Jb6+4Y%QlvhdFpF8-0zvf?PQ;pXdK)eg^BM;8p(xbLn4X{ZwM({{>K2K-! zPSZ|(GM$q>Pd7<&gm*|4Z%gDsFROeyqc$Z&_z_S78zFkqc7NC2Rc7|1_7PWrU7@1E zyT696)cH5l)Cbs5al=(g(p9{Rvu-E5@txZ2mZqF$!FNkPp8d6Ixp)K-W%v157G56n z*dq7QfD_LbivJsZf+}!>2qxEtLw3%Qwt$(-x-^(t>xqfWC&3vS{K^@o)G^qtCOCY< zjI2wQrpMxm9@C@c_$9ai6Vl)kDNczyhd6YP9tMQY$xl;3 zaPh$Ku^QZ2)U8zw$psF{{TsUT7&tDxZ#DKqUhW&jF6ppmRS&Vn-+TkG$r`RFFr#CS`3y8-RFz^uUD%2pMWC6mw>N$L#) zR#^viZv%-Sqrst2o1bK_L_Dif9^Svj_p0i3@d?~J|Dd0*#5Q@Qc$N7OwZ(tueWZR- zyoP;MezXPjg?noD+38A+o z>Jrr~=?bvkDWH}eR2*`C2Dif;p>-Vs8?s25-08bFcW+Y5?-7sJZ;N|%Y9{Z449L34 z(7}j^Q=&}`8#GV-s}?YY#y$<4nzzb*Mm?scuWrJQd{?3ZhvkG1R3M4RONL`ra_=86 zwn3!jw*H(lPmklq%BVUPqJyqUI5Ln{`W>jFJBbAJi+KREZ`cH_x$q%_fqk?X>Fx27 z$cWUtC~JkP)dP+Y}O`(W}v(htqJD$f>4pwA0F|8bz=rs=-zhQOfIUAve9@})2?OEszo z)W+~vV+9waJiB7xx4n9_sS7%lqTj_1I)^Xsg~$NezD)ilybs|rTH>7Zwe=;Yp!!%W%}Nv zz`!sH(0mo?!vFk&hQv(4o*`JZLM?6$pAtwk8A3(HLnz;kwTNw#{&@u%5#U*jhWmln z?8Phpidpw;wg&ailkW(V8eJFeg(|viYN{UtBvl$4Z|FqpCgCOyTq;yLZ))W9Z$q6J z%<1FS@coVeDVoMbd`)9IFx|tdDJrtR1!fC92s$a?TjO*wQv@h8Vy7H`eJFR5bArIs zCXgGFm9oC!d22$G-v|y^j0SwRChCx>pX|3afA{L@ssGjzgfOqGYWjtdKpZ-iJ;(uN zVj5qDLr&c_Q07W#Gz;m>$Q7ArFExD6#~JxII(LG@2jgrIu>XvYFY?nTKHU9BMFN4~ z6b8F}(9@RnDyd9-2fSf#q=j$AUf0_KkXU~hkp8%kU&8Oy)8guL^Q1XqL!^kW&f8@% z5@m?rSLpws1N!F!snh3;SJOXza%wQ2Jz-_yT>vaXpb|m}1Mv-iO6t)S2?{&XyvNoCoCN7SWU zQ%lFQT}UZhX7TY(Bvh6k??IYWsL>FDSZsTRQun@|A)>(A!+c##|6XrB@RBk`@4b^x zL!l+8>yU=#Dud{` zD%6mFQSkitCg#a6qW&quj2eyW`89<(`(RW}+c=t4Bx03S)o#tR41rbabd#c+jW(@oqC>_+5n3Lg%K?)U zZKwGHZ`Z#EnG4qcRH4>Zh)KId#ZqR>9cvx0D&q&!o~Bm0KCAmSqtg^|fh9`^tGl#X z-zVsN??y?`CNOnIVRa|G!&g=BNE|MnyC2Z?gNrT|vs6cX)(-pllA^v1P_x=vA=&-1 zY4!$Xdw|w6PYsmZzee=B?+?iJk?O@LE+vDi(UbGIUVMyV73NI7WJ{5D|D=x;gN=H3WrIq%OjUZ`J|5Acg6d6Oshh}i5?pG0k``b zliD-~jW6V%8x*fI46Ebo?p*K-E?@n-#1aD_KRMxGs9{}Z?@$Vd^f6=w2m`ZXZ^%od z2DlZV*D)>)9&4fp8oy{EJk>u#59q6WQ~So8q+zzB2WpGKeGTj=v1icjQ=>&Sb>G%Y zx@XZs^L+Ff1DQ_K(PW~2mIR~Iv!~3L*qP%%yrEbeOqyO2U60BfwHTl1R}?z5z$Vd6XY@L z0R?J?d~VE<6nhSu%F9L2ld(kZ7Z2SC&kJo4)XDPG^!BD+4zo{N>J84#r7n%^bu45- za_Ev56{|R-p^NZI`lb$5WgE~8nTHF$e&x^FF-PgA3cLwp?0xV_eo#OsxBvtlT_Pce zhb;uzI1A&9dfEc|mS$j*eT2vHxxl;SvG2iLb_6=2Y`yjBMy&j~eyPP!_jnGM7Se*!Z|BP-GY`kjZ-n#V$4Dv@&w)|RK> z$|_`M$igXaB2QN0Oy)^xpGaa+SbHf^)35n&J z7nhz*VkowntaoK$##Ga<>=XAO1wBf$`?TIy-4f2D7y%4Px&w$PI+cbyczRx2bm62Ismv=X#H>JMZ|BWka5el9VWo0c}*wp%F(3QI=V(CG6p z{Qi0l+laa`dfFH+o@$%FHvA&hk#?y*QYa;e<&*S;Vu~ABpXW1O$n!Z>Woh`bGw+f= zD0XX#pMdnsN7C+vZHi#-ePx8j69i#4&CC%~?~~+720wu@1LGS2l(ft=wtk0TT7IW9 zLR>vhY$W?pHYE{QR(TyIX~nrdXhFK3$5N*AV#-}^-u!r%#IfUH5b88iwmIS?#CsK}#sC(y-MTJ;f++G^Uj`qEZ~#mu1iU(th}TE;DL^6+7*Swt5|0S?Kp@kC||z zZKcdb5TjrQwc@j^t<3S=k&r?o{y43*W6G)ACAO1GlMRe z+dAvF*22(bxU+qiM|Q_|+O(|Q5#RE=(-GFNtIRjpRAE)iFu3+z_cFbX4!-U)H|t4v zEAO%qLJ}-)X!{1IqH7L&h7mefRL2C->3?}+a_UPAX4 zES>y&Mv>;WYN2MplkQNl(!$}{pgY;H^EM?Ea^mwgu1u1%GqTLW3TOGmqu= z<_P8~F8P9QTMmM}o#O%v6^$4R0%t!5h!*z$l)%F(d^Ea|&@>ShIW zMjmGTa~fk#8Os8s>jOmd52l3)cE(bb)KZu!@66 zauJe4>R{&J69$UX#}l0i6nhxIRRa%&T;d_4M!RjCY&$MOT_ zf(GqTg%i`FDkYK(xFX6T0o2|If=TQWZ6Z$#L-Wkpb)$9d(eas;`D0ZiUlqpjrG~_2 ztR(8C$>s3mKy7Z-TJtiBhlUS_buJu#o&9X;%K7C>hUngs_Xp+9A zalSPo4XS_lMR!SGoZ93|R2b5yt?9#_U!pYVA7T`==^FXWHCGB~kCiu=tBV^&N>6~t zCxA1o({m-A9OZJAB38#rCGM#zR>xb%TlMKVwVYJ(t2WhpJ1ga5m-a;l#dLqPG*2Mt zczZU>Rz;#RPglkpd9+{#U3xK?xl()yvrFZLcE#k4T2Hy@l5uQDuIZJB@t2+{-&L8r zwQEnkjR9AM=UZai7S)P#&AD31pl1*#&urQJ4%2E&IZXZ%C^pwydt%>XmbUjeP?o55 zLw&8M^2*y+^_qmQYRbIx>v;9_bhV6eR&s@t%VW*?#dQ&~k++izoRd?{1zqXs#kCq+ zi>bD007`>ev|vNxrSMk8n}?Y%$BAQ#^W)=!iUf3cas8%O$adwDU!4m%s5fqwc8V)N zyBJXUHRALo3Vz@oIj-!Di`}tOBY&=16H-S0Dq%P?e*HMUf30lkx$F!$p@72$_1>yz z=SnPw7m4*Twm6&Izl)>#4D9NI96!R%NE9F#2O{B{Qi1SDRQA@! z1=V(!Fm?5%qZZGeuj^JkySfOOSC%V+*^l-qYN@!nzxD?#w{8L~W%wKf5@)xS{|6 zRTPC~f~9SLx+NX-+%Yu)3;uH^-R_#c3oakdox_3}2XGR{lAd}piOkxnPE~u;orpxT)}%_(}@`~kGR8Vf7HiD#3FD$jka5ZCHW%>}k_lWFr9X5duNrxG&~ ztKAnA@|>xs;-&Xkl+yNV4-;kR-~U}K?iqP(`O4T zSB3xpe1Fi}NP65S#jqyUaiI$C@iY^{UJCMn^7Esm2(W9X_DRzeS8zI@Sf>OdzwLtUVg$ZsDO)8mS?mDbt1J&o%ASW&1E8JbCNSVac*6$+{yt(3B5 zHs)rPHWmu!KV%zWI2g+c!WtL*qy8f0ric>?M_^lf9%#65%0v0#?n|&0cpBzLOZx>Kc0Mc<0bi86y2g&yp9Y*!<8MP# zQL&SO>a46W1v+XQN?9dJ%*(9u0gKGbLJx_Ve)2O|z@0-&8dQmkgdpf|}AO?gmF7^a1UwcM&ee40jrO4r4%AgQRwDys1hjUe^}KYSPpT4i*?+y@l~^ zcr96;(Vl6Zc-fGo$+F|$zE2v`GyN^9mODCCpSq4sPgg_hE$BZ{rMG9@(|30Si}ZrG zXWP^F)C7z5V|SO{`%}Qx228Up-D)@GR8N;thSykf?sN;f^^Q)Xx98l`cYQ?jog=BV zuJ^*PL>0j+eoDt`J(Xpk%g=w#Jvy8*Yuuj+79{r;vyidfuvx)x`25?43uR-*zcPIa zvy2|S3?oh?Qy9z)aA{0=CAIsehe%UoY0dTKD`Uh(q`$1wmEJSP$rQ>@@aJnopC24w z*1Smg0&~VHKESEzl^s91&{ z>fk=(VEjna<#@AO=xwr`J|=JgbP8v>Ha9u;YWrM#P($^zwsUMB${6xYEjd1;PKn_k zn+co9rLg;CB7;ib%h1TrhK=|j0xE8lh#>@aVn;sQf6~I2@q?QgS-1)dHDB+Z`=h%A&DB1)!~_xsDJ@s`bp;tN)F_dpv3p}^Gl<#>WL z2`__hxxtVi0PJs|K^S1so{64zt-}a3+^}%!lsKCMPy^)nA~ix`_5e#lXzpjB7xwId zfl@rIxTwbWPz)8uXGA^qUGv~t)P5hR8X-hE1ny_SpT$&Io^6nMmjZuVA=@BBs(dVi zv)_T&LHzBW31Eu9x8~(-X2O!@j<1m<73wtfkFNRQ5TU~DB4*{Gz|ySxg6wXn8dV9UXI-`?o+~>|idu zp2h4;7|Nj>)=Hs3fU#_W&0q}QvVg9FlsA4+H6g25kilAz+2QZI@Q=ZlDvoLgd$dKF zu?2MjDKNFjNI`fKMLY_87(B^kn1QpF1Y(o^XL&Gey9`KU?^cW#9iE8W6rDS*eTRs`X|p&XXiGC6Z7+!BWR1jtZHGop^r9OaMDF`IhL$HdY!i|+Oqs&VRZy7du? zG>LA7{7Xg3%0o0n0?%KUy7e&GBw~cUJcvqA9b?h@-NXtE5RUl|f6S=3LopWNXLKM4 z-84odXXr~aH~r2D5zP#lf@lz%1zRERZabm-T?xF<`SR#=BeELYjUJQ``zyL$Yj{)pI z7^DxuIDr3oXWx#+ANX`|Z4fP|{44QQ?4d)Nv!c}7kW(7cmadCD}*1wf{{|H3+@q0bXQ4F zk~5P1K4(FHsSUbXRX6E)>7d_-kpIY2#{c^_CXYySs`9i6G804S_uJo;BXC?C;|(q_ zGYdY4{#Qlw!uUwr%cItZ7wvXVgzeN2Dq~uxJLwsUlAzvht1t`1$xDn7`7e_x;4!C( zyqL|eyfngl%$bjpzQMofgnhE}Sw{{?Q`w@hLq8{S z*W>kl;s56CRT5NX!QdJTn#0=&kP%Kt8XBANfQNiG5K7=brOdB$CJLkDMUdyf$@=jd z+JHd-?({eN4VQNLuD-j!iTJ-^5Ybi-tc?>xPamb;2KGF@8(#VR#!up2qZ}hZb-)odb#ttmveJgrK`C@(NcW!id zZ*JM%HW&$gSAFZg)j6dW!!<__LOepSkc`55jHYM2w>1ICzEB~BB}_(b??qjSN@;|G`G+Kby-X&szU%QegX zPP2lG)cK6vhasj$5Iu1!t#Gq3GAXf94q*|Il*Bm99mRv zx(%&@8A~jgqdAKjQI!tjY@QBQRBrZmP(Y=QoUOs5o74p^d$p1(t{jRA8FJo1<@B8t za~`}M?5+wf6oh(}Ux20=&E{{p)m{fRAs;@avF8TLUE+6jA)iUk2$bxac+46`@6K_j zW%SUQl{-skoV9Qe6imS?Btt!$K`?)`Bh^FI**`yG zxudXa$!>9`50{OHL@#r0aj5my{%r?*Z{cPnZ#&>C!t?3LEpjUVN^y5OO+EoJsGf4p zuBab@03ev#G&ST$--DfAwof>C_@{*ty;A(Vb}<`8Z6k=!HD&RD>h%f@!Wx3O5qs(z zKWf#O;b=j9CcG!6n;(gitRbkK)5Ci4|F#gye%Y>_(>c{(WqFz0$omTX7zL!kvo$6mIi$l-sXA7 zp6!S#pV|FC&h9xnlJ0L5{Un*#wmq?J+qN^YZQIVo*2G4~m{=3r?%2uA^Pc;h_uR97 z7wi7ft7`4qySjUI?Ok0PpYIMo0({5|YRET-eDt4y6U28u#$QQ)xCsgcsTOcfM^>kU zd@m3wBlzW)KRl}5tDgf0gDjuluf+|?n>Ha)ErT7&)Hz2Jn#7wHp7!3hdWmeK=1`08 zK0(YgIzIlR&H9hq`HyqV%*4XZ^50DGmqq$N(*NI_W6^(@8j=w}@ zIu?#En)QER$87BXKe1!BFADiTV#oi*lKyW}DeHfKi+`n3Hs=4Jl>V(*#6>eQ{tOAOZFG{&n4Z{+2;UJC(}ij-TF}8KL~Vm0F6x{HklD z`+XfjY0;;8ioovn9@f<9&eCDRaQGVU=QSoFh8ntU6@t@HZxBGR8Dc@yy6EFSa zNXiYv_8z~t81rAnld?X8qu-D9uoec@m6d8$8^7s%us(FEoc~-ed|n#EEK)aBmRq5! z7+2nft&DcnWY#$BWmp@vnz?P`I|pM8ypie3Oj=B!-s0F~8YIwMdZX(^ezTq;e@dPh0PMV^ypuzGsGkmOL0R}$ zAo`QS`R{s{o=+cX8Yo}|EEO! zkFxteMc^-u_aDjkUs3oU&G#R@_g{_p-@O0GzF+$=|7yYiA&P*X6FAY|6l1}W&U~p{~!ea zSG(|k6@pp*sbv3Kz5B-<|EE>?YCZm~cP#&i>i^F|Fb6vm^Z!~Czl2~PwV``X{&Br6 zudSs0ZkwwxS_V@}L1D%uTuEW!fDoj#^2F~bL=C3kgW7%Y3EFbj(bljvGD>SG{lDYqfx@&sPJ19!B@6iC>vq&W96R7Uq}UcP=$Q z#Sog1l}u^17T2%G^7J{Qki0O6&-EHwB;0F!9@qmENXRY>R_kpR-3jg6L5U9#BpLKu zoZjaMH*XHXpxXIGEdR_M)J)P{Rl2t$XDx!-qS1!O@Q`whCGsGunY`~uk zBy6@f_)6V|4`)_DP3j|@JXdAao^u{}sD-f7ENO7mTE#lcSBJ3P87$AvZf@K%BZwib zs*eBR>Cooc?0$q)^jCotj;kU@93Xt<{Fb7br6`nQD%QM$FQ2Y+>*4!Rew-o5$WG5s z%v4Mn`!#wk2U`{|_9^fl0jY$Ch?vhw3_nE7diU2Mq8iI9I#o;^p<8Sd#C#~b??pFM zzuyQ?kkFW6H57Gb-jcx!+#Brd$Cae9CInEcKa+Lg1X(23X`kg z@P0JDG~as$_Q}e1YbLrJiI08)?}fny5+MO@Ul{+`)&=8uoFZ9rZ|28B412zTNu)fg zJ?jL48N>fBpnq&YQ8ip7+ay*F~}WkgDNjy9hM`yA`#`-84f3&qHh$VV5l5-Bj!>N02&Cp!|hX+A>cs= z6b;812AL9f!S8^+2vo*=*rwto{EW~QiAw~)B1YB1;e%B}Thh(A@V&6T;Cm6igUN70 z9_^d~LEa#P#=LHz7sF>}OsMeXBwUY~n-KJ(y=HUD3Hcz_-`Fz6%4S`g6g&)`SZ}_M zzLE>hx6TmUp?M)6PDbxZ;XLEY6>`jZpETZyU_~ml5jZIHQ{4m%X977ehqvHwyRbKc z{DKI?UuT8#kG^`9yzslhRTcVafQwHfPfBmdA0cFkOvM>Z$%IM#P6=+l|dyW<)AFnz2S9_2(-DoJsz za(Iso=)Ki%zuw4S(BJUI7>YDzt&idFFeLH&5%9t(cd3v{(&_BOz1^S2k zE7%N*6iUKZkdKd2IHlkfiQSQK6BWZg3%5H&)(IaYvqwGyIb^!D)~Wf)_-S*|1(Lhw zL|~M2@h7m}oJ~DVZTA&KT8NhvcNI4k*Ji>cMI#x#CoQpo`*z!7zC`!}65+F``N*FE zA5aV3fgd3sG4kI+KfmBtfw*Cir|1DKBAv!-^e1T_x`|!NJs8aDBQ5=4a08sdiY*ox+ z7orP$$%Jw<3O6Cov@j1U$280Vu|3r^Aso9@mF%uQgFnKqAfqi*|Ap@jtO?P?1-S!6 zLFf$lXjGavh)<-abxiLSAub6H(Hw9!kUS%Chjm2$Y63GELy*4ZnB_e_4gOc4SR>Rq#A&lyXUED?lV|3XZ` zybqXSVUV0x*n)2tMOCv}tD+F2L?0PG|Jdfx+8&tDdrOglQu$8u=>d?F)Z2s@mb43I($@99rEb8$V0FS{D~O20w){=&_5p>P4cG(qT} z*1#G*5oZvY82Lz!XBO+^uRwi0k?w|~^V#G@o^g*!H9Or4m!QR)=lBGlweE1SwkS1) zAQkzS;V`R9R741&r@^is3bU!i0ja)oXhx`By1ZlxLWuC_LHY)S$^a#-_+i@4+}^z=QJPP4`RL6NA#NAct1lVekVCa|&z?w&07UaWD%PDx%J#3(nleYLe z1QkU}N>PLXk(Ocp)gf7bQ={JP`R`3Bv!#9O20NYSS2#N!*o&4GkS4GN%;fcY+!5J6 zJR+upWOvkJ&cMo^<^6`69z!Q=(t`NXG>+E0#VIXKeT?*!g@l~N@G?3n{q^vqvWNDs zcqUoHohQkq_hVhS-LdeHz7ktGt{!KTU^v?ADJPavc0YS;j0kP*41GPA3$_}1GOFak zrzi^?ubM)$CDMmyYYqb0bI4omHmV=-a~mC8exi7@vkKxWrWdQTenl(%ZEvm%w+~7j zQ6c1AoRXfaJzJfs^ z7&&aR5mEATkt@n-hbc;aUm1u!2!~*47Jg&`$;a+g4cT ztQtIOwO1sj1n7~70HJ5b_4Le@^u)e>;amt*Xjb{1lgJed6`Lt=yI&an zmXfdZ>Zm{~#s!T5e>8G~fzL9+NCTBvOBULZd) zI;UDH9Eyhfm~a}%=ioxr{!L4%w5E}uNuK?xFpdO{Y{a0_CR)UW87W=kpfIGhjAUxt za_gNEl1^^meH4F9#hefOa#B)H!&E?ZOeHI$OWNY@?6cM1gck}6{fwUDpgZsdt`_Bd z4N20)`*fQPtIqstP?v?jHRxkrLw`$aCc#8-F)7cqZ~lU9|Bzo>RoZ0beFYPN1fVWy zI68yD8FS^rCCSY!Y>at~|Js1qWPVHvg=AgUx2-T(M*Mx;R9XSwsgiHA1A>3YJWWoU zZq^Vog;I_)P=4#OK1r8>6XY2TPYI5z(Ura} zLFO6YWBEOSidQ&M4uhbNs$6oHG~}To`~z=vf&T{qZEj5tO)i^ejP$p^{J|q_U1SPL zl;{Llvi{$Ratp2<@b~Th>e3{7-q?noK zv<9wMh+h=-IUnIDjb$3!0&OpfSXQy)TgxqV3G4=?Lczg98_34?Bm#qwxDvDLYdLzH z+!o-2%SimE#+S!YK5&maTI1Fg?C%!nBDw_N`dsu_?&6jydIFdo%C0XeZs2PEu+aRT zY}eH}uvXAyZo#zIXpyjwKZ*U+-xYC$+|6~vd%%l*mGeUT(~llkS$t}$U4Zkj63JG8 z<7<*e78=x&F<7qHm!b85V?Mlgpf<2`UBI z3D5yf@W)?FcxsQ7@IT3iT=Y^XNy0n%8^{mhgx?uBBy&$5l_vxfc^i4E3zPa($b*lt zWV9?NLKN0X>#Sp~;)iF!+WH)>UPHr4tNbv5@6i zK1I1j_-^N_$Sn-jQNr)tD3V@^=CoDKrsLqF^6?Y; z6gX&0Yp)JMQ}4MFi_6N$5Ri&Jn-s1Xq!5zFN=bDhgcsMVy!tzc2x;%{5b6ctBg;Dc zqH*f?+X%C-#p19#GJI|rbxs5b5O@M$0hc}0_7CWbB`Z<_nm2ni2)|xORHj!t&|p(!Xd5l(^3bQ9zj}Eh^RzJ2=f!F zhfgR9gEf*B3zTe-Ehm9bID_k?w@;9&@e!uDDdL1_NlIbGYC#$!$KNNj%mQiHav)t) z{0`0>Ohk}F$ObXxK;!^{;ZU!xt9(xP$BgEA!kmfnc5M|k z+ZmKLsd;yIQUNXd#>BF62U=cnUTq`<2feB=z{m?}^qVa5rHxGpc952Ip%mv>x+pcq zTX6h?SZ*oiUKT*&gV|qyf257}Cc^`m48t5bL2zziq1N0xiyK(K=JnQ1Z`v|!MLY+&3ESR}0+go?OtzbGq z*t=P^-AJ>W4JN@rtRy)+R5J5`GuFc+86x%!m)OwPohgC$J3ctGP&1obE)Fl7jtTE+ zmMe^=%MTS3?YI*z#G}L^;`X)-YIH?%<`^ttIs%3S=wL0D(d0cyN&`xQH^zp&fj)h# zy&{n-Nn$J$+Lu?>5 z)$toaE!#YJ?&2HBuMs@C_Pz!9uJkalcU&LvU>Uyi+IcK#sWv=FDEc@X3P7r_SB1+xxLyDx2y^hqc z*vPiA`w#xT5LzVYUSUuN3P;h8)(bG)dSZaN7Mes#5m-!AyE(y-bG{l+Tp+kU_`}Ft zJ(%X!zy-X+9@;Wy9Y@(zFX{n%F4rQ|nFVK9>JDAQLNW9=%%qGVqcloSRu3@wKe(OK zOxS;>(88CSjN`oKd{a$LQwX_?Qvo&$QId!_=FAI-zJF{ zm6koE zHS_nB_yV{SDQ3)cd}3x;x~U=^x0|Wm8k^b6sl(qGo+ArY(M_~DzfbvNUyYHXY0-y( zuT`2eJi^!xl-RKY0xar!nLX4G9c{RKt)cs5)44V;G5dsAM%=$43pzL!t2JBqfv5kR&-Z#PI zyz-CPjt%J};y#6)WIX4sq-er}@bR)=3Po@!H|$^YfKn`zWVrHdQ^6rJFe`Fw#etlV zaKR08s0LjO=|SznTuGFb;z90H-aTZZ1cXN;j=&S=vrFE`1fB1`ipI;sXGD_JcINRQ zJPAq|CMmMIXu-F}F&QRIl*S<$h93)Ma_)sJsOu3^EU|Fs-0p`gGvBr$1=)QJ>1C!E zzZokg#I{>-8=+(x0f*6;#y6m{TB}gq`wx3(>WpZFk?IPB;Q|+JzTM_(e`|y*)iIVP zp`fOtl^QeY?ZFK2`({0DPAIbCi5|2S`D^NR+kKjE2RjcrqU#J<`ZC*lV4Cpr$oXIs zTdfg?F>cbw%*yUStYkxMc7H2S$88-zZ-1}`$kJkWze$NYHLz(n0ZgM($&Y0!qj<`u z8Q-eVPcblP%|XZpl2h=)+@KE9#B{S`W2AsWXgb2`i_Ps>q2rJ}rLW@Nbl!AkIpE~D z0m^2}nn`CRKx?i0^+!mjif)iQfr6@lhOL$*dbB}RNyKFW2bc<`&=z5fKm$oJ>K0Z? z-=T+wcQs7k(O7?afpY%i!m|VW_9g44e)f&_UU4Z|q5wVl@PV4ub7?dLD!0x{hu}Z% zdxC<9B>s#M=Lix+mbc~+Hjy3pROKsYc)D4o3g5S$z!YypAyXCB<8&n=gHPk&5kR#C zwj92nS_N@>$W)V3V6g}yoadr5y7D^X^BDPNNpETwev5U2)3s^thZ~S)W8?L9u;x4k zOI{tKc>ksxHuYdFb{SZpLDT>bOhGN&&_+JIjmKuLc2@arnD|;vo&Fq^7ts7v(urx{ z?>*N_YOjxKz}>$8o0jigxdqrtU%lyeU+fLxFHXOKr=#gK6hs|P!XgBTmB`g!#u#2< z3HqD8rwDUXfOGC8R0iuFKJq7bEDBRkm~lFOo+`u=UW6_DO7NO1GfJ zP|r)E4?Z$`erSwqe(whgO(O=xpo6*B6xmj>p;Bqa1#Y$iC_*P+gxEe5X9F0kWqfS( z{DqK!>F~-(hjFm7zIX~R`*{P?xKJ4Us8CjrsPl8QZeBkL220ZVL*$82C&nukcJOZR zMXu4YW65Z)^;NS(U8A9NbRJfw@&Yt0 z_Aek7GG6TUvyBo4Mi$M&xH(-ZV`Rto+~Gq|{M_E3oE(m;`!cX2!&X9Th^<@BF5?oo zwa2*WaXDZsDps{#`OlNB*IjC^i(554m2Q8Vv0sX-f2|j%JW=nQ-PZc;#mDbT@o;Ms zzMk_iTpDPVY&DNafSz%<@B!MK&(v@+z*Lq3e_sW7#tCuz4LxmQT>V9ggf_ZzU!a@9 z)wNLVE3>p}iXEn@Z%N?Wh8BMo*6$WlYO%@|iLZLqo35<=S`Ta5X>%KtF34I5tzC%m z12*-n<$0=Ps%oF6TO-Ua$-jK7YV*oRmcJNJMPDs$O}`O9b@X5qm1Voe*cgSkEuW&uEPF*MW|r8OsK9IEjP!JbBRqz4T3Gp0aK^0)|4q zT+IRgsVS=T_>bd3HA#>F#|G9_YCl4!Q}c_B@OCFi5>js{d&WR0UpTs22S#vyKjFW{}9;Z*`(%P&UT z?;pQLJ$vw6i5)|iO=R_IIf-^KuysJ<;f$^y_*Ryw0XBSfgT;51d`-(a6YTFDR#@knD z9~~aXY?u~vPUT`{3Hpx>ajgo?xA~`#=EHiV*JCc6ck|{nYPtC!^Boh~y+dlMMI2*VhaStLk)Vx52 zTFlENeaFnwzTX}$AKZS82ps(>USA3y6>OQOUJOag!}DfI!|d9Y@-?q`FI3RdT? z-`hA%?JdSfkM988wGN5B9kl$fw!)9yiLZy>Y~!dKXPwGDJV%+#`i_U+X`#(DtuAPG z1iBJ-9n#}CTU-BCd|OPlVGrpVbAebEs$^J6It8 z2G4=-u7Q3sZAxuI?MzgL=V`FtPm2XgB~Ft2tL{>WO6K8RXi7px>vX=i>ZPetBgqwt z#qTGw(XBdbb5(R>^3r(959SP(g>aDXguGQc_1{`4dI)<7dxHSTpyH{*c@?%vgB
CF>#(9rFew2kS;C}_ zbPn1aoCM}AV#d)g(woWn6i}DR1DnNt-sqis0Tyr~S$0>wPP0dh{WzxSm!bssIj<=MRVi>ur2GzcT9t4kRd%X zKDIDt-tbcZ*4N!^<5x_T`Nf}8YdCYX7jyIJ4BwHz3lQ8#L*cnGcRg5{Et|X0u1#_j#c7!tDe(jIAWcXP9Nn_N0|bXHc|BWF=I?-XSUcVxaq@L{}W6f53zo z%JC90+G?^VW+hsR`)FWMWsg1vcPtQJBv2(G$WWFvCVhJyF!OdruZqAIj_K%tr?qP#Fk`Mhk<3)B7$C!EQxqT-0C%${zJKXc51I zn$h7%uOC7kZ1kr^gf#@5H$dZp?R*&l)uU#IhZYZ0GS?8Q85BLrHeW^%Q=sY9Yy1FG zqab?4dnPlJ5We&MO*Mh~fF(}=4UbnpMpXNh9F_ps65LZ^k-1G z)}ezCHZM{0EO7M#RT7rh(E3L*v6DK*=(?hI7FJ8#qHkY2(xGnu>&v@clE6=8u>DeD zyC>Lou7qrp1A=wA9~0|7qmuwe%v)!0JG}jZM)8>Li0^M=nzxvdNYNeYqA*P)`8OvU zq+uYLr68tJ_;$tyNe&th^VbL$F{Ixt z=RT;Jtd0JPJu3MR8YR|pDE<95%YB2)n5~4(ui-3(m5{O(T*5h(7E1iDNxh=aLazuK zgsZ`XiGke++56rze7k&eIS)BWKB4R8YeWI@l{O9=f(KTwB{z5_>NTx3M7FBA z5ilW+#)-B`UlAwb_FYnFOr=(w!jg7p^qg>h2&yQxt5QtY;r`A(U*gfPTVX6*re7sD zjUE>2lob_fflp`_hZ}}c>KooidH9t?Mg1d`+B+r0s0rbw_MK>oQfLz*!ftR`QICgz zV(GS#(q`H1k)&CV{Iph*yzLyc2Xjo4On}WMy4dY!@EwQ-YC86HL=N$ZQ?AV@e*UyV zP^d39a!v}8G{h+2k@JX=-1j#!>vj7ui!6QLxEYc&(Nko$MHhA3Y6K9W;eE2McQs7@ zQpqIaTdvP{{9zx;V5#`J9n)k6*eb<$27T ziST~?s00VXWbdM;Y@eDY8X zsvW}mzipD(xm#y>4tP@Y3UWNkzT)+eezhXP@qZ*z(`T)p&~JYDs(EPnAlsZ({gHXt zo0@;Ze@VOh{r3B&{;B@X{($t}WbJ!kO(Mi{?&uF%g_8_X0p+V`dTDPBw0$TEYMs?oZlHs!c+=9wQq)WG(!HB?9} zgYt~ZaMB3NIYSQcXzc%GjW;uuA@eiu3l5_QAarQhN*hc=(h)k(s720x z<%2mJJ_}$gLWf2|n}n}lTPTene5#K|{i8;mdP2)f5bn0!>>+2mX+Uc4_sKCo7#vKZ zkI`-pWPbaYCIy(6ZNlfPpk@x{ql!=Y=+q=r^@BDDY7@amI3matN~+?X-=YIHen*6a zly8T73TAjR32FTS`&6o1xd{1@KiXTR)H}A2VvxvesTx2j#_pi<7JWW)PI-P8f=~MD z77%tGFEGPLN`e7p69`i?;eDngY)Uz<4tlTsUf>W zPM#av`LRsreRYP2?bpP9?YzTO*I^gT(tYG@_^2EZBMwl(ok~I0z?yBVFZIvuD>m5S zoZbR@Hd0QIsodW_9hCjn-Ec&b32RF?;hEI&DH3@$x4wY^2C<19HzOrx#P}|1n9?{AEVJP(d804xHou;YbMHI4=kq|) z7%9+tF9oUUsAdR|K+hAl&SIy5<2b|3ZO~WWNMU~C#d56c6O#@QP>sh@M^^0gyRGn( zA9!GeXHrA0Q5M!={2lN#BBc$pAA?T)$w`iBQ6ljx0l6qHZeo``LQL6+}`u`62d4#jv~z$2oc(A@A%k zg#H?Egas92IxcQE6F-_myi(9#Oc&0$4bP=e-pzP0%BSLxnzZu}u`Fc1nv@VJ1{lim zZUdVdTco1FpzSleTz-5wYN3+F03b*{%8ifr!ArH)b&`_vau~mz*CDy;dZ#AHZm#=5 z!^A>Np`Di}@S0^!zfosvGPNJ#;K<3RE(3TfY`3=iybUJe=_cYi>h+EuVu_)NEJW8U z)<4fHnY!7cjN;E8kxvo)_7&uhiZ6de1A=?keULD|wZOwhguS{AolX)|n~{An@iY@n z2b*VF?MmxZ_tfgTn$%jCFIO&?aq-V*Xnq@(2|FO~*Q67}w(97u-|}v;>CiBfy0a>h z!~hWa280AyM+5{tM4r(m?8dUe=fc|F0s)CB@(27*zcnmie$PC19t+z}VWx^x+MWWx zZ_Q($?GoDN$Xms|$W;WqA>uj}0iXSPE{=vs8JE=?3n~tgB*fvoDP;+b{o?* z$erRH@*M*A#S7MZ^2gfYpSlu>np-zA7$sGO@3)clVPPo)OXPGccPy6ik5JFe!>otl*U~> zu+=y$qi)r=j{=N0!;Ku6s!DqML%?Zoq)$+>dOS>WlR2i@Z~m3Yp}pM|Vr#R|tl$68 zVtEbo8Y!%3MB5F0XZiKrzGJ6vG?)$XVLcB|mSaJ?S*qkP=i^(u^(PjJ$nbI$LV`hI zA}$K!5+VCd@Mzz#^EoZgQU}$}-^xbQgbizU3`BN}+wnJ}6^S$ulPe0gpiN^Gda|<} zR>X3ejHVsT$y%*cX9jwCjvx6teSj z67g50H-fh+^gn8H+V)E*Kf*!*?_z+LEFKbo=XvjCf74RN{Qrf zrOvh;kS@YD-ha`Ze01q>824K4nw3ATn>|?aOV4V?_Q6Z$wF#(J(ZvgIAD?&X(_#72kv3kLw;$`} zSdX0)H|a@a#>PU^RLjUI_pCFEL{3`?HMu_5x;5lJFKTab1(qGPF1yzBkrCBDcmF&b z)l%Ote`xuLOb#|60Sgc;J29UGkvYeP)%9wMyH64B+q~3M3ymb?*9YbLWK>1#e(%bA zrhBP!lHeyAq)jET+%;{>Vk8aeHVghpIEscXjy+}nne78`0r+HbqZbA&%<#`iAfh@v zjyk@8JO}(ZFQIeTGs8wk4t7V>lS!f{6&OD$;jtw22$>Kb{@y24S`j7_(4E%%0KvY^ zD0y=6j>1C<*l-vZ9~;!iUix<5O2sTd(26E*K>@t&YW?k-vce^8lySA0IZk>PaG!lL@cr2SpMXORngD^s5u;X*m3zLpb-PAm146Eq%;5vU0L@ z$9Ee0J}Stn2~AMFGj-cAvZWGC z6g@Psv=C!a2R;@rMRr~TMiF1EeAoJiZsyeMuDiz_R(c$vX zZl%}+jjQ+}6k)K%&WJzzL#fia*ev>=*gs>(jZs)PxU>6BSESd!?&|eCqPxVlP&Qj& z6`}yi`VWRK`8@lRV( zU75dguDf1a<|OP?&4#L9aVOu6+Z8Xe6%J=Y8#oi?m7^A5l*NZslYSIephhYd+CALE zsG@*p_70<0ow2qqRphQx85-r}<$SZ z6A}Da1(u+mQs-is*%e%^4)i@CEi)P$NE*`>8@{W$qvU~aY>;+kA91|lzIXcx1&=s> zN&$K|C+6PeJ_Zs}-XO=e`l#?$-eH02E3OaQqhpBk{FVzkFn^A-Nzkac=EtVOZmzNY zq(8rVTN^!zM(9PZ=AbSsJrFE%1$H*E9{~%H)=J}EG~F}jW>)+dcnEphw{*x#J69GD z#(XbHK7kPF_{h&mKC?^{lYR6_ycD{l>nq`o#%6dqO`Jiu5Il#h`u-~=dVSD)b{UZJ zQ;^etH#!jkZ$FnFy-H6R+T(+&;n>6u6Fd!T*i^0Ca>#OzBkb;s7h#8OzcH}m9doB& zpteSd{7{EWjiM2 zot2=gEuu8lks2sqe@NShPm)#iMH^~JT{mC4lww4jVUvR7$@Y2$B`Rjmq!5vbma$M< zB~i1ee-AnS&37&K{C6?-?+TPRmLf##A$z0gj89-jo*ZjG0V?^~=)hw}9?N9E8fPuB z(==qFzxW3bPXA*Bu-CLa8rdtSx8--=0a>ect5bO3gZGSz;AVHd^L|PURExQ1Z^3<&^hJ$9X+_`WP%c|=NCRM(t8hTuNvIki*Qlg z2B-88j_=lbh){g492ZDnR_5ROLj*>vxDL*$BfnW1(mVK@hCtz&2PvoY`c0eMco8u? zVK{o_Nu7EH1|0mhZRe2=gSYFXF=pdA`0~`0>_h3&5&mDLk5kmQ<~(_oJOn^rQGIp| zV|T9!coFun_Cyd5#@l(O-de7=k(v9xoR6{Z#vLw(3tjaZuZX0M8rQ*vN+L&|4{)bX z^AjPvW;RJ_15JU*flb@DR)61Wj{GjDZWb|1+J5~R+Ku}!kAxb{o+TC zN~h?KRW2;uD-SF`3130=z-y4oZ?L34BQ;~#erdYzYE!zc+Wa6tueRR@ z#xGx_d8(R9!Bj*Uq>8E)px7X)K{J-;l>ayk_l=^0G9>9^Od46HUPuQNoIma2{>jYa zQT}sa7uXD9Vt+@)m6<(cACJdCtzEBd!|xc-y}3RFz-2t;ogSaMm4B?#KjV$R8s=Hy zi`-FkwMfkGBnILl`{DM}bJVc#K2gqbaS|TsN)Yr4VClww;&^g4(A_MJ4+RHrkzND? zKF-CRfLnaUle(f5 zzw9qkyIPxc@Xq@l)~8lCkT-pSl0lHBD?Z&1f$a7kc<5a#}B7pK)tFz3aWsh(Clj<|RVdyUq z%k^8JU_Dur6DA)xu2EuL?l)Vg4?ZZrMjI<0KTbPp&Uqs$ zKhRPko`L5H`dcG-vOxc@*sO{X$&zOy47_fNaaQtwcDGry1az;03`-kjA-jUfkO7p51A4K+nvrb0KMx$7~b1dn8#2 z_DOM@dU2G$$w1;|kx&9K$`#nk6B*X9xTizf&;D9gmz=HKOuw7*Z07|_uYsTwOvy2$ z7Bf1a_LKuyTklr8z|ow}(!}_RyUH3^`sYI+58=~JN?4V)g>0K+x`(1FW%H(!;eF=l zqx#=6iBH?}Vy@-;Q9gmF`-b<^m;(2ZJq$>FcJ363*Tc7zc&dD2owGXT+i-+ngp3W(`kpQgJYy=LDuE6H-c<$m=Bp zDr5BM49fOu;S+oS1RWueUqz?gy-j4yf_Hw?+~&}PI~wFMa?3vVseoz!D1$&P27q55 z5Io9>PmHuBo=$lQ_3t5UefRg~O)Qf0bqd;7@k{}&ERa(r19j*5UpWd4t36dG3sDQ! zf0xws0fv+7sf`-FAG94FZ`lm~3^#oP&heN1ofISg#_LE&Hlilm63N2fYxZsb>j#0WKwaTYj*P?!s*QBHsnz_)d#$6V+N}XzE z(V0g7bc#x{ozDR;4#1!Sx5{nAQQMJb&Q^zA+@-Bh&aGk3m-!jo0ouGX)Ffq@n6|tG zrBSJ|@^_^*|Loe_mFESdN2Ghe4UzV!^(RIunQ+B7W70pSgGfO^Vs0T9L6xfkRy+`t zkZu!(7-mXnWZ4@Cl`EyWNp^KcYeG)YF%BI@CgH+m$MA1McQOx2xM!LGZmX zTIP?~ehht-xthc6MH7Iy|IQ4i^cKTJAzGImGD;#WA{t(vV?)%Mq_>a61tI+eW=sj$ z2gOsp#v#)^hse~hX|XL&^%;exvOv&zNLPsTJ$R^xL{OlI(1q>T`XTPlPXSqt zSB#|7#6&q#*ZLeU=79+*r8D z3G~HWX%YhDygxP6gql!4zj>B!RSegYcF{&c%&m0rR4B7yz?oV?KK&&4fEQ~3Gb+u= zLgI^@5`LZVRA9|{{5>V_rm!$}hq^YFne~?g|2mS1@! zh6WmDC%X2DMf%V9{06IqosXa>#hV8U7DXyQqz zacI8f96s!b@$>Ev@Vmk9!ge|Y%wTEqfE+?s62K2BR>D>iqG;|K026>nST&5h471-? z4xl|iP`oik4DH_NFWTHte4apZj!;Um^jD!QG!OX==!L_FEBsR~t5}QdW zz5)Z@R^s*u{LEyc|8{C1>HX1|H~(^^Vf%-z@-|ln;rU3d@yhVDj=?V=@5S>P#zcWN zj-pmQhMH0q4uF@8{yYc}UKjX2cV zl+!QoSY}b?p8lD!$Lg7$iy`j~+1zV>O))JlkV8+0gb|@yfS^!a`dTLQnD}~(@TuRB zNAS2-BO+Am{-iiFjsV_0ipWI}zO>VXJh-0Nh?Zwc04>L+dZsyZVt$Kr6rGvhel5;n zZZOBRzTn$Dd2wGt%D}?}mrWUFG;rw3pMBO#j&N?su-X>h)ixa6-TI_zAF~7*H>)rK zHfVgd=5>A+oz)T4^Q4J!L<(;7vE=ctysCVs39fQMlFD+^7Fg zg#Ph%WO|w7TyFT}?zTK3{TYG|UAp!H&!Vr8i;@{z8vBN)fRe=US*N>BqDO4-+eR^dRlnKbz+?0)>|$c)=6h*N zzjN{<^Hq3{#(V5Xe9?o104^$eBPk=LCRWwZ!%%EAPwuv48@Hp8W!KOe94qqEF#q=y zTl!awWX;nyoD5+idwSpacUoiycK@}A8!z_U!Y*~zwj>JKSy|?lAaK?&n+8K<@KJf# zG({LLn?7bM;xbxIA$vb+*Mp4YNAxC*+#1oa+~dJv zsm#{(5y}|3N4`o39<@2+O&LBtUt_>MJ)?5|njFps%mjgl+-R_9?z|BO27bI{b4`q- z0=9y*J_xbT8Lvq(;GXw94G{Pl_GoCahS_?c`666Wrv2A`BjtNF;WZ2M!ZruD&c}W6 z&kKFdr9zdkh7UGjZ|rf2VB{s18k-A&mkE(h! zM@J5_6mM$6R!n;hd9JZ4y*dVP@9>W-C|?R_TY$fti$x>eij9a2kp4FZh(y<@yZji% z90=|B_wX%;Qbbcn?DXHk@Llu2H_eVh>#M)kV|OqYwBp*UnPC$&ejG~0Bv^UkRR2N7 zC&R_y!iqK%@jGar-C16jQ@l3I&H4}br72t@{r0YDNx{^^*MF(~&I>^5Fo&7&&%L)w zV603Rb=O{HT=on*_c~nSG}>Uk%<_#_MRrQ8k!81Uc0-15r`2@jUgS+jv zgsBEiNYbG(X*@I3aC>c@Z<(1rRpH)gPL3$?PU;=0S0o1b9|VfIa-9Eo2b~D##!8(( zr!SMRG5o3d2v`U`%ujPp8Fqp>#M}LV=2wvU)H&VqYaGD1o&fkWM>oSWY6R9*tJR=> ztk8xHAH=W2*RBt6F=eFC9va(+R5J|&_W4||0h zP0e(BT1d|-%iALu;KAtzxK7mH>l(>HonmRR^)Ar@vH*JItC5B3@&+)2r&a12=s7X- zZ8`Ar^;+&>^U`HWb_cfZS4idG%JKCFtmqD0U;)XKGCyL}dUZqf42HD0nM2Cs?w*q# z#V%Z~Twvz3z8%wAqcO{wKV-1YOdd*npIG9aC?eBk@Wq;3&?2$j#kM9}lj%InzUlsV}hpxiQKNyEgKihsTDG=nD^G#afxxTNlpL6 zqxmGzR^$6{wjIN@6H&m7JD?$)%q%i2vE1Jn`XbYEQZ4|us38S6W$j?>&h;cTMc#=? z%!jLq0qSJ{Q{7|@o!jjG!8KDYN0mp$@u{(A`-$5s+zh9ALraHR2r~%TvUV>~<@9M! z`{Ub}v(JEL%xy&$0`FE+=a72|m`N>=Hm1cPPn=@svWA)Xv^zuWPA@y8T4RhS8OBv( ziR<$wf0=miyx)M}%3|jTF94s|lUF zZLYDMmyWE*8W+-aZfW7v4QBIV9Bm$ZL%C86XKigdnR+u5dWlnHXL#odtjmKklYL0I z-qROht(VDW?vg`o!bgOwGaPrjt&tnBIk-&nsng6LryfxxoTjIfu_qVBcx6 zOnJOI#0fIeJA-4sFYU;62u5&-M4apH`aECs-+hKujCp>*>eSrwVpn`QMd!y|gSj*! zDjfZq$8A5tvCgrvd^u8P=G$DI(bAIL>%=}UrMs$p%S89v>cG_mt$;O0xwBQkJjd)S z0^^@!sRP%ThoC?Pbjx_h%&mYMMUsAU#H@1GMsa&ggt&k#I-*G)S|*o*zb#Lpm+3^K z-|&z8u5ZSzjc(+FaWWUywcD=7o+UKL|AWPwWi3?OxvV(47NMraKK-W-|K>gpNncV8 z?b0!|Mk}^7@PVdcM%kh@ym9cz{9VJr;{h@Y4ZWZsQ=;5-;ea*Qf?T0`%@c9)+lKCj z9~D8Z)VU3R2s9%|N7 zd+Xoyf8dYe8kF2;4sdDosvOwJ?v{A*Ym~E&rjK&-M^8Ss{FE``8l>JQ$>t#@Leuq< zI|(hAJ9+CgJl_8|6YcdG_3e zzJJ-TcqxCFKj%B;(Z07l*TXy48|Sk-?&KhMMX09^UDI2{5N@{>f8=aY!mezaX_SSked%gOm`htRbF$2qk6S|6ZnU)pq zB_K}%x(dE=Tbfp9>DHBW4S8FGF-%s}mHl#U{|yv$Q?^~BU`e5Qa= znokE{ZLrp$owMFx;`usqa6#MN&|LJjXPsL9#PJE2ey~egZmfkEe(VWtmKNvx>K1J?F?`2+Pmb23;5Iu+ICOZh>hua@B$g20<@h2 zyY~EgYc(AO1lC3mzMLe(jYmOXS;Ixfs>J))ej|Q&l06rf`o?mtnS=tCw7?dv@(BkB z#wyoQLz8?;9f+)k3jG=M)nOVr3-KeKcDR2UIj;sGU&~xWhePk9?ZPww_@3$=N zyU~+6%&7m}rXvq;pigtQrNNb~+-Twg#`T-=KA3j*ak**2?6?MMB#!13bbYcb8;H4f z&0T?BRgaL@*MjaB+Tg}!yx{uXk;1O+zD(t3^O02Jx-@X3%YOXO;)>4h?mXqVAtlMEwcTvd{<(9;;97yD|<_wksbAk*l0G!+>3pmZsFO8#j5_*ab`Lyf24z+ zu2vnPSrHhUN;-O9s*;0%Q2KE(W5;xqYCF%@QUDf-4!CuTItWumn}4#K;$~(tjdsc% zEXU9!|?kOzquf!3>O5yL2&m zVO~QngQK=i9+0J>p~KRM+rkiNX09<_SsbW8VxBZvIqCl;f@a7;fbz97JswMIE1U5Y z^u;T(*Os#t(VM>;@oKLzGt=TSk*9+gkuI8`ZqHmS^;bXP zOcz@Z7;(x5dr#`=w7geit6gR+oFA(M1e%~n)>QuZa}rS6yszbDsW-1X5F6ftZINA# zVl{Uqp1X18REsuX^&Wr)jGCOy(fGzoXS!d&^1GtB{KjGr_bNvFc{tJ&BJUOj=C;F- z?vKPKp%0%Kf_7k5m4+9FwE9(i*;E=s-SxbtOaZp=*1EZ-f_AMyEj?D9|VOL$veA7{U(@%Qb|gvZd$HT)mW-cRG_ z+Z>IdpO>wCtmnHN9KSv{+k{xnFEe!d?Cp>`o5kJ^(64V--ZC=!VC<1Yn{UT$cQ_iu zHrL2MI?vc0_kzaiG$IE+=e1T+jF|=Ej{nrJ!JKaMq)b!j(z?4?e?on@TyVJNPZxn? z{haj@k}-%<^WO-bgT6zmd#v=l@IMrkpFEsc?SQs!+P5>w9;(mZ=KElbG7ulsF#ghm z<#R1UuQ<8j7(^=#%Pij9_5paf-niSeD+^ki1~~4yGkUiZhVONaW9&`^x(Voz&e1v*Fc0Et-)-=T>N!yV!n#`oldxR zVwdgsbssX&0L)B1aBG`6?M2}=bQLel97>xj&VYvQ5>^~pHe1U-a4|aJ?b#j~R;IiQ z0RenR46Imfzozdyq0I~TEl+%OH5~18pZ#Q6-VmgQKQZ|}&Fi7XERJx47`?E3hl}R? zPmamXVo-BIQS;zjh^Rw6w(+Tm5+5nE0vVYtRjDIeiP3PSZRj%(|)p#squU+$A zQTxa@6!Ran?pJ+7GyyceJvGPYB}>`T+UoA$u$cHlg((f&w>J zI0>6ybQ=rH#mrhsYSeyeM5v#qvD5kW5@`oFh;Rb?->mVmO zak~L|K?T7fMr+NB>FeF^A10GeV=1zNyfmX_hZ5ojI(+MaKorfj1|JDl1o;is^ANX& z(v~b_eul-9cF)m^eHF>)M%US(nx8b~K&Dy@>a>g^k|b@>5U)|TmT&dE0U{DQjPovT z*#U)$=DaoO9WHbGsfkVM7b5Ms2WKK!96SZO%^8${I3XO16kyH}gopT&3--IJ(FN8s zI<{s&$Y(^pK%MutKql^pKn2kf6=mSOHy5 z(u8w=FQOY{C?TZ<1~1bf&VZK5JbnNnQIu@Zoan}aXjd9!q@jU?sb^|RvS6{HrwjO- zT!D%d(HmOVrYJK~)0>Uo4Cus#d5C{esDDw2e?IK@&bbEahSb5!0eKU!rngjFd zZ42QU<(z|&uPo$|htnP`BOLjTW{KwF&1Q*);>P2Y>yhzelmn4@*P=38__5vP-1oHpnRKVgF}#goqSvh?Zm;rcvi%SANm> z5fux!)e@0@k}|GWO2Ku3IOI+lQTf-MAc7DE4`K`=4H1!fvB!d$PUQ1)vQR3KW)MF| zWdFKC0fG?^M^e8LkMgAm8xjN+Dg2M*zg4fpPwFAU3+0lS2Fb4>oNs6=!@fg2f>04S zD?d0uU-z1^ZblxYDP=O@>?jbnL2P?Mo)VUaQ~~wKLe3KE!Wt3>2}icQVL-K?Vf^rB z>c=ce?Lz()2K+SuNI8&Cn(kYXx;D3Y5cu$TU&IiIwAD_j*F_ohxFyDWA!5t>12fo> zx(`8!mtZI7!Tb%g)E446@JNEt5V8KDh(d5~CZ|%Q?vDT;Lf*m0o$|op$5o6-0k!_m z9%yR^{*f+sAzpyME;(f-M}G4=)+`}(8Xf6F(Iz@|{VwR7I6n9qC+dMCqG@dCt4K}| z1n3&Ui@V29-Zp_dM{&8M_DEo`ON91}YW_Q;7ohGCp1Z-!L*YpZK8zPzFS{cS+n<(8 zBB86 zy|Vqi5NRzUXDE4zKsPc3NjHSmRr3Cu`v@G-T-fU4Ly^rz-_(_tkAy`PJWIjY|o%HOtEI5=fpMdT&Eu zxLwcblDFACU@e2@(QKsM(#gJbErarreCS7inMJsaBPF|-(h@)n5sd1`gFu0K^=0WR zS(I3OSN6A1ww~<1H*EfHXd#x^#z~1Xsr$7O-vs6|h`rw}9X(?w`~?p)!L3Xk1^)XF zc=`dQ7^l7j<8t_24O}UAVZ$npIgQwAiwbaeadaS<^9-O==4f`2r?>Jt9zce;ZP%@i z>T6Ssw%bBe)6Ki!w}A~2pb{6W zeGC<}L`2wRnFc{l(Sdjqdx*Q7sU*!kB;BcSV|ZL+;_V8fK7!o*8;X$P3Q}eex zP!HgO9eE|vJn+eeg|%1%YJTOf`QVfFivC7`%byAbBD?k5n&qx1nGGA#Ng7*%wyXOv>hO-kXlJuE1pyn6 z>x-N_jHn5NK?YVC#zRTime9EM)22u*Q7>I@BwX-7D-Nb+U0rD_JtBSwekV&k4tyE^ z=y5b;YJELnnU8x{ruw560XnfUDed!{`p<*KtEt)bUjFrc(<=ak+N0@M#YINnk7V)W z(bvern(a@T@I$4MTemXmzHw8y^#zJrb2$a_Pl2D2j^G|};7zdLPcYz|FyJ20;7w5A zm<}N2jlhMgK&`evr`fxVE-C9B{p=tf4;!34cv2^?mw*60Kq);yfp$OHIJ)E*ySQ<- z3^2bhz&S8RMuJ}D_P)ijetaW$>=F0HRwR#1MY|I;L9ZC@Tkl;a$-!qGs~h_S!N%lC z{U6<+f7O)#A;D$j;QU+SZvvW?h4bGU%YQjTMNOTJoh%((?420I?d@FT4Q)*sME<)3 zSIWiE#?tuTDqMC>=zo+J7Pj}$p<`p?`VSW_6AKq3Arm7L=YMtK(y=f?GYB~wo7%Y$ zaxs4SZvP(hZ-S1Q>B}`LV(1`gYH4oa^0z9-|7OGetKj@^R!**eH|L*LPDalE%Z3|2 z`enmK6nlJurk@ofbQBJQ`VQ%EhIy5TFn0_wG_!<+sPc`D;q7rh%TOm51}1cm7yg)v zsg*7K>J>(Bi*`(%#Kc2#Prg$~OV)%^3y_+|@CO8k8j!OV5j8iC44 z=g-I2u@DnmwSpY*jtRZVFBdMoy4rmDyxk%?Zpi0^t~^)vOALLXVuo;8cquy*S>cFX zmqLw!fPYq1?Ur^kFbB3uVEchx_hii_)En`dp!L`Nud7=c_>Ad}nui`HQz902ZR`BkE4skK%s5b3kYL?5m6Tg}!Rv zKh^*~NXtLq+a=%mPGVnpJmOy#e^J~&dYF%VT>Ua!8(zV*F20%*y!h+xxF*Wl(W7a`AL9 zWl(i;HT_4fu%WZ*-@yHU2JQdoxn=#|Jh%V!(Ek1W>%RT#xc%#x{il!i@Ah90?q9d; zS03~~y|jP7|Ibd^|6GUTumASTP5akF`;Yzp+gbY$PwhXB`Stxj>;G$CU*-QE=YR9p z{_WEL&0qVsTm09a!pijTOZm^9!ur>g{r~jWGBa~_ zn}PEXkpI{fq!b|$W=I!ethom%VxZx7@YEni6EjI+D>f@OBo!QhnvOMF1=E0)D`c3k z4{3w;X2s&e!+PoaZobvriUk4mTKyvz3#{kU@{diw&R0LbgT1r%hZSo;`^M`S?(`*| zqY&vCIKEB04qh*q)HM^(6*5rR@%jbEr}cEfBgq^0&pd#Alb^M{(jz~R8r)AOtZa%X zb!EH6mzA-r8Q@XSE2|>*Xlh}x+U5IGq_;1GH zitV3S#{#ok^k+$IlQ%)=6K-zlu0guT`pHl8dk@lH1Z2*|!p(1qQxly1yT1cwca86@Bdy5%BV>ALHz`y(MUd*G6WI2i`7K#AfizwWJsx{T zdTkHrIa0-urm3tsaBb5AEGJNd$q&IV@)P6}`xE20_!3oH!Q8~b*upsc*hOZ$_e0+q zj)e-!o*>`N8e~c!Nc{@1MsIx;M!PG8{$_CNw!Q}_xgm6P@8mX{2MB*iClVeNF^v?~ zF-f2ah379^l9>3MIE`ldiEiH>05BhRgI^^(cxm5cJrtfoh0B_x93ysg!a30Fsf8>R_491h;VJFa7y0Gihw8s3p$$~UpP$G2(Kjn-agm^$dikY=sFzb9f%=&pzT>5Cqlb9kM;-27=% z37#CMeS&i#;(<_0lAhRWHkM%N6w@>58*{d^xlL?{mv*2}LWB0>NCkV#in*KZh9O=h z)icJpZ7vSj4(!<9(j&qrr>(zU1jLgILXj6I7xI zy-H(2DZjJ*;MwCpyUzU5Y6a;I{V#76Vg-7YoPwt&5polGxcqe^ny(0Duh;_6)q9mb zD0!veZ#zlRJv5i3LWbySACBptL_H-vei3M(!j#l9jJ;*A$>^u?O}v9in;C4an!gNZ z2_qluqoua%*Ttgacip=i^>cz+1=TPT*!Oru^{y0l(*g!Y)DThU)ZS8s^V!8*bE65-Vu+s@qJKXUN1N zU|?=;%ag^LxnOE*na5$6MOD1Ct)!iljf8!4%bCc(My|!gtVmd`l9c@~$iCNSl(qH? zy15Guu`kZ;O;<1bLrP%g@emT1dhyE%o|&2K_(Iz^jG<&(N)a%&$TWoUN-3+3Vsc zSysA;?P(eE3P7K+~e|t z1JOX2M}NFUbsRQJ1$!!0!kk4+@Ku(pDSX(232G@?#JF*BR!P9&%g-Tm#&d1WDQ>#z zb=6%THQDUiW3-v7fxv$6sHl+^=$i5LyV#?HVBcEZb}b#)xk%n<0%?o0M3Yji7MdA^ znzV8*EErBeCKjdg;Hj1DRx>UzbH|yWBpgicX$`_n$FmK(dSU&Fgoe=l%>~Zn1U+9L zG$vIndY}y(_;ZOSj}*^L)r8Adchs=lohyF3C}FGgC(8O3yajdZAZ!7u!XgB!7I-b^ z161znc+qA~jN=fdY4SEoE+JgB;?Hd#M0ibFf3XM)-D2wLILcjWcKu}Yb^c+rj8HgY zHw%7?i!Rfw0x*l)NZ6Bk917d1z`(AHdb}CUpzK7F?=)2|;7xYi&di)Bi}L1f5az<8 zt>c&-63ewlx`J7FFGU=EIOiY*z{sCqv-Fl7mGiodZX%%;1gFWiI*aV~q~i<-f-I;kk)Hgwa1#Y9!s{OXo1dVMY2*e*SJ1x8fmTX71R_8(xk% zqFxxMOX!D9)INyOn82AtVQ`9+@DH}BthDW2((G$%wkqc_Hl8=D_A2)tW8!LU9i+t` zGget^Uu!q+eYnV#pfHcwOhqo5Goi`hBMs449^a)F z(gyLdEfT4&dS;ctQlg#rnBrp;#;7azASr{S;{6gsA<@91ktCIA&|I=XvQ_0R=)IYz zjh^akTFR##3d;>!U`LSHeWJ&AdLoY^k7#Wmq2HT_a^BVoe@+Ub%I{=X89w0s*3=AE zXc^t2T3s2vkyIB=UcgN=r6Ws0Hud)k_VN|?3#poGk)%Q0Gm*IV8j|KX)bub`6;*PI z?l+416(05LSNJ3=S!@t`K9yDyo|4HXI?Hi6zmYuBhoj!Bk&I9?QpWOG601``6 ztGE0YnVQANb=PsLM&sV!7l4Y2*X`^H9BpG_SIZQ7`bkEjfDLtv z50$5k{nQa{3ZVFM`3~eot`5m|EI+E^>YC}C*!NC(cJGXVqUw;s+@O(+$iaFp3(K8; ztMRrq-fngSo615=?@k%XoT6$nS5*yCcW^V+L(!X3y7)k%-n;%SZ)hwM>|j4G0JCI& z7QGnbJ40;H*b_R5337af4Ra}Kp{{MZ1q)(ejwVI(XO*R7DC8fY{`5T~+YsK9`j|Ol z6Reu1@|Yb8bA^>W7UvYkCvih1OD?BGfU1{Hs4Yhq03{H5SG0;MezdHgAF;Z?t1T_G=rD#A)uim%>1i*-&W7x+6Y+UZpla;*u-qis`i|9ejxe>W zF=+bjc83#VdTz_6UE>`by94&JWml_4;BT`HU3S_Ox|N%V zjbZ@GC>^sJ7`T@ePO;=zKx1DLq^VahFioB<9X5ATdMAq`1(sZ!{~EmCq#`+)nFReH zgXMdOzi0t>V4tY7kM=hVJX`PpgrL6fQw3>>)byd0D6-tPF7QXJM$Dx4(g*Pr&9FM; z7M$`ZcnXrcBagJ-=>ya);zRaW4s5nL7)d(ql_ z1*2p-F^cc_v1E^FEq0dA3(g`C@RdB<8(jEVdljv>d-LlL=aus;cKs-uE_3hOMWJT= zymL?a$0$DM(Qn~qHOJF@jdL4s)C;lWn44%8hoqW76h(v}y=ul?lo-`vMcu3Z2XmCp z=xeDS#__SKb>wL(-PM205MI(Us%B+?r<>E>~6LO<|17{)Al-7=0=4~Vs(u1`N36%TEF&t@_ngQZ>7G?@$oxff16^Y$Zp-ySM zYwXOH^e6CCk>)6ncXpb>5@U}B&(gs7GH7^jXGajK_L1z;IOsFB8>rS4$r6L!Hk z`pD|~_^|fm{+biN(T<|$=HGyYrqv23$D0nrMjqAjBsoazqS^X|re+T!O3%?%h zx7^vS{toqnm4%P-D9n*n=yr#n^@P56u=|@UwPr45B$JwhwEB!7;JD^ycD1;$JD-jnIAfAk@jFY!e?QBS$PAToVvZy2H!B=Gm*#Pjq5*byNoYY6&5&O`i z@`m?nw|P)5*-GQ61#sUy^u6OULv%jzjAZ9a-MT{kvppSFf-2%{g;K%arcCjN?D}G8 zxLCra)I-lkyK)4#QM^&VC{m6PjFhAYyOBPRL0CyToOopCWa#9V%x+?sm+v2SoU*VW z)CBQ@MX|ngPTM(|mgu1r*cUmkm=7TJbgB4f$q*q`lZa&%(g?o3%-_QyRPNH$+!g^& zb8X*agdWvs$2AiRPBO_3aeTR%=!wjFqDSJ5n(1#tF4z2CZ{7WxZYe6WB+P$!ZOZ<3 zy)7_s)c<5N??-nZ$CJ>1?T?Y{_eWV9@l#Kr;B8%X|J=&a*iiM_Whmh*ox*3cKp;uo zcGfXq=9`|eBr#z%jp~aM+a%yas~C%-AEKVrMrow4WRP#B3A|#ec7%ycy=C&TA_uTy zaZSh)CL`uP51OZ6MY0$rlBVBjM`5aDOB2=;*7Md=-S?`BS)Gt_8Akk}$WjWFVHMvc zrD`Cvgg(9%=VI+9_xTp=nuhJQSK%C7Kn_R7P&kak8VQRjfvMa*8$Ds$Tb_j}Peztp zDeuJXa+cLYfA;k=%n%Vl;N`cv83Liq5VAi1y9;l+_wSKnBQiPe_e5$_G%D@}*Y%DU zogCYZANz~+js!zGbxFFrOD^u4^BG?7$$Qk%3OSagPrD2q9~bKx(7YRm!_#2i_ASw* zmrWlTjehQ+w|SUw*#p$;krnMaLg}cjXaGtNHYO@)RCgMD^-RSvYE|6HQ3RN=WD7A` z6J7z(bj*_2Zm1_Lht_R0mmIl>$w80+lM*>0nQ82UBx%egWaAMc&7PmhjO;T7$y<;z z7*jK1N+?)l$}wax0c0>1!$z94T7--ID+1a=6yr>{r<%pFS!#pA2j-q~iU_f5tI>=ZgTZ%%;g0ng+kUE0EAJT1K2I#cIiAiertvzi zlbaRn%6HT{z?LhkZs8`q+?tdg z?L|IkN!BeW<8pp1b?XbacZS25rrl1j3UEDdaG3MAy@!7-@3?wNb^oxmE6agUf4SNa zxh5>F&;2$n6Enf<>~R}o*Ky7Rwr-#`>%IKZy14Poq8)k(u9ytD94otHvusa}dlmx(}pVGwh>^AP#-%;U7v4fXSpM*z_C1Yt{Hiw;zeaEfmf~tI!DI>x#mG1>zkVfX0}>WHkM+dM*f=4neOMC^<1GJc zUpI!lh@6yk&_$GhLM3-U6NQ3AvX3+^eTy5C-=CY}?k+5c*L3!XX(?X0qa#N9e6Arx zp|Rbx3!ud!l|wF1!M38OW>3bB$^Q;C`e<3cQ8cQFB`|Kq)eX?Oi@=~URuG8NtKuu` zwy4rMXY}i_l^9^|}i_6(IC`Icv-;y1PoIDg2r}pK`otiuM>)BCz?; zP42r)aYD-W>iLX+86ywsXH~cflt|_w@01(22~p!(s>Twfi1i}I4bo{J>gOU&itJMb zT&70S_>G{(r}lE&gC*K`Ppb*kQI8Y9uN8W*e~AZea>nAPvPTXsd1!Og8ditFFO&;q z6Ph0Y7aG6(7QJMx(EES{eUzWT(BJXCy(TdjS^im4|Io|r1e!WF5$~^cMY8FuRg2Rt zguR{WK^v(83R`1iE*E@)$5I!jb{7p%+uHj<-D^d;7h$3aV(b$GD{&0^@t#{Rsd^{D zEGvk_Lf4B+8I=ip8*8mPS_Kq0(EqnKGM2g#?BYljG&;`WXcabcl((rSh}$kORl%#qf!&Zd~>Ir>Ds7N2+WSn5IwFTY^( z-)94@r$5M(zE0Ulj)R3W;3U-@0Gl7}i2}Po%+G#liZyU4?`hA-885ENA7==xe4CF| zF4D#=pb!G~YusSqJIH>H0Zs3afFECA6l|wl2$g<~0_{BC=PGmL%YjTyKhq0^N$QNu zLzwv!hiU50=g1c6ND-lQNSuNYa-a&OZ?_Sa_)CBjcoEZ!JXYZyJ$MG@M;Wv1H3uVS z!u4}DtO`E@iw9D#07EY-!?Hlk^>YNQaXf~sistwkK|oxG;^_B64Z~zul{aK)3Fem` zaI8WPbo;n5hF}ur$RAW~@E3z9)sWDJOo@bZ;2>K)9l*SdL5&3BhN*_sj(cLM4e))f zSYrGWs$GQo#C3#~1dFfTgW~jOdXnvUIu!YlJ!Rk$e7{_~;rqVk3y3t?JLGun@rSob z#K!#c;TxKTYlnO!mfbA$7J2pPJ(Vkv|`unG$hqlqvoDod^@0`iK4zPp+1jRDOTOYgTScmtdj%M z%RwH2`%;2xt!XAyz4&{gYQAs1ea!muUV=+ToRhYiR9_?lZ~!h2e5hveh2mnMZrEx6YOw-IitxfKeh( ztP|w9`0Z~5hDKZ*&#^rGyRr`^F31*yFzQ424^Nwx~i{buARmr zohuY}%|T7E%-9om3S)*(%{`}vjnqukaZIbJ`r`!>352Y|Z>wkvlw?hvn4U8u?KCGy zXl@4)SItwU=qk>Wnw$2j1F!MTux-Ss1v2u>yi#$y+cTfo^2XL7UssSW(muLyRAGM&X3cD z!1oD#FWNE%1l*-U{1zLw(a11!^wmWIuF)f}ZY>el-gTSRL;8W{MQ8daA7BomQ`CMd zp$p*G%^;SwMZ;K8_h%dHt4g8Gku=7uBggmco~3bJ zbi+E1sz21Q42(N1F}x;c2X<4>4AywYT4L4RycIVvPjX_OCGKvmC2XI`4jEFA&VS9A zJBL}4jo4m)yqq3hx|%_77|&G4ox$hU|)f@`pJO!}-7{w<|VLm*s-QY@WNEp7b zRf69+;J$a5k;DRrO5$KbFfPj~&}nQB)U>V2-ap&;Hal`^wb_u}sYb=jK|hO2V~}BM zuoRF{0i&GL*`hUBYA3Xs)1Iy^S6Z~~1+ky*ZIv~e-kd;rBtld6h~FS%U~vW=fvDX` zitrq}x&}ofwccyuI7~4wIh3+pFM4C>f96Oq8s8lY+ufE;AY-smx=qpc$Mi{xMWFDI zwmNXx@wD@JaLZCKr!>@Lw5f;Gp(go)%RFUVavI0Y?Wr>tUnXgDm=!YHqu{o*353f_ zv!Cnp5%u_)!DD1>nZhG}e3`PXaLi!exL){1EvEeOc~W-}jQ0f2^3qs|yRS(`i!`fk zo8qMt2e|vT0{qOT0jkuo4qssuJ)}eo*VoRrJI$4|RM-a12%T80jJGq^(~6HL)GD?z zE6Wi%2Hgh7ac$U2m+hC0tc2@XXJ4g}_4!oyLlsG*y7+RB2M1vTzIUsvgoY|{A>JUW zes5`RodHQ@e244&h+tZdYQz=v9NIiHX#_ zp4Jkq7HMDBQ$0`g-bS?ge2IfZk7l(q;Fwlwb;zZ7z*7o?C*kKsCc`Q9w9;#Nf_ZUF zvCqB7xTRXRjbiVgv|0nQhjB`-{Z4T6)g`FuAeyq&!iq63w`DWcRWJ7RS?L>9ve^*r zq?KIgZSc0mAe+S=ZK>pBM!Q?v#_aJ)C8-y+AzQLqT@)Otjbf90_5&Jj>m=Xho;yzO z#d})h^T^Tw%QfuqSS$4Q_`B|-#0LxL1ksh47k1s`@2U|7u_VYTTRyF4$Ij=%75d#a z!uwWm=RQOe&yNve!4Wcj4ZtZ&TUa+w5}|rV1%o_i*W7P*lZqXhOq`SrO|KAd{MG&Y z&Yq2}Uk*N1)u^(;(-k6ixYm%BqjayqV)H%*c(0fBb|Zkf$DGXKuSDN%WTp%^GWF_y zCQe?$1?^{Ak z0&Eb9MlT%@UT$dG>;}JAZ2G$h87DI1mTm|zA63oO_FlR^w%{3+1!4_R(Cb&XQIfVF;b7t8yX0HG@QQr+RL`;y+qp)D zlUR@nxI&0U{D@gPb>(`aFFSI14Ve~GpJv)a4Q;o}JQqX8c!1C0JiD=TeSIIQG*4_M zwr~)T&;7!Rb7L;P7w|c2N@f}Y2DxTV8^c+r94eA3q3nK!pJNJ+_mHmoXS9TRK}ck> zQU}g>hk#4;82aRK}v-oxA2@b(W3u>aG(~lpDV0sT5>_l`FlnLDF*Ho9=#g^FF+uqN2=G21sjBoD; zjE6?JPtIlSG~G^1>!Zpza`0yPqvOs;t+2QVRiMah<4h>4*iv^@FEF)bZ0!~Xm~FpJ z84+z>Hfz^-Imjy?O1G(W^Hgw@v%)9`V-`EV$h~X(Tq3I^YFhnBNtfQsi!m#-SP8cr z6>Rrx)LID4>B$Fw3>TX~Ug2^`{qC1YDdvSxoh_G!!^tErwHIny12$yJnOXA(gld_cODI`J<+J;eypacysX0^hs0vpH*lPaW%!G2 zW3E9|Ck3moZJ02vZ3hc6I-M0^nZ?D1l?o#<8Cx1QNmm(^nxca~G`UEq zO6xiq-QtpdPkbR{Zae$>$zf$vK(T~=g^MGnBR~Jos38WFhTX-)t3}XT^M3|vRsh$eUu(Q4tB2Vku6@6gO@xkO$+#|hPGG~X2 zuCLVVyUbgM&DeA&SUO+eqi_@4#BIs1AodH$_95?BaB{m$7(uKDe<;)Rk}IYQ2*Iua zJpLM^Fxz+@Uc+BBdGAPQcpCypSSl`RVyy0v_yez?8w5Laf^&moVrGAH&NpxzAj8hvg|-wpmoOPK@=O!>tJ= zUW+W8RMT~};$D_rp*!3LqBvU4Fw4>ExlM{XNymMFx+5sB1)g3Q5^oqsbRDOXnbW0cu~!b1$c z@9Dy&JkhD-atYs*@ibY7`M%F)*s<2#mT{$eK(&?_i~&L5yO$i+aX;q zP%>#PXClgwkaf!}*JhO(A|cN>2A_@RZK(T2@7q_mw8yrevE-(1*{UnmfV;wHr2Q*{ z?tAN!+__RZrQGnxX4wOQ`nkZL6~6*2zhJ9R>G=<%`47|5_u$fZu+n$*`48Ip4_38u zZgE@1)48}4$a?JxRTwLIxD(A6jYISo4CiWTkn_ZEwqW2moGVT<1RzeLquPT|VvDScbY@9Yq=aTD=TVT*<94OV?=V zcb~!e8T0crU7~1e6c2@ZmW&#=VaGuL@1m%;udd71wF1wd;EyYKI3;7of)++of!f*< zlNdfR!b(};5Q636GE=|Ku*d^?_+f=wR+j4#ws@%FCt`v3FE`1e53)oRZc2^M_-QE7 zJQfyiSe`I?eNdKsmcfYIqnTj@s&(QOBE6o|*omVV6n%tz909uqji`)qA^kzDamO%? z+{n08S;=@qBhplAa&aSKT#}M(lHmlY8xhiH8;b0)=~U8mN+wAZG4~puk{Ijyek1o; zP0I^Rjoy=qktk&XdrbZQH~gf!la0jPE9y^t3%V?S$S-zbp$&Uv6lFPQfrbP`TD0V< zaE^ur86e9=55zTAOoD_*rm(NJr#3|usn1=I|9QygNqs$%ghe$tZ0I@i^T=Y2L{`4j z4^$x5!d)Zy<9ToL*V^lE`l{l3dc_Vmk-;WuQ-r0KGHxUd%s$KdhvDS}WM+amQ`F&G zq8>!~{5Ys->=;%psf4h^T*xeRg75&GV4bN;V>-0tFmwM;aHeWw_y3X5{EHC&MT?mj znOXi5XUxj-Z`|--L@!*9bnV^n36p^c{B<@3gH9rt(h!{2z z^mf-OgM5qJ3h*7)>UUgqwncH8!HqLoZ3h=cZEekidFWieNa+O90%a)om>xaZETXZ; zhSi<#R(FgTV1}3cjhwC1>tYjpyoe80WSRvMEv;%5F{|^b45@-VBT`z*P=S7v&gS|p zP?|?895Y2ps}CLffGuMd!C6EKM^q*mO<9UAH!o0S2mP76N||rkAERViHpdXx%UTBM zPs$StQpZ`~hgjS&@?0;7IS>TK??}Gk@b{i~Snrs=!a4Z}M=~zqKf)`g)Lf!E2JH6@ zpI#H6aGDNt?iH)GPc=~BNzOnUf3v=2r=-ET1)t)KIfdo@kMYCy@5}qIIQf4NzW-ae z{Eu`m6ALthhNX#%g|p6oP`Q6e-oF&>U&8hu@4x9U!uLPt{Z0Rqz}5Q?#QooKOUU|< z!2YkaE$iP9`EOD47ghh;EqHku{zcpVMe_d-+Lncr^S{ux-cUX$i}RORTrAq+HL)fc z<4gFfn7iL?7C|9nK|SMyzS|5YYsJTFH<-{?(TT-7;tI>nKm-LPvqli%?8{i9=awYQ z^pTU=Vq>R&vo#QYdA(`*V<~B=zn=Jzk5e6bxyC~x!ybZ6IQrS5tK5}prTa$pdC&K*+4Q`&&UlG*rsum?>YwDKg3Z5XdcIzI?!+^`fA0Y~ za)@fh+t0yj7hU!m%#f>5J-x?w;h~B{H{N(Ph4}e<)!$ob^{J@*v%( z^!gj83zL>MKUQqxI*)zYJfdl?_vbUM51o74%Ec~Ksec%>E_`{tk>3pmeeYN4-`0(E z&U(G0i8qqFNdMZR#OF=s&cUUxUvXvE9dSG1ajo5#JoF1E1m~MUg zW6-IMI=6Jg?ac+NWXj&wC687znOt_^mh!Wlrb^%Uz5OCDY#z^#8=YmW@^}=|)uZ=H z$NHirW#(T;M+@i4@r_Rm++?ZocChDqr)R0lqe>L6Twxt>>gCUV>g#)?rQ7P41u?;s zS0<&#IlWhwQ|->f!Y@g^kDq;*2Q{(#W6p*!E)e`2v> zJOA01}O{^WJ2a#~qXuja?YKZRSK@R|Bh zFGX==`OmPvo_DABt4lZVFid*stK=dxbLNLbv97I#`d!`|OSd*3=8o(VZ({d+vGU3Y z9pgg={OX7u@%iVf>uP-)4qiEb_%rW)Mq6zWOMP@+s!2=#lZRLj%x}tsB&q*ZzFnvK z;Z=|G7j(BO?JCxD+RoDTxt6xHs#rJmoZ11K_qw4uA$i+IWxg7q);u-mfbq?;kZ)o9 z+N6DFb3^hTvtLc9JgohuczNauVZYadW<9@fI_k+mv(Rfx+x)A(-Ha~%^yJ?8(=Th5 zHJ2uB&DyS-=D1ic$dy+Sx4GZxrU7?WT^o9Bl9NjJja$F137-@5ZNvvnvor1wPO+B` zHJ2LN%ivbQkC|s{K9ygJ2*?}qPx$E%mtD>n^b@|$+|0_J-T;fNvwvhp@pY)ABBq}H7bQw+RJ+-BxO}MJe6@s z7CiB>ZU1_p*=NMV8>Jf4yEoevCog^e@>TV>$dZN`{cao&I5R6&H9KgkH>3^M<$#wVrCVlUEMTzohp)smMc3DR1ZF zX7!&B+#GkkYt)#X-Euj~ZH3Lv!1kwQA1*u|>{V`Est)JdsE^RBjG2(kWzb9X&x%`-CZc<}GT%bqoz(WW7$rY*gR2B}bFn=DU z@ac~ACoeT!`JUT|7mE*YwXv3rrC9LrvmI*5{hU`NDL+iWJ9#dsCDeD;q1{yl9PDFjq@gy(gQOx@<2l`oq=&gH;zVewMAt{&4fD@vwjD zzqU3!$=~hMcEYAD>QG?cXJ@}P*!8J7nO^ky)^p9D1vP;dtK0V_CUz;U$?A3T)OLO2 z*s}HaxR)21p7^-msbc7+1CM7tPwmy^a*H6KP5oi+@-=~Ve7Ti7W;GYbmtMb|5@26* z(Bf-zscsgFwMOpk*+*M1=(G%bc<6|ge8QSiqpm+~ADhS(akutXxTDo$pDOSDewWj3 zSJV|YUG_Y?L(QRQrtbPRh9&YpkLr~s*t9$jie>c>IvV*!OkDC-XHr64ctJ^)ukvGU z_vdv@rkWR;#;-5p`xJAKJa^?>;6sdH?2sgL)b8gDp#K*U11X!hg; z#fS&T#&kW{`8><@N&c6s%V<9qIOUS27j|K$0Vl2w(5E(X1Q5L$WYU4qWg zt_4@B^YR=@oUJAuP=0}I_jTJo+UmZC+NzgMKkj`r`Vp^GuLH`n%J-%ywrN=al7pT{+S_NAO{qPmxB-rz6&%p7s3tZdFtJ zsvqz53afX@TKqKp&h}UrG%LTowMeh6rKxAkI6b@8oq8G@KaMfGcDiZLVyFHW)Llm< zyomqHNJ?SW+3JOFxFdE5YNn1`GR*3H^I)rKGFrWdHF{_)ShMO=dF+w1Q3~}nHIIDO zEO&NxE(&_&yfV7h{A#Pxn^#?ny{o2}GdCpfomRh} z8=M!M-kW%&&w){mhkx$KZoa*7L;3ymWiuY_?6KoppNV0?cSj8Mx0+`;Jov)dp!cWG zju4ub4bS^oefg?IO;D|k#gm}gxF(%7pD(p0e+tP(%KrX<#KeZx*B6a$xl`Y$uM;~% zy0^A!oLgCL(emB#Z5*|)33-EWe5(#EbyQ0m^SQ?apTVEMvdT=%t{F@)wKmw7wb1+I zzV>YqJ4Oes_S6crZ!EX5NQ?Yj6y`lePjBVw$oOhfc_Afj&YBo7W{%;;ITP<~ znf7tV;pcX$qf$?NS!mUKVs+!ylNUpfQWp?o)iLe&X_QC*8F^if1y_AuDJWZmn@hvaqk4P?g(&5YT3QH~3m7j(b0W`XXdHMiC7>T#QjeSsWcd+rsCG&x~JF5*Y zud{1l{q*%TW3734C4Ob{{Gc6)x}gD2PPcJi6oxK1BE&pX+h}5FG z>3cS1m%q8q7Hrqk5p4XYp`f|WF?7c#-E|+{xqLZc&^mvysq*)m+q?3n$p&5hSt849JF9jf-P zn*C<=vXPe*M{v%yn78$4f79k&Gj-_D%bTiP5dHvFX`7q!lLq^BuhxnysegH8-htbe zvu+6o=dSnjJy7N{XXY-y@e4LsE?YdxJaI(Zm2oE>?0pui4e(YzHt=ELqX4BMBX60d z19CR)4S15e_feT%pULZ$>sCCmsf#-|{Hko94@1fnGt>7WS8tX+J(U@{^L)bj@3t?t zc&u;j!hic?@!+e6jlYk-G|NM+w_A>Dly}c+ZH>t#*H&`M&3f2brh;ams72H*v4|v8LYX$Ggdo z53HV;tQYxloXdtCURfiXLiYB%V}E>Ijs|O!PQkQOPYw?hPV?AbU69%u9$mHar&>zj zsiySB^X{;A-Lhj(+<9qCQ>@E`UVtFGQTvIM;5@ss1V6GPuOoG*MA;qz(5 z!Nqq!s&4yYGtxMI+^kCT%E=|AmOeF7N&~7+H0Hb>5%I27w<)#dLc4LR^Q(Wlq(2>T zMZ=};mZSP%UO(T`E0r&%j!6D_f+8&3lOYiyZqr@Zzm}u{DnLfQ>!EKxSoadea=Kh=4TfVxjYu@9u z38Hv+?}hBu@@uoV^ViPO+8le??b--`M6b(r>4Amv29d0y9ZSnptLG^scO9yq6Mv-m zu7{FeR9spgn_VmWmB=j``Z8W-;)^zY^})mRH@~_q{L;@L;iTC(ws1l}ndrE*u%WUPVpq zrGLJDsQqBO`ukVs_Ew&eGymA38CywsL>v;XhqtV++VhWufuG_Oowu_bWiaxKej;xz}h86QB z|44L~hUB}~rM4zlULVDZ+kNI_KmUd|4XbHA&w1(i&f(!CJ}>m4-S;b})av7YF7wN}c%ZOWJ+$lb;cFZN%#Wu} zoF~`o*yi(5N|Ty5Txp-Wcis*?*Bou-v->q}N6Z_2c)I@>xkN|Hr-k3M-+g~JHT3YE z`|`bxe|mBD`=}R7hwcpbWTocnaNm9|>YKl7sq=d!YZd#fA2sE~ zV|nQ_w+ctr&NbhmE*oKaKGIT0$t2R(xK!uVxQG2qD!$0%r~3ExyOXoSc=^|jV`GN( zUU?zk&SG)&u*HfdhOtLi9k5#yfBA!KacTZG*_FqoS3b0C*14-(b!FM6A$5sr#!{!! zkK6Q1xxCz9|H!qQz7LR!dAv#AG#9COyQS{#gCUFi*7==NsffBez}?w#$em)hZEi0| zu}-}0y|HWbYS~Y57s9W9wR3j7Ht@hF&UeS#Gi)>rbEakXHelt?#=5BX&+x%o!q@`ei!RwGSo$7^SDS|`1n`bpy6!K1lOD3ZVP>pS(Mm-r zuT^GUtG2}dWiacu!lwO0uQX1`o~iY+OQWvv@!KU!wkw7ydaCy@+Uya(FP!&f%eKdg zy}ldSI&KZ}rTet3zhw8lx;|un$@zrxPoF;$}xNKQr?ftu^s)w@1FHS(?o8X%*Ru? z*KD8powylyYySJ0shh7<-7NGA^o@RGJJ;T7-e~*#RkQ7@w6_}#jXfS#6ZaHH{q)k^m<*)H%-ubND z6#YrQd0tPrWp!f%CK`H7bFY$1pY3F8?_l?Kg{|$av9o5U<)&Uaax3EK4my+Ul0h76N?l2zdF`j|%M%{Z@&q_j!eQ-{sxmRa*1H$NCHH^}U9#nD@H z8~O$c!r!D!_>}4{lN8l`oMqISG&AJT>aj;nU*~3cJ~l|1;9sTvxxP-(eq#2FmF9yY zP2V}#mg(&8_c8T)#@+ffUW$K1NYBia^W5&miG_n^WbKL!A6Su<{c3)hqtdF&y_%Oz z%&oe6v*Pfc$)DrzA2s=Fe(*G<9+}!VB7!HlxSg~yF7-ayb?@*SD?JiFO5t$Y`PFR;9HMTa&`gVPmMVl`R0^q`j+GFC(M+`90}YO zrV+SJK4V?I>9KXG{%=$!7V(jp&t4_4W`-+{pOadAWM}>2<6~A$@f>TCeO1kFyoqOl zlil$#^DoaeiL9FWY3#k36Vl~s;VvQyy)W_H$ChzOg zOciXcPHq|OWF0uBkaH=qaYm$_@uwHFjjh81$2fz+=();8yKR)MJd_pG4K~CC)Lb!c z9|Hb9yJDQb>5B2f4dqP_pVbcLY=0HfbG%||SX5eqO7ygmd<% zog9$Fww@_9W`?%Ork0{{6=tKRtJ;{1E-I`YWxeUcP=RN`AVlLbcYxe=i%l(?HlB&q zNetZ1o0lAOaACz-pM<-8?ns{=Kcc;LdHLM7uXQtDkIF4mtZOuy<+XkA&j!C`xqEIs zyR17R#&zgcyXX07smk`8y1B9kU%F1#F&jPf$eCwB{qJ*B=Idp~`L6jZFZ991?E#)c zcWTX)FZj0S^JC>zD>UM?q5`@`c@4NFTvswYCnP}HeCfucUeix^tI}N?TRygX%U91g z_v>22<_#{W?eF>AHPpcDLs;swtGX|I@1_W*FZ0bTe61UKJf`}_M)mG9dS<5G%SDFR z%#>-GrIxv5(d3`Onm6mWYK2;N(_h-N`LCIQ?|RKPY8>$Sz*mz6pGZxGq2bM)F~xV@DOXm<1dZWEW({q0Ki=mJS1@?0Oxt9K!;7k-oW>ti z_`F&#?nuIu&r3p%FP!&~lhLqbh5hj~Kbuu%%?&!L_J2EEihd{SIpC0AFO{lIFI`uc z%IHKzM4m~#6Q!kL)M_)@(fFrj+VHfg_8F%#^543CJlg8CC~>zNQhev4(^sWMe%!j@ zF^7_`rR*P|duFHA=B&w9VSAR}O);#vJ94P&u*FUXJ{jL$WBVa}m}~s)1eGm{ntqGj z&L6A@PUtbgi@8!*<(WA0<-$Y+K^)|54E}uvg#D zGi@KPh;VUA415Llx;EL_^1G*9$({T`C#1gbYli}4Q;B-U$Nd#wy$<&~+rA-t>!|dZ zO2aJ>NsWgshBd&uzPg9}G0_BEg2b#{qjYn>pZn*U<^jnx`*8NP<252j~s1}6x8 zx9qA;QSfxTaM5hxCDqsS6q3BnwPmgQWR>(kJuPffGkbfdN|hF?4mC(=G(bfy&GNBQj%XpDXbXVcS*f_ ztaWI1;enH$5Au%sMZUC@{XD!X=%9{K-N5#<+J^bF_tQ@~(z3vn}fB{SNKi{jPl23!Rc- z6`}S0dVesqcvK?Lv~fMO@Y?r^f;!#)YF_6RdRpl@Yzg{#Q03+5vq<8jGc)?tIqF{2 znQ*W*V#T#b^LGlhM@K7aluo!>{FZ;L=#}fffGK*LU!J?;cXoGDw`C>oKL$rf9F^ZV z??PWquHDrMUPk4ObIur!-fY)zqCvLtj7O}*h1*tsQEYQcb1>7DJz{TS;LsdbGP~ja z(P>+@Z(1>&*LP(0Ho?&3an_sdcUTN^$}2*^t9c*j4lXO2bEE2MQd+QW#A)}ENri9w zT}&=Y@g2HVqi~${jm1Yeo=tlzoWj{Va!N8^S1p|9y!p&4CpCw%V8Qme6KC3OaGe?2 zyUgzC2^&Y_pdEE)%1)IZrSvl_cRG)K?|1safggt_98L93jPX^Tv~!DZ)Xbc2Cp@>c z>%a46Rjgoz%x>4Q8*#@sO*K7oUf+YWSSdR+O09PsUOWFzwRYR_>w(#Q$`>9wJ#N|9 z$^+mC&pAOtx1(ccZ=U(_tm4YbK{A$;_y*yAeqQ50$15M1;=WYx#ku(7)?+g&j+xzH zjr*>+>*z4~f6@#Ry%O37wd_i0_fGU>KawB)Q~k-|4-*#1AAT%naB%Bu`;z5{7Y>{G zKs$0&;pv4ppL^CFv%b}ovf^OuZq}^AKHDE!aW`9UIa{{4W@KOAIR#(*k<@Vy8s}cS zv-!<@1NKq9bMcvJiucBuSADQeKD^1`?2gwnCWdzP3-p{~Tau-e**&`wQC(vuQzcdS zFlfoJMXWdWp7)|}JztdgB?9 zZ47QRD5;tD&f!*h|3l4g`9}QdDdp}gGj%CX=i`Cvt6Xc0kCcubeO_9Aovm+d=+Jv| zR-pkq(yx88J#(YEIw&bK!1?RvyRxwn&FhTpoRa71%}~r9F=oxJpDM3YTBltd|NXik zVd2HCuWoI5vw!P7m+ezd=f{T4ayDuGXH{BmzV)%IO?szKjOjbsMelrmEaz6`!-fMV z#za4~k6iNQHOM8G`64qVDL;1l6mMsZug*!CZq6DCK39LtY?!>Nymr2Ia(UIvy3hCK z$KGsuU-9Zmv_<;)G4ubLFYI@@JZQJc!YM1fxu0JLC8U=7?lw`p;~uH|X7!%=s;_HT zB-C3RFCMchYEoR==D>t85tpq~&uucvNSPn?P48mOcFxgKy^Nae0kb~LXfFvdu2>mr zd~*10z$?X0G5YXIKR~a##)@-#-#^oZXP=LruYW@=-_(EXY}?)2_GU;$6f3sLYgJ!3=6TDb*{gp;guUzFcD~2k ze;gK_IPI*;kF|2T*w*7lb&R|quG>GiBGxEe);ss?gF?$*sq{fDCziHkbZ@Wdn||t9 zdC=f3YwVt0^=`4@e@PD4+ZX;%MnO;iXR>3LTZh*UzWhVYv+&#bXWb_0Sjl|&nK?D= zL!Y+HziMoso|V2})9sSUTIZmvC*)hwl-tWgf`1scSae?sbOBa!<_%} z$=^OI|44z7M$@H1EqPLUHc!)~hrNk7Xk2map!6`4b;ej`%4Zc2;Sh%~OZ&A@VI-rOJb!JyLjZmhbquVZ+7Hw{-&v^(;er=|wf?$43ivzc1$>T^Yn$npZr= z+hpx|v#g27lP-qI}V@V)Z6R^fw+$NClyoipk3sgnb* zxf^E94%e=qXD{{M?eL3Z3*QAFHd(8rFgB8}ZnQfB(y)HJsF^-$ea(CtF} z{(@l5D1+4N8d?hc=%l}jq{nD%JN&ou;0J@U4rJ!YWo2$;Ic2GDTQGdQs``TKRWDC2 zu%3EqtyPz=R26dVX*8M_xzuc%FJ7!v~i@1|59p>dz;5SlwpS|tng2pu-*4DSOZIX}69$3x+46p00iB6)|M2QdI+LP36o&v?=r|MyEKJDffGaE!6%LD~ z!WJSbY;eqy3#@<#KJ(D)E!pVzTc2EwSzyxK|JT^;(D@1<-4%hL8Dgy93RG!Nc zsL&mpgRiN?OildY9G7%Wr4dVo!$!LS9GV00u**QfKiQxZJv9ja$pNLrKe;L#tjj3X ziH@i0=-{3Oq|hgT1ALZ#KCU+I0gjrM(~UG|y9Wo%mj*}gM7~UdfgMY;_X+fKbq8+C#c$FycXwOjg5HOVqDK3aFGS{R+64Fox(47s_E!N;YXI&l z1r_E|MPRvTXsdyW%03YB|VwVqaMWk|Fswx+`ms|gZoWE_miH?;gXID z8~6l*4rYVnwSNAfqq*40N=-8t>;pVjVc!$SEb*UeY0h2}u+&}0$k510OADO$)B?At zYVr8sKkxwopV_P_*iaeZh#7+B9EZ685m1zh*8G1pjA63YoCVARpup5E2AR}ZjGv4A z`&>-R*8llrOF#D&|F)li0rwnQ@~6#bi(ud?X9NT4fR5*4R*GA=;ZpZyV4eZW^9b~F z2Ob6*fSq{-|MXBH+-{l*I1+0CRJzh9FhJ9Csf(-oGT;lE`b&LWy`(j<+oZv)r!`3n z{1&(n_7`;{)H^jzfoF;NDX9l&kXWK1Fz{pura<#zm5{VaQ_1utD}K=yQ%6iCD&n%G8l9j)^)pi8t)O zx(R!}H5F9H*i6?(3>27x@WJ|D`!RI{!A-G|nmSbf0W56%rNSZ|`2SU3vCtt4okK{l zxD;5VQH`dW|LiSn)T6>;VCi6zhG6k1uq3y27M-z!x&F771=a-+EItL6+F04E31IuiN)uV=4xLszdo}~R$G1QfyQd8Hn2dzD=mvY}xajO2dQAi! zE;_rX4EJow?H=EpQtTdkzrwHEiS-weawxWx0Mm|`Ka$_w@Q33){)z`GE(Ufl%5x(x zalo7=j!W`24xTed#l^tx@%_HI-Glj19GB$dJsuFF;$kq~b7<@yOt#{gw&?0sG zf?`B8c2C4u#Ow>q)8e=!w|hM1Lg_Co8uA;v|2GUnT0(<$h!`$%Fz65M9uLS+aWSxa zeCJQGFUojNj#&IDF1qm^WTXCe9>RkV6kL??9+UZXzyH_#h(Unti-Fz4JAAO0rHuEO zjD)!8#(N%v)jfD06*O;yMU%LFNpANT1ZsbQNd0g1$fH^3fHj#IE=)$U{=y(YxERg2bas!$0)O33Y<|Szl9a7BSO<#Zl6<_!!;zG6g2%w_c{JlaSY(Rh zl6<_!AW-#)MQwlAUo>_P)~DjQB)5A!a7^hhJ_Ebw)7U*&e~aP5WPaVg{~EtA2vC19 zuzNn8-BZSUOh!Unbau~YFy8Y~o2J@5WxU5^B*aCxzUMQrdvJRKjEgefV=@xrq8sl8 z490svK*6{u<2@!L87>S0)xHD_>|Q`;_muG-laUY?3IW2!!0rV!b`Lf&V*ZH9NQjHh z?gb3&UO;2_VE-eIOY-p^g8=mx1G^W{*ge=>iQ|%dycf{fJs?(pyPg2=AcX85?A^q1 zNj~0V5UBlya%CdkiDvza&D($&hH+8GdrU?$`@$eVxER|V&g z?uB%APZ{qq83}RGjrT$Zb}yu}d&+o^$w-Kc&h7zY%fP_s44*RK3ne#v90S$Dz>%Ea zBLlCnrLi%}n2!rd)@e8j7#jog2k-2Jv4Ksz*m!{pNs5im16W!NT!5uT;{zZDK*1*Y z;E$t#`;CDcu(W9W00bE**d(6-SX#86z=XMFY0h*40mb;1|u`CC9|{B{~((J{E- z*oHVZOh`g|!%#pv1=IlpY;?XrnG0AL*DEPDT3^73)L++#O`j|}E*Au8DE-z6U!bRR z8S%Mvgf58jP_T8v7ic+M79&y@qiiYrCU9FI1zRV4ftJ{1VZ7?^bV^6wBcovJgfGytyey1k{dH?` zKc(Y&K@g6DtrNaL%k;9CP`xZVt{24lDA+pT3$$!6iwWJ!qT_o(kWd_3CkS601!Qkb zC|?#G=L_PH6l|UF1q=m@jfpSN@xCC4Nx{|$U%<#`7#ou{5*_yo;-nO8o$v*WfQGO! zp?_Hzw@aB9K#-M!trNaL%K)>OP{1rY4j7yf701>I5*SAT_ZyQn5*-f=g1{7Po$v)( zCYXisu)iC7>9}AJL#ANsgfGyt!7M1vgNAlx(ec3`NKL`k316UPgjq}|VHO=H3}W0A zY@P50T2`3FgcfGe@xmZMK^$8rh+!NB+>x3`h=iMpn3X2In z%%bCm0nb3e)(KyrWr$f|Y5iX-LVS%x#}NaLfP$?PzJQ^CbjpM#X3_D)fCr&q>x3`R zGQ}(=R56Q=D+U~fIJQoZ#W)JM-vd1)+!JBiQYW4#TMNvJjfCYt{m&HfL#SYWv$6i(uU84O|Zz*S{j93$`F z1Q)6;Fd>UsWVTqOG$?-qm-_Xhif;SfQ5g#Z0u2^SIAa!>H14R8I;%@S8+TO3!hk^V zm{7+cyS5|t(NQCHVwZqD?x>7KOCYnDFvu)2h1^jib#9k{MDC~z2LkurfBOSIyOWvZ zjvA@cy98WvM`bJl3IvA7WW!7*lsjsq&hVI&#I8ZhDzh+7_t$k2y@w9<#J;ox9(9t( z*ymqY^&8KnC6`%D*ku-(UhaTLP5i*cB*sTeGP9Vl%q%j^Ou|PU*d<_^Nwv|E%`71k z=OEL~q#CJ%yabFhsWuD=W5u2L6GN>1Yx@%ItxQNsfN7CgGz@AGnz0_|SO_?mq_pfskow56{3ilrq{~%`? zlkidI4@3fznp7J`mc#fMtga9;O--tiGJoJ=lJ_62e=wn{5i(Ux!bh1ua52g8(fS7y zx*8$V)g*kB`2!b|7#}TVjlSpXzc#zr{DzPzYZ5-{{2>8pO{$GPDVYgvjgV<;QjOI4 zLxRj?Qf;)&0^pmWEz`B z{YSgLVv@y-km+m^KI;4-K_+uYZ3r!;4PIBuM8CA#b86xWB0)wo86T~GFrl>(GOgWF zBj_&i^}Pg{%^kHNwA41jgxW^P)OJUWKq2DzBp|mtYQvF0{(%w8zqV<7ek0S{9W?@V zQtHZ&Q6n%n3cf!lG&*WS zXsK?53Du2|sqT&%fk9L7{W-zcQ5%i~>OUrQH$tYnJ8A^(AdXK0!n>n3gf(39uX zWE!MX>^VZqo+C`Mu@QRq94t7*=eJJL=Qt9$|CsDQ$Z6Rf9!E{8K{~~sBeeWE!h}CZ z==pQ7AfohNr}iJT{5iseKS${KbFiEe$JZ(T97h7_mkEE4(DUci1RGrJ*S_|f`Gb}} zN0{*E2t9vJO|rqoB*#ZPe=y13M(Fu-YN8D;COJO3`Gd`bKS${KbFdtx*k5P-14lx& zKQ@z8ZZp!i{p&ih`Ik-4pM#l1%>Hn(U)S~D;|q=i(k~PKoK4T4QxkA-F^Tcf^5<+O{5hMR zKc^<);9`>FqvOxnOj5kr^!zzB5eFBO93QQJFiG=f)AQ%lWE@;fa(uM@!Gu3Y-vvUm z|DY!1;9`>Fqn$sP@aJrL{+ybWgNsRwkCs1YGvUwK^!zzBF$Wiu93QQJFyYVH^!zzB zIR_V$93QQJFyYVH^!zzBK?fI;93QQJFyYVH^!z#4?uySJo#M~gv?<_hCj2>@o<9d0 zY6`wit*>bLb2bzHoK4T4Q@oNtCj2>@o<9fS z0&)Fzia%%5^5<+O{5hMP65g>t2LTBRzRvI;I1)&|O!#v)J%0|u85De-@()`6oXvzk zXVdfNAao;+uT%Uvjs)&M)GB{%)A;(Co<9fS77D)3@aJq={+!K(KWEeP=OCa%!Pgo7 z97h88AA|T6o1Q-hQ6mbzPWcBdf6ivYpR?)ta}aQ%;Omrs(58#CnegXqdj1@QtHkkj zia*DZK>B6EpR?)ta}b)N;Omrs(58*EnWT-g>G^XIb)(?xlz-6j=WHhYIh&q82LU?@ zzE1fEEq~5t!k@G0`Ew8zq~Pn6f6(&hY$p6Uo1Q-hp-pjoo#M}NB#?hF;m_Ih{5gnP zQt)-kKWO=L_HX!U`ea|?rFsANlxQ{+HkvJ3K>;@UUm#ExGcNV(iJK-^MXC%30x6RT z8O{JvzgG)Y!VGks*$=%{&N#p-HvjNTBXxLPE1iBs8f;5W1(} z`{P9lsW$X2&~TC)`abF3tCvJVlWGL~gE+oFC!tBT;Yi^AV={4&NN7@xfLfs7`{P9l zsWvt(3C(6gLbFLEG^s}D?RkHm#7(LVM*{aBlc|G5LX&EwCP}mZJc*lB8=E$Xo5O^J zW|K&0QjOFkX$??(p2NM#SLn5Kc_$Yf1TugF&wEn?_gyxV)Xfi&^<^va#7#}SO z&0#`9b4VmK86S22`12%gQf)XAXnbZuLUTwYG^s|wdWw&Kf1boms*OXN#LdCti?B{+ z`?7N@XORB);Y{3V`?Qy<_n zA%}y1wsywV}Q>@ zefZ8?MFrmigTI6vzNrJB2|0Y10=f}Y0Rg6e8ERkx6Tk*lqMap4`v_o93t|Cp`WDaBq1%ZEvG%ivR zar-oo5h;l!(h^IgCgR3mR7PY-B25t&&w{T+x?+ixMciKsz9Q5m%@XO0xCRsbO4J*o z;2C}aBWjzXcolJjAX@UTun2}oaV(MMSR&Q2M7ksH2?IYDX^%yyPnx)53jIn{vq*!) z?L@%TMH(dT+d)eRVd4fEP$JSGe%T2CPh38N{zD`z(jakf1^DV;?;@D;wQOzQ!LquMOr_P`VMSe%*jG!f=28uL@=MkX7A`RjvNJ zk7(Rvi(HQ_QXCN&06!Ngj@asgNkKGt5}P-)glHGB9YIS7T@VXwP$C*Ui6tXiLSQBq zK`PS3Y6E;FQk?iKPNw~41upY7A9TUCk3H<9UtM{=c!yd5GkNo1iAaW>*k zLLzEJ+^|Q)Kt%5@Bi<7x&BAu^pxdw`+vs1Si$#4b>SR$bi@KTUXZ+1O;CDn%i{9nJ zBKjJCQwsQ==xx!vH&{e}vxp975k1Z#x}10~fi!w4F1l30Z~aIA68MOI7v0&;B6=Rb z5go`8ea|8~pSaH&Oo1Y6!3_$(nb{gFCt1MM@Vk(~uL%bf&4Ho|ZbdiAimq%G-Hj@` zgp@_-1Ha$X8cc9_$~NF#(+MAyh5gjPh?qTm;yfaefe5nZPty0$`e zJp^$L1DLSz_KL0*5T);n(&X{Pcu*gq6;XOMLTCj~Tt>eq+DrI_D9schJOd$I10j4v zlm>_={(;{U?jcGaBhs|M1V-Q^Tm&KXfhY8U-x2x{rG<#nFW7`W@WcjdFoEIt*n~dt z1M#4o&QKbdiO4V!>m;Ig2p$DYOSlhdQ#gj#GTTy%zkBC}>$p=Tr!N)9VJdy^= z32oq!A@nmLM`(jXXoEv&L$ogy?f>RW&z~|y+TGg?-SmOU3Z3-G`#(z;4|jiQO>1|5 zpFlrXcYmB9P@4%%? z@&D5T4;4uRl-Qb4S`&X4iD>@{%CY%bTGPzM+e6*md!nt4hP0-+i=UT?_aYx19qga( zZYlwOf$ji089nB{MAsPjxw{1T_~{rK8X0M6ae%V;U^wG}iH6Ug0vh1w;}+=Z{_pn& z;5#As56ED0T<{z4J06et5B(0f9}koR5iQ_3TEN=15JU9epg!zzpyAV90^HT7Yl9IJ zn1dErhG=oMxZ|~0YFb)q8YHa2e(sCFGJ?ZnNrUQ$|Ech}T(AmUq=J=!4Ip-o75!4h z8!toujjlJ*|8iXLUeZ_ z{#!1#0jHEpygHpzY{anC-bt&M(wjtob zx)cat+Ys3^~wmg;B8LUfC}lKrfDnsdP~>>9E`?k) zW=fIc!+s>>qtPjf9L;&0K;#xK!x#|p=Yr)p)HV>&g)oDCEnLQd{2YWcAU_9Xke`Ea2Q(&vFhA_) zAXW;uLkRmh%{mcmS71K}>qMv>z?>m{aKJW(sv`~-?iKGpAO`7!!-f5v1FwNWNC)zB z7GR>lR+{__uxo?HAuTO1&%pQu@OZ$1*V({K;W3emg&N4u1q&{WYM_*H;lAQ>&?qcL z4s1Q)GT1-30varQG~6LxAK0`~_eX%Ufqj*S@od!JqCqH185R(tlwnK}rHljZ^FRm< z4S!JNcxbSiQpSb$Q6SughEgbUd^9*nDHB3_MDSaa69;1xE*{x+zvjCZSaL?fR6GE0o)FO7OW3}7OW2e7BCgBPr!op zA;3ag6gez7NGXG303h@U>q7t*)zo$fK!^n@0}DX73~q-|3)Y7KES#vn6=DHwam+%D z3ZRs+VSNa(U@b+C3%5haf!iVE!R-)&kQ9VZ0JlTPhuQ(+QLtTsDS%oZ*zH5@0KbLw z0T@xJ9U#;UwF88mp>}{Ws2w0I4YdQEl3{$Xp93zIrX8@KgHRCM4m2`F=~ECPgWCaE zAXpCea}Yj<+rfhU9E6r2eE_}~ZU^9P;OD}A4wz+{cEElPf{}1Lz``BsXTY~W&jkxg zSPu4c5K4pF0r(TRKG@Fz`wh1PoD_hc3;Q{sAmDZYV}qXy`#GR1V0{24A9^lW*Fp7x zbsa1R`#Bph@vt21=im`E?STCpTt5Ko0|c63d^CQ}q49G-i9`4}G=2_3`>-61pL1yZ zoI~U1AdC;!N8{%l8b9aI_&JBh&$%>y4#MrwbGbBr4q}3^9F3oYwH_=-TIoTT>Vxji2*r{G3nY=X@GJ7tr`QpT^Gx zG=2_31rR;~jh};9A1p`X=K>l(7tr{*fX2@SG=2_3H}G?5{9Hie=Rz7k7t;8-kjBr2 zG=46m@pBMLgYXGy{9H)m=Rz7k7t;8-kjBr2u%CnB9`X-R2Kfgdo}qaVoRWgtfijU) z{{V-mAbqev42mL$?w!#?0p#^A00P?(cm`yDAfy1rG5`|v5COS9aJB~K_`q+W_!Y27 zD6RsgH^`m=>xv$<5Pt?>VyUqka5fBzJphs(J>)_8Ef-CCqLguYv5EG6#D`P)S#FkC_|4Kh+_faE2wQ?NTkMsz`+72h62i<_#`-Z0LAb?*awQ6 zalrXc__=UA2lN!&4g`=kP&+`-94dq3*&r+hw*zccp!&f1OQ=3@_63&1jslAJDOlLS za&U~61J1I*a(uWQVCsS81T^gs!0iCxcDNmI9Fqg6CrA#&`k?1>u-tR;_JU4@<-kkm zsrmpzCoBiY=71PYI|Oh$IDA+iT$r2SaD;F>1UxF2fR0U6jsS!Nh3Ekya(mG-s$YUb zBG`M?#pO8AT&4xi*HFh;a8QJg9yJvEEhwXo&p-}LK2$j%Mv04R@j$mw>jP6G)n3ru zFSVaR8Fqk93=0|tq39AU7{J6Jjs+Z#VN5iZ8z5|0)P4a)*daWM91lH6M=7H@lK_$gDEa`^X`x3>#eNGS z`moRNK`&6{09Q%vXRw_i+faa?%aWz;e$wE0lg*M4khsHRX`5a9W6d!(!pj4oZAE=6EJ*%p%E8+n8w!EH{=?Db4kA!K@WmW_i;5??C$F2 zAGl0K6Z}+bx}lMw)-(a1HC@0pV(|>QY(sELZMr@(ZJIuM;>th3#V-Im!UUq@fZ>uJ KJJ!&`Ncw-`VbUD{ literal 107886 zcmd42bx>qY*5Hl1OXGCm?(R+ljk~)$RN?N>xHazX-nhF%<23Fx-ncK%Gc!B0`|i83 z|9xLXMcuqN&dHNUvf@@|{wNg1B^g*4*%2t_PL8(`SOClb2V-jletsrZE0C=jfLcXF zQVqZWP_eRe{J0fyb~duNFtanW2La3-oB@(9_NG?$763IzTL&Xk8U!XqX9rUk6Eo)z zMH?$4rjOnMb}TF`fG-XX79aZJ4kkc=vYEZ9nX{QQji4aHNAoXxZ2z`vVgz78U=o!B zFv&YO+ZoyZTZsGLLaH8)W&kD;dwT~E0+Wi1G3f7mSu1-R1SUxU`-i@R^M?(94)cc& zvmOGIvY818pu@(-%*e^i&B6iTWM^mOW@hK)0kCm0GjgyobFl$9Ik*_vIoLQ^KIBCJ ze}&*5R!l%v4)z~r08DDi(g=Tj0jMoOAV(lC6O*-zoui4fha<>=(Zs=y320>Q!eHWT zW(4|(3WE^?5M*R;YUFIn@DVHqH%lv!nWYg3$n@d)zun^bw_B1{wxEwuGfCPSfy~6s zOdL$j5SV1m>@7f+08SQG9zj6>5cJWz9fEu2nclA$!qI4-C5;=*l)S$^ zhrPd}S^K`7EWIxX6_;FHyg!Z4jlVw*ZwkIVGQHe1`}yKd>(DCD9Q?V7eSf`NLVbVi zC!mdfKjM?`et6jL&k-8O{7SuRaCSUyAXHdWAeCpvsC%N404VyV>ihJ^?R6rD8`^$8 zf#2sbr^GKZe!N@A=dl}gfTW22=M6Ly>fYRS5WdU>&yS}wkr<|K%e>^p;{`}x-#E`) zTAIU)nkU;1ne?m3krIRXq>Q({Uyv9kEj-;Fv?26$66r!{EP~mI9I=~~u#5Z?O`gw) z=R?B=4E8>6UZ^435j3wYs)wkB1gNZdIkoD)C#f`JkDJ%sAEAokWN^M;)L0KuMXgA4 zyuCf4VbsbxG?z|kL>NfQ@Q9a7v^k}p?DxNzOAXa`30PPF-(JTlv=nHUwGb+5Ge^C7 zN4uAfxOI*ZE1Jkf6lo(9MI&Q5dN}DfZi67C*S= zu`0iQ%p8yvwW*U5R53b4m8UxL=B1)(VV?f*dD1hvHT6!RvgQzh!MvOYP7QnL*f<-M z7ObgK)A~jY!WoLIV*z3BmEM!o=B>wNpXvk3>^(A0Z)~%Z8nV|=WUmX+RFGPa&*7M) zl3V!>B0ilSIaWT+t%37IeP(c~7)q;e+SZ|nmn+f;VpmSI;cbbH>Qn+f(ERAgl~i~- z>g!5}&FFnBSFcoJQZVcaw5yRRs^+f`EQP3rsX5TjEiC!8QHig43vFg-reHGC#$Orw zC0i)9;;Etind_uib^#b($(tIVqiOI?DJ~>~(=w-JH(dG#2OjtW?^WQ*9lziTVV^8< zA}N%wZdmTG&f!vGhnx!AZXg(XV0-#&Xw_a35oe*Vv+Nmy-sOk+wVei&R&Ty%?n%ra zpDIHY>d8sEDFIQ1wM#FrIi|_Um&`#lxTg$5NP@O*z0yQ)+BVkpymm$)kv3j{0S6x#hZSm@Nse(Rv$LdX zs!xGuY;NbT@3Ud>=|?n{(j`!p8CMi+V@5evZ01H|iF^>|tMqs9pd77dL2!Wt)>#e1Z#psvzE4Pyzw|4A` zl3a75phB2Th`ISDJFy8oDVC7A-gJlbx_npv6@JI=v^?Ayxe+A+`Re-oyIG3zHgRin z(#7d=X!VJQ=C{TYsM7?zw{&WZSg$KPlj$8<=ya4ad78BNb(0^Vb}(lXy;>s7*Em#q zPWz@guR9G+5HoSK$pCSr;6Zufl}FHy#i>d{pww|siLJ-&<`9)qYD{&#Z&dEXR=*_( z&+q)V8sz;Gm5C1=5I0x?Ri-d`na|qzkR6P;C*>y<-IK{9{T-yNe&KD8fEqco&$XkH zeEARMasPC-0*TQi{yAQ*g*EAKYNug1L`;Pi)2hX3V2|q$yy=QZg*fSB_g9|P0~q0@ z;5pi(1_rEIbkGZ=Wv7-r21!!H zBsJ0`LGEuM;r&W-1Fw1&Gi$B@I-A?)s#?|Oseo2xt*3Bh9m-jBt0`=yI#0fd{iGO` zVmtm_Oc}QJ!b&Gyj6J0ns`e?x$gOt&F$lBcCD5l^O~C zPnG%J=bQZ8qvzyz$LDlTv104U9WxE{=q?bw96hI!5BBx;iJ%5SYGcpoXrUzIqkP64 z1QiQ)1?^1Xgzyr5o7^_9zThO$9D87#>zzj$h|S{iHvdH9-n2q8VUc0NW09xSEGXk6 zhIA?ut~3ie)!AqY8V3YX6Y#@~y-=YvC8LW$ zGkr_nSe#()LE=)AxD^SO(WC|O3%t>`hlP+Oy&OCOV9)m>cBocmIVMZ7MLfEg2|Wqc z@7|84Hwo*qgvK`Q>O#LtdI{TUO5X-jKKC5OyxU!pzEc;CWY6@*D1{rOx+wCy>h^K< z`1zP5UH0@y#h8f8ra`imriBRU+op`19W&Slv$yRLo-`hE&!Q0jraN7_Yg?qlAf=IP8s;$jH#`o7ofZ+ zH%6_>4^JCqbHV1E4yy}}LgLl_Anw0?Lntrbdy_?F7l_)To7;jkd8KoVi$UN|L?W~d zW-R&jCA&vBdW4;S|p(WhbzO)2vn{J|@B|T2XR0q^e37wKESUEIOud75wH-aTb{dO`ayur?6g{}^yw9- zK@oJ6awfU|npf-rum%QJh9euAGJ9*1#V7jV;HzLL>9T5-4Igz1L1Y@yRg zWFd^yCd`Z-9n}2OV!=3MKA7z7u(^R=!q~Kzk!oW|B=zjf^cW_R2819;LE-N#Xe0p-=kRR(@D=A;76HEH0eKQ3D2% zJ*i7XOZd4Z>{iW9&J8Wrxi6UT0v7IJGJ?Ee4EO7o9nWW$^2%a4kaSsey1e0haX^E? zOs_5;=52F}oi6BCq3XaqPYhV&Fd&OJN$0w~$d{cs)k+DzSa~UMMCaiq<{PDSRe%(( z%vM$X8wj4q1>N*&1N)m@vVy>2@#hnys;J}BbIovYNnMyQT}-J&!afq`(Sr#ZEcwIg zoIziIC|p^_qA#vL4+!ZXx57b|Z6Tk-ce?6U>AFGdZDJ)KpekOM?)|kdFx11@r4;#Ppw-kZa-C$pkbFy ze{;a8)<6C&hDWL_7Fk}YFiM>fMP$U|DcTt{_CQV()!|!`7gHDqzM#`Ww~T!#2|Oih+D^?la?`nrm|F>l89~HFE%(=ggzd| zn+1}L_4)O|$?D6VVzK=Gli;}P^q0lAbabIypM|bN?iMLpQiLs{zBWJFKX_&6TzWR$ zosl9F9_$Hpc-B9iHL0s(HjE=*{a>m)l_ZxnMJs5CMw9)Fo_ngz)nXnl@{TY3!J zJT$db+()R`(!`Q!jFMk6YYnKm9r{aBzFn?%{Zh4T%HsbrhF;sbG6Y_Qt(v0P9RT$Z zgUDKbwN6u`)YO8vpdPSLS;8_L)b@uy;b&|iLkjW5YGYljzB69lfG6w`G&+1H=}zal zRF6r8BG#myWMo!j5FV74PoUNY*J0y0S#m-ISk06Hy(duxE0Y@mng#7w|L5VM6kXPJ zZ6Tu!*T(e?2}Q0l%+%qd^U)bCNwK?7_b+p$--ju6=*kL|!1&a6dU6+IW={|eJ&`!X zr#JLz>1YmI66q_XLrs-8de#8Np}35E__~>wv+8h z|H5qT97h~PzhZ68S^ZIe}a$zo!`Rw@o zRKY2?++w1W>)N!Ux?ZSb#aJNQ{kWZn;fqf_qIqA%jPZvhBIcL(8PUuST{|H-uY1P9 zGKY|6eJgi%rI80(aQ#8UIw&S4iWya$7{XYe!)54VL2MFGoPSVK8=d7vvR>+wa(ul> zt3=KQ!Z;LLzSk0-wdzcEo>@n(Z-V>je?D*Z^Kxuj)Bl3U3NP#9?U;38>?5dtX!Ggk zs%g%-HN5|ct7ve#=;9`J_-pHfMPtDJiY`>5n#=0=xhsEVf@o}3{JuC_znFwYsJIc( zsD3joCk&H9N=6F(%o#QveS(%j^(2F}u?-@xRCs%@puo9(jt&9Xw2~)#Ah}K0?*K#3 zX{SRJy`1}=V<)ulLF5l@>lr4Bm_N?a&wLz^R1NPOg#SqXqAe76;K5m!Y|%z5p5&YH zM>&Y5M;~=-c~12(0b2g%RKcC^ggY4ho!z(YX{dkx;w;5PevHSF4qB5y%Z$S-@*x!9 zpK+*4C>Xg7O_t=>MDxVi(#+t8FhKT-h-Oo@*mXcM;Z0Mw!qBW|J6c6F%7FZ?Hc#k0 zDOERj7N5$qn9B%I&Uoft4&v{LsS{-|)M!{OLU|w%civK4H8*vs$T;bF(na;hMu;vw z&q(wM=H6P|nOSoY(OhLI8*Q)7QC!X`+%ZXDN>>R&@)gmi zgYV?|g^@x$KO)YH<^b4~{0iooJLE!>2b%wZkb?GAKYvL?$ym#*R2&Y;mt&ZC%jC8dMP+D`7>}7OKDfjn%0756dR&ZfCrjV z7LIs&P&+sA(3!Zd_a# zSZthK#h5*JIH*$;d&6fg-egH|@xidXIgE^j?X z>IhLYRV%han7m{Tq{!f?r>X40z0jg=MQ z6}M;Lv9#XGj|!*x%8U5wvODe`qOD^eh0~ZU|ovC*Z`^WOWe8^T57tdaw`C+YCw-7A!4w78&AY_1$SG1}D zp+l9A@jmdf)3%hoPp? zb$&JPZ=TQ##4R1lpo3oB=5GDhYeoCh+voWCCU2f7 zdq>9}DN^d4J7%cvW1b96K;@wEPJ%H~CwU=?g&(L7&m$XN^6O~5aZHtD?!o$N-9fW8+nz&Wn zPe*XUPhzO;4QX~TnbGsWG2~vhO8mP_$+igefnl=X>;ox1lr)q-P^U9(-TYSQZVZJe zbVdWIZ&5wgF4a=A5$nM~?J+~^px@0M2)+8yZjdN$wJ){4+G(&bq+&&Z2aBhY+5sq@ zP`rSdY1-aBOYEfzVe^x&@C^}Pl|)|Y_B(==8n0)2yHSVpZ-qbS@6Tcw7w#vgCXpF# z_sdkp35fw~O+sA}>A4bL!dOy(V}`t5auosP!-nt9ey5hB1OUMVf8F7n7W^< zMLE$NGbF2YM86w((UW`;5sh#EU8bgQn=EM$=X>3v-&Plflbz>AG_Wo+@|`YZjAp|> zmZ6zgs=HBH`qb^)4;M$eGN@ZvD~;Su>)E1m8SeGg*4#5!U52uoIBotBeSOoxyj0O+ zWaA&6nbx0n%KIrw_rvg{Zel&Z(5HDUF;*kRl7kqf!f*8k%Kzlzy^}#z40&^lhzlK* z^rX9DXJa6$1_VXj=6JDQ zixs$i;__vFTKEhn+zQm22b*x63!T|@oW7LYoyUT7Yqb~YrFA!_=_bPy<8ub$o1 zDIzh9te1w^2u9hn5=+ZPWvPQ$qY;mkrCvDUK)owL$-6wHs3XQY)57`IqLbqa5xuTy zMUWO%c*YXU{FCx^(%QXu!ohs08%Ij>((c;yG{mgA*gH8duM}HfhWFxH@Zy&J@baqJ zvwmdnQeEL_(#Ne@sBv!2TXbPwpOSlB+rn#&@;&D^+97lYg`oh&25hhrhL8k_+48+) zww?{U5dOx9pHlT!r7wz|$9>EFG7~ybl)h*^S(vMNwigGyiuk}0^(|bRRvh;XwJ?>= zV)eXO&lO83uXF;N8Lw3qYfWs4gcSVyt6|LjFdyF|`=V;U0Xy$yd$QT{<+^o&8kKTZlytrrr&*e`wi<*5^* z&qso{z?YkiA3a3k6LOCbLR9gxxQaIRDliG)`kKgQ*lruHK6~rWJ)sdX+(zsr^O`+j z!qcQAK;T5-JLP;@f+C(_f;3#IE`>W$Sn-*&KH1a~W#S-?nRBQ!V5NYNuepmUYQ&(- z(lq$&H;)iYO2pNVdL@D}s`ZHY9EymWjkaF>=yVP2VGJ9guQZ!f)`AyK&4e6Wqo2-t zYNh8LuTOwElp5T^o;Ia2fX)`O;F7BhjP?9qjvyNyi1h)FKCQ`=Vjmfo+BGwcHh zZOvQ)vr(Do7bdb398E}pZsMX;BF^G9O)K4Ca2CTFf9;g~bM611dnPQb|8E-y96Vg? z|NF*)Zo89DPEG1(IJtUv=s+-hqS0xT8(3-E9{5Os!Q4-cQ;`4r9C+Hwo%(m{Hcp1w~4Yas4Eun zu-kNE5TVED+kxX#fU`uAgcUx$*l$j_>HBndSyFS%Las3+bbIy7;B()7md%cMN7ugc z8H4I^?B?4QGjT*@lT5so1fDWd7un3y8OJ+P*4-DId0NVVqq6v zB->twQXHl$Xbd?>iXKIGQu><%-CBz@6FZ_vb5Ir9DmZX*cE*D=H;`gE+2;2=Wdc?v zdwlAWMbwSnL>{|V1couheAB!Q)`dUUQS_Bs9H&?xr& zzh58!;hpv#6T%b)%{FTbTqEEMXjrqU#g*E^8xl52&F|65=cxkCaGE#faa&)G)fLIaLa;&#E=Qmn zI-c7*0y35YvY;~md@5@HnZbOpXHm;mmyg&B{N_wQS~TU3Q)_Q*Zr8qPrZ$PrR9#VN zjsJzp@AY*loThC-aV$_EffG%1^eoYEXlqZZ zowQ%m$C05(Uh3Y&{r8^xQUlr6p0it?3oR0bVJVr1MMJ*QS?_@r~tcumZTKMHA&%Q{#vpH?uMLGYL6ufHwM7EI>suVKGy{_AI2v#t<`V2VA zA=u~B;VJ^sg2YS6UGU>U#9jP{Gf>uV^z!LQQ&H`m8&2|CBVT3^WFME*MQS7SJn6Tr z(+MNDm;8#gQ*Mr7*HPrJG!ZA{PvI%o zGG)ib4MbxiQu`;$y{4ZRQ+sfgU8=rLc^E{S1|1z{%JyN2v|(@{lzuJ zifp;vO@5h8sQXQch8ip0)_e*)@jYRk8yBjO`lfntX1h3-_giXoGAmEPD?BO+>~_am zCJJ`$lwjDLF%1_zqr&r+x$MPN0O`?ihW0G*@}M!}hPi>3L6&l~>5nkbvifLWRJNDU zCg2Zb*wtC<+nsj9cwM}QfFu$7AbFsjBgdpYS?(+r5$WLk-DDKIh0&=;^-m9CQZz$`#hUf-vnk9F6Z#No*04{WWW&4&VMHthip?~0fS|a zqvSvJnI*Owjih;GJ;>P%=aG&m*p!yr<+Y&8#j$ZbrHl;J`gBd8na+uGL@w2^I)K8a6T4 z)Pkp3w1Vse`?f98fpi??lC$mFEoD*KzdqG$AJvsCUf}TSwHi#93CX1yFeLi0>2YzF z#r5q$+YPLny=;n;1w99pVXsp^sJN2Nm*;Ppyr#s0;kj=iwE9?#1#T&I-U&+rPDvl) zXvYuJgaWg^`D1;DfuZ9bDq~VPJ3;Nt3*;i>KVx4|^RIL5G0Q}%KXUcx42oJRDr7AJ zZ&YGp`^iy=)`v&5KjDJo!X>LI?*_xegJ*&>B3*~r8%%rPv@Y7}ov0gkKqY~REI>V9 zj5IOwolV6gw#w(o1e2Mk#mq6w-GbI|>ahsg`j)<3L3>j$rV$zjA%X#AHb+O=1^zc? zxq&H-t#!Z0h%nkt+=#CfSH-r+XPDmz4F%(tvMen#{E%`F)wcw;;CAr=S|eE4wlnIJ z1i~pl)DO)RXKp(&>ZqGOjp28@NJufRgskETbIV35_)|>6Lo7%As?$BgQ2i3M6WCbm zU=PhpMtBfF&}h(h8@l$5!2gSGmAS33SL07yi9_pSje_bys^h4MmCCU5cvq9=4UOJn zGx{V5m{oLkR9^%}pjXi=`D{Zwf98;z)@-WeED%-JbCxxs)8qmh?Z(#eAnzy^;BEwT>;%-rrsv3#`H8EH2&7JqnEG^@fyLI3(L@={S{Rf zLq}MU@uyBo>PsRXaU!%2)KfXDC!{ZedG3f3vxVL;YRTEG7%+y*&>vU8A2FwlIutfF zi`NjPL(Q_y5oy%1p}2{dYA$d}MM@By2=0cck4rEB*73Nm;JDAFr`KREmg(wH3>Kmw z^4iY-Q#=HjT1o?Zv8ER#)18CJpdr(Gb8wm@Kg^vo(kHH~FmzE{t6){GHg1+ly3-Zz zNVwQK$&xlaw$@GL_5;Ti4}S=j*YZ<@?*c4NY_wRI0=T$49aii$F{O->R$i96-&diI zh=1s)D9npC+*gB)stb^_x+ZW1GIW~lpiu~>d^up!ga_(hH@?}dyO~paNv5rsPNZbM z?YQWO<40=^TB6)RXt!@WxSi=>GD@rN#bwZj7Afl~d@8Uia5)U0VU`D-f|kDlV#bgU zT#7u{frc_QHR{kfiEhee>`;7}Rh_{W;HK|?Sf9Z_C}~O;C7%{Hj4a{-Y%jN>X*@FpJQp2N)K;yeV)nU_0#ZbIx$!+az;6F{*L(c@Qd>x|7x5-tK2~*xe-i zL~VCajkpSsN5~M0WXBr2UJcFJB7l{RC&piq2I#@3UF8oE+6Lt!%oVautZ&&#e#H0A zEzXqRRg|uP&AT;)I^=yR5mV9|7HYi3Z77viN$Z=5wI%(wdZopDpIh)wdvt0hRgOq9E*B;GYF$pG;rt|` zSJCAh#FVo;Q5=P26$o9rO#H%)@SdOfrl1bqTEuHS3j1P_uvr6Nu7Voh1FZlDx^S|! zcebdyy7y3$!)35i-M@Ma50FwXwo!TD9_WLu5i#``uT2rFk2cOd!wh-Fn$U2C=6?qT zMUY5Q!Y+IKMlBo`10rK7^gC;;F=6|_M_{)gv?v^fT;jm56G47sDF6dbvTuf*B9btjWYh2I!Rt$K07suFUL+dmobX?N$XRGkG@|mi-qHD(U zwadz5z&=64p8Kl}w*Vcl-;suZP*{aT+ZUO(!oo-`lF(SRDI$u)ww3bj35}<`-PUzJ zKW5@^m-IySvjx}#vsGZjgrE)QZC5$g_$-@FYx+TYn@o_Z01$k=t1QSqa6GJ(MMO1H z3&P_DE2e-kZ8^dw0K&AB;+E@xeS_`#nXz5 zv-8)wy_|M!^Ewj#00jDPC)x<}z^3ZrhM3H!h+VccKSlB~F<{zhSQ{H7zBskOzgyp+;w@L6t z0V*W{P1OmRztiTg`qnhsardycmKP)y?Y*Z9H6!BfdF+PCm?3EsDf}Tzt5RgB{g?5W z))W^`JOvF5Uo9U3WQ?3-EOv@qW z!lk7CbE)j1>6q{>atZ#>vmuBvA55hbHBRqLuEDVSCwUk!+jRfdUEAmhY1552ZLp~& zYMrLq3H4KePSi!ur(9|&fUBg*jgZM-QQNG;Z0|@djuWar52xUu<_kJpAbp==0$M*{{9+@ zw3*s^vF!K~9eC5`!#zmgF!3BU;Wh6^Rgaa7I{tB2Yln>+`h6f*1 zA|QG}w3=e6EInFj3N!wOk_DI4h||V~rIk zTf$-zc5Fz~jtiPf*1A5!HRrv^)}?P{#sXasa+G~fVnK{Rs;Jc$<_PnQn2-NlMfe&? z>eLvWQ&Ho39d<)_H(Lu@dx0|0W%8J$+aAPCm0oi~-SoiF2G%tXjP#kMSWGjzjb3=x zhWU#9#4CQ-T7a93T|^4tS@DXgn?9k5tYD!$5Kpn;0y?s4qf{v}Yq4Z}bt#fDTQsX_ z=;5m~$sm2kcB*@HkREF@8rgG`2n(6|^w2l-Gsq)@^n#q-V+m^{2|504EGc7q>l8i4EMB<$b0-*SB1?mT7Jujs=Nw>9?#J_N zxXo>cbLTP;EBsSyiiO_5v2$75L&kN$&5kpoD({ZktCU;F4 z4{P<_?B&ICWyhpG;R)(P zJ`#H8u7%VaFRCbV4v>3#w9v0$BsBf1w+StX8u0H&XeW;_CTX{G{5i>nomI`uRu=;bitt5M+gcXz47cy?98$A{*FU;nIe`;oHch2AU~nv`TNWL`O^C4rcbZ?Fx_p*17bM*U1#{ zg?@j^@gnEBC2&Ec#`$ErxfA~vZ``<~=(e&>l*V0xLh+T=6Jcmb>tTha?-fTUJwb#p zU4q?}x;w-_t*i3X>K!UF%6_{iKkZ*ij7ewIO5;^LSuTr_q(4Jhbw!pp8K@mg z{pibVdiYk&^|bW}=NOs9;O&b-N+>c38s z2NVVug~s^1egVpIpIJo+*@zBndo8IaP#+SH6f%ud$n2!?9*%Sk*;YJpNk@@=^CzC| zmU98`;mA?fK71k`CW#Q`u7)5COW^u}gNqxeD85|PVPStVdl;PddG^o)4L@%hI5}_{ z>?s{GufD$u*mJ~HL9ItEF&1k%3>^Vy5UCNPP7Mh~l^sDPD8J_ zD_n*L(Q>E>dB%ID;sYKq`h^a3Z|ZebQHLJAcHYXvniLT z`eMuGI@43sM%yMW?lx??^!MlQL!nVwW%7s)d7a-SEQb10%%wlyzYyY z33rNVO1Gk^%|+Y^=o`jl86+B^7(svC+JQwt4`Cgw(}ABgqgI))2zKctNSG{0lSC1! z^E8&0meGGg*eRj!N0pJwHjvqyFqIf2fXUeXhV$u1Di&c++9~3#HeK%AXMC0Nx)N7J zqS$r1w}sO&SG3wE`^PF%k8=XH=m2*8lB;>;6A3jT_~vQ#gTU^Z5Lv955@6X)xbdi7N#Gz2+J^`j@n_p#+|^$R%>sK}j!H zK8l@1QcAbxY`ue`U(z<=)6b5C!%fA?YGk*M$?Q-;DEzFbeV6(PMCnnBwLlgd8br-9 zmN(}abk@vr%W`FFOD$%51K9j)DxO{Y=-mpb!E zX6>A`B;vVrj`*M)f12v^Z+1IrLPJOEXHSWT{Wz3HYlctES;9i6;g^|0kN8jqZ=<3- z!ZgOGA>QB&xa4(5;GHcfyFI@G`brf-xj(m4s zkku`N=bQlU@trdD2{wCRCPmwhCex(Kq#6;q*hnn{X_#vS+KB}Mpf_uWA3GB`uqVEa zrQaD2JvnO!JYWTy0C= z&3-btOvax`=aew2T(wQKN%Cg;Znep_Q!-_EV9Ulxw95SUUn3V>FryzPW=N+$Z=m>| zK_ys1#xikMTZ6cPg73cfDJQ+VfgN?@vgAia7{GC@^3`4pAJbv(g=gRUZS@Z){!hki zNW$0kErmIqx1mKkz0g4Kd?56+!hOD{eJAxv2KdboK{C_3-UMGR@HKGv7|}u9ht&3{ zd&$W0{8dsldmcuYz&EG|%Yad6cubfNHtA-l2M=qjL`DL3+0jhcV{U#egTf8J+I=-< z10%U=DUVhCD#-@qw0dwW4rCRH{M+tY(7ZuP4efXE^7dF6OV5ag1tH>nj z@PT}OJdEBJj2ewlZ* zf4lk5n)zQd%lhBD`B$d@OJ;$8m5R$p9kL-XeYGm;`d^w%np)Zbu8+E8{Rbv&$;bk zn3xgB$kxH)uMk^&{1W_Q?jSIUn*l#28q44F^*!ODP2f1tnq%&$uP3 zs3ndCl2ipj5fM2VAxZc6PxMe1kc}OM@AA^pRGPlH^yOp=`1uMNzZ$9%2Ua(zU zx2HTU`d*Zk1Ld>Ib%^}I{2@hx>l=QDA(w2Eo3Ef8fW9|&QUJJTH|^>ulYgVl!4d2IuE@ZBVxY4!J5x1 zpx;fj7)QAJZQXW5;xd^{cern#J~A=dtp%Ii8@<%8%w^yN;@mvE@Y2^zb%Blty@oVd z_+KRa7jzCMGW`}7T{L{)(Re~#Bq!21d=88b8y@(bamVkog5d9DUYl^g;FI`Gy-;XG zhwo{FgWO1vYjoQThi+cL57&aCB|Jxpu1gG>6xAmga0PM3ZBpbu5No!o7b3825!niZ zmRt|%ayZWVdV0U@9WBIyn&?%;Erx#17vedn8E|NVI8}uHN+!1+4Mo^)2JaIN zAH#K(!A{^0$+U*kFY$;cbdZS!Mx_Xw0$1y-$t9VtE|*x4Nm~qZ1|NrhXUysKylE^O zaHi8?S2MM67+}tR9)D$oJey||8Czk$9&HxPu&#P;o~qd$MfKKH9C*PQy4!qQ$JA?3 zn@M9Xzwj*pRFV+HS!Xp$mk$g-%ynJjw4|=OU~r6)nx%xVyNM}ae2K;rfWgSMYWs|!7-k8@mX946j=ur*Cy&b* zUX}DNz&G5*9TPX4tCwqc+z@U9>USP|oxq$;QY?-?8=JCxp)uVPi+pTUDy$N9;2Sg8 zRA`-}AbTJ5LvUFw(vKd_ZC-|yrht_3Fny^(FkB=uBVD)F<1}Y*+taZ3FfU2#p;3mg ziI zm`rQtx?a=`;KuxV*Fo6>mS1sk68W zZj(3pcdaAE|Ipk2D5b-YNj6)A=^pWg~6|G=^01M75pv{|JFV-F^bT}^~ zyc&ExX&$Has#4QnpMBmW8l`e}c31D@O0RO!vvMJziMLiAc6m;<*qMz3SZB_-II+(` z$6Q0)-#;5IoKno0B4mW|bV`$0w}AyBRW&)*2EEQKCRjKhE{v=rkK&7HEHRB5$Vv=g+xb-cb{2u^rK#{-apj(CPJ{JAq=tg20 z2l_+MttQXG8uDD~0nA4qZov1iX6fkaGyVwdla-i12XyZ7IJRta@2zFi8r8bJQruzg`_3bkh(Q>d+I@W z2zCj7N_C+%=7Sk{A548Ay^;DG&iYf}4!9fMBe&~!p!A)Ow#hExS13E1geH-sW~aVG z3c@I>2T_NNf`eoqjpNg2!6(E^t`UafQ+}OlP3^~00kom!z$VyD`jE3|SelX=l{yG+ ze8*Mz)VrY#cH-R$zk|1kNjjE#Fm()Nr#EWw<=7v8Ci{eB*NWsI>@f*@sSx%1+1Re% z!*lR5iI6|g1(HdskP_0e)T=lXl%w81A0Eb^1-*^u0y{7drdR7GkPoQM3d z0;#_PHBJZe$xHAi-tWN&L?T9F!CNC?GLc-3_jTkJ@&MUN9w8n0mY2x~Zf6vhj)Z7rdQHm(tGJkc)v{lLBAC|LY@#8`UrJGqp$#}S}knAdx!A8=o4QO zQ`pZH(ne{sv{iacdRjUro0RKypnLJ;ue*x6-c3SsO>$$hE!ly(&4pv=!(IsCTznqd zcGJme3^35|#){g^fb1@S^aJ@PTkb zIEi;kG>9QFPmGCi@howwc)56=_=)(5G(~zr`baj&^W{}?r~FT)uQE^>tDL7aDeIM; z%B#9*$eqvN`tQk}vQG{RD}-Uf4!D(8iaGSp^v}r8Q(>ksiXx}dtz-?omUPg3=_BGWU9+IN!TQRN#Dd3z)PY5-W484>R+P26-J52q;X^p zO2D@C_q`eNdSkO}D3p3k$Km@4D{&m-R`LqA_iC6$$EB7Cvyzu!KcJ0*jLN6AFG zWTLwyQ8iq+7x&hNMYPs~^%1R;Og^sx!?)B&8nxD=JUohrH}J3-!{IPi(1v;E)N8F| znl`L;_!V>34x3hwkK1lE42=w(Whm|q+YLqx8Zp%Bi7ebsJOc?2P|vV_+i~?^Mxt7M zk@{h+IgxrsL8}lQHhpI6*z+2O)%(NY#^T>ai^zPG;Bv+RiXR1_a>AKI|GXRcpZ zJIs5D#-eN2uGU(&oY&AZH_WiH5ubr|X>|CswZrk%>#!3?j@R&QbY){hD_M!J)L2Vc ztJ3Y86&c1-rp?t_^^qZwIcw)m!=dr5ZG~}5!)-oaVpr-g_=ag~Cp1LDt%LlL#_9Ee z?M_%bZfSc?Ld!Wlr?~fa)t2tq?G|e$U^4d%%<9hLAzqw?Mvm+5S;8oaoQ(|8s?E@l zl79KM zq{vbA-@t;5Pr6wR^RwaBc)Yc!h_Q$=6vq^49LVE+ihEztNh6Vks)inRAB@Gmo!;25 z6uUnhW&?b4X96z5NNdY^4e7WB7x~*DQ5tV-rPEl>zHE+bBFkyX=5$w|7C}xz%oe==w4nVpIbxss<4ZFs9XZA2Oy4dL+5tkju0#%gizRJ9D5 zt^MMs$NQfaKaD)oS^){hsdD6m$!pgdPRm19OTX~!jE5W#6B@$W&{mj;k{QK+ovD2_ z%r*L36WC=#Spnp~bW$dIT0ws%+=v(B&f?y~QPHhkJ3OKdUpsB>^v+bvMG;MntldSQ zrcbY3IBZ&$aXM4GZ}ztiU)P9zHHY*=p`b8idxWexZ+n8Q89%vUmkOY*nb6Qi2^~6Z zNaOZ=%xl=C0VH@TWvMKYMKl(HkpvsrMs>Wre^&yah3ASqfyZZb65wgNY#Mol2)S+j zLy1ly(r$NESO*siY`3zUW z7NFaV?l8*{a)m&f7E%Wn2sv0chwat~9{3Vn3Y`EU#8Px)&`m|R9^GbiGB3wc7NA>> zZZEoHJSQP|+HS8z+C6PIbFY2wr4>9nJsq9W#G~!!H>Ukj=cWDnv(v@;rHhqUrISmB zr2T^4Y2O~LXkos=T(NJkTX16|-AMRCL_+t2l@K&zwg@h0MMniWladhZ?fJ2a&3gqA zh(HB`%Z^ZLpFrBowu-?9nxbEV9YXXAdNiFwkG5NE6`Kd2LqC8g(CtMh&=2r_pS};v z>0#FAh=b5=Mz|Hkwa zM;0E0j?%v&s`PDa*4v0y`WA-XqHiH-huW%ZD|YcfyfhOCMKb}9KNGOKD>~^bZQm9m zN5ycYk)xgx@?aoT3VChO@=&MXZL7N^)JZ>V*W#fqgUjfv(29;CC9mR}Uj+@_Saj3S zEkq|{=rs(z1}*3|pxc736&-RJqKZzV2hhEU?lmYwmq0fbosPcThOgdnh&7 zM)zXhg%C^84MH~t-Bfhz(aCf#&1;((vg1RZf&)6hl5OxA_kRNq=pZpSl!y&Q2GkhD z`VGJk!e(uAj3#0m@5U&D*sZr?h(YYebr@n0Tebp23}TmFfguL5nR7A3AU1g_h8V=g zOu!IAC%x~<{DM&Rn0Z7SY^7IXFI|bfbS3uEl_28!5O4TaWVGGWR#b#NwkZ)WEDE*k zCM|nN%Q({V0BM;;TCO84D@aQnX}OTJ#7Rqlv;;{@g0wtEYOpI>NTTDkXl=qvS`Ltw zZKS1{w8ThDl(giN7L8OVI%&A=>`Lwp<6iqL@(O2gQrVdVKR>V&AQ z-{yuo$z5%+r$U2WM0-Y3tp9Y=^y{>hNq%HJUOnGc)=+(eYq326Gb(pdz)=ALYt?{C}0yUv+ z2YAsHn6arXbRF|{hOP~q6`B{|8MD$E7dB%oVGWIoO%9E~=hX);3MHEHnL9&+0vCqr z(xv*aIy*yUNJ2avEJ9)n1N^0tAb;S*>P|8z(OcQ5G$>De1$yNM{Q)kzy zI*ZPvGw5_WStshK4s_1W)Zs*&ePeLS{NpRz8YLj|uu6e{vf!T~DA7?|(zQB-k#ywv zA!KChz8Ns`BCYkr_(&%)ptT}JhLBeKNEkU`NNY`eWT%oE*IFGP*{Y1apkX^9w>DyG zD_w)L^n`{^l440K{cK&Z3kb2Tyv5J_UMp{DYy_|Sib38%_JOwA;q^ZP(=r%8b$L$< z=eBMfIliIw(cH$?3KmG^HjZrl1zR}mB43eX!|HdDe=@JJVV5wFd^KzwOBV*#H#Uy! zB$IeK(8xcr9CFM*c{v?U%&Z(}x?sB8rgXU|*2i-B%)@eeJw$oAs9w*@iG-Eg-kd+I zetUjCFXPdmnU`tyXg$juh+>&&l$UY0zyV(7fV+j2X&uOm1Oiwj7~n;S4+6YMfcSWk zNvDdGW{TX@UF0VICV`wP6G)daAI_FBAI38ApL@+35|5Mi{*5!HutnFj$go-HrnTOD z#T;*I%SD>DeMVzuH5Qw8(Tq9FpFXR#F*2*Zbw;FK+unc5k7Q3_+5IE++hNME2@Tt) zBxcpO^-uI47MWh(*nZa7s_N6;byN4ds>c4v!^X0QRk3%SRsAE`)hzog_O5F7u4?wK zvl3_VcLC?|u?^dGFr*P}eD1eXqXGGKnm^n)#H}tI$eFi)*n6FSH(D!O!H7#96E2_4 z=vY?q;Nrn73uTIBS=h=tljXgxf7rj9Y|Uh;m~4v-f%uZkn=c3NuuJOG|C;f_q$QWL z4o_pe`KK<-8-|PI`sO77BU_8ck8B-;*6emg!PIH2Nv-{|X-4BPwC&T0C79TcB?>}! zL6%m>()9XF!5@zQ7lt18`wH#ak%Zjp0sYG?@Fh0b9f&Ujj zpPagoOp{Tcrdu(xxWwsJx-X<#!GelTuh%Jhy#NgLI$$xZp>Vnt-V8-x#bv?B>WLVW z^pYfK3`jRpt2gK|0qMtC9hlfKx|IywN|tUB z>BhjBqT6aUrs>w10VGKVQ4&R6_k|_ckrchbXf)`J1_2B@qrqeVj2ZOS4Ba@h^0GP| zqub2F62=s4f$ogZjl-x~SwAC->Mf_})^}eSx{XGY3F$QoVAPw9CL<>3jm9k9toxCX zM7>TFbVxVW%hG*j`WxxC*;qd_x~+iXrGO+$(kZ&JgrNuB(rI+tz{rnI>C=3K)i~WO zj1~@Zl%hW~{f*-8aIk(x7DXz$={9y>NH_8kN`b{<6TzOW>c*Wn+&SiVRNWpQ!O^D2UMm@z>Mv}W+)bmB%5TX1qVlGQY=Ora@QH5 zTc-nmz==LGvDM4eoe^|;ozB{QVF`8=&~A4+?KYP~2X?E+;j)3#t~zW1urpl(R@6#3 zAd1y0%NE(q>gg>ytJ#5#IU{r<`{f4RX}VP(fWd%t zm&XAvOmPIk!Rb~(RjpW7RTage}-39|_8tZ2iEqj2g4bU6)dVBYU zEknLXDe!n)&K!>(Tz0=F#|0jj!{gGx#dHbwI&zWCX0X{6MOFNEo6Tla^*Ay(2xo+D zqY=V+IgD--*mGIj{Nr@H-CnQT>GSHrZTEY9Zd@w4yzabHbldSZ*t2xo?M54;+iF$M z6y4ESfSr9agDVVRGFbp;LxZdP!VzI>_M9BQKgW~n*F%mg6kjQMk7;K8Z}q~7Ur zxSUu`(L0n7t7ozsTsFVWWZP(7n)`3h0p zS?z$cirLqFna$wGf}v12917%zO%U=$!}%e=SU6MyL8b%22R@(2=d<{H27|{CWA&^a zv(FR82AmPPQEVzIVn{!-XrMQscsamgvseP%7q$%f9>U@L{BWos-vZ%4VSYgvFqR*# zfG}3IV6O)PIaoFjFd1@8y;wb4jwO&2@#f^55xQ+Q=-Zd|GYVg@jHziCSnXD8u=~Q6 zX;?5nzn~yLTvT9%{9tiGQ9fX-Aipm}nC`}24+i~MHkfNR`_09J5U~zF- zS#e=inFETW)n!%1fU&aTAyAA}9T0_RG!M&0qgHF4wU*U$=Q*O`QY{=lBXqmnFmhxK zPAe#UMMIgo%LP}C%T?5Up+dm%Kq=_kx1yw9Ul&vq4d~mi0{T`I_pKNSIPRsU3FDm^?2yZbRhe2MoCdgiMOQ0?ugsZV)X(=o|3};MFnT(d}Sa2 zQ!W?=sK~-lIgY8jeDH;QzRK>)=R?{61`HT7WI)Y`AwC#TIdaH|0Wf4h?T`T%zyPKL zp%N-9ODZexTu04jnOK=z!590x+~@{D{#*VZ_jZBZkg^AxsBC4b;?B)YRlw*SOsk?g?0}I$RN` zDL<>cy!?#NofaDb1i~&!5C|m%ywX36``{a0iWz&UBr`!$U2H<<=O&GaI7uSnl!IvD zXax(R3RXlL;z?$-AUeQ~=mZC%3-Nn28=Qz9a3OjTzrzXHgJB=!VAu~n!~n-!@FNBx zkop!v95u*A3_}Pp4>ZIG;y2jqVZ;?IVg%Cq5;uwd5)Cm;XUWmmU zOP~m`6yk_wP>fiP_;09y62wXR|xlFc^q990sM1!C8<%907w7&xRq0 z=WrYeLlMt~dc;vMJoP1v<~RnjtgOC>JwN5vk(`< zY{X`cOJGjwW4IhHLA(OyB3_C35nKiH5SPMy#AR?9;?*3lfdz=y!a~IBU{UG_Ea%t) z&4?>t3F7r|d5WC}yaMq?jw|8H)CaH%u0mW5OA*(=GQ^wU>eTzN7Op|O8Lq{Yb%^i7 zEpQ#;t*{(%J*+_7fOr^ggX z)Z6edY((4&cOpK*@lm)7@iDj?@o~5ZaT~|q!o7%3z^@Qn;XcIeh;Km~Y({K{Er=cP zK zh)=_B5ubr4Qm?^&Xhr-ZY)}0ap5^!)v?2Zp+EcH>^U#5K0Cph006P(1geMUXLMP&% zVHe^{9AAdrh<|}Sh_Ar!QitFW;w$hf{2uYIuov+)*q8bXyw33rcpC9dcn0w;*pK)& z$G^cJ5#NDl5#NR9QZK`M91p|ush8k=IDq&8yny&2$0P6};zw{0@niTi;wSKO>d){g z$Isv|h@ZnNse|x$IE45Qjz{5D#4q5r)Qj*XypDK`<3HgI#IN8@#DBqCh{rkp8~&Dh z0Zza>h+o6Ih~FR{fN$YF#P8rR;`i`A;z^EO@L}qCNWu}s6nupEzdHTQ>-2yAm+SPu z|7@N9*-z;7&wilOKm7@v{>cw?`o}**ryuFo>5EU(=^y@tPXCbW^bdca(?8%k{evDl z{R6JkKj1q3gC08l{U7M`!(68y<~sfGf1yr)^Zz5A{_6kg^#9fA|8+Y3zuiv%@73u) zWvBnIPXAw>{^L6RPyavA=@c#$+Ub?jZvHX(@?8L_Z`$*sRZ?f_n?zo$u*xVK6bVGa zP6Qag(6a*x6ck;Z!K!c3Q+;P@U&3X!R_Wg*f>=jM!fdM|Ii^Jqd*h?k60)xUG5f-$0PuO{@qIl7Y6@(q%Y9dWipAuS7?e@4mwpc+d)~BkvZ#6OnOHg95 z0-M_tq%NndxCB{tIo%#d-@bjSVg)3*`jM**J6wIvox5Pkq^30&w9oz3lq37P#)HO|0u8DTJ&G$B6bY&?!t#M`QfV^2cgtFp6%cKA*iIOmE z$l2hdb96qxpPk{hdUKp!Z;sdRvgY{8y?L*NlzA!0LN$f3hfQEsmgsR$$V zE+`2>Sp>mCOd;Zy5LBZ*1WpA3vZv)pHn4&;IjZ_rR=9C^B6%^A$Hu3!f(?&ADhc_C zyese9xOT^rt5$9&wL=>x52;5d%aY)+JEaN${f5|=Tmaq)$tZS0z(P=nNDhx;%3akWFyP{Lo zPEy$pn=Lx@6EKPyH?#N@}OQe^$cOi}q5f-k=h&>lp=x z%>qHc12zj6S~^q5I#iWT#K1QlRx1x2=`fpl;2#OA!9XWkEg=iFJZ{g>$a?%g=yXKD zR#kvfQ&5TG;!q0($yvBAJsFHT-gN{C?rN&5Ev-X^ga3#v?K7{u z44ND${n!Lq>09lQ6(;rtvQp5uI+iHeJi8pJh;iZh&x-^MTfVc(ow}_m|6HQG_ z6{LyUeemExe%wCw39ZGE6=3`>5K`~9Icq7-g$d1Bd#6CCuvvIQpu!bEoLHK&zanN3 zJ_Y(I^5rA=aN)qD|U| z{GLm#3A5E?G7Xt%H5rXVCd!?uPZKs4m%J>ls0{rq)yP8WQW!s;aGT9TCI)1NRue-- zWw@QPAJ-)ezMv>MgJ!b_&5lpGtgt{LhY5?`1}2sQZj%Yo#L}P?1?3>ZLF^yaL;mgZ z51(`#pCq#~g7}r>zw@7-$=%vFP=eo|x8S0eAbGJ#x)8k34eSHRm+ZLqsG49-rEtOudy%CZE}M*OTN|$veM1M&^*YUtF?^ zart}5dfy}08Q`r%y&+9GM+0vma5SV_!BJrL={#{cT~F`UiI0m!53)oBy+llu95C>% zFtA<(!n8PAj9fQk;PZryvsZw#mxZ$zj(H-7F;A95IJfvr5()sbp!X##>{$}gq=ZDJ z9OG_MM^-{w@E4`~kzW{LmNE<)#8e`)ikqM*JG+J>Hd$8spsJ~)-**f?G~vz7EZLXPX*L6D;#gGcC*P%N#e^_t-!3edIsp zGwn4#>7af!pysMURsMbI81~{}(4nu#5%vWQs!o;<1bogwz^4oNP=D%t0l^$pae>f2 z#zt(N#JhvF02s;bgqjRlK{aFr)xZRmYcoT$=MXY46ISvRT>%=XXx5u-I|k9IbOBvX zMY@~jqiMK)I~ThqX70tAF6Q!vD=4)4(k45}+U*up&FPs5vNBi$Xi+cDNMh6#j#VQE zaf3OM$7imzMaB;ADxz|-ntGzY-t^_xyRW|fUb4&a&0h|k81eAa4@?Pe+cvmv#=h(J ze{}J@U);Oa@zR^0Z)}U@5!7 zUOQ+I&dEn{@Q*&LK5MU4_s1)kV}svIGP}*g%&W}eFx&aIEBwMZ_oeDw=S=tI=B3V6 z=C#h7{12H8k|uDbGn&j6Q6czV!p4;S^7|>m{vwhYS9KaPy%+Cv0F!P=-o+f&u~YaF9)*v_;|djTP=4TVRCUay}nEH3ThVQ4pc5=Q6p0? zXm4dqaa6_C-N7t>Fa}W=0vhgTf{SIxa-owFnS`ERc}Fz@1- z*KbIE`r02-gW^r~xTTz}(@+K%UDx6Pb-Z%OcXx9&^+`(tJ;_)uf1 z(r$L@lRUW#OsVe@kF)+U%banz3YR(R)9Rd~#MQaXQJ+@r92Ff`cpMczap`pFbk@N- zjuJ?qz~k_AOF7zG9A6SMh%AUXv>6wE+P zW;A-AqEE5EVoSCp4Ez^1COBXaJL$zwN|GUw8>%v7Ck{i}s^EbyxOrjdB-IJClE{lx zDJ|hX$_6WC!eBHztAMIhqXK1>Sse@<*~#kA9hOeAj*s_0*c{B}jpIzL>(q}`K5gJ) z{zRRvww7d8e&8=gPXhdefG6|%4(%KTZ`PpU zLX$+Bq7%e7sp9KG>&gp9&2I~)frR;R_`v{=okZW0bgNW!uO*LW6d!bLJfJ!uumA*PCOdP&$A zdA6x4+YDN-it7K3Qt@)7;w9i!z0{jkD&7s6eGlmaR&obQUQL^2$B!wO(CNzMH1*QN z)a|+)Cf^Qx|Db*WSGUflX~=2D#}!A5UH}C3)g6 z&)wE`m}!(z$X_m;hjO8a3cJw!KF0gT)|m-t+1}D+0|i+&igdG4IK4jMXyMGnOLNV^ zEEPj~Nn$!Rr-iH}M5Ypf_bSK zbg#N?ipB=EAgwcG))<`5SSZXh6qZq-MYJ%>urVsfnkmxhCx@8r*vY1}EX{;XIIts{ z?V@Owv!dOc6>U~IXQ>2KRB+h9V^1>MSKZJXHCs)>5#&-G22Z?*4&F1nqwC6-Z+t&_M^&DUi{z#S1)^19B-LhHmYpk7k`^EE&25;YmZ(>Mv`mDBY)WX^vQRc9&PNr z@2)4Fz#g5BbDLXw7|gIRVcBmcBL1T~QIC@cQ#56ih$V#NI z-CjLi*s(5obYx%aF5&ur-6VduZQUJ7d-D6vx3`hc$#eIzJ@xS@H906X9*97hFnkvT zvP*RzSHp@oBRiSYJRUFQSe&)<3cGc8>{M~Svd`m^6zGooc)Tzxc*Xp=EL6%fVjR=e z8RO(}O&;iu`*^%CtJ!&VZc&%=jF|V7n(r`yKUl&hR$RBxi6tfWa8Qtd1E+63uocQt z_Q4~w2k|5)M9vZ-rwKX2_ady>i9hpxmWF|oi9D9bUdw8__^jjNEj`t~?91?7q%=c7 z)-knG-N#J|-DkVcj(u$UtW46Ek!#^va*en|x5&8Ibh&w%=Vn+-)`_chD~vaqR+(?{ zyl8vYVb4SL(H78r%+s_|<`ru(rc-hXH4_BAU_vssl#m`homC^jtQrY2HNur>uz9bZ z=y%iE5YH5fXA8xZ4>Xr%x9|X@oHRCErLaj zKWY?ZHpSVOi_GdOYdiy{IGjCnPEQ3y<}SSSEUFd+%SfCk2G;TmJ_#Va|;=Or5d%#*?X0 z8^-*m<@!grX7}TmWCw9R+_DR-C@K-w9WHMg`3%T0l9qJdap7)JcB|Y5XYpJXa&g%# z;223yliVZ=cMG>$&2IK}oXTJ?bE}yN^wS=j4o@0GXq-fCXqueh{OwK8v^;Pu(Tg#- z*Ty;A#y3}NUR&?Du~(37g^#fa7K;Ci`6?~Sc;NyqP z&!kahGwnNn?B0mzLBuJGFHyuzJ{uS6pLpx(@A{8dmG*p5qN<wGr{H@P42?eTr?{#ZMqIR?1zb8mAC{R(Hww18QQ5tJ=&Sd+D0!7-Mp z%rp$JSCT_x)6;ebBO;WQu~1fgLfKuO&~8!-#!R-6bu-I0X0wfKwzi#aCT{4>EP#Xu zO#sdgQ7%VOU3%iTb<2@0VWYMU@zdl8XX=a$WhAKENX*XE(6op&{pgjX`iYB zHcO)qC_Z)@-!6<1E+px1MhmyOubDpn+Od5}->2s9JV}&i*B`xl**_n6{4M&zLrbn| zd*qsH?8Iyx*E7sqXlZ^w(ZSo7$EB zD5z$L1oe4l9Khm5Swg!%TpY}Ny2w(U{eXegFDCbk{Y07f%vp&7NhYGAhp0fJ0#%}- zC`Zwd*-T%elMzv{>YzTvuy zvgbDPX`N5e630@tOr5Qpqo1a(5jLpLOV7&t)MKhqCpD5ubgVkZ*sA`^^e^+jEPBx- znnjCXH0UK!G?^_rSy4Ce%% zwX43sg$GzZ*{WBJ zV=F|mauME-loftV%Z+yW-MRX#t=ql# zz&9-Xe1k#num_8Z3JW2S8^oRt1%o!w;Y^a`HN08H%x1cTnXP)fG135ZuqT*&y^)?C zi!lQ$9n|=T4K4Fk;{>1fcp&pdEY8-!+=z{ik@lzgaZZbs^S`=J8SK zt;h6rYMUAzP5|sA3Y&rBHg-0Fq<10N_l-(hxW^Wwg+@rYBE3T$i=d*YsAe+)3vZ;c ztuHiRJbUH(^IQI~F8K>GU`5S2BZpsqU-E4-|H9bN$^9nWu`any+TFNo)`h>REZEaB zd;7FIa49W&_MTuRbo%G>&BVk!%1 zP+^_{3t>ra3*4By0X9jG2@jcf2_5F=%rC={+<)cTEcRSmZmv)y_p%iQw9r}RNzU_K zlXB)r^K!4Y-)!F`+-=zu*h(IxTWx=}IKT-$)v5YK_7S$NS1q?&hV`mdtw2OSE}8{@ zP}Hk2>p2k9(7^D8JbdUpeCRxU=sYn^M^L@7Z3z>jQkN5)F(v(JJ>JBJ07ruz1xl}! zZJzY;swVbr4$acV#3PH5ynO6bdwykw$j;Q@#7bRGJDXa?j;9ACpZVx$^7VV3AVZ)2 z8|mGDZ{^d!c;v$=^FLno>klX`|ML4kkjq~Ah)mpm_=Vyvw?B~l^0udvpRL`)=8OAK ze@{mFvO+G&N!Yaz8LCUmgG~)uLFdVGaL+H7ClYy?hUrO&e;d$q#?%}5w_Pt!;S9}H zsxOqQ^8Qfy8bakZiu$t|`s*x1f0JeC;EynLCfalw7nhd}U7F}C_!XVZ{|=8R=XiZy zDziV_V>Sq~%k6YK+=A>EJYizDAb53wFmW4fVc@4^*bi}6kS50Q9=FGBcR4BYdo)~; z`6N?-Tz((<_OZ#=H7;o$z3jGwE0fzv?QIX04;yvorK7hcUzB#ca?iae`O^M}lgUS> zS8VHBKJ2sKeEfA0`-`v-u>YM6``!p0370Gdbvi`>L1dk8&Uu08Fq>*oN*6` z`6ura;wS$q+$indmK^kW(!32RLK8t;i7nK_1Bn5=h3gg4-AHWUy&Bbwl=_VSk6Oi+ zJd{uWyeY{aw8_wa%1^fGNO~WJS-St(o~^<=CqJUCU1M2W`fcmFnCYMSsDE~${)v*& z37_BTchPAD=mv>oiOfwJzS2YH{ z`ZDCiW?XQZsu`s=oyhcs$~%MY%60E_V25Bl{ne?K?M|Wm)Qb^+z!%5~2(l@rMqRN` zOcxbnk*L?48wR)45yrw!ho)dGPl|>~z=(q6v>^ob;V|S2>_^0Wg&j|yAk1D&w4jOf ziP}z6aBh!MLQ%u9gIi9!h&ry?CY(#>uTQ?b<&EU#j&?Hk?ahST9(y8u(ar@cpT06& zvzpM`t~)l64tkt)9bVkLi(L4|YoxhjcIPk47PgE!@5V7}Ht$b<(=xr9*w|P;h*~d? zNggq=k1YEVZilN%6oPug7Q@R1YLF;3vcKGw9Wq^Z$aHMT^jwu|iXyX*L);F)e70!D z5Z@=3*#=7yw+9Hf2bx;U#7vERz>IvrjC{b1TIRgMzJviu_!-Qu%P@Nnt?14Oux2Kj zd8~Pwd7)YC-{_4uE$Tj~(5)rYgCDO;k3BykRNGX_RVBfR9c2Jr1o6SA>32^*-6c!A zyM99_e>a@Aca1_y_hR?0z@8IGULuF`_6QuQ!oTz=88iJ`-d#xEx9OciDzWAY95MU* z4i>=d?-RTqm@=U35NL!L;x7rB7@Wnbj&y+8{k4 zp(vrvy&kqeD~P3#fU)o%90SR&Vd4f5r1W;ytTc}C9CajuLSA*PPT#M< z&`0iTILmOpuu6DcP_8h%DZGi(5|eX2iT0A#iEE`t#m{w;K_q>|*F<(c=x{=B4_65q z12jw8O|^EG+KzEu#uu5N%l&=rb~j6ZH!&aw-x-Y#(CKq>2B3854SJnH5=2px3{FYH z7&5ht>l4{v0EvnO$5aP8gFuZ0#7^2TVJ(x$7O7R*CmohV=^PzPGnOet!}Uh1A}F17 zRU-IfT>d|`UB5atD{W;W!Be5d#x_dSt}--wXE-VL^0^9?XetcWDh2b z7B|I#t(zFDkTAi2if!Z5^bMkP-A%7gLDz|6D1n9a^{(HZyo-MPd6NH`UbZSK;%EP_ zPnZZr%_V`3?JacDhZA9irbSZVLm==W5Pr6aaN-B%mi%Mp*2hh0i-66WZ01CwUqMd) z*EUAqT>!Eb=~D$y!lWxQA_0_R_G7LN1&r%6oyBb9GaE`C1|)WXsTT{G>?~Wdngl%% zs?!@Spwm->QD!YLs*GwQQoWOvGOED7*Js-HO}1?(J5D=H$Tsu`?c1lm{PI3_q#_@r7zqsUR>$mW1VgoP+KIB+&(GqL5=u7QE0lHF8b=e80dekMdBCe2{4 zvT~420uT$DcRIB5Si{-Vcz{3TDLM)4pwdYRbH=ifvjf5(3+(ei{CMecZs#KFryJAM zL-VA0)}L4o)T(n*zfQcuw951+>`K$wrn9X=p%^vywloMAh*y}evaB}ij8xLqn)_PD z(2+vDlF*GZ53v~TqIU}$m5sWs!o!Mer&f!lOroeKsLo_Imq|Jd>P+LT<4A%~s?)JQ zjLH7!p~}W-n!UwN?Yrq#Fq85&Nz-+b@`T%@H}Gwn^d^l#OPH1$iE%eJ*g}k0igu!B zC6L|pdtVjrFWR0)Yw^FYpJN_!5zhznmLUTZ(O{n2}PZ4r2><8TxNLsR+BK!wj@Gq zcaeN@L76+J51C4&r;?MNNH$2jzyIpC5o7NWPJTCBeBt{(;^FT#CSCX9OcG*NHQAFn zyM?Uw=?;E2!0x+bbI4>$X)b2W}2!c*8QmR*UqQEC(rY*8I4og8B zhb3vUEM;d$soTbp(xQnrNFv7Nqe(Lo%{bOL&A8CmVw8-!ZZqD*&3JC#n31TTXU~g2 zG;zA^`5x17yeVGC2f1m{@&B}G?Cb+jZS882k8oDs3#r3TqMFxf2*7nZvq^CbJ9LTR zwb<@`JBQcm5*6uSMXiELo-O=$=3uZQ9b~DI^qFj9q*k#w(K%TB_)Z4~bJM|G47ynG zo9*3NpY#yUGz(M`W^57Lz0V1B_j4zcIN&S9!(_7!ZyY+#*^?hNDcb))rq#Lj>(>>-budm z{Wp8=rfN=55bQyt-j%g$UD+{rF-hYSg)64v5-ocOnIA%B1EyqcBPD$@g9kq6s!Pd! z0aDly4&pk{*OE(et$Y@;a$d0Vhg)Ne1JY-d`6>nE9vUtuFyqv6ExR$&)IHjx{`1^& zQ_~`c3gHToEz9`=qFRN@3b0ktSR@Z-kTs<53uO3X9m$=0UrO%Y`X`e6`rE|6^t0Rk zoP3=gAoIzuo=!gWxA&4;cKnG<{(bW6&#e6vrdW+s&5iDK4rolo-- z{O9wUd6$`amzjB&ng6G&;2*B+b9&C-r#1i=rMouMt=XkLUkTu0EAZ~P+pd~yxBde41L=a%1?yh++^vCrB$|EXkG*W&_Nw|vSCE;HL-x*v7b zHta($ZQHhO+qP}nwmEG~W2SA}?w+=d*K_Xu&N*-0hg$VVR_u(-h{)KnSJleO zpGk#Fi9yW0>@Crv>}gr5Ts7t7dFI4P(@HgKm4w~n-1jM)`13R5ru~J}4O~6h=|1ww zv#6cXJea^CpdIc>RNcA-%NdZy&Y9aFPg4wxXpM`M#-7Od#=g;|I2CUairbuhQW`%4 zU#af+yrU8x-XbU1>kn<%1V6<((e#w}KA*(ss{`z7Q`d!AKFz)8z)*HkOQ~mz!#e}h zidQ#M9@=5*bVN{{UQH{N*OjyPbU@;$r*#Vfo|CbP=7Q4ZqDErCX3EtGOI>iC))VWq z`hznEFKmQ@U_vHQcB7lR>z&u%tM7EQT=wS5brDCUv3xw&4YyH!L|bH!b?fXelX_%h z#T!N+O?R71jz!N!baJ$W2W+)f43s))P$>&iQ<;5!N%SQ55l?Qv;ge_hE&>C`mlo9@ z8mags4tB~=pU@t#V|il_&xSyhSoOz20apM%SH}I7!U!nDdL2UPg{)Ci!wsAA zDYI*`v$&|0^Y}XTJEzN~M|gUcWMHL&8Q`$?-mLL6Vfq^a0aFwr z8FuVZPfTJD=DZ8=SC=$VD&kOo4~5U()kq)p@SW}^3IUQt14~?5W@RIT>&>pqa18}K^fIY|ABK8?^)H_DC1M-$<8FIx&4q|D(Ij)jf(-$~#Ys)1)B|TJXA9!j z94}{J9zLp~_ZwllcMRmjA=Vv@>f~HQ&fExwQ`C1V!E-}&ZOoz1kFICm5F43_B2Ze) z2BtUPVWxQlB&=jTO!aCl<`dYt=+d5{<8zJ}w*cpBOW9uw?B3WcRkcPL7XBR{SG%e_-;tb} z&`>y}e4B=0s+AI0!7k3|uZC=Uwf+!wWt7+4}=Z zNoUT>!EtvbGRcreF3B8ISNG} zs;h|9Nx-|gtA6gu<#^3G81#Xo&0CzAXKuB9Dji_E=rEWmb2fp&cXY<;4}bgt@$D%M zyar&C@OtYx8u$t|Vrz$~!6I(x!1w`Uc~xmM(r!8Z-mp+Bn7TKHxe>fTX85rV$5CZF zE^!LG2XcI)2UPpU_$LZfZiYyY!s?rQ#Q_xm`DRc~p1MDc_2Y)=0AF~b7^O8fZL-57 zs$%EI&DhYVKqGuOsn~lA?5uXlVD`97>Sl7=vFg_C@;FSIsKb#|)P&iyP-!{Caw$Bf zfGgn04zRKW=Md|h-sSu@Khu!N1h!Up-jn|t9`(YcHL^(&QlY!3vw*Wka*S_S;5XjA zpVsmXzArz>M3en}Qwq@)*tc}=`@Gu3nDQ?0o!~dd~M>d_t1s_`>hxR$`N|TI@P*T=wG? zQX*^_A`20w4cNxn07d|W4tBfiT8_JTU~x)?YiM4adTzoeoKp4s^j`8@UM>3bJVxXp zjawAhg2+JRS!@`ZBxgTw7=-Oz4y9v7Q1s?m5>OE zU59~X+81KDE6q-pvuDd;rcKQs#UF>OnsCpfo@YOTF@jK=M) zVi>%O&N(2vatB~&R=ehTL&zmNeAvKRz?kwnbVUpKH6ylu<6k<`ztaZBdVdRUju~Jk z%hhkZ`7=FO_QNd*TksB_V}57v;6P!lBev6qUVRbzj0@uBz11;Did_rD^2YjzG?@1d8nuxY^l}uOC={IC9(=R72tZyptKHr!8 z0%*DcSjSZ9mi*z9w>@TM6Trcu^FmOqK88AzotW}*nc^vg>6YheJdZb-#D3c%mp0= z3l)enqsAdYeYYW+>TkR&53%-iE)yl@7`sA8!rBbzs7qAFjo?ZU=Pn*`^dJ`QAkbo( zs5aqBH3>78i4=36YXL_hYVB`y7-KfkNThEsb0;@mi%yOnNL*ZD%p5kxh-pH&vB$ub zSago7i+3eO+Vf1h-rO`UWaIVSuSUp2Zl3;`B!nX0<1HB9%2+#J=kyW~ zKPB0>S|7x0!xgA&Av8Qgyl<{l2}8mB+*dS%&7t8JDe9w_ATVh?uf2(Ll5pNDTUy*9 zs6d-v`d#e%4m?M2mOM%!2R->J%229td zEUS3fG<+B-tPD*Phj8V$R<3O4HqO~#%Qj!du32;Yr9!I^tA%&Kp*fvQVg*!S4Sf@l zqGu2d5f@|;6mhP@OfVjAAxg8UQ~pw!lm&9>Hv_xg_s(aV%Icw`J zFOjlS4_VAzUw##msq8U5lGG}vdITSNuud>6)7IIja(1IecBG{wRYGg+VZ{v?^3ieU_A+?YW~3xI~5f; zu*+?r1}G=IL&w2NHcOse^>aZtF)tlbAn&pbxYFFBp-Pid-fbroj+Y+}*_4lPe%9*l zy@WpNSUZo2TF4q;UY3fL9^zuXQ7RD&3|2qFH+4sseEj3%vBGWlty@StlPjviD0KU1 z15_jJ6v?xpJ5N_{s}e32S^}mDPid>dZEu6`XMH|^p%~qoNstdRTAD7v1^1}8zO|Wwl!wmQCg6{SdD;xB_ zoF)4RW)i<QItnLQpPc#xWE34)oVWS|`;?UxrYBjIdhVGPEMjFXnWSv; z$0E&T5dnQie&v?3p7weR0ff3;C~{6QnrVerjVwTxi;Gt^^9zDCl!m?Cc+RnbaW$s; zR8Q$+RheK-4^6u)HRUO&I`&7ib+H1D7Sw2U*1%Xb2*9pH;5UOO=e@Mw%z|CNLBSr! z$AWQyKn(!&Kz|1$fQ7~Ij|JbhL4vlQ%JuK!)hD`~9%N<@(fZ%jq!+iJC+8S(DTC zAoh6n;plYM1x@(UxMg<;-pK8Fh6_gah;nJx>`^hAv8qY1 z!A^_0)=l6s$cSu(Ql7P|D4o<~!r||w%q6ipxd&t3>4(7w(htlJ!UvJvq6VOhZfU|X zw#=AGfbI?FXQ*+Aw}rRO20zCknu$pCZ2t`9OmStBMAmut?dAwDO!SFEXD9ykg&!)$ z6}6l~I;D=f51EiuqA{-m14aQo*WmHxn8}z56r^#JEIfO%g-&&}gw?2{4gl@TGSc9v zU|^>Kx4jtpvaB8*gr_Nu!v^a?)09o1H9}(WX#(fvK=t98)Xp3D9i^k>Aw>8*z^*uu z3bR7|p5Y(Dl51Cs>jHuqU1dsCBw{ysvphT$ z^Ud+UEAg>6aMzj3vBjuMD;rW>3`yYAnQ~8c+df8{b!>O4^txEl*!13l2I$`31_$V_ z*E~O;<%fjqHsqfgu0G^u;#%~)w}#iMYpcpd!EqCn6WJ z614I#qD)y4`KWmFMP;zXUEKoGJ}i7w+n!9Y+b1S0MAkMIX9K(P{sg0ecwW#f(; zjhz&@6PT!(X$WQf?bLTPNE$*mU>a=JpZinpJKthneXfLMVy^t*_R1Odhp0_Jx3r(? z8nK-!tA(brR)J5jM$wI|6LG@$Mq)I6kd(p=@fE4B+s_%@c4lZd;f35x`bF^o@g4KsXvc15@3`Ec z0NkoPRl+@%auwQu^UOl}=#=KCbLO$PZ!?G~gIU%uELpNZP5i)Ylk=7YlOGSzUKuh^ zh$Y%_Tq^{lh}Q5!$#N@zB~DmvDKNEooN+AzM>DXq;Ai+c{;um7-{Vn3I%gqpBk{@! zlxYITdaIV2bk<3H$sZ!HOX6S?P{s`2{nwGkx?Dh*fg*#`fioqN+2qJ~nCIajVsiVe*}Ct7m(i zjfwL6c%zZZ)xK_gmE-Qhtbdf{#=;sB+nMIFdw+@Px;)EAw4hE9KM0-^26uTIk1fbXfIn(zuKlk7a%^)#hW>B{ndp^BT`MAY-XR9+=yU>qzEt_I<2b z4?dk<=R*QZ=lE$iTDP=R*!!j{DAZhq9b|Y^3owJ7brDt z;F6Sa$S7gP!c>zFKFMVei-K;_9F*NnA8oLF@J8&1KAwJ9k&fNB8-`%aZH>*|gu#e+ z^IQ6s5|l){!xO1iR<+K~dNH6tLt=?(ZaXVW?|FuEC~naQ)DRajJKq>(=Js3r6gQ4s zXJ`up$~Z$YeSnN+b`&={Orh%9*r^M(R=kJ+p=TXQm|`?dI)(6= zB>9=d;+~+TIm?V;t}zE9ugr>ba4O8ocTX2~kD*b?v>%a}R&g-Tf0Ni{K! zwD6<_tA)K$J|fZ2%Fxxu%E`*Ed{>peOi%~=foF(UUb#s!O|b7D^Zz8H>s0 z#S}}*n%lpt02&{fwV+@(w7I*vLaWoUvJkXT_b`W(x1+H9v4+0hk?ZWB>*=Y2{*8Ga z>*?K5siIfy4&zdyL6g_|HF$1yAfp<_h1g0N-wa0q7)<=r85h=4apvsk`?|T@&?aeTibTV~?cr^wjU%*bvp5}7G8Ea0EQi6IR2kA=Y`FC!^ zab`Ns%0duEHKtG8uSacFEffn48-psXd4IN|HSdtV$B3R$VwLKK zFH`-nJJom_tKVRo%(>#nst4-!Y`e|KyVH%$)AkrE2D3Z&NwE+6F|yw>L+vOkJk<_S zo$Xln`crn`kuDcH8-^@sRzNol2nyouTKAd29K>8?;nCp%w9?rQK;Rq(zq|{V8#kz6 zP>_nB%CYfy-o`I)F93jap;S=(GbXKD1{kW~J6q0)w}s5*WJrm^{@f=(i1gv> z#l?l~#jVZ{S>d)!Brgikr;1)-W@uBU;LsmXT>ueia&w*hMLW+WvLI62M(RPTkCR@Z z3{99#oK4tydtpv8Z;-ih65Mo-*oRN_LCz?Rv4bm}l)dqbz(SRfhO4Y<2og9^2(;x# z$R;U~jFvxE3mTYBmT?5brsW7g`!qrFVl`nGyG6wmQhrW?=~j~VPL81z^-PFV&}^`7 z7BWQ8mil0`Hj5Xqd(rQ&13N8Ae{C&a^6;9D@_prDMT_&5lY^ zbwDkt!cIbCtZz6!6dAS2ZTUQAY2mUBa*xaK)te5rWh9FwHuw9&v<0%UHVQo5C_6K$ z)9AGWb)CR{m+kDZ_Qjj$*g-U?9M62=dolu~0%KRB+mnRgbeuML$E58YKx<^9U?(>2 z+n(iXU{IFQc@ygxVd(FRfMnmU`9>7Wn8cS9?x_13*U4%Cvkr`=i>x%a|W^>nd=S4EF4qY>FMqb_DMBN z*>Cs6;W|zR=}UvA0Ld|)o(Tkox7b~ewS#VI?P;JCndlmC!9+oS%(^`nk5Qf!foEo)#LQ%xxg0ay7U zLaa=Jl-j@*rh2frZy!61OVm0l$_h4_#m;Vvj|n)51r|B~1ac-07X$?+90%h7&n3Q3 z7YNDhJ~jzSk72vuB;G*gNu9uS)jsHYdnNF}eTgxRG`3Ep0O zjBf2DElxe(G;|l2E+k z@atq%8iO7KX^zbf=F*a~|>wjdrC z0(t4@-qqziwk8JB&Ay>LB;=hYy^j>jIvE%bm)Uhu#@gn~N)%RAX0tY-_?1B+^}S1;k|9TSqQ!F=BlMn z{|AkCFb^s!J0%$v#K?wq!BF+aHPCf8ds+&1Uqom)Pf&1q?Qy6nu&@;{)#Q~EqC_1h zEUPs383qdVpLetQNcm6Ec}e#$J%f;P4*ijG_z|#Xv1=pTA?t#I}9e*2!_7r^_n3V zpEY(&ydX%?0lukD4oJ{R3%dO-L^NIQ40Ee8>g;m;vB=_ZNGf%f7X9M*ieT@+0`vn~ zO5p(dHvlaNm1^&kK_8~vY<-H2d#9-%I~=u#GtES3(OAw_moV-F_e(kNS6p54W(LAr z1huK-os-1V4-*LF^w=z19+zEukTyB3ipd zHT4DcGYQwf-<+QXtC;37y6Amz{BpSGI%u7BoK4?IkrP04^9FVM^@^qE4(l7AG)B2) zB1$-BNTVy6^5N>HbKsx@WaF%q zk21l+!x3m0qyh>CD6@h1h}R>#_c%|AiG6^E2bf@?r{v2`nS(e7^E)7c3b09G=D*pB z=lKD&8s{UD>?MvV3%R%N`CLS$q}A7;m+X&42HND7eXB* z_D%FA@hcfua0%(Af*v5p=wUXg*fZ*9dVG7BBKI6Sdh}6ee;W-=p<=b}v^oIA7Hx*3 zrF|=LJ387DI}rCfI(OTAKVP#;$kNeBpHP9X1ZOxn7P}yv;Oyg^!?bcZUvbgM9(kCn z90e5tP03Me!T&)?1rr4$m4nB{$0CwhDibFoH<55?*;sRG=%mE6!pHf#`# z5=h;pWJ)%HOao~c?(k(jCeuxgMuck+0+K2SH@gcgg)BKo9Y)p(?v-g9ffID!0i#1s zFiO9S4FwgDuObGw%s~a_c{s->Csv0Kg%g+_KPGT+)4i?7qGIO+ z?00X(D=qq>SD=sSQEcm$*J}-*f~~!-0jrn)_>Y0&8AP|-$lEqvUhKF5HY-7|Vjc$8 z`buvZjxB6k+2*u3@HlZ9NI6Lzlx|9vB5#dn+?}pzvfi>)Glwd?+WDIV)%C)dUqww7 z?yMjDuTF18$7K<6ie&W>>>CoLDl_oe%wnWmrpye#ywgN6eOk$cg5*gXq?fV{Xqnm_ z?Y&a_qO-Oin4@gvkk)fa+ju5wbWKToWX<~SDrq4$*SG@uXl~qU$Tx-xU-WimO0I`2 zx7oJ0kbm`1i1J`fMDZr4_^mbm=3CXNfTJv4ISGF6FlCpJoJ>SL3qa7cdy}B;vLtH|>aDVuGS zscttbGkAPVQw-wJsj?FSB1{N&>3LGUaz01Pb(-xIs&|;|#3JXK!*L7`hld8`bY6Pce>!gud_b*;jg z(zkzmfUuCJJXxtt$w$7W@oxQu22Sr67Cfe`#ltHp8(-p9sAD1YBdHBG5lHk6j{4&Mww&k5JmC9Lj$g~+X z5%!j!4a6`G%A}b1{MqJm&cw8G)iP(2;HHF0>3L7|zf2I}NbGmjf&mGGaS0xdIq%L< zLoBt-*?OTH;O8q>j)k)bNF|_f@#pP!>K zHFE6xt`7z7_GsYOBE4vIY9N-U$P!BOq>X= zc$Gp-do5ylpDiGlJ%Y?97CfecP>!o+;p<4ZxiOtGweH!%eCPImdA&vvFJhtMgU05M z2=HZ2wlA0sv=jzEf}_L6BMvyY)nO*pG#th*#X$1tc$Yvc_E+%ACiFcnP>&=#{9R#t zj&Y#UIVW$VML=a;FIbW*!{C^cF8GE~OyM>>2U$cppse~kb6!rOphHsw;YK@hMBPNW zXd-WQYHDl9?)m0mz-Q-%St)3DK8j3s&APCqw1v;s0+)MV&tI6qFN%*6e~m5ualOG= zLh2&Sj(gMLVfqD6y5n9=>D*-%rZH_YLKI8M&DQTOam8-E;}po*)bpZOgJ`lk@(46W zgV*>0jIQ5(YbWdXvJA8z9O5La2AK#_B$*rYz|Dd{BCKe)H{|9|i@1PX zJOC}AS|d=awb@JdM>$w*HjqcBqj}mkIV`6X-V5*I*=p|FADeiwR^p0vm^%w#ZJ3To zZk@fv7GE277o!_@$U`P^9gqmhIPgRl6xk~a?3GCX$4U2wm_>koFk_Nq%oOTiP7D~$ z`%4G9V19{E1E(z*#F#;QsZ^W9jbibH?~SY&?A7`^J)@0>UkuC1LJjwloDHoi7&5sN z`=Ju85>FF-Bxrw!Aaue9qghTnIx57^zPB{o*gpG@j|AYSL

rJy5{!1t~j)p9Zi{ z3Yp8`=CM!I9}Z1@0YC48DT$Ywn_on>Mhs;gQwy>-1#r zkZ&aTs7hNv0|6P-BjNG&*V4M(R_1V0S8G<6)f2=2ofno>^32^bp=ymm$P_j?5fRLx^apL9A2ucL&@f6o|h; zh=?n(%tx4yrx9iWEH{;eh)I`hRLUomuGKg)C)=i)2aSlZB@*4lLEd+a9H2}{<5>K3 zkEe2)kWOaaU(tPR>G+tCPGv4#jH^hpN>(iu;fTYi(GH~jrBpm}vv6$5t(8ebXJ9MH zwv$ytaw9V;*@Rf9e~ECJdXeHc%1!#o?-Ai4`Ha#iqFvWH@}{~n)>-EL%ey#RKb8_^ z|A^dyv~r%IY1IyFkCO2+v~YqOBl}SQlqT{BvHU``VgdLG3n(!l7K8^36&weJJ<3B@ z$s+c$n;Qe`W;tUk!wfU(XB|N#xdexXgRzEzdbAVnW~dsn==D#g!17`0peIoniFa=v*2G$3^x66$4z#h>2xWyrxxxuJtp3wQ1^aVP)`dLTN5Os?$VWsW8}?p z|G*WzG|5C0D7a9+(!0^ULTNBxK^%HD!?hj&l=%8}1#AUL6rp7oVpskuP}y4m*&D4P zPWL)|0}wy$=d(dWQdy@Ni56xkV0yl?_b;lp!OQe4VBd^IM#3d+{52!HX|5}mKma;sUR zGGHq7C+H(4&anKnF=y?~?p=wzw0SU2kZDC;w&?1aTLmIX@J>gM=f}TM3f|%<&pj>M zzCE{i2x7G|>(YsTdzWm>7jm<7IFJ@;OrgCM^t(uvc3~njcT^W2iGZJC$j%?FBnY7< z9p^OEl&mljWl2IhE$N&YZwl`#-WddUZQ739E3Q9jKQw=Rn`XZ4oz`|Jb(T3c-SOHb z{EcFe)y{Dzw-c;gw(26CqiZ#v(Oe*EM$Sa+oYW-f8SSI&1T}00N^ab@dZImlaHx&CjL`xo=-EnkGU~me~o^MGl>?iioDn z?%Zn&N6;itHkBOtNr=<2H?VM(MRKz{{D*vo?Nnph>f>r;jlJ=&+22>Bhil=TgKsmU za7#8g#h=_Zac^?%uu$SW327)Ig!|R%tTK2wKN8FYg)MOQbZgQ@AJ|&RO+>hmM{f)J zZVLqtIm)nNYq1a+W^W_+GFnWJ?Y#&H#Vi&SM)d?qYs?DShp2I8 z5Cg}YRktE@ol>mB0uQNLmClg6ms7Z`nYX$(O5qQpbQX4Jpu=tIgMoNjA#kAZeqi2h z_qP@0H2zTls*6*Esnz zytukC0gY2@41qjGvM;3Wnty}&)otzeFJd9NkQ zu&rhq_c;p7Y0{XdcVP3BOU4vPwNvaOyEI&rdrEsqZv?hl_NZ+!Zq`3ET#j6x__gq= z3jV@WVIeina>zLj`@R$+;8prlKSu$XnjeN-QscQ3&bLbwUR@#4gczJr1Ql^2t6Yzh zQD#Fif;8MEWr13RzP>`;j^1u~d6c1{kDf8=p3S-Vh_@v zca*flAh)7%?Pcd80vBKPj^8LkWGU~dAdyyjkR&B{+xv54y&`OIZvf7|nafPVb>X^T z@ucwq>lQ3@y15JZCsyOj*}$PhC{U3MG7d0kq{xts$LB*Duo;`GsExe{XPA$ZJ(BEk zB|${t{>%e0q-~y&R>B|jee7_y%5jQlS2fVtAYsa@!J4+75uM+cSB?v_T+pmh#jA!{ z)QTRmX{P*2lNweOKVj$*2+PNQyh zEqf}thvReJtHv(7+u4J^W9ECNtivJrt!xqt(!ko|n@s_srdPOyCF;((Fpf0)jy-KL z`+h_P!eNdQikM0YeF$+XXLDF)QiN+g}*!b3b(Z(3MOn7ug_ zr&(hJWkv!;NH=iNfobzM&9Fh)=@;he1UGBzVtkbK&74tMlIUz`UAhepe|f5!Vzky+ zT z_8X_KHz^r!VjCeIW@>Qio)S(wnP}A=C-d5k(N(8DZ-WO?XnXBszC91w6iMVXO9-`X zVbcu(zFin7Ri_>jgatKEG7w?Y_;71)dbQG=$JLI*KAsyqdCo68ob5A~A~mDv%#d-3 zgTpwB&dvzk;+d3k-wz9_u2g2RpHZ8{J4CwSHb^#z{DNY4l?5vW-itfeDc`kUkPv@Y zZWxMWG9;if(qPJ?Sc?1Ue?NA$Ou=YzVj9 z_Ex!L_R$mGe-qlTRn#-WAGD9b7-ZZF{}uG2C8NiP$}nmJUSlE;#+3KlNSze+x+U0x zrZWF5igT??nxrbt750!|Wc{Rs_v;Tjdk-y}ao^^4vd~iN`|28gza|eG+nt125}$b8 ziOLlkN#u5Qhr|-%NY*JkFCha6D9v>G1xbMY;=^7|v`i^6KasAqvJG$cbnz^#Stf`x zzC#Wwst~3TFE3=#h-YuBAXE&?Yd3H#2+CP`J$+`I63F8lm+b9hyVrG%dIOFbl{Wkg zD7*19Rwf<%+EM4@VrT>CN8yVxh!=?$dQIz~hHi(}8g{MeV1r(Vsup%Fv@2xbo#n2D zo)<66?w-p$^-HOw0(Oyj;+L#CqETiAWA$^)FW(>-9HJT-v(@8JAEfocEAMO9Yk~w6 z1^4nf(_>96g-0IQGM+VGq9FX{<>mqVCIC+ z{DlQ~GWr63<8#on&@!?yF@H(^4Dd%p!^pru%fY}*&-w=rZepW~&&)#0&cV*i#QueZ zHn0~ru`n}t#%E*rk}}dWec`huzTn3eMgq2G)+YG$|24bdUnFuGR#s+O78ZIoc6=Hp zMrK+zdNz6{d`5bD`Y(+1*UaoJ98BzA6y`tnf1!^}81WhY!j%8RO8$e2{-3`7m&QLH z#eGk*CaA*^gCCLt_iVE+YXH~#Y9 z!r9|5v66?=m-7;~rgncw?20C47EaEN9{A(}#&(7#6p(asj>aaA7Pe;iY6aU#kDK*cchV%wyyD0?+^5`sXSu1O1nKUt{32{q5*K z{r)!RYy5w7{^k1L&i;YA)lAnDdbf*E9!B*7`-MGa@dBwxSv<0?uGs1IsfJvQ@r zh&KZ-X0-QdGfif?Zef0X%iAGc2`CF<9sR|flLPD-oWx3eq-^n-U0 za1k1bLQ1l6Dn6%6>$p!=M$Daf<%iOC6UR*0WhvBpPR)A=LUdWQGKva)FkRQfLk(Vl zX@&JdW&Dz_Mo8w5U8{P2k6rAIVToVXUJ$ixWcVadRfPux)sg-RpEp?5oUk`#ZW21c zEJoQX5sTv72xbwHK81x6O}?U@0+mP*%C!mE4{sXCJVq$0hdItQzQst|*v;S|&@&&1PM^<@Y^S-F*S~?-=GWmUCo#U+900u;X zZx9v#olKmVyecr>pRmmz3!l<-{+CWVhDg7HpgeS&e`Fw4^p9<5_QKsjMyB#2!ACD! z7oeGhPp&Plx~WI+DK-@!Kew7nuPL5K>efgAU;u4!Ze+NMD!lRg1Ilm5fYdph#T5?Y zvs<+|AU_RqpF*QC*z9$#2*65zeCM5IFD*AlP`)2{upMuWsl%G#uC>0f^ly0mhTWRO zXExd?a2U5_@b0DVH}#xGJv}I!#el<)1BLG@lgDN>`JDws2taxQpf`@GbUY7CR{rXP zWmz|e!E5Gj2^Itt5V{ud7>=oIvfcR=3+M)bk#y%hY%-hGe61s#Cq}PLh;hx=~uCX;l=qZuG6of zk@mMo@_NdRSbK5( zw{V-jk+Ei+yH4!zUSk+e>2~7^zdt9=;7z^Gs^6hDIvMh5LpG@8flxtdF8m({~J=K1XKo)Hd9Xf66t^yd4FzR zw7m*;BB$dO&Zpfw*`!?25{Le=MfTPL4y@U8>ANUp!kp{ESY z4NTs|rioSi_Q-CpUFj>;JP{Y|PzQ^uxiwgEYx_^T2Rg|796ztG20rh+eR-vOPeYBo zF$SaPb;a3!ili@U@XVSs*Th<=^9CN2D5HnE>@jFh`XRrDrZ`m4!=FN3b^Q3=i8SYC z_-T7^G_={@bpHvM@!|E>`zx7CAWH;~UA69ftM0J6dqE`y<-nwb#3wQe66)rbu$^P) zta?29E*@1{N=5?q$wyZ%aqYml+%;>#ko6BSm|F~Df5{BmcCMpgt>ft|x;f3jL^5LZurl#7Z6UHW7Mh9i4 zQoG7A^O=rV^xp`gnNzHcs^h_e?jfp|SsG<739L2UR#zlUYKyH4JMXL+GC_=>GE6A@ zeWXbkNv6^+9!!Tegqt7z;_`MrTQcR%HOp1C{GvKOX?#VoE(K9zm3fTKRTj!lK01!% z^NR6XBA_{W4!UT@&}R)t7&7|t*Xgtl@@dB0qFDo>Ky2n&H*VFP^%|^;jm#gr7si>V` zx>Ajxtu@%uaoq_DGit#&1{-EV5pb58qC8XGRZ6?887D&ySq${LW_Cr&O&}<$~Ge65%K%TRd#j-QAtRIAX4bOAZT`MQW zF(x!B4elr$5f_W14TeE=R-Z8+iaCJ56bJM*QL4FnAhUL61g|PL+&dXdKhFe6x&49X9*a+<{8$y2lW+D?u{Mb=W=9;Wy zB3wo%1zk~Pw<&jP_D=knw5g%$xU9#U#TuQ{=2-HZ%q2)cv__kQT?nhQ!R8=2cX{@f zk(tHlK-CtW&HSMAr6s9x3u(<&$Z=^KOUoXfNkVVm8WM=jBp#)R^|$drdc=g5%AKxi zw9Q3nFsvokasvg@X=bY>d1{QJXJzsMb7~N1U{zt(sHn<~Dvo}I!Wb5a=*Jr_plF77 zL-fyQ9%kKAOcQrx|L-t~F<&&2XKQiMx`VwW0#Ac8BUQ8U$O}nHZsOR1D_965 zJa3`w?+L}dW5;7%Vubb_ouZ|MEGHp*%t*|H`8B_VvaEqRqgP8oSciCpq+9^KN06Ri zu!*0)K)sUI=4r7(UIxSxkv!0P@R2tIP(CwTr^L29h&w!vEa1UKO9PQVBh_?+bd~+u zz&44~sN#k;MYoPEKF*f6wqbXR5bn^Aev#QDzpC+9nOjA#WJ_&p5IP10YZ*P8-{Ksl z4t)6YBus;1f+g)pw&CQh=AGqZg;c}?Hk%8e)rR}AP45wW zb_DCRb<5~S>sJ(yQZryyS`?=mLX-u4RIuPq^x`m;9}1H=voBk)->)K$1amnJwniON zwd1)Q-ORd+FJa8xo~A4DI9>M?7W`=F^<4!+Gh1z!JTC-o8t|11L4tsSR4u7yUv8Kp z>KHB?HE3BW9!O|fG6xuHhw?a>s{kuk(2`e544;g4zvGGS39pE21};0?rvv)^JZ;-1 zn~hAOVC7DVwqIxHJ-{pF6;y0@x9(R9m;>^7EHBm+1N+A_`_z~L${Q?hD9v}6*G9At z;MX0aGZ&Qhcx~AWBDqAn5jbYyxtX{uDL<(n$E+`ElYKF}gO2CxmKU@aA{R27zu@+< zp1huE-gxWzxv6C$c;Vm4Ss53xe^9zgosBFz)w3Dt73f(F;2QJuuI@Az;0!ebQ#_Nu za7^WI-O_f#y>0_Np|`_^hY%+@GG<2;>!WR?e!&WNrGn@yWI zvu*ULIGH){c*E-TF5MzMLp_7MF%|$%A@s)ddKv^>eYaO;r{x@gVH~c@4bOg(ayGq7 zJkB#JO{YmkrHY*pv{LbB?z_zhU~b21K*;jN#ncT(Mx4i*t2)TZ2JMYb#`}ro7R61RiuBxtd>YUT(_YmO3_ry<+svM9W zmgaz(fld}AoJzL;o;G?=b|>kI=#KQP54kG3o*8)fTVj8z39k}l0?p!!F;aDaee`rE z)`?QKIifQ`BOG3{?{YJJ=d;Iyz$^PFC6?>}61pF{A4V^Q&N$-)v0*R*U;(fg1Os4) zrEtmzIW{?VIkr4-oKme)nT%K*lGq`!0c3!?tVHJ|wF9FzRttkDNesf0Dha7}irsEF zy0c)8uk%>u|9Yi1Ayv3FBZ6-T)P@r*Ou5+i;I;Ja2llGjQk}v=j#9DC)5N=tXuaB^ zv}8rh^;uSgZOD}GXjsFJ6}H5w8x_K$0S}y7e>v$b7alSuWJ_!vPyhS(CDfY4J=$`6 z$jP@x&5zaU-vLg(Lt)MB@>gXLvl~(6;4m=6`+<@*_?BZtfP6GRNLC`)&U+3ZMFNCL z((z=Kh|q9CtPaUBYW2WR9ik~LzJn2(fBe9?K^A$m9UXOm6Jw@Yzk)ji+9`vw9(Azx zvau3);$p~lTrh3F+KBVY!4otU&Ml5EhW43yE^sve=Rl-B?En|7OHyP8h>-VMWa}HW zTM(Na#wWn~OZlpJMW;2Spx{IymQ2#0MK(W-Hr$%v+m}Tyn>#=guVBI}u*P?|EnzWhv11z_RPcj$+N{b_*q*NFf(3#b=!jja>g%#TR;da^&4dQ&gSsrsqBa@r3%bLcdB*w`Y>ix+_fI9c}v z9R#c?Gz!&v2yUP^fJ;uMt$`)sL3e##6XXaZww#^C@;;Z3NTS(cKo>d~1eLX*aph#8 zcJlD>wzX7-6DDNe&K;S1#edR*jkUx`kxYQpG%hn61NAUM;{!8 z>Z}{82bUMB+=~E(bP>u2RauBEKoFckSJ_vK6%aXI3EW|Py=ZK|cZLcIuc#i~X1}j} zxKfM>t`MDQYy>E+8k`v!Yu$B)IRKp#=cKry{9!yDs&oh#fwt+erMbQu?iD43ZBou6 zuGhIq=MIJPKqfXo*h{kztM(m+y~GP{B!@!o+qo20E`*Bj%ZYKGA;yI7%gJ$u0}3`= z6A@$hZ$~g-=X2;AAQyO3g>&y6FG4VQlN7`WL-V*_67p;B~B2V_I> z{P8030Bg2Qn-%tSXFY1;f2FZ=Z9jFXgNc6jT(84oMw2XU=v^tqYBK~{6NFj|#Hus& zo-oupoo&e(sY>^sYYzu2XzuNvKOJ{jvq_V}u%iRFrkKEy{?=?J=f72At_aSR|6;72egsJPRE7% zj7=OO11BF>nfj5%KQ0Mf$19j^6wKUMaJb}E=wX4tjiB4stC2@lE@teg(`cxEQq&#+ zb(g8CJ|JU9b>loc1j11`W__OAx;d;5yp4f`tDWav?6;fb9hbPFo#Qy{G)r)AWHlsD zj*<|BO>EDKo2DI%yk-CCW28Sh89`J|4z|OUKbN}qQfWibSK+u#buUw*N;fRE>OTx=^ej-;;0PkHq>qq=SfmAX0o z0)3I9UbJ4wTPI;VtQGo7hyDuOC`T1}GuBorcgA%?!y!##A< zfmA;&B{yg;c}qtXBW;0{4M*vFVt(bO+PP}1V}SuT_2m`=diPLpE(bgV+*5mI-hmar zZt8a6&-J>=k;4oB^Y~Tc6=ht2&!*I9SZk4y>^*bh?2ovaMz4cdRn5}swj5XM6-q9Z zpIZs6PK~3sz~lrg8}XOXnhvtxx}UVCT($>g@Cz)3b+J7UIV?o8mBt}|&{((AE6jjgAxx~K@KWW_XOZ8GE%H$iA+ia20s&CfU?%K2f} zwFCFD-kFWE-?reac=9*w?E$=JAa zQJp@m2|s~hsa{#jZ78Z=&r%+hIX(9thuIp5m`pg~ZeEH%j5tAtDb13x?bb0tv=h8# z*AUSfgn9J6$5s+UmB(U&cW!2(Q!LnzDu8&ip=Nl}(r4M5RMR&^Ll->yH zg5D%|ujcWvjH$5nAI*t2zo7!;ZU3**oTXZn+};I*^=q34v4|AHJ=Rtv@|0XWJaTDm)d`U-v}7 zTVMJFl&L+wSoi1WH!Z)=+wl$1+slQeEVl^79<|&xv>=oJWmE367FZ_a>v9%V8+q@I zXxQEYd&0>}To)89<`#_R7Iftn)a4cw*+ zKpyOdstp21?kS-h$Gwt7$Y4R{v~F_Ph{A*=DBVe zFuoKzVt88bf3uQ$Sa&bqK2rEpM)*wL|4jB?^xpT8t z4JydhZ9CsoltUO#tR`GM>6C1bG?oEP_srV3#B+dWZV~=^y4O9{nj)kX*264Elu1BD zX@>wRnFlwXD8ue>4}Sj)0h<$$xXnTyuq}2vxXsr%e=4vT_x4_LL%DZIKzNj9$u?%8 zb|fim-L$S{oum%gKII(v{2BluVN5*xW_i0D0NDW2>D;yqkKdT+y#3(sQBdotN_7DB zuJYd3AD@$VuNzKVlB37ok&*&^!lzGzUc4SedO>^?)8?eoMv@iFt!t~(qb6e_`_F!X zh1Il-qr7~0uK5{FVldcmezS`JB~i#-Sq0!!{{$L|E+9@TAk7o)5s2Twx$c%gKR-M% zy#9kJ6w#9wrlHRXGm!X;t|B>OM|1@b3L_1Dekj`c6$`ct{|>!7f((0ATO2Hfxs zkd&rK9sLJ$f}{^u^B54V*z1wmSj z?LSi=xDE;5+t9wSD|SK}0^yINExtj~%YqH+`$;G$47za)mgOztqsz!3oG22SoAb{4 zS%-6tRL5VbXzH6{7@^0_HcWMrtRA1F&lCntk`9o3K3*Z(}H zq(opKw|xF=z?RMDw6qrl;$2x6!pF<5lql#T2Pl#7j3CJM4bm=8L|0Z%53f+4dX5F* z)#)uO3)&#~nI%!|LzG)!0G%_}kr%r7h9wsvw?6UnK6XsdOOGs@tf+McQqR@QjLbBZ z0@D}dMG2;GxN!E-_Dx4E(+mq508$x;egZjB2_id5DW$3EXHfm)$4eGjU0&`l zIgtc22=qY?HfLZiG4S7+p@xG!V6Y)6ykM~X)s^Lu?8_DOQsUth_{1eDf>3{ZJO|U8 zP>KTlbQ1~d%fYk_!~!0M7ytVbNHfW?lVcBcDaeK_bS}ilh-M1PkpG9W4zaYVGL#wQ zQddB+FFG{Y{em@I@dxvrS%)Jh*#?&Y_27#!3n>=LeFO03HRy{t{q;hd1qB2^0#U$Y zd*Z79HGo@)YaSbp>W{0>zQ=pr5}-3~U|D8^KaQG%M;YDU=^jsDK{s z4*)!n74uAAM)@ZxV|KwRj4 z9=she<6w87F^GmP(w-n{lq*c6Q0DJ_I1Ok{l%e5n-%(niI_PwRoB431%;{mo% z1wDj4MpL28=pV6fUk7-TenWs7Es--SHSY%$b>KZM7sixGCWwMTPQMT>v|Y8|y)L^x z$AsX8uUhCmwB|1q0JmSnEc?+irgcYjt zLjfnUrQ4Hl{e4RgQWG3h7qf%jigc^4iu6vQX|hA#3T4Np8Qlt8&D)8c{9~Rbfo}bh zfVT;(fV1(hFaXp0ry1bNpc%0OzKr(;nvAyvJPvOo#QCeG4+5~=FAi9=1=+g{1>1#b zg`aonmkM?1D__ysv2I1X#Xb@2MDY%A#o6$01+^B^wAi`cXt3H)L63~bhY-oWjF)dF1!d7@qkd=OOfdH!C~zbpW?4&26b?z@I(>HDnn znz7n3cKvlrryBCY${E`FXK8pVgaqos4?0w1R}WxyGrZz)Q|KqtNAN@VE(o3O6$V_^ zg4==Zb=*)o5^#fMz~_Vv!@1yhgV6Nuhtl*ThIZtVJTYGcSB27`z0g|c*2^!%62 z?+KkP?1_~f*7e6jmt#+R#qWj0mHCOdQ*S5ZhI3D&7V*}~6$m~D(F0^F2nBvSKdB{|I`#H&aoJI z7!8)Rkr??wgcHw~pwoM$CvQl|1<{sX?)W||M^qCTj)REzsDXF=)0z3PalINYrb)e-fRVmSw2*XzyGgD z7AL4`I3i(@bcV&Zi?wK&K`i=eoDqg6ltyFQXIuMKSQX=3K!B4Ap5m#s2YH%j$d0qz zCBm|Lj3i49c)1ZQ+GvPivN={ZeTKT9{CwLk6(rX*w2H7z;xoka6XkXtlT&7UxOm!c z(+~G^Hl8Q4Pha~prUhv}KPzUW4NDu`ESzF zjk1k!o{^_n)RAx3sXVAesQ8&tb{!ILH(ckjJ}!x$Zo`dG8AAt*Hu3!{MFEARig1ID zVs;Yo{SKP!N*jsf;;>eyM@ES6jLV>bw!kt%V)>brPcs!x4a8J&rU{O``Ev<`VV``^ zYxx=ejiFNoU}Q2LC&-&H;nfogPvo4W<@`w{qTs1!EMCB#Zr=aMZmlY=L*s6+{MORZ zn~Ix<)U*^G@`btTHAyEr_&3`+XNK{`s>;;58;lb~!J@2|l!RPf#uG6I<(EQ{P+a$H zl?5!cwIlfEmz?K-E(rlaq9gzISo=FE#h`6PUG3cEVj~n8XNwhxut#@jw|73cVe4C9tn`RPC`ZfT zLSf}2&V93IOhX!VFe2}XPb(1lyP}w3Owru5y0p@~PPpE7k53ri9JK|^mtMxY8R`kDqAo8dr=5&7H8rxsf9oi0%1B1E{h`-;u}Gj& zX|7Yx{x%)+>}mfT&i+|Bla$jVO`qMGulJNR%MoZr{0>+=rrgp*)ns^FBVcHQyem;w zfo=*N9uR7<2$nL=Y34?G7kq(HQKff04~m)*b zuY^_2N!fue`KtHgSkX8?)hkPlrr{eLN$xlb?8`UrkMK%~7c zsSy5n19m#P_rsrSyidj=a!Sm1U1o8_u*ly1DqnG*_{Qd5T?BK!w3eeeeCvC7@H)de zPkAM-thqkfamoViO#)o}9r$fE=9I6;#b`VdbLZ1`*i#bhl0gm_0~&xw3`W$xFloz( z%^^4{SLi{ z#7QyG7e*b{QrnfRm4Kulg@#4ScDNthhrsFaUTSy9(Q!F$-+r=D{bX4SK0Ogyx74>@ctb@y&Cut_1UCldf_xp-qkF42g}u$S{NW zHN3;Hi4Dwl1H8rIG_?p)DS41c#69i)Wf4ar>Bx$rfgi#J6U&dy*CW0ToJJIpylGQe zz7w}UWgup;4hw~D@|d@&M)MaAI{e{(NeLjs8rUglr8oV(~okCX$dS9ZlY)wY{J6M zg}l0)aP;AbrW1^o{Ruct%q=A0i-I6q6Fz|4&(VXM%;f+w5r?hD6Otw70RPIgR3fTF zzz~^t_^VX+$;$;^WjYsFyac3}!ub+Vvr!3O6=KZ2^_ztNq@KBK3UiaM*Y7Nz6?^37 z_(VKmuGrSD%2&clg8gyMQQ=Yft(5OL9Z>%cYQ$FEj#xDeHR?1{x~fOn_q2wns=T1? zklzHVlHcIoRz)krJ0_s774K|n6V%DM07BZ^Xxm&+Sr7bW< zbu?%q(%8pucD_v9Ti*>cVc~zJ`t*M$>(?!l|A+@* zULUby|0U?uL5PTxaZ6Z@6jzRm8!fXuVpH-CUfPv%6NHg0HQG#=^q2sf*Z^Vxx<{8B zoak%|nediuL7*VtLf&i&SRbF&mp)EsjjpIm?aHhxM`^ge+bTL<2e9GEQ@US3TfMdS80kufI0%b&-_3NXAe6f0JmApQ1bf=RG4T?Bqd6dAht_7tk6Iz9xfIq1>>YXu^Brj+i}$mY=$>LK?(eA%W-UMkhyb;$XBay zn~dhGBEHyvLGEYdLX^P-hyMWIAeHBbs3|@lu_B?y#}UGbu8#J0q?X>ZIoUv*#_ox> ze&<$?a9{&Jrtc-BpIpYlmH#Crl)K=cY~)KQR|6MoXu_Q(P7|v<-%(goSP<{%8&5ex z#Aa#H@AsNmW2mxV|f0pT32+K~xpu^np|Kc;|jdwnA=|)I!#w%d$Fn zxu=7yjr1Hx^KX@Ad2s7dRejikb{o00xkyBNLo9C)h-*2QS5}R79GRL1P(7U0o zC6{H?2#u$0Qm2One3X19-Ov^(EmW&uc!tVFE@x_W{kX|3?In=n0~IWX7-iDc9hR)9 zROgcx8&tIGLuT}?okuIzZiR@2Nki2)7oU@yZv~ANS)jTqw`oyb%AB7za^Yu z;&6dzSG#Lb)DOIQZTHIg<;%hpGTl7!&tQI=m8_~--nrY%)A-4p%!gUWvO4Un2X1QQrTi1w*R9s&b_g^Du64}E>D+gyh zn8|if;3nWoFh+CtPh&tkt!2}EBbodDmmfdmHJhZA$4C z`AR9~hWlpv&@eC?mt#Xvtzqr+=wdjs8Pf@uHTEUHkJ@N@HSlN<^2>4#66p-yUK8!jvQ6d+_CGys`6oNbEm2cXh#sGf;9V!{8aM{ObvSkcNXxNXO|p?$BhK_KABuQ z-w@SEt5di>3ZIO0LXpuA(V#mMqKlssq}(hUpYzL)aPkpO2G(r$6616I)8j*PM(3bL zXmZ71CCJjCra%GswoUrChUH>BAq1oli@x75xBz zJ;b~g*i7uIKfz(tFW4(FYJFwmd8^{Jj~|El4yuXv}W z&Lh62wm3b9v*N9H&4-cr9(svW4NVXq!wwX}+#C)WJm;yY_1_sU-Hxf@*YjN;+J5Vl zU4kwW8#pI8g~OyR!8!z-e>WZaYH}j%#f=D7)>LB(Dix-)%4ky9<6gnRhKmSkU*s`h&m%3c zOjL@Kd?+Uo3~s1L1GB_%gbpQ5!CO<|Ay8KZv^Kh*>#s33x z)8#Eq9i?i2+2+?hlcK0rVL713ie`;vZPDELJ6-;$U(+5ht6CdXRS@Nmaxa8^$l+8W z2e8bF!ps%?Z~YG~cGz59aP>;-h(Yn+cqc$C$)l2;>{{WI;V>+Zs__n$$Ty|V!cZ~h zvs7S|ndYkl`Ax~x5)=JuE8Q}(Bdfcs=XrzJoAU=|_cz(;hJ*f^Mz@3+<*=y8-ctO2 z@rc{>0t+))rt8BTj-!J^ubm#}50ux>;W5-_z{9BRSNmu6e7fqOrwz_1(XDw<+YQH65&AcY4y`*PftyVQ7 zE?T23_5E@F;qh@5(Zy|t?cuB<(&|LMGSkO|j#PkkSpAlo2YHAJG+SGn`k-pmP;6ed zlgHQzq{U8JrToi^Rf52LWb+!1pnP()PUt`O-8Bi*qu1(~Q8j^V6?Hx4rx)H%Ro=CB z)}YsmIw@bCRuSbBBAS{92hk=va`@w*51#s?g6-v?=g5p!YvfB(F%9i8(nhj&qP7u# z;?{%3s=MMq`251SP@15hbLZqqWyp(jm&<)Tmucizkx(O{mPWwpCcTiG$iM*xb`~EJ zr1HBO)&{y0X$5Bm=Zks$;x-|F&ZTugC?o%zPwX%J;iU@_FM5Sm#*Dx%OVVU9dXG>M*g~X&v8Q7^^~-&Vj~FMaXnP*r&Teqy#$5moEmNQnh*) z)hjZ@(=>9-OwvI#-tnEZyP7@gQ;I5Mn~PKwQYc^&^45OL2_m4?=n zlZ#8NY~gG4Z^=5VA~DR#Au8>hF)^de&!Qv)<{>jZ(YZ7~9wBQk9TSB;XQweeFFy^c zKlkUqU8}a(JXb=I`GMW8p()YbmwaCrvERCE7T3U#k*B{7(i+Z(9xi!WcjNxKSlY39 zGNlE5S`^5L>E{wQ=!kh;zBa`A1QUE;NL|!-RkXk=h%pPXI3g%Qbb#BGU9hL&Waio zn|pYOY>ftm5ucM?@_8-_MYq0(_8eM%6P4vj>+EbJbM29UeR+0q0lsTzYiVzo!KglYDXA@Ai?2yFsGPC&0>{6gY8M)x1U zMO4ZurWJ)krGD@fv}3#+tJbN8r|wk@mdUsY3-N7%YvAHzsC*$+$&B$C zvuf+nz!Tai+eF8feu^^04Sq}yEN-X!i5s^=Q&#=16~@@=a-QeSAb8RRFUrDT@Pb>q zT+JTmVyb-L&HHmz&0l>CPXau0hCc!yWP8FDaE2DX>V_D#4IFCMO0E6 zU>KYoI|{6p?=W9|UN-eYl5Ap-S@&}#F>k_K+^>Giq0R?ckjDu- zw_~pcBGfoeucZ_|JUx27Avk~$E)3J9m~CguuA2a}dleyAfvZj$caVNJMGoy%0C8M6ZxJdVf zgUIXfa?bUCRgg;-#kWhROM`PoQxXBo5(y~D-bc&rDQ45e{28ce;P6>xdMSmSEdySA9oxj8n5PKbAR}kN-;x5DXH^=rv+clJ zZ0O_!Vm&m*UVF@ryP2kxRq@6?bBMxv0&Z4z8$T>hA2Oh>ZhyF920UIcnuV+rf_$~~ zN(mPK9)H+zpu!LXEBMOeZGXd5+g)ixcz)JLa{06A<3~yE7BJ;rL!xnU%@=yeh6z6Xb2e$_f;I$fdXzM;C;41nwfEK$F`>`;Cfov4?-dt9Ta`(_$-nx6_#SI?0Wf znWCV2SbnE+4F0Ej1K~`7V@>9F?F;1}?kO7>LJ|w(9t_BY$+l)+9m;4zu{OPou*+XF z2^c`@t&(ti5)p0T?a;?Ep@A1icbGkD(41inago)ZwptR{zmD)7O41rKnC@X1hSRiC zP3dcxY*=uZB#yA}{IfOv#yymriCGmxj#$rjuy9f`x{mDUqXtX1TrpptLf!q{1a7t5 z97Alm_mEK%#w{y$3N?^WrWU)596YUmEmJt)bOE#5wl1aeDWRn-NgMxir4Y!Zs=jd_ zw`yzzjmvN3^O`Q3fG+i(w^`n3@EB~7pgB295UAw(^O=EMlX168Vz`kx3(dkrX^n2D zBv>&y$ToEICN70G=0t9h)MW}BhP}66nzhCjz9x2a%dOYdD7QL!jo>179WHVLe?@CE zxx)~MU&LP-I|PXcC>k@jYkKf~@pVjX*s~Y$2tUu)+JI>fSeJOV*O{+jOY>UcWo1nA zgZPbt#;uOT1in#Oh}iW)?YNV+@bEU?icKxia(nR&)?Y!0sE#;+aE>fe;AG!noid|& zl_*N^+r^wGC+n=m?XqjT27`mML?;Io6is}3FCwMz&hk*|r0-1QZ>IZCJE5 zxti&3-&cF0>_IhL1l8aYgh?0U44r`H!Aq5GN_(~rO{Ghvi?!o*9cFP3o*gWQOlkLF z|6_EKwRI?~Uk{Sk-NqF;)XYgHxMnXiKkXAXPse~r3S3yFuWPOC)pe-q zW7Q$+a@8u=4W#Ez2&a^&2Tz^aCAl74?CzEco#9t1RGGM8Z&?B*FOvYrAVlg?{UWDL zKe<|T6U}{QbdvoqowZa`54J=agw*wsrvGLG%mh8!%iKR0QZiL!brxJ~o9NVrYeK2f zx&%4)QbjLH!-RKCd04iby()MpApKAF*&t0=ib(kouQA1g?F3%+?l8ZIz1!5#`=RBE z!ywx<+P1^bTZdawT3gz@#<=H2HcG}|$6$$-4v>WCp!e8YE80HCyc043n*}qJexSye`z#)>p-?w7~T>{hOMzj~ry7!8&o=>bhCAc;2!qq*S8d8)=n6f@4 zMeOEfzl{;qsqtYh!Zd1D__)pEe?_loP>nL#Pui<(k`>$+KDj3#>)Xu1IA`#Ov6ux5 ztc&j($QhGFoDi`i1O1!`hqJ~j~TpTAV zI1a*sAm_v?FRwu0Mr;Ex91Fcc0GhoNl?dWgT9hh?z@!7)+{cZ^ervRrM$<|}mnia( z7duOMFnj7Toz2^XCl&}kzuM!ROBO-DXTLYyD)$UwS%*XA^*#FK?AL?F@+NcP+=NYTEm^z^!lS0bax z$Em(aNzq|#*4b)22^sHPBob1cZi44BHBLDEqVx=5v)p*%6j(rIs??KdJ#TKNdlh}c{il* zVgPje%E;6D=}oIa$=x%G29H{>LbanZSwJ-evmSdV4f(o;&>%ZmKg@rbj4x3YG*2l( ziPR(>W_=rF{ebvg?mKwSf@&bR*FW^qr5Nf&!$YMz*#RbFE@=|F zf~KbZ7!dG~dFVH`21)#|jm?EYRXsji;{E4%1{laykp|;vJL9h4`~BB<`1j$j$s#?r zVYDY$JD7WxBFST#$C?`)DY}XY9>p|^(qOhm`@L-9h(~?Ohv0t=ObUkUYWduSnhWRS zEa4u4>}s8A8>B;m*1-!Z0$sEgJ%O+nxp*=8XOta zJkRmPFpAK6^la|>K8)yEcBf#4dT&Pe&oXDK%$LTEMcrZABRwGtvUt$m3pVI_SZA0Q zWin}3NMo|}%x3dh_l+Do*6*8V?y4r+`r8+t;LfYgWjSk$7?&*NjPr@7dGzXO&dZL& z+ETeN8Cf%i`VJbFFpi*Mo7H7I%B!-2hK9l{?e8a3@ANEV9y7c~j2&vxqmK0x5Unp? zya}8!m$0$HB#cp%i=oCVnNO{gqnQ0&i@9kg;?h*zmMI}{iyJx@m$ud}eDem^F%CP!X@ z+r!tySe+x@~t z1ffU0CipmV&L)HmsfK`cYp{&X!iQLq*>b~itc&v7uc@V)PBFrA(a088{PjI&Qv|bw zWN}6HCiteH$r*4N#%cW84%!6r(RmJNPwk|~UDAnhp)^qS5M(U-YoP~)VJ*wZ ziS!#|U}g4?HI#G)75RWMxoDoJtg2ax!u$_{I3rU-4_jX?wQl>(c}cH=(&(>RHk698 z@sh5BS8!k>_yyHLV}Jcac;(vzo|?NJMWz8p#=-&GWmYU3vxmL6!ft=3k(-&z#RMsVhS>=$%bgZ1UPPzjOE3VCR@u8@tMHeFrM{R*zzAoTUGF@`Pitc~xz zefcn%3!mGtPn!Kp>UBA~1F|XOjeL(t5^MgvromQqml9g|l>X*k`P58_Ss5+==?doL z$mNwcbC&L0`f^P*JDv0{T3D0d21E@NZ9lKwwf8JGhepUylJor0h;_$xd-@v5rQ9ao#q|r^t;2w1b@2Xq9G3Ll^ZC7FBq6?ap^ouY z*}JJzU2QyKvRfiasJm!S-mHwg_(vHHPn==7vXLTej{ zMcC@ZJ16$kv>R`{8-pmY%@EVH+ux;I=7h<-cGe@JgS*bOgnm- z#f|N4)(Td(0d`+QR5mnFJm5oOAF@VZn0=;6v+@gZbymgkLiHU_QRU(i$IA}?{@ zhHup(=!_H8nKOAE;kwet9HI8vz*HTTqr7@-Zj7>8acl=+OzI~}qS$^l) zQ?ZCs=9r~L>v@1h(V*TcXJg|^xAyAnID;=jD&fBFeLKOOF*0!B^NaV?K5}}<8+Mtd zs9xPGd2X7EA8of=2TqeXByEfv=f#UHc7I+z`0c2uQff6r-ycaI7%}d${;Y(15oe^{ zkgXh80A%0N0BgQ#-bw)r@^rBIPqa~VR=@S5&^5<{@9}2uEK(vCb;^IFi9TgufI-S(HXN7XQG$d1A2{o{z3+Z;=v26122@nVondZ*EYs zpueD!Ssj*v=q@bo3~n4bK4aXEiLM%jj}l0k8+El|^K?bIFu!>3PrPy=}u- zR)0pXegu#h7au3CI9mLJsaw3O%FFGTv4e=Jt&-=jMTm5uz*{;jQpwvYXkv!YXX~e0 z>l8tE3*^9xnmX7>t&6IN5j{ZOylQ=qs*DNTmNr<=1+Z}e^rc1EJoY{H>AeS{K znb8)fdTMREu6Z<7X9Mku>^OzPy);eqX93dG z-sgIR+fP!m4_@n84tN1y0Xa1n5hd{@VTR#7D>zlAD|HgB>CZ8Ks&>zZsbf<$Wg%z= z7Ypewl^c^=TDsTcE|IorIPq-&?z)``v7%ha5oHa7imRN@o5P2s7*9)xijr*NpnNQZX)h^28T< z{N&E*&lzt;!)o4?PU)&q-~c>+SZ>d=(ho;s&1@5DMB@CD3;^IIQ={@)4Q96cdmm;I zSbTyoX3Fz94c@Yf$}Uj99dF_tX)GL|Tq|$2FcJOgCNJ&izmm@6svZYZG87`sS`>Us z_kf*k1_5hmtVg#bIO}T(ewW$nx6k6Kl-@ipd5ecl$onUrbbyUzTb4K1A7^s2dNgZl zbCs(bGo4p5Kv;CPrT*M5cyT`BD9FM5!yr?Ez*u@#{d@j}ywj$d?3<`EP_j)p#A+~b zrhV;k^U;v1aZQG;qDdWqt{U)2`HJU}hKX-e-<5p-H)GNyLY!?fyGq`gs>-Ozxk}-Z zIZoI#mqHcM24TAy{Q$xQT5WiVbviEUhH?uEC9OZse3>R5=ENQ*Zdo^{K?Vyz z#@=sC2Z@EgpE?RIMiR^TFk;N%G>Ij$+p~m?jvRx{zSO;CI{(5Yol@}Sbs|Gm0+)B# zm{f0%`K{cZc2!t2!!yV50MR9FBQFIugA)i*J&jvBU{H`|ikyUp$P^WMnjV(5{M!M_ zw$T(@RKu{xmb!QTF3UknsNaF+wxEcKFZW6}V8Rx^`1zSobL;Ra)UumU9v!% z*3)h~6VdGBMZ}9;N}hcr`(5A6czCXV$C1uJ@H?%gsHM(ipC;pZJpVM;x&Yry3%Sp` z@NeBgU3*#(fCIOe#GgPbwIhWCO6SOWpc7<=pE$)=_6kDrkh_n=`0xwVp&{p}cg3D% zdEz>M%k8FZTVWJeS{%E@WnF-%#ZvC-mFPhyj6;8-z2X(xJz#T(AYBLUxXR*zykkr# z=cI{x=Kg{c#iqfACany|Zt2_U(Ur4*Y_Qh_tAxNa|$97f+6CNU4_wo8oJJF(;5+ z<8}BOB!o8N%6TLl5u?tMtFzPL#&)wvXO_TIw{&GZTWkAH9^7HU(d~rrTI%zXZrJU0 z%MI;7FE()n_;1JXpfqDLs@Q$Pq>p+upQ6kfjI9I9`BgopGnpCbIrHgx&CV9%A=$R; zX#|+RtY;7~RUbMITzxsYjV|O3)nsmSMp&HmA><_v zBOY<)Ym~l#ybR5ss>PWtaWuF=Nte<8S##{Y?5-2C{3?fJH##v(Zh9dnI`eTSWR@M} zx{r5%m3B!QebRV=5I~xkv7$^sWik}RG{d!0Qv<_rW#mlkPG-}2Tb@gKGTkFl&wG1m zVV~8;+f>%%A<-9RXyVNN=;ovpee9Z9@jeJ{Q@2r*ba~K8-S`V>Bx|28%$GlI>sd#( zzeAP!Bq*-Yky`TCucs{@nBjb_R))Ct)B3)` z53y9if5TE~1Z^x0{{fr+%S~nd((nGiz^PxT=Rd&DFC_K;Gb{6#4#~j8K~KxT#LD(XrP4F7eN|v*VEQkDD&t?c@82Q6{|8j? z@1FimQ2mc~`Y(d&|Iix$1PTBDfT@1*reA#NKcP%50wz`hCXRoZm;}rW1RDR1O{zt} z%tXNa?-jq8R*nCj9Q}7T^xro1Pt)@szUx0}(Jw-j{fi9!C+qsJRsQF^f1U)vzt;G7 zr}e+XM(O{B#{Pp4W%{?3|AP?yrx^RMo&R?``d8_{+TdS#|NQH#x&IRu{X$0ncT$w) zUmv&s$%$lQWc)9rsQiDBqV2C#o>K6LU>OBsU!thu&UCQE3sAqde1SgoF3!_y+6Hl= zIpp;CMZ{7>ei`q4(IfYZZN7Q;?H{()9%k)KVDBJF8`TWk4Jsd@r>~J9YAF2^+-?}= zbCJ|j9MQZ&PB+#ELiF{#yxi>lJ#cpC%PPx`VYOx!J*+pS-^tAo$Zb+YBZH zZ%o>5zs-w(>uqx=qPzHpO>RkTX_M*DGf=m+xygyYJ#PMcmB+zEyLsnuM2+#c3C#na z{YAww6MWX|WZ?1#K_fmpI`kP;;uw82v*6-7baDkdlB1`;0pa`I1T@-s%10CA7A-hJ z=JJ6bbaB;D%q1XM??uWIzt!|5u&(`-syb`S-$;QIjaoa7{I`pmhVoX8sq)ZLKA#;3 zOj_t}SEv!rFuwq3oS1If^$p|`m^lCpp=KSbkRDUCs&LBhw;S9YRqWWyTOjmxVeWMe z{W=ui``sLga>ri%sa?mBgn++7Bb{*IxKbV5)ECx7(R~?~d(LQ1)nzN-`0{b~bZ7Vhz;mgo?Us zW+N#cAjS%9)W7`u6`Zd#r}?V(Sd7<~?bzMPQ4lu6qRCKaf6Z1hfRV&har9abiYKtL zMll2m_GIKG&b5>rIjYK`L9qAu)Bk4kr5+Yl4PonfRw1Ye@P)9rCY}Cy7RLGZYh??PKoceJ5?#9Zsl>!;2(5j;gdOSD_d&2F{O(BbBtcz|Q+{ zNoE;mov@daA&ZOJ($%;}s zCf`EAjP-L;F>P*%BlW<@Y^>snd(;wA?RC%jq>Kj(S?icQ{_t~Y#yKDm1FINxXTG`w+U8}B9pPXMM-@s>irG1F1 z0iUI>Z4nLw3X0z=pN$rw>2ec3!^5rp2SQvFe6n<49`#DP>A{31ySm+;b?$==YHX>3 zjxns!in?juhN>BqT)rNavmUx>8?dq^DzZVg$VqHCw+TL;>016w__@`E#U=bne&zx@ z7|)OuV8=6ix-f^|XS1SdCha$Ijg^!HT#Ynl(@zi7=e`JzK7BogKo?@Pq__I}jsgRl zA?36D`qS(Ek&atiIo}$n(mPI>%~9-pTY%+D9GwZf0s1mW2ZRGbpWRwGR@7q0ZOKy* z#bj?^+wq#lj;q%y(CS7^f1#=&foA1@4-@%`wI)=P@qm$yjLA`(vQIQuqx(VudR~Ko z#*(#3ie|o)9w=i|syDXsSz4H6S(<4oUO~uA5*98<^dooK0yg#+T`FfM=-d*^Pj#Uh zB6s(Qtj(Na=@htNL_+3Xt|mehqVrtDnn5FnrASko?h9v(c|a_nZhq&-axNCVS-0Xi z^6|0&w@_$SP8OoS^ERfDV4nVmSYJpA-E22`h}{ZN(NqLWv<>D=3>sV$8v4NS6=v+M zJ_06M9mJ-7sV#V1kmPODz_$qQJ|Wyy$0;@WG$-ttiP|9dv(4^x(F4Z!47@ zf+x{{MQQWU00Sqp*u`VmW3G&9>)rt#UYb3wj-qDM;Dsc^Gq^gEMEW!t>2XfE;^Mml z>IG)NcN55baz-f7A82V`6ECa(U@tZYGgj(r#avj1sZ#b+tx0YEajQRi_29H9P>}%` z3b3>wuD|f$hYZ1azPXD#E=6Kkd*P`jj*myq3%Y+lR@Kw1$oU-_!i=+oVun+8NEIHQ zbU*7G3uggAWQfm9WK-M(M=AUe+-K>#^k{C2XRM#Os}c8%kdeFyt8S)e5z$ze=Jn3< zXQZO2uIu2tyT^AD4l~v^ef!B!AGGo{2K|d147*SCg}S(VX=Ebl-QvaokqQgh>qfI# zvlc_I`_NWJ$^(qe-ohEhup&Em8mN5^GORkOaE3vXT|PPVlT-${KzTZX+`*IvFGHlp zGQd?=|8e4;LX11IC}t8~=1)mEOl(D0cke5+=eZK5Kf5v7yuqx}X|2|o?&?}ZlsQhP zSVXylPUojZkEEPa;QTT-$R^ZkhV18r=H$32s8va<6#_Y) zG_-5y9GcuAO^@w;Fak5Vo7Ik&B?FXTj@k-O^`HxGIbx#lhI2mt5>kLlrB z`m2OwGDCw0;W&GW5|!BctTrL;2pmS*)J(<@iZZ)a(EtDJcU$9lyjpw5k%?1)SuL!F)NlUL2B2`oa=Qh>36KqmFNmGl}nkd*c z1@B1Y6~o^jv}d!Qx=MVb|M2`^`S1dm>vb?|h2d}EbWwbmzD4%OhqC>09$)r>b9cJk zwoeEH*Q09>?C1i=@7+py)BW@xQM9Lxs!gdNVT%_Xf!>3?0i8s;B%TJxXS4G#bbh z5ZbE@&;zIeN>r&PQMmf23aAPeZt!2AUOte5pVnQeH~nj=@`<(lGMd3Jgj#%XmbOv% zj__l5{I78T_+evBQm1!D)NBs>qS&yp#a zJEm?;`;)sgGjzQvty6S44RQw|e*yTRN%+Nv4oL4$9?|h%VX=b=pHDsA5y~yX5 z8z#3$i2-iT$c8-pSW>1f_2uh3y!LQK{=}Y_?Knbi$a8)T;r`BtNO(o<2cW_ zl-I5UDs|cb;ME9xoe9R;1HN{0%?SA>pU9rj^*ySWZ`(nSO=6yYz94w__Q~TZ8d)h+ ze_gM6Oqc4St;H7XB1QI>MAjhpSf)Rhmavw5R9h?Ndta(8rg;Z8a!tQhC>1g~8CrLF z$SX3%558F1b;OPkIq0sTSFpRSrCna`-7b^;A(LL-CqGwlR*Io_+n=hWmI#fI(a>GU z+Q{GpO)7nvR4@k z_`OXKsbGjw_kj8>hH%Y;zRg46BSQ&a*MypLMtfjQrF>6v0URfS2@MMt^!nW%fuLi8 zCtgE}^=Sm`8th4DhOHe}^kZ4Oy#c$T;`Or3JQ>ORPpUqwmoDkXyk-}Z;?Dy|b0E_3 z#JkT@N*+;!66C^&Qx-AIjup;hg*Nk$XveY3?7$!?L!}@uD3X1iqCZ$LlfTbXkR2x# zpy<6j?vjLB8rK$#hDCrD&rGa-0&mP#i8hUt2;P{TK(;gqd{58DS<*G zJ_LEcjWbLg@@enKwu>SNX{W|Cg!E2?4y{Xpd7sCO3k1&IyEJpehB;EILjxNy>@LMp z?9eB&n!ocsnTL6rH#|MH z#2e&j;=S_FR*dNrq(s{&6C&v&`oQrNYH;tjy&B9|pgjc3wozZonXb6gO_w*JfhL>< zpUT&?E=AuXEYB2<8n*+X{h8`gERD-CsSoCkSa*J4ki?6BeF5kTh>ug7)PGAn67hD` zdhkB691(0xl`29JQgB?ms#RBoP9HF;)95kgaVq;Qsmm~e7EYW>j6R8oGM!@*tXAn^?cAAO zck^y!nAV6i;mkUXmH<1+{_KG_-4<_X&z;lC~C3v1I1BhULH5G6!`RpGNL#qXu?;BiX8mZ+M5fN$4ZWz82Wwb5BJa%_; zFC&V^x2gNOSMB~a?x_pEBIP!K2k%LV*3evByCAz9U`Uunxou)lN7Yc{2e4&Nne0@8 zC^iYM^+SNm;#9gS-n9~!WlMV-Y`?p6tbV0F?hM%i?-~t!Bc~fZJ~UUZjls=1wzTAl zrw%tXG9oNp{y~+JoroP&aaF1ict^0=s2jABVNE*<0oD_1Jtj6LE&J+p^zf{!Yv%oV z9h**FZvZ#&V^^`Y&cVSUR?#vRn|6|B*l&H0n5Z<0vDbC2PcNLMPd>~7gmxShiV66t zT+_^qo?LyN4iA_zDfHJu&} zSkgQ!jv^e$*!|6oq9`bd>#Kx><{#jttGGBM2wmE)#%**Rw$G`m44f2pcT+wUi}=9f z6e>M~(^Nw>X)7x$B~S}F4LcDlFVuPE0Q5Bdcrz4S~NlUAf!;@h{LN5ODmE|)D$fJ;0B2hT}UiAnZM!UUb0KNUw z*Qjnc%~6L_&8ShzZX6-yC*0_i>=P(!tKvgpR*)bCGdEv+d9sj=<0b;hPcN zd*YuUBSGl|yWr-!lb^tEW}@l8nL#iS;OZd&LkPwA(!&S@q#{VXg@myuJONE5N(HPS z2&90hK{z<2fUiJ&No{&Sd!$hUgnJ~NqE5ZK3@8NDzJdXTzXGaZ!Vux6^*9npJN==^ zg)jnvAgB<%!#&z@^iUNEDuT#+u}XfjLjc(5G0Kq6JO<4JgmSX1ZaBQ zG2+<6BzaK)wz#bPxV?xugq8vB0VYSb#4xg+p!qq3*ZA~UA_SIxA^|2RwlEpKw$u@V z>~JDPmO-QeyNKS9$lG7nwiE~h1R1{?2(nXKC}tvV=s_Y&U&!TJRMHOq@BNy=}`f0wyeFFoEeZ-5GFk>5GH-~{fG3T!4A1R*O;$( z&;ZXA-z(3Q&?{hEZHPJq?eBGnw7)q*`=)^$5NQM4Akcf>`irYECPkaS)ABbf29IqE z28;pn`pK$+IT5sBpb@q6`Xu!bd$+oG`U#t1k_a?Q`;@AwuNfSB?E{kgpaN972Oz5E z0p`u$0ZO)JJ2ti~nnAX(y|A*zBGLj7$)Gy}hW zBdO8H z)@E=(Uo|9v2!ijoXf8Csz?QD}+?KBwgZsB_FkBm;r~h>tBps0#P6O$(2bpsn5}wc# zsgdw3Fc|T|PZZ%o#PwU2pD5ym?+^knY)yaL6&LPBATGqC09&s~4mhChioN#`p%Y}P zPbPq_J03zOKs$i$`0BBm>YB_I)0yZCZxei?bTD+IE5Xgz!M@gnLD}2sT0J z1ezk<^kV~X1laW4hOz;^{5C+gV+av}C%U$v>o;wYC%ksQE3W{XZtyG0UcNqj1aF8c zl7~JW$0x-0s4Idq(I*vG5Wv>{Iu-_-U-KR&>L{r45L zE8R8L8}6p)6N%^VD~LBtfKPWYM3-L|0XGyr;TskJe;b=UX^(vPoH-3`XwHb+}W1VBp_u($57az%DpEth6W1j`57agZe?_W#D;QvVQziQ+Xv4l%-98EY^gTp5%-4@35i1w~29r*IHbC%00KQKY0||rOn#x7T#Q?#>6@jaE zo~s4immm?o_w;W`!G}P`nE#bhS%7HS#id+?<e=R}1{!xE5Zr>@!ch%pv z$U)!1;1nM9HoW*-UYkAIDg`V$MmIpp>3?0oRU`NXPx4+g;+0RPuX#{M*;j6kZU9eU zkoPw;RKtS|Slj%p$M)5~ExOnN;)G6jS9EAWU8@q!TOuMnwHu}l_&H^Pq568y1IKpy zF=`zyJ=9j;Mx7>gr`oYUF&v1>->kMS?0N;-l89lV%MG&oZSc^J>H3$kqd5tJYlJF2j`7kcgCA|`7P}iX4VX&&-!NyyGeJh?fcMKJ5YC}DEF>&7=of~VW)E$ zWG&1gN5+yj%*jy^x)G4Jm>Yj|D|kcPNQVUo?oeB^8A3aSKl_u?y$H*Ps)}}&Vcm-Z~&y5tPACG96RsHV19hm61L+?UG zxVQxS;GY$C@L&+0yEvz>Th`vST=dQ={z%D`aGjNhY-?-hP3M)&7AU6`+xoKacTJ9X z>$m+J=?1kU9%o2O&i(Ho)k9eoV|cT|vWq=ZLgvVhW$GLK>WkOL#X_7UsaH2?YL9BH z#SYRW{XLEh?(~>R{qJTjaQKp}&qqd})U$d&AiQE|kKw+b-&1xZ*T-B|%c0}wGAti^ zZ75a5!)|y8_GmeRY~;9=*IQPqu8k)eC8H)=9SE-E?)*|Rbtu`Cs1gOO4c+-DJVjI% z2+6zCou;?US#rEps(InfKu$*wlnKysFT>Rf&H@ftL~anhSH$gr8q~{K9+H45r+3tE z&UkNN?)ctUh~e!IVC*o23@XG(`kFq7KLW1*=qupngD`L+{0)u~a9($X7#Jd4`t?MA z!zspj$V}AV@W+7OeGM^RYsge2!npr$z|F^GNJIP^oc>pikPr+k19Shh<3ADvp}D_H zf0I#!e3-vMYKUAYg0cT^!2Mr25QHKS41ytuvwwqN1cH8mbSNe)bRyaKzo5C_4lOxF3I)OAK&+M)-%=#n5i`oLBh($vqH_ zdjDLh%0ClLcn_(?mwPxRe?>In%R7^m_6nVZ3Dd7b>Z63o#K5@V?cWG)enoJ}j%t%d zulm})H4KA(2%=C#O4L`t(C;8tlTrrf~i|XzPsd#*CKRjb_CL5j1 z|BG~^hf=ZwTdA8JW{#e^yBf0ZYjzC=G4~TE7<@gkX$hM6Cb8WD=~-v9Dq_oIIEncm zQOIneYXcp5)mq%-v%kEsSdQIMl%Ush`jjBLdVdE)^m6hjiRQCgqug7PY|3FRSc(ej zpvEjg4{rk3cKlxd#eah84hC?NM)#u(3y4RXNMT}j{U)R&bMb3lYU%QA7Wr%v6XT4; zBTlYUIpjL|Yf6me2mlm}($^deC zMO*!4_39hAFa}C0xthM`*R?t5Krf~b8$#T`ILT9Hh1?on2V88USh99VQgrd8U+pkTaf4f4%1<}%pDrw+oMdvF{(?Q%5_D90N=d{(o zTWP8A99Ym(MQdplO8c>v(@s3sKKH zKx^Uy*%q!|V)nC-*4$XmVvM%aUtL5>ci&S~h>De~fKAAZ)qrW(2$3~DSRjN&$cr(8 zrH@6TaZJF`65SZFQQ_;3YtxvVv^!T;wKEr7fC%#$MBp9k$~W*kR`6Ot0xLN~$XYcK znWzmaWGvcZSp82yPQ7P$(H;U;3b+$#h*c+dQGq;oG%B7IVy=aPo1gI#Uer+;mdH|# zb_e%Ob_aUty`KOU3su5n%xcGdhqLJLH6kKoJ=5q)9o8l6Q*Jtx)f#)Vld33()v0ub z9yuBgx55~IG z&)S0GdPdCrw$UAHpJp7tC_d{3H z$^!Qnm{kFd#^?y@fEYPjF(YR+WpGcJebX3)M3k=*o?ODZwLD8TV;b@Zik1vK*$+pR z1o#RhR+~0UyVJ|1flq^tXN@N2%;#cs@5jkEkI$I>=tIR|37g|F4u{z%#J;Kdo8l(A zY>u-EUv@xi#1G_5^g+1h z*aq+QuoBVru;dQQy^Zc^qKgPRZ}g|u_SG zKt?GMK1m=w6MX5q z`$KRH?m8Bh2uY1jXM()s+jgXw!0&mpxvZ;;yGsd=K%bGet+uVEEjoBv>?~ex`T-X* zpKurKE)FfUcfw)h@;9Pqz~+~91G_arKOR z1~t%1s)nDSrfN;O&-AGADAu@f@v62#B*qG3%{=b4m4)IYO+fs%aE2LN&nGe*7r;jf zD5x~^9GiKdWol2*xrO1@q{T9n% zwGvi5`*<;ca=*_*{TXX%jMm-k<;Afz)kAD~XMN-x&6#uS(fcTVL&iSyl@lH|U!Wg3 zx(^pFtwN+B+0bmzjx;aTnqDqGG^aKvjpT^j=@+;`m4QPVf6TtDs@$JnA2A&Js^d13 zECUg*wy+V_r@l%(*na7LYyKYof>$|?x|(PsH|VYKu1WDA+f+w7;Y1??-OcAAl|}V5 z4FoXNXT3xL40WUf@`Fl-l(q1yI4jmg;EosKN*BnMI1*H&D|CA~JGLBzaj7gps?yjPCftcR6}*t^-C&+>0%_DZf7!sT2CpM&?1Y?l=? zG)!yZe^wnIPM{Zg>)5TPl&1Qlz5QMxQ^(i{bd>0OMAai149nyqcnxyx@~%C1w<2~B zkrCb4vL_BxMbai&tr&RB+-C|9n71SI#E}&J#ewr@3{Oa+%}OdWaVQbY_oOpIZz#pm z%(Bh+jI(~Yosl7p>~gK(D`Q3ezS!RFg{72R5nQf3I=M(>AF(OTFDEbLy|uO{#Vox% z5rVE9S{>ZpG{$b5e9^Mf(V#IPG`E<}XAu-9^hv#U3m=%JYaJLQ9Ap?=ionML6@#Lw zZKAh?R*8es2&B>{Vii<*uqy0&wm+PFnt5`L^N48sd}`tA-^$0_du;~dxMd96*m}ZQ zPeV#DHPd8495B~bYIH~l;~*wZfK*(j?RuzgLV)~vQqeG!11B3-5Y<1S>yc{4v9l{h z&HG^`f5=b_7SPdaeWpTk-^MS2Go4VDR+19Tub)@Erz9c_3v>WyIswqE5Q>2Z_4JJ? zPQohBl_+7F41RV*W79~Xnv&z&rOp@DL<_Vn%e#sb6oVipd-dQ5JQVUfLisMI%;KY4 zG8#nx1R}?hZl5vCB&)#`j)dy!$Y_*5v@1%(jO)dp_t`8&1`wm0m`%tL98Hi3q---o zyIK~6%#C`$oXni5+VL7%Me|;2oL*yd?ymsjRJ{JzPp~ zRU=ljuvp^$^t4~VQ^^a1gqLsBlx6_Ia=i$r;_LB_np+vP}q%qi%*!dh8s5OPG>% zf8Ux7iAZ5JjL`h7aA`+eJui_txjxx3!7<5_{FpLUh{TAbzCRVyFD4%bRhmv~OMzQg z|5I)u_@vbeP}5sb#&3MTP@6*qsioJ3l)2%Hg|4vdjplS=OOLw|7P$e7PbDJ;_~e<~W1B7Sd5}yZrNfMnsDfsIr(04*D=p`Y70?zD9*=iM`6s#&4}ZIiabg33kgtqA|{7 zoN1ryc0)3-aCE_snu9oc2yneO2TZFGa}%%@7&$t&4h@zY6(RI$=$H83d@8rj9kI`9 zqZqA}kgUz9bn6=Kwo;LLF6S`E42@|*h&Hhwxr3QjY_uA#GP5i5Z}tNvglPDnb6qi=^*Ug$d`j zjz<`5W}co{YSS6@J$OLpmGR^7N!=bY6lrcTb^jXv4W72`b79McW=&*nlJ|w9#aD_1 zJywG?6Wc-^TGAXbM{Q{`{W}V$+TLp24|5sx|ya}u35H}$+NcbnTPFYFE++WMjDkIhX-#O4FG6j zepuSXT9ZS-Ef!!{-xCM>3j7eV{_Jq^kz7P;!s9X7r@FydI_QU0k3iX zNrbk0>k&0)5!q`Z53oq(q?ybibF!i?^^0uAMfP~;t8$zuwwU%C{}!H}%a*qKrvgz& zyAA5(v2(_pgQd)#$OK(@zqN{zZ$3`+iL@N58Y+sK+`jfrfiiihj5rd9^I56uS!tQy zP{t@lhGqAn>nPx@M>mEf^|FwuEijf*Bu#5pI6N!Gu1j}omaK}9_>7c|n^0m2ic3-gDyvQgXDnqAb6ZcKVqq?Y{NEO60i{m9P3j%|UI$4(*SOqyIQ4Qn&iTR@X z9QRJ@U&d+5X`|$49)NaDSg4pOba+#j@O)z5>gU71QpB5krW{SdS9&4+24)ohl6O=4 zLd(MKDLq~^%WCz@JLn~#1g4`Q{0ok03E zW|g{7II-QlltTjiTF$6i-6Saml7=$uB+q*@UyP!TH6%hFwTE1MKW|0#PurQIb&|9k z2*?Zd1i4zR@nj?xMt5EtGnFKUVN{OLPZHE~Ta>j{b<&!VKue-R(Fz-UJy5fb&>nS$ zD5M=DVG3ESyT9`s;0zECShEw!mLjqx{umKpVt7PSfPd|n+&Fs8H$UfSqoJhdxR=U6 zK^-NLRwqGzK2~amlEoGTBRVf!NXz_Yx{SbV`F&r&SVE7Dv`C|3i-ucX)wJ>*-lB5L zQR-)CGBUUehTyoA#QgiWq=Ei}@M)-%Z zZfy~b4mQBco%(5!(&+>0K$9U<$%cvojAROwc2GCaZUfhrgWTy1I<%dC_%>9lo|%Q} zayPo2FgRiB$Ev6JkBt{YE#=u!X3kBgwj10Hpq2jSN-e~6+W^6l@4rPQ2*Ud`i$yob!kP^v$Ah5Hk zOq$_r4QmC0YbCGK;P3Pwwk+*G8qxMAj>=hAbIW|tG>KpAG>$P?S6Pa+vY;l)l_?!r zPY6sXs^b+Bf)SgLBw5ZU*or5}2<9|dk3;CeeO)w0BsroLe>xQQ)C*!svK-@Z3d?6O zOJfO%in)lvOIFQ39+})#-@%&?7rM=wng!M?y9b1QU#UIXBRce!GX>Q`N`WJ6ToVgv zL=b)3=)@)eHn6V2$71gh#YXQ@fl9N|XF8%z0DCbq60M z2Kf>6%uRHjmJUnx52G|-yVcih@{r2DG5kyiX?QaNl>wE(?5NAIDq;}cjhfwE_-xM` z0puO+q5aqRKE|H9i>uMi&=~kh7AtwxV=ZH2nS?PM zyR~%;1JASz}nf7Ks z5b*~}3%S!YhQa%}_4XTYS)(#PZ9#I$BNo(HW)(Hv9^i=Thzh1Hh08#ZxHubW!ei`6RC za7@UA&v8z3Pum9>l|FyX@>ix8Slin~U9GHk+QvyhXNvO%#J>6d=PNxHxdRmyk^#-r7yKkc7g6@CoLKf z@WTiZ3$jgSU;UueIg}Qff=*r~icDHW3pxkPlqsJ^(2}AGu_GnWDk68ElW#`uj=fhC zGV-ToW4xyDp>5CB=lt^-(|Pj5W$4!JWS;opS~X5Di!W0YxnyF z_@Pgc6Fh6!$Blu=33E)=7t8!^ncbOC*=HNuOO)96)flbD&F;x|^l(?ld(EShmiEB9 z05vzse$*low@b{ePz;TQk%N)c%Gj2{l?M)ho0~&e68Imubu8A^d(jKb9`f)8HC`V_ z&x5C7rqrpQPl2h>M9C)Fc+VCGIz;-p>bj$&<6-kDd9kDoBl9sF+>BeyRQ5H;apM+J zr;Kdn8d4fexTdse{Zb4&3SOixMG2U4(%jcl*XEtS9DS3iudHw6FReMDXMaIszO(c& z$0?uf=@RRinrcYXQEEDw`ZlN@t*6->!jT0H-DN?=oe+Wk_2l3j zZE35cKP~ceEE)!uUXU8&NAud(SM9SN2nRZsH8txl)u!3QiQcr@jQRAW~C)KZcA z+U*jKb1(VNKAj~3rD!2ozELX+U@~y-f-x9~C0wU^~ zB`j<0Wa66 zAzebeQeAfE1H1Y8vu7m!#hP!bLk@LaZUgnUB1Xp2%x#VjfwEOP&xf~=tMCEue(lqK z9;!j;&Oq5unXL1_T4YJMhoCe1p}EP3=LjV-5|BEGi6x}G5VU*aHFqFe5uo7xDB~$g ziVsYW2qA#6I8hAmDNcGig-_gor*05(_IKRkGM4@7JWw9C!+BnB)!=gj<09Y$v}Ofs z@VF8@rA8hyiU*TwRrVCTK;|hLj_|ps=GjmlG-g;&F1Vy7Nh=M3Q`a9MGlwEC*MzX6 z_*PxGqPQuqF?D+310fRP16MUi=!&6%ntU8rhwtQ8@KyP0DL}j;JL~L?Uk~;)GjBDv zq(3G;w9M$9eX@;FgyY9(Ue;UmJIfcEGPI@H!ev9~!Uj8L9xIq*lz6+94M%68B=gkN zjq!kW2wDkFUC}1Y=eN)kQfX!gfqFMB`hh@5Ey^V?HHq0tJO{YY(v^KHfu)~UEX<4*IalbXI6-+t zv9Wl8k5e6iXN7fEEQ;Jtmy(V`G-H!&qAHt-xIlkeDYq1`uWhi!fI<7kqqnjZE5KOs zoG?~XE!z=M0K%Di05wnY+)?d39^1JpJGA4L$z3@Er5A-sZAoNxG>&B)UbnDvv9jrQ zEQqbH5jd_Rw74=uFA%ific>-)vrK9cav64EvU}aBWpX)vHY11Lq}Ad+Sy4XY!R_ww zX8VSJoqzo}W!({u#?Ai6V6KnrvLii{F5d3KsTtYxO2x`Eyl`RjB+DYzB>S*)+@r>Z zXv5U=Yj*NSty8Yese!5eDctNfZxq~xDDx%LS5ue#rUmvXa@bmxmh$#>d%YH;NZW>e ztS#kNv`5-knI`>35@wpw9kR2@l9t|n2~SKpp2p?8qKyD>R5#-$O#Z&296hd*<=^(L z*eoc~N`%orRVg5aN<&Gc0Cq=A&vOOUbB8vivK@?AW7>8&6mJ(|gdTg#&L#BE{fN5- zox)k9_zVwS6vl!>QrsxQ-u!Qu2bjADT8$@f2P?EY)NdCJQ@cK77erIuf?d?v?8k#v zvRh6MezRLVlJ*eMoiYz-##7RQo6@o)6JV9go0N@Zl@A5=>p^+f`FW0pj>gjhn)B?# zsP~ZvSP}VJu$^nD1Et~NzT&X0>2WK)ANjblohu1KDFv$3+g-jRGO7=t>gKZJwt$*~ z{-Y$VS>uIDgap(%Zo4ebsjLLFno1U&KT^^Nl`8P+N5x@Kd^{fx?@^_)gFaDwYhIw& z_bZavw5grW_Zg`c7o2U0dpl;9q@C%d_pU>YOmyy7zGRmh0k@Sy&j)!G?1Y)?UC()iaRheqATwZ2!@_I}7>fnMS z!Aq&nBhA(9m>zTYs&zS>=lak^XBPY>0YIjnGun(L;H`|TalSd>ob2J zuR5EHfaFB*r9KZwvow?~F-LKEWEEyETZ7;L)D7$ig5S8%`%y0XBlvXX#Wv$3NBj)G zkbmudX9B~1WE_;a?&}Q$<%#uaRnT-jzea;!M!@k95(54M1W26Sc5iFTj+i+Xe<*!<%VUj=k{k(=!TiNt`Lgg4ahEokP=Y%a_3u5ahOLHYSYOm82*w@ydHiB>6W+dL zj$kb0)&Zr<7{`ij{VS%v#*oL#)U~8a)pSPB+FUdL1FCYD=8e&}2WkQDxFVw7C+oNDXpMkzN zuED+z=mc`)XI*o|KcPp9v(x6c2NJ4{yZLEqPe@kD^uC=%LKlcwzh66Cj=~s(sTsRO zin5Ps|E68&h?F&T)us0h{U=4Sib4(nrR8Hn#x&1X!F|+2NW+!fr{2P&)@cjh=ks?C zyO-^aX13NR65MkJ++QHZRRxjFfvuah;|`N!nQ^>rw%R4bGVD>?zwfhN6N-D~0nbaI z^UlNw@tKgYCgWPq_2p^7ZVNRP6E5f~)*mO0j^Jw_17!$cE?iH8o>+Z2y^UVe&z2@L zoQw>t8z>3Sap2e=Cq*-xcVzqd-l8_`-@>`uj+QQ4H>IjPk1sv0+^Wy44Hs=@WNm~y zE`zKqrUm@+gQ)YJ(9n%vp`O8h5cN zIT#8<83{L066L^wtc-VRjg0@YzIJvq3w|t4@;)HewmodtYF+JZ)S|JU7uMvF)r!42 zuFBUo(LGhAC_3{w%*QFw%TlAilUT$(-Zkrn4uC!t_z`(JlrbE;ztbQq+hw7N=gr3C zEw(3&YEN`Lbl!!OKT;J#H?p}(y9EL%uWX`l##Eq| zlOZ9sQgp7;DIbtMTUjpOTFtjD1ToFntsn*Tn>7)uK1Z4eGPl1>v6oRHX~0%F{&A$l zEhAktqmx^GMsdcPQ$UD|PDm*(*Erb$4&XI70xnd}*+`0E>Jd zo$Mk$Q06S%$w)#0ShA8B4WTimWFOl}}!rbqg*ycFWeA>vi29 zzM1sPs~XA5823%_cC{X8h8>X68j4nJcbcd_V8pkZy=WBKtkm^=_mEq^KLXIMsf594$M2E#-)@I4TyurHI&7yJh&XT;lmfr$*gvh4reMm2+vdhj%4* z#dS$G3$_ck3M%`zYftgbY`Xn`z8qqmL1T)LhoI1 zpSWxyF)cAOGp=kmu~yaLoW;uAs4ar38)jA#lR1o+nlw7n2x?Z`gF}3%cBsz5-adtR z1tz)-Q$+$htie~zg@$Ef;go(}e|R+F(A+;rNYX)P>YXg9ZXeWv(}8^$<{2R^5@cn;yYzIT@B;|G_u zmheHQ+z--*1&Q8@E!Nk?+QHXJHFq7H({jGcryd8%-C)L3(8Ve0NZdmQYfsbJ{gJrB zj5%8k9m))6S@DbEho(Vtt9A$TAA6^3uaTr%1~(PW#@5UEZp6Vu^h%kOcO6_k3$-l6 zFo{zYe#K>$X@)GJBK`oDij*b`)Cv4T_kZg0f#KHc~ZgYg)L4p z?{T*>*5Te~+@7hWizxw+={6C#lNdUT=HmDie0uL1RxaUCv*Dt~N~~3vkzmj1Z8*3* zE)NA#Inde2}(-)X)~{3(1FJUvCz%4bMJNG@eAgdNiD(wnB| zN*_YJa3AGwBd)4!RNlt5)-gH-K5$uaI!us~2NwMc3?_30)7yGf_P4QhBDYONPWdxT z4rnqCZLyOUv*;(h3khzEE5~8uceer9C;1cb4SV%?&lg%UzsZjt1Dw2Eyrgq)lDgik z-h!Qo9M6PNH|)p0o+KEnh<96`Bz3&7eXO1I&$u<3oHrVrDATT9o>_9 z&4y?HkhZCEty z%au0(7~f1}y~bnIHO0QAFJY%OrnLyH#^6i74JC@|QUd znR0>DiJa>|*J$U6Owo$UO4Hionp+#PJ$TVn)~w8|Fxkz@sdJ3uv5%&mKzdY-!w=S~ z7(}uS<^yqMs(`{|6M|Ppu;0{5Zcb$%54N$0;({9WF*GDIeN#53Hr!|7`2M8vx9pfx zHpOq9`Q93D7U>4)qjktfs(e`sze8E*369(?Gl#8yucc!;*pSN+ndHT-W-(kabRm5Z z-R7OB7AD)ITBaJc4ph%{5<4XQD2*~zgJE}IFgYx*sj}0~a5GAjPhb?VWC~}AsACEW zHj+qDYhhO!9HsN%(MTZ<9p+pL8sJqi)IL1XyCzM3@O{}mQ&RI@ih8Vww-7hs4 zJEet*slk&|69}X4Fx2x?h@r`+vOjY#el9I942jrj-ng~ZwKdhXJ+`=bv^iftTV{Q) zOqBK-kchRdzkkfTZ^$uEW6&oeJYYEdG5%2UeEH~%)LD@QSd z!W>;}J_iZ`mry>69HT_39H5!E>##MRNnSEvdervZ%vp8Wk>Ymeef54A=>+nMFoo9| z7-Ls?`)X<>EL5q_4?GpIwqqs_!O&FljUpc}N$ba&RvY$9Mo0Bl3J7SVP{(R{ysTQLg1(YFBw-*BCT7)=5cBv|Z?ioor09JcN<&(YtV)pnxng@4d`Ath-t< zTqwoCU0qfQQfpKsHs$GtPm0l5cd;!)%YfQ% zlsX*Co4TY+2|gbKCN}REi^0#gy!ve}-VMYG8U8wtSM9Gi6K3sH;tr-?*mUG3g|Eqi~&9?1ERB(qZZAiZ<{))_~7CzvtlN$Ud_C@ zH&ro73gWx{h%9V&BSH1$7E+9Jnj7%D>CTgEw|L4)*em?UUNjKvhLJJ(rJ>0QX2%od zDR?g%5z2o4cb@8#>^Gf;NnWGgV~JoFdA}bocvl%41+B?A7z0>9g>W$b!in>wl|%myuEiz9~6h(sXiiLV*ArdB(Q5bc06q$6kxz;!<1YWv~1 zZ{q~$k^tv?!k+t4AM&>Q`{IQs3F2D-)v)IlM~tL#_%wWWV`BDHtSl}twnMKgczI;H z?&UkSre`iU+27@eH;2nX9PIO2*FhaHWsk~IxK*_j-v}HChoFMfS%>RU^QjM>QGF!) zQDEl4F~SJt%4`01j4~3ByQ$RMUCq2vh%)>YP8KAsndeKz_$z;oP2?UDEXCL8mj!yO zLO!3P9K;?vHrAk@Sb_4hoj;v9omLW&TunuitI)En%28O565(>_yge4}XzQ|Z%%;r^ z3`GL;sxYfUigv8}G(YF5=r{`?Iukxa^C5D&22GY`pyO3NTiQM(Y{N0sClf`o(@$J} zstZ7qdN3p^8E%J52w9P1eg;pzoX80@og z7h)|%)fpU0+sA3ERGzV}I63^1nh`gW&(e=OG)+MljF4Fw?jw3)EG{HFLTND z_UaOXpw@9$dYa{uqbG zuwXA%%)DWCwb7q(RAF;FZrv^yyXKr9Ww=k8;yd4ff@6Q>AsVwu#oy=R5&_;N#^23T8_5_iF^? zXs}kTiokFcc1H3xN%kyg+eG#fcE=b5mDCdtvBc^zk54jyk7ABCli zpBv0ZY_WS$AUy!W|B`l1Sn`sa9_OeL>nO||K03w-dR=(6Jth)K#)1zy^(tX5wgi(K zE(tbOQo#|0jh5q;R-v#MK&-*wqi)XpH1}oq7Q)4HSbMyB;3PWEvAzPzHN6AMC6oO` z2|_`);J2XfJdUSWmrLvk9S4E-gZ9H5Wp@`8?CTCwhTDVmRFrnDe1kl9J#wk;cVc>b=d^$e(UvvaH53M0x4FmQL%4hTWxz8a1sNKPp~@0xQfAim>( zp!0*-R2*5UAQ4_U4?(<`3I9jBFjqHs2<$dnd!R9$K6CILQJkeXEQt}$6C#d$CE2d; z%_;E!Q6;K+?0db&{#%!w>AjQqJyEnPEiCb_N)?&1D*W$+QCN-R440byMLM>xY-fzi zh|P?B{PIIx(n0tB+?zub#|xmN$p@+zZeWrRm7_#c(Cf5~Q<{=d0q zzZ9|btn_TG%>M(`>>s+tzeKYv46HQl4D2lIe;3U%(9zNTmx|dxERKJ-I|Z|xsa**_2cx6iOKGSbk|eTjenw)HP%>tC(@ZEr0+ zW+ptAf3n#AZxhu1rKTS8Al3ROVQnLj+aJPO zEVjMRu zKf-V?he9P9t@B}~XIebUKYj^ott1g&HkfSu52J4AIkzEe@|oP}=vvkNt1ggLDSAg; zUyzgsyHkDM0~Dppy3C`_wRE9!go2KROrylK;Vvda6eG!a2v(6pVi7ZIU$A{PuJrQx zQsehM@VAnGfz>7%$_fiZ>^3}!Awi-aIXVgqa1+a^hKpyyImq4yBtsZ+!!eRdbb`l6 z54Z#TYHwd=Sb1f;pLnH%z~YV6b$graegAIfuc0{h0U*4dukf#v=HJAyf6bYYw0}+p zf2{nPwgmJXjQ*Iq{)?IOe`>1zW5W6mrrJNQgTKvbjDL*2|6r=6XJKPz`0q`%Y%J{m zBsRYAfY4MFZG0^8uz9=yX|=I&oTF+=3qmnN0Ra{Y5J6#X&I46M5<+qj(w`<0i9>@) z4Uj@%Tye~$H=YC4?4~j&X`4wtHZ-m^L#PV}P3kX)U3V$P2%SuO?DX6kYHHs~^Jx2M z$nYrr^40n*bP&LOtHuMT({HoT$`jujda90;AgyJ3BkI zI2DPO2ZE+B_LUTD3VtJ694Uh zAjn(slegvCjlRhP8tFK*^Ztew(UG(pW>*P8!DBUQNTXO=yX#xJ!>Prge_f-oF*h5k zA~O}>QNjzKQHS1aAnIj?-uSaNVx``I#;MMx?4ICW(0Rwb-4fOY#0|o4<*|KQUewvR zLw9$+Y&a2u$lkPW)piJ}pYr`9u83GS@tH^L#;D&cqJ+!Y>^Yi1jVYPOgIcP;o$8Wn zMkxao>pu_lwBJ5gx!Cy7=wNk4GUXXDmj)}E!ATRSas~RJ8ao(A{F*BRiQKDCpJoi& zw76fUukTW_?Ko9^Y#@>zC$8|udzF0)3F|If6*a*K@Zli+w5e2 zdz{lq$bCuQJeBUzDCcv7uZUVivBmD;a&0G-o>ss)7k6OG!*rkJ+V4%ytp8a?n@3t9 zuoZePUPccR{r!QBQ;CgNob45ciW#+3k4dUut*U3WAXx`GY}(r&4;_>bW%TVO{tP!W zH#V%skbTkzrc5iO!J*n2J{L;E?mbvmC*?!wkUU;uz!_}!qE~x?q2sf&0C0T4AXOhZ z5zHfFd{v`+HT6sOdi@NFg*dUGD<#?tZHFR}EB-Nq|LLLAE1&F_1BW^(AC9Vx`T`ImIlLqzw^C?6m&kGfw~J z@lN?ZO$Eh`lVoMh<9PI7A3iyL?=9eu)vy+7!)QA#1uz8;urR zH)Px>7tpT2tqGs;tZiCw!T^yS$p-CE6^VHDf*&jS=PEqHX`{^^5ds-=x*U}Q99VPa z&B%*8mfU`idDRe^Ke?x2v8%sF_CP!#J|@{JsPrh= zML7h!edh&P+x&%Tl|v_^O3}Uqv!S+u*{abRMFv`+G0mlCrU0QmrC5lF9HvN81u32#qQ~?%3fWqTJI_`s6%0O0|~nmyVSclFs59oCOOC| zqEM0dzo2BzeSRA36F&u5?p3Ta8e%;Xx&1`D?q|yKNp3Hr@a1gAqTv&9(0g++L{|f4 z`5?E4r|HF!+5Qml?2R*IZ2w7V2E>|WffT;4zC)f9#sq!^!Q}$kXlG)^XhZ0MuqC4!N~Kp1ZJ-NaZurXf0r$|8E>;6N z>XtUPtB1xuk1n`sK%2!LumyRkw{Chc3htf`+WDq!o47W^C+kVKXj%*<#v>uO67osA zLwdQVshA-^?4aT@Y8Y|9xHhWoTgs@$TmB{cK0H3w(m_PC``L_uyDMmx4=}m`rYRkA z@YxN`y$Ys%8j6Y=J;M@NvP|ayvIC_$xqp8j8V%^7!*i~r)j%IVud8|vr5pS`DK7Y0 z4DRpeJJOds``|<95uEe{b~0{ir|qBd`}smT0-sObo6V}S;cLXAqQW93di_c%At``ps3&KRtu`;2qAI%TzG{V z%T%C71)!*?nhfreJYNg^+D=%h4sdTU2^m?WdE-Dl6hL0?A_e{1RQ1o9A))M_%!qQR zz(R}R7BtwfS^`<)vmu0G*}jje56wZGixM>WbGj*CCCmjNuV;<&k)5Kjk-f#MG6b<9kf!+jer#0uVAsQfYwM+w zLqUMsJt;8CW-ic}Pa~^A*dc@EkHYg)EwyZP-Q+kQaC!X_?&4XTo8W7_I(>^SyH#I|J*-&yC80M6g9>7ttQ!r9cYO6Ib93pm0yX8K}uxQ=UMm$$wCNo2Xh&d1ednq(;7^ zA>lxi>W|=;xjAa4sw5PQtBYKQtO_uu(uAmMlsaYvT)Nhxo6 z#4;9JA@-%APk!Bx&;{ny6#Zth%GmJ^;zTc`8#iD}+|dt`%5>a)huJi_=8=|poro6W zBSEkhX1F0m=#t{N&Mvl*PP#H9b@wrDO+TlIR-n&s2^tGU8$+`eL&GQ4vn53uO#y!J zOWe)`bmpwos1x6_A)UIs(8gSCU_q+CAgW^4i%+j2Ua6MNo-opN1^1s$m80znkZn^% z>4@|wRO*bMmmz5y?Hazon5FonYI5keiSdb*9pN3F8rvFM8nz+fB6P`~7p$;vTc^pM zKMZibMDO~cO)J|ynGuV50CG!!TBg1|I9!!fc9TO6p|H=8&uVED9@fC1DZ=crPf$)J zWlCxob)Iw;Jr}#2S8_kYeaqLPEt9C`5ZZJ20``g`o5yX>Ye^N)Rlb%Y2{3~fF@W9rd@YK=CB@L}w2 z-rHM*bPSSU>n{J%i){E&v&~>G3NW|S$CPwFKYN_74XE)@4!*%7ZoQf+Bf@b<#hQQ- za+BT&xhb0U@B7I1)URB^fz&utMq01QS#)S-f>0@?vgk#-> zVm*Xo)g-x|l|*1i16pau0%j9EyG}~c5ATpC3OX4o%Y}jZM(vLD?UEIf#tylexE@18 zysmM4K<}H~&aUr^9-;l)xq@X!@ySo4e`16QK`Xk4tkp2+XMHpL(p2~CPG^?pzvX+X z2X0E1LEodTC>*G=_hZ*YSzeXIRxbxwY0gXq1)W_3iq5R}Zf?zHp0#E+14sZu6cGDz ztutu|)qu+?2Og-hY}==3>&#bTfuoQZ=)qF&KWq1FGE_8*!d29mSQ4O9#z~zEwAhe4 zgJ8DK`oTz|zbs=Szr*U3ESY+rnG}BR%ZHgaq?%-<-4rR$**JFds0N!hcxCI%7Yo;@ zbdiBR%w-0jI(p^mAPMhCyz57K=V@<&y)fUOF33vDI4O*Y;p2bi1^e_BEST4;`+D^t znqI2B7fw&}%tR%fO1vwwUbGD89s|9*cgR$UzW3lVvu7xku8@d(W%CjV;UeUAmS?4E zZsl$1u{`>IOixEoPiL!?n$ehIuHJ!{HGIFvi~!C1;h@$vgLd8qBB-dUihGGzl`^q9_9A_lZFTHBhK;jH`XVjmGtJ{DAq_{=+&nzYGi_6+ zX32uBp@fkNwVL?>q~kZX0QPd>oVJ0}tDJzcERK}+4PCHyXb$WpL#AyGeN;Ii^3bm_ zswevN;kWO{@bLAp7?46`5&JievKlmom&Yrh_n8^^nHiBnu7E>ZEr9oN*yxPpWv~~m zO0py%oq9t2Gc@&McJ}87BQBC| zvXcBP*h^ild|fR8dS2iR)(dxHWWExX)Q?USh5${+B7WOxUT<@R(7AyVZhX7Ym3@p{ znHlIs&9lrslvzZ?djW}d)_7I{&3e+!Aq@eil1bMr+8?Oq3nv17`bL~Jvem;fGi8zq zZXF%tXd=Cdgb_*9!J+jX9M5A+H zR)*niXBB`?9`E~LFSL7d3RW30!ZPX7G;1f;t_Hmbhb$I3@K zFWn6UF7u`Z;a&E&-1O>|n*%=WCGzma(pWEUM4{vUa^`k{Dqo;%KSjkSPcx#3A_ZSY zy=}YPmr#_L312rkjx;hSeDRGA+uNWYk6k?0E2C>clN;&r)zRzn%m#Dk3yj9r6X#W{ zOHOu{AEZN9Tpea2qq{GxBbCWcE*1EbXEt3ndwEMcWe@W8PG~Offj&!3-bJ7@023l7U9+_{<`_jkR#Dfsg3IlFZo$9E z@qpG(?!j2lxnB;#tYj{(aE=vNZxvcI+_21`NXtL9wMf~MaJ*+nn+B3! zln6>&URQ}GcKp5PPQ|yBOB~@E!VDcOt3r;^*L^eFCu`;DFxN7;WRBtDgzHx8!MEFP zVV&&sYE^f8G=+U5cNV%w8}~Nx+JfJO6o-mhm0Ev#qNBW-(DC8b+I#qQKX13#XJ^4a z4PagGj{-x`2G?7xG+L}Qe?xzUebxse`eaK=+IxAe(&t8-Rou1NvPk|dArPGO+E|}K zguh&f;>IgW%n*wNSe`B+gvaV`lJzXvQd~Aq%g^{ctpZ%HSXHMg+{AHA z-jB_cn2L*f?VROdw^HWt!MFX9#KZdbuCWt&`b%r0W?iV(+Plx2VafB16)LK7g+IvV zL0I&*HkfoMM^%*pjFukS6 zcrGX~!B^Q7Pbf`**Q3E}c$f{rQTj09vth@4n7*9En8 z4ncw{sbq^w)m=eRoSmHj)VzUs_{|JO)>z$`Cb*KAfdqa|=(~>H^-b}Rk?88|X|Be` zoIRM4I`$Xy?G)`}+BZmCcbkXf09{(Sb^W+9?;k|azx!*KpNQOhBks-OP37&eJ=;nJ z_DQtBupnxoau#Rdww6V>O}tH^O{dIsAsYd>w@la(ktY*TIEt^lK0lSAUcCTi4+MM2 zOxP|aI{{o0!`uhXZD|S~n}*0|e$Z@oAc5xSxg|@+%DihB+a9@jdYvo206?>$r_9@QmQ^I-?{O4LhUMl7r^UaP;M5XwSMyg(R;%O{35M=)@Q&32E^Lk^O*t}kfYlwQ9jkFS z0j!a+22O6zZr!&cW*de9<( zlOllU#mbQ)fVme7Z#F&EPv~{5TD0fh{SVxmgp5nv*FVKTFKstO6<@u{2ld7UHdBAL z8+}7%a{dXCQi_y9;fDkJVkT}Rr3GE2EWBJk+bOt>FTS561~qBW)uM7aFFF(r?1#Fxp9dl_R#-gxdK|k5 zXG*-eeT%ksW`oP#BiQ8nl9%;fMDXF2wRXA|Z{0A-R-Nf=5V8Mo2hrWd#nIO0+WYBm zH`=Yc?mqGaR_LnC)poNt!mI6kN|V+jNJ3jr65Br7k7NS3TDlFk0hX=e(MFiquz;Dt z7#5}UXv_N*hCr-533HXn*P*>_!V-{C>4 zT%#kYLY$%)B0;3gkZG5B=ap>M0e}88dq0PuIEO|DYac3ZC^KmiqI{?EETU1dym~l9 z*$i-f$Kd1JIQ!`YPuJ})O4&9g+x^IC;J`r+WH6(L{F416*|zKT;oct%H{GuBZ0EO1 zPaIRt(R$yE10V0Ee#6|v)VhHIrnrZEWwT4KzYW!DyVLDQO9XY{^-HWMYx-w(A zN9F0jYpDbePi@8PdLuop%f*qXc2+uXxh+#~wXy5m3ANY&4giXj=M(%O59jB!PCMH^@7>xBLG5s9L+2UNyOAiXbFsoU-Dm zN%xtB$9kiNLkdRM)!)bKd7O*y)fiUz{W5+Vyv}&VrLN*|8SL2chHtV^GPb+SUILVn zva$>gI{9Ge$UO~KvTh=)2PiE`S4scsJTV>IFI`${tkRY~JR72-s2rCS7i-3E|J;SA zbaAqTE-6n-Pd#-qmJ+A!@ILofD4Ol^+XT*@L~7qAV(EGev(*phf**PKj*H{nap3Ho z@bNoZgUSM{EFH7Kr`EgRUH!3P0B+=XB}2x*$5&e-DIC|%j~NI16IAkGzSscWaOPS+a$4azEANAypC=|`{5U&L}dhjUbkbex@$ zYO|*4;!|GjOpcy&`xZt{E%R%Y^Q9{CngrWCv4d_MxlDz&)>+a`?w#F!@2$_Am% zg>?*ZpC%0A1J@@DAizMw==n+J8(=E%#@V@-7BBf!X)IFj2Qo8A2VFi&D~6;O0voiW zE9&S6L=V^tPlztUA8^YkBuJDS9(Tp!XRx6dpA-P@?l&*eu z^jqQV;lt2S1aT6-gYoWy4~t@jy24ia>V*)?{bYmu1t%&n$o{~F4yq7uv0Jf!g$~9Jwokp7FCA(Q{)nG=*E0wz8`2JcTu2jm zVRWfFSr7YiU#AD5n7=%DB}5XPg^zmIi4N5ceO$CXQ;)E-#|vUi4}TX@HNX|94^xkR zS6Z&f6M#|=Vs}EWD&0@%N!tTbSrBNK+7^4aq8j>!CCFmi{lK9a8v}l+*S_Bg`sybp zT-vtC0i)`7R(xw+SJHB!FCV`$PhguKvOZ&<$2Lm;R!_yKcr)rE-saG?cQf`^3T0R` z{0%VI@b#lD*skDoz!P1$s3$NB9?$4CeY3(dF#4@^|HO3o6Ig%Li4G5;weJ?bb)ZK= z)HX!W+BQ!==?*~uMK$~ld5~mX5tmqFAa9%z?=6(JYb0k^2fKdnMu(RjYg5_EoBgVzZtg46LUf`9B|9L?JK z#uerYmnrC(vh&4<-tx2qawhQhl)>?N!l=XP1S|KmX2aY_F9$xMoQrS)d%$f4b&T4v zg@cXk*#dLGZRxop{l@QvnxY)q=5__RLF?PQ&b`HXgZNF@`5g@IbNrgt7Vf6%y7rdF z^P7**Tl9|THO21GHO4OKb*nv+3>_DQ4W2io4Zb&MFdVOmE99og8z3y@Rdb5jg5ykl(dRD1U_gC`l` zbDZc!E(|hX|66X3uyx#R*}b3-o|vE&W$C4R2id)t4W1OC7iAfzd#C<=p;ea63uo`% zEqv~XQAVem&1=VI``&%g2;KZx@Bp9s- zS3li5#O?)u@NWw_p91M0cb}~3-Z6GB!h>Hi1v)$TTi!CCs6~J5+Gh7+H+V9HUW99s z?j3ITLjSe!)zIri`UlP4y$gC#*H?!&K8a;`d)eN>_wEV9=c4HTu`v8;CiBU9BK}+a zU(uGY1ouBtlE2uNzreV^^MFEs=K=qJ$Immc)3C8Id?m#H517DziJ$*Um#1T6|H_=F zW@KQZVWs%|vKa)KFk6`yNQ1UO%kM#@W`wBw;+nT?&{mH{=;jyydeWj)|{5wd9 z$Hsui_IF&6?Tah?qnUqu{7L<3{Y$_)BjaBM{qJ}+1{U_e2WD%SR}if+4y#I{aj0%u%{q7t{0Y#2iqsrvo2> znKY+|&Kde47HixMQimBBC!IkuAG+q$$i{3hmrwTXI5=!_vD~)VVPOw3$0jHb-aepD zWr4#QwW7;TzziSX2m%Z2=zjKO$yy+r-`TP`45|$$iT<+HAhO6|&mz!g+?rzkGbmTx8w3JZEcQT1@Ng>}O-{N`$t5&D${h8~# z*)ugq!H+Z$j;vjy4mF{es##eFTmX%5yN%$O;6|@Lf!z;Eb+fA5SFoAtP?CQgp#Lea z``@u=|HZ}mKcvqX{}>bhOrQPZtp0u2{1K)8ALuhSrvEqijFFX{>F+1~Ld`=leyL&W z$YTPUu^SpXoFRlU9F~VK8hsj}lK)_b(hrcM7<^ce4-QFDjA=#)hQC;Pk1#Yf|8X;) zej;K^%F=K?-MMRqCseCKPx zJYwsrDa^y3hYRzhXgp(SbYzV$^Yj6x({Ho3G0?JD5=whu|7M5wie+A2Rf1{eeWtx1 zTgZ}ai+2(+(~^^QXo&K%Zsl8$Balgyz2)i;F(t>#Bf1|Gr8=MebYY2C zu?bllbWxpUBXTa;#r)m;Tv$XPPh=!JDAiFDA?~t6QrX`aeF?G`RY4!|s70XQR6%I+ zEp(}8ACgas(QN^p1!*07I86f&mS5-;4P;4^ppJTgwgQ%Fl75tc61qTBwIkOHz@i0u zPlqv}6+pm=W&-&;0_5h8nJT5a>hV6KsAKh$3WN1#p3^?-2mlTJ1f8=6Z!-O1X9vIE z!z7st49VwzDh^AYnpoh}QTF6{b1K6LzH zI3^;;mcZL;4yHv~wJ6~ti0Fh!CAh{~btlM>#LTOo zLf+JPtP`VAG6YWUkugG)FCMqS@JO=xqQ5&yI)2z?su44RN00+`Drbb<+i2iq$xS@s z;#M4|1HnQ6`TTz9Onh9UB8qV;d6B#0P%9SZ!Th5Q)w2lT0h1BPiZhF3|L@a+l{m5@ zuVU+#uB^-2q9&Fk`xuc98Nwel6s(NIGkh(_Tu1lfmgSv>ow&%Z`t=lw-SX9CW&)i@ zm%y_-CAs?m60?Y6MMcT6EE2Ht_P-EtiQ^E5Svd4Dv1=kCmk&c_at+9z8HwZKs&$Zw z!N{LMhX;D~6Xj%(&s?qa#zV3I#tz&eWd!Fr@o z-Xd&qPSN;5pxN8d1+wu9)67u%XvuOMbM35 zl?@WBA2GsN?v-)~xY=O0bWI6gaCVkmafVQLG{fk_nkQ?!H3KFHw%yBYp)-UbQ-}fA zA}oD`$O2kiDW&}l%MtB1^7geyiMvU+kzRHkFKh79N^n5X+`r5Ea2%a!$V9c`5sQxywsN z@MWxN<Q;NBcP8ya#?9oVWQL1sRB+6ZA)EEa5$)PDCxs~YCP>Bi^r`#%0M7fs4IEswi3(5Vg zsdG*)o%8$t`__N^S?hh*yWX|mwSW8B^ZbTM(u(L~_AA5ISh~#3qkf^|FIv~szY5zo zmR^A{MF!$3!WMByBF=C3ZO9l39CXTO>E^qC*cEzcXhBxQwvA?iBjLDmHF04-t3NQ39ay55$o;YV#C-M z7vnmMf~m`cuid|KvDWpDa};h(SKCQQ=YO#G*;+(kxHE6?d^4?&3_oxe&gPmQum6(t z+3LFOhp}z~?s+@sTEcCILW7zIkl*WZJRIvQ^*ZFS5oU08f9*EzBJu&Bw2)oiV!nKqEk>=ShzI~EGRc#)!-xLJWo zsP{H`Q0qBZu2l2tdbP-l>F?*=$IAxws_l1*HL>Ng@x~0Sdwxu25P!V+xc9>xZeQW$XSCsH@FTpJo-%auG7f&+0UI{3TM>k;yLicV3ym%Lsj+pl>kUJZGe z<06YLUU}1-%7pz)UwWXP;ehn%{*A@IFIP?4Z?v`B(=N@%uRVI?>iDq@$>Y-fE4*uZ z9zGp~9!W8@c5LWfk?Tvq3(96kN*YM`4@(4SEPk~B595C5>*A#O$8@F@$T-hwQB<^9 znb?@8ekW$&{IyI}^_SFWHCN+WG^TKrZRXYgIm}>anO#WUL*0b0D#Pt8>R_eeDnzAcDvs98*)O^pg_jPlN zVdqh8^|cibGhF=5DjrF-F(3E8d9Ns0Tox^)*Q3Lv)X&fDkxzw1*OgUug?#V!ppKF zbESffJBe=FyBs!hRYT5|C=5MI*(Nt9J($8d;GRs*Q1la;VYn=4f%z&qdGfEacT-iE z`MAl&gIbTJ7niQPa6^)_PmhsMB-)lGC$7wp)ya4rTUE(3cEgwtfT$1uHf-gk>ApK0^FY$^z>+lsvazeguMOKylsb5!!xpdj`t|S zY~P;F1M7V^5A*WI_`ANSex^r%zE_ztvj4Pqn;oHeWkqZrt6!|_l@jMR{nuYHO_6SSVKSfQ)qclwPmnUHw zl`g*c{X#FpyC0sZ4V8Q4@CWZyc6V-iygX08;Vn88;BhsD@qk+|@iNENqp#)4Z$jB+ zvf4XWUnyFnr5)P2*|nzbSpQz(s=!<_T}Jt=<=nC^cb&kO1+sDQaO7Y^)yUg!yS1NB z89&>qUR2xfu-N=kgC+mS;Z4<^$oi_Muf-{QSBsvm-s;T_l+j6uUUTYPpsYAzu%B}w zDf*VCF3%{xqvakWy=l!!i-%u*4%Vc?7MxI>&_^`^swI!Rgf7={N8Z)GU${$bWUS+| zSijk&ZS_G{30?$m*PuQ0w2Y54$)1M}F-`4@^ZaVWmFqeb_gzqPF&SvnVchb{%({~i z+jjMnm}^P_J%{H=H~4f7&YhdAaq?IpS7OED)drkIOySt_z@B?@O)Z+pnFU_?SMu&y z>V{mAd)&ymyZp`0mCqV<=a@x3*|I8+z1}O&w(I@LxPgV@XFQ*u^-n;1`RyUnp?xd{ zLB4O?{gy{p*?ZIQgSSPD+v*Z*F2z9&=IYJ0yBUQZPEWd3Dsq!MI`(8)G!{>h*K?Uf51YSkr2wSUDCLJHe=HQ%XWm}v{)uXlr*Zefp)-55$%lK*sZ0@GdDp%6o z{gG#tR28JCHp_d5y`)nV8q$1(x2BBsA>q0wzal|(q+snT?(3wbcHyM;OREp|C!vzo zuMhgY($G8+sJgd+Ekjl?i4~KL)I#@s7D5d>xFW0CKRSC<@%^`2V(#Mn^zdBA8B1#Q zmd+Yc8|BSqPk(c#pg-P|f6z-mr`EK;Q)`AURxWH8WkXwgH)l&0V4|EY?Ollz#I`^U zOQj$bTy&$rk1f!eDU%U|1S1dzcr+un?cv=-ltKbr4u)cri8Y8sqX-1J--$bQroFQ* zakAEyO2J4tj3F>^N(IAd7(^q&FoKg1UYu6AO`D1yRYq^HXGgW%;*OY4Q^kPQdlgPbv(cQr^V!QPImP_yE z3RzsW+9s;O^19yBVw7sy9Fy&qj%PT=nwreiB9OB8-p%h?*D{l^x6e*k=Em)`VMmo` zyq)cYSbbBDsk#57iuJjDLmB^-;Ff2)1eEAycbS(RDC8$gRz8}?3oM(pjOU8vX01-K za(7H3byY8j{2E<$!%2G3-9^K#DY*$(c4B-qir=uX8T`ely#CnA)+2op5mytCT``TU zn!4)WN^C@=IL$QAMP5aL5k>2@XSr=@lA0hBh+4+BC|Nfzf{#W+zn|L0Sx3P-}^N_WR zjV+NP*!BtK?ZL9O6NQN22m&JfKN}H4QBcoz#J@2ZoPB~uWd4c42o=!ElQ9Sal>HP8 z0S6FR^dwu1Mn%BQItin}GyzpP5rZL^3hHbU1}W>DY(_*1P_)qo{osN+q@L6Kg zyf6ge=#*H%p2N_TSOA6~Q|<$R(FC7=1nsZ&g6A0yPs6}zIL#jh&h8(!Y?kFAXIqvi zoxaiN&@oUU;Aw0K#M49=7!tuFZ5z|hg$OqFTiLj>Em`buMFRqb5L{G2L7TDl51yPS AmH+?% From 3de09b0880a96ab40a407a1cb5c8862a5955b808 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Apr 2024 11:41:51 +0000 Subject: [PATCH 175/345] build(deps): bump github.com/onsi/ginkgo/v2 from 2.17.0 to 2.17.1 (#2433) * build(deps): bump github.com/onsi/ginkgo/v2 from 2.17.0 to 2.17.1 Bumps [github.com/onsi/ginkgo/v2](https://github.com/onsi/ginkgo) from 2.17.0 to 2.17.1. - [Release notes](https://github.com/onsi/ginkgo/releases) - [Changelog](https://github.com/onsi/ginkgo/blob/master/CHANGELOG.md) - [Commits](https://github.com/onsi/ginkgo/compare/v2.17.0...v2.17.1) --- updated-dependencies: - dependency-name: github.com/onsi/ginkgo/v2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * gomod2nix generate --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: tom Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index b4a589fee1..44d945c16f 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,7 @@ require ( github.com/hashicorp/go-version v1.6.0 github.com/improbable-eng/grpc-web v0.15.0 github.com/linxGnu/grocksdb v1.8.12 - github.com/onsi/ginkgo/v2 v2.17.0 + github.com/onsi/ginkgo/v2 v2.17.1 github.com/onsi/gomega v1.32.0 github.com/ory/dockertest/v3 v3.10.0 github.com/pkg/errors v0.9.1 diff --git a/go.sum b/go.sum index 7e611c4a7c..443a1b4140 100644 --- a/go.sum +++ b/go.sum @@ -941,8 +941,8 @@ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108 github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo/v2 v2.17.0 h1:kdnunFXpBjbzN56hcJHrXZ8M+LOkenKA7NnBzTNigTI= -github.com/onsi/ginkgo/v2 v2.17.0/go.mod h1:llBI3WDLL9Z6taip6f33H76YcWtJv+7R3HigUjbIBOs= +github.com/onsi/ginkgo/v2 v2.17.1 h1:V++EzdbhI4ZV4ev0UTIj0PzhzOcReJFyJaLjtSF55M8= +github.com/onsi/ginkgo/v2 v2.17.1/go.mod h1:llBI3WDLL9Z6taip6f33H76YcWtJv+7R3HigUjbIBOs= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= diff --git a/gomod2nix.toml b/gomod2nix.toml index 52ac587145..3c6629383e 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -483,8 +483,8 @@ schema = 3 version = "v0.0.5" hash = "sha256-/5i70IkH/qSW5KjGzv8aQNKh9tHoz98tqtL0K2DMFn4=" [mod."github.com/onsi/ginkgo/v2"] - version = "v2.17.0" - hash = "sha256-zKSbCHAAJ19tZJ8gb008Tg9VBpCVNfT6uGTEZHWVoGM=" + version = "v2.17.1" + hash = "sha256-kZgSreUHuYwl6Hh1SHmSasBwbV7qeYeg4BFYoxMchg8=" [mod."github.com/onsi/gomega"] version = "v1.32.0" hash = "sha256-FzYwmABdsJFJhATLXRJgQjZBQqL6yycRm2SZ7iJCjo0=" From c124b8bc620c61c6b3bf9c3dea2b72011b37829e Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Fri, 5 Apr 2024 13:01:43 +0200 Subject: [PATCH 176/345] only use os mail address for inquiries (#2457) * only use os mail address for inquiries * add missing dot --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4807564fd9..86732d6e16 100644 --- a/README.md +++ b/README.md @@ -104,7 +104,7 @@ of the Evmos repository. For more information see [LICENSE](./LICENSE). > [!WARNING] > > **NOTE: If you are interested in using this software** -> email us at [evmos-sdk@evmos.org](mailto:evmos-sdk@evmos.org) with copy to [os@evmos.org](mailto:os@evmos.org) +> email us at [os@evmos.org](mailto:os@evmos.org). ### SPDX Identifier From e7fb8ed023b154a8f5dfff1ac6b012e9bbb59863 Mon Sep 17 00:00:00 2001 From: cui <523516579@qq.com> Date: Fri, 5 Apr 2024 20:11:25 +0800 Subject: [PATCH 177/345] refactor(evm): using maps in std library (#2438) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- x/evm/keeper/precompiles.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/evm/keeper/precompiles.go b/x/evm/keeper/precompiles.go index 3b39be957b..e7027de513 100644 --- a/x/evm/keeper/precompiles.go +++ b/x/evm/keeper/precompiles.go @@ -6,6 +6,7 @@ package keeper import ( "bytes" "fmt" + "maps" "sort" "github.com/evmos/evmos/v16/utils" @@ -14,7 +15,6 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - "golang.org/x/exp/maps" sdk "github.com/cosmos/cosmos-sdk/types" authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" From 1c00e7ebe6ff7b6356d77ad8b5c3b9848aeae840 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Apr 2024 12:27:39 +0000 Subject: [PATCH 178/345] build(deps): bump golang from 1.22.1-alpine3.18 to 1.22.2-alpine3.18 (#2452) Bumps golang from 1.22.1-alpine3.18 to 1.22.2-alpine3.18. --- updated-dependencies: - dependency-name: golang dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 1018e17142..17d8fc7ef9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.22.1-alpine3.18 AS build-env +FROM golang:1.22.2-alpine3.18 AS build-env ARG DB_BACKEND=goleveldb ARG ROCKSDB_VERSION="8.9.1" From 049aaa1250957f74b866a56d4d9146d7ab0673a3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Apr 2024 14:57:29 +0200 Subject: [PATCH 179/345] build(deps-dev): bump undici from 5.28.3 to 5.28.4 in /tests/nix_tests/hardhat (#2456) build(deps-dev): bump undici in /tests/nix_tests/hardhat Bumps [undici](https://github.com/nodejs/undici) from 5.28.3 to 5.28.4. - [Release notes](https://github.com/nodejs/undici/releases) - [Commits](https://github.com/nodejs/undici/compare/v5.28.3...v5.28.4) --- updated-dependencies: - dependency-name: undici dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> --- tests/nix_tests/hardhat/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/nix_tests/hardhat/package-lock.json b/tests/nix_tests/hardhat/package-lock.json index 5517a819e3..4a4f87d816 100644 --- a/tests/nix_tests/hardhat/package-lock.json +++ b/tests/nix_tests/hardhat/package-lock.json @@ -6464,9 +6464,9 @@ } }, "node_modules/undici": { - "version": "5.28.3", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.3.tgz", - "integrity": "sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==", + "version": "5.28.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", + "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", "dev": true, "dependencies": { "@fastify/busboy": "^2.0.0" @@ -11635,9 +11635,9 @@ "optional": true }, "undici": { - "version": "5.28.3", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.3.tgz", - "integrity": "sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==", + "version": "5.28.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", + "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", "dev": true, "requires": { "@fastify/busboy": "^2.0.0" From efae40a264f6fc46f7869a674b25a49698acbfed Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Apr 2024 12:59:11 +0000 Subject: [PATCH 180/345] build(deps): bump undici from 5.28.3 to 5.28.4 in /tests/solidity (#2455) Bumps [undici](https://github.com/nodejs/undici) from 5.28.3 to 5.28.4. - [Release notes](https://github.com/nodejs/undici/releases) - [Commits](https://github.com/nodejs/undici/compare/v5.28.3...v5.28.4) --- updated-dependencies: - dependency-name: undici dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- tests/solidity/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/solidity/yarn.lock b/tests/solidity/yarn.lock index c81bafd5a4..16d8a5a077 100644 --- a/tests/solidity/yarn.lock +++ b/tests/solidity/yarn.lock @@ -10954,9 +10954,9 @@ unbox-primitive@^1.0.2: which-boxed-primitive "^1.0.2" undici@^5.14.0: - version "5.28.3" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.3.tgz#a731e0eff2c3fcfd41c1169a869062be222d1e5b" - integrity sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA== + version "5.28.4" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.4.tgz#6b280408edb6a1a604a9b20340f45b422e373068" + integrity sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g== dependencies: "@fastify/busboy" "^2.0.0" From af52e09e38b478899be6053778d4218ed4fa0ea8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Apr 2024 13:00:23 +0000 Subject: [PATCH 181/345] build(deps): bump crytic/slither-action from 0.3.1 to 0.3.2 (#2447) Bumps [crytic/slither-action](https://github.com/crytic/slither-action) from 0.3.1 to 0.3.2. - [Release notes](https://github.com/crytic/slither-action/releases) - [Commits](https://github.com/crytic/slither-action/compare/v0.3.1...v0.3.2) --- updated-dependencies: - dependency-name: crytic/slither-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- .github/workflows/slither.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/slither.yml b/.github/workflows/slither.yml index 3b7fd2e672..acc9990188 100644 --- a/.github/workflows/slither.yml +++ b/.github/workflows/slither.yml @@ -23,7 +23,7 @@ jobs: cd contracts && npm i cp -r node_modules/@openzeppelin . - name: Run Slither Action - uses: crytic/slither-action@v0.3.1 + uses: crytic/slither-action@v0.3.2 continue-on-error: true id: slither with: From 3181607936b8ffafb6dbb91ff06a78896876d793 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Apr 2024 13:13:14 +0000 Subject: [PATCH 182/345] build(deps): bump golang.org/x/net from 0.22.0 to 0.23.0 (#2453) * build(deps): bump golang.org/x/net from 0.22.0 to 0.23.0 Bumps [golang.org/x/net](https://github.com/golang/net) from 0.22.0 to 0.23.0. - [Commits](https://github.com/golang/net/compare/v0.22.0...v0.23.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * gomod2nix generate --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: tom Co-authored-by: Ramiro Carlucho --- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 44d945c16f..a9c5e49085 100644 --- a/go.mod +++ b/go.mod @@ -47,7 +47,7 @@ require ( go.opencensus.io v0.24.0 golang.org/x/crypto v0.21.0 golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb - golang.org/x/net v0.22.0 + golang.org/x/net v0.23.0 golang.org/x/text v0.14.0 google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 google.golang.org/grpc v1.62.1 diff --git a/go.sum b/go.sum index 443a1b4140..2043e07d5d 100644 --- a/go.sum +++ b/go.sum @@ -1354,8 +1354,8 @@ golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= -golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= diff --git a/gomod2nix.toml b/gomod2nix.toml index 3c6629383e..7b7bdf146c 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -673,8 +673,8 @@ schema = 3 version = "v0.14.0" hash = "sha256-sx3hWp5l99DBfIrn821ohfoBwvaITSHMWbzPvX0btLM=" [mod."golang.org/x/net"] - version = "v0.22.0" - hash = "sha256-pcefO4noO9I6mATKBWF6shgIjZvFg0kDsV1Jo/NsFns=" + version = "v0.23.0" + hash = "sha256-ZB4504rtgsHbcRfijjlqt4/2ddb8tyQB5IBn126uVTQ=" [mod."golang.org/x/oauth2"] version = "v0.16.0" hash = "sha256-fJfS9dKaq82WaYSVWHMnxNLWH8+L4aip/C1AfJi4FFI=" From 712b4936321cd54ce8d3d1bf875be097da104d10 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Apr 2024 14:35:43 +0000 Subject: [PATCH 183/345] build(deps): bump bufbuild/buf-setup-action from 1.30.0 to 1.30.1 (#2450) Bumps [bufbuild/buf-setup-action](https://github.com/bufbuild/buf-setup-action) from 1.30.0 to 1.30.1. - [Release notes](https://github.com/bufbuild/buf-setup-action/releases) - [Commits](https://github.com/bufbuild/buf-setup-action/compare/v1.30.0...v1.30.1) --- updated-dependencies: - dependency-name: bufbuild/buf-setup-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- .github/workflows/bsr-push.yml | 2 +- .github/workflows/proto.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/bsr-push.yml b/.github/workflows/bsr-push.yml index 92892f3534..d94f63e3e4 100644 --- a/.github/workflows/bsr-push.yml +++ b/.github/workflows/bsr-push.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: bufbuild/buf-setup-action@v1.30.0 + - uses: bufbuild/buf-setup-action@v1.30.1 # Push Evmos protos to the Buf Schema Registry - uses: bufbuild/buf-push-action@v1.2.0 with: diff --git a/.github/workflows/proto.yml b/.github/workflows/proto.yml index 8e2a14af20..c1c0e12aa6 100644 --- a/.github/workflows/proto.yml +++ b/.github/workflows/proto.yml @@ -28,7 +28,7 @@ jobs: timeout-minutes: 5 steps: - uses: actions/checkout@v4 - - uses: bufbuild/buf-setup-action@v1.30.0 + - uses: bufbuild/buf-setup-action@v1.30.1 - uses: bufbuild/buf-lint-action@v1 with: input: "proto" @@ -37,7 +37,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: bufbuild/buf-setup-action@v1.30.0 + - uses: bufbuild/buf-setup-action@v1.30.1 - uses: bufbuild/buf-breaking-action@v1 with: input: "proto" From 43c48b68beb7ab715c7bf1dca0e002bffeca4c4a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Apr 2024 14:59:08 +0000 Subject: [PATCH 184/345] build(deps): bump golang.org/x/crypto from 0.21.0 to 0.22.0 (#2458) * build(deps): bump golang.org/x/crypto from 0.21.0 to 0.22.0 Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.21.0 to 0.22.0. - [Commits](https://github.com/golang/crypto/compare/v0.21.0...v0.22.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * update gomod2nix.toml file --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: GAtom22 --- go.mod | 6 +++--- go.sum | 12 ++++++------ gomod2nix.toml | 12 ++++++------ 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index a9c5e49085..e680cac573 100644 --- a/go.mod +++ b/go.mod @@ -45,7 +45,7 @@ require ( github.com/tyler-smith/go-bip39 v1.1.0 github.com/zondax/hid v0.9.2 go.opencensus.io v0.24.0 - golang.org/x/crypto v0.21.0 + golang.org/x/crypto v0.22.0 golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb golang.org/x/net v0.23.0 golang.org/x/text v0.14.0 @@ -236,8 +236,8 @@ require ( golang.org/x/mod v0.14.0 // indirect golang.org/x/oauth2 v0.16.0 // indirect golang.org/x/sync v0.6.0 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/term v0.18.0 // indirect + golang.org/x/sys v0.19.0 // indirect + golang.org/x/term v0.19.0 // indirect golang.org/x/time v0.5.0 // indirect golang.org/x/tools v0.17.0 // indirect google.golang.org/api v0.155.0 // indirect diff --git a/go.sum b/go.sum index 2043e07d5d..3aed2f5595 100644 --- a/go.sum +++ b/go.sum @@ -1245,8 +1245,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1506,16 +1506,16 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= +golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= -golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= +golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/gomod2nix.toml b/gomod2nix.toml index 7b7bdf146c..9ad67f6e74 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -664,8 +664,8 @@ schema = 3 version = "v1.21.0" hash = "sha256-vjZsOaQCgTjz6WYim0YZHLnB/PC3CvTSpS97qkL2vz8=" [mod."golang.org/x/crypto"] - version = "v0.21.0" - hash = "sha256-Z4k1LvFh4Jai7HUe6TTuXSG3VnuiRpMwdARIdZZqSYk=" + version = "v0.22.0" + hash = "sha256-2+u9nd32+Bi7EEv7QFc12CRTbfV7DApNv+yKIr7+lTw=" [mod."golang.org/x/exp"] version = "v0.0.0-20230711153332-06a737ee72cb" hash = "sha256-Cbw10ZJ+jATPV232G47xZrn6ExO1FDtiT6nlMRCH7EI=" @@ -682,11 +682,11 @@ schema = 3 version = "v0.6.0" hash = "sha256-LLims/wjDZtIqlYCVHREewcUOX4hwRwplEuZKPOJ/HI=" [mod."golang.org/x/sys"] - version = "v0.18.0" - hash = "sha256-bIFhfFp7Sj0E1gcE3X3l/jecCfSRLgrkb8f0Yr6tVR0=" + version = "v0.19.0" + hash = "sha256-cmuL31TYLJmDm/fDnI2Sn0wB88cpdOHV1+urorsJWx4=" [mod."golang.org/x/term"] - version = "v0.18.0" - hash = "sha256-lpze9arFZIhBV8Ht3VZyoiUwqPkeH2IwfXt8M3xljiM=" + version = "v0.19.0" + hash = "sha256-wFwEMwhtsr0C4mqjxukjMM7lxJLYPvb7gAPO95xyhyg=" [mod."golang.org/x/text"] version = "v0.14.0" hash = "sha256-yh3B0tom1RfzQBf1RNmfdNWF1PtiqxV41jW1GVS6JAg=" From 0d00b3936923fb0da8d83bcc6e2e14824677952b Mon Sep 17 00:00:00 2001 From: redistay <165581775+redistay@users.noreply.github.com> Date: Sat, 6 Apr 2024 03:46:50 +0800 Subject: [PATCH 185/345] chore: remove the repetitive not (#2446) Signed-off-by: redistay Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- app/ante/cosmos/fees.go | 2 +- app/ante/cosmos/fees_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/ante/cosmos/fees.go b/app/ante/cosmos/fees.go index 76d145ba75..e5cf4c782d 100644 --- a/app/ante/cosmos/fees.go +++ b/app/ante/cosmos/fees.go @@ -116,7 +116,7 @@ func (dfd DeductFeeDecorator) deductFee(ctx sdk.Context, sdkTx sdk.Tx, fees sdk. if !feeGranter.Equals(feePayer) { err := dfd.feegrantKeeper.UseGrantedFees(ctx, feeGranter, feePayer, fees, sdkTx.GetMsgs()) if err != nil { - return errorsmod.Wrapf(err, "%s does not not allow to pay fees for %s", feeGranter, feePayer) + return errorsmod.Wrapf(err, "%s does not allow to pay fees for %s", feeGranter, feePayer) } } diff --git a/app/ante/cosmos/fees_test.go b/app/ante/cosmos/fees_test.go index f157d20b4a..b4086eddd0 100644 --- a/app/ante/cosmos/fees_test.go +++ b/app/ante/cosmos/fees_test.go @@ -213,7 +213,7 @@ func (suite *AnteTestSuite) TestDeductFeeDecorator() { checkTx: true, simulate: false, expPass: false, - errContains: fmt.Sprintf("%s does not not allow to pay fees for %s", fgAddr, addr), + errContains: fmt.Sprintf("%s does not allow to pay fees for %s", fgAddr, addr), }, { name: "success - with authorized fee granter", From a69fba95bc93720455fb0c68a4d0d3fea0824dd0 Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Mon, 8 Apr 2024 09:19:32 +0200 Subject: [PATCH 186/345] imp(make): Add protolint to make proto-lint command (#2444) * add protolint to make proto-lint command * add changelog entry --------- Co-authored-by: Vladislav Varadinov --- CHANGELOG.md | 1 + Makefile | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 095e2123f0..d5c88e2dfa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -82,6 +82,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (all) [#2388](https://github.com/evmos/evmos/pull/2388) Remove legacy handler files from repository. - (tests) [#2421](https://github.com/evmos/evmos/pull/2421) Remove configuration for deprecated modules from local node script. - (ante) [#2427](https://github.com/evmos/evmos/pull/2427) Minor improvements to EVM mono ante handler readability. +- (make) [#2444](https://github.com/evmos/evmos/pull/2444) Run `protolint` Docker image during `make proto-lint` target. ## [v16.0.2](https://github.com/evmos/evmos/releases/tag/v16.0.2) - 2024-01-16 diff --git a/Makefile b/Makefile index 0b8e50f4f4..609427f649 100644 --- a/Makefile +++ b/Makefile @@ -421,6 +421,10 @@ protoVer=0.11.6 protoImageName=ghcr.io/cosmos/proto-builder:$(protoVer) protoImage=$(DOCKER) run --rm -v $(CURDIR):/workspace --workdir /workspace --user 0 $(protoImageName) +protoLintVer=0.44.0 +protoLinterImage=yoheimuta/protolint +protoLinter=$(DOCKER) run --rm -v "$(CURDIR):/workspace" --workdir /workspace --user 0 $(protoLinterImage):$(protoLintVer) + # ------ # NOTE: If you are experiencing problems running these commands, try deleting # the docker images and execute the desired command again. @@ -444,6 +448,7 @@ proto-format: proto-lint: @echo "Linting Protobuf files" @$(protoImage) buf lint --error-format=json + @$(protoLinter) lint ./proto proto-check-breaking: @echo "Checking Protobuf files for breaking changes" From 470d3253a5efa4579effe71868625aada6448ad0 Mon Sep 17 00:00:00 2001 From: stepit <48993133+0xstepit@users.noreply.github.com> Date: Mon, 8 Apr 2024 14:55:39 +0200 Subject: [PATCH 187/345] chore: update security polity (#2472) * update SECURITY.md file * add changelog entry * fix typos * markdown lint * lint * lint * Update CHANGELOG.md Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --------- Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- CHANGELOG.md | 1 + SECURITY.md | 119 ++++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 99 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d5c88e2dfa..a398029c09 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -83,6 +83,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (tests) [#2421](https://github.com/evmos/evmos/pull/2421) Remove configuration for deprecated modules from local node script. - (ante) [#2427](https://github.com/evmos/evmos/pull/2427) Minor improvements to EVM mono ante handler readability. - (make) [#2444](https://github.com/evmos/evmos/pull/2444) Run `protolint` Docker image during `make proto-lint` target. +- (docs) [#2472](https://github.com/evmos/evmos/pull/2472) Update security policy. ## [v16.0.2](https://github.com/evmos/evmos/releases/tag/v16.0.2) - 2024-01-16 diff --git a/SECURITY.md b/SECURITY.md index 34ee569041..960d08eff4 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,24 +1,19 @@ # Security -As part of our vulnerability disclosure policy, -we operate a security vulnerability program through [Immunefi](https://immunefi.com/). -This document serves as a complementary guideline for reporting vulnerabilities -and how the disclosure process is managed. -Please refer to the official Evmos [bug bounty program](https://immunefi.com/bounty/evmos/) -for up-to-date information. +As part of our vulnerability disclosure policy. This document serves as a complementary guideline +for reporting vulnerabilities and how the disclosure process is managed. ## Guidelines -We require that all researchers: +We require that all whitehat hackers and researchers: -- Use the Evmos [bug bounty program](https://immunefi.com/bounty/evmos/) on Immunefi to disclose all vulnerabilities, - and avoid posting vulnerability information in public places, - including GitHub, Discord, Telegram, Twitter or other non-private channels. +- Use the Evmos security email ([security@evmos.org](mailto:security@evmos.org)) to disclose all vulnerabilities, +and avoid posting vulnerability information in public places, including GitHub, Discord, Telegram, X (Twitter) or +other non-private channels. - Make every effort to avoid privacy violations, degradation of user experience, disruption to production systems, - and destruction of data. -- Keep any information about vulnerabilities that you’ve discovered - confidential between yourself and the engineering team - until the issue has been resolved and disclosed +and destruction of data. +- Keep any information about vulnerabilities that you’ve discovered confidential between yourself and the engineering +team until the issue has been resolved and disclosed - Avoid posting personally identifiable information, privately or publicly If you follow these guidelines when reporting an issue to us, we commit to: @@ -30,10 +25,8 @@ If you follow these guidelines when reporting an issue to us, we commit to: Evmos uses the following disclosure process: -1. Once a security report is received via the Immunefi Bug Bounty program, -the team works to verify the issue and confirm its severity level using [CVSS](https://nvd.nist.gov/vuln-metrics/cvss) -or [Immunefi’s Vulnerability Severity Classification System v2.2](https://immunefi.com/immunefi-vulnerability-severity-classification-system-v2-2/). - +1. Once a security report is received via the security email, the team works to verify the issue and confirm its +severity level using [CVSS](https://nvd.nist.gov/vuln-metrics/cvss) in its latest version (v4 at the time of writing). 1. Two people from the affected project will review, replicate and acknowledge the report within 48-96 hours of the alert according to the table below: @@ -45,8 +38,8 @@ or [Immunefi’s Vulnerability Severity Classification System v2.2](https://immu | Low or Informational | 96 | | None | 96 | - 2. If the report is not applicable or reproducible, - the Security Lead (or Security Secondary) will revert to the reporter to request more info or close the report. + 2. If the report is not applicable or the vulnerability is not able to be reproduced, + the Security Lead will revert to the reporter to request more info or close the report. 3. The report is confirmed by the Security Lead to the reporter. 2. The team determines the vulnerability’s potential impact on Evmos. @@ -90,7 +83,91 @@ as secure as possible. ### Payment Process -The payment process will be executed according to Evmos’s Immunefi Bug Bounty program Rules. +The payment process will be executed according to Evmos SAFU for `Critical` and `High` severity vulnerabilities. +Payouts can only be executed in accordance and under supervision of the Evmos Operations team and only once the +following requirements have been completed: + +- The whitehat hacker or organization successfully completes the KYC/KYB process (i.e KYC/KYB accepted). +- The vulnerability is patched in production (eg. mainnet). + +#### KYC/KYB Process + +The Operations team will get in contact with the whitehat hacker to coordinate the submission of KYC/KYC with +the Service Provider [Provenance](http://provenancecompliance.com). + +The KYC/KYB process is performed independently by the Service Provider, which submits a report with the +KYC/KYB result +(Accepted or Rejected) to the Evmos Core Team. The Evmos Core team does not have access to any of the information +provided to the Service Provider. + +The following information is to be submitted to the independent Service Provider: + +- **Email** +- **Physical Address** +- **Proof of Address**: Utility bill (with exception of mobile phone invoice) or bank statement with no +more than 3 months old from the current date. +- **Passport** (National Identification) + Selfie photo. +- **Receiving Address**: The on-chain address account that will receive the Payouts. + +#### Supported Releases + +The team commits to releasing security patch releases for the latest release that Evmos is running. + +If evmOS licensees are running older versions, we encourage them to upgrade at the earliest opportunity +so that you can receive +security patches directly from the repo, according to the terms set in the License Agreement. While project +are welcomed to backport security patches to older versions for their own use, the Evmos team reserves +the right to prioritize patches for +latest versions being used by projects. + +#### Scope of Vulnerabilities + +We’re interested in a full range of bugs with demonstrable security risk: from those that can be proven +with a simple unit test, +to those that require a full cluster and a complex sequence of transactions. + +Please note that, in the interest of the safety of our users and staff, a few things are explicitly +excluded from scope: + +- Any third-party services. +- Findings derived from social engineering (e.g., phishing). + +Examples of vulnerabilities that are of interest to us include memory allocation bugs, race conditions, +timing attacks,information leaks, authentication bypasses, denial of service +(specifically at the application- or protocol-layer), +lost-write bugs, unauthorized account or capability access, stolen or loss of funds, token inflation bugs, +payloads/transactions that cause panics, non deterministic logic, etc. + +##### JSON-RPC + +- Write-access to anything besides sending transactions +- Bypassing transactions authentication +- Denial-of-Service +- Leakage of secrets + +##### Denial-of-Service + +Attacks may come through the P2P network or the RPC layer: + +- Amplification attacks +- Resource abuse +- Deadlocks and race conditions + +##### Precompiles + +- Override of state due to misuse of `DELEGATECALL`, `STATICCALL`, `CALLCODE` +- Unauthorized transactions via precompiles (eg. ERC-20 token approvals) + +##### EVM Module + +- Memory allocation bugs +- Payloads that cause panics +- Authorization of invalid transactions + +##### Fee Market Module (EIP-1559) + +- Memory allocation bugs +- Improper / unpenalized manipulation of the BaseFee value ### Contact From 2b4da3f28d0a889a3a0fa7ba08d9b94eef7454a0 Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Mon, 8 Apr 2024 10:24:52 -0300 Subject: [PATCH 188/345] chore(deps): update docker dep (#2474) --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 17d8fc7ef9..436804de75 100644 --- a/Dockerfile +++ b/Dockerfile @@ -41,7 +41,7 @@ COPY --from=build-env /target/usr/lib /usr/lib COPY --from=build-env /target/usr/local/lib /usr/local/lib COPY --from=build-env /target/usr/include /usr/include -RUN apk add --no-cache ca-certificates=20240226-r0 jq=1.7.1-r0 curl=8.5.0-r0 bash=5.2.21-r0 vim=9.0.2127-r0 lz4=1.9.4-r5 rclone=1.65.0-r1 \ +RUN apk add --no-cache ca-certificates=20240226-r0 jq=1.7.1-r0 curl=8.5.0-r0 bash=5.2.21-r0 vim=9.0.2127-r0 lz4=1.9.4-r5 rclone=1.65.0-r2 \ && addgroup -g 1000 evmos \ && adduser -S -h /home/evmos -D evmos -u 1000 -G evmos From 0fbc7993ecc80250c2b191414ea252d6f0c3ecb0 Mon Sep 17 00:00:00 2001 From: Freddy Caceres Date: Mon, 8 Apr 2024 10:21:16 -0400 Subject: [PATCH 189/345] fix(evm): Improve commit efficiency on EVM & bump IBC version to `v7.4.0`. (#2475) * Merge pull request from GHSA-3fp5-2xwh-fxm6 * imp(evm): Improve statedb commit efficiency * gomod2nix generate --------- Co-authored-by: tom * update changelog (#2470) * update changelog * Update CHANGELOG.md * gomod2nix generate * go mod tidy * go mod tidy * udpate changelog * add integration tests * run make format * address linters --------- Co-authored-by: tom Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Co-authored-by: MalteHerrmann Co-authored-by: MalteHerrmann --- CHANGELOG.md | 21 +- contracts/FlashLoan.sol | 54 ++++ contracts/compiled_contracts/FlashLoan.json | 5 + contracts/flash_loan.go | 30 ++ precompiles/bank/bank.go | 6 +- precompiles/distribution/distribution.go | 4 + precompiles/ics20/ics20.go | 4 + precompiles/outposts/osmosis/osmosis.go | 4 + precompiles/outposts/stride/stride.go | 4 + testutil/integration/common/grpc/grpc.go | 1 + testutil/integration/common/grpc/staking.go | 8 + x/evm/statedb/integration_test.go | 288 ++++++++++++++++++++ x/evm/statedb/state_object.go | 15 +- x/evm/statedb/statedb.go | 15 +- 14 files changed, 448 insertions(+), 11 deletions(-) create mode 100644 contracts/FlashLoan.sol create mode 100644 contracts/compiled_contracts/FlashLoan.json create mode 100644 contracts/flash_loan.go create mode 100644 x/evm/statedb/integration_test.go diff --git a/CHANGELOG.md b/CHANGELOG.md index a398029c09..e4b8b781aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -85,12 +85,29 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (make) [#2444](https://github.com/evmos/evmos/pull/2444) Run `protolint` Docker image during `make proto-lint` target. - (docs) [#2472](https://github.com/evmos/evmos/pull/2472) Update security policy. -## [v16.0.2](https://github.com/evmos/evmos/releases/tag/v16.0.2) - 2024-01-16 +## [v17.0.0] - 2024-04-08 + +### State Machine Breaking + +- (evm) [#2475](https://github.com/evmos/evmos/pull/2475) Improve commit efficiency on EVM & bump IBC version to `v7.4.0`. + +## [v16.0.4] - 2024-04-05 + +### Improvements + +- (all) [#2460](https://github.com/evmos/evmos/pull/2460) Schedule v17 upgrade. + +## [v16.0.3] - 2024-02-02 + +## Bug Fixes + +- (evm) [#2302](https://github.com/evmos/evmos/pull/2302) Fix TraceTx KVGasConfig setup + +## [v16.0.2] - 2024-01-16 ### Bug Fixes - (inflation) [#2269](https://github.com/evmos/evmos/pull/2269) Fix inflation info returned by epoch mint provision getter. -- (evm) [#2302](https://github.com/evmos/evmos/pull/2302) Fix TraceTx KVGasConfig setup. ## [v16.0.1](https://github.com/evmos/evmos/releases/tag/v16.0.1) - 2024-01-11 diff --git a/contracts/FlashLoan.sol b/contracts/FlashLoan.sol new file mode 100644 index 0000000000..60061c91bf --- /dev/null +++ b/contracts/FlashLoan.sol @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity ^0.8.17; + +import "../precompiles/staking/StakingI.sol" as staking; +import "./@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +contract FlashLoan { + address public owner; + + constructor() { + owner = msg.sender; + } + + function flashLoan( + address _token, + string memory _validator, + uint256 _amount + ) public returns (bool) { + require(msg.sender == owner, "Only owner can call this function"); + + // Get some tokens to initiate the flash loan + IERC20 token = IERC20(_token); + require( + token.allowance(msg.sender, address(this)) >= _amount, + "Insufficient allowance" + ); + + uint256 balancePre = token.balanceOf(address(this)); + bool success = token.transferFrom(msg.sender, address(this), _amount); + require(success, "Failed to transfer tokens for flash loan"); + require( + token.balanceOf(address(this)) == balancePre + _amount, + "Flash loan failed" + ); + + // Execute some precompile logic (e.g. staking) + success = staking.STAKING_CONTRACT.delegate( + msg.sender, + _validator, + _amount + ); + require(success, "failed to delegate"); + + // Transfer tokens back to end the flash loan + balancePre = token.balanceOf(address(this)); + token.transfer(msg.sender, _amount); + require( + token.balanceOf(address(this)) == balancePre - _amount, + "Flash loan repayment failed" + ); + + return true; + } +} diff --git a/contracts/compiled_contracts/FlashLoan.json b/contracts/compiled_contracts/FlashLoan.json new file mode 100644 index 0000000000..1d7068abb7 --- /dev/null +++ b/contracts/compiled_contracts/FlashLoan.json @@ -0,0 +1,5 @@ +{ + "abi": "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_validator\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"flashLoan\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + "bin": "608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610eea806100606000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80638da5cb5b1461003b578063ee52ad7114610059575b600080fd5b610043610089565b60405161005091906106dd565b60405180910390f35b610073600480360381019061006e91906108b4565b6100ad565b604051610080919061093e565b60405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461013e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610135906109dc565b60405180910390fd5b6000849050828173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b815260040161017f9291906109fc565b602060405180830381865afa15801561019c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101c09190610a3a565b1015610201576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f890610ab3565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161023c91906106dd565b602060405180830381865afa158015610259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027d9190610a3a565b905060008273ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b81526004016102be93929190610ae2565b6020604051808303816000875af11580156102dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103019190610b45565b905080610343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033a90610be4565b60405180910390fd5b848261034f9190610c33565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161038891906106dd565b602060405180830381865afa1580156103a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c99190610a3a565b14610409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040090610cb3565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3388886040518463ffffffff1660e01b815260040161044893929190610d41565b6020604051808303816000875af1158015610467573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048b9190610b45565b9050806104cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104c490610dcb565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161050691906106dd565b602060405180830381865afa158015610523573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105479190610a3a565b91508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33876040518363ffffffff1660e01b8152600401610584929190610deb565b6020604051808303816000875af11580156105a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c79190610b45565b5084826105d49190610e14565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161060d91906106dd565b602060405180830381865afa15801561062a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064e9190610a3a565b1461068e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068590610e94565b60405180910390fd5b600193505050509392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106c78261069c565b9050919050565b6106d7816106bc565b82525050565b60006020820190506106f260008301846106ce565b92915050565b6000604051905090565b600080fd5b600080fd5b610715816106bc565b811461072057600080fd5b50565b6000813590506107328161070c565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61078b82610742565b810181811067ffffffffffffffff821117156107aa576107a9610753565b5b80604052505050565b60006107bd6106f8565b90506107c98282610782565b919050565b600067ffffffffffffffff8211156107e9576107e8610753565b5b6107f282610742565b9050602081019050919050565b82818337600083830152505050565b600061082161081c846107ce565b6107b3565b90508281526020810184848401111561083d5761083c61073d565b5b6108488482856107ff565b509392505050565b600082601f83011261086557610864610738565b5b813561087584826020860161080e565b91505092915050565b6000819050919050565b6108918161087e565b811461089c57600080fd5b50565b6000813590506108ae81610888565b92915050565b6000806000606084860312156108cd576108cc610702565b5b60006108db86828701610723565b935050602084013567ffffffffffffffff8111156108fc576108fb610707565b5b61090886828701610850565b92505060406109198682870161089f565b9150509250925092565b60008115159050919050565b61093881610923565b82525050565b6000602082019050610953600083018461092f565b92915050565b600082825260208201905092915050565b7f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b60006109c6602183610959565b91506109d18261096a565b604082019050919050565b600060208201905081810360008301526109f5816109b9565b9050919050565b6000604082019050610a1160008301856106ce565b610a1e60208301846106ce565b9392505050565b600081519050610a3481610888565b92915050565b600060208284031215610a5057610a4f610702565b5b6000610a5e84828501610a25565b91505092915050565b7f496e73756666696369656e7420616c6c6f77616e636500000000000000000000600082015250565b6000610a9d601683610959565b9150610aa882610a67565b602082019050919050565b60006020820190508181036000830152610acc81610a90565b9050919050565b610adc8161087e565b82525050565b6000606082019050610af760008301866106ce565b610b0460208301856106ce565b610b116040830184610ad3565b949350505050565b610b2281610923565b8114610b2d57600080fd5b50565b600081519050610b3f81610b19565b92915050565b600060208284031215610b5b57610b5a610702565b5b6000610b6984828501610b30565b91505092915050565b7f4661696c656420746f207472616e7366657220746f6b656e7320666f7220666c60008201527f617368206c6f616e000000000000000000000000000000000000000000000000602082015250565b6000610bce602883610959565b9150610bd982610b72565b604082019050919050565b60006020820190508181036000830152610bfd81610bc1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610c3e8261087e565b9150610c498361087e565b9250828201905080821115610c6157610c60610c04565b5b92915050565b7f466c617368206c6f616e206661696c6564000000000000000000000000000000600082015250565b6000610c9d601183610959565b9150610ca882610c67565b602082019050919050565b60006020820190508181036000830152610ccc81610c90565b9050919050565b600081519050919050565b60005b83811015610cfc578082015181840152602081019050610ce1565b60008484015250505050565b6000610d1382610cd3565b610d1d8185610959565b9350610d2d818560208601610cde565b610d3681610742565b840191505092915050565b6000606082019050610d5660008301866106ce565b8181036020830152610d688185610d08565b9050610d776040830184610ad3565b949350505050565b7f6661696c656420746f2064656c65676174650000000000000000000000000000600082015250565b6000610db5601283610959565b9150610dc082610d7f565b602082019050919050565b60006020820190508181036000830152610de481610da8565b9050919050565b6000604082019050610e0060008301856106ce565b610e0d6020830184610ad3565b9392505050565b6000610e1f8261087e565b9150610e2a8361087e565b9250828203905081811115610e4257610e41610c04565b5b92915050565b7f466c617368206c6f616e2072657061796d656e74206661696c65640000000000600082015250565b6000610e7e601b83610959565b9150610e8982610e48565b602082019050919050565b60006020820190508181036000830152610ead81610e71565b905091905056fea26469706673582212203f15a3a5dfb30d87e89521478e06d8ab916218abccea886e4f688418fc0f725064736f6c63430008130033", + "contractName": "FlashLoan" +} diff --git a/contracts/flash_loan.go b/contracts/flash_loan.go new file mode 100644 index 0000000000..d0d5daec64 --- /dev/null +++ b/contracts/flash_loan.go @@ -0,0 +1,30 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package contracts + +import ( + _ "embed" // embed compiled smart contract + "encoding/json" + + evmtypes "github.com/evmos/evmos/v16/x/evm/types" +) + +var ( + //go:embed compiled_contracts/FlashLoan.json + FlashLoanJSON []byte //nolint:golint // used to embed the compiled contract + + // FlashLoanContract is the compiled flash loan contract + FlashLoanContract evmtypes.CompiledContract +) + +func init() { + err := json.Unmarshal(FlashLoanJSON, &FlashLoanContract) + if err != nil { + panic(err) + } + + if len(FlashLoanContract.Bin) == 0 { + panic("load contract failed") + } +} diff --git a/precompiles/bank/bank.go b/precompiles/bank/bank.go index 9d2409c331..cda0ecb72b 100644 --- a/precompiles/bank/bank.go +++ b/precompiles/bank/bank.go @@ -99,7 +99,7 @@ func (p Precompile) RequiredGas(input []byte) uint64 { // Run executes the precompiled contract bank query methods defined in the ABI. func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, readOnly bool) (bz []byte, err error) { - ctx, _, method, initialGas, args, err := p.RunSetup(evm, contract, readOnly, p.IsTransaction) + ctx, stateDB, method, initialGas, args, err := p.RunSetup(evm, contract, readOnly, p.IsTransaction) if err != nil { return nil, err } @@ -108,6 +108,10 @@ func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, readOnly bool) (bz [ // It avoids panics and returns the out of gas error so the EVM can continue gracefully. defer cmn.HandleGasError(ctx, contract, initialGas, &err)() + if err := stateDB.Commit(); err != nil { + return nil, err + } + switch method.Name { // Bank queries case BalancesMethod: diff --git a/precompiles/distribution/distribution.go b/precompiles/distribution/distribution.go index 41f70f73cf..baa3c83612 100644 --- a/precompiles/distribution/distribution.go +++ b/precompiles/distribution/distribution.go @@ -93,6 +93,10 @@ func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, readOnly bool) (bz [ // It avoids panics and returns the out of gas error so the EVM can continue gracefully. defer cmn.HandleGasError(ctx, contract, initialGas, &err)() + if err := stateDB.Commit(); err != nil { + return nil, err + } + switch method.Name { // Custom transactions case ClaimRewardsMethod: diff --git a/precompiles/ics20/ics20.go b/precompiles/ics20/ics20.go index c94cb20be2..f75db59a03 100644 --- a/precompiles/ics20/ics20.go +++ b/precompiles/ics20/ics20.go @@ -92,6 +92,10 @@ func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, readOnly bool) (bz [ // It avoids panics and returns the out of gas error so the EVM can continue gracefully. defer cmn.HandleGasError(ctx, contract, initialGas, &err)() + if err := stateDB.Commit(); err != nil { + return nil, err + } + switch method.Name { // TODO Approval transactions => need cosmos-sdk v0.46 & ibc-go v6.2.0 // Authorization Methods: diff --git a/precompiles/outposts/osmosis/osmosis.go b/precompiles/outposts/osmosis/osmosis.go index c12e7526de..07cc2a0102 100644 --- a/precompiles/outposts/osmosis/osmosis.go +++ b/precompiles/outposts/osmosis/osmosis.go @@ -132,6 +132,10 @@ func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, readOnly bool) (bz [ // It avoids panics and returns the out of gas error so the EVM can continue gracefully. defer cmn.HandleGasError(ctx, contract, initialGas, &err)() + if err := stateDB.Commit(); err != nil { + return nil, err + } + switch method.Name { case SwapMethod: bz, err = p.Swap(ctx, evm.Origin, stateDB, contract, method, args) diff --git a/precompiles/outposts/stride/stride.go b/precompiles/outposts/stride/stride.go index 90e76383ca..50c97d9b45 100644 --- a/precompiles/outposts/stride/stride.go +++ b/precompiles/outposts/stride/stride.go @@ -103,6 +103,10 @@ func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, readOnly bool) (bz [ // It avoids panics and returns the out of gas error so the EVM can continue gracefully. defer cmn.HandleGasError(ctx, contract, initialGas, &err)() + if err := stateDB.Commit(); err != nil { + return nil, err + } + switch method.Name { // Stride Outpost Methods: case LiquidStakeMethod: diff --git a/testutil/integration/common/grpc/grpc.go b/testutil/integration/common/grpc/grpc.go index 6e8ea9e485..6121597ef5 100644 --- a/testutil/integration/common/grpc/grpc.go +++ b/testutil/integration/common/grpc/grpc.go @@ -32,6 +32,7 @@ type Handler interface { // Staking methods GetDelegation(delegatorAddress string, validatorAddress string) (*stakingtypes.QueryDelegationResponse, error) + GetBondedValidators() (*stakingtypes.QueryValidatorsResponse, error) } var _ Handler = (*IntegrationHandler)(nil) diff --git a/testutil/integration/common/grpc/staking.go b/testutil/integration/common/grpc/staking.go index febeb92704..003e22bdf2 100644 --- a/testutil/integration/common/grpc/staking.go +++ b/testutil/integration/common/grpc/staking.go @@ -16,3 +16,11 @@ func (gqh *IntegrationHandler) GetDelegation(delegatorAddress string, validatorA ValidatorAddr: validatorAddress, }) } + +// GetValidators returns the list of all bonded validators. +func (gqh *IntegrationHandler) GetBondedValidators() (*stakingtypes.QueryValidatorsResponse, error) { + stakingClient := gqh.network.GetStakingClient() + return stakingClient.Validators(context.Background(), &stakingtypes.QueryValidatorsRequest{ + Status: stakingtypes.BondStatusBonded, + }) +} diff --git a/x/evm/statedb/integration_test.go b/x/evm/statedb/integration_test.go new file mode 100644 index 0000000000..c9c74efe6c --- /dev/null +++ b/x/evm/statedb/integration_test.go @@ -0,0 +1,288 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package statedb_test + +import ( + "math/big" + "testing" + + "cosmossdk.io/math" + "github.com/ethereum/go-ethereum/common" + "github.com/evmos/evmos/v16/contracts" + stakingprecompile "github.com/evmos/evmos/v16/precompiles/staking" + testfactory "github.com/evmos/evmos/v16/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v16/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" + testnetwork "github.com/evmos/evmos/v16/testutil/integration/evmos/network" + evmtypes "github.com/evmos/evmos/v16/x/evm/types" + + //nolint:revive // okay to use dot imports for Ginkgo + . "github.com/onsi/ginkgo/v2" + //nolint:revive // okay to use dot imports for Ginkgo + . "github.com/onsi/gomega" +) + +func TestNestedEVMExtensionCall(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Nested EVM Extension Call Test Suite") +} + +// NOTE: This must ONLY be added to the main repository once the vulnerability has been patched! +// +// This test is a demonstration of the flash loan exploit that was reported. +// This happens when interacting with EVM extensions in smart contract methods, +// where a resulting state change has the same value as the original state value. +// +// Before the fix, this would result in state changes not being persisted after the EVM extension call, +// therefore leaving the loaned funds in the contract. +var _ = Describe("testing the flash loan exploit", Ordered, func() { + var ( + keyring testkeyring.Keyring + // NOTE: we need to use the unit test network here because we need it to instantiate the staking precompile correctly + network *testnetwork.UnitTestNetwork + handler grpc.Handler + factory testfactory.TxFactory + + deployer testkeyring.Key + + erc20Addr common.Address + flashLoanAddr common.Address + + validatorToDelegateTo string + + delegatedAmountPre math.Int + + stakingPrecompile *stakingprecompile.Precompile + ) + + mintAmount := big.NewInt(2e18) + delegateAmount := big.NewInt(1e18) + + BeforeAll(func() { + keyring = testkeyring.New(2) + network = testnetwork.NewUnitTestNetwork( + testnetwork.WithPreFundedAccounts(keyring.GetAllAccAddrs()...), + ) + handler = grpc.NewIntegrationHandler(network) + factory = testfactory.New(network, handler) + + deployer = keyring.GetKey(0) + + var err error + stakingPrecompile, err = stakingprecompile.NewPrecompile(network.App.StakingKeeper, network.App.AuthzKeeper) + Expect(err).ToNot(HaveOccurred(), "failed to create staking precompile") + + valsRes, err := handler.GetBondedValidators() + Expect(err).ToNot(HaveOccurred(), "failed to get bonded validators") + + validatorToDelegateTo = valsRes.Validators[0].OperatorAddress + res, err := handler.GetDelegation(deployer.AccAddr.String(), validatorToDelegateTo) + Expect(err).ToNot(HaveOccurred(), "failed to get delegation") + delegatedAmountPre = res.DelegationResponse.Balance.Amount + }) + + It("should deploy an ERC-20 token contract", func() { + var err error + erc20Addr, err = factory.DeployContract( + deployer.Priv, + evmtypes.EvmTxArgs{}, + testfactory.ContractDeploymentData{ + Contract: contracts.ERC20MinterBurnerDecimalsContract, + ConstructorArgs: []interface{}{"TestToken", "TT", uint8(18)}, + }, + ) + Expect(err).ToNot(HaveOccurred(), "failed to deploy ERC-20 contract") + }) + + It("should mint some tokens", func() { + // Mint some tokens to the deployer + _, err := factory.ExecuteContractCall( + deployer.Priv, + evmtypes.EvmTxArgs{To: &erc20Addr}, + testfactory.CallArgs{ + ContractABI: contracts.ERC20MinterBurnerDecimalsContract.ABI, + MethodName: "mint", + Args: []interface{}{ + deployer.Addr, mintAmount, + }, + }, + ) + Expect(err).ToNot(HaveOccurred(), "failed to mint tokens") + + // Check the balance of the deployer + res, err := factory.ExecuteContractCall( + deployer.Priv, + evmtypes.EvmTxArgs{To: &erc20Addr}, + testfactory.CallArgs{ + ContractABI: contracts.ERC20MinterBurnerDecimalsContract.ABI, + MethodName: "balanceOf", + Args: []interface{}{ + deployer.Addr, + }, + }, + ) + Expect(err).ToNot(HaveOccurred(), "failed to get balance") + + ethRes, err := evmtypes.DecodeTxResponse(res.Data) + Expect(err).ToNot(HaveOccurred(), "failed to decode tx response") + + unpacked, err := contracts.ERC20MinterBurnerDecimalsContract.ABI.Unpack( + "balanceOf", + ethRes.Ret, + ) + Expect(err).ToNot(HaveOccurred(), "failed to unpack balance") + + balance, ok := unpacked[0].(*big.Int) + Expect(ok).To(BeTrue(), "failed to convert balance to big.Int") + Expect(balance.String()).To(Equal(mintAmount.String()), "balance is not correct") + }) + + It("should deploy the flash loan contract", func() { + var err error + flashLoanAddr, err = factory.DeployContract( + deployer.Priv, + evmtypes.EvmTxArgs{}, + testfactory.ContractDeploymentData{ + Contract: contracts.FlashLoanContract, + }, + ) + Expect(err).ToNot(HaveOccurred(), "failed to deploy flash loan contract") + }) + + It("should approve the flash loan contract to spend tokens", func() { + _, err := factory.ExecuteContractCall( + deployer.Priv, + evmtypes.EvmTxArgs{To: &erc20Addr}, + testfactory.CallArgs{ + ContractABI: contracts.ERC20MinterBurnerDecimalsContract.ABI, + MethodName: "approve", + Args: []interface{}{ + flashLoanAddr, mintAmount, + }, + }, + ) + Expect(err).ToNot(HaveOccurred(), "failed to approve flash loan contract") + + // Check the allowance + res, err := factory.ExecuteContractCall( + deployer.Priv, + evmtypes.EvmTxArgs{To: &erc20Addr}, + testfactory.CallArgs{ + ContractABI: contracts.ERC20MinterBurnerDecimalsContract.ABI, + MethodName: "allowance", + Args: []interface{}{ + deployer.Addr, flashLoanAddr, + }, + }, + ) + Expect(err).ToNot(HaveOccurred(), "failed to get allowance") + + ethRes, err := evmtypes.DecodeTxResponse(res.Data) + Expect(err).ToNot(HaveOccurred(), "failed to decode tx response") + + unpacked, err := contracts.ERC20MinterBurnerDecimalsContract.ABI.Unpack( + "allowance", + ethRes.Ret, + ) + Expect(err).ToNot(HaveOccurred(), "failed to unpack allowance") + + allowance, ok := unpacked[0].(*big.Int) + Expect(ok).To(BeTrue(), "failed to convert allowance to big.Int") + Expect(allowance.String()).To(Equal(mintAmount.String()), "allowance is not correct") + }) + + It("should approve the flash loan contract to delegate tokens on behalf of user", func() { + precompileAddr := stakingPrecompile.Address() + + _, err := factory.ExecuteContractCall( + deployer.Priv, + evmtypes.EvmTxArgs{To: &precompileAddr}, + testfactory.CallArgs{ + ContractABI: stakingPrecompile.ABI, + MethodName: "approve", + Args: []interface{}{ + flashLoanAddr, delegateAmount, []string{stakingprecompile.DelegateMsg}, + }, + }, + ) + Expect(err).ToNot(HaveOccurred(), "failed to approve flash loan contract") + + // Check the allowance + res, err := factory.ExecuteContractCall( + deployer.Priv, + evmtypes.EvmTxArgs{To: &precompileAddr}, + testfactory.CallArgs{ + ContractABI: stakingPrecompile.ABI, + MethodName: "allowance", + Args: []interface{}{ + deployer.Addr, flashLoanAddr, stakingprecompile.DelegateMsg, + }, + }, + ) + Expect(err).ToNot(HaveOccurred(), "failed to get allowance") + + ethRes, err := evmtypes.DecodeTxResponse(res.Data) + Expect(err).ToNot(HaveOccurred(), "failed to decode tx response") + + var allowance *big.Int + err = stakingPrecompile.ABI.UnpackIntoInterface(&allowance, "allowance", ethRes.Ret) + Expect(err).ToNot(HaveOccurred(), "failed to unpack allowance") + }) + + It("should execute the flash loan contract", func() { + // Execute the flash loan contract + _, err := factory.ExecuteContractCall( + deployer.Priv, + evmtypes.EvmTxArgs{To: &flashLoanAddr}, + testfactory.CallArgs{ + ContractABI: contracts.FlashLoanContract.ABI, + MethodName: "flashLoan", + Args: []interface{}{ + erc20Addr, + validatorToDelegateTo, + delegateAmount, + }, + }, + ) + Expect(err).ToNot(HaveOccurred(), "failed to execute flash loan") + }) + + It("should show the delegation", func() { + delRes, err := handler.GetDelegation(deployer.AccAddr.String(), validatorToDelegateTo) + Expect(err).ToNot(HaveOccurred(), "failed to get delegation") + Expect(delRes.DelegationResponse.Balance.Amount.String()).To(Equal( + delegatedAmountPre.Add(math.NewIntFromBigInt(delegateAmount)).String()), + "delegated amount is not correct", + ) + }) + + It("should have returned the funds from the flash loan", func() { + // Check the balance of the deployer + res, err := factory.ExecuteContractCall( + deployer.Priv, + evmtypes.EvmTxArgs{To: &erc20Addr}, + testfactory.CallArgs{ + ContractABI: contracts.ERC20MinterBurnerDecimalsContract.ABI, + MethodName: "balanceOf", + Args: []interface{}{ + deployer.Addr, + }, + }, + ) + Expect(err).ToNot(HaveOccurred(), "failed to get balance") + + ethRes, err := evmtypes.DecodeTxResponse(res.Data) + Expect(err).ToNot(HaveOccurred(), "failed to decode tx response") + + unpacked, err := contracts.ERC20MinterBurnerDecimalsContract.ABI.Unpack( + "balanceOf", + ethRes.Ret, + ) + Expect(err).ToNot(HaveOccurred(), "failed to unpack balance") + + balance, ok := unpacked[0].(*big.Int) + Expect(ok).To(BeTrue(), "failed to convert balance to big.Int") + Expect(balance.String()).To(Equal(mintAmount.String()), "balance is not correct") + }) +}) diff --git a/x/evm/statedb/state_object.go b/x/evm/statedb/state_object.go index 255525d058..0657385446 100644 --- a/x/evm/statedb/state_object.go +++ b/x/evm/statedb/state_object.go @@ -60,6 +60,10 @@ type stateObject struct { originStorage Storage dirtyStorage Storage + // transientStorage is an in memory storage of the latest committed entries in the current transaction execution. + // It is only used when multiple commits are made within the same transaction execution. + transientStorage Storage + address common.Address // flags @@ -76,11 +80,12 @@ func newObject(db *StateDB, address common.Address, account Account) *stateObjec account.CodeHash = emptyCodeHash } return &stateObject{ - db: db, - address: address, - account: account, - originStorage: make(Storage), - dirtyStorage: make(Storage), + db: db, + address: address, + account: account, + originStorage: make(Storage), + dirtyStorage: make(Storage), + transientStorage: make(Storage), } } diff --git a/x/evm/statedb/statedb.go b/x/evm/statedb/statedb.go index 3001038eef..0e16614c64 100644 --- a/x/evm/statedb/statedb.go +++ b/x/evm/statedb/statedb.go @@ -457,12 +457,21 @@ func (s *StateDB) Commit() error { return errorsmod.Wrap(err, "failed to set account") } for _, key := range obj.dirtyStorage.SortedKeys() { - value := obj.dirtyStorage[key] + dirtyValue := obj.dirtyStorage[key] + originValue := obj.originStorage[key] // Skip noop changes, persist actual changes - if value == obj.originStorage[key] { + transientStorageValue, ok := obj.transientStorage[key] + if (ok && transientStorageValue == dirtyValue) || + (!ok && dirtyValue == originValue) { continue } - s.keeper.SetState(s.ctx, obj.Address(), key, value.Bytes()) + s.keeper.SetState(s.ctx, obj.Address(), key, dirtyValue.Bytes()) + + // Update the pendingStorage cache to the new value. + // This is specially needed for precompiles calls where + // multiple Commits calls are done within the same transaction + // for the appropriate changes to be committed. + obj.transientStorage[key] = dirtyValue } } } From c7f206c992fdc6f42054cd58566573e27e5814b8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Apr 2024 11:39:21 -0300 Subject: [PATCH 190/345] build(deps): bump github.com/cosmos/ibc-go/v7 from 7.3.2 to 7.4.0 (#2462) * build(deps): bump github.com/cosmos/ibc-go/v7 from 7.3.2 to 7.4.0 Bumps [github.com/cosmos/ibc-go/v7](https://github.com/cosmos/ibc-go) from 7.3.2 to 7.4.0. - [Release notes](https://github.com/cosmos/ibc-go/releases) - [Changelog](https://github.com/cosmos/ibc-go/blob/v7.4.0/CHANGELOG.md) - [Commits](https://github.com/cosmos/ibc-go/compare/v7.3.2...v7.4.0) --- updated-dependencies: - dependency-name: github.com/cosmos/ibc-go/v7 dependency-type: direct:production ... Signed-off-by: dependabot[bot] * update gomod2nix.toml file --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: GAtom22 Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index e680cac573..95c99e7666 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( github.com/cosmos/cosmos-sdk v0.47.8 github.com/cosmos/go-bip39 v1.0.0 github.com/cosmos/gogoproto v1.4.10 - github.com/cosmos/ibc-go/v7 v7.3.2 + github.com/cosmos/ibc-go/v7 v7.4.0 github.com/crypto-org-chain/cronos/memiavl v0.0.5-0.20240129013154-12efd9b7643f github.com/crypto-org-chain/cronos/store v0.0.5-0.20240129013154-12efd9b7643f github.com/crypto-org-chain/cronos/versiondb v0.0.0-20240129013154-12efd9b7643f diff --git a/go.sum b/go.sum index 3aed2f5595..01e807b85e 100644 --- a/go.sum +++ b/go.sum @@ -390,8 +390,8 @@ github.com/cosmos/gogoproto v1.4.10 h1:QH/yT8X+c0F4ZDacDv3z+xE3WU1P1Z3wQoLMBRJoK github.com/cosmos/gogoproto v1.4.10/go.mod h1:3aAZzeRWpAwr+SS/LLkICX2/kDFyaYVzckBDzygIxek= github.com/cosmos/iavl v0.21.0-alpha.1.0.20230904092046-df3db2d96583 h1:3Matt7/LjZiZkIBPalYazOZcw2B05Ch14dU5TJyqJEc= github.com/cosmos/iavl v0.21.0-alpha.1.0.20230904092046-df3db2d96583/go.mod h1:WO7FyvaZJoH65+HFOsDir7xU9FWk2w9cHXNW1XHcl7A= -github.com/cosmos/ibc-go/v7 v7.3.2 h1:FeUDcBX7VYY0e0iRmcVkPPUjYfAqIc//QuHXo8JHz9c= -github.com/cosmos/ibc-go/v7 v7.3.2/go.mod h1:IMeOXb7gwpZ+/nOG5BuUkdW4weM1ezvN4PQPws4uzOI= +github.com/cosmos/ibc-go/v7 v7.4.0 h1:8FqYMptvksgMvlbN4UW9jFxTXzsPyfAzEZurujXac8M= +github.com/cosmos/ibc-go/v7 v7.4.0/go.mod h1:L/KaEhzV5TGUCTfGysVgMBQtl5Dm7hHitfpk+GIeoAo= github.com/cosmos/ics23/go v0.10.0 h1:iXqLLgp2Lp+EdpIuwXTYIQU+AiHj9mOC2X9ab++bZDM= github.com/cosmos/ics23/go v0.10.0/go.mod h1:ZfJSmng/TBNTBkFemHHHj5YY7VAU/MBU980F4VU1NG0= github.com/cosmos/keyring v1.2.0 h1:8C1lBP9xhImmIabyXW4c3vFjjLiBdGCmfLUfeZlV1Yo= diff --git a/gomod2nix.toml b/gomod2nix.toml index 9ad67f6e74..6db854c016 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -169,8 +169,8 @@ schema = 3 version = "v0.21.0-alpha.1.0.20230904092046-df3db2d96583" hash = "sha256-3Va8Ljq63IXty0oHlRpqfsC6WsMut6TWZ2R+/nYtfTU=" [mod."github.com/cosmos/ibc-go/v7"] - version = "v7.3.2" - hash = "sha256-nzfVl2BNqrQCcKBBf5bq47EUuVCcEeg6cBEyfG/5XKM=" + version = "v7.4.0" + hash = "sha256-pvG3HQL7lVtcGOlxSQLGqDN00Ol7g3HSorOexEVD8xE=" [mod."github.com/cosmos/ics23/go"] version = "v0.10.0" hash = "sha256-KYEv727BO/ht63JO02xiKFGFAddg41Ve9l2vSSZZBq0=" From d1518261ea5a9ae8e9f8e9dc68cc0c4e137e6295 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Apr 2024 12:37:03 -0300 Subject: [PATCH 191/345] build(deps): bump golang.org/x/net from 0.23.0 to 0.24.0 (#2471) * build(deps): bump golang.org/x/net from 0.23.0 to 0.24.0 Bumps [golang.org/x/net](https://github.com/golang/net) from 0.23.0 to 0.24.0. - [Commits](https://github.com/golang/net/compare/v0.23.0...v0.24.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * gomod2nix generate --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: tom Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 95c99e7666..a23913429c 100644 --- a/go.mod +++ b/go.mod @@ -47,7 +47,7 @@ require ( go.opencensus.io v0.24.0 golang.org/x/crypto v0.22.0 golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb - golang.org/x/net v0.23.0 + golang.org/x/net v0.24.0 golang.org/x/text v0.14.0 google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 google.golang.org/grpc v1.62.1 diff --git a/go.sum b/go.sum index 01e807b85e..6bf4076a67 100644 --- a/go.sum +++ b/go.sum @@ -1354,8 +1354,8 @@ golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= diff --git a/gomod2nix.toml b/gomod2nix.toml index 6db854c016..bab0249f82 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -673,8 +673,8 @@ schema = 3 version = "v0.14.0" hash = "sha256-sx3hWp5l99DBfIrn821ohfoBwvaITSHMWbzPvX0btLM=" [mod."golang.org/x/net"] - version = "v0.23.0" - hash = "sha256-ZB4504rtgsHbcRfijjlqt4/2ddb8tyQB5IBn126uVTQ=" + version = "v0.24.0" + hash = "sha256-w1c21ljta5wNIyel9CSIn/crPzwOCRofNKhqmfs4aEQ=" [mod."golang.org/x/oauth2"] version = "v0.16.0" hash = "sha256-fJfS9dKaq82WaYSVWHMnxNLWH8+L4aip/C1AfJi4FFI=" From 182f4571f04866e9d3f9c92ebfa623baba0ea2ce Mon Sep 17 00:00:00 2001 From: cui <523516579@qq.com> Date: Tue, 9 Apr 2024 00:32:05 +0800 Subject: [PATCH 192/345] imp(evm): using maps.Clone api to simplify code (#2436) imp(evm): using maps.Clone API to simplify code Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- CHANGELOG.md | 1 + x/evm/statedb/mock_test.go | 11 +++-------- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e4b8b781aa..6d952ab21f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -82,6 +82,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (all) [#2388](https://github.com/evmos/evmos/pull/2388) Remove legacy handler files from repository. - (tests) [#2421](https://github.com/evmos/evmos/pull/2421) Remove configuration for deprecated modules from local node script. - (ante) [#2427](https://github.com/evmos/evmos/pull/2427) Minor improvements to EVM mono ante handler readability. +- (evm) [#2436](https://github.com/evmos/evmos/pull/2436) Using maps.Clone API to simplify code. - (make) [#2444](https://github.com/evmos/evmos/pull/2444) Run `protolint` Docker image during `make proto-lint` target. - (docs) [#2472](https://github.com/evmos/evmos/pull/2472) Update security policy. diff --git a/x/evm/statedb/mock_test.go b/x/evm/statedb/mock_test.go index d11b80eeb2..e8d055cbfd 100644 --- a/x/evm/statedb/mock_test.go +++ b/x/evm/statedb/mock_test.go @@ -3,6 +3,7 @@ package statedb_test import ( "bytes" "errors" + "maps" "math/big" sdk "github.com/cosmos/cosmos-sdk/types" @@ -102,13 +103,7 @@ func (k MockKeeper) DeleteAccount(_ sdk.Context, addr common.Address) error { } func (k MockKeeper) Clone() *MockKeeper { - accounts := make(map[common.Address]MockAcount, len(k.accounts)) - for k, v := range k.accounts { - accounts[k] = v - } - codes := make(map[common.Hash][]byte, len(k.codes)) - for k, v := range k.codes { - codes[k] = v - } + accounts := maps.Clone(k.accounts) + codes := maps.Clone(k.codes) return &MockKeeper{accounts, codes} } From 25fea090a159523f84b1327c42ae01d3f3246301 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Apr 2024 09:08:19 +0000 Subject: [PATCH 193/345] build(deps): bump google.golang.org/grpc from 1.62.1 to 1.63.0 (#2454) * build(deps): bump google.golang.org/grpc from 1.62.1 to 1.63.0 Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.62.1 to 1.63.0. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.62.1...v1.63.0) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * gomod2nix generate * fix lint warnings --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: tom Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: Vladislav Varadinov --- app/app.go | 2 ++ go.mod | 26 ++++++++++++------------- go.sum | 52 ++++++++++++++++++++++++------------------------- gomod2nix.toml | 52 ++++++++++++++++++++++++------------------------- server/start.go | 2 +- 5 files changed, 68 insertions(+), 66 deletions(-) diff --git a/app/app.go b/app/app.go index efe8ef9c2d..48695df427 100644 --- a/app/app.go +++ b/app/app.go @@ -762,6 +762,8 @@ func NewEvmos( streamers := cast.ToStringSlice(appOpts.Get(streaming.OptStoreStreamers)) if slices.Contains(streamers, versionDB) { queryMultiStore, err = app.setupVersionDB(homePath, keys, tkeys, memKeys) + // ignore linter here because the error returned will depend on the + // binary build: if it is built with rocksdb or not if err != nil { panic(errorsmod.Wrap(err, "error on versionDB setup")) } diff --git a/go.mod b/go.mod index a23913429c..0a85ccd9f6 100644 --- a/go.mod +++ b/go.mod @@ -49,17 +49,17 @@ require ( golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb golang.org/x/net v0.24.0 golang.org/x/text v0.14.0 - google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 - google.golang.org/grpc v1.62.1 + google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de + google.golang.org/grpc v1.63.0 google.golang.org/protobuf v1.33.0 sigs.k8s.io/yaml v1.4.0 ) require ( cloud.google.com/go v0.112.0 // indirect - cloud.google.com/go/compute v1.23.3 // indirect + cloud.google.com/go/compute v1.24.0 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v1.1.5 // indirect + cloud.google.com/go/iam v1.1.6 // indirect cloud.google.com/go/storage v1.36.0 // indirect cosmossdk.io/core v0.6.1 // indirect cosmossdk.io/depinject v1.0.0-alpha.4 // indirect @@ -228,22 +228,22 @@ require ( github.com/zbiljic/go-filelock v0.0.0-20170914061330-1dbf7103ab7d // indirect github.com/zondax/ledger-go v0.14.3 // indirect go.etcd.io/bbolt v1.3.8 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // indirect - go.opentelemetry.io/otel v1.21.0 // indirect - go.opentelemetry.io/otel/metric v1.21.0 // indirect - go.opentelemetry.io/otel/trace v1.21.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 // indirect + go.opentelemetry.io/otel v1.22.0 // indirect + go.opentelemetry.io/otel/metric v1.22.0 // indirect + go.opentelemetry.io/otel/trace v1.22.0 // indirect golang.org/x/mod v0.14.0 // indirect - golang.org/x/oauth2 v0.16.0 // indirect + golang.org/x/oauth2 v0.17.0 // indirect golang.org/x/sync v0.6.0 // indirect golang.org/x/sys v0.19.0 // indirect golang.org/x/term v0.19.0 // indirect golang.org/x/time v0.5.0 // indirect golang.org/x/tools v0.17.0 // indirect - google.golang.org/api v0.155.0 // indirect + google.golang.org/api v0.162.0 // indirect google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 // indirect + google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index 6bf4076a67..09cece28d8 100644 --- a/go.sum +++ b/go.sum @@ -70,8 +70,8 @@ cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= -cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= +cloud.google.com/go/compute v1.24.0 h1:phWcR2eWzRJaL/kOiJwfFsPs4BaKq1j6vnpZrc1YlVg= +cloud.google.com/go/compute v1.24.0/go.mod h1:kw1/T+h/+tK2LJK0wiPPx1intgdAM3j/g3hFDlscY40= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= @@ -111,8 +111,8 @@ cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y97 cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v1.1.5 h1:1jTsCu4bcsNsE4iiqNT5SHwrDRCfRmIaaaVFhRveTJI= -cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= +cloud.google.com/go/iam v1.1.6 h1:bEa06k05IO4f4uJonbB5iAgKTPpABy1ayxaIZV/GHVc= +cloud.google.com/go/iam v1.1.6/go.mod h1:O0zxdPeGBoFdWW3HWmBxJsk0pfvNM/p/qa82rWOGTwI= cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= @@ -1200,18 +1200,18 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 h1:SpGay3w+nEwMpfVnbqOLH5gY52/foP8RE8UzTZ1pdSE= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1/go.mod h1:4UoMYEZOC0yN/sPGH76KPkkU7zgiEWYWL9vwmbnTJPE= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 h1:aFJWCqJMNjENlcleuuOkGAPH82y0yULBScfXcIEdS24= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1/go.mod h1:sEGXWArGqc3tVa+ekntsN65DmVbVeW+7lTKTjZF3/Fo= -go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= -go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= -go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4= -go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0 h1:UNQQKPfTDe1J81ViolILjTKPr9WetKW6uei2hFgJmFs= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0/go.mod h1:r9vWsPS/3AQItv3OSlEJ/E4mbrhUbbw18meOjArPtKQ= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 h1:sv9kVfal0MK0wBMCOGr+HeJm9v803BkJxGrk2au7j08= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0/go.mod h1:SK2UL73Zy1quvRPonmOmRDiWk1KBV3LyIeeIxcEApWw= +go.opentelemetry.io/otel v1.22.0 h1:xS7Ku+7yTFvDfDraDIJVpw7XPyuHlB9MCiqqX5mcJ6Y= +go.opentelemetry.io/otel v1.22.0/go.mod h1:eoV4iAi3Ea8LkAEI9+GFT44O6T/D0GWAVFyZVCC6pMI= +go.opentelemetry.io/otel/metric v1.22.0 h1:lypMQnGyJYeuYPhOM/bgjbFM6WE44W1/T45er4d8Hhg= +go.opentelemetry.io/otel/metric v1.22.0/go.mod h1:evJGjVpZv0mQ5QBRJoBF64yMuOf4xCWdXjK8pzFvliY= go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8= go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= -go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= -go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= +go.opentelemetry.io/otel/trace v1.22.0 h1:Hg6pPujv0XG9QaVbGOBVHunyuLcCC3jN7WEhPx83XD0= +go.opentelemetry.io/otel/trace v1.22.0/go.mod h1:RbbHXVqKES9QhzZq/fE5UnOSILqRt40a21sPw2He1xo= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -1381,8 +1381,8 @@ golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= -golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= -golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= +golang.org/x/oauth2 v0.17.0 h1:6m3ZPmLEFdVxKKWnKq4VqZ60gutO35zm+zrAHVmHyDQ= +golang.org/x/oauth2 v0.17.0/go.mod h1:OzPDGQiuQMguemayvdylqddI7qcD9lnSDb+1FiwQ5HA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1662,8 +1662,8 @@ google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.155.0 h1:vBmGhCYs0djJttDNynWo44zosHlPvHmA0XiN2zP2DtA= -google.golang.org/api v0.155.0/go.mod h1:GI5qK5f40kCpHfPn6+YzGAByIKWv8ujFnmoWm7Igduk= +google.golang.org/api v0.162.0 h1:Vhs54HkaEpkMBdgGdOT2P6F0csGG/vxDS0hWHJzmmps= +google.golang.org/api v0.162.0/go.mod h1:6SulDkfoBIg4NFmCuZ39XeeAgSHCPecfSUuDyYlAHs0= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1782,12 +1782,12 @@ google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqw google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 h1:KAeGQVN3M9nD0/bQXnr/ClcEMJ968gUXJQ9pwfSynuQ= -google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80/go.mod h1:cc8bqMqtv9gMOr0zHg2Vzff5ULhhL2IXP4sbcn32Dro= -google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 h1:Lj5rbfG876hIAYFjqiJnPHfhXbv+nzTWfm04Fg/XSVU= -google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 h1:AjyfHzEPEFp/NpvfN5g+KDla3EMojjhRVZc1i7cj+oM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= +google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY= +google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo= +google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de h1:jFNzHPIeuzhdRwVhbZdiym9q0ory/xY3sA+v2wPg8I0= +google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de h1:cZGRis4/ot9uVm639a+rHCUaG0JJHEsdyzSQTMX+suY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:H4O17MA/PE9BsGx3w+a+W2VOLLD1Qf7oJneAoU6WktY= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -1829,8 +1829,8 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk= -google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= +google.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8= +google.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= diff --git a/gomod2nix.toml b/gomod2nix.toml index bab0249f82..50d6f5bcb6 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -5,14 +5,14 @@ schema = 3 version = "v0.112.0" hash = "sha256-lmNLoqmLURfxu+a6V/SeoP8xVn0Wi2SD7uxxAtSjm+o=" [mod."cloud.google.com/go/compute"] - version = "v1.23.3" - hash = "sha256-WwlTw/x9GSM6B4nHm9FDvHZ1Pd4KN0wxk650CosJnpQ=" + version = "v1.24.0" + hash = "sha256-icDjR0uxYeazRbhsBgl8Dx7z/oRZJ/iqK6CGjCtsaQQ=" [mod."cloud.google.com/go/compute/metadata"] version = "v0.2.3" hash = "sha256-kYB1FTQRdTDqCqJzSU/jJYbVUGyxbkASUKbEs36FUyU=" [mod."cloud.google.com/go/iam"] - version = "v1.1.5" - hash = "sha256-nETSf8U75kLNXk82JdQaJz394z8cXMbpNYSm1KE03GA=" + version = "v1.1.6" + hash = "sha256-u91oZdyy/wgk3J8Z+4mWmn+YliSBIATu6kpyH20Dd8k=" [mod."cloud.google.com/go/storage"] version = "v1.36.0" hash = "sha256-dRKH1NEyAfEpVo5Mma677L7z0JO9Mfd1bv1lr1uFngI=" @@ -649,20 +649,20 @@ schema = 3 version = "v0.24.0" hash = "sha256-4H+mGZgG2c9I1y0m8avF4qmt8LUKxxVsTqR8mKgP4yo=" [mod."go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc"] - version = "v0.46.1" - hash = "sha256-4af3ezbi/at7jZJfEiJ3+a4a1NnxYJPpzZp0tHQq8EA=" + version = "v0.47.0" + hash = "sha256-D+bP2jEZcB4S8AprlDM3qAghYtxhqc8fSKZNac6WVFs=" [mod."go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"] - version = "v0.46.1" - hash = "sha256-H7GeyxyGcxVRCnR0J7HvpWi3QhwsXGF/IunQMpfkXhw=" + version = "v0.47.0" + hash = "sha256-Pv1X0oIWYXyVxEaDQmgYcw+49I9+65N9Y+1wbxoXOog=" [mod."go.opentelemetry.io/otel"] - version = "v1.21.0" - hash = "sha256-MWC1fp41z3w3Y1wlECY12Q7sLeU4PRACZEesWTmDD9E=" + version = "v1.22.0" + hash = "sha256-4K70RPjaPzPpTO/VkE9ueoSo9EANuNXneDR6jEiUaJQ=" [mod."go.opentelemetry.io/otel/metric"] - version = "v1.21.0" - hash = "sha256-UH5fN59juP5GRiTpr5VUv4JGAE2o47LOyR7Ic6Yl/v4=" + version = "v1.22.0" + hash = "sha256-Lb4wdlZNmz6Ut6CljBAePSUA8X0RBEOEDyOl2oO+pL8=" [mod."go.opentelemetry.io/otel/trace"] - version = "v1.21.0" - hash = "sha256-vjZsOaQCgTjz6WYim0YZHLnB/PC3CvTSpS97qkL2vz8=" + version = "v1.22.0" + hash = "sha256-38zzkmcoOzYYeDN+rC44HmwmdnalIcEpObCS6tIvMO8=" [mod."golang.org/x/crypto"] version = "v0.22.0" hash = "sha256-2+u9nd32+Bi7EEv7QFc12CRTbfV7DApNv+yKIr7+lTw=" @@ -676,8 +676,8 @@ schema = 3 version = "v0.24.0" hash = "sha256-w1c21ljta5wNIyel9CSIn/crPzwOCRofNKhqmfs4aEQ=" [mod."golang.org/x/oauth2"] - version = "v0.16.0" - hash = "sha256-fJfS9dKaq82WaYSVWHMnxNLWH8+L4aip/C1AfJi4FFI=" + version = "v0.17.0" + hash = "sha256-M2ZZQZt449RJL18YpzGiAiqfGsDVMsr1IVWbYp/G/go=" [mod."golang.org/x/sync"] version = "v0.6.0" hash = "sha256-LLims/wjDZtIqlYCVHREewcUOX4hwRwplEuZKPOJ/HI=" @@ -697,23 +697,23 @@ schema = 3 version = "v0.17.0" hash = "sha256-CxuHfKKtUkn3VjA7D9WQjzvV1EUbyI/xMNhb5CxO6IQ=" [mod."google.golang.org/api"] - version = "v0.155.0" - hash = "sha256-lfQZ5XNJYLOSlu+lrwYYIA3qXrraLC/PIVRHha5mlqI=" + version = "v0.162.0" + hash = "sha256-+AsT4DPjefEmPPelZoSHuQ8nCHhmhhUWU4UGnJ/8+fg=" [mod."google.golang.org/appengine"] version = "v1.6.8" hash = "sha256-decMa0MiWfW/Bzr8QPPzzpeya0YWGHhZAt4Cr/bD1wQ=" [mod."google.golang.org/genproto"] - version = "v0.0.0-20240123012728-ef4313101c80" - hash = "sha256-tRjQ7Nr0ytEhAcRMKW66isgaDNoNL6UKmjfS27s+8d8=" + version = "v0.0.0-20240227224415-6ceb2ff114de" + hash = "sha256-G+tvsCTXxzk3sS6HbBxPN1DYaN1tPOqKsa60mI05Feg=" [mod."google.golang.org/genproto/googleapis/api"] - version = "v0.0.0-20240123012728-ef4313101c80" - hash = "sha256-m1wAOo4INg46fIrGdISN5m5X29Z6OdR151xdKqrD9V4=" + version = "v0.0.0-20240227224415-6ceb2ff114de" + hash = "sha256-H3d2ZhPJI9RH5EK9NsxUAFmT6tr2DgGV9SjZgqJ80r4=" [mod."google.golang.org/genproto/googleapis/rpc"] - version = "v0.0.0-20240123012728-ef4313101c80" - hash = "sha256-b22XLgjrH5i0wUw4iseepgLzjOpFgixWHfGPgl11kbo=" + version = "v0.0.0-20240227224415-6ceb2ff114de" + hash = "sha256-XF1eaB8Uwjuii1SVpiZABBhrpszJy5ujOtN+7qAAouM=" [mod."google.golang.org/grpc"] - version = "v1.62.1" - hash = "sha256-1su6X0YT7MUflrTJijbq1CiisADZHudEx5sJq01TEaE=" + version = "v1.63.0" + hash = "sha256-fq7jUf3T1wVXf7JOAWL0rZrYXGgcM+jmDsvrrynQJM8=" [mod."google.golang.org/protobuf"] version = "v1.33.0" hash = "sha256-cWwQjtUwSIEkAlAadrlxK1PYZXTRrV4NKzt7xDpJgIU=" diff --git a/server/start.go b/server/start.go index 8e34d2d80f..34420ec713 100644 --- a/server/start.go +++ b/server/start.go @@ -467,7 +467,7 @@ func startInProcess(ctx *server.Context, clientCtx client.Context, opts StartOpt grpcAddress := fmt.Sprintf("127.0.0.1:%s", port) // If grpc is enabled, configure grpc client for grpc gateway and json-rpc. - grpcClient, err := grpc.Dial( + grpcClient, err := grpc.NewClient( grpcAddress, grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithDefaultCallOptions( From 78243df119952e69bc6c9b08765bcaf094454051 Mon Sep 17 00:00:00 2001 From: stepit <48993133+0xstepit@users.noreply.github.com> Date: Tue, 9 Apr 2024 17:10:48 +0200 Subject: [PATCH 194/345] change Evmos SDK into evmOS (#2478) * change Evmos SDK into evmOS * update changelog --- CHANGELOG.md | 1 + LICENSE_FAQ.md | 20 +++++++++----------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d952ab21f..fc04b1eebf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -85,6 +85,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (evm) [#2436](https://github.com/evmos/evmos/pull/2436) Using maps.Clone API to simplify code. - (make) [#2444](https://github.com/evmos/evmos/pull/2444) Run `protolint` Docker image during `make proto-lint` target. - (docs) [#2472](https://github.com/evmos/evmos/pull/2472) Update security policy. +- (docs) [#2478](https://github.com/evmos/evmos/pull/2478) Change Evmos SDK with evmOS. ## [v17.0.0] - 2024-04-08 diff --git a/LICENSE_FAQ.md b/LICENSE_FAQ.md index 15cea5a5d3..31ae1ddb2d 100644 --- a/LICENSE_FAQ.md +++ b/LICENSE_FAQ.md @@ -49,12 +49,10 @@ blockchain consensus.The initial Designated Blockchains shall be the Evmos blockchains, identified by chain identifiers 9000 (testing network or testnet) and 9001 (main network or mainnet). -Apart from Evmos repository, Evmos is currently building the Evmos Software -Development Kit (Evmos SDK), to help developers to create their own -EVM-compatible blockchain network with custom parameters. Once it is publicly -available, you may use the Evmos SDK instead for your commercial project, -subject to the applicable Evmos SDK license. For more information about Evmos -SDK, check out the Evmos Manifesto. +Evmos is currently building evmOS, the commercial name of the software associated with the Evmos repository, +to help developers to create their own EVM-compatible blockchain network with custom parameters. +You may use evmOS for your commercial project, subject to the applicable evmOS license. +For more information about evmOS, check out the Evmos Manifesto. **Q: What is the purpose of ENCL-1.0?** @@ -107,10 +105,10 @@ well as many other for-profit and non-profit open source projects. **Q: What will happen to Ethermint? Will it continue to be maintained?** -**A:** Evmos stays the maintainer of the Ethermint repository, which will remain +**A:** Ethermint repository has been archived on Apr 4 2024 and will remain under the LGPL v3 license. New features developments that have been previously -planned to be included on Ethermint are instead going to be part of Evmos SDK. -For more information on the Evmos SDK, check out the Evmos Manifesto. +planned to be included on Ethermint are instead going to be part of evmOS. +For more information on the evmOS, check out the Evmos Manifesto. **Q: Do I need a commercial permit when testing ENCL software?** @@ -125,9 +123,9 @@ running in commercial use, unless they are running on the Designated Blockchains. If you negotiate a commercial permit with us, it will contain details about the relationship between the two licenses. -**Q: What if Tharsis Labs decides to change the use limitation in the future?** +**Q: What if Tharsis Labs decides to change the use limitation in the future?** -**A:** We hope the current limitations will work for the foreseeable future. +**A:** We expect the current limitations will work for the foreseeable future. However, a licensor may change the use limitation in future releases, and you will always be able to use any previous version of the ENCL software under its conditions applied at the time of release. In other words, the licensor’s From 69254a56459d6ad5661cbac26f55d669b2c531a1 Mon Sep 17 00:00:00 2001 From: Luke Date: Wed, 10 Apr 2024 05:50:53 +0800 Subject: [PATCH 195/345] fix(test): fix an incorrect description for ante unit test (#2437) * fix(test): fix an incorrect unit test description for ante unit test * Update CHANGELOG.md --------- Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- app/ante/evm/ante_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/ante/evm/ante_test.go b/app/ante/evm/ante_test.go index d36c5b8ba8..67688e74f4 100644 --- a/app/ante/evm/ante_test.go +++ b/app/ante/evm/ante_test.go @@ -566,7 +566,7 @@ func (suite *AnteTestSuite) TestAnteHandler() { }, false, false, false, }, { - "fails - DeliverTx EIP712 signed Cosmos Tx with empty signature", + "fails - DeliverTx EIP712 signed Cosmos Tx with invalid chain id", func() sdk.Tx { from := acc.GetAddress() gas := uint64(200000) From 661432efa726bcacdc1963078a0bdbcb48a896c5 Mon Sep 17 00:00:00 2001 From: Marko Date: Wed, 10 Apr 2024 15:20:20 +0200 Subject: [PATCH 196/345] chore: make vesting optional (#2479) make vesting optional --- x/evm/keeper/precompiles.go | 11 +++++++---- x/vesting/types/interfaces.go | 4 ---- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/x/evm/keeper/precompiles.go b/x/evm/keeper/precompiles.go index e7027de513..d00caf4cbe 100644 --- a/x/evm/keeper/precompiles.go +++ b/x/evm/keeper/precompiles.go @@ -44,7 +44,7 @@ func AvailablePrecompiles( distributionKeeper distributionkeeper.Keeper, bankKeeper bankkeeper.Keeper, erc20Keeper erc20Keeper.Keeper, - vestingKeeper vestingkeeper.Keeper, + vestingKeeper any, authzKeeper authzkeeper.Keeper, transferKeeper transferkeeper.Keeper, channelKeeper channelkeeper.Keeper, @@ -75,9 +75,12 @@ func AvailablePrecompiles( panic(fmt.Errorf("failed to instantiate ICS20 precompile: %w", err)) } - vestingPrecompile, err := vestingprecompile.NewPrecompile(vestingKeeper, authzKeeper) - if err != nil { - panic(fmt.Errorf("failed to instantiate vesting precompile: %w", err)) + var vestingPrecompile vm.PrecompiledContract + if r, ok := vestingKeeper.(vestingkeeper.Keeper); ok { + vestingPrecompile, err = vestingprecompile.NewPrecompile(r, authzKeeper) + if err != nil { + panic(fmt.Errorf("failed to instantiate vesting precompile: %w", err)) + } } bankPrecompile, err := bankprecompile.NewPrecompile(bankKeeper, erc20Keeper) diff --git a/x/vesting/types/interfaces.go b/x/vesting/types/interfaces.go index 702c9952b6..cc9d683cd1 100644 --- a/x/vesting/types/interfaces.go +++ b/x/vesting/types/interfaces.go @@ -65,10 +65,6 @@ type StakingKeeper interface { RemoveRedelegation(ctx sdk.Context, red stakingtypes.Redelegation) GetDelegatorUnbonding(ctx sdk.Context, delegator sdk.AccAddress) math.Int GetDelegatorBonded(ctx sdk.Context, delegator sdk.AccAddress) math.Int - // Hooks - // Commented this out because go throws compiling error that a Hook is not implemented - // even though it is implemented - // stakingtypes.StakingHooks } // DistributionKeeper defines the expected interface contract the vesting module From 9e4c4634970b2ecfe181a8ad5e17575834cb826f Mon Sep 17 00:00:00 2001 From: cui <523516579@qq.com> Date: Thu, 11 Apr 2024 05:32:31 +0800 Subject: [PATCH 197/345] imp(erc20): remove unused constant (#2442) * imp(erc20): remove unused constant * change log --------- Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- x/erc20/types/events.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/x/erc20/types/events.go b/x/erc20/types/events.go index 9c8b12813d..00d1d97722 100644 --- a/x/erc20/types/events.go +++ b/x/erc20/types/events.go @@ -24,9 +24,6 @@ const ( AttributeKeyCosmosCoin = "cosmos_coin" AttributeKeyERC20Token = "erc20_token" // #nosec AttributeKeyReceiver = "receiver" - - // ERC20EventTransfer defines the transfer event for ERC20 - ERC20EventTransfer = "Transfer" ) // LogTransfer Event type for Transfer(address from, address to, uint256 value) From 8e9ad146b03d333be0c881929a7fac5129c58b24 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Apr 2024 12:07:04 +0000 Subject: [PATCH 198/345] build(deps): bump express from 4.18.2 to 4.19.2 in /tests/solidity in the npm_and_yarn group across 1 directory (#2480) build(deps): bump express Bumps the npm_and_yarn group with 1 update in the /tests/solidity directory: [express](https://github.com/expressjs/express). Updates `express` from 4.18.2 to 4.19.2 - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/master/History.md) - [Commits](https://github.com/expressjs/express/compare/4.18.2...4.19.2) --- updated-dependencies: - dependency-name: express dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: Vladislav Varadinov --- tests/solidity/yarn.lock | 48 +++++++++------------------------------- 1 file changed, 10 insertions(+), 38 deletions(-) diff --git a/tests/solidity/yarn.lock b/tests/solidity/yarn.lock index 16d8a5a077..4b2b81c5ae 100644 --- a/tests/solidity/yarn.lock +++ b/tests/solidity/yarn.lock @@ -3326,25 +3326,7 @@ bn.js@^5.0.0, bn.js@^5.1.2, bn.js@^5.1.3, bn.js@^5.2.0, bn.js@^5.2.1: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== -body-parser@1.20.1: - version "1.20.1" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" - integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== - dependencies: - bytes "3.1.2" - content-type "~1.0.4" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.11.0" - raw-body "2.5.1" - type-is "~1.6.18" - unpipe "1.0.0" - -body-parser@^1.16.0, body-parser@^1.19.0: +body-parser@1.20.2, body-parser@^1.16.0, body-parser@^1.19.0: version "1.20.2" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== @@ -4084,10 +4066,10 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== +cookie@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" + integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== cookie@^0.4.1: version "0.4.2" @@ -5233,16 +5215,16 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: safe-buffer "^5.1.1" express@^4.14.0, express@^4.17.1: - version "4.18.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" - integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + version "4.19.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465" + integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.20.1" + body-parser "1.20.2" content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.5.0" + cookie "0.6.0" cookie-signature "1.0.6" debug "2.6.9" depd "2.0.0" @@ -9301,16 +9283,6 @@ range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - raw-body@2.5.2, raw-body@^2.4.1: version "2.5.2" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" From 1e4c377fa6849d9b828daff200a0de039cfb9b50 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Apr 2024 15:26:20 +0200 Subject: [PATCH 199/345] build(deps): bump google.golang.org/grpc from 1.63.0 to 1.63.2 (#2477) * build(deps): bump google.golang.org/grpc from 1.63.0 to 1.63.2 Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.63.0 to 1.63.2. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.63.0...v1.63.2) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * gomod2nix generate --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: tom Co-authored-by: Vladislav Varadinov --- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 0a85ccd9f6..90e7b150d8 100644 --- a/go.mod +++ b/go.mod @@ -50,7 +50,7 @@ require ( golang.org/x/net v0.24.0 golang.org/x/text v0.14.0 google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de - google.golang.org/grpc v1.63.0 + google.golang.org/grpc v1.63.2 google.golang.org/protobuf v1.33.0 sigs.k8s.io/yaml v1.4.0 ) diff --git a/go.sum b/go.sum index 09cece28d8..50cc75738c 100644 --- a/go.sum +++ b/go.sum @@ -1829,8 +1829,8 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8= -google.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= +google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= +google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= diff --git a/gomod2nix.toml b/gomod2nix.toml index 50d6f5bcb6..684e9d55e7 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -712,8 +712,8 @@ schema = 3 version = "v0.0.0-20240227224415-6ceb2ff114de" hash = "sha256-XF1eaB8Uwjuii1SVpiZABBhrpszJy5ujOtN+7qAAouM=" [mod."google.golang.org/grpc"] - version = "v1.63.0" - hash = "sha256-fq7jUf3T1wVXf7JOAWL0rZrYXGgcM+jmDsvrrynQJM8=" + version = "v1.63.2" + hash = "sha256-RmtVjYLam97k7IHTHU7Gn16xNX+GvA9AiLKlQwOiZXU=" [mod."google.golang.org/protobuf"] version = "v1.33.0" hash = "sha256-cWwQjtUwSIEkAlAadrlxK1PYZXTRrV4NKzt7xDpJgIU=" From 79e62c12a813a25ec6a841cd67a8066be67af41f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Apr 2024 16:23:56 +0200 Subject: [PATCH 200/345] build(deps): bump express from 4.18.2 to 4.19.2 in /tests/solidity (#2440) Bumps [express](https://github.com/expressjs/express) from 4.18.2 to 4.19.2. - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/master/History.md) - [Commits](https://github.com/expressjs/express/compare/4.18.2...4.19.2) --- updated-dependencies: - dependency-name: express dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> From 6e8f358f5384d314d7ff001c27268eac4cd9e5f6 Mon Sep 17 00:00:00 2001 From: cui <523516579@qq.com> Date: Fri, 12 Apr 2024 20:33:51 +0800 Subject: [PATCH 201/345] imp(evm): remove unused error var (#2441) * imp(evm): remove unused error var * add change log --------- Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: Vladislav Varadinov --- x/evm/types/errors.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/x/evm/types/errors.go b/x/evm/types/errors.go index 0baf612dc8..a019a2cbd4 100644 --- a/x/evm/types/errors.go +++ b/x/evm/types/errors.go @@ -32,8 +32,6 @@ const ( codeErrInactivePrecompile ) -var ErrPostTxProcessing = errors.New("failed to execute post processing") - var ( // ErrInvalidState returns an error resulting from an invalid Storage State. ErrInvalidState = errorsmod.Register(ModuleName, codeErrInvalidState, "invalid storage state") From 0ba6f0853d94484906fc6926b29aebd3b0a99e83 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 Apr 2024 15:37:50 +0000 Subject: [PATCH 202/345] build(deps): bump github.com/linxGnu/grocksdb from 1.8.12 to 1.8.14 (#2429) * build(deps): bump github.com/linxGnu/grocksdb from 1.8.12 to 1.8.14 Bumps [github.com/linxGnu/grocksdb](https://github.com/linxGnu/grocksdb) from 1.8.12 to 1.8.14. - [Release notes](https://github.com/linxGnu/grocksdb/releases) - [Commits](https://github.com/linxGnu/grocksdb/compare/v1.8.12...v1.8.14) --- updated-dependencies: - dependency-name: github.com/linxGnu/grocksdb dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * update gomod2nix.toml file * bump rockdb version --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: GAtom22 Co-authored-by: tom Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: Vladislav Varadinov --- Dockerfile | 2 +- Makefile | 2 +- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- nix/rocksdb.nix | 4 ++-- scripts/install_librocksdb.sh | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Dockerfile b/Dockerfile index 436804de75..6db2890fe0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ FROM golang:1.22.2-alpine3.18 AS build-env ARG DB_BACKEND=goleveldb -ARG ROCKSDB_VERSION="8.9.1" +ARG ROCKSDB_VERSION="8.11.3" WORKDIR /go/src/github.com/evmos/evmos diff --git a/Makefile b/Makefile index 609427f649..5fd7dcd24e 100644 --- a/Makefile +++ b/Makefile @@ -26,7 +26,7 @@ DOCKER_TAG := $(COMMIT_HASH) # e2e env MOUNT_PATH := $(shell pwd)/build/:/root/ E2E_SKIP_CLEANUP := false -ROCKSDB_VERSION ?= "8.9.1" +ROCKSDB_VERSION ?= "8.11.3" # Deps DEPS_COSMOS_SDK_VERSION := $(shell cat go.sum | grep 'github.com/evmos/cosmos-sdk' | grep -v -e 'go.mod' | tail -n 1 | awk '{ print $$2; }') DEPS_IBC_GO_VERSION := $(shell cat go.sum | grep 'github.com/cosmos/ibc-go' | grep -v -e 'go.mod' | tail -n 1 | awk '{ print $$2; }') diff --git a/go.mod b/go.mod index 90e7b150d8..099619814a 100644 --- a/go.mod +++ b/go.mod @@ -29,7 +29,7 @@ require ( github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/hashicorp/go-version v1.6.0 github.com/improbable-eng/grpc-web v0.15.0 - github.com/linxGnu/grocksdb v1.8.12 + github.com/linxGnu/grocksdb v1.8.14 github.com/onsi/ginkgo/v2 v2.17.1 github.com/onsi/gomega v1.32.0 github.com/ory/dockertest/v3 v3.10.0 diff --git a/go.sum b/go.sum index 50cc75738c..3577c8810b 100644 --- a/go.sum +++ b/go.sum @@ -858,8 +858,8 @@ github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6 github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/linxGnu/grocksdb v1.8.12 h1:1/pCztQUOa3BX/1gR3jSZDoaKFpeHFvQ1XrqZpSvZVo= -github.com/linxGnu/grocksdb v1.8.12/go.mod h1:xZCIb5Muw+nhbDK4Y5UJuOrin5MceOuiXkVUR7vp4WY= +github.com/linxGnu/grocksdb v1.8.14 h1:HTgyYalNwBSG/1qCQUIott44wU5b2Y9Kr3z7SK5OfGQ= +github.com/linxGnu/grocksdb v1.8.14/go.mod h1:QYiYypR2d4v63Wj1adOOfzglnoII0gLj3PNh4fZkcFA= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= diff --git a/gomod2nix.toml b/gomod2nix.toml index 684e9d55e7..7c555fa872 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -438,8 +438,8 @@ schema = 3 version = "v0.1.0" hash = "sha256-wQqGTtRWsfR9n0O/SXHVgECebbnNmHddxJIbG63OJBQ=" [mod."github.com/linxGnu/grocksdb"] - version = "v1.8.12" - hash = "sha256-1tlgs/JnopLI8eoWJlv9hP4jf0OTm1qMZTSg0jAkG7A=" + version = "v1.8.14" + hash = "sha256-dT647UzB25Ye1Gv6b9JEtJZjuWKdJo4D8kw9cB0W8gA=" [mod."github.com/magiconair/properties"] version = "v1.8.7" hash = "sha256-XQ2bnc2s7/IH3WxEO4GishZurMyKwEclZy1DXg+2xXc=" diff --git a/nix/rocksdb.nix b/nix/rocksdb.nix index d9b57bdb9b..20a95aa528 100644 --- a/nix/rocksdb.nix +++ b/nix/rocksdb.nix @@ -17,13 +17,13 @@ stdenv.mkDerivation rec { pname = "rocksdb"; - version = "8.9.1"; + version = "8.11.3"; src = fetchFromGitHub { owner = "facebook"; repo = pname; rev = "v${version}"; - sha256 = "sha256-Pl7t4FVOvnORWFS+gjy2EEUQlPxjLukWW5I5gzCQwkI="; + sha256 = "sha256-OpEiMwGxZuxb9o3RQuSrwZMQGLhe9xLT1aa3HpI4KPs="; }; nativeBuildInputs = [ cmake ninja ]; diff --git a/scripts/install_librocksdb.sh b/scripts/install_librocksdb.sh index 773de3dae2..5668475a75 100755 --- a/scripts/install_librocksdb.sh +++ b/scripts/install_librocksdb.sh @@ -1,6 +1,6 @@ #!/bin/bash -ROCKSDB_VERSION=${1:-"8.9.1"} +ROCKSDB_VERSION=${1:-"8.11.3"} # Check if RocksDB is already installed if [[ $(find /usr/lib -name "librocksdb.so.${ROCKSDB_VERSION}" -print -quit) ]]; then From b891392b69adbf1fe37acb72160659f1856675c5 Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Mon, 15 Apr 2024 11:10:08 -0300 Subject: [PATCH 203/345] chore(build): bump go to 1.22 (#2484) * bump go to 1.22 * update changelog * update go version in nix setup --- .github/workflows/ante-benchmark.yml | 2 +- .github/workflows/auto-format.yml | 2 +- .github/workflows/build.yml | 2 +- .github/workflows/dependencies.yml | 2 +- .github/workflows/e2e-test.yml | 2 +- .github/workflows/goreleaser.yml | 2 +- .github/workflows/lint.yml | 2 +- .github/workflows/solidity-test.yml | 2 +- .github/workflows/test.yml | 2 +- .golangci.yml | 2 +- CHANGELOG.md | 1 + Makefile | 2 +- default.nix | 8 ++++---- go.mod | 2 +- nix/default.nix | 8 ++++---- tests/nix_tests/shell.nix | 1 - 16 files changed, 21 insertions(+), 21 deletions(-) diff --git a/.github/workflows/ante-benchmark.yml b/.github/workflows/ante-benchmark.yml index 8e7a6cfb44..744397b460 100644 --- a/.github/workflows/ante-benchmark.yml +++ b/.github/workflows/ante-benchmark.yml @@ -19,7 +19,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v5 with: - go-version: '1.21' + go-version: '1.22' check-latest: true if: env.GIT_DIFF - name: Run benchmark tests diff --git a/.github/workflows/auto-format.yml b/.github/workflows/auto-format.yml index 9f9c72d897..8289f879fb 100644 --- a/.github/workflows/auto-format.yml +++ b/.github/workflows/auto-format.yml @@ -13,7 +13,7 @@ jobs: steps: - uses: actions/setup-go@v5 with: - go-version: "1.21" + go-version: "1.22" check-latest: true - uses: actions/checkout@v4 with: diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index bc9f02dfc1..5851e40755 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -20,7 +20,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: '1.21' + go-version: '1.22' check-latest: true - uses: technote-space/get-diff-action@v6.1.2 id: git_diff diff --git a/.github/workflows/dependencies.yml b/.github/workflows/dependencies.yml index 3acc5739fb..90c8412217 100644 --- a/.github/workflows/dependencies.yml +++ b/.github/workflows/dependencies.yml @@ -10,7 +10,7 @@ jobs: steps: - uses: actions/setup-go@v5 with: - go-version: '1.21' + go-version: '1.22' check-latest: true - name: "Checkout Repository" uses: actions/checkout@v4 diff --git a/.github/workflows/e2e-test.yml b/.github/workflows/e2e-test.yml index ea45531ce9..310f26dc00 100644 --- a/.github/workflows/e2e-test.yml +++ b/.github/workflows/e2e-test.yml @@ -14,7 +14,7 @@ jobs: steps: - uses: actions/setup-go@v5 with: - go-version: '1.21' + go-version: '1.22' check-latest: true - uses: actions/checkout@v4 - uses: technote-space/get-diff-action@v6.1.2 diff --git a/.github/workflows/goreleaser.yml b/.github/workflows/goreleaser.yml index 7c55cdd1fe..ce1ab2f64a 100644 --- a/.github/workflows/goreleaser.yml +++ b/.github/workflows/goreleaser.yml @@ -15,7 +15,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: '1.21' + go-version: '1.22' check-latest: true - name: release dry run run: make release-dry-run diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index f3a9e68732..d12950b5cc 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -13,7 +13,7 @@ jobs: # Required: setup-go, for all versions v3.0.0+ of golangci-lint - uses: actions/setup-go@v5 with: - go-version: '1.21' + go-version: '1.22' check-latest: true - uses: actions/checkout@v4 - uses: technote-space/get-diff-action@v6.1.2 diff --git a/.github/workflows/solidity-test.yml b/.github/workflows/solidity-test.yml index 86adb96edb..df2861b2d2 100644 --- a/.github/workflows/solidity-test.yml +++ b/.github/workflows/solidity-test.yml @@ -11,7 +11,7 @@ jobs: steps: - uses: actions/setup-go@v5 with: - go-version: '1.21' + go-version: '1.22' check-latest: true - uses: actions/checkout@v4 - uses: technote-space/get-diff-action@v6.1.2 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 83362af140..9ecab02987 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -20,7 +20,7 @@ jobs: steps: - uses: actions/setup-go@v5 with: - go-version: '1.21' + go-version: '1.22' check-latest: true - uses: actions/checkout@v4 - uses: technote-space/get-diff-action@v6.1.2 diff --git a/.golangci.yml b/.golangci.yml index 1f36f7db6e..79a2b97842 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -50,7 +50,7 @@ linters-settings: require-explanation: false require-specific: false gofumpt: - lang-version: "1.21" + lang-version: "1.22" gomodguard: blocked: versions: # List of blocked module version constraints diff --git a/CHANGELOG.md b/CHANGELOG.md index fc04b1eebf..541c4e5f08 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -86,6 +86,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (make) [#2444](https://github.com/evmos/evmos/pull/2444) Run `protolint` Docker image during `make proto-lint` target. - (docs) [#2472](https://github.com/evmos/evmos/pull/2472) Update security policy. - (docs) [#2478](https://github.com/evmos/evmos/pull/2478) Change Evmos SDK with evmOS. +- (build) [#2484](https://github.com/evmos/evmos/pull/2484) Bump golang version to v1.22. ## [v17.0.0] - 2024-04-08 diff --git a/Makefile b/Makefile index 5fd7dcd24e..2fc551c960 100644 --- a/Makefile +++ b/Makefile @@ -552,7 +552,7 @@ localnet-show-logstream: ############################################################################### PACKAGE_NAME:=github.com/evmos/evmos -GOLANG_CROSS_VERSION = v1.21 +GOLANG_CROSS_VERSION = v1.22 GOPATH ?= '$(HOME)/go' release-dry-run: docker run \ diff --git a/default.nix b/default.nix index e1a2b24a5d..d9d86dd575 100644 --- a/default.nix +++ b/default.nix @@ -20,16 +20,16 @@ let "-X github.com/cosmos/cosmos-sdk/types.DBBackend=${dbBackend}" ]); buildInputs = lib.optionals (dbBackend == "rocksdb") [ rocksdb ]; - # use a newer version of nixpkgs to get go_1_21 + # use a newer version of nixpkgs to get go_1_22 # We're not updating this on the whole setup because breaks other stuff # but we can import the needed packages from the newer version - nixpkgsUrl = "https://github.com/NixOS/nixpkgs/archive/23.11.tar.gz"; + nixpkgsUrl = "https://github.com/NixOS/nixpkgs/archive/master.tar.gz"; nixpkgs = import (fetchTarball nixpkgsUrl) {}; - go_1_21 = nixpkgs.pkgs.go_1_21; + go_1_22 = nixpkgs.pkgs.go_1_22; in buildGoApplication rec { inherit pname version buildInputs tags ldflags; - go = go_1_21; + go = go_1_22; src = ./.; modules = ./gomod2nix.toml; doCheck = false; diff --git a/go.mod b/go.mod index 099619814a..5ea8886ce2 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/evmos/evmos/v16 -go 1.21 +go 1.22 require ( cosmossdk.io/api v0.3.1 diff --git a/nix/default.nix b/nix/default.nix index db72430d2b..9f18905ef3 100644 --- a/nix/default.nix +++ b/nix/default.nix @@ -1,16 +1,16 @@ { sources ? import ./sources.nix, system ? builtins.currentSystem, ... }: let - # use a newer version of nixpkgs to get go_1_21 + # use a newer version of nixpkgs to get go_1_22 # We're not updating this on the whole setup because breaks other stuff # but we can import the needed packages from the newer version - nixpkgsUrl = "https://github.com/NixOS/nixpkgs/archive/23.11.tar.gz"; + nixpkgsUrl = "https://github.com/NixOS/nixpkgs/archive/master.tar.gz"; nixpkgs = import (fetchTarball nixpkgsUrl) {}; - go_1_21 = nixpkgs.pkgs.go_1_21; + go_1_22 = nixpkgs.pkgs.go_1_22; in import sources.nixpkgs { overlays = [ (final: pkgs: rec { - go = go_1_21; + go = go_1_22; go-ethereum = pkgs.callPackage ./go-ethereum.nix { inherit (pkgs.darwin) libobjc; inherit (pkgs.darwin.apple_sdk.frameworks) IOKit; diff --git a/tests/nix_tests/shell.nix b/tests/nix_tests/shell.nix index b32707863b..0878786f46 100644 --- a/tests/nix_tests/shell.nix +++ b/tests/nix_tests/shell.nix @@ -9,7 +9,6 @@ pkgs.mkShell { pkgs.go-ethereum pkgs.nodejs pkgs.test-env - pkgs.gomod2nix pkgs.rocksdb pkgs.evmosd-rocksdb pkgs.chain-maind From 0b078156b8431343e6e17ca9157c128125bf36b5 Mon Sep 17 00:00:00 2001 From: imalasong Date: Tue, 16 Apr 2024 03:11:25 +0800 Subject: [PATCH 204/345] replace path.Join with filepath.Join (#2481) * replace path.Join with filepath.Join Signed-off-by: xiaochangbai <704566072@qq.com> * add changelog Signed-off-by: imalasong --------- Signed-off-by: xiaochangbai <704566072@qq.com> Signed-off-by: imalasong --- CHANGELOG.md | 1 + client/config.go | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 541c4e5f08..200526e822 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -87,6 +87,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (docs) [#2472](https://github.com/evmos/evmos/pull/2472) Update security policy. - (docs) [#2478](https://github.com/evmos/evmos/pull/2478) Change Evmos SDK with evmOS. - (build) [#2484](https://github.com/evmos/evmos/pull/2484) Bump golang version to v1.22. +- (client) [#2481](https://github.com/evmos/evmos/pull/2481) Replace path.Join with filepath.Join. ## [v17.0.0] - 2024-04-08 diff --git a/client/config.go b/client/config.go index 49123a102c..20a4354da6 100644 --- a/client/config.go +++ b/client/config.go @@ -5,7 +5,7 @@ package client import ( "fmt" "os" - "path" + "path/filepath" "github.com/spf13/cobra" "github.com/spf13/viper" @@ -24,7 +24,7 @@ func InitConfig(cmd *cobra.Command) error { return err } - configFile := path.Join(home, "config", "config.toml") + configFile := filepath.Join(home, "config", "config.toml") _, err = os.Stat(configFile) if err != nil && !os.IsNotExist(err) { // Immediately return if the error isn't related to the file not existing. From 16c61441e105744422ee11b0cbde60766252e65d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Apr 2024 11:04:07 -0300 Subject: [PATCH 205/345] build(deps): bump github.com/cometbft/cometbft-db from 0.11.0 to 0.12.0 (#2482) * build(deps): bump github.com/cometbft/cometbft-db from 0.11.0 to 0.12.0 Bumps [github.com/cometbft/cometbft-db](https://github.com/cometbft/cometbft-db) from 0.11.0 to 0.12.0. - [Release notes](https://github.com/cometbft/cometbft-db/releases) - [Changelog](https://github.com/cometbft/cometbft-db/blob/main/CHANGELOG.md) - [Commits](https://github.com/cometbft/cometbft-db/compare/v0.11.0...v0.12.0) --- updated-dependencies: - dependency-name: github.com/cometbft/cometbft-db dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * update gomod2nix.toml file * go mod tidy * add setup-go in test-nix step * update go version in nix setup to use v1.22.2 * remove unnecessary change * fix style * use go1.22 in consensus warn ci * Revert "use go1.22 in consensus warn ci" This reverts commit 4fe543ea2ab3a999daac8835a566e677c202c4af. --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: GAtom22 Co-authored-by: tom --- default.nix | 16 +++++++++++++++- go.mod | 11 +++++------ go.sum | 39 ++++++++------------------------------- gomod2nix.toml | 23 ++++++++++------------- nix/default.nix | 17 +++++++++++++++-- 5 files changed, 53 insertions(+), 53 deletions(-) diff --git a/default.nix b/default.nix index d9d86dd575..b8b356142b 100644 --- a/default.nix +++ b/default.nix @@ -1,6 +1,7 @@ { lib , buildGoApplication , buildPackages +, fetchFromGitHub , stdenv , rev ? "dirty" , rocksdb @@ -25,7 +26,20 @@ let # but we can import the needed packages from the newer version nixpkgsUrl = "https://github.com/NixOS/nixpkgs/archive/master.tar.gz"; nixpkgs = import (fetchTarball nixpkgsUrl) {}; - go_1_22 = nixpkgs.pkgs.go_1_22; + # the go_1_22 nixpkgs is v1.22.1 + # but we need the v1.22.2. + # This overrides the pkg to use + # the v1.22.2 version + go_1_22 = nixpkgs.pkgs.go_1_22.overrideAttrs { + pname = "golang"; + version = "go1.22.2"; + src = fetchFromGitHub { + owner = "golang"; + repo = "go"; + rev = "dddf0ae40fa0c1223aba191d73a44425a08e1035"; + sha256 = "sha256-gWJ4txAt2TkobDo1EGotWDOSP2pGqLCNqpn+Smgr21w="; + }; + }; in buildGoApplication rec { inherit pname version buildInputs tags ldflags; diff --git a/go.mod b/go.mod index 5ea8886ce2..81473cc38b 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/evmos/evmos/v16 -go 1.22 +go 1.22.2 require ( cosmossdk.io/api v0.3.1 @@ -12,7 +12,7 @@ require ( github.com/btcsuite/btcd v0.24.0 github.com/btcsuite/btcd/btcutil v1.1.5 github.com/cometbft/cometbft v0.37.4 - github.com/cometbft/cometbft-db v0.11.0 + github.com/cometbft/cometbft-db v0.12.0 github.com/cosmos/cosmos-proto v1.0.0-beta.4 github.com/cosmos/cosmos-sdk v0.47.8 github.com/cosmos/go-bip39 v1.0.0 @@ -82,7 +82,6 @@ require ( github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 // indirect github.com/cenkalti/backoff/v4 v4.1.3 // indirect - github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/chzyer/readline v1.5.1 // indirect github.com/cockroachdb/apd/v2 v2.0.2 // indirect @@ -105,9 +104,8 @@ require ( github.com/deckarep/golang-set v1.8.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect - github.com/dgraph-io/badger/v2 v2.2007.4 // indirect + github.com/dgraph-io/badger/v4 v4.2.0 // indirect github.com/dgraph-io/ristretto v0.1.1 // indirect - github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91 // indirect github.com/docker/cli v20.10.24+incompatible // indirect github.com/docker/docker v24.0.9+incompatible // indirect @@ -139,6 +137,7 @@ require ( github.com/golang/mock v1.6.0 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/btree v1.1.2 // indirect + github.com/google/flatbuffers v1.12.1 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/orderedcode v0.0.1 // indirect github.com/google/pprof v0.0.0-20230228050547-1710fef4ab10 // indirect @@ -227,7 +226,7 @@ require ( github.com/xeipuuv/gojsonschema v1.2.0 // indirect github.com/zbiljic/go-filelock v0.0.0-20170914061330-1dbf7103ab7d // indirect github.com/zondax/ledger-go v0.14.3 // indirect - go.etcd.io/bbolt v1.3.8 // indirect + go.etcd.io/bbolt v1.4.0-alpha.0.0.20240404170359-43604f3112c5 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 // indirect go.opentelemetry.io/otel v1.22.0 // indirect diff --git a/go.sum b/go.sum index 3577c8810b..92c534164c 100644 --- a/go.sum +++ b/go.sum @@ -222,7 +222,6 @@ github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2y github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= -github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= @@ -249,7 +248,6 @@ github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kd github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= @@ -311,7 +309,6 @@ github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInq github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= @@ -364,14 +361,12 @@ github.com/coinbase/rosetta-sdk-go/types v1.0.0 h1:jpVIwLcPoOeCR6o1tU+Xv7r5bMONN github.com/coinbase/rosetta-sdk-go/types v1.0.0/go.mod h1:eq7W2TMRH22GTW0N0beDnN931DW0/WOI1R2sdHNHG4c= github.com/cometbft/cometbft v0.37.4 h1:xyvvEqlyfK8MgNIIKVJaMsuIp03wxOcFmVkT26+Ikpg= github.com/cometbft/cometbft v0.37.4/go.mod h1:Cmg5Hp4sNpapm7j+x0xRyt2g0juQfmB752ous+pA0G8= -github.com/cometbft/cometbft-db v0.11.0 h1:M3Lscmpogx5NTbb1EGyGDaFRdsoLWrUWimFEyf7jej8= -github.com/cometbft/cometbft-db v0.11.0/go.mod h1:GDPJAC/iFHNjmZZPN8V8C1yr/eyityhi2W1hz2MGKSc= +github.com/cometbft/cometbft-db v0.12.0 h1:v77/z0VyfSU7k682IzZeZPFZrQAKiQwkqGN0QzAjMi0= +github.com/cometbft/cometbft-db v0.12.0/go.mod h1:aX2NbCrjNVd2ZajYxt1BsiFf/Z+TQ2MN0VxdicheYuw= github.com/confio/ics23/go v0.9.0 h1:cWs+wdbS2KRPZezoaaj+qBleXgUk5WOQFMP3CQFGTr4= github.com/confio/ics23/go v0.9.0/go.mod h1:4LPZ2NYqnYIVRklaozjNR1FScgDJ2s5Xrp+e/mYVRak= github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= @@ -400,8 +395,6 @@ github.com/cosmos/ledger-cosmos-go v0.12.4 h1:drvWt+GJP7Aiw550yeb3ON/zsrgW0jgh5s github.com/cosmos/ledger-cosmos-go v0.12.4/go.mod h1:fjfVWRf++Xkygt9wzCsjEBdjcf7wiiY35fv3ctT+k4M= github.com/cosmos/rosetta-sdk-go v0.10.0 h1:E5RhTruuoA7KTIXUcMicL76cffyeoyvNybzUGSKFTcM= github.com/cosmos/rosetta-sdk-go v0.10.0/go.mod h1:SImAZkb96YbwvoRkzSMQB6noNJXFgWl/ENIznEoYQI4= -github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= @@ -434,9 +427,8 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3 github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= -github.com/dgraph-io/badger/v2 v2.2007.4 h1:TRWBQg8UrlUhaFdco01nO2uXwzKS7zd+HVdwV/GHc4o= -github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= -github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgraph-io/badger/v4 v4.2.0 h1:kJrlajbXXL9DFTNuhhu9yCx7JJa4qpYWxtE8BzuWsEs= +github.com/dgraph-io/badger/v4 v4.2.0/go.mod h1:qfCqhPoWDFJRx1gp5QwwyGo8xk1lbHUxvK9nK0OGAak= github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= @@ -627,6 +619,8 @@ github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Z github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/flatbuffers v1.12.1 h1:MVlul7pQNoDzWRLTw5imwYsl+usrS1TXG2H4jg6ImGw= +github.com/google/flatbuffers v1.12.1/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -829,7 +823,6 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= @@ -861,7 +854,6 @@ github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0U github.com/linxGnu/grocksdb v1.8.14 h1:HTgyYalNwBSG/1qCQUIott44wU5b2Y9Kr3z7SK5OfGQ= github.com/linxGnu/grocksdb v1.8.14/go.mod h1:QYiYypR2d4v63Wj1adOOfzglnoII0gLj3PNh4fZkcFA= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= @@ -973,7 +965,6 @@ github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FI github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= github.com/pelletier/go-toml/v2 v2.0.9 h1:uH2qQXheeefCCkuBBSLi7jCiSmj3VRh2+Goq2N7Xxu0= github.com/pelletier/go-toml/v2 v2.0.9/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= @@ -1048,7 +1039,6 @@ github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.31.0 h1:FcTR3NnLWW+NnTwwhFWiJSZr4ECLpqCm6QsEnyvbV4A= github.com/rs/zerolog v1.31.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= @@ -1072,26 +1062,18 @@ github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9 github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= -github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= @@ -1151,7 +1133,6 @@ github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= @@ -1170,7 +1151,6 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1: github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -1186,8 +1166,8 @@ github.com/zondax/hid v0.9.2/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWp github.com/zondax/ledger-go v0.14.3 h1:wEpJt2CEcBJ428md/5MgSLsXLBos98sBOyxNmCjfUCw= github.com/zondax/ledger-go v0.14.3/go.mod h1:IKKaoxupuB43g4NxeQmbLXv7T9AlQyie1UpHb342ycI= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.8 h1:xs88BrvEv273UsB79e0hcVrlUWmS0a8upikMFhSyAtA= -go.etcd.io/bbolt v1.3.8/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= +go.etcd.io/bbolt v1.4.0-alpha.0.0.20240404170359-43604f3112c5 h1:qxen9oVGzDdIRP6ejyAJc760RwW4SnVDiTYTzwnXuxo= +go.etcd.io/bbolt v1.4.0-alpha.0.0.20240404170359-43604f3112c5/go.mod h1:eW0HG9/oHQhvRCvb1/pIXW4cOvtDqeQK+XSi3TnwaXY= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= @@ -1231,7 +1211,6 @@ golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -1409,7 +1388,6 @@ golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1419,7 +1397,6 @@ golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/gomod2nix.toml b/gomod2nix.toml index 7c555fa872..c6e69c05b3 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -104,9 +104,6 @@ schema = 3 [mod."github.com/cenkalti/backoff/v4"] version = "v4.1.3" hash = "sha256-u6MEDopHoTWAZoVvvXOKnAg++xre53YgQx0gmf6t2KU=" - [mod."github.com/cespare/xxhash"] - version = "v1.1.0" - hash = "sha256-nVDTtXH9PC3yJ0THaQZEN243UP9xgLi/clt5xRqj3+M=" [mod."github.com/cespare/xxhash/v2"] version = "v2.2.0" hash = "sha256-nPufwYQfTkyrEkbBrpqM3C2vnMxfIz6tAaBmiUP7vd4=" @@ -138,8 +135,8 @@ schema = 3 version = "v0.37.4" hash = "sha256-rEzIdkxeE5FsIGwvzZiPdifPr0v9SmKHQw78I7v2WUA=" [mod."github.com/cometbft/cometbft-db"] - version = "v0.11.0" - hash = "sha256-qs3J+9ZW7gStN2W+5SQf/JSmgX5Q5kmIau1BLxze5iE=" + version = "v0.12.0" + hash = "sha256-mfeUD8+V+xUzEhSOLgQQP0GFDWt7ch/TeBw9gnTJuHk=" [mod."github.com/confio/ics23/go"] version = "v0.9.0" hash = "sha256-guD8w7YygfUp7lpTAUyXQuCPx8F3lXkcg+yR5+JOCbk=" @@ -207,15 +204,12 @@ schema = 3 [mod."github.com/desertbit/timer"] version = "v0.0.0-20180107155436-c41aec40b27f" hash = "sha256-abLOtEcomAqCWLphd2X6WkD/ED764w6sa6unox4BXss=" - [mod."github.com/dgraph-io/badger/v2"] - version = "v2.2007.4" - hash = "sha256-+KwqZJZpViv8S3TqUVvPXrFoMgWFyS3NoLsi4RR5fGk=" + [mod."github.com/dgraph-io/badger/v4"] + version = "v4.2.0" + hash = "sha256-hsNONsIJIYmMzjTXdNxjheL2Zz3Z86J8Uxj2r0el/DY=" [mod."github.com/dgraph-io/ristretto"] version = "v0.1.1" hash = "sha256-Wr9ovXhGi71+n37EnrpIj2o9goyaQHtY4Vvurv6IVlY=" - [mod."github.com/dgryski/go-farm"] - version = "v0.0.0-20200201041132-a6ae2369ad13" - hash = "sha256-aOMlPwFY36bLiiIx4HonbCYRAhagk5N6HAWN7Ygif+E=" [mod."github.com/dlclark/regexp2"] version = "v1.4.1-0.20201116162257-a2a8dda75c91" hash = "sha256-VNNMZIc7NkDg3DVLnqeJNM/KZqkkaZu2/HTLBL8X2xE=" @@ -317,6 +311,9 @@ schema = 3 [mod."github.com/google/btree"] version = "v1.1.2" hash = "sha256-K7V2obq3pLM71Mg0vhhHtZ+gtaubwXPQx3xcIyZDCjM=" + [mod."github.com/google/flatbuffers"] + version = "v1.12.1" + hash = "sha256-v9/ewAmNdQ4SNBlBwgHkxn3IVJAf31D7zVlxwEK/LRs=" [mod."github.com/google/go-cmp"] version = "v0.6.0" hash = "sha256-qgra5jze4iPGP0JSTVeY5qV5AvEnEu39LYAuUCIkMtg=" @@ -643,8 +640,8 @@ schema = 3 version = "v0.14.3" hash = "sha256-tldEok5ebZ4R4B7H8dSlYS5oVuLvh89n9wUaVlDjYwg=" [mod."go.etcd.io/bbolt"] - version = "v1.3.8" - hash = "sha256-ekKy8198B2GfPldHLYZnvNjID6x07dUPYKgFx84TgVs=" + version = "v1.4.0-alpha.0.0.20240404170359-43604f3112c5" + hash = "sha256-U/PkBhk4m6iKFDuR0ULO4EFXb8gFnKNGgNnwMU0OGoM=" [mod."go.opencensus.io"] version = "v0.24.0" hash = "sha256-4H+mGZgG2c9I1y0m8avF4qmt8LUKxxVsTqR8mKgP4yo=" diff --git a/nix/default.nix b/nix/default.nix index 9f18905ef3..e1d0e25a9d 100644 --- a/nix/default.nix +++ b/nix/default.nix @@ -1,11 +1,24 @@ -{ sources ? import ./sources.nix, system ? builtins.currentSystem, ... }: +{ sources ? import ./sources.nix, system ? builtins.currentSystem,... }: let # use a newer version of nixpkgs to get go_1_22 # We're not updating this on the whole setup because breaks other stuff # but we can import the needed packages from the newer version nixpkgsUrl = "https://github.com/NixOS/nixpkgs/archive/master.tar.gz"; nixpkgs = import (fetchTarball nixpkgsUrl) {}; - go_1_22 = nixpkgs.pkgs.go_1_22; + # the go_1_22 nixpkgs is v1.22.1 + # but we need the v1.22.2. + # This overrides the pkg to use + # the v1.22.2 version + go_1_22 = nixpkgs.pkgs.go_1_22.overrideAttrs { + pname = "golang"; + version = "go1.22.2"; + src = nixpkgs.fetchFromGitHub { + owner = "golang"; + repo = "go"; + rev = "dddf0ae40fa0c1223aba191d73a44425a08e1035"; + sha256 = "sha256-gWJ4txAt2TkobDo1EGotWDOSP2pGqLCNqpn+Smgr21w="; + }; + }; in import sources.nixpkgs { overlays = [ From 38cd70514055547cb1a668eee62ce1b2d7ad8b18 Mon Sep 17 00:00:00 2001 From: 180909 Date: Wed, 17 Apr 2024 00:15:15 +0800 Subject: [PATCH 206/345] refactor(all): using slices in std library (#2469) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor(all): using slices in std library * mod tidy --------- Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> Co-authored-by: Vladislav Varadinov --- app/ante/cosmos/min_price.go | 3 +-- app/app.go | 2 +- go.mod | 2 +- precompiles/authorization/types.go | 2 +- precompiles/erc20/utils_test.go | 2 +- precompiles/outposts/osmosis/types.go | 3 +-- precompiles/staking/utils_test.go | 2 +- precompiles/testutil/logs.go | 2 +- testutil/integration/evmos/grpc/gov.go | 2 +- testutil/integration/evmos/utils/contracts.go | 3 +-- x/erc20/keeper/precompiles_test.go | 3 ++- x/evm/keeper/params.go | 2 +- x/evm/keeper/state_transition.go | 3 +-- x/evm/types/params.go | 2 +- 14 files changed, 15 insertions(+), 18 deletions(-) diff --git a/app/ante/cosmos/min_price.go b/app/ante/cosmos/min_price.go index cf5c267e7e..2d86529590 100644 --- a/app/ante/cosmos/min_price.go +++ b/app/ante/cosmos/min_price.go @@ -5,8 +5,7 @@ package cosmos import ( "fmt" "math/big" - - "golang.org/x/exp/slices" + "slices" errorsmod "cosmossdk.io/errors" "cosmossdk.io/math" diff --git a/app/app.go b/app/app.go index 48695df427..bee80a0d66 100644 --- a/app/app.go +++ b/app/app.go @@ -11,13 +11,13 @@ import ( "net/http" "os" "path/filepath" + "slices" "sort" autocliv1 "cosmossdk.io/api/cosmos/autocli/v1" reflectionv1 "cosmossdk.io/api/cosmos/reflection/v1" "cosmossdk.io/math" runtimeservices "github.com/cosmos/cosmos-sdk/runtime/services" - "golang.org/x/exp/slices" "github.com/gorilla/mux" "github.com/rakyll/statik/fs" diff --git a/go.mod b/go.mod index 81473cc38b..9da4c3a243 100644 --- a/go.mod +++ b/go.mod @@ -46,7 +46,6 @@ require ( github.com/zondax/hid v0.9.2 go.opencensus.io v0.24.0 golang.org/x/crypto v0.22.0 - golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb golang.org/x/net v0.24.0 golang.org/x/text v0.14.0 google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de @@ -232,6 +231,7 @@ require ( go.opentelemetry.io/otel v1.22.0 // indirect go.opentelemetry.io/otel/metric v1.22.0 // indirect go.opentelemetry.io/otel/trace v1.22.0 // indirect + golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb // indirect golang.org/x/mod v0.14.0 // indirect golang.org/x/oauth2 v0.17.0 // indirect golang.org/x/sync v0.6.0 // indirect diff --git a/precompiles/authorization/types.go b/precompiles/authorization/types.go index 4197701e0d..a0421b496a 100644 --- a/precompiles/authorization/types.go +++ b/precompiles/authorization/types.go @@ -6,6 +6,7 @@ package authorization import ( "fmt" "math/big" + "slices" "time" "cosmossdk.io/math" @@ -16,7 +17,6 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" cmn "github.com/evmos/evmos/v16/precompiles/common" - "golang.org/x/exp/slices" ) const ( diff --git a/precompiles/erc20/utils_test.go b/precompiles/erc20/utils_test.go index 61c32de0ae..19456dfff1 100644 --- a/precompiles/erc20/utils_test.go +++ b/precompiles/erc20/utils_test.go @@ -3,6 +3,7 @@ package erc20_test import ( "fmt" "math/big" + "slices" "time" errorsmod "cosmossdk.io/errors" @@ -22,7 +23,6 @@ import ( utiltx "github.com/evmos/evmos/v16/testutil/tx" erc20types "github.com/evmos/evmos/v16/x/erc20/types" evmtypes "github.com/evmos/evmos/v16/x/evm/types" - "golang.org/x/exp/slices" //nolint:revive // dot imports are fine for Gomega . "github.com/onsi/gomega" diff --git a/precompiles/outposts/osmosis/types.go b/precompiles/outposts/osmosis/types.go index 998635eb6f..094b050474 100644 --- a/precompiles/outposts/osmosis/types.go +++ b/precompiles/outposts/osmosis/types.go @@ -7,12 +7,11 @@ import ( "encoding/json" "fmt" "math/big" + "slices" "strconv" "github.com/ethereum/go-ethereum/accounts/abi" - "golang.org/x/exp/slices" - sdk "github.com/cosmos/cosmos-sdk/types" cosmosbech32 "github.com/cosmos/cosmos-sdk/types/bech32" transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" diff --git a/precompiles/staking/utils_test.go b/precompiles/staking/utils_test.go index 2db11ff178..952e0c5de9 100644 --- a/precompiles/staking/utils_test.go +++ b/precompiles/staking/utils_test.go @@ -3,6 +3,7 @@ package staking_test import ( "encoding/json" "math/big" + "slices" "time" //nolint:revive // dot imports are fine for Ginkgo @@ -38,7 +39,6 @@ import ( "github.com/evmos/evmos/v16/x/evm/statedb" evmtypes "github.com/evmos/evmos/v16/x/evm/types" inflationtypes "github.com/evmos/evmos/v16/x/inflation/v1/types" - "golang.org/x/exp/slices" ) // SetupWithGenesisValSet initializes a new EvmosApp with a validator set and genesis accounts diff --git a/precompiles/testutil/logs.go b/precompiles/testutil/logs.go index 269cbedebd..f90695bb93 100644 --- a/precompiles/testutil/logs.go +++ b/precompiles/testutil/logs.go @@ -4,11 +4,11 @@ package testutil import ( "fmt" + "slices" abci "github.com/cometbft/cometbft/abci/types" "github.com/ethereum/go-ethereum/accounts/abi" evmtypes "github.com/evmos/evmos/v16/x/evm/types" - "golang.org/x/exp/slices" ) // CheckLogs checks the logs for the given events and whether the transaction was successful or not. diff --git a/testutil/integration/evmos/grpc/gov.go b/testutil/integration/evmos/grpc/gov.go index 197d715331..e916c7d875 100644 --- a/testutil/integration/evmos/grpc/gov.go +++ b/testutil/integration/evmos/grpc/gov.go @@ -5,9 +5,9 @@ package grpc import ( "fmt" + "slices" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1" - "golang.org/x/exp/slices" ) // GetGovParams returns the gov params from the gov module. diff --git a/testutil/integration/evmos/utils/contracts.go b/testutil/integration/evmos/utils/contracts.go index c309248b7a..4bc1722eb2 100644 --- a/testutil/integration/evmos/utils/contracts.go +++ b/testutil/integration/evmos/utils/contracts.go @@ -4,8 +4,7 @@ package utils import ( "fmt" - - "golang.org/x/exp/slices" + "slices" "github.com/evmos/evmos/v16/testutil/integration/evmos/factory" diff --git a/x/erc20/keeper/precompiles_test.go b/x/erc20/keeper/precompiles_test.go index e4b8d144cb..d2e3c42471 100644 --- a/x/erc20/keeper/precompiles_test.go +++ b/x/erc20/keeper/precompiles_test.go @@ -4,12 +4,13 @@ package keeper_test import ( + "slices" + erc20precompile "github.com/evmos/evmos/v16/precompiles/erc20" utiltx "github.com/evmos/evmos/v16/testutil/tx" "github.com/evmos/evmos/v16/utils" "github.com/evmos/evmos/v16/x/erc20/types" evmtypes "github.com/evmos/evmos/v16/x/evm/types" - "golang.org/x/exp/slices" ) func (suite *KeeperTestSuite) TestRegisterERC20Extensions() { diff --git a/x/evm/keeper/params.go b/x/evm/keeper/params.go index 996e806267..e48b7da0e3 100644 --- a/x/evm/keeper/params.go +++ b/x/evm/keeper/params.go @@ -3,12 +3,12 @@ package keeper import ( + "slices" "sort" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" "github.com/evmos/evmos/v16/x/evm/types" - "golang.org/x/exp/slices" ) // GetParams returns the total set of evm parameters. diff --git a/x/evm/keeper/state_transition.go b/x/evm/keeper/state_transition.go index e0b0836f88..a8d51cd426 100644 --- a/x/evm/keeper/state_transition.go +++ b/x/evm/keeper/state_transition.go @@ -4,8 +4,7 @@ package keeper import ( "math/big" - - "golang.org/x/exp/slices" + "slices" tmtypes "github.com/cometbft/cometbft/types" diff --git a/x/evm/types/params.go b/x/evm/types/params.go index 00fabca922..887fb8ae56 100644 --- a/x/evm/types/params.go +++ b/x/evm/types/params.go @@ -5,6 +5,7 @@ package types import ( "fmt" "math/big" + "slices" "sort" "strings" @@ -19,7 +20,6 @@ import ( "github.com/evmos/evmos/v16/precompiles/p256" "github.com/evmos/evmos/v16/types" "github.com/evmos/evmos/v16/utils" - "golang.org/x/exp/slices" ) var ( From a44114669b82b8b2a79f2a5bcfc80d513e1ecadc Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Thu, 18 Apr 2024 05:41:02 -0300 Subject: [PATCH 207/345] fix(e2e-test): update docker go version (#2489) --- tests/e2e/Dockerfile.repo | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/e2e/Dockerfile.repo b/tests/e2e/Dockerfile.repo index 02f5a2fa29..29bd05dc63 100644 --- a/tests/e2e/Dockerfile.repo +++ b/tests/e2e/Dockerfile.repo @@ -1,4 +1,4 @@ -FROM golang:1.22.0-bullseye AS build-env +FROM golang:1.22.2-bullseye AS build-env ARG BRANCH_NAME @@ -14,7 +14,7 @@ RUN git checkout ${BRANCH_NAME} RUN make build -FROM golang:1.22.0-bullseye +FROM golang:1.22.2-bullseye RUN apt-get update \ && apt-get install jq=1.6-2.1 -y --no-install-recommends \ From ecccc44d752f7d9e7ee2080f95999b5f8e3ceaf5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Apr 2024 15:27:03 +0000 Subject: [PATCH 208/345] build(deps): bump github.com/onsi/gomega from 1.32.0 to 1.33.0 (#2495) * build(deps): bump github.com/onsi/gomega from 1.32.0 to 1.33.0 Bumps [github.com/onsi/gomega](https://github.com/onsi/gomega) from 1.32.0 to 1.33.0. - [Release notes](https://github.com/onsi/gomega/releases) - [Changelog](https://github.com/onsi/gomega/blob/master/CHANGELOG.md) - [Commits](https://github.com/onsi/gomega/compare/v1.32.0...v1.33.0) --- updated-dependencies: - dependency-name: github.com/onsi/gomega dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * gomod2nix generate --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: tom --- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 9da4c3a243..379b02881e 100644 --- a/go.mod +++ b/go.mod @@ -31,7 +31,7 @@ require ( github.com/improbable-eng/grpc-web v0.15.0 github.com/linxGnu/grocksdb v1.8.14 github.com/onsi/ginkgo/v2 v2.17.1 - github.com/onsi/gomega v1.32.0 + github.com/onsi/gomega v1.33.0 github.com/ory/dockertest/v3 v3.10.0 github.com/pkg/errors v0.9.1 github.com/rakyll/statik v0.1.7 diff --git a/go.sum b/go.sum index 92c534164c..5779495461 100644 --- a/go.sum +++ b/go.sum @@ -939,8 +939,8 @@ github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5 github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.32.0 h1:JRYU78fJ1LPxlckP6Txi/EYqJvjtMrDC04/MM5XRHPk= -github.com/onsi/gomega v1.32.0/go.mod h1:a4x4gW6Pz2yK1MAmvluYme5lvYTn61afQ2ETw/8n4Lg= +github.com/onsi/gomega v1.33.0 h1:snPCflnZrpMsy94p4lXVEkHo12lmPnc3vY5XBbreexE= +github.com/onsi/gomega v1.33.0/go.mod h1:+925n5YtiFsLzzafLUHzVMBpvvRAzrydIBiSIxjX3wY= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= diff --git a/gomod2nix.toml b/gomod2nix.toml index c6e69c05b3..8815b5ba7a 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -483,8 +483,8 @@ schema = 3 version = "v2.17.1" hash = "sha256-kZgSreUHuYwl6Hh1SHmSasBwbV7qeYeg4BFYoxMchg8=" [mod."github.com/onsi/gomega"] - version = "v1.32.0" - hash = "sha256-FzYwmABdsJFJhATLXRJgQjZBQqL6yycRm2SZ7iJCjo0=" + version = "v1.33.0" + hash = "sha256-0LMaPjLYtaFy95PdY0oyFo00pN0ZStCvaurUuoPSPIo=" [mod."github.com/opencontainers/go-digest"] version = "v1.0.0" hash = "sha256-cfVDjHyWItmUGZ2dzQhCHgmOmou8v7N+itDkLZVkqkQ=" From 4966cf50b79a124595603fe81525df541e6fcd06 Mon Sep 17 00:00:00 2001 From: goodactive <167312449+goodactive@users.noreply.github.com> Date: Sat, 20 Apr 2024 02:53:50 +0800 Subject: [PATCH 209/345] chore: fix some typos in comments (#2493) * chore: fix some typos in comments Signed-off-by: goodactive * Apply suggestions from code review Signed-off-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> --------- Signed-off-by: goodactive Signed-off-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> --- app/ante/cosmos/eip712.go | 4 ++-- app/app.go | 2 +- ibc/testing/endpoint.go | 2 +- rpc/types/block.go | 2 +- x/evm/keeper/state_transition_test.go | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/ante/cosmos/eip712.go b/app/ante/cosmos/eip712.go index a852d0769e..9a5d62fc8b 100644 --- a/app/ante/cosmos/eip712.go +++ b/app/ante/cosmos/eip712.go @@ -198,11 +198,11 @@ func VerifySignature( txWithExtensions, ok := tx.(authante.HasExtensionOptionsTx) if !ok { - return errorsmod.Wrap(errortypes.ErrUnknownExtensionOptions, "tx doesnt contain any extensions") + return errorsmod.Wrap(errortypes.ErrUnknownExtensionOptions, "tx doesn't contain any extensions") } opts := txWithExtensions.GetExtensionOptions() if len(opts) != 1 { - return errorsmod.Wrap(errortypes.ErrUnknownExtensionOptions, "tx doesnt contain expected amount of extension options") + return errorsmod.Wrap(errortypes.ErrUnknownExtensionOptions, "tx doesn't contain expected amount of extension options") } extOpt, ok := opts[0].GetCachedValue().(*types.ExtensionOptionsWeb3Tx) diff --git a/app/app.go b/app/app.go index bee80a0d66..34b03188b6 100644 --- a/app/app.go +++ b/app/app.go @@ -799,7 +799,7 @@ func NewEvmos( // This can happen with memiavl async-commit. // The latter case is not harmful, so we can relax the checking to improve UX. if v1 > 0 && v1 < v2 { - tmos.Exit(fmt.Sprintf("versiondb lastest version %d lag behind iavl latest version %d", v1, v2)) + tmos.Exit(fmt.Sprintf("latest version of version-db (%d) lags behind iavl's latest version (%d)", v1, v2)) } } } diff --git a/ibc/testing/endpoint.go b/ibc/testing/endpoint.go index 5acf47501f..2ff97d07b0 100644 --- a/ibc/testing/endpoint.go +++ b/ibc/testing/endpoint.go @@ -59,7 +59,7 @@ func NewDefaultEndpoint(chain *ibctesting.TestChain) *Endpoint { } } -// QueryProof queries proof associated with this endpoint using the lastest client state +// QueryProof queries proof associated with this endpoint using the latest client state // height on the counterparty chain. func (endpoint *Endpoint) QueryProof(key []byte) ([]byte, clienttypes.Height) { // obtain the counterparty client representing the chain associated with the endpoint diff --git a/rpc/types/block.go b/rpc/types/block.go index 6757cbc85a..a6f9e4115e 100644 --- a/rpc/types/block.go +++ b/rpc/types/block.go @@ -51,7 +51,7 @@ func NewBlockNumber(n *big.Int) BlockNumber { // ContextWithHeight wraps a context with the a gRPC block height header. If the provided height is // 0, it will return an empty context and the gRPC query will use the latest block height for querying. -// Note that all metadata are processed and removed by tendermint layer, so it wont be accessible at gRPC server level. +// Note that all metadata is processed and removed by the CometBFT layer, so it won't be accessible at gRPC server level. func ContextWithHeight(height int64) context.Context { if height == 0 { return context.Background() diff --git a/x/evm/keeper/state_transition_test.go b/x/evm/keeper/state_transition_test.go index 34f35ab74c..2cd12775e4 100644 --- a/x/evm/keeper/state_transition_test.go +++ b/x/evm/keeper/state_transition_test.go @@ -588,7 +588,7 @@ func (suite *KeeperTestSuite) TestApplyMessageWithConfig() { expErr bool }{ { - "messsage applied ok", + "message applied ok", func() { msg, err = newNativeMessage( vmdb.GetNonce(suite.address), From f15f068e998da403bb19a65b2497b2655743d9dc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Apr 2024 20:50:08 +0000 Subject: [PATCH 210/345] build(deps): bump github.com/cosmos/cosmos-proto from 1.0.0-beta.4 to 1.0.0-beta.5 (#2494) * build(deps): bump github.com/cosmos/cosmos-proto Bumps [github.com/cosmos/cosmos-proto](https://github.com/cosmos/cosmos-proto) from 1.0.0-beta.4 to 1.0.0-beta.5. - [Release notes](https://github.com/cosmos/cosmos-proto/releases) - [Commits](https://github.com/cosmos/cosmos-proto/compare/v1.0.0-beta.4...v1.0.0-beta.5) --- updated-dependencies: - dependency-name: github.com/cosmos/cosmos-proto dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * gomod2nix generate --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: tom Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 379b02881e..aefb3517d2 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,7 @@ require ( github.com/btcsuite/btcd/btcutil v1.1.5 github.com/cometbft/cometbft v0.37.4 github.com/cometbft/cometbft-db v0.12.0 - github.com/cosmos/cosmos-proto v1.0.0-beta.4 + github.com/cosmos/cosmos-proto v1.0.0-beta.5 github.com/cosmos/cosmos-sdk v0.47.8 github.com/cosmos/go-bip39 v1.0.0 github.com/cosmos/gogoproto v1.4.10 diff --git a/go.sum b/go.sum index 5779495461..c5d12b9c97 100644 --- a/go.sum +++ b/go.sum @@ -373,8 +373,8 @@ github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= -github.com/cosmos/cosmos-proto v1.0.0-beta.4 h1:aEL7tU/rLOmxZQ9z4i7mzxcLbSCY48OdY7lIWTLG7oU= -github.com/cosmos/cosmos-proto v1.0.0-beta.4/go.mod h1:oeB+FyVzG3XrQJbJng0EnV8Vljfk9XvTIpGILNU/9Co= +github.com/cosmos/cosmos-proto v1.0.0-beta.5 h1:eNcayDLpip+zVLRLYafhzLvQlSmyab+RC5W7ZfmxJLA= +github.com/cosmos/cosmos-proto v1.0.0-beta.5/go.mod h1:hQGLpiIUloJBMdQMMWb/4wRApmI9hjHH05nefC0Ojec= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= diff --git a/gomod2nix.toml b/gomod2nix.toml index 8815b5ba7a..0b8fd41338 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -147,8 +147,8 @@ schema = 3 version = "v1.0.5" hash = "sha256-t572Sr5iiHcuMKLMWa2i+LBAt192oa+G1oA371tG/eI=" [mod."github.com/cosmos/cosmos-proto"] - version = "v1.0.0-beta.4" - hash = "sha256-5Kn82nsZfiEtuwhhLZqmMxdAY1tX/Fi3HJ0/MEaRohw=" + version = "v1.0.0-beta.5" + hash = "sha256-Fy/PbsOsd6iq0Njy3DVWK6HqWsogI+MkE8QslHGWyVg=" [mod."github.com/cosmos/cosmos-sdk"] version = "v0.47.8-evmos" hash = "sha256-B+0qa8x/FKNcTV4iQIStB7zz26JXzruoTBRP4voZlbo=" From aff93e519458fc0821efef6bb96e51484c81ab5b Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Mon, 22 Apr 2024 13:31:42 -0300 Subject: [PATCH 211/345] chore(app): update evmos app to v17 (#2497) --- .github/workflows/consensuswarn.yml | 4 +- app/ante/cosmos.go | 6 +- app/ante/cosmos/authz_test.go | 8 +- app/ante/cosmos/eip712.go | 8 +- app/ante/cosmos/fees.go | 2 +- app/ante/cosmos/fees_benchmark_test.go | 4 +- app/ante/cosmos/fees_test.go | 8 +- app/ante/cosmos/min_price.go | 2 +- app/ante/cosmos/min_price_test.go | 8 +- app/ante/cosmos/reject_msgs.go | 2 +- app/ante/cosmos/setup_test.go | 24 +-- app/ante/cosmos/utils_test.go | 12 +- app/ante/cosmos/vesting.go | 6 +- app/ante/evm.go | 2 +- app/ante/evm/01_setup_ctx.go | 2 +- app/ante/evm/02_mempool_fee_test.go | 2 +- app/ante/evm/03_global_fee_test.go | 2 +- app/ante/evm/04_validate.go | 2 +- app/ante/evm/04_validate_test.go | 6 +- app/ante/evm/05_signature_verification.go | 2 +- app/ante/evm/06_account_verification.go | 6 +- app/ante/evm/06_account_verification_test.go | 14 +- app/ante/evm/07_can_transfer.go | 4 +- app/ante/evm/07_can_transfer_test.go | 12 +- app/ante/evm/08_vesting.go | 4 +- app/ante/evm/08_vesting_test.go | 10 +- app/ante/evm/09_gas_consume.go | 6 +- app/ante/evm/09_gas_consume_test.go | 8 +- app/ante/evm/10_incremenet_sequence_test.go | 8 +- app/ante/evm/10_increment_sequence.go | 2 +- app/ante/evm/11_gas_wanted.go | 2 +- app/ante/evm/11_gas_wanted_test.go | 10 +- app/ante/evm/12_emit_event.go | 2 +- app/ante/evm/ante_test.go | 4 +- app/ante/evm/eth_benchmark_test.go | 10 +- app/ante/evm/fee_checker.go | 6 +- app/ante/evm/fee_checker_test.go | 6 +- app/ante/evm/fee_market_test.go | 12 +- app/ante/evm/interfaces.go | 6 +- app/ante/evm/mono.go | 6 +- app/ante/evm/setup_ctx_test.go | 8 +- app/ante/evm/setup_test.go | 14 +- app/ante/evm/signverify_test.go | 8 +- app/ante/evm/sigs_test.go | 6 +- app/ante/evm/utils_test.go | 10 +- app/ante/evm_benchmark_test.go | 22 +- app/ante/handler_options.go | 6 +- app/ante/handler_options_test.go | 10 +- app/ante/integration_test.go | 8 +- app/ante/setup_test.go | 12 +- app/ante/sigverify.go | 2 +- app/ante/sigverify_test.go | 8 +- app/ante/utils/claim_rewards_test.go | 8 +- app/ante/utils/setup_test.go | 16 +- app/ante/utils_test.go | 4 +- app/app.go | 68 +++--- app/app_test.go | 4 +- app/ethtest_helper.go | 4 +- app/export.go | 2 +- app/keys.go | 12 +- app/post/burn.go | 2 +- app/post/burn_test.go | 4 +- app/post/post_test.go | 2 +- app/post/setup_test.go | 10 +- app/test_helpers.go | 8 +- app/upgrades/v16/incentives.go | 2 +- app/upgrades/v16/proposals.go | 2 +- app/upgrades/v16/setup_test.go | 10 +- app/upgrades/v16/upgrades.go | 14 +- app/upgrades/v16/upgrades_test.go | 14 +- client/config.go | 2 +- client/debug/debug.go | 4 +- client/docs/swagger-ui/swagger.json | 4 +- client/export.go | 4 +- client/import.go | 4 +- client/keys.go | 4 +- client/keys/add.go | 2 +- client/testnet.go | 12 +- cmd/config/config.go | 2 +- cmd/evmosd/cmd_test.go | 6 +- cmd/evmosd/genaccounts.go | 10 +- cmd/evmosd/main.go | 4 +- cmd/evmosd/migrate.go | 2 +- cmd/evmosd/root.go | 24 +-- cmd/evmosd/testnet.go | 18 +- cmd/evmosd/versiondb.go | 4 +- contracts/erc20.go | 4 +- contracts/erc20DirectBalanceManipulation.go | 4 +- contracts/erc20burnable.go | 2 +- contracts/erc20maliciousdelayed.go | 4 +- contracts/flash_loan.go | 2 +- crypto/codec/amino.go | 2 +- crypto/codec/codec.go | 2 +- crypto/ethsecp256k1/ethsecp256k1.go | 2 +- crypto/ethsecp256k1/keys.pb.go | 6 +- crypto/hd/algorithm.go | 2 +- crypto/hd/algorithm_test.go | 6 +- crypto/hd/benchmark_test.go | 2 +- crypto/keyring/options.go | 6 +- encoding/codec/codec.go | 4 +- encoding/config.go | 2 +- encoding/config_test.go | 8 +- ethereum/eip712/eip712_fuzzer_test.go | 2 +- ethereum/eip712/eip712_test.go | 12 +- ethereum/eip712/encoding.go | 2 +- ethereum/eip712/encoding_legacy.go | 2 +- ethereum/eip712/preprocess.go | 2 +- ethereum/eip712/preprocess_test.go | 14 +- go.mod | 2 +- ibc/testing/app.go | 6 +- ibc/testing/chain.go | 8 +- ibc/testing/coordinator.go | 2 +- ibc/utils.go | 4 +- ibc/utils_test.go | 2 +- indexer/kv_indexer.go | 6 +- indexer/kv_indexer_test.go | 14 +- precompiles/authorization/events.go | 2 +- precompiles/authorization/types.go | 2 +- precompiles/authorization/types_test.go | 8 +- precompiles/bank/bank.go | 4 +- precompiles/bank/integration_test.go | 23 ++- precompiles/bank/query_test.go | 4 +- precompiles/bank/setup_test.go | 12 +- precompiles/bank/testdata/bank.go | 2 +- precompiles/bank/types.go | 2 +- precompiles/bank/utils_test.go | 8 +- precompiles/bech32/bech32.go | 2 +- precompiles/bech32/bech32_test.go | 4 +- precompiles/bech32/methods.go | 2 +- precompiles/bech32/methods_test.go | 6 +- precompiles/bech32/setup_test.go | 6 +- precompiles/common/precompile.go | 2 +- precompiles/common/types.go | 2 +- precompiles/common/types_test.go | 4 +- precompiles/distribution/distribution.go | 2 +- precompiles/distribution/distribution_test.go | 8 +- precompiles/distribution/events.go | 2 +- precompiles/distribution/events_test.go | 6 +- precompiles/distribution/integration_test.go | 14 +- precompiles/distribution/query.go | 2 +- precompiles/distribution/query_test.go | 8 +- precompiles/distribution/setup_test.go | 8 +- precompiles/distribution/tx.go | 4 +- precompiles/distribution/tx_test.go | 10 +- precompiles/distribution/types.go | 2 +- precompiles/distribution/utils_test.go | 20 +- precompiles/erc20/approve.go | 4 +- precompiles/erc20/approve_test.go | 8 +- precompiles/erc20/erc20.go | 8 +- precompiles/erc20/erc20_test.go | 4 +- precompiles/erc20/errors.go | 6 +- precompiles/erc20/errors_test.go | 4 +- precompiles/erc20/events.go | 4 +- precompiles/erc20/events_test.go | 8 +- precompiles/erc20/integration_test.go | 26 +-- precompiles/erc20/query.go | 4 +- precompiles/erc20/query_test.go | 10 +- precompiles/erc20/setup_test.go | 10 +- .../erc20/testdata/erc20_allowance_caller.go | 2 +- .../erc20/testdata/erc20_no_metadata.go | 4 +- .../testdata/erc20minter_openzeppelinv5.go | 4 +- precompiles/erc20/tx_test.go | 8 +- precompiles/erc20/types_test.go | 4 +- precompiles/erc20/utils_test.go | 20 +- precompiles/ics20/approve.go | 2 +- precompiles/ics20/approve_common.go | 4 +- precompiles/ics20/approve_test.go | 8 +- precompiles/ics20/events.go | 2 +- precompiles/ics20/events_test.go | 8 +- precompiles/ics20/ics20.go | 6 +- precompiles/ics20/integration_test.go | 26 +-- precompiles/ics20/query.go | 4 +- precompiles/ics20/query_test.go | 8 +- precompiles/ics20/setup_test.go | 10 +- precompiles/ics20/tx_test.go | 10 +- precompiles/ics20/types.go | 4 +- precompiles/ics20/utils_test.go | 34 +-- precompiles/outposts/osmosis/events.go | 2 +- precompiles/outposts/osmosis/events_test.go | 8 +- precompiles/outposts/osmosis/osmosis.go | 6 +- precompiles/outposts/osmosis/setup_test.go | 10 +- precompiles/outposts/osmosis/tx.go | 2 +- precompiles/outposts/osmosis/tx_test.go | 20 +- precompiles/outposts/osmosis/types.go | 4 +- precompiles/outposts/osmosis/types_test.go | 6 +- precompiles/outposts/stride/events.go | 2 +- precompiles/outposts/stride/events_test.go | 6 +- precompiles/outposts/stride/setup_test.go | 10 +- precompiles/outposts/stride/stride.go | 6 +- precompiles/outposts/stride/tx.go | 4 +- precompiles/outposts/stride/tx_test.go | 8 +- precompiles/outposts/stride/types.go | 4 +- precompiles/outposts/stride/types_test.go | 2 +- precompiles/outposts/stride/utils_test.go | 8 +- precompiles/p256/integration_test.go | 14 +- precompiles/p256/p256.go | 2 +- precompiles/p256/p256_test.go | 2 +- precompiles/p256/setup_test.go | 2 +- precompiles/staking/approve.go | 4 +- precompiles/staking/approve_test.go | 12 +- precompiles/staking/events.go | 4 +- precompiles/staking/events_test.go | 6 +- precompiles/staking/integration_test.go | 22 +- precompiles/staking/query.go | 4 +- precompiles/staking/query_test.go | 8 +- precompiles/staking/setup_test.go | 8 +- precompiles/staking/staking.go | 4 +- precompiles/staking/staking_test.go | 10 +- .../staking/testdata/staking_caller.go | 2 +- precompiles/staking/tx.go | 4 +- precompiles/staking/tx_test.go | 8 +- precompiles/staking/types.go | 2 +- precompiles/staking/utils_test.go | 26 +-- precompiles/testutil/contracts/contracts.go | 10 +- .../testutil/contracts/distribution_caller.go | 2 +- .../testutil/contracts/interchain_sender.go | 2 +- precompiles/testutil/contracts/types.go | 2 +- precompiles/testutil/errors.go | 2 +- precompiles/testutil/events.go | 2 +- precompiles/testutil/logs.go | 2 +- precompiles/vesting/approve.go | 4 +- precompiles/vesting/events.go | 6 +- precompiles/vesting/integration_test.go | 16 +- precompiles/vesting/query_test.go | 4 +- precompiles/vesting/setup_test.go | 8 +- .../vesting/testdata/vesting_caller.go | 2 +- precompiles/vesting/tx.go | 2 +- precompiles/vesting/tx_test.go | 16 +- precompiles/vesting/types.go | 6 +- precompiles/vesting/utils_test.go | 26 +-- precompiles/vesting/vesting.go | 6 +- precompiles/werc20/integration_test.go | 20 +- precompiles/werc20/setup_test.go | 10 +- precompiles/werc20/testdata/wevmos.go | 2 +- precompiles/werc20/utils_test.go | 12 +- precompiles/werc20/werc20.go | 8 +- .../crypto/v1/ethsecp256k1/keys.proto | 2 +- proto/ethermint/evm/v1/events.proto | 2 +- proto/ethermint/evm/v1/evm.proto | 2 +- proto/ethermint/evm/v1/genesis.proto | 2 +- proto/ethermint/evm/v1/query.proto | 2 +- proto/ethermint/evm/v1/tx.proto | 2 +- proto/ethermint/feemarket/v1/events.proto | 2 +- proto/ethermint/feemarket/v1/feemarket.proto | 2 +- proto/ethermint/feemarket/v1/genesis.proto | 2 +- proto/ethermint/feemarket/v1/query.proto | 2 +- proto/ethermint/feemarket/v1/tx.proto | 2 +- proto/ethermint/types/v1/account.proto | 2 +- proto/ethermint/types/v1/dynamic_fee.proto | 2 +- proto/ethermint/types/v1/indexer.proto | 2 +- proto/ethermint/types/v1/web3.proto | 2 +- proto/evmos/epochs/v1/genesis.proto | 2 +- proto/evmos/epochs/v1/query.proto | 2 +- proto/evmos/erc20/v1/erc20.proto | 2 +- proto/evmos/erc20/v1/events.proto | 2 +- proto/evmos/erc20/v1/genesis.proto | 2 +- proto/evmos/erc20/v1/query.proto | 2 +- proto/evmos/erc20/v1/tx.proto | 2 +- proto/evmos/incentives/v1/genesis.proto | 2 +- proto/evmos/incentives/v1/incentives.proto | 2 +- proto/evmos/inflation/v1/genesis.proto | 2 +- proto/evmos/inflation/v1/inflation.proto | 2 +- proto/evmos/inflation/v1/query.proto | 2 +- proto/evmos/inflation/v1/tx.proto | 2 +- proto/evmos/vesting/v1/vesting.proto | 2 +- proto/evmos/vesting/v2/events.proto | 2 +- proto/evmos/vesting/v2/query.proto | 2 +- proto/evmos/vesting/v2/tx.proto | 2 +- proto/evmos/vesting/v2/vesting.proto | 2 +- rpc/apis.go | 20 +- rpc/backend/account_info.go | 4 +- rpc/backend/account_info_test.go | 8 +- rpc/backend/backend.go | 8 +- rpc/backend/backend_suite_test.go | 18 +- rpc/backend/blocks.go | 4 +- rpc/backend/blocks_test.go | 8 +- rpc/backend/call_tx.go | 6 +- rpc/backend/call_tx_test.go | 8 +- rpc/backend/chain_info.go | 8 +- rpc/backend/chain_info_test.go | 10 +- rpc/backend/client_test.go | 6 +- rpc/backend/evm_query_client_test.go | 8 +- rpc/backend/feemarket_query_client_test.go | 6 +- rpc/backend/filters_test.go | 6 +- rpc/backend/mocks/evm_query_client.go | 2 +- rpc/backend/mocks/feemarket_query_client.go | 2 +- rpc/backend/node_info.go | 10 +- rpc/backend/node_info_test.go | 6 +- rpc/backend/sign_tx.go | 2 +- rpc/backend/sign_tx_test.go | 8 +- rpc/backend/tracing.go | 4 +- rpc/backend/tracing_test.go | 8 +- rpc/backend/tx_info.go | 6 +- rpc/backend/tx_info_test.go | 10 +- rpc/backend/utils.go | 4 +- rpc/namespaces/ethereum/debug/api.go | 6 +- rpc/namespaces/ethereum/eth/api.go | 8 +- rpc/namespaces/ethereum/eth/filters/api.go | 4 +- .../ethereum/eth/filters/filter_system.go | 4 +- .../eth/filters/filter_system_test.go | 2 +- .../ethereum/eth/filters/filters.go | 4 +- rpc/namespaces/ethereum/miner/api.go | 2 +- rpc/namespaces/ethereum/net/api.go | 2 +- rpc/namespaces/ethereum/personal/api.go | 8 +- rpc/namespaces/ethereum/txpool/api.go | 2 +- rpc/namespaces/ethereum/web3/api.go | 2 +- rpc/types/block.go | 2 +- rpc/types/events.go | 4 +- rpc/types/events_test.go | 2 +- rpc/types/query_client.go | 4 +- rpc/types/utils.go | 4 +- rpc/websockets.go | 10 +- server/config/config_test.go | 2 +- server/indexer_cmd.go | 2 +- server/indexer_service.go | 2 +- server/json_rpc.go | 6 +- server/start.go | 12 +- server/util.go | 2 +- tests/e2e/e2e_suite_test.go | 8 +- tests/e2e/tx_test.go | 4 +- tests/e2e/upgrade/balances_test.go | 6 +- tests/e2e/upgrade/manager.go | 4 +- tests/integration/ledger/evmosd_suite_test.go | 16 +- tests/integration/ledger/ledger_test.go | 12 +- testutil/abci.go | 6 +- testutil/ante.go | 4 +- testutil/contract.go | 6 +- testutil/fund.go | 4 +- testutil/integration.go | 4 +- .../integration/common/factory/factory.go | 4 +- testutil/integration/common/grpc/account.go | 4 +- testutil/integration/common/grpc/authz.go | 4 +- testutil/integration/common/grpc/grpc.go | 2 +- .../integration/evmos/factory/broadcast.go | 4 +- testutil/integration/evmos/factory/build.go | 4 +- testutil/integration/evmos/factory/factory.go | 14 +- testutil/integration/evmos/factory/helpers.go | 6 +- testutil/integration/evmos/factory/sign.go | 4 +- testutil/integration/evmos/factory/types.go | 2 +- testutil/integration/evmos/grpc/evm.go | 2 +- testutil/integration/evmos/grpc/feemarket.go | 2 +- testutil/integration/evmos/grpc/grpc.go | 8 +- testutil/integration/evmos/keyring/keyring.go | 2 +- testutil/integration/evmos/network/clients.go | 12 +- testutil/integration/evmos/network/config.go | 6 +- .../integration/evmos/network/config_test.go | 8 +- testutil/integration/evmos/network/network.go | 14 +- testutil/integration/evmos/network/params.go | 6 +- testutil/integration/evmos/network/setup.go | 12 +- .../integration/evmos/network/unit_network.go | 6 +- testutil/integration/evmos/utils/bank.go | 2 +- testutil/integration/evmos/utils/bank_test.go | 8 +- testutil/integration/evmos/utils/contracts.go | 6 +- testutil/integration/evmos/utils/erc20.go | 6 +- testutil/integration/evmos/utils/gov.go | 6 +- testutil/integration/evmos/utils/unit.go | 8 +- .../ibc/coordinator/coordinator.go | 6 +- testutil/integration/ibc/coordinator/utils.go | 2 +- testutil/network/network.go | 12 +- testutil/network/network_test.go | 6 +- testutil/network/util.go | 6 +- testutil/staking-rewards.go | 6 +- testutil/statedb.go | 4 +- testutil/tx/cosmos.go | 4 +- testutil/tx/eip712.go | 8 +- testutil/tx/eth.go | 8 +- testutil/tx/signer.go | 2 +- types/account.pb.go | 4 +- types/account_test.go | 8 +- types/dynamic_fee.pb.go | 4 +- types/indexer.pb.go | 4 +- types/validation_test.go | 4 +- types/web3.pb.go | 4 +- utils/utils.go | 2 +- utils/utils_test.go | 2 +- wallets/ledger/ledger.go | 6 +- wallets/ledger/ledger_suite_test.go | 6 +- wallets/ledger/ledger_test.go | 10 +- wallets/ledger/mocks/wallet.go | 2 +- wallets/ledger/wallet_test.go | 6 +- wallets/usbwallet/hub.go | 2 +- wallets/usbwallet/wallet.go | 2 +- x/epochs/client/cli/query.go | 2 +- x/epochs/genesis.go | 4 +- x/epochs/genesis_test.go | 10 +- x/epochs/keeper/abci.go | 2 +- x/epochs/keeper/abci_test.go | 4 +- x/epochs/keeper/epoch_infos.go | 2 +- x/epochs/keeper/epoch_infos_test.go | 2 +- x/epochs/keeper/grpc_query.go | 2 +- x/epochs/keeper/grpc_query_test.go | 2 +- x/epochs/keeper/hooks.go | 2 +- x/epochs/keeper/keeper.go | 2 +- x/epochs/keeper/setup_test.go | 6 +- x/epochs/keeper/utils_test.go | 10 +- x/epochs/module.go | 6 +- x/epochs/types/genesis.pb.go | 4 +- x/epochs/types/query.pb.go | 52 ++--- x/erc20/client/cli/query.go | 2 +- x/erc20/client/cli/tx.go | 4 +- x/erc20/client/proposal_handler.go | 2 +- x/erc20/genesis.go | 4 +- x/erc20/genesis_test.go | 12 +- x/erc20/ibc_middleware.go | 4 +- x/erc20/keeper/erc20_utils_test.go | 6 +- x/erc20/keeper/evm.go | 8 +- x/erc20/keeper/evm_test.go | 12 +- x/erc20/keeper/grpc_query.go | 4 +- x/erc20/keeper/grpc_query_test.go | 4 +- x/erc20/keeper/ibc_callbacks.go | 4 +- .../keeper/ibc_callbacks_integration_test.go | 12 +- x/erc20/keeper/ibc_callbacks_test.go | 18 +- x/erc20/keeper/integration_test.go | 10 +- x/erc20/keeper/keeper.go | 4 +- x/erc20/keeper/migrations.go | 4 +- x/erc20/keeper/migrations_test.go | 10 +- x/erc20/keeper/mint.go | 2 +- x/erc20/keeper/mint_test.go | 4 +- x/erc20/keeper/msg_server.go | 4 +- x/erc20/keeper/msg_server_test.go | 10 +- x/erc20/keeper/params.go | 2 +- x/erc20/keeper/params_test.go | 2 +- x/erc20/keeper/precompiles.go | 6 +- x/erc20/keeper/precompiles_test.go | 10 +- x/erc20/keeper/proposals.go | 2 +- x/erc20/keeper/proposals_test.go | 10 +- x/erc20/keeper/setup_test.go | 8 +- x/erc20/keeper/token_pairs.go | 4 +- x/erc20/keeper/token_pairs_test.go | 6 +- x/erc20/keeper/utils_test.go | 28 +-- x/erc20/migrations/v3/migration.go | 4 +- x/erc20/migrations/v3/migration_test.go | 10 +- x/erc20/migrations/v3/types/genesis.pb.go | 2 +- x/erc20/migrations/v3/types/params.go | 2 +- x/erc20/module.go | 6 +- x/erc20/proposal_handler.go | 4 +- x/erc20/types/erc20.pb.go | 4 +- x/erc20/types/events.pb.go | 40 ++-- x/erc20/types/evm_test.go | 2 +- x/erc20/types/genesis.pb.go | 4 +- x/erc20/types/genesis_test.go | 2 +- x/erc20/types/interfaces.go | 4 +- x/erc20/types/mocks/EVMKeeper.go | 4 +- x/erc20/types/msg_test.go | 4 +- x/erc20/types/params_test.go | 2 +- x/erc20/types/proposal.go | 2 +- x/erc20/types/proposal_test.go | 4 +- x/erc20/types/query.pb.go | 60 +++--- x/erc20/types/token_pair.go | 2 +- x/erc20/types/token_pair_test.go | 4 +- x/erc20/types/tx.pb.go | 74 +++---- x/erc20/types/utils_test.go | 2 +- x/evm/ante/ctx_test.go | 4 +- x/evm/client/cli/query.go | 4 +- x/evm/client/cli/tx.go | 4 +- x/evm/genesis.go | 6 +- x/evm/genesis_test.go | 14 +- x/evm/keeper/abci_test.go | 2 +- x/evm/keeper/benchmark_test.go | 4 +- x/evm/keeper/config.go | 4 +- x/evm/keeper/fees.go | 2 +- x/evm/keeper/fees_test.go | 4 +- x/evm/keeper/gas.go | 2 +- x/evm/keeper/grpc_query.go | 8 +- x/evm/keeper/grpc_query_test.go | 8 +- x/evm/keeper/integration_test.go | 16 +- x/evm/keeper/keeper.go | 6 +- x/evm/keeper/keeper_test.go | 8 +- x/evm/keeper/migrations.go | 8 +- x/evm/keeper/migrations_test.go | 4 +- x/evm/keeper/msg_server.go | 2 +- x/evm/keeper/msg_server_test.go | 4 +- x/evm/keeper/params.go | 2 +- x/evm/keeper/params_benchmark_test.go | 2 +- x/evm/keeper/params_test.go | 2 +- x/evm/keeper/precompiles.go | 28 +-- x/evm/keeper/precompiles_test.go | 4 +- x/evm/keeper/setup_test.go | 18 +- x/evm/keeper/state_transition.go | 6 +- .../keeper/state_transition_benchmark_test.go | 2 +- x/evm/keeper/state_transition_test.go | 8 +- x/evm/keeper/statedb.go | 6 +- x/evm/keeper/statedb_benchmark_test.go | 2 +- x/evm/keeper/statedb_test.go | 8 +- x/evm/keeper/utils_test.go | 8 +- x/evm/migrations/v4/migrate.go | 4 +- x/evm/migrations/v4/migrate_test.go | 10 +- x/evm/migrations/v5/migrate.go | 4 +- x/evm/migrations/v5/migrate_test.go | 10 +- x/evm/migrations/v6/migrate.go | 6 +- x/evm/migrations/v6/migrate_test.go | 10 +- x/evm/module.go | 6 +- x/evm/statedb/config.go | 2 +- x/evm/statedb/integration_test.go | 14 +- x/evm/statedb/mock_test.go | 2 +- x/evm/statedb/statedb_test.go | 2 +- x/evm/types/access_list_test.go | 2 +- x/evm/types/access_list_tx.go | 2 +- x/evm/types/access_list_tx_test.go | 2 +- x/evm/types/dynamic_fee_tx.go | 2 +- x/evm/types/dynamic_fee_tx_test.go | 4 +- x/evm/types/events.pb.go | 42 ++-- x/evm/types/evm.pb.go | 194 +++++++++--------- x/evm/types/genesis.go | 2 +- x/evm/types/genesis.pb.go | 36 ++-- x/evm/types/genesis_test.go | 2 +- x/evm/types/interfaces.go | 2 +- x/evm/types/legacy_tx.go | 2 +- x/evm/types/legacy_tx_test.go | 2 +- x/evm/types/logs.go | 2 +- x/evm/types/logs_test.go | 4 +- x/evm/types/msg.go | 2 +- x/evm/types/msg_test.go | 10 +- x/evm/types/params.go | 6 +- x/evm/types/query.pb.go | 188 ++++++++--------- x/evm/types/tx.pb.go | 120 +++++------ x/evm/types/tx_args_test.go | 2 +- x/evm/types/utils_test.go | 8 +- x/feemarket/client/cli/query.go | 2 +- x/feemarket/genesis.go | 4 +- x/feemarket/keeper/abci.go | 2 +- x/feemarket/keeper/grpc_query.go | 2 +- x/feemarket/keeper/grpc_query_test.go | 2 +- x/feemarket/keeper/integration_test.go | 8 +- x/feemarket/keeper/keeper.go | 2 +- x/feemarket/keeper/migrations.go | 4 +- x/feemarket/keeper/migrations_test.go | 4 +- x/feemarket/keeper/msg_server.go | 2 +- x/feemarket/keeper/msg_server_test.go | 2 +- x/feemarket/keeper/params.go | 2 +- x/feemarket/keeper/params_test.go | 2 +- x/feemarket/keeper/setup_test.go | 6 +- x/feemarket/keeper/utils_test.go | 18 +- x/feemarket/migrations/v4/migrate.go | 2 +- x/feemarket/migrations/v4/migrate_test.go | 8 +- x/feemarket/migrations/v4/types/params.go | 2 +- x/feemarket/module.go | 6 +- x/feemarket/types/events.pb.go | 6 +- x/feemarket/types/feemarket.pb.go | 46 ++--- x/feemarket/types/genesis.pb.go | 6 +- x/feemarket/types/query.pb.go | 54 ++--- x/feemarket/types/tx.pb.go | 4 +- x/ibc/transfer/ibc_module.go | 2 +- x/ibc/transfer/keeper/keeper.go | 2 +- x/ibc/transfer/keeper/keeper_test.go | 24 +-- x/ibc/transfer/keeper/msg_server.go | 2 +- x/ibc/transfer/keeper/msg_server_test.go | 4 +- x/ibc/transfer/module.go | 2 +- x/ibc/transfer/types/interfaces.go | 2 +- x/incentives/module.go | 2 +- x/incentives/types/genesis.pb.go | 46 ++--- x/incentives/types/incentives.pb.go | 4 +- x/incentives/types/proposal.go | 2 +- x/inflation/v1/client/cli/query.go | 2 +- x/inflation/v1/genesis.go | 4 +- x/inflation/v1/keeper/epoch_info.go | 2 +- x/inflation/v1/keeper/epoch_info_test.go | 4 +- x/inflation/v1/keeper/grpc_query.go | 2 +- x/inflation/v1/keeper/grpc_query_test.go | 4 +- x/inflation/v1/keeper/hooks.go | 4 +- x/inflation/v1/keeper/hooks_test.go | 4 +- x/inflation/v1/keeper/inflation.go | 6 +- x/inflation/v1/keeper/inflation_test.go | 4 +- x/inflation/v1/keeper/integration_test.go | 4 +- x/inflation/v1/keeper/keeper.go | 2 +- x/inflation/v1/keeper/migrations.go | 6 +- x/inflation/v1/keeper/migrations_test.go | 10 +- x/inflation/v1/keeper/msg_server.go | 2 +- x/inflation/v1/keeper/msg_server_test.go | 2 +- x/inflation/v1/keeper/params.go | 2 +- x/inflation/v1/keeper/params_test.go | 2 +- x/inflation/v1/keeper/periods.go | 2 +- x/inflation/v1/keeper/setup_test.go | 6 +- x/inflation/v1/keeper/utils_test.go | 12 +- x/inflation/v1/migrations/v2/migrate.go | 4 +- x/inflation/v1/migrations/v2/migrate_test.go | 10 +- x/inflation/v1/migrations/v2/types/params.go | 4 +- x/inflation/v1/migrations/v3/migrate_test.go | 4 +- x/inflation/v1/module.go | 6 +- x/inflation/v1/types/genesis.go | 2 +- x/inflation/v1/types/genesis.pb.go | 50 ++--- x/inflation/v1/types/genesis_test.go | 2 +- x/inflation/v1/types/inflation.pb.go | 46 ++--- x/inflation/v1/types/inflation_calculation.go | 2 +- x/inflation/v1/types/params.go | 2 +- x/inflation/v1/types/query.pb.go | 18 +- x/inflation/v1/types/tx.pb.go | 4 +- x/vesting/client/cli/query.go | 2 +- x/vesting/client/cli/tx.go | 2 +- x/vesting/client/proposal_handler.go | 2 +- x/vesting/handler.go | 2 +- x/vesting/keeper/gov.go | 2 +- x/vesting/keeper/gov_test.go | 2 +- x/vesting/keeper/grpc_query.go | 2 +- x/vesting/keeper/grpc_query_test.go | 4 +- x/vesting/keeper/hooks.go | 2 +- x/vesting/keeper/integration_test.go | 16 +- x/vesting/keeper/keeper.go | 2 +- x/vesting/keeper/keeper_test.go | 8 +- x/vesting/keeper/migrations.go | 2 +- x/vesting/keeper/migrations_test.go | 8 +- x/vesting/keeper/msg_server.go | 4 +- x/vesting/keeper/msg_server_test.go | 8 +- x/vesting/keeper/setup_test.go | 6 +- x/vesting/keeper/utils.go | 2 +- x/vesting/keeper/utils_test.go | 26 +-- x/vesting/migrations/types/vesting.pb.go | 6 +- x/vesting/migrations/v2/migrate.go | 4 +- x/vesting/module.go | 6 +- x/vesting/proposal_handler.go | 4 +- x/vesting/proposal_handler_test.go | 8 +- x/vesting/setup_test.go | 2 +- .../types/clawback_vesting_account_test.go | 4 +- x/vesting/types/codec.go | 2 +- x/vesting/types/events.pb.go | 38 ++-- x/vesting/types/msg_test.go | 4 +- x/vesting/types/proposal_test.go | 2 +- x/vesting/types/query.pb.go | 48 ++--- x/vesting/types/tx.pb.go | 102 ++++----- x/vesting/types/vesting.pb.go | 62 +++--- x/vesting/utils_test.go | 14 +- 621 files changed, 2403 insertions(+), 2402 deletions(-) diff --git a/.github/workflows/consensuswarn.yml b/.github/workflows/consensuswarn.yml index 41d2ef9135..677f8500ce 100644 --- a/.github/workflows/consensuswarn.yml +++ b/.github/workflows/consensuswarn.yml @@ -10,10 +10,10 @@ on: jobs: main: permissions: - pull-requests: write # For reading the PR and posting comment + pull-requests: write # For reading the PR and posting comment runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: orijtech/consensuswarn@main with: - roots: 'github.com/evmos/evmos/v16/app.Evmos.DeliverTx,github.com/evmos/evmos/v16/app.Evmos.BeginBlocker,github.com/evmos/evmos/v16/app.Evmos.EndBlocker' + roots: "github.com/evmos/evmos/v17/app.Evmos.DeliverTx,github.com/evmos/evmos/v17/app.Evmos.BeginBlocker,github.com/evmos/evmos/v17/app.Evmos.EndBlocker" diff --git a/app/ante/cosmos.go b/app/ante/cosmos.go index a5212894bb..c193068223 100644 --- a/app/ante/cosmos.go +++ b/app/ante/cosmos.go @@ -8,9 +8,9 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/ante" sdkvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" ibcante "github.com/cosmos/ibc-go/v7/modules/core/ante" - cosmosante "github.com/evmos/evmos/v16/app/ante/cosmos" - evmante "github.com/evmos/evmos/v16/app/ante/evm" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + cosmosante "github.com/evmos/evmos/v17/app/ante/cosmos" + evmante "github.com/evmos/evmos/v17/app/ante/evm" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) // newCosmosAnteHandler creates the default ante handler for Cosmos transactions diff --git a/app/ante/cosmos/authz_test.go b/app/ante/cosmos/authz_test.go index 8dc363132f..25f59bc705 100644 --- a/app/ante/cosmos/authz_test.go +++ b/app/ante/cosmos/authz_test.go @@ -18,10 +18,10 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" ethtypes "github.com/ethereum/go-ethereum/core/types" - cosmosante "github.com/evmos/evmos/v16/app/ante/cosmos" - testutil "github.com/evmos/evmos/v16/testutil" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + cosmosante "github.com/evmos/evmos/v17/app/ante/cosmos" + testutil "github.com/evmos/evmos/v17/testutil" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) func TestAuthzLimiterDecorator(t *testing.T) { diff --git a/app/ante/cosmos/eip712.go b/app/ante/cosmos/eip712.go index 9a5d62fc8b..a1bb98090f 100644 --- a/app/ante/cosmos/eip712.go +++ b/app/ante/cosmos/eip712.go @@ -19,11 +19,11 @@ import ( ethcrypto "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/crypto/secp256k1" "github.com/ethereum/go-ethereum/signer/core/apitypes" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" - "github.com/evmos/evmos/v16/ethereum/eip712" - "github.com/evmos/evmos/v16/types" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + "github.com/evmos/evmos/v17/ethereum/eip712" + "github.com/evmos/evmos/v17/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) var evmosCodec codec.ProtoCodecMarshaler diff --git a/app/ante/cosmos/fees.go b/app/ante/cosmos/fees.go index e5cf4c782d..914fa41415 100644 --- a/app/ante/cosmos/fees.go +++ b/app/ante/cosmos/fees.go @@ -13,7 +13,7 @@ import ( errortypes "github.com/cosmos/cosmos-sdk/types/errors" authante "github.com/cosmos/cosmos-sdk/x/auth/ante" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - anteutils "github.com/evmos/evmos/v16/app/ante/utils" + anteutils "github.com/evmos/evmos/v17/app/ante/utils" ) // DeductFeeDecorator deducts fees from the first signer of the tx. diff --git a/app/ante/cosmos/fees_benchmark_test.go b/app/ante/cosmos/fees_benchmark_test.go index bde25de066..6c46df5f98 100644 --- a/app/ante/cosmos/fees_benchmark_test.go +++ b/app/ante/cosmos/fees_benchmark_test.go @@ -6,8 +6,8 @@ import ( "time" sdkmath "cosmossdk.io/math" - "github.com/evmos/evmos/v16/testutil" - testutiltx "github.com/evmos/evmos/v16/testutil/tx" + "github.com/evmos/evmos/v17/testutil" + testutiltx "github.com/evmos/evmos/v17/testutil/tx" ) // This tests setup contains expensive operations. diff --git a/app/ante/cosmos/fees_test.go b/app/ante/cosmos/fees_test.go index b4086eddd0..dec3e217db 100644 --- a/app/ante/cosmos/fees_test.go +++ b/app/ante/cosmos/fees_test.go @@ -6,10 +6,10 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/feegrant" - cosmosante "github.com/evmos/evmos/v16/app/ante/cosmos" - "github.com/evmos/evmos/v16/testutil" - testutiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/utils" + cosmosante "github.com/evmos/evmos/v17/app/ante/cosmos" + "github.com/evmos/evmos/v17/testutil" + testutiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v17/utils" ) type deductFeeDecoratorTestCase struct { diff --git a/app/ante/cosmos/min_price.go b/app/ante/cosmos/min_price.go index 2d86529590..fb5de81c95 100644 --- a/app/ante/cosmos/min_price.go +++ b/app/ante/cosmos/min_price.go @@ -9,7 +9,7 @@ import ( errorsmod "cosmossdk.io/errors" "cosmossdk.io/math" - evmante "github.com/evmos/evmos/v16/app/ante/evm" + evmante "github.com/evmos/evmos/v17/app/ante/evm" sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" diff --git a/app/ante/cosmos/min_price_test.go b/app/ante/cosmos/min_price_test.go index 60716c87df..9984302f8c 100644 --- a/app/ante/cosmos/min_price_test.go +++ b/app/ante/cosmos/min_price_test.go @@ -7,10 +7,10 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - cosmosante "github.com/evmos/evmos/v16/app/ante/cosmos" - "github.com/evmos/evmos/v16/testutil" - testutiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/utils" + cosmosante "github.com/evmos/evmos/v17/app/ante/cosmos" + "github.com/evmos/evmos/v17/testutil" + testutiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v17/utils" ) var execTypes = []struct { diff --git a/app/ante/cosmos/reject_msgs.go b/app/ante/cosmos/reject_msgs.go index a28dc964cf..2467119a1c 100644 --- a/app/ante/cosmos/reject_msgs.go +++ b/app/ante/cosmos/reject_msgs.go @@ -6,7 +6,7 @@ import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) // RejectMessagesDecorator prevents invalid msg types from being executed diff --git a/app/ante/cosmos/setup_test.go b/app/ante/cosmos/setup_test.go index 9bc8cd52f8..5552082dbf 100644 --- a/app/ante/cosmos/setup_test.go +++ b/app/ante/cosmos/setup_test.go @@ -20,18 +20,18 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/app/ante" - evmante "github.com/evmos/evmos/v16/app/ante/evm" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" - "github.com/evmos/evmos/v16/encoding" - "github.com/evmos/evmos/v16/ethereum/eip712" - "github.com/evmos/evmos/v16/testutil" - "github.com/evmos/evmos/v16/types" - "github.com/evmos/evmos/v16/utils" - "github.com/evmos/evmos/v16/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/app/ante" + evmante "github.com/evmos/evmos/v17/app/ante/evm" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + "github.com/evmos/evmos/v17/encoding" + "github.com/evmos/evmos/v17/ethereum/eip712" + "github.com/evmos/evmos/v17/testutil" + "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v17/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" ) type AnteTestSuite struct { diff --git a/app/ante/cosmos/utils_test.go b/app/ante/cosmos/utils_test.go index 563be6e26f..90593a950a 100644 --- a/app/ante/cosmos/utils_test.go +++ b/app/ante/cosmos/utils_test.go @@ -13,12 +13,12 @@ import ( authsigning "github.com/cosmos/cosmos-sdk/x/auth/signing" "github.com/cosmos/cosmos-sdk/x/authz" - "github.com/evmos/evmos/v16/app" - cosmosante "github.com/evmos/evmos/v16/app/ante/cosmos" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" - "github.com/evmos/evmos/v16/encoding" - testutil "github.com/evmos/evmos/v16/testutil" - testutiltx "github.com/evmos/evmos/v16/testutil/tx" + "github.com/evmos/evmos/v17/app" + cosmosante "github.com/evmos/evmos/v17/app/ante/cosmos" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + "github.com/evmos/evmos/v17/encoding" + testutil "github.com/evmos/evmos/v17/testutil" + testutiltx "github.com/evmos/evmos/v17/testutil/tx" ) func (suite *AnteTestSuite) CreateTestCosmosTxBuilder(gasPrice sdkmath.Int, denom string, msgs ...sdk.Msg) client.TxBuilder { diff --git a/app/ante/cosmos/vesting.go b/app/ante/cosmos/vesting.go index 82aa81fe03..19bd8b296d 100644 --- a/app/ante/cosmos/vesting.go +++ b/app/ante/cosmos/vesting.go @@ -10,9 +10,9 @@ import ( "github.com/cosmos/cosmos-sdk/x/authz" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - anteutils "github.com/evmos/evmos/v16/app/ante/utils" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - vestingtypes "github.com/evmos/evmos/v16/x/vesting/types" + anteutils "github.com/evmos/evmos/v17/app/ante/utils" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" + vestingtypes "github.com/evmos/evmos/v17/x/vesting/types" ) // TODO: remove once Cosmos SDK is upgraded to v0.46 diff --git a/app/ante/evm.go b/app/ante/evm.go index 8c8944dd18..5a928f11a4 100644 --- a/app/ante/evm.go +++ b/app/ante/evm.go @@ -5,7 +5,7 @@ package ante import ( sdk "github.com/cosmos/cosmos-sdk/types" - evmante "github.com/evmos/evmos/v16/app/ante/evm" + evmante "github.com/evmos/evmos/v17/app/ante/evm" ) func newMonoEVMAnteHandler(options HandlerOptions) sdk.AnteHandler { diff --git a/app/ante/evm/01_setup_ctx.go b/app/ante/evm/01_setup_ctx.go index 0f85f8c0f8..b5bc8cfbed 100644 --- a/app/ante/evm/01_setup_ctx.go +++ b/app/ante/evm/01_setup_ctx.go @@ -8,7 +8,7 @@ import ( sdktypes "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" authante "github.com/cosmos/cosmos-sdk/x/auth/ante" - evmante "github.com/evmos/evmos/v16/x/evm/ante" + evmante "github.com/evmos/evmos/v17/x/evm/ante" ) var _ sdktypes.AnteDecorator = &EthSetupContextDecorator{} diff --git a/app/ante/evm/02_mempool_fee_test.go b/app/ante/evm/02_mempool_fee_test.go index 558b06d9d2..207e093760 100644 --- a/app/ante/evm/02_mempool_fee_test.go +++ b/app/ante/evm/02_mempool_fee_test.go @@ -5,7 +5,7 @@ package evm_test import ( sdkmath "cosmossdk.io/math" errortypes "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/evmos/evmos/v16/app/ante/evm" + "github.com/evmos/evmos/v17/app/ante/evm" ) func (suite *EvmAnteTestSuite) TestMempoolFee() { diff --git a/app/ante/evm/03_global_fee_test.go b/app/ante/evm/03_global_fee_test.go index 1e6aa544e7..6ec245ad84 100644 --- a/app/ante/evm/03_global_fee_test.go +++ b/app/ante/evm/03_global_fee_test.go @@ -5,7 +5,7 @@ package evm_test import ( sdkmath "cosmossdk.io/math" errortypes "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/evmos/evmos/v16/app/ante/evm" + "github.com/evmos/evmos/v17/app/ante/evm" ) func (suite *EvmAnteTestSuite) TestGlobalFee() { diff --git a/app/ante/evm/04_validate.go b/app/ante/evm/04_validate.go index 2f79a626ba..0e47c6710b 100644 --- a/app/ante/evm/04_validate.go +++ b/app/ante/evm/04_validate.go @@ -9,7 +9,7 @@ import ( sdktypes "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/types/tx" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) // ValidateMsg validates an Ethereum specific message type and returns an error if invalid diff --git a/app/ante/evm/04_validate_test.go b/app/ante/evm/04_validate_test.go index f60f4be802..1561ce4a91 100644 --- a/app/ante/evm/04_validate_test.go +++ b/app/ante/evm/04_validate_test.go @@ -8,9 +8,9 @@ import ( sdktypes "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/app/ante/evm" - testkeyring "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/app/ante/evm" + testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) type validateMsgParams struct { diff --git a/app/ante/evm/05_signature_verification.go b/app/ante/evm/05_signature_verification.go index a82add44a5..7e6722d73d 100644 --- a/app/ante/evm/05_signature_verification.go +++ b/app/ante/evm/05_signature_verification.go @@ -9,7 +9,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" ethtypes "github.com/ethereum/go-ethereum/core/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) // EthSigVerificationDecorator validates an ethereum signatures diff --git a/app/ante/evm/06_account_verification.go b/app/ante/evm/06_account_verification.go index af9671e24a..95391f7cd7 100644 --- a/app/ante/evm/06_account_verification.go +++ b/app/ante/evm/06_account_verification.go @@ -8,9 +8,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/x/evm/keeper" - "github.com/evmos/evmos/v16/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/x/evm/keeper" + "github.com/evmos/evmos/v17/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) // VerifyAccountBalance checks that the account balance is greater than the total transaction cost. diff --git a/app/ante/evm/06_account_verification_test.go b/app/ante/evm/06_account_verification_test.go index f664ddcc8e..31430ea7a3 100644 --- a/app/ante/evm/06_account_verification_test.go +++ b/app/ante/evm/06_account_verification_test.go @@ -7,13 +7,13 @@ import ( "cosmossdk.io/math" errortypes "github.com/cosmos/cosmos-sdk/types/errors" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/app/ante/evm" - "github.com/evmos/evmos/v16/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v16/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v16/testutil/integration/evmos/network" - "github.com/evmos/evmos/v16/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/app/ante/evm" + "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v17/testutil/integration/evmos/network" + "github.com/evmos/evmos/v17/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) func (suite *EvmAnteTestSuite) TestVerifyAccountBalance() { diff --git a/app/ante/evm/07_can_transfer.go b/app/ante/evm/07_can_transfer.go index c5e2ab3251..0d8702caba 100644 --- a/app/ante/evm/07_can_transfer.go +++ b/app/ante/evm/07_can_transfer.go @@ -11,8 +11,8 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/params" - "github.com/evmos/evmos/v16/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) // CanTransfer checks if the sender is allowed to transfer funds according to the EVM block diff --git a/app/ante/evm/07_can_transfer_test.go b/app/ante/evm/07_can_transfer_test.go index 696d4d3fb0..61452b365a 100644 --- a/app/ante/evm/07_can_transfer_test.go +++ b/app/ante/evm/07_can_transfer_test.go @@ -9,12 +9,12 @@ import ( "cosmossdk.io/math" errortypes "github.com/cosmos/cosmos-sdk/types/errors" gethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v16/app/ante/evm" - "github.com/evmos/evmos/v16/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v16/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v16/testutil/integration/evmos/network" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/app/ante/evm" + "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v17/testutil/integration/evmos/network" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) func (suite *EvmAnteTestSuite) TestCanTransfer() { diff --git a/app/ante/evm/08_vesting.go b/app/ante/evm/08_vesting.go index 6ec1431bc8..632be95c6b 100644 --- a/app/ante/evm/08_vesting.go +++ b/app/ante/evm/08_vesting.go @@ -10,8 +10,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - vestingtypes "github.com/evmos/evmos/v16/x/vesting/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" + vestingtypes "github.com/evmos/evmos/v17/x/vesting/types" ) // EthVestingTransactionDecorator validates if clawback vesting accounts are diff --git a/app/ante/evm/08_vesting_test.go b/app/ante/evm/08_vesting_test.go index 9a914c3289..780b6dbe56 100644 --- a/app/ante/evm/08_vesting_test.go +++ b/app/ante/evm/08_vesting_test.go @@ -11,11 +11,11 @@ import ( errortypes "github.com/cosmos/cosmos-sdk/types/errors" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" sdkvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" - "github.com/evmos/evmos/v16/app/ante/evm" - "github.com/evmos/evmos/v16/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v16/testutil/integration/evmos/network" - vestingtypes "github.com/evmos/evmos/v16/x/vesting/types" + "github.com/evmos/evmos/v17/app/ante/evm" + "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v17/testutil/integration/evmos/network" + vestingtypes "github.com/evmos/evmos/v17/x/vesting/types" ) type AccountExpenses = map[string]*evm.EthVestingExpenseTracker diff --git a/app/ante/evm/09_gas_consume.go b/app/ante/evm/09_gas_consume.go index 397ab040d3..1ab69720b8 100644 --- a/app/ante/evm/09_gas_consume.go +++ b/app/ante/evm/09_gas_consume.go @@ -10,9 +10,9 @@ import ( sdktypes "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" "github.com/ethereum/go-ethereum/common" - anteutils "github.com/evmos/evmos/v16/app/ante/utils" - "github.com/evmos/evmos/v16/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + anteutils "github.com/evmos/evmos/v17/app/ante/utils" + "github.com/evmos/evmos/v17/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) // UpdateComulativeGasWanted updates the cumulative gas wanted diff --git a/app/ante/evm/09_gas_consume_test.go b/app/ante/evm/09_gas_consume_test.go index a70ae3f820..de788eedcb 100644 --- a/app/ante/evm/09_gas_consume_test.go +++ b/app/ante/evm/09_gas_consume_test.go @@ -5,10 +5,10 @@ package evm_test import ( sdktypes "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - evmante "github.com/evmos/evmos/v16/app/ante/evm" - "github.com/evmos/evmos/v16/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v16/testutil/integration/evmos/network" + evmante "github.com/evmos/evmos/v17/app/ante/evm" + "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v17/testutil/integration/evmos/network" ) func (suite *EvmAnteTestSuite) TestUpdateComulativeGasWanted() { diff --git a/app/ante/evm/10_incremenet_sequence_test.go b/app/ante/evm/10_incremenet_sequence_test.go index 68a20f203c..d6fb148203 100644 --- a/app/ante/evm/10_incremenet_sequence_test.go +++ b/app/ante/evm/10_incremenet_sequence_test.go @@ -5,10 +5,10 @@ package evm_test import ( errortypes "github.com/cosmos/cosmos-sdk/types/errors" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/evmos/evmos/v16/app/ante/evm" - "github.com/evmos/evmos/v16/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v16/testutil/integration/evmos/network" + "github.com/evmos/evmos/v17/app/ante/evm" + "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v17/testutil/integration/evmos/network" ) func (suite *EvmAnteTestSuite) TestIncrementSequence() { diff --git a/app/ante/evm/10_increment_sequence.go b/app/ante/evm/10_increment_sequence.go index ba76a52c74..3fd29152b2 100644 --- a/app/ante/evm/10_increment_sequence.go +++ b/app/ante/evm/10_increment_sequence.go @@ -10,7 +10,7 @@ import ( errortypes "github.com/cosmos/cosmos-sdk/types/errors" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) // IncrementNonce increments the sequence of the account. diff --git a/app/ante/evm/11_gas_wanted.go b/app/ante/evm/11_gas_wanted.go index 8384e5c778..c437ee23cf 100644 --- a/app/ante/evm/11_gas_wanted.go +++ b/app/ante/evm/11_gas_wanted.go @@ -8,7 +8,7 @@ import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/evmos/evmos/v16/types" + "github.com/evmos/evmos/v17/types" ) // GasWantedDecorator keeps track of the gasWanted amount on the current block in transient store diff --git a/app/ante/evm/11_gas_wanted_test.go b/app/ante/evm/11_gas_wanted_test.go index e773d859f4..1b832ce3b7 100644 --- a/app/ante/evm/11_gas_wanted_test.go +++ b/app/ante/evm/11_gas_wanted_test.go @@ -6,11 +6,11 @@ import ( errortypes "github.com/cosmos/cosmos-sdk/types/errors" sdktypes "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/app/ante/evm" - "github.com/evmos/evmos/v16/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v16/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v16/testutil/integration/evmos/network" + "github.com/evmos/evmos/v17/app/ante/evm" + "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v17/testutil/integration/evmos/network" ) func (suite *EvmAnteTestSuite) TestCheckGasWanted() { diff --git a/app/ante/evm/12_emit_event.go b/app/ante/evm/12_emit_event.go index 2a8a9a87fe..7ec58b137b 100644 --- a/app/ante/evm/12_emit_event.go +++ b/app/ante/evm/12_emit_event.go @@ -9,7 +9,7 @@ import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) // EthEmitEventDecorator emit events in ante handler in case of tx execution failed (out of block gas limit). diff --git a/app/ante/evm/ante_test.go b/app/ante/evm/ante_test.go index 67688e74f4..2c6db8753e 100644 --- a/app/ante/evm/ante_test.go +++ b/app/ante/evm/ante_test.go @@ -17,8 +17,8 @@ import ( "github.com/ethereum/go-ethereum/core/types" ethparams "github.com/ethereum/go-ethereum/params" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) func (suite *AnteTestSuite) TestAnteHandler() { diff --git a/app/ante/evm/eth_benchmark_test.go b/app/ante/evm/eth_benchmark_test.go index 6930d70f80..7cce298095 100644 --- a/app/ante/evm/eth_benchmark_test.go +++ b/app/ante/evm/eth_benchmark_test.go @@ -8,11 +8,11 @@ import ( sdkmath "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" ethtypes "github.com/ethereum/go-ethereum/core/types" - ethante "github.com/evmos/evmos/v16/app/ante/evm" - "github.com/evmos/evmos/v16/testutil" - testutiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + ethante "github.com/evmos/evmos/v17/app/ante/evm" + "github.com/evmos/evmos/v17/testutil" + testutiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v17/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) func BenchmarkEthGasConsumeDecorator(b *testing.B) { diff --git a/app/ante/evm/fee_checker.go b/app/ante/evm/fee_checker.go index c69f5648df..c6c3cfcded 100644 --- a/app/ante/evm/fee_checker.go +++ b/app/ante/evm/fee_checker.go @@ -12,9 +12,9 @@ import ( errortypes "github.com/cosmos/cosmos-sdk/types/errors" authante "github.com/cosmos/cosmos-sdk/x/auth/ante" "github.com/ethereum/go-ethereum/params" - anteutils "github.com/evmos/evmos/v16/app/ante/utils" - evmostypes "github.com/evmos/evmos/v16/types" - "github.com/evmos/evmos/v16/x/evm/types" + anteutils "github.com/evmos/evmos/v17/app/ante/utils" + evmostypes "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v17/x/evm/types" ) // NewDynamicFeeChecker returns a `TxFeeChecker` that applies a dynamic fee to diff --git a/app/ante/evm/fee_checker_test.go b/app/ante/evm/fee_checker_test.go index 57238b92e5..e38b1a0f42 100644 --- a/app/ante/evm/fee_checker_test.go +++ b/app/ante/evm/fee_checker_test.go @@ -14,9 +14,9 @@ import ( "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/evmos/v16/encoding" - "github.com/evmos/evmos/v16/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/encoding" + "github.com/evmos/evmos/v17/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) var _ DynamicFeeEVMKeeper = MockEVMKeeper{} diff --git a/app/ante/evm/fee_market_test.go b/app/ante/evm/fee_market_test.go index d913db9ea8..7f6bbacdfd 100644 --- a/app/ante/evm/fee_market_test.go +++ b/app/ante/evm/fee_market_test.go @@ -8,12 +8,12 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v16/app/ante/evm" - "github.com/evmos/evmos/v16/testutil" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/types" - "github.com/evmos/evmos/v16/utils" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/app/ante/evm" + "github.com/evmos/evmos/v17/testutil" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v17/utils" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) func (suite *AnteTestSuite) TestGasWantedDecorator() { diff --git a/app/ante/evm/interfaces.go b/app/ante/evm/interfaces.go index 048a2f1a0c..daea852e06 100644 --- a/app/ante/evm/interfaces.go +++ b/app/ante/evm/interfaces.go @@ -12,9 +12,9 @@ import ( "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/params" - "github.com/evmos/evmos/v16/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" + "github.com/evmos/evmos/v17/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" ) // EVMKeeper defines the expected keeper interface used on the AnteHandler diff --git a/app/ante/evm/mono.go b/app/ante/evm/mono.go index 2bae718069..2b7580b534 100644 --- a/app/ante/evm/mono.go +++ b/app/ante/evm/mono.go @@ -14,9 +14,9 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/params" - anteutils "github.com/evmos/evmos/v16/app/ante/utils" - evmkeeper "github.com/evmos/evmos/v16/x/evm/keeper" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + anteutils "github.com/evmos/evmos/v17/app/ante/utils" + evmkeeper "github.com/evmos/evmos/v17/x/evm/keeper" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) var _ sdk.AnteDecorator = &EthSetupContextDecorator{} diff --git a/app/ante/evm/setup_ctx_test.go b/app/ante/evm/setup_ctx_test.go index b5ee8f3d76..e1d53eb76e 100644 --- a/app/ante/evm/setup_ctx_test.go +++ b/app/ante/evm/setup_ctx_test.go @@ -3,13 +3,13 @@ package evm_test import ( "math/big" - evmante "github.com/evmos/evmos/v16/app/ante/evm" - "github.com/evmos/evmos/v16/testutil" + evmante "github.com/evmos/evmos/v17/app/ante/evm" + "github.com/evmos/evmos/v17/testutil" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - testutiltx "github.com/evmos/evmos/v16/testutil/tx" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + testutiltx "github.com/evmos/evmos/v17/testutil/tx" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) func (suite *AnteTestSuite) TestEthSetupContextDecorator() { diff --git a/app/ante/evm/setup_test.go b/app/ante/evm/setup_test.go index 7d921f0072..eb3526d89f 100644 --- a/app/ante/evm/setup_test.go +++ b/app/ante/evm/setup_test.go @@ -16,13 +16,13 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v16/app" - ante "github.com/evmos/evmos/v16/app/ante" - "github.com/evmos/evmos/v16/encoding" - "github.com/evmos/evmos/v16/ethereum/eip712" - "github.com/evmos/evmos/v16/utils" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" + "github.com/evmos/evmos/v17/app" + ante "github.com/evmos/evmos/v17/app/ante" + "github.com/evmos/evmos/v17/encoding" + "github.com/evmos/evmos/v17/ethereum/eip712" + "github.com/evmos/evmos/v17/utils" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" ) type AnteTestSuite struct { diff --git a/app/ante/evm/signverify_test.go b/app/ante/evm/signverify_test.go index 138dc03052..c29826016a 100644 --- a/app/ante/evm/signverify_test.go +++ b/app/ante/evm/signverify_test.go @@ -5,10 +5,10 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" ethtypes "github.com/ethereum/go-ethereum/core/types" - ethante "github.com/evmos/evmos/v16/app/ante/evm" - "github.com/evmos/evmos/v16/testutil" - testutiltx "github.com/evmos/evmos/v16/testutil/tx" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + ethante "github.com/evmos/evmos/v17/app/ante/evm" + "github.com/evmos/evmos/v17/testutil" + testutiltx "github.com/evmos/evmos/v17/testutil/tx" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) func (suite *AnteTestSuite) TestEthSigVerificationDecorator() { diff --git a/app/ante/evm/sigs_test.go b/app/ante/evm/sigs_test.go index 13058c4df7..cd1ed799fa 100644 --- a/app/ante/evm/sigs_test.go +++ b/app/ante/evm/sigs_test.go @@ -3,9 +3,9 @@ package evm_test import ( "math/big" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v17/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) func (suite *AnteTestSuite) TestSignatures() { diff --git a/app/ante/evm/utils_test.go b/app/ante/evm/utils_test.go index 786b4ef708..968cca7903 100644 --- a/app/ante/evm/utils_test.go +++ b/app/ante/evm/utils_test.go @@ -13,8 +13,8 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/migrations/legacytx" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v16/ethereum/eip712" - "github.com/evmos/evmos/v16/testutil" + "github.com/evmos/evmos/v17/ethereum/eip712" + "github.com/evmos/evmos/v17/testutil" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" @@ -34,15 +34,15 @@ import ( authz "github.com/cosmos/cosmos-sdk/x/authz" ibctypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" ibcclienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" evtypes "github.com/cosmos/cosmos-sdk/x/evidence/types" "github.com/cosmos/cosmos-sdk/x/feegrant" govtypesv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) func (suite *AnteTestSuite) BuildTestEthTx( diff --git a/app/ante/evm_benchmark_test.go b/app/ante/evm_benchmark_test.go index c602bcf3c0..a637b852f8 100644 --- a/app/ante/evm_benchmark_test.go +++ b/app/ante/evm_benchmark_test.go @@ -9,17 +9,17 @@ import ( sdktypes "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/app/ante" - ethante "github.com/evmos/evmos/v16/app/ante/evm" - "github.com/evmos/evmos/v16/encoding" - cmmnfactory "github.com/evmos/evmos/v16/testutil/integration/common/factory" - "github.com/evmos/evmos/v16/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v16/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v16/testutil/integration/evmos/network" - evmostypes "github.com/evmos/evmos/v16/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/app/ante" + ethante "github.com/evmos/evmos/v17/app/ante/evm" + "github.com/evmos/evmos/v17/encoding" + cmmnfactory "github.com/evmos/evmos/v17/testutil/integration/common/factory" + "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v17/testutil/integration/evmos/network" + evmostypes "github.com/evmos/evmos/v17/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) type benchmarkSuite struct { diff --git a/app/ante/handler_options.go b/app/ante/handler_options.go index 51f2ada010..2bda99e0d0 100644 --- a/app/ante/handler_options.go +++ b/app/ante/handler_options.go @@ -14,9 +14,9 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" - evmante "github.com/evmos/evmos/v16/app/ante/evm" - anteutils "github.com/evmos/evmos/v16/app/ante/utils" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmante "github.com/evmos/evmos/v17/app/ante/evm" + anteutils "github.com/evmos/evmos/v17/app/ante/utils" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) // HandlerOptions defines the list of module keepers required to run the Evmos diff --git a/app/ante/handler_options_test.go b/app/ante/handler_options_test.go index 28969daeec..96d4914208 100644 --- a/app/ante/handler_options_test.go +++ b/app/ante/handler_options_test.go @@ -1,12 +1,12 @@ package ante_test import ( - ethante "github.com/evmos/evmos/v16/app/ante/evm" - "github.com/evmos/evmos/v16/encoding" - "github.com/evmos/evmos/v16/types" + ethante "github.com/evmos/evmos/v17/app/ante/evm" + "github.com/evmos/evmos/v17/encoding" + "github.com/evmos/evmos/v17/types" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/app/ante" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/app/ante" ) func (suite *AnteTestSuite) TestValidateHandlerOptions() { diff --git a/app/ante/integration_test.go b/app/ante/integration_test.go index 99c6358aac..81db1acae6 100644 --- a/app/ante/integration_test.go +++ b/app/ante/integration_test.go @@ -5,7 +5,7 @@ import ( sdkmath "cosmossdk.io/math" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - testutiltx "github.com/evmos/evmos/v16/testutil/tx" + testutiltx "github.com/evmos/evmos/v17/testutil/tx" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" @@ -13,9 +13,9 @@ import ( . "github.com/onsi/gomega" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" - "github.com/evmos/evmos/v16/testutil" - "github.com/evmos/evmos/v16/utils" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + "github.com/evmos/evmos/v17/testutil" + "github.com/evmos/evmos/v17/utils" ) var _ = Describe("when sending a Cosmos transaction", func() { diff --git a/app/ante/setup_test.go b/app/ante/setup_test.go index 8fb3f58caf..eba191b15d 100644 --- a/app/ante/setup_test.go +++ b/app/ante/setup_test.go @@ -11,12 +11,12 @@ import ( "github.com/cosmos/cosmos-sdk/client" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" - "github.com/evmos/evmos/v16/encoding" - "github.com/evmos/evmos/v16/testutil" - "github.com/evmos/evmos/v16/utils" - feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + "github.com/evmos/evmos/v17/encoding" + "github.com/evmos/evmos/v17/testutil" + "github.com/evmos/evmos/v17/utils" + feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" ) diff --git a/app/ante/sigverify.go b/app/ante/sigverify.go index ab9ffd6ed4..efc88d226b 100644 --- a/app/ante/sigverify.go +++ b/app/ante/sigverify.go @@ -15,7 +15,7 @@ import ( authante "github.com/cosmos/cosmos-sdk/x/auth/ante" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" ) var _ authante.SignatureVerificationGasConsumer = SigVerificationGasConsumer diff --git a/app/ante/sigverify_test.go b/app/ante/sigverify_test.go index 0740586123..8807f7b174 100644 --- a/app/ante/sigverify_test.go +++ b/app/ante/sigverify_test.go @@ -17,10 +17,10 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/migrations/legacytx" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/app/ante" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" - "github.com/evmos/evmos/v16/encoding" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/app/ante" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + "github.com/evmos/evmos/v17/encoding" ) func TestConsumeSignatureVerificationGas(t *testing.T) { diff --git a/app/ante/utils/claim_rewards_test.go b/app/ante/utils/claim_rewards_test.go index fe1f426117..a517e7f1a1 100644 --- a/app/ante/utils/claim_rewards_test.go +++ b/app/ante/utils/claim_rewards_test.go @@ -5,10 +5,10 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" - anteutils "github.com/evmos/evmos/v16/app/ante/utils" - "github.com/evmos/evmos/v16/testutil" - testutiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/utils" + anteutils "github.com/evmos/evmos/v17/app/ante/utils" + "github.com/evmos/evmos/v17/testutil" + testutiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v17/utils" ) // TestClaimStakingRewardsIfNecessary tests the ClaimStakingRewardsIfNecessary function diff --git a/app/ante/utils/setup_test.go b/app/ante/utils/setup_test.go index e14a608f1d..04258be6d5 100644 --- a/app/ante/utils/setup_test.go +++ b/app/ante/utils/setup_test.go @@ -16,14 +16,14 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/app/ante" - "github.com/evmos/evmos/v16/encoding" - "github.com/evmos/evmos/v16/ethereum/eip712" - "github.com/evmos/evmos/v16/testutil" - "github.com/evmos/evmos/v16/utils" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/app/ante" + "github.com/evmos/evmos/v17/encoding" + "github.com/evmos/evmos/v17/ethereum/eip712" + "github.com/evmos/evmos/v17/testutil" + "github.com/evmos/evmos/v17/utils" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" ) type AnteTestSuite struct { diff --git a/app/ante/utils_test.go b/app/ante/utils_test.go index 0bbeeba97a..24f480e755 100644 --- a/app/ante/utils_test.go +++ b/app/ante/utils_test.go @@ -6,8 +6,8 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/evmos/evmos/v16/app/ante" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" + "github.com/evmos/evmos/v17/app/ante" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" ) func generatePubKeysAndSignatures(n int, msg []byte, _ bool) (pubkeys []cryptotypes.PubKey, signatures [][]byte) { diff --git a/app/app.go b/app/app.go index 34b03188b6..2937d24b08 100644 --- a/app/app.go +++ b/app/app.go @@ -119,42 +119,42 @@ import ( consensusparamtypes "github.com/cosmos/cosmos-sdk/x/consensus/types" // unnamed import of statik for swagger UI support - _ "github.com/evmos/evmos/v16/client/docs/statik" - - "github.com/evmos/evmos/v16/app/ante" - ethante "github.com/evmos/evmos/v16/app/ante/evm" - "github.com/evmos/evmos/v16/app/post" - v17 "github.com/evmos/evmos/v16/app/upgrades/v17" - "github.com/evmos/evmos/v16/encoding" - "github.com/evmos/evmos/v16/ethereum/eip712" - "github.com/evmos/evmos/v16/precompiles/common" - srvflags "github.com/evmos/evmos/v16/server/flags" - evmostypes "github.com/evmos/evmos/v16/types" - "github.com/evmos/evmos/v16/x/epochs" - epochskeeper "github.com/evmos/evmos/v16/x/epochs/keeper" - epochstypes "github.com/evmos/evmos/v16/x/epochs/types" - "github.com/evmos/evmos/v16/x/erc20" - erc20client "github.com/evmos/evmos/v16/x/erc20/client" - erc20keeper "github.com/evmos/evmos/v16/x/erc20/keeper" - erc20types "github.com/evmos/evmos/v16/x/erc20/types" - "github.com/evmos/evmos/v16/x/evm" - evmkeeper "github.com/evmos/evmos/v16/x/evm/keeper" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - "github.com/evmos/evmos/v16/x/feemarket" - feemarketkeeper "github.com/evmos/evmos/v16/x/feemarket/keeper" - feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" - "github.com/evmos/evmos/v16/x/incentives" - inflation "github.com/evmos/evmos/v16/x/inflation/v1" - inflationkeeper "github.com/evmos/evmos/v16/x/inflation/v1/keeper" - inflationtypes "github.com/evmos/evmos/v16/x/inflation/v1/types" - "github.com/evmos/evmos/v16/x/vesting" - vestingclient "github.com/evmos/evmos/v16/x/vesting/client" - vestingkeeper "github.com/evmos/evmos/v16/x/vesting/keeper" - vestingtypes "github.com/evmos/evmos/v16/x/vesting/types" + _ "github.com/evmos/evmos/v17/client/docs/statik" + + "github.com/evmos/evmos/v17/app/ante" + ethante "github.com/evmos/evmos/v17/app/ante/evm" + "github.com/evmos/evmos/v17/app/post" + v17 "github.com/evmos/evmos/v17/app/upgrades/v17" + "github.com/evmos/evmos/v17/encoding" + "github.com/evmos/evmos/v17/ethereum/eip712" + "github.com/evmos/evmos/v17/precompiles/common" + srvflags "github.com/evmos/evmos/v17/server/flags" + evmostypes "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v17/x/epochs" + epochskeeper "github.com/evmos/evmos/v17/x/epochs/keeper" + epochstypes "github.com/evmos/evmos/v17/x/epochs/types" + "github.com/evmos/evmos/v17/x/erc20" + erc20client "github.com/evmos/evmos/v17/x/erc20/client" + erc20keeper "github.com/evmos/evmos/v17/x/erc20/keeper" + erc20types "github.com/evmos/evmos/v17/x/erc20/types" + "github.com/evmos/evmos/v17/x/evm" + evmkeeper "github.com/evmos/evmos/v17/x/evm/keeper" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v17/x/feemarket" + feemarketkeeper "github.com/evmos/evmos/v17/x/feemarket/keeper" + feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" + "github.com/evmos/evmos/v17/x/incentives" + inflation "github.com/evmos/evmos/v17/x/inflation/v1" + inflationkeeper "github.com/evmos/evmos/v17/x/inflation/v1/keeper" + inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" + "github.com/evmos/evmos/v17/x/vesting" + vestingclient "github.com/evmos/evmos/v17/x/vesting/client" + vestingkeeper "github.com/evmos/evmos/v17/x/vesting/keeper" + vestingtypes "github.com/evmos/evmos/v17/x/vesting/types" // NOTE: override ICS20 keeper to support IBC transfers of ERC20 tokens - "github.com/evmos/evmos/v16/x/ibc/transfer" - transferkeeper "github.com/evmos/evmos/v16/x/ibc/transfer/keeper" + "github.com/evmos/evmos/v17/x/ibc/transfer" + transferkeeper "github.com/evmos/evmos/v17/x/ibc/transfer/keeper" memiavlstore "github.com/crypto-org-chain/cronos/store" diff --git a/app/app_test.go b/app/app_test.go index cb5d0276d1..c1038ac519 100644 --- a/app/app_test.go +++ b/app/app_test.go @@ -21,8 +21,8 @@ import ( "github.com/cometbft/cometbft/libs/log" tmtypes "github.com/cometbft/cometbft/types" - "github.com/evmos/evmos/v16/encoding" - "github.com/evmos/evmos/v16/utils" + "github.com/evmos/evmos/v17/encoding" + "github.com/evmos/evmos/v17/utils" ) func TestEvmosExport(t *testing.T) { diff --git a/app/ethtest_helper.go b/app/ethtest_helper.go index 7c8ec8f2f6..a95e4d7a53 100644 --- a/app/ethtest_helper.go +++ b/app/ethtest_helper.go @@ -25,8 +25,8 @@ import ( tmtypes "github.com/cometbft/cometbft/proto/tendermint/types" cmtypes "github.com/cometbft/cometbft/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/encoding" - "github.com/evmos/evmos/v16/utils" + "github.com/evmos/evmos/v17/encoding" + "github.com/evmos/evmos/v17/utils" ) // EthDefaultConsensusParams defines the default Tendermint consensus params used in diff --git a/app/export.go b/app/export.go index f5bc244d50..4a75330c23 100644 --- a/app/export.go +++ b/app/export.go @@ -17,7 +17,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/staking" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v16/encoding" + "github.com/evmos/evmos/v17/encoding" ) // NewDefaultGenesisState generates the default state for the application. diff --git a/app/keys.go b/app/keys.go index bcb5130450..41aa4b16da 100644 --- a/app/keys.go +++ b/app/keys.go @@ -22,12 +22,12 @@ import ( icahosttypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/host/types" ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" ibcexported "github.com/cosmos/ibc-go/v7/modules/core/exported" - epochstypes "github.com/evmos/evmos/v16/x/epochs/types" - erc20types "github.com/evmos/evmos/v16/x/erc20/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" - inflationtypes "github.com/evmos/evmos/v16/x/inflation/v1/types" - vestingtypes "github.com/evmos/evmos/v16/x/vesting/types" + epochstypes "github.com/evmos/evmos/v17/x/epochs/types" + erc20types "github.com/evmos/evmos/v17/x/erc20/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" + inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" + vestingtypes "github.com/evmos/evmos/v17/x/vesting/types" ) // StoreKeys returns the application store keys, diff --git a/app/post/burn.go b/app/post/burn.go index 19703c538a..2d0387e718 100644 --- a/app/post/burn.go +++ b/app/post/burn.go @@ -13,7 +13,7 @@ import ( errortypes "github.com/cosmos/cosmos-sdk/types/errors" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) var _ sdk.PostDecorator = &BurnDecorator{} diff --git a/app/post/burn_test.go b/app/post/burn_test.go index cb8117611e..f8384aeb88 100644 --- a/app/post/burn_test.go +++ b/app/post/burn_test.go @@ -6,9 +6,9 @@ package post_test import ( sdkmath "cosmossdk.io/math" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/evmos/evmos/v16/app/post" + "github.com/evmos/evmos/v17/app/post" - // "github.com/evmos/evmos/v16/testutil/integration/evmos/factory" + // "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" sdk "github.com/cosmos/cosmos-sdk/types" ) diff --git a/app/post/post_test.go b/app/post/post_test.go index 065732c862..39eb7f6439 100644 --- a/app/post/post_test.go +++ b/app/post/post_test.go @@ -6,7 +6,7 @@ package post_test import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - "github.com/evmos/evmos/v16/app/post" + "github.com/evmos/evmos/v17/app/post" ) func (s *PostTestSuite) TestPostHandlerOptions() { diff --git a/app/post/setup_test.go b/app/post/setup_test.go index 52eeb450c3..8b95a82dbd 100644 --- a/app/post/setup_test.go +++ b/app/post/setup_test.go @@ -14,11 +14,11 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v16/testutil/integration/evmos/network" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - inflationtypes "github.com/evmos/evmos/v16/x/inflation/v1/types" + "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v17/testutil/integration/evmos/network" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" + inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" "github.com/cosmos/cosmos-sdk/client" "github.com/stretchr/testify/suite" diff --git a/app/test_helpers.go b/app/test_helpers.go index 7c0fba60e8..6752f4554f 100644 --- a/app/test_helpers.go +++ b/app/test_helpers.go @@ -27,11 +27,11 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v16/encoding" - feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" + "github.com/evmos/evmos/v17/encoding" + feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" - "github.com/evmos/evmos/v16/cmd/config" - "github.com/evmos/evmos/v16/utils" + "github.com/evmos/evmos/v17/cmd/config" + "github.com/evmos/evmos/v17/utils" ) func init() { diff --git a/app/upgrades/v16/incentives.go b/app/upgrades/v16/incentives.go index 9cdc729e8a..0dde486f9e 100644 --- a/app/upgrades/v16/incentives.go +++ b/app/upgrades/v16/incentives.go @@ -8,7 +8,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - inflationkeeper "github.com/evmos/evmos/v16/x/inflation/v1/keeper" + inflationkeeper "github.com/evmos/evmos/v17/x/inflation/v1/keeper" ) // BurnUsageIncentivesPool burns the entirety of the usage incentives pool diff --git a/app/upgrades/v16/proposals.go b/app/upgrades/v16/proposals.go index f55ac3113a..027039b05d 100644 --- a/app/upgrades/v16/proposals.go +++ b/app/upgrades/v16/proposals.go @@ -9,7 +9,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1" - incentives "github.com/evmos/evmos/v16/x/incentives/types" + incentives "github.com/evmos/evmos/v17/x/incentives/types" ) // DeleteIncentivesProposals deletes the RegisterIncentives & CancelIncentiveProposal proposals from the store diff --git a/app/upgrades/v16/setup_test.go b/app/upgrades/v16/setup_test.go index ad56e874cb..38e222a183 100644 --- a/app/upgrades/v16/setup_test.go +++ b/app/upgrades/v16/setup_test.go @@ -11,11 +11,11 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/stretchr/testify/suite" - "github.com/evmos/evmos/v16/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v16/testutil/integration/evmos/grpc" - "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v16/testutil/integration/evmos/network" - inflationtypes "github.com/evmos/evmos/v16/x/inflation/v1/types" + "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" + "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v17/testutil/integration/evmos/network" + inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" ) type IntegrationTestSuite struct { diff --git a/app/upgrades/v16/upgrades.go b/app/upgrades/v16/upgrades.go index 879990b857..fb09d8d4f4 100644 --- a/app/upgrades/v16/upgrades.go +++ b/app/upgrades/v16/upgrades.go @@ -9,13 +9,13 @@ import ( bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - "github.com/evmos/evmos/v16/precompiles/bech32" - osmosisoutpost "github.com/evmos/evmos/v16/precompiles/outposts/osmosis" - strideoutpost "github.com/evmos/evmos/v16/precompiles/outposts/stride" - "github.com/evmos/evmos/v16/precompiles/p256" - "github.com/evmos/evmos/v16/utils" - evmkeeper "github.com/evmos/evmos/v16/x/evm/keeper" - inflationkeeper "github.com/evmos/evmos/v16/x/inflation/v1/keeper" + "github.com/evmos/evmos/v17/precompiles/bech32" + osmosisoutpost "github.com/evmos/evmos/v17/precompiles/outposts/osmosis" + strideoutpost "github.com/evmos/evmos/v17/precompiles/outposts/stride" + "github.com/evmos/evmos/v17/precompiles/p256" + "github.com/evmos/evmos/v17/utils" + evmkeeper "github.com/evmos/evmos/v17/x/evm/keeper" + inflationkeeper "github.com/evmos/evmos/v17/x/inflation/v1/keeper" ) // CreateUpgradeHandler creates an SDK upgrade handler for v16.0.0 diff --git a/app/upgrades/v16/upgrades_test.go b/app/upgrades/v16/upgrades_test.go index a83592d2da..d3d9fba2a8 100644 --- a/app/upgrades/v16/upgrades_test.go +++ b/app/upgrades/v16/upgrades_test.go @@ -13,13 +13,13 @@ import ( govtypesv1beta "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" upgrade "github.com/cosmos/cosmos-sdk/x/upgrade/types" - v16 "github.com/evmos/evmos/v16/app/upgrades/v16" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" - "github.com/evmos/evmos/v16/testutil" - testnetwork "github.com/evmos/evmos/v16/testutil/integration/evmos/network" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/utils" - incentives "github.com/evmos/evmos/v16/x/incentives/types" + v16 "github.com/evmos/evmos/v17/app/upgrades/v16" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + "github.com/evmos/evmos/v17/testutil" + testnetwork "github.com/evmos/evmos/v17/testutil/integration/evmos/network" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v17/utils" + incentives "github.com/evmos/evmos/v17/x/incentives/types" ) func (its *IntegrationTestSuite) TestFeeCollectorMigration() { diff --git a/client/config.go b/client/config.go index 20a4354da6..fdab8c496a 100644 --- a/client/config.go +++ b/client/config.go @@ -14,7 +14,7 @@ import ( "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/evmos/evmos/v16/types" + "github.com/evmos/evmos/v17/types" ) // InitConfig adds the chain-id, encoding and output flags to the persistent flag set. diff --git a/client/debug/debug.go b/client/debug/debug.go index 79a7ddbe8e..cff97571d2 100644 --- a/client/debug/debug.go +++ b/client/debug/debug.go @@ -9,8 +9,8 @@ import ( "strconv" "strings" - "github.com/evmos/evmos/v16/ethereum/eip712" - evmos "github.com/evmos/evmos/v16/types" + "github.com/evmos/evmos/v17/ethereum/eip712" + evmos "github.com/evmos/evmos/v17/types" "github.com/pkg/errors" "github.com/spf13/cobra" diff --git a/client/docs/swagger-ui/swagger.json b/client/docs/swagger-ui/swagger.json index 17179c48df..292c0fb992 100644 --- a/client/docs/swagger-ui/swagger.json +++ b/client/docs/swagger-ui/swagger.json @@ -2569,7 +2569,7 @@ }, { "name": "chain_id", - "description": "chain_id is the the eip155 chain id parsed from the requested block header.", + "description": "chain_id is the eip155 chain id parsed from the requested block header.", "in": "query", "required": false, "type": "string", @@ -39228,4 +39228,4 @@ } } } -} +} \ No newline at end of file diff --git a/client/export.go b/client/export.go index cd94d63ba9..558230872d 100644 --- a/client/export.go +++ b/client/export.go @@ -15,8 +15,8 @@ import ( "github.com/spf13/cobra" "github.com/cosmos/cosmos-sdk/crypto/keyring" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" - "github.com/evmos/evmos/v16/crypto/hd" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + "github.com/evmos/evmos/v17/crypto/hd" ) // UnsafeExportEthKeyCommand exports a key with the given name as a private key in hex format. diff --git a/client/import.go b/client/import.go index a4a968542c..5558b6c7d8 100644 --- a/client/import.go +++ b/client/import.go @@ -11,9 +11,9 @@ import ( "github.com/cosmos/cosmos-sdk/client/input" "github.com/cosmos/cosmos-sdk/crypto" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" - "github.com/evmos/evmos/v16/crypto/hd" + "github.com/evmos/evmos/v17/crypto/hd" ) // UnsafeImportKeyCommand imports private keys from a keyfile. diff --git a/client/keys.go b/client/keys.go index 5ca17d7a63..a28723c458 100644 --- a/client/keys.go +++ b/client/keys.go @@ -12,8 +12,8 @@ import ( "github.com/spf13/cobra" "github.com/cosmos/cosmos-sdk/crypto/keyring" - clientkeys "github.com/evmos/evmos/v16/client/keys" - "github.com/evmos/evmos/v16/crypto/hd" + clientkeys "github.com/evmos/evmos/v17/client/keys" + "github.com/evmos/evmos/v17/crypto/hd" ) // KeyCommands registers a sub-tree of commands to interact with diff --git a/client/keys/add.go b/client/keys/add.go index 7ca058e6a1..c17e547e59 100644 --- a/client/keys/add.go +++ b/client/keys/add.go @@ -10,7 +10,7 @@ import ( "fmt" "sort" - cryptohd "github.com/evmos/evmos/v16/crypto/hd" + cryptohd "github.com/evmos/evmos/v17/crypto/hd" bip39 "github.com/cosmos/go-bip39" "github.com/spf13/cobra" diff --git a/client/testnet.go b/client/testnet.go index 483b2643e2..f4f2634f65 100644 --- a/client/testnet.go +++ b/client/testnet.go @@ -40,13 +40,13 @@ import ( mintypes "github.com/cosmos/cosmos-sdk/x/mint/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v16/crypto/hd" - "github.com/evmos/evmos/v16/server/config" - srvflags "github.com/evmos/evmos/v16/server/flags" - evmostypes "github.com/evmos/evmos/v16/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/crypto/hd" + "github.com/evmos/evmos/v17/server/config" + srvflags "github.com/evmos/evmos/v17/server/flags" + evmostypes "github.com/evmos/evmos/v17/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" - "github.com/evmos/evmos/v16/testutil/network" + "github.com/evmos/evmos/v17/testutil/network" ) var ( diff --git a/cmd/config/config.go b/cmd/config/config.go index 4bd2833090..4e1a96cbf7 100644 --- a/cmd/config/config.go +++ b/cmd/config/config.go @@ -7,7 +7,7 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/types" + "github.com/evmos/evmos/v17/types" ) const ( diff --git a/cmd/evmosd/cmd_test.go b/cmd/evmosd/cmd_test.go index 60f7f7396d..5f1146e97a 100644 --- a/cmd/evmosd/cmd_test.go +++ b/cmd/evmosd/cmd_test.go @@ -9,9 +9,9 @@ import ( "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" "github.com/stretchr/testify/require" - "github.com/evmos/evmos/v16/app" - evmosd "github.com/evmos/evmos/v16/cmd/evmosd" - "github.com/evmos/evmos/v16/utils" + "github.com/evmos/evmos/v17/app" + evmosd "github.com/evmos/evmos/v17/cmd/evmosd" + "github.com/evmos/evmos/v17/utils" ) func TestInitCmd(t *testing.T) { diff --git a/cmd/evmosd/genaccounts.go b/cmd/evmosd/genaccounts.go index 4eaa1687dd..44201cedd2 100644 --- a/cmd/evmosd/genaccounts.go +++ b/cmd/evmosd/genaccounts.go @@ -23,13 +23,13 @@ import ( "github.com/cosmos/cosmos-sdk/x/genutil" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" - "github.com/evmos/evmos/v16/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" - evmoskr "github.com/evmos/evmos/v16/crypto/keyring" + evmoskr "github.com/evmos/evmos/v17/crypto/keyring" - vestingcli "github.com/evmos/evmos/v16/x/vesting/client/cli" - vestingtypes "github.com/evmos/evmos/v16/x/vesting/types" + vestingcli "github.com/evmos/evmos/v17/x/vesting/client/cli" + vestingtypes "github.com/evmos/evmos/v17/x/vesting/types" ) const ( diff --git a/cmd/evmosd/main.go b/cmd/evmosd/main.go index a0211f9f70..145c63f25c 100644 --- a/cmd/evmosd/main.go +++ b/cmd/evmosd/main.go @@ -10,8 +10,8 @@ import ( svrcmd "github.com/cosmos/cosmos-sdk/server/cmd" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/app" - cmdcfg "github.com/evmos/evmos/v16/cmd/config" + "github.com/evmos/evmos/v17/app" + cmdcfg "github.com/evmos/evmos/v17/cmd/config" ) func main() { diff --git a/cmd/evmosd/migrate.go b/cmd/evmosd/migrate.go index 7b2b92fe0e..07318bf2d6 100644 --- a/cmd/evmosd/migrate.go +++ b/cmd/evmosd/migrate.go @@ -19,7 +19,7 @@ import ( "github.com/cosmos/cosmos-sdk/version" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" - "github.com/evmos/evmos/v16/utils" + "github.com/evmos/evmos/v17/utils" ) // FlagGenesisTime defines the genesis time in string format diff --git a/cmd/evmosd/root.go b/cmd/evmosd/root.go index 424d8c9182..b2904451d0 100644 --- a/cmd/evmosd/root.go +++ b/cmd/evmosd/root.go @@ -41,18 +41,18 @@ import ( genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" - evmosclient "github.com/evmos/evmos/v16/client" - "github.com/evmos/evmos/v16/client/block" - "github.com/evmos/evmos/v16/client/debug" - "github.com/evmos/evmos/v16/encoding" - "github.com/evmos/evmos/v16/ethereum/eip712" - evmosserver "github.com/evmos/evmos/v16/server" - servercfg "github.com/evmos/evmos/v16/server/config" - srvflags "github.com/evmos/evmos/v16/server/flags" - - "github.com/evmos/evmos/v16/app" - cmdcfg "github.com/evmos/evmos/v16/cmd/config" - evmoskr "github.com/evmos/evmos/v16/crypto/keyring" + evmosclient "github.com/evmos/evmos/v17/client" + "github.com/evmos/evmos/v17/client/block" + "github.com/evmos/evmos/v17/client/debug" + "github.com/evmos/evmos/v17/encoding" + "github.com/evmos/evmos/v17/ethereum/eip712" + evmosserver "github.com/evmos/evmos/v17/server" + servercfg "github.com/evmos/evmos/v17/server/config" + srvflags "github.com/evmos/evmos/v17/server/flags" + + "github.com/evmos/evmos/v17/app" + cmdcfg "github.com/evmos/evmos/v17/cmd/config" + evmoskr "github.com/evmos/evmos/v17/crypto/keyring" ) const ( diff --git a/cmd/evmosd/testnet.go b/cmd/evmosd/testnet.go index 1a121a18f0..bfc4d85e8b 100644 --- a/cmd/evmosd/testnet.go +++ b/cmd/evmosd/testnet.go @@ -42,15 +42,15 @@ import ( govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - cmdcfg "github.com/evmos/evmos/v16/cmd/config" - "github.com/evmos/evmos/v16/crypto/hd" - evmoskr "github.com/evmos/evmos/v16/crypto/keyring" - "github.com/evmos/evmos/v16/server/config" - srvflags "github.com/evmos/evmos/v16/server/flags" - "github.com/evmos/evmos/v16/testutil/network" - evmostypes "github.com/evmos/evmos/v16/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" + cmdcfg "github.com/evmos/evmos/v17/cmd/config" + "github.com/evmos/evmos/v17/crypto/hd" + evmoskr "github.com/evmos/evmos/v17/crypto/keyring" + "github.com/evmos/evmos/v17/server/config" + srvflags "github.com/evmos/evmos/v17/server/flags" + "github.com/evmos/evmos/v17/testutil/network" + evmostypes "github.com/evmos/evmos/v17/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" ) var ( diff --git a/cmd/evmosd/versiondb.go b/cmd/evmosd/versiondb.go index 2692311eda..5021bcfe21 100644 --- a/cmd/evmosd/versiondb.go +++ b/cmd/evmosd/versiondb.go @@ -13,8 +13,8 @@ import ( "github.com/spf13/cobra" versiondbclient "github.com/crypto-org-chain/cronos/versiondb/client" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/cmd/evmosd/opendb" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/cmd/evmosd/opendb" ) // ChangeSetCmd returns a Cobra command for interacting with change sets. diff --git a/contracts/erc20.go b/contracts/erc20.go index 3c2f04a685..d464283aa4 100644 --- a/contracts/erc20.go +++ b/contracts/erc20.go @@ -8,9 +8,9 @@ import ( "encoding/json" "github.com/ethereum/go-ethereum/common" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" - "github.com/evmos/evmos/v16/x/erc20/types" + "github.com/evmos/evmos/v17/x/erc20/types" ) var ( diff --git a/contracts/erc20DirectBalanceManipulation.go b/contracts/erc20DirectBalanceManipulation.go index 34226aca8a..74b29c76a9 100644 --- a/contracts/erc20DirectBalanceManipulation.go +++ b/contracts/erc20DirectBalanceManipulation.go @@ -7,9 +7,9 @@ import ( "encoding/json" "github.com/ethereum/go-ethereum/common" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" - "github.com/evmos/evmos/v16/x/erc20/types" + "github.com/evmos/evmos/v17/x/erc20/types" ) // This is an evil token. Whenever an A -> B transfer is called, diff --git a/contracts/erc20burnable.go b/contracts/erc20burnable.go index d94176aa64..d4bc2a47f9 100644 --- a/contracts/erc20burnable.go +++ b/contracts/erc20burnable.go @@ -6,7 +6,7 @@ import ( _ "embed" // embed compiled smart contract "encoding/json" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) var ( diff --git a/contracts/erc20maliciousdelayed.go b/contracts/erc20maliciousdelayed.go index ee85b4cafd..8a25c0bae3 100644 --- a/contracts/erc20maliciousdelayed.go +++ b/contracts/erc20maliciousdelayed.go @@ -7,9 +7,9 @@ import ( "encoding/json" "github.com/ethereum/go-ethereum/common" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" - "github.com/evmos/evmos/v16/x/erc20/types" + "github.com/evmos/evmos/v17/x/erc20/types" ) // This is an evil token. Whenever an A -> B transfer is called, diff --git a/contracts/flash_loan.go b/contracts/flash_loan.go index d0d5daec64..333f2389db 100644 --- a/contracts/flash_loan.go +++ b/contracts/flash_loan.go @@ -7,7 +7,7 @@ import ( _ "embed" // embed compiled smart contract "encoding/json" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) var ( diff --git a/crypto/codec/amino.go b/crypto/codec/amino.go index a4c68cec2b..98e366992c 100644 --- a/crypto/codec/amino.go +++ b/crypto/codec/amino.go @@ -8,7 +8,7 @@ import ( cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" "github.com/cosmos/cosmos-sdk/crypto/keyring" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" ) // RegisterCrypto registers all crypto dependency types with the provided Amino diff --git a/crypto/codec/codec.go b/crypto/codec/codec.go index 24b2ae6725..82b02ae571 100644 --- a/crypto/codec/codec.go +++ b/crypto/codec/codec.go @@ -6,7 +6,7 @@ import ( codectypes "github.com/cosmos/cosmos-sdk/codec/types" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" ) // RegisterInterfaces register the Evmos key concrete types. diff --git a/crypto/ethsecp256k1/ethsecp256k1.go b/crypto/ethsecp256k1/ethsecp256k1.go index dcb21ae413..6fa7eabd3c 100644 --- a/crypto/ethsecp256k1/ethsecp256k1.go +++ b/crypto/ethsecp256k1/ethsecp256k1.go @@ -15,7 +15,7 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v16/ethereum/eip712" + "github.com/evmos/evmos/v17/ethereum/eip712" ) const ( diff --git a/crypto/ethsecp256k1/keys.pb.go b/crypto/ethsecp256k1/keys.pb.go index 93ec272866..9a5fc7b529 100644 --- a/crypto/ethsecp256k1/keys.pb.go +++ b/crypto/ethsecp256k1/keys.pb.go @@ -138,9 +138,9 @@ var fileDescriptor_0c10cadcf35beb64 = []byte{ 0x33, 0x28, 0x49, 0x73, 0xb1, 0x07, 0x14, 0x65, 0x96, 0x61, 0x55, 0xe2, 0xe4, 0x71, 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, 0x7a, 0xe9, 0x99, 0x25, 0x19, 0xa5, 0x49, 0x7a, - 0xc9, 0xf9, 0xb9, 0xfa, 0xa9, 0x65, 0xb9, 0xf9, 0xc5, 0x50, 0xb2, 0xcc, 0xd0, 0x0c, 0xe6, 0x1d, - 0x64, 0xe7, 0x25, 0xb1, 0x81, 0xdd, 0x63, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, 0x03, 0x69, 0xeb, - 0xbb, 0xf6, 0x00, 0x00, 0x00, + 0xc9, 0xf9, 0xb9, 0xfa, 0xa9, 0x65, 0xb9, 0xf9, 0xc5, 0x50, 0xb2, 0xcc, 0xd0, 0x1c, 0xe6, 0x1d, + 0x64, 0xe7, 0x25, 0xb1, 0x81, 0xdd, 0x63, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, 0x27, 0xb0, 0xec, + 0xd8, 0xf6, 0x00, 0x00, 0x00, } func (m *PubKey) Marshal() (dAtA []byte, err error) { diff --git a/crypto/hd/algorithm.go b/crypto/hd/algorithm.go index 3ea8d36b89..e05e5451b1 100644 --- a/crypto/hd/algorithm.go +++ b/crypto/hd/algorithm.go @@ -14,7 +14,7 @@ import ( "github.com/cosmos/cosmos-sdk/crypto/keyring" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" ) const ( diff --git a/crypto/hd/algorithm_test.go b/crypto/hd/algorithm_test.go index af8228ea35..10cf7bfb7f 100644 --- a/crypto/hd/algorithm_test.go +++ b/crypto/hd/algorithm_test.go @@ -13,9 +13,9 @@ import ( "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/crypto/keyring" - cryptocodec "github.com/evmos/evmos/v16/crypto/codec" - enccodec "github.com/evmos/evmos/v16/encoding/codec" - evmostypes "github.com/evmos/evmos/v16/types" + cryptocodec "github.com/evmos/evmos/v17/crypto/codec" + enccodec "github.com/evmos/evmos/v17/encoding/codec" + evmostypes "github.com/evmos/evmos/v17/types" ) var TestCodec amino.Codec diff --git a/crypto/hd/benchmark_test.go b/crypto/hd/benchmark_test.go index 827618c96d..9b8179bb96 100644 --- a/crypto/hd/benchmark_test.go +++ b/crypto/hd/benchmark_test.go @@ -4,7 +4,7 @@ import ( "testing" "github.com/cosmos/cosmos-sdk/crypto/keyring" - "github.com/evmos/evmos/v16/types" + "github.com/evmos/evmos/v17/types" ) func BenchmarkEthSecp256k1Algo_Derive(b *testing.B) { diff --git a/crypto/keyring/options.go b/crypto/keyring/options.go index 43dded073c..39f57bc88f 100644 --- a/crypto/keyring/options.go +++ b/crypto/keyring/options.go @@ -8,9 +8,9 @@ import ( cosmosLedger "github.com/cosmos/cosmos-sdk/crypto/ledger" "github.com/cosmos/cosmos-sdk/crypto/types" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" - "github.com/evmos/evmos/v16/crypto/hd" - "github.com/evmos/evmos/v16/wallets/ledger" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + "github.com/evmos/evmos/v17/crypto/hd" + "github.com/evmos/evmos/v17/wallets/ledger" ) // AppName defines the Ledger app used for signing. Evmos uses the Ethereum app diff --git a/encoding/codec/codec.go b/encoding/codec/codec.go index 930ca2c93d..f16985c285 100644 --- a/encoding/codec/codec.go +++ b/encoding/codec/codec.go @@ -8,8 +8,8 @@ import ( "github.com/cosmos/cosmos-sdk/std" sdk "github.com/cosmos/cosmos-sdk/types" - cryptocodec "github.com/evmos/evmos/v16/crypto/codec" - "github.com/evmos/evmos/v16/types" + cryptocodec "github.com/evmos/evmos/v17/crypto/codec" + "github.com/evmos/evmos/v17/types" ) // RegisterLegacyAminoCodec registers Interfaces from types, crypto, and SDK std. diff --git a/encoding/config.go b/encoding/config.go index 2fa2c4e18e..e632a18bad 100644 --- a/encoding/config.go +++ b/encoding/config.go @@ -9,7 +9,7 @@ import ( "github.com/cosmos/cosmos-sdk/types/module" "github.com/cosmos/cosmos-sdk/x/auth/tx" - enccodec "github.com/evmos/evmos/v16/encoding/codec" + enccodec "github.com/evmos/evmos/v17/encoding/codec" ) // MakeConfig creates an EncodingConfig for testing diff --git a/encoding/config_test.go b/encoding/config_test.go index 7abbae3fdd..a43eeb537f 100644 --- a/encoding/config_test.go +++ b/encoding/config_test.go @@ -8,10 +8,10 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/encoding" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/encoding" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) func TestTxEncoding(t *testing.T) { diff --git a/ethereum/eip712/eip712_fuzzer_test.go b/ethereum/eip712/eip712_fuzzer_test.go index 03dc702d21..15ffef4317 100644 --- a/ethereum/eip712/eip712_fuzzer_test.go +++ b/ethereum/eip712/eip712_fuzzer_test.go @@ -6,7 +6,7 @@ import ( rand "github.com/cometbft/cometbft/libs/rand" - "github.com/evmos/evmos/v16/ethereum/eip712" + "github.com/evmos/evmos/v17/ethereum/eip712" "github.com/tidwall/gjson" "github.com/tidwall/sjson" ) diff --git a/ethereum/eip712/eip712_test.go b/ethereum/eip712/eip712_test.go index 95a74a9e4e..e226a89fe0 100644 --- a/ethereum/eip712/eip712_test.go +++ b/ethereum/eip712/eip712_test.go @@ -11,22 +11,22 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/signer/core/apitypes" - "github.com/evmos/evmos/v16/ethereum/eip712" + "github.com/evmos/evmos/v17/ethereum/eip712" "github.com/tidwall/gjson" "github.com/tidwall/sjson" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" 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/evmos/v16/app" - "github.com/evmos/evmos/v16/cmd/config" - "github.com/evmos/evmos/v16/encoding" - "github.com/evmos/evmos/v16/utils" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/cmd/config" + "github.com/evmos/evmos/v17/encoding" + "github.com/evmos/evmos/v17/utils" distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types" govtypesv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" diff --git a/ethereum/eip712/encoding.go b/ethereum/eip712/encoding.go index e2423957e0..f180857e7d 100644 --- a/ethereum/eip712/encoding.go +++ b/ethereum/eip712/encoding.go @@ -13,7 +13,7 @@ import ( txTypes "github.com/cosmos/cosmos-sdk/types/tx" apitypes "github.com/ethereum/go-ethereum/signer/core/apitypes" - evmostypes "github.com/evmos/evmos/v16/types" + evmostypes "github.com/evmos/evmos/v17/types" "github.com/cosmos/cosmos-sdk/codec" ) diff --git a/ethereum/eip712/encoding_legacy.go b/ethereum/eip712/encoding_legacy.go index c552001818..a8bd949c65 100644 --- a/ethereum/eip712/encoding_legacy.go +++ b/ethereum/eip712/encoding_legacy.go @@ -13,7 +13,7 @@ import ( txTypes "github.com/cosmos/cosmos-sdk/types/tx" apitypes "github.com/ethereum/go-ethereum/signer/core/apitypes" - evmos "github.com/evmos/evmos/v16/types" + evmos "github.com/evmos/evmos/v17/types" ) type aminoMessage struct { diff --git a/ethereum/eip712/preprocess.go b/ethereum/eip712/preprocess.go index 107dc1cc9a..21caf21305 100644 --- a/ethereum/eip712/preprocess.go +++ b/ethereum/eip712/preprocess.go @@ -10,7 +10,7 @@ import ( cosmoskr "github.com/cosmos/cosmos-sdk/crypto/keyring" "github.com/cosmos/cosmos-sdk/types/tx/signing" authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" - "github.com/evmos/evmos/v16/types" + "github.com/evmos/evmos/v17/types" ) // PreprocessLedgerTx reformats Ledger-signed Cosmos transactions to match the fork expected by Ethermint diff --git a/ethereum/eip712/preprocess_test.go b/ethereum/eip712/preprocess_test.go index 1f2c04cada..a854110e6a 100644 --- a/ethereum/eip712/preprocess_test.go +++ b/ethereum/eip712/preprocess_test.go @@ -14,13 +14,13 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/ante" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/cmd/config" - "github.com/evmos/evmos/v16/encoding" - "github.com/evmos/evmos/v16/ethereum/eip712" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/types" - "github.com/evmos/evmos/v16/utils" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/cmd/config" + "github.com/evmos/evmos/v17/encoding" + "github.com/evmos/evmos/v17/ethereum/eip712" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v17/utils" "github.com/stretchr/testify/require" ) diff --git a/go.mod b/go.mod index aefb3517d2..1a5823606e 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/evmos/evmos/v16 +module github.com/evmos/evmos/v17 go 1.22.2 diff --git a/ibc/testing/app.go b/ibc/testing/app.go index e585b5c3fe..6376f26ffa 100644 --- a/ibc/testing/app.go +++ b/ibc/testing/app.go @@ -23,9 +23,9 @@ import ( ibcgotesting "github.com/cosmos/ibc-go/v7/testing" - evmosapp "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/types" - "github.com/evmos/evmos/v16/utils" + evmosapp "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v17/utils" ) // DefaultTestingAppInit is a test helper function used to initialize an App diff --git a/ibc/testing/chain.go b/ibc/testing/chain.go index 2823b6a172..d2a5d620c3 100644 --- a/ibc/testing/chain.go +++ b/ibc/testing/chain.go @@ -21,10 +21,10 @@ import ( ibcgotesting "github.com/cosmos/ibc-go/v7/testing" "github.com/cosmos/ibc-go/v7/testing/mock" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" - evmostypes "github.com/evmos/evmos/v16/types" - "github.com/evmos/evmos/v16/utils" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + evmostypes "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v17/utils" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) // ChainIDPrefix defines the default chain ID prefix for Evmos test chains diff --git a/ibc/testing/coordinator.go b/ibc/testing/coordinator.go index 0be7cb834b..ddd98a4e09 100644 --- a/ibc/testing/coordinator.go +++ b/ibc/testing/coordinator.go @@ -14,7 +14,7 @@ import ( simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" sdk "github.com/cosmos/cosmos-sdk/types" ibctesting "github.com/cosmos/ibc-go/v7/testing" - "github.com/evmos/evmos/v16/app" + "github.com/evmos/evmos/v17/app" "github.com/stretchr/testify/require" ) diff --git a/ibc/utils.go b/ibc/utils.go index 21e630cf59..652f698d54 100644 --- a/ibc/utils.go +++ b/ibc/utils.go @@ -13,9 +13,9 @@ import ( transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" - transferkeeper "github.com/evmos/evmos/v16/x/ibc/transfer/keeper" + transferkeeper "github.com/evmos/evmos/v17/x/ibc/transfer/keeper" - "github.com/evmos/evmos/v16/utils" + "github.com/evmos/evmos/v17/utils" ) // GetTransferSenderRecipient returns the sender and recipient sdk.AccAddresses diff --git a/ibc/utils_test.go b/ibc/utils_test.go index bafc8de173..59374cc090 100644 --- a/ibc/utils_test.go +++ b/ibc/utils_test.go @@ -11,7 +11,7 @@ import ( transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" ibctesting "github.com/cosmos/ibc-go/v7/testing" - teststypes "github.com/evmos/evmos/v16/types/tests" + teststypes "github.com/evmos/evmos/v17/types/tests" ) func init() { diff --git a/indexer/kv_indexer.go b/indexer/kv_indexer.go index 758f3f347c..e115b66c44 100644 --- a/indexer/kv_indexer.go +++ b/indexer/kv_indexer.go @@ -15,9 +15,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authante "github.com/cosmos/cosmos-sdk/x/auth/ante" "github.com/ethereum/go-ethereum/common" - rpctypes "github.com/evmos/evmos/v16/rpc/types" - evmostypes "github.com/evmos/evmos/v16/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + rpctypes "github.com/evmos/evmos/v17/rpc/types" + evmostypes "github.com/evmos/evmos/v17/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) const ( diff --git a/indexer/kv_indexer_test.go b/indexer/kv_indexer_test.go index 18eafef4c5..c46a5893de 100644 --- a/indexer/kv_indexer_test.go +++ b/indexer/kv_indexer_test.go @@ -12,13 +12,13 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" - evmenc "github.com/evmos/evmos/v16/encoding" - "github.com/evmos/evmos/v16/indexer" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/utils" - "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + evmenc "github.com/evmos/evmos/v17/encoding" + "github.com/evmos/evmos/v17/indexer" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v17/x/evm/types" "github.com/stretchr/testify/require" ) diff --git a/precompiles/authorization/events.go b/precompiles/authorization/events.go index 545b025301..6574080e18 100644 --- a/precompiles/authorization/events.go +++ b/precompiles/authorization/events.go @@ -12,7 +12,7 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v16/precompiles/common" + cmn "github.com/evmos/evmos/v17/precompiles/common" ) const ( diff --git a/precompiles/authorization/types.go b/precompiles/authorization/types.go index a0421b496a..92e59252ae 100644 --- a/precompiles/authorization/types.go +++ b/precompiles/authorization/types.go @@ -16,7 +16,7 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - cmn "github.com/evmos/evmos/v16/precompiles/common" + cmn "github.com/evmos/evmos/v17/precompiles/common" ) const ( diff --git a/precompiles/authorization/types_test.go b/precompiles/authorization/types_test.go index 2bf998e137..089f20b094 100644 --- a/precompiles/authorization/types_test.go +++ b/precompiles/authorization/types_test.go @@ -5,12 +5,12 @@ import ( "testing" "cosmossdk.io/math" - "github.com/evmos/evmos/v16/utils" + "github.com/evmos/evmos/v17/utils" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/precompiles/authorization" - cmn "github.com/evmos/evmos/v16/precompiles/common" - testutiltx "github.com/evmos/evmos/v16/testutil/tx" + "github.com/evmos/evmos/v17/precompiles/authorization" + cmn "github.com/evmos/evmos/v17/precompiles/common" + testutiltx "github.com/evmos/evmos/v17/testutil/tx" "github.com/stretchr/testify/require" ) diff --git a/precompiles/bank/bank.go b/precompiles/bank/bank.go index cda0ecb72b..cc23fdb7e1 100644 --- a/precompiles/bank/bank.go +++ b/precompiles/bank/bank.go @@ -11,8 +11,8 @@ import ( bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v16/precompiles/common" - erc20keeper "github.com/evmos/evmos/v16/x/erc20/keeper" + cmn "github.com/evmos/evmos/v17/precompiles/common" + erc20keeper "github.com/evmos/evmos/v17/x/erc20/keeper" ) const ( diff --git a/precompiles/bank/integration_test.go b/precompiles/bank/integration_test.go index 6d70003433..7eb20d644e 100644 --- a/precompiles/bank/integration_test.go +++ b/precompiles/bank/integration_test.go @@ -4,24 +4,25 @@ import ( "math/big" "testing" - "github.com/evmos/evmos/v16/precompiles/bank/testdata" + "github.com/evmos/evmos/v17/precompiles/bank/testdata" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v16/testutil/integration/evmos/grpc" - "github.com/evmos/evmos/v16/testutil/integration/evmos/network" - "github.com/evmos/evmos/v16/utils" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - inflationtypes "github.com/evmos/evmos/v16/x/inflation/v1/types" + "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" + "github.com/evmos/evmos/v17/testutil/integration/evmos/network" + "github.com/evmos/evmos/v17/utils" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" + inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" - evmosutiltx "github.com/evmos/evmos/v16/testutil/tx" + evmosutiltx "github.com/evmos/evmos/v17/testutil/tx" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/precompiles/bank" + "github.com/evmos/evmos/v17/precompiles/bank" + + "github.com/evmos/evmos/v17/precompiles/testutil" + "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v16/precompiles/testutil" - "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" //nolint:revive // dot imports are fine for Ginkgo diff --git a/precompiles/bank/query_test.go b/precompiles/bank/query_test.go index 9803cacf28..31e901bacc 100644 --- a/precompiles/bank/query_test.go +++ b/precompiles/bank/query_test.go @@ -4,8 +4,8 @@ import ( "math/big" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/precompiles/bank" - evmosutiltx "github.com/evmos/evmos/v16/testutil/tx" + "github.com/evmos/evmos/v17/precompiles/bank" + evmosutiltx "github.com/evmos/evmos/v17/testutil/tx" ) func (s *PrecompileTestSuite) TestBalances() { diff --git a/precompiles/bank/setup_test.go b/precompiles/bank/setup_test.go index 03bf3382c4..0a74f0a42f 100644 --- a/precompiles/bank/setup_test.go +++ b/precompiles/bank/setup_test.go @@ -5,15 +5,15 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" - inflationtypes "github.com/evmos/evmos/v16/x/inflation/v1/types" + inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/precompiles/bank" - "github.com/evmos/evmos/v16/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v16/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v16/testutil/integration/evmos/network" + "github.com/evmos/evmos/v17/precompiles/bank" + "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v17/testutil/integration/evmos/network" "github.com/stretchr/testify/suite" ) diff --git a/precompiles/bank/testdata/bank.go b/precompiles/bank/testdata/bank.go index 8d838b65fc..c2c28cdfd6 100644 --- a/precompiles/bank/testdata/bank.go +++ b/precompiles/bank/testdata/bank.go @@ -7,7 +7,7 @@ import ( _ "embed" // embed compiled smart contract "encoding/json" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) var ( diff --git a/precompiles/bank/types.go b/precompiles/bank/types.go index bae206affa..c082a5d2cf 100644 --- a/precompiles/bank/types.go +++ b/precompiles/bank/types.go @@ -9,7 +9,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - cmn "github.com/evmos/evmos/v16/precompiles/common" + cmn "github.com/evmos/evmos/v17/precompiles/common" ) // Balance contains the amount for a corresponding ERC-20 contract address diff --git a/precompiles/bank/utils_test.go b/precompiles/bank/utils_test.go index 2ca887b1b0..b07c906ee4 100644 --- a/precompiles/bank/utils_test.go +++ b/precompiles/bank/utils_test.go @@ -6,10 +6,10 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/precompiles/bank" - "github.com/evmos/evmos/v16/testutil/integration/evmos/factory" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - inflationtypes "github.com/evmos/evmos/v16/x/inflation/v1/types" + "github.com/evmos/evmos/v17/precompiles/bank" + "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" + inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/gomega" diff --git a/precompiles/bech32/bech32.go b/precompiles/bech32/bech32.go index 9989bdaaf4..a9ae33da5b 100644 --- a/precompiles/bech32/bech32.go +++ b/precompiles/bech32/bech32.go @@ -10,7 +10,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v16/precompiles/common" + cmn "github.com/evmos/evmos/v17/precompiles/common" ) var _ vm.PrecompiledContract = &Precompile{} diff --git a/precompiles/bech32/bech32_test.go b/precompiles/bech32/bech32_test.go index 8114156529..a6aaed5bcf 100644 --- a/precompiles/bech32/bech32_test.go +++ b/precompiles/bech32/bech32_test.go @@ -6,8 +6,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v16/cmd/config" - "github.com/evmos/evmos/v16/precompiles/bech32" + "github.com/evmos/evmos/v17/cmd/config" + "github.com/evmos/evmos/v17/precompiles/bech32" ) func (s *PrecompileTestSuite) TestNewPrecompile() { diff --git a/precompiles/bech32/methods.go b/precompiles/bech32/methods.go index 7e110cf25c..5a39d5447c 100644 --- a/precompiles/bech32/methods.go +++ b/precompiles/bech32/methods.go @@ -10,7 +10,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - cmn "github.com/evmos/evmos/v16/precompiles/common" + cmn "github.com/evmos/evmos/v17/precompiles/common" ) const ( diff --git a/precompiles/bech32/methods_test.go b/precompiles/bech32/methods_test.go index c8a91be40a..1dfccc4a98 100644 --- a/precompiles/bech32/methods_test.go +++ b/precompiles/bech32/methods_test.go @@ -5,9 +5,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/cmd/config" - "github.com/evmos/evmos/v16/precompiles/bech32" - cmn "github.com/evmos/evmos/v16/precompiles/common" + "github.com/evmos/evmos/v17/cmd/config" + "github.com/evmos/evmos/v17/precompiles/bech32" + cmn "github.com/evmos/evmos/v17/precompiles/common" ) func (s *PrecompileTestSuite) TestHexToBech32() { diff --git a/precompiles/bech32/setup_test.go b/precompiles/bech32/setup_test.go index 63a5ec9f73..e258045936 100644 --- a/precompiles/bech32/setup_test.go +++ b/precompiles/bech32/setup_test.go @@ -3,10 +3,10 @@ package bech32_test import ( "testing" - "github.com/evmos/evmos/v16/precompiles/bech32" + "github.com/evmos/evmos/v17/precompiles/bech32" - testkeyring "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v16/testutil/integration/evmos/network" + testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v17/testutil/integration/evmos/network" "github.com/stretchr/testify/suite" ) diff --git a/precompiles/common/precompile.go b/precompiles/common/precompile.go index c5bea6de85..7eeaec904a 100644 --- a/precompiles/common/precompile.go +++ b/precompiles/common/precompile.go @@ -11,7 +11,7 @@ import ( authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v16/x/evm/statedb" + "github.com/evmos/evmos/v17/x/evm/statedb" ) // Precompile is a common struct for all precompiles that holds the common data each diff --git a/precompiles/common/types.go b/precompiles/common/types.go index ff2ad58375..5e20120cd0 100644 --- a/precompiles/common/types.go +++ b/precompiles/common/types.go @@ -11,7 +11,7 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - evmosutils "github.com/evmos/evmos/v16/utils" + evmosutils "github.com/evmos/evmos/v17/utils" ) var ( diff --git a/precompiles/common/types_test.go b/precompiles/common/types_test.go index 54a539d9c2..0aac9dd157 100644 --- a/precompiles/common/types_test.go +++ b/precompiles/common/types_test.go @@ -5,8 +5,8 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/precompiles/common" - "github.com/evmos/evmos/v16/utils" + "github.com/evmos/evmos/v17/precompiles/common" + "github.com/evmos/evmos/v17/utils" "github.com/stretchr/testify/require" ) diff --git a/precompiles/distribution/distribution.go b/precompiles/distribution/distribution.go index baa3c83612..ee00a97d4a 100644 --- a/precompiles/distribution/distribution.go +++ b/precompiles/distribution/distribution.go @@ -16,7 +16,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v16/precompiles/common" + cmn "github.com/evmos/evmos/v17/precompiles/common" ) var _ vm.PrecompiledContract = &Precompile{} diff --git a/precompiles/distribution/distribution_test.go b/precompiles/distribution/distribution_test.go index 0f90bf1ea8..be4b9c1483 100644 --- a/precompiles/distribution/distribution_test.go +++ b/precompiles/distribution/distribution_test.go @@ -9,10 +9,10 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/precompiles/distribution" - "github.com/evmos/evmos/v16/utils" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/precompiles/distribution" + "github.com/evmos/evmos/v17/utils" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) func (s *PrecompileTestSuite) TestIsTransaction() { diff --git a/precompiles/distribution/events.go b/precompiles/distribution/events.go index ca6872a29d..5be5faac34 100644 --- a/precompiles/distribution/events.go +++ b/precompiles/distribution/events.go @@ -12,7 +12,7 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v16/precompiles/common" + cmn "github.com/evmos/evmos/v17/precompiles/common" ) const ( diff --git a/precompiles/distribution/events_test.go b/precompiles/distribution/events_test.go index 7989b59b5d..ca884ceff1 100644 --- a/precompiles/distribution/events_test.go +++ b/precompiles/distribution/events_test.go @@ -9,9 +9,9 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" - cmn "github.com/evmos/evmos/v16/precompiles/common" - "github.com/evmos/evmos/v16/precompiles/distribution" - "github.com/evmos/evmos/v16/utils" + cmn "github.com/evmos/evmos/v17/precompiles/common" + "github.com/evmos/evmos/v17/precompiles/distribution" + "github.com/evmos/evmos/v17/utils" ) func (s *PrecompileTestSuite) TestSetWithdrawAddressEvent() { diff --git a/precompiles/distribution/integration_test.go b/precompiles/distribution/integration_test.go index d28f55f2b5..9c437bb8c8 100644 --- a/precompiles/distribution/integration_test.go +++ b/precompiles/distribution/integration_test.go @@ -6,7 +6,7 @@ import ( "fmt" "math/big" - "github.com/evmos/evmos/v16/utils" + "github.com/evmos/evmos/v17/utils" "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" @@ -15,12 +15,12 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v16/precompiles/common" - "github.com/evmos/evmos/v16/precompiles/distribution" - "github.com/evmos/evmos/v16/precompiles/testutil" - "github.com/evmos/evmos/v16/precompiles/testutil/contracts" - evmosutil "github.com/evmos/evmos/v16/testutil" - testutiltx "github.com/evmos/evmos/v16/testutil/tx" + cmn "github.com/evmos/evmos/v17/precompiles/common" + "github.com/evmos/evmos/v17/precompiles/distribution" + "github.com/evmos/evmos/v17/precompiles/testutil" + "github.com/evmos/evmos/v17/precompiles/testutil/contracts" + evmosutil "github.com/evmos/evmos/v17/testutil" + testutiltx "github.com/evmos/evmos/v17/testutil/tx" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" diff --git a/precompiles/distribution/query.go b/precompiles/distribution/query.go index 032272bdda..b713e72471 100644 --- a/precompiles/distribution/query.go +++ b/precompiles/distribution/query.go @@ -8,7 +8,7 @@ import ( distributionkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v16/precompiles/common" + cmn "github.com/evmos/evmos/v17/precompiles/common" ) const ( diff --git a/precompiles/distribution/query_test.go b/precompiles/distribution/query_test.go index 5a4973f6df..74e7288af4 100644 --- a/precompiles/distribution/query_test.go +++ b/precompiles/distribution/query_test.go @@ -12,11 +12,11 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v16/testutil" - testutiltx "github.com/evmos/evmos/v16/testutil/tx" + "github.com/evmos/evmos/v17/testutil" + testutiltx "github.com/evmos/evmos/v17/testutil/tx" - cmn "github.com/evmos/evmos/v16/precompiles/common" - "github.com/evmos/evmos/v16/precompiles/distribution" + cmn "github.com/evmos/evmos/v17/precompiles/common" + "github.com/evmos/evmos/v17/precompiles/distribution" ) var ( diff --git a/precompiles/distribution/setup_test.go b/precompiles/distribution/setup_test.go index e8dda389a1..92ac79152d 100644 --- a/precompiles/distribution/setup_test.go +++ b/precompiles/distribution/setup_test.go @@ -3,8 +3,8 @@ package distribution_test import ( "testing" - "github.com/evmos/evmos/v16/precompiles/distribution" - "github.com/evmos/evmos/v16/x/evm/statedb" + "github.com/evmos/evmos/v17/precompiles/distribution" + "github.com/evmos/evmos/v17/x/evm/statedb" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" @@ -18,8 +18,8 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - evmosapp "github.com/evmos/evmos/v16/app" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmosapp "github.com/evmos/evmos/v17/app" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" "github.com/stretchr/testify/suite" ) diff --git a/precompiles/distribution/tx.go b/precompiles/distribution/tx.go index 6bd3d683c6..0b293dbbf6 100644 --- a/precompiles/distribution/tx.go +++ b/precompiles/distribution/tx.go @@ -6,9 +6,9 @@ package distribution import ( "fmt" - "github.com/evmos/evmos/v16/x/evm/statedb" + "github.com/evmos/evmos/v17/x/evm/statedb" - cmn "github.com/evmos/evmos/v16/precompiles/common" + cmn "github.com/evmos/evmos/v17/precompiles/common" "github.com/ethereum/go-ethereum/common" diff --git a/precompiles/distribution/tx_test.go b/precompiles/distribution/tx_test.go index 7d336b9db7..e008b56310 100644 --- a/precompiles/distribution/tx_test.go +++ b/precompiles/distribution/tx_test.go @@ -6,16 +6,16 @@ import ( "cosmossdk.io/math" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v16/precompiles/testutil" + "github.com/evmos/evmos/v17/precompiles/testutil" "github.com/ethereum/go-ethereum/common" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/distribution/types" - cmn "github.com/evmos/evmos/v16/precompiles/common" - "github.com/evmos/evmos/v16/precompiles/distribution" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/utils" + cmn "github.com/evmos/evmos/v17/precompiles/common" + "github.com/evmos/evmos/v17/precompiles/distribution" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v17/utils" ) func (s *PrecompileTestSuite) TestSetWithdrawAddress() { diff --git a/precompiles/distribution/types.go b/precompiles/distribution/types.go index 7b23eb664a..770235b5c8 100644 --- a/precompiles/distribution/types.go +++ b/precompiles/distribution/types.go @@ -13,7 +13,7 @@ import ( distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - cmn "github.com/evmos/evmos/v16/precompiles/common" + cmn "github.com/evmos/evmos/v17/precompiles/common" ) // EventSetWithdrawAddress defines the event data for the SetWithdrawAddress transaction. diff --git a/precompiles/distribution/utils_test.go b/precompiles/distribution/utils_test.go index 581ba9a9b8..af31919851 100644 --- a/precompiles/distribution/utils_test.go +++ b/precompiles/distribution/utils_test.go @@ -20,16 +20,16 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - evmosapp "github.com/evmos/evmos/v16/app" - cmn "github.com/evmos/evmos/v16/precompiles/common" - "github.com/evmos/evmos/v16/precompiles/distribution" - evmosutil "github.com/evmos/evmos/v16/testutil" - evmosutiltx "github.com/evmos/evmos/v16/testutil/tx" - evmostypes "github.com/evmos/evmos/v16/types" - "github.com/evmos/evmos/v16/utils" - "github.com/evmos/evmos/v16/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - inflationtypes "github.com/evmos/evmos/v16/x/inflation/v1/types" + evmosapp "github.com/evmos/evmos/v17/app" + cmn "github.com/evmos/evmos/v17/precompiles/common" + "github.com/evmos/evmos/v17/precompiles/distribution" + evmosutil "github.com/evmos/evmos/v17/testutil" + evmosutiltx "github.com/evmos/evmos/v17/testutil/tx" + evmostypes "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v17/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" + inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" ) // SetupWithGenesisValSet initializes a new EvmosApp with a validator set and genesis accounts diff --git a/precompiles/erc20/approve.go b/precompiles/erc20/approve.go index a07ca82f67..0641571160 100644 --- a/precompiles/erc20/approve.go +++ b/precompiles/erc20/approve.go @@ -18,8 +18,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - auth "github.com/evmos/evmos/v16/precompiles/authorization" - cmn "github.com/evmos/evmos/v16/precompiles/common" + auth "github.com/evmos/evmos/v17/precompiles/authorization" + cmn "github.com/evmos/evmos/v17/precompiles/common" ) // Approve sets the given amount as the allowance of the spender address over diff --git a/precompiles/erc20/approve_test.go b/precompiles/erc20/approve_test.go index f953f4d484..e4d52b4a39 100644 --- a/precompiles/erc20/approve_test.go +++ b/precompiles/erc20/approve_test.go @@ -10,10 +10,10 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v16/precompiles/authorization" - cmn "github.com/evmos/evmos/v16/precompiles/common" - "github.com/evmos/evmos/v16/precompiles/erc20" - "github.com/evmos/evmos/v16/precompiles/testutil" + "github.com/evmos/evmos/v17/precompiles/authorization" + cmn "github.com/evmos/evmos/v17/precompiles/common" + "github.com/evmos/evmos/v17/precompiles/erc20" + "github.com/evmos/evmos/v17/precompiles/testutil" ) //nolint:dupl // tests are not duplicate between the functions diff --git a/precompiles/erc20/erc20.go b/precompiles/erc20/erc20.go index 4ccde1f401..c2c81907f3 100644 --- a/precompiles/erc20/erc20.go +++ b/precompiles/erc20/erc20.go @@ -7,7 +7,7 @@ import ( "embed" "fmt" - cmn "github.com/evmos/evmos/v16/precompiles/common" + cmn "github.com/evmos/evmos/v17/precompiles/common" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" @@ -17,9 +17,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - auth "github.com/evmos/evmos/v16/precompiles/authorization" - erc20types "github.com/evmos/evmos/v16/x/erc20/types" - transferkeeper "github.com/evmos/evmos/v16/x/ibc/transfer/keeper" + auth "github.com/evmos/evmos/v17/precompiles/authorization" + erc20types "github.com/evmos/evmos/v17/x/erc20/types" + transferkeeper "github.com/evmos/evmos/v17/x/ibc/transfer/keeper" ) const ( diff --git a/precompiles/erc20/erc20_test.go b/precompiles/erc20/erc20_test.go index ef5aef4d4d..fd815a5bff 100644 --- a/precompiles/erc20/erc20_test.go +++ b/precompiles/erc20/erc20_test.go @@ -6,8 +6,8 @@ package erc20_test import ( "math/big" - auth "github.com/evmos/evmos/v16/precompiles/authorization" - "github.com/evmos/evmos/v16/precompiles/erc20" + auth "github.com/evmos/evmos/v17/precompiles/authorization" + "github.com/evmos/evmos/v17/precompiles/erc20" ) func (s *PrecompileTestSuite) TestIsTransaction() { diff --git a/precompiles/erc20/errors.go b/precompiles/erc20/errors.go index 0a859e16a8..02073d023d 100644 --- a/precompiles/erc20/errors.go +++ b/precompiles/erc20/errors.go @@ -11,9 +11,9 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v16/ibc" - cmn "github.com/evmos/evmos/v16/precompiles/common" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/ibc" + cmn "github.com/evmos/evmos/v17/precompiles/common" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) // Errors that have formatted information are defined here as a string. diff --git a/precompiles/erc20/errors_test.go b/precompiles/erc20/errors_test.go index 2b7c052146..1ac6980922 100644 --- a/precompiles/erc20/errors_test.go +++ b/precompiles/erc20/errors_test.go @@ -1,8 +1,8 @@ package erc20_test import ( - "github.com/evmos/evmos/v16/precompiles/erc20" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/precompiles/erc20" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) // TODO: This is not yet producing the correct reason bytes so we skip this test for now, diff --git a/precompiles/erc20/events.go b/precompiles/erc20/events.go index c565e7471c..7291cf2b9b 100644 --- a/precompiles/erc20/events.go +++ b/precompiles/erc20/events.go @@ -13,8 +13,8 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" - auth "github.com/evmos/evmos/v16/precompiles/authorization" - cmn "github.com/evmos/evmos/v16/precompiles/common" + auth "github.com/evmos/evmos/v17/precompiles/authorization" + cmn "github.com/evmos/evmos/v17/precompiles/common" ) const ( diff --git a/precompiles/erc20/events_test.go b/precompiles/erc20/events_test.go index 139017dc38..1c8ad90bbd 100644 --- a/precompiles/erc20/events_test.go +++ b/precompiles/erc20/events_test.go @@ -5,10 +5,10 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v16/precompiles/authorization" - cmn "github.com/evmos/evmos/v16/precompiles/common" - erc20precompile "github.com/evmos/evmos/v16/precompiles/erc20" - utiltx "github.com/evmos/evmos/v16/testutil/tx" + "github.com/evmos/evmos/v17/precompiles/authorization" + cmn "github.com/evmos/evmos/v17/precompiles/common" + erc20precompile "github.com/evmos/evmos/v17/precompiles/erc20" + utiltx "github.com/evmos/evmos/v17/testutil/tx" ) //nolint:dupl // this is not a duplicate of the approval events test diff --git a/precompiles/erc20/integration_test.go b/precompiles/erc20/integration_test.go index 37860abc2a..badc156492 100644 --- a/precompiles/erc20/integration_test.go +++ b/precompiles/erc20/integration_test.go @@ -10,19 +10,19 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/contracts" - auth "github.com/evmos/evmos/v16/precompiles/authorization" - "github.com/evmos/evmos/v16/precompiles/erc20" - "github.com/evmos/evmos/v16/precompiles/erc20/testdata" - "github.com/evmos/evmos/v16/precompiles/testutil" - "github.com/evmos/evmos/v16/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v16/testutil/integration/evmos/grpc" - "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v16/testutil/integration/evmos/network" - "github.com/evmos/evmos/v16/testutil/integration/evmos/utils" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - erc20types "github.com/evmos/evmos/v16/x/erc20/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/contracts" + auth "github.com/evmos/evmos/v17/precompiles/authorization" + "github.com/evmos/evmos/v17/precompiles/erc20" + "github.com/evmos/evmos/v17/precompiles/erc20/testdata" + "github.com/evmos/evmos/v17/precompiles/testutil" + "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" + "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v17/testutil/integration/evmos/network" + "github.com/evmos/evmos/v17/testutil/integration/evmos/utils" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + erc20types "github.com/evmos/evmos/v17/x/erc20/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" diff --git a/precompiles/erc20/query.go b/precompiles/erc20/query.go index a36aee7d7c..5baf69cf9d 100644 --- a/precompiles/erc20/query.go +++ b/precompiles/erc20/query.go @@ -15,8 +15,8 @@ import ( "github.com/cosmos/cosmos-sdk/x/authz" authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/evmos/evmos/v16/ibc" - auth "github.com/evmos/evmos/v16/precompiles/authorization" + "github.com/evmos/evmos/v17/ibc" + auth "github.com/evmos/evmos/v17/precompiles/authorization" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" diff --git a/precompiles/erc20/query_test.go b/precompiles/erc20/query_test.go index 0d3a0befee..252004a9c9 100644 --- a/precompiles/erc20/query_test.go +++ b/precompiles/erc20/query_test.go @@ -13,11 +13,11 @@ import ( "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v16/app" - auth "github.com/evmos/evmos/v16/precompiles/authorization" - "github.com/evmos/evmos/v16/precompiles/erc20" - "github.com/evmos/evmos/v16/testutil" - inflationtypes "github.com/evmos/evmos/v16/x/inflation/v1/types" + "github.com/evmos/evmos/v17/app" + auth "github.com/evmos/evmos/v17/precompiles/authorization" + "github.com/evmos/evmos/v17/precompiles/erc20" + "github.com/evmos/evmos/v17/testutil" + inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" ) // Define useful variables for tests here. diff --git a/precompiles/erc20/setup_test.go b/precompiles/erc20/setup_test.go index e548bfaeb5..6c5d963e98 100644 --- a/precompiles/erc20/setup_test.go +++ b/precompiles/erc20/setup_test.go @@ -3,11 +3,11 @@ package erc20_test import ( "testing" - erc20precompile "github.com/evmos/evmos/v16/precompiles/erc20" - "github.com/evmos/evmos/v16/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v16/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v16/testutil/integration/evmos/network" + erc20precompile "github.com/evmos/evmos/v17/precompiles/erc20" + "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v17/testutil/integration/evmos/network" "github.com/stretchr/testify/suite" ) diff --git a/precompiles/erc20/testdata/erc20_allowance_caller.go b/precompiles/erc20/testdata/erc20_allowance_caller.go index 35e193cdfe..82850539a5 100644 --- a/precompiles/erc20/testdata/erc20_allowance_caller.go +++ b/precompiles/erc20/testdata/erc20_allowance_caller.go @@ -7,7 +7,7 @@ import ( _ "embed" // embed compiled smart contract "encoding/json" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) var ( diff --git a/precompiles/erc20/testdata/erc20_no_metadata.go b/precompiles/erc20/testdata/erc20_no_metadata.go index a471df528a..0da82be27a 100644 --- a/precompiles/erc20/testdata/erc20_no_metadata.go +++ b/precompiles/erc20/testdata/erc20_no_metadata.go @@ -8,9 +8,9 @@ import ( "encoding/json" "github.com/ethereum/go-ethereum/common" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" - "github.com/evmos/evmos/v16/x/erc20/types" + "github.com/evmos/evmos/v17/x/erc20/types" ) var ( diff --git a/precompiles/erc20/testdata/erc20minter_openzeppelinv5.go b/precompiles/erc20/testdata/erc20minter_openzeppelinv5.go index 727d6a24b5..1bbf8f7455 100644 --- a/precompiles/erc20/testdata/erc20minter_openzeppelinv5.go +++ b/precompiles/erc20/testdata/erc20minter_openzeppelinv5.go @@ -8,9 +8,9 @@ import ( "encoding/json" "github.com/ethereum/go-ethereum/common" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" - "github.com/evmos/evmos/v16/x/erc20/types" + "github.com/evmos/evmos/v17/x/erc20/types" ) var ( diff --git a/precompiles/erc20/tx_test.go b/precompiles/erc20/tx_test.go index 09a30ab258..4381815356 100644 --- a/precompiles/erc20/tx_test.go +++ b/precompiles/erc20/tx_test.go @@ -8,10 +8,10 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v16/precompiles/erc20" - "github.com/evmos/evmos/v16/precompiles/testutil" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - erc20types "github.com/evmos/evmos/v16/x/erc20/types" + "github.com/evmos/evmos/v17/precompiles/erc20" + "github.com/evmos/evmos/v17/precompiles/testutil" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + erc20types "github.com/evmos/evmos/v17/x/erc20/types" ) var ( diff --git a/precompiles/erc20/types_test.go b/precompiles/erc20/types_test.go index 12b0cc7b86..53b28b3d6c 100644 --- a/precompiles/erc20/types_test.go +++ b/precompiles/erc20/types_test.go @@ -3,8 +3,8 @@ package erc20_test import ( "math/big" - "github.com/evmos/evmos/v16/precompiles/erc20" - utiltx "github.com/evmos/evmos/v16/testutil/tx" + "github.com/evmos/evmos/v17/precompiles/erc20" + utiltx "github.com/evmos/evmos/v17/testutil/tx" ) //nolint:dupl // these tests are not duplicates diff --git a/precompiles/erc20/utils_test.go b/precompiles/erc20/utils_test.go index 19456dfff1..cb68bfa16a 100644 --- a/precompiles/erc20/utils_test.go +++ b/precompiles/erc20/utils_test.go @@ -13,16 +13,16 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - auth "github.com/evmos/evmos/v16/precompiles/authorization" - "github.com/evmos/evmos/v16/precompiles/erc20" - "github.com/evmos/evmos/v16/precompiles/testutil" - commonfactory "github.com/evmos/evmos/v16/testutil/integration/common/factory" - commonnetwork "github.com/evmos/evmos/v16/testutil/integration/common/network" - "github.com/evmos/evmos/v16/testutil/integration/evmos/factory" - network "github.com/evmos/evmos/v16/testutil/integration/evmos/network" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - erc20types "github.com/evmos/evmos/v16/x/erc20/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + auth "github.com/evmos/evmos/v17/precompiles/authorization" + "github.com/evmos/evmos/v17/precompiles/erc20" + "github.com/evmos/evmos/v17/precompiles/testutil" + commonfactory "github.com/evmos/evmos/v17/testutil/integration/common/factory" + commonnetwork "github.com/evmos/evmos/v17/testutil/integration/common/network" + "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" + network "github.com/evmos/evmos/v17/testutil/integration/evmos/network" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + erc20types "github.com/evmos/evmos/v17/x/erc20/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" //nolint:revive // dot imports are fine for Gomega . "github.com/onsi/gomega" diff --git a/precompiles/ics20/approve.go b/precompiles/ics20/approve.go index 4d86efe0cb..01bcbaefd8 100644 --- a/precompiles/ics20/approve.go +++ b/precompiles/ics20/approve.go @@ -8,7 +8,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v16/precompiles/authorization" + "github.com/evmos/evmos/v17/precompiles/authorization" ) // Approve implements the ICS20 approve transactions. diff --git a/precompiles/ics20/approve_common.go b/precompiles/ics20/approve_common.go index a4531fb1aa..bef611c268 100644 --- a/precompiles/ics20/approve_common.go +++ b/precompiles/ics20/approve_common.go @@ -9,7 +9,7 @@ import ( "math/big" "time" - "github.com/evmos/evmos/v16/precompiles/authorization" + "github.com/evmos/evmos/v17/precompiles/authorization" errorsmod "cosmossdk.io/errors" "cosmossdk.io/math" @@ -23,7 +23,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v16/precompiles/common" + cmn "github.com/evmos/evmos/v17/precompiles/common" ) // TransferMsgURL is the ICS20 transfer message URL string. diff --git a/precompiles/ics20/approve_test.go b/precompiles/ics20/approve_test.go index 51bebf3e0e..2da0943c56 100644 --- a/precompiles/ics20/approve_test.go +++ b/precompiles/ics20/approve_test.go @@ -10,10 +10,10 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" - "github.com/evmos/evmos/v16/precompiles/authorization" - cmn "github.com/evmos/evmos/v16/precompiles/common" - "github.com/evmos/evmos/v16/precompiles/ics20" - "github.com/evmos/evmos/v16/utils" + "github.com/evmos/evmos/v17/precompiles/authorization" + cmn "github.com/evmos/evmos/v17/precompiles/common" + "github.com/evmos/evmos/v17/precompiles/ics20" + "github.com/evmos/evmos/v17/utils" ) type allowanceTestCase struct { diff --git a/precompiles/ics20/events.go b/precompiles/ics20/events.go index ffaae24ca0..1cd934c4f3 100644 --- a/precompiles/ics20/events.go +++ b/precompiles/ics20/events.go @@ -9,7 +9,7 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v16/precompiles/common" + cmn "github.com/evmos/evmos/v17/precompiles/common" ) const ( diff --git a/precompiles/ics20/events_test.go b/precompiles/ics20/events_test.go index ec9fb478e2..b6acd35abb 100644 --- a/precompiles/ics20/events_test.go +++ b/precompiles/ics20/events_test.go @@ -7,10 +7,10 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v16/precompiles/authorization" - cmn "github.com/evmos/evmos/v16/precompiles/common" - "github.com/evmos/evmos/v16/precompiles/ics20" - "github.com/evmos/evmos/v16/utils" + "github.com/evmos/evmos/v17/precompiles/authorization" + cmn "github.com/evmos/evmos/v17/precompiles/common" + "github.com/evmos/evmos/v17/precompiles/ics20" + "github.com/evmos/evmos/v17/utils" ) func (s *PrecompileTestSuite) TestTransferEvent() { diff --git a/precompiles/ics20/ics20.go b/precompiles/ics20/ics20.go index f75db59a03..54becb847a 100644 --- a/precompiles/ics20/ics20.go +++ b/precompiles/ics20/ics20.go @@ -14,9 +14,9 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v16/precompiles/authorization" - cmn "github.com/evmos/evmos/v16/precompiles/common" - transferkeeper "github.com/evmos/evmos/v16/x/ibc/transfer/keeper" + "github.com/evmos/evmos/v17/precompiles/authorization" + cmn "github.com/evmos/evmos/v17/precompiles/common" + transferkeeper "github.com/evmos/evmos/v17/x/ibc/transfer/keeper" ) var _ vm.PrecompiledContract = &Precompile{} diff --git a/precompiles/ics20/integration_test.go b/precompiles/ics20/integration_test.go index 4138367f14..ce1d5f8063 100644 --- a/precompiles/ics20/integration_test.go +++ b/precompiles/ics20/integration_test.go @@ -14,19 +14,19 @@ import ( ibctesting "github.com/cosmos/ibc-go/v7/testing" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - evmoscontracts "github.com/evmos/evmos/v16/contracts" - evmostesting "github.com/evmos/evmos/v16/ibc/testing" - "github.com/evmos/evmos/v16/precompiles/authorization" - cmn "github.com/evmos/evmos/v16/precompiles/common" - "github.com/evmos/evmos/v16/precompiles/erc20" - "github.com/evmos/evmos/v16/precompiles/ics20" - "github.com/evmos/evmos/v16/precompiles/testutil" - "github.com/evmos/evmos/v16/precompiles/testutil/contracts" - evmosutil "github.com/evmos/evmos/v16/testutil" - teststypes "github.com/evmos/evmos/v16/types/tests" - "github.com/evmos/evmos/v16/utils" - erc20types "github.com/evmos/evmos/v16/x/erc20/types" - inflationtypes "github.com/evmos/evmos/v16/x/inflation/v1/types" + evmoscontracts "github.com/evmos/evmos/v17/contracts" + evmostesting "github.com/evmos/evmos/v17/ibc/testing" + "github.com/evmos/evmos/v17/precompiles/authorization" + cmn "github.com/evmos/evmos/v17/precompiles/common" + "github.com/evmos/evmos/v17/precompiles/erc20" + "github.com/evmos/evmos/v17/precompiles/ics20" + "github.com/evmos/evmos/v17/precompiles/testutil" + "github.com/evmos/evmos/v17/precompiles/testutil/contracts" + evmosutil "github.com/evmos/evmos/v17/testutil" + teststypes "github.com/evmos/evmos/v17/types/tests" + "github.com/evmos/evmos/v17/utils" + erc20types "github.com/evmos/evmos/v17/x/erc20/types" + inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" diff --git a/precompiles/ics20/query.go b/precompiles/ics20/query.go index 51db90bdf7..656021d2bf 100644 --- a/precompiles/ics20/query.go +++ b/precompiles/ics20/query.go @@ -11,8 +11,8 @@ import ( transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v16/precompiles/authorization" - cmn "github.com/evmos/evmos/v16/precompiles/common" + "github.com/evmos/evmos/v17/precompiles/authorization" + cmn "github.com/evmos/evmos/v17/precompiles/common" ) const ( diff --git a/precompiles/ics20/query_test.go b/precompiles/ics20/query_test.go index 40ff5e86a7..fb1af140eb 100644 --- a/precompiles/ics20/query_test.go +++ b/precompiles/ics20/query_test.go @@ -6,10 +6,10 @@ import ( "github.com/cosmos/cosmos-sdk/types/query" "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" ibctesting "github.com/cosmos/ibc-go/v7/testing" - "github.com/evmos/evmos/v16/precompiles/authorization" - cmn "github.com/evmos/evmos/v16/precompiles/common" - "github.com/evmos/evmos/v16/precompiles/ics20" - "github.com/evmos/evmos/v16/utils" + "github.com/evmos/evmos/v17/precompiles/authorization" + cmn "github.com/evmos/evmos/v17/precompiles/common" + "github.com/evmos/evmos/v17/precompiles/ics20" + "github.com/evmos/evmos/v17/utils" ) func (s *PrecompileTestSuite) TestDenomTrace() { diff --git a/precompiles/ics20/setup_test.go b/precompiles/ics20/setup_test.go index 8ec3df3458..da7ae4edcd 100644 --- a/precompiles/ics20/setup_test.go +++ b/precompiles/ics20/setup_test.go @@ -14,11 +14,11 @@ import ( ibctesting "github.com/cosmos/ibc-go/v7/testing" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - evmosapp "github.com/evmos/evmos/v16/app" - evmosibc "github.com/evmos/evmos/v16/ibc/testing" - "github.com/evmos/evmos/v16/precompiles/ics20" - "github.com/evmos/evmos/v16/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmosapp "github.com/evmos/evmos/v17/app" + evmosibc "github.com/evmos/evmos/v17/ibc/testing" + "github.com/evmos/evmos/v17/precompiles/ics20" + "github.com/evmos/evmos/v17/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" diff --git a/precompiles/ics20/tx_test.go b/precompiles/ics20/tx_test.go index 2af80e842b..aff9936fd4 100644 --- a/precompiles/ics20/tx_test.go +++ b/precompiles/ics20/tx_test.go @@ -10,11 +10,11 @@ import ( channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v16/precompiles/common" - "github.com/evmos/evmos/v16/precompiles/ics20" - evmosutil "github.com/evmos/evmos/v16/testutil" - testutiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/utils" + cmn "github.com/evmos/evmos/v17/precompiles/common" + "github.com/evmos/evmos/v17/precompiles/ics20" + evmosutil "github.com/evmos/evmos/v17/testutil" + testutiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v17/utils" ) var ( diff --git a/precompiles/ics20/types.go b/precompiles/ics20/types.go index 921974ba40..1513c1c921 100644 --- a/precompiles/ics20/types.go +++ b/precompiles/ics20/types.go @@ -20,8 +20,8 @@ import ( clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/precompiles/authorization" - cmn "github.com/evmos/evmos/v16/precompiles/common" + "github.com/evmos/evmos/v17/precompiles/authorization" + cmn "github.com/evmos/evmos/v17/precompiles/common" ) const ( diff --git a/precompiles/ics20/utils_test.go b/precompiles/ics20/utils_test.go index bf43783418..baf72e9b31 100644 --- a/precompiles/ics20/utils_test.go +++ b/precompiles/ics20/utils_test.go @@ -30,23 +30,23 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" - evmosapp "github.com/evmos/evmos/v16/app" - evmoscontracts "github.com/evmos/evmos/v16/contracts" - evmosibc "github.com/evmos/evmos/v16/ibc/testing" - "github.com/evmos/evmos/v16/precompiles/authorization" - cmn "github.com/evmos/evmos/v16/precompiles/common" - "github.com/evmos/evmos/v16/precompiles/erc20" - "github.com/evmos/evmos/v16/precompiles/ics20" - "github.com/evmos/evmos/v16/precompiles/testutil" - "github.com/evmos/evmos/v16/precompiles/testutil/contracts" - evmosutil "github.com/evmos/evmos/v16/testutil" - evmosutiltx "github.com/evmos/evmos/v16/testutil/tx" - evmostypes "github.com/evmos/evmos/v16/types" - "github.com/evmos/evmos/v16/utils" - "github.com/evmos/evmos/v16/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" - inflationtypes "github.com/evmos/evmos/v16/x/inflation/v1/types" + evmosapp "github.com/evmos/evmos/v17/app" + evmoscontracts "github.com/evmos/evmos/v17/contracts" + evmosibc "github.com/evmos/evmos/v17/ibc/testing" + "github.com/evmos/evmos/v17/precompiles/authorization" + cmn "github.com/evmos/evmos/v17/precompiles/common" + "github.com/evmos/evmos/v17/precompiles/erc20" + "github.com/evmos/evmos/v17/precompiles/ics20" + "github.com/evmos/evmos/v17/precompiles/testutil" + "github.com/evmos/evmos/v17/precompiles/testutil/contracts" + evmosutil "github.com/evmos/evmos/v17/testutil" + evmosutiltx "github.com/evmos/evmos/v17/testutil/tx" + evmostypes "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v17/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" + inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/gomega" diff --git a/precompiles/outposts/osmosis/events.go b/precompiles/outposts/osmosis/events.go index 8030a79004..77b2a2de3b 100644 --- a/precompiles/outposts/osmosis/events.go +++ b/precompiles/outposts/osmosis/events.go @@ -11,7 +11,7 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v16/precompiles/common" + cmn "github.com/evmos/evmos/v17/precompiles/common" ) const ( diff --git a/precompiles/outposts/osmosis/events_test.go b/precompiles/outposts/osmosis/events_test.go index 2be39ca2f0..5c075aa1a7 100644 --- a/precompiles/outposts/osmosis/events_test.go +++ b/precompiles/outposts/osmosis/events_test.go @@ -4,10 +4,10 @@ import ( "math/big" "github.com/ethereum/go-ethereum/common" - cmn "github.com/evmos/evmos/v16/precompiles/common" - "github.com/evmos/evmos/v16/precompiles/outposts/osmosis" - evmosutiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/x/evm/statedb" + cmn "github.com/evmos/evmos/v17/precompiles/common" + "github.com/evmos/evmos/v17/precompiles/outposts/osmosis" + evmosutiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v17/x/evm/statedb" ) func (s *PrecompileTestSuite) TestSwapEvent() { diff --git a/precompiles/outposts/osmosis/osmosis.go b/precompiles/outposts/osmosis/osmosis.go index 07cc2a0102..bc57d0b3ea 100644 --- a/precompiles/outposts/osmosis/osmosis.go +++ b/precompiles/outposts/osmosis/osmosis.go @@ -15,9 +15,9 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v16/precompiles/common" - erc20keeper "github.com/evmos/evmos/v16/x/erc20/keeper" - transferkeeper "github.com/evmos/evmos/v16/x/ibc/transfer/keeper" + cmn "github.com/evmos/evmos/v17/precompiles/common" + erc20keeper "github.com/evmos/evmos/v17/x/erc20/keeper" + transferkeeper "github.com/evmos/evmos/v17/x/ibc/transfer/keeper" ) const ( diff --git a/precompiles/outposts/osmosis/setup_test.go b/precompiles/outposts/osmosis/setup_test.go index 8a003c06f7..f8047c3db6 100644 --- a/precompiles/outposts/osmosis/setup_test.go +++ b/precompiles/outposts/osmosis/setup_test.go @@ -6,13 +6,13 @@ package osmosis_test import ( "testing" - "github.com/evmos/evmos/v16/precompiles/erc20" + "github.com/evmos/evmos/v17/precompiles/erc20" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/precompiles/outposts/osmosis" - "github.com/evmos/evmos/v16/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v16/testutil/integration/evmos/network" + "github.com/evmos/evmos/v17/precompiles/outposts/osmosis" + "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v17/testutil/integration/evmos/network" "github.com/stretchr/testify/suite" ) diff --git a/precompiles/outposts/osmosis/tx.go b/precompiles/outposts/osmosis/tx.go index 94d0051981..1560bf018f 100644 --- a/precompiles/outposts/osmosis/tx.go +++ b/precompiles/outposts/osmosis/tx.go @@ -19,7 +19,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v16/precompiles/ics20" + "github.com/evmos/evmos/v17/precompiles/ics20" ) const ( diff --git a/precompiles/outposts/osmosis/tx_test.go b/precompiles/outposts/osmosis/tx_test.go index bd966bcde2..f6aa320466 100644 --- a/precompiles/outposts/osmosis/tx_test.go +++ b/precompiles/outposts/osmosis/tx_test.go @@ -4,22 +4,22 @@ import ( "fmt" "math/big" - "github.com/evmos/evmos/v16/precompiles/erc20" + "github.com/evmos/evmos/v17/precompiles/erc20" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" sdktypes "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/precompiles/authorization" - cmn "github.com/evmos/evmos/v16/precompiles/common" - "github.com/evmos/evmos/v16/precompiles/ics20" - "github.com/evmos/evmos/v16/precompiles/outposts/osmosis" - commonnetwork "github.com/evmos/evmos/v16/testutil/integration/common/network" - testutils "github.com/evmos/evmos/v16/testutil/integration/evmos/utils" - "github.com/evmos/evmos/v16/testutil/integration/ibc/coordinator" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/utils" + "github.com/evmos/evmos/v17/precompiles/authorization" + cmn "github.com/evmos/evmos/v17/precompiles/common" + "github.com/evmos/evmos/v17/precompiles/ics20" + "github.com/evmos/evmos/v17/precompiles/outposts/osmosis" + commonnetwork "github.com/evmos/evmos/v17/testutil/integration/common/network" + testutils "github.com/evmos/evmos/v17/testutil/integration/evmos/utils" + "github.com/evmos/evmos/v17/testutil/integration/ibc/coordinator" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v17/utils" ) func (s *PrecompileTestSuite) TestSwap() { diff --git a/precompiles/outposts/osmosis/types.go b/precompiles/outposts/osmosis/types.go index 094b050474..0e340c658b 100644 --- a/precompiles/outposts/osmosis/types.go +++ b/precompiles/outposts/osmosis/types.go @@ -18,8 +18,8 @@ import ( "github.com/ethereum/go-ethereum/common" - cmn "github.com/evmos/evmos/v16/precompiles/common" - "github.com/evmos/evmos/v16/utils" + cmn "github.com/evmos/evmos/v17/precompiles/common" + "github.com/evmos/evmos/v17/utils" ) const ( diff --git a/precompiles/outposts/osmosis/types_test.go b/precompiles/outposts/osmosis/types_test.go index c372a8d678..da0c6e943d 100644 --- a/precompiles/outposts/osmosis/types_test.go +++ b/precompiles/outposts/osmosis/types_test.go @@ -8,9 +8,9 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/require" - cmn "github.com/evmos/evmos/v16/precompiles/common" - osmosisoutpost "github.com/evmos/evmos/v16/precompiles/outposts/osmosis" - "github.com/evmos/evmos/v16/utils" + cmn "github.com/evmos/evmos/v17/precompiles/common" + osmosisoutpost "github.com/evmos/evmos/v17/precompiles/outposts/osmosis" + "github.com/evmos/evmos/v17/utils" ) func TestCreatePacketWithMemo(t *testing.T) { diff --git a/precompiles/outposts/stride/events.go b/precompiles/outposts/stride/events.go index ecf2d76d20..cfca688f9d 100644 --- a/precompiles/outposts/stride/events.go +++ b/precompiles/outposts/stride/events.go @@ -11,7 +11,7 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v16/precompiles/common" + cmn "github.com/evmos/evmos/v17/precompiles/common" ) const ( diff --git a/precompiles/outposts/stride/events_test.go b/precompiles/outposts/stride/events_test.go index d3f2bcc0e6..3c09c25754 100644 --- a/precompiles/outposts/stride/events_test.go +++ b/precompiles/outposts/stride/events_test.go @@ -7,9 +7,9 @@ import ( transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" "github.com/ethereum/go-ethereum/common" - cmn "github.com/evmos/evmos/v16/precompiles/common" - "github.com/evmos/evmos/v16/precompiles/outposts/stride" - "github.com/evmos/evmos/v16/utils" + cmn "github.com/evmos/evmos/v17/precompiles/common" + "github.com/evmos/evmos/v17/precompiles/outposts/stride" + "github.com/evmos/evmos/v17/utils" ) const receiver = "stride1rhe5leyt5w0mcwd9rpp93zqn99yktsxvyaqgd0" diff --git a/precompiles/outposts/stride/setup_test.go b/precompiles/outposts/stride/setup_test.go index 4bd9564a55..4892538303 100644 --- a/precompiles/outposts/stride/setup_test.go +++ b/precompiles/outposts/stride/setup_test.go @@ -6,13 +6,13 @@ package stride_test import ( "testing" - "github.com/evmos/evmos/v16/precompiles/erc20" + "github.com/evmos/evmos/v17/precompiles/erc20" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/precompiles/outposts/stride" - "github.com/evmos/evmos/v16/testutil/integration/common/grpc" - testkeyring "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v16/testutil/integration/evmos/network" + "github.com/evmos/evmos/v17/precompiles/outposts/stride" + "github.com/evmos/evmos/v17/testutil/integration/common/grpc" + testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v17/testutil/integration/evmos/network" "github.com/stretchr/testify/suite" ) diff --git a/precompiles/outposts/stride/stride.go b/precompiles/outposts/stride/stride.go index 50c97d9b45..a608ace8a6 100644 --- a/precompiles/outposts/stride/stride.go +++ b/precompiles/outposts/stride/stride.go @@ -13,9 +13,9 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v16/precompiles/common" - erc20keeper "github.com/evmos/evmos/v16/x/erc20/keeper" - transferkeeper "github.com/evmos/evmos/v16/x/ibc/transfer/keeper" + cmn "github.com/evmos/evmos/v17/precompiles/common" + erc20keeper "github.com/evmos/evmos/v17/x/erc20/keeper" + transferkeeper "github.com/evmos/evmos/v17/x/ibc/transfer/keeper" ) var _ vm.PrecompiledContract = &Precompile{} diff --git a/precompiles/outposts/stride/tx.go b/precompiles/outposts/stride/tx.go index 469617b709..59b40f1641 100644 --- a/precompiles/outposts/stride/tx.go +++ b/precompiles/outposts/stride/tx.go @@ -10,13 +10,13 @@ import ( transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" "cosmossdk.io/math" - "github.com/evmos/evmos/v16/utils" + "github.com/evmos/evmos/v17/utils" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v16/precompiles/ics20" + "github.com/evmos/evmos/v17/precompiles/ics20" ) const ( diff --git a/precompiles/outposts/stride/tx_test.go b/precompiles/outposts/stride/tx_test.go index 1baa1a14d6..1b05037886 100644 --- a/precompiles/outposts/stride/tx_test.go +++ b/precompiles/outposts/stride/tx_test.go @@ -7,15 +7,15 @@ import ( "fmt" "math/big" - "github.com/evmos/evmos/v16/precompiles/erc20" + "github.com/evmos/evmos/v17/precompiles/erc20" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v16/utils" + "github.com/evmos/evmos/v17/utils" common "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v16/precompiles/common" - "github.com/evmos/evmos/v16/precompiles/outposts/stride" + cmn "github.com/evmos/evmos/v17/precompiles/common" + "github.com/evmos/evmos/v17/precompiles/outposts/stride" ) const ( diff --git a/precompiles/outposts/stride/types.go b/precompiles/outposts/stride/types.go index 5a8d274001..05610ddd71 100644 --- a/precompiles/outposts/stride/types.go +++ b/precompiles/outposts/stride/types.go @@ -10,11 +10,11 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/evmos/evmos/v16/utils" + "github.com/evmos/evmos/v17/utils" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/ethereum/go-ethereum/common" - cmn "github.com/evmos/evmos/v16/precompiles/common" + cmn "github.com/evmos/evmos/v17/precompiles/common" ) const ( diff --git a/precompiles/outposts/stride/types_test.go b/precompiles/outposts/stride/types_test.go index 01f6d1ff5d..cfb8bb29d3 100644 --- a/precompiles/outposts/stride/types_test.go +++ b/precompiles/outposts/stride/types_test.go @@ -3,7 +3,7 @@ package stride_test import ( "testing" - strideoutpost "github.com/evmos/evmos/v16/precompiles/outposts/stride" + strideoutpost "github.com/evmos/evmos/v17/precompiles/outposts/stride" "github.com/stretchr/testify/require" ) diff --git a/precompiles/outposts/stride/utils_test.go b/precompiles/outposts/stride/utils_test.go index d40f389d65..c069ccef50 100644 --- a/precompiles/outposts/stride/utils_test.go +++ b/precompiles/outposts/stride/utils_test.go @@ -6,15 +6,15 @@ import ( "fmt" "cosmossdk.io/math" - commonnetwork "github.com/evmos/evmos/v16/testutil/integration/common/network" - "github.com/evmos/evmos/v16/testutil/integration/ibc/coordinator" + commonnetwork "github.com/evmos/evmos/v17/testutil/integration/common/network" + "github.com/evmos/evmos/v17/testutil/integration/ibc/coordinator" - erc20types "github.com/evmos/evmos/v16/x/erc20/types" + erc20types "github.com/evmos/evmos/v17/x/erc20/types" sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - inflationtypes "github.com/evmos/evmos/v16/x/inflation/v1/types" + inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" ) const ( diff --git a/precompiles/p256/integration_test.go b/precompiles/p256/integration_test.go index 99703cf936..70f4182655 100644 --- a/precompiles/p256/integration_test.go +++ b/precompiles/p256/integration_test.go @@ -15,13 +15,13 @@ import ( //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/gomega" - "github.com/evmos/evmos/v16/precompiles/p256" - "github.com/evmos/evmos/v16/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v16/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v16/testutil/integration/evmos/network" - "github.com/evmos/evmos/v16/testutil/integration/evmos/utils" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/precompiles/p256" + "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v17/testutil/integration/evmos/network" + "github.com/evmos/evmos/v17/testutil/integration/evmos/utils" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) type IntegrationTestSuite struct { diff --git a/precompiles/p256/p256.go b/precompiles/p256/p256.go index 26a0686560..a959a52e6e 100644 --- a/precompiles/p256/p256.go +++ b/precompiles/p256/p256.go @@ -21,7 +21,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v16/crypto/secp256r1" + "github.com/evmos/evmos/v17/crypto/secp256r1" ) var _ vm.PrecompiledContract = &Precompile{} diff --git a/precompiles/p256/p256_test.go b/precompiles/p256/p256_test.go index 5fae4b8759..e27782a6a4 100644 --- a/precompiles/p256/p256_test.go +++ b/precompiles/p256/p256_test.go @@ -10,7 +10,7 @@ import ( "github.com/cometbft/cometbft/crypto" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v16/precompiles/p256" + "github.com/evmos/evmos/v17/precompiles/p256" ) var trueValue = common.LeftPadBytes(common.Big1.Bytes(), 32) diff --git a/precompiles/p256/setup_test.go b/precompiles/p256/setup_test.go index 4d1b2f6c93..2cf02c6174 100644 --- a/precompiles/p256/setup_test.go +++ b/precompiles/p256/setup_test.go @@ -15,7 +15,7 @@ import ( . "github.com/onsi/gomega" "github.com/cometbft/cometbft/crypto" - "github.com/evmos/evmos/v16/precompiles/p256" + "github.com/evmos/evmos/v17/precompiles/p256" "github.com/stretchr/testify/suite" "golang.org/x/crypto/cryptobyte" "golang.org/x/crypto/cryptobyte/asn1" diff --git a/precompiles/staking/approve.go b/precompiles/staking/approve.go index 42d30dd714..db018e6c56 100644 --- a/precompiles/staking/approve.go +++ b/precompiles/staking/approve.go @@ -15,8 +15,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v16/precompiles/authorization" - cmn "github.com/evmos/evmos/v16/precompiles/common" + "github.com/evmos/evmos/v17/precompiles/authorization" + cmn "github.com/evmos/evmos/v17/precompiles/common" ) var ( diff --git a/precompiles/staking/approve_test.go b/precompiles/staking/approve_test.go index aa4281e85a..7b8483ce6c 100644 --- a/precompiles/staking/approve_test.go +++ b/precompiles/staking/approve_test.go @@ -7,17 +7,17 @@ import ( "cosmossdk.io/math" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - evmosutiltx "github.com/evmos/evmos/v16/testutil/tx" + evmosutiltx "github.com/evmos/evmos/v17/testutil/tx" sdk "github.com/cosmos/cosmos-sdk/types" sdkauthz "github.com/cosmos/cosmos-sdk/x/authz" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v16/precompiles/authorization" - cmn "github.com/evmos/evmos/v16/precompiles/common" - "github.com/evmos/evmos/v16/precompiles/staking" - "github.com/evmos/evmos/v16/precompiles/testutil" - evmosutil "github.com/evmos/evmos/v16/testutil" + "github.com/evmos/evmos/v17/precompiles/authorization" + cmn "github.com/evmos/evmos/v17/precompiles/common" + "github.com/evmos/evmos/v17/precompiles/staking" + "github.com/evmos/evmos/v17/precompiles/testutil" + evmosutil "github.com/evmos/evmos/v17/testutil" ) func (s *PrecompileTestSuite) TestApprove() { diff --git a/precompiles/staking/events.go b/precompiles/staking/events.go index e7c01e5423..98f780646b 100644 --- a/precompiles/staking/events.go +++ b/precompiles/staking/events.go @@ -8,7 +8,7 @@ import ( "math/big" "reflect" - "github.com/evmos/evmos/v16/precompiles/authorization" + "github.com/evmos/evmos/v17/precompiles/authorization" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" @@ -16,7 +16,7 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v16/precompiles/common" + cmn "github.com/evmos/evmos/v17/precompiles/common" ) const ( diff --git a/precompiles/staking/events_test.go b/precompiles/staking/events_test.go index 585dd89f3f..1a8d9799e2 100644 --- a/precompiles/staking/events_test.go +++ b/precompiles/staking/events_test.go @@ -10,9 +10,9 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v16/precompiles/authorization" - cmn "github.com/evmos/evmos/v16/precompiles/common" - "github.com/evmos/evmos/v16/precompiles/staking" + "github.com/evmos/evmos/v17/precompiles/authorization" + cmn "github.com/evmos/evmos/v17/precompiles/common" + "github.com/evmos/evmos/v17/precompiles/staking" ) func (s *PrecompileTestSuite) TestApprovalEvent() { diff --git a/precompiles/staking/integration_test.go b/precompiles/staking/integration_test.go index 76a62da556..26603dccd4 100644 --- a/precompiles/staking/integration_test.go +++ b/precompiles/staking/integration_test.go @@ -19,17 +19,17 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - compiledcontracts "github.com/evmos/evmos/v16/contracts" - "github.com/evmos/evmos/v16/precompiles/authorization" - cmn "github.com/evmos/evmos/v16/precompiles/common" - "github.com/evmos/evmos/v16/precompiles/distribution" - "github.com/evmos/evmos/v16/precompiles/staking" - "github.com/evmos/evmos/v16/precompiles/staking/testdata" - "github.com/evmos/evmos/v16/precompiles/testutil" - "github.com/evmos/evmos/v16/precompiles/testutil/contracts" - evmosutil "github.com/evmos/evmos/v16/testutil" - testutiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/utils" + compiledcontracts "github.com/evmos/evmos/v17/contracts" + "github.com/evmos/evmos/v17/precompiles/authorization" + cmn "github.com/evmos/evmos/v17/precompiles/common" + "github.com/evmos/evmos/v17/precompiles/distribution" + "github.com/evmos/evmos/v17/precompiles/staking" + "github.com/evmos/evmos/v17/precompiles/staking/testdata" + "github.com/evmos/evmos/v17/precompiles/testutil" + "github.com/evmos/evmos/v17/precompiles/testutil/contracts" + evmosutil "github.com/evmos/evmos/v17/testutil" + testutiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v17/utils" ) // General variables used for integration tests diff --git a/precompiles/staking/query.go b/precompiles/staking/query.go index cb8b482b12..1e223f7a13 100644 --- a/precompiles/staking/query.go +++ b/precompiles/staking/query.go @@ -13,8 +13,8 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v16/precompiles/authorization" - cmn "github.com/evmos/evmos/v16/precompiles/common" + "github.com/evmos/evmos/v17/precompiles/authorization" + cmn "github.com/evmos/evmos/v17/precompiles/common" ) const ( diff --git a/precompiles/staking/query_test.go b/precompiles/staking/query_test.go index 7e057590b0..31f757c06f 100644 --- a/precompiles/staking/query_test.go +++ b/precompiles/staking/query_test.go @@ -10,10 +10,10 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v16/precompiles/authorization" - cmn "github.com/evmos/evmos/v16/precompiles/common" - "github.com/evmos/evmos/v16/precompiles/staking" - testutiltx "github.com/evmos/evmos/v16/testutil/tx" + "github.com/evmos/evmos/v17/precompiles/authorization" + cmn "github.com/evmos/evmos/v17/precompiles/common" + "github.com/evmos/evmos/v17/precompiles/staking" + testutiltx "github.com/evmos/evmos/v17/testutil/tx" ) func (s *PrecompileTestSuite) TestDelegation() { diff --git a/precompiles/staking/setup_test.go b/precompiles/staking/setup_test.go index 08ae85b33b..ffcaec09fc 100644 --- a/precompiles/staking/setup_test.go +++ b/precompiles/staking/setup_test.go @@ -9,10 +9,10 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - evmosapp "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/precompiles/staking" - "github.com/evmos/evmos/v16/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmosapp "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/precompiles/staking" + "github.com/evmos/evmos/v17/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" diff --git a/precompiles/staking/staking.go b/precompiles/staking/staking.go index efa998d6fb..3a04db43a2 100644 --- a/precompiles/staking/staking.go +++ b/precompiles/staking/staking.go @@ -15,8 +15,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v16/precompiles/authorization" - cmn "github.com/evmos/evmos/v16/precompiles/common" + "github.com/evmos/evmos/v17/precompiles/authorization" + cmn "github.com/evmos/evmos/v17/precompiles/common" ) var _ vm.PrecompiledContract = &Precompile{} diff --git a/precompiles/staking/staking_test.go b/precompiles/staking/staking_test.go index 548f1188f5..97a1edd619 100644 --- a/precompiles/staking/staking_test.go +++ b/precompiles/staking/staking_test.go @@ -12,11 +12,11 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/precompiles/authorization" - "github.com/evmos/evmos/v16/precompiles/staking" - "github.com/evmos/evmos/v16/utils" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/precompiles/authorization" + "github.com/evmos/evmos/v17/precompiles/staking" + "github.com/evmos/evmos/v17/utils" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) func (s *PrecompileTestSuite) TestIsTransaction() { diff --git a/precompiles/staking/testdata/staking_caller.go b/precompiles/staking/testdata/staking_caller.go index 8545296fb4..acab33e507 100644 --- a/precompiles/staking/testdata/staking_caller.go +++ b/precompiles/staking/testdata/staking_caller.go @@ -7,7 +7,7 @@ import ( _ "embed" // embed compiled smart contract "encoding/json" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) var ( diff --git a/precompiles/staking/tx.go b/precompiles/staking/tx.go index d55d6097aa..1e859e709d 100644 --- a/precompiles/staking/tx.go +++ b/precompiles/staking/tx.go @@ -13,8 +13,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v16/precompiles/authorization" - "github.com/evmos/evmos/v16/x/evm/statedb" + "github.com/evmos/evmos/v17/precompiles/authorization" + "github.com/evmos/evmos/v17/x/evm/statedb" ) const ( diff --git a/precompiles/staking/tx_test.go b/precompiles/staking/tx_test.go index d3b4cf7112..fd695ebafb 100644 --- a/precompiles/staking/tx_test.go +++ b/precompiles/staking/tx_test.go @@ -10,10 +10,10 @@ import ( geth "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" - cmn "github.com/evmos/evmos/v16/precompiles/common" - "github.com/evmos/evmos/v16/precompiles/staking" - "github.com/evmos/evmos/v16/precompiles/testutil" - evmosutiltx "github.com/evmos/evmos/v16/testutil/tx" + cmn "github.com/evmos/evmos/v17/precompiles/common" + "github.com/evmos/evmos/v17/precompiles/staking" + "github.com/evmos/evmos/v17/precompiles/testutil" + evmosutiltx "github.com/evmos/evmos/v17/testutil/tx" ) func (s *PrecompileTestSuite) TestCreateValidator() { diff --git a/precompiles/staking/types.go b/precompiles/staking/types.go index 429b38ac6a..9eae54e055 100644 --- a/precompiles/staking/types.go +++ b/precompiles/staking/types.go @@ -19,7 +19,7 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - cmn "github.com/evmos/evmos/v16/precompiles/common" + cmn "github.com/evmos/evmos/v17/precompiles/common" ) // EventCreateValidator defines the event data for the staking CreateValidator transaction. diff --git a/precompiles/staking/utils_test.go b/precompiles/staking/utils_test.go index 952e0c5de9..f0f1fbdee4 100644 --- a/precompiles/staking/utils_test.go +++ b/precompiles/staking/utils_test.go @@ -26,19 +26,19 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - evmosapp "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/precompiles/authorization" - cmn "github.com/evmos/evmos/v16/precompiles/common" - "github.com/evmos/evmos/v16/precompiles/staking" - "github.com/evmos/evmos/v16/precompiles/testutil" - "github.com/evmos/evmos/v16/precompiles/testutil/contracts" - evmosutil "github.com/evmos/evmos/v16/testutil" - testutiltx "github.com/evmos/evmos/v16/testutil/tx" - evmostypes "github.com/evmos/evmos/v16/types" - "github.com/evmos/evmos/v16/utils" - "github.com/evmos/evmos/v16/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - inflationtypes "github.com/evmos/evmos/v16/x/inflation/v1/types" + evmosapp "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/precompiles/authorization" + cmn "github.com/evmos/evmos/v17/precompiles/common" + "github.com/evmos/evmos/v17/precompiles/staking" + "github.com/evmos/evmos/v17/precompiles/testutil" + "github.com/evmos/evmos/v17/precompiles/testutil/contracts" + evmosutil "github.com/evmos/evmos/v17/testutil" + testutiltx "github.com/evmos/evmos/v17/testutil/tx" + evmostypes "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v17/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" + inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" ) // SetupWithGenesisValSet initializes a new EvmosApp with a validator set and genesis accounts diff --git a/precompiles/testutil/contracts/contracts.go b/precompiles/testutil/contracts/contracts.go index fd0d04ec9b..3c0e6c014d 100644 --- a/precompiles/testutil/contracts/contracts.go +++ b/precompiles/testutil/contracts/contracts.go @@ -11,11 +11,11 @@ import ( abci "github.com/cometbft/cometbft/abci/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/crypto" - evmosapp "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" - "github.com/evmos/evmos/v16/precompiles/testutil" - evmosutil "github.com/evmos/evmos/v16/testutil" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmosapp "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + "github.com/evmos/evmos/v17/precompiles/testutil" + evmosutil "github.com/evmos/evmos/v17/testutil" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) // Call is a helper function to call any arbitrary smart contract. diff --git a/precompiles/testutil/contracts/distribution_caller.go b/precompiles/testutil/contracts/distribution_caller.go index 3a67aaf03b..6ff750997e 100644 --- a/precompiles/testutil/contracts/distribution_caller.go +++ b/precompiles/testutil/contracts/distribution_caller.go @@ -7,7 +7,7 @@ import ( _ "embed" // embed compiled smart contract "encoding/json" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) var ( diff --git a/precompiles/testutil/contracts/interchain_sender.go b/precompiles/testutil/contracts/interchain_sender.go index d6277ea87d..1d03c0396e 100644 --- a/precompiles/testutil/contracts/interchain_sender.go +++ b/precompiles/testutil/contracts/interchain_sender.go @@ -7,7 +7,7 @@ import ( _ "embed" // embed compiled smart contract "encoding/json" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) var ( diff --git a/precompiles/testutil/contracts/types.go b/precompiles/testutil/contracts/types.go index c1b4f301d1..9f06a26dd1 100644 --- a/precompiles/testutil/contracts/types.go +++ b/precompiles/testutil/contracts/types.go @@ -10,7 +10,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" ) // CallArgs is a struct to define all relevant data to call a smart contract. diff --git a/precompiles/testutil/errors.go b/precompiles/testutil/errors.go index a19defd7b5..8136cf7dd2 100644 --- a/precompiles/testutil/errors.go +++ b/precompiles/testutil/errors.go @@ -8,7 +8,7 @@ import ( "strings" abci "github.com/cometbft/cometbft/abci/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) // CheckVMError is a helper function used to check if the transaction is reverted with the expected error message diff --git a/precompiles/testutil/events.go b/precompiles/testutil/events.go index 19d89595c0..6a791f63e1 100644 --- a/precompiles/testutil/events.go +++ b/precompiles/testutil/events.go @@ -15,7 +15,7 @@ import ( abci "github.com/cometbft/cometbft/abci/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) // CheckAuthorizationEvents is a helper function used in the integration tests and checks if the approval event is emitted. diff --git a/precompiles/testutil/logs.go b/precompiles/testutil/logs.go index f90695bb93..f687b927ea 100644 --- a/precompiles/testutil/logs.go +++ b/precompiles/testutil/logs.go @@ -8,7 +8,7 @@ import ( abci "github.com/cometbft/cometbft/abci/types" "github.com/ethereum/go-ethereum/accounts/abi" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) // CheckLogs checks the logs for the given events and whether the transaction was successful or not. diff --git a/precompiles/vesting/approve.go b/precompiles/vesting/approve.go index c98890d447..21e532bfde 100644 --- a/precompiles/vesting/approve.go +++ b/precompiles/vesting/approve.go @@ -11,8 +11,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v16/precompiles/common" - vestingtypes "github.com/evmos/evmos/v16/x/vesting/types" + cmn "github.com/evmos/evmos/v17/precompiles/common" + vestingtypes "github.com/evmos/evmos/v17/x/vesting/types" ) var ( diff --git a/precompiles/vesting/events.go b/precompiles/vesting/events.go index 623424c8be..1233547b5d 100644 --- a/precompiles/vesting/events.go +++ b/precompiles/vesting/events.go @@ -8,9 +8,9 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v16/precompiles/authorization" - cmn "github.com/evmos/evmos/v16/precompiles/common" - vestingtypes "github.com/evmos/evmos/v16/x/vesting/types" + "github.com/evmos/evmos/v17/precompiles/authorization" + cmn "github.com/evmos/evmos/v17/precompiles/common" + vestingtypes "github.com/evmos/evmos/v17/x/vesting/types" ) const ( diff --git a/precompiles/vesting/integration_test.go b/precompiles/vesting/integration_test.go index d158639423..7896ca3a91 100644 --- a/precompiles/vesting/integration_test.go +++ b/precompiles/vesting/integration_test.go @@ -11,14 +11,14 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/ethereum/go-ethereum/common" - cmn "github.com/evmos/evmos/v16/precompiles/common" - "github.com/evmos/evmos/v16/precompiles/testutil" - "github.com/evmos/evmos/v16/precompiles/testutil/contracts" - "github.com/evmos/evmos/v16/precompiles/vesting" - "github.com/evmos/evmos/v16/precompiles/vesting/testdata" - evmosutil "github.com/evmos/evmos/v16/testutil" - testutiltx "github.com/evmos/evmos/v16/testutil/tx" - vestingtypes "github.com/evmos/evmos/v16/x/vesting/types" + cmn "github.com/evmos/evmos/v17/precompiles/common" + "github.com/evmos/evmos/v17/precompiles/testutil" + "github.com/evmos/evmos/v17/precompiles/testutil/contracts" + "github.com/evmos/evmos/v17/precompiles/vesting" + "github.com/evmos/evmos/v17/precompiles/vesting/testdata" + evmosutil "github.com/evmos/evmos/v17/testutil" + testutiltx "github.com/evmos/evmos/v17/testutil/tx" + vestingtypes "github.com/evmos/evmos/v17/x/vesting/types" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" diff --git a/precompiles/vesting/query_test.go b/precompiles/vesting/query_test.go index 7f7c8cc131..a3ce435914 100644 --- a/precompiles/vesting/query_test.go +++ b/precompiles/vesting/query_test.go @@ -5,8 +5,8 @@ package vesting_test import ( "fmt" - cmn "github.com/evmos/evmos/v16/precompiles/common" - "github.com/evmos/evmos/v16/precompiles/vesting" + cmn "github.com/evmos/evmos/v17/precompiles/common" + "github.com/evmos/evmos/v17/precompiles/vesting" ) func (s *PrecompileTestSuite) TestBalances() { diff --git a/precompiles/vesting/setup_test.go b/precompiles/vesting/setup_test.go index c3afaf1c08..1f932b3542 100644 --- a/precompiles/vesting/setup_test.go +++ b/precompiles/vesting/setup_test.go @@ -11,10 +11,10 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - evmosapp "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/precompiles/vesting" - "github.com/evmos/evmos/v16/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmosapp "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/precompiles/vesting" + "github.com/evmos/evmos/v17/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" "github.com/stretchr/testify/suite" //nolint:revive // dot imports are fine for Ginkgo diff --git a/precompiles/vesting/testdata/vesting_caller.go b/precompiles/vesting/testdata/vesting_caller.go index fdd4617b50..2c9031a628 100644 --- a/precompiles/vesting/testdata/vesting_caller.go +++ b/precompiles/vesting/testdata/vesting_caller.go @@ -7,7 +7,7 @@ import ( _ "embed" // embed compiled smart contract "encoding/json" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) var ( diff --git a/precompiles/vesting/tx.go b/precompiles/vesting/tx.go index 779ea07921..014fba8417 100644 --- a/precompiles/vesting/tx.go +++ b/precompiles/vesting/tx.go @@ -9,7 +9,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v16/precompiles/authorization" + "github.com/evmos/evmos/v17/precompiles/authorization" ) const ( diff --git a/precompiles/vesting/tx_test.go b/precompiles/vesting/tx_test.go index f799f79251..16d59a82d6 100644 --- a/precompiles/vesting/tx_test.go +++ b/precompiles/vesting/tx_test.go @@ -9,16 +9,16 @@ import ( "cosmossdk.io/math" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v16/precompiles/testutil" + "github.com/evmos/evmos/v17/precompiles/testutil" sdk "github.com/cosmos/cosmos-sdk/types" - cmn "github.com/evmos/evmos/v16/precompiles/common" - "github.com/evmos/evmos/v16/precompiles/vesting" - evmosutil "github.com/evmos/evmos/v16/testutil" - evmosutiltx "github.com/evmos/evmos/v16/testutil/tx" - evmostypes "github.com/evmos/evmos/v16/types" - "github.com/evmos/evmos/v16/utils" - vestingtypes "github.com/evmos/evmos/v16/x/vesting/types" + cmn "github.com/evmos/evmos/v17/precompiles/common" + "github.com/evmos/evmos/v17/precompiles/vesting" + evmosutil "github.com/evmos/evmos/v17/testutil" + evmosutiltx "github.com/evmos/evmos/v17/testutil/tx" + evmostypes "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v17/utils" + vestingtypes "github.com/evmos/evmos/v17/x/vesting/types" ) var ( diff --git a/precompiles/vesting/types.go b/precompiles/vesting/types.go index cecd05b640..8fe5c03485 100644 --- a/precompiles/vesting/types.go +++ b/precompiles/vesting/types.go @@ -7,7 +7,7 @@ import ( "time" "cosmossdk.io/math" - "github.com/evmos/evmos/v16/precompiles/authorization" + "github.com/evmos/evmos/v17/precompiles/authorization" "github.com/ethereum/go-ethereum/common" @@ -15,8 +15,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" cosmosvestingtypes "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" - cmn "github.com/evmos/evmos/v16/precompiles/common" - vestingtypes "github.com/evmos/evmos/v16/x/vesting/types" + cmn "github.com/evmos/evmos/v17/precompiles/common" + vestingtypes "github.com/evmos/evmos/v17/x/vesting/types" ) // LockupPeriods is a struct used to parse the LockupPeriods parameter diff --git a/precompiles/vesting/utils_test.go b/precompiles/vesting/utils_test.go index e0f8b10607..268ee7be99 100644 --- a/precompiles/vesting/utils_test.go +++ b/precompiles/vesting/utils_test.go @@ -20,19 +20,19 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - evmosapp "github.com/evmos/evmos/v16/app" - cmn "github.com/evmos/evmos/v16/precompiles/common" - "github.com/evmos/evmos/v16/precompiles/testutil/contracts" - "github.com/evmos/evmos/v16/precompiles/vesting" - "github.com/evmos/evmos/v16/precompiles/vesting/testdata" - evmosutil "github.com/evmos/evmos/v16/testutil" - testutiltx "github.com/evmos/evmos/v16/testutil/tx" - evmostypes "github.com/evmos/evmos/v16/types" - "github.com/evmos/evmos/v16/utils" - "github.com/evmos/evmos/v16/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - inflationtypes "github.com/evmos/evmos/v16/x/inflation/v1/types" - vestingtypes "github.com/evmos/evmos/v16/x/vesting/types" + evmosapp "github.com/evmos/evmos/v17/app" + cmn "github.com/evmos/evmos/v17/precompiles/common" + "github.com/evmos/evmos/v17/precompiles/testutil/contracts" + "github.com/evmos/evmos/v17/precompiles/vesting" + "github.com/evmos/evmos/v17/precompiles/vesting/testdata" + evmosutil "github.com/evmos/evmos/v17/testutil" + testutiltx "github.com/evmos/evmos/v17/testutil/tx" + evmostypes "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v17/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" + inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" + vestingtypes "github.com/evmos/evmos/v17/x/vesting/types" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/gomega" diff --git a/precompiles/vesting/vesting.go b/precompiles/vesting/vesting.go index f9ed41d6af..f6cb23e2ba 100644 --- a/precompiles/vesting/vesting.go +++ b/precompiles/vesting/vesting.go @@ -8,7 +8,7 @@ import ( "embed" "fmt" - "github.com/evmos/evmos/v16/precompiles/authorization" + "github.com/evmos/evmos/v17/precompiles/authorization" sdk "github.com/cosmos/cosmos-sdk/types" @@ -18,8 +18,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v16/precompiles/common" - vestingkeeper "github.com/evmos/evmos/v16/x/vesting/keeper" + cmn "github.com/evmos/evmos/v17/precompiles/common" + vestingkeeper "github.com/evmos/evmos/v17/x/vesting/keeper" ) var _ vm.PrecompiledContract = &Precompile{} diff --git a/precompiles/werc20/integration_test.go b/precompiles/werc20/integration_test.go index 545ecf61fc..6b01cbc1a0 100644 --- a/precompiles/werc20/integration_test.go +++ b/precompiles/werc20/integration_test.go @@ -4,18 +4,18 @@ import ( "math/big" sdk "github.com/cosmos/cosmos-sdk/types" - auth "github.com/evmos/evmos/v16/precompiles/authorization" - "github.com/evmos/evmos/v16/precompiles/erc20" - evmosutiltx "github.com/evmos/evmos/v16/testutil/tx" + auth "github.com/evmos/evmos/v17/precompiles/authorization" + "github.com/evmos/evmos/v17/precompiles/erc20" + evmosutiltx "github.com/evmos/evmos/v17/testutil/tx" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/precompiles/testutil" - "github.com/evmos/evmos/v16/precompiles/werc20" - "github.com/evmos/evmos/v16/precompiles/werc20/testdata" - "github.com/evmos/evmos/v16/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" - erc20types "github.com/evmos/evmos/v16/x/erc20/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/precompiles/testutil" + "github.com/evmos/evmos/v17/precompiles/werc20" + "github.com/evmos/evmos/v17/precompiles/werc20/testdata" + "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" + erc20types "github.com/evmos/evmos/v17/x/erc20/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" diff --git a/precompiles/werc20/setup_test.go b/precompiles/werc20/setup_test.go index 5571bb6074..b71a403240 100644 --- a/precompiles/werc20/setup_test.go +++ b/precompiles/werc20/setup_test.go @@ -3,12 +3,12 @@ package werc20_test import ( "testing" - "github.com/evmos/evmos/v16/precompiles/werc20" + "github.com/evmos/evmos/v17/precompiles/werc20" - "github.com/evmos/evmos/v16/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v16/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v16/testutil/integration/evmos/network" + "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v17/testutil/integration/evmos/network" "github.com/stretchr/testify/suite" //nolint:revive // dot imports are fine for Ginkgo diff --git a/precompiles/werc20/testdata/wevmos.go b/precompiles/werc20/testdata/wevmos.go index a845149cb8..1d64dc7b20 100644 --- a/precompiles/werc20/testdata/wevmos.go +++ b/precompiles/werc20/testdata/wevmos.go @@ -7,7 +7,7 @@ import ( _ "embed" // embed compiled smart contract "encoding/json" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) var ( diff --git a/precompiles/werc20/utils_test.go b/precompiles/werc20/utils_test.go index eb3ffd2f04..469411ee2e 100644 --- a/precompiles/werc20/utils_test.go +++ b/precompiles/werc20/utils_test.go @@ -7,16 +7,16 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/authz" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - commonfactory "github.com/evmos/evmos/v16/testutil/integration/common/factory" + commonfactory "github.com/evmos/evmos/v17/testutil/integration/common/factory" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/precompiles/erc20" - "github.com/evmos/evmos/v16/precompiles/testutil" - "github.com/evmos/evmos/v16/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/precompiles/erc20" + "github.com/evmos/evmos/v17/precompiles/testutil" + "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" //nolint:revive // dot imports are fine for Gomega . "github.com/onsi/gomega" diff --git a/precompiles/werc20/werc20.go b/precompiles/werc20/werc20.go index ed6e9f8296..aeae45cb1e 100644 --- a/precompiles/werc20/werc20.go +++ b/precompiles/werc20/werc20.go @@ -12,10 +12,10 @@ import ( authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - cmn "github.com/evmos/evmos/v16/precompiles/common" - erc20 "github.com/evmos/evmos/v16/precompiles/erc20" - erc20types "github.com/evmos/evmos/v16/x/erc20/types" - transferkeeper "github.com/evmos/evmos/v16/x/ibc/transfer/keeper" + cmn "github.com/evmos/evmos/v17/precompiles/common" + erc20 "github.com/evmos/evmos/v17/precompiles/erc20" + erc20types "github.com/evmos/evmos/v17/x/erc20/types" + transferkeeper "github.com/evmos/evmos/v17/x/ibc/transfer/keeper" ) // abiPath defines the path to the WERC-20 precompile ABI JSON file. diff --git a/proto/ethermint/crypto/v1/ethsecp256k1/keys.proto b/proto/ethermint/crypto/v1/ethsecp256k1/keys.proto index 9c242a9a0c..7031c789fb 100644 --- a/proto/ethermint/crypto/v1/ethsecp256k1/keys.proto +++ b/proto/ethermint/crypto/v1/ethsecp256k1/keys.proto @@ -5,7 +5,7 @@ package ethermint.crypto.v1.ethsecp256k1; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v16/crypto/ethsecp256k1"; +option go_package = "github.com/evmos/evmos/v17/crypto/ethsecp256k1"; // PubKey defines a type alias for an ecdsa.PublicKey that implements // Tendermint's PubKey interface. It represents the 33-byte compressed public diff --git a/proto/ethermint/evm/v1/events.proto b/proto/ethermint/evm/v1/events.proto index b62c6da769..df5bb6493e 100644 --- a/proto/ethermint/evm/v1/events.proto +++ b/proto/ethermint/evm/v1/events.proto @@ -3,7 +3,7 @@ syntax = "proto3"; package ethermint.evm.v1; -option go_package = "github.com/evmos/evmos/v16/x/evm/types"; +option go_package = "github.com/evmos/evmos/v17/x/evm/types"; // EventEthereumTx defines the event for an Ethereum transaction message EventEthereumTx { diff --git a/proto/ethermint/evm/v1/evm.proto b/proto/ethermint/evm/v1/evm.proto index 922f77b84b..37d642e8a2 100644 --- a/proto/ethermint/evm/v1/evm.proto +++ b/proto/ethermint/evm/v1/evm.proto @@ -5,7 +5,7 @@ package ethermint.evm.v1; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v16/x/evm/types"; +option go_package = "github.com/evmos/evmos/v17/x/evm/types"; // Params defines the EVM module parameters message Params { diff --git a/proto/ethermint/evm/v1/genesis.proto b/proto/ethermint/evm/v1/genesis.proto index 6b820ce7b9..5723b4f3c2 100644 --- a/proto/ethermint/evm/v1/genesis.proto +++ b/proto/ethermint/evm/v1/genesis.proto @@ -6,7 +6,7 @@ package ethermint.evm.v1; import "ethermint/evm/v1/evm.proto"; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v16/x/evm/types"; +option go_package = "github.com/evmos/evmos/v17/x/evm/types"; // GenesisState defines the evm module's genesis state. message GenesisState { diff --git a/proto/ethermint/evm/v1/query.proto b/proto/ethermint/evm/v1/query.proto index dac2bc8f6e..f6daa13170 100644 --- a/proto/ethermint/evm/v1/query.proto +++ b/proto/ethermint/evm/v1/query.proto @@ -10,7 +10,7 @@ import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; import "google/protobuf/timestamp.proto"; -option go_package = "github.com/evmos/evmos/v16/x/evm/types"; +option go_package = "github.com/evmos/evmos/v17/x/evm/types"; // Query defines the gRPC querier service. service Query { diff --git a/proto/ethermint/evm/v1/tx.proto b/proto/ethermint/evm/v1/tx.proto index 3836858c22..118be50566 100644 --- a/proto/ethermint/evm/v1/tx.proto +++ b/proto/ethermint/evm/v1/tx.proto @@ -10,7 +10,7 @@ import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; import "google/protobuf/any.proto"; -option go_package = "github.com/evmos/evmos/v16/x/evm/types"; +option go_package = "github.com/evmos/evmos/v17/x/evm/types"; // Msg defines the evm Msg service. service Msg { diff --git a/proto/ethermint/feemarket/v1/events.proto b/proto/ethermint/feemarket/v1/events.proto index f31ec7bdb1..485663670d 100644 --- a/proto/ethermint/feemarket/v1/events.proto +++ b/proto/ethermint/feemarket/v1/events.proto @@ -3,7 +3,7 @@ syntax = "proto3"; package ethermint.feemarket.v1; -option go_package = "github.com/evmos/evmos/v16/x/feemarket/types"; +option go_package = "github.com/evmos/evmos/v17/x/feemarket/types"; // EventFeeMarket is the event type for the fee market module message EventFeeMarket { diff --git a/proto/ethermint/feemarket/v1/feemarket.proto b/proto/ethermint/feemarket/v1/feemarket.proto index 596ff647fa..f9d4ed5baf 100644 --- a/proto/ethermint/feemarket/v1/feemarket.proto +++ b/proto/ethermint/feemarket/v1/feemarket.proto @@ -5,7 +5,7 @@ package ethermint.feemarket.v1; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v16/x/feemarket/types"; +option go_package = "github.com/evmos/evmos/v17/x/feemarket/types"; // Params defines the EVM module parameters message Params { diff --git a/proto/ethermint/feemarket/v1/genesis.proto b/proto/ethermint/feemarket/v1/genesis.proto index 1042417743..97c1e1eaa5 100644 --- a/proto/ethermint/feemarket/v1/genesis.proto +++ b/proto/ethermint/feemarket/v1/genesis.proto @@ -6,7 +6,7 @@ package ethermint.feemarket.v1; import "ethermint/feemarket/v1/feemarket.proto"; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v16/x/feemarket/types"; +option go_package = "github.com/evmos/evmos/v17/x/feemarket/types"; // GenesisState defines the feemarket module's genesis state. message GenesisState { diff --git a/proto/ethermint/feemarket/v1/query.proto b/proto/ethermint/feemarket/v1/query.proto index fc1ff5ce48..55eb2eeff2 100644 --- a/proto/ethermint/feemarket/v1/query.proto +++ b/proto/ethermint/feemarket/v1/query.proto @@ -7,7 +7,7 @@ import "ethermint/feemarket/v1/feemarket.proto"; import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; -option go_package = "github.com/evmos/evmos/v16/x/feemarket/types"; +option go_package = "github.com/evmos/evmos/v17/x/feemarket/types"; // Query defines the gRPC querier service. service Query { diff --git a/proto/ethermint/feemarket/v1/tx.proto b/proto/ethermint/feemarket/v1/tx.proto index ac99c955fc..2c953b84b9 100644 --- a/proto/ethermint/feemarket/v1/tx.proto +++ b/proto/ethermint/feemarket/v1/tx.proto @@ -8,7 +8,7 @@ import "cosmos_proto/cosmos.proto"; import "ethermint/feemarket/v1/feemarket.proto"; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v16/x/feemarket/types"; +option go_package = "github.com/evmos/evmos/v17/x/feemarket/types"; // Msg defines the erc20 Msg service. service Msg { diff --git a/proto/ethermint/types/v1/account.proto b/proto/ethermint/types/v1/account.proto index 456a1b4a13..b16a9f9960 100644 --- a/proto/ethermint/types/v1/account.proto +++ b/proto/ethermint/types/v1/account.proto @@ -7,7 +7,7 @@ import "cosmos/auth/v1beta1/auth.proto"; import "cosmos_proto/cosmos.proto"; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v16/types"; +option go_package = "github.com/evmos/evmos/v17/types"; // EthAccount implements the authtypes.AccountI interface and embeds an // authtypes.BaseAccount type. It is compatible with the auth AccountKeeper. diff --git a/proto/ethermint/types/v1/dynamic_fee.proto b/proto/ethermint/types/v1/dynamic_fee.proto index b3eb618127..6e60244e19 100644 --- a/proto/ethermint/types/v1/dynamic_fee.proto +++ b/proto/ethermint/types/v1/dynamic_fee.proto @@ -5,7 +5,7 @@ package ethermint.types.v1; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v16/types"; +option go_package = "github.com/evmos/evmos/v17/types"; // ExtensionOptionDynamicFeeTx is an extension option that specifies the maxPrioPrice for cosmos tx message ExtensionOptionDynamicFeeTx { diff --git a/proto/ethermint/types/v1/indexer.proto b/proto/ethermint/types/v1/indexer.proto index f215d75f85..e7fba6ab74 100644 --- a/proto/ethermint/types/v1/indexer.proto +++ b/proto/ethermint/types/v1/indexer.proto @@ -5,7 +5,7 @@ package ethermint.types.v1; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v16/types"; +option go_package = "github.com/evmos/evmos/v17/types"; // TxResult is the value stored in eth tx indexer message TxResult { diff --git a/proto/ethermint/types/v1/web3.proto b/proto/ethermint/types/v1/web3.proto index 3162c6ee39..4f1f0966a4 100644 --- a/proto/ethermint/types/v1/web3.proto +++ b/proto/ethermint/types/v1/web3.proto @@ -5,7 +5,7 @@ package ethermint.types.v1; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v16/types"; +option go_package = "github.com/evmos/evmos/v17/types"; // ExtensionOptionsWeb3Tx is an extension option that specifies the typed chain id, // the fee payer as well as its signature data. diff --git a/proto/evmos/epochs/v1/genesis.proto b/proto/evmos/epochs/v1/genesis.proto index 32515e7ec2..adf94c25d8 100644 --- a/proto/evmos/epochs/v1/genesis.proto +++ b/proto/evmos/epochs/v1/genesis.proto @@ -7,7 +7,7 @@ import "gogoproto/gogo.proto"; import "google/protobuf/duration.proto"; import "google/protobuf/timestamp.proto"; -option go_package = "github.com/evmos/evmos/v16/x/epochs/types"; +option go_package = "github.com/evmos/evmos/v17/x/epochs/types"; // EpochInfo defines the message interface containing the relevant informations about // an epoch. diff --git a/proto/evmos/epochs/v1/query.proto b/proto/evmos/epochs/v1/query.proto index 8b2c6d99c5..d4af8486c7 100644 --- a/proto/evmos/epochs/v1/query.proto +++ b/proto/evmos/epochs/v1/query.proto @@ -8,7 +8,7 @@ import "evmos/epochs/v1/genesis.proto"; import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; -option go_package = "github.com/evmos/evmos/v16/x/epochs/types"; +option go_package = "github.com/evmos/evmos/v17/x/epochs/types"; // Query defines the gRPC querier service. service Query { diff --git a/proto/evmos/erc20/v1/erc20.proto b/proto/evmos/erc20/v1/erc20.proto index 68d1be81b7..c33883f4dc 100644 --- a/proto/evmos/erc20/v1/erc20.proto +++ b/proto/evmos/erc20/v1/erc20.proto @@ -5,7 +5,7 @@ package evmos.erc20.v1; import "cosmos/bank/v1beta1/bank.proto"; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v16/x/erc20/types"; +option go_package = "github.com/evmos/evmos/v17/x/erc20/types"; // Owner enumerates the ownership of a ERC20 contract. enum Owner { diff --git a/proto/evmos/erc20/v1/events.proto b/proto/evmos/erc20/v1/events.proto index 061cac7d0d..d87b15fc5e 100644 --- a/proto/evmos/erc20/v1/events.proto +++ b/proto/evmos/erc20/v1/events.proto @@ -3,7 +3,7 @@ syntax = "proto3"; package evmos.erc20.v1; -option go_package = "github.com/evmos/evmos/v16/x/erc20/types"; +option go_package = "github.com/evmos/evmos/v17/x/erc20/types"; // EventRegisterPair is an event emitted when a coin is registered. message EventRegisterPair { diff --git a/proto/evmos/erc20/v1/genesis.proto b/proto/evmos/erc20/v1/genesis.proto index 6ac69d3c78..b82d6e4765 100644 --- a/proto/evmos/erc20/v1/genesis.proto +++ b/proto/evmos/erc20/v1/genesis.proto @@ -6,7 +6,7 @@ package evmos.erc20.v1; import "evmos/erc20/v1/erc20.proto"; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v16/x/erc20/types"; +option go_package = "github.com/evmos/evmos/v17/x/erc20/types"; // GenesisState defines the module's genesis state. message GenesisState { diff --git a/proto/evmos/erc20/v1/query.proto b/proto/evmos/erc20/v1/query.proto index 0e0356a2f4..9f5a291fa8 100644 --- a/proto/evmos/erc20/v1/query.proto +++ b/proto/evmos/erc20/v1/query.proto @@ -9,7 +9,7 @@ import "evmos/erc20/v1/genesis.proto"; import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; -option go_package = "github.com/evmos/evmos/v16/x/erc20/types"; +option go_package = "github.com/evmos/evmos/v17/x/erc20/types"; // Query defines the gRPC querier service. service Query { diff --git a/proto/evmos/erc20/v1/tx.proto b/proto/evmos/erc20/v1/tx.proto index 405766e8d4..7abb8cbe38 100644 --- a/proto/evmos/erc20/v1/tx.proto +++ b/proto/evmos/erc20/v1/tx.proto @@ -10,7 +10,7 @@ import "evmos/erc20/v1/genesis.proto"; import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; -option go_package = "github.com/evmos/evmos/v16/x/erc20/types"; +option go_package = "github.com/evmos/evmos/v17/x/erc20/types"; // Msg defines the erc20 Msg service. service Msg { diff --git a/proto/evmos/incentives/v1/genesis.proto b/proto/evmos/incentives/v1/genesis.proto index f6b1a33bf9..3c8794f8d6 100644 --- a/proto/evmos/incentives/v1/genesis.proto +++ b/proto/evmos/incentives/v1/genesis.proto @@ -6,7 +6,7 @@ import "evmos/incentives/v1/incentives.proto"; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v16/x/incentives/types"; +option go_package = "github.com/evmos/evmos/v17/x/incentives/types"; // GenesisState defines the module's genesis state. message GenesisState { diff --git a/proto/evmos/incentives/v1/incentives.proto b/proto/evmos/incentives/v1/incentives.proto index 019233d6eb..680f378863 100644 --- a/proto/evmos/incentives/v1/incentives.proto +++ b/proto/evmos/incentives/v1/incentives.proto @@ -6,7 +6,7 @@ package evmos.incentives.v1; import "cosmos/base/v1beta1/coin.proto"; import "gogoproto/gogo.proto"; import "google/protobuf/timestamp.proto"; -option go_package = "github.com/evmos/evmos/v16/x/incentives/types"; +option go_package = "github.com/evmos/evmos/v17/x/incentives/types"; // Incentive defines an instance that organizes distribution conditions for a // given smart contract diff --git a/proto/evmos/inflation/v1/genesis.proto b/proto/evmos/inflation/v1/genesis.proto index d05f0afc74..4a2ccf0d65 100644 --- a/proto/evmos/inflation/v1/genesis.proto +++ b/proto/evmos/inflation/v1/genesis.proto @@ -7,7 +7,7 @@ import "gogoproto/gogo.proto"; import "evmos/inflation/v1/inflation.proto"; -option go_package = "github.com/evmos/evmos/v16/x/inflation/v1/types"; +option go_package = "github.com/evmos/evmos/v17/x/inflation/v1/types"; // GenesisState defines the inflation module's genesis state. message GenesisState { diff --git a/proto/evmos/inflation/v1/inflation.proto b/proto/evmos/inflation/v1/inflation.proto index 28cc25a272..bd5d55551a 100644 --- a/proto/evmos/inflation/v1/inflation.proto +++ b/proto/evmos/inflation/v1/inflation.proto @@ -5,7 +5,7 @@ package evmos.inflation.v1; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v16/x/inflation/v1/types"; +option go_package = "github.com/evmos/evmos/v17/x/inflation/v1/types"; // InflationDistribution defines the distribution in which inflation is // allocated through minting on each epoch (staking, incentives, community). It diff --git a/proto/evmos/inflation/v1/query.proto b/proto/evmos/inflation/v1/query.proto index d594243c20..2205ee9a7d 100644 --- a/proto/evmos/inflation/v1/query.proto +++ b/proto/evmos/inflation/v1/query.proto @@ -8,7 +8,7 @@ import "evmos/inflation/v1/genesis.proto"; import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; -option go_package = "github.com/evmos/evmos/v16/x/inflation/v1/types"; +option go_package = "github.com/evmos/evmos/v17/x/inflation/v1/types"; // Query provides defines the gRPC querier service. service Query { diff --git a/proto/evmos/inflation/v1/tx.proto b/proto/evmos/inflation/v1/tx.proto index 7267f4aabe..0a6ba6bc64 100644 --- a/proto/evmos/inflation/v1/tx.proto +++ b/proto/evmos/inflation/v1/tx.proto @@ -8,7 +8,7 @@ import "cosmos_proto/cosmos.proto"; import "evmos/inflation/v1/genesis.proto"; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v16/x/inflation/v1/types"; +option go_package = "github.com/evmos/evmos/v17/x/inflation/v1/types"; // Msg defines the evm Msg service. service Msg { diff --git a/proto/evmos/vesting/v1/vesting.proto b/proto/evmos/vesting/v1/vesting.proto index ab0e58fc90..25fedc7c28 100644 --- a/proto/evmos/vesting/v1/vesting.proto +++ b/proto/evmos/vesting/v1/vesting.proto @@ -7,7 +7,7 @@ import "cosmos/vesting/v1beta1/vesting.proto"; import "gogoproto/gogo.proto"; import "google/protobuf/timestamp.proto"; -option go_package = "github.com/evmos/evmos/v16/x/vesting/migrations/types"; +option go_package = "github.com/evmos/evmos/v17/x/vesting/migrations/types"; // ClawbackVestingAccount implements the VestingAccount interface. It provides // an account that can hold contributions subject to "lockup" (like a diff --git a/proto/evmos/vesting/v2/events.proto b/proto/evmos/vesting/v2/events.proto index c0e071808d..ccbd0b7694 100644 --- a/proto/evmos/vesting/v2/events.proto +++ b/proto/evmos/vesting/v2/events.proto @@ -3,7 +3,7 @@ syntax = "proto3"; package evmos.vesting.v2; -option go_package = "github.com/evmos/evmos/v16/x/vesting/types"; +option go_package = "github.com/evmos/evmos/v17/x/vesting/types"; // EventCreateClawbackVestingAccount defines the event type // for creating a clawback vesting account diff --git a/proto/evmos/vesting/v2/query.proto b/proto/evmos/vesting/v2/query.proto index 5c169148ae..90647e4d92 100644 --- a/proto/evmos/vesting/v2/query.proto +++ b/proto/evmos/vesting/v2/query.proto @@ -7,7 +7,7 @@ import "cosmos/base/v1beta1/coin.proto"; import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; -option go_package = "github.com/evmos/evmos/v16/x/vesting/types"; +option go_package = "github.com/evmos/evmos/v17/x/vesting/types"; // Query defines the gRPC querier service. service Query { diff --git a/proto/evmos/vesting/v2/tx.proto b/proto/evmos/vesting/v2/tx.proto index f9b2ab64be..10d2f00f99 100644 --- a/proto/evmos/vesting/v2/tx.proto +++ b/proto/evmos/vesting/v2/tx.proto @@ -10,7 +10,7 @@ import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; import "google/protobuf/timestamp.proto"; -option go_package = "github.com/evmos/evmos/v16/x/vesting/types"; +option go_package = "github.com/evmos/evmos/v17/x/vesting/types"; // Msg defines the vesting Msg service. service Msg { diff --git a/proto/evmos/vesting/v2/vesting.proto b/proto/evmos/vesting/v2/vesting.proto index 48ff6879d8..baac594fd3 100644 --- a/proto/evmos/vesting/v2/vesting.proto +++ b/proto/evmos/vesting/v2/vesting.proto @@ -7,7 +7,7 @@ import "cosmos/vesting/v1beta1/vesting.proto"; import "gogoproto/gogo.proto"; import "google/protobuf/timestamp.proto"; -option go_package = "github.com/evmos/evmos/v16/x/vesting/types"; +option go_package = "github.com/evmos/evmos/v17/x/vesting/types"; // ClawbackVestingAccount implements the VestingAccount interface. It provides // an account that can hold contributions subject to "lockup" (like a diff --git a/rpc/apis.go b/rpc/apis.go index 7af550086f..0c85322224 100644 --- a/rpc/apis.go +++ b/rpc/apis.go @@ -10,16 +10,16 @@ import ( "github.com/ethereum/go-ethereum/rpc" - "github.com/evmos/evmos/v16/rpc/backend" - "github.com/evmos/evmos/v16/rpc/namespaces/ethereum/debug" - "github.com/evmos/evmos/v16/rpc/namespaces/ethereum/eth" - "github.com/evmos/evmos/v16/rpc/namespaces/ethereum/eth/filters" - "github.com/evmos/evmos/v16/rpc/namespaces/ethereum/miner" - "github.com/evmos/evmos/v16/rpc/namespaces/ethereum/net" - "github.com/evmos/evmos/v16/rpc/namespaces/ethereum/personal" - "github.com/evmos/evmos/v16/rpc/namespaces/ethereum/txpool" - "github.com/evmos/evmos/v16/rpc/namespaces/ethereum/web3" - "github.com/evmos/evmos/v16/types" + "github.com/evmos/evmos/v17/rpc/backend" + "github.com/evmos/evmos/v17/rpc/namespaces/ethereum/debug" + "github.com/evmos/evmos/v17/rpc/namespaces/ethereum/eth" + "github.com/evmos/evmos/v17/rpc/namespaces/ethereum/eth/filters" + "github.com/evmos/evmos/v17/rpc/namespaces/ethereum/miner" + "github.com/evmos/evmos/v17/rpc/namespaces/ethereum/net" + "github.com/evmos/evmos/v17/rpc/namespaces/ethereum/personal" + "github.com/evmos/evmos/v17/rpc/namespaces/ethereum/txpool" + "github.com/evmos/evmos/v17/rpc/namespaces/ethereum/web3" + "github.com/evmos/evmos/v17/types" rpcclient "github.com/cometbft/cometbft/rpc/jsonrpc/client" ) diff --git a/rpc/backend/account_info.go b/rpc/backend/account_info.go index d4f5b2dc75..fa5e7c543c 100644 --- a/rpc/backend/account_info.go +++ b/rpc/backend/account_info.go @@ -15,8 +15,8 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" - rpctypes "github.com/evmos/evmos/v16/rpc/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + rpctypes "github.com/evmos/evmos/v17/rpc/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" "github.com/pkg/errors" ) diff --git a/rpc/backend/account_info_test.go b/rpc/backend/account_info_test.go index 68650af129..d3fe0e6a67 100644 --- a/rpc/backend/account_info_test.go +++ b/rpc/backend/account_info_test.go @@ -11,10 +11,10 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" "google.golang.org/grpc/metadata" - "github.com/evmos/evmos/v16/rpc/backend/mocks" - rpctypes "github.com/evmos/evmos/v16/rpc/types" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/rpc/backend/mocks" + rpctypes "github.com/evmos/evmos/v17/rpc/types" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) func (suite *BackendTestSuite) TestGetCode() { diff --git a/rpc/backend/backend.go b/rpc/backend/backend.go index 718a399608..fac06c0a72 100644 --- a/rpc/backend/backend.go +++ b/rpc/backend/backend.go @@ -20,10 +20,10 @@ import ( "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rpc" "github.com/ethereum/go-ethereum/signer/core/apitypes" - rpctypes "github.com/evmos/evmos/v16/rpc/types" - "github.com/evmos/evmos/v16/server/config" - evmostypes "github.com/evmos/evmos/v16/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + rpctypes "github.com/evmos/evmos/v17/rpc/types" + "github.com/evmos/evmos/v17/server/config" + evmostypes "github.com/evmos/evmos/v17/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) // BackendI implements the Cosmos and EVM backend. diff --git a/rpc/backend/backend_suite_test.go b/rpc/backend/backend_suite_test.go index 348cb81416..36db4a2b8b 100644 --- a/rpc/backend/backend_suite_test.go +++ b/rpc/backend/backend_suite_test.go @@ -18,15 +18,15 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/stretchr/testify/suite" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/crypto/hd" - "github.com/evmos/evmos/v16/encoding" - "github.com/evmos/evmos/v16/indexer" - "github.com/evmos/evmos/v16/rpc/backend/mocks" - rpctypes "github.com/evmos/evmos/v16/rpc/types" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/utils" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/crypto/hd" + "github.com/evmos/evmos/v17/encoding" + "github.com/evmos/evmos/v17/indexer" + "github.com/evmos/evmos/v17/rpc/backend/mocks" + rpctypes "github.com/evmos/evmos/v17/rpc/types" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v17/utils" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) type BackendTestSuite struct { diff --git a/rpc/backend/blocks.go b/rpc/backend/blocks.go index e290cb43e7..b1625d1a00 100644 --- a/rpc/backend/blocks.go +++ b/rpc/backend/blocks.go @@ -16,8 +16,8 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/trie" - rpctypes "github.com/evmos/evmos/v16/rpc/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + rpctypes "github.com/evmos/evmos/v17/rpc/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" "github.com/pkg/errors" "google.golang.org/grpc" "google.golang.org/grpc/metadata" diff --git a/rpc/backend/blocks_test.go b/rpc/backend/blocks_test.go index 2d842abceb..c11d88da86 100644 --- a/rpc/backend/blocks_test.go +++ b/rpc/backend/blocks_test.go @@ -16,10 +16,10 @@ import ( "github.com/ethereum/go-ethereum/trie" "google.golang.org/grpc/metadata" - "github.com/evmos/evmos/v16/rpc/backend/mocks" - ethrpc "github.com/evmos/evmos/v16/rpc/types" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/rpc/backend/mocks" + ethrpc "github.com/evmos/evmos/v17/rpc/types" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) func (suite *BackendTestSuite) TestBlockNumber() { diff --git a/rpc/backend/call_tx.go b/rpc/backend/call_tx.go index 5d75e06df7..5940329cd7 100644 --- a/rpc/backend/call_tx.go +++ b/rpc/backend/call_tx.go @@ -16,9 +16,9 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" - rpctypes "github.com/evmos/evmos/v16/rpc/types" - "github.com/evmos/evmos/v16/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + rpctypes "github.com/evmos/evmos/v17/rpc/types" + "github.com/evmos/evmos/v17/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" "github.com/pkg/errors" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" diff --git a/rpc/backend/call_tx_test.go b/rpc/backend/call_tx_test.go index 8a77f78039..429e104adb 100644 --- a/rpc/backend/call_tx_test.go +++ b/rpc/backend/call_tx_test.go @@ -10,10 +10,10 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/rlp" - "github.com/evmos/evmos/v16/rpc/backend/mocks" - rpctypes "github.com/evmos/evmos/v16/rpc/types" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/rpc/backend/mocks" + rpctypes "github.com/evmos/evmos/v17/rpc/types" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" "google.golang.org/grpc/metadata" ) diff --git a/rpc/backend/chain_info.go b/rpc/backend/chain_info.go index e41f835563..1f82c9e0b4 100644 --- a/rpc/backend/chain_info.go +++ b/rpc/backend/chain_info.go @@ -15,10 +15,10 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rpc" - rpctypes "github.com/evmos/evmos/v16/rpc/types" - "github.com/evmos/evmos/v16/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" + rpctypes "github.com/evmos/evmos/v17/rpc/types" + "github.com/evmos/evmos/v17/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" "github.com/pkg/errors" ) diff --git a/rpc/backend/chain_info_test.go b/rpc/backend/chain_info_test.go index 4b660635a5..c2c6b0a4e3 100644 --- a/rpc/backend/chain_info_test.go +++ b/rpc/backend/chain_info_test.go @@ -15,11 +15,11 @@ import ( "github.com/cometbft/cometbft/abci/types" tmrpctypes "github.com/cometbft/cometbft/rpc/core/types" - "github.com/evmos/evmos/v16/rpc/backend/mocks" - rpc "github.com/evmos/evmos/v16/rpc/types" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" + "github.com/evmos/evmos/v17/rpc/backend/mocks" + rpc "github.com/evmos/evmos/v17/rpc/types" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" ) func (suite *BackendTestSuite) TestBaseFee() { diff --git a/rpc/backend/client_test.go b/rpc/backend/client_test.go index 26ad7f42bb..4f6a2c2597 100644 --- a/rpc/backend/client_test.go +++ b/rpc/backend/client_test.go @@ -15,9 +15,9 @@ import ( "github.com/cometbft/cometbft/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/rpc/backend/mocks" - rpc "github.com/evmos/evmos/v16/rpc/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/rpc/backend/mocks" + rpc "github.com/evmos/evmos/v17/rpc/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" mock "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" ) diff --git a/rpc/backend/evm_query_client_test.go b/rpc/backend/evm_query_client_test.go index 43cc5df1a4..9179d1fb3f 100644 --- a/rpc/backend/evm_query_client_test.go +++ b/rpc/backend/evm_query_client_test.go @@ -13,10 +13,10 @@ import ( errortypes "github.com/cosmos/cosmos-sdk/types/errors" grpctypes "github.com/cosmos/cosmos-sdk/types/grpc" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/rpc/backend/mocks" - rpc "github.com/evmos/evmos/v16/rpc/types" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/rpc/backend/mocks" + rpc "github.com/evmos/evmos/v17/rpc/types" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" mock "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" "google.golang.org/grpc" diff --git a/rpc/backend/feemarket_query_client_test.go b/rpc/backend/feemarket_query_client_test.go index c80f2db31e..923bfd7782 100644 --- a/rpc/backend/feemarket_query_client_test.go +++ b/rpc/backend/feemarket_query_client_test.go @@ -2,9 +2,9 @@ package backend import ( sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/evmos/evmos/v16/rpc/backend/mocks" - rpc "github.com/evmos/evmos/v16/rpc/types" - feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" + "github.com/evmos/evmos/v17/rpc/backend/mocks" + rpc "github.com/evmos/evmos/v17/rpc/types" + feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" ) var _ feemarkettypes.QueryClient = &mocks.FeeMarketQueryClient{} diff --git a/rpc/backend/filters_test.go b/rpc/backend/filters_test.go index 910e8768df..bc90a8ad72 100644 --- a/rpc/backend/filters_test.go +++ b/rpc/backend/filters_test.go @@ -6,9 +6,9 @@ import ( tmtypes "github.com/cometbft/cometbft/types" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v16/rpc/backend/mocks" - ethrpc "github.com/evmos/evmos/v16/rpc/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/rpc/backend/mocks" + ethrpc "github.com/evmos/evmos/v17/rpc/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) func (suite *BackendTestSuite) TestGetLogs() { diff --git a/rpc/backend/mocks/evm_query_client.go b/rpc/backend/mocks/evm_query_client.go index 6aa30355a1..1927296c82 100644 --- a/rpc/backend/mocks/evm_query_client.go +++ b/rpc/backend/mocks/evm_query_client.go @@ -9,7 +9,7 @@ import ( mock "github.com/stretchr/testify/mock" - types "github.com/evmos/evmos/v16/x/evm/types" + types "github.com/evmos/evmos/v17/x/evm/types" ) // EVMQueryClient is an autogenerated mock type for the EVMQueryClient type diff --git a/rpc/backend/mocks/feemarket_query_client.go b/rpc/backend/mocks/feemarket_query_client.go index efea027499..2553d5cc62 100644 --- a/rpc/backend/mocks/feemarket_query_client.go +++ b/rpc/backend/mocks/feemarket_query_client.go @@ -9,7 +9,7 @@ import ( mock "github.com/stretchr/testify/mock" - types "github.com/evmos/evmos/v16/x/feemarket/types" + types "github.com/evmos/evmos/v17/x/feemarket/types" ) // FeeMarketQueryClient is an autogenerated mock type for the QueryClient type diff --git a/rpc/backend/node_info.go b/rpc/backend/node_info.go index 0125c7f012..81c61233f4 100644 --- a/rpc/backend/node_info.go +++ b/rpc/backend/node_info.go @@ -21,11 +21,11 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" - rpctypes "github.com/evmos/evmos/v16/rpc/types" - "github.com/evmos/evmos/v16/server/config" - "github.com/evmos/evmos/v16/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + rpctypes "github.com/evmos/evmos/v17/rpc/types" + "github.com/evmos/evmos/v17/server/config" + "github.com/evmos/evmos/v17/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) // Accounts returns the list of accounts available to this node. diff --git a/rpc/backend/node_info_test.go b/rpc/backend/node_info_test.go index 79261fa47a..aabc40441f 100644 --- a/rpc/backend/node_info_test.go +++ b/rpc/backend/node_info_test.go @@ -10,9 +10,9 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" - "github.com/evmos/evmos/v16/rpc/backend/mocks" - "github.com/evmos/evmos/v16/types" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + "github.com/evmos/evmos/v17/rpc/backend/mocks" + "github.com/evmos/evmos/v17/types" "github.com/spf13/viper" "google.golang.org/grpc/metadata" ) diff --git a/rpc/backend/sign_tx.go b/rpc/backend/sign_tx.go index f5b975c4e4..d974c76c87 100644 --- a/rpc/backend/sign_tx.go +++ b/rpc/backend/sign_tx.go @@ -17,7 +17,7 @@ import ( "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/signer/core/apitypes" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) // SendTransaction sends transaction based on received args using Node's key to sign it diff --git a/rpc/backend/sign_tx_test.go b/rpc/backend/sign_tx_test.go index e382f0f3b1..6cd7e3a15a 100644 --- a/rpc/backend/sign_tx_test.go +++ b/rpc/backend/sign_tx_test.go @@ -14,10 +14,10 @@ import ( "github.com/ethereum/go-ethereum/signer/core/apitypes" "google.golang.org/grpc/metadata" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" - "github.com/evmos/evmos/v16/rpc/backend/mocks" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + "github.com/evmos/evmos/v17/rpc/backend/mocks" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) func (suite *BackendTestSuite) TestSendTransaction() { diff --git a/rpc/backend/tracing.go b/rpc/backend/tracing.go index 6531a750d2..9764d1dd38 100644 --- a/rpc/backend/tracing.go +++ b/rpc/backend/tracing.go @@ -11,8 +11,8 @@ import ( tmrpctypes "github.com/cometbft/cometbft/rpc/core/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - rpctypes "github.com/evmos/evmos/v16/rpc/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + rpctypes "github.com/evmos/evmos/v17/rpc/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" "github.com/pkg/errors" ) diff --git a/rpc/backend/tracing_test.go b/rpc/backend/tracing_test.go index 330b5e235c..31d49333b1 100644 --- a/rpc/backend/tracing_test.go +++ b/rpc/backend/tracing_test.go @@ -11,10 +11,10 @@ import ( "github.com/cosmos/cosmos-sdk/crypto" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" - "github.com/evmos/evmos/v16/indexer" - "github.com/evmos/evmos/v16/rpc/backend/mocks" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + "github.com/evmos/evmos/v17/indexer" + "github.com/evmos/evmos/v17/rpc/backend/mocks" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) func (suite *BackendTestSuite) TestTraceTransaction() { diff --git a/rpc/backend/tx_info.go b/rpc/backend/tx_info.go index 08f7b4973a..fd4df1a918 100644 --- a/rpc/backend/tx_info.go +++ b/rpc/backend/tx_info.go @@ -16,9 +16,9 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - rpctypes "github.com/evmos/evmos/v16/rpc/types" - "github.com/evmos/evmos/v16/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + rpctypes "github.com/evmos/evmos/v17/rpc/types" + "github.com/evmos/evmos/v17/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" "github.com/pkg/errors" ) diff --git a/rpc/backend/tx_info_test.go b/rpc/backend/tx_info_test.go index eed0c8690d..8a8af4f401 100644 --- a/rpc/backend/tx_info_test.go +++ b/rpc/backend/tx_info_test.go @@ -12,11 +12,11 @@ import ( "github.com/cometbft/cometbft/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/evmos/evmos/v16/indexer" - "github.com/evmos/evmos/v16/rpc/backend/mocks" - rpctypes "github.com/evmos/evmos/v16/rpc/types" - evmostypes "github.com/evmos/evmos/v16/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/indexer" + "github.com/evmos/evmos/v17/rpc/backend/mocks" + rpctypes "github.com/evmos/evmos/v17/rpc/types" + evmostypes "github.com/evmos/evmos/v17/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" "google.golang.org/grpc/metadata" ) diff --git a/rpc/backend/utils.go b/rpc/backend/utils.go index 815aa7a5c2..088e96e0d5 100644 --- a/rpc/backend/utils.go +++ b/rpc/backend/utils.go @@ -24,8 +24,8 @@ import ( tmrpctypes "github.com/cometbft/cometbft/rpc/core/types" "github.com/cometbft/cometbft/proto/tendermint/crypto" - "github.com/evmos/evmos/v16/rpc/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/rpc/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) type txGasAndReward struct { diff --git a/rpc/namespaces/ethereum/debug/api.go b/rpc/namespaces/ethereum/debug/api.go index 31cd80d6a8..5c9143ba01 100644 --- a/rpc/namespaces/ethereum/debug/api.go +++ b/rpc/namespaces/ethereum/debug/api.go @@ -16,7 +16,7 @@ import ( "github.com/davecgh/go-spew/spew" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" stderrors "github.com/pkg/errors" @@ -28,8 +28,8 @@ import ( "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/rlp" - "github.com/evmos/evmos/v16/rpc/backend" - rpctypes "github.com/evmos/evmos/v16/rpc/types" + "github.com/evmos/evmos/v17/rpc/backend" + rpctypes "github.com/evmos/evmos/v17/rpc/types" ) // HandlerT keeps track of the cpu profiler and trace execution diff --git a/rpc/namespaces/ethereum/eth/api.go b/rpc/namespaces/ethereum/eth/api.go index 2ae5030420..dd281d50a6 100644 --- a/rpc/namespaces/ethereum/eth/api.go +++ b/rpc/namespaces/ethereum/eth/api.go @@ -15,11 +15,11 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v16/rpc/backend" + "github.com/evmos/evmos/v17/rpc/backend" - rpctypes "github.com/evmos/evmos/v16/rpc/types" - "github.com/evmos/evmos/v16/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + rpctypes "github.com/evmos/evmos/v17/rpc/types" + "github.com/evmos/evmos/v17/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) // The Ethereum API allows applications to connect to an Evmos node that is diff --git a/rpc/namespaces/ethereum/eth/filters/api.go b/rpc/namespaces/ethereum/eth/filters/api.go index 523cb4821f..eaa9b9347f 100644 --- a/rpc/namespaces/ethereum/eth/filters/api.go +++ b/rpc/namespaces/ethereum/eth/filters/api.go @@ -9,7 +9,7 @@ import ( "time" "github.com/cosmos/cosmos-sdk/client" - "github.com/evmos/evmos/v16/rpc/types" + "github.com/evmos/evmos/v17/rpc/types" "github.com/cometbft/cometbft/libs/log" @@ -22,7 +22,7 @@ import ( "github.com/ethereum/go-ethereum/eth/filters" "github.com/ethereum/go-ethereum/rpc" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) // FilterAPI gathers diff --git a/rpc/namespaces/ethereum/eth/filters/filter_system.go b/rpc/namespaces/ethereum/eth/filters/filter_system.go index c5864e020b..4b87e0c7b8 100644 --- a/rpc/namespaces/ethereum/eth/filters/filter_system.go +++ b/rpc/namespaces/ethereum/eth/filters/filter_system.go @@ -24,8 +24,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/rpc/ethereum/pubsub" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/rpc/ethereum/pubsub" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) var ( diff --git a/rpc/namespaces/ethereum/eth/filters/filter_system_test.go b/rpc/namespaces/ethereum/eth/filters/filter_system_test.go index 7127021984..583edf5050 100644 --- a/rpc/namespaces/ethereum/eth/filters/filter_system_test.go +++ b/rpc/namespaces/ethereum/eth/filters/filter_system_test.go @@ -13,7 +13,7 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth/filters" "github.com/ethereum/go-ethereum/rpc" - "github.com/evmos/evmos/v16/rpc/ethereum/pubsub" + "github.com/evmos/evmos/v17/rpc/ethereum/pubsub" ) func makeSubscription(id, event string) *Subscription { diff --git a/rpc/namespaces/ethereum/eth/filters/filters.go b/rpc/namespaces/ethereum/eth/filters/filters.go index 1e6c9c4e90..57ceea34a7 100644 --- a/rpc/namespaces/ethereum/eth/filters/filters.go +++ b/rpc/namespaces/ethereum/eth/filters/filters.go @@ -8,8 +8,8 @@ import ( "fmt" "math/big" - "github.com/evmos/evmos/v16/rpc/backend" - "github.com/evmos/evmos/v16/rpc/types" + "github.com/evmos/evmos/v17/rpc/backend" + "github.com/evmos/evmos/v17/rpc/types" "github.com/cometbft/cometbft/libs/log" tmrpctypes "github.com/cometbft/cometbft/rpc/core/types" diff --git a/rpc/namespaces/ethereum/miner/api.go b/rpc/namespaces/ethereum/miner/api.go index f25d043c95..fd3de11ae2 100644 --- a/rpc/namespaces/ethereum/miner/api.go +++ b/rpc/namespaces/ethereum/miner/api.go @@ -4,7 +4,7 @@ package miner import ( "github.com/cosmos/cosmos-sdk/server" - "github.com/evmos/evmos/v16/rpc/backend" + "github.com/evmos/evmos/v17/rpc/backend" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" diff --git a/rpc/namespaces/ethereum/net/api.go b/rpc/namespaces/ethereum/net/api.go index 50c81272ff..e8b16224ed 100644 --- a/rpc/namespaces/ethereum/net/api.go +++ b/rpc/namespaces/ethereum/net/api.go @@ -8,7 +8,7 @@ import ( rpcclient "github.com/cometbft/cometbft/rpc/client" "github.com/cosmos/cosmos-sdk/client" - "github.com/evmos/evmos/v16/types" + "github.com/evmos/evmos/v17/types" ) // PublicAPI is the eth_ prefixed set of APIs in the Web3 JSON-RPC spec. diff --git a/rpc/namespaces/ethereum/personal/api.go b/rpc/namespaces/ethereum/personal/api.go index e6f6580820..2eea941b7c 100644 --- a/rpc/namespaces/ethereum/personal/api.go +++ b/rpc/namespaces/ethereum/personal/api.go @@ -8,10 +8,10 @@ import ( "os" "time" - "github.com/evmos/evmos/v16/rpc/backend" + "github.com/evmos/evmos/v17/rpc/backend" - "github.com/evmos/evmos/v16/crypto/hd" - "github.com/evmos/evmos/v16/types" + "github.com/evmos/evmos/v17/crypto/hd" + "github.com/evmos/evmos/v17/types" "github.com/cometbft/cometbft/libs/log" @@ -23,7 +23,7 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/crypto" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) // PrivateAccountAPI is the personal_ prefixed set of APIs in the Web3 JSON-RPC spec. diff --git a/rpc/namespaces/ethereum/txpool/api.go b/rpc/namespaces/ethereum/txpool/api.go index 4d3accfb03..c5656406c8 100644 --- a/rpc/namespaces/ethereum/txpool/api.go +++ b/rpc/namespaces/ethereum/txpool/api.go @@ -7,7 +7,7 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/evmos/evmos/v16/rpc/types" + "github.com/evmos/evmos/v17/rpc/types" ) // PublicAPI offers and API for the transaction pool. It only operates on data that is non-confidential. diff --git a/rpc/namespaces/ethereum/web3/api.go b/rpc/namespaces/ethereum/web3/api.go index dd6e936d77..2ab8a0901c 100644 --- a/rpc/namespaces/ethereum/web3/api.go +++ b/rpc/namespaces/ethereum/web3/api.go @@ -3,7 +3,7 @@ package web3 import ( - "github.com/evmos/evmos/v16/version" + "github.com/evmos/evmos/v17/version" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/crypto" diff --git a/rpc/types/block.go b/rpc/types/block.go index a6f9e4115e..c14185cedc 100644 --- a/rpc/types/block.go +++ b/rpc/types/block.go @@ -19,7 +19,7 @@ import ( grpctypes "github.com/cosmos/cosmos-sdk/types/grpc" - "github.com/evmos/evmos/v16/types" + "github.com/evmos/evmos/v17/types" ) // BlockNumber represents decoding hex string to block values diff --git a/rpc/types/events.go b/rpc/types/events.go index 83f13ba849..6381704eea 100644 --- a/rpc/types/events.go +++ b/rpc/types/events.go @@ -10,8 +10,8 @@ import ( tmrpctypes "github.com/cometbft/cometbft/rpc/core/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) // EventFormat is the format version of the events. diff --git a/rpc/types/events_test.go b/rpc/types/events_test.go index 2f312c7364..ac512761e5 100644 --- a/rpc/types/events_test.go +++ b/rpc/types/events_test.go @@ -6,7 +6,7 @@ import ( abci "github.com/cometbft/cometbft/abci/types" "github.com/ethereum/go-ethereum/common" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" "github.com/stretchr/testify/require" ) diff --git a/rpc/types/query_client.go b/rpc/types/query_client.go index 56b7963364..a505756f9f 100644 --- a/rpc/types/query_client.go +++ b/rpc/types/query_client.go @@ -12,8 +12,8 @@ import ( "github.com/cosmos/cosmos-sdk/client" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" ) // QueryClient defines a gRPC Client used for: diff --git a/rpc/types/utils.go b/rpc/types/utils.go index 964d1dcc0b..415f8c1dd6 100644 --- a/rpc/types/utils.go +++ b/rpc/types/utils.go @@ -16,8 +16,8 @@ import ( "github.com/cosmos/cosmos-sdk/client" errortypes "github.com/cosmos/cosmos-sdk/types/errors" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" diff --git a/rpc/websockets.go b/rpc/websockets.go index 7c3b161466..d60a345a67 100644 --- a/rpc/websockets.go +++ b/rpc/websockets.go @@ -29,11 +29,11 @@ import ( rpcclient "github.com/cometbft/cometbft/rpc/jsonrpc/client" tmtypes "github.com/cometbft/cometbft/types" - "github.com/evmos/evmos/v16/rpc/ethereum/pubsub" - rpcfilters "github.com/evmos/evmos/v16/rpc/namespaces/ethereum/eth/filters" - "github.com/evmos/evmos/v16/rpc/types" - "github.com/evmos/evmos/v16/server/config" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/rpc/ethereum/pubsub" + rpcfilters "github.com/evmos/evmos/v17/rpc/namespaces/ethereum/eth/filters" + "github.com/evmos/evmos/v17/rpc/types" + "github.com/evmos/evmos/v17/server/config" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) type WebsocketsServer interface { diff --git a/server/config/config_test.go b/server/config/config_test.go index df62f9c344..d3c79f0530 100644 --- a/server/config/config_test.go +++ b/server/config/config_test.go @@ -8,7 +8,7 @@ import ( "github.com/spf13/viper" "github.com/stretchr/testify/require" - evmostypes "github.com/evmos/evmos/v16/types" + evmostypes "github.com/evmos/evmos/v17/types" ) func TestDefaultConfig(t *testing.T) { diff --git a/server/indexer_cmd.go b/server/indexer_cmd.go index 08ad51c71a..b481750301 100644 --- a/server/indexer_cmd.go +++ b/server/indexer_cmd.go @@ -12,7 +12,7 @@ import ( tmstore "github.com/cometbft/cometbft/store" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/server" - "github.com/evmos/evmos/v16/indexer" + "github.com/evmos/evmos/v17/indexer" ) func NewIndexTxCmd() *cobra.Command { diff --git a/server/indexer_service.go b/server/indexer_service.go index b41bbc3e78..277e9b5617 100644 --- a/server/indexer_service.go +++ b/server/indexer_service.go @@ -10,7 +10,7 @@ import ( rpcclient "github.com/cometbft/cometbft/rpc/client" "github.com/cometbft/cometbft/types" - evmostypes "github.com/evmos/evmos/v16/types" + evmostypes "github.com/evmos/evmos/v17/types" ) const ( diff --git a/server/json_rpc.go b/server/json_rpc.go index b0118d8e5d..2c5a9a9587 100644 --- a/server/json_rpc.go +++ b/server/json_rpc.go @@ -14,10 +14,10 @@ import ( "github.com/cosmos/cosmos-sdk/server/types" ethlog "github.com/ethereum/go-ethereum/log" ethrpc "github.com/ethereum/go-ethereum/rpc" - "github.com/evmos/evmos/v16/rpc" + "github.com/evmos/evmos/v17/rpc" - "github.com/evmos/evmos/v16/server/config" - evmostypes "github.com/evmos/evmos/v16/types" + "github.com/evmos/evmos/v17/server/config" + evmostypes "github.com/evmos/evmos/v17/types" ) // StartJSONRPC starts the JSON-RPC server diff --git a/server/start.go b/server/start.go index 34420ec713..c0b9b0741f 100644 --- a/server/start.go +++ b/server/start.go @@ -49,12 +49,12 @@ import ( pruningtypes "github.com/cosmos/cosmos-sdk/store/pruning/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/cmd/evmosd/opendb" - "github.com/evmos/evmos/v16/indexer" - ethdebug "github.com/evmos/evmos/v16/rpc/namespaces/ethereum/debug" - "github.com/evmos/evmos/v16/server/config" - srvflags "github.com/evmos/evmos/v16/server/flags" - evmostypes "github.com/evmos/evmos/v16/types" + "github.com/evmos/evmos/v17/cmd/evmosd/opendb" + "github.com/evmos/evmos/v17/indexer" + ethdebug "github.com/evmos/evmos/v17/rpc/namespaces/ethereum/debug" + "github.com/evmos/evmos/v17/server/config" + srvflags "github.com/evmos/evmos/v17/server/flags" + evmostypes "github.com/evmos/evmos/v17/types" ) // DBOpener is a function to open `application.db`, potentially with customized options. diff --git a/server/util.go b/server/util.go index 1ed3fd8ef3..4ab24138c8 100644 --- a/server/util.go +++ b/server/util.go @@ -8,7 +8,7 @@ import ( "time" // TODO update import to local pkg when rpc pkg is migrated - "github.com/evmos/evmos/v16/server/config" + "github.com/evmos/evmos/v17/server/config" "github.com/gorilla/mux" "github.com/improbable-eng/grpc-web/go/grpcweb" "github.com/spf13/cobra" diff --git a/tests/e2e/e2e_suite_test.go b/tests/e2e/e2e_suite_test.go index 0abe395c3e..c12a1ec31e 100644 --- a/tests/e2e/e2e_suite_test.go +++ b/tests/e2e/e2e_suite_test.go @@ -10,10 +10,10 @@ import ( "github.com/cosmos/cosmos-sdk/codec" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/encoding" - "github.com/evmos/evmos/v16/tests/e2e/upgrade" - "github.com/evmos/evmos/v16/utils" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/encoding" + "github.com/evmos/evmos/v17/tests/e2e/upgrade" + "github.com/evmos/evmos/v17/utils" "github.com/stretchr/testify/suite" ) diff --git a/tests/e2e/tx_test.go b/tests/e2e/tx_test.go index df68440071..759be71644 100644 --- a/tests/e2e/tx_test.go +++ b/tests/e2e/tx_test.go @@ -8,8 +8,8 @@ import ( "regexp" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/tests/e2e/upgrade" - "github.com/evmos/evmos/v16/utils" + "github.com/evmos/evmos/v17/tests/e2e/upgrade" + "github.com/evmos/evmos/v17/utils" ) // executeTransactions executes some sample transactions to check they are still working after the upgrade. diff --git a/tests/e2e/upgrade/balances_test.go b/tests/e2e/upgrade/balances_test.go index 368dadc3bd..577cb3b117 100644 --- a/tests/e2e/upgrade/balances_test.go +++ b/tests/e2e/upgrade/balances_test.go @@ -6,9 +6,9 @@ import ( "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/encoding" - "github.com/evmos/evmos/v16/tests/e2e/upgrade" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/encoding" + "github.com/evmos/evmos/v17/tests/e2e/upgrade" "github.com/stretchr/testify/require" ) diff --git a/tests/e2e/upgrade/manager.go b/tests/e2e/upgrade/manager.go index aee54f7cf2..1eac44f0f5 100644 --- a/tests/e2e/upgrade/manager.go +++ b/tests/e2e/upgrade/manager.go @@ -19,8 +19,8 @@ import ( errorsmod "cosmossdk.io/errors" "github.com/cosmos/cosmos-sdk/codec" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/encoding" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/encoding" "github.com/ory/dockertest/v3" "github.com/ory/dockertest/v3/docker" ) diff --git a/tests/integration/ledger/evmosd_suite_test.go b/tests/integration/ledger/evmosd_suite_test.go index eb3c0ab606..ca3379cc09 100644 --- a/tests/integration/ledger/evmosd_suite_test.go +++ b/tests/integration/ledger/evmosd_suite_test.go @@ -20,11 +20,11 @@ import ( "github.com/cometbft/cometbft/crypto/tmhash" "github.com/cometbft/cometbft/version" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/crypto/hd" - "github.com/evmos/evmos/v16/tests/integration/ledger/mocks" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/utils" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/crypto/hd" + "github.com/evmos/evmos/v17/tests/integration/ledger/mocks" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v17/utils" "github.com/stretchr/testify/suite" tmproto "github.com/cometbft/cometbft/proto/tendermint/types" @@ -32,9 +32,9 @@ import ( rpcclientmock "github.com/cometbft/cometbft/rpc/client/mock" cosmosledger "github.com/cosmos/cosmos-sdk/crypto/ledger" sdk "github.com/cosmos/cosmos-sdk/types" - clientkeys "github.com/evmos/evmos/v16/client/keys" - evmoskeyring "github.com/evmos/evmos/v16/crypto/keyring" - feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" + clientkeys "github.com/evmos/evmos/v17/client/keys" + evmoskeyring "github.com/evmos/evmos/v17/crypto/keyring" + feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" diff --git a/tests/integration/ledger/ledger_test.go b/tests/integration/ledger/ledger_test.go index 7263d6278c..9797747f8d 100644 --- a/tests/integration/ledger/ledger_test.go +++ b/tests/integration/ledger/ledger_test.go @@ -10,12 +10,12 @@ import ( "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/crypto/keyring" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/crypto/hd" - "github.com/evmos/evmos/v16/encoding" - "github.com/evmos/evmos/v16/tests/integration/ledger/mocks" - "github.com/evmos/evmos/v16/testutil" - utiltx "github.com/evmos/evmos/v16/testutil/tx" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/crypto/hd" + "github.com/evmos/evmos/v17/encoding" + "github.com/evmos/evmos/v17/tests/integration/ledger/mocks" + "github.com/evmos/evmos/v17/testutil" + utiltx "github.com/evmos/evmos/v17/testutil/tx" "github.com/spf13/cobra" diff --git a/testutil/abci.go b/testutil/abci.go index e0af5a6173..bc38e2a614 100644 --- a/testutil/abci.go +++ b/testutil/abci.go @@ -14,9 +14,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/encoding" - "github.com/evmos/evmos/v16/testutil/tx" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/encoding" + "github.com/evmos/evmos/v17/testutil/tx" ) // Commit commits a block at a given time. Reminder: At the end of each diff --git a/testutil/ante.go b/testutil/ante.go index de32708f46..c69e19fc7b 100644 --- a/testutil/ante.go +++ b/testutil/ante.go @@ -4,8 +4,8 @@ package testutil import ( sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/encoding" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/encoding" ) // NextFn is a no-op function that returns the context and no error in order to mock diff --git a/testutil/contract.go b/testutil/contract.go index 01d3fe224e..703aba0c46 100644 --- a/testutil/contract.go +++ b/testutil/contract.go @@ -18,9 +18,9 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/testutil/tx" - evm "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/testutil/tx" + evm "github.com/evmos/evmos/v17/x/evm/types" ) // ContractArgs are the params used for calling a smart contract. diff --git a/testutil/fund.go b/testutil/fund.go index 29aa501088..d25cc9f3f0 100644 --- a/testutil/fund.go +++ b/testutil/fund.go @@ -7,8 +7,8 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - "github.com/evmos/evmos/v16/utils" - inflationtypes "github.com/evmos/evmos/v16/x/inflation/v1/types" + "github.com/evmos/evmos/v17/utils" + inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" ) // FundAccount is a utility function that funds an account by minting and diff --git a/testutil/integration.go b/testutil/integration.go index e07c373425..3724844805 100644 --- a/testutil/integration.go +++ b/testutil/integration.go @@ -13,8 +13,8 @@ import ( govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" ) // SubmitProposal delivers a submit proposal tx for a given gov content. diff --git a/testutil/integration/common/factory/factory.go b/testutil/integration/common/factory/factory.go index ec07d59d85..13501fce36 100644 --- a/testutil/integration/common/factory/factory.go +++ b/testutil/integration/common/factory/factory.go @@ -8,8 +8,8 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" testutiltypes "github.com/cosmos/cosmos-sdk/types/module/testutil" "github.com/cosmos/cosmos-sdk/x/auth/signing" - "github.com/evmos/evmos/v16/testutil/integration/evmos/grpc" - "github.com/evmos/evmos/v16/testutil/integration/evmos/network" + "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" + "github.com/evmos/evmos/v17/testutil/integration/evmos/network" errorsmod "cosmossdk.io/errors" ) diff --git a/testutil/integration/common/grpc/account.go b/testutil/integration/common/grpc/account.go index 5c2e3bf03c..e47e455f45 100644 --- a/testutil/integration/common/grpc/account.go +++ b/testutil/integration/common/grpc/account.go @@ -6,8 +6,8 @@ import ( "context" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/encoding" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/encoding" ) // GetAccount returns the account for the given address. diff --git a/testutil/integration/common/grpc/authz.go b/testutil/integration/common/grpc/authz.go index 31b89fe149..69942a0635 100644 --- a/testutil/integration/common/grpc/authz.go +++ b/testutil/integration/common/grpc/authz.go @@ -7,8 +7,8 @@ import ( "context" "github.com/cosmos/cosmos-sdk/x/authz" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/encoding" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/encoding" ) // GetGrants returns the grants for the given grantee and granter combination. diff --git a/testutil/integration/common/grpc/grpc.go b/testutil/integration/common/grpc/grpc.go index 6121597ef5..d3266d74a6 100644 --- a/testutil/integration/common/grpc/grpc.go +++ b/testutil/integration/common/grpc/grpc.go @@ -9,7 +9,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/authz" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v16/testutil/integration/common/network" + "github.com/evmos/evmos/v17/testutil/integration/common/network" ) // Handler is an interface that defines the common methods that are used to query diff --git a/testutil/integration/evmos/factory/broadcast.go b/testutil/integration/evmos/factory/broadcast.go index 13e7fbb819..4d98a3e540 100644 --- a/testutil/integration/evmos/factory/broadcast.go +++ b/testutil/integration/evmos/factory/broadcast.go @@ -8,8 +8,8 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v16/precompiles/testutil" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/precompiles/testutil" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) // ExecuteEthTx executes an Ethereum transaction - contract call with the provided private key and txArgs diff --git a/testutil/integration/evmos/factory/build.go b/testutil/integration/evmos/factory/build.go index 326818da0d..b04192954f 100644 --- a/testutil/integration/evmos/factory/build.go +++ b/testutil/integration/evmos/factory/build.go @@ -14,8 +14,8 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core" gethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v16/server/config" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/server/config" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) func (tf *IntegrationTxFactory) GenerateDefaultTxTypeArgs(sender common.Address, txType int) (evmtypes.EvmTxArgs, error) { diff --git a/testutil/integration/evmos/factory/factory.go b/testutil/integration/evmos/factory/factory.go index 1eba200939..31bf971fc6 100644 --- a/testutil/integration/evmos/factory/factory.go +++ b/testutil/integration/evmos/factory/factory.go @@ -16,13 +16,13 @@ import ( "github.com/cosmos/gogoproto/proto" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/precompiles/testutil" - commonfactory "github.com/evmos/evmos/v16/testutil/integration/common/factory" - "github.com/evmos/evmos/v16/testutil/integration/evmos/grpc" - "github.com/evmos/evmos/v16/testutil/integration/evmos/network" - "github.com/evmos/evmos/v16/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/precompiles/testutil" + commonfactory "github.com/evmos/evmos/v17/testutil/integration/common/factory" + "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" + "github.com/evmos/evmos/v17/testutil/integration/evmos/network" + "github.com/evmos/evmos/v17/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) // TxFactory defines a struct that can build and broadcast transactions for the Evmos diff --git a/testutil/integration/evmos/factory/helpers.go b/testutil/integration/evmos/factory/helpers.go index eb1a1c0bbd..f2c4a3a0bb 100644 --- a/testutil/integration/evmos/factory/helpers.go +++ b/testutil/integration/evmos/factory/helpers.go @@ -6,7 +6,7 @@ import ( "strings" "github.com/ethereum/go-ethereum/common" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" errorsmod "cosmossdk.io/errors" amino "github.com/cosmos/cosmos-sdk/codec" @@ -14,8 +14,8 @@ import ( "github.com/cosmos/cosmos-sdk/types/module" testutiltypes "github.com/cosmos/cosmos-sdk/types/module/testutil" authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" - enccodec "github.com/evmos/evmos/v16/encoding/codec" - "github.com/evmos/evmos/v16/precompiles/testutil" + enccodec "github.com/evmos/evmos/v17/encoding/codec" + "github.com/evmos/evmos/v17/precompiles/testutil" ) // buildMsgEthereumTx builds an Ethereum transaction from the given arguments and populates the From field. diff --git a/testutil/integration/evmos/factory/sign.go b/testutil/integration/evmos/factory/sign.go index 803b985c75..1997bbe8aa 100644 --- a/testutil/integration/evmos/factory/sign.go +++ b/testutil/integration/evmos/factory/sign.go @@ -6,8 +6,8 @@ import ( errorsmod "cosmossdk.io/errors" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" gethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v16/testutil/tx" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/testutil/tx" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) // SignMsgEthereumTx signs a MsgEthereumTx with the provided private key and chainID. diff --git a/testutil/integration/evmos/factory/types.go b/testutil/integration/evmos/factory/types.go index 2c1761407b..baa64324ed 100644 --- a/testutil/integration/evmos/factory/types.go +++ b/testutil/integration/evmos/factory/types.go @@ -6,7 +6,7 @@ import ( sdkmath "cosmossdk.io/math" sdktypes "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/accounts/abi" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) // CosmosTxArgs contains the params to create a cosmos tx diff --git a/testutil/integration/evmos/grpc/evm.go b/testutil/integration/evmos/grpc/evm.go index 3a63447424..9b071658c0 100644 --- a/testutil/integration/evmos/grpc/evm.go +++ b/testutil/integration/evmos/grpc/evm.go @@ -6,7 +6,7 @@ import ( "context" "github.com/ethereum/go-ethereum/common" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) // GetEvmAccount returns the EVM account for the given address. diff --git a/testutil/integration/evmos/grpc/feemarket.go b/testutil/integration/evmos/grpc/feemarket.go index 62153882ef..6b96b77964 100644 --- a/testutil/integration/evmos/grpc/feemarket.go +++ b/testutil/integration/evmos/grpc/feemarket.go @@ -5,7 +5,7 @@ package grpc import ( "context" - feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" + feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" ) // GetBaseFee returns the base fee from the feemarket module. diff --git a/testutil/integration/evmos/grpc/grpc.go b/testutil/integration/evmos/grpc/grpc.go index 674c239cc5..df9b1bfbd0 100644 --- a/testutil/integration/evmos/grpc/grpc.go +++ b/testutil/integration/evmos/grpc/grpc.go @@ -6,10 +6,10 @@ package grpc import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1" "github.com/ethereum/go-ethereum/common" - commongrpc "github.com/evmos/evmos/v16/testutil/integration/common/grpc" - "github.com/evmos/evmos/v16/testutil/integration/evmos/network" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" + commongrpc "github.com/evmos/evmos/v17/testutil/integration/common/grpc" + "github.com/evmos/evmos/v17/testutil/integration/evmos/network" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" ) // Handler is an interface that defines the methods that are used to query diff --git a/testutil/integration/evmos/keyring/keyring.go b/testutil/integration/evmos/keyring/keyring.go index 4d999a52bb..5a1a40ac94 100644 --- a/testutil/integration/evmos/keyring/keyring.go +++ b/testutil/integration/evmos/keyring/keyring.go @@ -9,7 +9,7 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdktypes "github.com/cosmos/cosmos-sdk/types" - utiltx "github.com/evmos/evmos/v16/testutil/tx" + utiltx "github.com/evmos/evmos/v17/testutil/tx" ) type Key struct { diff --git a/testutil/integration/evmos/network/clients.go b/testutil/integration/evmos/network/clients.go index 66d8a5845d..47ec2dc637 100644 --- a/testutil/integration/evmos/network/clients.go +++ b/testutil/integration/evmos/network/clients.go @@ -11,12 +11,12 @@ import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/encoding" - erc20types "github.com/evmos/evmos/v16/x/erc20/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" - infltypes "github.com/evmos/evmos/v16/x/inflation/v1/types" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/encoding" + erc20types "github.com/evmos/evmos/v17/x/erc20/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" + infltypes "github.com/evmos/evmos/v17/x/inflation/v1/types" ) func getQueryHelper(ctx sdktypes.Context) *baseapp.QueryServiceTestHelper { diff --git a/testutil/integration/evmos/network/config.go b/testutil/integration/evmos/network/config.go index 9c7101e08d..65bda3cc02 100644 --- a/testutil/integration/evmos/network/config.go +++ b/testutil/integration/evmos/network/config.go @@ -9,9 +9,9 @@ import ( sdktypes "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - testtx "github.com/evmos/evmos/v16/testutil/tx" - evmostypes "github.com/evmos/evmos/v16/types" - "github.com/evmos/evmos/v16/utils" + testtx "github.com/evmos/evmos/v17/testutil/tx" + evmostypes "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v17/utils" ) // Config defines the configuration for a chain. diff --git a/testutil/integration/evmos/network/config_test.go b/testutil/integration/evmos/network/config_test.go index fca4751603..dc0ad27761 100644 --- a/testutil/integration/evmos/network/config_test.go +++ b/testutil/integration/evmos/network/config_test.go @@ -8,10 +8,10 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - grpchandler "github.com/evmos/evmos/v16/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v16/testutil/integration/evmos/network" - "github.com/evmos/evmos/v16/utils" + grpchandler "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v17/testutil/integration/evmos/network" + "github.com/evmos/evmos/v17/utils" "github.com/stretchr/testify/require" ) diff --git a/testutil/integration/evmos/network/network.go b/testutil/integration/evmos/network/network.go index a1cf865bdc..d783be8593 100644 --- a/testutil/integration/evmos/network/network.go +++ b/testutil/integration/evmos/network/network.go @@ -11,8 +11,8 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" gethparams "github.com/ethereum/go-ethereum/params" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/types" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/types" abcitypes "github.com/cometbft/cometbft/abci/types" tmproto "github.com/cometbft/cometbft/proto/tendermint/types" @@ -21,11 +21,11 @@ import ( txtypes "github.com/cosmos/cosmos-sdk/types/tx" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - commonnetwork "github.com/evmos/evmos/v16/testutil/integration/common/network" - erc20types "github.com/evmos/evmos/v16/x/erc20/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" - infltypes "github.com/evmos/evmos/v16/x/inflation/v1/types" + commonnetwork "github.com/evmos/evmos/v17/testutil/integration/common/network" + erc20types "github.com/evmos/evmos/v17/x/erc20/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" + infltypes "github.com/evmos/evmos/v17/x/inflation/v1/types" ) // Network is the interface that wraps the methods to interact with integration test network. diff --git a/testutil/integration/evmos/network/params.go b/testutil/integration/evmos/network/params.go index ce60983030..c18de78a52 100644 --- a/testutil/integration/evmos/network/params.go +++ b/testutil/integration/evmos/network/params.go @@ -5,9 +5,9 @@ package network import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - feemarketypes "github.com/evmos/evmos/v16/x/feemarket/types" - infltypes "github.com/evmos/evmos/v16/x/inflation/v1/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" + feemarketypes "github.com/evmos/evmos/v17/x/feemarket/types" + infltypes "github.com/evmos/evmos/v17/x/inflation/v1/types" ) func (n *IntegrationNetwork) UpdateEvmParams(params evmtypes.Params) error { diff --git a/testutil/integration/evmos/network/setup.go b/testutil/integration/evmos/network/setup.go index 839246895b..d9389d483f 100644 --- a/testutil/integration/evmos/network/setup.go +++ b/testutil/integration/evmos/network/setup.go @@ -7,8 +7,8 @@ import ( "fmt" "time" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/encoding" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/encoding" "cosmossdk.io/simapp" "github.com/cosmos/cosmos-sdk/baseapp" @@ -28,11 +28,11 @@ import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" govtypesv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - epochstypes "github.com/evmos/evmos/v16/x/epochs/types" - infltypes "github.com/evmos/evmos/v16/x/inflation/v1/types" + epochstypes "github.com/evmos/evmos/v17/x/epochs/types" + infltypes "github.com/evmos/evmos/v17/x/inflation/v1/types" - evmosutil "github.com/evmos/evmos/v16/utils" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmosutil "github.com/evmos/evmos/v17/utils" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) // createValidatorSetAndSigners creates validator set with the amount of validators specified diff --git a/testutil/integration/evmos/network/unit_network.go b/testutil/integration/evmos/network/unit_network.go index 42f64b63a0..6394539764 100644 --- a/testutil/integration/evmos/network/unit_network.go +++ b/testutil/integration/evmos/network/unit_network.go @@ -5,9 +5,9 @@ package network import ( sdktypes "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/x/evm/statedb" - inflationtypes "github.com/evmos/evmos/v16/x/inflation/v1/types" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/x/evm/statedb" + inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" ) // UnitTestNetwork is the implementation of the Network interface for unit tests. diff --git a/testutil/integration/evmos/utils/bank.go b/testutil/integration/evmos/utils/bank.go index 7e077266d2..217a61dcd5 100644 --- a/testutil/integration/evmos/utils/bank.go +++ b/testutil/integration/evmos/utils/bank.go @@ -7,7 +7,7 @@ import ( "fmt" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/evmos/evmos/v16/testutil/integration/common/grpc" + "github.com/evmos/evmos/v17/testutil/integration/common/grpc" ) // CheckBalances checks that the given accounts have the expected balances and diff --git a/testutil/integration/evmos/utils/bank_test.go b/testutil/integration/evmos/utils/bank_test.go index ecd9331e21..0d8c9a8cfa 100644 --- a/testutil/integration/evmos/utils/bank_test.go +++ b/testutil/integration/evmos/utils/bank_test.go @@ -6,10 +6,10 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - grpchandler "github.com/evmos/evmos/v16/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v16/testutil/integration/evmos/network" - "github.com/evmos/evmos/v16/testutil/integration/evmos/utils" + grpchandler "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v17/testutil/integration/evmos/network" + "github.com/evmos/evmos/v17/testutil/integration/evmos/utils" "github.com/stretchr/testify/require" ) diff --git a/testutil/integration/evmos/utils/contracts.go b/testutil/integration/evmos/utils/contracts.go index 4bc1722eb2..c59cface0c 100644 --- a/testutil/integration/evmos/utils/contracts.go +++ b/testutil/integration/evmos/utils/contracts.go @@ -6,12 +6,12 @@ import ( "fmt" "slices" - "github.com/evmos/evmos/v16/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" abcitypes "github.com/cometbft/cometbft/abci/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - evmostypes "github.com/evmos/evmos/v16/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmostypes "github.com/evmos/evmos/v17/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) // CheckTxTopics checks if all expected topics are present in the transaction response diff --git a/testutil/integration/evmos/utils/erc20.go b/testutil/integration/evmos/utils/erc20.go index 6a8a8acde5..6648d57ba6 100644 --- a/testutil/integration/evmos/utils/erc20.go +++ b/testutil/integration/evmos/utils/erc20.go @@ -10,9 +10,9 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v16/testutil/integration/evmos/network" - erc20types "github.com/evmos/evmos/v16/x/erc20/types" + "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v17/testutil/integration/evmos/network" + erc20types "github.com/evmos/evmos/v17/x/erc20/types" ) // ERC20RegistrationData is the necessary data to provide in order to register an ERC20 token. diff --git a/testutil/integration/evmos/utils/gov.go b/testutil/integration/evmos/utils/gov.go index 8307b1dedd..4c5cb26fd8 100644 --- a/testutil/integration/evmos/utils/gov.go +++ b/testutil/integration/evmos/utils/gov.go @@ -16,9 +16,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" - commonfactory "github.com/evmos/evmos/v16/testutil/integration/common/factory" - "github.com/evmos/evmos/v16/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v16/testutil/integration/evmos/network" + commonfactory "github.com/evmos/evmos/v17/testutil/integration/common/factory" + "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v17/testutil/integration/evmos/network" ) // SubmitProposal is a helper function to submit a governance proposal and diff --git a/testutil/integration/evmos/utils/unit.go b/testutil/integration/evmos/utils/unit.go index 21e3085a2b..7a88518fd4 100644 --- a/testutil/integration/evmos/utils/unit.go +++ b/testutil/integration/evmos/utils/unit.go @@ -9,14 +9,14 @@ import ( "fmt" "cosmossdk.io/math" - "github.com/evmos/evmos/v16/utils" + "github.com/evmos/evmos/v17/utils" sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - "github.com/evmos/evmos/v16/testutil/integration/evmos/network" - erc20types "github.com/evmos/evmos/v16/x/erc20/types" - inflationtypes "github.com/evmos/evmos/v16/x/inflation/v1/types" + "github.com/evmos/evmos/v17/testutil/integration/evmos/network" + erc20types "github.com/evmos/evmos/v17/x/erc20/types" + inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" ) const ( diff --git a/testutil/integration/ibc/coordinator/coordinator.go b/testutil/integration/ibc/coordinator/coordinator.go index 66e98123c4..e3cdf5a35f 100644 --- a/testutil/integration/ibc/coordinator/coordinator.go +++ b/testutil/integration/ibc/coordinator/coordinator.go @@ -9,9 +9,9 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" ibctesting "github.com/cosmos/ibc-go/v7/testing" - evmosibc "github.com/evmos/evmos/v16/ibc/testing" - "github.com/evmos/evmos/v16/testutil/integration/common/network" - ibcchain "github.com/evmos/evmos/v16/testutil/integration/ibc/chain" + evmosibc "github.com/evmos/evmos/v17/ibc/testing" + "github.com/evmos/evmos/v17/testutil/integration/common/network" + ibcchain "github.com/evmos/evmos/v17/testutil/integration/ibc/chain" ) // Coordinator is the interface that defines the methods that are used to diff --git a/testutil/integration/ibc/coordinator/utils.go b/testutil/integration/ibc/coordinator/utils.go index 9ccf4a2775..27d09f1b40 100644 --- a/testutil/integration/ibc/coordinator/utils.go +++ b/testutil/integration/ibc/coordinator/utils.go @@ -7,7 +7,7 @@ import ( "testing" ibctesting "github.com/cosmos/ibc-go/v7/testing" - "github.com/evmos/evmos/v16/testutil/integration/common/network" + "github.com/evmos/evmos/v17/testutil/integration/common/network" ) // getIBCChains returns a map of TestChain's for the given network interface. diff --git a/testutil/network/network.go b/testutil/network/network.go index 22816204e3..b06676ed55 100644 --- a/testutil/network/network.go +++ b/testutil/network/network.go @@ -52,13 +52,13 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/cosmos/cosmos-sdk/x/genutil" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/crypto/hd" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/crypto/hd" - "github.com/evmos/evmos/v16/encoding" - "github.com/evmos/evmos/v16/server/config" - evmostypes "github.com/evmos/evmos/v16/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/encoding" + "github.com/evmos/evmos/v17/server/config" + evmostypes "github.com/evmos/evmos/v17/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) // package-wide network lock to only allow one test network at a time diff --git a/testutil/network/network_test.go b/testutil/network/network_test.go index 530334ab35..e2884c55ec 100644 --- a/testutil/network/network_test.go +++ b/testutil/network/network_test.go @@ -11,10 +11,10 @@ import ( "github.com/stretchr/testify/suite" "github.com/ethereum/go-ethereum/ethclient" - "github.com/evmos/evmos/v16/server/config" - "github.com/evmos/evmos/v16/testutil/network" + "github.com/evmos/evmos/v17/server/config" + "github.com/evmos/evmos/v17/testutil/network" - evmosnetwork "github.com/evmos/evmos/v16/testutil/network" + evmosnetwork "github.com/evmos/evmos/v17/testutil/network" ) type IntegrationTestSuite struct { diff --git a/testutil/network/util.go b/testutil/network/util.go index 7db32844e8..8cec5aa4e3 100644 --- a/testutil/network/util.go +++ b/testutil/network/util.go @@ -30,10 +30,10 @@ import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - inflationtypes "github.com/evmos/evmos/v16/x/inflation/v1/types" + inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" - "github.com/evmos/evmos/v16/server" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/server" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) func startInProcess(cfg Config, val *Validator) error { diff --git a/testutil/staking-rewards.go b/testutil/staking-rewards.go index 94607574d7..c870c14f2f 100644 --- a/testutil/staking-rewards.go +++ b/testutil/staking-rewards.go @@ -17,9 +17,9 @@ import ( stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" teststaking "github.com/cosmos/cosmos-sdk/x/staking/testutil" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v16/app" - testutiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/utils" + "github.com/evmos/evmos/v17/app" + testutiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v17/utils" "github.com/stretchr/testify/require" ) diff --git a/testutil/statedb.go b/testutil/statedb.go index 00242d3dca..d1cfa53b23 100644 --- a/testutil/statedb.go +++ b/testutil/statedb.go @@ -6,8 +6,8 @@ package testutil import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/app/ante/evm" - "github.com/evmos/evmos/v16/x/evm/statedb" + "github.com/evmos/evmos/v17/app/ante/evm" + "github.com/evmos/evmos/v17/x/evm/statedb" ) // NewStateDB returns a new StateDB for testing purposes. diff --git a/testutil/tx/cosmos.go b/testutil/tx/cosmos.go index f87ce85196..616af2c9c9 100644 --- a/testutil/tx/cosmos.go +++ b/testutil/tx/cosmos.go @@ -13,8 +13,8 @@ import ( "github.com/cosmos/cosmos-sdk/types/tx/signing" authsigning "github.com/cosmos/cosmos-sdk/x/auth/signing" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/utils" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/utils" ) var ( diff --git a/testutil/tx/eip712.go b/testutil/tx/eip712.go index 422ca770c8..34f1a4248a 100644 --- a/testutil/tx/eip712.go +++ b/testutil/tx/eip712.go @@ -16,10 +16,10 @@ import ( "github.com/ethereum/go-ethereum/signer/core/apitypes" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" - "github.com/evmos/evmos/v16/app" - cryptocodec "github.com/evmos/evmos/v16/crypto/codec" - "github.com/evmos/evmos/v16/ethereum/eip712" - "github.com/evmos/evmos/v16/types" + "github.com/evmos/evmos/v17/app" + cryptocodec "github.com/evmos/evmos/v17/crypto/codec" + "github.com/evmos/evmos/v17/ethereum/eip712" + "github.com/evmos/evmos/v17/types" ) type EIP712TxArgs struct { diff --git a/testutil/tx/eth.go b/testutil/tx/eth.go index f38441c22b..07037b4804 100644 --- a/testutil/tx/eth.go +++ b/testutil/tx/eth.go @@ -18,10 +18,10 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/server/config" - "github.com/evmos/evmos/v16/utils" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/server/config" + "github.com/evmos/evmos/v17/utils" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) // PrepareEthTx creates an ethereum tx and signs it with the provided messages and private key. diff --git a/testutil/tx/signer.go b/testutil/tx/signer.go index c9e230f75e..4d9d9fa291 100644 --- a/testutil/tx/signer.go +++ b/testutil/tx/signer.go @@ -12,7 +12,7 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" ) // NewAddrKey generates an Ethereum address and its corresponding private key. diff --git a/types/account.pb.go b/types/account.pb.go index 4774422c02..5530888358 100644 --- a/types/account.pb.go +++ b/types/account.pb.go @@ -92,8 +92,8 @@ var fileDescriptor_4edc057d42a619ef = []byte{ 0xa5, 0x74, 0x8b, 0x53, 0xb2, 0xf5, 0x2b, 0x20, 0x81, 0x03, 0x09, 0x32, 0x6c, 0xee, 0x86, 0xba, 0xc4, 0xd3, 0xc9, 0xea, 0xc4, 0x23, 0x39, 0xc6, 0x0b, 0x8f, 0xe4, 0x18, 0x1f, 0x3c, 0x92, 0x63, 0x9c, 0xf0, 0x58, 0x8e, 0xe1, 0xc2, 0x63, 0x39, 0x86, 0x1b, 0x8f, 0xe5, 0x18, 0xa2, 0x14, 0x90, - 0x6c, 0x48, 0x2d, 0x03, 0x59, 0x00, 0x21, 0xcb, 0x0c, 0xcd, 0x20, 0x06, 0x27, 0xb1, 0x81, 0x83, - 0xcf, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0x52, 0xd6, 0xc9, 0x4a, 0xc7, 0x01, 0x00, 0x00, + 0x6c, 0x48, 0x2d, 0x03, 0x59, 0x00, 0x21, 0xcb, 0x0c, 0xcd, 0x21, 0x06, 0x27, 0xb1, 0x81, 0x83, + 0xcf, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0xba, 0x0d, 0x32, 0xf3, 0xc7, 0x01, 0x00, 0x00, } func (m *EthAccount) Marshal() (dAtA []byte, err error) { diff --git a/types/account_test.go b/types/account_test.go index 90ba21f59b..279038bd28 100644 --- a/types/account_test.go +++ b/types/account_test.go @@ -12,10 +12,10 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - cryptocodec "github.com/evmos/evmos/v16/crypto/codec" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" - encodingcodec "github.com/evmos/evmos/v16/encoding/codec" - "github.com/evmos/evmos/v16/types" + cryptocodec "github.com/evmos/evmos/v17/crypto/codec" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + encodingcodec "github.com/evmos/evmos/v17/encoding/codec" + "github.com/evmos/evmos/v17/types" ) func init() { diff --git a/types/dynamic_fee.pb.go b/types/dynamic_fee.pb.go index 5c2b093b37..854386a021 100644 --- a/types/dynamic_fee.pb.go +++ b/types/dynamic_fee.pb.go @@ -86,8 +86,8 @@ var fileDescriptor_9d7cf05c9992c480 = []byte{ 0x08, 0x80, 0xea, 0x0b, 0x00, 0x69, 0x73, 0xb2, 0x3a, 0xf1, 0x48, 0x8e, 0xf1, 0xc2, 0x23, 0x39, 0xc6, 0x07, 0x8f, 0xe4, 0x18, 0x27, 0x3c, 0x96, 0x63, 0xb8, 0xf0, 0x58, 0x8e, 0xe1, 0xc6, 0x63, 0x39, 0x86, 0x28, 0x85, 0xf4, 0xcc, 0x92, 0x8c, 0xd2, 0x24, 0xbd, 0xe4, 0xfc, 0x5c, 0xfd, 0xd4, - 0xb2, 0xdc, 0xfc, 0x62, 0x28, 0x59, 0x66, 0x68, 0x06, 0xf1, 0x66, 0x12, 0x1b, 0xd8, 0xb9, 0xc6, - 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb6, 0x8c, 0xe5, 0x28, 0x00, 0x01, 0x00, 0x00, + 0xb2, 0xdc, 0xfc, 0x62, 0x28, 0x59, 0x66, 0x68, 0x0e, 0xf1, 0x66, 0x12, 0x1b, 0xd8, 0xb9, 0xc6, + 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x5e, 0x57, 0x1e, 0x91, 0x00, 0x01, 0x00, 0x00, } func (m *ExtensionOptionDynamicFeeTx) Marshal() (dAtA []byte, err error) { diff --git a/types/indexer.pb.go b/types/indexer.pb.go index 1a224fcb1e..1d04472694 100644 --- a/types/indexer.pb.go +++ b/types/indexer.pb.go @@ -87,7 +87,7 @@ var fileDescriptor_1197e10a8be8ed28 = []byte{ // 298 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x44, 0x90, 0x31, 0x4b, 0xc3, 0x40, 0x18, 0x86, 0x73, 0xb6, 0x4d, 0xe3, 0xa1, 0x83, 0x51, 0x4a, 0x54, 0x88, 0x87, 0x53, 0xa6, 0x84, - 0x22, 0x38, 0x74, 0x74, 0x11, 0xd7, 0xa3, 0x2e, 0x2e, 0x21, 0x6d, 0x3e, 0xef, 0x0e, 0x7a, 0xbd, + 0xe2, 0x20, 0x74, 0x74, 0x11, 0xd7, 0xa3, 0x2e, 0x2e, 0x21, 0x6d, 0x3e, 0xef, 0x0e, 0x7a, 0xbd, 0xd2, 0xfb, 0x12, 0xe2, 0x3f, 0x70, 0xf4, 0x27, 0xf8, 0x73, 0x1c, 0x3b, 0x3a, 0x4a, 0x8b, 0xff, 0x43, 0x7a, 0x09, 0x75, 0x39, 0xee, 0xe5, 0x79, 0x3e, 0x5e, 0x78, 0x29, 0x03, 0x94, 0xb0, 0xd6, 0x6a, 0x89, 0x19, 0xbe, 0xad, 0xc0, 0x66, 0xf5, 0x38, 0x53, 0xcb, 0x12, 0x1a, 0x58, 0xa7, 0xab, @@ -103,7 +103,7 @@ var fileDescriptor_1197e10a8be8ed28 = []byte{ 0x87, 0xc9, 0xd7, 0x36, 0x26, 0x9b, 0x6d, 0x4c, 0x7e, 0xb6, 0x31, 0xf9, 0xd8, 0xc5, 0xde, 0x66, 0x17, 0x7b, 0xdf, 0xbb, 0xd8, 0x7b, 0x61, 0x42, 0xa1, 0xac, 0x66, 0xe9, 0xdc, 0xe8, 0x0c, 0x6a, 0x6d, 0x6c, 0xf7, 0xd6, 0xe3, 0xfb, 0x76, 0xde, 0x99, 0xef, 0xa6, 0xba, 0xfb, 0x0b, 0x00, 0x00, - 0xff, 0xff, 0xfb, 0x8e, 0x68, 0x62, 0x78, 0x01, 0x00, 0x00, + 0xff, 0xff, 0x13, 0x55, 0x93, 0xdb, 0x78, 0x01, 0x00, 0x00, } func (m *TxResult) Marshal() (dAtA []byte, err error) { diff --git a/types/validation_test.go b/types/validation_test.go index 9cce70ce7b..43246cdb50 100644 --- a/types/validation_test.go +++ b/types/validation_test.go @@ -4,8 +4,8 @@ import ( "testing" "github.com/ethereum/go-ethereum/common" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/types" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v17/types" "github.com/stretchr/testify/require" ) diff --git a/types/web3.pb.go b/types/web3.pb.go index a7cab8b794..24469571ef 100644 --- a/types/web3.pb.go +++ b/types/web3.pb.go @@ -95,8 +95,8 @@ var fileDescriptor_9eb7cd56e3c92bc3 = []byte{ 0x1b, 0x49, 0xd8, 0x8a, 0xa5, 0x63, 0x81, 0x3c, 0x83, 0x93, 0xd5, 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, 0x29, 0xa4, 0x67, 0x96, 0x64, 0x94, 0x26, 0xe9, 0x25, 0xe7, 0xe7, - 0xea, 0xa7, 0x96, 0xe5, 0xe6, 0x17, 0x43, 0xc9, 0x32, 0x43, 0x33, 0x48, 0x58, 0x27, 0xb1, 0x81, - 0x83, 0xce, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0x68, 0xa3, 0xe0, 0x1a, 0x85, 0x01, 0x00, 0x00, + 0xea, 0xa7, 0x96, 0xe5, 0xe6, 0x17, 0x43, 0xc9, 0x32, 0x43, 0x73, 0x48, 0x58, 0x27, 0xb1, 0x81, + 0x83, 0xce, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0x80, 0x78, 0x1b, 0xa3, 0x85, 0x01, 0x00, 0x00, } func (m *ExtensionOptionsWeb3Tx) Marshal() (dAtA []byte, err error) { diff --git a/utils/utils.go b/utils/utils.go index dc7cf47586..da40d48c32 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -10,7 +10,7 @@ import ( ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" errorsmod "cosmossdk.io/errors" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" diff --git a/utils/utils_test.go b/utils/utils_test.go index e278ca9332..cc3424f60a 100644 --- a/utils/utils_test.go +++ b/utils/utils_test.go @@ -12,7 +12,7 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" ) func init() { diff --git a/wallets/ledger/ledger.go b/wallets/ledger/ledger.go index 9324455947..2e14e90b9f 100644 --- a/wallets/ledger/ledger.go +++ b/wallets/ledger/ledger.go @@ -14,9 +14,9 @@ import ( "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/signer/core/apitypes" - "github.com/evmos/evmos/v16/ethereum/eip712" - "github.com/evmos/evmos/v16/wallets/accounts" - "github.com/evmos/evmos/v16/wallets/usbwallet" + "github.com/evmos/evmos/v17/ethereum/eip712" + "github.com/evmos/evmos/v17/wallets/accounts" + "github.com/evmos/evmos/v17/wallets/usbwallet" ) // Secp256k1DerivationFn defines the derivation function used on the Cosmos SDK Keyring. diff --git a/wallets/ledger/ledger_suite_test.go b/wallets/ledger/ledger_suite_test.go index 0b2a3c6e3a..2152fc587f 100644 --- a/wallets/ledger/ledger_suite_test.go +++ b/wallets/ledger/ledger_suite_test.go @@ -21,9 +21,9 @@ import ( auxTx "github.com/cosmos/cosmos-sdk/x/auth/tx" bankTypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/evmos/evmos/v16/wallets/ledger" - "github.com/evmos/evmos/v16/wallets/ledger/mocks" - "github.com/evmos/evmos/v16/wallets/usbwallet" + "github.com/evmos/evmos/v17/wallets/ledger" + "github.com/evmos/evmos/v17/wallets/ledger/mocks" + "github.com/evmos/evmos/v17/wallets/usbwallet" ) type LedgerTestSuite struct { diff --git a/wallets/ledger/ledger_test.go b/wallets/ledger/ledger_test.go index 25f2c5d4a2..b30ab96b0f 100644 --- a/wallets/ledger/ledger_test.go +++ b/wallets/ledger/ledger_test.go @@ -8,11 +8,11 @@ import ( gethaccounts "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/encoding" - "github.com/evmos/evmos/v16/ethereum/eip712" - "github.com/evmos/evmos/v16/wallets/accounts" - "github.com/evmos/evmos/v16/wallets/ledger" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/encoding" + "github.com/evmos/evmos/v17/ethereum/eip712" + "github.com/evmos/evmos/v17/wallets/accounts" + "github.com/evmos/evmos/v17/wallets/ledger" ) // Test Mnemonic: diff --git a/wallets/ledger/mocks/wallet.go b/wallets/ledger/mocks/wallet.go index 3123cf45f5..5547c2ab55 100644 --- a/wallets/ledger/mocks/wallet.go +++ b/wallets/ledger/mocks/wallet.go @@ -6,7 +6,7 @@ package mocks import ( apitypes "github.com/ethereum/go-ethereum/signer/core/apitypes" - accounts "github.com/evmos/evmos/v16/wallets/accounts" + accounts "github.com/evmos/evmos/v17/wallets/accounts" big "math/big" diff --git a/wallets/ledger/wallet_test.go b/wallets/ledger/wallet_test.go index f76d751f30..6f6d020931 100644 --- a/wallets/ledger/wallet_test.go +++ b/wallets/ledger/wallet_test.go @@ -9,9 +9,9 @@ import ( gethaccounts "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/ethereum/eip712" - "github.com/evmos/evmos/v16/wallets/accounts" - "github.com/evmos/evmos/v16/wallets/ledger/mocks" + "github.com/evmos/evmos/v17/ethereum/eip712" + "github.com/evmos/evmos/v17/wallets/accounts" + "github.com/evmos/evmos/v17/wallets/ledger/mocks" ) func RegisterDerive(mockWallet *mocks.Wallet, addr common.Address, publicKey *ecdsa.PublicKey) { diff --git a/wallets/usbwallet/hub.go b/wallets/usbwallet/hub.go index f5ad82e5f1..6ae48d6214 100644 --- a/wallets/usbwallet/hub.go +++ b/wallets/usbwallet/hub.go @@ -14,7 +14,7 @@ import ( "runtime" gethaccounts "github.com/ethereum/go-ethereum/accounts" - "github.com/evmos/evmos/v16/wallets/accounts" + "github.com/evmos/evmos/v17/wallets/accounts" usb "github.com/zondax/hid" ) diff --git a/wallets/usbwallet/wallet.go b/wallets/usbwallet/wallet.go index 6043ba294b..bcfd811360 100644 --- a/wallets/usbwallet/wallet.go +++ b/wallets/usbwallet/wallet.go @@ -16,7 +16,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/signer/core/apitypes" - "github.com/evmos/evmos/v16/wallets/accounts" + "github.com/evmos/evmos/v17/wallets/accounts" usb "github.com/zondax/hid" ) diff --git a/x/epochs/client/cli/query.go b/x/epochs/client/cli/query.go index 3c10b9e520..67e5dfb83a 100644 --- a/x/epochs/client/cli/query.go +++ b/x/epochs/client/cli/query.go @@ -12,7 +12,7 @@ import ( "github.com/cosmos/cosmos-sdk/version" "github.com/spf13/cobra" - "github.com/evmos/evmos/v16/x/epochs/types" + "github.com/evmos/evmos/v17/x/epochs/types" ) // GetQueryCmd returns the cli query commands for this module diff --git a/x/epochs/genesis.go b/x/epochs/genesis.go index 265513eb4b..f6efdc2b1f 100644 --- a/x/epochs/genesis.go +++ b/x/epochs/genesis.go @@ -8,8 +8,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/x/epochs/keeper" - "github.com/evmos/evmos/v16/x/epochs/types" + "github.com/evmos/evmos/v17/x/epochs/keeper" + "github.com/evmos/evmos/v17/x/epochs/types" ) // InitGenesis initializes the epochs module's state from a provided genesis diff --git a/x/epochs/genesis_test.go b/x/epochs/genesis_test.go index cc045e33d9..efc2001295 100644 --- a/x/epochs/genesis_test.go +++ b/x/epochs/genesis_test.go @@ -5,13 +5,13 @@ import ( "time" tmproto "github.com/cometbft/cometbft/proto/tendermint/types" - "github.com/evmos/evmos/v16/utils" - feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" + "github.com/evmos/evmos/v17/utils" + feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" "github.com/stretchr/testify/require" - simapp "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/x/epochs" - "github.com/evmos/evmos/v16/x/epochs/types" + simapp "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/x/epochs" + "github.com/evmos/evmos/v17/x/epochs/types" ) func TestEpochsExportGenesis(t *testing.T) { diff --git a/x/epochs/keeper/abci.go b/x/epochs/keeper/abci.go index 6eff08544a..f85e6fb24c 100644 --- a/x/epochs/keeper/abci.go +++ b/x/epochs/keeper/abci.go @@ -10,7 +10,7 @@ import ( "github.com/cosmos/cosmos-sdk/telemetry" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/x/epochs/types" + "github.com/evmos/evmos/v17/x/epochs/types" ) // BeginBlocker of epochs module diff --git a/x/epochs/keeper/abci_test.go b/x/epochs/keeper/abci_test.go index 0fbe2a45fb..cf75824331 100644 --- a/x/epochs/keeper/abci_test.go +++ b/x/epochs/keeper/abci_test.go @@ -4,8 +4,8 @@ import ( "fmt" "time" - "github.com/evmos/evmos/v16/x/epochs" - "github.com/evmos/evmos/v16/x/epochs/types" + "github.com/evmos/evmos/v17/x/epochs" + "github.com/evmos/evmos/v17/x/epochs/types" ) func (suite *KeeperTestSuite) TestEpochInfoChangesBeginBlockerAndInitGenesis() { diff --git a/x/epochs/keeper/epoch_infos.go b/x/epochs/keeper/epoch_infos.go index 10e0745d74..31ae431f01 100644 --- a/x/epochs/keeper/epoch_infos.go +++ b/x/epochs/keeper/epoch_infos.go @@ -8,7 +8,7 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/x/epochs/types" + "github.com/evmos/evmos/v17/x/epochs/types" ) // GetEpochInfo returns epoch info by identifier diff --git a/x/epochs/keeper/epoch_infos_test.go b/x/epochs/keeper/epoch_infos_test.go index bb234d98e8..24523a8b6d 100644 --- a/x/epochs/keeper/epoch_infos_test.go +++ b/x/epochs/keeper/epoch_infos_test.go @@ -3,7 +3,7 @@ package keeper_test import ( "time" - "github.com/evmos/evmos/v16/x/epochs/types" + "github.com/evmos/evmos/v17/x/epochs/types" ) func (suite *KeeperTestSuite) TestEpochLifeCycle() { diff --git a/x/epochs/keeper/grpc_query.go b/x/epochs/keeper/grpc_query.go index 2f7f9ee66e..b8e0de6246 100644 --- a/x/epochs/keeper/grpc_query.go +++ b/x/epochs/keeper/grpc_query.go @@ -12,7 +12,7 @@ import ( "google.golang.org/grpc/codes" "google.golang.org/grpc/status" - "github.com/evmos/evmos/v16/x/epochs/types" + "github.com/evmos/evmos/v17/x/epochs/types" ) var _ types.QueryServer = Keeper{} diff --git a/x/epochs/keeper/grpc_query_test.go b/x/epochs/keeper/grpc_query_test.go index a8134ade37..40d331d139 100644 --- a/x/epochs/keeper/grpc_query_test.go +++ b/x/epochs/keeper/grpc_query_test.go @@ -6,7 +6,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/query" - "github.com/evmos/evmos/v16/x/epochs/types" + "github.com/evmos/evmos/v17/x/epochs/types" ) func (suite *KeeperTestSuite) TestEpochInfo() { diff --git a/x/epochs/keeper/hooks.go b/x/epochs/keeper/hooks.go index 4a98f7c688..97d45b99ba 100644 --- a/x/epochs/keeper/hooks.go +++ b/x/epochs/keeper/hooks.go @@ -5,7 +5,7 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/x/epochs/types" + "github.com/evmos/evmos/v17/x/epochs/types" ) var _ types.EpochHooks = MultiEpochHooks{} diff --git a/x/epochs/keeper/keeper.go b/x/epochs/keeper/keeper.go index 2e3b2eacb4..be83f6c8c6 100644 --- a/x/epochs/keeper/keeper.go +++ b/x/epochs/keeper/keeper.go @@ -11,7 +11,7 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/x/epochs/types" + "github.com/evmos/evmos/v17/x/epochs/types" ) // Keeper of this module maintains collections of epochs and hooks. diff --git a/x/epochs/keeper/setup_test.go b/x/epochs/keeper/setup_test.go index fde7405b42..0ea9208e95 100644 --- a/x/epochs/keeper/setup_test.go +++ b/x/epochs/keeper/setup_test.go @@ -11,10 +11,10 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/suite" - evm "github.com/evmos/evmos/v16/x/evm/types" + evm "github.com/evmos/evmos/v17/x/evm/types" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/x/epochs/types" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/x/epochs/types" ) type KeeperTestSuite struct { diff --git a/x/epochs/keeper/utils_test.go b/x/epochs/keeper/utils_test.go index 31ef07fbbc..42fad3dccd 100644 --- a/x/epochs/keeper/utils_test.go +++ b/x/epochs/keeper/utils_test.go @@ -4,11 +4,11 @@ import ( "time" "github.com/cosmos/cosmos-sdk/baseapp" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/testutil" - "github.com/evmos/evmos/v16/utils" - "github.com/evmos/evmos/v16/x/epochs/types" - evm "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/testutil" + "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v17/x/epochs/types" + evm "github.com/evmos/evmos/v17/x/evm/types" ) // Test helpers diff --git a/x/epochs/module.go b/x/epochs/module.go index 01e79710c2..b67d6e561a 100644 --- a/x/epochs/module.go +++ b/x/epochs/module.go @@ -22,9 +22,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" - "github.com/evmos/evmos/v16/x/epochs/client/cli" - "github.com/evmos/evmos/v16/x/epochs/keeper" - "github.com/evmos/evmos/v16/x/epochs/types" + "github.com/evmos/evmos/v17/x/epochs/client/cli" + "github.com/evmos/evmos/v17/x/epochs/keeper" + "github.com/evmos/evmos/v17/x/epochs/types" ) // consensusVersion defines the current x/epochs module consensus version. diff --git a/x/epochs/types/genesis.pb.go b/x/epochs/types/genesis.pb.go index 5ea4a89492..3441fabbae 100644 --- a/x/epochs/types/genesis.pb.go +++ b/x/epochs/types/genesis.pb.go @@ -186,7 +186,7 @@ var fileDescriptor_c74bc0b3e7fa01c2 = []byte{ // 463 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x53, 0x31, 0x8f, 0xd3, 0x30, 0x14, 0xae, 0x69, 0x29, 0x57, 0x73, 0xe8, 0x84, 0x75, 0x40, 0xa8, 0x74, 0x4e, 0x14, 0x96, 0x22, - 0x90, 0xad, 0x02, 0x42, 0x08, 0xb6, 0x1e, 0x88, 0x63, 0x4d, 0x19, 0x10, 0x4b, 0x95, 0xb6, 0xae, + 0x90, 0xad, 0x02, 0x12, 0x08, 0xb6, 0x1e, 0x88, 0x63, 0x4d, 0x19, 0x10, 0x4b, 0x95, 0xb6, 0xae, 0x63, 0xe9, 0x12, 0x47, 0xc9, 0x4b, 0x45, 0x37, 0x66, 0xa6, 0x1b, 0xf9, 0x49, 0x37, 0xde, 0xc8, 0x54, 0x50, 0xbb, 0x31, 0xde, 0x2f, 0x40, 0xb1, 0x93, 0x52, 0xae, 0x20, 0x96, 0x28, 0x7e, 0xdf, 0xf7, 0xbe, 0xcf, 0xdf, 0xd3, 0x33, 0x3e, 0x12, 0xf3, 0x58, 0xe7, 0x5c, 0xa4, 0x7a, 0x12, 0xe5, @@ -212,7 +212,7 @@ var fileDescriptor_c74bc0b3e7fa01c2 = []byte{ 0xe7, 0x2b, 0x8a, 0x2e, 0x56, 0x14, 0xfd, 0x58, 0x51, 0x74, 0xb6, 0xa6, 0x8d, 0x8b, 0x35, 0x6d, 0x7c, 0x5b, 0xd3, 0xc6, 0xc7, 0x87, 0x52, 0x41, 0x54, 0x8c, 0xd9, 0x44, 0xc7, 0xbc, 0x7a, 0x02, 0xe6, 0x3b, 0xef, 0x3f, 0xe7, 0x9f, 0xea, 0xe7, 0x00, 0x8b, 0x54, 0xe4, 0xe3, 0xb6, 0x99, 0xec, - 0xd3, 0x5f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x1c, 0xa6, 0x39, 0x36, 0x2b, 0x03, 0x00, 0x00, + 0xd3, 0x5f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x3b, 0xc3, 0x1c, 0xb7, 0x2b, 0x03, 0x00, 0x00, } func (m *EpochInfo) Marshal() (dAtA []byte, err error) { diff --git a/x/epochs/types/query.pb.go b/x/epochs/types/query.pb.go index 64ef03bf04..ed5f55f596 100644 --- a/x/epochs/types/query.pb.go +++ b/x/epochs/types/query.pb.go @@ -240,32 +240,32 @@ var fileDescriptor_d13f5778acd937ff = []byte{ // 449 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0xc1, 0x6b, 0x14, 0x31, 0x14, 0xc6, 0x37, 0x5b, 0x2d, 0x98, 0x56, 0x84, 0x20, 0x76, 0x3b, 0x6a, 0xba, 0xac, 0xd0, 0x6e, - 0x7b, 0x48, 0x98, 0x15, 0x44, 0x3c, 0x49, 0x8b, 0x8a, 0x37, 0x9d, 0xa3, 0x17, 0x9d, 0x1d, 0x5f, - 0xd3, 0x80, 0x4d, 0xa6, 0x93, 0xcc, 0x60, 0x6f, 0xe2, 0x5d, 0x10, 0xbc, 0x89, 0x7f, 0x50, 0x8f, - 0x05, 0x2f, 0x9e, 0x44, 0x76, 0xfd, 0x43, 0x64, 0x92, 0xac, 0xce, 0xee, 0x0e, 0xac, 0x97, 0x21, - 0xe4, 0xbd, 0xef, 0x7b, 0xbf, 0xf7, 0x4d, 0xf0, 0x6d, 0xa8, 0x4e, 0xb5, 0xe1, 0x90, 0xeb, 0xec, - 0xc4, 0xf0, 0x2a, 0xe6, 0x67, 0x25, 0x14, 0xe7, 0x2c, 0x2f, 0xb4, 0xd5, 0xe4, 0x86, 0x2b, 0x32, - 0x5f, 0x64, 0x55, 0x1c, 0x1d, 0x64, 0xda, 0xd4, 0xed, 0xe3, 0xd4, 0x80, 0xef, 0xe4, 0x55, 0x3c, - 0x06, 0x9b, 0xc6, 0x3c, 0x4f, 0x85, 0x54, 0xa9, 0x95, 0x5a, 0x79, 0x71, 0x74, 0x77, 0xd1, 0x59, - 0x80, 0x02, 0x23, 0x4d, 0x28, 0xdf, 0x14, 0x5a, 0x68, 0x77, 0xe4, 0xf5, 0x29, 0xdc, 0xde, 0x11, - 0x5a, 0x8b, 0x77, 0xc0, 0xd3, 0x5c, 0xf2, 0x54, 0x29, 0x6d, 0x9d, 0x63, 0xd0, 0x0c, 0xde, 0xe0, - 0x5b, 0x2f, 0xeb, 0xa1, 0x4f, 0x9c, 0xe7, 0x73, 0x75, 0xac, 0x13, 0x38, 0x2b, 0xc1, 0x58, 0xf2, - 0x14, 0xe3, 0x7f, 0x00, 0x3d, 0xd4, 0x47, 0xc3, 0x8d, 0xd1, 0x2e, 0xf3, 0xb4, 0xac, 0xa6, 0x65, - 0x7e, 0xaf, 0x40, 0xcb, 0x5e, 0xa4, 0x02, 0x82, 0x36, 0x69, 0x28, 0x07, 0xdf, 0x10, 0xde, 0x5a, - 0x1a, 0x61, 0x72, 0xad, 0x0c, 0x90, 0x87, 0x78, 0xdd, 0x2f, 0xd3, 0x43, 0xfd, 0xb5, 0xe1, 0xc6, - 0x28, 0x62, 0x0b, 0xf1, 0x30, 0x27, 0xaa, 0x35, 0x87, 0x57, 0x2e, 0x7e, 0xee, 0x74, 0x92, 0xd0, - 0x4f, 0x9e, 0xcd, 0xd1, 0x75, 0x1d, 0xdd, 0xde, 0x4a, 0x3a, 0x3f, 0x76, 0x0e, 0xef, 0x11, 0xee, - 0x39, 0xba, 0xa3, 0xb2, 0x28, 0x40, 0x59, 0x37, 0x6f, 0x16, 0x01, 0xc5, 0x58, 0xbe, 0x05, 0x65, - 0xe5, 0xb1, 0x84, 0xc2, 0x45, 0x70, 0x2d, 0x69, 0xdc, 0x0c, 0x1e, 0xe3, 0xed, 0x16, 0x6d, 0xd8, - 0xed, 0x1e, 0xbe, 0x9e, 0xf9, 0xfb, 0xd7, 0x8e, 0xd9, 0xe9, 0xd7, 0x92, 0xcd, 0xac, 0xd1, 0x3c, - 0xfa, 0xda, 0xc5, 0x57, 0x9d, 0x05, 0xf9, 0x80, 0x30, 0xfe, 0xbb, 0xac, 0x21, 0x7b, 0x4b, 0x49, - 0xb4, 0xff, 0xa6, 0x68, 0xb8, 0xba, 0xd1, 0x03, 0x0d, 0x76, 0x3e, 0x7e, 0xff, 0xfd, 0xa5, 0xbb, - 0x4d, 0xb6, 0xf8, 0xe2, 0x33, 0x0a, 0x99, 0x7e, 0x42, 0x78, 0xb3, 0xb9, 0x0a, 0xd9, 0x6f, 0xf7, - 0x6e, 0x89, 0x2a, 0x3a, 0xf8, 0x9f, 0xd6, 0x00, 0xb2, 0xeb, 0x40, 0xfa, 0x84, 0x2e, 0x81, 0xcc, - 0x05, 0x76, 0x78, 0x74, 0x31, 0xa1, 0xe8, 0x72, 0x42, 0xd1, 0xaf, 0x09, 0x45, 0x9f, 0xa7, 0xb4, - 0x73, 0x39, 0xa5, 0x9d, 0x1f, 0x53, 0xda, 0x79, 0xb5, 0x2f, 0xa4, 0x3d, 0x29, 0xc7, 0x2c, 0xd3, - 0xa7, 0x33, 0x0f, 0xf7, 0xad, 0xe2, 0x07, 0xfc, 0xfd, 0xcc, 0xcf, 0x9e, 0xe7, 0x60, 0xc6, 0xeb, - 0xee, 0x9d, 0xdf, 0xff, 0x13, 0x00, 0x00, 0xff, 0xff, 0x0f, 0x36, 0x90, 0xb4, 0x96, 0x03, 0x00, + 0x7b, 0x48, 0x98, 0xf5, 0xa0, 0x78, 0x92, 0x16, 0x15, 0x6f, 0x3a, 0x47, 0x2f, 0x3a, 0x3b, 0xbe, + 0xa6, 0x01, 0x9b, 0x4c, 0x27, 0x99, 0xc1, 0xde, 0xc4, 0xbb, 0x20, 0x78, 0x13, 0xff, 0xa0, 0x1e, + 0x0b, 0x5e, 0x3c, 0x89, 0xec, 0xfa, 0x87, 0xc8, 0x24, 0x59, 0x9d, 0xdd, 0x1d, 0x58, 0x2f, 0x43, + 0xc8, 0x7b, 0xdf, 0xf7, 0x7e, 0xef, 0x9b, 0xe0, 0xdb, 0x50, 0x9d, 0x6a, 0xc3, 0x21, 0xd7, 0xd9, + 0x89, 0xe1, 0x55, 0xcc, 0xcf, 0x4a, 0x28, 0xce, 0x59, 0x5e, 0x68, 0xab, 0xc9, 0x0d, 0x57, 0x64, + 0xbe, 0xc8, 0xaa, 0x38, 0x3a, 0xc8, 0xb4, 0xa9, 0xdb, 0xc7, 0xa9, 0x01, 0xdf, 0xc9, 0xab, 0x78, + 0x0c, 0x36, 0x8d, 0x79, 0x9e, 0x0a, 0xa9, 0x52, 0x2b, 0xb5, 0xf2, 0xe2, 0xe8, 0xee, 0xa2, 0xb3, + 0x00, 0x05, 0x46, 0x9a, 0x50, 0xbe, 0x29, 0xb4, 0xd0, 0xee, 0xc8, 0xeb, 0x53, 0xb8, 0xbd, 0x23, + 0xb4, 0x16, 0xef, 0x80, 0xa7, 0xb9, 0xe4, 0xa9, 0x52, 0xda, 0x3a, 0xc7, 0xa0, 0x19, 0xbc, 0xc1, + 0xb7, 0x5e, 0xd6, 0x43, 0x9f, 0x38, 0xcf, 0xe7, 0xea, 0x58, 0x27, 0x70, 0x56, 0x82, 0xb1, 0xe4, + 0x29, 0xc6, 0xff, 0x00, 0x7a, 0xa8, 0x8f, 0x86, 0x1b, 0xa3, 0x5d, 0xe6, 0x69, 0x59, 0x4d, 0xcb, + 0xfc, 0x5e, 0x81, 0x96, 0xbd, 0x48, 0x05, 0x04, 0x6d, 0xd2, 0x50, 0x0e, 0xbe, 0x21, 0xbc, 0xb5, + 0x34, 0xc2, 0xe4, 0x5a, 0x19, 0x20, 0x0f, 0xf1, 0xba, 0x5f, 0xa6, 0x87, 0xfa, 0x6b, 0xc3, 0x8d, + 0x51, 0xc4, 0x16, 0xe2, 0x61, 0x4e, 0x54, 0x6b, 0x0e, 0xaf, 0x5c, 0xfc, 0xdc, 0xe9, 0x24, 0xa1, + 0x9f, 0x3c, 0x9b, 0xa3, 0xeb, 0x3a, 0xba, 0xbd, 0x95, 0x74, 0x7e, 0xec, 0x1c, 0xde, 0x23, 0xdc, + 0x73, 0x74, 0x47, 0x65, 0x51, 0x80, 0xb2, 0x6e, 0xde, 0x2c, 0x02, 0x8a, 0xb1, 0x7c, 0x0b, 0xca, + 0xca, 0x63, 0x09, 0x85, 0x8b, 0xe0, 0x5a, 0xd2, 0xb8, 0x19, 0x3c, 0xc6, 0xdb, 0x2d, 0xda, 0xb0, + 0xdb, 0x3d, 0x7c, 0x3d, 0xf3, 0xf7, 0xaf, 0x1d, 0xb3, 0xd3, 0xaf, 0x25, 0x9b, 0x59, 0xa3, 0x79, + 0xf4, 0xb5, 0x8b, 0xaf, 0x3a, 0x0b, 0xf2, 0x01, 0x61, 0xfc, 0x77, 0x59, 0x43, 0xf6, 0x96, 0x92, + 0x68, 0xff, 0x4d, 0xd1, 0x70, 0x75, 0xa3, 0x07, 0x1a, 0xec, 0x7c, 0xfc, 0xfe, 0xfb, 0x4b, 0x77, + 0x9b, 0x6c, 0xf1, 0xc5, 0x67, 0x14, 0x32, 0xfd, 0x84, 0xf0, 0x66, 0x73, 0x15, 0xb2, 0xdf, 0xee, + 0xdd, 0x12, 0x55, 0x74, 0xf0, 0x3f, 0xad, 0x01, 0x64, 0xd7, 0x81, 0xf4, 0x09, 0x5d, 0x02, 0x99, + 0x0b, 0xec, 0xf0, 0xe8, 0x62, 0x42, 0xd1, 0xe5, 0x84, 0xa2, 0x5f, 0x13, 0x8a, 0x3e, 0x4f, 0x69, + 0xe7, 0x72, 0x4a, 0x3b, 0x3f, 0xa6, 0xb4, 0xf3, 0x6a, 0x5f, 0x48, 0x7b, 0x52, 0x8e, 0x59, 0xa6, + 0x4f, 0x67, 0x1e, 0xee, 0x5b, 0xc5, 0x0f, 0xf8, 0xfb, 0x99, 0x9f, 0x3d, 0xcf, 0xc1, 0x8c, 0xd7, + 0xdd, 0x3b, 0xbf, 0xff, 0x27, 0x00, 0x00, 0xff, 0xff, 0x28, 0x53, 0xb5, 0x35, 0x96, 0x03, 0x00, 0x00, } diff --git a/x/erc20/client/cli/query.go b/x/erc20/client/cli/query.go index 5f2004e5d8..8b717b35f9 100644 --- a/x/erc20/client/cli/query.go +++ b/x/erc20/client/cli/query.go @@ -10,7 +10,7 @@ import ( "github.com/cosmos/cosmos-sdk/client/flags" "github.com/spf13/cobra" - "github.com/evmos/evmos/v16/x/erc20/types" + "github.com/evmos/evmos/v17/x/erc20/types" ) // GetQueryCmd returns the parent command for all erc20 CLI query commands diff --git a/x/erc20/client/cli/tx.go b/x/erc20/client/cli/tx.go index c36a0e4423..89762c24ae 100644 --- a/x/erc20/client/cli/tx.go +++ b/x/erc20/client/cli/tx.go @@ -19,9 +19,9 @@ import ( "github.com/ethereum/go-ethereum/common" - evmostypes "github.com/evmos/evmos/v16/types" + evmostypes "github.com/evmos/evmos/v17/types" - "github.com/evmos/evmos/v16/x/erc20/types" + "github.com/evmos/evmos/v17/x/erc20/types" ) // NewTxCmd returns a root CLI command handler for erc20 transaction commands diff --git a/x/erc20/client/proposal_handler.go b/x/erc20/client/proposal_handler.go index c0927da26e..d7d8fe2dad 100644 --- a/x/erc20/client/proposal_handler.go +++ b/x/erc20/client/proposal_handler.go @@ -6,7 +6,7 @@ package client import ( govclient "github.com/cosmos/cosmos-sdk/x/gov/client" - "github.com/evmos/evmos/v16/x/erc20/client/cli" + "github.com/evmos/evmos/v17/x/erc20/client/cli" ) var ( diff --git a/x/erc20/genesis.go b/x/erc20/genesis.go index 3d5682ef9f..eecfac02ed 100644 --- a/x/erc20/genesis.go +++ b/x/erc20/genesis.go @@ -9,8 +9,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" - "github.com/evmos/evmos/v16/x/erc20/keeper" - "github.com/evmos/evmos/v16/x/erc20/types" + "github.com/evmos/evmos/v17/x/erc20/keeper" + "github.com/evmos/evmos/v17/x/erc20/types" ) // InitGenesis import module genesis diff --git a/x/erc20/genesis_test.go b/x/erc20/genesis_test.go index 47244f5ed9..f33b4bf1ec 100644 --- a/x/erc20/genesis_test.go +++ b/x/erc20/genesis_test.go @@ -15,13 +15,13 @@ import ( transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/utils" - feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v17/utils" + feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/x/erc20" - "github.com/evmos/evmos/v16/x/erc20/types" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/x/erc20" + "github.com/evmos/evmos/v17/x/erc20/types" ) type GenesisTestSuite struct { diff --git a/x/erc20/ibc_middleware.go b/x/erc20/ibc_middleware.go index 248854487d..afb43f4cb9 100644 --- a/x/erc20/ibc_middleware.go +++ b/x/erc20/ibc_middleware.go @@ -13,8 +13,8 @@ import ( "github.com/cosmos/ibc-go/v7/modules/core/exported" errortypes "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/evmos/evmos/v16/ibc" - "github.com/evmos/evmos/v16/x/erc20/keeper" + "github.com/evmos/evmos/v17/ibc" + "github.com/evmos/evmos/v17/x/erc20/keeper" ) var _ porttypes.IBCModule = &IBCMiddleware{} diff --git a/x/erc20/keeper/erc20_utils_test.go b/x/erc20/keeper/erc20_utils_test.go index 411d738db2..483f20eaef 100644 --- a/x/erc20/keeper/erc20_utils_test.go +++ b/x/erc20/keeper/erc20_utils_test.go @@ -6,9 +6,9 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v16/contracts" - "github.com/evmos/evmos/v16/x/erc20/types" - evm "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/contracts" + "github.com/evmos/evmos/v17/x/erc20/types" + evm "github.com/evmos/evmos/v17/x/evm/types" ) func (suite *KeeperTestSuite) MintERC20Token(contractAddr, from, to common.Address, amount *big.Int) *evm.MsgEthereumTx { diff --git a/x/erc20/keeper/evm.go b/x/erc20/keeper/evm.go index 2b73b15c7b..b9370ecea5 100644 --- a/x/erc20/keeper/evm.go +++ b/x/erc20/keeper/evm.go @@ -16,11 +16,11 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v16/server/config" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/server/config" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" - "github.com/evmos/evmos/v16/contracts" - "github.com/evmos/evmos/v16/x/erc20/types" + "github.com/evmos/evmos/v17/contracts" + "github.com/evmos/evmos/v17/x/erc20/types" ) // DeployERC20Contract creates and deploys an ERC20 contract on the EVM with the diff --git a/x/erc20/keeper/evm_test.go b/x/erc20/keeper/evm_test.go index c56721cabf..a337b7924b 100644 --- a/x/erc20/keeper/evm_test.go +++ b/x/erc20/keeper/evm_test.go @@ -7,14 +7,14 @@ import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/ethereum/go-ethereum/common" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" "github.com/stretchr/testify/mock" - "github.com/evmos/evmos/v16/contracts" - "github.com/evmos/evmos/v16/x/erc20/keeper" - "github.com/evmos/evmos/v16/x/erc20/types" - erc20mocks "github.com/evmos/evmos/v16/x/erc20/types/mocks" + "github.com/evmos/evmos/v17/contracts" + "github.com/evmos/evmos/v17/x/erc20/keeper" + "github.com/evmos/evmos/v17/x/erc20/types" + erc20mocks "github.com/evmos/evmos/v17/x/erc20/types/mocks" ) func (suite *KeeperTestSuite) TestQueryERC20() { diff --git a/x/erc20/keeper/grpc_query.go b/x/erc20/keeper/grpc_query.go index 37690c8875..b659be99bf 100644 --- a/x/erc20/keeper/grpc_query.go +++ b/x/erc20/keeper/grpc_query.go @@ -12,9 +12,9 @@ import ( "github.com/cosmos/cosmos-sdk/store/prefix" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/query" - evmostypes "github.com/evmos/evmos/v16/types" + evmostypes "github.com/evmos/evmos/v17/types" - "github.com/evmos/evmos/v16/x/erc20/types" + "github.com/evmos/evmos/v17/x/erc20/types" ) var _ types.QueryServer = Keeper{} diff --git a/x/erc20/keeper/grpc_query_test.go b/x/erc20/keeper/grpc_query_test.go index 9f360a4ea8..d1a1dc641d 100644 --- a/x/erc20/keeper/grpc_query_test.go +++ b/x/erc20/keeper/grpc_query_test.go @@ -6,8 +6,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/query" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/x/erc20/types" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v17/x/erc20/types" ) func (suite *KeeperTestSuite) TestTokenPairs() { diff --git a/x/erc20/keeper/ibc_callbacks.go b/x/erc20/keeper/ibc_callbacks.go index bbea1ac420..fec1e47f40 100644 --- a/x/erc20/keeper/ibc_callbacks.go +++ b/x/erc20/keeper/ibc_callbacks.go @@ -16,8 +16,8 @@ import ( "github.com/cosmos/ibc-go/v7/modules/core/exported" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/ibc" - "github.com/evmos/evmos/v16/x/erc20/types" + "github.com/evmos/evmos/v17/ibc" + "github.com/evmos/evmos/v17/x/erc20/types" ) // OnRecvPacket performs the ICS20 middleware receive callback for automatically diff --git a/x/erc20/keeper/ibc_callbacks_integration_test.go b/x/erc20/keeper/ibc_callbacks_integration_test.go index 47611f4323..a30e264844 100644 --- a/x/erc20/keeper/ibc_callbacks_integration_test.go +++ b/x/erc20/keeper/ibc_callbacks_integration_test.go @@ -11,12 +11,12 @@ import ( transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/contracts" - ibctesting "github.com/evmos/evmos/v16/ibc/testing" - teststypes "github.com/evmos/evmos/v16/types/tests" - "github.com/evmos/evmos/v16/utils" - "github.com/evmos/evmos/v16/x/erc20/types" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/contracts" + ibctesting "github.com/evmos/evmos/v17/ibc/testing" + teststypes "github.com/evmos/evmos/v17/types/tests" + "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v17/x/erc20/types" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" diff --git a/x/erc20/keeper/ibc_callbacks_test.go b/x/erc20/keeper/ibc_callbacks_test.go index d0c3c073e0..e1d50dbf61 100644 --- a/x/erc20/keeper/ibc_callbacks_test.go +++ b/x/erc20/keeper/ibc_callbacks_test.go @@ -6,8 +6,8 @@ import ( "math/big" "cosmossdk.io/math" - "github.com/evmos/evmos/v16/utils" - "github.com/evmos/evmos/v16/x/erc20/keeper" + "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v17/x/erc20/keeper" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" @@ -16,8 +16,8 @@ import ( "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" - "github.com/evmos/evmos/v16/testutil" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + "github.com/evmos/evmos/v17/testutil" transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" @@ -25,11 +25,11 @@ import ( ibcgotesting "github.com/cosmos/ibc-go/v7/testing" ibcmock "github.com/cosmos/ibc-go/v7/testing/mock" - "github.com/evmos/evmos/v16/contracts" - "github.com/evmos/evmos/v16/x/erc20/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - inflationtypes "github.com/evmos/evmos/v16/x/inflation/v1/types" - vestingtypes "github.com/evmos/evmos/v16/x/vesting/types" + "github.com/evmos/evmos/v17/contracts" + "github.com/evmos/evmos/v17/x/erc20/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" + inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" + vestingtypes "github.com/evmos/evmos/v17/x/vesting/types" ) var erc20Denom = "erc20/0xdac17f958d2ee523a2206206994597c13d831ec7" diff --git a/x/erc20/keeper/integration_test.go b/x/erc20/keeper/integration_test.go index b658d56b12..b6da30eb98 100644 --- a/x/erc20/keeper/integration_test.go +++ b/x/erc20/keeper/integration_test.go @@ -16,12 +16,12 @@ import ( govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" - "github.com/evmos/evmos/v16/utils" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + "github.com/evmos/evmos/v17/utils" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/testutil" - "github.com/evmos/evmos/v16/x/erc20/types" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/testutil" + "github.com/evmos/evmos/v17/x/erc20/types" ) var _ = Describe("Performing EVM transactions", Ordered, func() { diff --git a/x/erc20/keeper/keeper.go b/x/erc20/keeper/keeper.go index 7035d3b994..19fadeaf3e 100644 --- a/x/erc20/keeper/keeper.go +++ b/x/erc20/keeper/keeper.go @@ -12,9 +12,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - transferkeeper "github.com/evmos/evmos/v16/x/ibc/transfer/keeper" + transferkeeper "github.com/evmos/evmos/v17/x/ibc/transfer/keeper" - "github.com/evmos/evmos/v16/x/erc20/types" + "github.com/evmos/evmos/v17/x/erc20/types" ) // Keeper of this module maintains collections of erc20. diff --git a/x/erc20/keeper/migrations.go b/x/erc20/keeper/migrations.go index 92041659ba..e08cde0259 100644 --- a/x/erc20/keeper/migrations.go +++ b/x/erc20/keeper/migrations.go @@ -6,8 +6,8 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" - v3 "github.com/evmos/evmos/v16/x/erc20/migrations/v3" - "github.com/evmos/evmos/v16/x/erc20/types" + v3 "github.com/evmos/evmos/v17/x/erc20/migrations/v3" + "github.com/evmos/evmos/v17/x/erc20/types" ) var _ module.MigrationHandler = Migrator{}.Migrate2to3 diff --git a/x/erc20/keeper/migrations_test.go b/x/erc20/keeper/migrations_test.go index ee1e34a61f..ccc18c5e8a 100644 --- a/x/erc20/keeper/migrations_test.go +++ b/x/erc20/keeper/migrations_test.go @@ -7,11 +7,11 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/encoding" - erc20keeper "github.com/evmos/evmos/v16/x/erc20/keeper" - v3types "github.com/evmos/evmos/v16/x/erc20/migrations/v3/types" - "github.com/evmos/evmos/v16/x/erc20/types" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/encoding" + erc20keeper "github.com/evmos/evmos/v17/x/erc20/keeper" + v3types "github.com/evmos/evmos/v17/x/erc20/migrations/v3/types" + "github.com/evmos/evmos/v17/x/erc20/types" ) type mockSubspace struct { diff --git a/x/erc20/keeper/mint.go b/x/erc20/keeper/mint.go index 6e02927ad9..220d026183 100644 --- a/x/erc20/keeper/mint.go +++ b/x/erc20/keeper/mint.go @@ -9,7 +9,7 @@ import ( errortypes "github.com/cosmos/cosmos-sdk/types/errors" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/evmos/evmos/v16/x/erc20/types" + "github.com/evmos/evmos/v17/x/erc20/types" ) // MintingEnabled checks that: diff --git a/x/erc20/keeper/mint_test.go b/x/erc20/keeper/mint_test.go index f2cf65ae88..fc86a9176c 100644 --- a/x/erc20/keeper/mint_test.go +++ b/x/erc20/keeper/mint_test.go @@ -6,8 +6,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/x/erc20/types" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v17/x/erc20/types" ) func (suite *KeeperTestSuite) TestMintingEnabled() { diff --git a/x/erc20/keeper/msg_server.go b/x/erc20/keeper/msg_server.go index 86c23626e9..9efd1fb7e6 100644 --- a/x/erc20/keeper/msg_server.go +++ b/x/erc20/keeper/msg_server.go @@ -15,8 +15,8 @@ import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/contracts" - "github.com/evmos/evmos/v16/x/erc20/types" + "github.com/evmos/evmos/v17/contracts" + "github.com/evmos/evmos/v17/x/erc20/types" ) var _ types.MsgServer = &Keeper{} diff --git a/x/erc20/keeper/msg_server_test.go b/x/erc20/keeper/msg_server_test.go index 7884de3fd7..c00a28132d 100644 --- a/x/erc20/keeper/msg_server_test.go +++ b/x/erc20/keeper/msg_server_test.go @@ -9,11 +9,11 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/x/erc20/keeper" - "github.com/evmos/evmos/v16/x/erc20/types" - erc20mocks "github.com/evmos/evmos/v16/x/erc20/types/mocks" - "github.com/evmos/evmos/v16/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/x/erc20/keeper" + "github.com/evmos/evmos/v17/x/erc20/types" + erc20mocks "github.com/evmos/evmos/v17/x/erc20/types/mocks" + "github.com/evmos/evmos/v17/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" "github.com/stretchr/testify/mock" ) diff --git a/x/erc20/keeper/params.go b/x/erc20/keeper/params.go index 9e4cb920df..4b7d83c654 100644 --- a/x/erc20/keeper/params.go +++ b/x/erc20/keeper/params.go @@ -5,7 +5,7 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/x/erc20/types" + "github.com/evmos/evmos/v17/x/erc20/types" ) var isTrue = []byte("0x01") diff --git a/x/erc20/keeper/params_test.go b/x/erc20/keeper/params_test.go index a71fa45069..290c987970 100644 --- a/x/erc20/keeper/params_test.go +++ b/x/erc20/keeper/params_test.go @@ -3,7 +3,7 @@ package keeper_test import ( "reflect" - "github.com/evmos/evmos/v16/x/erc20/types" + "github.com/evmos/evmos/v17/x/erc20/types" ) func (suite *KeeperTestSuite) TestParams() { diff --git a/x/erc20/keeper/precompiles.go b/x/erc20/keeper/precompiles.go index 3b4429ee98..57d75041b2 100644 --- a/x/erc20/keeper/precompiles.go +++ b/x/erc20/keeper/precompiles.go @@ -7,9 +7,9 @@ import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v16/precompiles/erc20" - "github.com/evmos/evmos/v16/precompiles/werc20" - "github.com/evmos/evmos/v16/x/erc20/types" + "github.com/evmos/evmos/v17/precompiles/erc20" + "github.com/evmos/evmos/v17/precompiles/werc20" + "github.com/evmos/evmos/v17/x/erc20/types" ) // RegisterERC20Extensions registers the ERC20 precompiles with the EVM. diff --git a/x/erc20/keeper/precompiles_test.go b/x/erc20/keeper/precompiles_test.go index d2e3c42471..dd260f8584 100644 --- a/x/erc20/keeper/precompiles_test.go +++ b/x/erc20/keeper/precompiles_test.go @@ -6,11 +6,11 @@ package keeper_test import ( "slices" - erc20precompile "github.com/evmos/evmos/v16/precompiles/erc20" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/utils" - "github.com/evmos/evmos/v16/x/erc20/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + erc20precompile "github.com/evmos/evmos/v17/precompiles/erc20" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v17/x/erc20/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) func (suite *KeeperTestSuite) TestRegisterERC20Extensions() { diff --git a/x/erc20/keeper/proposals.go b/x/erc20/keeper/proposals.go index 63886510c7..048b6908ba 100644 --- a/x/erc20/keeper/proposals.go +++ b/x/erc20/keeper/proposals.go @@ -10,7 +10,7 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/x/erc20/types" + "github.com/evmos/evmos/v17/x/erc20/types" ) // RegisterCoin deploys an erc20 contract and creates the token pair for the diff --git a/x/erc20/keeper/proposals_test.go b/x/erc20/keeper/proposals_test.go index 57e9a6ed68..690941ab83 100644 --- a/x/erc20/keeper/proposals_test.go +++ b/x/erc20/keeper/proposals_test.go @@ -8,11 +8,11 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/x/erc20/keeper" - "github.com/evmos/evmos/v16/x/erc20/types" - erc20mocks "github.com/evmos/evmos/v16/x/erc20/types/mocks" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - inflationtypes "github.com/evmos/evmos/v16/x/inflation/v1/types" + "github.com/evmos/evmos/v17/x/erc20/keeper" + "github.com/evmos/evmos/v17/x/erc20/types" + erc20mocks "github.com/evmos/evmos/v17/x/erc20/types/mocks" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" + inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" "github.com/stretchr/testify/mock" ) diff --git a/x/erc20/keeper/setup_test.go b/x/erc20/keeper/setup_test.go index 41e051e520..ce41e05a00 100644 --- a/x/erc20/keeper/setup_test.go +++ b/x/erc20/keeper/setup_test.go @@ -17,10 +17,10 @@ import ( ibcgotesting "github.com/cosmos/ibc-go/v7/testing" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v16/app" - ibctesting "github.com/evmos/evmos/v16/ibc/testing" - "github.com/evmos/evmos/v16/x/erc20/types" - evm "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/app" + ibctesting "github.com/evmos/evmos/v17/ibc/testing" + "github.com/evmos/evmos/v17/x/erc20/types" + evm "github.com/evmos/evmos/v17/x/evm/types" "github.com/stretchr/testify/suite" ) diff --git a/x/erc20/keeper/token_pairs.go b/x/erc20/keeper/token_pairs.go index 7cfe812035..fecee0d02d 100644 --- a/x/erc20/keeper/token_pairs.go +++ b/x/erc20/keeper/token_pairs.go @@ -9,8 +9,8 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/utils" - "github.com/evmos/evmos/v16/x/erc20/types" + "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v17/x/erc20/types" ) // GetTokenPairs gets all registered token tokenPairs. diff --git a/x/erc20/keeper/token_pairs_test.go b/x/erc20/keeper/token_pairs_test.go index 20240ab364..e941cfe51e 100644 --- a/x/erc20/keeper/token_pairs_test.go +++ b/x/erc20/keeper/token_pairs_test.go @@ -4,9 +4,9 @@ import ( "fmt" "github.com/ethereum/go-ethereum/common" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/x/erc20/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v17/x/erc20/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) func (suite *KeeperTestSuite) TestGetTokenPairs() { diff --git a/x/erc20/keeper/utils_test.go b/x/erc20/keeper/utils_test.go index c73bc89aa3..b07e3d5c35 100644 --- a/x/erc20/keeper/utils_test.go +++ b/x/erc20/keeper/utils_test.go @@ -21,20 +21,20 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/contracts" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" - ibctesting "github.com/evmos/evmos/v16/ibc/testing" - "github.com/evmos/evmos/v16/server/config" - "github.com/evmos/evmos/v16/testutil" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - teststypes "github.com/evmos/evmos/v16/types/tests" - "github.com/evmos/evmos/v16/utils" - "github.com/evmos/evmos/v16/x/erc20/types" - "github.com/evmos/evmos/v16/x/evm/statedb" - evm "github.com/evmos/evmos/v16/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" - inflationtypes "github.com/evmos/evmos/v16/x/inflation/v1/types" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/contracts" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + ibctesting "github.com/evmos/evmos/v17/ibc/testing" + "github.com/evmos/evmos/v17/server/config" + "github.com/evmos/evmos/v17/testutil" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + teststypes "github.com/evmos/evmos/v17/types/tests" + "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v17/x/erc20/types" + "github.com/evmos/evmos/v17/x/evm/statedb" + evm "github.com/evmos/evmos/v17/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" + inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" "github.com/stretchr/testify/require" ) diff --git a/x/erc20/migrations/v3/migration.go b/x/erc20/migrations/v3/migration.go index 79f4802fa5..032ace10a9 100644 --- a/x/erc20/migrations/v3/migration.go +++ b/x/erc20/migrations/v3/migration.go @@ -6,8 +6,8 @@ package v3 import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - v3types "github.com/evmos/evmos/v16/x/erc20/migrations/v3/types" - "github.com/evmos/evmos/v16/x/erc20/types" + v3types "github.com/evmos/evmos/v17/x/erc20/migrations/v3/types" + "github.com/evmos/evmos/v17/x/erc20/types" ) var isTrue = []byte{0x01} diff --git a/x/erc20/migrations/v3/migration_test.go b/x/erc20/migrations/v3/migration_test.go index 9582ae4050..1a279aec8f 100644 --- a/x/erc20/migrations/v3/migration_test.go +++ b/x/erc20/migrations/v3/migration_test.go @@ -5,17 +5,17 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/encoding" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/encoding" - v3types "github.com/evmos/evmos/v16/x/erc20/migrations/v3/types" + v3types "github.com/evmos/evmos/v17/x/erc20/migrations/v3/types" - "github.com/evmos/evmos/v16/x/erc20/types" + "github.com/evmos/evmos/v17/x/erc20/types" "github.com/stretchr/testify/require" "github.com/cosmos/cosmos-sdk/testutil" sdk "github.com/cosmos/cosmos-sdk/types" - v3 "github.com/evmos/evmos/v16/x/erc20/migrations/v3" + v3 "github.com/evmos/evmos/v17/x/erc20/migrations/v3" ) type mockSubspace struct { diff --git a/x/erc20/migrations/v3/types/genesis.pb.go b/x/erc20/migrations/v3/types/genesis.pb.go index 5ffed62a73..2ea05adc5e 100644 --- a/x/erc20/migrations/v3/types/genesis.pb.go +++ b/x/erc20/migrations/v3/types/genesis.pb.go @@ -11,7 +11,7 @@ import ( _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" - "github.com/evmos/evmos/v16/x/erc20/types" + "github.com/evmos/evmos/v17/x/erc20/types" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/erc20/migrations/v3/types/params.go b/x/erc20/migrations/v3/types/params.go index e7d4547dc2..45836cf12e 100644 --- a/x/erc20/migrations/v3/types/params.go +++ b/x/erc20/migrations/v3/types/params.go @@ -7,7 +7,7 @@ import ( "fmt" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - "github.com/evmos/evmos/v16/x/erc20/types" + "github.com/evmos/evmos/v17/x/erc20/types" ) var _ types.LegacyParams = &V3Params{} diff --git a/x/erc20/module.go b/x/erc20/module.go index 6225eda5a5..002e6a5302 100644 --- a/x/erc20/module.go +++ b/x/erc20/module.go @@ -20,9 +20,9 @@ import ( "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" - "github.com/evmos/evmos/v16/x/erc20/client/cli" - "github.com/evmos/evmos/v16/x/erc20/keeper" - "github.com/evmos/evmos/v16/x/erc20/types" + "github.com/evmos/evmos/v17/x/erc20/client/cli" + "github.com/evmos/evmos/v17/x/erc20/keeper" + "github.com/evmos/evmos/v17/x/erc20/types" ) // consensusVersion defines the current x/erc20 module consensus version. diff --git a/x/erc20/proposal_handler.go b/x/erc20/proposal_handler.go index 64110939a7..f772343c2d 100644 --- a/x/erc20/proposal_handler.go +++ b/x/erc20/proposal_handler.go @@ -10,8 +10,8 @@ import ( govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/x/erc20/keeper" - "github.com/evmos/evmos/v16/x/erc20/types" + "github.com/evmos/evmos/v17/x/erc20/keeper" + "github.com/evmos/evmos/v17/x/erc20/types" ) // NewErc20ProposalHandler creates a governance handler to manage new proposal types. diff --git a/x/erc20/types/erc20.pb.go b/x/erc20/types/erc20.pb.go index 10e106b035..4e545e8e06 100644 --- a/x/erc20/types/erc20.pb.go +++ b/x/erc20/types/erc20.pb.go @@ -390,7 +390,7 @@ var fileDescriptor_668d5dc537f45142 = []byte{ // 506 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x53, 0xcf, 0x6b, 0xd4, 0x40, 0x14, 0xce, 0x74, 0xb7, 0xda, 0x9d, 0xb6, 0x21, 0x0e, 0xbb, 0x10, 0x16, 0x9a, 0x86, 0x15, 0x24, - 0x78, 0x48, 0x9a, 0x15, 0x3c, 0x88, 0x20, 0xdd, 0x6d, 0x84, 0x4a, 0xbb, 0xbb, 0xa4, 0x5b, 0x14, + 0x78, 0x48, 0x9a, 0xf5, 0x20, 0x88, 0x20, 0xdd, 0x6d, 0x84, 0x4a, 0xbb, 0xbb, 0xa4, 0x5b, 0x14, 0x2f, 0xcb, 0x24, 0x19, 0x62, 0xe8, 0x6e, 0x66, 0x99, 0x19, 0xa3, 0x1e, 0xbc, 0x7b, 0xf4, 0xe2, 0x5d, 0xd0, 0x3f, 0xa6, 0xc7, 0x1e, 0x3d, 0x89, 0xec, 0x5e, 0xfc, 0x33, 0x24, 0x33, 0x89, 0x58, 0x8f, 0xed, 0x65, 0x78, 0xdf, 0xf7, 0x7e, 0xf0, 0xde, 0xf7, 0xe6, 0xc1, 0x2e, 0x29, 0x16, 0x94, @@ -419,7 +419,7 @@ var fileDescriptor_668d5dc537f45142 = []byte{ 0x5f, 0x2b, 0x0b, 0x7c, 0x5e, 0x5b, 0xda, 0xd5, 0xda, 0xd2, 0x7e, 0xac, 0x2d, 0xed, 0xb5, 0x93, 0x66, 0xe2, 0xcd, 0xdb, 0xc8, 0x8d, 0xe9, 0xc2, 0xab, 0x4e, 0x4b, 0xbe, 0x85, 0xff, 0xd8, 0x7b, 0x5f, 0x9d, 0x99, 0xf8, 0xb0, 0x24, 0x3c, 0xba, 0x23, 0xcf, 0xe3, 0xd1, 0x9f, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x45, 0x20, 0x88, 0xdc, 0x82, 0x03, 0x00, 0x00, + 0xff, 0xff, 0x91, 0xca, 0xfb, 0x47, 0x82, 0x03, 0x00, 0x00, } func (this *TokenPair) Equal(that interface{}) bool { diff --git a/x/erc20/types/events.pb.go b/x/erc20/types/events.pb.go index 4029909d7d..bb1211ae4a 100644 --- a/x/erc20/types/events.pb.go +++ b/x/erc20/types/events.pb.go @@ -307,26 +307,26 @@ func init() { proto.RegisterFile("evmos/erc20/v1/events.proto", fileDescriptor_b var fileDescriptor_b8091384ab031e64 = []byte{ // 311 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x92, 0xcf, 0x4b, 0xc3, 0x30, - 0x14, 0xc7, 0x17, 0x75, 0x43, 0x83, 0x3f, 0x66, 0x11, 0x19, 0x13, 0x82, 0xcc, 0xcb, 0xbc, 0xb4, - 0xeb, 0x04, 0xef, 0xae, 0xec, 0x2a, 0x52, 0x06, 0x82, 0x17, 0xe9, 0xda, 0x47, 0x0d, 0xda, 0xbc, - 0x91, 0x64, 0x41, 0xff, 0x0b, 0xaf, 0xde, 0xfc, 0x73, 0x3c, 0xee, 0xe8, 0x51, 0xda, 0x7f, 0x44, - 0x96, 0x46, 0x05, 0x11, 0x2f, 0x82, 0x97, 0xc0, 0xf7, 0x7d, 0x79, 0x1f, 0x3e, 0x84, 0x47, 0x0f, - 0xc0, 0x14, 0xa8, 0x02, 0x90, 0xe9, 0x70, 0x10, 0x98, 0x30, 0x00, 0x03, 0x42, 0x2b, 0x7f, 0x26, - 0x51, 0xa3, 0xb7, 0x6d, 0x4b, 0xdf, 0x96, 0xbe, 0x09, 0x7b, 0xe7, 0x74, 0x77, 0xbc, 0xec, 0x63, - 0xc8, 0xb9, 0xd2, 0x20, 0x2f, 0x12, 0x2e, 0xbd, 0x3d, 0xda, 0xcc, 0x40, 0x60, 0xd1, 0x21, 0x87, - 0xa4, 0xbf, 0x11, 0xd7, 0xc1, 0x3b, 0xa2, 0x5b, 0x76, 0xed, 0x3a, 0xc9, 0x32, 0x09, 0x4a, 0x75, - 0x56, 0x6c, 0xbb, 0x69, 0x87, 0x67, 0xf5, 0xac, 0x77, 0x49, 0xbb, 0x96, 0x37, 0xc1, 0x3c, 0xbf, - 0x83, 0x09, 0xde, 0x82, 0x88, 0x50, 0x18, 0x90, 0x8a, 0xa3, 0xf8, 0x0b, 0xf8, 0x89, 0xd0, 0xb6, - 0x25, 0xd7, 0x38, 0x1d, 0x21, 0x17, 0xde, 0x3e, 0x6d, 0x29, 0x10, 0x19, 0x48, 0x07, 0x74, 0xc9, - 0xeb, 0xd2, 0x75, 0x09, 0x29, 0x70, 0x03, 0xd2, 0xc1, 0x3e, 0xf3, 0x72, 0x27, 0x29, 0x70, 0x2e, - 0x74, 0x67, 0xb5, 0xde, 0xa9, 0xd3, 0x97, 0xdb, 0xda, 0xaf, 0x6e, 0xcd, 0x1f, 0xdc, 0x9e, 0x89, - 0xfb, 0x45, 0xe7, 0x36, 0x8e, 0xa3, 0xe1, 0xe0, 0x1f, 0xe4, 0x8e, 0x69, 0x3b, 0x45, 0xa1, 0x65, - 0x92, 0xea, 0x6f, 0x7e, 0x3b, 0x1f, 0x73, 0xa7, 0x38, 0x1a, 0xbd, 0x94, 0x8c, 0x2c, 0x4a, 0x46, - 0xde, 0x4a, 0x46, 0x1e, 0x2b, 0xd6, 0x58, 0x54, 0xac, 0xf1, 0x5a, 0xb1, 0xc6, 0x55, 0x3f, 0xe7, - 0xfa, 0x66, 0x3e, 0xf5, 0x53, 0x2c, 0x02, 0x77, 0x39, 0xf6, 0x35, 0xe1, 0x69, 0x70, 0xef, 0xae, - 0x48, 0x3f, 0xcc, 0x40, 0x4d, 0x5b, 0xf6, 0x84, 0x4e, 0xde, 0x03, 0x00, 0x00, 0xff, 0xff, 0x7c, - 0xf0, 0x61, 0x7a, 0x61, 0x02, 0x00, 0x00, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x92, 0xbf, 0x4b, 0xc3, 0x40, + 0x14, 0xc7, 0x7b, 0x6a, 0x8b, 0x1e, 0xfe, 0xa8, 0x41, 0xa4, 0x54, 0x38, 0xa4, 0x2e, 0x75, 0x49, + 0x9a, 0x3a, 0x38, 0xdb, 0xd0, 0x55, 0x24, 0x14, 0x04, 0x17, 0x49, 0x93, 0x47, 0x3c, 0x34, 0xf7, + 0xca, 0xdd, 0xf5, 0xd0, 0xff, 0xc2, 0xd5, 0xcd, 0x3f, 0xc7, 0xb1, 0xa3, 0xa3, 0x24, 0xff, 0x88, + 0xf4, 0x72, 0x2a, 0x88, 0xb8, 0x08, 0x2e, 0x07, 0xdf, 0xf7, 0xe5, 0x7d, 0xf8, 0x70, 0x3c, 0x7a, + 0x00, 0xa6, 0x40, 0x15, 0x80, 0x4c, 0x87, 0x83, 0xc0, 0x84, 0x01, 0x18, 0x10, 0x5a, 0xf9, 0x33, + 0x89, 0x1a, 0xbd, 0x6d, 0x5b, 0xfa, 0xb6, 0xf4, 0x4d, 0xd8, 0x3b, 0xa7, 0xbb, 0xe3, 0x65, 0x1f, + 0x43, 0xce, 0x95, 0x06, 0x79, 0x91, 0x70, 0xe9, 0xed, 0xd1, 0x66, 0x06, 0x02, 0x8b, 0x0e, 0x39, + 0x24, 0xfd, 0x8d, 0xb8, 0x0e, 0xde, 0x11, 0xdd, 0xb2, 0x6b, 0xd7, 0x49, 0x96, 0x49, 0x50, 0xaa, + 0xb3, 0x62, 0xdb, 0x4d, 0x3b, 0x3c, 0xab, 0x67, 0xbd, 0x4b, 0xda, 0xb5, 0xbc, 0x09, 0xe6, 0xf9, + 0x1d, 0x4c, 0xf0, 0x16, 0x44, 0x84, 0xc2, 0x80, 0x54, 0x1c, 0xc5, 0x5f, 0xc0, 0x4f, 0x84, 0xb6, + 0x2d, 0xb9, 0xc6, 0xe9, 0x08, 0xb9, 0xf0, 0xf6, 0x69, 0x4b, 0x81, 0xc8, 0x40, 0x3a, 0xa0, 0x4b, + 0x5e, 0x97, 0xae, 0x4b, 0x48, 0x81, 0x1b, 0x90, 0x0e, 0xf6, 0x99, 0x97, 0x3b, 0x49, 0x81, 0x73, + 0xa1, 0x3b, 0xab, 0xf5, 0x4e, 0x9d, 0xbe, 0xdc, 0xd6, 0x7e, 0x75, 0x6b, 0xfe, 0xe0, 0xf6, 0x4c, + 0xdc, 0x2f, 0x3a, 0xb7, 0x71, 0x1c, 0x0d, 0x07, 0xff, 0x20, 0x77, 0x4c, 0xdb, 0x29, 0x0a, 0x2d, + 0x93, 0x54, 0x7f, 0xf3, 0xdb, 0xf9, 0x98, 0x3b, 0xc5, 0xd1, 0xe8, 0xa5, 0x64, 0x64, 0x51, 0x32, + 0xf2, 0x56, 0x32, 0xf2, 0x58, 0xb1, 0xc6, 0xa2, 0x62, 0x8d, 0xd7, 0x8a, 0x35, 0xae, 0xfa, 0x39, + 0xd7, 0x37, 0xf3, 0xa9, 0x9f, 0x62, 0x11, 0xb8, 0xcb, 0xb1, 0xaf, 0x09, 0x4f, 0x83, 0x7b, 0x77, + 0x45, 0xfa, 0x61, 0x06, 0x6a, 0xda, 0xb2, 0x27, 0x74, 0xf2, 0x1e, 0x00, 0x00, 0xff, 0xff, 0xa8, + 0x1a, 0x12, 0xe1, 0x61, 0x02, 0x00, 0x00, } func (m *EventRegisterPair) Marshal() (dAtA []byte, err error) { diff --git a/x/erc20/types/evm_test.go b/x/erc20/types/evm_test.go index a5f9620048..f8f38419ca 100644 --- a/x/erc20/types/evm_test.go +++ b/x/erc20/types/evm_test.go @@ -3,7 +3,7 @@ package types_test import ( "testing" - "github.com/evmos/evmos/v16/x/erc20/types" + "github.com/evmos/evmos/v17/x/erc20/types" "github.com/stretchr/testify/require" ) diff --git a/x/erc20/types/genesis.pb.go b/x/erc20/types/genesis.pb.go index ebc3435665..93f4160b09 100644 --- a/x/erc20/types/genesis.pb.go +++ b/x/erc20/types/genesis.pb.go @@ -160,8 +160,8 @@ var fileDescriptor_2f4674601b0d6987 = []byte{ 0x05, 0x71, 0x9d, 0x9c, 0x4e, 0x3c, 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, 0x39, 0xc6, 0x09, 0x8f, 0xe5, 0x18, 0x2e, 0x3c, 0x96, 0x63, 0xb8, 0xf1, 0x58, 0x8e, 0x21, 0x4a, 0x23, 0x3d, 0xb3, 0x24, 0xa3, 0x34, 0x49, 0x2f, 0x39, 0x3f, 0x57, 0x1f, 0x1a, 0x8e, 0x60, 0xb2, 0xcc, - 0xd0, 0x4c, 0xbf, 0x02, 0x1a, 0xa6, 0x25, 0x95, 0x05, 0xa9, 0xc5, 0x49, 0x6c, 0xe0, 0xb0, 0x33, - 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0xb2, 0xb7, 0x98, 0x63, 0x9d, 0x01, 0x00, 0x00, + 0xd0, 0x5c, 0xbf, 0x02, 0x1a, 0xa6, 0x25, 0x95, 0x05, 0xa9, 0xc5, 0x49, 0x6c, 0xe0, 0xb0, 0x33, + 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x66, 0x5d, 0xeb, 0xf8, 0x9d, 0x01, 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { diff --git a/x/erc20/types/genesis_test.go b/x/erc20/types/genesis_test.go index 3bcabe3f85..2f4eb6e808 100644 --- a/x/erc20/types/genesis_test.go +++ b/x/erc20/types/genesis_test.go @@ -3,7 +3,7 @@ package types_test import ( "testing" - "github.com/evmos/evmos/v16/x/erc20/types" + "github.com/evmos/evmos/v17/x/erc20/types" "github.com/stretchr/testify/suite" ) diff --git a/x/erc20/types/interfaces.go b/x/erc20/types/interfaces.go index 159e3d6afa..dd050aa78b 100644 --- a/x/erc20/types/interfaces.go +++ b/x/erc20/types/interfaces.go @@ -15,8 +15,8 @@ import ( "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v16/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) // AccountKeeper defines the expected interface needed to retrieve account info. diff --git a/x/erc20/types/mocks/EVMKeeper.go b/x/erc20/types/mocks/EVMKeeper.go index 45c3193181..3d53765366 100644 --- a/x/erc20/types/mocks/EVMKeeper.go +++ b/x/erc20/types/mocks/EVMKeeper.go @@ -9,11 +9,11 @@ import ( core "github.com/ethereum/go-ethereum/core" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" mock "github.com/stretchr/testify/mock" - statedb "github.com/evmos/evmos/v16/x/evm/statedb" + statedb "github.com/evmos/evmos/v17/x/evm/statedb" types "github.com/cosmos/cosmos-sdk/types" diff --git a/x/erc20/types/msg_test.go b/x/erc20/types/msg_test.go index 6a4c440132..90d9ffdc78 100644 --- a/x/erc20/types/msg_test.go +++ b/x/erc20/types/msg_test.go @@ -10,8 +10,8 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/x/erc20/types" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v17/x/erc20/types" "github.com/ethereum/go-ethereum/common" ) diff --git a/x/erc20/types/params_test.go b/x/erc20/types/params_test.go index 2d11216e28..65dcc17e22 100644 --- a/x/erc20/types/params_test.go +++ b/x/erc20/types/params_test.go @@ -3,7 +3,7 @@ package types_test import ( "testing" - "github.com/evmos/evmos/v16/x/erc20/types" + "github.com/evmos/evmos/v17/x/erc20/types" "github.com/stretchr/testify/suite" ) diff --git a/x/erc20/types/proposal.go b/x/erc20/types/proposal.go index e3e091adc4..985bae72ec 100644 --- a/x/erc20/types/proposal.go +++ b/x/erc20/types/proposal.go @@ -12,7 +12,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" govcdc "github.com/cosmos/cosmos-sdk/x/gov/codec" v1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - evmostypes "github.com/evmos/evmos/v16/types" + evmostypes "github.com/evmos/evmos/v17/types" ) // constants diff --git a/x/erc20/types/proposal_test.go b/x/erc20/types/proposal_test.go index a8d62aa0ec..e6aa3581a3 100644 --- a/x/erc20/types/proposal_test.go +++ b/x/erc20/types/proposal_test.go @@ -8,8 +8,8 @@ import ( length "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/x/erc20/types" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v17/x/erc20/types" ) type ProposalTestSuite struct { diff --git a/x/erc20/types/query.pb.go b/x/erc20/types/query.pb.go index 731056eeeb..34b9a9b5d5 100644 --- a/x/erc20/types/query.pb.go +++ b/x/erc20/types/query.pb.go @@ -326,36 +326,36 @@ var fileDescriptor_fba814bce17cabdf = []byte{ // 502 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x53, 0x4f, 0x8b, 0xd3, 0x40, 0x14, 0xef, 0xec, 0xba, 0x85, 0xbe, 0x82, 0x87, 0xb1, 0xd6, 0x1a, 0x35, 0x2e, 0x29, 0xdb, 0x2d, - 0x8a, 0x33, 0xa6, 0x8a, 0x47, 0x91, 0x1e, 0xf4, 0xe0, 0xa5, 0x16, 0x0f, 0xe2, 0x45, 0xa7, 0x65, - 0x88, 0x41, 0x9b, 0x49, 0x33, 0xd3, 0xe0, 0x22, 0x5e, 0xf6, 0x22, 0xde, 0x04, 0xbf, 0x82, 0x1f, - 0x66, 0x8f, 0x0b, 0x5e, 0x3c, 0x89, 0xb4, 0x7e, 0x10, 0xc9, 0xcc, 0x24, 0xdd, 0xc4, 0xd2, 0x5e, - 0x4a, 0xf2, 0xde, 0xfb, 0xfd, 0x7b, 0x2f, 0x05, 0x87, 0xa7, 0x33, 0x21, 0x29, 0x4f, 0xa6, 0x83, - 0xfb, 0x34, 0xf5, 0xe9, 0x7c, 0xc1, 0x93, 0x13, 0x12, 0x27, 0x42, 0x09, 0x7c, 0x59, 0xf7, 0x88, - 0xee, 0x91, 0xd4, 0x77, 0xee, 0x4c, 0x85, 0xcc, 0x86, 0x27, 0x4c, 0x72, 0x33, 0x48, 0x53, 0x7f, - 0xc2, 0x15, 0xf3, 0x69, 0xcc, 0x82, 0x30, 0x62, 0x2a, 0x14, 0x91, 0xc1, 0x3a, 0x55, 0x5e, 0x43, - 0x62, 0x7a, 0x37, 0x2b, 0xbd, 0x80, 0x47, 0x5c, 0x86, 0xd2, 0x76, 0x5b, 0x81, 0x08, 0x84, 0x7e, - 0xa4, 0xd9, 0x53, 0x8e, 0x09, 0x84, 0x08, 0x3e, 0x70, 0xca, 0xe2, 0x90, 0xb2, 0x28, 0x12, 0x4a, - 0x8b, 0x59, 0x8c, 0xf7, 0x16, 0xda, 0x2f, 0x32, 0x3f, 0x2f, 0xc5, 0x7b, 0x1e, 0x8d, 0x58, 0x98, - 0xc8, 0x31, 0x9f, 0x2f, 0xb8, 0x54, 0xf8, 0x29, 0xc0, 0xda, 0x5b, 0x07, 0x1d, 0xa2, 0x7e, 0x73, - 0xd0, 0x23, 0x26, 0x08, 0xc9, 0x82, 0x10, 0x93, 0xd8, 0x06, 0x21, 0x23, 0x16, 0x70, 0x8b, 0x1d, - 0x5f, 0x40, 0x7a, 0x3f, 0x10, 0x5c, 0xfb, 0x4f, 0x42, 0xc6, 0x22, 0x92, 0x1c, 0x3f, 0x81, 0xa6, - 0xca, 0xaa, 0x6f, 0xe2, 0xac, 0xdc, 0x41, 0x87, 0xfb, 0xfd, 0xe6, 0xe0, 0x3a, 0x29, 0x6f, 0x8f, - 0x14, 0xc0, 0xe1, 0xa5, 0xb3, 0xdf, 0xb7, 0x6b, 0x63, 0x50, 0x05, 0x13, 0x7e, 0x56, 0x72, 0xb9, - 0xa7, 0x5d, 0x1e, 0xef, 0x74, 0x69, 0xe4, 0x4b, 0x36, 0xef, 0xc1, 0xd5, 0xb2, 0xcb, 0x7c, 0x0f, - 0x2d, 0x38, 0xd0, 0x7a, 0x7a, 0x05, 0x8d, 0xb1, 0x79, 0xf1, 0x5e, 0x55, 0xf7, 0x56, 0x64, 0x7a, - 0x0c, 0xb0, 0xce, 0x64, 0xf7, 0xb6, 0x33, 0x52, 0xa3, 0x88, 0xe4, 0xb5, 0x00, 0x6b, 0xe6, 0x11, - 0x4b, 0xd8, 0x2c, 0xbf, 0x86, 0xf7, 0x1c, 0xae, 0x94, 0xaa, 0x56, 0xec, 0x21, 0xd4, 0x63, 0x5d, - 0xb1, 0x42, 0xed, 0xaa, 0x90, 0x99, 0xb7, 0x2a, 0x76, 0x76, 0xf0, 0x75, 0x1f, 0x0e, 0x34, 0x1b, - 0x3e, 0x45, 0x00, 0xeb, 0xbb, 0xe0, 0x5e, 0x15, 0xbe, 0xf9, 0xdb, 0x70, 0x8e, 0x77, 0xce, 0x19, - 0x7f, 0x5e, 0xf7, 0xf4, 0xe7, 0xdf, 0xef, 0x7b, 0xb7, 0xf0, 0x0d, 0x5a, 0xf9, 0x72, 0x2f, 0x9c, - 0x1d, 0x7f, 0x41, 0xd0, 0x28, 0xb0, 0xf8, 0x68, 0x3b, 0x77, 0x6e, 0xa1, 0xb7, 0x6b, 0xcc, 0x3a, - 0xb8, 0xab, 0x1d, 0x1c, 0xe1, 0xee, 0x16, 0x07, 0xf4, 0x93, 0x7e, 0xf9, 0x8c, 0xe7, 0x50, 0x37, - 0x0b, 0xc3, 0xde, 0x46, 0xfa, 0xd2, 0x4d, 0x9c, 0xee, 0xd6, 0x19, 0xab, 0xef, 0x6a, 0xfd, 0x0e, - 0x6e, 0x57, 0xf5, 0xcd, 0x2d, 0x86, 0xc3, 0xb3, 0xa5, 0x8b, 0xce, 0x97, 0x2e, 0xfa, 0xb3, 0x74, - 0xd1, 0xb7, 0x95, 0x5b, 0x3b, 0x5f, 0xb9, 0xb5, 0x5f, 0x2b, 0xb7, 0xf6, 0xba, 0x1f, 0x84, 0xea, - 0xdd, 0x62, 0x42, 0xa6, 0x62, 0x96, 0x63, 0xf5, 0x6f, 0xea, 0x3f, 0xa2, 0x1f, 0x2d, 0x8f, 0x3a, - 0x89, 0xb9, 0x9c, 0xd4, 0xf5, 0x7f, 0xf9, 0xc1, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7a, 0xf7, - 0x7c, 0xb6, 0x93, 0x04, 0x00, 0x00, + 0x8a, 0x33, 0xa6, 0x0a, 0xde, 0x44, 0x7a, 0xd0, 0x83, 0x97, 0x5a, 0x3c, 0x88, 0x17, 0x9d, 0x96, + 0x21, 0x06, 0x6d, 0x26, 0xcd, 0x4c, 0x83, 0x8b, 0x78, 0xd9, 0x8b, 0x78, 0x13, 0xfc, 0x0a, 0x7e, + 0x98, 0x3d, 0x2e, 0x78, 0xf1, 0x24, 0xd2, 0xfa, 0x41, 0x24, 0x33, 0x93, 0x74, 0x13, 0x4b, 0x7b, + 0x29, 0xc9, 0x7b, 0xef, 0xf7, 0xef, 0xbd, 0x14, 0x1c, 0x9e, 0xce, 0x84, 0xa4, 0x3c, 0x99, 0x0e, + 0xee, 0xd3, 0xd4, 0xa7, 0xf3, 0x05, 0x4f, 0x4e, 0x48, 0x9c, 0x08, 0x25, 0xf0, 0x65, 0xdd, 0x23, + 0xba, 0x47, 0x52, 0xdf, 0xb9, 0x33, 0x15, 0x32, 0x1b, 0x9e, 0x30, 0xc9, 0xcd, 0x20, 0x4d, 0xfd, + 0x09, 0x57, 0xcc, 0xa7, 0x31, 0x0b, 0xc2, 0x88, 0xa9, 0x50, 0x44, 0x06, 0xeb, 0x54, 0x79, 0x0d, + 0x89, 0xe9, 0xdd, 0xac, 0xf4, 0x02, 0x1e, 0x71, 0x19, 0x4a, 0xdb, 0x6d, 0x05, 0x22, 0x10, 0xfa, + 0x91, 0x66, 0x4f, 0x39, 0x26, 0x10, 0x22, 0xf8, 0xc0, 0x29, 0x8b, 0x43, 0xca, 0xa2, 0x48, 0x28, + 0x2d, 0x66, 0x31, 0xde, 0x5b, 0x68, 0xbf, 0xc8, 0xfc, 0xbc, 0x14, 0xef, 0x79, 0x34, 0x62, 0x61, + 0x22, 0xc7, 0x7c, 0xbe, 0xe0, 0x52, 0xe1, 0xa7, 0x00, 0x6b, 0x6f, 0x1d, 0x74, 0x88, 0xfa, 0xcd, + 0x41, 0x8f, 0x98, 0x20, 0x24, 0x0b, 0x42, 0x4c, 0x62, 0x1b, 0x84, 0x8c, 0x58, 0xc0, 0x2d, 0x76, + 0x7c, 0x01, 0xe9, 0xfd, 0x40, 0x70, 0xed, 0x3f, 0x09, 0x19, 0x8b, 0x48, 0x72, 0xfc, 0x04, 0x9a, + 0x2a, 0xab, 0xbe, 0x89, 0xb3, 0x72, 0x07, 0x1d, 0xee, 0xf7, 0x9b, 0x83, 0xeb, 0xa4, 0xbc, 0x3d, + 0x52, 0x00, 0x87, 0x97, 0xce, 0x7e, 0xdf, 0xae, 0x8d, 0x41, 0x15, 0x4c, 0xf8, 0x59, 0xc9, 0xe5, + 0x9e, 0x76, 0x79, 0xbc, 0xd3, 0xa5, 0x91, 0x2f, 0xd9, 0xbc, 0x07, 0x57, 0xcb, 0x2e, 0xf3, 0x3d, + 0xb4, 0xe0, 0x40, 0xeb, 0xe9, 0x15, 0x34, 0xc6, 0xe6, 0xc5, 0x7b, 0x55, 0xdd, 0x5b, 0x91, 0xe9, + 0x31, 0xc0, 0x3a, 0x93, 0xdd, 0xdb, 0xce, 0x48, 0x8d, 0x22, 0x92, 0xd7, 0x02, 0xac, 0x99, 0x47, + 0x2c, 0x61, 0xb3, 0xfc, 0x1a, 0xde, 0x73, 0xb8, 0x52, 0xaa, 0x5a, 0xb1, 0x87, 0x50, 0x8f, 0x75, + 0xc5, 0x0a, 0xb5, 0xab, 0x42, 0x66, 0xde, 0xaa, 0xd8, 0xd9, 0xc1, 0xd7, 0x7d, 0x38, 0xd0, 0x6c, + 0xf8, 0x14, 0x01, 0xac, 0xef, 0x82, 0x7b, 0x55, 0xf8, 0xe6, 0x6f, 0xc3, 0x39, 0xde, 0x39, 0x67, + 0xfc, 0x79, 0xdd, 0xd3, 0x9f, 0x7f, 0xbf, 0xef, 0xdd, 0xc2, 0x37, 0x68, 0xe5, 0xcb, 0xbd, 0x70, + 0x76, 0xfc, 0x05, 0x41, 0xa3, 0xc0, 0xe2, 0xa3, 0xed, 0xdc, 0xb9, 0x85, 0xde, 0xae, 0x31, 0xeb, + 0xe0, 0xae, 0x76, 0x70, 0x84, 0xbb, 0x5b, 0x1c, 0xd0, 0x4f, 0xfa, 0xe5, 0x33, 0x9e, 0x43, 0xdd, + 0x2c, 0x0c, 0x7b, 0x1b, 0xe9, 0x4b, 0x37, 0x71, 0xba, 0x5b, 0x67, 0xac, 0xbe, 0xab, 0xf5, 0x3b, + 0xb8, 0x5d, 0xd5, 0x37, 0xb7, 0x18, 0x0e, 0xcf, 0x96, 0x2e, 0x3a, 0x5f, 0xba, 0xe8, 0xcf, 0xd2, + 0x45, 0xdf, 0x56, 0x6e, 0xed, 0x7c, 0xe5, 0xd6, 0x7e, 0xad, 0xdc, 0xda, 0xeb, 0x7e, 0x10, 0xaa, + 0x77, 0x8b, 0x09, 0x99, 0x8a, 0x59, 0x8e, 0xd5, 0xbf, 0xa9, 0xff, 0x88, 0x7e, 0xb4, 0x3c, 0xea, + 0x24, 0xe6, 0x72, 0x52, 0xd7, 0xff, 0xe5, 0x07, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0xae, 0x1d, + 0x0f, 0x2d, 0x93, 0x04, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/erc20/types/token_pair.go b/x/erc20/types/token_pair.go index 19282810f3..efea4c0061 100644 --- a/x/erc20/types/token_pair.go +++ b/x/erc20/types/token_pair.go @@ -7,7 +7,7 @@ import ( "github.com/cometbft/cometbft/crypto/tmhash" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - evmostypes "github.com/evmos/evmos/v16/types" + evmostypes "github.com/evmos/evmos/v17/types" ) // NewTokenPair returns an instance of TokenPair diff --git a/x/erc20/types/token_pair_test.go b/x/erc20/types/token_pair_test.go index c9db721adf..e36bc12a5c 100644 --- a/x/erc20/types/token_pair_test.go +++ b/x/erc20/types/token_pair_test.go @@ -6,8 +6,8 @@ import ( "github.com/cometbft/cometbft/crypto/tmhash" "github.com/ethereum/go-ethereum/common" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/x/erc20/types" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v17/x/erc20/types" "github.com/stretchr/testify/suite" ) diff --git a/x/erc20/types/tx.pb.go b/x/erc20/types/tx.pb.go index 6a7f95e0a0..71923706b2 100644 --- a/x/erc20/types/tx.pb.go +++ b/x/erc20/types/tx.pb.go @@ -347,43 +347,43 @@ func init() { func init() { proto.RegisterFile("evmos/erc20/v1/tx.proto", fileDescriptor_f8926fc6cb676914) } var fileDescriptor_f8926fc6cb676914 = []byte{ - // 574 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x93, 0xcd, 0x6e, 0x13, 0x3f, - 0x14, 0xc5, 0x33, 0x6d, 0x14, 0xfd, 0xe3, 0x54, 0xe9, 0x5f, 0x56, 0xc9, 0x97, 0x60, 0x12, 0xb2, - 0xa0, 0x01, 0x89, 0x71, 0x93, 0x42, 0x17, 0xec, 0x48, 0xc4, 0x82, 0x45, 0x25, 0x34, 0x08, 0x09, - 0xb1, 0x89, 0x9c, 0x89, 0x35, 0x19, 0xc1, 0xd8, 0x23, 0xdb, 0x19, 0x35, 0x1b, 0x16, 0x79, 0x01, - 0x90, 0x78, 0x08, 0xb6, 0x2c, 0x78, 0x88, 0x2e, 0x2b, 0xd8, 0x20, 0x16, 0x15, 0x4a, 0x2a, 0xf1, - 0x1a, 0x68, 0x6c, 0xe7, 0x63, 0x42, 0x5a, 0x36, 0x51, 0xec, 0x73, 0x7c, 0xef, 0xef, 0xf8, 0x7a, - 0x40, 0x99, 0xc4, 0x21, 0x13, 0x88, 0x70, 0xaf, 0x73, 0x84, 0xe2, 0x36, 0x92, 0x67, 0x4e, 0xc4, - 0x99, 0x64, 0xb0, 0xa8, 0x04, 0x47, 0x09, 0x4e, 0xdc, 0xae, 0xd9, 0x1e, 0x13, 0x89, 0x73, 0x80, - 0x05, 0x41, 0x71, 0x7b, 0x40, 0x24, 0x6e, 0x23, 0x8f, 0x05, 0x54, 0xfb, 0x6b, 0x65, 0xa3, 0x87, - 0xc2, 0x4f, 0xea, 0x84, 0xc2, 0x37, 0x42, 0x55, 0x0b, 0x7d, 0xb5, 0x42, 0x7a, 0x61, 0xa4, 0xdb, - 0x1b, 0xcd, 0x7d, 0x42, 0x89, 0x08, 0x16, 0xea, 0x81, 0xcf, 0x7c, 0xa6, 0x4f, 0x25, 0xff, 0x16, - 0x67, 0x7c, 0xc6, 0xfc, 0x77, 0x04, 0xe1, 0x28, 0x40, 0x98, 0x52, 0x26, 0xb1, 0x0c, 0x18, 0x35, - 0x67, 0x9a, 0x13, 0x50, 0x3c, 0x15, 0x7e, 0x8f, 0xd1, 0x98, 0x70, 0xd9, 0x63, 0x01, 0x85, 0xc7, - 0x20, 0x9b, 0x50, 0x56, 0xac, 0x86, 0xd5, 0x2a, 0x74, 0xaa, 0x8e, 0x01, 0x48, 0x62, 0x38, 0x26, - 0x86, 0x93, 0x18, 0xbb, 0xd9, 0xf3, 0xcb, 0x7a, 0xc6, 0x55, 0x66, 0x58, 0x03, 0xff, 0x71, 0xe2, - 0x91, 0x20, 0x26, 0xbc, 0xb2, 0xd3, 0xb0, 0x5a, 0x79, 0x77, 0xb9, 0x86, 0x25, 0x90, 0x13, 0x84, - 0x0e, 0x09, 0xaf, 0xec, 0x2a, 0xc5, 0xac, 0x9a, 0x15, 0x50, 0x4a, 0xb7, 0x76, 0x89, 0x88, 0x18, - 0x15, 0xa4, 0xf9, 0xd9, 0x02, 0xfb, 0x2b, 0xe9, 0x99, 0xdb, 0xeb, 0x1c, 0xc1, 0xfb, 0xe0, 0x7f, - 0x8f, 0x51, 0xc9, 0xb1, 0x27, 0xfb, 0x78, 0x38, 0xe4, 0x44, 0x08, 0x85, 0x98, 0x77, 0xf7, 0x17, - 0xfb, 0x4f, 0xf5, 0x36, 0x7c, 0x0c, 0x72, 0x38, 0x64, 0x63, 0x2a, 0x35, 0x4a, 0xf7, 0x4e, 0x02, - 0xfa, 0xf3, 0xb2, 0x7e, 0x4b, 0x47, 0x11, 0xc3, 0xb7, 0x4e, 0xc0, 0x50, 0x88, 0xe5, 0xc8, 0x79, - 0x4e, 0xa5, 0x6b, 0xcc, 0xa9, 0x0c, 0xbb, 0xd7, 0x66, 0xc8, 0xa6, 0x32, 0x54, 0x41, 0x79, 0x03, - 0x74, 0x19, 0xe2, 0x83, 0x0e, 0xf1, 0x2a, 0x1a, 0x62, 0x49, 0x5e, 0x60, 0x8e, 0x43, 0x01, 0x4f, - 0x40, 0x1e, 0x8f, 0xe5, 0x88, 0xf1, 0x40, 0x4e, 0x34, 0x7d, 0xb7, 0xf2, 0xed, 0xeb, 0xc3, 0x03, - 0x73, 0xc7, 0x26, 0xc0, 0x4b, 0xc9, 0x03, 0xea, 0xbb, 0x2b, 0x2b, 0x7c, 0x04, 0x72, 0x91, 0xaa, - 0xa0, 0x12, 0x15, 0x3a, 0x25, 0x27, 0xfd, 0xd8, 0x1c, 0x5d, 0xdf, 0x8c, 0xc4, 0x78, 0x9f, 0x14, - 0xa7, 0xbf, 0xbf, 0x3c, 0x58, 0x55, 0x31, 0xb0, 0xeb, 0x40, 0x0b, 0xd8, 0xce, 0xd5, 0x0e, 0xd8, - 0x3d, 0x15, 0x3e, 0x7c, 0x0f, 0x0a, 0xeb, 0x6f, 0xc1, 0xde, 0xec, 0x93, 0x1e, 0x58, 0xed, 0xde, - 0xcd, 0xfa, 0xf2, 0x2e, 0x0e, 0xa7, 0xdf, 0xaf, 0x3e, 0xed, 0xdc, 0x85, 0x75, 0xf4, 0xd7, 0xd7, - 0x83, 0x3c, 0xed, 0xef, 0xab, 0x77, 0x34, 0xb5, 0xc0, 0x5e, 0x6a, 0xec, 0xf5, 0xeb, 0x3b, 0x28, - 0x43, 0xed, 0xf0, 0x1f, 0x86, 0x25, 0x43, 0x4b, 0x31, 0x34, 0x61, 0xe3, 0x06, 0x06, 0xb5, 0x07, - 0x5f, 0x83, 0xbd, 0xd4, 0xd4, 0xb6, 0x31, 0xac, 0x1b, 0xb6, 0x32, 0x6c, 0xbb, 0xe6, 0x6e, 0xf7, - 0x7c, 0x66, 0x5b, 0x17, 0x33, 0xdb, 0xfa, 0x35, 0xb3, 0xad, 0x8f, 0x73, 0x3b, 0x73, 0x31, 0xb7, - 0x33, 0x3f, 0xe6, 0x76, 0xe6, 0x4d, 0xcb, 0x0f, 0xe4, 0x68, 0x3c, 0x70, 0x3c, 0x16, 0x2e, 0xf8, - 0xd4, 0x6f, 0xdc, 0x3e, 0x41, 0x67, 0x86, 0x55, 0x4e, 0x22, 0x22, 0x06, 0x39, 0xf5, 0xe1, 0x1e, - 0xff, 0x09, 0x00, 0x00, 0xff, 0xff, 0x27, 0xf3, 0xf5, 0xf1, 0x89, 0x04, 0x00, 0x00, + // 575 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x93, 0x4d, 0x8b, 0x13, 0x3f, + 0x1c, 0xc7, 0x3b, 0xbb, 0xa5, 0xfc, 0x9b, 0x2e, 0xdd, 0x3f, 0x61, 0xed, 0x13, 0x3a, 0xad, 0x3d, + 0xb8, 0x55, 0x70, 0xb2, 0xed, 0xfa, 0x00, 0xde, 0x6c, 0xf1, 0xe0, 0x61, 0x41, 0x46, 0x04, 0xf1, + 0x52, 0xd2, 0x69, 0x98, 0x0e, 0x3a, 0xc9, 0x90, 0xa4, 0xc3, 0xf6, 0xe2, 0xa1, 0x6f, 0x40, 0xc1, + 0x17, 0xe1, 0xd5, 0x83, 0x2f, 0x62, 0x8f, 0x8b, 0x5e, 0xc4, 0xc3, 0x22, 0xed, 0x82, 0x6f, 0x43, + 0x26, 0x49, 0x1f, 0xa6, 0x76, 0xd7, 0x4b, 0x69, 0xf2, 0xfd, 0xe6, 0xf7, 0xfb, 0x7c, 0xf3, 0xcb, + 0x80, 0x32, 0x89, 0x43, 0x26, 0x10, 0xe1, 0x5e, 0xe7, 0x08, 0xc5, 0x6d, 0x24, 0x4f, 0x9d, 0x88, + 0x33, 0xc9, 0x60, 0x51, 0x09, 0x8e, 0x12, 0x9c, 0xb8, 0x5d, 0xb3, 0x3d, 0x26, 0x12, 0xe7, 0x00, + 0x0b, 0x82, 0xe2, 0xf6, 0x80, 0x48, 0xdc, 0x46, 0x1e, 0x0b, 0xa8, 0xf6, 0xd7, 0xca, 0x46, 0x0f, + 0x85, 0x9f, 0xd4, 0x09, 0x85, 0x6f, 0x84, 0xaa, 0x16, 0xfa, 0x6a, 0x85, 0xf4, 0xc2, 0x48, 0x37, + 0x37, 0x9a, 0xfb, 0x84, 0x12, 0x11, 0x2c, 0xd4, 0x03, 0x9f, 0xf9, 0x4c, 0x9f, 0x4a, 0xfe, 0x2d, + 0xce, 0xf8, 0x8c, 0xf9, 0xef, 0x08, 0xc2, 0x51, 0x80, 0x30, 0xa5, 0x4c, 0x62, 0x19, 0x30, 0x6a, + 0xce, 0x34, 0x27, 0xa0, 0x78, 0x22, 0xfc, 0x1e, 0xa3, 0x31, 0xe1, 0xb2, 0xc7, 0x02, 0x0a, 0x8f, + 0x41, 0x36, 0xa1, 0xac, 0x58, 0x0d, 0xab, 0x55, 0xe8, 0x54, 0x1d, 0x03, 0x90, 0xc4, 0x70, 0x4c, + 0x0c, 0x27, 0x31, 0x76, 0xb3, 0x67, 0x17, 0xf5, 0x8c, 0xab, 0xcc, 0xb0, 0x06, 0xfe, 0xe3, 0xc4, + 0x23, 0x41, 0x4c, 0x78, 0x65, 0xa7, 0x61, 0xb5, 0xf2, 0xee, 0x72, 0x0d, 0x4b, 0x20, 0x27, 0x08, + 0x1d, 0x12, 0x5e, 0xd9, 0x55, 0x8a, 0x59, 0x35, 0x2b, 0xa0, 0x94, 0x6e, 0xed, 0x12, 0x11, 0x31, + 0x2a, 0x48, 0xf3, 0xb3, 0x05, 0xf6, 0x57, 0xd2, 0x33, 0xb7, 0xd7, 0x39, 0x82, 0x77, 0xc1, 0xff, + 0x1e, 0xa3, 0x92, 0x63, 0x4f, 0xf6, 0xf1, 0x70, 0xc8, 0x89, 0x10, 0x0a, 0x31, 0xef, 0xee, 0x2f, + 0xf6, 0x9f, 0xea, 0x6d, 0xf8, 0x10, 0xe4, 0x70, 0xc8, 0xc6, 0x54, 0x6a, 0x94, 0xee, 0xad, 0x04, + 0xf4, 0xe7, 0x45, 0xfd, 0x86, 0x8e, 0x22, 0x86, 0x6f, 0x9d, 0x80, 0xa1, 0x10, 0xcb, 0x91, 0xf3, + 0x9c, 0x4a, 0xd7, 0x98, 0x53, 0x19, 0x76, 0xaf, 0xcc, 0x90, 0x4d, 0x65, 0xa8, 0x82, 0xf2, 0x06, + 0xe8, 0x32, 0xc4, 0x07, 0x1d, 0xe2, 0x55, 0x34, 0xc4, 0x92, 0xbc, 0xc0, 0x1c, 0x87, 0x02, 0x3e, + 0x02, 0x79, 0x3c, 0x96, 0x23, 0xc6, 0x03, 0x39, 0xd1, 0xf4, 0xdd, 0xca, 0xb7, 0xaf, 0xf7, 0x0f, + 0xcc, 0x1d, 0x9b, 0x00, 0x2f, 0x25, 0x0f, 0xa8, 0xef, 0xae, 0xac, 0xf0, 0x01, 0xc8, 0x45, 0xaa, + 0x82, 0x4a, 0x54, 0xe8, 0x94, 0x9c, 0xf4, 0x63, 0x73, 0x74, 0x7d, 0x33, 0x12, 0xe3, 0x7d, 0x52, + 0x9c, 0xfe, 0xfe, 0x72, 0x6f, 0x55, 0xc5, 0xc0, 0xae, 0x03, 0x2d, 0x60, 0x3b, 0x97, 0x3b, 0x60, + 0xf7, 0x44, 0xf8, 0xf0, 0x3d, 0x28, 0xac, 0xbf, 0x05, 0x7b, 0xb3, 0x4f, 0x7a, 0x60, 0xb5, 0x3b, + 0xd7, 0xeb, 0xcb, 0xbb, 0x38, 0x9c, 0x7e, 0xbf, 0xfc, 0xb4, 0x73, 0x1b, 0xd6, 0xd1, 0x5f, 0x5f, + 0x0f, 0xf2, 0xb4, 0xbf, 0xaf, 0xde, 0xd1, 0xd4, 0x02, 0x7b, 0xa9, 0xb1, 0xd7, 0xaf, 0xee, 0xa0, + 0x0c, 0xb5, 0xc3, 0x7f, 0x18, 0x96, 0x0c, 0x2d, 0xc5, 0xd0, 0x84, 0x8d, 0x6b, 0x18, 0xd4, 0x1e, + 0x7c, 0x0d, 0xf6, 0x52, 0x53, 0xdb, 0xc6, 0xb0, 0x6e, 0xd8, 0xca, 0xb0, 0xed, 0x9a, 0xbb, 0xdd, + 0xb3, 0x99, 0x6d, 0x9d, 0xcf, 0x6c, 0xeb, 0xd7, 0xcc, 0xb6, 0x3e, 0xce, 0xed, 0xcc, 0xf9, 0xdc, + 0xce, 0xfc, 0x98, 0xdb, 0x99, 0x37, 0x2d, 0x3f, 0x90, 0xa3, 0xf1, 0xc0, 0xf1, 0x58, 0xb8, 0xe0, + 0x53, 0xbf, 0x71, 0xfb, 0x31, 0x3a, 0x35, 0xac, 0x72, 0x12, 0x11, 0x31, 0xc8, 0xa9, 0x0f, 0xf7, + 0xf8, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf3, 0x19, 0x86, 0x6a, 0x89, 0x04, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/erc20/types/utils_test.go b/x/erc20/types/utils_test.go index eecdb5e53f..6e216f6281 100644 --- a/x/erc20/types/utils_test.go +++ b/x/erc20/types/utils_test.go @@ -6,7 +6,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/evmos/evmos/v16/x/erc20/types" + "github.com/evmos/evmos/v17/x/erc20/types" "github.com/stretchr/testify/require" ) diff --git a/x/evm/ante/ctx_test.go b/x/evm/ante/ctx_test.go index fe20dd698a..f3730bd3fd 100644 --- a/x/evm/ante/ctx_test.go +++ b/x/evm/ante/ctx_test.go @@ -5,8 +5,8 @@ package ante_test import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" - "github.com/evmos/evmos/v16/testutil/integration/evmos/network" - evmante "github.com/evmos/evmos/v16/x/evm/ante" + "github.com/evmos/evmos/v17/testutil/integration/evmos/network" + evmante "github.com/evmos/evmos/v17/x/evm/ante" ) func (suite *EvmAnteTestSuite) TestBuildEvmExecutionCtx() { diff --git a/x/evm/client/cli/query.go b/x/evm/client/cli/query.go index 2691d54030..668cfe9668 100644 --- a/x/evm/client/cli/query.go +++ b/x/evm/client/cli/query.go @@ -3,13 +3,13 @@ package cli import ( - rpctypes "github.com/evmos/evmos/v16/rpc/types" + rpctypes "github.com/evmos/evmos/v17/rpc/types" "github.com/spf13/cobra" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/x/evm/types" ) // GetQueryCmd returns the parent command for all x/bank CLi query commands. diff --git a/x/evm/client/cli/tx.go b/x/evm/client/cli/tx.go index 4672f8f9c5..f1616ed6a7 100644 --- a/x/evm/client/cli/tx.go +++ b/x/evm/client/cli/tx.go @@ -14,8 +14,8 @@ import ( "github.com/pkg/errors" "github.com/spf13/cobra" - rpctypes "github.com/evmos/evmos/v16/rpc/types" - "github.com/evmos/evmos/v16/x/evm/types" + rpctypes "github.com/evmos/evmos/v17/rpc/types" + "github.com/evmos/evmos/v17/x/evm/types" ) // GetTxCmd returns the transaction commands for this module diff --git a/x/evm/genesis.go b/x/evm/genesis.go index b59c8b57dd..64076d3d86 100644 --- a/x/evm/genesis.go +++ b/x/evm/genesis.go @@ -12,9 +12,9 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - evmostypes "github.com/evmos/evmos/v16/types" - "github.com/evmos/evmos/v16/x/evm/keeper" - "github.com/evmos/evmos/v16/x/evm/types" + evmostypes "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v17/x/evm/keeper" + "github.com/evmos/evmos/v17/x/evm/types" ) // InitGenesis initializes genesis state based on exported genesis diff --git a/x/evm/genesis_test.go b/x/evm/genesis_test.go index b1a5786824..8d54d3610f 100644 --- a/x/evm/genesis_test.go +++ b/x/evm/genesis_test.go @@ -6,13 +6,13 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" - testkeyring "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" - testnetwork "github.com/evmos/evmos/v16/testutil/integration/evmos/network" - evmostypes "github.com/evmos/evmos/v16/types" - "github.com/evmos/evmos/v16/x/evm" - "github.com/evmos/evmos/v16/x/evm/statedb" - "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" + testnetwork "github.com/evmos/evmos/v17/testutil/integration/evmos/network" + evmostypes "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v17/x/evm" + "github.com/evmos/evmos/v17/x/evm/statedb" + "github.com/evmos/evmos/v17/x/evm/types" "github.com/stretchr/testify/require" ) diff --git a/x/evm/keeper/abci_test.go b/x/evm/keeper/abci_test.go index df57e5890c..e32b629ce0 100644 --- a/x/evm/keeper/abci_test.go +++ b/x/evm/keeper/abci_test.go @@ -2,7 +2,7 @@ package keeper_test import ( "github.com/cometbft/cometbft/abci/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) func (suite *KeeperTestSuite) TestEndBlock() { diff --git a/x/evm/keeper/benchmark_test.go b/x/evm/keeper/benchmark_test.go index 2d2fa455b7..18f69b5c49 100644 --- a/x/evm/keeper/benchmark_test.go +++ b/x/evm/keeper/benchmark_test.go @@ -12,8 +12,8 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - evmostypes "github.com/evmos/evmos/v16/types" - "github.com/evmos/evmos/v16/x/evm/types" + evmostypes "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v17/x/evm/types" ) func SetupContract(b *testing.B) (*KeeperTestSuite, common.Address) { diff --git a/x/evm/keeper/config.go b/x/evm/keeper/config.go index 7365dfe652..3ef6c094a2 100644 --- a/x/evm/keeper/config.go +++ b/x/evm/keeper/config.go @@ -10,8 +10,8 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v16/x/evm/statedb" - "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/x/evm/statedb" + "github.com/evmos/evmos/v17/x/evm/types" ) // EVMConfig creates the EVMConfig based on current state diff --git a/x/evm/keeper/fees.go b/x/evm/keeper/fees.go index 05ce94221b..961928f21f 100644 --- a/x/evm/keeper/fees.go +++ b/x/evm/keeper/fees.go @@ -15,7 +15,7 @@ import ( errortypes "github.com/cosmos/cosmos-sdk/types/errors" authante "github.com/cosmos/cosmos-sdk/x/auth/ante" - "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/x/evm/types" ) // CheckSenderBalance validates that the tx cost value is positive and that the diff --git a/x/evm/keeper/fees_test.go b/x/evm/keeper/fees_test.go index 718218b1d6..cc9139e6e8 100644 --- a/x/evm/keeper/fees_test.go +++ b/x/evm/keeper/fees_test.go @@ -8,8 +8,8 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" ethparams "github.com/ethereum/go-ethereum/params" - "github.com/evmos/evmos/v16/x/evm/keeper" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/x/evm/keeper" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) func (suite *KeeperTestSuite) TestCheckSenderBalance() { diff --git a/x/evm/keeper/gas.go b/x/evm/keeper/gas.go index 921e4f9b28..1537234687 100644 --- a/x/evm/keeper/gas.go +++ b/x/evm/keeper/gas.go @@ -14,7 +14,7 @@ import ( errortypes "github.com/cosmos/cosmos-sdk/types/errors" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/x/evm/types" ) // GetEthIntrinsicGas returns the intrinsic gas cost for the transaction diff --git a/x/evm/keeper/grpc_query.go b/x/evm/keeper/grpc_query.go index 7191a4db97..6107592dff 100644 --- a/x/evm/keeper/grpc_query.go +++ b/x/evm/keeper/grpc_query.go @@ -27,10 +27,10 @@ import ( "github.com/ethereum/go-ethereum/core/vm" ethparams "github.com/ethereum/go-ethereum/params" - evmostypes "github.com/evmos/evmos/v16/types" - evmante "github.com/evmos/evmos/v16/x/evm/ante" - "github.com/evmos/evmos/v16/x/evm/statedb" - "github.com/evmos/evmos/v16/x/evm/types" + evmostypes "github.com/evmos/evmos/v17/types" + evmante "github.com/evmos/evmos/v17/x/evm/ante" + "github.com/evmos/evmos/v17/x/evm/statedb" + "github.com/evmos/evmos/v17/x/evm/types" ) var _ types.QueryServer = Keeper{} diff --git a/x/evm/keeper/grpc_query_test.go b/x/evm/keeper/grpc_query_test.go index 9a9f1d3869..0f8cd6e8ac 100644 --- a/x/evm/keeper/grpc_query_test.go +++ b/x/evm/keeper/grpc_query_test.go @@ -15,10 +15,10 @@ import ( ethlogger "github.com/ethereum/go-ethereum/eth/tracers/logger" ethparams "github.com/ethereum/go-ethereum/params" - "github.com/evmos/evmos/v16/server/config" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/x/evm/statedb" - "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/server/config" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v17/x/evm/statedb" + "github.com/evmos/evmos/v17/x/evm/types" ) // Not valid Ethereum address diff --git a/x/evm/keeper/integration_test.go b/x/evm/keeper/integration_test.go index 31af11ba37..b935754885 100644 --- a/x/evm/keeper/integration_test.go +++ b/x/evm/keeper/integration_test.go @@ -13,19 +13,19 @@ import ( . "github.com/onsi/gomega" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/contracts" - "github.com/evmos/evmos/v16/precompiles/staking" + "github.com/evmos/evmos/v17/contracts" + "github.com/evmos/evmos/v17/precompiles/staking" - "github.com/evmos/evmos/v16/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v16/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v16/testutil/integration/evmos/network" - integrationutils "github.com/evmos/evmos/v16/testutil/integration/evmos/utils" + "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v17/testutil/integration/evmos/network" + integrationutils "github.com/evmos/evmos/v17/testutil/integration/evmos/utils" abcitypes "github.com/cometbft/cometbft/abci/types" sdktypes "github.com/cosmos/cosmos-sdk/types" ethtypes "github.com/ethereum/go-ethereum/core/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) type IntegrationTestSuite struct { diff --git a/x/evm/keeper/keeper.go b/x/evm/keeper/keeper.go index f4555d12dc..9e105dee65 100644 --- a/x/evm/keeper/keeper.go +++ b/x/evm/keeper/keeper.go @@ -19,9 +19,9 @@ import ( "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/params" - evmostypes "github.com/evmos/evmos/v16/types" - "github.com/evmos/evmos/v16/x/evm/statedb" - "github.com/evmos/evmos/v16/x/evm/types" + evmostypes "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v17/x/evm/statedb" + "github.com/evmos/evmos/v17/x/evm/types" ) // Keeper grants access to the EVM module state and implements the go-ethereum StateDB interface. diff --git a/x/evm/keeper/keeper_test.go b/x/evm/keeper/keeper_test.go index bded6523b7..dcb21be105 100644 --- a/x/evm/keeper/keeper_test.go +++ b/x/evm/keeper/keeper_test.go @@ -6,10 +6,10 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - evmostypes "github.com/evmos/evmos/v16/types" - "github.com/evmos/evmos/v16/x/evm/keeper" - "github.com/evmos/evmos/v16/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmostypes "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v17/x/evm/keeper" + "github.com/evmos/evmos/v17/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" "github.com/ethereum/go-ethereum/common" diff --git a/x/evm/keeper/migrations.go b/x/evm/keeper/migrations.go index ae9787b458..e99d7d38d9 100644 --- a/x/evm/keeper/migrations.go +++ b/x/evm/keeper/migrations.go @@ -4,10 +4,10 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" - v4 "github.com/evmos/evmos/v16/x/evm/migrations/v4" - v5 "github.com/evmos/evmos/v16/x/evm/migrations/v5" - v6 "github.com/evmos/evmos/v16/x/evm/migrations/v6" - "github.com/evmos/evmos/v16/x/evm/types" + v4 "github.com/evmos/evmos/v17/x/evm/migrations/v4" + v5 "github.com/evmos/evmos/v17/x/evm/migrations/v5" + v6 "github.com/evmos/evmos/v17/x/evm/migrations/v6" + "github.com/evmos/evmos/v17/x/evm/types" ) // Migrator is a struct for handling in-place store migrations. diff --git a/x/evm/keeper/migrations_test.go b/x/evm/keeper/migrations_test.go index 16bef2b69d..9a1aa1f9e0 100644 --- a/x/evm/keeper/migrations_test.go +++ b/x/evm/keeper/migrations_test.go @@ -2,8 +2,8 @@ package keeper_test import ( sdk "github.com/cosmos/cosmos-sdk/types" - evmkeeper "github.com/evmos/evmos/v16/x/evm/keeper" - "github.com/evmos/evmos/v16/x/evm/types" + evmkeeper "github.com/evmos/evmos/v17/x/evm/keeper" + "github.com/evmos/evmos/v17/x/evm/types" ) type mockSubspace struct { diff --git a/x/evm/keeper/msg_server.go b/x/evm/keeper/msg_server.go index b00e6e07db..d11a0c6aaa 100644 --- a/x/evm/keeper/msg_server.go +++ b/x/evm/keeper/msg_server.go @@ -19,7 +19,7 @@ import ( "github.com/cosmos/cosmos-sdk/telemetry" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/x/evm/types" ) var _ types.MsgServer = &Keeper{} diff --git a/x/evm/keeper/msg_server_test.go b/x/evm/keeper/msg_server_test.go index a9453d62de..e2ed9c8a6d 100644 --- a/x/evm/keeper/msg_server_test.go +++ b/x/evm/keeper/msg_server_test.go @@ -8,8 +8,8 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/params" - "github.com/evmos/evmos/v16/x/evm/statedb" - "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/x/evm/statedb" + "github.com/evmos/evmos/v17/x/evm/types" ) func (suite *KeeperTestSuite) TestEthereumTx() { diff --git a/x/evm/keeper/params.go b/x/evm/keeper/params.go index e48b7da0e3..fef452395e 100644 --- a/x/evm/keeper/params.go +++ b/x/evm/keeper/params.go @@ -8,7 +8,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/x/evm/types" ) // GetParams returns the total set of evm parameters. diff --git a/x/evm/keeper/params_benchmark_test.go b/x/evm/keeper/params_benchmark_test.go index ee5b28f8c8..38e692d3ac 100644 --- a/x/evm/keeper/params_benchmark_test.go +++ b/x/evm/keeper/params_benchmark_test.go @@ -3,7 +3,7 @@ package keeper_test import ( "testing" - "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/x/evm/types" ) func BenchmarkSetParams(b *testing.B) { diff --git a/x/evm/keeper/params_test.go b/x/evm/keeper/params_test.go index 6cfa2009b8..ae8564b1f0 100644 --- a/x/evm/keeper/params_test.go +++ b/x/evm/keeper/params_test.go @@ -3,7 +3,7 @@ package keeper_test import ( "reflect" - "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/x/evm/types" ) func (suite *KeeperTestSuite) TestParams() { diff --git a/x/evm/keeper/precompiles.go b/x/evm/keeper/precompiles.go index d00caf4cbe..7f7e1255b1 100644 --- a/x/evm/keeper/precompiles.go +++ b/x/evm/keeper/precompiles.go @@ -9,9 +9,9 @@ import ( "maps" "sort" - "github.com/evmos/evmos/v16/utils" + "github.com/evmos/evmos/v17/utils" - "github.com/evmos/evmos/v16/precompiles/bech32" + "github.com/evmos/evmos/v17/precompiles/bech32" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" @@ -22,18 +22,18 @@ import ( distributionkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" channelkeeper "github.com/cosmos/ibc-go/v7/modules/core/04-channel/keeper" - bankprecompile "github.com/evmos/evmos/v16/precompiles/bank" - distprecompile "github.com/evmos/evmos/v16/precompiles/distribution" - erc20precompile "github.com/evmos/evmos/v16/precompiles/erc20" - ics20precompile "github.com/evmos/evmos/v16/precompiles/ics20" - osmosisoutpost "github.com/evmos/evmos/v16/precompiles/outposts/osmosis" - strideoutpost "github.com/evmos/evmos/v16/precompiles/outposts/stride" - "github.com/evmos/evmos/v16/precompiles/p256" - stakingprecompile "github.com/evmos/evmos/v16/precompiles/staking" - vestingprecompile "github.com/evmos/evmos/v16/precompiles/vesting" - erc20Keeper "github.com/evmos/evmos/v16/x/erc20/keeper" - transferkeeper "github.com/evmos/evmos/v16/x/ibc/transfer/keeper" - vestingkeeper "github.com/evmos/evmos/v16/x/vesting/keeper" + bankprecompile "github.com/evmos/evmos/v17/precompiles/bank" + distprecompile "github.com/evmos/evmos/v17/precompiles/distribution" + erc20precompile "github.com/evmos/evmos/v17/precompiles/erc20" + ics20precompile "github.com/evmos/evmos/v17/precompiles/ics20" + osmosisoutpost "github.com/evmos/evmos/v17/precompiles/outposts/osmosis" + strideoutpost "github.com/evmos/evmos/v17/precompiles/outposts/stride" + "github.com/evmos/evmos/v17/precompiles/p256" + stakingprecompile "github.com/evmos/evmos/v17/precompiles/staking" + vestingprecompile "github.com/evmos/evmos/v17/precompiles/vesting" + erc20Keeper "github.com/evmos/evmos/v17/x/erc20/keeper" + transferkeeper "github.com/evmos/evmos/v17/x/ibc/transfer/keeper" + vestingkeeper "github.com/evmos/evmos/v17/x/vesting/keeper" ) // AvailablePrecompiles returns the list of all available precompiled contracts. diff --git a/x/evm/keeper/precompiles_test.go b/x/evm/keeper/precompiles_test.go index 59f11228e7..a7ffd24a60 100644 --- a/x/evm/keeper/precompiles_test.go +++ b/x/evm/keeper/precompiles_test.go @@ -6,8 +6,8 @@ package keeper_test import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - stakingprecompile "github.com/evmos/evmos/v16/precompiles/staking" - "github.com/evmos/evmos/v16/x/evm/types" + stakingprecompile "github.com/evmos/evmos/v17/precompiles/staking" + "github.com/evmos/evmos/v17/x/evm/types" ) func (suite *KeeperTestSuite) TestIsAvailablePrecompile() { diff --git a/x/evm/keeper/setup_test.go b/x/evm/keeper/setup_test.go index 849dc35681..d46adf9038 100644 --- a/x/evm/keeper/setup_test.go +++ b/x/evm/keeper/setup_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - "github.com/evmos/evmos/v16/utils" + "github.com/evmos/evmos/v17/utils" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" @@ -29,14 +29,14 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/params" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" - "github.com/evmos/evmos/v16/encoding" - "github.com/evmos/evmos/v16/testutil" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - evmostypes "github.com/evmos/evmos/v16/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + "github.com/evmos/evmos/v17/encoding" + "github.com/evmos/evmos/v17/testutil" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + evmostypes "github.com/evmos/evmos/v17/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" ) diff --git a/x/evm/keeper/state_transition.go b/x/evm/keeper/state_transition.go index a8d51cd426..f875f9ee57 100644 --- a/x/evm/keeper/state_transition.go +++ b/x/evm/keeper/state_transition.go @@ -12,9 +12,9 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" - evmostypes "github.com/evmos/evmos/v16/types" - "github.com/evmos/evmos/v16/x/evm/statedb" - "github.com/evmos/evmos/v16/x/evm/types" + evmostypes "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v17/x/evm/statedb" + "github.com/evmos/evmos/v17/x/evm/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" diff --git a/x/evm/keeper/state_transition_benchmark_test.go b/x/evm/keeper/state_transition_benchmark_test.go index 8e24dfd800..fb13a79477 100644 --- a/x/evm/keeper/state_transition_benchmark_test.go +++ b/x/evm/keeper/state_transition_benchmark_test.go @@ -11,7 +11,7 @@ import ( "github.com/ethereum/go-ethereum/core" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/params" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" "github.com/stretchr/testify/require" ) diff --git a/x/evm/keeper/state_transition_test.go b/x/evm/keeper/state_transition_test.go index 2cd12775e4..d622e8e02b 100644 --- a/x/evm/keeper/state_transition_test.go +++ b/x/evm/keeper/state_transition_test.go @@ -17,10 +17,10 @@ import ( "github.com/ethereum/go-ethereum/core" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/params" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/x/evm/keeper" - "github.com/evmos/evmos/v16/x/evm/statedb" - "github.com/evmos/evmos/v16/x/evm/types" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v17/x/evm/keeper" + "github.com/evmos/evmos/v17/x/evm/statedb" + "github.com/evmos/evmos/v17/x/evm/types" ) func (suite *KeeperTestSuite) TestGetHashFn() { diff --git a/x/evm/keeper/statedb.go b/x/evm/keeper/statedb.go index 77ad70aa78..7d8cf7aff3 100644 --- a/x/evm/keeper/statedb.go +++ b/x/evm/keeper/statedb.go @@ -13,9 +13,9 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - evmostypes "github.com/evmos/evmos/v16/types" - "github.com/evmos/evmos/v16/x/evm/statedb" - "github.com/evmos/evmos/v16/x/evm/types" + evmostypes "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v17/x/evm/statedb" + "github.com/evmos/evmos/v17/x/evm/types" ) var _ statedb.Keeper = &Keeper{} diff --git a/x/evm/keeper/statedb_benchmark_test.go b/x/evm/keeper/statedb_benchmark_test.go index 2c60b214d1..658336832c 100644 --- a/x/evm/keeper/statedb_benchmark_test.go +++ b/x/evm/keeper/statedb_benchmark_test.go @@ -10,7 +10,7 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - utiltx "github.com/evmos/evmos/v16/testutil/tx" + utiltx "github.com/evmos/evmos/v17/testutil/tx" ) func BenchmarkCreateAccountNew(b *testing.B) { diff --git a/x/evm/keeper/statedb_test.go b/x/evm/keeper/statedb_test.go index 98fbcbbd91..e85f757e09 100644 --- a/x/evm/keeper/statedb_test.go +++ b/x/evm/keeper/statedb_test.go @@ -16,10 +16,10 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/x/evm/statedb" - "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v17/x/evm/statedb" + "github.com/evmos/evmos/v17/x/evm/types" ) func (suite *KeeperTestSuite) TestCreateAccount() { diff --git a/x/evm/keeper/utils_test.go b/x/evm/keeper/utils_test.go index e680e52b5d..fe0d8a1ca6 100644 --- a/x/evm/keeper/utils_test.go +++ b/x/evm/keeper/utils_test.go @@ -11,10 +11,10 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v16/server/config" - "github.com/evmos/evmos/v16/testutil" - "github.com/evmos/evmos/v16/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/server/config" + "github.com/evmos/evmos/v17/testutil" + "github.com/evmos/evmos/v17/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" "github.com/stretchr/testify/require" ) diff --git a/x/evm/migrations/v4/migrate.go b/x/evm/migrations/v4/migrate.go index 803368dc75..ee47752a33 100644 --- a/x/evm/migrations/v4/migrate.go +++ b/x/evm/migrations/v4/migrate.go @@ -7,8 +7,8 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - v4types "github.com/evmos/evmos/v16/x/evm/migrations/v4/types" - "github.com/evmos/evmos/v16/x/evm/types" + v4types "github.com/evmos/evmos/v17/x/evm/migrations/v4/types" + "github.com/evmos/evmos/v17/x/evm/types" ) // MigrateStore migrates the x/evm module state from the consensus version 3 to diff --git a/x/evm/migrations/v4/migrate_test.go b/x/evm/migrations/v4/migrate_test.go index 98f90ddb95..d175af01d3 100644 --- a/x/evm/migrations/v4/migrate_test.go +++ b/x/evm/migrations/v4/migrate_test.go @@ -20,14 +20,14 @@ import ( "github.com/stretchr/testify/require" - "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/x/evm/types" "github.com/cosmos/cosmos-sdk/testutil" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/encoding" - v4 "github.com/evmos/evmos/v16/x/evm/migrations/v4" - v4types "github.com/evmos/evmos/v16/x/evm/migrations/v4/types" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/encoding" + v4 "github.com/evmos/evmos/v17/x/evm/migrations/v4" + v4types "github.com/evmos/evmos/v17/x/evm/migrations/v4/types" ) type mockSubspace struct { diff --git a/x/evm/migrations/v5/migrate.go b/x/evm/migrations/v5/migrate.go index cc3c1d2d02..842408848c 100644 --- a/x/evm/migrations/v5/migrate.go +++ b/x/evm/migrations/v5/migrate.go @@ -6,9 +6,9 @@ import ( "github.com/cosmos/cosmos-sdk/codec" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/x/evm/types" - v5types "github.com/evmos/evmos/v16/x/evm/migrations/v5/types" + v5types "github.com/evmos/evmos/v17/x/evm/migrations/v5/types" ) // MigrateStore migrates the x/evm module state from the consensus version 4 to diff --git a/x/evm/migrations/v5/migrate_test.go b/x/evm/migrations/v5/migrate_test.go index 6a824f48c4..3953f05ef4 100644 --- a/x/evm/migrations/v5/migrate_test.go +++ b/x/evm/migrations/v5/migrate_test.go @@ -22,11 +22,11 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/encoding" - v5 "github.com/evmos/evmos/v16/x/evm/migrations/v5" - v5types "github.com/evmos/evmos/v16/x/evm/migrations/v5/types" - "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/encoding" + v5 "github.com/evmos/evmos/v17/x/evm/migrations/v5" + v5types "github.com/evmos/evmos/v17/x/evm/migrations/v5/types" + "github.com/evmos/evmos/v17/x/evm/types" ) // AvailableExtraEIPs define the list of all EIPs that can be enabled by the diff --git a/x/evm/migrations/v6/migrate.go b/x/evm/migrations/v6/migrate.go index 7f1b42c59d..c6570e9cf9 100644 --- a/x/evm/migrations/v6/migrate.go +++ b/x/evm/migrations/v6/migrate.go @@ -6,10 +6,10 @@ import ( "github.com/cosmos/cosmos-sdk/codec" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/utils" - "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v17/x/evm/types" - v5types "github.com/evmos/evmos/v16/x/evm/migrations/v6/types" + v5types "github.com/evmos/evmos/v17/x/evm/migrations/v6/types" ) // MigrateStore migrates the x/evm module state from the consensus version 5 to diff --git a/x/evm/migrations/v6/migrate_test.go b/x/evm/migrations/v6/migrate_test.go index df1bb4b8e3..a9e1803c28 100644 --- a/x/evm/migrations/v6/migrate_test.go +++ b/x/evm/migrations/v6/migrate_test.go @@ -10,11 +10,11 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/encoding" - v6 "github.com/evmos/evmos/v16/x/evm/migrations/v6" - v5types "github.com/evmos/evmos/v16/x/evm/migrations/v6/types" - "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/encoding" + v6 "github.com/evmos/evmos/v17/x/evm/migrations/v6" + v5types "github.com/evmos/evmos/v17/x/evm/migrations/v6/types" + "github.com/evmos/evmos/v17/x/evm/types" ) func TestMigrate(t *testing.T) { diff --git a/x/evm/module.go b/x/evm/module.go index 18cc9b675b..0b38258ff8 100644 --- a/x/evm/module.go +++ b/x/evm/module.go @@ -20,9 +20,9 @@ import ( "github.com/cosmos/cosmos-sdk/types/module" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" - "github.com/evmos/evmos/v16/x/evm/client/cli" - "github.com/evmos/evmos/v16/x/evm/keeper" - "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/x/evm/client/cli" + "github.com/evmos/evmos/v17/x/evm/keeper" + "github.com/evmos/evmos/v17/x/evm/types" ) // consensusVersion defines the current x/evm module consensus version. diff --git a/x/evm/statedb/config.go b/x/evm/statedb/config.go index 1ec843c6b8..d87333b915 100644 --- a/x/evm/statedb/config.go +++ b/x/evm/statedb/config.go @@ -7,7 +7,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/params" - "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/x/evm/types" ) // TxConfig encapulates the readonly information of current tx for `StateDB`. diff --git a/x/evm/statedb/integration_test.go b/x/evm/statedb/integration_test.go index c9c74efe6c..1990e3fccb 100644 --- a/x/evm/statedb/integration_test.go +++ b/x/evm/statedb/integration_test.go @@ -9,13 +9,13 @@ import ( "cosmossdk.io/math" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/contracts" - stakingprecompile "github.com/evmos/evmos/v16/precompiles/staking" - testfactory "github.com/evmos/evmos/v16/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v16/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v16/testutil/integration/evmos/keyring" - testnetwork "github.com/evmos/evmos/v16/testutil/integration/evmos/network" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/contracts" + stakingprecompile "github.com/evmos/evmos/v17/precompiles/staking" + testfactory "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" + testnetwork "github.com/evmos/evmos/v17/testutil/integration/evmos/network" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" //nolint:revive // okay to use dot imports for Ginkgo . "github.com/onsi/ginkgo/v2" diff --git a/x/evm/statedb/mock_test.go b/x/evm/statedb/mock_test.go index e8d055cbfd..6a7d951d69 100644 --- a/x/evm/statedb/mock_test.go +++ b/x/evm/statedb/mock_test.go @@ -9,7 +9,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v16/x/evm/statedb" + "github.com/evmos/evmos/v17/x/evm/statedb" ) var ( diff --git a/x/evm/statedb/statedb_test.go b/x/evm/statedb/statedb_test.go index 8bc7183a6d..4a57bdaf29 100644 --- a/x/evm/statedb/statedb_test.go +++ b/x/evm/statedb/statedb_test.go @@ -9,7 +9,7 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v16/x/evm/statedb" + "github.com/evmos/evmos/v17/x/evm/statedb" "github.com/stretchr/testify/suite" ) diff --git a/x/evm/types/access_list_test.go b/x/evm/types/access_list_test.go index 87824f35b0..6ebdb631d0 100644 --- a/x/evm/types/access_list_test.go +++ b/x/evm/types/access_list_test.go @@ -3,7 +3,7 @@ package types_test import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/x/evm/types" ) func (suite *TxDataTestSuite) TestTestNewAccessList() { diff --git a/x/evm/types/access_list_tx.go b/x/evm/types/access_list_tx.go index 466adac994..d2fc2ac1f1 100644 --- a/x/evm/types/access_list_tx.go +++ b/x/evm/types/access_list_tx.go @@ -12,7 +12,7 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v16/types" + "github.com/evmos/evmos/v17/types" ) func newAccessListTx(tx *ethtypes.Transaction) (*AccessListTx, error) { diff --git a/x/evm/types/access_list_tx_test.go b/x/evm/types/access_list_tx_test.go index 50405fa7f8..33f5a28181 100644 --- a/x/evm/types/access_list_tx_test.go +++ b/x/evm/types/access_list_tx_test.go @@ -4,7 +4,7 @@ import ( "math/big" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/x/evm/types" ) func (suite *TxDataTestSuite) TestAccessListTxCopy() { diff --git a/x/evm/types/dynamic_fee_tx.go b/x/evm/types/dynamic_fee_tx.go index 05f1bc6819..fbaf559338 100644 --- a/x/evm/types/dynamic_fee_tx.go +++ b/x/evm/types/dynamic_fee_tx.go @@ -12,7 +12,7 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v16/types" + "github.com/evmos/evmos/v17/types" ) func NewDynamicFeeTx(tx *ethtypes.Transaction) (*DynamicFeeTx, error) { diff --git a/x/evm/types/dynamic_fee_tx_test.go b/x/evm/types/dynamic_fee_tx_test.go index a757720437..a8ce336766 100644 --- a/x/evm/types/dynamic_fee_tx_test.go +++ b/x/evm/types/dynamic_fee_tx_test.go @@ -10,8 +10,8 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/x/evm/types" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v17/x/evm/types" "github.com/stretchr/testify/suite" ) diff --git a/x/evm/types/events.pb.go b/x/evm/types/events.pb.go index 832c2fde06..4b8e656615 100644 --- a/x/evm/types/events.pb.go +++ b/x/evm/types/events.pb.go @@ -291,27 +291,27 @@ var fileDescriptor_432e0d592184bde3 = []byte{ // 365 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x44, 0x51, 0x4d, 0x6b, 0xdb, 0x40, 0x14, 0xb4, 0x6a, 0x5b, 0xae, 0xb7, 0x2d, 0x2d, 0x4b, 0x69, 0x55, 0x68, 0x85, 0x11, 0x34, 0xc9, - 0x49, 0xc2, 0x04, 0x72, 0x0e, 0x06, 0x87, 0x1c, 0x92, 0x4b, 0x50, 0x08, 0xe4, 0x22, 0x64, 0xeb, - 0x45, 0x2b, 0xa2, 0xd5, 0x0a, 0xed, 0x93, 0x58, 0xff, 0x8b, 0xfc, 0xac, 0x40, 0x2e, 0x3e, 0xe6, - 0x18, 0xec, 0x3f, 0x12, 0x76, 0xb5, 0x49, 0x2e, 0xcb, 0xce, 0xcc, 0xfb, 0x60, 0xde, 0x90, 0x7f, - 0x80, 0x0c, 0x1a, 0x5e, 0x54, 0x18, 0x41, 0xc7, 0xa3, 0x6e, 0x1e, 0x41, 0x07, 0x15, 0xca, 0xb0, - 0x6e, 0x04, 0x0a, 0xfa, 0xe3, 0x5d, 0x0e, 0xa1, 0xe3, 0x61, 0x37, 0x0f, 0x9e, 0x1c, 0xf2, 0x7d, - 0xa9, 0x4b, 0x96, 0x5a, 0x81, 0x96, 0xc7, 0x8a, 0xfe, 0x22, 0x6e, 0xca, 0x45, 0x5b, 0xa1, 0xe7, - 0xcc, 0x9c, 0xa3, 0xe9, 0x95, 0x45, 0xf4, 0x0f, 0xf9, 0x0c, 0xc8, 0x12, 0x96, 0x4a, 0xe6, 0x7d, - 0x32, 0xca, 0x04, 0x90, 0x9d, 0xa7, 0x92, 0xd1, 0x9f, 0x64, 0x5c, 0x54, 0x19, 0x28, 0x6f, 0x68, - 0xf8, 0x1e, 0xe8, 0x86, 0x3c, 0x95, 0x49, 0x2b, 0x21, 0xf3, 0x46, 0x7d, 0x43, 0x9e, 0xca, 0x6b, - 0x09, 0x19, 0xa5, 0x64, 0x64, 0xe6, 0x8c, 0x0d, 0x6d, 0xfe, 0xf4, 0x2f, 0x99, 0x36, 0xb0, 0x2e, - 0xea, 0x02, 0x2a, 0xf4, 0x5c, 0x23, 0x7c, 0x10, 0x34, 0x20, 0xdf, 0xf4, 0x76, 0x54, 0xc9, 0x5d, - 0x5a, 0x94, 0x90, 0x79, 0x13, 0x53, 0xf1, 0x05, 0x90, 0xc5, 0xea, 0xcc, 0x50, 0xc1, 0x7f, 0x42, - 0x8c, 0x99, 0x58, 0x5d, 0x88, 0x9c, 0xfe, 0x26, 0x13, 0x54, 0x49, 0x29, 0x72, 0xe9, 0x39, 0xb3, - 0xa1, 0x36, 0x82, 0x9a, 0x97, 0xc1, 0x0d, 0xf9, 0x6a, 0xca, 0x2e, 0x41, 0xca, 0x34, 0x07, 0x6d, - 0x98, 0x8b, 0xac, 0x2d, 0xe1, 0xcd, 0x70, 0x8f, 0x34, 0x2f, 0xa1, 0xca, 0xa0, 0xb1, 0x76, 0x2d, - 0xb2, 0x83, 0x71, 0x53, 0x83, 0xf5, 0xeb, 0xa2, 0x8a, 0x37, 0x35, 0x04, 0x87, 0xf6, 0x98, 0x8b, - 0x52, 0xac, 0xef, 0x17, 0xa5, 0x10, 0x5c, 0x5f, 0x66, 0xa5, 0x3f, 0x76, 0x74, 0x0f, 0x16, 0xa7, - 0x8f, 0x3b, 0xdf, 0xd9, 0xee, 0x7c, 0xe7, 0x65, 0xe7, 0x3b, 0x0f, 0x7b, 0x7f, 0xb0, 0xdd, 0xfb, - 0x83, 0xe7, 0xbd, 0x3f, 0xb8, 0x3d, 0xc8, 0x0b, 0x64, 0xed, 0x2a, 0x5c, 0x0b, 0xae, 0x23, 0x14, - 0xd2, 0xbe, 0xdd, 0xfc, 0x24, 0x52, 0x26, 0x54, 0xbd, 0x57, 0xae, 0x5c, 0x93, 0xe8, 0xf1, 0x6b, - 0x00, 0x00, 0x00, 0xff, 0xff, 0x98, 0x9c, 0x05, 0x19, 0xf2, 0x01, 0x00, 0x00, + 0x49, 0xc2, 0xe4, 0x90, 0x6b, 0x30, 0x38, 0xe4, 0x90, 0x5c, 0x82, 0x42, 0x20, 0x17, 0x21, 0x5b, + 0x2f, 0x5a, 0x11, 0xad, 0x56, 0x68, 0x9f, 0xc4, 0xfa, 0x5f, 0xe4, 0x67, 0x05, 0x72, 0xf1, 0x31, + 0xc7, 0x60, 0xff, 0x91, 0xb0, 0xab, 0x4d, 0x72, 0x59, 0x76, 0x66, 0xde, 0x07, 0xf3, 0x86, 0xfc, + 0x03, 0x64, 0xd0, 0xf0, 0xa2, 0xc2, 0x08, 0x3a, 0x1e, 0x75, 0xf3, 0x08, 0x3a, 0xa8, 0x50, 0x86, + 0x75, 0x23, 0x50, 0xd0, 0x1f, 0xef, 0x72, 0x08, 0x1d, 0x0f, 0xbb, 0x79, 0xf0, 0xe4, 0x90, 0xef, + 0x4b, 0x5d, 0xb2, 0xd4, 0x0a, 0xb4, 0x3c, 0x56, 0xf4, 0x17, 0x71, 0x53, 0x2e, 0xda, 0x0a, 0x3d, + 0x67, 0xe6, 0x1c, 0x4d, 0xaf, 0x2c, 0xa2, 0x7f, 0xc8, 0x67, 0x40, 0x96, 0xb0, 0x54, 0x32, 0xef, + 0x93, 0x51, 0x26, 0x80, 0xec, 0x3c, 0x95, 0x8c, 0xfe, 0x24, 0xe3, 0xa2, 0xca, 0x40, 0x79, 0x43, + 0xc3, 0xf7, 0x40, 0x37, 0xe4, 0xa9, 0x4c, 0x5a, 0x09, 0x99, 0x37, 0xea, 0x1b, 0xf2, 0x54, 0x5e, + 0x4b, 0xc8, 0x28, 0x25, 0x23, 0x33, 0x67, 0x6c, 0x68, 0xf3, 0xa7, 0x7f, 0xc9, 0xb4, 0x81, 0x75, + 0x51, 0x17, 0x50, 0xa1, 0xe7, 0x1a, 0xe1, 0x83, 0xa0, 0x01, 0xf9, 0xa6, 0xb7, 0xa3, 0x4a, 0xee, + 0xd2, 0xa2, 0x84, 0xcc, 0x9b, 0x98, 0x8a, 0x2f, 0x80, 0x2c, 0x56, 0x67, 0x86, 0x0a, 0xfe, 0x13, + 0x62, 0xcc, 0xc4, 0xea, 0x42, 0xe4, 0xf4, 0x37, 0x99, 0xa0, 0x4a, 0x4a, 0x91, 0x4b, 0xcf, 0x99, + 0x0d, 0xb5, 0x11, 0xd4, 0xbc, 0x0c, 0x6e, 0xc8, 0x57, 0x53, 0x76, 0x09, 0x52, 0xa6, 0x39, 0x68, + 0xc3, 0x5c, 0x64, 0x6d, 0x09, 0x6f, 0x86, 0x7b, 0xa4, 0x79, 0x09, 0x55, 0x06, 0x8d, 0xb5, 0x6b, + 0x91, 0x1d, 0x8c, 0x9b, 0x1a, 0xac, 0x5f, 0x17, 0x55, 0xbc, 0xa9, 0x21, 0x38, 0xb4, 0xc7, 0x5c, + 0x94, 0x62, 0x7d, 0xbf, 0x28, 0x85, 0xe0, 0xfa, 0x32, 0x2b, 0xfd, 0xb1, 0xa3, 0x7b, 0xb0, 0x38, + 0x7d, 0xdc, 0xf9, 0xce, 0x76, 0xe7, 0x3b, 0x2f, 0x3b, 0xdf, 0x79, 0xd8, 0xfb, 0x83, 0xed, 0xde, + 0x1f, 0x3c, 0xef, 0xfd, 0xc1, 0xed, 0x41, 0x5e, 0x20, 0x6b, 0x57, 0xe1, 0x5a, 0x70, 0x1d, 0xa1, + 0x90, 0xf6, 0xed, 0xe6, 0x27, 0x91, 0x32, 0xa1, 0xea, 0xbd, 0x72, 0xe5, 0x9a, 0x44, 0x8f, 0x5f, + 0x03, 0x00, 0x00, 0xff, 0xff, 0x06, 0x1f, 0xdf, 0x86, 0xf2, 0x01, 0x00, 0x00, } func (m *EventEthereumTx) Marshal() (dAtA []byte, err error) { diff --git a/x/evm/types/evm.pb.go b/x/evm/types/evm.pb.go index 2ac9867d75..61694a80be 100644 --- a/x/evm/types/evm.pb.go +++ b/x/evm/types/evm.pb.go @@ -708,111 +708,111 @@ func init() { func init() { proto.RegisterFile("ethermint/evm/v1/evm.proto", fileDescriptor_d21ecc92c8c8583e) } var fileDescriptor_d21ecc92c8c8583e = []byte{ - // 1662 bytes of a gzipped FileDescriptorProto + // 1661 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x57, 0xcd, 0x4f, 0x23, 0xc9, 0x15, 0x07, 0x6c, 0xa0, 0x5d, 0x36, 0x76, 0x53, 0x18, 0xd6, 0x3b, 0xa3, 0xd0, 0xa4, 0x0f, 0x11, - 0x91, 0x76, 0x61, 0x60, 0xc2, 0xee, 0x68, 0x57, 0xf9, 0x98, 0x9e, 0x61, 0x13, 0xc8, 0xec, 0x06, - 0x15, 0x6c, 0xa2, 0x44, 0x89, 0x5a, 0xe5, 0xee, 0xda, 0x76, 0x2f, 0xdd, 0x5d, 0x56, 0x55, 0xb5, - 0xc7, 0xce, 0x5f, 0x10, 0x29, 0x97, 0xfc, 0x09, 0xfb, 0xe7, 0xac, 0x72, 0x9a, 0x63, 0x94, 0x43, - 0x2b, 0x62, 0x6e, 0x28, 0x27, 0xee, 0x91, 0xa2, 0xfa, 0x70, 0xfb, 0x03, 0x42, 0x7c, 0x81, 0xfa, + 0x91, 0x76, 0x61, 0x60, 0x42, 0x66, 0xb4, 0xab, 0x7c, 0x4c, 0xcf, 0xb0, 0x09, 0x64, 0x76, 0x83, + 0x0a, 0x36, 0x51, 0xa2, 0x44, 0xad, 0x72, 0x77, 0x6d, 0xbb, 0x97, 0xee, 0x2e, 0xab, 0xaa, 0xda, + 0x63, 0xe7, 0x2f, 0x88, 0x94, 0x4b, 0xfe, 0x84, 0xfd, 0x73, 0x56, 0x39, 0xed, 0x31, 0xca, 0xa1, + 0x15, 0x31, 0x37, 0x94, 0x13, 0xf7, 0x48, 0x51, 0x7d, 0xb8, 0xfd, 0x01, 0x61, 0x7d, 0x81, 0xfa, 0xbd, 0x8f, 0xdf, 0xab, 0xf7, 0xea, 0xb5, 0x5f, 0x15, 0x78, 0x42, 0x44, 0x8f, 0xb0, 0x34, 0xce, 0xc4, 0x21, 0x19, 0xa4, 0x87, 0x83, 0x23, 0xf9, 0xef, 0xa0, 0xcf, 0xa8, 0xa0, 0xd0, 0x2e, 0x75, 0x07, 0x52, 0x38, 0x38, 0x7a, 0xd2, 0x8e, 0x68, 0x44, 0x95, 0xf2, 0x50, 0xae, 0xb4, 0x9d, 0xfb, - 0xef, 0x0a, 0x58, 0xbb, 0xc0, 0x0c, 0xa7, 0x1c, 0x1e, 0x81, 0x1a, 0x19, 0xa4, 0x7e, 0x48, 0x32, - 0x9a, 0x76, 0x96, 0xf7, 0x96, 0xf7, 0x6b, 0x5e, 0xfb, 0xae, 0x70, 0xec, 0x11, 0x4e, 0x93, 0xcf, - 0xdc, 0x52, 0xe5, 0x22, 0x8b, 0x0c, 0xd2, 0xd7, 0x72, 0x09, 0x7f, 0x0a, 0x36, 0x48, 0x86, 0xbb, + 0x9f, 0x0a, 0x58, 0xbb, 0xc0, 0x0c, 0xa7, 0x1c, 0x1e, 0x81, 0x1a, 0x19, 0xa4, 0x7e, 0x48, 0x32, + 0x9a, 0x76, 0x96, 0xf7, 0x96, 0xf7, 0x6b, 0x5e, 0xfb, 0xae, 0x70, 0xec, 0x11, 0x4e, 0x93, 0x4f, + 0xdc, 0x52, 0xe5, 0x22, 0x8b, 0x0c, 0xd2, 0x37, 0x72, 0x09, 0x7f, 0x06, 0x36, 0x48, 0x86, 0xbb, 0x09, 0xf1, 0x03, 0x46, 0xb0, 0x20, 0x9d, 0x95, 0xbd, 0xe5, 0x7d, 0xcb, 0xeb, 0xdc, 0x15, 0x4e, - 0xdb, 0xb8, 0x4d, 0xab, 0x5d, 0xd4, 0xd0, 0xf8, 0x95, 0x82, 0xf0, 0x53, 0x50, 0x1f, 0xeb, 0x71, - 0x92, 0x74, 0x2a, 0xca, 0x79, 0xe7, 0xae, 0x70, 0xe0, 0xac, 0x33, 0x4e, 0x12, 0x17, 0x01, 0xe3, - 0x8a, 0x93, 0x04, 0xbe, 0x04, 0x80, 0x0c, 0x05, 0xc3, 0x3e, 0x89, 0xfb, 0xbc, 0x53, 0xdd, 0xab, - 0xec, 0x57, 0x3c, 0xf7, 0xa6, 0x70, 0x6a, 0xa7, 0x52, 0x7a, 0x7a, 0x76, 0xc1, 0xef, 0x0a, 0x67, - 0xd3, 0x90, 0x94, 0x86, 0x2e, 0xaa, 0x29, 0x70, 0x1a, 0xf7, 0x39, 0xfc, 0x13, 0x68, 0x04, 0x3d, - 0x1c, 0x67, 0x7e, 0x40, 0xb3, 0x6f, 0xe2, 0xa8, 0xb3, 0xba, 0xb7, 0xbc, 0x5f, 0x3f, 0xfe, 0xc1, - 0xc1, 0x7c, 0xdd, 0x0e, 0x5e, 0x49, 0xab, 0x57, 0xca, 0xc8, 0x7b, 0xfa, 0x7d, 0xe1, 0x2c, 0xdd, - 0x15, 0xce, 0x96, 0xa6, 0x9e, 0x26, 0x70, 0x51, 0x3d, 0x98, 0x58, 0xc2, 0x63, 0xb0, 0x8d, 0x93, - 0x84, 0xbe, 0xf5, 0xf3, 0x4c, 0x16, 0x9a, 0x04, 0x82, 0x84, 0xbe, 0x18, 0xf2, 0xce, 0x9a, 0x4c, - 0x12, 0x6d, 0x29, 0xe5, 0xd7, 0x13, 0xdd, 0xd5, 0x90, 0xc3, 0x8f, 0x01, 0xc4, 0x81, 0x88, 0x07, - 0xc4, 0xef, 0x33, 0x12, 0xd0, 0xb4, 0x1f, 0x27, 0x84, 0x77, 0xd6, 0xf7, 0x2a, 0xfb, 0x35, 0xb4, - 0xa9, 0x35, 0x17, 0x13, 0x05, 0x3c, 0x06, 0x0d, 0x79, 0x28, 0x41, 0x0f, 0x67, 0x19, 0x49, 0x78, - 0xc7, 0x92, 0x86, 0x5e, 0xeb, 0xa6, 0x70, 0xea, 0xa7, 0xbf, 0xfd, 0xf2, 0x95, 0x11, 0xa3, 0x3a, - 0x19, 0xa4, 0x63, 0xe0, 0xfe, 0xa7, 0x09, 0xea, 0x53, 0x09, 0xc1, 0x3f, 0x82, 0x56, 0x8f, 0xa6, - 0x84, 0x0b, 0x82, 0x43, 0xbf, 0x9b, 0xd0, 0xe0, 0xda, 0x9c, 0xfc, 0xf3, 0x7f, 0x16, 0xce, 0x76, - 0x40, 0x79, 0x4a, 0x39, 0x0f, 0xaf, 0x0f, 0x62, 0x7a, 0x98, 0x62, 0xd1, 0x3b, 0x38, 0xcb, 0xc4, - 0x5d, 0xe1, 0xec, 0xe8, 0xf4, 0xe7, 0x3c, 0x5d, 0xd4, 0x2c, 0x25, 0x9e, 0x14, 0xc0, 0x1e, 0x68, - 0x86, 0x98, 0xfa, 0xdf, 0x50, 0x76, 0x6d, 0xc8, 0x57, 0x14, 0xb9, 0xf7, 0x3f, 0xc9, 0x6f, 0x0a, - 0xa7, 0xf1, 0xfa, 0xe5, 0x6f, 0xbe, 0xa0, 0xec, 0x5a, 0x51, 0xdc, 0x15, 0xce, 0xb6, 0x0e, 0x36, - 0x4b, 0xe4, 0xa2, 0x46, 0x88, 0x69, 0x69, 0x06, 0x7f, 0x07, 0xec, 0xd2, 0x80, 0xe7, 0xfd, 0x3e, - 0x65, 0xc2, 0xb4, 0xd3, 0xc7, 0x37, 0x85, 0xd3, 0x34, 0x94, 0x97, 0x5a, 0x73, 0x57, 0x38, 0x1f, - 0xcc, 0x91, 0x1a, 0x1f, 0x17, 0x35, 0x0d, 0xad, 0x31, 0x85, 0x5d, 0xd0, 0x20, 0x71, 0xff, 0xe8, - 0xe4, 0x99, 0x49, 0xa0, 0xaa, 0x12, 0xf8, 0xf9, 0x63, 0x09, 0xd4, 0x4f, 0xcf, 0x2e, 0x8e, 0x4e, - 0x9e, 0x8d, 0xf7, 0x6f, 0x7a, 0x65, 0x9a, 0xc5, 0x45, 0x75, 0x0d, 0xf5, 0xe6, 0xcf, 0x80, 0x81, - 0x7e, 0x0f, 0xf3, 0x9e, 0xea, 0xc4, 0x9a, 0xb7, 0x7f, 0x53, 0x38, 0x40, 0x33, 0xfd, 0x0a, 0xf3, - 0xde, 0xa4, 0xea, 0xdd, 0xd1, 0x9f, 0x71, 0x26, 0xe2, 0x3c, 0x1d, 0x73, 0x01, 0xed, 0x2c, 0xad, - 0xca, 0xed, 0x9e, 0x98, 0xed, 0xae, 0x2d, 0xba, 0xdd, 0x93, 0x87, 0xb6, 0x7b, 0x32, 0xbb, 0x5d, - 0x6d, 0x53, 0xc6, 0x78, 0x61, 0x62, 0xac, 0x2f, 0x1a, 0xe3, 0xc5, 0x43, 0x31, 0x5e, 0xcc, 0xc6, - 0xd0, 0x36, 0xb2, 0x2f, 0xe7, 0xf2, 0xec, 0x58, 0x0b, 0xf7, 0xe5, 0xbd, 0x0a, 0x35, 0x4b, 0x89, - 0x66, 0xbf, 0x06, 0xed, 0x80, 0x66, 0x5c, 0x48, 0x59, 0x46, 0xfb, 0x09, 0x31, 0x21, 0x6a, 0x2a, - 0xc4, 0x8b, 0xc7, 0x42, 0x3c, 0x35, 0x5f, 0xfe, 0x03, 0xee, 0x2e, 0xda, 0x9a, 0x15, 0xeb, 0x60, - 0x3e, 0xb0, 0xfb, 0x44, 0x10, 0xc6, 0xbb, 0x39, 0x8b, 0x4c, 0x20, 0xa0, 0x02, 0xfd, 0xe4, 0xb1, - 0x40, 0xa6, 0x43, 0xe7, 0x5d, 0x5d, 0xd4, 0x9a, 0x88, 0x74, 0x80, 0xdf, 0x83, 0x66, 0x2c, 0xa3, - 0x76, 0xf3, 0xc4, 0xd0, 0xd7, 0x15, 0xfd, 0xf1, 0x63, 0xf4, 0xe6, 0xab, 0x9a, 0x75, 0x74, 0xd1, - 0xc6, 0x58, 0xa0, 0xa9, 0x43, 0x00, 0xd3, 0x3c, 0x66, 0x7e, 0x94, 0xe0, 0x20, 0x26, 0xcc, 0xd0, - 0x37, 0x14, 0xfd, 0x27, 0x8f, 0xd1, 0x7f, 0xa8, 0xe9, 0xef, 0x3b, 0xbb, 0xc8, 0x96, 0xc2, 0x5f, - 0x6a, 0x99, 0x8e, 0x72, 0x09, 0x1a, 0x5d, 0xc2, 0x92, 0x38, 0x33, 0xfc, 0x1b, 0x8a, 0xff, 0xd9, + 0xdb, 0xb8, 0x4d, 0xab, 0x5d, 0xd4, 0xd0, 0xf8, 0xb5, 0x82, 0xf0, 0x05, 0xa8, 0x8f, 0xf5, 0x38, + 0x49, 0x3a, 0x15, 0xe5, 0xbc, 0x73, 0x57, 0x38, 0x70, 0xd6, 0x19, 0x27, 0x89, 0x8b, 0x80, 0x71, + 0xc5, 0x49, 0x02, 0x5f, 0x01, 0x40, 0x86, 0x82, 0x61, 0x9f, 0xc4, 0x7d, 0xde, 0xa9, 0xee, 0x55, + 0xf6, 0x2b, 0x9e, 0x7b, 0x53, 0x38, 0xb5, 0x53, 0x29, 0x3d, 0x3d, 0xbb, 0xe0, 0x77, 0x85, 0xb3, + 0x69, 0x48, 0x4a, 0x43, 0x17, 0xd5, 0x14, 0x38, 0x8d, 0xfb, 0x1c, 0xfe, 0x19, 0x34, 0x82, 0x1e, + 0x8e, 0x33, 0x3f, 0xa0, 0xd9, 0x57, 0x71, 0xd4, 0x59, 0xdd, 0x5b, 0xde, 0xaf, 0x1f, 0xff, 0xe0, + 0x60, 0xbe, 0x6e, 0x07, 0xaf, 0xa5, 0xd5, 0x6b, 0x65, 0xe4, 0x3d, 0xfd, 0xb6, 0x70, 0x96, 0xee, + 0x0a, 0x67, 0x4b, 0x53, 0x4f, 0x13, 0xb8, 0xa8, 0x1e, 0x4c, 0x2c, 0xe1, 0x31, 0xd8, 0xc6, 0x49, + 0x42, 0xdf, 0xf9, 0x79, 0x26, 0x0b, 0x4d, 0x02, 0x41, 0x42, 0x5f, 0x0c, 0x79, 0x67, 0x4d, 0x26, + 0x89, 0xb6, 0x94, 0xf2, 0xcb, 0x89, 0xee, 0x6a, 0xc8, 0xe1, 0xc7, 0x00, 0xe2, 0x40, 0xc4, 0x03, + 0xe2, 0xf7, 0x19, 0x09, 0x68, 0xda, 0x8f, 0x13, 0xc2, 0x3b, 0xeb, 0x7b, 0x95, 0xfd, 0x1a, 0xda, + 0xd4, 0x9a, 0x8b, 0x89, 0x02, 0x1e, 0x83, 0x86, 0x3c, 0x94, 0xa0, 0x87, 0xb3, 0x8c, 0x24, 0xbc, + 0x63, 0x49, 0x43, 0xaf, 0x75, 0x53, 0x38, 0xf5, 0xd3, 0xdf, 0x7d, 0xfe, 0xda, 0x88, 0x51, 0x9d, + 0x0c, 0xd2, 0x31, 0x70, 0xff, 0xdb, 0x04, 0xf5, 0xa9, 0x84, 0xe0, 0x9f, 0x40, 0xab, 0x47, 0x53, + 0xc2, 0x05, 0xc1, 0xa1, 0xdf, 0x4d, 0x68, 0x70, 0x6d, 0x4e, 0xfe, 0xf9, 0xbf, 0x0a, 0x67, 0x3b, + 0xa0, 0x3c, 0xa5, 0x9c, 0x87, 0xd7, 0x07, 0x31, 0x3d, 0x4c, 0xb1, 0xe8, 0x1d, 0x9c, 0x65, 0xe2, + 0xae, 0x70, 0x76, 0x74, 0xfa, 0x73, 0x9e, 0x2e, 0x6a, 0x96, 0x12, 0x4f, 0x0a, 0x60, 0x0f, 0x34, + 0x43, 0x4c, 0xfd, 0xaf, 0x28, 0xbb, 0x36, 0xe4, 0x2b, 0x8a, 0xdc, 0xfb, 0xbf, 0xe4, 0x37, 0x85, + 0xd3, 0x78, 0xf3, 0xea, 0xb7, 0x9f, 0x51, 0x76, 0xad, 0x28, 0xee, 0x0a, 0x67, 0x5b, 0x07, 0x9b, + 0x25, 0x72, 0x51, 0x23, 0xc4, 0xb4, 0x34, 0x83, 0xbf, 0x07, 0x76, 0x69, 0xc0, 0xf3, 0x7e, 0x9f, + 0x32, 0x61, 0xda, 0xe9, 0xe3, 0x9b, 0xc2, 0x69, 0x1a, 0xca, 0x4b, 0xad, 0xb9, 0x2b, 0x9c, 0x0f, + 0xe6, 0x48, 0x8d, 0x8f, 0x8b, 0x9a, 0x86, 0xd6, 0x98, 0xc2, 0x2e, 0x68, 0x90, 0xb8, 0x7f, 0x74, + 0xf2, 0xcc, 0x24, 0x50, 0x55, 0x09, 0xfc, 0xe2, 0xb1, 0x04, 0xea, 0xa7, 0x67, 0x17, 0x47, 0x27, + 0xcf, 0xc6, 0xfb, 0x37, 0xbd, 0x32, 0xcd, 0xe2, 0xa2, 0xba, 0x86, 0x7a, 0xf3, 0x67, 0xc0, 0x40, + 0xbf, 0x87, 0x79, 0x4f, 0x75, 0x62, 0xcd, 0xdb, 0xbf, 0x29, 0x1c, 0xa0, 0x99, 0x7e, 0x8d, 0x79, + 0x6f, 0x52, 0xf5, 0xee, 0xe8, 0x2f, 0x38, 0x13, 0x71, 0x9e, 0x8e, 0xb9, 0x80, 0x76, 0x96, 0x56, + 0xe5, 0x76, 0x4f, 0xcc, 0x76, 0xd7, 0x16, 0xdd, 0xee, 0xc9, 0x43, 0xdb, 0x3d, 0x99, 0xdd, 0xae, + 0xb6, 0x29, 0x63, 0xbc, 0x34, 0x31, 0xd6, 0x17, 0x8d, 0xf1, 0xf2, 0xa1, 0x18, 0x2f, 0x67, 0x63, + 0x68, 0x1b, 0xd9, 0x97, 0x73, 0x79, 0x76, 0xac, 0x85, 0xfb, 0xf2, 0x5e, 0x85, 0x9a, 0xa5, 0x44, + 0xb3, 0x5f, 0x83, 0x76, 0x40, 0x33, 0x2e, 0xa4, 0x2c, 0xa3, 0xfd, 0x84, 0x98, 0x10, 0x35, 0x15, + 0xe2, 0xe5, 0x63, 0x21, 0x9e, 0x9a, 0x2f, 0xff, 0x01, 0x77, 0x17, 0x6d, 0xcd, 0x8a, 0x75, 0x30, + 0x1f, 0xd8, 0x7d, 0x22, 0x08, 0xe3, 0xdd, 0x9c, 0x45, 0x26, 0x10, 0x50, 0x81, 0x7e, 0xf2, 0x58, + 0x20, 0xd3, 0xa1, 0xf3, 0xae, 0x2e, 0x6a, 0x4d, 0x44, 0x3a, 0xc0, 0x1f, 0x40, 0x33, 0x96, 0x51, + 0xbb, 0x79, 0x62, 0xe8, 0xeb, 0x8a, 0xfe, 0xf8, 0x31, 0x7a, 0xf3, 0x55, 0xcd, 0x3a, 0xba, 0x68, + 0x63, 0x2c, 0xd0, 0xd4, 0x21, 0x80, 0x69, 0x1e, 0x33, 0x3f, 0x4a, 0x70, 0x10, 0x13, 0x66, 0xe8, + 0x1b, 0x8a, 0xfe, 0xa7, 0x8f, 0xd1, 0x7f, 0xa8, 0xe9, 0xef, 0x3b, 0xbb, 0xc8, 0x96, 0xc2, 0x5f, + 0x69, 0x99, 0x8e, 0x72, 0x09, 0x1a, 0x5d, 0xc2, 0x92, 0x38, 0x33, 0xfc, 0x1b, 0x8a, 0xff, 0xd9, 0x63, 0xfc, 0xa6, 0x83, 0xa6, 0xdd, 0x5c, 0x54, 0xd7, 0xb0, 0x24, 0x4d, 0x68, 0x16, 0xd2, 0x31, 0xe9, 0xe6, 0xc2, 0xa4, 0xd3, 0x6e, 0x2e, 0xaa, 0x6b, 0xa8, 0x49, 0x23, 0xb0, 0x85, 0x19, 0xa3, - 0x6f, 0xe7, 0x0a, 0x02, 0x15, 0xf7, 0xa7, 0x8f, 0x71, 0x3f, 0xd1, 0xdc, 0x0f, 0x78, 0xbb, 0x68, - 0x53, 0x49, 0x67, 0x4a, 0x12, 0x02, 0x18, 0x31, 0x3c, 0x9a, 0x8b, 0xd3, 0x5e, 0xb8, 0xf0, 0xf7, - 0x9d, 0x5d, 0x64, 0x4b, 0xe1, 0x4c, 0x94, 0x6f, 0x41, 0x3b, 0x25, 0x2c, 0x22, 0x7e, 0x46, 0x04, - 0xef, 0x27, 0xb1, 0x30, 0x71, 0xb6, 0x17, 0xfe, 0x0e, 0x1e, 0x72, 0x77, 0x11, 0x54, 0xe2, 0xaf, - 0x8c, 0xb4, 0xec, 0x52, 0xde, 0xc3, 0x59, 0xd4, 0xc3, 0xb1, 0x89, 0xb2, 0xb3, 0x70, 0x97, 0xce, - 0x3a, 0xba, 0x68, 0x63, 0x2c, 0x28, 0x8f, 0x3a, 0xc0, 0x59, 0x90, 0x8f, 0x8f, 0xfa, 0x83, 0x85, - 0x8f, 0x7a, 0xda, 0x4d, 0x0e, 0x70, 0x05, 0x15, 0xe9, 0x79, 0xd5, 0x6a, 0xda, 0xad, 0xf3, 0xaa, - 0xd5, 0xb2, 0xed, 0xf3, 0xaa, 0x65, 0xdb, 0x9b, 0xe7, 0x55, 0x6b, 0xcb, 0x6e, 0xa3, 0x8d, 0x11, - 0x4d, 0xa8, 0x3f, 0x78, 0xae, 0x9d, 0x50, 0x9d, 0xbc, 0xc5, 0xdc, 0xfc, 0xd0, 0xa0, 0x66, 0x80, - 0x05, 0x4e, 0x46, 0xdc, 0x14, 0x02, 0xd9, 0xba, 0x3c, 0x53, 0x63, 0xeb, 0x10, 0xac, 0x5e, 0x0a, - 0x79, 0xf5, 0xb1, 0x41, 0xe5, 0x9a, 0x8c, 0xf4, 0xb0, 0x45, 0x72, 0x09, 0xdb, 0x60, 0x75, 0x80, - 0x93, 0x5c, 0xdf, 0xa1, 0x6a, 0x48, 0x03, 0xf7, 0x02, 0xb4, 0xae, 0x18, 0xce, 0xb8, 0x1c, 0xff, - 0x34, 0x7b, 0x43, 0x23, 0x0e, 0x21, 0xa8, 0xaa, 0x39, 0xa1, 0x7d, 0xd5, 0x1a, 0xfe, 0x18, 0x54, - 0x13, 0x1a, 0xf1, 0xce, 0xca, 0x5e, 0x65, 0xbf, 0x7e, 0xbc, 0x7d, 0xff, 0x16, 0xf3, 0x86, 0x46, - 0x48, 0x99, 0xb8, 0x7f, 0x5f, 0x01, 0x95, 0x37, 0x34, 0x82, 0x1d, 0xb0, 0x8e, 0xc3, 0x90, 0x11, - 0xce, 0x0d, 0xd3, 0x18, 0xc2, 0x1d, 0xb0, 0x26, 0x68, 0x3f, 0x0e, 0x34, 0x5d, 0x0d, 0x19, 0x24, - 0x03, 0x87, 0x58, 0x60, 0x35, 0x58, 0x1b, 0x48, 0xad, 0xe5, 0x25, 0x44, 0x65, 0xe6, 0x67, 0x79, - 0xda, 0x25, 0x4c, 0xcd, 0xc7, 0xaa, 0xd7, 0xba, 0x2d, 0x9c, 0xba, 0x92, 0x7f, 0xa5, 0xc4, 0x68, - 0x1a, 0xc0, 0x8f, 0xc0, 0xba, 0x18, 0x4e, 0xcf, 0xba, 0xad, 0xdb, 0xc2, 0x69, 0x89, 0x49, 0x9a, - 0x72, 0x94, 0xa1, 0x35, 0x31, 0x54, 0x23, 0xed, 0x10, 0x58, 0x62, 0xe8, 0xc7, 0x59, 0x48, 0x86, - 0x6a, 0x9c, 0x55, 0xbd, 0xf6, 0x6d, 0xe1, 0xd8, 0x53, 0xe6, 0x67, 0x52, 0x87, 0xd6, 0xc5, 0x50, - 0x2d, 0xe0, 0x47, 0x00, 0xe8, 0x2d, 0xa9, 0x08, 0x7a, 0x3a, 0x6d, 0xdc, 0x16, 0x4e, 0x4d, 0x49, - 0x15, 0xf7, 0x64, 0x09, 0x5d, 0xb0, 0xaa, 0xb9, 0x2d, 0xc5, 0xdd, 0xb8, 0x2d, 0x1c, 0x2b, 0xa1, - 0x91, 0xe6, 0xd4, 0x2a, 0x59, 0x2a, 0x46, 0x52, 0x3a, 0x20, 0xa1, 0x1a, 0x11, 0x16, 0x1a, 0x43, - 0xf7, 0xaf, 0x2b, 0xc0, 0xba, 0x1a, 0x22, 0xc2, 0xf3, 0x44, 0xc0, 0x2f, 0x80, 0x1d, 0xd0, 0x4c, - 0x30, 0x1c, 0x08, 0x7f, 0xa6, 0xb4, 0xde, 0xd3, 0xc9, 0x0f, 0xfa, 0xbc, 0x85, 0x8b, 0x5a, 0x63, - 0xd1, 0x4b, 0x53, 0xff, 0x36, 0x58, 0xed, 0x26, 0x94, 0xa6, 0xaa, 0x13, 0x1a, 0x48, 0x03, 0x88, - 0x54, 0xd5, 0xd4, 0x29, 0x57, 0xd4, 0x5d, 0xf5, 0x87, 0xf7, 0x4f, 0x79, 0xae, 0x55, 0xbc, 0x1d, - 0x73, 0x5f, 0x6d, 0xea, 0xd8, 0xc6, 0xdf, 0x95, 0xb5, 0x55, 0xad, 0x64, 0x83, 0x0a, 0x23, 0x42, - 0x1d, 0x5a, 0x03, 0xc9, 0x25, 0x7c, 0x02, 0x2c, 0x46, 0x06, 0x84, 0x09, 0x12, 0xaa, 0xc3, 0xb1, - 0x50, 0x89, 0xe1, 0x87, 0xc0, 0x8a, 0x30, 0xf7, 0x73, 0x4e, 0x42, 0x7d, 0x12, 0x68, 0x3d, 0xc2, - 0xfc, 0x6b, 0x4e, 0xc2, 0xcf, 0xaa, 0x7f, 0xf9, 0xce, 0x59, 0x72, 0x31, 0xa8, 0xbf, 0x0c, 0x02, - 0xc2, 0xf9, 0x55, 0xde, 0x4f, 0xc8, 0x23, 0x1d, 0x76, 0x0c, 0x1a, 0x5c, 0x50, 0x86, 0x23, 0xe2, - 0x5f, 0x93, 0x91, 0xe9, 0x33, 0xdd, 0x35, 0x46, 0xfe, 0x6b, 0x32, 0xe2, 0x68, 0x1a, 0x98, 0x10, - 0xdf, 0x55, 0x41, 0xfd, 0x8a, 0xe1, 0x80, 0x98, 0x0b, 0xac, 0xec, 0x55, 0x09, 0x99, 0x09, 0x61, - 0x90, 0x8c, 0x2d, 0xe2, 0x94, 0xd0, 0x5c, 0x98, 0xef, 0x69, 0x0c, 0xa5, 0x07, 0x23, 0x64, 0x48, - 0x02, 0x55, 0xc6, 0x2a, 0x32, 0x08, 0x9e, 0x80, 0x8d, 0x30, 0xe6, 0xea, 0xc1, 0xc1, 0x05, 0x0e, - 0xae, 0x75, 0xfa, 0x9e, 0x7d, 0x5b, 0x38, 0x0d, 0xa3, 0xb8, 0x94, 0x72, 0x34, 0x83, 0xe0, 0xe7, - 0xa0, 0x35, 0x71, 0x53, 0xbb, 0xd5, 0x57, 0x7c, 0x0f, 0xde, 0x16, 0x4e, 0xb3, 0x34, 0x55, 0x1a, - 0x34, 0x87, 0xe5, 0x49, 0x87, 0xa4, 0x9b, 0x47, 0xaa, 0xf9, 0x2c, 0xa4, 0x81, 0x94, 0x26, 0x71, - 0x1a, 0x0b, 0xd5, 0x6c, 0xab, 0x48, 0x03, 0xf8, 0x39, 0xa8, 0xd1, 0x01, 0x61, 0x2c, 0x0e, 0x09, - 0x57, 0x17, 0x88, 0xff, 0xf7, 0x5a, 0x41, 0x13, 0x7b, 0x99, 0x9c, 0x79, 0x4c, 0xa5, 0x24, 0xa5, - 0x6c, 0xa4, 0xae, 0x08, 0x26, 0x39, 0xad, 0xf8, 0x52, 0xc9, 0xd1, 0x0c, 0x82, 0x1e, 0x80, 0xc6, - 0x8d, 0x11, 0x91, 0xb3, 0xcc, 0x57, 0xdf, 0x7f, 0x43, 0xf9, 0xaa, 0xaf, 0x50, 0x6b, 0x91, 0x52, - 0xbe, 0xc6, 0x02, 0xa3, 0x7b, 0x12, 0xf8, 0x33, 0x00, 0xf5, 0x99, 0xf8, 0xdf, 0x72, 0x5a, 0x3e, - 0xb7, 0xf4, 0x8c, 0x57, 0xf1, 0xb5, 0xd6, 0xec, 0xd9, 0xd6, 0xe8, 0x9c, 0x53, 0x93, 0xc5, 0x79, - 0xd5, 0xaa, 0xda, 0xab, 0xe7, 0x55, 0x6b, 0xdd, 0xb6, 0xca, 0xfa, 0x99, 0x2c, 0xd0, 0xd6, 0x18, - 0x4f, 0x6d, 0xcf, 0xfb, 0xc5, 0xf7, 0x37, 0xbb, 0xcb, 0xef, 0x6e, 0x76, 0x97, 0xff, 0x75, 0xb3, - 0xbb, 0xfc, 0xb7, 0xf7, 0xbb, 0x4b, 0xef, 0xde, 0xef, 0x2e, 0xfd, 0xe3, 0xfd, 0xee, 0xd2, 0x1f, - 0x7e, 0x14, 0xc5, 0xa2, 0x97, 0x77, 0x0f, 0x02, 0x9a, 0xca, 0xa7, 0x32, 0xe5, 0xe6, 0xef, 0xe0, - 0xe8, 0x93, 0xc3, 0xa1, 0x7a, 0x43, 0x8b, 0x51, 0x9f, 0xf0, 0xee, 0x9a, 0x7a, 0x1b, 0x3f, 0xff, - 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x73, 0x0c, 0x86, 0x61, 0x61, 0x0f, 0x00, 0x00, + 0xef, 0xe6, 0x0a, 0x02, 0x15, 0xf7, 0x8b, 0xc7, 0xb8, 0x9f, 0x68, 0xee, 0x07, 0xbc, 0x5d, 0xb4, + 0xa9, 0xa4, 0x33, 0x25, 0x09, 0x01, 0x8c, 0x18, 0x1e, 0xcd, 0xc5, 0x69, 0x2f, 0x5c, 0xf8, 0xfb, + 0xce, 0x2e, 0xb2, 0xa5, 0x70, 0x26, 0xca, 0xd7, 0xa0, 0x9d, 0x12, 0x16, 0x11, 0x3f, 0x23, 0x82, + 0xf7, 0x93, 0x58, 0x98, 0x38, 0xdb, 0x0b, 0x7f, 0x07, 0x0f, 0xb9, 0xbb, 0x08, 0x2a, 0xf1, 0x17, + 0x46, 0x5a, 0x76, 0x29, 0xef, 0xe1, 0x2c, 0xea, 0xe1, 0xd8, 0x44, 0xd9, 0x59, 0xb8, 0x4b, 0x67, + 0x1d, 0x5d, 0xb4, 0x31, 0x16, 0x94, 0x47, 0x1d, 0xe0, 0x2c, 0xc8, 0xc7, 0x47, 0xfd, 0xc1, 0xc2, + 0x47, 0x3d, 0xed, 0x26, 0x07, 0xb8, 0x82, 0x8a, 0xf4, 0xbc, 0x6a, 0x35, 0xed, 0xd6, 0x79, 0xd5, + 0x6a, 0xd9, 0xf6, 0x79, 0xd5, 0xb2, 0xed, 0xcd, 0xf3, 0xaa, 0xb5, 0x65, 0xb7, 0xd1, 0xc6, 0x88, + 0x26, 0xd4, 0x1f, 0x3c, 0xd7, 0x4e, 0xa8, 0x4e, 0xde, 0x61, 0x6e, 0x7e, 0x68, 0x50, 0x33, 0xc0, + 0x02, 0x27, 0x23, 0x6e, 0x0a, 0x81, 0x6c, 0x5d, 0x9e, 0xa9, 0xb1, 0x75, 0x08, 0x56, 0x2f, 0x85, + 0xbc, 0xfa, 0xd8, 0xa0, 0x72, 0x4d, 0x46, 0x7a, 0xd8, 0x22, 0xb9, 0x84, 0x6d, 0xb0, 0x3a, 0xc0, + 0x49, 0xae, 0xef, 0x50, 0x35, 0xa4, 0x81, 0x7b, 0x01, 0x5a, 0x57, 0x0c, 0x67, 0x5c, 0x8e, 0x7f, + 0x9a, 0xbd, 0xa5, 0x11, 0x87, 0x10, 0x54, 0xd5, 0x9c, 0xd0, 0xbe, 0x6a, 0x0d, 0x7f, 0x0c, 0xaa, + 0x09, 0x8d, 0x78, 0x67, 0x65, 0xaf, 0xb2, 0x5f, 0x3f, 0xde, 0xbe, 0x7f, 0x8b, 0x79, 0x4b, 0x23, + 0xa4, 0x4c, 0xdc, 0x7f, 0xac, 0x80, 0xca, 0x5b, 0x1a, 0xc1, 0x0e, 0x58, 0xc7, 0x61, 0xc8, 0x08, + 0xe7, 0x86, 0x69, 0x0c, 0xe1, 0x0e, 0x58, 0x13, 0xb4, 0x1f, 0x07, 0x9a, 0xae, 0x86, 0x0c, 0x92, + 0x81, 0x43, 0x2c, 0xb0, 0x1a, 0xac, 0x0d, 0xa4, 0xd6, 0xf2, 0x12, 0xa2, 0x32, 0xf3, 0xb3, 0x3c, + 0xed, 0x12, 0xa6, 0xe6, 0x63, 0xd5, 0x6b, 0xdd, 0x16, 0x4e, 0x5d, 0xc9, 0xbf, 0x50, 0x62, 0x34, + 0x0d, 0xe0, 0x47, 0x60, 0x5d, 0x0c, 0xa7, 0x67, 0xdd, 0xd6, 0x6d, 0xe1, 0xb4, 0xc4, 0x24, 0x4d, + 0x39, 0xca, 0xd0, 0x9a, 0x18, 0xaa, 0x91, 0x76, 0x08, 0x2c, 0x31, 0xf4, 0xe3, 0x2c, 0x24, 0x43, + 0x35, 0xce, 0xaa, 0x5e, 0xfb, 0xb6, 0x70, 0xec, 0x29, 0xf3, 0x33, 0xa9, 0x43, 0xeb, 0x62, 0xa8, + 0x16, 0xf0, 0x23, 0x00, 0xf4, 0x96, 0x54, 0x04, 0x3d, 0x9d, 0x36, 0x6e, 0x0b, 0xa7, 0xa6, 0xa4, + 0x8a, 0x7b, 0xb2, 0x84, 0x2e, 0x58, 0xd5, 0xdc, 0x96, 0xe2, 0x6e, 0xdc, 0x16, 0x8e, 0x95, 0xd0, + 0x48, 0x73, 0x6a, 0x95, 0x2c, 0x15, 0x23, 0x29, 0x1d, 0x90, 0x50, 0x8d, 0x08, 0x0b, 0x8d, 0xa1, + 0xfb, 0xb7, 0x15, 0x60, 0x5d, 0x0d, 0x11, 0xe1, 0x79, 0x22, 0xe0, 0x67, 0xc0, 0x0e, 0x68, 0x26, + 0x18, 0x0e, 0x84, 0x3f, 0x53, 0x5a, 0xef, 0xe9, 0xe4, 0x07, 0x7d, 0xde, 0xc2, 0x45, 0xad, 0xb1, + 0xe8, 0x95, 0xa9, 0x7f, 0x1b, 0xac, 0x76, 0x13, 0x4a, 0x53, 0xd5, 0x09, 0x0d, 0xa4, 0x01, 0x44, + 0xaa, 0x6a, 0xea, 0x94, 0x2b, 0xea, 0xae, 0xfa, 0xc3, 0xfb, 0xa7, 0x3c, 0xd7, 0x2a, 0xde, 0x8e, + 0xb9, 0xaf, 0x36, 0x75, 0x6c, 0xe3, 0xef, 0xca, 0xda, 0xaa, 0x56, 0xb2, 0x41, 0x85, 0x11, 0xa1, + 0x0e, 0xad, 0x81, 0xe4, 0x12, 0x3e, 0x01, 0x16, 0x23, 0x03, 0xc2, 0x04, 0x09, 0xd5, 0xe1, 0x58, + 0xa8, 0xc4, 0xf0, 0x43, 0x60, 0x45, 0x98, 0xfb, 0x39, 0x27, 0xa1, 0x3e, 0x09, 0xb4, 0x1e, 0x61, + 0xfe, 0x25, 0x27, 0xe1, 0x27, 0xd5, 0xbf, 0x7e, 0xe3, 0x2c, 0xb9, 0x18, 0xd4, 0x5f, 0x05, 0x01, + 0xe1, 0xfc, 0x2a, 0xef, 0x27, 0xe4, 0x91, 0x0e, 0x3b, 0x06, 0x0d, 0x2e, 0x28, 0xc3, 0x11, 0xf1, + 0xaf, 0xc9, 0xc8, 0xf4, 0x99, 0xee, 0x1a, 0x23, 0xff, 0x0d, 0x19, 0x71, 0x34, 0x0d, 0x4c, 0x88, + 0x6f, 0xaa, 0xa0, 0x7e, 0xc5, 0x70, 0x40, 0xcc, 0x05, 0x56, 0xf6, 0xaa, 0x84, 0xcc, 0x84, 0x30, + 0x48, 0xc6, 0x16, 0x71, 0x4a, 0x68, 0x2e, 0xcc, 0xf7, 0x34, 0x86, 0xd2, 0x83, 0x11, 0x32, 0x24, + 0x81, 0x2a, 0x63, 0x15, 0x19, 0x04, 0x4f, 0xc0, 0x46, 0x18, 0x73, 0xf5, 0xe0, 0xe0, 0x02, 0x07, + 0xd7, 0x3a, 0x7d, 0xcf, 0xbe, 0x2d, 0x9c, 0x86, 0x51, 0x5c, 0x4a, 0x39, 0x9a, 0x41, 0xf0, 0x53, + 0xd0, 0x9a, 0xb8, 0xa9, 0xdd, 0xea, 0x2b, 0xbe, 0x07, 0x6f, 0x0b, 0xa7, 0x59, 0x9a, 0x2a, 0x0d, + 0x9a, 0xc3, 0xf2, 0xa4, 0x43, 0xd2, 0xcd, 0x23, 0xd5, 0x7c, 0x16, 0xd2, 0x40, 0x4a, 0x93, 0x38, + 0x8d, 0x85, 0x6a, 0xb6, 0x55, 0xa4, 0x01, 0xfc, 0x14, 0xd4, 0xe8, 0x80, 0x30, 0x16, 0x87, 0x84, + 0xab, 0x0b, 0xc4, 0xf7, 0xbd, 0x56, 0xd0, 0xc4, 0x5e, 0x26, 0x67, 0x1e, 0x53, 0x29, 0x49, 0x29, + 0x1b, 0xa9, 0x2b, 0x82, 0x49, 0x4e, 0x2b, 0x3e, 0x57, 0x72, 0x34, 0x83, 0xa0, 0x07, 0xa0, 0x71, + 0x63, 0x44, 0xe4, 0x2c, 0xf3, 0xd5, 0xf7, 0xdf, 0x50, 0xbe, 0xea, 0x2b, 0xd4, 0x5a, 0xa4, 0x94, + 0x6f, 0xb0, 0xc0, 0xe8, 0x9e, 0x04, 0xfe, 0x1c, 0x40, 0x7d, 0x26, 0xfe, 0xd7, 0x9c, 0x96, 0xcf, + 0x2d, 0x3d, 0xe3, 0x55, 0x7c, 0xad, 0x35, 0x7b, 0xb6, 0x35, 0x3a, 0xe7, 0xd4, 0x64, 0x71, 0x5e, + 0xb5, 0xaa, 0xf6, 0xea, 0x79, 0xd5, 0x5a, 0xb7, 0xad, 0xb2, 0x7e, 0x26, 0x0b, 0xb4, 0x35, 0xc6, + 0x53, 0xdb, 0xf3, 0x7e, 0xf9, 0xed, 0xcd, 0xee, 0xf2, 0x77, 0x37, 0xbb, 0xcb, 0xff, 0xbe, 0xd9, + 0x5d, 0xfe, 0xfb, 0xfb, 0xdd, 0xa5, 0xef, 0xde, 0xef, 0x2e, 0xfd, 0xf3, 0xfd, 0xee, 0xd2, 0x1f, + 0x7f, 0x14, 0xc5, 0xa2, 0x97, 0x77, 0x0f, 0x02, 0x9a, 0xca, 0xa7, 0x32, 0xe5, 0xe6, 0xef, 0xe0, + 0xe8, 0xc5, 0xe1, 0x50, 0xbd, 0xa1, 0xc5, 0xa8, 0x4f, 0x78, 0x77, 0x4d, 0xbd, 0x8d, 0x9f, 0xff, + 0x2f, 0x00, 0x00, 0xff, 0xff, 0xed, 0x8f, 0x5c, 0xfe, 0x61, 0x0f, 0x00, 0x00, } func (m *Params) Marshal() (dAtA []byte, err error) { diff --git a/x/evm/types/genesis.go b/x/evm/types/genesis.go index 93b3323358..76fcac2f1b 100644 --- a/x/evm/types/genesis.go +++ b/x/evm/types/genesis.go @@ -5,7 +5,7 @@ package types import ( "fmt" - "github.com/evmos/evmos/v16/types" + "github.com/evmos/evmos/v17/types" ) // Validate performs a basic validation of a GenesisAccount fields. diff --git a/x/evm/types/genesis.pb.go b/x/evm/types/genesis.pb.go index a4a49704fb..6196a8f4fb 100644 --- a/x/evm/types/genesis.pb.go +++ b/x/evm/types/genesis.pb.go @@ -152,26 +152,26 @@ func init() { func init() { proto.RegisterFile("ethermint/evm/v1/genesis.proto", fileDescriptor_9bcdec50cc9d156d) } var fileDescriptor_9bcdec50cc9d156d = []byte{ - // 300 bytes of a gzipped FileDescriptorProto + // 301 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x50, 0xbf, 0x4e, 0x83, 0x40, 0x18, 0xe7, 0x6c, 0xd3, 0xda, 0xab, 0x51, 0x73, 0x31, 0x91, 0x30, 0x5c, 0x49, 0x07, 0xc3, 0x74, - 0x84, 0x9a, 0x74, 0x56, 0x16, 0x57, 0x43, 0x37, 0xb7, 0x2b, 0x7c, 0xa1, 0x0c, 0x70, 0x84, 0xbb, - 0x12, 0x5d, 0x1d, 0x9d, 0x7c, 0x0e, 0x9f, 0xa4, 0x63, 0x47, 0x27, 0x35, 0xf0, 0x22, 0x86, 0x83, - 0x36, 0x51, 0x96, 0xcb, 0x77, 0xf7, 0xfb, 0xf7, 0xdd, 0x0f, 0x53, 0x50, 0x1b, 0x28, 0xd2, 0x24, - 0x53, 0x2e, 0x94, 0xa9, 0x5b, 0x7a, 0x6e, 0x0c, 0x19, 0xc8, 0x44, 0xb2, 0xbc, 0x10, 0x4a, 0x90, - 0xcb, 0x23, 0xce, 0xa0, 0x4c, 0x59, 0xe9, 0x59, 0x56, 0x4f, 0xd1, 0x00, 0x9a, 0x6d, 0x5d, 0xc5, - 0x22, 0x16, 0x7a, 0x74, 0x9b, 0xa9, 0x7d, 0x9d, 0xbf, 0x21, 0x7c, 0xf6, 0xd0, 0xba, 0xae, 0x14, - 0x57, 0x40, 0x7c, 0x7c, 0xca, 0xc3, 0x50, 0x6c, 0x33, 0x25, 0x4d, 0x64, 0x0f, 0x9c, 0xe9, 0xc2, - 0x66, 0xff, 0x73, 0x58, 0xa7, 0xb8, 0x6f, 0x89, 0xfe, 0x70, 0xf7, 0x35, 0x33, 0x82, 0xa3, 0x8e, - 0x2c, 0xf1, 0x28, 0xe7, 0x05, 0x4f, 0xa5, 0x79, 0x62, 0x23, 0x67, 0xba, 0x30, 0xfb, 0x0e, 0x8f, - 0x1a, 0xef, 0x94, 0x1d, 0x7b, 0xfe, 0x8a, 0xf0, 0xf9, 0x5f, 0x6b, 0x62, 0xe2, 0x31, 0x8f, 0xa2, - 0x02, 0x64, 0xb3, 0x0d, 0x72, 0x26, 0xc1, 0xe1, 0x4a, 0x08, 0x1e, 0x86, 0x22, 0x02, 0x1d, 0x31, - 0x09, 0xf4, 0x4c, 0x7c, 0x3c, 0x96, 0x4a, 0x14, 0x3c, 0x06, 0x73, 0xa0, 0x77, 0xbf, 0xee, 0x27, - 0xeb, 0x6f, 0xfa, 0x17, 0x4d, 0xf0, 0xc7, 0xf7, 0x6c, 0xbc, 0x6a, 0xf9, 0xc1, 0x41, 0xe8, 0xdf, - 0xed, 0x2a, 0x8a, 0xf6, 0x15, 0x45, 0x3f, 0x15, 0x45, 0xef, 0x35, 0x35, 0xf6, 0x35, 0x35, 0x3e, - 0x6b, 0x6a, 0x3c, 0xdd, 0xc4, 0x89, 0xda, 0x6c, 0xd7, 0x2c, 0x14, 0x69, 0xd3, 0xab, 0x90, 0xdd, - 0x59, 0x7a, 0x4b, 0xf7, 0x59, 0x17, 0xae, 0x5e, 0x72, 0x90, 0xeb, 0x91, 0xae, 0xf6, 0xf6, 0x37, - 0x00, 0x00, 0xff, 0xff, 0x34, 0x4b, 0x2d, 0x51, 0xc0, 0x01, 0x00, 0x00, + 0x84, 0x9a, 0xe8, 0xaa, 0x2c, 0xae, 0x86, 0x6e, 0x6e, 0x57, 0xf8, 0x42, 0x19, 0xe0, 0x08, 0x77, + 0x25, 0xba, 0x3a, 0x3a, 0xf9, 0x1c, 0x3e, 0x49, 0xc7, 0x8e, 0x4e, 0x6a, 0xe0, 0x45, 0x0c, 0x07, + 0x6d, 0xa2, 0x2c, 0x97, 0xef, 0xee, 0xf7, 0xef, 0xbb, 0x1f, 0xa6, 0xa0, 0xd6, 0x50, 0xa4, 0x49, + 0xa6, 0x5c, 0x28, 0x53, 0xb7, 0xf4, 0xdc, 0x18, 0x32, 0x90, 0x89, 0x64, 0x79, 0x21, 0x94, 0x20, + 0xe7, 0x07, 0x9c, 0x41, 0x99, 0xb2, 0xd2, 0xb3, 0xac, 0x9e, 0xa2, 0x01, 0x34, 0xdb, 0xba, 0x88, + 0x45, 0x2c, 0xf4, 0xe8, 0x36, 0x53, 0xfb, 0x3a, 0x7f, 0x43, 0xf8, 0xe4, 0xa1, 0x75, 0x5d, 0x2a, + 0xae, 0x80, 0xf8, 0xf8, 0x98, 0x87, 0xa1, 0xd8, 0x64, 0x4a, 0x9a, 0xc8, 0x1e, 0x38, 0xd3, 0x85, + 0xcd, 0xfe, 0xe7, 0xb0, 0x4e, 0x71, 0xdf, 0x12, 0xfd, 0xe1, 0xf6, 0x6b, 0x66, 0x04, 0x07, 0x1d, + 0xb9, 0xc1, 0xa3, 0x9c, 0x17, 0x3c, 0x95, 0xe6, 0x91, 0x8d, 0x9c, 0xe9, 0xc2, 0xec, 0x3b, 0x3c, + 0x6a, 0xbc, 0x53, 0x76, 0xec, 0xf9, 0x2b, 0xc2, 0xa7, 0x7f, 0xad, 0x89, 0x89, 0xc7, 0x3c, 0x8a, + 0x0a, 0x90, 0xcd, 0x36, 0xc8, 0x99, 0x04, 0xfb, 0x2b, 0x21, 0x78, 0x18, 0x8a, 0x08, 0x74, 0xc4, + 0x24, 0xd0, 0x33, 0xf1, 0xf1, 0x58, 0x2a, 0x51, 0xf0, 0x18, 0xcc, 0x81, 0xde, 0xfd, 0xb2, 0x9f, + 0xac, 0xbf, 0xe9, 0x9f, 0x35, 0xc1, 0x1f, 0xdf, 0xb3, 0xf1, 0xb2, 0xe5, 0x07, 0x7b, 0xa1, 0x7f, + 0xb7, 0xad, 0x28, 0xda, 0x55, 0x14, 0xfd, 0x54, 0x14, 0xbd, 0xd7, 0xd4, 0xd8, 0xd5, 0xd4, 0xf8, + 0xac, 0xa9, 0xf1, 0x74, 0x15, 0x27, 0x6a, 0xbd, 0x59, 0xb1, 0x50, 0xa4, 0x4d, 0xaf, 0x42, 0x76, + 0x67, 0xe9, 0xdd, 0xba, 0xcf, 0xba, 0x70, 0xf5, 0x92, 0x83, 0x5c, 0x8d, 0x74, 0xb5, 0xd7, 0xbf, + 0x01, 0x00, 0x00, 0xff, 0xff, 0xaa, 0xc8, 0xf7, 0xce, 0xc0, 0x01, 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { diff --git a/x/evm/types/genesis_test.go b/x/evm/types/genesis_test.go index f74939618b..6e97a55863 100644 --- a/x/evm/types/genesis_test.go +++ b/x/evm/types/genesis_test.go @@ -6,7 +6,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/suite" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" ) type GenesisTestSuite struct { diff --git a/x/evm/types/interfaces.go b/x/evm/types/interfaces.go index 7ebb6020e2..6af4a57fe1 100644 --- a/x/evm/types/interfaces.go +++ b/x/evm/types/interfaces.go @@ -11,7 +11,7 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" + feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" ) // AccountKeeper defines the expected account keeper interface diff --git a/x/evm/types/legacy_tx.go b/x/evm/types/legacy_tx.go index c0e72c6a62..717d3d7f8f 100644 --- a/x/evm/types/legacy_tx.go +++ b/x/evm/types/legacy_tx.go @@ -10,7 +10,7 @@ import ( errorsmod "cosmossdk.io/errors" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v16/types" + "github.com/evmos/evmos/v17/types" ) func NewLegacyTx(tx *ethtypes.Transaction) (*LegacyTx, error) { diff --git a/x/evm/types/legacy_tx_test.go b/x/evm/types/legacy_tx_test.go index 018da92cc5..f789922494 100644 --- a/x/evm/types/legacy_tx_test.go +++ b/x/evm/types/legacy_tx_test.go @@ -6,7 +6,7 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/x/evm/types" ) func (suite *TxDataTestSuite) TestNewLegacyTx() { diff --git a/x/evm/types/logs.go b/x/evm/types/logs.go index bc2e0ae53a..5492ec2772 100644 --- a/x/evm/types/logs.go +++ b/x/evm/types/logs.go @@ -9,7 +9,7 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - evmostypes "github.com/evmos/evmos/v16/types" + evmostypes "github.com/evmos/evmos/v17/types" ) // NewTransactionLogs creates a new NewTransactionLogs instance. diff --git a/x/evm/types/logs_test.go b/x/evm/types/logs_test.go index bc17b54799..7b22638aa8 100644 --- a/x/evm/types/logs_test.go +++ b/x/evm/types/logs_test.go @@ -5,8 +5,8 @@ import ( "github.com/stretchr/testify/require" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/x/evm/types" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v17/x/evm/types" "github.com/ethereum/go-ethereum/common" ) diff --git a/x/evm/types/msg.go b/x/evm/types/msg.go index 81f197a594..8d31af3d99 100644 --- a/x/evm/types/msg.go +++ b/x/evm/types/msg.go @@ -19,7 +19,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/signing" authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" - "github.com/evmos/evmos/v16/types" + "github.com/evmos/evmos/v17/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" diff --git a/x/evm/types/msg_test.go b/x/evm/types/msg_test.go index 85c4a210a8..3bbfedb46c 100644 --- a/x/evm/types/msg_test.go +++ b/x/evm/types/msg_test.go @@ -17,12 +17,12 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" - utiltx "github.com/evmos/evmos/v16/testutil/tx" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + utiltx "github.com/evmos/evmos/v17/testutil/tx" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/encoding" - "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/encoding" + "github.com/evmos/evmos/v17/x/evm/types" ) const invalidAddress = "0x0000" diff --git a/x/evm/types/params.go b/x/evm/types/params.go index 887fb8ae56..1fe6d5c9a5 100644 --- a/x/evm/types/params.go +++ b/x/evm/types/params.go @@ -17,9 +17,9 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/params" - "github.com/evmos/evmos/v16/precompiles/p256" - "github.com/evmos/evmos/v16/types" - "github.com/evmos/evmos/v16/utils" + "github.com/evmos/evmos/v17/precompiles/p256" + "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v17/utils" ) var ( diff --git a/x/evm/types/query.pb.go b/x/evm/types/query.pb.go index d8c59c5949..982d7e6ffb 100644 --- a/x/evm/types/query.pb.go +++ b/x/evm/types/query.pb.go @@ -923,7 +923,7 @@ type QueryTraceTxRequest struct { BlockTime time.Time `protobuf:"bytes,7,opt,name=block_time,json=blockTime,proto3,stdtime" json:"block_time"` // proposer_address is the proposer of the requested block ProposerAddress github_com_cosmos_cosmos_sdk_types.ConsAddress `protobuf:"bytes,8,opt,name=proposer_address,json=proposerAddress,proto3,casttype=github.com/cosmos/cosmos-sdk/types.ConsAddress" json:"proposer_address,omitempty"` - // chain_id is the the eip155 chain id parsed from the requested block header + // chain_id is the eip155 chain id parsed from the requested block header ChainId int64 `protobuf:"varint,9,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` // block_max_gas of the block of the requested transaction BlockMaxGas int64 `protobuf:"varint,10,opt,name=block_max_gas,json=blockMaxGas,proto3" json:"block_max_gas,omitempty"` @@ -1333,99 +1333,99 @@ func init() { func init() { proto.RegisterFile("ethermint/evm/v1/query.proto", fileDescriptor_e15a877459347994) } var fileDescriptor_e15a877459347994 = []byte{ - // 1467 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x56, 0xcf, 0x6f, 0x13, 0xc7, - 0x17, 0xcf, 0xc6, 0x4e, 0xec, 0x8c, 0x13, 0xf0, 0x77, 0x08, 0xe0, 0x2c, 0x89, 0x1d, 0xf6, 0xdb, - 0xc4, 0x86, 0xc2, 0x2e, 0x49, 0xab, 0x48, 0xed, 0xa5, 0x60, 0x0b, 0x28, 0x05, 0x2a, 0xea, 0x46, - 0x3d, 0x54, 0xaa, 0xac, 0xf1, 0x7a, 0x58, 0x5b, 0xf1, 0xee, 0x98, 0x9d, 0xb1, 0xe5, 0x80, 0x38, - 0x14, 0xa1, 0xfe, 0x50, 0x2f, 0x48, 0xbd, 0xf5, 0xc4, 0xbd, 0xb7, 0x5e, 0x7a, 0xec, 0x95, 0x23, - 0x52, 0x2f, 0x55, 0x0f, 0xb4, 0x22, 0x3d, 0xf4, 0x6f, 0xe8, 0xa9, 0x9a, 0x1f, 0x6b, 0xef, 0xda, - 0xde, 0x38, 0x54, 0xf4, 0xd6, 0xd3, 0xee, 0xcc, 0xbc, 0x79, 0x9f, 0xcf, 0xbc, 0xf7, 0x66, 0xde, - 0x07, 0xac, 0x62, 0xd6, 0xc4, 0xbe, 0xdb, 0xf2, 0x98, 0x85, 0x7b, 0xae, 0xd5, 0xdb, 0xb2, 0xee, - 0x75, 0xb1, 0xbf, 0x6f, 0x76, 0x7c, 0xc2, 0x08, 0xcc, 0x0e, 0x56, 0x4d, 0xdc, 0x73, 0xcd, 0xde, - 0x96, 0x7e, 0xde, 0x26, 0xd4, 0x25, 0xd4, 0xaa, 0x23, 0x8a, 0xa5, 0xa9, 0xd5, 0xdb, 0xaa, 0x63, - 0x86, 0xb6, 0xac, 0x0e, 0x72, 0x5a, 0x1e, 0x62, 0x2d, 0xe2, 0xc9, 0xdd, 0xba, 0x3e, 0xe6, 0x9b, - 0x3b, 0x91, 0x6b, 0x2b, 0x63, 0x6b, 0xac, 0xaf, 0x96, 0x96, 0x1d, 0xe2, 0x10, 0xf1, 0x6b, 0xf1, - 0x3f, 0x35, 0xbb, 0xea, 0x10, 0xe2, 0xb4, 0xb1, 0x85, 0x3a, 0x2d, 0x0b, 0x79, 0x1e, 0x61, 0x02, - 0x89, 0xaa, 0xd5, 0x82, 0x5a, 0x15, 0xa3, 0x7a, 0xf7, 0xae, 0xc5, 0x5a, 0x2e, 0xa6, 0x0c, 0xb9, - 0x1d, 0x69, 0x60, 0xbc, 0x03, 0x4e, 0x7c, 0xc4, 0xd9, 0x5e, 0xb1, 0x6d, 0xd2, 0xf5, 0x58, 0x15, - 0xdf, 0xeb, 0x62, 0xca, 0x60, 0x0e, 0xa4, 0x50, 0xa3, 0xe1, 0x63, 0x4a, 0x73, 0xda, 0xba, 0x56, - 0x5a, 0xa8, 0x06, 0xc3, 0x77, 0xd3, 0x5f, 0x3d, 0x2d, 0xcc, 0xfc, 0xf9, 0xb4, 0x30, 0x63, 0xd8, - 0x60, 0x39, 0xba, 0x95, 0x76, 0x88, 0x47, 0x31, 0xdf, 0x5b, 0x47, 0x6d, 0xe4, 0xd9, 0x38, 0xd8, - 0xab, 0x86, 0xf0, 0x0c, 0x58, 0xb0, 0x49, 0x03, 0xd7, 0x9a, 0x88, 0x36, 0x73, 0xb3, 0x62, 0x2d, - 0xcd, 0x27, 0xde, 0x47, 0xb4, 0x09, 0x97, 0xc1, 0x9c, 0x47, 0xf8, 0xa6, 0xc4, 0xba, 0x56, 0x4a, - 0x56, 0xe5, 0xc0, 0x78, 0x0f, 0xac, 0x08, 0x90, 0x8a, 0x08, 0xef, 0x3f, 0x60, 0xf9, 0x85, 0x06, - 0xf4, 0x49, 0x1e, 0x14, 0xd9, 0x0d, 0x70, 0x4c, 0x66, 0xae, 0x16, 0xf5, 0xb4, 0x24, 0x67, 0xaf, - 0xc8, 0x49, 0xa8, 0x83, 0x34, 0xe5, 0xa0, 0x9c, 0xdf, 0xac, 0xe0, 0x37, 0x18, 0x73, 0x17, 0x48, - 0x7a, 0xad, 0x79, 0x5d, 0xb7, 0x8e, 0x7d, 0x75, 0x82, 0x25, 0x35, 0xfb, 0xa1, 0x98, 0x34, 0x6e, - 0x82, 0x55, 0xc1, 0xe3, 0x13, 0xd4, 0x6e, 0x35, 0x10, 0x23, 0xfe, 0xc8, 0x61, 0xce, 0x82, 0x45, - 0x9b, 0x78, 0xa3, 0x3c, 0x32, 0x7c, 0xee, 0xca, 0xd8, 0xa9, 0xbe, 0xd1, 0xc0, 0x5a, 0x8c, 0x37, - 0x75, 0xb0, 0x22, 0x38, 0x1e, 0xb0, 0x8a, 0x7a, 0x0c, 0xc8, 0xbe, 0xc6, 0xa3, 0x05, 0x45, 0x54, - 0x96, 0x79, 0x7e, 0x95, 0xf4, 0x5c, 0x52, 0x45, 0x34, 0xd8, 0x3a, 0xad, 0x88, 0x8c, 0x9b, 0x0a, - 0xec, 0x63, 0x46, 0x7c, 0xe4, 0x4c, 0x07, 0x83, 0x59, 0x90, 0xd8, 0xc3, 0xfb, 0xaa, 0xde, 0xf8, - 0x6f, 0x08, 0xfe, 0x82, 0x82, 0x1f, 0x38, 0x53, 0xf0, 0xcb, 0x60, 0xae, 0x87, 0xda, 0xdd, 0x00, - 0x5c, 0x0e, 0x8c, 0x1d, 0x90, 0x55, 0xa5, 0xd4, 0x78, 0xa5, 0x43, 0x16, 0xc1, 0xff, 0x42, 0xfb, - 0x14, 0x04, 0x04, 0x49, 0x5e, 0xfb, 0x62, 0xd7, 0x62, 0x55, 0xfc, 0x1b, 0xf7, 0x01, 0x14, 0x86, - 0xbb, 0xfd, 0x5b, 0xc4, 0xa1, 0x01, 0x04, 0x04, 0x49, 0x71, 0x63, 0xa4, 0x7f, 0xf1, 0x0f, 0xaf, - 0x01, 0x30, 0x7c, 0x57, 0xc4, 0xd9, 0x32, 0xdb, 0x9b, 0xa6, 0x2c, 0x5a, 0x93, 0x3f, 0x42, 0xa6, - 0x7c, 0xaf, 0xd4, 0x23, 0x64, 0xde, 0x19, 0x86, 0xaa, 0x1a, 0xda, 0x19, 0x22, 0xf9, 0xb5, 0xa6, - 0x02, 0x1b, 0x80, 0x2b, 0x9e, 0xe7, 0x40, 0xb2, 0x4d, 0x1c, 0x7e, 0xba, 0x44, 0x29, 0xb3, 0x7d, - 0xd2, 0x1c, 0x7d, 0xfa, 0xcc, 0x5b, 0xc4, 0xa9, 0x0a, 0x13, 0x78, 0x7d, 0x02, 0xa9, 0xe2, 0x54, - 0x52, 0x12, 0x27, 0xcc, 0xca, 0x58, 0x56, 0x71, 0xb8, 0x83, 0x7c, 0xe4, 0x06, 0x71, 0x30, 0x6e, - 0x2b, 0x82, 0xc1, 0xac, 0x22, 0xb8, 0x03, 0xe6, 0x3b, 0x62, 0x46, 0x04, 0x28, 0xb3, 0x9d, 0x1b, - 0xa7, 0x28, 0x77, 0x94, 0x93, 0xcf, 0x5e, 0x14, 0x66, 0xaa, 0xca, 0xda, 0xf8, 0x51, 0x03, 0xc7, - 0xae, 0xb2, 0x66, 0x05, 0xb5, 0xdb, 0xa1, 0x48, 0x23, 0xdf, 0xa1, 0x41, 0x4e, 0xf8, 0x3f, 0x3c, - 0x0d, 0x52, 0x0e, 0xa2, 0x35, 0x1b, 0x75, 0xd4, 0xf5, 0x98, 0x77, 0x10, 0xad, 0xa0, 0x0e, 0xfc, - 0x0c, 0x64, 0x3b, 0x3e, 0xe9, 0x10, 0x8a, 0xfd, 0xc1, 0x15, 0xe3, 0xd7, 0x63, 0xb1, 0xbc, 0xfd, - 0xd7, 0x8b, 0x82, 0xe9, 0xb4, 0x58, 0xb3, 0x5b, 0x37, 0x6d, 0xe2, 0x5a, 0xaa, 0x37, 0xc8, 0xcf, - 0x45, 0xda, 0xd8, 0xb3, 0xd8, 0x7e, 0x07, 0x53, 0xb3, 0x32, 0xbc, 0xdb, 0xd5, 0xe3, 0x81, 0xaf, - 0xe0, 0x5e, 0xae, 0x80, 0xb4, 0xdd, 0x44, 0x2d, 0xaf, 0xd6, 0x6a, 0xe4, 0x92, 0xeb, 0x5a, 0x29, - 0x51, 0x4d, 0x89, 0xf1, 0x8d, 0x86, 0x51, 0x04, 0x27, 0xae, 0x52, 0xd6, 0x72, 0x11, 0xc3, 0xd7, - 0xd1, 0x30, 0x10, 0x59, 0x90, 0x70, 0x90, 0x24, 0x9f, 0xac, 0xf2, 0x5f, 0xe3, 0x71, 0x32, 0xc8, - 0xa9, 0x8f, 0x6c, 0xbc, 0xdb, 0x0f, 0xce, 0xb9, 0x05, 0x12, 0x2e, 0x75, 0x54, 0xbc, 0x0a, 0xe3, - 0xf1, 0xba, 0x4d, 0x9d, 0xab, 0x7c, 0x0e, 0x77, 0xdd, 0xdd, 0x7e, 0x95, 0xdb, 0xc2, 0xcb, 0x60, - 0x91, 0x71, 0x27, 0x35, 0x9b, 0x78, 0x77, 0x5b, 0x8e, 0x38, 0x69, 0x66, 0x7b, 0x6d, 0x7c, 0xaf, - 0x80, 0xaa, 0x08, 0xa3, 0x6a, 0x86, 0x0d, 0x07, 0xb0, 0x02, 0x16, 0x3b, 0x3e, 0x6e, 0x60, 0x1b, - 0x53, 0x4a, 0x7c, 0x9a, 0x4b, 0x8a, 0x82, 0x9a, 0x8a, 0x1e, 0xd9, 0xc4, 0x5f, 0xc9, 0x7a, 0x9b, - 0xd8, 0x7b, 0xc1, 0x7b, 0x34, 0x27, 0x22, 0x93, 0x11, 0x73, 0xf2, 0x35, 0x82, 0x6b, 0x00, 0x48, - 0x13, 0x71, 0x69, 0xe6, 0xc5, 0xa5, 0x59, 0x10, 0x33, 0xa2, 0xcf, 0x54, 0x82, 0x65, 0xde, 0x0a, - 0x73, 0x29, 0x71, 0x0c, 0xdd, 0x94, 0x7d, 0xd2, 0x0c, 0xfa, 0xa4, 0xb9, 0x1b, 0xf4, 0xc9, 0x72, - 0x9a, 0x17, 0xcd, 0x93, 0xdf, 0x0a, 0x9a, 0x72, 0xc2, 0x57, 0x26, 0xe6, 0x3e, 0xfd, 0xef, 0xe4, - 0x7e, 0x21, 0x92, 0x7b, 0x68, 0x80, 0x25, 0x49, 0xdf, 0x45, 0xfd, 0x1a, 0x4f, 0x37, 0x08, 0x45, - 0xe0, 0x36, 0xea, 0x5f, 0x47, 0xf4, 0x83, 0x64, 0x7a, 0x36, 0x9b, 0xa8, 0xa6, 0x59, 0xbf, 0xd6, - 0xf2, 0x1a, 0xb8, 0x6f, 0x9c, 0x57, 0xaf, 0xdc, 0xa0, 0x0a, 0x86, 0x4f, 0x50, 0x03, 0x31, 0x14, - 0x94, 0x3b, 0xff, 0x37, 0x7e, 0x48, 0x80, 0x53, 0x43, 0xe3, 0x32, 0xf7, 0x1a, 0xaa, 0x1a, 0xd6, - 0x0f, 0x1e, 0x82, 0xe9, 0x55, 0xc3, 0xfa, 0xf4, 0x35, 0x54, 0xcd, 0x7f, 0x09, 0x9f, 0x9e, 0x70, - 0xe3, 0x22, 0x38, 0x3d, 0x96, 0xb3, 0x43, 0x72, 0x7c, 0x72, 0xd0, 0xaf, 0x29, 0xbe, 0x86, 0x83, - 0xbe, 0x60, 0xdc, 0x1a, 0xf4, 0x62, 0x35, 0xad, 0x5c, 0xbc, 0x0d, 0xd2, 0xfc, 0xf1, 0xae, 0xdd, - 0xc5, 0xaa, 0x1f, 0x96, 0x57, 0x7e, 0x7d, 0x51, 0x38, 0x29, 0x4f, 0x48, 0x1b, 0x7b, 0x66, 0x8b, - 0x58, 0x2e, 0x62, 0x4d, 0xf3, 0x86, 0xc7, 0x78, 0x9f, 0x16, 0xbb, 0xb7, 0x7f, 0x5a, 0x04, 0x73, - 0xc2, 0x1d, 0xfc, 0x5c, 0x03, 0x29, 0x25, 0x4f, 0xe0, 0xc6, 0x78, 0xea, 0x27, 0xe8, 0x4f, 0x7d, - 0x73, 0x9a, 0x99, 0xa4, 0x66, 0x14, 0x1f, 0xfd, 0xfc, 0xc7, 0xb7, 0xb3, 0x67, 0x61, 0x81, 0xab, - 0x65, 0x42, 0x03, 0xcd, 0xac, 0xe4, 0x89, 0xf5, 0x40, 0xa5, 0xea, 0x21, 0xfc, 0x4e, 0x03, 0x4b, - 0x11, 0x05, 0x08, 0xdf, 0x8c, 0x81, 0x98, 0xa4, 0x34, 0xf5, 0x0b, 0x47, 0x33, 0x56, 0xac, 0x4c, - 0xc1, 0xaa, 0x04, 0x37, 0xa3, 0xac, 0x02, 0xa1, 0x39, 0x46, 0xee, 0x7b, 0x0d, 0x64, 0x47, 0x85, - 0x1c, 0x34, 0x63, 0x20, 0x63, 0xf4, 0xa3, 0x6e, 0x1d, 0xd9, 0x5e, 0xb1, 0xdc, 0x11, 0x2c, 0x2f, - 0x41, 0x33, 0xca, 0xb2, 0x17, 0xd8, 0x0f, 0x89, 0x86, 0x75, 0xe9, 0x43, 0xf8, 0x48, 0x03, 0x29, - 0x25, 0xd7, 0x62, 0xd3, 0x19, 0x55, 0x82, 0xb1, 0xe9, 0x1c, 0x51, 0x7d, 0x46, 0x49, 0x50, 0x32, - 0xe0, 0x7a, 0x94, 0x92, 0x92, 0x7e, 0x34, 0x14, 0xb2, 0x2f, 0x35, 0x90, 0x52, 0xa2, 0x2d, 0x96, - 0x44, 0x54, 0x21, 0xc6, 0x92, 0x18, 0xd1, 0x7e, 0xc6, 0x45, 0x41, 0xa2, 0x08, 0x37, 0xa2, 0x24, - 0xa8, 0x34, 0x1b, 0x72, 0xb0, 0x1e, 0xec, 0xe1, 0xfd, 0x87, 0xb0, 0x07, 0x92, 0x5c, 0xd7, 0x41, - 0x23, 0xb6, 0x44, 0x06, 0x62, 0x51, 0xff, 0xff, 0xa1, 0x36, 0x0a, 0x7f, 0x43, 0xe0, 0x17, 0xe0, - 0xda, 0x68, 0xf5, 0x34, 0x22, 0x11, 0xa0, 0x60, 0x5e, 0xca, 0x1a, 0xf8, 0x46, 0x8c, 0xd7, 0x88, - 0x7a, 0xd2, 0x37, 0xa6, 0x58, 0x29, 0xf4, 0x55, 0x81, 0x7e, 0x0a, 0x2e, 0x47, 0xd1, 0xa5, 0x66, - 0x82, 0x0c, 0xa4, 0x94, 0x64, 0x82, 0xeb, 0xe3, 0xfe, 0xa2, 0x6a, 0x4a, 0x2f, 0x4e, 0x6b, 0x11, - 0x01, 0x66, 0x5e, 0x60, 0xe6, 0xe0, 0xa9, 0x28, 0x26, 0x66, 0xcd, 0x9a, 0xcd, 0xa1, 0xee, 0x83, - 0x4c, 0x48, 0xef, 0x1c, 0x01, 0x79, 0xc2, 0x59, 0x27, 0x08, 0x26, 0xc3, 0x10, 0xb8, 0xab, 0x50, - 0x1f, 0xc1, 0x55, 0xa6, 0xfc, 0xb5, 0x85, 0x7d, 0x90, 0x52, 0x6d, 0x33, 0xb6, 0xce, 0xa2, 0xe2, - 0x2a, 0xb6, 0xce, 0x46, 0xba, 0x6f, 0xdc, 0xa9, 0x65, 0xbf, 0x64, 0x7d, 0xf8, 0x58, 0x03, 0x60, - 0xf8, 0xa0, 0xc3, 0xd2, 0x61, 0x6e, 0xc3, 0x7d, 0x5a, 0x3f, 0x77, 0x04, 0x4b, 0xc5, 0xe1, 0xac, - 0xe0, 0x70, 0x06, 0xae, 0x4c, 0xe2, 0x20, 0x3a, 0x0c, 0x0f, 0x80, 0x6a, 0x08, 0x87, 0xdc, 0xf6, - 0x70, 0x1f, 0x39, 0xe4, 0xb6, 0x47, 0xfa, 0x4a, 0x5c, 0x00, 0x82, 0x5e, 0x53, 0xbe, 0xfc, 0xec, - 0x65, 0x5e, 0x7b, 0xfe, 0x32, 0xaf, 0xfd, 0xfe, 0x32, 0xaf, 0x3d, 0x39, 0xc8, 0xcf, 0x3c, 0x3f, - 0xc8, 0xcf, 0xfc, 0x72, 0x90, 0x9f, 0xf9, 0x74, 0x33, 0xd4, 0x6f, 0x07, 0x7b, 0x09, 0xb5, 0x7a, - 0x5b, 0x3b, 0x56, 0x5f, 0xf8, 0x11, 0x3d, 0xb7, 0x3e, 0x2f, 0xda, 0xfb, 0x5b, 0x7f, 0x07, 0x00, - 0x00, 0xff, 0xff, 0xc6, 0xc7, 0x39, 0x16, 0xce, 0x11, 0x00, 0x00, + // 1466 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x56, 0xcf, 0x6f, 0x1b, 0x45, + 0x14, 0xce, 0xc6, 0x4e, 0xec, 0x8c, 0x93, 0xd6, 0x4c, 0xd3, 0xd6, 0xd9, 0x26, 0x76, 0xba, 0x90, + 0xd8, 0x2d, 0xed, 0x6e, 0x13, 0x50, 0x11, 0x5c, 0x68, 0x6d, 0xb5, 0xa5, 0xb4, 0x45, 0xc5, 0x44, + 0x1c, 0x90, 0x90, 0x35, 0x5e, 0x4f, 0xd7, 0x56, 0xbc, 0x3b, 0xee, 0xce, 0xd8, 0x72, 0x5a, 0xf5, + 0x40, 0x55, 0xf1, 0x43, 0x5c, 0x2a, 0x71, 0xe3, 0xd4, 0x3b, 0x37, 0x2e, 0x1c, 0xb9, 0xf6, 0x58, + 0x89, 0x0b, 0xe2, 0x50, 0x50, 0xc3, 0x81, 0xbf, 0x81, 0x13, 0x9a, 0x1f, 0x6b, 0xef, 0xda, 0xde, + 0x38, 0x45, 0xe5, 0xc6, 0x69, 0x77, 0x66, 0xde, 0xbc, 0xef, 0x9b, 0xf7, 0xde, 0xcc, 0xfb, 0xc0, + 0x2a, 0x66, 0x4d, 0xec, 0xbb, 0x2d, 0x8f, 0x59, 0xb8, 0xe7, 0x5a, 0xbd, 0x2d, 0xeb, 0x6e, 0x17, + 0xfb, 0x7b, 0x66, 0xc7, 0x27, 0x8c, 0xc0, 0xec, 0x60, 0xd5, 0xc4, 0x3d, 0xd7, 0xec, 0x6d, 0xe9, + 0x67, 0x6d, 0x42, 0x5d, 0x42, 0xad, 0x3a, 0xa2, 0x58, 0x9a, 0x5a, 0xbd, 0xad, 0x3a, 0x66, 0x68, + 0xcb, 0xea, 0x20, 0xa7, 0xe5, 0x21, 0xd6, 0x22, 0x9e, 0xdc, 0xad, 0xeb, 0x63, 0xbe, 0xb9, 0x13, + 0xb9, 0xb6, 0x32, 0xb6, 0xc6, 0xfa, 0x6a, 0x69, 0xd9, 0x21, 0x0e, 0x11, 0xbf, 0x16, 0xff, 0x53, + 0xb3, 0xab, 0x0e, 0x21, 0x4e, 0x1b, 0x5b, 0xa8, 0xd3, 0xb2, 0x90, 0xe7, 0x11, 0x26, 0x90, 0xa8, + 0x5a, 0x2d, 0xa8, 0x55, 0x31, 0xaa, 0x77, 0xef, 0x58, 0xac, 0xe5, 0x62, 0xca, 0x90, 0xdb, 0x91, + 0x06, 0xc6, 0xbb, 0xe0, 0xd8, 0xc7, 0x9c, 0xed, 0x65, 0xdb, 0x26, 0x5d, 0x8f, 0x55, 0xf1, 0xdd, + 0x2e, 0xa6, 0x0c, 0xe6, 0x40, 0x0a, 0x35, 0x1a, 0x3e, 0xa6, 0x34, 0xa7, 0xad, 0x6b, 0xa5, 0x85, + 0x6a, 0x30, 0x7c, 0x2f, 0xfd, 0xf5, 0x93, 0xc2, 0xcc, 0x5f, 0x4f, 0x0a, 0x33, 0x86, 0x0d, 0x96, + 0xa3, 0x5b, 0x69, 0x87, 0x78, 0x14, 0xf3, 0xbd, 0x75, 0xd4, 0x46, 0x9e, 0x8d, 0x83, 0xbd, 0x6a, + 0x08, 0x4f, 0x81, 0x05, 0x9b, 0x34, 0x70, 0xad, 0x89, 0x68, 0x33, 0x37, 0x2b, 0xd6, 0xd2, 0x7c, + 0xe2, 0x03, 0x44, 0x9b, 0x70, 0x19, 0xcc, 0x79, 0x84, 0x6f, 0x4a, 0xac, 0x6b, 0xa5, 0x64, 0x55, + 0x0e, 0x8c, 0xf7, 0xc1, 0x8a, 0x00, 0xa9, 0x88, 0xf0, 0xfe, 0x0b, 0x96, 0x5f, 0x6a, 0x40, 0x9f, + 0xe4, 0x41, 0x91, 0xdd, 0x00, 0x47, 0x64, 0xe6, 0x6a, 0x51, 0x4f, 0x4b, 0x72, 0xf6, 0xb2, 0x9c, + 0x84, 0x3a, 0x48, 0x53, 0x0e, 0xca, 0xf9, 0xcd, 0x0a, 0x7e, 0x83, 0x31, 0x77, 0x81, 0xa4, 0xd7, + 0x9a, 0xd7, 0x75, 0xeb, 0xd8, 0x57, 0x27, 0x58, 0x52, 0xb3, 0x1f, 0x89, 0x49, 0xe3, 0x06, 0x58, + 0x15, 0x3c, 0x3e, 0x45, 0xed, 0x56, 0x03, 0x31, 0xe2, 0x8f, 0x1c, 0xe6, 0x34, 0x58, 0xb4, 0x89, + 0x37, 0xca, 0x23, 0xc3, 0xe7, 0x2e, 0x8f, 0x9d, 0xea, 0x5b, 0x0d, 0xac, 0xc5, 0x78, 0x53, 0x07, + 0x2b, 0x82, 0xa3, 0x01, 0xab, 0xa8, 0xc7, 0x80, 0xec, 0x2b, 0x3c, 0x5a, 0x50, 0x44, 0x65, 0x99, + 0xe7, 0x97, 0x49, 0xcf, 0x05, 0x55, 0x44, 0x83, 0xad, 0xd3, 0x8a, 0xc8, 0xb8, 0xa1, 0xc0, 0x3e, + 0x61, 0xc4, 0x47, 0xce, 0x74, 0x30, 0x98, 0x05, 0x89, 0x5d, 0xbc, 0xa7, 0xea, 0x8d, 0xff, 0x86, + 0xe0, 0xcf, 0x29, 0xf8, 0x81, 0x33, 0x05, 0xbf, 0x0c, 0xe6, 0x7a, 0xa8, 0xdd, 0x0d, 0xc0, 0xe5, + 0xc0, 0xb8, 0x08, 0xb2, 0xaa, 0x94, 0x1a, 0x2f, 0x75, 0xc8, 0x22, 0x78, 0x2d, 0xb4, 0x4f, 0x41, + 0x40, 0x90, 0xe4, 0xb5, 0x2f, 0x76, 0x2d, 0x56, 0xc5, 0xbf, 0x71, 0x0f, 0x40, 0x61, 0xb8, 0xd3, + 0xbf, 0x49, 0x1c, 0x1a, 0x40, 0x40, 0x90, 0x14, 0x37, 0x46, 0xfa, 0x17, 0xff, 0xf0, 0x2a, 0x00, + 0xc3, 0x77, 0x45, 0x9c, 0x2d, 0xb3, 0xbd, 0x69, 0xca, 0xa2, 0x35, 0xf9, 0x23, 0x64, 0xca, 0xf7, + 0x4a, 0x3d, 0x42, 0xe6, 0xed, 0x61, 0xa8, 0xaa, 0xa1, 0x9d, 0x21, 0x92, 0xdf, 0x68, 0x2a, 0xb0, + 0x01, 0xb8, 0xe2, 0x79, 0x06, 0x24, 0xdb, 0xc4, 0xe1, 0xa7, 0x4b, 0x94, 0x32, 0xdb, 0xc7, 0xcd, + 0xd1, 0xa7, 0xcf, 0xbc, 0x49, 0x9c, 0xaa, 0x30, 0x81, 0xd7, 0x26, 0x90, 0x2a, 0x4e, 0x25, 0x25, + 0x71, 0xc2, 0xac, 0x8c, 0x65, 0x15, 0x87, 0xdb, 0xc8, 0x47, 0x6e, 0x10, 0x07, 0xe3, 0x96, 0x22, + 0x18, 0xcc, 0x2a, 0x82, 0x17, 0xc1, 0x7c, 0x47, 0xcc, 0x88, 0x00, 0x65, 0xb6, 0x73, 0xe3, 0x14, + 0xe5, 0x8e, 0x72, 0xf2, 0xe9, 0xf3, 0xc2, 0x4c, 0x55, 0x59, 0x1b, 0x3f, 0x69, 0xe0, 0xc8, 0x15, + 0xd6, 0xac, 0xa0, 0x76, 0x3b, 0x14, 0x69, 0xe4, 0x3b, 0x34, 0xc8, 0x09, 0xff, 0x87, 0x27, 0x41, + 0xca, 0x41, 0xb4, 0x66, 0xa3, 0x8e, 0xba, 0x1e, 0xf3, 0x0e, 0xa2, 0x15, 0xd4, 0x81, 0x9f, 0x83, + 0x6c, 0xc7, 0x27, 0x1d, 0x42, 0xb1, 0x3f, 0xb8, 0x62, 0xfc, 0x7a, 0x2c, 0x96, 0xb7, 0xff, 0x7e, + 0x5e, 0x30, 0x9d, 0x16, 0x6b, 0x76, 0xeb, 0xa6, 0x4d, 0x5c, 0x4b, 0xf5, 0x06, 0xf9, 0x39, 0x4f, + 0x1b, 0xbb, 0x16, 0xdb, 0xeb, 0x60, 0x6a, 0x56, 0x86, 0x77, 0xbb, 0x7a, 0x34, 0xf0, 0x15, 0xdc, + 0xcb, 0x15, 0x90, 0xb6, 0x9b, 0xa8, 0xe5, 0xd5, 0x5a, 0x8d, 0x5c, 0x72, 0x5d, 0x2b, 0x25, 0xaa, + 0x29, 0x31, 0xbe, 0xde, 0x30, 0x8a, 0xe0, 0xd8, 0x15, 0xca, 0x5a, 0x2e, 0x62, 0xf8, 0x1a, 0x1a, + 0x06, 0x22, 0x0b, 0x12, 0x0e, 0x92, 0xe4, 0x93, 0x55, 0xfe, 0x6b, 0x3c, 0x4a, 0x06, 0x39, 0xf5, + 0x91, 0x8d, 0x77, 0xfa, 0xc1, 0x39, 0xb7, 0x40, 0xc2, 0xa5, 0x8e, 0x8a, 0x57, 0x61, 0x3c, 0x5e, + 0xb7, 0xa8, 0x73, 0x85, 0xcf, 0xe1, 0xae, 0xbb, 0xd3, 0xaf, 0x72, 0x5b, 0x78, 0x09, 0x2c, 0x32, + 0xee, 0xa4, 0x66, 0x13, 0xef, 0x4e, 0xcb, 0x11, 0x27, 0xcd, 0x6c, 0xaf, 0x8d, 0xef, 0x15, 0x50, + 0x15, 0x61, 0x54, 0xcd, 0xb0, 0xe1, 0x00, 0x56, 0xc0, 0x62, 0xc7, 0xc7, 0x0d, 0x6c, 0x63, 0x4a, + 0x89, 0x4f, 0x73, 0x49, 0x51, 0x50, 0x53, 0xd1, 0x23, 0x9b, 0xf8, 0x2b, 0x59, 0x6f, 0x13, 0x7b, + 0x37, 0x78, 0x8f, 0xe6, 0x44, 0x64, 0x32, 0x62, 0x4e, 0xbe, 0x46, 0x70, 0x0d, 0x00, 0x69, 0x22, + 0x2e, 0xcd, 0xbc, 0xb8, 0x34, 0x0b, 0x62, 0x46, 0xf4, 0x99, 0x4a, 0xb0, 0xcc, 0x5b, 0x61, 0x2e, + 0x25, 0x8e, 0xa1, 0x9b, 0xb2, 0x4f, 0x9a, 0x41, 0x9f, 0x34, 0x77, 0x82, 0x3e, 0x59, 0x4e, 0xf3, + 0xa2, 0x79, 0xfc, 0x7b, 0x41, 0x53, 0x4e, 0xf8, 0xca, 0xc4, 0xdc, 0xa7, 0xff, 0x9b, 0xdc, 0x2f, + 0x44, 0x72, 0x0f, 0x0d, 0xb0, 0x24, 0xe9, 0xbb, 0xa8, 0x5f, 0xe3, 0xe9, 0x06, 0xa1, 0x08, 0xdc, + 0x42, 0xfd, 0x6b, 0x88, 0x7e, 0x98, 0x4c, 0xcf, 0x66, 0x13, 0xd5, 0x34, 0xeb, 0xd7, 0x5a, 0x5e, + 0x03, 0xf7, 0x8d, 0xb3, 0xea, 0x95, 0x1b, 0x54, 0xc1, 0xf0, 0x09, 0x6a, 0x20, 0x86, 0x82, 0x72, + 0xe7, 0xff, 0xc6, 0x8f, 0x09, 0x70, 0x62, 0x68, 0x5c, 0xe6, 0x5e, 0x43, 0x55, 0xc3, 0xfa, 0xc1, + 0x43, 0x30, 0xbd, 0x6a, 0x58, 0x9f, 0xbe, 0x82, 0xaa, 0xf9, 0x3f, 0xe1, 0xd3, 0x13, 0x6e, 0x9c, + 0x07, 0x27, 0xc7, 0x72, 0x76, 0x40, 0x8e, 0x8f, 0x0f, 0xfa, 0x35, 0xc5, 0x57, 0x71, 0xd0, 0x17, + 0x8c, 0x9b, 0x83, 0x5e, 0xac, 0xa6, 0x95, 0x8b, 0xb7, 0x41, 0x9a, 0x3f, 0xde, 0xb5, 0x3b, 0x58, + 0xf5, 0xc3, 0xf2, 0xca, 0x6f, 0xcf, 0x0b, 0xc7, 0xe5, 0x09, 0x69, 0x63, 0xd7, 0x6c, 0x11, 0xcb, + 0x45, 0xac, 0x69, 0x5e, 0xf7, 0x18, 0xef, 0xd3, 0x62, 0xf7, 0xf6, 0xcf, 0x8b, 0x60, 0x4e, 0xb8, + 0x83, 0x5f, 0x68, 0x20, 0xa5, 0xe4, 0x09, 0xdc, 0x18, 0x4f, 0xfd, 0x04, 0xfd, 0xa9, 0x6f, 0x4e, + 0x33, 0x93, 0xd4, 0x8c, 0xe2, 0xc3, 0x5f, 0xfe, 0xfc, 0x6e, 0xf6, 0x34, 0x2c, 0x70, 0xb5, 0x4c, + 0x68, 0xa0, 0x99, 0x95, 0x3c, 0xb1, 0xee, 0xab, 0x54, 0x3d, 0x80, 0xdf, 0x6b, 0x60, 0x29, 0xa2, + 0x00, 0xe1, 0x9b, 0x31, 0x10, 0x93, 0x94, 0xa6, 0x7e, 0xee, 0x70, 0xc6, 0x8a, 0x95, 0x29, 0x58, + 0x95, 0xe0, 0x66, 0x94, 0x55, 0x20, 0x34, 0xc7, 0xc8, 0xfd, 0xa0, 0x81, 0xec, 0xa8, 0x90, 0x83, + 0x66, 0x0c, 0x64, 0x8c, 0x7e, 0xd4, 0xad, 0x43, 0xdb, 0x2b, 0x96, 0x17, 0x05, 0xcb, 0x0b, 0xd0, + 0x8c, 0xb2, 0xec, 0x05, 0xf6, 0x43, 0xa2, 0x61, 0x5d, 0xfa, 0x00, 0x3e, 0xd4, 0x40, 0x4a, 0xc9, + 0xb5, 0xd8, 0x74, 0x46, 0x95, 0x60, 0x6c, 0x3a, 0x47, 0x54, 0x9f, 0x51, 0x12, 0x94, 0x0c, 0xb8, + 0x1e, 0xa5, 0xa4, 0xa4, 0x1f, 0x0d, 0x85, 0xec, 0x2b, 0x0d, 0xa4, 0x94, 0x68, 0x8b, 0x25, 0x11, + 0x55, 0x88, 0xb1, 0x24, 0x46, 0xb4, 0x9f, 0x71, 0x5e, 0x90, 0x28, 0xc2, 0x8d, 0x28, 0x09, 0x2a, + 0xcd, 0x86, 0x1c, 0xac, 0xfb, 0xbb, 0x78, 0xef, 0x01, 0xec, 0x81, 0x24, 0xd7, 0x75, 0xd0, 0x88, + 0x2d, 0x91, 0x81, 0x58, 0xd4, 0x5f, 0x3f, 0xd0, 0x46, 0xe1, 0x6f, 0x08, 0xfc, 0x02, 0x5c, 0x1b, + 0xad, 0x9e, 0x46, 0x24, 0x02, 0x14, 0xcc, 0x4b, 0x59, 0x03, 0xdf, 0x88, 0xf1, 0x1a, 0x51, 0x4f, + 0xfa, 0xc6, 0x14, 0x2b, 0x85, 0xbe, 0x2a, 0xd0, 0x4f, 0xc0, 0xe5, 0x28, 0xba, 0xd4, 0x4c, 0x90, + 0x81, 0x94, 0x92, 0x4c, 0x70, 0x7d, 0xdc, 0x5f, 0x54, 0x4d, 0xe9, 0xc5, 0x69, 0x2d, 0x22, 0xc0, + 0xcc, 0x0b, 0xcc, 0x1c, 0x3c, 0x11, 0xc5, 0xc4, 0xac, 0x59, 0xb3, 0x39, 0xd4, 0x3d, 0x90, 0x09, + 0xe9, 0x9d, 0x43, 0x20, 0x4f, 0x38, 0xeb, 0x04, 0xc1, 0x64, 0x18, 0x02, 0x77, 0x15, 0xea, 0x23, + 0xb8, 0xca, 0x94, 0xbf, 0xb6, 0xb0, 0x0f, 0x52, 0xaa, 0x6d, 0xc6, 0xd6, 0x59, 0x54, 0x5c, 0xc5, + 0xd6, 0xd9, 0x48, 0xf7, 0x8d, 0x3b, 0xb5, 0xec, 0x97, 0xac, 0x0f, 0x1f, 0x69, 0x00, 0x0c, 0x1f, + 0x74, 0x58, 0x3a, 0xc8, 0x6d, 0xb8, 0x4f, 0xeb, 0x67, 0x0e, 0x61, 0xa9, 0x38, 0x9c, 0x16, 0x1c, + 0x4e, 0xc1, 0x95, 0x49, 0x1c, 0x44, 0x87, 0xe1, 0x01, 0x50, 0x0d, 0xe1, 0x80, 0xdb, 0x1e, 0xee, + 0x23, 0x07, 0xdc, 0xf6, 0x48, 0x5f, 0x89, 0x0b, 0x40, 0xd0, 0x6b, 0xca, 0x97, 0x9e, 0xbe, 0xc8, + 0x6b, 0xcf, 0x5e, 0xe4, 0xb5, 0x3f, 0x5e, 0xe4, 0xb5, 0xc7, 0xfb, 0xf9, 0x99, 0x67, 0xfb, 0xf9, + 0x99, 0x5f, 0xf7, 0xf3, 0x33, 0x9f, 0x6d, 0x86, 0xfa, 0xed, 0x60, 0x2f, 0xa1, 0x56, 0x6f, 0xeb, + 0x1d, 0xab, 0x2f, 0xfc, 0x88, 0x9e, 0x5b, 0x9f, 0x17, 0xed, 0xfd, 0xad, 0x7f, 0x02, 0x00, 0x00, + 0xff, 0xff, 0x58, 0x44, 0xe3, 0x89, 0xce, 0x11, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/evm/types/tx.pb.go b/x/evm/types/tx.pb.go index 797d22cef6..45c562600c 100644 --- a/x/evm/types/tx.pb.go +++ b/x/evm/types/tx.pb.go @@ -211,7 +211,7 @@ type DynamicFeeTx struct { GasLimit uint64 `protobuf:"varint,5,opt,name=gas,proto3" json:"gas,omitempty"` // to is the hex formatted address of the recipient To string `protobuf:"bytes,6,opt,name=to,proto3" json:"to,omitempty"` - // value defines the the transaction amount. + // value defines the transaction amount. Amount *cosmossdk_io_math.Int `protobuf:"bytes,7,opt,name=value,proto3,customtype=cosmossdk.io/math.Int" json:"value,omitempty"` // data is the data payload bytes of the transaction. Data []byte `protobuf:"bytes,8,opt,name=data,proto3" json:"data,omitempty"` @@ -456,65 +456,65 @@ func init() { proto.RegisterFile("ethermint/evm/v1/tx.proto", fileDescriptor_f75 var fileDescriptor_f75ac0a12d075f21 = []byte{ // 963 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x55, 0xcf, 0x6f, 0xe3, 0x44, - 0x14, 0xae, 0x13, 0xe7, 0xd7, 0x24, 0x94, 0x95, 0xd5, 0x6a, 0x9d, 0x00, 0x71, 0x36, 0x48, 0x90, - 0x45, 0xaa, 0xad, 0x16, 0xa9, 0xd2, 0xf6, 0x44, 0xb3, 0xed, 0xa2, 0x45, 0xad, 0x58, 0x99, 0xec, - 0x05, 0x90, 0xa2, 0xa9, 0x3d, 0x9d, 0x8c, 0x88, 0x3d, 0x96, 0x67, 0x62, 0x25, 0x1c, 0xf7, 0xc4, - 0x0d, 0x10, 0xff, 0x00, 0x07, 0x4e, 0x9c, 0x38, 0xec, 0x99, 0xf3, 0x8a, 0xd3, 0x0a, 0x2e, 0x88, - 0x83, 0x41, 0x29, 0x12, 0x52, 0x8f, 0x9c, 0x39, 0xa0, 0x99, 0x71, 0x9a, 0x66, 0x43, 0x5a, 0x58, - 0x89, 0xbd, 0xcd, 0xf3, 0xfb, 0xde, 0x8f, 0xf9, 0xbe, 0xf1, 0x7b, 0xa0, 0x8e, 0xf8, 0x00, 0xc5, - 0x01, 0x09, 0xb9, 0x83, 0x92, 0xc0, 0x49, 0xb6, 0x1d, 0x3e, 0xb6, 0xa3, 0x98, 0x72, 0x6a, 0xdc, - 0xb8, 0x70, 0xd9, 0x28, 0x09, 0xec, 0x64, 0xbb, 0x71, 0xd3, 0xa3, 0x2c, 0xa0, 0xcc, 0x09, 0x18, - 0x16, 0xc8, 0x80, 0x61, 0x05, 0x6d, 0xd4, 0x95, 0xa3, 0x2f, 0x2d, 0x47, 0x19, 0x99, 0xab, 0xb1, - 0x54, 0x40, 0x24, 0x53, 0xbe, 0x0d, 0x4c, 0x31, 0x55, 0x31, 0xe2, 0x94, 0x7d, 0x7d, 0x15, 0x53, - 0x8a, 0x87, 0xc8, 0x81, 0x11, 0x71, 0x60, 0x18, 0x52, 0x0e, 0x39, 0xa1, 0xe1, 0x2c, 0x5f, 0x3d, - 0xf3, 0x4a, 0xeb, 0x64, 0x74, 0xea, 0xc0, 0x70, 0xa2, 0x5c, 0xed, 0xcf, 0x35, 0xf0, 0xd2, 0x31, - 0xc3, 0x87, 0xa2, 0x20, 0x1a, 0x05, 0xbd, 0xb1, 0xd1, 0x01, 0xba, 0x0f, 0x39, 0x34, 0xb5, 0x96, - 0xd6, 0xa9, 0xee, 0x6c, 0xd8, 0x2a, 0xd6, 0x9e, 0xc5, 0xda, 0xfb, 0xe1, 0xc4, 0x95, 0x08, 0xa3, - 0x0e, 0x74, 0x46, 0x3e, 0x45, 0x66, 0xae, 0xa5, 0x75, 0xb4, 0x6e, 0xe1, 0x3c, 0xb5, 0xb4, 0x2d, - 0x57, 0x7e, 0x32, 0x2c, 0xa0, 0x0f, 0x20, 0x1b, 0x98, 0xf9, 0x96, 0xd6, 0xa9, 0x74, 0xab, 0x7f, - 0xa6, 0x56, 0x29, 0x1e, 0x46, 0x7b, 0xed, 0xad, 0xb6, 0x2b, 0x1d, 0x86, 0x01, 0xf4, 0xd3, 0x98, - 0x06, 0xa6, 0x2e, 0x00, 0xae, 0x3c, 0xef, 0xe9, 0x9f, 0x7d, 0x6d, 0xad, 0xb5, 0xbf, 0xcc, 0x81, - 0xf2, 0x11, 0xc2, 0xd0, 0x9b, 0xf4, 0xc6, 0xc6, 0x06, 0x28, 0x84, 0x34, 0xf4, 0x90, 0xec, 0x46, - 0x77, 0x95, 0x61, 0xec, 0x82, 0x0a, 0x86, 0x82, 0x39, 0xe2, 0xa9, 0xea, 0x95, 0x6e, 0xfd, 0x97, - 0xd4, 0xda, 0x54, 0x24, 0x32, 0xff, 0x13, 0x9b, 0x50, 0x27, 0x80, 0x7c, 0x60, 0xdf, 0x0f, 0xb9, - 0x5b, 0xc6, 0x90, 0x3d, 0x10, 0x50, 0xa3, 0x09, 0xf2, 0x18, 0x32, 0xd9, 0x94, 0xde, 0xad, 0x4d, - 0x53, 0xab, 0xfc, 0x2e, 0x64, 0x47, 0x24, 0x20, 0xdc, 0x15, 0x0e, 0x63, 0x1d, 0xe4, 0x38, 0xcd, - 0x5a, 0xca, 0x71, 0x6a, 0xdc, 0x01, 0x85, 0x04, 0x0e, 0x47, 0xc8, 0x2c, 0xc8, 0x1a, 0xaf, 0xaf, - 0xac, 0x31, 0x4d, 0xad, 0xe2, 0x7e, 0x40, 0x47, 0x21, 0x77, 0x55, 0x84, 0xb8, 0x9f, 0x64, 0xb1, - 0xd8, 0xd2, 0x3a, 0xb5, 0x8c, 0xaf, 0x1a, 0xd0, 0x12, 0xb3, 0x24, 0x3f, 0x68, 0x89, 0xb0, 0x62, - 0xb3, 0xac, 0xac, 0x58, 0x58, 0xcc, 0xac, 0x28, 0x8b, 0xed, 0xad, 0x0b, 0x26, 0x7e, 0x78, 0xbc, - 0x55, 0xec, 0x8d, 0x0f, 0x20, 0x87, 0xed, 0xef, 0xf3, 0xa0, 0xb6, 0xef, 0x79, 0x88, 0xb1, 0x23, - 0xc2, 0x78, 0x6f, 0x6c, 0xbc, 0x07, 0xca, 0xde, 0x00, 0x92, 0xb0, 0x4f, 0x7c, 0x49, 0x4d, 0xa5, - 0xeb, 0x5c, 0xd5, 0x5c, 0xe9, 0xae, 0x00, 0xdf, 0x3f, 0x38, 0x4f, 0xad, 0x92, 0xa7, 0x8e, 0x6e, - 0x76, 0xf0, 0xe7, 0x1c, 0xe7, 0x56, 0x72, 0x9c, 0xff, 0xcf, 0x1c, 0xeb, 0x57, 0x73, 0x5c, 0x58, - 0xe6, 0xb8, 0xf8, 0xdc, 0x1c, 0x97, 0x2e, 0x71, 0xfc, 0x11, 0x28, 0x43, 0x49, 0x14, 0x62, 0x66, - 0xb9, 0x95, 0xef, 0x54, 0x77, 0x5e, 0xb3, 0x9f, 0xfd, 0x27, 0x6d, 0x45, 0x65, 0x6f, 0x14, 0x0d, - 0x51, 0xb7, 0xf5, 0x24, 0xb5, 0xd6, 0xce, 0x53, 0x0b, 0xc0, 0x0b, 0x7e, 0xbf, 0xfd, 0xd5, 0x02, - 0x73, 0xb6, 0xdd, 0x8b, 0x84, 0x4a, 0xc0, 0xca, 0x82, 0x80, 0x60, 0x41, 0xc0, 0xea, 0x2a, 0x01, - 0xff, 0xca, 0x83, 0xda, 0xc1, 0x24, 0x84, 0x01, 0xf1, 0xee, 0x21, 0xf4, 0x42, 0x04, 0xbc, 0x03, - 0xaa, 0x42, 0x40, 0x4e, 0xa2, 0xbe, 0x07, 0xa3, 0xeb, 0x25, 0x14, 0x72, 0xf7, 0x48, 0x74, 0x17, - 0x46, 0xb3, 0xd0, 0x53, 0x84, 0x64, 0xa8, 0xfe, 0x6f, 0x42, 0xef, 0x21, 0x24, 0x42, 0x33, 0xf9, - 0x0b, 0x57, 0xcb, 0x5f, 0x5c, 0x96, 0xbf, 0xf4, 0xdc, 0xf2, 0x97, 0x57, 0xc8, 0x5f, 0xf9, 0x5f, - 0xe4, 0x07, 0x0b, 0xf2, 0x57, 0x17, 0xe4, 0xaf, 0xad, 0x92, 0xbf, 0x0d, 0x1a, 0x87, 0x63, 0x8e, - 0x42, 0x46, 0x68, 0xf8, 0x7e, 0x24, 0x47, 0xf3, 0x7c, 0xe2, 0x66, 0x73, 0xef, 0x1b, 0x0d, 0x6c, - 0x2e, 0x4c, 0x62, 0x17, 0xb1, 0x88, 0x86, 0x4c, 0x5e, 0x54, 0x0e, 0x53, 0x4d, 0xcd, 0x4a, 0x39, - 0x3f, 0x6f, 0x03, 0x7d, 0x48, 0x31, 0x33, 0x73, 0xf2, 0x92, 0x9b, 0xcb, 0x97, 0x3c, 0xa2, 0xd8, - 0x95, 0x10, 0xe3, 0x06, 0xc8, 0xc7, 0x88, 0xcb, 0x07, 0x50, 0x73, 0xc5, 0xd1, 0xa8, 0x83, 0x72, - 0x12, 0xf4, 0x51, 0x1c, 0xd3, 0x38, 0x9b, 0x76, 0xa5, 0x24, 0x38, 0x14, 0xa6, 0x70, 0x09, 0xe9, - 0x47, 0x0c, 0xf9, 0x4a, 0x44, 0xb7, 0x84, 0x21, 0x7b, 0xc8, 0x90, 0x3f, 0x1b, 0xcf, 0x1a, 0x78, - 0xf9, 0x98, 0xe1, 0x87, 0x91, 0x0f, 0x39, 0x7a, 0x00, 0x63, 0x18, 0x30, 0x31, 0x2b, 0xe0, 0x88, - 0x0f, 0x68, 0x4c, 0xf8, 0x24, 0x7b, 0xcd, 0xe6, 0x8f, 0x8f, 0xb7, 0x36, 0xb2, 0xa5, 0xb6, 0xef, - 0xfb, 0x31, 0x62, 0xec, 0x03, 0x1e, 0x93, 0x10, 0xbb, 0x73, 0xa8, 0xb1, 0x0b, 0x8a, 0x91, 0xcc, - 0x20, 0x5f, 0x6e, 0x75, 0xc7, 0x5c, 0xbe, 0x86, 0xaa, 0xd0, 0xd5, 0x85, 0x4c, 0x6e, 0x86, 0xde, - 0x5b, 0x7f, 0xf4, 0xc7, 0x77, 0x6f, 0xcd, 0xf3, 0xb4, 0xeb, 0xe0, 0xe6, 0x33, 0x2d, 0xcd, 0xb8, - 0xdb, 0x49, 0x35, 0x90, 0x3f, 0x66, 0xd8, 0x98, 0x00, 0x70, 0x69, 0xc7, 0x59, 0xcb, 0x85, 0x16, - 0xa8, 0x6f, 0xbc, 0x79, 0x0d, 0x60, 0x96, 0xbf, 0x7d, 0xeb, 0xd1, 0x4f, 0xbf, 0x7f, 0x95, 0x7b, - 0xa5, 0x5d, 0x17, 0x2b, 0x9a, 0xb2, 0x8b, 0x7d, 0x9d, 0x21, 0xfb, 0x7c, 0x6c, 0x7c, 0x0c, 0x6a, - 0x0b, 0x6c, 0xdd, 0xfa, 0xc7, 0xdc, 0x97, 0x21, 0x8d, 0xdb, 0xd7, 0x42, 0x66, 0x0d, 0x74, 0xdf, - 0x79, 0x32, 0x6d, 0x6a, 0x4f, 0xa7, 0x4d, 0xed, 0xb7, 0x69, 0x53, 0xfb, 0xe2, 0xac, 0xb9, 0xf6, - 0xf4, 0xac, 0xb9, 0xf6, 0xf3, 0x59, 0x73, 0xed, 0xc3, 0x37, 0x30, 0xe1, 0x83, 0xd1, 0x89, 0xed, - 0xd1, 0x60, 0xde, 0x1c, 0x65, 0x4e, 0xb2, 0xbd, 0xeb, 0x8c, 0x65, 0xa3, 0x7c, 0x12, 0x21, 0x76, - 0x52, 0x94, 0xab, 0xfd, 0xed, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0x5e, 0x90, 0x12, 0xd5, 0xd7, + 0x14, 0x8e, 0x13, 0xe7, 0xd7, 0x24, 0x2c, 0x2b, 0xab, 0xd5, 0x3a, 0x01, 0xe2, 0x6c, 0x90, 0x20, + 0x8b, 0x54, 0x5b, 0x2d, 0xd2, 0xa2, 0xed, 0x89, 0x66, 0xdb, 0x45, 0x8b, 0x5a, 0xb1, 0x32, 0xd9, + 0x0b, 0x20, 0x45, 0x53, 0x7b, 0x3a, 0x19, 0x11, 0x7b, 0x2c, 0xcf, 0xc4, 0x4a, 0x38, 0xee, 0x89, + 0x1b, 0x20, 0xfe, 0x01, 0x0e, 0x9c, 0x38, 0x71, 0xd8, 0x33, 0xe7, 0x15, 0xa7, 0x15, 0x5c, 0x10, + 0x07, 0x83, 0x52, 0x24, 0xa4, 0x1e, 0x39, 0x73, 0x40, 0x33, 0xe3, 0x34, 0xcd, 0x86, 0xb4, 0xb0, + 0x12, 0xdc, 0xe6, 0xf9, 0x7d, 0xef, 0xc7, 0x7c, 0xdf, 0xf8, 0x3d, 0xd0, 0x40, 0x7c, 0x88, 0xe2, + 0x80, 0x84, 0xdc, 0x41, 0x49, 0xe0, 0x24, 0xdb, 0x0e, 0x9f, 0xd8, 0x51, 0x4c, 0x39, 0x35, 0xae, + 0x9f, 0xbb, 0x6c, 0x94, 0x04, 0x76, 0xb2, 0xdd, 0xbc, 0xe1, 0x51, 0x16, 0x50, 0xe6, 0x04, 0x0c, + 0x0b, 0x64, 0xc0, 0xb0, 0x82, 0x36, 0x1b, 0xca, 0x31, 0x90, 0x96, 0xa3, 0x8c, 0xcc, 0xd5, 0x5c, + 0x29, 0x20, 0x92, 0x29, 0xdf, 0x06, 0xa6, 0x98, 0xaa, 0x18, 0x71, 0xca, 0xbe, 0xbe, 0x8c, 0x29, + 0xc5, 0x23, 0xe4, 0xc0, 0x88, 0x38, 0x30, 0x0c, 0x29, 0x87, 0x9c, 0xd0, 0x70, 0x9e, 0xaf, 0x91, + 0x79, 0xa5, 0x75, 0x3c, 0x3e, 0x71, 0x60, 0x38, 0x55, 0xae, 0xce, 0x67, 0x1a, 0x78, 0xe1, 0x88, + 0xe1, 0x03, 0x51, 0x10, 0x8d, 0x83, 0xfe, 0xc4, 0xe8, 0x02, 0xdd, 0x87, 0x1c, 0x9a, 0x5a, 0x5b, + 0xeb, 0xd6, 0x76, 0x36, 0x6c, 0x15, 0x6b, 0xcf, 0x63, 0xed, 0xbd, 0x70, 0xea, 0x4a, 0x84, 0xd1, + 0x00, 0x3a, 0x23, 0x9f, 0x20, 0x33, 0xdf, 0xd6, 0xba, 0x5a, 0xaf, 0x78, 0x96, 0x5a, 0xda, 0x96, + 0x2b, 0x3f, 0x19, 0x16, 0xd0, 0x87, 0x90, 0x0d, 0xcd, 0x42, 0x5b, 0xeb, 0x56, 0x7b, 0xb5, 0x3f, + 0x52, 0xab, 0x1c, 0x8f, 0xa2, 0xdd, 0xce, 0x56, 0xc7, 0x95, 0x0e, 0xc3, 0x00, 0xfa, 0x49, 0x4c, + 0x03, 0x53, 0x17, 0x00, 0x57, 0x9e, 0x77, 0xf5, 0x4f, 0xbf, 0xb2, 0x72, 0x9d, 0x2f, 0xf2, 0xa0, + 0x72, 0x88, 0x30, 0xf4, 0xa6, 0xfd, 0x89, 0xb1, 0x01, 0x8a, 0x21, 0x0d, 0x3d, 0x24, 0xbb, 0xd1, + 0x5d, 0x65, 0x18, 0xb7, 0x41, 0x15, 0x43, 0xc1, 0x1c, 0xf1, 0x54, 0xf5, 0x6a, 0xaf, 0xf1, 0x73, + 0x6a, 0x6d, 0x2a, 0x12, 0x99, 0xff, 0xb1, 0x4d, 0xa8, 0x13, 0x40, 0x3e, 0xb4, 0xef, 0x87, 0xdc, + 0xad, 0x60, 0xc8, 0x1e, 0x08, 0xa8, 0xd1, 0x02, 0x05, 0x0c, 0x99, 0x6c, 0x4a, 0xef, 0xd5, 0x67, + 0xa9, 0x55, 0x79, 0x07, 0xb2, 0x43, 0x12, 0x10, 0xee, 0x0a, 0x87, 0x71, 0x0d, 0xe4, 0x39, 0xcd, + 0x5a, 0xca, 0x73, 0x6a, 0xdc, 0x01, 0xc5, 0x04, 0x8e, 0xc6, 0xc8, 0x2c, 0xca, 0x1a, 0xaf, 0xae, + 0xad, 0x31, 0x4b, 0xad, 0xd2, 0x5e, 0x40, 0xc7, 0x21, 0x77, 0x55, 0x84, 0xb8, 0x9f, 0x64, 0xb1, + 0xd4, 0xd6, 0xba, 0xf5, 0x8c, 0xaf, 0x3a, 0xd0, 0x12, 0xb3, 0x2c, 0x3f, 0x68, 0x89, 0xb0, 0x62, + 0xb3, 0xa2, 0xac, 0x58, 0x58, 0xcc, 0xac, 0x2a, 0x8b, 0xed, 0x5e, 0x13, 0x4c, 0x7c, 0xff, 0x78, + 0xab, 0xd4, 0x9f, 0xec, 0x43, 0x0e, 0x3b, 0xdf, 0x15, 0x40, 0x7d, 0xcf, 0xf3, 0x10, 0x63, 0x87, + 0x84, 0xf1, 0xfe, 0xc4, 0x78, 0x17, 0x54, 0xbc, 0x21, 0x24, 0xe1, 0x80, 0xf8, 0x92, 0x9a, 0x6a, + 0xcf, 0xb9, 0xac, 0xb9, 0xf2, 0x5d, 0x01, 0xbe, 0xbf, 0x7f, 0x96, 0x5a, 0x65, 0x4f, 0x1d, 0xdd, + 0xec, 0xe0, 0x2f, 0x38, 0xce, 0xaf, 0xe5, 0xb8, 0xf0, 0xaf, 0x39, 0xd6, 0x2f, 0xe7, 0xb8, 0xb8, + 0xca, 0x71, 0xe9, 0xb9, 0x39, 0x2e, 0x5f, 0xe0, 0xf8, 0x43, 0x50, 0x81, 0x92, 0x28, 0xc4, 0xcc, + 0x4a, 0xbb, 0xd0, 0xad, 0xed, 0xbc, 0x62, 0x3f, 0xfb, 0x4f, 0xda, 0x8a, 0xca, 0xfe, 0x38, 0x1a, + 0xa1, 0x5e, 0xfb, 0x49, 0x6a, 0xe5, 0xce, 0x52, 0x0b, 0xc0, 0x73, 0x7e, 0xbf, 0xf9, 0xc5, 0x02, + 0x0b, 0xb6, 0xdd, 0xf3, 0x84, 0x4a, 0xc0, 0xea, 0x92, 0x80, 0x60, 0x49, 0xc0, 0xda, 0x3a, 0x01, + 0xff, 0x2c, 0x80, 0xfa, 0xfe, 0x34, 0x84, 0x01, 0xf1, 0xee, 0x21, 0xf4, 0xbf, 0x08, 0x78, 0x07, + 0xd4, 0x84, 0x80, 0x9c, 0x44, 0x03, 0x0f, 0x46, 0x57, 0x4b, 0x28, 0xe4, 0xee, 0x93, 0xe8, 0x2e, + 0x8c, 0xe6, 0xa1, 0x27, 0x08, 0xc9, 0x50, 0xfd, 0x9f, 0x84, 0xde, 0x43, 0x48, 0x84, 0x66, 0xf2, + 0x17, 0x2f, 0x97, 0xbf, 0xb4, 0x2a, 0x7f, 0xf9, 0xb9, 0xe5, 0xaf, 0xac, 0x91, 0xbf, 0xfa, 0x9f, + 0xc8, 0x0f, 0x96, 0xe4, 0xaf, 0x2d, 0xc9, 0x5f, 0x5f, 0x27, 0x7f, 0x07, 0x34, 0x0f, 0x26, 0x1c, + 0x85, 0x8c, 0xd0, 0xf0, 0xbd, 0x48, 0x8e, 0xe6, 0xc5, 0xc4, 0xcd, 0xe6, 0xde, 0xd7, 0x1a, 0xd8, + 0x5c, 0x9a, 0xc4, 0x2e, 0x62, 0x11, 0x0d, 0x99, 0xbc, 0xa8, 0x1c, 0xa6, 0x9a, 0x9a, 0x95, 0x72, + 0x7e, 0xde, 0x02, 0xfa, 0x88, 0x62, 0x66, 0xe6, 0xe5, 0x25, 0x37, 0x57, 0x2f, 0x79, 0x48, 0xb1, + 0x2b, 0x21, 0xc6, 0x75, 0x50, 0x88, 0x11, 0x97, 0x0f, 0xa0, 0xee, 0x8a, 0xa3, 0xd1, 0x00, 0x95, + 0x24, 0x18, 0xa0, 0x38, 0xa6, 0x71, 0x36, 0xed, 0xca, 0x49, 0x70, 0x20, 0x4c, 0xe1, 0x12, 0xd2, + 0x8f, 0x19, 0xf2, 0x95, 0x88, 0x6e, 0x19, 0x43, 0xf6, 0x90, 0x21, 0x7f, 0x3e, 0x9e, 0x35, 0xf0, + 0xe2, 0x11, 0xc3, 0x0f, 0x23, 0x1f, 0x72, 0xf4, 0x00, 0xc6, 0x30, 0x60, 0x62, 0x56, 0xc0, 0x31, + 0x1f, 0xd2, 0x98, 0xf0, 0x69, 0xf6, 0x9a, 0xcd, 0x1f, 0x1e, 0x6f, 0x6d, 0x64, 0x4b, 0x6d, 0xcf, + 0xf7, 0x63, 0xc4, 0xd8, 0xfb, 0x3c, 0x26, 0x21, 0x76, 0x17, 0x50, 0xe3, 0x36, 0x28, 0x45, 0x32, + 0x83, 0x7c, 0xb9, 0xb5, 0x1d, 0x73, 0xf5, 0x1a, 0xaa, 0x42, 0x4f, 0x17, 0x32, 0xb9, 0x19, 0x7a, + 0xf7, 0xda, 0xa3, 0xdf, 0xbf, 0x7d, 0x63, 0x91, 0xa7, 0xd3, 0x00, 0x37, 0x9e, 0x69, 0x69, 0xce, + 0xdd, 0x4e, 0xaa, 0x81, 0xc2, 0x11, 0xc3, 0xc6, 0x14, 0x80, 0x0b, 0x3b, 0xce, 0x5a, 0x2d, 0xb4, + 0x44, 0x7d, 0xf3, 0xf5, 0x2b, 0x00, 0xf3, 0xfc, 0x9d, 0x9b, 0x8f, 0x7e, 0xfc, 0xed, 0xcb, 0xfc, + 0x4b, 0x9d, 0x86, 0x58, 0xd1, 0x94, 0x9d, 0xef, 0xeb, 0x0c, 0x39, 0xe0, 0x13, 0xe3, 0x23, 0x50, + 0x5f, 0x62, 0xeb, 0xe6, 0xdf, 0xe6, 0xbe, 0x08, 0x69, 0xde, 0xba, 0x12, 0x32, 0x6f, 0xa0, 0xf7, + 0xf6, 0x93, 0x59, 0x4b, 0x7b, 0x3a, 0x6b, 0x69, 0xbf, 0xce, 0x5a, 0xda, 0xe7, 0xa7, 0xad, 0xdc, + 0xd3, 0xd3, 0x56, 0xee, 0xa7, 0xd3, 0x56, 0xee, 0x83, 0xd7, 0x30, 0xe1, 0xc3, 0xf1, 0xb1, 0xed, + 0xd1, 0x60, 0xd1, 0x1c, 0x65, 0x4e, 0xb2, 0xfd, 0x96, 0x33, 0x91, 0x8d, 0xf2, 0x69, 0x84, 0xd8, + 0x71, 0x49, 0xae, 0xf6, 0x37, 0xff, 0x0a, 0x00, 0x00, 0xff, 0xff, 0xc0, 0x13, 0xc8, 0x4a, 0xd7, 0x08, 0x00, 0x00, } diff --git a/x/evm/types/tx_args_test.go b/x/evm/types/tx_args_test.go index 7d99813da7..70861feace 100644 --- a/x/evm/types/tx_args_test.go +++ b/x/evm/types/tx_args_test.go @@ -7,7 +7,7 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/x/evm/types" ) func (suite *TxDataTestSuite) TestTxArgsString() { diff --git a/x/evm/types/utils_test.go b/x/evm/types/utils_test.go index e4ada53032..5d29b65698 100644 --- a/x/evm/types/utils_test.go +++ b/x/evm/types/utils_test.go @@ -14,10 +14,10 @@ import ( proto "github.com/cosmos/gogoproto/proto" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/encoding" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/encoding" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" "github.com/stretchr/testify/require" ) diff --git a/x/feemarket/client/cli/query.go b/x/feemarket/client/cli/query.go index 1c1b5f5e42..b2e467fb87 100644 --- a/x/feemarket/client/cli/query.go +++ b/x/feemarket/client/cli/query.go @@ -8,7 +8,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/evmos/evmos/v16/x/feemarket/types" + "github.com/evmos/evmos/v17/x/feemarket/types" ) // GetQueryCmd returns the parent command for all x/feemarket CLI query commands. diff --git a/x/feemarket/genesis.go b/x/feemarket/genesis.go index c4aa3cc3b0..58ee93cd50 100644 --- a/x/feemarket/genesis.go +++ b/x/feemarket/genesis.go @@ -7,8 +7,8 @@ import ( abci "github.com/cometbft/cometbft/abci/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/x/feemarket/keeper" - "github.com/evmos/evmos/v16/x/feemarket/types" + "github.com/evmos/evmos/v17/x/feemarket/keeper" + "github.com/evmos/evmos/v17/x/feemarket/types" ) // InitGenesis initializes genesis state based on exported genesis diff --git a/x/feemarket/keeper/abci.go b/x/feemarket/keeper/abci.go index d4fb8911e3..4758cadf9c 100644 --- a/x/feemarket/keeper/abci.go +++ b/x/feemarket/keeper/abci.go @@ -6,7 +6,7 @@ import ( "fmt" abci "github.com/cometbft/cometbft/abci/types" - "github.com/evmos/evmos/v16/x/feemarket/types" + "github.com/evmos/evmos/v17/x/feemarket/types" "cosmossdk.io/math" "github.com/cosmos/cosmos-sdk/telemetry" diff --git a/x/feemarket/keeper/grpc_query.go b/x/feemarket/keeper/grpc_query.go index 260e7b6480..a859d0e5dc 100644 --- a/x/feemarket/keeper/grpc_query.go +++ b/x/feemarket/keeper/grpc_query.go @@ -9,7 +9,7 @@ import ( sdkmath "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/x/feemarket/types" + "github.com/evmos/evmos/v17/x/feemarket/types" ) var _ types.QueryServer = Keeper{} diff --git a/x/feemarket/keeper/grpc_query_test.go b/x/feemarket/keeper/grpc_query_test.go index 871661ce06..12a411463f 100644 --- a/x/feemarket/keeper/grpc_query_test.go +++ b/x/feemarket/keeper/grpc_query_test.go @@ -3,7 +3,7 @@ package keeper_test import ( sdkmath "cosmossdk.io/math" ethparams "github.com/ethereum/go-ethereum/params" - "github.com/evmos/evmos/v16/x/feemarket/types" + "github.com/evmos/evmos/v17/x/feemarket/types" ) func (suite *KeeperTestSuite) TestQueryParams() { diff --git a/x/feemarket/keeper/integration_test.go b/x/feemarket/keeper/integration_test.go index 253eb4cbb2..c06b1c7b9b 100644 --- a/x/feemarket/keeper/integration_test.go +++ b/x/feemarket/keeper/integration_test.go @@ -12,10 +12,10 @@ import ( . "github.com/onsi/gomega" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" - "github.com/evmos/evmos/v16/testutil" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/utils" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + "github.com/evmos/evmos/v17/testutil" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v17/utils" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" ) diff --git a/x/feemarket/keeper/keeper.go b/x/feemarket/keeper/keeper.go index a952bda910..275f9ed141 100644 --- a/x/feemarket/keeper/keeper.go +++ b/x/feemarket/keeper/keeper.go @@ -11,7 +11,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" - "github.com/evmos/evmos/v16/x/feemarket/types" + "github.com/evmos/evmos/v17/x/feemarket/types" ) // KeyPrefixBaseFeeV1 TODO: Temporary will be removed with params refactor PR diff --git a/x/feemarket/keeper/migrations.go b/x/feemarket/keeper/migrations.go index 8abd4d10b3..dafe0d17fe 100644 --- a/x/feemarket/keeper/migrations.go +++ b/x/feemarket/keeper/migrations.go @@ -4,8 +4,8 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" - v4 "github.com/evmos/evmos/v16/x/feemarket/migrations/v4" - "github.com/evmos/evmos/v16/x/feemarket/types" + v4 "github.com/evmos/evmos/v17/x/feemarket/migrations/v4" + "github.com/evmos/evmos/v17/x/feemarket/types" ) // Migrator is a struct for handling in-place store migrations. diff --git a/x/feemarket/keeper/migrations_test.go b/x/feemarket/keeper/migrations_test.go index 1941f40732..6217026728 100644 --- a/x/feemarket/keeper/migrations_test.go +++ b/x/feemarket/keeper/migrations_test.go @@ -2,8 +2,8 @@ package keeper_test import ( sdk "github.com/cosmos/cosmos-sdk/types" - feemarketkeeper "github.com/evmos/evmos/v16/x/feemarket/keeper" - "github.com/evmos/evmos/v16/x/feemarket/types" + feemarketkeeper "github.com/evmos/evmos/v17/x/feemarket/keeper" + "github.com/evmos/evmos/v17/x/feemarket/types" ) type mockSubspace struct { diff --git a/x/feemarket/keeper/msg_server.go b/x/feemarket/keeper/msg_server.go index 34fa1f43af..7cd10dca4a 100644 --- a/x/feemarket/keeper/msg_server.go +++ b/x/feemarket/keeper/msg_server.go @@ -8,7 +8,7 @@ import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - "github.com/evmos/evmos/v16/x/feemarket/types" + "github.com/evmos/evmos/v17/x/feemarket/types" ) // UpdateParams implements the gRPC MsgServer interface. When an UpdateParams diff --git a/x/feemarket/keeper/msg_server_test.go b/x/feemarket/keeper/msg_server_test.go index d4af4e55ac..f760cc597a 100644 --- a/x/feemarket/keeper/msg_server_test.go +++ b/x/feemarket/keeper/msg_server_test.go @@ -3,7 +3,7 @@ package keeper_test import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - "github.com/evmos/evmos/v16/x/feemarket/types" + "github.com/evmos/evmos/v17/x/feemarket/types" ) func (suite *KeeperTestSuite) TestUpdateParams() { diff --git a/x/feemarket/keeper/params.go b/x/feemarket/keeper/params.go index cd51a5ef0d..82aae7e9b3 100644 --- a/x/feemarket/keeper/params.go +++ b/x/feemarket/keeper/params.go @@ -6,7 +6,7 @@ import ( "math/big" "cosmossdk.io/math" - "github.com/evmos/evmos/v16/x/feemarket/types" + "github.com/evmos/evmos/v17/x/feemarket/types" sdk "github.com/cosmos/cosmos-sdk/types" ) diff --git a/x/feemarket/keeper/params_test.go b/x/feemarket/keeper/params_test.go index ae0d000b7b..0c549bb962 100644 --- a/x/feemarket/keeper/params_test.go +++ b/x/feemarket/keeper/params_test.go @@ -3,7 +3,7 @@ package keeper_test import ( "reflect" - "github.com/evmos/evmos/v16/x/feemarket/types" + "github.com/evmos/evmos/v17/x/feemarket/types" ) func (suite *KeeperTestSuite) TestGetParams() { diff --git a/x/feemarket/keeper/setup_test.go b/x/feemarket/keeper/setup_test.go index d00dd40b76..4ad1e3a2cd 100644 --- a/x/feemarket/keeper/setup_test.go +++ b/x/feemarket/keeper/setup_test.go @@ -14,9 +14,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/utils" - "github.com/evmos/evmos/v16/x/feemarket/types" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v17/x/feemarket/types" "github.com/stretchr/testify/suite" ) diff --git a/x/feemarket/keeper/utils_test.go b/x/feemarket/keeper/utils_test.go index 45a5065a6c..5de9d83a4b 100644 --- a/x/feemarket/keeper/utils_test.go +++ b/x/feemarket/keeper/utils_test.go @@ -5,7 +5,7 @@ import ( "math/big" "time" - "github.com/evmos/evmos/v16/utils" + "github.com/evmos/evmos/v17/utils" "cosmossdk.io/math" "github.com/cosmos/cosmos-sdk/baseapp" @@ -21,14 +21,14 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" - "github.com/evmos/evmos/v16/encoding" - "github.com/evmos/evmos/v16/testutil" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - evmostypes "github.com/evmos/evmos/v16/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - "github.com/evmos/evmos/v16/x/feemarket/types" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + "github.com/evmos/evmos/v17/encoding" + "github.com/evmos/evmos/v17/testutil" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + evmostypes "github.com/evmos/evmos/v17/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v17/x/feemarket/types" "github.com/stretchr/testify/require" diff --git a/x/feemarket/migrations/v4/migrate.go b/x/feemarket/migrations/v4/migrate.go index 9ff64ab922..a657134eb4 100644 --- a/x/feemarket/migrations/v4/migrate.go +++ b/x/feemarket/migrations/v4/migrate.go @@ -6,7 +6,7 @@ import ( "github.com/cosmos/cosmos-sdk/codec" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/x/feemarket/types" + "github.com/evmos/evmos/v17/x/feemarket/types" ) // MigrateStore migrates the x/evm module state from the consensus version 3 to diff --git a/x/feemarket/migrations/v4/migrate_test.go b/x/feemarket/migrations/v4/migrate_test.go index 1e8902b1fc..61b163c514 100644 --- a/x/feemarket/migrations/v4/migrate_test.go +++ b/x/feemarket/migrations/v4/migrate_test.go @@ -20,10 +20,10 @@ import ( "github.com/cosmos/cosmos-sdk/testutil" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/encoding" - v4 "github.com/evmos/evmos/v16/x/feemarket/migrations/v4" - "github.com/evmos/evmos/v16/x/feemarket/types" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/encoding" + v4 "github.com/evmos/evmos/v17/x/feemarket/migrations/v4" + "github.com/evmos/evmos/v17/x/feemarket/types" "github.com/stretchr/testify/require" ) diff --git a/x/feemarket/migrations/v4/types/params.go b/x/feemarket/migrations/v4/types/params.go index 542f36aa11..e7cb12ca8d 100644 --- a/x/feemarket/migrations/v4/types/params.go +++ b/x/feemarket/migrations/v4/types/params.go @@ -5,7 +5,7 @@ package types import ( "fmt" - "github.com/evmos/evmos/v16/x/feemarket/types" + "github.com/evmos/evmos/v17/x/feemarket/types" "cosmossdk.io/math" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" diff --git a/x/feemarket/module.go b/x/feemarket/module.go index 462e7a4eb3..7854d14474 100644 --- a/x/feemarket/module.go +++ b/x/feemarket/module.go @@ -20,9 +20,9 @@ import ( "github.com/cosmos/cosmos-sdk/types/module" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" - "github.com/evmos/evmos/v16/x/feemarket/client/cli" - "github.com/evmos/evmos/v16/x/feemarket/keeper" - "github.com/evmos/evmos/v16/x/feemarket/types" + "github.com/evmos/evmos/v17/x/feemarket/client/cli" + "github.com/evmos/evmos/v17/x/feemarket/keeper" + "github.com/evmos/evmos/v17/x/feemarket/types" ) // consensusVersion defines the current x/feemarket module consensus version. diff --git a/x/feemarket/types/events.pb.go b/x/feemarket/types/events.pb.go index a210af19c0..606685ee82 100644 --- a/x/feemarket/types/events.pb.go +++ b/x/feemarket/types/events.pb.go @@ -145,9 +145,9 @@ var fileDescriptor_c6edce8d670faff7 = []byte{ 0x34, 0xaf, 0x44, 0x82, 0x09, 0x22, 0x0e, 0xe1, 0x39, 0xb9, 0x9d, 0x78, 0x24, 0xc7, 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x13, 0x1e, 0xcb, 0x31, 0x5c, 0x78, 0x2c, 0xc7, 0x70, 0xe3, 0xb1, 0x1c, 0x43, 0x94, 0x4e, 0x7a, 0x66, 0x49, 0x46, 0x69, 0x92, 0x5e, 0x72, 0x7e, 0xae, - 0x7e, 0x6a, 0x59, 0x6e, 0x7e, 0x31, 0x94, 0x2c, 0x33, 0x34, 0xd3, 0xaf, 0x40, 0xf2, 0x57, 0x49, - 0x65, 0x41, 0x6a, 0x71, 0x12, 0x1b, 0xd8, 0x53, 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf5, - 0x93, 0x86, 0xf3, 0xfb, 0x00, 0x00, 0x00, + 0x7e, 0x6a, 0x59, 0x6e, 0x7e, 0x31, 0x94, 0x2c, 0x33, 0x34, 0xd7, 0xaf, 0x40, 0xf2, 0x57, 0x49, + 0x65, 0x41, 0x6a, 0x71, 0x12, 0x1b, 0xd8, 0x53, 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb4, + 0x88, 0x0a, 0x9d, 0xfb, 0x00, 0x00, 0x00, } func (m *EventFeeMarket) Marshal() (dAtA []byte, err error) { diff --git a/x/feemarket/types/feemarket.pb.go b/x/feemarket/types/feemarket.pb.go index ca32b6b6da..916a04e965 100644 --- a/x/feemarket/types/feemarket.pb.go +++ b/x/feemarket/types/feemarket.pb.go @@ -118,29 +118,29 @@ var fileDescriptor_4feb8b20cf98e6e1 = []byte{ // 404 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0x41, 0x6b, 0xdb, 0x30, 0x14, 0xc7, 0xad, 0xa5, 0x4d, 0x5d, 0x75, 0x81, 0x20, 0xda, 0x61, 0x56, 0xe6, 0x9a, 0x15, 0x86, - 0x0f, 0xc3, 0x26, 0x14, 0xc6, 0x2e, 0xbb, 0x64, 0xa5, 0xdd, 0xc6, 0x06, 0x9d, 0x8f, 0xbb, 0x08, - 0xd9, 0x7d, 0xb1, 0x45, 0x2c, 0xc9, 0x58, 0x8a, 0x59, 0xbe, 0xc5, 0xbe, 0xc9, 0xbe, 0x46, 0x8e, - 0x39, 0x8e, 0x1d, 0xc2, 0x48, 0xbe, 0xc8, 0x88, 0x9d, 0xd8, 0x81, 0x5d, 0x76, 0x11, 0xd2, 0xfb, - 0xff, 0x7f, 0x7f, 0xde, 0x43, 0x0f, 0xbf, 0x02, 0x93, 0x41, 0x29, 0xb8, 0x34, 0xe1, 0x04, 0x40, - 0xb0, 0x72, 0x0a, 0x26, 0xac, 0x46, 0xdd, 0x23, 0x28, 0x4a, 0x65, 0x14, 0x79, 0xd6, 0xfa, 0x82, - 0x4e, 0xaa, 0x46, 0xcf, 0xcf, 0x53, 0x95, 0xaa, 0xda, 0x12, 0x6e, 0x6f, 0x8d, 0xfb, 0xe5, 0xcf, - 0x1e, 0xee, 0x3f, 0xb0, 0x92, 0x09, 0x4d, 0x5c, 0x7c, 0x26, 0x15, 0x8d, 0x99, 0x06, 0x3a, 0x01, - 0x70, 0x90, 0x87, 0x7c, 0x3b, 0x3a, 0x95, 0x6a, 0xcc, 0x34, 0xdc, 0x01, 0x90, 0x77, 0xf8, 0x72, - 0x2f, 0xd2, 0x24, 0x63, 0x32, 0x05, 0xfa, 0x08, 0x52, 0x09, 0x2e, 0x99, 0x51, 0xa5, 0xf3, 0xc4, - 0x43, 0xfe, 0x20, 0x72, 0xe2, 0xc6, 0xfd, 0xbe, 0x36, 0xdc, 0x76, 0x3a, 0xb9, 0xc1, 0x17, 0x90, - 0x33, 0x6d, 0x78, 0xc2, 0xcd, 0x9c, 0x8a, 0x59, 0x6e, 0x78, 0x91, 0x73, 0x28, 0x9d, 0x5e, 0x0d, - 0x9e, 0x77, 0xe2, 0x97, 0x56, 0x23, 0xd7, 0x78, 0x00, 0x92, 0xc5, 0x39, 0xd0, 0x0c, 0x78, 0x9a, - 0x19, 0xe7, 0xd8, 0x43, 0x7e, 0x2f, 0x7a, 0xda, 0x14, 0x3f, 0xd4, 0x35, 0xf2, 0x16, 0xdb, 0x6d, - 0xd7, 0x7d, 0x0f, 0xf9, 0xa7, 0xe3, 0x17, 0x8b, 0xd5, 0x95, 0xf5, 0x7b, 0x75, 0x75, 0x91, 0x28, - 0x2d, 0x94, 0xd6, 0x8f, 0xd3, 0x80, 0xab, 0x50, 0x30, 0x93, 0x05, 0x1f, 0xa5, 0x89, 0x4e, 0x76, - 0x4d, 0x92, 0x7b, 0x3c, 0x10, 0x5c, 0xd2, 0x94, 0x69, 0x5a, 0x94, 0x3c, 0x01, 0xe7, 0xa4, 0xc6, - 0xaf, 0x77, 0xf8, 0xe5, 0xbf, 0xf8, 0x67, 0x48, 0x59, 0x32, 0xbf, 0x85, 0x24, 0x3a, 0x13, 0x5c, - 0xde, 0x33, 0xfd, 0xb0, 0xe5, 0xc8, 0x57, 0x4c, 0xf6, 0x41, 0x07, 0x93, 0xd9, 0xff, 0x9f, 0x36, - 0x6c, 0xd2, 0xba, 0xd1, 0x3f, 0x1d, 0xd9, 0x47, 0xc3, 0xe3, 0x68, 0xc8, 0x25, 0x37, 0x9c, 0xe5, - 0xed, 0xbf, 0x8c, 0xef, 0x16, 0x6b, 0x17, 0x2d, 0xd7, 0x2e, 0xfa, 0xb3, 0x76, 0xd1, 0x8f, 0x8d, - 0x6b, 0x2d, 0x37, 0xae, 0xf5, 0x6b, 0xe3, 0x5a, 0xdf, 0x5e, 0xa7, 0xdc, 0x64, 0xb3, 0x38, 0x48, - 0x94, 0x08, 0xa1, 0x12, 0x4a, 0xef, 0xce, 0x6a, 0xf4, 0x26, 0xfc, 0x7e, 0xb0, 0x34, 0x66, 0x5e, - 0x80, 0x8e, 0xfb, 0xf5, 0x02, 0xdc, 0xfc, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xb6, 0xb6, 0x17, 0xf2, + 0x0f, 0xc3, 0x26, 0xf4, 0xb0, 0x5d, 0x76, 0xc9, 0x4a, 0xbb, 0x8d, 0x0d, 0x3a, 0x1f, 0x77, 0x11, + 0xb2, 0xfb, 0x62, 0x8b, 0x58, 0x92, 0xb1, 0x14, 0xb3, 0x7c, 0x8b, 0x7d, 0x93, 0x7d, 0x8d, 0x1c, + 0x73, 0x1c, 0x3b, 0x84, 0x91, 0x7c, 0x91, 0x11, 0x3b, 0xb1, 0x03, 0xbb, 0xec, 0x22, 0xa4, 0xf7, + 0xff, 0xff, 0xfe, 0xbc, 0x87, 0x1e, 0x7e, 0x05, 0x26, 0x83, 0x52, 0x70, 0x69, 0xc2, 0x09, 0x80, + 0x60, 0xe5, 0x14, 0x4c, 0x58, 0x8d, 0xba, 0x47, 0x50, 0x94, 0xca, 0x28, 0xf2, 0xac, 0xf5, 0x05, + 0x9d, 0x54, 0x8d, 0x9e, 0x9f, 0xa7, 0x2a, 0x55, 0xb5, 0x25, 0xdc, 0xde, 0x1a, 0xf7, 0xcb, 0x9f, + 0x3d, 0xdc, 0x7f, 0x60, 0x25, 0x13, 0x9a, 0xb8, 0xf8, 0x4c, 0x2a, 0x1a, 0x33, 0x0d, 0x74, 0x02, + 0xe0, 0x20, 0x0f, 0xf9, 0x76, 0x74, 0x2a, 0xd5, 0x98, 0x69, 0xb8, 0x03, 0x20, 0xef, 0xf0, 0xe5, + 0x5e, 0xa4, 0x49, 0xc6, 0x64, 0x0a, 0xf4, 0x11, 0xa4, 0x12, 0x5c, 0x32, 0xa3, 0x4a, 0xe7, 0x89, + 0x87, 0xfc, 0x41, 0xe4, 0xc4, 0x8d, 0xfb, 0x7d, 0x6d, 0xb8, 0xed, 0x74, 0x72, 0x83, 0x2f, 0x20, + 0x67, 0xda, 0xf0, 0x84, 0x9b, 0x39, 0x15, 0xb3, 0xdc, 0xf0, 0x22, 0xe7, 0x50, 0x3a, 0xbd, 0x1a, + 0x3c, 0xef, 0xc4, 0x2f, 0xad, 0x46, 0xae, 0xf1, 0x00, 0x24, 0x8b, 0x73, 0xa0, 0x19, 0xf0, 0x34, + 0x33, 0xce, 0xb1, 0x87, 0xfc, 0x5e, 0xf4, 0xb4, 0x29, 0x7e, 0xa8, 0x6b, 0xe4, 0x2d, 0xb6, 0xdb, + 0xae, 0xfb, 0x1e, 0xf2, 0x4f, 0xc7, 0x2f, 0x16, 0xab, 0x2b, 0xeb, 0xf7, 0xea, 0xea, 0x22, 0x51, + 0x5a, 0x28, 0xad, 0x1f, 0xa7, 0x01, 0x57, 0xa1, 0x60, 0x26, 0x0b, 0x3e, 0x4a, 0x13, 0x9d, 0xec, + 0x9a, 0x24, 0xf7, 0x78, 0x20, 0xb8, 0xa4, 0x29, 0xd3, 0xb4, 0x28, 0x79, 0x02, 0xce, 0x49, 0x8d, + 0x5f, 0xef, 0xf0, 0xcb, 0x7f, 0xf1, 0xcf, 0x90, 0xb2, 0x64, 0x7e, 0x0b, 0x49, 0x74, 0x26, 0xb8, + 0xbc, 0x67, 0xfa, 0x61, 0xcb, 0x91, 0xaf, 0x98, 0xec, 0x83, 0x0e, 0x26, 0xb3, 0xff, 0x3f, 0x6d, + 0xd8, 0xa4, 0x75, 0xa3, 0x7f, 0x3a, 0xb2, 0x8f, 0x86, 0xc7, 0xd1, 0x90, 0x4b, 0x6e, 0x38, 0xcb, + 0xdb, 0x7f, 0x19, 0xdf, 0x2d, 0xd6, 0x2e, 0x5a, 0xae, 0x5d, 0xf4, 0x67, 0xed, 0xa2, 0x1f, 0x1b, + 0xd7, 0x5a, 0x6e, 0x5c, 0xeb, 0xd7, 0xc6, 0xb5, 0xbe, 0xbd, 0x4e, 0xb9, 0xc9, 0x66, 0x71, 0x90, + 0x28, 0x11, 0x42, 0x25, 0x94, 0xde, 0x9d, 0xd5, 0xe8, 0x4d, 0xf8, 0xfd, 0x60, 0x69, 0xcc, 0xbc, + 0x00, 0x1d, 0xf7, 0xeb, 0x05, 0xb8, 0xf9, 0x1b, 0x00, 0x00, 0xff, 0xff, 0xf7, 0xad, 0x9b, 0x9c, 0x58, 0x02, 0x00, 0x00, } diff --git a/x/feemarket/types/genesis.pb.go b/x/feemarket/types/genesis.pb.go index 3fbee66987..952b540199 100644 --- a/x/feemarket/types/genesis.pb.go +++ b/x/feemarket/types/genesis.pb.go @@ -102,9 +102,9 @@ var fileDescriptor_6241c21661288629 = []byte{ 0x29, 0xb1, 0x38, 0x35, 0x3e, 0x2d, 0x35, 0xd5, 0xc9, 0xed, 0xc4, 0x23, 0x39, 0xc6, 0x0b, 0x8f, 0xe4, 0x18, 0x1f, 0x3c, 0x92, 0x63, 0x9c, 0xf0, 0x58, 0x8e, 0xe1, 0xc2, 0x63, 0x39, 0x86, 0x1b, 0x8f, 0xe5, 0x18, 0xa2, 0x74, 0xd2, 0x33, 0x4b, 0x32, 0x4a, 0x93, 0xf4, 0x92, 0xf3, 0x73, 0xf5, - 0x53, 0xcb, 0x72, 0xf3, 0x8b, 0xa1, 0x64, 0x99, 0xa1, 0x99, 0x7e, 0x05, 0x92, 0x2f, 0x4b, 0x2a, - 0x0b, 0x52, 0x8b, 0x93, 0xd8, 0xc0, 0x3e, 0x31, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0xf2, 0xfb, - 0x01, 0x5f, 0x47, 0x01, 0x00, 0x00, + 0x53, 0xcb, 0x72, 0xf3, 0x8b, 0xa1, 0x64, 0x99, 0xa1, 0xb9, 0x7e, 0x05, 0x92, 0x2f, 0x4b, 0x2a, + 0x0b, 0x52, 0x8b, 0x93, 0xd8, 0xc0, 0x3e, 0x31, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0xb3, 0xe0, + 0x8d, 0x31, 0x47, 0x01, 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { diff --git a/x/feemarket/types/query.pb.go b/x/feemarket/types/query.pb.go index 1f1927a1e7..8db2276a45 100644 --- a/x/feemarket/types/query.pb.go +++ b/x/feemarket/types/query.pb.go @@ -288,35 +288,35 @@ func init() { } var fileDescriptor_71a07c1ffd85fde2 = []byte{ - // 446 bytes of a gzipped FileDescriptorProto + // 447 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x53, 0x4d, 0x6f, 0xd3, 0x40, 0x10, 0xcd, 0x12, 0x48, 0xcb, 0x72, 0x41, 0x4b, 0x52, 0x81, 0x15, 0x36, 0xc8, 0x02, 0xc4, 0x47, - 0xd9, 0x55, 0x0a, 0xe2, 0xc4, 0xc9, 0x87, 0x22, 0x24, 0x0e, 0x60, 0x6e, 0x5c, 0xaa, 0x75, 0x98, - 0x3a, 0x56, 0x6a, 0xaf, 0xeb, 0xdd, 0x58, 0xf4, 0x8a, 0xc4, 0x85, 0x03, 0x42, 0xe2, 0x77, 0xf0, - 0x3f, 0x7a, 0xac, 0xc4, 0x05, 0x71, 0xa8, 0x50, 0xc2, 0x0f, 0x41, 0xde, 0x5d, 0x07, 0x0c, 0x09, - 0xcd, 0xc5, 0x1a, 0x8d, 0xdf, 0xbc, 0xf7, 0xe6, 0x8d, 0x16, 0xfb, 0xa0, 0xc7, 0x50, 0xa4, 0x49, - 0xa6, 0xf9, 0x3e, 0x40, 0x2a, 0x8a, 0x09, 0x68, 0x5e, 0x0e, 0xf9, 0xe1, 0x14, 0x8a, 0x23, 0x96, - 0x17, 0x52, 0x4b, 0xb2, 0xb5, 0xc0, 0xb0, 0x05, 0x86, 0x95, 0x43, 0xef, 0xf6, 0x8a, 0xd9, 0xdf, - 0x20, 0x33, 0xef, 0x75, 0x63, 0x19, 0x4b, 0x53, 0xf2, 0xaa, 0x72, 0xdd, 0x7e, 0x2c, 0x65, 0x7c, - 0x00, 0x5c, 0xe4, 0x09, 0x17, 0x59, 0x26, 0xb5, 0xd0, 0x89, 0xcc, 0x94, 0xfd, 0xeb, 0x77, 0x31, - 0x79, 0x59, 0x59, 0x78, 0x21, 0x0a, 0x91, 0xaa, 0x10, 0x0e, 0xa7, 0xa0, 0xb4, 0xff, 0x0a, 0x5f, - 0x69, 0x74, 0x55, 0x2e, 0x33, 0x05, 0xe4, 0x09, 0xee, 0xe4, 0xa6, 0x73, 0x15, 0xdd, 0x40, 0x77, - 0x2e, 0xed, 0x50, 0xb6, 0xdc, 0x31, 0xb3, 0x73, 0xc1, 0xf9, 0xe3, 0xd3, 0x41, 0x2b, 0x74, 0x33, - 0x7e, 0xcf, 0x91, 0x06, 0x42, 0xc1, 0x2e, 0x40, 0xad, 0xf5, 0x1c, 0x77, 0x9b, 0x6d, 0x27, 0xf6, - 0x08, 0x6f, 0x46, 0x42, 0xc1, 0xde, 0x3e, 0x80, 0x91, 0xbb, 0x18, 0x5c, 0xfb, 0x7e, 0x3a, 0xe8, - 0x8d, 0xa4, 0x4a, 0xa5, 0x52, 0x6f, 0x26, 0x2c, 0x91, 0x3c, 0x15, 0x7a, 0xcc, 0x9e, 0x65, 0x3a, - 0xdc, 0x88, 0xec, 0xb4, 0xbf, 0x55, 0xb3, 0x1d, 0xc8, 0xd1, 0xe4, 0xa9, 0x58, 0x6c, 0x74, 0x17, - 0xf7, 0xfe, 0xea, 0x3b, 0x99, 0xcb, 0xb8, 0x1d, 0x0b, 0xbb, 0x50, 0x3b, 0xac, 0xca, 0x9d, 0x2f, - 0x6d, 0x7c, 0xc1, 0x60, 0xc9, 0x7b, 0x84, 0x3b, 0x76, 0x15, 0x72, 0x6f, 0xd5, 0xaa, 0xff, 0xa6, - 0xe7, 0xdd, 0x5f, 0x0b, 0x6b, 0xf5, 0x7d, 0xff, 0xdd, 0xd7, 0x9f, 0x9f, 0xcf, 0xf5, 0x89, 0xc7, - 0xa1, 0x4c, 0xa5, 0x6a, 0x5e, 0xd8, 0x26, 0x47, 0x3e, 0x20, 0xbc, 0xe1, 0xe2, 0x21, 0xff, 0x27, - 0x6f, 0x66, 0xeb, 0x6d, 0xaf, 0x07, 0x76, 0x56, 0x6e, 0x1a, 0x2b, 0x94, 0xf4, 0x97, 0x59, 0xa9, - 0x6f, 0x41, 0x3e, 0x22, 0xbc, 0x59, 0xa7, 0x48, 0xce, 0x10, 0x68, 0x1e, 0xc1, 0x7b, 0xb0, 0x26, - 0xda, 0xf9, 0xb9, 0x65, 0xfc, 0x0c, 0xc8, 0xf5, 0xa5, 0x7e, 0x2a, 0xf4, 0x5e, 0x2c, 0x54, 0xb0, - 0x7b, 0x3c, 0xa3, 0xe8, 0x64, 0x46, 0xd1, 0x8f, 0x19, 0x45, 0x9f, 0xe6, 0xb4, 0x75, 0x32, 0xa7, - 0xad, 0x6f, 0x73, 0xda, 0x7a, 0xbd, 0x1d, 0x27, 0x7a, 0x3c, 0x8d, 0xd8, 0x48, 0xa6, 0x8e, 0xc2, - 0x7e, 0xcb, 0xe1, 0x63, 0xfe, 0xf6, 0x0f, 0x3a, 0x7d, 0x94, 0x83, 0x8a, 0x3a, 0xe6, 0x45, 0x3c, - 0xfc, 0x15, 0x00, 0x00, 0xff, 0xff, 0xc1, 0xd3, 0xfa, 0x92, 0xab, 0x03, 0x00, 0x00, + 0xd9, 0x55, 0x0a, 0x12, 0x17, 0x4e, 0x3e, 0x14, 0x21, 0x71, 0x00, 0x73, 0xe3, 0x52, 0xad, 0xc3, + 0xd4, 0xb1, 0x52, 0x7b, 0x5d, 0xef, 0xc6, 0xa2, 0x57, 0x24, 0x2e, 0x1c, 0x10, 0x12, 0xbf, 0x83, + 0xff, 0xd1, 0x63, 0x25, 0x2e, 0x88, 0x43, 0x85, 0x12, 0x7e, 0x08, 0xf2, 0xee, 0x3a, 0x60, 0x48, + 0x68, 0x2e, 0xd6, 0x68, 0xfc, 0xe6, 0xbd, 0x37, 0x6f, 0xb4, 0xd8, 0x07, 0x3d, 0x86, 0x22, 0x4d, + 0x32, 0xcd, 0xf7, 0x01, 0x52, 0x51, 0x4c, 0x40, 0xf3, 0x72, 0xc8, 0x0f, 0xa7, 0x50, 0x1c, 0xb1, + 0xbc, 0x90, 0x5a, 0x92, 0xad, 0x05, 0x86, 0x2d, 0x30, 0xac, 0x1c, 0x7a, 0xb7, 0x57, 0xcc, 0xfe, + 0x06, 0x99, 0x79, 0xaf, 0x1b, 0xcb, 0x58, 0x9a, 0x92, 0x57, 0x95, 0xeb, 0xf6, 0x63, 0x29, 0xe3, + 0x03, 0xe0, 0x22, 0x4f, 0xb8, 0xc8, 0x32, 0xa9, 0x85, 0x4e, 0x64, 0xa6, 0xec, 0x5f, 0xbf, 0x8b, + 0xc9, 0xcb, 0xca, 0xc2, 0x0b, 0x51, 0x88, 0x54, 0x85, 0x70, 0x38, 0x05, 0xa5, 0xfd, 0x57, 0xf8, + 0x4a, 0xa3, 0xab, 0x72, 0x99, 0x29, 0x20, 0x4f, 0x70, 0x27, 0x37, 0x9d, 0xab, 0xe8, 0x06, 0xba, + 0x73, 0x69, 0x87, 0xb2, 0xe5, 0x8e, 0x99, 0x9d, 0x0b, 0xce, 0x1f, 0x9f, 0x0e, 0x5a, 0xa1, 0x9b, + 0xf1, 0x7b, 0x8e, 0x34, 0x10, 0x0a, 0x76, 0x01, 0x6a, 0xad, 0xe7, 0xb8, 0xdb, 0x6c, 0x3b, 0xb1, + 0x47, 0x78, 0x33, 0x12, 0x0a, 0xf6, 0xf6, 0x01, 0x8c, 0xdc, 0xc5, 0xe0, 0xda, 0xf7, 0xd3, 0x41, + 0x6f, 0x24, 0x55, 0x2a, 0x95, 0x7a, 0x33, 0x61, 0x89, 0xe4, 0xa9, 0xd0, 0x63, 0xf6, 0x2c, 0xd3, + 0xe1, 0x46, 0x64, 0xa7, 0xfd, 0xad, 0x9a, 0xed, 0x40, 0x8e, 0x26, 0x4f, 0xc5, 0x62, 0xa3, 0xbb, + 0xb8, 0xf7, 0x57, 0xdf, 0xc9, 0x5c, 0xc6, 0xed, 0x58, 0xd8, 0x85, 0xda, 0x61, 0x55, 0xee, 0x7c, + 0x69, 0xe3, 0x0b, 0x06, 0x4b, 0xde, 0x23, 0xdc, 0xb1, 0xab, 0x90, 0x7b, 0xab, 0x56, 0xfd, 0x37, + 0x3d, 0xef, 0xfe, 0x5a, 0x58, 0xab, 0xef, 0xfb, 0xef, 0xbe, 0xfe, 0xfc, 0x7c, 0xae, 0x4f, 0x3c, + 0x0e, 0x65, 0x2a, 0x55, 0xf3, 0xc2, 0x36, 0x39, 0xf2, 0x01, 0xe1, 0x0d, 0x17, 0x0f, 0xf9, 0x3f, + 0x79, 0x33, 0x5b, 0x6f, 0x7b, 0x3d, 0xb0, 0xb3, 0x72, 0xd3, 0x58, 0xa1, 0xa4, 0xbf, 0xcc, 0x4a, + 0x7d, 0x0b, 0xf2, 0x11, 0xe1, 0xcd, 0x3a, 0x45, 0x72, 0x86, 0x40, 0xf3, 0x08, 0xde, 0x83, 0x35, + 0xd1, 0xce, 0xcf, 0x2d, 0xe3, 0x67, 0x40, 0xae, 0x2f, 0xf5, 0x53, 0xa1, 0xf7, 0x62, 0xa1, 0x82, + 0xdd, 0xe3, 0x19, 0x45, 0x27, 0x33, 0x8a, 0x7e, 0xcc, 0x28, 0xfa, 0x34, 0xa7, 0xad, 0x93, 0x39, + 0x6d, 0x7d, 0x9b, 0xd3, 0xd6, 0xeb, 0xed, 0x38, 0xd1, 0xe3, 0x69, 0xc4, 0x46, 0x32, 0x75, 0x14, + 0xf6, 0x5b, 0x0e, 0x1f, 0xf3, 0xb7, 0x7f, 0xd0, 0xe9, 0xa3, 0x1c, 0x54, 0xd4, 0x31, 0x2f, 0xe2, + 0xe1, 0xaf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x80, 0xc8, 0x76, 0xfc, 0xab, 0x03, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/feemarket/types/tx.pb.go b/x/feemarket/types/tx.pb.go index 5cf1839029..567c4b33a8 100644 --- a/x/feemarket/types/tx.pb.go +++ b/x/feemarket/types/tx.pb.go @@ -151,8 +151,8 @@ var fileDescriptor_78aff2584dbf2838 = []byte{ 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, 0x83, 0x90, 0x65, 0x86, 0x66, 0xfa, 0x15, 0x48, 0x11, 0x52, 0x52, 0x59, 0x90, 0x5a, 0x9c, - 0xc4, 0x06, 0x0e, 0x74, 0x63, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf4, 0x17, 0x3a, 0xf3, 0x21, + 0xb8, 0x83, 0x90, 0x65, 0x86, 0xe6, 0xfa, 0x15, 0x48, 0x11, 0x52, 0x52, 0x59, 0x90, 0x5a, 0x9c, + 0xc4, 0x06, 0x0e, 0x74, 0x63, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb5, 0x0c, 0xb6, 0x9d, 0x21, 0x02, 0x00, 0x00, } diff --git a/x/ibc/transfer/ibc_module.go b/x/ibc/transfer/ibc_module.go index 3174aa0a2f..6de1fd9874 100644 --- a/x/ibc/transfer/ibc_module.go +++ b/x/ibc/transfer/ibc_module.go @@ -6,7 +6,7 @@ package transfer import ( ibctransfer "github.com/cosmos/ibc-go/v7/modules/apps/transfer" porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" - "github.com/evmos/evmos/v16/x/ibc/transfer/keeper" + "github.com/evmos/evmos/v17/x/ibc/transfer/keeper" ) var _ porttypes.IBCModule = IBCModule{} diff --git a/x/ibc/transfer/keeper/keeper.go b/x/ibc/transfer/keeper/keeper.go index b7905aeeec..42df8c9637 100644 --- a/x/ibc/transfer/keeper/keeper.go +++ b/x/ibc/transfer/keeper/keeper.go @@ -13,7 +13,7 @@ import ( transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" - "github.com/evmos/evmos/v16/x/ibc/transfer/types" + "github.com/evmos/evmos/v17/x/ibc/transfer/types" ) // Keeper defines the modified IBC transfer keeper that embeds the original one. diff --git a/x/ibc/transfer/keeper/keeper_test.go b/x/ibc/transfer/keeper/keeper_test.go index 2f51392c89..de0fc55d14 100644 --- a/x/ibc/transfer/keeper/keeper_test.go +++ b/x/ibc/transfer/keeper/keeper_test.go @@ -28,18 +28,18 @@ import ( stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" - "github.com/evmos/evmos/v16/server/config" - "github.com/evmos/evmos/v16/testutil" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/utils" - "github.com/evmos/evmos/v16/x/evm/statedb" - evm "github.com/evmos/evmos/v16/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v16/x/feemarket/types" - - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/contracts" - "github.com/evmos/evmos/v16/x/erc20/types" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + "github.com/evmos/evmos/v17/server/config" + "github.com/evmos/evmos/v17/testutil" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v17/x/evm/statedb" + evm "github.com/evmos/evmos/v17/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" + + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/contracts" + "github.com/evmos/evmos/v17/x/erc20/types" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" diff --git a/x/ibc/transfer/keeper/msg_server.go b/x/ibc/transfer/keeper/msg_server.go index a42b79ffe6..f17c1cfef9 100644 --- a/x/ibc/transfer/keeper/msg_server.go +++ b/x/ibc/transfer/keeper/msg_server.go @@ -15,7 +15,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - erc20types "github.com/evmos/evmos/v16/x/erc20/types" + erc20types "github.com/evmos/evmos/v17/x/erc20/types" ) var _ types.MsgServer = Keeper{} diff --git a/x/ibc/transfer/keeper/msg_server_test.go b/x/ibc/transfer/keeper/msg_server_test.go index 9e629bef7d..b1cfc8a6c9 100644 --- a/x/ibc/transfer/keeper/msg_server_test.go +++ b/x/ibc/transfer/keeper/msg_server_test.go @@ -10,8 +10,8 @@ import ( "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" host "github.com/cosmos/ibc-go/v7/modules/core/24-host" - erc20types "github.com/evmos/evmos/v16/x/erc20/types" - "github.com/evmos/evmos/v16/x/ibc/transfer/keeper" + erc20types "github.com/evmos/evmos/v17/x/erc20/types" + "github.com/evmos/evmos/v17/x/ibc/transfer/keeper" "github.com/stretchr/testify/mock" ) diff --git a/x/ibc/transfer/module.go b/x/ibc/transfer/module.go index bc1b8ca7b7..f8ad271846 100644 --- a/x/ibc/transfer/module.go +++ b/x/ibc/transfer/module.go @@ -11,7 +11,7 @@ import ( ibctransfer "github.com/cosmos/ibc-go/v7/modules/apps/transfer" ibctransferkeeper "github.com/cosmos/ibc-go/v7/modules/apps/transfer/keeper" "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - "github.com/evmos/evmos/v16/x/ibc/transfer/keeper" + "github.com/evmos/evmos/v17/x/ibc/transfer/keeper" ) var ( diff --git a/x/ibc/transfer/types/interfaces.go b/x/ibc/transfer/types/interfaces.go index 50737041fc..1e17daa6a9 100644 --- a/x/ibc/transfer/types/interfaces.go +++ b/x/ibc/transfer/types/interfaces.go @@ -13,7 +13,7 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - erc20types "github.com/evmos/evmos/v16/x/erc20/types" + erc20types "github.com/evmos/evmos/v17/x/erc20/types" ) // AccountKeeper defines the expected interface needed to retrieve account info. diff --git a/x/incentives/module.go b/x/incentives/module.go index f8de2791e5..cf1c958e05 100644 --- a/x/incentives/module.go +++ b/x/incentives/module.go @@ -24,7 +24,7 @@ import ( "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" - "github.com/evmos/evmos/v16/x/incentives/types" + "github.com/evmos/evmos/v17/x/incentives/types" ) // consensusVersion defines the current x/incentives module consensus version. diff --git a/x/incentives/types/genesis.pb.go b/x/incentives/types/genesis.pb.go index df4efbd006..50cb526b35 100644 --- a/x/incentives/types/genesis.pb.go +++ b/x/incentives/types/genesis.pb.go @@ -158,29 +158,29 @@ var fileDescriptor_7bb1f7c7e8ad160b = []byte{ // 404 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x92, 0xc1, 0xea, 0xd3, 0x40, 0x10, 0x87, 0x93, 0xf6, 0x4f, 0xb1, 0xdb, 0x8a, 0x35, 0x7a, 0x88, 0x2d, 0xa6, 0xb5, 0x88, 0x14, - 0xa4, 0x1b, 0x5a, 0x41, 0xf0, 0xe2, 0x21, 0x54, 0x4a, 0x41, 0x41, 0xd2, 0x93, 0x5e, 0xc2, 0x36, - 0x1d, 0xd3, 0xc5, 0x24, 0x1b, 0xb2, 0x6b, 0xd4, 0xb7, 0xf0, 0x25, 0x7c, 0x97, 0x1e, 0x0b, 0x5e, - 0xc4, 0x43, 0x91, 0xf6, 0x45, 0x64, 0x77, 0xa3, 0xc9, 0x21, 0x27, 0x2f, 0xc9, 0x4e, 0xf2, 0xcd, - 0xf7, 0x9b, 0x84, 0x41, 0x8f, 0xa0, 0x48, 0x18, 0x77, 0x69, 0x1a, 0x42, 0x2a, 0x68, 0x01, 0xdc, - 0x2d, 0x16, 0x6e, 0x04, 0x29, 0x70, 0xca, 0x71, 0x96, 0x33, 0xc1, 0xac, 0x7b, 0x0a, 0xc1, 0x15, - 0x82, 0x8b, 0xc5, 0xf0, 0x71, 0x53, 0x5f, 0x0d, 0x51, 0xad, 0xc3, 0xfb, 0x11, 0x8b, 0x98, 0x3a, - 0xba, 0xf2, 0xa4, 0x9f, 0x4e, 0x7f, 0x98, 0xa8, 0xbf, 0xd6, 0x11, 0x5b, 0x41, 0x04, 0x58, 0x2f, - 0x50, 0x27, 0x23, 0x39, 0x49, 0xb8, 0x6d, 0x4e, 0xcc, 0x59, 0x6f, 0x39, 0xc2, 0x0d, 0x91, 0xf8, - 0xad, 0x42, 0xbc, 0x9b, 0xe3, 0x79, 0x6c, 0xf8, 0x65, 0x83, 0xb5, 0x42, 0xa8, 0xa2, 0xec, 0xd6, - 0xa4, 0x3d, 0xeb, 0x2d, 0x9d, 0xc6, 0xf6, 0xcd, 0xdf, 0xaa, 0x34, 0xd4, 0xfa, 0x2c, 0x0f, 0xa1, - 0x88, 0xf0, 0x20, 0x01, 0x01, 0x39, 0xb7, 0xdb, 0xca, 0xf2, 0xb0, 0xd1, 0xb2, 0x26, 0xfc, 0x8d, - 0xa4, 0x4a, 0x49, 0x37, 0x2a, 0x6b, 0x3e, 0xfd, 0xde, 0x42, 0x1d, 0x3d, 0xa2, 0xf5, 0x14, 0xdd, - 0x85, 0x94, 0xec, 0x62, 0x08, 0x6a, 0xb3, 0xc9, 0x4f, 0xbb, 0xe5, 0x0f, 0xf4, 0x8b, 0x4d, 0x95, - 0xfd, 0x0e, 0x0d, 0x48, 0x1c, 0xb3, 0x90, 0x08, 0xca, 0xd2, 0x20, 0xa6, 0x09, 0x15, 0x76, 0x6b, - 0x62, 0xce, 0xba, 0x1e, 0x96, 0x11, 0xbf, 0xce, 0xe3, 0x27, 0x11, 0x15, 0x87, 0x4f, 0x3b, 0x1c, - 0xb2, 0xc4, 0x0d, 0x19, 0x97, 0xff, 0x5d, 0xdf, 0xe6, 0x7c, 0xff, 0xd1, 0x15, 0x5f, 0x33, 0xe0, - 0x78, 0x05, 0xa1, 0x7f, 0xa7, 0xf2, 0xbc, 0x96, 0x1a, 0xeb, 0x25, 0x1a, 0x55, 0x03, 0x04, 0x90, - 0xb1, 0xf0, 0x10, 0xd0, 0xbd, 0xac, 0x3f, 0x50, 0xc8, 0xed, 0xb6, 0x4c, 0xf1, 0x1f, 0x54, 0xc8, - 0x2b, 0x49, 0x6c, 0xfe, 0x01, 0xd6, 0x16, 0xdd, 0xce, 0xe1, 0x33, 0xc9, 0xf7, 0x01, 0x0f, 0x49, - 0x0c, 0xb9, 0x7d, 0xf3, 0x5f, 0x73, 0xf5, 0xb5, 0x64, 0xab, 0x1c, 0xde, 0xfa, 0x78, 0x71, 0xcc, - 0xd3, 0xc5, 0x31, 0x7f, 0x5f, 0x1c, 0xf3, 0xdb, 0xd5, 0x31, 0x4e, 0x57, 0xc7, 0xf8, 0x79, 0x75, - 0x8c, 0xf7, 0xf3, 0x9a, 0x4f, 0xaf, 0x97, 0xbe, 0x16, 0x8b, 0xe7, 0xee, 0x97, 0xfa, 0xaa, 0x29, - 0xf5, 0xae, 0xa3, 0xb6, 0xe9, 0xd9, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x20, 0xc0, 0x72, 0x15, + 0xa4, 0x1b, 0x5a, 0x0f, 0xe2, 0xc5, 0x43, 0xa8, 0x94, 0x82, 0x82, 0xa4, 0x27, 0xbd, 0x84, 0x6d, + 0x3a, 0xa6, 0x8b, 0x49, 0x36, 0x64, 0xd7, 0xa8, 0x6f, 0xe1, 0x4b, 0xf8, 0x2e, 0x3d, 0x16, 0xbc, + 0x88, 0x87, 0x22, 0xed, 0x8b, 0xc8, 0xee, 0x46, 0x93, 0x43, 0x4e, 0x5e, 0x92, 0x9d, 0xe4, 0x9b, + 0xef, 0x37, 0x09, 0x83, 0x1e, 0x41, 0x91, 0x30, 0xee, 0xd2, 0x34, 0x84, 0x54, 0xd0, 0x02, 0xb8, + 0x5b, 0x2c, 0xdc, 0x08, 0x52, 0xe0, 0x94, 0xe3, 0x2c, 0x67, 0x82, 0x59, 0xf7, 0x14, 0x82, 0x2b, + 0x04, 0x17, 0x8b, 0xe1, 0xe3, 0xa6, 0xbe, 0x1a, 0xa2, 0x5a, 0x87, 0xf7, 0x23, 0x16, 0x31, 0x75, + 0x74, 0xe5, 0x49, 0x3f, 0x9d, 0xfe, 0x30, 0x51, 0x7f, 0xad, 0x23, 0xb6, 0x82, 0x08, 0xb0, 0x5e, + 0xa0, 0x4e, 0x46, 0x72, 0x92, 0x70, 0xdb, 0x9c, 0x98, 0xb3, 0xde, 0x72, 0x84, 0x1b, 0x22, 0xf1, + 0x5b, 0x85, 0x78, 0x37, 0xc7, 0xf3, 0xd8, 0xf0, 0xcb, 0x06, 0x6b, 0x85, 0x50, 0x45, 0xd9, 0xad, + 0x49, 0x7b, 0xd6, 0x5b, 0x3a, 0x8d, 0xed, 0x9b, 0xbf, 0x55, 0x69, 0xa8, 0xf5, 0x59, 0x1e, 0x42, + 0x11, 0xe1, 0x41, 0x02, 0x02, 0x72, 0x6e, 0xb7, 0x95, 0xe5, 0x61, 0xa3, 0x65, 0x4d, 0xf8, 0x1b, + 0x49, 0x95, 0x92, 0x6e, 0x54, 0xd6, 0x7c, 0xfa, 0xbd, 0x85, 0x3a, 0x7a, 0x44, 0xeb, 0x29, 0xba, + 0x0b, 0x29, 0xd9, 0xc5, 0x10, 0xd4, 0x66, 0x93, 0x9f, 0x76, 0xcb, 0x1f, 0xe8, 0x17, 0x9b, 0x2a, + 0xfb, 0x1d, 0x1a, 0x90, 0x38, 0x66, 0x21, 0x11, 0x94, 0xa5, 0x41, 0x4c, 0x13, 0x2a, 0xec, 0xd6, + 0xc4, 0x9c, 0x75, 0x3d, 0x2c, 0x23, 0x7e, 0x9d, 0xc7, 0x4f, 0x22, 0x2a, 0x0e, 0x9f, 0x76, 0x38, + 0x64, 0x89, 0x1b, 0x32, 0x2e, 0xff, 0xbb, 0xbe, 0xcd, 0xf9, 0xfe, 0xa3, 0x2b, 0xbe, 0x66, 0xc0, + 0xf1, 0x0a, 0x42, 0xff, 0x4e, 0xe5, 0x79, 0x2d, 0x35, 0xd6, 0x4b, 0x34, 0xaa, 0x06, 0x08, 0x20, + 0x63, 0xe1, 0x21, 0xa0, 0x7b, 0x59, 0x7f, 0xa0, 0x90, 0xdb, 0x6d, 0x99, 0xe2, 0x3f, 0xa8, 0x90, + 0x57, 0x92, 0xd8, 0xfc, 0x03, 0xac, 0x2d, 0xba, 0x9d, 0xc3, 0x67, 0x92, 0xef, 0x03, 0x1e, 0x92, + 0x18, 0x72, 0xfb, 0xe6, 0xbf, 0xe6, 0xea, 0x6b, 0xc9, 0x56, 0x39, 0xbc, 0xf5, 0xf1, 0xe2, 0x98, + 0xa7, 0x8b, 0x63, 0xfe, 0xbe, 0x38, 0xe6, 0xb7, 0xab, 0x63, 0x9c, 0xae, 0x8e, 0xf1, 0xf3, 0xea, + 0x18, 0xef, 0xe7, 0x35, 0x9f, 0x5e, 0x2f, 0x7d, 0x2d, 0x16, 0xcf, 0xdd, 0x2f, 0xf5, 0x55, 0x53, + 0xea, 0x5d, 0x47, 0x6d, 0xd3, 0xb3, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x3d, 0x3d, 0xc7, 0x14, 0xc3, 0x02, 0x00, 0x00, } diff --git a/x/incentives/types/incentives.pb.go b/x/incentives/types/incentives.pb.go index 79c3522ca7..dc31434038 100644 --- a/x/incentives/types/incentives.pb.go +++ b/x/incentives/types/incentives.pb.go @@ -337,7 +337,7 @@ var fileDescriptor_95b81e40854aec77 = []byte{ // 489 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x53, 0xbf, 0x6f, 0xd4, 0x30, 0x18, 0x4d, 0xee, 0x47, 0x75, 0xe7, 0x53, 0x19, 0x42, 0x05, 0xe1, 0x40, 0x49, 0x74, 0x02, 0x29, - 0x12, 0xaa, 0xad, 0xb4, 0x12, 0x03, 0xe3, 0x1d, 0xd2, 0x89, 0x01, 0x09, 0x45, 0x4c, 0x2c, 0x95, + 0x12, 0xaa, 0xad, 0xb4, 0x03, 0x12, 0xe3, 0x1d, 0xd2, 0x89, 0x01, 0x09, 0x45, 0x4c, 0x2c, 0x95, 0xe3, 0x9a, 0xd4, 0x22, 0x89, 0xa3, 0xf8, 0xbb, 0x08, 0x56, 0xfe, 0x82, 0x4e, 0xcc, 0xcc, 0xfc, 0x25, 0x1d, 0x3b, 0x32, 0x51, 0x74, 0xb7, 0xf0, 0x67, 0x20, 0x3b, 0x49, 0x49, 0x97, 0x8e, 0xb7, 0x24, 0x7e, 0xcf, 0xfe, 0xf4, 0xde, 0xfb, 0x3e, 0x1b, 0x3d, 0xe7, 0x75, 0x2e, 0x15, 0x11, 0x05, @@ -365,7 +365,7 @@ var fileDescriptor_95b81e40854aec77 = []byte{ 0x7d, 0xb5, 0xf5, 0xec, 0xeb, 0xad, 0x67, 0xff, 0xd9, 0x7a, 0xf6, 0xe5, 0xce, 0xb3, 0xae, 0x77, 0x9e, 0xf5, 0x6b, 0xe7, 0x59, 0x1f, 0x8f, 0x7b, 0x31, 0x9b, 0xa7, 0xdb, 0x7c, 0xeb, 0xe8, 0x15, 0xf9, 0xd2, 0x7f, 0xc6, 0x26, 0x71, 0x72, 0x60, 0x6e, 0xde, 0xe9, 0xbf, 0x00, 0x00, 0x00, 0xff, - 0xff, 0x51, 0xe7, 0x94, 0xfc, 0xe7, 0x03, 0x00, 0x00, + 0xff, 0x4c, 0x1a, 0x21, 0xfd, 0xe7, 0x03, 0x00, 0x00, } func (m *Incentive) Marshal() (dAtA []byte, err error) { diff --git a/x/incentives/types/proposal.go b/x/incentives/types/proposal.go index 85d764c528..122aa25bad 100644 --- a/x/incentives/types/proposal.go +++ b/x/incentives/types/proposal.go @@ -8,7 +8,7 @@ import ( govcdc "github.com/cosmos/cosmos-sdk/x/gov/codec" govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - evmostypes "github.com/evmos/evmos/v16/types" + evmostypes "github.com/evmos/evmos/v17/types" ) // constants diff --git a/x/inflation/v1/client/cli/query.go b/x/inflation/v1/client/cli/query.go index e4f392724c..7e26511e8c 100644 --- a/x/inflation/v1/client/cli/query.go +++ b/x/inflation/v1/client/cli/query.go @@ -11,7 +11,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/evmos/evmos/v16/x/inflation/v1/types" + "github.com/evmos/evmos/v17/x/inflation/v1/types" ) // GetQueryCmd returns the cli query commands for the inflation module. diff --git a/x/inflation/v1/genesis.go b/x/inflation/v1/genesis.go index 026c42dcb2..e19e10d5a2 100644 --- a/x/inflation/v1/genesis.go +++ b/x/inflation/v1/genesis.go @@ -6,8 +6,8 @@ package inflation import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/x/inflation/v1/keeper" - "github.com/evmos/evmos/v16/x/inflation/v1/types" + "github.com/evmos/evmos/v17/x/inflation/v1/keeper" + "github.com/evmos/evmos/v17/x/inflation/v1/types" ) // InitGenesis import module genesis diff --git a/x/inflation/v1/keeper/epoch_info.go b/x/inflation/v1/keeper/epoch_info.go index de27d64bf2..afb75f4b4f 100644 --- a/x/inflation/v1/keeper/epoch_info.go +++ b/x/inflation/v1/keeper/epoch_info.go @@ -5,7 +5,7 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/x/inflation/v1/types" + "github.com/evmos/evmos/v17/x/inflation/v1/types" ) // GetEpochIdentifier gets the epoch identifier diff --git a/x/inflation/v1/keeper/epoch_info_test.go b/x/inflation/v1/keeper/epoch_info_test.go index efa01b1c28..840da3d7cd 100644 --- a/x/inflation/v1/keeper/epoch_info_test.go +++ b/x/inflation/v1/keeper/epoch_info_test.go @@ -3,8 +3,8 @@ package keeper_test import ( "fmt" - epochstypes "github.com/evmos/evmos/v16/x/epochs/types" - "github.com/evmos/evmos/v16/x/inflation/v1/types" + epochstypes "github.com/evmos/evmos/v17/x/epochs/types" + "github.com/evmos/evmos/v17/x/inflation/v1/types" ) func (suite *KeeperTestSuite) TestSetGetEpochIdentifier() { diff --git a/x/inflation/v1/keeper/grpc_query.go b/x/inflation/v1/keeper/grpc_query.go index 4f98388b56..59c29d2163 100644 --- a/x/inflation/v1/keeper/grpc_query.go +++ b/x/inflation/v1/keeper/grpc_query.go @@ -7,7 +7,7 @@ import ( "context" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/x/inflation/v1/types" + "github.com/evmos/evmos/v17/x/inflation/v1/types" ) var _ types.QueryServer = Keeper{} diff --git a/x/inflation/v1/keeper/grpc_query_test.go b/x/inflation/v1/keeper/grpc_query_test.go index 281d4d19c1..76c6817664 100644 --- a/x/inflation/v1/keeper/grpc_query_test.go +++ b/x/inflation/v1/keeper/grpc_query_test.go @@ -6,8 +6,8 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" - evmostypes "github.com/evmos/evmos/v16/types" - "github.com/evmos/evmos/v16/x/inflation/v1/types" + evmostypes "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v17/x/inflation/v1/types" ) func (suite *KeeperTestSuite) TestPeriod() { //nolint:dupl diff --git a/x/inflation/v1/keeper/hooks.go b/x/inflation/v1/keeper/hooks.go index 101d24298e..136e44f2d5 100644 --- a/x/inflation/v1/keeper/hooks.go +++ b/x/inflation/v1/keeper/hooks.go @@ -10,8 +10,8 @@ import ( "github.com/cosmos/cosmos-sdk/telemetry" sdk "github.com/cosmos/cosmos-sdk/types" - epochstypes "github.com/evmos/evmos/v16/x/epochs/types" - "github.com/evmos/evmos/v16/x/inflation/v1/types" + epochstypes "github.com/evmos/evmos/v17/x/epochs/types" + "github.com/evmos/evmos/v17/x/inflation/v1/types" ) // BeforeEpochStart: noop, We don't need to do anything here diff --git a/x/inflation/v1/keeper/hooks_test.go b/x/inflation/v1/keeper/hooks_test.go index a21a5de8b9..00a49e9326 100644 --- a/x/inflation/v1/keeper/hooks_test.go +++ b/x/inflation/v1/keeper/hooks_test.go @@ -4,8 +4,8 @@ import ( "fmt" "time" - epochstypes "github.com/evmos/evmos/v16/x/epochs/types" - "github.com/evmos/evmos/v16/x/inflation/v1/types" + epochstypes "github.com/evmos/evmos/v17/x/epochs/types" + "github.com/evmos/evmos/v17/x/inflation/v1/types" ) func (suite *KeeperTestSuite) TestEpochIdentifierAfterEpochEnd() { diff --git a/x/inflation/v1/keeper/inflation.go b/x/inflation/v1/keeper/inflation.go index e180c387fd..cbbff291c6 100644 --- a/x/inflation/v1/keeper/inflation.go +++ b/x/inflation/v1/keeper/inflation.go @@ -7,10 +7,10 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" - evmostypes "github.com/evmos/evmos/v16/types" + evmostypes "github.com/evmos/evmos/v17/types" - utils "github.com/evmos/evmos/v16/utils" - "github.com/evmos/evmos/v16/x/inflation/v1/types" + utils "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v17/x/inflation/v1/types" ) // 200M token at year 4 allocated to the team diff --git a/x/inflation/v1/keeper/inflation_test.go b/x/inflation/v1/keeper/inflation_test.go index 8823c67acc..a7eedabf1d 100644 --- a/x/inflation/v1/keeper/inflation_test.go +++ b/x/inflation/v1/keeper/inflation_test.go @@ -6,8 +6,8 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - evmostypes "github.com/evmos/evmos/v16/types" - "github.com/evmos/evmos/v16/x/inflation/v1/types" + evmostypes "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v17/x/inflation/v1/types" ) func (suite *KeeperTestSuite) TestMintAndAllocateInflation() { diff --git a/x/inflation/v1/keeper/integration_test.go b/x/inflation/v1/keeper/integration_test.go index 4b665f4632..d9f72ea7ed 100644 --- a/x/inflation/v1/keeper/integration_test.go +++ b/x/inflation/v1/keeper/integration_test.go @@ -10,8 +10,8 @@ import ( //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/gomega" - epochstypes "github.com/evmos/evmos/v16/x/epochs/types" - "github.com/evmos/evmos/v16/x/inflation/v1/types" + epochstypes "github.com/evmos/evmos/v17/x/epochs/types" + "github.com/evmos/evmos/v17/x/inflation/v1/types" ) var ( diff --git a/x/inflation/v1/keeper/keeper.go b/x/inflation/v1/keeper/keeper.go index 6970795e25..ad43beea7b 100644 --- a/x/inflation/v1/keeper/keeper.go +++ b/x/inflation/v1/keeper/keeper.go @@ -9,7 +9,7 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/x/inflation/v1/types" + "github.com/evmos/evmos/v17/x/inflation/v1/types" ) // Keeper of the inflation store diff --git a/x/inflation/v1/keeper/migrations.go b/x/inflation/v1/keeper/migrations.go index 9061f9fb13..eb4433f23c 100644 --- a/x/inflation/v1/keeper/migrations.go +++ b/x/inflation/v1/keeper/migrations.go @@ -5,9 +5,9 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" - v2 "github.com/evmos/evmos/v16/x/inflation/v1/migrations/v2" - v3 "github.com/evmos/evmos/v16/x/inflation/v1/migrations/v3" - "github.com/evmos/evmos/v16/x/inflation/v1/types" + v2 "github.com/evmos/evmos/v17/x/inflation/v1/migrations/v2" + v3 "github.com/evmos/evmos/v17/x/inflation/v1/migrations/v3" + "github.com/evmos/evmos/v17/x/inflation/v1/types" ) // Migrator is a struct for handling in-place store migrations. diff --git a/x/inflation/v1/keeper/migrations_test.go b/x/inflation/v1/keeper/migrations_test.go index 1b74146d4a..d12eaf7ed0 100644 --- a/x/inflation/v1/keeper/migrations_test.go +++ b/x/inflation/v1/keeper/migrations_test.go @@ -7,11 +7,11 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/encoding" - inflationkeeper "github.com/evmos/evmos/v16/x/inflation/v1/keeper" - v2types "github.com/evmos/evmos/v16/x/inflation/v1/migrations/v2/types" - "github.com/evmos/evmos/v16/x/inflation/v1/types" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/encoding" + inflationkeeper "github.com/evmos/evmos/v17/x/inflation/v1/keeper" + v2types "github.com/evmos/evmos/v17/x/inflation/v1/migrations/v2/types" + "github.com/evmos/evmos/v17/x/inflation/v1/types" ) type mockSubspace struct { diff --git a/x/inflation/v1/keeper/msg_server.go b/x/inflation/v1/keeper/msg_server.go index f5ba90825a..608e525a50 100644 --- a/x/inflation/v1/keeper/msg_server.go +++ b/x/inflation/v1/keeper/msg_server.go @@ -9,7 +9,7 @@ import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - "github.com/evmos/evmos/v16/x/inflation/v1/types" + "github.com/evmos/evmos/v17/x/inflation/v1/types" ) var _ types.MsgServer = &Keeper{} diff --git a/x/inflation/v1/keeper/msg_server_test.go b/x/inflation/v1/keeper/msg_server_test.go index 73062f9c0e..85bb427a1e 100644 --- a/x/inflation/v1/keeper/msg_server_test.go +++ b/x/inflation/v1/keeper/msg_server_test.go @@ -3,7 +3,7 @@ package keeper_test import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - "github.com/evmos/evmos/v16/x/inflation/v1/types" + "github.com/evmos/evmos/v17/x/inflation/v1/types" ) func (suite *KeeperTestSuite) TestUpdateParams() { diff --git a/x/inflation/v1/keeper/params.go b/x/inflation/v1/keeper/params.go index e529942965..c379967690 100644 --- a/x/inflation/v1/keeper/params.go +++ b/x/inflation/v1/keeper/params.go @@ -5,7 +5,7 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/x/inflation/v1/types" + "github.com/evmos/evmos/v17/x/inflation/v1/types" ) // GetParams returns the total set of inflation parameters. diff --git a/x/inflation/v1/keeper/params_test.go b/x/inflation/v1/keeper/params_test.go index 851277eb5f..9de61872df 100644 --- a/x/inflation/v1/keeper/params_test.go +++ b/x/inflation/v1/keeper/params_test.go @@ -1,7 +1,7 @@ package keeper_test import ( - "github.com/evmos/evmos/v16/x/inflation/v1/types" + "github.com/evmos/evmos/v17/x/inflation/v1/types" ) func (suite *KeeperTestSuite) TestParams() { diff --git a/x/inflation/v1/keeper/periods.go b/x/inflation/v1/keeper/periods.go index 08906bc59f..88ddf41a78 100644 --- a/x/inflation/v1/keeper/periods.go +++ b/x/inflation/v1/keeper/periods.go @@ -5,7 +5,7 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/x/inflation/v1/types" + "github.com/evmos/evmos/v17/x/inflation/v1/types" ) // GetPeriod gets current period diff --git a/x/inflation/v1/keeper/setup_test.go b/x/inflation/v1/keeper/setup_test.go index 3bc8b58612..9d63c1dbab 100644 --- a/x/inflation/v1/keeper/setup_test.go +++ b/x/inflation/v1/keeper/setup_test.go @@ -11,10 +11,10 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/suite" - evm "github.com/evmos/evmos/v16/x/evm/types" + evm "github.com/evmos/evmos/v17/x/evm/types" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/x/inflation/v1/types" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/x/inflation/v1/types" ) var denomMint = types.DefaultInflationDenom diff --git a/x/inflation/v1/keeper/utils_test.go b/x/inflation/v1/keeper/utils_test.go index 75303f5081..abbec74343 100644 --- a/x/inflation/v1/keeper/utils_test.go +++ b/x/inflation/v1/keeper/utils_test.go @@ -4,12 +4,12 @@ import ( "time" "github.com/cosmos/cosmos-sdk/baseapp" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/testutil" - utils "github.com/evmos/evmos/v16/utils" - epochstypes "github.com/evmos/evmos/v16/x/epochs/types" - evm "github.com/evmos/evmos/v16/x/evm/types" - "github.com/evmos/evmos/v16/x/inflation/v1/types" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/testutil" + utils "github.com/evmos/evmos/v17/utils" + epochstypes "github.com/evmos/evmos/v17/x/epochs/types" + evm "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v17/x/inflation/v1/types" ) // Test helpers diff --git a/x/inflation/v1/migrations/v2/migrate.go b/x/inflation/v1/migrations/v2/migrate.go index bc51f4193b..bdb8862fce 100644 --- a/x/inflation/v1/migrations/v2/migrate.go +++ b/x/inflation/v1/migrations/v2/migrate.go @@ -7,8 +7,8 @@ import ( "github.com/cosmos/cosmos-sdk/codec" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - v2types "github.com/evmos/evmos/v16/x/inflation/v1/migrations/v2/types" - "github.com/evmos/evmos/v16/x/inflation/v1/types" + v2types "github.com/evmos/evmos/v17/x/inflation/v1/migrations/v2/types" + "github.com/evmos/evmos/v17/x/inflation/v1/types" ) // MigrateStore migrates the x/inflation module state from the consensus version 1 to diff --git a/x/inflation/v1/migrations/v2/migrate_test.go b/x/inflation/v1/migrations/v2/migrate_test.go index abc29044b8..007213420a 100644 --- a/x/inflation/v1/migrations/v2/migrate_test.go +++ b/x/inflation/v1/migrations/v2/migrate_test.go @@ -6,14 +6,14 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - v2 "github.com/evmos/evmos/v16/x/inflation/v1/migrations/v2" - "github.com/evmos/evmos/v16/x/inflation/v1/types" + v2 "github.com/evmos/evmos/v17/x/inflation/v1/migrations/v2" + "github.com/evmos/evmos/v17/x/inflation/v1/types" "github.com/cosmos/cosmos-sdk/testutil" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/encoding" - v2types "github.com/evmos/evmos/v16/x/inflation/v1/migrations/v2/types" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/encoding" + v2types "github.com/evmos/evmos/v17/x/inflation/v1/migrations/v2/types" "github.com/stretchr/testify/require" ) diff --git a/x/inflation/v1/migrations/v2/types/params.go b/x/inflation/v1/migrations/v2/types/params.go index f393110825..974f8c2c16 100644 --- a/x/inflation/v1/migrations/v2/types/params.go +++ b/x/inflation/v1/migrations/v2/types/params.go @@ -11,8 +11,8 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - evm "github.com/evmos/evmos/v16/x/evm/types" - "github.com/evmos/evmos/v16/x/inflation/v1/types" + evm "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v17/x/inflation/v1/types" ) var _ types.LegacyParams = &V2Params{} diff --git a/x/inflation/v1/migrations/v3/migrate_test.go b/x/inflation/v1/migrations/v3/migrate_test.go index 2923e347e0..7394940a9d 100644 --- a/x/inflation/v1/migrations/v3/migrate_test.go +++ b/x/inflation/v1/migrations/v3/migrate_test.go @@ -5,8 +5,8 @@ import ( "github.com/cosmos/cosmos-sdk/testutil" sdk "github.com/cosmos/cosmos-sdk/types" - v3 "github.com/evmos/evmos/v16/x/inflation/v1/migrations/v3" - "github.com/evmos/evmos/v16/x/inflation/v1/types" + v3 "github.com/evmos/evmos/v17/x/inflation/v1/migrations/v3" + "github.com/evmos/evmos/v17/x/inflation/v1/types" "github.com/stretchr/testify/require" ) diff --git a/x/inflation/v1/module.go b/x/inflation/v1/module.go index bdf6c228bb..8e5b3db200 100644 --- a/x/inflation/v1/module.go +++ b/x/inflation/v1/module.go @@ -21,9 +21,9 @@ import ( "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" - "github.com/evmos/evmos/v16/x/inflation/v1/client/cli" - "github.com/evmos/evmos/v16/x/inflation/v1/keeper" - "github.com/evmos/evmos/v16/x/inflation/v1/types" + "github.com/evmos/evmos/v17/x/inflation/v1/client/cli" + "github.com/evmos/evmos/v17/x/inflation/v1/keeper" + "github.com/evmos/evmos/v17/x/inflation/v1/types" ) // consensusVersion defines the current x/inflation module consensus version. diff --git a/x/inflation/v1/types/genesis.go b/x/inflation/v1/types/genesis.go index 79aec1d526..8f7f66594c 100644 --- a/x/inflation/v1/types/genesis.go +++ b/x/inflation/v1/types/genesis.go @@ -6,7 +6,7 @@ package types import ( fmt "fmt" - epochstypes "github.com/evmos/evmos/v16/x/epochs/types" + epochstypes "github.com/evmos/evmos/v17/x/epochs/types" ) // NewGenesisState creates a new GenesisState object diff --git a/x/inflation/v1/types/genesis.pb.go b/x/inflation/v1/types/genesis.pb.go index 6473d462f4..41b54fc9a1 100644 --- a/x/inflation/v1/types/genesis.pb.go +++ b/x/inflation/v1/types/genesis.pb.go @@ -186,33 +186,33 @@ func init() { func init() { proto.RegisterFile("evmos/inflation/v1/genesis.proto", fileDescriptor_1cb8eee530db1235) } var fileDescriptor_1cb8eee530db1235 = []byte{ - // 415 bytes of a gzipped FileDescriptorProto + // 414 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x52, 0x4d, 0x6f, 0xd3, 0x40, 0x10, 0xcd, 0x36, 0xc1, 0x22, 0x5b, 0xa0, 0xb0, 0x82, 0x60, 0x45, 0xc2, 0x58, 0x91, 0x90, 0xdc, - 0x1e, 0x6c, 0xa5, 0x48, 0x88, 0x73, 0x69, 0x85, 0x72, 0x8b, 0xcc, 0x8d, 0xcb, 0xca, 0x1f, 0x13, - 0x77, 0x85, 0xbd, 0xbb, 0xf2, 0x6e, 0xac, 0xf2, 0x2f, 0xf8, 0x13, 0xfc, 0x97, 0x1e, 0x7b, 0xe4, - 0x54, 0xa1, 0xe4, 0x8f, 0x20, 0xef, 0x1a, 0x07, 0x54, 0x5f, 0x2c, 0xef, 0x7b, 0x6f, 0xde, 0x9b, - 0x19, 0x0d, 0xf6, 0xa1, 0xa9, 0x84, 0x8a, 0x18, 0xdf, 0x94, 0x89, 0x66, 0x82, 0x47, 0xcd, 0x32, - 0x2a, 0x80, 0x83, 0x62, 0x2a, 0x94, 0xb5, 0xd0, 0x82, 0x10, 0xa3, 0x08, 0x7b, 0x45, 0xd8, 0x2c, - 0xe7, 0x2f, 0x0b, 0x51, 0x08, 0x43, 0x47, 0xed, 0x9f, 0x55, 0xce, 0x17, 0x03, 0x5e, 0x87, 0x32, - 0xa3, 0x59, 0xdc, 0x23, 0xfc, 0xe4, 0xb3, 0xf5, 0xff, 0xa2, 0x13, 0x0d, 0xe4, 0x23, 0x76, 0x64, - 0x52, 0x27, 0x95, 0x72, 0x91, 0x8f, 0x82, 0xe3, 0xf3, 0x79, 0xf8, 0x30, 0x2f, 0x5c, 0x1b, 0xc5, - 0xc5, 0xe4, 0xf6, 0xfe, 0xed, 0x28, 0xee, 0xf4, 0x64, 0x86, 0x1d, 0x09, 0x35, 0x13, 0xb9, 0x7b, - 0xe4, 0xa3, 0x60, 0x12, 0x77, 0x2f, 0x72, 0x8a, 0x9f, 0x83, 0x14, 0xd9, 0x35, 0x65, 0x39, 0x70, - 0xcd, 0x36, 0x0c, 0x6a, 0x77, 0xec, 0xa3, 0x60, 0x1a, 0x9f, 0x18, 0x7c, 0xd5, 0xc3, 0xe4, 0x0c, - 0xbf, 0x30, 0x90, 0xa2, 0x12, 0x6a, 0xda, 0xb9, 0x4d, 0x7c, 0x14, 0x8c, 0x3b, 0xad, 0x5a, 0x43, - 0xbd, 0xb6, 0xb6, 0xef, 0xf0, 0x33, 0xf5, 0x8d, 0x49, 0x09, 0x39, 0xb5, 0x94, 0xfb, 0xc8, 0xc4, - 0x3e, 0xed, 0xd0, 0x2b, 0x03, 0x2e, 0x7e, 0x1e, 0x61, 0xc7, 0xb6, 0x4b, 0xde, 0x60, 0x5c, 0x31, - 0xae, 0x69, 0x0e, 0x5c, 0x54, 0x66, 0xbc, 0x69, 0x3c, 0x6d, 0x91, 0xcb, 0x16, 0x20, 0x0c, 0xbf, - 0x86, 0x1b, 0x29, 0x78, 0xdb, 0x4d, 0x52, 0xd2, 0x2c, 0x29, 0xb3, 0xad, 0x1d, 0xd9, 0x0c, 0x74, - 0x7c, 0x7e, 0x36, 0xb4, 0x8a, 0xab, 0x43, 0xc9, 0xa7, 0x43, 0x45, 0xb7, 0x9a, 0x19, 0x0c, 0xb2, - 0x64, 0x83, 0x67, 0xbd, 0x09, 0xcd, 0x99, 0xd2, 0x35, 0x4b, 0xb7, 0x26, 0x69, 0x6c, 0x92, 0x4e, - 0x87, 0x92, 0x56, 0x7f, 0x1f, 0x97, 0xff, 0x14, 0x74, 0x41, 0xaf, 0xd8, 0x10, 0x69, 0x56, 0xcf, - 0x93, 0xb4, 0x04, 0xda, 0xf3, 0x66, 0x9d, 0x8f, 0xe3, 0x13, 0x8b, 0xf7, 0x9e, 0x17, 0xab, 0xdb, - 0x9d, 0x87, 0xee, 0x76, 0x1e, 0xfa, 0xbd, 0xf3, 0xd0, 0x8f, 0xbd, 0x37, 0xba, 0xdb, 0x7b, 0xa3, - 0x5f, 0x7b, 0x6f, 0xf4, 0x35, 0x2a, 0x98, 0xbe, 0xde, 0xa6, 0x61, 0x26, 0xaa, 0xc8, 0x5e, 0x94, - 0xfd, 0x36, 0xcb, 0x0f, 0xd1, 0xcd, 0xff, 0xd7, 0xa5, 0xbf, 0x4b, 0x50, 0xa9, 0x63, 0x4e, 0xeb, - 0xfd, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x22, 0x63, 0x89, 0x81, 0xcc, 0x02, 0x00, 0x00, + 0x1e, 0x6c, 0xa5, 0x1c, 0xe0, 0x5c, 0x5a, 0xa1, 0xdc, 0x22, 0x73, 0xe3, 0xb2, 0xf2, 0xc7, 0xc4, + 0x5d, 0x61, 0xef, 0xae, 0xbc, 0x1b, 0xab, 0xfc, 0x0b, 0xfe, 0x04, 0xff, 0xa5, 0xc7, 0x1e, 0x39, + 0x55, 0x28, 0xf9, 0x23, 0xc8, 0xbb, 0xc6, 0x01, 0xd5, 0x17, 0xcb, 0xfb, 0xde, 0x9b, 0xf7, 0x66, + 0x46, 0x83, 0x7d, 0x68, 0x2a, 0xa1, 0x22, 0xc6, 0x37, 0x65, 0xa2, 0x99, 0xe0, 0x51, 0xb3, 0x8c, + 0x0a, 0xe0, 0xa0, 0x98, 0x0a, 0x65, 0x2d, 0xb4, 0x20, 0xc4, 0x28, 0xc2, 0x5e, 0x11, 0x36, 0xcb, + 0xf9, 0xcb, 0x42, 0x14, 0xc2, 0xd0, 0x51, 0xfb, 0x67, 0x95, 0xf3, 0xc5, 0x80, 0xd7, 0xa1, 0xcc, + 0x68, 0x16, 0xf7, 0x08, 0x3f, 0xf9, 0x6c, 0xfd, 0xbf, 0xe8, 0x44, 0x03, 0xf9, 0x88, 0x1d, 0x99, + 0xd4, 0x49, 0xa5, 0x5c, 0xe4, 0xa3, 0xe0, 0xf8, 0x7c, 0x1e, 0x3e, 0xcc, 0x0b, 0xd7, 0x46, 0x71, + 0x31, 0xb9, 0xbd, 0x7f, 0x3b, 0x8a, 0x3b, 0x3d, 0x99, 0x61, 0x47, 0x42, 0xcd, 0x44, 0xee, 0x1e, + 0xf9, 0x28, 0x98, 0xc4, 0xdd, 0x8b, 0x9c, 0xe2, 0xe7, 0x20, 0x45, 0x76, 0x4d, 0x59, 0x0e, 0x5c, + 0xb3, 0x0d, 0x83, 0xda, 0x1d, 0xfb, 0x28, 0x98, 0xc6, 0x27, 0x06, 0x5f, 0xf5, 0x30, 0x39, 0xc3, + 0x2f, 0x0c, 0xa4, 0xa8, 0x84, 0x9a, 0x76, 0x6e, 0x13, 0x1f, 0x05, 0xe3, 0x4e, 0xab, 0xd6, 0x50, + 0xaf, 0xad, 0xed, 0x3b, 0xfc, 0x4c, 0x7d, 0x63, 0x52, 0x42, 0x4e, 0x2d, 0xe5, 0x3e, 0x32, 0xb1, + 0x4f, 0x3b, 0xf4, 0xca, 0x80, 0x8b, 0x9f, 0x47, 0xd8, 0xb1, 0xed, 0x92, 0x37, 0x18, 0x57, 0x8c, + 0x6b, 0x9a, 0x03, 0x17, 0x95, 0x19, 0x6f, 0x1a, 0x4f, 0x5b, 0xe4, 0xb2, 0x05, 0x08, 0xc3, 0xaf, + 0xe1, 0x46, 0x0a, 0xde, 0x76, 0x93, 0x94, 0x34, 0x4b, 0xca, 0x6c, 0x6b, 0x47, 0x36, 0x03, 0x1d, + 0x9f, 0x9f, 0x0d, 0xad, 0xe2, 0xea, 0x50, 0xf2, 0xe9, 0x50, 0xd1, 0xad, 0x66, 0x06, 0x83, 0x2c, + 0xd9, 0xe0, 0x59, 0x6f, 0x42, 0x73, 0xa6, 0x74, 0xcd, 0xd2, 0xad, 0x49, 0x1a, 0x9b, 0xa4, 0xd3, + 0xa1, 0xa4, 0xd5, 0xdf, 0xc7, 0xe5, 0x3f, 0x05, 0x5d, 0xd0, 0x2b, 0x36, 0x44, 0x9a, 0xd5, 0xf3, + 0x24, 0x2d, 0x81, 0xf6, 0xbc, 0x59, 0xe7, 0xe3, 0xf8, 0xc4, 0xe2, 0xbd, 0xe7, 0xc5, 0xea, 0x76, + 0xe7, 0xa1, 0xbb, 0x9d, 0x87, 0x7e, 0xef, 0x3c, 0xf4, 0x63, 0xef, 0x8d, 0xee, 0xf6, 0xde, 0xe8, + 0xd7, 0xde, 0x1b, 0x7d, 0x8d, 0x0a, 0xa6, 0xaf, 0xb7, 0x69, 0x98, 0x89, 0x2a, 0xb2, 0x17, 0x65, + 0xbf, 0xcd, 0xf2, 0x43, 0x74, 0xf3, 0xff, 0x75, 0xe9, 0xef, 0x12, 0x54, 0xea, 0x98, 0xd3, 0x7a, + 0xff, 0x27, 0x00, 0x00, 0xff, 0xff, 0x2a, 0x80, 0xe9, 0xbd, 0xcc, 0x02, 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { diff --git a/x/inflation/v1/types/genesis_test.go b/x/inflation/v1/types/genesis_test.go index 7e3972f6ea..4de0630130 100644 --- a/x/inflation/v1/types/genesis_test.go +++ b/x/inflation/v1/types/genesis_test.go @@ -3,7 +3,7 @@ package types import ( "testing" - epochstypes "github.com/evmos/evmos/v16/x/epochs/types" + epochstypes "github.com/evmos/evmos/v17/x/epochs/types" "github.com/stretchr/testify/suite" ) diff --git a/x/inflation/v1/types/inflation.pb.go b/x/inflation/v1/types/inflation.pb.go index ccf7b5bd53..039bf28bd4 100644 --- a/x/inflation/v1/types/inflation.pb.go +++ b/x/inflation/v1/types/inflation.pb.go @@ -137,31 +137,31 @@ func init() { } var fileDescriptor_d064cb35c3ff7df8 = []byte{ - // 379 bytes of a gzipped FileDescriptorProto + // 378 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x92, 0x4f, 0x6b, 0xdb, 0x30, 0x18, 0xc6, 0xad, 0xec, 0x0f, 0x4c, 0xdb, 0x92, 0x61, 0xb6, 0x61, 0x36, 0x70, 0x46, 0xc6, 0x60, - 0x27, 0x1b, 0x33, 0xd8, 0x07, 0xc8, 0xb2, 0x41, 0x46, 0x0e, 0x21, 0x94, 0x1e, 0x7a, 0x31, 0xb2, - 0xa2, 0x3a, 0x22, 0x96, 0x5e, 0x23, 0xc9, 0xae, 0x73, 0xee, 0x17, 0xe8, 0x97, 0x2a, 0xe4, 0x98, - 0x63, 0xe9, 0x21, 0x94, 0xe4, 0x8b, 0x14, 0xff, 0x69, 0x42, 0x6f, 0xce, 0x45, 0xbc, 0x92, 0xde, - 0xdf, 0xc3, 0xfb, 0x48, 0x0f, 0x1e, 0xb0, 0x5c, 0x80, 0xf6, 0xb9, 0xbc, 0x4c, 0x88, 0xe1, 0x20, - 0xfd, 0x3c, 0x38, 0x6e, 0xbc, 0x54, 0x81, 0x01, 0xdb, 0xae, 0x7a, 0xbc, 0xe3, 0x71, 0x1e, 0x7c, - 0xf9, 0x18, 0x43, 0x0c, 0xd5, 0xb5, 0x5f, 0x56, 0x75, 0xe7, 0xe0, 0xba, 0x83, 0x3f, 0x8d, 0x9f, - 0xda, 0x46, 0x5c, 0x1b, 0xc5, 0xa3, 0xac, 0xac, 0xed, 0x09, 0xee, 0x69, 0x43, 0x96, 0x5c, 0xc6, - 0xa1, 0x62, 0x57, 0x44, 0xcd, 0xb5, 0x83, 0xbe, 0xa1, 0x9f, 0x6f, 0x86, 0xdf, 0xd7, 0xdb, 0xbe, - 0x75, 0xbf, 0xed, 0x7f, 0xa5, 0xa0, 0x05, 0x68, 0x3d, 0x5f, 0x7a, 0x1c, 0x7c, 0x41, 0xcc, 0xc2, - 0x9b, 0xb0, 0x98, 0xd0, 0xd5, 0x88, 0xd1, 0x59, 0xb7, 0x61, 0x67, 0x35, 0x6a, 0x4f, 0xf1, 0x87, - 0x4c, 0x93, 0x98, 0x85, 0x5c, 0x52, 0x26, 0x0d, 0xcf, 0x99, 0x76, 0x3a, 0x95, 0xdc, 0x8f, 0x16, - 0x72, 0x0e, 0x9a, 0xf5, 0x2a, 0x7c, 0x7c, 0xa0, 0xed, 0xff, 0xb8, 0x4b, 0x41, 0x88, 0x4c, 0x72, - 0xb3, 0x0a, 0x53, 0x80, 0xc4, 0x79, 0xd1, 0x7e, 0xbc, 0xf7, 0x07, 0x74, 0x0a, 0x90, 0x0c, 0x6e, - 0x3b, 0xf8, 0xf3, 0xdf, 0x22, 0x05, 0x59, 0x8a, 0x93, 0xe4, 0x0f, 0x49, 0x68, 0x56, 0x3f, 0x89, - 0x1d, 0x60, 0x44, 0x4e, 0x31, 0x8e, 0x48, 0x89, 0xa8, 0xc6, 0x5c, 0x3b, 0x44, 0x95, 0x08, 0x3d, - 0x65, 0x7e, 0x44, 0x4b, 0xff, 0x11, 0xc8, 0x79, 0xf9, 0x3f, 0x86, 0xa8, 0x98, 0x19, 0xe7, 0xe5, - 0x09, 0xfe, 0x1b, 0xf4, 0xac, 0x22, 0xed, 0x7f, 0xf8, 0x9d, 0x20, 0x45, 0x98, 0x13, 0xc5, 0x89, - 0xa4, 0xcc, 0x79, 0xd5, 0x5e, 0xe9, 0xad, 0x20, 0xc5, 0x79, 0xc3, 0x0d, 0xc7, 0xeb, 0x9d, 0x8b, - 0x36, 0x3b, 0x17, 0x3d, 0xec, 0x5c, 0x74, 0xb3, 0x77, 0xad, 0xcd, 0xde, 0xb5, 0xee, 0xf6, 0xae, - 0x75, 0xe1, 0xc7, 0xdc, 0x2c, 0xb2, 0xc8, 0xa3, 0x20, 0xfc, 0x3a, 0xc0, 0xf5, 0x9a, 0x07, 0xbf, - 0xfd, 0xe2, 0x79, 0x98, 0xcd, 0x2a, 0x65, 0x3a, 0x7a, 0x5d, 0xe5, 0xf3, 0xd7, 0x63, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xb8, 0xdc, 0xa2, 0x57, 0xef, 0x02, 0x00, 0x00, + 0x27, 0x1b, 0xb3, 0xc3, 0xee, 0x59, 0x36, 0xc8, 0xc8, 0x21, 0x84, 0xd2, 0x43, 0x2f, 0x46, 0x56, + 0x54, 0x47, 0xc4, 0xd2, 0x6b, 0x24, 0xd9, 0x75, 0xce, 0xfd, 0x02, 0xfd, 0x52, 0x85, 0x1c, 0x73, + 0x2c, 0x3d, 0x84, 0x92, 0x7c, 0x91, 0xe2, 0x3f, 0x4d, 0xe8, 0xcd, 0xb9, 0x88, 0x57, 0xd2, 0xfb, + 0x7b, 0x78, 0x1f, 0xe9, 0xc1, 0x03, 0x96, 0x0b, 0xd0, 0x3e, 0x97, 0x97, 0x09, 0x31, 0x1c, 0xa4, + 0x9f, 0x07, 0xc7, 0x8d, 0x97, 0x2a, 0x30, 0x60, 0xdb, 0x55, 0x8f, 0x77, 0x3c, 0xce, 0x83, 0x2f, + 0x1f, 0x63, 0x88, 0xa1, 0xba, 0xf6, 0xcb, 0xaa, 0xee, 0x1c, 0x5c, 0x77, 0xf0, 0xa7, 0xf1, 0x53, + 0xdb, 0x88, 0x6b, 0xa3, 0x78, 0x94, 0x95, 0xb5, 0x3d, 0xc1, 0x3d, 0x6d, 0xc8, 0x92, 0xcb, 0x38, + 0x54, 0xec, 0x8a, 0xa8, 0xb9, 0x76, 0xd0, 0x37, 0xf4, 0xf3, 0xcd, 0xf0, 0xfb, 0x7a, 0xdb, 0xb7, + 0xee, 0xb7, 0xfd, 0xaf, 0x14, 0xb4, 0x00, 0xad, 0xe7, 0x4b, 0x8f, 0x83, 0x2f, 0x88, 0x59, 0x78, + 0x13, 0x16, 0x13, 0xba, 0x1a, 0x31, 0x3a, 0xeb, 0x36, 0xec, 0xac, 0x46, 0xed, 0x29, 0xfe, 0x90, + 0x69, 0x12, 0xb3, 0x90, 0x4b, 0xca, 0xa4, 0xe1, 0x39, 0xd3, 0x4e, 0xa7, 0x92, 0xfb, 0xd1, 0x42, + 0xce, 0x41, 0xb3, 0x5e, 0x85, 0x8f, 0x0f, 0xb4, 0xfd, 0x1f, 0x77, 0x29, 0x08, 0x91, 0x49, 0x6e, + 0x56, 0x61, 0x0a, 0x90, 0x38, 0x2f, 0xda, 0x8f, 0xf7, 0xfe, 0x80, 0x4e, 0x01, 0x92, 0xc1, 0x6d, + 0x07, 0x7f, 0xfe, 0x5b, 0xa4, 0x20, 0x4b, 0x71, 0x92, 0xfc, 0x21, 0x09, 0xcd, 0xea, 0x27, 0xb1, + 0x03, 0x8c, 0xc8, 0x29, 0xc6, 0x11, 0x29, 0x11, 0xd5, 0x98, 0x6b, 0x87, 0xa8, 0x12, 0xa1, 0xa7, + 0xcc, 0x8f, 0x68, 0xe9, 0x3f, 0x02, 0x39, 0x2f, 0xff, 0xc7, 0x10, 0x15, 0x33, 0xe3, 0xbc, 0x3c, + 0xc1, 0x7f, 0x83, 0x9e, 0x55, 0xa4, 0xfd, 0x0f, 0xbf, 0x13, 0xa4, 0x08, 0x73, 0xa2, 0x38, 0x91, + 0x94, 0x39, 0xaf, 0xda, 0x2b, 0xbd, 0x15, 0xa4, 0x38, 0x6f, 0xb8, 0xe1, 0x78, 0xbd, 0x73, 0xd1, + 0x66, 0xe7, 0xa2, 0x87, 0x9d, 0x8b, 0x6e, 0xf6, 0xae, 0xb5, 0xd9, 0xbb, 0xd6, 0xdd, 0xde, 0xb5, + 0x2e, 0xfc, 0x98, 0x9b, 0x45, 0x16, 0x79, 0x14, 0x84, 0x5f, 0x07, 0xb8, 0x5e, 0xf3, 0xe0, 0xb7, + 0x5f, 0x3c, 0x0f, 0xb3, 0x59, 0xa5, 0x4c, 0x47, 0xaf, 0xab, 0x7c, 0xfe, 0x7a, 0x0c, 0x00, 0x00, + 0xff, 0xff, 0xb0, 0x3f, 0xc2, 0x6b, 0xef, 0x02, 0x00, 0x00, } func (m *InflationDistribution) Marshal() (dAtA []byte, err error) { diff --git a/x/inflation/v1/types/inflation_calculation.go b/x/inflation/v1/types/inflation_calculation.go index 3ac10c9ed0..b9cb5e76a4 100644 --- a/x/inflation/v1/types/inflation_calculation.go +++ b/x/inflation/v1/types/inflation_calculation.go @@ -6,7 +6,7 @@ package types import ( "cosmossdk.io/math" - evmostypes "github.com/evmos/evmos/v16/types" + evmostypes "github.com/evmos/evmos/v17/types" ) const ( diff --git a/x/inflation/v1/types/params.go b/x/inflation/v1/types/params.go index 7f6a01654b..25b679af36 100644 --- a/x/inflation/v1/types/params.go +++ b/x/inflation/v1/types/params.go @@ -10,7 +10,7 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" - evm "github.com/evmos/evmos/v16/x/evm/types" + evm "github.com/evmos/evmos/v17/x/evm/types" ) var ParamsKey = []byte("Params") diff --git a/x/inflation/v1/types/query.pb.go b/x/inflation/v1/types/query.pb.go index 760d1d7d20..b057bc435a 100644 --- a/x/inflation/v1/types/query.pb.go +++ b/x/inflation/v1/types/query.pb.go @@ -549,13 +549,13 @@ func init() { proto.RegisterFile("evmos/inflation/v1/query.proto", fileDescripto var fileDescriptor_91b9f1b5d47c7fd7 = []byte{ // 679 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x95, 0xc1, 0x6a, 0x13, 0x41, - 0x18, 0xc7, 0xb3, 0x52, 0x23, 0x8e, 0xb4, 0xd0, 0xb1, 0x88, 0x6e, 0xeb, 0x26, 0xac, 0x5a, 0x43, - 0xa1, 0x33, 0x26, 0x05, 0xf1, 0xdc, 0xea, 0xa1, 0xa2, 0x58, 0xd3, 0x9b, 0x97, 0xb0, 0xd9, 0x8e, - 0x9b, 0xa1, 0xcd, 0xcc, 0x74, 0x67, 0x12, 0x9a, 0x83, 0x17, 0x9f, 0x40, 0xf0, 0x20, 0x28, 0xf8, - 0x00, 0xbd, 0xf8, 0x1a, 0x3d, 0x16, 0xbc, 0x88, 0x87, 0x2a, 0xad, 0x0f, 0x22, 0x3b, 0x3b, 0x9b, - 0x76, 0x9b, 0xd9, 0xad, 0x05, 0x2f, 0x61, 0x33, 0xdf, 0xff, 0xfb, 0xbe, 0x3f, 0xff, 0x9d, 0x1f, - 0x0b, 0x3c, 0x32, 0xec, 0x73, 0x89, 0x29, 0x7b, 0xbb, 0x13, 0x28, 0xca, 0x19, 0x1e, 0x36, 0xf1, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x95, 0xc1, 0x6e, 0xd3, 0x30, + 0x18, 0xc7, 0x1b, 0x34, 0x8a, 0x30, 0xda, 0xa4, 0x99, 0x09, 0x41, 0x36, 0xd2, 0x2a, 0xc0, 0xa8, + 0x26, 0xcd, 0xa6, 0xdd, 0x01, 0xce, 0x1b, 0x1c, 0x86, 0x40, 0x8c, 0xee, 0xc6, 0xa5, 0x4a, 0x33, + 0x93, 0x5a, 0x5b, 0x6d, 0x2f, 0x76, 0xab, 0xf5, 0xc0, 0x85, 0x27, 0x40, 0xe2, 0x80, 0x04, 0x12, + 0x0f, 0xb0, 0x0b, 0xaf, 0xb1, 0xe3, 0x24, 0x2e, 0x88, 0xc3, 0x40, 0x1b, 0x0f, 0x82, 0xe2, 0x38, + 0xdd, 0xb2, 0x3a, 0x19, 0x93, 0xb8, 0x54, 0xa9, 0xbf, 0xff, 0xf7, 0x7d, 0x7f, 0xfd, 0xe3, 0x9f, + 0x02, 0x3c, 0x32, 0xec, 0x73, 0x89, 0x29, 0x7b, 0xbb, 0x13, 0x28, 0xca, 0x19, 0x1e, 0x36, 0xf1, 0xee, 0x80, 0xc4, 0x23, 0x24, 0x62, 0xae, 0x38, 0x84, 0xba, 0x8e, 0xc6, 0x75, 0x34, 0x6c, 0xba, 0x5e, 0xc8, 0x65, 0xd2, 0xd4, 0x0d, 0x24, 0xc1, 0xc3, 0x66, 0x97, 0xa8, 0xa0, 0x89, 0x43, 0x4e, 0x59, 0xda, 0xe3, 0xd6, 0x2d, 0x33, 0x23, 0xc2, 0x88, 0xa4, 0xd2, 0x28, 0xe6, 0x22, 0x1e, 0x71, @@ -590,8 +590,8 @@ var fileDescriptor_91b9f1b5d47c7fd7 = []byte{ 0x72, 0xd8, 0x5e, 0xc0, 0x45, 0x8a, 0xeb, 0xfa, 0xc1, 0xb1, 0xe7, 0x1c, 0x1e, 0x7b, 0xce, 0xef, 0x63, 0xcf, 0xf9, 0x70, 0xe2, 0x55, 0x0e, 0x4f, 0xbc, 0xca, 0x8f, 0x13, 0xaf, 0xf2, 0x06, 0x47, 0x54, 0xf5, 0x06, 0x5d, 0x14, 0xf2, 0xbe, 0xe9, 0x4f, 0x7f, 0x87, 0xcd, 0xc7, 0x78, 0x2f, 0x3f, - 0x4b, 0x8d, 0x04, 0x91, 0xdd, 0xaa, 0xfe, 0x04, 0xae, 0xfc, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x42, - 0x5a, 0x1d, 0xc6, 0xae, 0x07, 0x00, 0x00, + 0x4b, 0x8d, 0x04, 0x91, 0xdd, 0xaa, 0xfe, 0x04, 0xae, 0xfc, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x4a, + 0xb9, 0x7d, 0xfa, 0xae, 0x07, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/inflation/v1/types/tx.pb.go b/x/inflation/v1/types/tx.pb.go index 7eb7e4d9ba..7337e037a6 100644 --- a/x/inflation/v1/types/tx.pb.go +++ b/x/inflation/v1/types/tx.pb.go @@ -151,8 +151,8 @@ var fileDescriptor_2f254d33a26438a9 = []byte{ 0x98, 0x45, 0x4e, 0x9e, 0x27, 0x1e, 0xc9, 0x31, 0x5e, 0x78, 0x24, 0xc7, 0xf8, 0xe0, 0x91, 0x1c, 0xe3, 0x84, 0xc7, 0x72, 0x0c, 0x17, 0x1e, 0xcb, 0x31, 0xdc, 0x78, 0x2c, 0xc7, 0x10, 0xa5, 0x9f, 0x9e, 0x59, 0x92, 0x51, 0x9a, 0xa4, 0x97, 0x9c, 0x9f, 0xab, 0x0f, 0x09, 0x76, 0x08, 0x59, 0x66, - 0x68, 0xa6, 0x5f, 0x81, 0x16, 0xcf, 0x95, 0x05, 0xa9, 0xc5, 0x49, 0x6c, 0xe0, 0xb0, 0x36, 0x06, - 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0xbd, 0x69, 0xea, 0x0a, 0x02, 0x00, 0x00, + 0x68, 0xae, 0x5f, 0x81, 0x16, 0xcf, 0x95, 0x05, 0xa9, 0xc5, 0x49, 0x6c, 0xe0, 0xb0, 0x36, 0x06, + 0x04, 0x00, 0x00, 0xff, 0xff, 0x58, 0x5e, 0x09, 0xd6, 0x0a, 0x02, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/vesting/client/cli/query.go b/x/vesting/client/cli/query.go index c58c377b98..76c77114f6 100644 --- a/x/vesting/client/cli/query.go +++ b/x/vesting/client/cli/query.go @@ -11,7 +11,7 @@ import ( "github.com/cosmos/cosmos-sdk/client/flags" "github.com/spf13/cobra" - "github.com/evmos/evmos/v16/x/vesting/types" + "github.com/evmos/evmos/v17/x/vesting/types" ) // GetQueryCmd returns the parent command for all vesting CLI query commands. diff --git a/x/vesting/client/cli/tx.go b/x/vesting/client/cli/tx.go index aa4a683877..d61c1002a6 100644 --- a/x/vesting/client/cli/tx.go +++ b/x/vesting/client/cli/tx.go @@ -19,7 +19,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/gov/client/cli" govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - "github.com/evmos/evmos/v16/x/vesting/types" + "github.com/evmos/evmos/v17/x/vesting/types" ) // Transaction command flags diff --git a/x/vesting/client/proposal_handler.go b/x/vesting/client/proposal_handler.go index dba26859d6..7d1d1a8daf 100644 --- a/x/vesting/client/proposal_handler.go +++ b/x/vesting/client/proposal_handler.go @@ -6,7 +6,7 @@ package client import ( govclient "github.com/cosmos/cosmos-sdk/x/gov/client" - "github.com/evmos/evmos/v16/x/vesting/client/cli" + "github.com/evmos/evmos/v17/x/vesting/client/cli" ) var RegisterClawbackProposalHandler = govclient.NewProposalHandler(cli.NewClawbackProposalCmd) diff --git a/x/vesting/handler.go b/x/vesting/handler.go index aac2ed746d..1fa2ef7f71 100644 --- a/x/vesting/handler.go +++ b/x/vesting/handler.go @@ -8,7 +8,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/evmos/evmos/v16/x/vesting/types" + "github.com/evmos/evmos/v17/x/vesting/types" ) // NewHandler returns a handler for vesting module message types. diff --git a/x/vesting/keeper/gov.go b/x/vesting/keeper/gov.go index 68fb6f4a1d..adf45f28ac 100644 --- a/x/vesting/keeper/gov.go +++ b/x/vesting/keeper/gov.go @@ -5,7 +5,7 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/x/vesting/types" + "github.com/evmos/evmos/v17/x/vesting/types" ) // HasGovClawbackDisabled checks if the given account has governance clawback disabled. diff --git a/x/vesting/keeper/gov_test.go b/x/vesting/keeper/gov_test.go index 73ae8b01e2..3f8bcac41e 100644 --- a/x/vesting/keeper/gov_test.go +++ b/x/vesting/keeper/gov_test.go @@ -2,7 +2,7 @@ package keeper_test import ( sdk "github.com/cosmos/cosmos-sdk/types" - testutiltx "github.com/evmos/evmos/v16/testutil/tx" + testutiltx "github.com/evmos/evmos/v17/testutil/tx" ) func (suite *KeeperTestSuite) TestGovClawbackStore() { diff --git a/x/vesting/keeper/grpc_query.go b/x/vesting/keeper/grpc_query.go index 1b183c3791..61ea8207d3 100644 --- a/x/vesting/keeper/grpc_query.go +++ b/x/vesting/keeper/grpc_query.go @@ -10,7 +10,7 @@ import ( "google.golang.org/grpc/codes" "google.golang.org/grpc/status" - "github.com/evmos/evmos/v16/x/vesting/types" + "github.com/evmos/evmos/v17/x/vesting/types" ) var _ types.QueryServer = Keeper{} diff --git a/x/vesting/keeper/grpc_query_test.go b/x/vesting/keeper/grpc_query_test.go index fc82dc9826..42f16662b4 100644 --- a/x/vesting/keeper/grpc_query_test.go +++ b/x/vesting/keeper/grpc_query_test.go @@ -6,8 +6,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/evmos/evmos/v16/testutil" - "github.com/evmos/evmos/v16/x/vesting/types" + "github.com/evmos/evmos/v17/testutil" + "github.com/evmos/evmos/v17/x/vesting/types" ) func (suite *KeeperTestSuite) TestBalances() { diff --git a/x/vesting/keeper/hooks.go b/x/vesting/keeper/hooks.go index 23da3dc5dc..58e8352074 100644 --- a/x/vesting/keeper/hooks.go +++ b/x/vesting/keeper/hooks.go @@ -9,7 +9,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" - vestingtypes "github.com/evmos/evmos/v16/x/vesting/types" + vestingtypes "github.com/evmos/evmos/v17/x/vesting/types" ) var _ govtypes.GovHooks = Hooks{} diff --git a/x/vesting/keeper/integration_test.go b/x/vesting/keeper/integration_test.go index 7c5c1b14c4..d9b33fb06c 100644 --- a/x/vesting/keeper/integration_test.go +++ b/x/vesting/keeper/integration_test.go @@ -21,14 +21,14 @@ import ( govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/contracts" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" - "github.com/evmos/evmos/v16/testutil" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/utils" - erc20types "github.com/evmos/evmos/v16/x/erc20/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - "github.com/evmos/evmos/v16/x/vesting/types" + "github.com/evmos/evmos/v17/contracts" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + "github.com/evmos/evmos/v17/testutil" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v17/utils" + erc20types "github.com/evmos/evmos/v17/x/erc20/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v17/x/vesting/types" ) // TestClawbackAccount is a struct to store all relevant information that is corresponding diff --git a/x/vesting/keeper/keeper.go b/x/vesting/keeper/keeper.go index 2b97eae153..17f35f6a6b 100644 --- a/x/vesting/keeper/keeper.go +++ b/x/vesting/keeper/keeper.go @@ -11,7 +11,7 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/x/vesting/types" + "github.com/evmos/evmos/v17/x/vesting/types" ) // Keeper of this module maintains collections of vesting. diff --git a/x/vesting/keeper/keeper_test.go b/x/vesting/keeper/keeper_test.go index 668095946e..1cdb952ef0 100644 --- a/x/vesting/keeper/keeper_test.go +++ b/x/vesting/keeper/keeper_test.go @@ -2,10 +2,10 @@ package keeper_test import ( sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/encoding" - "github.com/evmos/evmos/v16/x/vesting/keeper" - vestingtypes "github.com/evmos/evmos/v16/x/vesting/types" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/encoding" + "github.com/evmos/evmos/v17/x/vesting/keeper" + vestingtypes "github.com/evmos/evmos/v17/x/vesting/types" ) func (suite *KeeperTestSuite) TestNewKeeper() { diff --git a/x/vesting/keeper/migrations.go b/x/vesting/keeper/migrations.go index 5f19cf2591..96d54a95e1 100644 --- a/x/vesting/keeper/migrations.go +++ b/x/vesting/keeper/migrations.go @@ -5,7 +5,7 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" - v2 "github.com/evmos/evmos/v16/x/vesting/migrations/v2" + v2 "github.com/evmos/evmos/v17/x/vesting/migrations/v2" ) var _ module.MigrationHandler = Migrator{}.Migrate1to2 diff --git a/x/vesting/keeper/migrations_test.go b/x/vesting/keeper/migrations_test.go index dbb134bb34..d99bb56855 100644 --- a/x/vesting/keeper/migrations_test.go +++ b/x/vesting/keeper/migrations_test.go @@ -5,10 +5,10 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" sdkvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" - testutiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/x/vesting/keeper" - v1vestingtypes "github.com/evmos/evmos/v16/x/vesting/migrations/types" - vestingtypes "github.com/evmos/evmos/v16/x/vesting/types" + testutiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v17/x/vesting/keeper" + v1vestingtypes "github.com/evmos/evmos/v17/x/vesting/migrations/types" + vestingtypes "github.com/evmos/evmos/v17/x/vesting/types" ) func (suite *KeeperTestSuite) TestMigration() { diff --git a/x/vesting/keeper/msg_server.go b/x/vesting/keeper/msg_server.go index e812d5381a..c77961e064 100644 --- a/x/vesting/keeper/msg_server.go +++ b/x/vesting/keeper/msg_server.go @@ -17,8 +17,8 @@ import ( errortypes "github.com/cosmos/cosmos-sdk/types/errors" sdkvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types" - evmostypes "github.com/evmos/evmos/v16/types" - "github.com/evmos/evmos/v16/x/vesting/types" + evmostypes "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v17/x/vesting/types" ) var _ types.MsgServer = &Keeper{} diff --git a/x/vesting/keeper/msg_server_test.go b/x/vesting/keeper/msg_server_test.go index 4318fa4c88..084ab6dda2 100644 --- a/x/vesting/keeper/msg_server_test.go +++ b/x/vesting/keeper/msg_server_test.go @@ -10,10 +10,10 @@ import ( sdkvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" vestingexported "github.com/cosmos/cosmos-sdk/x/auth/vesting/exported" - "github.com/evmos/evmos/v16/testutil" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - evmostypes "github.com/evmos/evmos/v16/types" - "github.com/evmos/evmos/v16/x/vesting/types" + "github.com/evmos/evmos/v17/testutil" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + evmostypes "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v17/x/vesting/types" ) var ( diff --git a/x/vesting/keeper/setup_test.go b/x/vesting/keeper/setup_test.go index c285e90fde..7beba3c367 100644 --- a/x/vesting/keeper/setup_test.go +++ b/x/vesting/keeper/setup_test.go @@ -17,10 +17,10 @@ import ( "github.com/stretchr/testify/suite" ethtypes "github.com/ethereum/go-ethereum/core/types" - evm "github.com/evmos/evmos/v16/x/evm/types" + evm "github.com/evmos/evmos/v17/x/evm/types" - "github.com/evmos/evmos/v16/app" - "github.com/evmos/evmos/v16/x/vesting/types" + "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v17/x/vesting/types" ) var ( diff --git a/x/vesting/keeper/utils.go b/x/vesting/keeper/utils.go index 932c7d40ea..b46246a21f 100644 --- a/x/vesting/keeper/utils.go +++ b/x/vesting/keeper/utils.go @@ -8,7 +8,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/evmos/evmos/v16/x/vesting/types" + "github.com/evmos/evmos/v17/x/vesting/types" ) // GetClawbackVestingAccount is a helper function to get the account from the diff --git a/x/vesting/keeper/utils_test.go b/x/vesting/keeper/utils_test.go index 369a144489..5a875a3cfb 100644 --- a/x/vesting/keeper/utils_test.go +++ b/x/vesting/keeper/utils_test.go @@ -19,19 +19,19 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v16/app" - cosmosante "github.com/evmos/evmos/v16/app/ante/cosmos" - evmante "github.com/evmos/evmos/v16/app/ante/evm" - "github.com/evmos/evmos/v16/contracts" - "github.com/evmos/evmos/v16/crypto/ethsecp256k1" - "github.com/evmos/evmos/v16/encoding" - "github.com/evmos/evmos/v16/testutil" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - evmostypes "github.com/evmos/evmos/v16/types" - "github.com/evmos/evmos/v16/utils" - epochstypes "github.com/evmos/evmos/v16/x/epochs/types" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" - "github.com/evmos/evmos/v16/x/vesting/types" + "github.com/evmos/evmos/v17/app" + cosmosante "github.com/evmos/evmos/v17/app/ante/cosmos" + evmante "github.com/evmos/evmos/v17/app/ante/evm" + "github.com/evmos/evmos/v17/contracts" + "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + "github.com/evmos/evmos/v17/encoding" + "github.com/evmos/evmos/v17/testutil" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + evmostypes "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v17/utils" + epochstypes "github.com/evmos/evmos/v17/x/epochs/types" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v17/x/vesting/types" "github.com/stretchr/testify/require" ) diff --git a/x/vesting/migrations/types/vesting.pb.go b/x/vesting/migrations/types/vesting.pb.go index fd3ba3d4d3..5128e8abf7 100644 --- a/x/vesting/migrations/types/vesting.pb.go +++ b/x/vesting/migrations/types/vesting.pb.go @@ -89,7 +89,7 @@ var fileDescriptor_5f1a3c86c0cebe5f = []byte{ // 421 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x52, 0xc1, 0x8e, 0xd3, 0x30, 0x10, 0x8d, 0xd9, 0x82, 0x76, 0xbd, 0xda, 0x82, 0xa2, 0x15, 0x8a, 0x7a, 0x70, 0x2a, 0x04, 0x52, - 0x85, 0x84, 0xad, 0x2e, 0x02, 0x09, 0x6e, 0xcd, 0x7e, 0x00, 0x28, 0x42, 0x1c, 0xb8, 0x44, 0x76, + 0x85, 0x84, 0xad, 0x2e, 0x42, 0x08, 0x6e, 0xcd, 0x7e, 0x00, 0x28, 0x42, 0x1c, 0xb8, 0x44, 0x76, 0xe2, 0xcd, 0x46, 0x6d, 0xe2, 0x28, 0x76, 0xc2, 0xf2, 0x07, 0xab, 0x3d, 0xed, 0x91, 0x63, 0xcf, 0x7c, 0x49, 0x8f, 0x3d, 0x72, 0x6a, 0x51, 0xfb, 0x23, 0x28, 0xb6, 0x53, 0xb5, 0x20, 0xae, 0x9c, 0x32, 0xf3, 0xc6, 0x33, 0xef, 0xbd, 0xcc, 0x40, 0xc4, 0x9b, 0x5c, 0x48, 0xd2, 0x70, 0xa9, 0xb2, @@ -112,8 +112,8 @@ var fileDescriptor_5f1a3c86c0cebe5f = []byte{ 0xdb, 0xb9, 0xef, 0x7c, 0x9f, 0xfb, 0x4e, 0xf0, 0x61, 0xb1, 0x41, 0x60, 0xb9, 0x41, 0xe0, 0xd7, 0x06, 0x81, 0xfb, 0x2d, 0x72, 0x96, 0x5b, 0xe4, 0xfc, 0xdc, 0x22, 0xe7, 0xcb, 0x9b, 0x3d, 0x3a, 0x73, 0xc0, 0xf6, 0x8c, 0xc7, 0x6f, 0xc9, 0xcd, 0x8e, 0x27, 0xcf, 0xd2, 0x8a, 0xaa, 0x4c, 0x14, - 0xd2, 0x50, 0xb2, 0x47, 0x7a, 0x37, 0xaf, 0x7f, 0x07, 0x00, 0x00, 0xff, 0xff, 0x59, 0x20, 0xd1, - 0x67, 0xf5, 0x02, 0x00, 0x00, + 0xd2, 0x50, 0xb2, 0x47, 0x7a, 0x37, 0xaf, 0x7f, 0x07, 0x00, 0x00, 0xff, 0xff, 0xcc, 0xf4, 0xa1, + 0xf2, 0xf5, 0x02, 0x00, 0x00, } func (m *ClawbackVestingAccount) Marshal() (dAtA []byte, err error) { diff --git a/x/vesting/migrations/v2/migrate.go b/x/vesting/migrations/v2/migrate.go index 50d7aefc04..c5b884f9c4 100644 --- a/x/vesting/migrations/v2/migrate.go +++ b/x/vesting/migrations/v2/migrate.go @@ -5,8 +5,8 @@ package v2 import ( sdk "github.com/cosmos/cosmos-sdk/types" accounttypes "github.com/cosmos/cosmos-sdk/x/auth/types" - v1vestingtypes "github.com/evmos/evmos/v16/x/vesting/migrations/types" - vestingtypes "github.com/evmos/evmos/v16/x/vesting/types" + v1vestingtypes "github.com/evmos/evmos/v17/x/vesting/migrations/types" + vestingtypes "github.com/evmos/evmos/v17/x/vesting/types" ) // MigrateStore migrates the x/vesting module state from the consensus version 1 to diff --git a/x/vesting/module.go b/x/vesting/module.go index 9a99580215..557d2e6b55 100644 --- a/x/vesting/module.go +++ b/x/vesting/module.go @@ -22,9 +22,9 @@ import ( bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" - "github.com/evmos/evmos/v16/x/vesting/client/cli" - "github.com/evmos/evmos/v16/x/vesting/keeper" - "github.com/evmos/evmos/v16/x/vesting/types" + "github.com/evmos/evmos/v17/x/vesting/client/cli" + "github.com/evmos/evmos/v17/x/vesting/keeper" + "github.com/evmos/evmos/v17/x/vesting/types" ) // consensusVersion defines the current x/vesting module consensus version. diff --git a/x/vesting/proposal_handler.go b/x/vesting/proposal_handler.go index 5c68c7597b..452d36d5bc 100644 --- a/x/vesting/proposal_handler.go +++ b/x/vesting/proposal_handler.go @@ -11,8 +11,8 @@ import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - "github.com/evmos/evmos/v16/x/vesting/keeper" - "github.com/evmos/evmos/v16/x/vesting/types" + "github.com/evmos/evmos/v17/x/vesting/keeper" + "github.com/evmos/evmos/v17/x/vesting/types" ) // NewVestingProposalHandler creates a governance handler to manage new proposal types. diff --git a/x/vesting/proposal_handler_test.go b/x/vesting/proposal_handler_test.go index ed39bb9e79..39f1b1537a 100644 --- a/x/vesting/proposal_handler_test.go +++ b/x/vesting/proposal_handler_test.go @@ -5,10 +5,10 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" sdkvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" - "github.com/evmos/evmos/v16/testutil" - testutiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/x/vesting" - vestingtypes "github.com/evmos/evmos/v16/x/vesting/types" + "github.com/evmos/evmos/v17/testutil" + testutiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v17/x/vesting" + vestingtypes "github.com/evmos/evmos/v17/x/vesting/types" ) var ( diff --git a/x/vesting/setup_test.go b/x/vesting/setup_test.go index ce5539e7df..7cdb8ac90a 100644 --- a/x/vesting/setup_test.go +++ b/x/vesting/setup_test.go @@ -8,7 +8,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v16/app" + "github.com/evmos/evmos/v17/app" "github.com/stretchr/testify/suite" ) diff --git a/x/vesting/types/clawback_vesting_account_test.go b/x/vesting/types/clawback_vesting_account_test.go index 09a9025b95..df41165ec9 100644 --- a/x/vesting/types/clawback_vesting_account_test.go +++ b/x/vesting/types/clawback_vesting_account_test.go @@ -11,8 +11,8 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" sdkvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/x/vesting/types" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v17/x/vesting/types" ) var ( diff --git a/x/vesting/types/codec.go b/x/vesting/types/codec.go index 79029a3e5c..69e92e4a75 100644 --- a/x/vesting/types/codec.go +++ b/x/vesting/types/codec.go @@ -12,7 +12,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/vesting/exported" sdkvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - migrationtypes "github.com/evmos/evmos/v16/x/vesting/migrations/types" + migrationtypes "github.com/evmos/evmos/v17/x/vesting/migrations/types" ) var ( diff --git a/x/vesting/types/events.pb.go b/x/vesting/types/events.pb.go index bb1a30e79b..e96d880706 100644 --- a/x/vesting/types/events.pb.go +++ b/x/vesting/types/events.pb.go @@ -289,27 +289,27 @@ func init() { func init() { proto.RegisterFile("evmos/vesting/v2/events.proto", fileDescriptor_7a6fa6478193a613) } var fileDescriptor_7a6fa6478193a613 = []byte{ - // 317 bytes of a gzipped FileDescriptorProto + // 318 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x92, 0xcf, 0x4a, 0x33, 0x31, 0x14, 0xc5, 0x3b, 0xdf, 0x47, 0x2b, 0xbd, 0xe2, 0x1f, 0x06, 0xd1, 0xd9, 0x74, 0xa8, 0xdd, 0x28, - 0x2e, 0x66, 0xb0, 0x82, 0x7b, 0xad, 0xf6, 0x01, 0x44, 0x5d, 0xb8, 0x29, 0x69, 0xe6, 0x5a, 0x43, - 0x9d, 0xa4, 0x4c, 0xee, 0xa4, 0xfa, 0x14, 0xfa, 0x58, 0x2e, 0xbb, 0x74, 0x29, 0x9d, 0x17, 0x11, - 0x93, 0x28, 0x16, 0x2a, 0xe8, 0xf2, 0xe6, 0x9e, 0xfc, 0xee, 0x39, 0x70, 0xa0, 0x85, 0x26, 0x57, - 0x3a, 0x35, 0xa8, 0x49, 0xc8, 0x51, 0x6a, 0xba, 0x29, 0x1a, 0x94, 0xa4, 0x93, 0x49, 0xa1, 0x48, - 0x85, 0x9b, 0x76, 0x9d, 0xf8, 0x75, 0x62, 0xba, 0x9d, 0x0c, 0x76, 0xcf, 0x3f, 0x14, 0xbd, 0x02, - 0x19, 0x61, 0xef, 0x9e, 0x4d, 0x87, 0x8c, 0x8f, 0xaf, 0x9d, 0xe0, 0x84, 0x73, 0x55, 0x4a, 0x0a, - 0xb7, 0xa1, 0x71, 0x5b, 0xca, 0x0c, 0x8b, 0x28, 0x68, 0x07, 0xfb, 0xcd, 0x0b, 0x3f, 0x85, 0x7b, - 0xb0, 0xe1, 0x51, 0x03, 0xe6, 0xa4, 0xd1, 0x3f, 0x2b, 0x58, 0x37, 0x0b, 0x80, 0xce, 0x53, 0x00, - 0x3b, 0xf6, 0x4c, 0xbf, 0x94, 0xd9, 0x2f, 0xe1, 0x5b, 0x50, 0xe7, 0x4a, 0x48, 0xed, 0x91, 0x6e, - 0x08, 0x5b, 0x00, 0x9a, 0x58, 0x41, 0x03, 0x12, 0x39, 0x46, 0xff, 0xed, 0xaa, 0x69, 0x5f, 0x2e, - 0x45, 0x8e, 0xcb, 0x1c, 0xd5, 0x97, 0x3a, 0xe2, 0xb0, 0xe6, 0x72, 0xfb, 0xc4, 0x3f, 0xda, 0x88, - 0x60, 0x65, 0x31, 0xdb, 0xe7, 0x18, 0xb6, 0x61, 0x35, 0xb3, 0x50, 0x46, 0x42, 0x49, 0xef, 0xe5, - 0xfb, 0x53, 0x67, 0x0c, 0x91, 0x3d, 0x72, 0x35, 0xc9, 0x18, 0xa1, 0xcf, 0xdd, 0x77, 0xdc, 0xbf, - 0xdf, 0x6b, 0x01, 0x48, 0x9c, 0x0e, 0xfc, 0x2f, 0x1f, 0x5d, 0xe2, 0xd4, 0x01, 0x4f, 0xcf, 0x5e, - 0xe6, 0x71, 0x30, 0x9b, 0xc7, 0xc1, 0xdb, 0x3c, 0x0e, 0x9e, 0xab, 0xb8, 0x36, 0xab, 0xe2, 0xda, - 0x6b, 0x15, 0xd7, 0x6e, 0x0e, 0x46, 0x82, 0xee, 0xca, 0x61, 0xc2, 0x55, 0x9e, 0xba, 0x7e, 0xf8, - 0x96, 0x1c, 0x1e, 0xa7, 0x0f, 0x5f, 0x5d, 0xa1, 0xc7, 0x09, 0xea, 0x61, 0xc3, 0x16, 0xe5, 0xe8, - 0x3d, 0x00, 0x00, 0xff, 0xff, 0xc3, 0x29, 0xe6, 0x8f, 0x49, 0x02, 0x00, 0x00, + 0x2e, 0x66, 0xb0, 0x2e, 0x5c, 0x6b, 0xb5, 0x0f, 0x20, 0xea, 0xc2, 0x4d, 0x49, 0x33, 0xd7, 0x1a, + 0xea, 0x24, 0x65, 0x72, 0x27, 0xd5, 0xa7, 0xd0, 0xc7, 0x72, 0xd9, 0xa5, 0x4b, 0xe9, 0xbc, 0x88, + 0x98, 0x44, 0xb1, 0x50, 0x41, 0x97, 0x37, 0xf7, 0xe4, 0x77, 0xcf, 0x81, 0x03, 0x2d, 0x34, 0xb9, + 0xd2, 0xa9, 0x41, 0x4d, 0x42, 0x8e, 0x52, 0xd3, 0x4d, 0xd1, 0xa0, 0x24, 0x9d, 0x4c, 0x0a, 0x45, + 0x2a, 0xdc, 0xb4, 0xeb, 0xc4, 0xaf, 0x13, 0xd3, 0xed, 0x64, 0xb0, 0x7b, 0xfe, 0xa1, 0xe8, 0x15, + 0xc8, 0x08, 0x7b, 0xf7, 0x6c, 0x3a, 0x64, 0x7c, 0x7c, 0xed, 0x04, 0x27, 0x9c, 0xab, 0x52, 0x52, + 0xb8, 0x0d, 0x8d, 0xdb, 0x52, 0x66, 0x58, 0x44, 0x41, 0x3b, 0xd8, 0x6f, 0x5e, 0xf8, 0x29, 0xdc, + 0x83, 0x0d, 0x8f, 0x1a, 0x30, 0x27, 0x8d, 0xfe, 0x59, 0xc1, 0xba, 0x59, 0x00, 0x74, 0x9e, 0x02, + 0xd8, 0xb1, 0x67, 0xfa, 0xa5, 0xcc, 0x7e, 0x09, 0xdf, 0x82, 0x3a, 0x57, 0x42, 0x6a, 0x8f, 0x74, + 0x43, 0xd8, 0x02, 0xd0, 0xc4, 0x0a, 0x1a, 0x90, 0xc8, 0x31, 0xfa, 0x6f, 0x57, 0x4d, 0xfb, 0x72, + 0x29, 0x72, 0x5c, 0xe6, 0xa8, 0xbe, 0xd4, 0x11, 0x87, 0x35, 0x97, 0xdb, 0x27, 0xfe, 0xd1, 0x46, + 0x04, 0x2b, 0x8b, 0xd9, 0x3e, 0xc7, 0xb0, 0x0d, 0xab, 0x99, 0x85, 0x32, 0x12, 0x4a, 0x7a, 0x2f, + 0xdf, 0x9f, 0x3a, 0x63, 0x88, 0xec, 0x91, 0xab, 0x49, 0xc6, 0x08, 0x7d, 0xee, 0xbe, 0xe3, 0xfe, + 0xfd, 0x5e, 0x0b, 0x40, 0xe2, 0x74, 0xe0, 0x7f, 0xf9, 0xe8, 0x12, 0xa7, 0x0e, 0x78, 0x7a, 0xf6, + 0x32, 0x8f, 0x83, 0xd9, 0x3c, 0x0e, 0xde, 0xe6, 0x71, 0xf0, 0x5c, 0xc5, 0xb5, 0x59, 0x15, 0xd7, + 0x5e, 0xab, 0xb8, 0x76, 0x73, 0x30, 0x12, 0x74, 0x57, 0x0e, 0x13, 0xae, 0xf2, 0xd4, 0xf5, 0xc3, + 0xb7, 0xe4, 0xf0, 0x38, 0x7d, 0xf8, 0xea, 0x0a, 0x3d, 0x4e, 0x50, 0x0f, 0x1b, 0xb6, 0x28, 0x47, + 0xef, 0x01, 0x00, 0x00, 0xff, 0xff, 0xcd, 0xb9, 0x6d, 0x2a, 0x49, 0x02, 0x00, 0x00, } func (m *EventCreateClawbackVestingAccount) Marshal() (dAtA []byte, err error) { diff --git a/x/vesting/types/msg_test.go b/x/vesting/types/msg_test.go index 568706d760..8786d471ea 100644 --- a/x/vesting/types/msg_test.go +++ b/x/vesting/types/msg_test.go @@ -10,8 +10,8 @@ import ( sdkvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" "github.com/stretchr/testify/suite" - utiltx "github.com/evmos/evmos/v16/testutil/tx" - "github.com/evmos/evmos/v16/x/vesting/types" + utiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v17/x/vesting/types" ) type MsgsTestSuite struct { diff --git a/x/vesting/types/proposal_test.go b/x/vesting/types/proposal_test.go index 896b631e7e..92a209c2c6 100644 --- a/x/vesting/types/proposal_test.go +++ b/x/vesting/types/proposal_test.go @@ -3,7 +3,7 @@ package types_test import ( "testing" - "github.com/evmos/evmos/v16/x/vesting/types" + "github.com/evmos/evmos/v17/x/vesting/types" "github.com/stretchr/testify/suite" ) diff --git a/x/vesting/types/query.pb.go b/x/vesting/types/query.pb.go index ad0032f7ea..4b95b5697b 100644 --- a/x/vesting/types/query.pb.go +++ b/x/vesting/types/query.pb.go @@ -151,30 +151,30 @@ func init() { proto.RegisterFile("evmos/vesting/v2/query.proto", fileDescriptor_ var fileDescriptor_e31744b0ce27e85a = []byte{ // 383 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x52, 0xc1, 0x4e, 0xea, 0x40, - 0x14, 0xed, 0x40, 0x1e, 0x8f, 0x37, 0x6f, 0xf3, 0xd2, 0xf0, 0x92, 0x3e, 0x42, 0x0a, 0x21, 0x2f, - 0x48, 0x8c, 0xce, 0x40, 0x4d, 0xfc, 0x00, 0xf4, 0x07, 0x64, 0xe9, 0x6e, 0xda, 0x4e, 0x6a, 0x03, - 0xcc, 0x2d, 0xcc, 0xb4, 0x91, 0x18, 0x37, 0xee, 0xdc, 0x99, 0xf0, 0x17, 0x7e, 0x09, 0x71, 0x45, - 0xe2, 0xc6, 0x95, 0x1a, 0xf0, 0x43, 0x4c, 0xdb, 0x81, 0x18, 0x34, 0x71, 0xa3, 0xab, 0xde, 0xce, - 0xbd, 0xe7, 0xdc, 0x7b, 0xee, 0xb9, 0xb8, 0xc6, 0x93, 0x11, 0x48, 0x9a, 0x70, 0xa9, 0x42, 0x11, - 0xd0, 0xc4, 0xa1, 0xe3, 0x98, 0x4f, 0xa6, 0x24, 0x9a, 0x80, 0x02, 0xf3, 0x4f, 0x96, 0x25, 0x3a, - 0x4b, 0x12, 0xa7, 0x6a, 0x7b, 0x20, 0x53, 0x80, 0xcb, 0x24, 0xa7, 0x49, 0xd7, 0xe5, 0x8a, 0x75, - 0xa9, 0x07, 0xa1, 0xc8, 0x11, 0xd5, 0x4a, 0x00, 0x01, 0x64, 0x21, 0x4d, 0x23, 0xfd, 0x5a, 0x0b, - 0x00, 0x82, 0x21, 0xa7, 0x2c, 0x0a, 0x29, 0x13, 0x02, 0x14, 0x53, 0x21, 0x08, 0x99, 0x67, 0x9b, - 0x1d, 0x5c, 0x39, 0x49, 0x9b, 0xf6, 0xd8, 0x90, 0x09, 0x8f, 0xcb, 0x3e, 0x1f, 0xc7, 0x5c, 0x2a, - 0xd3, 0xc2, 0x3f, 0x99, 0xef, 0x4f, 0xb8, 0x94, 0x16, 0x6a, 0xa0, 0xf6, 0xaf, 0xfe, 0xfa, 0xb7, - 0x79, 0x57, 0xc0, 0x7f, 0xb7, 0x20, 0x32, 0x02, 0x21, 0xb9, 0xe9, 0xe1, 0xd2, 0x10, 0xbc, 0x01, - 0xf7, 0x2d, 0xd4, 0x28, 0xb6, 0x7f, 0x3b, 0xff, 0x48, 0x3e, 0x30, 0x49, 0x07, 0x26, 0x7a, 0x60, - 0x72, 0x04, 0xa1, 0xe8, 0x75, 0xe6, 0x8f, 0x75, 0xe3, 0xf6, 0xa9, 0xde, 0x0e, 0x42, 0x75, 0x16, - 0xbb, 0xc4, 0x83, 0x11, 0xd5, 0xea, 0xf2, 0xcf, 0xbe, 0xf4, 0x07, 0x54, 0x4d, 0x23, 0x2e, 0x33, - 0x80, 0xec, 0x6b, 0x6a, 0x33, 0xc0, 0xe5, 0x58, 0xa4, 0x4b, 0xe1, 0xbe, 0x55, 0xf8, 0xfa, 0x36, - 0x1b, 0xf2, 0x54, 0x8d, 0x6e, 0x53, 0xfc, 0x06, 0x35, 0x39, 0xb5, 0x33, 0x43, 0xf8, 0x47, 0xb6, - 0x4c, 0xf3, 0x1a, 0xe1, 0xf2, 0x7a, 0xa3, 0x66, 0x8b, 0x6c, 0x9b, 0x4f, 0x3e, 0x72, 0xa9, 0xba, - 0xf3, 0x69, 0x5d, 0x6e, 0x4d, 0x73, 0xef, 0xea, 0xfe, 0x65, 0x56, 0x68, 0x99, 0xff, 0xe9, 0xbb, - 0x9b, 0x73, 0x75, 0x2d, 0xbd, 0xd0, 0x0e, 0x5f, 0xf6, 0x8e, 0xe7, 0x4b, 0x1b, 0x2d, 0x96, 0x36, - 0x7a, 0x5e, 0xda, 0xe8, 0x66, 0x65, 0x1b, 0x8b, 0x95, 0x6d, 0x3c, 0xac, 0x6c, 0xe3, 0x74, 0xf7, - 0x8d, 0xc2, 0x9c, 0x49, 0xf3, 0x75, 0x0f, 0xe9, 0xf9, 0x86, 0x35, 0x53, 0xea, 0x96, 0xb2, 0x0b, - 0x3b, 0x78, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x5f, 0xfd, 0x56, 0xec, 0xe7, 0x02, 0x00, 0x00, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x52, 0x41, 0x4f, 0xe2, 0x40, + 0x14, 0xee, 0x40, 0x96, 0x65, 0x67, 0x2f, 0x9b, 0x86, 0x4d, 0xba, 0x84, 0x14, 0x42, 0x36, 0x48, + 0x8c, 0xce, 0x40, 0x3d, 0x78, 0x47, 0xff, 0x80, 0x1c, 0xbd, 0x4d, 0xdb, 0x49, 0x6d, 0x80, 0x79, + 0x85, 0x99, 0x36, 0x12, 0xe3, 0xc5, 0x9b, 0x37, 0x13, 0xfe, 0x85, 0xbf, 0x84, 0x78, 0x22, 0xf1, + 0xe2, 0x49, 0x0d, 0xf8, 0x43, 0x4c, 0xdb, 0x81, 0x18, 0x34, 0xf1, 0xa2, 0xa7, 0xbe, 0xce, 0x7b, + 0xdf, 0xf7, 0xde, 0xf7, 0xbe, 0x87, 0x6b, 0x3c, 0x19, 0x81, 0xa4, 0x09, 0x97, 0x2a, 0x14, 0x01, + 0x4d, 0x1c, 0x3a, 0x8e, 0xf9, 0x64, 0x4a, 0xa2, 0x09, 0x28, 0x30, 0xff, 0x64, 0x59, 0xa2, 0xb3, + 0x24, 0x71, 0xaa, 0xb6, 0x07, 0x32, 0x05, 0xb8, 0x4c, 0x72, 0x9a, 0x74, 0x5d, 0xae, 0x58, 0x97, + 0x7a, 0x10, 0x8a, 0x1c, 0x51, 0xad, 0x04, 0x10, 0x40, 0x16, 0xd2, 0x34, 0xd2, 0xaf, 0xb5, 0x00, + 0x20, 0x18, 0x72, 0xca, 0xa2, 0x90, 0x32, 0x21, 0x40, 0x31, 0x15, 0x82, 0x90, 0x79, 0xb6, 0xd9, + 0xc1, 0x95, 0x93, 0xb4, 0x69, 0x8f, 0x0d, 0x99, 0xf0, 0xb8, 0xec, 0xf3, 0x71, 0xcc, 0xa5, 0x32, + 0x2d, 0xfc, 0x93, 0xf9, 0xfe, 0x84, 0x4b, 0x69, 0xa1, 0x06, 0x6a, 0xff, 0xea, 0xaf, 0x7f, 0x9b, + 0x77, 0x05, 0xfc, 0x77, 0x0b, 0x22, 0x23, 0x10, 0x92, 0x9b, 0x1e, 0x2e, 0x0d, 0xc1, 0x1b, 0x70, + 0xdf, 0x42, 0x8d, 0x62, 0xfb, 0xb7, 0xf3, 0x8f, 0xe4, 0x03, 0x93, 0x74, 0x60, 0xa2, 0x07, 0x26, + 0x47, 0x10, 0x8a, 0x5e, 0x67, 0xfe, 0x58, 0x37, 0x6e, 0x9f, 0xea, 0xed, 0x20, 0x54, 0x67, 0xb1, + 0x4b, 0x3c, 0x18, 0x51, 0xad, 0x2e, 0xff, 0xec, 0x4b, 0x7f, 0x40, 0xd5, 0x34, 0xe2, 0x32, 0x03, + 0xc8, 0xbe, 0xa6, 0x36, 0x03, 0x5c, 0x8e, 0x45, 0xba, 0x14, 0xee, 0x5b, 0x85, 0xaf, 0x6f, 0xb3, + 0x21, 0x4f, 0xd5, 0xe8, 0x36, 0xc5, 0x6f, 0x50, 0x93, 0x53, 0x3b, 0x33, 0x84, 0x7f, 0x64, 0xcb, + 0x34, 0xaf, 0x11, 0x2e, 0xaf, 0x37, 0x6a, 0xb6, 0xc8, 0xb6, 0xf9, 0xe4, 0x23, 0x97, 0xaa, 0x3b, + 0x9f, 0xd6, 0xe5, 0xd6, 0x34, 0xf7, 0xae, 0xee, 0x5f, 0x66, 0x85, 0x96, 0xf9, 0x9f, 0xbe, 0xbb, + 0x39, 0x57, 0xd7, 0xd2, 0x0b, 0xed, 0xf0, 0x65, 0xef, 0x78, 0xbe, 0xb4, 0xd1, 0x62, 0x69, 0xa3, + 0xe7, 0xa5, 0x8d, 0x6e, 0x56, 0xb6, 0xb1, 0x58, 0xd9, 0xc6, 0xc3, 0xca, 0x36, 0x4e, 0x77, 0xdf, + 0x28, 0xcc, 0x99, 0x34, 0x5f, 0xf7, 0x90, 0x9e, 0x6f, 0x58, 0x33, 0xa5, 0x6e, 0x29, 0xbb, 0xb0, + 0x83, 0xd7, 0x00, 0x00, 0x00, 0xff, 0xff, 0x51, 0x6d, 0xdd, 0x49, 0xe7, 0x02, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/vesting/types/tx.pb.go b/x/vesting/types/tx.pb.go index 1fd8b6b634..7f80dbe246 100644 --- a/x/vesting/types/tx.pb.go +++ b/x/vesting/types/tx.pb.go @@ -583,57 +583,57 @@ var fileDescriptor_a372bb0b868e4c86 = []byte{ // 848 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x55, 0xbf, 0x6f, 0x23, 0x45, 0x14, 0xf6, 0x9c, 0xb9, 0x53, 0x6e, 0xcc, 0x85, 0x63, 0xcd, 0x81, 0x6f, 0x75, 0xd9, 0x35, 0x16, - 0x51, 0x7c, 0x26, 0xec, 0x9c, 0xcd, 0xe9, 0xa4, 0x8b, 0x68, 0x62, 0xa3, 0x50, 0x59, 0x42, 0x16, - 0x50, 0xd0, 0x58, 0xe3, 0xdd, 0xc9, 0x66, 0x15, 0x7b, 0x67, 0xe5, 0x99, 0x5d, 0x9b, 0x36, 0x15, - 0xa2, 0x8a, 0x84, 0xe8, 0xa1, 0xa0, 0x01, 0x21, 0xd1, 0xf3, 0x07, 0x10, 0x51, 0x45, 0xa2, 0x81, - 0x86, 0xa0, 0x04, 0x09, 0xfe, 0x0c, 0x34, 0x3f, 0x76, 0x13, 0x9c, 0x21, 0x71, 0x0a, 0xa8, 0xec, - 0x9d, 0xf7, 0xbd, 0xf7, 0xbe, 0xf9, 0xde, 0x8f, 0x81, 0x0f, 0x49, 0x36, 0xa1, 0x0c, 0x65, 0x84, - 0xf1, 0x28, 0x0e, 0x51, 0xd6, 0x41, 0x7c, 0xee, 0x25, 0x53, 0xca, 0xa9, 0x75, 0x5f, 0x9a, 0x3c, - 0x6d, 0xf2, 0xb2, 0x8e, 0xed, 0xf8, 0x94, 0x09, 0xf4, 0x08, 0x33, 0x82, 0xb2, 0xf6, 0x88, 0x70, - 0xdc, 0x46, 0x3e, 0x8d, 0x62, 0xe5, 0x61, 0xbf, 0xa6, 0xed, 0x13, 0x16, 0xa2, 0xac, 0x2d, 0x7e, - 0xb4, 0xe1, 0x0d, 0x6d, 0x28, 0xd2, 0x68, 0xdf, 0x3c, 0xb6, 0x42, 0xbd, 0x12, 0xd2, 0x90, 0xca, - 0xbf, 0x48, 0xfc, 0xd3, 0xa7, 0x8f, 0x42, 0x4a, 0xc3, 0x31, 0x41, 0x38, 0x89, 0x10, 0x8e, 0x63, - 0xca, 0x31, 0x8f, 0x68, 0xcc, 0xb4, 0xd5, 0xd5, 0x56, 0xf9, 0x35, 0x4a, 0x77, 0x11, 0x8f, 0x26, - 0x84, 0x71, 0x3c, 0x49, 0x14, 0xa0, 0xf1, 0x03, 0x80, 0x6e, 0x9f, 0x85, 0xbd, 0x29, 0xc1, 0x9c, - 0xf4, 0xc6, 0x78, 0x36, 0xc2, 0xfe, 0xfe, 0x47, 0x2a, 0xef, 0xb6, 0xef, 0xd3, 0x34, 0xe6, 0xd6, - 0x3a, 0x5c, 0xdd, 0x4d, 0xe3, 0x80, 0x4c, 0x87, 0x38, 0x08, 0xa6, 0x84, 0xb1, 0x1a, 0xa8, 0x83, - 0xe6, 0xdd, 0xc1, 0x3d, 0x75, 0xba, 0xad, 0x0e, 0xad, 0x0d, 0xf8, 0x92, 0x26, 0x5c, 0xe0, 0x6e, - 0x49, 0xdc, 0xaa, 0x3e, 0xce, 0x81, 0x1e, 0xac, 0x92, 0x18, 0x8f, 0xc6, 0x64, 0x18, 0xd2, 0x6c, - 0xe8, 0xeb, 0xa4, 0xb5, 0x72, 0x1d, 0x34, 0x57, 0x06, 0x2f, 0x2b, 0xd3, 0x7b, 0x34, 0xcb, 0xd9, - 0x6c, 0xd5, 0xfe, 0xfa, 0xd2, 0x2d, 0x1d, 0xfc, 0xf9, 0x7d, 0x6b, 0x31, 0x7e, 0xe3, 0x31, 0xdc, - 0xb8, 0x86, 0xfc, 0x80, 0xb0, 0x84, 0xc6, 0x8c, 0x34, 0x7e, 0x2d, 0xc3, 0x07, 0x7d, 0x16, 0xee, - 0xa4, 0x71, 0xf0, 0x1f, 0x5f, 0xaf, 0x07, 0x21, 0xe3, 0x78, 0xca, 0x87, 0x42, 0x6b, 0x79, 0xab, - 0x4a, 0xc7, 0xf6, 0x54, 0x21, 0xbc, 0xbc, 0x10, 0xde, 0x07, 0x79, 0x21, 0xba, 0x2b, 0x47, 0xbf, - 0xb9, 0xa5, 0xc3, 0x13, 0x17, 0x0c, 0xee, 0x4a, 0x3f, 0x61, 0xb1, 0x3e, 0x05, 0x70, 0x75, 0x4c, - 0xfd, 0xfd, 0x34, 0x19, 0x26, 0x64, 0x1a, 0xd1, 0x80, 0xd5, 0x5e, 0xa8, 0x97, 0x9b, 0x95, 0x8e, - 0xe3, 0xa9, 0x66, 0x39, 0x6f, 0x3c, 0xd5, 0x2c, 0xde, 0xfb, 0x12, 0xd6, 0xdd, 0x16, 0xd1, 0xbe, - 0x39, 0x71, 0x9f, 0x87, 0x11, 0xdf, 0x4b, 0x47, 0x9e, 0x4f, 0x27, 0x48, 0xb7, 0x97, 0xfa, 0x79, - 0x8b, 0x05, 0xfb, 0x68, 0x8e, 0x70, 0xca, 0xf7, 0x8a, 0x86, 0xe3, 0x9f, 0x24, 0x84, 0xe9, 0x08, - 0x6c, 0x70, 0x4f, 0x25, 0xd6, 0x9f, 0xd6, 0x67, 0xe0, 0xfc, 0xe6, 0x39, 0x97, 0xdb, 0xff, 0x17, - 0x97, 0x5c, 0x5c, 0xfd, 0xbd, 0x55, 0x15, 0x7d, 0xb0, 0x50, 0xaf, 0x86, 0x0b, 0xd7, 0x8c, 0xa5, - 0x2d, 0x8a, 0xff, 0x05, 0x80, 0x15, 0xd1, 0x28, 0xba, 0x45, 0x6e, 0x50, 0x72, 0xac, 0x22, 0x2d, - 0x96, 0x5c, 0x1f, 0xe7, 0xc0, 0xd7, 0xe1, 0x8b, 0x01, 0x61, 0xe7, 0xa8, 0xb2, 0x44, 0x55, 0xc4, - 0x99, 0x86, 0x98, 0x89, 0xcf, 0x61, 0xf5, 0x02, 0xad, 0x9c, 0xae, 0x85, 0xe1, 0x6d, 0xb1, 0x36, - 0x04, 0x2b, 0x21, 0xf3, 0xc3, 0x5c, 0x66, 0xb1, 0x58, 0x0a, 0x8d, 0x7b, 0x34, 0x8a, 0xbb, 0x4f, - 0xb4, 0xc2, 0xcd, 0x2b, 0x15, 0x56, 0x92, 0x0a, 0x07, 0x36, 0x50, 0x91, 0x1b, 0xdf, 0x02, 0xf8, - 0x6a, 0x9f, 0x85, 0x1f, 0x26, 0x01, 0xe6, 0x44, 0xab, 0xb6, 0x23, 0xc9, 0x2d, 0x2b, 0xce, 0x26, - 0xb4, 0x62, 0x32, 0x1b, 0x2e, 0x40, 0x95, 0x3e, 0xf7, 0x63, 0x32, 0xdb, 0xb9, 0x6e, 0x7a, 0xca, - 0xa6, 0xe9, 0x31, 0xeb, 0x54, 0x87, 0x8e, 0x99, 0x6c, 0x51, 0xe1, 0x1e, 0xac, 0x09, 0x25, 0x69, - 0x9c, 0x91, 0x29, 0x5f, 0x18, 0x70, 0x43, 0x6e, 0x60, 0xca, 0xdd, 0x68, 0xc0, 0xfa, 0xbf, 0x05, - 0xc9, 0x13, 0x75, 0x7e, 0xbc, 0x03, 0xcb, 0x7d, 0x16, 0x5a, 0x3f, 0x01, 0xf8, 0xe8, 0xca, 0xad, - 0xd9, 0xf6, 0x16, 0x1f, 0x08, 0xef, 0x9a, 0x5d, 0x65, 0x3f, 0xbf, 0xb1, 0x4b, 0x71, 0xff, 0x77, - 0x0e, 0x7e, 0xfe, 0xe3, 0xf3, 0x5b, 0xcf, 0xac, 0xa7, 0xc8, 0xf0, 0x62, 0x21, 0x5f, 0x86, 0x28, - 0x56, 0xed, 0xb0, 0x90, 0x43, 0x73, 0xfd, 0x0a, 0x40, 0xcb, 0xb0, 0x19, 0x37, 0x8c, 0x7c, 0x2e, - 0x03, 0x6d, 0xb4, 0x24, 0xb0, 0xa0, 0xdb, 0x96, 0x74, 0xdf, 0xb4, 0x1e, 0x1b, 0xe9, 0x8a, 0xea, - 0x5f, 0xe2, 0x38, 0x83, 0x2b, 0xc5, 0xfc, 0xae, 0x99, 0x85, 0xd2, 0x66, 0x7b, 0xfd, 0x4a, 0x73, - 0x41, 0x62, 0x5d, 0x92, 0x70, 0xad, 0x35, 0xb3, 0x66, 0x79, 0xb2, 0xaf, 0x01, 0xac, 0x9a, 0xe6, - 0xa4, 0x69, 0xcc, 0x62, 0x40, 0xda, 0x4f, 0x96, 0x45, 0x16, 0xd4, 0x3a, 0x92, 0xda, 0xa6, 0xd5, - 0x32, 0x52, 0x4b, 0xa5, 0x67, 0xa1, 0x90, 0x1a, 0x16, 0xeb, 0x3b, 0x00, 0x1f, 0x98, 0x07, 0xa0, - 0x65, 0xd6, 0xc3, 0x84, 0xb5, 0x3b, 0xcb, 0x63, 0x0b, 0xb6, 0x4f, 0x25, 0x5b, 0xcf, 0xda, 0x34, - 0x0b, 0xa9, 0x7c, 0x17, 0x0b, 0xda, 0x7d, 0xf7, 0xe8, 0xd4, 0x01, 0xc7, 0xa7, 0x0e, 0xf8, 0xfd, - 0xd4, 0x01, 0x87, 0x67, 0x4e, 0xe9, 0xf8, 0xcc, 0x29, 0xfd, 0x72, 0xe6, 0x94, 0x3e, 0x6e, 0x5d, - 0xd8, 0x66, 0x2a, 0xa2, 0x8e, 0xdb, 0x7e, 0x86, 0xe6, 0xff, 0x7c, 0x28, 0x46, 0x77, 0xe4, 0x8b, - 0xfa, 0xf6, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xa8, 0xef, 0x12, 0x24, 0xaa, 0x09, 0x00, 0x00, + 0x51, 0x7c, 0x26, 0xec, 0x9c, 0xcd, 0x09, 0x74, 0x11, 0x4d, 0x6c, 0x14, 0x2a, 0x4b, 0xc8, 0x02, + 0x0a, 0x1a, 0x6b, 0xbc, 0x3b, 0xd9, 0xac, 0x62, 0xef, 0xac, 0x3c, 0xb3, 0x6b, 0xd3, 0xa6, 0x42, + 0x54, 0x91, 0x10, 0x3d, 0x14, 0x34, 0x20, 0x24, 0x7a, 0xfe, 0x00, 0x22, 0xaa, 0x48, 0x34, 0xd0, + 0x10, 0x94, 0x20, 0xc1, 0x9f, 0x81, 0xe6, 0xc7, 0x6e, 0x82, 0x33, 0x24, 0x4e, 0x01, 0x95, 0xbd, + 0xf3, 0xbe, 0xf7, 0xde, 0x37, 0xdf, 0xfb, 0x31, 0xf0, 0x21, 0xc9, 0x26, 0x94, 0xa1, 0x8c, 0x30, + 0x1e, 0xc5, 0x21, 0xca, 0x3a, 0x88, 0xcf, 0xbd, 0x64, 0x4a, 0x39, 0xb5, 0xee, 0x4b, 0x93, 0xa7, + 0x4d, 0x5e, 0xd6, 0xb1, 0x1d, 0x9f, 0x32, 0x81, 0x1e, 0x61, 0x46, 0x50, 0xd6, 0x1e, 0x11, 0x8e, + 0xdb, 0xc8, 0xa7, 0x51, 0xac, 0x3c, 0xec, 0x57, 0xb4, 0x7d, 0xc2, 0x42, 0x94, 0xb5, 0xc5, 0x8f, + 0x36, 0xbc, 0xa6, 0x0d, 0x45, 0x1a, 0xed, 0x9b, 0xc7, 0x56, 0xa8, 0x97, 0x42, 0x1a, 0x52, 0xf9, + 0x17, 0x89, 0x7f, 0xfa, 0xf4, 0x51, 0x48, 0x69, 0x38, 0x26, 0x08, 0x27, 0x11, 0xc2, 0x71, 0x4c, + 0x39, 0xe6, 0x11, 0x8d, 0x99, 0xb6, 0xba, 0xda, 0x2a, 0xbf, 0x46, 0xe9, 0x2e, 0xe2, 0xd1, 0x84, + 0x30, 0x8e, 0x27, 0x89, 0x02, 0x34, 0x7e, 0x00, 0xd0, 0xed, 0xb3, 0xb0, 0x37, 0x25, 0x98, 0x93, + 0xde, 0x18, 0xcf, 0x46, 0xd8, 0xdf, 0xff, 0x48, 0xe5, 0xdd, 0xf6, 0x7d, 0x9a, 0xc6, 0xdc, 0x5a, + 0x87, 0xab, 0xbb, 0x69, 0x1c, 0x90, 0xe9, 0x10, 0x07, 0xc1, 0x94, 0x30, 0x56, 0x03, 0x75, 0xd0, + 0xbc, 0x3b, 0xb8, 0xa7, 0x4e, 0xb7, 0xd5, 0xa1, 0xb5, 0x01, 0x5f, 0xd0, 0x84, 0x0b, 0xdc, 0x2d, + 0x89, 0x5b, 0xd5, 0xc7, 0x39, 0xd0, 0x83, 0x55, 0x12, 0xe3, 0xd1, 0x98, 0x0c, 0x43, 0x9a, 0x0d, + 0x7d, 0x9d, 0xb4, 0x56, 0xae, 0x83, 0xe6, 0xca, 0xe0, 0x45, 0x65, 0x7a, 0x8f, 0x66, 0x39, 0x9b, + 0xad, 0xda, 0x5f, 0x5f, 0xba, 0xa5, 0x83, 0x3f, 0xbf, 0x6f, 0x2d, 0xc6, 0x6f, 0x3c, 0x86, 0x1b, + 0xd7, 0x90, 0x1f, 0x10, 0x96, 0xd0, 0x98, 0x91, 0xc6, 0xaf, 0x65, 0xf8, 0xa0, 0xcf, 0xc2, 0x9d, + 0x34, 0x0e, 0xfe, 0xe3, 0xeb, 0xf5, 0x20, 0x64, 0x1c, 0x4f, 0xf9, 0x50, 0x68, 0x2d, 0x6f, 0x55, + 0xe9, 0xd8, 0x9e, 0x2a, 0x84, 0x97, 0x17, 0xc2, 0xfb, 0x20, 0x2f, 0x44, 0x77, 0xe5, 0xe8, 0x37, + 0xb7, 0x74, 0x78, 0xe2, 0x82, 0xc1, 0x5d, 0xe9, 0x27, 0x2c, 0xd6, 0xa7, 0x00, 0xae, 0x8e, 0xa9, + 0xbf, 0x9f, 0x26, 0xc3, 0x84, 0x4c, 0x23, 0x1a, 0xb0, 0xda, 0x73, 0xf5, 0x72, 0xb3, 0xd2, 0x71, + 0x3c, 0xd5, 0x2c, 0xe7, 0x8d, 0xa7, 0x9a, 0xc5, 0x7b, 0x5f, 0xc2, 0xba, 0xdb, 0x22, 0xda, 0x37, + 0x27, 0xee, 0xb3, 0x30, 0xe2, 0x7b, 0xe9, 0xc8, 0xf3, 0xe9, 0x04, 0xe9, 0xf6, 0x52, 0x3f, 0x6f, + 0xb0, 0x60, 0x1f, 0xcd, 0x11, 0x4e, 0xf9, 0x5e, 0xd1, 0x70, 0xfc, 0x93, 0x84, 0x30, 0x1d, 0x81, + 0x0d, 0xee, 0xa9, 0xc4, 0xfa, 0xd3, 0xfa, 0x0c, 0x9c, 0xdf, 0x3c, 0xe7, 0x72, 0xfb, 0xff, 0xe2, + 0x92, 0x8b, 0xab, 0xbf, 0xb7, 0xaa, 0xa2, 0x0f, 0x16, 0xea, 0xd5, 0x70, 0xe1, 0x9a, 0xb1, 0xb4, + 0x45, 0xf1, 0xbf, 0x00, 0xb0, 0x22, 0x1a, 0x45, 0xb7, 0xc8, 0x0d, 0x4a, 0x8e, 0x55, 0xa4, 0xc5, + 0x92, 0xeb, 0xe3, 0x1c, 0xf8, 0x2a, 0x7c, 0x3e, 0x20, 0xec, 0x1c, 0x55, 0x96, 0xa8, 0x8a, 0x38, + 0xd3, 0x10, 0x33, 0xf1, 0x39, 0xac, 0x5e, 0xa0, 0x95, 0xd3, 0xb5, 0x30, 0xbc, 0x2d, 0xd6, 0x86, + 0x60, 0x25, 0x64, 0x7e, 0x98, 0xcb, 0x2c, 0x16, 0x4b, 0xa1, 0x71, 0x8f, 0x46, 0x71, 0xf7, 0x89, + 0x56, 0xb8, 0x79, 0xa5, 0xc2, 0x4a, 0x52, 0xe1, 0xc0, 0x06, 0x2a, 0x72, 0xe3, 0x5b, 0x00, 0x5f, + 0xee, 0xb3, 0xf0, 0xc3, 0x24, 0xc0, 0x9c, 0x68, 0xd5, 0x76, 0x24, 0xb9, 0x65, 0xc5, 0xd9, 0x84, + 0x56, 0x4c, 0x66, 0xc3, 0x05, 0xa8, 0xd2, 0xe7, 0x7e, 0x4c, 0x66, 0x3b, 0xd7, 0x4d, 0x4f, 0xd9, + 0x34, 0x3d, 0x66, 0x9d, 0xea, 0xd0, 0x31, 0x93, 0x2d, 0x2a, 0xdc, 0x83, 0x35, 0xa1, 0x24, 0x8d, + 0x33, 0x32, 0xe5, 0x0b, 0x03, 0x6e, 0xc8, 0x0d, 0x4c, 0xb9, 0x1b, 0x0d, 0x58, 0xff, 0xb7, 0x20, + 0x79, 0xa2, 0xce, 0x8f, 0x77, 0x60, 0xb9, 0xcf, 0x42, 0xeb, 0x27, 0x00, 0x1f, 0x5d, 0xb9, 0x35, + 0xdb, 0xde, 0xe2, 0x03, 0xe1, 0x5d, 0xb3, 0xab, 0xec, 0x67, 0x37, 0x76, 0x29, 0xee, 0xff, 0xce, + 0xc1, 0xcf, 0x7f, 0x7c, 0x7e, 0xeb, 0x2d, 0xeb, 0x29, 0x32, 0xbc, 0x58, 0xc8, 0x97, 0x21, 0x8a, + 0x55, 0x3b, 0x2c, 0xe4, 0xd0, 0x5c, 0xbf, 0x02, 0xd0, 0x32, 0x6c, 0xc6, 0x0d, 0x23, 0x9f, 0xcb, + 0x40, 0x1b, 0x2d, 0x09, 0x2c, 0xe8, 0xb6, 0x25, 0xdd, 0xd7, 0xad, 0xc7, 0x46, 0xba, 0xa2, 0xfa, + 0x97, 0x38, 0xce, 0xe0, 0x4a, 0x31, 0xbf, 0x6b, 0x66, 0xa1, 0xb4, 0xd9, 0x5e, 0xbf, 0xd2, 0x5c, + 0x90, 0x58, 0x97, 0x24, 0x5c, 0x6b, 0xcd, 0xac, 0x59, 0x9e, 0xec, 0x6b, 0x00, 0xab, 0xa6, 0x39, + 0x69, 0x1a, 0xb3, 0x18, 0x90, 0xf6, 0x93, 0x65, 0x91, 0x05, 0xb5, 0x8e, 0xa4, 0xb6, 0x69, 0xb5, + 0x8c, 0xd4, 0x52, 0xe9, 0x59, 0x28, 0xa4, 0x86, 0xc5, 0xfa, 0x0e, 0xc0, 0x07, 0xe6, 0x01, 0x68, + 0x99, 0xf5, 0x30, 0x61, 0xed, 0xce, 0xf2, 0xd8, 0x82, 0xed, 0x53, 0xc9, 0xd6, 0xb3, 0x36, 0xcd, + 0x42, 0x2a, 0xdf, 0xc5, 0x82, 0x76, 0xdf, 0x3d, 0x3a, 0x75, 0xc0, 0xf1, 0xa9, 0x03, 0x7e, 0x3f, + 0x75, 0xc0, 0xe1, 0x99, 0x53, 0x3a, 0x3e, 0x73, 0x4a, 0xbf, 0x9c, 0x39, 0xa5, 0x8f, 0x5b, 0x17, + 0xb6, 0x99, 0x8a, 0xa8, 0xe3, 0xb6, 0xdf, 0x46, 0xf3, 0x7f, 0x3e, 0x14, 0xa3, 0x3b, 0xf2, 0x45, + 0x7d, 0xf3, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0xa6, 0x7f, 0x99, 0x81, 0xaa, 0x09, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/vesting/types/vesting.pb.go b/x/vesting/types/vesting.pb.go index a847f4c5dd..7a4ef8b5ef 100644 --- a/x/vesting/types/vesting.pb.go +++ b/x/vesting/types/vesting.pb.go @@ -166,37 +166,37 @@ func init() { proto.RegisterFile("evmos/vesting/v2/vesting.proto", fileDescripto var fileDescriptor_0001d894a8ee0c72 = []byte{ // 488 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x53, 0x3f, 0x6b, 0xdb, 0x40, - 0x14, 0xd7, 0xd5, 0x4a, 0x1b, 0x9f, 0x89, 0x1b, 0xae, 0xa6, 0x08, 0x0f, 0x92, 0x09, 0x2d, 0x98, - 0x40, 0x75, 0xd8, 0x85, 0x42, 0xb3, 0x59, 0xe9, 0x07, 0x08, 0xa2, 0x74, 0xe8, 0x22, 0x4e, 0xd2, - 0x45, 0x11, 0x96, 0x7d, 0x42, 0x77, 0x72, 0xd3, 0x6f, 0x10, 0x32, 0x65, 0x2c, 0x74, 0xf1, 0xdc, - 0x4f, 0x92, 0xd1, 0x63, 0xa7, 0xa4, 0xd8, 0x4b, 0x3f, 0x46, 0xd1, 0xfd, 0x49, 0x6d, 0x4a, 0xd7, - 0x4c, 0xf7, 0xde, 0xef, 0xfd, 0xb9, 0xdf, 0x7b, 0xbf, 0x3b, 0xe8, 0xd2, 0xc5, 0x8c, 0x71, 0xbc, - 0xa0, 0x5c, 0xe4, 0xf3, 0x0c, 0x2f, 0xc6, 0xc6, 0xf4, 0xcb, 0x8a, 0x09, 0x86, 0x0e, 0x65, 0xdc, - 0x37, 0xe0, 0x62, 0xdc, 0x7f, 0x95, 0x30, 0xbe, 0x53, 0x32, 0x8a, 0xa9, 0x20, 0xa3, 0xdd, 0xba, - 0x7e, 0x2f, 0x63, 0x19, 0x93, 0x26, 0x6e, 0x2c, 0x8d, 0x7a, 0x19, 0x63, 0x59, 0x41, 0xb1, 0xf4, - 0xe2, 0xfa, 0x1c, 0x8b, 0x7c, 0x46, 0xb9, 0x20, 0xb3, 0x52, 0x25, 0x1c, 0x5d, 0xdb, 0xf0, 0xe5, - 0x69, 0x41, 0xbe, 0xc4, 0x24, 0x99, 0x7e, 0x52, 0x0d, 0x27, 0x49, 0xc2, 0xea, 0xb9, 0x40, 0x31, - 0xec, 0xc5, 0x84, 0xd3, 0x48, 0xdf, 0x13, 0x11, 0x85, 0x3b, 0x60, 0x00, 0x86, 0x9d, 0xf1, 0xb1, - 0xaf, 0x68, 0xfd, 0x65, 0xaa, 0x68, 0xf9, 0x01, 0xe1, 0x74, 0xb7, 0x53, 0x60, 0xaf, 0xee, 0x3c, - 0x10, 0xa2, 0xf8, 0x9f, 0x08, 0x7a, 0x0d, 0xbb, 0xe7, 0xf5, 0x3c, 0xa5, 0x55, 0x44, 0xd2, 0xb4, - 0xa2, 0x9c, 0x3b, 0x4f, 0x06, 0x60, 0xd8, 0x0e, 0x0f, 0x14, 0x3a, 0x51, 0x20, 0x3a, 0x85, 0x90, - 0x0b, 0x52, 0x89, 0xa8, 0xa1, 0xef, 0xb4, 0x24, 0x81, 0xbe, 0xaf, 0x66, 0xf3, 0xcd, 0x6c, 0xfe, - 0x47, 0x33, 0x5b, 0xb0, 0x7f, 0x7b, 0xe7, 0x59, 0x37, 0xf7, 0x1e, 0x08, 0xdb, 0xb2, 0xae, 0x89, - 0xa0, 0x2b, 0x00, 0xbb, 0x05, 0x4b, 0xa6, 0x75, 0x19, 0x95, 0xb4, 0xca, 0x59, 0xca, 0x1d, 0x7b, - 0xd0, 0x1a, 0x76, 0xc6, 0xee, 0xff, 0x46, 0x39, 0x93, 0x69, 0xc1, 0xa4, 0xe9, 0xf6, 0xe3, 0xde, - 0x7b, 0x9f, 0xe5, 0xe2, 0xa2, 0x8e, 0xfd, 0x84, 0xcd, 0xb0, 0xd6, 0x44, 0x1d, 0x6f, 0x78, 0x3a, - 0xc5, 0x97, 0x98, 0xd4, 0xe2, 0xe2, 0x41, 0x25, 0xf1, 0xb5, 0xa4, 0x5c, 0x77, 0xe0, 0xe1, 0x81, - 0xba, 0x58, 0xbb, 0xe8, 0x1a, 0xc0, 0xe7, 0x66, 0xad, 0x86, 0xcb, 0xde, 0x63, 0x71, 0xe9, 0x6a, - 0x58, 0xfb, 0x27, 0xfb, 0x57, 0x4b, 0xcf, 0xfa, 0xb6, 0xf4, 0xac, 0xa3, 0xef, 0x00, 0x1e, 0x9a, - 0xc7, 0x70, 0x56, 0xb1, 0x92, 0x71, 0x52, 0xa0, 0x1e, 0xdc, 0x13, 0xb9, 0x28, 0xa8, 0xd4, 0xbd, - 0x1d, 0x2a, 0x07, 0x0d, 0x60, 0x27, 0xa5, 0x3c, 0xa9, 0xf2, 0x52, 0xe4, 0x6c, 0xae, 0x55, 0xdb, - 0x86, 0x90, 0x03, 0x9f, 0x19, 0x4d, 0x5b, 0x32, 0x6a, 0x5c, 0x84, 0xe1, 0x8b, 0x54, 0x52, 0x20, - 0x4d, 0xe2, 0x83, 0xf2, 0xb6, 0xcc, 0x42, 0x5b, 0x21, 0x2d, 0xff, 0x89, 0xfd, 0x7b, 0xe9, 0x59, - 0xc1, 0x87, 0xdb, 0xb5, 0x0b, 0x56, 0x6b, 0x17, 0xfc, 0x5a, 0xbb, 0xe0, 0x66, 0xe3, 0x5a, 0xab, - 0x8d, 0x6b, 0xfd, 0xdc, 0xb8, 0xd6, 0xe7, 0xe3, 0xad, 0x65, 0xa8, 0xef, 0xa5, 0x3f, 0xd9, 0xe8, - 0x1d, 0xbe, 0xdc, 0xdd, 0x42, 0xfc, 0x54, 0x3e, 0x97, 0xb7, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, - 0xfa, 0x8a, 0x2b, 0xdc, 0x88, 0x03, 0x00, 0x00, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x53, 0x3f, 0x6f, 0xd3, 0x40, + 0x14, 0xf7, 0x11, 0x17, 0x9a, 0x8b, 0x1a, 0xaa, 0x23, 0x42, 0x56, 0x06, 0x3b, 0xaa, 0x40, 0x8a, + 0x2a, 0xe1, 0x53, 0xc2, 0x80, 0xe8, 0x16, 0x97, 0x0f, 0x50, 0x59, 0x88, 0x81, 0xc5, 0x3a, 0xdb, + 0x57, 0xd7, 0x8a, 0x93, 0xb3, 0x7c, 0xe7, 0x50, 0xbe, 0x41, 0xd5, 0xa9, 0x23, 0x12, 0x4b, 0x66, + 0x3e, 0x49, 0xc7, 0x8c, 0x4c, 0x2d, 0x4a, 0x16, 0x3e, 0x06, 0xf2, 0xfd, 0x29, 0x89, 0x10, 0x6b, + 0xa7, 0x7b, 0xef, 0xf7, 0xfe, 0xdc, 0xef, 0xbd, 0xdf, 0x1d, 0x74, 0xe9, 0x62, 0xc6, 0x38, 0x5e, + 0x50, 0x2e, 0xf2, 0x79, 0x86, 0x17, 0x63, 0x63, 0xfa, 0x65, 0xc5, 0x04, 0x43, 0x87, 0x32, 0xee, + 0x1b, 0x70, 0x31, 0xee, 0xbf, 0x4a, 0x18, 0xdf, 0x29, 0x19, 0xc5, 0x54, 0x90, 0xd1, 0x6e, 0x5d, + 0xbf, 0x97, 0xb1, 0x8c, 0x49, 0x13, 0x37, 0x96, 0x46, 0xbd, 0x8c, 0xb1, 0xac, 0xa0, 0x58, 0x7a, + 0x71, 0x7d, 0x8e, 0x45, 0x3e, 0xa3, 0x5c, 0x90, 0x59, 0xa9, 0x12, 0x8e, 0xae, 0x6d, 0xf8, 0xf2, + 0xb4, 0x20, 0x5f, 0x62, 0x92, 0x4c, 0x3f, 0xa9, 0x86, 0x93, 0x24, 0x61, 0xf5, 0x5c, 0xa0, 0x18, + 0xf6, 0x62, 0xc2, 0x69, 0xa4, 0xef, 0x89, 0x88, 0xc2, 0x1d, 0x30, 0x00, 0xc3, 0xce, 0xf8, 0xd8, + 0x57, 0xb4, 0xfe, 0x32, 0x55, 0xb4, 0xfc, 0x80, 0x70, 0xba, 0xdb, 0x29, 0xb0, 0x57, 0x77, 0x1e, + 0x08, 0x51, 0xfc, 0x4f, 0x04, 0xbd, 0x86, 0xdd, 0xf3, 0x7a, 0x9e, 0xd2, 0x2a, 0x22, 0x69, 0x5a, + 0x51, 0xce, 0x9d, 0x27, 0x03, 0x30, 0x6c, 0x87, 0x07, 0x0a, 0x9d, 0x28, 0x10, 0x9d, 0x42, 0xc8, + 0x05, 0xa9, 0x44, 0xd4, 0xd0, 0x77, 0x5a, 0x92, 0x40, 0xdf, 0x57, 0xb3, 0xf9, 0x66, 0x36, 0xff, + 0xa3, 0x99, 0x2d, 0xd8, 0xbf, 0xbd, 0xf3, 0xac, 0x9b, 0x7b, 0x0f, 0x84, 0x6d, 0x59, 0xd7, 0x44, + 0xd0, 0x15, 0x80, 0xdd, 0x82, 0x25, 0xd3, 0xba, 0x8c, 0x4a, 0x5a, 0xe5, 0x2c, 0xe5, 0x8e, 0x3d, + 0x68, 0x0d, 0x3b, 0x63, 0xf7, 0x7f, 0xa3, 0x9c, 0xc9, 0xb4, 0x60, 0xd2, 0x74, 0xfb, 0x71, 0xef, + 0xbd, 0xcf, 0x72, 0x71, 0x51, 0xc7, 0x7e, 0xc2, 0x66, 0x58, 0x6b, 0xa2, 0x8e, 0x37, 0x3c, 0x9d, + 0xe2, 0x4b, 0x4c, 0x6a, 0x71, 0xf1, 0xa0, 0x92, 0xf8, 0x5a, 0x52, 0xae, 0x3b, 0xf0, 0xf0, 0x40, + 0x5d, 0xac, 0x5d, 0x74, 0x0d, 0xe0, 0x73, 0xb3, 0x56, 0xc3, 0x65, 0xef, 0xb1, 0xb8, 0x74, 0x35, + 0xac, 0xfd, 0x93, 0xfd, 0xab, 0xa5, 0x67, 0x7d, 0x5b, 0x7a, 0xd6, 0xd1, 0x77, 0x00, 0x0f, 0xcd, + 0x63, 0x38, 0xab, 0x58, 0xc9, 0x38, 0x29, 0x50, 0x0f, 0xee, 0x89, 0x5c, 0x14, 0x54, 0xea, 0xde, + 0x0e, 0x95, 0x83, 0x06, 0xb0, 0x93, 0x52, 0x9e, 0x54, 0x79, 0x29, 0x72, 0x36, 0xd7, 0xaa, 0x6d, + 0x43, 0xc8, 0x81, 0xcf, 0x8c, 0xa6, 0x2d, 0x19, 0x35, 0x2e, 0xc2, 0xf0, 0x45, 0x2a, 0x29, 0x90, + 0x26, 0xf1, 0x41, 0x79, 0x5b, 0x66, 0xa1, 0xad, 0x90, 0x96, 0xff, 0xc4, 0xfe, 0xbd, 0xf4, 0xac, + 0xe0, 0xc3, 0xed, 0xda, 0x05, 0xab, 0xb5, 0x0b, 0x7e, 0xad, 0x5d, 0x70, 0xb3, 0x71, 0xad, 0xd5, + 0xc6, 0xb5, 0x7e, 0x6e, 0x5c, 0xeb, 0xf3, 0xf1, 0xd6, 0x32, 0xd4, 0xf7, 0xd2, 0x9f, 0x6c, 0xf4, + 0x0e, 0x5f, 0xee, 0x6e, 0x21, 0x7e, 0x2a, 0x9f, 0xcb, 0xdb, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, + 0xf4, 0x1a, 0xa0, 0x79, 0x88, 0x03, 0x00, 0x00, } func (m *ClawbackVestingAccount) Marshal() (dAtA []byte, err error) { diff --git a/x/vesting/utils_test.go b/x/vesting/utils_test.go index 67d67b5272..c998f13757 100644 --- a/x/vesting/utils_test.go +++ b/x/vesting/utils_test.go @@ -16,13 +16,13 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/common" - evmosapp "github.com/evmos/evmos/v16/app" - cmn "github.com/evmos/evmos/v16/precompiles/common" - evmosutil "github.com/evmos/evmos/v16/testutil" - testutiltx "github.com/evmos/evmos/v16/testutil/tx" - evmostypes "github.com/evmos/evmos/v16/types" - "github.com/evmos/evmos/v16/utils" - evmtypes "github.com/evmos/evmos/v16/x/evm/types" + evmosapp "github.com/evmos/evmos/v17/app" + cmn "github.com/evmos/evmos/v17/precompiles/common" + evmosutil "github.com/evmos/evmos/v17/testutil" + testutiltx "github.com/evmos/evmos/v17/testutil/tx" + evmostypes "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v17/utils" + evmtypes "github.com/evmos/evmos/v17/x/evm/types" ) // SetupWithGenesisValSet initializes a new EvmosApp with a validator set and genesis accounts From 93e226d97fe6a82487d6cee332352bcb8360d69f Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Mon, 22 Apr 2024 23:29:55 +0200 Subject: [PATCH 212/345] imp(app): remove unnecessary init function in test helpers file (#2498) remove unnecessary init function in test helpers Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- app/test_helpers.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/app/test_helpers.go b/app/test_helpers.go index 6752f4554f..aaca51e6eb 100644 --- a/app/test_helpers.go +++ b/app/test_helpers.go @@ -34,12 +34,6 @@ import ( "github.com/evmos/evmos/v17/utils" ) -func init() { - cfg := sdk.GetConfig() - config.SetBech32Prefixes(cfg) - config.SetBip44CoinType(cfg) -} - // DefaultTestingAppInit defines the IBC application used for testing var DefaultTestingAppInit func(chainID string) func() (ibctesting.TestingApp, map[string]json.RawMessage) = SetupTestingApp From 853ea3803cfebbadad8d1cf93e74eac7c1d3d082 Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Tue, 23 Apr 2024 10:00:12 -0300 Subject: [PATCH 213/345] chore(upgrade): backport v18 changes to main (#2500) * chore: update repo to v18 * chore: add upgrade handler (#2488) * Merge pull request from GHSA-pxv8-qhrh-jc7v * fix tests and add store migrations * add test case * backport changes * get tx receipt to check failed tx in nix test * make format * update chlog * address lint issues * update chlog * fix lint warnings --- .github/workflows/consensuswarn.yml | 2 +- CHANGELOG.md | 18 +- app/ante/cosmos.go | 7 +- app/ante/cosmos/authz_test.go | 8 +- app/ante/cosmos/eip712.go | 8 +- app/ante/cosmos/fees.go | 2 +- app/ante/cosmos/fees_benchmark_test.go | 4 +- app/ante/cosmos/fees_test.go | 8 +- app/ante/cosmos/min_price.go | 2 +- app/ante/cosmos/min_price_test.go | 8 +- app/ante/cosmos/reject_msgs.go | 2 +- app/ante/cosmos/setup_test.go | 24 +- app/ante/cosmos/utils_test.go | 12 +- app/ante/cosmos/vesting.go | 125 --- app/ante/evm.go | 2 +- app/ante/evm/01_setup_ctx.go | 2 +- app/ante/evm/02_mempool_fee_test.go | 2 +- app/ante/evm/03_global_fee_test.go | 2 +- app/ante/evm/04_validate.go | 2 +- app/ante/evm/04_validate_test.go | 6 +- app/ante/evm/05_signature_verification.go | 2 +- app/ante/evm/06_account_verification.go | 6 +- app/ante/evm/06_account_verification_test.go | 14 +- app/ante/evm/07_can_transfer.go | 4 +- app/ante/evm/07_can_transfer_test.go | 12 +- app/ante/evm/08_vesting.go | 4 +- app/ante/evm/08_vesting_test.go | 10 +- app/ante/evm/09_gas_consume.go | 6 +- app/ante/evm/09_gas_consume_test.go | 8 +- app/ante/evm/10_incremenet_sequence_test.go | 8 +- app/ante/evm/10_increment_sequence.go | 2 +- app/ante/evm/11_gas_wanted.go | 2 +- app/ante/evm/11_gas_wanted_test.go | 10 +- app/ante/evm/12_emit_event.go | 2 +- app/ante/evm/ante_test.go | 4 +- app/ante/evm/eth_benchmark_test.go | 10 +- app/ante/evm/fee_checker.go | 6 +- app/ante/evm/fee_checker_test.go | 6 +- app/ante/evm/fee_market_test.go | 12 +- app/ante/evm/interfaces.go | 6 +- app/ante/evm/mono.go | 6 +- app/ante/evm/setup_ctx_test.go | 8 +- app/ante/evm/setup_test.go | 14 +- app/ante/evm/signverify_test.go | 8 +- app/ante/evm/sigs_test.go | 6 +- app/ante/evm/utils_test.go | 10 +- app/ante/evm_benchmark_test.go | 22 +- app/ante/handler_options.go | 6 +- app/ante/handler_options_test.go | 10 +- app/ante/integration_test.go | 8 +- app/ante/setup_test.go | 12 +- app/ante/sigverify.go | 2 +- app/ante/sigverify_test.go | 8 +- app/ante/utils/claim_rewards_test.go | 8 +- app/ante/utils/setup_test.go | 16 +- app/ante/utils_test.go | 4 +- app/app.go | 88 +- app/app_test.go | 4 +- app/ethtest_helper.go | 4 +- app/export.go | 4 +- app/keys.go | 12 +- app/post/burn.go | 2 +- app/post/burn_test.go | 4 +- app/post/post_test.go | 2 +- app/post/setup_test.go | 10 +- app/test_helpers.go | 8 +- app/upgrades/v16/incentives.go | 2 +- app/upgrades/v16/proposals.go | 2 +- app/upgrades/v16/setup_test.go | 10 +- app/upgrades/v16/upgrades.go | 14 +- app/upgrades/v16/upgrades_test.go | 14 +- app/upgrades/v18/constants.go | 11 + app/upgrades/v18/upgrades.go | 21 + client/config.go | 2 +- client/debug/debug.go | 4 +- client/export.go | 4 +- client/import.go | 4 +- client/keys.go | 4 +- client/keys/add.go | 2 +- client/testnet.go | 12 +- cmd/config/config.go | 2 +- cmd/evmosd/cmd_test.go | 6 +- cmd/evmosd/genaccounts.go | 10 +- cmd/evmosd/main.go | 4 +- cmd/evmosd/migrate.go | 2 +- cmd/evmosd/root.go | 24 +- cmd/evmosd/testnet.go | 18 +- cmd/evmosd/versiondb.go | 4 +- contracts/erc20.go | 4 +- contracts/erc20DirectBalanceManipulation.go | 4 +- contracts/erc20burnable.go | 2 +- contracts/erc20maliciousdelayed.go | 4 +- contracts/flash_loan.go | 2 +- crypto/codec/amino.go | 2 +- crypto/codec/codec.go | 2 +- crypto/ethsecp256k1/ethsecp256k1.go | 2 +- crypto/ethsecp256k1/keys.pb.go | 6 +- crypto/hd/algorithm.go | 2 +- crypto/hd/algorithm_test.go | 6 +- crypto/hd/benchmark_test.go | 2 +- crypto/keyring/options.go | 6 +- encoding/codec/codec.go | 4 +- encoding/config.go | 2 +- encoding/config_test.go | 8 +- ethereum/eip712/eip712_fuzzer_test.go | 2 +- ethereum/eip712/eip712_test.go | 12 +- ethereum/eip712/encoding.go | 2 +- ethereum/eip712/encoding_legacy.go | 2 +- ethereum/eip712/preprocess.go | 2 +- ethereum/eip712/preprocess_test.go | 14 +- go.mod | 2 +- ibc/testing/app.go | 6 +- ibc/testing/chain.go | 8 +- ibc/testing/coordinator.go | 2 +- ibc/utils.go | 4 +- ibc/utils_test.go | 2 +- indexer/kv_indexer.go | 6 +- indexer/kv_indexer_test.go | 14 +- precompiles/authorization/events.go | 2 +- precompiles/authorization/types.go | 2 +- precompiles/authorization/types_test.go | 8 +- precompiles/bank/bank.go | 4 +- precompiles/bank/integration_test.go | 22 +- precompiles/bank/query_test.go | 4 +- precompiles/bank/setup_test.go | 12 +- precompiles/bank/testdata/bank.go | 2 +- precompiles/bank/types.go | 2 +- precompiles/bank/utils_test.go | 8 +- precompiles/bech32/bech32.go | 2 +- precompiles/bech32/bech32_test.go | 4 +- precompiles/bech32/methods.go | 2 +- precompiles/bech32/methods_test.go | 6 +- precompiles/bech32/setup_test.go | 6 +- precompiles/common/precompile.go | 2 +- precompiles/common/types.go | 2 +- precompiles/common/types_test.go | 4 +- precompiles/distribution/distribution.go | 5 +- precompiles/distribution/distribution_test.go | 8 +- precompiles/distribution/events.go | 2 +- precompiles/distribution/events_test.go | 6 +- precompiles/distribution/integration_test.go | 18 +- precompiles/distribution/query.go | 2 +- precompiles/distribution/query_test.go | 8 +- precompiles/distribution/setup_test.go | 8 +- precompiles/distribution/tx.go | 4 +- precompiles/distribution/tx_test.go | 10 +- precompiles/distribution/types.go | 2 +- precompiles/distribution/utils_test.go | 22 +- precompiles/erc20/approve.go | 4 +- precompiles/erc20/approve_test.go | 8 +- precompiles/erc20/erc20.go | 8 +- precompiles/erc20/erc20_test.go | 4 +- precompiles/erc20/errors.go | 6 +- precompiles/erc20/errors_test.go | 4 +- precompiles/erc20/events.go | 4 +- precompiles/erc20/events_test.go | 8 +- precompiles/erc20/integration_test.go | 26 +- precompiles/erc20/query.go | 4 +- precompiles/erc20/query_test.go | 10 +- precompiles/erc20/setup_test.go | 10 +- .../erc20/testdata/erc20_allowance_caller.go | 2 +- .../erc20/testdata/erc20_no_metadata.go | 4 +- .../testdata/erc20minter_openzeppelinv5.go | 4 +- precompiles/erc20/tx_test.go | 8 +- precompiles/erc20/types_test.go | 4 +- precompiles/erc20/utils_test.go | 20 +- precompiles/ics20/approve.go | 2 +- precompiles/ics20/approve_common.go | 4 +- precompiles/ics20/approve_test.go | 8 +- precompiles/ics20/events.go | 2 +- precompiles/ics20/events_test.go | 8 +- precompiles/ics20/ics20.go | 6 +- precompiles/ics20/integration_test.go | 26 +- precompiles/ics20/query.go | 4 +- precompiles/ics20/query_test.go | 8 +- precompiles/ics20/setup_test.go | 10 +- precompiles/ics20/tx_test.go | 10 +- precompiles/ics20/types.go | 4 +- precompiles/ics20/utils_test.go | 34 +- precompiles/outposts/osmosis/events.go | 2 +- precompiles/outposts/osmosis/events_test.go | 8 +- precompiles/outposts/osmosis/osmosis.go | 8 +- precompiles/outposts/osmosis/setup_test.go | 10 +- precompiles/outposts/osmosis/tx.go | 2 +- precompiles/outposts/osmosis/tx_test.go | 20 +- precompiles/outposts/osmosis/types.go | 4 +- precompiles/outposts/osmosis/types_test.go | 6 +- precompiles/outposts/stride/events.go | 2 +- precompiles/outposts/stride/events_test.go | 6 +- precompiles/outposts/stride/setup_test.go | 10 +- precompiles/outposts/stride/stride.go | 9 +- precompiles/outposts/stride/tx.go | 4 +- precompiles/outposts/stride/tx_test.go | 8 +- precompiles/outposts/stride/types.go | 4 +- precompiles/outposts/stride/types_test.go | 2 +- precompiles/outposts/stride/utils_test.go | 8 +- precompiles/p256/integration_test.go | 14 +- precompiles/p256/p256.go | 2 +- precompiles/p256/p256_test.go | 2 +- precompiles/p256/setup_test.go | 2 +- precompiles/staking/approve.go | 4 +- precompiles/staking/approve_test.go | 12 +- precompiles/staking/events.go | 4 +- precompiles/staking/events_test.go | 6 +- precompiles/staking/integration_test.go | 420 ++++++++- precompiles/staking/query.go | 14 +- precompiles/staking/query_test.go | 8 +- precompiles/staking/setup_test.go | 8 +- precompiles/staking/staking.go | 6 +- precompiles/staking/staking_test.go | 10 +- .../staking/testdata/staking_caller.go | 2 +- precompiles/staking/tx.go | 6 +- precompiles/staking/tx_test.go | 8 +- precompiles/staking/types.go | 2 +- precompiles/staking/utils_test.go | 87 +- precompiles/testutil/contracts/contracts.go | 10 +- .../testutil/contracts/distribution_caller.go | 2 +- .../testutil/contracts/interchain_sender.go | 2 +- precompiles/testutil/contracts/types.go | 2 +- precompiles/testutil/errors.go | 2 +- precompiles/testutil/events.go | 2 +- precompiles/testutil/logs.go | 2 +- precompiles/vesting/approve.go | 4 +- precompiles/vesting/events.go | 6 +- precompiles/vesting/integration_test.go | 16 +- precompiles/vesting/query_test.go | 4 +- precompiles/vesting/setup_test.go | 8 +- .../vesting/testdata/vesting_caller.go | 2 +- precompiles/vesting/tx.go | 2 +- precompiles/vesting/tx_test.go | 16 +- precompiles/vesting/types.go | 6 +- precompiles/vesting/utils_test.go | 26 +- precompiles/vesting/vesting.go | 6 +- precompiles/werc20/integration_test.go | 20 +- precompiles/werc20/setup_test.go | 10 +- precompiles/werc20/testdata/wevmos.go | 2 +- precompiles/werc20/utils_test.go | 12 +- precompiles/werc20/werc20.go | 8 +- .../crypto/v1/ethsecp256k1/keys.proto | 2 +- proto/ethermint/evm/v1/events.proto | 2 +- proto/ethermint/evm/v1/evm.proto | 2 +- proto/ethermint/evm/v1/genesis.proto | 2 +- proto/ethermint/evm/v1/query.proto | 2 +- proto/ethermint/evm/v1/tx.proto | 2 +- proto/ethermint/feemarket/v1/events.proto | 2 +- proto/ethermint/feemarket/v1/feemarket.proto | 2 +- proto/ethermint/feemarket/v1/genesis.proto | 2 +- proto/ethermint/feemarket/v1/query.proto | 2 +- proto/ethermint/feemarket/v1/tx.proto | 2 +- proto/ethermint/types/v1/account.proto | 2 +- proto/ethermint/types/v1/dynamic_fee.proto | 2 +- proto/ethermint/types/v1/indexer.proto | 2 +- proto/ethermint/types/v1/web3.proto | 2 +- proto/evmos/epochs/v1/genesis.proto | 2 +- proto/evmos/epochs/v1/query.proto | 2 +- proto/evmos/erc20/v1/erc20.proto | 2 +- proto/evmos/erc20/v1/events.proto | 2 +- proto/evmos/erc20/v1/genesis.proto | 2 +- proto/evmos/erc20/v1/query.proto | 2 +- proto/evmos/erc20/v1/tx.proto | 2 +- proto/evmos/incentives/v1/genesis.proto | 2 +- proto/evmos/incentives/v1/incentives.proto | 2 +- proto/evmos/inflation/v1/genesis.proto | 2 +- proto/evmos/inflation/v1/inflation.proto | 2 +- proto/evmos/inflation/v1/query.proto | 2 +- proto/evmos/inflation/v1/tx.proto | 2 +- proto/evmos/vesting/v1/vesting.proto | 2 +- proto/evmos/vesting/v2/events.proto | 2 +- proto/evmos/vesting/v2/query.proto | 2 +- proto/evmos/vesting/v2/tx.proto | 2 +- proto/evmos/vesting/v2/vesting.proto | 2 +- rpc/apis.go | 20 +- rpc/backend/account_info.go | 4 +- rpc/backend/account_info_test.go | 8 +- rpc/backend/backend.go | 8 +- rpc/backend/backend_suite_test.go | 18 +- rpc/backend/blocks.go | 4 +- rpc/backend/blocks_test.go | 8 +- rpc/backend/call_tx.go | 6 +- rpc/backend/call_tx_test.go | 8 +- rpc/backend/chain_info.go | 8 +- rpc/backend/chain_info_test.go | 10 +- rpc/backend/client_test.go | 6 +- rpc/backend/evm_query_client_test.go | 8 +- rpc/backend/feemarket_query_client_test.go | 6 +- rpc/backend/filters_test.go | 6 +- rpc/backend/mocks/evm_query_client.go | 2 +- rpc/backend/mocks/feemarket_query_client.go | 2 +- rpc/backend/node_info.go | 10 +- rpc/backend/node_info_test.go | 6 +- rpc/backend/sign_tx.go | 2 +- rpc/backend/sign_tx_test.go | 8 +- rpc/backend/tracing.go | 4 +- rpc/backend/tracing_test.go | 8 +- rpc/backend/tx_info.go | 6 +- rpc/backend/tx_info_test.go | 10 +- rpc/backend/utils.go | 4 +- rpc/namespaces/ethereum/debug/api.go | 6 +- rpc/namespaces/ethereum/eth/api.go | 8 +- rpc/namespaces/ethereum/eth/filters/api.go | 4 +- .../ethereum/eth/filters/filter_system.go | 4 +- .../eth/filters/filter_system_test.go | 2 +- .../ethereum/eth/filters/filters.go | 4 +- rpc/namespaces/ethereum/miner/api.go | 2 +- rpc/namespaces/ethereum/net/api.go | 2 +- rpc/namespaces/ethereum/personal/api.go | 8 +- rpc/namespaces/ethereum/txpool/api.go | 2 +- rpc/namespaces/ethereum/web3/api.go | 2 +- rpc/types/block.go | 2 +- rpc/types/events.go | 4 +- rpc/types/events_test.go | 2 +- rpc/types/query_client.go | 4 +- rpc/types/utils.go | 4 +- rpc/websockets.go | 10 +- server/config/config_test.go | 2 +- server/indexer_cmd.go | 2 +- server/indexer_service.go | 2 +- server/json_rpc.go | 6 +- server/start.go | 12 +- server/util.go | 2 +- tests/e2e/e2e_suite_test.go | 8 +- tests/e2e/tx_test.go | 4 +- tests/e2e/upgrade/balances_test.go | 6 +- tests/e2e/upgrade/manager.go | 4 +- tests/integration/ledger/evmosd_suite_test.go | 16 +- tests/integration/ledger/ledger_test.go | 12 +- tests/nix_tests/test_patches.py | 8 +- testutil/abci.go | 6 +- testutil/ante.go | 4 +- testutil/contract.go | 6 +- testutil/fund.go | 4 +- testutil/integration.go | 4 +- .../integration/common/factory/factory.go | 4 +- testutil/integration/common/grpc/account.go | 4 +- testutil/integration/common/grpc/authz.go | 4 +- testutil/integration/common/grpc/grpc.go | 2 +- .../integration/evmos/factory/broadcast.go | 4 +- testutil/integration/evmos/factory/build.go | 4 +- testutil/integration/evmos/factory/factory.go | 14 +- testutil/integration/evmos/factory/helpers.go | 6 +- testutil/integration/evmos/factory/sign.go | 4 +- testutil/integration/evmos/factory/types.go | 2 +- testutil/integration/evmos/grpc/evm.go | 2 +- testutil/integration/evmos/grpc/feemarket.go | 2 +- testutil/integration/evmos/grpc/grpc.go | 8 +- testutil/integration/evmos/keyring/keyring.go | 2 +- testutil/integration/evmos/network/clients.go | 14 +- testutil/integration/evmos/network/config.go | 6 +- .../integration/evmos/network/config_test.go | 8 +- testutil/integration/evmos/network/network.go | 20 +- testutil/integration/evmos/network/params.go | 6 +- testutil/integration/evmos/network/setup.go | 21 +- .../integration/evmos/network/unit_network.go | 6 +- testutil/integration/evmos/utils/bank.go | 2 +- testutil/integration/evmos/utils/bank_test.go | 8 +- testutil/integration/evmos/utils/contracts.go | 6 +- testutil/integration/evmos/utils/erc20.go | 6 +- testutil/integration/evmos/utils/gov.go | 6 +- testutil/integration/evmos/utils/unit.go | 8 +- .../ibc/coordinator/coordinator.go | 14 +- testutil/integration/ibc/coordinator/utils.go | 2 +- testutil/network/network.go | 12 +- testutil/network/network_test.go | 6 +- testutil/network/util.go | 6 +- testutil/staking-rewards.go | 10 +- testutil/statedb.go | 4 +- testutil/tx/cosmos.go | 4 +- testutil/tx/eip712.go | 8 +- testutil/tx/eth.go | 8 +- testutil/tx/signer.go | 2 +- testutil/vesting.go | 88 ++ types/account.pb.go | 4 +- types/account_test.go | 8 +- types/dynamic_fee.pb.go | 4 +- types/indexer.pb.go | 34 +- types/validation_test.go | 4 +- types/web3.pb.go | 4 +- utils/utils.go | 2 +- utils/utils_test.go | 2 +- wallets/ledger/ledger.go | 6 +- wallets/ledger/ledger_suite_test.go | 6 +- wallets/ledger/ledger_test.go | 10 +- wallets/ledger/mocks/wallet.go | 2 +- wallets/ledger/wallet_test.go | 6 +- wallets/usbwallet/hub.go | 2 +- wallets/usbwallet/wallet.go | 2 +- x/epochs/client/cli/query.go | 2 +- x/epochs/genesis.go | 4 +- x/epochs/genesis_test.go | 10 +- x/epochs/keeper/abci.go | 2 +- x/epochs/keeper/abci_test.go | 4 +- x/epochs/keeper/epoch_infos.go | 2 +- x/epochs/keeper/epoch_infos_test.go | 2 +- x/epochs/keeper/grpc_query.go | 2 +- x/epochs/keeper/grpc_query_test.go | 2 +- x/epochs/keeper/hooks.go | 2 +- x/epochs/keeper/keeper.go | 2 +- x/epochs/keeper/setup_test.go | 6 +- x/epochs/keeper/utils_test.go | 10 +- x/epochs/module.go | 6 +- x/epochs/types/genesis.pb.go | 42 +- x/epochs/types/query.pb.go | 52 +- x/erc20/client/cli/query.go | 2 +- x/erc20/client/cli/tx.go | 4 +- x/erc20/client/proposal_handler.go | 2 +- x/erc20/genesis.go | 4 +- x/erc20/genesis_test.go | 12 +- x/erc20/ibc_middleware.go | 4 +- x/erc20/keeper/erc20_utils_test.go | 6 +- x/erc20/keeper/evm.go | 8 +- x/erc20/keeper/evm_test.go | 12 +- x/erc20/keeper/grpc_query.go | 4 +- x/erc20/keeper/grpc_query_test.go | 4 +- x/erc20/keeper/ibc_callbacks.go | 4 +- .../keeper/ibc_callbacks_integration_test.go | 12 +- x/erc20/keeper/ibc_callbacks_test.go | 18 +- x/erc20/keeper/integration_test.go | 10 +- x/erc20/keeper/keeper.go | 4 +- x/erc20/keeper/migrations.go | 4 +- x/erc20/keeper/migrations_test.go | 10 +- x/erc20/keeper/mint.go | 2 +- x/erc20/keeper/mint_test.go | 4 +- x/erc20/keeper/msg_server.go | 4 +- x/erc20/keeper/msg_server_test.go | 10 +- x/erc20/keeper/params.go | 2 +- x/erc20/keeper/params_test.go | 2 +- x/erc20/keeper/precompiles.go | 6 +- x/erc20/keeper/precompiles_test.go | 10 +- x/erc20/keeper/proposals.go | 2 +- x/erc20/keeper/proposals_test.go | 10 +- x/erc20/keeper/setup_test.go | 8 +- x/erc20/keeper/token_pairs.go | 4 +- x/erc20/keeper/token_pairs_test.go | 6 +- x/erc20/keeper/utils_test.go | 30 +- x/erc20/migrations/v3/migration.go | 4 +- x/erc20/migrations/v3/migration_test.go | 10 +- x/erc20/migrations/v3/types/genesis.pb.go | 2 +- x/erc20/migrations/v3/types/params.go | 2 +- x/erc20/module.go | 6 +- x/erc20/proposal_handler.go | 4 +- x/erc20/types/erc20.pb.go | 62 +- x/erc20/types/events.pb.go | 6 +- x/erc20/types/evm_test.go | 2 +- x/erc20/types/genesis.pb.go | 4 +- x/erc20/types/genesis_test.go | 2 +- x/erc20/types/interfaces.go | 4 +- x/erc20/types/mocks/EVMKeeper.go | 4 +- x/erc20/types/msg_test.go | 4 +- x/erc20/types/params_test.go | 2 +- x/erc20/types/proposal.go | 2 +- x/erc20/types/proposal_test.go | 4 +- x/erc20/types/query.pb.go | 60 +- x/erc20/types/token_pair.go | 2 +- x/erc20/types/token_pair_test.go | 4 +- x/erc20/types/tx.pb.go | 74 +- x/erc20/types/utils_test.go | 2 +- x/evm/ante/ctx_test.go | 4 +- x/evm/client/cli/query.go | 4 +- x/evm/client/cli/tx.go | 4 +- x/evm/genesis.go | 6 +- x/evm/genesis_test.go | 14 +- x/evm/keeper/abci_test.go | 2 +- x/evm/keeper/benchmark_test.go | 4 +- x/evm/keeper/config.go | 4 +- x/evm/keeper/fees.go | 2 +- x/evm/keeper/fees_test.go | 4 +- x/evm/keeper/gas.go | 2 +- x/evm/keeper/grpc_query.go | 8 +- x/evm/keeper/grpc_query_test.go | 8 +- x/evm/keeper/integration_test.go | 16 +- x/evm/keeper/keeper.go | 6 +- x/evm/keeper/keeper_test.go | 8 +- x/evm/keeper/migrations.go | 8 +- x/evm/keeper/migrations_test.go | 4 +- x/evm/keeper/msg_server.go | 2 +- x/evm/keeper/msg_server_test.go | 4 +- x/evm/keeper/params.go | 2 +- x/evm/keeper/params_benchmark_test.go | 2 +- x/evm/keeper/params_test.go | 2 +- x/evm/keeper/precompiles.go | 30 +- x/evm/keeper/precompiles_test.go | 4 +- x/evm/keeper/setup_test.go | 18 +- x/evm/keeper/state_transition.go | 6 +- .../keeper/state_transition_benchmark_test.go | 2 +- x/evm/keeper/state_transition_test.go | 8 +- x/evm/keeper/statedb.go | 6 +- x/evm/keeper/statedb_benchmark_test.go | 2 +- x/evm/keeper/statedb_test.go | 8 +- x/evm/keeper/utils_test.go | 8 +- x/evm/migrations/v4/migrate.go | 4 +- x/evm/migrations/v4/migrate_test.go | 10 +- x/evm/migrations/v5/migrate.go | 4 +- x/evm/migrations/v5/migrate_test.go | 10 +- x/evm/migrations/v6/migrate.go | 6 +- x/evm/migrations/v6/migrate_test.go | 10 +- x/evm/module.go | 6 +- x/evm/statedb/config.go | 2 +- x/evm/statedb/integration_test.go | 14 +- x/evm/statedb/mock_test.go | 2 +- x/evm/statedb/statedb_test.go | 2 +- x/evm/types/access_list_test.go | 2 +- x/evm/types/access_list_tx.go | 2 +- x/evm/types/access_list_tx_test.go | 2 +- x/evm/types/dynamic_fee_tx.go | 2 +- x/evm/types/dynamic_fee_tx_test.go | 4 +- x/evm/types/events.pb.go | 4 +- x/evm/types/evm.pb.go | 184 ++-- x/evm/types/genesis.go | 2 +- x/evm/types/genesis.pb.go | 34 +- x/evm/types/genesis_test.go | 2 +- x/evm/types/interfaces.go | 2 +- x/evm/types/legacy_tx.go | 2 +- x/evm/types/legacy_tx_test.go | 2 +- x/evm/types/logs.go | 2 +- x/evm/types/logs_test.go | 4 +- x/evm/types/msg.go | 2 +- x/evm/types/msg_test.go | 10 +- x/evm/types/params.go | 6 +- x/evm/types/query.pb.go | 4 +- x/evm/types/tx.pb.go | 4 +- x/evm/types/tx_args_test.go | 2 +- x/evm/types/utils_test.go | 8 +- x/feemarket/client/cli/query.go | 2 +- x/feemarket/genesis.go | 4 +- x/feemarket/keeper/abci.go | 2 +- x/feemarket/keeper/grpc_query.go | 2 +- x/feemarket/keeper/grpc_query_test.go | 2 +- x/feemarket/keeper/integration_test.go | 8 +- x/feemarket/keeper/keeper.go | 2 +- x/feemarket/keeper/migrations.go | 4 +- x/feemarket/keeper/migrations_test.go | 4 +- x/feemarket/keeper/msg_server.go | 2 +- x/feemarket/keeper/msg_server_test.go | 2 +- x/feemarket/keeper/params.go | 2 +- x/feemarket/keeper/params_test.go | 2 +- x/feemarket/keeper/setup_test.go | 6 +- x/feemarket/keeper/utils_test.go | 20 +- x/feemarket/migrations/v4/migrate.go | 2 +- x/feemarket/migrations/v4/migrate_test.go | 8 +- x/feemarket/migrations/v4/types/params.go | 2 +- x/feemarket/module.go | 6 +- x/feemarket/types/events.pb.go | 6 +- x/feemarket/types/feemarket.pb.go | 46 +- x/feemarket/types/genesis.pb.go | 6 +- x/feemarket/types/query.pb.go | 56 +- x/feemarket/types/tx.pb.go | 4 +- x/ibc/transfer/ibc_module.go | 2 +- x/ibc/transfer/keeper/keeper.go | 2 +- x/ibc/transfer/keeper/keeper_test.go | 26 +- x/ibc/transfer/keeper/msg_server.go | 2 +- x/ibc/transfer/keeper/msg_server_test.go | 4 +- x/ibc/transfer/module.go | 2 +- x/ibc/transfer/types/interfaces.go | 2 +- x/incentives/module.go | 2 +- x/incentives/types/genesis.pb.go | 46 +- x/incentives/types/incentives.pb.go | 60 +- x/incentives/types/proposal.go | 2 +- x/inflation/v1/client/cli/query.go | 2 +- x/inflation/v1/genesis.go | 4 +- x/inflation/v1/keeper/epoch_info.go | 2 +- x/inflation/v1/keeper/epoch_info_test.go | 4 +- x/inflation/v1/keeper/grpc_query.go | 2 +- x/inflation/v1/keeper/grpc_query_test.go | 4 +- x/inflation/v1/keeper/hooks.go | 4 +- x/inflation/v1/keeper/hooks_test.go | 4 +- x/inflation/v1/keeper/inflation.go | 6 +- x/inflation/v1/keeper/inflation_test.go | 4 +- x/inflation/v1/keeper/integration_test.go | 4 +- x/inflation/v1/keeper/keeper.go | 2 +- x/inflation/v1/keeper/migrations.go | 6 +- x/inflation/v1/keeper/migrations_test.go | 10 +- x/inflation/v1/keeper/msg_server.go | 2 +- x/inflation/v1/keeper/msg_server_test.go | 2 +- x/inflation/v1/keeper/params.go | 2 +- x/inflation/v1/keeper/params_test.go | 2 +- x/inflation/v1/keeper/periods.go | 2 +- x/inflation/v1/keeper/setup_test.go | 6 +- x/inflation/v1/keeper/utils_test.go | 12 +- x/inflation/v1/migrations/v2/migrate.go | 4 +- x/inflation/v1/migrations/v2/migrate_test.go | 10 +- x/inflation/v1/migrations/v2/types/params.go | 4 +- x/inflation/v1/migrations/v3/migrate_test.go | 4 +- x/inflation/v1/module.go | 6 +- x/inflation/v1/types/genesis.go | 2 +- x/inflation/v1/types/genesis.pb.go | 48 +- x/inflation/v1/types/genesis_test.go | 2 +- x/inflation/v1/types/inflation.pb.go | 4 +- x/inflation/v1/types/inflation_calculation.go | 2 +- x/inflation/v1/types/params.go | 2 +- x/inflation/v1/types/query.pb.go | 86 +- x/inflation/v1/types/tx.pb.go | 4 +- x/staking/keeper/integration_test.go | 395 +++++++++ x/staking/keeper/keeper.go | 33 + x/staking/keeper/msg_server.go | 107 +++ x/staking/keeper/msg_server_test.go | 271 ++++++ x/staking/keeper/util_test.go | 48 ++ x/staking/module.go | 61 ++ x/vesting/client/cli/query.go | 2 +- x/vesting/client/cli/tx.go | 2 +- x/vesting/client/proposal_handler.go | 2 +- x/vesting/handler.go | 2 +- x/vesting/keeper/gov.go | 2 +- x/vesting/keeper/gov_test.go | 10 +- x/vesting/keeper/grpc_query.go | 8 +- x/vesting/keeper/grpc_query_test.go | 6 +- x/vesting/keeper/hooks.go | 2 +- x/vesting/keeper/integration_test.go | 808 +++++++++--------- x/vesting/keeper/keeper.go | 2 +- x/vesting/keeper/keeper_test.go | 8 +- x/vesting/keeper/migrations.go | 13 +- x/vesting/keeper/migrations_test.go | 100 ++- x/vesting/keeper/msg_server.go | 9 +- x/vesting/keeper/msg_server_test.go | 26 +- x/vesting/keeper/setup_test.go | 144 +++- x/vesting/keeper/utils.go | 2 +- x/vesting/keeper/utils_test.go | 130 +-- x/vesting/migrations/types/vesting.pb.go | 6 +- x/vesting/migrations/v2/migrate.go | 4 +- x/vesting/migrations/v3/migrate.go | 38 + x/vesting/migrations/v3/migrate_test.go | 3 + x/vesting/module.go | 12 +- x/vesting/proposal_handler.go | 4 +- x/vesting/proposal_handler_test.go | 8 +- x/vesting/setup_test.go | 2 +- x/vesting/types/clawback_vesting_account.go | 87 +- .../types/clawback_vesting_account_test.go | 407 ++++----- x/vesting/types/codec.go | 2 +- x/vesting/types/events.pb.go | 4 +- x/vesting/types/msg_test.go | 4 +- x/vesting/types/proposal_test.go | 2 +- x/vesting/types/query.pb.go | 4 +- x/vesting/types/schedule.go | 2 +- x/vesting/types/tx.pb.go | 4 +- x/vesting/types/vesting.pb.go | 60 +- x/vesting/utils_test.go | 14 +- 635 files changed, 4716 insertions(+), 3170 deletions(-) delete mode 100644 app/ante/cosmos/vesting.go create mode 100644 app/upgrades/v18/constants.go create mode 100644 app/upgrades/v18/upgrades.go create mode 100644 testutil/vesting.go create mode 100644 x/staking/keeper/integration_test.go create mode 100644 x/staking/keeper/keeper.go create mode 100644 x/staking/keeper/msg_server.go create mode 100644 x/staking/keeper/msg_server_test.go create mode 100644 x/staking/keeper/util_test.go create mode 100644 x/staking/module.go create mode 100644 x/vesting/migrations/v3/migrate.go create mode 100644 x/vesting/migrations/v3/migrate_test.go diff --git a/.github/workflows/consensuswarn.yml b/.github/workflows/consensuswarn.yml index 677f8500ce..c92b02be31 100644 --- a/.github/workflows/consensuswarn.yml +++ b/.github/workflows/consensuswarn.yml @@ -16,4 +16,4 @@ jobs: - uses: actions/checkout@v4 - uses: orijtech/consensuswarn@main with: - roots: "github.com/evmos/evmos/v17/app.Evmos.DeliverTx,github.com/evmos/evmos/v17/app.Evmos.BeginBlocker,github.com/evmos/evmos/v17/app.Evmos.EndBlocker" + roots: "github.com/evmos/evmos/v18/app.Evmos.DeliverTx,github.com/evmos/evmos/v18/app.Evmos.BeginBlocker,github.com/evmos/evmos/v18/app.Evmos.EndBlocker" diff --git a/CHANGELOG.md b/CHANGELOG.md index 200526e822..a2c8bdfa16 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -89,19 +89,31 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (build) [#2484](https://github.com/evmos/evmos/pull/2484) Bump golang version to v1.22. - (client) [#2481](https://github.com/evmos/evmos/pull/2481) Replace path.Join with filepath.Join. -## [v17.0.0] - 2024-04-08 +## [v18.0.0](https://github.com/evmos/evmos/releases/tag/v18.0.0) - 2024-04-22 + +### State Machine Breaking + +- (vesting) [#2500](https://github.com/evmos/evmos/pull/2500) Refactor vesting module. + +## [v17.0.1](https://github.com/evmos/evmos/releases/tag/v17.0.1) - 2024-04-18 + +### Improvements + +- (app) [#2491](https://github.com/evmos/evmos/pull/2491) Schedule v18 upgrade. + +## [v17.0.0](https://github.com/evmos/evmos/releases/tag/v17.0.0) - 2024-04-08 ### State Machine Breaking - (evm) [#2475](https://github.com/evmos/evmos/pull/2475) Improve commit efficiency on EVM & bump IBC version to `v7.4.0`. -## [v16.0.4] - 2024-04-05 +## [v16.0.4](https://github.com/evmos/evmos/releases/tag/v16.0.4) - 2024-04-05 ### Improvements - (all) [#2460](https://github.com/evmos/evmos/pull/2460) Schedule v17 upgrade. -## [v16.0.3] - 2024-02-02 +## [v16.0.3](https://github.com/evmos/evmos/releases/tag/v16.0.3) - 2024-02-02 ## Bug Fixes diff --git a/app/ante/cosmos.go b/app/ante/cosmos.go index c193068223..9ed02fb3e1 100644 --- a/app/ante/cosmos.go +++ b/app/ante/cosmos.go @@ -8,9 +8,9 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/ante" sdkvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" ibcante "github.com/cosmos/ibc-go/v7/modules/core/ante" - cosmosante "github.com/evmos/evmos/v17/app/ante/cosmos" - evmante "github.com/evmos/evmos/v17/app/ante/evm" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + cosmosante "github.com/evmos/evmos/v18/app/ante/cosmos" + evmante "github.com/evmos/evmos/v18/app/ante/evm" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) // newCosmosAnteHandler creates the default ante handler for Cosmos transactions @@ -29,7 +29,6 @@ func newCosmosAnteHandler(options HandlerOptions) sdk.AnteHandler { cosmosante.NewMinGasPriceDecorator(options.FeeMarketKeeper, options.EvmKeeper), ante.NewConsumeGasForTxSizeDecorator(options.AccountKeeper), cosmosante.NewDeductFeeDecorator(options.AccountKeeper, options.BankKeeper, options.DistributionKeeper, options.FeegrantKeeper, options.StakingKeeper, options.TxFeeChecker), - cosmosante.NewVestingDelegationDecorator(options.AccountKeeper, options.StakingKeeper, options.BankKeeper, options.Cdc), // SetPubKeyDecorator must be called before all signature verification decorators ante.NewSetPubKeyDecorator(options.AccountKeeper), ante.NewValidateSigCountDecorator(options.AccountKeeper), diff --git a/app/ante/cosmos/authz_test.go b/app/ante/cosmos/authz_test.go index 25f59bc705..1c3b7cf500 100644 --- a/app/ante/cosmos/authz_test.go +++ b/app/ante/cosmos/authz_test.go @@ -18,10 +18,10 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" ethtypes "github.com/ethereum/go-ethereum/core/types" - cosmosante "github.com/evmos/evmos/v17/app/ante/cosmos" - testutil "github.com/evmos/evmos/v17/testutil" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + cosmosante "github.com/evmos/evmos/v18/app/ante/cosmos" + testutil "github.com/evmos/evmos/v18/testutil" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) func TestAuthzLimiterDecorator(t *testing.T) { diff --git a/app/ante/cosmos/eip712.go b/app/ante/cosmos/eip712.go index a1bb98090f..00c1c34196 100644 --- a/app/ante/cosmos/eip712.go +++ b/app/ante/cosmos/eip712.go @@ -19,11 +19,11 @@ import ( ethcrypto "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/crypto/secp256k1" "github.com/ethereum/go-ethereum/signer/core/apitypes" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" - "github.com/evmos/evmos/v17/ethereum/eip712" - "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + "github.com/evmos/evmos/v18/ethereum/eip712" + "github.com/evmos/evmos/v18/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) var evmosCodec codec.ProtoCodecMarshaler diff --git a/app/ante/cosmos/fees.go b/app/ante/cosmos/fees.go index 914fa41415..d1ee412d24 100644 --- a/app/ante/cosmos/fees.go +++ b/app/ante/cosmos/fees.go @@ -13,7 +13,7 @@ import ( errortypes "github.com/cosmos/cosmos-sdk/types/errors" authante "github.com/cosmos/cosmos-sdk/x/auth/ante" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - anteutils "github.com/evmos/evmos/v17/app/ante/utils" + anteutils "github.com/evmos/evmos/v18/app/ante/utils" ) // DeductFeeDecorator deducts fees from the first signer of the tx. diff --git a/app/ante/cosmos/fees_benchmark_test.go b/app/ante/cosmos/fees_benchmark_test.go index 6c46df5f98..6199b1a459 100644 --- a/app/ante/cosmos/fees_benchmark_test.go +++ b/app/ante/cosmos/fees_benchmark_test.go @@ -6,8 +6,8 @@ import ( "time" sdkmath "cosmossdk.io/math" - "github.com/evmos/evmos/v17/testutil" - testutiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v18/testutil" + testutiltx "github.com/evmos/evmos/v18/testutil/tx" ) // This tests setup contains expensive operations. diff --git a/app/ante/cosmos/fees_test.go b/app/ante/cosmos/fees_test.go index dec3e217db..af595d3f3c 100644 --- a/app/ante/cosmos/fees_test.go +++ b/app/ante/cosmos/fees_test.go @@ -6,10 +6,10 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/feegrant" - cosmosante "github.com/evmos/evmos/v17/app/ante/cosmos" - "github.com/evmos/evmos/v17/testutil" - testutiltx "github.com/evmos/evmos/v17/testutil/tx" - "github.com/evmos/evmos/v17/utils" + cosmosante "github.com/evmos/evmos/v18/app/ante/cosmos" + "github.com/evmos/evmos/v18/testutil" + testutiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/utils" ) type deductFeeDecoratorTestCase struct { diff --git a/app/ante/cosmos/min_price.go b/app/ante/cosmos/min_price.go index fb5de81c95..7ed58d640b 100644 --- a/app/ante/cosmos/min_price.go +++ b/app/ante/cosmos/min_price.go @@ -9,7 +9,7 @@ import ( errorsmod "cosmossdk.io/errors" "cosmossdk.io/math" - evmante "github.com/evmos/evmos/v17/app/ante/evm" + evmante "github.com/evmos/evmos/v18/app/ante/evm" sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" diff --git a/app/ante/cosmos/min_price_test.go b/app/ante/cosmos/min_price_test.go index 9984302f8c..f7b9e8b0fd 100644 --- a/app/ante/cosmos/min_price_test.go +++ b/app/ante/cosmos/min_price_test.go @@ -7,10 +7,10 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - cosmosante "github.com/evmos/evmos/v17/app/ante/cosmos" - "github.com/evmos/evmos/v17/testutil" - testutiltx "github.com/evmos/evmos/v17/testutil/tx" - "github.com/evmos/evmos/v17/utils" + cosmosante "github.com/evmos/evmos/v18/app/ante/cosmos" + "github.com/evmos/evmos/v18/testutil" + testutiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/utils" ) var execTypes = []struct { diff --git a/app/ante/cosmos/reject_msgs.go b/app/ante/cosmos/reject_msgs.go index 2467119a1c..37f9b877ea 100644 --- a/app/ante/cosmos/reject_msgs.go +++ b/app/ante/cosmos/reject_msgs.go @@ -6,7 +6,7 @@ import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) // RejectMessagesDecorator prevents invalid msg types from being executed diff --git a/app/ante/cosmos/setup_test.go b/app/ante/cosmos/setup_test.go index 5552082dbf..2ee90c579c 100644 --- a/app/ante/cosmos/setup_test.go +++ b/app/ante/cosmos/setup_test.go @@ -20,18 +20,18 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/app/ante" - evmante "github.com/evmos/evmos/v17/app/ante/evm" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" - "github.com/evmos/evmos/v17/encoding" - "github.com/evmos/evmos/v17/ethereum/eip712" - "github.com/evmos/evmos/v17/testutil" - "github.com/evmos/evmos/v17/types" - "github.com/evmos/evmos/v17/utils" - "github.com/evmos/evmos/v17/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/app/ante" + evmante "github.com/evmos/evmos/v18/app/ante/evm" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + "github.com/evmos/evmos/v18/encoding" + "github.com/evmos/evmos/v18/ethereum/eip712" + "github.com/evmos/evmos/v18/testutil" + "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v18/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" ) type AnteTestSuite struct { diff --git a/app/ante/cosmos/utils_test.go b/app/ante/cosmos/utils_test.go index 90593a950a..c1f4f37792 100644 --- a/app/ante/cosmos/utils_test.go +++ b/app/ante/cosmos/utils_test.go @@ -13,12 +13,12 @@ import ( authsigning "github.com/cosmos/cosmos-sdk/x/auth/signing" "github.com/cosmos/cosmos-sdk/x/authz" - "github.com/evmos/evmos/v17/app" - cosmosante "github.com/evmos/evmos/v17/app/ante/cosmos" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" - "github.com/evmos/evmos/v17/encoding" - testutil "github.com/evmos/evmos/v17/testutil" - testutiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v18/app" + cosmosante "github.com/evmos/evmos/v18/app/ante/cosmos" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + "github.com/evmos/evmos/v18/encoding" + testutil "github.com/evmos/evmos/v18/testutil" + testutiltx "github.com/evmos/evmos/v18/testutil/tx" ) func (suite *AnteTestSuite) CreateTestCosmosTxBuilder(gasPrice sdkmath.Int, denom string, msgs ...sdk.Msg) client.TxBuilder { diff --git a/app/ante/cosmos/vesting.go b/app/ante/cosmos/vesting.go deleted file mode 100644 index 19bd8b296d..0000000000 --- a/app/ante/cosmos/vesting.go +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) -package cosmos - -import ( - errorsmod "cosmossdk.io/errors" - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - errortypes "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/cosmos/cosmos-sdk/x/authz" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - - anteutils "github.com/evmos/evmos/v17/app/ante/utils" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" - vestingtypes "github.com/evmos/evmos/v17/x/vesting/types" -) - -// TODO: remove once Cosmos SDK is upgraded to v0.46 - -// VestingDelegationDecorator validates delegation of vested coins -type VestingDelegationDecorator struct { - ak evmtypes.AccountKeeper - sk anteutils.StakingKeeper - bk evmtypes.BankKeeper - cdc codec.BinaryCodec -} - -// NewVestingDelegationDecorator creates a new VestingDelegationDecorator -func NewVestingDelegationDecorator(ak evmtypes.AccountKeeper, sk anteutils.StakingKeeper, bk evmtypes.BankKeeper, cdc codec.BinaryCodec) VestingDelegationDecorator { - return VestingDelegationDecorator{ - ak: ak, - sk: sk, - bk: bk, - cdc: cdc, - } -} - -// AnteHandle checks if the tx contains a staking delegation. -// It errors if the coins are still locked or the bond amount is greater than -// the coins already vested -func (vdd VestingDelegationDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler) (newCtx sdk.Context, err error) { - for _, msg := range tx.GetMsgs() { - switch msg := msg.(type) { - case *authz.MsgExec: - // Check for bypassing authorization - if err := vdd.validateAuthz(ctx, msg); err != nil { - return ctx, err - } - default: - if err := vdd.validateMsg(ctx, msg); err != nil { - return ctx, err - } - } - } - - return next(ctx, tx, simulate) -} - -// validateAuthz validates the authorization internal message -func (vdd VestingDelegationDecorator) validateAuthz(ctx sdk.Context, execMsg *authz.MsgExec) error { - for _, v := range execMsg.Msgs { - var innerMsg sdk.Msg - if err := vdd.cdc.UnpackAny(v, &innerMsg); err != nil { - return errorsmod.Wrap(err, "cannot unmarshal authz exec msgs") - } - - if err := vdd.validateMsg(ctx, innerMsg); err != nil { - return err - } - } - - return nil -} - -// validateMsg checks that the only vested coins can be delegated -func (vdd VestingDelegationDecorator) validateMsg(ctx sdk.Context, msg sdk.Msg) error { - delegateMsg, ok := msg.(*stakingtypes.MsgDelegate) - if !ok { - return nil - } - - for _, addr := range msg.GetSigners() { - acc := vdd.ak.GetAccount(ctx, addr) - if acc == nil { - return errorsmod.Wrapf( - errortypes.ErrUnknownAddress, - "account %s does not exist", addr, - ) - } - - clawbackAccount, isClawback := acc.(*vestingtypes.ClawbackVestingAccount) - if !isClawback { - // continue to next decorator as this logic only applies to vesting - return nil - } - - // error if bond amount is > vested coins - bondDenom := vdd.sk.BondDenom(ctx) - coins := clawbackAccount.GetVestedOnly(ctx.BlockTime()) - if coins == nil || coins.Empty() { - return errorsmod.Wrap( - vestingtypes.ErrInsufficientVestedCoins, - "account has no vested coins", - ) - } - - balance := vdd.bk.GetBalance(ctx, addr, bondDenom) - unvestedOnly := clawbackAccount.GetUnvestedOnly(ctx.BlockTime()) - spendable, hasNeg := sdk.Coins{balance}.SafeSub(unvestedOnly...) - if hasNeg { - spendable = sdk.NewCoins() - } - - vested := spendable.AmountOf(bondDenom) - if vested.LT(delegateMsg.Amount.Amount) { - return errorsmod.Wrapf( - vestingtypes.ErrInsufficientVestedCoins, - "cannot delegate unvested coins. coins vested < delegation amount (%s < %s)", - vested, delegateMsg.Amount.Amount, - ) - } - } - - return nil -} diff --git a/app/ante/evm.go b/app/ante/evm.go index 5a928f11a4..e2e4b9558d 100644 --- a/app/ante/evm.go +++ b/app/ante/evm.go @@ -5,7 +5,7 @@ package ante import ( sdk "github.com/cosmos/cosmos-sdk/types" - evmante "github.com/evmos/evmos/v17/app/ante/evm" + evmante "github.com/evmos/evmos/v18/app/ante/evm" ) func newMonoEVMAnteHandler(options HandlerOptions) sdk.AnteHandler { diff --git a/app/ante/evm/01_setup_ctx.go b/app/ante/evm/01_setup_ctx.go index b5bc8cfbed..743412739e 100644 --- a/app/ante/evm/01_setup_ctx.go +++ b/app/ante/evm/01_setup_ctx.go @@ -8,7 +8,7 @@ import ( sdktypes "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" authante "github.com/cosmos/cosmos-sdk/x/auth/ante" - evmante "github.com/evmos/evmos/v17/x/evm/ante" + evmante "github.com/evmos/evmos/v18/x/evm/ante" ) var _ sdktypes.AnteDecorator = &EthSetupContextDecorator{} diff --git a/app/ante/evm/02_mempool_fee_test.go b/app/ante/evm/02_mempool_fee_test.go index 207e093760..3c45baa8e7 100644 --- a/app/ante/evm/02_mempool_fee_test.go +++ b/app/ante/evm/02_mempool_fee_test.go @@ -5,7 +5,7 @@ package evm_test import ( sdkmath "cosmossdk.io/math" errortypes "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/evmos/evmos/v17/app/ante/evm" + "github.com/evmos/evmos/v18/app/ante/evm" ) func (suite *EvmAnteTestSuite) TestMempoolFee() { diff --git a/app/ante/evm/03_global_fee_test.go b/app/ante/evm/03_global_fee_test.go index 6ec245ad84..1ab8b1f502 100644 --- a/app/ante/evm/03_global_fee_test.go +++ b/app/ante/evm/03_global_fee_test.go @@ -5,7 +5,7 @@ package evm_test import ( sdkmath "cosmossdk.io/math" errortypes "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/evmos/evmos/v17/app/ante/evm" + "github.com/evmos/evmos/v18/app/ante/evm" ) func (suite *EvmAnteTestSuite) TestGlobalFee() { diff --git a/app/ante/evm/04_validate.go b/app/ante/evm/04_validate.go index 0e47c6710b..fe321412a2 100644 --- a/app/ante/evm/04_validate.go +++ b/app/ante/evm/04_validate.go @@ -9,7 +9,7 @@ import ( sdktypes "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/types/tx" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) // ValidateMsg validates an Ethereum specific message type and returns an error if invalid diff --git a/app/ante/evm/04_validate_test.go b/app/ante/evm/04_validate_test.go index 1561ce4a91..196908ec66 100644 --- a/app/ante/evm/04_validate_test.go +++ b/app/ante/evm/04_validate_test.go @@ -8,9 +8,9 @@ import ( sdktypes "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v17/app/ante/evm" - testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/app/ante/evm" + testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) type validateMsgParams struct { diff --git a/app/ante/evm/05_signature_verification.go b/app/ante/evm/05_signature_verification.go index 7e6722d73d..b63f2c5371 100644 --- a/app/ante/evm/05_signature_verification.go +++ b/app/ante/evm/05_signature_verification.go @@ -9,7 +9,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" ethtypes "github.com/ethereum/go-ethereum/core/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) // EthSigVerificationDecorator validates an ethereum signatures diff --git a/app/ante/evm/06_account_verification.go b/app/ante/evm/06_account_verification.go index 95391f7cd7..d542f8523e 100644 --- a/app/ante/evm/06_account_verification.go +++ b/app/ante/evm/06_account_verification.go @@ -8,9 +8,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v17/x/evm/keeper" - "github.com/evmos/evmos/v17/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/x/evm/keeper" + "github.com/evmos/evmos/v18/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) // VerifyAccountBalance checks that the account balance is greater than the total transaction cost. diff --git a/app/ante/evm/06_account_verification_test.go b/app/ante/evm/06_account_verification_test.go index 31430ea7a3..9be61046ae 100644 --- a/app/ante/evm/06_account_verification_test.go +++ b/app/ante/evm/06_account_verification_test.go @@ -7,13 +7,13 @@ import ( "cosmossdk.io/math" errortypes "github.com/cosmos/cosmos-sdk/types/errors" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v17/app/ante/evm" - "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v17/testutil/integration/evmos/network" - "github.com/evmos/evmos/v17/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/app/ante/evm" + "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + "github.com/evmos/evmos/v18/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) func (suite *EvmAnteTestSuite) TestVerifyAccountBalance() { diff --git a/app/ante/evm/07_can_transfer.go b/app/ante/evm/07_can_transfer.go index 0d8702caba..371ffcad47 100644 --- a/app/ante/evm/07_can_transfer.go +++ b/app/ante/evm/07_can_transfer.go @@ -11,8 +11,8 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/params" - "github.com/evmos/evmos/v17/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) // CanTransfer checks if the sender is allowed to transfer funds according to the EVM block diff --git a/app/ante/evm/07_can_transfer_test.go b/app/ante/evm/07_can_transfer_test.go index 61452b365a..58be2b2f9d 100644 --- a/app/ante/evm/07_can_transfer_test.go +++ b/app/ante/evm/07_can_transfer_test.go @@ -9,12 +9,12 @@ import ( "cosmossdk.io/math" errortypes "github.com/cosmos/cosmos-sdk/types/errors" gethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v17/app/ante/evm" - "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v17/testutil/integration/evmos/network" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/app/ante/evm" + "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) func (suite *EvmAnteTestSuite) TestCanTransfer() { diff --git a/app/ante/evm/08_vesting.go b/app/ante/evm/08_vesting.go index 632be95c6b..00238336ae 100644 --- a/app/ante/evm/08_vesting.go +++ b/app/ante/evm/08_vesting.go @@ -10,8 +10,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" - vestingtypes "github.com/evmos/evmos/v17/x/vesting/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" + vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" ) // EthVestingTransactionDecorator validates if clawback vesting accounts are diff --git a/app/ante/evm/08_vesting_test.go b/app/ante/evm/08_vesting_test.go index 780b6dbe56..2ee4dd966b 100644 --- a/app/ante/evm/08_vesting_test.go +++ b/app/ante/evm/08_vesting_test.go @@ -11,11 +11,11 @@ import ( errortypes "github.com/cosmos/cosmos-sdk/types/errors" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" sdkvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" - "github.com/evmos/evmos/v17/app/ante/evm" - "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v17/testutil/integration/evmos/network" - vestingtypes "github.com/evmos/evmos/v17/x/vesting/types" + "github.com/evmos/evmos/v18/app/ante/evm" + "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" ) type AccountExpenses = map[string]*evm.EthVestingExpenseTracker diff --git a/app/ante/evm/09_gas_consume.go b/app/ante/evm/09_gas_consume.go index 1ab69720b8..fb6064d0ca 100644 --- a/app/ante/evm/09_gas_consume.go +++ b/app/ante/evm/09_gas_consume.go @@ -10,9 +10,9 @@ import ( sdktypes "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" "github.com/ethereum/go-ethereum/common" - anteutils "github.com/evmos/evmos/v17/app/ante/utils" - "github.com/evmos/evmos/v17/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + anteutils "github.com/evmos/evmos/v18/app/ante/utils" + "github.com/evmos/evmos/v18/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) // UpdateComulativeGasWanted updates the cumulative gas wanted diff --git a/app/ante/evm/09_gas_consume_test.go b/app/ante/evm/09_gas_consume_test.go index de788eedcb..5aba86829b 100644 --- a/app/ante/evm/09_gas_consume_test.go +++ b/app/ante/evm/09_gas_consume_test.go @@ -5,10 +5,10 @@ package evm_test import ( sdktypes "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - evmante "github.com/evmos/evmos/v17/app/ante/evm" - "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v17/testutil/integration/evmos/network" + evmante "github.com/evmos/evmos/v18/app/ante/evm" + "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v18/testutil/integration/evmos/network" ) func (suite *EvmAnteTestSuite) TestUpdateComulativeGasWanted() { diff --git a/app/ante/evm/10_incremenet_sequence_test.go b/app/ante/evm/10_incremenet_sequence_test.go index d6fb148203..a6f22e60f8 100644 --- a/app/ante/evm/10_incremenet_sequence_test.go +++ b/app/ante/evm/10_incremenet_sequence_test.go @@ -5,10 +5,10 @@ package evm_test import ( errortypes "github.com/cosmos/cosmos-sdk/types/errors" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/evmos/evmos/v17/app/ante/evm" - "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v17/testutil/integration/evmos/network" + "github.com/evmos/evmos/v18/app/ante/evm" + "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v18/testutil/integration/evmos/network" ) func (suite *EvmAnteTestSuite) TestIncrementSequence() { diff --git a/app/ante/evm/10_increment_sequence.go b/app/ante/evm/10_increment_sequence.go index 3fd29152b2..10cc529f6e 100644 --- a/app/ante/evm/10_increment_sequence.go +++ b/app/ante/evm/10_increment_sequence.go @@ -10,7 +10,7 @@ import ( errortypes "github.com/cosmos/cosmos-sdk/types/errors" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) // IncrementNonce increments the sequence of the account. diff --git a/app/ante/evm/11_gas_wanted.go b/app/ante/evm/11_gas_wanted.go index c437ee23cf..be9357fa6f 100644 --- a/app/ante/evm/11_gas_wanted.go +++ b/app/ante/evm/11_gas_wanted.go @@ -8,7 +8,7 @@ import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v18/types" ) // GasWantedDecorator keeps track of the gasWanted amount on the current block in transient store diff --git a/app/ante/evm/11_gas_wanted_test.go b/app/ante/evm/11_gas_wanted_test.go index 1b832ce3b7..3d872b7b25 100644 --- a/app/ante/evm/11_gas_wanted_test.go +++ b/app/ante/evm/11_gas_wanted_test.go @@ -6,11 +6,11 @@ import ( errortypes "github.com/cosmos/cosmos-sdk/types/errors" sdktypes "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/app/ante/evm" - "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v17/testutil/integration/evmos/network" + "github.com/evmos/evmos/v18/app/ante/evm" + "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v18/testutil/integration/evmos/network" ) func (suite *EvmAnteTestSuite) TestCheckGasWanted() { diff --git a/app/ante/evm/12_emit_event.go b/app/ante/evm/12_emit_event.go index 7ec58b137b..72aef201ae 100644 --- a/app/ante/evm/12_emit_event.go +++ b/app/ante/evm/12_emit_event.go @@ -9,7 +9,7 @@ import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) // EthEmitEventDecorator emit events in ante handler in case of tx execution failed (out of block gas limit). diff --git a/app/ante/evm/ante_test.go b/app/ante/evm/ante_test.go index 2c6db8753e..c8b9cc3ddd 100644 --- a/app/ante/evm/ante_test.go +++ b/app/ante/evm/ante_test.go @@ -17,8 +17,8 @@ import ( "github.com/ethereum/go-ethereum/core/types" ethparams "github.com/ethereum/go-ethereum/params" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) func (suite *AnteTestSuite) TestAnteHandler() { diff --git a/app/ante/evm/eth_benchmark_test.go b/app/ante/evm/eth_benchmark_test.go index 7cce298095..c93c22373a 100644 --- a/app/ante/evm/eth_benchmark_test.go +++ b/app/ante/evm/eth_benchmark_test.go @@ -8,11 +8,11 @@ import ( sdkmath "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" ethtypes "github.com/ethereum/go-ethereum/core/types" - ethante "github.com/evmos/evmos/v17/app/ante/evm" - "github.com/evmos/evmos/v17/testutil" - testutiltx "github.com/evmos/evmos/v17/testutil/tx" - "github.com/evmos/evmos/v17/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + ethante "github.com/evmos/evmos/v18/app/ante/evm" + "github.com/evmos/evmos/v18/testutil" + testutiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) func BenchmarkEthGasConsumeDecorator(b *testing.B) { diff --git a/app/ante/evm/fee_checker.go b/app/ante/evm/fee_checker.go index c6c3cfcded..0b45d68f6c 100644 --- a/app/ante/evm/fee_checker.go +++ b/app/ante/evm/fee_checker.go @@ -12,9 +12,9 @@ import ( errortypes "github.com/cosmos/cosmos-sdk/types/errors" authante "github.com/cosmos/cosmos-sdk/x/auth/ante" "github.com/ethereum/go-ethereum/params" - anteutils "github.com/evmos/evmos/v17/app/ante/utils" - evmostypes "github.com/evmos/evmos/v17/types" - "github.com/evmos/evmos/v17/x/evm/types" + anteutils "github.com/evmos/evmos/v18/app/ante/utils" + evmostypes "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v18/x/evm/types" ) // NewDynamicFeeChecker returns a `TxFeeChecker` that applies a dynamic fee to diff --git a/app/ante/evm/fee_checker_test.go b/app/ante/evm/fee_checker_test.go index e38b1a0f42..17513226be 100644 --- a/app/ante/evm/fee_checker_test.go +++ b/app/ante/evm/fee_checker_test.go @@ -14,9 +14,9 @@ import ( "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/evmos/v17/encoding" - "github.com/evmos/evmos/v17/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/encoding" + "github.com/evmos/evmos/v18/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) var _ DynamicFeeEVMKeeper = MockEVMKeeper{} diff --git a/app/ante/evm/fee_market_test.go b/app/ante/evm/fee_market_test.go index 7f6bbacdfd..fa1947394e 100644 --- a/app/ante/evm/fee_market_test.go +++ b/app/ante/evm/fee_market_test.go @@ -8,12 +8,12 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v17/app/ante/evm" - "github.com/evmos/evmos/v17/testutil" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - "github.com/evmos/evmos/v17/types" - "github.com/evmos/evmos/v17/utils" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/app/ante/evm" + "github.com/evmos/evmos/v18/testutil" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v18/utils" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) func (suite *AnteTestSuite) TestGasWantedDecorator() { diff --git a/app/ante/evm/interfaces.go b/app/ante/evm/interfaces.go index daea852e06..5ebddebc88 100644 --- a/app/ante/evm/interfaces.go +++ b/app/ante/evm/interfaces.go @@ -12,9 +12,9 @@ import ( "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/params" - "github.com/evmos/evmos/v17/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" + "github.com/evmos/evmos/v18/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" ) // EVMKeeper defines the expected keeper interface used on the AnteHandler diff --git a/app/ante/evm/mono.go b/app/ante/evm/mono.go index 2b7580b534..32fd3ff03a 100644 --- a/app/ante/evm/mono.go +++ b/app/ante/evm/mono.go @@ -14,9 +14,9 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/params" - anteutils "github.com/evmos/evmos/v17/app/ante/utils" - evmkeeper "github.com/evmos/evmos/v17/x/evm/keeper" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + anteutils "github.com/evmos/evmos/v18/app/ante/utils" + evmkeeper "github.com/evmos/evmos/v18/x/evm/keeper" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) var _ sdk.AnteDecorator = &EthSetupContextDecorator{} diff --git a/app/ante/evm/setup_ctx_test.go b/app/ante/evm/setup_ctx_test.go index e1d53eb76e..67de0f7d09 100644 --- a/app/ante/evm/setup_ctx_test.go +++ b/app/ante/evm/setup_ctx_test.go @@ -3,13 +3,13 @@ package evm_test import ( "math/big" - evmante "github.com/evmos/evmos/v17/app/ante/evm" - "github.com/evmos/evmos/v17/testutil" + evmante "github.com/evmos/evmos/v18/app/ante/evm" + "github.com/evmos/evmos/v18/testutil" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - testutiltx "github.com/evmos/evmos/v17/testutil/tx" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + testutiltx "github.com/evmos/evmos/v18/testutil/tx" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) func (suite *AnteTestSuite) TestEthSetupContextDecorator() { diff --git a/app/ante/evm/setup_test.go b/app/ante/evm/setup_test.go index eb3526d89f..a2b3ba3d95 100644 --- a/app/ante/evm/setup_test.go +++ b/app/ante/evm/setup_test.go @@ -16,13 +16,13 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v17/app" - ante "github.com/evmos/evmos/v17/app/ante" - "github.com/evmos/evmos/v17/encoding" - "github.com/evmos/evmos/v17/ethereum/eip712" - "github.com/evmos/evmos/v17/utils" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" + "github.com/evmos/evmos/v18/app" + ante "github.com/evmos/evmos/v18/app/ante" + "github.com/evmos/evmos/v18/encoding" + "github.com/evmos/evmos/v18/ethereum/eip712" + "github.com/evmos/evmos/v18/utils" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" ) type AnteTestSuite struct { diff --git a/app/ante/evm/signverify_test.go b/app/ante/evm/signverify_test.go index c29826016a..5fba87a16c 100644 --- a/app/ante/evm/signverify_test.go +++ b/app/ante/evm/signverify_test.go @@ -5,10 +5,10 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" ethtypes "github.com/ethereum/go-ethereum/core/types" - ethante "github.com/evmos/evmos/v17/app/ante/evm" - "github.com/evmos/evmos/v17/testutil" - testutiltx "github.com/evmos/evmos/v17/testutil/tx" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + ethante "github.com/evmos/evmos/v18/app/ante/evm" + "github.com/evmos/evmos/v18/testutil" + testutiltx "github.com/evmos/evmos/v18/testutil/tx" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) func (suite *AnteTestSuite) TestEthSigVerificationDecorator() { diff --git a/app/ante/evm/sigs_test.go b/app/ante/evm/sigs_test.go index cd1ed799fa..ba7367a83f 100644 --- a/app/ante/evm/sigs_test.go +++ b/app/ante/evm/sigs_test.go @@ -3,9 +3,9 @@ package evm_test import ( "math/big" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - "github.com/evmos/evmos/v17/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) func (suite *AnteTestSuite) TestSignatures() { diff --git a/app/ante/evm/utils_test.go b/app/ante/evm/utils_test.go index 968cca7903..30032960d2 100644 --- a/app/ante/evm/utils_test.go +++ b/app/ante/evm/utils_test.go @@ -13,8 +13,8 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/migrations/legacytx" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v17/ethereum/eip712" - "github.com/evmos/evmos/v17/testutil" + "github.com/evmos/evmos/v18/ethereum/eip712" + "github.com/evmos/evmos/v18/testutil" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" @@ -34,15 +34,15 @@ import ( authz "github.com/cosmos/cosmos-sdk/x/authz" ibctypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" ibcclienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" evtypes "github.com/cosmos/cosmos-sdk/x/evidence/types" "github.com/cosmos/cosmos-sdk/x/feegrant" govtypesv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) func (suite *AnteTestSuite) BuildTestEthTx( diff --git a/app/ante/evm_benchmark_test.go b/app/ante/evm_benchmark_test.go index a637b852f8..8aa61b5b07 100644 --- a/app/ante/evm_benchmark_test.go +++ b/app/ante/evm_benchmark_test.go @@ -9,17 +9,17 @@ import ( sdktypes "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/app/ante" - ethante "github.com/evmos/evmos/v17/app/ante/evm" - "github.com/evmos/evmos/v17/encoding" - cmmnfactory "github.com/evmos/evmos/v17/testutil/integration/common/factory" - "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v17/testutil/integration/evmos/network" - evmostypes "github.com/evmos/evmos/v17/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/app/ante" + ethante "github.com/evmos/evmos/v18/app/ante/evm" + "github.com/evmos/evmos/v18/encoding" + cmmnfactory "github.com/evmos/evmos/v18/testutil/integration/common/factory" + "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + evmostypes "github.com/evmos/evmos/v18/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) type benchmarkSuite struct { diff --git a/app/ante/handler_options.go b/app/ante/handler_options.go index 2bda99e0d0..06401f030b 100644 --- a/app/ante/handler_options.go +++ b/app/ante/handler_options.go @@ -14,9 +14,9 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" - evmante "github.com/evmos/evmos/v17/app/ante/evm" - anteutils "github.com/evmos/evmos/v17/app/ante/utils" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmante "github.com/evmos/evmos/v18/app/ante/evm" + anteutils "github.com/evmos/evmos/v18/app/ante/utils" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) // HandlerOptions defines the list of module keepers required to run the Evmos diff --git a/app/ante/handler_options_test.go b/app/ante/handler_options_test.go index 96d4914208..decc6c224e 100644 --- a/app/ante/handler_options_test.go +++ b/app/ante/handler_options_test.go @@ -1,12 +1,12 @@ package ante_test import ( - ethante "github.com/evmos/evmos/v17/app/ante/evm" - "github.com/evmos/evmos/v17/encoding" - "github.com/evmos/evmos/v17/types" + ethante "github.com/evmos/evmos/v18/app/ante/evm" + "github.com/evmos/evmos/v18/encoding" + "github.com/evmos/evmos/v18/types" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/app/ante" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/app/ante" ) func (suite *AnteTestSuite) TestValidateHandlerOptions() { diff --git a/app/ante/integration_test.go b/app/ante/integration_test.go index 81db1acae6..c514817fe3 100644 --- a/app/ante/integration_test.go +++ b/app/ante/integration_test.go @@ -5,7 +5,7 @@ import ( sdkmath "cosmossdk.io/math" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - testutiltx "github.com/evmos/evmos/v17/testutil/tx" + testutiltx "github.com/evmos/evmos/v18/testutil/tx" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" @@ -13,9 +13,9 @@ import ( . "github.com/onsi/gomega" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" - "github.com/evmos/evmos/v17/testutil" - "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + "github.com/evmos/evmos/v18/testutil" + "github.com/evmos/evmos/v18/utils" ) var _ = Describe("when sending a Cosmos transaction", func() { diff --git a/app/ante/setup_test.go b/app/ante/setup_test.go index eba191b15d..4da2b888bc 100644 --- a/app/ante/setup_test.go +++ b/app/ante/setup_test.go @@ -11,12 +11,12 @@ import ( "github.com/cosmos/cosmos-sdk/client" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" - "github.com/evmos/evmos/v17/encoding" - "github.com/evmos/evmos/v17/testutil" - "github.com/evmos/evmos/v17/utils" - feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + "github.com/evmos/evmos/v18/encoding" + "github.com/evmos/evmos/v18/testutil" + "github.com/evmos/evmos/v18/utils" + feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" ) diff --git a/app/ante/sigverify.go b/app/ante/sigverify.go index efc88d226b..7189c0161a 100644 --- a/app/ante/sigverify.go +++ b/app/ante/sigverify.go @@ -15,7 +15,7 @@ import ( authante "github.com/cosmos/cosmos-sdk/x/auth/ante" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" ) var _ authante.SignatureVerificationGasConsumer = SigVerificationGasConsumer diff --git a/app/ante/sigverify_test.go b/app/ante/sigverify_test.go index 8807f7b174..ff40594d69 100644 --- a/app/ante/sigverify_test.go +++ b/app/ante/sigverify_test.go @@ -17,10 +17,10 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/migrations/legacytx" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/app/ante" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" - "github.com/evmos/evmos/v17/encoding" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/app/ante" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + "github.com/evmos/evmos/v18/encoding" ) func TestConsumeSignatureVerificationGas(t *testing.T) { diff --git a/app/ante/utils/claim_rewards_test.go b/app/ante/utils/claim_rewards_test.go index a517e7f1a1..c1f7b7d858 100644 --- a/app/ante/utils/claim_rewards_test.go +++ b/app/ante/utils/claim_rewards_test.go @@ -5,10 +5,10 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" - anteutils "github.com/evmos/evmos/v17/app/ante/utils" - "github.com/evmos/evmos/v17/testutil" - testutiltx "github.com/evmos/evmos/v17/testutil/tx" - "github.com/evmos/evmos/v17/utils" + anteutils "github.com/evmos/evmos/v18/app/ante/utils" + "github.com/evmos/evmos/v18/testutil" + testutiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/utils" ) // TestClaimStakingRewardsIfNecessary tests the ClaimStakingRewardsIfNecessary function diff --git a/app/ante/utils/setup_test.go b/app/ante/utils/setup_test.go index 04258be6d5..d0897dbcda 100644 --- a/app/ante/utils/setup_test.go +++ b/app/ante/utils/setup_test.go @@ -16,14 +16,14 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/app/ante" - "github.com/evmos/evmos/v17/encoding" - "github.com/evmos/evmos/v17/ethereum/eip712" - "github.com/evmos/evmos/v17/testutil" - "github.com/evmos/evmos/v17/utils" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/app/ante" + "github.com/evmos/evmos/v18/encoding" + "github.com/evmos/evmos/v18/ethereum/eip712" + "github.com/evmos/evmos/v18/testutil" + "github.com/evmos/evmos/v18/utils" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" ) type AnteTestSuite struct { diff --git a/app/ante/utils_test.go b/app/ante/utils_test.go index 24f480e755..bd452ff79a 100644 --- a/app/ante/utils_test.go +++ b/app/ante/utils_test.go @@ -6,8 +6,8 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/evmos/evmos/v17/app/ante" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + "github.com/evmos/evmos/v18/app/ante" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" ) func generatePubKeysAndSignatures(n int, msg []byte, _ bool) (pubkeys []cryptotypes.PubKey, signatures [][]byte) { diff --git a/app/app.go b/app/app.go index 2937d24b08..83232fe893 100644 --- a/app/app.go +++ b/app/app.go @@ -87,8 +87,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/slashing" slashingkeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" - "github.com/cosmos/cosmos-sdk/x/staking" - stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" + sdkstaking "github.com/cosmos/cosmos-sdk/x/staking" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/cosmos/cosmos-sdk/x/upgrade" upgradeclient "github.com/cosmos/cosmos-sdk/x/upgrade/client" @@ -119,42 +118,45 @@ import ( consensusparamtypes "github.com/cosmos/cosmos-sdk/x/consensus/types" // unnamed import of statik for swagger UI support - _ "github.com/evmos/evmos/v17/client/docs/statik" - - "github.com/evmos/evmos/v17/app/ante" - ethante "github.com/evmos/evmos/v17/app/ante/evm" - "github.com/evmos/evmos/v17/app/post" - v17 "github.com/evmos/evmos/v17/app/upgrades/v17" - "github.com/evmos/evmos/v17/encoding" - "github.com/evmos/evmos/v17/ethereum/eip712" - "github.com/evmos/evmos/v17/precompiles/common" - srvflags "github.com/evmos/evmos/v17/server/flags" - evmostypes "github.com/evmos/evmos/v17/types" - "github.com/evmos/evmos/v17/x/epochs" - epochskeeper "github.com/evmos/evmos/v17/x/epochs/keeper" - epochstypes "github.com/evmos/evmos/v17/x/epochs/types" - "github.com/evmos/evmos/v17/x/erc20" - erc20client "github.com/evmos/evmos/v17/x/erc20/client" - erc20keeper "github.com/evmos/evmos/v17/x/erc20/keeper" - erc20types "github.com/evmos/evmos/v17/x/erc20/types" - "github.com/evmos/evmos/v17/x/evm" - evmkeeper "github.com/evmos/evmos/v17/x/evm/keeper" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" - "github.com/evmos/evmos/v17/x/feemarket" - feemarketkeeper "github.com/evmos/evmos/v17/x/feemarket/keeper" - feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" - "github.com/evmos/evmos/v17/x/incentives" - inflation "github.com/evmos/evmos/v17/x/inflation/v1" - inflationkeeper "github.com/evmos/evmos/v17/x/inflation/v1/keeper" - inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" - "github.com/evmos/evmos/v17/x/vesting" - vestingclient "github.com/evmos/evmos/v17/x/vesting/client" - vestingkeeper "github.com/evmos/evmos/v17/x/vesting/keeper" - vestingtypes "github.com/evmos/evmos/v17/x/vesting/types" + _ "github.com/evmos/evmos/v18/client/docs/statik" + + "github.com/evmos/evmos/v18/app/ante" + ethante "github.com/evmos/evmos/v18/app/ante/evm" + "github.com/evmos/evmos/v18/app/post" + v17 "github.com/evmos/evmos/v18/app/upgrades/v17" + v18 "github.com/evmos/evmos/v18/app/upgrades/v18" + "github.com/evmos/evmos/v18/encoding" + "github.com/evmos/evmos/v18/ethereum/eip712" + "github.com/evmos/evmos/v18/precompiles/common" + srvflags "github.com/evmos/evmos/v18/server/flags" + evmostypes "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v18/x/epochs" + epochskeeper "github.com/evmos/evmos/v18/x/epochs/keeper" + epochstypes "github.com/evmos/evmos/v18/x/epochs/types" + "github.com/evmos/evmos/v18/x/erc20" + erc20client "github.com/evmos/evmos/v18/x/erc20/client" + erc20keeper "github.com/evmos/evmos/v18/x/erc20/keeper" + erc20types "github.com/evmos/evmos/v18/x/erc20/types" + "github.com/evmos/evmos/v18/x/evm" + evmkeeper "github.com/evmos/evmos/v18/x/evm/keeper" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v18/x/feemarket" + feemarketkeeper "github.com/evmos/evmos/v18/x/feemarket/keeper" + feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" + "github.com/evmos/evmos/v18/x/incentives" + inflation "github.com/evmos/evmos/v18/x/inflation/v1" + inflationkeeper "github.com/evmos/evmos/v18/x/inflation/v1/keeper" + inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" + "github.com/evmos/evmos/v18/x/staking" + stakingkeeper "github.com/evmos/evmos/v18/x/staking/keeper" + "github.com/evmos/evmos/v18/x/vesting" + vestingclient "github.com/evmos/evmos/v18/x/vesting/client" + vestingkeeper "github.com/evmos/evmos/v18/x/vesting/keeper" + vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" // NOTE: override ICS20 keeper to support IBC transfers of ERC20 tokens - "github.com/evmos/evmos/v17/x/ibc/transfer" - transferkeeper "github.com/evmos/evmos/v17/x/ibc/transfer/keeper" + "github.com/evmos/evmos/v18/x/ibc/transfer" + transferkeeper "github.com/evmos/evmos/v18/x/ibc/transfer/keeper" memiavlstore "github.com/crypto-org-chain/cronos/store" @@ -195,7 +197,7 @@ var ( genutil.NewAppModuleBasic(genutiltypes.DefaultMessageValidator), bank.AppModuleBasic{}, capability.AppModuleBasic{}, - staking.AppModuleBasic{}, + staking.AppModuleBasic{AppModuleBasic: &sdkstaking.AppModuleBasic{}}, distr.AppModuleBasic{}, gov.NewAppModuleBasic( []govclient.ProposalHandler{ @@ -612,12 +614,12 @@ func NewEvmos( evm.NewAppModule(app.EvmKeeper, app.AccountKeeper, app.GetSubspace(evmtypes.ModuleName)), feemarket.NewAppModule(app.FeeMarketKeeper, app.GetSubspace(feemarkettypes.ModuleName)), // Evmos app modules - inflation.NewAppModule(app.InflationKeeper, app.AccountKeeper, app.StakingKeeper, + inflation.NewAppModule(app.InflationKeeper, app.AccountKeeper, *app.StakingKeeper.Keeper, app.GetSubspace(inflationtypes.ModuleName)), erc20.NewAppModule(app.Erc20Keeper, app.AccountKeeper, app.GetSubspace(erc20types.ModuleName)), epochs.NewAppModule(appCodec, app.EpochsKeeper), - vesting.NewAppModule(app.VestingKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), + vesting.NewAppModule(app.VestingKeeper, app.AccountKeeper, app.BankKeeper, *app.StakingKeeper.Keeper), ) // During begin block slashing happens after distr.BeginBlocker so that @@ -1120,6 +1122,14 @@ func (app *Evmos) setupUpgradeHandlers() { ), ) + // v18 upgrade handler + app.UpgradeKeeper.SetUpgradeHandler( + v18.UpgradeName, + v18.CreateUpgradeHandler( + app.mm, app.configurator, + ), + ) + // When a planned update height is reached, the old binary will panic // writing on disk the height and name of the update that triggered it // This will read that value, and execute the preparations for the upgrade. diff --git a/app/app_test.go b/app/app_test.go index c1038ac519..4e7fed63e6 100644 --- a/app/app_test.go +++ b/app/app_test.go @@ -21,8 +21,8 @@ import ( "github.com/cometbft/cometbft/libs/log" tmtypes "github.com/cometbft/cometbft/types" - "github.com/evmos/evmos/v17/encoding" - "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v18/encoding" + "github.com/evmos/evmos/v18/utils" ) func TestEvmosExport(t *testing.T) { diff --git a/app/ethtest_helper.go b/app/ethtest_helper.go index a95e4d7a53..ed631d5591 100644 --- a/app/ethtest_helper.go +++ b/app/ethtest_helper.go @@ -25,8 +25,8 @@ import ( tmtypes "github.com/cometbft/cometbft/proto/tendermint/types" cmtypes "github.com/cometbft/cometbft/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/encoding" - "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v18/encoding" + "github.com/evmos/evmos/v18/utils" ) // EthDefaultConsensusParams defines the default Tendermint consensus params used in diff --git a/app/export.go b/app/export.go index 4a75330c23..a45dfa5135 100644 --- a/app/export.go +++ b/app/export.go @@ -17,7 +17,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/staking" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v17/encoding" + "github.com/evmos/evmos/v18/encoding" ) // NewDefaultGenesisState generates the default state for the application. @@ -51,7 +51,7 @@ func (app *Evmos) ExportAppStateAndValidators( return servertypes.ExportedApp{}, err } - validators, err := staking.WriteValidators(ctx, &app.StakingKeeper) + validators, err := staking.WriteValidators(ctx, app.StakingKeeper.Keeper) if err != nil { return servertypes.ExportedApp{}, err } diff --git a/app/keys.go b/app/keys.go index 41aa4b16da..9a23270f05 100644 --- a/app/keys.go +++ b/app/keys.go @@ -22,12 +22,12 @@ import ( icahosttypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/host/types" ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" ibcexported "github.com/cosmos/ibc-go/v7/modules/core/exported" - epochstypes "github.com/evmos/evmos/v17/x/epochs/types" - erc20types "github.com/evmos/evmos/v17/x/erc20/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" - inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" - vestingtypes "github.com/evmos/evmos/v17/x/vesting/types" + epochstypes "github.com/evmos/evmos/v18/x/epochs/types" + erc20types "github.com/evmos/evmos/v18/x/erc20/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" + inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" + vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" ) // StoreKeys returns the application store keys, diff --git a/app/post/burn.go b/app/post/burn.go index 2d0387e718..2a7a9708f8 100644 --- a/app/post/burn.go +++ b/app/post/burn.go @@ -13,7 +13,7 @@ import ( errortypes "github.com/cosmos/cosmos-sdk/types/errors" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) var _ sdk.PostDecorator = &BurnDecorator{} diff --git a/app/post/burn_test.go b/app/post/burn_test.go index f8384aeb88..51b7cf9bbb 100644 --- a/app/post/burn_test.go +++ b/app/post/burn_test.go @@ -6,9 +6,9 @@ package post_test import ( sdkmath "cosmossdk.io/math" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/evmos/evmos/v17/app/post" + "github.com/evmos/evmos/v18/app/post" - // "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" + // "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" sdk "github.com/cosmos/cosmos-sdk/types" ) diff --git a/app/post/post_test.go b/app/post/post_test.go index 39eb7f6439..313a599f16 100644 --- a/app/post/post_test.go +++ b/app/post/post_test.go @@ -6,7 +6,7 @@ package post_test import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - "github.com/evmos/evmos/v17/app/post" + "github.com/evmos/evmos/v18/app/post" ) func (s *PostTestSuite) TestPostHandlerOptions() { diff --git a/app/post/setup_test.go b/app/post/setup_test.go index 8b95a82dbd..9be087b45d 100644 --- a/app/post/setup_test.go +++ b/app/post/setup_test.go @@ -14,11 +14,11 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v17/testutil/integration/evmos/network" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" - inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" + "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" + inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" "github.com/cosmos/cosmos-sdk/client" "github.com/stretchr/testify/suite" diff --git a/app/test_helpers.go b/app/test_helpers.go index aaca51e6eb..26dbbecd0b 100644 --- a/app/test_helpers.go +++ b/app/test_helpers.go @@ -27,11 +27,11 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v17/encoding" - feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" + "github.com/evmos/evmos/v18/encoding" + feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" - "github.com/evmos/evmos/v17/cmd/config" - "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v18/cmd/config" + "github.com/evmos/evmos/v18/utils" ) // DefaultTestingAppInit defines the IBC application used for testing diff --git a/app/upgrades/v16/incentives.go b/app/upgrades/v16/incentives.go index 0dde486f9e..c8fcfc8fe4 100644 --- a/app/upgrades/v16/incentives.go +++ b/app/upgrades/v16/incentives.go @@ -8,7 +8,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - inflationkeeper "github.com/evmos/evmos/v17/x/inflation/v1/keeper" + inflationkeeper "github.com/evmos/evmos/v18/x/inflation/v1/keeper" ) // BurnUsageIncentivesPool burns the entirety of the usage incentives pool diff --git a/app/upgrades/v16/proposals.go b/app/upgrades/v16/proposals.go index 027039b05d..17a1cda382 100644 --- a/app/upgrades/v16/proposals.go +++ b/app/upgrades/v16/proposals.go @@ -9,7 +9,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1" - incentives "github.com/evmos/evmos/v17/x/incentives/types" + incentives "github.com/evmos/evmos/v18/x/incentives/types" ) // DeleteIncentivesProposals deletes the RegisterIncentives & CancelIncentiveProposal proposals from the store diff --git a/app/upgrades/v16/setup_test.go b/app/upgrades/v16/setup_test.go index 38e222a183..0c3310077a 100644 --- a/app/upgrades/v16/setup_test.go +++ b/app/upgrades/v16/setup_test.go @@ -11,11 +11,11 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/stretchr/testify/suite" - "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" - "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v17/testutil/integration/evmos/network" - inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" + "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" + "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" ) type IntegrationTestSuite struct { diff --git a/app/upgrades/v16/upgrades.go b/app/upgrades/v16/upgrades.go index fb09d8d4f4..004aedc02b 100644 --- a/app/upgrades/v16/upgrades.go +++ b/app/upgrades/v16/upgrades.go @@ -9,13 +9,13 @@ import ( bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - "github.com/evmos/evmos/v17/precompiles/bech32" - osmosisoutpost "github.com/evmos/evmos/v17/precompiles/outposts/osmosis" - strideoutpost "github.com/evmos/evmos/v17/precompiles/outposts/stride" - "github.com/evmos/evmos/v17/precompiles/p256" - "github.com/evmos/evmos/v17/utils" - evmkeeper "github.com/evmos/evmos/v17/x/evm/keeper" - inflationkeeper "github.com/evmos/evmos/v17/x/inflation/v1/keeper" + "github.com/evmos/evmos/v18/precompiles/bech32" + osmosisoutpost "github.com/evmos/evmos/v18/precompiles/outposts/osmosis" + strideoutpost "github.com/evmos/evmos/v18/precompiles/outposts/stride" + "github.com/evmos/evmos/v18/precompiles/p256" + "github.com/evmos/evmos/v18/utils" + evmkeeper "github.com/evmos/evmos/v18/x/evm/keeper" + inflationkeeper "github.com/evmos/evmos/v18/x/inflation/v1/keeper" ) // CreateUpgradeHandler creates an SDK upgrade handler for v16.0.0 diff --git a/app/upgrades/v16/upgrades_test.go b/app/upgrades/v16/upgrades_test.go index d3d9fba2a8..3445a20048 100644 --- a/app/upgrades/v16/upgrades_test.go +++ b/app/upgrades/v16/upgrades_test.go @@ -13,13 +13,13 @@ import ( govtypesv1beta "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" upgrade "github.com/cosmos/cosmos-sdk/x/upgrade/types" - v16 "github.com/evmos/evmos/v17/app/upgrades/v16" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" - "github.com/evmos/evmos/v17/testutil" - testnetwork "github.com/evmos/evmos/v17/testutil/integration/evmos/network" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - "github.com/evmos/evmos/v17/utils" - incentives "github.com/evmos/evmos/v17/x/incentives/types" + v16 "github.com/evmos/evmos/v18/app/upgrades/v16" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + "github.com/evmos/evmos/v18/testutil" + testnetwork "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/utils" + incentives "github.com/evmos/evmos/v18/x/incentives/types" ) func (its *IntegrationTestSuite) TestFeeCollectorMigration() { diff --git a/app/upgrades/v18/constants.go b/app/upgrades/v18/constants.go new file mode 100644 index 0000000000..94dd2949f9 --- /dev/null +++ b/app/upgrades/v18/constants.go @@ -0,0 +1,11 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package v18 + +const ( + // UpgradeName is the shared upgrade plan name for mainnet + UpgradeName = "v18.0.0" + // UpgradeInfo defines the binaries that will be used for the upgrade + UpgradeInfo = `'{"binaries":{"darwin/amd64":"https://github.com/evmos/evmos/releases/download/v18.0.0/evmos_18.0.0_Darwin_arm64.tar.gz","darwin/x86_64":"https://github.com/evmos/evmos/releases/download/v18.0.0/evmos_18.0.0_Darwin_x86_64.tar.gz","linux/arm64":"https://github.com/evmos/evmos/releases/download/v18.0.0/evmos_18.0.0_Linux_arm64.tar.gz","linux/amd64":"https://github.com/evmos/evmos/releases/download/v18.0.0/evmos_18.0.0_Linux_amd64.tar.gz","windows/x86_64":"https://github.com/evmos/evmos/releases/download/v18.0.0/evmos_18.0.0_Windows_x86_64.zip"}}'` +) diff --git a/app/upgrades/v18/upgrades.go b/app/upgrades/v18/upgrades.go new file mode 100644 index 0000000000..fa42fda7f4 --- /dev/null +++ b/app/upgrades/v18/upgrades.go @@ -0,0 +1,21 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package v18 + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" +) + +// CreateUpgradeHandler creates an SDK upgrade handler for v18 +func CreateUpgradeHandler( + mm *module.Manager, + configurator module.Configurator, +) upgradetypes.UpgradeHandler { + return func(ctx sdk.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { + // Leave modules as-is to avoid running InitGenesis. + return mm.RunMigrations(ctx, configurator, vm) + } +} diff --git a/client/config.go b/client/config.go index fdab8c496a..c73cd70d47 100644 --- a/client/config.go +++ b/client/config.go @@ -14,7 +14,7 @@ import ( "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v18/types" ) // InitConfig adds the chain-id, encoding and output flags to the persistent flag set. diff --git a/client/debug/debug.go b/client/debug/debug.go index cff97571d2..8d5ede684b 100644 --- a/client/debug/debug.go +++ b/client/debug/debug.go @@ -9,8 +9,8 @@ import ( "strconv" "strings" - "github.com/evmos/evmos/v17/ethereum/eip712" - evmos "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v18/ethereum/eip712" + evmos "github.com/evmos/evmos/v18/types" "github.com/pkg/errors" "github.com/spf13/cobra" diff --git a/client/export.go b/client/export.go index 558230872d..dd14f6a826 100644 --- a/client/export.go +++ b/client/export.go @@ -15,8 +15,8 @@ import ( "github.com/spf13/cobra" "github.com/cosmos/cosmos-sdk/crypto/keyring" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" - "github.com/evmos/evmos/v17/crypto/hd" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + "github.com/evmos/evmos/v18/crypto/hd" ) // UnsafeExportEthKeyCommand exports a key with the given name as a private key in hex format. diff --git a/client/import.go b/client/import.go index 5558b6c7d8..e2b1e16566 100644 --- a/client/import.go +++ b/client/import.go @@ -11,9 +11,9 @@ import ( "github.com/cosmos/cosmos-sdk/client/input" "github.com/cosmos/cosmos-sdk/crypto" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" - "github.com/evmos/evmos/v17/crypto/hd" + "github.com/evmos/evmos/v18/crypto/hd" ) // UnsafeImportKeyCommand imports private keys from a keyfile. diff --git a/client/keys.go b/client/keys.go index a28723c458..6450721435 100644 --- a/client/keys.go +++ b/client/keys.go @@ -12,8 +12,8 @@ import ( "github.com/spf13/cobra" "github.com/cosmos/cosmos-sdk/crypto/keyring" - clientkeys "github.com/evmos/evmos/v17/client/keys" - "github.com/evmos/evmos/v17/crypto/hd" + clientkeys "github.com/evmos/evmos/v18/client/keys" + "github.com/evmos/evmos/v18/crypto/hd" ) // KeyCommands registers a sub-tree of commands to interact with diff --git a/client/keys/add.go b/client/keys/add.go index c17e547e59..fb8a0f166e 100644 --- a/client/keys/add.go +++ b/client/keys/add.go @@ -10,7 +10,7 @@ import ( "fmt" "sort" - cryptohd "github.com/evmos/evmos/v17/crypto/hd" + cryptohd "github.com/evmos/evmos/v18/crypto/hd" bip39 "github.com/cosmos/go-bip39" "github.com/spf13/cobra" diff --git a/client/testnet.go b/client/testnet.go index f4f2634f65..eaf0b21ab9 100644 --- a/client/testnet.go +++ b/client/testnet.go @@ -40,13 +40,13 @@ import ( mintypes "github.com/cosmos/cosmos-sdk/x/mint/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v17/crypto/hd" - "github.com/evmos/evmos/v17/server/config" - srvflags "github.com/evmos/evmos/v17/server/flags" - evmostypes "github.com/evmos/evmos/v17/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/crypto/hd" + "github.com/evmos/evmos/v18/server/config" + srvflags "github.com/evmos/evmos/v18/server/flags" + evmostypes "github.com/evmos/evmos/v18/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" - "github.com/evmos/evmos/v17/testutil/network" + "github.com/evmos/evmos/v18/testutil/network" ) var ( diff --git a/cmd/config/config.go b/cmd/config/config.go index 4e1a96cbf7..df57620be4 100644 --- a/cmd/config/config.go +++ b/cmd/config/config.go @@ -7,7 +7,7 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v18/types" ) const ( diff --git a/cmd/evmosd/cmd_test.go b/cmd/evmosd/cmd_test.go index 5f1146e97a..5953636889 100644 --- a/cmd/evmosd/cmd_test.go +++ b/cmd/evmosd/cmd_test.go @@ -9,9 +9,9 @@ import ( "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" "github.com/stretchr/testify/require" - "github.com/evmos/evmos/v17/app" - evmosd "github.com/evmos/evmos/v17/cmd/evmosd" - "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v18/app" + evmosd "github.com/evmos/evmos/v18/cmd/evmosd" + "github.com/evmos/evmos/v18/utils" ) func TestInitCmd(t *testing.T) { diff --git a/cmd/evmosd/genaccounts.go b/cmd/evmosd/genaccounts.go index 44201cedd2..4d83f7ec4c 100644 --- a/cmd/evmosd/genaccounts.go +++ b/cmd/evmosd/genaccounts.go @@ -23,13 +23,13 @@ import ( "github.com/cosmos/cosmos-sdk/x/genutil" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" - "github.com/evmos/evmos/v17/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" - evmoskr "github.com/evmos/evmos/v17/crypto/keyring" + evmoskr "github.com/evmos/evmos/v18/crypto/keyring" - vestingcli "github.com/evmos/evmos/v17/x/vesting/client/cli" - vestingtypes "github.com/evmos/evmos/v17/x/vesting/types" + vestingcli "github.com/evmos/evmos/v18/x/vesting/client/cli" + vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" ) const ( diff --git a/cmd/evmosd/main.go b/cmd/evmosd/main.go index 145c63f25c..439c1770f8 100644 --- a/cmd/evmosd/main.go +++ b/cmd/evmosd/main.go @@ -10,8 +10,8 @@ import ( svrcmd "github.com/cosmos/cosmos-sdk/server/cmd" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/app" - cmdcfg "github.com/evmos/evmos/v17/cmd/config" + "github.com/evmos/evmos/v18/app" + cmdcfg "github.com/evmos/evmos/v18/cmd/config" ) func main() { diff --git a/cmd/evmosd/migrate.go b/cmd/evmosd/migrate.go index 07318bf2d6..fe377f5114 100644 --- a/cmd/evmosd/migrate.go +++ b/cmd/evmosd/migrate.go @@ -19,7 +19,7 @@ import ( "github.com/cosmos/cosmos-sdk/version" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" - "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v18/utils" ) // FlagGenesisTime defines the genesis time in string format diff --git a/cmd/evmosd/root.go b/cmd/evmosd/root.go index b2904451d0..0eb5b4ae21 100644 --- a/cmd/evmosd/root.go +++ b/cmd/evmosd/root.go @@ -41,18 +41,18 @@ import ( genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" - evmosclient "github.com/evmos/evmos/v17/client" - "github.com/evmos/evmos/v17/client/block" - "github.com/evmos/evmos/v17/client/debug" - "github.com/evmos/evmos/v17/encoding" - "github.com/evmos/evmos/v17/ethereum/eip712" - evmosserver "github.com/evmos/evmos/v17/server" - servercfg "github.com/evmos/evmos/v17/server/config" - srvflags "github.com/evmos/evmos/v17/server/flags" - - "github.com/evmos/evmos/v17/app" - cmdcfg "github.com/evmos/evmos/v17/cmd/config" - evmoskr "github.com/evmos/evmos/v17/crypto/keyring" + evmosclient "github.com/evmos/evmos/v18/client" + "github.com/evmos/evmos/v18/client/block" + "github.com/evmos/evmos/v18/client/debug" + "github.com/evmos/evmos/v18/encoding" + "github.com/evmos/evmos/v18/ethereum/eip712" + evmosserver "github.com/evmos/evmos/v18/server" + servercfg "github.com/evmos/evmos/v18/server/config" + srvflags "github.com/evmos/evmos/v18/server/flags" + + "github.com/evmos/evmos/v18/app" + cmdcfg "github.com/evmos/evmos/v18/cmd/config" + evmoskr "github.com/evmos/evmos/v18/crypto/keyring" ) const ( diff --git a/cmd/evmosd/testnet.go b/cmd/evmosd/testnet.go index bfc4d85e8b..f35486b413 100644 --- a/cmd/evmosd/testnet.go +++ b/cmd/evmosd/testnet.go @@ -42,15 +42,15 @@ import ( govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - cmdcfg "github.com/evmos/evmos/v17/cmd/config" - "github.com/evmos/evmos/v17/crypto/hd" - evmoskr "github.com/evmos/evmos/v17/crypto/keyring" - "github.com/evmos/evmos/v17/server/config" - srvflags "github.com/evmos/evmos/v17/server/flags" - "github.com/evmos/evmos/v17/testutil/network" - evmostypes "github.com/evmos/evmos/v17/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" + cmdcfg "github.com/evmos/evmos/v18/cmd/config" + "github.com/evmos/evmos/v18/crypto/hd" + evmoskr "github.com/evmos/evmos/v18/crypto/keyring" + "github.com/evmos/evmos/v18/server/config" + srvflags "github.com/evmos/evmos/v18/server/flags" + "github.com/evmos/evmos/v18/testutil/network" + evmostypes "github.com/evmos/evmos/v18/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" ) var ( diff --git a/cmd/evmosd/versiondb.go b/cmd/evmosd/versiondb.go index 5021bcfe21..5cd206286d 100644 --- a/cmd/evmosd/versiondb.go +++ b/cmd/evmosd/versiondb.go @@ -13,8 +13,8 @@ import ( "github.com/spf13/cobra" versiondbclient "github.com/crypto-org-chain/cronos/versiondb/client" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/cmd/evmosd/opendb" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/cmd/evmosd/opendb" ) // ChangeSetCmd returns a Cobra command for interacting with change sets. diff --git a/contracts/erc20.go b/contracts/erc20.go index d464283aa4..292e257de4 100644 --- a/contracts/erc20.go +++ b/contracts/erc20.go @@ -8,9 +8,9 @@ import ( "encoding/json" "github.com/ethereum/go-ethereum/common" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" - "github.com/evmos/evmos/v17/x/erc20/types" + "github.com/evmos/evmos/v18/x/erc20/types" ) var ( diff --git a/contracts/erc20DirectBalanceManipulation.go b/contracts/erc20DirectBalanceManipulation.go index 74b29c76a9..48102f3df5 100644 --- a/contracts/erc20DirectBalanceManipulation.go +++ b/contracts/erc20DirectBalanceManipulation.go @@ -7,9 +7,9 @@ import ( "encoding/json" "github.com/ethereum/go-ethereum/common" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" - "github.com/evmos/evmos/v17/x/erc20/types" + "github.com/evmos/evmos/v18/x/erc20/types" ) // This is an evil token. Whenever an A -> B transfer is called, diff --git a/contracts/erc20burnable.go b/contracts/erc20burnable.go index d4bc2a47f9..f61840ed34 100644 --- a/contracts/erc20burnable.go +++ b/contracts/erc20burnable.go @@ -6,7 +6,7 @@ import ( _ "embed" // embed compiled smart contract "encoding/json" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) var ( diff --git a/contracts/erc20maliciousdelayed.go b/contracts/erc20maliciousdelayed.go index 8a25c0bae3..1045a73a63 100644 --- a/contracts/erc20maliciousdelayed.go +++ b/contracts/erc20maliciousdelayed.go @@ -7,9 +7,9 @@ import ( "encoding/json" "github.com/ethereum/go-ethereum/common" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" - "github.com/evmos/evmos/v17/x/erc20/types" + "github.com/evmos/evmos/v18/x/erc20/types" ) // This is an evil token. Whenever an A -> B transfer is called, diff --git a/contracts/flash_loan.go b/contracts/flash_loan.go index 333f2389db..367bc61f3a 100644 --- a/contracts/flash_loan.go +++ b/contracts/flash_loan.go @@ -7,7 +7,7 @@ import ( _ "embed" // embed compiled smart contract "encoding/json" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) var ( diff --git a/crypto/codec/amino.go b/crypto/codec/amino.go index 98e366992c..a1f3c7be21 100644 --- a/crypto/codec/amino.go +++ b/crypto/codec/amino.go @@ -8,7 +8,7 @@ import ( cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" "github.com/cosmos/cosmos-sdk/crypto/keyring" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" ) // RegisterCrypto registers all crypto dependency types with the provided Amino diff --git a/crypto/codec/codec.go b/crypto/codec/codec.go index 82b02ae571..8846562242 100644 --- a/crypto/codec/codec.go +++ b/crypto/codec/codec.go @@ -6,7 +6,7 @@ import ( codectypes "github.com/cosmos/cosmos-sdk/codec/types" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" ) // RegisterInterfaces register the Evmos key concrete types. diff --git a/crypto/ethsecp256k1/ethsecp256k1.go b/crypto/ethsecp256k1/ethsecp256k1.go index 6fa7eabd3c..17a3104444 100644 --- a/crypto/ethsecp256k1/ethsecp256k1.go +++ b/crypto/ethsecp256k1/ethsecp256k1.go @@ -15,7 +15,7 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v17/ethereum/eip712" + "github.com/evmos/evmos/v18/ethereum/eip712" ) const ( diff --git a/crypto/ethsecp256k1/keys.pb.go b/crypto/ethsecp256k1/keys.pb.go index 9a5fc7b529..55901b7b16 100644 --- a/crypto/ethsecp256k1/keys.pb.go +++ b/crypto/ethsecp256k1/keys.pb.go @@ -138,9 +138,9 @@ var fileDescriptor_0c10cadcf35beb64 = []byte{ 0x33, 0x28, 0x49, 0x73, 0xb1, 0x07, 0x14, 0x65, 0x96, 0x61, 0x55, 0xe2, 0xe4, 0x71, 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, 0x7a, 0xe9, 0x99, 0x25, 0x19, 0xa5, 0x49, 0x7a, - 0xc9, 0xf9, 0xb9, 0xfa, 0xa9, 0x65, 0xb9, 0xf9, 0xc5, 0x50, 0xb2, 0xcc, 0xd0, 0x1c, 0xe6, 0x1d, - 0x64, 0xe7, 0x25, 0xb1, 0x81, 0xdd, 0x63, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, 0x27, 0xb0, 0xec, - 0xd8, 0xf6, 0x00, 0x00, 0x00, + 0xc9, 0xf9, 0xb9, 0xfa, 0xa9, 0x65, 0xb9, 0xf9, 0xc5, 0x50, 0xb2, 0xcc, 0xd0, 0x02, 0xe6, 0x1d, + 0x64, 0xe7, 0x25, 0xb1, 0x81, 0xdd, 0x63, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, 0x38, 0x7c, 0x56, + 0x84, 0xf6, 0x00, 0x00, 0x00, } func (m *PubKey) Marshal() (dAtA []byte, err error) { diff --git a/crypto/hd/algorithm.go b/crypto/hd/algorithm.go index e05e5451b1..e5f6faf549 100644 --- a/crypto/hd/algorithm.go +++ b/crypto/hd/algorithm.go @@ -14,7 +14,7 @@ import ( "github.com/cosmos/cosmos-sdk/crypto/keyring" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" ) const ( diff --git a/crypto/hd/algorithm_test.go b/crypto/hd/algorithm_test.go index 10cf7bfb7f..723453de1d 100644 --- a/crypto/hd/algorithm_test.go +++ b/crypto/hd/algorithm_test.go @@ -13,9 +13,9 @@ import ( "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/crypto/keyring" - cryptocodec "github.com/evmos/evmos/v17/crypto/codec" - enccodec "github.com/evmos/evmos/v17/encoding/codec" - evmostypes "github.com/evmos/evmos/v17/types" + cryptocodec "github.com/evmos/evmos/v18/crypto/codec" + enccodec "github.com/evmos/evmos/v18/encoding/codec" + evmostypes "github.com/evmos/evmos/v18/types" ) var TestCodec amino.Codec diff --git a/crypto/hd/benchmark_test.go b/crypto/hd/benchmark_test.go index 9b8179bb96..ef9b37ecf4 100644 --- a/crypto/hd/benchmark_test.go +++ b/crypto/hd/benchmark_test.go @@ -4,7 +4,7 @@ import ( "testing" "github.com/cosmos/cosmos-sdk/crypto/keyring" - "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v18/types" ) func BenchmarkEthSecp256k1Algo_Derive(b *testing.B) { diff --git a/crypto/keyring/options.go b/crypto/keyring/options.go index 39f57bc88f..1644bd61a5 100644 --- a/crypto/keyring/options.go +++ b/crypto/keyring/options.go @@ -8,9 +8,9 @@ import ( cosmosLedger "github.com/cosmos/cosmos-sdk/crypto/ledger" "github.com/cosmos/cosmos-sdk/crypto/types" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" - "github.com/evmos/evmos/v17/crypto/hd" - "github.com/evmos/evmos/v17/wallets/ledger" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + "github.com/evmos/evmos/v18/crypto/hd" + "github.com/evmos/evmos/v18/wallets/ledger" ) // AppName defines the Ledger app used for signing. Evmos uses the Ethereum app diff --git a/encoding/codec/codec.go b/encoding/codec/codec.go index f16985c285..c455277ad0 100644 --- a/encoding/codec/codec.go +++ b/encoding/codec/codec.go @@ -8,8 +8,8 @@ import ( "github.com/cosmos/cosmos-sdk/std" sdk "github.com/cosmos/cosmos-sdk/types" - cryptocodec "github.com/evmos/evmos/v17/crypto/codec" - "github.com/evmos/evmos/v17/types" + cryptocodec "github.com/evmos/evmos/v18/crypto/codec" + "github.com/evmos/evmos/v18/types" ) // RegisterLegacyAminoCodec registers Interfaces from types, crypto, and SDK std. diff --git a/encoding/config.go b/encoding/config.go index e632a18bad..3551c23318 100644 --- a/encoding/config.go +++ b/encoding/config.go @@ -9,7 +9,7 @@ import ( "github.com/cosmos/cosmos-sdk/types/module" "github.com/cosmos/cosmos-sdk/x/auth/tx" - enccodec "github.com/evmos/evmos/v17/encoding/codec" + enccodec "github.com/evmos/evmos/v18/encoding/codec" ) // MakeConfig creates an EncodingConfig for testing diff --git a/encoding/config_test.go b/encoding/config_test.go index a43eeb537f..78067b5725 100644 --- a/encoding/config_test.go +++ b/encoding/config_test.go @@ -8,10 +8,10 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/encoding" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/encoding" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) func TestTxEncoding(t *testing.T) { diff --git a/ethereum/eip712/eip712_fuzzer_test.go b/ethereum/eip712/eip712_fuzzer_test.go index 15ffef4317..dae4eac648 100644 --- a/ethereum/eip712/eip712_fuzzer_test.go +++ b/ethereum/eip712/eip712_fuzzer_test.go @@ -6,7 +6,7 @@ import ( rand "github.com/cometbft/cometbft/libs/rand" - "github.com/evmos/evmos/v17/ethereum/eip712" + "github.com/evmos/evmos/v18/ethereum/eip712" "github.com/tidwall/gjson" "github.com/tidwall/sjson" ) diff --git a/ethereum/eip712/eip712_test.go b/ethereum/eip712/eip712_test.go index e226a89fe0..88474ffc8b 100644 --- a/ethereum/eip712/eip712_test.go +++ b/ethereum/eip712/eip712_test.go @@ -11,22 +11,22 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/signer/core/apitypes" - "github.com/evmos/evmos/v17/ethereum/eip712" + "github.com/evmos/evmos/v18/ethereum/eip712" "github.com/tidwall/gjson" "github.com/tidwall/sjson" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" 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/evmos/v17/app" - "github.com/evmos/evmos/v17/cmd/config" - "github.com/evmos/evmos/v17/encoding" - "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/cmd/config" + "github.com/evmos/evmos/v18/encoding" + "github.com/evmos/evmos/v18/utils" distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types" govtypesv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" diff --git a/ethereum/eip712/encoding.go b/ethereum/eip712/encoding.go index f180857e7d..09721bbc2a 100644 --- a/ethereum/eip712/encoding.go +++ b/ethereum/eip712/encoding.go @@ -13,7 +13,7 @@ import ( txTypes "github.com/cosmos/cosmos-sdk/types/tx" apitypes "github.com/ethereum/go-ethereum/signer/core/apitypes" - evmostypes "github.com/evmos/evmos/v17/types" + evmostypes "github.com/evmos/evmos/v18/types" "github.com/cosmos/cosmos-sdk/codec" ) diff --git a/ethereum/eip712/encoding_legacy.go b/ethereum/eip712/encoding_legacy.go index a8bd949c65..b7973ad377 100644 --- a/ethereum/eip712/encoding_legacy.go +++ b/ethereum/eip712/encoding_legacy.go @@ -13,7 +13,7 @@ import ( txTypes "github.com/cosmos/cosmos-sdk/types/tx" apitypes "github.com/ethereum/go-ethereum/signer/core/apitypes" - evmos "github.com/evmos/evmos/v17/types" + evmos "github.com/evmos/evmos/v18/types" ) type aminoMessage struct { diff --git a/ethereum/eip712/preprocess.go b/ethereum/eip712/preprocess.go index 21caf21305..3f9f71e359 100644 --- a/ethereum/eip712/preprocess.go +++ b/ethereum/eip712/preprocess.go @@ -10,7 +10,7 @@ import ( cosmoskr "github.com/cosmos/cosmos-sdk/crypto/keyring" "github.com/cosmos/cosmos-sdk/types/tx/signing" authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" - "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v18/types" ) // PreprocessLedgerTx reformats Ledger-signed Cosmos transactions to match the fork expected by Ethermint diff --git a/ethereum/eip712/preprocess_test.go b/ethereum/eip712/preprocess_test.go index a854110e6a..930d05b531 100644 --- a/ethereum/eip712/preprocess_test.go +++ b/ethereum/eip712/preprocess_test.go @@ -14,13 +14,13 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/ante" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/cmd/config" - "github.com/evmos/evmos/v17/encoding" - "github.com/evmos/evmos/v17/ethereum/eip712" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - "github.com/evmos/evmos/v17/types" - "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/cmd/config" + "github.com/evmos/evmos/v18/encoding" + "github.com/evmos/evmos/v18/ethereum/eip712" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v18/utils" "github.com/stretchr/testify/require" ) diff --git a/go.mod b/go.mod index 1a5823606e..d1eb255d6c 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/evmos/evmos/v17 +module github.com/evmos/evmos/v18 go 1.22.2 diff --git a/ibc/testing/app.go b/ibc/testing/app.go index 6376f26ffa..24a8bd6795 100644 --- a/ibc/testing/app.go +++ b/ibc/testing/app.go @@ -23,9 +23,9 @@ import ( ibcgotesting "github.com/cosmos/ibc-go/v7/testing" - evmosapp "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/types" - "github.com/evmos/evmos/v17/utils" + evmosapp "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v18/utils" ) // DefaultTestingAppInit is a test helper function used to initialize an App diff --git a/ibc/testing/chain.go b/ibc/testing/chain.go index d2a5d620c3..bd92969cf4 100644 --- a/ibc/testing/chain.go +++ b/ibc/testing/chain.go @@ -21,10 +21,10 @@ import ( ibcgotesting "github.com/cosmos/ibc-go/v7/testing" "github.com/cosmos/ibc-go/v7/testing/mock" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" - evmostypes "github.com/evmos/evmos/v17/types" - "github.com/evmos/evmos/v17/utils" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + evmostypes "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v18/utils" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) // ChainIDPrefix defines the default chain ID prefix for Evmos test chains diff --git a/ibc/testing/coordinator.go b/ibc/testing/coordinator.go index ddd98a4e09..767eeaaa45 100644 --- a/ibc/testing/coordinator.go +++ b/ibc/testing/coordinator.go @@ -14,7 +14,7 @@ import ( simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" sdk "github.com/cosmos/cosmos-sdk/types" ibctesting "github.com/cosmos/ibc-go/v7/testing" - "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v18/app" "github.com/stretchr/testify/require" ) diff --git a/ibc/utils.go b/ibc/utils.go index 652f698d54..613da291e1 100644 --- a/ibc/utils.go +++ b/ibc/utils.go @@ -13,9 +13,9 @@ import ( transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" - transferkeeper "github.com/evmos/evmos/v17/x/ibc/transfer/keeper" + transferkeeper "github.com/evmos/evmos/v18/x/ibc/transfer/keeper" - "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v18/utils" ) // GetTransferSenderRecipient returns the sender and recipient sdk.AccAddresses diff --git a/ibc/utils_test.go b/ibc/utils_test.go index 59374cc090..8a705f419f 100644 --- a/ibc/utils_test.go +++ b/ibc/utils_test.go @@ -11,7 +11,7 @@ import ( transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" ibctesting "github.com/cosmos/ibc-go/v7/testing" - teststypes "github.com/evmos/evmos/v17/types/tests" + teststypes "github.com/evmos/evmos/v18/types/tests" ) func init() { diff --git a/indexer/kv_indexer.go b/indexer/kv_indexer.go index e115b66c44..33033d60f7 100644 --- a/indexer/kv_indexer.go +++ b/indexer/kv_indexer.go @@ -15,9 +15,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authante "github.com/cosmos/cosmos-sdk/x/auth/ante" "github.com/ethereum/go-ethereum/common" - rpctypes "github.com/evmos/evmos/v17/rpc/types" - evmostypes "github.com/evmos/evmos/v17/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + rpctypes "github.com/evmos/evmos/v18/rpc/types" + evmostypes "github.com/evmos/evmos/v18/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) const ( diff --git a/indexer/kv_indexer_test.go b/indexer/kv_indexer_test.go index c46a5893de..cc568a61b3 100644 --- a/indexer/kv_indexer_test.go +++ b/indexer/kv_indexer_test.go @@ -12,13 +12,13 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" - evmenc "github.com/evmos/evmos/v17/encoding" - "github.com/evmos/evmos/v17/indexer" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - "github.com/evmos/evmos/v17/utils" - "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + evmenc "github.com/evmos/evmos/v18/encoding" + "github.com/evmos/evmos/v18/indexer" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v18/x/evm/types" "github.com/stretchr/testify/require" ) diff --git a/precompiles/authorization/events.go b/precompiles/authorization/events.go index 6574080e18..272d4c6dc2 100644 --- a/precompiles/authorization/events.go +++ b/precompiles/authorization/events.go @@ -12,7 +12,7 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v17/precompiles/common" + cmn "github.com/evmos/evmos/v18/precompiles/common" ) const ( diff --git a/precompiles/authorization/types.go b/precompiles/authorization/types.go index 92e59252ae..ff9f6f27d8 100644 --- a/precompiles/authorization/types.go +++ b/precompiles/authorization/types.go @@ -16,7 +16,7 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - cmn "github.com/evmos/evmos/v17/precompiles/common" + cmn "github.com/evmos/evmos/v18/precompiles/common" ) const ( diff --git a/precompiles/authorization/types_test.go b/precompiles/authorization/types_test.go index 089f20b094..c9cec375b9 100644 --- a/precompiles/authorization/types_test.go +++ b/precompiles/authorization/types_test.go @@ -5,12 +5,12 @@ import ( "testing" "cosmossdk.io/math" - "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v18/utils" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v17/precompiles/authorization" - cmn "github.com/evmos/evmos/v17/precompiles/common" - testutiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v18/precompiles/authorization" + cmn "github.com/evmos/evmos/v18/precompiles/common" + testutiltx "github.com/evmos/evmos/v18/testutil/tx" "github.com/stretchr/testify/require" ) diff --git a/precompiles/bank/bank.go b/precompiles/bank/bank.go index cc23fdb7e1..0857e1594d 100644 --- a/precompiles/bank/bank.go +++ b/precompiles/bank/bank.go @@ -11,8 +11,8 @@ import ( bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v17/precompiles/common" - erc20keeper "github.com/evmos/evmos/v17/x/erc20/keeper" + cmn "github.com/evmos/evmos/v18/precompiles/common" + erc20keeper "github.com/evmos/evmos/v18/x/erc20/keeper" ) const ( diff --git a/precompiles/bank/integration_test.go b/precompiles/bank/integration_test.go index 7eb20d644e..d4cca5f5cc 100644 --- a/precompiles/bank/integration_test.go +++ b/precompiles/bank/integration_test.go @@ -4,24 +4,24 @@ import ( "math/big" "testing" - "github.com/evmos/evmos/v17/precompiles/bank/testdata" + "github.com/evmos/evmos/v18/precompiles/bank/testdata" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" - "github.com/evmos/evmos/v17/testutil/integration/evmos/network" - "github.com/evmos/evmos/v17/utils" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" - inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" + "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" + "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + "github.com/evmos/evmos/v18/utils" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" + inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" - evmosutiltx "github.com/evmos/evmos/v17/testutil/tx" + evmosutiltx "github.com/evmos/evmos/v18/testutil/tx" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/precompiles/bank" + "github.com/evmos/evmos/v18/precompiles/bank" - "github.com/evmos/evmos/v17/precompiles/testutil" - "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v18/precompiles/testutil" + "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" diff --git a/precompiles/bank/query_test.go b/precompiles/bank/query_test.go index 31e901bacc..66b461f379 100644 --- a/precompiles/bank/query_test.go +++ b/precompiles/bank/query_test.go @@ -4,8 +4,8 @@ import ( "math/big" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/precompiles/bank" - evmosutiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v18/precompiles/bank" + evmosutiltx "github.com/evmos/evmos/v18/testutil/tx" ) func (s *PrecompileTestSuite) TestBalances() { diff --git a/precompiles/bank/setup_test.go b/precompiles/bank/setup_test.go index 0a74f0a42f..8f51132daf 100644 --- a/precompiles/bank/setup_test.go +++ b/precompiles/bank/setup_test.go @@ -5,15 +5,15 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" - inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" + inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v17/precompiles/bank" - "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v17/testutil/integration/evmos/network" + "github.com/evmos/evmos/v18/precompiles/bank" + "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v18/testutil/integration/evmos/network" "github.com/stretchr/testify/suite" ) diff --git a/precompiles/bank/testdata/bank.go b/precompiles/bank/testdata/bank.go index c2c28cdfd6..c42a4bf046 100644 --- a/precompiles/bank/testdata/bank.go +++ b/precompiles/bank/testdata/bank.go @@ -7,7 +7,7 @@ import ( _ "embed" // embed compiled smart contract "encoding/json" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) var ( diff --git a/precompiles/bank/types.go b/precompiles/bank/types.go index c082a5d2cf..caa959df32 100644 --- a/precompiles/bank/types.go +++ b/precompiles/bank/types.go @@ -9,7 +9,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - cmn "github.com/evmos/evmos/v17/precompiles/common" + cmn "github.com/evmos/evmos/v18/precompiles/common" ) // Balance contains the amount for a corresponding ERC-20 contract address diff --git a/precompiles/bank/utils_test.go b/precompiles/bank/utils_test.go index b07c906ee4..b794c083d7 100644 --- a/precompiles/bank/utils_test.go +++ b/precompiles/bank/utils_test.go @@ -6,10 +6,10 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v17/precompiles/bank" - "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" - inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" + "github.com/evmos/evmos/v18/precompiles/bank" + "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" + inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/gomega" diff --git a/precompiles/bech32/bech32.go b/precompiles/bech32/bech32.go index a9ae33da5b..a2f5cb954b 100644 --- a/precompiles/bech32/bech32.go +++ b/precompiles/bech32/bech32.go @@ -10,7 +10,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v17/precompiles/common" + cmn "github.com/evmos/evmos/v18/precompiles/common" ) var _ vm.PrecompiledContract = &Precompile{} diff --git a/precompiles/bech32/bech32_test.go b/precompiles/bech32/bech32_test.go index a6aaed5bcf..6bc24db9e4 100644 --- a/precompiles/bech32/bech32_test.go +++ b/precompiles/bech32/bech32_test.go @@ -6,8 +6,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v17/cmd/config" - "github.com/evmos/evmos/v17/precompiles/bech32" + "github.com/evmos/evmos/v18/cmd/config" + "github.com/evmos/evmos/v18/precompiles/bech32" ) func (s *PrecompileTestSuite) TestNewPrecompile() { diff --git a/precompiles/bech32/methods.go b/precompiles/bech32/methods.go index 5a39d5447c..61fdb20a0d 100644 --- a/precompiles/bech32/methods.go +++ b/precompiles/bech32/methods.go @@ -10,7 +10,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - cmn "github.com/evmos/evmos/v17/precompiles/common" + cmn "github.com/evmos/evmos/v18/precompiles/common" ) const ( diff --git a/precompiles/bech32/methods_test.go b/precompiles/bech32/methods_test.go index 1dfccc4a98..0a6fc083bf 100644 --- a/precompiles/bech32/methods_test.go +++ b/precompiles/bech32/methods_test.go @@ -5,9 +5,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v17/cmd/config" - "github.com/evmos/evmos/v17/precompiles/bech32" - cmn "github.com/evmos/evmos/v17/precompiles/common" + "github.com/evmos/evmos/v18/cmd/config" + "github.com/evmos/evmos/v18/precompiles/bech32" + cmn "github.com/evmos/evmos/v18/precompiles/common" ) func (s *PrecompileTestSuite) TestHexToBech32() { diff --git a/precompiles/bech32/setup_test.go b/precompiles/bech32/setup_test.go index e258045936..7ffcbdb859 100644 --- a/precompiles/bech32/setup_test.go +++ b/precompiles/bech32/setup_test.go @@ -3,10 +3,10 @@ package bech32_test import ( "testing" - "github.com/evmos/evmos/v17/precompiles/bech32" + "github.com/evmos/evmos/v18/precompiles/bech32" - testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v17/testutil/integration/evmos/network" + testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v18/testutil/integration/evmos/network" "github.com/stretchr/testify/suite" ) diff --git a/precompiles/common/precompile.go b/precompiles/common/precompile.go index 7eeaec904a..1c5d9ade7a 100644 --- a/precompiles/common/precompile.go +++ b/precompiles/common/precompile.go @@ -11,7 +11,7 @@ import ( authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v17/x/evm/statedb" + "github.com/evmos/evmos/v18/x/evm/statedb" ) // Precompile is a common struct for all precompiles that holds the common data each diff --git a/precompiles/common/types.go b/precompiles/common/types.go index 5e20120cd0..b68d2b6f2b 100644 --- a/precompiles/common/types.go +++ b/precompiles/common/types.go @@ -11,7 +11,7 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - evmosutils "github.com/evmos/evmos/v17/utils" + evmosutils "github.com/evmos/evmos/v18/utils" ) var ( diff --git a/precompiles/common/types_test.go b/precompiles/common/types_test.go index 0aac9dd157..1407994697 100644 --- a/precompiles/common/types_test.go +++ b/precompiles/common/types_test.go @@ -5,8 +5,8 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/precompiles/common" - "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/utils" "github.com/stretchr/testify/require" ) diff --git a/precompiles/distribution/distribution.go b/precompiles/distribution/distribution.go index ee00a97d4a..7486c36219 100644 --- a/precompiles/distribution/distribution.go +++ b/precompiles/distribution/distribution.go @@ -8,15 +8,14 @@ import ( "embed" "fmt" - stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" - storetypes "github.com/cosmos/cosmos-sdk/store/types" authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" distributionkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v17/precompiles/common" + cmn "github.com/evmos/evmos/v18/precompiles/common" + stakingkeeper "github.com/evmos/evmos/v18/x/staking/keeper" ) var _ vm.PrecompiledContract = &Precompile{} diff --git a/precompiles/distribution/distribution_test.go b/precompiles/distribution/distribution_test.go index be4b9c1483..0a89b32aa9 100644 --- a/precompiles/distribution/distribution_test.go +++ b/precompiles/distribution/distribution_test.go @@ -9,10 +9,10 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/precompiles/distribution" - "github.com/evmos/evmos/v17/utils" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/precompiles/distribution" + "github.com/evmos/evmos/v18/utils" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) func (s *PrecompileTestSuite) TestIsTransaction() { diff --git a/precompiles/distribution/events.go b/precompiles/distribution/events.go index 5be5faac34..90bff124a1 100644 --- a/precompiles/distribution/events.go +++ b/precompiles/distribution/events.go @@ -12,7 +12,7 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v17/precompiles/common" + cmn "github.com/evmos/evmos/v18/precompiles/common" ) const ( diff --git a/precompiles/distribution/events_test.go b/precompiles/distribution/events_test.go index ca884ceff1..35cad44f3c 100644 --- a/precompiles/distribution/events_test.go +++ b/precompiles/distribution/events_test.go @@ -9,9 +9,9 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" - cmn "github.com/evmos/evmos/v17/precompiles/common" - "github.com/evmos/evmos/v17/precompiles/distribution" - "github.com/evmos/evmos/v17/utils" + cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/precompiles/distribution" + "github.com/evmos/evmos/v18/utils" ) func (s *PrecompileTestSuite) TestSetWithdrawAddressEvent() { diff --git a/precompiles/distribution/integration_test.go b/precompiles/distribution/integration_test.go index 9c437bb8c8..653de81ade 100644 --- a/precompiles/distribution/integration_test.go +++ b/precompiles/distribution/integration_test.go @@ -6,7 +6,7 @@ import ( "fmt" "math/big" - "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v18/utils" "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" @@ -15,12 +15,12 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v17/precompiles/common" - "github.com/evmos/evmos/v17/precompiles/distribution" - "github.com/evmos/evmos/v17/precompiles/testutil" - "github.com/evmos/evmos/v17/precompiles/testutil/contracts" - evmosutil "github.com/evmos/evmos/v17/testutil" - testutiltx "github.com/evmos/evmos/v17/testutil/tx" + cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/precompiles/distribution" + "github.com/evmos/evmos/v18/precompiles/testutil" + "github.com/evmos/evmos/v18/precompiles/testutil/contracts" + evmosutil "github.com/evmos/evmos/v18/testutil" + testutiltx "github.com/evmos/evmos/v18/testutil/tx" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" @@ -204,7 +204,7 @@ var _ = Describe("Calling distribution precompile from EOA", func() { // create a validator with s.address and s.privKey because this account is // used for signing txs stakeAmt = math.NewInt(100) - testutil.CreateValidator(s.ctx, s.T(), s.privKey.PubKey(), s.app.StakingKeeper, stakeAmt) + testutil.CreateValidator(s.ctx, s.T(), s.privKey.PubKey(), *s.app.StakingKeeper.Keeper, stakeAmt) // set some validator commission valAddr = s.address.Bytes() @@ -793,7 +793,7 @@ var _ = Describe("Calling distribution precompile from another contract", func() // used for signing txs valAddr = s.address.Bytes() stakeAmt := math.NewInt(100) - testutil.CreateValidator(s.ctx, s.T(), s.privKey.PubKey(), s.app.StakingKeeper, stakeAmt) + testutil.CreateValidator(s.ctx, s.T(), s.privKey.PubKey(), *s.app.StakingKeeper.Keeper, stakeAmt) // set some commissions to validators var valAddresses []sdk.ValAddress diff --git a/precompiles/distribution/query.go b/precompiles/distribution/query.go index b713e72471..c49e230b23 100644 --- a/precompiles/distribution/query.go +++ b/precompiles/distribution/query.go @@ -8,7 +8,7 @@ import ( distributionkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v17/precompiles/common" + cmn "github.com/evmos/evmos/v18/precompiles/common" ) const ( diff --git a/precompiles/distribution/query_test.go b/precompiles/distribution/query_test.go index 74e7288af4..0de2a65979 100644 --- a/precompiles/distribution/query_test.go +++ b/precompiles/distribution/query_test.go @@ -12,11 +12,11 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v17/testutil" - testutiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v18/testutil" + testutiltx "github.com/evmos/evmos/v18/testutil/tx" - cmn "github.com/evmos/evmos/v17/precompiles/common" - "github.com/evmos/evmos/v17/precompiles/distribution" + cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/precompiles/distribution" ) var ( diff --git a/precompiles/distribution/setup_test.go b/precompiles/distribution/setup_test.go index 92ac79152d..54cff3a8b5 100644 --- a/precompiles/distribution/setup_test.go +++ b/precompiles/distribution/setup_test.go @@ -3,8 +3,8 @@ package distribution_test import ( "testing" - "github.com/evmos/evmos/v17/precompiles/distribution" - "github.com/evmos/evmos/v17/x/evm/statedb" + "github.com/evmos/evmos/v18/precompiles/distribution" + "github.com/evmos/evmos/v18/x/evm/statedb" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" @@ -18,8 +18,8 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - evmosapp "github.com/evmos/evmos/v17/app" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmosapp "github.com/evmos/evmos/v18/app" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" "github.com/stretchr/testify/suite" ) diff --git a/precompiles/distribution/tx.go b/precompiles/distribution/tx.go index 0b293dbbf6..52d736277a 100644 --- a/precompiles/distribution/tx.go +++ b/precompiles/distribution/tx.go @@ -6,9 +6,9 @@ package distribution import ( "fmt" - "github.com/evmos/evmos/v17/x/evm/statedb" + "github.com/evmos/evmos/v18/x/evm/statedb" - cmn "github.com/evmos/evmos/v17/precompiles/common" + cmn "github.com/evmos/evmos/v18/precompiles/common" "github.com/ethereum/go-ethereum/common" diff --git a/precompiles/distribution/tx_test.go b/precompiles/distribution/tx_test.go index e008b56310..9e92f6cc84 100644 --- a/precompiles/distribution/tx_test.go +++ b/precompiles/distribution/tx_test.go @@ -6,16 +6,16 @@ import ( "cosmossdk.io/math" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v17/precompiles/testutil" + "github.com/evmos/evmos/v18/precompiles/testutil" "github.com/ethereum/go-ethereum/common" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/distribution/types" - cmn "github.com/evmos/evmos/v17/precompiles/common" - "github.com/evmos/evmos/v17/precompiles/distribution" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - "github.com/evmos/evmos/v17/utils" + cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/precompiles/distribution" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/utils" ) func (s *PrecompileTestSuite) TestSetWithdrawAddress() { diff --git a/precompiles/distribution/types.go b/precompiles/distribution/types.go index 770235b5c8..96481d726b 100644 --- a/precompiles/distribution/types.go +++ b/precompiles/distribution/types.go @@ -13,7 +13,7 @@ import ( distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - cmn "github.com/evmos/evmos/v17/precompiles/common" + cmn "github.com/evmos/evmos/v18/precompiles/common" ) // EventSetWithdrawAddress defines the event data for the SetWithdrawAddress transaction. diff --git a/precompiles/distribution/utils_test.go b/precompiles/distribution/utils_test.go index af31919851..4530cc4491 100644 --- a/precompiles/distribution/utils_test.go +++ b/precompiles/distribution/utils_test.go @@ -20,16 +20,16 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - evmosapp "github.com/evmos/evmos/v17/app" - cmn "github.com/evmos/evmos/v17/precompiles/common" - "github.com/evmos/evmos/v17/precompiles/distribution" - evmosutil "github.com/evmos/evmos/v17/testutil" - evmosutiltx "github.com/evmos/evmos/v17/testutil/tx" - evmostypes "github.com/evmos/evmos/v17/types" - "github.com/evmos/evmos/v17/utils" - "github.com/evmos/evmos/v17/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" - inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" + evmosapp "github.com/evmos/evmos/v18/app" + cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/precompiles/distribution" + evmosutil "github.com/evmos/evmos/v18/testutil" + evmosutiltx "github.com/evmos/evmos/v18/testutil/tx" + evmostypes "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v18/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" + inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" ) // SetupWithGenesisValSet initializes a new EvmosApp with a validator set and genesis accounts @@ -243,7 +243,7 @@ func (s *PrecompileTestSuite) prepareStakingRewards(stkRs ...stakingRewards) { s.Require().NoError(err) // end block to bond validator and increase block height - sdkstaking.EndBlocker(s.ctx, &s.app.StakingKeeper) + sdkstaking.EndBlocker(s.ctx, s.app.StakingKeeper.Keeper) // allocate rewards to validator (of these 50% will be paid out to the delegator) allocatedRewards := sdk.NewDecCoins(sdk.NewDecCoin(s.bondDenom, r.RewardAmt.Mul(math.NewInt(2)))) s.app.DistrKeeper.AllocateTokensToValidator(s.ctx, r.Validator, allocatedRewards) diff --git a/precompiles/erc20/approve.go b/precompiles/erc20/approve.go index 0641571160..cfd6b67970 100644 --- a/precompiles/erc20/approve.go +++ b/precompiles/erc20/approve.go @@ -18,8 +18,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - auth "github.com/evmos/evmos/v17/precompiles/authorization" - cmn "github.com/evmos/evmos/v17/precompiles/common" + auth "github.com/evmos/evmos/v18/precompiles/authorization" + cmn "github.com/evmos/evmos/v18/precompiles/common" ) // Approve sets the given amount as the allowance of the spender address over diff --git a/precompiles/erc20/approve_test.go b/precompiles/erc20/approve_test.go index e4d52b4a39..22f92a7cd4 100644 --- a/precompiles/erc20/approve_test.go +++ b/precompiles/erc20/approve_test.go @@ -10,10 +10,10 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v17/precompiles/authorization" - cmn "github.com/evmos/evmos/v17/precompiles/common" - "github.com/evmos/evmos/v17/precompiles/erc20" - "github.com/evmos/evmos/v17/precompiles/testutil" + "github.com/evmos/evmos/v18/precompiles/authorization" + cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/precompiles/erc20" + "github.com/evmos/evmos/v18/precompiles/testutil" ) //nolint:dupl // tests are not duplicate between the functions diff --git a/precompiles/erc20/erc20.go b/precompiles/erc20/erc20.go index c2c81907f3..9235465a24 100644 --- a/precompiles/erc20/erc20.go +++ b/precompiles/erc20/erc20.go @@ -7,7 +7,7 @@ import ( "embed" "fmt" - cmn "github.com/evmos/evmos/v17/precompiles/common" + cmn "github.com/evmos/evmos/v18/precompiles/common" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" @@ -17,9 +17,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - auth "github.com/evmos/evmos/v17/precompiles/authorization" - erc20types "github.com/evmos/evmos/v17/x/erc20/types" - transferkeeper "github.com/evmos/evmos/v17/x/ibc/transfer/keeper" + auth "github.com/evmos/evmos/v18/precompiles/authorization" + erc20types "github.com/evmos/evmos/v18/x/erc20/types" + transferkeeper "github.com/evmos/evmos/v18/x/ibc/transfer/keeper" ) const ( diff --git a/precompiles/erc20/erc20_test.go b/precompiles/erc20/erc20_test.go index fd815a5bff..908f536057 100644 --- a/precompiles/erc20/erc20_test.go +++ b/precompiles/erc20/erc20_test.go @@ -6,8 +6,8 @@ package erc20_test import ( "math/big" - auth "github.com/evmos/evmos/v17/precompiles/authorization" - "github.com/evmos/evmos/v17/precompiles/erc20" + auth "github.com/evmos/evmos/v18/precompiles/authorization" + "github.com/evmos/evmos/v18/precompiles/erc20" ) func (s *PrecompileTestSuite) TestIsTransaction() { diff --git a/precompiles/erc20/errors.go b/precompiles/erc20/errors.go index 02073d023d..bc02f1e68a 100644 --- a/precompiles/erc20/errors.go +++ b/precompiles/erc20/errors.go @@ -11,9 +11,9 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v17/ibc" - cmn "github.com/evmos/evmos/v17/precompiles/common" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/ibc" + cmn "github.com/evmos/evmos/v18/precompiles/common" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) // Errors that have formatted information are defined here as a string. diff --git a/precompiles/erc20/errors_test.go b/precompiles/erc20/errors_test.go index 1ac6980922..431bb8f31b 100644 --- a/precompiles/erc20/errors_test.go +++ b/precompiles/erc20/errors_test.go @@ -1,8 +1,8 @@ package erc20_test import ( - "github.com/evmos/evmos/v17/precompiles/erc20" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/precompiles/erc20" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) // TODO: This is not yet producing the correct reason bytes so we skip this test for now, diff --git a/precompiles/erc20/events.go b/precompiles/erc20/events.go index 7291cf2b9b..b4b05927b9 100644 --- a/precompiles/erc20/events.go +++ b/precompiles/erc20/events.go @@ -13,8 +13,8 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" - auth "github.com/evmos/evmos/v17/precompiles/authorization" - cmn "github.com/evmos/evmos/v17/precompiles/common" + auth "github.com/evmos/evmos/v18/precompiles/authorization" + cmn "github.com/evmos/evmos/v18/precompiles/common" ) const ( diff --git a/precompiles/erc20/events_test.go b/precompiles/erc20/events_test.go index 1c8ad90bbd..ca66cf80f7 100644 --- a/precompiles/erc20/events_test.go +++ b/precompiles/erc20/events_test.go @@ -5,10 +5,10 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v17/precompiles/authorization" - cmn "github.com/evmos/evmos/v17/precompiles/common" - erc20precompile "github.com/evmos/evmos/v17/precompiles/erc20" - utiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v18/precompiles/authorization" + cmn "github.com/evmos/evmos/v18/precompiles/common" + erc20precompile "github.com/evmos/evmos/v18/precompiles/erc20" + utiltx "github.com/evmos/evmos/v18/testutil/tx" ) //nolint:dupl // this is not a duplicate of the approval events test diff --git a/precompiles/erc20/integration_test.go b/precompiles/erc20/integration_test.go index badc156492..d5ec3970b0 100644 --- a/precompiles/erc20/integration_test.go +++ b/precompiles/erc20/integration_test.go @@ -10,19 +10,19 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v17/contracts" - auth "github.com/evmos/evmos/v17/precompiles/authorization" - "github.com/evmos/evmos/v17/precompiles/erc20" - "github.com/evmos/evmos/v17/precompiles/erc20/testdata" - "github.com/evmos/evmos/v17/precompiles/testutil" - "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" - "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v17/testutil/integration/evmos/network" - "github.com/evmos/evmos/v17/testutil/integration/evmos/utils" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - erc20types "github.com/evmos/evmos/v17/x/erc20/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/contracts" + auth "github.com/evmos/evmos/v18/precompiles/authorization" + "github.com/evmos/evmos/v18/precompiles/erc20" + "github.com/evmos/evmos/v18/precompiles/erc20/testdata" + "github.com/evmos/evmos/v18/precompiles/testutil" + "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" + "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + "github.com/evmos/evmos/v18/testutil/integration/evmos/utils" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + erc20types "github.com/evmos/evmos/v18/x/erc20/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" diff --git a/precompiles/erc20/query.go b/precompiles/erc20/query.go index 5baf69cf9d..932fe07d17 100644 --- a/precompiles/erc20/query.go +++ b/precompiles/erc20/query.go @@ -15,8 +15,8 @@ import ( "github.com/cosmos/cosmos-sdk/x/authz" authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/evmos/evmos/v17/ibc" - auth "github.com/evmos/evmos/v17/precompiles/authorization" + "github.com/evmos/evmos/v18/ibc" + auth "github.com/evmos/evmos/v18/precompiles/authorization" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" diff --git a/precompiles/erc20/query_test.go b/precompiles/erc20/query_test.go index 252004a9c9..a6a13d72a5 100644 --- a/precompiles/erc20/query_test.go +++ b/precompiles/erc20/query_test.go @@ -13,11 +13,11 @@ import ( "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v17/app" - auth "github.com/evmos/evmos/v17/precompiles/authorization" - "github.com/evmos/evmos/v17/precompiles/erc20" - "github.com/evmos/evmos/v17/testutil" - inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" + "github.com/evmos/evmos/v18/app" + auth "github.com/evmos/evmos/v18/precompiles/authorization" + "github.com/evmos/evmos/v18/precompiles/erc20" + "github.com/evmos/evmos/v18/testutil" + inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" ) // Define useful variables for tests here. diff --git a/precompiles/erc20/setup_test.go b/precompiles/erc20/setup_test.go index 6c5d963e98..da83a01240 100644 --- a/precompiles/erc20/setup_test.go +++ b/precompiles/erc20/setup_test.go @@ -3,11 +3,11 @@ package erc20_test import ( "testing" - erc20precompile "github.com/evmos/evmos/v17/precompiles/erc20" - "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v17/testutil/integration/evmos/network" + erc20precompile "github.com/evmos/evmos/v18/precompiles/erc20" + "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v18/testutil/integration/evmos/network" "github.com/stretchr/testify/suite" ) diff --git a/precompiles/erc20/testdata/erc20_allowance_caller.go b/precompiles/erc20/testdata/erc20_allowance_caller.go index 82850539a5..4700e691f5 100644 --- a/precompiles/erc20/testdata/erc20_allowance_caller.go +++ b/precompiles/erc20/testdata/erc20_allowance_caller.go @@ -7,7 +7,7 @@ import ( _ "embed" // embed compiled smart contract "encoding/json" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) var ( diff --git a/precompiles/erc20/testdata/erc20_no_metadata.go b/precompiles/erc20/testdata/erc20_no_metadata.go index 0da82be27a..3611312ed6 100644 --- a/precompiles/erc20/testdata/erc20_no_metadata.go +++ b/precompiles/erc20/testdata/erc20_no_metadata.go @@ -8,9 +8,9 @@ import ( "encoding/json" "github.com/ethereum/go-ethereum/common" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" - "github.com/evmos/evmos/v17/x/erc20/types" + "github.com/evmos/evmos/v18/x/erc20/types" ) var ( diff --git a/precompiles/erc20/testdata/erc20minter_openzeppelinv5.go b/precompiles/erc20/testdata/erc20minter_openzeppelinv5.go index 1bbf8f7455..8937e8705f 100644 --- a/precompiles/erc20/testdata/erc20minter_openzeppelinv5.go +++ b/precompiles/erc20/testdata/erc20minter_openzeppelinv5.go @@ -8,9 +8,9 @@ import ( "encoding/json" "github.com/ethereum/go-ethereum/common" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" - "github.com/evmos/evmos/v17/x/erc20/types" + "github.com/evmos/evmos/v18/x/erc20/types" ) var ( diff --git a/precompiles/erc20/tx_test.go b/precompiles/erc20/tx_test.go index 4381815356..bf5617af1b 100644 --- a/precompiles/erc20/tx_test.go +++ b/precompiles/erc20/tx_test.go @@ -8,10 +8,10 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v17/precompiles/erc20" - "github.com/evmos/evmos/v17/precompiles/testutil" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - erc20types "github.com/evmos/evmos/v17/x/erc20/types" + "github.com/evmos/evmos/v18/precompiles/erc20" + "github.com/evmos/evmos/v18/precompiles/testutil" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + erc20types "github.com/evmos/evmos/v18/x/erc20/types" ) var ( diff --git a/precompiles/erc20/types_test.go b/precompiles/erc20/types_test.go index 53b28b3d6c..fb698f6b76 100644 --- a/precompiles/erc20/types_test.go +++ b/precompiles/erc20/types_test.go @@ -3,8 +3,8 @@ package erc20_test import ( "math/big" - "github.com/evmos/evmos/v17/precompiles/erc20" - utiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v18/precompiles/erc20" + utiltx "github.com/evmos/evmos/v18/testutil/tx" ) //nolint:dupl // these tests are not duplicates diff --git a/precompiles/erc20/utils_test.go b/precompiles/erc20/utils_test.go index cb68bfa16a..c278bf2b1e 100644 --- a/precompiles/erc20/utils_test.go +++ b/precompiles/erc20/utils_test.go @@ -13,16 +13,16 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - auth "github.com/evmos/evmos/v17/precompiles/authorization" - "github.com/evmos/evmos/v17/precompiles/erc20" - "github.com/evmos/evmos/v17/precompiles/testutil" - commonfactory "github.com/evmos/evmos/v17/testutil/integration/common/factory" - commonnetwork "github.com/evmos/evmos/v17/testutil/integration/common/network" - "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" - network "github.com/evmos/evmos/v17/testutil/integration/evmos/network" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - erc20types "github.com/evmos/evmos/v17/x/erc20/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + auth "github.com/evmos/evmos/v18/precompiles/authorization" + "github.com/evmos/evmos/v18/precompiles/erc20" + "github.com/evmos/evmos/v18/precompiles/testutil" + commonfactory "github.com/evmos/evmos/v18/testutil/integration/common/factory" + commonnetwork "github.com/evmos/evmos/v18/testutil/integration/common/network" + "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" + network "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + erc20types "github.com/evmos/evmos/v18/x/erc20/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" //nolint:revive // dot imports are fine for Gomega . "github.com/onsi/gomega" diff --git a/precompiles/ics20/approve.go b/precompiles/ics20/approve.go index 01bcbaefd8..fb91a4f1af 100644 --- a/precompiles/ics20/approve.go +++ b/precompiles/ics20/approve.go @@ -8,7 +8,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v17/precompiles/authorization" + "github.com/evmos/evmos/v18/precompiles/authorization" ) // Approve implements the ICS20 approve transactions. diff --git a/precompiles/ics20/approve_common.go b/precompiles/ics20/approve_common.go index bef611c268..08f042b317 100644 --- a/precompiles/ics20/approve_common.go +++ b/precompiles/ics20/approve_common.go @@ -9,7 +9,7 @@ import ( "math/big" "time" - "github.com/evmos/evmos/v17/precompiles/authorization" + "github.com/evmos/evmos/v18/precompiles/authorization" errorsmod "cosmossdk.io/errors" "cosmossdk.io/math" @@ -23,7 +23,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v17/precompiles/common" + cmn "github.com/evmos/evmos/v18/precompiles/common" ) // TransferMsgURL is the ICS20 transfer message URL string. diff --git a/precompiles/ics20/approve_test.go b/precompiles/ics20/approve_test.go index 2da0943c56..5a939bb8e9 100644 --- a/precompiles/ics20/approve_test.go +++ b/precompiles/ics20/approve_test.go @@ -10,10 +10,10 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" - "github.com/evmos/evmos/v17/precompiles/authorization" - cmn "github.com/evmos/evmos/v17/precompiles/common" - "github.com/evmos/evmos/v17/precompiles/ics20" - "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v18/precompiles/authorization" + cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/precompiles/ics20" + "github.com/evmos/evmos/v18/utils" ) type allowanceTestCase struct { diff --git a/precompiles/ics20/events.go b/precompiles/ics20/events.go index 1cd934c4f3..81b69bcc73 100644 --- a/precompiles/ics20/events.go +++ b/precompiles/ics20/events.go @@ -9,7 +9,7 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v17/precompiles/common" + cmn "github.com/evmos/evmos/v18/precompiles/common" ) const ( diff --git a/precompiles/ics20/events_test.go b/precompiles/ics20/events_test.go index b6acd35abb..46b8909241 100644 --- a/precompiles/ics20/events_test.go +++ b/precompiles/ics20/events_test.go @@ -7,10 +7,10 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v17/precompiles/authorization" - cmn "github.com/evmos/evmos/v17/precompiles/common" - "github.com/evmos/evmos/v17/precompiles/ics20" - "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v18/precompiles/authorization" + cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/precompiles/ics20" + "github.com/evmos/evmos/v18/utils" ) func (s *PrecompileTestSuite) TestTransferEvent() { diff --git a/precompiles/ics20/ics20.go b/precompiles/ics20/ics20.go index 54becb847a..7df8d463c3 100644 --- a/precompiles/ics20/ics20.go +++ b/precompiles/ics20/ics20.go @@ -14,9 +14,9 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v17/precompiles/authorization" - cmn "github.com/evmos/evmos/v17/precompiles/common" - transferkeeper "github.com/evmos/evmos/v17/x/ibc/transfer/keeper" + "github.com/evmos/evmos/v18/precompiles/authorization" + cmn "github.com/evmos/evmos/v18/precompiles/common" + transferkeeper "github.com/evmos/evmos/v18/x/ibc/transfer/keeper" ) var _ vm.PrecompiledContract = &Precompile{} diff --git a/precompiles/ics20/integration_test.go b/precompiles/ics20/integration_test.go index ce1d5f8063..38a4af6b98 100644 --- a/precompiles/ics20/integration_test.go +++ b/precompiles/ics20/integration_test.go @@ -14,19 +14,19 @@ import ( ibctesting "github.com/cosmos/ibc-go/v7/testing" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - evmoscontracts "github.com/evmos/evmos/v17/contracts" - evmostesting "github.com/evmos/evmos/v17/ibc/testing" - "github.com/evmos/evmos/v17/precompiles/authorization" - cmn "github.com/evmos/evmos/v17/precompiles/common" - "github.com/evmos/evmos/v17/precompiles/erc20" - "github.com/evmos/evmos/v17/precompiles/ics20" - "github.com/evmos/evmos/v17/precompiles/testutil" - "github.com/evmos/evmos/v17/precompiles/testutil/contracts" - evmosutil "github.com/evmos/evmos/v17/testutil" - teststypes "github.com/evmos/evmos/v17/types/tests" - "github.com/evmos/evmos/v17/utils" - erc20types "github.com/evmos/evmos/v17/x/erc20/types" - inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" + evmoscontracts "github.com/evmos/evmos/v18/contracts" + evmostesting "github.com/evmos/evmos/v18/ibc/testing" + "github.com/evmos/evmos/v18/precompiles/authorization" + cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/precompiles/erc20" + "github.com/evmos/evmos/v18/precompiles/ics20" + "github.com/evmos/evmos/v18/precompiles/testutil" + "github.com/evmos/evmos/v18/precompiles/testutil/contracts" + evmosutil "github.com/evmos/evmos/v18/testutil" + teststypes "github.com/evmos/evmos/v18/types/tests" + "github.com/evmos/evmos/v18/utils" + erc20types "github.com/evmos/evmos/v18/x/erc20/types" + inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" diff --git a/precompiles/ics20/query.go b/precompiles/ics20/query.go index 656021d2bf..6122dec7f6 100644 --- a/precompiles/ics20/query.go +++ b/precompiles/ics20/query.go @@ -11,8 +11,8 @@ import ( transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v17/precompiles/authorization" - cmn "github.com/evmos/evmos/v17/precompiles/common" + "github.com/evmos/evmos/v18/precompiles/authorization" + cmn "github.com/evmos/evmos/v18/precompiles/common" ) const ( diff --git a/precompiles/ics20/query_test.go b/precompiles/ics20/query_test.go index fb1af140eb..d06ae99144 100644 --- a/precompiles/ics20/query_test.go +++ b/precompiles/ics20/query_test.go @@ -6,10 +6,10 @@ import ( "github.com/cosmos/cosmos-sdk/types/query" "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" ibctesting "github.com/cosmos/ibc-go/v7/testing" - "github.com/evmos/evmos/v17/precompiles/authorization" - cmn "github.com/evmos/evmos/v17/precompiles/common" - "github.com/evmos/evmos/v17/precompiles/ics20" - "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v18/precompiles/authorization" + cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/precompiles/ics20" + "github.com/evmos/evmos/v18/utils" ) func (s *PrecompileTestSuite) TestDenomTrace() { diff --git a/precompiles/ics20/setup_test.go b/precompiles/ics20/setup_test.go index da7ae4edcd..b97df68811 100644 --- a/precompiles/ics20/setup_test.go +++ b/precompiles/ics20/setup_test.go @@ -14,11 +14,11 @@ import ( ibctesting "github.com/cosmos/ibc-go/v7/testing" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - evmosapp "github.com/evmos/evmos/v17/app" - evmosibc "github.com/evmos/evmos/v17/ibc/testing" - "github.com/evmos/evmos/v17/precompiles/ics20" - "github.com/evmos/evmos/v17/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmosapp "github.com/evmos/evmos/v18/app" + evmosibc "github.com/evmos/evmos/v18/ibc/testing" + "github.com/evmos/evmos/v18/precompiles/ics20" + "github.com/evmos/evmos/v18/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" diff --git a/precompiles/ics20/tx_test.go b/precompiles/ics20/tx_test.go index aff9936fd4..d04f7c0dbd 100644 --- a/precompiles/ics20/tx_test.go +++ b/precompiles/ics20/tx_test.go @@ -10,11 +10,11 @@ import ( channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v17/precompiles/common" - "github.com/evmos/evmos/v17/precompiles/ics20" - evmosutil "github.com/evmos/evmos/v17/testutil" - testutiltx "github.com/evmos/evmos/v17/testutil/tx" - "github.com/evmos/evmos/v17/utils" + cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/precompiles/ics20" + evmosutil "github.com/evmos/evmos/v18/testutil" + testutiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/utils" ) var ( diff --git a/precompiles/ics20/types.go b/precompiles/ics20/types.go index 1513c1c921..7f41909d87 100644 --- a/precompiles/ics20/types.go +++ b/precompiles/ics20/types.go @@ -20,8 +20,8 @@ import ( clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v17/precompiles/authorization" - cmn "github.com/evmos/evmos/v17/precompiles/common" + "github.com/evmos/evmos/v18/precompiles/authorization" + cmn "github.com/evmos/evmos/v18/precompiles/common" ) const ( diff --git a/precompiles/ics20/utils_test.go b/precompiles/ics20/utils_test.go index baf72e9b31..c04f2d4246 100644 --- a/precompiles/ics20/utils_test.go +++ b/precompiles/ics20/utils_test.go @@ -30,23 +30,23 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" - evmosapp "github.com/evmos/evmos/v17/app" - evmoscontracts "github.com/evmos/evmos/v17/contracts" - evmosibc "github.com/evmos/evmos/v17/ibc/testing" - "github.com/evmos/evmos/v17/precompiles/authorization" - cmn "github.com/evmos/evmos/v17/precompiles/common" - "github.com/evmos/evmos/v17/precompiles/erc20" - "github.com/evmos/evmos/v17/precompiles/ics20" - "github.com/evmos/evmos/v17/precompiles/testutil" - "github.com/evmos/evmos/v17/precompiles/testutil/contracts" - evmosutil "github.com/evmos/evmos/v17/testutil" - evmosutiltx "github.com/evmos/evmos/v17/testutil/tx" - evmostypes "github.com/evmos/evmos/v17/types" - "github.com/evmos/evmos/v17/utils" - "github.com/evmos/evmos/v17/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" - inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" + evmosapp "github.com/evmos/evmos/v18/app" + evmoscontracts "github.com/evmos/evmos/v18/contracts" + evmosibc "github.com/evmos/evmos/v18/ibc/testing" + "github.com/evmos/evmos/v18/precompiles/authorization" + cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/precompiles/erc20" + "github.com/evmos/evmos/v18/precompiles/ics20" + "github.com/evmos/evmos/v18/precompiles/testutil" + "github.com/evmos/evmos/v18/precompiles/testutil/contracts" + evmosutil "github.com/evmos/evmos/v18/testutil" + evmosutiltx "github.com/evmos/evmos/v18/testutil/tx" + evmostypes "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v18/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" + inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/gomega" diff --git a/precompiles/outposts/osmosis/events.go b/precompiles/outposts/osmosis/events.go index 77b2a2de3b..e3e4f8ad75 100644 --- a/precompiles/outposts/osmosis/events.go +++ b/precompiles/outposts/osmosis/events.go @@ -11,7 +11,7 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v17/precompiles/common" + cmn "github.com/evmos/evmos/v18/precompiles/common" ) const ( diff --git a/precompiles/outposts/osmosis/events_test.go b/precompiles/outposts/osmosis/events_test.go index 5c075aa1a7..f08cbb3359 100644 --- a/precompiles/outposts/osmosis/events_test.go +++ b/precompiles/outposts/osmosis/events_test.go @@ -4,10 +4,10 @@ import ( "math/big" "github.com/ethereum/go-ethereum/common" - cmn "github.com/evmos/evmos/v17/precompiles/common" - "github.com/evmos/evmos/v17/precompiles/outposts/osmosis" - evmosutiltx "github.com/evmos/evmos/v17/testutil/tx" - "github.com/evmos/evmos/v17/x/evm/statedb" + cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/precompiles/outposts/osmosis" + evmosutiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/x/evm/statedb" ) func (s *PrecompileTestSuite) TestSwapEvent() { diff --git a/precompiles/outposts/osmosis/osmosis.go b/precompiles/outposts/osmosis/osmosis.go index bc57d0b3ea..25e845e3fe 100644 --- a/precompiles/outposts/osmosis/osmosis.go +++ b/precompiles/outposts/osmosis/osmosis.go @@ -10,14 +10,14 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" channelkeeper "github.com/cosmos/ibc-go/v7/modules/core/04-channel/keeper" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v17/precompiles/common" - erc20keeper "github.com/evmos/evmos/v17/x/erc20/keeper" - transferkeeper "github.com/evmos/evmos/v17/x/ibc/transfer/keeper" + cmn "github.com/evmos/evmos/v18/precompiles/common" + erc20keeper "github.com/evmos/evmos/v18/x/erc20/keeper" + transferkeeper "github.com/evmos/evmos/v18/x/ibc/transfer/keeper" + stakingkeeper "github.com/evmos/evmos/v18/x/staking/keeper" ) const ( diff --git a/precompiles/outposts/osmosis/setup_test.go b/precompiles/outposts/osmosis/setup_test.go index f8047c3db6..090024eaed 100644 --- a/precompiles/outposts/osmosis/setup_test.go +++ b/precompiles/outposts/osmosis/setup_test.go @@ -6,13 +6,13 @@ package osmosis_test import ( "testing" - "github.com/evmos/evmos/v17/precompiles/erc20" + "github.com/evmos/evmos/v18/precompiles/erc20" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v17/precompiles/outposts/osmosis" - "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v17/testutil/integration/evmos/network" + "github.com/evmos/evmos/v18/precompiles/outposts/osmosis" + "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v18/testutil/integration/evmos/network" "github.com/stretchr/testify/suite" ) diff --git a/precompiles/outposts/osmosis/tx.go b/precompiles/outposts/osmosis/tx.go index 1560bf018f..091581ea6f 100644 --- a/precompiles/outposts/osmosis/tx.go +++ b/precompiles/outposts/osmosis/tx.go @@ -19,7 +19,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v17/precompiles/ics20" + "github.com/evmos/evmos/v18/precompiles/ics20" ) const ( diff --git a/precompiles/outposts/osmosis/tx_test.go b/precompiles/outposts/osmosis/tx_test.go index f6aa320466..e1f36f671f 100644 --- a/precompiles/outposts/osmosis/tx_test.go +++ b/precompiles/outposts/osmosis/tx_test.go @@ -4,22 +4,22 @@ import ( "fmt" "math/big" - "github.com/evmos/evmos/v17/precompiles/erc20" + "github.com/evmos/evmos/v18/precompiles/erc20" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" sdktypes "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/precompiles/authorization" - cmn "github.com/evmos/evmos/v17/precompiles/common" - "github.com/evmos/evmos/v17/precompiles/ics20" - "github.com/evmos/evmos/v17/precompiles/outposts/osmosis" - commonnetwork "github.com/evmos/evmos/v17/testutil/integration/common/network" - testutils "github.com/evmos/evmos/v17/testutil/integration/evmos/utils" - "github.com/evmos/evmos/v17/testutil/integration/ibc/coordinator" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v18/precompiles/authorization" + cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/precompiles/ics20" + "github.com/evmos/evmos/v18/precompiles/outposts/osmosis" + commonnetwork "github.com/evmos/evmos/v18/testutil/integration/common/network" + testutils "github.com/evmos/evmos/v18/testutil/integration/evmos/utils" + "github.com/evmos/evmos/v18/testutil/integration/ibc/coordinator" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/utils" ) func (s *PrecompileTestSuite) TestSwap() { diff --git a/precompiles/outposts/osmosis/types.go b/precompiles/outposts/osmosis/types.go index 0e340c658b..28024fcdd2 100644 --- a/precompiles/outposts/osmosis/types.go +++ b/precompiles/outposts/osmosis/types.go @@ -18,8 +18,8 @@ import ( "github.com/ethereum/go-ethereum/common" - cmn "github.com/evmos/evmos/v17/precompiles/common" - "github.com/evmos/evmos/v17/utils" + cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/utils" ) const ( diff --git a/precompiles/outposts/osmosis/types_test.go b/precompiles/outposts/osmosis/types_test.go index da0c6e943d..3a7e539f06 100644 --- a/precompiles/outposts/osmosis/types_test.go +++ b/precompiles/outposts/osmosis/types_test.go @@ -8,9 +8,9 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/require" - cmn "github.com/evmos/evmos/v17/precompiles/common" - osmosisoutpost "github.com/evmos/evmos/v17/precompiles/outposts/osmosis" - "github.com/evmos/evmos/v17/utils" + cmn "github.com/evmos/evmos/v18/precompiles/common" + osmosisoutpost "github.com/evmos/evmos/v18/precompiles/outposts/osmosis" + "github.com/evmos/evmos/v18/utils" ) func TestCreatePacketWithMemo(t *testing.T) { diff --git a/precompiles/outposts/stride/events.go b/precompiles/outposts/stride/events.go index cfca688f9d..2dc8b97ab3 100644 --- a/precompiles/outposts/stride/events.go +++ b/precompiles/outposts/stride/events.go @@ -11,7 +11,7 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v17/precompiles/common" + cmn "github.com/evmos/evmos/v18/precompiles/common" ) const ( diff --git a/precompiles/outposts/stride/events_test.go b/precompiles/outposts/stride/events_test.go index 3c09c25754..30413597e0 100644 --- a/precompiles/outposts/stride/events_test.go +++ b/precompiles/outposts/stride/events_test.go @@ -7,9 +7,9 @@ import ( transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" "github.com/ethereum/go-ethereum/common" - cmn "github.com/evmos/evmos/v17/precompiles/common" - "github.com/evmos/evmos/v17/precompiles/outposts/stride" - "github.com/evmos/evmos/v17/utils" + cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/precompiles/outposts/stride" + "github.com/evmos/evmos/v18/utils" ) const receiver = "stride1rhe5leyt5w0mcwd9rpp93zqn99yktsxvyaqgd0" diff --git a/precompiles/outposts/stride/setup_test.go b/precompiles/outposts/stride/setup_test.go index 4892538303..396f799559 100644 --- a/precompiles/outposts/stride/setup_test.go +++ b/precompiles/outposts/stride/setup_test.go @@ -6,13 +6,13 @@ package stride_test import ( "testing" - "github.com/evmos/evmos/v17/precompiles/erc20" + "github.com/evmos/evmos/v18/precompiles/erc20" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v17/precompiles/outposts/stride" - "github.com/evmos/evmos/v17/testutil/integration/common/grpc" - testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v17/testutil/integration/evmos/network" + "github.com/evmos/evmos/v18/precompiles/outposts/stride" + "github.com/evmos/evmos/v18/testutil/integration/common/grpc" + testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v18/testutil/integration/evmos/network" "github.com/stretchr/testify/suite" ) diff --git a/precompiles/outposts/stride/stride.go b/precompiles/outposts/stride/stride.go index a608ace8a6..c3080b82eb 100644 --- a/precompiles/outposts/stride/stride.go +++ b/precompiles/outposts/stride/stride.go @@ -9,13 +9,14 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" - stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" + "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v17/precompiles/common" - erc20keeper "github.com/evmos/evmos/v17/x/erc20/keeper" - transferkeeper "github.com/evmos/evmos/v17/x/ibc/transfer/keeper" + cmn "github.com/evmos/evmos/v18/precompiles/common" + erc20keeper "github.com/evmos/evmos/v18/x/erc20/keeper" + transferkeeper "github.com/evmos/evmos/v18/x/ibc/transfer/keeper" + stakingkeeper "github.com/evmos/evmos/v18/x/staking/keeper" ) var _ vm.PrecompiledContract = &Precompile{} diff --git a/precompiles/outposts/stride/tx.go b/precompiles/outposts/stride/tx.go index 59b40f1641..88c8da7ac2 100644 --- a/precompiles/outposts/stride/tx.go +++ b/precompiles/outposts/stride/tx.go @@ -10,13 +10,13 @@ import ( transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" "cosmossdk.io/math" - "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v18/utils" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v17/precompiles/ics20" + "github.com/evmos/evmos/v18/precompiles/ics20" ) const ( diff --git a/precompiles/outposts/stride/tx_test.go b/precompiles/outposts/stride/tx_test.go index 1b05037886..e45e902118 100644 --- a/precompiles/outposts/stride/tx_test.go +++ b/precompiles/outposts/stride/tx_test.go @@ -7,15 +7,15 @@ import ( "fmt" "math/big" - "github.com/evmos/evmos/v17/precompiles/erc20" + "github.com/evmos/evmos/v18/precompiles/erc20" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v18/utils" common "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v17/precompiles/common" - "github.com/evmos/evmos/v17/precompiles/outposts/stride" + cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/precompiles/outposts/stride" ) const ( diff --git a/precompiles/outposts/stride/types.go b/precompiles/outposts/stride/types.go index 05610ddd71..0b100f640d 100644 --- a/precompiles/outposts/stride/types.go +++ b/precompiles/outposts/stride/types.go @@ -10,11 +10,11 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v18/utils" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/ethereum/go-ethereum/common" - cmn "github.com/evmos/evmos/v17/precompiles/common" + cmn "github.com/evmos/evmos/v18/precompiles/common" ) const ( diff --git a/precompiles/outposts/stride/types_test.go b/precompiles/outposts/stride/types_test.go index cfb8bb29d3..1213c411f4 100644 --- a/precompiles/outposts/stride/types_test.go +++ b/precompiles/outposts/stride/types_test.go @@ -3,7 +3,7 @@ package stride_test import ( "testing" - strideoutpost "github.com/evmos/evmos/v17/precompiles/outposts/stride" + strideoutpost "github.com/evmos/evmos/v18/precompiles/outposts/stride" "github.com/stretchr/testify/require" ) diff --git a/precompiles/outposts/stride/utils_test.go b/precompiles/outposts/stride/utils_test.go index c069ccef50..4bac24d551 100644 --- a/precompiles/outposts/stride/utils_test.go +++ b/precompiles/outposts/stride/utils_test.go @@ -6,15 +6,15 @@ import ( "fmt" "cosmossdk.io/math" - commonnetwork "github.com/evmos/evmos/v17/testutil/integration/common/network" - "github.com/evmos/evmos/v17/testutil/integration/ibc/coordinator" + commonnetwork "github.com/evmos/evmos/v18/testutil/integration/common/network" + "github.com/evmos/evmos/v18/testutil/integration/ibc/coordinator" - erc20types "github.com/evmos/evmos/v17/x/erc20/types" + erc20types "github.com/evmos/evmos/v18/x/erc20/types" sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" + inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" ) const ( diff --git a/precompiles/p256/integration_test.go b/precompiles/p256/integration_test.go index 70f4182655..a533b4351a 100644 --- a/precompiles/p256/integration_test.go +++ b/precompiles/p256/integration_test.go @@ -15,13 +15,13 @@ import ( //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/gomega" - "github.com/evmos/evmos/v17/precompiles/p256" - "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v17/testutil/integration/evmos/network" - "github.com/evmos/evmos/v17/testutil/integration/evmos/utils" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/precompiles/p256" + "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + "github.com/evmos/evmos/v18/testutil/integration/evmos/utils" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) type IntegrationTestSuite struct { diff --git a/precompiles/p256/p256.go b/precompiles/p256/p256.go index a959a52e6e..ffd8afd84f 100644 --- a/precompiles/p256/p256.go +++ b/precompiles/p256/p256.go @@ -21,7 +21,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v17/crypto/secp256r1" + "github.com/evmos/evmos/v18/crypto/secp256r1" ) var _ vm.PrecompiledContract = &Precompile{} diff --git a/precompiles/p256/p256_test.go b/precompiles/p256/p256_test.go index e27782a6a4..6d824f97ae 100644 --- a/precompiles/p256/p256_test.go +++ b/precompiles/p256/p256_test.go @@ -10,7 +10,7 @@ import ( "github.com/cometbft/cometbft/crypto" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v17/precompiles/p256" + "github.com/evmos/evmos/v18/precompiles/p256" ) var trueValue = common.LeftPadBytes(common.Big1.Bytes(), 32) diff --git a/precompiles/p256/setup_test.go b/precompiles/p256/setup_test.go index 2cf02c6174..a7756328d4 100644 --- a/precompiles/p256/setup_test.go +++ b/precompiles/p256/setup_test.go @@ -15,7 +15,7 @@ import ( . "github.com/onsi/gomega" "github.com/cometbft/cometbft/crypto" - "github.com/evmos/evmos/v17/precompiles/p256" + "github.com/evmos/evmos/v18/precompiles/p256" "github.com/stretchr/testify/suite" "golang.org/x/crypto/cryptobyte" "golang.org/x/crypto/cryptobyte/asn1" diff --git a/precompiles/staking/approve.go b/precompiles/staking/approve.go index db018e6c56..0d8de82b5e 100644 --- a/precompiles/staking/approve.go +++ b/precompiles/staking/approve.go @@ -15,8 +15,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v17/precompiles/authorization" - cmn "github.com/evmos/evmos/v17/precompiles/common" + "github.com/evmos/evmos/v18/precompiles/authorization" + cmn "github.com/evmos/evmos/v18/precompiles/common" ) var ( diff --git a/precompiles/staking/approve_test.go b/precompiles/staking/approve_test.go index 7b8483ce6c..5fa8107255 100644 --- a/precompiles/staking/approve_test.go +++ b/precompiles/staking/approve_test.go @@ -7,17 +7,17 @@ import ( "cosmossdk.io/math" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - evmosutiltx "github.com/evmos/evmos/v17/testutil/tx" + evmosutiltx "github.com/evmos/evmos/v18/testutil/tx" sdk "github.com/cosmos/cosmos-sdk/types" sdkauthz "github.com/cosmos/cosmos-sdk/x/authz" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v17/precompiles/authorization" - cmn "github.com/evmos/evmos/v17/precompiles/common" - "github.com/evmos/evmos/v17/precompiles/staking" - "github.com/evmos/evmos/v17/precompiles/testutil" - evmosutil "github.com/evmos/evmos/v17/testutil" + "github.com/evmos/evmos/v18/precompiles/authorization" + cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/precompiles/staking" + "github.com/evmos/evmos/v18/precompiles/testutil" + evmosutil "github.com/evmos/evmos/v18/testutil" ) func (s *PrecompileTestSuite) TestApprove() { diff --git a/precompiles/staking/events.go b/precompiles/staking/events.go index 98f780646b..1dd5edb904 100644 --- a/precompiles/staking/events.go +++ b/precompiles/staking/events.go @@ -8,7 +8,7 @@ import ( "math/big" "reflect" - "github.com/evmos/evmos/v17/precompiles/authorization" + "github.com/evmos/evmos/v18/precompiles/authorization" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" @@ -16,7 +16,7 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v17/precompiles/common" + cmn "github.com/evmos/evmos/v18/precompiles/common" ) const ( diff --git a/precompiles/staking/events_test.go b/precompiles/staking/events_test.go index 1a8d9799e2..59342b77e4 100644 --- a/precompiles/staking/events_test.go +++ b/precompiles/staking/events_test.go @@ -10,9 +10,9 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v17/precompiles/authorization" - cmn "github.com/evmos/evmos/v17/precompiles/common" - "github.com/evmos/evmos/v17/precompiles/staking" + "github.com/evmos/evmos/v18/precompiles/authorization" + cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/precompiles/staking" ) func (s *PrecompileTestSuite) TestApprovalEvent() { diff --git a/precompiles/staking/integration_test.go b/precompiles/staking/integration_test.go index 26603dccd4..e88fe46b68 100644 --- a/precompiles/staking/integration_test.go +++ b/precompiles/staking/integration_test.go @@ -19,17 +19,19 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - compiledcontracts "github.com/evmos/evmos/v17/contracts" - "github.com/evmos/evmos/v17/precompiles/authorization" - cmn "github.com/evmos/evmos/v17/precompiles/common" - "github.com/evmos/evmos/v17/precompiles/distribution" - "github.com/evmos/evmos/v17/precompiles/staking" - "github.com/evmos/evmos/v17/precompiles/staking/testdata" - "github.com/evmos/evmos/v17/precompiles/testutil" - "github.com/evmos/evmos/v17/precompiles/testutil/contracts" - evmosutil "github.com/evmos/evmos/v17/testutil" - testutiltx "github.com/evmos/evmos/v17/testutil/tx" - "github.com/evmos/evmos/v17/utils" + compiledcontracts "github.com/evmos/evmos/v18/contracts" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + "github.com/evmos/evmos/v18/precompiles/authorization" + cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/precompiles/distribution" + "github.com/evmos/evmos/v18/precompiles/staking" + "github.com/evmos/evmos/v18/precompiles/staking/testdata" + "github.com/evmos/evmos/v18/precompiles/testutil" + "github.com/evmos/evmos/v18/precompiles/testutil/contracts" + evmosutil "github.com/evmos/evmos/v18/testutil" + testutiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/utils" + vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" ) // General variables used for integration tests @@ -737,6 +739,219 @@ var _ = Describe("Calling staking precompile directly", func() { }) }) + Describe("Calling precompile txs from a vesting account", func() { + var ( + funder common.Address + vestAcc common.Address + vestAccPriv *ethsecp256k1.PrivKey + clawbackAccount *vestingtypes.ClawbackVestingAccount + unvested sdk.Coins + vested sdk.Coins + // unlockedVested are unlocked vested coins of the vesting schedule + unlockedVested sdk.Coins + defaultDelegateArgs contracts.CallArgs + ) + + BeforeEach(func() { + // Setup vesting account + funder = s.address + vestAcc, vestAccPriv = testutiltx.NewAddrKey() + vestingAmtTotal := evmosutil.TestVestingSchedule.TotalVestingCoins + + clawbackAccount = s.setupVestingAccount(funder.Bytes(), vestAcc.Bytes()) + + // Check if all tokens are unvested at vestingStart + unvested = clawbackAccount.GetVestingCoins(s.ctx.BlockTime()) + vested = clawbackAccount.GetVestedCoins(s.ctx.BlockTime()) + Expect(vestingAmtTotal).To(Equal(unvested)) + Expect(vested.IsZero()).To(BeTrue()) + + // populate the default delegate args + defaultDelegateArgs = defaultCallArgs.WithMethodName(staking.DelegateMethod) + defaultDelegateArgs = defaultDelegateArgs.WithPrivKey(vestAccPriv) + }) + + Context("before first vesting period - all tokens locked and unvested", func() { + BeforeEach(func() { + s.NextBlock() + + // Ensure no tokens are vested + vested = clawbackAccount.GetVestedCoins(s.ctx.BlockTime()) + unvested = clawbackAccount.GetVestingCoins(s.ctx.BlockTime()) + unlocked := clawbackAccount.GetUnlockedCoins(s.ctx.BlockTime()) + zeroCoins := sdk.NewCoins(sdk.NewCoin(s.bondDenom, math.ZeroInt())) + Expect(vested).To(Equal(zeroCoins), "expected different vested coins") + Expect(unvested).To(Equal(evmosutil.TestVestingSchedule.TotalVestingCoins), "expected different unvested coins") + Expect(unlocked).To(Equal(zeroCoins), "expected different unlocked coins") + }) + + It("Should not be able to delegate unvested tokens", func() { + delegateArgs := defaultDelegateArgs.WithArgs( + vestAcc, valAddr.String(), unvested.AmountOf(s.bondDenom).BigInt(), + ) + + failCheck := defaultLogCheck. + WithErrContains("cannot delegate unvested coins") + + _, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, delegateArgs, failCheck) + Expect(err).NotTo(BeNil(), "error while calling the smart contract: %v", err) + Expect(err.Error()).To(ContainSubstring("coins available for delegation < delegation amount")) + }) + + It("Should be able to delegate tokens not involved in vesting schedule", func() { + // send some coins to the vesting account + coinsToDelegate := sdk.NewCoins(sdk.NewCoin(s.bondDenom, math.NewInt(1e18))) + err := evmosutil.FundAccount(s.ctx, s.app.BankKeeper, clawbackAccount.GetAddress(), coinsToDelegate) + Expect(err).To(BeNil()) + + // check balance is updated + balance := s.app.BankKeeper.GetBalance(s.ctx, clawbackAccount.GetAddress(), s.bondDenom) + Expect(balance).To(Equal(accountGasCoverage[0].Add(evmosutil.TestVestingSchedule.TotalVestingCoins[0]).Add(coinsToDelegate[0]))) + + delegateArgs := defaultDelegateArgs.WithArgs( + vestAcc, valAddr.String(), coinsToDelegate.AmountOf(s.bondDenom).BigInt(), + ) + + logCheckArgs := passCheck.WithExpEvents(staking.EventTypeDelegate) + + _, _, err = contracts.CallContractAndCheckLogs(s.ctx, s.app, delegateArgs, logCheckArgs) + Expect(err).To(BeNil(), "error while calling the smart contract: %v", err) + + delegation, found := s.app.StakingKeeper.GetDelegation(s.ctx, vestAcc.Bytes(), valAddr) + Expect(found).To(BeTrue(), "expected delegation to be found") + Expect(delegation.Shares.BigInt()).To(Equal(coinsToDelegate[0].Amount.BigInt())) + + // check vesting balance is untouched + balancePost := s.app.BankKeeper.GetBalance(s.ctx, clawbackAccount.GetAddress(), s.bondDenom) + Expect(balancePost.IsGTE(evmosutil.TestVestingSchedule.TotalVestingCoins[0])).To(BeTrue()) + }) + }) + + Context("after first vesting period and before lockup - some vested tokens, but still all locked", func() { + BeforeEach(func() { + // Surpass cliff but none of lockup duration + cliffDuration := time.Duration(evmosutil.TestVestingSchedule.CliffPeriodLength) + s.NextBlockAfter(cliffDuration * time.Second) + + // Check if some, but not all tokens are vested + vested = clawbackAccount.GetVestedCoins(s.ctx.BlockTime()) + expVested := sdk.NewCoins(sdk.NewCoin(s.bondDenom, evmosutil.TestVestingSchedule.VestedCoinsPerPeriod[0].Amount.Mul(math.NewInt(evmosutil.TestVestingSchedule.CliffMonths)))) + Expect(vested).NotTo(Equal(evmosutil.TestVestingSchedule.TotalVestingCoins), "expected some tokens to have been vested") + Expect(vested).To(Equal(expVested), "expected different vested amount") + + // check the vested tokens are still locked + unlockedVested = clawbackAccount.GetUnlockedVestedCoins(s.ctx.BlockTime()) + Expect(unlockedVested).To(Equal(sdk.Coins{})) + + vestingAmtTotal := evmosutil.TestVestingSchedule.TotalVestingCoins + res, err := s.app.VestingKeeper.Balances(s.ctx, &vestingtypes.QueryBalancesRequest{Address: clawbackAccount.Address}) + Expect(err).To(BeNil()) + Expect(res.Vested).To(Equal(expVested)) + Expect(res.Unvested).To(Equal(vestingAmtTotal.Sub(expVested...))) + // All coins from vesting schedule should be locked + Expect(res.Locked).To(Equal(vestingAmtTotal)) + }) + + It("Should be able to delegate locked vested tokens", func() { + delegateArgs := defaultDelegateArgs.WithArgs( + vestAcc, valAddr.String(), vested[0].Amount.BigInt(), + ) + + logCheckArgs := passCheck.WithExpEvents(staking.EventTypeDelegate) + + _, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, delegateArgs, logCheckArgs) + Expect(err).To(BeNil(), "error while calling the smart contract: %v", err) + + delegation, found := s.app.StakingKeeper.GetDelegation(s.ctx, vestAcc.Bytes(), valAddr) + Expect(found).To(BeTrue(), "expected delegation to be found") + Expect(delegation.Shares.BigInt()).To(Equal(vested[0].Amount.BigInt())) + }) + + It("Should be able to delegate locked vested tokens + free tokens (not in vesting schedule)", func() { + // send some coins to the vesting account + amt := sdk.NewCoins(sdk.NewCoin(s.bondDenom, math.NewInt(1e18))) + err := evmosutil.FundAccount(s.ctx, s.app.BankKeeper, clawbackAccount.GetAddress(), amt) + Expect(err).To(BeNil()) + + // check balance is updated + balance := s.app.BankKeeper.GetBalance(s.ctx, clawbackAccount.GetAddress(), s.bondDenom) + Expect(balance).To(Equal(accountGasCoverage[0].Add(evmosutil.TestVestingSchedule.TotalVestingCoins[0]).Add(amt[0]))) + + coinsToDelegate := amt.Add(vested...) + + delegateArgs := defaultDelegateArgs.WithArgs( + vestAcc, valAddr.String(), coinsToDelegate[0].Amount.BigInt(), + ) + + logCheckArgs := passCheck.WithExpEvents(staking.EventTypeDelegate) + + _, _, err = contracts.CallContractAndCheckLogs(s.ctx, s.app, delegateArgs, logCheckArgs) + Expect(err).To(BeNil(), "error while calling the smart contract: %v", err) + + delegation, found := s.app.StakingKeeper.GetDelegation(s.ctx, vestAcc.Bytes(), valAddr) + Expect(found).To(BeTrue(), "expected delegation to be found") + Expect(delegation.Shares.BigInt()).To(Equal(coinsToDelegate[0].Amount.BigInt())) + }) + }) + + Context("Between first and second lockup periods - vested coins are unlocked", func() { + BeforeEach(func() { + // Surpass first lockup + vestDuration := time.Duration(evmosutil.TestVestingSchedule.LockupPeriodLength) + s.NextBlockAfter(vestDuration * time.Second) + + // Check if some, but not all tokens are vested and unlocked + vested = clawbackAccount.GetVestedCoins(s.ctx.BlockTime()) + unlocked := clawbackAccount.GetUnlockedCoins(s.ctx.BlockTime()) + unlockedVested = clawbackAccount.GetUnlockedVestedCoins(s.ctx.BlockTime()) + + expVested := sdk.NewCoins(sdk.NewCoin(s.bondDenom, evmosutil.TestVestingSchedule.VestedCoinsPerPeriod[0].Amount.Mul(math.NewInt(evmosutil.TestVestingSchedule.LockupMonths)))) + expUnlockedVested := expVested + + Expect(vested).NotTo(Equal(evmosutil.TestVestingSchedule.TotalVestingCoins), "expected not all tokens to be vested") + Expect(vested).To(Equal(expVested), "expected different amount of vested tokens") + // all vested coins are unlocked + Expect(unlockedVested).To(Equal(vested)) + Expect(unlocked).To(Equal(evmosutil.TestVestingSchedule.UnlockedCoinsPerLockup)) + Expect(unlockedVested).To(Equal(expUnlockedVested)) + }) + It("Should be able to delegate unlocked vested tokens", func() { + delegateArgs := defaultDelegateArgs.WithArgs( + vestAcc, valAddr.String(), unlockedVested[0].Amount.BigInt(), + ) + + logCheckArgs := passCheck.WithExpEvents(staking.EventTypeDelegate) + + _, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, delegateArgs, logCheckArgs) + Expect(err).To(BeNil(), "error while calling the smart contract: %v", err) + + delegation, found := s.app.StakingKeeper.GetDelegation(s.ctx, vestAcc.Bytes(), valAddr) + Expect(found).To(BeTrue(), "expected delegation to be found") + Expect(delegation.Shares.BigInt()).To(Equal(unlockedVested[0].Amount.BigInt())) + }) + + It("Cannot delegate more than vested tokens (and free tokens)", func() { + // calculate the delegatable amount + balance := s.app.BankKeeper.GetBalance(s.ctx, vestAcc.Bytes(), s.bondDenom) + unvestedOnly := clawbackAccount.GetVestingCoins(s.ctx.BlockTime()) + delegatable := balance.Sub(unvestedOnly[0]) + + delegateArgs := defaultDelegateArgs.WithArgs( + vestAcc, valAddr.String(), delegatable.Amount.Add(sdk.OneInt()).BigInt(), + ) + + logCheckArgs := passCheck.WithExpEvents(staking.EventTypeDelegate) + + _, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, delegateArgs, logCheckArgs) + Expect(err).NotTo(BeNil(), "error while calling the smart contract: %v", err) + Expect(err.Error()).To(ContainSubstring("cannot delegate unvested coins")) + + _, found := s.app.StakingKeeper.GetDelegation(s.ctx, vestAcc.Bytes(), valAddr) + Expect(found).To(BeFalse(), "expected delegation NOT to be found") + }) + }) + }) + Describe("to query allowance", func() { var ( defaultAllowanceArgs contracts.CallArgs @@ -1651,7 +1866,7 @@ var _ = Describe("Calling staking precompile via Solidity", func() { It("shouldn't delegate to a validator that is not in the allow list of the approval", func() { // create a new validator, which is not included in the active set of the last block - testutil.CreateValidator(s.ctx, s.T(), s.privKey.PubKey(), s.app.StakingKeeper, math.NewInt(100)) + testutil.CreateValidator(s.ctx, s.T(), s.privKey.PubKey(), *s.app.StakingKeeper.Keeper, math.NewInt(100)) newValAddr := sdk.ValAddress(s.address.Bytes()) delegateArgs := defaultDelegateArgs.WithArgs( @@ -1665,6 +1880,187 @@ var _ = Describe("Calling staking precompile via Solidity", func() { Expect(delegation.GetShares()).To(Equal(math.LegacyNewDecFromInt(math.NewInt(100))), "expected only the delegation from creating the validator, no more") }) }) + Describe("delegation from a vesting account", func() { + var ( + funder common.Address + vestAcc common.Address + vestAccPriv *ethsecp256k1.PrivKey + clawbackAccount *vestingtypes.ClawbackVestingAccount + unvested sdk.Coins + vested sdk.Coins + // unlockedVested are unlocked vested coins of the vesting schedule + unlockedVested sdk.Coins + defaultArgs contracts.CallArgs + ) + + BeforeEach(func() { + // Setup vesting account + funder = s.address + vestAcc, vestAccPriv = testutiltx.NewAddrKey() + + clawbackAccount = s.setupVestingAccount(funder.Bytes(), vestAcc.Bytes()) + + // Check if all tokens are unvested at vestingStart + totalVestingCoins := evmosutil.TestVestingSchedule.TotalVestingCoins + unvested = clawbackAccount.GetVestingCoins(s.ctx.BlockTime()) + vested = clawbackAccount.GetVestedCoins(s.ctx.BlockTime()) + Expect(unvested).To(Equal(totalVestingCoins)) + Expect(vested.IsZero()).To(BeTrue()) + + // create approval to allow spending all vesting coins + cArgs := defaultApproveArgs.WithArgs( + contractAddr, []string{staking.DelegateMsg}, totalVestingCoins.AmountOf(s.bondDenom).BigInt(), + ).WithPrivKey(vestAccPriv) + s.SetupApprovalWithContractCalls(cArgs) + + // add the vesting account priv key to the delegate args + defaultArgs = defaultDelegateArgs.WithPrivKey(vestAccPriv) + }) + + Context("before first vesting period - all tokens locked and unvested", func() { + BeforeEach(func() { + s.NextBlock() + + // Ensure no tokens are vested + vested = clawbackAccount.GetVestedCoins(s.ctx.BlockTime()) + unvested = clawbackAccount.GetVestingCoins(s.ctx.BlockTime()) + unlocked := clawbackAccount.GetUnlockedCoins(s.ctx.BlockTime()) + zeroCoins := sdk.NewCoins(sdk.NewCoin(s.bondDenom, math.ZeroInt())) + Expect(vested).To(Equal(zeroCoins)) + Expect(unvested).To(Equal(evmosutil.TestVestingSchedule.TotalVestingCoins)) + Expect(unlocked).To(Equal(zeroCoins)) + }) + + It("Should not be able to delegate unvested tokens", func() { + delegateArgs := defaultArgs.WithArgs( + vestAcc, valAddr.String(), unvested.AmountOf(s.bondDenom).BigInt(), + ) + + _, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, delegateArgs, execRevertedCheck) + Expect(err).To(HaveOccurred(), "error while calling the smart contract: %v", err) + }) + + It("Should be able to delegate tokens not involved in vesting schedule", func() { + // send some coins to the vesting account + coinsToDelegate := sdk.NewCoins(sdk.NewCoin(s.bondDenom, math.NewInt(1e18))) + err := evmosutil.FundAccount(s.ctx, s.app.BankKeeper, clawbackAccount.GetAddress(), coinsToDelegate) + Expect(err).To(BeNil()) + + delegateArgs := defaultArgs.WithArgs( + vestAcc, valAddr.String(), coinsToDelegate.AmountOf(s.bondDenom).BigInt(), + ) + + logCheckArgs := passCheck.WithExpEvents(staking.EventTypeDelegate) + + _, _, err = contracts.CallContractAndCheckLogs(s.ctx, s.app, delegateArgs, logCheckArgs) + Expect(err).To(BeNil(), "error while calling the smart contract: %v", err) + + delegation, found := s.app.StakingKeeper.GetDelegation(s.ctx, vestAcc.Bytes(), valAddr) + Expect(found).To(BeTrue(), "expected delegation to be found") + Expect(delegation.Shares.BigInt()).To(Equal(coinsToDelegate[0].Amount.BigInt())) + }) + }) + + Context("after first vesting period and before lockup - some vested tokens, but still all locked", func() { + BeforeEach(func() { + // Surpass cliff but none of lockup duration + cliffDuration := time.Duration(evmosutil.TestVestingSchedule.CliffPeriodLength) + s.NextBlockAfter(cliffDuration * time.Second) + + // Check if some, but not all tokens are vested + vested = clawbackAccount.GetVestedCoins(s.ctx.BlockTime()) + expVested := sdk.NewCoins(sdk.NewCoin(s.bondDenom, evmosutil.TestVestingSchedule.VestedCoinsPerPeriod[0].Amount.Mul(math.NewInt(evmosutil.TestVestingSchedule.CliffMonths)))) + Expect(vested).NotTo(Equal(evmosutil.TestVestingSchedule.TotalVestingCoins)) + Expect(vested).To(Equal(expVested)) + + // check the vested tokens are still locked + unlockedVested = clawbackAccount.GetUnlockedVestedCoins(s.ctx.BlockTime()) + Expect(unlockedVested).To(Equal(sdk.Coins{})) + + vestingAmtTotal := evmosutil.TestVestingSchedule.TotalVestingCoins + res, err := s.app.VestingKeeper.Balances(s.ctx, &vestingtypes.QueryBalancesRequest{Address: clawbackAccount.Address}) + Expect(err).To(BeNil()) + Expect(res.Vested).To(Equal(expVested)) + Expect(res.Unvested).To(Equal(vestingAmtTotal.Sub(expVested...))) + // All coins from vesting schedule should be locked + Expect(res.Locked).To(Equal(vestingAmtTotal)) + }) + + It("Should be able to delegate locked vested tokens", func() { + delegateArgs := defaultArgs.WithArgs( + vestAcc, valAddr.String(), vested[0].Amount.BigInt(), + ) + + logCheckArgs := passCheck.WithExpEvents(staking.EventTypeDelegate) + + _, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, delegateArgs, logCheckArgs) + Expect(err).To(BeNil(), "error while calling the smart contract: %v", err) + + delegation, found := s.app.StakingKeeper.GetDelegation(s.ctx, vestAcc.Bytes(), valAddr) + Expect(found).To(BeTrue(), "expected delegation to be found") + Expect(delegation.Shares.BigInt()).To(Equal(vested[0].Amount.BigInt())) + }) + + It("Should be able to delegate locked vested tokens + free tokens (not in vesting schedule)", func() { + // send some coins to the vesting account + amt := sdk.NewCoins(sdk.NewCoin(s.bondDenom, math.NewInt(1e18))) + err := evmosutil.FundAccount(s.ctx, s.app.BankKeeper, clawbackAccount.GetAddress(), amt) + Expect(err).To(BeNil()) + + coinsToDelegate := amt.Add(vested...) + + delegateArgs := defaultArgs.WithArgs( + vestAcc, valAddr.String(), coinsToDelegate[0].Amount.BigInt(), + ) + + logCheckArgs := passCheck.WithExpEvents(staking.EventTypeDelegate) + + _, _, err = contracts.CallContractAndCheckLogs(s.ctx, s.app, delegateArgs, logCheckArgs) + Expect(err).To(BeNil(), "error while calling the smart contract: %v", err) + + delegation, found := s.app.StakingKeeper.GetDelegation(s.ctx, vestAcc.Bytes(), valAddr) + Expect(found).To(BeTrue(), "expected delegation to be found") + Expect(delegation.Shares.BigInt()).To(Equal(coinsToDelegate[0].Amount.BigInt())) + }) + }) + + Context("Between first and second lockup periods - vested coins are unlocked", func() { + BeforeEach(func() { + // Surpass first lockup + vestDuration := time.Duration(evmosutil.TestVestingSchedule.LockupPeriodLength) + s.NextBlockAfter(vestDuration * time.Second) + + // Check if some, but not all tokens are vested and unlocked + vested = clawbackAccount.GetVestedCoins(s.ctx.BlockTime()) + unlocked := clawbackAccount.GetUnlockedCoins(s.ctx.BlockTime()) + unlockedVested = clawbackAccount.GetUnlockedVestedCoins(s.ctx.BlockTime()) + + expVested := sdk.NewCoins(sdk.NewCoin(s.bondDenom, evmosutil.TestVestingSchedule.VestedCoinsPerPeriod[0].Amount.Mul(math.NewInt(evmosutil.TestVestingSchedule.LockupMonths)))) + expUnlockedVested := expVested + + Expect(vested).NotTo(Equal(evmosutil.TestVestingSchedule.TotalVestingCoins)) + Expect(vested).To(Equal(expVested)) + // all vested coins are unlocked + Expect(unlockedVested).To(Equal(vested)) + Expect(unlocked).To(Equal(evmosutil.TestVestingSchedule.UnlockedCoinsPerLockup)) + Expect(unlockedVested).To(Equal(expUnlockedVested)) + }) + It("Should be able to delegate unlocked vested tokens", func() { + delegateArgs := defaultArgs.WithArgs( + vestAcc, valAddr.String(), unlockedVested[0].Amount.BigInt(), + ) + + logCheckArgs := passCheck.WithExpEvents(staking.EventTypeDelegate) + + _, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, delegateArgs, logCheckArgs) + Expect(err).To(BeNil(), "error while calling the smart contract: %v", err) + + delegation, found := s.app.StakingKeeper.GetDelegation(s.ctx, vestAcc.Bytes(), valAddr) + Expect(found).To(BeTrue(), "expected delegation to be found") + Expect(delegation.Shares.BigInt()).To(Equal(unlockedVested[0].Amount.BigInt())) + }) + }) + }) }) Context("unbonding", func() { diff --git a/precompiles/staking/query.go b/precompiles/staking/query.go index 1e223f7a13..7d6e23caf5 100644 --- a/precompiles/staking/query.go +++ b/precompiles/staking/query.go @@ -13,8 +13,8 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v17/precompiles/authorization" - cmn "github.com/evmos/evmos/v17/precompiles/common" + "github.com/evmos/evmos/v18/precompiles/authorization" + cmn "github.com/evmos/evmos/v18/precompiles/common" ) const ( @@ -50,7 +50,7 @@ func (p Precompile) Delegation( return nil, err } - queryServer := stakingkeeper.Querier{Keeper: &p.stakingKeeper} + queryServer := stakingkeeper.Querier{Keeper: p.stakingKeeper.Keeper} res, err := queryServer.Delegation(sdk.WrapSDKContext(ctx), req) if err != nil { @@ -80,7 +80,7 @@ func (p Precompile) UnbondingDelegation( return nil, err } - queryServer := stakingkeeper.Querier{Keeper: &p.stakingKeeper} + queryServer := stakingkeeper.Querier{Keeper: p.stakingKeeper.Keeper} res, err := queryServer.UnbondingDelegation(sdk.WrapSDKContext(ctx), req) if err != nil { @@ -109,7 +109,7 @@ func (p Precompile) Validator( return nil, err } - queryServer := stakingkeeper.Querier{Keeper: &p.stakingKeeper} + queryServer := stakingkeeper.Querier{Keeper: p.stakingKeeper.Keeper} res, err := queryServer.Validator(sdk.WrapSDKContext(ctx), req) if err != nil { @@ -138,7 +138,7 @@ func (p Precompile) Validators( return nil, err } - queryServer := stakingkeeper.Querier{Keeper: &p.stakingKeeper} + queryServer := stakingkeeper.Querier{Keeper: p.stakingKeeper.Keeper} res, err := queryServer.Validators(sdk.WrapSDKContext(ctx), req) if err != nil { @@ -184,7 +184,7 @@ func (p Precompile) Redelegations( return nil, err } - queryServer := stakingkeeper.Querier{Keeper: &p.stakingKeeper} + queryServer := stakingkeeper.Querier{Keeper: p.stakingKeeper.Keeper} res, err := queryServer.Redelegations(ctx, req) if err != nil { diff --git a/precompiles/staking/query_test.go b/precompiles/staking/query_test.go index 31f757c06f..60e301556f 100644 --- a/precompiles/staking/query_test.go +++ b/precompiles/staking/query_test.go @@ -10,10 +10,10 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v17/precompiles/authorization" - cmn "github.com/evmos/evmos/v17/precompiles/common" - "github.com/evmos/evmos/v17/precompiles/staking" - testutiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v18/precompiles/authorization" + cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/precompiles/staking" + testutiltx "github.com/evmos/evmos/v18/testutil/tx" ) func (s *PrecompileTestSuite) TestDelegation() { diff --git a/precompiles/staking/setup_test.go b/precompiles/staking/setup_test.go index ffcaec09fc..0bf18fe47e 100644 --- a/precompiles/staking/setup_test.go +++ b/precompiles/staking/setup_test.go @@ -9,10 +9,10 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - evmosapp "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/precompiles/staking" - "github.com/evmos/evmos/v17/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmosapp "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/precompiles/staking" + "github.com/evmos/evmos/v18/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" diff --git a/precompiles/staking/staking.go b/precompiles/staking/staking.go index 3a04db43a2..5eb18cccf5 100644 --- a/precompiles/staking/staking.go +++ b/precompiles/staking/staking.go @@ -11,12 +11,12 @@ import ( "github.com/cometbft/cometbft/libs/log" storetypes "github.com/cosmos/cosmos-sdk/store/types" authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" - stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v17/precompiles/authorization" - cmn "github.com/evmos/evmos/v17/precompiles/common" + "github.com/evmos/evmos/v18/precompiles/authorization" + cmn "github.com/evmos/evmos/v18/precompiles/common" + stakingkeeper "github.com/evmos/evmos/v18/x/staking/keeper" ) var _ vm.PrecompiledContract = &Precompile{} diff --git a/precompiles/staking/staking_test.go b/precompiles/staking/staking_test.go index 97a1edd619..df88c54aa4 100644 --- a/precompiles/staking/staking_test.go +++ b/precompiles/staking/staking_test.go @@ -12,11 +12,11 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/precompiles/authorization" - "github.com/evmos/evmos/v17/precompiles/staking" - "github.com/evmos/evmos/v17/utils" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/precompiles/authorization" + "github.com/evmos/evmos/v18/precompiles/staking" + "github.com/evmos/evmos/v18/utils" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) func (s *PrecompileTestSuite) TestIsTransaction() { diff --git a/precompiles/staking/testdata/staking_caller.go b/precompiles/staking/testdata/staking_caller.go index acab33e507..e620768726 100644 --- a/precompiles/staking/testdata/staking_caller.go +++ b/precompiles/staking/testdata/staking_caller.go @@ -7,7 +7,7 @@ import ( _ "embed" // embed compiled smart contract "encoding/json" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) var ( diff --git a/precompiles/staking/tx.go b/precompiles/staking/tx.go index 1e859e709d..5545c8a443 100644 --- a/precompiles/staking/tx.go +++ b/precompiles/staking/tx.go @@ -8,13 +8,13 @@ import ( "time" sdk "github.com/cosmos/cosmos-sdk/types" - stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v17/precompiles/authorization" - "github.com/evmos/evmos/v17/x/evm/statedb" + "github.com/evmos/evmos/v18/precompiles/authorization" + "github.com/evmos/evmos/v18/x/evm/statedb" + stakingkeeper "github.com/evmos/evmos/v18/x/staking/keeper" ) const ( diff --git a/precompiles/staking/tx_test.go b/precompiles/staking/tx_test.go index fd695ebafb..2b42f63ccf 100644 --- a/precompiles/staking/tx_test.go +++ b/precompiles/staking/tx_test.go @@ -10,10 +10,10 @@ import ( geth "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" - cmn "github.com/evmos/evmos/v17/precompiles/common" - "github.com/evmos/evmos/v17/precompiles/staking" - "github.com/evmos/evmos/v17/precompiles/testutil" - evmosutiltx "github.com/evmos/evmos/v17/testutil/tx" + cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/precompiles/staking" + "github.com/evmos/evmos/v18/precompiles/testutil" + evmosutiltx "github.com/evmos/evmos/v18/testutil/tx" ) func (s *PrecompileTestSuite) TestCreateValidator() { diff --git a/precompiles/staking/types.go b/precompiles/staking/types.go index 9eae54e055..cb19805b05 100644 --- a/precompiles/staking/types.go +++ b/precompiles/staking/types.go @@ -19,7 +19,7 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - cmn "github.com/evmos/evmos/v17/precompiles/common" + cmn "github.com/evmos/evmos/v18/precompiles/common" ) // EventCreateValidator defines the event data for the staking CreateValidator transaction. diff --git a/precompiles/staking/utils_test.go b/precompiles/staking/utils_test.go index f0f1fbdee4..32dcc4c434 100644 --- a/precompiles/staking/utils_test.go +++ b/precompiles/staking/utils_test.go @@ -2,6 +2,7 @@ package staking_test import ( "encoding/json" + "fmt" "math/big" "slices" "time" @@ -21,26 +22,32 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - evmosapp "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/precompiles/authorization" - cmn "github.com/evmos/evmos/v17/precompiles/common" - "github.com/evmos/evmos/v17/precompiles/staking" - "github.com/evmos/evmos/v17/precompiles/testutil" - "github.com/evmos/evmos/v17/precompiles/testutil/contracts" - evmosutil "github.com/evmos/evmos/v17/testutil" - testutiltx "github.com/evmos/evmos/v17/testutil/tx" - evmostypes "github.com/evmos/evmos/v17/types" - "github.com/evmos/evmos/v17/utils" - "github.com/evmos/evmos/v17/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" - inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" + "github.com/ethereum/go-ethereum/crypto" + evmosapp "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + "github.com/evmos/evmos/v18/precompiles/authorization" + cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/precompiles/staking" + "github.com/evmos/evmos/v18/precompiles/testutil" + "github.com/evmos/evmos/v18/precompiles/testutil/contracts" + evmosutil "github.com/evmos/evmos/v18/testutil" + testutiltx "github.com/evmos/evmos/v18/testutil/tx" + evmostypes "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v18/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" + inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" + stakingkeeper "github.com/evmos/evmos/v18/x/staking/keeper" + vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" ) +// stipend to pay EVM tx fees +var accountGasCoverage = sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, math.NewInt(1e16))) + // SetupWithGenesisValSet initializes a new EvmosApp with a validator set and genesis accounts // that also act as delegators. For simplicity, each validator is bonded with a delegation // of one consensus engine unit (10^6) in the default token of the simapp from first genesis @@ -328,6 +335,13 @@ func (s *PrecompileTestSuite) SetupApprovalWithContractCalls(approvalArgs contra _, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, approvalArgs, logCheckArgs) Expect(err).To(BeNil(), "error while approving: %v", err) + // get granter address from private key provided + pk, ok := approvalArgs.PrivKey.(*ethsecp256k1.PrivKey) + Expect(ok).To(BeTrue(), fmt.Sprintf("expected a ethsecp256k1.PrivKey, but got %T", approvalArgs.PrivKey)) + key, err := pk.ToECDSA() + Expect(err).To(BeNil()) + granter := crypto.PubkeyToAddress(key.PublicKey) + // iterate over args var expectedAuthz stakingtypes.AuthorizationType for _, msgType := range msgTypes { @@ -341,7 +355,7 @@ func (s *PrecompileTestSuite) SetupApprovalWithContractCalls(approvalArgs contra case staking.CancelUnbondingDelegationMsg: expectedAuthz = staking.CancelUnbondingDelegationAuthz } - authz, expirationTime := s.CheckAuthorization(expectedAuthz, approvalArgs.ContractAddr, s.address) + authz, expirationTime := s.CheckAuthorization(expectedAuthz, approvalArgs.ContractAddr, granter) Expect(authz).ToNot(BeNil(), "expected authorization to be set") Expect(authz.MaxTokens.Amount).To(Equal(math.NewInt(expAmount.Int64())), "expected different allowance") Expect(authz.MsgTypeURL()).To(Equal(msgType), "expected different message type") @@ -363,8 +377,13 @@ func (s *PrecompileTestSuite) DeployContract(contract evmtypes.CompiledContract) // NextBlock commits the current block and sets up the next block. func (s *PrecompileTestSuite) NextBlock() { + s.NextBlockAfter(time.Second) +} + +// NextBlock commits the current block and sets up the next block. +func (s *PrecompileTestSuite) NextBlockAfter(t time.Duration) { var err error - s.ctx, err = evmosutil.CommitAndCreateNewCtx(s.ctx, s.app, time.Second, nil) + s.ctx, err = evmosutil.CommitAndCreateNewCtx(s.ctx, s.app, t, nil) Expect(err).To(BeNil(), "failed to commit block") } @@ -501,7 +520,7 @@ func (s *PrecompileTestSuite) setupRedelegations(redelAmt *big.Int) error { // create a validator with s.address and s.privKey // then create a redelegation from validator[0] to this new validator - testutil.CreateValidator(s.ctx, s.T(), s.privKey.PubKey(), s.app.StakingKeeper, math.NewInt(100)) + testutil.CreateValidator(s.ctx, s.T(), s.privKey.PubKey(), *s.app.StakingKeeper.Keeper, math.NewInt(100)) msg.ValidatorDstAddress = sdk.ValAddress(s.address.Bytes()).String() _, err := msgSrv.BeginRedelegate(s.ctx, &msg) return err @@ -519,3 +538,37 @@ func (s *PrecompileTestSuite) CheckValidatorOutput(valOut staking.ValidatorInfo) Expect(slices.Contains(validatorAddrs, operatorAddress)).To(BeTrue(), "operator address not found in test suite validators") Expect(valOut.DelegatorShares).To(Equal(big.NewInt(1e18)), "expected different delegator shares") } + +// setupVestingAccount is a helper function used in integraiton tests to setup a vesting account +// using the TestVestingSchedule. Also, funds the account with extra funds to pay for transaction fees +func (s *PrecompileTestSuite) setupVestingAccount(funder, vestAcc sdk.AccAddress) *vestingtypes.ClawbackVestingAccount { + vestingAmtTotal := evmosutil.TestVestingSchedule.TotalVestingCoins + + vestingStart := s.ctx.BlockTime() + baseAccount := authtypes.NewBaseAccountWithAddress(vestAcc.Bytes()) + clawbackAccount := vestingtypes.NewClawbackVestingAccount( + baseAccount, + funder, + vestingAmtTotal, + vestingStart, + evmosutil.TestVestingSchedule.LockupPeriods, + evmosutil.TestVestingSchedule.VestingPeriods, + ) + + err := evmosutil.FundAccount(s.ctx, s.app.BankKeeper, clawbackAccount.GetAddress(), vestingAmtTotal) + Expect(err).To(BeNil()) + acc := s.app.AccountKeeper.NewAccount(s.ctx, clawbackAccount) + s.app.AccountKeeper.SetAccount(s.ctx, acc) + + // Check all coins are locked up + lockedUp := clawbackAccount.GetLockedUpCoins(s.ctx.BlockTime()) + Expect(vestingAmtTotal).To(Equal(lockedUp)) + + // Grant gas stipend to cover EVM fees + err = evmosutil.FundAccount(s.ctx, s.app.BankKeeper, clawbackAccount.GetAddress(), accountGasCoverage) + Expect(err).To(BeNil()) + granteeBalance := s.app.BankKeeper.GetBalance(s.ctx, clawbackAccount.GetAddress(), s.bondDenom) + Expect(granteeBalance).To(Equal(accountGasCoverage[0].Add(vestingAmtTotal[0]))) + + return clawbackAccount +} diff --git a/precompiles/testutil/contracts/contracts.go b/precompiles/testutil/contracts/contracts.go index 3c0e6c014d..e735739692 100644 --- a/precompiles/testutil/contracts/contracts.go +++ b/precompiles/testutil/contracts/contracts.go @@ -11,11 +11,11 @@ import ( abci "github.com/cometbft/cometbft/abci/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/crypto" - evmosapp "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" - "github.com/evmos/evmos/v17/precompiles/testutil" - evmosutil "github.com/evmos/evmos/v17/testutil" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmosapp "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + "github.com/evmos/evmos/v18/precompiles/testutil" + evmosutil "github.com/evmos/evmos/v18/testutil" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) // Call is a helper function to call any arbitrary smart contract. diff --git a/precompiles/testutil/contracts/distribution_caller.go b/precompiles/testutil/contracts/distribution_caller.go index 6ff750997e..b4df0e5eda 100644 --- a/precompiles/testutil/contracts/distribution_caller.go +++ b/precompiles/testutil/contracts/distribution_caller.go @@ -7,7 +7,7 @@ import ( _ "embed" // embed compiled smart contract "encoding/json" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) var ( diff --git a/precompiles/testutil/contracts/interchain_sender.go b/precompiles/testutil/contracts/interchain_sender.go index 1d03c0396e..757ff2b533 100644 --- a/precompiles/testutil/contracts/interchain_sender.go +++ b/precompiles/testutil/contracts/interchain_sender.go @@ -7,7 +7,7 @@ import ( _ "embed" // embed compiled smart contract "encoding/json" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) var ( diff --git a/precompiles/testutil/contracts/types.go b/precompiles/testutil/contracts/types.go index 9f06a26dd1..66e69bf166 100644 --- a/precompiles/testutil/contracts/types.go +++ b/precompiles/testutil/contracts/types.go @@ -10,7 +10,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" ) // CallArgs is a struct to define all relevant data to call a smart contract. diff --git a/precompiles/testutil/errors.go b/precompiles/testutil/errors.go index 8136cf7dd2..d6fdfbe381 100644 --- a/precompiles/testutil/errors.go +++ b/precompiles/testutil/errors.go @@ -8,7 +8,7 @@ import ( "strings" abci "github.com/cometbft/cometbft/abci/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) // CheckVMError is a helper function used to check if the transaction is reverted with the expected error message diff --git a/precompiles/testutil/events.go b/precompiles/testutil/events.go index 6a791f63e1..4aebc03a0b 100644 --- a/precompiles/testutil/events.go +++ b/precompiles/testutil/events.go @@ -15,7 +15,7 @@ import ( abci "github.com/cometbft/cometbft/abci/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) // CheckAuthorizationEvents is a helper function used in the integration tests and checks if the approval event is emitted. diff --git a/precompiles/testutil/logs.go b/precompiles/testutil/logs.go index f687b927ea..77b3481b17 100644 --- a/precompiles/testutil/logs.go +++ b/precompiles/testutil/logs.go @@ -8,7 +8,7 @@ import ( abci "github.com/cometbft/cometbft/abci/types" "github.com/ethereum/go-ethereum/accounts/abi" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) // CheckLogs checks the logs for the given events and whether the transaction was successful or not. diff --git a/precompiles/vesting/approve.go b/precompiles/vesting/approve.go index 21e532bfde..ab330178a0 100644 --- a/precompiles/vesting/approve.go +++ b/precompiles/vesting/approve.go @@ -11,8 +11,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v17/precompiles/common" - vestingtypes "github.com/evmos/evmos/v17/x/vesting/types" + cmn "github.com/evmos/evmos/v18/precompiles/common" + vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" ) var ( diff --git a/precompiles/vesting/events.go b/precompiles/vesting/events.go index 1233547b5d..d6bb199886 100644 --- a/precompiles/vesting/events.go +++ b/precompiles/vesting/events.go @@ -8,9 +8,9 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v17/precompiles/authorization" - cmn "github.com/evmos/evmos/v17/precompiles/common" - vestingtypes "github.com/evmos/evmos/v17/x/vesting/types" + "github.com/evmos/evmos/v18/precompiles/authorization" + cmn "github.com/evmos/evmos/v18/precompiles/common" + vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" ) const ( diff --git a/precompiles/vesting/integration_test.go b/precompiles/vesting/integration_test.go index 7896ca3a91..3f5650c9e0 100644 --- a/precompiles/vesting/integration_test.go +++ b/precompiles/vesting/integration_test.go @@ -11,14 +11,14 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/ethereum/go-ethereum/common" - cmn "github.com/evmos/evmos/v17/precompiles/common" - "github.com/evmos/evmos/v17/precompiles/testutil" - "github.com/evmos/evmos/v17/precompiles/testutil/contracts" - "github.com/evmos/evmos/v17/precompiles/vesting" - "github.com/evmos/evmos/v17/precompiles/vesting/testdata" - evmosutil "github.com/evmos/evmos/v17/testutil" - testutiltx "github.com/evmos/evmos/v17/testutil/tx" - vestingtypes "github.com/evmos/evmos/v17/x/vesting/types" + cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/precompiles/testutil" + "github.com/evmos/evmos/v18/precompiles/testutil/contracts" + "github.com/evmos/evmos/v18/precompiles/vesting" + "github.com/evmos/evmos/v18/precompiles/vesting/testdata" + evmosutil "github.com/evmos/evmos/v18/testutil" + testutiltx "github.com/evmos/evmos/v18/testutil/tx" + vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" diff --git a/precompiles/vesting/query_test.go b/precompiles/vesting/query_test.go index a3ce435914..b7c3814c95 100644 --- a/precompiles/vesting/query_test.go +++ b/precompiles/vesting/query_test.go @@ -5,8 +5,8 @@ package vesting_test import ( "fmt" - cmn "github.com/evmos/evmos/v17/precompiles/common" - "github.com/evmos/evmos/v17/precompiles/vesting" + cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/precompiles/vesting" ) func (s *PrecompileTestSuite) TestBalances() { diff --git a/precompiles/vesting/setup_test.go b/precompiles/vesting/setup_test.go index 1f932b3542..be57aa3ba7 100644 --- a/precompiles/vesting/setup_test.go +++ b/precompiles/vesting/setup_test.go @@ -11,10 +11,10 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - evmosapp "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/precompiles/vesting" - "github.com/evmos/evmos/v17/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmosapp "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/precompiles/vesting" + "github.com/evmos/evmos/v18/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" "github.com/stretchr/testify/suite" //nolint:revive // dot imports are fine for Ginkgo diff --git a/precompiles/vesting/testdata/vesting_caller.go b/precompiles/vesting/testdata/vesting_caller.go index 2c9031a628..9f2ced9c93 100644 --- a/precompiles/vesting/testdata/vesting_caller.go +++ b/precompiles/vesting/testdata/vesting_caller.go @@ -7,7 +7,7 @@ import ( _ "embed" // embed compiled smart contract "encoding/json" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) var ( diff --git a/precompiles/vesting/tx.go b/precompiles/vesting/tx.go index 014fba8417..f9284fe91a 100644 --- a/precompiles/vesting/tx.go +++ b/precompiles/vesting/tx.go @@ -9,7 +9,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v17/precompiles/authorization" + "github.com/evmos/evmos/v18/precompiles/authorization" ) const ( diff --git a/precompiles/vesting/tx_test.go b/precompiles/vesting/tx_test.go index 16d59a82d6..a9b344085b 100644 --- a/precompiles/vesting/tx_test.go +++ b/precompiles/vesting/tx_test.go @@ -9,16 +9,16 @@ import ( "cosmossdk.io/math" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v17/precompiles/testutil" + "github.com/evmos/evmos/v18/precompiles/testutil" sdk "github.com/cosmos/cosmos-sdk/types" - cmn "github.com/evmos/evmos/v17/precompiles/common" - "github.com/evmos/evmos/v17/precompiles/vesting" - evmosutil "github.com/evmos/evmos/v17/testutil" - evmosutiltx "github.com/evmos/evmos/v17/testutil/tx" - evmostypes "github.com/evmos/evmos/v17/types" - "github.com/evmos/evmos/v17/utils" - vestingtypes "github.com/evmos/evmos/v17/x/vesting/types" + cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/precompiles/vesting" + evmosutil "github.com/evmos/evmos/v18/testutil" + evmosutiltx "github.com/evmos/evmos/v18/testutil/tx" + evmostypes "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v18/utils" + vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" ) var ( diff --git a/precompiles/vesting/types.go b/precompiles/vesting/types.go index 8fe5c03485..6e90227ed0 100644 --- a/precompiles/vesting/types.go +++ b/precompiles/vesting/types.go @@ -7,7 +7,7 @@ import ( "time" "cosmossdk.io/math" - "github.com/evmos/evmos/v17/precompiles/authorization" + "github.com/evmos/evmos/v18/precompiles/authorization" "github.com/ethereum/go-ethereum/common" @@ -15,8 +15,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" cosmosvestingtypes "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" - cmn "github.com/evmos/evmos/v17/precompiles/common" - vestingtypes "github.com/evmos/evmos/v17/x/vesting/types" + cmn "github.com/evmos/evmos/v18/precompiles/common" + vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" ) // LockupPeriods is a struct used to parse the LockupPeriods parameter diff --git a/precompiles/vesting/utils_test.go b/precompiles/vesting/utils_test.go index 268ee7be99..d105910ee8 100644 --- a/precompiles/vesting/utils_test.go +++ b/precompiles/vesting/utils_test.go @@ -20,19 +20,19 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - evmosapp "github.com/evmos/evmos/v17/app" - cmn "github.com/evmos/evmos/v17/precompiles/common" - "github.com/evmos/evmos/v17/precompiles/testutil/contracts" - "github.com/evmos/evmos/v17/precompiles/vesting" - "github.com/evmos/evmos/v17/precompiles/vesting/testdata" - evmosutil "github.com/evmos/evmos/v17/testutil" - testutiltx "github.com/evmos/evmos/v17/testutil/tx" - evmostypes "github.com/evmos/evmos/v17/types" - "github.com/evmos/evmos/v17/utils" - "github.com/evmos/evmos/v17/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" - inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" - vestingtypes "github.com/evmos/evmos/v17/x/vesting/types" + evmosapp "github.com/evmos/evmos/v18/app" + cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/precompiles/testutil/contracts" + "github.com/evmos/evmos/v18/precompiles/vesting" + "github.com/evmos/evmos/v18/precompiles/vesting/testdata" + evmosutil "github.com/evmos/evmos/v18/testutil" + testutiltx "github.com/evmos/evmos/v18/testutil/tx" + evmostypes "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v18/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" + inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" + vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/gomega" diff --git a/precompiles/vesting/vesting.go b/precompiles/vesting/vesting.go index f6cb23e2ba..e7d7a08fae 100644 --- a/precompiles/vesting/vesting.go +++ b/precompiles/vesting/vesting.go @@ -8,7 +8,7 @@ import ( "embed" "fmt" - "github.com/evmos/evmos/v17/precompiles/authorization" + "github.com/evmos/evmos/v18/precompiles/authorization" sdk "github.com/cosmos/cosmos-sdk/types" @@ -18,8 +18,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v17/precompiles/common" - vestingkeeper "github.com/evmos/evmos/v17/x/vesting/keeper" + cmn "github.com/evmos/evmos/v18/precompiles/common" + vestingkeeper "github.com/evmos/evmos/v18/x/vesting/keeper" ) var _ vm.PrecompiledContract = &Precompile{} diff --git a/precompiles/werc20/integration_test.go b/precompiles/werc20/integration_test.go index 6b01cbc1a0..c0d96b1bc3 100644 --- a/precompiles/werc20/integration_test.go +++ b/precompiles/werc20/integration_test.go @@ -4,18 +4,18 @@ import ( "math/big" sdk "github.com/cosmos/cosmos-sdk/types" - auth "github.com/evmos/evmos/v17/precompiles/authorization" - "github.com/evmos/evmos/v17/precompiles/erc20" - evmosutiltx "github.com/evmos/evmos/v17/testutil/tx" + auth "github.com/evmos/evmos/v18/precompiles/authorization" + "github.com/evmos/evmos/v18/precompiles/erc20" + evmosutiltx "github.com/evmos/evmos/v18/testutil/tx" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v17/precompiles/testutil" - "github.com/evmos/evmos/v17/precompiles/werc20" - "github.com/evmos/evmos/v17/precompiles/werc20/testdata" - "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" - erc20types "github.com/evmos/evmos/v17/x/erc20/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/precompiles/testutil" + "github.com/evmos/evmos/v18/precompiles/werc20" + "github.com/evmos/evmos/v18/precompiles/werc20/testdata" + "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" + erc20types "github.com/evmos/evmos/v18/x/erc20/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" diff --git a/precompiles/werc20/setup_test.go b/precompiles/werc20/setup_test.go index b71a403240..9c3e8226a0 100644 --- a/precompiles/werc20/setup_test.go +++ b/precompiles/werc20/setup_test.go @@ -3,12 +3,12 @@ package werc20_test import ( "testing" - "github.com/evmos/evmos/v17/precompiles/werc20" + "github.com/evmos/evmos/v18/precompiles/werc20" - "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v17/testutil/integration/evmos/network" + "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v18/testutil/integration/evmos/network" "github.com/stretchr/testify/suite" //nolint:revive // dot imports are fine for Ginkgo diff --git a/precompiles/werc20/testdata/wevmos.go b/precompiles/werc20/testdata/wevmos.go index 1d64dc7b20..1672cc468d 100644 --- a/precompiles/werc20/testdata/wevmos.go +++ b/precompiles/werc20/testdata/wevmos.go @@ -7,7 +7,7 @@ import ( _ "embed" // embed compiled smart contract "encoding/json" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) var ( diff --git a/precompiles/werc20/utils_test.go b/precompiles/werc20/utils_test.go index 469411ee2e..41c20a1d83 100644 --- a/precompiles/werc20/utils_test.go +++ b/precompiles/werc20/utils_test.go @@ -7,16 +7,16 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/authz" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - commonfactory "github.com/evmos/evmos/v17/testutil/integration/common/factory" + commonfactory "github.com/evmos/evmos/v18/testutil/integration/common/factory" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v17/precompiles/erc20" - "github.com/evmos/evmos/v17/precompiles/testutil" - "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/precompiles/erc20" + "github.com/evmos/evmos/v18/precompiles/testutil" + "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" //nolint:revive // dot imports are fine for Gomega . "github.com/onsi/gomega" diff --git a/precompiles/werc20/werc20.go b/precompiles/werc20/werc20.go index aeae45cb1e..05f116b503 100644 --- a/precompiles/werc20/werc20.go +++ b/precompiles/werc20/werc20.go @@ -12,10 +12,10 @@ import ( authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - cmn "github.com/evmos/evmos/v17/precompiles/common" - erc20 "github.com/evmos/evmos/v17/precompiles/erc20" - erc20types "github.com/evmos/evmos/v17/x/erc20/types" - transferkeeper "github.com/evmos/evmos/v17/x/ibc/transfer/keeper" + cmn "github.com/evmos/evmos/v18/precompiles/common" + erc20 "github.com/evmos/evmos/v18/precompiles/erc20" + erc20types "github.com/evmos/evmos/v18/x/erc20/types" + transferkeeper "github.com/evmos/evmos/v18/x/ibc/transfer/keeper" ) // abiPath defines the path to the WERC-20 precompile ABI JSON file. diff --git a/proto/ethermint/crypto/v1/ethsecp256k1/keys.proto b/proto/ethermint/crypto/v1/ethsecp256k1/keys.proto index 7031c789fb..29d35ec01b 100644 --- a/proto/ethermint/crypto/v1/ethsecp256k1/keys.proto +++ b/proto/ethermint/crypto/v1/ethsecp256k1/keys.proto @@ -5,7 +5,7 @@ package ethermint.crypto.v1.ethsecp256k1; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v17/crypto/ethsecp256k1"; +option go_package = "github.com/evmos/evmos/v18/crypto/ethsecp256k1"; // PubKey defines a type alias for an ecdsa.PublicKey that implements // Tendermint's PubKey interface. It represents the 33-byte compressed public diff --git a/proto/ethermint/evm/v1/events.proto b/proto/ethermint/evm/v1/events.proto index df5bb6493e..314cc37d19 100644 --- a/proto/ethermint/evm/v1/events.proto +++ b/proto/ethermint/evm/v1/events.proto @@ -3,7 +3,7 @@ syntax = "proto3"; package ethermint.evm.v1; -option go_package = "github.com/evmos/evmos/v17/x/evm/types"; +option go_package = "github.com/evmos/evmos/v18/x/evm/types"; // EventEthereumTx defines the event for an Ethereum transaction message EventEthereumTx { diff --git a/proto/ethermint/evm/v1/evm.proto b/proto/ethermint/evm/v1/evm.proto index 37d642e8a2..5ba7c2cb89 100644 --- a/proto/ethermint/evm/v1/evm.proto +++ b/proto/ethermint/evm/v1/evm.proto @@ -5,7 +5,7 @@ package ethermint.evm.v1; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v17/x/evm/types"; +option go_package = "github.com/evmos/evmos/v18/x/evm/types"; // Params defines the EVM module parameters message Params { diff --git a/proto/ethermint/evm/v1/genesis.proto b/proto/ethermint/evm/v1/genesis.proto index 5723b4f3c2..4f90910b4f 100644 --- a/proto/ethermint/evm/v1/genesis.proto +++ b/proto/ethermint/evm/v1/genesis.proto @@ -6,7 +6,7 @@ package ethermint.evm.v1; import "ethermint/evm/v1/evm.proto"; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v17/x/evm/types"; +option go_package = "github.com/evmos/evmos/v18/x/evm/types"; // GenesisState defines the evm module's genesis state. message GenesisState { diff --git a/proto/ethermint/evm/v1/query.proto b/proto/ethermint/evm/v1/query.proto index f6daa13170..af2a809f3a 100644 --- a/proto/ethermint/evm/v1/query.proto +++ b/proto/ethermint/evm/v1/query.proto @@ -10,7 +10,7 @@ import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; import "google/protobuf/timestamp.proto"; -option go_package = "github.com/evmos/evmos/v17/x/evm/types"; +option go_package = "github.com/evmos/evmos/v18/x/evm/types"; // Query defines the gRPC querier service. service Query { diff --git a/proto/ethermint/evm/v1/tx.proto b/proto/ethermint/evm/v1/tx.proto index 118be50566..00c64e00ea 100644 --- a/proto/ethermint/evm/v1/tx.proto +++ b/proto/ethermint/evm/v1/tx.proto @@ -10,7 +10,7 @@ import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; import "google/protobuf/any.proto"; -option go_package = "github.com/evmos/evmos/v17/x/evm/types"; +option go_package = "github.com/evmos/evmos/v18/x/evm/types"; // Msg defines the evm Msg service. service Msg { diff --git a/proto/ethermint/feemarket/v1/events.proto b/proto/ethermint/feemarket/v1/events.proto index 485663670d..526100f8d8 100644 --- a/proto/ethermint/feemarket/v1/events.proto +++ b/proto/ethermint/feemarket/v1/events.proto @@ -3,7 +3,7 @@ syntax = "proto3"; package ethermint.feemarket.v1; -option go_package = "github.com/evmos/evmos/v17/x/feemarket/types"; +option go_package = "github.com/evmos/evmos/v18/x/feemarket/types"; // EventFeeMarket is the event type for the fee market module message EventFeeMarket { diff --git a/proto/ethermint/feemarket/v1/feemarket.proto b/proto/ethermint/feemarket/v1/feemarket.proto index f9d4ed5baf..b2458e5f74 100644 --- a/proto/ethermint/feemarket/v1/feemarket.proto +++ b/proto/ethermint/feemarket/v1/feemarket.proto @@ -5,7 +5,7 @@ package ethermint.feemarket.v1; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v17/x/feemarket/types"; +option go_package = "github.com/evmos/evmos/v18/x/feemarket/types"; // Params defines the EVM module parameters message Params { diff --git a/proto/ethermint/feemarket/v1/genesis.proto b/proto/ethermint/feemarket/v1/genesis.proto index 97c1e1eaa5..2d359e8660 100644 --- a/proto/ethermint/feemarket/v1/genesis.proto +++ b/proto/ethermint/feemarket/v1/genesis.proto @@ -6,7 +6,7 @@ package ethermint.feemarket.v1; import "ethermint/feemarket/v1/feemarket.proto"; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v17/x/feemarket/types"; +option go_package = "github.com/evmos/evmos/v18/x/feemarket/types"; // GenesisState defines the feemarket module's genesis state. message GenesisState { diff --git a/proto/ethermint/feemarket/v1/query.proto b/proto/ethermint/feemarket/v1/query.proto index 55eb2eeff2..c96f560dc2 100644 --- a/proto/ethermint/feemarket/v1/query.proto +++ b/proto/ethermint/feemarket/v1/query.proto @@ -7,7 +7,7 @@ import "ethermint/feemarket/v1/feemarket.proto"; import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; -option go_package = "github.com/evmos/evmos/v17/x/feemarket/types"; +option go_package = "github.com/evmos/evmos/v18/x/feemarket/types"; // Query defines the gRPC querier service. service Query { diff --git a/proto/ethermint/feemarket/v1/tx.proto b/proto/ethermint/feemarket/v1/tx.proto index 2c953b84b9..985cd2223c 100644 --- a/proto/ethermint/feemarket/v1/tx.proto +++ b/proto/ethermint/feemarket/v1/tx.proto @@ -8,7 +8,7 @@ import "cosmos_proto/cosmos.proto"; import "ethermint/feemarket/v1/feemarket.proto"; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v17/x/feemarket/types"; +option go_package = "github.com/evmos/evmos/v18/x/feemarket/types"; // Msg defines the erc20 Msg service. service Msg { diff --git a/proto/ethermint/types/v1/account.proto b/proto/ethermint/types/v1/account.proto index b16a9f9960..a81307e35f 100644 --- a/proto/ethermint/types/v1/account.proto +++ b/proto/ethermint/types/v1/account.proto @@ -7,7 +7,7 @@ import "cosmos/auth/v1beta1/auth.proto"; import "cosmos_proto/cosmos.proto"; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v17/types"; +option go_package = "github.com/evmos/evmos/v18/types"; // EthAccount implements the authtypes.AccountI interface and embeds an // authtypes.BaseAccount type. It is compatible with the auth AccountKeeper. diff --git a/proto/ethermint/types/v1/dynamic_fee.proto b/proto/ethermint/types/v1/dynamic_fee.proto index 6e60244e19..3d196a1d63 100644 --- a/proto/ethermint/types/v1/dynamic_fee.proto +++ b/proto/ethermint/types/v1/dynamic_fee.proto @@ -5,7 +5,7 @@ package ethermint.types.v1; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v17/types"; +option go_package = "github.com/evmos/evmos/v18/types"; // ExtensionOptionDynamicFeeTx is an extension option that specifies the maxPrioPrice for cosmos tx message ExtensionOptionDynamicFeeTx { diff --git a/proto/ethermint/types/v1/indexer.proto b/proto/ethermint/types/v1/indexer.proto index e7fba6ab74..34ebe6d07e 100644 --- a/proto/ethermint/types/v1/indexer.proto +++ b/proto/ethermint/types/v1/indexer.proto @@ -5,7 +5,7 @@ package ethermint.types.v1; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v17/types"; +option go_package = "github.com/evmos/evmos/v18/types"; // TxResult is the value stored in eth tx indexer message TxResult { diff --git a/proto/ethermint/types/v1/web3.proto b/proto/ethermint/types/v1/web3.proto index 4f1f0966a4..09d6359f3b 100644 --- a/proto/ethermint/types/v1/web3.proto +++ b/proto/ethermint/types/v1/web3.proto @@ -5,7 +5,7 @@ package ethermint.types.v1; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v17/types"; +option go_package = "github.com/evmos/evmos/v18/types"; // ExtensionOptionsWeb3Tx is an extension option that specifies the typed chain id, // the fee payer as well as its signature data. diff --git a/proto/evmos/epochs/v1/genesis.proto b/proto/evmos/epochs/v1/genesis.proto index adf94c25d8..b82908826d 100644 --- a/proto/evmos/epochs/v1/genesis.proto +++ b/proto/evmos/epochs/v1/genesis.proto @@ -7,7 +7,7 @@ import "gogoproto/gogo.proto"; import "google/protobuf/duration.proto"; import "google/protobuf/timestamp.proto"; -option go_package = "github.com/evmos/evmos/v17/x/epochs/types"; +option go_package = "github.com/evmos/evmos/v18/x/epochs/types"; // EpochInfo defines the message interface containing the relevant informations about // an epoch. diff --git a/proto/evmos/epochs/v1/query.proto b/proto/evmos/epochs/v1/query.proto index d4af8486c7..fe975a7cba 100644 --- a/proto/evmos/epochs/v1/query.proto +++ b/proto/evmos/epochs/v1/query.proto @@ -8,7 +8,7 @@ import "evmos/epochs/v1/genesis.proto"; import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; -option go_package = "github.com/evmos/evmos/v17/x/epochs/types"; +option go_package = "github.com/evmos/evmos/v18/x/epochs/types"; // Query defines the gRPC querier service. service Query { diff --git a/proto/evmos/erc20/v1/erc20.proto b/proto/evmos/erc20/v1/erc20.proto index c33883f4dc..33fba39d1a 100644 --- a/proto/evmos/erc20/v1/erc20.proto +++ b/proto/evmos/erc20/v1/erc20.proto @@ -5,7 +5,7 @@ package evmos.erc20.v1; import "cosmos/bank/v1beta1/bank.proto"; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v17/x/erc20/types"; +option go_package = "github.com/evmos/evmos/v18/x/erc20/types"; // Owner enumerates the ownership of a ERC20 contract. enum Owner { diff --git a/proto/evmos/erc20/v1/events.proto b/proto/evmos/erc20/v1/events.proto index d87b15fc5e..fb7c362bd0 100644 --- a/proto/evmos/erc20/v1/events.proto +++ b/proto/evmos/erc20/v1/events.proto @@ -3,7 +3,7 @@ syntax = "proto3"; package evmos.erc20.v1; -option go_package = "github.com/evmos/evmos/v17/x/erc20/types"; +option go_package = "github.com/evmos/evmos/v18/x/erc20/types"; // EventRegisterPair is an event emitted when a coin is registered. message EventRegisterPair { diff --git a/proto/evmos/erc20/v1/genesis.proto b/proto/evmos/erc20/v1/genesis.proto index b82d6e4765..2c030a9d5a 100644 --- a/proto/evmos/erc20/v1/genesis.proto +++ b/proto/evmos/erc20/v1/genesis.proto @@ -6,7 +6,7 @@ package evmos.erc20.v1; import "evmos/erc20/v1/erc20.proto"; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v17/x/erc20/types"; +option go_package = "github.com/evmos/evmos/v18/x/erc20/types"; // GenesisState defines the module's genesis state. message GenesisState { diff --git a/proto/evmos/erc20/v1/query.proto b/proto/evmos/erc20/v1/query.proto index 9f5a291fa8..12b6e0aa92 100644 --- a/proto/evmos/erc20/v1/query.proto +++ b/proto/evmos/erc20/v1/query.proto @@ -9,7 +9,7 @@ import "evmos/erc20/v1/genesis.proto"; import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; -option go_package = "github.com/evmos/evmos/v17/x/erc20/types"; +option go_package = "github.com/evmos/evmos/v18/x/erc20/types"; // Query defines the gRPC querier service. service Query { diff --git a/proto/evmos/erc20/v1/tx.proto b/proto/evmos/erc20/v1/tx.proto index 7abb8cbe38..f3fda57407 100644 --- a/proto/evmos/erc20/v1/tx.proto +++ b/proto/evmos/erc20/v1/tx.proto @@ -10,7 +10,7 @@ import "evmos/erc20/v1/genesis.proto"; import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; -option go_package = "github.com/evmos/evmos/v17/x/erc20/types"; +option go_package = "github.com/evmos/evmos/v18/x/erc20/types"; // Msg defines the erc20 Msg service. service Msg { diff --git a/proto/evmos/incentives/v1/genesis.proto b/proto/evmos/incentives/v1/genesis.proto index 3c8794f8d6..9c8a3f405a 100644 --- a/proto/evmos/incentives/v1/genesis.proto +++ b/proto/evmos/incentives/v1/genesis.proto @@ -6,7 +6,7 @@ import "evmos/incentives/v1/incentives.proto"; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v17/x/incentives/types"; +option go_package = "github.com/evmos/evmos/v18/x/incentives/types"; // GenesisState defines the module's genesis state. message GenesisState { diff --git a/proto/evmos/incentives/v1/incentives.proto b/proto/evmos/incentives/v1/incentives.proto index 680f378863..badebb8fe4 100644 --- a/proto/evmos/incentives/v1/incentives.proto +++ b/proto/evmos/incentives/v1/incentives.proto @@ -6,7 +6,7 @@ package evmos.incentives.v1; import "cosmos/base/v1beta1/coin.proto"; import "gogoproto/gogo.proto"; import "google/protobuf/timestamp.proto"; -option go_package = "github.com/evmos/evmos/v17/x/incentives/types"; +option go_package = "github.com/evmos/evmos/v18/x/incentives/types"; // Incentive defines an instance that organizes distribution conditions for a // given smart contract diff --git a/proto/evmos/inflation/v1/genesis.proto b/proto/evmos/inflation/v1/genesis.proto index 4a2ccf0d65..105071d185 100644 --- a/proto/evmos/inflation/v1/genesis.proto +++ b/proto/evmos/inflation/v1/genesis.proto @@ -7,7 +7,7 @@ import "gogoproto/gogo.proto"; import "evmos/inflation/v1/inflation.proto"; -option go_package = "github.com/evmos/evmos/v17/x/inflation/v1/types"; +option go_package = "github.com/evmos/evmos/v18/x/inflation/v1/types"; // GenesisState defines the inflation module's genesis state. message GenesisState { diff --git a/proto/evmos/inflation/v1/inflation.proto b/proto/evmos/inflation/v1/inflation.proto index bd5d55551a..c85b498be5 100644 --- a/proto/evmos/inflation/v1/inflation.proto +++ b/proto/evmos/inflation/v1/inflation.proto @@ -5,7 +5,7 @@ package evmos.inflation.v1; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v17/x/inflation/v1/types"; +option go_package = "github.com/evmos/evmos/v18/x/inflation/v1/types"; // InflationDistribution defines the distribution in which inflation is // allocated through minting on each epoch (staking, incentives, community). It diff --git a/proto/evmos/inflation/v1/query.proto b/proto/evmos/inflation/v1/query.proto index 2205ee9a7d..b6d5e68337 100644 --- a/proto/evmos/inflation/v1/query.proto +++ b/proto/evmos/inflation/v1/query.proto @@ -8,7 +8,7 @@ import "evmos/inflation/v1/genesis.proto"; import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; -option go_package = "github.com/evmos/evmos/v17/x/inflation/v1/types"; +option go_package = "github.com/evmos/evmos/v18/x/inflation/v1/types"; // Query provides defines the gRPC querier service. service Query { diff --git a/proto/evmos/inflation/v1/tx.proto b/proto/evmos/inflation/v1/tx.proto index 0a6ba6bc64..32272b1a0c 100644 --- a/proto/evmos/inflation/v1/tx.proto +++ b/proto/evmos/inflation/v1/tx.proto @@ -8,7 +8,7 @@ import "cosmos_proto/cosmos.proto"; import "evmos/inflation/v1/genesis.proto"; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v17/x/inflation/v1/types"; +option go_package = "github.com/evmos/evmos/v18/x/inflation/v1/types"; // Msg defines the evm Msg service. service Msg { diff --git a/proto/evmos/vesting/v1/vesting.proto b/proto/evmos/vesting/v1/vesting.proto index 25fedc7c28..79eac99116 100644 --- a/proto/evmos/vesting/v1/vesting.proto +++ b/proto/evmos/vesting/v1/vesting.proto @@ -7,7 +7,7 @@ import "cosmos/vesting/v1beta1/vesting.proto"; import "gogoproto/gogo.proto"; import "google/protobuf/timestamp.proto"; -option go_package = "github.com/evmos/evmos/v17/x/vesting/migrations/types"; +option go_package = "github.com/evmos/evmos/v18/x/vesting/migrations/types"; // ClawbackVestingAccount implements the VestingAccount interface. It provides // an account that can hold contributions subject to "lockup" (like a diff --git a/proto/evmos/vesting/v2/events.proto b/proto/evmos/vesting/v2/events.proto index ccbd0b7694..fa21103ee2 100644 --- a/proto/evmos/vesting/v2/events.proto +++ b/proto/evmos/vesting/v2/events.proto @@ -3,7 +3,7 @@ syntax = "proto3"; package evmos.vesting.v2; -option go_package = "github.com/evmos/evmos/v17/x/vesting/types"; +option go_package = "github.com/evmos/evmos/v18/x/vesting/types"; // EventCreateClawbackVestingAccount defines the event type // for creating a clawback vesting account diff --git a/proto/evmos/vesting/v2/query.proto b/proto/evmos/vesting/v2/query.proto index 90647e4d92..cab5c1f322 100644 --- a/proto/evmos/vesting/v2/query.proto +++ b/proto/evmos/vesting/v2/query.proto @@ -7,7 +7,7 @@ import "cosmos/base/v1beta1/coin.proto"; import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; -option go_package = "github.com/evmos/evmos/v17/x/vesting/types"; +option go_package = "github.com/evmos/evmos/v18/x/vesting/types"; // Query defines the gRPC querier service. service Query { diff --git a/proto/evmos/vesting/v2/tx.proto b/proto/evmos/vesting/v2/tx.proto index 10d2f00f99..693f19dd37 100644 --- a/proto/evmos/vesting/v2/tx.proto +++ b/proto/evmos/vesting/v2/tx.proto @@ -10,7 +10,7 @@ import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; import "google/protobuf/timestamp.proto"; -option go_package = "github.com/evmos/evmos/v17/x/vesting/types"; +option go_package = "github.com/evmos/evmos/v18/x/vesting/types"; // Msg defines the vesting Msg service. service Msg { diff --git a/proto/evmos/vesting/v2/vesting.proto b/proto/evmos/vesting/v2/vesting.proto index baac594fd3..0ad4479496 100644 --- a/proto/evmos/vesting/v2/vesting.proto +++ b/proto/evmos/vesting/v2/vesting.proto @@ -7,7 +7,7 @@ import "cosmos/vesting/v1beta1/vesting.proto"; import "gogoproto/gogo.proto"; import "google/protobuf/timestamp.proto"; -option go_package = "github.com/evmos/evmos/v17/x/vesting/types"; +option go_package = "github.com/evmos/evmos/v18/x/vesting/types"; // ClawbackVestingAccount implements the VestingAccount interface. It provides // an account that can hold contributions subject to "lockup" (like a diff --git a/rpc/apis.go b/rpc/apis.go index 0c85322224..2527ef3207 100644 --- a/rpc/apis.go +++ b/rpc/apis.go @@ -10,16 +10,16 @@ import ( "github.com/ethereum/go-ethereum/rpc" - "github.com/evmos/evmos/v17/rpc/backend" - "github.com/evmos/evmos/v17/rpc/namespaces/ethereum/debug" - "github.com/evmos/evmos/v17/rpc/namespaces/ethereum/eth" - "github.com/evmos/evmos/v17/rpc/namespaces/ethereum/eth/filters" - "github.com/evmos/evmos/v17/rpc/namespaces/ethereum/miner" - "github.com/evmos/evmos/v17/rpc/namespaces/ethereum/net" - "github.com/evmos/evmos/v17/rpc/namespaces/ethereum/personal" - "github.com/evmos/evmos/v17/rpc/namespaces/ethereum/txpool" - "github.com/evmos/evmos/v17/rpc/namespaces/ethereum/web3" - "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v18/rpc/backend" + "github.com/evmos/evmos/v18/rpc/namespaces/ethereum/debug" + "github.com/evmos/evmos/v18/rpc/namespaces/ethereum/eth" + "github.com/evmos/evmos/v18/rpc/namespaces/ethereum/eth/filters" + "github.com/evmos/evmos/v18/rpc/namespaces/ethereum/miner" + "github.com/evmos/evmos/v18/rpc/namespaces/ethereum/net" + "github.com/evmos/evmos/v18/rpc/namespaces/ethereum/personal" + "github.com/evmos/evmos/v18/rpc/namespaces/ethereum/txpool" + "github.com/evmos/evmos/v18/rpc/namespaces/ethereum/web3" + "github.com/evmos/evmos/v18/types" rpcclient "github.com/cometbft/cometbft/rpc/jsonrpc/client" ) diff --git a/rpc/backend/account_info.go b/rpc/backend/account_info.go index fa5e7c543c..92812de6ac 100644 --- a/rpc/backend/account_info.go +++ b/rpc/backend/account_info.go @@ -15,8 +15,8 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" - rpctypes "github.com/evmos/evmos/v17/rpc/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + rpctypes "github.com/evmos/evmos/v18/rpc/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" "github.com/pkg/errors" ) diff --git a/rpc/backend/account_info_test.go b/rpc/backend/account_info_test.go index d3fe0e6a67..858cd1e1ec 100644 --- a/rpc/backend/account_info_test.go +++ b/rpc/backend/account_info_test.go @@ -11,10 +11,10 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" "google.golang.org/grpc/metadata" - "github.com/evmos/evmos/v17/rpc/backend/mocks" - rpctypes "github.com/evmos/evmos/v17/rpc/types" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/rpc/backend/mocks" + rpctypes "github.com/evmos/evmos/v18/rpc/types" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) func (suite *BackendTestSuite) TestGetCode() { diff --git a/rpc/backend/backend.go b/rpc/backend/backend.go index fac06c0a72..d5d38867c1 100644 --- a/rpc/backend/backend.go +++ b/rpc/backend/backend.go @@ -20,10 +20,10 @@ import ( "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rpc" "github.com/ethereum/go-ethereum/signer/core/apitypes" - rpctypes "github.com/evmos/evmos/v17/rpc/types" - "github.com/evmos/evmos/v17/server/config" - evmostypes "github.com/evmos/evmos/v17/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + rpctypes "github.com/evmos/evmos/v18/rpc/types" + "github.com/evmos/evmos/v18/server/config" + evmostypes "github.com/evmos/evmos/v18/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) // BackendI implements the Cosmos and EVM backend. diff --git a/rpc/backend/backend_suite_test.go b/rpc/backend/backend_suite_test.go index 36db4a2b8b..37e8040bd8 100644 --- a/rpc/backend/backend_suite_test.go +++ b/rpc/backend/backend_suite_test.go @@ -18,15 +18,15 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/stretchr/testify/suite" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/crypto/hd" - "github.com/evmos/evmos/v17/encoding" - "github.com/evmos/evmos/v17/indexer" - "github.com/evmos/evmos/v17/rpc/backend/mocks" - rpctypes "github.com/evmos/evmos/v17/rpc/types" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - "github.com/evmos/evmos/v17/utils" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/crypto/hd" + "github.com/evmos/evmos/v18/encoding" + "github.com/evmos/evmos/v18/indexer" + "github.com/evmos/evmos/v18/rpc/backend/mocks" + rpctypes "github.com/evmos/evmos/v18/rpc/types" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/utils" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) type BackendTestSuite struct { diff --git a/rpc/backend/blocks.go b/rpc/backend/blocks.go index b1625d1a00..cca4938390 100644 --- a/rpc/backend/blocks.go +++ b/rpc/backend/blocks.go @@ -16,8 +16,8 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/trie" - rpctypes "github.com/evmos/evmos/v17/rpc/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + rpctypes "github.com/evmos/evmos/v18/rpc/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" "github.com/pkg/errors" "google.golang.org/grpc" "google.golang.org/grpc/metadata" diff --git a/rpc/backend/blocks_test.go b/rpc/backend/blocks_test.go index c11d88da86..44d8b7253d 100644 --- a/rpc/backend/blocks_test.go +++ b/rpc/backend/blocks_test.go @@ -16,10 +16,10 @@ import ( "github.com/ethereum/go-ethereum/trie" "google.golang.org/grpc/metadata" - "github.com/evmos/evmos/v17/rpc/backend/mocks" - ethrpc "github.com/evmos/evmos/v17/rpc/types" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/rpc/backend/mocks" + ethrpc "github.com/evmos/evmos/v18/rpc/types" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) func (suite *BackendTestSuite) TestBlockNumber() { diff --git a/rpc/backend/call_tx.go b/rpc/backend/call_tx.go index 5940329cd7..84a83db798 100644 --- a/rpc/backend/call_tx.go +++ b/rpc/backend/call_tx.go @@ -16,9 +16,9 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" - rpctypes "github.com/evmos/evmos/v17/rpc/types" - "github.com/evmos/evmos/v17/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + rpctypes "github.com/evmos/evmos/v18/rpc/types" + "github.com/evmos/evmos/v18/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" "github.com/pkg/errors" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" diff --git a/rpc/backend/call_tx_test.go b/rpc/backend/call_tx_test.go index 429e104adb..6eb81a6af1 100644 --- a/rpc/backend/call_tx_test.go +++ b/rpc/backend/call_tx_test.go @@ -10,10 +10,10 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/rlp" - "github.com/evmos/evmos/v17/rpc/backend/mocks" - rpctypes "github.com/evmos/evmos/v17/rpc/types" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/rpc/backend/mocks" + rpctypes "github.com/evmos/evmos/v18/rpc/types" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" "google.golang.org/grpc/metadata" ) diff --git a/rpc/backend/chain_info.go b/rpc/backend/chain_info.go index 1f82c9e0b4..f294cb7b94 100644 --- a/rpc/backend/chain_info.go +++ b/rpc/backend/chain_info.go @@ -15,10 +15,10 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rpc" - rpctypes "github.com/evmos/evmos/v17/rpc/types" - "github.com/evmos/evmos/v17/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" + rpctypes "github.com/evmos/evmos/v18/rpc/types" + "github.com/evmos/evmos/v18/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" "github.com/pkg/errors" ) diff --git a/rpc/backend/chain_info_test.go b/rpc/backend/chain_info_test.go index c2c6b0a4e3..bfb2717f8d 100644 --- a/rpc/backend/chain_info_test.go +++ b/rpc/backend/chain_info_test.go @@ -15,11 +15,11 @@ import ( "github.com/cometbft/cometbft/abci/types" tmrpctypes "github.com/cometbft/cometbft/rpc/core/types" - "github.com/evmos/evmos/v17/rpc/backend/mocks" - rpc "github.com/evmos/evmos/v17/rpc/types" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" + "github.com/evmos/evmos/v18/rpc/backend/mocks" + rpc "github.com/evmos/evmos/v18/rpc/types" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" ) func (suite *BackendTestSuite) TestBaseFee() { diff --git a/rpc/backend/client_test.go b/rpc/backend/client_test.go index 4f6a2c2597..e31f37b665 100644 --- a/rpc/backend/client_test.go +++ b/rpc/backend/client_test.go @@ -15,9 +15,9 @@ import ( "github.com/cometbft/cometbft/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v17/rpc/backend/mocks" - rpc "github.com/evmos/evmos/v17/rpc/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/rpc/backend/mocks" + rpc "github.com/evmos/evmos/v18/rpc/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" mock "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" ) diff --git a/rpc/backend/evm_query_client_test.go b/rpc/backend/evm_query_client_test.go index 9179d1fb3f..1d0f9c2942 100644 --- a/rpc/backend/evm_query_client_test.go +++ b/rpc/backend/evm_query_client_test.go @@ -13,10 +13,10 @@ import ( errortypes "github.com/cosmos/cosmos-sdk/types/errors" grpctypes "github.com/cosmos/cosmos-sdk/types/grpc" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v17/rpc/backend/mocks" - rpc "github.com/evmos/evmos/v17/rpc/types" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/rpc/backend/mocks" + rpc "github.com/evmos/evmos/v18/rpc/types" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" mock "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" "google.golang.org/grpc" diff --git a/rpc/backend/feemarket_query_client_test.go b/rpc/backend/feemarket_query_client_test.go index 923bfd7782..49d5ec2cf8 100644 --- a/rpc/backend/feemarket_query_client_test.go +++ b/rpc/backend/feemarket_query_client_test.go @@ -2,9 +2,9 @@ package backend import ( sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/evmos/evmos/v17/rpc/backend/mocks" - rpc "github.com/evmos/evmos/v17/rpc/types" - feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" + "github.com/evmos/evmos/v18/rpc/backend/mocks" + rpc "github.com/evmos/evmos/v18/rpc/types" + feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" ) var _ feemarkettypes.QueryClient = &mocks.FeeMarketQueryClient{} diff --git a/rpc/backend/filters_test.go b/rpc/backend/filters_test.go index bc90a8ad72..5918033cd5 100644 --- a/rpc/backend/filters_test.go +++ b/rpc/backend/filters_test.go @@ -6,9 +6,9 @@ import ( tmtypes "github.com/cometbft/cometbft/types" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v17/rpc/backend/mocks" - ethrpc "github.com/evmos/evmos/v17/rpc/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/rpc/backend/mocks" + ethrpc "github.com/evmos/evmos/v18/rpc/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) func (suite *BackendTestSuite) TestGetLogs() { diff --git a/rpc/backend/mocks/evm_query_client.go b/rpc/backend/mocks/evm_query_client.go index 1927296c82..f947c5208a 100644 --- a/rpc/backend/mocks/evm_query_client.go +++ b/rpc/backend/mocks/evm_query_client.go @@ -9,7 +9,7 @@ import ( mock "github.com/stretchr/testify/mock" - types "github.com/evmos/evmos/v17/x/evm/types" + types "github.com/evmos/evmos/v18/x/evm/types" ) // EVMQueryClient is an autogenerated mock type for the EVMQueryClient type diff --git a/rpc/backend/mocks/feemarket_query_client.go b/rpc/backend/mocks/feemarket_query_client.go index 2553d5cc62..d6f9517cf4 100644 --- a/rpc/backend/mocks/feemarket_query_client.go +++ b/rpc/backend/mocks/feemarket_query_client.go @@ -9,7 +9,7 @@ import ( mock "github.com/stretchr/testify/mock" - types "github.com/evmos/evmos/v17/x/feemarket/types" + types "github.com/evmos/evmos/v18/x/feemarket/types" ) // FeeMarketQueryClient is an autogenerated mock type for the QueryClient type diff --git a/rpc/backend/node_info.go b/rpc/backend/node_info.go index 81c61233f4..cb2fcc0220 100644 --- a/rpc/backend/node_info.go +++ b/rpc/backend/node_info.go @@ -21,11 +21,11 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" - rpctypes "github.com/evmos/evmos/v17/rpc/types" - "github.com/evmos/evmos/v17/server/config" - "github.com/evmos/evmos/v17/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + rpctypes "github.com/evmos/evmos/v18/rpc/types" + "github.com/evmos/evmos/v18/server/config" + "github.com/evmos/evmos/v18/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) // Accounts returns the list of accounts available to this node. diff --git a/rpc/backend/node_info_test.go b/rpc/backend/node_info_test.go index aabc40441f..85fb583c9e 100644 --- a/rpc/backend/node_info_test.go +++ b/rpc/backend/node_info_test.go @@ -10,9 +10,9 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" - "github.com/evmos/evmos/v17/rpc/backend/mocks" - "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + "github.com/evmos/evmos/v18/rpc/backend/mocks" + "github.com/evmos/evmos/v18/types" "github.com/spf13/viper" "google.golang.org/grpc/metadata" ) diff --git a/rpc/backend/sign_tx.go b/rpc/backend/sign_tx.go index d974c76c87..0ab4e92e4d 100644 --- a/rpc/backend/sign_tx.go +++ b/rpc/backend/sign_tx.go @@ -17,7 +17,7 @@ import ( "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/signer/core/apitypes" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) // SendTransaction sends transaction based on received args using Node's key to sign it diff --git a/rpc/backend/sign_tx_test.go b/rpc/backend/sign_tx_test.go index 6cd7e3a15a..95cfa807f2 100644 --- a/rpc/backend/sign_tx_test.go +++ b/rpc/backend/sign_tx_test.go @@ -14,10 +14,10 @@ import ( "github.com/ethereum/go-ethereum/signer/core/apitypes" "google.golang.org/grpc/metadata" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" - "github.com/evmos/evmos/v17/rpc/backend/mocks" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + "github.com/evmos/evmos/v18/rpc/backend/mocks" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) func (suite *BackendTestSuite) TestSendTransaction() { diff --git a/rpc/backend/tracing.go b/rpc/backend/tracing.go index 9764d1dd38..89f817d0b2 100644 --- a/rpc/backend/tracing.go +++ b/rpc/backend/tracing.go @@ -11,8 +11,8 @@ import ( tmrpctypes "github.com/cometbft/cometbft/rpc/core/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - rpctypes "github.com/evmos/evmos/v17/rpc/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + rpctypes "github.com/evmos/evmos/v18/rpc/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" "github.com/pkg/errors" ) diff --git a/rpc/backend/tracing_test.go b/rpc/backend/tracing_test.go index 31d49333b1..e04e2baf45 100644 --- a/rpc/backend/tracing_test.go +++ b/rpc/backend/tracing_test.go @@ -11,10 +11,10 @@ import ( "github.com/cosmos/cosmos-sdk/crypto" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" - "github.com/evmos/evmos/v17/indexer" - "github.com/evmos/evmos/v17/rpc/backend/mocks" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + "github.com/evmos/evmos/v18/indexer" + "github.com/evmos/evmos/v18/rpc/backend/mocks" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) func (suite *BackendTestSuite) TestTraceTransaction() { diff --git a/rpc/backend/tx_info.go b/rpc/backend/tx_info.go index fd4df1a918..64ececed20 100644 --- a/rpc/backend/tx_info.go +++ b/rpc/backend/tx_info.go @@ -16,9 +16,9 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - rpctypes "github.com/evmos/evmos/v17/rpc/types" - "github.com/evmos/evmos/v17/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + rpctypes "github.com/evmos/evmos/v18/rpc/types" + "github.com/evmos/evmos/v18/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" "github.com/pkg/errors" ) diff --git a/rpc/backend/tx_info_test.go b/rpc/backend/tx_info_test.go index 8a8af4f401..bc5cda271b 100644 --- a/rpc/backend/tx_info_test.go +++ b/rpc/backend/tx_info_test.go @@ -12,11 +12,11 @@ import ( "github.com/cometbft/cometbft/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/evmos/evmos/v17/indexer" - "github.com/evmos/evmos/v17/rpc/backend/mocks" - rpctypes "github.com/evmos/evmos/v17/rpc/types" - evmostypes "github.com/evmos/evmos/v17/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/indexer" + "github.com/evmos/evmos/v18/rpc/backend/mocks" + rpctypes "github.com/evmos/evmos/v18/rpc/types" + evmostypes "github.com/evmos/evmos/v18/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" "google.golang.org/grpc/metadata" ) diff --git a/rpc/backend/utils.go b/rpc/backend/utils.go index 088e96e0d5..57ff78d60d 100644 --- a/rpc/backend/utils.go +++ b/rpc/backend/utils.go @@ -24,8 +24,8 @@ import ( tmrpctypes "github.com/cometbft/cometbft/rpc/core/types" "github.com/cometbft/cometbft/proto/tendermint/crypto" - "github.com/evmos/evmos/v17/rpc/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/rpc/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) type txGasAndReward struct { diff --git a/rpc/namespaces/ethereum/debug/api.go b/rpc/namespaces/ethereum/debug/api.go index 5c9143ba01..c818716f9f 100644 --- a/rpc/namespaces/ethereum/debug/api.go +++ b/rpc/namespaces/ethereum/debug/api.go @@ -16,7 +16,7 @@ import ( "github.com/davecgh/go-spew/spew" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" stderrors "github.com/pkg/errors" @@ -28,8 +28,8 @@ import ( "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/rlp" - "github.com/evmos/evmos/v17/rpc/backend" - rpctypes "github.com/evmos/evmos/v17/rpc/types" + "github.com/evmos/evmos/v18/rpc/backend" + rpctypes "github.com/evmos/evmos/v18/rpc/types" ) // HandlerT keeps track of the cpu profiler and trace execution diff --git a/rpc/namespaces/ethereum/eth/api.go b/rpc/namespaces/ethereum/eth/api.go index dd281d50a6..dc8fdd7a85 100644 --- a/rpc/namespaces/ethereum/eth/api.go +++ b/rpc/namespaces/ethereum/eth/api.go @@ -15,11 +15,11 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v17/rpc/backend" + "github.com/evmos/evmos/v18/rpc/backend" - rpctypes "github.com/evmos/evmos/v17/rpc/types" - "github.com/evmos/evmos/v17/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + rpctypes "github.com/evmos/evmos/v18/rpc/types" + "github.com/evmos/evmos/v18/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) // The Ethereum API allows applications to connect to an Evmos node that is diff --git a/rpc/namespaces/ethereum/eth/filters/api.go b/rpc/namespaces/ethereum/eth/filters/api.go index eaa9b9347f..95e136b420 100644 --- a/rpc/namespaces/ethereum/eth/filters/api.go +++ b/rpc/namespaces/ethereum/eth/filters/api.go @@ -9,7 +9,7 @@ import ( "time" "github.com/cosmos/cosmos-sdk/client" - "github.com/evmos/evmos/v17/rpc/types" + "github.com/evmos/evmos/v18/rpc/types" "github.com/cometbft/cometbft/libs/log" @@ -22,7 +22,7 @@ import ( "github.com/ethereum/go-ethereum/eth/filters" "github.com/ethereum/go-ethereum/rpc" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) // FilterAPI gathers diff --git a/rpc/namespaces/ethereum/eth/filters/filter_system.go b/rpc/namespaces/ethereum/eth/filters/filter_system.go index 4b87e0c7b8..12917c9b01 100644 --- a/rpc/namespaces/ethereum/eth/filters/filter_system.go +++ b/rpc/namespaces/ethereum/eth/filters/filter_system.go @@ -24,8 +24,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/rpc/ethereum/pubsub" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/rpc/ethereum/pubsub" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) var ( diff --git a/rpc/namespaces/ethereum/eth/filters/filter_system_test.go b/rpc/namespaces/ethereum/eth/filters/filter_system_test.go index 583edf5050..28fe8c454f 100644 --- a/rpc/namespaces/ethereum/eth/filters/filter_system_test.go +++ b/rpc/namespaces/ethereum/eth/filters/filter_system_test.go @@ -13,7 +13,7 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth/filters" "github.com/ethereum/go-ethereum/rpc" - "github.com/evmos/evmos/v17/rpc/ethereum/pubsub" + "github.com/evmos/evmos/v18/rpc/ethereum/pubsub" ) func makeSubscription(id, event string) *Subscription { diff --git a/rpc/namespaces/ethereum/eth/filters/filters.go b/rpc/namespaces/ethereum/eth/filters/filters.go index 57ceea34a7..27894e4a5b 100644 --- a/rpc/namespaces/ethereum/eth/filters/filters.go +++ b/rpc/namespaces/ethereum/eth/filters/filters.go @@ -8,8 +8,8 @@ import ( "fmt" "math/big" - "github.com/evmos/evmos/v17/rpc/backend" - "github.com/evmos/evmos/v17/rpc/types" + "github.com/evmos/evmos/v18/rpc/backend" + "github.com/evmos/evmos/v18/rpc/types" "github.com/cometbft/cometbft/libs/log" tmrpctypes "github.com/cometbft/cometbft/rpc/core/types" diff --git a/rpc/namespaces/ethereum/miner/api.go b/rpc/namespaces/ethereum/miner/api.go index fd3de11ae2..066f322e8f 100644 --- a/rpc/namespaces/ethereum/miner/api.go +++ b/rpc/namespaces/ethereum/miner/api.go @@ -4,7 +4,7 @@ package miner import ( "github.com/cosmos/cosmos-sdk/server" - "github.com/evmos/evmos/v17/rpc/backend" + "github.com/evmos/evmos/v18/rpc/backend" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" diff --git a/rpc/namespaces/ethereum/net/api.go b/rpc/namespaces/ethereum/net/api.go index e8b16224ed..a0b66e9766 100644 --- a/rpc/namespaces/ethereum/net/api.go +++ b/rpc/namespaces/ethereum/net/api.go @@ -8,7 +8,7 @@ import ( rpcclient "github.com/cometbft/cometbft/rpc/client" "github.com/cosmos/cosmos-sdk/client" - "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v18/types" ) // PublicAPI is the eth_ prefixed set of APIs in the Web3 JSON-RPC spec. diff --git a/rpc/namespaces/ethereum/personal/api.go b/rpc/namespaces/ethereum/personal/api.go index 2eea941b7c..6bfdcff763 100644 --- a/rpc/namespaces/ethereum/personal/api.go +++ b/rpc/namespaces/ethereum/personal/api.go @@ -8,10 +8,10 @@ import ( "os" "time" - "github.com/evmos/evmos/v17/rpc/backend" + "github.com/evmos/evmos/v18/rpc/backend" - "github.com/evmos/evmos/v17/crypto/hd" - "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v18/crypto/hd" + "github.com/evmos/evmos/v18/types" "github.com/cometbft/cometbft/libs/log" @@ -23,7 +23,7 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/crypto" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) // PrivateAccountAPI is the personal_ prefixed set of APIs in the Web3 JSON-RPC spec. diff --git a/rpc/namespaces/ethereum/txpool/api.go b/rpc/namespaces/ethereum/txpool/api.go index c5656406c8..b6c19120db 100644 --- a/rpc/namespaces/ethereum/txpool/api.go +++ b/rpc/namespaces/ethereum/txpool/api.go @@ -7,7 +7,7 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/evmos/evmos/v17/rpc/types" + "github.com/evmos/evmos/v18/rpc/types" ) // PublicAPI offers and API for the transaction pool. It only operates on data that is non-confidential. diff --git a/rpc/namespaces/ethereum/web3/api.go b/rpc/namespaces/ethereum/web3/api.go index 2ab8a0901c..c7775992b1 100644 --- a/rpc/namespaces/ethereum/web3/api.go +++ b/rpc/namespaces/ethereum/web3/api.go @@ -3,7 +3,7 @@ package web3 import ( - "github.com/evmos/evmos/v17/version" + "github.com/evmos/evmos/v18/version" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/crypto" diff --git a/rpc/types/block.go b/rpc/types/block.go index c14185cedc..3ec852be97 100644 --- a/rpc/types/block.go +++ b/rpc/types/block.go @@ -19,7 +19,7 @@ import ( grpctypes "github.com/cosmos/cosmos-sdk/types/grpc" - "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v18/types" ) // BlockNumber represents decoding hex string to block values diff --git a/rpc/types/events.go b/rpc/types/events.go index 6381704eea..8096159a53 100644 --- a/rpc/types/events.go +++ b/rpc/types/events.go @@ -10,8 +10,8 @@ import ( tmrpctypes "github.com/cometbft/cometbft/rpc/core/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v17/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) // EventFormat is the format version of the events. diff --git a/rpc/types/events_test.go b/rpc/types/events_test.go index ac512761e5..c410babb22 100644 --- a/rpc/types/events_test.go +++ b/rpc/types/events_test.go @@ -6,7 +6,7 @@ import ( abci "github.com/cometbft/cometbft/abci/types" "github.com/ethereum/go-ethereum/common" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" "github.com/stretchr/testify/require" ) diff --git a/rpc/types/query_client.go b/rpc/types/query_client.go index a505756f9f..02d883ce26 100644 --- a/rpc/types/query_client.go +++ b/rpc/types/query_client.go @@ -12,8 +12,8 @@ import ( "github.com/cosmos/cosmos-sdk/client" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" ) // QueryClient defines a gRPC Client used for: diff --git a/rpc/types/utils.go b/rpc/types/utils.go index 415f8c1dd6..4fff4da2bd 100644 --- a/rpc/types/utils.go +++ b/rpc/types/utils.go @@ -16,8 +16,8 @@ import ( "github.com/cosmos/cosmos-sdk/client" errortypes "github.com/cosmos/cosmos-sdk/types/errors" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" diff --git a/rpc/websockets.go b/rpc/websockets.go index d60a345a67..3859f14920 100644 --- a/rpc/websockets.go +++ b/rpc/websockets.go @@ -29,11 +29,11 @@ import ( rpcclient "github.com/cometbft/cometbft/rpc/jsonrpc/client" tmtypes "github.com/cometbft/cometbft/types" - "github.com/evmos/evmos/v17/rpc/ethereum/pubsub" - rpcfilters "github.com/evmos/evmos/v17/rpc/namespaces/ethereum/eth/filters" - "github.com/evmos/evmos/v17/rpc/types" - "github.com/evmos/evmos/v17/server/config" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/rpc/ethereum/pubsub" + rpcfilters "github.com/evmos/evmos/v18/rpc/namespaces/ethereum/eth/filters" + "github.com/evmos/evmos/v18/rpc/types" + "github.com/evmos/evmos/v18/server/config" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) type WebsocketsServer interface { diff --git a/server/config/config_test.go b/server/config/config_test.go index d3c79f0530..58432d0642 100644 --- a/server/config/config_test.go +++ b/server/config/config_test.go @@ -8,7 +8,7 @@ import ( "github.com/spf13/viper" "github.com/stretchr/testify/require" - evmostypes "github.com/evmos/evmos/v17/types" + evmostypes "github.com/evmos/evmos/v18/types" ) func TestDefaultConfig(t *testing.T) { diff --git a/server/indexer_cmd.go b/server/indexer_cmd.go index b481750301..867f359ee4 100644 --- a/server/indexer_cmd.go +++ b/server/indexer_cmd.go @@ -12,7 +12,7 @@ import ( tmstore "github.com/cometbft/cometbft/store" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/server" - "github.com/evmos/evmos/v17/indexer" + "github.com/evmos/evmos/v18/indexer" ) func NewIndexTxCmd() *cobra.Command { diff --git a/server/indexer_service.go b/server/indexer_service.go index 277e9b5617..dd2806e20d 100644 --- a/server/indexer_service.go +++ b/server/indexer_service.go @@ -10,7 +10,7 @@ import ( rpcclient "github.com/cometbft/cometbft/rpc/client" "github.com/cometbft/cometbft/types" - evmostypes "github.com/evmos/evmos/v17/types" + evmostypes "github.com/evmos/evmos/v18/types" ) const ( diff --git a/server/json_rpc.go b/server/json_rpc.go index 2c5a9a9587..19e443b3fd 100644 --- a/server/json_rpc.go +++ b/server/json_rpc.go @@ -14,10 +14,10 @@ import ( "github.com/cosmos/cosmos-sdk/server/types" ethlog "github.com/ethereum/go-ethereum/log" ethrpc "github.com/ethereum/go-ethereum/rpc" - "github.com/evmos/evmos/v17/rpc" + "github.com/evmos/evmos/v18/rpc" - "github.com/evmos/evmos/v17/server/config" - evmostypes "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v18/server/config" + evmostypes "github.com/evmos/evmos/v18/types" ) // StartJSONRPC starts the JSON-RPC server diff --git a/server/start.go b/server/start.go index c0b9b0741f..3a427b6f15 100644 --- a/server/start.go +++ b/server/start.go @@ -49,12 +49,12 @@ import ( pruningtypes "github.com/cosmos/cosmos-sdk/store/pruning/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/cmd/evmosd/opendb" - "github.com/evmos/evmos/v17/indexer" - ethdebug "github.com/evmos/evmos/v17/rpc/namespaces/ethereum/debug" - "github.com/evmos/evmos/v17/server/config" - srvflags "github.com/evmos/evmos/v17/server/flags" - evmostypes "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v18/cmd/evmosd/opendb" + "github.com/evmos/evmos/v18/indexer" + ethdebug "github.com/evmos/evmos/v18/rpc/namespaces/ethereum/debug" + "github.com/evmos/evmos/v18/server/config" + srvflags "github.com/evmos/evmos/v18/server/flags" + evmostypes "github.com/evmos/evmos/v18/types" ) // DBOpener is a function to open `application.db`, potentially with customized options. diff --git a/server/util.go b/server/util.go index 4ab24138c8..818beeffd3 100644 --- a/server/util.go +++ b/server/util.go @@ -8,7 +8,7 @@ import ( "time" // TODO update import to local pkg when rpc pkg is migrated - "github.com/evmos/evmos/v17/server/config" + "github.com/evmos/evmos/v18/server/config" "github.com/gorilla/mux" "github.com/improbable-eng/grpc-web/go/grpcweb" "github.com/spf13/cobra" diff --git a/tests/e2e/e2e_suite_test.go b/tests/e2e/e2e_suite_test.go index c12a1ec31e..19a2bc2424 100644 --- a/tests/e2e/e2e_suite_test.go +++ b/tests/e2e/e2e_suite_test.go @@ -10,10 +10,10 @@ import ( "github.com/cosmos/cosmos-sdk/codec" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/encoding" - "github.com/evmos/evmos/v17/tests/e2e/upgrade" - "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/encoding" + "github.com/evmos/evmos/v18/tests/e2e/upgrade" + "github.com/evmos/evmos/v18/utils" "github.com/stretchr/testify/suite" ) diff --git a/tests/e2e/tx_test.go b/tests/e2e/tx_test.go index 759be71644..614144e99a 100644 --- a/tests/e2e/tx_test.go +++ b/tests/e2e/tx_test.go @@ -8,8 +8,8 @@ import ( "regexp" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/tests/e2e/upgrade" - "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v18/tests/e2e/upgrade" + "github.com/evmos/evmos/v18/utils" ) // executeTransactions executes some sample transactions to check they are still working after the upgrade. diff --git a/tests/e2e/upgrade/balances_test.go b/tests/e2e/upgrade/balances_test.go index 577cb3b117..a5aa4dbcf7 100644 --- a/tests/e2e/upgrade/balances_test.go +++ b/tests/e2e/upgrade/balances_test.go @@ -6,9 +6,9 @@ import ( "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/encoding" - "github.com/evmos/evmos/v17/tests/e2e/upgrade" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/encoding" + "github.com/evmos/evmos/v18/tests/e2e/upgrade" "github.com/stretchr/testify/require" ) diff --git a/tests/e2e/upgrade/manager.go b/tests/e2e/upgrade/manager.go index 1eac44f0f5..e010d4cb08 100644 --- a/tests/e2e/upgrade/manager.go +++ b/tests/e2e/upgrade/manager.go @@ -19,8 +19,8 @@ import ( errorsmod "cosmossdk.io/errors" "github.com/cosmos/cosmos-sdk/codec" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/encoding" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/encoding" "github.com/ory/dockertest/v3" "github.com/ory/dockertest/v3/docker" ) diff --git a/tests/integration/ledger/evmosd_suite_test.go b/tests/integration/ledger/evmosd_suite_test.go index ca3379cc09..628f3cdecc 100644 --- a/tests/integration/ledger/evmosd_suite_test.go +++ b/tests/integration/ledger/evmosd_suite_test.go @@ -20,11 +20,11 @@ import ( "github.com/cometbft/cometbft/crypto/tmhash" "github.com/cometbft/cometbft/version" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/crypto/hd" - "github.com/evmos/evmos/v17/tests/integration/ledger/mocks" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/crypto/hd" + "github.com/evmos/evmos/v18/tests/integration/ledger/mocks" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/utils" "github.com/stretchr/testify/suite" tmproto "github.com/cometbft/cometbft/proto/tendermint/types" @@ -32,9 +32,9 @@ import ( rpcclientmock "github.com/cometbft/cometbft/rpc/client/mock" cosmosledger "github.com/cosmos/cosmos-sdk/crypto/ledger" sdk "github.com/cosmos/cosmos-sdk/types" - clientkeys "github.com/evmos/evmos/v17/client/keys" - evmoskeyring "github.com/evmos/evmos/v17/crypto/keyring" - feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" + clientkeys "github.com/evmos/evmos/v18/client/keys" + evmoskeyring "github.com/evmos/evmos/v18/crypto/keyring" + feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" diff --git a/tests/integration/ledger/ledger_test.go b/tests/integration/ledger/ledger_test.go index 9797747f8d..56e9fe1048 100644 --- a/tests/integration/ledger/ledger_test.go +++ b/tests/integration/ledger/ledger_test.go @@ -10,12 +10,12 @@ import ( "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/crypto/keyring" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/crypto/hd" - "github.com/evmos/evmos/v17/encoding" - "github.com/evmos/evmos/v17/tests/integration/ledger/mocks" - "github.com/evmos/evmos/v17/testutil" - utiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/crypto/hd" + "github.com/evmos/evmos/v18/encoding" + "github.com/evmos/evmos/v18/tests/integration/ledger/mocks" + "github.com/evmos/evmos/v18/testutil" + utiltx "github.com/evmos/evmos/v18/testutil/tx" "github.com/spf13/cobra" diff --git a/tests/nix_tests/test_patches.py b/tests/nix_tests/test_patches.py index 7d96836794..475fa03e5e 100644 --- a/tests/nix_tests/test_patches.py +++ b/tests/nix_tests/test_patches.py @@ -12,6 +12,7 @@ deploy_contract, eth_to_bech32, get_fees_from_tx_result, + wait_for_cosmos_tx_receipt, wait_for_new_blocks, ) @@ -371,7 +372,8 @@ def test_unvested_token_delegation(evmos_cluster): ) tx = cli.sign_tx_json(tx, address, max_priority_price=0) rsp = cli.broadcast_tx_json(tx, broadcast_mode="sync") - + # get tx receipt to check if tx failed as expected + receipt = wait_for_cosmos_tx_receipt(cli, rsp["txhash"]) # assert tx fails with corresponding error message - assert rsp["code"] == 2 - assert "insufficient vested coins" in rsp["raw_log"] + assert receipt["tx_result"]["code"] == 2 + assert "insufficient vested coins" in receipt["tx_result"]["log"] diff --git a/testutil/abci.go b/testutil/abci.go index bc38e2a614..8e00fbb60f 100644 --- a/testutil/abci.go +++ b/testutil/abci.go @@ -14,9 +14,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/encoding" - "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/encoding" + "github.com/evmos/evmos/v18/testutil/tx" ) // Commit commits a block at a given time. Reminder: At the end of each diff --git a/testutil/ante.go b/testutil/ante.go index c69e19fc7b..38e37b6c83 100644 --- a/testutil/ante.go +++ b/testutil/ante.go @@ -4,8 +4,8 @@ package testutil import ( sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/encoding" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/encoding" ) // NextFn is a no-op function that returns the context and no error in order to mock diff --git a/testutil/contract.go b/testutil/contract.go index 703aba0c46..a031a30b89 100644 --- a/testutil/contract.go +++ b/testutil/contract.go @@ -18,9 +18,9 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/testutil/tx" - evm "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/testutil/tx" + evm "github.com/evmos/evmos/v18/x/evm/types" ) // ContractArgs are the params used for calling a smart contract. diff --git a/testutil/fund.go b/testutil/fund.go index d25cc9f3f0..fcad22386a 100644 --- a/testutil/fund.go +++ b/testutil/fund.go @@ -7,8 +7,8 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - "github.com/evmos/evmos/v17/utils" - inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" + "github.com/evmos/evmos/v18/utils" + inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" ) // FundAccount is a utility function that funds an account by minting and diff --git a/testutil/integration.go b/testutil/integration.go index 3724844805..aa2106c843 100644 --- a/testutil/integration.go +++ b/testutil/integration.go @@ -13,8 +13,8 @@ import ( govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" ) // SubmitProposal delivers a submit proposal tx for a given gov content. diff --git a/testutil/integration/common/factory/factory.go b/testutil/integration/common/factory/factory.go index 13501fce36..5efce1f7ff 100644 --- a/testutil/integration/common/factory/factory.go +++ b/testutil/integration/common/factory/factory.go @@ -8,8 +8,8 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" testutiltypes "github.com/cosmos/cosmos-sdk/types/module/testutil" "github.com/cosmos/cosmos-sdk/x/auth/signing" - "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" - "github.com/evmos/evmos/v17/testutil/integration/evmos/network" + "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" + "github.com/evmos/evmos/v18/testutil/integration/evmos/network" errorsmod "cosmossdk.io/errors" ) diff --git a/testutil/integration/common/grpc/account.go b/testutil/integration/common/grpc/account.go index e47e455f45..f5a04c3f9b 100644 --- a/testutil/integration/common/grpc/account.go +++ b/testutil/integration/common/grpc/account.go @@ -6,8 +6,8 @@ import ( "context" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/encoding" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/encoding" ) // GetAccount returns the account for the given address. diff --git a/testutil/integration/common/grpc/authz.go b/testutil/integration/common/grpc/authz.go index 69942a0635..70313d0589 100644 --- a/testutil/integration/common/grpc/authz.go +++ b/testutil/integration/common/grpc/authz.go @@ -7,8 +7,8 @@ import ( "context" "github.com/cosmos/cosmos-sdk/x/authz" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/encoding" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/encoding" ) // GetGrants returns the grants for the given grantee and granter combination. diff --git a/testutil/integration/common/grpc/grpc.go b/testutil/integration/common/grpc/grpc.go index d3266d74a6..ec050e8bcf 100644 --- a/testutil/integration/common/grpc/grpc.go +++ b/testutil/integration/common/grpc/grpc.go @@ -9,7 +9,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/authz" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v17/testutil/integration/common/network" + "github.com/evmos/evmos/v18/testutil/integration/common/network" ) // Handler is an interface that defines the common methods that are used to query diff --git a/testutil/integration/evmos/factory/broadcast.go b/testutil/integration/evmos/factory/broadcast.go index 4d98a3e540..55c090a7d1 100644 --- a/testutil/integration/evmos/factory/broadcast.go +++ b/testutil/integration/evmos/factory/broadcast.go @@ -8,8 +8,8 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v17/precompiles/testutil" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/precompiles/testutil" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) // ExecuteEthTx executes an Ethereum transaction - contract call with the provided private key and txArgs diff --git a/testutil/integration/evmos/factory/build.go b/testutil/integration/evmos/factory/build.go index b04192954f..c040f3837d 100644 --- a/testutil/integration/evmos/factory/build.go +++ b/testutil/integration/evmos/factory/build.go @@ -14,8 +14,8 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core" gethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v17/server/config" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/server/config" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) func (tf *IntegrationTxFactory) GenerateDefaultTxTypeArgs(sender common.Address, txType int) (evmtypes.EvmTxArgs, error) { diff --git a/testutil/integration/evmos/factory/factory.go b/testutil/integration/evmos/factory/factory.go index 31bf971fc6..7fe6c67ea2 100644 --- a/testutil/integration/evmos/factory/factory.go +++ b/testutil/integration/evmos/factory/factory.go @@ -16,13 +16,13 @@ import ( "github.com/cosmos/gogoproto/proto" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/precompiles/testutil" - commonfactory "github.com/evmos/evmos/v17/testutil/integration/common/factory" - "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" - "github.com/evmos/evmos/v17/testutil/integration/evmos/network" - "github.com/evmos/evmos/v17/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/precompiles/testutil" + commonfactory "github.com/evmos/evmos/v18/testutil/integration/common/factory" + "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" + "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + "github.com/evmos/evmos/v18/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) // TxFactory defines a struct that can build and broadcast transactions for the Evmos diff --git a/testutil/integration/evmos/factory/helpers.go b/testutil/integration/evmos/factory/helpers.go index f2c4a3a0bb..4e377bed5e 100644 --- a/testutil/integration/evmos/factory/helpers.go +++ b/testutil/integration/evmos/factory/helpers.go @@ -6,7 +6,7 @@ import ( "strings" "github.com/ethereum/go-ethereum/common" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" errorsmod "cosmossdk.io/errors" amino "github.com/cosmos/cosmos-sdk/codec" @@ -14,8 +14,8 @@ import ( "github.com/cosmos/cosmos-sdk/types/module" testutiltypes "github.com/cosmos/cosmos-sdk/types/module/testutil" authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" - enccodec "github.com/evmos/evmos/v17/encoding/codec" - "github.com/evmos/evmos/v17/precompiles/testutil" + enccodec "github.com/evmos/evmos/v18/encoding/codec" + "github.com/evmos/evmos/v18/precompiles/testutil" ) // buildMsgEthereumTx builds an Ethereum transaction from the given arguments and populates the From field. diff --git a/testutil/integration/evmos/factory/sign.go b/testutil/integration/evmos/factory/sign.go index 1997bbe8aa..12a136e76f 100644 --- a/testutil/integration/evmos/factory/sign.go +++ b/testutil/integration/evmos/factory/sign.go @@ -6,8 +6,8 @@ import ( errorsmod "cosmossdk.io/errors" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" gethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v17/testutil/tx" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/testutil/tx" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) // SignMsgEthereumTx signs a MsgEthereumTx with the provided private key and chainID. diff --git a/testutil/integration/evmos/factory/types.go b/testutil/integration/evmos/factory/types.go index baa64324ed..16ec5a3abf 100644 --- a/testutil/integration/evmos/factory/types.go +++ b/testutil/integration/evmos/factory/types.go @@ -6,7 +6,7 @@ import ( sdkmath "cosmossdk.io/math" sdktypes "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/accounts/abi" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) // CosmosTxArgs contains the params to create a cosmos tx diff --git a/testutil/integration/evmos/grpc/evm.go b/testutil/integration/evmos/grpc/evm.go index 9b071658c0..a3ad332856 100644 --- a/testutil/integration/evmos/grpc/evm.go +++ b/testutil/integration/evmos/grpc/evm.go @@ -6,7 +6,7 @@ import ( "context" "github.com/ethereum/go-ethereum/common" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) // GetEvmAccount returns the EVM account for the given address. diff --git a/testutil/integration/evmos/grpc/feemarket.go b/testutil/integration/evmos/grpc/feemarket.go index 6b96b77964..869ffc3fc3 100644 --- a/testutil/integration/evmos/grpc/feemarket.go +++ b/testutil/integration/evmos/grpc/feemarket.go @@ -5,7 +5,7 @@ package grpc import ( "context" - feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" + feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" ) // GetBaseFee returns the base fee from the feemarket module. diff --git a/testutil/integration/evmos/grpc/grpc.go b/testutil/integration/evmos/grpc/grpc.go index df9b1bfbd0..3d1bc58505 100644 --- a/testutil/integration/evmos/grpc/grpc.go +++ b/testutil/integration/evmos/grpc/grpc.go @@ -6,10 +6,10 @@ package grpc import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1" "github.com/ethereum/go-ethereum/common" - commongrpc "github.com/evmos/evmos/v17/testutil/integration/common/grpc" - "github.com/evmos/evmos/v17/testutil/integration/evmos/network" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" + commongrpc "github.com/evmos/evmos/v18/testutil/integration/common/grpc" + "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" ) // Handler is an interface that defines the methods that are used to query diff --git a/testutil/integration/evmos/keyring/keyring.go b/testutil/integration/evmos/keyring/keyring.go index 5a1a40ac94..be8c1fa69d 100644 --- a/testutil/integration/evmos/keyring/keyring.go +++ b/testutil/integration/evmos/keyring/keyring.go @@ -9,7 +9,7 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdktypes "github.com/cosmos/cosmos-sdk/types" - utiltx "github.com/evmos/evmos/v17/testutil/tx" + utiltx "github.com/evmos/evmos/v18/testutil/tx" ) type Key struct { diff --git a/testutil/integration/evmos/network/clients.go b/testutil/integration/evmos/network/clients.go index 47ec2dc637..655529d33b 100644 --- a/testutil/integration/evmos/network/clients.go +++ b/testutil/integration/evmos/network/clients.go @@ -11,12 +11,12 @@ import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/encoding" - erc20types "github.com/evmos/evmos/v17/x/erc20/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" - infltypes "github.com/evmos/evmos/v17/x/inflation/v1/types" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/encoding" + erc20types "github.com/evmos/evmos/v18/x/erc20/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" + infltypes "github.com/evmos/evmos/v18/x/inflation/v1/types" ) func getQueryHelper(ctx sdktypes.Context) *baseapp.QueryServiceTestHelper { @@ -78,6 +78,6 @@ func (n *IntegrationNetwork) GetAuthzClient() authz.QueryClient { func (n *IntegrationNetwork) GetStakingClient() stakingtypes.QueryClient { queryHelper := getQueryHelper(n.GetContext()) - stakingtypes.RegisterQueryServer(queryHelper, stakingkeeper.Querier{Keeper: &n.app.StakingKeeper}) + stakingtypes.RegisterQueryServer(queryHelper, stakingkeeper.Querier{Keeper: n.app.StakingKeeper.Keeper}) return stakingtypes.NewQueryClient(queryHelper) } diff --git a/testutil/integration/evmos/network/config.go b/testutil/integration/evmos/network/config.go index 65bda3cc02..e197fbea45 100644 --- a/testutil/integration/evmos/network/config.go +++ b/testutil/integration/evmos/network/config.go @@ -9,9 +9,9 @@ import ( sdktypes "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - testtx "github.com/evmos/evmos/v17/testutil/tx" - evmostypes "github.com/evmos/evmos/v17/types" - "github.com/evmos/evmos/v17/utils" + testtx "github.com/evmos/evmos/v18/testutil/tx" + evmostypes "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v18/utils" ) // Config defines the configuration for a chain. diff --git a/testutil/integration/evmos/network/config_test.go b/testutil/integration/evmos/network/config_test.go index dc0ad27761..068e307ff1 100644 --- a/testutil/integration/evmos/network/config_test.go +++ b/testutil/integration/evmos/network/config_test.go @@ -8,10 +8,10 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - grpchandler "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v17/testutil/integration/evmos/network" - "github.com/evmos/evmos/v17/utils" + grpchandler "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + "github.com/evmos/evmos/v18/utils" "github.com/stretchr/testify/require" ) diff --git a/testutil/integration/evmos/network/network.go b/testutil/integration/evmos/network/network.go index d783be8593..fc66d56788 100644 --- a/testutil/integration/evmos/network/network.go +++ b/testutil/integration/evmos/network/network.go @@ -7,12 +7,13 @@ import ( "encoding/json" "math" "math/big" + "time" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" gethparams "github.com/ethereum/go-ethereum/params" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/types" abcitypes "github.com/cometbft/cometbft/abci/types" tmproto "github.com/cometbft/cometbft/proto/tendermint/types" @@ -21,11 +22,11 @@ import ( txtypes "github.com/cosmos/cosmos-sdk/types/tx" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - commonnetwork "github.com/evmos/evmos/v17/testutil/integration/common/network" - erc20types "github.com/evmos/evmos/v17/x/erc20/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" - infltypes "github.com/evmos/evmos/v17/x/inflation/v1/types" + commonnetwork "github.com/evmos/evmos/v18/testutil/integration/common/network" + erc20types "github.com/evmos/evmos/v18/x/erc20/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" + infltypes "github.com/evmos/evmos/v18/x/inflation/v1/types" ) // Network is the interface that wraps the methods to interact with integration test network. @@ -164,11 +165,13 @@ func (n *IntegrationNetwork) configureAndInitChain() error { } consensusParams := app.DefaultConsensusParams + now := time.Now() evmosApp.InitChain( abcitypes.RequestInitChain{ + Time: now, ChainId: n.cfg.chainID, Validators: []abcitypes.ValidatorUpdate{}, - ConsensusParams: app.DefaultConsensusParams, + ConsensusParams: consensusParams, AppStateBytes: stateBytes, }, ) @@ -178,6 +181,7 @@ func (n *IntegrationNetwork) configureAndInitChain() error { header := tmproto.Header{ ChainID: n.cfg.chainID, Height: evmosApp.LastBlockHeight() + 1, + Time: now, AppHash: evmosApp.LastCommitID().Hash, ValidatorsHash: valSet.Hash(), NextValidatorsHash: valSet.Hash(), diff --git a/testutil/integration/evmos/network/params.go b/testutil/integration/evmos/network/params.go index c18de78a52..0101864f9b 100644 --- a/testutil/integration/evmos/network/params.go +++ b/testutil/integration/evmos/network/params.go @@ -5,9 +5,9 @@ package network import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" - feemarketypes "github.com/evmos/evmos/v17/x/feemarket/types" - infltypes "github.com/evmos/evmos/v17/x/inflation/v1/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" + feemarketypes "github.com/evmos/evmos/v18/x/feemarket/types" + infltypes "github.com/evmos/evmos/v18/x/inflation/v1/types" ) func (n *IntegrationNetwork) UpdateEvmParams(params evmtypes.Params) error { diff --git a/testutil/integration/evmos/network/setup.go b/testutil/integration/evmos/network/setup.go index d9389d483f..e633bfa815 100644 --- a/testutil/integration/evmos/network/setup.go +++ b/testutil/integration/evmos/network/setup.go @@ -7,8 +7,8 @@ import ( "fmt" "time" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/encoding" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/encoding" "cosmossdk.io/simapp" "github.com/cosmos/cosmos-sdk/baseapp" @@ -28,11 +28,13 @@ import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" govtypesv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - epochstypes "github.com/evmos/evmos/v17/x/epochs/types" - infltypes "github.com/evmos/evmos/v17/x/inflation/v1/types" + "github.com/ethereum/go-ethereum/crypto" + evmostypes "github.com/evmos/evmos/v18/types" + epochstypes "github.com/evmos/evmos/v18/x/epochs/types" + infltypes "github.com/evmos/evmos/v18/x/inflation/v1/types" - evmosutil "github.com/evmos/evmos/v17/utils" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmosutil "github.com/evmos/evmos/v18/utils" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) // createValidatorSetAndSigners creates validator set with the amount of validators specified @@ -58,9 +60,14 @@ func createValidatorSetAndSigners(numberOfValidators int) (*tmtypes.ValidatorSet func createGenesisAccounts(accounts []sdktypes.AccAddress) []authtypes.GenesisAccount { numberOfAccounts := len(accounts) genAccounts := make([]authtypes.GenesisAccount, 0, numberOfAccounts) + emptyCodeHash := crypto.Keccak256Hash(nil).String() for _, acc := range accounts { baseAcc := authtypes.NewBaseAccount(acc, nil, 0, 0) - genAccounts = append(genAccounts, baseAcc) + ethAcc := &evmostypes.EthAccount{ + BaseAccount: baseAcc, + CodeHash: emptyCodeHash, + } + genAccounts = append(genAccounts, ethAcc) } return genAccounts } diff --git a/testutil/integration/evmos/network/unit_network.go b/testutil/integration/evmos/network/unit_network.go index 6394539764..3d919aaa53 100644 --- a/testutil/integration/evmos/network/unit_network.go +++ b/testutil/integration/evmos/network/unit_network.go @@ -5,9 +5,9 @@ package network import ( sdktypes "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/x/evm/statedb" - inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/x/evm/statedb" + inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" ) // UnitTestNetwork is the implementation of the Network interface for unit tests. diff --git a/testutil/integration/evmos/utils/bank.go b/testutil/integration/evmos/utils/bank.go index 217a61dcd5..42ecf95024 100644 --- a/testutil/integration/evmos/utils/bank.go +++ b/testutil/integration/evmos/utils/bank.go @@ -7,7 +7,7 @@ import ( "fmt" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/evmos/evmos/v17/testutil/integration/common/grpc" + "github.com/evmos/evmos/v18/testutil/integration/common/grpc" ) // CheckBalances checks that the given accounts have the expected balances and diff --git a/testutil/integration/evmos/utils/bank_test.go b/testutil/integration/evmos/utils/bank_test.go index 0d8c9a8cfa..169d7dea3a 100644 --- a/testutil/integration/evmos/utils/bank_test.go +++ b/testutil/integration/evmos/utils/bank_test.go @@ -6,10 +6,10 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - grpchandler "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v17/testutil/integration/evmos/network" - "github.com/evmos/evmos/v17/testutil/integration/evmos/utils" + grpchandler "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + "github.com/evmos/evmos/v18/testutil/integration/evmos/utils" "github.com/stretchr/testify/require" ) diff --git a/testutil/integration/evmos/utils/contracts.go b/testutil/integration/evmos/utils/contracts.go index c59cface0c..fff3f9f0e1 100644 --- a/testutil/integration/evmos/utils/contracts.go +++ b/testutil/integration/evmos/utils/contracts.go @@ -6,12 +6,12 @@ import ( "fmt" "slices" - "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" abcitypes "github.com/cometbft/cometbft/abci/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - evmostypes "github.com/evmos/evmos/v17/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmostypes "github.com/evmos/evmos/v18/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) // CheckTxTopics checks if all expected topics are present in the transaction response diff --git a/testutil/integration/evmos/utils/erc20.go b/testutil/integration/evmos/utils/erc20.go index 6648d57ba6..98fabddd94 100644 --- a/testutil/integration/evmos/utils/erc20.go +++ b/testutil/integration/evmos/utils/erc20.go @@ -10,9 +10,9 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v17/testutil/integration/evmos/network" - erc20types "github.com/evmos/evmos/v17/x/erc20/types" + "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + erc20types "github.com/evmos/evmos/v18/x/erc20/types" ) // ERC20RegistrationData is the necessary data to provide in order to register an ERC20 token. diff --git a/testutil/integration/evmos/utils/gov.go b/testutil/integration/evmos/utils/gov.go index 4c5cb26fd8..6abdaa6d1f 100644 --- a/testutil/integration/evmos/utils/gov.go +++ b/testutil/integration/evmos/utils/gov.go @@ -16,9 +16,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" - commonfactory "github.com/evmos/evmos/v17/testutil/integration/common/factory" - "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v17/testutil/integration/evmos/network" + commonfactory "github.com/evmos/evmos/v18/testutil/integration/common/factory" + "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v18/testutil/integration/evmos/network" ) // SubmitProposal is a helper function to submit a governance proposal and diff --git a/testutil/integration/evmos/utils/unit.go b/testutil/integration/evmos/utils/unit.go index 7a88518fd4..c76bd32c18 100644 --- a/testutil/integration/evmos/utils/unit.go +++ b/testutil/integration/evmos/utils/unit.go @@ -9,14 +9,14 @@ import ( "fmt" "cosmossdk.io/math" - "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v18/utils" sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - "github.com/evmos/evmos/v17/testutil/integration/evmos/network" - erc20types "github.com/evmos/evmos/v17/x/erc20/types" - inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" + "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + erc20types "github.com/evmos/evmos/v18/x/erc20/types" + inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" ) const ( diff --git a/testutil/integration/ibc/coordinator/coordinator.go b/testutil/integration/ibc/coordinator/coordinator.go index e3cdf5a35f..406ecfc920 100644 --- a/testutil/integration/ibc/coordinator/coordinator.go +++ b/testutil/integration/ibc/coordinator/coordinator.go @@ -9,9 +9,9 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" ibctesting "github.com/cosmos/ibc-go/v7/testing" - evmosibc "github.com/evmos/evmos/v17/ibc/testing" - "github.com/evmos/evmos/v17/testutil/integration/common/network" - ibcchain "github.com/evmos/evmos/v17/testutil/integration/ibc/chain" + evmosibc "github.com/evmos/evmos/v18/ibc/testing" + "github.com/evmos/evmos/v18/testutil/integration/common/network" + ibcchain "github.com/evmos/evmos/v18/testutil/integration/ibc/chain" ) // Coordinator is the interface that defines the methods that are used to @@ -40,11 +40,7 @@ type Coordinator interface { CommitAll() error } -// TODO: Replace for a config -var ( - AmountOfDummyChains = 2 - GlobalTime = time.Date(time.Now().Year()+1, 1, 2, 0, 0, 0, 0, time.UTC) -) +var AmountOfDummyChains = 2 var _ Coordinator = (*IntegrationCoordinator)(nil) @@ -62,7 +58,7 @@ type IntegrationCoordinator struct { func NewIntegrationCoordinator(t *testing.T, preConfiguredChains []network.Network) *IntegrationCoordinator { coord := &ibctesting.Coordinator{ T: t, - CurrentTime: GlobalTime, + CurrentTime: time.Now(), } ibcChains := getIBCChains(t, coord, preConfiguredChains) dummyChains, dummyChainsIDs := generateDummyChains(t, coord, AmountOfDummyChains) diff --git a/testutil/integration/ibc/coordinator/utils.go b/testutil/integration/ibc/coordinator/utils.go index 27d09f1b40..faf57a3f3d 100644 --- a/testutil/integration/ibc/coordinator/utils.go +++ b/testutil/integration/ibc/coordinator/utils.go @@ -7,7 +7,7 @@ import ( "testing" ibctesting "github.com/cosmos/ibc-go/v7/testing" - "github.com/evmos/evmos/v17/testutil/integration/common/network" + "github.com/evmos/evmos/v18/testutil/integration/common/network" ) // getIBCChains returns a map of TestChain's for the given network interface. diff --git a/testutil/network/network.go b/testutil/network/network.go index b06676ed55..81f6a68d55 100644 --- a/testutil/network/network.go +++ b/testutil/network/network.go @@ -52,13 +52,13 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/cosmos/cosmos-sdk/x/genutil" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/crypto/hd" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/crypto/hd" - "github.com/evmos/evmos/v17/encoding" - "github.com/evmos/evmos/v17/server/config" - evmostypes "github.com/evmos/evmos/v17/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/encoding" + "github.com/evmos/evmos/v18/server/config" + evmostypes "github.com/evmos/evmos/v18/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) // package-wide network lock to only allow one test network at a time diff --git a/testutil/network/network_test.go b/testutil/network/network_test.go index e2884c55ec..f9246a9507 100644 --- a/testutil/network/network_test.go +++ b/testutil/network/network_test.go @@ -11,10 +11,10 @@ import ( "github.com/stretchr/testify/suite" "github.com/ethereum/go-ethereum/ethclient" - "github.com/evmos/evmos/v17/server/config" - "github.com/evmos/evmos/v17/testutil/network" + "github.com/evmos/evmos/v18/server/config" + "github.com/evmos/evmos/v18/testutil/network" - evmosnetwork "github.com/evmos/evmos/v17/testutil/network" + evmosnetwork "github.com/evmos/evmos/v18/testutil/network" ) type IntegrationTestSuite struct { diff --git a/testutil/network/util.go b/testutil/network/util.go index 8cec5aa4e3..d52b92b50d 100644 --- a/testutil/network/util.go +++ b/testutil/network/util.go @@ -30,10 +30,10 @@ import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" + inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" - "github.com/evmos/evmos/v17/server" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/server" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) func startInProcess(cfg Config, val *Validator) error { diff --git a/testutil/staking-rewards.go b/testutil/staking-rewards.go index c870c14f2f..4fda9aa5a6 100644 --- a/testutil/staking-rewards.go +++ b/testutil/staking-rewards.go @@ -17,9 +17,9 @@ import ( stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" teststaking "github.com/cosmos/cosmos-sdk/x/staking/testutil" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v17/app" - testutiltx "github.com/evmos/evmos/v17/testutil/tx" - "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v18/app" + testutiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/utils" "github.com/stretchr/testify/require" ) @@ -110,7 +110,7 @@ func PrepareAccountsForDelegationRewards(t *testing.T, ctx sdk.Context, app *app err = app.StakingKeeper.SetParams(ctx, stakingParams) require.NoError(t, err) - stakingHelper := teststaking.NewHelper(t, ctx, &app.StakingKeeper) + stakingHelper := teststaking.NewHelper(t, ctx, app.StakingKeeper.Keeper) stakingHelper.Commission = stakingtypes.NewCommissionRates(zeroDec, zeroDec, zeroDec) stakingHelper.Denom = utils.BaseDenom @@ -122,7 +122,7 @@ func PrepareAccountsForDelegationRewards(t *testing.T, ctx sdk.Context, app *app // end block to bond validator and increase block height // Not using Commit() here because code panics due to invalid block height - staking.EndBlocker(ctx, &app.StakingKeeper) + staking.EndBlocker(ctx, app.StakingKeeper.Keeper) // allocate rewards to validator (of these 50% will be paid out to the delegator) validator := app.StakingKeeper.Validator(ctx, valAddr) diff --git a/testutil/statedb.go b/testutil/statedb.go index d1cfa53b23..611a499f01 100644 --- a/testutil/statedb.go +++ b/testutil/statedb.go @@ -6,8 +6,8 @@ package testutil import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v17/app/ante/evm" - "github.com/evmos/evmos/v17/x/evm/statedb" + "github.com/evmos/evmos/v18/app/ante/evm" + "github.com/evmos/evmos/v18/x/evm/statedb" ) // NewStateDB returns a new StateDB for testing purposes. diff --git a/testutil/tx/cosmos.go b/testutil/tx/cosmos.go index 616af2c9c9..61a7053fbe 100644 --- a/testutil/tx/cosmos.go +++ b/testutil/tx/cosmos.go @@ -13,8 +13,8 @@ import ( "github.com/cosmos/cosmos-sdk/types/tx/signing" authsigning "github.com/cosmos/cosmos-sdk/x/auth/signing" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/utils" ) var ( diff --git a/testutil/tx/eip712.go b/testutil/tx/eip712.go index 34f1a4248a..482264f1ab 100644 --- a/testutil/tx/eip712.go +++ b/testutil/tx/eip712.go @@ -16,10 +16,10 @@ import ( "github.com/ethereum/go-ethereum/signer/core/apitypes" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" - "github.com/evmos/evmos/v17/app" - cryptocodec "github.com/evmos/evmos/v17/crypto/codec" - "github.com/evmos/evmos/v17/ethereum/eip712" - "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v18/app" + cryptocodec "github.com/evmos/evmos/v18/crypto/codec" + "github.com/evmos/evmos/v18/ethereum/eip712" + "github.com/evmos/evmos/v18/types" ) type EIP712TxArgs struct { diff --git a/testutil/tx/eth.go b/testutil/tx/eth.go index 07037b4804..8ab57076c5 100644 --- a/testutil/tx/eth.go +++ b/testutil/tx/eth.go @@ -18,10 +18,10 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/server/config" - "github.com/evmos/evmos/v17/utils" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/server/config" + "github.com/evmos/evmos/v18/utils" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) // PrepareEthTx creates an ethereum tx and signs it with the provided messages and private key. diff --git a/testutil/tx/signer.go b/testutil/tx/signer.go index 4d9d9fa291..7b7a940033 100644 --- a/testutil/tx/signer.go +++ b/testutil/tx/signer.go @@ -12,7 +12,7 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" ) // NewAddrKey generates an Ethereum address and its corresponding private key. diff --git a/testutil/vesting.go b/testutil/vesting.go new file mode 100644 index 0000000000..8f47961411 --- /dev/null +++ b/testutil/vesting.go @@ -0,0 +1,88 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) +package testutil + +import ( + "cosmossdk.io/math" + sdk "github.com/cosmos/cosmos-sdk/types" + sdkvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" + "github.com/evmos/evmos/v18/utils" +) + +type vestingSchedule struct { + CliffMonths int64 + // CliffPeriodLength in seconds + CliffPeriodLength int64 + NumLockupPeriods int64 + LockupMonths int64 + // LockupPeriodLength in seconds + LockupPeriodLength int64 + NumVestingPeriods int64 + // VestingPeriodLength in seconds + VestingPeriodLength int64 + TotalVestingCoins sdk.Coins + VestedCoinsPerPeriod sdk.Coins + UnlockedCoinsPerLockup sdk.Coins + VestingPeriods []sdkvesting.Period + LockupPeriods []sdkvesting.Period +} + +// Vesting schedule for tests that use vesting account +var ( + TestVestingSchedule vestingSchedule + // Monthly vesting period + stakeDenom = utils.BaseDenom + amt = math.NewInt(1e17) + vestingLength = int64(60 * 60 * 24 * 30) // in seconds + vestingAmt = sdk.NewCoins(sdk.NewCoin(stakeDenom, amt)) + vestingPeriod = sdkvesting.Period{Length: vestingLength, Amount: vestingAmt} + + // 4 years vesting total + periodsTotal = int64(48) + vestingAmtTotal = sdk.NewCoins(sdk.NewCoin(stakeDenom, amt.Mul(math.NewInt(periodsTotal)))) + + // 6 month cliff + cliff = int64(6) + cliffLength = vestingLength * cliff + cliffAmt = sdk.NewCoins(sdk.NewCoin(stakeDenom, amt.Mul(math.NewInt(cliff)))) + cliffPeriod = sdkvesting.Period{Length: cliffLength, Amount: cliffAmt} + + // 12 month lockup + lockup = int64(12) // 12 months + lockupLength = vestingLength * lockup + // Unlock at 12 and 24 months + numLockupPeriods = int64(2) + // Unlock half of the total vest in each unlock event. By default, all tokens are + // unlocked after surpassing the final period. + unlockedPerLockup = vestingAmtTotal.QuoInt(math.NewInt(numLockupPeriods)) + lockupPeriod = sdkvesting.Period{Length: lockupLength, Amount: unlockedPerLockup} + lockupPeriods = make(sdkvesting.Periods, numLockupPeriods) + // add initial cliff to vesting periods + vestingPeriods = sdkvesting.Periods{cliffPeriod} +) + +func init() { + for i := range lockupPeriods { + lockupPeriods[i] = lockupPeriod + } + + // Create vesting periods with initial cliff + for p := int64(1); p <= periodsTotal-cliff; p++ { + vestingPeriods = append(vestingPeriods, vestingPeriod) + } + + TestVestingSchedule = vestingSchedule{ + CliffMonths: cliff, + CliffPeriodLength: cliffLength, + NumLockupPeriods: numLockupPeriods, + NumVestingPeriods: periodsTotal, + LockupMonths: lockup, + LockupPeriodLength: lockupLength, + VestingPeriodLength: vestingLength, + TotalVestingCoins: vestingAmtTotal, + VestedCoinsPerPeriod: vestingAmt, + UnlockedCoinsPerLockup: unlockedPerLockup, + VestingPeriods: vestingPeriods, + LockupPeriods: lockupPeriods, + } +} diff --git a/types/account.pb.go b/types/account.pb.go index 5530888358..d4106dbc62 100644 --- a/types/account.pb.go +++ b/types/account.pb.go @@ -92,8 +92,8 @@ var fileDescriptor_4edc057d42a619ef = []byte{ 0xa5, 0x74, 0x8b, 0x53, 0xb2, 0xf5, 0x2b, 0x20, 0x81, 0x03, 0x09, 0x32, 0x6c, 0xee, 0x86, 0xba, 0xc4, 0xd3, 0xc9, 0xea, 0xc4, 0x23, 0x39, 0xc6, 0x0b, 0x8f, 0xe4, 0x18, 0x1f, 0x3c, 0x92, 0x63, 0x9c, 0xf0, 0x58, 0x8e, 0xe1, 0xc2, 0x63, 0x39, 0x86, 0x1b, 0x8f, 0xe5, 0x18, 0xa2, 0x14, 0x90, - 0x6c, 0x48, 0x2d, 0x03, 0x59, 0x00, 0x21, 0xcb, 0x0c, 0xcd, 0x21, 0x06, 0x27, 0xb1, 0x81, 0x83, - 0xcf, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0xba, 0x0d, 0x32, 0xf3, 0xc7, 0x01, 0x00, 0x00, + 0x6c, 0x48, 0x2d, 0x03, 0x59, 0x00, 0x21, 0xcb, 0x0c, 0x2d, 0x20, 0x06, 0x27, 0xb1, 0x81, 0x83, + 0xcf, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0x27, 0xce, 0xba, 0xa7, 0xc7, 0x01, 0x00, 0x00, } func (m *EthAccount) Marshal() (dAtA []byte, err error) { diff --git a/types/account_test.go b/types/account_test.go index 279038bd28..f23e006025 100644 --- a/types/account_test.go +++ b/types/account_test.go @@ -12,10 +12,10 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - cryptocodec "github.com/evmos/evmos/v17/crypto/codec" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" - encodingcodec "github.com/evmos/evmos/v17/encoding/codec" - "github.com/evmos/evmos/v17/types" + cryptocodec "github.com/evmos/evmos/v18/crypto/codec" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + encodingcodec "github.com/evmos/evmos/v18/encoding/codec" + "github.com/evmos/evmos/v18/types" ) func init() { diff --git a/types/dynamic_fee.pb.go b/types/dynamic_fee.pb.go index 854386a021..6b564c73e3 100644 --- a/types/dynamic_fee.pb.go +++ b/types/dynamic_fee.pb.go @@ -86,8 +86,8 @@ var fileDescriptor_9d7cf05c9992c480 = []byte{ 0x08, 0x80, 0xea, 0x0b, 0x00, 0x69, 0x73, 0xb2, 0x3a, 0xf1, 0x48, 0x8e, 0xf1, 0xc2, 0x23, 0x39, 0xc6, 0x07, 0x8f, 0xe4, 0x18, 0x27, 0x3c, 0x96, 0x63, 0xb8, 0xf0, 0x58, 0x8e, 0xe1, 0xc6, 0x63, 0x39, 0x86, 0x28, 0x85, 0xf4, 0xcc, 0x92, 0x8c, 0xd2, 0x24, 0xbd, 0xe4, 0xfc, 0x5c, 0xfd, 0xd4, - 0xb2, 0xdc, 0xfc, 0x62, 0x28, 0x59, 0x66, 0x68, 0x0e, 0xf1, 0x66, 0x12, 0x1b, 0xd8, 0xb9, 0xc6, - 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x5e, 0x57, 0x1e, 0x91, 0x00, 0x01, 0x00, 0x00, + 0xb2, 0xdc, 0xfc, 0x62, 0x28, 0x59, 0x66, 0x68, 0x01, 0xf1, 0x66, 0x12, 0x1b, 0xd8, 0xb9, 0xc6, + 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc3, 0x94, 0x96, 0xc5, 0x00, 0x01, 0x00, 0x00, } func (m *ExtensionOptionDynamicFeeTx) Marshal() (dAtA []byte, err error) { diff --git a/types/indexer.pb.go b/types/indexer.pb.go index 1d04472694..e1d1005d82 100644 --- a/types/indexer.pb.go +++ b/types/indexer.pb.go @@ -87,23 +87,23 @@ var fileDescriptor_1197e10a8be8ed28 = []byte{ // 298 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x44, 0x90, 0x31, 0x4b, 0xc3, 0x40, 0x18, 0x86, 0x73, 0xb6, 0x4d, 0xe3, 0xa1, 0x83, 0x51, 0x4a, 0x54, 0x88, 0x87, 0x53, 0xa6, 0x84, - 0xe2, 0x20, 0x74, 0x74, 0x11, 0xd7, 0xa3, 0x2e, 0x2e, 0x21, 0x6d, 0x3e, 0xef, 0x0e, 0x7a, 0xbd, - 0xd2, 0xfb, 0x12, 0xe2, 0x3f, 0x70, 0xf4, 0x27, 0xf8, 0x73, 0x1c, 0x3b, 0x3a, 0x4a, 0x8b, 0xff, - 0x43, 0x7a, 0x09, 0x75, 0x39, 0xee, 0xe5, 0x79, 0x3e, 0x5e, 0x78, 0x29, 0x03, 0x94, 0xb0, 0xd6, - 0x6a, 0x89, 0x19, 0xbe, 0xad, 0xc0, 0x66, 0xf5, 0x38, 0x53, 0xcb, 0x12, 0x1a, 0x58, 0xa7, 0xab, - 0xb5, 0x41, 0x13, 0x86, 0x07, 0x23, 0x75, 0x46, 0x5a, 0x8f, 0xaf, 0x2e, 0x84, 0x11, 0xc6, 0xe1, - 0x6c, 0xff, 0x6b, 0xcd, 0xdb, 0x5f, 0x42, 0x83, 0x69, 0xc3, 0xc1, 0x56, 0x0b, 0x0c, 0x47, 0xd4, - 0x97, 0xa0, 0x84, 0xc4, 0x88, 0x30, 0x92, 0xf4, 0x78, 0x97, 0xc2, 0x4b, 0x1a, 0x60, 0x93, 0xbb, - 0x8a, 0xe8, 0x88, 0x91, 0xe4, 0x94, 0x0f, 0xb1, 0x79, 0xda, 0xc7, 0xf0, 0x9a, 0x1e, 0x6b, 0x2b, - 0x3a, 0xd6, 0x73, 0x2c, 0xd0, 0x56, 0xb4, 0x90, 0xd1, 0x13, 0x40, 0x99, 0x1f, 0x6e, 0xfb, 0x8c, - 0x24, 0x03, 0x4e, 0x01, 0xe5, 0xb4, 0x3b, 0x1f, 0x51, 0xff, 0xb5, 0x50, 0x0b, 0x28, 0xa3, 0x01, - 0x23, 0x49, 0xc0, 0xbb, 0xb4, 0x6f, 0x14, 0x85, 0xcd, 0x2b, 0x0b, 0x65, 0xe4, 0x33, 0x92, 0xf4, - 0xf9, 0x50, 0x14, 0xf6, 0xd9, 0x42, 0x19, 0xa6, 0xf4, 0x7c, 0x5e, 0xe9, 0x6a, 0x51, 0xa0, 0xaa, - 0x21, 0x3f, 0x58, 0x43, 0x67, 0x9d, 0xfd, 0xa3, 0xc7, 0xd6, 0x9f, 0xf4, 0xdf, 0x3f, 0x6f, 0xbc, - 0x87, 0xc9, 0xd7, 0x36, 0x26, 0x9b, 0x6d, 0x4c, 0x7e, 0xb6, 0x31, 0xf9, 0xd8, 0xc5, 0xde, 0x66, - 0x17, 0x7b, 0xdf, 0xbb, 0xd8, 0x7b, 0x61, 0x42, 0xa1, 0xac, 0x66, 0xe9, 0xdc, 0xe8, 0x0c, 0x6a, - 0x6d, 0x6c, 0xf7, 0xd6, 0xe3, 0xfb, 0x76, 0xde, 0x99, 0xef, 0xa6, 0xba, 0xfb, 0x0b, 0x00, 0x00, - 0xff, 0xff, 0x13, 0x55, 0x93, 0xdb, 0x78, 0x01, 0x00, 0x00, + 0xe2, 0x22, 0x1d, 0x5d, 0xc4, 0xf5, 0xa8, 0x8b, 0x4b, 0x48, 0x9b, 0xcf, 0xbb, 0x83, 0x5e, 0xaf, + 0xf4, 0xbe, 0x84, 0xf8, 0x0f, 0x1c, 0xfd, 0x09, 0xfe, 0x1c, 0xc7, 0x8e, 0x8e, 0xd2, 0xe2, 0xff, + 0x90, 0x5e, 0x42, 0x5d, 0x8e, 0x7b, 0x79, 0x9e, 0x8f, 0x17, 0x5e, 0xca, 0x00, 0x25, 0xac, 0xb5, + 0x5a, 0x62, 0x86, 0x6f, 0x2b, 0xb0, 0x59, 0x3d, 0xce, 0xd4, 0xb2, 0x84, 0x06, 0xd6, 0xe9, 0x6a, + 0x6d, 0xd0, 0x84, 0xe1, 0xc1, 0x48, 0x9d, 0x91, 0xd6, 0xe3, 0xab, 0x0b, 0x61, 0x84, 0x71, 0x38, + 0xdb, 0xff, 0x5a, 0xf3, 0xf6, 0x97, 0xd0, 0x60, 0xda, 0x70, 0xb0, 0xd5, 0x02, 0xc3, 0x11, 0xf5, + 0x25, 0x28, 0x21, 0x31, 0x22, 0x8c, 0x24, 0x3d, 0xde, 0xa5, 0xf0, 0x92, 0x06, 0xd8, 0xe4, 0xae, + 0x22, 0x3a, 0x62, 0x24, 0x39, 0xe5, 0x43, 0x6c, 0x9e, 0xf6, 0x31, 0xbc, 0xa6, 0xc7, 0xda, 0x8a, + 0x8e, 0xf5, 0x1c, 0x0b, 0xb4, 0x15, 0x2d, 0x64, 0xf4, 0x04, 0x50, 0xe6, 0x87, 0xdb, 0x3e, 0x23, + 0xc9, 0x80, 0x53, 0x40, 0x39, 0xed, 0xce, 0x47, 0xd4, 0x7f, 0x2d, 0xd4, 0x02, 0xca, 0x68, 0xc0, + 0x48, 0x12, 0xf0, 0x2e, 0xed, 0x1b, 0x45, 0x61, 0xf3, 0xca, 0x42, 0x19, 0xf9, 0x8c, 0x24, 0x7d, + 0x3e, 0x14, 0x85, 0x7d, 0xb6, 0x50, 0x86, 0x29, 0x3d, 0x9f, 0x57, 0xba, 0x5a, 0x14, 0xa8, 0x6a, + 0xc8, 0x0f, 0xd6, 0xd0, 0x59, 0x67, 0xff, 0xe8, 0xb1, 0xf5, 0x27, 0xfd, 0xf7, 0xcf, 0x1b, 0xef, + 0x61, 0xf2, 0xb5, 0x8d, 0xc9, 0x66, 0x1b, 0x93, 0x9f, 0x6d, 0x4c, 0x3e, 0x76, 0xb1, 0xb7, 0xd9, + 0xc5, 0xde, 0xf7, 0x2e, 0xf6, 0x5e, 0x98, 0x50, 0x28, 0xab, 0x59, 0x3a, 0x37, 0x3a, 0x83, 0x5a, + 0x1b, 0xdb, 0xbd, 0xf5, 0xf8, 0xbe, 0x9d, 0x77, 0xe6, 0xbb, 0xa9, 0xee, 0xfe, 0x02, 0x00, 0x00, + 0xff, 0xff, 0x8e, 0x96, 0x1b, 0x8f, 0x78, 0x01, 0x00, 0x00, } func (m *TxResult) Marshal() (dAtA []byte, err error) { diff --git a/types/validation_test.go b/types/validation_test.go index 43246cdb50..cf608e6eaf 100644 --- a/types/validation_test.go +++ b/types/validation_test.go @@ -4,8 +4,8 @@ import ( "testing" "github.com/ethereum/go-ethereum/common" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - "github.com/evmos/evmos/v17/types" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/types" "github.com/stretchr/testify/require" ) diff --git a/types/web3.pb.go b/types/web3.pb.go index 24469571ef..f780bfad27 100644 --- a/types/web3.pb.go +++ b/types/web3.pb.go @@ -95,8 +95,8 @@ var fileDescriptor_9eb7cd56e3c92bc3 = []byte{ 0x1b, 0x49, 0xd8, 0x8a, 0xa5, 0x63, 0x81, 0x3c, 0x83, 0x93, 0xd5, 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, 0x29, 0xa4, 0x67, 0x96, 0x64, 0x94, 0x26, 0xe9, 0x25, 0xe7, 0xe7, - 0xea, 0xa7, 0x96, 0xe5, 0xe6, 0x17, 0x43, 0xc9, 0x32, 0x43, 0x73, 0x48, 0x58, 0x27, 0xb1, 0x81, - 0x83, 0xce, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0x80, 0x78, 0x1b, 0xa3, 0x85, 0x01, 0x00, 0x00, + 0xea, 0xa7, 0x96, 0xe5, 0xe6, 0x17, 0x43, 0xc9, 0x32, 0x43, 0x0b, 0x48, 0x58, 0x27, 0xb1, 0x81, + 0x83, 0xce, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0x1d, 0xbb, 0x93, 0xf7, 0x85, 0x01, 0x00, 0x00, } func (m *ExtensionOptionsWeb3Tx) Marshal() (dAtA []byte, err error) { diff --git a/utils/utils.go b/utils/utils.go index da40d48c32..66aa67072f 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -10,7 +10,7 @@ import ( ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" errorsmod "cosmossdk.io/errors" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" diff --git a/utils/utils_test.go b/utils/utils_test.go index cc3424f60a..175280a615 100644 --- a/utils/utils_test.go +++ b/utils/utils_test.go @@ -12,7 +12,7 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" ) func init() { diff --git a/wallets/ledger/ledger.go b/wallets/ledger/ledger.go index 2e14e90b9f..b2b92bc93e 100644 --- a/wallets/ledger/ledger.go +++ b/wallets/ledger/ledger.go @@ -14,9 +14,9 @@ import ( "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/signer/core/apitypes" - "github.com/evmos/evmos/v17/ethereum/eip712" - "github.com/evmos/evmos/v17/wallets/accounts" - "github.com/evmos/evmos/v17/wallets/usbwallet" + "github.com/evmos/evmos/v18/ethereum/eip712" + "github.com/evmos/evmos/v18/wallets/accounts" + "github.com/evmos/evmos/v18/wallets/usbwallet" ) // Secp256k1DerivationFn defines the derivation function used on the Cosmos SDK Keyring. diff --git a/wallets/ledger/ledger_suite_test.go b/wallets/ledger/ledger_suite_test.go index 2152fc587f..40eb9c60dd 100644 --- a/wallets/ledger/ledger_suite_test.go +++ b/wallets/ledger/ledger_suite_test.go @@ -21,9 +21,9 @@ import ( auxTx "github.com/cosmos/cosmos-sdk/x/auth/tx" bankTypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/evmos/evmos/v17/wallets/ledger" - "github.com/evmos/evmos/v17/wallets/ledger/mocks" - "github.com/evmos/evmos/v17/wallets/usbwallet" + "github.com/evmos/evmos/v18/wallets/ledger" + "github.com/evmos/evmos/v18/wallets/ledger/mocks" + "github.com/evmos/evmos/v18/wallets/usbwallet" ) type LedgerTestSuite struct { diff --git a/wallets/ledger/ledger_test.go b/wallets/ledger/ledger_test.go index b30ab96b0f..eaf4359c37 100644 --- a/wallets/ledger/ledger_test.go +++ b/wallets/ledger/ledger_test.go @@ -8,11 +8,11 @@ import ( gethaccounts "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/encoding" - "github.com/evmos/evmos/v17/ethereum/eip712" - "github.com/evmos/evmos/v17/wallets/accounts" - "github.com/evmos/evmos/v17/wallets/ledger" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/encoding" + "github.com/evmos/evmos/v18/ethereum/eip712" + "github.com/evmos/evmos/v18/wallets/accounts" + "github.com/evmos/evmos/v18/wallets/ledger" ) // Test Mnemonic: diff --git a/wallets/ledger/mocks/wallet.go b/wallets/ledger/mocks/wallet.go index 5547c2ab55..200f6cec67 100644 --- a/wallets/ledger/mocks/wallet.go +++ b/wallets/ledger/mocks/wallet.go @@ -6,7 +6,7 @@ package mocks import ( apitypes "github.com/ethereum/go-ethereum/signer/core/apitypes" - accounts "github.com/evmos/evmos/v17/wallets/accounts" + accounts "github.com/evmos/evmos/v18/wallets/accounts" big "math/big" diff --git a/wallets/ledger/wallet_test.go b/wallets/ledger/wallet_test.go index 6f6d020931..a080c64355 100644 --- a/wallets/ledger/wallet_test.go +++ b/wallets/ledger/wallet_test.go @@ -9,9 +9,9 @@ import ( gethaccounts "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v17/ethereum/eip712" - "github.com/evmos/evmos/v17/wallets/accounts" - "github.com/evmos/evmos/v17/wallets/ledger/mocks" + "github.com/evmos/evmos/v18/ethereum/eip712" + "github.com/evmos/evmos/v18/wallets/accounts" + "github.com/evmos/evmos/v18/wallets/ledger/mocks" ) func RegisterDerive(mockWallet *mocks.Wallet, addr common.Address, publicKey *ecdsa.PublicKey) { diff --git a/wallets/usbwallet/hub.go b/wallets/usbwallet/hub.go index 6ae48d6214..19443ffc1e 100644 --- a/wallets/usbwallet/hub.go +++ b/wallets/usbwallet/hub.go @@ -14,7 +14,7 @@ import ( "runtime" gethaccounts "github.com/ethereum/go-ethereum/accounts" - "github.com/evmos/evmos/v17/wallets/accounts" + "github.com/evmos/evmos/v18/wallets/accounts" usb "github.com/zondax/hid" ) diff --git a/wallets/usbwallet/wallet.go b/wallets/usbwallet/wallet.go index bcfd811360..741984d954 100644 --- a/wallets/usbwallet/wallet.go +++ b/wallets/usbwallet/wallet.go @@ -16,7 +16,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/signer/core/apitypes" - "github.com/evmos/evmos/v17/wallets/accounts" + "github.com/evmos/evmos/v18/wallets/accounts" usb "github.com/zondax/hid" ) diff --git a/x/epochs/client/cli/query.go b/x/epochs/client/cli/query.go index 67e5dfb83a..537e587ac2 100644 --- a/x/epochs/client/cli/query.go +++ b/x/epochs/client/cli/query.go @@ -12,7 +12,7 @@ import ( "github.com/cosmos/cosmos-sdk/version" "github.com/spf13/cobra" - "github.com/evmos/evmos/v17/x/epochs/types" + "github.com/evmos/evmos/v18/x/epochs/types" ) // GetQueryCmd returns the cli query commands for this module diff --git a/x/epochs/genesis.go b/x/epochs/genesis.go index f6efdc2b1f..67b04a203c 100644 --- a/x/epochs/genesis.go +++ b/x/epochs/genesis.go @@ -8,8 +8,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/x/epochs/keeper" - "github.com/evmos/evmos/v17/x/epochs/types" + "github.com/evmos/evmos/v18/x/epochs/keeper" + "github.com/evmos/evmos/v18/x/epochs/types" ) // InitGenesis initializes the epochs module's state from a provided genesis diff --git a/x/epochs/genesis_test.go b/x/epochs/genesis_test.go index efc2001295..da8d6617e6 100644 --- a/x/epochs/genesis_test.go +++ b/x/epochs/genesis_test.go @@ -5,13 +5,13 @@ import ( "time" tmproto "github.com/cometbft/cometbft/proto/tendermint/types" - "github.com/evmos/evmos/v17/utils" - feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" + "github.com/evmos/evmos/v18/utils" + feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" "github.com/stretchr/testify/require" - simapp "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/x/epochs" - "github.com/evmos/evmos/v17/x/epochs/types" + simapp "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/x/epochs" + "github.com/evmos/evmos/v18/x/epochs/types" ) func TestEpochsExportGenesis(t *testing.T) { diff --git a/x/epochs/keeper/abci.go b/x/epochs/keeper/abci.go index f85e6fb24c..9abed6db66 100644 --- a/x/epochs/keeper/abci.go +++ b/x/epochs/keeper/abci.go @@ -10,7 +10,7 @@ import ( "github.com/cosmos/cosmos-sdk/telemetry" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/x/epochs/types" + "github.com/evmos/evmos/v18/x/epochs/types" ) // BeginBlocker of epochs module diff --git a/x/epochs/keeper/abci_test.go b/x/epochs/keeper/abci_test.go index cf75824331..f40518f9ec 100644 --- a/x/epochs/keeper/abci_test.go +++ b/x/epochs/keeper/abci_test.go @@ -4,8 +4,8 @@ import ( "fmt" "time" - "github.com/evmos/evmos/v17/x/epochs" - "github.com/evmos/evmos/v17/x/epochs/types" + "github.com/evmos/evmos/v18/x/epochs" + "github.com/evmos/evmos/v18/x/epochs/types" ) func (suite *KeeperTestSuite) TestEpochInfoChangesBeginBlockerAndInitGenesis() { diff --git a/x/epochs/keeper/epoch_infos.go b/x/epochs/keeper/epoch_infos.go index 31ae431f01..4b68f9325f 100644 --- a/x/epochs/keeper/epoch_infos.go +++ b/x/epochs/keeper/epoch_infos.go @@ -8,7 +8,7 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/x/epochs/types" + "github.com/evmos/evmos/v18/x/epochs/types" ) // GetEpochInfo returns epoch info by identifier diff --git a/x/epochs/keeper/epoch_infos_test.go b/x/epochs/keeper/epoch_infos_test.go index 24523a8b6d..154dc14362 100644 --- a/x/epochs/keeper/epoch_infos_test.go +++ b/x/epochs/keeper/epoch_infos_test.go @@ -3,7 +3,7 @@ package keeper_test import ( "time" - "github.com/evmos/evmos/v17/x/epochs/types" + "github.com/evmos/evmos/v18/x/epochs/types" ) func (suite *KeeperTestSuite) TestEpochLifeCycle() { diff --git a/x/epochs/keeper/grpc_query.go b/x/epochs/keeper/grpc_query.go index b8e0de6246..e897efa42e 100644 --- a/x/epochs/keeper/grpc_query.go +++ b/x/epochs/keeper/grpc_query.go @@ -12,7 +12,7 @@ import ( "google.golang.org/grpc/codes" "google.golang.org/grpc/status" - "github.com/evmos/evmos/v17/x/epochs/types" + "github.com/evmos/evmos/v18/x/epochs/types" ) var _ types.QueryServer = Keeper{} diff --git a/x/epochs/keeper/grpc_query_test.go b/x/epochs/keeper/grpc_query_test.go index 40d331d139..2c76b57b7d 100644 --- a/x/epochs/keeper/grpc_query_test.go +++ b/x/epochs/keeper/grpc_query_test.go @@ -6,7 +6,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/query" - "github.com/evmos/evmos/v17/x/epochs/types" + "github.com/evmos/evmos/v18/x/epochs/types" ) func (suite *KeeperTestSuite) TestEpochInfo() { diff --git a/x/epochs/keeper/hooks.go b/x/epochs/keeper/hooks.go index 97d45b99ba..8875c339e7 100644 --- a/x/epochs/keeper/hooks.go +++ b/x/epochs/keeper/hooks.go @@ -5,7 +5,7 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/x/epochs/types" + "github.com/evmos/evmos/v18/x/epochs/types" ) var _ types.EpochHooks = MultiEpochHooks{} diff --git a/x/epochs/keeper/keeper.go b/x/epochs/keeper/keeper.go index be83f6c8c6..b1f785b75a 100644 --- a/x/epochs/keeper/keeper.go +++ b/x/epochs/keeper/keeper.go @@ -11,7 +11,7 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/x/epochs/types" + "github.com/evmos/evmos/v18/x/epochs/types" ) // Keeper of this module maintains collections of epochs and hooks. diff --git a/x/epochs/keeper/setup_test.go b/x/epochs/keeper/setup_test.go index 0ea9208e95..2bb5251e8a 100644 --- a/x/epochs/keeper/setup_test.go +++ b/x/epochs/keeper/setup_test.go @@ -11,10 +11,10 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/suite" - evm "github.com/evmos/evmos/v17/x/evm/types" + evm "github.com/evmos/evmos/v18/x/evm/types" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/x/epochs/types" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/x/epochs/types" ) type KeeperTestSuite struct { diff --git a/x/epochs/keeper/utils_test.go b/x/epochs/keeper/utils_test.go index 42fad3dccd..caa4fc9d57 100644 --- a/x/epochs/keeper/utils_test.go +++ b/x/epochs/keeper/utils_test.go @@ -4,11 +4,11 @@ import ( "time" "github.com/cosmos/cosmos-sdk/baseapp" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/testutil" - "github.com/evmos/evmos/v17/utils" - "github.com/evmos/evmos/v17/x/epochs/types" - evm "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/testutil" + "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v18/x/epochs/types" + evm "github.com/evmos/evmos/v18/x/evm/types" ) // Test helpers diff --git a/x/epochs/module.go b/x/epochs/module.go index b67d6e561a..2ca4818b7d 100644 --- a/x/epochs/module.go +++ b/x/epochs/module.go @@ -22,9 +22,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" - "github.com/evmos/evmos/v17/x/epochs/client/cli" - "github.com/evmos/evmos/v17/x/epochs/keeper" - "github.com/evmos/evmos/v17/x/epochs/types" + "github.com/evmos/evmos/v18/x/epochs/client/cli" + "github.com/evmos/evmos/v18/x/epochs/keeper" + "github.com/evmos/evmos/v18/x/epochs/types" ) // consensusVersion defines the current x/epochs module consensus version. diff --git a/x/epochs/types/genesis.pb.go b/x/epochs/types/genesis.pb.go index 3441fabbae..a7f166cf3d 100644 --- a/x/epochs/types/genesis.pb.go +++ b/x/epochs/types/genesis.pb.go @@ -186,33 +186,33 @@ var fileDescriptor_c74bc0b3e7fa01c2 = []byte{ // 463 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x53, 0x31, 0x8f, 0xd3, 0x30, 0x14, 0xae, 0x69, 0x29, 0x57, 0x73, 0xe8, 0x84, 0x75, 0x40, 0xa8, 0x74, 0x4e, 0x14, 0x96, 0x22, - 0x90, 0xad, 0x02, 0x12, 0x08, 0xb6, 0x1e, 0x88, 0x63, 0x4d, 0x19, 0x10, 0x4b, 0x95, 0xb6, 0xae, + 0x90, 0xad, 0x02, 0xc3, 0x09, 0xb6, 0x1e, 0x88, 0x63, 0x4d, 0x19, 0x10, 0x4b, 0x95, 0xb6, 0xae, 0x63, 0xe9, 0x12, 0x47, 0xc9, 0x4b, 0x45, 0x37, 0x66, 0xa6, 0x1b, 0xf9, 0x49, 0x37, 0xde, 0xc8, 0x54, 0x50, 0xbb, 0x31, 0xde, 0x2f, 0x40, 0xb1, 0x93, 0x52, 0xae, 0x20, 0x96, 0x28, 0x7e, 0xdf, 0xf7, 0xbe, 0xcf, 0xdf, 0xd3, 0x33, 0x3e, 0x12, 0xf3, 0x58, 0xe7, 0x5c, 0xa4, 0x7a, 0x12, 0xe5, 0x7c, 0xde, 0xe7, 0x52, 0x24, 0x22, 0x57, 0x39, 0x4b, 0x33, 0x0d, 0x9a, 0x1c, 0x18, 0x98, 0x59, 0x98, 0xcd, 0xfb, 0xdd, 0x43, 0xa9, 0xa5, 0x36, 0x18, 0x2f, 0xff, 0x2c, 0xad, 0x4b, 0xa5, 0xd6, - 0xf2, 0x54, 0x70, 0x73, 0x1a, 0x17, 0x33, 0x3e, 0x2d, 0xb2, 0x10, 0x94, 0x4e, 0x2a, 0xdc, 0xbd, - 0x8a, 0x83, 0x8a, 0x45, 0x0e, 0x61, 0x9c, 0x5a, 0x82, 0xff, 0xa5, 0x85, 0x3b, 0x6f, 0x4a, 0x93, + 0xf2, 0x4c, 0x70, 0x73, 0x1a, 0x17, 0x33, 0x3e, 0x2d, 0xb2, 0x10, 0x94, 0x4e, 0x2a, 0xdc, 0xbd, + 0x8e, 0x83, 0x8a, 0x45, 0x0e, 0x61, 0x9c, 0x5a, 0x82, 0xff, 0xa5, 0x85, 0x3b, 0x6f, 0x4a, 0x93, 0x77, 0xc9, 0x4c, 0x13, 0x8a, 0xb1, 0x9a, 0x8a, 0x04, 0xd4, 0x4c, 0x89, 0xcc, 0x41, 0x1e, 0xea, - 0x75, 0x82, 0xad, 0x0a, 0xf9, 0x80, 0x71, 0x0e, 0x61, 0x06, 0xa3, 0x52, 0xc6, 0xb9, 0xe6, 0xa1, - 0xde, 0xcd, 0x27, 0x5d, 0x66, 0x3d, 0x58, 0xed, 0xc1, 0xde, 0xd7, 0x1e, 0x83, 0xa3, 0xf3, 0xa5, - 0xdb, 0xb8, 0x5c, 0xba, 0xb7, 0x17, 0x61, 0x7c, 0xfa, 0xd2, 0xff, 0xdd, 0xeb, 0x9f, 0x7d, 0x77, - 0x51, 0xd0, 0x31, 0x85, 0x92, 0x4e, 0x22, 0xbc, 0x57, 0x5f, 0xdd, 0x69, 0x1a, 0xdd, 0xfb, 0x3b, - 0xba, 0xaf, 0x2b, 0xc2, 0xa0, 0x5f, 0xca, 0xfe, 0x5c, 0xba, 0xa4, 0x6e, 0x79, 0xac, 0x63, 0x05, - 0x22, 0x4e, 0x61, 0x71, 0xb9, 0x74, 0x0f, 0xac, 0x59, 0x8d, 0xf9, 0x5f, 0x4b, 0xab, 0x8d, 0x3a, - 0x79, 0x80, 0x6f, 0x4d, 0x8a, 0x2c, 0x13, 0x09, 0x8c, 0xcc, 0x74, 0x9d, 0x96, 0x87, 0x7a, 0xcd, - 0x60, 0xbf, 0x2a, 0x9a, 0x61, 0x90, 0xcf, 0x08, 0x3b, 0x7f, 0xb0, 0x46, 0x5b, 0xb9, 0xaf, 0xff, - 0x37, 0xf7, 0xa3, 0x2a, 0xb7, 0x6b, 0xaf, 0xf2, 0x2f, 0x25, 0x3b, 0x85, 0x3b, 0xdb, 0xce, 0xc3, - 0xcd, 0x44, 0x9e, 0xe1, 0xbb, 0x96, 0x3f, 0xd1, 0x45, 0x02, 0x2a, 0x91, 0xb6, 0x51, 0x4c, 0x9d, - 0xb6, 0x87, 0x7a, 0x7b, 0xc1, 0xa1, 0x41, 0x8f, 0x2b, 0x70, 0x68, 0x31, 0xf2, 0x0a, 0x77, 0xff, - 0xe6, 0x16, 0x09, 0x25, 0x23, 0x70, 0x6e, 0x98, 0xa8, 0xf7, 0x76, 0x0c, 0x4f, 0x0c, 0xec, 0x9f, - 0xe0, 0xfd, 0xb7, 0x76, 0x0b, 0x87, 0x10, 0x82, 0x20, 0x2f, 0x70, 0xdb, 0x2e, 0xa0, 0x83, 0xbc, - 0xa6, 0x89, 0x7c, 0x65, 0x2b, 0xd9, 0x66, 0x75, 0x06, 0xad, 0x32, 0x72, 0x50, 0xf1, 0x07, 0xc7, - 0xe7, 0x2b, 0x8a, 0x2e, 0x56, 0x14, 0xfd, 0x58, 0x51, 0x74, 0xb6, 0xa6, 0x8d, 0x8b, 0x35, 0x6d, - 0x7c, 0x5b, 0xd3, 0xc6, 0xc7, 0x87, 0x52, 0x41, 0x54, 0x8c, 0xd9, 0x44, 0xc7, 0xbc, 0x7a, 0x02, - 0xe6, 0x3b, 0xef, 0x3f, 0xe7, 0x9f, 0xea, 0xe7, 0x00, 0x8b, 0x54, 0xe4, 0xe3, 0xb6, 0x99, 0xec, - 0xd3, 0x5f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x3b, 0xc3, 0x1c, 0xb7, 0x2b, 0x03, 0x00, 0x00, + 0x75, 0x82, 0xad, 0x0a, 0xf9, 0x80, 0x71, 0x0e, 0x61, 0x06, 0xa3, 0x52, 0xc6, 0xb9, 0xe1, 0xa1, + 0xde, 0xed, 0x67, 0x5d, 0x66, 0x3d, 0x58, 0xed, 0xc1, 0xde, 0xd7, 0x1e, 0x83, 0xa3, 0x8b, 0xa5, + 0xdb, 0xb8, 0x5a, 0xba, 0x77, 0x17, 0x61, 0x7c, 0xf6, 0xd2, 0xff, 0xdd, 0xeb, 0x9f, 0x7f, 0x77, + 0x51, 0xd0, 0x31, 0x85, 0x92, 0x4e, 0x22, 0xbc, 0x57, 0x5f, 0xdd, 0x69, 0x1a, 0xdd, 0x87, 0x3b, + 0xba, 0xaf, 0x2b, 0xc2, 0xa0, 0x5f, 0xca, 0xfe, 0x5c, 0xba, 0xa4, 0x6e, 0x79, 0xaa, 0x63, 0x05, + 0x22, 0x4e, 0x61, 0x71, 0xb5, 0x74, 0x0f, 0xac, 0x59, 0x8d, 0xf9, 0x5f, 0x4b, 0xab, 0x8d, 0x3a, + 0x79, 0x84, 0xef, 0x4c, 0x8a, 0x2c, 0x13, 0x09, 0x8c, 0xcc, 0x74, 0x9d, 0x96, 0x87, 0x7a, 0xcd, + 0x60, 0xbf, 0x2a, 0x9a, 0x61, 0x90, 0xcf, 0x08, 0x3b, 0x7f, 0xb0, 0x46, 0x5b, 0xb9, 0x6f, 0xfe, + 0x37, 0xf7, 0x93, 0x2a, 0xb7, 0x6b, 0xaf, 0xf2, 0x2f, 0x25, 0x3b, 0x85, 0x7b, 0xdb, 0xce, 0xc3, + 0xcd, 0x44, 0x5e, 0xe0, 0xfb, 0x96, 0x3f, 0xd1, 0x45, 0x02, 0x2a, 0x91, 0xb6, 0x51, 0x4c, 0x9d, + 0xb6, 0x87, 0x7a, 0x7b, 0xc1, 0xa1, 0x41, 0x4f, 0x2a, 0x70, 0x68, 0x31, 0xf2, 0x0a, 0x77, 0xff, + 0xe6, 0x16, 0x09, 0x25, 0x23, 0x70, 0x6e, 0x99, 0xa8, 0x0f, 0x76, 0x0c, 0x4f, 0x0d, 0xec, 0x9f, + 0xe2, 0xfd, 0xb7, 0x76, 0x0b, 0x87, 0x10, 0x82, 0x20, 0xc7, 0xb8, 0x6d, 0x17, 0xd0, 0x41, 0x5e, + 0xd3, 0x44, 0xbe, 0xb6, 0x95, 0x6c, 0xb3, 0x3a, 0x83, 0x56, 0x19, 0x39, 0xa8, 0xf8, 0x83, 0x93, + 0x8b, 0x15, 0x45, 0x97, 0x2b, 0x8a, 0x7e, 0xac, 0x28, 0x3a, 0x5f, 0xd3, 0xc6, 0xe5, 0x9a, 0x36, + 0xbe, 0xad, 0x69, 0xe3, 0xe3, 0x63, 0xa9, 0x20, 0x2a, 0xc6, 0x6c, 0xa2, 0x63, 0x5e, 0x3d, 0x01, + 0xf3, 0x9d, 0xf7, 0x8f, 0xf9, 0xa7, 0xfa, 0x39, 0xc0, 0x22, 0x15, 0xf9, 0xb8, 0x6d, 0x26, 0xfb, + 0xfc, 0x57, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf2, 0xc8, 0x09, 0x54, 0x2b, 0x03, 0x00, 0x00, } func (m *EpochInfo) Marshal() (dAtA []byte, err error) { diff --git a/x/epochs/types/query.pb.go b/x/epochs/types/query.pb.go index ed5f55f596..722158e9c1 100644 --- a/x/epochs/types/query.pb.go +++ b/x/epochs/types/query.pb.go @@ -240,32 +240,32 @@ var fileDescriptor_d13f5778acd937ff = []byte{ // 449 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0xc1, 0x6b, 0x14, 0x31, 0x14, 0xc6, 0x37, 0x5b, 0x2d, 0x98, 0x56, 0x84, 0x20, 0x76, 0x3b, 0x6a, 0xba, 0xac, 0xd0, 0x6e, - 0x7b, 0x48, 0x98, 0xf5, 0xa0, 0x78, 0x92, 0x16, 0x15, 0x6f, 0x3a, 0x47, 0x2f, 0x3a, 0x3b, 0xbe, - 0xa6, 0x01, 0x9b, 0x4c, 0x27, 0x99, 0xc1, 0xde, 0xc4, 0xbb, 0x20, 0x78, 0x13, 0xff, 0xa0, 0x1e, - 0x0b, 0x5e, 0x3c, 0x89, 0xec, 0xfa, 0x87, 0xc8, 0x24, 0x59, 0x9d, 0xdd, 0x1d, 0x58, 0x2f, 0x43, - 0xc8, 0x7b, 0xdf, 0xf7, 0x7e, 0xef, 0x9b, 0xe0, 0xdb, 0x50, 0x9d, 0x6a, 0xc3, 0x21, 0xd7, 0xd9, - 0x89, 0xe1, 0x55, 0xcc, 0xcf, 0x4a, 0x28, 0xce, 0x59, 0x5e, 0x68, 0xab, 0xc9, 0x0d, 0x57, 0x64, - 0xbe, 0xc8, 0xaa, 0x38, 0x3a, 0xc8, 0xb4, 0xa9, 0xdb, 0xc7, 0xa9, 0x01, 0xdf, 0xc9, 0xab, 0x78, - 0x0c, 0x36, 0x8d, 0x79, 0x9e, 0x0a, 0xa9, 0x52, 0x2b, 0xb5, 0xf2, 0xe2, 0xe8, 0xee, 0xa2, 0xb3, - 0x00, 0x05, 0x46, 0x9a, 0x50, 0xbe, 0x29, 0xb4, 0xd0, 0xee, 0xc8, 0xeb, 0x53, 0xb8, 0xbd, 0x23, - 0xb4, 0x16, 0xef, 0x80, 0xa7, 0xb9, 0xe4, 0xa9, 0x52, 0xda, 0x3a, 0xc7, 0xa0, 0x19, 0xbc, 0xc1, - 0xb7, 0x5e, 0xd6, 0x43, 0x9f, 0x38, 0xcf, 0xe7, 0xea, 0x58, 0x27, 0x70, 0x56, 0x82, 0xb1, 0xe4, - 0x29, 0xc6, 0xff, 0x00, 0x7a, 0xa8, 0x8f, 0x86, 0x1b, 0xa3, 0x5d, 0xe6, 0x69, 0x59, 0x4d, 0xcb, - 0xfc, 0x5e, 0x81, 0x96, 0xbd, 0x48, 0x05, 0x04, 0x6d, 0xd2, 0x50, 0x0e, 0xbe, 0x21, 0xbc, 0xb5, - 0x34, 0xc2, 0xe4, 0x5a, 0x19, 0x20, 0x0f, 0xf1, 0xba, 0x5f, 0xa6, 0x87, 0xfa, 0x6b, 0xc3, 0x8d, - 0x51, 0xc4, 0x16, 0xe2, 0x61, 0x4e, 0x54, 0x6b, 0x0e, 0xaf, 0x5c, 0xfc, 0xdc, 0xe9, 0x24, 0xa1, - 0x9f, 0x3c, 0x9b, 0xa3, 0xeb, 0x3a, 0xba, 0xbd, 0x95, 0x74, 0x7e, 0xec, 0x1c, 0xde, 0x23, 0xdc, - 0x73, 0x74, 0x47, 0x65, 0x51, 0x80, 0xb2, 0x6e, 0xde, 0x2c, 0x02, 0x8a, 0xb1, 0x7c, 0x0b, 0xca, - 0xca, 0x63, 0x09, 0x85, 0x8b, 0xe0, 0x5a, 0xd2, 0xb8, 0x19, 0x3c, 0xc6, 0xdb, 0x2d, 0xda, 0xb0, - 0xdb, 0x3d, 0x7c, 0x3d, 0xf3, 0xf7, 0xaf, 0x1d, 0xb3, 0xd3, 0xaf, 0x25, 0x9b, 0x59, 0xa3, 0x79, - 0xf4, 0xb5, 0x8b, 0xaf, 0x3a, 0x0b, 0xf2, 0x01, 0x61, 0xfc, 0x77, 0x59, 0x43, 0xf6, 0x96, 0x92, - 0x68, 0xff, 0x4d, 0xd1, 0x70, 0x75, 0xa3, 0x07, 0x1a, 0xec, 0x7c, 0xfc, 0xfe, 0xfb, 0x4b, 0x77, - 0x9b, 0x6c, 0xf1, 0xc5, 0x67, 0x14, 0x32, 0xfd, 0x84, 0xf0, 0x66, 0x73, 0x15, 0xb2, 0xdf, 0xee, - 0xdd, 0x12, 0x55, 0x74, 0xf0, 0x3f, 0xad, 0x01, 0x64, 0xd7, 0x81, 0xf4, 0x09, 0x5d, 0x02, 0x99, - 0x0b, 0xec, 0xf0, 0xe8, 0x62, 0x42, 0xd1, 0xe5, 0x84, 0xa2, 0x5f, 0x13, 0x8a, 0x3e, 0x4f, 0x69, - 0xe7, 0x72, 0x4a, 0x3b, 0x3f, 0xa6, 0xb4, 0xf3, 0x6a, 0x5f, 0x48, 0x7b, 0x52, 0x8e, 0x59, 0xa6, - 0x4f, 0x67, 0x1e, 0xee, 0x5b, 0xc5, 0x0f, 0xf8, 0xfb, 0x99, 0x9f, 0x3d, 0xcf, 0xc1, 0x8c, 0xd7, - 0xdd, 0x3b, 0xbf, 0xff, 0x27, 0x00, 0x00, 0xff, 0xff, 0x28, 0x53, 0xb5, 0x35, 0x96, 0x03, 0x00, + 0x7b, 0x48, 0x98, 0xf5, 0x52, 0x3c, 0x49, 0x8b, 0x8a, 0x37, 0x9d, 0xa3, 0x17, 0x9d, 0x1d, 0x5f, + 0xd3, 0x80, 0x4d, 0xa6, 0x93, 0xcc, 0x60, 0x6f, 0xe2, 0x5d, 0x10, 0xbc, 0x89, 0x7f, 0x50, 0x8f, + 0x05, 0x2f, 0x9e, 0x44, 0x76, 0xfd, 0x43, 0x64, 0x92, 0xac, 0xce, 0xee, 0x0e, 0xac, 0x97, 0x21, + 0xe4, 0xbd, 0xef, 0x7b, 0xbf, 0xf7, 0x4d, 0xf0, 0x5d, 0xa8, 0xce, 0xb4, 0xe1, 0x90, 0xeb, 0xec, + 0xd4, 0xf0, 0x2a, 0xe6, 0xe7, 0x25, 0x14, 0x17, 0x2c, 0x2f, 0xb4, 0xd5, 0xe4, 0x96, 0x2b, 0x32, + 0x5f, 0x64, 0x55, 0x1c, 0x1d, 0x64, 0xda, 0xd4, 0xed, 0xe3, 0xd4, 0x80, 0xef, 0xe4, 0x55, 0x3c, + 0x06, 0x9b, 0xc6, 0x3c, 0x4f, 0x85, 0x54, 0xa9, 0x95, 0x5a, 0x79, 0x71, 0x74, 0x7f, 0xd1, 0x59, + 0x80, 0x02, 0x23, 0x4d, 0x28, 0xdf, 0x16, 0x5a, 0x68, 0x77, 0xe4, 0xf5, 0x29, 0xdc, 0xde, 0x13, + 0x5a, 0x8b, 0x77, 0xc0, 0xd3, 0x5c, 0xf2, 0x54, 0x29, 0x6d, 0x9d, 0x63, 0xd0, 0x0c, 0xde, 0xe0, + 0x3b, 0x2f, 0xeb, 0xa1, 0x4f, 0x9c, 0xe7, 0x73, 0x75, 0xa2, 0x13, 0x38, 0x2f, 0xc1, 0x58, 0xf2, + 0x14, 0xe3, 0x7f, 0x00, 0x3d, 0xd4, 0x47, 0xc3, 0x8d, 0xd1, 0x2e, 0xf3, 0xb4, 0xac, 0xa6, 0x65, + 0x7e, 0xaf, 0x40, 0xcb, 0x5e, 0xa4, 0x02, 0x82, 0x36, 0x69, 0x28, 0x07, 0xdf, 0x10, 0xde, 0x5a, + 0x1a, 0x61, 0x72, 0xad, 0x0c, 0x90, 0x43, 0xbc, 0xee, 0x97, 0xe9, 0xa1, 0xfe, 0xda, 0x70, 0x63, + 0x14, 0xb1, 0x85, 0x78, 0x98, 0x13, 0xd5, 0x9a, 0xa3, 0x6b, 0x97, 0x3f, 0x77, 0x3a, 0x49, 0xe8, + 0x27, 0xcf, 0xe6, 0xe8, 0xba, 0x8e, 0x6e, 0x6f, 0x25, 0x9d, 0x1f, 0x3b, 0x87, 0xf7, 0x08, 0xf7, + 0x1c, 0xdd, 0x71, 0x59, 0x14, 0xa0, 0xac, 0x9b, 0x37, 0x8b, 0x80, 0x62, 0x2c, 0xdf, 0x82, 0xb2, + 0xf2, 0x44, 0x42, 0xe1, 0x22, 0xb8, 0x91, 0x34, 0x6e, 0x06, 0x8f, 0xf1, 0x76, 0x8b, 0x36, 0xec, + 0xf6, 0x00, 0xdf, 0xcc, 0xfc, 0xfd, 0x6b, 0xc7, 0xec, 0xf4, 0x6b, 0xc9, 0x66, 0xd6, 0x68, 0x1e, + 0x7d, 0xed, 0xe2, 0xeb, 0xce, 0x82, 0x7c, 0x40, 0x18, 0xff, 0x5d, 0xd6, 0x90, 0xbd, 0xa5, 0x24, + 0xda, 0x7f, 0x53, 0x34, 0x5c, 0xdd, 0xe8, 0x81, 0x06, 0x3b, 0x1f, 0xbf, 0xff, 0xfe, 0xd2, 0xdd, + 0x26, 0x5b, 0x7c, 0xf1, 0x19, 0x85, 0x4c, 0x3f, 0x21, 0xbc, 0xd9, 0x5c, 0x85, 0xec, 0xb7, 0x7b, + 0xb7, 0x44, 0x15, 0x1d, 0xfc, 0x4f, 0x6b, 0x00, 0xd9, 0x75, 0x20, 0x7d, 0x42, 0x97, 0x40, 0xe6, + 0x02, 0x3b, 0x3a, 0xbe, 0x9c, 0x50, 0x74, 0x35, 0xa1, 0xe8, 0xd7, 0x84, 0xa2, 0xcf, 0x53, 0xda, + 0xb9, 0x9a, 0xd2, 0xce, 0x8f, 0x29, 0xed, 0xbc, 0xda, 0x17, 0xd2, 0x9e, 0x96, 0x63, 0x96, 0xe9, + 0xb3, 0x99, 0x87, 0xfb, 0x56, 0xf1, 0x21, 0x7f, 0x3f, 0xf3, 0xb3, 0x17, 0x39, 0x98, 0xf1, 0xba, + 0x7b, 0xe7, 0x0f, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0xe1, 0x58, 0xa0, 0xd6, 0x96, 0x03, 0x00, 0x00, } diff --git a/x/erc20/client/cli/query.go b/x/erc20/client/cli/query.go index 8b717b35f9..4e6fc03ec2 100644 --- a/x/erc20/client/cli/query.go +++ b/x/erc20/client/cli/query.go @@ -10,7 +10,7 @@ import ( "github.com/cosmos/cosmos-sdk/client/flags" "github.com/spf13/cobra" - "github.com/evmos/evmos/v17/x/erc20/types" + "github.com/evmos/evmos/v18/x/erc20/types" ) // GetQueryCmd returns the parent command for all erc20 CLI query commands diff --git a/x/erc20/client/cli/tx.go b/x/erc20/client/cli/tx.go index 89762c24ae..41b87a932e 100644 --- a/x/erc20/client/cli/tx.go +++ b/x/erc20/client/cli/tx.go @@ -19,9 +19,9 @@ import ( "github.com/ethereum/go-ethereum/common" - evmostypes "github.com/evmos/evmos/v17/types" + evmostypes "github.com/evmos/evmos/v18/types" - "github.com/evmos/evmos/v17/x/erc20/types" + "github.com/evmos/evmos/v18/x/erc20/types" ) // NewTxCmd returns a root CLI command handler for erc20 transaction commands diff --git a/x/erc20/client/proposal_handler.go b/x/erc20/client/proposal_handler.go index d7d8fe2dad..bd6bdac931 100644 --- a/x/erc20/client/proposal_handler.go +++ b/x/erc20/client/proposal_handler.go @@ -6,7 +6,7 @@ package client import ( govclient "github.com/cosmos/cosmos-sdk/x/gov/client" - "github.com/evmos/evmos/v17/x/erc20/client/cli" + "github.com/evmos/evmos/v18/x/erc20/client/cli" ) var ( diff --git a/x/erc20/genesis.go b/x/erc20/genesis.go index eecfac02ed..0c8d5d38bf 100644 --- a/x/erc20/genesis.go +++ b/x/erc20/genesis.go @@ -9,8 +9,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" - "github.com/evmos/evmos/v17/x/erc20/keeper" - "github.com/evmos/evmos/v17/x/erc20/types" + "github.com/evmos/evmos/v18/x/erc20/keeper" + "github.com/evmos/evmos/v18/x/erc20/types" ) // InitGenesis import module genesis diff --git a/x/erc20/genesis_test.go b/x/erc20/genesis_test.go index f33b4bf1ec..c7d5ae8c63 100644 --- a/x/erc20/genesis_test.go +++ b/x/erc20/genesis_test.go @@ -15,13 +15,13 @@ import ( transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - "github.com/evmos/evmos/v17/utils" - feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/utils" + feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/x/erc20" - "github.com/evmos/evmos/v17/x/erc20/types" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/x/erc20" + "github.com/evmos/evmos/v18/x/erc20/types" ) type GenesisTestSuite struct { diff --git a/x/erc20/ibc_middleware.go b/x/erc20/ibc_middleware.go index afb43f4cb9..2652ed3669 100644 --- a/x/erc20/ibc_middleware.go +++ b/x/erc20/ibc_middleware.go @@ -13,8 +13,8 @@ import ( "github.com/cosmos/ibc-go/v7/modules/core/exported" errortypes "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/evmos/evmos/v17/ibc" - "github.com/evmos/evmos/v17/x/erc20/keeper" + "github.com/evmos/evmos/v18/ibc" + "github.com/evmos/evmos/v18/x/erc20/keeper" ) var _ porttypes.IBCModule = &IBCMiddleware{} diff --git a/x/erc20/keeper/erc20_utils_test.go b/x/erc20/keeper/erc20_utils_test.go index 483f20eaef..c78026d307 100644 --- a/x/erc20/keeper/erc20_utils_test.go +++ b/x/erc20/keeper/erc20_utils_test.go @@ -6,9 +6,9 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v17/contracts" - "github.com/evmos/evmos/v17/x/erc20/types" - evm "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/contracts" + "github.com/evmos/evmos/v18/x/erc20/types" + evm "github.com/evmos/evmos/v18/x/evm/types" ) func (suite *KeeperTestSuite) MintERC20Token(contractAddr, from, to common.Address, amount *big.Int) *evm.MsgEthereumTx { diff --git a/x/erc20/keeper/evm.go b/x/erc20/keeper/evm.go index b9370ecea5..70e64131ca 100644 --- a/x/erc20/keeper/evm.go +++ b/x/erc20/keeper/evm.go @@ -16,11 +16,11 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v17/server/config" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/server/config" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" - "github.com/evmos/evmos/v17/contracts" - "github.com/evmos/evmos/v17/x/erc20/types" + "github.com/evmos/evmos/v18/contracts" + "github.com/evmos/evmos/v18/x/erc20/types" ) // DeployERC20Contract creates and deploys an ERC20 contract on the EVM with the diff --git a/x/erc20/keeper/evm_test.go b/x/erc20/keeper/evm_test.go index a337b7924b..e12baa8f10 100644 --- a/x/erc20/keeper/evm_test.go +++ b/x/erc20/keeper/evm_test.go @@ -7,14 +7,14 @@ import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/ethereum/go-ethereum/common" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" "github.com/stretchr/testify/mock" - "github.com/evmos/evmos/v17/contracts" - "github.com/evmos/evmos/v17/x/erc20/keeper" - "github.com/evmos/evmos/v17/x/erc20/types" - erc20mocks "github.com/evmos/evmos/v17/x/erc20/types/mocks" + "github.com/evmos/evmos/v18/contracts" + "github.com/evmos/evmos/v18/x/erc20/keeper" + "github.com/evmos/evmos/v18/x/erc20/types" + erc20mocks "github.com/evmos/evmos/v18/x/erc20/types/mocks" ) func (suite *KeeperTestSuite) TestQueryERC20() { diff --git a/x/erc20/keeper/grpc_query.go b/x/erc20/keeper/grpc_query.go index b659be99bf..0bc1178359 100644 --- a/x/erc20/keeper/grpc_query.go +++ b/x/erc20/keeper/grpc_query.go @@ -12,9 +12,9 @@ import ( "github.com/cosmos/cosmos-sdk/store/prefix" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/query" - evmostypes "github.com/evmos/evmos/v17/types" + evmostypes "github.com/evmos/evmos/v18/types" - "github.com/evmos/evmos/v17/x/erc20/types" + "github.com/evmos/evmos/v18/x/erc20/types" ) var _ types.QueryServer = Keeper{} diff --git a/x/erc20/keeper/grpc_query_test.go b/x/erc20/keeper/grpc_query_test.go index d1a1dc641d..1082a84e78 100644 --- a/x/erc20/keeper/grpc_query_test.go +++ b/x/erc20/keeper/grpc_query_test.go @@ -6,8 +6,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/query" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - "github.com/evmos/evmos/v17/x/erc20/types" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/x/erc20/types" ) func (suite *KeeperTestSuite) TestTokenPairs() { diff --git a/x/erc20/keeper/ibc_callbacks.go b/x/erc20/keeper/ibc_callbacks.go index fec1e47f40..6acadf5acc 100644 --- a/x/erc20/keeper/ibc_callbacks.go +++ b/x/erc20/keeper/ibc_callbacks.go @@ -16,8 +16,8 @@ import ( "github.com/cosmos/ibc-go/v7/modules/core/exported" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v17/ibc" - "github.com/evmos/evmos/v17/x/erc20/types" + "github.com/evmos/evmos/v18/ibc" + "github.com/evmos/evmos/v18/x/erc20/types" ) // OnRecvPacket performs the ICS20 middleware receive callback for automatically diff --git a/x/erc20/keeper/ibc_callbacks_integration_test.go b/x/erc20/keeper/ibc_callbacks_integration_test.go index a30e264844..84b0deb67b 100644 --- a/x/erc20/keeper/ibc_callbacks_integration_test.go +++ b/x/erc20/keeper/ibc_callbacks_integration_test.go @@ -11,12 +11,12 @@ import ( transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/contracts" - ibctesting "github.com/evmos/evmos/v17/ibc/testing" - teststypes "github.com/evmos/evmos/v17/types/tests" - "github.com/evmos/evmos/v17/utils" - "github.com/evmos/evmos/v17/x/erc20/types" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/contracts" + ibctesting "github.com/evmos/evmos/v18/ibc/testing" + teststypes "github.com/evmos/evmos/v18/types/tests" + "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v18/x/erc20/types" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" diff --git a/x/erc20/keeper/ibc_callbacks_test.go b/x/erc20/keeper/ibc_callbacks_test.go index e1d50dbf61..4a60ceebdc 100644 --- a/x/erc20/keeper/ibc_callbacks_test.go +++ b/x/erc20/keeper/ibc_callbacks_test.go @@ -6,8 +6,8 @@ import ( "math/big" "cosmossdk.io/math" - "github.com/evmos/evmos/v17/utils" - "github.com/evmos/evmos/v17/x/erc20/keeper" + "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v18/x/erc20/keeper" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" @@ -16,8 +16,8 @@ import ( "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" - "github.com/evmos/evmos/v17/testutil" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + "github.com/evmos/evmos/v18/testutil" transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" @@ -25,11 +25,11 @@ import ( ibcgotesting "github.com/cosmos/ibc-go/v7/testing" ibcmock "github.com/cosmos/ibc-go/v7/testing/mock" - "github.com/evmos/evmos/v17/contracts" - "github.com/evmos/evmos/v17/x/erc20/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" - inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" - vestingtypes "github.com/evmos/evmos/v17/x/vesting/types" + "github.com/evmos/evmos/v18/contracts" + "github.com/evmos/evmos/v18/x/erc20/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" + inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" + vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" ) var erc20Denom = "erc20/0xdac17f958d2ee523a2206206994597c13d831ec7" diff --git a/x/erc20/keeper/integration_test.go b/x/erc20/keeper/integration_test.go index b6da30eb98..f13423a476 100644 --- a/x/erc20/keeper/integration_test.go +++ b/x/erc20/keeper/integration_test.go @@ -16,12 +16,12 @@ import ( govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" - "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + "github.com/evmos/evmos/v18/utils" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/testutil" - "github.com/evmos/evmos/v17/x/erc20/types" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/testutil" + "github.com/evmos/evmos/v18/x/erc20/types" ) var _ = Describe("Performing EVM transactions", Ordered, func() { diff --git a/x/erc20/keeper/keeper.go b/x/erc20/keeper/keeper.go index 19fadeaf3e..9f167acbb8 100644 --- a/x/erc20/keeper/keeper.go +++ b/x/erc20/keeper/keeper.go @@ -12,9 +12,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - transferkeeper "github.com/evmos/evmos/v17/x/ibc/transfer/keeper" + transferkeeper "github.com/evmos/evmos/v18/x/ibc/transfer/keeper" - "github.com/evmos/evmos/v17/x/erc20/types" + "github.com/evmos/evmos/v18/x/erc20/types" ) // Keeper of this module maintains collections of erc20. diff --git a/x/erc20/keeper/migrations.go b/x/erc20/keeper/migrations.go index e08cde0259..c860dc8595 100644 --- a/x/erc20/keeper/migrations.go +++ b/x/erc20/keeper/migrations.go @@ -6,8 +6,8 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" - v3 "github.com/evmos/evmos/v17/x/erc20/migrations/v3" - "github.com/evmos/evmos/v17/x/erc20/types" + v3 "github.com/evmos/evmos/v18/x/erc20/migrations/v3" + "github.com/evmos/evmos/v18/x/erc20/types" ) var _ module.MigrationHandler = Migrator{}.Migrate2to3 diff --git a/x/erc20/keeper/migrations_test.go b/x/erc20/keeper/migrations_test.go index ccc18c5e8a..95b0145dc8 100644 --- a/x/erc20/keeper/migrations_test.go +++ b/x/erc20/keeper/migrations_test.go @@ -7,11 +7,11 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/encoding" - erc20keeper "github.com/evmos/evmos/v17/x/erc20/keeper" - v3types "github.com/evmos/evmos/v17/x/erc20/migrations/v3/types" - "github.com/evmos/evmos/v17/x/erc20/types" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/encoding" + erc20keeper "github.com/evmos/evmos/v18/x/erc20/keeper" + v3types "github.com/evmos/evmos/v18/x/erc20/migrations/v3/types" + "github.com/evmos/evmos/v18/x/erc20/types" ) type mockSubspace struct { diff --git a/x/erc20/keeper/mint.go b/x/erc20/keeper/mint.go index 220d026183..f61f095149 100644 --- a/x/erc20/keeper/mint.go +++ b/x/erc20/keeper/mint.go @@ -9,7 +9,7 @@ import ( errortypes "github.com/cosmos/cosmos-sdk/types/errors" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/evmos/evmos/v17/x/erc20/types" + "github.com/evmos/evmos/v18/x/erc20/types" ) // MintingEnabled checks that: diff --git a/x/erc20/keeper/mint_test.go b/x/erc20/keeper/mint_test.go index fc86a9176c..c93995b465 100644 --- a/x/erc20/keeper/mint_test.go +++ b/x/erc20/keeper/mint_test.go @@ -6,8 +6,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - "github.com/evmos/evmos/v17/x/erc20/types" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/x/erc20/types" ) func (suite *KeeperTestSuite) TestMintingEnabled() { diff --git a/x/erc20/keeper/msg_server.go b/x/erc20/keeper/msg_server.go index 9efd1fb7e6..25ed83f3ea 100644 --- a/x/erc20/keeper/msg_server.go +++ b/x/erc20/keeper/msg_server.go @@ -15,8 +15,8 @@ import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v17/contracts" - "github.com/evmos/evmos/v17/x/erc20/types" + "github.com/evmos/evmos/v18/contracts" + "github.com/evmos/evmos/v18/x/erc20/types" ) var _ types.MsgServer = &Keeper{} diff --git a/x/erc20/keeper/msg_server_test.go b/x/erc20/keeper/msg_server_test.go index c00a28132d..1f48da5785 100644 --- a/x/erc20/keeper/msg_server_test.go +++ b/x/erc20/keeper/msg_server_test.go @@ -9,11 +9,11 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v17/x/erc20/keeper" - "github.com/evmos/evmos/v17/x/erc20/types" - erc20mocks "github.com/evmos/evmos/v17/x/erc20/types/mocks" - "github.com/evmos/evmos/v17/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/x/erc20/keeper" + "github.com/evmos/evmos/v18/x/erc20/types" + erc20mocks "github.com/evmos/evmos/v18/x/erc20/types/mocks" + "github.com/evmos/evmos/v18/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" "github.com/stretchr/testify/mock" ) diff --git a/x/erc20/keeper/params.go b/x/erc20/keeper/params.go index 4b7d83c654..91381c4aa8 100644 --- a/x/erc20/keeper/params.go +++ b/x/erc20/keeper/params.go @@ -5,7 +5,7 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/x/erc20/types" + "github.com/evmos/evmos/v18/x/erc20/types" ) var isTrue = []byte("0x01") diff --git a/x/erc20/keeper/params_test.go b/x/erc20/keeper/params_test.go index 290c987970..f819f300e1 100644 --- a/x/erc20/keeper/params_test.go +++ b/x/erc20/keeper/params_test.go @@ -3,7 +3,7 @@ package keeper_test import ( "reflect" - "github.com/evmos/evmos/v17/x/erc20/types" + "github.com/evmos/evmos/v18/x/erc20/types" ) func (suite *KeeperTestSuite) TestParams() { diff --git a/x/erc20/keeper/precompiles.go b/x/erc20/keeper/precompiles.go index 57d75041b2..3ebc8eec3b 100644 --- a/x/erc20/keeper/precompiles.go +++ b/x/erc20/keeper/precompiles.go @@ -7,9 +7,9 @@ import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v17/precompiles/erc20" - "github.com/evmos/evmos/v17/precompiles/werc20" - "github.com/evmos/evmos/v17/x/erc20/types" + "github.com/evmos/evmos/v18/precompiles/erc20" + "github.com/evmos/evmos/v18/precompiles/werc20" + "github.com/evmos/evmos/v18/x/erc20/types" ) // RegisterERC20Extensions registers the ERC20 precompiles with the EVM. diff --git a/x/erc20/keeper/precompiles_test.go b/x/erc20/keeper/precompiles_test.go index dd260f8584..8e8c951f3f 100644 --- a/x/erc20/keeper/precompiles_test.go +++ b/x/erc20/keeper/precompiles_test.go @@ -6,11 +6,11 @@ package keeper_test import ( "slices" - erc20precompile "github.com/evmos/evmos/v17/precompiles/erc20" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - "github.com/evmos/evmos/v17/utils" - "github.com/evmos/evmos/v17/x/erc20/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + erc20precompile "github.com/evmos/evmos/v18/precompiles/erc20" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v18/x/erc20/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) func (suite *KeeperTestSuite) TestRegisterERC20Extensions() { diff --git a/x/erc20/keeper/proposals.go b/x/erc20/keeper/proposals.go index 048b6908ba..8d40be0a27 100644 --- a/x/erc20/keeper/proposals.go +++ b/x/erc20/keeper/proposals.go @@ -10,7 +10,7 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v17/x/erc20/types" + "github.com/evmos/evmos/v18/x/erc20/types" ) // RegisterCoin deploys an erc20 contract and creates the token pair for the diff --git a/x/erc20/keeper/proposals_test.go b/x/erc20/keeper/proposals_test.go index 690941ab83..af2f823bb8 100644 --- a/x/erc20/keeper/proposals_test.go +++ b/x/erc20/keeper/proposals_test.go @@ -8,11 +8,11 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v17/x/erc20/keeper" - "github.com/evmos/evmos/v17/x/erc20/types" - erc20mocks "github.com/evmos/evmos/v17/x/erc20/types/mocks" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" - inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" + "github.com/evmos/evmos/v18/x/erc20/keeper" + "github.com/evmos/evmos/v18/x/erc20/types" + erc20mocks "github.com/evmos/evmos/v18/x/erc20/types/mocks" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" + inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" "github.com/stretchr/testify/mock" ) diff --git a/x/erc20/keeper/setup_test.go b/x/erc20/keeper/setup_test.go index ce41e05a00..a71e34dcf2 100644 --- a/x/erc20/keeper/setup_test.go +++ b/x/erc20/keeper/setup_test.go @@ -17,10 +17,10 @@ import ( ibcgotesting "github.com/cosmos/ibc-go/v7/testing" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v17/app" - ibctesting "github.com/evmos/evmos/v17/ibc/testing" - "github.com/evmos/evmos/v17/x/erc20/types" - evm "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/app" + ibctesting "github.com/evmos/evmos/v18/ibc/testing" + "github.com/evmos/evmos/v18/x/erc20/types" + evm "github.com/evmos/evmos/v18/x/evm/types" "github.com/stretchr/testify/suite" ) diff --git a/x/erc20/keeper/token_pairs.go b/x/erc20/keeper/token_pairs.go index fecee0d02d..10201289b0 100644 --- a/x/erc20/keeper/token_pairs.go +++ b/x/erc20/keeper/token_pairs.go @@ -9,8 +9,8 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v17/utils" - "github.com/evmos/evmos/v17/x/erc20/types" + "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v18/x/erc20/types" ) // GetTokenPairs gets all registered token tokenPairs. diff --git a/x/erc20/keeper/token_pairs_test.go b/x/erc20/keeper/token_pairs_test.go index e941cfe51e..2c59c080ef 100644 --- a/x/erc20/keeper/token_pairs_test.go +++ b/x/erc20/keeper/token_pairs_test.go @@ -4,9 +4,9 @@ import ( "fmt" "github.com/ethereum/go-ethereum/common" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - "github.com/evmos/evmos/v17/x/erc20/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/x/erc20/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) func (suite *KeeperTestSuite) TestGetTokenPairs() { diff --git a/x/erc20/keeper/utils_test.go b/x/erc20/keeper/utils_test.go index b07e3d5c35..2d7af39344 100644 --- a/x/erc20/keeper/utils_test.go +++ b/x/erc20/keeper/utils_test.go @@ -21,20 +21,20 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/contracts" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" - ibctesting "github.com/evmos/evmos/v17/ibc/testing" - "github.com/evmos/evmos/v17/server/config" - "github.com/evmos/evmos/v17/testutil" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - teststypes "github.com/evmos/evmos/v17/types/tests" - "github.com/evmos/evmos/v17/utils" - "github.com/evmos/evmos/v17/x/erc20/types" - "github.com/evmos/evmos/v17/x/evm/statedb" - evm "github.com/evmos/evmos/v17/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" - inflationtypes "github.com/evmos/evmos/v17/x/inflation/v1/types" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/contracts" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + ibctesting "github.com/evmos/evmos/v18/ibc/testing" + "github.com/evmos/evmos/v18/server/config" + "github.com/evmos/evmos/v18/testutil" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + teststypes "github.com/evmos/evmos/v18/types/tests" + "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v18/x/erc20/types" + "github.com/evmos/evmos/v18/x/evm/statedb" + evm "github.com/evmos/evmos/v18/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" + inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" "github.com/stretchr/testify/require" ) @@ -103,7 +103,7 @@ func (suite *KeeperTestSuite) DoSetupTest(t require.TestingT) { valAddr := sdk.ValAddress(suite.address.Bytes()) validator, err := stakingtypes.NewValidator(valAddr, privCons.PubKey(), stakingtypes.Description{}) require.NoError(t, err) - validator = stakingkeeper.TestingUpdateValidator(&suite.app.StakingKeeper, suite.ctx, validator, true) + validator = stakingkeeper.TestingUpdateValidator(suite.app.StakingKeeper.Keeper, suite.ctx, validator, true) err = suite.app.StakingKeeper.Hooks().AfterValidatorCreated(suite.ctx, validator.GetOperator()) require.NoError(t, err) err = suite.app.StakingKeeper.SetValidatorByConsAddr(suite.ctx, validator) diff --git a/x/erc20/migrations/v3/migration.go b/x/erc20/migrations/v3/migration.go index 032ace10a9..80ba8a1fcf 100644 --- a/x/erc20/migrations/v3/migration.go +++ b/x/erc20/migrations/v3/migration.go @@ -6,8 +6,8 @@ package v3 import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - v3types "github.com/evmos/evmos/v17/x/erc20/migrations/v3/types" - "github.com/evmos/evmos/v17/x/erc20/types" + v3types "github.com/evmos/evmos/v18/x/erc20/migrations/v3/types" + "github.com/evmos/evmos/v18/x/erc20/types" ) var isTrue = []byte{0x01} diff --git a/x/erc20/migrations/v3/migration_test.go b/x/erc20/migrations/v3/migration_test.go index 1a279aec8f..7246cba24e 100644 --- a/x/erc20/migrations/v3/migration_test.go +++ b/x/erc20/migrations/v3/migration_test.go @@ -5,17 +5,17 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/encoding" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/encoding" - v3types "github.com/evmos/evmos/v17/x/erc20/migrations/v3/types" + v3types "github.com/evmos/evmos/v18/x/erc20/migrations/v3/types" - "github.com/evmos/evmos/v17/x/erc20/types" + "github.com/evmos/evmos/v18/x/erc20/types" "github.com/stretchr/testify/require" "github.com/cosmos/cosmos-sdk/testutil" sdk "github.com/cosmos/cosmos-sdk/types" - v3 "github.com/evmos/evmos/v17/x/erc20/migrations/v3" + v3 "github.com/evmos/evmos/v18/x/erc20/migrations/v3" ) type mockSubspace struct { diff --git a/x/erc20/migrations/v3/types/genesis.pb.go b/x/erc20/migrations/v3/types/genesis.pb.go index 2ea05adc5e..d063a8fe1e 100644 --- a/x/erc20/migrations/v3/types/genesis.pb.go +++ b/x/erc20/migrations/v3/types/genesis.pb.go @@ -11,7 +11,7 @@ import ( _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" - "github.com/evmos/evmos/v17/x/erc20/types" + "github.com/evmos/evmos/v18/x/erc20/types" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/erc20/migrations/v3/types/params.go b/x/erc20/migrations/v3/types/params.go index 45836cf12e..5bb7d1adb0 100644 --- a/x/erc20/migrations/v3/types/params.go +++ b/x/erc20/migrations/v3/types/params.go @@ -7,7 +7,7 @@ import ( "fmt" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - "github.com/evmos/evmos/v17/x/erc20/types" + "github.com/evmos/evmos/v18/x/erc20/types" ) var _ types.LegacyParams = &V3Params{} diff --git a/x/erc20/module.go b/x/erc20/module.go index 002e6a5302..3669dc7f19 100644 --- a/x/erc20/module.go +++ b/x/erc20/module.go @@ -20,9 +20,9 @@ import ( "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" - "github.com/evmos/evmos/v17/x/erc20/client/cli" - "github.com/evmos/evmos/v17/x/erc20/keeper" - "github.com/evmos/evmos/v17/x/erc20/types" + "github.com/evmos/evmos/v18/x/erc20/client/cli" + "github.com/evmos/evmos/v18/x/erc20/keeper" + "github.com/evmos/evmos/v18/x/erc20/types" ) // consensusVersion defines the current x/erc20 module consensus version. diff --git a/x/erc20/proposal_handler.go b/x/erc20/proposal_handler.go index f772343c2d..b1293dbee0 100644 --- a/x/erc20/proposal_handler.go +++ b/x/erc20/proposal_handler.go @@ -10,8 +10,8 @@ import ( govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v17/x/erc20/keeper" - "github.com/evmos/evmos/v17/x/erc20/types" + "github.com/evmos/evmos/v18/x/erc20/keeper" + "github.com/evmos/evmos/v18/x/erc20/types" ) // NewErc20ProposalHandler creates a governance handler to manage new proposal types. diff --git a/x/erc20/types/erc20.pb.go b/x/erc20/types/erc20.pb.go index 4e545e8e06..12c900eb9b 100644 --- a/x/erc20/types/erc20.pb.go +++ b/x/erc20/types/erc20.pb.go @@ -387,39 +387,39 @@ func init() { func init() { proto.RegisterFile("evmos/erc20/v1/erc20.proto", fileDescriptor_668d5dc537f45142) } var fileDescriptor_668d5dc537f45142 = []byte{ - // 506 bytes of a gzipped FileDescriptorProto + // 505 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x53, 0xcf, 0x6b, 0xd4, 0x40, 0x14, 0xce, 0x74, 0xb7, 0xda, 0x9d, 0xb6, 0x21, 0x0e, 0xbb, 0x10, 0x16, 0x9a, 0x86, 0x15, 0x24, - 0x78, 0x48, 0x9a, 0xf5, 0x20, 0x88, 0x20, 0xdd, 0x6d, 0x84, 0x4a, 0xbb, 0xbb, 0xa4, 0x5b, 0x14, - 0x2f, 0xcb, 0x24, 0x19, 0x62, 0xe8, 0x6e, 0x66, 0x99, 0x19, 0xa3, 0x1e, 0xbc, 0x7b, 0xf4, 0xe2, - 0x5d, 0xd0, 0x3f, 0xa6, 0xc7, 0x1e, 0x3d, 0x89, 0xec, 0x5e, 0xfc, 0x33, 0x24, 0x33, 0x89, 0x58, - 0x8f, 0xed, 0x65, 0x78, 0xdf, 0xf7, 0x7e, 0xf0, 0xde, 0xf7, 0xe6, 0xc1, 0x2e, 0x29, 0x16, 0x94, - 0x7b, 0x84, 0xc5, 0xfd, 0x03, 0xaf, 0xf0, 0x95, 0xe1, 0x2e, 0x19, 0x15, 0x14, 0xe9, 0xd2, 0xe7, - 0x2a, 0xaa, 0xf0, 0xbb, 0x56, 0x4c, 0x79, 0x19, 0x1c, 0xe1, 0xfc, 0xc2, 0x2b, 0xfc, 0x88, 0x08, - 0xec, 0x4b, 0xa0, 0xe2, 0xbb, 0xed, 0x94, 0xa6, 0x54, 0x9a, 0x5e, 0x69, 0x29, 0xb6, 0xf7, 0x1d, - 0xc0, 0xd6, 0x94, 0x5e, 0x90, 0x7c, 0x82, 0x33, 0x86, 0xee, 0xc3, 0x5d, 0x59, 0x6f, 0x86, 0x93, - 0x84, 0x11, 0xce, 0x4d, 0x60, 0x03, 0xa7, 0x15, 0xee, 0x48, 0xf2, 0x50, 0x71, 0xa8, 0x0d, 0x37, - 0x13, 0x92, 0xd3, 0x85, 0xb9, 0x21, 0x9d, 0x0a, 0x20, 0x13, 0xde, 0x25, 0x39, 0x8e, 0xe6, 0x24, - 0x31, 0x1b, 0x36, 0x70, 0xb6, 0xc2, 0x1a, 0xa2, 0xa7, 0x50, 0x8f, 0x69, 0x2e, 0x18, 0x8e, 0xc5, - 0x8c, 0xbe, 0xcb, 0x09, 0x33, 0x9b, 0x36, 0x70, 0xf4, 0x7e, 0xc7, 0xbd, 0x3e, 0x81, 0x3b, 0x2e, - 0x9d, 0xe1, 0x6e, 0x1d, 0x2c, 0xe1, 0x93, 0xe6, 0xef, 0xaf, 0xfb, 0xa0, 0xf7, 0x05, 0xc0, 0x76, - 0x48, 0xd2, 0x8c, 0x0b, 0xc2, 0x86, 0x34, 0xcb, 0x27, 0x8c, 0x2e, 0x29, 0xc7, 0xf3, 0xb2, 0x19, - 0x91, 0x89, 0x39, 0xa9, 0x3a, 0x55, 0x00, 0xd9, 0x70, 0x3b, 0x21, 0x3c, 0x66, 0xd9, 0x52, 0x64, - 0x34, 0xaf, 0x1a, 0xfd, 0x97, 0x42, 0xcf, 0xe0, 0xd6, 0x82, 0x08, 0x9c, 0x60, 0x81, 0xcd, 0x86, - 0xdd, 0x70, 0xb6, 0xfb, 0x7b, 0xae, 0x12, 0xd0, 0x95, 0x9a, 0x55, 0x02, 0xba, 0xa7, 0x55, 0xd0, - 0xa0, 0x79, 0xf9, 0x73, 0x5f, 0x0b, 0xff, 0x26, 0xc9, 0xbe, 0xb4, 0xde, 0x19, 0x34, 0xea, 0x56, - 0xea, 0xc8, 0x6b, 0xa5, 0xc1, 0x0d, 0x4a, 0xf7, 0x3e, 0xc2, 0x4e, 0x3d, 0x6b, 0x10, 0x0e, 0xfb, - 0x07, 0xb7, 0x1e, 0xf6, 0x01, 0xd4, 0xa5, 0xc8, 0xd5, 0x56, 0x09, 0x97, 0x23, 0xb7, 0xc2, 0xff, - 0xd8, 0x6a, 0x26, 0x0e, 0xf7, 0xa6, 0x34, 0x4d, 0xe7, 0x44, 0xfe, 0x8b, 0x21, 0xcd, 0x0b, 0xc2, - 0x78, 0x46, 0x6f, 0xaf, 0x79, 0x99, 0x57, 0x96, 0x94, 0x1f, 0xa4, 0xcc, 0x2b, 0x81, 0x5a, 0xf0, - 0xc3, 0x17, 0x70, 0x53, 0xee, 0x1b, 0x75, 0xe0, 0xbd, 0xf1, 0xcb, 0x51, 0x10, 0xce, 0xce, 0x47, - 0x67, 0x93, 0x60, 0x78, 0xfc, 0xfc, 0x38, 0x38, 0x32, 0x34, 0x64, 0xc0, 0x1d, 0x45, 0x9f, 0x8e, - 0x8f, 0xce, 0x4f, 0x02, 0x03, 0x20, 0x04, 0x75, 0xc5, 0x04, 0xaf, 0xa6, 0x41, 0x38, 0x3a, 0x3c, - 0x31, 0x36, 0xba, 0xcd, 0x4f, 0xdf, 0x2c, 0x6d, 0x30, 0xb8, 0x5c, 0x59, 0xe0, 0x6a, 0x65, 0x81, - 0x5f, 0x2b, 0x0b, 0x7c, 0x5e, 0x5b, 0xda, 0xd5, 0xda, 0xd2, 0x7e, 0xac, 0x2d, 0xed, 0xb5, 0x93, - 0x66, 0xe2, 0xcd, 0xdb, 0xc8, 0x8d, 0xe9, 0xc2, 0xab, 0x4e, 0x4b, 0xbe, 0x85, 0xff, 0xd8, 0x7b, - 0x5f, 0x9d, 0x99, 0xf8, 0xb0, 0x24, 0x3c, 0xba, 0x23, 0xcf, 0xe3, 0xd1, 0x9f, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x91, 0xca, 0xfb, 0x47, 0x82, 0x03, 0x00, 0x00, + 0x78, 0x48, 0x9a, 0xf5, 0x22, 0x22, 0x48, 0x77, 0x1b, 0xa1, 0xd2, 0xee, 0x2e, 0xe9, 0x16, 0xc5, + 0xcb, 0x32, 0x49, 0x86, 0x18, 0xba, 0x9b, 0x59, 0x66, 0xc6, 0xa8, 0x07, 0xef, 0x1e, 0xbd, 0x78, + 0x17, 0xf4, 0x8f, 0xe9, 0xb1, 0x47, 0x4f, 0x22, 0xbb, 0x17, 0xff, 0x0c, 0xc9, 0x4c, 0x22, 0xd6, + 0x63, 0x7b, 0x19, 0xde, 0xf7, 0xbd, 0x1f, 0xbc, 0xf7, 0xbd, 0x79, 0xb0, 0x4b, 0x8a, 0x05, 0xe5, + 0x1e, 0x61, 0x71, 0xff, 0xc0, 0x2b, 0x7c, 0x65, 0xb8, 0x4b, 0x46, 0x05, 0x45, 0xba, 0xf4, 0xb9, + 0x8a, 0x2a, 0xfc, 0xae, 0x15, 0x53, 0x5e, 0x06, 0x47, 0x38, 0xbf, 0xf0, 0x0a, 0x3f, 0x22, 0x02, + 0xfb, 0x12, 0xa8, 0xf8, 0x6e, 0x3b, 0xa5, 0x29, 0x95, 0xa6, 0x57, 0x5a, 0x8a, 0xed, 0x7d, 0x07, + 0xb0, 0x35, 0xa5, 0x17, 0x24, 0x9f, 0xe0, 0x8c, 0xa1, 0xfb, 0x70, 0x57, 0xd6, 0x9b, 0xe1, 0x24, + 0x61, 0x84, 0x73, 0x13, 0xd8, 0xc0, 0x69, 0x85, 0x3b, 0x92, 0x3c, 0x54, 0x1c, 0x6a, 0xc3, 0xcd, + 0x84, 0xe4, 0x74, 0x61, 0x6e, 0x48, 0xa7, 0x02, 0xc8, 0x84, 0x77, 0x49, 0x8e, 0xa3, 0x39, 0x49, + 0xcc, 0x86, 0x0d, 0x9c, 0xad, 0xb0, 0x86, 0xe8, 0x29, 0xd4, 0x63, 0x9a, 0x0b, 0x86, 0x63, 0x31, + 0xa3, 0xef, 0x72, 0xc2, 0xcc, 0xa6, 0x0d, 0x1c, 0xbd, 0xdf, 0x71, 0xaf, 0x4f, 0xe0, 0x8e, 0x4b, + 0x67, 0xb8, 0x5b, 0x07, 0x4b, 0xf8, 0xa4, 0xf9, 0xfb, 0xeb, 0x3e, 0xe8, 0x7d, 0x01, 0xb0, 0x1d, + 0x92, 0x34, 0xe3, 0x82, 0xb0, 0x21, 0xcd, 0xf2, 0x09, 0xa3, 0x4b, 0xca, 0xf1, 0xbc, 0x6c, 0x46, + 0x64, 0x62, 0x4e, 0xaa, 0x4e, 0x15, 0x40, 0x36, 0xdc, 0x4e, 0x08, 0x8f, 0x59, 0xb6, 0x14, 0x19, + 0xcd, 0xab, 0x46, 0xff, 0xa5, 0xd0, 0x33, 0xb8, 0xb5, 0x20, 0x02, 0x27, 0x58, 0x60, 0xb3, 0x61, + 0x37, 0x9c, 0xed, 0xfe, 0x9e, 0xab, 0x04, 0x74, 0xa5, 0x66, 0x95, 0x80, 0xee, 0x69, 0x15, 0x34, + 0x68, 0x5e, 0xfe, 0xdc, 0xd7, 0xc2, 0xbf, 0x49, 0xb2, 0x2f, 0xad, 0x77, 0x06, 0x8d, 0xba, 0x95, + 0x3a, 0xf2, 0x5a, 0x69, 0x70, 0x83, 0xd2, 0xbd, 0x8f, 0xb0, 0x53, 0xcf, 0x1a, 0x84, 0xc3, 0xfe, + 0xc1, 0xad, 0x87, 0x7d, 0x00, 0x75, 0x29, 0x72, 0xb5, 0x55, 0xc2, 0xe5, 0xc8, 0xad, 0xf0, 0x3f, + 0xb6, 0x9a, 0x89, 0xc3, 0xbd, 0x29, 0x4d, 0xd3, 0x39, 0x91, 0xff, 0x62, 0x48, 0xf3, 0x82, 0x30, + 0x9e, 0xd1, 0xdb, 0x6b, 0x5e, 0xe6, 0x95, 0x25, 0xe5, 0x07, 0x29, 0xf3, 0x4a, 0xa0, 0x16, 0xfc, + 0xf0, 0x05, 0xdc, 0x94, 0xfb, 0x46, 0x1d, 0x78, 0x6f, 0xfc, 0x72, 0x14, 0x84, 0xb3, 0xf3, 0xd1, + 0xd9, 0x24, 0x18, 0x1e, 0x3f, 0x3f, 0x0e, 0x8e, 0x0c, 0x0d, 0x19, 0x70, 0x47, 0xd1, 0xa7, 0xe3, + 0xa3, 0xf3, 0x93, 0xc0, 0x00, 0x08, 0x41, 0x5d, 0x31, 0xc1, 0xab, 0x69, 0x10, 0x8e, 0x0e, 0x4f, + 0x8c, 0x8d, 0x6e, 0xf3, 0xd3, 0x37, 0x4b, 0x1b, 0x0c, 0x2e, 0x57, 0x16, 0xb8, 0x5a, 0x59, 0xe0, + 0xd7, 0xca, 0x02, 0x9f, 0xd7, 0x96, 0x76, 0xb5, 0xb6, 0xb4, 0x1f, 0x6b, 0x4b, 0x7b, 0xed, 0xa4, + 0x99, 0x78, 0xf3, 0x36, 0x72, 0x63, 0xba, 0xf0, 0xaa, 0xd3, 0x92, 0x6f, 0xe1, 0x3f, 0xf6, 0xde, + 0x57, 0x67, 0x26, 0x3e, 0x2c, 0x09, 0x8f, 0xee, 0xc8, 0xf3, 0x78, 0xf4, 0x27, 0x00, 0x00, 0xff, + 0xff, 0x19, 0x11, 0xfb, 0x31, 0x82, 0x03, 0x00, 0x00, } func (this *TokenPair) Equal(that interface{}) bool { diff --git a/x/erc20/types/events.pb.go b/x/erc20/types/events.pb.go index bb1211ae4a..9c0e7918ed 100644 --- a/x/erc20/types/events.pb.go +++ b/x/erc20/types/events.pb.go @@ -309,7 +309,7 @@ var fileDescriptor_b8091384ab031e64 = []byte{ // 311 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x92, 0xbf, 0x4b, 0xc3, 0x40, 0x14, 0xc7, 0x7b, 0x6a, 0x8b, 0x1e, 0xfe, 0xa8, 0x41, 0xa4, 0x54, 0x38, 0xa4, 0x2e, 0x75, 0x49, - 0x9a, 0x3a, 0x38, 0xdb, 0xd0, 0x55, 0x24, 0x14, 0x04, 0x17, 0x49, 0x93, 0x47, 0x3c, 0x34, 0xf7, + 0x9a, 0xba, 0xb8, 0xda, 0xd0, 0x55, 0x24, 0x14, 0x04, 0x17, 0x49, 0x93, 0x47, 0x3c, 0x34, 0xf7, 0xca, 0xdd, 0xf5, 0xd0, 0xff, 0xc2, 0xd5, 0xcd, 0x3f, 0xc7, 0xb1, 0xa3, 0xa3, 0x24, 0xff, 0x88, 0xf4, 0x72, 0x2a, 0x88, 0xb8, 0x08, 0x2e, 0x07, 0xdf, 0xf7, 0xe5, 0x7d, 0xf8, 0x70, 0x3c, 0x7a, 0x00, 0xa6, 0x40, 0x15, 0x80, 0x4c, 0x87, 0x83, 0xc0, 0x84, 0x01, 0x18, 0x10, 0x5a, 0xf9, 0x33, @@ -325,8 +325,8 @@ var fileDescriptor_b8091384ab031e64 = []byte{ 0x93, 0x54, 0x7f, 0xf3, 0xdb, 0xf9, 0x98, 0x3b, 0xc5, 0xd1, 0xe8, 0xa5, 0x64, 0x64, 0x51, 0x32, 0xf2, 0x56, 0x32, 0xf2, 0x58, 0xb1, 0xc6, 0xa2, 0x62, 0x8d, 0xd7, 0x8a, 0x35, 0xae, 0xfa, 0x39, 0xd7, 0x37, 0xf3, 0xa9, 0x9f, 0x62, 0x11, 0xb8, 0xcb, 0xb1, 0xaf, 0x09, 0x4f, 0x83, 0x7b, 0x77, - 0x45, 0xfa, 0x61, 0x06, 0x6a, 0xda, 0xb2, 0x27, 0x74, 0xf2, 0x1e, 0x00, 0x00, 0xff, 0xff, 0xa8, - 0x1a, 0x12, 0xe1, 0x61, 0x02, 0x00, 0x00, + 0x45, 0xfa, 0x61, 0x06, 0x6a, 0xda, 0xb2, 0x27, 0x74, 0xf2, 0x1e, 0x00, 0x00, 0xff, 0xff, 0x20, + 0xc1, 0x12, 0x97, 0x61, 0x02, 0x00, 0x00, } func (m *EventRegisterPair) Marshal() (dAtA []byte, err error) { diff --git a/x/erc20/types/evm_test.go b/x/erc20/types/evm_test.go index f8f38419ca..ec90e0a12e 100644 --- a/x/erc20/types/evm_test.go +++ b/x/erc20/types/evm_test.go @@ -3,7 +3,7 @@ package types_test import ( "testing" - "github.com/evmos/evmos/v17/x/erc20/types" + "github.com/evmos/evmos/v18/x/erc20/types" "github.com/stretchr/testify/require" ) diff --git a/x/erc20/types/genesis.pb.go b/x/erc20/types/genesis.pb.go index 93f4160b09..4f0a801dbc 100644 --- a/x/erc20/types/genesis.pb.go +++ b/x/erc20/types/genesis.pb.go @@ -160,8 +160,8 @@ var fileDescriptor_2f4674601b0d6987 = []byte{ 0x05, 0x71, 0x9d, 0x9c, 0x4e, 0x3c, 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, 0x39, 0xc6, 0x09, 0x8f, 0xe5, 0x18, 0x2e, 0x3c, 0x96, 0x63, 0xb8, 0xf1, 0x58, 0x8e, 0x21, 0x4a, 0x23, 0x3d, 0xb3, 0x24, 0xa3, 0x34, 0x49, 0x2f, 0x39, 0x3f, 0x57, 0x1f, 0x1a, 0x8e, 0x60, 0xb2, 0xcc, - 0xd0, 0x5c, 0xbf, 0x02, 0x1a, 0xa6, 0x25, 0x95, 0x05, 0xa9, 0xc5, 0x49, 0x6c, 0xe0, 0xb0, 0x33, - 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x66, 0x5d, 0xeb, 0xf8, 0x9d, 0x01, 0x00, 0x00, + 0xd0, 0x42, 0xbf, 0x02, 0x1a, 0xa6, 0x25, 0x95, 0x05, 0xa9, 0xc5, 0x49, 0x6c, 0xe0, 0xb0, 0x33, + 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0xee, 0x86, 0xeb, 0x8e, 0x9d, 0x01, 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { diff --git a/x/erc20/types/genesis_test.go b/x/erc20/types/genesis_test.go index 2f4eb6e808..d1b00061c3 100644 --- a/x/erc20/types/genesis_test.go +++ b/x/erc20/types/genesis_test.go @@ -3,7 +3,7 @@ package types_test import ( "testing" - "github.com/evmos/evmos/v17/x/erc20/types" + "github.com/evmos/evmos/v18/x/erc20/types" "github.com/stretchr/testify/suite" ) diff --git a/x/erc20/types/interfaces.go b/x/erc20/types/interfaces.go index dd050aa78b..d8ad9f44f5 100644 --- a/x/erc20/types/interfaces.go +++ b/x/erc20/types/interfaces.go @@ -15,8 +15,8 @@ import ( "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v17/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) // AccountKeeper defines the expected interface needed to retrieve account info. diff --git a/x/erc20/types/mocks/EVMKeeper.go b/x/erc20/types/mocks/EVMKeeper.go index 3d53765366..04558942d5 100644 --- a/x/erc20/types/mocks/EVMKeeper.go +++ b/x/erc20/types/mocks/EVMKeeper.go @@ -9,11 +9,11 @@ import ( core "github.com/ethereum/go-ethereum/core" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" mock "github.com/stretchr/testify/mock" - statedb "github.com/evmos/evmos/v17/x/evm/statedb" + statedb "github.com/evmos/evmos/v18/x/evm/statedb" types "github.com/cosmos/cosmos-sdk/types" diff --git a/x/erc20/types/msg_test.go b/x/erc20/types/msg_test.go index 90d9ffdc78..6e4b25fe8e 100644 --- a/x/erc20/types/msg_test.go +++ b/x/erc20/types/msg_test.go @@ -10,8 +10,8 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - "github.com/evmos/evmos/v17/x/erc20/types" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/x/erc20/types" "github.com/ethereum/go-ethereum/common" ) diff --git a/x/erc20/types/params_test.go b/x/erc20/types/params_test.go index 65dcc17e22..0eb487c933 100644 --- a/x/erc20/types/params_test.go +++ b/x/erc20/types/params_test.go @@ -3,7 +3,7 @@ package types_test import ( "testing" - "github.com/evmos/evmos/v17/x/erc20/types" + "github.com/evmos/evmos/v18/x/erc20/types" "github.com/stretchr/testify/suite" ) diff --git a/x/erc20/types/proposal.go b/x/erc20/types/proposal.go index 985bae72ec..b47661f34b 100644 --- a/x/erc20/types/proposal.go +++ b/x/erc20/types/proposal.go @@ -12,7 +12,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" govcdc "github.com/cosmos/cosmos-sdk/x/gov/codec" v1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - evmostypes "github.com/evmos/evmos/v17/types" + evmostypes "github.com/evmos/evmos/v18/types" ) // constants diff --git a/x/erc20/types/proposal_test.go b/x/erc20/types/proposal_test.go index e6aa3581a3..676442e55d 100644 --- a/x/erc20/types/proposal_test.go +++ b/x/erc20/types/proposal_test.go @@ -8,8 +8,8 @@ import ( length "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - "github.com/evmos/evmos/v17/x/erc20/types" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/x/erc20/types" ) type ProposalTestSuite struct { diff --git a/x/erc20/types/query.pb.go b/x/erc20/types/query.pb.go index 34b9a9b5d5..b24e95c9c8 100644 --- a/x/erc20/types/query.pb.go +++ b/x/erc20/types/query.pb.go @@ -326,36 +326,36 @@ var fileDescriptor_fba814bce17cabdf = []byte{ // 502 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x53, 0x4f, 0x8b, 0xd3, 0x40, 0x14, 0xef, 0xec, 0xba, 0x85, 0xbe, 0x82, 0x87, 0xb1, 0xd6, 0x1a, 0x35, 0x2e, 0x29, 0xdb, 0x2d, - 0x8a, 0x33, 0xa6, 0x0a, 0xde, 0x44, 0x7a, 0xd0, 0x83, 0x97, 0x5a, 0x3c, 0x88, 0x17, 0x9d, 0x96, - 0x21, 0x06, 0x6d, 0x26, 0xcd, 0x4c, 0x83, 0x8b, 0x78, 0xd9, 0x8b, 0x78, 0x13, 0xfc, 0x0a, 0x7e, - 0x98, 0x3d, 0x2e, 0x78, 0xf1, 0x24, 0xd2, 0xfa, 0x41, 0x24, 0x33, 0x93, 0x74, 0x13, 0x4b, 0x7b, - 0x29, 0xc9, 0x7b, 0xef, 0xf7, 0xef, 0xbd, 0x14, 0x1c, 0x9e, 0xce, 0x84, 0xa4, 0x3c, 0x99, 0x0e, - 0xee, 0xd3, 0xd4, 0xa7, 0xf3, 0x05, 0x4f, 0x4e, 0x48, 0x9c, 0x08, 0x25, 0xf0, 0x65, 0xdd, 0x23, - 0xba, 0x47, 0x52, 0xdf, 0xb9, 0x33, 0x15, 0x32, 0x1b, 0x9e, 0x30, 0xc9, 0xcd, 0x20, 0x4d, 0xfd, - 0x09, 0x57, 0xcc, 0xa7, 0x31, 0x0b, 0xc2, 0x88, 0xa9, 0x50, 0x44, 0x06, 0xeb, 0x54, 0x79, 0x0d, - 0x89, 0xe9, 0xdd, 0xac, 0xf4, 0x02, 0x1e, 0x71, 0x19, 0x4a, 0xdb, 0x6d, 0x05, 0x22, 0x10, 0xfa, - 0x91, 0x66, 0x4f, 0x39, 0x26, 0x10, 0x22, 0xf8, 0xc0, 0x29, 0x8b, 0x43, 0xca, 0xa2, 0x48, 0x28, - 0x2d, 0x66, 0x31, 0xde, 0x5b, 0x68, 0xbf, 0xc8, 0xfc, 0xbc, 0x14, 0xef, 0x79, 0x34, 0x62, 0x61, - 0x22, 0xc7, 0x7c, 0xbe, 0xe0, 0x52, 0xe1, 0xa7, 0x00, 0x6b, 0x6f, 0x1d, 0x74, 0x88, 0xfa, 0xcd, - 0x41, 0x8f, 0x98, 0x20, 0x24, 0x0b, 0x42, 0x4c, 0x62, 0x1b, 0x84, 0x8c, 0x58, 0xc0, 0x2d, 0x76, - 0x7c, 0x01, 0xe9, 0xfd, 0x40, 0x70, 0xed, 0x3f, 0x09, 0x19, 0x8b, 0x48, 0x72, 0xfc, 0x04, 0x9a, - 0x2a, 0xab, 0xbe, 0x89, 0xb3, 0x72, 0x07, 0x1d, 0xee, 0xf7, 0x9b, 0x83, 0xeb, 0xa4, 0xbc, 0x3d, - 0x52, 0x00, 0x87, 0x97, 0xce, 0x7e, 0xdf, 0xae, 0x8d, 0x41, 0x15, 0x4c, 0xf8, 0x59, 0xc9, 0xe5, - 0x9e, 0x76, 0x79, 0xbc, 0xd3, 0xa5, 0x91, 0x2f, 0xd9, 0xbc, 0x07, 0x57, 0xcb, 0x2e, 0xf3, 0x3d, - 0xb4, 0xe0, 0x40, 0xeb, 0xe9, 0x15, 0x34, 0xc6, 0xe6, 0xc5, 0x7b, 0x55, 0xdd, 0x5b, 0x91, 0xe9, - 0x31, 0xc0, 0x3a, 0x93, 0xdd, 0xdb, 0xce, 0x48, 0x8d, 0x22, 0x92, 0xd7, 0x02, 0xac, 0x99, 0x47, - 0x2c, 0x61, 0xb3, 0xfc, 0x1a, 0xde, 0x73, 0xb8, 0x52, 0xaa, 0x5a, 0xb1, 0x87, 0x50, 0x8f, 0x75, - 0xc5, 0x0a, 0xb5, 0xab, 0x42, 0x66, 0xde, 0xaa, 0xd8, 0xd9, 0xc1, 0xd7, 0x7d, 0x38, 0xd0, 0x6c, - 0xf8, 0x14, 0x01, 0xac, 0xef, 0x82, 0x7b, 0x55, 0xf8, 0xe6, 0x6f, 0xc3, 0x39, 0xde, 0x39, 0x67, - 0xfc, 0x79, 0xdd, 0xd3, 0x9f, 0x7f, 0xbf, 0xef, 0xdd, 0xc2, 0x37, 0x68, 0xe5, 0xcb, 0xbd, 0x70, - 0x76, 0xfc, 0x05, 0x41, 0xa3, 0xc0, 0xe2, 0xa3, 0xed, 0xdc, 0xb9, 0x85, 0xde, 0xae, 0x31, 0xeb, - 0xe0, 0xae, 0x76, 0x70, 0x84, 0xbb, 0x5b, 0x1c, 0xd0, 0x4f, 0xfa, 0xe5, 0x33, 0x9e, 0x43, 0xdd, - 0x2c, 0x0c, 0x7b, 0x1b, 0xe9, 0x4b, 0x37, 0x71, 0xba, 0x5b, 0x67, 0xac, 0xbe, 0xab, 0xf5, 0x3b, - 0xb8, 0x5d, 0xd5, 0x37, 0xb7, 0x18, 0x0e, 0xcf, 0x96, 0x2e, 0x3a, 0x5f, 0xba, 0xe8, 0xcf, 0xd2, - 0x45, 0xdf, 0x56, 0x6e, 0xed, 0x7c, 0xe5, 0xd6, 0x7e, 0xad, 0xdc, 0xda, 0xeb, 0x7e, 0x10, 0xaa, - 0x77, 0x8b, 0x09, 0x99, 0x8a, 0x59, 0x8e, 0xd5, 0xbf, 0xa9, 0xff, 0x88, 0x7e, 0xb4, 0x3c, 0xea, - 0x24, 0xe6, 0x72, 0x52, 0xd7, 0xff, 0xe5, 0x07, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0xae, 0x1d, - 0x0f, 0x2d, 0x93, 0x04, 0x00, 0x00, + 0x8a, 0x33, 0xa6, 0x7a, 0xf0, 0x24, 0xd2, 0x83, 0x1e, 0xbc, 0xd4, 0xe2, 0x41, 0xbc, 0xe8, 0xb4, + 0x0c, 0x31, 0x68, 0x33, 0x69, 0x66, 0x1a, 0x5c, 0xc4, 0xcb, 0x5e, 0xc4, 0x9b, 0xe0, 0x57, 0xf0, + 0xc3, 0xec, 0x71, 0xc1, 0x8b, 0x27, 0x91, 0xd6, 0x0f, 0x22, 0x99, 0x99, 0xa4, 0x9b, 0x58, 0xda, + 0x4b, 0x49, 0xde, 0x7b, 0xbf, 0x7f, 0xef, 0xa5, 0xe0, 0xf0, 0x74, 0x26, 0x24, 0xe5, 0xc9, 0x74, + 0x70, 0x9f, 0xa6, 0x3e, 0x9d, 0x2f, 0x78, 0x72, 0x42, 0xe2, 0x44, 0x28, 0x81, 0x2f, 0xeb, 0x1e, + 0xd1, 0x3d, 0x92, 0xfa, 0xce, 0x9d, 0xa9, 0x90, 0xd9, 0xf0, 0x84, 0x49, 0x6e, 0x06, 0x69, 0xea, + 0x4f, 0xb8, 0x62, 0x3e, 0x8d, 0x59, 0x10, 0x46, 0x4c, 0x85, 0x22, 0x32, 0x58, 0xa7, 0xca, 0x6b, + 0x48, 0x4c, 0xef, 0x66, 0xa5, 0x17, 0xf0, 0x88, 0xcb, 0x50, 0xda, 0x6e, 0x2b, 0x10, 0x81, 0xd0, + 0x8f, 0x34, 0x7b, 0xca, 0x31, 0x81, 0x10, 0xc1, 0x07, 0x4e, 0x59, 0x1c, 0x52, 0x16, 0x45, 0x42, + 0x69, 0x31, 0x8b, 0xf1, 0xde, 0x42, 0xfb, 0x45, 0xe6, 0xe7, 0xa5, 0x78, 0xcf, 0xa3, 0x11, 0x0b, + 0x13, 0x39, 0xe6, 0xf3, 0x05, 0x97, 0x0a, 0x3f, 0x05, 0x58, 0x7b, 0xeb, 0xa0, 0x43, 0xd4, 0x6f, + 0x0e, 0x7a, 0xc4, 0x04, 0x21, 0x59, 0x10, 0x62, 0x12, 0xdb, 0x20, 0x64, 0xc4, 0x02, 0x6e, 0xb1, + 0xe3, 0x0b, 0x48, 0xef, 0x07, 0x82, 0x6b, 0xff, 0x49, 0xc8, 0x58, 0x44, 0x92, 0xe3, 0x27, 0xd0, + 0x54, 0x59, 0xf5, 0x4d, 0x9c, 0x95, 0x3b, 0xe8, 0x70, 0xbf, 0xdf, 0x1c, 0x5c, 0x27, 0xe5, 0xed, + 0x91, 0x02, 0x38, 0xbc, 0x74, 0xf6, 0xfb, 0x76, 0x6d, 0x0c, 0xaa, 0x60, 0xc2, 0xcf, 0x4a, 0x2e, + 0xf7, 0xb4, 0xcb, 0xe3, 0x9d, 0x2e, 0x8d, 0x7c, 0xc9, 0xe6, 0x3d, 0xb8, 0x5a, 0x76, 0x99, 0xef, + 0xa1, 0x05, 0x07, 0x5a, 0x4f, 0xaf, 0xa0, 0x31, 0x36, 0x2f, 0xde, 0xab, 0xea, 0xde, 0x8a, 0x4c, + 0x8f, 0x01, 0xd6, 0x99, 0xec, 0xde, 0x76, 0x46, 0x6a, 0x14, 0x91, 0xbc, 0x16, 0x60, 0xcd, 0x3c, + 0x62, 0x09, 0x9b, 0xe5, 0xd7, 0xf0, 0x9e, 0xc3, 0x95, 0x52, 0xd5, 0x8a, 0x3d, 0x84, 0x7a, 0xac, + 0x2b, 0x56, 0xa8, 0x5d, 0x15, 0x32, 0xf3, 0x56, 0xc5, 0xce, 0x0e, 0xbe, 0xee, 0xc3, 0x81, 0x66, + 0xc3, 0xa7, 0x08, 0x60, 0x7d, 0x17, 0xdc, 0xab, 0xc2, 0x37, 0x7f, 0x1b, 0xce, 0xf1, 0xce, 0x39, + 0xe3, 0xcf, 0xeb, 0x9e, 0xfe, 0xfc, 0xfb, 0x7d, 0xef, 0x16, 0xbe, 0x41, 0x2b, 0x5f, 0xee, 0x85, + 0xb3, 0xe3, 0x2f, 0x08, 0x1a, 0x05, 0x16, 0x1f, 0x6d, 0xe7, 0xce, 0x2d, 0xf4, 0x76, 0x8d, 0x59, + 0x07, 0x77, 0xb5, 0x83, 0x23, 0xdc, 0xdd, 0xe2, 0x80, 0x7e, 0xd2, 0x2f, 0x9f, 0xf1, 0x1c, 0xea, + 0x66, 0x61, 0xd8, 0xdb, 0x48, 0x5f, 0xba, 0x89, 0xd3, 0xdd, 0x3a, 0x63, 0xf5, 0x5d, 0xad, 0xdf, + 0xc1, 0xed, 0xaa, 0xbe, 0xb9, 0xc5, 0x70, 0x78, 0xb6, 0x74, 0xd1, 0xf9, 0xd2, 0x45, 0x7f, 0x96, + 0x2e, 0xfa, 0xb6, 0x72, 0x6b, 0xe7, 0x2b, 0xb7, 0xf6, 0x6b, 0xe5, 0xd6, 0x5e, 0xf7, 0x83, 0x50, + 0xbd, 0x5b, 0x4c, 0xc8, 0x54, 0xcc, 0x72, 0xac, 0xfe, 0x4d, 0xfd, 0x47, 0xf4, 0xa3, 0xe5, 0x51, + 0x27, 0x31, 0x97, 0x93, 0xba, 0xfe, 0x2f, 0x3f, 0xf8, 0x17, 0x00, 0x00, 0xff, 0xff, 0x26, 0xc6, + 0x0f, 0x5b, 0x93, 0x04, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/erc20/types/token_pair.go b/x/erc20/types/token_pair.go index efea4c0061..f066253a51 100644 --- a/x/erc20/types/token_pair.go +++ b/x/erc20/types/token_pair.go @@ -7,7 +7,7 @@ import ( "github.com/cometbft/cometbft/crypto/tmhash" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - evmostypes "github.com/evmos/evmos/v17/types" + evmostypes "github.com/evmos/evmos/v18/types" ) // NewTokenPair returns an instance of TokenPair diff --git a/x/erc20/types/token_pair_test.go b/x/erc20/types/token_pair_test.go index e36bc12a5c..37c935b290 100644 --- a/x/erc20/types/token_pair_test.go +++ b/x/erc20/types/token_pair_test.go @@ -6,8 +6,8 @@ import ( "github.com/cometbft/cometbft/crypto/tmhash" "github.com/ethereum/go-ethereum/common" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - "github.com/evmos/evmos/v17/x/erc20/types" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/x/erc20/types" "github.com/stretchr/testify/suite" ) diff --git a/x/erc20/types/tx.pb.go b/x/erc20/types/tx.pb.go index 71923706b2..dcb0c9aebf 100644 --- a/x/erc20/types/tx.pb.go +++ b/x/erc20/types/tx.pb.go @@ -347,43 +347,43 @@ func init() { func init() { proto.RegisterFile("evmos/erc20/v1/tx.proto", fileDescriptor_f8926fc6cb676914) } var fileDescriptor_f8926fc6cb676914 = []byte{ - // 575 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x93, 0x4d, 0x8b, 0x13, 0x3f, - 0x1c, 0xc7, 0x3b, 0xbb, 0xa5, 0xfc, 0x9b, 0x2e, 0xdd, 0x3f, 0x61, 0xed, 0x13, 0x3a, 0xad, 0x3d, - 0xb8, 0x55, 0x70, 0xb2, 0xed, 0xfa, 0x00, 0xde, 0x6c, 0xf1, 0xe0, 0x61, 0x41, 0x46, 0x04, 0xf1, - 0x52, 0xd2, 0x69, 0x98, 0x0e, 0x3a, 0xc9, 0x90, 0xa4, 0xc3, 0xf6, 0xe2, 0xa1, 0x6f, 0x40, 0xc1, - 0x17, 0xe1, 0xd5, 0x83, 0x2f, 0x62, 0x8f, 0x8b, 0x5e, 0xc4, 0xc3, 0x22, 0xed, 0x82, 0x6f, 0x43, - 0x26, 0x49, 0x1f, 0xa6, 0x76, 0xd7, 0x4b, 0x69, 0xf2, 0xfd, 0xe6, 0xf7, 0xfb, 0x7c, 0xf3, 0xcb, - 0x80, 0x32, 0x89, 0x43, 0x26, 0x10, 0xe1, 0x5e, 0xe7, 0x08, 0xc5, 0x6d, 0x24, 0x4f, 0x9d, 0x88, - 0x33, 0xc9, 0x60, 0x51, 0x09, 0x8e, 0x12, 0x9c, 0xb8, 0x5d, 0xb3, 0x3d, 0x26, 0x12, 0xe7, 0x00, - 0x0b, 0x82, 0xe2, 0xf6, 0x80, 0x48, 0xdc, 0x46, 0x1e, 0x0b, 0xa8, 0xf6, 0xd7, 0xca, 0x46, 0x0f, - 0x85, 0x9f, 0xd4, 0x09, 0x85, 0x6f, 0x84, 0xaa, 0x16, 0xfa, 0x6a, 0x85, 0xf4, 0xc2, 0x48, 0x37, - 0x37, 0x9a, 0xfb, 0x84, 0x12, 0x11, 0x2c, 0xd4, 0x03, 0x9f, 0xf9, 0x4c, 0x9f, 0x4a, 0xfe, 0x2d, - 0xce, 0xf8, 0x8c, 0xf9, 0xef, 0x08, 0xc2, 0x51, 0x80, 0x30, 0xa5, 0x4c, 0x62, 0x19, 0x30, 0x6a, - 0xce, 0x34, 0x27, 0xa0, 0x78, 0x22, 0xfc, 0x1e, 0xa3, 0x31, 0xe1, 0xb2, 0xc7, 0x02, 0x0a, 0x8f, - 0x41, 0x36, 0xa1, 0xac, 0x58, 0x0d, 0xab, 0x55, 0xe8, 0x54, 0x1d, 0x03, 0x90, 0xc4, 0x70, 0x4c, - 0x0c, 0x27, 0x31, 0x76, 0xb3, 0x67, 0x17, 0xf5, 0x8c, 0xab, 0xcc, 0xb0, 0x06, 0xfe, 0xe3, 0xc4, - 0x23, 0x41, 0x4c, 0x78, 0x65, 0xa7, 0x61, 0xb5, 0xf2, 0xee, 0x72, 0x0d, 0x4b, 0x20, 0x27, 0x08, - 0x1d, 0x12, 0x5e, 0xd9, 0x55, 0x8a, 0x59, 0x35, 0x2b, 0xa0, 0x94, 0x6e, 0xed, 0x12, 0x11, 0x31, - 0x2a, 0x48, 0xf3, 0xb3, 0x05, 0xf6, 0x57, 0xd2, 0x33, 0xb7, 0xd7, 0x39, 0x82, 0x77, 0xc1, 0xff, - 0x1e, 0xa3, 0x92, 0x63, 0x4f, 0xf6, 0xf1, 0x70, 0xc8, 0x89, 0x10, 0x0a, 0x31, 0xef, 0xee, 0x2f, - 0xf6, 0x9f, 0xea, 0x6d, 0xf8, 0x10, 0xe4, 0x70, 0xc8, 0xc6, 0x54, 0x6a, 0x94, 0xee, 0xad, 0x04, - 0xf4, 0xe7, 0x45, 0xfd, 0x86, 0x8e, 0x22, 0x86, 0x6f, 0x9d, 0x80, 0xa1, 0x10, 0xcb, 0x91, 0xf3, - 0x9c, 0x4a, 0xd7, 0x98, 0x53, 0x19, 0x76, 0xaf, 0xcc, 0x90, 0x4d, 0x65, 0xa8, 0x82, 0xf2, 0x06, - 0xe8, 0x32, 0xc4, 0x07, 0x1d, 0xe2, 0x55, 0x34, 0xc4, 0x92, 0xbc, 0xc0, 0x1c, 0x87, 0x02, 0x3e, - 0x02, 0x79, 0x3c, 0x96, 0x23, 0xc6, 0x03, 0x39, 0xd1, 0xf4, 0xdd, 0xca, 0xb7, 0xaf, 0xf7, 0x0f, - 0xcc, 0x1d, 0x9b, 0x00, 0x2f, 0x25, 0x0f, 0xa8, 0xef, 0xae, 0xac, 0xf0, 0x01, 0xc8, 0x45, 0xaa, - 0x82, 0x4a, 0x54, 0xe8, 0x94, 0x9c, 0xf4, 0x63, 0x73, 0x74, 0x7d, 0x33, 0x12, 0xe3, 0x7d, 0x52, - 0x9c, 0xfe, 0xfe, 0x72, 0x6f, 0x55, 0xc5, 0xc0, 0xae, 0x03, 0x2d, 0x60, 0x3b, 0x97, 0x3b, 0x60, - 0xf7, 0x44, 0xf8, 0xf0, 0x3d, 0x28, 0xac, 0xbf, 0x05, 0x7b, 0xb3, 0x4f, 0x7a, 0x60, 0xb5, 0x3b, - 0xd7, 0xeb, 0xcb, 0xbb, 0x38, 0x9c, 0x7e, 0xbf, 0xfc, 0xb4, 0x73, 0x1b, 0xd6, 0xd1, 0x5f, 0x5f, - 0x0f, 0xf2, 0xb4, 0xbf, 0xaf, 0xde, 0xd1, 0xd4, 0x02, 0x7b, 0xa9, 0xb1, 0xd7, 0xaf, 0xee, 0xa0, - 0x0c, 0xb5, 0xc3, 0x7f, 0x18, 0x96, 0x0c, 0x2d, 0xc5, 0xd0, 0x84, 0x8d, 0x6b, 0x18, 0xd4, 0x1e, - 0x7c, 0x0d, 0xf6, 0x52, 0x53, 0xdb, 0xc6, 0xb0, 0x6e, 0xd8, 0xca, 0xb0, 0xed, 0x9a, 0xbb, 0xdd, - 0xb3, 0x99, 0x6d, 0x9d, 0xcf, 0x6c, 0xeb, 0xd7, 0xcc, 0xb6, 0x3e, 0xce, 0xed, 0xcc, 0xf9, 0xdc, - 0xce, 0xfc, 0x98, 0xdb, 0x99, 0x37, 0x2d, 0x3f, 0x90, 0xa3, 0xf1, 0xc0, 0xf1, 0x58, 0xb8, 0xe0, - 0x53, 0xbf, 0x71, 0xfb, 0x31, 0x3a, 0x35, 0xac, 0x72, 0x12, 0x11, 0x31, 0xc8, 0xa9, 0x0f, 0xf7, - 0xf8, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf3, 0x19, 0x86, 0x6a, 0x89, 0x04, 0x00, 0x00, + // 574 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x93, 0x4f, 0x8b, 0x13, 0x3f, + 0x18, 0xc7, 0x3b, 0xbb, 0xa5, 0xfc, 0x9a, 0x2e, 0xdd, 0x1f, 0x61, 0xed, 0x3f, 0x74, 0x5a, 0x7b, + 0x70, 0xab, 0xe0, 0x64, 0xdb, 0x55, 0x11, 0x6f, 0xb6, 0x78, 0xf0, 0xb0, 0x20, 0x23, 0x82, 0x78, + 0x29, 0xe9, 0x34, 0x4c, 0x07, 0x9d, 0x64, 0x48, 0xd2, 0x61, 0x7b, 0xf1, 0xd0, 0x37, 0xa0, 0xe0, + 0x8b, 0xf0, 0xea, 0xc1, 0x17, 0xb1, 0xc7, 0x45, 0x2f, 0xe2, 0x61, 0x91, 0x76, 0xc1, 0xb7, 0x21, + 0x93, 0xa4, 0x7f, 0xa6, 0x76, 0xd7, 0x4b, 0x69, 0xf2, 0xfd, 0xe6, 0x79, 0x3e, 0xdf, 0x3c, 0x19, + 0x50, 0x26, 0x71, 0xc8, 0x04, 0x22, 0xdc, 0xeb, 0x1c, 0xa1, 0xb8, 0x8d, 0xe4, 0xa9, 0x13, 0x71, + 0x26, 0x19, 0x2c, 0x2a, 0xc1, 0x51, 0x82, 0x13, 0xb7, 0x6b, 0xb6, 0xc7, 0x44, 0xe2, 0x1c, 0x60, + 0x41, 0x50, 0xdc, 0x1e, 0x10, 0x89, 0xdb, 0xc8, 0x63, 0x01, 0xd5, 0xfe, 0x5a, 0xd9, 0xe8, 0xa1, + 0xf0, 0x93, 0x3a, 0xa1, 0xf0, 0x8d, 0x50, 0xd5, 0x42, 0x5f, 0xad, 0x90, 0x5e, 0x18, 0xe9, 0xe6, + 0x46, 0x73, 0x9f, 0x50, 0x22, 0x82, 0x85, 0x7a, 0xe0, 0x33, 0x9f, 0xe9, 0x53, 0xc9, 0xbf, 0xc5, + 0x19, 0x9f, 0x31, 0xff, 0x1d, 0x41, 0x38, 0x0a, 0x10, 0xa6, 0x94, 0x49, 0x2c, 0x03, 0x46, 0xcd, + 0x99, 0xe6, 0x04, 0x14, 0x4f, 0x84, 0xdf, 0x63, 0x34, 0x26, 0x5c, 0xf6, 0x58, 0x40, 0xe1, 0x31, + 0xc8, 0x26, 0x94, 0x15, 0xab, 0x61, 0xb5, 0x0a, 0x9d, 0xaa, 0x63, 0x00, 0x92, 0x18, 0x8e, 0x89, + 0xe1, 0x24, 0xc6, 0x6e, 0xf6, 0xec, 0xa2, 0x9e, 0x71, 0x95, 0x19, 0xd6, 0xc0, 0x7f, 0x9c, 0x78, + 0x24, 0x88, 0x09, 0xaf, 0xec, 0x34, 0xac, 0x56, 0xde, 0x5d, 0xae, 0x61, 0x09, 0xe4, 0x04, 0xa1, + 0x43, 0xc2, 0x2b, 0xbb, 0x4a, 0x31, 0xab, 0x66, 0x05, 0x94, 0xd2, 0xad, 0x5d, 0x22, 0x22, 0x46, + 0x05, 0x69, 0x7e, 0xb6, 0xc0, 0xfe, 0x4a, 0x7a, 0xe6, 0xf6, 0x3a, 0x47, 0xf0, 0x2e, 0xf8, 0xdf, + 0x63, 0x54, 0x72, 0xec, 0xc9, 0x3e, 0x1e, 0x0e, 0x39, 0x11, 0x42, 0x21, 0xe6, 0xdd, 0xfd, 0xc5, + 0xfe, 0x53, 0xbd, 0x0d, 0x1f, 0x82, 0x1c, 0x0e, 0xd9, 0x98, 0x4a, 0x8d, 0xd2, 0xbd, 0x95, 0x80, + 0xfe, 0xbc, 0xa8, 0xdf, 0xd0, 0x51, 0xc4, 0xf0, 0xad, 0x13, 0x30, 0x14, 0x62, 0x39, 0x72, 0x9e, + 0x53, 0xe9, 0x1a, 0x73, 0x2a, 0xc3, 0xee, 0x95, 0x19, 0xb2, 0xa9, 0x0c, 0x55, 0x50, 0xde, 0x00, + 0x5d, 0x86, 0xf8, 0xa0, 0x43, 0xbc, 0x8a, 0x86, 0x58, 0x92, 0x17, 0x98, 0xe3, 0x50, 0xc0, 0x47, + 0x20, 0x8f, 0xc7, 0x72, 0xc4, 0x78, 0x20, 0x27, 0x9a, 0xbe, 0x5b, 0xf9, 0xf6, 0xf5, 0xfe, 0x81, + 0xb9, 0x63, 0x13, 0xe0, 0xa5, 0xe4, 0x01, 0xf5, 0xdd, 0x95, 0x15, 0x3e, 0x00, 0xb9, 0x48, 0x55, + 0x50, 0x89, 0x0a, 0x9d, 0x92, 0x93, 0x7e, 0x6c, 0x8e, 0xae, 0x6f, 0x46, 0x62, 0xbc, 0x4f, 0x8a, + 0xd3, 0xdf, 0x5f, 0xee, 0xad, 0xaa, 0x18, 0xd8, 0x75, 0xa0, 0x05, 0x6c, 0xe7, 0x72, 0x07, 0xec, + 0x9e, 0x08, 0x1f, 0xbe, 0x07, 0x85, 0xf5, 0xb7, 0x60, 0x6f, 0xf6, 0x49, 0x0f, 0xac, 0x76, 0xe7, + 0x7a, 0x7d, 0x79, 0x17, 0x87, 0xd3, 0xef, 0x97, 0x9f, 0x76, 0x6e, 0xc3, 0x3a, 0xfa, 0xeb, 0xeb, + 0x41, 0x9e, 0xf6, 0xf7, 0xd5, 0x3b, 0x9a, 0x5a, 0x60, 0x2f, 0x35, 0xf6, 0xfa, 0xd5, 0x1d, 0x94, + 0xa1, 0x76, 0xf8, 0x0f, 0xc3, 0x92, 0xa1, 0xa5, 0x18, 0x9a, 0xb0, 0x71, 0x0d, 0x83, 0xda, 0x83, + 0xaf, 0xc1, 0x5e, 0x6a, 0x6a, 0xdb, 0x18, 0xd6, 0x0d, 0x5b, 0x19, 0xb6, 0x5d, 0x73, 0xb7, 0x7b, + 0x36, 0xb3, 0xad, 0xf3, 0x99, 0x6d, 0xfd, 0x9a, 0xd9, 0xd6, 0xc7, 0xb9, 0x9d, 0x39, 0x9f, 0xdb, + 0x99, 0x1f, 0x73, 0x3b, 0xf3, 0xa6, 0xe5, 0x07, 0x72, 0x34, 0x1e, 0x38, 0x1e, 0x0b, 0x17, 0x7c, + 0xea, 0x37, 0x6e, 0x3f, 0x46, 0xa7, 0x86, 0x55, 0x4e, 0x22, 0x22, 0x06, 0x39, 0xf5, 0xe1, 0x1e, + 0xff, 0x09, 0x00, 0x00, 0xff, 0xff, 0x7b, 0xc2, 0x86, 0x1c, 0x89, 0x04, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/erc20/types/utils_test.go b/x/erc20/types/utils_test.go index 6e216f6281..2cf7904ee5 100644 --- a/x/erc20/types/utils_test.go +++ b/x/erc20/types/utils_test.go @@ -6,7 +6,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/evmos/evmos/v17/x/erc20/types" + "github.com/evmos/evmos/v18/x/erc20/types" "github.com/stretchr/testify/require" ) diff --git a/x/evm/ante/ctx_test.go b/x/evm/ante/ctx_test.go index f3730bd3fd..a0d6b766d7 100644 --- a/x/evm/ante/ctx_test.go +++ b/x/evm/ante/ctx_test.go @@ -5,8 +5,8 @@ package ante_test import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" - "github.com/evmos/evmos/v17/testutil/integration/evmos/network" - evmante "github.com/evmos/evmos/v17/x/evm/ante" + "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + evmante "github.com/evmos/evmos/v18/x/evm/ante" ) func (suite *EvmAnteTestSuite) TestBuildEvmExecutionCtx() { diff --git a/x/evm/client/cli/query.go b/x/evm/client/cli/query.go index 668cfe9668..8c2ace1bf0 100644 --- a/x/evm/client/cli/query.go +++ b/x/evm/client/cli/query.go @@ -3,13 +3,13 @@ package cli import ( - rpctypes "github.com/evmos/evmos/v17/rpc/types" + rpctypes "github.com/evmos/evmos/v18/rpc/types" "github.com/spf13/cobra" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/x/evm/types" ) // GetQueryCmd returns the parent command for all x/bank CLi query commands. diff --git a/x/evm/client/cli/tx.go b/x/evm/client/cli/tx.go index f1616ed6a7..331698d6fe 100644 --- a/x/evm/client/cli/tx.go +++ b/x/evm/client/cli/tx.go @@ -14,8 +14,8 @@ import ( "github.com/pkg/errors" "github.com/spf13/cobra" - rpctypes "github.com/evmos/evmos/v17/rpc/types" - "github.com/evmos/evmos/v17/x/evm/types" + rpctypes "github.com/evmos/evmos/v18/rpc/types" + "github.com/evmos/evmos/v18/x/evm/types" ) // GetTxCmd returns the transaction commands for this module diff --git a/x/evm/genesis.go b/x/evm/genesis.go index 64076d3d86..713993c842 100644 --- a/x/evm/genesis.go +++ b/x/evm/genesis.go @@ -12,9 +12,9 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - evmostypes "github.com/evmos/evmos/v17/types" - "github.com/evmos/evmos/v17/x/evm/keeper" - "github.com/evmos/evmos/v17/x/evm/types" + evmostypes "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v18/x/evm/keeper" + "github.com/evmos/evmos/v18/x/evm/types" ) // InitGenesis initializes genesis state based on exported genesis diff --git a/x/evm/genesis_test.go b/x/evm/genesis_test.go index 8d54d3610f..4f4a937701 100644 --- a/x/evm/genesis_test.go +++ b/x/evm/genesis_test.go @@ -6,13 +6,13 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" - testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" - testnetwork "github.com/evmos/evmos/v17/testutil/integration/evmos/network" - evmostypes "github.com/evmos/evmos/v17/types" - "github.com/evmos/evmos/v17/x/evm" - "github.com/evmos/evmos/v17/x/evm/statedb" - "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" + testnetwork "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + evmostypes "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v18/x/evm" + "github.com/evmos/evmos/v18/x/evm/statedb" + "github.com/evmos/evmos/v18/x/evm/types" "github.com/stretchr/testify/require" ) diff --git a/x/evm/keeper/abci_test.go b/x/evm/keeper/abci_test.go index e32b629ce0..0594248feb 100644 --- a/x/evm/keeper/abci_test.go +++ b/x/evm/keeper/abci_test.go @@ -2,7 +2,7 @@ package keeper_test import ( "github.com/cometbft/cometbft/abci/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) func (suite *KeeperTestSuite) TestEndBlock() { diff --git a/x/evm/keeper/benchmark_test.go b/x/evm/keeper/benchmark_test.go index 18f69b5c49..402422c2b0 100644 --- a/x/evm/keeper/benchmark_test.go +++ b/x/evm/keeper/benchmark_test.go @@ -12,8 +12,8 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - evmostypes "github.com/evmos/evmos/v17/types" - "github.com/evmos/evmos/v17/x/evm/types" + evmostypes "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v18/x/evm/types" ) func SetupContract(b *testing.B) (*KeeperTestSuite, common.Address) { diff --git a/x/evm/keeper/config.go b/x/evm/keeper/config.go index 3ef6c094a2..3cc18ed6e0 100644 --- a/x/evm/keeper/config.go +++ b/x/evm/keeper/config.go @@ -10,8 +10,8 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v17/x/evm/statedb" - "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/x/evm/statedb" + "github.com/evmos/evmos/v18/x/evm/types" ) // EVMConfig creates the EVMConfig based on current state diff --git a/x/evm/keeper/fees.go b/x/evm/keeper/fees.go index 961928f21f..3dd05a280f 100644 --- a/x/evm/keeper/fees.go +++ b/x/evm/keeper/fees.go @@ -15,7 +15,7 @@ import ( errortypes "github.com/cosmos/cosmos-sdk/types/errors" authante "github.com/cosmos/cosmos-sdk/x/auth/ante" - "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/x/evm/types" ) // CheckSenderBalance validates that the tx cost value is positive and that the diff --git a/x/evm/keeper/fees_test.go b/x/evm/keeper/fees_test.go index cc9139e6e8..ebdd9ffd94 100644 --- a/x/evm/keeper/fees_test.go +++ b/x/evm/keeper/fees_test.go @@ -8,8 +8,8 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" ethparams "github.com/ethereum/go-ethereum/params" - "github.com/evmos/evmos/v17/x/evm/keeper" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/x/evm/keeper" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) func (suite *KeeperTestSuite) TestCheckSenderBalance() { diff --git a/x/evm/keeper/gas.go b/x/evm/keeper/gas.go index 1537234687..adb8c6028d 100644 --- a/x/evm/keeper/gas.go +++ b/x/evm/keeper/gas.go @@ -14,7 +14,7 @@ import ( errortypes "github.com/cosmos/cosmos-sdk/types/errors" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/x/evm/types" ) // GetEthIntrinsicGas returns the intrinsic gas cost for the transaction diff --git a/x/evm/keeper/grpc_query.go b/x/evm/keeper/grpc_query.go index 6107592dff..4508c27f98 100644 --- a/x/evm/keeper/grpc_query.go +++ b/x/evm/keeper/grpc_query.go @@ -27,10 +27,10 @@ import ( "github.com/ethereum/go-ethereum/core/vm" ethparams "github.com/ethereum/go-ethereum/params" - evmostypes "github.com/evmos/evmos/v17/types" - evmante "github.com/evmos/evmos/v17/x/evm/ante" - "github.com/evmos/evmos/v17/x/evm/statedb" - "github.com/evmos/evmos/v17/x/evm/types" + evmostypes "github.com/evmos/evmos/v18/types" + evmante "github.com/evmos/evmos/v18/x/evm/ante" + "github.com/evmos/evmos/v18/x/evm/statedb" + "github.com/evmos/evmos/v18/x/evm/types" ) var _ types.QueryServer = Keeper{} diff --git a/x/evm/keeper/grpc_query_test.go b/x/evm/keeper/grpc_query_test.go index 0f8cd6e8ac..a7eb028960 100644 --- a/x/evm/keeper/grpc_query_test.go +++ b/x/evm/keeper/grpc_query_test.go @@ -15,10 +15,10 @@ import ( ethlogger "github.com/ethereum/go-ethereum/eth/tracers/logger" ethparams "github.com/ethereum/go-ethereum/params" - "github.com/evmos/evmos/v17/server/config" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - "github.com/evmos/evmos/v17/x/evm/statedb" - "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/server/config" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/x/evm/statedb" + "github.com/evmos/evmos/v18/x/evm/types" ) // Not valid Ethereum address diff --git a/x/evm/keeper/integration_test.go b/x/evm/keeper/integration_test.go index b935754885..220eb41962 100644 --- a/x/evm/keeper/integration_test.go +++ b/x/evm/keeper/integration_test.go @@ -13,19 +13,19 @@ import ( . "github.com/onsi/gomega" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v17/contracts" - "github.com/evmos/evmos/v17/precompiles/staking" + "github.com/evmos/evmos/v18/contracts" + "github.com/evmos/evmos/v18/precompiles/staking" - "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v17/testutil/integration/evmos/network" - integrationutils "github.com/evmos/evmos/v17/testutil/integration/evmos/utils" + "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + integrationutils "github.com/evmos/evmos/v18/testutil/integration/evmos/utils" abcitypes "github.com/cometbft/cometbft/abci/types" sdktypes "github.com/cosmos/cosmos-sdk/types" ethtypes "github.com/ethereum/go-ethereum/core/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) type IntegrationTestSuite struct { diff --git a/x/evm/keeper/keeper.go b/x/evm/keeper/keeper.go index 9e105dee65..d349d03c10 100644 --- a/x/evm/keeper/keeper.go +++ b/x/evm/keeper/keeper.go @@ -19,9 +19,9 @@ import ( "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/params" - evmostypes "github.com/evmos/evmos/v17/types" - "github.com/evmos/evmos/v17/x/evm/statedb" - "github.com/evmos/evmos/v17/x/evm/types" + evmostypes "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v18/x/evm/statedb" + "github.com/evmos/evmos/v18/x/evm/types" ) // Keeper grants access to the EVM module state and implements the go-ethereum StateDB interface. diff --git a/x/evm/keeper/keeper_test.go b/x/evm/keeper/keeper_test.go index dcb21be105..4742ca82c2 100644 --- a/x/evm/keeper/keeper_test.go +++ b/x/evm/keeper/keeper_test.go @@ -6,10 +6,10 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - evmostypes "github.com/evmos/evmos/v17/types" - "github.com/evmos/evmos/v17/x/evm/keeper" - "github.com/evmos/evmos/v17/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmostypes "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v18/x/evm/keeper" + "github.com/evmos/evmos/v18/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" "github.com/ethereum/go-ethereum/common" diff --git a/x/evm/keeper/migrations.go b/x/evm/keeper/migrations.go index e99d7d38d9..eccc0f62de 100644 --- a/x/evm/keeper/migrations.go +++ b/x/evm/keeper/migrations.go @@ -4,10 +4,10 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" - v4 "github.com/evmos/evmos/v17/x/evm/migrations/v4" - v5 "github.com/evmos/evmos/v17/x/evm/migrations/v5" - v6 "github.com/evmos/evmos/v17/x/evm/migrations/v6" - "github.com/evmos/evmos/v17/x/evm/types" + v4 "github.com/evmos/evmos/v18/x/evm/migrations/v4" + v5 "github.com/evmos/evmos/v18/x/evm/migrations/v5" + v6 "github.com/evmos/evmos/v18/x/evm/migrations/v6" + "github.com/evmos/evmos/v18/x/evm/types" ) // Migrator is a struct for handling in-place store migrations. diff --git a/x/evm/keeper/migrations_test.go b/x/evm/keeper/migrations_test.go index 9a1aa1f9e0..5ca1e59572 100644 --- a/x/evm/keeper/migrations_test.go +++ b/x/evm/keeper/migrations_test.go @@ -2,8 +2,8 @@ package keeper_test import ( sdk "github.com/cosmos/cosmos-sdk/types" - evmkeeper "github.com/evmos/evmos/v17/x/evm/keeper" - "github.com/evmos/evmos/v17/x/evm/types" + evmkeeper "github.com/evmos/evmos/v18/x/evm/keeper" + "github.com/evmos/evmos/v18/x/evm/types" ) type mockSubspace struct { diff --git a/x/evm/keeper/msg_server.go b/x/evm/keeper/msg_server.go index d11a0c6aaa..f85acbce10 100644 --- a/x/evm/keeper/msg_server.go +++ b/x/evm/keeper/msg_server.go @@ -19,7 +19,7 @@ import ( "github.com/cosmos/cosmos-sdk/telemetry" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/x/evm/types" ) var _ types.MsgServer = &Keeper{} diff --git a/x/evm/keeper/msg_server_test.go b/x/evm/keeper/msg_server_test.go index e2ed9c8a6d..bf89409a71 100644 --- a/x/evm/keeper/msg_server_test.go +++ b/x/evm/keeper/msg_server_test.go @@ -8,8 +8,8 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/params" - "github.com/evmos/evmos/v17/x/evm/statedb" - "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/x/evm/statedb" + "github.com/evmos/evmos/v18/x/evm/types" ) func (suite *KeeperTestSuite) TestEthereumTx() { diff --git a/x/evm/keeper/params.go b/x/evm/keeper/params.go index fef452395e..ed6de820cc 100644 --- a/x/evm/keeper/params.go +++ b/x/evm/keeper/params.go @@ -8,7 +8,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/x/evm/types" ) // GetParams returns the total set of evm parameters. diff --git a/x/evm/keeper/params_benchmark_test.go b/x/evm/keeper/params_benchmark_test.go index 38e692d3ac..1e9a7f7705 100644 --- a/x/evm/keeper/params_benchmark_test.go +++ b/x/evm/keeper/params_benchmark_test.go @@ -3,7 +3,7 @@ package keeper_test import ( "testing" - "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/x/evm/types" ) func BenchmarkSetParams(b *testing.B) { diff --git a/x/evm/keeper/params_test.go b/x/evm/keeper/params_test.go index ae8564b1f0..17a01fbe4a 100644 --- a/x/evm/keeper/params_test.go +++ b/x/evm/keeper/params_test.go @@ -3,7 +3,7 @@ package keeper_test import ( "reflect" - "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/x/evm/types" ) func (suite *KeeperTestSuite) TestParams() { diff --git a/x/evm/keeper/precompiles.go b/x/evm/keeper/precompiles.go index 7f7e1255b1..415f2f06fe 100644 --- a/x/evm/keeper/precompiles.go +++ b/x/evm/keeper/precompiles.go @@ -9,9 +9,9 @@ import ( "maps" "sort" - "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v18/utils" - "github.com/evmos/evmos/v17/precompiles/bech32" + "github.com/evmos/evmos/v18/precompiles/bech32" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" @@ -20,20 +20,20 @@ import ( authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" distributionkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" - stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" channelkeeper "github.com/cosmos/ibc-go/v7/modules/core/04-channel/keeper" - bankprecompile "github.com/evmos/evmos/v17/precompiles/bank" - distprecompile "github.com/evmos/evmos/v17/precompiles/distribution" - erc20precompile "github.com/evmos/evmos/v17/precompiles/erc20" - ics20precompile "github.com/evmos/evmos/v17/precompiles/ics20" - osmosisoutpost "github.com/evmos/evmos/v17/precompiles/outposts/osmosis" - strideoutpost "github.com/evmos/evmos/v17/precompiles/outposts/stride" - "github.com/evmos/evmos/v17/precompiles/p256" - stakingprecompile "github.com/evmos/evmos/v17/precompiles/staking" - vestingprecompile "github.com/evmos/evmos/v17/precompiles/vesting" - erc20Keeper "github.com/evmos/evmos/v17/x/erc20/keeper" - transferkeeper "github.com/evmos/evmos/v17/x/ibc/transfer/keeper" - vestingkeeper "github.com/evmos/evmos/v17/x/vesting/keeper" + bankprecompile "github.com/evmos/evmos/v18/precompiles/bank" + distprecompile "github.com/evmos/evmos/v18/precompiles/distribution" + erc20precompile "github.com/evmos/evmos/v18/precompiles/erc20" + ics20precompile "github.com/evmos/evmos/v18/precompiles/ics20" + osmosisoutpost "github.com/evmos/evmos/v18/precompiles/outposts/osmosis" + strideoutpost "github.com/evmos/evmos/v18/precompiles/outposts/stride" + "github.com/evmos/evmos/v18/precompiles/p256" + stakingprecompile "github.com/evmos/evmos/v18/precompiles/staking" + vestingprecompile "github.com/evmos/evmos/v18/precompiles/vesting" + erc20Keeper "github.com/evmos/evmos/v18/x/erc20/keeper" + transferkeeper "github.com/evmos/evmos/v18/x/ibc/transfer/keeper" + stakingkeeper "github.com/evmos/evmos/v18/x/staking/keeper" + vestingkeeper "github.com/evmos/evmos/v18/x/vesting/keeper" ) // AvailablePrecompiles returns the list of all available precompiled contracts. diff --git a/x/evm/keeper/precompiles_test.go b/x/evm/keeper/precompiles_test.go index a7ffd24a60..f70fbf7d45 100644 --- a/x/evm/keeper/precompiles_test.go +++ b/x/evm/keeper/precompiles_test.go @@ -6,8 +6,8 @@ package keeper_test import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - stakingprecompile "github.com/evmos/evmos/v17/precompiles/staking" - "github.com/evmos/evmos/v17/x/evm/types" + stakingprecompile "github.com/evmos/evmos/v18/precompiles/staking" + "github.com/evmos/evmos/v18/x/evm/types" ) func (suite *KeeperTestSuite) TestIsAvailablePrecompile() { diff --git a/x/evm/keeper/setup_test.go b/x/evm/keeper/setup_test.go index d46adf9038..12d1ec82ce 100644 --- a/x/evm/keeper/setup_test.go +++ b/x/evm/keeper/setup_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v18/utils" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" @@ -29,14 +29,14 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/params" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" - "github.com/evmos/evmos/v17/encoding" - "github.com/evmos/evmos/v17/testutil" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - evmostypes "github.com/evmos/evmos/v17/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + "github.com/evmos/evmos/v18/encoding" + "github.com/evmos/evmos/v18/testutil" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + evmostypes "github.com/evmos/evmos/v18/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" ) diff --git a/x/evm/keeper/state_transition.go b/x/evm/keeper/state_transition.go index f875f9ee57..7722810c90 100644 --- a/x/evm/keeper/state_transition.go +++ b/x/evm/keeper/state_transition.go @@ -12,9 +12,9 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" - evmostypes "github.com/evmos/evmos/v17/types" - "github.com/evmos/evmos/v17/x/evm/statedb" - "github.com/evmos/evmos/v17/x/evm/types" + evmostypes "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v18/x/evm/statedb" + "github.com/evmos/evmos/v18/x/evm/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" diff --git a/x/evm/keeper/state_transition_benchmark_test.go b/x/evm/keeper/state_transition_benchmark_test.go index fb13a79477..356d1abdd2 100644 --- a/x/evm/keeper/state_transition_benchmark_test.go +++ b/x/evm/keeper/state_transition_benchmark_test.go @@ -11,7 +11,7 @@ import ( "github.com/ethereum/go-ethereum/core" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/params" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" "github.com/stretchr/testify/require" ) diff --git a/x/evm/keeper/state_transition_test.go b/x/evm/keeper/state_transition_test.go index d622e8e02b..6f21ccc60b 100644 --- a/x/evm/keeper/state_transition_test.go +++ b/x/evm/keeper/state_transition_test.go @@ -17,10 +17,10 @@ import ( "github.com/ethereum/go-ethereum/core" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/params" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - "github.com/evmos/evmos/v17/x/evm/keeper" - "github.com/evmos/evmos/v17/x/evm/statedb" - "github.com/evmos/evmos/v17/x/evm/types" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/x/evm/keeper" + "github.com/evmos/evmos/v18/x/evm/statedb" + "github.com/evmos/evmos/v18/x/evm/types" ) func (suite *KeeperTestSuite) TestGetHashFn() { diff --git a/x/evm/keeper/statedb.go b/x/evm/keeper/statedb.go index 7d8cf7aff3..24a33bf1bf 100644 --- a/x/evm/keeper/statedb.go +++ b/x/evm/keeper/statedb.go @@ -13,9 +13,9 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - evmostypes "github.com/evmos/evmos/v17/types" - "github.com/evmos/evmos/v17/x/evm/statedb" - "github.com/evmos/evmos/v17/x/evm/types" + evmostypes "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v18/x/evm/statedb" + "github.com/evmos/evmos/v18/x/evm/types" ) var _ statedb.Keeper = &Keeper{} diff --git a/x/evm/keeper/statedb_benchmark_test.go b/x/evm/keeper/statedb_benchmark_test.go index 658336832c..626d198f18 100644 --- a/x/evm/keeper/statedb_benchmark_test.go +++ b/x/evm/keeper/statedb_benchmark_test.go @@ -10,7 +10,7 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - utiltx "github.com/evmos/evmos/v17/testutil/tx" + utiltx "github.com/evmos/evmos/v18/testutil/tx" ) func BenchmarkCreateAccountNew(b *testing.B) { diff --git a/x/evm/keeper/statedb_test.go b/x/evm/keeper/statedb_test.go index e85f757e09..165e793c74 100644 --- a/x/evm/keeper/statedb_test.go +++ b/x/evm/keeper/statedb_test.go @@ -16,10 +16,10 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - "github.com/evmos/evmos/v17/x/evm/statedb" - "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/x/evm/statedb" + "github.com/evmos/evmos/v18/x/evm/types" ) func (suite *KeeperTestSuite) TestCreateAccount() { diff --git a/x/evm/keeper/utils_test.go b/x/evm/keeper/utils_test.go index fe0d8a1ca6..897f61d8be 100644 --- a/x/evm/keeper/utils_test.go +++ b/x/evm/keeper/utils_test.go @@ -11,10 +11,10 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v17/server/config" - "github.com/evmos/evmos/v17/testutil" - "github.com/evmos/evmos/v17/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/server/config" + "github.com/evmos/evmos/v18/testutil" + "github.com/evmos/evmos/v18/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" "github.com/stretchr/testify/require" ) diff --git a/x/evm/migrations/v4/migrate.go b/x/evm/migrations/v4/migrate.go index ee47752a33..cf6425a8a1 100644 --- a/x/evm/migrations/v4/migrate.go +++ b/x/evm/migrations/v4/migrate.go @@ -7,8 +7,8 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - v4types "github.com/evmos/evmos/v17/x/evm/migrations/v4/types" - "github.com/evmos/evmos/v17/x/evm/types" + v4types "github.com/evmos/evmos/v18/x/evm/migrations/v4/types" + "github.com/evmos/evmos/v18/x/evm/types" ) // MigrateStore migrates the x/evm module state from the consensus version 3 to diff --git a/x/evm/migrations/v4/migrate_test.go b/x/evm/migrations/v4/migrate_test.go index d175af01d3..0bc11d9fb9 100644 --- a/x/evm/migrations/v4/migrate_test.go +++ b/x/evm/migrations/v4/migrate_test.go @@ -20,14 +20,14 @@ import ( "github.com/stretchr/testify/require" - "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/x/evm/types" "github.com/cosmos/cosmos-sdk/testutil" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/encoding" - v4 "github.com/evmos/evmos/v17/x/evm/migrations/v4" - v4types "github.com/evmos/evmos/v17/x/evm/migrations/v4/types" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/encoding" + v4 "github.com/evmos/evmos/v18/x/evm/migrations/v4" + v4types "github.com/evmos/evmos/v18/x/evm/migrations/v4/types" ) type mockSubspace struct { diff --git a/x/evm/migrations/v5/migrate.go b/x/evm/migrations/v5/migrate.go index 842408848c..79891e390d 100644 --- a/x/evm/migrations/v5/migrate.go +++ b/x/evm/migrations/v5/migrate.go @@ -6,9 +6,9 @@ import ( "github.com/cosmos/cosmos-sdk/codec" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/x/evm/types" - v5types "github.com/evmos/evmos/v17/x/evm/migrations/v5/types" + v5types "github.com/evmos/evmos/v18/x/evm/migrations/v5/types" ) // MigrateStore migrates the x/evm module state from the consensus version 4 to diff --git a/x/evm/migrations/v5/migrate_test.go b/x/evm/migrations/v5/migrate_test.go index 3953f05ef4..0ddbf72909 100644 --- a/x/evm/migrations/v5/migrate_test.go +++ b/x/evm/migrations/v5/migrate_test.go @@ -22,11 +22,11 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/encoding" - v5 "github.com/evmos/evmos/v17/x/evm/migrations/v5" - v5types "github.com/evmos/evmos/v17/x/evm/migrations/v5/types" - "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/encoding" + v5 "github.com/evmos/evmos/v18/x/evm/migrations/v5" + v5types "github.com/evmos/evmos/v18/x/evm/migrations/v5/types" + "github.com/evmos/evmos/v18/x/evm/types" ) // AvailableExtraEIPs define the list of all EIPs that can be enabled by the diff --git a/x/evm/migrations/v6/migrate.go b/x/evm/migrations/v6/migrate.go index c6570e9cf9..b27b37a5f0 100644 --- a/x/evm/migrations/v6/migrate.go +++ b/x/evm/migrations/v6/migrate.go @@ -6,10 +6,10 @@ import ( "github.com/cosmos/cosmos-sdk/codec" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/utils" - "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v18/x/evm/types" - v5types "github.com/evmos/evmos/v17/x/evm/migrations/v6/types" + v5types "github.com/evmos/evmos/v18/x/evm/migrations/v6/types" ) // MigrateStore migrates the x/evm module state from the consensus version 5 to diff --git a/x/evm/migrations/v6/migrate_test.go b/x/evm/migrations/v6/migrate_test.go index a9e1803c28..a0b3bd56a0 100644 --- a/x/evm/migrations/v6/migrate_test.go +++ b/x/evm/migrations/v6/migrate_test.go @@ -10,11 +10,11 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/encoding" - v6 "github.com/evmos/evmos/v17/x/evm/migrations/v6" - v5types "github.com/evmos/evmos/v17/x/evm/migrations/v6/types" - "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/encoding" + v6 "github.com/evmos/evmos/v18/x/evm/migrations/v6" + v5types "github.com/evmos/evmos/v18/x/evm/migrations/v6/types" + "github.com/evmos/evmos/v18/x/evm/types" ) func TestMigrate(t *testing.T) { diff --git a/x/evm/module.go b/x/evm/module.go index 0b38258ff8..bd10d4bf6f 100644 --- a/x/evm/module.go +++ b/x/evm/module.go @@ -20,9 +20,9 @@ import ( "github.com/cosmos/cosmos-sdk/types/module" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" - "github.com/evmos/evmos/v17/x/evm/client/cli" - "github.com/evmos/evmos/v17/x/evm/keeper" - "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/x/evm/client/cli" + "github.com/evmos/evmos/v18/x/evm/keeper" + "github.com/evmos/evmos/v18/x/evm/types" ) // consensusVersion defines the current x/evm module consensus version. diff --git a/x/evm/statedb/config.go b/x/evm/statedb/config.go index d87333b915..ceb62bd1ca 100644 --- a/x/evm/statedb/config.go +++ b/x/evm/statedb/config.go @@ -7,7 +7,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/params" - "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/x/evm/types" ) // TxConfig encapulates the readonly information of current tx for `StateDB`. diff --git a/x/evm/statedb/integration_test.go b/x/evm/statedb/integration_test.go index 1990e3fccb..79311e5c9f 100644 --- a/x/evm/statedb/integration_test.go +++ b/x/evm/statedb/integration_test.go @@ -9,13 +9,13 @@ import ( "cosmossdk.io/math" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v17/contracts" - stakingprecompile "github.com/evmos/evmos/v17/precompiles/staking" - testfactory "github.com/evmos/evmos/v17/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v17/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v17/testutil/integration/evmos/keyring" - testnetwork "github.com/evmos/evmos/v17/testutil/integration/evmos/network" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/contracts" + stakingprecompile "github.com/evmos/evmos/v18/precompiles/staking" + testfactory "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" + testnetwork "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" //nolint:revive // okay to use dot imports for Ginkgo . "github.com/onsi/ginkgo/v2" diff --git a/x/evm/statedb/mock_test.go b/x/evm/statedb/mock_test.go index 6a7d951d69..adb9934b70 100644 --- a/x/evm/statedb/mock_test.go +++ b/x/evm/statedb/mock_test.go @@ -9,7 +9,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v17/x/evm/statedb" + "github.com/evmos/evmos/v18/x/evm/statedb" ) var ( diff --git a/x/evm/statedb/statedb_test.go b/x/evm/statedb/statedb_test.go index 4a57bdaf29..3892097a3c 100644 --- a/x/evm/statedb/statedb_test.go +++ b/x/evm/statedb/statedb_test.go @@ -9,7 +9,7 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v17/x/evm/statedb" + "github.com/evmos/evmos/v18/x/evm/statedb" "github.com/stretchr/testify/suite" ) diff --git a/x/evm/types/access_list_test.go b/x/evm/types/access_list_test.go index 6ebdb631d0..d5cf8ecfe6 100644 --- a/x/evm/types/access_list_test.go +++ b/x/evm/types/access_list_test.go @@ -3,7 +3,7 @@ package types_test import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/x/evm/types" ) func (suite *TxDataTestSuite) TestTestNewAccessList() { diff --git a/x/evm/types/access_list_tx.go b/x/evm/types/access_list_tx.go index d2fc2ac1f1..c98059dafd 100644 --- a/x/evm/types/access_list_tx.go +++ b/x/evm/types/access_list_tx.go @@ -12,7 +12,7 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v18/types" ) func newAccessListTx(tx *ethtypes.Transaction) (*AccessListTx, error) { diff --git a/x/evm/types/access_list_tx_test.go b/x/evm/types/access_list_tx_test.go index 33f5a28181..bfe445cfdf 100644 --- a/x/evm/types/access_list_tx_test.go +++ b/x/evm/types/access_list_tx_test.go @@ -4,7 +4,7 @@ import ( "math/big" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/x/evm/types" ) func (suite *TxDataTestSuite) TestAccessListTxCopy() { diff --git a/x/evm/types/dynamic_fee_tx.go b/x/evm/types/dynamic_fee_tx.go index fbaf559338..a1809ef407 100644 --- a/x/evm/types/dynamic_fee_tx.go +++ b/x/evm/types/dynamic_fee_tx.go @@ -12,7 +12,7 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v18/types" ) func NewDynamicFeeTx(tx *ethtypes.Transaction) (*DynamicFeeTx, error) { diff --git a/x/evm/types/dynamic_fee_tx_test.go b/x/evm/types/dynamic_fee_tx_test.go index a8ce336766..05991b7b4b 100644 --- a/x/evm/types/dynamic_fee_tx_test.go +++ b/x/evm/types/dynamic_fee_tx_test.go @@ -10,8 +10,8 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - "github.com/evmos/evmos/v17/x/evm/types" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/x/evm/types" "github.com/stretchr/testify/suite" ) diff --git a/x/evm/types/events.pb.go b/x/evm/types/events.pb.go index 4b8e656615..cd013e945c 100644 --- a/x/evm/types/events.pb.go +++ b/x/evm/types/events.pb.go @@ -291,7 +291,7 @@ var fileDescriptor_432e0d592184bde3 = []byte{ // 365 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x44, 0x51, 0x4d, 0x6b, 0xdb, 0x40, 0x14, 0xb4, 0x6a, 0x5b, 0xae, 0xb7, 0x2d, 0x2d, 0x4b, 0x69, 0x55, 0x68, 0x85, 0x11, 0x34, 0xc9, - 0x49, 0xc2, 0xe4, 0x90, 0x6b, 0x30, 0x38, 0xe4, 0x90, 0x5c, 0x82, 0x42, 0x20, 0x17, 0x21, 0x5b, + 0x49, 0xc2, 0xe4, 0x92, 0x63, 0x30, 0x38, 0xe4, 0x90, 0x5c, 0x82, 0x42, 0x20, 0x17, 0x21, 0x5b, 0x2f, 0x5a, 0x11, 0xad, 0x56, 0x68, 0x9f, 0xc4, 0xfa, 0x5f, 0xe4, 0x67, 0x05, 0x72, 0xf1, 0x31, 0xc7, 0x60, 0xff, 0x91, 0xb0, 0xab, 0x4d, 0x72, 0x59, 0x76, 0x66, 0xde, 0x07, 0xf3, 0x86, 0xfc, 0x03, 0x64, 0xd0, 0xf0, 0xa2, 0xc2, 0x08, 0x3a, 0x1e, 0x75, 0xf3, 0x08, 0x3a, 0xa8, 0x50, 0x86, @@ -311,7 +311,7 @@ var fileDescriptor_432e0d592184bde3 = []byte{ 0x7d, 0xdc, 0xf9, 0xce, 0x76, 0xe7, 0x3b, 0x2f, 0x3b, 0xdf, 0x79, 0xd8, 0xfb, 0x83, 0xed, 0xde, 0x1f, 0x3c, 0xef, 0xfd, 0xc1, 0xed, 0x41, 0x5e, 0x20, 0x6b, 0x57, 0xe1, 0x5a, 0x70, 0x1d, 0xa1, 0x90, 0xf6, 0xed, 0xe6, 0x27, 0x91, 0x32, 0xa1, 0xea, 0xbd, 0x72, 0xe5, 0x9a, 0x44, 0x8f, 0x5f, - 0x03, 0x00, 0x00, 0xff, 0xff, 0x06, 0x1f, 0xdf, 0x86, 0xf2, 0x01, 0x00, 0x00, + 0x03, 0x00, 0x00, 0xff, 0xff, 0x28, 0x90, 0xca, 0xca, 0xf2, 0x01, 0x00, 0x00, } func (m *EventEthereumTx) Marshal() (dAtA []byte, err error) { diff --git a/x/evm/types/evm.pb.go b/x/evm/types/evm.pb.go index 61694a80be..cf94077eb6 100644 --- a/x/evm/types/evm.pb.go +++ b/x/evm/types/evm.pb.go @@ -711,108 +711,108 @@ var fileDescriptor_d21ecc92c8c8583e = []byte{ // 1661 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x57, 0xcd, 0x4f, 0x23, 0xc9, 0x15, 0x07, 0x6c, 0xa0, 0x5d, 0x36, 0x76, 0x53, 0x18, 0xd6, 0x3b, 0xa3, 0xd0, 0xa4, 0x0f, 0x11, - 0x91, 0x76, 0x61, 0x60, 0x42, 0x66, 0xb4, 0xab, 0x7c, 0x4c, 0xcf, 0xb0, 0x09, 0x64, 0x76, 0x83, - 0x0a, 0x36, 0x51, 0xa2, 0x44, 0xad, 0x72, 0x77, 0x6d, 0xbb, 0x97, 0xee, 0x2e, 0xab, 0xaa, 0xda, - 0x63, 0xe7, 0x2f, 0x88, 0x94, 0x4b, 0xfe, 0x84, 0xfd, 0x73, 0x56, 0x39, 0xed, 0x31, 0xca, 0xa1, + 0x91, 0x76, 0x61, 0x60, 0x42, 0x16, 0xed, 0x2a, 0x1f, 0xd3, 0x33, 0x6c, 0x02, 0x99, 0xdd, 0xa0, + 0x1a, 0x36, 0x51, 0xa2, 0x44, 0xad, 0x72, 0x77, 0x6d, 0xbb, 0x97, 0xee, 0x2e, 0xab, 0xaa, 0xda, + 0x63, 0xe7, 0x2f, 0x88, 0x94, 0x4b, 0xfe, 0x84, 0xfd, 0x73, 0x56, 0x39, 0xcd, 0x31, 0xca, 0xa1, 0x15, 0x31, 0x37, 0x94, 0x13, 0xf7, 0x48, 0x51, 0x7d, 0xb8, 0xfd, 0x01, 0x61, 0x7d, 0x81, 0xfa, 0xbd, 0x8f, 0xdf, 0xab, 0xf7, 0xea, 0xb5, 0x5f, 0x15, 0x78, 0x42, 0x44, 0x8f, 0xb0, 0x34, 0xce, 0xc4, 0x21, 0x19, 0xa4, 0x87, 0x83, 0x23, 0xf9, 0xef, 0xa0, 0xcf, 0xa8, 0xa0, 0xd0, 0x2e, 0x75, 0x07, 0x52, 0x38, 0x38, 0x7a, 0xd2, 0x8e, 0x68, 0x44, 0x95, 0xf2, 0x50, 0xae, 0xb4, 0x9d, 0xfb, - 0x9f, 0x0a, 0x58, 0xbb, 0xc0, 0x0c, 0xa7, 0x1c, 0x1e, 0x81, 0x1a, 0x19, 0xa4, 0x7e, 0x48, 0x32, + 0x9f, 0x0a, 0x58, 0xbb, 0xc4, 0x0c, 0xa7, 0x1c, 0x1e, 0x81, 0x1a, 0x19, 0xa4, 0x7e, 0x48, 0x32, 0x9a, 0x76, 0x96, 0xf7, 0x96, 0xf7, 0x6b, 0x5e, 0xfb, 0xae, 0x70, 0xec, 0x11, 0x4e, 0x93, 0x4f, - 0xdc, 0x52, 0xe5, 0x22, 0x8b, 0x0c, 0xd2, 0x37, 0x72, 0x09, 0x7f, 0x06, 0x36, 0x48, 0x86, 0xbb, + 0xdd, 0x52, 0xe5, 0x22, 0x8b, 0x0c, 0xd2, 0x57, 0x72, 0x09, 0x7f, 0x06, 0x36, 0x48, 0x86, 0xbb, 0x09, 0xf1, 0x03, 0x46, 0xb0, 0x20, 0x9d, 0x95, 0xbd, 0xe5, 0x7d, 0xcb, 0xeb, 0xdc, 0x15, 0x4e, - 0xdb, 0xb8, 0x4d, 0xab, 0x5d, 0xd4, 0xd0, 0xf8, 0xb5, 0x82, 0xf0, 0x05, 0xa8, 0x8f, 0xf5, 0x38, - 0x49, 0x3a, 0x15, 0xe5, 0xbc, 0x73, 0x57, 0x38, 0x70, 0xd6, 0x19, 0x27, 0x89, 0x8b, 0x80, 0x71, - 0xc5, 0x49, 0x02, 0x5f, 0x01, 0x40, 0x86, 0x82, 0x61, 0x9f, 0xc4, 0x7d, 0xde, 0xa9, 0xee, 0x55, - 0xf6, 0x2b, 0x9e, 0x7b, 0x53, 0x38, 0xb5, 0x53, 0x29, 0x3d, 0x3d, 0xbb, 0xe0, 0x77, 0x85, 0xb3, - 0x69, 0x48, 0x4a, 0x43, 0x17, 0xd5, 0x14, 0x38, 0x8d, 0xfb, 0x1c, 0xfe, 0x19, 0x34, 0x82, 0x1e, - 0x8e, 0x33, 0x3f, 0xa0, 0xd9, 0x57, 0x71, 0xd4, 0x59, 0xdd, 0x5b, 0xde, 0xaf, 0x1f, 0xff, 0xe0, - 0x60, 0xbe, 0x6e, 0x07, 0xaf, 0xa5, 0xd5, 0x6b, 0x65, 0xe4, 0x3d, 0xfd, 0xb6, 0x70, 0x96, 0xee, - 0x0a, 0x67, 0x4b, 0x53, 0x4f, 0x13, 0xb8, 0xa8, 0x1e, 0x4c, 0x2c, 0xe1, 0x31, 0xd8, 0xc6, 0x49, - 0x42, 0xdf, 0xf9, 0x79, 0x26, 0x0b, 0x4d, 0x02, 0x41, 0x42, 0x5f, 0x0c, 0x79, 0x67, 0x4d, 0x26, - 0x89, 0xb6, 0x94, 0xf2, 0xcb, 0x89, 0xee, 0x6a, 0xc8, 0xe1, 0xc7, 0x00, 0xe2, 0x40, 0xc4, 0x03, - 0xe2, 0xf7, 0x19, 0x09, 0x68, 0xda, 0x8f, 0x13, 0xc2, 0x3b, 0xeb, 0x7b, 0x95, 0xfd, 0x1a, 0xda, - 0xd4, 0x9a, 0x8b, 0x89, 0x02, 0x1e, 0x83, 0x86, 0x3c, 0x94, 0xa0, 0x87, 0xb3, 0x8c, 0x24, 0xbc, - 0x63, 0x49, 0x43, 0xaf, 0x75, 0x53, 0x38, 0xf5, 0xd3, 0xdf, 0x7d, 0xfe, 0xda, 0x88, 0x51, 0x9d, - 0x0c, 0xd2, 0x31, 0x70, 0xff, 0xdb, 0x04, 0xf5, 0xa9, 0x84, 0xe0, 0x9f, 0x40, 0xab, 0x47, 0x53, - 0xc2, 0x05, 0xc1, 0xa1, 0xdf, 0x4d, 0x68, 0x70, 0x6d, 0x4e, 0xfe, 0xf9, 0xbf, 0x0a, 0x67, 0x3b, - 0xa0, 0x3c, 0xa5, 0x9c, 0x87, 0xd7, 0x07, 0x31, 0x3d, 0x4c, 0xb1, 0xe8, 0x1d, 0x9c, 0x65, 0xe2, - 0xae, 0x70, 0x76, 0x74, 0xfa, 0x73, 0x9e, 0x2e, 0x6a, 0x96, 0x12, 0x4f, 0x0a, 0x60, 0x0f, 0x34, - 0x43, 0x4c, 0xfd, 0xaf, 0x28, 0xbb, 0x36, 0xe4, 0x2b, 0x8a, 0xdc, 0xfb, 0xbf, 0xe4, 0x37, 0x85, - 0xd3, 0x78, 0xf3, 0xea, 0xb7, 0x9f, 0x51, 0x76, 0xad, 0x28, 0xee, 0x0a, 0x67, 0x5b, 0x07, 0x9b, - 0x25, 0x72, 0x51, 0x23, 0xc4, 0xb4, 0x34, 0x83, 0xbf, 0x07, 0x76, 0x69, 0xc0, 0xf3, 0x7e, 0x9f, - 0x32, 0x61, 0xda, 0xe9, 0xe3, 0x9b, 0xc2, 0x69, 0x1a, 0xca, 0x4b, 0xad, 0xb9, 0x2b, 0x9c, 0x0f, - 0xe6, 0x48, 0x8d, 0x8f, 0x8b, 0x9a, 0x86, 0xd6, 0x98, 0xc2, 0x2e, 0x68, 0x90, 0xb8, 0x7f, 0x74, - 0xf2, 0xcc, 0x24, 0x50, 0x55, 0x09, 0xfc, 0xe2, 0xb1, 0x04, 0xea, 0xa7, 0x67, 0x17, 0x47, 0x27, - 0xcf, 0xc6, 0xfb, 0x37, 0xbd, 0x32, 0xcd, 0xe2, 0xa2, 0xba, 0x86, 0x7a, 0xf3, 0x67, 0xc0, 0x40, - 0xbf, 0x87, 0x79, 0x4f, 0x75, 0x62, 0xcd, 0xdb, 0xbf, 0x29, 0x1c, 0xa0, 0x99, 0x7e, 0x8d, 0x79, - 0x6f, 0x52, 0xf5, 0xee, 0xe8, 0x2f, 0x38, 0x13, 0x71, 0x9e, 0x8e, 0xb9, 0x80, 0x76, 0x96, 0x56, - 0xe5, 0x76, 0x4f, 0xcc, 0x76, 0xd7, 0x16, 0xdd, 0xee, 0xc9, 0x43, 0xdb, 0x3d, 0x99, 0xdd, 0xae, - 0xb6, 0x29, 0x63, 0xbc, 0x34, 0x31, 0xd6, 0x17, 0x8d, 0xf1, 0xf2, 0xa1, 0x18, 0x2f, 0x67, 0x63, - 0x68, 0x1b, 0xd9, 0x97, 0x73, 0x79, 0x76, 0xac, 0x85, 0xfb, 0xf2, 0x5e, 0x85, 0x9a, 0xa5, 0x44, - 0xb3, 0x5f, 0x83, 0x76, 0x40, 0x33, 0x2e, 0xa4, 0x2c, 0xa3, 0xfd, 0x84, 0x98, 0x10, 0x35, 0x15, - 0xe2, 0xe5, 0x63, 0x21, 0x9e, 0x9a, 0x2f, 0xff, 0x01, 0x77, 0x17, 0x6d, 0xcd, 0x8a, 0x75, 0x30, - 0x1f, 0xd8, 0x7d, 0x22, 0x08, 0xe3, 0xdd, 0x9c, 0x45, 0x26, 0x10, 0x50, 0x81, 0x7e, 0xf2, 0x58, - 0x20, 0xd3, 0xa1, 0xf3, 0xae, 0x2e, 0x6a, 0x4d, 0x44, 0x3a, 0xc0, 0x1f, 0x40, 0x33, 0x96, 0x51, - 0xbb, 0x79, 0x62, 0xe8, 0xeb, 0x8a, 0xfe, 0xf8, 0x31, 0x7a, 0xf3, 0x55, 0xcd, 0x3a, 0xba, 0x68, - 0x63, 0x2c, 0xd0, 0xd4, 0x21, 0x80, 0x69, 0x1e, 0x33, 0x3f, 0x4a, 0x70, 0x10, 0x13, 0x66, 0xe8, - 0x1b, 0x8a, 0xfe, 0xa7, 0x8f, 0xd1, 0x7f, 0xa8, 0xe9, 0xef, 0x3b, 0xbb, 0xc8, 0x96, 0xc2, 0x5f, - 0x69, 0x99, 0x8e, 0x72, 0x09, 0x1a, 0x5d, 0xc2, 0x92, 0x38, 0x33, 0xfc, 0x1b, 0x8a, 0xff, 0xd9, - 0x63, 0xfc, 0xa6, 0x83, 0xa6, 0xdd, 0x5c, 0x54, 0xd7, 0xb0, 0x24, 0x4d, 0x68, 0x16, 0xd2, 0x31, - 0xe9, 0xe6, 0xc2, 0xa4, 0xd3, 0x6e, 0x2e, 0xaa, 0x6b, 0xa8, 0x49, 0x23, 0xb0, 0x85, 0x19, 0xa3, - 0xef, 0xe6, 0x0a, 0x02, 0x15, 0xf7, 0x8b, 0xc7, 0xb8, 0x9f, 0x68, 0xee, 0x07, 0xbc, 0x5d, 0xb4, + 0xdb, 0xb8, 0x4d, 0xab, 0x5d, 0xd4, 0xd0, 0xf8, 0xa5, 0x82, 0xf0, 0x13, 0x50, 0x1f, 0xeb, 0x71, + 0x92, 0x74, 0x2a, 0xca, 0x79, 0xe7, 0xae, 0x70, 0xe0, 0xac, 0x33, 0x4e, 0x12, 0x17, 0x01, 0xe3, + 0x8a, 0x93, 0x04, 0xbe, 0x00, 0x80, 0x0c, 0x05, 0xc3, 0x3e, 0x89, 0xfb, 0xbc, 0x53, 0xdd, 0xab, + 0xec, 0x57, 0x3c, 0xf7, 0xa6, 0x70, 0x6a, 0x67, 0x52, 0x7a, 0x76, 0x7e, 0xc9, 0xef, 0x0a, 0x67, + 0xd3, 0x90, 0x94, 0x86, 0x2e, 0xaa, 0x29, 0x70, 0x16, 0xf7, 0x39, 0xfc, 0x33, 0x68, 0x04, 0x3d, + 0x1c, 0x67, 0x7e, 0x40, 0xb3, 0xaf, 0xe3, 0xa8, 0xb3, 0xba, 0xb7, 0xbc, 0x5f, 0x3f, 0xfe, 0xc1, + 0xc1, 0x7c, 0xdd, 0x0e, 0x5e, 0x4a, 0xab, 0x97, 0xca, 0xc8, 0x7b, 0xfa, 0x5d, 0xe1, 0x2c, 0xdd, + 0x15, 0xce, 0x96, 0xa6, 0x9e, 0x26, 0x70, 0x51, 0x3d, 0x98, 0x58, 0xc2, 0x63, 0xb0, 0x8d, 0x93, + 0x84, 0xbe, 0xf5, 0xf3, 0x4c, 0x16, 0x9a, 0x04, 0x82, 0x84, 0xbe, 0x18, 0xf2, 0xce, 0x9a, 0x4c, + 0x12, 0x6d, 0x29, 0xe5, 0x57, 0x13, 0xdd, 0xd5, 0x90, 0xc3, 0x8f, 0x01, 0xc4, 0x81, 0x88, 0x07, + 0xc4, 0xef, 0x33, 0x12, 0xd0, 0xb4, 0x1f, 0x27, 0x84, 0x77, 0xd6, 0xf7, 0x2a, 0xfb, 0x35, 0xb4, + 0xa9, 0x35, 0x97, 0x13, 0x05, 0x3c, 0x06, 0x0d, 0x79, 0x28, 0x41, 0x0f, 0x67, 0x19, 0x49, 0x78, + 0xc7, 0x92, 0x86, 0x5e, 0xeb, 0xa6, 0x70, 0xea, 0x67, 0xbf, 0xfb, 0xe2, 0xa5, 0x11, 0xa3, 0x3a, + 0x19, 0xa4, 0x63, 0xe0, 0xfe, 0xb7, 0x09, 0xea, 0x53, 0x09, 0xc1, 0x3f, 0x81, 0x56, 0x8f, 0xa6, + 0x84, 0x0b, 0x82, 0x43, 0xbf, 0x9b, 0xd0, 0xe0, 0xda, 0x9c, 0xfc, 0xf3, 0x7f, 0x15, 0xce, 0x76, + 0x40, 0x79, 0x4a, 0x39, 0x0f, 0xaf, 0x0f, 0x62, 0x7a, 0x98, 0x62, 0xd1, 0x3b, 0x38, 0xcf, 0xc4, + 0x5d, 0xe1, 0xec, 0xe8, 0xf4, 0xe7, 0x3c, 0x5d, 0xd4, 0x2c, 0x25, 0x9e, 0x14, 0xc0, 0x1e, 0x68, + 0x86, 0x98, 0xfa, 0x5f, 0x53, 0x76, 0x6d, 0xc8, 0x57, 0x14, 0xb9, 0xf7, 0x7f, 0xc9, 0x6f, 0x0a, + 0xa7, 0xf1, 0xea, 0xc5, 0x6f, 0x3f, 0xa7, 0xec, 0x5a, 0x51, 0xdc, 0x15, 0xce, 0xb6, 0x0e, 0x36, + 0x4b, 0xe4, 0xa2, 0x46, 0x88, 0x69, 0x69, 0x06, 0x7f, 0x0f, 0xec, 0xd2, 0x80, 0xe7, 0xfd, 0x3e, + 0x65, 0xc2, 0xb4, 0xd3, 0xc7, 0x37, 0x85, 0xd3, 0x34, 0x94, 0x6f, 0xb4, 0xe6, 0xae, 0x70, 0x3e, + 0x98, 0x23, 0x35, 0x3e, 0x2e, 0x6a, 0x1a, 0x5a, 0x63, 0x0a, 0xbb, 0xa0, 0x41, 0xe2, 0xfe, 0xd1, + 0xc9, 0x33, 0x93, 0x40, 0x55, 0x25, 0xf0, 0x8b, 0xc7, 0x12, 0xa8, 0x9f, 0x9d, 0x5f, 0x1e, 0x9d, + 0x3c, 0x1b, 0xef, 0xdf, 0xf4, 0xca, 0x34, 0x8b, 0x8b, 0xea, 0x1a, 0xea, 0xcd, 0x9f, 0x03, 0x03, + 0xfd, 0x1e, 0xe6, 0x3d, 0xd5, 0x89, 0x35, 0x6f, 0xff, 0xa6, 0x70, 0x80, 0x66, 0xfa, 0x35, 0xe6, + 0xbd, 0x49, 0xd5, 0xbb, 0xa3, 0xbf, 0xe0, 0x4c, 0xc4, 0x79, 0x3a, 0xe6, 0x02, 0xda, 0x59, 0x5a, + 0x95, 0xdb, 0x3d, 0x31, 0xdb, 0x5d, 0x5b, 0x74, 0xbb, 0x27, 0x0f, 0x6d, 0xf7, 0x64, 0x76, 0xbb, + 0xda, 0xa6, 0x8c, 0x71, 0x6a, 0x62, 0xac, 0x2f, 0x1a, 0xe3, 0xf4, 0xa1, 0x18, 0xa7, 0xb3, 0x31, + 0xb4, 0x8d, 0xec, 0xcb, 0xb9, 0x3c, 0x3b, 0xd6, 0xc2, 0x7d, 0x79, 0xaf, 0x42, 0xcd, 0x52, 0xa2, + 0xd9, 0xaf, 0x41, 0x3b, 0xa0, 0x19, 0x17, 0x52, 0x96, 0xd1, 0x7e, 0x42, 0x4c, 0x88, 0x9a, 0x0a, + 0x71, 0xfa, 0x58, 0x88, 0xa7, 0xe6, 0xcb, 0x7f, 0xc0, 0xdd, 0x45, 0x5b, 0xb3, 0x62, 0x1d, 0xcc, + 0x07, 0x76, 0x9f, 0x08, 0xc2, 0x78, 0x37, 0x67, 0x91, 0x09, 0x04, 0x54, 0xa0, 0x9f, 0x3c, 0x16, + 0xc8, 0x74, 0xe8, 0xbc, 0xab, 0x8b, 0x5a, 0x13, 0x91, 0x0e, 0xf0, 0x07, 0xd0, 0x8c, 0x65, 0xd4, + 0x6e, 0x9e, 0x18, 0xfa, 0xba, 0xa2, 0x3f, 0x7e, 0x8c, 0xde, 0x7c, 0x55, 0xb3, 0x8e, 0x2e, 0xda, + 0x18, 0x0b, 0x34, 0x75, 0x08, 0x60, 0x9a, 0xc7, 0xcc, 0x8f, 0x12, 0x1c, 0xc4, 0x84, 0x19, 0xfa, + 0x86, 0xa2, 0xff, 0xe9, 0x63, 0xf4, 0x1f, 0x6a, 0xfa, 0xfb, 0xce, 0x2e, 0xb2, 0xa5, 0xf0, 0x57, + 0x5a, 0xa6, 0xa3, 0xbc, 0x01, 0x8d, 0x2e, 0x61, 0x49, 0x9c, 0x19, 0xfe, 0x0d, 0xc5, 0xff, 0xec, + 0x31, 0x7e, 0xd3, 0x41, 0xd3, 0x6e, 0x2e, 0xaa, 0x6b, 0x58, 0x92, 0x26, 0x34, 0x0b, 0xe9, 0x98, + 0x74, 0x73, 0x61, 0xd2, 0x69, 0x37, 0x17, 0xd5, 0x35, 0xd4, 0xa4, 0x11, 0xd8, 0xc2, 0x8c, 0xd1, + 0xb7, 0x73, 0x05, 0x81, 0x8a, 0xfb, 0x93, 0xc7, 0xb8, 0x9f, 0x68, 0xee, 0x07, 0xbc, 0x5d, 0xb4, 0xa9, 0xa4, 0x33, 0x25, 0x09, 0x01, 0x8c, 0x18, 0x1e, 0xcd, 0xc5, 0x69, 0x2f, 0x5c, 0xf8, 0xfb, - 0xce, 0x2e, 0xb2, 0xa5, 0x70, 0x26, 0xca, 0xd7, 0xa0, 0x9d, 0x12, 0x16, 0x11, 0x3f, 0x23, 0x82, - 0xf7, 0x93, 0x58, 0x98, 0x38, 0xdb, 0x0b, 0x7f, 0x07, 0x0f, 0xb9, 0xbb, 0x08, 0x2a, 0xf1, 0x17, + 0xce, 0x2e, 0xb2, 0xa5, 0x70, 0x26, 0xca, 0x37, 0xa0, 0x9d, 0x12, 0x16, 0x11, 0x3f, 0x23, 0x82, + 0xf7, 0x93, 0x58, 0x98, 0x38, 0xdb, 0x0b, 0x7f, 0x07, 0x0f, 0xb9, 0xbb, 0x08, 0x2a, 0xf1, 0x97, 0x46, 0x5a, 0x76, 0x29, 0xef, 0xe1, 0x2c, 0xea, 0xe1, 0xd8, 0x44, 0xd9, 0x59, 0xb8, 0x4b, 0x67, 0x1d, 0x5d, 0xb4, 0x31, 0x16, 0x94, 0x47, 0x1d, 0xe0, 0x2c, 0xc8, 0xc7, 0x47, 0xfd, 0xc1, 0xc2, - 0x47, 0x3d, 0xed, 0x26, 0x07, 0xb8, 0x82, 0x8a, 0xf4, 0xbc, 0x6a, 0x35, 0xed, 0xd6, 0x79, 0xd5, - 0x6a, 0xd9, 0xf6, 0x79, 0xd5, 0xb2, 0xed, 0xcd, 0xf3, 0xaa, 0xb5, 0x65, 0xb7, 0xd1, 0xc6, 0x88, - 0x26, 0xd4, 0x1f, 0x3c, 0xd7, 0x4e, 0xa8, 0x4e, 0xde, 0x61, 0x6e, 0x7e, 0x68, 0x50, 0x33, 0xc0, - 0x02, 0x27, 0x23, 0x6e, 0x0a, 0x81, 0x6c, 0x5d, 0x9e, 0xa9, 0xb1, 0x75, 0x08, 0x56, 0x2f, 0x85, - 0xbc, 0xfa, 0xd8, 0xa0, 0x72, 0x4d, 0x46, 0x7a, 0xd8, 0x22, 0xb9, 0x84, 0x6d, 0xb0, 0x3a, 0xc0, - 0x49, 0xae, 0xef, 0x50, 0x35, 0xa4, 0x81, 0x7b, 0x01, 0x5a, 0x57, 0x0c, 0x67, 0x5c, 0x8e, 0x7f, - 0x9a, 0xbd, 0xa5, 0x11, 0x87, 0x10, 0x54, 0xd5, 0x9c, 0xd0, 0xbe, 0x6a, 0x0d, 0x7f, 0x0c, 0xaa, - 0x09, 0x8d, 0x78, 0x67, 0x65, 0xaf, 0xb2, 0x5f, 0x3f, 0xde, 0xbe, 0x7f, 0x8b, 0x79, 0x4b, 0x23, - 0xa4, 0x4c, 0xdc, 0x7f, 0xac, 0x80, 0xca, 0x5b, 0x1a, 0xc1, 0x0e, 0x58, 0xc7, 0x61, 0xc8, 0x08, - 0xe7, 0x86, 0x69, 0x0c, 0xe1, 0x0e, 0x58, 0x13, 0xb4, 0x1f, 0x07, 0x9a, 0xae, 0x86, 0x0c, 0x92, - 0x81, 0x43, 0x2c, 0xb0, 0x1a, 0xac, 0x0d, 0xa4, 0xd6, 0xf2, 0x12, 0xa2, 0x32, 0xf3, 0xb3, 0x3c, - 0xed, 0x12, 0xa6, 0xe6, 0x63, 0xd5, 0x6b, 0xdd, 0x16, 0x4e, 0x5d, 0xc9, 0xbf, 0x50, 0x62, 0x34, - 0x0d, 0xe0, 0x47, 0x60, 0x5d, 0x0c, 0xa7, 0x67, 0xdd, 0xd6, 0x6d, 0xe1, 0xb4, 0xc4, 0x24, 0x4d, - 0x39, 0xca, 0xd0, 0x9a, 0x18, 0xaa, 0x91, 0x76, 0x08, 0x2c, 0x31, 0xf4, 0xe3, 0x2c, 0x24, 0x43, - 0x35, 0xce, 0xaa, 0x5e, 0xfb, 0xb6, 0x70, 0xec, 0x29, 0xf3, 0x33, 0xa9, 0x43, 0xeb, 0x62, 0xa8, - 0x16, 0xf0, 0x23, 0x00, 0xf4, 0x96, 0x54, 0x04, 0x3d, 0x9d, 0x36, 0x6e, 0x0b, 0xa7, 0xa6, 0xa4, - 0x8a, 0x7b, 0xb2, 0x84, 0x2e, 0x58, 0xd5, 0xdc, 0x96, 0xe2, 0x6e, 0xdc, 0x16, 0x8e, 0x95, 0xd0, - 0x48, 0x73, 0x6a, 0x95, 0x2c, 0x15, 0x23, 0x29, 0x1d, 0x90, 0x50, 0x8d, 0x08, 0x0b, 0x8d, 0xa1, - 0xfb, 0xb7, 0x15, 0x60, 0x5d, 0x0d, 0x11, 0xe1, 0x79, 0x22, 0xe0, 0x67, 0xc0, 0x0e, 0x68, 0x26, - 0x18, 0x0e, 0x84, 0x3f, 0x53, 0x5a, 0xef, 0xe9, 0xe4, 0x07, 0x7d, 0xde, 0xc2, 0x45, 0xad, 0xb1, - 0xe8, 0x95, 0xa9, 0x7f, 0x1b, 0xac, 0x76, 0x13, 0x4a, 0x53, 0xd5, 0x09, 0x0d, 0xa4, 0x01, 0x44, - 0xaa, 0x6a, 0xea, 0x94, 0x2b, 0xea, 0xae, 0xfa, 0xc3, 0xfb, 0xa7, 0x3c, 0xd7, 0x2a, 0xde, 0x8e, - 0xb9, 0xaf, 0x36, 0x75, 0x6c, 0xe3, 0xef, 0xca, 0xda, 0xaa, 0x56, 0xb2, 0x41, 0x85, 0x11, 0xa1, - 0x0e, 0xad, 0x81, 0xe4, 0x12, 0x3e, 0x01, 0x16, 0x23, 0x03, 0xc2, 0x04, 0x09, 0xd5, 0xe1, 0x58, - 0xa8, 0xc4, 0xf0, 0x43, 0x60, 0x45, 0x98, 0xfb, 0x39, 0x27, 0xa1, 0x3e, 0x09, 0xb4, 0x1e, 0x61, - 0xfe, 0x25, 0x27, 0xe1, 0x27, 0xd5, 0xbf, 0x7e, 0xe3, 0x2c, 0xb9, 0x18, 0xd4, 0x5f, 0x05, 0x01, - 0xe1, 0xfc, 0x2a, 0xef, 0x27, 0xe4, 0x91, 0x0e, 0x3b, 0x06, 0x0d, 0x2e, 0x28, 0xc3, 0x11, 0xf1, - 0xaf, 0xc9, 0xc8, 0xf4, 0x99, 0xee, 0x1a, 0x23, 0xff, 0x0d, 0x19, 0x71, 0x34, 0x0d, 0x4c, 0x88, - 0x6f, 0xaa, 0xa0, 0x7e, 0xc5, 0x70, 0x40, 0xcc, 0x05, 0x56, 0xf6, 0xaa, 0x84, 0xcc, 0x84, 0x30, - 0x48, 0xc6, 0x16, 0x71, 0x4a, 0x68, 0x2e, 0xcc, 0xf7, 0x34, 0x86, 0xd2, 0x83, 0x11, 0x32, 0x24, - 0x81, 0x2a, 0x63, 0x15, 0x19, 0x04, 0x4f, 0xc0, 0x46, 0x18, 0x73, 0xf5, 0xe0, 0xe0, 0x02, 0x07, - 0xd7, 0x3a, 0x7d, 0xcf, 0xbe, 0x2d, 0x9c, 0x86, 0x51, 0x5c, 0x4a, 0x39, 0x9a, 0x41, 0xf0, 0x53, - 0xd0, 0x9a, 0xb8, 0xa9, 0xdd, 0xea, 0x2b, 0xbe, 0x07, 0x6f, 0x0b, 0xa7, 0x59, 0x9a, 0x2a, 0x0d, - 0x9a, 0xc3, 0xf2, 0xa4, 0x43, 0xd2, 0xcd, 0x23, 0xd5, 0x7c, 0x16, 0xd2, 0x40, 0x4a, 0x93, 0x38, - 0x8d, 0x85, 0x6a, 0xb6, 0x55, 0xa4, 0x01, 0xfc, 0x14, 0xd4, 0xe8, 0x80, 0x30, 0x16, 0x87, 0x84, - 0xab, 0x0b, 0xc4, 0xf7, 0xbd, 0x56, 0xd0, 0xc4, 0x5e, 0x26, 0x67, 0x1e, 0x53, 0x29, 0x49, 0x29, - 0x1b, 0xa9, 0x2b, 0x82, 0x49, 0x4e, 0x2b, 0x3e, 0x57, 0x72, 0x34, 0x83, 0xa0, 0x07, 0xa0, 0x71, - 0x63, 0x44, 0xe4, 0x2c, 0xf3, 0xd5, 0xf7, 0xdf, 0x50, 0xbe, 0xea, 0x2b, 0xd4, 0x5a, 0xa4, 0x94, - 0x6f, 0xb0, 0xc0, 0xe8, 0x9e, 0x04, 0xfe, 0x1c, 0x40, 0x7d, 0x26, 0xfe, 0xd7, 0x9c, 0x96, 0xcf, - 0x2d, 0x3d, 0xe3, 0x55, 0x7c, 0xad, 0x35, 0x7b, 0xb6, 0x35, 0x3a, 0xe7, 0xd4, 0x64, 0x71, 0x5e, - 0xb5, 0xaa, 0xf6, 0xea, 0x79, 0xd5, 0x5a, 0xb7, 0xad, 0xb2, 0x7e, 0x26, 0x0b, 0xb4, 0x35, 0xc6, - 0x53, 0xdb, 0xf3, 0x7e, 0xf9, 0xed, 0xcd, 0xee, 0xf2, 0x77, 0x37, 0xbb, 0xcb, 0xff, 0xbe, 0xd9, - 0x5d, 0xfe, 0xfb, 0xfb, 0xdd, 0xa5, 0xef, 0xde, 0xef, 0x2e, 0xfd, 0xf3, 0xfd, 0xee, 0xd2, 0x1f, + 0x47, 0x3d, 0xed, 0x26, 0x07, 0xb8, 0x82, 0x8a, 0xf4, 0xa2, 0x6a, 0x35, 0xed, 0xd6, 0x45, 0xd5, + 0x6a, 0xd9, 0xf6, 0x45, 0xd5, 0xb2, 0xed, 0xcd, 0x8b, 0xaa, 0xb5, 0x65, 0xb7, 0xd1, 0xc6, 0x88, + 0x26, 0xd4, 0x1f, 0x3c, 0xd7, 0x4e, 0xa8, 0x4e, 0xde, 0x62, 0x6e, 0x7e, 0x68, 0x50, 0x33, 0xc0, + 0x02, 0x27, 0x23, 0x6e, 0x0a, 0x81, 0x6c, 0x5d, 0x9e, 0xa9, 0xb1, 0x75, 0x08, 0x56, 0xdf, 0x08, + 0x79, 0xf5, 0xb1, 0x41, 0xe5, 0x9a, 0x8c, 0xf4, 0xb0, 0x45, 0x72, 0x09, 0xdb, 0x60, 0x75, 0x80, + 0x93, 0x5c, 0xdf, 0xa1, 0x6a, 0x48, 0x03, 0xf7, 0x12, 0xb4, 0xae, 0x18, 0xce, 0xb8, 0x1c, 0xff, + 0x34, 0x7b, 0x4d, 0x23, 0x0e, 0x21, 0xa8, 0xaa, 0x39, 0xa1, 0x7d, 0xd5, 0x1a, 0xfe, 0x18, 0x54, + 0x13, 0x1a, 0xf1, 0xce, 0xca, 0x5e, 0x65, 0xbf, 0x7e, 0xbc, 0x7d, 0xff, 0x16, 0xf3, 0x9a, 0x46, + 0x48, 0x99, 0xb8, 0xff, 0x58, 0x01, 0x95, 0xd7, 0x34, 0x82, 0x1d, 0xb0, 0x8e, 0xc3, 0x90, 0x11, + 0xce, 0x0d, 0xd3, 0x18, 0xc2, 0x1d, 0xb0, 0x26, 0x68, 0x3f, 0x0e, 0x34, 0x5d, 0x0d, 0x19, 0x24, + 0x03, 0x87, 0x58, 0x60, 0x35, 0x58, 0x1b, 0x48, 0xad, 0xe5, 0x25, 0x44, 0x65, 0xe6, 0x67, 0x79, + 0xda, 0x25, 0x4c, 0xcd, 0xc7, 0xaa, 0xd7, 0xba, 0x2d, 0x9c, 0xba, 0x92, 0x7f, 0xa9, 0xc4, 0x68, + 0x1a, 0xc0, 0x8f, 0xc0, 0xba, 0x18, 0x4e, 0xcf, 0xba, 0xad, 0xdb, 0xc2, 0x69, 0x89, 0x49, 0x9a, + 0x72, 0x94, 0xa1, 0x35, 0x31, 0x54, 0x23, 0xed, 0x10, 0x58, 0x62, 0xe8, 0xc7, 0x59, 0x48, 0x86, + 0x6a, 0x9c, 0x55, 0xbd, 0xf6, 0x6d, 0xe1, 0xd8, 0x53, 0xe6, 0xe7, 0x52, 0x87, 0xd6, 0xc5, 0x50, + 0x2d, 0xe0, 0x47, 0x00, 0xe8, 0x2d, 0xa9, 0x08, 0x7a, 0x3a, 0x6d, 0xdc, 0x16, 0x4e, 0x4d, 0x49, + 0x15, 0xf7, 0x64, 0x09, 0x5d, 0xb0, 0xaa, 0xb9, 0x2d, 0xc5, 0xdd, 0xb8, 0x2d, 0x1c, 0x2b, 0xa1, + 0x91, 0xe6, 0xd4, 0x2a, 0x59, 0x2a, 0x46, 0x52, 0x3a, 0x20, 0xa1, 0x1a, 0x11, 0x16, 0x1a, 0x43, + 0xf7, 0x6f, 0x2b, 0xc0, 0xba, 0x1a, 0x22, 0xc2, 0xf3, 0x44, 0xc0, 0xcf, 0x81, 0x1d, 0xd0, 0x4c, + 0x30, 0x1c, 0x08, 0x7f, 0xa6, 0xb4, 0xde, 0xd3, 0xc9, 0x0f, 0xfa, 0xbc, 0x85, 0x8b, 0x5a, 0x63, + 0xd1, 0x0b, 0x53, 0xff, 0x36, 0x58, 0xed, 0x26, 0x94, 0xa6, 0xaa, 0x13, 0x1a, 0x48, 0x03, 0x88, + 0x54, 0xd5, 0xd4, 0x29, 0x57, 0xd4, 0x5d, 0xf5, 0x87, 0xf7, 0x4f, 0x79, 0xae, 0x55, 0xbc, 0x1d, + 0x73, 0x5f, 0x6d, 0xea, 0xd8, 0xc6, 0xdf, 0x95, 0xb5, 0x55, 0xad, 0x64, 0x83, 0x0a, 0x23, 0x42, + 0x1d, 0x5a, 0x03, 0xc9, 0x25, 0x7c, 0x02, 0x2c, 0x46, 0x06, 0x84, 0x09, 0x12, 0xaa, 0xc3, 0xb1, + 0x50, 0x89, 0xe1, 0x87, 0xc0, 0x8a, 0x30, 0xf7, 0x73, 0x4e, 0x42, 0x7d, 0x12, 0x68, 0x3d, 0xc2, + 0xfc, 0x2b, 0x4e, 0xc2, 0x4f, 0xab, 0x7f, 0xfd, 0xd6, 0x59, 0x72, 0x31, 0xa8, 0xbf, 0x08, 0x02, + 0xc2, 0xf9, 0x55, 0xde, 0x4f, 0xc8, 0x23, 0x1d, 0x76, 0x0c, 0x1a, 0x5c, 0x50, 0x86, 0x23, 0xe2, + 0x5f, 0x93, 0x91, 0xe9, 0x33, 0xdd, 0x35, 0x46, 0xfe, 0x1b, 0x32, 0xe2, 0x68, 0x1a, 0x98, 0x10, + 0xdf, 0x56, 0x41, 0xfd, 0x8a, 0xe1, 0x80, 0x98, 0x0b, 0xac, 0xec, 0x55, 0x09, 0x99, 0x09, 0x61, + 0x90, 0x8c, 0x2d, 0xe2, 0x94, 0xd0, 0x5c, 0x98, 0xef, 0x69, 0x0c, 0xa5, 0x07, 0x23, 0x64, 0x48, + 0x02, 0x55, 0xc6, 0x2a, 0x32, 0x08, 0x9e, 0x80, 0x8d, 0x30, 0xe6, 0xea, 0xc1, 0xc1, 0x05, 0x0e, + 0xae, 0x75, 0xfa, 0x9e, 0x7d, 0x5b, 0x38, 0x0d, 0xa3, 0x78, 0x23, 0xe5, 0x68, 0x06, 0xc1, 0xcf, + 0x40, 0x6b, 0xe2, 0xa6, 0x76, 0xab, 0xaf, 0xf8, 0x1e, 0xbc, 0x2d, 0x9c, 0x66, 0x69, 0xaa, 0x34, + 0x68, 0x0e, 0xcb, 0x93, 0x0e, 0x49, 0x37, 0x8f, 0x54, 0xf3, 0x59, 0x48, 0x03, 0x29, 0x4d, 0xe2, + 0x34, 0x16, 0xaa, 0xd9, 0x56, 0x91, 0x06, 0xf0, 0x33, 0x50, 0xa3, 0x03, 0xc2, 0x58, 0x1c, 0x12, + 0xae, 0x2e, 0x10, 0xdf, 0xf7, 0x5a, 0x41, 0x13, 0x7b, 0x99, 0x9c, 0x79, 0x4c, 0xa5, 0x24, 0xa5, + 0x6c, 0xa4, 0xae, 0x08, 0x26, 0x39, 0xad, 0xf8, 0x42, 0xc9, 0xd1, 0x0c, 0x82, 0x1e, 0x80, 0xc6, + 0x8d, 0x11, 0x91, 0xb3, 0xcc, 0x57, 0xdf, 0x7f, 0x43, 0xf9, 0xaa, 0xaf, 0x50, 0x6b, 0x91, 0x52, + 0xbe, 0xc2, 0x02, 0xa3, 0x7b, 0x12, 0xf8, 0x73, 0x00, 0xf5, 0x99, 0xf8, 0xdf, 0x70, 0x5a, 0x3e, + 0xb7, 0xf4, 0x8c, 0x57, 0xf1, 0xb5, 0xd6, 0xec, 0xd9, 0xd6, 0xe8, 0x82, 0x53, 0x93, 0xc5, 0x45, + 0xd5, 0xaa, 0xda, 0xab, 0x17, 0x55, 0x6b, 0xdd, 0xb6, 0xca, 0xfa, 0x99, 0x2c, 0xd0, 0xd6, 0x18, + 0x4f, 0x6d, 0xcf, 0xfb, 0xe5, 0x77, 0x37, 0xbb, 0xcb, 0xef, 0x6e, 0x76, 0x97, 0xff, 0x7d, 0xb3, + 0xbb, 0xfc, 0xf7, 0xf7, 0xbb, 0x4b, 0xef, 0xde, 0xef, 0x2e, 0xfd, 0xf3, 0xfd, 0xee, 0xd2, 0x1f, 0x7f, 0x14, 0xc5, 0xa2, 0x97, 0x77, 0x0f, 0x02, 0x9a, 0xca, 0xa7, 0x32, 0xe5, 0xe6, 0xef, 0xe0, - 0xe8, 0xc5, 0xe1, 0x50, 0xbd, 0xa1, 0xc5, 0xa8, 0x4f, 0x78, 0x77, 0x4d, 0xbd, 0x8d, 0x9f, 0xff, - 0x2f, 0x00, 0x00, 0xff, 0xff, 0xed, 0x8f, 0x5c, 0xfe, 0x61, 0x0f, 0x00, 0x00, + 0xe8, 0xf4, 0x70, 0xa8, 0xde, 0xd0, 0x62, 0xd4, 0x27, 0xbc, 0xbb, 0xa6, 0xde, 0xc6, 0xcf, 0xff, + 0x17, 0x00, 0x00, 0xff, 0xff, 0xc3, 0x00, 0x49, 0xb2, 0x61, 0x0f, 0x00, 0x00, } func (m *Params) Marshal() (dAtA []byte, err error) { diff --git a/x/evm/types/genesis.go b/x/evm/types/genesis.go index 76fcac2f1b..a9f30fec4c 100644 --- a/x/evm/types/genesis.go +++ b/x/evm/types/genesis.go @@ -5,7 +5,7 @@ package types import ( "fmt" - "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v18/types" ) // Validate performs a basic validation of a GenesisAccount fields. diff --git a/x/evm/types/genesis.pb.go b/x/evm/types/genesis.pb.go index 6196a8f4fb..725d904deb 100644 --- a/x/evm/types/genesis.pb.go +++ b/x/evm/types/genesis.pb.go @@ -155,23 +155,23 @@ var fileDescriptor_9bcdec50cc9d156d = []byte{ // 301 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x50, 0xbf, 0x4e, 0x83, 0x40, 0x18, 0xe7, 0x6c, 0xd3, 0xda, 0xab, 0x51, 0x73, 0x31, 0x91, 0x30, 0x5c, 0x49, 0x07, 0xc3, 0x74, - 0x84, 0x9a, 0xe8, 0xaa, 0x2c, 0xae, 0x86, 0x6e, 0x6e, 0x57, 0xf8, 0x42, 0x19, 0xe0, 0x08, 0x77, - 0x25, 0xba, 0x3a, 0x3a, 0xf9, 0x1c, 0x3e, 0x49, 0xc7, 0x8e, 0x4e, 0x6a, 0xe0, 0x45, 0x0c, 0x07, - 0x6d, 0xa2, 0x2c, 0x97, 0xef, 0xee, 0xf7, 0xef, 0xbb, 0x1f, 0xa6, 0xa0, 0xd6, 0x50, 0xa4, 0x49, - 0xa6, 0x5c, 0x28, 0x53, 0xb7, 0xf4, 0xdc, 0x18, 0x32, 0x90, 0x89, 0x64, 0x79, 0x21, 0x94, 0x20, - 0xe7, 0x07, 0x9c, 0x41, 0x99, 0xb2, 0xd2, 0xb3, 0xac, 0x9e, 0xa2, 0x01, 0x34, 0xdb, 0xba, 0x88, - 0x45, 0x2c, 0xf4, 0xe8, 0x36, 0x53, 0xfb, 0x3a, 0x7f, 0x43, 0xf8, 0xe4, 0xa1, 0x75, 0x5d, 0x2a, - 0xae, 0x80, 0xf8, 0xf8, 0x98, 0x87, 0xa1, 0xd8, 0x64, 0x4a, 0x9a, 0xc8, 0x1e, 0x38, 0xd3, 0x85, - 0xcd, 0xfe, 0xe7, 0xb0, 0x4e, 0x71, 0xdf, 0x12, 0xfd, 0xe1, 0xf6, 0x6b, 0x66, 0x04, 0x07, 0x1d, - 0xb9, 0xc1, 0xa3, 0x9c, 0x17, 0x3c, 0x95, 0xe6, 0x91, 0x8d, 0x9c, 0xe9, 0xc2, 0xec, 0x3b, 0x3c, - 0x6a, 0xbc, 0x53, 0x76, 0xec, 0xf9, 0x2b, 0xc2, 0xa7, 0x7f, 0xad, 0x89, 0x89, 0xc7, 0x3c, 0x8a, - 0x0a, 0x90, 0xcd, 0x36, 0xc8, 0x99, 0x04, 0xfb, 0x2b, 0x21, 0x78, 0x18, 0x8a, 0x08, 0x74, 0xc4, - 0x24, 0xd0, 0x33, 0xf1, 0xf1, 0x58, 0x2a, 0x51, 0xf0, 0x18, 0xcc, 0x81, 0xde, 0xfd, 0xb2, 0x9f, - 0xac, 0xbf, 0xe9, 0x9f, 0x35, 0xc1, 0x1f, 0xdf, 0xb3, 0xf1, 0xb2, 0xe5, 0x07, 0x7b, 0xa1, 0x7f, - 0xb7, 0xad, 0x28, 0xda, 0x55, 0x14, 0xfd, 0x54, 0x14, 0xbd, 0xd7, 0xd4, 0xd8, 0xd5, 0xd4, 0xf8, - 0xac, 0xa9, 0xf1, 0x74, 0x15, 0x27, 0x6a, 0xbd, 0x59, 0xb1, 0x50, 0xa4, 0x4d, 0xaf, 0x42, 0x76, - 0x67, 0xe9, 0xdd, 0xba, 0xcf, 0xba, 0x70, 0xf5, 0x92, 0x83, 0x5c, 0x8d, 0x74, 0xb5, 0xd7, 0xbf, - 0x01, 0x00, 0x00, 0xff, 0xff, 0xaa, 0xc8, 0xf7, 0xce, 0xc0, 0x01, 0x00, 0x00, + 0x84, 0x9a, 0x18, 0x47, 0x65, 0x71, 0x35, 0x74, 0x73, 0xbb, 0xc2, 0x17, 0xca, 0x00, 0x47, 0xb8, + 0x2b, 0xd1, 0xd5, 0xd1, 0xc9, 0xe7, 0xf0, 0x49, 0x3a, 0x76, 0x74, 0x52, 0x03, 0x2f, 0x62, 0x38, + 0x68, 0x13, 0x65, 0xb9, 0x7c, 0x77, 0xbf, 0x7f, 0xdf, 0xfd, 0x30, 0x05, 0xb5, 0x86, 0x22, 0x4d, + 0x32, 0xe5, 0x42, 0x99, 0xba, 0xa5, 0xe7, 0xc6, 0x90, 0x81, 0x4c, 0x24, 0xcb, 0x0b, 0xa1, 0x04, + 0x39, 0x3f, 0xe0, 0x0c, 0xca, 0x94, 0x95, 0x9e, 0x65, 0xf5, 0x14, 0x0d, 0xa0, 0xd9, 0xd6, 0x45, + 0x2c, 0x62, 0xa1, 0x47, 0xb7, 0x99, 0xda, 0xd7, 0xf9, 0x1b, 0xc2, 0x27, 0x0f, 0xad, 0xeb, 0x52, + 0x71, 0x05, 0xc4, 0xc7, 0xc7, 0x3c, 0x0c, 0xc5, 0x26, 0x53, 0xd2, 0x44, 0xf6, 0xc0, 0x99, 0x2e, + 0x6c, 0xf6, 0x3f, 0x87, 0x75, 0x8a, 0xfb, 0x96, 0xe8, 0x0f, 0xb7, 0x5f, 0x33, 0x23, 0x38, 0xe8, + 0xc8, 0x0d, 0x1e, 0xe5, 0xbc, 0xe0, 0xa9, 0x34, 0x8f, 0x6c, 0xe4, 0x4c, 0x17, 0x66, 0xdf, 0xe1, + 0x51, 0xe3, 0x9d, 0xb2, 0x63, 0xcf, 0x5f, 0x11, 0x3e, 0xfd, 0x6b, 0x4d, 0x4c, 0x3c, 0xe6, 0x51, + 0x54, 0x80, 0x6c, 0xb6, 0x41, 0xce, 0x24, 0xd8, 0x5f, 0x09, 0xc1, 0xc3, 0x50, 0x44, 0xa0, 0x23, + 0x26, 0x81, 0x9e, 0x89, 0x8f, 0xc7, 0x52, 0x89, 0x82, 0xc7, 0x60, 0x0e, 0xf4, 0xee, 0x97, 0xfd, + 0x64, 0xfd, 0x4d, 0xff, 0xac, 0x09, 0xfe, 0xf8, 0x9e, 0x8d, 0x97, 0x2d, 0x3f, 0xd8, 0x0b, 0xfd, + 0xbb, 0x6d, 0x45, 0xd1, 0xae, 0xa2, 0xe8, 0xa7, 0xa2, 0xe8, 0xbd, 0xa6, 0xc6, 0xae, 0xa6, 0xc6, + 0x67, 0x4d, 0x8d, 0xa7, 0xab, 0x38, 0x51, 0xeb, 0xcd, 0x8a, 0x85, 0x22, 0x6d, 0x7a, 0x15, 0xb2, + 0x3b, 0x4b, 0xef, 0xd6, 0x7d, 0xd6, 0x85, 0xab, 0x97, 0x1c, 0xe4, 0x6a, 0xa4, 0xab, 0xbd, 0xfe, + 0x0d, 0x00, 0x00, 0xff, 0xff, 0x84, 0x47, 0xe2, 0x82, 0xc0, 0x01, 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { diff --git a/x/evm/types/genesis_test.go b/x/evm/types/genesis_test.go index 6e97a55863..2b8e966951 100644 --- a/x/evm/types/genesis_test.go +++ b/x/evm/types/genesis_test.go @@ -6,7 +6,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/suite" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" ) type GenesisTestSuite struct { diff --git a/x/evm/types/interfaces.go b/x/evm/types/interfaces.go index 6af4a57fe1..09082f9039 100644 --- a/x/evm/types/interfaces.go +++ b/x/evm/types/interfaces.go @@ -11,7 +11,7 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" + feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" ) // AccountKeeper defines the expected account keeper interface diff --git a/x/evm/types/legacy_tx.go b/x/evm/types/legacy_tx.go index 717d3d7f8f..30c9e75b7f 100644 --- a/x/evm/types/legacy_tx.go +++ b/x/evm/types/legacy_tx.go @@ -10,7 +10,7 @@ import ( errorsmod "cosmossdk.io/errors" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v18/types" ) func NewLegacyTx(tx *ethtypes.Transaction) (*LegacyTx, error) { diff --git a/x/evm/types/legacy_tx_test.go b/x/evm/types/legacy_tx_test.go index f789922494..4bc0287545 100644 --- a/x/evm/types/legacy_tx_test.go +++ b/x/evm/types/legacy_tx_test.go @@ -6,7 +6,7 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/x/evm/types" ) func (suite *TxDataTestSuite) TestNewLegacyTx() { diff --git a/x/evm/types/logs.go b/x/evm/types/logs.go index 5492ec2772..c58bf967f9 100644 --- a/x/evm/types/logs.go +++ b/x/evm/types/logs.go @@ -9,7 +9,7 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - evmostypes "github.com/evmos/evmos/v17/types" + evmostypes "github.com/evmos/evmos/v18/types" ) // NewTransactionLogs creates a new NewTransactionLogs instance. diff --git a/x/evm/types/logs_test.go b/x/evm/types/logs_test.go index 7b22638aa8..b54b2bb5f7 100644 --- a/x/evm/types/logs_test.go +++ b/x/evm/types/logs_test.go @@ -5,8 +5,8 @@ import ( "github.com/stretchr/testify/require" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - "github.com/evmos/evmos/v17/x/evm/types" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/x/evm/types" "github.com/ethereum/go-ethereum/common" ) diff --git a/x/evm/types/msg.go b/x/evm/types/msg.go index 8d31af3d99..a1ecc02100 100644 --- a/x/evm/types/msg.go +++ b/x/evm/types/msg.go @@ -19,7 +19,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/signing" authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" - "github.com/evmos/evmos/v17/types" + "github.com/evmos/evmos/v18/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" diff --git a/x/evm/types/msg_test.go b/x/evm/types/msg_test.go index 3bbfedb46c..bc088baa33 100644 --- a/x/evm/types/msg_test.go +++ b/x/evm/types/msg_test.go @@ -17,12 +17,12 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" - utiltx "github.com/evmos/evmos/v17/testutil/tx" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + utiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/encoding" - "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/encoding" + "github.com/evmos/evmos/v18/x/evm/types" ) const invalidAddress = "0x0000" diff --git a/x/evm/types/params.go b/x/evm/types/params.go index 1fe6d5c9a5..ce7340332c 100644 --- a/x/evm/types/params.go +++ b/x/evm/types/params.go @@ -17,9 +17,9 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/params" - "github.com/evmos/evmos/v17/precompiles/p256" - "github.com/evmos/evmos/v17/types" - "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v18/precompiles/p256" + "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v18/utils" ) var ( diff --git a/x/evm/types/query.pb.go b/x/evm/types/query.pb.go index 982d7e6ffb..4be65d46b1 100644 --- a/x/evm/types/query.pb.go +++ b/x/evm/types/query.pb.go @@ -1336,7 +1336,7 @@ var fileDescriptor_e15a877459347994 = []byte{ // 1466 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x56, 0xcf, 0x6f, 0x1b, 0x45, 0x14, 0xce, 0xc6, 0x4e, 0xec, 0x8c, 0x93, 0xd6, 0x4c, 0xd3, 0xd6, 0xd9, 0x26, 0x76, 0xba, 0x90, - 0xd8, 0x2d, 0xed, 0x6e, 0x13, 0x50, 0x11, 0x5c, 0x68, 0x6d, 0xb5, 0xa5, 0xb4, 0x45, 0xc5, 0x44, + 0xd8, 0x2d, 0xed, 0x6e, 0x13, 0x50, 0x05, 0x5c, 0x68, 0x6d, 0xb5, 0xa5, 0xb4, 0x45, 0xc5, 0x44, 0x1c, 0x90, 0x90, 0x35, 0x5e, 0x4f, 0xd7, 0x56, 0xbc, 0x3b, 0xee, 0xce, 0xd8, 0x72, 0x5a, 0xf5, 0x40, 0x55, 0xf1, 0x43, 0x5c, 0x2a, 0x71, 0xe3, 0xd4, 0x3b, 0x37, 0x2e, 0x1c, 0xb9, 0xf6, 0x58, 0x89, 0x0b, 0xe2, 0x50, 0x50, 0xc3, 0x81, 0xbf, 0x81, 0x13, 0x9a, 0x1f, 0x6b, 0xef, 0xda, 0xde, @@ -1425,7 +1425,7 @@ var fileDescriptor_e15a877459347994 = []byte{ 0x6b, 0xcf, 0x5e, 0xe4, 0xb5, 0x3f, 0x5e, 0xe4, 0xb5, 0xc7, 0xfb, 0xf9, 0x99, 0x67, 0xfb, 0xf9, 0x99, 0x5f, 0xf7, 0xf3, 0x33, 0x9f, 0x6d, 0x86, 0xfa, 0xed, 0x60, 0x2f, 0xa1, 0x56, 0x6f, 0xeb, 0x1d, 0xab, 0x2f, 0xfc, 0x88, 0x9e, 0x5b, 0x9f, 0x17, 0xed, 0xfd, 0xad, 0x7f, 0x02, 0x00, 0x00, - 0xff, 0xff, 0x58, 0x44, 0xe3, 0x89, 0xce, 0x11, 0x00, 0x00, + 0xff, 0xff, 0x76, 0xcb, 0xf6, 0xc5, 0xce, 0x11, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/evm/types/tx.pb.go b/x/evm/types/tx.pb.go index 45c562600c..87185af114 100644 --- a/x/evm/types/tx.pb.go +++ b/x/evm/types/tx.pb.go @@ -457,7 +457,7 @@ var fileDescriptor_f75ac0a12d075f21 = []byte{ // 963 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x55, 0xcf, 0x6f, 0xe3, 0x44, 0x14, 0x8e, 0x13, 0xe7, 0xd7, 0x24, 0x2c, 0x2b, 0xab, 0xd5, 0x3a, 0x01, 0xe2, 0x6c, 0x90, 0x20, - 0x8b, 0x54, 0x5b, 0x2d, 0xd2, 0xa2, 0xed, 0x89, 0x66, 0xdb, 0x45, 0x8b, 0x5a, 0xb1, 0x32, 0xd9, + 0x8b, 0x54, 0x5b, 0x2d, 0xd2, 0x8a, 0xed, 0x89, 0x66, 0xdb, 0x45, 0x8b, 0x5a, 0xb1, 0x32, 0xd9, 0x0b, 0x20, 0x45, 0x53, 0x7b, 0x3a, 0x19, 0x11, 0x7b, 0x2c, 0xcf, 0xc4, 0x4a, 0x38, 0xee, 0x89, 0x1b, 0x20, 0xfe, 0x01, 0x0e, 0x9c, 0x38, 0x71, 0xd8, 0x33, 0xe7, 0x15, 0xa7, 0x15, 0x5c, 0x10, 0x07, 0x83, 0x52, 0x24, 0xa4, 0x1e, 0x39, 0x73, 0x40, 0x33, 0xe3, 0x34, 0xcd, 0x86, 0xb4, 0xb0, @@ -514,7 +514,7 @@ var fileDescriptor_f75ac0a12d075f21 = []byte{ 0xf6, 0x93, 0x59, 0x4b, 0x7b, 0x3a, 0x6b, 0x69, 0xbf, 0xce, 0x5a, 0xda, 0xe7, 0xa7, 0xad, 0xdc, 0xd3, 0xd3, 0x56, 0xee, 0xa7, 0xd3, 0x56, 0xee, 0x83, 0xd7, 0x30, 0xe1, 0xc3, 0xf1, 0xb1, 0xed, 0xd1, 0x60, 0xd1, 0x1c, 0x65, 0x4e, 0xb2, 0xfd, 0x96, 0x33, 0x91, 0x8d, 0xf2, 0x69, 0x84, 0xd8, - 0x71, 0x49, 0xae, 0xf6, 0x37, 0xff, 0x0a, 0x00, 0x00, 0xff, 0xff, 0xc0, 0x13, 0xc8, 0x4a, 0xd7, + 0x71, 0x49, 0xae, 0xf6, 0x37, 0xff, 0x0a, 0x00, 0x00, 0xff, 0xff, 0xee, 0x9c, 0xdd, 0x06, 0xd7, 0x08, 0x00, 0x00, } diff --git a/x/evm/types/tx_args_test.go b/x/evm/types/tx_args_test.go index 70861feace..1e485e04dc 100644 --- a/x/evm/types/tx_args_test.go +++ b/x/evm/types/tx_args_test.go @@ -7,7 +7,7 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/x/evm/types" ) func (suite *TxDataTestSuite) TestTxArgsString() { diff --git a/x/evm/types/utils_test.go b/x/evm/types/utils_test.go index 5d29b65698..eb0d9cdb96 100644 --- a/x/evm/types/utils_test.go +++ b/x/evm/types/utils_test.go @@ -14,10 +14,10 @@ import ( proto "github.com/cosmos/gogoproto/proto" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/encoding" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/encoding" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" "github.com/stretchr/testify/require" ) diff --git a/x/feemarket/client/cli/query.go b/x/feemarket/client/cli/query.go index b2e467fb87..0f561eeae3 100644 --- a/x/feemarket/client/cli/query.go +++ b/x/feemarket/client/cli/query.go @@ -8,7 +8,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/evmos/evmos/v17/x/feemarket/types" + "github.com/evmos/evmos/v18/x/feemarket/types" ) // GetQueryCmd returns the parent command for all x/feemarket CLI query commands. diff --git a/x/feemarket/genesis.go b/x/feemarket/genesis.go index 58ee93cd50..120da1c68d 100644 --- a/x/feemarket/genesis.go +++ b/x/feemarket/genesis.go @@ -7,8 +7,8 @@ import ( abci "github.com/cometbft/cometbft/abci/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/x/feemarket/keeper" - "github.com/evmos/evmos/v17/x/feemarket/types" + "github.com/evmos/evmos/v18/x/feemarket/keeper" + "github.com/evmos/evmos/v18/x/feemarket/types" ) // InitGenesis initializes genesis state based on exported genesis diff --git a/x/feemarket/keeper/abci.go b/x/feemarket/keeper/abci.go index 4758cadf9c..312b9788d3 100644 --- a/x/feemarket/keeper/abci.go +++ b/x/feemarket/keeper/abci.go @@ -6,7 +6,7 @@ import ( "fmt" abci "github.com/cometbft/cometbft/abci/types" - "github.com/evmos/evmos/v17/x/feemarket/types" + "github.com/evmos/evmos/v18/x/feemarket/types" "cosmossdk.io/math" "github.com/cosmos/cosmos-sdk/telemetry" diff --git a/x/feemarket/keeper/grpc_query.go b/x/feemarket/keeper/grpc_query.go index a859d0e5dc..800b09f40f 100644 --- a/x/feemarket/keeper/grpc_query.go +++ b/x/feemarket/keeper/grpc_query.go @@ -9,7 +9,7 @@ import ( sdkmath "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/x/feemarket/types" + "github.com/evmos/evmos/v18/x/feemarket/types" ) var _ types.QueryServer = Keeper{} diff --git a/x/feemarket/keeper/grpc_query_test.go b/x/feemarket/keeper/grpc_query_test.go index 12a411463f..2ce20c97ac 100644 --- a/x/feemarket/keeper/grpc_query_test.go +++ b/x/feemarket/keeper/grpc_query_test.go @@ -3,7 +3,7 @@ package keeper_test import ( sdkmath "cosmossdk.io/math" ethparams "github.com/ethereum/go-ethereum/params" - "github.com/evmos/evmos/v17/x/feemarket/types" + "github.com/evmos/evmos/v18/x/feemarket/types" ) func (suite *KeeperTestSuite) TestQueryParams() { diff --git a/x/feemarket/keeper/integration_test.go b/x/feemarket/keeper/integration_test.go index c06b1c7b9b..f31783bd90 100644 --- a/x/feemarket/keeper/integration_test.go +++ b/x/feemarket/keeper/integration_test.go @@ -12,10 +12,10 @@ import ( . "github.com/onsi/gomega" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" - "github.com/evmos/evmos/v17/testutil" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + "github.com/evmos/evmos/v18/testutil" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/utils" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" ) diff --git a/x/feemarket/keeper/keeper.go b/x/feemarket/keeper/keeper.go index 275f9ed141..fa94abe7ab 100644 --- a/x/feemarket/keeper/keeper.go +++ b/x/feemarket/keeper/keeper.go @@ -11,7 +11,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" - "github.com/evmos/evmos/v17/x/feemarket/types" + "github.com/evmos/evmos/v18/x/feemarket/types" ) // KeyPrefixBaseFeeV1 TODO: Temporary will be removed with params refactor PR diff --git a/x/feemarket/keeper/migrations.go b/x/feemarket/keeper/migrations.go index dafe0d17fe..37b9e39bc2 100644 --- a/x/feemarket/keeper/migrations.go +++ b/x/feemarket/keeper/migrations.go @@ -4,8 +4,8 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" - v4 "github.com/evmos/evmos/v17/x/feemarket/migrations/v4" - "github.com/evmos/evmos/v17/x/feemarket/types" + v4 "github.com/evmos/evmos/v18/x/feemarket/migrations/v4" + "github.com/evmos/evmos/v18/x/feemarket/types" ) // Migrator is a struct for handling in-place store migrations. diff --git a/x/feemarket/keeper/migrations_test.go b/x/feemarket/keeper/migrations_test.go index 6217026728..0fefd0ddb9 100644 --- a/x/feemarket/keeper/migrations_test.go +++ b/x/feemarket/keeper/migrations_test.go @@ -2,8 +2,8 @@ package keeper_test import ( sdk "github.com/cosmos/cosmos-sdk/types" - feemarketkeeper "github.com/evmos/evmos/v17/x/feemarket/keeper" - "github.com/evmos/evmos/v17/x/feemarket/types" + feemarketkeeper "github.com/evmos/evmos/v18/x/feemarket/keeper" + "github.com/evmos/evmos/v18/x/feemarket/types" ) type mockSubspace struct { diff --git a/x/feemarket/keeper/msg_server.go b/x/feemarket/keeper/msg_server.go index 7cd10dca4a..72c8ff78ce 100644 --- a/x/feemarket/keeper/msg_server.go +++ b/x/feemarket/keeper/msg_server.go @@ -8,7 +8,7 @@ import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - "github.com/evmos/evmos/v17/x/feemarket/types" + "github.com/evmos/evmos/v18/x/feemarket/types" ) // UpdateParams implements the gRPC MsgServer interface. When an UpdateParams diff --git a/x/feemarket/keeper/msg_server_test.go b/x/feemarket/keeper/msg_server_test.go index f760cc597a..5d1006a6f5 100644 --- a/x/feemarket/keeper/msg_server_test.go +++ b/x/feemarket/keeper/msg_server_test.go @@ -3,7 +3,7 @@ package keeper_test import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - "github.com/evmos/evmos/v17/x/feemarket/types" + "github.com/evmos/evmos/v18/x/feemarket/types" ) func (suite *KeeperTestSuite) TestUpdateParams() { diff --git a/x/feemarket/keeper/params.go b/x/feemarket/keeper/params.go index 82aae7e9b3..a2bd9973c7 100644 --- a/x/feemarket/keeper/params.go +++ b/x/feemarket/keeper/params.go @@ -6,7 +6,7 @@ import ( "math/big" "cosmossdk.io/math" - "github.com/evmos/evmos/v17/x/feemarket/types" + "github.com/evmos/evmos/v18/x/feemarket/types" sdk "github.com/cosmos/cosmos-sdk/types" ) diff --git a/x/feemarket/keeper/params_test.go b/x/feemarket/keeper/params_test.go index 0c549bb962..0903bfee21 100644 --- a/x/feemarket/keeper/params_test.go +++ b/x/feemarket/keeper/params_test.go @@ -3,7 +3,7 @@ package keeper_test import ( "reflect" - "github.com/evmos/evmos/v17/x/feemarket/types" + "github.com/evmos/evmos/v18/x/feemarket/types" ) func (suite *KeeperTestSuite) TestGetParams() { diff --git a/x/feemarket/keeper/setup_test.go b/x/feemarket/keeper/setup_test.go index 4ad1e3a2cd..e1fc1659eb 100644 --- a/x/feemarket/keeper/setup_test.go +++ b/x/feemarket/keeper/setup_test.go @@ -14,9 +14,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/utils" - "github.com/evmos/evmos/v17/x/feemarket/types" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v18/x/feemarket/types" "github.com/stretchr/testify/suite" ) diff --git a/x/feemarket/keeper/utils_test.go b/x/feemarket/keeper/utils_test.go index 5de9d83a4b..be53167bd2 100644 --- a/x/feemarket/keeper/utils_test.go +++ b/x/feemarket/keeper/utils_test.go @@ -5,7 +5,7 @@ import ( "math/big" "time" - "github.com/evmos/evmos/v17/utils" + "github.com/evmos/evmos/v18/utils" "cosmossdk.io/math" "github.com/cosmos/cosmos-sdk/baseapp" @@ -21,14 +21,14 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" - "github.com/evmos/evmos/v17/encoding" - "github.com/evmos/evmos/v17/testutil" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - evmostypes "github.com/evmos/evmos/v17/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" - "github.com/evmos/evmos/v17/x/feemarket/types" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + "github.com/evmos/evmos/v18/encoding" + "github.com/evmos/evmos/v18/testutil" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + evmostypes "github.com/evmos/evmos/v18/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v18/x/feemarket/types" "github.com/stretchr/testify/require" @@ -70,7 +70,7 @@ func (suite *KeeperTestSuite) SetupApp(checkTx bool, chainID string) { valAddr := sdk.ValAddress(suite.address.Bytes()) validator, err := stakingtypes.NewValidator(valAddr, priv.PubKey(), stakingtypes.Description{}) require.NoError(t, err) - validator = stakingkeeper.TestingUpdateValidator(&suite.app.StakingKeeper, suite.ctx, validator, true) + validator = stakingkeeper.TestingUpdateValidator(suite.app.StakingKeeper.Keeper, suite.ctx, validator, true) err = suite.app.StakingKeeper.Hooks().AfterValidatorCreated(suite.ctx, validator.GetOperator()) require.NoError(t, err) diff --git a/x/feemarket/migrations/v4/migrate.go b/x/feemarket/migrations/v4/migrate.go index a657134eb4..8804c152a2 100644 --- a/x/feemarket/migrations/v4/migrate.go +++ b/x/feemarket/migrations/v4/migrate.go @@ -6,7 +6,7 @@ import ( "github.com/cosmos/cosmos-sdk/codec" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/x/feemarket/types" + "github.com/evmos/evmos/v18/x/feemarket/types" ) // MigrateStore migrates the x/evm module state from the consensus version 3 to diff --git a/x/feemarket/migrations/v4/migrate_test.go b/x/feemarket/migrations/v4/migrate_test.go index 61b163c514..afee621da4 100644 --- a/x/feemarket/migrations/v4/migrate_test.go +++ b/x/feemarket/migrations/v4/migrate_test.go @@ -20,10 +20,10 @@ import ( "github.com/cosmos/cosmos-sdk/testutil" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/encoding" - v4 "github.com/evmos/evmos/v17/x/feemarket/migrations/v4" - "github.com/evmos/evmos/v17/x/feemarket/types" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/encoding" + v4 "github.com/evmos/evmos/v18/x/feemarket/migrations/v4" + "github.com/evmos/evmos/v18/x/feemarket/types" "github.com/stretchr/testify/require" ) diff --git a/x/feemarket/migrations/v4/types/params.go b/x/feemarket/migrations/v4/types/params.go index e7cb12ca8d..ec714e39f2 100644 --- a/x/feemarket/migrations/v4/types/params.go +++ b/x/feemarket/migrations/v4/types/params.go @@ -5,7 +5,7 @@ package types import ( "fmt" - "github.com/evmos/evmos/v17/x/feemarket/types" + "github.com/evmos/evmos/v18/x/feemarket/types" "cosmossdk.io/math" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" diff --git a/x/feemarket/module.go b/x/feemarket/module.go index 7854d14474..d234f08ea9 100644 --- a/x/feemarket/module.go +++ b/x/feemarket/module.go @@ -20,9 +20,9 @@ import ( "github.com/cosmos/cosmos-sdk/types/module" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" - "github.com/evmos/evmos/v17/x/feemarket/client/cli" - "github.com/evmos/evmos/v17/x/feemarket/keeper" - "github.com/evmos/evmos/v17/x/feemarket/types" + "github.com/evmos/evmos/v18/x/feemarket/client/cli" + "github.com/evmos/evmos/v18/x/feemarket/keeper" + "github.com/evmos/evmos/v18/x/feemarket/types" ) // consensusVersion defines the current x/feemarket module consensus version. diff --git a/x/feemarket/types/events.pb.go b/x/feemarket/types/events.pb.go index 606685ee82..0bf9c0a774 100644 --- a/x/feemarket/types/events.pb.go +++ b/x/feemarket/types/events.pb.go @@ -145,9 +145,9 @@ var fileDescriptor_c6edce8d670faff7 = []byte{ 0x34, 0xaf, 0x44, 0x82, 0x09, 0x22, 0x0e, 0xe1, 0x39, 0xb9, 0x9d, 0x78, 0x24, 0xc7, 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x13, 0x1e, 0xcb, 0x31, 0x5c, 0x78, 0x2c, 0xc7, 0x70, 0xe3, 0xb1, 0x1c, 0x43, 0x94, 0x4e, 0x7a, 0x66, 0x49, 0x46, 0x69, 0x92, 0x5e, 0x72, 0x7e, 0xae, - 0x7e, 0x6a, 0x59, 0x6e, 0x7e, 0x31, 0x94, 0x2c, 0x33, 0x34, 0xd7, 0xaf, 0x40, 0xf2, 0x57, 0x49, - 0x65, 0x41, 0x6a, 0x71, 0x12, 0x1b, 0xd8, 0x53, 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb4, - 0x88, 0x0a, 0x9d, 0xfb, 0x00, 0x00, 0x00, + 0x7e, 0x6a, 0x59, 0x6e, 0x7e, 0x31, 0x94, 0x2c, 0x33, 0xb4, 0xd0, 0xaf, 0x40, 0xf2, 0x57, 0x49, + 0x65, 0x41, 0x6a, 0x71, 0x12, 0x1b, 0xd8, 0x53, 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb8, + 0x18, 0x5d, 0x8d, 0xfb, 0x00, 0x00, 0x00, } func (m *EventFeeMarket) Marshal() (dAtA []byte, err error) { diff --git a/x/feemarket/types/feemarket.pb.go b/x/feemarket/types/feemarket.pb.go index 916a04e965..d231c3b4ab 100644 --- a/x/feemarket/types/feemarket.pb.go +++ b/x/feemarket/types/feemarket.pb.go @@ -118,29 +118,29 @@ var fileDescriptor_4feb8b20cf98e6e1 = []byte{ // 404 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0x41, 0x6b, 0xdb, 0x30, 0x14, 0xc7, 0xad, 0xa5, 0x4d, 0x5d, 0x75, 0x81, 0x20, 0xda, 0x61, 0x56, 0xe6, 0x9a, 0x15, 0x86, - 0x0f, 0xc3, 0x26, 0xf4, 0xb0, 0x5d, 0x76, 0xc9, 0x4a, 0xbb, 0x8d, 0x0d, 0x3a, 0x1f, 0x77, 0x11, - 0xb2, 0xfb, 0x62, 0x8b, 0x58, 0x92, 0xb1, 0x14, 0xb3, 0x7c, 0x8b, 0x7d, 0x93, 0x7d, 0x8d, 0x1c, - 0x73, 0x1c, 0x3b, 0x84, 0x91, 0x7c, 0x91, 0x11, 0x3b, 0xb1, 0x03, 0xbb, 0xec, 0x22, 0xa4, 0xf7, - 0xff, 0xff, 0xfe, 0xbc, 0x87, 0x1e, 0x7e, 0x05, 0x26, 0x83, 0x52, 0x70, 0x69, 0xc2, 0x09, 0x80, - 0x60, 0xe5, 0x14, 0x4c, 0x58, 0x8d, 0xba, 0x47, 0x50, 0x94, 0xca, 0x28, 0xf2, 0xac, 0xf5, 0x05, - 0x9d, 0x54, 0x8d, 0x9e, 0x9f, 0xa7, 0x2a, 0x55, 0xb5, 0x25, 0xdc, 0xde, 0x1a, 0xf7, 0xcb, 0x9f, - 0x3d, 0xdc, 0x7f, 0x60, 0x25, 0x13, 0x9a, 0xb8, 0xf8, 0x4c, 0x2a, 0x1a, 0x33, 0x0d, 0x74, 0x02, - 0xe0, 0x20, 0x0f, 0xf9, 0x76, 0x74, 0x2a, 0xd5, 0x98, 0x69, 0xb8, 0x03, 0x20, 0xef, 0xf0, 0xe5, - 0x5e, 0xa4, 0x49, 0xc6, 0x64, 0x0a, 0xf4, 0x11, 0xa4, 0x12, 0x5c, 0x32, 0xa3, 0x4a, 0xe7, 0x89, - 0x87, 0xfc, 0x41, 0xe4, 0xc4, 0x8d, 0xfb, 0x7d, 0x6d, 0xb8, 0xed, 0x74, 0x72, 0x83, 0x2f, 0x20, - 0x67, 0xda, 0xf0, 0x84, 0x9b, 0x39, 0x15, 0xb3, 0xdc, 0xf0, 0x22, 0xe7, 0x50, 0x3a, 0xbd, 0x1a, - 0x3c, 0xef, 0xc4, 0x2f, 0xad, 0x46, 0xae, 0xf1, 0x00, 0x24, 0x8b, 0x73, 0xa0, 0x19, 0xf0, 0x34, - 0x33, 0xce, 0xb1, 0x87, 0xfc, 0x5e, 0xf4, 0xb4, 0x29, 0x7e, 0xa8, 0x6b, 0xe4, 0x2d, 0xb6, 0xdb, - 0xae, 0xfb, 0x1e, 0xf2, 0x4f, 0xc7, 0x2f, 0x16, 0xab, 0x2b, 0xeb, 0xf7, 0xea, 0xea, 0x22, 0x51, - 0x5a, 0x28, 0xad, 0x1f, 0xa7, 0x01, 0x57, 0xa1, 0x60, 0x26, 0x0b, 0x3e, 0x4a, 0x13, 0x9d, 0xec, - 0x9a, 0x24, 0xf7, 0x78, 0x20, 0xb8, 0xa4, 0x29, 0xd3, 0xb4, 0x28, 0x79, 0x02, 0xce, 0x49, 0x8d, - 0x5f, 0xef, 0xf0, 0xcb, 0x7f, 0xf1, 0xcf, 0x90, 0xb2, 0x64, 0x7e, 0x0b, 0x49, 0x74, 0x26, 0xb8, - 0xbc, 0x67, 0xfa, 0x61, 0xcb, 0x91, 0xaf, 0x98, 0xec, 0x83, 0x0e, 0x26, 0xb3, 0xff, 0x3f, 0x6d, - 0xd8, 0xa4, 0x75, 0xa3, 0x7f, 0x3a, 0xb2, 0x8f, 0x86, 0xc7, 0xd1, 0x90, 0x4b, 0x6e, 0x38, 0xcb, - 0xdb, 0x7f, 0x19, 0xdf, 0x2d, 0xd6, 0x2e, 0x5a, 0xae, 0x5d, 0xf4, 0x67, 0xed, 0xa2, 0x1f, 0x1b, - 0xd7, 0x5a, 0x6e, 0x5c, 0xeb, 0xd7, 0xc6, 0xb5, 0xbe, 0xbd, 0x4e, 0xb9, 0xc9, 0x66, 0x71, 0x90, - 0x28, 0x11, 0x42, 0x25, 0x94, 0xde, 0x9d, 0xd5, 0xe8, 0x4d, 0xf8, 0xfd, 0x60, 0x69, 0xcc, 0xbc, - 0x00, 0x1d, 0xf7, 0xeb, 0x05, 0xb8, 0xf9, 0x1b, 0x00, 0x00, 0xff, 0xff, 0xf7, 0xad, 0x9b, 0x9c, + 0x0f, 0xc3, 0x26, 0xf4, 0xd2, 0xcb, 0x2e, 0x59, 0x69, 0xb7, 0xb1, 0x41, 0xe7, 0xe3, 0x2e, 0x42, + 0x76, 0x5f, 0x6c, 0x11, 0x4b, 0x32, 0x96, 0x62, 0x96, 0x6f, 0xb1, 0x6f, 0xb2, 0xaf, 0x91, 0x63, + 0x8e, 0x63, 0x87, 0x30, 0x92, 0x2f, 0x32, 0x62, 0x27, 0x76, 0x60, 0x97, 0x5d, 0x84, 0xf4, 0xfe, + 0xff, 0xdf, 0x9f, 0xf7, 0xd0, 0xc3, 0x6f, 0xc0, 0x64, 0x50, 0x0a, 0x2e, 0x4d, 0x38, 0x01, 0x10, + 0xac, 0x9c, 0x82, 0x09, 0xab, 0x51, 0xf7, 0x08, 0x8a, 0x52, 0x19, 0x45, 0x5e, 0xb4, 0xbe, 0xa0, + 0x93, 0xaa, 0xd1, 0xcb, 0xf3, 0x54, 0xa5, 0xaa, 0xb6, 0x84, 0xdb, 0x5b, 0xe3, 0x7e, 0xfd, 0xb3, + 0x87, 0xfb, 0x8f, 0xac, 0x64, 0x42, 0x13, 0x17, 0x9f, 0x49, 0x45, 0x63, 0xa6, 0x81, 0x4e, 0x00, + 0x1c, 0xe4, 0x21, 0xdf, 0x8e, 0x4e, 0xa5, 0x1a, 0x33, 0x0d, 0xf7, 0x00, 0xe4, 0x1d, 0xbe, 0xdc, + 0x8b, 0x34, 0xc9, 0x98, 0x4c, 0x81, 0x3e, 0x81, 0x54, 0x82, 0x4b, 0x66, 0x54, 0xe9, 0x3c, 0xf3, + 0x90, 0x3f, 0x88, 0x9c, 0xb8, 0x71, 0xbf, 0xaf, 0x0d, 0x77, 0x9d, 0x4e, 0x6e, 0xf0, 0x05, 0xe4, + 0x4c, 0x1b, 0x9e, 0x70, 0x33, 0xa7, 0x62, 0x96, 0x1b, 0x5e, 0xe4, 0x1c, 0x4a, 0xa7, 0x57, 0x83, + 0xe7, 0x9d, 0xf8, 0xa5, 0xd5, 0xc8, 0x35, 0x1e, 0x80, 0x64, 0x71, 0x0e, 0x34, 0x03, 0x9e, 0x66, + 0xc6, 0x39, 0xf6, 0x90, 0xdf, 0x8b, 0x9e, 0x37, 0xc5, 0x0f, 0x75, 0x8d, 0xdc, 0x62, 0xbb, 0xed, + 0xba, 0xef, 0x21, 0xff, 0x74, 0xfc, 0x6a, 0xb1, 0xba, 0xb2, 0x7e, 0xaf, 0xae, 0x2e, 0x12, 0xa5, + 0x85, 0xd2, 0xfa, 0x69, 0x1a, 0x70, 0x15, 0x0a, 0x66, 0xb2, 0xe0, 0xa3, 0x34, 0xd1, 0xc9, 0xae, + 0x49, 0xf2, 0x80, 0x07, 0x82, 0x4b, 0x9a, 0x32, 0x4d, 0x8b, 0x92, 0x27, 0xe0, 0x9c, 0xd4, 0xf8, + 0xf5, 0x0e, 0xbf, 0xfc, 0x17, 0xff, 0x0c, 0x29, 0x4b, 0xe6, 0x77, 0x90, 0x44, 0x67, 0x82, 0xcb, + 0x07, 0xa6, 0x1f, 0xb7, 0x1c, 0xf9, 0x8a, 0xc9, 0x3e, 0xe8, 0x60, 0x32, 0xfb, 0xff, 0xd3, 0x86, + 0x4d, 0x5a, 0x37, 0xfa, 0xa7, 0x23, 0xfb, 0x68, 0x78, 0x1c, 0x0d, 0xb9, 0xe4, 0x86, 0xb3, 0xbc, + 0xfd, 0x97, 0xf1, 0xfd, 0x62, 0xed, 0xa2, 0xe5, 0xda, 0x45, 0x7f, 0xd6, 0x2e, 0xfa, 0xb1, 0x71, + 0xad, 0xe5, 0xc6, 0xb5, 0x7e, 0x6d, 0x5c, 0xeb, 0xdb, 0xdb, 0x94, 0x9b, 0x6c, 0x16, 0x07, 0x89, + 0x12, 0x21, 0x54, 0x42, 0xe9, 0xdd, 0x59, 0x8d, 0x6e, 0xc3, 0xef, 0x07, 0x4b, 0x63, 0xe6, 0x05, + 0xe8, 0xb8, 0x5f, 0x2f, 0xc0, 0xcd, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfb, 0x3d, 0xcc, 0x8c, 0x58, 0x02, 0x00, 0x00, } diff --git a/x/feemarket/types/genesis.pb.go b/x/feemarket/types/genesis.pb.go index 952b540199..ebc67987b7 100644 --- a/x/feemarket/types/genesis.pb.go +++ b/x/feemarket/types/genesis.pb.go @@ -102,9 +102,9 @@ var fileDescriptor_6241c21661288629 = []byte{ 0x29, 0xb1, 0x38, 0x35, 0x3e, 0x2d, 0x35, 0xd5, 0xc9, 0xed, 0xc4, 0x23, 0x39, 0xc6, 0x0b, 0x8f, 0xe4, 0x18, 0x1f, 0x3c, 0x92, 0x63, 0x9c, 0xf0, 0x58, 0x8e, 0xe1, 0xc2, 0x63, 0x39, 0x86, 0x1b, 0x8f, 0xe5, 0x18, 0xa2, 0x74, 0xd2, 0x33, 0x4b, 0x32, 0x4a, 0x93, 0xf4, 0x92, 0xf3, 0x73, 0xf5, - 0x53, 0xcb, 0x72, 0xf3, 0x8b, 0xa1, 0x64, 0x99, 0xa1, 0xb9, 0x7e, 0x05, 0x92, 0x2f, 0x4b, 0x2a, - 0x0b, 0x52, 0x8b, 0x93, 0xd8, 0xc0, 0x3e, 0x31, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0xb3, 0xe0, - 0x8d, 0x31, 0x47, 0x01, 0x00, 0x00, + 0x53, 0xcb, 0x72, 0xf3, 0x8b, 0xa1, 0x64, 0x99, 0xa1, 0x85, 0x7e, 0x05, 0x92, 0x2f, 0x4b, 0x2a, + 0x0b, 0x52, 0x8b, 0x93, 0xd8, 0xc0, 0x3e, 0x31, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0xbf, 0x70, + 0xda, 0x21, 0x47, 0x01, 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { diff --git a/x/feemarket/types/query.pb.go b/x/feemarket/types/query.pb.go index 8db2276a45..b25c70802e 100644 --- a/x/feemarket/types/query.pb.go +++ b/x/feemarket/types/query.pb.go @@ -289,34 +289,34 @@ func init() { var fileDescriptor_71a07c1ffd85fde2 = []byte{ // 447 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x53, 0x4d, 0x6f, 0xd3, 0x40, - 0x10, 0xcd, 0x12, 0x48, 0xcb, 0x72, 0x41, 0x4b, 0x52, 0x81, 0x15, 0x36, 0xc8, 0x02, 0xc4, 0x47, - 0xd9, 0x55, 0x0a, 0x12, 0x17, 0x4e, 0x3e, 0x14, 0x21, 0x71, 0x00, 0x73, 0xe3, 0x52, 0xad, 0xc3, - 0xd4, 0xb1, 0x52, 0x7b, 0x5d, 0xef, 0xc6, 0xa2, 0x57, 0x24, 0x2e, 0x1c, 0x10, 0x12, 0xbf, 0x83, - 0xff, 0xd1, 0x63, 0x25, 0x2e, 0x88, 0x43, 0x85, 0x12, 0x7e, 0x08, 0xf2, 0xee, 0x3a, 0x60, 0x48, - 0x68, 0x2e, 0xd6, 0x68, 0xfc, 0xe6, 0xbd, 0x37, 0x6f, 0xb4, 0xd8, 0x07, 0x3d, 0x86, 0x22, 0x4d, - 0x32, 0xcd, 0xf7, 0x01, 0x52, 0x51, 0x4c, 0x40, 0xf3, 0x72, 0xc8, 0x0f, 0xa7, 0x50, 0x1c, 0xb1, - 0xbc, 0x90, 0x5a, 0x92, 0xad, 0x05, 0x86, 0x2d, 0x30, 0xac, 0x1c, 0x7a, 0xb7, 0x57, 0xcc, 0xfe, - 0x06, 0x99, 0x79, 0xaf, 0x1b, 0xcb, 0x58, 0x9a, 0x92, 0x57, 0x95, 0xeb, 0xf6, 0x63, 0x29, 0xe3, - 0x03, 0xe0, 0x22, 0x4f, 0xb8, 0xc8, 0x32, 0xa9, 0x85, 0x4e, 0x64, 0xa6, 0xec, 0x5f, 0xbf, 0x8b, - 0xc9, 0xcb, 0xca, 0xc2, 0x0b, 0x51, 0x88, 0x54, 0x85, 0x70, 0x38, 0x05, 0xa5, 0xfd, 0x57, 0xf8, - 0x4a, 0xa3, 0xab, 0x72, 0x99, 0x29, 0x20, 0x4f, 0x70, 0x27, 0x37, 0x9d, 0xab, 0xe8, 0x06, 0xba, - 0x73, 0x69, 0x87, 0xb2, 0xe5, 0x8e, 0x99, 0x9d, 0x0b, 0xce, 0x1f, 0x9f, 0x0e, 0x5a, 0xa1, 0x9b, - 0xf1, 0x7b, 0x8e, 0x34, 0x10, 0x0a, 0x76, 0x01, 0x6a, 0xad, 0xe7, 0xb8, 0xdb, 0x6c, 0x3b, 0xb1, - 0x47, 0x78, 0x33, 0x12, 0x0a, 0xf6, 0xf6, 0x01, 0x8c, 0xdc, 0xc5, 0xe0, 0xda, 0xf7, 0xd3, 0x41, - 0x6f, 0x24, 0x55, 0x2a, 0x95, 0x7a, 0x33, 0x61, 0x89, 0xe4, 0xa9, 0xd0, 0x63, 0xf6, 0x2c, 0xd3, - 0xe1, 0x46, 0x64, 0xa7, 0xfd, 0xad, 0x9a, 0xed, 0x40, 0x8e, 0x26, 0x4f, 0xc5, 0x62, 0xa3, 0xbb, - 0xb8, 0xf7, 0x57, 0xdf, 0xc9, 0x5c, 0xc6, 0xed, 0x58, 0xd8, 0x85, 0xda, 0x61, 0x55, 0xee, 0x7c, - 0x69, 0xe3, 0x0b, 0x06, 0x4b, 0xde, 0x23, 0xdc, 0xb1, 0xab, 0x90, 0x7b, 0xab, 0x56, 0xfd, 0x37, - 0x3d, 0xef, 0xfe, 0x5a, 0x58, 0xab, 0xef, 0xfb, 0xef, 0xbe, 0xfe, 0xfc, 0x7c, 0xae, 0x4f, 0x3c, - 0x0e, 0x65, 0x2a, 0x55, 0xf3, 0xc2, 0x36, 0x39, 0xf2, 0x01, 0xe1, 0x0d, 0x17, 0x0f, 0xf9, 0x3f, - 0x79, 0x33, 0x5b, 0x6f, 0x7b, 0x3d, 0xb0, 0xb3, 0x72, 0xd3, 0x58, 0xa1, 0xa4, 0xbf, 0xcc, 0x4a, - 0x7d, 0x0b, 0xf2, 0x11, 0xe1, 0xcd, 0x3a, 0x45, 0x72, 0x86, 0x40, 0xf3, 0x08, 0xde, 0x83, 0x35, - 0xd1, 0xce, 0xcf, 0x2d, 0xe3, 0x67, 0x40, 0xae, 0x2f, 0xf5, 0x53, 0xa1, 0xf7, 0x62, 0xa1, 0x82, - 0xdd, 0xe3, 0x19, 0x45, 0x27, 0x33, 0x8a, 0x7e, 0xcc, 0x28, 0xfa, 0x34, 0xa7, 0xad, 0x93, 0x39, - 0x6d, 0x7d, 0x9b, 0xd3, 0xd6, 0xeb, 0xed, 0x38, 0xd1, 0xe3, 0x69, 0xc4, 0x46, 0x32, 0x75, 0x14, - 0xf6, 0x5b, 0x0e, 0x1f, 0xf3, 0xb7, 0x7f, 0xd0, 0xe9, 0xa3, 0x1c, 0x54, 0xd4, 0x31, 0x2f, 0xe2, - 0xe1, 0xaf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x80, 0xc8, 0x76, 0xfc, 0xab, 0x03, 0x00, 0x00, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x53, 0xbf, 0x6f, 0xd3, 0x40, + 0x14, 0xce, 0x11, 0x48, 0xcb, 0xb1, 0xa0, 0x23, 0xa9, 0xc0, 0x0a, 0x17, 0x64, 0x01, 0xe2, 0x47, + 0xb9, 0x53, 0x0a, 0x03, 0x03, 0x93, 0x87, 0x22, 0x24, 0x06, 0x30, 0x1b, 0x4b, 0x75, 0x0e, 0xaf, + 0x8e, 0x95, 0xda, 0xe7, 0xfa, 0x2e, 0x16, 0x5d, 0x91, 0x58, 0x18, 0x10, 0x12, 0x7f, 0x07, 0xff, + 0x47, 0xc7, 0x4a, 0x2c, 0x88, 0xa1, 0x42, 0x09, 0x7f, 0x08, 0xf2, 0xdd, 0x39, 0x60, 0x48, 0x68, + 0x16, 0xeb, 0xe9, 0xf9, 0x7b, 0xdf, 0xf7, 0xbd, 0xef, 0xe9, 0xb0, 0x0f, 0x7a, 0x0c, 0x45, 0x9a, + 0x64, 0x9a, 0xef, 0x03, 0xa4, 0xa2, 0x98, 0x80, 0xe6, 0xe5, 0x90, 0x1f, 0x4e, 0xa1, 0x38, 0x62, + 0x79, 0x21, 0xb5, 0x24, 0x5b, 0x0b, 0x0c, 0x5b, 0x60, 0x58, 0x39, 0xf4, 0x6e, 0xaf, 0x98, 0xfd, + 0x0d, 0x32, 0xf3, 0x5e, 0x37, 0x96, 0xb1, 0x34, 0x25, 0xaf, 0x2a, 0xd7, 0xed, 0xc7, 0x52, 0xc6, + 0x07, 0xc0, 0x45, 0x9e, 0x70, 0x91, 0x65, 0x52, 0x0b, 0x9d, 0xc8, 0x4c, 0xd9, 0xbf, 0x7e, 0x17, + 0x93, 0x97, 0x95, 0x85, 0x17, 0xa2, 0x10, 0xa9, 0x0a, 0xe1, 0x70, 0x0a, 0x4a, 0xfb, 0xaf, 0xf0, + 0x95, 0x46, 0x57, 0xe5, 0x32, 0x53, 0x40, 0x9e, 0xe0, 0x4e, 0x6e, 0x3a, 0x57, 0xd1, 0x0d, 0x74, + 0xe7, 0xd2, 0x0e, 0x65, 0xcb, 0x1d, 0x33, 0x3b, 0x17, 0x9c, 0x3f, 0x3e, 0x1d, 0xb4, 0x42, 0x37, + 0xe3, 0xf7, 0x1c, 0x69, 0x20, 0x14, 0xec, 0x02, 0xd4, 0x5a, 0xcf, 0x71, 0xb7, 0xd9, 0x76, 0x62, + 0x8f, 0xf0, 0x66, 0x24, 0x14, 0xec, 0xed, 0x03, 0x18, 0xb9, 0x8b, 0xc1, 0xb5, 0xef, 0xa7, 0x83, + 0xde, 0x48, 0xaa, 0x54, 0x2a, 0xf5, 0x66, 0xc2, 0x12, 0xc9, 0x53, 0xa1, 0xc7, 0xec, 0x59, 0xa6, + 0xc3, 0x8d, 0xc8, 0x4e, 0xfb, 0x5b, 0x35, 0xdb, 0x81, 0x1c, 0x4d, 0x9e, 0x8a, 0xc5, 0x46, 0x77, + 0x71, 0xef, 0xaf, 0xbe, 0x93, 0xb9, 0x8c, 0xdb, 0xb1, 0xb0, 0x0b, 0xb5, 0xc3, 0xaa, 0xdc, 0xf9, + 0xd2, 0xc6, 0x17, 0x0c, 0x96, 0xbc, 0x47, 0xb8, 0x63, 0x57, 0x21, 0xf7, 0x56, 0xad, 0xfa, 0x6f, + 0x7a, 0xde, 0xfd, 0xb5, 0xb0, 0x56, 0xdf, 0xf7, 0xdf, 0x7d, 0xfd, 0xf9, 0xf9, 0x5c, 0x9f, 0x78, + 0x1c, 0xca, 0x54, 0xaa, 0xe6, 0x85, 0x6d, 0x72, 0xe4, 0x03, 0xc2, 0x1b, 0x2e, 0x1e, 0xf2, 0x7f, + 0xf2, 0x66, 0xb6, 0xde, 0xf6, 0x7a, 0x60, 0x67, 0xe5, 0xa6, 0xb1, 0x42, 0x49, 0x7f, 0x99, 0x95, + 0xfa, 0x16, 0xe4, 0x23, 0xc2, 0x9b, 0x75, 0x8a, 0xe4, 0x0c, 0x81, 0xe6, 0x11, 0xbc, 0x07, 0x6b, + 0xa2, 0x9d, 0x9f, 0x5b, 0xc6, 0xcf, 0x80, 0x5c, 0x5f, 0xea, 0xa7, 0x42, 0xef, 0xc5, 0x42, 0x05, + 0xbb, 0xc7, 0x33, 0x8a, 0x4e, 0x66, 0x14, 0xfd, 0x98, 0x51, 0xf4, 0x69, 0x4e, 0x5b, 0x27, 0x73, + 0xda, 0xfa, 0x36, 0xa7, 0xad, 0xd7, 0xdb, 0x71, 0xa2, 0xc7, 0xd3, 0x88, 0x8d, 0x64, 0xea, 0x28, + 0xec, 0xb7, 0x1c, 0x3e, 0xe6, 0x6f, 0xff, 0xa0, 0xd3, 0x47, 0x39, 0xa8, 0xa8, 0x63, 0x5e, 0xc4, + 0xc3, 0x5f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x8c, 0x58, 0x21, 0xec, 0xab, 0x03, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/feemarket/types/tx.pb.go b/x/feemarket/types/tx.pb.go index 567c4b33a8..0cc39a8da7 100644 --- a/x/feemarket/types/tx.pb.go +++ b/x/feemarket/types/tx.pb.go @@ -151,8 +151,8 @@ var fileDescriptor_78aff2584dbf2838 = []byte{ 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, 0x83, 0x90, 0x65, 0x86, 0xe6, 0xfa, 0x15, 0x48, 0x11, 0x52, 0x52, 0x59, 0x90, 0x5a, 0x9c, - 0xc4, 0x06, 0x0e, 0x74, 0x63, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb5, 0x0c, 0xb6, 0x9d, 0x21, + 0xb8, 0x83, 0x90, 0x65, 0x86, 0x16, 0xfa, 0x15, 0x48, 0x11, 0x52, 0x52, 0x59, 0x90, 0x5a, 0x9c, + 0xc4, 0x06, 0x0e, 0x74, 0x63, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb9, 0x9c, 0xe1, 0x8d, 0x21, 0x02, 0x00, 0x00, } diff --git a/x/ibc/transfer/ibc_module.go b/x/ibc/transfer/ibc_module.go index 6de1fd9874..97d10f66af 100644 --- a/x/ibc/transfer/ibc_module.go +++ b/x/ibc/transfer/ibc_module.go @@ -6,7 +6,7 @@ package transfer import ( ibctransfer "github.com/cosmos/ibc-go/v7/modules/apps/transfer" porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" - "github.com/evmos/evmos/v17/x/ibc/transfer/keeper" + "github.com/evmos/evmos/v18/x/ibc/transfer/keeper" ) var _ porttypes.IBCModule = IBCModule{} diff --git a/x/ibc/transfer/keeper/keeper.go b/x/ibc/transfer/keeper/keeper.go index 42df8c9637..9de825295f 100644 --- a/x/ibc/transfer/keeper/keeper.go +++ b/x/ibc/transfer/keeper/keeper.go @@ -13,7 +13,7 @@ import ( transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" - "github.com/evmos/evmos/v17/x/ibc/transfer/types" + "github.com/evmos/evmos/v18/x/ibc/transfer/types" ) // Keeper defines the modified IBC transfer keeper that embeds the original one. diff --git a/x/ibc/transfer/keeper/keeper_test.go b/x/ibc/transfer/keeper/keeper_test.go index de0fc55d14..e8b955866b 100644 --- a/x/ibc/transfer/keeper/keeper_test.go +++ b/x/ibc/transfer/keeper/keeper_test.go @@ -28,18 +28,18 @@ import ( stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" - "github.com/evmos/evmos/v17/server/config" - "github.com/evmos/evmos/v17/testutil" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - "github.com/evmos/evmos/v17/utils" - "github.com/evmos/evmos/v17/x/evm/statedb" - evm "github.com/evmos/evmos/v17/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v17/x/feemarket/types" - - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/contracts" - "github.com/evmos/evmos/v17/x/erc20/types" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + "github.com/evmos/evmos/v18/server/config" + "github.com/evmos/evmos/v18/testutil" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v18/x/evm/statedb" + evm "github.com/evmos/evmos/v18/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" + + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/contracts" + "github.com/evmos/evmos/v18/x/erc20/types" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" @@ -122,7 +122,7 @@ func (suite *KeeperTestSuite) DoSetupTest(t require.TestingT) { valAddr := sdk.ValAddress(suite.address.Bytes()) validator, err := stakingtypes.NewValidator(valAddr, privCons.PubKey(), stakingtypes.Description{}) require.NoError(t, err) - validator = stakingkeeper.TestingUpdateValidator(&suite.app.StakingKeeper, suite.ctx, validator, true) + validator = stakingkeeper.TestingUpdateValidator(suite.app.StakingKeeper.Keeper, suite.ctx, validator, true) err = suite.app.StakingKeeper.Hooks().AfterValidatorCreated(suite.ctx, validator.GetOperator()) require.NoError(t, err) err = suite.app.StakingKeeper.SetValidatorByConsAddr(suite.ctx, validator) diff --git a/x/ibc/transfer/keeper/msg_server.go b/x/ibc/transfer/keeper/msg_server.go index f17c1cfef9..b547406da3 100644 --- a/x/ibc/transfer/keeper/msg_server.go +++ b/x/ibc/transfer/keeper/msg_server.go @@ -15,7 +15,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - erc20types "github.com/evmos/evmos/v17/x/erc20/types" + erc20types "github.com/evmos/evmos/v18/x/erc20/types" ) var _ types.MsgServer = Keeper{} diff --git a/x/ibc/transfer/keeper/msg_server_test.go b/x/ibc/transfer/keeper/msg_server_test.go index b1cfc8a6c9..56cab0efcb 100644 --- a/x/ibc/transfer/keeper/msg_server_test.go +++ b/x/ibc/transfer/keeper/msg_server_test.go @@ -10,8 +10,8 @@ import ( "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" host "github.com/cosmos/ibc-go/v7/modules/core/24-host" - erc20types "github.com/evmos/evmos/v17/x/erc20/types" - "github.com/evmos/evmos/v17/x/ibc/transfer/keeper" + erc20types "github.com/evmos/evmos/v18/x/erc20/types" + "github.com/evmos/evmos/v18/x/ibc/transfer/keeper" "github.com/stretchr/testify/mock" ) diff --git a/x/ibc/transfer/module.go b/x/ibc/transfer/module.go index f8ad271846..eeaeace413 100644 --- a/x/ibc/transfer/module.go +++ b/x/ibc/transfer/module.go @@ -11,7 +11,7 @@ import ( ibctransfer "github.com/cosmos/ibc-go/v7/modules/apps/transfer" ibctransferkeeper "github.com/cosmos/ibc-go/v7/modules/apps/transfer/keeper" "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - "github.com/evmos/evmos/v17/x/ibc/transfer/keeper" + "github.com/evmos/evmos/v18/x/ibc/transfer/keeper" ) var ( diff --git a/x/ibc/transfer/types/interfaces.go b/x/ibc/transfer/types/interfaces.go index 1e17daa6a9..7e85f00663 100644 --- a/x/ibc/transfer/types/interfaces.go +++ b/x/ibc/transfer/types/interfaces.go @@ -13,7 +13,7 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - erc20types "github.com/evmos/evmos/v17/x/erc20/types" + erc20types "github.com/evmos/evmos/v18/x/erc20/types" ) // AccountKeeper defines the expected interface needed to retrieve account info. diff --git a/x/incentives/module.go b/x/incentives/module.go index cf1c958e05..8fce38de5d 100644 --- a/x/incentives/module.go +++ b/x/incentives/module.go @@ -24,7 +24,7 @@ import ( "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" - "github.com/evmos/evmos/v17/x/incentives/types" + "github.com/evmos/evmos/v18/x/incentives/types" ) // consensusVersion defines the current x/incentives module consensus version. diff --git a/x/incentives/types/genesis.pb.go b/x/incentives/types/genesis.pb.go index 50cb526b35..1bd261799f 100644 --- a/x/incentives/types/genesis.pb.go +++ b/x/incentives/types/genesis.pb.go @@ -158,29 +158,29 @@ var fileDescriptor_7bb1f7c7e8ad160b = []byte{ // 404 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x92, 0xc1, 0xea, 0xd3, 0x40, 0x10, 0x87, 0x93, 0xf6, 0x4f, 0xb1, 0xdb, 0x8a, 0x35, 0x7a, 0x88, 0x2d, 0xa6, 0xb5, 0x88, 0x14, - 0xa4, 0x1b, 0x5a, 0x0f, 0xe2, 0xc5, 0x43, 0xa8, 0x94, 0x82, 0x82, 0xa4, 0x27, 0xbd, 0x84, 0x6d, - 0x3a, 0xa6, 0x8b, 0x49, 0x36, 0x64, 0xd7, 0xa8, 0x6f, 0xe1, 0x4b, 0xf8, 0x2e, 0x3d, 0x16, 0xbc, - 0x88, 0x87, 0x22, 0xed, 0x8b, 0xc8, 0xee, 0x46, 0x93, 0x43, 0x4e, 0x5e, 0x92, 0x9d, 0xe4, 0x9b, - 0xef, 0x37, 0x09, 0x83, 0x1e, 0x41, 0x91, 0x30, 0xee, 0xd2, 0x34, 0x84, 0x54, 0xd0, 0x02, 0xb8, - 0x5b, 0x2c, 0xdc, 0x08, 0x52, 0xe0, 0x94, 0xe3, 0x2c, 0x67, 0x82, 0x59, 0xf7, 0x14, 0x82, 0x2b, - 0x04, 0x17, 0x8b, 0xe1, 0xe3, 0xa6, 0xbe, 0x1a, 0xa2, 0x5a, 0x87, 0xf7, 0x23, 0x16, 0x31, 0x75, - 0x74, 0xe5, 0x49, 0x3f, 0x9d, 0xfe, 0x30, 0x51, 0x7f, 0xad, 0x23, 0xb6, 0x82, 0x08, 0xb0, 0x5e, - 0xa0, 0x4e, 0x46, 0x72, 0x92, 0x70, 0xdb, 0x9c, 0x98, 0xb3, 0xde, 0x72, 0x84, 0x1b, 0x22, 0xf1, - 0x5b, 0x85, 0x78, 0x37, 0xc7, 0xf3, 0xd8, 0xf0, 0xcb, 0x06, 0x6b, 0x85, 0x50, 0x45, 0xd9, 0xad, - 0x49, 0x7b, 0xd6, 0x5b, 0x3a, 0x8d, 0xed, 0x9b, 0xbf, 0x55, 0x69, 0xa8, 0xf5, 0x59, 0x1e, 0x42, - 0x11, 0xe1, 0x41, 0x02, 0x02, 0x72, 0x6e, 0xb7, 0x95, 0xe5, 0x61, 0xa3, 0x65, 0x4d, 0xf8, 0x1b, - 0x49, 0x95, 0x92, 0x6e, 0x54, 0xd6, 0x7c, 0xfa, 0xbd, 0x85, 0x3a, 0x7a, 0x44, 0xeb, 0x29, 0xba, - 0x0b, 0x29, 0xd9, 0xc5, 0x10, 0xd4, 0x66, 0x93, 0x9f, 0x76, 0xcb, 0x1f, 0xe8, 0x17, 0x9b, 0x2a, - 0xfb, 0x1d, 0x1a, 0x90, 0x38, 0x66, 0x21, 0x11, 0x94, 0xa5, 0x41, 0x4c, 0x13, 0x2a, 0xec, 0xd6, - 0xc4, 0x9c, 0x75, 0x3d, 0x2c, 0x23, 0x7e, 0x9d, 0xc7, 0x4f, 0x22, 0x2a, 0x0e, 0x9f, 0x76, 0x38, - 0x64, 0x89, 0x1b, 0x32, 0x2e, 0xff, 0xbb, 0xbe, 0xcd, 0xf9, 0xfe, 0xa3, 0x2b, 0xbe, 0x66, 0xc0, - 0xf1, 0x0a, 0x42, 0xff, 0x4e, 0xe5, 0x79, 0x2d, 0x35, 0xd6, 0x4b, 0x34, 0xaa, 0x06, 0x08, 0x20, - 0x63, 0xe1, 0x21, 0xa0, 0x7b, 0x59, 0x7f, 0xa0, 0x90, 0xdb, 0x6d, 0x99, 0xe2, 0x3f, 0xa8, 0x90, - 0x57, 0x92, 0xd8, 0xfc, 0x03, 0xac, 0x2d, 0xba, 0x9d, 0xc3, 0x67, 0x92, 0xef, 0x03, 0x1e, 0x92, - 0x18, 0x72, 0xfb, 0xe6, 0xbf, 0xe6, 0xea, 0x6b, 0xc9, 0x56, 0x39, 0xbc, 0xf5, 0xf1, 0xe2, 0x98, - 0xa7, 0x8b, 0x63, 0xfe, 0xbe, 0x38, 0xe6, 0xb7, 0xab, 0x63, 0x9c, 0xae, 0x8e, 0xf1, 0xf3, 0xea, - 0x18, 0xef, 0xe7, 0x35, 0x9f, 0x5e, 0x2f, 0x7d, 0x2d, 0x16, 0xcf, 0xdd, 0x2f, 0xf5, 0x55, 0x53, - 0xea, 0x5d, 0x47, 0x6d, 0xd3, 0xb3, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x3d, 0x3d, 0xc7, 0x14, + 0xa4, 0x1b, 0x5a, 0x2f, 0x7a, 0xf1, 0x10, 0x2a, 0xa5, 0xa0, 0x20, 0xe9, 0x49, 0x2f, 0x61, 0x9b, + 0x8e, 0xe9, 0x62, 0x92, 0x0d, 0xd9, 0x35, 0xea, 0x5b, 0xf8, 0x12, 0xbe, 0x4b, 0x8f, 0x05, 0x2f, + 0xe2, 0xa1, 0x48, 0xfb, 0x22, 0xb2, 0xbb, 0xd1, 0xe4, 0x90, 0x93, 0x97, 0x64, 0x27, 0xf9, 0xe6, + 0xfb, 0x4d, 0xc2, 0xa0, 0x47, 0x50, 0x24, 0x8c, 0xbb, 0x34, 0x0d, 0x21, 0x15, 0xb4, 0x00, 0xee, + 0x16, 0x0b, 0x37, 0x82, 0x14, 0x38, 0xe5, 0x38, 0xcb, 0x99, 0x60, 0xd6, 0x3d, 0x85, 0xe0, 0x0a, + 0xc1, 0xc5, 0x62, 0xf8, 0xb8, 0xa9, 0xaf, 0x86, 0xa8, 0xd6, 0xe1, 0xfd, 0x88, 0x45, 0x4c, 0x1d, + 0x5d, 0x79, 0xd2, 0x4f, 0xa7, 0x3f, 0x4c, 0xd4, 0x5f, 0xeb, 0x88, 0xad, 0x20, 0x02, 0xac, 0x17, + 0xa8, 0x93, 0x91, 0x9c, 0x24, 0xdc, 0x36, 0x27, 0xe6, 0xac, 0xb7, 0x1c, 0xe1, 0x86, 0x48, 0xfc, + 0x56, 0x21, 0xde, 0xcd, 0xf1, 0x3c, 0x36, 0xfc, 0xb2, 0xc1, 0x5a, 0x21, 0x54, 0x51, 0x76, 0x6b, + 0xd2, 0x9e, 0xf5, 0x96, 0x4e, 0x63, 0xfb, 0xe6, 0x6f, 0x55, 0x1a, 0x6a, 0x7d, 0x96, 0x87, 0x50, + 0x44, 0x78, 0x90, 0x80, 0x80, 0x9c, 0xdb, 0x6d, 0x65, 0x79, 0xd8, 0x68, 0x59, 0x13, 0xfe, 0x46, + 0x52, 0xa5, 0xa4, 0x1b, 0x95, 0x35, 0x9f, 0x7e, 0x6f, 0xa1, 0x8e, 0x1e, 0xd1, 0x7a, 0x8a, 0xee, + 0x42, 0x4a, 0x76, 0x31, 0x04, 0xb5, 0xd9, 0xe4, 0xa7, 0xdd, 0xf2, 0x07, 0xfa, 0xc5, 0xa6, 0xca, + 0x7e, 0x87, 0x06, 0x24, 0x8e, 0x59, 0x48, 0x04, 0x65, 0x69, 0x10, 0xd3, 0x84, 0x0a, 0xbb, 0x35, + 0x31, 0x67, 0x5d, 0x0f, 0xcb, 0x88, 0x5f, 0xe7, 0xf1, 0x93, 0x88, 0x8a, 0xc3, 0xa7, 0x1d, 0x0e, + 0x59, 0xe2, 0x86, 0x8c, 0xcb, 0xff, 0xae, 0x6f, 0x73, 0xbe, 0xff, 0xe8, 0x8a, 0xaf, 0x19, 0x70, + 0xbc, 0x82, 0xd0, 0xbf, 0x53, 0x79, 0x5e, 0x4b, 0x8d, 0xf5, 0x12, 0x8d, 0xaa, 0x01, 0x02, 0xc8, + 0x58, 0x78, 0x08, 0xe8, 0x5e, 0xd6, 0x1f, 0x28, 0xe4, 0x76, 0x5b, 0xa6, 0xf8, 0x0f, 0x2a, 0xe4, + 0x95, 0x24, 0x36, 0xff, 0x00, 0x6b, 0x8b, 0x6e, 0xe7, 0xf0, 0x99, 0xe4, 0xfb, 0x80, 0x87, 0x24, + 0x86, 0xdc, 0xbe, 0xf9, 0xaf, 0xb9, 0xfa, 0x5a, 0xb2, 0x55, 0x0e, 0x6f, 0x7d, 0xbc, 0x38, 0xe6, + 0xe9, 0xe2, 0x98, 0xbf, 0x2f, 0x8e, 0xf9, 0xed, 0xea, 0x18, 0xa7, 0xab, 0x63, 0xfc, 0xbc, 0x3a, + 0xc6, 0xfb, 0x79, 0xcd, 0xa7, 0xd7, 0x4b, 0x5f, 0x8b, 0xc5, 0x73, 0xf7, 0x4b, 0x7d, 0xd5, 0x94, + 0x7a, 0xd7, 0x51, 0xdb, 0xf4, 0xec, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x86, 0x26, 0x61, 0x1d, 0xc3, 0x02, 0x00, 0x00, } diff --git a/x/incentives/types/incentives.pb.go b/x/incentives/types/incentives.pb.go index dc31434038..a84f9721fc 100644 --- a/x/incentives/types/incentives.pb.go +++ b/x/incentives/types/incentives.pb.go @@ -334,38 +334,38 @@ func init() { } var fileDescriptor_95b81e40854aec77 = []byte{ - // 489 bytes of a gzipped FileDescriptorProto + // 488 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x53, 0xbf, 0x6f, 0xd4, 0x30, 0x18, 0x4d, 0xee, 0x47, 0x75, 0xe7, 0x53, 0x19, 0x42, 0x05, 0xe1, 0x40, 0x49, 0x74, 0x02, 0x29, - 0x12, 0xaa, 0xad, 0xb4, 0x03, 0x12, 0xe3, 0x1d, 0xd2, 0x89, 0x01, 0x09, 0x45, 0x4c, 0x2c, 0x95, - 0xe3, 0x9a, 0xd4, 0x22, 0x89, 0xa3, 0xf8, 0xbb, 0x08, 0x56, 0xfe, 0x82, 0x4e, 0xcc, 0xcc, 0xfc, - 0x25, 0x1d, 0x3b, 0x32, 0x51, 0x74, 0xb7, 0xf0, 0x67, 0x20, 0x3b, 0x49, 0x49, 0x97, 0x8e, 0xb7, - 0x24, 0x7e, 0xcf, 0xfe, 0xf4, 0xde, 0xfb, 0x3e, 0x1b, 0x3d, 0xe7, 0x75, 0x2e, 0x15, 0x11, 0x05, - 0xe3, 0x05, 0x88, 0x9a, 0x2b, 0x52, 0x47, 0x3d, 0x84, 0xcb, 0x4a, 0x82, 0x74, 0x1e, 0x9a, 0x53, - 0xb8, 0xc7, 0xd7, 0xd1, 0xdc, 0x63, 0x52, 0xe9, 0xda, 0x84, 0x2a, 0x4e, 0xea, 0x28, 0xe1, 0x40, - 0x23, 0xc2, 0xa4, 0x28, 0x9a, 0xa2, 0xf9, 0x51, 0x2a, 0x53, 0x69, 0x96, 0x44, 0xaf, 0x5a, 0xd6, - 0x4f, 0xa5, 0x4c, 0x33, 0x4e, 0x0c, 0x4a, 0x36, 0x9f, 0x08, 0x88, 0x9c, 0x2b, 0xa0, 0x79, 0xd9, - 0x1c, 0x58, 0x7c, 0x1f, 0xa0, 0xe9, 0xdb, 0x4e, 0xc8, 0x99, 0xa3, 0x09, 0x93, 0x05, 0x54, 0x94, - 0x81, 0x6b, 0x07, 0x76, 0x38, 0x8d, 0x6f, 0xb1, 0xa3, 0xd0, 0x8c, 0x66, 0x99, 0x64, 0x14, 0x84, - 0x2c, 0x94, 0x3b, 0x08, 0x86, 0xe1, 0xec, 0xe4, 0x19, 0x6e, 0x6c, 0x61, 0x6d, 0x0b, 0xb7, 0xb6, - 0xf0, 0x1b, 0xce, 0x56, 0x52, 0x14, 0xcb, 0xd3, 0xab, 0xdf, 0xbe, 0xf5, 0xf3, 0xc6, 0x7f, 0x99, - 0x0a, 0xb8, 0xd8, 0x24, 0x98, 0xc9, 0x9c, 0xb4, 0x31, 0x9a, 0xdf, 0xb1, 0x3a, 0xff, 0x4c, 0xe0, - 0x6b, 0xc9, 0x55, 0x57, 0xa3, 0xe2, 0xbe, 0x8a, 0xf3, 0x08, 0x1d, 0xf0, 0x52, 0xb2, 0x0b, 0xe5, - 0x0e, 0x03, 0x3b, 0x3c, 0x8c, 0x5b, 0xe4, 0xac, 0x10, 0x52, 0x40, 0x2b, 0x38, 0xd3, 0x79, 0xdc, - 0x51, 0x60, 0x87, 0xb3, 0x93, 0x39, 0x6e, 0xc2, 0xe2, 0x2e, 0x2c, 0xfe, 0xd0, 0x85, 0x5d, 0x4e, - 0xb4, 0x93, 0xcb, 0x1b, 0xdf, 0x8e, 0xa7, 0xa6, 0x4e, 0xef, 0x38, 0x4f, 0xd1, 0x14, 0x24, 0xd0, - 0xec, 0x2c, 0xa5, 0xca, 0x1d, 0x07, 0x76, 0x38, 0x8a, 0x27, 0x86, 0x58, 0x53, 0xb5, 0x90, 0x68, - 0xb2, 0xa6, 0xea, 0x1d, 0x07, 0x5e, 0xdd, 0xdb, 0x96, 0x00, 0xcd, 0x4a, 0x5a, 0x81, 0x60, 0xa2, - 0xa4, 0x05, 0xb8, 0x03, 0xb3, 0xdd, 0xa7, 0x9c, 0x17, 0xe8, 0x01, 0xdb, 0xe4, 0x9b, 0x8c, 0xea, - 0x16, 0x1b, 0xad, 0xa1, 0xd1, 0x3a, 0xfc, 0xcf, 0x6a, 0xc1, 0x6f, 0x03, 0xf4, 0x24, 0xe6, 0xa9, - 0x50, 0xc0, 0xab, 0xdb, 0x89, 0xbc, 0xaf, 0x64, 0x29, 0x15, 0xcd, 0x9c, 0x23, 0x34, 0x06, 0x01, - 0x19, 0x6f, 0xf5, 0x1b, 0xa0, 0xc5, 0xcf, 0xb9, 0x62, 0x95, 0x28, 0x75, 0xbb, 0x3a, 0xf1, 0x1e, - 0x75, 0xc7, 0xfa, 0xf0, 0xfe, 0x89, 0x8e, 0xf6, 0x3c, 0xd1, 0x71, 0x7f, 0xa2, 0xaf, 0x47, 0x7f, - 0x7f, 0xf8, 0xd6, 0x42, 0xa1, 0xc7, 0x2b, 0x5a, 0x30, 0x9e, 0xed, 0xa5, 0x03, 0x8d, 0xe8, 0x72, - 0x7d, 0xb5, 0xf5, 0xec, 0xeb, 0xad, 0x67, 0xff, 0xd9, 0x7a, 0xf6, 0xe5, 0xce, 0xb3, 0xae, 0x77, - 0x9e, 0xf5, 0x6b, 0xe7, 0x59, 0x1f, 0x8f, 0x7b, 0x31, 0x9b, 0xa7, 0xdb, 0x7c, 0xeb, 0xe8, 0x15, - 0xf9, 0xd2, 0x7f, 0xc6, 0x26, 0x71, 0x72, 0x60, 0x6e, 0xde, 0xe9, 0xbf, 0x00, 0x00, 0x00, 0xff, - 0xff, 0x4c, 0x1a, 0x21, 0xfd, 0xe7, 0x03, 0x00, 0x00, + 0x12, 0xaa, 0xad, 0xb4, 0x0b, 0x62, 0xbc, 0x43, 0x3a, 0x31, 0x20, 0xa1, 0x88, 0x89, 0xa5, 0x72, + 0x5c, 0x93, 0x5a, 0x24, 0x71, 0x14, 0x7f, 0x17, 0xc1, 0xca, 0x5f, 0xd0, 0x89, 0x99, 0x99, 0xbf, + 0xa4, 0x63, 0x47, 0x26, 0x8a, 0xee, 0x16, 0xfe, 0x0c, 0x64, 0x27, 0x29, 0xe9, 0xd2, 0xf1, 0x96, + 0xc4, 0xef, 0xd9, 0x9f, 0xde, 0x7b, 0xdf, 0x67, 0xa3, 0xe7, 0xbc, 0xce, 0xa5, 0x22, 0xa2, 0x60, + 0xbc, 0x00, 0x51, 0x73, 0x45, 0xea, 0xa8, 0x87, 0x70, 0x59, 0x49, 0x90, 0xce, 0x43, 0x73, 0x0a, + 0xf7, 0xf8, 0x3a, 0x9a, 0x7b, 0x4c, 0x2a, 0x5d, 0x9b, 0x50, 0xc5, 0x49, 0x1d, 0x25, 0x1c, 0x68, + 0x44, 0x98, 0x14, 0x45, 0x53, 0x34, 0x3f, 0x4a, 0x65, 0x2a, 0xcd, 0x92, 0xe8, 0x55, 0xcb, 0xfa, + 0xa9, 0x94, 0x69, 0xc6, 0x89, 0x41, 0xc9, 0xe6, 0x13, 0x01, 0x91, 0x73, 0x05, 0x34, 0x2f, 0x9b, + 0x03, 0x8b, 0xef, 0x03, 0x34, 0x7d, 0xdb, 0x09, 0x39, 0x73, 0x34, 0x61, 0xb2, 0x80, 0x8a, 0x32, + 0x70, 0xed, 0xc0, 0x0e, 0xa7, 0xf1, 0x2d, 0x76, 0x14, 0x9a, 0xd1, 0x2c, 0x93, 0x8c, 0x82, 0x90, + 0x85, 0x72, 0x07, 0xc1, 0x30, 0x9c, 0x9d, 0x3c, 0xc3, 0x8d, 0x2d, 0xac, 0x6d, 0xe1, 0xd6, 0x16, + 0x7e, 0xc3, 0xd9, 0x4a, 0x8a, 0x62, 0x79, 0x7a, 0xf5, 0xdb, 0xb7, 0x7e, 0xde, 0xf8, 0x2f, 0x53, + 0x01, 0x17, 0x9b, 0x04, 0x33, 0x99, 0x93, 0x36, 0x46, 0xf3, 0x3b, 0x56, 0xe7, 0x9f, 0x09, 0x7c, + 0x2d, 0xb9, 0xea, 0x6a, 0x54, 0xdc, 0x57, 0x71, 0x1e, 0xa1, 0x03, 0x5e, 0x4a, 0x76, 0xa1, 0xdc, + 0x61, 0x60, 0x87, 0x87, 0x71, 0x8b, 0x9c, 0x15, 0x42, 0x0a, 0x68, 0x05, 0x67, 0x3a, 0x8f, 0x3b, + 0x0a, 0xec, 0x70, 0x76, 0x32, 0xc7, 0x4d, 0x58, 0xdc, 0x85, 0xc5, 0x1f, 0xba, 0xb0, 0xcb, 0x89, + 0x76, 0x72, 0x79, 0xe3, 0xdb, 0xf1, 0xd4, 0xd4, 0xe9, 0x1d, 0xe7, 0x29, 0x9a, 0x82, 0x04, 0x9a, + 0x9d, 0xa5, 0x54, 0xb9, 0xe3, 0xc0, 0x0e, 0x47, 0xf1, 0xc4, 0x10, 0x6b, 0xaa, 0x16, 0x12, 0x4d, + 0xd6, 0x54, 0xbd, 0xe3, 0xc0, 0xab, 0x7b, 0xdb, 0x12, 0xa0, 0x59, 0x49, 0x2b, 0x10, 0x4c, 0x94, + 0xb4, 0x00, 0x77, 0x60, 0xb6, 0xfb, 0x94, 0xf3, 0x02, 0x3d, 0x60, 0x9b, 0x7c, 0x93, 0x51, 0xdd, + 0x62, 0xa3, 0x35, 0x34, 0x5a, 0x87, 0xff, 0x59, 0x2d, 0xf8, 0x6d, 0x80, 0x9e, 0xc4, 0x3c, 0x15, + 0x0a, 0x78, 0x75, 0x3b, 0x91, 0xf7, 0x95, 0x2c, 0xa5, 0xa2, 0x99, 0x73, 0x84, 0xc6, 0x20, 0x20, + 0xe3, 0xad, 0x7e, 0x03, 0xb4, 0xf8, 0x39, 0x57, 0xac, 0x12, 0xa5, 0x6e, 0x57, 0x27, 0xde, 0xa3, + 0xee, 0x58, 0x1f, 0xde, 0x3f, 0xd1, 0xd1, 0x9e, 0x27, 0x3a, 0xee, 0x4f, 0xf4, 0xf5, 0xe8, 0xef, + 0x0f, 0xdf, 0x5a, 0x28, 0xf4, 0x78, 0x45, 0x0b, 0xc6, 0xb3, 0xbd, 0x74, 0xa0, 0x11, 0x5d, 0xae, + 0xaf, 0xb6, 0x9e, 0x7d, 0xbd, 0xf5, 0xec, 0x3f, 0x5b, 0xcf, 0xbe, 0xdc, 0x79, 0xd6, 0xf5, 0xce, + 0xb3, 0x7e, 0xed, 0x3c, 0xeb, 0xe3, 0x71, 0x2f, 0x66, 0xf3, 0x74, 0x9b, 0x6f, 0x1d, 0xbd, 0x22, + 0x5f, 0xfa, 0xcf, 0xd8, 0x24, 0x4e, 0x0e, 0xcc, 0xcd, 0x3b, 0xfd, 0x17, 0x00, 0x00, 0xff, 0xff, + 0xf7, 0x01, 0x87, 0xf4, 0xe7, 0x03, 0x00, 0x00, } func (m *Incentive) Marshal() (dAtA []byte, err error) { diff --git a/x/incentives/types/proposal.go b/x/incentives/types/proposal.go index 122aa25bad..3958d54d1e 100644 --- a/x/incentives/types/proposal.go +++ b/x/incentives/types/proposal.go @@ -8,7 +8,7 @@ import ( govcdc "github.com/cosmos/cosmos-sdk/x/gov/codec" govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - evmostypes "github.com/evmos/evmos/v17/types" + evmostypes "github.com/evmos/evmos/v18/types" ) // constants diff --git a/x/inflation/v1/client/cli/query.go b/x/inflation/v1/client/cli/query.go index 7e26511e8c..5a975cbea7 100644 --- a/x/inflation/v1/client/cli/query.go +++ b/x/inflation/v1/client/cli/query.go @@ -11,7 +11,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/evmos/evmos/v17/x/inflation/v1/types" + "github.com/evmos/evmos/v18/x/inflation/v1/types" ) // GetQueryCmd returns the cli query commands for the inflation module. diff --git a/x/inflation/v1/genesis.go b/x/inflation/v1/genesis.go index e19e10d5a2..4d0e0b7cd0 100644 --- a/x/inflation/v1/genesis.go +++ b/x/inflation/v1/genesis.go @@ -6,8 +6,8 @@ package inflation import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/x/inflation/v1/keeper" - "github.com/evmos/evmos/v17/x/inflation/v1/types" + "github.com/evmos/evmos/v18/x/inflation/v1/keeper" + "github.com/evmos/evmos/v18/x/inflation/v1/types" ) // InitGenesis import module genesis diff --git a/x/inflation/v1/keeper/epoch_info.go b/x/inflation/v1/keeper/epoch_info.go index afb75f4b4f..6e97d06e1e 100644 --- a/x/inflation/v1/keeper/epoch_info.go +++ b/x/inflation/v1/keeper/epoch_info.go @@ -5,7 +5,7 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/x/inflation/v1/types" + "github.com/evmos/evmos/v18/x/inflation/v1/types" ) // GetEpochIdentifier gets the epoch identifier diff --git a/x/inflation/v1/keeper/epoch_info_test.go b/x/inflation/v1/keeper/epoch_info_test.go index 840da3d7cd..ecee3d74d6 100644 --- a/x/inflation/v1/keeper/epoch_info_test.go +++ b/x/inflation/v1/keeper/epoch_info_test.go @@ -3,8 +3,8 @@ package keeper_test import ( "fmt" - epochstypes "github.com/evmos/evmos/v17/x/epochs/types" - "github.com/evmos/evmos/v17/x/inflation/v1/types" + epochstypes "github.com/evmos/evmos/v18/x/epochs/types" + "github.com/evmos/evmos/v18/x/inflation/v1/types" ) func (suite *KeeperTestSuite) TestSetGetEpochIdentifier() { diff --git a/x/inflation/v1/keeper/grpc_query.go b/x/inflation/v1/keeper/grpc_query.go index 59c29d2163..d39cce58a2 100644 --- a/x/inflation/v1/keeper/grpc_query.go +++ b/x/inflation/v1/keeper/grpc_query.go @@ -7,7 +7,7 @@ import ( "context" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/x/inflation/v1/types" + "github.com/evmos/evmos/v18/x/inflation/v1/types" ) var _ types.QueryServer = Keeper{} diff --git a/x/inflation/v1/keeper/grpc_query_test.go b/x/inflation/v1/keeper/grpc_query_test.go index 76c6817664..da32ac0086 100644 --- a/x/inflation/v1/keeper/grpc_query_test.go +++ b/x/inflation/v1/keeper/grpc_query_test.go @@ -6,8 +6,8 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" - evmostypes "github.com/evmos/evmos/v17/types" - "github.com/evmos/evmos/v17/x/inflation/v1/types" + evmostypes "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v18/x/inflation/v1/types" ) func (suite *KeeperTestSuite) TestPeriod() { //nolint:dupl diff --git a/x/inflation/v1/keeper/hooks.go b/x/inflation/v1/keeper/hooks.go index 136e44f2d5..c3639aa649 100644 --- a/x/inflation/v1/keeper/hooks.go +++ b/x/inflation/v1/keeper/hooks.go @@ -10,8 +10,8 @@ import ( "github.com/cosmos/cosmos-sdk/telemetry" sdk "github.com/cosmos/cosmos-sdk/types" - epochstypes "github.com/evmos/evmos/v17/x/epochs/types" - "github.com/evmos/evmos/v17/x/inflation/v1/types" + epochstypes "github.com/evmos/evmos/v18/x/epochs/types" + "github.com/evmos/evmos/v18/x/inflation/v1/types" ) // BeforeEpochStart: noop, We don't need to do anything here diff --git a/x/inflation/v1/keeper/hooks_test.go b/x/inflation/v1/keeper/hooks_test.go index 00a49e9326..6da7dd2e5f 100644 --- a/x/inflation/v1/keeper/hooks_test.go +++ b/x/inflation/v1/keeper/hooks_test.go @@ -4,8 +4,8 @@ import ( "fmt" "time" - epochstypes "github.com/evmos/evmos/v17/x/epochs/types" - "github.com/evmos/evmos/v17/x/inflation/v1/types" + epochstypes "github.com/evmos/evmos/v18/x/epochs/types" + "github.com/evmos/evmos/v18/x/inflation/v1/types" ) func (suite *KeeperTestSuite) TestEpochIdentifierAfterEpochEnd() { diff --git a/x/inflation/v1/keeper/inflation.go b/x/inflation/v1/keeper/inflation.go index cbbff291c6..21821d3adf 100644 --- a/x/inflation/v1/keeper/inflation.go +++ b/x/inflation/v1/keeper/inflation.go @@ -7,10 +7,10 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" - evmostypes "github.com/evmos/evmos/v17/types" + evmostypes "github.com/evmos/evmos/v18/types" - utils "github.com/evmos/evmos/v17/utils" - "github.com/evmos/evmos/v17/x/inflation/v1/types" + utils "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v18/x/inflation/v1/types" ) // 200M token at year 4 allocated to the team diff --git a/x/inflation/v1/keeper/inflation_test.go b/x/inflation/v1/keeper/inflation_test.go index a7eedabf1d..2445af2fee 100644 --- a/x/inflation/v1/keeper/inflation_test.go +++ b/x/inflation/v1/keeper/inflation_test.go @@ -6,8 +6,8 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - evmostypes "github.com/evmos/evmos/v17/types" - "github.com/evmos/evmos/v17/x/inflation/v1/types" + evmostypes "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v18/x/inflation/v1/types" ) func (suite *KeeperTestSuite) TestMintAndAllocateInflation() { diff --git a/x/inflation/v1/keeper/integration_test.go b/x/inflation/v1/keeper/integration_test.go index d9f72ea7ed..0a51a21c69 100644 --- a/x/inflation/v1/keeper/integration_test.go +++ b/x/inflation/v1/keeper/integration_test.go @@ -10,8 +10,8 @@ import ( //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/gomega" - epochstypes "github.com/evmos/evmos/v17/x/epochs/types" - "github.com/evmos/evmos/v17/x/inflation/v1/types" + epochstypes "github.com/evmos/evmos/v18/x/epochs/types" + "github.com/evmos/evmos/v18/x/inflation/v1/types" ) var ( diff --git a/x/inflation/v1/keeper/keeper.go b/x/inflation/v1/keeper/keeper.go index ad43beea7b..3ed737111f 100644 --- a/x/inflation/v1/keeper/keeper.go +++ b/x/inflation/v1/keeper/keeper.go @@ -9,7 +9,7 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/x/inflation/v1/types" + "github.com/evmos/evmos/v18/x/inflation/v1/types" ) // Keeper of the inflation store diff --git a/x/inflation/v1/keeper/migrations.go b/x/inflation/v1/keeper/migrations.go index eb4433f23c..5969e3d556 100644 --- a/x/inflation/v1/keeper/migrations.go +++ b/x/inflation/v1/keeper/migrations.go @@ -5,9 +5,9 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" - v2 "github.com/evmos/evmos/v17/x/inflation/v1/migrations/v2" - v3 "github.com/evmos/evmos/v17/x/inflation/v1/migrations/v3" - "github.com/evmos/evmos/v17/x/inflation/v1/types" + v2 "github.com/evmos/evmos/v18/x/inflation/v1/migrations/v2" + v3 "github.com/evmos/evmos/v18/x/inflation/v1/migrations/v3" + "github.com/evmos/evmos/v18/x/inflation/v1/types" ) // Migrator is a struct for handling in-place store migrations. diff --git a/x/inflation/v1/keeper/migrations_test.go b/x/inflation/v1/keeper/migrations_test.go index d12eaf7ed0..1543d7be24 100644 --- a/x/inflation/v1/keeper/migrations_test.go +++ b/x/inflation/v1/keeper/migrations_test.go @@ -7,11 +7,11 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/encoding" - inflationkeeper "github.com/evmos/evmos/v17/x/inflation/v1/keeper" - v2types "github.com/evmos/evmos/v17/x/inflation/v1/migrations/v2/types" - "github.com/evmos/evmos/v17/x/inflation/v1/types" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/encoding" + inflationkeeper "github.com/evmos/evmos/v18/x/inflation/v1/keeper" + v2types "github.com/evmos/evmos/v18/x/inflation/v1/migrations/v2/types" + "github.com/evmos/evmos/v18/x/inflation/v1/types" ) type mockSubspace struct { diff --git a/x/inflation/v1/keeper/msg_server.go b/x/inflation/v1/keeper/msg_server.go index 608e525a50..00c5604a5b 100644 --- a/x/inflation/v1/keeper/msg_server.go +++ b/x/inflation/v1/keeper/msg_server.go @@ -9,7 +9,7 @@ import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - "github.com/evmos/evmos/v17/x/inflation/v1/types" + "github.com/evmos/evmos/v18/x/inflation/v1/types" ) var _ types.MsgServer = &Keeper{} diff --git a/x/inflation/v1/keeper/msg_server_test.go b/x/inflation/v1/keeper/msg_server_test.go index 85bb427a1e..2f71d9197f 100644 --- a/x/inflation/v1/keeper/msg_server_test.go +++ b/x/inflation/v1/keeper/msg_server_test.go @@ -3,7 +3,7 @@ package keeper_test import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - "github.com/evmos/evmos/v17/x/inflation/v1/types" + "github.com/evmos/evmos/v18/x/inflation/v1/types" ) func (suite *KeeperTestSuite) TestUpdateParams() { diff --git a/x/inflation/v1/keeper/params.go b/x/inflation/v1/keeper/params.go index c379967690..1197df6585 100644 --- a/x/inflation/v1/keeper/params.go +++ b/x/inflation/v1/keeper/params.go @@ -5,7 +5,7 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/x/inflation/v1/types" + "github.com/evmos/evmos/v18/x/inflation/v1/types" ) // GetParams returns the total set of inflation parameters. diff --git a/x/inflation/v1/keeper/params_test.go b/x/inflation/v1/keeper/params_test.go index 9de61872df..97a9f67c5b 100644 --- a/x/inflation/v1/keeper/params_test.go +++ b/x/inflation/v1/keeper/params_test.go @@ -1,7 +1,7 @@ package keeper_test import ( - "github.com/evmos/evmos/v17/x/inflation/v1/types" + "github.com/evmos/evmos/v18/x/inflation/v1/types" ) func (suite *KeeperTestSuite) TestParams() { diff --git a/x/inflation/v1/keeper/periods.go b/x/inflation/v1/keeper/periods.go index 88ddf41a78..e125b35c9f 100644 --- a/x/inflation/v1/keeper/periods.go +++ b/x/inflation/v1/keeper/periods.go @@ -5,7 +5,7 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/x/inflation/v1/types" + "github.com/evmos/evmos/v18/x/inflation/v1/types" ) // GetPeriod gets current period diff --git a/x/inflation/v1/keeper/setup_test.go b/x/inflation/v1/keeper/setup_test.go index 9d63c1dbab..6e86ecfd68 100644 --- a/x/inflation/v1/keeper/setup_test.go +++ b/x/inflation/v1/keeper/setup_test.go @@ -11,10 +11,10 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/suite" - evm "github.com/evmos/evmos/v17/x/evm/types" + evm "github.com/evmos/evmos/v18/x/evm/types" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/x/inflation/v1/types" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/x/inflation/v1/types" ) var denomMint = types.DefaultInflationDenom diff --git a/x/inflation/v1/keeper/utils_test.go b/x/inflation/v1/keeper/utils_test.go index abbec74343..328f5657f6 100644 --- a/x/inflation/v1/keeper/utils_test.go +++ b/x/inflation/v1/keeper/utils_test.go @@ -4,12 +4,12 @@ import ( "time" "github.com/cosmos/cosmos-sdk/baseapp" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/testutil" - utils "github.com/evmos/evmos/v17/utils" - epochstypes "github.com/evmos/evmos/v17/x/epochs/types" - evm "github.com/evmos/evmos/v17/x/evm/types" - "github.com/evmos/evmos/v17/x/inflation/v1/types" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/testutil" + utils "github.com/evmos/evmos/v18/utils" + epochstypes "github.com/evmos/evmos/v18/x/epochs/types" + evm "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v18/x/inflation/v1/types" ) // Test helpers diff --git a/x/inflation/v1/migrations/v2/migrate.go b/x/inflation/v1/migrations/v2/migrate.go index bdb8862fce..430818a913 100644 --- a/x/inflation/v1/migrations/v2/migrate.go +++ b/x/inflation/v1/migrations/v2/migrate.go @@ -7,8 +7,8 @@ import ( "github.com/cosmos/cosmos-sdk/codec" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - v2types "github.com/evmos/evmos/v17/x/inflation/v1/migrations/v2/types" - "github.com/evmos/evmos/v17/x/inflation/v1/types" + v2types "github.com/evmos/evmos/v18/x/inflation/v1/migrations/v2/types" + "github.com/evmos/evmos/v18/x/inflation/v1/types" ) // MigrateStore migrates the x/inflation module state from the consensus version 1 to diff --git a/x/inflation/v1/migrations/v2/migrate_test.go b/x/inflation/v1/migrations/v2/migrate_test.go index 007213420a..8f3309b508 100644 --- a/x/inflation/v1/migrations/v2/migrate_test.go +++ b/x/inflation/v1/migrations/v2/migrate_test.go @@ -6,14 +6,14 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - v2 "github.com/evmos/evmos/v17/x/inflation/v1/migrations/v2" - "github.com/evmos/evmos/v17/x/inflation/v1/types" + v2 "github.com/evmos/evmos/v18/x/inflation/v1/migrations/v2" + "github.com/evmos/evmos/v18/x/inflation/v1/types" "github.com/cosmos/cosmos-sdk/testutil" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/encoding" - v2types "github.com/evmos/evmos/v17/x/inflation/v1/migrations/v2/types" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/encoding" + v2types "github.com/evmos/evmos/v18/x/inflation/v1/migrations/v2/types" "github.com/stretchr/testify/require" ) diff --git a/x/inflation/v1/migrations/v2/types/params.go b/x/inflation/v1/migrations/v2/types/params.go index 974f8c2c16..f4b121d9aa 100644 --- a/x/inflation/v1/migrations/v2/types/params.go +++ b/x/inflation/v1/migrations/v2/types/params.go @@ -11,8 +11,8 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - evm "github.com/evmos/evmos/v17/x/evm/types" - "github.com/evmos/evmos/v17/x/inflation/v1/types" + evm "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v18/x/inflation/v1/types" ) var _ types.LegacyParams = &V2Params{} diff --git a/x/inflation/v1/migrations/v3/migrate_test.go b/x/inflation/v1/migrations/v3/migrate_test.go index 7394940a9d..d648334e00 100644 --- a/x/inflation/v1/migrations/v3/migrate_test.go +++ b/x/inflation/v1/migrations/v3/migrate_test.go @@ -5,8 +5,8 @@ import ( "github.com/cosmos/cosmos-sdk/testutil" sdk "github.com/cosmos/cosmos-sdk/types" - v3 "github.com/evmos/evmos/v17/x/inflation/v1/migrations/v3" - "github.com/evmos/evmos/v17/x/inflation/v1/types" + v3 "github.com/evmos/evmos/v18/x/inflation/v1/migrations/v3" + "github.com/evmos/evmos/v18/x/inflation/v1/types" "github.com/stretchr/testify/require" ) diff --git a/x/inflation/v1/module.go b/x/inflation/v1/module.go index 8e5b3db200..d9246069a2 100644 --- a/x/inflation/v1/module.go +++ b/x/inflation/v1/module.go @@ -21,9 +21,9 @@ import ( "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" - "github.com/evmos/evmos/v17/x/inflation/v1/client/cli" - "github.com/evmos/evmos/v17/x/inflation/v1/keeper" - "github.com/evmos/evmos/v17/x/inflation/v1/types" + "github.com/evmos/evmos/v18/x/inflation/v1/client/cli" + "github.com/evmos/evmos/v18/x/inflation/v1/keeper" + "github.com/evmos/evmos/v18/x/inflation/v1/types" ) // consensusVersion defines the current x/inflation module consensus version. diff --git a/x/inflation/v1/types/genesis.go b/x/inflation/v1/types/genesis.go index 8f7f66594c..74b76cbc2f 100644 --- a/x/inflation/v1/types/genesis.go +++ b/x/inflation/v1/types/genesis.go @@ -6,7 +6,7 @@ package types import ( fmt "fmt" - epochstypes "github.com/evmos/evmos/v17/x/epochs/types" + epochstypes "github.com/evmos/evmos/v18/x/epochs/types" ) // NewGenesisState creates a new GenesisState object diff --git a/x/inflation/v1/types/genesis.pb.go b/x/inflation/v1/types/genesis.pb.go index 41b54fc9a1..9d953387e3 100644 --- a/x/inflation/v1/types/genesis.pb.go +++ b/x/inflation/v1/types/genesis.pb.go @@ -189,30 +189,30 @@ var fileDescriptor_1cb8eee530db1235 = []byte{ // 414 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x52, 0x4d, 0x6f, 0xd3, 0x40, 0x10, 0xcd, 0x36, 0xc1, 0x22, 0x5b, 0xa0, 0xb0, 0x82, 0x60, 0x45, 0xc2, 0x58, 0x91, 0x90, 0xdc, - 0x1e, 0x6c, 0xa5, 0x1c, 0xe0, 0x5c, 0x5a, 0xa1, 0xdc, 0x22, 0x73, 0xe3, 0xb2, 0xf2, 0xc7, 0xc4, - 0x5d, 0x61, 0xef, 0xae, 0xbc, 0x1b, 0xab, 0xfc, 0x0b, 0xfe, 0x04, 0xff, 0xa5, 0xc7, 0x1e, 0x39, - 0x55, 0x28, 0xf9, 0x23, 0xc8, 0xbb, 0xc6, 0x01, 0xd5, 0x17, 0xcb, 0xfb, 0xde, 0x9b, 0xf7, 0x66, - 0x46, 0x83, 0x7d, 0x68, 0x2a, 0xa1, 0x22, 0xc6, 0x37, 0x65, 0xa2, 0x99, 0xe0, 0x51, 0xb3, 0x8c, - 0x0a, 0xe0, 0xa0, 0x98, 0x0a, 0x65, 0x2d, 0xb4, 0x20, 0xc4, 0x28, 0xc2, 0x5e, 0x11, 0x36, 0xcb, - 0xf9, 0xcb, 0x42, 0x14, 0xc2, 0xd0, 0x51, 0xfb, 0x67, 0x95, 0xf3, 0xc5, 0x80, 0xd7, 0xa1, 0xcc, - 0x68, 0x16, 0xf7, 0x08, 0x3f, 0xf9, 0x6c, 0xfd, 0xbf, 0xe8, 0x44, 0x03, 0xf9, 0x88, 0x1d, 0x99, - 0xd4, 0x49, 0xa5, 0x5c, 0xe4, 0xa3, 0xe0, 0xf8, 0x7c, 0x1e, 0x3e, 0xcc, 0x0b, 0xd7, 0x46, 0x71, - 0x31, 0xb9, 0xbd, 0x7f, 0x3b, 0x8a, 0x3b, 0x3d, 0x99, 0x61, 0x47, 0x42, 0xcd, 0x44, 0xee, 0x1e, - 0xf9, 0x28, 0x98, 0xc4, 0xdd, 0x8b, 0x9c, 0xe2, 0xe7, 0x20, 0x45, 0x76, 0x4d, 0x59, 0x0e, 0x5c, - 0xb3, 0x0d, 0x83, 0xda, 0x1d, 0xfb, 0x28, 0x98, 0xc6, 0x27, 0x06, 0x5f, 0xf5, 0x30, 0x39, 0xc3, - 0x2f, 0x0c, 0xa4, 0xa8, 0x84, 0x9a, 0x76, 0x6e, 0x13, 0x1f, 0x05, 0xe3, 0x4e, 0xab, 0xd6, 0x50, - 0xaf, 0xad, 0xed, 0x3b, 0xfc, 0x4c, 0x7d, 0x63, 0x52, 0x42, 0x4e, 0x2d, 0xe5, 0x3e, 0x32, 0xb1, - 0x4f, 0x3b, 0xf4, 0xca, 0x80, 0x8b, 0x9f, 0x47, 0xd8, 0xb1, 0xed, 0x92, 0x37, 0x18, 0x57, 0x8c, - 0x6b, 0x9a, 0x03, 0x17, 0x95, 0x19, 0x6f, 0x1a, 0x4f, 0x5b, 0xe4, 0xb2, 0x05, 0x08, 0xc3, 0xaf, - 0xe1, 0x46, 0x0a, 0xde, 0x76, 0x93, 0x94, 0x34, 0x4b, 0xca, 0x6c, 0x6b, 0x47, 0x36, 0x03, 0x1d, - 0x9f, 0x9f, 0x0d, 0xad, 0xe2, 0xea, 0x50, 0xf2, 0xe9, 0x50, 0xd1, 0xad, 0x66, 0x06, 0x83, 0x2c, - 0xd9, 0xe0, 0x59, 0x6f, 0x42, 0x73, 0xa6, 0x74, 0xcd, 0xd2, 0xad, 0x49, 0x1a, 0x9b, 0xa4, 0xd3, - 0xa1, 0xa4, 0xd5, 0xdf, 0xc7, 0xe5, 0x3f, 0x05, 0x5d, 0xd0, 0x2b, 0x36, 0x44, 0x9a, 0xd5, 0xf3, - 0x24, 0x2d, 0x81, 0xf6, 0xbc, 0x59, 0xe7, 0xe3, 0xf8, 0xc4, 0xe2, 0xbd, 0xe7, 0xc5, 0xea, 0x76, - 0xe7, 0xa1, 0xbb, 0x9d, 0x87, 0x7e, 0xef, 0x3c, 0xf4, 0x63, 0xef, 0x8d, 0xee, 0xf6, 0xde, 0xe8, - 0xd7, 0xde, 0x1b, 0x7d, 0x8d, 0x0a, 0xa6, 0xaf, 0xb7, 0x69, 0x98, 0x89, 0x2a, 0xb2, 0x17, 0x65, - 0xbf, 0xcd, 0xf2, 0x43, 0x74, 0xf3, 0xff, 0x75, 0xe9, 0xef, 0x12, 0x54, 0xea, 0x98, 0xd3, 0x7a, - 0xff, 0x27, 0x00, 0x00, 0xff, 0xff, 0x2a, 0x80, 0xe9, 0xbd, 0xcc, 0x02, 0x00, 0x00, + 0x1e, 0x6c, 0xa5, 0x5c, 0x7a, 0x2e, 0xad, 0x50, 0x6e, 0x91, 0xb9, 0x71, 0x59, 0xf9, 0x63, 0xe2, + 0xae, 0xb0, 0x77, 0x57, 0xde, 0x8d, 0x55, 0xfe, 0x05, 0x7f, 0x82, 0xff, 0xd2, 0x63, 0x8f, 0x9c, + 0x2a, 0x94, 0xfc, 0x11, 0xe4, 0x5d, 0xe3, 0x80, 0xea, 0x8b, 0xe5, 0x7d, 0xef, 0xcd, 0x7b, 0x33, + 0xa3, 0xc1, 0x3e, 0x34, 0x95, 0x50, 0x11, 0xe3, 0x9b, 0x32, 0xd1, 0x4c, 0xf0, 0xa8, 0x59, 0x46, + 0x05, 0x70, 0x50, 0x4c, 0x85, 0xb2, 0x16, 0x5a, 0x10, 0x62, 0x14, 0x61, 0xaf, 0x08, 0x9b, 0xe5, + 0xfc, 0x75, 0x21, 0x0a, 0x61, 0xe8, 0xa8, 0xfd, 0xb3, 0xca, 0xf9, 0x62, 0xc0, 0xeb, 0x50, 0x66, + 0x34, 0x8b, 0x07, 0x84, 0x9f, 0x7d, 0xb6, 0xfe, 0x5f, 0x74, 0xa2, 0x81, 0x5c, 0x60, 0x47, 0x26, + 0x75, 0x52, 0x29, 0x17, 0xf9, 0x28, 0x38, 0x3e, 0x9f, 0x87, 0x8f, 0xf3, 0xc2, 0xb5, 0x51, 0x5c, + 0x4e, 0xee, 0x1e, 0xde, 0x8f, 0xe2, 0x4e, 0x4f, 0x66, 0xd8, 0x91, 0x50, 0x33, 0x91, 0xbb, 0x47, + 0x3e, 0x0a, 0x26, 0x71, 0xf7, 0x22, 0xa7, 0xf8, 0x25, 0x48, 0x91, 0xdd, 0x50, 0x96, 0x03, 0xd7, + 0x6c, 0xc3, 0xa0, 0x76, 0xc7, 0x3e, 0x0a, 0xa6, 0xf1, 0x89, 0xc1, 0x57, 0x3d, 0x4c, 0xce, 0xf0, + 0x2b, 0x03, 0x29, 0x2a, 0xa1, 0xa6, 0x9d, 0xdb, 0xc4, 0x47, 0xc1, 0xb8, 0xd3, 0xaa, 0x35, 0xd4, + 0x6b, 0x6b, 0xfb, 0x01, 0xbf, 0x50, 0xdf, 0x98, 0x94, 0x90, 0x53, 0x4b, 0xb9, 0x4f, 0x4c, 0xec, + 0xf3, 0x0e, 0xbd, 0x36, 0xe0, 0xe2, 0xe7, 0x11, 0x76, 0x6c, 0xbb, 0xe4, 0x1d, 0xc6, 0x15, 0xe3, + 0x9a, 0xe6, 0xc0, 0x45, 0x65, 0xc6, 0x9b, 0xc6, 0xd3, 0x16, 0xb9, 0x6a, 0x01, 0xc2, 0xf0, 0x5b, + 0xb8, 0x95, 0x82, 0xb7, 0xdd, 0x24, 0x25, 0xcd, 0x92, 0x32, 0xdb, 0xda, 0x91, 0xcd, 0x40, 0xc7, + 0xe7, 0x67, 0x43, 0xab, 0xb8, 0x3e, 0x94, 0x7c, 0x3a, 0x54, 0x74, 0xab, 0x99, 0xc1, 0x20, 0x4b, + 0x36, 0x78, 0xd6, 0x9b, 0xd0, 0x9c, 0x29, 0x5d, 0xb3, 0x74, 0x6b, 0x92, 0xc6, 0x26, 0xe9, 0x74, + 0x28, 0x69, 0xf5, 0xf7, 0x71, 0xf5, 0x4f, 0x41, 0x17, 0xf4, 0x86, 0x0d, 0x91, 0x66, 0xf5, 0x3c, + 0x49, 0x4b, 0xa0, 0x3d, 0x6f, 0xd6, 0xf9, 0x34, 0x3e, 0xb1, 0x78, 0xef, 0x79, 0xb9, 0xba, 0xdb, + 0x79, 0xe8, 0x7e, 0xe7, 0xa1, 0xdf, 0x3b, 0x0f, 0xfd, 0xd8, 0x7b, 0xa3, 0xfb, 0xbd, 0x37, 0xfa, + 0xb5, 0xf7, 0x46, 0x5f, 0xa3, 0x82, 0xe9, 0x9b, 0x6d, 0x1a, 0x66, 0xa2, 0x8a, 0xec, 0x45, 0xd9, + 0x6f, 0xb3, 0xbc, 0x88, 0x6e, 0xff, 0xbf, 0x2e, 0xfd, 0x5d, 0x82, 0x4a, 0x1d, 0x73, 0x5a, 0x1f, + 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0x13, 0x37, 0xbd, 0x30, 0xcc, 0x02, 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { diff --git a/x/inflation/v1/types/genesis_test.go b/x/inflation/v1/types/genesis_test.go index 4de0630130..3db11513bb 100644 --- a/x/inflation/v1/types/genesis_test.go +++ b/x/inflation/v1/types/genesis_test.go @@ -3,7 +3,7 @@ package types import ( "testing" - epochstypes "github.com/evmos/evmos/v17/x/epochs/types" + epochstypes "github.com/evmos/evmos/v18/x/epochs/types" "github.com/stretchr/testify/suite" ) diff --git a/x/inflation/v1/types/inflation.pb.go b/x/inflation/v1/types/inflation.pb.go index 039bf28bd4..67e1ad1e53 100644 --- a/x/inflation/v1/types/inflation.pb.go +++ b/x/inflation/v1/types/inflation.pb.go @@ -140,7 +140,7 @@ var fileDescriptor_d064cb35c3ff7df8 = []byte{ // 378 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x92, 0x4f, 0x6b, 0xdb, 0x30, 0x18, 0xc6, 0xad, 0xec, 0x0f, 0x4c, 0xdb, 0x92, 0x61, 0xb6, 0x61, 0x36, 0x70, 0x46, 0xc6, 0x60, - 0x27, 0x1b, 0xb3, 0xc3, 0xee, 0x59, 0x36, 0xc8, 0xc8, 0x21, 0x84, 0xd2, 0x43, 0x2f, 0x46, 0x56, + 0x27, 0x1b, 0xb3, 0xcb, 0xce, 0x59, 0x36, 0xc8, 0xc8, 0x21, 0x84, 0xd2, 0x43, 0x2f, 0x46, 0x56, 0x54, 0x47, 0xc4, 0xd2, 0x6b, 0x24, 0xd9, 0x75, 0xce, 0xfd, 0x02, 0xfd, 0x52, 0x85, 0x1c, 0x73, 0x2c, 0x3d, 0x84, 0x92, 0x7c, 0x91, 0xe2, 0x3f, 0x4d, 0xe8, 0xcd, 0xb9, 0x88, 0x57, 0xd2, 0xfb, 0x7b, 0x78, 0x1f, 0xe9, 0xc1, 0x03, 0x96, 0x0b, 0xd0, 0x3e, 0x97, 0x97, 0x09, 0x31, 0x1c, 0xa4, @@ -161,7 +161,7 @@ var fileDescriptor_d064cb35c3ff7df8 = []byte{ 0x66, 0xe7, 0xa2, 0x87, 0x9d, 0x8b, 0x6e, 0xf6, 0xae, 0xb5, 0xd9, 0xbb, 0xd6, 0xdd, 0xde, 0xb5, 0x2e, 0xfc, 0x98, 0x9b, 0x45, 0x16, 0x79, 0x14, 0x84, 0x5f, 0x07, 0xb8, 0x5e, 0xf3, 0xe0, 0xb7, 0x5f, 0x3c, 0x0f, 0xb3, 0x59, 0xa5, 0x4c, 0x47, 0xaf, 0xab, 0x7c, 0xfe, 0x7a, 0x0c, 0x00, 0x00, - 0xff, 0xff, 0xb0, 0x3f, 0xc2, 0x6b, 0xef, 0x02, 0x00, 0x00, + 0xff, 0xff, 0x89, 0x88, 0x96, 0xe6, 0xef, 0x02, 0x00, 0x00, } func (m *InflationDistribution) Marshal() (dAtA []byte, err error) { diff --git a/x/inflation/v1/types/inflation_calculation.go b/x/inflation/v1/types/inflation_calculation.go index b9cb5e76a4..9d62c17fe8 100644 --- a/x/inflation/v1/types/inflation_calculation.go +++ b/x/inflation/v1/types/inflation_calculation.go @@ -6,7 +6,7 @@ package types import ( "cosmossdk.io/math" - evmostypes "github.com/evmos/evmos/v17/types" + evmostypes "github.com/evmos/evmos/v18/types" ) const ( diff --git a/x/inflation/v1/types/params.go b/x/inflation/v1/types/params.go index 25b679af36..2db7a9f0a1 100644 --- a/x/inflation/v1/types/params.go +++ b/x/inflation/v1/types/params.go @@ -10,7 +10,7 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" - evm "github.com/evmos/evmos/v17/x/evm/types" + evm "github.com/evmos/evmos/v18/x/evm/types" ) var ParamsKey = []byte("Params") diff --git a/x/inflation/v1/types/query.pb.go b/x/inflation/v1/types/query.pb.go index b057bc435a..d7c2452f43 100644 --- a/x/inflation/v1/types/query.pb.go +++ b/x/inflation/v1/types/query.pb.go @@ -549,49 +549,49 @@ func init() { proto.RegisterFile("evmos/inflation/v1/query.proto", fileDescripto var fileDescriptor_91b9f1b5d47c7fd7 = []byte{ // 679 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x95, 0xc1, 0x6e, 0xd3, 0x30, - 0x18, 0xc7, 0x1b, 0x34, 0x8a, 0x30, 0xda, 0xa4, 0x99, 0x09, 0x41, 0x36, 0xd2, 0x2a, 0xc0, 0xa8, - 0x26, 0xcd, 0xa6, 0xdd, 0x01, 0xce, 0x1b, 0x1c, 0x86, 0x40, 0x8c, 0xee, 0xc6, 0xa5, 0x4a, 0x33, - 0x93, 0x5a, 0x5b, 0x6d, 0x2f, 0x76, 0xab, 0xf5, 0xc0, 0x85, 0x27, 0x40, 0xe2, 0x80, 0x04, 0x12, - 0x0f, 0xb0, 0x0b, 0xaf, 0xb1, 0xe3, 0x24, 0x2e, 0x88, 0xc3, 0x40, 0x1b, 0x0f, 0x82, 0xe2, 0x38, - 0xdd, 0xb2, 0x3a, 0x19, 0x93, 0xb8, 0x54, 0xa9, 0xbf, 0xff, 0xf7, 0x7d, 0x7f, 0xfd, 0xe3, 0x9f, - 0x02, 0x3c, 0x32, 0xec, 0x73, 0x89, 0x29, 0x7b, 0xbb, 0x13, 0x28, 0xca, 0x19, 0x1e, 0x36, 0xf1, - 0xee, 0x80, 0xc4, 0x23, 0x24, 0x62, 0xae, 0x38, 0x84, 0xba, 0x8e, 0xc6, 0x75, 0x34, 0x6c, 0xba, - 0x5e, 0xc8, 0x65, 0xd2, 0xd4, 0x0d, 0x24, 0xc1, 0xc3, 0x66, 0x97, 0xa8, 0xa0, 0x89, 0x43, 0x4e, - 0x59, 0xda, 0xe3, 0xd6, 0x2d, 0x33, 0x23, 0xc2, 0x88, 0xa4, 0xd2, 0x28, 0xe6, 0x22, 0x1e, 0x71, - 0xfd, 0x88, 0x93, 0x27, 0x73, 0xba, 0x10, 0x71, 0x1e, 0xed, 0x10, 0x1c, 0x08, 0x8a, 0x03, 0xc6, - 0xb8, 0xd2, 0xdd, 0xa6, 0xc7, 0x9f, 0x03, 0xf0, 0x75, 0x62, 0x6c, 0x83, 0xc4, 0x94, 0x6f, 0xb5, - 0xc9, 0xee, 0x80, 0x48, 0xe5, 0x2f, 0x83, 0x9b, 0xb9, 0x53, 0x29, 0x38, 0x93, 0x04, 0xde, 0x02, - 0x55, 0xa1, 0x4f, 0x6e, 0x3b, 0x75, 0xa7, 0x31, 0xd5, 0x36, 0xff, 0xfc, 0x3a, 0xf0, 0xb4, 0xfc, - 0x99, 0xe0, 0x61, 0xef, 0x25, 0x65, 0x6a, 0x23, 0xe6, 0x43, 0x2a, 0x29, 0x67, 0xd9, 0xc0, 0x2f, - 0x0e, 0xa8, 0x15, 0x4a, 0xcc, 0xf4, 0x3d, 0x30, 0x47, 0x92, 0x6a, 0xa7, 0x4f, 0x99, 0xea, 0x88, - 0xac, 0xae, 0x77, 0xdd, 0x68, 0x2d, 0xa0, 0x34, 0x1f, 0x94, 0xe4, 0x83, 0x4c, 0x3e, 0xe8, 0x29, - 0x09, 0xd7, 0x38, 0x65, 0xab, 0x8d, 0x83, 0xa3, 0x5a, 0x65, 0xff, 0x57, 0xad, 0x9e, 0x8a, 0xe4, - 0xd6, 0x36, 0xa2, 0x1c, 0xf7, 0x03, 0xd5, 0x43, 0x2f, 0x48, 0x14, 0x84, 0x23, 0x23, 0x94, 0x6d, - 0x48, 0x26, 0x1c, 0xf8, 0xf3, 0xe0, 0x8e, 0x36, 0xb7, 0xb9, 0x4d, 0x85, 0x20, 0x5b, 0xda, 0xa3, - 0xcc, 0xac, 0xaf, 0x01, 0xd7, 0x56, 0x34, 0xa6, 0x1f, 0x80, 0x19, 0x99, 0x16, 0x3a, 0x7a, 0xb0, - 0x34, 0xd1, 0x4c, 0xcb, 0xb3, 0x72, 0xbf, 0x06, 0xee, 0xea, 0x21, 0x6b, 0x34, 0x0e, 0x07, 0xc9, - 0xfb, 0x63, 0xd1, 0xe6, 0x40, 0x88, 0x9d, 0x51, 0xb6, 0xe5, 0x93, 0x63, 0x32, 0xb4, 0x28, 0xcc, - 0xaa, 0x01, 0x80, 0xe1, 0x69, 0xb1, 0x23, 0x75, 0xf5, 0x3f, 0xa7, 0x33, 0x1b, 0x9e, 0x5f, 0x3f, - 0x0e, 0x67, 0x3d, 0xbb, 0x78, 0xed, 0x40, 0x91, 0xcc, 0x76, 0xcf, 0x84, 0x73, 0xae, 0x68, 0x1c, - 0x3f, 0x07, 0x33, 0xe3, 0xeb, 0xda, 0x89, 0x03, 0x45, 0xb4, 0xdb, 0xeb, 0xab, 0xf7, 0x12, 0x3f, - 0x3f, 0x8f, 0x6a, 0xf3, 0x25, 0x7e, 0xda, 0xd3, 0xf4, 0xec, 0xcc, 0xd3, 0x8b, 0x1a, 0xc4, 0x41, - 0x7f, 0xfc, 0x72, 0x5e, 0x65, 0x17, 0xd5, 0x9c, 0x9a, 0xc5, 0x4f, 0x40, 0x55, 0xe8, 0x13, 0x13, - 0x8f, 0x8b, 0x26, 0x81, 0x43, 0x69, 0xcf, 0xea, 0x54, 0x62, 0xa6, 0x6d, 0xf4, 0xad, 0xaf, 0xd7, - 0xc0, 0x55, 0x3d, 0x11, 0xbe, 0x03, 0xd5, 0xf4, 0xfa, 0xc3, 0x45, 0x5b, 0xf7, 0x24, 0x35, 0xee, - 0xc3, 0x0b, 0x75, 0xa9, 0x3d, 0xdf, 0x7f, 0xff, 0xfd, 0xcf, 0xc7, 0x2b, 0x0b, 0xd0, 0xc5, 0x16, - 0xa6, 0x53, 0xa6, 0xe0, 0x37, 0x07, 0xc0, 0x49, 0x58, 0x60, 0xab, 0x70, 0x47, 0x21, 0x7c, 0xee, - 0xca, 0xa5, 0x7a, 0x8c, 0xc7, 0x47, 0xda, 0xe3, 0x12, 0x6c, 0xd8, 0x3c, 0xda, 0x38, 0x85, 0x9f, - 0x1d, 0x30, 0x9d, 0x83, 0x04, 0x2e, 0x17, 0x2e, 0xb6, 0x91, 0xe6, 0xa2, 0x7f, 0x95, 0x1b, 0x8b, - 0x4b, 0xda, 0xe2, 0x7d, 0xe8, 0xdb, 0x2c, 0xe6, 0xa9, 0x84, 0xfb, 0x0e, 0x98, 0x9d, 0x40, 0x0b, - 0x36, 0x0b, 0x37, 0x16, 0x81, 0xea, 0xb6, 0x2e, 0xd3, 0x62, 0x8c, 0x22, 0x6d, 0xb4, 0x01, 0x17, - 0x6d, 0x46, 0x27, 0x99, 0xd6, 0x49, 0xe6, 0x88, 0x2a, 0x49, 0xd2, 0x86, 0x65, 0x49, 0x92, 0x56, - 0x50, 0xcb, 0x93, 0xcc, 0x23, 0xac, 0xb9, 0xd0, 0xac, 0x94, 0x71, 0x71, 0x16, 0xd2, 0x32, 0x2e, - 0x72, 0xd8, 0x5e, 0xc0, 0x45, 0x8a, 0xeb, 0xfa, 0xc1, 0xb1, 0xe7, 0x1c, 0x1e, 0x7b, 0xce, 0xef, - 0x63, 0xcf, 0xf9, 0x70, 0xe2, 0x55, 0x0e, 0x4f, 0xbc, 0xca, 0x8f, 0x13, 0xaf, 0xf2, 0x06, 0x47, - 0x54, 0xf5, 0x06, 0x5d, 0x14, 0xf2, 0xbe, 0xe9, 0x4f, 0x7f, 0x87, 0xcd, 0xc7, 0x78, 0x2f, 0x3f, - 0x4b, 0x8d, 0x04, 0x91, 0xdd, 0xaa, 0xfe, 0x04, 0xae, 0xfc, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x4a, - 0xb9, 0x7d, 0xfa, 0xae, 0x07, 0x00, 0x00, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x95, 0xc1, 0x4e, 0x13, 0x41, + 0x18, 0xc7, 0xbb, 0x06, 0x6b, 0x1c, 0x03, 0x09, 0x23, 0x31, 0xba, 0xe0, 0xb6, 0x59, 0x15, 0x1b, + 0x12, 0x66, 0x6c, 0xb9, 0x70, 0x06, 0x3d, 0x60, 0x34, 0x62, 0xb9, 0x79, 0x69, 0xb6, 0xcb, 0xb8, + 0x9d, 0x40, 0x67, 0x86, 0x9d, 0x69, 0x43, 0x0f, 0x5e, 0x7c, 0x02, 0x13, 0x0f, 0x26, 0x9a, 0xf8, + 0x00, 0x5c, 0x7c, 0x0d, 0x8e, 0x24, 0x5e, 0x8c, 0x07, 0x34, 0xe0, 0x83, 0x98, 0x9d, 0x9d, 0x2d, + 0x2c, 0x9d, 0x5d, 0x24, 0xf1, 0xd2, 0x6c, 0xe7, 0xfb, 0x7f, 0xdf, 0xf7, 0xcf, 0x7f, 0xe7, 0x97, + 0x05, 0x1e, 0x19, 0xf6, 0xb9, 0xc4, 0x94, 0xbd, 0xdd, 0x0d, 0x14, 0xe5, 0x0c, 0x0f, 0x9b, 0x78, + 0x6f, 0x40, 0xe2, 0x11, 0x12, 0x31, 0x57, 0x1c, 0x42, 0x5d, 0x47, 0xe3, 0x3a, 0x1a, 0x36, 0x5d, + 0x2f, 0xe4, 0x32, 0x69, 0xea, 0x06, 0x92, 0xe0, 0x61, 0xb3, 0x4b, 0x54, 0xd0, 0xc4, 0x21, 0xa7, + 0x2c, 0xed, 0x71, 0xeb, 0x96, 0x99, 0x11, 0x61, 0x44, 0x52, 0x69, 0x14, 0x73, 0x11, 0x8f, 0xb8, + 0x7e, 0xc4, 0xc9, 0x93, 0x39, 0x5d, 0x88, 0x38, 0x8f, 0x76, 0x09, 0x0e, 0x04, 0xc5, 0x01, 0x63, + 0x5c, 0xe9, 0x6e, 0xd3, 0xe3, 0xcf, 0x01, 0xf8, 0x3a, 0x31, 0xb6, 0x49, 0x62, 0xca, 0xb7, 0xdb, + 0x64, 0x6f, 0x40, 0xa4, 0xf2, 0x97, 0xc1, 0xed, 0xdc, 0xa9, 0x14, 0x9c, 0x49, 0x02, 0xef, 0x80, + 0xaa, 0xd0, 0x27, 0x77, 0x9d, 0xba, 0xd3, 0x98, 0x6a, 0x9b, 0x7f, 0x7e, 0x1d, 0x78, 0x5a, 0xfe, + 0x4c, 0xf0, 0xb0, 0xf7, 0x92, 0x32, 0xb5, 0x19, 0xf3, 0x21, 0x95, 0x94, 0xb3, 0x6c, 0xe0, 0x17, + 0x07, 0xd4, 0x0a, 0x25, 0x66, 0xfa, 0x3e, 0x98, 0x23, 0x49, 0xb5, 0xd3, 0xa7, 0x4c, 0x75, 0x44, + 0x56, 0xd7, 0xbb, 0x6e, 0xb5, 0x16, 0x50, 0x9a, 0x0f, 0x4a, 0xf2, 0x41, 0x26, 0x1f, 0xf4, 0x94, + 0x84, 0xeb, 0x9c, 0xb2, 0xb5, 0xc6, 0xe1, 0x71, 0xad, 0x72, 0xf0, 0xab, 0x56, 0x4f, 0x45, 0x72, + 0x7b, 0x07, 0x51, 0x8e, 0xfb, 0x81, 0xea, 0xa1, 0x17, 0x24, 0x0a, 0xc2, 0x91, 0x11, 0xca, 0x36, + 0x24, 0x13, 0x0e, 0xfc, 0x79, 0x70, 0x4f, 0x9b, 0xdb, 0xda, 0xa1, 0x42, 0x90, 0x6d, 0xed, 0x51, + 0x66, 0xd6, 0xd7, 0x81, 0x6b, 0x2b, 0x1a, 0xd3, 0x8f, 0xc0, 0x8c, 0x4c, 0x0b, 0x1d, 0x3d, 0x58, + 0x9a, 0x68, 0xa6, 0xe5, 0x79, 0xb9, 0x5f, 0x03, 0xf7, 0xf5, 0x90, 0x75, 0x1a, 0x87, 0x83, 0xe4, + 0xfd, 0xb1, 0x68, 0x6b, 0x20, 0xc4, 0xee, 0x28, 0xdb, 0xf2, 0xc9, 0x31, 0x19, 0x5a, 0x14, 0x66, + 0xd5, 0x00, 0xc0, 0xf0, 0xac, 0xd8, 0x91, 0xba, 0xfa, 0x9f, 0xd3, 0x99, 0x0d, 0x2f, 0xae, 0x1f, + 0x87, 0xb3, 0x91, 0x5d, 0xbc, 0x76, 0xa0, 0x48, 0x66, 0xbb, 0x67, 0xc2, 0xb9, 0x50, 0x34, 0x8e, + 0x9f, 0x83, 0x99, 0xf1, 0x75, 0xed, 0xc4, 0x81, 0x22, 0xda, 0xed, 0xcd, 0xb5, 0x07, 0x89, 0x9f, + 0x9f, 0xc7, 0xb5, 0xf9, 0x12, 0x3f, 0xed, 0x69, 0x7a, 0x7e, 0xe6, 0xd9, 0x45, 0x0d, 0xe2, 0xa0, + 0x3f, 0x7e, 0x39, 0xaf, 0xb2, 0x8b, 0x6a, 0x4e, 0xcd, 0xe2, 0x55, 0x50, 0x15, 0xfa, 0xc4, 0xc4, + 0xe3, 0xa2, 0x49, 0xe0, 0x50, 0xda, 0xb3, 0x36, 0x95, 0x98, 0x69, 0x1b, 0x7d, 0xeb, 0xeb, 0x0d, + 0x70, 0x5d, 0x4f, 0x84, 0xef, 0x40, 0x35, 0xbd, 0xfe, 0x70, 0xd1, 0xd6, 0x3d, 0x49, 0x8d, 0xfb, + 0xf8, 0x52, 0x5d, 0x6a, 0xcf, 0xf7, 0xdf, 0x7f, 0xff, 0xf3, 0xf1, 0xda, 0x02, 0x74, 0xb1, 0x85, + 0xe9, 0x94, 0x29, 0xf8, 0xcd, 0x01, 0x70, 0x12, 0x16, 0xd8, 0x2a, 0xdc, 0x51, 0x08, 0x9f, 0xbb, + 0x72, 0xa5, 0x1e, 0xe3, 0xf1, 0x89, 0xf6, 0xb8, 0x04, 0x1b, 0x36, 0x8f, 0x36, 0x4e, 0xe1, 0x67, + 0x07, 0x4c, 0xe7, 0x20, 0x81, 0xcb, 0x85, 0x8b, 0x6d, 0xa4, 0xb9, 0xe8, 0x5f, 0xe5, 0xc6, 0xe2, + 0x92, 0xb6, 0xf8, 0x10, 0xfa, 0x36, 0x8b, 0x79, 0x2a, 0xe1, 0x81, 0x03, 0x66, 0x27, 0xd0, 0x82, + 0xcd, 0xc2, 0x8d, 0x45, 0xa0, 0xba, 0xad, 0xab, 0xb4, 0x18, 0xa3, 0x48, 0x1b, 0x6d, 0xc0, 0x45, + 0x9b, 0xd1, 0x49, 0xa6, 0x75, 0x92, 0x39, 0xa2, 0x4a, 0x92, 0xb4, 0x61, 0x59, 0x92, 0xa4, 0x15, + 0xd4, 0xf2, 0x24, 0xf3, 0x08, 0x6b, 0x2e, 0x34, 0x2b, 0x65, 0x5c, 0x9c, 0x87, 0xb4, 0x8c, 0x8b, + 0x1c, 0xb6, 0x97, 0x70, 0x91, 0xe2, 0xba, 0x71, 0x78, 0xe2, 0x39, 0x47, 0x27, 0x9e, 0xf3, 0xfb, + 0xc4, 0x73, 0x3e, 0x9c, 0x7a, 0x95, 0xa3, 0x53, 0xaf, 0xf2, 0xe3, 0xd4, 0xab, 0xbc, 0xc1, 0x11, + 0x55, 0xbd, 0x41, 0x17, 0x85, 0xbc, 0x6f, 0xfa, 0xd3, 0xdf, 0x61, 0x73, 0x15, 0xef, 0xe7, 0x67, + 0xa9, 0x91, 0x20, 0xb2, 0x5b, 0xd5, 0x9f, 0xc0, 0x95, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x73, + 0x0e, 0x29, 0x77, 0xae, 0x07, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/inflation/v1/types/tx.pb.go b/x/inflation/v1/types/tx.pb.go index 7337e037a6..45adfb67cb 100644 --- a/x/inflation/v1/types/tx.pb.go +++ b/x/inflation/v1/types/tx.pb.go @@ -151,8 +151,8 @@ var fileDescriptor_2f254d33a26438a9 = []byte{ 0x98, 0x45, 0x4e, 0x9e, 0x27, 0x1e, 0xc9, 0x31, 0x5e, 0x78, 0x24, 0xc7, 0xf8, 0xe0, 0x91, 0x1c, 0xe3, 0x84, 0xc7, 0x72, 0x0c, 0x17, 0x1e, 0xcb, 0x31, 0xdc, 0x78, 0x2c, 0xc7, 0x10, 0xa5, 0x9f, 0x9e, 0x59, 0x92, 0x51, 0x9a, 0xa4, 0x97, 0x9c, 0x9f, 0xab, 0x0f, 0x09, 0x76, 0x08, 0x59, 0x66, - 0x68, 0xae, 0x5f, 0x81, 0x16, 0xcf, 0x95, 0x05, 0xa9, 0xc5, 0x49, 0x6c, 0xe0, 0xb0, 0x36, 0x06, - 0x04, 0x00, 0x00, 0xff, 0xff, 0x58, 0x5e, 0x09, 0xd6, 0x0a, 0x02, 0x00, 0x00, + 0x68, 0xa1, 0x5f, 0x81, 0x16, 0xcf, 0x95, 0x05, 0xa9, 0xc5, 0x49, 0x6c, 0xe0, 0xb0, 0x36, 0x06, + 0x04, 0x00, 0x00, 0xff, 0xff, 0x61, 0xe9, 0x5d, 0x5b, 0x0a, 0x02, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/staking/keeper/integration_test.go b/x/staking/keeper/integration_test.go new file mode 100644 index 0000000000..3fd456f6c5 --- /dev/null +++ b/x/staking/keeper/integration_test.go @@ -0,0 +1,395 @@ +package keeper_test + +import ( + "testing" + "time" + + "cosmossdk.io/math" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/authz" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + "github.com/cosmos/cosmos-sdk/x/staking/types" + + "github.com/evmos/evmos/v18/testutil" + "github.com/evmos/evmos/v18/testutil/integration/common/factory" + evmosfactory "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" + "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + "github.com/evmos/evmos/v18/utils" + vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" + + //nolint:revive // dot imports are fine for Ginkgo + . "github.com/onsi/ginkgo/v2" + //nolint:revive // dot imports are fine for Ginkgo + . "github.com/onsi/gomega" +) + +func TestKeeperIntegrationTestSuite(t *testing.T) { + // Run Ginkgo integration tests + RegisterFailHandler(Fail) + RunSpecs(t, "Keeper Suite") +} + +var _ = Describe("Staking module tests", func() { + var ( + nw *network.UnitTestNetwork + gh grpc.Handler + keys keyring.Keyring + tf evmosfactory.TxFactory + ) + + Context("using a vesting account", func() { + var ( + clawbackAccount *vestingtypes.ClawbackVestingAccount + funder keyring.Key + vestingAccount keyring.Key + otherAccount keyring.Key + vestAccInitialBalance *sdk.Coin + // initialized vars + gasPrice = math.NewInt(700_000_000) + gas = uint64(500_000) + ) + + BeforeEach(func() { + // setup network + // create 3 prefunded accounts: + keys = keyring.New(3) + funder = keys.GetKey(0) + vestingAccount = keys.GetKey(1) + otherAccount = keys.GetKey(2) + + // set a higher initial balance for the funder to have + // enough for the vesting schedule + funderInitialBalance, ok := math.NewIntFromString("100_000_000_000_000_000_000") + Expect(ok).To(BeTrue()) + balances := []banktypes.Balance{ + { + Address: funder.AccAddr.String(), + Coins: sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, funderInitialBalance)), + }, + { + Address: vestingAccount.AccAddr.String(), + Coins: sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, network.PrefundedAccountInitialBalance)), + }, + { + Address: otherAccount.AccAddr.String(), + Coins: sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, network.PrefundedAccountInitialBalance)), + }, + } + + nw = network.NewUnitTestNetwork( + network.WithBalances(balances...), + ) + gh = grpc.NewIntegrationHandler(nw) + tf = evmosfactory.New(nw, gh) + + Expect(nw.NextBlock()).To(BeNil()) + + // setup vesting account + createAccMsg := vestingtypes.NewMsgCreateClawbackVestingAccount(funder.AccAddr, vestingAccount.AccAddr, false) + res, err := tf.ExecuteCosmosTx(vestingAccount.Priv, factory.CosmosTxArgs{Msgs: []sdk.Msg{createAccMsg}}) + Expect(err).To(BeNil()) + Expect(res.IsOK()).To(BeTrue()) + Expect(nw.NextBlock()).To(BeNil()) + + // get vesting account initial balance (free tokens) + balRes, err := gh.GetBalance(vestingAccount.AccAddr, nw.GetDenom()) + Expect(err).To(BeNil()) + vestAccInitialBalance = balRes.Balance + + // Fund the clawback vesting accounts + vestingStart := nw.GetContext().BlockTime() + fundMsg := vestingtypes.NewMsgFundVestingAccount(funder.AccAddr, vestingAccount.AccAddr, vestingStart, testutil.TestVestingSchedule.LockupPeriods, testutil.TestVestingSchedule.VestingPeriods) + res, err = tf.ExecuteCosmosTx(funder.Priv, factory.CosmosTxArgs{Msgs: []sdk.Msg{fundMsg}}) + Expect(err).To(BeNil()) + Expect(res.IsOK()).To(BeTrue()) + Expect(nw.NextBlock()).To(BeNil()) + + // check vesting account was created successfully + acc, err := gh.GetAccount(vestingAccount.AccAddr.String()) + Expect(err).To(BeNil()) + clawbackAccount, ok = acc.(*vestingtypes.ClawbackVestingAccount) + Expect(ok).To(BeTrue()) + }) + + Context("delegate", func() { + var delMsg *types.MsgDelegate + + Context("using MsgDelegate", func() { + BeforeEach(func() { + // create a MsgDelegate to delegate the free tokens (balance previous to be converted to clawback account) + vested coins per period + delMsg = types.NewMsgDelegate(vestingAccount.AccAddr, nw.GetValidators()[0].GetOperator(), testutil.TestVestingSchedule.VestedCoinsPerPeriod.Add(*vestAccInitialBalance)[0]) + }) + + It("should not allow to delegate unvested tokens", func() { + // all coins in vesting schedule should be unvested + unvestedCoins := clawbackAccount.GetVestingCoins(nw.GetContext().BlockTime()) + Expect(unvestedCoins).To(Equal(testutil.TestVestingSchedule.TotalVestingCoins)) + + balRes, err := gh.GetBalance(vestingAccount.AccAddr, nw.GetDenom()) + Expect(err).To(BeNil()) + delegatableBalance := balRes.Balance.Sub(unvestedCoins[0]) + Expect(delegatableBalance.Amount.LT(delMsg.Amount.Amount)).To(BeTrue()) + + _, err = tf.ExecuteCosmosTx(vestingAccount.Priv, factory.CosmosTxArgs{Msgs: []sdk.Msg{delMsg}}) + Expect(err).To(HaveOccurred()) + Expect(err.Error()).To(ContainSubstring("cannot delegate unvested coins")) + }) + + It("should allow to delegate free tokens when all tokens in vesting schedule are unvested", func() { + // calculate fees to deduct from free balance + // to get the proper delegation amount + fees := sdk.NewCoin(nw.GetDenom(), gasPrice.Mul(math.NewIntFromUint64(gas))) + delMsg.Amount = vestAccInitialBalance.Sub(fees) + + res, err := tf.ExecuteCosmosTx(vestingAccount.Priv, factory.CosmosTxArgs{Msgs: []sdk.Msg{delMsg}, Gas: gas, GasPrice: &gasPrice}) + Expect(err).To(BeNil()) + Expect(res.IsOK()).To(BeTrue()) + Expect(nw.NextBlock()).To(BeNil()) + + // check delegation was created successfully + delRes, err := gh.GetDelegation(vestingAccount.AccAddr.String(), nw.GetValidators()[0].OperatorAddress) + Expect(err).To(BeNil()) + Expect(delRes.DelegationResponse).NotTo(BeNil()) + Expect(delRes.DelegationResponse.Balance).To(Equal(delMsg.Amount)) + }) + + It("should allow to delegate locked vested tokens", func() { + // cliff period passes - some tokens vested, but still all locked + vestingPeriod := time.Duration(testutil.TestVestingSchedule.CliffPeriodLength) + Expect(nw.NextBlockAfter(vestingPeriod * time.Second)).To(BeNil()) + + // check there're some vested coins + denom := nw.GetDenom() + expCoins := sdk.NewCoins(sdk.NewCoin(denom, testutil.TestVestingSchedule.VestedCoinsPerPeriod.AmountOf(denom).MulRaw(testutil.TestVestingSchedule.CliffMonths))) + lockedVestedCoins := clawbackAccount.GetLockedUpVestedCoins(nw.GetContext().BlockTime()) + Expect(lockedVestedCoins).To(Equal(expCoins)) + + // deduct fees from delegation amount to pay the tx + fees := sdk.NewCoin(nw.GetDenom(), gasPrice.Mul(math.NewIntFromUint64(gas))) + delMsg.Amount = vestAccInitialBalance.Add(lockedVestedCoins[0]).Sub(fees) + + res, err := tf.ExecuteCosmosTx(vestingAccount.Priv, factory.CosmosTxArgs{Msgs: []sdk.Msg{delMsg}, Gas: gas, GasPrice: &gasPrice}) + Expect(err).To(BeNil()) + Expect(res.IsOK()).To(BeTrue()) + Expect(nw.NextBlock()).To(BeNil()) + + // check delegation was created successfully + delRes, err := gh.GetDelegation(vestingAccount.AccAddr.String(), nw.GetValidators()[0].OperatorAddress) + Expect(err).To(BeNil()) + Expect(delRes.DelegationResponse).NotTo(BeNil()) + Expect(delRes.DelegationResponse.Balance).To(Equal(delMsg.Amount)) + }) + + It("should allow to delegate unlocked vested tokens", func() { + // first lockup period passes + lockupPeriod := time.Duration(testutil.TestVestingSchedule.LockupPeriodLength) + Expect(nw.NextBlockAfter(lockupPeriod * time.Second)).To(BeNil()) + + // check there're some vested coins + denom := nw.GetDenom() + expVested := sdk.NewCoins(sdk.NewCoin(denom, testutil.TestVestingSchedule.VestedCoinsPerPeriod.AmountOf(denom).Mul(math.NewInt(testutil.TestVestingSchedule.LockupMonths)))) + vestedCoins := clawbackAccount.GetVestedCoins(nw.GetContext().BlockTime()) + Expect(vestedCoins).To(Equal(expVested)) + + // all vested coins should be unlocked + unlockedVestedCoins := clawbackAccount.GetUnlockedVestedCoins(nw.GetContext().BlockTime()) + Expect(unlockedVestedCoins).To(Equal(vestedCoins)) + + // delegation amount is all free coins + unlocked vested - fee to pay tx + fees := sdk.NewCoin(nw.GetDenom(), gasPrice.Mul(math.NewIntFromUint64(gas))) + delMsg.Amount = vestAccInitialBalance.Add(unlockedVestedCoins[0]).Sub(fees) + + res, err := tf.ExecuteCosmosTx(vestingAccount.Priv, factory.CosmosTxArgs{Msgs: []sdk.Msg{delMsg}, Gas: gas, GasPrice: &gasPrice}) + Expect(err).To(BeNil()) + Expect(res.IsOK()).To(BeTrue()) + Expect(nw.NextBlock()).To(BeNil()) + + // check delegation was created successfully + delRes, err := gh.GetDelegation(vestingAccount.AccAddr.String(), nw.GetValidators()[0].OperatorAddress) + Expect(err).To(BeNil()) + Expect(delRes.DelegationResponse).NotTo(BeNil()) + Expect(delRes.DelegationResponse.Balance).To(Equal(delMsg.Amount)) + }) + }) + + Context("MsgDelegate nested in MsgExec", func() { + BeforeEach(func() { + expiration := time.Now().Add(time.Hour * 24 * 365 * 2) // 2years + // create a grant for other account + // to send a MsgDelegate + grantMsg, err := authz.NewMsgGrant(vestingAccount.AccAddr, otherAccount.AccAddr, authz.NewGenericAuthorization("/cosmos.staking.v1beta1.MsgDelegate"), &expiration) + Expect(err).To(BeNil()) + res, err := tf.ExecuteCosmosTx(vestingAccount.Priv, factory.CosmosTxArgs{Msgs: []sdk.Msg{grantMsg}}) + Expect(err).To(BeNil()) + Expect(res.IsOK()).To(BeTrue()) + Expect(nw.NextBlock()).To(BeNil()) + + // create a MsgDelegate to delegate vested coins per period + delMsg = types.NewMsgDelegate(vestingAccount.AccAddr, nw.GetValidators()[0].GetOperator(), testutil.TestVestingSchedule.VestedCoinsPerPeriod.Add(*vestAccInitialBalance)[0]) + }) + + It("should not allow to delegate unvested tokens", func() { + // all coins in vesting schedule should be unvested + unvestedCoins := clawbackAccount.GetVestingCoins(nw.GetContext().BlockTime()) + Expect(unvestedCoins).To(Equal(testutil.TestVestingSchedule.TotalVestingCoins)) + + balRes, err := gh.GetBalance(vestingAccount.AccAddr, nw.GetDenom()) + Expect(err).To(BeNil()) + delegatableBalance := balRes.Balance.Sub(unvestedCoins[0]) + Expect(delegatableBalance.Amount.LT(delMsg.Amount.Amount)).To(BeTrue()) + + execMsg := authz.NewMsgExec(otherAccount.AccAddr, []sdk.Msg{delMsg}) + _, err = tf.ExecuteCosmosTx(otherAccount.Priv, factory.CosmosTxArgs{Msgs: []sdk.Msg{&execMsg}}) + Expect(err).To(HaveOccurred()) + Expect(err.Error()).To(ContainSubstring("cannot delegate unvested coins.")) + }) + + It("should allow to delegate locked vested tokens", func() { + // cliff period passes - some tokens vested, but still all locked + vestingPeriod := time.Duration(testutil.TestVestingSchedule.CliffPeriodLength) + Expect(nw.NextBlockAfter(vestingPeriod * time.Second)).To(BeNil()) + + // check there're some vested coins + denom := nw.GetDenom() + expCoins := sdk.NewCoins(sdk.NewCoin(denom, testutil.TestVestingSchedule.VestedCoinsPerPeriod.AmountOf(denom).MulRaw(testutil.TestVestingSchedule.CliffMonths))) + lockedVestedCoins := clawbackAccount.GetLockedUpVestedCoins(nw.GetContext().BlockTime()) + Expect(lockedVestedCoins).To(Equal(expCoins)) + + // update delegation amount to be the free balance + locked vested coins - fees + fees := sdk.NewCoin(nw.GetDenom(), gasPrice.Mul(math.NewIntFromUint64(gas))) + delMsg.Amount = vestAccInitialBalance.Add(lockedVestedCoins[0]).Sub(fees) + + execMsg := authz.NewMsgExec(otherAccount.AccAddr, []sdk.Msg{delMsg}) + res, err := tf.ExecuteCosmosTx(otherAccount.Priv, factory.CosmosTxArgs{Msgs: []sdk.Msg{&execMsg}, Gas: gas, GasPrice: &gasPrice}) + Expect(err).To(BeNil()) + Expect(res.IsOK()).To(BeTrue()) + Expect(nw.NextBlock()).To(BeNil()) + + // check delegation was created successfully + delRes, err := gh.GetDelegation(vestingAccount.AccAddr.String(), nw.GetValidators()[0].OperatorAddress) + Expect(err).To(BeNil()) + Expect(delRes.DelegationResponse).NotTo(BeNil()) + Expect(delRes.DelegationResponse.Balance).To(Equal(delMsg.Amount)) + }) + + It("after first lockup period - should allow to delegate unlocked vested tokens", func() { + // first lockup period passes + lockupPeriod := time.Duration(testutil.TestVestingSchedule.LockupPeriodLength) + Expect(nw.NextBlockAfter(lockupPeriod * time.Second)).To(BeNil()) + + // check there're some vested coins + denom := nw.GetDenom() + expVested := sdk.NewCoins(sdk.NewCoin(denom, testutil.TestVestingSchedule.VestedCoinsPerPeriod.AmountOf(denom).Mul(math.NewInt(testutil.TestVestingSchedule.LockupMonths)))) + vestedCoins := clawbackAccount.GetVestedCoins(nw.GetContext().BlockTime()) + Expect(vestedCoins).To(Equal(expVested)) + + execMsg := authz.NewMsgExec(otherAccount.AccAddr, []sdk.Msg{delMsg}) + res, err := tf.ExecuteCosmosTx(otherAccount.Priv, factory.CosmosTxArgs{Msgs: []sdk.Msg{&execMsg}, Gas: gas}) + Expect(err).To(BeNil()) + Expect(res.IsOK()).To(BeTrue()) + Expect(nw.NextBlock()).To(BeNil()) + + // check delegation was created successfully + delRes, err := gh.GetDelegation(vestingAccount.AccAddr.String(), nw.GetValidators()[0].OperatorAddress) + Expect(err).To(BeNil()) + Expect(delRes.DelegationResponse).NotTo(BeNil()) + Expect(delRes.DelegationResponse.Balance).To(Equal(delMsg.Amount)) + }) + }) + }) + + Context("create validator with self delegation", func() { + var createValMsg *types.MsgCreateValidator + + BeforeEach(func() { + // create a MsgCreateValidator to create a validator. + // Self delegate coins in the vesting schedule + var err error + pubKey := ed25519.GenPrivKey().PubKey() + commissions := types.NewCommissionRates( + sdk.NewDecWithPrec(5, 2), + sdk.NewDecWithPrec(2, 1), + sdk.NewDecWithPrec(5, 2), + ) + createValMsg, err = types.NewMsgCreateValidator( + sdk.ValAddress(vestingAccount.AccAddr), + pubKey, + testutil.TestVestingSchedule.VestedCoinsPerPeriod.Add(*vestAccInitialBalance)[0], + types.NewDescription("T", "E", "S", "T", "Z"), + commissions, + sdk.OneInt(), + ) + Expect(err).To(BeNil()) + }) + + It("should not allow to create validator with unvested tokens in self delegation", func() { + // all coins in vesting schedule should be unvested + unvestedCoins := clawbackAccount.GetVestingCoins(nw.GetContext().BlockTime()) + Expect(unvestedCoins).To(Equal(testutil.TestVestingSchedule.TotalVestingCoins)) + + balRes, err := gh.GetBalance(vestingAccount.AccAddr, nw.GetDenom()) + Expect(err).To(BeNil()) + delegatableBalance := balRes.Balance.Sub(unvestedCoins[0]) + Expect(delegatableBalance.Amount.LT(createValMsg.Value.Amount)).To(BeTrue()) + + _, err = tf.ExecuteCosmosTx(vestingAccount.Priv, factory.CosmosTxArgs{Msgs: []sdk.Msg{createValMsg}}) + Expect(err).To(HaveOccurred()) + Expect(err.Error()).To(ContainSubstring("cannot delegate unvested coins.")) + }) + + It("should allow to create validator with locked vested tokens", func() { + // cliff period passes - some tokens vested, but still all locked + vestingPeriod := time.Duration(testutil.TestVestingSchedule.CliffPeriodLength) + Expect(nw.NextBlockAfter(vestingPeriod * time.Second)).To(BeNil()) + + // check there're some vested coins + denom := nw.GetDenom() + expCoins := sdk.NewCoins(sdk.NewCoin(denom, testutil.TestVestingSchedule.VestedCoinsPerPeriod.AmountOf(denom).MulRaw(testutil.TestVestingSchedule.CliffMonths))) + lockedVestedCoins := clawbackAccount.GetLockedUpVestedCoins(nw.GetContext().BlockTime()) + Expect(lockedVestedCoins).To(Equal(expCoins)) + + // update delegation amount to be the free balance + locked vested coins - fees + fees := sdk.NewCoin(nw.GetDenom(), gasPrice.Mul(math.NewIntFromUint64(gas))) + createValMsg.Value = vestAccInitialBalance.Add(lockedVestedCoins[0]).Sub(fees) + + res, err := tf.ExecuteCosmosTx(vestingAccount.Priv, factory.CosmosTxArgs{Msgs: []sdk.Msg{createValMsg}, Gas: gas, GasPrice: &gasPrice}) + Expect(err).To(BeNil()) + Expect(res.IsOK()).To(BeTrue()) + Expect(nw.NextBlock()).To(BeNil()) + + // check validator was created successfully + qc := nw.GetStakingClient() + valRes, err := qc.Validator(nw.GetContext(), &types.QueryValidatorRequest{ValidatorAddr: sdk.ValAddress(vestingAccount.AccAddr).String()}) + Expect(err).To(BeNil()) + Expect(valRes.Validator.Status).To(Equal(types.Bonded)) + }) + + It("after first lockup period - should allow to create validator with a delegation of vested tokens", func() { + // first lockup period passes + lockupPeriod := time.Duration(testutil.TestVestingSchedule.LockupPeriodLength) + Expect(nw.NextBlockAfter(lockupPeriod * time.Second)).To(BeNil()) + + // check there're some vested coins + denom := nw.GetDenom() + expVested := sdk.NewCoins(sdk.NewCoin(denom, testutil.TestVestingSchedule.VestedCoinsPerPeriod.AmountOf(denom).Mul(math.NewInt(testutil.TestVestingSchedule.LockupMonths)))) + vestedCoins := clawbackAccount.GetVestedCoins(nw.GetContext().BlockTime()) + Expect(vestedCoins).To(Equal(expVested)) + + res, err := tf.ExecuteCosmosTx(vestingAccount.Priv, factory.CosmosTxArgs{Msgs: []sdk.Msg{createValMsg}, Gas: 500_000}) + Expect(err).To(BeNil()) + Expect(res.IsOK()).To(BeTrue()) + Expect(nw.NextBlock()).To(BeNil()) + + // check validator was created successfully + qc := nw.GetStakingClient() + valRes, err := qc.Validator(nw.GetContext(), &types.QueryValidatorRequest{ValidatorAddr: sdk.ValAddress(vestingAccount.AccAddr).String()}) + Expect(err).To(BeNil()) + Expect(valRes.Validator.Status).To(Equal(types.Bonded)) + }) + }) + }) +}) diff --git a/x/staking/keeper/keeper.go b/x/staking/keeper/keeper.go new file mode 100644 index 0000000000..f4be3aee00 --- /dev/null +++ b/x/staking/keeper/keeper.go @@ -0,0 +1,33 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package keeper + +import ( + "github.com/cosmos/cosmos-sdk/codec" + storetypes "github.com/cosmos/cosmos-sdk/store/types" + stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" + "github.com/cosmos/cosmos-sdk/x/staking/types" +) + +// Keeper is a wrapper around the Cosmos SDK staking keeper. +type Keeper struct { + *stakingkeeper.Keeper + ak types.AccountKeeper + bk types.BankKeeper +} + +// NewKeeper creates a new staking Keeper wrapper instance. +func NewKeeper( + cdc codec.BinaryCodec, + key storetypes.StoreKey, + ak types.AccountKeeper, + bk types.BankKeeper, + authority string, +) *Keeper { + return &Keeper{ + stakingkeeper.NewKeeper(cdc, key, ak, bk, authority), + ak, + bk, + } +} diff --git a/x/staking/keeper/msg_server.go b/x/staking/keeper/msg_server.go new file mode 100644 index 0000000000..53749ce8f5 --- /dev/null +++ b/x/staking/keeper/msg_server.go @@ -0,0 +1,107 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package keeper + +import ( + "context" + + errorsmod "cosmossdk.io/errors" + "cosmossdk.io/math" + sdk "github.com/cosmos/cosmos-sdk/types" + errortypes "github.com/cosmos/cosmos-sdk/types/errors" + sdkstakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" + "github.com/cosmos/cosmos-sdk/x/staking/types" + + vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" +) + +// msgServer is a wrapper around the Cosmos SDK message server. +type msgServer struct { + types.MsgServer + *Keeper +} + +var _ types.MsgServer = msgServer{} + +// NewMsgServerImpl returns an implementation of the staking MsgServer interface +// for the provided Keeper. +func NewMsgServerImpl(keeper *Keeper) types.MsgServer { + baseMsgServer := sdkstakingkeeper.NewMsgServerImpl(keeper.Keeper) + return &msgServer{baseMsgServer, keeper} +} + +// Delegate defines a method for performing a delegation of coins from a delegator to a validator. +// The method performs some checks if the sender of the tx is a clawback vesting account and then +// relay the message to the Cosmos SDK staking method. +func (k msgServer) Delegate(goCtx context.Context, msg *types.MsgDelegate) (*types.MsgDelegateResponse, error) { + if err := k.validateDelegationAmountNotUnvested(goCtx, msg.DelegatorAddress, msg.Amount.Amount); err != nil { + return nil, err + } + + return k.MsgServer.Delegate(goCtx, msg) +} + +// CreateValidator defines a method to create a validator. The method performs some checks if the +// sender of the tx is a clawback vesting account and then relay the message to the Cosmos SDK staking +// method. +func (k msgServer) CreateValidator(goCtx context.Context, msg *types.MsgCreateValidator) (*types.MsgCreateValidatorResponse, error) { + if err := k.validateDelegationAmountNotUnvested(goCtx, msg.DelegatorAddress, msg.Value.Amount); err != nil { + return nil, err + } + + return k.MsgServer.CreateValidator(goCtx, msg) +} + +// validateDelegationAmountNotUnvested checks if the delegator is a clawback vesting account. +// In such case, checks that the provided delegation amount is available according +// to the current vesting schedule (unvested coins cannot be delegated). +func (k msgServer) validateDelegationAmountNotUnvested(goCtx context.Context, delegatorAddress string, amount math.Int) error { + ctx := sdk.UnwrapSDKContext(goCtx) + addr, err := sdk.AccAddressFromBech32(delegatorAddress) + if err != nil { + return err + } + + acc := k.ak.GetAccount(ctx, addr) + if acc == nil { + return errorsmod.Wrapf( + errortypes.ErrUnknownAddress, + "account %s does not exist", addr, + ) + } + // check if delegator address is a clawback vesting account. If not, no check + // is required. + clawbackAccount, isClawback := acc.(*vestingtypes.ClawbackVestingAccount) + if !isClawback { + return nil + } + + // vesting account can only delegate + // if enough free balance (coins not in vesting schedule) + // plus the vested coins (locked/unlocked) + bondDenom := k.BondDenom(ctx) + // GetBalance returns entire account balance + // balance = free coins + all coins in vesting schedule + balance := k.bk.GetBalance(ctx, addr, bondDenom) + unvestedOnly := clawbackAccount.GetVestingCoins(ctx.BlockTime()) + // delegatable coins are going to be all the free coins + vested coins + // Can only delegate bondable coins + unvestedBondableAmt := unvestedOnly.AmountOf(bondDenom) + // A ClawbackVestingAccount can delegate coins from the vesting schedule + // when having vested locked coins or unlocked vested coins. + // It CANNOT delegate unvested coins + delegatableAmt := balance.Amount.Sub(unvestedBondableAmt) + if delegatableAmt.IsNegative() { + delegatableAmt = math.ZeroInt() + } + + if delegatableAmt.LT(amount) { + return errorsmod.Wrapf( + vestingtypes.ErrInsufficientVestedCoins, + "cannot delegate unvested coins. coins available for delegation < delegation amount (%s < %s)", + delegatableAmt, amount, + ) + } + return nil +} diff --git a/x/staking/keeper/msg_server_test.go b/x/staking/keeper/msg_server_test.go new file mode 100644 index 0000000000..990155df05 --- /dev/null +++ b/x/staking/keeper/msg_server_test.go @@ -0,0 +1,271 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package keeper_test + +import ( + "testing" + "time" + + "cosmossdk.io/math" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/staking/types" + + "github.com/evmos/evmos/v18/testutil" + "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v18/x/staking/keeper" + vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" + "github.com/stretchr/testify/require" +) + +func TestMsgDelegate(t *testing.T) { + var ( + ctx sdk.Context + nw *network.UnitTestNetwork + defaultDelCoin = sdk.NewCoin(utils.BaseDenom, math.NewInt(1e18)) + delegatorAddr, _ = utiltx.NewAccAddressAndKey() + funderAddr, _ = utiltx.NewAccAddressAndKey() + ) + + testCases := []struct { //nolint:dupl + name string + setup func() sdk.Coin + expErr bool + errMsg string + }{ + { + name: "can delegate from a common EthAccount", + setup: func() sdk.Coin { + // Send some funds to delegator account + err := testutil.FundAccountWithBaseDenom(ctx, nw.App.BankKeeper, delegatorAddr, defaultDelCoin.Amount.Int64()) + require.NoError(t, err) + return defaultDelCoin + }, + expErr: false, + }, + { + name: "can delegate free coins from a ClawbackVestingAccount", + setup: func() sdk.Coin { + err := setupClawbackVestingAccount(ctx, nw, delegatorAddr, funderAddr, testutil.TestVestingSchedule.TotalVestingCoins.Add(defaultDelCoin)) + require.NoError(t, err) + return defaultDelCoin + }, + expErr: false, + }, + { + name: "cannot delegate unvested coins from a ClawbackVestingAccount", + setup: func() sdk.Coin { + err := setupClawbackVestingAccount(ctx, nw, delegatorAddr, funderAddr, testutil.TestVestingSchedule.TotalVestingCoins) + require.NoError(t, err) + return defaultDelCoin + }, + expErr: true, + errMsg: "cannot delegate unvested coins", + }, + { + name: "can delegate locked vested coins from a ClawbackVestingAccount", + setup: func() sdk.Coin { + err := setupClawbackVestingAccount(ctx, nw, delegatorAddr, funderAddr, testutil.TestVestingSchedule.TotalVestingCoins) + require.NoError(t, err) + + // after first vesting period and before lockup + // some vested tokens, but still all locked + cliffDuration := time.Duration(testutil.TestVestingSchedule.CliffPeriodLength) + require.NoError(t, nw.NextBlockAfter(cliffDuration*time.Second)) + ctx = nw.GetContext() + + acc := nw.App.AccountKeeper.GetAccount(ctx, delegatorAddr) + vestAcc, ok := acc.(*vestingtypes.ClawbackVestingAccount) + require.True(t, ok) + + // check that locked vested is > 0 + lockedVested := vestAcc.GetLockedUpVestedCoins(ctx.BlockTime()) + require.True(t, lockedVested.IsAllGT(sdk.NewCoins())) + + // returned delegation coins are the locked vested coins + return lockedVested[0] + }, + expErr: false, + }, + { + name: "can delegate unlocked vested coins from a ClawbackVestingAccount", + setup: func() sdk.Coin { + err := setupClawbackVestingAccount(ctx, nw, delegatorAddr, funderAddr, testutil.TestVestingSchedule.TotalVestingCoins) + require.NoError(t, err) + + // Between first and second lockup periods + // vested coins are unlocked + lockDuration := time.Duration(testutil.TestVestingSchedule.LockupPeriodLength) + require.NoError(t, nw.NextBlockAfter(lockDuration*time.Second)) + ctx = nw.GetContext() + + acc := nw.App.AccountKeeper.GetAccount(ctx, delegatorAddr) + vestAcc, ok := acc.(*vestingtypes.ClawbackVestingAccount) + require.True(t, ok) + + unlockedVested := vestAcc.GetUnlockedVestedCoins(ctx.BlockTime()) + require.True(t, unlockedVested.IsAllGT(sdk.NewCoins())) + + // returned delegation coins are the locked vested coins + return unlockedVested[0] + }, + expErr: false, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + nw = network.NewUnitTestNetwork() + ctx = nw.GetContext() + delCoin := tc.setup() + + srv := keeper.NewMsgServerImpl(&nw.App.StakingKeeper) + res, err := srv.Delegate(ctx, &types.MsgDelegate{ + DelegatorAddress: delegatorAddr.String(), + ValidatorAddress: nw.GetValidators()[0].OperatorAddress, + Amount: delCoin, + }) + + if tc.expErr { + require.Error(t, err) + require.Contains(t, err.Error(), tc.errMsg) + } else { + require.NoError(t, err) + require.NotNil(t, res) + } + }) + } +} + +func TestMsgCreateValidator(t *testing.T) { + var ( + ctx sdk.Context + nw *network.UnitTestNetwork + defaultDelCoin = sdk.NewCoin(utils.BaseDenom, math.NewInt(1e18)) + validatorAddr, _ = utiltx.NewAccAddressAndKey() + funderAddr, _ = utiltx.NewAccAddressAndKey() + ) + + testCases := []struct { //nolint:dupl + name string + setup func() sdk.Coin + expErr bool + errMsg string + }{ + { + name: "can create a validator using a common EthAccount", + setup: func() sdk.Coin { + // Send some funds to delegator account + err := testutil.FundAccountWithBaseDenom(ctx, nw.App.BankKeeper, validatorAddr, defaultDelCoin.Amount.Int64()) + require.NoError(t, err) + return defaultDelCoin + }, + expErr: false, + }, + { + name: "can create a validator using a ClawbackVestingAccount and free tokens in self delegation", + setup: func() sdk.Coin { + err := setupClawbackVestingAccount(ctx, nw, validatorAddr, funderAddr, testutil.TestVestingSchedule.TotalVestingCoins.Add(defaultDelCoin)) + require.NoError(t, err) + return defaultDelCoin + }, + expErr: false, + }, + { + name: "cannot create a validator using a ClawbackVestingAccount and unvested tokens in self delegation", + setup: func() sdk.Coin { + err := setupClawbackVestingAccount(ctx, nw, validatorAddr, funderAddr, testutil.TestVestingSchedule.TotalVestingCoins) + require.NoError(t, err) + return defaultDelCoin + }, + expErr: true, + errMsg: "cannot delegate unvested coins", + }, + { + name: "can create a validator using a ClawbackVestingAccount and locked vested coins in self delegation", + setup: func() sdk.Coin { + err := setupClawbackVestingAccount(ctx, nw, validatorAddr, funderAddr, testutil.TestVestingSchedule.TotalVestingCoins) + require.NoError(t, err) + + // after first vesting period and before lockup + // some vested tokens, but still all locked + cliffDuration := time.Duration(testutil.TestVestingSchedule.CliffPeriodLength) + require.NoError(t, nw.NextBlockAfter(cliffDuration*time.Second)) + ctx = nw.GetContext() + + acc := nw.App.AccountKeeper.GetAccount(ctx, validatorAddr) + vestAcc, ok := acc.(*vestingtypes.ClawbackVestingAccount) + require.True(t, ok) + + // check that locked vested is > 0 + lockedVested := vestAcc.GetLockedUpVestedCoins(ctx.BlockTime()) + require.True(t, lockedVested.IsAllGT(sdk.NewCoins())) + + // returned delegation coins are the locked vested coins + return lockedVested[0] + }, + expErr: false, + }, + { + name: "can create a validator using a ClawbackVestingAccount and unlocked vested coins in self delegation", + setup: func() sdk.Coin { + err := setupClawbackVestingAccount(ctx, nw, validatorAddr, funderAddr, testutil.TestVestingSchedule.TotalVestingCoins) + require.NoError(t, err) + + // Between first and second lockup periods + // vested coins are unlocked + lockDuration := time.Duration(testutil.TestVestingSchedule.LockupPeriodLength) + require.NoError(t, nw.NextBlockAfter(lockDuration*time.Second)) + ctx = nw.GetContext() + + acc := nw.App.AccountKeeper.GetAccount(ctx, validatorAddr) + vestAcc, ok := acc.(*vestingtypes.ClawbackVestingAccount) + require.True(t, ok) + + unlockedVested := vestAcc.GetUnlockedVestedCoins(ctx.BlockTime()) + require.True(t, unlockedVested.IsAllGT(sdk.NewCoins())) + + // returned delegation coins are the locked vested coins + return unlockedVested[0] + }, + expErr: false, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + nw = network.NewUnitTestNetwork() + ctx = nw.GetContext() + coinToSelfBond := tc.setup() + + pubKey := ed25519.GenPrivKey().PubKey() + commissions := types.NewCommissionRates( + sdk.NewDecWithPrec(5, 2), + sdk.NewDecWithPrec(2, 1), + sdk.NewDecWithPrec(5, 2), + ) + msg, err := types.NewMsgCreateValidator( + sdk.ValAddress(validatorAddr), + pubKey, + coinToSelfBond, + types.NewDescription("T", "E", "S", "T", "Z"), + commissions, + sdk.OneInt(), + ) + require.NoError(t, err) + srv := keeper.NewMsgServerImpl(&nw.App.StakingKeeper) + res, err := srv.CreateValidator(ctx, msg) + + if tc.expErr { + require.Error(t, err) + require.Contains(t, err.Error(), tc.errMsg) + } else { + require.NoError(t, err) + require.NotNil(t, res) + } + }) + } +} diff --git a/x/staking/keeper/util_test.go b/x/staking/keeper/util_test.go new file mode 100644 index 0000000000..94b98c4d70 --- /dev/null +++ b/x/staking/keeper/util_test.go @@ -0,0 +1,48 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package keeper_test + +import ( + "errors" + "time" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/evmos/evmos/v18/testutil" + "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + "github.com/evmos/evmos/v18/x/vesting/types" +) + +// setupClawbackVestingAccount sets up a clawback vesting account +// using the TestVestingSchedule. If exceeded balance is provided, +// will fund the vesting account with it. +func setupClawbackVestingAccount(ctx sdk.Context, nw *network.UnitTestNetwork, vestingAcc, funderAcc sdk.AccAddress, balances sdk.Coins) error { + totalVestingCoins := testutil.TestVestingSchedule.TotalVestingCoins + if totalVestingCoins.IsAllGT(balances) { + return errors.New("should provide enough balance for the vesting schedule") + } + // fund the vesting account to set the account and then + // send funds over to the funder account so free balance remains + err := testutil.FundAccount(ctx, nw.App.BankKeeper, vestingAcc, balances) + if err != nil { + return err + } + err = nw.App.BankKeeper.SendCoins(ctx, vestingAcc, funderAcc, totalVestingCoins) + if err != nil { + return err + } + + // create a clawback vesting account + msgCreate := types.NewMsgCreateClawbackVestingAccount(funderAcc, vestingAcc, false) + if _, err = nw.App.VestingKeeper.CreateClawbackVestingAccount(ctx, msgCreate); err != nil { + return err + } + + // fund vesting account + msgFund := types.NewMsgFundVestingAccount(funderAcc, vestingAcc, time.Now(), testutil.TestVestingSchedule.LockupPeriods, testutil.TestVestingSchedule.VestingPeriods) + if _, err = nw.App.VestingKeeper.FundVestingAccount(ctx, msgFund); err != nil { + return err + } + + return nil +} diff --git a/x/staking/module.go b/x/staking/module.go new file mode 100644 index 0000000000..455045ca45 --- /dev/null +++ b/x/staking/module.go @@ -0,0 +1,61 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package staking + +import ( + "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/types/module" + "github.com/cosmos/cosmos-sdk/x/auth/exported" + "github.com/cosmos/cosmos-sdk/x/staking" + stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" + "github.com/cosmos/cosmos-sdk/x/staking/types" + + "github.com/evmos/evmos/v18/x/staking/keeper" +) + +var ( + _ module.BeginBlockAppModule = AppModule{} + _ module.EndBlockAppModule = AppModule{} + _ module.AppModuleBasic = AppModuleBasic{} + _ module.AppModuleSimulation = AppModule{} +) + +// AppModuleBasic defines the basic application module used by the staking module. +type AppModuleBasic struct { + *staking.AppModuleBasic +} + +// AppModule represents a wrapper around the Cosmos SDK staking module AppModule and +// the Evmos custom staking module keeper. +type AppModule struct { + *staking.AppModule + keeper *keeper.Keeper +} + +// NewAppModule creates a wrapper for the staking module. +func NewAppModule( + cdc codec.Codec, + k *keeper.Keeper, + ak types.AccountKeeper, + bk types.BankKeeper, + ls exported.Subspace, +) AppModule { + am := staking.NewAppModule(cdc, k.Keeper, ak, bk, ls) + return AppModule{ + AppModule: &am, + keeper: k, + } +} + +// RegisterServices registers module services. +func (am AppModule) RegisterServices(cfg module.Configurator) { + // Override Staking Msg Server + types.RegisterMsgServer(cfg.MsgServer(), keeper.NewMsgServerImpl(am.keeper)) + querier := stakingkeeper.Querier{Keeper: am.keeper.Keeper} + types.RegisterQueryServer(cfg.QueryServer(), querier) + + // !! NOTE: when upgrading to a new cosmos-sdk version + // !! Check if there're store migrations for the staking module + // !! if so, you'll need to add them here +} diff --git a/x/vesting/client/cli/query.go b/x/vesting/client/cli/query.go index 76c77114f6..0f07245eac 100644 --- a/x/vesting/client/cli/query.go +++ b/x/vesting/client/cli/query.go @@ -11,7 +11,7 @@ import ( "github.com/cosmos/cosmos-sdk/client/flags" "github.com/spf13/cobra" - "github.com/evmos/evmos/v17/x/vesting/types" + "github.com/evmos/evmos/v18/x/vesting/types" ) // GetQueryCmd returns the parent command for all vesting CLI query commands. diff --git a/x/vesting/client/cli/tx.go b/x/vesting/client/cli/tx.go index d61c1002a6..0daf4ade6c 100644 --- a/x/vesting/client/cli/tx.go +++ b/x/vesting/client/cli/tx.go @@ -19,7 +19,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/gov/client/cli" govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - "github.com/evmos/evmos/v17/x/vesting/types" + "github.com/evmos/evmos/v18/x/vesting/types" ) // Transaction command flags diff --git a/x/vesting/client/proposal_handler.go b/x/vesting/client/proposal_handler.go index 7d1d1a8daf..42a1e883ca 100644 --- a/x/vesting/client/proposal_handler.go +++ b/x/vesting/client/proposal_handler.go @@ -6,7 +6,7 @@ package client import ( govclient "github.com/cosmos/cosmos-sdk/x/gov/client" - "github.com/evmos/evmos/v17/x/vesting/client/cli" + "github.com/evmos/evmos/v18/x/vesting/client/cli" ) var RegisterClawbackProposalHandler = govclient.NewProposalHandler(cli.NewClawbackProposalCmd) diff --git a/x/vesting/handler.go b/x/vesting/handler.go index 1fa2ef7f71..2f81dd2a93 100644 --- a/x/vesting/handler.go +++ b/x/vesting/handler.go @@ -8,7 +8,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/evmos/evmos/v17/x/vesting/types" + "github.com/evmos/evmos/v18/x/vesting/types" ) // NewHandler returns a handler for vesting module message types. diff --git a/x/vesting/keeper/gov.go b/x/vesting/keeper/gov.go index adf45f28ac..d0a8957483 100644 --- a/x/vesting/keeper/gov.go +++ b/x/vesting/keeper/gov.go @@ -5,7 +5,7 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/x/vesting/types" + "github.com/evmos/evmos/v18/x/vesting/types" ) // HasGovClawbackDisabled checks if the given account has governance clawback disabled. diff --git a/x/vesting/keeper/gov_test.go b/x/vesting/keeper/gov_test.go index 3f8bcac41e..aed1132aa6 100644 --- a/x/vesting/keeper/gov_test.go +++ b/x/vesting/keeper/gov_test.go @@ -2,11 +2,13 @@ package keeper_test import ( sdk "github.com/cosmos/cosmos-sdk/types" - testutiltx "github.com/evmos/evmos/v17/testutil/tx" + testutiltx "github.com/evmos/evmos/v18/testutil/tx" ) func (suite *KeeperTestSuite) TestGovClawbackStore() { - suite.SetupTest() + if err := suite.SetupTest(); err != nil { + panic(err) + } addr := sdk.AccAddress(suite.address.Bytes()) @@ -30,7 +32,9 @@ func (suite *KeeperTestSuite) TestGovClawbackStore() { } func (suite *KeeperTestSuite) TestGovClawbackNoOps() { - suite.SetupTest() + if err := suite.SetupTest(); err != nil { + panic(err) + } addr := sdk.AccAddress(suite.address.Bytes()) addr2 := sdk.AccAddress(testutiltx.GenerateAddress().Bytes()) diff --git a/x/vesting/keeper/grpc_query.go b/x/vesting/keeper/grpc_query.go index 61ea8207d3..4076380413 100644 --- a/x/vesting/keeper/grpc_query.go +++ b/x/vesting/keeper/grpc_query.go @@ -10,7 +10,7 @@ import ( "google.golang.org/grpc/codes" "google.golang.org/grpc/status" - "github.com/evmos/evmos/v17/x/vesting/types" + "github.com/evmos/evmos/v18/x/vesting/types" ) var _ types.QueryServer = Keeper{} @@ -40,9 +40,9 @@ func (k Keeper) Balances( ) } - locked := clawbackAccount.GetLockedOnly(ctx.BlockTime()) - unvested := clawbackAccount.GetUnvestedOnly(ctx.BlockTime()) - vested := clawbackAccount.GetVestedOnly(ctx.BlockTime()) + locked := clawbackAccount.GetLockedUpCoins(ctx.BlockTime()) + unvested := clawbackAccount.GetVestingCoins(ctx.BlockTime()) + vested := clawbackAccount.GetVestedCoins(ctx.BlockTime()) return &types.QueryBalancesResponse{ Locked: locked, diff --git a/x/vesting/keeper/grpc_query_test.go b/x/vesting/keeper/grpc_query_test.go index 42f16662b4..a18f8a9dd9 100644 --- a/x/vesting/keeper/grpc_query_test.go +++ b/x/vesting/keeper/grpc_query_test.go @@ -6,8 +6,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/evmos/evmos/v17/testutil" - "github.com/evmos/evmos/v17/x/vesting/types" + "github.com/evmos/evmos/v18/testutil" + "github.com/evmos/evmos/v18/x/vesting/types" ) func (suite *KeeperTestSuite) TestBalances() { @@ -117,7 +117,7 @@ func (suite *KeeperTestSuite) TestBalances() { for _, tc := range testCases { suite.Run(fmt.Sprintf("Case %s", tc.name), func() { - suite.SetupTest() // reset + suite.Require().NoError(suite.SetupTest()) // reset ctx := sdk.WrapSDKContext(suite.ctx) tc.malleate() suite.Commit() diff --git a/x/vesting/keeper/hooks.go b/x/vesting/keeper/hooks.go index 58e8352074..2e95f40491 100644 --- a/x/vesting/keeper/hooks.go +++ b/x/vesting/keeper/hooks.go @@ -9,7 +9,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" - vestingtypes "github.com/evmos/evmos/v17/x/vesting/types" + vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" ) var _ govtypes.GovHooks = Hooks{} diff --git a/x/vesting/keeper/integration_test.go b/x/vesting/keeper/integration_test.go index d9b33fb06c..42671be3ad 100644 --- a/x/vesting/keeper/integration_test.go +++ b/x/vesting/keeper/integration_test.go @@ -4,6 +4,7 @@ import ( "fmt" "math/big" "strings" + "testing" "time" //nolint:revive // dot imports are fine for Ginkgo @@ -12,25 +13,37 @@ import ( . "github.com/onsi/gomega" "cosmossdk.io/math" + "github.com/cosmos/cosmos-sdk/baseapp" sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" sdkvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" 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" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v17/contracts" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" - "github.com/evmos/evmos/v17/testutil" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - "github.com/evmos/evmos/v17/utils" - erc20types "github.com/evmos/evmos/v17/x/erc20/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" - "github.com/evmos/evmos/v17/x/vesting/types" + "github.com/evmos/evmos/v18/contracts" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + "github.com/evmos/evmos/v18/testutil" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/utils" + erc20types "github.com/evmos/evmos/v18/x/erc20/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v18/x/vesting/types" ) +func TestKeeperIntegrationTestSuite(t *testing.T) { + s = new(KeeperTestSuite) + s.SetT(t) + + // Run Ginkgo integration tests + RegisterFailHandler(Fail) + RunSpecs(t, "Keeper Suite") +} + // TestClawbackAccount is a struct to store all relevant information that is corresponding // to a clawback vesting account. type TestClawbackAccount struct { @@ -40,7 +53,20 @@ type TestClawbackAccount struct { } // Initialize general error variable for easier handling in loops throughout this test suite. -var err error +var ( + err error + stakeDenom = utils.BaseDenom + accountGasCoverage = sdk.NewCoins(sdk.NewCoin(stakeDenom, math.NewInt(1e16))) + amt = testutil.TestVestingSchedule.VestedCoinsPerPeriod[0].Amount + cliff = testutil.TestVestingSchedule.CliffMonths + cliffLength = testutil.TestVestingSchedule.CliffPeriodLength + vestingAmtTotal = testutil.TestVestingSchedule.TotalVestingCoins + vestingLength = testutil.TestVestingSchedule.VestingPeriodLength + numLockupPeriods = testutil.TestVestingSchedule.NumLockupPeriods + periodsTotal = testutil.TestVestingSchedule.NumVestingPeriods + lockup = testutil.TestVestingSchedule.LockupMonths + unlockedPerLockup = testutil.TestVestingSchedule.UnlockedCoinsPerLockup +) // Clawback vesting with Cliff and Lock. In this case the cliff is reached // before the lockup period is reached to represent the scenario in which an @@ -52,44 +78,6 @@ var err error // 22/09 Cliff ends // 23/02 Lock ends var _ = Describe("Clawback Vesting Accounts", Ordered, func() { - // Monthly vesting period - stakeDenom := utils.BaseDenom - amt := math.NewInt(1e17) - vestingLength := int64(60 * 60 * 24 * 30) // in seconds - vestingAmt := sdk.NewCoins(sdk.NewCoin(stakeDenom, amt)) - vestingPeriod := sdkvesting.Period{Length: vestingLength, Amount: vestingAmt} - - // 4 years vesting total - periodsTotal := int64(48) - vestingAmtTotal := sdk.NewCoins(sdk.NewCoin(stakeDenom, amt.Mul(math.NewInt(periodsTotal)))) - - // 6 month cliff - cliff := int64(6) - cliffLength := vestingLength * cliff - cliffAmt := sdk.NewCoins(sdk.NewCoin(stakeDenom, amt.Mul(math.NewInt(cliff)))) - cliffPeriod := sdkvesting.Period{Length: cliffLength, Amount: cliffAmt} - - // 12 month lockup - lockup := int64(12) // 12 months - lockupLength := vestingLength * lockup - // Unlock at 12 and 24 months - numLockupPeriods := int64(2) - // Unlock 1/4th of the total vest in each unlock event. By default, all tokens are - // unlocked after surpassing the final period. - unlockedPerLockup := vestingAmtTotal.QuoInt(math.NewInt(4)) - unlockedPerLockupAmt := unlockedPerLockup[0].Amount - lockupPeriod := sdkvesting.Period{Length: lockupLength, Amount: unlockedPerLockup} - lockupPeriods := make(sdkvesting.Periods, numLockupPeriods) - for i := range lockupPeriods { - lockupPeriods[i] = lockupPeriod - } - - // Create vesting periods with initial cliff - vestingPeriods := sdkvesting.Periods{cliffPeriod} - for p := int64(1); p <= periodsTotal-cliff; p++ { - vestingPeriods = append(vestingPeriods, vestingPeriod) - } - // Create test accounts with private keys for signing numTestAccounts := 4 testAccounts := make([]TestClawbackAccount, numTestAccounts) @@ -102,12 +90,12 @@ var _ = Describe("Clawback Vesting Accounts", Ordered, func() { } numTestMsgs := 3 - accountGasCoverage := sdk.NewCoins(sdk.NewCoin(stakeDenom, math.NewInt(1e16))) - var ( - clawbackAccount *types.ClawbackVestingAccount - unvested sdk.Coins - vested sdk.Coins + clawbackAccount *types.ClawbackVestingAccount + unvested sdk.Coins + vested sdk.Coins + // freeCoins are unlocked vested coins of the vesting schedule + freeCoins sdk.Coins twoThirdsOfVested sdk.Coins ) @@ -115,7 +103,7 @@ var _ = Describe("Clawback Vesting Accounts", Ordered, func() { funder := sdk.AccAddress(utiltx.GenerateAddress().Bytes()) BeforeEach(func() { - s.SetupTest() + Expect(s.SetupTest()).To(BeNil()) // reset // Initialize all test accounts for i, account := range testAccounts { @@ -127,65 +115,64 @@ var _ = Describe("Clawback Vesting Accounts", Ordered, func() { funder, vestingAmtTotal, vestingStart, - lockupPeriods, - vestingPeriods, + testutil.TestVestingSchedule.LockupPeriods, + testutil.TestVestingSchedule.VestingPeriods, ) err := testutil.FundAccount(s.ctx, s.app.BankKeeper, account.address, vestingAmtTotal) - s.Require().NoError(err) + Expect(err).To(BeNil()) acc := s.app.AccountKeeper.NewAccount(s.ctx, clawbackAccount) s.app.AccountKeeper.SetAccount(s.ctx, acc) // Check if all tokens are unvested at vestingStart - unvested = clawbackAccount.GetUnvestedOnly(s.ctx.BlockTime()) - vested = clawbackAccount.GetVestedOnly(s.ctx.BlockTime()) - s.Require().Equal(vestingAmtTotal, unvested) - s.Require().True(vested.IsZero()) + unvested = clawbackAccount.GetVestingCoins(s.ctx.BlockTime()) + vested = clawbackAccount.GetVestedCoins(s.ctx.BlockTime()) + Expect(vestingAmtTotal).To(Equal(unvested)) + Expect(vested.IsZero()).To(BeTrue()) // Grant gas stipend to cover EVM fees err = testutil.FundAccount(s.ctx, s.app.BankKeeper, clawbackAccount.GetAddress(), accountGasCoverage) - s.Require().NoError(err) + Expect(err).To(BeNil()) granteeBalance := s.app.BankKeeper.GetBalance(s.ctx, account.address, stakeDenom) - s.Require().Equal(granteeBalance, accountGasCoverage[0].Add(vestingAmtTotal[0])) + Expect(granteeBalance).To(Equal(accountGasCoverage[0].Add(vestingAmtTotal[0]))) // Update testAccounts clawbackAccount reference testAccounts[i].clawbackAccount = clawbackAccount } }) - Context("before first vesting period", func() { BeforeEach(func() { // Add a commit to instantiate blocks s.Commit() // Ensure no tokens are vested - vested := clawbackAccount.GetVestedOnly(s.ctx.BlockTime()) - unlocked := clawbackAccount.GetUnlockedOnly(s.ctx.BlockTime()) + vested := clawbackAccount.GetVestedCoins(s.ctx.BlockTime()) + unlocked := clawbackAccount.GetUnlockedCoins(s.ctx.BlockTime()) zeroCoins := sdk.NewCoins(sdk.NewCoin(stakeDenom, math.ZeroInt())) - s.Require().Equal(zeroCoins, vested) - s.Require().Equal(zeroCoins, unlocked) + Expect(zeroCoins).To(Equal(vested)) + Expect(zeroCoins).To(Equal(unlocked)) }) It("cannot delegate tokens", func() { - _, err := delegate(testAccounts[0], accountGasCoverage.Add(sdk.NewCoin(stakeDenom, math.NewInt(1)))) + _, err := testutil.Delegate(s.ctx, s.app, testAccounts[0].privKey, accountGasCoverage.Add(sdk.NewCoin(stakeDenom, math.NewInt(1)))[0], s.validator) Expect(err).ToNot(BeNil()) }) It("can transfer spendable tokens", func() { account := testAccounts[0] // Fund account with new spendable tokens - err := testutil.FundAccount(s.ctx, s.app.BankKeeper, account.address, unvested) + amt := unvested + err := testutil.FundAccount(s.ctx, s.app.BankKeeper, account.address, amt) Expect(err).To(BeNil()) err = s.app.BankKeeper.SendCoins( s.ctx, account.address, dest, - unvested, + amt, ) Expect(err).To(BeNil()) }) - It("cannot transfer unvested tokens", func() { err := s.app.BankKeeper.SendCoins( s.ctx, @@ -195,77 +182,162 @@ var _ = Describe("Clawback Vesting Accounts", Ordered, func() { ) Expect(err).ToNot(BeNil()) }) - It("can perform Ethereum tx with spendable balance", func() { account := testAccounts[0] // Fund account with new spendable tokens - err := testutil.FundAccount(s.ctx, s.app.BankKeeper, account.address, unlockedPerLockup) + coins := testutil.TestVestingSchedule.UnlockedCoinsPerLockup + err := testutil.FundAccount(s.ctx, s.app.BankKeeper, account.address, coins) Expect(err).To(BeNil()) - txAmount := unlockedPerLockupAmt.BigInt() + txAmount := coins.AmountOf(stakeDenom).BigInt() msg, err := utiltx.CreateEthTx(s.ctx, s.app, account.privKey, account.address, dest, txAmount, 0) Expect(err).To(BeNil()) - assertEthSucceeds([]TestClawbackAccount{account}, funder, dest, unlockedPerLockupAmt, stakeDenom, msg) + assertEthSucceeds([]TestClawbackAccount{account}, funder, dest, coins.AmountOf(stakeDenom), stakeDenom, msg) }) It("cannot perform Ethereum tx with unvested balance", func() { account := testAccounts[0] - txAmount := unlockedPerLockupAmt.BigInt() + unlockedCoins := testutil.TestVestingSchedule.UnlockedCoinsPerLockup + txAmount := unlockedCoins.AmountOf(stakeDenom).BigInt() msg, err := utiltx.CreateEthTx(s.ctx, s.app, account.privKey, account.address, dest, txAmount, 0) Expect(err).To(BeNil()) assertEthFails(msg) }) }) - Context("after first vesting period and before lockup", func() { BeforeEach(func() { // Surpass cliff but none of lockup duration - cliffDuration := time.Duration(cliffLength) + cliffDuration := time.Duration(testutil.TestVestingSchedule.CliffPeriodLength) s.CommitAfter(cliffDuration * time.Second) // Check if some, but not all tokens are vested - vested = clawbackAccount.GetVestedOnly(s.ctx.BlockTime()) - expVested := sdk.NewCoins(sdk.NewCoin(stakeDenom, amt.Mul(math.NewInt(cliff)))) - s.Require().NotEqual(vestingAmtTotal, vested) - s.Require().Equal(expVested, vested) + vested = clawbackAccount.GetVestedCoins(s.ctx.BlockTime()) + expVested := sdk.NewCoins(sdk.NewCoin(stakeDenom, amt.Mul(math.NewInt(testutil.TestVestingSchedule.CliffMonths)))) + Expect(vested).NotTo(Equal(vestingAmtTotal)) + Expect(vested).To(Equal(expVested)) + + // check the vested tokens are still locked + freeCoins = clawbackAccount.GetUnlockedVestedCoins(s.ctx.BlockTime()) + Expect(freeCoins).To(Equal(sdk.Coins{})) twoThirdsOfVested = vested.Sub(vested.QuoInt(math.NewInt(3))...) + + res, err := s.app.VestingKeeper.Balances(s.ctx, &types.QueryBalancesRequest{Address: clawbackAccount.Address}) + Expect(err).To(BeNil()) + Expect(res.Vested).To(Equal(expVested)) + Expect(res.Unvested).To(Equal(vestingAmtTotal.Sub(expVested...))) + // All coins from vesting schedule should be locked + Expect(res.Locked).To(Equal(vestingAmtTotal)) }) - It("can delegate vested tokens and update spendable balance", func() { + It("can delegate vested locked tokens", func() { testAccount := testAccounts[0] - // Verify that the total spendable coins decreases after staking - // vested tokens. + // Verify that the total spendable coins should only be coins + // not in the vesting schedule. Because all coins from the vesting + // schedule are still locked spendablePre := s.app.BankKeeper.SpendableCoins(s.ctx, testAccount.address) + Expect(spendablePre).To(Equal(accountGasCoverage)) + + // delegate the vested locked coins. + _, err := testutil.Delegate(s.ctx, s.app, testAccount.privKey, vested[0], s.validator) + Expect(err).To(BeNil(), "expected no error during delegation") - _, err := delegate(testAccount, vested) + // check spendable coins have only been reduced by the gas paid for the transaction to show that the delegated coins were taken from the locked but vested amount + spendablePost := s.app.BankKeeper.SpendableCoins(s.ctx, testAccount.address) + Expect(spendablePost).To(Equal(spendablePre.Sub(accountGasCoverage...))) + + // check delegation was created successfully + stkQuerier := stakingkeeper.Querier{Keeper: s.app.StakingKeeper.Keeper} + delRes, err := stkQuerier.DelegatorDelegations(s.ctx, &stakingtypes.QueryDelegatorDelegationsRequest{DelegatorAddr: testAccount.clawbackAccount.Address}) Expect(err).To(BeNil()) + Expect(delRes.DelegationResponses).To(HaveLen(1)) + Expect(delRes.DelegationResponses[0].Balance.Amount).To(Equal(vested[0].Amount)) + }) + It("can delegate tokens from account balance - tokens not in vesting schedule", func() { + testAccount := testAccounts[0] + + // send some funds to the account to delegate + coinsToDelegate := sdk.NewCoins(sdk.NewCoin(stakeDenom, math.NewInt(1e18))) + err = testutil.FundAccount(s.ctx, s.app.BankKeeper, testAccount.address, coinsToDelegate) + Expect(err).To(BeNil()) + + // Verify that the total spendable coins should only be coins + // not in the vesting schedule. Because all coins from the vesting + // schedule are still locked + spendablePre := s.app.BankKeeper.SpendableCoins(s.ctx, testAccount.address) + Expect(spendablePre).To(Equal(accountGasCoverage.Add(coinsToDelegate...))) + + // delegate funds not in vesting schedule + res, err := testutil.Delegate(s.ctx, s.app, testAccount.privKey, coinsToDelegate[0], s.validator) + Expect(err).NotTo(HaveOccurred(), "expected no error during delegation") + Expect(res.IsOK()).To(BeTrue()) + + // check spendable balance is updated properly spendablePost := s.app.BankKeeper.SpendableCoins(s.ctx, testAccount.address) - Expect(spendablePost.AmountOf(stakeDenom).GT(spendablePre.AmountOf(stakeDenom))) + Expect(spendablePost).To(Equal(spendablePre.Sub(coinsToDelegate...).Sub(accountGasCoverage...))) }) - It("cannot delegate unvested tokens", func() { - _, err := delegate(testAccounts[0], vestingAmtTotal) + It("can delegate tokens from account balance (free tokens) + locked vested tokens", func() { + testAccount := testAccounts[0] + + // send some funds to the account to delegate + amt := sdk.NewCoins(sdk.NewCoin(stakeDenom, math.NewInt(1e18))) + err = testutil.FundAccount(s.ctx, s.app.BankKeeper, testAccount.address, amt) + Expect(err).To(BeNil()) + + // Verify that the total spendable coins should only be coins + // not in the vesting schedule. Because all coins from the vesting + // schedule are still locked + spendablePre := s.app.BankKeeper.SpendableCoins(s.ctx, testAccount.address) + Expect(spendablePre).To(Equal(accountGasCoverage.Add(amt...))) + + // delegate some tokens from the account balance + locked vested coins + coinsToDelegate := amt.Add(vested...) + + res, err := testutil.Delegate(s.ctx, s.app, testAccount.privKey, coinsToDelegate[0], s.validator) + Expect(err).NotTo(HaveOccurred(), "expected no error during delegation") + Expect(res.IsOK()).To(BeTrue()) + + // check spendable balance is updated properly + spendablePost := s.app.BankKeeper.SpendableCoins(s.ctx, testAccount.address) + Expect(spendablePost).To(Equal(spendablePre.Sub(amt...).Sub(accountGasCoverage...))) + }) + + It("cannot delegate unvested tokens in sequetial txs", func() { + _, err := testutil.Delegate(s.ctx, s.app, testAccounts[0].privKey, twoThirdsOfVested[0], s.validator) + Expect(err).To(BeNil(), "error while executing the delegate message") + _, err = testutil.Delegate(s.ctx, s.app, testAccounts[0].privKey, twoThirdsOfVested[0], s.validator) Expect(err).ToNot(BeNil()) }) - It("cannot delegate unvested tokens in batches", func() { - msg, err := delegate(testAccounts[0], twoThirdsOfVested) + It("cannot delegate then send tokens", func() { + _, err := testutil.Delegate(s.ctx, s.app, testAccounts[0].privKey, twoThirdsOfVested[0], s.validator) Expect(err).To(BeNil()) - msgServer := stakingkeeper.NewMsgServerImpl(&s.app.StakingKeeper) - _, err = msgServer.Delegate(s.ctx, msg) - Expect(err).ToNot(HaveOccurred(), "error while executing the delegate message") + err = s.app.BankKeeper.SendCoins( + s.ctx, + clawbackAccount.GetAddress(), + dest, + twoThirdsOfVested, + ) + Expect(err).ToNot(BeNil()) + }) - _, err = delegate(testAccounts[0], twoThirdsOfVested) + It("cannot delegate more than the locked vested tokens", func() { + _, err := testutil.Delegate(s.ctx, s.app, testAccounts[0].privKey, vested[0].Add(sdk.NewCoin(stakeDenom, math.NewInt(1))), s.validator) Expect(err).ToNot(BeNil()) }) - It("cannot delegate then send tokens", func() { - _, err := delegate(testAccounts[0], twoThirdsOfVested) + It("cannot delegate free tokens and then send locked/unvested tokens", func() { + // send some funds to the account to delegate + coinsToDelegate := sdk.NewCoins(sdk.NewCoin(stakeDenom, math.NewInt(1e18))) + err = testutil.FundAccount(s.ctx, s.app.BankKeeper, testAccounts[0].address, coinsToDelegate) + Expect(err).To(BeNil()) + + _, err := testutil.Delegate(s.ctx, s.app, testAccounts[0].privKey, coinsToDelegate[0], s.validator) Expect(err).To(BeNil()) err = s.app.BankKeeper.SendCoins( @@ -277,7 +349,7 @@ var _ = Describe("Clawback Vesting Accounts", Ordered, func() { Expect(err).ToNot(BeNil()) }) - It("cannot transfer vested tokens", func() { + It("cannot transfer locked vested tokens", func() { err := s.app.BankKeeper.SendCoins( s.ctx, clawbackAccount.GetAddress(), @@ -289,53 +361,109 @@ var _ = Describe("Clawback Vesting Accounts", Ordered, func() { It("can perform Ethereum tx with spendable balance", func() { account := testAccounts[0] + coins := testutil.TestVestingSchedule.UnlockedCoinsPerLockup // Fund account with new spendable tokens - err := testutil.FundAccount(s.ctx, s.app.BankKeeper, account.address, unlockedPerLockup) + err := testutil.FundAccount(s.ctx, s.app.BankKeeper, account.address, coins) Expect(err).To(BeNil()) - txAmount := unlockedPerLockupAmt.BigInt() - msg, err := utiltx.CreateEthTx(s.ctx, s.app, account.privKey, account.address, dest, txAmount, 0) + txAmount := coins.AmountOf(stakeDenom) + msg, err := utiltx.CreateEthTx(s.ctx, s.app, account.privKey, account.address, dest, txAmount.BigInt(), 0) Expect(err).To(BeNil()) - assertEthSucceeds([]TestClawbackAccount{account}, funder, dest, unlockedPerLockupAmt, stakeDenom, msg) + assertEthSucceeds([]TestClawbackAccount{account}, funder, dest, txAmount, stakeDenom, msg) }) - It("cannot perform Ethereum tx with locked balance", func() { + It("cannot perform Ethereum tx with locked vested balance", func() { account := testAccounts[0] txAmount := vested.AmountOf(stakeDenom).BigInt() msg, err := utiltx.CreateEthTx(s.ctx, s.app, account.privKey, account.address, dest, txAmount, 0) Expect(err).To(BeNil()) - assertEthFails(msg) }) }) - Context("Between first and second lockup periods", func() { BeforeEach(func() { // Surpass first lockup - vestDuration := time.Duration(lockupLength) + vestDuration := time.Duration(testutil.TestVestingSchedule.LockupPeriodLength) s.CommitAfter(vestDuration * time.Second) + // after first lockup period + // half of total vesting tokens are unlocked + // but only 12 vesting periods passed // Check if some, but not all tokens are vested and unlocked for _, account := range testAccounts { - vested := account.clawbackAccount.GetVestedOnly(s.ctx.BlockTime()) - unlocked := account.clawbackAccount.GetUnlockedOnly(s.ctx.BlockTime()) + vested = account.clawbackAccount.GetVestedCoins(s.ctx.BlockTime()) + unlocked := account.clawbackAccount.GetUnlockedCoins(s.ctx.BlockTime()) + freeCoins = account.clawbackAccount.GetUnlockedVestedCoins(s.ctx.BlockTime()) + expVested := sdk.NewCoins(sdk.NewCoin(stakeDenom, amt.Mul(math.NewInt(lockup)))) + expUnlockedVested := expVested - s.Require().NotEqual(vestingAmtTotal, vested) - s.Require().Equal(expVested, vested) - s.Require().Equal(unlocked, unlockedPerLockup) + Expect(vested).NotTo(Equal(vestingAmtTotal)) + Expect(vested).To(Equal(expVested)) + Expect(unlocked).To(Equal(unlockedPerLockup)) + Expect(freeCoins).To(Equal(expUnlockedVested)) } }) - It("should enable access to unlocked EVM tokens (single-account, single-msg)", func() { + It("delegate unlocked vested tokens and spendable balance is updated properly", func() { + account := testAccounts[0] + balance := s.app.BankKeeper.GetBalance(s.ctx, account.address, stakeDenom) + // the returned balance should be the account's initial balance and + // the total amount of the vesting schedule + Expect(balance.Amount).To(Equal(accountGasCoverage.Add(vestingAmtTotal...)[0].Amount)) + + spReq := &banktypes.QuerySpendableBalanceByDenomRequest{Address: account.address.String(), Denom: stakeDenom} + spRes, err := s.app.BankKeeper.SpendableBalanceByDenom(s.ctx, spReq) + Expect(err).To(BeNil()) + // spendable balance should be the initial account balance + vested tokens + initialSpendableBalance := spRes.Balance + Expect(initialSpendableBalance.Amount).To(Equal(accountGasCoverage.Add(freeCoins...)[0].Amount)) + + // can delegate vested tokens + // fees paid is accountGasCoverage amount + res, err := testutil.Delegate(s.ctx, s.app, account.privKey, freeCoins[0], s.validator) + Expect(err).ToNot(HaveOccurred(), "expected no error during delegation") + Expect(res.Code).To(BeZero(), "expected delegation to succeed") + + // spendable balance should be updated to be prevSpendableBalance - delegatedAmt - fees + spRes, err = s.app.BankKeeper.SpendableBalanceByDenom(s.ctx, spReq) + Expect(err).To(BeNil()) + Expect(spRes.Balance.Amount.Int64()).To(Equal(int64(0))) + + // try to send coins - should error + err = s.app.BankKeeper.SendCoins(s.ctx, account.address, funder, vested) + Expect(err).NotTo(BeNil()) + Expect(err.Error()).To(ContainSubstring("spendable balance")) + Expect(err.Error()).To(ContainSubstring("is smaller than")) + }) + + It("cannot delegate more than vested tokens", func() { account := testAccounts[0] + balance := s.app.BankKeeper.GetBalance(s.ctx, account.address, stakeDenom) + // the returned balance should be the account's initial balance and + // the total amount of the vesting schedule + Expect(balance.Amount).To(Equal(accountGasCoverage.Add(vestingAmtTotal...)[0].Amount)) - txAmount := unlockedPerLockupAmt.BigInt() - msg, err := utiltx.CreateEthTx(s.ctx, s.app, account.privKey, account.address, dest, txAmount, 0) + spReq := &banktypes.QuerySpendableBalanceByDenomRequest{Address: account.address.String(), Denom: stakeDenom} + spRes, err := s.app.BankKeeper.SpendableBalanceByDenom(s.ctx, spReq) + Expect(err).To(BeNil()) + // spendable balance should be the initial account balance + vested tokens + initialSpendableBalance := spRes.Balance + Expect(initialSpendableBalance.Amount).To(Equal(accountGasCoverage.Add(freeCoins...)[0].Amount)) + + // cannot delegate more than vested tokens + _, err = testutil.Delegate(s.ctx, s.app, account.privKey, freeCoins[0].Add(sdk.NewCoin(stakeDenom, math.NewInt(1))), s.validator) + Expect(err).To(HaveOccurred(), "expected no error during delegation") + Expect(err.Error()).To(ContainSubstring("cannot delegate unvested coins")) + }) + + It("should enable access to unlocked and vested EVM tokens (single-account, single-msg)", func() { + account := testAccounts[0] + msg, err := utiltx.CreateEthTx(s.ctx, s.app, account.privKey, account.address, dest, vested[0].Amount.BigInt(), 0) Expect(err).To(BeNil()) - assertEthSucceeds([]TestClawbackAccount{account}, funder, dest, unlockedPerLockupAmt, stakeDenom, msg) + assertEthSucceeds([]TestClawbackAccount{account}, funder, dest, vested[0].Amount, stakeDenom, msg) }) It("should enable access to unlocked EVM tokens (single-account, multiple-msgs)", func() { @@ -343,18 +471,18 @@ var _ = Describe("Clawback Vesting Accounts", Ordered, func() { // Split the total unlocked amount into numTestMsgs equally sized tx's msgs := make([]sdk.Msg, numTestMsgs) - txAmount := unlockedPerLockupAmt.QuoRaw(int64(numTestMsgs)).BigInt() + txAmount := vested[0].Amount.QuoRaw(int64(numTestMsgs)).BigInt() for i := 0; i < numTestMsgs; i++ { msgs[i], err = utiltx.CreateEthTx(s.ctx, s.app, account.privKey, account.address, dest, txAmount, i) Expect(err).To(BeNil()) } - assertEthSucceeds([]TestClawbackAccount{account}, funder, dest, unlockedPerLockupAmt, stakeDenom, msgs...) + assertEthSucceeds([]TestClawbackAccount{account}, funder, dest, vested[0].Amount, stakeDenom, msgs...) }) It("should enable access to unlocked EVM tokens (multi-account, single-msg)", func() { - txAmount := unlockedPerLockupAmt.BigInt() + txAmount := vested[0].Amount.BigInt() msgs := make([]sdk.Msg, numTestAccounts) for i, grantee := range testAccounts { @@ -362,12 +490,12 @@ var _ = Describe("Clawback Vesting Accounts", Ordered, func() { Expect(err).To(BeNil()) } - assertEthSucceeds(testAccounts, funder, dest, unlockedPerLockupAmt, stakeDenom, msgs...) + assertEthSucceeds(testAccounts, funder, dest, vested[0].Amount, stakeDenom, msgs...) }) It("should enable access to unlocked EVM tokens (multi-account, multiple-msgs)", func() { msgs := []sdk.Msg{} - txAmount := unlockedPerLockupAmt.QuoRaw(int64(numTestMsgs)).BigInt() + txAmount := vested[0].Amount.QuoRaw(int64(numTestMsgs)).BigInt() for _, grantee := range testAccounts { for j := 0; j < numTestMsgs; j++ { @@ -377,7 +505,7 @@ var _ = Describe("Clawback Vesting Accounts", Ordered, func() { } } - assertEthSucceeds(testAccounts, funder, dest, unlockedPerLockupAmt, stakeDenom, msgs...) + assertEthSucceeds(testAccounts, funder, dest, vested[0].Amount, stakeDenom, msgs...) }) It("should not enable access to locked EVM tokens (single-account, single-msg)", func() { @@ -386,13 +514,12 @@ var _ = Describe("Clawback Vesting Accounts", Ordered, func() { txAmount := vestingAmtTotal.AmountOf(stakeDenom).BigInt() msg, err := utiltx.CreateEthTx(s.ctx, s.app, testAccount.privKey, testAccount.address, dest, txAmount, 0) Expect(err).To(BeNil()) - assertEthFails(msg) }) It("should not enable access to locked EVM tokens (single-account, multiple-msgs)", func() { msgs := make([]sdk.Msg, numTestMsgs+1) - txAmount := unlockedPerLockupAmt.QuoRaw(int64(numTestMsgs)).BigInt() + txAmount := vested[0].Amount.QuoRaw(int64(numTestMsgs)).BigInt() testAccount := testAccounts[0] // Add additional message that exceeds unlocked balance @@ -400,29 +527,26 @@ var _ = Describe("Clawback Vesting Accounts", Ordered, func() { msgs[i], err = utiltx.CreateEthTx(s.ctx, s.app, testAccount.privKey, testAccount.address, dest, txAmount, i) Expect(err).To(BeNil()) } - assertEthFails(msgs...) }) It("should not enable access to locked EVM tokens (multi-account, single-msg)", func() { msgs := make([]sdk.Msg, numTestAccounts+1) - txAmount := unlockedPerLockupAmt.BigInt() + txAmount := vested[0].Amount.BigInt() for i, account := range testAccounts { msgs[i], err = utiltx.CreateEthTx(s.ctx, s.app, account.privKey, account.address, dest, txAmount, 0) Expect(err).To(BeNil()) } - // Add additional message that exceeds unlocked balance msgs[numTestAccounts], err = utiltx.CreateEthTx(s.ctx, s.app, testAccounts[0].privKey, testAccounts[0].address, dest, txAmount, 1) Expect(err).To(BeNil()) - assertEthFails(msgs...) }) It("should not enable access to locked EVM tokens (multi-account, multiple-msgs)", func() { msgs := []sdk.Msg{} - txAmount := unlockedPerLockupAmt.QuoRaw(int64(numTestMsgs)).BigInt() + txAmount := vested[0].Amount.QuoRaw(int64(numTestMsgs)).BigInt() var addedMsg sdk.Msg for _, account := range testAccounts { @@ -431,33 +555,26 @@ var _ = Describe("Clawback Vesting Accounts", Ordered, func() { msgs = append(msgs, addedMsg) } } - // Add additional message that exceeds unlocked balance addedMsg, err = utiltx.CreateEthTx(s.ctx, s.app, testAccounts[0].privKey, testAccounts[0].address, dest, txAmount, numTestMsgs) Expect(err).To(BeNil()) msgs = append(msgs, addedMsg) - assertEthFails(msgs...) }) - It("should not short-circuit with a normal account", func() { account := testAccounts[0] address, privKey := utiltx.NewAccAddressAndKey() - txAmount := vestingAmtTotal.AmountOf(stakeDenom).BigInt() - // Fund a normal account to try to short-circuit the AnteHandler err = testutil.FundAccount(s.ctx, s.app.BankKeeper, address, vestingAmtTotal.MulInt(math.NewInt(2))) Expect(err).To(BeNil()) normalAccMsg, err := utiltx.CreateEthTx(s.ctx, s.app, privKey, address, dest, txAmount, 0) Expect(err).To(BeNil()) - // Attempt to spend entire balance msg, err := utiltx.CreateEthTx(s.ctx, s.app, account.privKey, account.address, dest, txAmount, 0) Expect(err).To(BeNil()) err = validateEthVestingTransactionDecorator(normalAccMsg, msg) Expect(err).ToNot(BeNil()) - _, err = testutil.DeliverEthTx(s.app, nil, msg) Expect(err).ToNot(BeNil()) }) @@ -465,61 +582,67 @@ var _ = Describe("Clawback Vesting Accounts", Ordered, func() { Context("after first lockup and additional vest", func() { BeforeEach(func() { - vestDuration := time.Duration(lockupLength + vestingLength) + vestDuration := time.Duration(testutil.TestVestingSchedule.LockupPeriodLength + vestingLength) s.CommitAfter(vestDuration * time.Second) - vested = clawbackAccount.GetVestedOnly(s.ctx.BlockTime()) + // after first lockup period + // half of total vesting tokens are unlocked + // now only 13 vesting periods passed + + vested = clawbackAccount.GetVestedCoins(s.ctx.BlockTime()) expVested := sdk.NewCoins(sdk.NewCoin(stakeDenom, amt.Mul(math.NewInt(lockup+1)))) - unlocked := clawbackAccount.GetUnlockedOnly(s.ctx.BlockTime()) + unlocked := clawbackAccount.GetUnlockedCoins(s.ctx.BlockTime()) expUnlocked := unlockedPerLockup - s.Require().Equal(expVested, vested) - s.Require().Equal(expUnlocked, unlocked) + Expect(expVested).To(Equal(vested)) + Expect(expUnlocked).To(Equal(unlocked)) }) It("should enable access to unlocked EVM tokens", func() { testAccount := testAccounts[0] - txAmount := unlockedPerLockupAmt.BigInt() + txAmount := vested[0].Amount.BigInt() msg, err := utiltx.CreateEthTx(s.ctx, s.app, testAccount.privKey, testAccount.address, dest, txAmount, 0) Expect(err).To(BeNil()) - assertEthSucceeds([]TestClawbackAccount{testAccount}, funder, dest, unlockedPerLockupAmt, stakeDenom, msg) + assertEthSucceeds([]TestClawbackAccount{testAccount}, funder, dest, vested[0].Amount, stakeDenom, msg) }) - It("should not enable access to locked EVM tokens", func() { + It("should not enable access to unvested EVM tokens", func() { testAccount := testAccounts[0] - txAmount := vested.AmountOf(stakeDenom).BigInt() + txAmount := vested[0].Amount.Add(amt).BigInt() msg, err := utiltx.CreateEthTx(s.ctx, s.app, testAccount.privKey, testAccount.address, dest, txAmount, 0) Expect(err).To(BeNil()) assertEthFails(msg) }) }) - Context("after half of vesting period and both lockups", func() { BeforeEach(func() { // Surpass lockup duration - lockupDuration := time.Duration(lockupLength * numLockupPeriods) + lockupDuration := time.Duration(testutil.TestVestingSchedule.LockupPeriodLength * numLockupPeriods) s.CommitAfter(lockupDuration * time.Second) + // after two lockup period + // total vesting tokens are unlocked + // and 24/48 vesting periods passed // Check if some, but not all tokens are vested - unvested = clawbackAccount.GetUnvestedOnly(s.ctx.BlockTime()) - vested = clawbackAccount.GetVestedOnly(s.ctx.BlockTime()) + unvested = clawbackAccount.GetVestingCoins(s.ctx.BlockTime()) + vested = clawbackAccount.GetVestedCoins(s.ctx.BlockTime()) expVested := sdk.NewCoins(sdk.NewCoin(stakeDenom, amt.Mul(math.NewInt(lockup*numLockupPeriods)))) - s.Require().NotEqual(vestingAmtTotal, vested) - s.Require().Equal(expVested, vested) + Expect(vestingAmtTotal).NotTo(Equal(vested)) + Expect(expVested).To(Equal(vested)) }) It("can delegate vested tokens", func() { - _, err := delegate(testAccounts[0], vested) + _, err := testutil.Delegate(s.ctx, s.app, testAccounts[0].privKey, vested[0], s.validator) Expect(err).To(BeNil()) }) It("cannot delegate unvested tokens", func() { - _, err := delegate(testAccounts[0], vestingAmtTotal) + _, err := testutil.Delegate(s.ctx, s.app, testAccounts[0].privKey, vestingAmtTotal[0], s.validator) Expect(err).ToNot(BeNil()) }) @@ -532,7 +655,6 @@ var _ = Describe("Clawback Vesting Accounts", Ordered, func() { ) Expect(err).To(BeNil()) }) - It("cannot transfer unvested tokens", func() { err := s.app.BankKeeper.SendCoins( s.ctx, @@ -542,18 +664,14 @@ var _ = Describe("Clawback Vesting Accounts", Ordered, func() { ) Expect(err).ToNot(BeNil()) }) - It("can perform Ethereum tx with spendable balance", func() { account := testAccounts[0] - txAmount := vested.AmountOf(stakeDenom).BigInt() msg, err := utiltx.CreateEthTx(s.ctx, s.app, account.privKey, account.address, dest, txAmount, 0) Expect(err).To(BeNil()) - assertEthSucceeds([]TestClawbackAccount{account}, funder, dest, vested.AmountOf(stakeDenom), stakeDenom, msg) }) }) - Context("after entire vesting period and both lockups", func() { BeforeEach(func() { // Surpass vest duration @@ -561,44 +679,42 @@ var _ = Describe("Clawback Vesting Accounts", Ordered, func() { s.CommitAfter(vestDuration * time.Second) // Check that all tokens are vested and unlocked - unvested = clawbackAccount.GetUnvestedOnly(s.ctx.BlockTime()) - vested = clawbackAccount.GetVestedOnly(s.ctx.BlockTime()) - locked := clawbackAccount.LockedCoins(s.ctx.BlockTime()) + unvested = clawbackAccount.GetVestingCoins(s.ctx.BlockTime()) + vested = clawbackAccount.GetVestedCoins(s.ctx.BlockTime()) + unlocked := clawbackAccount.GetUnlockedCoins(s.ctx.BlockTime()) + unlockedVested := clawbackAccount.GetUnlockedVestedCoins(s.ctx.BlockTime()) + notSpendable := clawbackAccount.LockedCoins(s.ctx.BlockTime()) + + // all vested coins should be unlocked + Expect(vested).To(Equal(unlockedVested)) zeroCoins := sdk.NewCoins(sdk.NewCoin(stakeDenom, math.ZeroInt())) - s.Require().Equal(vestingAmtTotal, vested) - s.Require().Equal(zeroCoins, locked) - s.Require().Equal(zeroCoins, unvested) + Expect(vestingAmtTotal).To(Equal(vested)) + Expect(vestingAmtTotal).To(Equal(unlocked)) + Expect(zeroCoins).To(Equal(notSpendable)) + Expect(zeroCoins).To(Equal(unvested)) }) It("can send entire balance", func() { account := testAccounts[0] - txAmount := vestingAmtTotal.AmountOf(stakeDenom) msg, err := utiltx.CreateEthTx(s.ctx, s.app, account.privKey, account.address, dest, txAmount.BigInt(), 0) Expect(err).To(BeNil()) - assertEthSucceeds([]TestClawbackAccount{account}, funder, dest, txAmount, stakeDenom, msg) }) - It("cannot exceed balance", func() { account := testAccounts[0] - txAmount := vestingAmtTotal.AmountOf(stakeDenom).Mul(math.NewInt(2)) msg, err := utiltx.CreateEthTx(s.ctx, s.app, account.privKey, account.address, dest, txAmount.BigInt(), 0) Expect(err).To(BeNil()) - assertEthFails(msg) }) - It("should short-circuit with zero balance", func() { account := testAccounts[0] balance := s.app.BankKeeper.GetBalance(s.ctx, account.address, stakeDenom) - // Drain account balance err := s.app.BankKeeper.SendCoins(s.ctx, account.address, dest, sdk.NewCoins(balance)) Expect(err).To(BeNil()) - msg, err := utiltx.CreateEthTx(s.ctx, s.app, account.privKey, account.address, dest, big.NewInt(0), 0) Expect(err).To(BeNil()) err = validateEthVestingTransactionDecorator(msg) @@ -614,36 +730,6 @@ var _ = Describe("Clawback Vesting Accounts", Ordered, func() { // 22/09 Cliff ends // 23/02 Lock ends var _ = Describe("Clawback Vesting Accounts - claw back tokens", func() { - // Monthly vesting period - stakeDenom := utils.BaseDenom - amt := math.NewInt(1) - vestingLength := int64(60 * 60 * 24 * 30) // in seconds - vestingAmt := sdk.NewCoins(sdk.NewCoin(stakeDenom, amt)) - vestingPeriod := sdkvesting.Period{Length: vestingLength, Amount: vestingAmt} - - // 4 years vesting total - periodsTotal := int64(48) - vestingTotal := amt.Mul(math.NewInt(periodsTotal)) - vestingAmtTotal := sdk.NewCoins(sdk.NewCoin(stakeDenom, vestingTotal)) - - // 6 month cliff - cliff := int64(6) - cliffLength := vestingLength * cliff - cliffAmt := sdk.NewCoins(sdk.NewCoin(stakeDenom, amt.Mul(math.NewInt(cliff)))) - cliffPeriod := sdkvesting.Period{Length: cliffLength, Amount: cliffAmt} - - // 12 month lockup - lockup := int64(12) // 12 year - lockupLength := vestingLength * lockup - lockupPeriod := sdkvesting.Period{Length: lockupLength, Amount: vestingAmtTotal} - lockupPeriods := sdkvesting.Periods{lockupPeriod} - - // Create vesting periods with initial cliff - vestingPeriods := sdkvesting.Periods{cliffPeriod} - for p := int64(1); p <= periodsTotal-cliff; p++ { - vestingPeriods = append(vestingPeriods, vestingPeriod) - } - var ( clawbackAccount *types.ClawbackVestingAccount vesting sdk.Coins @@ -653,12 +739,13 @@ var _ = Describe("Clawback Vesting Accounts - claw back tokens", func() { isClawback bool ) - vestingAddr := sdk.AccAddress(utiltx.GenerateAddress().Bytes()) + vestingAddr, vestingPriv := utiltx.NewAccAddressAndKey() funder, funderPriv := utiltx.NewAccAddressAndKey() dest := sdk.AccAddress(utiltx.GenerateAddress().Bytes()) BeforeEach(func() { - s.SetupTest() + Expect(s.SetupTest()).To(BeNil()) // reset + vestingStart := s.ctx.BlockTime() // Initialize account at vesting address by funding it with tokens @@ -668,27 +755,27 @@ var _ = Describe("Clawback Vesting Accounts - claw back tokens", func() { err = s.app.BankKeeper.SendCoins(s.ctx, vestingAddr, funder, vestingAmtTotal) Expect(err).ToNot(HaveOccurred(), "failed to send coins to funder") + // Send some tokens to the vesting account to cover tx fees + err = testutil.FundAccount(s.ctx, s.app.BankKeeper, vestingAddr, accountGasCoverage) + Expect(err).ToNot(HaveOccurred(), "failed to fund target account") + balanceFunder := s.app.BankKeeper.GetBalance(s.ctx, funder, stakeDenom) balanceGrantee := s.app.BankKeeper.GetBalance(s.ctx, vestingAddr, stakeDenom) balanceDest := s.app.BankKeeper.GetBalance(s.ctx, dest, stakeDenom) Expect(balanceFunder).To(Equal(vestingAmtTotal[0]), "expected different funder balance") - Expect(balanceGrantee.IsZero()).To(BeTrue(), "expected balance of vesting account to be zero") + Expect(balanceGrantee.Amount).To(Equal(accountGasCoverage[0].Amount)) Expect(balanceDest.IsZero()).To(BeTrue(), "expected destination balance to be zero") msg := types.NewMsgCreateClawbackVestingAccount(funder, vestingAddr, true) - _, err = s.app.VestingKeeper.CreateClawbackVestingAccount(sdk.WrapSDKContext(s.ctx), msg) Expect(err).ToNot(HaveOccurred(), "expected creating clawback vesting account to succeed") - acc := s.app.AccountKeeper.GetAccount(s.ctx, vestingAddr) clawbackAccount, isClawback = acc.(*types.ClawbackVestingAccount) Expect(isClawback).To(BeTrue(), "expected account to be clawback vesting account") - // fund the vesting account - msgFund := types.NewMsgFundVestingAccount(funder, vestingAddr, vestingStart, lockupPeriods, vestingPeriods) + msgFund := types.NewMsgFundVestingAccount(funder, vestingAddr, vestingStart, testutil.TestVestingSchedule.LockupPeriods, testutil.TestVestingSchedule.VestingPeriods) _, err = s.app.VestingKeeper.FundVestingAccount(sdk.WrapSDKContext(s.ctx), msgFund) Expect(err).ToNot(HaveOccurred(), "expected funding vesting account to succeed") - acc = s.app.AccountKeeper.GetAccount(s.ctx, vestingAddr) Expect(acc).ToNot(BeNil(), "expected account to exist") clawbackAccount, isClawback = acc.(*types.ClawbackVestingAccount) @@ -696,18 +783,17 @@ var _ = Describe("Clawback Vesting Accounts - claw back tokens", func() { // Check if all tokens are unvested and locked at vestingStart vesting = clawbackAccount.GetVestingCoins(s.ctx.BlockTime()) - vested = clawbackAccount.GetVestedOnly(s.ctx.BlockTime()) - unlocked = clawbackAccount.GetUnlockedOnly(s.ctx.BlockTime()) + vested = clawbackAccount.GetVestedCoins(s.ctx.BlockTime()) + unlocked = clawbackAccount.GetUnlockedCoins(s.ctx.BlockTime()) Expect(vesting).To(Equal(vestingAmtTotal), "expected difference vesting tokens") Expect(vested.IsZero()).To(BeTrue(), "expected no tokens to be vested") Expect(unlocked.IsZero()).To(BeTrue(), "expected no tokens to be unlocked") - bF := s.app.BankKeeper.GetBalance(s.ctx, funder, stakeDenom) balanceGrantee = s.app.BankKeeper.GetBalance(s.ctx, vestingAddr, stakeDenom) balanceDest = s.app.BankKeeper.GetBalance(s.ctx, dest, stakeDenom) Expect(bF.IsZero()).To(BeTrue(), "expected funder balance to be zero") - Expect(balanceGrantee).To(Equal(vestingAmtTotal[0]), "expected all tokens to be locked") + Expect(balanceGrantee).To(Equal(vestingAmtTotal.Add(accountGasCoverage...)[0]), "expected all tokens to be locked") Expect(balanceDest.IsZero()).To(BeTrue(), "expected no tokens to be unlocked") }) @@ -716,37 +802,30 @@ var _ = Describe("Clawback Vesting Accounts - claw back tokens", func() { emptyVestingAddr := sdk.AccAddress(utiltx.GenerateAddress().Bytes()) err := testutil.FundAccount(s.ctx, s.app.BankKeeper, emptyVestingAddr, vestingAmtTotal) Expect(err).ToNot(HaveOccurred(), "failed to fund target account") - msg := types.NewMsgCreateClawbackVestingAccount(funder, emptyVestingAddr, false) - _, err = s.app.VestingKeeper.CreateClawbackVestingAccount(sdk.WrapSDKContext(s.ctx), msg) Expect(err).ToNot(HaveOccurred(), "expected creating clawback vesting account to succeed") - clawbackMsg := types.NewMsgClawback(funder, emptyVestingAddr, dest) _, err = s.app.VestingKeeper.Clawback(ctx, clawbackMsg) Expect(err).To(HaveOccurred()) Expect(err.Error()).To(ContainSubstring("has no vesting or lockup periods")) }) - It("should claw back unvested amount before cliff", func() { ctx := sdk.WrapSDKContext(s.ctx) - balanceFunder := s.app.BankKeeper.GetBalance(s.ctx, funder, stakeDenom) balanceDest := s.app.BankKeeper.GetBalance(s.ctx, dest, stakeDenom) - // Perform clawback before cliff msg := types.NewMsgClawback(funder, vestingAddr, dest) res, err := s.app.VestingKeeper.Clawback(ctx, msg) Expect(err).To(BeNil()) Expect(res.Coins).To(Equal(vestingAmtTotal), "expected different coins to be clawed back") - // All initial vesting amount goes to dest bF := s.app.BankKeeper.GetBalance(s.ctx, funder, stakeDenom) bG := s.app.BankKeeper.GetBalance(s.ctx, vestingAddr, stakeDenom) bD := s.app.BankKeeper.GetBalance(s.ctx, dest, stakeDenom) Expect(bF).To(Equal(balanceFunder), "expected funder balance to be unchanged") - Expect(bG.IsZero()).To(BeTrue(), "expected all tokens to be clawed back") + Expect(bG.Amount).To(Equal(accountGasCoverage[0].Amount), "expected all tokens to be clawed back") Expect(bD).To(Equal(balanceDest.Add(vestingAmtTotal[0])), "expected all tokens to be clawed back to the destination account") }) @@ -756,82 +835,78 @@ var _ = Describe("Clawback Vesting Accounts - claw back tokens", func() { s.CommitAfter(cliffDuration * time.Second) // Check that all tokens are locked and some, but not all tokens are vested - vested = clawbackAccount.GetVestedOnly(s.ctx.BlockTime()) - unlocked = clawbackAccount.GetUnlockedOnly(s.ctx.BlockTime()) - free = clawbackAccount.GetVestedCoins(s.ctx.BlockTime()) + vested = clawbackAccount.GetVestedCoins(s.ctx.BlockTime()) + unlocked = clawbackAccount.GetUnlockedCoins(s.ctx.BlockTime()) + free = clawbackAccount.GetUnlockedVestedCoins(s.ctx.BlockTime()) vesting = clawbackAccount.GetVestingCoins(s.ctx.BlockTime()) expVestedAmount := amt.Mul(math.NewInt(cliff)) expVested := sdk.NewCoins(sdk.NewCoin(stakeDenom, expVestedAmount)) unvested := vestingAmtTotal.Sub(vested...) - s.Require().Equal(expVested, vested) - s.Require().True(expVestedAmount.GT(math.NewInt(0))) - s.Require().True(free.IsZero()) - s.Require().Equal(vesting, vestingAmtTotal) + Expect(expVested).To(Equal(vested)) + Expect(expVestedAmount.GT(math.NewInt(0))).To(BeTrue()) + Expect(free.IsZero()).To(BeTrue()) + Expect(vesting).To(Equal(vestingAmtTotal.Sub(expVested...))) balanceFunder := s.app.BankKeeper.GetBalance(s.ctx, funder, stakeDenom) balanceGrantee := s.app.BankKeeper.GetBalance(s.ctx, vestingAddr, stakeDenom) balanceDest := s.app.BankKeeper.GetBalance(s.ctx, dest, stakeDenom) - // Perform clawback msg := types.NewMsgClawback(funder, vestingAddr, dest) ctx := sdk.WrapSDKContext(s.ctx) res, err := s.app.VestingKeeper.Clawback(ctx, msg) Expect(err).To(BeNil()) Expect(res.Coins).To(Equal(unvested), "expected unvested coins to be clawed back") - bF := s.app.BankKeeper.GetBalance(s.ctx, funder, stakeDenom) bG := s.app.BankKeeper.GetBalance(s.ctx, vestingAddr, stakeDenom) bD := s.app.BankKeeper.GetBalance(s.ctx, dest, stakeDenom) - expClawback := clawbackAccount.GetUnvestedOnly(s.ctx.BlockTime()) + expClawback := clawbackAccount.GetVestingCoins(s.ctx.BlockTime()) // Any unvested amount is clawed back - s.Require().Equal(balanceFunder, bF) - s.Require().Equal(balanceGrantee.Sub(expClawback[0]).Amount.Uint64(), bG.Amount.Uint64()) - s.Require().Equal(balanceDest.Add(expClawback[0]).Amount.Uint64(), bD.Amount.Uint64()) + Expect(balanceFunder).To(Equal(bF)) + Expect(balanceGrantee.Sub(expClawback[0]).Amount.Uint64()).To(Equal(bG.Amount.Uint64())) + Expect(balanceDest.Add(expClawback[0]).Amount.Uint64()).To(Equal(bD.Amount.Uint64())) }) It("should claw back any unvested amount after cliff and unlocking", func() { // Surpass lockup duration // A strict `if t < clawbackTime` comparison is used in ComputeClawback // so, we increment the duration with 1 for the free token calculation to match - lockupDuration := time.Duration(lockupLength + 1) + lockupDuration := time.Duration(testutil.TestVestingSchedule.LockupPeriodLength + 1) s.CommitAfter(lockupDuration * time.Second) // Check if some, but not all tokens are vested and unlocked - vested = clawbackAccount.GetVestedOnly(s.ctx.BlockTime()) - unlocked = clawbackAccount.GetUnlockedOnly(s.ctx.BlockTime()) + vested = clawbackAccount.GetVestedCoins(s.ctx.BlockTime()) + unlocked = clawbackAccount.GetUnlockedCoins(s.ctx.BlockTime()) free = clawbackAccount.GetVestedCoins(s.ctx.BlockTime()) vesting = clawbackAccount.GetVestingCoins(s.ctx.BlockTime()) expVestedAmount := amt.Mul(math.NewInt(lockup)) expVested := sdk.NewCoins(sdk.NewCoin(stakeDenom, expVestedAmount)) unvested := vestingAmtTotal.Sub(vested...) - s.Require().Equal(free, vested) - s.Require().Equal(expVested, vested) - s.Require().True(expVestedAmount.GT(math.NewInt(0))) - s.Require().Equal(vesting, unvested) + Expect(free).To(Equal(vested)) + Expect(expVested).To(Equal(vested)) + Expect(expVestedAmount.GT(math.NewInt(0))).To(BeTrue()) + Expect(vesting).To(Equal(unvested)) balanceFunder := s.app.BankKeeper.GetBalance(s.ctx, funder, stakeDenom) balanceGrantee := s.app.BankKeeper.GetBalance(s.ctx, vestingAddr, stakeDenom) balanceDest := s.app.BankKeeper.GetBalance(s.ctx, dest, stakeDenom) - // Perform clawback msg := types.NewMsgClawback(funder, vestingAddr, dest) ctx := sdk.WrapSDKContext(s.ctx) res, err := s.app.VestingKeeper.Clawback(ctx, msg) Expect(err).To(BeNil()) Expect(res.Coins).To(Equal(unvested), "expected only coins to be clawed back") - bF := s.app.BankKeeper.GetBalance(s.ctx, funder, stakeDenom) bG := s.app.BankKeeper.GetBalance(s.ctx, vestingAddr, stakeDenom) bD := s.app.BankKeeper.GetBalance(s.ctx, dest, stakeDenom) // Any unvested amount is clawed back - s.Require().Equal(balanceFunder, bF) - s.Require().Equal(balanceGrantee.Sub(vesting[0]).Amount.Uint64(), bG.Amount.Uint64()) - s.Require().Equal(balanceDest.Add(vesting[0]).Amount.Uint64(), bD.Amount.Uint64()) + Expect(balanceFunder).To(Equal(bF)) + Expect(balanceGrantee.Sub(vesting[0]).Amount.Uint64()).To(Equal(bG.Amount.Uint64())) + Expect(balanceDest.Add(vesting[0]).Amount.Uint64()).To(Equal(bD.Amount.Uint64())) }) It("should not claw back any amount after vesting periods end", func() { @@ -840,25 +915,24 @@ var _ = Describe("Clawback Vesting Accounts - claw back tokens", func() { s.CommitAfter(vestingDuration * time.Second) // Check if some, but not all tokens are vested and unlocked - vested = clawbackAccount.GetVestedOnly(s.ctx.BlockTime()) - unlocked = clawbackAccount.GetUnlockedOnly(s.ctx.BlockTime()) + vested = clawbackAccount.GetVestedCoins(s.ctx.BlockTime()) + unlocked = clawbackAccount.GetUnlockedCoins(s.ctx.BlockTime()) free = clawbackAccount.GetVestedCoins(s.ctx.BlockTime()) vesting = clawbackAccount.GetVestingCoins(s.ctx.BlockTime()) expVested := sdk.NewCoins(sdk.NewCoin(stakeDenom, amt.Mul(math.NewInt(periodsTotal)))) unvested := vestingAmtTotal.Sub(vested...) - s.Require().Equal(free, vested) - s.Require().Equal(expVested, vested) - s.Require().Equal(expVested, vestingAmtTotal) - s.Require().Equal(unlocked, vestingAmtTotal) - s.Require().Equal(vesting, unvested) - s.Require().True(vesting.IsZero()) + Expect(free).To(Equal(vested)) + Expect(expVested).To(Equal(vested)) + Expect(expVested).To(Equal(vestingAmtTotal)) + Expect(unlocked).To(Equal(vestingAmtTotal)) + Expect(vesting).To(Equal(unvested)) + Expect(vesting.IsZero()).To(BeTrue()) balanceFunder := s.app.BankKeeper.GetBalance(s.ctx, funder, stakeDenom) balanceGrantee := s.app.BankKeeper.GetBalance(s.ctx, vestingAddr, stakeDenom) balanceDest := s.app.BankKeeper.GetBalance(s.ctx, dest, stakeDenom) - // Perform clawback msg := types.NewMsgClawback(funder, vestingAddr, dest) ctx := sdk.WrapSDKContext(s.ctx) @@ -866,20 +940,18 @@ var _ = Describe("Clawback Vesting Accounts - claw back tokens", func() { Expect(err).To(BeNil(), "expected no error during clawback") Expect(res).ToNot(BeNil(), "expected response not to be nil") Expect(res.Coins).To(BeEmpty(), "expected nothing to be clawed back") - bF := s.app.BankKeeper.GetBalance(s.ctx, funder, stakeDenom) bG := s.app.BankKeeper.GetBalance(s.ctx, vestingAddr, stakeDenom) bD := s.app.BankKeeper.GetBalance(s.ctx, dest, stakeDenom) // No amount is clawed back - s.Require().Equal(balanceFunder, bF) - s.Require().Equal(balanceGrantee, bG) - s.Require().Equal(balanceDest, bD) + Expect(balanceFunder).To(Equal(bF)) + Expect(balanceGrantee).To(Equal(bG)) + Expect(balanceDest).To(Equal(bD)) }) Context("while there is an active governance proposal for the vesting account", func() { var clawbackProposalID uint64 - BeforeEach(func() { // submit a different proposal to simulate having multiple proposals of different types // on chain. @@ -893,10 +965,8 @@ var _ = Describe("Clawback Vesting Accounts - claw back tokens", func() { s.address.Bytes(), ) Expect(err).ToNot(HaveOccurred(), "expected no error creating the proposal submission message") - _, err = testutil.DeliverTx(s.ctx, s.app, s.priv, nil, msgSubmitProposal) Expect(err).ToNot(HaveOccurred(), "expected no error during proposal submission") - // submit clawback proposal govClawbackProposal := &types.ClawbackProposal{ Title: "test gov clawback", @@ -904,9 +974,7 @@ var _ = Describe("Clawback Vesting Accounts - claw back tokens", func() { Address: vestingAddr.String(), DestinationAddress: funder.String(), } - deposit := sdk.Coins{sdk.Coin{Denom: stakeDenom, Amount: math.NewInt(1)}} - // Create the message to submit the proposal msgSubmit, err := govv1beta1.NewMsgSubmitProposal( govClawbackProposal, deposit, s.address.Bytes(), @@ -915,9 +983,7 @@ var _ = Describe("Clawback Vesting Accounts - claw back tokens", func() { // deliver the proposal _, err = testutil.DeliverTx(s.ctx, s.app, s.priv, nil, msgSubmit) Expect(err).ToNot(HaveOccurred(), "expected no error during proposal submission") - s.Commit() - // Check if the proposal was submitted proposals := s.app.GovKeeper.GetProposals(s.ctx) Expect(len(proposals)).To(Equal(2), "expected two proposals to be found") @@ -926,49 +992,40 @@ var _ = Describe("Clawback Vesting Accounts - claw back tokens", func() { Expect(proposal.GetTitle()).To(Equal("test gov clawback"), "expected different proposal title") Expect(proposal.Status).To(Equal(govv1.StatusDepositPeriod), "expected proposal to be in deposit period") }) - Context("with deposit made", func() { BeforeEach(func() { params := s.app.GovKeeper.GetParams(s.ctx) depositAmount := params.MinDeposit[0].Amount.Sub(math.NewInt(1)) deposit := sdk.Coins{sdk.Coin{Denom: params.MinDeposit[0].Denom, Amount: depositAmount}} - // Deliver the deposit msgDeposit := govv1beta1.NewMsgDeposit(s.address.Bytes(), clawbackProposalID, deposit) _, err := testutil.DeliverTx(s.ctx, s.app, s.priv, nil, msgDeposit) Expect(err).ToNot(HaveOccurred(), "expected no error during proposal deposit") - s.Commit() - // Check the proposal is in voting period proposal, found := s.app.GovKeeper.GetProposal(s.ctx, clawbackProposalID) Expect(found).To(BeTrue(), "expected proposal to be found") Expect(proposal.Status).To(Equal(govv1.StatusVotingPeriod), "expected proposal to be in voting period") - // Check the store entry was set correctly hasActivePropposal := s.app.VestingKeeper.HasActiveClawbackProposal(s.ctx, vestingAddr) Expect(hasActivePropposal).To(BeTrue(), "expected an active clawback proposal for the vesting account") }) - It("should not allow clawback", func() { // Try to clawback tokens msgClawback := types.NewMsgClawback(funder, vestingAddr, dest) _, err = s.app.VestingKeeper.Clawback(sdk.WrapSDKContext(s.ctx), msgClawback) Expect(err).To(HaveOccurred(), "expected error during clawback while there is an active governance proposal") Expect(err.Error()).To(ContainSubstring("clawback is disabled while there is an active clawback proposal")) - // Check that the clawback was not performed acc := s.app.AccountKeeper.GetAccount(s.ctx, vestingAddr) Expect(acc).ToNot(BeNil(), "expected account to exist") _, isClawback := acc.(*types.ClawbackVestingAccount) Expect(isClawback).To(BeTrue(), "expected account to be clawback vesting account") - balances, err := s.app.VestingKeeper.Balances(s.ctx, &types.QueryBalancesRequest{ Address: vestingAddr.String(), }) Expect(err).ToNot(HaveOccurred(), "expected no error during balances query") Expect(balances.Unvested).To(Equal(vestingAmtTotal), "expected no tokens to be clawed back") - // Delegate some funds to the suite validators in order to vote on proposal with enough voting power // using only the suite private key priv, ok := s.priv.(*ethsecp256k1.PrivKey) @@ -981,39 +1038,32 @@ var _ = Describe("Clawback Vesting Accounts - claw back tokens", func() { Expect(err).ToNot(HaveOccurred(), "expected no error during delegation") Expect(res.Code).To(BeZero(), "expected delegation to succeed") } - // Vote on proposal res, err := testutil.Vote(s.ctx, s.app, priv, clawbackProposalID, govv1beta1.OptionYes) Expect(err).ToNot(HaveOccurred(), "failed to vote on proposal %d", clawbackProposalID) Expect(res.Code).To(BeZero(), "expected proposal voting to succeed") - // Check that the funds are clawed back after the proposal has ended s.CommitAfter(time.Hour * 24 * 365) // one year // Commit again because EndBlocker is run with time of the previous block and gov proposals are ended in EndBlocker s.Commit() - // Check that proposal has passed proposal, found := s.app.GovKeeper.GetProposal(s.ctx, clawbackProposalID) Expect(found).To(BeTrue(), "expected proposal to exist") Expect(proposal.Status).ToNot(Equal(govv1.StatusVotingPeriod), "expected proposal to not be in voting period anymore") Expect(proposal.Status).To(Equal(govv1.StatusPassed), "expected proposal to have passed") - // Check that the account was converted to a normal account acc = s.app.AccountKeeper.GetAccount(s.ctx, vestingAddr) Expect(acc).ToNot(BeNil(), "expected account to exist") _, isClawback = acc.(*types.ClawbackVestingAccount) Expect(isClawback).To(BeFalse(), "expected account to be a normal account") - hasActiveProposal := s.app.VestingKeeper.HasActiveClawbackProposal(s.ctx, vestingAddr) Expect(hasActiveProposal).To(BeFalse(), "expected no active clawback proposal") }) - It("should not allow changing the vesting funder", func() { msgUpdateFunder := types.NewMsgUpdateVestingFunder(funder, dest, vestingAddr) _, err = s.app.VestingKeeper.UpdateVestingFunder(sdk.WrapSDKContext(s.ctx), msgUpdateFunder) Expect(err).To(HaveOccurred(), "expected error during update funder while there is an active governance proposal") Expect(err.Error()).To(ContainSubstring("cannot update funder while there is an active clawback proposal")) - // Check that the funder was not updated acc := s.app.AccountKeeper.GetAccount(s.ctx, vestingAddr) Expect(acc).ToNot(BeNil(), "expected account to exist") @@ -1022,48 +1072,39 @@ var _ = Describe("Clawback Vesting Accounts - claw back tokens", func() { Expect(clawbackAcc.FunderAddress).To(Equal(funder.String()), "expected funder to be unchanged") }) }) - Context("without deposit made", func() { It("allows clawback and changing the funder before the deposit period ends", func() { newFunder, newPriv := utiltx.NewAccAddressAndKey() - // fund accounts err = testutil.FundAccountWithBaseDenom(s.ctx, s.app.BankKeeper, newFunder, 5e18) Expect(err).ToNot(HaveOccurred(), "failed to fund target account") err = testutil.FundAccountWithBaseDenom(s.ctx, s.app.BankKeeper, funder, 5e18) Expect(err).ToNot(HaveOccurred(), "failed to fund target account") - msgUpdateFunder := types.NewMsgUpdateVestingFunder(funder, newFunder, vestingAddr) _, err = testutil.DeliverTx(s.ctx, s.app, funderPriv, nil, msgUpdateFunder) Expect(err).ToNot(HaveOccurred(), "expected no error during update funder while there is an active governance proposal") - // Check that the funder was updated acc := s.app.AccountKeeper.GetAccount(s.ctx, vestingAddr) Expect(acc).ToNot(BeNil(), "expected account to exist") _, isClawback := acc.(*types.ClawbackVestingAccount) Expect(isClawback).To(BeTrue(), "expected account to be clawback vesting account") - // Claw back tokens msgClawback := types.NewMsgClawback(newFunder, vestingAddr, funder) _, err = testutil.DeliverTx(s.ctx, s.app, newPriv, nil, msgClawback) Expect(err).ToNot(HaveOccurred(), "expected no error during clawback while there is no deposit made") - // Check account is converted to a normal account acc = s.app.AccountKeeper.GetAccount(s.ctx, vestingAddr) Expect(acc).ToNot(BeNil(), "expected account to exist") _, isClawback = acc.(*types.ClawbackVestingAccount) Expect(isClawback).To(BeFalse(), "expected account to be a normal account") }) - It("should remove the store entry after the deposit period ends", func() { s.CommitAfter(time.Hour * 24 * 365) // one year // Commit again because EndBlocker is run with time of the previous block and gov proposals are ended in EndBlocker s.Commit() - // Check that the proposal has ended -- since deposit failed it's removed from the store _, found := s.app.GovKeeper.GetProposal(s.ctx, clawbackProposalID) Expect(found).To(BeFalse(), "expected proposal not to be found") - // Check that the store entry was removed hasActiveProposal := s.app.VestingKeeper.HasActiveClawbackProposal(s.ctx, vestingAddr) Expect(hasActiveProposal).To(BeFalse(), @@ -1073,83 +1114,74 @@ var _ = Describe("Clawback Vesting Accounts - claw back tokens", func() { }) }) }) - It("should update vesting funder and claw back unvested amount before cliff", func() { ctx := sdk.WrapSDKContext(s.ctx) newFunder := sdk.AccAddress(utiltx.GenerateAddress().Bytes()) - balanceFunder := s.app.BankKeeper.GetBalance(s.ctx, funder, stakeDenom) balanceNewFunder := s.app.BankKeeper.GetBalance(s.ctx, newFunder, stakeDenom) balanceGrantee := s.app.BankKeeper.GetBalance(s.ctx, vestingAddr, stakeDenom) - // Update clawback vesting account funder updateFunderMsg := types.NewMsgUpdateVestingFunder(funder, newFunder, vestingAddr) _, err := s.app.VestingKeeper.UpdateVestingFunder(ctx, updateFunderMsg) - s.Require().NoError(err) + Expect(err).To(BeNil()) // Perform clawback before cliff - funds should go to new funder (no dest address defined) msg := types.NewMsgClawback(newFunder, vestingAddr, sdk.AccAddress([]byte{})) res, err := s.app.VestingKeeper.Clawback(ctx, msg) Expect(err).To(BeNil()) Expect(res.Coins).To(Equal(vestingAmtTotal), "expected different coins to be clawed back") - // All initial vesting amount goes to funder bF := s.app.BankKeeper.GetBalance(s.ctx, funder, stakeDenom) bNewF := s.app.BankKeeper.GetBalance(s.ctx, newFunder, stakeDenom) bG := s.app.BankKeeper.GetBalance(s.ctx, vestingAddr, stakeDenom) // Original funder balance should not change - s.Require().Equal(bF, balanceFunder) + Expect(bF).To(Equal(balanceFunder)) // New funder should get the vested tokens - s.Require().Equal(balanceNewFunder.Add(vestingAmtTotal[0]).Amount.Uint64(), bNewF.Amount.Uint64()) - s.Require().Equal(balanceGrantee.Sub(vestingAmtTotal[0]).Amount.Uint64(), bG.Amount.Uint64()) + Expect(balanceNewFunder.Add(vestingAmtTotal[0]).Amount.Uint64()).To(Equal(bNewF.Amount.Uint64())) + Expect(balanceGrantee.Sub(vestingAmtTotal[0]).Amount.Uint64()).To(Equal(bG.Amount.Uint64())) }) It("should update vesting funder and first funder cannot claw back unvested before cliff", func() { ctx := sdk.WrapSDKContext(s.ctx) newFunder := sdk.AccAddress(utiltx.GenerateAddress().Bytes()) - balanceFunder := s.app.BankKeeper.GetBalance(s.ctx, funder, stakeDenom) balanceNewFunder := s.app.BankKeeper.GetBalance(s.ctx, newFunder, stakeDenom) balanceGrantee := s.app.BankKeeper.GetBalance(s.ctx, vestingAddr, stakeDenom) - // Update clawback vesting account funder updateFunderMsg := types.NewMsgUpdateVestingFunder(funder, newFunder, vestingAddr) _, err := s.app.VestingKeeper.UpdateVestingFunder(ctx, updateFunderMsg) - s.Require().NoError(err) + Expect(err).To(BeNil()) // Original funder tries to perform clawback before cliff - is not the current funder msg := types.NewMsgClawback(funder, vestingAddr, sdk.AccAddress([]byte{})) _, err = s.app.VestingKeeper.Clawback(ctx, msg) - s.Require().Error(err) + Expect(err).NotTo(BeNil()) // All balances should remain the same bF := s.app.BankKeeper.GetBalance(s.ctx, funder, stakeDenom) bNewF := s.app.BankKeeper.GetBalance(s.ctx, newFunder, stakeDenom) bG := s.app.BankKeeper.GetBalance(s.ctx, vestingAddr, stakeDenom) - s.Require().Equal(bF, balanceFunder) - s.Require().Equal(balanceNewFunder, bNewF) - s.Require().Equal(balanceGrantee, bG) + Expect(bF).To(Equal(balanceFunder)) + Expect(balanceNewFunder).To(Equal(bNewF)) + Expect(balanceGrantee).To(Equal(bG)) }) Context("governance clawback to community pool", func() { It("should claw back unvested amount before cliff", func() { ctx := sdk.WrapSDKContext(s.ctx) - // initial balances balanceFunder := s.app.BankKeeper.GetBalance(s.ctx, funder, stakeDenom) balanceGrantee := s.app.BankKeeper.GetBalance(s.ctx, vestingAddr, stakeDenom) balanceDest := s.app.BankKeeper.GetBalance(s.ctx, dest, stakeDenom) pool := s.app.DistrKeeper.GetFeePool(s.ctx) balanceCommPool := pool.CommunityPool[0] - // Perform clawback before cliff msg := types.NewMsgClawback(authtypes.NewModuleAddress(govtypes.ModuleName), vestingAddr, dest) res, err := s.app.VestingKeeper.Clawback(ctx, msg) Expect(err).To(BeNil()) Expect(res.Coins).To(Equal(vestingAmtTotal), "expected different coins to be clawed back") - // All initial vesting amount goes to community pool instead of dest bF := s.app.BankKeeper.GetBalance(s.ctx, funder, stakeDenom) bG := s.app.BankKeeper.GetBalance(s.ctx, vestingAddr, stakeDenom) @@ -1157,13 +1189,13 @@ var _ = Describe("Clawback Vesting Accounts - claw back tokens", func() { pool = s.app.DistrKeeper.GetFeePool(s.ctx) bCP := pool.CommunityPool[0] - s.Require().Equal(bF, balanceFunder) - s.Require().Equal(balanceGrantee.Sub(vestingAmtTotal[0]).Amount.Uint64(), bG.Amount.Uint64()) + Expect(bF).To(Equal(balanceFunder)) + Expect(balanceGrantee.Sub(vestingAmtTotal[0]).Amount.Uint64()).To(Equal(bG.Amount.Uint64())) // destination address should remain unchanged - s.Require().Equal(balanceDest.Amount.Uint64(), bD.Amount.Uint64()) + Expect(balanceDest.Amount.Uint64()).To(Equal(bD.Amount.Uint64())) // vesting amount should go to community pool - s.Require().Equal(balanceCommPool.Amount.Add(math.LegacyNewDec(vestingAmtTotal[0].Amount.Int64())), bCP.Amount) - s.Require().Equal(stakeDenom, bCP.Denom) + Expect(balanceCommPool.Amount.Add(math.LegacyNewDec(vestingAmtTotal[0].Amount.Int64()))).To(Equal(bCP.Amount)) + Expect(stakeDenom).To(Equal(bCP.Denom)) }) It("should claw back any unvested amount after cliff before unlocking", func() { @@ -1172,32 +1204,31 @@ var _ = Describe("Clawback Vesting Accounts - claw back tokens", func() { s.CommitAfter(cliffDuration * time.Second) // Check that all tokens are locked and some, but not all tokens are vested - vested = clawbackAccount.GetVestedOnly(s.ctx.BlockTime()) - unlocked = clawbackAccount.GetUnlockedOnly(s.ctx.BlockTime()) - free = clawbackAccount.GetVestedCoins(s.ctx.BlockTime()) + vested = clawbackAccount.GetVestedCoins(s.ctx.BlockTime()) + unlocked = clawbackAccount.GetUnlockedCoins(s.ctx.BlockTime()) + free = clawbackAccount.GetUnlockedVestedCoins(s.ctx.BlockTime()) vesting = clawbackAccount.GetVestingCoins(s.ctx.BlockTime()) expVestedAmount := amt.Mul(math.NewInt(cliff)) expVested := sdk.NewCoins(sdk.NewCoin(stakeDenom, expVestedAmount)) unvested := vestingAmtTotal.Sub(vested...) - s.Require().Equal(expVested, vested) - s.Require().True(expVestedAmount.GT(math.NewInt(0))) - s.Require().True(free.IsZero()) - s.Require().Equal(vesting, vestingAmtTotal) + Expect(expVested).To(Equal(vested)) + Expect(expVestedAmount.GT(math.NewInt(0))).To(BeTrue()) + Expect(free.IsZero()).To(BeTrue()) + Expect(vesting).To(Equal(vestingAmtTotal.Sub(expVested...))) balanceFunder := s.app.BankKeeper.GetBalance(s.ctx, funder, stakeDenom) - balanceGrantee := s.app.BankKeeper.GetBalance(s.ctx, vestingAddr, stakeDenom) balanceDest := s.app.BankKeeper.GetBalance(s.ctx, dest, stakeDenom) pool := s.app.DistrKeeper.GetFeePool(s.ctx) balanceCommPool := pool.CommunityPool[0] testClawbackAccount := TestClawbackAccount{ - privKey: nil, + privKey: vestingPriv, address: vestingAddr, clawbackAccount: clawbackAccount, } // stake vested tokens - _, err := delegate(testClawbackAccount, vested) + _, err := testutil.Delegate(s.ctx, s.app, testClawbackAccount.privKey, vested[0], s.validator) Expect(err).To(BeNil()) // Perform clawback @@ -1206,56 +1237,65 @@ var _ = Describe("Clawback Vesting Accounts - claw back tokens", func() { res, err := s.app.VestingKeeper.Clawback(ctx, msg) Expect(err).To(BeNil()) Expect(res.Coins).To(Equal(unvested), "expected unvested coins to be clawed back") - bF := s.app.BankKeeper.GetBalance(s.ctx, funder, stakeDenom) bG := s.app.BankKeeper.GetBalance(s.ctx, vestingAddr, stakeDenom) bD := s.app.BankKeeper.GetBalance(s.ctx, dest, stakeDenom) pool = s.app.DistrKeeper.GetFeePool(s.ctx) bCP := pool.CommunityPool[0] - expClawback := clawbackAccount.GetUnvestedOnly(s.ctx.BlockTime()) + expClawback := clawbackAccount.GetVestingCoins(s.ctx.BlockTime()) // Any unvested amount is clawed back to community pool - s.Require().Equal(balanceFunder, bF) - s.Require().Equal(balanceGrantee.Sub(expClawback[0]).Amount.Uint64(), bG.Amount.Uint64()) - s.Require().Equal(balanceDest.Amount.Uint64(), bD.Amount.Uint64()) + Expect(balanceFunder).To(Equal(bF)) + // grantee balance should be zero because delegated all unvested tokens + Expect(bG.Amount).To(Equal(math.ZeroInt())) + Expect(balanceDest.Amount.Uint64()).To(Equal(bD.Amount.Uint64())) // vesting amount should go to community pool - s.Require().Equal(balanceCommPool.Amount.Add(math.LegacyNewDec(expClawback[0].Amount.Int64())), bCP.Amount) - s.Require().Equal(stakeDenom, bCP.Denom) + Expect(balanceCommPool.Amount.Add(math.LegacyNewDec(expClawback[0].Amount.Int64()))).To(Equal(bCP.Amount)) + Expect(stakeDenom).To(Equal(bCP.Denom)) + + // check delegation was not clawed back + queryHelper := baseapp.NewQueryServerTestHelper(s.ctx, s.app.InterfaceRegistry()) + querier := stakingkeeper.Querier{Keeper: s.app.StakingKeeper.Keeper} + stakingtypes.RegisterQueryServer(queryHelper, querier) + qc := stakingtypes.NewQueryClient(queryHelper) + delRes, err := qc.Delegation(s.ctx, &stakingtypes.QueryDelegationRequest{DelegatorAddr: vestingAddr.String(), ValidatorAddr: s.validator.OperatorAddress}) + Expect(err).To(BeNil()) + Expect(delRes.DelegationResponse).NotTo(BeNil()) + Expect(delRes.DelegationResponse.Balance).To(Equal(vested[0])) }) It("should claw back any unvested amount after cliff and unlocking", func() { // Surpass lockup duration // A strict `if t < clawbackTime` comparison is used in ComputeClawback // so, we increment the duration with 1 for the free token calculation to match - lockupDuration := time.Duration(lockupLength + 1) + lockupDuration := time.Duration(testutil.TestVestingSchedule.LockupPeriodLength + 1) s.CommitAfter(lockupDuration * time.Second) // Check if some, but not all tokens are vested and unlocked - vested = clawbackAccount.GetVestedOnly(s.ctx.BlockTime()) - unlocked = clawbackAccount.GetUnlockedOnly(s.ctx.BlockTime()) + vested = clawbackAccount.GetVestedCoins(s.ctx.BlockTime()) + unlocked = clawbackAccount.GetUnlockedCoins(s.ctx.BlockTime()) free = clawbackAccount.GetVestedCoins(s.ctx.BlockTime()) vesting = clawbackAccount.GetVestingCoins(s.ctx.BlockTime()) expVestedAmount := amt.Mul(math.NewInt(lockup)) expVested := sdk.NewCoins(sdk.NewCoin(stakeDenom, expVestedAmount)) unvested := vestingAmtTotal.Sub(vested...) - s.Require().Equal(free, vested) - s.Require().Equal(expVested, vested) - s.Require().True(expVestedAmount.GT(math.NewInt(0))) - s.Require().Equal(vesting, unvested) + Expect(free).To(Equal(vested)) + Expect(expVested).To(Equal(vested)) + Expect(expVestedAmount.GT(math.NewInt(0))).To(BeTrue()) + Expect(vesting).To(Equal(unvested)) balanceFunder := s.app.BankKeeper.GetBalance(s.ctx, funder, stakeDenom) - balanceGrantee := s.app.BankKeeper.GetBalance(s.ctx, vestingAddr, stakeDenom) balanceDest := s.app.BankKeeper.GetBalance(s.ctx, dest, stakeDenom) testClawbackAccount := TestClawbackAccount{ - privKey: nil, + privKey: vestingPriv, address: vestingAddr, clawbackAccount: clawbackAccount, } // stake vested tokens - _, err := delegate(testClawbackAccount, vested) + _, err := testutil.Delegate(s.ctx, s.app, testClawbackAccount.privKey, vested[0], s.validator) Expect(err).To(BeNil()) // Perform clawback @@ -1264,15 +1304,22 @@ var _ = Describe("Clawback Vesting Accounts - claw back tokens", func() { res, err := s.app.VestingKeeper.Clawback(ctx, msg) Expect(err).To(BeNil()) Expect(res.Coins).To(Equal(unvested), "expected only unvested coins to be clawed back") - bF := s.app.BankKeeper.GetBalance(s.ctx, funder, stakeDenom) bG := s.app.BankKeeper.GetBalance(s.ctx, vestingAddr, stakeDenom) bD := s.app.BankKeeper.GetBalance(s.ctx, dest, stakeDenom) // Any unvested amount is clawed back - s.Require().Equal(balanceFunder, bF) - s.Require().Equal(balanceGrantee.Sub(vesting[0]).Amount.Uint64(), bG.Amount.Uint64()) - s.Require().Equal(balanceDest.Add(vesting[0]).Amount.Uint64(), bD.Amount.Uint64()) + Expect(balanceFunder).To(Equal(bF)) + // final grantee balance should be 0 because delegated all the vested amt + Expect(bG.Amount).To(Equal(math.ZeroInt())) + Expect(balanceDest.Add(vesting[0]).Amount.Uint64()).To(Equal(bD.Amount.Uint64())) + + // check delegated tokens were not clawed back + stkQuerier := stakingkeeper.Querier{Keeper: s.app.StakingKeeper.Keeper} + delRes, err := stkQuerier.DelegatorDelegations(s.ctx, &stakingtypes.QueryDelegatorDelegationsRequest{DelegatorAddr: vestingAddr.String()}) + Expect(err).To(BeNil()) + Expect(delRes.DelegationResponses).To(HaveLen(1)) + Expect(delRes.DelegationResponses[0].Balance.Amount).To(Equal(vested[0].Amount)) }) It("should not claw back any amount after vesting periods end", func() { @@ -1281,34 +1328,33 @@ var _ = Describe("Clawback Vesting Accounts - claw back tokens", func() { s.CommitAfter(vestingDuration * time.Second) // Check if some, but not all tokens are vested and unlocked - vested = clawbackAccount.GetVestedOnly(s.ctx.BlockTime()) - unlocked = clawbackAccount.GetUnlockedOnly(s.ctx.BlockTime()) + vested = clawbackAccount.GetVestedCoins(s.ctx.BlockTime()) + unlocked = clawbackAccount.GetUnlockedCoins(s.ctx.BlockTime()) free = clawbackAccount.GetVestedCoins(s.ctx.BlockTime()) vesting = clawbackAccount.GetVestingCoins(s.ctx.BlockTime()) expVested := sdk.NewCoins(sdk.NewCoin(stakeDenom, amt.Mul(math.NewInt(periodsTotal)))) unvested := vestingAmtTotal.Sub(vested...) - s.Require().Equal(free, vested) - s.Require().Equal(expVested, vested) - s.Require().Equal(expVested, vestingAmtTotal) - s.Require().Equal(unlocked, vestingAmtTotal) - s.Require().Equal(vesting, unvested) - s.Require().True(vesting.IsZero()) + Expect(free).To(Equal(vested)) + Expect(expVested).To(Equal(vested)) + Expect(expVested).To(Equal(vestingAmtTotal)) + Expect(unlocked).To(Equal(vestingAmtTotal)) + Expect(vesting).To(Equal(unvested)) + Expect(vesting.IsZero()).To(BeTrue()) balanceFunder := s.app.BankKeeper.GetBalance(s.ctx, funder, stakeDenom) - balanceGrantee := s.app.BankKeeper.GetBalance(s.ctx, vestingAddr, stakeDenom) balanceDest := s.app.BankKeeper.GetBalance(s.ctx, dest, stakeDenom) pool := s.app.DistrKeeper.GetFeePool(s.ctx) balanceCommPool := pool.CommunityPool[0] testClawbackAccount := TestClawbackAccount{ - privKey: nil, + privKey: vestingPriv, address: vestingAddr, clawbackAccount: clawbackAccount, } // stake vested tokens - _, err := delegate(testClawbackAccount, vested) + _, err := testutil.Delegate(s.ctx, s.app, testClawbackAccount.privKey, vested[0], s.validator) Expect(err).To(BeNil()) // Perform clawback @@ -1317,7 +1363,6 @@ var _ = Describe("Clawback Vesting Accounts - claw back tokens", func() { res, err := s.app.VestingKeeper.Clawback(ctx, msg) Expect(err).To(BeNil(), "expected no error during clawback") Expect(res.Coins).To(BeEmpty(), "expected nothing to be clawed back after end of vesting schedules") - bF := s.app.BankKeeper.GetBalance(s.ctx, funder, stakeDenom) bG := s.app.BankKeeper.GetBalance(s.ctx, vestingAddr, stakeDenom) bD := s.app.BankKeeper.GetBalance(s.ctx, dest, stakeDenom) @@ -1325,33 +1370,37 @@ var _ = Describe("Clawback Vesting Accounts - claw back tokens", func() { bCP := pool.CommunityPool[0] // No amount is clawed back - s.Require().Equal(balanceFunder, bF) - s.Require().Equal(balanceGrantee, bG) - s.Require().Equal(balanceDest, bD) - s.Require().Equal(balanceCommPool.Amount, bCP.Amount) + Expect(balanceFunder).To(Equal(bF)) + // final grantee balance should be 0 because delegated all the vested amt + Expect(bG.Amount).To(Equal(math.ZeroInt())) + Expect(balanceDest).To(Equal(bD)) + Expect(balanceCommPool.Amount).To(Equal(bCP.Amount)) + // check delegated tokens were not clawed back + stkQuerier := stakingkeeper.Querier{Keeper: s.app.StakingKeeper.Keeper} + delRes, err := stkQuerier.DelegatorDelegations(s.ctx, &stakingtypes.QueryDelegatorDelegationsRequest{DelegatorAddr: vestingAddr.String()}) + Expect(err).To(BeNil()) + Expect(delRes.DelegationResponses).To(HaveLen(1)) + Expect(delRes.DelegationResponses[0].Balance.Amount).To(Equal(vested[0].Amount)) }) It("should update vesting funder and claw back unvested amount before cliff", func() { ctx := sdk.WrapSDKContext(s.ctx) newFunder := sdk.AccAddress(utiltx.GenerateAddress().Bytes()) - balanceFunder := s.app.BankKeeper.GetBalance(s.ctx, funder, stakeDenom) balanceNewFunder := s.app.BankKeeper.GetBalance(s.ctx, newFunder, stakeDenom) balanceGrantee := s.app.BankKeeper.GetBalance(s.ctx, vestingAddr, stakeDenom) pool := s.app.DistrKeeper.GetFeePool(s.ctx) balanceCommPool := pool.CommunityPool[0] - // Update clawback vesting account funder updateFunderMsg := types.NewMsgUpdateVestingFunder(funder, newFunder, vestingAddr) _, err := s.app.VestingKeeper.UpdateVestingFunder(ctx, updateFunderMsg) - s.Require().NoError(err) + Expect(err).To(BeNil()) // Perform clawback before cliff - funds should go to new funder (no dest address defined) msg := types.NewMsgClawback(authtypes.NewModuleAddress(govtypes.ModuleName), vestingAddr, nil) res, err := s.app.VestingKeeper.Clawback(ctx, msg) Expect(err).To(BeNil()) Expect(res.Coins).To(Equal(vestingAmtTotal), "expected different coins to be clawed back") - // All initial vesting amount goes to funder bF := s.app.BankKeeper.GetBalance(s.ctx, funder, stakeDenom) bNewF := s.app.BankKeeper.GetBalance(s.ctx, newFunder, stakeDenom) @@ -1360,18 +1409,17 @@ var _ = Describe("Clawback Vesting Accounts - claw back tokens", func() { bCP := pool.CommunityPool[0] // Original funder balance should not change - s.Require().Equal(bF, balanceFunder) + Expect(bF).To(Equal(balanceFunder)) // New funder should not get the vested tokens - s.Require().Equal(balanceNewFunder.Amount.Uint64(), bNewF.Amount.Uint64()) - s.Require().Equal(balanceGrantee.Sub(vestingAmtTotal[0]).Amount.Uint64(), bG.Amount.Uint64()) + Expect(balanceNewFunder.Amount.Uint64()).To(Equal(bNewF.Amount.Uint64())) + Expect(balanceGrantee.Sub(vestingAmtTotal[0]).Amount.Uint64()).To(Equal(bG.Amount.Uint64())) // vesting amount should go to community pool - s.Require().Equal(balanceCommPool.Amount.Add(math.LegacyNewDec(vestingAmtTotal[0].Amount.Int64())), bCP.Amount) + Expect(balanceCommPool.Amount.Add(math.LegacyNewDec(vestingAmtTotal[0].Amount.Int64()))).To(Equal(bCP.Amount)) }) It("should not claw back when governance clawback is disabled", func() { // disable governance clawback s.app.VestingKeeper.SetGovClawbackDisabled(s.ctx, vestingAddr) - // Perform clawback before cliff msg := types.NewMsgClawback(authtypes.NewModuleAddress(govtypes.ModuleName), vestingAddr, dest) _, err := s.app.VestingKeeper.Clawback(s.ctx, msg) @@ -1395,6 +1443,7 @@ var _ = Describe("Clawback Vesting Account - Smart contract", func() { ) BeforeEach(func() { + Expect(s.SetupTest()).To(BeNil()) // reset contract = contracts.ERC20MinterBurnerDecimalsContract contractAddr, err = testutil.DeployContract( s.ctx, @@ -1406,7 +1455,6 @@ var _ = Describe("Clawback Vesting Account - Smart contract", func() { ) Expect(err).ToNot(HaveOccurred(), "failed to deploy contract") }) - It("should not convert a smart contract to a clawback vesting account", func() { msgCreate := types.NewMsgCreateClawbackVestingAccount( s.address.Bytes(), @@ -1420,13 +1468,11 @@ var _ = Describe("Clawback Vesting Account - Smart contract", func() { "account %s is a contract account and cannot be converted in a clawback vesting account", sdk.AccAddress(contractAddr.Bytes()).String()), )) - // Check that the account was not converted acc := s.app.AccountKeeper.GetAccount(s.ctx, contractAddr.Bytes()) Expect(acc).ToNot(BeNil(), "smart contract should be found") _, ok := acc.(*types.ClawbackVestingAccount) Expect(ok).To(BeFalse(), "account should not be a clawback vesting account") - // Check that the contract code was not deleted // // NOTE: When it was possible to create clawback vesting accounts for smart contracts, @@ -1475,13 +1521,12 @@ var _ = Describe("Clawback Vesting Account - Barberry bug", func() { // vestingLength is a period of time in seconds to be used for the creation of the vesting // account. vestingLength = int64(60 * 60 * 24 * 30) // 30 days in seconds - // txCost is the cost of a transaction to be deducted from the expected account balance txCost int64 ) BeforeEach(func() { - s.SetupTest() + Expect(s.SetupTest()).To(BeNil()) // reset // Initialize the account at the vesting address and the funder accounts by funding them fundedCoins := sdk.Coins{{Denom: utils.BaseDenom, Amount: math.NewInt(2e18)}} // fund more than what is sent to the vesting account for transaction fees @@ -1489,25 +1534,21 @@ var _ = Describe("Clawback Vesting Account - Barberry bug", func() { Expect(err).ToNot(HaveOccurred(), "failed to fund account") err = testutil.FundAccount(s.ctx, s.app.BankKeeper, funder, fundedCoins) Expect(err).ToNot(HaveOccurred(), "failed to fund account") - // Create a clawback vesting account msgCreate := types.NewMsgCreateClawbackVestingAccount( funder, vestingAddr, false, ) - res, err := testutil.DeliverTx(s.ctx, s.app, vestingPriv, &gasPrice, msgCreate) Expect(err).ToNot(HaveOccurred(), "failed to create clawback vesting account") txCost = gasPrice.Int64() * res.GasWanted - // Check clawback acccount was created acc := s.app.AccountKeeper.GetAccount(s.ctx, vestingAddr) Expect(acc).ToNot(BeNil(), "clawback vesting account not created") _, ok := acc.(*types.ClawbackVestingAccount) Expect(ok).To(BeTrue(), "account is not a clawback vesting account") }) - Context("when funding a clawback vesting account", func() { testcases := []struct { name string @@ -1564,7 +1605,6 @@ var _ = Describe("Clawback Vesting Account - Barberry bug", func() { errContains: "vesting and/or lockup schedules must be present", }, } - for _, tc := range testcases { tc := tc It(tc.name, func() { @@ -1572,19 +1612,16 @@ var _ = Describe("Clawback Vesting Account - Barberry bug", func() { lockupPeriods sdkvesting.Periods vestingPeriods sdkvesting.Periods ) - if !tc.lockupCoins.Empty() { lockupPeriods = sdkvesting.Periods{ sdkvesting.Period{Length: vestingLength, Amount: tc.lockupCoins}, } } - if !tc.vestingCoins.Empty() { vestingPeriods = sdkvesting.Periods{ sdkvesting.Period{Length: vestingLength, Amount: tc.vestingCoins}, } } - // Fund the clawback vesting account at the given address msg := types.NewMsgFundVestingAccount( funder, @@ -1593,24 +1630,19 @@ var _ = Describe("Clawback Vesting Account - Barberry bug", func() { lockupPeriods, vestingPeriods, ) - // Deliver transaction with message res, err := testutil.DeliverTx(s.ctx, s.app, funderPriv, nil, msg) - // Get account at the new address acc := s.app.AccountKeeper.GetAccount(s.ctx, vestingAddr) vacc, _ := acc.(*types.ClawbackVestingAccount) - if tc.expError { Expect(err).To(HaveOccurred(), "expected funding the vesting account to have failed") Expect(err.Error()).To(ContainSubstring(tc.errContains), "expected funding the vesting account to have failed") - Expect(vacc.LockupPeriods).To(BeEmpty(), "expected clawback vesting account to not have been funded") } else { Expect(err).ToNot(HaveOccurred(), "failed to fund clawback vesting account") Expect(res.Code).To(Equal(uint32(0)), "failed to fund clawback vesting account") Expect(vacc.LockupPeriods).ToNot(BeEmpty(), "vesting account should have been funded") - // Check that the vesting account has the correct balance balance := s.app.BankKeeper.GetBalance(s.ctx, vestingAddr, utils.BaseDenom) expBalance := int64(2e18) + int64(1e18) - txCost // fundedCoins + vestingCoins - txCost diff --git a/x/vesting/keeper/keeper.go b/x/vesting/keeper/keeper.go index 17f35f6a6b..9a53f0cda7 100644 --- a/x/vesting/keeper/keeper.go +++ b/x/vesting/keeper/keeper.go @@ -11,7 +11,7 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/x/vesting/types" + "github.com/evmos/evmos/v18/x/vesting/types" ) // Keeper of this module maintains collections of vesting. diff --git a/x/vesting/keeper/keeper_test.go b/x/vesting/keeper/keeper_test.go index 1cdb952ef0..01d5cc958a 100644 --- a/x/vesting/keeper/keeper_test.go +++ b/x/vesting/keeper/keeper_test.go @@ -2,10 +2,10 @@ package keeper_test import ( sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/encoding" - "github.com/evmos/evmos/v17/x/vesting/keeper" - vestingtypes "github.com/evmos/evmos/v17/x/vesting/types" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/encoding" + "github.com/evmos/evmos/v18/x/vesting/keeper" + vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" ) func (suite *KeeperTestSuite) TestNewKeeper() { diff --git a/x/vesting/keeper/migrations.go b/x/vesting/keeper/migrations.go index 96d54a95e1..d6bc69beed 100644 --- a/x/vesting/keeper/migrations.go +++ b/x/vesting/keeper/migrations.go @@ -5,10 +5,14 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" - v2 "github.com/evmos/evmos/v17/x/vesting/migrations/v2" + v2 "github.com/evmos/evmos/v18/x/vesting/migrations/v2" + v3 "github.com/evmos/evmos/v18/x/vesting/migrations/v3" ) -var _ module.MigrationHandler = Migrator{}.Migrate1to2 +var ( + _ module.MigrationHandler = Migrator{}.Migrate1to2 + _ module.MigrationHandler = Migrator{}.Migrate2to3 +) // Migrator is a struct for handling in-place store migrations. type Migrator struct { @@ -26,3 +30,8 @@ func NewMigrator(keeper Keeper) Migrator { func (m Migrator) Migrate1to2(ctx sdk.Context) error { return v2.MigrateStore(ctx, m.keeper.accountKeeper) } + +// Migrate2to3 migrates the store from consensus version 2 to 3 +func (m Migrator) Migrate2to3(ctx sdk.Context) error { + return v3.MigrateStore(ctx, m.keeper.accountKeeper) +} diff --git a/x/vesting/keeper/migrations_test.go b/x/vesting/keeper/migrations_test.go index d99bb56855..b928cf7bf2 100644 --- a/x/vesting/keeper/migrations_test.go +++ b/x/vesting/keeper/migrations_test.go @@ -3,16 +3,19 @@ package keeper_test import ( "time" + "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" sdkvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" - testutiltx "github.com/evmos/evmos/v17/testutil/tx" - "github.com/evmos/evmos/v17/x/vesting/keeper" - v1vestingtypes "github.com/evmos/evmos/v17/x/vesting/migrations/types" - vestingtypes "github.com/evmos/evmos/v17/x/vesting/types" + testutiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/x/vesting/keeper" + v1vestingtypes "github.com/evmos/evmos/v18/x/vesting/migrations/types" + vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" ) -func (suite *KeeperTestSuite) TestMigration() { - suite.SetupTest() +func (suite *KeeperTestSuite) TestMigrate1to2() { + if err := suite.SetupTest(); err != nil { + panic(err) + } // Create account addresses for testing vestingAddr, _ := testutiltx.NewAccAddressAndKey() @@ -45,3 +48,88 @@ func (suite *KeeperTestSuite) TestMigration() { suite.Require().NotNil(foundAcc, "vesting account not found") suite.Require().IsType(&vestingtypes.ClawbackVestingAccount{}, foundAcc, "vesting account is not a v2 base vesting account") } + +func (suite *KeeperTestSuite) TestMigrate2to3() { + var emtpyCoins types.Coins + if err := suite.SetupTest(); err != nil { + panic(err) + } + + // Create account addresses for testing + vestingAddr, _ := testutiltx.NewAccAddressAndKey() + funder, _ := testutiltx.NewAccAddressAndKey() + + // create a base vesting account instead of a clawback vesting account at the vesting address + baseAccount := authtypes.NewBaseAccountWithAddress(vestingAddr) + acc := sdkvesting.NewBaseVestingAccount(baseAccount, balances, 500000) + + testCases := []struct { + name string + initialDelegatedVesting types.Coins + initialDelegatedFree types.Coins + expectedDelegatedFree types.Coins + }{ + { + name: "delegated vesting > 0 and delegated free == 0", + initialDelegatedVesting: quarter, + initialDelegatedFree: emtpyCoins, + expectedDelegatedFree: quarter, + }, + { + name: "delegated vesting > 0 and delegated free > 0", + initialDelegatedVesting: quarter, + initialDelegatedFree: quarter, + expectedDelegatedFree: types.NewCoins(types.NewInt64Coin("test", 500)), + }, + { + name: "delegated vesting == 0 and delegated free > 0", + initialDelegatedVesting: emtpyCoins, + initialDelegatedFree: quarter, + expectedDelegatedFree: quarter, + }, + { + name: "delegated vesting == 0 and delegated free == 0", + initialDelegatedVesting: emtpyCoins, + initialDelegatedFree: emtpyCoins, + expectedDelegatedFree: emtpyCoins, + }, + } + + for _, tc := range testCases { + suite.Run(tc.name, func() { + acc.DelegatedVesting = tc.initialDelegatedVesting + acc.DelegatedFree = tc.initialDelegatedFree + + vestAcc := &vestingtypes.ClawbackVestingAccount{ + BaseVestingAccount: acc, + FunderAddress: funder.String(), + StartTime: time.Now(), + LockupPeriods: lockupPeriods, + VestingPeriods: vestingPeriods, + } + suite.app.AccountKeeper.SetAccount(suite.ctx, vestAcc) + + // check account was created successfully + foundAcc := suite.app.AccountKeeper.GetAccount(suite.ctx, vestingAddr) + suite.Require().NotNil(foundAcc, "vesting account not found") + vestAcc, ok := foundAcc.(*vestingtypes.ClawbackVestingAccount) + suite.Require().True(ok) + suite.Require().Equal(tc.initialDelegatedVesting, vestAcc.DelegatedVesting) + suite.Require().Equal(tc.initialDelegatedFree, vestAcc.DelegatedFree) + + // migrate + migrator := keeper.NewMigrator(suite.app.VestingKeeper) + err = migrator.Migrate2to3(suite.ctx) + suite.Require().NoError(err, "migration failed") + + // check that the account delegated vesting coins were migrated + // to the delegated free coins + foundAcc = suite.app.AccountKeeper.GetAccount(suite.ctx, vestingAddr) + suite.Require().NotNil(foundAcc, "vesting account not found") + vestAcc, ok = foundAcc.(*vestingtypes.ClawbackVestingAccount) + suite.Require().True(ok) + suite.Require().Equal(emtpyCoins, vestAcc.DelegatedVesting) + suite.Require().Equal(tc.expectedDelegatedFree, vestAcc.DelegatedFree) + }) + } +} diff --git a/x/vesting/keeper/msg_server.go b/x/vesting/keeper/msg_server.go index c77961e064..99c654ed63 100644 --- a/x/vesting/keeper/msg_server.go +++ b/x/vesting/keeper/msg_server.go @@ -17,8 +17,8 @@ import ( errortypes "github.com/cosmos/cosmos-sdk/types/errors" sdkvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types" - evmostypes "github.com/evmos/evmos/v17/types" - "github.com/evmos/evmos/v17/x/vesting/types" + evmostypes "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v18/x/vesting/types" ) var _ types.MsgServer = &Keeper{} @@ -371,6 +371,11 @@ func (k Keeper) ConvertVestingAccount( return nil, errorsmod.Wrapf(errortypes.ErrInvalidRequest, "vesting coins still left in account: %s", msg.VestingAddress) } + // check if account has any locked up coins left + if vestingAcc.HasLockedCoins(ctx.BlockTime()) { + return nil, errorsmod.Wrapf(errortypes.ErrInvalidRequest, "locked up coins still left in account: %s", msg.VestingAddress) + } + // if gov clawback is disabled, remove the entry from the store. // if no entry is found for the address, this will no-op k.DeleteGovClawbackDisabled(ctx, address) diff --git a/x/vesting/keeper/msg_server_test.go b/x/vesting/keeper/msg_server_test.go index 084ab6dda2..1f10221c8d 100644 --- a/x/vesting/keeper/msg_server_test.go +++ b/x/vesting/keeper/msg_server_test.go @@ -10,10 +10,10 @@ import ( sdkvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" vestingexported "github.com/cosmos/cosmos-sdk/x/auth/vesting/exported" - "github.com/evmos/evmos/v17/testutil" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - evmostypes "github.com/evmos/evmos/v17/types" - "github.com/evmos/evmos/v17/x/vesting/types" + "github.com/evmos/evmos/v18/testutil" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + evmostypes "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v18/x/vesting/types" ) var ( @@ -97,7 +97,7 @@ func (suite *KeeperTestSuite) TestMsgFundVestingAccount() { } for _, tc := range testCases { suite.Run(fmt.Sprintf("Case %s", tc.name), func() { - suite.SetupTest() // Reset + suite.Require().NoError(suite.SetupTest()) // Reset ctx := sdk.WrapSDKContext(suite.ctx) // fund the recipient account to set the account and then @@ -165,7 +165,7 @@ func (suite *KeeperTestSuite) TestMsgFundVestingAccountSpecialCases() { // --------------------------- // Test blocked address suite.Run("fail - blocked address", func() { - suite.SetupTest() + suite.Require().NoError(suite.SetupTest()) msg := &types.MsgFundVestingAccount{ FunderAddress: funder.String(), VestingAddress: authtypes.NewModuleAddress("transfer").String(), @@ -183,7 +183,7 @@ func (suite *KeeperTestSuite) TestMsgFundVestingAccountSpecialCases() { // Test wrong funder by first creating a clawback vesting account // and then trying to fund it with a different funder suite.Run("fail - wrong funder", func() { - suite.SetupTest() + suite.Require().NoError(suite.SetupTest()) // fund the recipient account to set the account err = testutil.FundAccount(suite.ctx, suite.app.BankKeeper, vestingAddr, balances) @@ -284,7 +284,7 @@ func (suite *KeeperTestSuite) TestMsgCreateClawbackVestingAccount() { for _, tc := range testcases { tc := tc suite.Run(tc.name, func() { - suite.SetupTest() // Reset + suite.Require().NoError(suite.SetupTest()) // Reset ctx := sdk.WrapSDKContext(suite.ctx) tc.malleate(tc.funder, tc.vestingAddr) @@ -425,7 +425,7 @@ func (suite *KeeperTestSuite) TestMsgClawback() { } for _, tc := range testCases { suite.Run(fmt.Sprintf("Case %s", tc.name), func() { - suite.SetupTest() // reset + suite.Require().NoError(suite.SetupTest()) // reset ctx := sdk.WrapSDKContext(suite.ctx) // fund the vesting target address to initialize it as an account and @@ -553,7 +553,7 @@ func (suite *KeeperTestSuite) TestMsgUpdateVestingFunder() { } for _, tc := range testCases { suite.Run(fmt.Sprintf("Case %s", tc.name), func() { - suite.SetupTest() // reset + suite.Require().NoError(suite.SetupTest()) // reset ctx := sdk.WrapSDKContext(suite.ctx) // fund the account at the vesting address to initialize it and then sund all funds to the funder account @@ -596,7 +596,7 @@ func (suite *KeeperTestSuite) TestMsgUpdateVestingFunder() { } func (suite *KeeperTestSuite) TestClawbackVestingAccountStore() { - suite.SetupTest() + suite.Require().NoError(suite.SetupTest()) // Create and set clawback vesting account vestingStart := s.ctx.BlockTime() @@ -612,7 +612,7 @@ func (suite *KeeperTestSuite) TestClawbackVestingAccountStore() { } func (suite *KeeperTestSuite) TestClawbackVestingAccountMarshal() { - suite.SetupTest() + suite.Require().NoError(suite.SetupTest()) // Create and set clawback vesting account vestingStart := s.ctx.BlockTime() @@ -718,7 +718,7 @@ func (suite *KeeperTestSuite) TestConvertVestingAccount() { for _, tc := range testCases { tc := tc suite.Run(tc.name, func() { - suite.SetupTest() // reset + suite.Require().NoError(suite.SetupTest()) // reset acc := tc.malleate() msg := types.NewMsgConvertVestingAccount(acc.GetAddress()) diff --git a/x/vesting/keeper/setup_test.go b/x/vesting/keeper/setup_test.go index 7beba3c367..b18a31fb43 100644 --- a/x/vesting/keeper/setup_test.go +++ b/x/vesting/keeper/setup_test.go @@ -1,26 +1,37 @@ package keeper_test import ( + "errors" + "math" "testing" + "time" - //nolint:revive // dot imports are fine for Ginkgo - . "github.com/onsi/ginkgo/v2" - //nolint:revive // dot imports are fine for Ginkgo - . "github.com/onsi/gomega" - + sdkmath "cosmossdk.io/math" + "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/crypto/keyring" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" "github.com/stretchr/testify/suite" ethtypes "github.com/ethereum/go-ethereum/core/types" - evm "github.com/evmos/evmos/v17/x/evm/types" - "github.com/evmos/evmos/v17/app" - "github.com/evmos/evmos/v17/x/vesting/types" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + "github.com/evmos/evmos/v18/encoding" + "github.com/evmos/evmos/v18/testutil" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + evmostypes "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v18/utils" + epochstypes "github.com/evmos/evmos/v18/x/epochs/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" + + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/x/vesting/types" ) var ( @@ -41,7 +52,7 @@ type KeeperTestSuite struct { ctx sdk.Context app *app.Evmos - queryClientEvm evm.QueryClient + queryClientEvm evmtypes.QueryClient queryClient types.QueryClient address common.Address consAddress sdk.ConsAddress @@ -57,12 +68,115 @@ var s *KeeperTestSuite func TestKeeperTestSuite(t *testing.T) { s = new(KeeperTestSuite) suite.Run(t, s) - - // Run Ginkgo integration tests - RegisterFailHandler(Fail) - RunSpecs(t, "Keeper Suite") } -func (suite *KeeperTestSuite) SetupTest() { - suite.DoSetupTest(suite.T()) +func (suite *KeeperTestSuite) SetupTest() error { + checkTx := false + + // account key + priv, err := ethsecp256k1.GenerateKey() + if err != nil { + return err + } + suite.address = common.BytesToAddress(priv.PubKey().Address().Bytes()) + suite.signer = utiltx.NewSigner(priv) + suite.priv = priv + + // consensus key + priv, err = ethsecp256k1.GenerateKey() + if err != nil { + return err + } + suite.consAddress = sdk.ConsAddress(priv.PubKey().Address()) + + // Init app + chainID := utils.TestnetChainID + "-1" + suite.app = app.Setup(checkTx, nil, chainID) + + // Set Context + header := testutil.NewHeader( + 1, time.Now().UTC(), chainID, suite.consAddress, nil, nil, + ) + suite.ctx = suite.app.BaseApp.NewContext(false, header) + + // Setup query helpers + queryHelperEvm := baseapp.NewQueryServerTestHelper(suite.ctx, suite.app.InterfaceRegistry()) + evmtypes.RegisterQueryServer(queryHelperEvm, suite.app.EvmKeeper) + suite.queryClientEvm = evmtypes.NewQueryClient(queryHelperEvm) + + queryHelper := baseapp.NewQueryServerTestHelper(suite.ctx, suite.app.InterfaceRegistry()) + types.RegisterQueryServer(queryHelper, suite.app.VestingKeeper) + suite.queryClient = types.NewQueryClient(queryHelper) + + // Set epoch start time and height for all epoch identifiers from the epoch + // module + identifiers := []string{epochstypes.WeekEpochID, epochstypes.DayEpochID} + for _, identifier := range identifiers { + epoch, found := suite.app.EpochsKeeper.GetEpochInfo(suite.ctx, identifier) + if !found { + return errors.New("epoch info not found") + } + epoch.StartTime = suite.ctx.BlockTime() + epoch.CurrentEpochStartHeight = suite.ctx.BlockHeight() + suite.app.EpochsKeeper.SetEpochInfo(suite.ctx, epoch) + } + + acc := &evmostypes.EthAccount{ + BaseAccount: authtypes.NewBaseAccount(sdk.AccAddress(suite.address.Bytes()), nil, 0, 0), + CodeHash: common.BytesToHash(crypto.Keccak256(nil)).String(), + } + + suite.app.AccountKeeper.SetAccount(suite.ctx, acc) + + // fund signer acc to pay for tx fees + amt := sdkmath.NewInt(int64(math.Pow10(18) * 2)) + err = testutil.FundAccount( + suite.ctx, + suite.app.BankKeeper, + suite.priv.PubKey().Address().Bytes(), + sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, amt)), + ) + if err != nil { + return err + } + + // Set Validator + valAddr := sdk.ValAddress(suite.address.Bytes()) + validator, err := stakingtypes.NewValidator(valAddr, priv.PubKey(), stakingtypes.Description{}) + if err != nil { + return err + } + validator = stakingkeeper.TestingUpdateValidator(suite.app.StakingKeeper.Keeper, suite.ctx, validator, true) + err = suite.app.StakingKeeper.Hooks().AfterValidatorCreated(suite.ctx, validator.GetOperator()) + if err != nil { + return err + } + err = suite.app.StakingKeeper.SetValidatorByConsAddr(suite.ctx, validator) + if err != nil { + return err + } + validators := s.app.StakingKeeper.GetValidators(s.ctx, 1) + suite.validator = validators[0] + + encodingConfig := encoding.MakeConfig(app.ModuleBasics) + suite.clientCtx = client.Context{}.WithTxConfig(encodingConfig.TxConfig) + suite.ethSigner = ethtypes.LatestSignerForChainID(suite.app.EvmKeeper.ChainID()) + + // Deploy contracts + contract, err = suite.DeployContract(erc20Name, erc20Symbol, erc20Decimals) + if err != nil { + return err + } + contract2, err = suite.DeployContract(erc20Name2, erc20Symbol2, erc20Decimals) + if err != nil { + return err + } + + // Set correct denom in govKeeper + govParams := suite.app.GovKeeper.GetParams(suite.ctx) + govParams.MinDeposit = sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, sdkmath.NewInt(1e6))) + votingPeriod := time.Second + govParams.VotingPeriod = &votingPeriod + + return suite.app.GovKeeper.SetParams(suite.ctx, govParams) } diff --git a/x/vesting/keeper/utils.go b/x/vesting/keeper/utils.go index b46246a21f..93c53dce4c 100644 --- a/x/vesting/keeper/utils.go +++ b/x/vesting/keeper/utils.go @@ -8,7 +8,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/evmos/evmos/v17/x/vesting/types" + "github.com/evmos/evmos/v18/x/vesting/types" ) // GetClawbackVestingAccount is a helper function to get the account from the diff --git a/x/vesting/keeper/utils_test.go b/x/vesting/keeper/utils_test.go index 5a875a3cfb..d59632e5d2 100644 --- a/x/vesting/keeper/utils_test.go +++ b/x/vesting/keeper/utils_test.go @@ -1,7 +1,6 @@ package keeper_test import ( - "math" "strings" "time" @@ -9,125 +8,15 @@ import ( . "github.com/onsi/gomega" sdkmath "cosmossdk.io/math" - "github.com/cosmos/cosmos-sdk/baseapp" - "github.com/cosmos/cosmos-sdk/client" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/common" - ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" - - "github.com/evmos/evmos/v17/app" - cosmosante "github.com/evmos/evmos/v17/app/ante/cosmos" - evmante "github.com/evmos/evmos/v17/app/ante/evm" - "github.com/evmos/evmos/v17/contracts" - "github.com/evmos/evmos/v17/crypto/ethsecp256k1" - "github.com/evmos/evmos/v17/encoding" - "github.com/evmos/evmos/v17/testutil" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - evmostypes "github.com/evmos/evmos/v17/types" - "github.com/evmos/evmos/v17/utils" - epochstypes "github.com/evmos/evmos/v17/x/epochs/types" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" - "github.com/evmos/evmos/v17/x/vesting/types" - - "github.com/stretchr/testify/require" -) - -func (suite *KeeperTestSuite) DoSetupTest(t require.TestingT) { - checkTx := false - - // account key - priv, err := ethsecp256k1.GenerateKey() - require.NoError(t, err) - suite.address = common.BytesToAddress(priv.PubKey().Address().Bytes()) - suite.signer = utiltx.NewSigner(priv) - suite.priv = priv - - // consensus key - priv, err = ethsecp256k1.GenerateKey() - require.NoError(t, err) - suite.consAddress = sdk.ConsAddress(priv.PubKey().Address()) - - // Init app - chainID := utils.TestnetChainID + "-1" - suite.app = app.Setup(checkTx, nil, chainID) - - // Set Context - header := testutil.NewHeader( - 1, time.Now().UTC(), chainID, suite.consAddress, nil, nil, - ) - suite.ctx = suite.app.BaseApp.NewContext(false, header) - - // Setup query helpers - queryHelperEvm := baseapp.NewQueryServerTestHelper(suite.ctx, suite.app.InterfaceRegistry()) - evmtypes.RegisterQueryServer(queryHelperEvm, suite.app.EvmKeeper) - suite.queryClientEvm = evmtypes.NewQueryClient(queryHelperEvm) - - queryHelper := baseapp.NewQueryServerTestHelper(suite.ctx, suite.app.InterfaceRegistry()) - types.RegisterQueryServer(queryHelper, suite.app.VestingKeeper) - suite.queryClient = types.NewQueryClient(queryHelper) - - // Set epoch start time and height for all epoch identifiers from the epoch - // module - identifiers := []string{epochstypes.WeekEpochID, epochstypes.DayEpochID} - for _, identifier := range identifiers { - epoch, found := suite.app.EpochsKeeper.GetEpochInfo(suite.ctx, identifier) - suite.Require().True(found) - epoch.StartTime = suite.ctx.BlockTime() - epoch.CurrentEpochStartHeight = suite.ctx.BlockHeight() - suite.app.EpochsKeeper.SetEpochInfo(suite.ctx, epoch) - } - - acc := &evmostypes.EthAccount{ - BaseAccount: authtypes.NewBaseAccount(sdk.AccAddress(suite.address.Bytes()), nil, 0, 0), - CodeHash: common.BytesToHash(crypto.Keccak256(nil)).String(), - } - suite.app.AccountKeeper.SetAccount(suite.ctx, acc) - - // fund signer acc to pay for tx fees - amt := sdkmath.NewInt(int64(math.Pow10(18) * 2)) - err = testutil.FundAccount( - suite.ctx, - suite.app.BankKeeper, - suite.priv.PubKey().Address().Bytes(), - sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, amt)), - ) - suite.Require().NoError(err) - - // Set Validator - valAddr := sdk.ValAddress(suite.address.Bytes()) - validator, err := stakingtypes.NewValidator(valAddr, priv.PubKey(), stakingtypes.Description{}) - require.NoError(t, err) - validator = stakingkeeper.TestingUpdateValidator(&suite.app.StakingKeeper, suite.ctx, validator, true) - err = suite.app.StakingKeeper.Hooks().AfterValidatorCreated(suite.ctx, validator.GetOperator()) - require.NoError(t, err) - err = suite.app.StakingKeeper.SetValidatorByConsAddr(suite.ctx, validator) - require.NoError(t, err) - validators := s.app.StakingKeeper.GetValidators(s.ctx, 1) - suite.validator = validators[0] - - encodingConfig := encoding.MakeConfig(app.ModuleBasics) - suite.clientCtx = client.Context{}.WithTxConfig(encodingConfig.TxConfig) - suite.ethSigner = ethtypes.LatestSignerForChainID(suite.app.EvmKeeper.ChainID()) - - // Deploy contracts - contract, err = suite.DeployContract(erc20Name, erc20Symbol, erc20Decimals) - require.NoError(t, err) - contract2, err = suite.DeployContract(erc20Name2, erc20Symbol2, erc20Decimals) - require.NoError(t, err) - - // Set correct denom in govKeeper - govParams := suite.app.GovKeeper.GetParams(suite.ctx) - govParams.MinDeposit = sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, sdkmath.NewInt(1e6))) - votingPeriod := time.Second - govParams.VotingPeriod = &votingPeriod - err = suite.app.GovKeeper.SetParams(suite.ctx, govParams) - suite.Require().NoError(err, "failed to set gov params") -} + evmante "github.com/evmos/evmos/v18/app/ante/evm" + "github.com/evmos/evmos/v18/contracts" + "github.com/evmos/evmos/v18/testutil" + "github.com/evmos/evmos/v18/x/vesting/types" +) // Commit commits and starts a new block with an updated context. func (suite *KeeperTestSuite) Commit() { @@ -218,15 +107,6 @@ func assertEthSucceeds(testAccounts []TestClawbackAccount, funder sdk.AccAddress } } -// delegate is a helper function which creates a message to delegate a given amount of tokens -// to a validator and checks if the Cosmos vesting delegation decorator returns no error. -func delegate(account TestClawbackAccount, coins sdk.Coins) (*stakingtypes.MsgDelegate, error) { - msg := stakingtypes.NewMsgDelegate(account.address, s.validator.GetOperator(), coins[0]) - dec := cosmosante.NewVestingDelegationDecorator(s.app.AccountKeeper, s.app.StakingKeeper, s.app.BankKeeper, types.ModuleCdc) - err = testutil.ValidateAnteForMsgs(s.ctx, dec, msg) - return msg, err -} - // validateEthVestingTransactionDecorator is a helper function to execute the eth vesting transaction decorator // with 1 or more given messages and return any occurring error. func validateEthVestingTransactionDecorator(msgs ...sdk.Msg) error { diff --git a/x/vesting/migrations/types/vesting.pb.go b/x/vesting/migrations/types/vesting.pb.go index 5128e8abf7..b2e9702962 100644 --- a/x/vesting/migrations/types/vesting.pb.go +++ b/x/vesting/migrations/types/vesting.pb.go @@ -89,7 +89,7 @@ var fileDescriptor_5f1a3c86c0cebe5f = []byte{ // 421 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x52, 0xc1, 0x8e, 0xd3, 0x30, 0x10, 0x8d, 0xd9, 0x82, 0x76, 0xbd, 0xda, 0x82, 0xa2, 0x15, 0x8a, 0x7a, 0x70, 0x2a, 0x04, 0x52, - 0x85, 0x84, 0xad, 0x2e, 0x42, 0x08, 0x6e, 0xcd, 0x7e, 0x00, 0x28, 0x42, 0x1c, 0xb8, 0x44, 0x76, + 0x85, 0x84, 0xad, 0x2e, 0x42, 0x02, 0x6e, 0xcd, 0x7e, 0x00, 0x28, 0x42, 0x1c, 0xb8, 0x44, 0x76, 0xe2, 0xcd, 0x46, 0x6d, 0xe2, 0x28, 0x76, 0xc2, 0xf2, 0x07, 0xab, 0x3d, 0xed, 0x91, 0x63, 0xcf, 0x7c, 0x49, 0x8f, 0x3d, 0x72, 0x6a, 0x51, 0xfb, 0x23, 0x28, 0xb6, 0x53, 0xb5, 0x20, 0xae, 0x9c, 0x32, 0xf3, 0xc6, 0x33, 0xef, 0xbd, 0xcc, 0x40, 0xc4, 0x9b, 0x5c, 0x48, 0xd2, 0x70, 0xa9, 0xb2, @@ -112,8 +112,8 @@ var fileDescriptor_5f1a3c86c0cebe5f = []byte{ 0xdb, 0xb9, 0xef, 0x7c, 0x9f, 0xfb, 0x4e, 0xf0, 0x61, 0xb1, 0x41, 0x60, 0xb9, 0x41, 0xe0, 0xd7, 0x06, 0x81, 0xfb, 0x2d, 0x72, 0x96, 0x5b, 0xe4, 0xfc, 0xdc, 0x22, 0xe7, 0xcb, 0x9b, 0x3d, 0x3a, 0x73, 0xc0, 0xf6, 0x8c, 0xc7, 0x6f, 0xc9, 0xcd, 0x8e, 0x27, 0xcf, 0xd2, 0x8a, 0xaa, 0x4c, 0x14, - 0xd2, 0x50, 0xb2, 0x47, 0x7a, 0x37, 0xaf, 0x7f, 0x07, 0x00, 0x00, 0xff, 0xff, 0xcc, 0xf4, 0xa1, - 0xf2, 0xf5, 0x02, 0x00, 0x00, + 0xd2, 0x50, 0xb2, 0x47, 0x7a, 0x37, 0xaf, 0x7f, 0x07, 0x00, 0x00, 0xff, 0xff, 0x8b, 0x66, 0xb1, + 0xde, 0xf5, 0x02, 0x00, 0x00, } func (m *ClawbackVestingAccount) Marshal() (dAtA []byte, err error) { diff --git a/x/vesting/migrations/v2/migrate.go b/x/vesting/migrations/v2/migrate.go index c5b884f9c4..0c8814a859 100644 --- a/x/vesting/migrations/v2/migrate.go +++ b/x/vesting/migrations/v2/migrate.go @@ -5,8 +5,8 @@ package v2 import ( sdk "github.com/cosmos/cosmos-sdk/types" accounttypes "github.com/cosmos/cosmos-sdk/x/auth/types" - v1vestingtypes "github.com/evmos/evmos/v17/x/vesting/migrations/types" - vestingtypes "github.com/evmos/evmos/v17/x/vesting/types" + v1vestingtypes "github.com/evmos/evmos/v18/x/vesting/migrations/types" + vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" ) // MigrateStore migrates the x/vesting module state from the consensus version 1 to diff --git a/x/vesting/migrations/v3/migrate.go b/x/vesting/migrations/v3/migrate.go new file mode 100644 index 0000000000..ff7cf7f398 --- /dev/null +++ b/x/vesting/migrations/v3/migrate.go @@ -0,0 +1,38 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) +package v3 + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + accounttypes "github.com/cosmos/cosmos-sdk/x/auth/types" + vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" +) + +// MigrateStore migrates the x/vesting module state from the consensus version 2 to +// version 3. +// Specifically, it adds the DelegatedVesting (that should always be 0) +// to the DelegatedFree +func MigrateStore( + ctx sdk.Context, + ak vestingtypes.AccountKeeper, +) error { + ak.IterateAccounts(ctx, func(account accounttypes.AccountI) bool { + if vestAcc, ok := account.(*vestingtypes.ClawbackVestingAccount); ok { + // if DelegatedVesting == 0, skip it + if !vestAcc.DelegatedVesting.IsAllPositive() { + return false + } + // add DelegatedVesting to DelegatedFree, + // because it is not possible to delegate vesting coins. + // ONLY vested (free) coins can be delegated + vestAcc.DelegatedFree = vestAcc.DelegatedFree.Add(vestAcc.DelegatedVesting...) + vestAcc.DelegatedVesting = sdk.NewCoins() + + ak.SetAccount(ctx, vestAcc) + } + + return false + }) + + return nil +} diff --git a/x/vesting/migrations/v3/migrate_test.go b/x/vesting/migrations/v3/migrate_test.go new file mode 100644 index 0000000000..bda8ef1131 --- /dev/null +++ b/x/vesting/migrations/v3/migrate_test.go @@ -0,0 +1,3 @@ +package v3 + +// NOTE: Migrations are tested in keeper package. diff --git a/x/vesting/module.go b/x/vesting/module.go index 557d2e6b55..0634a07990 100644 --- a/x/vesting/module.go +++ b/x/vesting/module.go @@ -22,13 +22,13 @@ import ( bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" - "github.com/evmos/evmos/v17/x/vesting/client/cli" - "github.com/evmos/evmos/v17/x/vesting/keeper" - "github.com/evmos/evmos/v17/x/vesting/types" + "github.com/evmos/evmos/v18/x/vesting/client/cli" + "github.com/evmos/evmos/v18/x/vesting/keeper" + "github.com/evmos/evmos/v18/x/vesting/types" ) // consensusVersion defines the current x/vesting module consensus version. -const consensusVersion = 2 +const consensusVersion = 3 var ( _ module.AppModule = AppModule{} @@ -129,6 +129,10 @@ func (am AppModule) RegisterServices(cfg module.Configurator) { if err := cfg.RegisterMigration(types.ModuleName, 1, migrator.Migrate1to2); err != nil { panic(fmt.Errorf("failed to migrate %s to v2: %w", types.ModuleName, err)) } + + if err := cfg.RegisterMigration(types.ModuleName, 2, migrator.Migrate2to3); err != nil { + panic(fmt.Errorf("failed to migrate %s to v3: %w", types.ModuleName, err)) + } } // InitGenesis performs a no-op. diff --git a/x/vesting/proposal_handler.go b/x/vesting/proposal_handler.go index 452d36d5bc..bfd7884832 100644 --- a/x/vesting/proposal_handler.go +++ b/x/vesting/proposal_handler.go @@ -11,8 +11,8 @@ import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - "github.com/evmos/evmos/v17/x/vesting/keeper" - "github.com/evmos/evmos/v17/x/vesting/types" + "github.com/evmos/evmos/v18/x/vesting/keeper" + "github.com/evmos/evmos/v18/x/vesting/types" ) // NewVestingProposalHandler creates a governance handler to manage new proposal types. diff --git a/x/vesting/proposal_handler_test.go b/x/vesting/proposal_handler_test.go index 39f1b1537a..c5b60fcc67 100644 --- a/x/vesting/proposal_handler_test.go +++ b/x/vesting/proposal_handler_test.go @@ -5,10 +5,10 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" sdkvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" - "github.com/evmos/evmos/v17/testutil" - testutiltx "github.com/evmos/evmos/v17/testutil/tx" - "github.com/evmos/evmos/v17/x/vesting" - vestingtypes "github.com/evmos/evmos/v17/x/vesting/types" + "github.com/evmos/evmos/v18/testutil" + testutiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/x/vesting" + vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" ) var ( diff --git a/x/vesting/setup_test.go b/x/vesting/setup_test.go index 7cdb8ac90a..e6174394b0 100644 --- a/x/vesting/setup_test.go +++ b/x/vesting/setup_test.go @@ -8,7 +8,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v17/app" + "github.com/evmos/evmos/v18/app" "github.com/stretchr/testify/suite" ) diff --git a/x/vesting/types/clawback_vesting_account.go b/x/vesting/types/clawback_vesting_account.go index a880151f7b..f9ff474bd7 100644 --- a/x/vesting/types/clawback_vesting_account.go +++ b/x/vesting/types/clawback_vesting_account.go @@ -51,35 +51,55 @@ func NewClawbackVestingAccount( } } -// GetVestedCoins returns the total number of vested coins that are still in lockup. If no coins are -// vested, nil is returned. -func (va ClawbackVestingAccount) GetVestedCoins(blockTime time.Time) sdk.Coins { - // It's likely that one or the other schedule will be nearly trivial, - // so there should be little overhead in recomputing the conjunction each time. - coins := va.GetUnlockedOnly(blockTime).Min(va.GetVestedOnly(blockTime)) +// GetLockedUpVestedCoins returns the total number of vested coins that are locked. +func (va ClawbackVestingAccount) GetLockedUpVestedCoins(blockTime time.Time) sdk.Coins { + return va.GetVestedCoins(blockTime).Sub(va.GetUnlockedVestedCoins(blockTime)...) +} + +// GetUnlockedVestedCoins returns the total number of vested coins that are unlocked. +// If no coins are vested and unlocked, nil is returned. +func (va ClawbackVestingAccount) GetUnlockedVestedCoins(blockTime time.Time) sdk.Coins { + coins := va.GetUnlockedCoins(blockTime).Min(va.GetVestedCoins(blockTime)) if coins.IsZero() { - return nil + return sdk.Coins{} } return coins } -// GetVestingCoins returns the total number of vesting coins. If no coins are -// vesting, nil is returned. +// GetVestingCoins returns the total number of vesting coins (unvested coins). +// If no coins are vesting, nil is returned. func (va ClawbackVestingAccount) GetVestingCoins(blockTime time.Time) sdk.Coins { return va.OriginalVesting.Sub(va.GetVestedCoins(blockTime)...) } -// LockedCoins returns the set of coins that are not spendable (i.e. locked), -// defined as the vesting coins that are not delegated. +// LockedCoins returns the set of coins that are not spendable (i.e. locked or unvested), +// defined as the vesting coins (unvested) plus locked vested coins. +// +// totalAmt = vesting(un/locked) + lockedVested + unlockedVested +// +// (all) = (cannot spend) (cannot spend) (CAN spend) +// +// lockedCoins = totalAmt - unlockedVested func (va ClawbackVestingAccount) LockedCoins(blockTime time.Time) sdk.Coins { - return va.BaseVestingAccount.LockedCoinsFromVesting(va.GetVestingCoins(blockTime)) + return va.OriginalVesting.Sub(va.GetUnlockedVestedCoins(blockTime)...) } // TrackDelegation tracks a desired delegation amount by setting the appropriate -// values for the amount of delegated vesting, delegated free, and reducing the -// overall amount of base coins. -func (va *ClawbackVestingAccount) TrackDelegation(blockTime time.Time, balance, amount sdk.Coins) { - va.BaseVestingAccount.TrackDelegation(balance, va.GetVestingCoins(blockTime), amount) +// values for the amount of delegated free coins. +// The 'balance' input parameter is the delegator account balance. +// The 'amount' input parameter are the delegated coins +// Note that unvested coins cannot be delegated +func (va *ClawbackVestingAccount) TrackDelegation(_ time.Time, balance, amount sdk.Coins) { + // Can only delegate vested (free) coins + for _, coin := range amount { + baseAmt := balance.AmountOf(coin.Denom) + // Panic if the delegation amount is zero or if the base coins does not + // exceed the desired delegation amount. + if coin.Amount.IsZero() || baseAmt.LT(coin.Amount) { + panic("delegation attempt with zero coins or insufficient funds") + } + va.DelegatedFree = va.DelegatedFree.Add(coin) + } } // GetStartTime returns the time when vesting starts for a periodic vesting @@ -125,7 +145,7 @@ func (va ClawbackVestingAccount) Validate() error { } if vestingEnd > va.EndTime { - return errors.New("vesting schedule exteds beyond account end time") + return errors.New("vesting schedule extends beyond account end time") } if !CoinEq(vestingCoins, va.OriginalVesting) { @@ -135,30 +155,25 @@ func (va ClawbackVestingAccount) Validate() error { return va.BaseVestingAccount.Validate() } -// GetUnlockedOnly returns the unlocking schedule at blockTime. -func (va ClawbackVestingAccount) GetUnlockedOnly(blockTime time.Time) sdk.Coins { +// GetUnlockedCoins returns the unlocked coins at blockTime. +// Note that these unlocked coins can be vested or unvested +// and is determined by the lockup periods +func (va ClawbackVestingAccount) GetUnlockedCoins(blockTime time.Time) sdk.Coins { return ReadSchedule(va.GetStartTime(), va.EndTime, va.LockupPeriods, va.OriginalVesting, blockTime.Unix()) } -// GetLockedOnly returns the locking schedule at blockTime. -func (va ClawbackVestingAccount) GetLockedOnly(blockTime time.Time) sdk.Coins { - return va.OriginalVesting.Sub(va.GetUnlockedOnly(blockTime)...) +// GetLockedUpCoins returns the locked coins at blockTime. +// Note that these locked up coins can be vested or unvested, +// and is determined by the lockup periods +func (va ClawbackVestingAccount) GetLockedUpCoins(blockTime time.Time) sdk.Coins { + return va.OriginalVesting.Sub(va.GetUnlockedCoins(blockTime)...) } -// GetVestedOnly returns the vesting schedule at blockTime. -func (va ClawbackVestingAccount) GetVestedOnly(blockTime time.Time) sdk.Coins { +// GetVestedCoins returns the vested coins at blockTime. +func (va ClawbackVestingAccount) GetVestedCoins(blockTime time.Time) sdk.Coins { return ReadSchedule(va.GetStartTime(), va.EndTime, va.VestingPeriods, va.OriginalVesting, blockTime.Unix()) } -// GetUnvestedOnly returns the unvesting schedule at blockTime. -func (va ClawbackVestingAccount) GetUnvestedOnly(blockTime time.Time) sdk.Coins { - totalUnvested := va.OriginalVesting.Sub(va.GetVestedOnly(blockTime)...) - if totalUnvested == nil { - totalUnvested = sdk.Coins{} - } - return totalUnvested -} - // GetPassedPeriodCount returns the amount of passed periods at blockTime. func (va ClawbackVestingAccount) GetPassedPeriodCount(blockTime time.Time) int { return ReadPastPeriodCount(va.GetStartTime(), va.EndTime, va.VestingPeriods, blockTime.Unix()) @@ -170,8 +185,8 @@ func (va ClawbackVestingAccount) GetPassedPeriodCount(blockTime time.Time) int { func (va ClawbackVestingAccount) ComputeClawback( clawbackTime int64, ) (ClawbackVestingAccount, sdk.Coins) { - totalVested := va.GetVestedOnly(time.Unix(clawbackTime, 0)) - totalUnvested := va.GetUnvestedOnly(time.Unix(clawbackTime, 0)) + totalVested := va.GetVestedCoins(time.Unix(clawbackTime, 0)) + totalUnvested := va.GetVestingCoins(time.Unix(clawbackTime, 0)) // Remove all unvested periods from the schedule passedPeriodID := va.GetPassedPeriodCount(time.Unix(clawbackTime, 0)) @@ -203,5 +218,5 @@ func (va ClawbackVestingAccount) ComputeClawback( // HasLockedCoins returns true if the block time has not passed all clawback // account's lockup periods func (va ClawbackVestingAccount) HasLockedCoins(blockTime time.Time) bool { - return !va.GetLockedOnly(blockTime).IsZero() + return !va.GetLockedUpCoins(blockTime).IsZero() } diff --git a/x/vesting/types/clawback_vesting_account_test.go b/x/vesting/types/clawback_vesting_account_test.go index df41165ec9..dd201d453e 100644 --- a/x/vesting/types/clawback_vesting_account_test.go +++ b/x/vesting/types/clawback_vesting_account_test.go @@ -11,20 +11,32 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" sdkvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - "github.com/evmos/evmos/v17/x/vesting/types" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/x/vesting/types" ) var ( stakeDenom = "stake" feeDenom = "fee" lockupPeriods = sdkvesting.Periods{ - sdkvesting.Period{Length: int64(16 * 60 * 60), Amount: sdk.NewCoins(sdk.NewInt64Coin(feeDenom, 1000), sdk.NewInt64Coin(stakeDenom, 100))}, + sdkvesting.Period{ + Length: int64(16 * 60 * 60), // 16hs + Amount: sdk.NewCoins(sdk.NewInt64Coin(feeDenom, 1000), sdk.NewInt64Coin(stakeDenom, 100)), + }, } vestingPeriods = sdkvesting.Periods{ - sdkvesting.Period{Length: int64(12 * 60 * 60), Amount: sdk.Coins{sdk.NewInt64Coin(feeDenom, 500), sdk.NewInt64Coin(stakeDenom, 50)}}, - sdkvesting.Period{Length: int64(6 * 60 * 60), Amount: sdk.Coins{sdk.NewInt64Coin(feeDenom, 250), sdk.NewInt64Coin(stakeDenom, 25)}}, - sdkvesting.Period{Length: int64(6 * 60 * 60), Amount: sdk.Coins{sdk.NewInt64Coin(feeDenom, 250), sdk.NewInt64Coin(stakeDenom, 25)}}, + sdkvesting.Period{ + Length: int64(12 * 60 * 60), // 12hs + Amount: getPercentOfVestingCoins(50), + }, + sdkvesting.Period{ + Length: int64(6 * 60 * 60), // 6hs + Amount: getPercentOfVestingCoins(25), + }, + sdkvesting.Period{ + Length: int64(6 * 60 * 60), // 6hs + Amount: getPercentOfVestingCoins(25), + }, } origCoins = sdk.Coins{sdk.NewInt64Coin(feeDenom, 1000), sdk.NewInt64Coin(stakeDenom, 100)} ) @@ -38,30 +50,31 @@ func TestVestingAccountSuite(t *testing.T) { } func (suite *VestingAccountTestSuite) TestClawbackAccountNew() { - addr := sdk.AccAddress(utiltx.GenerateAddress().Bytes()) + addr := sdk.AccAddress("test_address") baseAcc := authtypes.NewBaseAccountWithAddress(addr) initialVesting := sdk.NewCoins(sdk.NewInt64Coin(sdk.DefaultBondDenom, 50)) testCases := []struct { - name string - acc authtypes.GenesisAccount - expErr bool + name string + acc authtypes.GenesisAccount + expErr bool + expErrMsg string }{ { - "Clawback vesting account - pass", - types.NewClawbackVestingAccount( + name: "Clawback vesting account - pass", + acc: types.NewClawbackVestingAccount( baseAcc, - sdk.AccAddress([]byte("the funder")), + sdk.AccAddress("the funder"), initialVesting, time.Now(), sdkvesting.Periods{sdkvesting.Period{Length: 101, Amount: initialVesting}}, sdkvesting.Periods{sdkvesting.Period{Length: 201, Amount: initialVesting}}, ), - false, + expErr: false, }, { - "Clawback vesting account - invalid vesting end", - &types.ClawbackVestingAccount{ + name: "Clawback vesting account - invalid vesting end", + acc: &types.ClawbackVestingAccount{ BaseVestingAccount: &sdkvesting.BaseVestingAccount{ BaseAccount: baseAcc, OriginalVesting: initialVesting, @@ -72,11 +85,12 @@ func (suite *VestingAccountTestSuite) TestClawbackAccountNew() { LockupPeriods: sdkvesting.Periods{sdkvesting.Period{Length: 10, Amount: initialVesting}}, VestingPeriods: sdkvesting.Periods{sdkvesting.Period{Length: 10, Amount: initialVesting}}, }, - true, + expErr: true, + expErrMsg: "vesting start-time must be before end-time", }, { - "Clawback vesting account - lockup too long", - &types.ClawbackVestingAccount{ + name: "Clawback vesting account - lockup too long", + acc: &types.ClawbackVestingAccount{ BaseVestingAccount: &sdkvesting.BaseVestingAccount{ BaseAccount: baseAcc, OriginalVesting: initialVesting, @@ -87,11 +101,12 @@ func (suite *VestingAccountTestSuite) TestClawbackAccountNew() { LockupPeriods: sdkvesting.Periods{sdkvesting.Period{Length: 20, Amount: initialVesting}}, VestingPeriods: sdkvesting.Periods{sdkvesting.Period{Length: 10, Amount: initialVesting}}, }, - true, + expErr: true, + expErrMsg: "lockup schedule extends beyond account end time", }, { - "Clawback vesting account - invalid lockup coins", - &types.ClawbackVestingAccount{ + name: "Clawback vesting account - invalid lockup coins", + acc: &types.ClawbackVestingAccount{ BaseVestingAccount: &sdkvesting.BaseVestingAccount{ BaseAccount: baseAcc, OriginalVesting: initialVesting, @@ -102,11 +117,12 @@ func (suite *VestingAccountTestSuite) TestClawbackAccountNew() { LockupPeriods: sdkvesting.Periods{sdkvesting.Period{Length: 10, Amount: initialVesting.Add(initialVesting...)}}, VestingPeriods: sdkvesting.Periods{sdkvesting.Period{Length: 10, Amount: initialVesting}}, }, - true, + expErr: true, + expErrMsg: "original vesting coins does not match the sum of all coins in lockup periods", }, { - "Clawback vesting account - vesting too long", - &types.ClawbackVestingAccount{ + name: "Clawback vesting account - vesting too long", + acc: &types.ClawbackVestingAccount{ BaseVestingAccount: &sdkvesting.BaseVestingAccount{ BaseAccount: baseAcc, OriginalVesting: initialVesting, @@ -117,11 +133,12 @@ func (suite *VestingAccountTestSuite) TestClawbackAccountNew() { LockupPeriods: sdkvesting.Periods{sdkvesting.Period{Length: 10, Amount: initialVesting}}, VestingPeriods: sdkvesting.Periods{sdkvesting.Period{Length: 20, Amount: initialVesting}}, }, - true, + expErr: true, + expErrMsg: "vesting schedule extends beyond account end time", }, { - "Clawback vesting account - invalid vesting coins", - &types.ClawbackVestingAccount{ + name: "Clawback vesting account - invalid vesting coins", + acc: &types.ClawbackVestingAccount{ BaseVestingAccount: &sdkvesting.BaseVestingAccount{ BaseAccount: baseAcc, OriginalVesting: initialVesting, @@ -132,18 +149,25 @@ func (suite *VestingAccountTestSuite) TestClawbackAccountNew() { LockupPeriods: sdkvesting.Periods{sdkvesting.Period{Length: 10, Amount: initialVesting}}, VestingPeriods: sdkvesting.Periods{sdkvesting.Period{Length: 10, Amount: initialVesting.Add(initialVesting...)}}, }, - true, + expErr: true, + expErrMsg: "original vesting coins does not match the sum of all coins in vesting periods", }, } for _, tc := range testCases { suite.Run(tc.name, func() { - suite.Require().Equal(tc.expErr, tc.acc.Validate() != nil) + err := tc.acc.Validate() + if tc.expErr { + suite.Require().Error(err) + suite.Require().Contains(err.Error(), tc.expErrMsg) + return + } + suite.Require().NoError(err) }) } } -func (suite *VestingAccountTestSuite) TestGetVestedVestingLockedCoins() { +func (suite *VestingAccountTestSuite) TestGetCoinsFunctions() { now := tmtime.Now() endTime := now.Add(24 * time.Hour) addr := sdk.AccAddress(utiltx.GenerateAddress().Bytes()) @@ -151,67 +175,103 @@ func (suite *VestingAccountTestSuite) TestGetVestedVestingLockedCoins() { va := types.NewClawbackVestingAccount(bacc, sdk.AccAddress([]byte("funder")), origCoins, now, lockupPeriods, vestingPeriods) testCases := []struct { - name string - time time.Time - expVestedCoins sdk.Coins - expUnvestedCoins sdk.Coins - expSpendableCoins sdk.Coins + name string + time time.Time + expVestedCoins sdk.Coins + expLockedUpVestedCoins sdk.Coins + expUnlockedVestedCoins sdk.Coins + expUnvestedCoins sdk.Coins + expLockedUpCoins sdk.Coins + expUnlockedCoins sdk.Coins + expNotSpendable sdk.Coins }{ { - "no coins vested at the beginning of the vesting schedule", - now, - nil, - origCoins, - origCoins, - }, - { - "all coins vested at the end of the vesting schedule", - endTime, - origCoins, - sdk.Coins{}, - sdk.NewCoins(), - }, - { - "no coins vested during first vesting period", - now.Add(6 * time.Hour), - nil, - origCoins, - origCoins, - }, - { - "no coins vested after period 1 before unlocking", - now.Add(14 * time.Hour), - nil, - origCoins, - origCoins, - }, - { - "50 percent of coins vested after period 1 at unlocking", - now.Add(16 * time.Hour), - sdk.Coins{sdk.NewInt64Coin(feeDenom, 500), sdk.NewInt64Coin(stakeDenom, 50)}, - sdk.Coins{sdk.NewInt64Coin(feeDenom, 500), sdk.NewInt64Coin(stakeDenom, 50)}, - sdk.Coins{sdk.NewInt64Coin(feeDenom, 500), sdk.NewInt64Coin(stakeDenom, 50)}, - }, - { - "period 2 coins don't vest until period is over", - now.Add(17 * time.Hour), - sdk.Coins{sdk.NewInt64Coin(feeDenom, 500), sdk.NewInt64Coin(stakeDenom, 50)}, - sdk.Coins{sdk.NewInt64Coin(feeDenom, 500), sdk.NewInt64Coin(stakeDenom, 50)}, - sdk.Coins{sdk.NewInt64Coin(feeDenom, 500), sdk.NewInt64Coin(stakeDenom, 50)}, - }, - { - "75 percent of coins vested after period 2", - now.Add(18 * time.Hour), - sdk.Coins{sdk.NewInt64Coin(feeDenom, 750), sdk.NewInt64Coin(stakeDenom, 75)}, - sdk.Coins{sdk.NewInt64Coin(feeDenom, 250), sdk.NewInt64Coin(stakeDenom, 25)}, - sdk.Coins{sdk.NewInt64Coin(feeDenom, 250), sdk.NewInt64Coin(stakeDenom, 25)}, - }, - { - "100 percent of coins vested", - now.Add(48 * time.Hour), - origCoins, - sdk.Coins{}, - sdk.NewCoins(), + name: "no coins vested at the beginning of the vesting schedule, all locked", + time: now, + expVestedCoins: sdk.Coins{}, + expLockedUpVestedCoins: sdk.Coins{}, + expUnlockedVestedCoins: sdk.Coins{}, + expUnvestedCoins: origCoins, + expLockedUpCoins: origCoins, + expUnlockedCoins: sdk.Coins{}, + expNotSpendable: origCoins, + }, + { + name: "all coins vested and unlocked at the end of the vesting schedule", + time: endTime, + expVestedCoins: origCoins, + expLockedUpVestedCoins: sdk.Coins{}, + expUnlockedVestedCoins: origCoins, + expUnvestedCoins: sdk.Coins{}, + expLockedUpCoins: sdk.Coins{}, + expUnlockedCoins: origCoins, + expNotSpendable: sdk.Coins{}, + }, + { + name: "no coins vested during first vesting period, all still locked", + time: now.Add(6 * time.Hour), + expVestedCoins: sdk.Coins{}, + expLockedUpVestedCoins: sdk.Coins{}, + expUnlockedVestedCoins: sdk.Coins{}, + expUnvestedCoins: origCoins, + expLockedUpCoins: origCoins, + expUnlockedCoins: sdk.Coins{}, + expNotSpendable: origCoins, + }, + { + name: "50 percent of coins are vested after 1st vesting period, but before unlocking (all locked coins)", + time: now.Add(12 * time.Hour), + expVestedCoins: getPercentOfVestingCoins(50), + expLockedUpVestedCoins: getPercentOfVestingCoins(50), + expUnlockedVestedCoins: sdk.Coins{}, + expUnvestedCoins: getPercentOfVestingCoins(50), + expLockedUpCoins: origCoins, + expUnlockedCoins: sdk.Coins{}, + expNotSpendable: origCoins, + }, + { + name: "after lockup period (all coins unlocked) - 50 percent of coins already vested", + time: now.Add(16 * time.Hour), + expVestedCoins: getPercentOfVestingCoins(50), + expLockedUpVestedCoins: sdk.Coins{}, + expUnlockedVestedCoins: getPercentOfVestingCoins(50), + expUnvestedCoins: getPercentOfVestingCoins(50), + expLockedUpCoins: sdk.Coins{}, + expUnlockedCoins: origCoins, + expNotSpendable: getPercentOfVestingCoins(50), + }, + { + name: "in between vesting periods 1 and 2 - no new coins don't vested", + time: now.Add(17 * time.Hour), + expVestedCoins: getPercentOfVestingCoins(50), + expLockedUpVestedCoins: sdk.Coins{}, + expUnlockedVestedCoins: getPercentOfVestingCoins(50), + expUnvestedCoins: getPercentOfVestingCoins(50), + expLockedUpCoins: sdk.Coins{}, + expUnlockedCoins: origCoins, + expNotSpendable: getPercentOfVestingCoins(50), + }, + { + name: "75 percent of coins vested after period 2", + time: now.Add(18 * time.Hour), + expVestedCoins: getPercentOfVestingCoins(75), + expLockedUpVestedCoins: sdk.Coins{}, + expUnlockedVestedCoins: getPercentOfVestingCoins(75), + expUnvestedCoins: getPercentOfVestingCoins(25), + expLockedUpCoins: sdk.Coins{}, + expUnlockedCoins: origCoins, + expNotSpendable: getPercentOfVestingCoins(25), + }, + { + name: "100 percent of coins vested", + time: now.Add(48 * time.Hour), + expVestedCoins: origCoins, + expLockedUpVestedCoins: sdk.Coins{}, + expUnlockedVestedCoins: origCoins, + expUnvestedCoins: sdk.Coins{}, + expLockedUpCoins: sdk.Coins{}, + expUnlockedCoins: origCoins, + expNotSpendable: sdk.Coins{}, }, } @@ -219,94 +279,17 @@ func (suite *VestingAccountTestSuite) TestGetVestedVestingLockedCoins() { suite.Run(tc.name, func() { vestedCoins := va.GetVestedCoins(tc.time) suite.Require().Equal(tc.expVestedCoins, vestedCoins) + lockedUpVested := va.GetLockedUpVestedCoins(tc.time) + suite.Require().Equal(tc.expLockedUpVestedCoins, lockedUpVested) + unlockedVestedCoins := va.GetUnlockedVestedCoins(tc.time) + suite.Require().Equal(tc.expUnlockedVestedCoins, unlockedVestedCoins) unvestedCoins := va.GetVestingCoins(tc.time) suite.Require().Equal(tc.expUnvestedCoins, unvestedCoins) - spendableCoins := va.LockedCoins(tc.time) - suite.Require().Equal(tc.expSpendableCoins, spendableCoins) - }) - } -} - -func (suite *VestingAccountTestSuite) TestGetVestedUnvestedLockedOnly() { - now := tmtime.Now() - endTime := now.Add(24 * time.Hour) - addr := sdk.AccAddress(utiltx.GenerateAddress().Bytes()) - bacc := authtypes.NewBaseAccountWithAddress(addr) - va := types.NewClawbackVestingAccount(bacc, sdk.AccAddress([]byte("funder")), origCoins, now, lockupPeriods, vestingPeriods) - - testCases := []struct { - name string - time time.Time - expVestedCoins sdk.Coins - expUnvestedCoins sdk.Coins - expLockedCoins sdk.Coins - }{ - { - "no coins vested at the beginning of the vesting schedule", - now, - sdk.Coins{}, - origCoins, - origCoins, - }, - { - "all coins vested at the end of the vesting schedule", - endTime, - origCoins, - sdk.Coins{}, - sdk.Coins{}, - }, - { - "no coins vested during first vesting period", - now.Add(6 * time.Hour), - sdk.Coins{}, - origCoins, - origCoins, - }, - { - "50 percent of coins vested after period 1 before unlocking", - now.Add(14 * time.Hour), - sdk.Coins{sdk.NewInt64Coin(feeDenom, 500), sdk.NewInt64Coin(stakeDenom, 50)}, - sdk.Coins{sdk.NewInt64Coin(feeDenom, 500), sdk.NewInt64Coin(stakeDenom, 50)}, - origCoins, - }, - { - "50 percent of coins vested after period 1 at unlocking", - now.Add(16 * time.Hour), - sdk.Coins{sdk.NewInt64Coin(feeDenom, 500), sdk.NewInt64Coin(stakeDenom, 50)}, - sdk.Coins{sdk.NewInt64Coin(feeDenom, 500), sdk.NewInt64Coin(stakeDenom, 50)}, - sdk.Coins{}, - }, - { - "period 2 coins don't vest until period is over", - now.Add(17 * time.Hour), - sdk.Coins{sdk.NewInt64Coin(feeDenom, 500), sdk.NewInt64Coin(stakeDenom, 50)}, - sdk.Coins{sdk.NewInt64Coin(feeDenom, 500), sdk.NewInt64Coin(stakeDenom, 50)}, - sdk.Coins{}, - }, - { - "75 percent of coins vested after period 2", - now.Add(18 * time.Hour), - sdk.Coins{sdk.NewInt64Coin(feeDenom, 750), sdk.NewInt64Coin(stakeDenom, 75)}, - sdk.Coins{sdk.NewInt64Coin(feeDenom, 250), sdk.NewInt64Coin(stakeDenom, 25)}, - sdk.Coins{}, - }, - { - "100 percent of coins vested", - now.Add(48 * time.Hour), - origCoins, - sdk.Coins{}, - sdk.Coins{}, - }, - } - - for _, tc := range testCases { - suite.Run(tc.name, func() { - vestedCoins := va.GetVestedOnly(tc.time) - suite.Require().Equal(tc.expVestedCoins, vestedCoins) - unvestedCoins := va.GetUnvestedOnly(tc.time) - suite.Require().Equal(tc.expUnvestedCoins, unvestedCoins) - lockedCoins := va.GetLockedOnly(tc.time) - suite.Require().Equal(tc.expLockedCoins, lockedCoins) + lockedUpCoins := va.GetLockedUpCoins(tc.time) + suite.Require().Equal(tc.expLockedUpCoins, lockedUpCoins) + unlockedCoins := va.GetUnlockedCoins(tc.time) + suite.Require().Equal(tc.expUnlockedCoins, unlockedCoins) + suite.Require().Equal(tc.expNotSpendable, va.LockedCoins(tc.time)) }) } } @@ -316,58 +299,37 @@ func (suite *VestingAccountTestSuite) TestTrackDelegationUndelegation() { endTime := now.Add(24 * time.Hour) testCases := []struct { - name string - delegate func(*types.ClawbackVestingAccount) - expDelegatedUnvested sdk.Coins - expDelegatedFree sdk.Coins - undelegate func(*types.ClawbackVestingAccount) - expUndelegatedUnvested sdk.Coins - expUndelegatedFree sdk.Coins - expDelegationPanic bool - expUndelegationPanic bool + name string + delegate func(*types.ClawbackVestingAccount) + expDelegatedFree sdk.Coins + undelegate func(*types.ClawbackVestingAccount) + expUndelegatedFree sdk.Coins + expDelegationPanic bool + expUndelegationPanic bool }{ - { - "delegate and undelegate all unvested coins", - func(va *types.ClawbackVestingAccount) { - va.TrackDelegation(now, origCoins, origCoins) - }, - origCoins, - nil, - func(va *types.ClawbackVestingAccount) { - va.TrackUndelegation(origCoins) - }, - sdk.Coins{}, - nil, - false, - false, - }, { "delegate and undelegated all vested coins", func(va *types.ClawbackVestingAccount) { va.TrackDelegation(endTime, origCoins, origCoins) }, - nil, origCoins, func(va *types.ClawbackVestingAccount) { va.TrackUndelegation(origCoins) }, - nil, sdk.Coins{}, false, false, }, { - "delegate and undelegate half of unvested coins", + "delegate and undelegate half of vested coins", func(va *types.ClawbackVestingAccount) { va.TrackDelegation(now, origCoins, vestingPeriods[0].Amount) }, vestingPeriods[0].Amount, - nil, func(va *types.ClawbackVestingAccount) { va.TrackUndelegation(vestingPeriods[0].Amount) }, sdk.Coins{}, - nil, false, false, }, @@ -377,12 +339,10 @@ func (suite *VestingAccountTestSuite) TestTrackDelegationUndelegation() { va.TrackDelegation(now, origCoins, sdk.Coins{sdk.NewInt64Coin(stakeDenom, 1000000)}) }, vestingPeriods[0].Amount, - nil, func(va *types.ClawbackVestingAccount) { va.TrackUndelegation(vestingPeriods[0].Amount) }, sdk.Coins{}, - sdk.Coins{}, true, false, }, @@ -392,12 +352,10 @@ func (suite *VestingAccountTestSuite) TestTrackDelegationUndelegation() { va.TrackDelegation(now, origCoins, origCoins) }, vestingPeriods[0].Amount, - nil, func(va *types.ClawbackVestingAccount) { va.TrackUndelegation(sdk.Coins{sdk.NewInt64Coin(stakeDenom, 0)}) }, sdk.Coins{}, - sdk.Coins{}, false, true, }, @@ -407,13 +365,11 @@ func (suite *VestingAccountTestSuite) TestTrackDelegationUndelegation() { va.TrackDelegation(now.Add(17*time.Hour), origCoins, sdk.Coins{sdk.NewInt64Coin(stakeDenom, 50)}) va.TrackDelegation(now.Add(17*time.Hour), origCoins, sdk.Coins{sdk.NewInt64Coin(stakeDenom, 50)}) }, - sdk.Coins{sdk.NewInt64Coin(stakeDenom, 50)}, - sdk.Coins{sdk.NewInt64Coin(stakeDenom, 50)}, + sdk.Coins{sdk.NewInt64Coin(stakeDenom, 100)}, func(va *types.ClawbackVestingAccount) { va.TrackUndelegation(sdk.Coins{sdk.NewInt64Coin(stakeDenom, 25)}) }, - sdk.Coins{sdk.NewInt64Coin(stakeDenom, 50)}, - sdk.Coins{sdk.NewInt64Coin(stakeDenom, 25)}, + sdk.Coins{sdk.NewInt64Coin(stakeDenom, 75)}, false, false, }, @@ -423,26 +379,21 @@ func (suite *VestingAccountTestSuite) TestTrackDelegationUndelegation() { va.TrackDelegation(now.Add(17*time.Hour), origCoins, sdk.Coins{sdk.NewInt64Coin(stakeDenom, 50)}) va.TrackDelegation(now.Add(17*time.Hour), origCoins, sdk.Coins{sdk.NewInt64Coin(stakeDenom, 50)}) }, - sdk.Coins{sdk.NewInt64Coin(stakeDenom, 50)}, - sdk.Coins{sdk.NewInt64Coin(stakeDenom, 50)}, + sdk.Coins{sdk.NewInt64Coin(stakeDenom, 100)}, func(va *types.ClawbackVestingAccount) { va.TrackUndelegation(sdk.Coins{sdk.NewInt64Coin(stakeDenom, 25)}) va.TrackUndelegation(sdk.Coins{sdk.NewInt64Coin(stakeDenom, 50)}) }, sdk.Coins{sdk.NewInt64Coin(stakeDenom, 25)}, - sdk.Coins{}, false, false, }, } - for _, tc := range testCases { suite.Run(tc.name, func() { addr := sdk.AccAddress(utiltx.GenerateAddress().Bytes()) bacc := authtypes.NewBaseAccountWithAddress(addr) - va := types.NewClawbackVestingAccount(bacc, sdk.AccAddress([]byte("funder")), origCoins, now, lockupPeriods, vestingPeriods) - if tc.expDelegationPanic { //nolint:gocritic suite.Require().Panics(func() { tc.delegate(va) @@ -452,14 +403,15 @@ func (suite *VestingAccountTestSuite) TestTrackDelegationUndelegation() { tc.undelegate(va) }) } else { + var emptyCoins sdk.Coins // Track Delegation tc.delegate(va) - suite.Require().Equal(tc.expDelegatedUnvested, va.DelegatedVesting) + suite.Require().Equal(emptyCoins, va.DelegatedVesting) suite.Require().Equal(tc.expDelegatedFree, va.DelegatedFree) // Track Undelegation tc.undelegate(va) - suite.Require().Equal(tc.expUndelegatedUnvested, va.DelegatedVesting) + suite.Require().Equal(emptyCoins, va.DelegatedVesting) suite.Require().Equal(tc.expUndelegatedFree, va.DelegatedFree) } }) @@ -538,3 +490,16 @@ func (suite *VestingAccountTestSuite) TestComputeClawback() { }) } } + +// getPercentOfVestingCoins is a helper function to calculate +// the specified percentage of the coins in the vesting schedule +func getPercentOfVestingCoins(percentage int64) sdk.Coins { + if percentage < 0 || percentage > 100 { + panic("invalid percentage passed!") + } + var retCoins sdk.Coins + for _, coin := range origCoins { + retCoins = retCoins.Add(sdk.NewCoin(coin.Denom, coin.Amount.MulRaw(percentage).QuoRaw(100))) + } + return retCoins +} diff --git a/x/vesting/types/codec.go b/x/vesting/types/codec.go index 69e92e4a75..34c3f73fc1 100644 --- a/x/vesting/types/codec.go +++ b/x/vesting/types/codec.go @@ -12,7 +12,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/vesting/exported" sdkvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - migrationtypes "github.com/evmos/evmos/v17/x/vesting/migrations/types" + migrationtypes "github.com/evmos/evmos/v18/x/vesting/migrations/types" ) var ( diff --git a/x/vesting/types/events.pb.go b/x/vesting/types/events.pb.go index e96d880706..e7b4db82af 100644 --- a/x/vesting/types/events.pb.go +++ b/x/vesting/types/events.pb.go @@ -292,7 +292,7 @@ var fileDescriptor_7a6fa6478193a613 = []byte{ // 318 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x92, 0xcf, 0x4a, 0x33, 0x31, 0x14, 0xc5, 0x3b, 0xdf, 0x47, 0x2b, 0xbd, 0xe2, 0x1f, 0x06, 0xd1, 0xd9, 0x74, 0xa8, 0xdd, 0x28, - 0x2e, 0x66, 0xb0, 0x2e, 0x5c, 0x6b, 0xb5, 0x0f, 0x20, 0xea, 0xc2, 0x4d, 0x49, 0x33, 0xd7, 0x1a, + 0x2e, 0x66, 0xb0, 0x6e, 0xdc, 0x6a, 0xb5, 0x0f, 0x20, 0xea, 0xc2, 0x4d, 0x49, 0x33, 0xd7, 0x1a, 0xea, 0x24, 0x65, 0x72, 0x27, 0xd5, 0xa7, 0xd0, 0xc7, 0x72, 0xd9, 0xa5, 0x4b, 0xe9, 0xbc, 0x88, 0x98, 0x44, 0xb1, 0x50, 0x41, 0x97, 0x37, 0xf7, 0xe4, 0x77, 0xcf, 0x81, 0x03, 0x2d, 0x34, 0xb9, 0xd2, 0xa9, 0x41, 0x4d, 0x42, 0x8e, 0x52, 0xd3, 0x4d, 0xd1, 0xa0, 0x24, 0x9d, 0x4c, 0x0a, 0x45, @@ -309,7 +309,7 @@ var fileDescriptor_7a6fa6478193a613 = []byte{ 0x32, 0x8f, 0x83, 0xd9, 0x3c, 0x0e, 0xde, 0xe6, 0x71, 0xf0, 0x5c, 0xc5, 0xb5, 0x59, 0x15, 0xd7, 0x5e, 0xab, 0xb8, 0x76, 0x73, 0x30, 0x12, 0x74, 0x57, 0x0e, 0x13, 0xae, 0xf2, 0xd4, 0xf5, 0xc3, 0xb7, 0xe4, 0xf0, 0x38, 0x7d, 0xf8, 0xea, 0x0a, 0x3d, 0x4e, 0x50, 0x0f, 0x1b, 0xb6, 0x28, 0x47, - 0xef, 0x01, 0x00, 0x00, 0xff, 0xff, 0xcd, 0xb9, 0x6d, 0x2a, 0x49, 0x02, 0x00, 0x00, + 0xef, 0x01, 0x00, 0x00, 0xff, 0xff, 0xd2, 0xd6, 0x36, 0xc8, 0x49, 0x02, 0x00, 0x00, } func (m *EventCreateClawbackVestingAccount) Marshal() (dAtA []byte, err error) { diff --git a/x/vesting/types/msg_test.go b/x/vesting/types/msg_test.go index 8786d471ea..dc5e4348a5 100644 --- a/x/vesting/types/msg_test.go +++ b/x/vesting/types/msg_test.go @@ -10,8 +10,8 @@ import ( sdkvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" "github.com/stretchr/testify/suite" - utiltx "github.com/evmos/evmos/v17/testutil/tx" - "github.com/evmos/evmos/v17/x/vesting/types" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/x/vesting/types" ) type MsgsTestSuite struct { diff --git a/x/vesting/types/proposal_test.go b/x/vesting/types/proposal_test.go index 92a209c2c6..530af51af3 100644 --- a/x/vesting/types/proposal_test.go +++ b/x/vesting/types/proposal_test.go @@ -3,7 +3,7 @@ package types_test import ( "testing" - "github.com/evmos/evmos/v17/x/vesting/types" + "github.com/evmos/evmos/v18/x/vesting/types" "github.com/stretchr/testify/suite" ) diff --git a/x/vesting/types/query.pb.go b/x/vesting/types/query.pb.go index 4b95b5697b..0e62d342f8 100644 --- a/x/vesting/types/query.pb.go +++ b/x/vesting/types/query.pb.go @@ -153,7 +153,7 @@ var fileDescriptor_e31744b0ce27e85a = []byte{ // 383 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x52, 0x41, 0x4f, 0xe2, 0x40, 0x14, 0xee, 0x40, 0x96, 0x65, 0x67, 0x2f, 0x9b, 0x86, 0x4d, 0xba, 0x84, 0x14, 0x42, 0x36, 0x48, - 0x8c, 0xce, 0x40, 0x3d, 0x78, 0x47, 0xff, 0x80, 0x1c, 0xbd, 0x4d, 0xdb, 0x49, 0x6d, 0x80, 0x79, + 0x8c, 0xce, 0x40, 0xbd, 0x78, 0x46, 0xff, 0x80, 0x1c, 0xbd, 0x4d, 0xdb, 0x49, 0x6d, 0x80, 0x79, 0x85, 0x99, 0x36, 0x12, 0xe3, 0xc5, 0x9b, 0x37, 0x13, 0xfe, 0x85, 0xbf, 0x84, 0x78, 0x22, 0xf1, 0xe2, 0x49, 0x0d, 0xf8, 0x43, 0x4c, 0xdb, 0x81, 0x18, 0x34, 0xf1, 0xa2, 0xa7, 0xbe, 0xce, 0x7b, 0xdf, 0xf7, 0xde, 0xf7, 0xbe, 0x87, 0x6b, 0x3c, 0x19, 0x81, 0xa4, 0x09, 0x97, 0x2a, 0x14, 0x01, @@ -174,7 +174,7 @@ var fileDescriptor_e31744b0ce27e85a = []byte{ 0x39, 0x57, 0xd7, 0xd2, 0x0b, 0xed, 0xf0, 0x65, 0xef, 0x78, 0xbe, 0xb4, 0xd1, 0x62, 0x69, 0xa3, 0xe7, 0xa5, 0x8d, 0x6e, 0x56, 0xb6, 0xb1, 0x58, 0xd9, 0xc6, 0xc3, 0xca, 0x36, 0x4e, 0x77, 0xdf, 0x28, 0xcc, 0x99, 0x34, 0x5f, 0xf7, 0x90, 0x9e, 0x6f, 0x58, 0x33, 0xa5, 0x6e, 0x29, 0xbb, 0xb0, - 0x83, 0xd7, 0x00, 0x00, 0x00, 0xff, 0xff, 0x51, 0x6d, 0xdd, 0x49, 0xe7, 0x02, 0x00, 0x00, + 0x83, 0xd7, 0x00, 0x00, 0x00, 0xff, 0xff, 0x4e, 0x02, 0x86, 0xab, 0xe7, 0x02, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/vesting/types/schedule.go b/x/vesting/types/schedule.go index 066ce11d07..44c47d88ef 100644 --- a/x/vesting/types/schedule.go +++ b/x/vesting/types/schedule.go @@ -8,7 +8,7 @@ import ( sdkvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" ) -// ReadSchedule returns the value of a schedule at readTime. +// ReadSchedule returns the coins of a schedule at readTime. // // A "schedule" is an increasing step function of Coins over time. It's // specified as an absolute start time and a sequence of relative periods, with diff --git a/x/vesting/types/tx.pb.go b/x/vesting/types/tx.pb.go index 7f80dbe246..8e395dd1d5 100644 --- a/x/vesting/types/tx.pb.go +++ b/x/vesting/types/tx.pb.go @@ -583,7 +583,7 @@ var fileDescriptor_a372bb0b868e4c86 = []byte{ // 848 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x55, 0xbf, 0x6f, 0x23, 0x45, 0x14, 0xf6, 0x9c, 0xb9, 0x53, 0x6e, 0xcc, 0x85, 0x63, 0xcd, 0x81, 0x6f, 0x75, 0xd9, 0x35, 0x16, - 0x51, 0x7c, 0x26, 0xec, 0x9c, 0xcd, 0x09, 0x74, 0x11, 0x4d, 0x6c, 0x14, 0x2a, 0x4b, 0xc8, 0x02, + 0x51, 0x7c, 0x26, 0xec, 0x9c, 0xcd, 0x09, 0x71, 0x11, 0x4d, 0x6c, 0x14, 0x2a, 0x4b, 0xc8, 0x02, 0x0a, 0x1a, 0x6b, 0xbc, 0x3b, 0xd9, 0xac, 0x62, 0xef, 0xac, 0x3c, 0xb3, 0x6b, 0xd3, 0xa6, 0x42, 0x54, 0x91, 0x10, 0x3d, 0x14, 0x34, 0x20, 0x24, 0x7a, 0xfe, 0x00, 0x22, 0xaa, 0x48, 0x34, 0xd0, 0x10, 0x94, 0x20, 0xc1, 0x9f, 0x81, 0xe6, 0xc7, 0x6e, 0x82, 0x33, 0x24, 0x4e, 0x01, 0x95, 0xbd, @@ -633,7 +633,7 @@ var fileDescriptor_a372bb0b868e4c86 = []byte{ 0x42, 0x2a, 0xdf, 0xc5, 0x82, 0x76, 0xdf, 0x3d, 0x3a, 0x75, 0xc0, 0xf1, 0xa9, 0x03, 0x7e, 0x3f, 0x75, 0xc0, 0xe1, 0x99, 0x53, 0x3a, 0x3e, 0x73, 0x4a, 0xbf, 0x9c, 0x39, 0xa5, 0x8f, 0x5b, 0x17, 0xb6, 0x99, 0x8a, 0xa8, 0xe3, 0xb6, 0xdf, 0x46, 0xf3, 0x7f, 0x3e, 0x14, 0xa3, 0x3b, 0xf2, 0x45, - 0x7d, 0xf3, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0xa6, 0x7f, 0x99, 0x81, 0xaa, 0x09, 0x00, 0x00, + 0x7d, 0xf3, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb9, 0x10, 0xc2, 0x63, 0xaa, 0x09, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/vesting/types/vesting.pb.go b/x/vesting/types/vesting.pb.go index 7a4ef8b5ef..7548fc2874 100644 --- a/x/vesting/types/vesting.pb.go +++ b/x/vesting/types/vesting.pb.go @@ -165,38 +165,38 @@ func init() { func init() { proto.RegisterFile("evmos/vesting/v2/vesting.proto", fileDescriptor_0001d894a8ee0c72) } var fileDescriptor_0001d894a8ee0c72 = []byte{ - // 488 bytes of a gzipped FileDescriptorProto + // 487 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x53, 0x3f, 0x6f, 0xd3, 0x40, 0x14, 0xf7, 0x11, 0x17, 0x9a, 0x8b, 0x1a, 0xaa, 0x23, 0x42, 0x56, 0x06, 0x3b, 0xaa, 0x40, 0x8a, - 0x2a, 0xe1, 0x53, 0xc2, 0x80, 0xe8, 0x16, 0x97, 0x0f, 0x50, 0x59, 0x88, 0x81, 0xc5, 0x3a, 0xdb, - 0x57, 0xd7, 0x8a, 0x93, 0xb3, 0x7c, 0xe7, 0x50, 0xbe, 0x41, 0xd5, 0xa9, 0x23, 0x12, 0x4b, 0x66, - 0x3e, 0x49, 0xc7, 0x8c, 0x4c, 0x2d, 0x4a, 0x16, 0x3e, 0x06, 0xf2, 0xfd, 0x29, 0x89, 0x10, 0x6b, - 0xa7, 0x7b, 0xef, 0xf7, 0xfe, 0xdc, 0xef, 0xbd, 0xdf, 0x1d, 0x74, 0xe9, 0x62, 0xc6, 0x38, 0x5e, - 0x50, 0x2e, 0xf2, 0x79, 0x86, 0x17, 0x63, 0x63, 0xfa, 0x65, 0xc5, 0x04, 0x43, 0x87, 0x32, 0xee, - 0x1b, 0x70, 0x31, 0xee, 0xbf, 0x4a, 0x18, 0xdf, 0x29, 0x19, 0xc5, 0x54, 0x90, 0xd1, 0x6e, 0x5d, - 0xbf, 0x97, 0xb1, 0x8c, 0x49, 0x13, 0x37, 0x96, 0x46, 0xbd, 0x8c, 0xb1, 0xac, 0xa0, 0x58, 0x7a, - 0x71, 0x7d, 0x8e, 0x45, 0x3e, 0xa3, 0x5c, 0x90, 0x59, 0xa9, 0x12, 0x8e, 0xae, 0x6d, 0xf8, 0xf2, - 0xb4, 0x20, 0x5f, 0x62, 0x92, 0x4c, 0x3f, 0xa9, 0x86, 0x93, 0x24, 0x61, 0xf5, 0x5c, 0xa0, 0x18, - 0xf6, 0x62, 0xc2, 0x69, 0xa4, 0xef, 0x89, 0x88, 0xc2, 0x1d, 0x30, 0x00, 0xc3, 0xce, 0xf8, 0xd8, - 0x57, 0xb4, 0xfe, 0x32, 0x55, 0xb4, 0xfc, 0x80, 0x70, 0xba, 0xdb, 0x29, 0xb0, 0x57, 0x77, 0x1e, - 0x08, 0x51, 0xfc, 0x4f, 0x04, 0xbd, 0x86, 0xdd, 0xf3, 0x7a, 0x9e, 0xd2, 0x2a, 0x22, 0x69, 0x5a, - 0x51, 0xce, 0x9d, 0x27, 0x03, 0x30, 0x6c, 0x87, 0x07, 0x0a, 0x9d, 0x28, 0x10, 0x9d, 0x42, 0xc8, - 0x05, 0xa9, 0x44, 0xd4, 0xd0, 0x77, 0x5a, 0x92, 0x40, 0xdf, 0x57, 0xb3, 0xf9, 0x66, 0x36, 0xff, - 0xa3, 0x99, 0x2d, 0xd8, 0xbf, 0xbd, 0xf3, 0xac, 0x9b, 0x7b, 0x0f, 0x84, 0x6d, 0x59, 0xd7, 0x44, - 0xd0, 0x15, 0x80, 0xdd, 0x82, 0x25, 0xd3, 0xba, 0x8c, 0x4a, 0x5a, 0xe5, 0x2c, 0xe5, 0x8e, 0x3d, - 0x68, 0x0d, 0x3b, 0x63, 0xf7, 0x7f, 0xa3, 0x9c, 0xc9, 0xb4, 0x60, 0xd2, 0x74, 0xfb, 0x71, 0xef, - 0xbd, 0xcf, 0x72, 0x71, 0x51, 0xc7, 0x7e, 0xc2, 0x66, 0x58, 0x6b, 0xa2, 0x8e, 0x37, 0x3c, 0x9d, - 0xe2, 0x4b, 0x4c, 0x6a, 0x71, 0xf1, 0xa0, 0x92, 0xf8, 0x5a, 0x52, 0xae, 0x3b, 0xf0, 0xf0, 0x40, - 0x5d, 0xac, 0x5d, 0x74, 0x0d, 0xe0, 0x73, 0xb3, 0x56, 0xc3, 0x65, 0xef, 0xb1, 0xb8, 0x74, 0x35, - 0xac, 0xfd, 0x93, 0xfd, 0xab, 0xa5, 0x67, 0x7d, 0x5b, 0x7a, 0xd6, 0xd1, 0x77, 0x00, 0x0f, 0xcd, - 0x63, 0x38, 0xab, 0x58, 0xc9, 0x38, 0x29, 0x50, 0x0f, 0xee, 0x89, 0x5c, 0x14, 0x54, 0xea, 0xde, - 0x0e, 0x95, 0x83, 0x06, 0xb0, 0x93, 0x52, 0x9e, 0x54, 0x79, 0x29, 0x72, 0x36, 0xd7, 0xaa, 0x6d, - 0x43, 0xc8, 0x81, 0xcf, 0x8c, 0xa6, 0x2d, 0x19, 0x35, 0x2e, 0xc2, 0xf0, 0x45, 0x2a, 0x29, 0x90, - 0x26, 0xf1, 0x41, 0x79, 0x5b, 0x66, 0xa1, 0xad, 0x90, 0x96, 0xff, 0xc4, 0xfe, 0xbd, 0xf4, 0xac, - 0xe0, 0xc3, 0xed, 0xda, 0x05, 0xab, 0xb5, 0x0b, 0x7e, 0xad, 0x5d, 0x70, 0xb3, 0x71, 0xad, 0xd5, - 0xc6, 0xb5, 0x7e, 0x6e, 0x5c, 0xeb, 0xf3, 0xf1, 0xd6, 0x32, 0xd4, 0xf7, 0xd2, 0x9f, 0x6c, 0xf4, - 0x0e, 0x5f, 0xee, 0x6e, 0x21, 0x7e, 0x2a, 0x9f, 0xcb, 0xdb, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, - 0xf4, 0x1a, 0xa0, 0x79, 0x88, 0x03, 0x00, 0x00, + 0x2a, 0xe1, 0x53, 0xc2, 0x02, 0xdd, 0xe2, 0xf2, 0x01, 0x2a, 0x0b, 0x31, 0xb0, 0x58, 0x67, 0xfb, + 0xea, 0x5a, 0x71, 0x72, 0x96, 0xef, 0x1c, 0xca, 0x37, 0xa8, 0x3a, 0x75, 0x44, 0x62, 0xc9, 0xcc, + 0x27, 0xe9, 0x98, 0x91, 0xa9, 0x45, 0xc9, 0xc2, 0xc7, 0x40, 0xbe, 0x3f, 0x25, 0x11, 0x62, 0xed, + 0x74, 0xef, 0xfd, 0xde, 0x9f, 0xfb, 0xbd, 0xf7, 0xbb, 0x83, 0x2e, 0x5d, 0xcc, 0x18, 0xc7, 0x0b, + 0xca, 0x45, 0x3e, 0xcf, 0xf0, 0x62, 0x6c, 0x4c, 0xbf, 0xac, 0x98, 0x60, 0xe8, 0x50, 0xc6, 0x7d, + 0x03, 0x2e, 0xc6, 0xfd, 0x57, 0x09, 0xe3, 0x3b, 0x25, 0xa3, 0x98, 0x0a, 0x32, 0xda, 0xad, 0xeb, + 0xf7, 0x32, 0x96, 0x31, 0x69, 0xe2, 0xc6, 0xd2, 0xa8, 0x97, 0x31, 0x96, 0x15, 0x14, 0x4b, 0x2f, + 0xae, 0xcf, 0xb1, 0xc8, 0x67, 0x94, 0x0b, 0x32, 0x2b, 0x55, 0xc2, 0xd1, 0xb5, 0x0d, 0x5f, 0x9e, + 0x16, 0xe4, 0x4b, 0x4c, 0x92, 0xe9, 0x27, 0xd5, 0x70, 0x92, 0x24, 0xac, 0x9e, 0x0b, 0x14, 0xc3, + 0x5e, 0x4c, 0x38, 0x8d, 0xf4, 0x3d, 0x11, 0x51, 0xb8, 0x03, 0x06, 0x60, 0xd8, 0x19, 0x1f, 0xfb, + 0x8a, 0xd6, 0x5f, 0xa6, 0x8a, 0x96, 0x1f, 0x10, 0x4e, 0x77, 0x3b, 0x05, 0xf6, 0xea, 0xce, 0x03, + 0x21, 0x8a, 0xff, 0x89, 0xa0, 0xd7, 0xb0, 0x7b, 0x5e, 0xcf, 0x53, 0x5a, 0x45, 0x24, 0x4d, 0x2b, + 0xca, 0xb9, 0xf3, 0x64, 0x00, 0x86, 0xed, 0xf0, 0x40, 0xa1, 0x13, 0x05, 0xa2, 0x53, 0x08, 0xb9, + 0x20, 0x95, 0x88, 0x1a, 0xfa, 0x4e, 0x4b, 0x12, 0xe8, 0xfb, 0x6a, 0x36, 0xdf, 0xcc, 0xe6, 0x7f, + 0x34, 0xb3, 0x05, 0xfb, 0xb7, 0x77, 0x9e, 0x75, 0x73, 0xef, 0x81, 0xb0, 0x2d, 0xeb, 0x9a, 0x08, + 0xba, 0x02, 0xb0, 0x5b, 0xb0, 0x64, 0x5a, 0x97, 0x51, 0x49, 0xab, 0x9c, 0xa5, 0xdc, 0xb1, 0x07, + 0xad, 0x61, 0x67, 0xec, 0xfe, 0x6f, 0x94, 0x33, 0x99, 0x16, 0x4c, 0x9a, 0x6e, 0x3f, 0xee, 0xbd, + 0xf7, 0x59, 0x2e, 0x2e, 0xea, 0xd8, 0x4f, 0xd8, 0x0c, 0x6b, 0x4d, 0xd4, 0xf1, 0x86, 0xa7, 0x53, + 0x7c, 0x89, 0x49, 0x2d, 0x2e, 0x1e, 0x54, 0x12, 0x5f, 0x4b, 0xca, 0x75, 0x07, 0x1e, 0x1e, 0xa8, + 0x8b, 0xb5, 0x8b, 0xae, 0x01, 0x7c, 0x6e, 0xd6, 0x6a, 0xb8, 0xec, 0x3d, 0x16, 0x97, 0xae, 0x86, + 0xb5, 0x7f, 0xb2, 0x7f, 0xb5, 0xf4, 0xac, 0x6f, 0x4b, 0xcf, 0x3a, 0xfa, 0x0e, 0xe0, 0xa1, 0x79, + 0x0c, 0x67, 0x15, 0x2b, 0x19, 0x27, 0x05, 0xea, 0xc1, 0x3d, 0x91, 0x8b, 0x82, 0x4a, 0xdd, 0xdb, + 0xa1, 0x72, 0xd0, 0x00, 0x76, 0x52, 0xca, 0x93, 0x2a, 0x2f, 0x45, 0xce, 0xe6, 0x5a, 0xb5, 0x6d, + 0x08, 0x39, 0xf0, 0x99, 0xd1, 0xb4, 0x25, 0xa3, 0xc6, 0x45, 0x18, 0xbe, 0x48, 0x25, 0x05, 0xd2, + 0x24, 0x3e, 0x28, 0x6f, 0xcb, 0x2c, 0xb4, 0x15, 0xd2, 0xf2, 0x9f, 0xd8, 0xbf, 0x97, 0x9e, 0x15, + 0x7c, 0xb8, 0x5d, 0xbb, 0x60, 0xb5, 0x76, 0xc1, 0xaf, 0xb5, 0x0b, 0x6e, 0x36, 0xae, 0xb5, 0xda, + 0xb8, 0xd6, 0xcf, 0x8d, 0x6b, 0x7d, 0x3e, 0xde, 0x5a, 0x86, 0xfa, 0x5e, 0xfa, 0x93, 0x8d, 0xde, + 0xe1, 0xcb, 0xdd, 0x2d, 0xc4, 0x4f, 0xe5, 0x73, 0x79, 0xfb, 0x27, 0x00, 0x00, 0xff, 0xff, 0xeb, + 0x75, 0xfb, 0x9b, 0x88, 0x03, 0x00, 0x00, } func (m *ClawbackVestingAccount) Marshal() (dAtA []byte, err error) { diff --git a/x/vesting/utils_test.go b/x/vesting/utils_test.go index c998f13757..aa37aefe2c 100644 --- a/x/vesting/utils_test.go +++ b/x/vesting/utils_test.go @@ -16,13 +16,13 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/common" - evmosapp "github.com/evmos/evmos/v17/app" - cmn "github.com/evmos/evmos/v17/precompiles/common" - evmosutil "github.com/evmos/evmos/v17/testutil" - testutiltx "github.com/evmos/evmos/v17/testutil/tx" - evmostypes "github.com/evmos/evmos/v17/types" - "github.com/evmos/evmos/v17/utils" - evmtypes "github.com/evmos/evmos/v17/x/evm/types" + evmosapp "github.com/evmos/evmos/v18/app" + cmn "github.com/evmos/evmos/v18/precompiles/common" + evmosutil "github.com/evmos/evmos/v18/testutil" + testutiltx "github.com/evmos/evmos/v18/testutil/tx" + evmostypes "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v18/utils" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) // SetupWithGenesisValSet initializes a new EvmosApp with a validator set and genesis accounts From d0ddd88b9ecbc7777f440aeb5feeb468148868e0 Mon Sep 17 00:00:00 2001 From: Ramiro Carlucho Date: Tue, 23 Apr 2024 10:36:34 -0300 Subject: [PATCH 214/345] imp(evm): Add evm hook logic again (#2501) * re add evm hooks * add changelog --------- Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- CHANGELOG.md | 1 + app/app.go | 4 ++ x/evm/keeper/hooks.go | 31 +++++++++++ x/evm/keeper/hooks_test.go | 90 ++++++++++++++++++++++++++++++++ x/evm/keeper/keeper.go | 33 ++++++++++++ x/evm/keeper/state_transition.go | 73 ++++++++++++++++++++++---- x/evm/types/errors.go | 2 + x/evm/types/interfaces.go | 12 ++++- 8 files changed, 235 insertions(+), 11 deletions(-) create mode 100644 x/evm/keeper/hooks.go create mode 100644 x/evm/keeper/hooks_test.go diff --git a/CHANGELOG.md b/CHANGELOG.md index a2c8bdfa16..af468398dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,6 +49,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (deps) [#2355](https://github.com/evmos/evmos/pull/2355) Bump Cosmos-SDK to v0.47.8-evmos. - (revenue) [#2379](https://github.com/evmos/evmos/pull/2379) Remove `x/revenue` module. - (evm) [#2380](https://github.com/evmos/evmos/pull/2380) Remove EVM hooks from app and EVM module. +- (evm) [#2501](https://github.com/evmos/evmos/pull/2501) Revert deletion from EVM hooks (#2380) ### Bug Fixes diff --git a/app/app.go b/app/app.go index 83232fe893..f5d220001e 100644 --- a/app/app.go +++ b/app/app.go @@ -527,6 +527,10 @@ func NewEvmos( ), ) + app.EvmKeeper = app.EvmKeeper.SetHooks( + evmkeeper.NewMultiEvmHooks(), + ) + // Override the ICS20 app module transferModule := transfer.NewAppModule(app.TransferKeeper) diff --git a/x/evm/keeper/hooks.go b/x/evm/keeper/hooks.go new file mode 100644 index 0000000000..80a5f780e2 --- /dev/null +++ b/x/evm/keeper/hooks.go @@ -0,0 +1,31 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) +package keeper + +import ( + errorsmod "cosmossdk.io/errors" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/core" + ethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/evmos/evmos/v18/x/evm/types" +) + +var _ types.EvmHooks = MultiEvmHooks{} + +// MultiEvmHooks combine multiple evm hooks, all hook functions are run in array sequence +type MultiEvmHooks []types.EvmHooks + +// NewMultiEvmHooks combine multiple evm hooks +func NewMultiEvmHooks(hooks ...types.EvmHooks) MultiEvmHooks { + return hooks +} + +// PostTxProcessing delegate the call to underlying hooks +func (mh MultiEvmHooks) PostTxProcessing(ctx sdk.Context, msg core.Message, receipt *ethtypes.Receipt) error { + for i := range mh { + if err := mh[i].PostTxProcessing(ctx, msg, receipt); err != nil { + return errorsmod.Wrapf(err, "EVM hook %T failed", mh[i]) + } + } + return nil +} diff --git a/x/evm/keeper/hooks_test.go b/x/evm/keeper/hooks_test.go new file mode 100644 index 0000000000..900e971541 --- /dev/null +++ b/x/evm/keeper/hooks_test.go @@ -0,0 +1,90 @@ +package keeper_test + +import ( + "errors" + "math/big" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + ethtypes "github.com/ethereum/go-ethereum/core/types" + + "github.com/evmos/evmos/v18/x/evm/keeper" + "github.com/evmos/evmos/v18/x/evm/statedb" + "github.com/evmos/evmos/v18/x/evm/types" +) + +// LogRecordHook records all the logs +type LogRecordHook struct { + Logs []*ethtypes.Log +} + +func (dh *LogRecordHook) PostTxProcessing(_ sdk.Context, _ core.Message, receipt *ethtypes.Receipt) error { + dh.Logs = receipt.Logs + return nil +} + +// FailureHook always fail +type FailureHook struct{} + +func (dh FailureHook) PostTxProcessing(_ sdk.Context, _ core.Message, _ *ethtypes.Receipt) error { + return errors.New("post tx processing failed") +} + +func (suite *KeeperTestSuite) TestEvmHooks() { + testCases := []struct { + msg string + setupHook func() types.EvmHooks + expFunc func(hook types.EvmHooks, result error) + }{ + { + "log collect hook", + func() types.EvmHooks { + return &LogRecordHook{} + }, + func(hook types.EvmHooks, result error) { + suite.Require().NoError(result) + suite.Require().Equal(1, len((hook.(*LogRecordHook).Logs))) + }, + }, + { + "always fail hook", + func() types.EvmHooks { + return &FailureHook{} + }, + func(_ types.EvmHooks, result error) { + suite.Require().Error(result) + }, + }, + } + + for _, tc := range testCases { + suite.SetupTest() + suite.app.EvmKeeper = suite.app.EvmKeeper.CleanHooks() + hook := tc.setupHook() + suite.app.EvmKeeper.SetHooks(keeper.NewMultiEvmHooks(hook)) + + k := suite.app.EvmKeeper + ctx := suite.ctx + txHash := common.BigToHash(big.NewInt(1)) + vmdb := statedb.New(ctx, k, statedb.NewTxConfig( + common.BytesToHash(ctx.HeaderHash().Bytes()), + txHash, + 0, + 0, + )) + + vmdb.AddLog(ðtypes.Log{ + Topics: []common.Hash{}, + Address: suite.address, + }) + logs := vmdb.Logs() + receipt := ðtypes.Receipt{ + TxHash: txHash, + Logs: logs, + } + result := k.PostTxProcessing(ctx, ethtypes.Message{}, receipt) + + tc.expFunc(hook, result) + } +} diff --git a/x/evm/keeper/keeper.go b/x/evm/keeper/keeper.go index d349d03c10..7cafb0d4aa 100644 --- a/x/evm/keeper/keeper.go +++ b/x/evm/keeper/keeper.go @@ -55,6 +55,9 @@ type Keeper struct { // Tracer used to collect execution traces from the EVM transaction execution tracer string + // EVM Hooks for tx post-processing + hooks types.EvmHooks + // Legacy subspace ss paramstypes.Subspace @@ -349,3 +352,33 @@ func (k Keeper) AddTransientGasUsed(ctx sdk.Context, gasUsed uint64) (uint64, er k.SetTransientGasUsed(ctx, result) return result, nil } + +// ---------------------------------------------------------------------------- +// Hooks +// ---------------------------------------------------------------------------- + +// SetHooks sets the hooks for the EVM module +// It should be called only once during initialization, it panic if called more than once. +func (k *Keeper) SetHooks(eh types.EvmHooks) *Keeper { + if k.hooks != nil { + panic("cannot set evm hooks twice") + } + + k.hooks = eh + return k +} + +// CleanHooks resets the hooks for the EVM module +// NOTE: Should only be used for testing purposes +func (k *Keeper) CleanHooks() *Keeper { + k.hooks = nil + return k +} + +// PostTxProcessing delegate the call to the hooks. If no hook has been registered, this function returns with a `nil` error +func (k *Keeper) PostTxProcessing(ctx sdk.Context, msg core.Message, receipt *ethtypes.Receipt) error { + if k.hooks == nil { + return nil + } + return k.hooks.PostTxProcessing(ctx, msg, receipt) +} diff --git a/x/evm/keeper/state_transition.go b/x/evm/keeper/state_transition.go index 7722810c90..26f4aff2eb 100644 --- a/x/evm/keeper/state_transition.go +++ b/x/evm/keeper/state_transition.go @@ -20,6 +20,7 @@ import ( "github.com/ethereum/go-ethereum/core" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/params" ) @@ -134,7 +135,10 @@ func (k Keeper) GetHashFn(ctx sdk.Context) vm.GetHashFunc { // // For relevant discussion see: https://github.com/cosmos/cosmos-sdk/discussions/9072 func (k *Keeper) ApplyTransaction(ctx sdk.Context, tx *ethtypes.Transaction) (*types.MsgEthereumTxResponse, error) { - var bloom *big.Int + var ( + bloom *big.Int + bloomReceipt ethtypes.Bloom + ) cfg, err := k.EVMConfig(ctx, sdk.ConsAddress(ctx.BlockHeader().ProposerAddress), k.eip155ChainID) if err != nil { @@ -149,17 +153,23 @@ func (k *Keeper) ApplyTransaction(ctx sdk.Context, tx *ethtypes.Transaction) (*t return nil, errorsmod.Wrap(err, "failed to return ethereum transaction as core message") } - // Create a cache context to revert state. The cache context is only committed when both tx and hooks executed successfully. - // Didn't use `Snapshot` because the context stack has exponential complexity on certain operations, - // thus restricted to be used only inside `ApplyMessage`. - tmpCtx, commit := ctx.CacheContext() + // snapshot to contain the tx processing and post processing in same scope + var commit func() + tmpCtx := ctx + if k.hooks != nil { + // Create a cache context to revert state when tx hooks fails, + // the cache context is only committed when both tx and hooks executed successfully. + // Didn't use `Snapshot` because the context stack has exponential complexity on certain operations, + // thus restricted to be used only inside `ApplyMessage`. + tmpCtx, commit = ctx.CacheContext() + } // pass true to commit the StateDB res, err := k.ApplyMessageWithConfig(tmpCtx, msg, nil, true, cfg, txConfig) if err != nil { // when a transaction contains multiple msg, as long as one of the msg fails // all gas will be deducted. so is not msg.Gas() - k.ResetGasMeterAndConsumeGas(tmpCtx, tmpCtx.GasMeter().Limit()) + k.ResetGasMeterAndConsumeGas(ctx, ctx.GasMeter().Limit()) return nil, errorsmod.Wrap(err, "failed to apply ethereum core message") } @@ -169,11 +179,54 @@ func (k *Keeper) ApplyTransaction(ctx sdk.Context, tx *ethtypes.Transaction) (*t if len(logs) > 0 { bloom = k.GetBlockBloomTransient(ctx) bloom.Or(bloom, big.NewInt(0).SetBytes(ethtypes.LogsBloom(logs))) + bloomReceipt = ethtypes.BytesToBloom(bloom.Bytes()) + } + + cumulativeGasUsed := res.GasUsed + if ctx.BlockGasMeter() != nil { + limit := ctx.BlockGasMeter().Limit() + cumulativeGasUsed += ctx.BlockGasMeter().GasConsumed() + if cumulativeGasUsed > limit { + cumulativeGasUsed = limit + } + } + + var contractAddr common.Address + if msg.To() == nil { + contractAddr = crypto.CreateAddress(msg.From(), msg.Nonce()) + } + + receipt := ðtypes.Receipt{ + Type: tx.Type(), + PostState: nil, // TODO: intermediate state root + CumulativeGasUsed: cumulativeGasUsed, + Bloom: bloomReceipt, + Logs: logs, + TxHash: txConfig.TxHash, + ContractAddress: contractAddr, + GasUsed: res.GasUsed, + BlockHash: txConfig.BlockHash, + BlockNumber: big.NewInt(ctx.BlockHeight()), + TransactionIndex: txConfig.TxIndex, } if !res.Failed() { - commit() - ctx.EventManager().EmitEvents(tmpCtx.EventManager().Events()) + receipt.Status = ethtypes.ReceiptStatusSuccessful + // Only call hooks if tx executed successfully. + if err = k.PostTxProcessing(tmpCtx, msg, receipt); err != nil { + // If hooks return error, revert the whole tx. + res.VmError = types.ErrPostTxProcessing.Error() + k.Logger(ctx).Error("tx post processing failed", "error", err) + + // If the tx failed in post processing hooks, we should clear the logs + res.Logs = nil + } else if commit != nil { + // PostTxProcessing is successful, commit the tmpCtx + commit() + // Since the post-processing can alter the log, we need to update the result + res.Logs = types.NewLogsFromEth(receipt.Logs) + ctx.EventManager().EmitEvents(tmpCtx.EventManager().Events()) + } } // refund gas in order to match the Ethereum gas consumption instead of the default SDK one. @@ -181,9 +234,9 @@ func (k *Keeper) ApplyTransaction(ctx sdk.Context, tx *ethtypes.Transaction) (*t return nil, errorsmod.Wrapf(err, "failed to refund gas leftover gas to sender %s", msg.From()) } - if len(logs) > 0 { + if len(receipt.Logs) > 0 { // Update transient block bloom filter - k.SetBlockBloomTransient(ctx, bloom) + k.SetBlockBloomTransient(ctx, receipt.Bloom.Big()) k.SetLogSizeTransient(ctx, uint64(txConfig.LogIndex)+uint64(len(logs))) } diff --git a/x/evm/types/errors.go b/x/evm/types/errors.go index a019a2cbd4..0baf612dc8 100644 --- a/x/evm/types/errors.go +++ b/x/evm/types/errors.go @@ -32,6 +32,8 @@ const ( codeErrInactivePrecompile ) +var ErrPostTxProcessing = errors.New("failed to execute post processing") + var ( // ErrInvalidState returns an error resulting from an invalid Storage State. ErrInvalidState = errorsmod.Register(ModuleName, codeErrInvalidState, "invalid storage state") diff --git a/x/evm/types/interfaces.go b/x/evm/types/interfaces.go index 09082f9039..c229cea9c3 100644 --- a/x/evm/types/interfaces.go +++ b/x/evm/types/interfaces.go @@ -6,11 +6,12 @@ import ( "math/big" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" + "github.com/ethereum/go-ethereum/core" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - + ethtypes "github.com/ethereum/go-ethereum/core/types" feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" ) @@ -50,6 +51,15 @@ type FeeMarketKeeper interface { CalculateBaseFee(ctx sdk.Context) *big.Int } +// Event Hooks +// These can be utilized to customize evm transaction processing. + +// EvmHooks event hooks for evm tx processing +type EvmHooks interface { + // Must be called after tx is processed successfully, if return an error, the whole transaction is reverted. + PostTxProcessing(ctx sdk.Context, msg core.Message, receipt *ethtypes.Receipt) error +} + type ( LegacyParams = paramtypes.ParamSet // Subspace defines an interface that implements the legacy Cosmos SDK x/params Subspace type. From 994f54da651a213a637f6f39ddfc551dfcd30252 Mon Sep 17 00:00:00 2001 From: Ramiro Carlucho Date: Tue, 23 Apr 2024 15:48:10 -0300 Subject: [PATCH 215/345] chore(erc20): re-add deleted erc20 evm hooks (#2502) * re-add deleted erc20 evm hooks * changelog --- CHANGELOG.md | 1 + app/app.go | 4 +- x/erc20/keeper/evm_hooks.go | 166 ++++++++++++ x/erc20/keeper/evm_hooks_test.go | 431 +++++++++++++++++++++++++++++++ x/erc20/types/events.go | 3 + 5 files changed, 604 insertions(+), 1 deletion(-) create mode 100644 x/erc20/keeper/evm_hooks.go create mode 100644 x/erc20/keeper/evm_hooks_test.go diff --git a/CHANGELOG.md b/CHANGELOG.md index af468398dc..43b96a61a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -50,6 +50,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (revenue) [#2379](https://github.com/evmos/evmos/pull/2379) Remove `x/revenue` module. - (evm) [#2380](https://github.com/evmos/evmos/pull/2380) Remove EVM hooks from app and EVM module. - (evm) [#2501](https://github.com/evmos/evmos/pull/2501) Revert deletion from EVM hooks (#2380) +- (erc20) [#2502](https://github.com/evmos/evmos/pull/2502) Revert deletion from EVM hooks (#2154) (#2442) ### Bug Fixes diff --git a/app/app.go b/app/app.go index f5d220001e..67db9786bf 100644 --- a/app/app.go +++ b/app/app.go @@ -528,7 +528,9 @@ func NewEvmos( ) app.EvmKeeper = app.EvmKeeper.SetHooks( - evmkeeper.NewMultiEvmHooks(), + evmkeeper.NewMultiEvmHooks( + app.Erc20Keeper.Hooks(), + ), ) // Override the ICS20 app module diff --git a/x/erc20/keeper/evm_hooks.go b/x/erc20/keeper/evm_hooks.go new file mode 100644 index 0000000000..4457c0cdd0 --- /dev/null +++ b/x/erc20/keeper/evm_hooks.go @@ -0,0 +1,166 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package keeper + +import ( + "bytes" + "math/big" + + "cosmossdk.io/math" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + ethtypes "github.com/ethereum/go-ethereum/core/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" + + "github.com/evmos/evmos/v18/contracts" + "github.com/evmos/evmos/v18/x/erc20/types" +) + +var _ evmtypes.EvmHooks = Hooks{} + +// Hooks wrapper struct for erc20 keeper +type Hooks struct { + k Keeper +} + +// Return the wrapper struct +func (k Keeper) Hooks() Hooks { + return Hooks{k} +} + +// PostTxProcessing is a wrapper for calling the EVM PostTxProcessing hook on +// the module keeper +func (h Hooks) PostTxProcessing(ctx sdk.Context, msg core.Message, receipt *ethtypes.Receipt) error { + return h.k.PostTxProcessing(ctx, msg, receipt) +} + +// PostTxProcessing implements EvmHooks.PostTxProcessing. The EVM hooks allows +// users to convert ERC20s to Cosmos Coins by sending an Ethereum tx transfer to +// the module account address. This hook applies to both token pairs that have +// been registered through a native Cosmos coin or an ERC20 token. If token pair +// has been registered with: +// - coin -> burn tokens and transfer escrowed coins on module to sender +// - token -> escrow tokens on module account and mint & transfer coins to sender +// +// Note that the PostTxProcessing hook is only called by sending an EVM +// transaction that triggers `ApplyTransaction`. A cosmos tx with a +// `ConvertERC20` msg does not trigger the hook as it only calls `ApplyMessage`. +func (k Keeper) PostTxProcessing( + ctx sdk.Context, + _ core.Message, + receipt *ethtypes.Receipt, +) error { + params := k.GetParams(ctx) + if !params.EnableErc20 || !params.EnableEVMHook { + // no error is returned to avoid reverting the tx and allow for other post + // processing txs to pass and + return nil + } + + erc20 := contracts.ERC20MinterBurnerDecimalsContract.ABI + + for i, log := range receipt.Logs { + // Note: the `Transfer` event contains 3 topics (id, from, to) + if len(log.Topics) != 3 { + continue + } + + // Check if event is included in ERC20 + eventID := log.Topics[0] + event, err := erc20.EventByID(eventID) + if err != nil { + continue + } + + // Check if event is a `Transfer` event. + if event.Name != types.ERC20EventTransfer { + k.Logger(ctx).Info("emitted event", "name", event.Name, "signature", event.Sig) + continue + } + + transferEvent, err := erc20.Unpack(event.Name, log.Data) + if err != nil { + k.Logger(ctx).Error("failed to unpack transfer event", "error", err.Error()) + continue + } + + if len(transferEvent) == 0 { + continue + } + + tokens, ok := transferEvent[0].(*big.Int) + // safety check and ignore if amount not positive + if !ok || tokens == nil || tokens.Sign() != 1 { + continue + } + + // Check that the contract is a registered token pair + contractAddr := log.Address + id := k.GetERC20Map(ctx, contractAddr) + if len(id) == 0 { + continue + } + + pair, found := k.GetTokenPair(ctx, id) + if !found { + continue + } + + // Check if tokens are sent to module address + to := common.BytesToAddress(log.Topics[2].Bytes()) + if !bytes.Equal(to.Bytes(), types.ModuleAddress.Bytes()) { + continue + } + + // Check that conversion for the pair is enabled. Fail + if !pair.Enabled { + // continue to allow transfers for the ERC20 in case the token pair is + // disabled + k.Logger(ctx).Debug( + "ERC20 token -> Cosmos coin conversion is disabled for pair", + "coin", pair.Denom, "contract", pair.Erc20Address, + ) + continue + } + + // create the corresponding sdk.Coin that is paired with ERC20 + coins := sdk.Coins{{Denom: pair.Denom, Amount: math.NewIntFromBigInt(tokens)}} + + // Perform token conversion. We can now assume that the sender of a + // registered token wants to mint a Cosmos coin. + switch pair.ContractOwner { + case types.OWNER_MODULE: + _, err = k.CallEVM(ctx, erc20, types.ModuleAddress, contractAddr, true, "burn", tokens) + case types.OWNER_EXTERNAL: + err = k.bankKeeper.MintCoins(ctx, types.ModuleName, coins) + default: + err = types.ErrUndefinedOwner + } + + if err != nil { + k.Logger(ctx).Debug( + "failed to process EVM hook for ER20 -> coin conversion", + "coin", pair.Denom, "contract", pair.Erc20Address, "error", err.Error(), + ) + continue + } + + // Only need last 20 bytes from log.topics + from := common.BytesToAddress(log.Topics[1].Bytes()) + recipient := sdk.AccAddress(from.Bytes()) + + // transfer the tokens from ModuleAccount to sender address + if err := k.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, recipient, coins); err != nil { + k.Logger(ctx).Debug( + "failed to process EVM hook for ER20 -> coin conversion", + "tx-hash", receipt.TxHash.Hex(), "log-idx", i, + "coin", pair.Denom, "contract", pair.Erc20Address, "error", err.Error(), + ) + continue + } + } + + return nil +} diff --git a/x/erc20/keeper/evm_hooks_test.go b/x/erc20/keeper/evm_hooks_test.go new file mode 100644 index 0000000000..bfd4dd12a0 --- /dev/null +++ b/x/erc20/keeper/evm_hooks_test.go @@ -0,0 +1,431 @@ +package keeper_test + +import ( + "fmt" + "math/big" + + "cosmossdk.io/math" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/common" + ethtypes "github.com/ethereum/go-ethereum/core/types" + + "github.com/evmos/evmos/v18/contracts" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/x/erc20/types" +) + +// ensureHooksSet tries to set the hooks on EVMKeeper, this will fail if the erc20 hook is already set +func (suite *KeeperTestSuite) ensureHooksSet() { + // TODO: PR to Ethermint to add the functionality `GetHooks` or `areHooksSet` to avoid catching a panic + defer func() { + err := recover() + suite.Require().NotNil(err) + }() + suite.app.EvmKeeper.SetHooks(suite.app.Erc20Keeper.Hooks()) +} + +func (suite *KeeperTestSuite) TestEvmHooksRegisteredERC20() { + testCases := []struct { + name string + malleate func(common.Address) + result bool + }{ + { + "correct execution", + func(contractAddr common.Address) { + _, err := suite.app.Erc20Keeper.RegisterERC20(suite.ctx, contractAddr) + suite.Require().NoError(err) + + // Mint 10 tokens to suite.address (owner) + _ = suite.MintERC20Token(contractAddr, suite.address, suite.address, big.NewInt(10)) + suite.Commit() + + // Burn the 10 tokens of suite.address (owner) + _ = suite.TransferERC20TokenToModule(contractAddr, suite.address, big.NewInt(10)) + }, + true, + }, + { + "unregistered pair", + func(contractAddr common.Address) { + // Mint 10 tokens to suite.address (owner) + _ = suite.MintERC20Token(contractAddr, suite.address, suite.address, big.NewInt(10)) + suite.Commit() + + // Burn the 10 tokens of suite.address (owner) + _ = suite.TransferERC20TokenToModule(contractAddr, suite.address, big.NewInt(10)) + }, + false, + }, + { + "wrong event", + func(contractAddr common.Address) { + _, err := suite.app.Erc20Keeper.RegisterERC20(suite.ctx, contractAddr) + suite.Require().NoError(err) + + // Mint 10 tokens to suite.address (owner) + _ = suite.MintERC20Token(contractAddr, suite.address, suite.address, big.NewInt(10)) + }, + false, + }, + { + "Pair is disabled", + func(contractAddr common.Address) { + pair, err := suite.app.Erc20Keeper.RegisterERC20(suite.ctx, contractAddr) + suite.Require().NoError(err) + + pair.Enabled = false + suite.app.Erc20Keeper.SetTokenPair(suite.ctx, *pair) + // Mint 10 tokens to suite.address (owner) + _ = suite.MintERC20Token(contractAddr, suite.address, suite.address, big.NewInt(10)) + suite.Commit() + + // Burn the 10 tokens of suite.address (owner) + _ = suite.TransferERC20TokenToModule(contractAddr, suite.address, big.NewInt(10)) + }, + false, + }, + { + "Pair is incorrectly loaded", + func(contractAddr common.Address) { + pair, err := suite.app.Erc20Keeper.RegisterERC20(suite.ctx, contractAddr) + suite.Require().NoError(err) + + suite.app.Erc20Keeper.DeleteTokenPair(suite.ctx, *pair) + + suite.app.Erc20Keeper.SetDenomMap(suite.ctx, pair.Denom, pair.GetID()) + suite.app.Erc20Keeper.SetERC20Map(suite.ctx, pair.GetERC20Contract(), pair.GetID()) + // Mint 10 tokens to suite.address (owner) + _ = suite.MintERC20Token(contractAddr, suite.address, suite.address, big.NewInt(10)) + suite.Commit() + + // Burn the 10 tokens of suite.address (owner) + _ = suite.TransferERC20TokenToModule(contractAddr, suite.address, big.NewInt(10)) + }, + false, + }, + } + for _, tc := range testCases { + suite.Run(fmt.Sprintf("Case %s", tc.name), func() { + suite.mintFeeCollector = true + suite.SetupTest() + + suite.ensureHooksSet() + + contractAddr, err := suite.DeployContract("coin test erc20", "token", erc20Decimals) + suite.Require().NoError(err) + + tc.malleate(contractAddr) + + balance := suite.app.BankKeeper.GetBalance(suite.ctx, sdk.AccAddress(suite.address.Bytes()), types.CreateDenom(contractAddr.String())) + suite.Commit() + if tc.result { + // Check if the execution was successful + suite.Require().Equal(int64(10), balance.Amount.Int64()) + } else { + // Check that no changes were made to the account + suite.Require().Equal(int64(0), balance.Amount.Int64()) + } + }) + } + suite.mintFeeCollector = false +} + +func (suite *KeeperTestSuite) TestEvmHooksRegisteredCoin() { + testCases := []struct { + name string + mint int64 + burn int64 + reconvert int64 + + result bool + }{ + {"correct execution", 100, 10, 5, true}, + } + for _, tc := range testCases { + suite.Run(fmt.Sprintf("Case %s", tc.name), func() { + suite.mintFeeCollector = true + suite.SetupTest() + + suite.ensureHooksSet() + + pair := suite.setupRegisterCoin(metadataCoin) + suite.Require().NotNil(metadataCoin) + suite.Require().NotNil(pair) + + sender := sdk.AccAddress(suite.address.Bytes()) + contractAddr := common.HexToAddress(pair.Erc20Address) + + coins := sdk.NewCoins(sdk.NewCoin(cosmosTokenBase, math.NewInt(tc.mint))) + err := suite.app.BankKeeper.MintCoins(suite.ctx, types.ModuleName, coins) + suite.Require().NoError(err, tc.name) + err = suite.app.BankKeeper.SendCoinsFromModuleToAccount(suite.ctx, types.ModuleName, sender, coins) + suite.Require().NoError(err, tc.name) + + convertCoin := types.NewMsgConvertCoin( + sdk.NewCoin(cosmosTokenBase, math.NewInt(tc.burn)), + suite.address, + sender, + ) + + ctx := sdk.WrapSDKContext(suite.ctx) + _, err = suite.app.Erc20Keeper.ConvertCoin(ctx, convertCoin) + suite.Require().NoError(err, tc.name) + suite.Commit() + + balance := suite.BalanceOf(common.HexToAddress(pair.Erc20Address), suite.address) + cosmosBalance := suite.app.BankKeeper.GetBalance(suite.ctx, sender, metadataCoin.Base) + suite.Require().Equal(cosmosBalance.Amount.Int64(), math.NewInt(tc.mint-tc.burn).Int64()) + suite.Require().Equal(balance, big.NewInt(tc.burn)) + + // Burn the 10 tokens of suite.address (owner) + _ = suite.TransferERC20TokenToModule(contractAddr, suite.address, big.NewInt(tc.reconvert)) + + balance = suite.BalanceOf(common.HexToAddress(pair.Erc20Address), suite.address) + cosmosBalance = suite.app.BankKeeper.GetBalance(suite.ctx, sender, metadataCoin.Base) + + if tc.result { + suite.Require().Equal(balance, big.NewInt(tc.burn-tc.reconvert)) + // Check if the execution was successful + suite.Require().NoError(err) + suite.Require().Equal(cosmosBalance.Amount, math.NewInt(tc.mint-tc.burn+tc.reconvert)) + } else { + // Check that no changes were made to the account + suite.Require().Error(err) + suite.Require().Equal(cosmosBalance.Amount, math.NewInt(tc.mint-tc.burn)) + } + }) + } + suite.mintFeeCollector = false +} + +func (suite *KeeperTestSuite) TestPostTxProcessing() { + var ( + receipt *ethtypes.Receipt + pair *types.TokenPair + ) + + msg := ethtypes.NewMessage( + types.ModuleAddress, + &common.Address{}, + 0, + big.NewInt(0), // amount + uint64(0), // gasLimit + big.NewInt(0), // gasFeeCap + big.NewInt(0), // gasTipCap + big.NewInt(0), // gasPrice + []byte{}, + ethtypes.AccessList{}, // AccessList + true, // checkNonce + ) + + account := utiltx.GenerateAddress() + + transferData := []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} + transferData[31] = uint8(10) + erc20 := contracts.ERC20BurnableContract.ABI + + transferEvent := erc20.Events["Transfer"] + + testCases := []struct { + name string + malleate func() + expConversion bool + }{ + { + "Empty logs", + func() { + log := ethtypes.Log{} + receipt = ðtypes.Receipt{ + Logs: []*ethtypes.Log{&log}, + } + }, + false, + }, + { + "No log data", + func() { + topics := []common.Hash{transferEvent.ID, account.Hash(), types.ModuleAddress.Hash()} + log := ethtypes.Log{ + Topics: topics, + } + receipt = ðtypes.Receipt{ + Logs: []*ethtypes.Log{&log}, + } + }, + false, + }, + { + "Non recognized event", + func() { + topics := []common.Hash{{}, account.Hash(), account.Hash()} + log := ethtypes.Log{ + Topics: topics, + Data: transferData, + } + receipt = ðtypes.Receipt{ + Logs: []*ethtypes.Log{&log}, + } + }, + false, + }, + { + "Non transfer event", + func() { + aprovalEvent := erc20.Events["Approval"] + topics := []common.Hash{aprovalEvent.ID, account.Hash(), account.Hash()} + log := ethtypes.Log{ + Topics: topics, + Data: transferData, + } + receipt = ðtypes.Receipt{ + Logs: []*ethtypes.Log{&log}, + } + }, + false, + }, + { + "No log address", + func() { + topics := []common.Hash{transferEvent.ID, account.Hash(), types.ModuleAddress.Hash()} + log := ethtypes.Log{ + Topics: topics, + Data: transferData, + } + receipt = ðtypes.Receipt{ + Logs: []*ethtypes.Log{&log}, + } + }, + false, + }, + { + "No data on topic", + func() { + topics := []common.Hash{transferEvent.ID} + log := ethtypes.Log{ + Topics: topics, + Data: transferData, + } + receipt = ðtypes.Receipt{ + Logs: []*ethtypes.Log{&log}, + } + }, + false, + }, + { + "transfer to non-evm-module account", + func() { + contractAddr, err := suite.DeployContract("coin", "token", erc20Decimals) + suite.Require().NoError(err) + + _, err = suite.app.Erc20Keeper.RegisterERC20(suite.ctx, contractAddr) + suite.Require().NoError(err) + + topics := []common.Hash{transferEvent.ID, account.Hash(), account.Hash()} + log := ethtypes.Log{ + Topics: topics, + Data: transferData, + Address: contractAddr, + } + receipt = ðtypes.Receipt{ + Logs: []*ethtypes.Log{&log}, + } + }, + false, + }, + { + "correct burn", + func() { + contractAddr, err := suite.DeployContract("coin", "token", erc20Decimals) + suite.Require().NoError(err) + + pair, err = suite.app.Erc20Keeper.RegisterERC20(suite.ctx, contractAddr) + suite.Require().NoError(err) + + topics := []common.Hash{transferEvent.ID, account.Hash(), types.ModuleAddress.Hash()} + log := ethtypes.Log{ + Topics: topics, + Data: transferData, + Address: contractAddr, + } + receipt = ðtypes.Receipt{ + Logs: []*ethtypes.Log{&log}, + } + }, + true, + }, + { + "Unspecified Owner", + func() { + contractAddr, err := suite.DeployContract("coin", "token", erc20Decimals) + suite.Require().NoError(err) + + pair, err := suite.app.Erc20Keeper.RegisterERC20(suite.ctx, contractAddr) + suite.Require().NoError(err) + + pair.ContractOwner = types.OWNER_UNSPECIFIED + suite.app.Erc20Keeper.SetTokenPair(suite.ctx, *pair) + + topics := []common.Hash{transferEvent.ID, account.Hash(), types.ModuleAddress.Hash()} + log := ethtypes.Log{ + Topics: topics, + Data: transferData, + Address: contractAddr, + } + receipt = ðtypes.Receipt{ + Logs: []*ethtypes.Log{&log}, + } + }, + false, + }, + { + "Fail Evm", + func() { + contractAddr, err := suite.DeployContract("coin", "token", erc20Decimals) + suite.Require().NoError(err) + + pair, err := suite.app.Erc20Keeper.RegisterERC20(suite.ctx, contractAddr) + suite.Require().NoError(err) + + pair.ContractOwner = types.OWNER_MODULE + suite.app.Erc20Keeper.SetTokenPair(suite.ctx, *pair) + + topics := []common.Hash{transferEvent.ID, account.Hash(), types.ModuleAddress.Hash()} + log := ethtypes.Log{ + Topics: topics, + Data: transferData, + Address: contractAddr, + } + receipt = ðtypes.Receipt{ + Logs: []*ethtypes.Log{&log}, + } + }, + false, + }, + } + for _, tc := range testCases { + suite.Run(fmt.Sprintf("Case %s", tc.name), func() { + suite.mintFeeCollector = true + suite.SetupTest() + suite.ensureHooksSet() + suite.Commit() + + tc.malleate() + + err := suite.app.Erc20Keeper.Hooks().PostTxProcessing(suite.ctx, msg, receipt) + suite.Require().NoError(err) + + if tc.expConversion { + sender := sdk.AccAddress(account.Bytes()) + cosmosBalance := suite.app.BankKeeper.GetBalance(suite.ctx, sender, pair.Denom) + + transferEvent, err := erc20.Unpack("Transfer", transferData) + suite.Require().NoError(err) + + tokens, _ := transferEvent[0].(*big.Int) + suite.Require().Equal(cosmosBalance.Amount.String(), tokens.String()) + } + }) + } + suite.mintFeeCollector = false +} diff --git a/x/erc20/types/events.go b/x/erc20/types/events.go index 00d1d97722..9c8b12813d 100644 --- a/x/erc20/types/events.go +++ b/x/erc20/types/events.go @@ -24,6 +24,9 @@ const ( AttributeKeyCosmosCoin = "cosmos_coin" AttributeKeyERC20Token = "erc20_token" // #nosec AttributeKeyReceiver = "receiver" + + // ERC20EventTransfer defines the transfer event for ERC20 + ERC20EventTransfer = "Transfer" ) // LogTransfer Event type for Transfer(address from, address to, uint256 value) From b46ed257385ec2c9838b29ae5fbebda92aef5601 Mon Sep 17 00:00:00 2001 From: Ramiro Carlucho Date: Tue, 23 Apr 2024 20:07:10 -0300 Subject: [PATCH 216/345] chore(cli): re-introduce convert coin txn for erc20 module (#2503) * re-introduce convert coin txn * changelog --- CHANGELOG.md | 1 + x/erc20/client/cli/tx.go | 48 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 43b96a61a2..2ac3aa490f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -90,6 +90,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (docs) [#2478](https://github.com/evmos/evmos/pull/2478) Change Evmos SDK with evmOS. - (build) [#2484](https://github.com/evmos/evmos/pull/2484) Bump golang version to v1.22. - (client) [#2481](https://github.com/evmos/evmos/pull/2481) Replace path.Join with filepath.Join. +- (cli) [#2503](https://github.com/evmos/evmos/pull/2503) Revert deletion of ConvertCoin for erc20 module (#2155). ## [v18.0.0](https://github.com/evmos/evmos/releases/tag/v18.0.0) - 2024-04-22 diff --git a/x/erc20/client/cli/tx.go b/x/erc20/client/cli/tx.go index 41b87a932e..e93cca9e39 100644 --- a/x/erc20/client/cli/tx.go +++ b/x/erc20/client/cli/tx.go @@ -35,6 +35,7 @@ func NewTxCmd() *cobra.Command { } txCmd.AddCommand( + NewConvertCoinCmd(), NewConvertERC20Cmd(), ) return txCmd @@ -210,3 +211,50 @@ func NewToggleTokenConversionProposalCmd() *cobra.Command { } return cmd } + +// NewConvertCoinCmd returns a CLI command handler for converting a Cosmos coin +func NewConvertCoinCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "convert-coin COIN [RECEIVER_HEX]", + Short: "Convert a Cosmos coin to ERC20. When the receiver [optional] is omitted, the ERC20 tokens are transferred to the sender.", + Args: cobra.RangeArgs(1, 2), + RunE: func(cmd *cobra.Command, args []string) error { + cliCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + coin, err := sdk.ParseCoinNormalized(args[0]) + if err != nil { + return err + } + + var receiver string + sender := cliCtx.GetFromAddress() + + if len(args) == 2 { + receiver = args[1] + if err := evmostypes.ValidateAddress(receiver); err != nil { + return fmt.Errorf("invalid receiver hex address %w", err) + } + } else { + receiver = common.BytesToAddress(sender).Hex() + } + + msg := &types.MsgConvertCoin{ + Coin: coin, + Receiver: receiver, + Sender: sender.String(), + } + + if err := msg.ValidateBasic(); err != nil { + return err + } + + return tx.GenerateOrBroadcastTxCLI(cliCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + return cmd +} From 80be866faaacf6bc4db15f9b756c473bdc03dec5 Mon Sep 17 00:00:00 2001 From: fx0x55 <80245546+fx0x55@users.noreply.github.com> Date: Wed, 24 Apr 2024 20:22:25 +0800 Subject: [PATCH 217/345] refactor: Repeated parsing of packetData (#2504) * refactor: Repeated parsing of packetData * add changelog entry --------- Co-authored-by: MalteHerrmann --- CHANGELOG.md | 1 + ibc/utils.go | 8 +-- ibc/utils_test.go | 88 +++++++++------------------------ x/erc20/keeper/ibc_callbacks.go | 2 +- 4 files changed, 27 insertions(+), 72 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ac3aa490f..41b79a5652 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -91,6 +91,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (build) [#2484](https://github.com/evmos/evmos/pull/2484) Bump golang version to v1.22. - (client) [#2481](https://github.com/evmos/evmos/pull/2481) Replace path.Join with filepath.Join. - (cli) [#2503](https://github.com/evmos/evmos/pull/2503) Revert deletion of ConvertCoin for erc20 module (#2155). +- (ibc) [#2504](https://github.com/evmos/evmos/pull/2504) Refactor repeated unpacking of IBC packet data. ## [v18.0.0](https://github.com/evmos/evmos/releases/tag/v18.0.0) - 2024-04-22 diff --git a/ibc/utils.go b/ibc/utils.go index 613da291e1..bf1fbcdf63 100644 --- a/ibc/utils.go +++ b/ibc/utils.go @@ -24,17 +24,11 @@ import ( // - the packet data is not FungibleTokenPacketData // - sender address is invalid // - recipient address is invalid -func GetTransferSenderRecipient(packet channeltypes.Packet) ( +func GetTransferSenderRecipient(data transfertypes.FungibleTokenPacketData) ( sender, recipient sdk.AccAddress, senderBech32, recipientBech32 string, err error, ) { - // unmarshal packet data to obtain the sender and recipient - var data transfertypes.FungibleTokenPacketData - if err := transfertypes.ModuleCdc.UnmarshalJSON(packet.GetData(), &data); err != nil { - return nil, nil, "", "", errorsmod.Wrapf(errortypes.ErrUnknownRequest, "cannot unmarshal ICS-20 transfer packet data") - } - // validate the sender bech32 address from the counterparty chain // and change the bech32 human readable prefix (HRP) of the sender to `evmos` sender, err = utils.GetEvmosAddressFromBech32(data.Sender) diff --git a/ibc/utils_test.go b/ibc/utils_test.go index 8a705f419f..65d87f4315 100644 --- a/ibc/utils_test.go +++ b/ibc/utils_test.go @@ -22,48 +22,24 @@ func init() { func TestGetTransferSenderRecipient(t *testing.T) { testCases := []struct { name string - packet channeltypes.Packet + data transfertypes.FungibleTokenPacketData expSender string expRecipient string expError bool }{ { - name: "empty packet", - packet: channeltypes.Packet{}, - expSender: "", - expRecipient: "", - expError: true, - }, - { - name: "invalid packet data", - packet: channeltypes.Packet{ - Data: ibctesting.MockFailPacketData, - }, - expSender: "", - expRecipient: "", - expError: true, - }, - { - name: "empty FungibleTokenPacketData", - packet: channeltypes.Packet{ - Data: transfertypes.ModuleCdc.MustMarshalJSON( - &transfertypes.FungibleTokenPacketData{}, - ), - }, + name: "empty FungibleTokenPacketData", + data: transfertypes.FungibleTokenPacketData{}, expSender: "", expRecipient: "", expError: true, }, { name: "invalid sender", - packet: channeltypes.Packet{ - Data: transfertypes.ModuleCdc.MustMarshalJSON( - &transfertypes.FungibleTokenPacketData{ - Sender: "cosmos1", - Receiver: "evmos1x2w87cvt5mqjncav4lxy8yfreynn273xn5335v", - Amount: "123456", - }, - ), + data: transfertypes.FungibleTokenPacketData{ + Sender: "cosmos1", + Receiver: "evmos1x2w87cvt5mqjncav4lxy8yfreynn273xn5335v", + Amount: "123456", }, expSender: "", expRecipient: "", @@ -71,14 +47,10 @@ func TestGetTransferSenderRecipient(t *testing.T) { }, { name: "invalid recipient", - packet: channeltypes.Packet{ - Data: transfertypes.ModuleCdc.MustMarshalJSON( - &transfertypes.FungibleTokenPacketData{ - Sender: "cosmos1qql8ag4cluz6r4dz28p3w00dnc9w8ueulg2gmc", - Receiver: "evmos1", - Amount: "123456", - }, - ), + data: transfertypes.FungibleTokenPacketData{ + Sender: "cosmos1qql8ag4cluz6r4dz28p3w00dnc9w8ueulg2gmc", + Receiver: "evmos1", + Amount: "123456", }, expSender: "", expRecipient: "", @@ -86,14 +58,10 @@ func TestGetTransferSenderRecipient(t *testing.T) { }, { name: "valid - cosmos sender, evmos recipient", - packet: channeltypes.Packet{ - Data: transfertypes.ModuleCdc.MustMarshalJSON( - &transfertypes.FungibleTokenPacketData{ - Sender: "cosmos1qql8ag4cluz6r4dz28p3w00dnc9w8ueulg2gmc", - Receiver: "evmos1x2w87cvt5mqjncav4lxy8yfreynn273xn5335v", - Amount: "123456", - }, - ), + data: transfertypes.FungibleTokenPacketData{ + Sender: "cosmos1qql8ag4cluz6r4dz28p3w00dnc9w8ueulg2gmc", + Receiver: "evmos1x2w87cvt5mqjncav4lxy8yfreynn273xn5335v", + Amount: "123456", }, expSender: "evmos1qql8ag4cluz6r4dz28p3w00dnc9w8ueuafmxps", expRecipient: "evmos1x2w87cvt5mqjncav4lxy8yfreynn273xn5335v", @@ -101,14 +69,10 @@ func TestGetTransferSenderRecipient(t *testing.T) { }, { name: "valid - evmos sender, cosmos recipient", - packet: channeltypes.Packet{ - Data: transfertypes.ModuleCdc.MustMarshalJSON( - &transfertypes.FungibleTokenPacketData{ - Sender: "evmos1x2w87cvt5mqjncav4lxy8yfreynn273xn5335v", - Receiver: "cosmos1qql8ag4cluz6r4dz28p3w00dnc9w8ueulg2gmc", - Amount: "123456", - }, - ), + data: transfertypes.FungibleTokenPacketData{ + Sender: "evmos1x2w87cvt5mqjncav4lxy8yfreynn273xn5335v", + Receiver: "cosmos1qql8ag4cluz6r4dz28p3w00dnc9w8ueulg2gmc", + Amount: "123456", }, expSender: "evmos1x2w87cvt5mqjncav4lxy8yfreynn273xn5335v", expRecipient: "evmos1qql8ag4cluz6r4dz28p3w00dnc9w8ueuafmxps", @@ -116,14 +80,10 @@ func TestGetTransferSenderRecipient(t *testing.T) { }, { name: "valid - osmosis sender, evmos recipient", - packet: channeltypes.Packet{ - Data: transfertypes.ModuleCdc.MustMarshalJSON( - &transfertypes.FungibleTokenPacketData{ - Sender: "osmo1qql8ag4cluz6r4dz28p3w00dnc9w8ueuhnecd2", - Receiver: "evmos1x2w87cvt5mqjncav4lxy8yfreynn273xn5335v", - Amount: "123456", - }, - ), + data: transfertypes.FungibleTokenPacketData{ + Sender: "osmo1qql8ag4cluz6r4dz28p3w00dnc9w8ueuhnecd2", + Receiver: "evmos1x2w87cvt5mqjncav4lxy8yfreynn273xn5335v", + Amount: "123456", }, expSender: "evmos1qql8ag4cluz6r4dz28p3w00dnc9w8ueuafmxps", expRecipient: "evmos1x2w87cvt5mqjncav4lxy8yfreynn273xn5335v", @@ -132,7 +92,7 @@ func TestGetTransferSenderRecipient(t *testing.T) { } for _, tc := range testCases { - sender, recipient, _, _, err := GetTransferSenderRecipient(tc.packet) + sender, recipient, _, _, err := GetTransferSenderRecipient(tc.data) if tc.expError { require.Error(t, err, tc.name) } else { diff --git a/x/erc20/keeper/ibc_callbacks.go b/x/erc20/keeper/ibc_callbacks.go index 6acadf5acc..a1f0f66dd4 100644 --- a/x/erc20/keeper/ibc_callbacks.go +++ b/x/erc20/keeper/ibc_callbacks.go @@ -55,7 +55,7 @@ func (k Keeper) OnRecvPacket( } // Get addresses in `evmos1` and the original bech32 format - sender, recipient, _, _, err := ibc.GetTransferSenderRecipient(packet) + sender, recipient, _, _, err := ibc.GetTransferSenderRecipient(data) if err != nil { return channeltypes.NewErrorAcknowledgement(err) } From 688644b1b04f8e989b2ca8b4c340ad04a416c31d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:58:36 +0000 Subject: [PATCH 218/345] build(deps): bump bufbuild/buf-setup-action from 1.30.1 to 1.31.0 (#2505) Bumps [bufbuild/buf-setup-action](https://github.com/bufbuild/buf-setup-action) from 1.30.1 to 1.31.0. - [Release notes](https://github.com/bufbuild/buf-setup-action/releases) - [Commits](https://github.com/bufbuild/buf-setup-action/compare/v1.30.1...v1.31.0) --- updated-dependencies: - dependency-name: bufbuild/buf-setup-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> --- .github/workflows/bsr-push.yml | 2 +- .github/workflows/proto.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/bsr-push.yml b/.github/workflows/bsr-push.yml index d94f63e3e4..3a69b9c946 100644 --- a/.github/workflows/bsr-push.yml +++ b/.github/workflows/bsr-push.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: bufbuild/buf-setup-action@v1.30.1 + - uses: bufbuild/buf-setup-action@v1.31.0 # Push Evmos protos to the Buf Schema Registry - uses: bufbuild/buf-push-action@v1.2.0 with: diff --git a/.github/workflows/proto.yml b/.github/workflows/proto.yml index c1c0e12aa6..26be4eb943 100644 --- a/.github/workflows/proto.yml +++ b/.github/workflows/proto.yml @@ -28,7 +28,7 @@ jobs: timeout-minutes: 5 steps: - uses: actions/checkout@v4 - - uses: bufbuild/buf-setup-action@v1.30.1 + - uses: bufbuild/buf-setup-action@v1.31.0 - uses: bufbuild/buf-lint-action@v1 with: input: "proto" @@ -37,7 +37,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: bufbuild/buf-setup-action@v1.30.1 + - uses: bufbuild/buf-setup-action@v1.31.0 - uses: bufbuild/buf-breaking-action@v1 with: input: "proto" From 45e4ecd2aaf96a1248a42fdfcf0e23a50fbff173 Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Wed, 24 Apr 2024 14:57:48 -0300 Subject: [PATCH 219/345] chore: remove outdated localnet setup (#2509) --- Makefile | 43 ---------------------- docker-compose.yml | 63 --------------------------------- networks/local/Makefile | 4 --- networks/local/evmos/Dockerfile | 34 ------------------ 4 files changed, 144 deletions(-) delete mode 100644 docker-compose.yml delete mode 100644 networks/local/Makefile delete mode 100644 networks/local/evmos/Dockerfile diff --git a/Makefile b/Makefile index 2fc551c960..b03fbebdfa 100644 --- a/Makefile +++ b/Makefile @@ -504,49 +504,6 @@ proto-download-deps: .PHONY: proto-all proto-gen proto-format proto-lint proto-check-breaking proto-swagger-gen -############################################################################### -### Localnet ### -############################################################################### - -# Build image for a local testnet -localnet-build: - @$(MAKE) -C networks/local - -# Start a 4-node testnet locally -localnet-start: localnet-stop localnet-build - @if ! [ -f build/node0/$(EVMOS_BINARY)/config/genesis.json ]; then docker run --rm -v $(CURDIR)/build:/evmos:Z evmos/node "./evmosd testnet init-files --v 4 -o /evmos --keyring-backend=test --starting-ip-address 192.167.10.2"; fi - docker-compose up -d - -# Stop testnet -localnet-stop: - docker-compose down - -# Clean testnet -localnet-clean: - docker-compose down - sudo rm -rf build/* - - # Reset testnet -localnet-unsafe-reset: - docker-compose down -ifeq ($(OS),Windows_NT) - @docker run --rm -v $(CURDIR)\build\node0\evmosd:/evmos\Z evmos/node "./evmosd tendermint unsafe-reset-all --home=/evmos" - @docker run --rm -v $(CURDIR)\build\node1\evmosd:/evmos\Z evmos/node "./evmosd tendermint unsafe-reset-all --home=/evmos" - @docker run --rm -v $(CURDIR)\build\node2\evmosd:/evmos\Z evmos/node "./evmosd tendermint unsafe-reset-all --home=/evmos" - @docker run --rm -v $(CURDIR)\build\node3\evmosd:/evmos\Z evmos/node "./evmosd tendermint unsafe-reset-all --home=/evmos" -else - @docker run --rm -v $(CURDIR)/build/node0/evmosd:/evmos:Z evmos/node "./evmosd tendermint unsafe-reset-all --home=/evmos" - @docker run --rm -v $(CURDIR)/build/node1/evmosd:/evmos:Z evmos/node "./evmosd tendermint unsafe-reset-all --home=/evmos" - @docker run --rm -v $(CURDIR)/build/node2/evmosd:/evmos:Z evmos/node "./evmosd tendermint unsafe-reset-all --home=/evmos" - @docker run --rm -v $(CURDIR)/build/node3/evmosd:/evmos:Z evmos/node "./evmosd tendermint unsafe-reset-all --home=/evmos" -endif - -# Clean testnet -localnet-show-logstream: - docker-compose logs --tail=1000 -f - -.PHONY: localnet-build localnet-start localnet-stop - ############################################################################### ### Releasing ### ############################################################################### diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 2451025200..0000000000 --- a/docker-compose.yml +++ /dev/null @@ -1,63 +0,0 @@ -version: '3' - -services: - node0: - container_name: evmosnode0 - image: "evmos/node" - ports: - - "26656-26657:26656-26657" - volumes: - - ./build/node0/evmosd:/evmos:Z - command: - - /evmosd start --home /evmos - networks: - localnet: - ipv4_address: 192.167.10.2 - - node1: - container_name: evmosnode1 - image: "evmos/node" - ports: - - "26659-26660:26656-26657" - volumes: - - ./build/node1/evmosd:/evmos:Z - command: - - /evmosd start --home /evmos - networks: - localnet: - ipv4_address: 192.167.10.3 - - node2: - container_name: evmosnode2 - image: "evmos/node" - ports: - - "26661-26662:26656-26657" - volumes: - - ./build/node2/evmosd:/evmos:Z - command: - - /evmosd start --home /evmos - networks: - localnet: - ipv4_address: 192.167.10.4 - - node3: - container_name: evmosnode3 - image: "evmos/node" - ports: - - "26663-26664:26656-26657" - volumes: - - ./build/node3/evmosd:/evmos:Z - command: - - /evmosd start --home /evmos - networks: - localnet: - ipv4_address: 192.167.10.5 - -networks: - localnet: - driver: bridge - ipam: - driver: default - config: - - - subnet: 192.167.10.0/16 \ No newline at end of file diff --git a/networks/local/Makefile b/networks/local/Makefile deleted file mode 100644 index 56a9d7b9f9..0000000000 --- a/networks/local/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -all: - docker build --no-cache --tag evmos/node ../.. -f evmos/Dockerfile - -.PHONY: all diff --git a/networks/local/evmos/Dockerfile b/networks/local/evmos/Dockerfile deleted file mode 100644 index d4e74b2f8d..0000000000 --- a/networks/local/evmos/Dockerfile +++ /dev/null @@ -1,34 +0,0 @@ -FROM golang:bullseye as build-env - -# Install minimum necessary dependencies -ENV PACKAGES curl make git libc-dev bash gcc -# Ignoring the lint about pinning version because -# the build breaks whenever a new version comes out -# hadolint ignore=DL3008 -RUN apt-get update && apt-get upgrade -y && \ - apt-get install -y $PACKAGES --no-install-recommends - -# Set working directory for the build -WORKDIR /go/src/github.com/evmos/evmos - -# Add source files -COPY . . - -# build Ethermint -RUN make build-linux - -# Final image -FROM golang:bullseye as final - -WORKDIR / - -RUN apt-get update - -# Copy over binaries from the build-env -COPY --from=build-env /go/src/github.com/evmos/evmos/build/evmosd / -COPY --from=build-env /go/src/github.com/evmos/evmos/scripts/start-docker.sh / - -EXPOSE 26656 26657 1317 9090 8545 8546 - -# Run evmosd by default, omit entrypoint to ease using container with evmosd -ENTRYPOINT ["/bin/bash", "-c"] \ No newline at end of file From ca748a4494d672315c5eed3aaffc3a2bbd53b8c3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 09:43:57 +0200 Subject: [PATCH 220/345] build(deps): bump github/super-linter from 5 to 6 (#2506) * build(deps): bump github/super-linter from 5 to 6 Bumps [github/super-linter](https://github.com/github/super-linter) from 5 to 6. - [Release notes](https://github.com/github/super-linter/releases) - [Changelog](https://github.com/github/super-linter/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/super-linter/compare/v5...v6) --- updated-dependencies: - dependency-name: github/super-linter dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] * address some lint issues * address some lint issues * address some lint issues * address some lint issues * address some lint issues * address some lint issues * address some lint issues * address some lint issues * address some lint issues * address some lint issues * address some lint issues * address some lint issues --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: tom Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- .github/workflows/ante-benchmark.yml | 2 + .github/workflows/auto-format.yml | 2 + .github/workflows/bsr-push.yml | 1 + .github/workflows/build.yml | 2 + .github/workflows/changelog.yml | 1 + .github/workflows/check-licenses.yml | 2 + .github/workflows/codeql-analysis.yml | 1 + .github/workflows/consensuswarn.yml | 2 + .github/workflows/dependencies.yml | 3 +- .github/workflows/docker-push.yml | 1 + .github/workflows/e2e-test.yml | 1 + .../{goreleaser.yml => go-releaser.yml} | 2 + .github/workflows/labeler.yml | 9 +- .github/workflows/lint.yml | 3 + .github/workflows/markdown-links.yml | 1 + .github/workflows/proto.yml | 4 + .github/workflows/security.yml | 1 + .github/workflows/semgrep.yml | 2 + .github/workflows/slither.yml | 1 + .github/workflows/solhint.yml | 4 +- .github/workflows/solidity-test.yml | 1 + .github/workflows/stale.yml | 3 + .github/workflows/super-linter.yml | 3 +- .github/workflows/test.yml | 7 +- Dockerfile | 1 + client/docs/config.json | 10 + client/docs/swagger-ui/swagger.json | 1348 +++++++++++------ tests/e2e/Dockerfile.repo | 5 +- tests/e2e/upgrade/Dockerfile.init | 3 + 29 files changed, 931 insertions(+), 495 deletions(-) rename .github/workflows/{goreleaser.yml => go-releaser.yml} (96%) diff --git a/.github/workflows/ante-benchmark.yml b/.github/workflows/ante-benchmark.yml index 744397b460..0f473b3b4b 100644 --- a/.github/workflows/ante-benchmark.yml +++ b/.github/workflows/ante-benchmark.yml @@ -5,6 +5,8 @@ on: branches: - main +permissions: read-all + jobs: ante-benchmark-test: runs-on: ubuntu-latest diff --git a/.github/workflows/auto-format.yml b/.github/workflows/auto-format.yml index 8289f879fb..2718e40cd5 100644 --- a/.github/workflows/auto-format.yml +++ b/.github/workflows/auto-format.yml @@ -3,6 +3,8 @@ name: Auto Format on: pull_request: +permissions: read-all + jobs: format-go-code: runs-on: ubuntu-latest diff --git a/.github/workflows/bsr-push.yml b/.github/workflows/bsr-push.yml index 3a69b9c946..7186efb999 100644 --- a/.github/workflows/bsr-push.yml +++ b/.github/workflows/bsr-push.yml @@ -6,6 +6,7 @@ on: push: tags: - "v*.*.*" +permissions: read-all jobs: push: diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5851e40755..c9232f583e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -4,6 +4,8 @@ on: branches: - main - release/** + +permissions: read-all jobs: cleanup-runs: diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml index 6536139d0d..f59a442488 100644 --- a/.github/workflows/changelog.yml +++ b/.github/workflows/changelog.yml @@ -5,6 +5,7 @@ on: branches: - main - release/** +permissions: read-all jobs: check_diff: diff --git a/.github/workflows/check-licenses.yml b/.github/workflows/check-licenses.yml index 047dd2a064..3e751cb38c 100644 --- a/.github/workflows/check-licenses.yml +++ b/.github/workflows/check-licenses.yml @@ -2,6 +2,8 @@ name: Check Licenses on: pull_request +permissions: read-all + jobs: check-licenses: runs-on: ubuntu-latest diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index af0eb92467..f84041ade7 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -13,6 +13,7 @@ name: "CodeQL" on: pull_request: +permissions: read-all jobs: analyze: diff --git a/.github/workflows/consensuswarn.yml b/.github/workflows/consensuswarn.yml index c92b02be31..9a19ef4a52 100644 --- a/.github/workflows/consensuswarn.yml +++ b/.github/workflows/consensuswarn.yml @@ -1,5 +1,7 @@ name: "Consensus Warn" +permissions: read-all + on: pull_request_target: types: diff --git a/.github/workflows/dependencies.yml b/.github/workflows/dependencies.yml index 90c8412217..c1dbead400 100644 --- a/.github/workflows/dependencies.yml +++ b/.github/workflows/dependencies.yml @@ -1,8 +1,7 @@ name: "Dependency Review" on: pull_request -permissions: - contents: read +permissions: read-all jobs: dependency-review: diff --git a/.github/workflows/docker-push.yml b/.github/workflows/docker-push.yml index 01bdbd8cdd..5b32ff7460 100644 --- a/.github/workflows/docker-push.yml +++ b/.github/workflows/docker-push.yml @@ -4,6 +4,7 @@ on: push: tags: - "v*.*.*" +permissions: read-all jobs: docker: diff --git a/.github/workflows/e2e-test.yml b/.github/workflows/e2e-test.yml index 310f26dc00..9b1f51fe18 100644 --- a/.github/workflows/e2e-test.yml +++ b/.github/workflows/e2e-test.yml @@ -7,6 +7,7 @@ on: push: branches: - release/** +permissions: read-all jobs: test-e2e: diff --git a/.github/workflows/goreleaser.yml b/.github/workflows/go-releaser.yml similarity index 96% rename from .github/workflows/goreleaser.yml rename to .github/workflows/go-releaser.yml index ce1ab2f64a..500f09a729 100644 --- a/.github/workflows/goreleaser.yml +++ b/.github/workflows/go-releaser.yml @@ -4,6 +4,8 @@ on: push: tags: - "v*.*.*" +permissions: read-all + jobs: goreleaser: runs-on: ubuntu-latest diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index bb87367f00..cb283e67e2 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -1,11 +1,14 @@ name: "Pull Request Labeler" on: pull_request: +permissions: read-all jobs: triage: runs-on: ubuntu-latest + permissions: + pull-requests: write # For reading the PR and adding the label steps: - - uses: actions/labeler@v5 - with: - repo-token: "${{ secrets.GITHUB_TOKEN }}" + - uses: actions/labeler@v5 + with: + repo-token: "${{ secrets.GITHUB_TOKEN }}" diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index d12950b5cc..db7e9bb790 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -4,6 +4,9 @@ name: Lint # running if no *.{go, mod, sum} files have been changed. on: pull_request: + +permissions: read-all + jobs: golangci: name: Run golangci-lint diff --git a/.github/workflows/markdown-links.yml b/.github/workflows/markdown-links.yml index 0e5d485988..0d1e2bb4bf 100644 --- a/.github/workflows/markdown-links.yml +++ b/.github/workflows/markdown-links.yml @@ -4,6 +4,7 @@ on: branches: - main - release/** +permissions: read-all jobs: markdown-link-check: diff --git a/.github/workflows/proto.yml b/.github/workflows/proto.yml index 26be4eb943..50e700f1cc 100644 --- a/.github/workflows/proto.yml +++ b/.github/workflows/proto.yml @@ -6,9 +6,13 @@ on: paths: - "proto/**" +permissions: read-all + jobs: build: runs-on: ubuntu-latest + permissions: + contents: write steps: - uses: actions/checkout@v4 - uses: technote-space/get-diff-action@v6.1.2 diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml index e3ecbd760d..c9d206f529 100644 --- a/.github/workflows/security.yml +++ b/.github/workflows/security.yml @@ -1,6 +1,7 @@ name: Run Gosec on: pull_request: +permissions: read-all jobs: Gosec: diff --git a/.github/workflows/semgrep.yml b/.github/workflows/semgrep.yml index bd918cf113..49e588917d 100644 --- a/.github/workflows/semgrep.yml +++ b/.github/workflows/semgrep.yml @@ -3,6 +3,8 @@ on: # Scan changed files in PRs, block on new issues only (existing issues ignored) pull_request: +permissions: read-all + jobs: # Update from: https://semgrep.dev/docs/semgrep-ci/sample-ci-configs/#github-actions [removing GH Security Dashboard] semgrep: diff --git a/.github/workflows/slither.yml b/.github/workflows/slither.yml index acc9990188..607c65c5d4 100644 --- a/.github/workflows/slither.yml +++ b/.github/workflows/slither.yml @@ -2,6 +2,7 @@ name: Slither Analysis on: pull_request: +permissions: read-all jobs: analyze: diff --git a/.github/workflows/solhint.yml b/.github/workflows/solhint.yml index e66cccff1f..46378cf93a 100644 --- a/.github/workflows/solhint.yml +++ b/.github/workflows/solhint.yml @@ -3,10 +3,12 @@ name: Solhint on: pull_request: +permissions: read-all + jobs: solhint: name: runner / solhint - runs-on: ubuntu-latest + runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: technote-space/get-diff-action@v6.1.2 diff --git a/.github/workflows/solidity-test.yml b/.github/workflows/solidity-test.yml index df2861b2d2..a57ed225de 100644 --- a/.github/workflows/solidity-test.yml +++ b/.github/workflows/solidity-test.yml @@ -4,6 +4,7 @@ on: branches: - main - release/** +permissions: read-all jobs: test-solidity: diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index ef34170303..ea9704e702 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -2,9 +2,12 @@ name: "Close stale issues & pull requests" on: schedule: - cron: "0 0 * * *" +permissions: read-all jobs: stale: + permissions: + pull-requests: write # For reading the PR and adding the label runs-on: ubuntu-latest steps: - uses: actions/stale@v9 diff --git a/.github/workflows/super-linter.yml b/.github/workflows/super-linter.yml index 794ac8d59e..2cbacdaaf7 100644 --- a/.github/workflows/super-linter.yml +++ b/.github/workflows/super-linter.yml @@ -9,6 +9,7 @@ name: Lint Code Base on: pull_request: +permissions: read-all jobs: run-lint: runs-on: ubuntu-latest @@ -20,7 +21,7 @@ jobs: fetch-depth: 0 - name: Lint Code Base - uses: github/super-linter@v5 + uses: github/super-linter@v6 env: LINTER_RULES_PATH: / YAML_CONFIG_FILE: .yamllint diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9ecab02987..7d1644d780 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -5,6 +5,7 @@ on: branches: - main - release/** +permissions: read-all jobs: cleanup-runs: @@ -20,7 +21,7 @@ jobs: steps: - uses: actions/setup-go@v5 with: - go-version: '1.22' + go-version: "1.22" check-latest: true - uses: actions/checkout@v4 - uses: technote-space/get-diff-action@v6.1.2 @@ -58,8 +59,8 @@ jobs: - name: Setup Python uses: actions/setup-python@v5 with: - python-version: '3.11' - cache: 'pip' # caching pip dependencies + python-version: "3.11" + cache: "pip" # caching pip dependencies if: env.GIT_DIFF - name: Install Pytest run: | diff --git a/Dockerfile b/Dockerfile index 6db2890fe0..496b210560 100644 --- a/Dockerfile +++ b/Dockerfile @@ -49,5 +49,6 @@ USER 1000 WORKDIR /home/evmos EXPOSE 26656 26657 1317 9090 8545 8546 +HEALTHCHECK CMD curl --fail http://localhost:26657 || exit 1 CMD ["evmosd"] diff --git a/client/docs/config.json b/client/docs/config.json index ef8ac457f6..1a472942b6 100644 --- a/client/docs/config.json +++ b/client/docs/config.json @@ -5,6 +5,16 @@ "description": "A REST interface for state queries and transactions", "version": "1.0.0" }, + "//": [ + "checkov:skip=CKV_OPENAPI_13: The API is public, no need for authentication", + "checkov:skip=CKV_OPENAPI_6: The API is public, no need for authentication", + "checkov:skip=CKV_OPENAPI_4: The API is public, no need for authentication" + ], + "securityDefinitions": { + "default": { + "type": "basic" + } + }, "apis": [ { "url": "./tmp-swagger-gen/evmos/epochs/v1/query.swagger.json" diff --git a/client/docs/swagger-ui/swagger.json b/client/docs/swagger-ui/swagger.json index 292c0fb992..b819a7d576 100644 --- a/client/docs/swagger-ui/swagger.json +++ b/client/docs/swagger-ui/swagger.json @@ -5,11 +5,24 @@ "description": "A REST interface for state queries and transactions", "version": "1.0.0" }, + "//": [ + "checkov:skip=CKV_OPENAPI_13: The API is public, no need for authentication", + "checkov:skip=CKV_OPENAPI_6: The API is public, no need for authentication" + ], + "securityDefinitions": { + "default": { + "type": "basic" + } + }, + "security": { + "default": [] + }, "paths": { "/evmos/epochs/v1/current_epoch": { "get": { "summary": "CurrentEpoch provide current epoch of specified identifier", "operationId": "CurrentEpoch", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -42,6 +55,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -68,15 +82,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/evmos/epochs/v1/epochs": { "get": { "summary": "EpochInfos provide running epochInfos", "operationId": "EpochInfos", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -85,6 +98,7 @@ "properties": { "epochs": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -162,6 +176,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -219,15 +234,14 @@ "type": "boolean" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/evmos/erc20/v1/params": { "get": { "summary": "Params retrieves the erc20 module params", "operationId": "ERC20Params", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -269,6 +283,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -286,15 +301,14 @@ } } }, - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/evmos/erc20/v1/token_pairs": { "get": { "summary": "TokenPairs retrieves registered token pairs", "operationId": "TokenPairs", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -303,6 +317,7 @@ "properties": { "token_pairs": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -371,6 +386,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -428,15 +444,14 @@ "type": "boolean" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/evmos/erc20/v1/token_pairs/{token}": { "get": { "summary": "TokenPair retrieves a registered token pair", "operationId": "TokenPair", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -494,6 +509,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -520,15 +536,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/evmos/inflation/v1/circulating_supply": { "get": { "summary": "CirculatingSupply retrieves the total number of tokens that are in\ncirculation (i.e. excluding unvested tokens).", "operationId": "CirculatingSupply", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -569,6 +584,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -586,15 +602,14 @@ } } }, - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/evmos/inflation/v1/epoch_mint_provision": { "get": { "summary": "EpochMintProvision retrieves current minting epoch provision value.", "operationId": "EpochMintProvision", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -634,6 +649,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -651,15 +667,14 @@ } } }, - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/evmos/inflation/v1/inflation_rate": { "get": { "summary": "InflationRate retrieves the inflation rate of the current period.", "operationId": "InflationRate", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -691,6 +706,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -708,15 +724,14 @@ } } }, - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/evmos/inflation/v1/params": { "get": { "summary": "Params retrieves the total set of minting parameters.", "operationId": "InflationParams", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -802,6 +817,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -819,15 +835,14 @@ } } }, - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/evmos/inflation/v1/period": { "get": { "summary": "Period retrieves current period.", "operationId": "Period", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -860,6 +875,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -877,15 +893,14 @@ } } }, - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/evmos/inflation/v1/skipped_epochs": { "get": { "summary": "SkippedEpochs retrieves the total number of skipped epochs.", "operationId": "SkippedEpochs", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -918,6 +933,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -935,15 +951,14 @@ } } }, - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/evmos/vesting/v2/balances/{address}": { "get": { "summary": "Balances retrieves the unvested, vested and locked tokens for a vesting account", "operationId": "Balances", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -952,6 +967,7 @@ "properties": { "locked": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -968,6 +984,7 @@ }, "unvested": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -984,6 +1001,7 @@ }, "vested": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -1019,6 +1037,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -1045,15 +1064,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/evmos/evm/v1/account/{address}": { "get": { "summary": "Account queries an Ethereum account.", "operationId": "Account", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -1094,6 +1112,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -1123,15 +1142,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/evmos/evm/v1/balances/{address}": { "get": { "summary": "Balance queries the balance of a the EVM denomination for a single\nEthAccount.", "operationId": "Balance", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -1163,6 +1181,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -1192,15 +1211,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/evmos/evm/v1/base_fee": { "get": { "summary": "BaseFee queries the base fee of the parent block of the current block,\nit's similar to feemarket module's method, but also checks london hardfork status.", "operationId": "BaseFee", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -1232,6 +1250,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -1252,15 +1271,14 @@ } } }, - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/evmos/evm/v1/codes/{address}": { "get": { "summary": "Code queries the balance of all coins for a single account.", "operationId": "Code", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -1293,6 +1311,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -1322,15 +1341,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/evmos/evm/v1/cosmos_account/{address}": { "get": { "summary": "CosmosAccount queries an Ethereum account's Cosmos Address.", "operationId": "CosmosAccount", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -1372,6 +1390,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -1401,15 +1420,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/evmos/evm/v1/estimate_gas": { "get": { "summary": "EstimateGas implements the `eth_estimateGas` rpc api", "operationId": "EstimateGas", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -1442,6 +1460,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -1496,15 +1515,14 @@ "format": "int64" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/evmos/evm/v1/eth_call": { "get": { "summary": "EthCall implements the `eth_call` rpc api", "operationId": "EthCall", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -1517,6 +1535,7 @@ }, "logs": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -1526,6 +1545,7 @@ }, "topics": { "type": "array", + "maxItems": 10, "items": { "type": "string" }, @@ -1603,6 +1623,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -1657,15 +1678,14 @@ "format": "int64" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/evmos/evm/v1/params": { "get": { "summary": "Params queries the parameters of x/evm module.", "operationId": "EvmParams", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -1690,6 +1710,7 @@ }, "extra_eips": { "type": "array", + "maxItems": 10, "items": { "type": "string", "format": "int64" @@ -1785,6 +1806,7 @@ }, "active_precompiles": { "type": "array", + "maxItems": 10, "items": { "type": "string" }, @@ -1792,6 +1814,7 @@ }, "evm_channels": { "type": "array", + "maxItems": 10, "items": { "type": "string" }, @@ -1821,6 +1844,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -1841,15 +1865,14 @@ } } }, - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/evmos/evm/v1/storage/{address}/{key}": { "get": { "summary": "Storage queries the balance of all coins for a single account.", "operationId": "Storage", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -1881,6 +1904,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -1917,15 +1941,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/evmos/evm/v1/trace_block": { "get": { "summary": "TraceBlock implements the `debug_traceBlockByNumber` and `debug_traceBlockByHash` rpc api", "operationId": "TraceBlock", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -1958,6 +1981,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -2232,15 +2256,14 @@ "format": "int64" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/evmos/evm/v1/trace_tx": { "get": { "summary": "TraceTx implements the `debug_traceTransaction` rpc api", "operationId": "TraceTx", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -2273,6 +2296,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -2584,15 +2608,14 @@ "format": "int64" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/evmos/evm/v1/validator_account/{cons_address}": { "get": { "summary": "ValidatorAccount queries an Ethereum account's from a validator consensus\nAddress.", "operationId": "ValidatorAccount", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -2634,6 +2657,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -2663,15 +2687,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/evmos/feemarket/v1/base_fee": { "get": { "summary": "BaseFee queries the base fee of the parent block of the current block.", "operationId": "FeeMarketBaseFee", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -2703,6 +2726,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -2720,15 +2744,14 @@ } } }, - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/evmos/feemarket/v1/block_gas": { "get": { "summary": "BlockGas queries the gas used at a given block height", "operationId": "BlockGas", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -2761,6 +2784,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -2778,15 +2802,14 @@ } } }, - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/evmos/feemarket/v1/params": { "get": { "summary": "Params queries the parameters of x/feemarket module.", "operationId": "FeeMarketParams", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -2852,6 +2875,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -2869,15 +2893,14 @@ } } }, - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/ibc/apps/transfer/v1/channels/{channel_id}/ports/{port_id}/escrow_address": { "get": { "summary": "EscrowAddress returns the escrow address for a particular port and channel id.", "operationId": "EscrowAddress", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -2909,6 +2932,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -2942,15 +2966,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/ibc/apps/transfer/v1/denom_hashes/{trace}": { "get": { "summary": "DenomHash queries a denomination hash information.", "operationId": "DenomHash", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -2982,6 +3005,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -3008,15 +3032,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/ibc/apps/transfer/v1/denom_traces": { "get": { "summary": "DenomTraces queries all denomination traces.", "operationId": "DenomTraces", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -3025,6 +3048,7 @@ "properties": { "denom_traces": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -3078,6 +3102,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -3135,15 +3160,14 @@ "type": "boolean" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/ibc/apps/transfer/v1/denom_traces/{hash}": { "get": { "summary": "DenomTrace queries a denomination trace information.", "operationId": "DenomTrace", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -3185,6 +3209,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -3211,15 +3236,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/ibc/apps/transfer/v1/denoms/{denom}/total_escrow": { "get": { "summary": "TotalEscrowForDenom returns the total amount of tokens in escrow based on the denom.", "operationId": "TotalEscrowForDenom", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -3259,6 +3283,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -3284,15 +3309,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/ibc/apps/transfer/v1/params": { "get": { "summary": "Params queries all parameters of the ibc-transfer module.", "operationId": "TransferParams", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -3334,6 +3358,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -3351,15 +3376,14 @@ } } }, - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/ibc/core/client/v1/client_states": { "get": { "summary": "ClientStates queries all the IBC light clients of a chain.", "operationId": "ClientStates", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -3368,6 +3392,7 @@ "properties": { "client_states": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -3434,6 +3459,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -3494,15 +3520,14 @@ "type": "boolean" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/ibc/core/client/v1/client_states/{client_id}": { "get": { "summary": "ClientState queries an IBC light client.", "operationId": "ClientState", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -3568,6 +3593,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -3597,15 +3623,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/ibc/core/client/v1/client_status/{client_id}": { "get": { "summary": "Status queries the status of an IBC client.", "operationId": "ClientStatus", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -3636,6 +3661,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -3665,15 +3691,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/ibc/core/client/v1/consensus_states/{client_id}": { "get": { "summary": "ConsensusStates queries all the consensus state associated with a given\nclient.", "operationId": "ConsensusStates", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -3682,6 +3707,7 @@ "properties": { "consensus_states": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -3761,6 +3787,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -3828,15 +3855,14 @@ "type": "boolean" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/ibc/core/client/v1/consensus_states/{client_id}/heights": { "get": { "summary": "ConsensusStateHeights queries the height of every consensus states associated with a given client.", "operationId": "ConsensusStateHeights", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -3845,6 +3871,7 @@ "properties": { "consensus_state_heights": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -3902,6 +3929,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -3969,15 +3997,14 @@ "type": "boolean" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/ibc/core/client/v1/consensus_states/{client_id}/revision/{revision_number}/height/{revision_height}": { "get": { "summary": "ConsensusState queries a consensus state associated with a client state at\na given height.", "operationId": "ConsensusState", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -4043,6 +4070,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -4095,15 +4123,14 @@ "type": "boolean" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/ibc/core/client/v1/params": { "get": { "summary": "ClientParams queries all parameters of the ibc client submodule.", "operationId": "ClientParams", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -4116,6 +4143,7 @@ "properties": { "allowed_clients": { "type": "array", + "maxItems": 10, "items": { "type": "string" }, @@ -4144,6 +4172,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -4164,15 +4193,14 @@ } } }, - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/ibc/core/client/v1/upgraded_client_states": { "get": { "summary": "UpgradedClientState queries an Upgraded IBC light client.", "operationId": "UpgradedClientState", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -4216,6 +4244,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -4236,15 +4265,14 @@ } } }, - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/ibc/core/client/v1/upgraded_consensus_states": { "get": { "summary": "UpgradedConsensusState queries an Upgraded IBC consensus state.", "operationId": "UpgradedConsensusState", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -4288,6 +4316,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -4308,15 +4337,14 @@ } } }, - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/ibc/core/connection/v1/client_connections/{client_id}": { "get": { "summary": "ClientConnections queries the connection paths associated with a client\nstate.", "operationId": "ClientConnections", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -4325,6 +4353,7 @@ "properties": { "connection_paths": { "type": "array", + "maxItems": 10, "items": { "type": "string" }, @@ -4373,6 +4402,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -4402,15 +4432,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/ibc/core/connection/v1/connections": { "get": { "summary": "Connections queries all the IBC connections of a chain.", "operationId": "Connections", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -4419,6 +4448,7 @@ "properties": { "connections": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -4432,6 +4462,7 @@ }, "versions": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -4441,6 +4472,7 @@ }, "features": { "type": "array", + "maxItems": 10, "items": { "type": "string" }, @@ -4552,6 +4584,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -4612,15 +4645,14 @@ "type": "boolean" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/ibc/core/connection/v1/connections/{connection_id}": { "get": { "summary": "Connection queries an IBC connection end.", "operationId": "Connection", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -4637,6 +4669,7 @@ }, "versions": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -4646,6 +4679,7 @@ }, "features": { "type": "array", + "maxItems": 10, "items": { "type": "string" }, @@ -4743,6 +4777,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -4772,15 +4807,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/ibc/core/connection/v1/connections/{connection_id}/client_state": { "get": { "summary": "ConnectionClientState queries the client state associated with the\nconnection.", "operationId": "ConnectionClientState", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -4857,6 +4891,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -4886,15 +4921,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/ibc/core/connection/v1/connections/{connection_id}/consensus_state/revision/{revision_number}/height/{revision_height}": { "get": { "summary": "ConnectionConsensusState queries the consensus state associated with the\nconnection.", "operationId": "ConnectionConsensusState", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -4964,6 +4998,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -5007,15 +5042,14 @@ "format": "uint64" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/ibc/core/connection/v1/params": { "get": { "summary": "ConnectionParams queries all parameters of the ibc connection submodule.", "operationId": "ConnectionParams", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -5054,6 +5088,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -5074,15 +5109,14 @@ } } }, - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/ibc/core/channel/v1/channels": { "get": { "summary": "Channels queries all the IBC channels of a chain.", "operationId": "Channels", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -5091,6 +5125,7 @@ "properties": { "channels": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -5134,6 +5169,7 @@ }, "connection_hops": { "type": "array", + "maxItems": 10, "items": { "type": "string" }, @@ -5211,6 +5247,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -5271,15 +5308,14 @@ "type": "boolean" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}": { "get": { "summary": "Channel queries an IBC Channel.", "operationId": "Channel", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -5330,6 +5366,7 @@ }, "connection_hops": { "type": "array", + "maxItems": 10, "items": { "type": "string" }, @@ -5385,6 +5422,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -5421,15 +5459,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/client_state": { "get": { "summary": "ChannelClientState queries for the client state for the channel associated\nwith the provided channel identifiers.", "operationId": "ChannelClientState", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -5506,6 +5543,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -5542,15 +5580,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/consensus_state/revision/{revision_number}/height/{revision_height}": { "get": { "summary": "ChannelConsensusState queries for the consensus state for the channel\nassociated with the provided channel identifiers.", "operationId": "ChannelConsensusState", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -5620,6 +5657,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -5672,15 +5710,14 @@ "format": "uint64" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/next_sequence": { "get": { "summary": "NextSequenceReceive returns the next receive sequence for a given channel.", "operationId": "NextSequenceReceive", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -5735,6 +5772,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -5771,15 +5809,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_acknowledgements": { "get": { "summary": "PacketAcknowledgements returns all the packet acknowledgements associated\nwith a channel.", "operationId": "PacketAcknowledgements", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -5788,6 +5825,7 @@ "properties": { "acknowledgements": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -5868,6 +5906,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -5947,6 +5986,7 @@ "in": "query", "required": false, "type": "array", + "maxItems": 10, "items": { "type": "string", "format": "uint64" @@ -5954,15 +5994,14 @@ "collectionFormat": "multi" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_acks/{sequence}": { "get": { "summary": "PacketAcknowledgement queries a stored packet acknowledgement hash.", "operationId": "PacketAcknowledgement", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -6017,6 +6056,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -6061,15 +6101,14 @@ "format": "uint64" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_commitments": { "get": { "summary": "PacketCommitments returns all the packet commitments hashes associated\nwith a channel.", "operationId": "PacketCommitments", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -6078,6 +6117,7 @@ "properties": { "commitments": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -6158,6 +6198,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -6232,15 +6273,14 @@ "type": "boolean" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_commitments/{packet_ack_sequences}/unreceived_acks": { "get": { "summary": "UnreceivedAcks returns all the unreceived IBC acknowledgements associated\nwith a channel and sequences.", "operationId": "UnreceivedAcks", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -6249,6 +6289,7 @@ "properties": { "sequences": { "type": "array", + "maxItems": 10, "items": { "type": "string", "format": "uint64" @@ -6293,6 +6334,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -6334,6 +6376,7 @@ "in": "path", "required": true, "type": "array", + "maxItems": 10, "items": { "type": "string", "format": "uint64" @@ -6342,15 +6385,14 @@ "minItems": 1 } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_commitments/{packet_commitment_sequences}/unreceived_packets": { "get": { "summary": "UnreceivedPackets returns all the unreceived IBC packets associated with a\nchannel and sequences.", "operationId": "UnreceivedPackets", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -6359,6 +6401,7 @@ "properties": { "sequences": { "type": "array", + "maxItems": 10, "items": { "type": "string", "format": "uint64" @@ -6403,6 +6446,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -6444,6 +6488,7 @@ "in": "path", "required": true, "type": "array", + "maxItems": 10, "items": { "type": "string", "format": "uint64" @@ -6452,15 +6497,14 @@ "minItems": 1 } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_commitments/{sequence}": { "get": { "summary": "PacketCommitment queries a stored packet commitment hash.", "operationId": "PacketCommitment", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -6515,6 +6559,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -6559,15 +6604,14 @@ "format": "uint64" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_receipts/{sequence}": { "get": { "summary": "PacketReceipt queries if a given packet sequence has been received on the\nqueried chain", "operationId": "PacketReceipt", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -6621,6 +6665,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -6665,15 +6710,14 @@ "format": "uint64" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/ibc/core/channel/v1/connections/{connection}/channels": { "get": { "summary": "ConnectionChannels queries all the channels associated with a connection\nend.", "operationId": "ConnectionChannels", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -6682,6 +6726,7 @@ "properties": { "channels": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -6725,6 +6770,7 @@ }, "connection_hops": { "type": "array", + "maxItems": 10, "items": { "type": "string" }, @@ -6802,6 +6848,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -6869,9 +6916,7 @@ "type": "boolean" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/auth/v1beta1/account_info/{address}": { @@ -6879,6 +6924,7 @@ "summary": "AccountInfo queries account info which is common to all account types.", "description": "Since: cosmos-sdk 0.47", "operationId": "AccountInfo", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -6938,6 +6984,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -6967,9 +7014,7 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/auth/v1beta1/accounts": { @@ -6977,6 +7022,7 @@ "summary": "Accounts returns all the existing accounts.", "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.\n\nSince: cosmos-sdk 0.43", "operationId": "Accounts", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -6985,6 +7031,7 @@ "properties": { "accounts": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -7039,6 +7086,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -7099,15 +7147,14 @@ "type": "boolean" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/auth/v1beta1/accounts/{address}": { "get": { "summary": "Account returns account details based on address.", "operationId": "AuthAccount", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -7150,6 +7197,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -7179,9 +7227,7 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/auth/v1beta1/address_by_id/{id}": { @@ -7189,6 +7235,7 @@ "summary": "AccountAddressByID returns account address based on account number.", "description": "Since: cosmos-sdk 0.46.2", "operationId": "AccountAddressByID", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -7220,6 +7267,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -7258,9 +7306,7 @@ "format": "uint64" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/auth/v1beta1/bech32": { @@ -7268,6 +7314,7 @@ "summary": "Bech32Prefix queries bech32Prefix", "description": "Since: cosmos-sdk 0.46", "operationId": "Bech32Prefix", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -7298,6 +7345,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -7318,9 +7366,7 @@ } } }, - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/auth/v1beta1/bech32/{address_bytes}": { @@ -7328,6 +7374,7 @@ "summary": "AddressBytesToString converts Account Address bytes to string", "description": "Since: cosmos-sdk 0.46", "operationId": "AddressBytesToString", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -7358,6 +7405,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -7387,9 +7435,7 @@ "format": "byte" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/auth/v1beta1/bech32/{address_string}": { @@ -7397,6 +7443,7 @@ "summary": "AddressStringToBytes converts Address string to bytes", "description": "Since: cosmos-sdk 0.46", "operationId": "AddressStringToBytes", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -7428,6 +7475,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -7456,9 +7504,7 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/auth/v1beta1/module_accounts": { @@ -7466,6 +7512,7 @@ "summary": "ModuleAccounts returns all the existing module accounts.", "description": "Since: cosmos-sdk 0.46", "operationId": "ModuleAccounts", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -7474,6 +7521,7 @@ "properties": { "accounts": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -7511,6 +7559,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -7531,15 +7580,14 @@ } } }, - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/auth/v1beta1/module_accounts/{name}": { "get": { "summary": "ModuleAccountByName returns the module account info by module name", "operationId": "ModuleAccountByName", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -7582,6 +7630,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -7610,15 +7659,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/auth/v1beta1/params": { "get": { "summary": "Params queries all parameters.", "operationId": "AuthParams", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -7672,6 +7720,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -7692,15 +7741,14 @@ } } }, - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/authz/v1beta1/grants": { "get": { "summary": "Returns list of `Authorization`, granted to the grantee by the granter.", "operationId": "Grants", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -7709,6 +7757,7 @@ "properties": { "grants": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -7774,6 +7823,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -7853,9 +7903,7 @@ "type": "boolean" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/authz/v1beta1/grants/grantee/{grantee}": { @@ -7863,6 +7911,7 @@ "summary": "GranteeGrants returns a list of `GrantAuthorization` by grantee.", "description": "Since: cosmos-sdk 0.46", "operationId": "GranteeGrants", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -7871,6 +7920,7 @@ "properties": { "grants": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -7941,6 +7991,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -8007,9 +8058,7 @@ "type": "boolean" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/authz/v1beta1/grants/granter/{granter}": { @@ -8017,6 +8066,7 @@ "summary": "GranterGrants returns list of `GrantAuthorization`, granted by granter.", "description": "Since: cosmos-sdk 0.46", "operationId": "GranterGrants", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -8025,6 +8075,7 @@ "properties": { "grants": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -8095,6 +8146,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -8161,9 +8213,7 @@ "type": "boolean" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/bank/v1beta1/balances/{address}": { @@ -8171,6 +8221,7 @@ "summary": "AllBalances queries the balance of all coins for a single account.", "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", "operationId": "AllBalances", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -8179,6 +8230,7 @@ "properties": { "balances": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -8230,6 +8282,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -8294,15 +8347,14 @@ "type": "boolean" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/bank/v1beta1/balances/{address}/by_denom": { "get": { "summary": "Balance queries the balance of a single coin for a single account.", "operationId": "BankBalance", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -8342,6 +8394,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -8375,9 +8428,7 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/bank/v1beta1/denom_owners/{denom}": { @@ -8385,6 +8436,7 @@ "summary": "DenomOwners queries for all account addresses that own a particular token\ndenomination.", "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.\n\nSince: cosmos-sdk 0.46", "operationId": "DenomOwners", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -8393,6 +8445,7 @@ "properties": { "denom_owners": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -8453,6 +8506,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -8517,15 +8571,14 @@ "type": "boolean" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/bank/v1beta1/denoms_metadata": { "get": { "summary": "DenomsMetadata queries the client metadata for all registered coin\ndenominations.", "operationId": "DenomsMetadata", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -8534,6 +8587,7 @@ "properties": { "metadatas": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -8542,6 +8596,7 @@ }, "denom_units": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -8556,6 +8611,7 @@ }, "aliases": { "type": "array", + "maxItems": 10, "items": { "type": "string" }, @@ -8633,6 +8689,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -8690,15 +8747,14 @@ "type": "boolean" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/bank/v1beta1/denoms_metadata/{denom}": { "get": { "summary": "DenomsMetadata queries the client metadata of a given coin denomination.", "operationId": "DenomMetadata", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -8713,6 +8769,7 @@ }, "denom_units": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -8727,6 +8784,7 @@ }, "aliases": { "type": "array", + "maxItems": 10, "items": { "type": "string" }, @@ -8786,6 +8844,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -8812,15 +8871,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/bank/v1beta1/params": { "get": { "summary": "Params queries the parameters of x/bank module.", "operationId": "BankParams", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -8832,6 +8890,7 @@ "properties": { "send_enabled": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -8873,6 +8932,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -8890,9 +8950,7 @@ } } }, - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/bank/v1beta1/send_enabled": { @@ -8900,6 +8958,7 @@ "summary": "SendEnabled queries for SendEnabled entries.", "description": "This query only returns denominations that have specific SendEnabled settings.\nAny denomination that does not have a specific setting will use the default\nparams.default_send_enabled, and will not be returned by this query.\n\nSince: cosmos-sdk 0.47", "operationId": "SendEnabled", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -8908,6 +8967,7 @@ "properties": { "send_enabled": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -8958,6 +9018,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -8982,6 +9043,7 @@ "in": "query", "required": false, "type": "array", + "maxItems": 10, "items": { "type": "string" }, @@ -9026,9 +9088,7 @@ "type": "boolean" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/bank/v1beta1/spendable_balances/{address}": { @@ -9036,6 +9096,7 @@ "summary": "SpendableBalances queries the spendable balance of all coins for a single\naccount.", "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.\n\nSince: cosmos-sdk 0.46", "operationId": "SpendableBalances", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -9044,6 +9105,7 @@ "properties": { "balances": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -9095,6 +9157,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -9159,9 +9222,7 @@ "type": "boolean" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/bank/v1beta1/spendable_balances/{address}/by_denom": { @@ -9169,6 +9230,7 @@ "summary": "SpendableBalanceByDenom queries the spendable balance of a single denom for\na single account.", "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.\n\nSince: cosmos-sdk 0.47", "operationId": "SpendableBalanceByDenom", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -9208,6 +9270,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -9241,9 +9304,7 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/bank/v1beta1/supply": { @@ -9251,6 +9312,7 @@ "summary": "TotalSupply queries the total supply of all coins.", "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", "operationId": "TotalSupply", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -9259,6 +9321,7 @@ "properties": { "supply": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -9310,6 +9373,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -9367,9 +9431,7 @@ "type": "boolean" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/bank/v1beta1/supply/by_denom": { @@ -9377,6 +9439,7 @@ "summary": "SupplyOf queries the supply of a single coin.", "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", "operationId": "SupplyOf", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -9416,6 +9479,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -9442,15 +9506,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/distribution/v1beta1/community_pool": { "get": { "summary": "CommunityPool queries the community pool coins.", "operationId": "CommunityPool", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -9459,6 +9522,7 @@ "properties": { "pool": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -9494,6 +9558,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -9511,15 +9576,14 @@ } } }, - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/distribution/v1beta1/delegators/{delegator_address}/rewards": { "get": { "summary": "DelegationTotalRewards queries the total rewards accrued by a each\nvalidator.", "operationId": "DelegationTotalRewards", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -9528,6 +9592,7 @@ "properties": { "rewards": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -9536,6 +9601,7 @@ }, "reward": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -9556,6 +9622,7 @@ }, "total": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -9591,6 +9658,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -9617,15 +9685,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/distribution/v1beta1/delegators/{delegator_address}/rewards/{validator_address}": { "get": { "summary": "DelegationRewards queries the total rewards accrued by a delegation.", "operationId": "DelegationRewards", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -9634,6 +9701,7 @@ "properties": { "rewards": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -9669,6 +9737,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -9702,15 +9771,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/distribution/v1beta1/delegators/{delegator_address}/validators": { "get": { "summary": "DelegatorValidators queries the validators of a delegator.", "operationId": "DistDelegatorValidators", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -9719,6 +9787,7 @@ "properties": { "validators": { "type": "array", + "maxItems": 10, "items": { "type": "string" }, @@ -9745,6 +9814,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -9771,15 +9841,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/distribution/v1beta1/delegators/{delegator_address}/withdraw_address": { "get": { "summary": "DelegatorWithdrawAddress queries withdraw address of a delegator.", "operationId": "DelegatorWithdrawAddress", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -9811,6 +9880,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -9837,15 +9907,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/distribution/v1beta1/params": { "get": { "summary": "Params queries params of the distribution module.", "operationId": "DistributionParams", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -9893,6 +9962,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -9910,15 +9980,14 @@ } } }, - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/distribution/v1beta1/validators/{validator_address}": { "get": { "summary": "ValidatorDistributionInfo queries validator commission and self-delegation rewards for validator", "operationId": "ValidatorDistributionInfo", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -9931,6 +10000,7 @@ }, "self_bond_rewards": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -9947,6 +10017,7 @@ }, "commission": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -9982,6 +10053,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -10008,15 +10080,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/distribution/v1beta1/validators/{validator_address}/commission": { "get": { "summary": "ValidatorCommission queries accumulated commission for a validator.", "operationId": "ValidatorCommission", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -10029,6 +10100,7 @@ "properties": { "commission": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -10065,6 +10137,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -10091,15 +10164,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/distribution/v1beta1/validators/{validator_address}/outstanding_rewards": { "get": { "summary": "ValidatorOutstandingRewards queries rewards of a validator address.", "operationId": "ValidatorOutstandingRewards", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -10111,6 +10183,7 @@ "properties": { "rewards": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -10148,6 +10221,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -10174,15 +10248,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/distribution/v1beta1/validators/{validator_address}/slashes": { "get": { "summary": "ValidatorSlashes queries slash events of a validator.", "operationId": "ValidatorSlashes", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -10191,6 +10264,7 @@ "properties": { "slashes": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -10243,6 +10317,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -10323,15 +10398,14 @@ "type": "boolean" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/feegrant/v1beta1/allowance/{granter}/{grantee}": { "get": { "summary": "Allowance returns fee granted to the grantee by the granter.", "operationId": "Allowance", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -10389,6 +10463,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -10425,15 +10500,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/feegrant/v1beta1/allowances/{grantee}": { "get": { "summary": "Allowances returns all the grants for address.", "operationId": "Allowances", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -10442,6 +10516,7 @@ "properties": { "allowances": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -10510,6 +10585,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -10576,9 +10652,7 @@ "type": "boolean" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/feegrant/v1beta1/issued/{granter}": { @@ -10586,6 +10660,7 @@ "summary": "AllowancesByGranter returns all the grants given by an address", "description": "Since: cosmos-sdk 0.46", "operationId": "AllowancesByGranter", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -10594,6 +10669,7 @@ "properties": { "allowances": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -10662,6 +10738,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -10728,15 +10805,14 @@ "type": "boolean" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/evidence/v1beta1/evidence": { "get": { "summary": "AllEvidence queries all evidence.", "operationId": "AllEvidence", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -10745,6 +10821,7 @@ "properties": { "evidence": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -10799,6 +10876,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -10859,15 +10937,14 @@ "type": "boolean" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/evidence/v1beta1/evidence/{hash}": { "get": { "summary": "Evidence queries evidence based on evidence hash.", "operationId": "Evidence", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -10910,6 +10987,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -10947,15 +11025,14 @@ "format": "byte" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/gov/v1beta1/params/{params_type}": { "get": { "summary": "Params queries all parameters of the gov module.", "operationId": "GovParams", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -10978,6 +11055,7 @@ "properties": { "min_deposit": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -11040,6 +11118,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -11069,15 +11148,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/gov/v1beta1/proposals": { "get": { "summary": "Proposals queries all proposals based on given status.", "operationId": "Proposals", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -11086,6 +11164,7 @@ "properties": { "proposals": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -11156,6 +11235,7 @@ }, "total_deposit": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -11222,6 +11302,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -11312,15 +11393,14 @@ "type": "boolean" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/gov/v1beta1/proposals/{proposal_id}": { "get": { "summary": "Proposal queries proposal details based on ProposalID.", "operationId": "Proposal", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -11397,6 +11477,7 @@ }, "total_deposit": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -11445,6 +11526,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -11475,15 +11557,14 @@ "format": "uint64" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/gov/v1beta1/proposals/{proposal_id}/deposits": { "get": { "summary": "Deposits queries all deposits of a single proposal.", "operationId": "Deposits", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -11492,6 +11573,7 @@ "properties": { "deposits": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -11506,6 +11588,7 @@ }, "amount": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -11562,6 +11645,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -11630,15 +11714,14 @@ "type": "boolean" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/gov/v1beta1/proposals/{proposal_id}/deposits/{depositor}": { "get": { "summary": "Deposit queries single deposit information based proposalID, depositAddr.", "operationId": "Deposit", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -11659,6 +11742,7 @@ }, "amount": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -11697,6 +11781,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -11734,15 +11819,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/gov/v1beta1/proposals/{proposal_id}/tally": { "get": { "summary": "TallyResult queries the tally of a proposal vote.", "operationId": "TallyResult", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -11792,6 +11876,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -11822,15 +11907,14 @@ "format": "uint64" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/gov/v1beta1/proposals/{proposal_id}/votes": { "get": { "summary": "Votes queries votes of a given proposal.", "operationId": "Votes", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -11839,6 +11923,7 @@ "properties": { "votes": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -11865,6 +11950,7 @@ }, "options": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -11931,6 +12017,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -11999,15 +12086,14 @@ "type": "boolean" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/gov/v1beta1/proposals/{proposal_id}/votes/{voter}": { "get": { "summary": "Vote queries voted information based on proposalID, voterAddr.", "operationId": "Vote", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -12040,6 +12126,7 @@ }, "options": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -12088,6 +12175,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -12125,15 +12213,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/gov/v1/params/{params_type}": { "get": { "summary": "Params queries all parameters of the gov module.", "operationId": "GovV1Params", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -12156,6 +12243,7 @@ "properties": { "min_deposit": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -12200,6 +12288,7 @@ "properties": { "min_deposit": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -12273,6 +12362,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -12302,15 +12392,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/gov/v1/proposals": { "get": { "summary": "Proposals queries all proposals based on given status.", "operationId": "GovV1Proposal", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -12319,6 +12408,7 @@ "properties": { "proposals": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -12329,6 +12419,7 @@ }, "messages": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -12393,6 +12484,7 @@ }, "total_deposit": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -12478,6 +12570,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -12568,15 +12661,14 @@ "type": "boolean" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/gov/v1/proposals/{proposal_id}": { "get": { "summary": "Proposal queries proposal details based on ProposalID.", "operationId": "GovV1Proposal", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -12593,6 +12685,7 @@ }, "messages": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -12657,6 +12750,7 @@ }, "total_deposit": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -12724,6 +12818,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -12754,15 +12849,14 @@ "format": "uint64" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/gov/v1/proposals/{proposal_id}/deposits": { "get": { "summary": "Deposits queries all deposits of a single proposal.", "operationId": "GovV1Deposit", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -12771,6 +12865,7 @@ "properties": { "deposits": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -12785,6 +12880,7 @@ }, "amount": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -12841,6 +12937,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -12909,15 +13006,14 @@ "type": "boolean" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/gov/v1/proposals/{proposal_id}/deposits/{depositor}": { "get": { "summary": "Deposit queries single deposit information based proposalID, depositAddr.", "operationId": "GovV1Deposit", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -12938,6 +13034,7 @@ }, "amount": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -12976,6 +13073,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -13013,15 +13111,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/gov/v1/proposals/{proposal_id}/tally": { "get": { "summary": "TallyResult queries the tally of a proposal vote.", "operationId": "GovV1TallyResult", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -13071,6 +13168,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -13101,15 +13199,14 @@ "format": "uint64" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/gov/v1/proposals/{proposal_id}/votes": { "get": { "summary": "Votes queries votes of a given proposal.", "operationId": "GovV1Votes", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -13118,6 +13215,7 @@ "properties": { "votes": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -13132,6 +13230,7 @@ }, "options": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -13202,6 +13301,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -13270,15 +13370,14 @@ "type": "boolean" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/gov/v1/proposals/{proposal_id}/votes/{voter}": { "get": { "summary": "Vote queries voted information based on proposalID, voterAddr.", "operationId": "GovV1Vote", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -13299,6 +13398,7 @@ }, "options": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -13351,6 +13451,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -13388,15 +13489,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/slashing/v1beta1/params": { "get": { "summary": "Params queries the parameters of slashing module", "operationId": "SlashingParams", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -13449,6 +13549,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -13466,15 +13567,14 @@ } } }, - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/slashing/v1beta1/signing_infos": { "get": { "summary": "SigningInfos queries signing info of all validators", "operationId": "SigningInfos", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -13483,6 +13583,7 @@ "properties": { "info": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -13555,6 +13656,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -13612,15 +13714,14 @@ "type": "boolean" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/slashing/v1beta1/signing_infos/{cons_address}": { "get": { "summary": "SigningInfo queries the signing info of given cons address", "operationId": "SigningInfo", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -13682,6 +13783,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -13708,9 +13810,7 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/staking/v1beta1/delegations/{delegator_addr}": { @@ -13718,6 +13818,7 @@ "summary": "DelegatorDelegations queries all delegations of a given delegator address.", "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", "operationId": "DelegatorDelegations", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -13726,6 +13827,7 @@ "properties": { "delegation_responses": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -13801,6 +13903,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -13868,9 +13971,7 @@ "type": "boolean" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/staking/v1beta1/delegators/{delegator_addr}/redelegations": { @@ -13878,6 +13979,7 @@ "summary": "Redelegations queries redelegations of given address.", "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", "operationId": "Redelegations", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -13886,6 +13988,7 @@ "properties": { "redelegation_responses": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -13906,6 +14009,7 @@ }, "entries": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -13947,6 +14051,7 @@ }, "entries": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -14032,6 +14137,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -14113,9 +14219,7 @@ "type": "boolean" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/staking/v1beta1/delegators/{delegator_addr}/unbonding_delegations": { @@ -14123,6 +14227,7 @@ "summary": "DelegatorUnbondingDelegations queries all unbonding delegations of a given\ndelegator address.", "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", "operationId": "DelegatorUnbondingDelegations", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -14131,6 +14236,7 @@ "properties": { "unbonding_responses": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -14144,6 +14250,7 @@ }, "entries": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -14221,6 +14328,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -14288,9 +14396,7 @@ "type": "boolean" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/staking/v1beta1/delegators/{delegator_addr}/validators": { @@ -14298,6 +14404,7 @@ "summary": "DelegatorValidators queries all validators info for given delegator\naddress.", "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", "operationId": "DelegatorValidators", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -14306,6 +14413,7 @@ "properties": { "validators": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -14427,6 +14535,7 @@ }, "unbonding_ids": { "type": "array", + "maxItems": 10, "items": { "type": "string", "format": "uint64" @@ -14475,6 +14584,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -14542,15 +14652,14 @@ "type": "boolean" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/staking/v1beta1/delegators/{delegator_addr}/validators/{validator_addr}": { "get": { "summary": "DelegatorValidator queries validator info for given delegator validator\npair.", "operationId": "DelegatorValidator", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -14678,6 +14787,7 @@ }, "unbonding_ids": { "type": "array", + "maxItems": 10, "items": { "type": "string", "format": "uint64" @@ -14708,6 +14818,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -14744,15 +14855,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/staking/v1beta1/historical_info/{height}": { "get": { "summary": "HistoricalInfo queries the historical info for given height.", "operationId": "HistoricalInfo", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -14860,6 +14970,7 @@ }, "valset": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -14981,6 +15092,7 @@ }, "unbonding_ids": { "type": "array", + "maxItems": 10, "items": { "type": "string", "format": "uint64" @@ -15014,6 +15126,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -15044,15 +15157,14 @@ "format": "int64" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/staking/v1beta1/params": { "get": { "summary": "Parameters queries the staking parameters.", "operationId": "StakingParams", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -15113,6 +15225,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -15133,15 +15246,14 @@ } } }, - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/staking/v1beta1/pool": { "get": { "summary": "Pool queries the pool info.", "operationId": "Pool", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -15181,6 +15293,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -15201,9 +15314,7 @@ } } }, - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/staking/v1beta1/validators": { @@ -15211,6 +15322,7 @@ "summary": "Validators queries all validators that match the given status.", "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", "operationId": "Validators", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -15219,6 +15331,7 @@ "properties": { "validators": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -15340,6 +15453,7 @@ }, "unbonding_ids": { "type": "array", + "maxItems": 10, "items": { "type": "string", "format": "uint64" @@ -15388,6 +15502,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -15455,15 +15570,14 @@ "type": "boolean" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/staking/v1beta1/validators/{validator_addr}": { "get": { "summary": "Validator queries validator info for given validator address.", "operationId": "Validator", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -15591,6 +15705,7 @@ }, "unbonding_ids": { "type": "array", + "maxItems": 10, "items": { "type": "string", "format": "uint64" @@ -15621,6 +15736,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -15650,9 +15766,7 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/staking/v1beta1/validators/{validator_addr}/delegations": { @@ -15660,6 +15774,7 @@ "summary": "ValidatorDelegations queries delegate info for given validator.", "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", "operationId": "ValidatorDelegations", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -15668,6 +15783,7 @@ "properties": { "delegation_responses": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -15742,6 +15858,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -15809,15 +15926,14 @@ "type": "boolean" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/staking/v1beta1/validators/{validator_addr}/delegations/{delegator_addr}": { "get": { "summary": "Delegation queries delegate info for given validator delegator pair.", "operationId": "Delegation", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -15881,6 +15997,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -15917,15 +16034,14 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/staking/v1beta1/validators/{validator_addr}/delegations/{delegator_addr}/unbonding_delegation": { "get": { "summary": "UnbondingDelegation queries unbonding info for given validator delegator\npair.", "operationId": "UnbondingDelegation", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -15945,6 +16061,7 @@ }, "entries": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -16005,6 +16122,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -16041,9 +16159,7 @@ "type": "string" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/staking/v1beta1/validators/{validator_addr}/unbonding_delegations": { @@ -16051,6 +16167,7 @@ "summary": "ValidatorUnbondingDelegations queries unbonding delegations of a validator.", "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", "operationId": "ValidatorUnbondingDelegations", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -16059,6 +16176,7 @@ "properties": { "unbonding_responses": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -16072,6 +16190,7 @@ }, "entries": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -16149,6 +16268,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -16216,9 +16336,7 @@ "type": "boolean" } ], - "tags": [ - "Query" - ] + "tags": ["Query"] } }, "/cosmos/tx/v1beta1/decode": { @@ -16226,6 +16344,8 @@ "summary": "TxDecode decodes the transaction.", "description": "Since: cosmos-sdk 0.47", "operationId": "TxDecode", + "consumes": ["application/json"], + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -16250,6 +16370,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -16288,9 +16409,7 @@ } } ], - "tags": [ - "Service" - ] + "tags": ["Service"] } }, "/cosmos/tx/v1beta1/decode/amino": { @@ -16298,6 +16417,8 @@ "summary": "TxDecodeAmino decodes an Amino transaction from encoded bytes to JSON.", "description": "Since: cosmos-sdk 0.47", "operationId": "TxDecodeAmino", + "consumes": ["application/json"], + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -16328,6 +16449,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -16365,9 +16487,7 @@ } } ], - "tags": [ - "Service" - ] + "tags": ["Service"] } }, "/cosmos/tx/v1beta1/encode": { @@ -16375,6 +16495,8 @@ "summary": "TxEncode encodes the transaction.", "description": "Since: cosmos-sdk 0.47", "operationId": "TxEncode", + "consumes": ["application/json"], + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -16407,6 +16529,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -16437,9 +16560,7 @@ } } ], - "tags": [ - "Service" - ] + "tags": ["Service"] } }, "/cosmos/tx/v1beta1/encode/amino": { @@ -16447,6 +16568,8 @@ "summary": "TxEncodeAmino encodes an Amino transaction from JSON to encoded bytes.", "description": "Since: cosmos-sdk 0.47", "operationId": "TxEncodeAmino", + "consumes": ["application/json"], + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -16478,6 +16601,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -16514,15 +16638,15 @@ } } ], - "tags": [ - "Service" - ] + "tags": ["Service"] } }, "/cosmos/tx/v1beta1/simulate": { "post": { "summary": "Simulate simulates executing a transaction for estimating gas usage.", "operationId": "Simulate", + "consumes": ["application/json"], + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -16560,6 +16684,7 @@ }, "events": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -16568,6 +16693,7 @@ }, "attributes": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -16591,6 +16717,7 @@ }, "msg_responses": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -16631,6 +16758,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -16661,15 +16789,14 @@ } } ], - "tags": [ - "Service" - ] + "tags": ["Service"] } }, "/cosmos/tx/v1beta1/txs": { "get": { "summary": "GetTxsEvent fetches txs by event.", "operationId": "GetTxsEvent", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -16694,6 +16821,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -16721,6 +16849,7 @@ "in": "query", "required": false, "type": "array", + "maxItems": 10, "items": { "type": "string" }, @@ -16770,11 +16899,7 @@ "in": "query", "required": false, "type": "string", - "enum": [ - "ORDER_BY_UNSPECIFIED", - "ORDER_BY_ASC", - "ORDER_BY_DESC" - ], + "enum": ["ORDER_BY_UNSPECIFIED", "ORDER_BY_ASC", "ORDER_BY_DESC"], "default": "ORDER_BY_UNSPECIFIED" }, { @@ -16794,13 +16919,13 @@ "format": "uint64" } ], - "tags": [ - "Service" - ] + "tags": ["Service"] }, "post": { "summary": "BroadcastTx broadcast transaction.", "operationId": "BroadcastTx", + "produces": ["application/json"], + "consumes": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -16838,6 +16963,7 @@ }, "logs": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -16850,6 +16976,7 @@ }, "events": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -16858,6 +16985,7 @@ }, "attributes": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -16916,6 +17044,7 @@ }, "events": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -16924,6 +17053,7 @@ }, "attributes": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -16969,6 +17099,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -17018,9 +17149,7 @@ } } ], - "tags": [ - "Service" - ] + "tags": ["Service"] } }, "/cosmos/tx/v1beta1/txs/block/{height}": { @@ -17028,6 +17157,7 @@ "summary": "GetBlockWithTxs fetches a block with decoded txs.", "description": "Since: cosmos-sdk 0.45.2", "operationId": "GetBlockWithTxs", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -17052,6 +17182,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -17120,15 +17251,14 @@ "type": "boolean" } ], - "tags": [ - "Service" - ] + "tags": ["Service"] } }, "/cosmos/tx/v1beta1/txs/{hash}": { "get": { "summary": "GetTx fetches a tx by hash.", "operationId": "GetTx", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -17153,6 +17283,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -17182,9 +17313,7 @@ "type": "string" } ], - "tags": [ - "Service" - ] + "tags": ["Service"] } }, "/cosmos/base/tendermint/v1beta1/abci_query": { @@ -17192,6 +17321,7 @@ "summary": "ABCIQuery defines a query handler that supports ABCI queries directly to the\napplication, bypassing Tendermint completely. The ABCI query must contain\na valid and supported path, including app, custom, p2p, and store.", "description": "Since: cosmos-sdk 0.46", "operationId": "ABCIQuery", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -17225,6 +17355,7 @@ "properties": { "ops": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -17274,6 +17405,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -17322,15 +17454,14 @@ "type": "boolean" } ], - "tags": [ - "Service" - ] + "tags": ["Service"] } }, "/cosmos/base/tendermint/v1beta1/blocks/latest": { "get": { "summary": "GetLatestBlock returns the latest block.", "operationId": "GetLatestBlock", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -17465,6 +17596,7 @@ "properties": { "txs": { "type": "array", + "maxItems": 10, "items": { "type": "string", "format": "byte" @@ -17479,6 +17611,7 @@ "properties": { "evidence": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -17771,6 +17904,7 @@ }, "signatures": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -17811,6 +17945,7 @@ "properties": { "validators": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -17888,6 +18023,7 @@ }, "byzantine_validators": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -17973,6 +18109,7 @@ }, "signatures": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -18112,6 +18249,7 @@ "properties": { "txs": { "type": "array", + "maxItems": 10, "items": { "type": "string", "format": "byte" @@ -18126,6 +18264,7 @@ "properties": { "evidence": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -18418,6 +18557,7 @@ }, "signatures": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -18458,6 +18598,7 @@ "properties": { "validators": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -18535,6 +18676,7 @@ }, "byzantine_validators": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -18620,6 +18762,7 @@ }, "signatures": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -18677,6 +18820,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -18697,15 +18841,14 @@ } } }, - "tags": [ - "Service" - ] + "tags": ["Service"] } }, "/cosmos/base/tendermint/v1beta1/blocks/{height}": { "get": { "summary": "GetBlockByHeight queries block for given height.", "operationId": "GetBlockByHeight", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -18840,6 +18983,7 @@ "properties": { "txs": { "type": "array", + "maxItems": 10, "items": { "type": "string", "format": "byte" @@ -18854,6 +18998,7 @@ "properties": { "evidence": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -19146,6 +19291,7 @@ }, "signatures": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -19186,6 +19332,7 @@ "properties": { "validators": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -19263,6 +19410,7 @@ }, "byzantine_validators": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -19348,6 +19496,7 @@ }, "signatures": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -19487,6 +19636,7 @@ "properties": { "txs": { "type": "array", + "maxItems": 10, "items": { "type": "string", "format": "byte" @@ -19501,6 +19651,7 @@ "properties": { "evidence": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -19793,6 +19944,7 @@ }, "signatures": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -19833,6 +19985,7 @@ "properties": { "validators": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -19910,6 +20063,7 @@ }, "byzantine_validators": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -19995,6 +20149,7 @@ }, "signatures": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -20052,6 +20207,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -20081,15 +20237,14 @@ "format": "int64" } ], - "tags": [ - "Service" - ] + "tags": ["Service"] } }, "/cosmos/base/tendermint/v1beta1/node_info": { "get": { "summary": "GetNodeInfo queries the current node info.", "operationId": "GetNodeInfo", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -20171,6 +20326,7 @@ }, "build_deps": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -20218,6 +20374,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -20238,15 +20395,14 @@ } } }, - "tags": [ - "Service" - ] + "tags": ["Service"] } }, "/cosmos/base/tendermint/v1beta1/syncing": { "get": { "summary": "GetSyncing queries node syncing.", "operationId": "GetSyncing", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -20277,6 +20433,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -20297,15 +20454,14 @@ } } }, - "tags": [ - "Service" - ] + "tags": ["Service"] } }, "/cosmos/base/tendermint/v1beta1/validatorsets/latest": { "get": { "summary": "GetLatestValidatorSet queries latest validator-set.", "operationId": "GetLatestValidatorSet", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -20318,6 +20474,7 @@ }, "validators": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -20388,6 +20545,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -20448,15 +20606,14 @@ "type": "boolean" } ], - "tags": [ - "Service" - ] + "tags": ["Service"] } }, "/cosmos/base/tendermint/v1beta1/validatorsets/{height}": { "get": { "summary": "GetValidatorSetByHeight queries validator-set at a given height.", "operationId": "GetValidatorSetByHeight", + "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -20469,6 +20626,7 @@ }, "validators": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -20539,6 +20697,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -20606,9 +20765,7 @@ "type": "boolean" } ], - "tags": [ - "Service" - ] + "tags": ["Service"] } } }, @@ -20713,6 +20870,7 @@ "properties": { "epochs": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -20802,6 +20960,7 @@ }, "details": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -20822,11 +20981,7 @@ }, "evmos.erc20.v1.Owner": { "type": "string", - "enum": [ - "OWNER_UNSPECIFIED", - "OWNER_MODULE", - "OWNER_EXTERNAL" - ], + "enum": ["OWNER_UNSPECIFIED", "OWNER_MODULE", "OWNER_EXTERNAL"], "default": "OWNER_UNSPECIFIED", "description": "Owner enumerates the ownership of a ERC20 contract.\n\n - OWNER_UNSPECIFIED: OWNER_UNSPECIFIED defines an invalid/undefined owner.\n - OWNER_MODULE: OWNER_MODULE - erc20 is owned by the erc20 module account.\n - OWNER_EXTERNAL: OWNER_EXTERNAL - erc20 is owned by an external account." }, @@ -20885,11 +21040,7 @@ "contract_owner": { "title": "contract_owner is the an ENUM specifying the type of ERC20 owner (0 invalid, 1 ModuleAccount, 2 external address)", "type": "string", - "enum": [ - "OWNER_UNSPECIFIED", - "OWNER_MODULE", - "OWNER_EXTERNAL" - ], + "enum": ["OWNER_UNSPECIFIED", "OWNER_MODULE", "OWNER_EXTERNAL"], "default": "OWNER_UNSPECIFIED", "description": "Owner enumerates the ownership of a ERC20 contract.\n\n - OWNER_UNSPECIFIED: OWNER_UNSPECIFIED defines an invalid/undefined owner.\n - OWNER_MODULE: OWNER_MODULE - erc20 is owned by the erc20 module account.\n - OWNER_EXTERNAL: OWNER_EXTERNAL - erc20 is owned by an external account." } @@ -20905,6 +21056,7 @@ "properties": { "token_pairs": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -20923,11 +21075,7 @@ "contract_owner": { "title": "contract_owner is the an ENUM specifying the type of ERC20 owner (0 invalid, 1 ModuleAccount, 2 external address)", "type": "string", - "enum": [ - "OWNER_UNSPECIFIED", - "OWNER_MODULE", - "OWNER_EXTERNAL" - ], + "enum": ["OWNER_UNSPECIFIED", "OWNER_MODULE", "OWNER_EXTERNAL"], "default": "OWNER_UNSPECIFIED", "description": "Owner enumerates the ownership of a ERC20 contract.\n\n - OWNER_UNSPECIFIED: OWNER_UNSPECIFIED defines an invalid/undefined owner.\n - OWNER_MODULE: OWNER_MODULE - erc20 is owned by the erc20 module account.\n - OWNER_EXTERNAL: OWNER_EXTERNAL - erc20 is owned by an external account." } @@ -20973,11 +21121,7 @@ "contract_owner": { "title": "contract_owner is the an ENUM specifying the type of ERC20 owner (0 invalid, 1 ModuleAccount, 2 external address)", "type": "string", - "enum": [ - "OWNER_UNSPECIFIED", - "OWNER_MODULE", - "OWNER_EXTERNAL" - ], + "enum": ["OWNER_UNSPECIFIED", "OWNER_MODULE", "OWNER_EXTERNAL"], "default": "OWNER_UNSPECIFIED", "description": "Owner enumerates the ownership of a ERC20 contract.\n\n - OWNER_UNSPECIFIED: OWNER_UNSPECIFIED defines an invalid/undefined owner.\n - OWNER_MODULE: OWNER_MODULE - erc20 is owned by the erc20 module account.\n - OWNER_EXTERNAL: OWNER_EXTERNAL - erc20 is owned by an external account." } @@ -21248,6 +21392,7 @@ "properties": { "locked": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -21264,6 +21409,7 @@ }, "unvested": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -21280,6 +21426,7 @@ }, "vested": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -21399,6 +21546,7 @@ }, "topics": { "type": "array", + "maxItems": 10, "items": { "type": "string" }, @@ -21483,6 +21631,7 @@ }, "logs": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -21492,6 +21641,7 @@ }, "topics": { "type": "array", + "maxItems": 10, "items": { "type": "string" }, @@ -21568,6 +21718,7 @@ }, "extra_eips": { "type": "array", + "maxItems": 10, "items": { "type": "string", "format": "int64" @@ -21663,6 +21814,7 @@ }, "active_precompiles": { "type": "array", + "maxItems": 10, "items": { "type": "string" }, @@ -21670,6 +21822,7 @@ }, "evm_channels": { "type": "array", + "maxItems": 10, "items": { "type": "string" }, @@ -21769,6 +21922,7 @@ }, "extra_eips": { "type": "array", + "maxItems": 10, "items": { "type": "string", "format": "int64" @@ -21864,6 +22018,7 @@ }, "active_precompiles": { "type": "array", + "maxItems": 10, "items": { "type": "string" }, @@ -21871,6 +22026,7 @@ }, "evm_channels": { "type": "array", + "maxItems": 10, "items": { "type": "string" }, @@ -22230,6 +22386,7 @@ "properties": { "denom_traces": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -22400,6 +22557,7 @@ "properties": { "allowed_clients": { "type": "array", + "maxItems": 10, "items": { "type": "string" }, @@ -22417,6 +22575,7 @@ "properties": { "allowed_clients": { "type": "array", + "maxItems": 10, "items": { "type": "string" }, @@ -22476,6 +22635,7 @@ "properties": { "client_states": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -22538,6 +22698,7 @@ "properties": { "consensus_state_heights": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -22626,6 +22787,7 @@ "properties": { "consensus_states": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -22750,6 +22912,7 @@ }, "versions": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -22759,6 +22922,7 @@ }, "features": { "type": "array", + "maxItems": 10, "items": { "type": "string" }, @@ -22851,6 +23015,7 @@ }, "versions": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -22860,6 +23025,7 @@ }, "features": { "type": "array", + "maxItems": 10, "items": { "type": "string" }, @@ -22930,6 +23096,7 @@ "properties": { "connection_paths": { "type": "array", + "maxItems": 10, "items": { "type": "string" }, @@ -23093,6 +23260,7 @@ }, "versions": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -23102,6 +23270,7 @@ }, "features": { "type": "array", + "maxItems": 10, "items": { "type": "string" }, @@ -23186,6 +23355,7 @@ "properties": { "connections": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -23199,6 +23369,7 @@ }, "versions": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -23208,6 +23379,7 @@ }, "features": { "type": "array", + "maxItems": 10, "items": { "type": "string" }, @@ -23321,6 +23493,7 @@ }, "features": { "type": "array", + "maxItems": 10, "items": { "type": "string" }, @@ -23372,6 +23545,7 @@ }, "connection_hops": { "type": "array", + "maxItems": 10, "items": { "type": "string" }, @@ -23441,6 +23615,7 @@ }, "connection_hops": { "type": "array", + "maxItems": 10, "items": { "type": "string" }, @@ -23463,11 +23638,7 @@ }, "ibc.core.channel.v1.Order": { "type": "string", - "enum": [ - "ORDER_NONE_UNSPECIFIED", - "ORDER_UNORDERED", - "ORDER_ORDERED" - ], + "enum": ["ORDER_NONE_UNSPECIFIED", "ORDER_UNORDERED", "ORDER_ORDERED"], "default": "ORDER_NONE_UNSPECIFIED", "description": "- ORDER_NONE_UNSPECIFIED: zero-value for channel ordering\n - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in\nwhich they were sent.\n - ORDER_ORDERED: packets are delivered exactly in the order which they were sent", "title": "Order defines if a channel is ORDERED or UNORDERED" @@ -23646,6 +23817,7 @@ }, "connection_hops": { "type": "array", + "maxItems": 10, "items": { "type": "string" }, @@ -23688,6 +23860,7 @@ "properties": { "channels": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -23731,6 +23904,7 @@ }, "connection_hops": { "type": "array", + "maxItems": 10, "items": { "type": "string" }, @@ -23795,6 +23969,7 @@ "properties": { "channels": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -23838,6 +24013,7 @@ }, "connection_hops": { "type": "array", + "maxItems": 10, "items": { "type": "string" }, @@ -23968,6 +24144,7 @@ "properties": { "acknowledgements": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -24068,6 +24245,7 @@ "properties": { "commitments": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -24167,6 +24345,7 @@ "properties": { "sequences": { "type": "array", + "maxItems": 10, "items": { "type": "string", "format": "uint64" @@ -24198,6 +24377,7 @@ "properties": { "sequences": { "type": "array", + "maxItems": 10, "items": { "type": "string", "format": "uint64" @@ -24396,6 +24576,7 @@ "properties": { "accounts": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -24458,6 +24639,7 @@ "properties": { "accounts": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -24571,6 +24753,7 @@ "properties": { "grants": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -24628,6 +24811,7 @@ "properties": { "grants": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -24685,6 +24869,7 @@ "properties": { "grants": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -24768,6 +24953,7 @@ }, "aliases": { "type": "array", + "maxItems": 10, "items": { "type": "string" }, @@ -24784,6 +24970,7 @@ }, "denom_units": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -24798,6 +24985,7 @@ }, "aliases": { "type": "array", + "maxItems": 10, "items": { "type": "string" }, @@ -24841,6 +25029,7 @@ "properties": { "send_enabled": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -24866,6 +25055,7 @@ "properties": { "balances": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -24928,6 +25118,7 @@ }, "denom_units": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -24942,6 +25133,7 @@ }, "aliases": { "type": "array", + "maxItems": 10, "items": { "type": "string" }, @@ -24988,6 +25180,7 @@ "properties": { "denom_owners": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -25035,6 +25228,7 @@ "properties": { "metadatas": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -25043,6 +25237,7 @@ }, "denom_units": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -25057,6 +25252,7 @@ }, "aliases": { "type": "array", + "maxItems": 10, "items": { "type": "string" }, @@ -25124,6 +25320,7 @@ "properties": { "send_enabled": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -25152,6 +25349,7 @@ "properties": { "send_enabled": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -25207,6 +25405,7 @@ "properties": { "balances": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -25263,6 +25462,7 @@ "properties": { "supply": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -25316,6 +25516,7 @@ }, "reward": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -25357,6 +25558,7 @@ "properties": { "pool": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -25379,6 +25581,7 @@ "properties": { "rewards": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -25401,6 +25604,7 @@ "properties": { "rewards": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -25409,6 +25613,7 @@ }, "reward": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -25429,6 +25634,7 @@ }, "total": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -25451,6 +25657,7 @@ "properties": { "validators": { "type": "array", + "maxItems": 10, "items": { "type": "string" }, @@ -25504,6 +25711,7 @@ "properties": { "commission": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -25531,6 +25739,7 @@ }, "self_bond_rewards": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -25547,6 +25756,7 @@ }, "commission": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -25572,6 +25782,7 @@ "properties": { "rewards": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -25596,6 +25807,7 @@ "properties": { "slashes": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -25635,6 +25847,7 @@ "properties": { "commission": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -25656,6 +25869,7 @@ "properties": { "rewards": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -25755,6 +25969,7 @@ "properties": { "allowances": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -25810,6 +26025,7 @@ "properties": { "allowances": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -25865,6 +26081,7 @@ "properties": { "evidence": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -25936,6 +26153,7 @@ }, "amount": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -25958,6 +26176,7 @@ "properties": { "min_deposit": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -26049,6 +26268,7 @@ }, "total_deposit": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -26106,6 +26326,7 @@ }, "amount": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -26131,6 +26352,7 @@ "properties": { "deposits": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -26145,6 +26367,7 @@ }, "amount": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -26202,6 +26425,7 @@ "properties": { "min_deposit": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -26319,6 +26543,7 @@ }, "total_deposit": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -26354,6 +26579,7 @@ "properties": { "proposals": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -26424,6 +26650,7 @@ }, "total_deposit": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -26529,6 +26756,7 @@ }, "options": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -26564,6 +26792,7 @@ "properties": { "votes": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -26590,6 +26819,7 @@ }, "options": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -26707,6 +26937,7 @@ }, "options": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -26792,6 +27023,7 @@ }, "amount": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -26814,6 +27046,7 @@ "properties": { "min_deposit": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -26840,6 +27073,7 @@ "properties": { "min_deposit": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -26903,6 +27137,7 @@ }, "messages": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -26967,6 +27202,7 @@ }, "total_deposit": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -27043,6 +27279,7 @@ }, "amount": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -27068,6 +27305,7 @@ "properties": { "deposits": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -27082,6 +27320,7 @@ }, "amount": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -27139,6 +27378,7 @@ "properties": { "min_deposit": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -27183,6 +27423,7 @@ "properties": { "min_deposit": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -27251,6 +27492,7 @@ }, "messages": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -27315,6 +27557,7 @@ }, "total_deposit": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -27369,6 +27612,7 @@ "properties": { "proposals": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -27379,6 +27623,7 @@ }, "messages": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -27443,6 +27688,7 @@ }, "total_deposit": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -27555,6 +27801,7 @@ }, "options": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -27594,6 +27841,7 @@ "properties": { "votes": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -27608,6 +27856,7 @@ }, "options": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -27714,6 +27963,7 @@ }, "options": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -27890,6 +28140,7 @@ "properties": { "info": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -28215,6 +28466,7 @@ }, "valset": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -28336,6 +28588,7 @@ }, "unbonding_ids": { "type": "array", + "maxItems": 10, "items": { "type": "string", "format": "uint64" @@ -28441,6 +28694,7 @@ "properties": { "delegation_responses": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -28503,6 +28757,7 @@ "properties": { "unbonding_responses": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -28516,6 +28771,7 @@ }, "entries": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -28699,6 +28955,7 @@ }, "unbonding_ids": { "type": "array", + "maxItems": 10, "items": { "type": "string", "format": "uint64" @@ -28716,6 +28973,7 @@ "properties": { "validators": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -28837,6 +29095,7 @@ }, "unbonding_ids": { "type": "array", + "maxItems": 10, "items": { "type": "string", "format": "uint64" @@ -28971,6 +29230,7 @@ }, "valset": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -29092,6 +29352,7 @@ }, "unbonding_ids": { "type": "array", + "maxItems": 10, "items": { "type": "string", "format": "uint64" @@ -29169,6 +29430,7 @@ "properties": { "redelegation_responses": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -29189,6 +29451,7 @@ }, "entries": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -29230,6 +29493,7 @@ }, "entries": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -29313,6 +29577,7 @@ }, "entries": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -29360,6 +29625,7 @@ "properties": { "delegation_responses": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -29540,6 +29806,7 @@ }, "unbonding_ids": { "type": "array", + "maxItems": 10, "items": { "type": "string", "format": "uint64" @@ -29557,6 +29824,7 @@ "properties": { "unbonding_responses": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -29570,6 +29838,7 @@ }, "entries": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -29634,6 +29903,7 @@ "properties": { "validators": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -29755,6 +30025,7 @@ }, "unbonding_ids": { "type": "array", + "maxItems": 10, "items": { "type": "string", "format": "uint64" @@ -29802,6 +30073,7 @@ }, "entries": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -29938,6 +30210,7 @@ }, "entries": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -29979,6 +30252,7 @@ }, "entries": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -30039,6 +30313,7 @@ }, "entries": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -30233,6 +30508,7 @@ }, "unbonding_ids": { "type": "array", + "maxItems": 10, "items": { "type": "string", "format": "uint64" @@ -30401,6 +30677,7 @@ }, "events": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -30409,6 +30686,7 @@ }, "attributes": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -30472,6 +30750,7 @@ }, "events": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -30480,6 +30759,7 @@ }, "attributes": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -30503,6 +30783,7 @@ }, "msg_responses": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -30531,6 +30812,7 @@ }, "attributes": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -30578,6 +30860,7 @@ }, "logs": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -30590,6 +30873,7 @@ }, "events": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -30598,6 +30882,7 @@ }, "attributes": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -30656,6 +30941,7 @@ }, "events": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -30664,6 +30950,7 @@ }, "attributes": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -30720,6 +31007,7 @@ "properties": { "signer_infos": { "type": "array", + "maxItems": 10, "items": { "$ref": "#/definitions/cosmos.tx.v1beta1.SignerInfo" }, @@ -30731,6 +31019,7 @@ "properties": { "amount": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -30766,6 +31055,7 @@ "properties": { "amount": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -30856,6 +31146,7 @@ }, "logs": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -30868,6 +31159,7 @@ }, "events": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -30876,6 +31168,7 @@ }, "attributes": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -30934,6 +31227,7 @@ }, "events": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -30942,6 +31236,7 @@ }, "attributes": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -30974,6 +31269,7 @@ "properties": { "amount": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -31009,6 +31305,7 @@ "properties": { "txs": { "type": "array", + "maxItems": 10, "items": { "$ref": "#/definitions/cosmos.tx.v1beta1.Tx" }, @@ -31141,6 +31438,7 @@ "properties": { "txs": { "type": "array", + "maxItems": 10, "items": { "type": "string", "format": "byte" @@ -31155,6 +31453,7 @@ "properties": { "evidence": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -31447,6 +31746,7 @@ }, "signatures": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -31487,6 +31787,7 @@ "properties": { "validators": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -31564,6 +31865,7 @@ }, "byzantine_validators": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -31649,6 +31951,7 @@ }, "signatures": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -31741,6 +32044,7 @@ }, "logs": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -31753,6 +32057,7 @@ }, "events": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -31761,6 +32066,7 @@ }, "attributes": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -31819,6 +32125,7 @@ }, "events": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -31827,6 +32134,7 @@ }, "attributes": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -31859,6 +32167,7 @@ "properties": { "txs": { "type": "array", + "maxItems": 10, "items": { "$ref": "#/definitions/cosmos.tx.v1beta1.Tx" }, @@ -31866,6 +32175,7 @@ }, "tx_responses": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -31897,6 +32207,7 @@ }, "logs": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -31909,6 +32220,7 @@ }, "events": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -31917,6 +32229,7 @@ }, "attributes": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -31975,6 +32288,7 @@ }, "events": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -31983,6 +32297,7 @@ }, "attributes": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -32083,6 +32398,7 @@ }, "mode_infos": { "type": "array", + "maxItems": 10, "items": { "$ref": "#/definitions/cosmos.tx.v1beta1.ModeInfo" }, @@ -32113,11 +32429,7 @@ }, "cosmos.tx.v1beta1.OrderBy": { "type": "string", - "enum": [ - "ORDER_BY_UNSPECIFIED", - "ORDER_BY_ASC", - "ORDER_BY_DESC" - ], + "enum": ["ORDER_BY_UNSPECIFIED", "ORDER_BY_ASC", "ORDER_BY_DESC"], "default": "ORDER_BY_UNSPECIFIED", "description": "- ORDER_BY_UNSPECIFIED: ORDER_BY_UNSPECIFIED specifies an unknown sorting order. OrderBy defaults to ASC in this case.\n - ORDER_BY_ASC: ORDER_BY_ASC defines ascending order\n - ORDER_BY_DESC: ORDER_BY_DESC defines descending order", "title": "OrderBy defines the sorting order" @@ -32201,6 +32513,7 @@ }, "events": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -32209,6 +32522,7 @@ }, "attributes": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -32232,6 +32546,7 @@ }, "msg_responses": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -32259,6 +32574,7 @@ "properties": { "amount": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -32289,6 +32605,7 @@ "properties": { "messages": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -32317,6 +32634,7 @@ }, "extension_options": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -32336,6 +32654,7 @@ }, "non_critical_extension_options": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -32362,6 +32681,7 @@ }, "signatures": { "type": "array", + "maxItems": 10, "items": { "type": "string", "format": "byte" @@ -32376,6 +32696,7 @@ "properties": { "messages": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -32404,6 +32725,7 @@ }, "extension_options": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -32423,6 +32745,7 @@ }, "non_critical_extension_options": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -32531,6 +32854,7 @@ }, "attributes": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -32682,6 +33006,7 @@ "properties": { "txs": { "type": "array", + "maxItems": 10, "items": { "type": "string", "format": "byte" @@ -32696,6 +33021,7 @@ "properties": { "evidence": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -32988,6 +33314,7 @@ }, "signatures": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -33028,6 +33355,7 @@ "properties": { "validators": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -33105,6 +33433,7 @@ }, "byzantine_validators": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -33190,6 +33519,7 @@ }, "signatures": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -33273,6 +33603,7 @@ }, "signatures": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -33340,6 +33671,7 @@ "properties": { "txs": { "type": "array", + "maxItems": 10, "items": { "type": "string", "format": "byte" @@ -33789,6 +34121,7 @@ }, "signatures": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -33829,6 +34162,7 @@ "properties": { "validators": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -33906,6 +34240,7 @@ }, "byzantine_validators": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -33956,6 +34291,7 @@ "properties": { "evidence": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -34248,6 +34584,7 @@ }, "signatures": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -34288,6 +34625,7 @@ "properties": { "validators": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -34365,6 +34703,7 @@ }, "byzantine_validators": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -34551,6 +34890,7 @@ }, "signatures": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -34591,6 +34931,7 @@ "properties": { "validators": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -34803,6 +35144,7 @@ }, "signatures": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -34843,6 +35185,7 @@ "properties": { "validators": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -34920,6 +35263,7 @@ }, "byzantine_validators": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -35098,6 +35442,7 @@ }, "signatures": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -35180,6 +35525,7 @@ "properties": { "validators": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -35344,6 +35690,7 @@ "properties": { "ops": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -35478,6 +35825,7 @@ "properties": { "txs": { "type": "array", + "maxItems": 10, "items": { "type": "string", "format": "byte" @@ -35492,6 +35840,7 @@ "properties": { "evidence": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -35784,6 +36133,7 @@ }, "signatures": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -35824,6 +36174,7 @@ "properties": { "validators": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -35901,6 +36252,7 @@ }, "byzantine_validators": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -35986,6 +36338,7 @@ }, "signatures": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -36153,6 +36506,7 @@ "properties": { "txs": { "type": "array", + "maxItems": 10, "items": { "type": "string", "format": "byte" @@ -36167,6 +36521,7 @@ "properties": { "evidence": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -36459,6 +36814,7 @@ }, "signatures": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -36499,6 +36855,7 @@ "properties": { "validators": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -36576,6 +36933,7 @@ }, "byzantine_validators": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -36661,6 +37019,7 @@ }, "signatures": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -36800,6 +37159,7 @@ "properties": { "txs": { "type": "array", + "maxItems": 10, "items": { "type": "string", "format": "byte" @@ -36814,6 +37174,7 @@ "properties": { "evidence": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -37106,6 +37467,7 @@ }, "signatures": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -37146,6 +37508,7 @@ "properties": { "validators": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -37223,6 +37586,7 @@ }, "byzantine_validators": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -37308,6 +37672,7 @@ }, "signatures": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -37478,6 +37843,7 @@ "properties": { "txs": { "type": "array", + "maxItems": 10, "items": { "type": "string", "format": "byte" @@ -37492,6 +37858,7 @@ "properties": { "evidence": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -37784,6 +38151,7 @@ }, "signatures": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -37824,6 +38192,7 @@ "properties": { "validators": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -37901,6 +38270,7 @@ }, "byzantine_validators": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -37986,6 +38356,7 @@ }, "signatures": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -38125,6 +38496,7 @@ "properties": { "txs": { "type": "array", + "maxItems": 10, "items": { "type": "string", "format": "byte" @@ -38139,6 +38511,7 @@ "properties": { "evidence": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -38431,6 +38804,7 @@ }, "signatures": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -38471,6 +38845,7 @@ "properties": { "validators": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -38548,6 +38923,7 @@ }, "byzantine_validators": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -38633,6 +39009,7 @@ }, "signatures": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -38681,6 +39058,7 @@ }, "validators": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -38811,6 +39189,7 @@ }, "build_deps": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -38858,6 +39237,7 @@ }, "validators": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -39045,6 +39425,7 @@ "properties": { "ops": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -39121,6 +39502,7 @@ }, "build_deps": { "type": "array", + "maxItems": 10, "items": { "type": "object", "properties": { @@ -39228,4 +39610,4 @@ } } } -} \ No newline at end of file +} diff --git a/tests/e2e/Dockerfile.repo b/tests/e2e/Dockerfile.repo index 29bd05dc63..5e6c5eeddb 100644 --- a/tests/e2e/Dockerfile.repo +++ b/tests/e2e/Dockerfile.repo @@ -1,5 +1,6 @@ FROM golang:1.22.2-bullseye AS build-env +# checkov:skip=CKV_DOCKER_3:No need to create a user, this is only used on tests ARG BRANCH_NAME WORKDIR /go/src/github.com/evmos/ @@ -8,14 +9,13 @@ RUN git clone "https://github.com/evmos/evmos.git" WORKDIR /go/src/github.com/evmos/evmos -RUN apt-get update -y - RUN git checkout ${BRANCH_NAME} RUN make build FROM golang:1.22.2-bullseye +# checkov:skip=CKV_DOCKER_5:No problem if it is cached because targets specific version RUN apt-get update \ && apt-get install jq=1.6-2.1 -y --no-install-recommends \ && apt-get clean \ @@ -31,5 +31,6 @@ RUN chmod +x init-node.sh COPY --from=build-env /go/src/github.com/evmos/evmos/build/evmosd /usr/bin/evmosd EXPOSE 26656 26657 1317 9090 8545 8546 +HEALTHCHECK CMD curl --fail http://localhost:26657 || exit 1 CMD ["sh", "./init-node.sh"] diff --git a/tests/e2e/upgrade/Dockerfile.init b/tests/e2e/upgrade/Dockerfile.init index 39bf832f09..fc87806989 100644 --- a/tests/e2e/upgrade/Dockerfile.init +++ b/tests/e2e/upgrade/Dockerfile.init @@ -1,5 +1,6 @@ # argument to provide specific version of evmos node ARG INITIAL_VERSION +# checkov:skip=CKV_DOCKER_3:No need to create a user, this is only used on tests FROM tharsishq/evmos:$INITIAL_VERSION WORKDIR /go/src/github.com/evmos/evmos @@ -9,4 +10,6 @@ COPY ./init-node.sh . # JSON-RPC server EXPOSE 8545 +HEALTHCHECK CMD curl --fail http://localhost:26657 || exit 1 + CMD ["sh", "./init-node.sh"] From 8dd3b329efc637f82db83c565e244b7dd3fcc4dd Mon Sep 17 00:00:00 2001 From: fx0x55 <80245546+fx0x55@users.noreply.github.com> Date: Thu, 25 Apr 2024 20:55:39 +0800 Subject: [PATCH 221/345] refactor: Delete unused keeper interface (#2510) --- x/erc20/types/interfaces.go | 3 +-- x/evm/types/interfaces.go | 3 --- x/ibc/transfer/types/interfaces.go | 5 ----- x/inflation/v1/types/interfaces.go | 7 ------- x/vesting/types/interfaces.go | 30 ------------------------------ 5 files changed, 1 insertion(+), 47 deletions(-) diff --git a/x/erc20/types/interfaces.go b/x/erc20/types/interfaces.go index d8ad9f44f5..442d16399d 100644 --- a/x/erc20/types/interfaces.go +++ b/x/erc20/types/interfaces.go @@ -4,7 +4,7 @@ package types import ( - context "context" + "context" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" @@ -21,7 +21,6 @@ import ( // AccountKeeper defines the expected interface needed to retrieve account info. type AccountKeeper interface { - GetModuleAddress(moduleName string) sdk.AccAddress GetSequence(sdk.Context, sdk.AccAddress) (uint64, error) GetAccount(sdk.Context, sdk.AccAddress) authtypes.AccountI } diff --git a/x/evm/types/interfaces.go b/x/evm/types/interfaces.go index c229cea9c3..cbb5731865 100644 --- a/x/evm/types/interfaces.go +++ b/x/evm/types/interfaces.go @@ -19,9 +19,7 @@ import ( type AccountKeeper interface { NewAccountWithAddress(ctx sdk.Context, addr sdk.AccAddress) authtypes.AccountI GetModuleAddress(moduleName string) sdk.AccAddress - GetAllAccounts(ctx sdk.Context) (accounts []authtypes.AccountI) IterateAccounts(ctx sdk.Context, cb func(account authtypes.AccountI) bool) - GetSequence(sdk.Context, sdk.AccAddress) (uint64, error) GetAccount(ctx sdk.Context, addr sdk.AccAddress) authtypes.AccountI SetAccount(ctx sdk.Context, account authtypes.AccountI) RemoveAccount(ctx sdk.Context, account authtypes.AccountI) @@ -47,7 +45,6 @@ type StakingKeeper interface { type FeeMarketKeeper interface { GetBaseFee(ctx sdk.Context) *big.Int GetParams(ctx sdk.Context) feemarkettypes.Params - AddTransientGasWanted(ctx sdk.Context, gasWanted uint64) (uint64, error) CalculateBaseFee(ctx sdk.Context) *big.Int } diff --git a/x/ibc/transfer/types/interfaces.go b/x/ibc/transfer/types/interfaces.go index 7e85f00663..acb9e5c17f 100644 --- a/x/ibc/transfer/types/interfaces.go +++ b/x/ibc/transfer/types/interfaces.go @@ -6,11 +6,8 @@ package types import ( "context" - "github.com/ethereum/go-ethereum/common" - sdk "github.com/cosmos/cosmos-sdk/types" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" erc20types "github.com/evmos/evmos/v18/x/erc20/types" @@ -19,7 +16,6 @@ import ( // AccountKeeper defines the expected interface needed to retrieve account info. type AccountKeeper interface { transfertypes.AccountKeeper - GetAccount(sdk.Context, sdk.AccAddress) authtypes.AccountI } // BankKeeper defines the expected interface needed to check balances and send coins. @@ -32,7 +28,6 @@ type BankKeeper interface { // ERC20 token transfers via IBC. type ERC20Keeper interface { IsERC20Enabled(ctx sdk.Context) bool - IsERC20Registered(ctx sdk.Context, contractAddr common.Address) bool GetTokenPairID(ctx sdk.Context, token string) []byte GetTokenPair(ctx sdk.Context, id []byte) (erc20types.TokenPair, bool) ConvertERC20(ctx context.Context, msg *erc20types.MsgConvertERC20) (*erc20types.MsgConvertERC20Response, error) diff --git a/x/inflation/v1/types/interfaces.go b/x/inflation/v1/types/interfaces.go index 3ad6d09b35..70729d6df0 100644 --- a/x/inflation/v1/types/interfaces.go +++ b/x/inflation/v1/types/interfaces.go @@ -14,20 +14,14 @@ import ( type AccountKeeper interface { GetModuleAddress(name string) sdk.AccAddress GetModuleAccount(ctx sdk.Context, moduleName string) types.ModuleAccountI - GetAccount(sdk.Context, sdk.AccAddress) types.AccountI - SetAccount(sdk.Context, types.AccountI) } // BankKeeper defines the contract needed to be fulfilled for banking and supply // dependencies. type BankKeeper interface { - GetBalance(ctx sdk.Context, addr sdk.AccAddress, denom string) sdk.Coin GetAllBalances(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins - SendCoinsFromModuleToAccount(ctx sdk.Context, senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins) error SendCoinsFromModuleToModule(ctx sdk.Context, senderModule, recipientModule string, amt sdk.Coins) error MintCoins(ctx sdk.Context, name string, amt sdk.Coins) error - BurnCoins(ctx sdk.Context, name string, amt sdk.Coins) error - HasSupply(ctx sdk.Context, denom string) bool GetSupply(ctx sdk.Context, denom string) sdk.Coin } @@ -39,7 +33,6 @@ type DistrKeeper interface { // StakingKeeper expected staking keeper type StakingKeeper interface { // BondedRatio the fraction of the staking tokens which are currently bonded - BondedRatio(ctx sdk.Context) math.LegacyDec StakingTokenSupply(ctx sdk.Context) math.Int TotalBondedTokens(ctx sdk.Context) math.Int } diff --git a/x/vesting/types/interfaces.go b/x/vesting/types/interfaces.go index cc9d683cd1..5439f37d68 100644 --- a/x/vesting/types/interfaces.go +++ b/x/vesting/types/interfaces.go @@ -4,13 +4,10 @@ package types import ( - "time" - "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" v1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" ) // AccountKeeper defines the expected interface contract the vesting module @@ -19,8 +16,6 @@ type AccountKeeper interface { GetModuleAddress(name string) sdk.AccAddress GetAccount(sdk.Context, sdk.AccAddress) authtypes.AccountI SetAccount(sdk.Context, authtypes.AccountI) - NewAccount(ctx sdk.Context, acc authtypes.AccountI) authtypes.AccountI - NewAccountWithAddress(ctx sdk.Context, addr sdk.AccAddress) authtypes.AccountI IterateAccounts(ctx sdk.Context, process func(authtypes.AccountI) bool) RemoveAccount(ctx sdk.Context, acc authtypes.AccountI) } @@ -28,41 +23,16 @@ type AccountKeeper interface { // BankKeeper defines the expected interface contract the vesting module requires // for creating vesting accounts with funds. type BankKeeper interface { - GetAllBalances(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error - SpendableCoins(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins BlockedAddr(addr sdk.AccAddress) bool } // StakingKeeper defines the expected interface contract the vesting module // requires for finding and changing the delegated tokens, used in clawback. type StakingKeeper interface { - GetParams(ctx sdk.Context) stakingtypes.Params BondDenom(ctx sdk.Context) string - GetDelegatorDelegations(ctx sdk.Context, delegator sdk.AccAddress, maxRetrieve uint16) []stakingtypes.Delegation - GetUnbondingDelegations(ctx sdk.Context, delegator sdk.AccAddress, maxRetrieve uint16) []stakingtypes.UnbondingDelegation - GetValidator(ctx sdk.Context, valAddr sdk.ValAddress) (stakingtypes.Validator, bool) - - // Support iterating delegations for use in ante handlers - IterateDelegations(ctx sdk.Context, delegator sdk.AccAddress, fn func(index int64, delegation stakingtypes.DelegationI) (stop bool)) // Support functions for Agoric's custom stakingkeeper logic on vestingkeeper - GetUnbondingDelegation(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) (stakingtypes.UnbondingDelegation, bool) - HasMaxUnbondingDelegationEntries(ctx sdk.Context, delegatorAddr sdk.AccAddress, validatorAddr sdk.ValAddress) bool - SetUnbondingDelegationEntry(ctx sdk.Context, delegatorAddr sdk.AccAddress, validatorAddr sdk.ValAddress, creationHeight int64, minTime time.Time, balance math.Int) stakingtypes.UnbondingDelegation - InsertUBDQueue(ctx sdk.Context, ubd stakingtypes.UnbondingDelegation, completionTime time.Time) - RemoveUnbondingDelegation(ctx sdk.Context, ubd stakingtypes.UnbondingDelegation) - SetUnbondingDelegation(ctx sdk.Context, ubd stakingtypes.UnbondingDelegation) - GetDelegation(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) (stakingtypes.Delegation, bool) - GetRedelegation(ctx sdk.Context, delAddr sdk.AccAddress, valSrcAddr, valDstAddr sdk.ValAddress) (stakingtypes.Redelegation, bool) - MaxEntries(ctx sdk.Context) uint32 - SetDelegation(ctx sdk.Context, delegation stakingtypes.Delegation) - RemoveDelegation(ctx sdk.Context, delegation stakingtypes.Delegation) error - GetRedelegations(ctx sdk.Context, delegator sdk.AccAddress, maxRetrieve uint16) []stakingtypes.Redelegation - SetRedelegationEntry(ctx sdk.Context, delegatorAddr sdk.AccAddress, validatorSrcAddr, validatorDstAddr sdk.ValAddress, creationHeight int64, minTime time.Time, balance math.Int, sharesSrc, sharesDst math.LegacyDec) stakingtypes.Redelegation - InsertRedelegationQueue(ctx sdk.Context, red stakingtypes.Redelegation, completionTime time.Time) - SetRedelegation(ctx sdk.Context, red stakingtypes.Redelegation) - RemoveRedelegation(ctx sdk.Context, red stakingtypes.Redelegation) GetDelegatorUnbonding(ctx sdk.Context, delegator sdk.AccAddress) math.Int GetDelegatorBonded(ctx sdk.Context, delegator sdk.AccAddress) math.Int } From 29a44c7c48e5e18436976466f7b663080dcaf91d Mon Sep 17 00:00:00 2001 From: fx0x55 <80245546+fx0x55@users.noreply.github.com> Date: Thu, 25 Apr 2024 21:25:35 +0800 Subject: [PATCH 222/345] perf: Move the check moduleAddress before reading the db (#2511) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> --- x/erc20/keeper/evm_hooks.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/x/erc20/keeper/evm_hooks.go b/x/erc20/keeper/evm_hooks.go index 4457c0cdd0..fe5216ba3e 100644 --- a/x/erc20/keeper/evm_hooks.go +++ b/x/erc20/keeper/evm_hooks.go @@ -96,6 +96,12 @@ func (k Keeper) PostTxProcessing( continue } + // Check if tokens are sent to module address + to := common.BytesToAddress(log.Topics[2].Bytes()) + if !bytes.Equal(to.Bytes(), types.ModuleAddress.Bytes()) { + continue + } + // Check that the contract is a registered token pair contractAddr := log.Address id := k.GetERC20Map(ctx, contractAddr) @@ -108,12 +114,6 @@ func (k Keeper) PostTxProcessing( continue } - // Check if tokens are sent to module address - to := common.BytesToAddress(log.Topics[2].Bytes()) - if !bytes.Equal(to.Bytes(), types.ModuleAddress.Bytes()) { - continue - } - // Check that conversion for the pair is enabled. Fail if !pair.Enabled { // continue to allow transfers for the ERC20 in case the token pair is From afa1ef3484a1eab59a34c906c34ade307928f123 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 15:58:36 +0200 Subject: [PATCH 223/345] build(deps): bump golangci/golangci-lint-action from 4.0.0 to 5.0.0 (#2512) Bumps [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action) from 4.0.0 to 5.0.0. - [Release notes](https://github.com/golangci/golangci-lint-action/releases) - [Commits](https://github.com/golangci/golangci-lint-action/compare/v4.0.0...v5.0.0) --- updated-dependencies: - dependency-name: golangci/golangci-lint-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index db7e9bb790..43ee8705d9 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -26,7 +26,7 @@ jobs: go.mod go.sum *.toml - - uses: golangci/golangci-lint-action@v4.0.0 + - uses: golangci/golangci-lint-action@v5.0.0 with: # Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version. version: latest From 98ec84f88dcef529c577848c51947cc19e5f7735 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 13:07:50 -0300 Subject: [PATCH 224/345] build(deps): bump github.com/rs/cors from 1.10.1 to 1.11.0 (#2513) * build(deps): bump github.com/rs/cors from 1.10.1 to 1.11.0 Bumps [github.com/rs/cors](https://github.com/rs/cors) from 1.10.1 to 1.11.0. - [Commits](https://github.com/rs/cors/compare/v1.10.1...v1.11.0) --- updated-dependencies: - dependency-name: github.com/rs/cors dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * add write permissions in e2e-test action * add write permissions in e2e-test action * gomod2nix generate --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: tom Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> --- .github/workflows/e2e-test.yml | 4 +++- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/.github/workflows/e2e-test.yml b/.github/workflows/e2e-test.yml index 9b1f51fe18..5353b2fab8 100644 --- a/.github/workflows/e2e-test.yml +++ b/.github/workflows/e2e-test.yml @@ -81,6 +81,8 @@ jobs: echo "Test matrix: ${TEST_FILES}" test-nix: needs: test-files-matrix + permissions: + contents: write runs-on: ubuntu-latest strategy: matrix: @@ -126,7 +128,7 @@ jobs: run: make run-nix-tests if: env.GIT_DIFF # Commit gomod2nix changes files back to the repository if necessary - - uses: stefanzweifel/git-auto-commit-action@v5 + - uses: stefanzweifel/git-auto-commit-action@v5 with: commit_message: update gomod2nix.toml file file_pattern: '*.toml' diff --git a/go.mod b/go.mod index d1eb255d6c..4a1209d071 100644 --- a/go.mod +++ b/go.mod @@ -35,7 +35,7 @@ require ( github.com/ory/dockertest/v3 v3.10.0 github.com/pkg/errors v0.9.1 github.com/rakyll/statik v0.1.7 - github.com/rs/cors v1.10.1 + github.com/rs/cors v1.11.0 github.com/spf13/cast v1.6.0 github.com/spf13/cobra v1.8.0 github.com/spf13/viper v1.16.0 diff --git a/go.sum b/go.sum index c5d12b9c97..5742af733d 100644 --- a/go.sum +++ b/go.sum @@ -1034,8 +1034,8 @@ github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/f github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/cors v1.11.0 h1:0B9GE/r9Bc2UxRMMtymBkHTenPkHDv0CW4Y98GBY+po= +github.com/rs/cors v1.11.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.31.0 h1:FcTR3NnLWW+NnTwwhFWiJSZr4ECLpqCm6QsEnyvbV4A= github.com/rs/zerolog v1.31.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= diff --git a/gomod2nix.toml b/gomod2nix.toml index 0b8fd41338..7871810770 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -537,8 +537,8 @@ schema = 3 version = "v1.11.0" hash = "sha256-BucSndJVnqX9e6p5PfA6Z8N2bGfIeRfxAxYLUDXTbIo=" [mod."github.com/rs/cors"] - version = "v1.10.1" - hash = "sha256-um4INJM5/675MLK42npIsDbSQ1/Iy5ZiUNuAFReUfeM=" + version = "v1.11.0" + hash = "sha256-hF25bVehtWCQsxiOfLuL4Hv8NKVunEqLPk/Vcuheha0=" [mod."github.com/rs/zerolog"] version = "v1.31.0" hash = "sha256-OF4VM+Rv6M5EAaUVD2nOzcbZLQ4b7OAMteyyTqIoU0M=" From 65d33f975f89d2beb66490ee6ed666b599312683 Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Fri, 26 Apr 2024 11:16:01 -0300 Subject: [PATCH 225/345] chore(vesting): add lockedUpVested delegations in LockedCoins calculation (#2507) * add lockedUpVested delegations in LockedCoins calculation * add changelog entry * Update x/vesting/keeper/integration_test.go Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Signed-off-by: Tom <54514587+GAtom22@users.noreply.github.com> * run make format --------- Signed-off-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: GAtom22 --- CHANGELOG.md | 1 + x/vesting/keeper/integration_test.go | 27 ++++++++-- x/vesting/types/clawback_vesting_account.go | 18 ++++++- .../types/clawback_vesting_account_test.go | 49 ++++++++++++++++++- 4 files changed, 89 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 41b79a5652..c42fdc6d6c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -51,6 +51,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (evm) [#2380](https://github.com/evmos/evmos/pull/2380) Remove EVM hooks from app and EVM module. - (evm) [#2501](https://github.com/evmos/evmos/pull/2501) Revert deletion from EVM hooks (#2380) - (erc20) [#2502](https://github.com/evmos/evmos/pull/2502) Revert deletion from EVM hooks (#2154) (#2442) +- (vesting) [#2507](https://github.com/evmos/evmos/pull/2507) Consider locked-up vested delegated coins in `LockedCoins` calculation. ### Bug Fixes diff --git a/x/vesting/keeper/integration_test.go b/x/vesting/keeper/integration_test.go index 42671be3ad..21261f640d 100644 --- a/x/vesting/keeper/integration_test.go +++ b/x/vesting/keeper/integration_test.go @@ -256,28 +256,47 @@ var _ = Describe("Clawback Vesting Accounts", Ordered, func() { Expect(delRes.DelegationResponses[0].Balance.Amount).To(Equal(vested[0].Amount)) }) - It("can delegate tokens from account balance - tokens not in vesting schedule", func() { + It("account with free balance - delegates the free balance amount. It is tracked as locked vested tokens for the spendable balance calculation", func() { testAccount := testAccounts[0] // send some funds to the account to delegate coinsToDelegate := sdk.NewCoins(sdk.NewCoin(stakeDenom, math.NewInt(1e18))) + // check that coins to delegate are greater than the locked up vested coins + Expect(coinsToDelegate.IsAllGT(vested)).To(BeTrue()) + err = testutil.FundAccount(s.ctx, s.app.BankKeeper, testAccount.address, coinsToDelegate) Expect(err).To(BeNil()) + // the free coins delegated will be the delegatedCoins - lockedUp vested coins + freeCoinsDelegated := coinsToDelegate.Sub(vested...) + + initialBalances := s.app.BankKeeper.GetAllBalances(s.ctx, testAccount.address) + Expect(initialBalances).To(Equal(testutil.TestVestingSchedule.TotalVestingCoins.Add(coinsToDelegate...).Add(accountGasCoverage...))) // Verify that the total spendable coins should only be coins // not in the vesting schedule. Because all coins from the vesting - // schedule are still locked + // schedule are still locked up spendablePre := s.app.BankKeeper.SpendableCoins(s.ctx, testAccount.address) Expect(spendablePre).To(Equal(accountGasCoverage.Add(coinsToDelegate...))) - // delegate funds not in vesting schedule + // delegate funds - the delegation amount will be tracked as locked up vested coins delegated + some free coins res, err := testutil.Delegate(s.ctx, s.app, testAccount.privKey, coinsToDelegate[0], s.validator) Expect(err).NotTo(HaveOccurred(), "expected no error during delegation") Expect(res.IsOK()).To(BeTrue()) + // check balances updated properly + finalBalances := s.app.BankKeeper.GetAllBalances(s.ctx, testAccount.address) + Expect(finalBalances).To(Equal(initialBalances.Sub(coinsToDelegate...).Sub(accountGasCoverage...))) + + // the expected spendable balance will be + // spendable = bank balances - (coins in vesting schedule - unlocked vested coins (0) - locked up vested coins delegated) + expSpendable := finalBalances.Sub(testutil.TestVestingSchedule.TotalVestingCoins...).Add(vested...) + + // which should be equal to the initial freeCoins - freeCoins delegated + Expect(expSpendable).To(Equal(coinsToDelegate.Sub(freeCoinsDelegated...))) + // check spendable balance is updated properly spendablePost := s.app.BankKeeper.SpendableCoins(s.ctx, testAccount.address) - Expect(spendablePost).To(Equal(spendablePre.Sub(coinsToDelegate...).Sub(accountGasCoverage...))) + Expect(spendablePost).To(Equal(expSpendable)) }) It("can delegate tokens from account balance (free tokens) + locked vested tokens", func() { diff --git a/x/vesting/types/clawback_vesting_account.go b/x/vesting/types/clawback_vesting_account.go index f9ff474bd7..525cd23ea8 100644 --- a/x/vesting/types/clawback_vesting_account.go +++ b/x/vesting/types/clawback_vesting_account.go @@ -81,7 +81,23 @@ func (va ClawbackVestingAccount) GetVestingCoins(blockTime time.Time) sdk.Coins // // lockedCoins = totalAmt - unlockedVested func (va ClawbackVestingAccount) LockedCoins(blockTime time.Time) sdk.Coins { - return va.OriginalVesting.Sub(va.GetUnlockedVestedCoins(blockTime)...) + // Can delegate lockedUpVested coins and this will reduce the bank balance + // of the account. As long as there're lockedUpVested coins, we'll consider + // the delegated tokens as lockedUpVested tokens + // min(lockedUpVested, DelegatedFree) + // + // Consider that the "DelegatedFree" coins tracked on delegations refer to unvested tokens. + // These "free" (unvested) tokens can be locked up or unlocked + lockedUpVestedDelegatedCoins := va.DelegatedFree.Min(va.GetLockedUpVestedCoins(blockTime)) + + res, isNeg := va.OriginalVesting.SafeSub(va.GetUnlockedVestedCoins(blockTime).Add(lockedUpVestedDelegatedCoins...)...) + + // safety check + if isNeg { + return sdk.Coins{} + } + + return res } // TrackDelegation tracks a desired delegation amount by setting the appropriate diff --git a/x/vesting/types/clawback_vesting_account_test.go b/x/vesting/types/clawback_vesting_account_test.go index dd201d453e..c20ef22f1c 100644 --- a/x/vesting/types/clawback_vesting_account_test.go +++ b/x/vesting/types/clawback_vesting_account_test.go @@ -168,15 +168,16 @@ func (suite *VestingAccountTestSuite) TestClawbackAccountNew() { } func (suite *VestingAccountTestSuite) TestGetCoinsFunctions() { + var va *types.ClawbackVestingAccount now := tmtime.Now() endTime := now.Add(24 * time.Hour) addr := sdk.AccAddress(utiltx.GenerateAddress().Bytes()) bacc := authtypes.NewBaseAccountWithAddress(addr) - va := types.NewClawbackVestingAccount(bacc, sdk.AccAddress([]byte("funder")), origCoins, now, lockupPeriods, vestingPeriods) testCases := []struct { name string time time.Time + malleate func() expVestedCoins sdk.Coins expLockedUpVestedCoins sdk.Coins expUnlockedVestedCoins sdk.Coins @@ -229,6 +230,34 @@ func (suite *VestingAccountTestSuite) TestGetCoinsFunctions() { expUnlockedCoins: sdk.Coins{}, expNotSpendable: origCoins, }, + { + name: "50 percent of coins are vested after 1st vesting period. All locked coins. Delegated all locked up vested. Not spendable balance should decrease", + time: now.Add(12 * time.Hour), + malleate: func() { + va.TrackDelegation(time.Time{}, origCoins, sdk.NewCoins(sdk.NewInt64Coin(stakeDenom, 50))) + }, + expVestedCoins: getPercentOfVestingCoins(50), + expLockedUpVestedCoins: getPercentOfVestingCoins(50), + expUnlockedVestedCoins: sdk.Coins{}, + expUnvestedCoins: getPercentOfVestingCoins(50), + expLockedUpCoins: origCoins, + expUnlockedCoins: sdk.Coins{}, + expNotSpendable: origCoins.Sub(sdk.NewInt64Coin(stakeDenom, 50)), + }, + { + name: "50 percent of coins are vested after 1st vesting period. All locked coins. Delegated some locked up vested. Not spendable balance should decrease", + time: now.Add(12 * time.Hour), + malleate: func() { + va.TrackDelegation(time.Time{}, origCoins, sdk.NewCoins(sdk.NewInt64Coin(stakeDenom, 25))) + }, + expVestedCoins: getPercentOfVestingCoins(50), + expLockedUpVestedCoins: getPercentOfVestingCoins(50), + expUnlockedVestedCoins: sdk.Coins{}, + expUnvestedCoins: getPercentOfVestingCoins(50), + expLockedUpCoins: origCoins, + expUnlockedCoins: sdk.Coins{}, + expNotSpendable: origCoins.Sub(sdk.NewInt64Coin(stakeDenom, 25)), + }, { name: "after lockup period (all coins unlocked) - 50 percent of coins already vested", time: now.Add(16 * time.Hour), @@ -251,6 +280,20 @@ func (suite *VestingAccountTestSuite) TestGetCoinsFunctions() { expUnlockedCoins: origCoins, expNotSpendable: getPercentOfVestingCoins(50), }, + { + name: "in between vesting periods 1 and 2 - delegate some unlocked vested coins: No effect on spendable balance", + time: now.Add(17 * time.Hour), + malleate: func() { + va.TrackDelegation(time.Time{}, origCoins, sdk.NewCoins(sdk.NewInt64Coin(stakeDenom, 50))) + }, + expVestedCoins: getPercentOfVestingCoins(50), + expLockedUpVestedCoins: sdk.Coins{}, + expUnlockedVestedCoins: getPercentOfVestingCoins(50), + expUnvestedCoins: getPercentOfVestingCoins(50), + expLockedUpCoins: sdk.Coins{}, + expUnlockedCoins: origCoins, + expNotSpendable: getPercentOfVestingCoins(50), + }, { name: "75 percent of coins vested after period 2", time: now.Add(18 * time.Hour), @@ -277,6 +320,10 @@ func (suite *VestingAccountTestSuite) TestGetCoinsFunctions() { for _, tc := range testCases { suite.Run(tc.name, func() { + va = types.NewClawbackVestingAccount(bacc, sdk.AccAddress("funder"), origCoins, now, lockupPeriods, vestingPeriods) + if tc.malleate != nil { + tc.malleate() + } vestedCoins := va.GetVestedCoins(tc.time) suite.Require().Equal(tc.expVestedCoins, vestedCoins) lockedUpVested := va.GetLockedUpVestedCoins(tc.time) From dfe16551270228cb2705813ef5b418c1bb47d937 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Apr 2024 15:05:59 +0200 Subject: [PATCH 226/345] build(deps): bump github.com/onsi/ginkgo/v2 from 2.17.1 to 2.17.2 (#2520) * build(deps): bump github.com/onsi/ginkgo/v2 from 2.17.1 to 2.17.2 Bumps [github.com/onsi/ginkgo/v2](https://github.com/onsi/ginkgo) from 2.17.1 to 2.17.2. - [Release notes](https://github.com/onsi/ginkgo/releases) - [Changelog](https://github.com/onsi/ginkgo/blob/master/CHANGELOG.md) - [Commits](https://github.com/onsi/ginkgo/compare/v2.17.1...v2.17.2) --- updated-dependencies: - dependency-name: github.com/onsi/ginkgo/v2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * gomod2nix generate --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: tom --- go.mod | 12 ++++++------ go.sum | 33 ++++++++++++++++++--------------- gomod2nix.toml | 26 +++++++++++++------------- 3 files changed, 37 insertions(+), 34 deletions(-) diff --git a/go.mod b/go.mod index 4a1209d071..173c5c5103 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,7 @@ require ( github.com/hashicorp/go-version v1.6.0 github.com/improbable-eng/grpc-web v0.15.0 github.com/linxGnu/grocksdb v1.8.14 - github.com/onsi/ginkgo/v2 v2.17.1 + github.com/onsi/ginkgo/v2 v2.17.2 github.com/onsi/gomega v1.33.0 github.com/ory/dockertest/v3 v3.10.0 github.com/pkg/errors v0.9.1 @@ -127,7 +127,7 @@ require ( github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-sourcemap/sourcemap v2.1.3+incompatible // indirect github.com/go-stack/stack v1.8.1 // indirect - github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect + github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/gogo/googleapis v1.4.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect @@ -139,7 +139,7 @@ require ( github.com/google/flatbuffers v1.12.1 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/orderedcode v0.0.1 // indirect - github.com/google/pprof v0.0.0-20230228050547-1710fef4ab10 // indirect + github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 // indirect github.com/google/s2a-go v0.1.7 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/google/uuid v1.6.0 // indirect @@ -232,13 +232,13 @@ require ( go.opentelemetry.io/otel/metric v1.22.0 // indirect go.opentelemetry.io/otel/trace v1.22.0 // indirect golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb // indirect - golang.org/x/mod v0.14.0 // indirect + golang.org/x/mod v0.17.0 // indirect golang.org/x/oauth2 v0.17.0 // indirect - golang.org/x/sync v0.6.0 // indirect + golang.org/x/sync v0.7.0 // indirect golang.org/x/sys v0.19.0 // indirect golang.org/x/term v0.19.0 // indirect golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.17.0 // indirect + golang.org/x/tools v0.20.0 // indirect google.golang.org/api v0.162.0 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect diff --git a/go.sum b/go.sum index 5742af733d..d058419a2a 100644 --- a/go.sum +++ b/go.sum @@ -546,14 +546,17 @@ github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LB github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= +github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= +github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= +github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= +github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/gobwas/ws v1.2.1 h1:F2aeBZrm2NDsc7vbovKrWSogd4wvfAxg0FQ89/iqOTk= +github.com/gobwas/ws v1.2.1/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= @@ -666,8 +669,8 @@ github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20230228050547-1710fef4ab10 h1:CqYfpuYIjnlNxM3msdyPRKabhXZWbKjf3Q8BWROFBso= -github.com/google/pprof v0.0.0-20230228050547-1710fef4ab10/go.mod h1:79YE0hCXdHag9sBkw2o+N/YnZtTkXi0UT9Nnixa5eYk= +github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 h1:k7nVchz72niMH6YLQNvHSdIE7iqsQxK1P41mySCvssg= +github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= @@ -933,8 +936,8 @@ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108 github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo/v2 v2.17.1 h1:V++EzdbhI4ZV4ev0UTIj0PzhzOcReJFyJaLjtSF55M8= -github.com/onsi/ginkgo/v2 v2.17.1/go.mod h1:llBI3WDLL9Z6taip6f33H76YcWtJv+7R3HigUjbIBOs= +github.com/onsi/ginkgo/v2 v2.17.2 h1:7eMhcy3GimbsA3hEnVKdw/PQM9XN9krpKVXsZdph0/g= +github.com/onsi/ginkgo/v2 v2.17.2/go.mod h1:nP2DPOQoNsQmsVyv5rDA8JkXQoCs6goXIvr/PRJ1eCc= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= @@ -1266,8 +1269,8 @@ golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= -golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1377,8 +1380,8 @@ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1579,8 +1582,8 @@ golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= -golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= +golang.org/x/tools v0.20.0 h1:hz/CVckiOxybQvFw6h7b/q80NTr9IUQb4s1IIzW7KNY= +golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/gomod2nix.toml b/gomod2nix.toml index 7871810770..f356728b64 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -281,9 +281,9 @@ schema = 3 [mod."github.com/go-stack/stack"] version = "v1.8.1" hash = "sha256-ixcJ2RrK1ZH3YWGQZF9QFBo02NOuLeSp9wJ7gniipgY=" - [mod."github.com/go-task/slim-sprig"] - version = "v0.0.0-20230315185526-52ccab3ef572" - hash = "sha256-D6NjCQbcYC53NdwzyAm4i9M1OjTJIVu4EIt3AD/Vxfg=" + [mod."github.com/go-task/slim-sprig/v3"] + version = "v3.0.0" + hash = "sha256-vCCw4MXVBm33VNLXcOBccVDD1CSnzDvDdWB6w5FN1cA=" [mod."github.com/godbus/dbus"] version = "v0.0.0-20190726142602-4481cbc300e2" hash = "sha256-R7Gb9+Zjy80FbQSDGketoVEqfdOQKuOVTfWRjQ5kxZY=" @@ -321,8 +321,8 @@ schema = 3 version = "v0.0.1" hash = "sha256-KrExYovtUQrHGI1mPQf57jGw8soz7eWOC2xqEaV0uGk=" [mod."github.com/google/pprof"] - version = "v0.0.0-20230228050547-1710fef4ab10" - hash = "sha256-ts+I48BUzyra4LFY+qc7I7uPliuMMAh1d1UfANDBqPo=" + version = "v0.0.0-20240424215950-a892ee059fd6" + hash = "sha256-j3nKXUZtSbCVR+/UcMhB8VpgV11ZAf7lpVj1dgn0LSY=" [mod."github.com/google/s2a-go"] version = "v0.1.7" hash = "sha256-E+SX/3VmRI5qN7SbnRP4Tt+gQTq93pScpY9U2tTmIU0=" @@ -480,8 +480,8 @@ schema = 3 version = "v0.0.5" hash = "sha256-/5i70IkH/qSW5KjGzv8aQNKh9tHoz98tqtL0K2DMFn4=" [mod."github.com/onsi/ginkgo/v2"] - version = "v2.17.1" - hash = "sha256-kZgSreUHuYwl6Hh1SHmSasBwbV7qeYeg4BFYoxMchg8=" + version = "v2.17.2" + hash = "sha256-APrPglqYnX2a6EypqDXi05Quou30UQdcDxztT1yhM3s=" [mod."github.com/onsi/gomega"] version = "v1.33.0" hash = "sha256-0LMaPjLYtaFy95PdY0oyFo00pN0ZStCvaurUuoPSPIo=" @@ -667,8 +667,8 @@ schema = 3 version = "v0.0.0-20230711153332-06a737ee72cb" hash = "sha256-Cbw10ZJ+jATPV232G47xZrn6ExO1FDtiT6nlMRCH7EI=" [mod."golang.org/x/mod"] - version = "v0.14.0" - hash = "sha256-sx3hWp5l99DBfIrn821ohfoBwvaITSHMWbzPvX0btLM=" + version = "v0.17.0" + hash = "sha256-CLaPeF6uTFuRDv4oHwOQE6MCMvrzkUjWN3NuyywZjKU=" [mod."golang.org/x/net"] version = "v0.24.0" hash = "sha256-w1c21ljta5wNIyel9CSIn/crPzwOCRofNKhqmfs4aEQ=" @@ -676,8 +676,8 @@ schema = 3 version = "v0.17.0" hash = "sha256-M2ZZQZt449RJL18YpzGiAiqfGsDVMsr1IVWbYp/G/go=" [mod."golang.org/x/sync"] - version = "v0.6.0" - hash = "sha256-LLims/wjDZtIqlYCVHREewcUOX4hwRwplEuZKPOJ/HI=" + version = "v0.7.0" + hash = "sha256-2ETllEu2GDWoOd/yMkOkLC2hWBpKzbVZ8LhjLu0d2A8=" [mod."golang.org/x/sys"] version = "v0.19.0" hash = "sha256-cmuL31TYLJmDm/fDnI2Sn0wB88cpdOHV1+urorsJWx4=" @@ -691,8 +691,8 @@ schema = 3 version = "v0.5.0" hash = "sha256-W6RgwgdYTO3byIPOFxrP2IpAZdgaGowAaVfYby7AULU=" [mod."golang.org/x/tools"] - version = "v0.17.0" - hash = "sha256-CxuHfKKtUkn3VjA7D9WQjzvV1EUbyI/xMNhb5CxO6IQ=" + version = "v0.20.0" + hash = "sha256-g5T5FrNPO/cf2W1lc+/93FcFB3HftPjqI72FueD9Wt8=" [mod."google.golang.org/api"] version = "v0.162.0" hash = "sha256-+AsT4DPjefEmPPelZoSHuQ8nCHhmhhUWU4UGnJ/8+fg=" From 665c748b695a304e19b979ef182d115af3a3bc7d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Apr 2024 09:39:55 -0300 Subject: [PATCH 227/345] build(deps): bump golangci/golangci-lint-action from 5.0.0 to 5.1.0 (#2523) Bumps [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action) from 5.0.0 to 5.1.0. - [Release notes](https://github.com/golangci/golangci-lint-action/releases) - [Commits](https://github.com/golangci/golangci-lint-action/compare/v5.0.0...v5.1.0) --- updated-dependencies: - dependency-name: golangci/golangci-lint-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 43ee8705d9..426fb2fe75 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -26,7 +26,7 @@ jobs: go.mod go.sum *.toml - - uses: golangci/golangci-lint-action@v5.0.0 + - uses: golangci/golangci-lint-action@v5.1.0 with: # Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version. version: latest From ccd94e092681c536c660acd352d7e9440e297f3b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Apr 2024 14:59:19 +0200 Subject: [PATCH 228/345] build(deps): bump google.golang.org/protobuf from 1.33.0 to 1.34.0 (#2525) Bumps google.golang.org/protobuf from 1.33.0 to 1.34.0. --- updated-dependencies: - dependency-name: google.golang.org/protobuf dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 173c5c5103..a18201928a 100644 --- a/go.mod +++ b/go.mod @@ -50,7 +50,7 @@ require ( golang.org/x/text v0.14.0 google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de google.golang.org/grpc v1.63.2 - google.golang.org/protobuf v1.33.0 + google.golang.org/protobuf v1.34.0 sigs.k8s.io/yaml v1.4.0 ) diff --git a/go.sum b/go.sum index d058419a2a..dc6be8441a 100644 --- a/go.sum +++ b/go.sum @@ -1828,8 +1828,8 @@ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.0 h1:Qo/qEd2RZPCf2nKuorzksSknv0d3ERwp1vFG38gSmH4= +google.golang.org/protobuf v1.34.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From e3e27940376613cf2b51a0b5eb34ffd06267610b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Apr 2024 12:00:05 -0300 Subject: [PATCH 229/345] build(deps): bump github.com/onsi/gomega from 1.33.0 to 1.33.1 (#2524) Bumps [github.com/onsi/gomega](https://github.com/onsi/gomega) from 1.33.0 to 1.33.1. - [Release notes](https://github.com/onsi/gomega/releases) - [Changelog](https://github.com/onsi/gomega/blob/master/CHANGELOG.md) - [Commits](https://github.com/onsi/gomega/compare/v1.33.0...v1.33.1) --- updated-dependencies: - dependency-name: github.com/onsi/gomega dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 8 ++++---- nix/sources.json | 8 ++++---- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/go.mod b/go.mod index a18201928a..25d27ae93a 100644 --- a/go.mod +++ b/go.mod @@ -31,7 +31,7 @@ require ( github.com/improbable-eng/grpc-web v0.15.0 github.com/linxGnu/grocksdb v1.8.14 github.com/onsi/ginkgo/v2 v2.17.2 - github.com/onsi/gomega v1.33.0 + github.com/onsi/gomega v1.33.1 github.com/ory/dockertest/v3 v3.10.0 github.com/pkg/errors v0.9.1 github.com/rakyll/statik v0.1.7 diff --git a/go.sum b/go.sum index dc6be8441a..69ae17d290 100644 --- a/go.sum +++ b/go.sum @@ -942,8 +942,8 @@ github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5 github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.33.0 h1:snPCflnZrpMsy94p4lXVEkHo12lmPnc3vY5XBbreexE= -github.com/onsi/gomega v1.33.0/go.mod h1:+925n5YtiFsLzzafLUHzVMBpvvRAzrydIBiSIxjX3wY= +github.com/onsi/gomega v1.33.1 h1:dsYjIxxSR755MDmKVsaFQTE22ChNBcuuTWgkUDSubOk= +github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= diff --git a/gomod2nix.toml b/gomod2nix.toml index f356728b64..69801a5f59 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -483,8 +483,8 @@ schema = 3 version = "v2.17.2" hash = "sha256-APrPglqYnX2a6EypqDXi05Quou30UQdcDxztT1yhM3s=" [mod."github.com/onsi/gomega"] - version = "v1.33.0" - hash = "sha256-0LMaPjLYtaFy95PdY0oyFo00pN0ZStCvaurUuoPSPIo=" + version = "v1.33.1" + hash = "sha256-oYfRaN1xqngIHQQxEEc+FQZ6UHC99VZQzAePT0Xkz8s=" [mod."github.com/opencontainers/go-digest"] version = "v1.0.0" hash = "sha256-cfVDjHyWItmUGZ2dzQhCHgmOmou8v7N+itDkLZVkqkQ=" @@ -712,8 +712,8 @@ schema = 3 version = "v1.63.2" hash = "sha256-RmtVjYLam97k7IHTHU7Gn16xNX+GvA9AiLKlQwOiZXU=" [mod."google.golang.org/protobuf"] - version = "v1.33.0" - hash = "sha256-cWwQjtUwSIEkAlAadrlxK1PYZXTRrV4NKzt7xDpJgIU=" + version = "v1.34.0" + hash = "sha256-0fqsqQTyOicm4+NiuAf2IaJhavMVJh50VhNcRmZPSus=" [mod."gopkg.in/ini.v1"] version = "v1.67.0" hash = "sha256-V10ahGNGT+NLRdKUyRg1dos5RxLBXBk1xutcnquc/+4=" diff --git a/nix/sources.json b/nix/sources.json index ea06be9504..615c79ea42 100644 --- a/nix/sources.json +++ b/nix/sources.json @@ -36,12 +36,12 @@ "branch": "master", "description": "Convert applications using Go modules to Nix expressions", "homepage": null, - "owner": "tweag", + "owner": "nix-community", "repo": "gomod2nix", - "rev": "40d32f82fc60d66402eb0972e6e368aeab3faf58", - "sha256": "0li17ynbg2wg0xqy655m5rmcw905sbv7d4ir35z7s5pg1yhhzxkp", + "rev": "872b63ddd28f318489c929d25f1f0a3c6039c971", + "sha256": "1wh9rlhg2w42fsavh7wxvmw42l7m5wg290gnp571dq0qcr1z7kg1", "type": "tarball", - "url": "https://github.com/tweag/gomod2nix/archive/40d32f82fc60d66402eb0972e6e368aeab3faf58.tar.gz" + "url": "https://github.com/nix-community/gomod2nix/archive/872b63ddd28f318489c929d25f1f0a3c6039c971.tar.gz" }, "hermes": { "branch": "v1.6.0", From fe249a03533df2c9749f0eed1266207a747c14d5 Mon Sep 17 00:00:00 2001 From: Ramiro Carlucho Date: Tue, 30 Apr 2024 18:36:18 -0300 Subject: [PATCH 230/345] feat(str): STRV2 bookkeeping (#2508) * wip bookkeeping * chore(str): change setup for strv2 bookeeping tests (#2522) * change setup for strv2 bookeeping tests * fix conflict * linter fix * chore(strv2): str bookkeping unit tests (#2527) * str unit tests * address comments * chore(strv2): address comments (#2528) * address comments * fix lint * chore(str): changelog (#2530) changelog * chore(str): changelog (#2532) fix unsaved changelog --------- Co-authored-by: Freddy Caceres --- CHANGELOG.md | 1 + contracts/WEVMOS.sol | 762 ++++++++++++++++++ contracts/compiled_contracts/WEVMOS.json | 4 + contracts/wevmos.go | 30 + ibc/testing/endpoint.go | 13 + .../ibc/coordinator/coordinator.go | 7 +- utils/utils.go | 8 + x/erc20/keeper/evm_hooks.go | 263 ++++-- .../keeper/ibc_callbacks_integration_test.go | 61 ++ x/erc20/keeper/msg_server.go | 12 + x/erc20/keeper/str_v2.go | 58 ++ x/erc20/keeper/str_v2_test.go | 126 +++ x/erc20/keeper/testdata/tokenTransfer.go | 26 + x/erc20/keeper/testdata/tokenTransfer.json | 4 + x/erc20/keeper/testdata/tokenTransfer.sol | 26 + x/erc20/strv2/strv2_hooks_test.go | 311 +++++++ x/erc20/strv2/strv2_integration_test.go | 628 +++++++++++++++ x/erc20/strv2/strv2_integration_utils_test.go | 192 +++++ x/erc20/types/events.go | 4 + x/erc20/types/keys.go | 6 +- x/ibc/transfer/keeper/msg_server_test.go | 48 ++ 21 files changed, 2511 insertions(+), 79 deletions(-) create mode 100644 contracts/WEVMOS.sol create mode 100644 contracts/compiled_contracts/WEVMOS.json create mode 100644 contracts/wevmos.go create mode 100644 x/erc20/keeper/str_v2.go create mode 100644 x/erc20/keeper/str_v2_test.go create mode 100644 x/erc20/keeper/testdata/tokenTransfer.go create mode 100644 x/erc20/keeper/testdata/tokenTransfer.json create mode 100644 x/erc20/keeper/testdata/tokenTransfer.sol create mode 100644 x/erc20/strv2/strv2_hooks_test.go create mode 100644 x/erc20/strv2/strv2_integration_test.go create mode 100644 x/erc20/strv2/strv2_integration_utils_test.go diff --git a/CHANGELOG.md b/CHANGELOG.md index c42fdc6d6c..fafa5761cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -52,6 +52,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (evm) [#2501](https://github.com/evmos/evmos/pull/2501) Revert deletion from EVM hooks (#2380) - (erc20) [#2502](https://github.com/evmos/evmos/pull/2502) Revert deletion from EVM hooks (#2154) (#2442) - (vesting) [#2507](https://github.com/evmos/evmos/pull/2507) Consider locked-up vested delegated coins in `LockedCoins` calculation. +- (erc20) [#2508](https://github.com/evmos/evmos/pull/2508) Add bookkeping logic in preparation for STRV2 upgrade ### Bug Fixes diff --git a/contracts/WEVMOS.sol b/contracts/WEVMOS.sol new file mode 100644 index 0000000000..abcf4dae4d --- /dev/null +++ b/contracts/WEVMOS.sol @@ -0,0 +1,762 @@ +// Sources flattened with hardhat v2.8.4 https://hardhat.org + +// File contracts/WEVMOS9.sol + +// Copyright (C) 2015, 2016, 2017 Dapphub + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +pragma solidity >=0.4.22 <0.6; + +contract WEVMOS9 { + string public name = "Wrapped Evmos"; + string public symbol = "WEVMOS"; + uint8 public decimals = 18; + + event Approval(address indexed src, address indexed guy, uint wad); + event Transfer(address indexed src, address indexed dst, uint wad); + event Deposit(address indexed dst, uint wad); + event Withdrawal(address indexed src, uint wad); + + mapping (address => uint) public balanceOf; + mapping (address => mapping (address => uint)) public allowance; + + function() external payable { + deposit(); + } + + function deposit() public payable { + balanceOf[msg.sender] += msg.value; + emit Deposit(msg.sender, msg.value); + } + + function withdraw(uint wad) public { + require(balanceOf[msg.sender] >= wad); + balanceOf[msg.sender] -= wad; + msg.sender.transfer(wad); + emit Withdrawal(msg.sender, wad); + } + + function totalSupply() public view returns (uint) { + return address(this).balance; + } + + function approve(address guy, uint wad) public returns (bool) { + allowance[msg.sender][guy] = wad; + emit Approval(msg.sender, guy, wad); + return true; + } + + function transfer(address dst, uint wad) public returns (bool) { + return transferFrom(msg.sender, dst, wad); + } + + function transferFrom(address src, address dst, uint wad) + public + returns (bool) + { + require(balanceOf[src] >= wad); + + if (src != msg.sender && allowance[src][msg.sender] != uint(-1)) { + require(allowance[src][msg.sender] >= wad); + allowance[src][msg.sender] -= wad; + } + + balanceOf[src] -= wad; + balanceOf[dst] += wad; + + emit Transfer(src, dst, wad); + + return true; + } +} + + +/* + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. + +*/ \ No newline at end of file diff --git a/contracts/compiled_contracts/WEVMOS.json b/contracts/compiled_contracts/WEVMOS.json new file mode 100644 index 0000000000..6dfa7bc3b2 --- /dev/null +++ b/contracts/compiled_contracts/WEVMOS.json @@ -0,0 +1,4 @@ +{ + "abi": "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"src\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"guy\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"dst\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"Deposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"src\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"dst\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"src\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"Withdrawal\",\"type\":\"event\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"guy\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"dst\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"src\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"dst\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + "bin": "60806040526040518060400160405280600d81526020017f577261707065642045766d6f73000000000000000000000000000000000000008152506000908051906020019061004f9291906100ca565b506040518060400160405280600681526020017f5745564d4f5300000000000000000000000000000000000000000000000000008152506001908051906020019061009b9291906100ca565b506012600260006101000a81548160ff021916908360ff1602179055503480156100c457600080fd5b5061016f565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061010b57805160ff1916838001178555610139565b82800160010185558215610139579182015b8281111561013857825182559160200191906001019061011d565b5b509050610146919061014a565b5090565b61016c91905b80821115610168576000816000905550600101610150565b5090565b90565b610cb18061017e6000396000f3fe60806040526004361061009c5760003560e01c8063313ce56711610064578063313ce567146102a257806370a08231146102d357806395d89b4114610338578063a9059cbb146103c8578063d0e30db01461043b578063dd62ed3e146104455761009c565b806306fdde03146100a6578063095ea7b31461013657806318160ddd146101a957806323b872dd146101d45780632e1a7d4d14610267575b6100a46104ca565b005b3480156100b257600080fd5b506100bb610567565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100fb5780820151818401526020810190506100e0565b50505050905090810190601f1680156101285780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561014257600080fd5b5061018f6004803603604081101561015957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610605565b604051808215151515815260200191505060405180910390f35b3480156101b557600080fd5b506101be6106f7565b6040518082815260200191505060405180910390f35b3480156101e057600080fd5b5061024d600480360360608110156101f757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506106ff565b604051808215151515815260200191505060405180910390f35b34801561027357600080fd5b506102a06004803603602081101561028a57600080fd5b8101908080359060200190929190505050610a48565b005b3480156102ae57600080fd5b506102b7610b79565b604051808260ff1660ff16815260200191505060405180910390f35b3480156102df57600080fd5b50610322600480360360208110156102f657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b8c565b6040518082815260200191505060405180910390f35b34801561034457600080fd5b5061034d610ba4565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561038d578082015181840152602081019050610372565b50505050905090810190601f1680156103ba5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103d457600080fd5b50610421600480360360408110156103eb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c42565b604051808215151515815260200191505060405180910390f35b6104436104ca565b005b34801561045157600080fd5b506104b46004803603604081101561046857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c57565b6040518082815260200191505060405180910390f35b34600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a2565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105fd5780601f106105d2576101008083540402835291602001916105fd565b820191906000526020600020905b8154815290600101906020018083116105e057829003601f168201915b505050505081565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b600047905090565b600081600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561074d57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415801561082557507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b1561093e5781600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156108b357600080fd5b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b81600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610a9457600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610b27573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65826040518082815260200191505060405180910390a250565b600260009054906101000a900460ff1681565b60036020528060005260406000206000915090505481565b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610c3a5780601f10610c0f57610100808354040283529160200191610c3a565b820191906000526020600020905b815481529060010190602001808311610c1d57829003601f168201915b505050505081565b6000610c4f3384846106ff565b905092915050565b600460205281600052604060002060205280600052604060002060009150915050548156fea265627a7a7231582097a4d4c7b547d39e9799336e80c1cddc2df92ceec381f9a5f1df8aed270234bd64736f6c63430005110032" + } \ No newline at end of file diff --git a/contracts/wevmos.go b/contracts/wevmos.go new file mode 100644 index 0000000000..a7da5911c8 --- /dev/null +++ b/contracts/wevmos.go @@ -0,0 +1,30 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package contracts + +import ( + _ "embed" // embed compiled smart contract + "encoding/json" + + evmtypes "github.com/evmos/evmos/v18/x/evm/types" +) + +var ( + //go:embed compiled_contracts/WEVMOS.json + WEVMOSJSON []byte + + // WEVMOSContract is the compiled contract of WEVMOS + WEVMOSContract evmtypes.CompiledContract +) + +func init() { + err := json.Unmarshal(WEVMOSJSON, &WEVMOSContract) + if err != nil { + panic(err) + } + + if len(WEVMOSContract.Bin) == 0 { + panic("failed to load WEVMOS smart contract") + } +} diff --git a/ibc/testing/endpoint.go b/ibc/testing/endpoint.go index 2ff97d07b0..0953ad1969 100644 --- a/ibc/testing/endpoint.go +++ b/ibc/testing/endpoint.go @@ -4,6 +4,7 @@ package ibctesting import ( "fmt" + "time" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" @@ -109,10 +110,22 @@ func (endpoint *Endpoint) CreateClient() (err error) { return err } + require.NotNil( + endpoint.Chain.T, endpoint.Chain.SenderAccount, + fmt.Sprintf("expected sender account on chain with ID %q not to be nil", endpoint.Chain.ChainID), + ) + + zeroTimestamp := uint64(time.Time{}.UnixNano()) + require.NotEqual( + endpoint.Chain.T, consensusState.GetTimestamp(), zeroTimestamp, + "current timestamp on the last header is the zero time; it might be necessary to commit blocks with the IBC coordinator", + ) + msg, err := clienttypes.NewMsgCreateClient( clientState, consensusState, endpoint.Chain.SenderAccount.GetAddress().String(), ) require.NoError(endpoint.Chain.T, err) + require.NoError(endpoint.Chain.T, msg.ValidateBasic(), "failed to validate create client msg") res, err := SendMsgs(endpoint.Chain, DefaultFeeAmt, msg) if err != nil { diff --git a/testutil/integration/ibc/coordinator/coordinator.go b/testutil/integration/ibc/coordinator/coordinator.go index 406ecfc920..1af299d2eb 100644 --- a/testutil/integration/ibc/coordinator/coordinator.go +++ b/testutil/integration/ibc/coordinator/coordinator.go @@ -70,11 +70,16 @@ func NewIntegrationCoordinator(t *testing.T, preConfiguredChains []network.Netwo } } -// GetChain returns the TestChain for a given chainID. +// GetChain returns the TestChain for a given chainID but abstracted to our internal chain interface. func (c *IntegrationCoordinator) GetChain(chainID string) ibcchain.Chain { return c.coord.Chains[chainID] } +// GetTestChain returns the TestChain for a given chainID. +func (c *IntegrationCoordinator) GetTestChain(chainID string) *ibctesting.TestChain { + return c.coord.GetChain(chainID) +} + // GetDummyChainsIDs returns the chainIDs for all dummy chains. func (c *IntegrationCoordinator) GetDummyChainsIDs() []string { return c.dummyChainsIDs diff --git a/utils/utils.go b/utils/utils.go index 66aa67072f..dfabc48aa5 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -25,6 +25,8 @@ const ( MainnetChainID = "evmos_9001" // TestnetChainID defines the Evmos EIP155 chain ID for testnet TestnetChainID = "evmos_9000" + // TestingChainID defines the Evmos EIP155 chain ID for integration test + TestingChainID = "test_9000" // BaseDenom defines the Evmos mainnet denomination BaseDenom = "aevmos" ) @@ -39,6 +41,12 @@ func IsTestnet(chainID string) bool { return strings.HasPrefix(chainID, TestnetChainID) } +// IsTesting returns true if the chain-id has the "test" prefix. +// NOTE: for tests only +func IsTesting(chainID string) bool { + return strings.HasPrefix(chainID, TestingChainID) +} + // IsSupportedKey returns true if the pubkey type is supported by the chain // (i.e eth_secp256k1, amino multisig, ed25519). // NOTE: Nested multisigs are not supported. diff --git a/x/erc20/keeper/evm_hooks.go b/x/erc20/keeper/evm_hooks.go index fe5216ba3e..44d0c61987 100644 --- a/x/erc20/keeper/evm_hooks.go +++ b/x/erc20/keeper/evm_hooks.go @@ -9,12 +9,15 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" ethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/evmos/evmos/v18/utils" evmtypes "github.com/evmos/evmos/v18/x/evm/types" "github.com/evmos/evmos/v18/contracts" + erc20precompile "github.com/evmos/evmos/v18/precompiles/erc20" "github.com/evmos/evmos/v18/x/erc20/types" ) @@ -63,104 +66,212 @@ func (k Keeper) PostTxProcessing( for i, log := range receipt.Logs { // Note: the `Transfer` event contains 3 topics (id, from, to) - if len(log.Topics) != 3 { + // Note: the `Withdraw` and `Deposit` events contains 3 topics (id, from, to) + switch len(log.Topics) { + case 2: + k.PostProcessWithdrawDepositEvent(ctx, receipt, log) continue - } - - // Check if event is included in ERC20 - eventID := log.Topics[0] - event, err := erc20.EventByID(eventID) - if err != nil { + case 3: + k.PostProcessTransferEvent(ctx, receipt, erc20, log, i) continue - } - - // Check if event is a `Transfer` event. - if event.Name != types.ERC20EventTransfer { - k.Logger(ctx).Info("emitted event", "name", event.Name, "signature", event.Sig) + default: continue } + } - transferEvent, err := erc20.Unpack(event.Name, log.Data) - if err != nil { - k.Logger(ctx).Error("failed to unpack transfer event", "error", err.Error()) - continue - } + return nil +} - if len(transferEvent) == 0 { - continue - } +func (k Keeper) PostProcessTransferEvent( + ctx sdk.Context, + receipt *ethtypes.Receipt, + erc20 abi.ABI, + log *ethtypes.Log, + logid int, +) { + // Check if event is included in ERC20 + eventID := log.Topics[0] + event, err := erc20.EventByID(eventID) + if err != nil { + return + } - tokens, ok := transferEvent[0].(*big.Int) - // safety check and ignore if amount not positive - if !ok || tokens == nil || tokens.Sign() != 1 { - continue - } + // Check if event is a `Transfer` event. + if event.Name != types.ERC20EventTransfer { + k.Logger(ctx).Info("emitted event", "name", event.Name, "signature", event.Sig) + return + } - // Check if tokens are sent to module address - to := common.BytesToAddress(log.Topics[2].Bytes()) - if !bytes.Equal(to.Bytes(), types.ModuleAddress.Bytes()) { - continue - } + transferEvent, err := erc20.Unpack(event.Name, log.Data) + if err != nil { + k.Logger(ctx).Error("failed to unpack transfer event", "error", err.Error()) + return + } + + if len(transferEvent) == 0 { + return + } - // Check that the contract is a registered token pair - contractAddr := log.Address + tokens, ok := transferEvent[0].(*big.Int) + // safety check and ignore if amount not positive + if !ok || tokens == nil || tokens.Sign() != 1 { + return + } + + // Check that the contract is a registered token pair + contractAddr := log.Address + + isWevmos := getIsWevmos(ctx, contractAddr) + var pair types.TokenPair + var found bool + if !isWevmos { id := k.GetERC20Map(ctx, contractAddr) if len(id) == 0 { - continue + return } - pair, found := k.GetTokenPair(ctx, id) + pair, found = k.GetTokenPair(ctx, id) if !found { - continue + return } + } - // Check that conversion for the pair is enabled. Fail - if !pair.Enabled { - // continue to allow transfers for the ERC20 in case the token pair is - // disabled - k.Logger(ctx).Debug( - "ERC20 token -> Cosmos coin conversion is disabled for pair", - "coin", pair.Denom, "contract", pair.Erc20Address, - ) - continue - } + from := common.BytesToAddress(log.Topics[1].Bytes()) + to := common.BytesToAddress(log.Topics[2].Bytes()) - // create the corresponding sdk.Coin that is paired with ERC20 - coins := sdk.Coins{{Denom: pair.Denom, Amount: math.NewIntFromBigInt(tokens)}} + // Check if tokens are sent to module address + if !bytes.Equal(to.Bytes(), types.ModuleAddress.Bytes()) { + // if tokens are not sent to module address, we want to + // track the interaction of both addresses + // TODO: remove after the STRv2 migration - // Perform token conversion. We can now assume that the sender of a - // registered token wants to mint a Cosmos coin. - switch pair.ContractOwner { - case types.OWNER_MODULE: - _, err = k.CallEVM(ctx, erc20, types.ModuleAddress, contractAddr, true, "burn", tokens) - case types.OWNER_EXTERNAL: - err = k.bankKeeper.MintCoins(ctx, types.ModuleName, coins) - default: - err = types.ErrUndefinedOwner + // this only applies to native SDK coins and wevmos + if !pair.IsNativeCoin() && !isWevmos { + return } - if err != nil { - k.Logger(ctx).Debug( - "failed to process EVM hook for ER20 -> coin conversion", - "coin", pair.Denom, "contract", pair.Erc20Address, "error", err.Error(), - ) - continue + if !k.HasSTRv2Address(ctx, from.Bytes()) { + k.SetSTRv2Address(ctx, from.Bytes()) } - - // Only need last 20 bytes from log.topics - from := common.BytesToAddress(log.Topics[1].Bytes()) - recipient := sdk.AccAddress(from.Bytes()) - - // transfer the tokens from ModuleAccount to sender address - if err := k.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, recipient, coins); err != nil { - k.Logger(ctx).Debug( - "failed to process EVM hook for ER20 -> coin conversion", - "tx-hash", receipt.TxHash.Hex(), "log-idx", i, - "coin", pair.Denom, "contract", pair.Erc20Address, "error", err.Error(), - ) - continue + if !k.HasSTRv2Address(ctx, to.Bytes()) { + k.SetSTRv2Address(ctx, to.Bytes()) } + + return } - return nil + // Check that conversion for the pair is enabled. Fail + if !pair.Enabled { + // continue to allow transfers for the ERC20 in case the token pair is + // disabled + k.Logger(ctx).Debug( + "ERC20 token -> Cosmos coin conversion is disabled for pair", + "coin", pair.Denom, "contract", pair.Erc20Address, + ) + return + } + + // create the corresponding sdk.Coin that is paired with ERC20 + coins := sdk.Coins{{Denom: pair.Denom, Amount: math.NewIntFromBigInt(tokens)}} + + // Perform token conversion. We can now assume that the sender of a + // registered token wants to mint a Cosmos coin. + switch pair.ContractOwner { + case types.OWNER_MODULE: + _, err = k.CallEVM(ctx, erc20, types.ModuleAddress, contractAddr, true, "burn", tokens) + case types.OWNER_EXTERNAL: + err = k.bankKeeper.MintCoins(ctx, types.ModuleName, coins) + default: + err = types.ErrUndefinedOwner + } + + if err != nil { + k.Logger(ctx).Debug( + "failed to process EVM hook for ER20 -> coin conversion", + "coin", pair.Denom, "contract", pair.Erc20Address, "error", err.Error(), + ) + return + } + + // Only need last 20 bytes from log.topics + recipient := sdk.AccAddress(from.Bytes()) + + // transfer the tokens from ModuleAccount to sender address + if err := k.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, recipient, coins); err != nil { + k.Logger(ctx).Debug( + "failed to process EVM hook for ER20 -> coin conversion", + "tx-hash", receipt.TxHash.Hex(), "log-idx", logid, + "coin", pair.Denom, "contract", pair.Erc20Address, "error", err.Error(), + ) + return + } + + // If a sender is converting tokens to coins, we want to track their address too + // + // NOTE: this only applies to native SDK coins and Wevmos + if (pair.IsNativeCoin() || isWevmos) && !k.HasSTRv2Address(ctx, from.Bytes()) { + k.SetSTRv2Address(ctx, from.Bytes()) + } +} + +func (k Keeper) PostProcessWithdrawDepositEvent( + ctx sdk.Context, + _ *ethtypes.Receipt, + log *ethtypes.Log, +) { + wevmos := contracts.WEVMOSContract.ABI + + // Check if event is included in WevmosContract + eventID := log.Topics[0] + event, err := wevmos.EventByID(eventID) + if err != nil { + return + } + + // Check if event is a `Withdrawal` or `Deposit` event. + if event.Name != types.WevmosEventWithdraw && event.Name != types.WevmosEventDeposit { + return + } + + withdrawEvent, err := wevmos.Unpack(event.Name, log.Data) + if err != nil { + return + } + + if len(withdrawEvent) == 0 { + return + } + + tokens, ok := withdrawEvent[0].(*big.Int) + // safety check and ignore if amount not positive + if !ok || tokens == nil || tokens.Sign() != 1 { + return + } + + // Check that the contract is a registered token pair + contractAddr := log.Address + + isWevmos := getIsWevmos(ctx, contractAddr) + if !isWevmos { + return + } + + from := common.BytesToAddress(log.Topics[1].Bytes()) + + if !k.HasSTRv2Address(ctx, from.Bytes()) { + k.SetSTRv2Address(ctx, from.Bytes()) + } +} + +func getIsWevmos(ctx sdk.Context, contractAddr common.Address) bool { + switch { + case utils.IsMainnet(ctx.ChainID()): + return contractAddr.String() == erc20precompile.WEVMOSContractMainnet + case utils.IsTestnet(ctx.ChainID()): + return contractAddr.String() == erc20precompile.WEVMOSContractTestnet + case utils.IsTesting(ctx.ChainID()): + return true + default: + return false + } } diff --git a/x/erc20/keeper/ibc_callbacks_integration_test.go b/x/erc20/keeper/ibc_callbacks_integration_test.go index 84b0deb67b..247213dc4b 100644 --- a/x/erc20/keeper/ibc_callbacks_integration_test.go +++ b/x/erc20/keeper/ibc_callbacks_integration_test.go @@ -371,6 +371,67 @@ var _ = Describe("Convert receiving IBC to Erc20", Ordered, func() { s.Require().Equal(int64(0), erc20CoinsBalance.Amount.Int64()) }) }) + Describe("strv2 bookkeeping - registered uosmo", func() { + BeforeEach(func() { + erc20params := types.DefaultParams() + erc20params.EnableErc20 = true + err := s.app.Erc20Keeper.SetParams(s.EvmosChain.GetContext(), erc20params) + s.Require().NoError(err) + + sender = s.IBCOsmosisChain.SenderAccount.GetAddress().String() + receiver = s.EvmosChain.SenderAccount.GetAddress().String() + senderAcc = sdk.MustAccAddressFromBech32(sender) + receiverAcc = sdk.MustAccAddressFromBech32(receiver) + + // Register uosmo pair + pair, err = s.app.Erc20Keeper.RegisterCoin(s.EvmosChain.GetContext(), osmoMeta) + s.Require().NoError(err) + }) + It("should register receiver address", func() { + found := s.app.Erc20Keeper.HasSTRv2Address(s.EvmosChain.GetContext(), receiverAcc) + s.Require().False(found) + + s.EvmosChain.Coordinator.CommitBlock() + // Send coins + s.SendAndReceiveMessage(s.pathOsmosisEvmos, s.IBCOsmosisChain, "uosmo", amount, sender, receiver, 1, "") + s.EvmosChain.Coordinator.CommitBlock() + + found = s.app.Erc20Keeper.HasSTRv2Address(s.EvmosChain.GetContext(), receiverAcc) + s.Require().True(found) + + s.SendAndReceiveMessage(s.pathOsmosisEvmos, s.IBCOsmosisChain, "uosmo", amount, sender, receiver, 2, "") + s.EvmosChain.Coordinator.CommitBlock() + + found = s.app.Erc20Keeper.HasSTRv2Address(s.EvmosChain.GetContext(), receiverAcc) + s.Require().True(found) + }) + }) + + Describe("strv2 bookkeeping - unregistered uosmo", func() { + BeforeEach(func() { + erc20params := types.DefaultParams() + erc20params.EnableErc20 = true + err := s.app.Erc20Keeper.SetParams(s.EvmosChain.GetContext(), erc20params) + s.Require().NoError(err) + + sender = s.IBCOsmosisChain.SenderAccount.GetAddress().String() + receiver = s.EvmosChain.SenderAccount.GetAddress().String() + senderAcc = sdk.MustAccAddressFromBech32(sender) + receiverAcc = sdk.MustAccAddressFromBech32(receiver) + }) + It("should not register receiver address", func() { + found := s.app.Erc20Keeper.HasSTRv2Address(s.EvmosChain.GetContext(), receiverAcc) + s.Require().False(found) + + s.EvmosChain.Coordinator.CommitBlock() + // Send coins + s.SendAndReceiveMessage(s.pathOsmosisEvmos, s.IBCOsmosisChain, "uosmo", amount, sender, receiver, 1, "") + s.EvmosChain.Coordinator.CommitBlock() + + found = s.app.Erc20Keeper.HasSTRv2Address(s.EvmosChain.GetContext(), receiverAcc) + s.Require().False(found) + }) + }) }) var _ = Describe("Convert outgoing ERC20 to IBC", Ordered, func() { diff --git a/x/erc20/keeper/msg_server.go b/x/erc20/keeper/msg_server.go index 25ed83f3ea..e2fdbd5a61 100644 --- a/x/erc20/keeper/msg_server.go +++ b/x/erc20/keeper/msg_server.go @@ -138,6 +138,12 @@ func (k Keeper) convertCoinNativeCoin( return nil, err } + // Keep track of interactions for STR v2 migration + // TODO: to be removed in 2nd upgrade + if !k.HasSTRv2Address(ctx, receiver.Bytes()) { + k.SetSTRv2Address(ctx, receiver.Bytes()) + } + // Check expected receiver balance after transfer tokens := msg.Coin.Amount.BigInt() balanceTokenAfter := k.BalanceOf(ctx, erc20, contract, receiver) @@ -251,6 +257,12 @@ func (k Keeper) convertERC20NativeCoin( ) } + // Keep track of interactions for STR v2 migration + // TODO: to be removed in 2nd upgrade + if !k.HasSTRv2Address(ctx, receiver) { + k.SetSTRv2Address(ctx, receiver) + } + defer func() { telemetry.IncrCounterWithLabels( []string{"tx", "msg", "convert", "erc20", "total"}, diff --git a/x/erc20/keeper/str_v2.go b/x/erc20/keeper/str_v2.go new file mode 100644 index 0000000000..8bb4748b96 --- /dev/null +++ b/x/erc20/keeper/str_v2.go @@ -0,0 +1,58 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package keeper + +import ( + "github.com/cosmos/cosmos-sdk/store/prefix" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/evmos/evmos/v18/x/erc20/types" +) + +// SetSTRv2Address stores an address that will be affected by the +// Single Token Representation v2 migration. +func (k Keeper) SetSTRv2Address(ctx sdk.Context, address sdk.AccAddress) { + store := prefix.NewStore( + ctx.KVStore(k.storeKey), + types.KeyPrefixSTRv2Addresses, + ) + store.Set(address.Bytes(), []byte{}) +} + +// HasSTRv2Address checks if a given address has already been stored as +// affected by the STR v2 migration. +func (k Keeper) HasSTRv2Address(ctx sdk.Context, address sdk.AccAddress) bool { + store := prefix.NewStore( + ctx.KVStore(k.storeKey), + types.KeyPrefixSTRv2Addresses, + ) + return store.Has(address.Bytes()) +} + +// DeleteSTRv2Address removes the entry already stored +// NOTE: for testing purpose only +func (k Keeper) DeleteSTRv2Address(ctx sdk.Context, address sdk.AccAddress) { + store := prefix.NewStore( + ctx.KVStore(k.storeKey), + types.KeyPrefixSTRv2Addresses, + ) + store.Delete(address.Bytes()) +} + +// GetAllSTRV2Address iterates over all the stored accounts that interacted with registered coins. +// and returns them in an array +func (k Keeper) GetAllSTRV2Address(ctx sdk.Context) []sdk.AccAddress { + store := ctx.KVStore(k.storeKey) + iterator := sdk.KVStorePrefixIterator(store, types.KeyPrefixSTRv2Addresses) + defer iterator.Close() + + accAddresses := []sdk.AccAddress{} + + for ; iterator.Valid(); iterator.Next() { + // First byte is the prefix, final bytes is the address + // iterator.Value is empty + address := sdk.AccAddress(iterator.Key()[1:]) + accAddresses = append(accAddresses, address) + } + return accAddresses +} diff --git a/x/erc20/keeper/str_v2_test.go b/x/erc20/keeper/str_v2_test.go new file mode 100644 index 0000000000..4442ead820 --- /dev/null +++ b/x/erc20/keeper/str_v2_test.go @@ -0,0 +1,126 @@ +package keeper_test + +import ( + "fmt" + + sdk "github.com/cosmos/cosmos-sdk/types" +) + +func (suite *KeeperTestSuite) TestSetDeleteSTRV2Address() { + address1 := suite.address.Bytes() + address2 := suite.consAddress.Bytes() + + suite.SetupTest() + + // Set the same address twice, and it shouldn't fail + suite.app.Erc20Keeper.SetSTRv2Address(suite.ctx, address1) + suite.Require().Equal(true, suite.app.Erc20Keeper.HasSTRv2Address(suite.ctx, address1)) + suite.app.Erc20Keeper.SetSTRv2Address(suite.ctx, address1) + suite.Require().Equal(true, suite.app.Erc20Keeper.HasSTRv2Address(suite.ctx, address1)) + + // Set a different address and it shouldn't affect the first address + suite.app.Erc20Keeper.SetSTRv2Address(suite.ctx, address2) + suite.Require().Equal(true, suite.app.Erc20Keeper.HasSTRv2Address(suite.ctx, address2)) + suite.app.Erc20Keeper.SetSTRv2Address(suite.ctx, address1) + suite.Require().Equal(true, suite.app.Erc20Keeper.HasSTRv2Address(suite.ctx, address1)) + + // Delete the first address. + // - it should delete the first address + // - it shouldn't affect the second one + suite.app.Erc20Keeper.DeleteSTRv2Address(suite.ctx, address1) + suite.Require().Equal(false, suite.app.Erc20Keeper.HasSTRv2Address(suite.ctx, address1)) + suite.app.Erc20Keeper.DeleteSTRv2Address(suite.ctx, address1) + suite.Require().Equal(false, suite.app.Erc20Keeper.HasSTRv2Address(suite.ctx, address1)) + suite.Require().Equal(true, suite.app.Erc20Keeper.HasSTRv2Address(suite.ctx, address2)) + + // Set the deleted address again + suite.app.Erc20Keeper.SetSTRv2Address(suite.ctx, address1) + suite.Require().Equal(true, suite.app.Erc20Keeper.HasSTRv2Address(suite.ctx, address1)) + suite.Require().Equal(true, suite.app.Erc20Keeper.HasSTRv2Address(suite.ctx, address2)) +} + +func (suite *KeeperTestSuite) TestHasSTRV2Address() { + address1 := suite.address.Bytes() + address2 := suite.consAddress.Bytes() + + testCases := []struct { + name string + malleate func() + expected bool + }{ + { + "space is empty", + func() { + }, + false, + }, + { + "set one address - should have it", + func() { + suite.app.Erc20Keeper.SetSTRv2Address(suite.ctx, address1) + }, + true, + }, + { + "set two addresses - should have the first one", + func() { + suite.app.Erc20Keeper.SetSTRv2Address(suite.ctx, address1) + suite.app.Erc20Keeper.SetSTRv2Address(suite.ctx, address2) + }, + true, + }, + } + for _, tc := range testCases { + suite.Run(fmt.Sprintf("Case %s", tc.name), func() { + suite.SetupTest() // reset + + tc.malleate() + + actual := suite.app.Erc20Keeper.HasSTRv2Address(suite.ctx, address1) + suite.Require().Equal(tc.expected, actual) + }) + } +} + +func (suite *KeeperTestSuite) TestGetAllSTRV2Address() { + address1 := suite.address.Bytes() + address2 := suite.consAddress.Bytes() + + testCases := []struct { + name string + malleate func() + expected []sdk.AccAddress + }{ + { + "space is empty", + func() { + }, + []sdk.AccAddress{}, + }, + { + "set one address - should return it", + func() { + suite.app.Erc20Keeper.SetSTRv2Address(suite.ctx, address1) + }, + []sdk.AccAddress{address1}, + }, + { + "set two addresses - should return both", + func() { + suite.app.Erc20Keeper.SetSTRv2Address(suite.ctx, address1) + suite.app.Erc20Keeper.SetSTRv2Address(suite.ctx, address2) + }, + []sdk.AccAddress{address1, address2}, + }, + } + for _, tc := range testCases { + suite.Run(fmt.Sprintf("Case %s", tc.name), func() { + suite.SetupTest() // reset + + tc.malleate() + + addresses := suite.app.Erc20Keeper.GetAllSTRV2Address(suite.ctx) + suite.Require().ElementsMatch(tc.expected, addresses) + }) + } +} diff --git a/x/erc20/keeper/testdata/tokenTransfer.go b/x/erc20/keeper/testdata/tokenTransfer.go new file mode 100644 index 0000000000..4cdd6684a1 --- /dev/null +++ b/x/erc20/keeper/testdata/tokenTransfer.go @@ -0,0 +1,26 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package testdata + +import ( + _ "embed" // embed compiled smart contract + "encoding/json" + + evmtypes "github.com/evmos/evmos/v18/x/evm/types" +) + +var ( + //go:embed tokenTransfer.json + tokenTransferJSON []byte + + // TokenTransferContract is the compiled tokenTransfer contract + TokenTransferContract evmtypes.CompiledContract +) + +func init() { + err := json.Unmarshal(tokenTransferJSON, &TokenTransferContract) + if err != nil { + panic(err) + } +} diff --git a/x/erc20/keeper/testdata/tokenTransfer.json b/x/erc20/keeper/testdata/tokenTransfer.json new file mode 100644 index 0000000000..3c1d9c3dec --- /dev/null +++ b/x/erc20/keeper/testdata/tokenTransfer.json @@ -0,0 +1,4 @@ +{ + "abi": "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + "bin": "608060405234801561000f575f80fd5b506040516103ae3803806103ae833981810160405281019061003191906100d4565b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506100ff565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6100a38261007a565b9050919050565b6100b381610099565b81146100bd575f80fd5b50565b5f815190506100ce816100aa565b92915050565b5f602082840312156100e9576100e8610076565b5b5f6100f6848285016100c0565b91505092915050565b6102a28061010c5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c80631072cbea1461002d575b5f80fd5b6100476004803603810190610042919061017b565b610049565b005b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3384846040518463ffffffff1660e01b81526004016100a5939291906101d7565b6020604051808303815f875af11580156100c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e59190610241565b505050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610117826100ee565b9050919050565b6101278161010d565b8114610131575f80fd5b50565b5f813590506101428161011e565b92915050565b5f819050919050565b61015a81610148565b8114610164575f80fd5b50565b5f8135905061017581610151565b92915050565b5f8060408385031215610191576101906100ea565b5b5f61019e85828601610134565b92505060206101af85828601610167565b9150509250929050565b6101c28161010d565b82525050565b6101d181610148565b82525050565b5f6060820190506101ea5f8301866101b9565b6101f760208301856101b9565b61020460408301846101c8565b949350505050565b5f8115159050919050565b6102208161020c565b811461022a575f80fd5b50565b5f8151905061023b81610217565b92915050565b5f60208284031215610256576102556100ea565b5b5f6102638482850161022d565b9150509291505056fea2646970667358221220bbc26fe3b0578219ad6235976ab9666151b3049b14b3d87a76d448f47aad0e8964736f6c63430008180033" +} \ No newline at end of file diff --git a/x/erc20/keeper/testdata/tokenTransfer.sol b/x/erc20/keeper/testdata/tokenTransfer.sol new file mode 100644 index 0000000000..7d11c67368 --- /dev/null +++ b/x/erc20/keeper/testdata/tokenTransfer.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; + +/* + @title tokenTransfer + @dev This contract is used to test that any addresses transferring ERC-20 tokens + are tracked if they're ERC-20 representations of native Cosmos coins. +*/ +contract tokenTransfer { + ERC20 token; + + constructor(address tokenAddress){ + token = ERC20(tokenAddress); + } + + /* + @notice This function is used to transfer ERC-20 tokens to a given address. + @param to The address to transfer the tokens to + @param amount The amount of tokens to transfer + */ + function transferToken(address to, uint256 amount) public { + token.transfer(to, amount); + } +} diff --git a/x/erc20/strv2/strv2_hooks_test.go b/x/erc20/strv2/strv2_hooks_test.go new file mode 100644 index 0000000000..bc168de292 --- /dev/null +++ b/x/erc20/strv2/strv2_hooks_test.go @@ -0,0 +1,311 @@ +package strv2_test + +import ( + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/common" + "github.com/evmos/evmos/v18/contracts" + testfactory "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" + grpchandler "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + "github.com/evmos/evmos/v18/utils" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/stretchr/testify/require" +) + +type STRV2WEVMOSHooksTestSuite struct { + keyring testkeyring.Keyring + network *network.UnitTestNetwork + factory testfactory.TxFactory + + // account is the address of the account to withdraw WEVMOS from. + account common.Address + // wevmosContract is the address of the WEVMOS contract. + wevmosContract common.Address +} + +const ( + + // erc20Deployer is the index for the account that deploys the ERC-20 contract. + erc20Deployer = 0 +) + +// sentWEVMOS is the amount of WEVMOS sent to the WEVMOS contract during testing. +var sentWEVMOS = sdk.NewInt(1e18) + +func TestDepositWEVMOS(t *testing.T) { + t.Parallel() + + senderIdx := 0 + kr := testkeyring.New(1) + + testcases := []struct { + name string + malleate func(suite *STRV2WEVMOSHooksTestSuite) error + expFound bool + errContains string + chainID string + }{ + { + name: "found - deposit WEVMOS", + malleate: func(ts *STRV2WEVMOSHooksTestSuite) error { + // Deploy WEVMOS contract + wevmosAddr, err := ts.factory.DeployContract( + ts.keyring.GetPrivKey(erc20Deployer), + evmtypes.EvmTxArgs{}, + testfactory.ContractDeploymentData{Contract: contracts.WEVMOSContract}, + ) + require.NoError(t, err, "failed to deploy WEVMOS contract") + + ts.account = kr.GetAddr(senderIdx) + ts.wevmosContract = wevmosAddr + + require.False(t, ts.network.App.Erc20Keeper.HasSTRv2Address(ts.network.GetContext(), ts.keyring.GetAccAddr(0))) + + return nil + }, + expFound: true, + chainID: utils.TestingChainID + "-1", + }, + { + name: "found - should not fail if address already there while deposit WEVMOS", + malleate: func(ts *STRV2WEVMOSHooksTestSuite) error { + // Deploy WEVMOS contract + wevmosAddr, err := ts.factory.DeployContract( + ts.keyring.GetPrivKey(erc20Deployer), + evmtypes.EvmTxArgs{}, + testfactory.ContractDeploymentData{Contract: contracts.WEVMOSContract}, + ) + require.NoError(t, err, "failed to deploy WEVMOS contract") + + ts.account = kr.GetAddr(senderIdx) + ts.wevmosContract = wevmosAddr + + ts.network.App.Erc20Keeper.SetSTRv2Address(ts.network.GetContext(), ts.keyring.GetAccAddr(0)) + + return nil + }, + expFound: true, + chainID: utils.TestingChainID + "-1", + }, + { + name: "not found - should not register since its not expected contract", + malleate: func(ts *STRV2WEVMOSHooksTestSuite) error { + // Deploy WEVMOS contract + wevmosAddr, err := ts.factory.DeployContract( + ts.keyring.GetPrivKey(erc20Deployer), + evmtypes.EvmTxArgs{}, + testfactory.ContractDeploymentData{Contract: contracts.WEVMOSContract}, + ) + require.NoError(t, err, "failed to deploy WEVMOS contract") + + ts.account = kr.GetAddr(senderIdx) + ts.wevmosContract = wevmosAddr + + return nil + }, + expFound: false, + chainID: utils.TestnetChainID + "-1", + }, + } + + for _, tc := range testcases { + tc := tc // capture range variable (for parallel testing) + + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + // Set up a new network + nw := network.NewUnitTestNetwork( + network.WithChainID(tc.chainID), + network.WithPreFundedAccounts(kr.GetAllAccAddrs()...), + ) + handler := grpchandler.NewIntegrationHandler(nw) + txFactory := testfactory.New(nw, handler) + + ts := &STRV2WEVMOSHooksTestSuite{ + keyring: kr, + network: nw, + factory: txFactory, + } + + err := tc.malleate(ts) + require.NoError(t, err, "failed to malleate test suite") + + // Send WEVMOS to account + _, err = ts.factory.ExecuteEthTx( + ts.keyring.GetPrivKey(senderIdx), + evmtypes.EvmTxArgs{ + To: &ts.wevmosContract, + Amount: sentWEVMOS.BigInt(), + // FIXME: the gas simulation is not working correctly - otherwise results in out of gas + GasLimit: 100_000, + }, + ) + require.NoError(t, err, "failed to send WEVMOS to account") + + require.Equal(t, tc.expFound, ts.network.App.Erc20Keeper.HasSTRv2Address(ts.network.GetContext(), ts.keyring.GetAccAddr(0))) + }) + } +} + +func TestWithdrawWEVMOS(t *testing.T) { + t.Parallel() + + senderIdx := 0 + kr := testkeyring.New(1) + + testcases := []struct { + name string + malleate func(suite *STRV2WEVMOSHooksTestSuite) error + expFound bool + errContains string + chainID string + }{ + { + name: "found - withdraw WEVMOS", + malleate: func(ts *STRV2WEVMOSHooksTestSuite) error { + // Deploy WEVMOS contract + wevmosAddr, err := ts.factory.DeployContract( + ts.keyring.GetPrivKey(erc20Deployer), + evmtypes.EvmTxArgs{}, + testfactory.ContractDeploymentData{Contract: contracts.WEVMOSContract}, + ) + require.NoError(t, err, "failed to deploy WEVMOS contract") + + // Send WEVMOS to account + _, err = ts.factory.ExecuteEthTx( + ts.keyring.GetPrivKey(senderIdx), + evmtypes.EvmTxArgs{ + To: &wevmosAddr, + Amount: sentWEVMOS.BigInt(), + // FIXME: the gas simulation is not working correctly - otherwise results in out of gas + GasLimit: 100_000, + }, + ) + require.NoError(t, err, "failed to send WEVMOS to account") + + // Address was added after deposit, delete the entry to test withdraw + require.True(t, ts.network.App.Erc20Keeper.HasSTRv2Address(ts.network.GetContext(), ts.keyring.GetAccAddr(0))) + ts.network.App.Erc20Keeper.DeleteSTRv2Address(ts.network.GetContext(), ts.keyring.GetAccAddr(0)) + require.False(t, ts.network.App.Erc20Keeper.HasSTRv2Address(ts.network.GetContext(), ts.keyring.GetAccAddr(0))) + + ts.account = kr.GetAddr(senderIdx) + ts.wevmosContract = wevmosAddr + + return nil + }, + expFound: true, + chainID: utils.TestingChainID + "-1", + }, + { //nolint:dupl + name: "found - with address already registered - withdraw WEVMOS", + malleate: func(ts *STRV2WEVMOSHooksTestSuite) error { + // Deploy WEVMOS contract + wevmosAddr, err := ts.factory.DeployContract( + ts.keyring.GetPrivKey(erc20Deployer), + evmtypes.EvmTxArgs{}, + testfactory.ContractDeploymentData{Contract: contracts.WEVMOSContract}, + ) + require.NoError(t, err, "failed to deploy WEVMOS contract") + + // Send WEVMOS to account + _, err = ts.factory.ExecuteEthTx( + ts.keyring.GetPrivKey(senderIdx), + evmtypes.EvmTxArgs{ + To: &wevmosAddr, + Amount: sentWEVMOS.BigInt(), + // FIXME: the gas simulation is not working correctly - otherwise results in out of gas + GasLimit: 100_000, + }, + ) + require.NoError(t, err, "failed to send WEVMOS to account") + + require.True(t, ts.network.App.Erc20Keeper.HasSTRv2Address(ts.network.GetContext(), ts.keyring.GetAccAddr(0))) + + ts.account = kr.GetAddr(senderIdx) + ts.wevmosContract = wevmosAddr + + return nil + }, + expFound: true, + chainID: utils.TestingChainID + "-1", + }, + { //nolint:dupl + name: "not found - wrong contract - withdraw WEVMOS", + malleate: func(ts *STRV2WEVMOSHooksTestSuite) error { + // Deploy WEVMOS contract + wevmosAddr, err := ts.factory.DeployContract( + ts.keyring.GetPrivKey(erc20Deployer), + evmtypes.EvmTxArgs{}, + testfactory.ContractDeploymentData{Contract: contracts.WEVMOSContract}, + ) + require.NoError(t, err, "failed to deploy WEVMOS contract") + + // Send WEVMOS to account + _, err = ts.factory.ExecuteEthTx( + ts.keyring.GetPrivKey(senderIdx), + evmtypes.EvmTxArgs{ + To: &wevmosAddr, + Amount: sentWEVMOS.BigInt(), + // FIXME: the gas simulation is not working correctly - otherwise results in out of gas + GasLimit: 100_000, + }, + ) + require.NoError(t, err, "failed to send WEVMOS to account") + + require.True(t, ts.network.App.Erc20Keeper.HasSTRv2Address(ts.network.GetContext(), ts.keyring.GetAccAddr(0))) + + ts.account = kr.GetAddr(senderIdx) + ts.wevmosContract = wevmosAddr + + return nil + }, + expFound: false, + chainID: utils.TestnetChainID + "-1", + }, + } + + for _, tc := range testcases { + tc := tc // capture range variable (for parallel testing) + + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + // Set up a new network + nw := network.NewUnitTestNetwork( + network.WithChainID(utils.TestingChainID+"-1"), + network.WithPreFundedAccounts(kr.GetAllAccAddrs()...), + ) + handler := grpchandler.NewIntegrationHandler(nw) + txFactory := testfactory.New(nw, handler) + + ts := &STRV2WEVMOSHooksTestSuite{ + keyring: kr, + network: nw, + factory: txFactory, + } + + err := tc.malleate(ts) + require.NoError(t, err, "failed to malleate test suite") + + _, err = ts.factory.ExecuteContractCall( + ts.keyring.GetPrivKey(0), + evmtypes.EvmTxArgs{ + To: &ts.wevmosContract, + }, + testfactory.CallArgs{ + ContractABI: contracts.WEVMOSContract.ABI, + MethodName: "withdraw", + Args: []interface{}{ + transferAmount, + }, + }, + ) + require.NoError(t, err) + require.True(t, ts.network.App.Erc20Keeper.HasSTRv2Address(ts.network.GetContext(), ts.keyring.GetAccAddr(0))) + }) + } +} diff --git a/x/erc20/strv2/strv2_integration_test.go b/x/erc20/strv2/strv2_integration_test.go new file mode 100644 index 0000000000..1df53a797d --- /dev/null +++ b/x/erc20/strv2/strv2_integration_test.go @@ -0,0 +1,628 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package strv2_test + +import ( + "math/big" + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/common" + "github.com/evmos/evmos/v18/contracts" + commonfactory "github.com/evmos/evmos/v18/testutil/integration/common/factory" + testfactory "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" + testnetwork "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + "github.com/evmos/evmos/v18/utils" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" + + "github.com/evmos/evmos/v18/x/erc20/keeper/testdata" + erc20types "github.com/evmos/evmos/v18/x/erc20/types" + + . "github.com/onsi/ginkgo/v2" //nolint:revive + . "github.com/onsi/gomega" //nolint:revive +) + +func TestSTRv2Tracking(t *testing.T) { + // Run Ginkgo BDD tests + RegisterFailHandler(Fail) + RunSpecs(t, "STRv2 Tracking Tests") +} + +type STRv2TrackingSuite struct { + keyring testkeyring.Keyring + network *testnetwork.UnitTestNetwork + handler grpc.Handler + factory testfactory.TxFactory + + nativeCoinERC20Addr common.Address + registeredERC20Addr common.Address + unregisteredERC20Addr common.Address + wevmosAddr common.Address +} + +const ( + deployerIdx = 0 + nativeIBCCoinDenom = "coin" +) + +var ( + mintAmount = big.NewInt(1000000000000000000) + convertAmount = testnetwork.PrefundedAccountInitialBalance.QuoRaw(10) + transferAmount = convertAmount.QuoRaw(10).BigInt() +) + +var _ = Describe("STRv2 Tracking -", func() { + var s *STRv2TrackingSuite + + BeforeEach(func() { + var err error + s, err = CreateTestSuite(utils.MainnetChainID + "-1") + Expect(err).ToNot(HaveOccurred(), "failed to create test suite") + + // NOTE: this is necessary to enable e.g. erc20Keeper.BalanceOf(...) to work + // correctly internally. + // Removing it will break a bunch of tests giving errors like: "failed to retrieve balance" + Expect(s.network.NextBlock()).To(BeNil(), "failed to advance block") + }) + + When("sending an EVM transaction", func() { + Context("which interacts with a registered native token pair ERC-20 contract", func() { + Context("in a direct call to the token pair contract", func() { + It("should add the from and to addresses to the store if it is not already stored", func() { //nolint:all + sender := s.keyring.GetKey(0) + receiver := s.keyring.GetKey(2) + + senderAddrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) + Expect(senderAddrTracked).To(BeFalse(), "expected address not to be stored before conversion") + receiverAddrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), receiver.AccAddr) + Expect(receiverAddrTracked).To(BeFalse(), "expected address not to be stored before conversion") + + _, err := s.factory.ExecuteContractCall( + sender.Priv, + evmtypes.EvmTxArgs{ + To: &s.nativeCoinERC20Addr, + }, + testfactory.CallArgs{ + ContractABI: contracts.ERC20MinterBurnerDecimalsContract.ABI, + MethodName: "transfer", + Args: []interface{}{ + receiver.Addr, + transferAmount, + }, + }, + ) + Expect(err).ToNot(HaveOccurred(), "failed to transfer tokens of Cosmos native ERC-20 token pair") + + Expect(s.network.NextBlock()).To(BeNil(), "failed to advance block") + + senderAddrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) + Expect(senderAddrTracked).To(BeTrue(), "expected address to be stored") + receiverAddrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) + Expect(receiverAddrTracked).To(BeTrue(), "expected address to be stored") + }) + + It("should not fail if the addresses are already stored", func() { + sender := s.keyring.GetKey(0) + receiver := s.keyring.GetKey(2) + + senderAddrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) + Expect(senderAddrTracked).To(BeFalse(), "expected address not to be stored before conversion") + receiverAddrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), receiver.AccAddr) + Expect(receiverAddrTracked).To(BeFalse(), "expected address not to be stored before conversion") + + _, err := s.factory.ExecuteContractCall( + sender.Priv, + evmtypes.EvmTxArgs{ + To: &s.nativeCoinERC20Addr, + }, + testfactory.CallArgs{ + ContractABI: contracts.ERC20MinterBurnerDecimalsContract.ABI, + MethodName: "transfer", + Args: []interface{}{ + receiver.Addr, + transferAmount, + }, + }, + ) + Expect(err).ToNot(HaveOccurred(), "failed to transfer tokens of Cosmos native ERC-20 token pair") + + Expect(s.network.NextBlock()).To(BeNil(), "failed to advance block") + + _, err = s.factory.ExecuteContractCall( + sender.Priv, + evmtypes.EvmTxArgs{ + To: &s.nativeCoinERC20Addr, + }, + testfactory.CallArgs{ + ContractABI: contracts.ERC20MinterBurnerDecimalsContract.ABI, + MethodName: "transfer", + Args: []interface{}{ + receiver.Addr, + transferAmount, + }, + }, + ) + Expect(err).ToNot(HaveOccurred(), "failed to transfer tokens of Cosmos native ERC-20 token pair (2nd call)") + + Expect(s.network.NextBlock()).To(BeNil(), "failed to advance block") + + senderAddrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) + Expect(senderAddrTracked).To(BeTrue(), "expected address to be still stored") + receiverAddrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), receiver.AccAddr) + Expect(receiverAddrTracked).To(BeTrue(), "expected address to be still stored") + }) + It("should not store anything if calling a different method than transfer or transferFrom", func() { //nolint:all + sender := s.keyring.GetKey(0) + grantee := s.keyring.GetKey(2) + + senderAddrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) + Expect(senderAddrTracked).To(BeFalse(), "expected address not to be stored before conversion") + receiverAddrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), grantee.AccAddr) + Expect(receiverAddrTracked).To(BeFalse(), "expected address not to be stored before conversion") + + _, err := s.factory.ExecuteContractCall( + sender.Priv, + evmtypes.EvmTxArgs{ + To: &s.nativeCoinERC20Addr, + }, + testfactory.CallArgs{ + ContractABI: contracts.ERC20MinterBurnerDecimalsContract.ABI, + MethodName: "approve", + Args: []interface{}{ + grantee.Addr, + transferAmount, + }, + }, + ) + Expect(err).ToNot(HaveOccurred(), "failed to approve ERC-20 transfer") + + Expect(s.network.NextBlock()).To(BeNil(), "failed to advance block") + + senderAddrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) + Expect(senderAddrTracked).To(BeFalse(), "expected address not to be stored") + receiverAddrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), grantee.AccAddr) + Expect(receiverAddrTracked).To(BeFalse(), "expected address not to be stored") + }) + }) + + Context("in a call to the token pair contract from another contract", func() { + var ( + senderIdx = deployerIdx + tokenTransferAddr common.Address + ) + + BeforeEach(func() { + deployer := s.keyring.GetKey(deployerIdx) + sender := s.keyring.GetKey(senderIdx) + + var err error + tokenTransferAddr, err = s.factory.DeployContract( + deployer.Priv, + evmtypes.EvmTxArgs{}, + testfactory.ContractDeploymentData{ + Contract: testdata.TokenTransferContract, + ConstructorArgs: []interface{}{s.nativeCoinERC20Addr}, + }, + ) + Expect(err).ToNot(HaveOccurred(), "failed to deploy ERC-20 transfer contract") + + Expect(s.network.NextBlock()).To(BeNil(), "failed to advance block") + + // approve the contract to spend on behalf of the sender + _, err = s.factory.ExecuteContractCall( + sender.Priv, + evmtypes.EvmTxArgs{ + To: &s.nativeCoinERC20Addr, + }, + testfactory.CallArgs{ + ContractABI: contracts.ERC20MinterBurnerDecimalsContract.ABI, + MethodName: "approve", + Args: []interface{}{ + tokenTransferAddr, + transferAmount, + }, + }, + ) + Expect(err).ToNot(HaveOccurred(), "failed to approve ERC-20 transfer contract to spend on behalf of the sender") + + Expect(s.network.NextBlock()).To(BeNil(), "failed to advance block") + }) + + It("should add the from AND to address to the store if it is not already stored", func() { + sender := s.keyring.GetKey(senderIdx) + receiver := s.keyring.GetKey(senderIdx + 1) + + senderAddrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) + Expect(senderAddrTracked).To(BeFalse(), "expected address not to be stored before conversion") + receiverAddrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), receiver.AccAddr) + Expect(receiverAddrTracked).To(BeFalse(), "expected address not to be stored before conversion") + + _, err := s.factory.ExecuteContractCall( + sender.Priv, + evmtypes.EvmTxArgs{ + To: &tokenTransferAddr, + }, + testfactory.CallArgs{ + ContractABI: testdata.TokenTransferContract.ABI, + MethodName: "transferToken", + Args: []interface{}{ + receiver.Addr, + transferAmount, + }, + }, + ) + Expect(err).ToNot(HaveOccurred(), "failed to transfer tokens of Cosmos native ERC-20 token pair") + + Expect(s.network.NextBlock()).To(BeNil(), "failed to advance block") + + senderAddrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) + Expect(senderAddrTracked).To(BeTrue(), "expected address to be stored") + receiverAddrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), receiver.AccAddr) + Expect(receiverAddrTracked).To(BeTrue(), "expected address to be stored") + }) + + It("should add the from address if sending to the ERC-20 module address", func() { + sender := s.keyring.GetKey(senderIdx) + + senderAddrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) + Expect(senderAddrTracked).To(BeFalse(), "expected address not to be stored before conversion") + + _, err := s.factory.ExecuteContractCall( + sender.Priv, + evmtypes.EvmTxArgs{ + To: &tokenTransferAddr, + }, + testfactory.CallArgs{ + ContractABI: testdata.TokenTransferContract.ABI, + MethodName: "transferToken", + Args: []interface{}{ + erc20types.ModuleAddress, + transferAmount, + }, + }, + ) + Expect(err).ToNot(HaveOccurred(), "failed to transfer tokens of Cosmos native ERC-20 token pair") + + Expect(s.network.NextBlock()).To(BeNil(), "failed to advance block") + + senderAddrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) + Expect(senderAddrTracked).To(BeTrue(), "expected address to be stored") + }) + }) + + // NOTE: this is running the coin conversion too + Context("sending tokens to the module address", func() { + It("should add the sender address in a direct call", func() { + sender := s.keyring.GetKey(0) + + senderAddrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) + Expect(senderAddrTracked).To(BeFalse(), "expected address not to be stored before conversion") + + _, err := s.factory.ExecuteContractCall( + sender.Priv, + evmtypes.EvmTxArgs{ + To: &s.nativeCoinERC20Addr, + }, + testfactory.CallArgs{ + ContractABI: contracts.ERC20MinterBurnerDecimalsContract.ABI, + MethodName: "transfer", + Args: []interface{}{ + erc20types.ModuleAddress, + transferAmount, + }, + }, + ) + Expect(err).ToNot(HaveOccurred(), "failed to transfer tokens of Cosmos native ERC-20 token pair") + + Expect(s.network.NextBlock()).To(BeNil(), "failed to advance block") + + senderAddrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) + Expect(senderAddrTracked).To(BeTrue(), "expected address to be stored") + erc20AddrTrack := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), erc20types.ModuleAddress.Bytes()) + Expect(erc20AddrTrack).To(BeFalse(), "expected module address not to be stored") + }) + }) + }) + + Context("which interacts with a registered non-native token pair ERC-20 contract", func() { + It("should not add the address to the store", func() { + deployer := s.keyring.GetKey(deployerIdx) + + addrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), deployer.AccAddr) + Expect(addrTracked).To(BeFalse(), "expected address not to be stored before conversion") + + _, err := s.factory.ExecuteContractCall( + deployer.Priv, + evmtypes.EvmTxArgs{ + To: &s.registeredERC20Addr, + }, + testfactory.CallArgs{ + ContractABI: contracts.ERC20MinterBurnerDecimalsContract.ABI, + MethodName: "mint", + Args: []interface{}{ + deployer.Addr, + mintAmount, + }, + }, + ) + Expect(err).ToNot(HaveOccurred(), "failed to interact with registered ERC-20 contract") + + addrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), deployer.AccAddr) + Expect(addrTracked).To(BeFalse(), "expected address to not be stored") + }) + }) + + Context("which interacts with an unregistered ERC-20 contract", func() { + It("should not add the address to the store", func() { + deployer := s.keyring.GetKey(deployerIdx) + + _, err := s.factory.ExecuteContractCall( + deployer.Priv, + evmtypes.EvmTxArgs{ + To: &s.unregisteredERC20Addr, + }, + testfactory.CallArgs{ + ContractABI: contracts.ERC20MinterBurnerDecimalsContract.ABI, + MethodName: "mint", + Args: []interface{}{ + deployer.Addr, + mintAmount, + }, + }, + ) + Expect(err).ToNot(HaveOccurred(), "failed to interact with unregistered ERC-20 contract") + + deployerAddrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), deployer.AccAddr) + Expect(deployerAddrTracked).To(BeFalse(), "expected address to not be stored") + }) + }) + }) + + When("manually converting", func() { + Context("a registered coin into its ERC-20 representation", func() { + It("should add the address to the store if it is not already stored", func() { + sender := s.keyring.GetKey(1) + + addrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) + Expect(addrTracked).To(BeFalse(), "expected address not to be stored before conversion") + + _, err := s.factory.ExecuteCosmosTx( + sender.Priv, + commonfactory.CosmosTxArgs{ + Msgs: []sdk.Msg{ + &erc20types.MsgConvertCoin{ + Sender: sender.AccAddr.String(), + Receiver: sender.Addr.String(), + Coin: sdk.NewCoin(nativeIBCCoinDenom, convertAmount), + }, + }, + }, + ) + Expect(err).ToNot(HaveOccurred(), "failed to convert native IBC coin") + + Expect(s.network.NextBlock()).To(BeNil(), "failed to advance block") + + addrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) + Expect(addrTracked).To(BeTrue(), "expected address to be stored") + }) + + // TODO: is this correct? Yes, because only the addresses with ERC-20 tokens are relevant? + It("should store only the receiving address if the sender and receiver are not the same account", func() { + sender := s.keyring.GetKey(1) + receiver := s.keyring.GetKey(2) + + senderAddrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) + Expect(senderAddrTracked).To(BeFalse(), "expected address not to be stored before conversion") + receiverAddrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), receiver.AccAddr) + Expect(receiverAddrTracked).To(BeFalse(), "expected address not to be stored before conversion") + + _, err := s.factory.ExecuteCosmosTx( + sender.Priv, + commonfactory.CosmosTxArgs{ + Msgs: []sdk.Msg{ + &erc20types.MsgConvertCoin{ + Sender: sender.AccAddr.String(), + Receiver: receiver.Addr.String(), + Coin: sdk.NewCoin(nativeIBCCoinDenom, convertAmount), + }, + }, + }, + ) + Expect(err).ToNot(HaveOccurred(), "failed to convert native IBC coin") + + Expect(s.network.NextBlock()).To(BeNil(), "failed to advance block") + + senderAddrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) + Expect(senderAddrTracked).To(BeFalse(), "expected address to be stored") + receiverAddrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), receiver.AccAddr) + Expect(receiverAddrTracked).To(BeTrue(), "expected address to be stored") + }) + + It("should not fail if the address is already stored", func() { + sender := s.keyring.GetKey(1) + + addrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) + Expect(addrTracked).To(BeFalse(), "expected address not to be stored before conversion") + + _, err := s.factory.ExecuteCosmosTx( + sender.Priv, + commonfactory.CosmosTxArgs{ + Msgs: []sdk.Msg{ + &erc20types.MsgConvertCoin{ + Sender: sender.AccAddr.String(), + Receiver: sender.Addr.String(), + Coin: sdk.NewCoin(nativeIBCCoinDenom, testnetwork.PrefundedAccountInitialBalance.QuoRaw(10)), + }, + }, + }, + ) + Expect(err).ToNot(HaveOccurred(), "failed to convert native IBC coin") + + Expect(s.network.NextBlock()).To(BeNil(), "failed to advance block") + + _, err = s.factory.ExecuteCosmosTx( + sender.Priv, + commonfactory.CosmosTxArgs{ + Msgs: []sdk.Msg{ + &erc20types.MsgConvertCoin{ + Sender: sender.AccAddr.String(), + Receiver: sender.Addr.String(), + Coin: sdk.NewCoin(nativeIBCCoinDenom, testnetwork.PrefundedAccountInitialBalance.QuoRaw(10)), + }, + }, + }, + ) + Expect(err).ToNot(HaveOccurred(), "failed to convert native IBC coin") + + Expect(s.network.NextBlock()).To(BeNil(), "failed to advance block") + + addrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) + Expect(addrTracked).To(BeTrue(), "expected address to be still stored") + }) + }) + + Context("a registered ERC-20 representation into its native coin", func() { + It("should add the address to the store if it is not already stored", func() { + sender := s.keyring.GetKey(deployerIdx) + + addrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) + Expect(addrTracked).To(BeFalse(), "expected address not to be stored before conversion") + + _, err := s.factory.ExecuteCosmosTx( + sender.Priv, + commonfactory.CosmosTxArgs{ + Msgs: []sdk.Msg{ + &erc20types.MsgConvertERC20{ + ContractAddress: s.nativeCoinERC20Addr.String(), + Sender: sender.Addr.String(), + Receiver: sender.AccAddr.String(), + Amount: convertAmount, + }, + }, + }, + ) + Expect(err).ToNot(HaveOccurred(), "failed to convert native IBC coin") + + Expect(s.network.NextBlock()).To(BeNil(), "failed to advance block") + + addrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) + Expect(addrTracked).To(BeTrue(), "expected address to be stored") + }) + }) + }) +}) + +var _ = Describe("STRv2 Tracking Wevmos-", func() { + var s *STRv2TrackingSuite + + BeforeEach(func() { + var err error + s, err = CreateTestSuite(utils.TestingChainID + "-1") + Expect(err).ToNot(HaveOccurred(), "failed to create test suite") + + // NOTE: this is necessary to enable e.g. erc20Keeper.BalanceOf(...) to work + // correctly internally. + // Removing it will break a bunch of tests giving errors like: "failed to retrieve balance" + Expect(s.network.NextBlock()).To(BeNil(), "failed to advance block") + + // Deploy WEVMOS contract + s.wevmosAddr, err = s.factory.DeployContract( + s.keyring.GetPrivKey(erc20Deployer), + evmtypes.EvmTxArgs{}, + testfactory.ContractDeploymentData{Contract: contracts.WEVMOSContract}, + ) + Expect(err).ToNot(HaveOccurred(), "failed to deploy wevmos contract") + // Send WEVMOS to account + _, err = s.factory.ExecuteEthTx( + s.keyring.GetPrivKey(0), + evmtypes.EvmTxArgs{ + To: &s.wevmosAddr, + Amount: sentWEVMOS.BigInt(), + // FIXME: the gas simulation is not working correctly - otherwise results in out of gas + GasLimit: 100_000, + }, + ) + Expect(err).ToNot(HaveOccurred(), "failed to deposit to wevmos") + + s.network.App.Erc20Keeper.DeleteSTRv2Address(s.network.GetContext(), s.keyring.GetKey(0).AccAddr) + s.network.App.Erc20Keeper.DeleteSTRv2Address(s.network.GetContext(), s.keyring.GetKey(2).AccAddr) + }) + + When("sending an EVM transaction", func() { + Context("which interacts with a registered native token pair ERC-20 contract", func() { + Context("in a direct call to the token pair contract", func() { + It("should add the from and to addresses to the store if it is not already stored", func() { + sender := s.keyring.GetKey(0) + receiver := s.keyring.GetKey(2) + + senderAddrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) + Expect(senderAddrTracked).To(BeFalse(), "expected address not to be stored before conversion") + receiverAddrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), receiver.AccAddr) + Expect(receiverAddrTracked).To(BeFalse(), "expected address not to be stored before conversion") + + _, err := s.factory.ExecuteContractCall( + sender.Priv, + evmtypes.EvmTxArgs{ + To: &s.wevmosAddr, + GasLimit: 100_000, + }, + testfactory.CallArgs{ + ContractABI: contracts.WEVMOSContract.ABI, + MethodName: "transfer", + Args: []interface{}{ + receiver.Addr, + transferAmount, + }, + }, + ) + Expect(err).ToNot(HaveOccurred(), "failed to transfer tokens of Cosmos native ERC-20 token pair") + + Expect(s.network.NextBlock()).To(BeNil(), "failed to advance block") + + senderAddrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) + Expect(senderAddrTracked).To(BeTrue(), "expected address to be stored") + receiverAddrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) + Expect(receiverAddrTracked).To(BeTrue(), "expected address to be stored") + }) + It("should not fail if the addresses are already stored", func() { + sender := s.keyring.GetKey(0) + receiver := s.keyring.GetKey(2) + + senderAddrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) + Expect(senderAddrTracked).To(BeFalse(), "expected address not to be stored before conversion") + receiverAddrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), receiver.AccAddr) + Expect(receiverAddrTracked).To(BeFalse(), "expected address not to be stored before conversion") + + s.network.App.Erc20Keeper.SetSTRv2Address(s.network.GetContext(), s.keyring.GetKey(0).AccAddr) + s.network.App.Erc20Keeper.SetSTRv2Address(s.network.GetContext(), s.keyring.GetKey(2).AccAddr) + + _, err := s.factory.ExecuteContractCall( + sender.Priv, + evmtypes.EvmTxArgs{ + To: &s.wevmosAddr, + }, + testfactory.CallArgs{ + ContractABI: contracts.WEVMOSContract.ABI, + MethodName: "transfer", + Args: []interface{}{ + receiver.Addr, + transferAmount, + }, + }, + ) + Expect(err).ToNot(HaveOccurred(), "failed to transfer tokens of Cosmos native ERC-20 token pair") + + Expect(s.network.NextBlock()).To(BeNil(), "failed to advance block") + + senderAddrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) + Expect(senderAddrTracked).To(BeTrue(), "expected address to be stored") + receiverAddrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) + Expect(receiverAddrTracked).To(BeTrue(), "expected address to be stored") + }) + }) + }) + }) +}) diff --git a/x/erc20/strv2/strv2_integration_utils_test.go b/x/erc20/strv2/strv2_integration_utils_test.go new file mode 100644 index 0000000000..6095f6302a --- /dev/null +++ b/x/erc20/strv2/strv2_integration_utils_test.go @@ -0,0 +1,192 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package strv2_test + +import ( + errorsmod "cosmossdk.io/errors" + sdk "github.com/cosmos/cosmos-sdk/types" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + "github.com/ethereum/go-ethereum/common" + "github.com/evmos/evmos/v18/contracts" + commonfactory "github.com/evmos/evmos/v18/testutil/integration/common/factory" + testfactory "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" + testnetwork "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + "github.com/evmos/evmos/v18/utils" + erc20types "github.com/evmos/evmos/v18/x/erc20/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/pkg/errors" +) + +func CreateTestSuite(chainID string) (*STRv2TrackingSuite, error) { + keyring := testkeyring.New(3) + + genesisBalances := []banktypes.Balance{ + { + Address: keyring.GetAccAddr(0).String(), + Coins: sdk.NewCoins( + sdk.Coin{Denom: utils.BaseDenom, Amount: testnetwork.PrefundedAccountInitialBalance}, + sdk.Coin{Denom: nativeIBCCoinDenom, Amount: testnetwork.PrefundedAccountInitialBalance}, + ), + }, + { + Address: keyring.GetAccAddr(1).String(), + Coins: sdk.NewCoins( + sdk.Coin{Denom: utils.BaseDenom, Amount: testnetwork.PrefundedAccountInitialBalance}, + sdk.Coin{Denom: nativeIBCCoinDenom, Amount: testnetwork.PrefundedAccountInitialBalance.QuoRaw(2)}, + ), + }, + } + + network := testnetwork.NewUnitTestNetwork( + testnetwork.WithChainID(chainID), + testnetwork.WithBalances(genesisBalances...), + ) + handler := grpc.NewIntegrationHandler(network) + factory := testfactory.New(network, handler) + + deployer := keyring.GetKey(deployerIdx) + + // ------------------------------------------------------------------ + // Register the native IBC coin + ibcCoinMetaData := banktypes.Metadata{ + Description: "The native IBC coin", + Base: nativeIBCCoinDenom, + Display: nativeIBCCoinDenom, + DenomUnits: []*banktypes.DenomUnit{ + {Denom: nativeIBCCoinDenom, Exponent: 0}, + {Denom: "u" + nativeIBCCoinDenom, Exponent: 6}, + }, + } + + ibcNativeTokenPair, err := network.App.Erc20Keeper.RegisterCoin(network.GetContext(), ibcCoinMetaData) + if err != nil { + return &STRv2TrackingSuite{}, errorsmod.Wrap(err, "failed to register native IBC coin") + } + nativeCoinERC20Addr := common.HexToAddress(ibcNativeTokenPair.Erc20Address) + + if err := network.NextBlock(); err != nil { + return &STRv2TrackingSuite{}, errorsmod.Wrap(err, "failed to advance block") + } + + // Convert a balance for the deployer + msgConvertCoin := erc20types.MsgConvertCoin{ + Sender: deployer.AccAddr.String(), + Receiver: deployer.Addr.String(), + Coin: sdk.NewCoin(nativeIBCCoinDenom, convertAmount), + } + _, err = factory.ExecuteCosmosTx(deployer.Priv, commonfactory.CosmosTxArgs{ + Msgs: []sdk.Msg{&msgConvertCoin}, + }) + if err != nil { + return &STRv2TrackingSuite{}, errorsmod.Wrap(err, "failed to convert a balance") + } + + if err := network.NextBlock(); err != nil { + return &STRv2TrackingSuite{}, errorsmod.Wrap(err, "failed to advance block") + } + + // ------------------------------------------------------------------ + // Register an ERC-20 token pair + registeredERC20Addr, err := factory.DeployContract( + deployer.Priv, + evmtypes.EvmTxArgs{}, + testfactory.ContractDeploymentData{ + Contract: contracts.ERC20MinterBurnerDecimalsContract, + ConstructorArgs: []interface{}{"TestToken", "TTK", uint8(18)}, + }, + ) + if err != nil { + return &STRv2TrackingSuite{}, errorsmod.Wrap(err, "failed to deploy ERC-20 contract") + } + + if err := network.NextBlock(); err != nil { + return &STRv2TrackingSuite{}, errorsmod.Wrap(err, "failed to advance block") + } + + // Mint some tokens for the deployer + _, err = factory.ExecuteContractCall( + deployer.Priv, + evmtypes.EvmTxArgs{ + To: ®isteredERC20Addr, + }, + testfactory.CallArgs{ + ContractABI: contracts.ERC20MinterBurnerDecimalsContract.ABI, + MethodName: "mint", + Args: []interface{}{ + deployer.Addr, + mintAmount, + }, + }, + ) + if err != nil { + return &STRv2TrackingSuite{}, errorsmod.Wrap(err, "failed to mint ERC-20 tokens") + } + + _, err = network.App.Erc20Keeper.RegisterERC20(network.GetContext(), registeredERC20Addr) + if err != nil { + return &STRv2TrackingSuite{}, errorsmod.Wrap(err, "failed to register token pair") + } + + if err := network.NextBlock(); err != nil { + return &STRv2TrackingSuite{}, errorsmod.Wrap(err, "failed to advance block") + } + + // ------------------------------------------------------------------ + // Deploy an unregistered ERC-20 contract + unregisteredERC20Addr, err := factory.DeployContract( + deployer.Priv, + evmtypes.EvmTxArgs{}, + testfactory.ContractDeploymentData{ + Contract: contracts.ERC20MinterBurnerDecimalsContract, + ConstructorArgs: []interface{}{"UnregisteredToken", "URT", uint8(18)}, + }, + ) + if err != nil { + return &STRv2TrackingSuite{}, errorsmod.Wrap(err, "failed to deploy ERC-20 contract") + } + + if err := network.NextBlock(); err != nil { + return &STRv2TrackingSuite{}, errorsmod.Wrap(err, "failed to advance block") + } + + // Mint some tokens for the deployer + _, err = factory.ExecuteContractCall( + deployer.Priv, + evmtypes.EvmTxArgs{ + To: &unregisteredERC20Addr, + }, + testfactory.CallArgs{ + ContractABI: contracts.ERC20MinterBurnerDecimalsContract.ABI, + MethodName: "mint", + Args: []interface{}{ + deployer.Addr, + mintAmount, + }, + }, + ) + if err != nil { + return &STRv2TrackingSuite{}, errorsmod.Wrap(err, "failed to mint ERC-20 tokens") + } + + network.App.Erc20Keeper.DeleteSTRv2Address(network.GetContext(), keyring.GetAccAddr(0)) + + // NOTE: this is necessary to enable e.g. erc20Keeper.BalanceOf(...) to work + // correctly internally. + // Removing it will break a bunch of tests giving errors like: "failed to retrieve balance" + if err = network.NextBlock(); err != nil { + return nil, errors.Wrap(err, "failed to advance block") + } + + return &STRv2TrackingSuite{ + keyring: keyring, + network: network, + handler: handler, + factory: factory, + nativeCoinERC20Addr: nativeCoinERC20Addr, + registeredERC20Addr: registeredERC20Addr, + unregisteredERC20Addr: unregisteredERC20Addr, + }, nil +} diff --git a/x/erc20/types/events.go b/x/erc20/types/events.go index 9c8b12813d..6022a1594a 100644 --- a/x/erc20/types/events.go +++ b/x/erc20/types/events.go @@ -27,6 +27,10 @@ const ( // ERC20EventTransfer defines the transfer event for ERC20 ERC20EventTransfer = "Transfer" + // WevmosEventWithdraw defines the withdrawal event for Wevmos + WevmosEventWithdraw = "Withdrawal" + // WevmosEventWithdraw defines the deposit event for Wevmos + WevmosEventDeposit = "Deposit" ) // LogTransfer Event type for Transfer(address from, address to, uint256 value) diff --git a/x/erc20/types/keys.go b/x/erc20/types/keys.go index 6c95614652..edf70d536d 100644 --- a/x/erc20/types/keys.go +++ b/x/erc20/types/keys.go @@ -20,18 +20,19 @@ const ( RouterKey = ModuleName ) -// ModuleAddress is the native module address for EVM +// ModuleAddress is the native module address for ERC-20 var ModuleAddress common.Address func init() { ModuleAddress = common.BytesToAddress(authtypes.NewModuleAddress(ModuleName).Bytes()) } -// prefix bytes for the EVM persistent store +// prefix bytes for the ERC-20 persistent store const ( prefixTokenPair = iota + 1 prefixTokenPairByERC20 prefixTokenPairByDenom + prefixSTRv2Addresses ) // KVStore key prefixes @@ -39,4 +40,5 @@ var ( KeyPrefixTokenPair = []byte{prefixTokenPair} KeyPrefixTokenPairByERC20 = []byte{prefixTokenPairByERC20} KeyPrefixTokenPairByDenom = []byte{prefixTokenPairByDenom} + KeyPrefixSTRv2Addresses = []byte{prefixSTRv2Addresses} ) diff --git a/x/ibc/transfer/keeper/msg_server_test.go b/x/ibc/transfer/keeper/msg_server_test.go index 56cab0efcb..7b521c8367 100644 --- a/x/ibc/transfer/keeper/msg_server_test.go +++ b/x/ibc/transfer/keeper/msg_server_test.go @@ -7,6 +7,7 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" host "github.com/cosmos/ibc-go/v7/modules/core/24-host" @@ -234,6 +235,53 @@ func (suite *KeeperTestSuite) TestTransfer() { }, false, }, + + // STRV2 + { + "no-op - pair not registered", + func() *types.MsgTransfer { + senderAcc := sdk.AccAddress(suite.address.Bytes()) + + denom := "test" + coinMetadata := banktypes.Metadata{ + Name: "Generic IBC name", + Symbol: "IBC", + Description: "Generic IBC token description", + DenomUnits: []*banktypes.DenomUnit{ + { + Denom: denom, + Exponent: 0, + Aliases: []string{denom}, + }, + { + Denom: denom, + Exponent: 18, + }, + }, + Display: denom, + Base: denom, + } + + coin := sdk.NewCoin(denom, math.NewInt(10)) + coins := sdk.NewCoins(coin) + + err := suite.app.BankKeeper.MintCoins(suite.ctx, erc20types.ModuleName, coins) + suite.Require().NoError(err) + + err = suite.app.BankKeeper.SendCoinsFromModuleToAccount(suite.ctx, erc20types.ModuleName, senderAcc, coins) + suite.Require().NoError(err) + suite.Commit() + + pair, err := suite.app.Erc20Keeper.RegisterCoin(suite.ctx, coinMetadata) + suite.Require().Equal(pair.Denom, denom) + suite.Require().NoError(err) + + transferMsg := types.NewMsgTransfer("transfer", "channel-0", coin, senderAcc.String(), "", timeoutHeight, 0, "") + + return transferMsg + }, + true, + }, } for _, tc := range testCases { suite.Run(fmt.Sprintf("Case %s", tc.name), func() { From 91319d2dde834e00042caa13d66fa41f6a1b1b79 Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Wed, 1 May 2024 13:23:52 +0200 Subject: [PATCH 231/345] imp(contracts): Improve make command to compile smart contracts (#2487) * add hardhat setup and gitignore * move contracts into subdirectory for hardhat compilation * add hardhat compiled contract type and corresponding test - move contracts into testdata subfolder * add WIP go embedding for hardhat contract * add wip for python script to compile all contracts * commit wip scanning the repo for Solidity files * wip * move compiled JSON files next to Solidity files * add compilation step * adjust import path on ERC20NoMetadata contract * check input args to either compile or clean * adjust contract name on ERC20NoMetadata * some fixes for the script * adjust Makefile targets for smart contract compilation * remove print statements * adjust contracts in precompiles dir to work with new approach * improvements to script * adjust ERC20 contracts * add README and --add option * remove todo * add script readme * run black formatter * adjust more linters * add changelog entry * more linter adjustments * fix changelog and improve check message * linters * move flash loan contract into contracts directory * move flash loan contract into testdata directory * rename contracts subdirectory to solidity * fix failure on other script tests * run black formatter * adjust imports on ERC20 go files * remove contracts from being initialized in init functions to dedicated methods to load them * remove unused burnable contract * run gofumpt * address linters * address JS linter * address more JS linters * remove unused contracts and move things into test packages and testdata folders to clean up the production code * run make format * move contracts to test data * Apply suggestions from code review Co-authored-by: Ramiro Carlucho Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Signed-off-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> * update tool readme * refactor contract loading into utility and remove unnecessary go:embed usage in test contracts * add missing licenses * address JS linter * address linters * refactor file reading * fixes after merging * Apply suggestions from code review Signed-off-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> * refactor unmarshalling compiled bytes and use embed for necessary file again * fix changelog --------- Signed-off-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Co-authored-by: MalteHerrmann Co-authored-by: Ramiro Carlucho Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> --- CHANGELOG.md | 17 +- Makefile | 66 +- contracts/.gitignore | 8 + contracts/ERC20Burnable.sol | 43 - .../compiled_contracts/ERC20Burnable.json | 5 - .../ERC20DirectBalanceManipulation.json | 5 - .../ERC20MaliciousDelayed.json | 5 - .../ERC20MinterBurnerDecimals.json | 5 - contracts/compiled_contracts/FlashLoan.json | 5 - contracts/erc20.go | 28 +- contracts/erc20DirectBalanceManipulation.go | 39 - contracts/erc20burnable.go | 25 - contracts/erc20maliciousdelayed.go | 39 - contracts/flash_loan.go | 30 - contracts/hardhat.config.js | 7 + contracts/package-lock.json | 3496 ++++++++++++++++- contracts/package.json | 18 +- .../solidity/ERC20MinterBurnerDecimals.json | 708 ++++ .../ERC20MinterBurnerDecimals.sol | 10 +- contracts/utils/utils.go | 92 + precompiles/bank/integration_test.go | 15 +- precompiles/bank/testdata/BankCaller.json | 88 +- precompiles/bank/testdata/bank.go | 23 +- precompiles/distribution/integration_test.go | 17 +- precompiles/erc20/integration_test.go | 46 +- .../erc20/testdata/ERC20AllowanceCaller.json | 255 +- .../erc20/testdata/ERC20NoMetadata.json | 248 +- .../erc20/testdata/ERC20NoMetadata.sol | 94 +- .../erc20/testdata/erc20_allowance_caller.go | 23 +- .../erc20/testdata/erc20_no_metadata.go | 31 +- .../testdata/erc20minter_openzeppelinv5.go | 31 +- precompiles/ics20/integration_test.go | 17 +- precompiles/staking/integration_test.go | 21 +- .../staking/testdata/StakingCaller.json | 929 ++++- .../staking/testdata/staking_caller.go | 23 +- .../contracts/DistributionCaller.json | 667 +++- .../testutil/contracts/InterchainSender.json | 438 ++- .../testutil/contracts/distribution_caller.go | 23 +- .../testutil/contracts/interchain_sender.go | 23 +- precompiles/vesting/integration_test.go | 3 +- precompiles/vesting/setup_test.go | 2 + .../vesting/testdata/VestingCaller.json | 265 +- .../vesting/testdata/vesting_caller.go | 23 +- precompiles/vesting/utils_test.go | 6 +- precompiles/werc20/integration_test.go | 13 +- precompiles/werc20/testdata/wevmos.go | 23 +- scripts/changelog_checker/release.py | 11 +- scripts/compile_smart_contracts/README.md | 36 + .../compile_smart_contracts.py | 323 ++ .../test_compile_smart_contracts.py | 132 + .../testdata/hardhat.config.js | 7 + .../testdata/package.json | 22 + .../testdata/solidity/SimpleContract.sol | 10 + x/erc20/keeper/evm_hooks_test.go | 3 +- x/erc20/keeper/evm_test.go | 9 +- .../ERC20DirectBalanceManipulation.json | 667 ++++ .../ERC20DirectBalanceManipulation.sol | 2 +- .../testdata/ERC20MaliciousDelayed.json | 667 ++++ .../testdata}/ERC20MaliciousDelayed.sol | 2 +- .../erc20DirectBalanceManipulation.go | 18 + .../keeper/testdata/erc20maliciousdelayed.go | 17 + x/erc20/keeper/utils_test.go | 13 +- x/evm/keeper/benchmark_test.go | 27 +- x/evm/keeper/grpc_query_test.go | 50 +- x/evm/keeper/keeper_test.go | 1 - .../testdata}/ERC20Contract.json | 0 .../testdata}/TestMessageCall.json | 0 x/evm/keeper/testdata/contracts.go | 17 + x/evm/keeper/utils_test.go | 19 +- x/evm/statedb/integration_test.go | 14 +- x/evm/statedb/testdata/FlashLoan.json | 58 + .../evm/statedb/testdata}/FlashLoan.sol | 4 +- x/evm/statedb/testdata/flash_loan.go | 13 + x/evm/types/SimpleStorageContract.json | 4 - x/evm/types/compiled_contract.go | 64 +- x/evm/types/compiled_contract_test.go | 32 + .../types/testdata/SimpleContractHardhat.json | 37 + x/feemarket/keeper/keeper_test.go | 1 - 78 files changed, 9606 insertions(+), 672 deletions(-) create mode 100644 contracts/.gitignore delete mode 100644 contracts/ERC20Burnable.sol delete mode 100644 contracts/compiled_contracts/ERC20Burnable.json delete mode 100644 contracts/compiled_contracts/ERC20DirectBalanceManipulation.json delete mode 100644 contracts/compiled_contracts/ERC20MaliciousDelayed.json delete mode 100644 contracts/compiled_contracts/ERC20MinterBurnerDecimals.json delete mode 100644 contracts/compiled_contracts/FlashLoan.json delete mode 100644 contracts/erc20DirectBalanceManipulation.go delete mode 100644 contracts/erc20burnable.go delete mode 100644 contracts/erc20maliciousdelayed.go delete mode 100644 contracts/flash_loan.go create mode 100644 contracts/hardhat.config.js create mode 100644 contracts/solidity/ERC20MinterBurnerDecimals.json rename contracts/{ => solidity}/ERC20MinterBurnerDecimals.sol (91%) create mode 100644 contracts/utils/utils.go create mode 100644 scripts/compile_smart_contracts/README.md create mode 100644 scripts/compile_smart_contracts/compile_smart_contracts.py create mode 100644 scripts/compile_smart_contracts/test_compile_smart_contracts.py create mode 100644 scripts/compile_smart_contracts/testdata/hardhat.config.js create mode 100644 scripts/compile_smart_contracts/testdata/package.json create mode 100644 scripts/compile_smart_contracts/testdata/solidity/SimpleContract.sol create mode 100644 x/erc20/keeper/testdata/ERC20DirectBalanceManipulation.json rename {contracts => x/erc20/keeper/testdata}/ERC20DirectBalanceManipulation.sol (91%) create mode 100644 x/erc20/keeper/testdata/ERC20MaliciousDelayed.json rename {contracts => x/erc20/keeper/testdata}/ERC20MaliciousDelayed.sol (91%) create mode 100644 x/erc20/keeper/testdata/erc20DirectBalanceManipulation.go create mode 100644 x/erc20/keeper/testdata/erc20maliciousdelayed.go rename x/evm/{types => keeper/testdata}/ERC20Contract.json (100%) rename x/evm/{types => keeper/testdata}/TestMessageCall.json (100%) create mode 100644 x/evm/keeper/testdata/contracts.go create mode 100644 x/evm/statedb/testdata/FlashLoan.json rename {contracts => x/evm/statedb/testdata}/FlashLoan.sol (92%) create mode 100644 x/evm/statedb/testdata/flash_loan.go delete mode 100644 x/evm/types/SimpleStorageContract.json create mode 100644 x/evm/types/compiled_contract_test.go create mode 100644 x/evm/types/testdata/SimpleContractHardhat.json diff --git a/CHANGELOG.md b/CHANGELOG.md index fafa5761cc..5fc3e3adcc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,10 +49,10 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (deps) [#2355](https://github.com/evmos/evmos/pull/2355) Bump Cosmos-SDK to v0.47.8-evmos. - (revenue) [#2379](https://github.com/evmos/evmos/pull/2379) Remove `x/revenue` module. - (evm) [#2380](https://github.com/evmos/evmos/pull/2380) Remove EVM hooks from app and EVM module. -- (evm) [#2501](https://github.com/evmos/evmos/pull/2501) Revert deletion from EVM hooks (#2380) -- (erc20) [#2502](https://github.com/evmos/evmos/pull/2502) Revert deletion from EVM hooks (#2154) (#2442) +- (evm) [#2501](https://github.com/evmos/evmos/pull/2501) Revert deletion of EVM hooks (#2380). +- (erc20) [#2502](https://github.com/evmos/evmos/pull/2502) Revert deletion of EVM hooks (#2154) (#2442). - (vesting) [#2507](https://github.com/evmos/evmos/pull/2507) Consider locked-up vested delegated coins in `LockedCoins` calculation. -- (erc20) [#2508](https://github.com/evmos/evmos/pull/2508) Add bookkeping logic in preparation for STRV2 upgrade +- (erc20) [#2508](https://github.com/evmos/evmos/pull/2508) Add bookkeping logic in preparation for STRV2 upgrade. ### Bug Fixes @@ -91,9 +91,9 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (docs) [#2472](https://github.com/evmos/evmos/pull/2472) Update security policy. - (docs) [#2478](https://github.com/evmos/evmos/pull/2478) Change Evmos SDK with evmOS. - (build) [#2484](https://github.com/evmos/evmos/pull/2484) Bump golang version to v1.22. -- (client) [#2481](https://github.com/evmos/evmos/pull/2481) Replace path.Join with filepath.Join. -- (cli) [#2503](https://github.com/evmos/evmos/pull/2503) Revert deletion of ConvertCoin for erc20 module (#2155). +- (cli) [#2503](https://github.com/evmos/evmos/pull/2503) Revert deletion of ConvertCoin for ERC-20 module (#2155). - (ibc) [#2504](https://github.com/evmos/evmos/pull/2504) Refactor repeated unpacking of IBC packet data. +- (make) [#2487](https://github.com/evmos/evmos/pull/2487) Improve make command to compile all smart contracts in repository. ## [v18.0.0](https://github.com/evmos/evmos/releases/tag/v18.0.0) - 2024-04-22 @@ -121,11 +121,11 @@ Ref: https://keepachangelog.com/en/1.0.0/ ## [v16.0.3](https://github.com/evmos/evmos/releases/tag/v16.0.3) - 2024-02-02 -## Bug Fixes +### Bug Fixes -- (evm) [#2302](https://github.com/evmos/evmos/pull/2302) Fix TraceTx KVGasConfig setup +- (evm) [#2302](https://github.com/evmos/evmos/pull/2302) Fix TraceTx KVGasConfig setup. -## [v16.0.2] - 2024-01-16 +## [v16.0.2](https://github.com/evmos/evmos/releases/tag/v16.0.2) - 2024-01-16 ### Bug Fixes @@ -995,3 +995,4 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (cli) [#26](https://github.com/evmos/evmos/pull/26) Use config on genesis accounts. - (deps) [#28](https://github.com/evmos/evmos/pull/28) Bump Ethermint version to `v0.7.0`. + diff --git a/Makefile b/Makefile index b03fbebdfa..692bb3eb9b 100644 --- a/Makefile +++ b/Makefile @@ -545,56 +545,24 @@ release: ### Compile Solidity Contracts ### ############################################################################### -CONTRACTS_DIR := contracts -COMPILED_DIR := $(CONTRACTS_DIR)/compiled_contracts -TMP := tmp -TMP_CONTRACTS := $(TMP)/contracts -TMP_COMPILED := $(TMP)/compiled.json -TMP_JSON := $(TMP)/tmp.json - -# Compile and format solidity contracts for the erc20 module. Also install -# openzeppeling as the contracts are build on top of openzeppelin templates. -contracts-compile: contracts-clean openzeppelin create-contracts-json - -# Install openzeppelin solidity contracts -openzeppelin: - @echo "Importing openzeppelin contracts..." - @cd $(CONTRACTS_DIR) && \ - npm install && \ - mv node_modules $(TMP) && \ - mv $(TMP)/@openzeppelin . && \ - rm -rf $(TMP) - -# Clean tmp files +# Clean up the contracts directory, install the necessary dependencies +# and then compile the solidity contracts found in the Evmos repository. +contracts-all: contracts-clean contracts-compile + +# Clean smart contract compilation artifacts, dependencies and cache files contracts-clean: - @rm -rf $(CONTRACTS_DIR)/$(TMP) - @rm -rf $(CONTRACTS_DIR)/node_modules - @rm -rf $(COMPILED_DIR) - @rm -rf $(CONTRACTS_DIR)/@openzeppelin - -# Compile, filter out and format contracts into the following format. -# { -# "abi": "[{\"inpu # JSON string -# "bin": "60806040 -# "contractName": # filename without .sol -# } -create-contracts-json: - @for c in $(shell ls $(CONTRACTS_DIR) | grep '\.sol' | sed 's/.sol//g'); do \ - command -v jq > /dev/null 2>&1 || { echo >&2 "jq not installed."; exit 1; } ;\ - command -v solc > /dev/null 2>&1 || { echo >&2 "solc not installed."; exit 1; } ;\ - mkdir -p $(COMPILED_DIR) ;\ - mkdir -p $(TMP) ;\ - echo "\nCompiling solidity contract $${c}..." ;\ - solc --combined-json abi,bin $(CONTRACTS_DIR)/$${c}.sol > $(TMP_COMPILED) ;\ - echo "Formatting JSON..." ;\ - get_contract=$$(jq '.contracts["$(CONTRACTS_DIR)/'$$c'.sol:'$$c'"]' $(TMP_COMPILED)) ;\ - add_contract_name=$$(echo $$get_contract | jq '. + { "contractName": "'$$c'" }') ;\ - echo $$add_contract_name | jq > $(TMP_JSON) ;\ - abi_string=$$(echo $$add_contract_name | jq -cr '.abi') ;\ - echo $$add_contract_name | jq --arg newval "$$abi_string" '.abi = $$newval' > $(TMP_JSON) ;\ - mv $(TMP_JSON) $(COMPILED_DIR)/$${c}.json ;\ - done - @rm -rf $(TMP) + @echo "Cleaning up the contracts directory..." + @python3 ./scripts/compile_smart_contracts/compile_smart_contracts.py --clean + +# Compile the solidity contracts found in the Evmos repository. +contracts-compile: + @echo "Compiling smart contracts..." + @python3 ./scripts/compile_smart_contracts/compile_smart_contracts.py --compile + +# Add a new solidity contract to be compiled +contracts-add: + @echo "Adding a new smart contract to be compiled..." + @python3 ./scripts/compile_smart_contracts/compile_smart_contracts.py --add $(CONTRACT) ############################################################################### ### Miscellaneous Checks ### diff --git a/contracts/.gitignore b/contracts/.gitignore new file mode 100644 index 0000000000..6f2ad389cc --- /dev/null +++ b/contracts/.gitignore @@ -0,0 +1,8 @@ +# Compiled contracts +artifacts/ + +# Cached files +cache/ + +# Node modules +node_modules/ diff --git a/contracts/ERC20Burnable.sol b/contracts/ERC20Burnable.sol deleted file mode 100644 index 695cf090e8..0000000000 --- a/contracts/ERC20Burnable.sol +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/ERC20Burnable.sol) - -pragma solidity ^0.8.0; - -import "./@openzeppelin/contracts/token/ERC20/ERC20.sol"; -import "./@openzeppelin/contracts/utils/Context.sol"; - -/** - * @dev Extension of {ERC20} that allows token holders to destroy both their own - * tokens and those that they have an allowance for, in a way that can be - * recognized off-chain (via event analysis). - */ -abstract contract ERC20Burnable is Context, ERC20 { - /** - * @dev Destroys `amount` tokens from the caller. - * - * See {ERC20-_burn}. - */ - function burn(uint256 amount) public virtual { - _burn(_msgSender(), amount); - } - - /** - * @dev Destroys `amount` tokens from `account`, deducting from the caller's - * allowance. - * - * See {ERC20-_burn} and {ERC20-allowance}. - * - * Requirements: - * - * - the caller must have allowance for ``accounts``'s tokens of at least - * `amount`. - */ - function burnFrom(address account, uint256 amount) public virtual { - uint256 currentAllowance = allowance(account, _msgSender()); - require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance"); - unchecked { - _approve(account, _msgSender(), currentAllowance - amount); - } - _burn(account, amount); - } -} diff --git a/contracts/compiled_contracts/ERC20Burnable.json b/contracts/compiled_contracts/ERC20Burnable.json deleted file mode 100644 index c3fd414502..0000000000 --- a/contracts/compiled_contracts/ERC20Burnable.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "abi": "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - "bin": "", - "contractName": "ERC20Burnable" -} diff --git a/contracts/compiled_contracts/ERC20DirectBalanceManipulation.json b/contracts/compiled_contracts/ERC20DirectBalanceManipulation.json deleted file mode 100644 index 06a8501114..0000000000 --- a/contracts/compiled_contracts/ERC20DirectBalanceManipulation.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "abi": "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"initialSupply\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PAUSER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"getRoleMember\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleMemberCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - "bin": "6080604052734dc6ac40af078661fc43823086e1513635eeab14600760016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034801562000065575f80fd5b5060405162003c3438038062003c3483398181016040528101906200008b9190620006bd565b6040518060400160405280601e81526020017f455243323044697265637442616c616e63654d616e6970756c6174696f6e00008152506040518060400160405280601e81526020017f455243323044697265637442616c616e63654d616e6970756c6174696f6e0000815250818181600590816200010a919062000948565b5080600690816200011c919062000948565b5050505f60075f6101000a81548160ff0219169083151502179055506200015b5f801b6200014f6200020c60201b60201c565b6200021360201b60201c565b6200019c7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6620001906200020c60201b60201c565b6200021360201b60201c565b620001dd7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a620001d16200020c60201b60201c565b6200021360201b60201c565b5050620001f35f801b336200021360201b60201c565b6200020533826200022960201b60201c565b5062000bd1565b5f33905090565b6200022582826200038f60201b60201c565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200029a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002919062000a8a565b60405180910390fd5b620002ad5f8383620003cb60201b60201c565b8060045f828254620002c0919062000ad7565b925050819055508060025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000370919062000b22565b60405180910390a36200038b5f8383620003e360201b60201c565b5050565b620003a18282620003e860201b60201c565b620003c68160015f8581526020019081526020015f20620004d360201b90919060201c565b505050565b620003de8383836200050860201b60201c565b505050565b505050565b620003fa82826200057360201b60201c565b620004cf5760015f808481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550620004746200020c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b5f62000500835f018373ffffffffffffffffffffffffffffffffffffffff165f1b620005d660201b60201c565b905092915050565b6200051b8383836200064760201b60201c565b6200052b6200064c60201b60201c565b156200056e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005659062000bb1565b60405180910390fd5b505050565b5f805f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f620005e983836200066160201b60201c565b6200063d57825f0182908060018154018082558091505060019003905f5260205f20015f9091909190915055825f0180549050836001015f8481526020019081526020015f20819055506001905062000641565b5f90505b92915050565b505050565b5f60075f9054906101000a900460ff16905090565b5f80836001015f8481526020019081526020015f20541415905092915050565b5f80fd5b5f819050919050565b620006998162000685565b8114620006a4575f80fd5b50565b5f81519050620006b7816200068e565b92915050565b5f60208284031215620006d557620006d462000681565b5b5f620006e484828501620006a7565b91505092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200076957607f821691505b6020821081036200077f576200077e62000724565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620007e37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620007a6565b620007ef8683620007a6565b95508019841693508086168417925050509392505050565b5f819050919050565b5f620008306200082a620008248462000685565b62000807565b62000685565b9050919050565b5f819050919050565b6200084b8362000810565b620008636200085a8262000837565b848454620007b2565b825550505050565b5f90565b620008796200086b565b6200088681848462000840565b505050565b5b81811015620008ad57620008a15f826200086f565b6001810190506200088c565b5050565b601f821115620008fc57620008c68162000785565b620008d18462000797565b81016020851015620008e1578190505b620008f9620008f08562000797565b8301826200088b565b50505b505050565b5f82821c905092915050565b5f6200091e5f198460080262000901565b1980831691505092915050565b5f6200093883836200090d565b9150826002028217905092915050565b6200095382620006ed565b67ffffffffffffffff8111156200096f576200096e620006f7565b5b6200097b825462000751565b62000988828285620008b1565b5f60209050601f831160018114620009be575f8415620009a9578287015190505b620009b585826200092b565b86555062000a24565b601f198416620009ce8662000785565b5f5b82811015620009f757848901518255600182019150602085019450602081019050620009d0565b8683101562000a17578489015162000a13601f8916826200090d565b8355505b6001600288020188555050505b505050505050565b5f82825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f62000a72601f8362000a2c565b915062000a7f8262000a3c565b602082019050919050565b5f6020820190508181035f83015262000aa38162000a64565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f62000ae38262000685565b915062000af08362000685565b925082820190508082111562000b0b5762000b0a62000aaa565b5b92915050565b62000b1c8162000685565b82525050565b5f60208201905062000b375f83018462000b11565b92915050565b7f45524332305061757361626c653a20746f6b656e207472616e736665722077685f8201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b5f62000b99602a8362000a2c565b915062000ba68262000b3d565b604082019050919050565b5f6020820190508181035f83015262000bca8162000b8b565b9050919050565b6130558062000bdf5f395ff3fe608060405234801561000f575f80fd5b50600436106101c2575f3560e01c806370a08231116100f7578063a457c2d711610095578063d53913931161006f578063d53913931461052a578063d547741f14610548578063dd62ed3e14610564578063e63ab1e914610594576101c2565b8063a457c2d71461049a578063a9059cbb146104ca578063ca15c873146104fa576101c2565b80639010d07c116100d15780639010d07c146103fe57806391d148541461042e57806395d89b411461045e578063a217fddf1461047c576101c2565b806370a08231146103a857806379cc6790146103d85780638456cb59146103f4576101c2565b8063313ce567116101645780633f4ba83a1161013e5780633f4ba83a1461034857806340c10f191461035257806342966c681461036e5780635c975abb1461038a576101c2565b8063313ce567146102de57806336568abe146102fc5780633950935114610318576101c2565b806318160ddd116101a057806318160ddd1461024457806323b872dd14610262578063248a9ca3146102925780632f2ff15d146102c2576101c2565b806301ffc9a7146101c657806306fdde03146101f6578063095ea7b314610214575b5f80fd5b6101e060048036038101906101db9190611f61565b6105b2565b6040516101ed9190611fa6565b60405180910390f35b6101fe61062b565b60405161020b9190612049565b60405180910390f35b61022e600480360381019061022991906120f6565b6106bb565b60405161023b9190611fa6565b60405180910390f35b61024c6106dd565b6040516102599190612143565b60405180910390f35b61027c6004803603810190610277919061215c565b6106e6565b6040516102899190611fa6565b60405180910390f35b6102ac60048036038101906102a791906121df565b610714565b6040516102b99190612219565b60405180910390f35b6102dc60048036038101906102d79190612232565b610730565b005b6102e6610751565b6040516102f3919061228b565b60405180910390f35b61031660048036038101906103119190612232565b610759565b005b610332600480360381019061032d91906120f6565b6107dc565b60405161033f9190611fa6565b60405180910390f35b610350610812565b005b61036c600480360381019061036791906120f6565b61088c565b005b610388600480360381019061038391906122a4565b61090a565b005b61039261091e565b60405161039f9190611fa6565b60405180910390f35b6103c260048036038101906103bd91906122cf565b610933565b6040516103cf9190612143565b60405180910390f35b6103f260048036038101906103ed91906120f6565b610979565b005b6103fc610999565b005b610418600480360381019061041391906122fa565b610a13565b6040516104259190612347565b60405180910390f35b61044860048036038101906104439190612232565b610a3f565b6040516104559190611fa6565b60405180910390f35b610466610aa2565b6040516104739190612049565b60405180910390f35b610484610b32565b6040516104919190612219565b60405180910390f35b6104b460048036038101906104af91906120f6565b610b38565b6040516104c19190611fa6565b60405180910390f35b6104e460048036038101906104df91906120f6565b610bad565b6040516104f19190611fa6565b60405180910390f35b610514600480360381019061050f91906121df565b610c09565b6040516105219190612143565b60405180910390f35b610532610c2a565b60405161053f9190612219565b60405180910390f35b610562600480360381019061055d9190612232565b610c4e565b005b61057e60048036038101906105799190612360565b610c6f565b60405161058b9190612143565b60405180910390f35b61059c610cf1565b6040516105a99190612219565b60405180910390f35b5f7f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610624575061062382610d15565b5b9050919050565b60606005805461063a906123cb565b80601f0160208091040260200160405190810160405280929190818152602001828054610666906123cb565b80156106b15780601f10610688576101008083540402835291602001916106b1565b820191905f5260205f20905b81548152906001019060200180831161069457829003601f168201915b5050505050905090565b5f806106c5610d8e565b90506106d2818585610d95565b600191505092915050565b5f600454905090565b5f806106f0610d8e565b90506106fd858285610f58565b610708858585610fe3565b60019150509392505050565b5f805f8381526020019081526020015f20600101549050919050565b61073982610714565b61074281611252565b61074c8383611266565b505050565b5f6012905090565b610761610d8e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146107ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c59061246b565b60405180910390fd5b6107d88282611298565b5050565b5f806107e6610d8e565b90506108078185856107f88589610c6f565b61080291906124b6565b610d95565b600191505092915050565b6108437f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61083e610d8e565b610a3f565b610882576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087990612559565b60405180910390fd5b61088a6112ca565b565b6108bd7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66108b8610d8e565b610a3f565b6108fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f3906125e7565b60405180910390fd5b610906828261132b565b5050565b61091b610915610d8e565b8261147a565b50565b5f60075f9054906101000a900460ff16905090565b5f60025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61098b82610985610d8e565b83610f58565b610995828261147a565b5050565b6109ca7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6109c5610d8e565b610a3f565b610a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0090612675565b60405180910390fd5b610a1161163f565b565b5f610a378260015f8681526020019081526020015f206116a190919063ffffffff16565b905092915050565b5f805f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b606060068054610ab1906123cb565b80601f0160208091040260200160405190810160405280929190818152602001828054610add906123cb565b8015610b285780601f10610aff57610100808354040283529160200191610b28565b820191905f5260205f20905b815481529060010190602001808311610b0b57829003601f168201915b5050505050905090565b5f801b81565b5f80610b42610d8e565b90505f610b4f8286610c6f565b905083811015610b94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8b90612703565b60405180910390fd5b610ba18286868403610d95565b60019250505092915050565b5f80600283610bbc919061274e565b9050610bf5600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff168285610bf0919061277e565b6116b8565b50610c0084826116b8565b91505092915050565b5f610c2360015f8481526020019081526020015f206116da565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610c5782610714565b610c6081611252565b610c6a8383611298565b505050565b5f60035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d875750610d86826116ed565b5b9050919050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfa90612821565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e68906128af565b60405180910390fd5b8060035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610f4b9190612143565b60405180910390a3505050565b5f610f638484610c6f565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610fdd5781811015610fcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc690612917565b60405180910390fd5b610fdc8484848403610d95565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611051576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611048906129a5565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b690612a33565b60405180910390fd5b6110ca838383611756565b5f60025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508181101561114e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114590612ac1565b60405180910390fd5b81810360025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516112399190612143565b60405180910390a361124c848484611766565b50505050565b6112638161125e610d8e565b61176b565b50565b61127082826117ef565b6112938160015f8581526020019081526020015f206118c990919063ffffffff16565b505050565b6112a282826118f6565b6112c58160015f8581526020019081526020015f206119d090919063ffffffff16565b505050565b6112d26119fd565b5f60075f6101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611314610d8e565b6040516113219190612347565b60405180910390a1565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611399576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139090612b29565b60405180910390fd5b6113a45f8383611756565b8060045f8282546113b591906124b6565b925050819055508060025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516114639190612143565b60405180910390a36114765f8383611766565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114df90612bb7565b60405180910390fd5b6114f3825f83611756565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611577576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156e90612c45565b60405180910390fd5b81810360025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160045f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516116279190612143565b60405180910390a361163a835f84611766565b505050565b611647611a46565b600160075f6101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861168a610d8e565b6040516116979190612347565b60405180910390a1565b5f6116ae835f0183611a90565b5f1c905092915050565b5f806116c2610d8e565b90506116cf818585610fe3565b600191505092915050565b5f6116e6825f01611ab7565b9050919050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611761838383611ac6565b505050565b505050565b6117758282610a3f565b6117eb5761178281611b1e565b61178f835f1c6020611b4b565b6040516020016117a0929190612d31565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e29190612049565b60405180910390fd5b5050565b6117f98282610a3f565b6118c55760015f808481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061186a610d8e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b5f6118ee835f018373ffffffffffffffffffffffffffffffffffffffff165f1b611d80565b905092915050565b6119008282610a3f565b156119cc575f805f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550611971610d8e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b5f6119f5835f018373ffffffffffffffffffffffffffffffffffffffff165f1b611de7565b905092915050565b611a0561091e565b611a44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3b90612db4565b60405180910390fd5b565b611a4e61091e565b15611a8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8590612e1c565b60405180910390fd5b565b5f825f018281548110611aa657611aa5612e3a565b5b905f5260205f200154905092915050565b5f815f01805490509050919050565b611ad1838383611ee3565b611ad961091e565b15611b19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1090612ed7565b60405180910390fd5b505050565b6060611b448273ffffffffffffffffffffffffffffffffffffffff16601460ff16611b4b565b9050919050565b60605f6002836002611b5d9190612ef5565b611b6791906124b6565b67ffffffffffffffff811115611b8057611b7f612f36565b5b6040519080825280601f01601f191660200182016040528015611bb25781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110611be957611be8612e3a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611c4c57611c4b612e3a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f6001846002611c8a9190612ef5565b611c9491906124b6565b90505b6001811115611d33577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611cd657611cd5612e3a565b5b1a60f81b828281518110611ced57611cec612e3a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600485901c945080611d2c90612f63565b9050611c97565b505f8414611d76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6d90612fd4565b60405180910390fd5b8091505092915050565b5f611d8b8383611ee8565b611ddd57825f0182908060018154018082558091505060019003905f5260205f20015f9091909190915055825f0180549050836001015f8481526020019081526020015f208190555060019050611de1565b5f90505b92915050565b5f80836001015f8481526020019081526020015f205490505f8114611ed8575f600182611e14919061277e565b90505f6001865f0180549050611e2a919061277e565b9050818114611e90575f865f018281548110611e4957611e48612e3a565b5b905f5260205f200154905080875f018481548110611e6a57611e69612e3a565b5b905f5260205f20018190555083876001015f8381526020019081526020015f2081905550505b855f01805480611ea357611ea2612ff2565b5b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611edd565b5f9150505b92915050565b505050565b5f80836001015f8481526020019081526020015f20541415905092915050565b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611f4081611f0c565b8114611f4a575f80fd5b50565b5f81359050611f5b81611f37565b92915050565b5f60208284031215611f7657611f75611f08565b5b5f611f8384828501611f4d565b91505092915050565b5f8115159050919050565b611fa081611f8c565b82525050565b5f602082019050611fb95f830184611f97565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015611ff6578082015181840152602081019050611fdb565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61201b82611fbf565b6120258185611fc9565b9350612035818560208601611fd9565b61203e81612001565b840191505092915050565b5f6020820190508181035f8301526120618184612011565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61209282612069565b9050919050565b6120a281612088565b81146120ac575f80fd5b50565b5f813590506120bd81612099565b92915050565b5f819050919050565b6120d5816120c3565b81146120df575f80fd5b50565b5f813590506120f0816120cc565b92915050565b5f806040838503121561210c5761210b611f08565b5b5f612119858286016120af565b925050602061212a858286016120e2565b9150509250929050565b61213d816120c3565b82525050565b5f6020820190506121565f830184612134565b92915050565b5f805f6060848603121561217357612172611f08565b5b5f612180868287016120af565b9350506020612191868287016120af565b92505060406121a2868287016120e2565b9150509250925092565b5f819050919050565b6121be816121ac565b81146121c8575f80fd5b50565b5f813590506121d9816121b5565b92915050565b5f602082840312156121f4576121f3611f08565b5b5f612201848285016121cb565b91505092915050565b612213816121ac565b82525050565b5f60208201905061222c5f83018461220a565b92915050565b5f806040838503121561224857612247611f08565b5b5f612255858286016121cb565b9250506020612266858286016120af565b9150509250929050565b5f60ff82169050919050565b61228581612270565b82525050565b5f60208201905061229e5f83018461227c565b92915050565b5f602082840312156122b9576122b8611f08565b5b5f6122c6848285016120e2565b91505092915050565b5f602082840312156122e4576122e3611f08565b5b5f6122f1848285016120af565b91505092915050565b5f80604083850312156123105761230f611f08565b5b5f61231d858286016121cb565b925050602061232e858286016120e2565b9150509250929050565b61234181612088565b82525050565b5f60208201905061235a5f830184612338565b92915050565b5f806040838503121561237657612375611f08565b5b5f612383858286016120af565b9250506020612394858286016120af565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806123e257607f821691505b6020821081036123f5576123f461239e565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e63655f8201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b5f612455602f83611fc9565b9150612460826123fb565b604082019050919050565b5f6020820190508181035f83015261248281612449565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6124c0826120c3565b91506124cb836120c3565b92508282019050808211156124e3576124e2612489565b5b92915050565b7f45524332305072657365744d696e7465725061757365723a206d7573742068615f8201527f76652070617573657220726f6c6520746f20756e706175736500000000000000602082015250565b5f612543603983611fc9565b915061254e826124e9565b604082019050919050565b5f6020820190508181035f83015261257081612537565b9050919050565b7f45524332305072657365744d696e7465725061757365723a206d7573742068615f8201527f7665206d696e74657220726f6c6520746f206d696e7400000000000000000000602082015250565b5f6125d1603683611fc9565b91506125dc82612577565b604082019050919050565b5f6020820190508181035f8301526125fe816125c5565b9050919050565b7f45524332305072657365744d696e7465725061757365723a206d7573742068615f8201527f76652070617573657220726f6c6520746f207061757365000000000000000000602082015250565b5f61265f603783611fc9565b915061266a82612605565b604082019050919050565b5f6020820190508181035f83015261268c81612653565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f6126ed602583611fc9565b91506126f882612693565b604082019050919050565b5f6020820190508181035f83015261271a816126e1565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612758826120c3565b9150612763836120c3565b92508261277357612772612721565b5b828204905092915050565b5f612788826120c3565b9150612793836120c3565b92508282039050818111156127ab576127aa612489565b5b92915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f61280b602483611fc9565b9150612816826127b1565b604082019050919050565b5f6020820190508181035f830152612838816127ff565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f612899602283611fc9565b91506128a48261283f565b604082019050919050565b5f6020820190508181035f8301526128c68161288d565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f612901601d83611fc9565b915061290c826128cd565b602082019050919050565b5f6020820190508181035f83015261292e816128f5565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f61298f602583611fc9565b915061299a82612935565b604082019050919050565b5f6020820190508181035f8301526129bc81612983565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f612a1d602383611fc9565b9150612a28826129c3565b604082019050919050565b5f6020820190508181035f830152612a4a81612a11565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f612aab602683611fc9565b9150612ab682612a51565b604082019050919050565b5f6020820190508181035f830152612ad881612a9f565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f612b13601f83611fc9565b9150612b1e82612adf565b602082019050919050565b5f6020820190508181035f830152612b4081612b07565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f206164647265735f8201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b5f612ba1602183611fc9565b9150612bac82612b47565b604082019050919050565b5f6020820190508181035f830152612bce81612b95565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f612c2f602283611fc9565b9150612c3a82612bd5565b604082019050919050565b5f6020820190508181035f830152612c5c81612c23565b9050919050565b5f81905092915050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000005f82015250565b5f612ca1601783612c63565b9150612cac82612c6d565b601782019050919050565b5f612cc182611fbf565b612ccb8185612c63565b9350612cdb818560208601611fd9565b80840191505092915050565b7f206973206d697373696e6720726f6c65200000000000000000000000000000005f82015250565b5f612d1b601183612c63565b9150612d2682612ce7565b601182019050919050565b5f612d3b82612c95565b9150612d478285612cb7565b9150612d5282612d0f565b9150612d5e8284612cb7565b91508190509392505050565b7f5061757361626c653a206e6f74207061757365640000000000000000000000005f82015250565b5f612d9e601483611fc9565b9150612da982612d6a565b602082019050919050565b5f6020820190508181035f830152612dcb81612d92565b9050919050565b7f5061757361626c653a20706175736564000000000000000000000000000000005f82015250565b5f612e06601083611fc9565b9150612e1182612dd2565b602082019050919050565b5f6020820190508181035f830152612e3381612dfa565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f45524332305061757361626c653a20746f6b656e207472616e736665722077685f8201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b5f612ec1602a83611fc9565b9150612ecc82612e67565b604082019050919050565b5f6020820190508181035f830152612eee81612eb5565b9050919050565b5f612eff826120c3565b9150612f0a836120c3565b9250828202612f18816120c3565b91508282048414831517612f2f57612f2e612489565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f612f6d826120c3565b91505f8203612f7f57612f7e612489565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e745f82015250565b5f612fbe602083611fc9565b9150612fc982612f8a565b602082019050919050565b5f6020820190508181035f830152612feb81612fb2565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea2646970667358221220f418707856df455af876ceb967b31b0c8b813a535f1c2b9448d9e3f7ff7ce58d64736f6c63430008170033", - "contractName": "ERC20DirectBalanceManipulation" -} diff --git a/contracts/compiled_contracts/ERC20MaliciousDelayed.json b/contracts/compiled_contracts/ERC20MaliciousDelayed.json deleted file mode 100644 index 5e814dd554..0000000000 --- a/contracts/compiled_contracts/ERC20MaliciousDelayed.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "abi": "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"initialSupply\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PAUSER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"getRoleMember\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleMemberCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - "bin": "6080604052734dc6ac40af078661fc43823086e1513635eeab14600760016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550670de0b6b3a764000060085534801562000071575f80fd5b5060405162003bc938038062003bc98339818101604052810190620000979190620006c9565b6040518060400160405280601581526020017f45524332304d616c6963696f757344656c6179656400000000000000000000008152506040518060400160405280601581526020017f45524332304d414c4943494f555344454c4159454400000000000000000000008152508181816005908162000116919062000954565b50806006908162000128919062000954565b5050505f60075f6101000a81548160ff021916908315150217905550620001675f801b6200015b6200021860201b60201c565b6200021f60201b60201c565b620001a87f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66200019c6200021860201b60201c565b6200021f60201b60201c565b620001e97f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a620001dd6200021860201b60201c565b6200021f60201b60201c565b5050620001ff5f801b336200021f60201b60201c565b6200021133826200023560201b60201c565b5062000bdd565b5f33905090565b6200023182826200039b60201b60201c565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620002a6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200029d9062000a96565b60405180910390fd5b620002b95f8383620003d760201b60201c565b8060045f828254620002cc919062000ae3565b925050819055508060025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200037c919062000b2e565b60405180910390a3620003975f8383620003ef60201b60201c565b5050565b620003ad8282620003f460201b60201c565b620003d28160015f8581526020019081526020015f20620004df60201b90919060201c565b505050565b620003ea8383836200051460201b60201c565b505050565b505050565b6200040682826200057f60201b60201c565b620004db5760015f808481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550620004806200021860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b5f6200050c835f018373ffffffffffffffffffffffffffffffffffffffff165f1b620005e260201b60201c565b905092915050565b620005278383836200065360201b60201c565b620005376200065860201b60201c565b156200057a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005719062000bbd565b60405180910390fd5b505050565b5f805f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f620005f583836200066d60201b60201c565b6200064957825f0182908060018154018082558091505060019003905f5260205f20015f9091909190915055825f0180549050836001015f8481526020019081526020015f2081905550600190506200064d565b5f90505b92915050565b505050565b5f60075f9054906101000a900460ff16905090565b5f80836001015f8481526020019081526020015f20541415905092915050565b5f80fd5b5f819050919050565b620006a58162000691565b8114620006b0575f80fd5b50565b5f81519050620006c3816200069a565b92915050565b5f60208284031215620006e157620006e06200068d565b5b5f620006f084828501620006b3565b91505092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200077557607f821691505b6020821081036200078b576200078a62000730565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620007ef7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620007b2565b620007fb8683620007b2565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6200083c62000836620008308462000691565b62000813565b62000691565b9050919050565b5f819050919050565b62000857836200081c565b6200086f620008668262000843565b848454620007be565b825550505050565b5f90565b6200088562000877565b620008928184846200084c565b505050565b5b81811015620008b957620008ad5f826200087b565b60018101905062000898565b5050565b601f8211156200090857620008d28162000791565b620008dd84620007a3565b81016020851015620008ed578190505b62000905620008fc85620007a3565b83018262000897565b50505b505050565b5f82821c905092915050565b5f6200092a5f19846008026200090d565b1980831691505092915050565b5f62000944838362000919565b9150826002028217905092915050565b6200095f82620006f9565b67ffffffffffffffff8111156200097b576200097a62000703565b5b6200098782546200075d565b62000994828285620008bd565b5f60209050601f831160018114620009ca575f8415620009b5578287015190505b620009c1858262000937565b86555062000a30565b601f198416620009da8662000791565b5f5b8281101562000a0357848901518255600182019150602085019450602081019050620009dc565b8683101562000a23578489015162000a1f601f89168262000919565b8355505b6001600288020188555050505b505050505050565b5f82825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f62000a7e601f8362000a38565b915062000a8b8262000a48565b602082019050919050565b5f6020820190508181035f83015262000aaf8162000a70565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f62000aef8262000691565b915062000afc8362000691565b925082820190508082111562000b175762000b1662000ab6565b5b92915050565b62000b288162000691565b82525050565b5f60208201905062000b435f83018462000b1d565b92915050565b7f45524332305061757361626c653a20746f6b656e207472616e736665722077685f8201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b5f62000ba5602a8362000a38565b915062000bb28262000b49565b604082019050919050565b5f6020820190508181035f83015262000bd68162000b97565b9050919050565b612fde8062000beb5f395ff3fe608060405234801561000f575f80fd5b50600436106101c2575f3560e01c806370a08231116100f7578063a457c2d711610095578063d53913931161006f578063d53913931461052a578063d547741f14610548578063dd62ed3e14610564578063e63ab1e914610594576101c2565b8063a457c2d71461049a578063a9059cbb146104ca578063ca15c873146104fa576101c2565b80639010d07c116100d15780639010d07c146103fe57806391d148541461042e57806395d89b411461045e578063a217fddf1461047c576101c2565b806370a08231146103a857806379cc6790146103d85780638456cb59146103f4576101c2565b8063313ce567116101645780633f4ba83a1161013e5780633f4ba83a1461034857806340c10f191461035257806342966c681461036e5780635c975abb1461038a576101c2565b8063313ce567146102de57806336568abe146102fc5780633950935114610318576101c2565b806318160ddd116101a057806318160ddd1461024457806323b872dd14610262578063248a9ca3146102925780632f2ff15d146102c2576101c2565b806301ffc9a7146101c657806306fdde03146101f6578063095ea7b314610214575b5f80fd5b6101e060048036038101906101db9190611f47565b6105b2565b6040516101ed9190611f8c565b60405180910390f35b6101fe61062b565b60405161020b919061202f565b60405180910390f35b61022e600480360381019061022991906120dc565b6106bb565b60405161023b9190611f8c565b60405180910390f35b61024c6106dd565b6040516102599190612129565b60405180910390f35b61027c60048036038101906102779190612142565b6106e6565b6040516102899190611f8c565b60405180910390f35b6102ac60048036038101906102a791906121c5565b610714565b6040516102b991906121ff565b60405180910390f35b6102dc60048036038101906102d79190612218565b610730565b005b6102e6610751565b6040516102f39190612271565b60405180910390f35b61031660048036038101906103119190612218565b610759565b005b610332600480360381019061032d91906120dc565b6107dc565b60405161033f9190611f8c565b60405180910390f35b610350610812565b005b61036c600480360381019061036791906120dc565b61088c565b005b6103886004803603810190610383919061228a565b61090a565b005b61039261091e565b60405161039f9190611f8c565b60405180910390f35b6103c260048036038101906103bd91906122b5565b610933565b6040516103cf9190612129565b60405180910390f35b6103f260048036038101906103ed91906120dc565b610979565b005b6103fc610999565b005b610418600480360381019061041391906122e0565b610a13565b604051610425919061232d565b60405180910390f35b61044860048036038101906104439190612218565b610a3f565b6040516104559190611f8c565b60405180910390f35b610466610aa2565b604051610473919061202f565b60405180910390f35b610484610b32565b60405161049191906121ff565b60405180910390f35b6104b460048036038101906104af91906120dc565b610b38565b6040516104c19190611f8c565b60405180910390f35b6104e460048036038101906104df91906120dc565b610bad565b6040516104f19190611f8c565b60405180910390f35b610514600480360381019061050f91906121c5565b610bef565b6040516105219190612129565b60405180910390f35b610532610c10565b60405161053f91906121ff565b60405180910390f35b610562600480360381019061055d9190612218565b610c34565b005b61057e60048036038101906105799190612346565b610c55565b60405161058b9190612129565b60405180910390f35b61059c610cd7565b6040516105a991906121ff565b60405180910390f35b5f7f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610624575061062382610cfb565b5b9050919050565b60606005805461063a906123b1565b80601f0160208091040260200160405190810160405280929190818152602001828054610666906123b1565b80156106b15780601f10610688576101008083540402835291602001916106b1565b820191905f5260205f20905b81548152906001019060200180831161069457829003601f168201915b5050505050905090565b5f806106c5610d74565b90506106d2818585610d7b565b600191505092915050565b5f600454905090565b5f806106f0610d74565b90506106fd858285610f3e565b610708858585610fc9565b60019150509392505050565b5f805f8381526020019081526020015f20600101549050919050565b61073982610714565b61074281611238565b61074c838361124c565b505050565b5f6012905090565b610761610d74565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146107ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c590612451565b60405180910390fd5b6107d8828261127e565b5050565b5f806107e6610d74565b90506108078185856107f88589610c55565b610802919061249c565b610d7b565b600191505092915050565b6108437f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61083e610d74565b610a3f565b610882576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108799061253f565b60405180910390fd5b61088a6112b0565b565b6108bd7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66108b8610d74565b610a3f565b6108fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f3906125cd565b60405180910390fd5b6109068282611311565b5050565b61091b610915610d74565b82611460565b50565b5f60075f9054906101000a900460ff16905090565b5f60025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61098b82610985610d74565b83610f3e565b6109958282611460565b5050565b6109ca7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6109c5610d74565b610a3f565b610a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a009061265b565b60405180910390fd5b610a11611625565b565b5f610a378260015f8681526020019081526020015f2061168790919063ffffffff16565b905092915050565b5f805f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b606060068054610ab1906123b1565b80601f0160208091040260200160405190810160405280929190818152602001828054610add906123b1565b8015610b285780601f10610aff57610100808354040283529160200191610b28565b820191905f5260205f20905b815481529060010190602001808311610b0b57829003601f168201915b5050505050905090565b5f801b81565b5f80610b42610d74565b90505f610b4f8286610c55565b905083811015610b94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8b906126e9565b60405180910390fd5b610ba18286868403610d7b565b60019250505092915050565b5f610bdd83600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600854610d7b565b610be7838361169e565b905092915050565b5f610c0960015f8481526020019081526020015f206116c0565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610c3d82610714565b610c4681611238565b610c50838361127e565b505050565b5f60035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d6d5750610d6c826116d3565b5b9050919050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610de9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de090612777565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4e90612805565b60405180910390fd5b8060035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610f319190612129565b60405180910390a3505050565b5f610f498484610c55565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610fc35781811015610fb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fac9061286d565b60405180910390fd5b610fc28484848403610d7b565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611037576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102e906128fb565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109c90612989565b60405180910390fd5b6110b083838361173c565b5f60025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112b90612a17565b60405180910390fd5b81810360025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161121f9190612129565b60405180910390a361123284848461174c565b50505050565b61124981611244610d74565b611751565b50565b61125682826117d5565b6112798160015f8581526020019081526020015f206118af90919063ffffffff16565b505050565b61128882826118dc565b6112ab8160015f8581526020019081526020015f206119b690919063ffffffff16565b505050565b6112b86119e3565b5f60075f6101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6112fa610d74565b604051611307919061232d565b60405180910390a1565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361137f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137690612a7f565b60405180910390fd5b61138a5f838361173c565b8060045f82825461139b919061249c565b925050819055508060025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516114499190612129565b60405180910390a361145c5f838361174c565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c590612b0d565b60405180910390fd5b6114d9825f8361173c565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508181101561155d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155490612b9b565b60405180910390fd5b81810360025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160045f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161160d9190612129565b60405180910390a3611620835f8461174c565b505050565b61162d611a2c565b600160075f6101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611670610d74565b60405161167d919061232d565b60405180910390a1565b5f611694835f0183611a76565b5f1c905092915050565b5f806116a8610d74565b90506116b5818585610fc9565b600191505092915050565b5f6116cc825f01611a9d565b9050919050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611747838383611aac565b505050565b505050565b61175b8282610a3f565b6117d15761176881611b04565b611775835f1c6020611b31565b604051602001611786929190612c87565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c8919061202f565b60405180910390fd5b5050565b6117df8282610a3f565b6118ab5760015f808481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550611850610d74565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b5f6118d4835f018373ffffffffffffffffffffffffffffffffffffffff165f1b611d66565b905092915050565b6118e68282610a3f565b156119b2575f805f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550611957610d74565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b5f6119db835f018373ffffffffffffffffffffffffffffffffffffffff165f1b611dcd565b905092915050565b6119eb61091e565b611a2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2190612d0a565b60405180910390fd5b565b611a3461091e565b15611a74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6b90612d72565b60405180910390fd5b565b5f825f018281548110611a8c57611a8b612d90565b5b905f5260205f200154905092915050565b5f815f01805490509050919050565b611ab7838383611ec9565b611abf61091e565b15611aff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af690612e2d565b60405180910390fd5b505050565b6060611b2a8273ffffffffffffffffffffffffffffffffffffffff16601460ff16611b31565b9050919050565b60605f6002836002611b439190612e4b565b611b4d919061249c565b67ffffffffffffffff811115611b6657611b65612e8c565b5b6040519080825280601f01601f191660200182016040528015611b985781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110611bcf57611bce612d90565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611c3257611c31612d90565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f6001846002611c709190612e4b565b611c7a919061249c565b90505b6001811115611d19577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611cbc57611cbb612d90565b5b1a60f81b828281518110611cd357611cd2612d90565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600485901c945080611d1290612eb9565b9050611c7d565b505f8414611d5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5390612f2a565b60405180910390fd5b8091505092915050565b5f611d718383611ece565b611dc357825f0182908060018154018082558091505060019003905f5260205f20015f9091909190915055825f0180549050836001015f8481526020019081526020015f208190555060019050611dc7565b5f90505b92915050565b5f80836001015f8481526020019081526020015f205490505f8114611ebe575f600182611dfa9190612f48565b90505f6001865f0180549050611e109190612f48565b9050818114611e76575f865f018281548110611e2f57611e2e612d90565b5b905f5260205f200154905080875f018481548110611e5057611e4f612d90565b5b905f5260205f20018190555083876001015f8381526020019081526020015f2081905550505b855f01805480611e8957611e88612f7b565b5b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611ec3565b5f9150505b92915050565b505050565b5f80836001015f8481526020019081526020015f20541415905092915050565b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611f2681611ef2565b8114611f30575f80fd5b50565b5f81359050611f4181611f1d565b92915050565b5f60208284031215611f5c57611f5b611eee565b5b5f611f6984828501611f33565b91505092915050565b5f8115159050919050565b611f8681611f72565b82525050565b5f602082019050611f9f5f830184611f7d565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015611fdc578082015181840152602081019050611fc1565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61200182611fa5565b61200b8185611faf565b935061201b818560208601611fbf565b61202481611fe7565b840191505092915050565b5f6020820190508181035f8301526120478184611ff7565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6120788261204f565b9050919050565b6120888161206e565b8114612092575f80fd5b50565b5f813590506120a38161207f565b92915050565b5f819050919050565b6120bb816120a9565b81146120c5575f80fd5b50565b5f813590506120d6816120b2565b92915050565b5f80604083850312156120f2576120f1611eee565b5b5f6120ff85828601612095565b9250506020612110858286016120c8565b9150509250929050565b612123816120a9565b82525050565b5f60208201905061213c5f83018461211a565b92915050565b5f805f6060848603121561215957612158611eee565b5b5f61216686828701612095565b935050602061217786828701612095565b9250506040612188868287016120c8565b9150509250925092565b5f819050919050565b6121a481612192565b81146121ae575f80fd5b50565b5f813590506121bf8161219b565b92915050565b5f602082840312156121da576121d9611eee565b5b5f6121e7848285016121b1565b91505092915050565b6121f981612192565b82525050565b5f6020820190506122125f8301846121f0565b92915050565b5f806040838503121561222e5761222d611eee565b5b5f61223b858286016121b1565b925050602061224c85828601612095565b9150509250929050565b5f60ff82169050919050565b61226b81612256565b82525050565b5f6020820190506122845f830184612262565b92915050565b5f6020828403121561229f5761229e611eee565b5b5f6122ac848285016120c8565b91505092915050565b5f602082840312156122ca576122c9611eee565b5b5f6122d784828501612095565b91505092915050565b5f80604083850312156122f6576122f5611eee565b5b5f612303858286016121b1565b9250506020612314858286016120c8565b9150509250929050565b6123278161206e565b82525050565b5f6020820190506123405f83018461231e565b92915050565b5f806040838503121561235c5761235b611eee565b5b5f61236985828601612095565b925050602061237a85828601612095565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806123c857607f821691505b6020821081036123db576123da612384565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e63655f8201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b5f61243b602f83611faf565b9150612446826123e1565b604082019050919050565b5f6020820190508181035f8301526124688161242f565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6124a6826120a9565b91506124b1836120a9565b92508282019050808211156124c9576124c861246f565b5b92915050565b7f45524332305072657365744d696e7465725061757365723a206d7573742068615f8201527f76652070617573657220726f6c6520746f20756e706175736500000000000000602082015250565b5f612529603983611faf565b9150612534826124cf565b604082019050919050565b5f6020820190508181035f8301526125568161251d565b9050919050565b7f45524332305072657365744d696e7465725061757365723a206d7573742068615f8201527f7665206d696e74657220726f6c6520746f206d696e7400000000000000000000602082015250565b5f6125b7603683611faf565b91506125c28261255d565b604082019050919050565b5f6020820190508181035f8301526125e4816125ab565b9050919050565b7f45524332305072657365744d696e7465725061757365723a206d7573742068615f8201527f76652070617573657220726f6c6520746f207061757365000000000000000000602082015250565b5f612645603783611faf565b9150612650826125eb565b604082019050919050565b5f6020820190508181035f83015261267281612639565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f6126d3602583611faf565b91506126de82612679565b604082019050919050565b5f6020820190508181035f830152612700816126c7565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f612761602483611faf565b915061276c82612707565b604082019050919050565b5f6020820190508181035f83015261278e81612755565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f6127ef602283611faf565b91506127fa82612795565b604082019050919050565b5f6020820190508181035f83015261281c816127e3565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f612857601d83611faf565b915061286282612823565b602082019050919050565b5f6020820190508181035f8301526128848161284b565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f6128e5602583611faf565b91506128f08261288b565b604082019050919050565b5f6020820190508181035f830152612912816128d9565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f612973602383611faf565b915061297e82612919565b604082019050919050565b5f6020820190508181035f8301526129a081612967565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f612a01602683611faf565b9150612a0c826129a7565b604082019050919050565b5f6020820190508181035f830152612a2e816129f5565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f612a69601f83611faf565b9150612a7482612a35565b602082019050919050565b5f6020820190508181035f830152612a9681612a5d565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f206164647265735f8201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b5f612af7602183611faf565b9150612b0282612a9d565b604082019050919050565b5f6020820190508181035f830152612b2481612aeb565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f612b85602283611faf565b9150612b9082612b2b565b604082019050919050565b5f6020820190508181035f830152612bb281612b79565b9050919050565b5f81905092915050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000005f82015250565b5f612bf7601783612bb9565b9150612c0282612bc3565b601782019050919050565b5f612c1782611fa5565b612c218185612bb9565b9350612c31818560208601611fbf565b80840191505092915050565b7f206973206d697373696e6720726f6c65200000000000000000000000000000005f82015250565b5f612c71601183612bb9565b9150612c7c82612c3d565b601182019050919050565b5f612c9182612beb565b9150612c9d8285612c0d565b9150612ca882612c65565b9150612cb48284612c0d565b91508190509392505050565b7f5061757361626c653a206e6f74207061757365640000000000000000000000005f82015250565b5f612cf4601483611faf565b9150612cff82612cc0565b602082019050919050565b5f6020820190508181035f830152612d2181612ce8565b9050919050565b7f5061757361626c653a20706175736564000000000000000000000000000000005f82015250565b5f612d5c601083611faf565b9150612d6782612d28565b602082019050919050565b5f6020820190508181035f830152612d8981612d50565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f45524332305061757361626c653a20746f6b656e207472616e736665722077685f8201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b5f612e17602a83611faf565b9150612e2282612dbd565b604082019050919050565b5f6020820190508181035f830152612e4481612e0b565b9050919050565b5f612e55826120a9565b9150612e60836120a9565b9250828202612e6e816120a9565b91508282048414831517612e8557612e8461246f565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f612ec3826120a9565b91505f8203612ed557612ed461246f565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e745f82015250565b5f612f14602083611faf565b9150612f1f82612ee0565b602082019050919050565b5f6020820190508181035f830152612f4181612f08565b9050919050565b5f612f52826120a9565b9150612f5d836120a9565b9250828203905081811115612f7557612f7461246f565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea2646970667358221220fe4be6dc502d8123479471010a5179e893226b070d6b5d1606e6b5106444fa7c64736f6c63430008170033", - "contractName": "ERC20MaliciousDelayed" -} diff --git a/contracts/compiled_contracts/ERC20MinterBurnerDecimals.json b/contracts/compiled_contracts/ERC20MinterBurnerDecimals.json deleted file mode 100644 index f076a818ef..0000000000 --- a/contracts/compiled_contracts/ERC20MinterBurnerDecimals.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "abi": "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"decimals_\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BURNER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PAUSER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnCoins\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"getRoleMember\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleMemberCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - "bin": "608060405234801562000010575f80fd5b5060405162003aac38038062003aac8339818101604052810190620000369190620005c2565b8282816005908162000049919062000890565b5080600690816200005b919062000890565b5050505f60075f6101000a81548160ff0219169083151502179055506200009a5f801b6200008e6200017760201b60201c565b6200017e60201b60201c565b620000db7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6620000cf6200017760201b60201c565b6200017e60201b60201c565b6200011c7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a620001106200017760201b60201c565b6200017e60201b60201c565b6200015d7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a848620001516200017760201b60201c565b6200017e60201b60201c565b6200016e816200019460201b60201c565b50505062000974565b5f33905090565b620001908282620001b260201b60201c565b5050565b80600760016101000a81548160ff021916908360ff16021790555050565b620001c48282620001ee60201b60201c565b620001e98160015f8581526020019081526020015f20620002d960201b90919060201c565b505050565b6200020082826200030e60201b60201c565b620002d55760015f808481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506200027a6200017760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b5f62000306835f018373ffffffffffffffffffffffffffffffffffffffff165f1b6200037160201b60201c565b905092915050565b5f805f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f620003848383620003e260201b60201c565b620003d857825f0182908060018154018082558091505060019003905f5260205f20015f9091909190915055825f0180549050836001015f8481526020019081526020015f208190555060019050620003dc565b5f90505b92915050565b5f80836001015f8481526020019081526020015f20541415905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b62000463826200041b565b810181811067ffffffffffffffff821117156200048557620004846200042b565b5b80604052505050565b5f6200049962000402565b9050620004a7828262000458565b919050565b5f67ffffffffffffffff821115620004c957620004c86200042b565b5b620004d4826200041b565b9050602081019050919050565b5f5b8381101562000500578082015181840152602081019050620004e3565b5f8484015250505050565b5f620005216200051b84620004ac565b6200048e565b90508281526020810184848401111562000540576200053f62000417565b5b6200054d848285620004e1565b509392505050565b5f82601f8301126200056c576200056b62000413565b5b81516200057e8482602086016200050b565b91505092915050565b5f60ff82169050919050565b6200059e8162000587565b8114620005a9575f80fd5b50565b5f81519050620005bc8162000593565b92915050565b5f805f60608486031215620005dc57620005db6200040b565b5b5f84015167ffffffffffffffff811115620005fc57620005fb6200040f565b5b6200060a8682870162000555565b935050602084015167ffffffffffffffff8111156200062e576200062d6200040f565b5b6200063c8682870162000555565b92505060406200064f86828701620005ac565b9150509250925092565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620006a857607f821691505b602082108103620006be57620006bd62000663565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620007227fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620006e5565b6200072e8683620006e5565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f62000778620007726200076c8462000746565b6200074f565b62000746565b9050919050565b5f819050919050565b620007938362000758565b620007ab620007a2826200077f565b848454620006f1565b825550505050565b5f90565b620007c1620007b3565b620007ce81848462000788565b505050565b5b81811015620007f557620007e95f82620007b7565b600181019050620007d4565b5050565b601f82111562000844576200080e81620006c4565b6200081984620006d6565b8101602085101562000829578190505b620008416200083885620006d6565b830182620007d3565b50505b505050565b5f82821c905092915050565b5f620008665f198460080262000849565b1980831691505092915050565b5f62000880838362000855565b9150826002028217905092915050565b6200089b8262000659565b67ffffffffffffffff811115620008b757620008b66200042b565b5b620008c3825462000690565b620008d0828285620007f9565b5f60209050601f83116001811462000906575f8415620008f1578287015190505b620008fd858262000873565b8655506200096c565b601f1984166200091686620006c4565b5f5b828110156200093f5784890151825560018201915060208501945060208101905062000918565b868310156200095f57848901516200095b601f89168262000855565b8355505b6001600288020188555050505b505050505050565b61312a80620009825f395ff3fe608060405234801561000f575f80fd5b50600436106101d8575f3560e01c80635c975abb11610102578063a217fddf116100a0578063d53913931161006f578063d53913931461057a578063d547741f14610598578063dd62ed3e146105b4578063e63ab1e9146105e4576101d8565b8063a217fddf146104cc578063a457c2d7146104ea578063a9059cbb1461051a578063ca15c8731461054a576101d8565b80638456cb59116100dc5780638456cb59146104445780639010d07c1461044e57806391d148541461047e57806395d89b41146104ae576101d8565b80635c975abb146103da57806370a08231146103f857806379cc679014610428576101d8565b8063282c51f31161017a578063395093511161014957806339509351146103685780633f4ba83a1461039857806340c10f19146103a257806342966c68146103be576101d8565b8063282c51f3146102f45780632f2ff15d14610312578063313ce5671461032e57806336568abe1461034c576101d8565b806318160ddd116101b657806318160ddd1461025a5780631cf2c7e21461027857806323b872dd14610294578063248a9ca3146102c4576101d8565b806301ffc9a7146101dc57806306fdde031461020c578063095ea7b31461022a575b5f80fd5b6101f660048036038101906101f19190612005565b610602565b604051610203919061204a565b60405180910390f35b61021461067b565b60405161022191906120ed565b60405180910390f35b610244600480360381019061023f919061219a565b61070b565b604051610251919061204a565b60405180910390f35b61026261072d565b60405161026f91906121e7565b60405180910390f35b610292600480360381019061028d919061219a565b610736565b005b6102ae60048036038101906102a99190612200565b6107b4565b6040516102bb919061204a565b60405180910390f35b6102de60048036038101906102d99190612283565b6107e2565b6040516102eb91906122bd565b60405180910390f35b6102fc6107fe565b60405161030991906122bd565b60405180910390f35b61032c600480360381019061032791906122d6565b610822565b005b610336610843565b604051610343919061232f565b60405180910390f35b610366600480360381019061036191906122d6565b610859565b005b610382600480360381019061037d919061219a565b6108dc565b60405161038f919061204a565b60405180910390f35b6103a0610912565b005b6103bc60048036038101906103b7919061219a565b61098c565b005b6103d860048036038101906103d39190612348565b610a0a565b005b6103e2610a1e565b6040516103ef919061204a565b60405180910390f35b610412600480360381019061040d9190612373565b610a33565b60405161041f91906121e7565b60405180910390f35b610442600480360381019061043d919061219a565b610a79565b005b61044c610a99565b005b6104686004803603810190610463919061239e565b610b13565b60405161047591906123eb565b60405180910390f35b610498600480360381019061049391906122d6565b610b3f565b6040516104a5919061204a565b60405180910390f35b6104b6610ba2565b6040516104c391906120ed565b60405180910390f35b6104d4610c32565b6040516104e191906122bd565b60405180910390f35b61050460048036038101906104ff919061219a565b610c38565b604051610511919061204a565b60405180910390f35b610534600480360381019061052f919061219a565b610cad565b604051610541919061204a565b60405180910390f35b610564600480360381019061055f9190612283565b610ccf565b60405161057191906121e7565b60405180910390f35b610582610cf0565b60405161058f91906122bd565b60405180910390f35b6105b260048036038101906105ad91906122d6565b610d14565b005b6105ce60048036038101906105c99190612404565b610d35565b6040516105db91906121e7565b60405180910390f35b6105ec610db7565b6040516105f991906122bd565b60405180910390f35b5f7f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610674575061067382610ddb565b5b9050919050565b60606005805461068a9061246f565b80601f01602080910402602001604051908101604052809291908181526020018280546106b69061246f565b80156107015780601f106106d857610100808354040283529160200191610701565b820191905f5260205f20905b8154815290600101906020018083116106e457829003601f168201915b5050505050905090565b5f80610715610e54565b9050610722818585610e5b565b600191505092915050565b5f600454905090565b6107677f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a848610762610e54565b610b3f565b6107a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079d9061250f565b60405180910390fd5b6107b0828261101e565b5050565b5f806107be610e54565b90506107cb8582856111e3565b6107d685858561126e565b60019150509392505050565b5f805f8381526020019081526020015f20600101549050919050565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84881565b61082b826107e2565b610834816114dd565b61083e83836114f1565b505050565b5f600760019054906101000a900460ff16905090565b610861610e54565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146108ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c59061259d565b60405180910390fd5b6108d88282611523565b5050565b5f806108e6610e54565b90506109078185856108f88589610d35565b61090291906125e8565b610e5b565b600191505092915050565b6109437f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61093e610e54565b610b3f565b610982576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109799061268b565b60405180910390fd5b61098a611555565b565b6109bd7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66109b8610e54565b610b3f565b6109fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f390612719565b60405180910390fd5b610a0682826115b6565b5050565b610a1b610a15610e54565b8261101e565b50565b5f60075f9054906101000a900460ff16905090565b5f60025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610a8b82610a85610e54565b836111e3565b610a95828261101e565b5050565b610aca7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610ac5610e54565b610b3f565b610b09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b00906127a7565b60405180910390fd5b610b11611705565b565b5f610b378260015f8681526020019081526020015f2061176790919063ffffffff16565b905092915050565b5f805f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b606060068054610bb19061246f565b80601f0160208091040260200160405190810160405280929190818152602001828054610bdd9061246f565b8015610c285780601f10610bff57610100808354040283529160200191610c28565b820191905f5260205f20905b815481529060010190602001808311610c0b57829003601f168201915b5050505050905090565b5f801b81565b5f80610c42610e54565b90505f610c4f8286610d35565b905083811015610c94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8b90612835565b60405180910390fd5b610ca18286868403610e5b565b60019250505092915050565b5f80610cb7610e54565b9050610cc481858561126e565b600191505092915050565b5f610ce960015f8481526020019081526020015f2061177e565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610d1d826107e2565b610d26816114dd565b610d308383611523565b505050565b5f60035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e4d5750610e4c82611791565b5b9050919050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ec9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec0906128c3565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2e90612951565b60405180910390fd5b8060035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161101191906121e7565b60405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361108c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611083906129df565b60405180910390fd5b611097825f836117fa565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508181101561111b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111290612a6d565b60405180910390fd5b81810360025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160045f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516111cb91906121e7565b60405180910390a36111de835f8461180a565b505050565b5f6111ee8484610d35565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611268578181101561125a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125190612ad5565b60405180910390fd5b6112678484848403610e5b565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390612b63565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361134a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134190612bf1565b60405180910390fd5b6113558383836117fa565b5f60025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156113d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d090612c7f565b60405180910390fd5b81810360025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114c491906121e7565b60405180910390a36114d784848461180a565b50505050565b6114ee816114e9610e54565b61180f565b50565b6114fb8282611893565b61151e8160015f8581526020019081526020015f2061196d90919063ffffffff16565b505050565b61152d828261199a565b6115508160015f8581526020019081526020015f20611a7490919063ffffffff16565b505050565b61155d611aa1565b5f60075f6101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61159f610e54565b6040516115ac91906123eb565b60405180910390a1565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161b90612ce7565b60405180910390fd5b61162f5f83836117fa565b8060045f82825461164091906125e8565b925050819055508060025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516116ee91906121e7565b60405180910390a36117015f838361180a565b5050565b61170d611aea565b600160075f6101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611750610e54565b60405161175d91906123eb565b60405180910390a1565b5f611774835f0183611b34565b5f1c905092915050565b5f61178a825f01611b5b565b9050919050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611805838383611b6a565b505050565b505050565b6118198282610b3f565b61188f5761182681611bc2565b611833835f1c6020611bef565b604051602001611844929190612dd3565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188691906120ed565b60405180910390fd5b5050565b61189d8282610b3f565b6119695760015f808481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061190e610e54565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b5f611992835f018373ffffffffffffffffffffffffffffffffffffffff165f1b611e24565b905092915050565b6119a48282610b3f565b15611a70575f805f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550611a15610e54565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b5f611a99835f018373ffffffffffffffffffffffffffffffffffffffff165f1b611e8b565b905092915050565b611aa9610a1e565b611ae8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adf90612e56565b60405180910390fd5b565b611af2610a1e565b15611b32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2990612ebe565b60405180910390fd5b565b5f825f018281548110611b4a57611b49612edc565b5b905f5260205f200154905092915050565b5f815f01805490509050919050565b611b75838383611f87565b611b7d610a1e565b15611bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb490612f79565b60405180910390fd5b505050565b6060611be88273ffffffffffffffffffffffffffffffffffffffff16601460ff16611bef565b9050919050565b60605f6002836002611c019190612f97565b611c0b91906125e8565b67ffffffffffffffff811115611c2457611c23612fd8565b5b6040519080825280601f01601f191660200182016040528015611c565781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110611c8d57611c8c612edc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611cf057611cef612edc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f6001846002611d2e9190612f97565b611d3891906125e8565b90505b6001811115611dd7577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611d7a57611d79612edc565b5b1a60f81b828281518110611d9157611d90612edc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600485901c945080611dd090613005565b9050611d3b565b505f8414611e1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1190613076565b60405180910390fd5b8091505092915050565b5f611e2f8383611f8c565b611e8157825f0182908060018154018082558091505060019003905f5260205f20015f9091909190915055825f0180549050836001015f8481526020019081526020015f208190555060019050611e85565b5f90505b92915050565b5f80836001015f8481526020019081526020015f205490505f8114611f7c575f600182611eb89190613094565b90505f6001865f0180549050611ece9190613094565b9050818114611f34575f865f018281548110611eed57611eec612edc565b5b905f5260205f200154905080875f018481548110611f0e57611f0d612edc565b5b905f5260205f20018190555083876001015f8381526020019081526020015f2081905550505b855f01805480611f4757611f466130c7565b5b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611f81565b5f9150505b92915050565b505050565b5f80836001015f8481526020019081526020015f20541415905092915050565b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611fe481611fb0565b8114611fee575f80fd5b50565b5f81359050611fff81611fdb565b92915050565b5f6020828403121561201a57612019611fac565b5b5f61202784828501611ff1565b91505092915050565b5f8115159050919050565b61204481612030565b82525050565b5f60208201905061205d5f83018461203b565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561209a57808201518184015260208101905061207f565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6120bf82612063565b6120c9818561206d565b93506120d981856020860161207d565b6120e2816120a5565b840191505092915050565b5f6020820190508181035f83015261210581846120b5565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6121368261210d565b9050919050565b6121468161212c565b8114612150575f80fd5b50565b5f813590506121618161213d565b92915050565b5f819050919050565b61217981612167565b8114612183575f80fd5b50565b5f8135905061219481612170565b92915050565b5f80604083850312156121b0576121af611fac565b5b5f6121bd85828601612153565b92505060206121ce85828601612186565b9150509250929050565b6121e181612167565b82525050565b5f6020820190506121fa5f8301846121d8565b92915050565b5f805f6060848603121561221757612216611fac565b5b5f61222486828701612153565b935050602061223586828701612153565b925050604061224686828701612186565b9150509250925092565b5f819050919050565b61226281612250565b811461226c575f80fd5b50565b5f8135905061227d81612259565b92915050565b5f6020828403121561229857612297611fac565b5b5f6122a58482850161226f565b91505092915050565b6122b781612250565b82525050565b5f6020820190506122d05f8301846122ae565b92915050565b5f80604083850312156122ec576122eb611fac565b5b5f6122f98582860161226f565b925050602061230a85828601612153565b9150509250929050565b5f60ff82169050919050565b61232981612314565b82525050565b5f6020820190506123425f830184612320565b92915050565b5f6020828403121561235d5761235c611fac565b5b5f61236a84828501612186565b91505092915050565b5f6020828403121561238857612387611fac565b5b5f61239584828501612153565b91505092915050565b5f80604083850312156123b4576123b3611fac565b5b5f6123c18582860161226f565b92505060206123d285828601612186565b9150509250929050565b6123e58161212c565b82525050565b5f6020820190506123fe5f8301846123dc565b92915050565b5f806040838503121561241a57612419611fac565b5b5f61242785828601612153565b925050602061243885828601612153565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061248657607f821691505b60208210810361249957612498612442565b5b50919050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d757374205f8201527f68617665206275726e657220726f6c6520746f206275726e0000000000000000602082015250565b5f6124f960388361206d565b91506125048261249f565b604082019050919050565b5f6020820190508181035f830152612526816124ed565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e63655f8201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b5f612587602f8361206d565b91506125928261252d565b604082019050919050565b5f6020820190508181035f8301526125b48161257b565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6125f282612167565b91506125fd83612167565b9250828201905080821115612615576126146125bb565b5b92915050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d757374205f8201527f686176652070617573657220726f6c6520746f20756e70617573650000000000602082015250565b5f612675603b8361206d565b91506126808261261b565b604082019050919050565b5f6020820190508181035f8301526126a281612669565b9050919050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d757374205f8201527f68617665206d696e74657220726f6c6520746f206d696e740000000000000000602082015250565b5f61270360388361206d565b915061270e826126a9565b604082019050919050565b5f6020820190508181035f830152612730816126f7565b9050919050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d757374205f8201527f686176652070617573657220726f6c6520746f20706175736500000000000000602082015250565b5f61279160398361206d565b915061279c82612737565b604082019050919050565b5f6020820190508181035f8301526127be81612785565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f61281f60258361206d565b915061282a826127c5565b604082019050919050565b5f6020820190508181035f83015261284c81612813565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f6128ad60248361206d565b91506128b882612853565b604082019050919050565b5f6020820190508181035f8301526128da816128a1565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f61293b60228361206d565b9150612946826128e1565b604082019050919050565b5f6020820190508181035f8301526129688161292f565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f206164647265735f8201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b5f6129c960218361206d565b91506129d48261296f565b604082019050919050565b5f6020820190508181035f8301526129f6816129bd565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f612a5760228361206d565b9150612a62826129fd565b604082019050919050565b5f6020820190508181035f830152612a8481612a4b565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f612abf601d8361206d565b9150612aca82612a8b565b602082019050919050565b5f6020820190508181035f830152612aec81612ab3565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f612b4d60258361206d565b9150612b5882612af3565b604082019050919050565b5f6020820190508181035f830152612b7a81612b41565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f612bdb60238361206d565b9150612be682612b81565b604082019050919050565b5f6020820190508181035f830152612c0881612bcf565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f612c6960268361206d565b9150612c7482612c0f565b604082019050919050565b5f6020820190508181035f830152612c9681612c5d565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f612cd1601f8361206d565b9150612cdc82612c9d565b602082019050919050565b5f6020820190508181035f830152612cfe81612cc5565b9050919050565b5f81905092915050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000005f82015250565b5f612d43601783612d05565b9150612d4e82612d0f565b601782019050919050565b5f612d6382612063565b612d6d8185612d05565b9350612d7d81856020860161207d565b80840191505092915050565b7f206973206d697373696e6720726f6c65200000000000000000000000000000005f82015250565b5f612dbd601183612d05565b9150612dc882612d89565b601182019050919050565b5f612ddd82612d37565b9150612de98285612d59565b9150612df482612db1565b9150612e008284612d59565b91508190509392505050565b7f5061757361626c653a206e6f74207061757365640000000000000000000000005f82015250565b5f612e4060148361206d565b9150612e4b82612e0c565b602082019050919050565b5f6020820190508181035f830152612e6d81612e34565b9050919050565b7f5061757361626c653a20706175736564000000000000000000000000000000005f82015250565b5f612ea860108361206d565b9150612eb382612e74565b602082019050919050565b5f6020820190508181035f830152612ed581612e9c565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f45524332305061757361626c653a20746f6b656e207472616e736665722077685f8201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b5f612f63602a8361206d565b9150612f6e82612f09565b604082019050919050565b5f6020820190508181035f830152612f9081612f57565b9050919050565b5f612fa182612167565b9150612fac83612167565b9250828202612fba81612167565b91508282048414831517612fd157612fd06125bb565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f61300f82612167565b91505f8203613021576130206125bb565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e745f82015250565b5f61306060208361206d565b915061306b8261302c565b602082019050919050565b5f6020820190508181035f83015261308d81613054565b9050919050565b5f61309e82612167565b91506130a983612167565b92508282039050818111156130c1576130c06125bb565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea26469706673582212208e17db436f847258cc8b148f2ec3689c9d1043000f9acacdf5a893071a6136a964736f6c63430008170033", - "contractName": "ERC20MinterBurnerDecimals" -} diff --git a/contracts/compiled_contracts/FlashLoan.json b/contracts/compiled_contracts/FlashLoan.json deleted file mode 100644 index 1d7068abb7..0000000000 --- a/contracts/compiled_contracts/FlashLoan.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "abi": "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_validator\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"flashLoan\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - "bin": "608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610eea806100606000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80638da5cb5b1461003b578063ee52ad7114610059575b600080fd5b610043610089565b60405161005091906106dd565b60405180910390f35b610073600480360381019061006e91906108b4565b6100ad565b604051610080919061093e565b60405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461013e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610135906109dc565b60405180910390fd5b6000849050828173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b815260040161017f9291906109fc565b602060405180830381865afa15801561019c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101c09190610a3a565b1015610201576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f890610ab3565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161023c91906106dd565b602060405180830381865afa158015610259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027d9190610a3a565b905060008273ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b81526004016102be93929190610ae2565b6020604051808303816000875af11580156102dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103019190610b45565b905080610343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033a90610be4565b60405180910390fd5b848261034f9190610c33565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161038891906106dd565b602060405180830381865afa1580156103a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c99190610a3a565b14610409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040090610cb3565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3388886040518463ffffffff1660e01b815260040161044893929190610d41565b6020604051808303816000875af1158015610467573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048b9190610b45565b9050806104cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104c490610dcb565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161050691906106dd565b602060405180830381865afa158015610523573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105479190610a3a565b91508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33876040518363ffffffff1660e01b8152600401610584929190610deb565b6020604051808303816000875af11580156105a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c79190610b45565b5084826105d49190610e14565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161060d91906106dd565b602060405180830381865afa15801561062a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064e9190610a3a565b1461068e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068590610e94565b60405180910390fd5b600193505050509392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106c78261069c565b9050919050565b6106d7816106bc565b82525050565b60006020820190506106f260008301846106ce565b92915050565b6000604051905090565b600080fd5b600080fd5b610715816106bc565b811461072057600080fd5b50565b6000813590506107328161070c565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61078b82610742565b810181811067ffffffffffffffff821117156107aa576107a9610753565b5b80604052505050565b60006107bd6106f8565b90506107c98282610782565b919050565b600067ffffffffffffffff8211156107e9576107e8610753565b5b6107f282610742565b9050602081019050919050565b82818337600083830152505050565b600061082161081c846107ce565b6107b3565b90508281526020810184848401111561083d5761083c61073d565b5b6108488482856107ff565b509392505050565b600082601f83011261086557610864610738565b5b813561087584826020860161080e565b91505092915050565b6000819050919050565b6108918161087e565b811461089c57600080fd5b50565b6000813590506108ae81610888565b92915050565b6000806000606084860312156108cd576108cc610702565b5b60006108db86828701610723565b935050602084013567ffffffffffffffff8111156108fc576108fb610707565b5b61090886828701610850565b92505060406109198682870161089f565b9150509250925092565b60008115159050919050565b61093881610923565b82525050565b6000602082019050610953600083018461092f565b92915050565b600082825260208201905092915050565b7f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b60006109c6602183610959565b91506109d18261096a565b604082019050919050565b600060208201905081810360008301526109f5816109b9565b9050919050565b6000604082019050610a1160008301856106ce565b610a1e60208301846106ce565b9392505050565b600081519050610a3481610888565b92915050565b600060208284031215610a5057610a4f610702565b5b6000610a5e84828501610a25565b91505092915050565b7f496e73756666696369656e7420616c6c6f77616e636500000000000000000000600082015250565b6000610a9d601683610959565b9150610aa882610a67565b602082019050919050565b60006020820190508181036000830152610acc81610a90565b9050919050565b610adc8161087e565b82525050565b6000606082019050610af760008301866106ce565b610b0460208301856106ce565b610b116040830184610ad3565b949350505050565b610b2281610923565b8114610b2d57600080fd5b50565b600081519050610b3f81610b19565b92915050565b600060208284031215610b5b57610b5a610702565b5b6000610b6984828501610b30565b91505092915050565b7f4661696c656420746f207472616e7366657220746f6b656e7320666f7220666c60008201527f617368206c6f616e000000000000000000000000000000000000000000000000602082015250565b6000610bce602883610959565b9150610bd982610b72565b604082019050919050565b60006020820190508181036000830152610bfd81610bc1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610c3e8261087e565b9150610c498361087e565b9250828201905080821115610c6157610c60610c04565b5b92915050565b7f466c617368206c6f616e206661696c6564000000000000000000000000000000600082015250565b6000610c9d601183610959565b9150610ca882610c67565b602082019050919050565b60006020820190508181036000830152610ccc81610c90565b9050919050565b600081519050919050565b60005b83811015610cfc578082015181840152602081019050610ce1565b60008484015250505050565b6000610d1382610cd3565b610d1d8185610959565b9350610d2d818560208601610cde565b610d3681610742565b840191505092915050565b6000606082019050610d5660008301866106ce565b8181036020830152610d688185610d08565b9050610d776040830184610ad3565b949350505050565b7f6661696c656420746f2064656c65676174650000000000000000000000000000600082015250565b6000610db5601283610959565b9150610dc082610d7f565b602082019050919050565b60006020820190508181036000830152610de481610da8565b9050919050565b6000604082019050610e0060008301856106ce565b610e0d6020830184610ad3565b9392505050565b6000610e1f8261087e565b9150610e2a8361087e565b9250828203905081811115610e4257610e41610c04565b5b92915050565b7f466c617368206c6f616e2072657061796d656e74206661696c65640000000000600082015250565b6000610e7e601b83610959565b9150610e8982610e48565b602082019050919050565b60006020820190508181036000830152610ead81610e71565b905091905056fea26469706673582212203f15a3a5dfb30d87e89521478e06d8ab916218abccea886e4f688418fc0f725064736f6c63430008130033", - "contractName": "FlashLoan" -} diff --git a/contracts/erc20.go b/contracts/erc20.go index 292e257de4..8b25d3fc0c 100644 --- a/contracts/erc20.go +++ b/contracts/erc20.go @@ -4,35 +4,27 @@ package contracts import ( - _ "embed" // embed compiled smart contract - "encoding/json" + _ "embed" - "github.com/ethereum/go-ethereum/common" + contractutils "github.com/evmos/evmos/v18/contracts/utils" evmtypes "github.com/evmos/evmos/v18/x/evm/types" - - "github.com/evmos/evmos/v18/x/erc20/types" ) var ( - //go:embed compiled_contracts/ERC20MinterBurnerDecimals.json - ERC20MinterBurnerDecimalsJSON []byte //nolint: golint + // ERC20MinterBurnerDecimalsJSON are the compiled bytes of the ERC20MinterBurnerDecimalsContract + // + //go:embed solidity/ERC20MinterBurnerDecimals.json + ERC20MinterBurnerDecimalsJSON []byte // ERC20MinterBurnerDecimalsContract is the compiled erc20 contract ERC20MinterBurnerDecimalsContract evmtypes.CompiledContract - - // ERC20MinterBurnerDecimalsAddress is the erc20 module address - ERC20MinterBurnerDecimalsAddress common.Address ) func init() { - ERC20MinterBurnerDecimalsAddress = types.ModuleAddress - - err := json.Unmarshal(ERC20MinterBurnerDecimalsJSON, &ERC20MinterBurnerDecimalsContract) - if err != nil { + var err error + if ERC20MinterBurnerDecimalsContract, err = contractutils.ConvertHardhatBytesToCompiledContract( + ERC20MinterBurnerDecimalsJSON, + ); err != nil { panic(err) } - - if len(ERC20MinterBurnerDecimalsContract.Bin) == 0 { - panic("load contract failed") - } } diff --git a/contracts/erc20DirectBalanceManipulation.go b/contracts/erc20DirectBalanceManipulation.go deleted file mode 100644 index 48102f3df5..0000000000 --- a/contracts/erc20DirectBalanceManipulation.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) -package contracts - -import ( - _ "embed" // embed compiled smart contract - "encoding/json" - - "github.com/ethereum/go-ethereum/common" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" - - "github.com/evmos/evmos/v18/x/erc20/types" -) - -// This is an evil token. Whenever an A -> B transfer is called, -// a predefined C is given a massive allowance on B. -var ( - //go:embed compiled_contracts/ERC20DirectBalanceManipulation.json - ERC20DirectBalanceManipulationJSON []byte //nolint: golint - - // ERC20DirectBalanceManipulationContract is the compiled erc20 contract - ERC20DirectBalanceManipulationContract evmtypes.CompiledContract - - // ERC20DirectBalanceManipulationAddress is the erc20 module address - ERC20DirectBalanceManipulationAddress common.Address -) - -func init() { - ERC20DirectBalanceManipulationAddress = types.ModuleAddress - - err := json.Unmarshal(ERC20DirectBalanceManipulationJSON, &ERC20DirectBalanceManipulationContract) - if err != nil { - panic(err) - } - - if len(ERC20DirectBalanceManipulationContract.Bin) == 0 { - panic("load contract failed") - } -} diff --git a/contracts/erc20burnable.go b/contracts/erc20burnable.go deleted file mode 100644 index f61840ed34..0000000000 --- a/contracts/erc20burnable.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) -package contracts - -import ( - _ "embed" // embed compiled smart contract - "encoding/json" - - evmtypes "github.com/evmos/evmos/v18/x/evm/types" -) - -var ( - //go:embed compiled_contracts/ERC20Burnable.json - erc20BurnableJSON []byte - - // ERC20BurnableContract is the compiled ERC20Burnable contract - ERC20BurnableContract evmtypes.CompiledContract -) - -func init() { - err := json.Unmarshal(erc20BurnableJSON, &ERC20BurnableContract) - if err != nil { - panic(err) - } -} diff --git a/contracts/erc20maliciousdelayed.go b/contracts/erc20maliciousdelayed.go deleted file mode 100644 index 1045a73a63..0000000000 --- a/contracts/erc20maliciousdelayed.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) -package contracts - -import ( - _ "embed" // embed compiled smart contract - "encoding/json" - - "github.com/ethereum/go-ethereum/common" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" - - "github.com/evmos/evmos/v18/x/erc20/types" -) - -// This is an evil token. Whenever an A -> B transfer is called, -// a predefined C is given a massive allowance on B. -var ( - //go:embed compiled_contracts/ERC20MaliciousDelayed.json - ERC20MaliciousDelayedJSON []byte //nolint: golint - - // ERC20MaliciousDelayedContract is the compiled erc20 contract - ERC20MaliciousDelayedContract evmtypes.CompiledContract - - // ERC20MaliciousDelayedAddress is the erc20 module address - ERC20MaliciousDelayedAddress common.Address -) - -func init() { - ERC20MaliciousDelayedAddress = types.ModuleAddress - - err := json.Unmarshal(ERC20MaliciousDelayedJSON, &ERC20MaliciousDelayedContract) - if err != nil { - panic(err) - } - - if len(ERC20MaliciousDelayedContract.Bin) == 0 { - panic("load contract failed") - } -} diff --git a/contracts/flash_loan.go b/contracts/flash_loan.go deleted file mode 100644 index 367bc61f3a..0000000000 --- a/contracts/flash_loan.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package contracts - -import ( - _ "embed" // embed compiled smart contract - "encoding/json" - - evmtypes "github.com/evmos/evmos/v18/x/evm/types" -) - -var ( - //go:embed compiled_contracts/FlashLoan.json - FlashLoanJSON []byte //nolint:golint // used to embed the compiled contract - - // FlashLoanContract is the compiled flash loan contract - FlashLoanContract evmtypes.CompiledContract -) - -func init() { - err := json.Unmarshal(FlashLoanJSON, &FlashLoanContract) - if err != nil { - panic(err) - } - - if len(FlashLoanContract.Bin) == 0 { - panic("load contract failed") - } -} diff --git a/contracts/hardhat.config.js b/contracts/hardhat.config.js new file mode 100644 index 0000000000..5a6dc10e2a --- /dev/null +++ b/contracts/hardhat.config.js @@ -0,0 +1,7 @@ +/** @type import('hardhat/config').HardhatUserConfig */ +module.exports = { + solidity: '0.8.19', + paths: { + sources: './solidity' + } +} diff --git a/contracts/package-lock.json b/contracts/package-lock.json index 17d95d98fd..c9f30c5524 100644 --- a/contracts/package-lock.json +++ b/contracts/package-lock.json @@ -1,22 +1,3504 @@ { - "name": "evmos", - "version": "1.0.0", + "name": "evmos-contracts", + "version": "2.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "evmos", - "version": "1.0.0", + "name": "evmos-contracts", + "version": "2.0.0", "license": "ISC", + "devDependencies": { + "@openzeppelin/contracts": "^4.9.6", + "hardhat": "^2.22.2" + } + }, + "node_modules/@ethersproject/abi": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", + "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/abstract-provider": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", + "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0" + } + }, + "node_modules/@ethersproject/abstract-signer": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", + "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0" + } + }, + "node_modules/@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" + } + }, + "node_modules/@ethersproject/base64": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", + "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0" + } + }, + "node_modules/@ethersproject/bignumber": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", + "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "bn.js": "^5.2.1" + } + }, + "node_modules/@ethersproject/bytes": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", + "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/constants": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", + "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0" + } + }, + "node_modules/@ethersproject/hash": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", + "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/keccak256": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", + "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "js-sha3": "0.8.0" + } + }, + "node_modules/@ethersproject/logger": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ] + }, + "node_modules/@ethersproject/networks": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", + "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/properties": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", + "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/rlp": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", + "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/signing-key": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", + "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "bn.js": "^5.2.1", + "elliptic": "6.5.4", + "hash.js": "1.1.7" + } + }, + "node_modules/@ethersproject/strings": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", + "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/transactions": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", + "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0" + } + }, + "node_modules/@ethersproject/web": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", + "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@metamask/eth-sig-util": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", + "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==", + "dev": true, + "dependencies": { + "ethereumjs-abi": "^0.6.8", + "ethereumjs-util": "^6.2.1", + "ethjs-util": "^0.1.6", + "tweetnacl": "^1.0.3", + "tweetnacl-util": "^0.15.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@noble/hashes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", + "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@noble/secp256k1": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", + "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@nomicfoundation/edr": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.3.3.tgz", + "integrity": "sha512-zP+e+3B1nEUx6bW5BPnIzCQbkhmYfdMBJdiVggTqqTfAA82sOkdOG7wsOMcz5qF3fYfx/irNRM1kgc9HVFIbpQ==", + "dev": true, + "engines": { + "node": ">= 18" + }, + "optionalDependencies": { + "@nomicfoundation/edr-darwin-arm64": "0.3.3", + "@nomicfoundation/edr-darwin-x64": "0.3.3", + "@nomicfoundation/edr-linux-arm64-gnu": "0.3.3", + "@nomicfoundation/edr-linux-arm64-musl": "0.3.3", + "@nomicfoundation/edr-linux-x64-gnu": "0.3.3", + "@nomicfoundation/edr-linux-x64-musl": "0.3.3", + "@nomicfoundation/edr-win32-arm64-msvc": "0.3.3", + "@nomicfoundation/edr-win32-ia32-msvc": "0.3.3", + "@nomicfoundation/edr-win32-x64-msvc": "0.3.3" + } + }, + "node_modules/@nomicfoundation/edr-darwin-arm64": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.3.3.tgz", + "integrity": "sha512-E9VGsUD+1Ga4mn/5ooHsMi8JEfhZbKP6CXN/BhJ8kXbIC10NqTD1RuhCKGRtYq4vqH/3Nfq25Xg8E8RWOF4KBQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/edr-darwin-x64": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.3.3.tgz", + "integrity": "sha512-vkZXZ1ydPg+Ijb2iyqENA+KCkxGTCUWG5itCSliiA0Li2YE7ujDMGhheEpFp1WVlZadviz0bfk1rZXbCqlirpg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/edr-linux-arm64-gnu": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.3.3.tgz", + "integrity": "sha512-gdIg0Yj1qqS9wVuywc5B/+DqKylfUGB6/CQn/shMqwAfsAVAVpchkhy66PR+REEx7fh/GkNctxLlENXPeLzDiA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/edr-linux-arm64-musl": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.3.3.tgz", + "integrity": "sha512-AXZ08MFvhNeBZbOBNmz1SJ/DMrMOE2mHEJtaNnsctlxIunjxfrWww4q+WXB34jbr9iaVYYlPsaWe5sueuw6s3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/edr-linux-x64-gnu": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.3.3.tgz", + "integrity": "sha512-xElOs1U+E6lBLtv1mnJ+E8nr2MxZgKiLo8bZAgBboy9odYtmkDVwhMjtsFKSuZbGxFtsSyGRT4cXw3JAbtUDeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/edr-linux-x64-musl": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.3.3.tgz", + "integrity": "sha512-2Fe6gwm1RAGQ/PfMYiaSba2OrFp8zzYWh+am9lYObOFjV9D+A1zhIzfy0UC74glPks5eV8eY4pBPrVR042m2Nw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/edr-win32-arm64-msvc": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-arm64-msvc/-/edr-win32-arm64-msvc-0.3.3.tgz", + "integrity": "sha512-8NHyxIsFrl0ufSQ/ErqF2lKIa/gz1gaaa1a2vKkDEqvqCUcPhBTYhA5NHgTPhLETFTnCFr0z+YbctFCyjh4qrA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/edr-win32-ia32-msvc": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-ia32-msvc/-/edr-win32-ia32-msvc-0.3.3.tgz", + "integrity": "sha512-0F6hM0kGia4dQVb/kauho9JcP1ozWisY2/She+ISR5ceuhzmAwQJluM0g+0TYDME0LtxBxiMPq/yPiZMQeq31w==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/edr-win32-x64-msvc": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.3.3.tgz", + "integrity": "sha512-d75q1uaMb6z9i+GQZoblbOfFBvlBnWc+5rB13UWRkCOJSnoYwyFWhGJx5GeM59gC7aIblc5VD9qOAhHuvM9N+w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/ethereumjs-common": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.4.tgz", + "integrity": "sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-util": "9.0.4" + } + }, + "node_modules/@nomicfoundation/ethereumjs-rlp": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.4.tgz", + "integrity": "sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==", + "dev": true, + "bin": { + "rlp": "bin/rlp.cjs" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@nomicfoundation/ethereumjs-tx": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.4.tgz", + "integrity": "sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-common": "4.0.4", + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", + "ethereum-cryptography": "0.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "c-kzg": "^2.1.2" + }, + "peerDependenciesMeta": { + "c-kzg": { + "optional": true + } + } + }, + "node_modules/@nomicfoundation/ethereumjs-tx/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dev": true, + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/@nomicfoundation/ethereumjs-util": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.4.tgz", + "integrity": "sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "ethereum-cryptography": "0.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "c-kzg": "^2.1.2" + }, + "peerDependenciesMeta": { + "c-kzg": { + "optional": true + } + } + }, + "node_modules/@nomicfoundation/ethereumjs-util/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dev": true, "dependencies": { - "@openzeppelin/contracts": "^4.9.6" + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz", + "integrity": "sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==", + "dev": true, + "engines": { + "node": ">= 12" }, - "devDependencies": {} + "optionalDependencies": { + "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.1", + "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.1", + "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.1", + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.1.1", + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.1.1", + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.1" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-darwin-arm64": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz", + "integrity": "sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-darwin-x64": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz", + "integrity": "sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-freebsd-x64": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz", + "integrity": "sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz", + "integrity": "sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-musl": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz", + "integrity": "sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-gnu": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz", + "integrity": "sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-musl": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz", + "integrity": "sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-win32-arm64-msvc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz", + "integrity": "sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-win32-ia32-msvc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz", + "integrity": "sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-win32-x64-msvc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz", + "integrity": "sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } }, "node_modules/@openzeppelin/contracts": { "version": "4.9.6", "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.6.tgz", - "integrity": "sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA==" + "integrity": "sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA==", + "dev": true + }, + "node_modules/@scure/base": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.6.tgz", + "integrity": "sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g==", + "dev": true, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", + "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "@noble/hashes": "~1.2.0", + "@noble/secp256k1": "~1.7.0", + "@scure/base": "~1.1.0" + } + }, + "node_modules/@scure/bip39": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", + "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "@noble/hashes": "~1.2.0", + "@scure/base": "~1.1.0" + } + }, + "node_modules/@sentry/core": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", + "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", + "dev": true, + "dependencies": { + "@sentry/hub": "5.30.0", + "@sentry/minimal": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/hub": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", + "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", + "dev": true, + "dependencies": { + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/minimal": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", + "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", + "dev": true, + "dependencies": { + "@sentry/hub": "5.30.0", + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/node": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", + "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", + "dev": true, + "dependencies": { + "@sentry/core": "5.30.0", + "@sentry/hub": "5.30.0", + "@sentry/tracing": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "cookie": "^0.4.1", + "https-proxy-agent": "^5.0.0", + "lru_map": "^0.3.3", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/tracing": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", + "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", + "dev": true, + "dependencies": { + "@sentry/hub": "5.30.0", + "@sentry/minimal": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/types": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", + "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/utils": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", + "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", + "dev": true, + "dependencies": { + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@types/bn.js": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.5.tgz", + "integrity": "sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.12.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.5.tgz", + "integrity": "sha512-BD+BjQ9LS/D8ST9p5uqBxghlN+S42iuNxjsUGjeZobe/ciXzk2qb1B6IXc6AnRLS+yFJRpN2IPEHMzwspfDJNw==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/secp256k1": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.6.tgz", + "integrity": "sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/adm-zip": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", + "dev": true, + "engines": { + "node": ">=0.3.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dev": true, + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base-x": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==", + "dev": true + }, + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, + "node_modules/boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "dev": true, + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/boxen/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/boxen/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/boxen/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/boxen/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "dev": true + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "dev": true, + "dependencies": { + "base-x": "^3.0.2" + } + }, + "node_modules/bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "dev": true, + "dependencies": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "dev": true + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/command-exists": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", + "dev": true + }, + "node_modules/commander": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ethereum-cryptography": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", + "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", + "dev": true, + "dependencies": { + "@noble/hashes": "1.2.0", + "@noble/secp256k1": "1.7.1", + "@scure/bip32": "1.1.5", + "@scure/bip39": "1.1.1" + } + }, + "node_modules/ethereumjs-abi": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", + "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", + "dev": true, + "dependencies": { + "bn.js": "^4.11.8", + "ethereumjs-util": "^6.0.0" + } + }, + "node_modules/ethereumjs-abi/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/ethereumjs-util": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", + "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", + "dev": true, + "dependencies": { + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.3" + } + }, + "node_modules/ethereumjs-util/node_modules/@types/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/ethereumjs-util/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/ethereumjs-util/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dev": true, + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/ethjs-util": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", + "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", + "dev": true, + "dependencies": { + "is-hex-prefixed": "1.0.0", + "strip-hex-prefix": "1.0.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/fp-ts": { + "version": "1.19.3", + "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", + "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==", + "dev": true + }, + "node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/hardhat": { + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.22.2.tgz", + "integrity": "sha512-0xZ7MdCZ5sJem4MrvpQWLR3R3zGDoHw5lsR+pBFimqwagimIOn3bWuZv69KA+veXClwI1s/zpqgwPwiFrd4Dxw==", + "dev": true, + "dependencies": { + "@ethersproject/abi": "^5.1.2", + "@metamask/eth-sig-util": "^4.0.0", + "@nomicfoundation/edr": "^0.3.1", + "@nomicfoundation/ethereumjs-common": "4.0.4", + "@nomicfoundation/ethereumjs-tx": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", + "@nomicfoundation/solidity-analyzer": "^0.1.0", + "@sentry/node": "^5.18.1", + "@types/bn.js": "^5.1.0", + "@types/lru-cache": "^5.1.0", + "adm-zip": "^0.4.16", + "aggregate-error": "^3.0.0", + "ansi-escapes": "^4.3.0", + "boxen": "^5.1.2", + "chalk": "^2.4.2", + "chokidar": "^3.4.0", + "ci-info": "^2.0.0", + "debug": "^4.1.1", + "enquirer": "^2.3.0", + "env-paths": "^2.2.0", + "ethereum-cryptography": "^1.0.3", + "ethereumjs-abi": "^0.6.8", + "find-up": "^2.1.0", + "fp-ts": "1.19.3", + "fs-extra": "^7.0.1", + "glob": "7.2.0", + "immutable": "^4.0.0-rc.12", + "io-ts": "1.10.4", + "keccak": "^3.0.2", + "lodash": "^4.17.11", + "mnemonist": "^0.38.0", + "mocha": "^10.0.0", + "p-map": "^4.0.0", + "raw-body": "^2.4.1", + "resolve": "1.17.0", + "semver": "^6.3.0", + "solc": "0.7.3", + "source-map-support": "^0.5.13", + "stacktrace-parser": "^0.1.10", + "tsort": "0.0.1", + "undici": "^5.14.0", + "uuid": "^8.3.2", + "ws": "^7.4.6" + }, + "bin": { + "hardhat": "internal/cli/bootstrap.js" + }, + "peerDependencies": { + "ts-node": "*", + "typescript": "*" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dev": true, + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immutable": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", + "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", + "dev": true + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/io-ts": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", + "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", + "dev": true, + "dependencies": { + "fp-ts": "^1.0.0" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hex-prefixed": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", + "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==", + "dev": true, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keccak": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", + "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.9" + } + }, + "node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru_map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", + "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==", + "dev": true + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mnemonist": { + "version": "0.38.5", + "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz", + "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==", + "dev": true, + "dependencies": { + "obliterator": "^2.0.0" + } + }, + "node_modules/mocha": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.4.0.tgz", + "integrity": "sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==", + "dev": true, + "dependencies": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "8.1.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/mocha/node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mocha/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/mocha/node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/mocha/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", + "dev": true + }, + "node_modules/node-gyp-build": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.0.tgz", + "integrity": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==", + "dev": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/obliterator": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", + "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==", + "dev": true + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "dependencies": { + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/rlp": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", + "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", + "dev": true, + "dependencies": { + "bn.js": "^5.2.0" + }, + "bin": { + "rlp": "bin/rlp" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", + "dev": true + }, + "node_modules/secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "elliptic": "^6.5.4", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/solc": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", + "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==", + "dev": true, + "dependencies": { + "command-exists": "^1.2.8", + "commander": "3.0.2", + "follow-redirects": "^1.12.1", + "fs-extra": "^0.30.0", + "js-sha3": "0.8.0", + "memorystream": "^0.3.1", + "require-from-string": "^2.0.0", + "semver": "^5.5.0", + "tmp": "0.0.33" + }, + "bin": { + "solcjs": "solcjs" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/solc/node_modules/fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "node_modules/solc/node_modules/jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/solc/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/stacktrace-parser": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", + "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", + "dev": true, + "dependencies": { + "type-fest": "^0.7.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/stacktrace-parser/node_modules/type-fest": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-hex-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", + "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", + "dev": true, + "dependencies": { + "is-hex-prefixed": "1.0.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tsort": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", + "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==", + "dev": true + }, + "node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", + "dev": true + }, + "node_modules/tweetnacl-util": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", + "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==", + "dev": true + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/undici": { + "version": "5.28.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", + "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", + "dev": true, + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/contracts/package.json b/contracts/package.json index 3b92c9ed1e..759d7cc5b6 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -1,15 +1,11 @@ { - "name": "evmos", - "version": "1.0.0", - "description": "", - "main": "index.js", - "directories": { - "doc": "docs" + "name": "evmos-contracts", + "version": "2.0.0", + "description": "A collection of smart contracts used in the development of the Evmos blockchain.", + "devDependencies": { + "@openzeppelin/contracts": "^4.9.6", + "hardhat": "^2.22.2" }, - "dependencies": { - "@openzeppelin/contracts": "^4.9.6" - }, - "devDependencies": {}, "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, @@ -17,7 +13,7 @@ "type": "git", "url": "git+https://github.com/evmos/evmos.git" }, - "author": "", + "author": "Evmos Core Team", "license": "ISC", "bugs": { "url": "https://github.com/evmos/evmos/issues" diff --git a/contracts/solidity/ERC20MinterBurnerDecimals.json b/contracts/solidity/ERC20MinterBurnerDecimals.json new file mode 100644 index 0000000000..1f038c92f2 --- /dev/null +++ b/contracts/solidity/ERC20MinterBurnerDecimals.json @@ -0,0 +1,708 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ERC20MinterBurnerDecimals", + "sourceName": "solidity/ERC20MinterBurnerDecimals.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "uint8", + "name": "decimals_", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "inputs": [], + "name": "BURNER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MINTER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PAUSER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "burnCoins", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "burnFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60806040523480156200001157600080fd5b5060405162003c3638038062003c368339818101604052810190620000379190620005f6565b828281600590816200004a9190620008db565b5080600690816200005c9190620008db565b5050506000600760006101000a81548160ff0219169083151502179055506200009e6000801b620000926200017b60201b60201c565b6200018360201b60201c565b620000df7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6620000d36200017b60201b60201c565b6200018360201b60201c565b620001207f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a620001146200017b60201b60201c565b6200018360201b60201c565b620001617f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a848620001556200017b60201b60201c565b6200018360201b60201c565b62000172816200019960201b60201c565b505050620009c2565b600033905090565b620001958282620001b760201b60201c565b5050565b80600760016101000a81548160ff021916908360ff16021790555050565b620001c98282620001f560201b60201c565b620001f08160016000858152602001908152602001600020620002e660201b90919060201c565b505050565b6200020782826200031e60201b60201c565b620002e257600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620002876200017b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600062000316836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200038860201b60201c565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60006200039c83836200040260201b60201c565b620003f7578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050620003fc565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200048e8262000443565b810181811067ffffffffffffffff82111715620004b057620004af62000454565b5b80604052505050565b6000620004c562000425565b9050620004d3828262000483565b919050565b600067ffffffffffffffff821115620004f657620004f562000454565b5b620005018262000443565b9050602081019050919050565b60005b838110156200052e57808201518184015260208101905062000511565b60008484015250505050565b6000620005516200054b84620004d8565b620004b9565b90508281526020810184848401111562000570576200056f6200043e565b5b6200057d8482856200050e565b509392505050565b600082601f8301126200059d576200059c62000439565b5b8151620005af8482602086016200053a565b91505092915050565b600060ff82169050919050565b620005d081620005b8565b8114620005dc57600080fd5b50565b600081519050620005f081620005c5565b92915050565b6000806000606084860312156200061257620006116200042f565b5b600084015167ffffffffffffffff81111562000633576200063262000434565b5b620006418682870162000585565b935050602084015167ffffffffffffffff81111562000665576200066462000434565b5b620006738682870162000585565b92505060406200068686828701620005df565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620006e357607f821691505b602082108103620006f957620006f86200069b565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620007637fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000724565b6200076f868362000724565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620007bc620007b6620007b08462000787565b62000791565b62000787565b9050919050565b6000819050919050565b620007d8836200079b565b620007f0620007e782620007c3565b84845462000731565b825550505050565b600090565b62000807620007f8565b62000814818484620007cd565b505050565b5b818110156200083c5762000830600082620007fd565b6001810190506200081a565b5050565b601f8211156200088b576200085581620006ff565b620008608462000714565b8101602085101562000870578190505b620008886200087f8562000714565b83018262000819565b50505b505050565b600082821c905092915050565b6000620008b06000198460080262000890565b1980831691505092915050565b6000620008cb83836200089d565b9150826002028217905092915050565b620008e68262000690565b67ffffffffffffffff81111562000902576200090162000454565b5b6200090e8254620006ca565b6200091b82828562000840565b600060209050601f8311600181146200095357600084156200093e578287015190505b6200094a8582620008bd565b865550620009ba565b601f1984166200096386620006ff565b60005b828110156200098d5784890151825560018201915060208501945060208101905062000966565b86831015620009ad5784890151620009a9601f8916826200089d565b8355505b6001600288020188555050505b505050505050565b61326480620009d26000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80635c975abb11610104578063a217fddf116100a2578063d539139311610071578063d53913931461057d578063d547741f1461059b578063dd62ed3e146105b7578063e63ab1e9146105e7576101da565b8063a217fddf146104cf578063a457c2d7146104ed578063a9059cbb1461051d578063ca15c8731461054d576101da565b80638456cb59116100de5780638456cb59146104475780639010d07c1461045157806391d148541461048157806395d89b41146104b1576101da565b80635c975abb146103dd57806370a08231146103fb57806379cc67901461042b576101da565b8063282c51f31161017c578063395093511161014b578063395093511461036b5780633f4ba83a1461039b57806340c10f19146103a557806342966c68146103c1576101da565b8063282c51f3146102f75780632f2ff15d14610315578063313ce5671461033157806336568abe1461034f576101da565b806318160ddd116101b857806318160ddd1461025d5780631cf2c7e21461027b57806323b872dd14610297578063248a9ca3146102c7576101da565b806301ffc9a7146101df57806306fdde031461020f578063095ea7b31461022d575b600080fd5b6101f960048036038101906101f491906120ab565b610605565b60405161020691906120f3565b60405180910390f35b61021761067f565b604051610224919061219e565b60405180910390f35b61024760048036038101906102429190612254565b610711565b60405161025491906120f3565b60405180910390f35b610265610734565b60405161027291906122a3565b60405180910390f35b61029560048036038101906102909190612254565b61073e565b005b6102b160048036038101906102ac91906122be565b6107bc565b6040516102be91906120f3565b60405180910390f35b6102e160048036038101906102dc9190612347565b6107eb565b6040516102ee9190612383565b60405180910390f35b6102ff61080a565b60405161030c9190612383565b60405180910390f35b61032f600480360381019061032a919061239e565b61082e565b005b61033961084f565b60405161034691906123fa565b60405180910390f35b6103696004803603810190610364919061239e565b610866565b005b61038560048036038101906103809190612254565b6108e9565b60405161039291906120f3565b60405180910390f35b6103a3610920565b005b6103bf60048036038101906103ba9190612254565b61099a565b005b6103db60048036038101906103d69190612415565b610a18565b005b6103e5610a2c565b6040516103f291906120f3565b60405180910390f35b61041560048036038101906104109190612442565b610a43565b60405161042291906122a3565b60405180910390f35b61044560048036038101906104409190612254565b610a8c565b005b61044f610aac565b005b61046b6004803603810190610466919061246f565b610b26565b60405161047891906124be565b60405180910390f35b61049b6004803603810190610496919061239e565b610b55565b6040516104a891906120f3565b60405180910390f35b6104b9610bbf565b6040516104c6919061219e565b60405180910390f35b6104d7610c51565b6040516104e49190612383565b60405180910390f35b61050760048036038101906105029190612254565b610c58565b60405161051491906120f3565b60405180910390f35b61053760048036038101906105329190612254565b610ccf565b60405161054491906120f3565b60405180910390f35b61056760048036038101906105629190612347565b610cf2565b60405161057491906122a3565b60405180910390f35b610585610d16565b6040516105929190612383565b60405180910390f35b6105b560048036038101906105b0919061239e565b610d3a565b005b6105d160048036038101906105cc91906124d9565b610d5b565b6040516105de91906122a3565b60405180910390f35b6105ef610de2565b6040516105fc9190612383565b60405180910390f35b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610678575061067782610e06565b5b9050919050565b60606005805461068e90612548565b80601f01602080910402602001604051908101604052809291908181526020018280546106ba90612548565b80156107075780601f106106dc57610100808354040283529160200191610707565b820191906000526020600020905b8154815290600101906020018083116106ea57829003601f168201915b5050505050905090565b60008061071c610e80565b9050610729818585610e88565b600191505092915050565b6000600454905090565b61076f7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84861076a610e80565b610b55565b6107ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a5906125eb565b60405180910390fd5b6107b88282611051565b5050565b6000806107c7610e80565b90506107d4858285611220565b6107df8585856112ac565b60019150509392505050565b6000806000838152602001908152602001600020600101549050919050565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84881565b610837826107eb565b61084081611525565b61084a8383611539565b505050565b6000600760019054906101000a900460ff16905090565b61086e610e80565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146108db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d29061267d565b60405180910390fd5b6108e5828261156d565b5050565b6000806108f4610e80565b90506109158185856109068589610d5b565b61091091906126cc565b610e88565b600191505092915050565b6109517f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61094c610e80565b610b55565b610990576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098790612772565b60405180910390fd5b6109986115a1565b565b6109cb7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66109c6610e80565b610b55565b610a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0190612804565b60405180910390fd5b610a148282611604565b5050565b610a29610a23610e80565b82611051565b50565b6000600760009054906101000a900460ff16905090565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a9e82610a98610e80565b83611220565b610aa88282611051565b5050565b610add7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610ad8610e80565b610b55565b610b1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1390612896565b60405180910390fd5b610b2461175b565b565b6000610b4d82600160008681526020019081526020016000206117be90919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060068054610bce90612548565b80601f0160208091040260200160405190810160405280929190818152602001828054610bfa90612548565b8015610c475780601f10610c1c57610100808354040283529160200191610c47565b820191906000526020600020905b815481529060010190602001808311610c2a57829003601f168201915b5050505050905090565b6000801b81565b600080610c63610e80565b90506000610c718286610d5b565b905083811015610cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cad90612928565b60405180910390fd5b610cc38286868403610e88565b60019250505092915050565b600080610cda610e80565b9050610ce78185856112ac565b600191505092915050565b6000610d0f600160008481526020019081526020016000206117d8565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610d43826107eb565b610d4c81611525565b610d56838361156d565b505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e795750610e78826117ed565b5b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eee906129ba565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5d90612a4c565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161104491906122a3565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b790612ade565b60405180910390fd5b6110cc82600083611857565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611153576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114a90612b70565b60405180910390fd5b818103600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600460008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161120791906122a3565b60405180910390a361121b83600084611867565b505050565b600061122c8484610d5b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146112a65781811015611298576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128f90612bdc565b60405180910390fd5b6112a58484848403610e88565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361131b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131290612c6e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361138a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138190612d00565b60405180910390fd5b611395838383611857565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561141c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141390612d92565b60405180910390fd5b818103600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161150c91906122a3565b60405180910390a361151f848484611867565b50505050565b61153681611531610e80565b61186c565b50565b61154382826118f1565b61156881600160008581526020019081526020016000206119d190919063ffffffff16565b505050565b6115778282611a01565b61159c8160016000858152602001908152602001600020611ae290919063ffffffff16565b505050565b6115a9611b12565b6000600760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6115ed610e80565b6040516115fa91906124be565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611673576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166a90612dfe565b60405180910390fd5b61167f60008383611857565b806004600082825461169191906126cc565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161174391906122a3565b60405180910390a361175760008383611867565b5050565b611763611b5b565b6001600760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586117a7610e80565b6040516117b491906124be565b60405180910390a1565b60006117cd8360000183611ba5565b60001c905092915050565b60006117e682600001611bd0565b9050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611862838383611be1565b505050565b505050565b6118768282610b55565b6118ed5761188381611c39565b6118918360001c6020611c66565b6040516020016118a2929190612ef2565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e4919061219e565b60405180910390fd5b5050565b6118fb8282610b55565b6119cd57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611972610e80565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006119f9836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611ea2565b905092915050565b611a0b8282610b55565b15611ade57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611a83610e80565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000611b0a836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611f12565b905092915050565b611b1a610a2c565b611b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5090612f78565b60405180910390fd5b565b611b63610a2c565b15611ba3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9a90612fe4565b60405180910390fd5b565b6000826000018281548110611bbd57611bbc613004565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b611bec838383612026565b611bf4610a2c565b15611c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2b906130a5565b60405180910390fd5b505050565b6060611c5f8273ffffffffffffffffffffffffffffffffffffffff16601460ff16611c66565b9050919050565b606060006002836002611c7991906130c5565b611c8391906126cc565b67ffffffffffffffff811115611c9c57611c9b613107565b5b6040519080825280601f01601f191660200182016040528015611cce5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611d0657611d05613004565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611d6a57611d69613004565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611daa91906130c5565b611db491906126cc565b90505b6001811115611e54577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611df657611df5613004565b5b1a60f81b828281518110611e0d57611e0c613004565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611e4d90613136565b9050611db7565b5060008414611e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8f906131ab565b60405180910390fd5b8091505092915050565b6000611eae838361202b565b611f07578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611f0c565b600090505b92915050565b6000808360010160008481526020019081526020016000205490506000811461201a576000600182611f4491906131cb565b9050600060018660000180549050611f5c91906131cb565b9050818114611fcb576000866000018281548110611f7d57611f7c613004565b5b9060005260206000200154905080876000018481548110611fa157611fa0613004565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480611fdf57611fde6131ff565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612020565b60009150505b92915050565b505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61208881612053565b811461209357600080fd5b50565b6000813590506120a58161207f565b92915050565b6000602082840312156120c1576120c061204e565b5b60006120cf84828501612096565b91505092915050565b60008115159050919050565b6120ed816120d8565b82525050565b600060208201905061210860008301846120e4565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561214857808201518184015260208101905061212d565b60008484015250505050565b6000601f19601f8301169050919050565b60006121708261210e565b61217a8185612119565b935061218a81856020860161212a565b61219381612154565b840191505092915050565b600060208201905081810360008301526121b88184612165565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006121eb826121c0565b9050919050565b6121fb816121e0565b811461220657600080fd5b50565b600081359050612218816121f2565b92915050565b6000819050919050565b6122318161221e565b811461223c57600080fd5b50565b60008135905061224e81612228565b92915050565b6000806040838503121561226b5761226a61204e565b5b600061227985828601612209565b925050602061228a8582860161223f565b9150509250929050565b61229d8161221e565b82525050565b60006020820190506122b86000830184612294565b92915050565b6000806000606084860312156122d7576122d661204e565b5b60006122e586828701612209565b93505060206122f686828701612209565b92505060406123078682870161223f565b9150509250925092565b6000819050919050565b61232481612311565b811461232f57600080fd5b50565b6000813590506123418161231b565b92915050565b60006020828403121561235d5761235c61204e565b5b600061236b84828501612332565b91505092915050565b61237d81612311565b82525050565b60006020820190506123986000830184612374565b92915050565b600080604083850312156123b5576123b461204e565b5b60006123c385828601612332565b92505060206123d485828601612209565b9150509250929050565b600060ff82169050919050565b6123f4816123de565b82525050565b600060208201905061240f60008301846123eb565b92915050565b60006020828403121561242b5761242a61204e565b5b60006124398482850161223f565b91505092915050565b6000602082840312156124585761245761204e565b5b600061246684828501612209565b91505092915050565b600080604083850312156124865761248561204e565b5b600061249485828601612332565b92505060206124a58582860161223f565b9150509250929050565b6124b8816121e0565b82525050565b60006020820190506124d360008301846124af565b92915050565b600080604083850312156124f0576124ef61204e565b5b60006124fe85828601612209565b925050602061250f85828601612209565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061256057607f821691505b60208210810361257357612572612519565b5b50919050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d7573742060008201527f68617665206275726e657220726f6c6520746f206275726e0000000000000000602082015250565b60006125d5603883612119565b91506125e082612579565b604082019050919050565b60006020820190508181036000830152612604816125c8565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000612667602f83612119565b91506126728261260b565b604082019050919050565b600060208201905081810360008301526126968161265a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006126d78261221e565b91506126e28361221e565b92508282019050808211156126fa576126f961269d565b5b92915050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d7573742060008201527f686176652070617573657220726f6c6520746f20756e70617573650000000000602082015250565b600061275c603b83612119565b915061276782612700565b604082019050919050565b6000602082019050818103600083015261278b8161274f565b9050919050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d7573742060008201527f68617665206d696e74657220726f6c6520746f206d696e740000000000000000602082015250565b60006127ee603883612119565b91506127f982612792565b604082019050919050565b6000602082019050818103600083015261281d816127e1565b9050919050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d7573742060008201527f686176652070617573657220726f6c6520746f20706175736500000000000000602082015250565b6000612880603983612119565b915061288b82612824565b604082019050919050565b600060208201905081810360008301526128af81612873565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612912602583612119565b915061291d826128b6565b604082019050919050565b6000602082019050818103600083015261294181612905565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006129a4602483612119565b91506129af82612948565b604082019050919050565b600060208201905081810360008301526129d381612997565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612a36602283612119565b9150612a41826129da565b604082019050919050565b60006020820190508181036000830152612a6581612a29565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000612ac8602183612119565b9150612ad382612a6c565b604082019050919050565b60006020820190508181036000830152612af781612abb565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000612b5a602283612119565b9150612b6582612afe565b604082019050919050565b60006020820190508181036000830152612b8981612b4d565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612bc6601d83612119565b9150612bd182612b90565b602082019050919050565b60006020820190508181036000830152612bf581612bb9565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612c58602583612119565b9150612c6382612bfc565b604082019050919050565b60006020820190508181036000830152612c8781612c4b565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612cea602383612119565b9150612cf582612c8e565b604082019050919050565b60006020820190508181036000830152612d1981612cdd565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000612d7c602683612119565b9150612d8782612d20565b604082019050919050565b60006020820190508181036000830152612dab81612d6f565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000612de8601f83612119565b9150612df382612db2565b602082019050919050565b60006020820190508181036000830152612e1781612ddb565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000612e5f601783612e1e565b9150612e6a82612e29565b601782019050919050565b6000612e808261210e565b612e8a8185612e1e565b9350612e9a81856020860161212a565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000612edc601183612e1e565b9150612ee782612ea6565b601182019050919050565b6000612efd82612e52565b9150612f098285612e75565b9150612f1482612ecf565b9150612f208284612e75565b91508190509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000612f62601483612119565b9150612f6d82612f2c565b602082019050919050565b60006020820190508181036000830152612f9181612f55565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000612fce601083612119565b9150612fd982612f98565b602082019050919050565b60006020820190508181036000830152612ffd81612fc1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b600061308f602a83612119565b915061309a82613033565b604082019050919050565b600060208201905081810360008301526130be81613082565b9050919050565b60006130d08261221e565b91506130db8361221e565b92508282026130e98161221e565b91508282048414831517613100576130ff61269d565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006131418261221e565b9150600082036131545761315361269d565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000613195602083612119565b91506131a08261315f565b602082019050919050565b600060208201905081810360008301526131c481613188565b9050919050565b60006131d68261221e565b91506131e18361221e565b92508282039050818111156131f9576131f861269d565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212202785b5706c147f68efd244f3a915643f99325dd1a5c078b9d27ff66861b8c21b64736f6c63430008130033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101da5760003560e01c80635c975abb11610104578063a217fddf116100a2578063d539139311610071578063d53913931461057d578063d547741f1461059b578063dd62ed3e146105b7578063e63ab1e9146105e7576101da565b8063a217fddf146104cf578063a457c2d7146104ed578063a9059cbb1461051d578063ca15c8731461054d576101da565b80638456cb59116100de5780638456cb59146104475780639010d07c1461045157806391d148541461048157806395d89b41146104b1576101da565b80635c975abb146103dd57806370a08231146103fb57806379cc67901461042b576101da565b8063282c51f31161017c578063395093511161014b578063395093511461036b5780633f4ba83a1461039b57806340c10f19146103a557806342966c68146103c1576101da565b8063282c51f3146102f75780632f2ff15d14610315578063313ce5671461033157806336568abe1461034f576101da565b806318160ddd116101b857806318160ddd1461025d5780631cf2c7e21461027b57806323b872dd14610297578063248a9ca3146102c7576101da565b806301ffc9a7146101df57806306fdde031461020f578063095ea7b31461022d575b600080fd5b6101f960048036038101906101f491906120ab565b610605565b60405161020691906120f3565b60405180910390f35b61021761067f565b604051610224919061219e565b60405180910390f35b61024760048036038101906102429190612254565b610711565b60405161025491906120f3565b60405180910390f35b610265610734565b60405161027291906122a3565b60405180910390f35b61029560048036038101906102909190612254565b61073e565b005b6102b160048036038101906102ac91906122be565b6107bc565b6040516102be91906120f3565b60405180910390f35b6102e160048036038101906102dc9190612347565b6107eb565b6040516102ee9190612383565b60405180910390f35b6102ff61080a565b60405161030c9190612383565b60405180910390f35b61032f600480360381019061032a919061239e565b61082e565b005b61033961084f565b60405161034691906123fa565b60405180910390f35b6103696004803603810190610364919061239e565b610866565b005b61038560048036038101906103809190612254565b6108e9565b60405161039291906120f3565b60405180910390f35b6103a3610920565b005b6103bf60048036038101906103ba9190612254565b61099a565b005b6103db60048036038101906103d69190612415565b610a18565b005b6103e5610a2c565b6040516103f291906120f3565b60405180910390f35b61041560048036038101906104109190612442565b610a43565b60405161042291906122a3565b60405180910390f35b61044560048036038101906104409190612254565b610a8c565b005b61044f610aac565b005b61046b6004803603810190610466919061246f565b610b26565b60405161047891906124be565b60405180910390f35b61049b6004803603810190610496919061239e565b610b55565b6040516104a891906120f3565b60405180910390f35b6104b9610bbf565b6040516104c6919061219e565b60405180910390f35b6104d7610c51565b6040516104e49190612383565b60405180910390f35b61050760048036038101906105029190612254565b610c58565b60405161051491906120f3565b60405180910390f35b61053760048036038101906105329190612254565b610ccf565b60405161054491906120f3565b60405180910390f35b61056760048036038101906105629190612347565b610cf2565b60405161057491906122a3565b60405180910390f35b610585610d16565b6040516105929190612383565b60405180910390f35b6105b560048036038101906105b0919061239e565b610d3a565b005b6105d160048036038101906105cc91906124d9565b610d5b565b6040516105de91906122a3565b60405180910390f35b6105ef610de2565b6040516105fc9190612383565b60405180910390f35b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610678575061067782610e06565b5b9050919050565b60606005805461068e90612548565b80601f01602080910402602001604051908101604052809291908181526020018280546106ba90612548565b80156107075780601f106106dc57610100808354040283529160200191610707565b820191906000526020600020905b8154815290600101906020018083116106ea57829003601f168201915b5050505050905090565b60008061071c610e80565b9050610729818585610e88565b600191505092915050565b6000600454905090565b61076f7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84861076a610e80565b610b55565b6107ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a5906125eb565b60405180910390fd5b6107b88282611051565b5050565b6000806107c7610e80565b90506107d4858285611220565b6107df8585856112ac565b60019150509392505050565b6000806000838152602001908152602001600020600101549050919050565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84881565b610837826107eb565b61084081611525565b61084a8383611539565b505050565b6000600760019054906101000a900460ff16905090565b61086e610e80565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146108db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d29061267d565b60405180910390fd5b6108e5828261156d565b5050565b6000806108f4610e80565b90506109158185856109068589610d5b565b61091091906126cc565b610e88565b600191505092915050565b6109517f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61094c610e80565b610b55565b610990576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098790612772565b60405180910390fd5b6109986115a1565b565b6109cb7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66109c6610e80565b610b55565b610a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0190612804565b60405180910390fd5b610a148282611604565b5050565b610a29610a23610e80565b82611051565b50565b6000600760009054906101000a900460ff16905090565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a9e82610a98610e80565b83611220565b610aa88282611051565b5050565b610add7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610ad8610e80565b610b55565b610b1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1390612896565b60405180910390fd5b610b2461175b565b565b6000610b4d82600160008681526020019081526020016000206117be90919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060068054610bce90612548565b80601f0160208091040260200160405190810160405280929190818152602001828054610bfa90612548565b8015610c475780601f10610c1c57610100808354040283529160200191610c47565b820191906000526020600020905b815481529060010190602001808311610c2a57829003601f168201915b5050505050905090565b6000801b81565b600080610c63610e80565b90506000610c718286610d5b565b905083811015610cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cad90612928565b60405180910390fd5b610cc38286868403610e88565b60019250505092915050565b600080610cda610e80565b9050610ce78185856112ac565b600191505092915050565b6000610d0f600160008481526020019081526020016000206117d8565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610d43826107eb565b610d4c81611525565b610d56838361156d565b505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e795750610e78826117ed565b5b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eee906129ba565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5d90612a4c565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161104491906122a3565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b790612ade565b60405180910390fd5b6110cc82600083611857565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611153576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114a90612b70565b60405180910390fd5b818103600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600460008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161120791906122a3565b60405180910390a361121b83600084611867565b505050565b600061122c8484610d5b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146112a65781811015611298576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128f90612bdc565b60405180910390fd5b6112a58484848403610e88565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361131b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131290612c6e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361138a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138190612d00565b60405180910390fd5b611395838383611857565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561141c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141390612d92565b60405180910390fd5b818103600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161150c91906122a3565b60405180910390a361151f848484611867565b50505050565b61153681611531610e80565b61186c565b50565b61154382826118f1565b61156881600160008581526020019081526020016000206119d190919063ffffffff16565b505050565b6115778282611a01565b61159c8160016000858152602001908152602001600020611ae290919063ffffffff16565b505050565b6115a9611b12565b6000600760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6115ed610e80565b6040516115fa91906124be565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611673576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166a90612dfe565b60405180910390fd5b61167f60008383611857565b806004600082825461169191906126cc565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161174391906122a3565b60405180910390a361175760008383611867565b5050565b611763611b5b565b6001600760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586117a7610e80565b6040516117b491906124be565b60405180910390a1565b60006117cd8360000183611ba5565b60001c905092915050565b60006117e682600001611bd0565b9050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611862838383611be1565b505050565b505050565b6118768282610b55565b6118ed5761188381611c39565b6118918360001c6020611c66565b6040516020016118a2929190612ef2565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e4919061219e565b60405180910390fd5b5050565b6118fb8282610b55565b6119cd57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611972610e80565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006119f9836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611ea2565b905092915050565b611a0b8282610b55565b15611ade57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611a83610e80565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000611b0a836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611f12565b905092915050565b611b1a610a2c565b611b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5090612f78565b60405180910390fd5b565b611b63610a2c565b15611ba3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9a90612fe4565b60405180910390fd5b565b6000826000018281548110611bbd57611bbc613004565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b611bec838383612026565b611bf4610a2c565b15611c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2b906130a5565b60405180910390fd5b505050565b6060611c5f8273ffffffffffffffffffffffffffffffffffffffff16601460ff16611c66565b9050919050565b606060006002836002611c7991906130c5565b611c8391906126cc565b67ffffffffffffffff811115611c9c57611c9b613107565b5b6040519080825280601f01601f191660200182016040528015611cce5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611d0657611d05613004565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611d6a57611d69613004565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611daa91906130c5565b611db491906126cc565b90505b6001811115611e54577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611df657611df5613004565b5b1a60f81b828281518110611e0d57611e0c613004565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611e4d90613136565b9050611db7565b5060008414611e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8f906131ab565b60405180910390fd5b8091505092915050565b6000611eae838361202b565b611f07578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611f0c565b600090505b92915050565b6000808360010160008481526020019081526020016000205490506000811461201a576000600182611f4491906131cb565b9050600060018660000180549050611f5c91906131cb565b9050818114611fcb576000866000018281548110611f7d57611f7c613004565b5b9060005260206000200154905080876000018481548110611fa157611fa0613004565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480611fdf57611fde6131ff565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612020565b60009150505b92915050565b505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61208881612053565b811461209357600080fd5b50565b6000813590506120a58161207f565b92915050565b6000602082840312156120c1576120c061204e565b5b60006120cf84828501612096565b91505092915050565b60008115159050919050565b6120ed816120d8565b82525050565b600060208201905061210860008301846120e4565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561214857808201518184015260208101905061212d565b60008484015250505050565b6000601f19601f8301169050919050565b60006121708261210e565b61217a8185612119565b935061218a81856020860161212a565b61219381612154565b840191505092915050565b600060208201905081810360008301526121b88184612165565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006121eb826121c0565b9050919050565b6121fb816121e0565b811461220657600080fd5b50565b600081359050612218816121f2565b92915050565b6000819050919050565b6122318161221e565b811461223c57600080fd5b50565b60008135905061224e81612228565b92915050565b6000806040838503121561226b5761226a61204e565b5b600061227985828601612209565b925050602061228a8582860161223f565b9150509250929050565b61229d8161221e565b82525050565b60006020820190506122b86000830184612294565b92915050565b6000806000606084860312156122d7576122d661204e565b5b60006122e586828701612209565b93505060206122f686828701612209565b92505060406123078682870161223f565b9150509250925092565b6000819050919050565b61232481612311565b811461232f57600080fd5b50565b6000813590506123418161231b565b92915050565b60006020828403121561235d5761235c61204e565b5b600061236b84828501612332565b91505092915050565b61237d81612311565b82525050565b60006020820190506123986000830184612374565b92915050565b600080604083850312156123b5576123b461204e565b5b60006123c385828601612332565b92505060206123d485828601612209565b9150509250929050565b600060ff82169050919050565b6123f4816123de565b82525050565b600060208201905061240f60008301846123eb565b92915050565b60006020828403121561242b5761242a61204e565b5b60006124398482850161223f565b91505092915050565b6000602082840312156124585761245761204e565b5b600061246684828501612209565b91505092915050565b600080604083850312156124865761248561204e565b5b600061249485828601612332565b92505060206124a58582860161223f565b9150509250929050565b6124b8816121e0565b82525050565b60006020820190506124d360008301846124af565b92915050565b600080604083850312156124f0576124ef61204e565b5b60006124fe85828601612209565b925050602061250f85828601612209565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061256057607f821691505b60208210810361257357612572612519565b5b50919050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d7573742060008201527f68617665206275726e657220726f6c6520746f206275726e0000000000000000602082015250565b60006125d5603883612119565b91506125e082612579565b604082019050919050565b60006020820190508181036000830152612604816125c8565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000612667602f83612119565b91506126728261260b565b604082019050919050565b600060208201905081810360008301526126968161265a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006126d78261221e565b91506126e28361221e565b92508282019050808211156126fa576126f961269d565b5b92915050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d7573742060008201527f686176652070617573657220726f6c6520746f20756e70617573650000000000602082015250565b600061275c603b83612119565b915061276782612700565b604082019050919050565b6000602082019050818103600083015261278b8161274f565b9050919050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d7573742060008201527f68617665206d696e74657220726f6c6520746f206d696e740000000000000000602082015250565b60006127ee603883612119565b91506127f982612792565b604082019050919050565b6000602082019050818103600083015261281d816127e1565b9050919050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d7573742060008201527f686176652070617573657220726f6c6520746f20706175736500000000000000602082015250565b6000612880603983612119565b915061288b82612824565b604082019050919050565b600060208201905081810360008301526128af81612873565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612912602583612119565b915061291d826128b6565b604082019050919050565b6000602082019050818103600083015261294181612905565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006129a4602483612119565b91506129af82612948565b604082019050919050565b600060208201905081810360008301526129d381612997565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612a36602283612119565b9150612a41826129da565b604082019050919050565b60006020820190508181036000830152612a6581612a29565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000612ac8602183612119565b9150612ad382612a6c565b604082019050919050565b60006020820190508181036000830152612af781612abb565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000612b5a602283612119565b9150612b6582612afe565b604082019050919050565b60006020820190508181036000830152612b8981612b4d565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612bc6601d83612119565b9150612bd182612b90565b602082019050919050565b60006020820190508181036000830152612bf581612bb9565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612c58602583612119565b9150612c6382612bfc565b604082019050919050565b60006020820190508181036000830152612c8781612c4b565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612cea602383612119565b9150612cf582612c8e565b604082019050919050565b60006020820190508181036000830152612d1981612cdd565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000612d7c602683612119565b9150612d8782612d20565b604082019050919050565b60006020820190508181036000830152612dab81612d6f565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000612de8601f83612119565b9150612df382612db2565b602082019050919050565b60006020820190508181036000830152612e1781612ddb565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000612e5f601783612e1e565b9150612e6a82612e29565b601782019050919050565b6000612e808261210e565b612e8a8185612e1e565b9350612e9a81856020860161212a565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000612edc601183612e1e565b9150612ee782612ea6565b601182019050919050565b6000612efd82612e52565b9150612f098285612e75565b9150612f1482612ecf565b9150612f208284612e75565b91508190509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000612f62601483612119565b9150612f6d82612f2c565b602082019050919050565b60006020820190508181036000830152612f9181612f55565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000612fce601083612119565b9150612fd982612f98565b602082019050919050565b60006020820190508181036000830152612ffd81612fc1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b600061308f602a83612119565b915061309a82613033565b604082019050919050565b600060208201905081810360008301526130be81613082565b9050919050565b60006130d08261221e565b91506130db8361221e565b92508282026130e98161221e565b91508282048414831517613100576130ff61269d565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006131418261221e565b9150600082036131545761315361269d565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000613195602083612119565b91506131a08261315f565b602082019050919050565b600060208201905081810360008301526131c481613188565b9050919050565b60006131d68261221e565b91506131e18361221e565b92508282039050818111156131f9576131f861269d565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212202785b5706c147f68efd244f3a915643f99325dd1a5c078b9d27ff66861b8c21b64736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/contracts/ERC20MinterBurnerDecimals.sol b/contracts/solidity/ERC20MinterBurnerDecimals.sol similarity index 91% rename from contracts/ERC20MinterBurnerDecimals.sol rename to contracts/solidity/ERC20MinterBurnerDecimals.sol index f36b9effda..613d1055ad 100644 --- a/contracts/ERC20MinterBurnerDecimals.sol +++ b/contracts/solidity/ERC20MinterBurnerDecimals.sol @@ -3,11 +3,11 @@ pragma solidity ^0.8.0; -import "./@openzeppelin/contracts/token/ERC20/ERC20.sol"; -import "./@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol"; -import "./@openzeppelin/contracts/token/ERC20/extensions/ERC20Pausable.sol"; -import "./@openzeppelin/contracts/access/AccessControlEnumerable.sol"; -import "./@openzeppelin/contracts/utils/Context.sol"; +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol"; +import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Pausable.sol"; +import "@openzeppelin/contracts/access/AccessControlEnumerable.sol"; +import "@openzeppelin/contracts/utils/Context.sol"; /** * @dev {ERC20} token, including: diff --git a/contracts/utils/utils.go b/contracts/utils/utils.go new file mode 100644 index 0000000000..027a799214 --- /dev/null +++ b/contracts/utils/utils.go @@ -0,0 +1,92 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package utils + +import ( + "encoding/json" + "errors" + "os" + "path/filepath" + "runtime" + + evmtypes "github.com/evmos/evmos/v18/x/evm/types" +) + +// LoadContractFromJSONFile is a helper method to convert the embedded bytes from a JSON file, +// that contain compilation information from Hardhat, into a CompiledContract instance. +func LoadContractFromJSONFile(jsonFile string) (evmtypes.CompiledContract, error) { + compiledBytes, err := loadCompiledBytesFromJSONFile(jsonFile) + if err != nil { + return evmtypes.CompiledContract{}, err + } + + return ConvertHardhatBytesToCompiledContract(compiledBytes) +} + +// LegacyLoadContractFromJSONFile is a helper method to convert the embedded bytes from a JSON file, +// that contain compilation information, into a CompiledContract instance. +// +// NOTE: This is used for contracts that were compiled manually and not using the current Hardhat setup. +func LegacyLoadContractFromJSONFile(jsonFile string) (evmtypes.CompiledContract, error) { + compiledBytes, err := loadCompiledBytesFromJSONFile(jsonFile) + if err != nil { + return evmtypes.CompiledContract{}, err + } + + var contract evmtypes.CompiledContract + err = json.Unmarshal(compiledBytes, &contract) + if err != nil { + return evmtypes.CompiledContract{}, err + } + + if len(contract.Bin) == 0 { + return evmtypes.CompiledContract{}, errors.New("got empty binary data for contract") + } + + return contract, nil +} + +// loadCompiledBytesFromJSONFile is a helper method to load the embedded bytes from a JSON file. +// It takes in a file path that's relative to where this function is called, +// similar to how go:embed would be used. +func loadCompiledBytesFromJSONFile(jsonFile string) ([]byte, error) { + // We need to get the directory of the caller to load + // the JSON file relative to where the function is called. + // + // The caller of interest is 2 levels up the stack as this + // method is being called in the functions above. + _, caller, _, ok := runtime.Caller(2) + if !ok { + return nil, errors.New("could not get the caller") + } + + callerDir := filepath.Dir(caller) + compiledBytes, err := os.ReadFile(filepath.Join(callerDir, jsonFile)) + if err != nil { + return nil, err + } + + return compiledBytes, nil +} + +// ConvertHardhatBytesToCompiledContract is a helper method to convert the embedded bytes from a +// Hardhat JSON file into an instance of the CompiledContract type. +func ConvertHardhatBytesToCompiledContract(bz []byte) (evmtypes.CompiledContract, error) { + var hardhatContract evmtypes.HardhatCompiledContract + err := json.Unmarshal(bz, &hardhatContract) + if err != nil { + return evmtypes.CompiledContract{}, err + } + + compiledContract, err := hardhatContract.ToCompiledContract() + if err != nil { + return evmtypes.CompiledContract{}, err + } + + if len(compiledContract.Bin) == 0 { + return evmtypes.CompiledContract{}, errors.New("got empty binary data for contract") + } + + return compiledContract, nil +} diff --git a/precompiles/bank/integration_test.go b/precompiles/bank/integration_test.go index d4cca5f5cc..4e591c4cea 100644 --- a/precompiles/bank/integration_test.go +++ b/precompiles/bank/integration_test.go @@ -118,9 +118,11 @@ func TestIntegrationSuite(t *testing.T) { var _ = Describe("Bank Extension -", func() { var ( bankCallerContractAddr common.Address - err error - sender keyring.Key - amount *big.Int + bankCallerContract evmtypes.CompiledContract + + err error + sender keyring.Key + amount *big.Int // contractData is a helper struct to hold the addresses and ABIs for the // different contract instances that are subject to testing here. @@ -135,11 +137,14 @@ var _ = Describe("Bank Extension -", func() { sender = is.keyring.GetKey(0) amount = big.NewInt(1e18) + bankCallerContract, err = testdata.LoadBankCallerContract() + Expect(err).ToNot(HaveOccurred(), "failed to load BankCaller contract") + bankCallerContractAddr, err = is.factory.DeployContract( sender.Priv, evmtypes.EvmTxArgs{}, // NOTE: passing empty struct to use default values factory.ContractDeploymentData{ - Contract: testdata.BankCallerContract, + Contract: bankCallerContract, }, ) Expect(err).ToNot(HaveOccurred(), "failed to deploy ERC20 minter burner contract") @@ -149,7 +154,7 @@ var _ = Describe("Bank Extension -", func() { precompileAddr: is.precompile.Address(), precompileABI: is.precompile.ABI, contractAddr: bankCallerContractAddr, - contractABI: testdata.BankCallerContract.ABI, + contractABI: bankCallerContract.ABI, } passCheck = testutil.LogCheckArgs{}.WithExpPass(true) diff --git a/precompiles/bank/testdata/BankCaller.json b/precompiles/bank/testdata/BankCaller.json index c79c503d15..c5f7ecbd2a 100644 --- a/precompiles/bank/testdata/BankCaller.json +++ b/precompiles/bank/testdata/BankCaller.json @@ -1,4 +1,86 @@ { - "abi": "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"callBalances\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"contractAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"struct Balance[]\",\"name\":\"balances\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"erc20Address\",\"type\":\"address\"}],\"name\":\"callSupplyOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"callTotalSupply\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"contractAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"struct Balance[]\",\"name\":\"totalSupply\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - "bin": "608060405234801561001057600080fd5b50610706806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806389129c6814610046578063acab2f9414610076578063bba60ca014610094575b600080fd5b610060600480360381019061005b91906102c2565b6100c4565b60405161006d91906103f5565b60405180910390f35b61007e61014e565b60405161008b91906103f5565b60405180910390f35b6100ae60048036038101906100a991906102c2565b6101cb565b6040516100bb9190610426565b60405180910390f35b606061080473ffffffffffffffffffffffffffffffffffffffff166327e235e3836040518263ffffffff1660e01b81526004016101019190610450565b600060405180830381865afa15801561011e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610147919061065a565b9050919050565b606061080473ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401600060405180830381865afa15801561019d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906101c6919061065a565b905090565b600061080473ffffffffffffffffffffffffffffffffffffffff166362400e4c836040518263ffffffff1660e01b81526004016102089190610450565b602060405180830381865afa158015610225573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061024991906106a3565b9050919050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061028f82610264565b9050919050565b61029f81610284565b81146102aa57600080fd5b50565b6000813590506102bc81610296565b92915050565b6000602082840312156102d8576102d761025a565b5b60006102e6848285016102ad565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61032481610284565b82525050565b6000819050919050565b61033d8161032a565b82525050565b604082016000820151610359600085018261031b565b50602082015161036c6020850182610334565b50505050565b600061037e8383610343565b60408301905092915050565b6000602082019050919050565b60006103a2826102ef565b6103ac81856102fa565b93506103b78361030b565b8060005b838110156103e85781516103cf8882610372565b97506103da8361038a565b9250506001810190506103bb565b5085935050505092915050565b6000602082019050818103600083015261040f8184610397565b905092915050565b6104208161032a565b82525050565b600060208201905061043b6000830184610417565b92915050565b61044a81610284565b82525050565b60006020820190506104656000830184610441565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6104b982610470565b810181811067ffffffffffffffff821117156104d8576104d7610481565b5b80604052505050565b60006104eb610250565b90506104f782826104b0565b919050565b600067ffffffffffffffff82111561051757610516610481565b5b602082029050602081019050919050565b600080fd5b600080fd5b60008151905061054181610296565b92915050565b6105508161032a565b811461055b57600080fd5b50565b60008151905061056d81610547565b92915050565b6000604082840312156105895761058861052d565b5b61059360406104e1565b905060006105a384828501610532565b60008301525060206105b78482850161055e565b60208301525092915050565b60006105d66105d1846104fc565b6104e1565b905080838252602082019050604084028301858111156105f9576105f8610528565b5b835b81811015610622578061060e8882610573565b8452602084019350506040810190506105fb565b5050509392505050565b600082601f8301126106415761064061046b565b5b81516106518482602086016105c3565b91505092915050565b6000602082840312156106705761066f61025a565b5b600082015167ffffffffffffffff81111561068e5761068d61025f565b5b61069a8482850161062c565b91505092915050565b6000602082840312156106b9576106b861025a565b5b60006106c78482850161055e565b9150509291505056fea2646970667358221220a0f107155c946386c70f3283b090acd0d538ebc4bb744577bb1c9f4d35201d3664736f6c63430008120033" -} \ No newline at end of file + "_format": "hh-sol-artifact-1", + "contractName": "BankCaller", + "sourceName": "solidity/precompiles/bank/testdata/BankCaller.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "callBalances", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "contractAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Balance[]", + "name": "balances", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "erc20Address", + "type": "address" + } + ], + "name": "callSupplyOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "callTotalSupply", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "contractAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Balance[]", + "name": "totalSupply", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b50610706806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806389129c6814610046578063acab2f9414610076578063bba60ca014610094575b600080fd5b610060600480360381019061005b91906102c2565b6100c4565b60405161006d91906103f5565b60405180910390f35b61007e61014e565b60405161008b91906103f5565b60405180910390f35b6100ae60048036038101906100a991906102c2565b6101cb565b6040516100bb9190610426565b60405180910390f35b606061080473ffffffffffffffffffffffffffffffffffffffff166327e235e3836040518263ffffffff1660e01b81526004016101019190610450565b600060405180830381865afa15801561011e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610147919061065a565b9050919050565b606061080473ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401600060405180830381865afa15801561019d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906101c6919061065a565b905090565b600061080473ffffffffffffffffffffffffffffffffffffffff166362400e4c836040518263ffffffff1660e01b81526004016102089190610450565b602060405180830381865afa158015610225573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061024991906106a3565b9050919050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061028f82610264565b9050919050565b61029f81610284565b81146102aa57600080fd5b50565b6000813590506102bc81610296565b92915050565b6000602082840312156102d8576102d761025a565b5b60006102e6848285016102ad565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61032481610284565b82525050565b6000819050919050565b61033d8161032a565b82525050565b604082016000820151610359600085018261031b565b50602082015161036c6020850182610334565b50505050565b600061037e8383610343565b60408301905092915050565b6000602082019050919050565b60006103a2826102ef565b6103ac81856102fa565b93506103b78361030b565b8060005b838110156103e85781516103cf8882610372565b97506103da8361038a565b9250506001810190506103bb565b5085935050505092915050565b6000602082019050818103600083015261040f8184610397565b905092915050565b6104208161032a565b82525050565b600060208201905061043b6000830184610417565b92915050565b61044a81610284565b82525050565b60006020820190506104656000830184610441565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6104b982610470565b810181811067ffffffffffffffff821117156104d8576104d7610481565b5b80604052505050565b60006104eb610250565b90506104f782826104b0565b919050565b600067ffffffffffffffff82111561051757610516610481565b5b602082029050602081019050919050565b600080fd5b600080fd5b60008151905061054181610296565b92915050565b6105508161032a565b811461055b57600080fd5b50565b60008151905061056d81610547565b92915050565b6000604082840312156105895761058861052d565b5b61059360406104e1565b905060006105a384828501610532565b60008301525060206105b78482850161055e565b60208301525092915050565b60006105d66105d1846104fc565b6104e1565b905080838252602082019050604084028301858111156105f9576105f8610528565b5b835b81811015610622578061060e8882610573565b8452602084019350506040810190506105fb565b5050509392505050565b600082601f8301126106415761064061046b565b5b81516106518482602086016105c3565b91505092915050565b6000602082840312156106705761066f61025a565b5b600082015167ffffffffffffffff81111561068e5761068d61025f565b5b61069a8482850161062c565b91505092915050565b6000602082840312156106b9576106b861025a565b5b60006106c78482850161055e565b9150509291505056fea264697066735822122069dcf2adfa16b7c11a609b544775058a5caffe57f2d073bb7f7ee7533aea460964736f6c63430008130033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806389129c6814610046578063acab2f9414610076578063bba60ca014610094575b600080fd5b610060600480360381019061005b91906102c2565b6100c4565b60405161006d91906103f5565b60405180910390f35b61007e61014e565b60405161008b91906103f5565b60405180910390f35b6100ae60048036038101906100a991906102c2565b6101cb565b6040516100bb9190610426565b60405180910390f35b606061080473ffffffffffffffffffffffffffffffffffffffff166327e235e3836040518263ffffffff1660e01b81526004016101019190610450565b600060405180830381865afa15801561011e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610147919061065a565b9050919050565b606061080473ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401600060405180830381865afa15801561019d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906101c6919061065a565b905090565b600061080473ffffffffffffffffffffffffffffffffffffffff166362400e4c836040518263ffffffff1660e01b81526004016102089190610450565b602060405180830381865afa158015610225573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061024991906106a3565b9050919050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061028f82610264565b9050919050565b61029f81610284565b81146102aa57600080fd5b50565b6000813590506102bc81610296565b92915050565b6000602082840312156102d8576102d761025a565b5b60006102e6848285016102ad565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61032481610284565b82525050565b6000819050919050565b61033d8161032a565b82525050565b604082016000820151610359600085018261031b565b50602082015161036c6020850182610334565b50505050565b600061037e8383610343565b60408301905092915050565b6000602082019050919050565b60006103a2826102ef565b6103ac81856102fa565b93506103b78361030b565b8060005b838110156103e85781516103cf8882610372565b97506103da8361038a565b9250506001810190506103bb565b5085935050505092915050565b6000602082019050818103600083015261040f8184610397565b905092915050565b6104208161032a565b82525050565b600060208201905061043b6000830184610417565b92915050565b61044a81610284565b82525050565b60006020820190506104656000830184610441565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6104b982610470565b810181811067ffffffffffffffff821117156104d8576104d7610481565b5b80604052505050565b60006104eb610250565b90506104f782826104b0565b919050565b600067ffffffffffffffff82111561051757610516610481565b5b602082029050602081019050919050565b600080fd5b600080fd5b60008151905061054181610296565b92915050565b6105508161032a565b811461055b57600080fd5b50565b60008151905061056d81610547565b92915050565b6000604082840312156105895761058861052d565b5b61059360406104e1565b905060006105a384828501610532565b60008301525060206105b78482850161055e565b60208301525092915050565b60006105d66105d1846104fc565b6104e1565b905080838252602082019050604084028301858111156105f9576105f8610528565b5b835b81811015610622578061060e8882610573565b8452602084019350506040810190506105fb565b5050509392505050565b600082601f8301126106415761064061046b565b5b81516106518482602086016105c3565b91505092915050565b6000602082840312156106705761066f61025a565b5b600082015167ffffffffffffffff81111561068e5761068d61025f565b5b61069a8482850161062c565b91505092915050565b6000602082840312156106b9576106b861025a565b5b60006106c78482850161055e565b9150509291505056fea264697066735822122069dcf2adfa16b7c11a609b544775058a5caffe57f2d073bb7f7ee7533aea460964736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/precompiles/bank/testdata/bank.go b/precompiles/bank/testdata/bank.go index c42a4bf046..794664d6c7 100644 --- a/precompiles/bank/testdata/bank.go +++ b/precompiles/bank/testdata/bank.go @@ -4,27 +4,10 @@ package testdata import ( - _ "embed" // embed compiled smart contract - "encoding/json" - + contractutils "github.com/evmos/evmos/v18/contracts/utils" evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) -var ( - //go:embed BankCaller.json - BankCallerJSON []byte - - // BankCallerContract is the compiled contract of BankCaller.sol - BankCallerContract evmtypes.CompiledContract -) - -func init() { - err := json.Unmarshal(BankCallerJSON, &BankCallerContract) - if err != nil { - panic(err) - } - - if len(BankCallerContract.Bin) == 0 { - panic("failed to load BankCaller smart contract") - } +func LoadBankCallerContract() (evmtypes.CompiledContract, error) { + return contractutils.LoadContractFromJSONFile("BankCaller.json") } diff --git a/precompiles/distribution/integration_test.go b/precompiles/distribution/integration_test.go index 653de81ade..f1daaa7f22 100644 --- a/precompiles/distribution/integration_test.go +++ b/precompiles/distribution/integration_test.go @@ -6,8 +6,6 @@ import ( "fmt" "math/big" - "github.com/evmos/evmos/v18/utils" - "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/query" @@ -21,7 +19,7 @@ import ( "github.com/evmos/evmos/v18/precompiles/testutil/contracts" evmosutil "github.com/evmos/evmos/v18/testutil" testutiltx "github.com/evmos/evmos/v18/testutil/tx" - + "github.com/evmos/evmos/v18/utils" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" //nolint:revive // dot imports are fine for Ginkgo @@ -43,8 +41,6 @@ var ( // defaultLogCheck instantiates a log check arguments struct with the precompile ABI events populated. defaultLogCheck testutil.LogCheckArgs - // differentOriginCheck defines the arguments to check if the precompile returns different origin error - differentOriginCheck testutil.LogCheckArgs // passCheck defines the arguments to check if the precompile returns no error passCheck testutil.LogCheckArgs // outOfGasCheck defines the arguments to check if the precompile returns out of gas error @@ -65,7 +61,6 @@ var _ = Describe("Calling distribution precompile from EOA", func() { defaultLogCheck = testutil.LogCheckArgs{ ABIEvents: s.precompile.ABI.Events, } - differentOriginCheck = defaultLogCheck.WithErrContains(cmn.ErrDifferentOrigin, s.address, differentAddr) passCheck = defaultLogCheck.WithExpPass(true) outOfGasCheck = defaultLogCheck.WithErrContains(vm.ErrOutOfGas.Error()) }) @@ -545,8 +540,6 @@ var _ = Describe("Calling distribution precompile from another contract", func() // contractAddr is the address of the smart contract that will be deployed contractAddr common.Address - // err is a basic error type - err error // execRevertedCheck defines the default log checking arguments which includes the // standard revert message. @@ -555,7 +548,11 @@ var _ = Describe("Calling distribution precompile from another contract", func() BeforeEach(func() { s.SetupTest() - contractAddr, err = s.DeployContract(contracts.DistributionCallerContract) + + distributionCallerContract, err := contracts.LoadDistributionCallerContract() + Expect(err).To(BeNil(), "error while loading the smart contract: %v", err) + + contractAddr, err = s.DeployContract(distributionCallerContract) Expect(err).To(BeNil(), "error while deploying the smart contract: %v", err) // NextBlock the smart contract @@ -569,7 +566,7 @@ var _ = Describe("Calling distribution precompile from another contract", func() // populate default call args defaultCallArgs = contracts.CallArgs{ ContractAddr: contractAddr, - ContractABI: contracts.DistributionCallerContract.ABI, + ContractABI: distributionCallerContract.ABI, PrivKey: s.privKey, } diff --git a/precompiles/erc20/integration_test.go b/precompiles/erc20/integration_test.go index d5ec3970b0..a861f5a539 100644 --- a/precompiles/erc20/integration_test.go +++ b/precompiles/erc20/integration_test.go @@ -89,6 +89,9 @@ var _ = Describe("ERC20 Extension -", func() { // contract instances that are subject to testing here. contractsData ContractsData + allowanceCallerContract evmtypes.CompiledContract + erc20MinterV5Contract evmtypes.CompiledContract + execRevertedCheck testutil.LogCheckArgs failCheck testutil.LogCheckArgs passCheck testutil.LogCheckArgs @@ -97,12 +100,19 @@ var _ = Describe("ERC20 Extension -", func() { BeforeEach(func() { is.SetupTest() + var err error + allowanceCallerContract, err = testdata.LoadERC20AllowanceCaller() + Expect(err).ToNot(HaveOccurred(), "failed to load ERC20 allowance caller contract") + + erc20MinterV5Contract, err = testdata.LoadERC20MinterV5Contract() + Expect(err).ToNot(HaveOccurred(), "failed to load ERC20 minter contract") + sender := is.keyring.GetKey(0) contractAddr, err := is.factory.DeployContract( sender.Priv, evmtypes.EvmTxArgs{}, // NOTE: passing empty struct to use default values factory.ContractDeploymentData{ - Contract: testdata.ERC20AllowanceCallerContract, + Contract: allowanceCallerContract, // NOTE: we're passing the precompile address to the constructor because that initiates the contract // to make calls to the correct ERC20 precompile. ConstructorArgs: []interface{}{is.precompile.Address()}, @@ -126,7 +136,7 @@ var _ = Describe("ERC20 Extension -", func() { sender.Priv, evmtypes.EvmTxArgs{}, // NOTE: passing empty struct to use default values factory.ContractDeploymentData{ - Contract: testdata.ERC20MinterV5Contract, + Contract: erc20MinterV5Contract, ConstructorArgs: []interface{}{ "Xmpl", "Xmpl", }, @@ -138,7 +148,7 @@ var _ = Describe("ERC20 Extension -", func() { sender.Priv, evmtypes.EvmTxArgs{}, // NOTE: passing empty struct to use default values factory.ContractDeploymentData{ - Contract: testdata.ERC20AllowanceCallerContract, + Contract: allowanceCallerContract, ConstructorArgs: []interface{}{ ERC20MinterV5Addr, }, @@ -156,7 +166,7 @@ var _ = Describe("ERC20 Extension -", func() { }, contractCall: { Address: contractAddr, - ABI: testdata.ERC20AllowanceCallerContract.ABI, + ABI: allowanceCallerContract.ABI, }, erc20Call: { Address: erc20MinterBurnerAddr, @@ -164,11 +174,11 @@ var _ = Describe("ERC20 Extension -", func() { }, erc20V5Call: { Address: ERC20MinterV5Addr, - ABI: testdata.ERC20MinterV5Contract.ABI, + ABI: erc20MinterV5Contract.ABI, }, erc20V5CallerCall: { Address: erc20MinterV5CallerAddr, - ABI: testdata.ERC20AllowanceCallerContract.ABI, + ABI: allowanceCallerContract.ABI, }, }, } @@ -1385,11 +1395,14 @@ var _ = Describe("ERC20 Extension -", func() { Context("for a token without registered metadata", func() { BeforeEach(func() { // Deploy ERC20NoMetadata contract for this test + erc20NoMetadataContract, err := testdata.LoadERC20NoMetadataContract() + Expect(err).ToNot(HaveOccurred(), "failed to load contract") + erc20NoMetadataAddr, err := is.factory.DeployContract( is.keyring.GetPrivKey(0), evmtypes.EvmTxArgs{}, factory.ContractDeploymentData{ - Contract: testdata.ERC20NoMetadataContract, + Contract: erc20NoMetadataContract, }, ) Expect(err).ToNot(HaveOccurred(), "failed to deploy contract") @@ -1478,7 +1491,7 @@ var _ = Describe("ERC20 Extension -", func() { is.keyring.GetPrivKey(0), evmtypes.EvmTxArgs{}, factory.ContractDeploymentData{ - Contract: testdata.ERC20AllowanceCallerContract, + Contract: allowanceCallerContract, ConstructorArgs: []interface{}{ is.precompile.Address(), }, @@ -1488,7 +1501,7 @@ var _ = Describe("ERC20 Extension -", func() { contractsData.contractData[contractCall] = ContractData{ Address: callerAddr, - ABI: testdata.ERC20AllowanceCallerContract.ABI, + ABI: allowanceCallerContract.ABI, } }) @@ -1554,7 +1567,7 @@ var _ = Describe("ERC20 Extension -", func() { is.keyring.GetPrivKey(0), evmtypes.EvmTxArgs{}, // NOTE: passing empty struct to use default values factory.ContractDeploymentData{ - Contract: testdata.ERC20AllowanceCallerContract, + Contract: allowanceCallerContract, ConstructorArgs: []interface{}{is.precompile.Address()}, }, ) @@ -1562,7 +1575,7 @@ var _ = Describe("ERC20 Extension -", func() { contractsData.contractData[erc20CallerCall] = ContractData{ Address: contractAddr, - ABI: testdata.ERC20AllowanceCallerContract.ABI, + ABI: allowanceCallerContract.ABI, } grantee = is.keyring.GetKey(0) @@ -2124,7 +2137,8 @@ var _ = Describe("ERC20 Extension -", func() { var _ = Describe("ERC20 Extension migration Flows -", func() { When("migrating an existing ERC20 token", func() { var ( - contractData ContractsData + contractData ContractsData + erc20MinterV5Contract evmtypes.CompiledContract tokenDenom = "xmpl" tokenName = "Xmpl" @@ -2136,6 +2150,10 @@ var _ = Describe("ERC20 Extension migration Flows -", func() { BeforeEach(func() { is.SetupTest() + var err error + erc20MinterV5Contract, err = testdata.LoadERC20MinterV5Contract() + Expect(err).ToNot(HaveOccurred(), "failed to load ERC20 minter contract") + contractOwner := is.keyring.GetKey(0) // Deploy an ERC20 contract @@ -2143,7 +2161,7 @@ var _ = Describe("ERC20 Extension migration Flows -", func() { contractOwner.Priv, evmtypes.EvmTxArgs{}, // NOTE: passing empty struct to use default values factory.ContractDeploymentData{ - Contract: testdata.ERC20MinterV5Contract, + Contract: erc20MinterV5Contract, ConstructorArgs: []interface{}{ tokenName, tokenSymbol, }, @@ -2158,7 +2176,7 @@ var _ = Describe("ERC20 Extension migration Flows -", func() { contractData: map[CallType]ContractData{ erc20V5Call: { Address: erc20Addr, - ABI: testdata.ERC20MinterV5Contract.ABI, + ABI: erc20MinterV5Contract.ABI, }, }, } diff --git a/precompiles/erc20/testdata/ERC20AllowanceCaller.json b/precompiles/erc20/testdata/ERC20AllowanceCaller.json index 703e81fc2b..ea8b233e68 100644 --- a/precompiles/erc20/testdata/ERC20AllowanceCaller.json +++ b/precompiles/erc20/testdata/ERC20AllowanceCaller.json @@ -1,4 +1,255 @@ { - "abi": "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"token\",\"outputs\":[{\"internalType\":\"contract IERC20MetadataAllowance\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - "bin": "60806040523480156200001157600080fd5b50604051620011a3380380620011a38339818101604052810190620000379190620000e8565b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506200011a565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000b08262000083565b9050919050565b620000c281620000a3565b8114620000ce57600080fd5b50565b600081519050620000e281620000b7565b92915050565b6000602082840312156200010157620001006200007e565b5b60006200011184828501620000d1565b91505092915050565b611079806200012a6000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c806370a082311161007157806370a08231146101a357806395d89b41146101d3578063a457c2d7146101f1578063a9059cbb14610221578063dd62ed3e14610251578063fc0c546a14610281576100b4565b806306fdde03146100b9578063095ea7b3146100d757806318160ddd1461010757806323b872dd14610125578063313ce567146101555780633950935114610173575b600080fd5b6100c161029f565b6040516100ce9190610a52565b60405180910390f35b6100f160048036038101906100ec9190610b1c565b61033a565b6040516100fe9190610b77565b60405180910390f35b61010f6103e3565b60405161011c9190610ba1565b60405180910390f35b61013f600480360381019061013a9190610bbc565b61047a565b60405161014c9190610b77565b60405180910390f35b61015d610526565b60405161016a9190610c2b565b60405180910390f35b61018d60048036038101906101889190610b1c565b6105bd565b60405161019a9190610b77565b60405180910390f35b6101bd60048036038101906101b89190610c46565b610666565b6040516101ca9190610ba1565b60405180910390f35b6101db61070a565b6040516101e89190610a52565b60405180910390f35b61020b60048036038101906102069190610b1c565b6107a5565b6040516102189190610b77565b60405180910390f35b61023b60048036038101906102369190610b1c565b61084e565b6040516102489190610b77565b60405180910390f35b61026b60048036038101906102669190610c73565b6108f7565b6040516102789190610ba1565b60405180910390f35b61028961099e565b6040516102969190610d12565b60405180910390f35b606060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa15801561030c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906103359190610e53565b905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b384846040518363ffffffff1660e01b8152600401610398929190610eab565b6020604051808303816000875af11580156103b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103db9190610f00565b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610451573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104759190610f42565b905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8585856040518463ffffffff1660e01b81526004016104da93929190610f6f565b6020604051808303816000875af11580156104f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051d9190610f00565b90509392505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610594573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b89190610fd2565b905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633950935184846040518363ffffffff1660e01b815260040161061b929190610eab565b6020604051808303816000875af115801561063a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065e9190610f00565b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b81526004016106c29190610fff565b602060405180830381865afa1580156106df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107039190610f42565b9050919050565b606060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610777573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906107a09190610e53565b905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a457c2d784846040518363ffffffff1660e01b8152600401610803929190610eab565b6020604051808303816000875af1158015610822573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108469190610f00565b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b81526004016108ac929190610eab565b6020604051808303816000875af11580156108cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ef9190610f00565b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84846040518363ffffffff1660e01b815260040161095592919061101a565b602060405180830381865afa158015610972573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109969190610f42565b905092915050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600081519050919050565b600082825260208201905092915050565b60005b838110156109fc5780820151818401526020810190506109e1565b60008484015250505050565b6000601f19601f8301169050919050565b6000610a24826109c2565b610a2e81856109cd565b9350610a3e8185602086016109de565b610a4781610a08565b840191505092915050565b60006020820190508181036000830152610a6c8184610a19565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610ab382610a88565b9050919050565b610ac381610aa8565b8114610ace57600080fd5b50565b600081359050610ae081610aba565b92915050565b6000819050919050565b610af981610ae6565b8114610b0457600080fd5b50565b600081359050610b1681610af0565b92915050565b60008060408385031215610b3357610b32610a7e565b5b6000610b4185828601610ad1565b9250506020610b5285828601610b07565b9150509250929050565b60008115159050919050565b610b7181610b5c565b82525050565b6000602082019050610b8c6000830184610b68565b92915050565b610b9b81610ae6565b82525050565b6000602082019050610bb66000830184610b92565b92915050565b600080600060608486031215610bd557610bd4610a7e565b5b6000610be386828701610ad1565b9350506020610bf486828701610ad1565b9250506040610c0586828701610b07565b9150509250925092565b600060ff82169050919050565b610c2581610c0f565b82525050565b6000602082019050610c406000830184610c1c565b92915050565b600060208284031215610c5c57610c5b610a7e565b5b6000610c6a84828501610ad1565b91505092915050565b60008060408385031215610c8a57610c89610a7e565b5b6000610c9885828601610ad1565b9250506020610ca985828601610ad1565b9150509250929050565b6000819050919050565b6000610cd8610cd3610cce84610a88565b610cb3565b610a88565b9050919050565b6000610cea82610cbd565b9050919050565b6000610cfc82610cdf565b9050919050565b610d0c81610cf1565b82525050565b6000602082019050610d276000830184610d03565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610d6f82610a08565b810181811067ffffffffffffffff82111715610d8e57610d8d610d37565b5b80604052505050565b6000610da1610a74565b9050610dad8282610d66565b919050565b600067ffffffffffffffff821115610dcd57610dcc610d37565b5b610dd682610a08565b9050602081019050919050565b6000610df6610df184610db2565b610d97565b905082815260208101848484011115610e1257610e11610d32565b5b610e1d8482856109de565b509392505050565b600082601f830112610e3a57610e39610d2d565b5b8151610e4a848260208601610de3565b91505092915050565b600060208284031215610e6957610e68610a7e565b5b600082015167ffffffffffffffff811115610e8757610e86610a83565b5b610e9384828501610e25565b91505092915050565b610ea581610aa8565b82525050565b6000604082019050610ec06000830185610e9c565b610ecd6020830184610b92565b9392505050565b610edd81610b5c565b8114610ee857600080fd5b50565b600081519050610efa81610ed4565b92915050565b600060208284031215610f1657610f15610a7e565b5b6000610f2484828501610eeb565b91505092915050565b600081519050610f3c81610af0565b92915050565b600060208284031215610f5857610f57610a7e565b5b6000610f6684828501610f2d565b91505092915050565b6000606082019050610f846000830186610e9c565b610f916020830185610e9c565b610f9e6040830184610b92565b949350505050565b610faf81610c0f565b8114610fba57600080fd5b50565b600081519050610fcc81610fa6565b92915050565b600060208284031215610fe857610fe7610a7e565b5b6000610ff684828501610fbd565b91505092915050565b60006020820190506110146000830184610e9c565b92915050565b600060408201905061102f6000830185610e9c565b61103c6020830184610e9c565b939250505056fea2646970667358221220f998a58baeb32d12e0493a901d09f46f22213365917ed42c9681912499d9958864736f6c63430008120033" + "_format": "hh-sol-artifact-1", + "contractName": "ERC20AllowanceCaller", + "sourceName": "solidity/precompiles/erc20/testdata/ERC20AllowanceCaller.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "tokenAddress", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "token", + "outputs": [ + { + "internalType": "contract IERC20MetadataAllowance", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60806040523480156200001157600080fd5b50604051620011a3380380620011a38339818101604052810190620000379190620000e8565b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506200011a565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000b08262000083565b9050919050565b620000c281620000a3565b8114620000ce57600080fd5b50565b600081519050620000e281620000b7565b92915050565b6000602082840312156200010157620001006200007e565b5b60006200011184828501620000d1565b91505092915050565b611079806200012a6000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c806370a082311161007157806370a08231146101a357806395d89b41146101d3578063a457c2d7146101f1578063a9059cbb14610221578063dd62ed3e14610251578063fc0c546a14610281576100b4565b806306fdde03146100b9578063095ea7b3146100d757806318160ddd1461010757806323b872dd14610125578063313ce567146101555780633950935114610173575b600080fd5b6100c161029f565b6040516100ce9190610a52565b60405180910390f35b6100f160048036038101906100ec9190610b1c565b61033a565b6040516100fe9190610b77565b60405180910390f35b61010f6103e3565b60405161011c9190610ba1565b60405180910390f35b61013f600480360381019061013a9190610bbc565b61047a565b60405161014c9190610b77565b60405180910390f35b61015d610526565b60405161016a9190610c2b565b60405180910390f35b61018d60048036038101906101889190610b1c565b6105bd565b60405161019a9190610b77565b60405180910390f35b6101bd60048036038101906101b89190610c46565b610666565b6040516101ca9190610ba1565b60405180910390f35b6101db61070a565b6040516101e89190610a52565b60405180910390f35b61020b60048036038101906102069190610b1c565b6107a5565b6040516102189190610b77565b60405180910390f35b61023b60048036038101906102369190610b1c565b61084e565b6040516102489190610b77565b60405180910390f35b61026b60048036038101906102669190610c73565b6108f7565b6040516102789190610ba1565b60405180910390f35b61028961099e565b6040516102969190610d12565b60405180910390f35b606060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa15801561030c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906103359190610e53565b905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b384846040518363ffffffff1660e01b8152600401610398929190610eab565b6020604051808303816000875af11580156103b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103db9190610f00565b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610451573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104759190610f42565b905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8585856040518463ffffffff1660e01b81526004016104da93929190610f6f565b6020604051808303816000875af11580156104f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051d9190610f00565b90509392505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610594573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b89190610fd2565b905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633950935184846040518363ffffffff1660e01b815260040161061b929190610eab565b6020604051808303816000875af115801561063a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065e9190610f00565b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b81526004016106c29190610fff565b602060405180830381865afa1580156106df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107039190610f42565b9050919050565b606060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610777573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906107a09190610e53565b905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a457c2d784846040518363ffffffff1660e01b8152600401610803929190610eab565b6020604051808303816000875af1158015610822573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108469190610f00565b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b81526004016108ac929190610eab565b6020604051808303816000875af11580156108cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ef9190610f00565b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84846040518363ffffffff1660e01b815260040161095592919061101a565b602060405180830381865afa158015610972573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109969190610f42565b905092915050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600081519050919050565b600082825260208201905092915050565b60005b838110156109fc5780820151818401526020810190506109e1565b60008484015250505050565b6000601f19601f8301169050919050565b6000610a24826109c2565b610a2e81856109cd565b9350610a3e8185602086016109de565b610a4781610a08565b840191505092915050565b60006020820190508181036000830152610a6c8184610a19565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610ab382610a88565b9050919050565b610ac381610aa8565b8114610ace57600080fd5b50565b600081359050610ae081610aba565b92915050565b6000819050919050565b610af981610ae6565b8114610b0457600080fd5b50565b600081359050610b1681610af0565b92915050565b60008060408385031215610b3357610b32610a7e565b5b6000610b4185828601610ad1565b9250506020610b5285828601610b07565b9150509250929050565b60008115159050919050565b610b7181610b5c565b82525050565b6000602082019050610b8c6000830184610b68565b92915050565b610b9b81610ae6565b82525050565b6000602082019050610bb66000830184610b92565b92915050565b600080600060608486031215610bd557610bd4610a7e565b5b6000610be386828701610ad1565b9350506020610bf486828701610ad1565b9250506040610c0586828701610b07565b9150509250925092565b600060ff82169050919050565b610c2581610c0f565b82525050565b6000602082019050610c406000830184610c1c565b92915050565b600060208284031215610c5c57610c5b610a7e565b5b6000610c6a84828501610ad1565b91505092915050565b60008060408385031215610c8a57610c89610a7e565b5b6000610c9885828601610ad1565b9250506020610ca985828601610ad1565b9150509250929050565b6000819050919050565b6000610cd8610cd3610cce84610a88565b610cb3565b610a88565b9050919050565b6000610cea82610cbd565b9050919050565b6000610cfc82610cdf565b9050919050565b610d0c81610cf1565b82525050565b6000602082019050610d276000830184610d03565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610d6f82610a08565b810181811067ffffffffffffffff82111715610d8e57610d8d610d37565b5b80604052505050565b6000610da1610a74565b9050610dad8282610d66565b919050565b600067ffffffffffffffff821115610dcd57610dcc610d37565b5b610dd682610a08565b9050602081019050919050565b6000610df6610df184610db2565b610d97565b905082815260208101848484011115610e1257610e11610d32565b5b610e1d8482856109de565b509392505050565b600082601f830112610e3a57610e39610d2d565b5b8151610e4a848260208601610de3565b91505092915050565b600060208284031215610e6957610e68610a7e565b5b600082015167ffffffffffffffff811115610e8757610e86610a83565b5b610e9384828501610e25565b91505092915050565b610ea581610aa8565b82525050565b6000604082019050610ec06000830185610e9c565b610ecd6020830184610b92565b9392505050565b610edd81610b5c565b8114610ee857600080fd5b50565b600081519050610efa81610ed4565b92915050565b600060208284031215610f1657610f15610a7e565b5b6000610f2484828501610eeb565b91505092915050565b600081519050610f3c81610af0565b92915050565b600060208284031215610f5857610f57610a7e565b5b6000610f6684828501610f2d565b91505092915050565b6000606082019050610f846000830186610e9c565b610f916020830185610e9c565b610f9e6040830184610b92565b949350505050565b610faf81610c0f565b8114610fba57600080fd5b50565b600081519050610fcc81610fa6565b92915050565b600060208284031215610fe857610fe7610a7e565b5b6000610ff684828501610fbd565b91505092915050565b60006020820190506110146000830184610e9c565b92915050565b600060408201905061102f6000830185610e9c565b61103c6020830184610e9c565b939250505056fea2646970667358221220637880a86b5674a1029aca57cde1625d2301a03c9bb21329d064a801f8d8916664736f6c63430008130033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806370a082311161007157806370a08231146101a357806395d89b41146101d3578063a457c2d7146101f1578063a9059cbb14610221578063dd62ed3e14610251578063fc0c546a14610281576100b4565b806306fdde03146100b9578063095ea7b3146100d757806318160ddd1461010757806323b872dd14610125578063313ce567146101555780633950935114610173575b600080fd5b6100c161029f565b6040516100ce9190610a52565b60405180910390f35b6100f160048036038101906100ec9190610b1c565b61033a565b6040516100fe9190610b77565b60405180910390f35b61010f6103e3565b60405161011c9190610ba1565b60405180910390f35b61013f600480360381019061013a9190610bbc565b61047a565b60405161014c9190610b77565b60405180910390f35b61015d610526565b60405161016a9190610c2b565b60405180910390f35b61018d60048036038101906101889190610b1c565b6105bd565b60405161019a9190610b77565b60405180910390f35b6101bd60048036038101906101b89190610c46565b610666565b6040516101ca9190610ba1565b60405180910390f35b6101db61070a565b6040516101e89190610a52565b60405180910390f35b61020b60048036038101906102069190610b1c565b6107a5565b6040516102189190610b77565b60405180910390f35b61023b60048036038101906102369190610b1c565b61084e565b6040516102489190610b77565b60405180910390f35b61026b60048036038101906102669190610c73565b6108f7565b6040516102789190610ba1565b60405180910390f35b61028961099e565b6040516102969190610d12565b60405180910390f35b606060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa15801561030c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906103359190610e53565b905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b384846040518363ffffffff1660e01b8152600401610398929190610eab565b6020604051808303816000875af11580156103b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103db9190610f00565b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610451573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104759190610f42565b905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8585856040518463ffffffff1660e01b81526004016104da93929190610f6f565b6020604051808303816000875af11580156104f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051d9190610f00565b90509392505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610594573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b89190610fd2565b905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633950935184846040518363ffffffff1660e01b815260040161061b929190610eab565b6020604051808303816000875af115801561063a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065e9190610f00565b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b81526004016106c29190610fff565b602060405180830381865afa1580156106df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107039190610f42565b9050919050565b606060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610777573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906107a09190610e53565b905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a457c2d784846040518363ffffffff1660e01b8152600401610803929190610eab565b6020604051808303816000875af1158015610822573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108469190610f00565b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b81526004016108ac929190610eab565b6020604051808303816000875af11580156108cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ef9190610f00565b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84846040518363ffffffff1660e01b815260040161095592919061101a565b602060405180830381865afa158015610972573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109969190610f42565b905092915050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600081519050919050565b600082825260208201905092915050565b60005b838110156109fc5780820151818401526020810190506109e1565b60008484015250505050565b6000601f19601f8301169050919050565b6000610a24826109c2565b610a2e81856109cd565b9350610a3e8185602086016109de565b610a4781610a08565b840191505092915050565b60006020820190508181036000830152610a6c8184610a19565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610ab382610a88565b9050919050565b610ac381610aa8565b8114610ace57600080fd5b50565b600081359050610ae081610aba565b92915050565b6000819050919050565b610af981610ae6565b8114610b0457600080fd5b50565b600081359050610b1681610af0565b92915050565b60008060408385031215610b3357610b32610a7e565b5b6000610b4185828601610ad1565b9250506020610b5285828601610b07565b9150509250929050565b60008115159050919050565b610b7181610b5c565b82525050565b6000602082019050610b8c6000830184610b68565b92915050565b610b9b81610ae6565b82525050565b6000602082019050610bb66000830184610b92565b92915050565b600080600060608486031215610bd557610bd4610a7e565b5b6000610be386828701610ad1565b9350506020610bf486828701610ad1565b9250506040610c0586828701610b07565b9150509250925092565b600060ff82169050919050565b610c2581610c0f565b82525050565b6000602082019050610c406000830184610c1c565b92915050565b600060208284031215610c5c57610c5b610a7e565b5b6000610c6a84828501610ad1565b91505092915050565b60008060408385031215610c8a57610c89610a7e565b5b6000610c9885828601610ad1565b9250506020610ca985828601610ad1565b9150509250929050565b6000819050919050565b6000610cd8610cd3610cce84610a88565b610cb3565b610a88565b9050919050565b6000610cea82610cbd565b9050919050565b6000610cfc82610cdf565b9050919050565b610d0c81610cf1565b82525050565b6000602082019050610d276000830184610d03565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610d6f82610a08565b810181811067ffffffffffffffff82111715610d8e57610d8d610d37565b5b80604052505050565b6000610da1610a74565b9050610dad8282610d66565b919050565b600067ffffffffffffffff821115610dcd57610dcc610d37565b5b610dd682610a08565b9050602081019050919050565b6000610df6610df184610db2565b610d97565b905082815260208101848484011115610e1257610e11610d32565b5b610e1d8482856109de565b509392505050565b600082601f830112610e3a57610e39610d2d565b5b8151610e4a848260208601610de3565b91505092915050565b600060208284031215610e6957610e68610a7e565b5b600082015167ffffffffffffffff811115610e8757610e86610a83565b5b610e9384828501610e25565b91505092915050565b610ea581610aa8565b82525050565b6000604082019050610ec06000830185610e9c565b610ecd6020830184610b92565b9392505050565b610edd81610b5c565b8114610ee857600080fd5b50565b600081519050610efa81610ed4565b92915050565b600060208284031215610f1657610f15610a7e565b5b6000610f2484828501610eeb565b91505092915050565b600081519050610f3c81610af0565b92915050565b600060208284031215610f5857610f57610a7e565b5b6000610f6684828501610f2d565b91505092915050565b6000606082019050610f846000830186610e9c565b610f916020830185610e9c565b610f9e6040830184610b92565b949350505050565b610faf81610c0f565b8114610fba57600080fd5b50565b600081519050610fcc81610fa6565b92915050565b600060208284031215610fe857610fe7610a7e565b5b6000610ff684828501610fbd565b91505092915050565b60006020820190506110146000830184610e9c565b92915050565b600060408201905061102f6000830185610e9c565b61103c6020830184610e9c565b939250505056fea2646970667358221220637880a86b5674a1029aca57cde1625d2301a03c9bb21329d064a801f8d8916664736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} } diff --git a/precompiles/erc20/testdata/ERC20NoMetadata.json b/precompiles/erc20/testdata/ERC20NoMetadata.json index a9e90e7c2a..471711703c 100644 --- a/precompiles/erc20/testdata/ERC20NoMetadata.json +++ b/precompiles/erc20/testdata/ERC20NoMetadata.json @@ -1,5 +1,247 @@ { - "abi": "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - "bin": "608060405234801561000f575f80fd5b50610ef58061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610086575f3560e01c806370a082311161005957806370a0823114610138578063a457c2d714610168578063a9059cbb14610198578063dd62ed3e146101c857610086565b8063095ea7b31461008a57806318160ddd146100ba57806323b872dd146100d85780633950935114610108575b5f80fd5b6100a4600480360381019061009f9190610941565b6101f8565b6040516100b19190610999565b60405180910390f35b6100c261021a565b6040516100cf91906109c1565b60405180910390f35b6100f260048036038101906100ed91906109da565b610223565b6040516100ff9190610999565b60405180910390f35b610122600480360381019061011d9190610941565b610251565b60405161012f9190610999565b60405180910390f35b610152600480360381019061014d9190610a2a565b610287565b60405161015f91906109c1565b60405180910390f35b610182600480360381019061017d9190610941565b6102cc565b60405161018f9190610999565b60405180910390f35b6101b260048036038101906101ad9190610941565b610341565b6040516101bf9190610999565b60405180910390f35b6101e260048036038101906101dd9190610a55565b610363565b6040516101ef91906109c1565b60405180910390f35b5f806102026103e5565b905061020f8185856103ec565b600191505092915050565b5f600254905090565b5f8061022d6103e5565b905061023a8582856105af565b61024585858561063a565b60019150509392505050565b5f8061025b6103e5565b905061027c81858561026d8589610363565b6102779190610ac0565b6103ec565b600191505092915050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f806102d66103e5565b90505f6102e38286610363565b905083811015610328576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161031f90610b73565b60405180910390fd5b61033582868684036103ec565b60019250505092915050565b5f8061034b6103e5565b905061035881858561063a565b600191505092915050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361045a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161045190610c01565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036104c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104bf90610c8f565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516105a291906109c1565b60405180910390a3505050565b5f6105ba8484610363565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146106345781811015610626576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061d90610cf7565b60405180910390fd5b61063384848484036103ec565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036106a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069f90610d85565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610716576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070d90610e13565b60405180910390fd5b6107218383836108a6565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156107a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079b90610ea1565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161088d91906109c1565b60405180910390a36108a08484846108ab565b50505050565b505050565b505050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6108dd826108b4565b9050919050565b6108ed816108d3565b81146108f7575f80fd5b50565b5f81359050610908816108e4565b92915050565b5f819050919050565b6109208161090e565b811461092a575f80fd5b50565b5f8135905061093b81610917565b92915050565b5f8060408385031215610957576109566108b0565b5b5f610964858286016108fa565b92505060206109758582860161092d565b9150509250929050565b5f8115159050919050565b6109938161097f565b82525050565b5f6020820190506109ac5f83018461098a565b92915050565b6109bb8161090e565b82525050565b5f6020820190506109d45f8301846109b2565b92915050565b5f805f606084860312156109f1576109f06108b0565b5b5f6109fe868287016108fa565b9350506020610a0f868287016108fa565b9250506040610a208682870161092d565b9150509250925092565b5f60208284031215610a3f57610a3e6108b0565b5b5f610a4c848285016108fa565b91505092915050565b5f8060408385031215610a6b57610a6a6108b0565b5b5f610a78858286016108fa565b9250506020610a89858286016108fa565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610aca8261090e565b9150610ad58361090e565b9250828201905080821115610aed57610aec610a93565b5b92915050565b5f82825260208201905092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f610b5d602583610af3565b9150610b6882610b03565b604082019050919050565b5f6020820190508181035f830152610b8a81610b51565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f610beb602483610af3565b9150610bf682610b91565b604082019050919050565b5f6020820190508181035f830152610c1881610bdf565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f610c79602283610af3565b9150610c8482610c1f565b604082019050919050565b5f6020820190508181035f830152610ca681610c6d565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f610ce1601d83610af3565b9150610cec82610cad565b602082019050919050565b5f6020820190508181035f830152610d0e81610cd5565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f610d6f602583610af3565b9150610d7a82610d15565b604082019050919050565b5f6020820190508181035f830152610d9c81610d63565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f610dfd602383610af3565b9150610e0882610da3565b604082019050919050565b5f6020820190508181035f830152610e2a81610df1565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f610e8b602683610af3565b9150610e9682610e31565b604082019050919050565b5f6020820190508181035f830152610eb881610e7f565b905091905056fea2646970667358221220d423aba14b83b76e2100eddaab80ec25e68f9885be44dc7127bac142c612b6e364736f6c63430008140033", - "contractName": "ERC20NoMetadata" + "_format": "hh-sol-artifact-1", + "contractName": "ERC20NoMetadata", + "sourceName": "solidity/precompiles/erc20/testdata/ERC20NoMetadata.sol", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b50610f4f806100206000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c806370a082311161005b57806370a082311461013b578063a457c2d71461016b578063a9059cbb1461019b578063dd62ed3e146101cb57610088565b8063095ea7b31461008d57806318160ddd146100bd57806323b872dd146100db578063395093511461010b575b600080fd5b6100a760048036038101906100a2919061096d565b6101fb565b6040516100b491906109c8565b60405180910390f35b6100c561021e565b6040516100d291906109f2565b60405180910390f35b6100f560048036038101906100f09190610a0d565b610228565b60405161010291906109c8565b60405180910390f35b6101256004803603810190610120919061096d565b610257565b60405161013291906109c8565b60405180910390f35b61015560048036038101906101509190610a60565b61028e565b60405161016291906109f2565b60405180910390f35b6101856004803603810190610180919061096d565b6102d6565b60405161019291906109c8565b60405180910390f35b6101b560048036038101906101b0919061096d565b61034d565b6040516101c291906109c8565b60405180910390f35b6101e560048036038101906101e09190610a8d565b610370565b6040516101f291906109f2565b60405180910390f35b6000806102066103f7565b90506102138185856103ff565b600191505092915050565b6000600254905090565b6000806102336103f7565b90506102408582856105c8565b61024b858585610654565b60019150509392505050565b6000806102626103f7565b90506102838185856102748589610370565b61027e9190610afc565b6103ff565b600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000806102e16103f7565b905060006102ef8286610370565b905083811015610334576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161032b90610bb3565b60405180910390fd5b61034182868684036103ff565b60019250505092915050565b6000806103586103f7565b9050610365818585610654565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361046e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046590610c45565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036104dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d490610cd7565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516105bb91906109f2565b60405180910390a3505050565b60006105d48484610370565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461064e5781811015610640576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063790610d43565b60405180910390fd5b61064d84848484036103ff565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036106c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ba90610dd5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610732576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072990610e67565b60405180910390fd5b61073d8383836108ca565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156107c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ba90610ef9565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516108b191906109f2565b60405180910390a36108c48484846108cf565b50505050565b505050565b505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610904826108d9565b9050919050565b610914816108f9565b811461091f57600080fd5b50565b6000813590506109318161090b565b92915050565b6000819050919050565b61094a81610937565b811461095557600080fd5b50565b60008135905061096781610941565b92915050565b60008060408385031215610984576109836108d4565b5b600061099285828601610922565b92505060206109a385828601610958565b9150509250929050565b60008115159050919050565b6109c2816109ad565b82525050565b60006020820190506109dd60008301846109b9565b92915050565b6109ec81610937565b82525050565b6000602082019050610a0760008301846109e3565b92915050565b600080600060608486031215610a2657610a256108d4565b5b6000610a3486828701610922565b9350506020610a4586828701610922565b9250506040610a5686828701610958565b9150509250925092565b600060208284031215610a7657610a756108d4565b5b6000610a8484828501610922565b91505092915050565b60008060408385031215610aa457610aa36108d4565b5b6000610ab285828601610922565b9250506020610ac385828601610922565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610b0782610937565b9150610b1283610937565b9250828201905080821115610b2a57610b29610acd565b5b92915050565b600082825260208201905092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000610b9d602583610b30565b9150610ba882610b41565b604082019050919050565b60006020820190508181036000830152610bcc81610b90565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000610c2f602483610b30565b9150610c3a82610bd3565b604082019050919050565b60006020820190508181036000830152610c5e81610c22565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000610cc1602283610b30565b9150610ccc82610c65565b604082019050919050565b60006020820190508181036000830152610cf081610cb4565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000610d2d601d83610b30565b9150610d3882610cf7565b602082019050919050565b60006020820190508181036000830152610d5c81610d20565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000610dbf602583610b30565b9150610dca82610d63565b604082019050919050565b60006020820190508181036000830152610dee81610db2565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000610e51602383610b30565b9150610e5c82610df5565b604082019050919050565b60006020820190508181036000830152610e8081610e44565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000610ee3602683610b30565b9150610eee82610e87565b604082019050919050565b60006020820190508181036000830152610f1281610ed6565b905091905056fea26469706673582212201af30586fb0c9726887634543373816a162692c9d54b10d1f17ff104d3a1df5964736f6c63430008130033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100885760003560e01c806370a082311161005b57806370a082311461013b578063a457c2d71461016b578063a9059cbb1461019b578063dd62ed3e146101cb57610088565b8063095ea7b31461008d57806318160ddd146100bd57806323b872dd146100db578063395093511461010b575b600080fd5b6100a760048036038101906100a2919061096d565b6101fb565b6040516100b491906109c8565b60405180910390f35b6100c561021e565b6040516100d291906109f2565b60405180910390f35b6100f560048036038101906100f09190610a0d565b610228565b60405161010291906109c8565b60405180910390f35b6101256004803603810190610120919061096d565b610257565b60405161013291906109c8565b60405180910390f35b61015560048036038101906101509190610a60565b61028e565b60405161016291906109f2565b60405180910390f35b6101856004803603810190610180919061096d565b6102d6565b60405161019291906109c8565b60405180910390f35b6101b560048036038101906101b0919061096d565b61034d565b6040516101c291906109c8565b60405180910390f35b6101e560048036038101906101e09190610a8d565b610370565b6040516101f291906109f2565b60405180910390f35b6000806102066103f7565b90506102138185856103ff565b600191505092915050565b6000600254905090565b6000806102336103f7565b90506102408582856105c8565b61024b858585610654565b60019150509392505050565b6000806102626103f7565b90506102838185856102748589610370565b61027e9190610afc565b6103ff565b600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000806102e16103f7565b905060006102ef8286610370565b905083811015610334576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161032b90610bb3565b60405180910390fd5b61034182868684036103ff565b60019250505092915050565b6000806103586103f7565b9050610365818585610654565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361046e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046590610c45565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036104dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d490610cd7565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516105bb91906109f2565b60405180910390a3505050565b60006105d48484610370565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461064e5781811015610640576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063790610d43565b60405180910390fd5b61064d84848484036103ff565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036106c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ba90610dd5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610732576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072990610e67565b60405180910390fd5b61073d8383836108ca565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156107c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ba90610ef9565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516108b191906109f2565b60405180910390a36108c48484846108cf565b50505050565b505050565b505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610904826108d9565b9050919050565b610914816108f9565b811461091f57600080fd5b50565b6000813590506109318161090b565b92915050565b6000819050919050565b61094a81610937565b811461095557600080fd5b50565b60008135905061096781610941565b92915050565b60008060408385031215610984576109836108d4565b5b600061099285828601610922565b92505060206109a385828601610958565b9150509250929050565b60008115159050919050565b6109c2816109ad565b82525050565b60006020820190506109dd60008301846109b9565b92915050565b6109ec81610937565b82525050565b6000602082019050610a0760008301846109e3565b92915050565b600080600060608486031215610a2657610a256108d4565b5b6000610a3486828701610922565b9350506020610a4586828701610922565b9250506040610a5686828701610958565b9150509250925092565b600060208284031215610a7657610a756108d4565b5b6000610a8484828501610922565b91505092915050565b60008060408385031215610aa457610aa36108d4565b5b6000610ab285828601610922565b9250506020610ac385828601610922565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610b0782610937565b9150610b1283610937565b9250828201905080821115610b2a57610b29610acd565b5b92915050565b600082825260208201905092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000610b9d602583610b30565b9150610ba882610b41565b604082019050919050565b60006020820190508181036000830152610bcc81610b90565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000610c2f602483610b30565b9150610c3a82610bd3565b604082019050919050565b60006020820190508181036000830152610c5e81610c22565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000610cc1602283610b30565b9150610ccc82610c65565b604082019050919050565b60006020820190508181036000830152610cf081610cb4565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000610d2d601d83610b30565b9150610d3882610cf7565b602082019050919050565b60006020820190508181036000830152610d5c81610d20565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000610dbf602583610b30565b9150610dca82610d63565b604082019050919050565b60006020820190508181036000830152610dee81610db2565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000610e51602383610b30565b9150610e5c82610df5565b604082019050919050565b60006020820190508181036000830152610e8081610e44565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000610ee3602683610b30565b9150610eee82610e87565b604082019050919050565b60006020820190508181036000830152610f1281610ed6565b905091905056fea26469706673582212201af30586fb0c9726887634543373816a162692c9d54b10d1f17ff104d3a1df5964736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} } diff --git a/precompiles/erc20/testdata/ERC20NoMetadata.sol b/precompiles/erc20/testdata/ERC20NoMetadata.sol index 2c2be27f3e..b412bad4bb 100644 --- a/precompiles/erc20/testdata/ERC20NoMetadata.sol +++ b/precompiles/erc20/testdata/ERC20NoMetadata.sol @@ -3,8 +3,8 @@ pragma solidity ^0.8.0; -import "./@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import "./@openzeppelin/contracts/utils/Context.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/utils/Context.sol"; /** * @dev Implementation of the {IERC20} interface. @@ -34,7 +34,7 @@ import "./@openzeppelin/contracts/utils/Context.sol"; * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ -contract ERC20 is Context, IERC20 { +contract ERC20NoMetadata is Context, IERC20 { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; @@ -59,7 +59,9 @@ contract ERC20 is Context, IERC20 { /** * @dev See {IERC20-balanceOf}. */ - function balanceOf(address account) public view virtual override returns (uint256) { + function balanceOf( + address account + ) public view virtual override returns (uint256) { return _balances[account]; } @@ -71,7 +73,10 @@ contract ERC20 is Context, IERC20 { * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ - function transfer(address to, uint256 amount) public virtual override returns (bool) { + function transfer( + address to, + uint256 amount + ) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; @@ -80,7 +85,10 @@ contract ERC20 is Context, IERC20 { /** * @dev See {IERC20-allowance}. */ - function allowance(address owner, address spender) public view virtual override returns (uint256) { + function allowance( + address owner, + address spender + ) public view virtual override returns (uint256) { return _allowances[owner][spender]; } @@ -94,7 +102,10 @@ contract ERC20 is Context, IERC20 { * * - `spender` cannot be the zero address. */ - function approve(address spender, uint256 amount) public virtual override returns (bool) { + function approve( + address spender, + uint256 amount + ) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; @@ -116,7 +127,11 @@ contract ERC20 is Context, IERC20 { * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ - function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) { + function transferFrom( + address from, + address to, + uint256 amount + ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); @@ -135,7 +150,10 @@ contract ERC20 is Context, IERC20 { * * - `spender` cannot be the zero address. */ - function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { + function increaseAllowance( + address spender, + uint256 addedValue + ) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; @@ -155,10 +173,16 @@ contract ERC20 is Context, IERC20 { * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ - function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); - require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); + require( + currentAllowance >= subtractedValue, + "ERC20: decreased allowance below zero" + ); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } @@ -180,18 +204,25 @@ contract ERC20 is Context, IERC20 { * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ - function _transfer(address from, address to, uint256 amount) internal virtual { + function _transfer( + address from, + address to, + uint256 amount + ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; - require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); + require( + fromBalance >= amount, + "ERC20: transfer amount exceeds balance" + ); unchecked { _balances[from] = fromBalance - amount; - // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by - // decrementing then incrementing. + // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by + // decrementing then incrementing. _balances[to] += amount; } @@ -216,7 +247,7 @@ contract ERC20 is Context, IERC20 { _totalSupply += amount; unchecked { - // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. + // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); @@ -244,7 +275,7 @@ contract ERC20 is Context, IERC20 { require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; - // Overflow not possible: amount <= accountBalance <= totalSupply. + // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } @@ -266,7 +297,11 @@ contract ERC20 is Context, IERC20 { * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ - function _approve(address owner, address spender, uint256 amount) internal virtual { + function _approve( + address owner, + address spender, + uint256 amount + ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); @@ -282,10 +317,17 @@ contract ERC20 is Context, IERC20 { * * Might emit an {Approval} event. */ - function _spendAllowance(address owner, address spender, uint256 amount) internal virtual { + function _spendAllowance( + address owner, + address spender, + uint256 amount + ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { - require(currentAllowance >= amount, "ERC20: insufficient allowance"); + require( + currentAllowance >= amount, + "ERC20: insufficient allowance" + ); unchecked { _approve(owner, spender, currentAllowance - amount); } @@ -306,7 +348,11 @@ contract ERC20 is Context, IERC20 { * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ - function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {} + function _beforeTokenTransfer( + address from, + address to, + uint256 amount + ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes @@ -322,5 +368,9 @@ contract ERC20 is Context, IERC20 { * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ - function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {} + function _afterTokenTransfer( + address from, + address to, + uint256 amount + ) internal virtual {} } diff --git a/precompiles/erc20/testdata/erc20_allowance_caller.go b/precompiles/erc20/testdata/erc20_allowance_caller.go index 4700e691f5..a0281283cc 100644 --- a/precompiles/erc20/testdata/erc20_allowance_caller.go +++ b/precompiles/erc20/testdata/erc20_allowance_caller.go @@ -4,27 +4,10 @@ package testdata import ( - _ "embed" // embed compiled smart contract - "encoding/json" - + contractutils "github.com/evmos/evmos/v18/contracts/utils" evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) -var ( - //go:embed ERC20AllowanceCaller.json - ERC20AllowanceCaller []byte - - // ERC20AllowanceCallerContract is the compiled contract calling the staking precompile - ERC20AllowanceCallerContract evmtypes.CompiledContract -) - -func init() { - err := json.Unmarshal(ERC20AllowanceCaller, &ERC20AllowanceCallerContract) - if err != nil { - panic(err) - } - - if len(ERC20AllowanceCallerContract.Bin) == 0 { - panic("failed to load smart contract that calls erc20 precompile allowance functionality") - } +func LoadERC20AllowanceCaller() (evmtypes.CompiledContract, error) { + return contractutils.LoadContractFromJSONFile("ERC20AllowanceCaller.json") } diff --git a/precompiles/erc20/testdata/erc20_no_metadata.go b/precompiles/erc20/testdata/erc20_no_metadata.go index 3611312ed6..0307a1c03f 100644 --- a/precompiles/erc20/testdata/erc20_no_metadata.go +++ b/precompiles/erc20/testdata/erc20_no_metadata.go @@ -4,35 +4,10 @@ package testdata import ( - _ "embed" // embed compiled smart contract - "encoding/json" - - "github.com/ethereum/go-ethereum/common" + contractutils "github.com/evmos/evmos/v18/contracts/utils" evmtypes "github.com/evmos/evmos/v18/x/evm/types" - - "github.com/evmos/evmos/v18/x/erc20/types" -) - -var ( - //go:embed ERC20NoMetadata.json - ERC20NoMetadataJSON []byte //nolint: golint - - // ERC20NoMetadataContract is the compiled erc20 contract - ERC20NoMetadataContract evmtypes.CompiledContract - - // ERC20NoMetadataAddress is the erc20 module address - ERC20NoMetadataAddress common.Address ) -func init() { - ERC20NoMetadataAddress = types.ModuleAddress - - err := json.Unmarshal(ERC20NoMetadataJSON, &ERC20NoMetadataContract) - if err != nil { - panic(err) - } - - if len(ERC20NoMetadataContract.Bin) == 0 { - panic("load contract failed") - } +func LoadERC20NoMetadataContract() (evmtypes.CompiledContract, error) { + return contractutils.LoadContractFromJSONFile("ERC20NoMetadata.json") } diff --git a/precompiles/erc20/testdata/erc20minter_openzeppelinv5.go b/precompiles/erc20/testdata/erc20minter_openzeppelinv5.go index 8937e8705f..1905642e05 100644 --- a/precompiles/erc20/testdata/erc20minter_openzeppelinv5.go +++ b/precompiles/erc20/testdata/erc20minter_openzeppelinv5.go @@ -4,35 +4,10 @@ package testdata import ( - _ "embed" // embed compiled smart contract - "encoding/json" - - "github.com/ethereum/go-ethereum/common" + contractutils "github.com/evmos/evmos/v18/contracts/utils" evmtypes "github.com/evmos/evmos/v18/x/evm/types" - - "github.com/evmos/evmos/v18/x/erc20/types" -) - -var ( - //go:embed ERC20Minter_OpenZeppelinV5.json - ERC20MinterV5JSON []byte //nolint: golint - - // ERC20MinterV5Contract is the compiled erc20 contract - ERC20MinterV5Contract evmtypes.CompiledContract - - // ERC20MinterV5Address is the erc20 module address - ERC20MinterV5Address common.Address ) -func init() { - ERC20MinterV5Address = types.ModuleAddress - - err := json.Unmarshal(ERC20MinterV5JSON, &ERC20MinterV5Contract) - if err != nil { - panic(err) - } - - if len(ERC20MinterV5Contract.Bin) == 0 { - panic("load contract failed") - } +func LoadERC20MinterV5Contract() (evmtypes.CompiledContract, error) { + return contractutils.LegacyLoadContractFromJSONFile("ERC20Minter_OpenZeppelinV5.json") } diff --git a/precompiles/ics20/integration_test.go b/precompiles/ics20/integration_test.go index 38a4af6b98..97211f2ccb 100644 --- a/precompiles/ics20/integration_test.go +++ b/precompiles/ics20/integration_test.go @@ -26,6 +26,7 @@ import ( teststypes "github.com/evmos/evmos/v18/types/tests" "github.com/evmos/evmos/v18/utils" erc20types "github.com/evmos/evmos/v18/x/erc20/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" //nolint:revive // dot imports are fine for Ginkgo @@ -54,6 +55,9 @@ var ( // array of allocations with only one allocation for 'aevmos' coin defaultSingleAlloc []cmn.ICS20Allocation + + // interchainSenderContract is the compiled contract calling the interchain functionality + interchainSenderContract evmtypes.CompiledContract ) var _ = Describe("IBCTransfer Precompile", func() { @@ -62,6 +66,10 @@ var _ = Describe("IBCTransfer Precompile", func() { s.SetupTest() s.setupAllocationsForTesting() + var err error + interchainSenderContract, err = contracts.LoadInterchainSenderContract() + Expect(err).To(BeNil(), "error while loading the interchain sender contract: %v", err) + // set the default call arguments defaultCallArgs = contracts.CallArgs{ ContractAddr: s.precompile.Address(), @@ -1055,13 +1063,16 @@ var _ = Describe("Calling ICS20 precompile from another contract", func() { s.SetupTest() s.setupAllocationsForTesting() + interchainSenderContract, err = contracts.LoadInterchainSenderContract() + Expect(err).To(BeNil(), "error while loading the interchain sender contract: %v", err) + contractAddr, err = DeployContract( s.chainA.GetContext(), s.app, s.privKey, gasPrice, s.queryClientEVM, - contracts.InterchainSenderContract, + interchainSenderContract, ) Expect(err).To(BeNil(), "error while deploying the smart contract: %v", err) @@ -1076,7 +1087,7 @@ var _ = Describe("Calling ICS20 precompile from another contract", func() { // populate default call args defaultCallArgs = contracts.CallArgs{ ContractAddr: contractAddr, - ContractABI: contracts.InterchainSenderContract.ABI, + ContractABI: interchainSenderContract.ABI, PrivKey: s.privKey, GasPrice: gasPrice, } @@ -1592,7 +1603,7 @@ var _ = Describe("Calling ICS20 precompile from another contract", func() { Expect(err).To(BeNil(), "error while calling the precompile") var out []cmn.ICS20Allocation - err = contracts.InterchainSenderContract.ABI.UnpackIntoInterface(&out, "testAllowance", ethRes.Ret) + err = interchainSenderContract.ABI.UnpackIntoInterface(&out, "testAllowance", ethRes.Ret) Expect(err).To(BeNil(), "error while unpacking the output: %v", err) Expect(out).To(HaveLen(1)) Expect(len(out)).To(Equal(len(defaultSingleAlloc))) diff --git a/precompiles/staking/integration_test.go b/precompiles/staking/integration_test.go index e88fe46b68..65a8fef095 100644 --- a/precompiles/staking/integration_test.go +++ b/precompiles/staking/integration_test.go @@ -31,6 +31,7 @@ import ( evmosutil "github.com/evmos/evmos/v18/testutil" testutiltx "github.com/evmos/evmos/v18/testutil/tx" "github.com/evmos/evmos/v18/utils" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" ) @@ -1468,6 +1469,9 @@ var _ = Describe("Calling staking precompile via Solidity", func() { // contractAddr is the address of the smart contract that will be deployed contractAddr common.Address + // stakingCallerContract is the contract instance calling into the staking precompile + stakingCallerContract evmtypes.CompiledContract + // approvalCheck is a configuration for the log checker to see if an approval event was emitted. approvalCheck testutil.LogCheckArgs // execRevertedCheck defines the default log checking arguments which include the @@ -1484,7 +1488,11 @@ var _ = Describe("Calling staking precompile via Solidity", func() { BeforeEach(func() { s.SetupTest() - contractAddr, err = s.DeployContract(testdata.StakingCallerContract) + + stakingCallerContract, err = testdata.LoadStakingCallerContract() + Expect(err).To(BeNil(), "error while loading the staking caller contract: %v", err) + + contractAddr, err = s.DeployContract(stakingCallerContract) Expect(err).To(BeNil(), "error while deploying the smart contract: %v", err) valAddr = s.validators[0].GetOperator() valAddr2 = s.validators[1].GetOperator() @@ -1499,7 +1507,7 @@ var _ = Describe("Calling staking precompile via Solidity", func() { // populate default call args defaultCallArgs = contracts.CallArgs{ ContractAddr: contractAddr, - ContractABI: testdata.StakingCallerContract.ABI, + ContractABI: stakingCallerContract.ABI, PrivKey: s.privKey, } // populate default approval args @@ -3097,6 +3105,8 @@ var _ = Describe("Batching cosmos and eth interactions", func() { var ( // contractAddr is the address of the deployed StakingCaller contract contractAddr common.Address + // stakingCallerContract is the contract instance calling into the staking precompile + stakingCallerContract evmtypes.CompiledContract // erc20ContractAddr is the address of the deployed ERC20 contract erc20ContractAddr common.Address // erc20Contract is the compiled ERC20 contract @@ -3117,8 +3127,11 @@ var _ = Describe("Batching cosmos and eth interactions", func() { s.SetupTest() s.NextBlock() + stakingCallerContract, err = testdata.LoadStakingCallerContract() + Expect(err).To(BeNil(), "error while loading the StakingCaller contract") + // Deploy StakingCaller contract - contractAddr, err = evmosutil.DeployContract(s.ctx, s.app, s.privKey, s.queryClientEVM, testdata.StakingCallerContract) + contractAddr, err = evmosutil.DeployContract(s.ctx, s.app, s.privKey, s.queryClientEVM, stakingCallerContract) Expect(err).To(BeNil(), "error while deploying the StakingCaller contract") // Deploy ERC20 contract @@ -3151,7 +3164,7 @@ var _ = Describe("Batching cosmos and eth interactions", func() { // populate default call args defaultCallArgs = contracts.CallArgs{ - ContractABI: testdata.StakingCallerContract.ABI, + ContractABI: stakingCallerContract.ABI, ContractAddr: contractAddr, MethodName: "callERC20AndDelegate", PrivKey: s.privKey, diff --git a/precompiles/staking/testdata/StakingCaller.json b/precompiles/staking/testdata/StakingCaller.json index b6932839d5..c427485580 100644 --- a/precompiles/staking/testdata/StakingCaller.json +++ b/precompiles/staking/testdata/StakingCaller.json @@ -1,4 +1,929 @@ { - "abi": "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"}],\"name\":\"approveDepositAndDelegate\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"}],\"name\":\"approveDepositAndDelegateExceedingAllowance\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"}],\"name\":\"approveDepositDelegateAndFailCustomLogic\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"callERC20AndDelegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"counter\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_grantee\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"method\",\"type\":\"string\"}],\"name\":\"getAllowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"}],\"name\":\"getDelegation\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"struct Coin\",\"name\":\"balance\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_validatorSrcAddr\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_validatorDstAddr\",\"type\":\"string\"}],\"name\":\"getRedelegation\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"delegatorAddress\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"validatorSrcAddress\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"validatorDstAddress\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"int64\",\"name\":\"creationHeight\",\"type\":\"int64\"},{\"internalType\":\"int64\",\"name\":\"completionTime\",\"type\":\"int64\"},{\"internalType\":\"uint256\",\"name\":\"initialBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sharesDst\",\"type\":\"uint256\"}],\"internalType\":\"struct RedelegationEntry[]\",\"name\":\"entries\",\"type\":\"tuple[]\"}],\"internalType\":\"struct RedelegationOutput\",\"name\":\"redelegation\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_delegatorAddr\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_validatorSrcAddr\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_validatorDstAddr\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"key\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"offset\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"limit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"countTotal\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"reverse\",\"type\":\"bool\"}],\"internalType\":\"struct PageRequest\",\"name\":\"_pageRequest\",\"type\":\"tuple\"}],\"name\":\"getRedelegations\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"delegatorAddress\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"validatorSrcAddress\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"validatorDstAddress\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"int64\",\"name\":\"creationHeight\",\"type\":\"int64\"},{\"internalType\":\"int64\",\"name\":\"completionTime\",\"type\":\"int64\"},{\"internalType\":\"uint256\",\"name\":\"initialBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sharesDst\",\"type\":\"uint256\"}],\"internalType\":\"struct RedelegationEntry[]\",\"name\":\"entries\",\"type\":\"tuple[]\"}],\"internalType\":\"struct Redelegation\",\"name\":\"redelegation\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"internalType\":\"int64\",\"name\":\"creationHeight\",\"type\":\"int64\"},{\"internalType\":\"int64\",\"name\":\"completionTime\",\"type\":\"int64\"},{\"internalType\":\"uint256\",\"name\":\"initialBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sharesDst\",\"type\":\"uint256\"}],\"internalType\":\"struct RedelegationEntry\",\"name\":\"redelegationEntry\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"internalType\":\"struct RedelegationEntryResponse[]\",\"name\":\"entries\",\"type\":\"tuple[]\"}],\"internalType\":\"struct RedelegationResponse[]\",\"name\":\"response\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nextKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"total\",\"type\":\"uint64\"}],\"internalType\":\"struct PageResponse\",\"name\":\"pageResponse\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"}],\"name\":\"getUnbondingDelegation\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"delegatorAddress\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"validatorAddress\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"int64\",\"name\":\"creationHeight\",\"type\":\"int64\"},{\"internalType\":\"int64\",\"name\":\"completionTime\",\"type\":\"int64\"},{\"internalType\":\"uint256\",\"name\":\"initialBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"unbondingId\",\"type\":\"uint64\"},{\"internalType\":\"int64\",\"name\":\"unbondingOnHoldRefCount\",\"type\":\"int64\"}],\"internalType\":\"struct UnbondingDelegationEntry[]\",\"name\":\"entries\",\"type\":\"tuple[]\"}],\"internalType\":\"struct UnbondingDelegationOutput\",\"name\":\"unbondingDelegation\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_validatorAddr\",\"type\":\"address\"}],\"name\":\"getValidator\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"operatorAddress\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"consensusPubkey\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"jailed\",\"type\":\"bool\"},{\"internalType\":\"enum BondStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"delegatorShares\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"int64\",\"name\":\"unbondingHeight\",\"type\":\"int64\"},{\"internalType\":\"int64\",\"name\":\"unbondingTime\",\"type\":\"int64\"},{\"internalType\":\"uint256\",\"name\":\"commission\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minSelfDelegation\",\"type\":\"uint256\"}],\"internalType\":\"struct Validator\",\"name\":\"validator\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_status\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"key\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"offset\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"limit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"countTotal\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"reverse\",\"type\":\"bool\"}],\"internalType\":\"struct PageRequest\",\"name\":\"_pageRequest\",\"type\":\"tuple\"}],\"name\":\"getValidators\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"operatorAddress\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"consensusPubkey\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"jailed\",\"type\":\"bool\"},{\"internalType\":\"enum BondStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"delegatorShares\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"int64\",\"name\":\"unbondingHeight\",\"type\":\"int64\"},{\"internalType\":\"int64\",\"name\":\"unbondingTime\",\"type\":\"int64\"},{\"internalType\":\"uint256\",\"name\":\"commission\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minSelfDelegation\",\"type\":\"uint256\"}],\"internalType\":\"struct Validator[]\",\"name\":\"validators\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nextKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"total\",\"type\":\"uint64\"}],\"internalType\":\"struct PageResponse\",\"name\":\"pageResponse\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"},{\"internalType\":\"string[]\",\"name\":\"_methods\",\"type\":\"string[]\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"testApprove\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_approveAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_undelegateAmount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"}],\"name\":\"testApproveAndThenUndelegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_calltype\",\"type\":\"string\"}],\"name\":\"testCallDelegation\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"struct Coin\",\"name\":\"coin\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_calltype\",\"type\":\"string\"}],\"name\":\"testCallUndelegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_creationHeight\",\"type\":\"uint256\"}],\"name\":\"testCancelUnbonding\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"testDelegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"testDelegateIncrementCounter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_validatorSrcAddr\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_validatorDstAddr\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"testRedelegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_grantee\",\"type\":\"address\"},{\"internalType\":\"string[]\",\"name\":\"_methods\",\"type\":\"string[]\"}],\"name\":\"testRevoke\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_validatorAddr\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"testUndelegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - "bin": "6080604052604051806020016040528060405180606001604052806023815260200162005c286023913981525060019060016200003e92919062000053565b503480156200004c57600080fd5b50620004a1565b828054828255906000526020600020908101928215620000a0579160200282015b828111156200009f5782518290816200008e9190620003ba565b509160200191906001019062000074565b5b509050620000af9190620000b3565b5090565b5b80821115620000d75760008181620000cd9190620000db565b50600101620000b4565b5090565b508054620000e990620001a9565b6000825580601f10620000fd57506200011e565b601f0160209004906000526020600020908101906200011d919062000121565b5b50565b5b808211156200013c57600081600090555060010162000122565b5090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620001c257607f821691505b602082108103620001d857620001d76200017a565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620002427fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000203565b6200024e868362000203565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200029b620002956200028f8462000266565b62000270565b62000266565b9050919050565b6000819050919050565b620002b7836200027a565b620002cf620002c682620002a2565b84845462000210565b825550505050565b600090565b620002e6620002d7565b620002f3818484620002ac565b505050565b5b818110156200031b576200030f600082620002dc565b600181019050620002f9565b5050565b601f8211156200036a576200033481620001de565b6200033f84620001f3565b810160208510156200034f578190505b620003676200035e85620001f3565b830182620002f8565b50505b505050565b600082821c905092915050565b60006200038f600019846008026200036f565b1980831691505092915050565b6000620003aa83836200037c565b9150826002028217905092915050565b620003c58262000140565b67ffffffffffffffff811115620003e157620003e06200014b565b5b620003ed8254620001a9565b620003fa8282856200031f565b600060209050601f8311600181146200043257600084156200041d578287015190505b6200042985826200039c565b86555062000499565b601f1984166200044286620001de565b60005b828110156200046c5784890151825560018201915060208501945060208101905062000445565b868310156200048c578489015162000488601f8916826200037c565b8355505b6001600288020188555050505b505050505050565b61577780620004b16000396000f3fe6080604052600436106101355760003560e01c80637e51b811116100ab578063cf2753cf1161006f578063cf2753cf14610418578063ec9485df14610456578063f40a214614610493578063f5714e64146104bc578063f700dbd2146104d8578063f732b0651461050157610135565b80637e51b811146103435780638939e7831461036c5780638edb3f8b146103955780639eab6711146103b1578063b13d4242146103da57610135565b8063455b8551116100fd578063455b85511461023057806355dc4b221461026d578063570467ac146102965780635e269bfe146102d357806360deaa2a146102fc57806361bc221a1461031857610135565b80630a4433e21461013a5780631904bb2e1461016357806319b16c4c146101a057806331bcbcb3146101de5780633566cb9514610207575b600080fd5b34801561014657600080fd5b50610161600480360381019061015c919061221e565b61053f565b005b34801561016f57600080fd5b5061018a60048036038101906101859190612292565b61060e565b6040516101979190612509565b60405180910390f35b3480156101ac57600080fd5b506101c760048036038101906101c2919061265b565b61069e565b6040516101d5929190612732565b60405180910390f35b3480156101ea57600080fd5b5061020560048036038101906102009190612762565b610b9d565b005b34801561021357600080fd5b5061022e600480360381019061022991906127d1565b610e2a565b005b34801561023c57600080fd5b506102576004803603810190610252919061282d565b610f92565b6040516102649190612a34565b60405180910390f35b34801561027957600080fd5b50610294600480360381019061028f9190612a56565b611025565b005b3480156102a257600080fd5b506102bd60048036038101906102b8919061265b565b611417565b6040516102ca9190612c71565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f59190612c93565b6114ad565b005b61031660048036038101906103119190612d16565b611538565b005b34801561032457600080fd5b5061032d611686565b60405161033a9190612d5f565b60405180910390f35b34801561034f57600080fd5b5061036a60048036038101906103659190612762565b61168c565b005b34801561037857600080fd5b50610393600480360381019061038e9190612762565b611714565b005b6103af60048036038101906103aa9190612d16565b61179c565b005b3480156103bd57600080fd5b506103d860048036038101906103d39190612d7a565b611931565b005b3480156103e657600080fd5b5061040160048036038101906103fc9190612e3d565b6119bc565b60405161040f929190613106565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a919061282d565b611a54565b60405161044d929190612732565b60405180910390f35b34801561046257600080fd5b5061047d6004803603810190610478919061282d565b611aec565b60405161048a9190612d5f565b60405180910390f35b34801561049f57600080fd5b506104ba60048036038101906104b5919061313d565b611b76565b005b6104d660048036038101906104d19190612d16565b611d52565b005b3480156104e457600080fd5b506104ff60048036038101906104fa91906131c0565b611eac565b005b34801561050d57600080fd5b50610528600480360381019061052391906133cb565b611f78565b6040516105369291906136e2565b60405180910390f35b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895868487876040518563ffffffff1660e01b8152600401610582949392919061387b565b6020604051808303816000875af11580156105a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c591906138d0565b905080610607576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105fe90613980565b60405180910390fd5b5050505050565b610616612016565b61080073ffffffffffffffffffffffffffffffffffffffff1663223b3b7a836040518263ffffffff1660e01b815260040161065191906139a0565b600060405180830381865afa15801561066e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906106979190613bf1565b9050919050565b60006106a861208a565b60006108009050600086866040516024016106c4929190613c73565b6040516020818303038152906040527f241774e6000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000856040516020016107569190613cdf565b60405160208183030381529060405280519060200120905060405160200161077d90613d42565b604051602081830303815290604052805190602001208103610869576000808473ffffffffffffffffffffffffffffffffffffffff16846040516107c19190613d93565b600060405180830381855af49150503d80600081146107fc576040519150601f19603f3d011682016040523d82523d6000602084013e610801565b606091505b509150915081610846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083d90613e1c565b60405180910390fd5b8080602001905181019061085a9190613ea8565b80975081985050505050610b92565b60405160200161087890613f50565b604051602081830303815290604052805190602001208103610964576000808473ffffffffffffffffffffffffffffffffffffffff16846040516108bc9190613d93565b600060405180830381855afa9150503d80600081146108f7576040519150601f19603f3d011682016040523d82523d6000602084013e6108fc565b606091505b509150915081610941576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093890613fb1565b60405180910390fd5b808060200190518101906109559190613ea8565b80975081985050505050610b91565b6040516020016109739061401d565b604051602081830303815290604052805190602001208103610a61576000808473ffffffffffffffffffffffffffffffffffffffff16846040516109b79190613d93565b6000604051808303816000865af19150503d80600081146109f4576040519150601f19603f3d011682016040523d82523d6000602084013e6109f9565b606091505b509150915081610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a359061407e565b60405180910390fd5b80806020019051810190610a529190613ea8565b80975081985050505050610b90565b604051602001610a70906140ea565b604051602081830303815290604052805190602001208103610b545760006040518060400160405280601a81526020017f64656c65676174696f6e28616464726573732c737472696e6729000000000000815250805190602001209050600060a490506060600060208b01516020808d0101516040518681528e6004820152604060248201526033604482015282606482015281608482015260c081878360008e5af281519c5060608201519450610100820160405280610b3057600080fd5b50505050604051806040016040528083815260200182815250975050505050610b8f565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b869061414b565b60405180910390fd5b5b5b5b505050935093915050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610bdf93929190614319565b6020604051808303816000875af1158015610bfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2291906138d0565b905080610c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5b906143a3565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff163384604051602401610c909291906143c3565b6040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610d1a9190613d93565b6000604051808303816000865af19150503d8060008114610d57576040519150601f19603f3d011682016040523d82523d6000602084013e610d5c565b606091505b5050905080610da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9790614438565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3386866040518463ffffffff1660e01b8152600401610ddf93929190614458565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906138d0565b505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610e6c93929190614319565b6020604051808303816000875af1158015610e8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eaf91906138d0565b905080610ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee8906144e2565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3085856040518463ffffffff1660e01b8152600401610f3093929190614458565b6020604051808303816000875af1158015610f4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7391906138d0565b506001600080828254610f869190614531565b92505081905550505050565b610f9a6120a4565b61080073ffffffffffffffffffffffffffffffffffffffff1663a03ffee184846040518363ffffffff1660e01b8152600401610fd7929190613c73565b600060405180830381865afa158015610ff4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061101d9190614795565b905092915050565b60006108009050600085858560405160240161104393929190614458565b6040516020818303038152906040527f3edab33c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000836040516020016110d59190613cdf565b6040516020818303038152906040528051906020012090506040516020016110fc90613d42565b6040516020818303038152906040528051906020012081036111c95760008373ffffffffffffffffffffffffffffffffffffffff168360405161113f9190613d93565b600060405180830381855af49150503d806000811461117a576040519150601f19603f3d011682016040523d82523d6000602084013e61117f565b606091505b50509050806111c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ba90613e1c565b60405180910390fd5b5061140e565b6040516020016111d890613f50565b6040516020818303038152906040528051906020012081036112a55760008373ffffffffffffffffffffffffffffffffffffffff168360405161121b9190613d93565b600060405180830381855afa9150503d8060008114611256576040519150601f19603f3d011682016040523d82523d6000602084013e61125b565b606091505b505090508061129f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129690613fb1565b60405180910390fd5b5061140d565b6040516020016112b49061401d565b6040516020818303038152906040528051906020012081036113835760008373ffffffffffffffffffffffffffffffffffffffff16836040516112f79190613d93565b6000604051808303816000865af19150503d8060008114611334576040519150601f19603f3d011682016040523d82523d6000602084013e611339565b606091505b505090508061137d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113749061407e565b60405180910390fd5b5061140c565b604051602001611392906140ea565b6040516020818303038152906040528051906020012081036113d05760208201825160008082846000895af2806113c857600080fd5b50505061140b565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114029061414b565b60405180910390fd5b5b5b5b50505050505050565b61141f6120c5565b61080073ffffffffffffffffffffffffffffffffffffffff16637d9f939c8585856040518463ffffffff1660e01b815260040161145e939291906147de565b600060405180830381865afa15801561147b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906114a49190614a46565b90509392505050565b61080073ffffffffffffffffffffffffffffffffffffffff166312d58dfe858585856040518563ffffffff1660e01b81526004016114ee9493929190614a8f565b6020604051808303816000875af115801561150d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153191906138d0565b5050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895303460016040518463ffffffff1660e01b815260040161157a93929190614319565b6020604051808303816000875af1158015611599573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115bd91906138d0565b9050806115ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f690614b27565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b815260040161163e93929190614458565b6020604051808303816000875af115801561165d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168191906138d0565b505050565b60005481565b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c8484846040518463ffffffff1660e01b81526004016116cb93929190614458565b6020604051808303816000875af11580156116ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170e9190614b47565b50505050565b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb8484846040518463ffffffff1660e01b815260040161175393929190614458565b6020604051808303816000875af1158015611772573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179691906138d0565b50505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b81526004016117de93929190614319565b6020604051808303816000875af11580156117fd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182191906138d0565b905080611863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185a90614b27565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b81526004016118a293929190614458565b6020604051808303816000875af11580156118c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e591906138d0565b503373ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f1935050505015801561192c573d6000803e3d6000fd5b505050565b61080073ffffffffffffffffffffffffffffffffffffffff166354b826f5858585856040518563ffffffff1660e01b81526004016119729493929190614b74565b6020604051808303816000875af1158015611991573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b59190614b47565b5050505050565b60606119c66120ed565b61080073ffffffffffffffffffffffffffffffffffffffff1663186b216785856040518363ffffffff1660e01b8152600401611a03929190614d25565b600060405180830381865afa158015611a20573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611a499190614f19565b915091509250929050565b6000611a5e61208a565b61080073ffffffffffffffffffffffffffffffffffffffff1663241774e685856040518363ffffffff1660e01b8152600401611a9b929190613c73565b600060405180830381865afa158015611ab8573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611ae19190613ea8565b915091509250929050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663fc08930c8433856040518463ffffffff1660e01b8152600401611b2d93929190614f91565b602060405180830381865afa158015611b4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6e9190614fcf565b905092915050565b6000600167ffffffffffffffff811115611b9357611b92612530565b5b604051908082528060200260200182016040528015611bc657816020015b6060815260200190600190039081611bb15790505b50905060405180606001604052806025815260200161571d6025913981600081518110611bf657611bf5614ffc565b5b6020026020010181905250600061080073ffffffffffffffffffffffffffffffffffffffff1663b60398958787856040518463ffffffff1660e01b8152600401611c42939291906150dc565b6020604051808303816000875af1158015611c61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8591906138d0565b905080611cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbe9061518c565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c3285876040518463ffffffff1660e01b8152600401611d0693929190614458565b6020604051808303816000875af1158015611d25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d499190614b47565b50505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b8152600401611d9493929190614319565b6020604051808303816000875af1158015611db3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd791906138d0565b905080611e19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1090614b27565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084600134611e469190614531565b6040518463ffffffff1660e01b8152600401611e6493929190614458565b6020604051808303816000875af1158015611e83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea791906138d0565b505050565b600061080073ffffffffffffffffffffffffffffffffffffffff166361dc5c3b8585856040518463ffffffff1660e01b8152600401611eed939291906151ac565b6020604051808303816000875af1158015611f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f3091906138d0565b905080611f72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6990615250565b60405180910390fd5b50505050565b6060611f826120ed565b61080073ffffffffffffffffffffffffffffffffffffffff166310a2851c878787876040518563ffffffff1660e01b8152600401611fc394939291906152e6565b600060405180830381865afa158015611fe0573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061200991906156a4565b9150915094509492505050565b60405180610160016040528060608152602001606081526020016000151581526020016000600381111561204d5761204c61236a565b5b8152602001600081526020016000815260200160608152602001600060070b8152602001600060070b815260200160008152602001600081525090565b604051806040016040528060608152602001600081525090565b60405180606001604052806060815260200160608152602001606081525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061215082612125565b9050919050565b61216081612145565b811461216b57600080fd5b50565b60008135905061217d81612157565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126121a8576121a7612183565b5b8235905067ffffffffffffffff8111156121c5576121c4612188565b5b6020830191508360208202830111156121e1576121e061218d565b5b9250929050565b6000819050919050565b6121fb816121e8565b811461220657600080fd5b50565b600081359050612218816121f2565b92915050565b600080600080606085870312156122385761223761211b565b5b60006122468782880161216e565b945050602085013567ffffffffffffffff81111561226757612266612120565b5b61227387828801612192565b9350935050604061228687828801612209565b91505092959194509250565b6000602082840312156122a8576122a761211b565b5b60006122b68482850161216e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156122f95780820151818401526020810190506122de565b60008484015250505050565b6000601f19601f8301169050919050565b6000612321826122bf565b61232b81856122ca565b935061233b8185602086016122db565b61234481612305565b840191505092915050565b60008115159050919050565b6123648161234f565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106123aa576123a961236a565b5b50565b60008190506123bb82612399565b919050565b60006123cb826123ad565b9050919050565b6123db816123c0565b82525050565b6123ea816121e8565b82525050565b60008160070b9050919050565b612406816123f0565b82525050565b600061016083016000830151848203600086015261242a8282612316565b915050602083015184820360208601526124448282612316565b9150506040830151612459604086018261235b565b50606083015161246c60608601826123d2565b50608083015161247f60808601826123e1565b5060a083015161249260a08601826123e1565b5060c083015184820360c08601526124aa8282612316565b91505060e08301516124bf60e08601826123fd565b506101008301516124d46101008601826123fd565b506101208301516124e96101208601826123e1565b506101408301516124fe6101408601826123e1565b508091505092915050565b60006020820190508181036000830152612523818461240c565b905092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61256882612305565b810181811067ffffffffffffffff8211171561258757612586612530565b5b80604052505050565b600061259a612111565b90506125a6828261255f565b919050565b600067ffffffffffffffff8211156125c6576125c5612530565b5b6125cf82612305565b9050602081019050919050565b82818337600083830152505050565b60006125fe6125f9846125ab565b612590565b90508281526020810184848401111561261a5761261961252b565b5b6126258482856125dc565b509392505050565b600082601f83011261264257612641612183565b5b81356126528482602086016125eb565b91505092915050565b6000806000606084860312156126745761267361211b565b5b60006126828682870161216e565b935050602084013567ffffffffffffffff8111156126a3576126a2612120565b5b6126af8682870161262d565b925050604084013567ffffffffffffffff8111156126d0576126cf612120565b5b6126dc8682870161262d565b9150509250925092565b6126ef816121e8565b82525050565b600060408301600083015184820360008601526127128282612316565b915050602083015161272760208601826123e1565b508091505092915050565b600060408201905061274760008301856126e6565b818103602083015261275981846126f5565b90509392505050565b60008060006060848603121561277b5761277a61211b565b5b60006127898682870161216e565b935050602084013567ffffffffffffffff8111156127aa576127a9612120565b5b6127b68682870161262d565b92505060406127c786828701612209565b9150509250925092565b600080604083850312156127e8576127e761211b565b5b600083013567ffffffffffffffff81111561280657612805612120565b5b6128128582860161262d565b925050602061282385828601612209565b9150509250929050565b600080604083850312156128445761284361211b565b5b60006128528582860161216e565b925050602083013567ffffffffffffffff81111561287357612872612120565b5b61287f8582860161262d565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600067ffffffffffffffff82169050919050565b6128d2816128b5565b82525050565b60c0820160008201516128ee60008501826123fd565b50602082015161290160208501826123fd565b50604082015161291460408501826123e1565b50606082015161292760608501826123e1565b50608082015161293a60808501826128c9565b5060a082015161294d60a08501826123fd565b50505050565b600061295f83836128d8565b60c08301905092915050565b6000602082019050919050565b600061298382612889565b61298d8185612894565b9350612998836128a5565b8060005b838110156129c95781516129b08882612953565b97506129bb8361296b565b92505060018101905061299c565b5085935050505092915050565b600060608301600083015184820360008601526129f38282612316565b91505060208301518482036020860152612a0d8282612316565b91505060408301518482036040860152612a278282612978565b9150508091505092915050565b60006020820190508181036000830152612a4e81846129d6565b905092915050565b60008060008060808587031215612a7057612a6f61211b565b5b6000612a7e8782880161216e565b945050602085013567ffffffffffffffff811115612a9f57612a9e612120565b5b612aab8782880161262d565b9350506040612abc87828801612209565b925050606085013567ffffffffffffffff811115612add57612adc612120565b5b612ae98782880161262d565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b608082016000820151612b3760008501826123fd565b506020820151612b4a60208501826123fd565b506040820151612b5d60408501826123e1565b506060820151612b7060608501826123e1565b50505050565b6000612b828383612b21565b60808301905092915050565b6000602082019050919050565b6000612ba682612af5565b612bb08185612b00565b9350612bbb83612b11565b8060005b83811015612bec578151612bd38882612b76565b9750612bde83612b8e565b925050600181019050612bbf565b5085935050505092915050565b60006080830160008301518482036000860152612c168282612316565b91505060208301518482036020860152612c308282612316565b91505060408301518482036040860152612c4a8282612316565b91505060608301518482036060860152612c648282612b9b565b9150508091505092915050565b60006020820190508181036000830152612c8b8184612bf9565b905092915050565b60008060008060808587031215612cad57612cac61211b565b5b6000612cbb8782880161216e565b945050602085013567ffffffffffffffff811115612cdc57612cdb612120565b5b612ce88782880161262d565b9350506040612cf987828801612209565b9250506060612d0a87828801612209565b91505092959194509250565b600060208284031215612d2c57612d2b61211b565b5b600082013567ffffffffffffffff811115612d4a57612d49612120565b5b612d568482850161262d565b91505092915050565b6000602082019050612d7460008301846126e6565b92915050565b60008060008060808587031215612d9457612d9361211b565b5b6000612da28782880161216e565b945050602085013567ffffffffffffffff811115612dc357612dc2612120565b5b612dcf8782880161262d565b935050604085013567ffffffffffffffff811115612df057612def612120565b5b612dfc8782880161262d565b9250506060612e0d87828801612209565b91505092959194509250565b600080fd5b600060a08284031215612e3457612e33612e19565b5b81905092915050565b60008060408385031215612e5457612e5361211b565b5b600083013567ffffffffffffffff811115612e7257612e71612120565b5b612e7e8582860161262d565b925050602083013567ffffffffffffffff811115612e9f57612e9e612120565b5b612eab85828601612e1e565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000610160830160008301518482036000860152612eff8282612316565b91505060208301518482036020860152612f198282612316565b9150506040830151612f2e604086018261235b565b506060830151612f4160608601826123d2565b506080830151612f5460808601826123e1565b5060a0830151612f6760a08601826123e1565b5060c083015184820360c0860152612f7f8282612316565b91505060e0830151612f9460e08601826123fd565b50610100830151612fa96101008601826123fd565b50610120830151612fbe6101208601826123e1565b50610140830151612fd36101408601826123e1565b508091505092915050565b6000612fea8383612ee1565b905092915050565b6000602082019050919050565b600061300a82612eb5565b6130148185612ec0565b93508360208202850161302685612ed1565b8060005b8581101561306257848403895281516130438582612fde565b945061304e83612ff2565b925060208a0199505060018101905061302a565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b600061309b82613074565b6130a5818561307f565b93506130b58185602086016122db565b6130be81612305565b840191505092915050565b600060408301600083015184820360008601526130e68282613090565b91505060208301516130fb60208601826128c9565b508091505092915050565b600060408201905081810360008301526131208185612fff565b9050818103602083015261313481846130c9565b90509392505050565b600080600080608085870312156131575761315661211b565b5b60006131658782880161216e565b945050602061317687828801612209565b935050604061318787828801612209565b925050606085013567ffffffffffffffff8111156131a8576131a7612120565b5b6131b48782880161262d565b91505092959194509250565b6000806000604084860312156131d9576131d861211b565b5b60006131e78682870161216e565b935050602084013567ffffffffffffffff81111561320857613207612120565b5b61321486828701612192565b92509250509250925092565b600080fd5b600080fd5b600067ffffffffffffffff82111561324557613244612530565b5b61324e82612305565b9050602081019050919050565b600061326e6132698461322a565b612590565b90508281526020810184848401111561328a5761328961252b565b5b6132958482856125dc565b509392505050565b600082601f8301126132b2576132b1612183565b5b81356132c284826020860161325b565b91505092915050565b6132d4816128b5565b81146132df57600080fd5b50565b6000813590506132f1816132cb565b92915050565b6133008161234f565b811461330b57600080fd5b50565b60008135905061331d816132f7565b92915050565b600060a0828403121561333957613338613220565b5b61334360a0612590565b9050600082013567ffffffffffffffff81111561336357613362613225565b5b61336f8482850161329d565b6000830152506020613383848285016132e2565b6020830152506040613397848285016132e2565b60408301525060606133ab8482850161330e565b60608301525060806133bf8482850161330e565b60808301525092915050565b600080600080608085870312156133e5576133e461211b565b5b60006133f38782880161216e565b945050602085013567ffffffffffffffff81111561341457613413612120565b5b6134208782880161262d565b935050604085013567ffffffffffffffff81111561344157613440612120565b5b61344d8782880161262d565b925050606085013567ffffffffffffffff81111561346e5761346d612120565b5b61347a87828801613323565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060808301600083015184820360008601526134cf8282612316565b915050602083015184820360208601526134e98282612316565b915050604083015184820360408601526135038282612316565b9150506060830151848203606086015261351d8282612b9b565b9150508091505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60a08201600082015161356c6000850182612b21565b50602082015161357f60808501826123e1565b50505050565b60006135918383613556565b60a08301905092915050565b6000602082019050919050565b60006135b58261352a565b6135bf8185613535565b93506135ca83613546565b8060005b838110156135fb5781516135e28882613585565b97506135ed8361359d565b9250506001810190506135ce565b5085935050505092915050565b6000604083016000830151848203600086015261362582826134b2565b9150506020830151848203602086015261363f82826135aa565b9150508091505092915050565b60006136588383613608565b905092915050565b6000602082019050919050565b600061367882613486565b6136828185613491565b935083602082028501613694856134a2565b8060005b858110156136d057848403895281516136b1858261364c565b94506136bc83613660565b925060208a01995050600181019050613698565b50829750879550505050505092915050565b600060408201905081810360008301526136fc818561366d565b9050818103602083015261371081846130c9565b90509392505050565b61372281612145565b82525050565b600082825260208201905092915050565b6000819050919050565b600061374f83856122ca565b935061375c8385846125dc565b61376583612305565b840190509392505050565b600061377d848484613743565b90509392505050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126137b2576137b1613790565b5b83810192508235915060208301925067ffffffffffffffff8211156137da576137d9613786565b5b6001820236038313156137f0576137ef61378b565b5b509250929050565b6000602082019050919050565b60006138118385613728565b93508360208402850161382384613739565b8060005b8781101561386957848403895261383e8284613795565b613849868284613770565b9550613854846137f8565b935060208b019a505050600181019050613827565b50829750879450505050509392505050565b60006060820190506138906000830187613719565b61389d60208301866126e6565b81810360408301526138b0818486613805565b905095945050505050565b6000815190506138ca816132f7565b92915050565b6000602082840312156138e6576138e561211b565b5b60006138f4848285016138bb565b91505092915050565b600082825260208201905092915050565b7f4661696c656420746f20617070726f7665207374616b696e67206d6574686f6460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061396a6021836138fd565b91506139758261390e565b604082019050919050565b600060208201905081810360008301526139998161395d565b9050919050565b60006020820190506139b56000830184613719565b92915050565b60006139ce6139c9846125ab565b612590565b9050828152602081018484840111156139ea576139e961252b565b5b6139f58482856122db565b509392505050565b600082601f830112613a1257613a11612183565b5b8151613a228482602086016139bb565b91505092915050565b60048110613a3857600080fd5b50565b600081519050613a4a81613a2b565b92915050565b600081519050613a5f816121f2565b92915050565b613a6e816123f0565b8114613a7957600080fd5b50565b600081519050613a8b81613a65565b92915050565b60006101608284031215613aa857613aa7613220565b5b613ab3610160612590565b9050600082015167ffffffffffffffff811115613ad357613ad2613225565b5b613adf848285016139fd565b600083015250602082015167ffffffffffffffff811115613b0357613b02613225565b5b613b0f848285016139fd565b6020830152506040613b23848285016138bb565b6040830152506060613b3784828501613a3b565b6060830152506080613b4b84828501613a50565b60808301525060a0613b5f84828501613a50565b60a08301525060c082015167ffffffffffffffff811115613b8357613b82613225565b5b613b8f848285016139fd565b60c08301525060e0613ba384828501613a7c565b60e083015250610100613bb884828501613a7c565b61010083015250610120613bce84828501613a50565b61012083015250610140613be484828501613a50565b6101408301525092915050565b600060208284031215613c0757613c0661211b565b5b600082015167ffffffffffffffff811115613c2557613c24612120565b5b613c3184828501613a91565b91505092915050565b6000613c45826122bf565b613c4f81856138fd565b9350613c5f8185602086016122db565b613c6881612305565b840191505092915050565b6000604082019050613c886000830185613719565b8181036020830152613c9a8184613c3a565b90509392505050565b600081905092915050565b6000613cb9826122bf565b613cc38185613ca3565b9350613cd38185602086016122db565b80840191505092915050565b6000613ceb8284613cae565b915081905092915050565b7f64656c656761746563616c6c0000000000000000000000000000000000000000600082015250565b6000613d2c600c83613ca3565b9150613d3782613cf6565b600c82019050919050565b6000613d4d82613d1f565b9150819050919050565b600081905092915050565b6000613d6d82613074565b613d778185613d57565b9350613d878185602086016122db565b80840191505092915050565b6000613d9f8284613d62565b915081905092915050565b7f6661696c65642064656c656761746563616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e066021836138fd565b9150613e1182613daa565b604082019050919050565b60006020820190508181036000830152613e3581613df9565b9050919050565b600060408284031215613e5257613e51613220565b5b613e5c6040612590565b9050600082015167ffffffffffffffff811115613e7c57613e7b613225565b5b613e88848285016139fd565b6000830152506020613e9c84828501613a50565b60208301525092915050565b60008060408385031215613ebf57613ebe61211b565b5b6000613ecd85828601613a50565b925050602083015167ffffffffffffffff811115613eee57613eed612120565b5b613efa85828601613e3c565b9150509250929050565b7f73746174696363616c6c00000000000000000000000000000000000000000000600082015250565b6000613f3a600a83613ca3565b9150613f4582613f04565b600a82019050919050565b6000613f5b82613f2d565b9150819050919050565b7f6661696c65642073746174696363616c6c20746f20707265636f6d70696c6500600082015250565b6000613f9b601f836138fd565b9150613fa682613f65565b602082019050919050565b60006020820190508181036000830152613fca81613f8e565b9050919050565b7f63616c6c00000000000000000000000000000000000000000000000000000000600082015250565b6000614007600483613ca3565b915061401282613fd1565b600482019050919050565b600061402882613ffa565b9150819050919050565b7f6661696c65642063616c6c20746f20707265636f6d70696c6500000000000000600082015250565b60006140686019836138fd565b915061407382614032565b602082019050919050565b600060208201905081810360008301526140978161405b565b9050919050565b7f63616c6c636f6465000000000000000000000000000000000000000000000000600082015250565b60006140d4600883613ca3565b91506140df8261409e565b600882019050919050565b60006140f5826140c7565b9150819050919050565b7f696e76616c69642063616c6c7479706500000000000000000000000000000000600082015250565b60006141356010836138fd565b9150614140826140ff565b602082019050919050565b6000602082019050818103600083015261416481614128565b9050919050565b600081549050919050565b60008190508160005260206000209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806141d257607f821691505b6020821081036141e5576141e461418b565b5b50919050565b60008190508160005260206000209050919050565b6000815461420d816141ba565b61421781866122ca565b9450600182166000811461423257600181146142485761427b565b60ff19831686528115156020028601935061427b565b614251856141eb565b60005b8381101561427357815481890152600182019150602081019050614254565b808801955050505b50505092915050565b60006142908383614200565b905092915050565b6000600182019050919050565b60006142b08261416b565b6142ba8185613728565b9350836020820285016142cc85614176565b8060005b85811015614307578484038952816142e88582614284565b94506142f383614298565b925060208a019950506001810190506142d0565b50829750879550505050505092915050565b600060608201905061432e6000830186613719565b61433b60208301856126e6565b818103604083015261434d81846142a5565b9050949350505050565b7f64656c65676174696f6e20617070726f76616c206661696c6564000000000000600082015250565b600061438d601a836138fd565b915061439882614357565b602082019050919050565b600060208201905081810360008301526143bc81614380565b9050919050565b60006040820190506143d86000830185613719565b6143e560208301846126e6565b9392505050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000614422600f836138fd565b915061442d826143ec565b602082019050919050565b6000602082019050818103600083015261445181614415565b9050919050565b600060608201905061446d6000830186613719565b818103602083015261447f8185613c3a565b905061448e60408301846126e6565b949350505050565b7f5374616b696e6720417070726f7665206661696c656400000000000000000000600082015250565b60006144cc6016836138fd565b91506144d782614496565b602082019050919050565b600060208201905081810360008301526144fb816144bf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061453c826121e8565b9150614547836121e8565b925082820190508082111561455f5761455e614502565b5b92915050565b600067ffffffffffffffff8211156145805761457f612530565b5b602082029050602081019050919050565b6000815190506145a0816132cb565b92915050565b600060c082840312156145bc576145bb613220565b5b6145c660c0612590565b905060006145d684828501613a7c565b60008301525060206145ea84828501613a7c565b60208301525060406145fe84828501613a50565b604083015250606061461284828501613a50565b606083015250608061462684828501614591565b60808301525060a061463a84828501613a7c565b60a08301525092915050565b600061465961465484614565565b612590565b90508083825260208201905060c0840283018581111561467c5761467b61218d565b5b835b818110156146a5578061469188826145a6565b84526020840193505060c08101905061467e565b5050509392505050565b600082601f8301126146c4576146c3612183565b5b81516146d4848260208601614646565b91505092915050565b6000606082840312156146f3576146f2613220565b5b6146fd6060612590565b9050600082015167ffffffffffffffff81111561471d5761471c613225565b5b614729848285016139fd565b600083015250602082015167ffffffffffffffff81111561474d5761474c613225565b5b614759848285016139fd565b602083015250604082015167ffffffffffffffff81111561477d5761477c613225565b5b614789848285016146af565b60408301525092915050565b6000602082840312156147ab576147aa61211b565b5b600082015167ffffffffffffffff8111156147c9576147c8612120565b5b6147d5848285016146dd565b91505092915050565b60006060820190506147f36000830186613719565b81810360208301526148058185613c3a565b905081810360408301526148198184613c3a565b9050949350505050565b600067ffffffffffffffff82111561483e5761483d612530565b5b602082029050602081019050919050565b60006080828403121561486557614864613220565b5b61486f6080612590565b9050600061487f84828501613a7c565b600083015250602061489384828501613a7c565b60208301525060406148a784828501613a50565b60408301525060606148bb84828501613a50565b60608301525092915050565b60006148da6148d584614823565b612590565b905080838252602082019050608084028301858111156148fd576148fc61218d565b5b835b818110156149265780614912888261484f565b8452602084019350506080810190506148ff565b5050509392505050565b600082601f83011261494557614944612183565b5b81516149558482602086016148c7565b91505092915050565b60006080828403121561497457614973613220565b5b61497e6080612590565b9050600082015167ffffffffffffffff81111561499e5761499d613225565b5b6149aa848285016139fd565b600083015250602082015167ffffffffffffffff8111156149ce576149cd613225565b5b6149da848285016139fd565b602083015250604082015167ffffffffffffffff8111156149fe576149fd613225565b5b614a0a848285016139fd565b604083015250606082015167ffffffffffffffff811115614a2e57614a2d613225565b5b614a3a84828501614930565b60608301525092915050565b600060208284031215614a5c57614a5b61211b565b5b600082015167ffffffffffffffff811115614a7a57614a79612120565b5b614a868482850161495e565b91505092915050565b6000608082019050614aa46000830187613719565b8181036020830152614ab68186613c3a565b9050614ac560408301856126e6565b614ad260608301846126e6565b95945050505050565b7f44656c656761746520417070726f7665206661696c6564000000000000000000600082015250565b6000614b116017836138fd565b9150614b1c82614adb565b602082019050919050565b60006020820190508181036000830152614b4081614b04565b9050919050565b600060208284031215614b5d57614b5c61211b565b5b6000614b6b84828501613a7c565b91505092915050565b6000608082019050614b896000830187613719565b8181036020830152614b9b8186613c3a565b90508181036040830152614baf8185613c3a565b9050614bbe60608301846126e6565b95945050505050565b60008083356001602003843603038112614be457614be3613790565b5b83810192508235915060208301925067ffffffffffffffff821115614c0c57614c0b613786565b5b600182023603831315614c2257614c2161378b565b5b509250929050565b6000614c36838561307f565b9350614c438385846125dc565b614c4c83612305565b840190509392505050565b6000614c6660208401846132e2565b905092915050565b6000614c7d602084018461330e565b905092915050565b600060a08301614c986000840184614bc7565b8583036000870152614cab838284614c2a565b92505050614cbc6020840184614c57565b614cc960208601826128c9565b50614cd76040840184614c57565b614ce460408601826128c9565b50614cf26060840184614c6e565b614cff606086018261235b565b50614d0d6080840184614c6e565b614d1a608086018261235b565b508091505092915050565b60006040820190508181036000830152614d3f8185613c3a565b90508181036020830152614d538184614c85565b90509392505050565b600067ffffffffffffffff821115614d7757614d76612530565b5b602082029050602081019050919050565b6000614d9b614d9684614d5c565b612590565b90508083825260208201905060208402830185811115614dbe57614dbd61218d565b5b835b81811015614e0557805167ffffffffffffffff811115614de357614de2612183565b5b808601614df08982613a91565b85526020850194505050602081019050614dc0565b5050509392505050565b600082601f830112614e2457614e23612183565b5b8151614e34848260208601614d88565b91505092915050565b6000614e50614e4b8461322a565b612590565b905082815260208101848484011115614e6c57614e6b61252b565b5b614e778482856122db565b509392505050565b600082601f830112614e9457614e93612183565b5b8151614ea4848260208601614e3d565b91505092915050565b600060408284031215614ec357614ec2613220565b5b614ecd6040612590565b9050600082015167ffffffffffffffff811115614eed57614eec613225565b5b614ef984828501614e7f565b6000830152506020614f0d84828501614591565b60208301525092915050565b60008060408385031215614f3057614f2f61211b565b5b600083015167ffffffffffffffff811115614f4e57614f4d612120565b5b614f5a85828601614e0f565b925050602083015167ffffffffffffffff811115614f7b57614f7a612120565b5b614f8785828601614ead565b9150509250929050565b6000606082019050614fa66000830186613719565b614fb36020830185613719565b8181036040830152614fc58184613c3a565b9050949350505050565b600060208284031215614fe557614fe461211b565b5b6000614ff384828501613a50565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b6000819050602082019050919050565b60006150528383612316565b905092915050565b6000602082019050919050565b60006150728261502b565b61507c8185613728565b93508360208202850161508e85615036565b8060005b858110156150ca57848403895281516150ab8582615046565b94506150b68361505a565b925060208a01995050600181019050615092565b50829750879550505050505092915050565b60006060820190506150f16000830186613719565b6150fe60208301856126e6565b81810360408301526151108184615067565b9050949350505050565b7f6661696c656420746f20617070726f766520756e64656c65676174696f6e206d60008201527f6574686f64000000000000000000000000000000000000000000000000000000602082015250565b60006151766025836138fd565b91506151818261511a565b604082019050919050565b600060208201905081810360008301526151a581615169565b9050919050565b60006040820190506151c16000830186613719565b81810360208301526151d4818486613805565b9050949350505050565b7f4661696c656420746f207265766f6b6520617070726f76616c20666f7220737460008201527f616b696e67206d6574686f647300000000000000000000000000000000000000602082015250565b600061523a602d836138fd565b9150615245826151de565b604082019050919050565b600060208201905081810360008301526152698161522d565b9050919050565b600060a083016000830151848203600086015261528d8282613090565b91505060208301516152a260208601826128c9565b5060408301516152b560408601826128c9565b5060608301516152c8606086018261235b565b5060808301516152db608086018261235b565b508091505092915050565b60006080820190506152fb6000830187613719565b818103602083015261530d8186613c3a565b905081810360408301526153218185613c3a565b905081810360608301526153358184615270565b905095945050505050565b600067ffffffffffffffff82111561535b5761535a612530565b5b602082029050602081019050919050565b60006080828403121561538257615381613220565b5b61538c6080612590565b9050600082015167ffffffffffffffff8111156153ac576153ab613225565b5b6153b8848285016139fd565b600083015250602082015167ffffffffffffffff8111156153dc576153db613225565b5b6153e8848285016139fd565b602083015250604082015167ffffffffffffffff81111561540c5761540b613225565b5b615418848285016139fd565b604083015250606082015167ffffffffffffffff81111561543c5761543b613225565b5b61544884828501614930565b60608301525092915050565b600067ffffffffffffffff82111561546f5761546e612530565b5b602082029050602081019050919050565b600060a0828403121561549657615495613220565b5b6154a06040612590565b905060006154b08482850161484f565b60008301525060806154c484828501613a50565b60208301525092915050565b60006154e36154de84615454565b612590565b90508083825260208201905060a084028301858111156155065761550561218d565b5b835b8181101561552f578061551b8882615480565b84526020840193505060a081019050615508565b5050509392505050565b600082601f83011261554e5761554d612183565b5b815161555e8482602086016154d0565b91505092915050565b60006040828403121561557d5761557c613220565b5b6155876040612590565b9050600082015167ffffffffffffffff8111156155a7576155a6613225565b5b6155b38482850161536c565b600083015250602082015167ffffffffffffffff8111156155d7576155d6613225565b5b6155e384828501615539565b60208301525092915050565b60006156026155fd84615340565b612590565b905080838252602082019050602084028301858111156156255761562461218d565b5b835b8181101561566c57805167ffffffffffffffff81111561564a57615649612183565b5b8086016156578982615567565b85526020850194505050602081019050615627565b5050509392505050565b600082601f83011261568b5761568a612183565b5b815161569b8482602086016155ef565b91505092915050565b600080604083850312156156bb576156ba61211b565b5b600083015167ffffffffffffffff8111156156d9576156d8612120565b5b6156e585828601615676565b925050602083015167ffffffffffffffff81111561570657615705612120565b5b61571285828601614ead565b915050925092905056fe2f636f736d6f732e7374616b696e672e763162657461312e4d7367556e64656c6567617465a2646970667358221220e656b9b6229ff8e67e677d7173ae54f1b8a22f82708ce4c11af73361ed5cf47264736f6c634300081200332f636f736d6f732e7374616b696e672e763162657461312e4d736744656c6567617465" + "_format": "hh-sol-artifact-1", + "contractName": "StakingCaller", + "sourceName": "solidity/precompiles/staking/testdata/StakingCaller.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "string", + "name": "_validatorAddr", + "type": "string" + } + ], + "name": "approveDepositAndDelegate", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_validatorAddr", + "type": "string" + } + ], + "name": "approveDepositAndDelegateExceedingAllowance", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_validatorAddr", + "type": "string" + } + ], + "name": "approveDepositDelegateAndFailCustomLogic", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_contract", + "type": "address" + }, + { + "internalType": "string", + "name": "_validatorAddr", + "type": "string" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "callERC20AndDelegate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "counter", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_grantee", + "type": "address" + }, + { + "internalType": "string", + "name": "method", + "type": "string" + } + ], + "name": "getAllowance", + "outputs": [ + { + "internalType": "uint256", + "name": "allowance", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_addr", + "type": "address" + }, + { + "internalType": "string", + "name": "_validatorAddr", + "type": "string" + } + ], + "name": "getDelegation", + "outputs": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Coin", + "name": "balance", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_addr", + "type": "address" + }, + { + "internalType": "string", + "name": "_validatorSrcAddr", + "type": "string" + }, + { + "internalType": "string", + "name": "_validatorDstAddr", + "type": "string" + } + ], + "name": "getRedelegation", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "delegatorAddress", + "type": "string" + }, + { + "internalType": "string", + "name": "validatorSrcAddress", + "type": "string" + }, + { + "internalType": "string", + "name": "validatorDstAddress", + "type": "string" + }, + { + "components": [ + { + "internalType": "int64", + "name": "creationHeight", + "type": "int64" + }, + { + "internalType": "int64", + "name": "completionTime", + "type": "int64" + }, + { + "internalType": "uint256", + "name": "initialBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sharesDst", + "type": "uint256" + } + ], + "internalType": "struct RedelegationEntry[]", + "name": "entries", + "type": "tuple[]" + } + ], + "internalType": "struct RedelegationOutput", + "name": "redelegation", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_delegatorAddr", + "type": "address" + }, + { + "internalType": "string", + "name": "_validatorSrcAddr", + "type": "string" + }, + { + "internalType": "string", + "name": "_validatorDstAddr", + "type": "string" + }, + { + "components": [ + { + "internalType": "bytes", + "name": "key", + "type": "bytes" + }, + { + "internalType": "uint64", + "name": "offset", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "limit", + "type": "uint64" + }, + { + "internalType": "bool", + "name": "countTotal", + "type": "bool" + }, + { + "internalType": "bool", + "name": "reverse", + "type": "bool" + } + ], + "internalType": "struct PageRequest", + "name": "_pageRequest", + "type": "tuple" + } + ], + "name": "getRedelegations", + "outputs": [ + { + "components": [ + { + "components": [ + { + "internalType": "string", + "name": "delegatorAddress", + "type": "string" + }, + { + "internalType": "string", + "name": "validatorSrcAddress", + "type": "string" + }, + { + "internalType": "string", + "name": "validatorDstAddress", + "type": "string" + }, + { + "components": [ + { + "internalType": "int64", + "name": "creationHeight", + "type": "int64" + }, + { + "internalType": "int64", + "name": "completionTime", + "type": "int64" + }, + { + "internalType": "uint256", + "name": "initialBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sharesDst", + "type": "uint256" + } + ], + "internalType": "struct RedelegationEntry[]", + "name": "entries", + "type": "tuple[]" + } + ], + "internalType": "struct Redelegation", + "name": "redelegation", + "type": "tuple" + }, + { + "components": [ + { + "components": [ + { + "internalType": "int64", + "name": "creationHeight", + "type": "int64" + }, + { + "internalType": "int64", + "name": "completionTime", + "type": "int64" + }, + { + "internalType": "uint256", + "name": "initialBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sharesDst", + "type": "uint256" + } + ], + "internalType": "struct RedelegationEntry", + "name": "redelegationEntry", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + } + ], + "internalType": "struct RedelegationEntryResponse[]", + "name": "entries", + "type": "tuple[]" + } + ], + "internalType": "struct RedelegationResponse[]", + "name": "response", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "bytes", + "name": "nextKey", + "type": "bytes" + }, + { + "internalType": "uint64", + "name": "total", + "type": "uint64" + } + ], + "internalType": "struct PageResponse", + "name": "pageResponse", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_addr", + "type": "address" + }, + { + "internalType": "string", + "name": "_validatorAddr", + "type": "string" + } + ], + "name": "getUnbondingDelegation", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "delegatorAddress", + "type": "string" + }, + { + "internalType": "string", + "name": "validatorAddress", + "type": "string" + }, + { + "components": [ + { + "internalType": "int64", + "name": "creationHeight", + "type": "int64" + }, + { + "internalType": "int64", + "name": "completionTime", + "type": "int64" + }, + { + "internalType": "uint256", + "name": "initialBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "uint64", + "name": "unbondingId", + "type": "uint64" + }, + { + "internalType": "int64", + "name": "unbondingOnHoldRefCount", + "type": "int64" + } + ], + "internalType": "struct UnbondingDelegationEntry[]", + "name": "entries", + "type": "tuple[]" + } + ], + "internalType": "struct UnbondingDelegationOutput", + "name": "unbondingDelegation", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_validatorAddr", + "type": "address" + } + ], + "name": "getValidator", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "operatorAddress", + "type": "string" + }, + { + "internalType": "string", + "name": "consensusPubkey", + "type": "string" + }, + { + "internalType": "bool", + "name": "jailed", + "type": "bool" + }, + { + "internalType": "enum BondStatus", + "name": "status", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "delegatorShares", + "type": "uint256" + }, + { + "internalType": "string", + "name": "description", + "type": "string" + }, + { + "internalType": "int64", + "name": "unbondingHeight", + "type": "int64" + }, + { + "internalType": "int64", + "name": "unbondingTime", + "type": "int64" + }, + { + "internalType": "uint256", + "name": "commission", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minSelfDelegation", + "type": "uint256" + } + ], + "internalType": "struct Validator", + "name": "validator", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_status", + "type": "string" + }, + { + "components": [ + { + "internalType": "bytes", + "name": "key", + "type": "bytes" + }, + { + "internalType": "uint64", + "name": "offset", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "limit", + "type": "uint64" + }, + { + "internalType": "bool", + "name": "countTotal", + "type": "bool" + }, + { + "internalType": "bool", + "name": "reverse", + "type": "bool" + } + ], + "internalType": "struct PageRequest", + "name": "_pageRequest", + "type": "tuple" + } + ], + "name": "getValidators", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "operatorAddress", + "type": "string" + }, + { + "internalType": "string", + "name": "consensusPubkey", + "type": "string" + }, + { + "internalType": "bool", + "name": "jailed", + "type": "bool" + }, + { + "internalType": "enum BondStatus", + "name": "status", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "delegatorShares", + "type": "uint256" + }, + { + "internalType": "string", + "name": "description", + "type": "string" + }, + { + "internalType": "int64", + "name": "unbondingHeight", + "type": "int64" + }, + { + "internalType": "int64", + "name": "unbondingTime", + "type": "int64" + }, + { + "internalType": "uint256", + "name": "commission", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minSelfDelegation", + "type": "uint256" + } + ], + "internalType": "struct Validator[]", + "name": "validators", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "bytes", + "name": "nextKey", + "type": "bytes" + }, + { + "internalType": "uint64", + "name": "total", + "type": "uint64" + } + ], + "internalType": "struct PageResponse", + "name": "pageResponse", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_addr", + "type": "address" + }, + { + "internalType": "string[]", + "name": "_methods", + "type": "string[]" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "testApprove", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_addr", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_approveAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_undelegateAmount", + "type": "uint256" + }, + { + "internalType": "string", + "name": "_validatorAddr", + "type": "string" + } + ], + "name": "testApproveAndThenUndelegate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_addr", + "type": "address" + }, + { + "internalType": "string", + "name": "_validatorAddr", + "type": "string" + }, + { + "internalType": "string", + "name": "_calltype", + "type": "string" + } + ], + "name": "testCallDelegation", + "outputs": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Coin", + "name": "coin", + "type": "tuple" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_addr", + "type": "address" + }, + { + "internalType": "string", + "name": "_validatorAddr", + "type": "string" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "string", + "name": "_calltype", + "type": "string" + } + ], + "name": "testCallUndelegate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_addr", + "type": "address" + }, + { + "internalType": "string", + "name": "_validatorAddr", + "type": "string" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_creationHeight", + "type": "uint256" + } + ], + "name": "testCancelUnbonding", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_addr", + "type": "address" + }, + { + "internalType": "string", + "name": "_validatorAddr", + "type": "string" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "testDelegate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_validatorAddr", + "type": "string" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "testDelegateIncrementCounter", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_addr", + "type": "address" + }, + { + "internalType": "string", + "name": "_validatorSrcAddr", + "type": "string" + }, + { + "internalType": "string", + "name": "_validatorDstAddr", + "type": "string" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "testRedelegate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_grantee", + "type": "address" + }, + { + "internalType": "string[]", + "name": "_methods", + "type": "string[]" + } + ], + "name": "testRevoke", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_addr", + "type": "address" + }, + { + "internalType": "string", + "name": "_validatorAddr", + "type": "string" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "testUndelegate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6080604052604051806020016040528060405180606001604052806023815260200162005c286023913981525060019060016200003e92919062000053565b503480156200004c57600080fd5b50620004a1565b828054828255906000526020600020908101928215620000a0579160200282015b828111156200009f5782518290816200008e9190620003ba565b509160200191906001019062000074565b5b509050620000af9190620000b3565b5090565b5b80821115620000d75760008181620000cd9190620000db565b50600101620000b4565b5090565b508054620000e990620001a9565b6000825580601f10620000fd57506200011e565b601f0160209004906000526020600020908101906200011d919062000121565b5b50565b5b808211156200013c57600081600090555060010162000122565b5090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620001c257607f821691505b602082108103620001d857620001d76200017a565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620002427fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000203565b6200024e868362000203565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200029b620002956200028f8462000266565b62000270565b62000266565b9050919050565b6000819050919050565b620002b7836200027a565b620002cf620002c682620002a2565b84845462000210565b825550505050565b600090565b620002e6620002d7565b620002f3818484620002ac565b505050565b5b818110156200031b576200030f600082620002dc565b600181019050620002f9565b5050565b601f8211156200036a576200033481620001de565b6200033f84620001f3565b810160208510156200034f578190505b620003676200035e85620001f3565b830182620002f8565b50505b505050565b600082821c905092915050565b60006200038f600019846008026200036f565b1980831691505092915050565b6000620003aa83836200037c565b9150826002028217905092915050565b620003c58262000140565b67ffffffffffffffff811115620003e157620003e06200014b565b5b620003ed8254620001a9565b620003fa8282856200031f565b600060209050601f8311600181146200043257600084156200041d578287015190505b6200042985826200039c565b86555062000499565b601f1984166200044286620001de565b60005b828110156200046c5784890151825560018201915060208501945060208101905062000445565b868310156200048c578489015162000488601f8916826200037c565b8355505b6001600288020188555050505b505050505050565b61577780620004b16000396000f3fe6080604052600436106101355760003560e01c80637e51b811116100ab578063cf2753cf1161006f578063cf2753cf14610418578063ec9485df14610456578063f40a214614610493578063f5714e64146104bc578063f700dbd2146104d8578063f732b0651461050157610135565b80637e51b811146103435780638939e7831461036c5780638edb3f8b146103955780639eab6711146103b1578063b13d4242146103da57610135565b8063455b8551116100fd578063455b85511461023057806355dc4b221461026d578063570467ac146102965780635e269bfe146102d357806360deaa2a146102fc57806361bc221a1461031857610135565b80630a4433e21461013a5780631904bb2e1461016357806319b16c4c146101a057806331bcbcb3146101de5780633566cb9514610207575b600080fd5b34801561014657600080fd5b50610161600480360381019061015c919061221e565b61053f565b005b34801561016f57600080fd5b5061018a60048036038101906101859190612292565b61060e565b6040516101979190612509565b60405180910390f35b3480156101ac57600080fd5b506101c760048036038101906101c2919061265b565b61069e565b6040516101d5929190612732565b60405180910390f35b3480156101ea57600080fd5b5061020560048036038101906102009190612762565b610b9d565b005b34801561021357600080fd5b5061022e600480360381019061022991906127d1565b610e2a565b005b34801561023c57600080fd5b506102576004803603810190610252919061282d565b610f92565b6040516102649190612a34565b60405180910390f35b34801561027957600080fd5b50610294600480360381019061028f9190612a56565b611025565b005b3480156102a257600080fd5b506102bd60048036038101906102b8919061265b565b611417565b6040516102ca9190612c71565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f59190612c93565b6114ad565b005b61031660048036038101906103119190612d16565b611538565b005b34801561032457600080fd5b5061032d611686565b60405161033a9190612d5f565b60405180910390f35b34801561034f57600080fd5b5061036a60048036038101906103659190612762565b61168c565b005b34801561037857600080fd5b50610393600480360381019061038e9190612762565b611714565b005b6103af60048036038101906103aa9190612d16565b61179c565b005b3480156103bd57600080fd5b506103d860048036038101906103d39190612d7a565b611931565b005b3480156103e657600080fd5b5061040160048036038101906103fc9190612e3d565b6119bc565b60405161040f929190613106565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a919061282d565b611a54565b60405161044d929190612732565b60405180910390f35b34801561046257600080fd5b5061047d6004803603810190610478919061282d565b611aec565b60405161048a9190612d5f565b60405180910390f35b34801561049f57600080fd5b506104ba60048036038101906104b5919061313d565b611b76565b005b6104d660048036038101906104d19190612d16565b611d52565b005b3480156104e457600080fd5b506104ff60048036038101906104fa91906131c0565b611eac565b005b34801561050d57600080fd5b50610528600480360381019061052391906133cb565b611f78565b6040516105369291906136e2565b60405180910390f35b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895868487876040518563ffffffff1660e01b8152600401610582949392919061387b565b6020604051808303816000875af11580156105a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c591906138d0565b905080610607576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105fe90613980565b60405180910390fd5b5050505050565b610616612016565b61080073ffffffffffffffffffffffffffffffffffffffff1663223b3b7a836040518263ffffffff1660e01b815260040161065191906139a0565b600060405180830381865afa15801561066e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906106979190613bf1565b9050919050565b60006106a861208a565b60006108009050600086866040516024016106c4929190613c73565b6040516020818303038152906040527f241774e6000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000856040516020016107569190613cdf565b60405160208183030381529060405280519060200120905060405160200161077d90613d42565b604051602081830303815290604052805190602001208103610869576000808473ffffffffffffffffffffffffffffffffffffffff16846040516107c19190613d93565b600060405180830381855af49150503d80600081146107fc576040519150601f19603f3d011682016040523d82523d6000602084013e610801565b606091505b509150915081610846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083d90613e1c565b60405180910390fd5b8080602001905181019061085a9190613ea8565b80975081985050505050610b92565b60405160200161087890613f50565b604051602081830303815290604052805190602001208103610964576000808473ffffffffffffffffffffffffffffffffffffffff16846040516108bc9190613d93565b600060405180830381855afa9150503d80600081146108f7576040519150601f19603f3d011682016040523d82523d6000602084013e6108fc565b606091505b509150915081610941576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093890613fb1565b60405180910390fd5b808060200190518101906109559190613ea8565b80975081985050505050610b91565b6040516020016109739061401d565b604051602081830303815290604052805190602001208103610a61576000808473ffffffffffffffffffffffffffffffffffffffff16846040516109b79190613d93565b6000604051808303816000865af19150503d80600081146109f4576040519150601f19603f3d011682016040523d82523d6000602084013e6109f9565b606091505b509150915081610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a359061407e565b60405180910390fd5b80806020019051810190610a529190613ea8565b80975081985050505050610b90565b604051602001610a70906140ea565b604051602081830303815290604052805190602001208103610b545760006040518060400160405280601a81526020017f64656c65676174696f6e28616464726573732c737472696e6729000000000000815250805190602001209050600060a490506060600060208b01516020808d0101516040518681528e6004820152604060248201526033604482015282606482015281608482015260c081878360008e5af281519c5060608201519450610100820160405280610b3057600080fd5b50505050604051806040016040528083815260200182815250975050505050610b8f565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b869061414b565b60405180910390fd5b5b5b5b505050935093915050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610bdf93929190614319565b6020604051808303816000875af1158015610bfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2291906138d0565b905080610c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5b906143a3565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff163384604051602401610c909291906143c3565b6040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610d1a9190613d93565b6000604051808303816000865af19150503d8060008114610d57576040519150601f19603f3d011682016040523d82523d6000602084013e610d5c565b606091505b5050905080610da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9790614438565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3386866040518463ffffffff1660e01b8152600401610ddf93929190614458565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906138d0565b505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610e6c93929190614319565b6020604051808303816000875af1158015610e8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eaf91906138d0565b905080610ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee8906144e2565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3085856040518463ffffffff1660e01b8152600401610f3093929190614458565b6020604051808303816000875af1158015610f4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7391906138d0565b506001600080828254610f869190614531565b92505081905550505050565b610f9a6120a4565b61080073ffffffffffffffffffffffffffffffffffffffff1663a03ffee184846040518363ffffffff1660e01b8152600401610fd7929190613c73565b600060405180830381865afa158015610ff4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061101d9190614795565b905092915050565b60006108009050600085858560405160240161104393929190614458565b6040516020818303038152906040527f3edab33c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000836040516020016110d59190613cdf565b6040516020818303038152906040528051906020012090506040516020016110fc90613d42565b6040516020818303038152906040528051906020012081036111c95760008373ffffffffffffffffffffffffffffffffffffffff168360405161113f9190613d93565b600060405180830381855af49150503d806000811461117a576040519150601f19603f3d011682016040523d82523d6000602084013e61117f565b606091505b50509050806111c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ba90613e1c565b60405180910390fd5b5061140e565b6040516020016111d890613f50565b6040516020818303038152906040528051906020012081036112a55760008373ffffffffffffffffffffffffffffffffffffffff168360405161121b9190613d93565b600060405180830381855afa9150503d8060008114611256576040519150601f19603f3d011682016040523d82523d6000602084013e61125b565b606091505b505090508061129f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129690613fb1565b60405180910390fd5b5061140d565b6040516020016112b49061401d565b6040516020818303038152906040528051906020012081036113835760008373ffffffffffffffffffffffffffffffffffffffff16836040516112f79190613d93565b6000604051808303816000865af19150503d8060008114611334576040519150601f19603f3d011682016040523d82523d6000602084013e611339565b606091505b505090508061137d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113749061407e565b60405180910390fd5b5061140c565b604051602001611392906140ea565b6040516020818303038152906040528051906020012081036113d05760208201825160008082846000895af2806113c857600080fd5b50505061140b565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114029061414b565b60405180910390fd5b5b5b5b50505050505050565b61141f6120c5565b61080073ffffffffffffffffffffffffffffffffffffffff16637d9f939c8585856040518463ffffffff1660e01b815260040161145e939291906147de565b600060405180830381865afa15801561147b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906114a49190614a46565b90509392505050565b61080073ffffffffffffffffffffffffffffffffffffffff166312d58dfe858585856040518563ffffffff1660e01b81526004016114ee9493929190614a8f565b6020604051808303816000875af115801561150d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153191906138d0565b5050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895303460016040518463ffffffff1660e01b815260040161157a93929190614319565b6020604051808303816000875af1158015611599573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115bd91906138d0565b9050806115ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f690614b27565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b815260040161163e93929190614458565b6020604051808303816000875af115801561165d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168191906138d0565b505050565b60005481565b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c8484846040518463ffffffff1660e01b81526004016116cb93929190614458565b6020604051808303816000875af11580156116ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170e9190614b47565b50505050565b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb8484846040518463ffffffff1660e01b815260040161175393929190614458565b6020604051808303816000875af1158015611772573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179691906138d0565b50505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b81526004016117de93929190614319565b6020604051808303816000875af11580156117fd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182191906138d0565b905080611863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185a90614b27565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b81526004016118a293929190614458565b6020604051808303816000875af11580156118c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e591906138d0565b503373ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f1935050505015801561192c573d6000803e3d6000fd5b505050565b61080073ffffffffffffffffffffffffffffffffffffffff166354b826f5858585856040518563ffffffff1660e01b81526004016119729493929190614b74565b6020604051808303816000875af1158015611991573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b59190614b47565b5050505050565b60606119c66120ed565b61080073ffffffffffffffffffffffffffffffffffffffff1663186b216785856040518363ffffffff1660e01b8152600401611a03929190614d25565b600060405180830381865afa158015611a20573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611a499190614f19565b915091509250929050565b6000611a5e61208a565b61080073ffffffffffffffffffffffffffffffffffffffff1663241774e685856040518363ffffffff1660e01b8152600401611a9b929190613c73565b600060405180830381865afa158015611ab8573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611ae19190613ea8565b915091509250929050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663fc08930c8433856040518463ffffffff1660e01b8152600401611b2d93929190614f91565b602060405180830381865afa158015611b4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6e9190614fcf565b905092915050565b6000600167ffffffffffffffff811115611b9357611b92612530565b5b604051908082528060200260200182016040528015611bc657816020015b6060815260200190600190039081611bb15790505b50905060405180606001604052806025815260200161571d6025913981600081518110611bf657611bf5614ffc565b5b6020026020010181905250600061080073ffffffffffffffffffffffffffffffffffffffff1663b60398958787856040518463ffffffff1660e01b8152600401611c42939291906150dc565b6020604051808303816000875af1158015611c61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8591906138d0565b905080611cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbe9061518c565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c3285876040518463ffffffff1660e01b8152600401611d0693929190614458565b6020604051808303816000875af1158015611d25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d499190614b47565b50505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b8152600401611d9493929190614319565b6020604051808303816000875af1158015611db3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd791906138d0565b905080611e19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1090614b27565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084600134611e469190614531565b6040518463ffffffff1660e01b8152600401611e6493929190614458565b6020604051808303816000875af1158015611e83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea791906138d0565b505050565b600061080073ffffffffffffffffffffffffffffffffffffffff166361dc5c3b8585856040518463ffffffff1660e01b8152600401611eed939291906151ac565b6020604051808303816000875af1158015611f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f3091906138d0565b905080611f72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6990615250565b60405180910390fd5b50505050565b6060611f826120ed565b61080073ffffffffffffffffffffffffffffffffffffffff166310a2851c878787876040518563ffffffff1660e01b8152600401611fc394939291906152e6565b600060405180830381865afa158015611fe0573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061200991906156a4565b9150915094509492505050565b60405180610160016040528060608152602001606081526020016000151581526020016000600381111561204d5761204c61236a565b5b8152602001600081526020016000815260200160608152602001600060070b8152602001600060070b815260200160008152602001600081525090565b604051806040016040528060608152602001600081525090565b60405180606001604052806060815260200160608152602001606081525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061215082612125565b9050919050565b61216081612145565b811461216b57600080fd5b50565b60008135905061217d81612157565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126121a8576121a7612183565b5b8235905067ffffffffffffffff8111156121c5576121c4612188565b5b6020830191508360208202830111156121e1576121e061218d565b5b9250929050565b6000819050919050565b6121fb816121e8565b811461220657600080fd5b50565b600081359050612218816121f2565b92915050565b600080600080606085870312156122385761223761211b565b5b60006122468782880161216e565b945050602085013567ffffffffffffffff81111561226757612266612120565b5b61227387828801612192565b9350935050604061228687828801612209565b91505092959194509250565b6000602082840312156122a8576122a761211b565b5b60006122b68482850161216e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156122f95780820151818401526020810190506122de565b60008484015250505050565b6000601f19601f8301169050919050565b6000612321826122bf565b61232b81856122ca565b935061233b8185602086016122db565b61234481612305565b840191505092915050565b60008115159050919050565b6123648161234f565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106123aa576123a961236a565b5b50565b60008190506123bb82612399565b919050565b60006123cb826123ad565b9050919050565b6123db816123c0565b82525050565b6123ea816121e8565b82525050565b60008160070b9050919050565b612406816123f0565b82525050565b600061016083016000830151848203600086015261242a8282612316565b915050602083015184820360208601526124448282612316565b9150506040830151612459604086018261235b565b50606083015161246c60608601826123d2565b50608083015161247f60808601826123e1565b5060a083015161249260a08601826123e1565b5060c083015184820360c08601526124aa8282612316565b91505060e08301516124bf60e08601826123fd565b506101008301516124d46101008601826123fd565b506101208301516124e96101208601826123e1565b506101408301516124fe6101408601826123e1565b508091505092915050565b60006020820190508181036000830152612523818461240c565b905092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61256882612305565b810181811067ffffffffffffffff8211171561258757612586612530565b5b80604052505050565b600061259a612111565b90506125a6828261255f565b919050565b600067ffffffffffffffff8211156125c6576125c5612530565b5b6125cf82612305565b9050602081019050919050565b82818337600083830152505050565b60006125fe6125f9846125ab565b612590565b90508281526020810184848401111561261a5761261961252b565b5b6126258482856125dc565b509392505050565b600082601f83011261264257612641612183565b5b81356126528482602086016125eb565b91505092915050565b6000806000606084860312156126745761267361211b565b5b60006126828682870161216e565b935050602084013567ffffffffffffffff8111156126a3576126a2612120565b5b6126af8682870161262d565b925050604084013567ffffffffffffffff8111156126d0576126cf612120565b5b6126dc8682870161262d565b9150509250925092565b6126ef816121e8565b82525050565b600060408301600083015184820360008601526127128282612316565b915050602083015161272760208601826123e1565b508091505092915050565b600060408201905061274760008301856126e6565b818103602083015261275981846126f5565b90509392505050565b60008060006060848603121561277b5761277a61211b565b5b60006127898682870161216e565b935050602084013567ffffffffffffffff8111156127aa576127a9612120565b5b6127b68682870161262d565b92505060406127c786828701612209565b9150509250925092565b600080604083850312156127e8576127e761211b565b5b600083013567ffffffffffffffff81111561280657612805612120565b5b6128128582860161262d565b925050602061282385828601612209565b9150509250929050565b600080604083850312156128445761284361211b565b5b60006128528582860161216e565b925050602083013567ffffffffffffffff81111561287357612872612120565b5b61287f8582860161262d565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600067ffffffffffffffff82169050919050565b6128d2816128b5565b82525050565b60c0820160008201516128ee60008501826123fd565b50602082015161290160208501826123fd565b50604082015161291460408501826123e1565b50606082015161292760608501826123e1565b50608082015161293a60808501826128c9565b5060a082015161294d60a08501826123fd565b50505050565b600061295f83836128d8565b60c08301905092915050565b6000602082019050919050565b600061298382612889565b61298d8185612894565b9350612998836128a5565b8060005b838110156129c95781516129b08882612953565b97506129bb8361296b565b92505060018101905061299c565b5085935050505092915050565b600060608301600083015184820360008601526129f38282612316565b91505060208301518482036020860152612a0d8282612316565b91505060408301518482036040860152612a278282612978565b9150508091505092915050565b60006020820190508181036000830152612a4e81846129d6565b905092915050565b60008060008060808587031215612a7057612a6f61211b565b5b6000612a7e8782880161216e565b945050602085013567ffffffffffffffff811115612a9f57612a9e612120565b5b612aab8782880161262d565b9350506040612abc87828801612209565b925050606085013567ffffffffffffffff811115612add57612adc612120565b5b612ae98782880161262d565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b608082016000820151612b3760008501826123fd565b506020820151612b4a60208501826123fd565b506040820151612b5d60408501826123e1565b506060820151612b7060608501826123e1565b50505050565b6000612b828383612b21565b60808301905092915050565b6000602082019050919050565b6000612ba682612af5565b612bb08185612b00565b9350612bbb83612b11565b8060005b83811015612bec578151612bd38882612b76565b9750612bde83612b8e565b925050600181019050612bbf565b5085935050505092915050565b60006080830160008301518482036000860152612c168282612316565b91505060208301518482036020860152612c308282612316565b91505060408301518482036040860152612c4a8282612316565b91505060608301518482036060860152612c648282612b9b565b9150508091505092915050565b60006020820190508181036000830152612c8b8184612bf9565b905092915050565b60008060008060808587031215612cad57612cac61211b565b5b6000612cbb8782880161216e565b945050602085013567ffffffffffffffff811115612cdc57612cdb612120565b5b612ce88782880161262d565b9350506040612cf987828801612209565b9250506060612d0a87828801612209565b91505092959194509250565b600060208284031215612d2c57612d2b61211b565b5b600082013567ffffffffffffffff811115612d4a57612d49612120565b5b612d568482850161262d565b91505092915050565b6000602082019050612d7460008301846126e6565b92915050565b60008060008060808587031215612d9457612d9361211b565b5b6000612da28782880161216e565b945050602085013567ffffffffffffffff811115612dc357612dc2612120565b5b612dcf8782880161262d565b935050604085013567ffffffffffffffff811115612df057612def612120565b5b612dfc8782880161262d565b9250506060612e0d87828801612209565b91505092959194509250565b600080fd5b600060a08284031215612e3457612e33612e19565b5b81905092915050565b60008060408385031215612e5457612e5361211b565b5b600083013567ffffffffffffffff811115612e7257612e71612120565b5b612e7e8582860161262d565b925050602083013567ffffffffffffffff811115612e9f57612e9e612120565b5b612eab85828601612e1e565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000610160830160008301518482036000860152612eff8282612316565b91505060208301518482036020860152612f198282612316565b9150506040830151612f2e604086018261235b565b506060830151612f4160608601826123d2565b506080830151612f5460808601826123e1565b5060a0830151612f6760a08601826123e1565b5060c083015184820360c0860152612f7f8282612316565b91505060e0830151612f9460e08601826123fd565b50610100830151612fa96101008601826123fd565b50610120830151612fbe6101208601826123e1565b50610140830151612fd36101408601826123e1565b508091505092915050565b6000612fea8383612ee1565b905092915050565b6000602082019050919050565b600061300a82612eb5565b6130148185612ec0565b93508360208202850161302685612ed1565b8060005b8581101561306257848403895281516130438582612fde565b945061304e83612ff2565b925060208a0199505060018101905061302a565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b600061309b82613074565b6130a5818561307f565b93506130b58185602086016122db565b6130be81612305565b840191505092915050565b600060408301600083015184820360008601526130e68282613090565b91505060208301516130fb60208601826128c9565b508091505092915050565b600060408201905081810360008301526131208185612fff565b9050818103602083015261313481846130c9565b90509392505050565b600080600080608085870312156131575761315661211b565b5b60006131658782880161216e565b945050602061317687828801612209565b935050604061318787828801612209565b925050606085013567ffffffffffffffff8111156131a8576131a7612120565b5b6131b48782880161262d565b91505092959194509250565b6000806000604084860312156131d9576131d861211b565b5b60006131e78682870161216e565b935050602084013567ffffffffffffffff81111561320857613207612120565b5b61321486828701612192565b92509250509250925092565b600080fd5b600080fd5b600067ffffffffffffffff82111561324557613244612530565b5b61324e82612305565b9050602081019050919050565b600061326e6132698461322a565b612590565b90508281526020810184848401111561328a5761328961252b565b5b6132958482856125dc565b509392505050565b600082601f8301126132b2576132b1612183565b5b81356132c284826020860161325b565b91505092915050565b6132d4816128b5565b81146132df57600080fd5b50565b6000813590506132f1816132cb565b92915050565b6133008161234f565b811461330b57600080fd5b50565b60008135905061331d816132f7565b92915050565b600060a0828403121561333957613338613220565b5b61334360a0612590565b9050600082013567ffffffffffffffff81111561336357613362613225565b5b61336f8482850161329d565b6000830152506020613383848285016132e2565b6020830152506040613397848285016132e2565b60408301525060606133ab8482850161330e565b60608301525060806133bf8482850161330e565b60808301525092915050565b600080600080608085870312156133e5576133e461211b565b5b60006133f38782880161216e565b945050602085013567ffffffffffffffff81111561341457613413612120565b5b6134208782880161262d565b935050604085013567ffffffffffffffff81111561344157613440612120565b5b61344d8782880161262d565b925050606085013567ffffffffffffffff81111561346e5761346d612120565b5b61347a87828801613323565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060808301600083015184820360008601526134cf8282612316565b915050602083015184820360208601526134e98282612316565b915050604083015184820360408601526135038282612316565b9150506060830151848203606086015261351d8282612b9b565b9150508091505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60a08201600082015161356c6000850182612b21565b50602082015161357f60808501826123e1565b50505050565b60006135918383613556565b60a08301905092915050565b6000602082019050919050565b60006135b58261352a565b6135bf8185613535565b93506135ca83613546565b8060005b838110156135fb5781516135e28882613585565b97506135ed8361359d565b9250506001810190506135ce565b5085935050505092915050565b6000604083016000830151848203600086015261362582826134b2565b9150506020830151848203602086015261363f82826135aa565b9150508091505092915050565b60006136588383613608565b905092915050565b6000602082019050919050565b600061367882613486565b6136828185613491565b935083602082028501613694856134a2565b8060005b858110156136d057848403895281516136b1858261364c565b94506136bc83613660565b925060208a01995050600181019050613698565b50829750879550505050505092915050565b600060408201905081810360008301526136fc818561366d565b9050818103602083015261371081846130c9565b90509392505050565b61372281612145565b82525050565b600082825260208201905092915050565b6000819050919050565b600061374f83856122ca565b935061375c8385846125dc565b61376583612305565b840190509392505050565b600061377d848484613743565b90509392505050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126137b2576137b1613790565b5b83810192508235915060208301925067ffffffffffffffff8211156137da576137d9613786565b5b6001820236038313156137f0576137ef61378b565b5b509250929050565b6000602082019050919050565b60006138118385613728565b93508360208402850161382384613739565b8060005b8781101561386957848403895261383e8284613795565b613849868284613770565b9550613854846137f8565b935060208b019a505050600181019050613827565b50829750879450505050509392505050565b60006060820190506138906000830187613719565b61389d60208301866126e6565b81810360408301526138b0818486613805565b905095945050505050565b6000815190506138ca816132f7565b92915050565b6000602082840312156138e6576138e561211b565b5b60006138f4848285016138bb565b91505092915050565b600082825260208201905092915050565b7f4661696c656420746f20617070726f7665207374616b696e67206d6574686f6460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061396a6021836138fd565b91506139758261390e565b604082019050919050565b600060208201905081810360008301526139998161395d565b9050919050565b60006020820190506139b56000830184613719565b92915050565b60006139ce6139c9846125ab565b612590565b9050828152602081018484840111156139ea576139e961252b565b5b6139f58482856122db565b509392505050565b600082601f830112613a1257613a11612183565b5b8151613a228482602086016139bb565b91505092915050565b60048110613a3857600080fd5b50565b600081519050613a4a81613a2b565b92915050565b600081519050613a5f816121f2565b92915050565b613a6e816123f0565b8114613a7957600080fd5b50565b600081519050613a8b81613a65565b92915050565b60006101608284031215613aa857613aa7613220565b5b613ab3610160612590565b9050600082015167ffffffffffffffff811115613ad357613ad2613225565b5b613adf848285016139fd565b600083015250602082015167ffffffffffffffff811115613b0357613b02613225565b5b613b0f848285016139fd565b6020830152506040613b23848285016138bb565b6040830152506060613b3784828501613a3b565b6060830152506080613b4b84828501613a50565b60808301525060a0613b5f84828501613a50565b60a08301525060c082015167ffffffffffffffff811115613b8357613b82613225565b5b613b8f848285016139fd565b60c08301525060e0613ba384828501613a7c565b60e083015250610100613bb884828501613a7c565b61010083015250610120613bce84828501613a50565b61012083015250610140613be484828501613a50565b6101408301525092915050565b600060208284031215613c0757613c0661211b565b5b600082015167ffffffffffffffff811115613c2557613c24612120565b5b613c3184828501613a91565b91505092915050565b6000613c45826122bf565b613c4f81856138fd565b9350613c5f8185602086016122db565b613c6881612305565b840191505092915050565b6000604082019050613c886000830185613719565b8181036020830152613c9a8184613c3a565b90509392505050565b600081905092915050565b6000613cb9826122bf565b613cc38185613ca3565b9350613cd38185602086016122db565b80840191505092915050565b6000613ceb8284613cae565b915081905092915050565b7f64656c656761746563616c6c0000000000000000000000000000000000000000600082015250565b6000613d2c600c83613ca3565b9150613d3782613cf6565b600c82019050919050565b6000613d4d82613d1f565b9150819050919050565b600081905092915050565b6000613d6d82613074565b613d778185613d57565b9350613d878185602086016122db565b80840191505092915050565b6000613d9f8284613d62565b915081905092915050565b7f6661696c65642064656c656761746563616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e066021836138fd565b9150613e1182613daa565b604082019050919050565b60006020820190508181036000830152613e3581613df9565b9050919050565b600060408284031215613e5257613e51613220565b5b613e5c6040612590565b9050600082015167ffffffffffffffff811115613e7c57613e7b613225565b5b613e88848285016139fd565b6000830152506020613e9c84828501613a50565b60208301525092915050565b60008060408385031215613ebf57613ebe61211b565b5b6000613ecd85828601613a50565b925050602083015167ffffffffffffffff811115613eee57613eed612120565b5b613efa85828601613e3c565b9150509250929050565b7f73746174696363616c6c00000000000000000000000000000000000000000000600082015250565b6000613f3a600a83613ca3565b9150613f4582613f04565b600a82019050919050565b6000613f5b82613f2d565b9150819050919050565b7f6661696c65642073746174696363616c6c20746f20707265636f6d70696c6500600082015250565b6000613f9b601f836138fd565b9150613fa682613f65565b602082019050919050565b60006020820190508181036000830152613fca81613f8e565b9050919050565b7f63616c6c00000000000000000000000000000000000000000000000000000000600082015250565b6000614007600483613ca3565b915061401282613fd1565b600482019050919050565b600061402882613ffa565b9150819050919050565b7f6661696c65642063616c6c20746f20707265636f6d70696c6500000000000000600082015250565b60006140686019836138fd565b915061407382614032565b602082019050919050565b600060208201905081810360008301526140978161405b565b9050919050565b7f63616c6c636f6465000000000000000000000000000000000000000000000000600082015250565b60006140d4600883613ca3565b91506140df8261409e565b600882019050919050565b60006140f5826140c7565b9150819050919050565b7f696e76616c69642063616c6c7479706500000000000000000000000000000000600082015250565b60006141356010836138fd565b9150614140826140ff565b602082019050919050565b6000602082019050818103600083015261416481614128565b9050919050565b600081549050919050565b60008190508160005260206000209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806141d257607f821691505b6020821081036141e5576141e461418b565b5b50919050565b60008190508160005260206000209050919050565b6000815461420d816141ba565b61421781866122ca565b9450600182166000811461423257600181146142485761427b565b60ff19831686528115156020028601935061427b565b614251856141eb565b60005b8381101561427357815481890152600182019150602081019050614254565b808801955050505b50505092915050565b60006142908383614200565b905092915050565b6000600182019050919050565b60006142b08261416b565b6142ba8185613728565b9350836020820285016142cc85614176565b8060005b85811015614307578484038952816142e88582614284565b94506142f383614298565b925060208a019950506001810190506142d0565b50829750879550505050505092915050565b600060608201905061432e6000830186613719565b61433b60208301856126e6565b818103604083015261434d81846142a5565b9050949350505050565b7f64656c65676174696f6e20617070726f76616c206661696c6564000000000000600082015250565b600061438d601a836138fd565b915061439882614357565b602082019050919050565b600060208201905081810360008301526143bc81614380565b9050919050565b60006040820190506143d86000830185613719565b6143e560208301846126e6565b9392505050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000614422600f836138fd565b915061442d826143ec565b602082019050919050565b6000602082019050818103600083015261445181614415565b9050919050565b600060608201905061446d6000830186613719565b818103602083015261447f8185613c3a565b905061448e60408301846126e6565b949350505050565b7f5374616b696e6720417070726f7665206661696c656400000000000000000000600082015250565b60006144cc6016836138fd565b91506144d782614496565b602082019050919050565b600060208201905081810360008301526144fb816144bf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061453c826121e8565b9150614547836121e8565b925082820190508082111561455f5761455e614502565b5b92915050565b600067ffffffffffffffff8211156145805761457f612530565b5b602082029050602081019050919050565b6000815190506145a0816132cb565b92915050565b600060c082840312156145bc576145bb613220565b5b6145c660c0612590565b905060006145d684828501613a7c565b60008301525060206145ea84828501613a7c565b60208301525060406145fe84828501613a50565b604083015250606061461284828501613a50565b606083015250608061462684828501614591565b60808301525060a061463a84828501613a7c565b60a08301525092915050565b600061465961465484614565565b612590565b90508083825260208201905060c0840283018581111561467c5761467b61218d565b5b835b818110156146a5578061469188826145a6565b84526020840193505060c08101905061467e565b5050509392505050565b600082601f8301126146c4576146c3612183565b5b81516146d4848260208601614646565b91505092915050565b6000606082840312156146f3576146f2613220565b5b6146fd6060612590565b9050600082015167ffffffffffffffff81111561471d5761471c613225565b5b614729848285016139fd565b600083015250602082015167ffffffffffffffff81111561474d5761474c613225565b5b614759848285016139fd565b602083015250604082015167ffffffffffffffff81111561477d5761477c613225565b5b614789848285016146af565b60408301525092915050565b6000602082840312156147ab576147aa61211b565b5b600082015167ffffffffffffffff8111156147c9576147c8612120565b5b6147d5848285016146dd565b91505092915050565b60006060820190506147f36000830186613719565b81810360208301526148058185613c3a565b905081810360408301526148198184613c3a565b9050949350505050565b600067ffffffffffffffff82111561483e5761483d612530565b5b602082029050602081019050919050565b60006080828403121561486557614864613220565b5b61486f6080612590565b9050600061487f84828501613a7c565b600083015250602061489384828501613a7c565b60208301525060406148a784828501613a50565b60408301525060606148bb84828501613a50565b60608301525092915050565b60006148da6148d584614823565b612590565b905080838252602082019050608084028301858111156148fd576148fc61218d565b5b835b818110156149265780614912888261484f565b8452602084019350506080810190506148ff565b5050509392505050565b600082601f83011261494557614944612183565b5b81516149558482602086016148c7565b91505092915050565b60006080828403121561497457614973613220565b5b61497e6080612590565b9050600082015167ffffffffffffffff81111561499e5761499d613225565b5b6149aa848285016139fd565b600083015250602082015167ffffffffffffffff8111156149ce576149cd613225565b5b6149da848285016139fd565b602083015250604082015167ffffffffffffffff8111156149fe576149fd613225565b5b614a0a848285016139fd565b604083015250606082015167ffffffffffffffff811115614a2e57614a2d613225565b5b614a3a84828501614930565b60608301525092915050565b600060208284031215614a5c57614a5b61211b565b5b600082015167ffffffffffffffff811115614a7a57614a79612120565b5b614a868482850161495e565b91505092915050565b6000608082019050614aa46000830187613719565b8181036020830152614ab68186613c3a565b9050614ac560408301856126e6565b614ad260608301846126e6565b95945050505050565b7f44656c656761746520417070726f7665206661696c6564000000000000000000600082015250565b6000614b116017836138fd565b9150614b1c82614adb565b602082019050919050565b60006020820190508181036000830152614b4081614b04565b9050919050565b600060208284031215614b5d57614b5c61211b565b5b6000614b6b84828501613a7c565b91505092915050565b6000608082019050614b896000830187613719565b8181036020830152614b9b8186613c3a565b90508181036040830152614baf8185613c3a565b9050614bbe60608301846126e6565b95945050505050565b60008083356001602003843603038112614be457614be3613790565b5b83810192508235915060208301925067ffffffffffffffff821115614c0c57614c0b613786565b5b600182023603831315614c2257614c2161378b565b5b509250929050565b6000614c36838561307f565b9350614c438385846125dc565b614c4c83612305565b840190509392505050565b6000614c6660208401846132e2565b905092915050565b6000614c7d602084018461330e565b905092915050565b600060a08301614c986000840184614bc7565b8583036000870152614cab838284614c2a565b92505050614cbc6020840184614c57565b614cc960208601826128c9565b50614cd76040840184614c57565b614ce460408601826128c9565b50614cf26060840184614c6e565b614cff606086018261235b565b50614d0d6080840184614c6e565b614d1a608086018261235b565b508091505092915050565b60006040820190508181036000830152614d3f8185613c3a565b90508181036020830152614d538184614c85565b90509392505050565b600067ffffffffffffffff821115614d7757614d76612530565b5b602082029050602081019050919050565b6000614d9b614d9684614d5c565b612590565b90508083825260208201905060208402830185811115614dbe57614dbd61218d565b5b835b81811015614e0557805167ffffffffffffffff811115614de357614de2612183565b5b808601614df08982613a91565b85526020850194505050602081019050614dc0565b5050509392505050565b600082601f830112614e2457614e23612183565b5b8151614e34848260208601614d88565b91505092915050565b6000614e50614e4b8461322a565b612590565b905082815260208101848484011115614e6c57614e6b61252b565b5b614e778482856122db565b509392505050565b600082601f830112614e9457614e93612183565b5b8151614ea4848260208601614e3d565b91505092915050565b600060408284031215614ec357614ec2613220565b5b614ecd6040612590565b9050600082015167ffffffffffffffff811115614eed57614eec613225565b5b614ef984828501614e7f565b6000830152506020614f0d84828501614591565b60208301525092915050565b60008060408385031215614f3057614f2f61211b565b5b600083015167ffffffffffffffff811115614f4e57614f4d612120565b5b614f5a85828601614e0f565b925050602083015167ffffffffffffffff811115614f7b57614f7a612120565b5b614f8785828601614ead565b9150509250929050565b6000606082019050614fa66000830186613719565b614fb36020830185613719565b8181036040830152614fc58184613c3a565b9050949350505050565b600060208284031215614fe557614fe461211b565b5b6000614ff384828501613a50565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b6000819050602082019050919050565b60006150528383612316565b905092915050565b6000602082019050919050565b60006150728261502b565b61507c8185613728565b93508360208202850161508e85615036565b8060005b858110156150ca57848403895281516150ab8582615046565b94506150b68361505a565b925060208a01995050600181019050615092565b50829750879550505050505092915050565b60006060820190506150f16000830186613719565b6150fe60208301856126e6565b81810360408301526151108184615067565b9050949350505050565b7f6661696c656420746f20617070726f766520756e64656c65676174696f6e206d60008201527f6574686f64000000000000000000000000000000000000000000000000000000602082015250565b60006151766025836138fd565b91506151818261511a565b604082019050919050565b600060208201905081810360008301526151a581615169565b9050919050565b60006040820190506151c16000830186613719565b81810360208301526151d4818486613805565b9050949350505050565b7f4661696c656420746f207265766f6b6520617070726f76616c20666f7220737460008201527f616b696e67206d6574686f647300000000000000000000000000000000000000602082015250565b600061523a602d836138fd565b9150615245826151de565b604082019050919050565b600060208201905081810360008301526152698161522d565b9050919050565b600060a083016000830151848203600086015261528d8282613090565b91505060208301516152a260208601826128c9565b5060408301516152b560408601826128c9565b5060608301516152c8606086018261235b565b5060808301516152db608086018261235b565b508091505092915050565b60006080820190506152fb6000830187613719565b818103602083015261530d8186613c3a565b905081810360408301526153218185613c3a565b905081810360608301526153358184615270565b905095945050505050565b600067ffffffffffffffff82111561535b5761535a612530565b5b602082029050602081019050919050565b60006080828403121561538257615381613220565b5b61538c6080612590565b9050600082015167ffffffffffffffff8111156153ac576153ab613225565b5b6153b8848285016139fd565b600083015250602082015167ffffffffffffffff8111156153dc576153db613225565b5b6153e8848285016139fd565b602083015250604082015167ffffffffffffffff81111561540c5761540b613225565b5b615418848285016139fd565b604083015250606082015167ffffffffffffffff81111561543c5761543b613225565b5b61544884828501614930565b60608301525092915050565b600067ffffffffffffffff82111561546f5761546e612530565b5b602082029050602081019050919050565b600060a0828403121561549657615495613220565b5b6154a06040612590565b905060006154b08482850161484f565b60008301525060806154c484828501613a50565b60208301525092915050565b60006154e36154de84615454565b612590565b90508083825260208201905060a084028301858111156155065761550561218d565b5b835b8181101561552f578061551b8882615480565b84526020840193505060a081019050615508565b5050509392505050565b600082601f83011261554e5761554d612183565b5b815161555e8482602086016154d0565b91505092915050565b60006040828403121561557d5761557c613220565b5b6155876040612590565b9050600082015167ffffffffffffffff8111156155a7576155a6613225565b5b6155b38482850161536c565b600083015250602082015167ffffffffffffffff8111156155d7576155d6613225565b5b6155e384828501615539565b60208301525092915050565b60006156026155fd84615340565b612590565b905080838252602082019050602084028301858111156156255761562461218d565b5b835b8181101561566c57805167ffffffffffffffff81111561564a57615649612183565b5b8086016156578982615567565b85526020850194505050602081019050615627565b5050509392505050565b600082601f83011261568b5761568a612183565b5b815161569b8482602086016155ef565b91505092915050565b600080604083850312156156bb576156ba61211b565b5b600083015167ffffffffffffffff8111156156d9576156d8612120565b5b6156e585828601615676565b925050602083015167ffffffffffffffff81111561570657615705612120565b5b61571285828601614ead565b915050925092905056fe2f636f736d6f732e7374616b696e672e763162657461312e4d7367556e64656c6567617465a2646970667358221220de0011d99ddea95ddc965752da4725396f8e9020c40f2730d27ec604f349de3e64736f6c634300081300332f636f736d6f732e7374616b696e672e763162657461312e4d736744656c6567617465", + "deployedBytecode": "0x6080604052600436106101355760003560e01c80637e51b811116100ab578063cf2753cf1161006f578063cf2753cf14610418578063ec9485df14610456578063f40a214614610493578063f5714e64146104bc578063f700dbd2146104d8578063f732b0651461050157610135565b80637e51b811146103435780638939e7831461036c5780638edb3f8b146103955780639eab6711146103b1578063b13d4242146103da57610135565b8063455b8551116100fd578063455b85511461023057806355dc4b221461026d578063570467ac146102965780635e269bfe146102d357806360deaa2a146102fc57806361bc221a1461031857610135565b80630a4433e21461013a5780631904bb2e1461016357806319b16c4c146101a057806331bcbcb3146101de5780633566cb9514610207575b600080fd5b34801561014657600080fd5b50610161600480360381019061015c919061221e565b61053f565b005b34801561016f57600080fd5b5061018a60048036038101906101859190612292565b61060e565b6040516101979190612509565b60405180910390f35b3480156101ac57600080fd5b506101c760048036038101906101c2919061265b565b61069e565b6040516101d5929190612732565b60405180910390f35b3480156101ea57600080fd5b5061020560048036038101906102009190612762565b610b9d565b005b34801561021357600080fd5b5061022e600480360381019061022991906127d1565b610e2a565b005b34801561023c57600080fd5b506102576004803603810190610252919061282d565b610f92565b6040516102649190612a34565b60405180910390f35b34801561027957600080fd5b50610294600480360381019061028f9190612a56565b611025565b005b3480156102a257600080fd5b506102bd60048036038101906102b8919061265b565b611417565b6040516102ca9190612c71565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f59190612c93565b6114ad565b005b61031660048036038101906103119190612d16565b611538565b005b34801561032457600080fd5b5061032d611686565b60405161033a9190612d5f565b60405180910390f35b34801561034f57600080fd5b5061036a60048036038101906103659190612762565b61168c565b005b34801561037857600080fd5b50610393600480360381019061038e9190612762565b611714565b005b6103af60048036038101906103aa9190612d16565b61179c565b005b3480156103bd57600080fd5b506103d860048036038101906103d39190612d7a565b611931565b005b3480156103e657600080fd5b5061040160048036038101906103fc9190612e3d565b6119bc565b60405161040f929190613106565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a919061282d565b611a54565b60405161044d929190612732565b60405180910390f35b34801561046257600080fd5b5061047d6004803603810190610478919061282d565b611aec565b60405161048a9190612d5f565b60405180910390f35b34801561049f57600080fd5b506104ba60048036038101906104b5919061313d565b611b76565b005b6104d660048036038101906104d19190612d16565b611d52565b005b3480156104e457600080fd5b506104ff60048036038101906104fa91906131c0565b611eac565b005b34801561050d57600080fd5b50610528600480360381019061052391906133cb565b611f78565b6040516105369291906136e2565b60405180910390f35b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895868487876040518563ffffffff1660e01b8152600401610582949392919061387b565b6020604051808303816000875af11580156105a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c591906138d0565b905080610607576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105fe90613980565b60405180910390fd5b5050505050565b610616612016565b61080073ffffffffffffffffffffffffffffffffffffffff1663223b3b7a836040518263ffffffff1660e01b815260040161065191906139a0565b600060405180830381865afa15801561066e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906106979190613bf1565b9050919050565b60006106a861208a565b60006108009050600086866040516024016106c4929190613c73565b6040516020818303038152906040527f241774e6000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000856040516020016107569190613cdf565b60405160208183030381529060405280519060200120905060405160200161077d90613d42565b604051602081830303815290604052805190602001208103610869576000808473ffffffffffffffffffffffffffffffffffffffff16846040516107c19190613d93565b600060405180830381855af49150503d80600081146107fc576040519150601f19603f3d011682016040523d82523d6000602084013e610801565b606091505b509150915081610846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083d90613e1c565b60405180910390fd5b8080602001905181019061085a9190613ea8565b80975081985050505050610b92565b60405160200161087890613f50565b604051602081830303815290604052805190602001208103610964576000808473ffffffffffffffffffffffffffffffffffffffff16846040516108bc9190613d93565b600060405180830381855afa9150503d80600081146108f7576040519150601f19603f3d011682016040523d82523d6000602084013e6108fc565b606091505b509150915081610941576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093890613fb1565b60405180910390fd5b808060200190518101906109559190613ea8565b80975081985050505050610b91565b6040516020016109739061401d565b604051602081830303815290604052805190602001208103610a61576000808473ffffffffffffffffffffffffffffffffffffffff16846040516109b79190613d93565b6000604051808303816000865af19150503d80600081146109f4576040519150601f19603f3d011682016040523d82523d6000602084013e6109f9565b606091505b509150915081610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a359061407e565b60405180910390fd5b80806020019051810190610a529190613ea8565b80975081985050505050610b90565b604051602001610a70906140ea565b604051602081830303815290604052805190602001208103610b545760006040518060400160405280601a81526020017f64656c65676174696f6e28616464726573732c737472696e6729000000000000815250805190602001209050600060a490506060600060208b01516020808d0101516040518681528e6004820152604060248201526033604482015282606482015281608482015260c081878360008e5af281519c5060608201519450610100820160405280610b3057600080fd5b50505050604051806040016040528083815260200182815250975050505050610b8f565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b869061414b565b60405180910390fd5b5b5b5b505050935093915050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610bdf93929190614319565b6020604051808303816000875af1158015610bfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2291906138d0565b905080610c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5b906143a3565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff163384604051602401610c909291906143c3565b6040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610d1a9190613d93565b6000604051808303816000865af19150503d8060008114610d57576040519150601f19603f3d011682016040523d82523d6000602084013e610d5c565b606091505b5050905080610da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9790614438565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3386866040518463ffffffff1660e01b8152600401610ddf93929190614458565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906138d0565b505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610e6c93929190614319565b6020604051808303816000875af1158015610e8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eaf91906138d0565b905080610ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee8906144e2565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3085856040518463ffffffff1660e01b8152600401610f3093929190614458565b6020604051808303816000875af1158015610f4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7391906138d0565b506001600080828254610f869190614531565b92505081905550505050565b610f9a6120a4565b61080073ffffffffffffffffffffffffffffffffffffffff1663a03ffee184846040518363ffffffff1660e01b8152600401610fd7929190613c73565b600060405180830381865afa158015610ff4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061101d9190614795565b905092915050565b60006108009050600085858560405160240161104393929190614458565b6040516020818303038152906040527f3edab33c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000836040516020016110d59190613cdf565b6040516020818303038152906040528051906020012090506040516020016110fc90613d42565b6040516020818303038152906040528051906020012081036111c95760008373ffffffffffffffffffffffffffffffffffffffff168360405161113f9190613d93565b600060405180830381855af49150503d806000811461117a576040519150601f19603f3d011682016040523d82523d6000602084013e61117f565b606091505b50509050806111c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ba90613e1c565b60405180910390fd5b5061140e565b6040516020016111d890613f50565b6040516020818303038152906040528051906020012081036112a55760008373ffffffffffffffffffffffffffffffffffffffff168360405161121b9190613d93565b600060405180830381855afa9150503d8060008114611256576040519150601f19603f3d011682016040523d82523d6000602084013e61125b565b606091505b505090508061129f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129690613fb1565b60405180910390fd5b5061140d565b6040516020016112b49061401d565b6040516020818303038152906040528051906020012081036113835760008373ffffffffffffffffffffffffffffffffffffffff16836040516112f79190613d93565b6000604051808303816000865af19150503d8060008114611334576040519150601f19603f3d011682016040523d82523d6000602084013e611339565b606091505b505090508061137d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113749061407e565b60405180910390fd5b5061140c565b604051602001611392906140ea565b6040516020818303038152906040528051906020012081036113d05760208201825160008082846000895af2806113c857600080fd5b50505061140b565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114029061414b565b60405180910390fd5b5b5b5b50505050505050565b61141f6120c5565b61080073ffffffffffffffffffffffffffffffffffffffff16637d9f939c8585856040518463ffffffff1660e01b815260040161145e939291906147de565b600060405180830381865afa15801561147b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906114a49190614a46565b90509392505050565b61080073ffffffffffffffffffffffffffffffffffffffff166312d58dfe858585856040518563ffffffff1660e01b81526004016114ee9493929190614a8f565b6020604051808303816000875af115801561150d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153191906138d0565b5050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895303460016040518463ffffffff1660e01b815260040161157a93929190614319565b6020604051808303816000875af1158015611599573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115bd91906138d0565b9050806115ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f690614b27565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b815260040161163e93929190614458565b6020604051808303816000875af115801561165d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168191906138d0565b505050565b60005481565b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c8484846040518463ffffffff1660e01b81526004016116cb93929190614458565b6020604051808303816000875af11580156116ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170e9190614b47565b50505050565b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb8484846040518463ffffffff1660e01b815260040161175393929190614458565b6020604051808303816000875af1158015611772573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179691906138d0565b50505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b81526004016117de93929190614319565b6020604051808303816000875af11580156117fd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182191906138d0565b905080611863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185a90614b27565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b81526004016118a293929190614458565b6020604051808303816000875af11580156118c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e591906138d0565b503373ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f1935050505015801561192c573d6000803e3d6000fd5b505050565b61080073ffffffffffffffffffffffffffffffffffffffff166354b826f5858585856040518563ffffffff1660e01b81526004016119729493929190614b74565b6020604051808303816000875af1158015611991573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b59190614b47565b5050505050565b60606119c66120ed565b61080073ffffffffffffffffffffffffffffffffffffffff1663186b216785856040518363ffffffff1660e01b8152600401611a03929190614d25565b600060405180830381865afa158015611a20573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611a499190614f19565b915091509250929050565b6000611a5e61208a565b61080073ffffffffffffffffffffffffffffffffffffffff1663241774e685856040518363ffffffff1660e01b8152600401611a9b929190613c73565b600060405180830381865afa158015611ab8573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611ae19190613ea8565b915091509250929050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663fc08930c8433856040518463ffffffff1660e01b8152600401611b2d93929190614f91565b602060405180830381865afa158015611b4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6e9190614fcf565b905092915050565b6000600167ffffffffffffffff811115611b9357611b92612530565b5b604051908082528060200260200182016040528015611bc657816020015b6060815260200190600190039081611bb15790505b50905060405180606001604052806025815260200161571d6025913981600081518110611bf657611bf5614ffc565b5b6020026020010181905250600061080073ffffffffffffffffffffffffffffffffffffffff1663b60398958787856040518463ffffffff1660e01b8152600401611c42939291906150dc565b6020604051808303816000875af1158015611c61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8591906138d0565b905080611cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbe9061518c565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c3285876040518463ffffffff1660e01b8152600401611d0693929190614458565b6020604051808303816000875af1158015611d25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d499190614b47565b50505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b8152600401611d9493929190614319565b6020604051808303816000875af1158015611db3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd791906138d0565b905080611e19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1090614b27565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084600134611e469190614531565b6040518463ffffffff1660e01b8152600401611e6493929190614458565b6020604051808303816000875af1158015611e83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea791906138d0565b505050565b600061080073ffffffffffffffffffffffffffffffffffffffff166361dc5c3b8585856040518463ffffffff1660e01b8152600401611eed939291906151ac565b6020604051808303816000875af1158015611f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f3091906138d0565b905080611f72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6990615250565b60405180910390fd5b50505050565b6060611f826120ed565b61080073ffffffffffffffffffffffffffffffffffffffff166310a2851c878787876040518563ffffffff1660e01b8152600401611fc394939291906152e6565b600060405180830381865afa158015611fe0573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061200991906156a4565b9150915094509492505050565b60405180610160016040528060608152602001606081526020016000151581526020016000600381111561204d5761204c61236a565b5b8152602001600081526020016000815260200160608152602001600060070b8152602001600060070b815260200160008152602001600081525090565b604051806040016040528060608152602001600081525090565b60405180606001604052806060815260200160608152602001606081525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061215082612125565b9050919050565b61216081612145565b811461216b57600080fd5b50565b60008135905061217d81612157565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126121a8576121a7612183565b5b8235905067ffffffffffffffff8111156121c5576121c4612188565b5b6020830191508360208202830111156121e1576121e061218d565b5b9250929050565b6000819050919050565b6121fb816121e8565b811461220657600080fd5b50565b600081359050612218816121f2565b92915050565b600080600080606085870312156122385761223761211b565b5b60006122468782880161216e565b945050602085013567ffffffffffffffff81111561226757612266612120565b5b61227387828801612192565b9350935050604061228687828801612209565b91505092959194509250565b6000602082840312156122a8576122a761211b565b5b60006122b68482850161216e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156122f95780820151818401526020810190506122de565b60008484015250505050565b6000601f19601f8301169050919050565b6000612321826122bf565b61232b81856122ca565b935061233b8185602086016122db565b61234481612305565b840191505092915050565b60008115159050919050565b6123648161234f565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106123aa576123a961236a565b5b50565b60008190506123bb82612399565b919050565b60006123cb826123ad565b9050919050565b6123db816123c0565b82525050565b6123ea816121e8565b82525050565b60008160070b9050919050565b612406816123f0565b82525050565b600061016083016000830151848203600086015261242a8282612316565b915050602083015184820360208601526124448282612316565b9150506040830151612459604086018261235b565b50606083015161246c60608601826123d2565b50608083015161247f60808601826123e1565b5060a083015161249260a08601826123e1565b5060c083015184820360c08601526124aa8282612316565b91505060e08301516124bf60e08601826123fd565b506101008301516124d46101008601826123fd565b506101208301516124e96101208601826123e1565b506101408301516124fe6101408601826123e1565b508091505092915050565b60006020820190508181036000830152612523818461240c565b905092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61256882612305565b810181811067ffffffffffffffff8211171561258757612586612530565b5b80604052505050565b600061259a612111565b90506125a6828261255f565b919050565b600067ffffffffffffffff8211156125c6576125c5612530565b5b6125cf82612305565b9050602081019050919050565b82818337600083830152505050565b60006125fe6125f9846125ab565b612590565b90508281526020810184848401111561261a5761261961252b565b5b6126258482856125dc565b509392505050565b600082601f83011261264257612641612183565b5b81356126528482602086016125eb565b91505092915050565b6000806000606084860312156126745761267361211b565b5b60006126828682870161216e565b935050602084013567ffffffffffffffff8111156126a3576126a2612120565b5b6126af8682870161262d565b925050604084013567ffffffffffffffff8111156126d0576126cf612120565b5b6126dc8682870161262d565b9150509250925092565b6126ef816121e8565b82525050565b600060408301600083015184820360008601526127128282612316565b915050602083015161272760208601826123e1565b508091505092915050565b600060408201905061274760008301856126e6565b818103602083015261275981846126f5565b90509392505050565b60008060006060848603121561277b5761277a61211b565b5b60006127898682870161216e565b935050602084013567ffffffffffffffff8111156127aa576127a9612120565b5b6127b68682870161262d565b92505060406127c786828701612209565b9150509250925092565b600080604083850312156127e8576127e761211b565b5b600083013567ffffffffffffffff81111561280657612805612120565b5b6128128582860161262d565b925050602061282385828601612209565b9150509250929050565b600080604083850312156128445761284361211b565b5b60006128528582860161216e565b925050602083013567ffffffffffffffff81111561287357612872612120565b5b61287f8582860161262d565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600067ffffffffffffffff82169050919050565b6128d2816128b5565b82525050565b60c0820160008201516128ee60008501826123fd565b50602082015161290160208501826123fd565b50604082015161291460408501826123e1565b50606082015161292760608501826123e1565b50608082015161293a60808501826128c9565b5060a082015161294d60a08501826123fd565b50505050565b600061295f83836128d8565b60c08301905092915050565b6000602082019050919050565b600061298382612889565b61298d8185612894565b9350612998836128a5565b8060005b838110156129c95781516129b08882612953565b97506129bb8361296b565b92505060018101905061299c565b5085935050505092915050565b600060608301600083015184820360008601526129f38282612316565b91505060208301518482036020860152612a0d8282612316565b91505060408301518482036040860152612a278282612978565b9150508091505092915050565b60006020820190508181036000830152612a4e81846129d6565b905092915050565b60008060008060808587031215612a7057612a6f61211b565b5b6000612a7e8782880161216e565b945050602085013567ffffffffffffffff811115612a9f57612a9e612120565b5b612aab8782880161262d565b9350506040612abc87828801612209565b925050606085013567ffffffffffffffff811115612add57612adc612120565b5b612ae98782880161262d565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b608082016000820151612b3760008501826123fd565b506020820151612b4a60208501826123fd565b506040820151612b5d60408501826123e1565b506060820151612b7060608501826123e1565b50505050565b6000612b828383612b21565b60808301905092915050565b6000602082019050919050565b6000612ba682612af5565b612bb08185612b00565b9350612bbb83612b11565b8060005b83811015612bec578151612bd38882612b76565b9750612bde83612b8e565b925050600181019050612bbf565b5085935050505092915050565b60006080830160008301518482036000860152612c168282612316565b91505060208301518482036020860152612c308282612316565b91505060408301518482036040860152612c4a8282612316565b91505060608301518482036060860152612c648282612b9b565b9150508091505092915050565b60006020820190508181036000830152612c8b8184612bf9565b905092915050565b60008060008060808587031215612cad57612cac61211b565b5b6000612cbb8782880161216e565b945050602085013567ffffffffffffffff811115612cdc57612cdb612120565b5b612ce88782880161262d565b9350506040612cf987828801612209565b9250506060612d0a87828801612209565b91505092959194509250565b600060208284031215612d2c57612d2b61211b565b5b600082013567ffffffffffffffff811115612d4a57612d49612120565b5b612d568482850161262d565b91505092915050565b6000602082019050612d7460008301846126e6565b92915050565b60008060008060808587031215612d9457612d9361211b565b5b6000612da28782880161216e565b945050602085013567ffffffffffffffff811115612dc357612dc2612120565b5b612dcf8782880161262d565b935050604085013567ffffffffffffffff811115612df057612def612120565b5b612dfc8782880161262d565b9250506060612e0d87828801612209565b91505092959194509250565b600080fd5b600060a08284031215612e3457612e33612e19565b5b81905092915050565b60008060408385031215612e5457612e5361211b565b5b600083013567ffffffffffffffff811115612e7257612e71612120565b5b612e7e8582860161262d565b925050602083013567ffffffffffffffff811115612e9f57612e9e612120565b5b612eab85828601612e1e565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000610160830160008301518482036000860152612eff8282612316565b91505060208301518482036020860152612f198282612316565b9150506040830151612f2e604086018261235b565b506060830151612f4160608601826123d2565b506080830151612f5460808601826123e1565b5060a0830151612f6760a08601826123e1565b5060c083015184820360c0860152612f7f8282612316565b91505060e0830151612f9460e08601826123fd565b50610100830151612fa96101008601826123fd565b50610120830151612fbe6101208601826123e1565b50610140830151612fd36101408601826123e1565b508091505092915050565b6000612fea8383612ee1565b905092915050565b6000602082019050919050565b600061300a82612eb5565b6130148185612ec0565b93508360208202850161302685612ed1565b8060005b8581101561306257848403895281516130438582612fde565b945061304e83612ff2565b925060208a0199505060018101905061302a565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b600061309b82613074565b6130a5818561307f565b93506130b58185602086016122db565b6130be81612305565b840191505092915050565b600060408301600083015184820360008601526130e68282613090565b91505060208301516130fb60208601826128c9565b508091505092915050565b600060408201905081810360008301526131208185612fff565b9050818103602083015261313481846130c9565b90509392505050565b600080600080608085870312156131575761315661211b565b5b60006131658782880161216e565b945050602061317687828801612209565b935050604061318787828801612209565b925050606085013567ffffffffffffffff8111156131a8576131a7612120565b5b6131b48782880161262d565b91505092959194509250565b6000806000604084860312156131d9576131d861211b565b5b60006131e78682870161216e565b935050602084013567ffffffffffffffff81111561320857613207612120565b5b61321486828701612192565b92509250509250925092565b600080fd5b600080fd5b600067ffffffffffffffff82111561324557613244612530565b5b61324e82612305565b9050602081019050919050565b600061326e6132698461322a565b612590565b90508281526020810184848401111561328a5761328961252b565b5b6132958482856125dc565b509392505050565b600082601f8301126132b2576132b1612183565b5b81356132c284826020860161325b565b91505092915050565b6132d4816128b5565b81146132df57600080fd5b50565b6000813590506132f1816132cb565b92915050565b6133008161234f565b811461330b57600080fd5b50565b60008135905061331d816132f7565b92915050565b600060a0828403121561333957613338613220565b5b61334360a0612590565b9050600082013567ffffffffffffffff81111561336357613362613225565b5b61336f8482850161329d565b6000830152506020613383848285016132e2565b6020830152506040613397848285016132e2565b60408301525060606133ab8482850161330e565b60608301525060806133bf8482850161330e565b60808301525092915050565b600080600080608085870312156133e5576133e461211b565b5b60006133f38782880161216e565b945050602085013567ffffffffffffffff81111561341457613413612120565b5b6134208782880161262d565b935050604085013567ffffffffffffffff81111561344157613440612120565b5b61344d8782880161262d565b925050606085013567ffffffffffffffff81111561346e5761346d612120565b5b61347a87828801613323565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060808301600083015184820360008601526134cf8282612316565b915050602083015184820360208601526134e98282612316565b915050604083015184820360408601526135038282612316565b9150506060830151848203606086015261351d8282612b9b565b9150508091505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60a08201600082015161356c6000850182612b21565b50602082015161357f60808501826123e1565b50505050565b60006135918383613556565b60a08301905092915050565b6000602082019050919050565b60006135b58261352a565b6135bf8185613535565b93506135ca83613546565b8060005b838110156135fb5781516135e28882613585565b97506135ed8361359d565b9250506001810190506135ce565b5085935050505092915050565b6000604083016000830151848203600086015261362582826134b2565b9150506020830151848203602086015261363f82826135aa565b9150508091505092915050565b60006136588383613608565b905092915050565b6000602082019050919050565b600061367882613486565b6136828185613491565b935083602082028501613694856134a2565b8060005b858110156136d057848403895281516136b1858261364c565b94506136bc83613660565b925060208a01995050600181019050613698565b50829750879550505050505092915050565b600060408201905081810360008301526136fc818561366d565b9050818103602083015261371081846130c9565b90509392505050565b61372281612145565b82525050565b600082825260208201905092915050565b6000819050919050565b600061374f83856122ca565b935061375c8385846125dc565b61376583612305565b840190509392505050565b600061377d848484613743565b90509392505050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126137b2576137b1613790565b5b83810192508235915060208301925067ffffffffffffffff8211156137da576137d9613786565b5b6001820236038313156137f0576137ef61378b565b5b509250929050565b6000602082019050919050565b60006138118385613728565b93508360208402850161382384613739565b8060005b8781101561386957848403895261383e8284613795565b613849868284613770565b9550613854846137f8565b935060208b019a505050600181019050613827565b50829750879450505050509392505050565b60006060820190506138906000830187613719565b61389d60208301866126e6565b81810360408301526138b0818486613805565b905095945050505050565b6000815190506138ca816132f7565b92915050565b6000602082840312156138e6576138e561211b565b5b60006138f4848285016138bb565b91505092915050565b600082825260208201905092915050565b7f4661696c656420746f20617070726f7665207374616b696e67206d6574686f6460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061396a6021836138fd565b91506139758261390e565b604082019050919050565b600060208201905081810360008301526139998161395d565b9050919050565b60006020820190506139b56000830184613719565b92915050565b60006139ce6139c9846125ab565b612590565b9050828152602081018484840111156139ea576139e961252b565b5b6139f58482856122db565b509392505050565b600082601f830112613a1257613a11612183565b5b8151613a228482602086016139bb565b91505092915050565b60048110613a3857600080fd5b50565b600081519050613a4a81613a2b565b92915050565b600081519050613a5f816121f2565b92915050565b613a6e816123f0565b8114613a7957600080fd5b50565b600081519050613a8b81613a65565b92915050565b60006101608284031215613aa857613aa7613220565b5b613ab3610160612590565b9050600082015167ffffffffffffffff811115613ad357613ad2613225565b5b613adf848285016139fd565b600083015250602082015167ffffffffffffffff811115613b0357613b02613225565b5b613b0f848285016139fd565b6020830152506040613b23848285016138bb565b6040830152506060613b3784828501613a3b565b6060830152506080613b4b84828501613a50565b60808301525060a0613b5f84828501613a50565b60a08301525060c082015167ffffffffffffffff811115613b8357613b82613225565b5b613b8f848285016139fd565b60c08301525060e0613ba384828501613a7c565b60e083015250610100613bb884828501613a7c565b61010083015250610120613bce84828501613a50565b61012083015250610140613be484828501613a50565b6101408301525092915050565b600060208284031215613c0757613c0661211b565b5b600082015167ffffffffffffffff811115613c2557613c24612120565b5b613c3184828501613a91565b91505092915050565b6000613c45826122bf565b613c4f81856138fd565b9350613c5f8185602086016122db565b613c6881612305565b840191505092915050565b6000604082019050613c886000830185613719565b8181036020830152613c9a8184613c3a565b90509392505050565b600081905092915050565b6000613cb9826122bf565b613cc38185613ca3565b9350613cd38185602086016122db565b80840191505092915050565b6000613ceb8284613cae565b915081905092915050565b7f64656c656761746563616c6c0000000000000000000000000000000000000000600082015250565b6000613d2c600c83613ca3565b9150613d3782613cf6565b600c82019050919050565b6000613d4d82613d1f565b9150819050919050565b600081905092915050565b6000613d6d82613074565b613d778185613d57565b9350613d878185602086016122db565b80840191505092915050565b6000613d9f8284613d62565b915081905092915050565b7f6661696c65642064656c656761746563616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e066021836138fd565b9150613e1182613daa565b604082019050919050565b60006020820190508181036000830152613e3581613df9565b9050919050565b600060408284031215613e5257613e51613220565b5b613e5c6040612590565b9050600082015167ffffffffffffffff811115613e7c57613e7b613225565b5b613e88848285016139fd565b6000830152506020613e9c84828501613a50565b60208301525092915050565b60008060408385031215613ebf57613ebe61211b565b5b6000613ecd85828601613a50565b925050602083015167ffffffffffffffff811115613eee57613eed612120565b5b613efa85828601613e3c565b9150509250929050565b7f73746174696363616c6c00000000000000000000000000000000000000000000600082015250565b6000613f3a600a83613ca3565b9150613f4582613f04565b600a82019050919050565b6000613f5b82613f2d565b9150819050919050565b7f6661696c65642073746174696363616c6c20746f20707265636f6d70696c6500600082015250565b6000613f9b601f836138fd565b9150613fa682613f65565b602082019050919050565b60006020820190508181036000830152613fca81613f8e565b9050919050565b7f63616c6c00000000000000000000000000000000000000000000000000000000600082015250565b6000614007600483613ca3565b915061401282613fd1565b600482019050919050565b600061402882613ffa565b9150819050919050565b7f6661696c65642063616c6c20746f20707265636f6d70696c6500000000000000600082015250565b60006140686019836138fd565b915061407382614032565b602082019050919050565b600060208201905081810360008301526140978161405b565b9050919050565b7f63616c6c636f6465000000000000000000000000000000000000000000000000600082015250565b60006140d4600883613ca3565b91506140df8261409e565b600882019050919050565b60006140f5826140c7565b9150819050919050565b7f696e76616c69642063616c6c7479706500000000000000000000000000000000600082015250565b60006141356010836138fd565b9150614140826140ff565b602082019050919050565b6000602082019050818103600083015261416481614128565b9050919050565b600081549050919050565b60008190508160005260206000209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806141d257607f821691505b6020821081036141e5576141e461418b565b5b50919050565b60008190508160005260206000209050919050565b6000815461420d816141ba565b61421781866122ca565b9450600182166000811461423257600181146142485761427b565b60ff19831686528115156020028601935061427b565b614251856141eb565b60005b8381101561427357815481890152600182019150602081019050614254565b808801955050505b50505092915050565b60006142908383614200565b905092915050565b6000600182019050919050565b60006142b08261416b565b6142ba8185613728565b9350836020820285016142cc85614176565b8060005b85811015614307578484038952816142e88582614284565b94506142f383614298565b925060208a019950506001810190506142d0565b50829750879550505050505092915050565b600060608201905061432e6000830186613719565b61433b60208301856126e6565b818103604083015261434d81846142a5565b9050949350505050565b7f64656c65676174696f6e20617070726f76616c206661696c6564000000000000600082015250565b600061438d601a836138fd565b915061439882614357565b602082019050919050565b600060208201905081810360008301526143bc81614380565b9050919050565b60006040820190506143d86000830185613719565b6143e560208301846126e6565b9392505050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000614422600f836138fd565b915061442d826143ec565b602082019050919050565b6000602082019050818103600083015261445181614415565b9050919050565b600060608201905061446d6000830186613719565b818103602083015261447f8185613c3a565b905061448e60408301846126e6565b949350505050565b7f5374616b696e6720417070726f7665206661696c656400000000000000000000600082015250565b60006144cc6016836138fd565b91506144d782614496565b602082019050919050565b600060208201905081810360008301526144fb816144bf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061453c826121e8565b9150614547836121e8565b925082820190508082111561455f5761455e614502565b5b92915050565b600067ffffffffffffffff8211156145805761457f612530565b5b602082029050602081019050919050565b6000815190506145a0816132cb565b92915050565b600060c082840312156145bc576145bb613220565b5b6145c660c0612590565b905060006145d684828501613a7c565b60008301525060206145ea84828501613a7c565b60208301525060406145fe84828501613a50565b604083015250606061461284828501613a50565b606083015250608061462684828501614591565b60808301525060a061463a84828501613a7c565b60a08301525092915050565b600061465961465484614565565b612590565b90508083825260208201905060c0840283018581111561467c5761467b61218d565b5b835b818110156146a5578061469188826145a6565b84526020840193505060c08101905061467e565b5050509392505050565b600082601f8301126146c4576146c3612183565b5b81516146d4848260208601614646565b91505092915050565b6000606082840312156146f3576146f2613220565b5b6146fd6060612590565b9050600082015167ffffffffffffffff81111561471d5761471c613225565b5b614729848285016139fd565b600083015250602082015167ffffffffffffffff81111561474d5761474c613225565b5b614759848285016139fd565b602083015250604082015167ffffffffffffffff81111561477d5761477c613225565b5b614789848285016146af565b60408301525092915050565b6000602082840312156147ab576147aa61211b565b5b600082015167ffffffffffffffff8111156147c9576147c8612120565b5b6147d5848285016146dd565b91505092915050565b60006060820190506147f36000830186613719565b81810360208301526148058185613c3a565b905081810360408301526148198184613c3a565b9050949350505050565b600067ffffffffffffffff82111561483e5761483d612530565b5b602082029050602081019050919050565b60006080828403121561486557614864613220565b5b61486f6080612590565b9050600061487f84828501613a7c565b600083015250602061489384828501613a7c565b60208301525060406148a784828501613a50565b60408301525060606148bb84828501613a50565b60608301525092915050565b60006148da6148d584614823565b612590565b905080838252602082019050608084028301858111156148fd576148fc61218d565b5b835b818110156149265780614912888261484f565b8452602084019350506080810190506148ff565b5050509392505050565b600082601f83011261494557614944612183565b5b81516149558482602086016148c7565b91505092915050565b60006080828403121561497457614973613220565b5b61497e6080612590565b9050600082015167ffffffffffffffff81111561499e5761499d613225565b5b6149aa848285016139fd565b600083015250602082015167ffffffffffffffff8111156149ce576149cd613225565b5b6149da848285016139fd565b602083015250604082015167ffffffffffffffff8111156149fe576149fd613225565b5b614a0a848285016139fd565b604083015250606082015167ffffffffffffffff811115614a2e57614a2d613225565b5b614a3a84828501614930565b60608301525092915050565b600060208284031215614a5c57614a5b61211b565b5b600082015167ffffffffffffffff811115614a7a57614a79612120565b5b614a868482850161495e565b91505092915050565b6000608082019050614aa46000830187613719565b8181036020830152614ab68186613c3a565b9050614ac560408301856126e6565b614ad260608301846126e6565b95945050505050565b7f44656c656761746520417070726f7665206661696c6564000000000000000000600082015250565b6000614b116017836138fd565b9150614b1c82614adb565b602082019050919050565b60006020820190508181036000830152614b4081614b04565b9050919050565b600060208284031215614b5d57614b5c61211b565b5b6000614b6b84828501613a7c565b91505092915050565b6000608082019050614b896000830187613719565b8181036020830152614b9b8186613c3a565b90508181036040830152614baf8185613c3a565b9050614bbe60608301846126e6565b95945050505050565b60008083356001602003843603038112614be457614be3613790565b5b83810192508235915060208301925067ffffffffffffffff821115614c0c57614c0b613786565b5b600182023603831315614c2257614c2161378b565b5b509250929050565b6000614c36838561307f565b9350614c438385846125dc565b614c4c83612305565b840190509392505050565b6000614c6660208401846132e2565b905092915050565b6000614c7d602084018461330e565b905092915050565b600060a08301614c986000840184614bc7565b8583036000870152614cab838284614c2a565b92505050614cbc6020840184614c57565b614cc960208601826128c9565b50614cd76040840184614c57565b614ce460408601826128c9565b50614cf26060840184614c6e565b614cff606086018261235b565b50614d0d6080840184614c6e565b614d1a608086018261235b565b508091505092915050565b60006040820190508181036000830152614d3f8185613c3a565b90508181036020830152614d538184614c85565b90509392505050565b600067ffffffffffffffff821115614d7757614d76612530565b5b602082029050602081019050919050565b6000614d9b614d9684614d5c565b612590565b90508083825260208201905060208402830185811115614dbe57614dbd61218d565b5b835b81811015614e0557805167ffffffffffffffff811115614de357614de2612183565b5b808601614df08982613a91565b85526020850194505050602081019050614dc0565b5050509392505050565b600082601f830112614e2457614e23612183565b5b8151614e34848260208601614d88565b91505092915050565b6000614e50614e4b8461322a565b612590565b905082815260208101848484011115614e6c57614e6b61252b565b5b614e778482856122db565b509392505050565b600082601f830112614e9457614e93612183565b5b8151614ea4848260208601614e3d565b91505092915050565b600060408284031215614ec357614ec2613220565b5b614ecd6040612590565b9050600082015167ffffffffffffffff811115614eed57614eec613225565b5b614ef984828501614e7f565b6000830152506020614f0d84828501614591565b60208301525092915050565b60008060408385031215614f3057614f2f61211b565b5b600083015167ffffffffffffffff811115614f4e57614f4d612120565b5b614f5a85828601614e0f565b925050602083015167ffffffffffffffff811115614f7b57614f7a612120565b5b614f8785828601614ead565b9150509250929050565b6000606082019050614fa66000830186613719565b614fb36020830185613719565b8181036040830152614fc58184613c3a565b9050949350505050565b600060208284031215614fe557614fe461211b565b5b6000614ff384828501613a50565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b6000819050602082019050919050565b60006150528383612316565b905092915050565b6000602082019050919050565b60006150728261502b565b61507c8185613728565b93508360208202850161508e85615036565b8060005b858110156150ca57848403895281516150ab8582615046565b94506150b68361505a565b925060208a01995050600181019050615092565b50829750879550505050505092915050565b60006060820190506150f16000830186613719565b6150fe60208301856126e6565b81810360408301526151108184615067565b9050949350505050565b7f6661696c656420746f20617070726f766520756e64656c65676174696f6e206d60008201527f6574686f64000000000000000000000000000000000000000000000000000000602082015250565b60006151766025836138fd565b91506151818261511a565b604082019050919050565b600060208201905081810360008301526151a581615169565b9050919050565b60006040820190506151c16000830186613719565b81810360208301526151d4818486613805565b9050949350505050565b7f4661696c656420746f207265766f6b6520617070726f76616c20666f7220737460008201527f616b696e67206d6574686f647300000000000000000000000000000000000000602082015250565b600061523a602d836138fd565b9150615245826151de565b604082019050919050565b600060208201905081810360008301526152698161522d565b9050919050565b600060a083016000830151848203600086015261528d8282613090565b91505060208301516152a260208601826128c9565b5060408301516152b560408601826128c9565b5060608301516152c8606086018261235b565b5060808301516152db608086018261235b565b508091505092915050565b60006080820190506152fb6000830187613719565b818103602083015261530d8186613c3a565b905081810360408301526153218185613c3a565b905081810360608301526153358184615270565b905095945050505050565b600067ffffffffffffffff82111561535b5761535a612530565b5b602082029050602081019050919050565b60006080828403121561538257615381613220565b5b61538c6080612590565b9050600082015167ffffffffffffffff8111156153ac576153ab613225565b5b6153b8848285016139fd565b600083015250602082015167ffffffffffffffff8111156153dc576153db613225565b5b6153e8848285016139fd565b602083015250604082015167ffffffffffffffff81111561540c5761540b613225565b5b615418848285016139fd565b604083015250606082015167ffffffffffffffff81111561543c5761543b613225565b5b61544884828501614930565b60608301525092915050565b600067ffffffffffffffff82111561546f5761546e612530565b5b602082029050602081019050919050565b600060a0828403121561549657615495613220565b5b6154a06040612590565b905060006154b08482850161484f565b60008301525060806154c484828501613a50565b60208301525092915050565b60006154e36154de84615454565b612590565b90508083825260208201905060a084028301858111156155065761550561218d565b5b835b8181101561552f578061551b8882615480565b84526020840193505060a081019050615508565b5050509392505050565b600082601f83011261554e5761554d612183565b5b815161555e8482602086016154d0565b91505092915050565b60006040828403121561557d5761557c613220565b5b6155876040612590565b9050600082015167ffffffffffffffff8111156155a7576155a6613225565b5b6155b38482850161536c565b600083015250602082015167ffffffffffffffff8111156155d7576155d6613225565b5b6155e384828501615539565b60208301525092915050565b60006156026155fd84615340565b612590565b905080838252602082019050602084028301858111156156255761562461218d565b5b835b8181101561566c57805167ffffffffffffffff81111561564a57615649612183565b5b8086016156578982615567565b85526020850194505050602081019050615627565b5050509392505050565b600082601f83011261568b5761568a612183565b5b815161569b8482602086016155ef565b91505092915050565b600080604083850312156156bb576156ba61211b565b5b600083015167ffffffffffffffff8111156156d9576156d8612120565b5b6156e585828601615676565b925050602083015167ffffffffffffffff81111561570657615705612120565b5b61571285828601614ead565b915050925092905056fe2f636f736d6f732e7374616b696e672e763162657461312e4d7367556e64656c6567617465a2646970667358221220de0011d99ddea95ddc965752da4725396f8e9020c40f2730d27ec604f349de3e64736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} } diff --git a/precompiles/staking/testdata/staking_caller.go b/precompiles/staking/testdata/staking_caller.go index e620768726..ae9f1c91d0 100644 --- a/precompiles/staking/testdata/staking_caller.go +++ b/precompiles/staking/testdata/staking_caller.go @@ -4,27 +4,10 @@ package testdata import ( - _ "embed" // embed compiled smart contract - "encoding/json" - + contractutils "github.com/evmos/evmos/v18/contracts/utils" evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) -var ( - //go:embed StakingCaller.json - StakingCallerJSON []byte - - // StakingCallerContract is the compiled contract calling the staking precompile - StakingCallerContract evmtypes.CompiledContract -) - -func init() { - err := json.Unmarshal(StakingCallerJSON, &StakingCallerContract) - if err != nil { - panic(err) - } - - if len(StakingCallerContract.Bin) == 0 { - panic("failed to load smart contract that calls staking precompile") - } +func LoadStakingCallerContract() (evmtypes.CompiledContract, error) { + return contractutils.LoadContractFromJSONFile("StakingCaller.json") } diff --git a/precompiles/testutil/contracts/DistributionCaller.json b/precompiles/testutil/contracts/DistributionCaller.json index ac3937bd1f..10d145e26e 100644 --- a/precompiles/testutil/contracts/DistributionCaller.json +++ b/precompiles/testutil/contracts/DistributionCaller.json @@ -1,4 +1,665 @@ { - "abi": "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_delAddr\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_withdrawAddr\",\"type\":\"string\"}],\"name\":\"delegateCallSetWithdrawAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_delAddr\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_valAddr\",\"type\":\"string\"}],\"name\":\"getDelegationRewards\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"precision\",\"type\":\"uint8\"}],\"internalType\":\"struct DecCoin[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_delAddr\",\"type\":\"address\"}],\"name\":\"getDelegationTotalRewards\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"validatorAddress\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"precision\",\"type\":\"uint8\"}],\"internalType\":\"struct DecCoin[]\",\"name\":\"reward\",\"type\":\"tuple[]\"}],\"internalType\":\"struct DelegationDelegatorReward[]\",\"name\":\"rewards\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"precision\",\"type\":\"uint8\"}],\"internalType\":\"struct DecCoin[]\",\"name\":\"total\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_delAddr\",\"type\":\"address\"}],\"name\":\"getDelegatorValidators\",\"outputs\":[{\"internalType\":\"string[]\",\"name\":\"\",\"type\":\"string[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_delAddr\",\"type\":\"address\"}],\"name\":\"getDelegatorWithdrawAddress\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_valAddr\",\"type\":\"string\"}],\"name\":\"getValidatorCommission\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"precision\",\"type\":\"uint8\"}],\"internalType\":\"struct DecCoin[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_valAddr\",\"type\":\"string\"}],\"name\":\"getValidatorDistributionInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"operatorAddress\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"precision\",\"type\":\"uint8\"}],\"internalType\":\"struct DecCoin[]\",\"name\":\"selfBondRewards\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"precision\",\"type\":\"uint8\"}],\"internalType\":\"struct DecCoin[]\",\"name\":\"commission\",\"type\":\"tuple[]\"}],\"internalType\":\"struct ValidatorDistributionInfo\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_valAddr\",\"type\":\"string\"}],\"name\":\"getValidatorOutstandingRewards\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"precision\",\"type\":\"uint8\"}],\"internalType\":\"struct DecCoin[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_valAddr\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"_startingHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"_endingHeight\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"key\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"offset\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"limit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"countTotal\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"reverse\",\"type\":\"bool\"}],\"internalType\":\"struct PageRequest\",\"name\":\"pageRequest\",\"type\":\"tuple\"}],\"name\":\"getValidatorSlashes\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"validatorPeriod\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"precision\",\"type\":\"uint8\"}],\"internalType\":\"struct Dec\",\"name\":\"fraction\",\"type\":\"tuple\"}],\"internalType\":\"struct ValidatorSlashEvent[]\",\"name\":\"\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nextKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"total\",\"type\":\"uint64\"}],\"internalType\":\"struct PageResponse\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_delAddr\",\"type\":\"address\"}],\"name\":\"staticCallGetWithdrawAddress\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_delAddr\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_withdrawAddr\",\"type\":\"string\"}],\"name\":\"staticCallSetWithdrawAddress\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_delAddr\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"_maxRetrieve\",\"type\":\"uint32\"}],\"name\":\"testClaimRewards\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_withdrawAddr\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_delAddr\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_valAddr\",\"type\":\"string\"}],\"name\":\"testRevertState\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"struct Coin[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_delAddr\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_withdrawAddr\",\"type\":\"string\"}],\"name\":\"testSetWithdrawAddress\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_withdrawAddr\",\"type\":\"string\"}],\"name\":\"testSetWithdrawAddressFromContract\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_delAddr\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_valAddr\",\"type\":\"string\"}],\"name\":\"testWithdrawDelegatorRewards\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"struct Coin[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_valAddr\",\"type\":\"string\"}],\"name\":\"testWithdrawDelegatorRewardsFromContract\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"struct Coin[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_valAddr\",\"type\":\"string\"}],\"name\":\"testWithdrawValidatorCommission\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"struct Coin[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]\n", - "bin": "608060405234801561001057600080fd5b50612f60806100206000396000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c806388b2d581116100a2578063b6a216ae11610071578063b6a216ae14610364578063cb85aa0a14610394578063d3f831be146103c4578063e0421e39146103f4578063e236c7a61461042457610116565b806388b2d581146102a3578063963516e4146102d45780639819459314610304578063b2d178831461033457610116565b806346e16d34116100e957806346e16d34146101c75780636f669da4146101f757806378a5dfd114610227578063796b96d2146102575780637c9db0bb1461027357610116565b806301b680001461011b5780630c05e9e41461014b578063296c60aa1461017b5780632d0ee16a14610197575b600080fd5b610135600480360381019061013091906111e1565b610455565b604051610142919061129e565b60405180910390f35b610165600480360381019061016091906113f5565b61059d565b6040516101729190611638565b60405180910390f35b6101956004803603810190610190919061165a565b61062d565b005b6101b160048036038101906101ac91906113f5565b61076e565b6040516101be91906117b5565b60405180910390f35b6101e160048036038101906101dc919061165a565b6107fc565b6040516101ee91906117f2565b60405180910390f35b610211600480360381019061020c9190611849565b610886565b60405161021e91906117f2565b60405180910390f35b610241600480360381019061023c919061165a565b610910565b60405161024e919061190f565b60405180910390f35b610271600480360381019061026c919061165a565b61099d565b005b61028d600480360381019061028891906113f5565b610ade565b60405161029a919061190f565b60405180910390f35b6102bd60048036038101906102b89190611995565b610b68565b6040516102cb929190611bd7565b60405180910390f35b6102ee60048036038101906102e991906113f5565b610c06565b6040516102fb91906117f2565b60405180910390f35b61031e6004803603810190610319919061165a565b610c8f565b60405161032b91906117b5565b60405180910390f35b61034e60048036038101906103499190611c0e565b610d1e565b60405161035b91906117b5565b60405180910390f35b61037e600480360381019061037991906111e1565b610e73565b60405161038b9190611d5b565b60405180910390f35b6103ae60048036038101906103a991906111e1565b610efd565b6040516103bb9190611dc7565b60405180910390f35b6103de60048036038101906103d991906113f5565b610f87565b6040516103eb919061190f565b60405180910390f35b61040e600480360381019061040991906113f5565b611011565b60405161041b91906117b5565b60405180910390f35b61043e600480360381019061043991906111e1565b61109d565b60405161044c929190611eef565b60405180910390f35b606060008061080173ffffffffffffffffffffffffffffffffffffffff16846040516024016104849190611f35565b6040516020818303038152906040527f5431f450000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161050e9190611f8c565b600060405180830381855afa9150503d8060008114610549576040519150601f19603f3d011682016040523d82523d6000602084013e61054e565b606091505b509150915081610593576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058a90611fef565b60405180910390fd5b8092505050919050565b6105a561112a565b61080173ffffffffffffffffffffffffffffffffffffffff166354212a89836040518263ffffffff1660e01b81526004016105e09190611dc7565b600060405180830381865afa1580156105fd573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061062691906122ff565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff16838360405160240161065b929190612348565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516106e59190611f8c565b600060405180830381855af49150503d8060008114610720576040519150601f19603f3d011682016040523d82523d6000602084013e610725565b606091505b5050905080610769576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610760906123ea565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6130846040518363ffffffff1660e01b81526004016107ad929190612348565b6000604051808303816000875af11580156107cc573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906107f59190612557565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9684846040518363ffffffff1660e01b815260040161083b929190612348565b6020604051808303816000875af115801561085a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087e91906125cc565b905092915050565b600061080173ffffffffffffffffffffffffffffffffffffffff16632efe8a5f84846040518363ffffffff1660e01b81526004016108c5929190612608565b6020604051808303816000875af11580156108e4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090891906125cc565b905092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff16639ad563b484846040518363ffffffff1660e01b815260040161094f929190612348565b600060405180830381865afa15801561096c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906109959190612631565b905092915050565b600061080173ffffffffffffffffffffffffffffffffffffffff1683836040516024016109cb929190612348565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610a559190611f8c565b600060405180830381855afa9150503d8060008114610a90576040519150601f19603f3d011682016040523d82523d6000602084013e610a95565b606091505b5050905080610ad9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad090611fef565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633dd40f78836040518263ffffffff1660e01b8152600401610b1b9190611dc7565b600060405180830381865afa158015610b38573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610b619190612631565b9050919050565b6060610b7261114b565b61080173ffffffffffffffffffffffffffffffffffffffff16638f2473ce878787876040518563ffffffff1660e01b8152600401610bb3949392919061281a565b600060405180830381865afa158015610bd0573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610bf99190612af2565b9150915094509492505050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9630846040518363ffffffff1660e01b8152600401610c45929190612348565b6020604051808303816000875af1158015610c64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8891906125cc565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6184846040518363ffffffff1660e01b8152600401610cce929190612348565b6000604051808303816000875af1158015610ced573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610d169190612557565b905092915050565b6060600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9633876040518363ffffffff1660e01b8152600401610d5f929190612348565b6020604051808303816000875af1158015610d7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da291906125cc565b905080610de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddb90612bb6565b60405180910390fd5b61080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6185856040518363ffffffff1660e01b8152600401610e21929190612348565b6000604051808303816000875af1158015610e40573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610e699190612557565b9150509392505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663a66cb605836040518263ffffffff1660e01b8152600401610eb09190611f35565b600060405180830381865afa158015610ecd573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610ef69190612cb7565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff16635431f450836040518263ffffffff1660e01b8152600401610f3a9190611f35565b600060405180830381865afa158015610f57573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610f809190612d00565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff166385b2d2da836040518263ffffffff1660e01b8152600401610fc49190611dc7565b600060405180830381865afa158015610fe1573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061100a9190612631565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633ce4e3be836040518263ffffffff1660e01b815260040161104e9190611dc7565b6000604051808303816000875af115801561106d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110969190612557565b9050919050565b60608061080173ffffffffffffffffffffffffffffffffffffffff166354be1a28846040518263ffffffff1660e01b81526004016110db9190611f35565b600060405180830381865afa1580156110f8573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906111219190612eb2565b91509150915091565b60405180606001604052806060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006111ae82611183565b9050919050565b6111be816111a3565b81146111c957600080fd5b50565b6000813590506111db816111b5565b92915050565b6000602082840312156111f7576111f6611179565b5b6000611205848285016111cc565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561124857808201518184015260208101905061122d565b60008484015250505050565b6000601f19601f8301169050919050565b60006112708261120e565b61127a8185611219565b935061128a81856020860161122a565b61129381611254565b840191505092915050565b600060208201905081810360008301526112b88184611265565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61130282611254565b810181811067ffffffffffffffff82111715611321576113206112ca565b5b80604052505050565b600061133461116f565b905061134082826112f9565b919050565b600067ffffffffffffffff8211156113605761135f6112ca565b5b61136982611254565b9050602081019050919050565b82818337600083830152505050565b600061139861139384611345565b61132a565b9050828152602081018484840111156113b4576113b36112c5565b5b6113bf848285611376565b509392505050565b600082601f8301126113dc576113db6112c0565b5b81356113ec848260208601611385565b91505092915050565b60006020828403121561140b5761140a611179565b5b600082013567ffffffffffffffff8111156114295761142861117e565b5b611435848285016113c7565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60006114658261143e565b61146f8185611449565b935061147f81856020860161122a565b61148881611254565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000819050919050565b6114d2816114bf565b82525050565b600060ff82169050919050565b6114ee816114d8565b82525050565b60006060830160008301518482036000860152611511828261145a565b915050602083015161152660208601826114c9565b50604083015161153960408601826114e5565b508091505092915050565b600061155083836114f4565b905092915050565b6000602082019050919050565b600061157082611493565b61157a818561149e565b93508360208202850161158c856114af565b8060005b858110156115c857848403895281516115a98582611544565b94506115b483611558565b925060208a01995050600181019050611590565b50829750879550505050505092915050565b600060608301600083015184820360008601526115f7828261145a565b915050602083015184820360208601526116118282611565565b9150506040830151848203604086015261162b8282611565565b9150508091505092915050565b6000602082019050818103600083015261165281846115da565b905092915050565b6000806040838503121561167157611670611179565b5b600061167f858286016111cc565b925050602083013567ffffffffffffffff8111156116a05761169f61117e565b5b6116ac858286016113c7565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060408301600083015184820360008601526116ff828261145a565b915050602083015161171460208601826114c9565b508091505092915050565b600061172b83836116e2565b905092915050565b6000602082019050919050565b600061174b826116b6565b61175581856116c1565b935083602082028501611767856116d2565b8060005b858110156117a35784840389528151611784858261171f565b945061178f83611733565b925060208a0199505060018101905061176b565b50829750879550505050505092915050565b600060208201905081810360008301526117cf8184611740565b905092915050565b60008115159050919050565b6117ec816117d7565b82525050565b600060208201905061180760008301846117e3565b92915050565b600063ffffffff82169050919050565b6118268161180d565b811461183157600080fd5b50565b6000813590506118438161181d565b92915050565b600080604083850312156118605761185f611179565b5b600061186e858286016111cc565b925050602061187f85828601611834565b9150509250929050565b600082825260208201905092915050565b60006118a582611493565b6118af8185611889565b9350836020820285016118c1856114af565b8060005b858110156118fd57848403895281516118de8582611544565b94506118e983611558565b925060208a019950506001810190506118c5565b50829750879550505050505092915050565b60006020820190508181036000830152611929818461189a565b905092915050565b600067ffffffffffffffff82169050919050565b61194e81611931565b811461195957600080fd5b50565b60008135905061196b81611945565b92915050565b600080fd5b600060a0828403121561198c5761198b611971565b5b81905092915050565b600080600080608085870312156119af576119ae611179565b5b600085013567ffffffffffffffff8111156119cd576119cc61117e565b5b6119d9878288016113c7565b94505060206119ea8782880161195c565b93505060406119fb8782880161195c565b925050606085013567ffffffffffffffff811115611a1c57611a1b61117e565b5b611a2887828801611976565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611a6981611931565b82525050565b604082016000820151611a8560008501826114c9565b506020820151611a9860208501826114e5565b50505050565b606082016000820151611ab46000850182611a60565b506020820151611ac76020850182611a6f565b50505050565b6000611ad98383611a9e565b60608301905092915050565b6000602082019050919050565b6000611afd82611a34565b611b078185611a3f565b9350611b1283611a50565b8060005b83811015611b43578151611b2a8882611acd565b9750611b3583611ae5565b925050600181019050611b16565b5085935050505092915050565b600082825260208201905092915050565b6000611b6c8261120e565b611b768185611b50565b9350611b8681856020860161122a565b611b8f81611254565b840191505092915050565b60006040830160008301518482036000860152611bb78282611b61565b9150506020830151611bcc6020860182611a60565b508091505092915050565b60006040820190508181036000830152611bf18185611af2565b90508181036020830152611c058184611b9a565b90509392505050565b600080600060608486031215611c2757611c26611179565b5b600084013567ffffffffffffffff811115611c4557611c4461117e565b5b611c51868287016113c7565b9350506020611c62868287016111cc565b925050604084013567ffffffffffffffff811115611c8357611c8261117e565b5b611c8f868287016113c7565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000611cd1838361145a565b905092915050565b6000602082019050919050565b6000611cf182611c99565b611cfb8185611ca4565b935083602082028501611d0d85611cb5565b8060005b85811015611d495784840389528151611d2a8582611cc5565b9450611d3583611cd9565b925060208a01995050600181019050611d11565b50829750879550505050505092915050565b60006020820190508181036000830152611d758184611ce6565b905092915050565b600082825260208201905092915050565b6000611d998261143e565b611da38185611d7d565b9350611db381856020860161122a565b611dbc81611254565b840191505092915050565b60006020820190508181036000830152611de18184611d8e565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006040830160008301518482036000860152611e32828261145a565b91505060208301518482036020860152611e4c8282611565565b9150508091505092915050565b6000611e658383611e15565b905092915050565b6000602082019050919050565b6000611e8582611de9565b611e8f8185611df4565b935083602082028501611ea185611e05565b8060005b85811015611edd5784840389528151611ebe8582611e59565b9450611ec983611e6d565b925060208a01995050600181019050611ea5565b50829750879550505050505092915050565b60006040820190508181036000830152611f098185611e7a565b90508181036020830152611f1d818461189a565b90509392505050565b611f2f816111a3565b82525050565b6000602082019050611f4a6000830184611f26565b92915050565b600081905092915050565b6000611f668261120e565b611f708185611f50565b9350611f8081856020860161122a565b80840191505092915050565b6000611f988284611f5b565b915081905092915050565b7f6661696c65642073746174696343616c6c20746f20707265636f6d70696c6500600082015250565b6000611fd9601f83611d7d565b9150611fe482611fa3565b602082019050919050565b6000602082019050818103600083015261200881611fcc565b9050919050565b600080fd5b600080fd5b600061202c61202784611345565b61132a565b905082815260208101848484011115612048576120476112c5565b5b61205384828561122a565b509392505050565b600082601f8301126120705761206f6112c0565b5b8151612080848260208601612019565b91505092915050565b600067ffffffffffffffff8211156120a4576120a36112ca565b5b602082029050602081019050919050565b600080fd5b6120c3816114bf565b81146120ce57600080fd5b50565b6000815190506120e0816120ba565b92915050565b6120ef816114d8565b81146120fa57600080fd5b50565b60008151905061210c816120e6565b92915050565b6000606082840312156121285761212761200f565b5b612132606061132a565b9050600082015167ffffffffffffffff81111561215257612151612014565b5b61215e8482850161205b565b6000830152506020612172848285016120d1565b6020830152506040612186848285016120fd565b60408301525092915050565b60006121a56121a084612089565b61132a565b905080838252602082019050602084028301858111156121c8576121c76120b5565b5b835b8181101561220f57805167ffffffffffffffff8111156121ed576121ec6112c0565b5b8086016121fa8982612112565b855260208501945050506020810190506121ca565b5050509392505050565b600082601f83011261222e5761222d6112c0565b5b815161223e848260208601612192565b91505092915050565b60006060828403121561225d5761225c61200f565b5b612267606061132a565b9050600082015167ffffffffffffffff81111561228757612286612014565b5b6122938482850161205b565b600083015250602082015167ffffffffffffffff8111156122b7576122b6612014565b5b6122c384828501612219565b602083015250604082015167ffffffffffffffff8111156122e7576122e6612014565b5b6122f384828501612219565b60408301525092915050565b60006020828403121561231557612314611179565b5b600082015167ffffffffffffffff8111156123335761233261117e565b5b61233f84828501612247565b91505092915050565b600060408201905061235d6000830185611f26565b818103602083015261236f8184611d8e565b90509392505050565b7f6661696c65642064656c656761746543616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b60006123d4602183611d7d565b91506123df82612378565b604082019050919050565b60006020820190508181036000830152612403816123c7565b9050919050565b600067ffffffffffffffff821115612425576124246112ca565b5b602082029050602081019050919050565b60006040828403121561244c5761244b61200f565b5b612456604061132a565b9050600082015167ffffffffffffffff81111561247657612475612014565b5b6124828482850161205b565b6000830152506020612496848285016120d1565b60208301525092915050565b60006124b56124b08461240a565b61132a565b905080838252602082019050602084028301858111156124d8576124d76120b5565b5b835b8181101561251f57805167ffffffffffffffff8111156124fd576124fc6112c0565b5b80860161250a8982612436565b855260208501945050506020810190506124da565b5050509392505050565b600082601f83011261253e5761253d6112c0565b5b815161254e8482602086016124a2565b91505092915050565b60006020828403121561256d5761256c611179565b5b600082015167ffffffffffffffff81111561258b5761258a61117e565b5b61259784828501612529565b91505092915050565b6125a9816117d7565b81146125b457600080fd5b50565b6000815190506125c6816125a0565b92915050565b6000602082840312156125e2576125e1611179565b5b60006125f0848285016125b7565b91505092915050565b6126028161180d565b82525050565b600060408201905061261d6000830185611f26565b61262a60208301846125f9565b9392505050565b60006020828403121561264757612646611179565b5b600082015167ffffffffffffffff8111156126655761266461117e565b5b61267184828501612219565b91505092915050565b61268381611931565b82525050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126126b5576126b4612693565b5b83810192508235915060208301925067ffffffffffffffff8211156126dd576126dc612689565b5b6001820236038313156126f3576126f261268e565b5b509250929050565b60006127078385611b50565b9350612714838584611376565b61271d83611254565b840190509392505050565b6000612737602084018461195c565b905092915050565b60008135905061274e816125a0565b92915050565b6000612763602084018461273f565b905092915050565b612774816117d7565b82525050565b600060a0830161278d6000840184612698565b85830360008701526127a08382846126fb565b925050506127b16020840184612728565b6127be6020860182611a60565b506127cc6040840184612728565b6127d96040860182611a60565b506127e76060840184612754565b6127f4606086018261276b565b506128026080840184612754565b61280f608086018261276b565b508091505092915050565b600060808201905081810360008301526128348187611d8e565b9050612843602083018661267a565b612850604083018561267a565b8181036060830152612862818461277a565b905095945050505050565b600067ffffffffffffffff821115612888576128876112ca565b5b602082029050602081019050919050565b6000815190506128a881611945565b92915050565b6000604082840312156128c4576128c361200f565b5b6128ce604061132a565b905060006128de848285016120d1565b60008301525060206128f2848285016120fd565b60208301525092915050565b6000606082840312156129145761291361200f565b5b61291e604061132a565b9050600061292e84828501612899565b6000830152506020612942848285016128ae565b60208301525092915050565b600061296161295c8461286d565b61132a565b90508083825260208201905060608402830185811115612984576129836120b5565b5b835b818110156129ad578061299988826128fe565b845260208401935050606081019050612986565b5050509392505050565b600082601f8301126129cc576129cb6112c0565b5b81516129dc84826020860161294e565b91505092915050565b600067ffffffffffffffff821115612a00576129ff6112ca565b5b612a0982611254565b9050602081019050919050565b6000612a29612a24846129e5565b61132a565b905082815260208101848484011115612a4557612a446112c5565b5b612a5084828561122a565b509392505050565b600082601f830112612a6d57612a6c6112c0565b5b8151612a7d848260208601612a16565b91505092915050565b600060408284031215612a9c57612a9b61200f565b5b612aa6604061132a565b9050600082015167ffffffffffffffff811115612ac657612ac5612014565b5b612ad284828501612a58565b6000830152506020612ae684828501612899565b60208301525092915050565b60008060408385031215612b0957612b08611179565b5b600083015167ffffffffffffffff811115612b2757612b2661117e565b5b612b33858286016129b7565b925050602083015167ffffffffffffffff811115612b5457612b5361117e565b5b612b6085828601612a86565b9150509250929050565b7f6661696c656420746f2073657420776974686472617720616464726573730000600082015250565b6000612ba0601e83611d7d565b9150612bab82612b6a565b602082019050919050565b60006020820190508181036000830152612bcf81612b93565b9050919050565b600067ffffffffffffffff821115612bf157612bf06112ca565b5b602082029050602081019050919050565b6000612c15612c1084612bd6565b61132a565b90508083825260208201905060208402830185811115612c3857612c376120b5565b5b835b81811015612c7f57805167ffffffffffffffff811115612c5d57612c5c6112c0565b5b808601612c6a898261205b565b85526020850194505050602081019050612c3a565b5050509392505050565b600082601f830112612c9e57612c9d6112c0565b5b8151612cae848260208601612c02565b91505092915050565b600060208284031215612ccd57612ccc611179565b5b600082015167ffffffffffffffff811115612ceb57612cea61117e565b5b612cf784828501612c89565b91505092915050565b600060208284031215612d1657612d15611179565b5b600082015167ffffffffffffffff811115612d3457612d3361117e565b5b612d408482850161205b565b91505092915050565b600067ffffffffffffffff821115612d6457612d636112ca565b5b602082029050602081019050919050565b600060408284031215612d8b57612d8a61200f565b5b612d95604061132a565b9050600082015167ffffffffffffffff811115612db557612db4612014565b5b612dc18482850161205b565b600083015250602082015167ffffffffffffffff811115612de557612de4612014565b5b612df184828501612219565b60208301525092915050565b6000612e10612e0b84612d49565b61132a565b90508083825260208201905060208402830185811115612e3357612e326120b5565b5b835b81811015612e7a57805167ffffffffffffffff811115612e5857612e576112c0565b5b808601612e658982612d75565b85526020850194505050602081019050612e35565b5050509392505050565b600082601f830112612e9957612e986112c0565b5b8151612ea9848260208601612dfd565b91505092915050565b60008060408385031215612ec957612ec8611179565b5b600083015167ffffffffffffffff811115612ee757612ee661117e565b5b612ef385828601612e84565b925050602083015167ffffffffffffffff811115612f1457612f1361117e565b5b612f2085828601612219565b915050925092905056fea2646970667358221220cf4396ec7b4edbe92f84e734cb00403619140a4d2edc78ad2ca7bcc0361444dd64736f6c63430008120033" -} \ No newline at end of file + "_format": "hh-sol-artifact-1", + "contractName": "DistributionCaller", + "sourceName": "solidity/precompiles/testutil/contracts/DistributionCaller.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_delAddr", + "type": "address" + }, + { + "internalType": "string", + "name": "_withdrawAddr", + "type": "string" + } + ], + "name": "delegateCallSetWithdrawAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_delAddr", + "type": "address" + }, + { + "internalType": "string", + "name": "_valAddr", + "type": "string" + } + ], + "name": "getDelegationRewards", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "precision", + "type": "uint8" + } + ], + "internalType": "struct DecCoin[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_delAddr", + "type": "address" + } + ], + "name": "getDelegationTotalRewards", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "validatorAddress", + "type": "string" + }, + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "precision", + "type": "uint8" + } + ], + "internalType": "struct DecCoin[]", + "name": "reward", + "type": "tuple[]" + } + ], + "internalType": "struct DelegationDelegatorReward[]", + "name": "rewards", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "precision", + "type": "uint8" + } + ], + "internalType": "struct DecCoin[]", + "name": "total", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_delAddr", + "type": "address" + } + ], + "name": "getDelegatorValidators", + "outputs": [ + { + "internalType": "string[]", + "name": "", + "type": "string[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_delAddr", + "type": "address" + } + ], + "name": "getDelegatorWithdrawAddress", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_valAddr", + "type": "string" + } + ], + "name": "getValidatorCommission", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "precision", + "type": "uint8" + } + ], + "internalType": "struct DecCoin[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_valAddr", + "type": "string" + } + ], + "name": "getValidatorDistributionInfo", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "operatorAddress", + "type": "string" + }, + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "precision", + "type": "uint8" + } + ], + "internalType": "struct DecCoin[]", + "name": "selfBondRewards", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "precision", + "type": "uint8" + } + ], + "internalType": "struct DecCoin[]", + "name": "commission", + "type": "tuple[]" + } + ], + "internalType": "struct ValidatorDistributionInfo", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_valAddr", + "type": "string" + } + ], + "name": "getValidatorOutstandingRewards", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "precision", + "type": "uint8" + } + ], + "internalType": "struct DecCoin[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_valAddr", + "type": "string" + }, + { + "internalType": "uint64", + "name": "_startingHeight", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "_endingHeight", + "type": "uint64" + }, + { + "components": [ + { + "internalType": "bytes", + "name": "key", + "type": "bytes" + }, + { + "internalType": "uint64", + "name": "offset", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "limit", + "type": "uint64" + }, + { + "internalType": "bool", + "name": "countTotal", + "type": "bool" + }, + { + "internalType": "bool", + "name": "reverse", + "type": "bool" + } + ], + "internalType": "struct PageRequest", + "name": "pageRequest", + "type": "tuple" + } + ], + "name": "getValidatorSlashes", + "outputs": [ + { + "components": [ + { + "internalType": "uint64", + "name": "validatorPeriod", + "type": "uint64" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "precision", + "type": "uint8" + } + ], + "internalType": "struct Dec", + "name": "fraction", + "type": "tuple" + } + ], + "internalType": "struct ValidatorSlashEvent[]", + "name": "", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "bytes", + "name": "nextKey", + "type": "bytes" + }, + { + "internalType": "uint64", + "name": "total", + "type": "uint64" + } + ], + "internalType": "struct PageResponse", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_delAddr", + "type": "address" + } + ], + "name": "staticCallGetWithdrawAddress", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_delAddr", + "type": "address" + }, + { + "internalType": "string", + "name": "_withdrawAddr", + "type": "string" + } + ], + "name": "staticCallSetWithdrawAddress", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_delAddr", + "type": "address" + }, + { + "internalType": "uint32", + "name": "_maxRetrieve", + "type": "uint32" + } + ], + "name": "testClaimRewards", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_withdrawAddr", + "type": "string" + }, + { + "internalType": "address", + "name": "_delAddr", + "type": "address" + }, + { + "internalType": "string", + "name": "_valAddr", + "type": "string" + } + ], + "name": "testRevertState", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Coin[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_delAddr", + "type": "address" + }, + { + "internalType": "string", + "name": "_withdrawAddr", + "type": "string" + } + ], + "name": "testSetWithdrawAddress", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_withdrawAddr", + "type": "string" + } + ], + "name": "testSetWithdrawAddressFromContract", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_delAddr", + "type": "address" + }, + { + "internalType": "string", + "name": "_valAddr", + "type": "string" + } + ], + "name": "testWithdrawDelegatorRewards", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Coin[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_valAddr", + "type": "string" + } + ], + "name": "testWithdrawDelegatorRewardsFromContract", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Coin[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_valAddr", + "type": "string" + } + ], + "name": "testWithdrawValidatorCommission", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Coin[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b50612f60806100206000396000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c806388b2d581116100a2578063b6a216ae11610071578063b6a216ae14610364578063cb85aa0a14610394578063d3f831be146103c4578063e0421e39146103f4578063e236c7a61461042457610116565b806388b2d581146102a3578063963516e4146102d45780639819459314610304578063b2d178831461033457610116565b806346e16d34116100e957806346e16d34146101c75780636f669da4146101f757806378a5dfd114610227578063796b96d2146102575780637c9db0bb1461027357610116565b806301b680001461011b5780630c05e9e41461014b578063296c60aa1461017b5780632d0ee16a14610197575b600080fd5b610135600480360381019061013091906111e1565b610455565b604051610142919061129e565b60405180910390f35b610165600480360381019061016091906113f5565b61059d565b6040516101729190611638565b60405180910390f35b6101956004803603810190610190919061165a565b61062d565b005b6101b160048036038101906101ac91906113f5565b61076e565b6040516101be91906117b5565b60405180910390f35b6101e160048036038101906101dc919061165a565b6107fc565b6040516101ee91906117f2565b60405180910390f35b610211600480360381019061020c9190611849565b610886565b60405161021e91906117f2565b60405180910390f35b610241600480360381019061023c919061165a565b610910565b60405161024e919061190f565b60405180910390f35b610271600480360381019061026c919061165a565b61099d565b005b61028d600480360381019061028891906113f5565b610ade565b60405161029a919061190f565b60405180910390f35b6102bd60048036038101906102b89190611995565b610b68565b6040516102cb929190611bd7565b60405180910390f35b6102ee60048036038101906102e991906113f5565b610c06565b6040516102fb91906117f2565b60405180910390f35b61031e6004803603810190610319919061165a565b610c8f565b60405161032b91906117b5565b60405180910390f35b61034e60048036038101906103499190611c0e565b610d1e565b60405161035b91906117b5565b60405180910390f35b61037e600480360381019061037991906111e1565b610e73565b60405161038b9190611d5b565b60405180910390f35b6103ae60048036038101906103a991906111e1565b610efd565b6040516103bb9190611dc7565b60405180910390f35b6103de60048036038101906103d991906113f5565b610f87565b6040516103eb919061190f565b60405180910390f35b61040e600480360381019061040991906113f5565b611011565b60405161041b91906117b5565b60405180910390f35b61043e600480360381019061043991906111e1565b61109d565b60405161044c929190611eef565b60405180910390f35b606060008061080173ffffffffffffffffffffffffffffffffffffffff16846040516024016104849190611f35565b6040516020818303038152906040527f5431f450000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161050e9190611f8c565b600060405180830381855afa9150503d8060008114610549576040519150601f19603f3d011682016040523d82523d6000602084013e61054e565b606091505b509150915081610593576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058a90611fef565b60405180910390fd5b8092505050919050565b6105a561112a565b61080173ffffffffffffffffffffffffffffffffffffffff166354212a89836040518263ffffffff1660e01b81526004016105e09190611dc7565b600060405180830381865afa1580156105fd573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061062691906122ff565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff16838360405160240161065b929190612348565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516106e59190611f8c565b600060405180830381855af49150503d8060008114610720576040519150601f19603f3d011682016040523d82523d6000602084013e610725565b606091505b5050905080610769576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610760906123ea565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6130846040518363ffffffff1660e01b81526004016107ad929190612348565b6000604051808303816000875af11580156107cc573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906107f59190612557565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9684846040518363ffffffff1660e01b815260040161083b929190612348565b6020604051808303816000875af115801561085a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087e91906125cc565b905092915050565b600061080173ffffffffffffffffffffffffffffffffffffffff16632efe8a5f84846040518363ffffffff1660e01b81526004016108c5929190612608565b6020604051808303816000875af11580156108e4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090891906125cc565b905092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff16639ad563b484846040518363ffffffff1660e01b815260040161094f929190612348565b600060405180830381865afa15801561096c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906109959190612631565b905092915050565b600061080173ffffffffffffffffffffffffffffffffffffffff1683836040516024016109cb929190612348565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610a559190611f8c565b600060405180830381855afa9150503d8060008114610a90576040519150601f19603f3d011682016040523d82523d6000602084013e610a95565b606091505b5050905080610ad9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad090611fef565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633dd40f78836040518263ffffffff1660e01b8152600401610b1b9190611dc7565b600060405180830381865afa158015610b38573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610b619190612631565b9050919050565b6060610b7261114b565b61080173ffffffffffffffffffffffffffffffffffffffff16638f2473ce878787876040518563ffffffff1660e01b8152600401610bb3949392919061281a565b600060405180830381865afa158015610bd0573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610bf99190612af2565b9150915094509492505050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9630846040518363ffffffff1660e01b8152600401610c45929190612348565b6020604051808303816000875af1158015610c64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8891906125cc565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6184846040518363ffffffff1660e01b8152600401610cce929190612348565b6000604051808303816000875af1158015610ced573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610d169190612557565b905092915050565b6060600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9633876040518363ffffffff1660e01b8152600401610d5f929190612348565b6020604051808303816000875af1158015610d7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da291906125cc565b905080610de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddb90612bb6565b60405180910390fd5b61080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6185856040518363ffffffff1660e01b8152600401610e21929190612348565b6000604051808303816000875af1158015610e40573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610e699190612557565b9150509392505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663a66cb605836040518263ffffffff1660e01b8152600401610eb09190611f35565b600060405180830381865afa158015610ecd573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610ef69190612cb7565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff16635431f450836040518263ffffffff1660e01b8152600401610f3a9190611f35565b600060405180830381865afa158015610f57573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610f809190612d00565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff166385b2d2da836040518263ffffffff1660e01b8152600401610fc49190611dc7565b600060405180830381865afa158015610fe1573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061100a9190612631565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633ce4e3be836040518263ffffffff1660e01b815260040161104e9190611dc7565b6000604051808303816000875af115801561106d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110969190612557565b9050919050565b60608061080173ffffffffffffffffffffffffffffffffffffffff166354be1a28846040518263ffffffff1660e01b81526004016110db9190611f35565b600060405180830381865afa1580156110f8573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906111219190612eb2565b91509150915091565b60405180606001604052806060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006111ae82611183565b9050919050565b6111be816111a3565b81146111c957600080fd5b50565b6000813590506111db816111b5565b92915050565b6000602082840312156111f7576111f6611179565b5b6000611205848285016111cc565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561124857808201518184015260208101905061122d565b60008484015250505050565b6000601f19601f8301169050919050565b60006112708261120e565b61127a8185611219565b935061128a81856020860161122a565b61129381611254565b840191505092915050565b600060208201905081810360008301526112b88184611265565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61130282611254565b810181811067ffffffffffffffff82111715611321576113206112ca565b5b80604052505050565b600061133461116f565b905061134082826112f9565b919050565b600067ffffffffffffffff8211156113605761135f6112ca565b5b61136982611254565b9050602081019050919050565b82818337600083830152505050565b600061139861139384611345565b61132a565b9050828152602081018484840111156113b4576113b36112c5565b5b6113bf848285611376565b509392505050565b600082601f8301126113dc576113db6112c0565b5b81356113ec848260208601611385565b91505092915050565b60006020828403121561140b5761140a611179565b5b600082013567ffffffffffffffff8111156114295761142861117e565b5b611435848285016113c7565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60006114658261143e565b61146f8185611449565b935061147f81856020860161122a565b61148881611254565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000819050919050565b6114d2816114bf565b82525050565b600060ff82169050919050565b6114ee816114d8565b82525050565b60006060830160008301518482036000860152611511828261145a565b915050602083015161152660208601826114c9565b50604083015161153960408601826114e5565b508091505092915050565b600061155083836114f4565b905092915050565b6000602082019050919050565b600061157082611493565b61157a818561149e565b93508360208202850161158c856114af565b8060005b858110156115c857848403895281516115a98582611544565b94506115b483611558565b925060208a01995050600181019050611590565b50829750879550505050505092915050565b600060608301600083015184820360008601526115f7828261145a565b915050602083015184820360208601526116118282611565565b9150506040830151848203604086015261162b8282611565565b9150508091505092915050565b6000602082019050818103600083015261165281846115da565b905092915050565b6000806040838503121561167157611670611179565b5b600061167f858286016111cc565b925050602083013567ffffffffffffffff8111156116a05761169f61117e565b5b6116ac858286016113c7565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060408301600083015184820360008601526116ff828261145a565b915050602083015161171460208601826114c9565b508091505092915050565b600061172b83836116e2565b905092915050565b6000602082019050919050565b600061174b826116b6565b61175581856116c1565b935083602082028501611767856116d2565b8060005b858110156117a35784840389528151611784858261171f565b945061178f83611733565b925060208a0199505060018101905061176b565b50829750879550505050505092915050565b600060208201905081810360008301526117cf8184611740565b905092915050565b60008115159050919050565b6117ec816117d7565b82525050565b600060208201905061180760008301846117e3565b92915050565b600063ffffffff82169050919050565b6118268161180d565b811461183157600080fd5b50565b6000813590506118438161181d565b92915050565b600080604083850312156118605761185f611179565b5b600061186e858286016111cc565b925050602061187f85828601611834565b9150509250929050565b600082825260208201905092915050565b60006118a582611493565b6118af8185611889565b9350836020820285016118c1856114af565b8060005b858110156118fd57848403895281516118de8582611544565b94506118e983611558565b925060208a019950506001810190506118c5565b50829750879550505050505092915050565b60006020820190508181036000830152611929818461189a565b905092915050565b600067ffffffffffffffff82169050919050565b61194e81611931565b811461195957600080fd5b50565b60008135905061196b81611945565b92915050565b600080fd5b600060a0828403121561198c5761198b611971565b5b81905092915050565b600080600080608085870312156119af576119ae611179565b5b600085013567ffffffffffffffff8111156119cd576119cc61117e565b5b6119d9878288016113c7565b94505060206119ea8782880161195c565b93505060406119fb8782880161195c565b925050606085013567ffffffffffffffff811115611a1c57611a1b61117e565b5b611a2887828801611976565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611a6981611931565b82525050565b604082016000820151611a8560008501826114c9565b506020820151611a9860208501826114e5565b50505050565b606082016000820151611ab46000850182611a60565b506020820151611ac76020850182611a6f565b50505050565b6000611ad98383611a9e565b60608301905092915050565b6000602082019050919050565b6000611afd82611a34565b611b078185611a3f565b9350611b1283611a50565b8060005b83811015611b43578151611b2a8882611acd565b9750611b3583611ae5565b925050600181019050611b16565b5085935050505092915050565b600082825260208201905092915050565b6000611b6c8261120e565b611b768185611b50565b9350611b8681856020860161122a565b611b8f81611254565b840191505092915050565b60006040830160008301518482036000860152611bb78282611b61565b9150506020830151611bcc6020860182611a60565b508091505092915050565b60006040820190508181036000830152611bf18185611af2565b90508181036020830152611c058184611b9a565b90509392505050565b600080600060608486031215611c2757611c26611179565b5b600084013567ffffffffffffffff811115611c4557611c4461117e565b5b611c51868287016113c7565b9350506020611c62868287016111cc565b925050604084013567ffffffffffffffff811115611c8357611c8261117e565b5b611c8f868287016113c7565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000611cd1838361145a565b905092915050565b6000602082019050919050565b6000611cf182611c99565b611cfb8185611ca4565b935083602082028501611d0d85611cb5565b8060005b85811015611d495784840389528151611d2a8582611cc5565b9450611d3583611cd9565b925060208a01995050600181019050611d11565b50829750879550505050505092915050565b60006020820190508181036000830152611d758184611ce6565b905092915050565b600082825260208201905092915050565b6000611d998261143e565b611da38185611d7d565b9350611db381856020860161122a565b611dbc81611254565b840191505092915050565b60006020820190508181036000830152611de18184611d8e565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006040830160008301518482036000860152611e32828261145a565b91505060208301518482036020860152611e4c8282611565565b9150508091505092915050565b6000611e658383611e15565b905092915050565b6000602082019050919050565b6000611e8582611de9565b611e8f8185611df4565b935083602082028501611ea185611e05565b8060005b85811015611edd5784840389528151611ebe8582611e59565b9450611ec983611e6d565b925060208a01995050600181019050611ea5565b50829750879550505050505092915050565b60006040820190508181036000830152611f098185611e7a565b90508181036020830152611f1d818461189a565b90509392505050565b611f2f816111a3565b82525050565b6000602082019050611f4a6000830184611f26565b92915050565b600081905092915050565b6000611f668261120e565b611f708185611f50565b9350611f8081856020860161122a565b80840191505092915050565b6000611f988284611f5b565b915081905092915050565b7f6661696c65642073746174696343616c6c20746f20707265636f6d70696c6500600082015250565b6000611fd9601f83611d7d565b9150611fe482611fa3565b602082019050919050565b6000602082019050818103600083015261200881611fcc565b9050919050565b600080fd5b600080fd5b600061202c61202784611345565b61132a565b905082815260208101848484011115612048576120476112c5565b5b61205384828561122a565b509392505050565b600082601f8301126120705761206f6112c0565b5b8151612080848260208601612019565b91505092915050565b600067ffffffffffffffff8211156120a4576120a36112ca565b5b602082029050602081019050919050565b600080fd5b6120c3816114bf565b81146120ce57600080fd5b50565b6000815190506120e0816120ba565b92915050565b6120ef816114d8565b81146120fa57600080fd5b50565b60008151905061210c816120e6565b92915050565b6000606082840312156121285761212761200f565b5b612132606061132a565b9050600082015167ffffffffffffffff81111561215257612151612014565b5b61215e8482850161205b565b6000830152506020612172848285016120d1565b6020830152506040612186848285016120fd565b60408301525092915050565b60006121a56121a084612089565b61132a565b905080838252602082019050602084028301858111156121c8576121c76120b5565b5b835b8181101561220f57805167ffffffffffffffff8111156121ed576121ec6112c0565b5b8086016121fa8982612112565b855260208501945050506020810190506121ca565b5050509392505050565b600082601f83011261222e5761222d6112c0565b5b815161223e848260208601612192565b91505092915050565b60006060828403121561225d5761225c61200f565b5b612267606061132a565b9050600082015167ffffffffffffffff81111561228757612286612014565b5b6122938482850161205b565b600083015250602082015167ffffffffffffffff8111156122b7576122b6612014565b5b6122c384828501612219565b602083015250604082015167ffffffffffffffff8111156122e7576122e6612014565b5b6122f384828501612219565b60408301525092915050565b60006020828403121561231557612314611179565b5b600082015167ffffffffffffffff8111156123335761233261117e565b5b61233f84828501612247565b91505092915050565b600060408201905061235d6000830185611f26565b818103602083015261236f8184611d8e565b90509392505050565b7f6661696c65642064656c656761746543616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b60006123d4602183611d7d565b91506123df82612378565b604082019050919050565b60006020820190508181036000830152612403816123c7565b9050919050565b600067ffffffffffffffff821115612425576124246112ca565b5b602082029050602081019050919050565b60006040828403121561244c5761244b61200f565b5b612456604061132a565b9050600082015167ffffffffffffffff81111561247657612475612014565b5b6124828482850161205b565b6000830152506020612496848285016120d1565b60208301525092915050565b60006124b56124b08461240a565b61132a565b905080838252602082019050602084028301858111156124d8576124d76120b5565b5b835b8181101561251f57805167ffffffffffffffff8111156124fd576124fc6112c0565b5b80860161250a8982612436565b855260208501945050506020810190506124da565b5050509392505050565b600082601f83011261253e5761253d6112c0565b5b815161254e8482602086016124a2565b91505092915050565b60006020828403121561256d5761256c611179565b5b600082015167ffffffffffffffff81111561258b5761258a61117e565b5b61259784828501612529565b91505092915050565b6125a9816117d7565b81146125b457600080fd5b50565b6000815190506125c6816125a0565b92915050565b6000602082840312156125e2576125e1611179565b5b60006125f0848285016125b7565b91505092915050565b6126028161180d565b82525050565b600060408201905061261d6000830185611f26565b61262a60208301846125f9565b9392505050565b60006020828403121561264757612646611179565b5b600082015167ffffffffffffffff8111156126655761266461117e565b5b61267184828501612219565b91505092915050565b61268381611931565b82525050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126126b5576126b4612693565b5b83810192508235915060208301925067ffffffffffffffff8211156126dd576126dc612689565b5b6001820236038313156126f3576126f261268e565b5b509250929050565b60006127078385611b50565b9350612714838584611376565b61271d83611254565b840190509392505050565b6000612737602084018461195c565b905092915050565b60008135905061274e816125a0565b92915050565b6000612763602084018461273f565b905092915050565b612774816117d7565b82525050565b600060a0830161278d6000840184612698565b85830360008701526127a08382846126fb565b925050506127b16020840184612728565b6127be6020860182611a60565b506127cc6040840184612728565b6127d96040860182611a60565b506127e76060840184612754565b6127f4606086018261276b565b506128026080840184612754565b61280f608086018261276b565b508091505092915050565b600060808201905081810360008301526128348187611d8e565b9050612843602083018661267a565b612850604083018561267a565b8181036060830152612862818461277a565b905095945050505050565b600067ffffffffffffffff821115612888576128876112ca565b5b602082029050602081019050919050565b6000815190506128a881611945565b92915050565b6000604082840312156128c4576128c361200f565b5b6128ce604061132a565b905060006128de848285016120d1565b60008301525060206128f2848285016120fd565b60208301525092915050565b6000606082840312156129145761291361200f565b5b61291e604061132a565b9050600061292e84828501612899565b6000830152506020612942848285016128ae565b60208301525092915050565b600061296161295c8461286d565b61132a565b90508083825260208201905060608402830185811115612984576129836120b5565b5b835b818110156129ad578061299988826128fe565b845260208401935050606081019050612986565b5050509392505050565b600082601f8301126129cc576129cb6112c0565b5b81516129dc84826020860161294e565b91505092915050565b600067ffffffffffffffff821115612a00576129ff6112ca565b5b612a0982611254565b9050602081019050919050565b6000612a29612a24846129e5565b61132a565b905082815260208101848484011115612a4557612a446112c5565b5b612a5084828561122a565b509392505050565b600082601f830112612a6d57612a6c6112c0565b5b8151612a7d848260208601612a16565b91505092915050565b600060408284031215612a9c57612a9b61200f565b5b612aa6604061132a565b9050600082015167ffffffffffffffff811115612ac657612ac5612014565b5b612ad284828501612a58565b6000830152506020612ae684828501612899565b60208301525092915050565b60008060408385031215612b0957612b08611179565b5b600083015167ffffffffffffffff811115612b2757612b2661117e565b5b612b33858286016129b7565b925050602083015167ffffffffffffffff811115612b5457612b5361117e565b5b612b6085828601612a86565b9150509250929050565b7f6661696c656420746f2073657420776974686472617720616464726573730000600082015250565b6000612ba0601e83611d7d565b9150612bab82612b6a565b602082019050919050565b60006020820190508181036000830152612bcf81612b93565b9050919050565b600067ffffffffffffffff821115612bf157612bf06112ca565b5b602082029050602081019050919050565b6000612c15612c1084612bd6565b61132a565b90508083825260208201905060208402830185811115612c3857612c376120b5565b5b835b81811015612c7f57805167ffffffffffffffff811115612c5d57612c5c6112c0565b5b808601612c6a898261205b565b85526020850194505050602081019050612c3a565b5050509392505050565b600082601f830112612c9e57612c9d6112c0565b5b8151612cae848260208601612c02565b91505092915050565b600060208284031215612ccd57612ccc611179565b5b600082015167ffffffffffffffff811115612ceb57612cea61117e565b5b612cf784828501612c89565b91505092915050565b600060208284031215612d1657612d15611179565b5b600082015167ffffffffffffffff811115612d3457612d3361117e565b5b612d408482850161205b565b91505092915050565b600067ffffffffffffffff821115612d6457612d636112ca565b5b602082029050602081019050919050565b600060408284031215612d8b57612d8a61200f565b5b612d95604061132a565b9050600082015167ffffffffffffffff811115612db557612db4612014565b5b612dc18482850161205b565b600083015250602082015167ffffffffffffffff811115612de557612de4612014565b5b612df184828501612219565b60208301525092915050565b6000612e10612e0b84612d49565b61132a565b90508083825260208201905060208402830185811115612e3357612e326120b5565b5b835b81811015612e7a57805167ffffffffffffffff811115612e5857612e576112c0565b5b808601612e658982612d75565b85526020850194505050602081019050612e35565b5050509392505050565b600082601f830112612e9957612e986112c0565b5b8151612ea9848260208601612dfd565b91505092915050565b60008060408385031215612ec957612ec8611179565b5b600083015167ffffffffffffffff811115612ee757612ee661117e565b5b612ef385828601612e84565b925050602083015167ffffffffffffffff811115612f1457612f1361117e565b5b612f2085828601612219565b915050925092905056fea2646970667358221220ca1dd756af2118cc5041e4bd9542a13fbf7b9e315028de6ce067eeaf65d30ed364736f6c63430008130033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101165760003560e01c806388b2d581116100a2578063b6a216ae11610071578063b6a216ae14610364578063cb85aa0a14610394578063d3f831be146103c4578063e0421e39146103f4578063e236c7a61461042457610116565b806388b2d581146102a3578063963516e4146102d45780639819459314610304578063b2d178831461033457610116565b806346e16d34116100e957806346e16d34146101c75780636f669da4146101f757806378a5dfd114610227578063796b96d2146102575780637c9db0bb1461027357610116565b806301b680001461011b5780630c05e9e41461014b578063296c60aa1461017b5780632d0ee16a14610197575b600080fd5b610135600480360381019061013091906111e1565b610455565b604051610142919061129e565b60405180910390f35b610165600480360381019061016091906113f5565b61059d565b6040516101729190611638565b60405180910390f35b6101956004803603810190610190919061165a565b61062d565b005b6101b160048036038101906101ac91906113f5565b61076e565b6040516101be91906117b5565b60405180910390f35b6101e160048036038101906101dc919061165a565b6107fc565b6040516101ee91906117f2565b60405180910390f35b610211600480360381019061020c9190611849565b610886565b60405161021e91906117f2565b60405180910390f35b610241600480360381019061023c919061165a565b610910565b60405161024e919061190f565b60405180910390f35b610271600480360381019061026c919061165a565b61099d565b005b61028d600480360381019061028891906113f5565b610ade565b60405161029a919061190f565b60405180910390f35b6102bd60048036038101906102b89190611995565b610b68565b6040516102cb929190611bd7565b60405180910390f35b6102ee60048036038101906102e991906113f5565b610c06565b6040516102fb91906117f2565b60405180910390f35b61031e6004803603810190610319919061165a565b610c8f565b60405161032b91906117b5565b60405180910390f35b61034e60048036038101906103499190611c0e565b610d1e565b60405161035b91906117b5565b60405180910390f35b61037e600480360381019061037991906111e1565b610e73565b60405161038b9190611d5b565b60405180910390f35b6103ae60048036038101906103a991906111e1565b610efd565b6040516103bb9190611dc7565b60405180910390f35b6103de60048036038101906103d991906113f5565b610f87565b6040516103eb919061190f565b60405180910390f35b61040e600480360381019061040991906113f5565b611011565b60405161041b91906117b5565b60405180910390f35b61043e600480360381019061043991906111e1565b61109d565b60405161044c929190611eef565b60405180910390f35b606060008061080173ffffffffffffffffffffffffffffffffffffffff16846040516024016104849190611f35565b6040516020818303038152906040527f5431f450000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161050e9190611f8c565b600060405180830381855afa9150503d8060008114610549576040519150601f19603f3d011682016040523d82523d6000602084013e61054e565b606091505b509150915081610593576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058a90611fef565b60405180910390fd5b8092505050919050565b6105a561112a565b61080173ffffffffffffffffffffffffffffffffffffffff166354212a89836040518263ffffffff1660e01b81526004016105e09190611dc7565b600060405180830381865afa1580156105fd573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061062691906122ff565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff16838360405160240161065b929190612348565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516106e59190611f8c565b600060405180830381855af49150503d8060008114610720576040519150601f19603f3d011682016040523d82523d6000602084013e610725565b606091505b5050905080610769576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610760906123ea565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6130846040518363ffffffff1660e01b81526004016107ad929190612348565b6000604051808303816000875af11580156107cc573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906107f59190612557565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9684846040518363ffffffff1660e01b815260040161083b929190612348565b6020604051808303816000875af115801561085a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087e91906125cc565b905092915050565b600061080173ffffffffffffffffffffffffffffffffffffffff16632efe8a5f84846040518363ffffffff1660e01b81526004016108c5929190612608565b6020604051808303816000875af11580156108e4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090891906125cc565b905092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff16639ad563b484846040518363ffffffff1660e01b815260040161094f929190612348565b600060405180830381865afa15801561096c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906109959190612631565b905092915050565b600061080173ffffffffffffffffffffffffffffffffffffffff1683836040516024016109cb929190612348565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610a559190611f8c565b600060405180830381855afa9150503d8060008114610a90576040519150601f19603f3d011682016040523d82523d6000602084013e610a95565b606091505b5050905080610ad9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad090611fef565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633dd40f78836040518263ffffffff1660e01b8152600401610b1b9190611dc7565b600060405180830381865afa158015610b38573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610b619190612631565b9050919050565b6060610b7261114b565b61080173ffffffffffffffffffffffffffffffffffffffff16638f2473ce878787876040518563ffffffff1660e01b8152600401610bb3949392919061281a565b600060405180830381865afa158015610bd0573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610bf99190612af2565b9150915094509492505050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9630846040518363ffffffff1660e01b8152600401610c45929190612348565b6020604051808303816000875af1158015610c64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8891906125cc565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6184846040518363ffffffff1660e01b8152600401610cce929190612348565b6000604051808303816000875af1158015610ced573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610d169190612557565b905092915050565b6060600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9633876040518363ffffffff1660e01b8152600401610d5f929190612348565b6020604051808303816000875af1158015610d7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da291906125cc565b905080610de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddb90612bb6565b60405180910390fd5b61080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6185856040518363ffffffff1660e01b8152600401610e21929190612348565b6000604051808303816000875af1158015610e40573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610e699190612557565b9150509392505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663a66cb605836040518263ffffffff1660e01b8152600401610eb09190611f35565b600060405180830381865afa158015610ecd573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610ef69190612cb7565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff16635431f450836040518263ffffffff1660e01b8152600401610f3a9190611f35565b600060405180830381865afa158015610f57573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610f809190612d00565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff166385b2d2da836040518263ffffffff1660e01b8152600401610fc49190611dc7565b600060405180830381865afa158015610fe1573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061100a9190612631565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633ce4e3be836040518263ffffffff1660e01b815260040161104e9190611dc7565b6000604051808303816000875af115801561106d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110969190612557565b9050919050565b60608061080173ffffffffffffffffffffffffffffffffffffffff166354be1a28846040518263ffffffff1660e01b81526004016110db9190611f35565b600060405180830381865afa1580156110f8573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906111219190612eb2565b91509150915091565b60405180606001604052806060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006111ae82611183565b9050919050565b6111be816111a3565b81146111c957600080fd5b50565b6000813590506111db816111b5565b92915050565b6000602082840312156111f7576111f6611179565b5b6000611205848285016111cc565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561124857808201518184015260208101905061122d565b60008484015250505050565b6000601f19601f8301169050919050565b60006112708261120e565b61127a8185611219565b935061128a81856020860161122a565b61129381611254565b840191505092915050565b600060208201905081810360008301526112b88184611265565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61130282611254565b810181811067ffffffffffffffff82111715611321576113206112ca565b5b80604052505050565b600061133461116f565b905061134082826112f9565b919050565b600067ffffffffffffffff8211156113605761135f6112ca565b5b61136982611254565b9050602081019050919050565b82818337600083830152505050565b600061139861139384611345565b61132a565b9050828152602081018484840111156113b4576113b36112c5565b5b6113bf848285611376565b509392505050565b600082601f8301126113dc576113db6112c0565b5b81356113ec848260208601611385565b91505092915050565b60006020828403121561140b5761140a611179565b5b600082013567ffffffffffffffff8111156114295761142861117e565b5b611435848285016113c7565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60006114658261143e565b61146f8185611449565b935061147f81856020860161122a565b61148881611254565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000819050919050565b6114d2816114bf565b82525050565b600060ff82169050919050565b6114ee816114d8565b82525050565b60006060830160008301518482036000860152611511828261145a565b915050602083015161152660208601826114c9565b50604083015161153960408601826114e5565b508091505092915050565b600061155083836114f4565b905092915050565b6000602082019050919050565b600061157082611493565b61157a818561149e565b93508360208202850161158c856114af565b8060005b858110156115c857848403895281516115a98582611544565b94506115b483611558565b925060208a01995050600181019050611590565b50829750879550505050505092915050565b600060608301600083015184820360008601526115f7828261145a565b915050602083015184820360208601526116118282611565565b9150506040830151848203604086015261162b8282611565565b9150508091505092915050565b6000602082019050818103600083015261165281846115da565b905092915050565b6000806040838503121561167157611670611179565b5b600061167f858286016111cc565b925050602083013567ffffffffffffffff8111156116a05761169f61117e565b5b6116ac858286016113c7565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060408301600083015184820360008601526116ff828261145a565b915050602083015161171460208601826114c9565b508091505092915050565b600061172b83836116e2565b905092915050565b6000602082019050919050565b600061174b826116b6565b61175581856116c1565b935083602082028501611767856116d2565b8060005b858110156117a35784840389528151611784858261171f565b945061178f83611733565b925060208a0199505060018101905061176b565b50829750879550505050505092915050565b600060208201905081810360008301526117cf8184611740565b905092915050565b60008115159050919050565b6117ec816117d7565b82525050565b600060208201905061180760008301846117e3565b92915050565b600063ffffffff82169050919050565b6118268161180d565b811461183157600080fd5b50565b6000813590506118438161181d565b92915050565b600080604083850312156118605761185f611179565b5b600061186e858286016111cc565b925050602061187f85828601611834565b9150509250929050565b600082825260208201905092915050565b60006118a582611493565b6118af8185611889565b9350836020820285016118c1856114af565b8060005b858110156118fd57848403895281516118de8582611544565b94506118e983611558565b925060208a019950506001810190506118c5565b50829750879550505050505092915050565b60006020820190508181036000830152611929818461189a565b905092915050565b600067ffffffffffffffff82169050919050565b61194e81611931565b811461195957600080fd5b50565b60008135905061196b81611945565b92915050565b600080fd5b600060a0828403121561198c5761198b611971565b5b81905092915050565b600080600080608085870312156119af576119ae611179565b5b600085013567ffffffffffffffff8111156119cd576119cc61117e565b5b6119d9878288016113c7565b94505060206119ea8782880161195c565b93505060406119fb8782880161195c565b925050606085013567ffffffffffffffff811115611a1c57611a1b61117e565b5b611a2887828801611976565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611a6981611931565b82525050565b604082016000820151611a8560008501826114c9565b506020820151611a9860208501826114e5565b50505050565b606082016000820151611ab46000850182611a60565b506020820151611ac76020850182611a6f565b50505050565b6000611ad98383611a9e565b60608301905092915050565b6000602082019050919050565b6000611afd82611a34565b611b078185611a3f565b9350611b1283611a50565b8060005b83811015611b43578151611b2a8882611acd565b9750611b3583611ae5565b925050600181019050611b16565b5085935050505092915050565b600082825260208201905092915050565b6000611b6c8261120e565b611b768185611b50565b9350611b8681856020860161122a565b611b8f81611254565b840191505092915050565b60006040830160008301518482036000860152611bb78282611b61565b9150506020830151611bcc6020860182611a60565b508091505092915050565b60006040820190508181036000830152611bf18185611af2565b90508181036020830152611c058184611b9a565b90509392505050565b600080600060608486031215611c2757611c26611179565b5b600084013567ffffffffffffffff811115611c4557611c4461117e565b5b611c51868287016113c7565b9350506020611c62868287016111cc565b925050604084013567ffffffffffffffff811115611c8357611c8261117e565b5b611c8f868287016113c7565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000611cd1838361145a565b905092915050565b6000602082019050919050565b6000611cf182611c99565b611cfb8185611ca4565b935083602082028501611d0d85611cb5565b8060005b85811015611d495784840389528151611d2a8582611cc5565b9450611d3583611cd9565b925060208a01995050600181019050611d11565b50829750879550505050505092915050565b60006020820190508181036000830152611d758184611ce6565b905092915050565b600082825260208201905092915050565b6000611d998261143e565b611da38185611d7d565b9350611db381856020860161122a565b611dbc81611254565b840191505092915050565b60006020820190508181036000830152611de18184611d8e565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006040830160008301518482036000860152611e32828261145a565b91505060208301518482036020860152611e4c8282611565565b9150508091505092915050565b6000611e658383611e15565b905092915050565b6000602082019050919050565b6000611e8582611de9565b611e8f8185611df4565b935083602082028501611ea185611e05565b8060005b85811015611edd5784840389528151611ebe8582611e59565b9450611ec983611e6d565b925060208a01995050600181019050611ea5565b50829750879550505050505092915050565b60006040820190508181036000830152611f098185611e7a565b90508181036020830152611f1d818461189a565b90509392505050565b611f2f816111a3565b82525050565b6000602082019050611f4a6000830184611f26565b92915050565b600081905092915050565b6000611f668261120e565b611f708185611f50565b9350611f8081856020860161122a565b80840191505092915050565b6000611f988284611f5b565b915081905092915050565b7f6661696c65642073746174696343616c6c20746f20707265636f6d70696c6500600082015250565b6000611fd9601f83611d7d565b9150611fe482611fa3565b602082019050919050565b6000602082019050818103600083015261200881611fcc565b9050919050565b600080fd5b600080fd5b600061202c61202784611345565b61132a565b905082815260208101848484011115612048576120476112c5565b5b61205384828561122a565b509392505050565b600082601f8301126120705761206f6112c0565b5b8151612080848260208601612019565b91505092915050565b600067ffffffffffffffff8211156120a4576120a36112ca565b5b602082029050602081019050919050565b600080fd5b6120c3816114bf565b81146120ce57600080fd5b50565b6000815190506120e0816120ba565b92915050565b6120ef816114d8565b81146120fa57600080fd5b50565b60008151905061210c816120e6565b92915050565b6000606082840312156121285761212761200f565b5b612132606061132a565b9050600082015167ffffffffffffffff81111561215257612151612014565b5b61215e8482850161205b565b6000830152506020612172848285016120d1565b6020830152506040612186848285016120fd565b60408301525092915050565b60006121a56121a084612089565b61132a565b905080838252602082019050602084028301858111156121c8576121c76120b5565b5b835b8181101561220f57805167ffffffffffffffff8111156121ed576121ec6112c0565b5b8086016121fa8982612112565b855260208501945050506020810190506121ca565b5050509392505050565b600082601f83011261222e5761222d6112c0565b5b815161223e848260208601612192565b91505092915050565b60006060828403121561225d5761225c61200f565b5b612267606061132a565b9050600082015167ffffffffffffffff81111561228757612286612014565b5b6122938482850161205b565b600083015250602082015167ffffffffffffffff8111156122b7576122b6612014565b5b6122c384828501612219565b602083015250604082015167ffffffffffffffff8111156122e7576122e6612014565b5b6122f384828501612219565b60408301525092915050565b60006020828403121561231557612314611179565b5b600082015167ffffffffffffffff8111156123335761233261117e565b5b61233f84828501612247565b91505092915050565b600060408201905061235d6000830185611f26565b818103602083015261236f8184611d8e565b90509392505050565b7f6661696c65642064656c656761746543616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b60006123d4602183611d7d565b91506123df82612378565b604082019050919050565b60006020820190508181036000830152612403816123c7565b9050919050565b600067ffffffffffffffff821115612425576124246112ca565b5b602082029050602081019050919050565b60006040828403121561244c5761244b61200f565b5b612456604061132a565b9050600082015167ffffffffffffffff81111561247657612475612014565b5b6124828482850161205b565b6000830152506020612496848285016120d1565b60208301525092915050565b60006124b56124b08461240a565b61132a565b905080838252602082019050602084028301858111156124d8576124d76120b5565b5b835b8181101561251f57805167ffffffffffffffff8111156124fd576124fc6112c0565b5b80860161250a8982612436565b855260208501945050506020810190506124da565b5050509392505050565b600082601f83011261253e5761253d6112c0565b5b815161254e8482602086016124a2565b91505092915050565b60006020828403121561256d5761256c611179565b5b600082015167ffffffffffffffff81111561258b5761258a61117e565b5b61259784828501612529565b91505092915050565b6125a9816117d7565b81146125b457600080fd5b50565b6000815190506125c6816125a0565b92915050565b6000602082840312156125e2576125e1611179565b5b60006125f0848285016125b7565b91505092915050565b6126028161180d565b82525050565b600060408201905061261d6000830185611f26565b61262a60208301846125f9565b9392505050565b60006020828403121561264757612646611179565b5b600082015167ffffffffffffffff8111156126655761266461117e565b5b61267184828501612219565b91505092915050565b61268381611931565b82525050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126126b5576126b4612693565b5b83810192508235915060208301925067ffffffffffffffff8211156126dd576126dc612689565b5b6001820236038313156126f3576126f261268e565b5b509250929050565b60006127078385611b50565b9350612714838584611376565b61271d83611254565b840190509392505050565b6000612737602084018461195c565b905092915050565b60008135905061274e816125a0565b92915050565b6000612763602084018461273f565b905092915050565b612774816117d7565b82525050565b600060a0830161278d6000840184612698565b85830360008701526127a08382846126fb565b925050506127b16020840184612728565b6127be6020860182611a60565b506127cc6040840184612728565b6127d96040860182611a60565b506127e76060840184612754565b6127f4606086018261276b565b506128026080840184612754565b61280f608086018261276b565b508091505092915050565b600060808201905081810360008301526128348187611d8e565b9050612843602083018661267a565b612850604083018561267a565b8181036060830152612862818461277a565b905095945050505050565b600067ffffffffffffffff821115612888576128876112ca565b5b602082029050602081019050919050565b6000815190506128a881611945565b92915050565b6000604082840312156128c4576128c361200f565b5b6128ce604061132a565b905060006128de848285016120d1565b60008301525060206128f2848285016120fd565b60208301525092915050565b6000606082840312156129145761291361200f565b5b61291e604061132a565b9050600061292e84828501612899565b6000830152506020612942848285016128ae565b60208301525092915050565b600061296161295c8461286d565b61132a565b90508083825260208201905060608402830185811115612984576129836120b5565b5b835b818110156129ad578061299988826128fe565b845260208401935050606081019050612986565b5050509392505050565b600082601f8301126129cc576129cb6112c0565b5b81516129dc84826020860161294e565b91505092915050565b600067ffffffffffffffff821115612a00576129ff6112ca565b5b612a0982611254565b9050602081019050919050565b6000612a29612a24846129e5565b61132a565b905082815260208101848484011115612a4557612a446112c5565b5b612a5084828561122a565b509392505050565b600082601f830112612a6d57612a6c6112c0565b5b8151612a7d848260208601612a16565b91505092915050565b600060408284031215612a9c57612a9b61200f565b5b612aa6604061132a565b9050600082015167ffffffffffffffff811115612ac657612ac5612014565b5b612ad284828501612a58565b6000830152506020612ae684828501612899565b60208301525092915050565b60008060408385031215612b0957612b08611179565b5b600083015167ffffffffffffffff811115612b2757612b2661117e565b5b612b33858286016129b7565b925050602083015167ffffffffffffffff811115612b5457612b5361117e565b5b612b6085828601612a86565b9150509250929050565b7f6661696c656420746f2073657420776974686472617720616464726573730000600082015250565b6000612ba0601e83611d7d565b9150612bab82612b6a565b602082019050919050565b60006020820190508181036000830152612bcf81612b93565b9050919050565b600067ffffffffffffffff821115612bf157612bf06112ca565b5b602082029050602081019050919050565b6000612c15612c1084612bd6565b61132a565b90508083825260208201905060208402830185811115612c3857612c376120b5565b5b835b81811015612c7f57805167ffffffffffffffff811115612c5d57612c5c6112c0565b5b808601612c6a898261205b565b85526020850194505050602081019050612c3a565b5050509392505050565b600082601f830112612c9e57612c9d6112c0565b5b8151612cae848260208601612c02565b91505092915050565b600060208284031215612ccd57612ccc611179565b5b600082015167ffffffffffffffff811115612ceb57612cea61117e565b5b612cf784828501612c89565b91505092915050565b600060208284031215612d1657612d15611179565b5b600082015167ffffffffffffffff811115612d3457612d3361117e565b5b612d408482850161205b565b91505092915050565b600067ffffffffffffffff821115612d6457612d636112ca565b5b602082029050602081019050919050565b600060408284031215612d8b57612d8a61200f565b5b612d95604061132a565b9050600082015167ffffffffffffffff811115612db557612db4612014565b5b612dc18482850161205b565b600083015250602082015167ffffffffffffffff811115612de557612de4612014565b5b612df184828501612219565b60208301525092915050565b6000612e10612e0b84612d49565b61132a565b90508083825260208201905060208402830185811115612e3357612e326120b5565b5b835b81811015612e7a57805167ffffffffffffffff811115612e5857612e576112c0565b5b808601612e658982612d75565b85526020850194505050602081019050612e35565b5050509392505050565b600082601f830112612e9957612e986112c0565b5b8151612ea9848260208601612dfd565b91505092915050565b60008060408385031215612ec957612ec8611179565b5b600083015167ffffffffffffffff811115612ee757612ee661117e565b5b612ef385828601612e84565b925050602083015167ffffffffffffffff811115612f1457612f1361117e565b5b612f2085828601612219565b915050925092905056fea2646970667358221220ca1dd756af2118cc5041e4bd9542a13fbf7b9e315028de6ce067eeaf65d30ed364736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/precompiles/testutil/contracts/InterchainSender.json b/precompiles/testutil/contracts/InterchainSender.json index 388e969168..dd9aee7ed3 100644 --- a/precompiles/testutil/contracts/InterchainSender.json +++ b/precompiles/testutil/contracts/InterchainSender.json @@ -1,4 +1,436 @@ { - "abi": "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"testAllowance\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"sourcePort\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"sourceChannel\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"struct Coin[]\",\"name\":\"spendLimit\",\"type\":\"tuple[]\"},{\"internalType\":\"string[]\",\"name\":\"allowList\",\"type\":\"string[]\"}],\"internalType\":\"struct Allocation[]\",\"name\":\"allocations\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"sourcePort\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"sourceChannel\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"struct Coin[]\",\"name\":\"spendLimit\",\"type\":\"tuple[]\"},{\"internalType\":\"string[]\",\"name\":\"allowList\",\"type\":\"string[]\"}],\"internalType\":\"struct Allocation[]\",\"name\":\"allocs\",\"type\":\"tuple[]\"}],\"name\":\"testApprove\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"sourcePort\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"sourceChannel\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"testDecreaseAllowance\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"trace\",\"type\":\"string\"}],\"name\":\"testDenomHash\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"hash\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"hash\",\"type\":\"string\"}],\"name\":\"testDenomTrace\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"path\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"baseDenom\",\"type\":\"string\"}],\"internalType\":\"struct DenomTrace[]\",\"name\":\"denomTrace\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"key\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"offset\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"limit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"countTotal\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"reverse\",\"type\":\"bool\"}],\"internalType\":\"struct PageRequest\",\"name\":\"pageRequest\",\"type\":\"tuple\"}],\"name\":\"testDenomTraces\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"path\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"baseDenom\",\"type\":\"string\"}],\"internalType\":\"struct DenomTrace[]\",\"name\":\"denomTraces\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nextKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"total\",\"type\":\"uint64\"}],\"internalType\":\"struct PageResponse\",\"name\":\"pageResponse\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"sourcePort\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"sourceChannel\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"testIncreaseAllowance\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"testRevoke\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"sourcePort\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"sourceChannel\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"receiver\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct Height\",\"name\":\"timeoutHeight\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"timeoutTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"memo\",\"type\":\"string\"}],\"name\":\"testTransferContractFunds\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"nextSequence\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"sourcePort\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"sourceChannel\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"receiver\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct Height\",\"name\":\"timeoutHeight\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"timeoutTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"memo\",\"type\":\"string\"}],\"name\":\"testTransferUserFunds\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"nextSequence\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - "bin": "608060405234801561001057600080fd5b506128f0806100206000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063a363df8411610066578063a363df8414610145578063c595699a14610175578063dfa10f39146101a5578063ee5766d9146101d6578063f298e7a8146102065761009e565b8063424af9f6146100a357806367b10abe146100bf5780636fdf23cc146100db5780637492bdd81461010b5780637a6185e11461013b575b600080fd5b6100bd60048036038101906100b891906109b0565b610222565b005b6100d960048036038101906100d49190610acf565b6102fc565b005b6100f560048036038101906100f09190610cf7565b6103c7565b6040516101029190610e49565b60405180910390f35b61012560048036038101906101209190610cf7565b610465565b6040516101329190610e49565b60405180910390f35b610143610503565b005b61015f600480360381019061015a9190610ec2565b6105c8565b60405161016c919061128b565b60405180910390f35b61018f600480360381019061018a91906112ad565b610655565b60405161019c9190611340565b60405180910390f35b6101bf60048036038101906101ba9190611386565b6106e1565b6040516101cd929190611576565b60405180910390f35b6101f060048036038101906101eb91906112ad565b610777565b6040516101fd91906115ad565b60405180910390f35b610220600480360381019061021b91906109b0565b610803565b005b600061080273ffffffffffffffffffffffffffffffffffffffff166354de647b308a8a8a8a8a8a8a6040518963ffffffff1660e01b815260040161026d98979695949392919061161a565b6020604051808303816000875af115801561028c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102b091906116c0565b9050806102f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102e990611739565b60405180910390fd5b5050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663e3fee9273085856040518463ffffffff1660e01b815260040161033d93929190611bf5565b6020604051808303816000875af115801561035c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038091906116c0565b9050806103c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103b990611c73565b60405180910390fd5b505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663632535b98a8a8a8a308b8b8b8b6040518a63ffffffff1660e01b815260040161041499989796959493929190611cc2565b6020604051808303816000875af1158015610433573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104579190611d88565b905098975050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663632535b98a8a8a8a338b8b8b8b6040518a63ffffffff1660e01b81526004016104b299989796959493929190611cc2565b6020604051808303816000875af11580156104d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f59190611d88565b905098975050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff166374a8f103306040518263ffffffff1660e01b81526004016105409190611db5565b6020604051808303816000875af115801561055f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061058391906116c0565b9050806105c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc90611e1c565b60405180910390fd5b50565b606061080273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84846040518363ffffffff1660e01b8152600401610607929190611e3c565b600060405180830381865afa158015610624573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061064d91906122e1565b905092915050565b606061080273ffffffffffffffffffffffffffffffffffffffff1663b5cb6e7d836040518263ffffffff1660e01b81526004016106929190611340565b6000604051808303816000875af11580156106b1573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906106da919061232a565b9050919050565b60606106eb6108dd565b61080273ffffffffffffffffffffffffffffffffffffffff166322b6fad6846040518263ffffffff1660e01b815260040161072691906124f5565b6000604051808303816000875af1158015610745573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061076e919061278d565b91509150915091565b606061080273ffffffffffffffffffffffffffffffffffffffff1663a815cdd9836040518263ffffffff1660e01b81526004016107b49190611340565b6000604051808303816000875af11580156107d3573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906107fc9190612805565b9050919050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663b3f536ec308a8a8a8a8a8a8a6040518963ffffffff1660e01b815260040161084e98979695949392919061161a565b6020604051808303816000875af115801561086d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089191906116c0565b9050806108d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca9061289a565b60405180910390fd5b5050505050505050565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f84011261093a57610939610915565b5b8235905067ffffffffffffffff8111156109575761095661091a565b5b6020830191508360018202830111156109735761097261091f565b5b9250929050565b6000819050919050565b61098d8161097a565b811461099857600080fd5b50565b6000813590506109aa81610984565b92915050565b60008060008060008060006080888a0312156109cf576109ce61090b565b5b600088013567ffffffffffffffff8111156109ed576109ec610910565b5b6109f98a828b01610924565b9750975050602088013567ffffffffffffffff811115610a1c57610a1b610910565b5b610a288a828b01610924565b9550955050604088013567ffffffffffffffff811115610a4b57610a4a610910565b5b610a578a828b01610924565b93509350506060610a6a8a828b0161099b565b91505092959891949750929550565b60008083601f840112610a8f57610a8e610915565b5b8235905067ffffffffffffffff811115610aac57610aab61091a565b5b602083019150836020820283011115610ac857610ac761091f565b5b9250929050565b60008060208385031215610ae657610ae561090b565b5b600083013567ffffffffffffffff811115610b0457610b03610910565b5b610b1085828601610a79565b92509250509250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610b6a82610b21565b810181811067ffffffffffffffff82111715610b8957610b88610b32565b5b80604052505050565b6000610b9c610901565b9050610ba88282610b61565b919050565b600067ffffffffffffffff821115610bc857610bc7610b32565b5b610bd182610b21565b9050602081019050919050565b82818337600083830152505050565b6000610c00610bfb84610bad565b610b92565b905082815260208101848484011115610c1c57610c1b610b1c565b5b610c27848285610bde565b509392505050565b600082601f830112610c4457610c43610915565b5b8135610c54848260208601610bed565b91505092915050565b600080fd5b600080fd5b600067ffffffffffffffff82169050919050565b610c8481610c67565b8114610c8f57600080fd5b50565b600081359050610ca181610c7b565b92915050565b600060408284031215610cbd57610cbc610c5d565b5b610cc76040610b92565b90506000610cd784828501610c92565b6000830152506020610ceb84828501610c92565b60208301525092915050565b600080600080600080600080610120898b031215610d1857610d1761090b565b5b600089013567ffffffffffffffff811115610d3657610d35610910565b5b610d428b828c01610c2f565b985050602089013567ffffffffffffffff811115610d6357610d62610910565b5b610d6f8b828c01610c2f565b975050604089013567ffffffffffffffff811115610d9057610d8f610910565b5b610d9c8b828c01610c2f565b9650506060610dad8b828c0161099b565b955050608089013567ffffffffffffffff811115610dce57610dcd610910565b5b610dda8b828c01610c2f565b94505060a0610deb8b828c01610ca7565b93505060e0610dfc8b828c01610c92565b92505061010089013567ffffffffffffffff811115610e1e57610e1d610910565b5b610e2a8b828c01610c2f565b9150509295985092959890939650565b610e4381610c67565b82525050565b6000602082019050610e5e6000830184610e3a565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610e8f82610e64565b9050919050565b610e9f81610e84565b8114610eaa57600080fd5b50565b600081359050610ebc81610e96565b92915050565b60008060408385031215610ed957610ed861090b565b5b6000610ee785828601610ead565b9250506020610ef885828601610ead565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610f68578082015181840152602081019050610f4d565b60008484015250505050565b6000610f7f82610f2e565b610f898185610f39565b9350610f99818560208601610f4a565b610fa281610b21565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b610fe28161097a565b82525050565b600060408301600083015184820360008601526110058282610f74565b915050602083015161101a6020860182610fd9565b508091505092915050565b60006110318383610fe8565b905092915050565b6000602082019050919050565b600061105182610fad565b61105b8185610fb8565b93508360208202850161106d85610fc9565b8060005b858110156110a9578484038952815161108a8582611025565b945061109583611039565b925060208a01995050600181019050611071565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006110f38383610f74565b905092915050565b6000602082019050919050565b6000611113826110bb565b61111d81856110c6565b93508360208202850161112f856110d7565b8060005b8581101561116b578484038952815161114c85826110e7565b9450611157836110fb565b925060208a01995050600181019050611133565b50829750879550505050505092915050565b6000608083016000830151848203600086015261119a8282610f74565b915050602083015184820360208601526111b48282610f74565b915050604083015184820360408601526111ce8282611046565b915050606083015184820360608601526111e88282611108565b9150508091505092915050565b6000611201838361117d565b905092915050565b6000602082019050919050565b600061122182610f02565b61122b8185610f0d565b93508360208202850161123d85610f1e565b8060005b85811015611279578484038952815161125a85826111f5565b945061126583611209565b925060208a01995050600181019050611241565b50829750879550505050505092915050565b600060208201905081810360008301526112a58184611216565b905092915050565b6000602082840312156112c3576112c261090b565b5b600082013567ffffffffffffffff8111156112e1576112e0610910565b5b6112ed84828501610c2f565b91505092915050565b600082825260208201905092915050565b600061131282610f2e565b61131c81856112f6565b935061132c818560208601610f4a565b61133581610b21565b840191505092915050565b6000602082019050818103600083015261135a8184611307565b905092915050565b600080fd5b600060a0828403121561137d5761137c611362565b5b81905092915050565b60006020828403121561139c5761139b61090b565b5b600082013567ffffffffffffffff8111156113ba576113b9610910565b5b6113c684828501611367565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060408301600083015184820360008601526114188282610f74565b915050602083015184820360208601526114328282610f74565b9150508091505092915050565b600061144b83836113fb565b905092915050565b6000602082019050919050565b600061146b826113cf565b61147581856113da565b935083602082028501611487856113eb565b8060005b858110156114c357848403895281516114a4858261143f565b94506114af83611453565b925060208a0199505060018101905061148b565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b60006114fc826114d5565b61150681856114e0565b9350611516818560208601610f4a565b61151f81610b21565b840191505092915050565b61153381610c67565b82525050565b6000604083016000830151848203600086015261155682826114f1565b915050602083015161156b602086018261152a565b508091505092915050565b600060408201905081810360008301526115908185611460565b905081810360208301526115a48184611539565b90509392505050565b600060208201905081810360008301526115c78184611460565b905092915050565b6115d881610e84565b82525050565b60006115ea83856112f6565b93506115f7838584610bde565b61160083610b21565b840190509392505050565b6116148161097a565b82525050565b600060a08201905061162f600083018b6115cf565b818103602083015261164281898b6115de565b905081810360408301526116578187896115de565b9050818103606083015261166c8185876115de565b905061167b608083018461160b565b9998505050505050505050565b60008115159050919050565b61169d81611688565b81146116a857600080fd5b50565b6000815190506116ba81611694565b92915050565b6000602082840312156116d6576116d561090b565b5b60006116e4848285016116ab565b91505092915050565b7f4661696c656420746f20696e63726561736520616c6c6f77616e636500000000600082015250565b6000611723601c836112f6565b915061172e826116ed565b602082019050919050565b6000602082019050818103600083015261175281611716565b9050919050565b6000819050919050565b600080fd5b600080fd5b600080fd5b6000808335600160200384360303811261178f5761178e61176d565b5b83810192508235915060208301925067ffffffffffffffff8211156117b7576117b6611763565b5b6001820236038313156117cd576117cc611768565b5b509250929050565b60006117e18385610f39565b93506117ee838584610bde565b6117f783610b21565b840190509392505050565b6000808335600160200384360303811261181f5761181e61176d565b5b83810192508235915060208301925067ffffffffffffffff82111561184757611846611763565b5b60208202360383131561185d5761185c611768565b5b509250929050565b6000819050919050565b600061187e602084018461099b565b905092915050565b6000604083016118996000840184611772565b85830360008701526118ac8382846117d5565b925050506118bd602084018461186f565b6118ca6020860182610fd9565b508091505092915050565b60006118e18383611886565b905092915050565b6000823560016040038336030381126119055761190461176d565b5b82810191505092915050565b6000602082019050919050565b600061192a8385610fb8565b93508360208402850161193c84611865565b8060005b8781101561198057848403895261195782846118e9565b61196185826118d5565b945061196c83611911565b925060208a01995050600181019050611940565b50829750879450505050509392505050565b600080833560016020038436030381126119af576119ae61176d565b5b83810192508235915060208301925067ffffffffffffffff8211156119d7576119d6611763565b5b6020820236038313156119ed576119ec611768565b5b509250929050565b6000819050919050565b6000611a0c8484846117d5565b90509392505050565b6000602082019050919050565b6000611a2e83856110c6565b935083602084028501611a40846119f5565b8060005b87811015611a86578484038952611a5b8284611772565b611a668682846119ff565b9550611a7184611a15565b935060208b019a505050600181019050611a44565b50829750879450505050509392505050565b600060808301611aab6000840184611772565b8583036000870152611abe8382846117d5565b92505050611acf6020840184611772565b8583036020870152611ae28382846117d5565b92505050611af36040840184611802565b8583036040870152611b0683828461191e565b92505050611b176060840184611992565b8583036060870152611b2a838284611a22565b925050508091505092915050565b6000611b448383611a98565b905092915050565b600082356001608003833603038112611b6857611b6761176d565b5b82810191505092915050565b6000602082019050919050565b6000611b8d8385610f0d565b935083602084028501611b9f84611759565b8060005b87811015611be3578484038952611bba8284611b4c565b611bc48582611b38565b9450611bcf83611b74565b925060208a01995050600181019050611ba3565b50829750879450505050509392505050565b6000604082019050611c0a60008301866115cf565b8181036020830152611c1d818486611b81565b9050949350505050565b7f4661696c656420746f20706572666f726d20617070726f76616c000000000000600082015250565b6000611c5d601a836112f6565b9150611c6882611c27565b602082019050919050565b60006020820190508181036000830152611c8c81611c50565b9050919050565b604082016000820151611ca9600085018261152a565b506020820151611cbc602085018261152a565b50505050565b6000610140820190508181036000830152611cdd818c611307565b90508181036020830152611cf1818b611307565b90508181036040830152611d05818a611307565b9050611d14606083018961160b565b611d2160808301886115cf565b81810360a0830152611d338187611307565b9050611d4260c0830186611c93565b611d50610100830185610e3a565b818103610120830152611d638184611307565b90509a9950505050505050505050565b600081519050611d8281610c7b565b92915050565b600060208284031215611d9e57611d9d61090b565b5b6000611dac84828501611d73565b91505092915050565b6000602082019050611dca60008301846115cf565b92915050565b7f4661696c656420746f207265766f6b6520617070726f76616c00000000000000600082015250565b6000611e066019836112f6565b9150611e1182611dd0565b602082019050919050565b60006020820190508181036000830152611e3581611df9565b9050919050565b6000604082019050611e5160008301856115cf565b611e5e60208301846115cf565b9392505050565b600067ffffffffffffffff821115611e8057611e7f610b32565b5b602082029050602081019050919050565b6000611ea4611e9f84610bad565b610b92565b905082815260208101848484011115611ec057611ebf610b1c565b5b611ecb848285610f4a565b509392505050565b600082601f830112611ee857611ee7610915565b5b8151611ef8848260208601611e91565b91505092915050565b600067ffffffffffffffff821115611f1c57611f1b610b32565b5b602082029050602081019050919050565b600081519050611f3c81610984565b92915050565b600060408284031215611f5857611f57610c5d565b5b611f626040610b92565b9050600082015167ffffffffffffffff811115611f8257611f81610c62565b5b611f8e84828501611ed3565b6000830152506020611fa284828501611f2d565b60208301525092915050565b6000611fc1611fbc84611f01565b610b92565b90508083825260208201905060208402830185811115611fe457611fe361091f565b5b835b8181101561202b57805167ffffffffffffffff81111561200957612008610915565b5b8086016120168982611f42565b85526020850194505050602081019050611fe6565b5050509392505050565b600082601f83011261204a57612049610915565b5b815161205a848260208601611fae565b91505092915050565b600067ffffffffffffffff82111561207e5761207d610b32565b5b602082029050602081019050919050565b60006120a261209d84612063565b610b92565b905080838252602082019050602084028301858111156120c5576120c461091f565b5b835b8181101561210c57805167ffffffffffffffff8111156120ea576120e9610915565b5b8086016120f78982611ed3565b855260208501945050506020810190506120c7565b5050509392505050565b600082601f83011261212b5761212a610915565b5b815161213b84826020860161208f565b91505092915050565b60006080828403121561215a57612159610c5d565b5b6121646080610b92565b9050600082015167ffffffffffffffff81111561218457612183610c62565b5b61219084828501611ed3565b600083015250602082015167ffffffffffffffff8111156121b4576121b3610c62565b5b6121c084828501611ed3565b602083015250604082015167ffffffffffffffff8111156121e4576121e3610c62565b5b6121f084828501612035565b604083015250606082015167ffffffffffffffff81111561221457612213610c62565b5b61222084828501612116565b60608301525092915050565b600061223f61223a84611e65565b610b92565b905080838252602082019050602084028301858111156122625761226161091f565b5b835b818110156122a957805167ffffffffffffffff81111561228757612286610915565b5b8086016122948982612144565b85526020850194505050602081019050612264565b5050509392505050565b600082601f8301126122c8576122c7610915565b5b81516122d884826020860161222c565b91505092915050565b6000602082840312156122f7576122f661090b565b5b600082015167ffffffffffffffff81111561231557612314610910565b5b612321848285016122b3565b91505092915050565b6000602082840312156123405761233f61090b565b5b600082015167ffffffffffffffff81111561235e5761235d610910565b5b61236a84828501611ed3565b91505092915050565b600080833560016020038436030381126123905761238f61176d565b5b83810192508235915060208301925067ffffffffffffffff8211156123b8576123b7611763565b5b6001820236038313156123ce576123cd611768565b5b509250929050565b60006123e283856114e0565b93506123ef838584610bde565b6123f883610b21565b840190509392505050565b60006124126020840184610c92565b905092915050565b60008135905061242981611694565b92915050565b600061243e602084018461241a565b905092915050565b61244f81611688565b82525050565b600060a083016124686000840184612373565b858303600087015261247b8382846123d6565b9250505061248c6020840184612403565b612499602086018261152a565b506124a76040840184612403565b6124b4604086018261152a565b506124c2606084018461242f565b6124cf6060860182612446565b506124dd608084018461242f565b6124ea6080860182612446565b508091505092915050565b6000602082019050818103600083015261250f8184612455565b905092915050565b600067ffffffffffffffff82111561253257612531610b32565b5b602082029050602081019050919050565b60006040828403121561255957612558610c5d565b5b6125636040610b92565b9050600082015167ffffffffffffffff81111561258357612582610c62565b5b61258f84828501611ed3565b600083015250602082015167ffffffffffffffff8111156125b3576125b2610c62565b5b6125bf84828501611ed3565b60208301525092915050565b60006125de6125d984612517565b610b92565b905080838252602082019050602084028301858111156126015761260061091f565b5b835b8181101561264857805167ffffffffffffffff81111561262657612625610915565b5b8086016126338982612543565b85526020850194505050602081019050612603565b5050509392505050565b600082601f83011261266757612666610915565b5b81516126778482602086016125cb565b91505092915050565b600067ffffffffffffffff82111561269b5761269a610b32565b5b6126a482610b21565b9050602081019050919050565b60006126c46126bf84612680565b610b92565b9050828152602081018484840111156126e0576126df610b1c565b5b6126eb848285610f4a565b509392505050565b600082601f83011261270857612707610915565b5b81516127188482602086016126b1565b91505092915050565b60006040828403121561273757612736610c5d565b5b6127416040610b92565b9050600082015167ffffffffffffffff81111561276157612760610c62565b5b61276d848285016126f3565b600083015250602061278184828501611d73565b60208301525092915050565b600080604083850312156127a4576127a361090b565b5b600083015167ffffffffffffffff8111156127c2576127c1610910565b5b6127ce85828601612652565b925050602083015167ffffffffffffffff8111156127ef576127ee610910565b5b6127fb85828601612721565b9150509250929050565b60006020828403121561281b5761281a61090b565b5b600082015167ffffffffffffffff81111561283957612838610910565b5b61284584828501612652565b91505092915050565b7f4661696c656420746f20646563726561736520616c6c6f77616e636500000000600082015250565b6000612884601c836112f6565b915061288f8261284e565b602082019050919050565b600060208201905081810360008301526128b381612877565b905091905056fea26469706673582212207455da3a9f56ad24963d625387e9af5b94387203fb5cfca6b685a1ebdc494e4d64736f6c63430008120033" -} \ No newline at end of file + "_format": "hh-sol-artifact-1", + "contractName": "InterchainSender", + "sourceName": "solidity/precompiles/testutil/contracts/InterchainSender.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "testAllowance", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "sourcePort", + "type": "string" + }, + { + "internalType": "string", + "name": "sourceChannel", + "type": "string" + }, + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Coin[]", + "name": "spendLimit", + "type": "tuple[]" + }, + { + "internalType": "string[]", + "name": "allowList", + "type": "string[]" + } + ], + "internalType": "struct ICS20Allocation[]", + "name": "allocations", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "string", + "name": "sourcePort", + "type": "string" + }, + { + "internalType": "string", + "name": "sourceChannel", + "type": "string" + }, + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Coin[]", + "name": "spendLimit", + "type": "tuple[]" + }, + { + "internalType": "string[]", + "name": "allowList", + "type": "string[]" + } + ], + "internalType": "struct ICS20Allocation[]", + "name": "allocs", + "type": "tuple[]" + } + ], + "name": "testApprove", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "sourcePort", + "type": "string" + }, + { + "internalType": "string", + "name": "sourceChannel", + "type": "string" + }, + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "testDecreaseAllowance", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "trace", + "type": "string" + } + ], + "name": "testDenomHash", + "outputs": [ + { + "internalType": "string", + "name": "hash", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "hash", + "type": "string" + } + ], + "name": "testDenomTrace", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "path", + "type": "string" + }, + { + "internalType": "string", + "name": "baseDenom", + "type": "string" + } + ], + "internalType": "struct DenomTrace", + "name": "denomTrace", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes", + "name": "key", + "type": "bytes" + }, + { + "internalType": "uint64", + "name": "offset", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "limit", + "type": "uint64" + }, + { + "internalType": "bool", + "name": "countTotal", + "type": "bool" + }, + { + "internalType": "bool", + "name": "reverse", + "type": "bool" + } + ], + "internalType": "struct PageRequest", + "name": "pageRequest", + "type": "tuple" + } + ], + "name": "testDenomTraces", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "path", + "type": "string" + }, + { + "internalType": "string", + "name": "baseDenom", + "type": "string" + } + ], + "internalType": "struct DenomTrace[]", + "name": "denomTraces", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "bytes", + "name": "nextKey", + "type": "bytes" + }, + { + "internalType": "uint64", + "name": "total", + "type": "uint64" + } + ], + "internalType": "struct PageResponse", + "name": "pageResponse", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "sourcePort", + "type": "string" + }, + { + "internalType": "string", + "name": "sourceChannel", + "type": "string" + }, + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "testIncreaseAllowance", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "testRevoke", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "sourcePort", + "type": "string" + }, + { + "internalType": "string", + "name": "sourceChannel", + "type": "string" + }, + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "string", + "name": "receiver", + "type": "string" + }, + { + "components": [ + { + "internalType": "uint64", + "name": "revisionNumber", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "revisionHeight", + "type": "uint64" + } + ], + "internalType": "struct Height", + "name": "timeoutHeight", + "type": "tuple" + }, + { + "internalType": "uint64", + "name": "timeoutTimestamp", + "type": "uint64" + }, + { + "internalType": "string", + "name": "memo", + "type": "string" + } + ], + "name": "testTransferContractFunds", + "outputs": [ + { + "internalType": "uint64", + "name": "nextSequence", + "type": "uint64" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "sourcePort", + "type": "string" + }, + { + "internalType": "string", + "name": "sourceChannel", + "type": "string" + }, + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "string", + "name": "receiver", + "type": "string" + }, + { + "components": [ + { + "internalType": "uint64", + "name": "revisionNumber", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "revisionHeight", + "type": "uint64" + } + ], + "internalType": "struct Height", + "name": "timeoutHeight", + "type": "tuple" + }, + { + "internalType": "uint64", + "name": "timeoutTimestamp", + "type": "uint64" + }, + { + "internalType": "string", + "name": "memo", + "type": "string" + } + ], + "name": "testTransferUserFunds", + "outputs": [ + { + "internalType": "uint64", + "name": "nextSequence", + "type": "uint64" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b5061294e806100206000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063a363df8411610066578063a363df8414610145578063c595699a14610175578063dfa10f39146101a5578063ee5766d9146101d6578063f298e7a8146102065761009e565b8063424af9f6146100a357806367b10abe146100bf5780636fdf23cc146100db5780637492bdd81461010b5780637a6185e11461013b575b600080fd5b6100bd60048036038101906100b891906109ca565b610222565b005b6100d960048036038101906100d49190610ae9565b6102fc565b005b6100f560048036038101906100f09190610d11565b6103c7565b6040516101029190610e63565b60405180910390f35b61012560048036038101906101209190610d11565b610465565b6040516101329190610e63565b60405180910390f35b610143610503565b005b61015f600480360381019061015a9190610edc565b6105c8565b60405161016c91906112a5565b60405180910390f35b61018f600480360381019061018a91906112c7565b610655565b60405161019c919061135a565b60405180910390f35b6101bf60048036038101906101ba91906113a0565b6106df565b6040516101cd929190611590565b60405180910390f35b6101f060048036038101906101eb91906112c7565b610773565b6040516101fd919061160b565b60405180910390f35b610220600480360381019061021b91906109ca565b610803565b005b600061080273ffffffffffffffffffffffffffffffffffffffff166354de647b308a8a8a8a8a8a8a6040518963ffffffff1660e01b815260040161026d989796959493929190611678565b6020604051808303816000875af115801561028c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102b0919061171e565b9050806102f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102e990611797565b60405180910390fd5b5050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663e3fee9273085856040518463ffffffff1660e01b815260040161033d93929190611c53565b6020604051808303816000875af115801561035c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610380919061171e565b9050806103c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103b990611cd1565b60405180910390fd5b505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663632535b98a8a8a8a308b8b8b8b6040518a63ffffffff1660e01b815260040161041499989796959493929190611d20565b6020604051808303816000875af1158015610433573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104579190611de6565b905098975050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663632535b98a8a8a8a338b8b8b8b6040518a63ffffffff1660e01b81526004016104b299989796959493929190611d20565b6020604051808303816000875af11580156104d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f59190611de6565b905098975050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff166374a8f103306040518263ffffffff1660e01b81526004016105409190611e13565b6020604051808303816000875af115801561055f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610583919061171e565b9050806105c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc90611e7a565b60405180910390fd5b50565b606061080273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84846040518363ffffffff1660e01b8152600401610607929190611e9a565b600060405180830381865afa158015610624573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061064d919061233f565b905092915050565b606061080273ffffffffffffffffffffffffffffffffffffffff1663b5cb6e7d836040518263ffffffff1660e01b8152600401610692919061135a565b600060405180830381865afa1580156106af573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906106d89190612388565b9050919050565b60606106e96108dd565b61080273ffffffffffffffffffffffffffffffffffffffff166322b6fad6846040518263ffffffff1660e01b81526004016107249190612553565b600060405180830381865afa158015610741573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061076a91906127eb565b91509150915091565b61077b610901565b61080273ffffffffffffffffffffffffffffffffffffffff1663a815cdd9836040518263ffffffff1660e01b81526004016107b6919061135a565b600060405180830381865afa1580156107d3573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906107fc9190612863565b9050919050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663b3f536ec308a8a8a8a8a8a8a6040518963ffffffff1660e01b815260040161084e989796959493929190611678565b6020604051808303816000875af115801561086d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610891919061171e565b9050806108d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca906128f8565b60405180910390fd5b5050505050505050565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b604051806040016040528060608152602001606081525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126109545761095361092f565b5b8235905067ffffffffffffffff81111561097157610970610934565b5b60208301915083600182028301111561098d5761098c610939565b5b9250929050565b6000819050919050565b6109a781610994565b81146109b257600080fd5b50565b6000813590506109c48161099e565b92915050565b60008060008060008060006080888a0312156109e9576109e8610925565b5b600088013567ffffffffffffffff811115610a0757610a0661092a565b5b610a138a828b0161093e565b9750975050602088013567ffffffffffffffff811115610a3657610a3561092a565b5b610a428a828b0161093e565b9550955050604088013567ffffffffffffffff811115610a6557610a6461092a565b5b610a718a828b0161093e565b93509350506060610a848a828b016109b5565b91505092959891949750929550565b60008083601f840112610aa957610aa861092f565b5b8235905067ffffffffffffffff811115610ac657610ac5610934565b5b602083019150836020820283011115610ae257610ae1610939565b5b9250929050565b60008060208385031215610b0057610aff610925565b5b600083013567ffffffffffffffff811115610b1e57610b1d61092a565b5b610b2a85828601610a93565b92509250509250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610b8482610b3b565b810181811067ffffffffffffffff82111715610ba357610ba2610b4c565b5b80604052505050565b6000610bb661091b565b9050610bc28282610b7b565b919050565b600067ffffffffffffffff821115610be257610be1610b4c565b5b610beb82610b3b565b9050602081019050919050565b82818337600083830152505050565b6000610c1a610c1584610bc7565b610bac565b905082815260208101848484011115610c3657610c35610b36565b5b610c41848285610bf8565b509392505050565b600082601f830112610c5e57610c5d61092f565b5b8135610c6e848260208601610c07565b91505092915050565b600080fd5b600080fd5b600067ffffffffffffffff82169050919050565b610c9e81610c81565b8114610ca957600080fd5b50565b600081359050610cbb81610c95565b92915050565b600060408284031215610cd757610cd6610c77565b5b610ce16040610bac565b90506000610cf184828501610cac565b6000830152506020610d0584828501610cac565b60208301525092915050565b600080600080600080600080610120898b031215610d3257610d31610925565b5b600089013567ffffffffffffffff811115610d5057610d4f61092a565b5b610d5c8b828c01610c49565b985050602089013567ffffffffffffffff811115610d7d57610d7c61092a565b5b610d898b828c01610c49565b975050604089013567ffffffffffffffff811115610daa57610da961092a565b5b610db68b828c01610c49565b9650506060610dc78b828c016109b5565b955050608089013567ffffffffffffffff811115610de857610de761092a565b5b610df48b828c01610c49565b94505060a0610e058b828c01610cc1565b93505060e0610e168b828c01610cac565b92505061010089013567ffffffffffffffff811115610e3857610e3761092a565b5b610e448b828c01610c49565b9150509295985092959890939650565b610e5d81610c81565b82525050565b6000602082019050610e786000830184610e54565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610ea982610e7e565b9050919050565b610eb981610e9e565b8114610ec457600080fd5b50565b600081359050610ed681610eb0565b92915050565b60008060408385031215610ef357610ef2610925565b5b6000610f0185828601610ec7565b9250506020610f1285828601610ec7565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610f82578082015181840152602081019050610f67565b60008484015250505050565b6000610f9982610f48565b610fa38185610f53565b9350610fb3818560208601610f64565b610fbc81610b3b565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b610ffc81610994565b82525050565b6000604083016000830151848203600086015261101f8282610f8e565b91505060208301516110346020860182610ff3565b508091505092915050565b600061104b8383611002565b905092915050565b6000602082019050919050565b600061106b82610fc7565b6110758185610fd2565b93508360208202850161108785610fe3565b8060005b858110156110c357848403895281516110a4858261103f565b94506110af83611053565b925060208a0199505060018101905061108b565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061110d8383610f8e565b905092915050565b6000602082019050919050565b600061112d826110d5565b61113781856110e0565b935083602082028501611149856110f1565b8060005b8581101561118557848403895281516111668582611101565b945061117183611115565b925060208a0199505060018101905061114d565b50829750879550505050505092915050565b600060808301600083015184820360008601526111b48282610f8e565b915050602083015184820360208601526111ce8282610f8e565b915050604083015184820360408601526111e88282611060565b915050606083015184820360608601526112028282611122565b9150508091505092915050565b600061121b8383611197565b905092915050565b6000602082019050919050565b600061123b82610f1c565b6112458185610f27565b93508360208202850161125785610f38565b8060005b858110156112935784840389528151611274858261120f565b945061127f83611223565b925060208a0199505060018101905061125b565b50829750879550505050505092915050565b600060208201905081810360008301526112bf8184611230565b905092915050565b6000602082840312156112dd576112dc610925565b5b600082013567ffffffffffffffff8111156112fb576112fa61092a565b5b61130784828501610c49565b91505092915050565b600082825260208201905092915050565b600061132c82610f48565b6113368185611310565b9350611346818560208601610f64565b61134f81610b3b565b840191505092915050565b600060208201905081810360008301526113748184611321565b905092915050565b600080fd5b600060a082840312156113975761139661137c565b5b81905092915050565b6000602082840312156113b6576113b5610925565b5b600082013567ffffffffffffffff8111156113d4576113d361092a565b5b6113e084828501611381565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060408301600083015184820360008601526114328282610f8e565b9150506020830151848203602086015261144c8282610f8e565b9150508091505092915050565b60006114658383611415565b905092915050565b6000602082019050919050565b6000611485826113e9565b61148f81856113f4565b9350836020820285016114a185611405565b8060005b858110156114dd57848403895281516114be8582611459565b94506114c98361146d565b925060208a019950506001810190506114a5565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b6000611516826114ef565b61152081856114fa565b9350611530818560208601610f64565b61153981610b3b565b840191505092915050565b61154d81610c81565b82525050565b60006040830160008301518482036000860152611570828261150b565b91505060208301516115856020860182611544565b508091505092915050565b600060408201905081810360008301526115aa818561147a565b905081810360208301526115be8184611553565b90509392505050565b600060408301600083015184820360008601526115e48282610f8e565b915050602083015184820360208601526115fe8282610f8e565b9150508091505092915050565b6000602082019050818103600083015261162581846115c7565b905092915050565b61163681610e9e565b82525050565b60006116488385611310565b9350611655838584610bf8565b61165e83610b3b565b840190509392505050565b61167281610994565b82525050565b600060a08201905061168d600083018b61162d565b81810360208301526116a081898b61163c565b905081810360408301526116b581878961163c565b905081810360608301526116ca81858761163c565b90506116d96080830184611669565b9998505050505050505050565b60008115159050919050565b6116fb816116e6565b811461170657600080fd5b50565b600081519050611718816116f2565b92915050565b60006020828403121561173457611733610925565b5b600061174284828501611709565b91505092915050565b7f4661696c656420746f20696e63726561736520616c6c6f77616e636500000000600082015250565b6000611781601c83611310565b915061178c8261174b565b602082019050919050565b600060208201905081810360008301526117b081611774565b9050919050565b6000819050919050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126117ed576117ec6117cb565b5b83810192508235915060208301925067ffffffffffffffff821115611815576118146117c1565b5b60018202360383131561182b5761182a6117c6565b5b509250929050565b600061183f8385610f53565b935061184c838584610bf8565b61185583610b3b565b840190509392505050565b6000808335600160200384360303811261187d5761187c6117cb565b5b83810192508235915060208301925067ffffffffffffffff8211156118a5576118a46117c1565b5b6020820236038313156118bb576118ba6117c6565b5b509250929050565b6000819050919050565b60006118dc60208401846109b5565b905092915050565b6000604083016118f760008401846117d0565b858303600087015261190a838284611833565b9250505061191b60208401846118cd565b6119286020860182610ff3565b508091505092915050565b600061193f83836118e4565b905092915050565b600082356001604003833603038112611963576119626117cb565b5b82810191505092915050565b6000602082019050919050565b60006119888385610fd2565b93508360208402850161199a846118c3565b8060005b878110156119de5784840389526119b58284611947565b6119bf8582611933565b94506119ca8361196f565b925060208a0199505060018101905061199e565b50829750879450505050509392505050565b60008083356001602003843603038112611a0d57611a0c6117cb565b5b83810192508235915060208301925067ffffffffffffffff821115611a3557611a346117c1565b5b602082023603831315611a4b57611a4a6117c6565b5b509250929050565b6000819050919050565b6000611a6a848484611833565b90509392505050565b6000602082019050919050565b6000611a8c83856110e0565b935083602084028501611a9e84611a53565b8060005b87811015611ae4578484038952611ab982846117d0565b611ac4868284611a5d565b9550611acf84611a73565b935060208b019a505050600181019050611aa2565b50829750879450505050509392505050565b600060808301611b0960008401846117d0565b8583036000870152611b1c838284611833565b92505050611b2d60208401846117d0565b8583036020870152611b40838284611833565b92505050611b516040840184611860565b8583036040870152611b6483828461197c565b92505050611b7560608401846119f0565b8583036060870152611b88838284611a80565b925050508091505092915050565b6000611ba28383611af6565b905092915050565b600082356001608003833603038112611bc657611bc56117cb565b5b82810191505092915050565b6000602082019050919050565b6000611beb8385610f27565b935083602084028501611bfd846117b7565b8060005b87811015611c41578484038952611c188284611baa565b611c228582611b96565b9450611c2d83611bd2565b925060208a01995050600181019050611c01565b50829750879450505050509392505050565b6000604082019050611c68600083018661162d565b8181036020830152611c7b818486611bdf565b9050949350505050565b7f4661696c656420746f20706572666f726d20617070726f76616c000000000000600082015250565b6000611cbb601a83611310565b9150611cc682611c85565b602082019050919050565b60006020820190508181036000830152611cea81611cae565b9050919050565b604082016000820151611d076000850182611544565b506020820151611d1a6020850182611544565b50505050565b6000610140820190508181036000830152611d3b818c611321565b90508181036020830152611d4f818b611321565b90508181036040830152611d63818a611321565b9050611d726060830189611669565b611d7f608083018861162d565b81810360a0830152611d918187611321565b9050611da060c0830186611cf1565b611dae610100830185610e54565b818103610120830152611dc18184611321565b90509a9950505050505050505050565b600081519050611de081610c95565b92915050565b600060208284031215611dfc57611dfb610925565b5b6000611e0a84828501611dd1565b91505092915050565b6000602082019050611e28600083018461162d565b92915050565b7f4661696c656420746f207265766f6b6520617070726f76616c00000000000000600082015250565b6000611e64601983611310565b9150611e6f82611e2e565b602082019050919050565b60006020820190508181036000830152611e9381611e57565b9050919050565b6000604082019050611eaf600083018561162d565b611ebc602083018461162d565b9392505050565b600067ffffffffffffffff821115611ede57611edd610b4c565b5b602082029050602081019050919050565b6000611f02611efd84610bc7565b610bac565b905082815260208101848484011115611f1e57611f1d610b36565b5b611f29848285610f64565b509392505050565b600082601f830112611f4657611f4561092f565b5b8151611f56848260208601611eef565b91505092915050565b600067ffffffffffffffff821115611f7a57611f79610b4c565b5b602082029050602081019050919050565b600081519050611f9a8161099e565b92915050565b600060408284031215611fb657611fb5610c77565b5b611fc06040610bac565b9050600082015167ffffffffffffffff811115611fe057611fdf610c7c565b5b611fec84828501611f31565b600083015250602061200084828501611f8b565b60208301525092915050565b600061201f61201a84611f5f565b610bac565b9050808382526020820190506020840283018581111561204257612041610939565b5b835b8181101561208957805167ffffffffffffffff8111156120675761206661092f565b5b8086016120748982611fa0565b85526020850194505050602081019050612044565b5050509392505050565b600082601f8301126120a8576120a761092f565b5b81516120b884826020860161200c565b91505092915050565b600067ffffffffffffffff8211156120dc576120db610b4c565b5b602082029050602081019050919050565b60006121006120fb846120c1565b610bac565b9050808382526020820190506020840283018581111561212357612122610939565b5b835b8181101561216a57805167ffffffffffffffff8111156121485761214761092f565b5b8086016121558982611f31565b85526020850194505050602081019050612125565b5050509392505050565b600082601f8301126121895761218861092f565b5b81516121998482602086016120ed565b91505092915050565b6000608082840312156121b8576121b7610c77565b5b6121c26080610bac565b9050600082015167ffffffffffffffff8111156121e2576121e1610c7c565b5b6121ee84828501611f31565b600083015250602082015167ffffffffffffffff81111561221257612211610c7c565b5b61221e84828501611f31565b602083015250604082015167ffffffffffffffff81111561224257612241610c7c565b5b61224e84828501612093565b604083015250606082015167ffffffffffffffff81111561227257612271610c7c565b5b61227e84828501612174565b60608301525092915050565b600061229d61229884611ec3565b610bac565b905080838252602082019050602084028301858111156122c0576122bf610939565b5b835b8181101561230757805167ffffffffffffffff8111156122e5576122e461092f565b5b8086016122f289826121a2565b855260208501945050506020810190506122c2565b5050509392505050565b600082601f8301126123265761232561092f565b5b815161233684826020860161228a565b91505092915050565b60006020828403121561235557612354610925565b5b600082015167ffffffffffffffff8111156123735761237261092a565b5b61237f84828501612311565b91505092915050565b60006020828403121561239e5761239d610925565b5b600082015167ffffffffffffffff8111156123bc576123bb61092a565b5b6123c884828501611f31565b91505092915050565b600080833560016020038436030381126123ee576123ed6117cb565b5b83810192508235915060208301925067ffffffffffffffff821115612416576124156117c1565b5b60018202360383131561242c5761242b6117c6565b5b509250929050565b600061244083856114fa565b935061244d838584610bf8565b61245683610b3b565b840190509392505050565b60006124706020840184610cac565b905092915050565b600081359050612487816116f2565b92915050565b600061249c6020840184612478565b905092915050565b6124ad816116e6565b82525050565b600060a083016124c660008401846123d1565b85830360008701526124d9838284612434565b925050506124ea6020840184612461565b6124f76020860182611544565b506125056040840184612461565b6125126040860182611544565b50612520606084018461248d565b61252d60608601826124a4565b5061253b608084018461248d565b61254860808601826124a4565b508091505092915050565b6000602082019050818103600083015261256d81846124b3565b905092915050565b600067ffffffffffffffff8211156125905761258f610b4c565b5b602082029050602081019050919050565b6000604082840312156125b7576125b6610c77565b5b6125c16040610bac565b9050600082015167ffffffffffffffff8111156125e1576125e0610c7c565b5b6125ed84828501611f31565b600083015250602082015167ffffffffffffffff81111561261157612610610c7c565b5b61261d84828501611f31565b60208301525092915050565b600061263c61263784612575565b610bac565b9050808382526020820190506020840283018581111561265f5761265e610939565b5b835b818110156126a657805167ffffffffffffffff8111156126845761268361092f565b5b80860161269189826125a1565b85526020850194505050602081019050612661565b5050509392505050565b600082601f8301126126c5576126c461092f565b5b81516126d5848260208601612629565b91505092915050565b600067ffffffffffffffff8211156126f9576126f8610b4c565b5b61270282610b3b565b9050602081019050919050565b600061272261271d846126de565b610bac565b90508281526020810184848401111561273e5761273d610b36565b5b612749848285610f64565b509392505050565b600082601f8301126127665761276561092f565b5b815161277684826020860161270f565b91505092915050565b60006040828403121561279557612794610c77565b5b61279f6040610bac565b9050600082015167ffffffffffffffff8111156127bf576127be610c7c565b5b6127cb84828501612751565b60008301525060206127df84828501611dd1565b60208301525092915050565b6000806040838503121561280257612801610925565b5b600083015167ffffffffffffffff8111156128205761281f61092a565b5b61282c858286016126b0565b925050602083015167ffffffffffffffff81111561284d5761284c61092a565b5b6128598582860161277f565b9150509250929050565b60006020828403121561287957612878610925565b5b600082015167ffffffffffffffff8111156128975761289661092a565b5b6128a3848285016125a1565b91505092915050565b7f4661696c656420746f20646563726561736520616c6c6f77616e636500000000600082015250565b60006128e2601c83611310565b91506128ed826128ac565b602082019050919050565b60006020820190508181036000830152612911816128d5565b905091905056fea26469706673582212207ab56f70e9096bd8ce811007f83333b057542914c55d2c5dd45b422f3a0b397064736f6c63430008130033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061009e5760003560e01c8063a363df8411610066578063a363df8414610145578063c595699a14610175578063dfa10f39146101a5578063ee5766d9146101d6578063f298e7a8146102065761009e565b8063424af9f6146100a357806367b10abe146100bf5780636fdf23cc146100db5780637492bdd81461010b5780637a6185e11461013b575b600080fd5b6100bd60048036038101906100b891906109ca565b610222565b005b6100d960048036038101906100d49190610ae9565b6102fc565b005b6100f560048036038101906100f09190610d11565b6103c7565b6040516101029190610e63565b60405180910390f35b61012560048036038101906101209190610d11565b610465565b6040516101329190610e63565b60405180910390f35b610143610503565b005b61015f600480360381019061015a9190610edc565b6105c8565b60405161016c91906112a5565b60405180910390f35b61018f600480360381019061018a91906112c7565b610655565b60405161019c919061135a565b60405180910390f35b6101bf60048036038101906101ba91906113a0565b6106df565b6040516101cd929190611590565b60405180910390f35b6101f060048036038101906101eb91906112c7565b610773565b6040516101fd919061160b565b60405180910390f35b610220600480360381019061021b91906109ca565b610803565b005b600061080273ffffffffffffffffffffffffffffffffffffffff166354de647b308a8a8a8a8a8a8a6040518963ffffffff1660e01b815260040161026d989796959493929190611678565b6020604051808303816000875af115801561028c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102b0919061171e565b9050806102f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102e990611797565b60405180910390fd5b5050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663e3fee9273085856040518463ffffffff1660e01b815260040161033d93929190611c53565b6020604051808303816000875af115801561035c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610380919061171e565b9050806103c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103b990611cd1565b60405180910390fd5b505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663632535b98a8a8a8a308b8b8b8b6040518a63ffffffff1660e01b815260040161041499989796959493929190611d20565b6020604051808303816000875af1158015610433573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104579190611de6565b905098975050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663632535b98a8a8a8a338b8b8b8b6040518a63ffffffff1660e01b81526004016104b299989796959493929190611d20565b6020604051808303816000875af11580156104d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f59190611de6565b905098975050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff166374a8f103306040518263ffffffff1660e01b81526004016105409190611e13565b6020604051808303816000875af115801561055f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610583919061171e565b9050806105c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc90611e7a565b60405180910390fd5b50565b606061080273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84846040518363ffffffff1660e01b8152600401610607929190611e9a565b600060405180830381865afa158015610624573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061064d919061233f565b905092915050565b606061080273ffffffffffffffffffffffffffffffffffffffff1663b5cb6e7d836040518263ffffffff1660e01b8152600401610692919061135a565b600060405180830381865afa1580156106af573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906106d89190612388565b9050919050565b60606106e96108dd565b61080273ffffffffffffffffffffffffffffffffffffffff166322b6fad6846040518263ffffffff1660e01b81526004016107249190612553565b600060405180830381865afa158015610741573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061076a91906127eb565b91509150915091565b61077b610901565b61080273ffffffffffffffffffffffffffffffffffffffff1663a815cdd9836040518263ffffffff1660e01b81526004016107b6919061135a565b600060405180830381865afa1580156107d3573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906107fc9190612863565b9050919050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663b3f536ec308a8a8a8a8a8a8a6040518963ffffffff1660e01b815260040161084e989796959493929190611678565b6020604051808303816000875af115801561086d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610891919061171e565b9050806108d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca906128f8565b60405180910390fd5b5050505050505050565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b604051806040016040528060608152602001606081525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126109545761095361092f565b5b8235905067ffffffffffffffff81111561097157610970610934565b5b60208301915083600182028301111561098d5761098c610939565b5b9250929050565b6000819050919050565b6109a781610994565b81146109b257600080fd5b50565b6000813590506109c48161099e565b92915050565b60008060008060008060006080888a0312156109e9576109e8610925565b5b600088013567ffffffffffffffff811115610a0757610a0661092a565b5b610a138a828b0161093e565b9750975050602088013567ffffffffffffffff811115610a3657610a3561092a565b5b610a428a828b0161093e565b9550955050604088013567ffffffffffffffff811115610a6557610a6461092a565b5b610a718a828b0161093e565b93509350506060610a848a828b016109b5565b91505092959891949750929550565b60008083601f840112610aa957610aa861092f565b5b8235905067ffffffffffffffff811115610ac657610ac5610934565b5b602083019150836020820283011115610ae257610ae1610939565b5b9250929050565b60008060208385031215610b0057610aff610925565b5b600083013567ffffffffffffffff811115610b1e57610b1d61092a565b5b610b2a85828601610a93565b92509250509250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610b8482610b3b565b810181811067ffffffffffffffff82111715610ba357610ba2610b4c565b5b80604052505050565b6000610bb661091b565b9050610bc28282610b7b565b919050565b600067ffffffffffffffff821115610be257610be1610b4c565b5b610beb82610b3b565b9050602081019050919050565b82818337600083830152505050565b6000610c1a610c1584610bc7565b610bac565b905082815260208101848484011115610c3657610c35610b36565b5b610c41848285610bf8565b509392505050565b600082601f830112610c5e57610c5d61092f565b5b8135610c6e848260208601610c07565b91505092915050565b600080fd5b600080fd5b600067ffffffffffffffff82169050919050565b610c9e81610c81565b8114610ca957600080fd5b50565b600081359050610cbb81610c95565b92915050565b600060408284031215610cd757610cd6610c77565b5b610ce16040610bac565b90506000610cf184828501610cac565b6000830152506020610d0584828501610cac565b60208301525092915050565b600080600080600080600080610120898b031215610d3257610d31610925565b5b600089013567ffffffffffffffff811115610d5057610d4f61092a565b5b610d5c8b828c01610c49565b985050602089013567ffffffffffffffff811115610d7d57610d7c61092a565b5b610d898b828c01610c49565b975050604089013567ffffffffffffffff811115610daa57610da961092a565b5b610db68b828c01610c49565b9650506060610dc78b828c016109b5565b955050608089013567ffffffffffffffff811115610de857610de761092a565b5b610df48b828c01610c49565b94505060a0610e058b828c01610cc1565b93505060e0610e168b828c01610cac565b92505061010089013567ffffffffffffffff811115610e3857610e3761092a565b5b610e448b828c01610c49565b9150509295985092959890939650565b610e5d81610c81565b82525050565b6000602082019050610e786000830184610e54565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610ea982610e7e565b9050919050565b610eb981610e9e565b8114610ec457600080fd5b50565b600081359050610ed681610eb0565b92915050565b60008060408385031215610ef357610ef2610925565b5b6000610f0185828601610ec7565b9250506020610f1285828601610ec7565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610f82578082015181840152602081019050610f67565b60008484015250505050565b6000610f9982610f48565b610fa38185610f53565b9350610fb3818560208601610f64565b610fbc81610b3b565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b610ffc81610994565b82525050565b6000604083016000830151848203600086015261101f8282610f8e565b91505060208301516110346020860182610ff3565b508091505092915050565b600061104b8383611002565b905092915050565b6000602082019050919050565b600061106b82610fc7565b6110758185610fd2565b93508360208202850161108785610fe3565b8060005b858110156110c357848403895281516110a4858261103f565b94506110af83611053565b925060208a0199505060018101905061108b565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061110d8383610f8e565b905092915050565b6000602082019050919050565b600061112d826110d5565b61113781856110e0565b935083602082028501611149856110f1565b8060005b8581101561118557848403895281516111668582611101565b945061117183611115565b925060208a0199505060018101905061114d565b50829750879550505050505092915050565b600060808301600083015184820360008601526111b48282610f8e565b915050602083015184820360208601526111ce8282610f8e565b915050604083015184820360408601526111e88282611060565b915050606083015184820360608601526112028282611122565b9150508091505092915050565b600061121b8383611197565b905092915050565b6000602082019050919050565b600061123b82610f1c565b6112458185610f27565b93508360208202850161125785610f38565b8060005b858110156112935784840389528151611274858261120f565b945061127f83611223565b925060208a0199505060018101905061125b565b50829750879550505050505092915050565b600060208201905081810360008301526112bf8184611230565b905092915050565b6000602082840312156112dd576112dc610925565b5b600082013567ffffffffffffffff8111156112fb576112fa61092a565b5b61130784828501610c49565b91505092915050565b600082825260208201905092915050565b600061132c82610f48565b6113368185611310565b9350611346818560208601610f64565b61134f81610b3b565b840191505092915050565b600060208201905081810360008301526113748184611321565b905092915050565b600080fd5b600060a082840312156113975761139661137c565b5b81905092915050565b6000602082840312156113b6576113b5610925565b5b600082013567ffffffffffffffff8111156113d4576113d361092a565b5b6113e084828501611381565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060408301600083015184820360008601526114328282610f8e565b9150506020830151848203602086015261144c8282610f8e565b9150508091505092915050565b60006114658383611415565b905092915050565b6000602082019050919050565b6000611485826113e9565b61148f81856113f4565b9350836020820285016114a185611405565b8060005b858110156114dd57848403895281516114be8582611459565b94506114c98361146d565b925060208a019950506001810190506114a5565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b6000611516826114ef565b61152081856114fa565b9350611530818560208601610f64565b61153981610b3b565b840191505092915050565b61154d81610c81565b82525050565b60006040830160008301518482036000860152611570828261150b565b91505060208301516115856020860182611544565b508091505092915050565b600060408201905081810360008301526115aa818561147a565b905081810360208301526115be8184611553565b90509392505050565b600060408301600083015184820360008601526115e48282610f8e565b915050602083015184820360208601526115fe8282610f8e565b9150508091505092915050565b6000602082019050818103600083015261162581846115c7565b905092915050565b61163681610e9e565b82525050565b60006116488385611310565b9350611655838584610bf8565b61165e83610b3b565b840190509392505050565b61167281610994565b82525050565b600060a08201905061168d600083018b61162d565b81810360208301526116a081898b61163c565b905081810360408301526116b581878961163c565b905081810360608301526116ca81858761163c565b90506116d96080830184611669565b9998505050505050505050565b60008115159050919050565b6116fb816116e6565b811461170657600080fd5b50565b600081519050611718816116f2565b92915050565b60006020828403121561173457611733610925565b5b600061174284828501611709565b91505092915050565b7f4661696c656420746f20696e63726561736520616c6c6f77616e636500000000600082015250565b6000611781601c83611310565b915061178c8261174b565b602082019050919050565b600060208201905081810360008301526117b081611774565b9050919050565b6000819050919050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126117ed576117ec6117cb565b5b83810192508235915060208301925067ffffffffffffffff821115611815576118146117c1565b5b60018202360383131561182b5761182a6117c6565b5b509250929050565b600061183f8385610f53565b935061184c838584610bf8565b61185583610b3b565b840190509392505050565b6000808335600160200384360303811261187d5761187c6117cb565b5b83810192508235915060208301925067ffffffffffffffff8211156118a5576118a46117c1565b5b6020820236038313156118bb576118ba6117c6565b5b509250929050565b6000819050919050565b60006118dc60208401846109b5565b905092915050565b6000604083016118f760008401846117d0565b858303600087015261190a838284611833565b9250505061191b60208401846118cd565b6119286020860182610ff3565b508091505092915050565b600061193f83836118e4565b905092915050565b600082356001604003833603038112611963576119626117cb565b5b82810191505092915050565b6000602082019050919050565b60006119888385610fd2565b93508360208402850161199a846118c3565b8060005b878110156119de5784840389526119b58284611947565b6119bf8582611933565b94506119ca8361196f565b925060208a0199505060018101905061199e565b50829750879450505050509392505050565b60008083356001602003843603038112611a0d57611a0c6117cb565b5b83810192508235915060208301925067ffffffffffffffff821115611a3557611a346117c1565b5b602082023603831315611a4b57611a4a6117c6565b5b509250929050565b6000819050919050565b6000611a6a848484611833565b90509392505050565b6000602082019050919050565b6000611a8c83856110e0565b935083602084028501611a9e84611a53565b8060005b87811015611ae4578484038952611ab982846117d0565b611ac4868284611a5d565b9550611acf84611a73565b935060208b019a505050600181019050611aa2565b50829750879450505050509392505050565b600060808301611b0960008401846117d0565b8583036000870152611b1c838284611833565b92505050611b2d60208401846117d0565b8583036020870152611b40838284611833565b92505050611b516040840184611860565b8583036040870152611b6483828461197c565b92505050611b7560608401846119f0565b8583036060870152611b88838284611a80565b925050508091505092915050565b6000611ba28383611af6565b905092915050565b600082356001608003833603038112611bc657611bc56117cb565b5b82810191505092915050565b6000602082019050919050565b6000611beb8385610f27565b935083602084028501611bfd846117b7565b8060005b87811015611c41578484038952611c188284611baa565b611c228582611b96565b9450611c2d83611bd2565b925060208a01995050600181019050611c01565b50829750879450505050509392505050565b6000604082019050611c68600083018661162d565b8181036020830152611c7b818486611bdf565b9050949350505050565b7f4661696c656420746f20706572666f726d20617070726f76616c000000000000600082015250565b6000611cbb601a83611310565b9150611cc682611c85565b602082019050919050565b60006020820190508181036000830152611cea81611cae565b9050919050565b604082016000820151611d076000850182611544565b506020820151611d1a6020850182611544565b50505050565b6000610140820190508181036000830152611d3b818c611321565b90508181036020830152611d4f818b611321565b90508181036040830152611d63818a611321565b9050611d726060830189611669565b611d7f608083018861162d565b81810360a0830152611d918187611321565b9050611da060c0830186611cf1565b611dae610100830185610e54565b818103610120830152611dc18184611321565b90509a9950505050505050505050565b600081519050611de081610c95565b92915050565b600060208284031215611dfc57611dfb610925565b5b6000611e0a84828501611dd1565b91505092915050565b6000602082019050611e28600083018461162d565b92915050565b7f4661696c656420746f207265766f6b6520617070726f76616c00000000000000600082015250565b6000611e64601983611310565b9150611e6f82611e2e565b602082019050919050565b60006020820190508181036000830152611e9381611e57565b9050919050565b6000604082019050611eaf600083018561162d565b611ebc602083018461162d565b9392505050565b600067ffffffffffffffff821115611ede57611edd610b4c565b5b602082029050602081019050919050565b6000611f02611efd84610bc7565b610bac565b905082815260208101848484011115611f1e57611f1d610b36565b5b611f29848285610f64565b509392505050565b600082601f830112611f4657611f4561092f565b5b8151611f56848260208601611eef565b91505092915050565b600067ffffffffffffffff821115611f7a57611f79610b4c565b5b602082029050602081019050919050565b600081519050611f9a8161099e565b92915050565b600060408284031215611fb657611fb5610c77565b5b611fc06040610bac565b9050600082015167ffffffffffffffff811115611fe057611fdf610c7c565b5b611fec84828501611f31565b600083015250602061200084828501611f8b565b60208301525092915050565b600061201f61201a84611f5f565b610bac565b9050808382526020820190506020840283018581111561204257612041610939565b5b835b8181101561208957805167ffffffffffffffff8111156120675761206661092f565b5b8086016120748982611fa0565b85526020850194505050602081019050612044565b5050509392505050565b600082601f8301126120a8576120a761092f565b5b81516120b884826020860161200c565b91505092915050565b600067ffffffffffffffff8211156120dc576120db610b4c565b5b602082029050602081019050919050565b60006121006120fb846120c1565b610bac565b9050808382526020820190506020840283018581111561212357612122610939565b5b835b8181101561216a57805167ffffffffffffffff8111156121485761214761092f565b5b8086016121558982611f31565b85526020850194505050602081019050612125565b5050509392505050565b600082601f8301126121895761218861092f565b5b81516121998482602086016120ed565b91505092915050565b6000608082840312156121b8576121b7610c77565b5b6121c26080610bac565b9050600082015167ffffffffffffffff8111156121e2576121e1610c7c565b5b6121ee84828501611f31565b600083015250602082015167ffffffffffffffff81111561221257612211610c7c565b5b61221e84828501611f31565b602083015250604082015167ffffffffffffffff81111561224257612241610c7c565b5b61224e84828501612093565b604083015250606082015167ffffffffffffffff81111561227257612271610c7c565b5b61227e84828501612174565b60608301525092915050565b600061229d61229884611ec3565b610bac565b905080838252602082019050602084028301858111156122c0576122bf610939565b5b835b8181101561230757805167ffffffffffffffff8111156122e5576122e461092f565b5b8086016122f289826121a2565b855260208501945050506020810190506122c2565b5050509392505050565b600082601f8301126123265761232561092f565b5b815161233684826020860161228a565b91505092915050565b60006020828403121561235557612354610925565b5b600082015167ffffffffffffffff8111156123735761237261092a565b5b61237f84828501612311565b91505092915050565b60006020828403121561239e5761239d610925565b5b600082015167ffffffffffffffff8111156123bc576123bb61092a565b5b6123c884828501611f31565b91505092915050565b600080833560016020038436030381126123ee576123ed6117cb565b5b83810192508235915060208301925067ffffffffffffffff821115612416576124156117c1565b5b60018202360383131561242c5761242b6117c6565b5b509250929050565b600061244083856114fa565b935061244d838584610bf8565b61245683610b3b565b840190509392505050565b60006124706020840184610cac565b905092915050565b600081359050612487816116f2565b92915050565b600061249c6020840184612478565b905092915050565b6124ad816116e6565b82525050565b600060a083016124c660008401846123d1565b85830360008701526124d9838284612434565b925050506124ea6020840184612461565b6124f76020860182611544565b506125056040840184612461565b6125126040860182611544565b50612520606084018461248d565b61252d60608601826124a4565b5061253b608084018461248d565b61254860808601826124a4565b508091505092915050565b6000602082019050818103600083015261256d81846124b3565b905092915050565b600067ffffffffffffffff8211156125905761258f610b4c565b5b602082029050602081019050919050565b6000604082840312156125b7576125b6610c77565b5b6125c16040610bac565b9050600082015167ffffffffffffffff8111156125e1576125e0610c7c565b5b6125ed84828501611f31565b600083015250602082015167ffffffffffffffff81111561261157612610610c7c565b5b61261d84828501611f31565b60208301525092915050565b600061263c61263784612575565b610bac565b9050808382526020820190506020840283018581111561265f5761265e610939565b5b835b818110156126a657805167ffffffffffffffff8111156126845761268361092f565b5b80860161269189826125a1565b85526020850194505050602081019050612661565b5050509392505050565b600082601f8301126126c5576126c461092f565b5b81516126d5848260208601612629565b91505092915050565b600067ffffffffffffffff8211156126f9576126f8610b4c565b5b61270282610b3b565b9050602081019050919050565b600061272261271d846126de565b610bac565b90508281526020810184848401111561273e5761273d610b36565b5b612749848285610f64565b509392505050565b600082601f8301126127665761276561092f565b5b815161277684826020860161270f565b91505092915050565b60006040828403121561279557612794610c77565b5b61279f6040610bac565b9050600082015167ffffffffffffffff8111156127bf576127be610c7c565b5b6127cb84828501612751565b60008301525060206127df84828501611dd1565b60208301525092915050565b6000806040838503121561280257612801610925565b5b600083015167ffffffffffffffff8111156128205761281f61092a565b5b61282c858286016126b0565b925050602083015167ffffffffffffffff81111561284d5761284c61092a565b5b6128598582860161277f565b9150509250929050565b60006020828403121561287957612878610925565b5b600082015167ffffffffffffffff8111156128975761289661092a565b5b6128a3848285016125a1565b91505092915050565b7f4661696c656420746f20646563726561736520616c6c6f77616e636500000000600082015250565b60006128e2601c83611310565b91506128ed826128ac565b602082019050919050565b60006020820190508181036000830152612911816128d5565b905091905056fea26469706673582212207ab56f70e9096bd8ce811007f83333b057542914c55d2c5dd45b422f3a0b397064736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/precompiles/testutil/contracts/distribution_caller.go b/precompiles/testutil/contracts/distribution_caller.go index b4df0e5eda..015add2fdc 100644 --- a/precompiles/testutil/contracts/distribution_caller.go +++ b/precompiles/testutil/contracts/distribution_caller.go @@ -4,27 +4,10 @@ package contracts import ( - _ "embed" // embed compiled smart contract - "encoding/json" - + contractutils "github.com/evmos/evmos/v18/contracts/utils" evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) -var ( - //go:embed DistributionCaller.json - DistributionCallerJSON []byte - - // DistributionCallerContract is the compiled contract calling the distribution precompile - DistributionCallerContract evmtypes.CompiledContract -) - -func init() { - err := json.Unmarshal(DistributionCallerJSON, &DistributionCallerContract) - if err != nil { - panic(err) - } - - if len(DistributionCallerContract.Bin) == 0 { - panic("failed to load smart contract that calls distribution precompile") - } +func LoadDistributionCallerContract() (evmtypes.CompiledContract, error) { + return contractutils.LoadContractFromJSONFile("DistributionCaller.json") } diff --git a/precompiles/testutil/contracts/interchain_sender.go b/precompiles/testutil/contracts/interchain_sender.go index 757ff2b533..10fea47582 100644 --- a/precompiles/testutil/contracts/interchain_sender.go +++ b/precompiles/testutil/contracts/interchain_sender.go @@ -4,27 +4,10 @@ package contracts import ( - _ "embed" // embed compiled smart contract - "encoding/json" - + contractutils "github.com/evmos/evmos/v18/contracts/utils" evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) -var ( - //go:embed InterchainSender.json - InterchainSenderJSON []byte - - // InterchainSenderContract is the compiled contract calling the distribution precompile - InterchainSenderContract evmtypes.CompiledContract -) - -func init() { - err := json.Unmarshal(InterchainSenderJSON, &InterchainSenderContract) - if err != nil { - panic(err) - } - - if len(InterchainSenderContract.Bin) == 0 { - panic("failed to load smart contract that calls distribution precompile") - } +func LoadInterchainSenderContract() (evmtypes.CompiledContract, error) { + return contractutils.LoadContractFromJSONFile("InterchainSender.json") } diff --git a/precompiles/vesting/integration_test.go b/precompiles/vesting/integration_test.go index 3f5650c9e0..c3a4cbae5a 100644 --- a/precompiles/vesting/integration_test.go +++ b/precompiles/vesting/integration_test.go @@ -15,7 +15,6 @@ import ( "github.com/evmos/evmos/v18/precompiles/testutil" "github.com/evmos/evmos/v18/precompiles/testutil/contracts" "github.com/evmos/evmos/v18/precompiles/vesting" - "github.com/evmos/evmos/v18/precompiles/vesting/testdata" evmosutil "github.com/evmos/evmos/v18/testutil" testutiltx "github.com/evmos/evmos/v18/testutil/tx" vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" @@ -76,7 +75,7 @@ var _ = Describe("Interacting with the vesting extension", func() { instantPeriods = []vesting.Period{instantPeriod} // Deploy the smart contract that calls the vesting extension - contractAddr, err = s.DeployContract(testdata.VestingCallerContract) + contractAddr, err = s.DeployContract(s.vestingCallerContract) Expect(err).ToNot(HaveOccurred(), "error while deploying the smart contract: %v", err) // Set up the checks diff --git a/precompiles/vesting/setup_test.go b/precompiles/vesting/setup_test.go index be57aa3ba7..c0bcf7fe0f 100644 --- a/precompiles/vesting/setup_test.go +++ b/precompiles/vesting/setup_test.go @@ -41,6 +41,8 @@ type PrecompileTestSuite struct { stateDB *statedb.StateDB queryClientEVM evmtypes.QueryClient + + vestingCallerContract evmtypes.CompiledContract } func TestPrecompileTestSuite(t *testing.T) { diff --git a/precompiles/vesting/testdata/VestingCaller.json b/precompiles/vesting/testdata/VestingCaller.json index 873ea8c7b1..1b42de7fe5 100644 --- a/precompiles/vesting/testdata/VestingCaller.json +++ b/precompiles/vesting/testdata/VestingCaller.json @@ -1,5 +1,264 @@ { - "abi": "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vestingAddr\",\"type\":\"address\"}],\"name\":\"balances\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"struct Coin[]\",\"name\":\"locked\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"struct Coin[]\",\"name\":\"unvested\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"struct Coin[]\",\"name\":\"vested\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"funder\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"dest\",\"type\":\"address\"}],\"name\":\"clawback\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"struct Coin[]\",\"name\":\"coins\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vestingAddr\",\"type\":\"address\"}],\"name\":\"convertVestingAccount\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"funder\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"enableGovClawback\",\"type\":\"bool\"}],\"name\":\"createClawbackVestingAccount\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"createClawbackVestingAccountForContract\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"funder\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"startTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"int64\",\"name\":\"length\",\"type\":\"int64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"struct Coin[]\",\"name\":\"amount\",\"type\":\"tuple[]\"}],\"internalType\":\"struct Period[]\",\"name\":\"lockupPeriods\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"int64\",\"name\":\"length\",\"type\":\"int64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"struct Coin[]\",\"name\":\"amount\",\"type\":\"tuple[]\"}],\"internalType\":\"struct Period[]\",\"name\":\"vestingPeriods\",\"type\":\"tuple[]\"}],\"name\":\"fundVestingAccount\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"funder\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"newFunder\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"vestingAddr\",\"type\":\"address\"}],\"name\":\"updateVestingFunder\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - "bin": "608060405234801561001057600080fd5b50611707806100206000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c806372e7c9ab1161005b57806372e7c9ab146100ec5780637caef81b1461011c5780639cfef12914610126578063cdb50175146101425761007d565b806327e235e3146100825780634fe1a8df146100b45780635a211064146100d0575b600080fd5b61009c600480360381019061009791906106f5565b61015e565b6040516100ab939291906108ca565b60405180910390f35b6100ce60048036038101906100c991906109bb565b6101f1565b005b6100ea60048036038101906100e591906106f5565b6102c9565b005b61010660048036038101906101019190610a77565b61038f565b6040516101139190610aca565b60405180910390f35b610124610421565b005b610140600480360381019061013b9190610a77565b6104eb565b005b61015c60048036038101906101579190610b24565b6105b7565b005b606080606061080373ffffffffffffffffffffffffffffffffffffffff166327e235e3856040518263ffffffff1660e01b815260040161019e9190610b86565b600060405180830381865afa1580156101bb573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906101e49190610e45565b9250925092509193909250565b600061080373ffffffffffffffffffffffffffffffffffffffff16634fe1a8df898989898989896040518863ffffffff1660e01b815260040161023a97969594939291906112e5565b6020604051808303816000875af1158015610259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027d919061135f565b9050806102bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b69061140f565b60405180910390fd5b5050505050505050565b600061080373ffffffffffffffffffffffffffffffffffffffff16635a211064836040518263ffffffff1660e01b81526004016103069190610b86565b6020604051808303816000875af1158015610325573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610349919061135f565b90508061038b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610382906114a1565b60405180910390fd5b5050565b606061080373ffffffffffffffffffffffffffffffffffffffff166372e7c9ab8585856040518463ffffffff1660e01b81526004016103d0939291906114c1565b6000604051808303816000875af11580156103ef573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061041891906114f8565b90509392505050565b600061080373ffffffffffffffffffffffffffffffffffffffff1663cdb50175333060006040518463ffffffff1660e01b815260040161046393929190611550565b6020604051808303816000875af1158015610482573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104a6919061135f565b9050806104e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104df9061161f565b60405180910390fd5b50565b600061080373ffffffffffffffffffffffffffffffffffffffff16639cfef1298585856040518463ffffffff1660e01b815260040161052c939291906114c1565b6020604051808303816000875af115801561054b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061056f919061135f565b9050806105b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105a8906116b1565b60405180910390fd5b50505050565b600061080373ffffffffffffffffffffffffffffffffffffffff1663cdb501758585856040518463ffffffff1660e01b81526004016105f893929190611550565b6020604051808303816000875af1158015610617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063b919061135f565b90508061067d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106749061140f565b60405180910390fd5b50505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106c282610697565b9050919050565b6106d2816106b7565b81146106dd57600080fd5b50565b6000813590506106ef816106c9565b92915050565b60006020828403121561070b5761070a61068d565b5b6000610719848285016106e0565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561078857808201518184015260208101905061076d565b60008484015250505050565b6000601f19601f8301169050919050565b60006107b08261074e565b6107ba8185610759565b93506107ca81856020860161076a565b6107d381610794565b840191505092915050565b6000819050919050565b6107f1816107de565b82525050565b6000604083016000830151848203600086015261081482826107a5565b915050602083015161082960208601826107e8565b508091505092915050565b600061084083836107f7565b905092915050565b6000602082019050919050565b600061086082610722565b61086a818561072d565b93508360208202850161087c8561073e565b8060005b858110156108b857848403895281516108998582610834565b94506108a483610848565b925060208a01995050600181019050610880565b50829750879550505050505092915050565b600060608201905081810360008301526108e48186610855565b905081810360208301526108f88185610855565b9050818103604083015261090c8184610855565b9050949350505050565b600067ffffffffffffffff82169050919050565b61093381610916565b811461093e57600080fd5b50565b6000813590506109508161092a565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261097b5761097a610956565b5b8235905067ffffffffffffffff8111156109985761099761095b565b5b6020830191508360208202830111156109b4576109b3610960565b5b9250929050565b600080600080600080600060a0888a0312156109da576109d961068d565b5b60006109e88a828b016106e0565b97505060206109f98a828b016106e0565b9650506040610a0a8a828b01610941565b955050606088013567ffffffffffffffff811115610a2b57610a2a610692565b5b610a378a828b01610965565b9450945050608088013567ffffffffffffffff811115610a5a57610a59610692565b5b610a668a828b01610965565b925092505092959891949750929550565b600080600060608486031215610a9057610a8f61068d565b5b6000610a9e868287016106e0565b9350506020610aaf868287016106e0565b9250506040610ac0868287016106e0565b9150509250925092565b60006020820190508181036000830152610ae48184610855565b905092915050565b60008115159050919050565b610b0181610aec565b8114610b0c57600080fd5b50565b600081359050610b1e81610af8565b92915050565b600080600060608486031215610b3d57610b3c61068d565b5b6000610b4b868287016106e0565b9350506020610b5c868287016106e0565b9250506040610b6d86828701610b0f565b9150509250925092565b610b80816106b7565b82525050565b6000602082019050610b9b6000830184610b77565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610bd982610794565b810181811067ffffffffffffffff82111715610bf857610bf7610ba1565b5b80604052505050565b6000610c0b610683565b9050610c178282610bd0565b919050565b600067ffffffffffffffff821115610c3757610c36610ba1565b5b602082029050602081019050919050565b600080fd5b600080fd5b600080fd5b600067ffffffffffffffff821115610c7257610c71610ba1565b5b610c7b82610794565b9050602081019050919050565b6000610c9b610c9684610c57565b610c01565b905082815260208101848484011115610cb757610cb6610c52565b5b610cc284828561076a565b509392505050565b600082601f830112610cdf57610cde610956565b5b8151610cef848260208601610c88565b91505092915050565b610d01816107de565b8114610d0c57600080fd5b50565b600081519050610d1e81610cf8565b92915050565b600060408284031215610d3a57610d39610c48565b5b610d446040610c01565b9050600082015167ffffffffffffffff811115610d6457610d63610c4d565b5b610d7084828501610cca565b6000830152506020610d8484828501610d0f565b60208301525092915050565b6000610da3610d9e84610c1c565b610c01565b90508083825260208201905060208402830185811115610dc657610dc5610960565b5b835b81811015610e0d57805167ffffffffffffffff811115610deb57610dea610956565b5b808601610df88982610d24565b85526020850194505050602081019050610dc8565b5050509392505050565b600082601f830112610e2c57610e2b610956565b5b8151610e3c848260208601610d90565b91505092915050565b600080600060608486031215610e5e57610e5d61068d565b5b600084015167ffffffffffffffff811115610e7c57610e7b610692565b5b610e8886828701610e17565b935050602084015167ffffffffffffffff811115610ea957610ea8610692565b5b610eb586828701610e17565b925050604084015167ffffffffffffffff811115610ed657610ed5610692565b5b610ee286828701610e17565b9150509250925092565b610ef581610916565b82525050565b600082825260208201905092915050565b6000819050919050565b60008160070b9050919050565b610f2c81610f16565b8114610f3757600080fd5b50565b600081359050610f4981610f23565b92915050565b6000610f5e6020840184610f3a565b905092915050565b610f6f81610f16565b82525050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112610fa157610fa0610f7f565b5b83810192508235915060208301925067ffffffffffffffff821115610fc957610fc8610f75565b5b602082023603831315610fdf57610fde610f7a565b5b509250929050565b600082825260208201905092915050565b6000819050919050565b6000808335600160200384360303811261101f5761101e610f7f565b5b83810192508235915060208301925067ffffffffffffffff82111561104757611046610f75565b5b60018202360383131561105d5761105c610f7a565b5b509250929050565b82818337600083830152505050565b60006110808385610759565b935061108d838584611065565b61109683610794565b840190509392505050565b6000813590506110b081610cf8565b92915050565b60006110c560208401846110a1565b905092915050565b6000604083016110e06000840184611002565b85830360008701526110f3838284611074565b9250505061110460208401846110b6565b61111160208601826107e8565b508091505092915050565b600061112883836110cd565b905092915050565b60008235600160400383360303811261114c5761114b610f7f565b5b82810191505092915050565b6000602082019050919050565b60006111718385610fe7565b93508360208402850161118384610ff8565b8060005b878110156111c757848403895261119e8284611130565b6111a8858261111c565b94506111b383611158565b925060208a01995050600181019050611187565b50829750879450505050509392505050565b6000604083016111ec6000840184610f4f565b6111f96000860182610f66565b506112076020840184610f84565b858303602087015261121a838284611165565b925050508091505092915050565b600061123483836111d9565b905092915050565b60008235600160400383360303811261125857611257610f7f565b5b82810191505092915050565b6000602082019050919050565b600061127d8385610efb565b93508360208402850161128f84610f0c565b8060005b878110156112d35784840389526112aa828461123c565b6112b48582611228565b94506112bf83611264565b925060208a01995050600181019050611293565b50829750879450505050509392505050565b600060a0820190506112fa600083018a610b77565b6113076020830189610b77565b6113146040830188610eec565b8181036060830152611327818688611271565b9050818103608083015261133c818486611271565b905098975050505050505050565b60008151905061135981610af8565b92915050565b6000602082840312156113755761137461068d565b5b60006113838482850161134a565b91505092915050565b600082825260208201905092915050565b7f56657374696e6743616c6c65723a2063726561746520636c61776261636b207660008201527f657374696e67206163636f756e74206661696c65640000000000000000000000602082015250565b60006113f960358361138c565b91506114048261139d565b604082019050919050565b60006020820190508181036000830152611428816113ec565b9050919050565b7f56657374696e6743616c6c65723a20636f6e7665727420746f20636c6177626160008201527f636b2076657374696e67206163636f756e74206661696c656400000000000000602082015250565b600061148b60398361138c565b91506114968261142f565b604082019050919050565b600060208201905081810360008301526114ba8161147e565b9050919050565b60006060820190506114d66000830186610b77565b6114e36020830185610b77565b6114f06040830184610b77565b949350505050565b60006020828403121561150e5761150d61068d565b5b600082015167ffffffffffffffff81111561152c5761152b610692565b5b61153884828501610e17565b91505092915050565b61154a81610aec565b82525050565b60006060820190506115656000830186610b77565b6115726020830185610b77565b61157f6040830184611541565b949350505050565b7f56657374696e6743616c6c65723a2063726561746520636c61776261636b207660008201527f657374696e67206163636f756e7420666f7220636f6e7472616374206661696c60208201527f6564000000000000000000000000000000000000000000000000000000000000604082015250565b600061160960428361138c565b915061161482611587565b606082019050919050565b60006020820190508181036000830152611638816115fc565b9050919050565b7f56657374696e6743616c6c65723a207570646174652076657374696e6720667560008201527f6e646572206661696c6564000000000000000000000000000000000000000000602082015250565b600061169b602b8361138c565b91506116a68261163f565b604082019050919050565b600060208201905081810360008301526116ca8161168e565b905091905056fea264697066735822122047e051ed3dc69fcb7ac54a3d4c1d4bd3b623d1424f03cc60e13648f9915c094964736f6c63430008120033" - + "_format": "hh-sol-artifact-1", + "contractName": "VestingCaller", + "sourceName": "solidity/precompiles/vesting/testdata/VestingCaller.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "vestingAddr", + "type": "address" + } + ], + "name": "balances", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Coin[]", + "name": "locked", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Coin[]", + "name": "unvested", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Coin[]", + "name": "vested", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "funder", + "type": "address" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "address", + "name": "dest", + "type": "address" + } + ], + "name": "clawback", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Coin[]", + "name": "coins", + "type": "tuple[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vestingAddr", + "type": "address" + } + ], + "name": "convertVestingAccount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "funder", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "bool", + "name": "enableGovClawback", + "type": "bool" + } + ], + "name": "createClawbackVestingAccount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "createClawbackVestingAccountForContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "funder", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint64", + "name": "startTime", + "type": "uint64" + }, + { + "components": [ + { + "internalType": "int64", + "name": "length", + "type": "int64" + }, + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Coin[]", + "name": "amount", + "type": "tuple[]" + } + ], + "internalType": "struct Period[]", + "name": "lockupPeriods", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "int64", + "name": "length", + "type": "int64" + }, + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Coin[]", + "name": "amount", + "type": "tuple[]" + } + ], + "internalType": "struct Period[]", + "name": "vestingPeriods", + "type": "tuple[]" + } + ], + "name": "fundVestingAccount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "funder", + "type": "address" + }, + { + "internalType": "address", + "name": "newFunder", + "type": "address" + }, + { + "internalType": "address", + "name": "vestingAddr", + "type": "address" + } + ], + "name": "updateVestingFunder", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b50611707806100206000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c806372e7c9ab1161005b57806372e7c9ab146100ec5780637caef81b1461011c5780639cfef12914610126578063cdb50175146101425761007d565b806327e235e3146100825780634fe1a8df146100b45780635a211064146100d0575b600080fd5b61009c600480360381019061009791906106f5565b61015e565b6040516100ab939291906108ca565b60405180910390f35b6100ce60048036038101906100c991906109bb565b6101f1565b005b6100ea60048036038101906100e591906106f5565b6102c9565b005b61010660048036038101906101019190610a77565b61038f565b6040516101139190610aca565b60405180910390f35b610124610421565b005b610140600480360381019061013b9190610a77565b6104eb565b005b61015c60048036038101906101579190610b24565b6105b7565b005b606080606061080373ffffffffffffffffffffffffffffffffffffffff166327e235e3856040518263ffffffff1660e01b815260040161019e9190610b86565b600060405180830381865afa1580156101bb573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906101e49190610e45565b9250925092509193909250565b600061080373ffffffffffffffffffffffffffffffffffffffff16634fe1a8df898989898989896040518863ffffffff1660e01b815260040161023a97969594939291906112e5565b6020604051808303816000875af1158015610259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027d919061135f565b9050806102bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b69061140f565b60405180910390fd5b5050505050505050565b600061080373ffffffffffffffffffffffffffffffffffffffff16635a211064836040518263ffffffff1660e01b81526004016103069190610b86565b6020604051808303816000875af1158015610325573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610349919061135f565b90508061038b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610382906114a1565b60405180910390fd5b5050565b606061080373ffffffffffffffffffffffffffffffffffffffff166372e7c9ab8585856040518463ffffffff1660e01b81526004016103d0939291906114c1565b6000604051808303816000875af11580156103ef573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061041891906114f8565b90509392505050565b600061080373ffffffffffffffffffffffffffffffffffffffff1663cdb50175333060006040518463ffffffff1660e01b815260040161046393929190611550565b6020604051808303816000875af1158015610482573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104a6919061135f565b9050806104e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104df9061161f565b60405180910390fd5b50565b600061080373ffffffffffffffffffffffffffffffffffffffff16639cfef1298585856040518463ffffffff1660e01b815260040161052c939291906114c1565b6020604051808303816000875af115801561054b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061056f919061135f565b9050806105b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105a8906116b1565b60405180910390fd5b50505050565b600061080373ffffffffffffffffffffffffffffffffffffffff1663cdb501758585856040518463ffffffff1660e01b81526004016105f893929190611550565b6020604051808303816000875af1158015610617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063b919061135f565b90508061067d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106749061140f565b60405180910390fd5b50505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106c282610697565b9050919050565b6106d2816106b7565b81146106dd57600080fd5b50565b6000813590506106ef816106c9565b92915050565b60006020828403121561070b5761070a61068d565b5b6000610719848285016106e0565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561078857808201518184015260208101905061076d565b60008484015250505050565b6000601f19601f8301169050919050565b60006107b08261074e565b6107ba8185610759565b93506107ca81856020860161076a565b6107d381610794565b840191505092915050565b6000819050919050565b6107f1816107de565b82525050565b6000604083016000830151848203600086015261081482826107a5565b915050602083015161082960208601826107e8565b508091505092915050565b600061084083836107f7565b905092915050565b6000602082019050919050565b600061086082610722565b61086a818561072d565b93508360208202850161087c8561073e565b8060005b858110156108b857848403895281516108998582610834565b94506108a483610848565b925060208a01995050600181019050610880565b50829750879550505050505092915050565b600060608201905081810360008301526108e48186610855565b905081810360208301526108f88185610855565b9050818103604083015261090c8184610855565b9050949350505050565b600067ffffffffffffffff82169050919050565b61093381610916565b811461093e57600080fd5b50565b6000813590506109508161092a565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261097b5761097a610956565b5b8235905067ffffffffffffffff8111156109985761099761095b565b5b6020830191508360208202830111156109b4576109b3610960565b5b9250929050565b600080600080600080600060a0888a0312156109da576109d961068d565b5b60006109e88a828b016106e0565b97505060206109f98a828b016106e0565b9650506040610a0a8a828b01610941565b955050606088013567ffffffffffffffff811115610a2b57610a2a610692565b5b610a378a828b01610965565b9450945050608088013567ffffffffffffffff811115610a5a57610a59610692565b5b610a668a828b01610965565b925092505092959891949750929550565b600080600060608486031215610a9057610a8f61068d565b5b6000610a9e868287016106e0565b9350506020610aaf868287016106e0565b9250506040610ac0868287016106e0565b9150509250925092565b60006020820190508181036000830152610ae48184610855565b905092915050565b60008115159050919050565b610b0181610aec565b8114610b0c57600080fd5b50565b600081359050610b1e81610af8565b92915050565b600080600060608486031215610b3d57610b3c61068d565b5b6000610b4b868287016106e0565b9350506020610b5c868287016106e0565b9250506040610b6d86828701610b0f565b9150509250925092565b610b80816106b7565b82525050565b6000602082019050610b9b6000830184610b77565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610bd982610794565b810181811067ffffffffffffffff82111715610bf857610bf7610ba1565b5b80604052505050565b6000610c0b610683565b9050610c178282610bd0565b919050565b600067ffffffffffffffff821115610c3757610c36610ba1565b5b602082029050602081019050919050565b600080fd5b600080fd5b600080fd5b600067ffffffffffffffff821115610c7257610c71610ba1565b5b610c7b82610794565b9050602081019050919050565b6000610c9b610c9684610c57565b610c01565b905082815260208101848484011115610cb757610cb6610c52565b5b610cc284828561076a565b509392505050565b600082601f830112610cdf57610cde610956565b5b8151610cef848260208601610c88565b91505092915050565b610d01816107de565b8114610d0c57600080fd5b50565b600081519050610d1e81610cf8565b92915050565b600060408284031215610d3a57610d39610c48565b5b610d446040610c01565b9050600082015167ffffffffffffffff811115610d6457610d63610c4d565b5b610d7084828501610cca565b6000830152506020610d8484828501610d0f565b60208301525092915050565b6000610da3610d9e84610c1c565b610c01565b90508083825260208201905060208402830185811115610dc657610dc5610960565b5b835b81811015610e0d57805167ffffffffffffffff811115610deb57610dea610956565b5b808601610df88982610d24565b85526020850194505050602081019050610dc8565b5050509392505050565b600082601f830112610e2c57610e2b610956565b5b8151610e3c848260208601610d90565b91505092915050565b600080600060608486031215610e5e57610e5d61068d565b5b600084015167ffffffffffffffff811115610e7c57610e7b610692565b5b610e8886828701610e17565b935050602084015167ffffffffffffffff811115610ea957610ea8610692565b5b610eb586828701610e17565b925050604084015167ffffffffffffffff811115610ed657610ed5610692565b5b610ee286828701610e17565b9150509250925092565b610ef581610916565b82525050565b600082825260208201905092915050565b6000819050919050565b60008160070b9050919050565b610f2c81610f16565b8114610f3757600080fd5b50565b600081359050610f4981610f23565b92915050565b6000610f5e6020840184610f3a565b905092915050565b610f6f81610f16565b82525050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112610fa157610fa0610f7f565b5b83810192508235915060208301925067ffffffffffffffff821115610fc957610fc8610f75565b5b602082023603831315610fdf57610fde610f7a565b5b509250929050565b600082825260208201905092915050565b6000819050919050565b6000808335600160200384360303811261101f5761101e610f7f565b5b83810192508235915060208301925067ffffffffffffffff82111561104757611046610f75565b5b60018202360383131561105d5761105c610f7a565b5b509250929050565b82818337600083830152505050565b60006110808385610759565b935061108d838584611065565b61109683610794565b840190509392505050565b6000813590506110b081610cf8565b92915050565b60006110c560208401846110a1565b905092915050565b6000604083016110e06000840184611002565b85830360008701526110f3838284611074565b9250505061110460208401846110b6565b61111160208601826107e8565b508091505092915050565b600061112883836110cd565b905092915050565b60008235600160400383360303811261114c5761114b610f7f565b5b82810191505092915050565b6000602082019050919050565b60006111718385610fe7565b93508360208402850161118384610ff8565b8060005b878110156111c757848403895261119e8284611130565b6111a8858261111c565b94506111b383611158565b925060208a01995050600181019050611187565b50829750879450505050509392505050565b6000604083016111ec6000840184610f4f565b6111f96000860182610f66565b506112076020840184610f84565b858303602087015261121a838284611165565b925050508091505092915050565b600061123483836111d9565b905092915050565b60008235600160400383360303811261125857611257610f7f565b5b82810191505092915050565b6000602082019050919050565b600061127d8385610efb565b93508360208402850161128f84610f0c565b8060005b878110156112d35784840389526112aa828461123c565b6112b48582611228565b94506112bf83611264565b925060208a01995050600181019050611293565b50829750879450505050509392505050565b600060a0820190506112fa600083018a610b77565b6113076020830189610b77565b6113146040830188610eec565b8181036060830152611327818688611271565b9050818103608083015261133c818486611271565b905098975050505050505050565b60008151905061135981610af8565b92915050565b6000602082840312156113755761137461068d565b5b60006113838482850161134a565b91505092915050565b600082825260208201905092915050565b7f56657374696e6743616c6c65723a2063726561746520636c61776261636b207660008201527f657374696e67206163636f756e74206661696c65640000000000000000000000602082015250565b60006113f960358361138c565b91506114048261139d565b604082019050919050565b60006020820190508181036000830152611428816113ec565b9050919050565b7f56657374696e6743616c6c65723a20636f6e7665727420746f20636c6177626160008201527f636b2076657374696e67206163636f756e74206661696c656400000000000000602082015250565b600061148b60398361138c565b91506114968261142f565b604082019050919050565b600060208201905081810360008301526114ba8161147e565b9050919050565b60006060820190506114d66000830186610b77565b6114e36020830185610b77565b6114f06040830184610b77565b949350505050565b60006020828403121561150e5761150d61068d565b5b600082015167ffffffffffffffff81111561152c5761152b610692565b5b61153884828501610e17565b91505092915050565b61154a81610aec565b82525050565b60006060820190506115656000830186610b77565b6115726020830185610b77565b61157f6040830184611541565b949350505050565b7f56657374696e6743616c6c65723a2063726561746520636c61776261636b207660008201527f657374696e67206163636f756e7420666f7220636f6e7472616374206661696c60208201527f6564000000000000000000000000000000000000000000000000000000000000604082015250565b600061160960428361138c565b915061161482611587565b606082019050919050565b60006020820190508181036000830152611638816115fc565b9050919050565b7f56657374696e6743616c6c65723a207570646174652076657374696e6720667560008201527f6e646572206661696c6564000000000000000000000000000000000000000000602082015250565b600061169b602b8361138c565b91506116a68261163f565b604082019050919050565b600060208201905081810360008301526116ca8161168e565b905091905056fea264697066735822122062a4b3572ecceb2cb3ff661355442e93824209f315372702596d2211b9c0b80364736f6c63430008130033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061007d5760003560e01c806372e7c9ab1161005b57806372e7c9ab146100ec5780637caef81b1461011c5780639cfef12914610126578063cdb50175146101425761007d565b806327e235e3146100825780634fe1a8df146100b45780635a211064146100d0575b600080fd5b61009c600480360381019061009791906106f5565b61015e565b6040516100ab939291906108ca565b60405180910390f35b6100ce60048036038101906100c991906109bb565b6101f1565b005b6100ea60048036038101906100e591906106f5565b6102c9565b005b61010660048036038101906101019190610a77565b61038f565b6040516101139190610aca565b60405180910390f35b610124610421565b005b610140600480360381019061013b9190610a77565b6104eb565b005b61015c60048036038101906101579190610b24565b6105b7565b005b606080606061080373ffffffffffffffffffffffffffffffffffffffff166327e235e3856040518263ffffffff1660e01b815260040161019e9190610b86565b600060405180830381865afa1580156101bb573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906101e49190610e45565b9250925092509193909250565b600061080373ffffffffffffffffffffffffffffffffffffffff16634fe1a8df898989898989896040518863ffffffff1660e01b815260040161023a97969594939291906112e5565b6020604051808303816000875af1158015610259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027d919061135f565b9050806102bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b69061140f565b60405180910390fd5b5050505050505050565b600061080373ffffffffffffffffffffffffffffffffffffffff16635a211064836040518263ffffffff1660e01b81526004016103069190610b86565b6020604051808303816000875af1158015610325573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610349919061135f565b90508061038b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610382906114a1565b60405180910390fd5b5050565b606061080373ffffffffffffffffffffffffffffffffffffffff166372e7c9ab8585856040518463ffffffff1660e01b81526004016103d0939291906114c1565b6000604051808303816000875af11580156103ef573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061041891906114f8565b90509392505050565b600061080373ffffffffffffffffffffffffffffffffffffffff1663cdb50175333060006040518463ffffffff1660e01b815260040161046393929190611550565b6020604051808303816000875af1158015610482573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104a6919061135f565b9050806104e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104df9061161f565b60405180910390fd5b50565b600061080373ffffffffffffffffffffffffffffffffffffffff16639cfef1298585856040518463ffffffff1660e01b815260040161052c939291906114c1565b6020604051808303816000875af115801561054b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061056f919061135f565b9050806105b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105a8906116b1565b60405180910390fd5b50505050565b600061080373ffffffffffffffffffffffffffffffffffffffff1663cdb501758585856040518463ffffffff1660e01b81526004016105f893929190611550565b6020604051808303816000875af1158015610617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063b919061135f565b90508061067d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106749061140f565b60405180910390fd5b50505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106c282610697565b9050919050565b6106d2816106b7565b81146106dd57600080fd5b50565b6000813590506106ef816106c9565b92915050565b60006020828403121561070b5761070a61068d565b5b6000610719848285016106e0565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561078857808201518184015260208101905061076d565b60008484015250505050565b6000601f19601f8301169050919050565b60006107b08261074e565b6107ba8185610759565b93506107ca81856020860161076a565b6107d381610794565b840191505092915050565b6000819050919050565b6107f1816107de565b82525050565b6000604083016000830151848203600086015261081482826107a5565b915050602083015161082960208601826107e8565b508091505092915050565b600061084083836107f7565b905092915050565b6000602082019050919050565b600061086082610722565b61086a818561072d565b93508360208202850161087c8561073e565b8060005b858110156108b857848403895281516108998582610834565b94506108a483610848565b925060208a01995050600181019050610880565b50829750879550505050505092915050565b600060608201905081810360008301526108e48186610855565b905081810360208301526108f88185610855565b9050818103604083015261090c8184610855565b9050949350505050565b600067ffffffffffffffff82169050919050565b61093381610916565b811461093e57600080fd5b50565b6000813590506109508161092a565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261097b5761097a610956565b5b8235905067ffffffffffffffff8111156109985761099761095b565b5b6020830191508360208202830111156109b4576109b3610960565b5b9250929050565b600080600080600080600060a0888a0312156109da576109d961068d565b5b60006109e88a828b016106e0565b97505060206109f98a828b016106e0565b9650506040610a0a8a828b01610941565b955050606088013567ffffffffffffffff811115610a2b57610a2a610692565b5b610a378a828b01610965565b9450945050608088013567ffffffffffffffff811115610a5a57610a59610692565b5b610a668a828b01610965565b925092505092959891949750929550565b600080600060608486031215610a9057610a8f61068d565b5b6000610a9e868287016106e0565b9350506020610aaf868287016106e0565b9250506040610ac0868287016106e0565b9150509250925092565b60006020820190508181036000830152610ae48184610855565b905092915050565b60008115159050919050565b610b0181610aec565b8114610b0c57600080fd5b50565b600081359050610b1e81610af8565b92915050565b600080600060608486031215610b3d57610b3c61068d565b5b6000610b4b868287016106e0565b9350506020610b5c868287016106e0565b9250506040610b6d86828701610b0f565b9150509250925092565b610b80816106b7565b82525050565b6000602082019050610b9b6000830184610b77565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610bd982610794565b810181811067ffffffffffffffff82111715610bf857610bf7610ba1565b5b80604052505050565b6000610c0b610683565b9050610c178282610bd0565b919050565b600067ffffffffffffffff821115610c3757610c36610ba1565b5b602082029050602081019050919050565b600080fd5b600080fd5b600080fd5b600067ffffffffffffffff821115610c7257610c71610ba1565b5b610c7b82610794565b9050602081019050919050565b6000610c9b610c9684610c57565b610c01565b905082815260208101848484011115610cb757610cb6610c52565b5b610cc284828561076a565b509392505050565b600082601f830112610cdf57610cde610956565b5b8151610cef848260208601610c88565b91505092915050565b610d01816107de565b8114610d0c57600080fd5b50565b600081519050610d1e81610cf8565b92915050565b600060408284031215610d3a57610d39610c48565b5b610d446040610c01565b9050600082015167ffffffffffffffff811115610d6457610d63610c4d565b5b610d7084828501610cca565b6000830152506020610d8484828501610d0f565b60208301525092915050565b6000610da3610d9e84610c1c565b610c01565b90508083825260208201905060208402830185811115610dc657610dc5610960565b5b835b81811015610e0d57805167ffffffffffffffff811115610deb57610dea610956565b5b808601610df88982610d24565b85526020850194505050602081019050610dc8565b5050509392505050565b600082601f830112610e2c57610e2b610956565b5b8151610e3c848260208601610d90565b91505092915050565b600080600060608486031215610e5e57610e5d61068d565b5b600084015167ffffffffffffffff811115610e7c57610e7b610692565b5b610e8886828701610e17565b935050602084015167ffffffffffffffff811115610ea957610ea8610692565b5b610eb586828701610e17565b925050604084015167ffffffffffffffff811115610ed657610ed5610692565b5b610ee286828701610e17565b9150509250925092565b610ef581610916565b82525050565b600082825260208201905092915050565b6000819050919050565b60008160070b9050919050565b610f2c81610f16565b8114610f3757600080fd5b50565b600081359050610f4981610f23565b92915050565b6000610f5e6020840184610f3a565b905092915050565b610f6f81610f16565b82525050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112610fa157610fa0610f7f565b5b83810192508235915060208301925067ffffffffffffffff821115610fc957610fc8610f75565b5b602082023603831315610fdf57610fde610f7a565b5b509250929050565b600082825260208201905092915050565b6000819050919050565b6000808335600160200384360303811261101f5761101e610f7f565b5b83810192508235915060208301925067ffffffffffffffff82111561104757611046610f75565b5b60018202360383131561105d5761105c610f7a565b5b509250929050565b82818337600083830152505050565b60006110808385610759565b935061108d838584611065565b61109683610794565b840190509392505050565b6000813590506110b081610cf8565b92915050565b60006110c560208401846110a1565b905092915050565b6000604083016110e06000840184611002565b85830360008701526110f3838284611074565b9250505061110460208401846110b6565b61111160208601826107e8565b508091505092915050565b600061112883836110cd565b905092915050565b60008235600160400383360303811261114c5761114b610f7f565b5b82810191505092915050565b6000602082019050919050565b60006111718385610fe7565b93508360208402850161118384610ff8565b8060005b878110156111c757848403895261119e8284611130565b6111a8858261111c565b94506111b383611158565b925060208a01995050600181019050611187565b50829750879450505050509392505050565b6000604083016111ec6000840184610f4f565b6111f96000860182610f66565b506112076020840184610f84565b858303602087015261121a838284611165565b925050508091505092915050565b600061123483836111d9565b905092915050565b60008235600160400383360303811261125857611257610f7f565b5b82810191505092915050565b6000602082019050919050565b600061127d8385610efb565b93508360208402850161128f84610f0c565b8060005b878110156112d35784840389526112aa828461123c565b6112b48582611228565b94506112bf83611264565b925060208a01995050600181019050611293565b50829750879450505050509392505050565b600060a0820190506112fa600083018a610b77565b6113076020830189610b77565b6113146040830188610eec565b8181036060830152611327818688611271565b9050818103608083015261133c818486611271565b905098975050505050505050565b60008151905061135981610af8565b92915050565b6000602082840312156113755761137461068d565b5b60006113838482850161134a565b91505092915050565b600082825260208201905092915050565b7f56657374696e6743616c6c65723a2063726561746520636c61776261636b207660008201527f657374696e67206163636f756e74206661696c65640000000000000000000000602082015250565b60006113f960358361138c565b91506114048261139d565b604082019050919050565b60006020820190508181036000830152611428816113ec565b9050919050565b7f56657374696e6743616c6c65723a20636f6e7665727420746f20636c6177626160008201527f636b2076657374696e67206163636f756e74206661696c656400000000000000602082015250565b600061148b60398361138c565b91506114968261142f565b604082019050919050565b600060208201905081810360008301526114ba8161147e565b9050919050565b60006060820190506114d66000830186610b77565b6114e36020830185610b77565b6114f06040830184610b77565b949350505050565b60006020828403121561150e5761150d61068d565b5b600082015167ffffffffffffffff81111561152c5761152b610692565b5b61153884828501610e17565b91505092915050565b61154a81610aec565b82525050565b60006060820190506115656000830186610b77565b6115726020830185610b77565b61157f6040830184611541565b949350505050565b7f56657374696e6743616c6c65723a2063726561746520636c61776261636b207660008201527f657374696e67206163636f756e7420666f7220636f6e7472616374206661696c60208201527f6564000000000000000000000000000000000000000000000000000000000000604082015250565b600061160960428361138c565b915061161482611587565b606082019050919050565b60006020820190508181036000830152611638816115fc565b9050919050565b7f56657374696e6743616c6c65723a207570646174652076657374696e6720667560008201527f6e646572206661696c6564000000000000000000000000000000000000000000602082015250565b600061169b602b8361138c565b91506116a68261163f565b604082019050919050565b600060208201905081810360008301526116ca8161168e565b905091905056fea264697066735822122062a4b3572ecceb2cb3ff661355442e93824209f315372702596d2211b9c0b80364736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} } diff --git a/precompiles/vesting/testdata/vesting_caller.go b/precompiles/vesting/testdata/vesting_caller.go index 9f2ced9c93..c4e3f3a7c1 100644 --- a/precompiles/vesting/testdata/vesting_caller.go +++ b/precompiles/vesting/testdata/vesting_caller.go @@ -4,27 +4,10 @@ package testdata import ( - _ "embed" // embed compiled smart contract - "encoding/json" - + contractutils "github.com/evmos/evmos/v18/contracts/utils" evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) -var ( - //go:embed VestingCaller.json - VestingCallerJSON []byte - - // VestingCallerContract is the compiled contract calling the Vesting precompile - VestingCallerContract evmtypes.CompiledContract -) - -func init() { - err := json.Unmarshal(VestingCallerJSON, &VestingCallerContract) - if err != nil { - panic(err) - } - - if len(VestingCallerContract.Bin) == 0 { - panic("failed to load smart contract that calls the vesting precompile") - } +func LoadVestingCallerContract() (evmtypes.CompiledContract, error) { + return contractutils.LoadContractFromJSONFile("VestingCaller.json") } diff --git a/precompiles/vesting/utils_test.go b/precompiles/vesting/utils_test.go index d105910ee8..76deb4b68d 100644 --- a/precompiles/vesting/utils_test.go +++ b/precompiles/vesting/utils_test.go @@ -202,6 +202,10 @@ func (s *PrecompileTestSuite) DoSetupTest() { queryHelperEvm := baseapp.NewQueryServerTestHelper(s.ctx, s.app.InterfaceRegistry()) evmtypes.RegisterQueryServer(queryHelperEvm, s.app.EvmKeeper) s.queryClientEVM = evmtypes.NewQueryClient(queryHelperEvm) + + vestingCallerContract, err := testdata.LoadVestingCallerContract() + s.Require().NoError(err) + s.vestingCallerContract = vestingCallerContract } // CallType is a struct that represents the type of call to be made to the @@ -227,7 +231,7 @@ func (s *PrecompileTestSuite) BuildCallArgs( callArgs.ContractAddr = s.precompile.Address() } else { callArgs.ContractAddr = contractAddr - callArgs.ContractABI = testdata.VestingCallerContract.ABI + callArgs.ContractABI = s.vestingCallerContract.ABI } return callArgs diff --git a/precompiles/werc20/integration_test.go b/precompiles/werc20/integration_test.go index c0d96b1bc3..e40ece434f 100644 --- a/precompiles/werc20/integration_test.go +++ b/precompiles/werc20/integration_test.go @@ -43,6 +43,8 @@ var _ = Describe("WEVMOS Extension -", func() { contractData ContractData contractDataOriginal ContractData + wevmosContract evmtypes.CompiledContract + failCheck testutil.LogCheckArgs passCheck testutil.LogCheckArgs ) @@ -52,11 +54,14 @@ var _ = Describe("WEVMOS Extension -", func() { sender = s.keyring.GetKey(0) + wevmosContract, err = testdata.LoadWEVMOSContract() + Expect(err).ToNot(HaveOccurred(), "failed to load WEVMOS contract") + WERC20ContractAddr, err = s.factory.DeployContract( sender.Priv, evmtypes.EvmTxArgs{}, // NOTE: passing empty struct to use default values factory.ContractDeploymentData{ - Contract: testdata.WEVMOSContract, + Contract: wevmosContract, ConstructorArgs: []interface{}{}, }, ) @@ -82,7 +87,7 @@ var _ = Describe("WEVMOS Extension -", func() { contractData = ContractData{ ownerPriv: sender.Priv, erc20Addr: WERC20ContractAddr, - erc20ABI: testdata.WEVMOSContract.ABI, + erc20ABI: wevmosContract.ABI, precompileAddr: s.precompile.Address(), precompileABI: s.precompile.ABI, } @@ -245,7 +250,7 @@ var _ = Describe("WEVMOS Extension -", func() { sender.Priv, evmtypes.EvmTxArgs{}, // NOTE: passing empty struct to use default values factory.ContractDeploymentData{ - Contract: testdata.WEVMOSContract, + Contract: wevmosContract, ConstructorArgs: []interface{}{}, }, ) @@ -253,7 +258,7 @@ var _ = Describe("WEVMOS Extension -", func() { contractDataOriginal = ContractData{ ownerPriv: sender.Priv, erc20Addr: WEVMOSOriginalContractAddr, - erc20ABI: testdata.WEVMOSContract.ABI, + erc20ABI: wevmosContract.ABI, } }) diff --git a/precompiles/werc20/testdata/wevmos.go b/precompiles/werc20/testdata/wevmos.go index 1672cc468d..bccb371e31 100644 --- a/precompiles/werc20/testdata/wevmos.go +++ b/precompiles/werc20/testdata/wevmos.go @@ -4,27 +4,10 @@ package testdata import ( - _ "embed" // embed compiled smart contract - "encoding/json" - + contractutils "github.com/evmos/evmos/v18/contracts/utils" evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) -var ( - //go:embed WEVMOS.json - WevmosJSON []byte - - // WEVMOSContract is the compiled contract of WEVMOS - WEVMOSContract evmtypes.CompiledContract -) - -func init() { - err := json.Unmarshal(WevmosJSON, &WEVMOSContract) - if err != nil { - panic(err) - } - - if len(WEVMOSContract.Bin) == 0 { - panic("failed to load WEVMOS smart contract") - } +func LoadWEVMOSContract() (evmtypes.CompiledContract, error) { + return contractutils.LegacyLoadContractFromJSONFile("WEVMOS.json") } diff --git a/scripts/changelog_checker/release.py b/scripts/changelog_checker/release.py index 503e4af3d8..9394cd8998 100644 --- a/scripts/changelog_checker/release.py +++ b/scripts/changelog_checker/release.py @@ -72,7 +72,10 @@ def __le__(self, other: int): r"^v(?P\d+)\.(\d+)\.(\d+)(-rc\d+)?$", self.version ) if not version_match: - raise ValueError(f'Invalid version "{self.version}"') + raise ValueError( + f'Invalid release version in line "{self.line}" ' + + "or possibly wrong header style used" + ) major = int(version_match.group("major")) return major <= other @@ -84,7 +87,8 @@ def check_link(link: str, version: str) -> Tuple[str, List[str]]: :param link: the link in the release header. :param version: the version in the release header. - :return: a tuple containing the fixed link and a list of problems, which is empty if there are none. + :return: a tuple containing the fixed link and a list of problems, + which is empty if there are none. """ base_url: str = "https://github.com/evmos/evmos/releases/tag/" @@ -102,7 +106,8 @@ def check_link(link: str, version: str) -> Tuple[str, List[str]]: if version not in link: problems.append( - f'Release header version "{version}" does not match version in link "{link}"' + f'Release header version "{version}" ' + + f'does not match version in link "{link}"' ) return fixed, problems diff --git a/scripts/compile_smart_contracts/README.md b/scripts/compile_smart_contracts/README.md new file mode 100644 index 0000000000..04c667aa54 --- /dev/null +++ b/scripts/compile_smart_contracts/README.md @@ -0,0 +1,36 @@ +# Compiling Smart Contracts + +This tool compiles all smart contracts found in this repository using a Hardhat setup. +The contracts are collected and then copied into the `contracts` directory for compilation. +After compilation, the resulting JSON data is copied back to the source locations. + +**Note**: The tool will compile all smart contracts found +(except for the ignored paths defined in the script) +but only overwrite the compiled JSON data for contracts +that already have a corresponding compiled JSON file in the same directory. +If you want to add a new JSON file to the repository, use the `add` command +described below. + +## Usage + +To compile the smart contracts, run the following command: + +```bash +make contracts-compile +``` + +This will compile the smart contracts and generate the JSON files. + +To clean up the generated artifacts, installed dependencies and cached files, +run: + +```bash +make contracts-clean +``` + +If you want to add a new smart contract and have a JSON file generated for it, +run: + +```bash +make contracts-add CONTRACT=path/to/contract.sol +``` diff --git a/scripts/compile_smart_contracts/compile_smart_contracts.py b/scripts/compile_smart_contracts/compile_smart_contracts.py new file mode 100644 index 0000000000..c4574ecbe2 --- /dev/null +++ b/scripts/compile_smart_contracts/compile_smart_contracts.py @@ -0,0 +1,323 @@ +""" +This file contains the script to compile all Solidity smart contracts +in this repository. +It also can be used to clean up the build artifacts and downloaded dependencies +from the Hardhat project directory. + +Usage: + python3 compile_smart_contracts.py --compile + python3 compile_smart_contracts.py --clean + +""" + +import os +import re +import sys +from dataclasses import dataclass +from pathlib import Path +from shutil import copy, rmtree +from typing import List + +# The path to the main level of the Evmos repository. +REPO_PATH = Path(__file__).parent.parent.parent + + +# This is the main target directory inside of the contracts folder. +HARDHAT_PROJECT_DIR = "contracts" +SOLIDITY_SOURCE = "solidity" +RELATIVE_TARGET = Path(HARDHAT_PROJECT_DIR) / SOLIDITY_SOURCE +CONTRACTS_TARGET = REPO_PATH / RELATIVE_TARGET + + +# This list contains all files that should be ignored when scanning the +# repository for Solidity files. +IGNORED_FILES: List[str] = [ + # Ignored because it uses a different OpenZeppelin contracts version to + # compile + "ERC20Minter_OpenZeppelinV5.sol", + # Ignored because it requires an older version of Solidity + "WEVMOS.sol", +] + + +# This list contains all folders that should be ignored when scanning the +# repository for Solidity files. +IGNORED_FOLDERS: List[str] = [ + "nix_tests", + "node_modules", + "scripts", + "tests/solidity", + # We don't want to copy anything that has already been copied into the + # contracts subdirectory, but we do want to have the ones stored there originally. + rf"{RELATIVE_TARGET}/\w+", +] + + +@dataclass +class Contract: + """ + Dataclass to store the name and path of a Solidity contract + as well as the path to where the compiled JSON data is stored. + """ + + compiledJSONPath: Path | None + filename: str + path: Path + relative_path: Path + + +def find_solidity_contracts( + path: Path, + added_contract: str | None = None, +) -> List[Contract]: + """ + Finds all Solidity files in the given Path. + It also checks if the compiled JSON file is present (in the same directory) + which is the indicator if the compilation result should be copied + back to the source directory. + + If an added contract is provided, it will be checked that this is actually + in the repository and the new compiledJSONPath will be added to the list. + """ + + solidity_files: List[Contract] = [] + found_added_contract = False + + for root, _, files in os.walk(path): + if is_ignored_folder(root): + continue + + relative_path = Path(root).relative_to(path) + + for file in files: + if file in IGNORED_FILES: + continue + + if re.search(r"(?!\.dbg)\.sol$", file): + filename = os.path.splitext(file)[0] + potential_json_path = Path(root) / f"{filename}.json" + + if ( + added_contract is not None + and added_contract in f"{Path(root) / file}" + ): + found_added_contract = True + compiledJSONPath = potential_json_path + elif os.path.exists(potential_json_path): + compiledJSONPath = potential_json_path + elif not os.path.exists(potential_json_path): + compiledJSONPath = None + else: + raise ValueError( + f"Unexpected behavior for '{Path(root) / file}'.", + ) + + solidity_files.append( + Contract( + filename=filename, + path=Path(os.path.join(root, file)), + relative_path=relative_path, + compiledJSONPath=compiledJSONPath, + ) + ) + + if not found_added_contract and added_contract is not None: + raise ValueError(f"Contract {added_contract} not found in the repository.") + + return solidity_files + + +def is_ignored_folder(path: str) -> bool: + """ + Check if the folder is in the list of ignored folders. + """ + + return any([re.search(folder, path) for folder in IGNORED_FOLDERS]) + + +def copy_to_contracts_directory(target_dir: Path, contracts: List[Contract]) -> bool: + """ + This function copies the list of Contracts found in the repository + to the target directory. + + In the context of the fully-functional tool, this is necessary to compile + them with Hardhat, which relies on the Solidity files to be nested within + the `contracts` directory. + """ + + if not os.path.isdir(target_dir) or not os.path.exists(target_dir): + return False + + for contract in contracts: + sub_dir = target_dir / contract.relative_path + if is_relative_target(contract.relative_path): + continue + + # if sub dir already exists this is skipped when using exist_ok=True + sub_dir.mkdir(parents=True, exist_ok=True) + copy(contract.path, sub_dir) + + return True + + +def is_evmos_repo(path: Path) -> bool: + """ + This function checks if the given path is the root of the Evmos repository, + where this script is designed to be executed. + """ + + contents = os.listdir(path) + + if "go.mod" not in contents: + return False + + with open(path / "go.mod", "r") as go_mod: + while True: + line = go_mod.readline() + if not line: + break + + if "module github.com/evmos/evmos" in line: + return True + + return False + + +def compile_contracts_in_dir(target_dir: Path): + """ + This function compiles the Solidity contracts in the target directory + with Hardhat. + """ + + cur_dir = os.getcwd() + + # Change to the root directory of the hardhat setup to compile. + os.chdir(target_dir.parent) + if not os.path.exists("hardhat.config.js"): + raise ValueError("compilation can only work in a HardHat setup") + + install_failed = os.system("npm install") + if install_failed: + raise ValueError("Failed to install npm packages.") + + compilation_failed = os.system("npx hardhat compile") + if compilation_failed: + raise ValueError("Failed to compile Solidity contracts.") + + os.chdir(cur_dir) + + +def copy_compiled_contracts_back_to_source( + contracts: List[Contract], + compiled_dir: Path, +): + """ + This function checks if the given contracts have + been compiled in the compilation target directory + and copies those back, that have a corresponding JSON + file found originally. + """ + + for contract in contracts: + if contract.compiledJSONPath is None: + continue + + if is_relative_target(contract.relative_path): + dir_with_json = compiled_dir + else: + dir_with_json = compiled_dir / contract.relative_path + + compiled_path = ( + dir_with_json / f"{contract.filename}.sol" / f"{contract.filename}.json" + ) + + if not os.path.exists(compiled_path): + print(f"Path: {compiled_path}") + print(f"-> did not find compiled JSON file for {contract.filename}") + continue + + copy(compiled_path, contract.compiledJSONPath) + + +def clean_up_hardhat_project(hardhat_dir: Path): + """ + This function removes the build artifacts as well as the downloaded + node modules from the Hardhat project folder. + Also, the file that have been copied to the contracts directory are deleted. + """ + + node_modules = hardhat_dir / "node_modules" + if os.path.exists(node_modules): + rmtree(hardhat_dir / "node_modules") + + artifacts = hardhat_dir / "artifacts" + if os.path.exists(artifacts): + rmtree(artifacts) + + cache = hardhat_dir / "cache" + if os.path.exists(cache): + rmtree(cache) + + contracts_dir = hardhat_dir / SOLIDITY_SOURCE + for entry in contracts_dir.iterdir(): + if entry.is_dir(): + rmtree(entry) + + +def is_relative_target(path: Path) -> bool: + """ + Checks if the given path is the target directory, + where the contracts are copied to. + """ + + return path == RELATIVE_TARGET + + +def compile_files(repo_path: Path, added_contract: str | None = None): + """ + This function compiles the Solidity contracts in the repository + with Hardhat. + """ + + found_contracts = find_solidity_contracts(REPO_PATH, added_contract=added_contract) + + if not copy_to_contracts_directory(CONTRACTS_TARGET, found_contracts): + raise ValueError("Failed to copy contracts to target directory.") + + compile_contracts_in_dir(CONTRACTS_TARGET) + copy_compiled_contracts_back_to_source( + found_contracts, CONTRACTS_TARGET.parent / "artifacts" / SOLIDITY_SOURCE + ) + + +if __name__ == "__main__": + if not is_evmos_repo(REPO_PATH): + raise ValueError( + "This script should only be executed " + + "in the evmos repository." + + f"Current path: {REPO_PATH}" + ) + + if len(sys.argv) < 2 or len(sys.argv) > 3: + raise ValueError( + "Wrong usage, please refer to the README of this script", + ) + + if sys.argv[1] == "--compile": + compile_files(REPO_PATH, added_contract=None) + + elif sys.argv[1] == "--clean": + # In any case we want to clean up the hardhat setup + clean_up_hardhat_project(CONTRACTS_TARGET.parent) + + elif sys.argv[1] == "--add": + added_contract = sys.argv[2] + if not added_contract.endswith(".sol"): + raise ValueError("Provided contract is not a Solidity file.") + + compile_files(REPO_PATH, added_contract=added_contract) + + else: + raise ValueError( + "Wrong usage, please refer to the README of this script", + ) diff --git a/scripts/compile_smart_contracts/test_compile_smart_contracts.py b/scripts/compile_smart_contracts/test_compile_smart_contracts.py new file mode 100644 index 0000000000..d5a91d8603 --- /dev/null +++ b/scripts/compile_smart_contracts/test_compile_smart_contracts.py @@ -0,0 +1,132 @@ +import os +from pathlib import Path +from shutil import copytree + +import pytest +from compile_smart_contracts import ( + HARDHAT_PROJECT_DIR, + SOLIDITY_SOURCE, + compile_contracts_in_dir, + copy_to_contracts_directory, + find_solidity_contracts, + is_evmos_repo, + is_ignored_folder, +) + + +@pytest.fixture +def setup_example_contracts_files(tmp_path): + """ + This fixture creates a temporary folder with some Solidity files. + """ + + (tmp_path / "Contract1.sol").touch() + (tmp_path / "Contract1.json").touch() + (tmp_path / "Contract2.sol").touch() + # NOTE: we're not adding the JSON file for Contract2 + + (tmp_path / HARDHAT_PROJECT_DIR).mkdir() + (tmp_path / HARDHAT_PROJECT_DIR / "Contract3.sol").touch() + (tmp_path / HARDHAT_PROJECT_DIR / "Contract3.json").touch() + + (tmp_path / "precompiles").mkdir() + (tmp_path / "precompiles" / "Contract4.sol").touch() + (tmp_path / "precompiles" / "Contract4.json").touch() + + return tmp_path + + +def test_find_solidity_files(setup_example_contracts_files): + tmp_path = setup_example_contracts_files + found_solidity_contracts = find_solidity_contracts(tmp_path) + assert len(found_solidity_contracts) == 4 + + assert found_solidity_contracts[0].filename == "Contract2" + assert found_solidity_contracts[0].path == tmp_path / "Contract2.sol" + assert found_solidity_contracts[0].relative_path == Path(".") + assert found_solidity_contracts[0].compiledJSONPath is None + + assert found_solidity_contracts[1].filename == "Contract1" + assert found_solidity_contracts[1].path == tmp_path / "Contract1.sol" + assert found_solidity_contracts[1].relative_path == Path(".") + assert found_solidity_contracts[1].compiledJSONPath == Path( + tmp_path / "Contract1.json" + ) + + assert found_solidity_contracts[2].filename == "Contract4" + assert found_solidity_contracts[2].path == Path( + tmp_path / "precompiles" / "Contract4.sol" + ) + assert found_solidity_contracts[2].relative_path == Path("precompiles") + assert found_solidity_contracts[2].compiledJSONPath == Path( + tmp_path / "precompiles" / "Contract4.json" + ) + + assert found_solidity_contracts[3].filename == "Contract3" + assert found_solidity_contracts[3].relative_path == Path(HARDHAT_PROJECT_DIR) + assert found_solidity_contracts[3].compiledJSONPath == Path( + tmp_path / HARDHAT_PROJECT_DIR / "Contract3.json" + ) + + +def test_copy_to_contracts_directory( + tmp_path, +): + target = tmp_path + wd = Path(os.getcwd()) + assert is_evmos_repo( + wd + ), "This test should be executed from the top level of the Evmos repo" + contracts = find_solidity_contracts(wd) + + assert os.listdir(target) == [] + assert copy_to_contracts_directory(target, contracts) is True + + dir_contents_post = os.listdir(target) + assert len(dir_contents_post) > 0 + assert os.path.exists( + target / "precompiles" / "staking" / "testdata" / "StakingCaller.sol" + ) + + +@pytest.fixture +def setup_contracts_directory(tmp_path): + """ + This fixture creates a dummy hardhat project from the testdata folder. + It will serve to test the compilation of smart contracts using this + script's functions. + """ + + testdata_dir = Path(__file__).parent / "testdata" + copytree(testdata_dir, tmp_path, dirs_exist_ok=True) + + return tmp_path + + +def test_compile_contracts_in_dir(setup_contracts_directory): + hardhat_dir = setup_contracts_directory + target_dir = hardhat_dir / SOLIDITY_SOURCE + + compile_contracts_in_dir(target_dir) + assert os.path.exists( + hardhat_dir + / "artifacts" + / SOLIDITY_SOURCE + / "SimpleContract.sol" + / "SimpleContract.json" + ) + + +def test_is_ignored_folder(): + assert is_ignored_folder(f"abc/{HARDHAT_PROJECT_DIR}/{SOLIDITY_SOURCE}") is False + assert ( + is_ignored_folder(f"abc/{HARDHAT_PROJECT_DIR}/{SOLIDITY_SOURCE}/precompiles") + is True + ) + assert ( + is_ignored_folder(f"abc/{HARDHAT_PROJECT_DIR}/{SOLIDITY_SOURCE}/01_example") + is True + ) + assert is_ignored_folder("abc/node_modules/precompiles") is True + assert is_ignored_folder("abc/tests/solidity/precompiles") is True + assert is_ignored_folder("abc/nix_tests/precompiles") is True diff --git a/scripts/compile_smart_contracts/testdata/hardhat.config.js b/scripts/compile_smart_contracts/testdata/hardhat.config.js new file mode 100644 index 0000000000..5a6dc10e2a --- /dev/null +++ b/scripts/compile_smart_contracts/testdata/hardhat.config.js @@ -0,0 +1,7 @@ +/** @type import('hardhat/config').HardhatUserConfig */ +module.exports = { + solidity: '0.8.19', + paths: { + sources: './solidity' + } +} diff --git a/scripts/compile_smart_contracts/testdata/package.json b/scripts/compile_smart_contracts/testdata/package.json new file mode 100644 index 0000000000..759d7cc5b6 --- /dev/null +++ b/scripts/compile_smart_contracts/testdata/package.json @@ -0,0 +1,22 @@ +{ + "name": "evmos-contracts", + "version": "2.0.0", + "description": "A collection of smart contracts used in the development of the Evmos blockchain.", + "devDependencies": { + "@openzeppelin/contracts": "^4.9.6", + "hardhat": "^2.22.2" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/evmos/evmos.git" + }, + "author": "Evmos Core Team", + "license": "ISC", + "bugs": { + "url": "https://github.com/evmos/evmos/issues" + }, + "homepage": "https://github.com/evmos/evmos#readme" +} diff --git a/scripts/compile_smart_contracts/testdata/solidity/SimpleContract.sol b/scripts/compile_smart_contracts/testdata/solidity/SimpleContract.sol new file mode 100644 index 0000000000..0545d2b563 --- /dev/null +++ b/scripts/compile_smart_contracts/testdata/solidity/SimpleContract.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.17; + +contract SimpleContract { + uint256 public value; + + function setValue(uint256 _value) public { + value = _value; + } +} diff --git a/x/erc20/keeper/evm_hooks_test.go b/x/erc20/keeper/evm_hooks_test.go index bfd4dd12a0..46a8f0ae8d 100644 --- a/x/erc20/keeper/evm_hooks_test.go +++ b/x/erc20/keeper/evm_hooks_test.go @@ -223,7 +223,8 @@ func (suite *KeeperTestSuite) TestPostTxProcessing() { transferData := []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} transferData[31] = uint8(10) - erc20 := contracts.ERC20BurnableContract.ABI + + erc20 := contracts.ERC20MinterBurnerDecimalsContract.ABI transferEvent := erc20.Events["Transfer"] diff --git a/x/erc20/keeper/evm_test.go b/x/erc20/keeper/evm_test.go index e12baa8f10..f7108f5074 100644 --- a/x/erc20/keeper/evm_test.go +++ b/x/erc20/keeper/evm_test.go @@ -55,6 +55,7 @@ func (suite *KeeperTestSuite) TestQueryERC20() { func (suite *KeeperTestSuite) TestBalanceOf() { var mockEVMKeeper *erc20mocks.EVMKeeper + contract := utiltx.GenerateAddress() testCases := []struct { name string @@ -102,8 +103,12 @@ func (suite *KeeperTestSuite) TestBalanceOf() { tc.malleate() - abi := contracts.ERC20BurnableContract.ABI - balance := suite.app.Erc20Keeper.BalanceOf(suite.ctx, abi, contract, utiltx.GenerateAddress()) + balance := suite.app.Erc20Keeper.BalanceOf( + suite.ctx, + contracts.ERC20MinterBurnerDecimalsContract.ABI, + contract, + utiltx.GenerateAddress(), + ) if tc.res { suite.Require().Equal(balance.Int64(), tc.expBalance) } else { diff --git a/x/erc20/keeper/testdata/ERC20DirectBalanceManipulation.json b/x/erc20/keeper/testdata/ERC20DirectBalanceManipulation.json new file mode 100644 index 0000000000..19c984c659 --- /dev/null +++ b/x/erc20/keeper/testdata/ERC20DirectBalanceManipulation.json @@ -0,0 +1,667 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ERC20DirectBalanceManipulation", + "sourceName": "solidity/ERC20DirectBalanceManipulation.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "initialSupply", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MINTER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PAUSER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "burnFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6080604052734dc6ac40af078661fc43823086e1513635eeab14600760016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200006657600080fd5b5060405162003dca38038062003dca83398181016040528101906200008c9190620006ef565b6040518060400160405280601e81526020017f455243323044697265637442616c616e63654d616e6970756c6174696f6e00008152506040518060400160405280601e81526020017f455243323044697265637442616c616e63654d616e6970756c6174696f6e0000815250818181600590816200010b919062000991565b5080600690816200011d919062000991565b5050506000600760006101000a81548160ff0219169083151502179055506200015f6000801b620001536200021160201b60201c565b6200021960201b60201c565b620001a07f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6620001946200021160201b60201c565b6200021960201b60201c565b620001e17f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a620001d56200021160201b60201c565b6200021960201b60201c565b5050620001f86000801b336200021960201b60201c565b6200020a33826200022f60201b60201c565b5062000c2b565b600033905090565b6200022b82826200039d60201b60201c565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620002a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002989062000ad9565b60405180910390fd5b620002b560008383620003db60201b60201c565b8060046000828254620002c9919062000b2a565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200037d919062000b76565b60405180910390a36200039960008383620003f360201b60201c565b5050565b620003af8282620003f860201b60201c565b620003d68160016000858152602001908152602001600020620004e960201b90919060201c565b505050565b620003ee8383836200052160201b60201c565b505050565b505050565b6200040a82826200058c60201b60201c565b620004e557600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200048a6200021160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600062000519836000018373ffffffffffffffffffffffffffffffffffffffff1660001b620005f660201b60201c565b905092915050565b620005348383836200067060201b60201c565b620005446200067560201b60201c565b1562000587576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200057e9062000c09565b60405180910390fd5b505050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60006200060a83836200068c60201b60201c565b620006655782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506200066a565b600090505b92915050565b505050565b6000600760009054906101000a900460ff16905090565b600080836001016000848152602001908152602001600020541415905092915050565b600080fd5b6000819050919050565b620006c981620006b4565b8114620006d557600080fd5b50565b600081519050620006e981620006be565b92915050565b600060208284031215620007085762000707620006af565b5b60006200071884828501620006d8565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620007a357607f821691505b602082108103620007b957620007b86200075b565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620008237fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620007e4565b6200082f8683620007e4565b95508019841693508086168417925050509392505050565b6000819050919050565b6000620008726200086c6200086684620006b4565b62000847565b620006b4565b9050919050565b6000819050919050565b6200088e8362000851565b620008a66200089d8262000879565b848454620007f1565b825550505050565b600090565b620008bd620008ae565b620008ca81848462000883565b505050565b5b81811015620008f257620008e6600082620008b3565b600181019050620008d0565b5050565b601f82111562000941576200090b81620007bf565b6200091684620007d4565b8101602085101562000926578190505b6200093e6200093585620007d4565b830182620008cf565b50505b505050565b600082821c905092915050565b6000620009666000198460080262000946565b1980831691505092915050565b600062000981838362000953565b9150826002028217905092915050565b6200099c8262000721565b67ffffffffffffffff811115620009b857620009b76200072c565b5b620009c482546200078a565b620009d1828285620008f6565b600060209050601f83116001811462000a095760008415620009f4578287015190505b62000a00858262000973565b86555062000a70565b601f19841662000a1986620007bf565b60005b8281101562000a435784890151825560018201915060208501945060208101905062000a1c565b8683101562000a63578489015162000a5f601f89168262000953565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000ac1601f8362000a78565b915062000ace8262000a89565b602082019050919050565b6000602082019050818103600083015262000af48162000ab2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000b3782620006b4565b915062000b4483620006b4565b925082820190508082111562000b5f5762000b5e62000afb565b5b92915050565b62000b7081620006b4565b82525050565b600060208201905062000b8d600083018462000b65565b92915050565b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b600062000bf1602a8362000a78565b915062000bfe8262000b93565b604082019050919050565b6000602082019050818103600083015262000c248162000be2565b9050919050565b61318f8062000c3b6000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063a457c2d711610097578063d539139311610071578063d53913931461052d578063d547741f1461054b578063dd62ed3e14610567578063e63ab1e914610597576101c4565b8063a457c2d71461049d578063a9059cbb146104cd578063ca15c873146104fd576101c4565b80639010d07c116100d35780639010d07c1461040157806391d148541461043157806395d89b4114610461578063a217fddf1461047f576101c4565b806370a08231146103ab57806379cc6790146103db5780638456cb59146103f7576101c4565b8063313ce567116101665780633f4ba83a116101405780633f4ba83a1461034b57806340c10f191461035557806342966c68146103715780635c975abb1461038d576101c4565b8063313ce567146102e157806336568abe146102ff578063395093511461031b576101c4565b806318160ddd116101a257806318160ddd1461024757806323b872dd14610265578063248a9ca3146102955780632f2ff15d146102c5576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063095ea7b314610217575b600080fd5b6101e360048036038101906101de9190612008565b6105b5565b6040516101f09190612050565b60405180910390f35b61020161062f565b60405161020e91906120fb565b60405180910390f35b610231600480360381019061022c91906121b1565b6106c1565b60405161023e9190612050565b60405180910390f35b61024f6106e4565b60405161025c9190612200565b60405180910390f35b61027f600480360381019061027a919061221b565b6106ee565b60405161028c9190612050565b60405180910390f35b6102af60048036038101906102aa91906122a4565b61071d565b6040516102bc91906122e0565b60405180910390f35b6102df60048036038101906102da91906122fb565b61073c565b005b6102e961075d565b6040516102f69190612357565b60405180910390f35b610319600480360381019061031491906122fb565b610766565b005b610335600480360381019061033091906121b1565b6107e9565b6040516103429190612050565b60405180910390f35b610353610820565b005b61036f600480360381019061036a91906121b1565b61089a565b005b61038b60048036038101906103869190612372565b610918565b005b61039561092c565b6040516103a29190612050565b60405180910390f35b6103c560048036038101906103c0919061239f565b610943565b6040516103d29190612200565b60405180910390f35b6103f560048036038101906103f091906121b1565b61098c565b005b6103ff6109ac565b005b61041b600480360381019061041691906123cc565b610a26565b604051610428919061241b565b60405180910390f35b61044b600480360381019061044691906122fb565b610a55565b6040516104589190612050565b60405180910390f35b610469610abf565b60405161047691906120fb565b60405180910390f35b610487610b51565b60405161049491906122e0565b60405180910390f35b6104b760048036038101906104b291906121b1565b610b58565b6040516104c49190612050565b60405180910390f35b6104e760048036038101906104e291906121b1565b610bcf565b6040516104f49190612050565b60405180910390f35b610517600480360381019061051291906122a4565b610c2c565b6040516105249190612200565b60405180910390f35b610535610c50565b60405161054291906122e0565b60405180910390f35b610565600480360381019061056091906122fb565b610c74565b005b610581600480360381019061057c9190612436565b610c95565b60405161058e9190612200565b60405180910390f35b61059f610d1c565b6040516105ac91906122e0565b60405180910390f35b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610628575061062782610d40565b5b9050919050565b60606005805461063e906124a5565b80601f016020809104026020016040519081016040528092919081815260200182805461066a906124a5565b80156106b75780601f1061068c576101008083540402835291602001916106b7565b820191906000526020600020905b81548152906001019060200180831161069a57829003601f168201915b5050505050905090565b6000806106cc610dba565b90506106d9818585610dc2565b600191505092915050565b6000600454905090565b6000806106f9610dba565b9050610706858285610f8b565b610711858585611017565b60019150509392505050565b6000806000838152602001908152602001600020600101549050919050565b6107458261071d565b61074e81611290565b61075883836112a4565b505050565b60006012905090565b61076e610dba565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146107db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d290612548565b60405180910390fd5b6107e582826112d8565b5050565b6000806107f4610dba565b90506108158185856108068589610c95565b6108109190612597565b610dc2565b600191505092915050565b6108517f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61084c610dba565b610a55565b610890576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108879061263d565b60405180910390fd5b61089861130c565b565b6108cb7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66108c6610dba565b610a55565b61090a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610901906126cf565b60405180910390fd5b610914828261136f565b5050565b610929610923610dba565b826114c6565b50565b6000600760009054906101000a900460ff16905090565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61099e82610998610dba565b83610f8b565b6109a882826114c6565b5050565b6109dd7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6109d8610dba565b610a55565b610a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1390612761565b60405180910390fd5b610a24611695565b565b6000610a4d82600160008681526020019081526020016000206116f890919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060068054610ace906124a5565b80601f0160208091040260200160405190810160405280929190818152602001828054610afa906124a5565b8015610b475780601f10610b1c57610100808354040283529160200191610b47565b820191906000526020600020905b815481529060010190602001808311610b2a57829003601f168201915b5050505050905090565b6000801b81565b600080610b63610dba565b90506000610b718286610c95565b905083811015610bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bad906127f3565b60405180910390fd5b610bc38286868403610dc2565b60019250505092915050565b600080600283610bdf9190612842565b9050610c18600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff168285610c139190612873565b611712565b50610c238482611712565b91505092915050565b6000610c4960016000848152602001908152602001600020611735565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610c7d8261071d565b610c8681611290565b610c9083836112d8565b505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610db35750610db28261174a565b5b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2890612919565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ea0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e97906129ab565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610f7e9190612200565b60405180910390a3505050565b6000610f978484610c95565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146110115781811015611003576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffa90612a17565b60405180910390fd5b6110108484848403610dc2565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611086576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107d90612aa9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ec90612b3b565b60405180910390fd5b6111008383836117b4565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117e90612bcd565b60405180910390fd5b818103600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516112779190612200565b60405180910390a361128a8484846117c4565b50505050565b6112a18161129c610dba565b6117c9565b50565b6112ae828261184e565b6112d3816001600085815260200190815260200160002061192e90919063ffffffff16565b505050565b6112e2828261195e565b6113078160016000858152602001908152602001600020611a3f90919063ffffffff16565b505050565b611314611a6f565b6000600760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611358610dba565b604051611365919061241b565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d590612c39565b60405180910390fd5b6113ea600083836117b4565b80600460008282546113fc9190612597565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516114ae9190612200565b60405180910390a36114c2600083836117c4565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152c90612ccb565b60405180910390fd5b611541826000836117b4565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156115c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bf90612d5d565b60405180910390fd5b818103600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600460008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161167c9190612200565b60405180910390a3611690836000846117c4565b505050565b61169d611ab8565b6001600760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586116e1610dba565b6040516116ee919061241b565b60405180910390a1565b60006117078360000183611b02565b60001c905092915050565b60008061171d610dba565b905061172a818585611017565b600191505092915050565b600061174382600001611b2d565b9050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6117bf838383611b3e565b505050565b505050565b6117d38282610a55565b61184a576117e081611b96565b6117ee8360001c6020611bc3565b6040516020016117ff929190612e51565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184191906120fb565b60405180910390fd5b5050565b6118588282610a55565b61192a57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506118cf610dba565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000611956836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611dff565b905092915050565b6119688282610a55565b15611a3b57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506119e0610dba565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000611a67836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611e6f565b905092915050565b611a7761092c565b611ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aad90612ed7565b60405180910390fd5b565b611ac061092c565b15611b00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af790612f43565b60405180910390fd5b565b6000826000018281548110611b1a57611b19612f63565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b611b49838383611f83565b611b5161092c565b15611b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8890613004565b60405180910390fd5b505050565b6060611bbc8273ffffffffffffffffffffffffffffffffffffffff16601460ff16611bc3565b9050919050565b606060006002836002611bd69190613024565b611be09190612597565b67ffffffffffffffff811115611bf957611bf8613066565b5b6040519080825280601f01601f191660200182016040528015611c2b5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611c6357611c62612f63565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611cc757611cc6612f63565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611d079190613024565b611d119190612597565b90505b6001811115611db1577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611d5357611d52612f63565b5b1a60f81b828281518110611d6a57611d69612f63565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611daa90613095565b9050611d14565b5060008414611df5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dec9061310a565b60405180910390fd5b8091505092915050565b6000611e0b8383611f88565b611e64578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611e69565b600090505b92915050565b60008083600101600084815260200190815260200160002054905060008114611f77576000600182611ea19190612873565b9050600060018660000180549050611eb99190612873565b9050818114611f28576000866000018281548110611eda57611ed9612f63565b5b9060005260206000200154905080876000018481548110611efe57611efd612f63565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480611f3c57611f3b61312a565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050611f7d565b60009150505b92915050565b505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611fe581611fb0565b8114611ff057600080fd5b50565b60008135905061200281611fdc565b92915050565b60006020828403121561201e5761201d611fab565b5b600061202c84828501611ff3565b91505092915050565b60008115159050919050565b61204a81612035565b82525050565b60006020820190506120656000830184612041565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156120a557808201518184015260208101905061208a565b60008484015250505050565b6000601f19601f8301169050919050565b60006120cd8261206b565b6120d78185612076565b93506120e7818560208601612087565b6120f0816120b1565b840191505092915050565b6000602082019050818103600083015261211581846120c2565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006121488261211d565b9050919050565b6121588161213d565b811461216357600080fd5b50565b6000813590506121758161214f565b92915050565b6000819050919050565b61218e8161217b565b811461219957600080fd5b50565b6000813590506121ab81612185565b92915050565b600080604083850312156121c8576121c7611fab565b5b60006121d685828601612166565b92505060206121e78582860161219c565b9150509250929050565b6121fa8161217b565b82525050565b600060208201905061221560008301846121f1565b92915050565b60008060006060848603121561223457612233611fab565b5b600061224286828701612166565b935050602061225386828701612166565b92505060406122648682870161219c565b9150509250925092565b6000819050919050565b6122818161226e565b811461228c57600080fd5b50565b60008135905061229e81612278565b92915050565b6000602082840312156122ba576122b9611fab565b5b60006122c88482850161228f565b91505092915050565b6122da8161226e565b82525050565b60006020820190506122f560008301846122d1565b92915050565b6000806040838503121561231257612311611fab565b5b60006123208582860161228f565b925050602061233185828601612166565b9150509250929050565b600060ff82169050919050565b6123518161233b565b82525050565b600060208201905061236c6000830184612348565b92915050565b60006020828403121561238857612387611fab565b5b60006123968482850161219c565b91505092915050565b6000602082840312156123b5576123b4611fab565b5b60006123c384828501612166565b91505092915050565b600080604083850312156123e3576123e2611fab565b5b60006123f18582860161228f565b92505060206124028582860161219c565b9150509250929050565b6124158161213d565b82525050565b6000602082019050612430600083018461240c565b92915050565b6000806040838503121561244d5761244c611fab565b5b600061245b85828601612166565b925050602061246c85828601612166565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806124bd57607f821691505b6020821081036124d0576124cf612476565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000612532602f83612076565b915061253d826124d6565b604082019050919050565b6000602082019050818103600083015261256181612525565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006125a28261217b565b91506125ad8361217b565b92508282019050808211156125c5576125c4612568565b5b92915050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f20756e706175736500000000000000602082015250565b6000612627603983612076565b9150612632826125cb565b604082019050919050565b600060208201905081810360008301526126568161261a565b9050919050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f7665206d696e74657220726f6c6520746f206d696e7400000000000000000000602082015250565b60006126b9603683612076565b91506126c48261265d565b604082019050919050565b600060208201905081810360008301526126e8816126ac565b9050919050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f207061757365000000000000000000602082015250565b600061274b603783612076565b9150612756826126ef565b604082019050919050565b6000602082019050818103600083015261277a8161273e565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006127dd602583612076565b91506127e882612781565b604082019050919050565b6000602082019050818103600083015261280c816127d0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061284d8261217b565b91506128588361217b565b92508261286857612867612813565b5b828204905092915050565b600061287e8261217b565b91506128898361217b565b92508282039050818111156128a1576128a0612568565b5b92915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612903602483612076565b915061290e826128a7565b604082019050919050565b60006020820190508181036000830152612932816128f6565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612995602283612076565b91506129a082612939565b604082019050919050565b600060208201905081810360008301526129c481612988565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612a01601d83612076565b9150612a0c826129cb565b602082019050919050565b60006020820190508181036000830152612a30816129f4565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612a93602583612076565b9150612a9e82612a37565b604082019050919050565b60006020820190508181036000830152612ac281612a86565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612b25602383612076565b9150612b3082612ac9565b604082019050919050565b60006020820190508181036000830152612b5481612b18565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000612bb7602683612076565b9150612bc282612b5b565b604082019050919050565b60006020820190508181036000830152612be681612baa565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000612c23601f83612076565b9150612c2e82612bed565b602082019050919050565b60006020820190508181036000830152612c5281612c16565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000612cb5602183612076565b9150612cc082612c59565b604082019050919050565b60006020820190508181036000830152612ce481612ca8565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000612d47602283612076565b9150612d5282612ceb565b604082019050919050565b60006020820190508181036000830152612d7681612d3a565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000612dbe601783612d7d565b9150612dc982612d88565b601782019050919050565b6000612ddf8261206b565b612de98185612d7d565b9350612df9818560208601612087565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000612e3b601183612d7d565b9150612e4682612e05565b601182019050919050565b6000612e5c82612db1565b9150612e688285612dd4565b9150612e7382612e2e565b9150612e7f8284612dd4565b91508190509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000612ec1601483612076565b9150612ecc82612e8b565b602082019050919050565b60006020820190508181036000830152612ef081612eb4565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000612f2d601083612076565b9150612f3882612ef7565b602082019050919050565b60006020820190508181036000830152612f5c81612f20565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b6000612fee602a83612076565b9150612ff982612f92565b604082019050919050565b6000602082019050818103600083015261301d81612fe1565b9050919050565b600061302f8261217b565b915061303a8361217b565b92508282026130488161217b565b9150828204841483151761305f5761305e612568565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006130a08261217b565b9150600082036130b3576130b2612568565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006130f4602083612076565b91506130ff826130be565b602082019050919050565b60006020820190508181036000830152613123816130e7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212201826981466f1ec51b03f9f3c18a6408f6a40a7fb82f51fb8099b09cf179c13eb64736f6c63430008130033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063a457c2d711610097578063d539139311610071578063d53913931461052d578063d547741f1461054b578063dd62ed3e14610567578063e63ab1e914610597576101c4565b8063a457c2d71461049d578063a9059cbb146104cd578063ca15c873146104fd576101c4565b80639010d07c116100d35780639010d07c1461040157806391d148541461043157806395d89b4114610461578063a217fddf1461047f576101c4565b806370a08231146103ab57806379cc6790146103db5780638456cb59146103f7576101c4565b8063313ce567116101665780633f4ba83a116101405780633f4ba83a1461034b57806340c10f191461035557806342966c68146103715780635c975abb1461038d576101c4565b8063313ce567146102e157806336568abe146102ff578063395093511461031b576101c4565b806318160ddd116101a257806318160ddd1461024757806323b872dd14610265578063248a9ca3146102955780632f2ff15d146102c5576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063095ea7b314610217575b600080fd5b6101e360048036038101906101de9190612008565b6105b5565b6040516101f09190612050565b60405180910390f35b61020161062f565b60405161020e91906120fb565b60405180910390f35b610231600480360381019061022c91906121b1565b6106c1565b60405161023e9190612050565b60405180910390f35b61024f6106e4565b60405161025c9190612200565b60405180910390f35b61027f600480360381019061027a919061221b565b6106ee565b60405161028c9190612050565b60405180910390f35b6102af60048036038101906102aa91906122a4565b61071d565b6040516102bc91906122e0565b60405180910390f35b6102df60048036038101906102da91906122fb565b61073c565b005b6102e961075d565b6040516102f69190612357565b60405180910390f35b610319600480360381019061031491906122fb565b610766565b005b610335600480360381019061033091906121b1565b6107e9565b6040516103429190612050565b60405180910390f35b610353610820565b005b61036f600480360381019061036a91906121b1565b61089a565b005b61038b60048036038101906103869190612372565b610918565b005b61039561092c565b6040516103a29190612050565b60405180910390f35b6103c560048036038101906103c0919061239f565b610943565b6040516103d29190612200565b60405180910390f35b6103f560048036038101906103f091906121b1565b61098c565b005b6103ff6109ac565b005b61041b600480360381019061041691906123cc565b610a26565b604051610428919061241b565b60405180910390f35b61044b600480360381019061044691906122fb565b610a55565b6040516104589190612050565b60405180910390f35b610469610abf565b60405161047691906120fb565b60405180910390f35b610487610b51565b60405161049491906122e0565b60405180910390f35b6104b760048036038101906104b291906121b1565b610b58565b6040516104c49190612050565b60405180910390f35b6104e760048036038101906104e291906121b1565b610bcf565b6040516104f49190612050565b60405180910390f35b610517600480360381019061051291906122a4565b610c2c565b6040516105249190612200565b60405180910390f35b610535610c50565b60405161054291906122e0565b60405180910390f35b610565600480360381019061056091906122fb565b610c74565b005b610581600480360381019061057c9190612436565b610c95565b60405161058e9190612200565b60405180910390f35b61059f610d1c565b6040516105ac91906122e0565b60405180910390f35b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610628575061062782610d40565b5b9050919050565b60606005805461063e906124a5565b80601f016020809104026020016040519081016040528092919081815260200182805461066a906124a5565b80156106b75780601f1061068c576101008083540402835291602001916106b7565b820191906000526020600020905b81548152906001019060200180831161069a57829003601f168201915b5050505050905090565b6000806106cc610dba565b90506106d9818585610dc2565b600191505092915050565b6000600454905090565b6000806106f9610dba565b9050610706858285610f8b565b610711858585611017565b60019150509392505050565b6000806000838152602001908152602001600020600101549050919050565b6107458261071d565b61074e81611290565b61075883836112a4565b505050565b60006012905090565b61076e610dba565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146107db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d290612548565b60405180910390fd5b6107e582826112d8565b5050565b6000806107f4610dba565b90506108158185856108068589610c95565b6108109190612597565b610dc2565b600191505092915050565b6108517f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61084c610dba565b610a55565b610890576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108879061263d565b60405180910390fd5b61089861130c565b565b6108cb7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66108c6610dba565b610a55565b61090a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610901906126cf565b60405180910390fd5b610914828261136f565b5050565b610929610923610dba565b826114c6565b50565b6000600760009054906101000a900460ff16905090565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61099e82610998610dba565b83610f8b565b6109a882826114c6565b5050565b6109dd7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6109d8610dba565b610a55565b610a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1390612761565b60405180910390fd5b610a24611695565b565b6000610a4d82600160008681526020019081526020016000206116f890919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060068054610ace906124a5565b80601f0160208091040260200160405190810160405280929190818152602001828054610afa906124a5565b8015610b475780601f10610b1c57610100808354040283529160200191610b47565b820191906000526020600020905b815481529060010190602001808311610b2a57829003601f168201915b5050505050905090565b6000801b81565b600080610b63610dba565b90506000610b718286610c95565b905083811015610bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bad906127f3565b60405180910390fd5b610bc38286868403610dc2565b60019250505092915050565b600080600283610bdf9190612842565b9050610c18600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff168285610c139190612873565b611712565b50610c238482611712565b91505092915050565b6000610c4960016000848152602001908152602001600020611735565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610c7d8261071d565b610c8681611290565b610c9083836112d8565b505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610db35750610db28261174a565b5b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2890612919565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ea0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e97906129ab565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610f7e9190612200565b60405180910390a3505050565b6000610f978484610c95565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146110115781811015611003576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffa90612a17565b60405180910390fd5b6110108484848403610dc2565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611086576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107d90612aa9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ec90612b3b565b60405180910390fd5b6111008383836117b4565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117e90612bcd565b60405180910390fd5b818103600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516112779190612200565b60405180910390a361128a8484846117c4565b50505050565b6112a18161129c610dba565b6117c9565b50565b6112ae828261184e565b6112d3816001600085815260200190815260200160002061192e90919063ffffffff16565b505050565b6112e2828261195e565b6113078160016000858152602001908152602001600020611a3f90919063ffffffff16565b505050565b611314611a6f565b6000600760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611358610dba565b604051611365919061241b565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d590612c39565b60405180910390fd5b6113ea600083836117b4565b80600460008282546113fc9190612597565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516114ae9190612200565b60405180910390a36114c2600083836117c4565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152c90612ccb565b60405180910390fd5b611541826000836117b4565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156115c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bf90612d5d565b60405180910390fd5b818103600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600460008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161167c9190612200565b60405180910390a3611690836000846117c4565b505050565b61169d611ab8565b6001600760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586116e1610dba565b6040516116ee919061241b565b60405180910390a1565b60006117078360000183611b02565b60001c905092915050565b60008061171d610dba565b905061172a818585611017565b600191505092915050565b600061174382600001611b2d565b9050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6117bf838383611b3e565b505050565b505050565b6117d38282610a55565b61184a576117e081611b96565b6117ee8360001c6020611bc3565b6040516020016117ff929190612e51565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184191906120fb565b60405180910390fd5b5050565b6118588282610a55565b61192a57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506118cf610dba565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000611956836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611dff565b905092915050565b6119688282610a55565b15611a3b57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506119e0610dba565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000611a67836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611e6f565b905092915050565b611a7761092c565b611ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aad90612ed7565b60405180910390fd5b565b611ac061092c565b15611b00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af790612f43565b60405180910390fd5b565b6000826000018281548110611b1a57611b19612f63565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b611b49838383611f83565b611b5161092c565b15611b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8890613004565b60405180910390fd5b505050565b6060611bbc8273ffffffffffffffffffffffffffffffffffffffff16601460ff16611bc3565b9050919050565b606060006002836002611bd69190613024565b611be09190612597565b67ffffffffffffffff811115611bf957611bf8613066565b5b6040519080825280601f01601f191660200182016040528015611c2b5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611c6357611c62612f63565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611cc757611cc6612f63565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611d079190613024565b611d119190612597565b90505b6001811115611db1577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611d5357611d52612f63565b5b1a60f81b828281518110611d6a57611d69612f63565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611daa90613095565b9050611d14565b5060008414611df5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dec9061310a565b60405180910390fd5b8091505092915050565b6000611e0b8383611f88565b611e64578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611e69565b600090505b92915050565b60008083600101600084815260200190815260200160002054905060008114611f77576000600182611ea19190612873565b9050600060018660000180549050611eb99190612873565b9050818114611f28576000866000018281548110611eda57611ed9612f63565b5b9060005260206000200154905080876000018481548110611efe57611efd612f63565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480611f3c57611f3b61312a565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050611f7d565b60009150505b92915050565b505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611fe581611fb0565b8114611ff057600080fd5b50565b60008135905061200281611fdc565b92915050565b60006020828403121561201e5761201d611fab565b5b600061202c84828501611ff3565b91505092915050565b60008115159050919050565b61204a81612035565b82525050565b60006020820190506120656000830184612041565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156120a557808201518184015260208101905061208a565b60008484015250505050565b6000601f19601f8301169050919050565b60006120cd8261206b565b6120d78185612076565b93506120e7818560208601612087565b6120f0816120b1565b840191505092915050565b6000602082019050818103600083015261211581846120c2565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006121488261211d565b9050919050565b6121588161213d565b811461216357600080fd5b50565b6000813590506121758161214f565b92915050565b6000819050919050565b61218e8161217b565b811461219957600080fd5b50565b6000813590506121ab81612185565b92915050565b600080604083850312156121c8576121c7611fab565b5b60006121d685828601612166565b92505060206121e78582860161219c565b9150509250929050565b6121fa8161217b565b82525050565b600060208201905061221560008301846121f1565b92915050565b60008060006060848603121561223457612233611fab565b5b600061224286828701612166565b935050602061225386828701612166565b92505060406122648682870161219c565b9150509250925092565b6000819050919050565b6122818161226e565b811461228c57600080fd5b50565b60008135905061229e81612278565b92915050565b6000602082840312156122ba576122b9611fab565b5b60006122c88482850161228f565b91505092915050565b6122da8161226e565b82525050565b60006020820190506122f560008301846122d1565b92915050565b6000806040838503121561231257612311611fab565b5b60006123208582860161228f565b925050602061233185828601612166565b9150509250929050565b600060ff82169050919050565b6123518161233b565b82525050565b600060208201905061236c6000830184612348565b92915050565b60006020828403121561238857612387611fab565b5b60006123968482850161219c565b91505092915050565b6000602082840312156123b5576123b4611fab565b5b60006123c384828501612166565b91505092915050565b600080604083850312156123e3576123e2611fab565b5b60006123f18582860161228f565b92505060206124028582860161219c565b9150509250929050565b6124158161213d565b82525050565b6000602082019050612430600083018461240c565b92915050565b6000806040838503121561244d5761244c611fab565b5b600061245b85828601612166565b925050602061246c85828601612166565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806124bd57607f821691505b6020821081036124d0576124cf612476565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000612532602f83612076565b915061253d826124d6565b604082019050919050565b6000602082019050818103600083015261256181612525565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006125a28261217b565b91506125ad8361217b565b92508282019050808211156125c5576125c4612568565b5b92915050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f20756e706175736500000000000000602082015250565b6000612627603983612076565b9150612632826125cb565b604082019050919050565b600060208201905081810360008301526126568161261a565b9050919050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f7665206d696e74657220726f6c6520746f206d696e7400000000000000000000602082015250565b60006126b9603683612076565b91506126c48261265d565b604082019050919050565b600060208201905081810360008301526126e8816126ac565b9050919050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f207061757365000000000000000000602082015250565b600061274b603783612076565b9150612756826126ef565b604082019050919050565b6000602082019050818103600083015261277a8161273e565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006127dd602583612076565b91506127e882612781565b604082019050919050565b6000602082019050818103600083015261280c816127d0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061284d8261217b565b91506128588361217b565b92508261286857612867612813565b5b828204905092915050565b600061287e8261217b565b91506128898361217b565b92508282039050818111156128a1576128a0612568565b5b92915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612903602483612076565b915061290e826128a7565b604082019050919050565b60006020820190508181036000830152612932816128f6565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612995602283612076565b91506129a082612939565b604082019050919050565b600060208201905081810360008301526129c481612988565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612a01601d83612076565b9150612a0c826129cb565b602082019050919050565b60006020820190508181036000830152612a30816129f4565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612a93602583612076565b9150612a9e82612a37565b604082019050919050565b60006020820190508181036000830152612ac281612a86565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612b25602383612076565b9150612b3082612ac9565b604082019050919050565b60006020820190508181036000830152612b5481612b18565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000612bb7602683612076565b9150612bc282612b5b565b604082019050919050565b60006020820190508181036000830152612be681612baa565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000612c23601f83612076565b9150612c2e82612bed565b602082019050919050565b60006020820190508181036000830152612c5281612c16565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000612cb5602183612076565b9150612cc082612c59565b604082019050919050565b60006020820190508181036000830152612ce481612ca8565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000612d47602283612076565b9150612d5282612ceb565b604082019050919050565b60006020820190508181036000830152612d7681612d3a565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000612dbe601783612d7d565b9150612dc982612d88565b601782019050919050565b6000612ddf8261206b565b612de98185612d7d565b9350612df9818560208601612087565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000612e3b601183612d7d565b9150612e4682612e05565b601182019050919050565b6000612e5c82612db1565b9150612e688285612dd4565b9150612e7382612e2e565b9150612e7f8284612dd4565b91508190509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000612ec1601483612076565b9150612ecc82612e8b565b602082019050919050565b60006020820190508181036000830152612ef081612eb4565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000612f2d601083612076565b9150612f3882612ef7565b602082019050919050565b60006020820190508181036000830152612f5c81612f20565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b6000612fee602a83612076565b9150612ff982612f92565b604082019050919050565b6000602082019050818103600083015261301d81612fe1565b9050919050565b600061302f8261217b565b915061303a8361217b565b92508282026130488161217b565b9150828204841483151761305f5761305e612568565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006130a08261217b565b9150600082036130b3576130b2612568565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006130f4602083612076565b91506130ff826130be565b602082019050919050565b60006020820190508181036000830152613123816130e7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212201826981466f1ec51b03f9f3c18a6408f6a40a7fb82f51fb8099b09cf179c13eb64736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/contracts/ERC20DirectBalanceManipulation.sol b/x/erc20/keeper/testdata/ERC20DirectBalanceManipulation.sol similarity index 91% rename from contracts/ERC20DirectBalanceManipulation.sol rename to x/erc20/keeper/testdata/ERC20DirectBalanceManipulation.sol index 54be06b307..ae02b90d1e 100644 --- a/contracts/ERC20DirectBalanceManipulation.sol +++ b/x/erc20/keeper/testdata/ERC20DirectBalanceManipulation.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.0; -import "./@openzeppelin/contracts/token/ERC20/presets/ERC20PresetMinterPauser.sol"; +import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetMinterPauser.sol"; // This is an evil token. Whenever an A -> B transfer is called, half of the amount goes to B // and half to a predefined C diff --git a/x/erc20/keeper/testdata/ERC20MaliciousDelayed.json b/x/erc20/keeper/testdata/ERC20MaliciousDelayed.json new file mode 100644 index 0000000000..fadc57851b --- /dev/null +++ b/x/erc20/keeper/testdata/ERC20MaliciousDelayed.json @@ -0,0 +1,667 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ERC20MaliciousDelayed", + "sourceName": "solidity/ERC20MaliciousDelayed.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "initialSupply", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MINTER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PAUSER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "burnFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6080604052734dc6ac40af078661fc43823086e1513635eeab14600760016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550670de0b6b3a76400006008553480156200007257600080fd5b5060405162003d5c38038062003d5c8339818101604052810190620000989190620006fb565b6040518060400160405280601581526020017f45524332304d616c6963696f757344656c6179656400000000000000000000008152506040518060400160405280601581526020017f45524332304d414c4943494f555344454c415945440000000000000000000000815250818181600590816200011791906200099d565b5080600690816200012991906200099d565b5050506000600760006101000a81548160ff0219169083151502179055506200016b6000801b6200015f6200021d60201b60201c565b6200022560201b60201c565b620001ac7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6620001a06200021d60201b60201c565b6200022560201b60201c565b620001ed7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a620001e16200021d60201b60201c565b6200022560201b60201c565b5050620002046000801b336200022560201b60201c565b6200021633826200023b60201b60201c565b5062000c37565b600033905090565b620002378282620003a960201b60201c565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620002ad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002a49062000ae5565b60405180910390fd5b620002c160008383620003e760201b60201c565b8060046000828254620002d5919062000b36565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000389919062000b82565b60405180910390a3620003a560008383620003ff60201b60201c565b5050565b620003bb82826200040460201b60201c565b620003e28160016000858152602001908152602001600020620004f560201b90919060201c565b505050565b620003fa8383836200052d60201b60201c565b505050565b505050565b6200041682826200059860201b60201c565b620004f157600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620004966200021d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600062000525836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200060260201b60201c565b905092915050565b620005408383836200067c60201b60201c565b620005506200068160201b60201c565b1562000593576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200058a9062000c15565b60405180910390fd5b505050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60006200061683836200069860201b60201c565b6200067157826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905062000676565b600090505b92915050565b505050565b6000600760009054906101000a900460ff16905090565b600080836001016000848152602001908152602001600020541415905092915050565b600080fd5b6000819050919050565b620006d581620006c0565b8114620006e157600080fd5b50565b600081519050620006f581620006ca565b92915050565b600060208284031215620007145762000713620006bb565b5b60006200072484828501620006e4565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620007af57607f821691505b602082108103620007c557620007c462000767565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200082f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620007f0565b6200083b8683620007f0565b95508019841693508086168417925050509392505050565b6000819050919050565b60006200087e620008786200087284620006c0565b62000853565b620006c0565b9050919050565b6000819050919050565b6200089a836200085d565b620008b2620008a98262000885565b848454620007fd565b825550505050565b600090565b620008c9620008ba565b620008d68184846200088f565b505050565b5b81811015620008fe57620008f2600082620008bf565b600181019050620008dc565b5050565b601f8211156200094d576200091781620007cb565b6200092284620007e0565b8101602085101562000932578190505b6200094a6200094185620007e0565b830182620008db565b50505b505050565b600082821c905092915050565b6000620009726000198460080262000952565b1980831691505092915050565b60006200098d83836200095f565b9150826002028217905092915050565b620009a8826200072d565b67ffffffffffffffff811115620009c457620009c362000738565b5b620009d0825462000796565b620009dd82828562000902565b600060209050601f83116001811462000a15576000841562000a00578287015190505b62000a0c85826200097f565b86555062000a7c565b601f19841662000a2586620007cb565b60005b8281101562000a4f5784890151825560018201915060208501945060208101905062000a28565b8683101562000a6f578489015162000a6b601f8916826200095f565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000acd601f8362000a84565b915062000ada8262000a95565b602082019050919050565b6000602082019050818103600083015262000b008162000abe565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000b4382620006c0565b915062000b5083620006c0565b925082820190508082111562000b6b5762000b6a62000b07565b5b92915050565b62000b7c81620006c0565b82525050565b600060208201905062000b99600083018462000b71565b92915050565b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b600062000bfd602a8362000a84565b915062000c0a8262000b9f565b604082019050919050565b6000602082019050818103600083015262000c308162000bee565b9050919050565b6131158062000c476000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063a457c2d711610097578063d539139311610071578063d53913931461052d578063d547741f1461054b578063dd62ed3e14610567578063e63ab1e914610597576101c4565b8063a457c2d71461049d578063a9059cbb146104cd578063ca15c873146104fd576101c4565b80639010d07c116100d35780639010d07c1461040157806391d148541461043157806395d89b4114610461578063a217fddf1461047f576101c4565b806370a08231146103ab57806379cc6790146103db5780638456cb59146103f7576101c4565b8063313ce567116101665780633f4ba83a116101405780633f4ba83a1461034b57806340c10f191461035557806342966c68146103715780635c975abb1461038d576101c4565b8063313ce567146102e157806336568abe146102ff578063395093511461031b576101c4565b806318160ddd116101a257806318160ddd1461024757806323b872dd14610265578063248a9ca3146102955780632f2ff15d146102c5576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063095ea7b314610217575b600080fd5b6101e360048036038101906101de9190611fee565b6105b5565b6040516101f09190612036565b60405180910390f35b61020161062f565b60405161020e91906120e1565b60405180910390f35b610231600480360381019061022c9190612197565b6106c1565b60405161023e9190612036565b60405180910390f35b61024f6106e4565b60405161025c91906121e6565b60405180910390f35b61027f600480360381019061027a9190612201565b6106ee565b60405161028c9190612036565b60405180910390f35b6102af60048036038101906102aa919061228a565b61071d565b6040516102bc91906122c6565b60405180910390f35b6102df60048036038101906102da91906122e1565b61073c565b005b6102e961075d565b6040516102f6919061233d565b60405180910390f35b610319600480360381019061031491906122e1565b610766565b005b61033560048036038101906103309190612197565b6107e9565b6040516103429190612036565b60405180910390f35b610353610820565b005b61036f600480360381019061036a9190612197565b61089a565b005b61038b60048036038101906103869190612358565b610918565b005b61039561092c565b6040516103a29190612036565b60405180910390f35b6103c560048036038101906103c09190612385565b610943565b6040516103d291906121e6565b60405180910390f35b6103f560048036038101906103f09190612197565b61098c565b005b6103ff6109ac565b005b61041b600480360381019061041691906123b2565b610a26565b6040516104289190612401565b60405180910390f35b61044b600480360381019061044691906122e1565b610a55565b6040516104589190612036565b60405180910390f35b610469610abf565b60405161047691906120e1565b60405180910390f35b610487610b51565b60405161049491906122c6565b60405180910390f35b6104b760048036038101906104b29190612197565b610b58565b6040516104c49190612036565b60405180910390f35b6104e760048036038101906104e29190612197565b610bcf565b6040516104f49190612036565b60405180910390f35b6105176004803603810190610512919061228a565b610c12565b60405161052491906121e6565b60405180910390f35b610535610c36565b60405161054291906122c6565b60405180910390f35b610565600480360381019061056091906122e1565b610c5a565b005b610581600480360381019061057c919061241c565b610c7b565b60405161058e91906121e6565b60405180910390f35b61059f610d02565b6040516105ac91906122c6565b60405180910390f35b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610628575061062782610d26565b5b9050919050565b60606005805461063e9061248b565b80601f016020809104026020016040519081016040528092919081815260200182805461066a9061248b565b80156106b75780601f1061068c576101008083540402835291602001916106b7565b820191906000526020600020905b81548152906001019060200180831161069a57829003601f168201915b5050505050905090565b6000806106cc610da0565b90506106d9818585610da8565b600191505092915050565b6000600454905090565b6000806106f9610da0565b9050610706858285610f71565b610711858585610ffd565b60019150509392505050565b6000806000838152602001908152602001600020600101549050919050565b6107458261071d565b61074e81611276565b610758838361128a565b505050565b60006012905090565b61076e610da0565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146107db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d29061252e565b60405180910390fd5b6107e582826112be565b5050565b6000806107f4610da0565b90506108158185856108068589610c7b565b610810919061257d565b610da8565b600191505092915050565b6108517f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61084c610da0565b610a55565b610890576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088790612623565b60405180910390fd5b6108986112f2565b565b6108cb7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66108c6610da0565b610a55565b61090a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610901906126b5565b60405180910390fd5b6109148282611355565b5050565b610929610923610da0565b826114ac565b50565b6000600760009054906101000a900460ff16905090565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61099e82610998610da0565b83610f71565b6109a882826114ac565b5050565b6109dd7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6109d8610da0565b610a55565b610a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1390612747565b60405180910390fd5b610a2461167b565b565b6000610a4d82600160008681526020019081526020016000206116de90919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060068054610ace9061248b565b80601f0160208091040260200160405190810160405280929190818152602001828054610afa9061248b565b8015610b475780601f10610b1c57610100808354040283529160200191610b47565b820191906000526020600020905b815481529060010190602001808311610b2a57829003601f168201915b5050505050905090565b6000801b81565b600080610b63610da0565b90506000610b718286610c7b565b905083811015610bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bad906127d9565b60405180910390fd5b610bc38286868403610da8565b60019250505092915050565b6000610c0083600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600854610da8565b610c0a83836116f8565b905092915050565b6000610c2f6001600084815260200190815260200160002061171b565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610c638261071d565b610c6c81611276565b610c7683836112be565b505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d995750610d9882611730565b5b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0e9061286b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7d906128fd565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610f6491906121e6565b60405180910390a3505050565b6000610f7d8484610c7b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ff75781811015610fe9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe090612969565b60405180910390fd5b610ff68484848403610da8565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361106c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611063906129fb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d290612a8d565b60405180910390fd5b6110e683838361179a565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561116d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116490612b1f565b60405180910390fd5b818103600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161125d91906121e6565b60405180910390a36112708484846117aa565b50505050565b61128781611282610da0565b6117af565b50565b6112948282611834565b6112b9816001600085815260200190815260200160002061191490919063ffffffff16565b505050565b6112c88282611944565b6112ed8160016000858152602001908152602001600020611a2590919063ffffffff16565b505050565b6112fa611a55565b6000600760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61133e610da0565b60405161134b9190612401565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bb90612b8b565b60405180910390fd5b6113d06000838361179a565b80600460008282546113e2919061257d565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161149491906121e6565b60405180910390a36114a8600083836117aa565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361151b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151290612c1d565b60405180910390fd5b6115278260008361179a565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156115ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a590612caf565b60405180910390fd5b818103600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600460008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161166291906121e6565b60405180910390a3611676836000846117aa565b505050565b611683611a9e565b6001600760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586116c7610da0565b6040516116d49190612401565b60405180910390a1565b60006116ed8360000183611ae8565b60001c905092915050565b600080611703610da0565b9050611710818585610ffd565b600191505092915050565b600061172982600001611b13565b9050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6117a5838383611b24565b505050565b505050565b6117b98282610a55565b611830576117c681611b7c565b6117d48360001c6020611ba9565b6040516020016117e5929190612da3565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182791906120e1565b60405180910390fd5b5050565b61183e8282610a55565b61191057600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506118b5610da0565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600061193c836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611de5565b905092915050565b61194e8282610a55565b15611a2157600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506119c6610da0565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000611a4d836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611e55565b905092915050565b611a5d61092c565b611a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9390612e29565b60405180910390fd5b565b611aa661092c565b15611ae6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611add90612e95565b60405180910390fd5b565b6000826000018281548110611b0057611aff612eb5565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b611b2f838383611f69565b611b3761092c565b15611b77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6e90612f56565b60405180910390fd5b505050565b6060611ba28273ffffffffffffffffffffffffffffffffffffffff16601460ff16611ba9565b9050919050565b606060006002836002611bbc9190612f76565b611bc6919061257d565b67ffffffffffffffff811115611bdf57611bde612fb8565b5b6040519080825280601f01601f191660200182016040528015611c115781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611c4957611c48612eb5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611cad57611cac612eb5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611ced9190612f76565b611cf7919061257d565b90505b6001811115611d97577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611d3957611d38612eb5565b5b1a60f81b828281518110611d5057611d4f612eb5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611d9090612fe7565b9050611cfa565b5060008414611ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd29061305c565b60405180910390fd5b8091505092915050565b6000611df18383611f6e565b611e4a578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611e4f565b600090505b92915050565b60008083600101600084815260200190815260200160002054905060008114611f5d576000600182611e87919061307c565b9050600060018660000180549050611e9f919061307c565b9050818114611f0e576000866000018281548110611ec057611ebf612eb5565b5b9060005260206000200154905080876000018481548110611ee457611ee3612eb5565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480611f2257611f216130b0565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050611f63565b60009150505b92915050565b505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611fcb81611f96565b8114611fd657600080fd5b50565b600081359050611fe881611fc2565b92915050565b60006020828403121561200457612003611f91565b5b600061201284828501611fd9565b91505092915050565b60008115159050919050565b6120308161201b565b82525050565b600060208201905061204b6000830184612027565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561208b578082015181840152602081019050612070565b60008484015250505050565b6000601f19601f8301169050919050565b60006120b382612051565b6120bd818561205c565b93506120cd81856020860161206d565b6120d681612097565b840191505092915050565b600060208201905081810360008301526120fb81846120a8565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061212e82612103565b9050919050565b61213e81612123565b811461214957600080fd5b50565b60008135905061215b81612135565b92915050565b6000819050919050565b61217481612161565b811461217f57600080fd5b50565b6000813590506121918161216b565b92915050565b600080604083850312156121ae576121ad611f91565b5b60006121bc8582860161214c565b92505060206121cd85828601612182565b9150509250929050565b6121e081612161565b82525050565b60006020820190506121fb60008301846121d7565b92915050565b60008060006060848603121561221a57612219611f91565b5b60006122288682870161214c565b93505060206122398682870161214c565b925050604061224a86828701612182565b9150509250925092565b6000819050919050565b61226781612254565b811461227257600080fd5b50565b6000813590506122848161225e565b92915050565b6000602082840312156122a05761229f611f91565b5b60006122ae84828501612275565b91505092915050565b6122c081612254565b82525050565b60006020820190506122db60008301846122b7565b92915050565b600080604083850312156122f8576122f7611f91565b5b600061230685828601612275565b92505060206123178582860161214c565b9150509250929050565b600060ff82169050919050565b61233781612321565b82525050565b6000602082019050612352600083018461232e565b92915050565b60006020828403121561236e5761236d611f91565b5b600061237c84828501612182565b91505092915050565b60006020828403121561239b5761239a611f91565b5b60006123a98482850161214c565b91505092915050565b600080604083850312156123c9576123c8611f91565b5b60006123d785828601612275565b92505060206123e885828601612182565b9150509250929050565b6123fb81612123565b82525050565b600060208201905061241660008301846123f2565b92915050565b6000806040838503121561243357612432611f91565b5b60006124418582860161214c565b92505060206124528582860161214c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806124a357607f821691505b6020821081036124b6576124b561245c565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000612518602f8361205c565b9150612523826124bc565b604082019050919050565b600060208201905081810360008301526125478161250b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061258882612161565b915061259383612161565b92508282019050808211156125ab576125aa61254e565b5b92915050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f20756e706175736500000000000000602082015250565b600061260d60398361205c565b9150612618826125b1565b604082019050919050565b6000602082019050818103600083015261263c81612600565b9050919050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f7665206d696e74657220726f6c6520746f206d696e7400000000000000000000602082015250565b600061269f60368361205c565b91506126aa82612643565b604082019050919050565b600060208201905081810360008301526126ce81612692565b9050919050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f207061757365000000000000000000602082015250565b600061273160378361205c565b915061273c826126d5565b604082019050919050565b6000602082019050818103600083015261276081612724565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006127c360258361205c565b91506127ce82612767565b604082019050919050565b600060208201905081810360008301526127f2816127b6565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061285560248361205c565b9150612860826127f9565b604082019050919050565b6000602082019050818103600083015261288481612848565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006128e760228361205c565b91506128f28261288b565b604082019050919050565b60006020820190508181036000830152612916816128da565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612953601d8361205c565b915061295e8261291d565b602082019050919050565b6000602082019050818103600083015261298281612946565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006129e560258361205c565b91506129f082612989565b604082019050919050565b60006020820190508181036000830152612a14816129d8565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612a7760238361205c565b9150612a8282612a1b565b604082019050919050565b60006020820190508181036000830152612aa681612a6a565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000612b0960268361205c565b9150612b1482612aad565b604082019050919050565b60006020820190508181036000830152612b3881612afc565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000612b75601f8361205c565b9150612b8082612b3f565b602082019050919050565b60006020820190508181036000830152612ba481612b68565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000612c0760218361205c565b9150612c1282612bab565b604082019050919050565b60006020820190508181036000830152612c3681612bfa565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000612c9960228361205c565b9150612ca482612c3d565b604082019050919050565b60006020820190508181036000830152612cc881612c8c565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000612d10601783612ccf565b9150612d1b82612cda565b601782019050919050565b6000612d3182612051565b612d3b8185612ccf565b9350612d4b81856020860161206d565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000612d8d601183612ccf565b9150612d9882612d57565b601182019050919050565b6000612dae82612d03565b9150612dba8285612d26565b9150612dc582612d80565b9150612dd18284612d26565b91508190509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000612e1360148361205c565b9150612e1e82612ddd565b602082019050919050565b60006020820190508181036000830152612e4281612e06565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000612e7f60108361205c565b9150612e8a82612e49565b602082019050919050565b60006020820190508181036000830152612eae81612e72565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b6000612f40602a8361205c565b9150612f4b82612ee4565b604082019050919050565b60006020820190508181036000830152612f6f81612f33565b9050919050565b6000612f8182612161565b9150612f8c83612161565b9250828202612f9a81612161565b91508282048414831517612fb157612fb061254e565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000612ff282612161565b9150600082036130055761300461254e565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061304660208361205c565b915061305182613010565b602082019050919050565b6000602082019050818103600083015261307581613039565b9050919050565b600061308782612161565b915061309283612161565b92508282039050818111156130aa576130a961254e565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea264697066735822122048dbc607f899fe32ad35f6b79035fe92c713a380571de42e1ed7404d0a2da28464736f6c63430008130033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063a457c2d711610097578063d539139311610071578063d53913931461052d578063d547741f1461054b578063dd62ed3e14610567578063e63ab1e914610597576101c4565b8063a457c2d71461049d578063a9059cbb146104cd578063ca15c873146104fd576101c4565b80639010d07c116100d35780639010d07c1461040157806391d148541461043157806395d89b4114610461578063a217fddf1461047f576101c4565b806370a08231146103ab57806379cc6790146103db5780638456cb59146103f7576101c4565b8063313ce567116101665780633f4ba83a116101405780633f4ba83a1461034b57806340c10f191461035557806342966c68146103715780635c975abb1461038d576101c4565b8063313ce567146102e157806336568abe146102ff578063395093511461031b576101c4565b806318160ddd116101a257806318160ddd1461024757806323b872dd14610265578063248a9ca3146102955780632f2ff15d146102c5576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063095ea7b314610217575b600080fd5b6101e360048036038101906101de9190611fee565b6105b5565b6040516101f09190612036565b60405180910390f35b61020161062f565b60405161020e91906120e1565b60405180910390f35b610231600480360381019061022c9190612197565b6106c1565b60405161023e9190612036565b60405180910390f35b61024f6106e4565b60405161025c91906121e6565b60405180910390f35b61027f600480360381019061027a9190612201565b6106ee565b60405161028c9190612036565b60405180910390f35b6102af60048036038101906102aa919061228a565b61071d565b6040516102bc91906122c6565b60405180910390f35b6102df60048036038101906102da91906122e1565b61073c565b005b6102e961075d565b6040516102f6919061233d565b60405180910390f35b610319600480360381019061031491906122e1565b610766565b005b61033560048036038101906103309190612197565b6107e9565b6040516103429190612036565b60405180910390f35b610353610820565b005b61036f600480360381019061036a9190612197565b61089a565b005b61038b60048036038101906103869190612358565b610918565b005b61039561092c565b6040516103a29190612036565b60405180910390f35b6103c560048036038101906103c09190612385565b610943565b6040516103d291906121e6565b60405180910390f35b6103f560048036038101906103f09190612197565b61098c565b005b6103ff6109ac565b005b61041b600480360381019061041691906123b2565b610a26565b6040516104289190612401565b60405180910390f35b61044b600480360381019061044691906122e1565b610a55565b6040516104589190612036565b60405180910390f35b610469610abf565b60405161047691906120e1565b60405180910390f35b610487610b51565b60405161049491906122c6565b60405180910390f35b6104b760048036038101906104b29190612197565b610b58565b6040516104c49190612036565b60405180910390f35b6104e760048036038101906104e29190612197565b610bcf565b6040516104f49190612036565b60405180910390f35b6105176004803603810190610512919061228a565b610c12565b60405161052491906121e6565b60405180910390f35b610535610c36565b60405161054291906122c6565b60405180910390f35b610565600480360381019061056091906122e1565b610c5a565b005b610581600480360381019061057c919061241c565b610c7b565b60405161058e91906121e6565b60405180910390f35b61059f610d02565b6040516105ac91906122c6565b60405180910390f35b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610628575061062782610d26565b5b9050919050565b60606005805461063e9061248b565b80601f016020809104026020016040519081016040528092919081815260200182805461066a9061248b565b80156106b75780601f1061068c576101008083540402835291602001916106b7565b820191906000526020600020905b81548152906001019060200180831161069a57829003601f168201915b5050505050905090565b6000806106cc610da0565b90506106d9818585610da8565b600191505092915050565b6000600454905090565b6000806106f9610da0565b9050610706858285610f71565b610711858585610ffd565b60019150509392505050565b6000806000838152602001908152602001600020600101549050919050565b6107458261071d565b61074e81611276565b610758838361128a565b505050565b60006012905090565b61076e610da0565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146107db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d29061252e565b60405180910390fd5b6107e582826112be565b5050565b6000806107f4610da0565b90506108158185856108068589610c7b565b610810919061257d565b610da8565b600191505092915050565b6108517f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61084c610da0565b610a55565b610890576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088790612623565b60405180910390fd5b6108986112f2565b565b6108cb7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66108c6610da0565b610a55565b61090a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610901906126b5565b60405180910390fd5b6109148282611355565b5050565b610929610923610da0565b826114ac565b50565b6000600760009054906101000a900460ff16905090565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61099e82610998610da0565b83610f71565b6109a882826114ac565b5050565b6109dd7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6109d8610da0565b610a55565b610a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1390612747565b60405180910390fd5b610a2461167b565b565b6000610a4d82600160008681526020019081526020016000206116de90919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060068054610ace9061248b565b80601f0160208091040260200160405190810160405280929190818152602001828054610afa9061248b565b8015610b475780601f10610b1c57610100808354040283529160200191610b47565b820191906000526020600020905b815481529060010190602001808311610b2a57829003601f168201915b5050505050905090565b6000801b81565b600080610b63610da0565b90506000610b718286610c7b565b905083811015610bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bad906127d9565b60405180910390fd5b610bc38286868403610da8565b60019250505092915050565b6000610c0083600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600854610da8565b610c0a83836116f8565b905092915050565b6000610c2f6001600084815260200190815260200160002061171b565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610c638261071d565b610c6c81611276565b610c7683836112be565b505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d995750610d9882611730565b5b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0e9061286b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7d906128fd565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610f6491906121e6565b60405180910390a3505050565b6000610f7d8484610c7b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ff75781811015610fe9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe090612969565b60405180910390fd5b610ff68484848403610da8565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361106c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611063906129fb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d290612a8d565b60405180910390fd5b6110e683838361179a565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561116d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116490612b1f565b60405180910390fd5b818103600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161125d91906121e6565b60405180910390a36112708484846117aa565b50505050565b61128781611282610da0565b6117af565b50565b6112948282611834565b6112b9816001600085815260200190815260200160002061191490919063ffffffff16565b505050565b6112c88282611944565b6112ed8160016000858152602001908152602001600020611a2590919063ffffffff16565b505050565b6112fa611a55565b6000600760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61133e610da0565b60405161134b9190612401565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bb90612b8b565b60405180910390fd5b6113d06000838361179a565b80600460008282546113e2919061257d565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161149491906121e6565b60405180910390a36114a8600083836117aa565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361151b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151290612c1d565b60405180910390fd5b6115278260008361179a565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156115ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a590612caf565b60405180910390fd5b818103600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600460008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161166291906121e6565b60405180910390a3611676836000846117aa565b505050565b611683611a9e565b6001600760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586116c7610da0565b6040516116d49190612401565b60405180910390a1565b60006116ed8360000183611ae8565b60001c905092915050565b600080611703610da0565b9050611710818585610ffd565b600191505092915050565b600061172982600001611b13565b9050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6117a5838383611b24565b505050565b505050565b6117b98282610a55565b611830576117c681611b7c565b6117d48360001c6020611ba9565b6040516020016117e5929190612da3565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182791906120e1565b60405180910390fd5b5050565b61183e8282610a55565b61191057600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506118b5610da0565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600061193c836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611de5565b905092915050565b61194e8282610a55565b15611a2157600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506119c6610da0565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000611a4d836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611e55565b905092915050565b611a5d61092c565b611a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9390612e29565b60405180910390fd5b565b611aa661092c565b15611ae6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611add90612e95565b60405180910390fd5b565b6000826000018281548110611b0057611aff612eb5565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b611b2f838383611f69565b611b3761092c565b15611b77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6e90612f56565b60405180910390fd5b505050565b6060611ba28273ffffffffffffffffffffffffffffffffffffffff16601460ff16611ba9565b9050919050565b606060006002836002611bbc9190612f76565b611bc6919061257d565b67ffffffffffffffff811115611bdf57611bde612fb8565b5b6040519080825280601f01601f191660200182016040528015611c115781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611c4957611c48612eb5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611cad57611cac612eb5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611ced9190612f76565b611cf7919061257d565b90505b6001811115611d97577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611d3957611d38612eb5565b5b1a60f81b828281518110611d5057611d4f612eb5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611d9090612fe7565b9050611cfa565b5060008414611ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd29061305c565b60405180910390fd5b8091505092915050565b6000611df18383611f6e565b611e4a578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611e4f565b600090505b92915050565b60008083600101600084815260200190815260200160002054905060008114611f5d576000600182611e87919061307c565b9050600060018660000180549050611e9f919061307c565b9050818114611f0e576000866000018281548110611ec057611ebf612eb5565b5b9060005260206000200154905080876000018481548110611ee457611ee3612eb5565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480611f2257611f216130b0565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050611f63565b60009150505b92915050565b505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611fcb81611f96565b8114611fd657600080fd5b50565b600081359050611fe881611fc2565b92915050565b60006020828403121561200457612003611f91565b5b600061201284828501611fd9565b91505092915050565b60008115159050919050565b6120308161201b565b82525050565b600060208201905061204b6000830184612027565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561208b578082015181840152602081019050612070565b60008484015250505050565b6000601f19601f8301169050919050565b60006120b382612051565b6120bd818561205c565b93506120cd81856020860161206d565b6120d681612097565b840191505092915050565b600060208201905081810360008301526120fb81846120a8565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061212e82612103565b9050919050565b61213e81612123565b811461214957600080fd5b50565b60008135905061215b81612135565b92915050565b6000819050919050565b61217481612161565b811461217f57600080fd5b50565b6000813590506121918161216b565b92915050565b600080604083850312156121ae576121ad611f91565b5b60006121bc8582860161214c565b92505060206121cd85828601612182565b9150509250929050565b6121e081612161565b82525050565b60006020820190506121fb60008301846121d7565b92915050565b60008060006060848603121561221a57612219611f91565b5b60006122288682870161214c565b93505060206122398682870161214c565b925050604061224a86828701612182565b9150509250925092565b6000819050919050565b61226781612254565b811461227257600080fd5b50565b6000813590506122848161225e565b92915050565b6000602082840312156122a05761229f611f91565b5b60006122ae84828501612275565b91505092915050565b6122c081612254565b82525050565b60006020820190506122db60008301846122b7565b92915050565b600080604083850312156122f8576122f7611f91565b5b600061230685828601612275565b92505060206123178582860161214c565b9150509250929050565b600060ff82169050919050565b61233781612321565b82525050565b6000602082019050612352600083018461232e565b92915050565b60006020828403121561236e5761236d611f91565b5b600061237c84828501612182565b91505092915050565b60006020828403121561239b5761239a611f91565b5b60006123a98482850161214c565b91505092915050565b600080604083850312156123c9576123c8611f91565b5b60006123d785828601612275565b92505060206123e885828601612182565b9150509250929050565b6123fb81612123565b82525050565b600060208201905061241660008301846123f2565b92915050565b6000806040838503121561243357612432611f91565b5b60006124418582860161214c565b92505060206124528582860161214c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806124a357607f821691505b6020821081036124b6576124b561245c565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000612518602f8361205c565b9150612523826124bc565b604082019050919050565b600060208201905081810360008301526125478161250b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061258882612161565b915061259383612161565b92508282019050808211156125ab576125aa61254e565b5b92915050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f20756e706175736500000000000000602082015250565b600061260d60398361205c565b9150612618826125b1565b604082019050919050565b6000602082019050818103600083015261263c81612600565b9050919050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f7665206d696e74657220726f6c6520746f206d696e7400000000000000000000602082015250565b600061269f60368361205c565b91506126aa82612643565b604082019050919050565b600060208201905081810360008301526126ce81612692565b9050919050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f207061757365000000000000000000602082015250565b600061273160378361205c565b915061273c826126d5565b604082019050919050565b6000602082019050818103600083015261276081612724565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006127c360258361205c565b91506127ce82612767565b604082019050919050565b600060208201905081810360008301526127f2816127b6565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061285560248361205c565b9150612860826127f9565b604082019050919050565b6000602082019050818103600083015261288481612848565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006128e760228361205c565b91506128f28261288b565b604082019050919050565b60006020820190508181036000830152612916816128da565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612953601d8361205c565b915061295e8261291d565b602082019050919050565b6000602082019050818103600083015261298281612946565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006129e560258361205c565b91506129f082612989565b604082019050919050565b60006020820190508181036000830152612a14816129d8565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612a7760238361205c565b9150612a8282612a1b565b604082019050919050565b60006020820190508181036000830152612aa681612a6a565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000612b0960268361205c565b9150612b1482612aad565b604082019050919050565b60006020820190508181036000830152612b3881612afc565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000612b75601f8361205c565b9150612b8082612b3f565b602082019050919050565b60006020820190508181036000830152612ba481612b68565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000612c0760218361205c565b9150612c1282612bab565b604082019050919050565b60006020820190508181036000830152612c3681612bfa565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000612c9960228361205c565b9150612ca482612c3d565b604082019050919050565b60006020820190508181036000830152612cc881612c8c565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000612d10601783612ccf565b9150612d1b82612cda565b601782019050919050565b6000612d3182612051565b612d3b8185612ccf565b9350612d4b81856020860161206d565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000612d8d601183612ccf565b9150612d9882612d57565b601182019050919050565b6000612dae82612d03565b9150612dba8285612d26565b9150612dc582612d80565b9150612dd18284612d26565b91508190509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000612e1360148361205c565b9150612e1e82612ddd565b602082019050919050565b60006020820190508181036000830152612e4281612e06565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000612e7f60108361205c565b9150612e8a82612e49565b602082019050919050565b60006020820190508181036000830152612eae81612e72565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b6000612f40602a8361205c565b9150612f4b82612ee4565b604082019050919050565b60006020820190508181036000830152612f6f81612f33565b9050919050565b6000612f8182612161565b9150612f8c83612161565b9250828202612f9a81612161565b91508282048414831517612fb157612fb061254e565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000612ff282612161565b9150600082036130055761300461254e565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061304660208361205c565b915061305182613010565b602082019050919050565b6000602082019050818103600083015261307581613039565b9050919050565b600061308782612161565b915061309283612161565b92508282039050818111156130aa576130a961254e565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea264697066735822122048dbc607f899fe32ad35f6b79035fe92c713a380571de42e1ed7404d0a2da28464736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/contracts/ERC20MaliciousDelayed.sol b/x/erc20/keeper/testdata/ERC20MaliciousDelayed.sol similarity index 91% rename from contracts/ERC20MaliciousDelayed.sol rename to x/erc20/keeper/testdata/ERC20MaliciousDelayed.sol index 1f82530670..68aff66519 100644 --- a/contracts/ERC20MaliciousDelayed.sol +++ b/x/erc20/keeper/testdata/ERC20MaliciousDelayed.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.0; -import "./@openzeppelin/contracts/token/ERC20/presets/ERC20PresetMinterPauser.sol"; +import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetMinterPauser.sol"; // This is an evil token. Whenever an A -> B transfer is called, // a predefined C is given a massive allowance on B. diff --git a/x/erc20/keeper/testdata/erc20DirectBalanceManipulation.go b/x/erc20/keeper/testdata/erc20DirectBalanceManipulation.go new file mode 100644 index 0000000000..89e4196c6d --- /dev/null +++ b/x/erc20/keeper/testdata/erc20DirectBalanceManipulation.go @@ -0,0 +1,18 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package testdata + +import ( + contractutils "github.com/evmos/evmos/v18/contracts/utils" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" +) + +// LoadBalanceManipulationContract loads the ERC20DirectBalanceManipulation contract +// from the compiled JSON data. +// +// This is an evil token. Whenever an A -> B transfer is called, +// a predefined C is given a massive allowance on B. +func LoadBalanceManipulationContract() (evmtypes.CompiledContract, error) { + return contractutils.LoadContractFromJSONFile("ERC20DirectBalanceManipulation.json") +} diff --git a/x/erc20/keeper/testdata/erc20maliciousdelayed.go b/x/erc20/keeper/testdata/erc20maliciousdelayed.go new file mode 100644 index 0000000000..dc5940a35e --- /dev/null +++ b/x/erc20/keeper/testdata/erc20maliciousdelayed.go @@ -0,0 +1,17 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package testdata + +import ( + contractutils "github.com/evmos/evmos/v18/contracts/utils" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" +) + +// LoadMaliciousDelayedContract loads the ERC20MaliciousDelayed contract. +// +// This is an evil token. Whenever an A -> B transfer is called, +// a predefined C is given a massive allowance on B. +func LoadMaliciousDelayedContract() (evmtypes.CompiledContract, error) { + return contractutils.LoadContractFromJSONFile("ERC20MaliciousDelayed.json") +} diff --git a/x/erc20/keeper/utils_test.go b/x/erc20/keeper/utils_test.go index 2d7af39344..17ef1cae46 100644 --- a/x/erc20/keeper/utils_test.go +++ b/x/erc20/keeper/utils_test.go @@ -30,6 +30,7 @@ import ( utiltx "github.com/evmos/evmos/v18/testutil/tx" teststypes "github.com/evmos/evmos/v18/types/tests" "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v18/x/erc20/keeper/testdata" "github.com/evmos/evmos/v18/x/erc20/types" "github.com/evmos/evmos/v18/x/evm/statedb" evm "github.com/evmos/evmos/v18/x/evm/types" @@ -323,12 +324,16 @@ func (suite *KeeperTestSuite) DeployContract(name, symbol string, decimals uint8 func (suite *KeeperTestSuite) DeployContractMaliciousDelayed() (common.Address, error) { suite.Commit() + + maliciousDelayedContract, err := testdata.LoadMaliciousDelayedContract() + suite.Require().NoError(err, "failed to load malicious delayed contract") + addr, err := testutil.DeployContract( suite.ctx, suite.app, suite.priv, suite.queryClientEvm, - contracts.ERC20MaliciousDelayedContract, + maliciousDelayedContract, big.NewInt(1000000000000000000), ) suite.Commit() @@ -337,12 +342,16 @@ func (suite *KeeperTestSuite) DeployContractMaliciousDelayed() (common.Address, func (suite *KeeperTestSuite) DeployContractDirectBalanceManipulation() (common.Address, error) { suite.Commit() + + balanceManipulationContract, err := testdata.LoadBalanceManipulationContract() + suite.Require().NoError(err, "failed to load balance manipulation contract") + addr, err := testutil.DeployContract( suite.ctx, suite.app, suite.priv, suite.queryClientEvm, - contracts.ERC20DirectBalanceManipulationContract, + balanceManipulationContract, big.NewInt(1000000000000000000), ) suite.Commit() diff --git a/x/evm/keeper/benchmark_test.go b/x/evm/keeper/benchmark_test.go index 402422c2b0..2cd118a7a9 100644 --- a/x/evm/keeper/benchmark_test.go +++ b/x/evm/keeper/benchmark_test.go @@ -4,6 +4,8 @@ import ( "math/big" "testing" + "github.com/evmos/evmos/v18/x/evm/keeper/testdata" + sdkmath "cosmossdk.io/math" "github.com/stretchr/testify/require" @@ -78,8 +80,11 @@ func DoBenchmark(b *testing.B, txBuilder TxBuilder) { } func BenchmarkTokenTransfer(b *testing.B) { + erc20Contract, err := testdata.LoadERC20Contract() + require.NoError(b, err, "failed to load erc20 contract") + DoBenchmark(b, func(suite *KeeperTestSuite, contract common.Address) *types.MsgEthereumTx { - input, err := types.ERC20Contract.ABI.Pack("transfer", common.HexToAddress("0x378c50D9264C63F3F92B806d4ee56E9D86FfB3Ec"), big.NewInt(1000)) + input, err := erc20Contract.ABI.Pack("transfer", common.HexToAddress("0x378c50D9264C63F3F92B806d4ee56E9D86FfB3Ec"), big.NewInt(1000)) require.NoError(b, err) nonce := suite.app.EvmKeeper.GetNonce(suite.ctx, suite.address) ethTxParams := &types.EvmTxArgs{ @@ -96,8 +101,11 @@ func BenchmarkTokenTransfer(b *testing.B) { } func BenchmarkEmitLogs(b *testing.B) { + erc20Contract, err := testdata.LoadERC20Contract() + require.NoError(b, err, "failed to load erc20 contract") + DoBenchmark(b, func(suite *KeeperTestSuite, contract common.Address) *types.MsgEthereumTx { - input, err := types.ERC20Contract.ABI.Pack("benchmarkLogs", big.NewInt(1000)) + input, err := erc20Contract.ABI.Pack("benchmarkLogs", big.NewInt(1000)) require.NoError(b, err) nonce := suite.app.EvmKeeper.GetNonce(suite.ctx, suite.address) ethTxParams := &types.EvmTxArgs{ @@ -114,8 +122,11 @@ func BenchmarkEmitLogs(b *testing.B) { } func BenchmarkTokenTransferFrom(b *testing.B) { + erc20Contract, err := testdata.LoadERC20Contract() + require.NoError(b, err) + DoBenchmark(b, func(suite *KeeperTestSuite, contract common.Address) *types.MsgEthereumTx { - input, err := types.ERC20Contract.ABI.Pack("transferFrom", suite.address, common.HexToAddress("0x378c50D9264C63F3F92B806d4ee56E9D86FfB3Ec"), big.NewInt(0)) + input, err := erc20Contract.ABI.Pack("transferFrom", suite.address, common.HexToAddress("0x378c50D9264C63F3F92B806d4ee56E9D86FfB3Ec"), big.NewInt(0)) require.NoError(b, err) nonce := suite.app.EvmKeeper.GetNonce(suite.ctx, suite.address) ethTxParams := &types.EvmTxArgs{ @@ -132,8 +143,11 @@ func BenchmarkTokenTransferFrom(b *testing.B) { } func BenchmarkTokenMint(b *testing.B) { + erc20Contract, err := testdata.LoadERC20Contract() + require.NoError(b, err, "failed to load erc20 contract") + DoBenchmark(b, func(suite *KeeperTestSuite, contract common.Address) *types.MsgEthereumTx { - input, err := types.ERC20Contract.ABI.Pack("mint", common.HexToAddress("0x378c50D9264C63F3F92B806d4ee56E9D86FfB3Ec"), big.NewInt(1000)) + input, err := erc20Contract.ABI.Pack("mint", common.HexToAddress("0x378c50D9264C63F3F92B806d4ee56E9D86FfB3Ec"), big.NewInt(1000)) require.NoError(b, err) nonce := suite.app.EvmKeeper.GetNonce(suite.ctx, suite.address) ethTxParams := &types.EvmTxArgs{ @@ -152,7 +166,10 @@ func BenchmarkTokenMint(b *testing.B) { func BenchmarkMessageCall(b *testing.B) { suite, contract := SetupTestMessageCall(b) - input, err := types.TestMessageCall.ABI.Pack("benchmarkMessageCall", big.NewInt(10000)) + messageCallContract, err := testdata.LoadMessageCallContract() + require.NoError(b, err, "failed to load message call contract") + + input, err := messageCallContract.ABI.Pack("benchmarkMessageCall", big.NewInt(10000)) require.NoError(b, err) nonce := suite.app.EvmKeeper.GetNonce(suite.ctx, suite.address) ethTxParams := &types.EvmTxArgs{ diff --git a/x/evm/keeper/grpc_query_test.go b/x/evm/keeper/grpc_query_test.go index a7eb028960..051c869804 100644 --- a/x/evm/keeper/grpc_query_test.go +++ b/x/evm/keeper/grpc_query_test.go @@ -5,6 +5,8 @@ import ( "fmt" "math/big" + "github.com/evmos/evmos/v18/x/evm/keeper/testdata" + sdkmath "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" @@ -498,6 +500,9 @@ func (suite *KeeperTestSuite) TestEstimateGas() { higherGas := hexutil.Uint64(25000) hexBigInt := hexutil.Big(*big.NewInt(1)) + erc20Contract, err := testdata.LoadERC20Contract() + suite.Require().NoError(err, "failed to load erc20 contract") + var ( args interface{} gasCap uint64 @@ -571,10 +576,10 @@ func (suite *KeeperTestSuite) TestEstimateGas() { { "contract deployment", func() { - ctorArgs, err := types.ERC20Contract.ABI.Pack("", &suite.address, sdkmath.NewIntWithDecimal(1000, 18).BigInt()) + ctorArgs, err := erc20Contract.ABI.Pack("", &suite.address, sdkmath.NewIntWithDecimal(1000, 18).BigInt()) suite.Require().NoError(err) - data := types.ERC20Contract.Bin + data := erc20Contract.Bin data = append(data, ctorArgs...) args = types.TransactionArgs{ From: &suite.address, @@ -591,7 +596,7 @@ func (suite *KeeperTestSuite) TestEstimateGas() { func() { contractAddr := suite.DeployTestContract(suite.T(), suite.address, sdkmath.NewIntWithDecimal(1000, 18).BigInt()) suite.Commit() - transferData, err := types.ERC20Contract.ABI.Pack("transfer", common.HexToAddress("0x378c50D9264C63F3F92B806d4ee56E9D86FfB3Ec"), big.NewInt(1000)) + transferData, err := erc20Contract.ABI.Pack("transfer", common.HexToAddress("0x378c50D9264C63F3F92B806d4ee56E9D86FfB3Ec"), big.NewInt(1000)) suite.Require().NoError(err) args = types.TransactionArgs{To: &contractAddr, From: &suite.address, Data: (*hexutil.Bytes)(&transferData)} }, @@ -649,9 +654,9 @@ func (suite *KeeperTestSuite) TestEstimateGas() { { "contract deployment w/ enableFeemarket", func() { - ctorArgs, err := types.ERC20Contract.ABI.Pack("", &suite.address, sdkmath.NewIntWithDecimal(1000, 18).BigInt()) + ctorArgs, err := erc20Contract.ABI.Pack("", &suite.address, sdkmath.NewIntWithDecimal(1000, 18).BigInt()) suite.Require().NoError(err) - data := types.ERC20Contract.Bin + data := erc20Contract.Bin data = append(data, ctorArgs...) args = types.TransactionArgs{ From: &suite.address, @@ -667,7 +672,7 @@ func (suite *KeeperTestSuite) TestEstimateGas() { func() { contractAddr := suite.DeployTestContract(suite.T(), suite.address, sdkmath.NewIntWithDecimal(1000, 18).BigInt()) suite.Commit() - transferData, err := types.ERC20Contract.ABI.Pack("transfer", common.HexToAddress("0x378c50D9264C63F3F92B806d4ee56E9D86FfB3Ec"), big.NewInt(1000)) + transferData, err := erc20Contract.ABI.Pack("transfer", common.HexToAddress("0x378c50D9264C63F3F92B806d4ee56E9D86FfB3Ec"), big.NewInt(1000)) suite.Require().NoError(err) args = types.TransactionArgs{To: &contractAddr, From: &suite.address, Data: (*hexutil.Bytes)(&transferData)} }, @@ -678,9 +683,9 @@ func (suite *KeeperTestSuite) TestEstimateGas() { { "contract creation but 'create' param disabled", func() { - ctorArgs, err := types.ERC20Contract.ABI.Pack("", &suite.address, sdkmath.NewIntWithDecimal(1000, 18).BigInt()) + ctorArgs, err := erc20Contract.ABI.Pack("", &suite.address, sdkmath.NewIntWithDecimal(1000, 18).BigInt()) suite.Require().NoError(err) - data := types.ERC20Contract.Bin + data := erc20Contract.Bin data = append(data, ctorArgs...) args = types.TransactionArgs{ From: &suite.address, @@ -770,6 +775,10 @@ func (suite *KeeperTestSuite) TestTraceTx() { predecessors []*types.MsgEthereumTx chainID *sdkmath.Int ) + + erc20Contract, err := testdata.LoadERC20Contract() + suite.Require().NoError(err, "failed to load erc20 contract") + testCases := []struct { msg string malleate func() @@ -918,7 +927,7 @@ func (suite *KeeperTestSuite) TestTraceTx() { chainID := suite.app.EvmKeeper.ChainID() nonce := suite.app.EvmKeeper.GetNonce(suite.ctx, suite.address) - data := types.ERC20Contract.Bin + data := erc20Contract.Bin ethTxParams := &types.EvmTxArgs{ ChainID: chainID, Nonce: nonce, @@ -977,7 +986,7 @@ func (suite *KeeperTestSuite) TestTraceTx() { if tc.expPass { suite.Require().NoError(err) - // if data is to big, slice the result + // if data is too big, slice the result if len(res.Data) > 150 { suite.Require().Equal(tc.traceResponse, string(res.Data[:150])) } else { @@ -1166,7 +1175,7 @@ func (suite *KeeperTestSuite) TestTraceBlock() { if tc.expPass { suite.Require().NoError(err) - // if data is to big, slice the result + // if data is too big, slice the result if len(res.Data) > 150 { suite.Require().Equal(tc.traceResponse, string(res.Data[:150])) } else { @@ -1189,14 +1198,17 @@ func (suite *KeeperTestSuite) TestNonceInQuery() { suite.Require().Equal(uint64(0), suite.app.EvmKeeper.GetNonce(suite.ctx, address)) supply := sdkmath.NewIntWithDecimal(1000, 18).BigInt() - // accupy nonce 0 + // occupy nonce 0 _ = suite.DeployTestContract(suite.T(), address, supply) + erc20Contract, err := testdata.LoadERC20Contract() + suite.Require().NoError(err, "failed to load erc20 contract") + // do an EthCall/EstimateGas with nonce 0 - ctorArgs, err := types.ERC20Contract.ABI.Pack("", address, supply) + ctorArgs, err := erc20Contract.ABI.Pack("", address, supply) suite.Require().NoError(err) - data := types.ERC20Contract.Bin + data := erc20Contract.Bin data = append(data, ctorArgs...) args, err := json.Marshal(&types.TransactionArgs{ From: &address, @@ -1252,7 +1264,7 @@ func (suite *KeeperTestSuite) TestQueryBaseFee() { true, true, true, }, { - "pass - nil Base Fee when london hardfork not activated", + "pass - nil Base Fee when london hard-fork not activated", func() { baseFee := sdkmath.OneInt().BigInt() suite.app.FeeMarketKeeper.SetBaseFee(suite.ctx, baseFee) @@ -1300,10 +1312,14 @@ func (suite *KeeperTestSuite) TestEthCall() { supply := sdkmath.NewIntWithDecimal(1000, 18).BigInt() hexBigInt := hexutil.Big(*big.NewInt(1)) - ctorArgs, err := types.ERC20Contract.ABI.Pack("", address, supply) + + erc20Contract, err := testdata.LoadERC20Contract() + suite.Require().NoError(err, "failed to load erc20 contract") + + ctorArgs, err := erc20Contract.ABI.Pack("", address, supply) suite.Require().NoError(err) - data := types.ERC20Contract.Bin + data := erc20Contract.Bin data = append(data, ctorArgs...) testCases := []struct { diff --git a/x/evm/keeper/keeper_test.go b/x/evm/keeper/keeper_test.go index 4742ca82c2..50058aa2e3 100644 --- a/x/evm/keeper/keeper_test.go +++ b/x/evm/keeper/keeper_test.go @@ -1,7 +1,6 @@ package keeper_test import ( - _ "embed" "math/big" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" diff --git a/x/evm/types/ERC20Contract.json b/x/evm/keeper/testdata/ERC20Contract.json similarity index 100% rename from x/evm/types/ERC20Contract.json rename to x/evm/keeper/testdata/ERC20Contract.json diff --git a/x/evm/types/TestMessageCall.json b/x/evm/keeper/testdata/TestMessageCall.json similarity index 100% rename from x/evm/types/TestMessageCall.json rename to x/evm/keeper/testdata/TestMessageCall.json diff --git a/x/evm/keeper/testdata/contracts.go b/x/evm/keeper/testdata/contracts.go new file mode 100644 index 0000000000..6043a3ccee --- /dev/null +++ b/x/evm/keeper/testdata/contracts.go @@ -0,0 +1,17 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package testdata + +import ( + contractutils "github.com/evmos/evmos/v18/contracts/utils" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" +) + +func LoadERC20Contract() (evmtypes.CompiledContract, error) { + return contractutils.LegacyLoadContractFromJSONFile("ERC20Contract.json") +} + +func LoadMessageCallContract() (evmtypes.CompiledContract, error) { + return contractutils.LegacyLoadContractFromJSONFile("MessageCallContract.json") +} diff --git a/x/evm/keeper/utils_test.go b/x/evm/keeper/utils_test.go index 897f61d8be..a8ae7949aa 100644 --- a/x/evm/keeper/utils_test.go +++ b/x/evm/keeper/utils_test.go @@ -5,6 +5,8 @@ import ( "math/big" "time" + "github.com/evmos/evmos/v18/x/evm/keeper/testdata" + "github.com/cosmos/cosmos-sdk/baseapp" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" @@ -44,12 +46,15 @@ func (suite *KeeperTestSuite) DeployTestContract(t require.TestingT, owner commo ctx := sdk.WrapSDKContext(suite.ctx) chainID := suite.app.EvmKeeper.ChainID() - ctorArgs, err := evmtypes.ERC20Contract.ABI.Pack("", owner, supply) + erc20Contract, err := testdata.LoadERC20Contract() + require.NoError(t, err, "failed to load contract") + + ctorArgs, err := erc20Contract.ABI.Pack("", owner, supply) require.NoError(t, err) nonce := suite.app.EvmKeeper.GetNonce(suite.ctx, suite.address) - data := evmtypes.ERC20Contract.Bin + data := erc20Contract.Bin data = append(data, ctorArgs...) args, err := json.Marshal(&evmtypes.TransactionArgs{ From: &suite.address, @@ -98,7 +103,10 @@ func (suite *KeeperTestSuite) TransferERC20Token(t require.TestingT, contractAdd ctx := sdk.WrapSDKContext(suite.ctx) chainID := suite.app.EvmKeeper.ChainID() - transferData, err := evmtypes.ERC20Contract.ABI.Pack("transfer", to, amount) + erc20Contract, err := testdata.LoadERC20Contract() + require.NoError(t, err, "failed to load contract") + + transferData, err := erc20Contract.ABI.Pack("transfer", to, amount) require.NoError(t, err) args, err := json.Marshal(&evmtypes.TransactionArgs{To: &contractAddr, From: &from, Data: (*hexutil.Bytes)(&transferData)}) require.NoError(t, err) @@ -149,7 +157,10 @@ func (suite *KeeperTestSuite) DeployTestMessageCall(t require.TestingT) common.A ctx := sdk.WrapSDKContext(suite.ctx) chainID := suite.app.EvmKeeper.ChainID() - data := evmtypes.TestMessageCall.Bin + testMessageCallContract, err := testdata.LoadMessageCallContract() + require.NoError(t, err, "failed to load contract") + + data := testMessageCallContract.Bin args, err := json.Marshal(&evmtypes.TransactionArgs{ From: &suite.address, Data: (*hexutil.Bytes)(&data), diff --git a/x/evm/statedb/integration_test.go b/x/evm/statedb/integration_test.go index 79311e5c9f..f2dce513de 100644 --- a/x/evm/statedb/integration_test.go +++ b/x/evm/statedb/integration_test.go @@ -15,6 +15,7 @@ import ( "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" testnetwork "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + "github.com/evmos/evmos/v18/x/evm/statedb/testdata" evmtypes "github.com/evmos/evmos/v18/x/evm/types" //nolint:revive // okay to use dot imports for Ginkgo @@ -46,8 +47,9 @@ var _ = Describe("testing the flash loan exploit", Ordered, func() { deployer testkeyring.Key - erc20Addr common.Address - flashLoanAddr common.Address + erc20Addr common.Address + flashLoanAddr common.Address + flashLoanContract evmtypes.CompiledContract validatorToDelegateTo string @@ -80,6 +82,10 @@ var _ = Describe("testing the flash loan exploit", Ordered, func() { res, err := handler.GetDelegation(deployer.AccAddr.String(), validatorToDelegateTo) Expect(err).ToNot(HaveOccurred(), "failed to get delegation") delegatedAmountPre = res.DelegationResponse.Balance.Amount + + // Load the flash loan contract from the compiled JSON data + flashLoanContract, err = testdata.LoadFlashLoanContract() + Expect(err).ToNot(HaveOccurred(), "failed to load flash loan contract") }) It("should deploy an ERC-20 token contract", func() { @@ -144,7 +150,7 @@ var _ = Describe("testing the flash loan exploit", Ordered, func() { deployer.Priv, evmtypes.EvmTxArgs{}, testfactory.ContractDeploymentData{ - Contract: contracts.FlashLoanContract, + Contract: flashLoanContract, }, ) Expect(err).ToNot(HaveOccurred(), "failed to deploy flash loan contract") @@ -236,7 +242,7 @@ var _ = Describe("testing the flash loan exploit", Ordered, func() { deployer.Priv, evmtypes.EvmTxArgs{To: &flashLoanAddr}, testfactory.CallArgs{ - ContractABI: contracts.FlashLoanContract.ABI, + ContractABI: flashLoanContract.ABI, MethodName: "flashLoan", Args: []interface{}{ erc20Addr, diff --git a/x/evm/statedb/testdata/FlashLoan.json b/x/evm/statedb/testdata/FlashLoan.json new file mode 100644 index 0000000000..74a8e275d9 --- /dev/null +++ b/x/evm/statedb/testdata/FlashLoan.json @@ -0,0 +1,58 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "FlashLoan", + "sourceName": "solidity/x/evm/statedb/testdata/FlashLoan.sol", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_token", + "type": "address" + }, + { + "internalType": "string", + "name": "_validator", + "type": "string" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "flashLoan", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610eea806100606000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80638da5cb5b1461003b578063ee52ad7114610059575b600080fd5b610043610089565b60405161005091906106dd565b60405180910390f35b610073600480360381019061006e91906108b4565b6100ad565b604051610080919061093e565b60405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461013e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610135906109dc565b60405180910390fd5b6000849050828173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b815260040161017f9291906109fc565b602060405180830381865afa15801561019c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101c09190610a3a565b1015610201576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f890610ab3565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161023c91906106dd565b602060405180830381865afa158015610259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027d9190610a3a565b905060008273ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b81526004016102be93929190610ae2565b6020604051808303816000875af11580156102dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103019190610b45565b905080610343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033a90610be4565b60405180910390fd5b848261034f9190610c33565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161038891906106dd565b602060405180830381865afa1580156103a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c99190610a3a565b14610409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040090610cb3565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3388886040518463ffffffff1660e01b815260040161044893929190610d41565b6020604051808303816000875af1158015610467573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048b9190610b45565b9050806104cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104c490610dcb565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161050691906106dd565b602060405180830381865afa158015610523573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105479190610a3a565b91508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33876040518363ffffffff1660e01b8152600401610584929190610deb565b6020604051808303816000875af11580156105a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c79190610b45565b5084826105d49190610e14565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161060d91906106dd565b602060405180830381865afa15801561062a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064e9190610a3a565b1461068e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068590610e94565b60405180910390fd5b600193505050509392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106c78261069c565b9050919050565b6106d7816106bc565b82525050565b60006020820190506106f260008301846106ce565b92915050565b6000604051905090565b600080fd5b600080fd5b610715816106bc565b811461072057600080fd5b50565b6000813590506107328161070c565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61078b82610742565b810181811067ffffffffffffffff821117156107aa576107a9610753565b5b80604052505050565b60006107bd6106f8565b90506107c98282610782565b919050565b600067ffffffffffffffff8211156107e9576107e8610753565b5b6107f282610742565b9050602081019050919050565b82818337600083830152505050565b600061082161081c846107ce565b6107b3565b90508281526020810184848401111561083d5761083c61073d565b5b6108488482856107ff565b509392505050565b600082601f83011261086557610864610738565b5b813561087584826020860161080e565b91505092915050565b6000819050919050565b6108918161087e565b811461089c57600080fd5b50565b6000813590506108ae81610888565b92915050565b6000806000606084860312156108cd576108cc610702565b5b60006108db86828701610723565b935050602084013567ffffffffffffffff8111156108fc576108fb610707565b5b61090886828701610850565b92505060406109198682870161089f565b9150509250925092565b60008115159050919050565b61093881610923565b82525050565b6000602082019050610953600083018461092f565b92915050565b600082825260208201905092915050565b7f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b60006109c6602183610959565b91506109d18261096a565b604082019050919050565b600060208201905081810360008301526109f5816109b9565b9050919050565b6000604082019050610a1160008301856106ce565b610a1e60208301846106ce565b9392505050565b600081519050610a3481610888565b92915050565b600060208284031215610a5057610a4f610702565b5b6000610a5e84828501610a25565b91505092915050565b7f496e73756666696369656e7420616c6c6f77616e636500000000000000000000600082015250565b6000610a9d601683610959565b9150610aa882610a67565b602082019050919050565b60006020820190508181036000830152610acc81610a90565b9050919050565b610adc8161087e565b82525050565b6000606082019050610af760008301866106ce565b610b0460208301856106ce565b610b116040830184610ad3565b949350505050565b610b2281610923565b8114610b2d57600080fd5b50565b600081519050610b3f81610b19565b92915050565b600060208284031215610b5b57610b5a610702565b5b6000610b6984828501610b30565b91505092915050565b7f4661696c656420746f207472616e7366657220746f6b656e7320666f7220666c60008201527f617368206c6f616e000000000000000000000000000000000000000000000000602082015250565b6000610bce602883610959565b9150610bd982610b72565b604082019050919050565b60006020820190508181036000830152610bfd81610bc1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610c3e8261087e565b9150610c498361087e565b9250828201905080821115610c6157610c60610c04565b5b92915050565b7f466c617368206c6f616e206661696c6564000000000000000000000000000000600082015250565b6000610c9d601183610959565b9150610ca882610c67565b602082019050919050565b60006020820190508181036000830152610ccc81610c90565b9050919050565b600081519050919050565b60005b83811015610cfc578082015181840152602081019050610ce1565b60008484015250505050565b6000610d1382610cd3565b610d1d8185610959565b9350610d2d818560208601610cde565b610d3681610742565b840191505092915050565b6000606082019050610d5660008301866106ce565b8181036020830152610d688185610d08565b9050610d776040830184610ad3565b949350505050565b7f6661696c656420746f2064656c65676174650000000000000000000000000000600082015250565b6000610db5601283610959565b9150610dc082610d7f565b602082019050919050565b60006020820190508181036000830152610de481610da8565b9050919050565b6000604082019050610e0060008301856106ce565b610e0d6020830184610ad3565b9392505050565b6000610e1f8261087e565b9150610e2a8361087e565b9250828203905081811115610e4257610e41610c04565b5b92915050565b7f466c617368206c6f616e2072657061796d656e74206661696c65640000000000600082015250565b6000610e7e601b83610959565b9150610e8982610e48565b602082019050919050565b60006020820190508181036000830152610ead81610e71565b905091905056fea2646970667358221220380a26745b780a2cbfbf5500215cef409c0954dff89462eb5ad27cea8bd373e164736f6c63430008130033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c80638da5cb5b1461003b578063ee52ad7114610059575b600080fd5b610043610089565b60405161005091906106dd565b60405180910390f35b610073600480360381019061006e91906108b4565b6100ad565b604051610080919061093e565b60405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461013e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610135906109dc565b60405180910390fd5b6000849050828173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b815260040161017f9291906109fc565b602060405180830381865afa15801561019c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101c09190610a3a565b1015610201576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f890610ab3565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161023c91906106dd565b602060405180830381865afa158015610259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027d9190610a3a565b905060008273ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b81526004016102be93929190610ae2565b6020604051808303816000875af11580156102dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103019190610b45565b905080610343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033a90610be4565b60405180910390fd5b848261034f9190610c33565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161038891906106dd565b602060405180830381865afa1580156103a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c99190610a3a565b14610409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040090610cb3565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3388886040518463ffffffff1660e01b815260040161044893929190610d41565b6020604051808303816000875af1158015610467573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048b9190610b45565b9050806104cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104c490610dcb565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161050691906106dd565b602060405180830381865afa158015610523573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105479190610a3a565b91508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33876040518363ffffffff1660e01b8152600401610584929190610deb565b6020604051808303816000875af11580156105a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c79190610b45565b5084826105d49190610e14565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161060d91906106dd565b602060405180830381865afa15801561062a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064e9190610a3a565b1461068e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068590610e94565b60405180910390fd5b600193505050509392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106c78261069c565b9050919050565b6106d7816106bc565b82525050565b60006020820190506106f260008301846106ce565b92915050565b6000604051905090565b600080fd5b600080fd5b610715816106bc565b811461072057600080fd5b50565b6000813590506107328161070c565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61078b82610742565b810181811067ffffffffffffffff821117156107aa576107a9610753565b5b80604052505050565b60006107bd6106f8565b90506107c98282610782565b919050565b600067ffffffffffffffff8211156107e9576107e8610753565b5b6107f282610742565b9050602081019050919050565b82818337600083830152505050565b600061082161081c846107ce565b6107b3565b90508281526020810184848401111561083d5761083c61073d565b5b6108488482856107ff565b509392505050565b600082601f83011261086557610864610738565b5b813561087584826020860161080e565b91505092915050565b6000819050919050565b6108918161087e565b811461089c57600080fd5b50565b6000813590506108ae81610888565b92915050565b6000806000606084860312156108cd576108cc610702565b5b60006108db86828701610723565b935050602084013567ffffffffffffffff8111156108fc576108fb610707565b5b61090886828701610850565b92505060406109198682870161089f565b9150509250925092565b60008115159050919050565b61093881610923565b82525050565b6000602082019050610953600083018461092f565b92915050565b600082825260208201905092915050565b7f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b60006109c6602183610959565b91506109d18261096a565b604082019050919050565b600060208201905081810360008301526109f5816109b9565b9050919050565b6000604082019050610a1160008301856106ce565b610a1e60208301846106ce565b9392505050565b600081519050610a3481610888565b92915050565b600060208284031215610a5057610a4f610702565b5b6000610a5e84828501610a25565b91505092915050565b7f496e73756666696369656e7420616c6c6f77616e636500000000000000000000600082015250565b6000610a9d601683610959565b9150610aa882610a67565b602082019050919050565b60006020820190508181036000830152610acc81610a90565b9050919050565b610adc8161087e565b82525050565b6000606082019050610af760008301866106ce565b610b0460208301856106ce565b610b116040830184610ad3565b949350505050565b610b2281610923565b8114610b2d57600080fd5b50565b600081519050610b3f81610b19565b92915050565b600060208284031215610b5b57610b5a610702565b5b6000610b6984828501610b30565b91505092915050565b7f4661696c656420746f207472616e7366657220746f6b656e7320666f7220666c60008201527f617368206c6f616e000000000000000000000000000000000000000000000000602082015250565b6000610bce602883610959565b9150610bd982610b72565b604082019050919050565b60006020820190508181036000830152610bfd81610bc1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610c3e8261087e565b9150610c498361087e565b9250828201905080821115610c6157610c60610c04565b5b92915050565b7f466c617368206c6f616e206661696c6564000000000000000000000000000000600082015250565b6000610c9d601183610959565b9150610ca882610c67565b602082019050919050565b60006020820190508181036000830152610ccc81610c90565b9050919050565b600081519050919050565b60005b83811015610cfc578082015181840152602081019050610ce1565b60008484015250505050565b6000610d1382610cd3565b610d1d8185610959565b9350610d2d818560208601610cde565b610d3681610742565b840191505092915050565b6000606082019050610d5660008301866106ce565b8181036020830152610d688185610d08565b9050610d776040830184610ad3565b949350505050565b7f6661696c656420746f2064656c65676174650000000000000000000000000000600082015250565b6000610db5601283610959565b9150610dc082610d7f565b602082019050919050565b60006020820190508181036000830152610de481610da8565b9050919050565b6000604082019050610e0060008301856106ce565b610e0d6020830184610ad3565b9392505050565b6000610e1f8261087e565b9150610e2a8361087e565b9250828203905081811115610e4257610e41610c04565b5b92915050565b7f466c617368206c6f616e2072657061796d656e74206661696c65640000000000600082015250565b6000610e7e601b83610959565b9150610e8982610e48565b602082019050919050565b60006020820190508181036000830152610ead81610e71565b905091905056fea2646970667358221220380a26745b780a2cbfbf5500215cef409c0954dff89462eb5ad27cea8bd373e164736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/contracts/FlashLoan.sol b/x/evm/statedb/testdata/FlashLoan.sol similarity index 92% rename from contracts/FlashLoan.sol rename to x/evm/statedb/testdata/FlashLoan.sol index 60061c91bf..72a90681eb 100644 --- a/contracts/FlashLoan.sol +++ b/x/evm/statedb/testdata/FlashLoan.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; -import "../precompiles/staking/StakingI.sol" as staking; -import "./@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "../../../../precompiles/staking/StakingI.sol" as staking; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; contract FlashLoan { address public owner; diff --git a/x/evm/statedb/testdata/flash_loan.go b/x/evm/statedb/testdata/flash_loan.go new file mode 100644 index 0000000000..577c5b005d --- /dev/null +++ b/x/evm/statedb/testdata/flash_loan.go @@ -0,0 +1,13 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package testdata + +import ( + contractutils "github.com/evmos/evmos/v18/contracts/utils" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" +) + +func LoadFlashLoanContract() (evmtypes.CompiledContract, error) { + return contractutils.LoadContractFromJSONFile("FlashLoan.json") +} diff --git a/x/evm/types/SimpleStorageContract.json b/x/evm/types/SimpleStorageContract.json deleted file mode 100644 index 4d8bb0afe8..0000000000 --- a/x/evm/types/SimpleStorageContract.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "abi": "[\n\t{\n\t\t\"inputs\": [],\n\t\t\"name\": \"get\",\n\t\t\"outputs\": [\n\t\t\t{\n\t\t\t\t\"internalType\": \"uint160\",\n\t\t\t\t\"name\": \"\",\n\t\t\t\t\"type\": \"uint160\"\n\t\t\t}\n\t\t],\n\t\t\"stateMutability\": \"view\",\n\t\t\"type\": \"function\"\n\t},\n\t{\n\t\t\"inputs\": [\n\t\t\t{\n\t\t\t\t\"internalType\": \"uint160\",\n\t\t\t\t\"name\": \"input\",\n\t\t\t\t\"type\": \"uint160\"\n\t\t\t}\n\t\t],\n\t\t\"name\": \"store\",\n\t\t\"outputs\": [],\n\t\t\"stateMutability\": \"nonpayable\",\n\t\t\"type\": \"function\"\n\t}\n]", - "bin": "608060405234801561001057600080fd5b506101bf806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80636d4ce63c1461003b578063d04ad49514610059575b600080fd5b610043610075565b6040516100509190610132565b60405180910390f35b610073600480360381019061006e91906100f6565b61009e565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000813590506100f081610172565b92915050565b60006020828403121561010c5761010b61016d565b5b600061011a848285016100e1565b91505092915050565b61012c8161014d565b82525050565b60006020820190506101476000830184610123565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600080fd5b61017b8161014d565b811461018657600080fd5b5056fea26469706673582212204c98c8f28598d29acc328cb34578de54cbed70b20bf9364897d48b2381f0c78b64736f6c63430008070033" -} diff --git a/x/evm/types/compiled_contract.go b/x/evm/types/compiled_contract.go index cfbc7596d3..e36c1a74a1 100644 --- a/x/evm/types/compiled_contract.go +++ b/x/evm/types/compiled_contract.go @@ -1,13 +1,13 @@ // Copyright Tharsis Labs Ltd.(Evmos) // SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + package types import ( - // embed compiled smart contract - _ "embed" "encoding/hex" "encoding/json" "fmt" + "strings" "github.com/ethereum/go-ethereum/accounts/abi" ) @@ -69,51 +69,25 @@ func (s *CompiledContract) UnmarshalJSON(data []byte) error { return nil } -var ( - //go:embed ERC20Contract.json - erc20JSON []byte - - // ERC20Contract is the compiled test erc20 contract - ERC20Contract CompiledContract - - //go:embed SimpleStorageContract.json - simpleStorageJSON []byte - - // SimpleStorageContract is the compiled test simple storage contract - SimpleStorageContract CompiledContract - - //go:embed TestMessageCall.json - testMessageCallJSON []byte - - // TestMessageCall is the compiled message call benchmark contract - TestMessageCall CompiledContract -) - -func init() { - err := json.Unmarshal(erc20JSON, &ERC20Contract) - if err != nil { - panic(err) - } - - if len(ERC20Contract.Bin) == 0 { - panic("load contract failed") - } - - err = json.Unmarshal(testMessageCallJSON, &TestMessageCall) - if err != nil { - panic(err) - } - - if len(TestMessageCall.Bin) == 0 { - panic("load contract failed") - } +// HardhatCompiledContract is a type used to unpack the compiled JSON data +// which is generated by running `npx hardhat compile` for a given smart contract. +type HardhatCompiledContract struct { + Format string `json:"_format"` + ContractName string `json:"contractName"` + SourceName string `json:"sourceName"` + ABI abi.ABI `json:"abi"` + Bytecode string `json:"bytecode"` +} - err = json.Unmarshal(simpleStorageJSON, &SimpleStorageContract) +func (c HardhatCompiledContract) ToCompiledContract() (CompiledContract, error) { + strippedHex := strings.TrimPrefix(c.Bytecode, "0x") + hexBytes, err := hex.DecodeString(strippedHex) if err != nil { - panic(err) + return CompiledContract{}, fmt.Errorf("failed to decode hex string: %w", err) } - if len(TestMessageCall.Bin) == 0 { - panic("load contract failed") - } + return CompiledContract{ + ABI: c.ABI, + Bin: hexBytes, + }, nil } diff --git a/x/evm/types/compiled_contract_test.go b/x/evm/types/compiled_contract_test.go new file mode 100644 index 0000000000..f7f3681c92 --- /dev/null +++ b/x/evm/types/compiled_contract_test.go @@ -0,0 +1,32 @@ +package types_test + +import ( + "encoding/json" + "os" + "testing" + + evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/stretchr/testify/require" +) + +func TestHardhatCompiledContract(t *testing.T) { + contents, err := os.ReadFile("testdata/SimpleContractHardhat.json") + require.NoError(t, err, "failed to read file") + require.NotEmpty(t, contents, "expected contents not to be empty") + + var hardhatContract evmtypes.HardhatCompiledContract + err = json.Unmarshal(contents, &hardhatContract) + require.NoError(t, err, "failed to unmarshal contract") + + require.Equal(t, hardhatContract.ContractName, "SimpleContract") + require.Contains(t, + hardhatContract.ABI.Methods, + "setValue", + "missing setValue method in contract ABI methods", + ) + + compiledContract, err := hardhatContract.ToCompiledContract() + require.NoError(t, err, "failed to convert hardhat contract to compiled contract type") + require.Equal(t, compiledContract.ABI, hardhatContract.ABI, "expected ABIs to be equal") + require.NotEmpty(t, compiledContract.Bin, "expected bin data not to be empty") +} diff --git a/x/evm/types/testdata/SimpleContractHardhat.json b/x/evm/types/testdata/SimpleContractHardhat.json new file mode 100644 index 0000000000..bb6587821e --- /dev/null +++ b/x/evm/types/testdata/SimpleContractHardhat.json @@ -0,0 +1,37 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "SimpleContract", + "sourceName": "contracts/SimpleContract.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_value", + "type": "uint256" + } + ], + "name": "setValue", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "value", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b50610133806100206000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80633fa4f24514603757806355241077146051575b600080fd5b603d6069565b604051604891906090565b60405180910390f35b606760048036038101906063919060d5565b606f565b005b60005481565b8060008190555050565b6000819050919050565b608a816079565b82525050565b600060208201905060a360008301846083565b92915050565b600080fd5b60b5816079565b811460bf57600080fd5b50565b60008135905060cf8160ae565b92915050565b60006020828403121560e85760e760a9565b5b600060f48482850160c2565b9150509291505056fea2646970667358221220c9305ac8499dab6bde1cc24810af134727f1640c623f14bce015f6812a73762764736f6c63430008130033", + "deployedBytecode": "0x6080604052348015600f57600080fd5b506004361060325760003560e01c80633fa4f24514603757806355241077146051575b600080fd5b603d6069565b604051604891906090565b60405180910390f35b606760048036038101906063919060d5565b606f565b005b60005481565b8060008190555050565b6000819050919050565b608a816079565b82525050565b600060208201905060a360008301846083565b92915050565b600080fd5b60b5816079565b811460bf57600080fd5b50565b60008135905060cf8160ae565b92915050565b60006020828403121560e85760e760a9565b5b600060f48482850160c2565b9150509291505056fea2646970667358221220c9305ac8499dab6bde1cc24810af134727f1640c623f14bce015f6812a73762764736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/x/feemarket/keeper/keeper_test.go b/x/feemarket/keeper/keeper_test.go index e5b161a291..78bace6348 100644 --- a/x/feemarket/keeper/keeper_test.go +++ b/x/feemarket/keeper/keeper_test.go @@ -1,7 +1,6 @@ package keeper_test import ( - _ "embed" "math/big" "cosmossdk.io/math" From 2a8fcf0a9b602b1d459c000c3762226d9a6ba6d4 Mon Sep 17 00:00:00 2001 From: Ramiro Carlucho Date: Thu, 2 May 2024 14:33:45 -0300 Subject: [PATCH 232/345] chore(v19): add upgrade handler (#2533) * add upgrade handler * add changelog * fix old upgrade * minor fix --------- Signed-off-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: stepit Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- CHANGELOG.md | 1 + app/app.go | 13 +++++++++++-- app/upgrades/v17/upgrades.go | 7 ------- app/upgrades/v19/constants.go | 11 +++++++++++ app/upgrades/v19/upgrades.go | 25 +++++++++++++++++++++++++ 5 files changed, 48 insertions(+), 9 deletions(-) create mode 100644 app/upgrades/v19/constants.go create mode 100644 app/upgrades/v19/upgrades.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 5fc3e3adcc..6ed74c45ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -53,6 +53,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (erc20) [#2502](https://github.com/evmos/evmos/pull/2502) Revert deletion of EVM hooks (#2154) (#2442). - (vesting) [#2507](https://github.com/evmos/evmos/pull/2507) Consider locked-up vested delegated coins in `LockedCoins` calculation. - (erc20) [#2508](https://github.com/evmos/evmos/pull/2508) Add bookkeping logic in preparation for STRV2 upgrade. +- (upgrade) [#2533](https://github.com/evmos/evmos/pull/2533) Add upgrade handler for v19. ### Bug Fixes diff --git a/app/app.go b/app/app.go index 67db9786bf..24b9238ddf 100644 --- a/app/app.go +++ b/app/app.go @@ -125,6 +125,7 @@ import ( "github.com/evmos/evmos/v18/app/post" v17 "github.com/evmos/evmos/v18/app/upgrades/v17" v18 "github.com/evmos/evmos/v18/app/upgrades/v18" + v19 "github.com/evmos/evmos/v18/app/upgrades/v19" "github.com/evmos/evmos/v18/encoding" "github.com/evmos/evmos/v18/ethereum/eip712" "github.com/evmos/evmos/v18/precompiles/common" @@ -1136,6 +1137,14 @@ func (app *Evmos) setupUpgradeHandlers() { ), ) + // v19 upgrade handler + app.UpgradeKeeper.SetUpgradeHandler( + v19.UpgradeName, + v19.CreateUpgradeHandler( + app.mm, app.configurator, + ), + ) + // When a planned update height is reached, the old binary will panic // writing on disk the height and name of the update that triggered it // This will read that value, and execute the preparations for the upgrade. @@ -1151,8 +1160,8 @@ func (app *Evmos) setupUpgradeHandlers() { var storeUpgrades *storetypes.StoreUpgrades switch upgradeInfo.Name { - case v17.UpgradeName: - // revenue module is deprecated in v17 + case v19.UpgradeName: + // revenue module is deprecated in v19 storeUpgrades = &storetypes.StoreUpgrades{ Deleted: []string{"revenue"}, } diff --git a/app/upgrades/v17/upgrades.go b/app/upgrades/v17/upgrades.go index d4bbbc96fd..3a6af86f5b 100644 --- a/app/upgrades/v17/upgrades.go +++ b/app/upgrades/v17/upgrades.go @@ -15,14 +15,7 @@ func CreateUpgradeHandler( configurator module.Configurator, ) upgradetypes.UpgradeHandler { return func(ctx sdk.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { - logger := ctx.Logger().With("upgrade", UpgradeName) - - // revenue module is deprecated - logger.Debug("deleting revenue module from version map...") - delete(vm, "revenue") - // Leave modules as-is to avoid running InitGenesis. - logger.Debug("running module migrations ...") return mm.RunMigrations(ctx, configurator, vm) } } diff --git a/app/upgrades/v19/constants.go b/app/upgrades/v19/constants.go new file mode 100644 index 0000000000..4cd3a8e0e2 --- /dev/null +++ b/app/upgrades/v19/constants.go @@ -0,0 +1,11 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package v19 + +const ( + // UpgradeName is the shared upgrade plan name for mainnet + UpgradeName = "v19.0.0" + // UpgradeInfo defines the binaries that will be used for the upgrade + UpgradeInfo = `'{"binaries":{"darwin/amd64":"https://github.com/evmos/evmos/releases/download/v19.0.0/evmos_19.0.0_Darwin_arm64.tar.gz","darwin/x86_64":"https://github.com/evmos/evmos/releases/download/v19.0.0/evmos_19.0.0_Darwin_x86_64.tar.gz","linux/arm64":"https://github.com/evmos/evmos/releases/download/v19.0.0/evmos_19.0.0_Linux_arm64.tar.gz","linux/amd64":"https://github.com/evmos/evmos/releases/download/v19.0.0/evmos_19.0.0_Linux_amd64.tar.gz","windows/x86_64":"https://github.com/evmos/evmos/releases/download/v19.0.0/evmos_19.0.0_Windows_x86_64.zip"}}'` +) diff --git a/app/upgrades/v19/upgrades.go b/app/upgrades/v19/upgrades.go new file mode 100644 index 0000000000..2e7e01c155 --- /dev/null +++ b/app/upgrades/v19/upgrades.go @@ -0,0 +1,25 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package v19 + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" +) + +// CreateUpgradeHandler creates an SDK upgrade handler for v19 +func CreateUpgradeHandler( + mm *module.Manager, + configurator module.Configurator, +) upgradetypes.UpgradeHandler { + return func(ctx sdk.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { + logger := ctx.Logger().With("upgrade", UpgradeName) + // revenue module is deprecated + logger.Debug("deleting revenue module from version map...") + delete(vm, "revenue") + // Leave modules as-is to avoid running InitGenesis. + return mm.RunMigrations(ctx, configurator, vm) + } +} From 98bdb09913f56ddd95e8415c1f9b1ccefb0475c9 Mon Sep 17 00:00:00 2001 From: Freddy Caceres Date: Thu, 2 May 2024 16:33:07 -0400 Subject: [PATCH 233/345] imp(precompiles): Remove Outposts precompiles (#2529) * imp(precompiles): Remove Outposts precompiles * Update changelog * resolve conflicts and fix changelog * remove unused chain id * fix changelog * fix link * remove outpost from default params and in the upgrade handler * run make format * fix expected gas on tests * remove e2e tests --------- Signed-off-by: stepit <48993133+0xstepit@users.noreply.github.com> Signed-off-by: Ramiro Carlucho Co-authored-by: stepit Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: Ramiro Carlucho Co-authored-by: ramacarlucho --- .github/workflows/e2e-test.yml | 2 - CHANGELOG.md | 2 + app/app.go | 3 +- app/upgrades/v16/upgrades.go | 9 - app/upgrades/v19/upgrades.go | 28 + .../outposts/osmosis/IOsmosisOutpost.sol | 80 --- precompiles/outposts/osmosis/abi.json | 154 ------ precompiles/outposts/osmosis/errors.go | 30 - precompiles/outposts/osmosis/events.go | 69 --- precompiles/outposts/osmosis/events_test.go | 111 ---- precompiles/outposts/osmosis/osmosis.go | 157 ------ precompiles/outposts/osmosis/setup_test.go | 62 --- precompiles/outposts/osmosis/tx.go | 193 ------- precompiles/outposts/osmosis/tx_test.go | 458 ---------------- precompiles/outposts/osmosis/types.go | 345 ------------ precompiles/outposts/osmosis/types_test.go | 512 ------------------ precompiles/outposts/osmosis/utils_test.go | 92 ---- .../outposts/stride/IStrideOutpost.sol | 87 --- precompiles/outposts/stride/abi.json | 215 -------- precompiles/outposts/stride/errors.go | 20 - precompiles/outposts/stride/events.go | 115 ---- precompiles/outposts/stride/events_test.go | 117 ---- precompiles/outposts/stride/setup_test.go | 60 -- precompiles/outposts/stride/stride.go | 142 ----- precompiles/outposts/stride/tx.go | 248 --------- precompiles/outposts/stride/tx_test.go | 299 ---------- precompiles/outposts/stride/types.go | 150 ----- precompiles/outposts/stride/types_test.go | 57 -- precompiles/outposts/stride/utils_test.go | 103 ---- tests/nix_tests/test_osmosis_outpost.py | 310 ----------- tests/nix_tests/test_stride_outpost.py | 97 ---- x/evm/keeper/grpc_query_test.go | 6 +- x/evm/keeper/precompiles.go | 41 -- x/evm/types/params.go | 2 - 34 files changed, 34 insertions(+), 4342 deletions(-) delete mode 100644 precompiles/outposts/osmosis/IOsmosisOutpost.sol delete mode 100644 precompiles/outposts/osmosis/abi.json delete mode 100644 precompiles/outposts/osmosis/errors.go delete mode 100644 precompiles/outposts/osmosis/events.go delete mode 100644 precompiles/outposts/osmosis/events_test.go delete mode 100644 precompiles/outposts/osmosis/osmosis.go delete mode 100644 precompiles/outposts/osmosis/setup_test.go delete mode 100644 precompiles/outposts/osmosis/tx.go delete mode 100644 precompiles/outposts/osmosis/tx_test.go delete mode 100644 precompiles/outposts/osmosis/types.go delete mode 100644 precompiles/outposts/osmosis/types_test.go delete mode 100644 precompiles/outposts/osmosis/utils_test.go delete mode 100644 precompiles/outposts/stride/IStrideOutpost.sol delete mode 100644 precompiles/outposts/stride/abi.json delete mode 100644 precompiles/outposts/stride/errors.go delete mode 100644 precompiles/outposts/stride/events.go delete mode 100644 precompiles/outposts/stride/events_test.go delete mode 100644 precompiles/outposts/stride/setup_test.go delete mode 100644 precompiles/outposts/stride/stride.go delete mode 100644 precompiles/outposts/stride/tx.go delete mode 100644 precompiles/outposts/stride/tx_test.go delete mode 100644 precompiles/outposts/stride/types.go delete mode 100644 precompiles/outposts/stride/types_test.go delete mode 100644 precompiles/outposts/stride/utils_test.go delete mode 100644 tests/nix_tests/test_osmosis_outpost.py delete mode 100644 tests/nix_tests/test_stride_outpost.py diff --git a/.github/workflows/e2e-test.yml b/.github/workflows/e2e-test.yml index 5353b2fab8..47f122f6e8 100644 --- a/.github/workflows/e2e-test.yml +++ b/.github/workflows/e2e-test.yml @@ -51,12 +51,10 @@ jobs: "test_grpc_only.py" "test_ibc.py" "test_no_abci_resp.py" - "test_osmosis_outpost.py" "test_precompiles.py" "test_priority.py" "test_pruned_node.py" "test_rollback.py" - "test_stride_outpost.py" "test_storage_proof.py" "test_zero_fee.py" ) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ed74c45ff..cca241a5cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -53,8 +53,10 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (erc20) [#2502](https://github.com/evmos/evmos/pull/2502) Revert deletion of EVM hooks (#2154) (#2442). - (vesting) [#2507](https://github.com/evmos/evmos/pull/2507) Consider locked-up vested delegated coins in `LockedCoins` calculation. - (erc20) [#2508](https://github.com/evmos/evmos/pull/2508) Add bookkeping logic in preparation for STRV2 upgrade. +- (precompiles) [#2529](https://github.com/evmos/evmos/pull/2529) Remove Outposts precompiles. - (upgrade) [#2533](https://github.com/evmos/evmos/pull/2533) Add upgrade handler for v19. + ### Bug Fixes - (inflation) [#2299](https://github.com/evmos/evmos/pull/2299) Fix emission function and tests. diff --git a/app/app.go b/app/app.go index 24b9238ddf..1573c6eb16 100644 --- a/app/app.go +++ b/app/app.go @@ -498,11 +498,9 @@ func NewEvmos( app.AccountKeeper, app.BankKeeper, scopedTransferKeeper, app.Erc20Keeper, // Add ERC20 Keeper for ERC20 transfers ) - chainID := bApp.ChainID() // We call this after setting the hooks to ensure that the hooks are set on the keeper evmKeeper.WithPrecompiles( evmkeeper.AvailablePrecompiles( - chainID, *stakingKeeper, app.DistrKeeper, app.BankKeeper, @@ -1142,6 +1140,7 @@ func (app *Evmos) setupUpgradeHandlers() { v19.UpgradeName, v19.CreateUpgradeHandler( app.mm, app.configurator, + app.EvmKeeper, ), ) diff --git a/app/upgrades/v16/upgrades.go b/app/upgrades/v16/upgrades.go index 004aedc02b..eef23fcfcc 100644 --- a/app/upgrades/v16/upgrades.go +++ b/app/upgrades/v16/upgrades.go @@ -10,8 +10,6 @@ import ( govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" "github.com/evmos/evmos/v18/precompiles/bech32" - osmosisoutpost "github.com/evmos/evmos/v18/precompiles/outposts/osmosis" - strideoutpost "github.com/evmos/evmos/v18/precompiles/outposts/stride" "github.com/evmos/evmos/v18/precompiles/p256" "github.com/evmos/evmos/v18/utils" evmkeeper "github.com/evmos/evmos/v18/x/evm/keeper" @@ -40,13 +38,6 @@ func CreateUpgradeHandler( } } - // enable stride and osmosis outposts - strideAddress := strideoutpost.Precompile{}.Address() - osmosisAddress := osmosisoutpost.Precompile{}.Address() - if err := ek.EnablePrecompiles(ctx, strideAddress, osmosisAddress); err != nil { - logger.Error("failed to enable outposts", "error", err.Error()) - } - // Add Burner role to fee collector if err := MigrateFeeCollector(ak, ctx); err != nil { logger.Error("failed to migrate the fee collector", "error", err.Error()) diff --git a/app/upgrades/v19/upgrades.go b/app/upgrades/v19/upgrades.go index 2e7e01c155..95eacba7c0 100644 --- a/app/upgrades/v19/upgrades.go +++ b/app/upgrades/v19/upgrades.go @@ -7,19 +7,47 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" + evmkeeper "github.com/evmos/evmos/v18/x/evm/keeper" +) + +const ( + StrideOutpostAddress = "0x0000000000000000000000000000000000000900" + OsmosisOutpostAddress = "0x0000000000000000000000000000000000000901" ) // CreateUpgradeHandler creates an SDK upgrade handler for v19 func CreateUpgradeHandler( mm *module.Manager, configurator module.Configurator, + evmKeeper *evmkeeper.Keeper, ) upgradetypes.UpgradeHandler { return func(ctx sdk.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { logger := ctx.Logger().With("upgrade", UpgradeName) // revenue module is deprecated logger.Debug("deleting revenue module from version map...") delete(vm, "revenue") + + ctxCache, writeFn := ctx.CacheContext() + if err := RemoveOutpostsFromEvmParams(ctxCache, evmKeeper); err == nil { + writeFn() + } + // Leave modules as-is to avoid running InitGenesis. return mm.RunMigrations(ctx, configurator, vm) } } + +func RemoveOutpostsFromEvmParams(ctx sdk.Context, + evmKeeper *evmkeeper.Keeper, +) error { + params := evmKeeper.GetParams(ctx) + newActivePrecompiles := make([]string, 0) + for _, precompile := range params.ActivePrecompiles { + if precompile != OsmosisOutpostAddress && + precompile != StrideOutpostAddress { + newActivePrecompiles = append(newActivePrecompiles, precompile) + } + } + params.ActivePrecompiles = newActivePrecompiles + return evmKeeper.SetParams(ctx, params) +} diff --git a/precompiles/outposts/osmosis/IOsmosisOutpost.sol b/precompiles/outposts/osmosis/IOsmosisOutpost.sol deleted file mode 100644 index eb97d0e6d7..0000000000 --- a/precompiles/outposts/osmosis/IOsmosisOutpost.sol +++ /dev/null @@ -1,80 +0,0 @@ -/// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity >=0.8.18; - -/// @dev The Osmosis Outpost contract's address. -address constant OSMOSIS_OUTPOST_ADDRESS = 0x0000000000000000000000000000000000000901; - -/// @dev The Osmosis Outpost contract's instance. -IOsmosisOutpost constant OSMOSIS_OUTPOST_CONTRACT = IOsmosisOutpost( - OSMOSIS_OUTPOST_ADDRESS -); - -/// @dev The default value used for the slippage_percentage in the swap. -string constant DEFAULT_TWAP_SLIPPAGE_PERCENTAGE = "10"; -/// @dev The default value used for window_seconds in the swap. -uint64 constant DEFAULT_TWAP_WINDOW_SECONDS = 30; - -/// @dev The SwapParams struct contains the parameters of an Osmosis swap. -/// @param channelID - The channel ID of the IBC channel between the Evmos and Osmosis chains. -/// @param xcsContract - The address of the XCS contract on the Osmosis chain. -/// @param sender - The address on the Evmos chain that will swap tokens. -/// @param input - The address of the ERC-20 token contract that will be swapped for. -/// @param output - The address of the ERC-20 token contract that will be swapped to (received). -/// @param amount - The amount of input tokens to be swapped. -/// @param slippagePercentage - The slippage percentage of the swap. -/// @param windowSeconds - The window seconds of the swap. -/// @param swapReceiver - The bech32-formatted address of the receiver of the newly swapped -/// tokens. It can be only an address on the Evmos chain. -struct SwapParams { - string channelID; - string xcsContract; - address sender; - address input; - address output; - uint256 amount; - uint8 slippagePercentage; - uint64 windowSeconds; - string swapReceiver; -} - -/// @author Evmos Core Team. -/// @dev Interface for directly interacting with Osmosis Outpost. -interface IOsmosisOutpost { - /// @dev Emitted when an ICS-20 transfer is executed. - /// @param sender The address of the sender. - /// @param receiver The address of the receiver. - /// @param sourcePort The source port of the IBC transaction. - /// @param sourceChannel The source channel of the IBC transaction. - /// @param denom The denomination of the tokens transferred. - /// @param amount The amount of tokens transferred. - /// @param memo The IBC transaction memo. - event IBCTransfer( - address indexed sender, - address indexed receiver, - string sourcePort, - string sourceChannel, - string denom, - uint256 amount, - string memo - ); - - /// @dev Emitted when a user executes a swap. - /// @param sender The address of the sender. - /// @param input The ERC-20 token contract address to be swapped for. - /// @param output The ERC-20 token contract address to be swapped to (received). - /// @param amount The amount of input tokens to be swapped. - /// @param receiver The bech32-formatted address of the receiver of the newly swapped - /// tokens. It can be only an address on the Evmos chain. - event Swap( - address indexed sender, - address indexed input, - address indexed output, - uint256 amount, - string receiver - ); - - /// @dev This function is used to swap tokens on Osmosis. - /// @param payload The SwapParams struct containing the parameters of the swap. - /// @return success The boolean value indicating whether the operation succeeded or not. - function swap(SwapParams calldata payload) external returns (bool success); -} diff --git a/precompiles/outposts/osmosis/abi.json b/precompiles/outposts/osmosis/abi.json deleted file mode 100644 index 6d8e793df2..0000000000 --- a/precompiles/outposts/osmosis/abi.json +++ /dev/null @@ -1,154 +0,0 @@ -[ - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "receiver", - "type": "address" - }, - { - "indexed": false, - "internalType": "string", - "name": "sourcePort", - "type": "string" - }, - { - "indexed": false, - "internalType": "string", - "name": "sourceChannel", - "type": "string" - }, - { - "indexed": false, - "internalType": "string", - "name": "denom", - "type": "string" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "string", - "name": "memo", - "type": "string" - } - ], - "name": "IBCTransfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "input", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "output", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "string", - "name": "receiver", - "type": "string" - } - ], - "name": "Swap", - "type": "event" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "string", - "name": "channelID", - "type": "string" - }, - { - "internalType": "string", - "name": "xcsContract", - "type": "string" - }, - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "input", - "type": "address" - }, - { - "internalType": "address", - "name": "output", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "slippagePercentage", - "type": "uint8" - }, - { - "internalType": "uint64", - "name": "windowSeconds", - "type": "uint64" - }, - { - "internalType": "string", - "name": "swapReceiver", - "type": "string" - } - ], - "internalType": "struct SwapParams", - "name": "payload", - "type": "tuple" - } - ], - "name": "swap", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } -] \ No newline at end of file diff --git a/precompiles/outposts/osmosis/errors.go b/precompiles/outposts/osmosis/errors.go deleted file mode 100644 index 3fdb258b98..0000000000 --- a/precompiles/outposts/osmosis/errors.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) -package osmosis - -import "fmt" - -var ( - // ErrEmptyOnFailedDelivery is raised when the onFailedDelivery field of the - // IBC memo is an empty string. - ErrEmptyOnFailedDelivery = "onFailedDelivery cannot be empty" - // ErrEmptyContractAddress is raised when the memo is created with an empty receiver contract - // address. - ErrEmptyContractAddress = "empty contract address" - // ErrInvalidContractAddress is raised when the xcs contract passed during the instantiation of - // the precompile is not a valid Osmosis CosmWasm contract address. - ErrInvalidContractAddress = "osmosis contract address is not valid" - // ErrInputEqualOutput is raised when input and output tokens are the same. - ErrInputEqualOutput = "input and output token cannot be the same: %s" - // ErrSlippagePercentage is raised when the requested slippage percentage is - // higher than a pre-defined maximum amount. - ErrSlippagePercentage = fmt.Sprintf("slippage percentage must be: 0 < slippagePercentage <= %d", MaxSlippagePercentage) - // ErrWindowSeconds is raised when the requested window seconds is - // higher than a pre-defined maximum amount. - ErrWindowSeconds = fmt.Sprintf("window seconds must be: 0 < windowSeconds <= %d", MaxWindowSeconds) - // ErrInputTokenNotSupported is raised when the osmosis outpost receives a non-supported - // input token for the swap. - ErrDenomNotSupported = "denom not supported, supported denoms are: %v" //#nosec G101 -- no hardcoded credentials here - // ErrReceiverAddress is raised when an error occurs during the validation of the swap receiver address. - ErrReceiverAddress = "error during receiver address validation: %s" -) diff --git a/precompiles/outposts/osmosis/events.go b/precompiles/outposts/osmosis/events.go deleted file mode 100644 index e3e4f8ad75..0000000000 --- a/precompiles/outposts/osmosis/events.go +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package osmosis - -import ( - "math/big" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/common" - ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v18/precompiles/common" -) - -const ( - // EventTypeSwap is the event type emitted on a swap transaction to the - // Osmosis chain. - EventTypeSwap = "Swap" -) - -// EmitSwapEvent creates a new SwapEvent event on the EVM stateDB. -func (p Precompile) EmitSwapEvent( - ctx sdk.Context, - stateDB vm.StateDB, - sender, input, output common.Address, - amount *big.Int, - receiver string, -) error { - // Prepare the event topics. - event := p.ABI.Events[EventTypeSwap] - topics := make([]common.Hash, 4) - - // The first topic is always the signature of the event. - topics[0] = event.ID - - var err error - // sender, input, and output are indexed. - topics[1], err = cmn.MakeTopic(sender) - if err != nil { - return err - } - - topics[2], err = cmn.MakeTopic(input) - if err != nil { - return err - } - - topics[3], err = cmn.MakeTopic(output) - if err != nil { - return err - } - - arguments := abi.Arguments{event.Inputs[3], event.Inputs[4]} - packed, err := arguments.Pack(amount, receiver) - if err != nil { - return err - } - - stateDB.AddLog(ðtypes.Log{ - Address: p.Address(), - Topics: topics, - Data: packed, - BlockNumber: uint64(ctx.BlockHeight()), - }) - - return nil -} diff --git a/precompiles/outposts/osmosis/events_test.go b/precompiles/outposts/osmosis/events_test.go deleted file mode 100644 index f08cbb3359..0000000000 --- a/precompiles/outposts/osmosis/events_test.go +++ /dev/null @@ -1,111 +0,0 @@ -package osmosis_test - -import ( - "math/big" - - "github.com/ethereum/go-ethereum/common" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/precompiles/outposts/osmosis" - evmosutiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/x/evm/statedb" -) - -func (s *PrecompileTestSuite) TestSwapEvent() { - // random common.Address that represents the evmos ERC20 token address and - // the IBC OSMO ERC20 token address. - evmosAddress := evmosutiltx.GenerateAddress() - osmoAddress := evmosutiltx.GenerateAddress() - - sender := s.keyring.GetAddr(0) - receiver := "osmo1qql8ag4cluz6r4dz28p3w00dnc9w8ueuhnecd2" - transferAmount := int64(10) - - testCases := []struct { - name string - input common.Address - output common.Address - amount *big.Int - receiver string - postCheck func(input common.Address, output common.Address, amount *big.Int, receiver string, stateDB *statedb.StateDB) - }{ - { - "pass - correct event emitted", - evmosAddress, - osmoAddress, - big.NewInt(transferAmount), - receiver, - func(input common.Address, output common.Address, amount *big.Int, receiver string, stateDB *statedb.StateDB) { - s.Require().Len(stateDB.Logs(), 1, "expected one log in the stateDB") - - swapLog := stateDB.Logs()[0] - s.Require().Equal( - swapLog.Address, - s.precompile.Address(), - "expected first log address equal to osmosis outpost precompile", - ) - event := s.precompile.ABI.Events[osmosis.EventTypeSwap] - s.Require().Equal( - event.ID, - common.HexToHash(swapLog.Topics[0].Hex()), - "expected event signature equal to osmosis outpost event signature", - ) - s.Require().Equal( - swapLog.BlockNumber, - uint64(s.unitNetwork.GetContext().BlockHeight()), - "require event block height equal to context block height", - ) - - // Check for swap specific information in the event - var swapEvent osmosis.EventSwap - err := cmn.UnpackLog(s.precompile.ABI, &swapEvent, osmosis.EventTypeSwap, *swapLog) - s.Require().NoError(err) - s.Require().Equal( - sender, - swapEvent.Sender, - "expected a different sender in the event log", - ) - s.Require().Equal( - input, - swapEvent.Input, - "expected a different input value in the event", - ) - s.Require().Equal( - output, - swapEvent.Output, - "expected a different output value in the event", - ) - s.Require().Equal( - amount, - swapEvent.Amount, - "expected a different amount in the event log", - ) - s.Require().Equal( - receiver, - swapEvent.Receiver, - "expected a different receiver value in the event", - ) - }, - }, - } - - for _, tc := range testCases { - s.Run(tc.name, func() { - err := s.unitNetwork.NextBlock() - s.Require().NoError(err) - - stateDB := s.unitNetwork.GetStateDB() - - err = s.precompile.EmitSwapEvent( - s.unitNetwork.GetContext(), - stateDB, - sender, - tc.input, - tc.output, - tc.amount, - tc.receiver, - ) - s.Require().NoError(err) - tc.postCheck(tc.input, tc.output, tc.amount, tc.receiver, stateDB) - }) - } -} diff --git a/precompiles/outposts/osmosis/osmosis.go b/precompiles/outposts/osmosis/osmosis.go deleted file mode 100644 index 25e845e3fe..0000000000 --- a/precompiles/outposts/osmosis/osmosis.go +++ /dev/null @@ -1,157 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package osmosis - -import ( - "embed" - "fmt" - - storetypes "github.com/cosmos/cosmos-sdk/store/types" - authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" - bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - channelkeeper "github.com/cosmos/ibc-go/v7/modules/core/04-channel/keeper" - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v18/precompiles/common" - erc20keeper "github.com/evmos/evmos/v18/x/erc20/keeper" - transferkeeper "github.com/evmos/evmos/v18/x/ibc/transfer/keeper" - stakingkeeper "github.com/evmos/evmos/v18/x/staking/keeper" -) - -const ( - // OsmosisPrefix represents the human readable part for bech32 addresses on the Osmosis chain. - OsmosisPrefix = "osmo" - // OsmosisOutpostAddress is the address of the Osmosis outpost precompile. - OsmosisOutpostAddress = "0x0000000000000000000000000000000000000901" -) - -var _ vm.PrecompiledContract = &Precompile{} - -// Embed abi json file to the executable binary. Needed when importing as dependency. -// -//go:embed abi.json -var f embed.FS - -// Precompile is the structure that defines the Osmosis outpost precompile extending -// the common Precompile type. -type Precompile struct { - cmn.Precompile - wevmosAddress common.Address - - // Keepers - bankKeeper bankkeeper.Keeper - transferKeeper transferkeeper.Keeper - stakingKeeper stakingkeeper.Keeper - erc20Keeper erc20keeper.Keeper - channelKeeper channelkeeper.Keeper -} - -// NewPrecompile creates a new Osmosis outpost Precompile instance as a -// PrecompiledContract interface. -func NewPrecompile( - wevmosAddress common.Address, - authzKeeper authzkeeper.Keeper, - bankKeeper bankkeeper.Keeper, - transferKeeper transferkeeper.Keeper, - stakingKeeper stakingkeeper.Keeper, - erc20Keeper erc20keeper.Keeper, - channelKeeper channelkeeper.Keeper, -) (*Precompile, error) { - newAbi, err := LoadABI() - if err != nil { - return nil, err - } - - return &Precompile{ - Precompile: cmn.Precompile{ - ABI: newAbi, - KvGasConfig: storetypes.KVGasConfig(), - TransientKVGasConfig: storetypes.TransientGasConfig(), - ApprovalExpiration: cmn.DefaultExpirationDuration, - AuthzKeeper: authzKeeper, - }, - wevmosAddress: wevmosAddress, - bankKeeper: bankKeeper, - transferKeeper: transferKeeper, - stakingKeeper: stakingKeeper, - erc20Keeper: erc20Keeper, - channelKeeper: channelKeeper, - }, nil -} - -// LoadABI loads the Osmosis outpost ABI from the embedded abi.json file -// for the Osmosis outpost precompile. -func LoadABI() (abi.ABI, error) { - return cmn.LoadABI(f, "abi.json") -} - -// Address defines the address of the Osmosis outpost precompile contract. -func (Precompile) Address() common.Address { - return common.HexToAddress(OsmosisOutpostAddress) -} - -// IsStateful returns true since the precompile contract has access to the -// chain state. -func (Precompile) IsStateful() bool { - return true -} - -// RequiredGas calculates the precompiled contract's base gas rate. -func (p Precompile) RequiredGas(input []byte) uint64 { - methodID := input[:4] - - method, err := p.MethodById(methodID) - if err != nil { - // This should never happen since this method is going to fail during Run - return 0 - } - - return p.Precompile.RequiredGas(input, p.IsTransaction(method.Name)) -} - -// IsTransaction checks if the given method name corresponds to a transaction or query. -func (Precompile) IsTransaction(method string) bool { - switch method { - case SwapMethod: - return true - default: - return false - } -} - -// Run executes the precompiled contract Swap method. -func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, readOnly bool) (bz []byte, err error) { - ctx, stateDB, method, initialGas, args, err := p.RunSetup(evm, contract, readOnly, p.IsTransaction) - if err != nil { - return nil, err - } - - // This handles any out of gas errors that may occur during the execution of a precompile tx or query. - // It avoids panics and returns the out of gas error so the EVM can continue gracefully. - defer cmn.HandleGasError(ctx, contract, initialGas, &err)() - - if err := stateDB.Commit(); err != nil { - return nil, err - } - - switch method.Name { - case SwapMethod: - bz, err = p.Swap(ctx, evm.Origin, stateDB, contract, method, args) - default: - return nil, fmt.Errorf(cmn.ErrUnknownMethod, method.Name) - } - - if err != nil { - return nil, err - } - - cost := ctx.GasMeter().GasConsumed() - initialGas - - if !contract.UseGas(cost) { - return nil, vm.ErrOutOfGas - } - - return bz, nil -} diff --git a/precompiles/outposts/osmosis/setup_test.go b/precompiles/outposts/osmosis/setup_test.go deleted file mode 100644 index 090024eaed..0000000000 --- a/precompiles/outposts/osmosis/setup_test.go +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package osmosis_test - -import ( - "testing" - - "github.com/evmos/evmos/v18/precompiles/erc20" - - "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/precompiles/outposts/osmosis" - "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - "github.com/stretchr/testify/suite" -) - -const ( - PortID = "transfer" - ChannelID = "channel-0" - XCSContract = "osmo1a34wxsxjwvtz3ua4hnkh4lv3d4qrgry0fhkasppplphwu5k538tqcyms9x" -) - -type PrecompileTestSuite struct { - suite.Suite - - unitNetwork *network.UnitTestNetwork - grpcHandler grpc.Handler - keyring testkeyring.Keyring - - precompile *osmosis.Precompile -} - -func TestPrecompileTestSuite(t *testing.T) { - suite.Run(t, new(PrecompileTestSuite)) -} - -func (s *PrecompileTestSuite) SetupTest() { - keyring := testkeyring.New(2) - unitNetwork := network.NewUnitTestNetwork( - network.WithPreFundedAccounts(keyring.GetAllAccAddrs()...), - ) - - precompile, err := osmosis.NewPrecompile( - common.HexToAddress(erc20.WEVMOSContractTestnet), - unitNetwork.App.AuthzKeeper, - unitNetwork.App.BankKeeper, - unitNetwork.App.TransferKeeper, - unitNetwork.App.StakingKeeper, - unitNetwork.App.Erc20Keeper, - unitNetwork.App.IBCKeeper.ChannelKeeper, - ) - s.Require().NoError(err, "expected no error during precompile creation") - - grpcHandler := grpc.NewIntegrationHandler(unitNetwork) - - s.unitNetwork = unitNetwork - s.grpcHandler = grpcHandler - s.keyring = keyring - s.precompile = precompile -} diff --git a/precompiles/outposts/osmosis/tx.go b/precompiles/outposts/osmosis/tx.go deleted file mode 100644 index 091581ea6f..0000000000 --- a/precompiles/outposts/osmosis/tx.go +++ /dev/null @@ -1,193 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) -// -// Osmosis package contains the logic of the Osmosis outpost on the Evmos chain. -// This outpost uses the ics20 precompile to relay IBC packets to the Osmosis -// chain, targeting the Cross-Chain Swap Contract V1 (XCS V1) - -package osmosis - -import ( - "time" - - errorsmod "cosmossdk.io/errors" - "cosmossdk.io/math" - sdk "github.com/cosmos/cosmos-sdk/types" - transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" - - "github.com/evmos/evmos/v18/precompiles/ics20" -) - -const ( - // SwapMethod is the name of the swap method. - SwapMethod = "swap" -) - -const ( - // NextMemo is the memo to use after the swap of the token in the IBC packet - // built on the Osmosis chain. - NextMemo = "" -) - -// Swap is a transaction that swap tokens on the Osmosis chain. -func (p Precompile) Swap( - ctx sdk.Context, - origin common.Address, - stateDB vm.StateDB, - contract *vm.Contract, - method *abi.Method, - args []interface{}, -) ([]byte, error) { - swapPacketData, err := ParseSwapPacketData(method, args) - if err != nil { - return nil, err - } - - input := swapPacketData.Input - output := swapPacketData.Output - amount := swapPacketData.Amount - swapReceiver := swapPacketData.SwapReceiver - - // The provided sender address should always be equal to the origin address. - // In case the contract caller address is the same as the sender address provided, - // update the sender address to be equal to the origin address. - // Otherwise, if the provided sender address is different from the origin address, - // return an error because is a forbidden operation - sender, err := ics20.CheckOriginAndSender(contract, origin, swapPacketData.Sender) - if err != nil { - return nil, err - } - - bondDenom := p.stakingKeeper.GetParams(ctx).BondDenom - var inputDenom, outputDenom string - - // Case 1. Input has to be either the address of Osmosis or WEVMOS - switch input { - case p.wevmosAddress: - inputDenom = bondDenom - default: - inputDenom, err = p.erc20Keeper.GetTokenDenom(ctx, input) - if err != nil { - return nil, err - } - } - - // Case 2. Output has to be either the address of Osmosis or WEVMOS - switch output { - case p.wevmosAddress: - outputDenom = bondDenom - default: - outputDenom, err = p.erc20Keeper.GetTokenDenom(ctx, output) - if err != nil { - return nil, err - } - } - - evmosChannel := NewIBCChannel(transfertypes.PortID, swapPacketData.ChannelID) - err = ValidateInputOutput(inputDenom, outputDenom, bondDenom, evmosChannel) - if err != nil { - return nil, err - } - - // Retrieve Osmosis channel and port associated with Evmos transfer app. We need these information - // to reconstruct the output denom in the Osmosis chain. - - channel, found := p.channelKeeper.GetChannel(ctx, evmosChannel.PortID, evmosChannel.ChannelID) - if !found { - return nil, errorsmod.Wrapf(channeltypes.ErrChannelNotFound, "port ID (%s) channel ID (%s)", evmosChannel.PortID, evmosChannel.ChannelID) - } - osmosisChannel := NewIBCChannel( - channel.GetCounterparty().GetPortID(), - channel.GetCounterparty().GetChannelID(), - ) - - outputOnOsmosis, err := ConvertToOsmosisRepresentation(outputDenom, bondDenom, evmosChannel, osmosisChannel) - if err != nil { - return nil, err - } - - // We have to compute the receiver address on the Osmosis chain to have a recovery address. - onFailedDelivery := CreateOnFailedDeliveryField(sdk.AccAddress(sender.Bytes()).String()) - packet := CreatePacketWithMemo( - outputOnOsmosis, - swapPacketData.SwapReceiver, - swapPacketData.XcsContract, - swapPacketData.SlippagePercentage, - swapPacketData.WindowSeconds, - onFailedDelivery, - NextMemo, - ) - - err = packet.Validate() - if err != nil { - return nil, err - } - packetString := packet.String() - - timeoutTimestamp := ctx.BlockTime().Add(ics20.DefaultTimeoutMinutes * time.Minute).UnixNano() - coin := sdk.Coin{Denom: inputDenom, Amount: math.NewIntFromBigInt(amount)} - msg, err := ics20.CreateAndValidateMsgTransfer( - evmosChannel.PortID, - evmosChannel.ChannelID, - coin, - sdk.AccAddress(sender.Bytes()).String(), - swapPacketData.XcsContract, - ics20.DefaultTimeoutHeight, - uint64(timeoutTimestamp), - packetString, - ) - if err != nil { - return nil, err - } - - // No need to have authorization when the contract caller is the same as - // origin (owner of funds) and the sender is the origin. - accept, expiration, err := ics20.CheckAndAcceptAuthorizationIfNeeded( - ctx, - contract, - origin, - p.AuthzKeeper, - msg, - ) - if err != nil { - return nil, err - } - - // Execute the ICS20 Transfer. - _, err = p.transferKeeper.Transfer(sdk.WrapSDKContext(ctx), msg) - if err != nil { - return nil, err - } - - // Update grant only if is needed. - if err := ics20.UpdateGrantIfNeeded(ctx, contract, p.AuthzKeeper, origin, expiration, accept); err != nil { - return nil, err - } - - // Emit the IBC transfer Event. - if err := ics20.EmitIBCTransferEvent( - ctx, - stateDB, - p.Events[ics20.EventTypeIBCTransfer], - p.Address(), - sender, - msg.Receiver, - msg.SourcePort, - msg.SourceChannel, - coin, - packetString, - ); err != nil { - return nil, err - } - - // Emit the custom Swap Event. - if err := p.EmitSwapEvent(ctx, stateDB, sender, input, output, amount, swapReceiver); err != nil { - return nil, err - } - - return method.Outputs.Pack(true) -} diff --git a/precompiles/outposts/osmosis/tx_test.go b/precompiles/outposts/osmosis/tx_test.go deleted file mode 100644 index e1f36f671f..0000000000 --- a/precompiles/outposts/osmosis/tx_test.go +++ /dev/null @@ -1,458 +0,0 @@ -package osmosis_test - -import ( - "fmt" - "math/big" - - "github.com/evmos/evmos/v18/precompiles/erc20" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" - - sdktypes "github.com/cosmos/cosmos-sdk/types" - - "github.com/evmos/evmos/v18/precompiles/authorization" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/precompiles/ics20" - "github.com/evmos/evmos/v18/precompiles/outposts/osmosis" - commonnetwork "github.com/evmos/evmos/v18/testutil/integration/common/network" - testutils "github.com/evmos/evmos/v18/testutil/integration/evmos/utils" - "github.com/evmos/evmos/v18/testutil/integration/ibc/coordinator" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/utils" -) - -func (s *PrecompileTestSuite) TestSwap() { - // Default variables used during tests. - slippagePercentage := uint8(10) - windowSeconds := uint64(20) - transferAmount := big.NewInt(1e18) - gas := uint64(2_000) - senderAddress := utiltx.GenerateAddress() - sender := sdktypes.AccAddress(senderAddress.Bytes()) - randomAddress := utiltx.GenerateAddress() - receiver := "evmos1vl0x3xr0zwgrllhdzxxlkal7txnnk56q3552x7" //nolint:goconst - - method := s.precompile.Methods[osmosis.SwapMethod] - testCases := []struct { - name string - sender common.Address - origin common.Address - malleate func() []interface{} - ibcSetup bool - expError bool - errContains string - }{ - { - name: "fail - invalid number of args", - sender: senderAddress, - origin: senderAddress, - malleate: func() []interface{} { - return []interface{}{} - }, - expError: true, - errContains: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 1, 0), - }, - { - name: "fail - origin different from sender", - sender: senderAddress, - origin: senderAddress, - malleate: func() []interface{} { - return []interface{}{ - osmosis.SwapPacketData{ - ChannelID: ChannelID, - XcsContract: XCSContract, - Sender: randomAddress, - Input: randomAddress, - Output: randomAddress, - Amount: transferAmount, - SlippagePercentage: slippagePercentage, - WindowSeconds: windowSeconds, - SwapReceiver: receiver, - }, - } - }, - expError: true, - errContains: fmt.Sprintf(ics20.ErrDifferentOriginFromSender, senderAddress, randomAddress), - }, - { - name: "fail - missing input token denom", - sender: senderAddress, - origin: senderAddress, - malleate: func() []interface{} { - evmosTokenPair, err := testutils.RegisterEvmosERC20Coins(*s.unitNetwork, sender) - s.Require().NoError(err, "expected no error during evmos erc20 registration") - - return []interface{}{ - osmosis.SwapPacketData{ - ChannelID: ChannelID, - XcsContract: XCSContract, - Sender: senderAddress, - Input: randomAddress, - Output: evmosTokenPair.GetERC20Contract(), - Amount: transferAmount, - SlippagePercentage: slippagePercentage, - WindowSeconds: windowSeconds, - SwapReceiver: receiver, - }, - } - }, - expError: true, - errContains: fmt.Sprintf("token '%s' not registered", randomAddress), - }, - { - name: "fail - missing output token denom", - sender: senderAddress, - origin: senderAddress, - malleate: func() []interface{} { - evmosTokenPair, err := testutils.RegisterEvmosERC20Coins(*s.unitNetwork, sender) - s.Require().NoError(err, "expected no error during evmos erc20 registration") - - return []interface{}{ - osmosis.SwapPacketData{ - ChannelID: ChannelID, - XcsContract: XCSContract, - Sender: senderAddress, - Input: evmosTokenPair.GetERC20Contract(), - Output: randomAddress, - Amount: transferAmount, - SlippagePercentage: slippagePercentage, - WindowSeconds: windowSeconds, - SwapReceiver: receiver, - }, - } - }, - expError: true, - errContains: fmt.Sprintf("token '%s' not registered", randomAddress), - }, - { - name: "fail - osmo token pair not registered (with osmo hardcoded address)", - sender: senderAddress, - origin: senderAddress, - malleate: func() []interface{} { - evmosTokenPair, err := testutils.RegisterEvmosERC20Coins(*s.unitNetwork, sender) - s.Require().NoError(err, "expected no error during evmos erc20 registration") - return []interface{}{ - osmosis.SwapPacketData{ - ChannelID: ChannelID, - XcsContract: XCSContract, - Sender: senderAddress, - Input: common.HexToAddress("0x1D54EcB8583Ca25895c512A8308389fFD581F9c9"), - Output: evmosTokenPair.GetERC20Contract(), - Amount: transferAmount, - SlippagePercentage: slippagePercentage, - WindowSeconds: windowSeconds, - SwapReceiver: receiver, - }, - } - }, - expError: true, - errContains: fmt.Sprintf("token '%s' not registered", common.HexToAddress("0x1D54EcB8583Ca25895c512A8308389fFD581F9c9")), - }, - { - name: "fail - osmo token pair registered with another ChannelID", - sender: senderAddress, - origin: senderAddress, - malleate: func() []interface{} { - osmoIbcDenomTrace := utils.ComputeIBCDenomTrace(PortID, ChannelID, osmosis.OsmosisDenom) - _, err := testutils.RegisterIBCERC20Coins(s.unitNetwork, sender, osmoIbcDenomTrace) - s.Require().NoError(err, "expected no error during ibc erc20 registration") - - wrongOsmoIbcDenomTrace := utils.ComputeIBCDenomTrace(PortID, "channel-1", osmosis.OsmosisDenom) - wrongOsmoTokenPair, err := testutils.RegisterIBCERC20Coins(s.unitNetwork, sender, wrongOsmoIbcDenomTrace) - s.Require().NoError(err, "expected no error during ibc erc20 registration") - - evmosTokenPair, err := testutils.RegisterEvmosERC20Coins(*s.unitNetwork, sender) - s.Require().NoError(err, "expected no error during evmos erc20 registration") - - return []interface{}{ - osmosis.SwapPacketData{ - ChannelID: ChannelID, - XcsContract: XCSContract, - Sender: senderAddress, - Input: wrongOsmoTokenPair.GetERC20Contract(), - Output: evmosTokenPair.GetERC20Contract(), - Amount: transferAmount, - SlippagePercentage: slippagePercentage, - WindowSeconds: windowSeconds, - SwapReceiver: receiver, - }, - } - }, - expError: true, - ibcSetup: true, - // Probably there is a better way than hardcoding the expected string - errContains: fmt.Sprintf(osmosis.ErrDenomNotSupported, []string{utils.BaseDenom, "ibc/ED07A3391A112B175915CD8FAF43A2DA8E4790EDE12566649D0C2F97716B8518"}), - }, - { - name: "fail - input equal to denom", - sender: senderAddress, - origin: senderAddress, - malleate: func() []interface{} { - evmosTokenPair, err := testutils.RegisterEvmosERC20Coins(*s.unitNetwork, sender) - s.Require().NoError(err, "expected no error during evmos erc20 registration") - - return []interface{}{ - osmosis.SwapPacketData{ - ChannelID: ChannelID, - XcsContract: XCSContract, - Sender: senderAddress, - Input: evmosTokenPair.GetERC20Contract(), - Output: evmosTokenPair.GetERC20Contract(), - Amount: transferAmount, - SlippagePercentage: slippagePercentage, - WindowSeconds: windowSeconds, - SwapReceiver: receiver, - }, - } - }, - expError: true, - errContains: fmt.Sprintf(osmosis.ErrInputEqualOutput, utils.BaseDenom), - }, - { - name: "fail - invalid input", - sender: senderAddress, - origin: senderAddress, - malleate: func() []interface{} { - evmosTokenPair, err := testutils.RegisterEvmosERC20Coins(*s.unitNetwork, sender) - s.Require().NoError(err, "expected no error during evmos erc20 registration") - - wrongIbcDenomTrace := utils.ComputeIBCDenomTrace(PortID, ChannelID, "wrong") - wrongTokenPair, err := testutils.RegisterIBCERC20Coins(s.unitNetwork, sender, wrongIbcDenomTrace) - s.Require().NoError(err, "expected no error during ibc erc20 registration") - - return []interface{}{ - osmosis.SwapPacketData{ - ChannelID: ChannelID, - XcsContract: XCSContract, - Sender: senderAddress, - Input: wrongTokenPair.GetERC20Contract(), - Output: evmosTokenPair.GetERC20Contract(), - Amount: transferAmount, - SlippagePercentage: slippagePercentage, - WindowSeconds: windowSeconds, - SwapReceiver: receiver, - }, - } - }, - expError: true, - // Probably there is a better way than hardcoding the expected string - errContains: fmt.Sprintf(osmosis.ErrDenomNotSupported, []string{utils.BaseDenom, "ibc/ED07A3391A112B175915CD8FAF43A2DA8E4790EDE12566649D0C2F97716B8518"}), - }, - // All tests below requires the ibcSetup equal to true because run the query GetChannel - // that fails if the IBC channel is not open. - { - name: "fail - channel not open", - sender: senderAddress, - origin: senderAddress, - malleate: func() []interface{} { - osmoIbcDenomTrace := utils.ComputeIBCDenomTrace(PortID, ChannelID, osmosis.OsmosisDenom) - osmoTokenPair, err := testutils.RegisterIBCERC20Coins(s.unitNetwork, sender, osmoIbcDenomTrace) - s.Require().NoError(err, "expected no error during ibc erc20 registration") - - evmosTokenPair, err := testutils.RegisterEvmosERC20Coins(*s.unitNetwork, sender) - s.Require().NoError(err, "expected no error during evmos erc20 registration") - - return []interface{}{ - osmosis.SwapPacketData{ - ChannelID: ChannelID, - XcsContract: XCSContract, - Sender: senderAddress, - Input: osmoTokenPair.GetERC20Contract(), - Output: evmosTokenPair.GetERC20Contract(), - Amount: transferAmount, - SlippagePercentage: slippagePercentage, - WindowSeconds: windowSeconds, - SwapReceiver: receiver, - }, - } - }, - expError: true, - ibcSetup: false, - errContains: fmt.Sprintf("port ID (%s) channel ID (%s)", PortID, ChannelID), - }, - { - name: "fail - receiver is not a valid bech32", - sender: senderAddress, - origin: senderAddress, - malleate: func() []interface{} { - osmoIbcDenomTrace := utils.ComputeIBCDenomTrace(PortID, ChannelID, osmosis.OsmosisDenom) - osmoTokenPair, err := testutils.RegisterIBCERC20Coins(s.unitNetwork, sender, osmoIbcDenomTrace) - s.Require().NoError(err, "expected no error during ibc erc20 registration") - - evmosTokenPair, err := testutils.RegisterEvmosERC20Coins(*s.unitNetwork, sender) - s.Require().NoError(err, "expected no error during evmos erc20 registration") - - return []interface{}{ - osmosis.SwapPacketData{ - ChannelID: ChannelID, - XcsContract: XCSContract, - Sender: senderAddress, - Input: osmoTokenPair.GetERC20Contract(), - Output: evmosTokenPair.GetERC20Contract(), - Amount: transferAmount, - SlippagePercentage: slippagePercentage, - WindowSeconds: windowSeconds, - SwapReceiver: "invalidbec32", - }, - } - }, - expError: true, - ibcSetup: true, - errContains: fmt.Sprintf(osmosis.ErrReceiverAddress, "not a valid evmos address"), - }, - { - // THIS PANICS INSIDE CheckAuthzExists - name: "fail - origin different from address caller", - sender: senderAddress, - origin: s.keyring.GetAddr(1), - malleate: func() []interface{} { - osmoIbcDenomTrace := utils.ComputeIBCDenomTrace(PortID, ChannelID, osmosis.OsmosisDenom) - osmoTokenPair, err := testutils.RegisterIBCERC20Coins(s.unitNetwork, sender, osmoIbcDenomTrace) - s.Require().NoError(err, "expected no error during ibc erc20 registration") - - evmosTokenPair, err := testutils.RegisterEvmosERC20Coins(*s.unitNetwork, sender) - s.Require().NoError(err, "expected no error during evmos erc20 registration") - - return []interface{}{ - osmosis.SwapPacketData{ - ChannelID: ChannelID, - XcsContract: XCSContract, - Sender: senderAddress, - Input: osmoTokenPair.GetERC20Contract(), - Output: evmosTokenPair.GetERC20Contract(), - Amount: transferAmount, - SlippagePercentage: slippagePercentage, - WindowSeconds: windowSeconds, - SwapReceiver: receiver, - }, - } - }, - expError: true, - ibcSetup: true, - errContains: fmt.Sprintf(authorization.ErrAuthzDoesNotExistOrExpired, senderAddress, s.keyring.GetAddr(1)), - }, - { - name: "fail - ibc channel not open", - sender: senderAddress, - origin: senderAddress, - malleate: func() []interface{} { - osmoIbcDenomTrace := utils.ComputeIBCDenomTrace(PortID, ChannelID, osmosis.OsmosisDenom) - osmoTokenPair, err := testutils.RegisterIBCERC20Coins(s.unitNetwork, sender, osmoIbcDenomTrace) - s.Require().NoError(err, "expected no error during ibc erc20 registration") - - return []interface{}{ - osmosis.SwapPacketData{ - ChannelID: ChannelID, - XcsContract: XCSContract, - Sender: senderAddress, - Input: osmoTokenPair.GetERC20Contract(), - Output: common.HexToAddress(erc20.WEVMOSContractTestnet), - Amount: transferAmount, - SlippagePercentage: slippagePercentage, - WindowSeconds: windowSeconds, - SwapReceiver: receiver, - }, - } - }, - expError: true, - errContains: fmt.Sprintf("port ID (%s) channel ID (%s)", PortID, ChannelID), - }, - { - name: "pass - correct swap output ibc evmos", - sender: senderAddress, - origin: senderAddress, - malleate: func() []interface{} { - osmoIbcDenomTrace := utils.ComputeIBCDenomTrace(PortID, ChannelID, osmosis.OsmosisDenom) - osmosisTokenPair, err := testutils.RegisterIBCERC20Coins(s.unitNetwork, sender, osmoIbcDenomTrace) - s.Require().NoError(err, "expected no error during ibc erc20 registration") - - return []interface{}{ - osmosis.SwapPacketData{ - ChannelID: ChannelID, - XcsContract: XCSContract, - Sender: senderAddress, - Input: osmosisTokenPair.GetERC20Contract(), - Output: common.HexToAddress(erc20.WEVMOSContractTestnet), - Amount: transferAmount, - SlippagePercentage: slippagePercentage, - WindowSeconds: windowSeconds, - SwapReceiver: receiver, - }, - } - }, - expError: false, - ibcSetup: true, - }, - { - name: "pass - correct swap output osmo", - sender: senderAddress, - origin: senderAddress, - malleate: func() []interface{} { - _, err := testutils.RegisterEvmosERC20Coins(*s.unitNetwork, sender) - s.Require().NoError(err, "expected no error during evmos erc20 registration") - - osmoIbcDenomTrace := utils.ComputeIBCDenomTrace(PortID, ChannelID, osmosis.OsmosisDenom) - osmoTokenPair, err := testutils.RegisterIBCERC20Coins(s.unitNetwork, sender, osmoIbcDenomTrace) - s.Require().NoError(err, "expected no error during ibc erc20 registration") - - return []interface{}{ - osmosis.SwapPacketData{ - ChannelID: ChannelID, - XcsContract: XCSContract, - Sender: senderAddress, - Input: common.HexToAddress(erc20.WEVMOSContractTestnet), - Output: osmoTokenPair.GetERC20Contract(), - Amount: transferAmount, - SlippagePercentage: slippagePercentage, - WindowSeconds: windowSeconds, - SwapReceiver: receiver, - }, - } - }, - expError: false, - ibcSetup: true, - }, - } - - for _, tc := range testCases { - s.Run(tc.name, func() { - s.SetupTest() - contract := vm.NewContract(vm.AccountRef(tc.sender), s.precompile, big.NewInt(0), gas) - - stateDB := s.unitNetwork.GetStateDB() - - if tc.ibcSetup { - ibcSender, ibcSenderPrivKey := s.keyring.GetAccAddr(0), s.keyring.GetPrivKey(0) - // Account to sign IBC txs - ibcAcc, err := s.grpcHandler.GetAccount(ibcSender.String()) - s.Require().NoError(err) - - coordinator := coordinator.NewIntegrationCoordinator( - s.T(), - []commonnetwork.Network{s.unitNetwork}, - ) - - coordinator.SetDefaultSignerForChain(s.unitNetwork.GetChainID(), ibcSenderPrivKey, ibcAcc) - coordinator.Setup(s.unitNetwork.GetChainID(), coordinator.GetDummyChainsIDs()[0]) - - err = coordinator.CommitAll() - s.Require().NoError(err) - } - - _, err := s.precompile.Swap( - s.unitNetwork.GetContext(), - tc.origin, - stateDB, - contract, - &method, - tc.malleate(), - ) - if tc.expError { - s.Require().ErrorContains(err, tc.errContains) - } else { - s.Require().NoError(err) - } - }) - } -} diff --git a/precompiles/outposts/osmosis/types.go b/precompiles/outposts/osmosis/types.go deleted file mode 100644 index 28024fcdd2..0000000000 --- a/precompiles/outposts/osmosis/types.go +++ /dev/null @@ -1,345 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package osmosis - -import ( - "encoding/json" - "fmt" - "math/big" - "slices" - "strconv" - - "github.com/ethereum/go-ethereum/accounts/abi" - - sdk "github.com/cosmos/cosmos-sdk/types" - cosmosbech32 "github.com/cosmos/cosmos-sdk/types/bech32" - transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - - "github.com/ethereum/go-ethereum/common" - - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/utils" -) - -const ( - // WasmContractAddrLen defines the length of a wasm smart contract address. - // - // Reference: - // https://github.com/CosmWasm/wasmd/blob/e65480838a1ded147ef53d35fa3bd9709a61226f/x/wasm/types/types.go#L22-L23 - WasmContractAddrLen = 32 -) - -const ( - // MaxSlippagePercentage is the maximum slippage percentage that can be used in the - // definition of the slippage for the swap. - MaxSlippagePercentage uint8 = 20 - // MaxWindowSeconds is the maximum number of seconds that can be used in the - // definition of the slippage for the swap. - MaxWindowSeconds uint64 = 60 -) - -const ( - // DefaultOnFailedDelivery is the default value used for the `on_failed_delivery` field. - DefaultOnFailedDelivery = "do_nothing" -) - -const ( - // OsmosisDenom is the base denom in the Osmosis chain. - OsmosisDenom = "uosmo" -) - -// EventSwap is the event type emitted on a Swap transaction. -type EventSwap struct { - Sender common.Address - Input common.Address - Output common.Address - Amount *big.Int - Receiver string -} - -// IBCChannel contains information of port and channel of an IBC channel. -type IBCChannel struct { - PortID string - ChannelID string -} - -// NewIBCChannel return a new instance of IBCChannel. -func NewIBCChannel( - portID, channelID string, -) IBCChannel { - return IBCChannel{ - PortID: portID, - ChannelID: channelID, - } -} - -// TWAP represents a Time-Weighted Average Price configuration. -type TWAP struct { - // SlippagePercentage specifies the acceptable slippage percentage for a transaction. - SlippagePercentage string `json:"slippage_percentage"` - // WindowSeconds defines the duration for which the TWAP is calculated. - WindowSeconds uint64 `json:"window_seconds"` -} - -// Slippage specify how to compute the slippage of the swap. -type Slippage struct { - TWAP *TWAP `json:"twap"` -} - -// OsmosisSwap represents the details for a swap transaction on the Osmosis chain. -// -//nolint:revive -type OsmosisSwap struct { - // OutputDenom specifies the desired output denomination for the swap. - OutputDenom string `json:"output_denom"` - // Slippage represents the TWAP configuration for the swap. - Slippage *Slippage `json:"slippage"` - // Receiver is the address of the entity receiving the swapped amount. - Receiver string `json:"receiver"` - // OnFailedDelivery specifies the action to be taken in case the swap delivery fails. - // This can be "do_nothing" or the address on the Osmosis chain that can recover funds - // in case of errors. - OnFailedDelivery interface{} `json:"on_failed_delivery"` - // NextMemo contains any additional memo information for the next operation in a PFM setting. - NextMemo string `json:"next_memo,omitempty"` -} - -// Msg contains the OsmosisSwap details used in the memo relayed to the Osmosis IBC Wasm router. -type Msg struct { - // OsmosisSwap provides details for a swap transaction. - OsmosisSwap *OsmosisSwap `json:"osmosis_swap"` -} - -// WasmMemo wraps the message details required for the IBC packet to be valid for the Wasm router. -type WasmMemo struct { - // Contract represents the address or identifier of the contract to be called. - Contract string `json:"contract"` - // Msg contains the details of the operation to be executed on the contract. - Msg *Msg `json:"msg"` -} - -// RawPacketMetadata is the raw packet metadata used to construct a JSON string. -type RawPacketMetadata struct { - // The Osmosis outpost IBC memo content. - Wasm *WasmMemo `json:"wasm"` -} - -// RecoveryAddress is the address to send the funds in case of failed delivery. -type RecoveryAddress struct { - // The recovery address in Osmosis chain. - Address string `json:"local_recovery_addr"` -} - -// Validate performs basic validation of the IBC memo for the Osmosis outpost. -// This function assumes that memo field is parsed with ParseSwapPacketData, which -// performs data casting ensuring outputDenom cannot be an empty string. -func (r RawPacketMetadata) Validate() error { - osmosisSwap := r.Wasm.Msg.OsmosisSwap - - if r.Wasm.Contract == "" { - return fmt.Errorf(ErrEmptyContractAddress) - } - - if osmosisSwap.OnFailedDelivery == "" { - return fmt.Errorf(ErrEmptyOnFailedDelivery) - } - - // Check if account is a valid bech32 evmos address. - if _, err := sdk.AccAddressFromBech32(osmosisSwap.Receiver); err != nil { - return fmt.Errorf(ErrReceiverAddress, "not a valid evmos address") - } - - slippagePercNum, err := strconv.ParseUint(osmosisSwap.Slippage.TWAP.SlippagePercentage, 10, 8) - if err != nil { - return fmt.Errorf(ErrSlippagePercentage, "not valid slippage percentage") - } - if slippagePercNum == 0 || slippagePercNum > uint64(MaxSlippagePercentage) { - return fmt.Errorf(ErrSlippagePercentage) - } - - if osmosisSwap.Slippage.TWAP.WindowSeconds == 0 || osmosisSwap.Slippage.TWAP.WindowSeconds > MaxWindowSeconds { - return fmt.Errorf(ErrWindowSeconds) - } - - return nil -} - -// CreatePacketWithMemo creates the IBC packet with the memo for the Osmosis outpost that can be -// parsed by the ibc hook middleware, the Wasm hook, on the Osmosis chain. -func CreatePacketWithMemo( - outputDenom, receiver, contract string, - slippagePercentage uint8, - windowSeconds uint64, - onFailedDelivery interface{}, nextMemo string, -) *RawPacketMetadata { - // slippage percentage is a string in the memo field - slippagePercStr := strconv.FormatUint(uint64(slippagePercentage), 10) - return &RawPacketMetadata{ - &WasmMemo{ - Contract: contract, - Msg: &Msg{ - OsmosisSwap: &OsmosisSwap{ - OutputDenom: outputDenom, - Slippage: &Slippage{ - &TWAP{ - SlippagePercentage: slippagePercStr, - WindowSeconds: windowSeconds, - }, - }, - Receiver: receiver, - OnFailedDelivery: onFailedDelivery, - NextMemo: nextMemo, - }, - }, - }, - } -} - -// ConvertToJSON convert the RawPacketMetadata type into a JSON formatted -// string. -func (r RawPacketMetadata) String() string { - // Convert the struct to a JSON string - jsonBytes, err := json.Marshal(r) - if err != nil { - return "" - } - - return string(jsonBytes) -} - -// CreateOnFailedDeliveryField is an utility function to create the memo field -// onFailedDelivery. The returned string is the bech32 of the input or "do_nothing". -func CreateOnFailedDeliveryField(address string) interface{} { - recoveryAddress := address - bech32Prefix, addressBytes, err := cosmosbech32.DecodeAndConvert(address) - if err != nil { - return DefaultOnFailedDelivery - } - if bech32Prefix != OsmosisPrefix { - recoveryAddress, err = sdk.Bech32ifyAddressBytes(OsmosisPrefix, addressBytes) - if err != nil { - return DefaultOnFailedDelivery - } - } - - return RecoveryAddress{Address: recoveryAddress} -} - -// ValidateInputOutput validates the input and output tokens used in the Osmosis swap. -func ValidateInputOutput( - inputDenom, outputDenom, stakingDenom string, - evmosChannel IBCChannel, -) error { - if outputDenom == inputDenom { - return fmt.Errorf(ErrInputEqualOutput, inputDenom) - } - - osmoIBCDenom := utils.ComputeIBCDenom(evmosChannel.PortID, evmosChannel.ChannelID, OsmosisDenom) - - // acceptedTokens are the tokens accepted as input or output of the swap. - acceptedTokens := []string{stakingDenom, osmoIBCDenom} - - // Check that the input token is aevmos or uosmo. - if !slices.Contains(acceptedTokens, inputDenom) { - return fmt.Errorf(ErrDenomNotSupported, acceptedTokens) - } - - // Check that the output token is aevmos or uosmo. - if !slices.Contains(acceptedTokens, outputDenom) { - return fmt.Errorf(ErrDenomNotSupported, acceptedTokens) - } - - return nil -} - -// ConvertToOsmosisRepresentation returns the Osmosis representation of the denom from the Evmos -// representation of aevmos and uosmo. Return an error if the denom is different from one these two. -func ConvertToOsmosisRepresentation( - denom, stakingDenom string, - evmosChannel, osmosisChannel IBCChannel, -) (denomOsmosis string, err error) { - osmoIBCDenom := utils.ComputeIBCDenom( - evmosChannel.PortID, - evmosChannel.ChannelID, - OsmosisDenom, - ) - - switch denom { - case osmoIBCDenom: - denomOsmosis = OsmosisDenom - case stakingDenom: - denomPrefix := transfertypes.GetPrefixedDenom( - osmosisChannel.PortID, - osmosisChannel.ChannelID, - denom, - ) - denomTrace := transfertypes.ParseDenomTrace(denomPrefix) - denomOsmosis = denomTrace.IBCDenom() - default: - err = fmt.Errorf(ErrDenomNotSupported, []string{stakingDenom, osmoIBCDenom}) - } - return denomOsmosis, err -} - -// ValidateOsmosisContractAddress validate the input to be an Osmosis CosmWasm contract address. -func ValidateOsmosisContractAddress(contractAddress string) (err error) { - bech32Prefix, addressBytes, err := cosmosbech32.DecodeAndConvert(contractAddress) - if err != nil { - return fmt.Errorf(ErrInvalidContractAddress + ", error with bech32 decoding") - } - if bech32Prefix != OsmosisPrefix { - _, err = sdk.Bech32ifyAddressBytes(OsmosisPrefix, addressBytes) - if err != nil { - return fmt.Errorf(ErrInvalidContractAddress + ", not osmo bech32") - } - } - - if len(addressBytes) != WasmContractAddrLen { - return fmt.Errorf(ErrInvalidContractAddress) - } - return err -} - -// SwapPacketData is a utility structure used to wrap args received by the -// Solidity interface of the Swap function. -type SwapPacketData struct { - ChannelID string `abi:"channelID"` // the channel ID for the ICS20 transfer - XcsContract string `abi:"xcsContract"` // the address of the Osmosis CosmWasm contract - Sender common.Address `abi:"sender"` // the sender of the swap transaction - Input common.Address `abi:"input"` // the input token to be swapped - Output common.Address `abi:"output"` // the output token to be swapped - Amount *big.Int `abi:"amount"` // the amount to be swapped - SlippagePercentage uint8 `abi:"slippagePercentage"` // the slippage percentage for the swap - WindowSeconds uint64 `abi:"windowSeconds"` // the window seconds for the swap - SwapReceiver string `abi:"swapReceiver"` // the receiver of the swapped amount -} - -// SwapPayload is the same as the expected input of the Swap function in the Solidity interface. -type SwapPayload struct { - SwapPacketData SwapPacketData -} - -// ValidateBasic performs basic validation of the SwapPacketData. -func (s SwapPacketData) ValidateBasic() error { - return ValidateOsmosisContractAddress(s.XcsContract) -} - -// ParseSwapPacketData parses the packet data from the outpost precompiled contract. -func ParseSwapPacketData(method *abi.Method, args []interface{}) (SwapPacketData, error) { - if len(args) != 1 { - return SwapPacketData{}, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 1, len(args)) - } - - var swapPayload SwapPayload - if err := method.Inputs.Copy(&swapPayload, args); err != nil { - return SwapPacketData{}, fmt.Errorf("error while unpacking args to SwapPayload struct: %s", err) - } - - // Perform validation of the SwapPacketData. - if err := swapPayload.SwapPacketData.ValidateBasic(); err != nil { - return SwapPacketData{}, err - } - - return swapPayload.SwapPacketData, nil -} diff --git a/precompiles/outposts/osmosis/types_test.go b/precompiles/outposts/osmosis/types_test.go deleted file mode 100644 index 3a7e539f06..0000000000 --- a/precompiles/outposts/osmosis/types_test.go +++ /dev/null @@ -1,512 +0,0 @@ -package osmosis_test - -import ( - "fmt" - "math/big" - "testing" - - "github.com/ethereum/go-ethereum/common" - "github.com/stretchr/testify/require" - - cmn "github.com/evmos/evmos/v18/precompiles/common" - osmosisoutpost "github.com/evmos/evmos/v18/precompiles/outposts/osmosis" - "github.com/evmos/evmos/v18/utils" -) - -func TestCreatePacketWithMemo(t *testing.T) { - t.Parallel() - - contract := "evmos1vl0x3xr0zwgrllhdzxxlkal7txnnk56q3552x7" - receiver := "evmos1vl0x3xr0zwgrllhdzxxlkal7txnnk56q3552x7" - doNothing := "do_nothing" - - testCases := []struct { - name string - outputDenom string - receiver string - contract string - slippagePercentage uint8 - windowSeconds uint64 - onFailedDelivery interface{} - nextMemo string - expMemo string - }{ - { - name: "pass - correct string without memo", - outputDenom: utils.BaseDenom, - receiver: receiver, - contract: contract, - slippagePercentage: 10, - windowSeconds: 30, - onFailedDelivery: doNothing, - nextMemo: "", - expMemo: "{\"wasm\":{\"contract\":\"evmos1vl0x3xr0zwgrllhdzxxlkal7txnnk56q3552x7\",\"msg\":{\"osmosis_swap\":{\"output_denom\":\"aevmos\",\"slippage\":{\"twap\":{\"slippage_percentage\":\"10\",\"window_seconds\":30}},\"receiver\":\"evmos1vl0x3xr0zwgrllhdzxxlkal7txnnk56q3552x7\",\"on_failed_delivery\":\"do_nothing\"}}}}", - }, - { - name: "pass - correct string with memo", - outputDenom: utils.BaseDenom, - receiver: receiver, - contract: contract, - slippagePercentage: 10, - windowSeconds: 30, - onFailedDelivery: doNothing, - nextMemo: "a next memo", - expMemo: "{\"wasm\":{\"contract\":\"evmos1vl0x3xr0zwgrllhdzxxlkal7txnnk56q3552x7\",\"msg\":{\"osmosis_swap\":{\"output_denom\":\"aevmos\",\"slippage\":{\"twap\":{\"slippage_percentage\":\"10\",\"window_seconds\":30}},\"receiver\":\"evmos1vl0x3xr0zwgrllhdzxxlkal7txnnk56q3552x7\",\"on_failed_delivery\":\"do_nothing\",\"next_memo\":\"a next memo\"}}}}", - }, - { - name: "pass - correct string with memo and recovery address", - outputDenom: utils.BaseDenom, - receiver: receiver, - contract: contract, - slippagePercentage: 10, - windowSeconds: 30, - onFailedDelivery: osmosisoutpost.RecoveryAddress{"osmo1g8j7tgfam7kmj86zks5rcfxruf9lzp87u8mwdf"}, - nextMemo: "a next memo", - expMemo: "{\"wasm\":{\"contract\":\"evmos1vl0x3xr0zwgrllhdzxxlkal7txnnk56q3552x7\",\"msg\":{\"osmosis_swap\":{\"output_denom\":\"aevmos\",\"slippage\":{\"twap\":{\"slippage_percentage\":\"10\",\"window_seconds\":30}},\"receiver\":\"evmos1vl0x3xr0zwgrllhdzxxlkal7txnnk56q3552x7\",\"on_failed_delivery\":{\"local_recovery_addr\":\"osmo1g8j7tgfam7kmj86zks5rcfxruf9lzp87u8mwdf\"},\"next_memo\":\"a next memo\"}}}}", - }, - } - - for _, tc := range testCases { - tc := tc - - t.Run(tc.name, func(t *testing.T) { - t.Parallel() - - packet := osmosisoutpost.CreatePacketWithMemo( - tc.outputDenom, tc.receiver, tc.contract, tc.slippagePercentage, tc.windowSeconds, tc.onFailedDelivery, tc.nextMemo, - ) - memo := packet.String() - require.Equal(t, tc.expMemo, memo) - err := ValidateAndParseWasmRoutedMemo(memo, tc.receiver) - require.NoError(t, err, "memo is not a valid wasm routed JSON formatted string") - }) - - } -} - -// TestParseSwapPacketData is mainly to test that the returned error of the -// parser is clear and contains the correct data type. For this reason the -// expected error has been hardcoded as a string litera. -func (s *PrecompileTestSuite) TestParseSwapPacketData() { - sender := common.HexToAddress("sender") - input := common.HexToAddress("input") - output := common.HexToAddress("output") - amount := big.NewInt(3) - slippagePercentage := uint8(10) - windowSeconds := uint64(20) - receiver := "evmos1vl0x3xr0zwgrllhdzxxlkal7txnnk56q3552x7" - - testCases := []struct { - name string - args []interface{} - expPass bool - errContains string - }{ - { - name: "pass - valid payload of type SwapPayload", - args: []interface{}{ - osmosisoutpost.SwapPacketData{ - ChannelID: ChannelID, - XcsContract: XCSContract, - Sender: sender, - Input: input, - Output: output, - Amount: amount, - SlippagePercentage: slippagePercentage, - WindowSeconds: windowSeconds, - SwapReceiver: receiver, - }, - }, - expPass: true, - }, - { - name: "fail - invalid number of args", - args: []interface{}{}, - expPass: false, - errContains: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 1, 0), - }, - } - - for _, tc := range testCases { - tc := tc - - s.Run(tc.name, func() { - method := s.precompile.Methods[osmosisoutpost.SwapMethod] - - swapPacketData, err := osmosisoutpost.ParseSwapPacketData(&method, tc.args) - - if tc.expPass { - s.NoError(err, "expected no error while creating memo") - s.Equal( - osmosisoutpost.SwapPacketData{ - ChannelID: ChannelID, - XcsContract: XCSContract, - Sender: sender, - Input: input, - Output: output, - Amount: amount, - SlippagePercentage: slippagePercentage, - WindowSeconds: windowSeconds, - SwapReceiver: receiver, - }, - swapPacketData, - ) - } else { - s.Error(err, "expected error while validating the memo") - s.Contains(err.Error(), tc.errContains, "expected different error") - } - }) - } -} - -func TestValidateMemo(t *testing.T) { - t.Parallel() - - receiver := "evmos1vl0x3xr0zwgrllhdzxxlkal7txnnk56q3552x7" - contract := "osmo1a34wxsxjwvtz3ua4hnkh4lv3d4qrgry0fhkasppplphwu5k538tqcyms9x" - onFailedDelivery := "do_nothing" - slippagePercentage := uint8(10) - windowSeconds := uint64(30) - // Variable used for the memo that are not parameters for the tests. - output := "output" - nextMemo := "" - - testCases := []struct { - name string - receiver string - contractAddress string - onFailedDelivery string - slippagePercentage uint8 - windowSeconds uint64 - expPass bool - errContains string - }{ - { - name: "success - valid packet", - receiver: receiver, - contractAddress: contract, - onFailedDelivery: onFailedDelivery, - slippagePercentage: slippagePercentage, - windowSeconds: windowSeconds, - expPass: true, - }, { - name: "fail - not evmos bech32", - receiver: "cosmos1c2m73hdt6f37w9jqpqps5t3ha3st99dcsp7lf5", - contractAddress: contract, - onFailedDelivery: onFailedDelivery, - slippagePercentage: slippagePercentage, - windowSeconds: windowSeconds, - expPass: false, - errContains: fmt.Sprintf(osmosisoutpost.ErrReceiverAddress, "not a valid evmos address"), - }, { - name: "fail - not bech32", - receiver: "cosmos", - contractAddress: contract, - onFailedDelivery: onFailedDelivery, - slippagePercentage: slippagePercentage, - windowSeconds: windowSeconds, - expPass: false, - errContains: fmt.Sprintf(osmosisoutpost.ErrReceiverAddress, "not a valid evmos address"), - }, { - name: "fail - empty receiver", - receiver: "", - contractAddress: contract, - onFailedDelivery: onFailedDelivery, - slippagePercentage: slippagePercentage, - windowSeconds: windowSeconds, - expPass: false, - errContains: fmt.Sprintf(osmosisoutpost.ErrReceiverAddress, "not a valid evmos address"), - }, { - name: "fail - on failed delivery empty", - receiver: receiver, - contractAddress: contract, - onFailedDelivery: "", - slippagePercentage: slippagePercentage, - windowSeconds: windowSeconds, - expPass: false, - errContains: fmt.Sprintf(osmosisoutpost.ErrEmptyOnFailedDelivery), - }, { - name: "fail - over max slippage percentage", - receiver: receiver, - contractAddress: contract, - onFailedDelivery: onFailedDelivery, - slippagePercentage: osmosisoutpost.MaxSlippagePercentage + 1, - windowSeconds: windowSeconds, - expPass: false, - errContains: fmt.Sprintf(osmosisoutpost.ErrSlippagePercentage), - }, { - name: "fail - zero slippage percentage", - receiver: receiver, - contractAddress: contract, - onFailedDelivery: onFailedDelivery, - slippagePercentage: 0, - windowSeconds: windowSeconds, - expPass: false, - errContains: fmt.Sprintf(osmosisoutpost.ErrSlippagePercentage), - }, { - name: "fail - over max window seconds", - receiver: receiver, - contractAddress: contract, - onFailedDelivery: onFailedDelivery, - slippagePercentage: slippagePercentage, - windowSeconds: osmosisoutpost.MaxWindowSeconds + 1, - expPass: false, - errContains: fmt.Sprintf(osmosisoutpost.ErrWindowSeconds), - }, { - name: "fail - zero window seconds", - receiver: receiver, - contractAddress: contract, - onFailedDelivery: onFailedDelivery, - slippagePercentage: slippagePercentage, - windowSeconds: 0, - expPass: false, - errContains: fmt.Sprintf(osmosisoutpost.ErrWindowSeconds), - }, { - name: "fail - empty contract address", - receiver: receiver, - contractAddress: "", - onFailedDelivery: onFailedDelivery, - slippagePercentage: slippagePercentage, - windowSeconds: windowSeconds, - expPass: false, - errContains: fmt.Sprintf(osmosisoutpost.ErrEmptyContractAddress), - }, - } - - for _, tc := range testCases { - tc := tc - - t.Run(tc.name, func(t *testing.T) { - t.Parallel() - - packet := osmosisoutpost.CreatePacketWithMemo( - output, tc.receiver, tc.contractAddress, tc.slippagePercentage, tc.windowSeconds, tc.onFailedDelivery, nextMemo, - ) - - err := packet.Validate() - - if tc.expPass { - require.NoError(t, err, "expected no error while creating memo") - } else { - require.Error(t, err, "expected error while validating the memo") - require.Contains(t, err.Error(), tc.errContains, "expected different error") - } - }) - } -} - -func TestValidateInputOutput(t *testing.T) { - t.Parallel() - - portID := "transfer" - channelID := "channel-0" - uosmosDenom := utils.ComputeIBCDenom(portID, channelID, osmosisoutpost.OsmosisDenom) - validInputs := []string{utils.BaseDenom, uosmosDenom} - - testCases := []struct { - name string - inputDenom string - outputDenom string - stakingDenom string - portID string - channelID string - expPass bool - errContains string - }{ - { - name: "pass - correct input and output", - inputDenom: utils.BaseDenom, - outputDenom: uosmosDenom, - stakingDenom: utils.BaseDenom, - portID: portID, - channelID: channelID, - expPass: true, - }, - { - name: "fail - input equal to output aevmos", - inputDenom: utils.BaseDenom, - outputDenom: utils.BaseDenom, - stakingDenom: utils.BaseDenom, - portID: portID, - channelID: channelID, - expPass: false, - errContains: fmt.Sprintf(osmosisoutpost.ErrInputEqualOutput, utils.BaseDenom), - }, - { - name: "fail - input equal to output ibc osmo", - inputDenom: uosmosDenom, - outputDenom: uosmosDenom, - stakingDenom: utils.BaseDenom, - portID: portID, - channelID: channelID, - expPass: false, - errContains: fmt.Sprintf(osmosisoutpost.ErrInputEqualOutput, uosmosDenom), - }, - { - name: "fail - invalid input", - inputDenom: "token", - outputDenom: uosmosDenom, - stakingDenom: utils.BaseDenom, - portID: portID, - channelID: channelID, - expPass: false, - errContains: fmt.Sprintf(osmosisoutpost.ErrDenomNotSupported, validInputs), - }, - } - - for _, tc := range testCases { - tc := tc - - t.Run(tc.name, func(t *testing.T) { - t.Parallel() - - evmosChannel := osmosisoutpost.NewIBCChannel(tc.portID, tc.channelID) - - err := osmosisoutpost.ValidateInputOutput(tc.inputDenom, tc.outputDenom, tc.stakingDenom, evmosChannel) - if tc.expPass { - require.NoError(t, err, "expected no error while creating memo") - } else { - require.Error(t, err, "expected error while validating the memo") - require.Contains(t, err.Error(), tc.errContains, "expected different error") - } - }) - } -} - -func TestCreateOnFailedDeliveryField(t *testing.T) { - t.Parallel() - - address := "osmo1c2m73hdt6f37w9jqpqps5t3ha3st99dcc6d0lx" - testCases := []struct { - name string - address string - expRes interface{} - }{ - { - name: "receiver osmo bech32", - address: address, - expRes: osmosisoutpost.RecoveryAddress{address}, - }, - { - name: "use default do_nothing", - address: "not_bech_32", - expRes: osmosisoutpost.DefaultOnFailedDelivery, - }, - { - name: "convert receiver to osmo bech32", - address: "cosmos1c2m73hdt6f37w9jqpqps5t3ha3st99dcsp7lf5", - expRes: osmosisoutpost.RecoveryAddress{address}, - }, - } - - for _, tc := range testCases { - tc := tc - - t.Run(tc.name, func(t *testing.T) { - t.Parallel() - - onFailedDelivery := osmosisoutpost.CreateOnFailedDeliveryField(tc.address) - require.Equal(t, onFailedDelivery, tc.expRes) - }) - } -} - -func TestConvertToOsmosisRepresentation(t *testing.T) { - t.Parallel() - - portID := "transfer" - channelID := "channel-0" - osmoIBCDenom := utils.ComputeIBCDenom(portID, channelID, osmosisoutpost.OsmosisDenom) - evmosChannel := osmosisoutpost.NewIBCChannel(portID, channelID) - osmosisChannel := osmosisoutpost.NewIBCChannel(portID, channelID) - - testCases := []struct { - name string - denom string - expPass bool - expDenom string - errContains string - }{ - { - name: "pass - correct conversion of aevmos", - denom: utils.BaseDenom, - expPass: true, - expDenom: "ibc/8EAC8061F4499F03D2D1419A3E73D346289AE9DB89CAB1486B72539572B1915E", - }, { - name: "pass - correct conversion of ibc uosmo", - denom: osmoIBCDenom, - expPass: true, - expDenom: "uosmo", - }, { - name: "fail - not allowed token", - denom: "token", - expPass: false, - errContains: fmt.Sprintf(osmosisoutpost.ErrDenomNotSupported, []string{utils.BaseDenom, osmoIBCDenom}), - }, - } - - for _, tc := range testCases { - tc := tc - - t.Run(tc.name, func(t *testing.T) { - t.Parallel() - - denom, err := osmosisoutpost.ConvertToOsmosisRepresentation(tc.denom, utils.BaseDenom, evmosChannel, osmosisChannel) - if tc.expPass { - require.NoError(t, err, "expected no error while creating memo") - require.Equal(t, denom, tc.expDenom) - } else { - require.Error(t, err, "expected error while validating the memo") - require.Contains(t, err.Error(), tc.errContains, "expected different error") - } - }) - } -} - -func TestValidateOsmosisContractAddress(t *testing.T) { - testCases := []struct { - name string - contractAddress string - expPass bool - errContains string - }{ - { - name: "fail - empty contract address", - contractAddress: "", - expPass: false, - errContains: fmt.Sprintf(osmosisoutpost.ErrInvalidContractAddress), - }, - { - name: "pass - not contract address", - contractAddress: "osmo1qql8ag4cluz6r4dz28p3w00dnc9w8ueuhnecd2", - expPass: false, - errContains: fmt.Sprintf(osmosisoutpost.ErrInvalidContractAddress), - }, - { - name: "fail - not osmosis smart contract", - contractAddress: "evmos18rj46qcpr57m3qncrj9cuzm0gn3km08w5jxxlnw002c9y7xex5xsu74ytz", - expPass: false, - errContains: fmt.Sprintf(osmosisoutpost.ErrInvalidContractAddress), - }, - { - name: "pass - valid contract address", - contractAddress: "osmo1a34wxsxjwvtz3ua4hnkh4lv3d4qrgry0fhkasppplphwu5k538tqcyms9x", - expPass: true, - }, - } - - for _, tc := range testCases { - tc := tc - - t.Run(tc.name, func(t *testing.T) { - err := osmosisoutpost.ValidateOsmosisContractAddress(tc.contractAddress) - if tc.expPass { - require.NoError(t, err, "expected no error while validating the contract address") - } else { - require.Error(t, err, "expected error while validating the contract address") - require.Contains(t, err.Error(), tc.errContains) - } - }) - - } -} diff --git a/precompiles/outposts/osmosis/utils_test.go b/precompiles/outposts/osmosis/utils_test.go deleted file mode 100644 index 8b5e3f9708..0000000000 --- a/precompiles/outposts/osmosis/utils_test.go +++ /dev/null @@ -1,92 +0,0 @@ -package osmosis_test - -import ( - "encoding/json" - "fmt" - - sdk "github.com/cosmos/cosmos-sdk/types" -) - -// jsonStringHasKey parses the memo as a json object and checks if it contains the key. -// -// This function comes from the Osmosis' Wasm hook: -// https://github.com/osmosis-labs/osmosis/blob/6a28004ab7bf98f21ec22ad9f5e4dcbba78dfa76/x/ibc-hooks/wasm_hook.go#L158-L182 -func jsonStringHasKey(memo, key string) (found bool, jsonObject map[string]interface{}) { - jsonObject = make(map[string]interface{}) - - // If there is no memo, the packet was either sent with an earlier version of IBC, or the memo was - // intentionally left blank. Nothing to do here. Ignore the packet and pass it down the stack. - if len(memo) == 0 { - return false, jsonObject - } - - // the jsonObject must be a valid JSON object - err := json.Unmarshal([]byte(memo), &jsonObject) - if err != nil { - return false, jsonObject - } - - // If the key doesn't exist, there's nothing to do on this hook. Continue by passing the packet - // down the stack - _, ok := jsonObject[key] - if !ok { - return false, jsonObject - } - - return true, jsonObject -} - -// ValidateAndParseWasmRoutedMemo check that the given memo is a JSON formatted string and that it -// contains the required keys and fields to be correctly routed by the Osmosis' Wasm hook. -// -// This function is a readjustment of the Osmosis' Wasm hook: -// https://github.com/osmosis-labs/osmosis/blob/6a28004ab7bf98f21ec22ad9f5e4dcbba78dfa76/x/ibc-hooks/wasm_hook.go#L184-L241 -func ValidateAndParseWasmRoutedMemo( - packet string, - receiver string, -) (err error) { - isWasm, metadata := jsonStringHasKey(packet, "wasm") - if !isWasm { - return fmt.Errorf("string is not a valid wasm targeted memo") - } - - wasmRaw := metadata["wasm"] - wasm, ok := wasmRaw.(map[string]interface{}) - if !ok { - return fmt.Errorf("error in getting the wasm field") - } - - contract, ok := wasm["contract"].(string) - if !ok { - return fmt.Errorf(`could not find key wasm["contract"]`) - } - - _, err = sdk.AccAddressFromBech32(contract) - if err != nil { - return fmt.Errorf(`wasm["contract"] is not a valid bech32 address`) - } - - // The contract and the receiver should be the same for the packet to be valid - if contract != receiver { - return fmt.Errorf(`wasm["contract"] should be the same as the receiver of the packet`) - } - - // Ensure the message key is provided - if wasm["msg"] == nil { - return fmt.Errorf(`could not find key wasm["msg"]`) - } - - // Make sure the msg key is a map. If it isn't, return an error - _, ok = wasm["msg"].(map[string]interface{}) - if !ok { - return fmt.Errorf(`wasm["msg"] is not a map object`) - } - - // Get the message string by serializing the map - _, err = json.Marshal(wasm["msg"]) - if err != nil { - return err - } - - return nil -} diff --git a/precompiles/outposts/stride/IStrideOutpost.sol b/precompiles/outposts/stride/IStrideOutpost.sol deleted file mode 100644 index febeba3d2b..0000000000 --- a/precompiles/outposts/stride/IStrideOutpost.sol +++ /dev/null @@ -1,87 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity >=0.8.18; - -import "../../common/Types.sol"; - -/// @dev The Stride Outpost contract's address. -address constant STRIDE_OUTPOST_ADDRESS = 0x0000000000000000000000000000000000000900; - -/// @dev The Stride Outpost contract's instance. -IStrideOutpost constant STRIDE_OUTPOST_CONTRACT = IStrideOutpost( - STRIDE_OUTPOST_ADDRESS -); - -/// @dev AutopilotParams is a struct containing the parameters for the liquid stake and redeem transactions. -/// @param channelID - The channel ID of the IBC channel that will be used to execute the transaction. -/// @param sender - The address on the Evmos chain that will liquid stake or send LSD. -/// @param receiver - The address on the Evmos chain that will redeem or receive LSD. -/// @param token - The address of the ERC-20 token pair that will be liquid staked or redeemed. -/// @param amount - The amount of tokens that will be liquid staked or redeemed. -/// @param strideForwarder - The bech32-formatted address on the Stride chain that will be used to execute -/// LiquidStake or Redeem transactions. -struct AutopilotParams { - string channelID; - address sender; - address receiver; - address token; - uint256 amount; - string strideForwarder; -} - - -/// @author Evmos Team -/// @title StrideOutpost Precompiled Contract -/// @dev The interface through which solidity contracts will interact with Stride Outpost that uses ICS20 under the hood -/// @custom:address 0x0000000000000000000000000000000000000900 -interface IStrideOutpost { - /// @dev Emitted when an ICS-20 transfer is executed. - /// @param sender The address of the sender. - /// @param receiver The address of the receiver. - /// @param sourcePort The source port of the IBC transaction. - /// @param sourceChannel The source channel of the IBC transaction. - /// @param denom The denomination of the tokens transferred. - /// @param amount The amount of tokens transferred. - /// @param memo The IBC transaction memo. - event IBCTransfer( - address indexed sender, - string indexed receiver, - string sourcePort, - string sourceChannel, - string denom, - uint256 amount, - string memo - ); - - /// @dev Emitted on a LiquidStake transaction. - /// @param sender The address of the sender. - /// @param token The address of the ERC-20 token pair. - /// @param amount The amount of tokens that were liquid staked. - event LiquidStake( - address indexed sender, - address indexed token, - uint256 amount - ); - - /// @dev Emitted on a Redeem transaction. - /// @param sender The address of the sender. - /// @param receiver The address of the receiver on the Evmos chain. - /// @param token The token to be un-luquid staked. - /// @param strideForwarder The bech32-formatted address of the receiver on the Stride chain. - /// @param amount The amount of tokens to unstake. - event RedeemStake( - address indexed sender, - address indexed receiver, - address indexed token, - string strideForwarder, - uint256 amount - ); - - /// @dev Liquid stake a native Coin on the Stride chain and return it to the Evmos chain. - /// @param payload The AutopilotParams struct containing the parameters for the liquid stake transaction. - function liquidStake(AutopilotParams calldata payload) external returns (bool success); - - /// @dev This method unstakes the LSD Coin (ex. stEvmos, stAtom) and redeems - /// the native Coin by sending an ICS20 Transfer to the specified chain. - /// @param payload The AutopilotParams struct containing the parameters for the redeem stake transaction. - function redeemStake(AutopilotParams calldata payload) external returns (bool success); -} \ No newline at end of file diff --git a/precompiles/outposts/stride/abi.json b/precompiles/outposts/stride/abi.json deleted file mode 100644 index 1b48d74c56..0000000000 --- a/precompiles/outposts/stride/abi.json +++ /dev/null @@ -1,215 +0,0 @@ -[ - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "indexed": true, - "internalType": "string", - "name": "receiver", - "type": "string" - }, - { - "indexed": false, - "internalType": "string", - "name": "sourcePort", - "type": "string" - }, - { - "indexed": false, - "internalType": "string", - "name": "sourceChannel", - "type": "string" - }, - { - "indexed": false, - "internalType": "string", - "name": "denom", - "type": "string" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "string", - "name": "memo", - "type": "string" - } - ], - "name": "IBCTransfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "LiquidStake", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "receiver", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "indexed": false, - "internalType": "string", - "name": "strideForwarder", - "type": "string" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "RedeemStake", - "type": "event" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "string", - "name": "channelID", - "type": "string" - }, - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "receiver", - "type": "address" - }, - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "string", - "name": "strideForwarder", - "type": "string" - } - ], - "internalType": "struct AutopilotParams", - "name": "payload", - "type": "tuple" - } - ], - "name": "liquidStake", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "string", - "name": "channelID", - "type": "string" - }, - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "receiver", - "type": "address" - }, - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "string", - "name": "strideForwarder", - "type": "string" - } - ], - "internalType": "struct AutopilotParams", - "name": "payload", - "type": "tuple" - } - ], - "name": "redeemStake", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } -] \ No newline at end of file diff --git a/precompiles/outposts/stride/errors.go b/precompiles/outposts/stride/errors.go deleted file mode 100644 index 2f97246873..0000000000 --- a/precompiles/outposts/stride/errors.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package stride - -const ( - // ErrTokenPairNotFound is the error returned when a token pair is not found - // #nosec G101 - ErrTokenPairNotFound = "token pair not found for %s" - // ErrUnsupportedToken is the error returned when a token is not supported - ErrUnsupportedToken = "unsupported token %s. The only supported token contract for Stride Outpost v1 is %s" - // ErrRedeemStakeEmptyIBCReceiver is the error returned when the receiver is empty - ErrRedeemStakeEmptyIBCReceiver = "IBCReceiver cannot be empty when action is RedeemStake" - // ErrEmptyReceiver is the error returned when the receiver is empty - ErrEmptyReceiver = "receiver cannot be empty" - // ErrEmptyAutopilotAction is the error returned when the autopilot action is empty - ErrEmptyAutopilotAction = "autopilot action cannot be empty" - // ErrZeroOrNegativeAmount is the error returned when the amount is zero or negative - ErrZeroOrNegativeAmount = "amount must be greater than zero" -) diff --git a/precompiles/outposts/stride/events.go b/precompiles/outposts/stride/events.go deleted file mode 100644 index 2dc8b97ab3..0000000000 --- a/precompiles/outposts/stride/events.go +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package stride - -import ( - "math/big" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/common" - ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v18/precompiles/common" -) - -const ( - // EventTypeLiquidStake is the event type emitted on a liquidStake transaction to Autopilot on Stride. - EventTypeLiquidStake = "LiquidStake" - // EventTypeRedeemStake is the event type emitted on a redeem transaction to Autopilot on Stride. - EventTypeRedeemStake = "RedeemStake" -) - -// EmitLiquidStakeEvent creates a new LiquidStake event on the EVM stateDB. -func (p Precompile) EmitLiquidStakeEvent( - ctx sdk.Context, - stateDB vm.StateDB, - sender, token common.Address, - amount *big.Int, -) error { - // Prepare the event topics - event := p.ABI.Events[EventTypeLiquidStake] - topics := make([]common.Hash, 3) - - // The first topic is always the signature of the event. - topics[0] = event.ID - - var err error - // sender and token are indexed - topics[1], err = cmn.MakeTopic(sender) - if err != nil { - return err - } - - topics[2], err = cmn.MakeTopic(token) - if err != nil { - return err - } - - // Prepare the event data: amount - arguments := abi.Arguments{event.Inputs[2]} - packed, err := arguments.Pack(amount) - if err != nil { - return err - } - - stateDB.AddLog(ðtypes.Log{ - Address: p.Address(), - Topics: topics, - Data: packed, - BlockNumber: uint64(ctx.BlockHeight()), - }) - - return nil -} - -// EmitRedeemStakeEvent creates a new RedeemStake event on the EVM stateDB. -func (p Precompile) EmitRedeemStakeEvent( - ctx sdk.Context, - stateDB vm.StateDB, - sender, - token, receiver common.Address, - strideForwarder string, - amount *big.Int, -) error { - // Prepare the event topics - event := p.ABI.Events[EventTypeRedeemStake] - topics := make([]common.Hash, 4) - - // The first topic is always the signature of the event. - topics[0] = event.ID - - var err error - // sender and token are indexed - topics[1], err = cmn.MakeTopic(sender) - if err != nil { - return err - } - - topics[2], err = cmn.MakeTopic(receiver) - if err != nil { - return err - } - - topics[3], err = cmn.MakeTopic(token) - if err != nil { - return err - } - - // Prepare the event data: receiver, amount - arguments := abi.Arguments{event.Inputs[3], event.Inputs[4]} - packed, err := arguments.Pack(strideForwarder, amount) - if err != nil { - return err - } - - stateDB.AddLog(ðtypes.Log{ - Address: p.Address(), - Topics: topics, - Data: packed, - BlockNumber: uint64(ctx.BlockHeight()), - }) - - return nil -} diff --git a/precompiles/outposts/stride/events_test.go b/precompiles/outposts/stride/events_test.go deleted file mode 100644 index 30413597e0..0000000000 --- a/precompiles/outposts/stride/events_test.go +++ /dev/null @@ -1,117 +0,0 @@ -package stride_test - -import ( - "fmt" - "math/big" - - transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - - "github.com/ethereum/go-ethereum/common" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/precompiles/outposts/stride" - "github.com/evmos/evmos/v18/utils" -) - -const receiver = "stride1rhe5leyt5w0mcwd9rpp93zqn99yktsxvyaqgd0" - -func (s *PrecompileTestSuite) TestLiquidStakeEvent() { - ctx := s.network.GetContext() - stateDB := s.network.GetStateDB() - denomID := s.network.App.Erc20Keeper.GetDenomMap(ctx, utils.BaseDenom) - tokenPair, ok := s.network.App.Erc20Keeper.GetTokenPair(ctx, denomID) - s.Require().True(ok, "expected token pair to be found") - - testCases := []struct { - name string - postCheck func() - }{ - { - "success", - func() { - liquidStakeLog := stateDB.Logs()[0] - s.Require().Equal(liquidStakeLog.Address, s.precompile.Address()) - // Check event signature matches the one emitted - event := s.precompile.ABI.Events[stride.EventTypeLiquidStake] - s.Require().Equal(event.ID, common.HexToHash(liquidStakeLog.Topics[0].Hex())) - s.Require().Equal(liquidStakeLog.BlockNumber, uint64(ctx.BlockHeight())) - - var liquidStakeEvent stride.EventLiquidStake - err := cmn.UnpackLog(s.precompile.ABI, &liquidStakeEvent, stride.EventTypeLiquidStake, *liquidStakeLog) - s.Require().NoError(err) - s.Require().Equal(common.BytesToAddress(s.keyring.GetAccAddr(0)), liquidStakeEvent.Sender) - s.Require().Equal(common.HexToAddress(tokenPair.Erc20Address), liquidStakeEvent.Token) - s.Require().Equal(big.NewInt(1e18), liquidStakeEvent.Amount) - }, - }, - } - - for _, tc := range testCases { - s.Run(tc.name, func() { - s.SetupTest() - - err := s.precompile.EmitLiquidStakeEvent(ctx, stateDB, s.keyring.GetAddr(0), common.HexToAddress(tokenPair.Erc20Address), big.NewInt(1e18)) - s.Require().NoError(err) - tc.postCheck() - }) - } -} - -func (s *PrecompileTestSuite) TestRedeemEvent() { - ctx := s.network.GetContext() - stateDB := s.network.GetStateDB() - bondDenom := s.network.App.StakingKeeper.BondDenom(ctx) - denomTrace := transfertypes.DenomTrace{ - Path: fmt.Sprintf("%s/%s", portID, channelID), - BaseDenom: "st" + bondDenom, - } - - stEvmos := denomTrace.IBCDenom() - - denomID := s.network.App.Erc20Keeper.GetDenomMap(ctx, stEvmos) - tokenPair, ok := s.network.App.Erc20Keeper.GetTokenPair(ctx, denomID) - s.Require().True(ok, "expected token pair to be found") - - testCases := []struct { - name string - postCheck func() - }{ - { - "success", - func() { - redeemLog := stateDB.Logs()[0] - s.Require().Equal(redeemLog.Address, s.precompile.Address()) - // Check event signature matches the one emitted - event := s.precompile.ABI.Events[stride.EventTypeRedeemStake] - s.Require().Equal(event.ID, common.HexToHash(redeemLog.Topics[0].Hex())) - s.Require().Equal(redeemLog.BlockNumber, uint64(ctx.BlockHeight())) - - var redeemEvent stride.EventRedeem - err := cmn.UnpackLog(s.precompile.ABI, &redeemEvent, stride.EventTypeRedeemStake, *redeemLog) - s.Require().NoError(err) - s.Require().Equal(common.BytesToAddress(s.keyring.GetAccAddr(0)), redeemEvent.Sender) - s.Require().Equal(common.HexToAddress(tokenPair.Erc20Address), redeemEvent.Token) - s.Require().Equal(s.keyring.GetAddr(0), redeemEvent.Receiver) - s.Require().Equal(receiver, redeemEvent.StrideForwarder) - s.Require().Equal(big.NewInt(1e18), redeemEvent.Amount) - }, - }, - } - - for _, tc := range testCases { - s.Run(tc.name, func() { - s.SetupTest() - - err := s.precompile.EmitRedeemStakeEvent( - ctx, - stateDB, - s.keyring.GetAddr(0), - common.HexToAddress(tokenPair.Erc20Address), - s.keyring.GetAddr(0), - receiver, - big.NewInt(1e18), - ) - s.Require().NoError(err) - tc.postCheck() - }) - } -} diff --git a/precompiles/outposts/stride/setup_test.go b/precompiles/outposts/stride/setup_test.go deleted file mode 100644 index 396f799559..0000000000 --- a/precompiles/outposts/stride/setup_test.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package stride_test - -import ( - "testing" - - "github.com/evmos/evmos/v18/precompiles/erc20" - - "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/precompiles/outposts/stride" - "github.com/evmos/evmos/v18/testutil/integration/common/grpc" - testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - "github.com/stretchr/testify/suite" -) - -var _ *PrecompileTestSuite - -type PrecompileTestSuite struct { - suite.Suite - - network *network.UnitTestNetwork - grpcHandler grpc.Handler - keyring testkeyring.Keyring - - precompile *stride.Precompile -} - -func TestPrecompileTestSuite(t *testing.T) { - suite.Run(t, new(PrecompileTestSuite)) -} - -func (s *PrecompileTestSuite) SetupTest() { - keyring := testkeyring.New(2) - network := network.NewUnitTestNetwork( - network.WithPreFundedAccounts(keyring.GetAllAccAddrs()...), - ) - - precompile, err := stride.NewPrecompile( - common.HexToAddress(erc20.WEVMOSContractTestnet), - network.App.TransferKeeper, - network.App.Erc20Keeper, - network.App.AuthzKeeper, - network.App.StakingKeeper, - ) - s.Require().NoError(err, "expected no error during precompile creation") - s.precompile = precompile - - grpcHandler := grpc.NewIntegrationHandler(network) - - s.network = network - s.grpcHandler = grpcHandler - s.keyring = keyring - s.precompile = precompile - - // Register stEvmos Coin as an ERC20 token - s.registerStrideCoinERC20() -} diff --git a/precompiles/outposts/stride/stride.go b/precompiles/outposts/stride/stride.go deleted file mode 100644 index c3080b82eb..0000000000 --- a/precompiles/outposts/stride/stride.go +++ /dev/null @@ -1,142 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package stride - -import ( - "embed" - "fmt" - - storetypes "github.com/cosmos/cosmos-sdk/store/types" - authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" - - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v18/precompiles/common" - erc20keeper "github.com/evmos/evmos/v18/x/erc20/keeper" - transferkeeper "github.com/evmos/evmos/v18/x/ibc/transfer/keeper" - stakingkeeper "github.com/evmos/evmos/v18/x/staking/keeper" -) - -var _ vm.PrecompiledContract = &Precompile{} - -// Embed abi json file to the executable binary. Needed when importing as dependency. -// -//go:embed abi.json -var f embed.FS - -type Precompile struct { - cmn.Precompile - wevmosAddress common.Address - transferKeeper transferkeeper.Keeper - erc20Keeper erc20keeper.Keeper - stakingKeeper stakingkeeper.Keeper -} - -// NewPrecompile creates a new Stride outpost Precompile instance as a -// PrecompiledContract interface. -func NewPrecompile( - wevmosAddress common.Address, - transferKeeper transferkeeper.Keeper, - erc20Keeper erc20keeper.Keeper, - authzKeeper authzkeeper.Keeper, - stakingKeeper stakingkeeper.Keeper, -) (*Precompile, error) { - abi, err := LoadABI() - if err != nil { - return nil, err - } - - return &Precompile{ - Precompile: cmn.Precompile{ - ABI: abi, - AuthzKeeper: authzKeeper, - KvGasConfig: storetypes.KVGasConfig(), - TransientKVGasConfig: storetypes.TransientGasConfig(), - ApprovalExpiration: cmn.DefaultExpirationDuration, // should be configurable in the future. - }, - wevmosAddress: wevmosAddress, - transferKeeper: transferKeeper, - erc20Keeper: erc20Keeper, - stakingKeeper: stakingKeeper, - }, nil -} - -// LoadABI loads the Stride outpost ABI from the embedded abi.json file -// for the Stride outpost precompile. -func LoadABI() (abi.ABI, error) { - return cmn.LoadABI(f, "abi.json") -} - -// Address defines the address of the Stride Outpost precompile contract. -func (Precompile) Address() common.Address { - return common.HexToAddress("0x0000000000000000000000000000000000000900") -} - -// IsStateful returns true since the precompile contract has access to the -// chain state. -func (Precompile) IsStateful() bool { - return true -} - -// RequiredGas calculates the precompiled contract's base gas rate. -func (p Precompile) RequiredGas(input []byte) uint64 { - methodID := input[:4] - - method, err := p.MethodById(methodID) - if err != nil { - // This should never happen since this method is going to fail during Run - return 0 - } - - return p.Precompile.RequiredGas(input, p.IsTransaction(method.Name)) -} - -// Run executes the precompiled contract IBC transfer methods defined in the ABI. -func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, readOnly bool) (bz []byte, err error) { - ctx, stateDB, method, initialGas, args, err := p.RunSetup(evm, contract, readOnly, p.IsTransaction) - if err != nil { - return nil, err - } - - // This handles any out of gas errors that may occur during the execution of a precompile tx or query. - // It avoids panics and returns the out of gas error so the EVM can continue gracefully. - defer cmn.HandleGasError(ctx, contract, initialGas, &err)() - - if err := stateDB.Commit(); err != nil { - return nil, err - } - - switch method.Name { - // Stride Outpost Methods: - case LiquidStakeMethod: - bz, err = p.LiquidStake(ctx, evm.Origin, stateDB, contract, method, args) - case RedeemStakeMethod: - bz, err = p.RedeemStake(ctx, evm.Origin, stateDB, contract, method, args) - default: - return nil, fmt.Errorf(cmn.ErrUnknownMethod, method.Name) - } - - if err != nil { - return nil, err - } - - cost := ctx.GasMeter().GasConsumed() - initialGas - - if !contract.UseGas(cost) { - return nil, vm.ErrOutOfGas - } - - return bz, nil -} - -// IsTransaction checks if the given method name corresponds to a transaction or query. -func (Precompile) IsTransaction(method string) bool { - switch method { - case LiquidStakeMethod, RedeemStakeMethod: - return true - default: - return false - } -} diff --git a/precompiles/outposts/stride/tx.go b/precompiles/outposts/stride/tx.go deleted file mode 100644 index 88c8da7ac2..0000000000 --- a/precompiles/outposts/stride/tx.go +++ /dev/null @@ -1,248 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package stride - -import ( - "fmt" - "time" - - transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - - "cosmossdk.io/math" - "github.com/evmos/evmos/v18/utils" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v18/precompiles/ics20" -) - -const ( - // LiquidStakeMethod is the name of the liquidStake method - LiquidStakeMethod = "liquidStake" - // RedeemStakeMethod is the name of the redeem method - RedeemStakeMethod = "redeemStake" - // LiquidStakeAction is the action name needed in the memo field - LiquidStakeAction = "LiquidStake" - // RedeemStakeAction is the action name needed in the memo field - RedeemStakeAction = "RedeemStake" -) - -// LiquidStake is a transaction that liquid stakes tokens using -// a ICS20 transfer with a custom memo field that will trigger Stride's Autopilot middleware -func (p Precompile) LiquidStake( - ctx sdk.Context, - origin common.Address, - stateDB vm.StateDB, - contract *vm.Contract, - method *abi.Method, - args []interface{}, -) ([]byte, error) { - autopilotArgs, err := parseAutopilotArgs(method, args) - if err != nil { - return nil, err - } - - sender := autopilotArgs.Sender - receiver := autopilotArgs.Receiver - token := autopilotArgs.Token - amount := autopilotArgs.Amount - strideForwarder := autopilotArgs.StrideForwarder - - // The provided sender address should always be equal to the origin address. - // In case the contract caller address is the same as the sender address provided, - // update the sender address to be equal to the origin address. - // Otherwise, if the provided sender address is different from the origin address, - // return an error because is a forbidden operation - sender, err = ics20.CheckOriginAndSender(contract, origin, sender) - if err != nil { - return nil, err - } - - // WEVMOS address is the only supported token for liquid staking - if token != p.wevmosAddress { - return nil, fmt.Errorf(ErrUnsupportedToken, token, p.wevmosAddress) - } - - bondDenom := p.stakingKeeper.BondDenom(ctx) - coin := sdk.Coin{Denom: bondDenom, Amount: math.NewIntFromBigInt(amount)} - - // Create the memo for the ICS20 transfer packet - memo, err := CreateMemo(LiquidStakeAction, strideForwarder, sdk.AccAddress(receiver.Bytes()).String()) - if err != nil { - return nil, err - } - - // Build the MsgTransfer with the memo and coin - timeoutTimestamp := ctx.BlockTime().Add(ics20.DefaultTimeoutMinutes * time.Minute).UnixNano() - msg, err := ics20.CreateAndValidateMsgTransfer( - transfertypes.PortID, - autopilotArgs.ChannelID, - coin, - sdk.AccAddress(sender.Bytes()).String(), - strideForwarder, - ics20.DefaultTimeoutHeight, - uint64(timeoutTimestamp), - memo, - ) - if err != nil { - return nil, err - } - - // no need to have authorization when the contract caller is the same as origin (owner of funds) - // and the sender is the origin - accept, expiration, err := ics20.CheckAndAcceptAuthorizationIfNeeded(ctx, contract, origin, p.AuthzKeeper, msg) - if err != nil { - return nil, err - } - - // Execute the ICS20 Transfer - _, err = p.transferKeeper.Transfer(sdk.WrapSDKContext(ctx), msg) - if err != nil { - return nil, err - } - - // Update grant only if is needed - if err := ics20.UpdateGrantIfNeeded(ctx, contract, p.AuthzKeeper, origin, expiration, accept); err != nil { - return nil, err - } - - // Emit the IBC transfer Event - if err := ics20.EmitIBCTransferEvent( - ctx, - stateDB, - p.ABI.Events[ics20.EventTypeIBCTransfer], - p.Address(), - sender, - msg.Receiver, - msg.SourcePort, - msg.SourceChannel, - coin, - memo, - ); err != nil { - return nil, err - } - - // Emit the custom LiquidStake Event - if err := p.EmitLiquidStakeEvent(ctx, stateDB, sender, token, amount); err != nil { - return nil, err - } - - return method.Outputs.Pack(true) -} - -// RedeemStake is a transaction that redeems the native tokens using the liquid stake -// tokens. It executes a ICS20 transfer with a custom memo field that will -// trigger Stride's Autopilot middleware -func (p Precompile) RedeemStake( - ctx sdk.Context, - origin common.Address, - stateDB vm.StateDB, - contract *vm.Contract, - method *abi.Method, - args []interface{}, -) ([]byte, error) { - autopilotArgs, err := parseAutopilotArgs(method, args) - if err != nil { - return nil, err - } - - sender := autopilotArgs.Sender - receiver := autopilotArgs.Receiver - token := autopilotArgs.Token - amount := autopilotArgs.Amount - strideForwarder := autopilotArgs.StrideForwarder - channelID := autopilotArgs.ChannelID - - // The provided sender address should always be equal to the origin address. - // In case the contract caller address is the same as the sender address provided, - // update the sender address to be equal to the origin address. - // Otherwise, if the provided sender address is different from the origin address, - // return an error because is a forbidden operation - sender, err = ics20.CheckOriginAndSender(contract, origin, sender) - if err != nil { - return nil, err - } - - bondDenom := p.stakingKeeper.BondDenom(ctx) - stToken := "st" + bondDenom - - ibcDenom := utils.ComputeIBCDenom(transfertypes.PortID, channelID, stToken) - - tokenPairID := p.erc20Keeper.GetDenomMap(ctx, ibcDenom) - tokenPair, found := p.erc20Keeper.GetTokenPair(ctx, tokenPairID) - if !found { - return nil, fmt.Errorf(ErrTokenPairNotFound, ibcDenom) - } - - if token != tokenPair.GetERC20Contract() { - return nil, fmt.Errorf(ErrUnsupportedToken, token, tokenPair.Erc20Address) - } - - coin := sdk.Coin{Denom: tokenPair.Denom, Amount: math.NewIntFromBigInt(amount)} - - // Create the memo for the ICS20 transfer - memo, err := CreateMemo(RedeemStakeAction, strideForwarder, sdk.AccAddress(receiver.Bytes()).String()) - if err != nil { - return nil, err - } - - timeoutTimestamp := ctx.BlockTime().Add(ics20.DefaultTimeoutMinutes * time.Minute).UnixNano() - // Build the MsgTransfer with the memo and coin - msg, err := ics20.CreateAndValidateMsgTransfer( - transfertypes.PortID, - channelID, - coin, - sdk.AccAddress(sender.Bytes()).String(), - strideForwarder, - ics20.DefaultTimeoutHeight, - uint64(timeoutTimestamp), - memo, - ) - if err != nil { - return nil, err - } - - // no need to have authorization when the contract caller is the same as origin (owner of funds) - // and the sender is the origin - accept, expiration, err := ics20.CheckAndAcceptAuthorizationIfNeeded(ctx, contract, origin, p.AuthzKeeper, msg) - if err != nil { - return nil, err - } - - // Execute the ICS20 Transfer - _, err = p.transferKeeper.Transfer(sdk.WrapSDKContext(ctx), msg) - if err != nil { - return nil, err - } - - // Update grant only if is needed - if err := ics20.UpdateGrantIfNeeded(ctx, contract, p.AuthzKeeper, origin, expiration, accept); err != nil { - return nil, err - } - - // Emit the IBC transfer Event - if err := ics20.EmitIBCTransferEvent( - ctx, - stateDB, - p.ABI.Events[ics20.EventTypeIBCTransfer], - p.Address(), - sender, - msg.Receiver, - msg.SourcePort, - msg.SourceChannel, - coin, - memo, - ); err != nil { - return nil, err - } - - // Emit the custom RedeemStake Event - if err := p.EmitRedeemStakeEvent(ctx, stateDB, sender, token, receiver, strideForwarder, amount); err != nil { - return nil, err - } - - return method.Outputs.Pack(true) -} diff --git a/precompiles/outposts/stride/tx_test.go b/precompiles/outposts/stride/tx_test.go deleted file mode 100644 index e45e902118..0000000000 --- a/precompiles/outposts/stride/tx_test.go +++ /dev/null @@ -1,299 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package stride_test - -import ( - "fmt" - "math/big" - - "github.com/evmos/evmos/v18/precompiles/erc20" - - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v18/utils" - - common "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/precompiles/outposts/stride" -) - -const ( - // RandomAddress is a token that is not supported by the Stride Outpost - RandomAddress = "0x1FD55A1B9FC24967C4dB09C513C3BA0DFa7FF687" -) - -func (s *PrecompileTestSuite) TestLiquidStake() { - method := s.precompile.Methods[stride.LiquidStakeMethod] - denomID := s.network.App.Erc20Keeper.GetDenomMap(s.network.GetContext(), utils.BaseDenom) - tokenPair, ok := s.network.App.Erc20Keeper.GetTokenPair(s.network.GetContext(), denomID) - s.Require().True(ok, "expected token pair to be found") - - testCases := []struct { - name string - malleate func() []interface{} - gas uint64 - expError bool - errContains string - }{ - { - "fail - empty input args", - func() []interface{} { - return []interface{}{} - }, - 200000, - true, - fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 1, 0), - }, - { - "fail - token not found", - func() []interface{} { - err := s.network.App.StakingKeeper.SetParams(s.network.GetContext(), stakingtypes.DefaultParams()) - s.Require().NoError(err) - return []interface{}{ - stride.AutopilotArgs{ - ChannelID: channelID, - Sender: s.keyring.GetAddr(0), - Receiver: s.keyring.GetAddr(0), - Token: common.HexToAddress(RandomAddress), - Amount: big.NewInt(1e18), - StrideForwarder: "stride1mdna37zrprxl7kn0rj4e58ndp084fzzwcxhrh2", - }, - } - }, - 200000, - true, - "unsupported token", - }, - { - "fail - unsupported token", - func() []interface{} { - return []interface{}{ - stride.AutopilotArgs{ - ChannelID: channelID, - Sender: s.keyring.GetAddr(0), - Receiver: s.keyring.GetAddr(0), - Token: common.HexToAddress(RandomAddress), - Amount: big.NewInt(1e18), - StrideForwarder: "stride1mdna37zrprxl7kn0rj4e58ndp084fzzwcxhrh2", - }, - } - }, - 200000, - true, - "unsupported token", - }, - { - "fail - invalid strideForwarder address (not a stride address)", - func() []interface{} { - return []interface{}{ - stride.AutopilotArgs{ - ChannelID: channelID, - Sender: s.keyring.GetAddr(0), - Receiver: s.keyring.GetAddr(0), - Token: common.HexToAddress(tokenPair.Erc20Address), - Amount: big.NewInt(1e18), - StrideForwarder: "cosmos1xv9tklw7d82sezh9haa573wufgy59vmwe6xxe5", - }, - } - }, - 200000, - true, - "invalid stride bech32 address", - }, - { - "fail - strideForwarder address is an invalid stride bech32 address", - func() []interface{} { - return []interface{}{ - stride.AutopilotArgs{ - ChannelID: channelID, - Sender: s.keyring.GetAddr(0), - Receiver: s.keyring.GetAddr(0), - Token: common.HexToAddress(tokenPair.Erc20Address), - Amount: big.NewInt(1e18), - StrideForwarder: "stride1xv9tklw7d82sezh9haa573wufgy59vmwe6xx", - }, - } - }, - 200000, - true, - "invalid stride bech32 address", - }, - { - "success", - func() []interface{} { - return []interface{}{ - stride.AutopilotArgs{ - ChannelID: channelID, - Sender: s.keyring.GetAddr(0), - Receiver: s.keyring.GetAddr(0), - Token: common.HexToAddress(erc20.WEVMOSContractTestnet), - Amount: big.NewInt(1e18), - StrideForwarder: "stride1rhe5leyt5w0mcwd9rpp93zqn99yktsxvyaqgd0", - }, - } - }, - 200000, - false, - "", - }, - } - - for _, tc := range testCases { - s.Run(tc.name, func() { - s.SetupTest() - - sender := s.keyring.GetAddr(0) - - contract := vm.NewContract(vm.AccountRef(sender), s.precompile, big.NewInt(0), tc.gas) - - s.setupIBCCoordinator() - - _, err := s.precompile.LiquidStake(s.network.GetContext(), sender, s.network.GetStateDB(), contract, &method, tc.malleate()) - - if tc.expError { - s.Require().ErrorContains(err, tc.errContains) - } else { - s.Require().NoError(err) - } - }) - } -} - -func (s *PrecompileTestSuite) TestRedeem() { - method := s.precompile.Methods[stride.RedeemStakeMethod] - stEvmos := utils.ComputeIBCDenom(portID, channelID, "st"+s.network.GetDenom()) - - denomID := s.network.App.Erc20Keeper.GetDenomMap(s.network.GetContext(), stEvmos) - tokenPair, ok := s.network.App.Erc20Keeper.GetTokenPair(s.network.GetContext(), denomID) - s.Require().True(ok, "expected token pair to be found") - - testCases := []struct { - name string - malleate func() []interface{} - gas uint64 - expError bool - errContains string - }{ - { - "fail - empty input args", - func() []interface{} { - return []interface{}{} - }, - 200000, - true, - fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 1, 0), - }, - { - "fail - token not found", - func() []interface{} { - err := s.network.App.StakingKeeper.SetParams(s.network.GetContext(), stakingtypes.DefaultParams()) - s.Require().NoError(err) - return []interface{}{ - stride.AutopilotArgs{ - ChannelID: channelID, - Sender: s.keyring.GetAddr(0), - Receiver: s.keyring.GetAddr(0), - Token: common.HexToAddress(RandomAddress), - Amount: big.NewInt(1e18), - StrideForwarder: "stride1mdna37zrprxl7kn0rj4e58ndp084fzzwcxhrh2", - }, - } - }, - 200000, - true, - "token pair not found", - }, - { - "fail - unsupported token", - func() []interface{} { - return []interface{}{ - stride.AutopilotArgs{ - ChannelID: channelID, - Sender: s.keyring.GetAddr(0), - Receiver: s.keyring.GetAddr(0), - Token: common.HexToAddress(RandomAddress), - Amount: big.NewInt(1e18), - StrideForwarder: "stride1mdna37zrprxl7kn0rj4e58ndp084fzzwcxhrh2", - }, - } - }, - 200000, - true, - "The only supported token contract for Stride Outpost v1 is 0xd567B3d7B8FE3C79a1AD8dA978812cfC4Fa05e75", - }, - { - "fail - invalid receiver address (not a stride address)", - func() []interface{} { - return []interface{}{ - stride.AutopilotArgs{ - ChannelID: channelID, - Sender: s.keyring.GetAddr(0), - Receiver: s.keyring.GetAddr(0), - Token: common.HexToAddress(tokenPair.Erc20Address), - Amount: big.NewInt(1e18), - StrideForwarder: "cosmos1xv9tklw7d82sezh9haa573wufgy59vmwe6xxe5", - }, - } - }, - 200000, - true, - "invalid stride bech32 address", - }, - { - "fail - stride forwarder address is an invalid stride bech32 address", - func() []interface{} { - return []interface{}{ - stride.AutopilotArgs{ - ChannelID: channelID, - Sender: s.keyring.GetAddr(0), - Receiver: s.keyring.GetAddr(0), - Token: common.HexToAddress(tokenPair.Erc20Address), - Amount: big.NewInt(1e18), - StrideForwarder: "stride1xv9tklw7d82sezh9haa573wufgy59vmwe6xxe", - }, - } - }, - 200000, - true, - "invalid stride bech32 address", - }, - { - "success", - func() []interface{} { - return []interface{}{ - stride.AutopilotArgs{ - ChannelID: channelID, - Sender: s.keyring.GetAddr(0), - Receiver: s.keyring.GetAddr(0), - Token: common.HexToAddress(tokenPair.GetErc20Address()), - Amount: big.NewInt(1e18), - StrideForwarder: "stride1rhe5leyt5w0mcwd9rpp93zqn99yktsxvyaqgd0", - }, - } - }, - 200000, - false, - "", - }, - } - - for _, tc := range testCases { - s.Run(tc.name, func() { - s.SetupTest() - - sender := s.keyring.GetAddr(0) - contract := vm.NewContract(vm.AccountRef(sender), s.precompile, big.NewInt(0), tc.gas) - - s.setupIBCCoordinator() - - _, err := s.precompile.RedeemStake(s.network.GetContext(), sender, s.network.GetStateDB(), contract, &method, tc.malleate()) - - if tc.expError { - s.Require().ErrorContains(err, tc.errContains) - } else { - s.Require().NoError(err) - } - }) - } -} diff --git a/precompiles/outposts/stride/types.go b/precompiles/outposts/stride/types.go deleted file mode 100644 index 0b100f640d..0000000000 --- a/precompiles/outposts/stride/types.go +++ /dev/null @@ -1,150 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package stride - -import ( - "encoding/json" - "fmt" - "math/big" - - "github.com/ethereum/go-ethereum/accounts/abi" - - "github.com/evmos/evmos/v18/utils" - - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/ethereum/go-ethereum/common" - cmn "github.com/evmos/evmos/v18/precompiles/common" -) - -const ( - // StrideBech32Prefix is the Bech32 prefix for Stride addresses - StrideBech32Prefix = "stride" -) - -// EventLiquidStake is the event type emitted on a liquidStake transaction -type EventLiquidStake struct { - Sender common.Address - Token common.Address - Amount *big.Int -} - -// EventRedeem is the event type emitted on a redeem transaction -type EventRedeem struct { - Sender common.Address - Token common.Address - Receiver common.Address - StrideForwarder string - Amount *big.Int -} - -// StakeIBCPacketMetadata metadata info specific to StakeIBC (e.g. 1-click liquid staking). -// Used to create the memo field for the ICS20 transfer corresponding to Autopilot LiquidStake. -type StakeIBCPacketMetadata struct { - Action string `json:"action"` - IBCReceiver string `json:"ibcreceiver,omitempty"` -} - -// Autopilot defines the receiver and IBC packet metadata info specific to the -// Stride Autopilot liquid staking behavior -type Autopilot struct { - Receiver string `json:"receiver"` - StakeIBC *StakeIBCPacketMetadata `json:"stakeibc,omitempty"` -} - -// RawPacketMetadata is the raw packet metadata used to construct a JSON string -type RawPacketMetadata struct { - Autopilot *Autopilot `json:"autopilot"` -} - -// AutopilotArgs is the arguments struct for the LiquidStake and RedeemStake methods -type AutopilotArgs struct { - ChannelID string `abi:"channelID"` // the channel ID for the ICS20 transfer - Sender common.Address `abi:"sender"` // the sender of the liquid stake or redeem transaction - Receiver common.Address `abi:"receiver"` // the receiver of the LSD token or the redeemed token - Token common.Address `abi:"token"` // the token to be liquid staked or redeemed - Amount *big.Int `abi:"amount"` // the amount to be liquid staked or redeemed - StrideForwarder string `abi:"strideForwarder"` // the stride forwarder address -} - -// AutopilotPayload is the payload struct for the LiquidStake and RedeemStake method -type AutopilotPayload struct { - Payload AutopilotArgs -} - -// ValidateBasic validates the RawPacketMetadata structure and fields -func (r RawPacketMetadata) ValidateBasic() error { - if r.Autopilot.StakeIBC.Action == "" { - return fmt.Errorf(ErrEmptyAutopilotAction) - } - - if r.Autopilot.Receiver == "" { - return fmt.Errorf(ErrEmptyReceiver) - } - - if r.Autopilot.StakeIBC.Action == RedeemStakeAction && r.Autopilot.StakeIBC.IBCReceiver == "" { - return fmt.Errorf(ErrRedeemStakeEmptyIBCReceiver) - } - - return nil -} - -// ValidateBasic validates the AutopilotArgs structure and fields -func (a AutopilotArgs) ValidateBasic() error { - // Check if stride forwarder is a valid bech32 address - _, err := utils.CreateAccAddressFromBech32(a.StrideForwarder, StrideBech32Prefix) - if err != nil { - return sdkerrors.ErrInvalidAddress.Wrapf("invalid stride bech32 address: %s", err) - } - - if a.Amount.Sign() <= 0 { - return fmt.Errorf(ErrZeroOrNegativeAmount) - } - - return nil -} - -// parseAutopilotArgs parses the arguments from the Liquid Stake and for Redeem Stake method calls -func parseAutopilotArgs(method *abi.Method, args []interface{}) (AutopilotArgs, error) { - if len(args) != 1 { - return AutopilotArgs{}, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 1, len(args)) - } - - var autopilotPayload AutopilotPayload - if err := method.Inputs.Copy(&autopilotPayload, args); err != nil { - return AutopilotArgs{}, fmt.Errorf("error while unpacking args to AutopilotArgs struct: %s", err) - } - - // Validate the AutopilotArgs struct - if err := autopilotPayload.Payload.ValidateBasic(); err != nil { - return AutopilotArgs{}, err - } - - return autopilotPayload.Payload, nil -} - -// CreateMemo creates the memo for the StakeIBC actions - LiquidStake and RedeemStake. -func CreateMemo(action, strideForwarder, receiver string) (string, error) { - // Create a new instance of the struct and populate it - data := &RawPacketMetadata{ - Autopilot: &Autopilot{ - Receiver: strideForwarder, - StakeIBC: &StakeIBCPacketMetadata{ - Action: action, - IBCReceiver: receiver, - }, - }, - } - - if err := data.ValidateBasic(); err != nil { - return "", err - } - - // Convert the struct to a JSON string - jsonBytes, err := json.Marshal(data) - if err != nil { - return "", sdkerrors.ErrJSONMarshal.Wrap("autopilot packet") - } - - return string(jsonBytes), nil -} diff --git a/precompiles/outposts/stride/types_test.go b/precompiles/outposts/stride/types_test.go deleted file mode 100644 index 1213c411f4..0000000000 --- a/precompiles/outposts/stride/types_test.go +++ /dev/null @@ -1,57 +0,0 @@ -package stride_test - -import ( - "testing" - - strideoutpost "github.com/evmos/evmos/v18/precompiles/outposts/stride" - "github.com/stretchr/testify/require" -) - -func TestCreateMemo(t *testing.T) { - t.Parallel() - - testcases := []struct { - name string - action string - receiver string - evmosReceiver string - expPass bool - errContains string - expMemo string - }{ - { - name: "success - liquid stake", - action: strideoutpost.LiquidStakeAction, - receiver: "stride1xv9tklw7d82sezh9haa573wufgy59vmwe6xxe5", - evmosReceiver: "evmos1xv9tklw7d82sezh9haa573wufgy59vmwe6xxe5", - expPass: true, - expMemo: "{\"autopilot\":{\"receiver\":\"stride1xv9tklw7d82sezh9haa573wufgy59vmwe6xxe5\",\"stakeibc\":{\"action\":\"LiquidStake\",\"ibcreceiver\":\"evmos1xv9tklw7d82sezh9haa573wufgy59vmwe6xxe5\"}}}", - }, - { - name: "success - redeem stake", - action: strideoutpost.RedeemStakeAction, - receiver: "stride1xv9tklw7d82sezh9haa573wufgy59vmwe6xxe5", - evmosReceiver: "evmos1xv9tklw7d82sezh9haa573wufgy59vmwe6xxe5", - expPass: true, - expMemo: "{\"autopilot\":{\"receiver\":\"stride1xv9tklw7d82sezh9haa573wufgy59vmwe6xxe5\",\"stakeibc\":{\"action\":\"RedeemStake\",\"ibcreceiver\":\"evmos1xv9tklw7d82sezh9haa573wufgy59vmwe6xxe5\"}}}", - }, - } - - for _, tc := range testcases { - tc := tc - - t.Run(tc.name, func(t *testing.T) { - t.Parallel() - - memo, err := strideoutpost.CreateMemo(tc.action, tc.receiver, tc.evmosReceiver) - if tc.expPass { - require.NoError(t, err, "expected no error while creating memo") - require.NotEmpty(t, memo, "expected memo not to be empty") - require.Equal(t, tc.expMemo, memo) - } else { - require.Error(t, err, "expected error while creating memo") - require.Contains(t, err.Error(), tc.errContains, "expected different error") - } - }) - } -} diff --git a/precompiles/outposts/stride/utils_test.go b/precompiles/outposts/stride/utils_test.go deleted file mode 100644 index 4bac24d551..0000000000 --- a/precompiles/outposts/stride/utils_test.go +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) -package stride_test - -import ( - "fmt" - - "cosmossdk.io/math" - commonnetwork "github.com/evmos/evmos/v18/testutil/integration/common/network" - "github.com/evmos/evmos/v18/testutil/integration/ibc/coordinator" - - erc20types "github.com/evmos/evmos/v18/x/erc20/types" - - sdk "github.com/cosmos/cosmos-sdk/types" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" -) - -const ( - portID = "transfer" - channelID = "channel-0" -) - -// registerStrideCoinERC20 registers stEvmos and Evmos coin as an ERC20 token -func (s *PrecompileTestSuite) registerStrideCoinERC20() { - // Register EVMOS ERC20 equivalent - ctx := s.network.GetContext() - bondDenom := s.network.App.StakingKeeper.BondDenom(ctx) - evmosMetadata, found := s.network.App.BankKeeper.GetDenomMetaData(ctx, bondDenom) - s.Require().True(found, "expected evmos denom metadata") - - coin := sdk.NewCoin(evmosMetadata.Base, math.NewInt(2e18)) - err := s.network.App.BankKeeper.MintCoins(ctx, inflationtypes.ModuleName, sdk.NewCoins(coin)) - s.Require().NoError(err) - - // Register some Token Pairs - _, err = s.network.App.Erc20Keeper.RegisterCoin(ctx, evmosMetadata) - s.Require().NoError(err) - - // Register stEvmos Token Pair - denomTrace := transfertypes.DenomTrace{ - Path: fmt.Sprintf("%s/%s", portID, channelID), - BaseDenom: "st" + bondDenom, - } - s.network.App.TransferKeeper.SetDenomTrace(ctx, denomTrace) - stEvmosMetadata := banktypes.Metadata{ - Description: "The native token of Evmos", - Base: denomTrace.IBCDenom(), - // NOTE: Denom units MUST be increasing - DenomUnits: []*banktypes.DenomUnit{ - { - Denom: denomTrace.IBCDenom(), - Exponent: 0, - Aliases: []string{denomTrace.BaseDenom}, - }, - { - Denom: denomTrace.BaseDenom, - Exponent: 18, - }, - }, - Name: "stEvmos", - Symbol: "STEVMOS", - Display: denomTrace.BaseDenom, - } - - stEvmos := sdk.NewCoin(stEvmosMetadata.Base, math.NewInt(9e18)) - err = s.network.App.BankKeeper.MintCoins(ctx, inflationtypes.ModuleName, sdk.NewCoins(stEvmos)) - s.Require().NoError(err) - err = s.network.App.BankKeeper.SendCoinsFromModuleToAccount(ctx, inflationtypes.ModuleName, s.keyring.GetAccAddr(0), sdk.NewCoins(stEvmos)) - s.Require().NoError(err) - - // Register some Token Pairs - _, err = s.network.App.Erc20Keeper.RegisterCoin(ctx, stEvmosMetadata) - s.Require().NoError(err) - - convertCoin := erc20types.NewMsgConvertCoin( - stEvmos, - s.keyring.GetAddr(0), - s.keyring.GetAccAddr(0), - ) - - _, err = s.network.App.Erc20Keeper.ConvertCoin(ctx, convertCoin) - s.Require().NoError(err) -} - -// setupIBCCoordinator sets up the IBC coordinator -func (s *PrecompileTestSuite) setupIBCCoordinator() { - ibcSender, ibcSenderPrivKey := s.keyring.GetAccAddr(0), s.keyring.GetPrivKey(0) - ibcAcc, err := s.grpcHandler.GetAccount(ibcSender.String()) - s.Require().NoError(err) - - IBCCoordinator := coordinator.NewIntegrationCoordinator( - s.T(), - []commonnetwork.Network{s.network}, - ) - - IBCCoordinator.SetDefaultSignerForChain(s.network.GetChainID(), ibcSenderPrivKey, ibcAcc) - IBCCoordinator.Setup(s.network.GetChainID(), IBCCoordinator.GetDummyChainsIDs()[0]) - - err = IBCCoordinator.CommitAll() - s.Require().NoError(err) -} diff --git a/tests/nix_tests/test_osmosis_outpost.py b/tests/nix_tests/test_osmosis_outpost.py deleted file mode 100644 index 85cd2f7a49..0000000000 --- a/tests/nix_tests/test_osmosis_outpost.py +++ /dev/null @@ -1,310 +0,0 @@ -import json - -import pytest -from web3 import Web3 - -from .ibc_utils import ( - EVMOS_IBC_DENOM, - OSMO_IBC_DENOM, - assert_ready, - get_balance, - prepare_network, -) -from .network import CosmosChain, Evmos -from .utils import ( - ADDRS, - KEYS, - OSMOSIS_POOLS, - WASM_CONTRACTS, - WEVMOS_ADDRESS, - erc20_balance, - eth_to_bech32, - get_event_attribute_value, - get_precompile_contract, - send_transaction, - wait_for_cosmos_tx_receipt, - wait_for_fn, -) - -# This contract address is provided in genesis -# as registered token pair. If need to edit this -# do so in 'osmosis-outpost.jsonnet' file -WOSMO_ADDRESS = Web3.toChecksumAddress("0x5db67696C3c088DfBf588d3dd849f44266ff0ffa") - - -@pytest.fixture(scope="module", params=["evmos"]) -def ibc(request, tmp_path_factory): - """ - Prepares the network. - """ - name = "osmosis-outpost" - evmos_build = request.param - path = tmp_path_factory.mktemp(name) - # Setup the IBC connections - network = prepare_network(path, name, [evmos_build, "osmosis"]) - yield from network - - -def test_osmosis_swap(ibc): - assert_ready(ibc) - evmos: Evmos = ibc.chains["evmos"] - osmosis: CosmosChain = ibc.chains["osmosis"] - - evmos_addr = ADDRS["signer2"] - - osmosis_cli = osmosis.cosmos_cli() - osmosis_addr = osmosis_cli.address("signer2") - amt = 100 - # the expected amount to get after swapping - # 100aevmos is 98uosmo - exp_swap_amount = 98 - - xcs_contract = setup_osmos_chains(ibc) - - # --------- Transfer Osmo to Evmos - transfer_osmo_to_evmos(ibc, osmosis_addr, evmos_addr) - - # define TWAP parameters - testSlippagePercentage = 20 - testWindowSeconds = 10 - - # --------- Swap Osmo to Evmos - w3 = evmos.w3 - pc = get_precompile_contract(w3, "IOsmosisOutpost") - evmos_gas_price = w3.eth.gas_price - swap_params = { - "channelID": "channel-0", - "xcsContract": xcs_contract, - "sender": evmos_addr, - "input": WEVMOS_ADDRESS, - "output": WOSMO_ADDRESS, - "amount": amt, - "slippagePercentage": testSlippagePercentage, - "windowSeconds": testWindowSeconds, - "swapReceiver": eth_to_bech32(evmos_addr), - } - tx = pc.functions.swap(swap_params).build_transaction( - {"from": evmos_addr, "gasPrice": evmos_gas_price, "gas": 30000000} - ) - gas_estimation = evmos.w3.eth.estimate_gas(tx) - print(f"outpost tx gas estimation: {gas_estimation}") - receipt = send_transaction(w3, tx, KEYS["signer2"]) - - assert receipt.status == 1 - - # check balance increase after swap - new_erc20_balance = 0 - # the account has 200 uosmo transferred in the setup - # function transfer_osmo_to_evmos - initial_erc20_balance = 200 - - def check_erc20_balance_change(): - nonlocal new_erc20_balance - new_erc20_balance = erc20_balance(w3, WOSMO_ADDRESS, evmos_addr) - print(f"uosmo erc20 balance: {new_erc20_balance}") - return new_erc20_balance > initial_erc20_balance - - wait_for_fn("balance change", check_erc20_balance_change) - - exp_final_balance = initial_erc20_balance + exp_swap_amount - assert new_erc20_balance == exp_final_balance - - -def setup_osmos_chains(ibc): - # Send Evmos to Osmosis to be able to set up pools - send_evmos_to_osmos(ibc) - - osmosis = ibc.chains["osmosis"] - osmosis_cli = osmosis.cosmos_cli() - osmosis_addr = osmosis_cli.address("signer2") - - # create evmos <> osmo pool - pool_id = create_osmosis_pool( - osmosis_cli, osmosis_addr, OSMOSIS_POOLS["Evmos_Osmo"] - ) - - contracts_to_store = { - "Swaprouter": { - "get_instantiate_params": lambda x: f'\'{{"owner":"{x}"}}\'', - }, - "CrosschainSwap": { - "get_instantiate_params": lambda x, y, z: f'{{"governor":"{x}", "swap_contract": "{y}", "channels": [["evmos","{z}"]]}}', # noqa: 501 - ignore line length lint - }, - } - - # ===== Deploy Swaprouter ===== - swap_contract = WASM_CONTRACTS["Swaprouter"] - swap_contract_addr = deploy_wasm_contract( - osmosis_cli, - osmosis_addr, - swap_contract, - contracts_to_store["Swaprouter"]["get_instantiate_params"](osmosis_addr), - "swaprouter1.0", - ) - - # ===== Deploy CrosschainSwap V1===== - cross_swap_contract = WASM_CONTRACTS["CrosschainSwap"] - xcs_contract = deploy_wasm_contract( - osmosis_cli, - osmosis_addr, - cross_swap_contract, - contracts_to_store["CrosschainSwap"]["get_instantiate_params"]( - osmosis_addr, swap_contract_addr, "channel-0" - ), - "xcswap1.0", - ) - # ================================= - - # in the router one execute function `set_route` to have a route for evmos within the swap router contract - # set input 'aevmos', output 'uosmo' route - set_swap_route( - osmosis_cli, osmosis_addr, swap_contract_addr, pool_id, EVMOS_IBC_DENOM, "uosmo" - ) - - return xcs_contract - - -def send_evmos_to_osmos(ibc): - src_chain = ibc.chains["evmos"] - dst_chain = ibc.chains["osmosis"] - - dst_addr = dst_chain.cosmos_cli().address("signer2") - amt = 600000000 - - cli = src_chain.cosmos_cli() - src_addr = cli.address("signer2") - src_denom = "aevmos" - - old_src_balance = get_balance(src_chain, src_addr, src_denom) - old_dst_balance = get_balance(dst_chain, dst_addr, EVMOS_IBC_DENOM) - - pc = get_precompile_contract(src_chain.w3, "ICS20I") - evmos_gas_price = src_chain.w3.eth.gas_price - - tx_hash = pc.functions.transfer( - "transfer", - "channel-0", - src_denom, - amt, - ADDRS["signer2"], - dst_addr, - [1, 10000000000], - 0, - "", - ).transact({"from": ADDRS["signer2"], "gasPrice": evmos_gas_price}) - - receipt = src_chain.w3.eth.wait_for_transaction_receipt(tx_hash) - - assert receipt.status == 1 - # check gas used - assert receipt.gasUsed == 74098 - - fee = receipt.gasUsed * evmos_gas_price - - new_dst_balance = 0 - - def check_balance_change(): - nonlocal new_dst_balance - new_dst_balance = get_balance(dst_chain, dst_addr, EVMOS_IBC_DENOM) - return old_dst_balance != new_dst_balance - - wait_for_fn("balance change", check_balance_change) - assert old_dst_balance + amt == new_dst_balance - new_src_balance = get_balance(src_chain, src_addr, src_denom) - assert old_src_balance - amt - fee == new_src_balance - - -def transfer_osmo_to_evmos(ibc, src_addr, dst_addr): - src_chain: CosmosChain = ibc.chains["osmosis"] - dst_chain: Evmos = ibc.chains["evmos"] - - cli = src_chain.cosmos_cli() - src_addr = cli.address("signer2") - - bech_dst = eth_to_bech32(dst_addr) - old_dst_balance = get_balance(dst_chain, bech_dst, OSMO_IBC_DENOM) - rsp = ( - ibc.chains["osmosis"] - .cosmos_cli() - .ibc_transfer(src_addr, bech_dst, "200uosmo", "channel-0", 1, fees="10000uosmo") - ) - assert rsp["code"] == 0 - - new_dst_balance = 0 - - # Osmo is registered as token pair since genesis. - # Check the ERC20 contract balance - def check_balance_change(): - nonlocal new_dst_balance - new_dst_balance = erc20_balance(dst_chain.w3, WOSMO_ADDRESS, dst_addr) - print(f"uosmo erc20 balance: {new_dst_balance}") - return old_dst_balance != new_dst_balance - - wait_for_fn("balance change", check_balance_change) - - -def deploy_wasm_contract(osmosis_cli, deployer_addr, contract_file, init_args, label): - """ - Stores the contract binary and deploys one instance of it. - Returns the contract address - """ - # 1. Store the binary - rsp = osmosis_cli.wasm_store_binary(deployer_addr, contract_file) - assert rsp["code"] == 0 - - # check for tx receipt to confirm tx was successful - receipt = wait_for_cosmos_tx_receipt(osmosis_cli, rsp["txhash"]) - assert receipt["tx_result"]["code"] == 0 - # get code_id from the receipt logs - logs = json.loads(receipt["tx_result"]["log"]) - code_id = get_event_attribute_value(logs[0]["events"], "store_code", "code_id") - - # 2. instantiate contract - rsp = osmosis_cli.wasm_instante2( - deployer_addr, - code_id, - init_args, - label, - ) - assert rsp["code"] == 0 - - # check for tx receipt to confirm tx was successful - receipt = wait_for_cosmos_tx_receipt(osmosis_cli, rsp["txhash"]) - assert receipt["tx_result"]["code"] == 0 - - # get instantiated contract address from events in logs - logs = json.loads(receipt["tx_result"]["log"]) - contract_addr = get_event_attribute_value( - logs[0]["events"], "instantiate", "_contract_address" - ) - print(f"deployed {label} CosmWasm contract @ {contract_addr}") - - return contract_addr - - -def set_swap_route( - osmosis_cli, signer_addr, swap_contract_addr, pool_id, input_denom, output_denom -): - execute_args = f'{{"set_route":{{"input_denom": "{input_denom}","output_denom":"{output_denom}","pool_route":[{{"pool_id": "{pool_id}","token_out_denom":"{output_denom}"}}]}}}}' # noqa: 501 - ignore line length lint - - rsp = osmosis_cli.wasm_execute(signer_addr, swap_contract_addr, execute_args) - assert rsp["code"] == 0 - - # check for tx receipt to confirm tx was successful - receipt = wait_for_cosmos_tx_receipt(osmosis_cli, rsp["txhash"]) - assert receipt["tx_result"]["code"] == 0 - - -def create_osmosis_pool(osmosis_cli, creator_addr, pool_meta_file): - rsp = osmosis_cli.gamm_create_pool(creator_addr, pool_meta_file) - assert rsp["code"] == 0 - - # check for tx receipt to confirm tx was successful - receipt = wait_for_cosmos_tx_receipt(osmosis_cli, rsp["txhash"]) - assert receipt["tx_result"]["code"] == 0 - - # get pool id from events in logs - logs = json.loads(receipt["tx_result"]["log"]) - pool_id = get_event_attribute_value(logs[0]["events"], "pool_created", "pool_id") - print(f"created osmosis pool with id: {pool_id}") - return pool_id diff --git a/tests/nix_tests/test_stride_outpost.py b/tests/nix_tests/test_stride_outpost.py deleted file mode 100644 index a63456fbdd..0000000000 --- a/tests/nix_tests/test_stride_outpost.py +++ /dev/null @@ -1,97 +0,0 @@ -import pytest - -from .ibc_utils import EVMOS_IBC_DENOM, assert_ready, get_balance, prepare_network -from .utils import ( - ADDRS, - KEYS, - WEVMOS_ADDRESS, - get_precompile_contract, - register_host_zone, - send_transaction, - wait_for_fn, -) - - -@pytest.fixture(scope="module", params=["evmos"]) -def ibc(request, tmp_path_factory): - "prepare-network" - name = "stride-outpost" - evmos_build = request.param - path = tmp_path_factory.mktemp(name) - # specify the custom_scenario - # to patch evmos to use channel-0 for Stride outpost - network = prepare_network(path, name, [evmos_build, "stride"]) - yield from network - - -def test_liquid_stake(ibc): - """ - test liquidStaking precompile function. - """ - assert_ready(ibc) - - cli = ibc.chains["evmos"].cosmos_cli() - src_addr = cli.address("signer2") - sender_addr = ADDRS["signer2"] - src_denom = "aevmos" - st_token = "staevmos" - amt = 1000000000000000000 - - dst_addr = ibc.chains["stride"].cosmos_cli().address("signer2") - - # need to register evmos chain as host zone in stride - register_host_zone( - ibc.chains["stride"], - dst_addr, - "connection-0", - src_denom, - "evmos", - EVMOS_IBC_DENOM, - "channel-0", - 1000000, - ) - - old_src_balance = get_balance(ibc.chains["evmos"], src_addr, src_denom) - old_dst_balance = get_balance(ibc.chains["stride"], dst_addr, st_token) - - pc = get_precompile_contract(ibc.chains["evmos"].w3, "IStrideOutpost") - evmos_gas_price = ibc.chains["evmos"].w3.eth.gas_price - - liquid_stake_params = { - "channelID": "channel-0", - "sender": sender_addr, - "receiver": sender_addr, - "strideForwarder": dst_addr, - "token": WEVMOS_ADDRESS, - "amount": amt, - } - tx = pc.functions.liquidStake(liquid_stake_params).build_transaction( - {"from": sender_addr, "gasPrice": evmos_gas_price} - ) - gas_estimation = ibc.chains["evmos"].w3.eth.estimate_gas(tx) - - receipt = send_transaction(ibc.chains["evmos"].w3, tx, KEYS["signer2"]) - assert receipt.status == 1 - - # FIXME gasUsed should be same as estimation - # ATM gas estimation is always higher than gas used - # in precompiles. - # Possible fix here https://github.com/evmos/evmos/pull/1943 - # assert receipt.gasUsed == gas_estimation - print(f"gas estimation {gas_estimation}") - print(f"gas used: {receipt.gasUsed}") - - fee = receipt.gasUsed * evmos_gas_price - new_dst_balance = 0 - - def check_balance_change(): - nonlocal new_dst_balance - new_dst_balance = get_balance(ibc.chains["stride"], dst_addr, st_token) - return old_dst_balance != new_dst_balance - - wait_for_fn("balance change", check_balance_change) - assert old_dst_balance + amt == new_dst_balance - new_src_balance = get_balance(ibc.chains["evmos"], src_addr, src_denom) - # NOTE the 'amt' is deducted from the 'aevmos' native coin - # not from WEVMOS balance - assert old_src_balance - amt - fee == new_src_balance diff --git a/x/evm/keeper/grpc_query_test.go b/x/evm/keeper/grpc_query_test.go index 051c869804..d3ed335427 100644 --- a/x/evm/keeper/grpc_query_test.go +++ b/x/evm/keeper/grpc_query_test.go @@ -27,10 +27,10 @@ import ( const invalidAddress = "0x0000" // expGasConsumed is the gas consumed in traceTx setup (GetProposerAddr + CalculateBaseFee) -const expGasConsumed = 7700 +const expGasConsumed = 7436 // expGasConsumedWithFeeMkt is the gas consumed in traceTx setup (GetProposerAddr + CalculateBaseFee) with enabled feemarket -const expGasConsumedWithFeeMkt = 7694 +const expGasConsumedWithFeeMkt = 7430 func (suite *KeeperTestSuite) TestQueryAccount() { var ( @@ -946,7 +946,7 @@ func (suite *KeeperTestSuite) TestTraceTx() { }, expPass: true, traceResponse: "{\"gas\":34828,\"failed\":false,\"returnValue\":\"0000000000000000000000000000000000000000000000000000000000000001\",\"structLogs\":[{\"pc\":0,\"op\":\"PUSH1\",\"gas\":", - expFinalGas: 29708, // gas consumed in traceTx setup (GetProposerAddr + CalculateBaseFee) + gas consumed in malleate func + expFinalGas: 26540, // gas consumed in traceTx setup (GetProposerAddr + CalculateBaseFee) + gas consumed in malleate func }, { msg: "invalid chain id", diff --git a/x/evm/keeper/precompiles.go b/x/evm/keeper/precompiles.go index 415f2f06fe..581d7489a2 100644 --- a/x/evm/keeper/precompiles.go +++ b/x/evm/keeper/precompiles.go @@ -9,8 +9,6 @@ import ( "maps" "sort" - "github.com/evmos/evmos/v18/utils" - "github.com/evmos/evmos/v18/precompiles/bech32" "github.com/ethereum/go-ethereum/common" @@ -23,10 +21,7 @@ import ( channelkeeper "github.com/cosmos/ibc-go/v7/modules/core/04-channel/keeper" bankprecompile "github.com/evmos/evmos/v18/precompiles/bank" distprecompile "github.com/evmos/evmos/v18/precompiles/distribution" - erc20precompile "github.com/evmos/evmos/v18/precompiles/erc20" ics20precompile "github.com/evmos/evmos/v18/precompiles/ics20" - osmosisoutpost "github.com/evmos/evmos/v18/precompiles/outposts/osmosis" - strideoutpost "github.com/evmos/evmos/v18/precompiles/outposts/stride" "github.com/evmos/evmos/v18/precompiles/p256" stakingprecompile "github.com/evmos/evmos/v18/precompiles/staking" vestingprecompile "github.com/evmos/evmos/v18/precompiles/vesting" @@ -39,7 +34,6 @@ import ( // AvailablePrecompiles returns the list of all available precompiled contracts. // NOTE: this should only be used during initialization of the Keeper. func AvailablePrecompiles( - chainID string, stakingKeeper stakingkeeper.Keeper, distributionKeeper distributionkeeper.Keeper, bankKeeper bankkeeper.Keeper, @@ -88,37 +82,6 @@ func AvailablePrecompiles( panic(fmt.Errorf("failed to instantiate bank precompile: %w", err)) } - var WEVMOSAddress common.Address - if utils.IsMainnet(chainID) { - WEVMOSAddress = common.HexToAddress(erc20precompile.WEVMOSContractMainnet) - } else { - WEVMOSAddress = common.HexToAddress(erc20precompile.WEVMOSContractTestnet) - } - - strideOutpost, err := strideoutpost.NewPrecompile( - WEVMOSAddress, - transferKeeper, - erc20Keeper, - authzKeeper, - stakingKeeper, - ) - if err != nil { - panic(fmt.Errorf("failed to instantiate stride outpost: %w", err)) - } - - osmosisOutpost, err := osmosisoutpost.NewPrecompile( - WEVMOSAddress, - authzKeeper, - bankKeeper, - transferKeeper, - stakingKeeper, - erc20Keeper, - channelKeeper, - ) - if err != nil { - panic(fmt.Errorf("failed to instantiate osmosis outpost: %w", err)) - } - // Stateless precompiles precompiles[bech32Precompile.Address()] = bech32Precompile precompiles[p256Precompile.Address()] = p256Precompile @@ -130,10 +93,6 @@ func AvailablePrecompiles( precompiles[ibcTransferPrecompile.Address()] = ibcTransferPrecompile precompiles[bankPrecompile.Address()] = bankPrecompile - // Outposts - precompiles[strideOutpost.Address()] = strideOutpost - precompiles[osmosisOutpost.Address()] = osmosisOutpost - return precompiles } diff --git a/x/evm/types/params.go b/x/evm/types/params.go index ce7340332c..d5e49c4a8c 100644 --- a/x/evm/types/params.go +++ b/x/evm/types/params.go @@ -40,8 +40,6 @@ var ( "0x0000000000000000000000000000000000000802", // ICS20 transfer precompile "0x0000000000000000000000000000000000000803", // Vesting precompile "0x0000000000000000000000000000000000000804", // Bank precompile - "0x0000000000000000000000000000000000000900", // Stride outpost - "0x0000000000000000000000000000000000000901", // Osmosis outpost } // DefaultExtraEIPs defines the default extra EIPs to be included // On v15, EIP 3855 was enabled From 543a0de910729f0928b19fad613c9102e92690a2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 May 2024 20:37:02 +0000 Subject: [PATCH 234/345] build(deps): bump crytic/slither-action from 0.3.2 to 0.4.0 (#2534) Bumps [crytic/slither-action](https://github.com/crytic/slither-action) from 0.3.2 to 0.4.0. - [Release notes](https://github.com/crytic/slither-action/releases) - [Commits](https://github.com/crytic/slither-action/compare/v0.3.2...v0.4.0) --- updated-dependencies: - dependency-name: crytic/slither-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: Ramiro Carlucho --- .github/workflows/slither.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/slither.yml b/.github/workflows/slither.yml index 607c65c5d4..928c49bb4a 100644 --- a/.github/workflows/slither.yml +++ b/.github/workflows/slither.yml @@ -24,7 +24,7 @@ jobs: cd contracts && npm i cp -r node_modules/@openzeppelin . - name: Run Slither Action - uses: crytic/slither-action@v0.3.2 + uses: crytic/slither-action@v0.4.0 continue-on-error: true id: slither with: From ef9d477579bad33edb3dc6741395a1fb26a9ae29 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 May 2024 08:54:34 +0200 Subject: [PATCH 235/345] build(deps): bump golangci/golangci-lint-action from 5.1.0 to 5.3.0 (#2540) Bumps [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action) from 5.1.0 to 5.3.0. - [Release notes](https://github.com/golangci/golangci-lint-action/releases) - [Commits](https://github.com/golangci/golangci-lint-action/compare/v5.1.0...v5.3.0) --- updated-dependencies: - dependency-name: golangci/golangci-lint-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 426fb2fe75..3b97204698 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -26,7 +26,7 @@ jobs: go.mod go.sum *.toml - - uses: golangci/golangci-lint-action@v5.1.0 + - uses: golangci/golangci-lint-action@v5.3.0 with: # Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version. version: latest From 2208ab2232482087cf51eb08a26d3a348719e581 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 May 2024 14:52:19 +0200 Subject: [PATCH 236/345] build(deps): bump golangci/golangci-lint-action from 5.3.0 to 6.0.0 (#2542) Bumps [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action) from 5.3.0 to 6.0.0. - [Release notes](https://github.com/golangci/golangci-lint-action/releases) - [Commits](https://github.com/golangci/golangci-lint-action/compare/v5.3.0...v6.0.0) --- updated-dependencies: - dependency-name: golangci/golangci-lint-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 3b97204698..5beab7705d 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -26,7 +26,7 @@ jobs: go.mod go.sum *.toml - - uses: golangci/golangci-lint-action@v5.3.0 + - uses: golangci/golangci-lint-action@v6.0.0 with: # Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version. version: latest From bed85aa04877eee4d661b2fd85f8156ce69729fd Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Tue, 7 May 2024 17:01:28 -0300 Subject: [PATCH 237/345] chore(nix-tests): update rust version (#2546) chore(e2e-tests): update rust version --- nix/default.nix | 10 ++++++++-- nix/hermes.nix | 9 ++------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/nix/default.nix b/nix/default.nix index e1d0e25a9d..7c1d321f16 100644 --- a/nix/default.nix +++ b/nix/default.nix @@ -3,7 +3,10 @@ let # use a newer version of nixpkgs to get go_1_22 # We're not updating this on the whole setup because breaks other stuff # but we can import the needed packages from the newer version - nixpkgsUrl = "https://github.com/NixOS/nixpkgs/archive/master.tar.gz"; + # This is getting a specific commit on main branch to get + # go v1.22 and rust v1.77. Using rust >= v1.78 breaks the current + # hermes relayer compilation + nixpkgsUrl = "https://github.com/NixOS/nixpkgs/archive/d1c6a5decfd9ad4c84354612d418b2856a57be1d.tar.gz"; nixpkgs = import (fetchTarball nixpkgsUrl) {}; # the go_1_22 nixpkgs is v1.22.1 # but we need the v1.22.2. @@ -19,6 +22,9 @@ let sha256 = "sha256-gWJ4txAt2TkobDo1EGotWDOSP2pGqLCNqpn+Smgr21w="; }; }; + # get the rustPlatform used to build the hermes relayer + # This rustPlatform uses rust v1.77 + rustPlatform = nixpkgs.pkgs.rustPlatform; in import sources.nixpkgs { overlays = [ @@ -80,7 +86,7 @@ import sources.nixpkgs { }) (import (fetchTarball "https://github.com/oxalica/rust-overlay/archive/master.tar.gz")) (_: pkgs: { - hermes = pkgs.callPackage ./hermes.nix { src = sources.hermes; }; + hermes = pkgs.callPackage ./hermes.nix { src = sources.hermes; platform = rustPlatform; }; }) (_: pkgs: { test-env = pkgs.callPackage ./testenv.nix { }; }) ]; diff --git a/nix/hermes.nix b/nix/hermes.nix index 3c3ee9d197..8afaba390d 100644 --- a/nix/hermes.nix +++ b/nix/hermes.nix @@ -2,18 +2,13 @@ , lib , stdenv , darwin -, rustPlatform , symlinkJoin , openssl -, rust-bin +, platform }: -rustPlatform.buildRustPackage rec { +platform.buildRustPackage rec { name = "hermes"; - nativeBuildInputs = [ - rust-bin.stable.latest.minimal - ]; - inherit src; cargoSha256 = "sha256-jqmIBmvY3PXpLFfv6XrnXJ0RmR6amFFMNfgK8qDFHb8="; cargoBuildFlags = "--no-default-features --bin hermes"; From 344049b07ce7d3e3ffd56f0a366b8fb55813eb12 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 May 2024 17:35:46 -0300 Subject: [PATCH 238/345] build(deps): bump golang.org/x/text from 0.14.0 to 0.15.0 (#2539) * build(deps): bump golang.org/x/text from 0.14.0 to 0.15.0 Bumps [golang.org/x/text](https://github.com/golang/text) from 0.14.0 to 0.15.0. - [Release notes](https://github.com/golang/text/releases) - [Commits](https://github.com/golang/text/compare/v0.14.0...v0.15.0) --- updated-dependencies: - dependency-name: golang.org/x/text dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * update gomod2nix.toml file --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Vladislav Varadinov Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: GAtom22 --- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 25d27ae93a..3a72c965c4 100644 --- a/go.mod +++ b/go.mod @@ -47,7 +47,7 @@ require ( go.opencensus.io v0.24.0 golang.org/x/crypto v0.22.0 golang.org/x/net v0.24.0 - golang.org/x/text v0.14.0 + golang.org/x/text v0.15.0 google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de google.golang.org/grpc v1.63.2 google.golang.org/protobuf v1.34.0 diff --git a/go.sum b/go.sum index 69ae17d290..8a4ecf52f8 100644 --- a/go.sum +++ b/go.sum @@ -1510,8 +1510,8 @@ golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= diff --git a/gomod2nix.toml b/gomod2nix.toml index 69801a5f59..8a6519cde7 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -685,8 +685,8 @@ schema = 3 version = "v0.19.0" hash = "sha256-wFwEMwhtsr0C4mqjxukjMM7lxJLYPvb7gAPO95xyhyg=" [mod."golang.org/x/text"] - version = "v0.14.0" - hash = "sha256-yh3B0tom1RfzQBf1RNmfdNWF1PtiqxV41jW1GVS6JAg=" + version = "v0.15.0" + hash = "sha256-pBnj0AEkfkvZf+3bN7h6epCD2kurw59clDP7yWvxKlk=" [mod."golang.org/x/time"] version = "v0.5.0" hash = "sha256-W6RgwgdYTO3byIPOFxrP2IpAZdgaGowAaVfYby7AULU=" From e333c409958e96c1a7a9e31589d755fa7a6c3512 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 May 2024 08:18:32 +0000 Subject: [PATCH 239/345] build(deps): bump google.golang.org/protobuf from 1.34.0 to 1.34.1 (#2544) * build(deps): bump google.golang.org/protobuf from 1.34.0 to 1.34.1 Bumps google.golang.org/protobuf from 1.34.0 to 1.34.1. --- updated-dependencies: - dependency-name: google.golang.org/protobuf dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * gomod2nix generate --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: tom Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 3a72c965c4..c27b7ed944 100644 --- a/go.mod +++ b/go.mod @@ -50,7 +50,7 @@ require ( golang.org/x/text v0.15.0 google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de google.golang.org/grpc v1.63.2 - google.golang.org/protobuf v1.34.0 + google.golang.org/protobuf v1.34.1 sigs.k8s.io/yaml v1.4.0 ) diff --git a/go.sum b/go.sum index 8a4ecf52f8..59ece15330 100644 --- a/go.sum +++ b/go.sum @@ -1828,8 +1828,8 @@ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.34.0 h1:Qo/qEd2RZPCf2nKuorzksSknv0d3ERwp1vFG38gSmH4= -google.golang.org/protobuf v1.34.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= +google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/gomod2nix.toml b/gomod2nix.toml index 8a6519cde7..594246352a 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -712,8 +712,8 @@ schema = 3 version = "v1.63.2" hash = "sha256-RmtVjYLam97k7IHTHU7Gn16xNX+GvA9AiLKlQwOiZXU=" [mod."google.golang.org/protobuf"] - version = "v1.34.0" - hash = "sha256-0fqsqQTyOicm4+NiuAf2IaJhavMVJh50VhNcRmZPSus=" + version = "v1.34.1" + hash = "sha256-qnHqY6KLZiZDbTVTN6uzF4jedxROYlPCYHoiv6XI0sc=" [mod."gopkg.in/ini.v1"] version = "v1.67.0" hash = "sha256-V10ahGNGT+NLRdKUyRg1dos5RxLBXBk1xutcnquc/+4=" From 6894d697e4cf67846a4cd80f25e707b3030bd174 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 May 2024 10:23:35 +0000 Subject: [PATCH 240/345] build(deps): bump golang.org/x/crypto from 0.22.0 to 0.23.0 (#2543) * build(deps): bump golang.org/x/crypto from 0.22.0 to 0.23.0 Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.22.0 to 0.23.0. - [Commits](https://github.com/golang/crypto/compare/v0.22.0...v0.23.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * gomod2nix generate --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: tom Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- go.mod | 6 +++--- go.sum | 12 ++++++------ gomod2nix.toml | 12 ++++++------ 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index c27b7ed944..ec6feb41bd 100644 --- a/go.mod +++ b/go.mod @@ -45,7 +45,7 @@ require ( github.com/tyler-smith/go-bip39 v1.1.0 github.com/zondax/hid v0.9.2 go.opencensus.io v0.24.0 - golang.org/x/crypto v0.22.0 + golang.org/x/crypto v0.23.0 golang.org/x/net v0.24.0 golang.org/x/text v0.15.0 google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de @@ -235,8 +235,8 @@ require ( golang.org/x/mod v0.17.0 // indirect golang.org/x/oauth2 v0.17.0 // indirect golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.19.0 // indirect - golang.org/x/term v0.19.0 // indirect + golang.org/x/sys v0.20.0 // indirect + golang.org/x/term v0.20.0 // indirect golang.org/x/time v0.5.0 // indirect golang.org/x/tools v0.20.0 // indirect google.golang.org/api v0.162.0 // indirect diff --git a/go.sum b/go.sum index 59ece15330..1d2d4ab35f 100644 --- a/go.sum +++ b/go.sum @@ -1227,8 +1227,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1486,16 +1486,16 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= -golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= +golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/gomod2nix.toml b/gomod2nix.toml index 594246352a..4488a28a68 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -661,8 +661,8 @@ schema = 3 version = "v1.22.0" hash = "sha256-38zzkmcoOzYYeDN+rC44HmwmdnalIcEpObCS6tIvMO8=" [mod."golang.org/x/crypto"] - version = "v0.22.0" - hash = "sha256-2+u9nd32+Bi7EEv7QFc12CRTbfV7DApNv+yKIr7+lTw=" + version = "v0.23.0" + hash = "sha256-6hZjb/OazWFBef0C/aH63l49YQnzCh2vpIduzyfSSG8=" [mod."golang.org/x/exp"] version = "v0.0.0-20230711153332-06a737ee72cb" hash = "sha256-Cbw10ZJ+jATPV232G47xZrn6ExO1FDtiT6nlMRCH7EI=" @@ -679,11 +679,11 @@ schema = 3 version = "v0.7.0" hash = "sha256-2ETllEu2GDWoOd/yMkOkLC2hWBpKzbVZ8LhjLu0d2A8=" [mod."golang.org/x/sys"] - version = "v0.19.0" - hash = "sha256-cmuL31TYLJmDm/fDnI2Sn0wB88cpdOHV1+urorsJWx4=" + version = "v0.20.0" + hash = "sha256-mowlaoG2k4n1c1rApWef5EMiXd3I77CsUi8jPh6pTYA=" [mod."golang.org/x/term"] - version = "v0.19.0" - hash = "sha256-wFwEMwhtsr0C4mqjxukjMM7lxJLYPvb7gAPO95xyhyg=" + version = "v0.20.0" + hash = "sha256-kU+OVJbYktTIn4ZTAdomsOjL069Vj45sdroEMRKaRDI=" [mod."golang.org/x/text"] version = "v0.15.0" hash = "sha256-pBnj0AEkfkvZf+3bN7h6epCD2kurw59clDP7yWvxKlk=" From 63ce14b485704b4b9d58d0f5112a70732227e827 Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Wed, 8 May 2024 10:24:54 -0300 Subject: [PATCH 241/345] fix(precompiles): update secp256r1 precompile bech32 addr (#2550) * fix(precompiles): update default precompiles bech32 addr * add changelog entry --- CHANGELOG.md | 1 + precompiles/common/types.go | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cca241a5cd..3d0466f421 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -55,6 +55,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (erc20) [#2508](https://github.com/evmos/evmos/pull/2508) Add bookkeping logic in preparation for STRV2 upgrade. - (precompiles) [#2529](https://github.com/evmos/evmos/pull/2529) Remove Outposts precompiles. - (upgrade) [#2533](https://github.com/evmos/evmos/pull/2533) Add upgrade handler for v19. +- (precompiles) [#2550](https://github.com/evmos/evmos/pull/2550) Update secp256r1 curve precompile bech32 address to its corresponding value. ### Bug Fixes diff --git a/precompiles/common/types.go b/precompiles/common/types.go index b68d2b6f2b..9c9da04b23 100644 --- a/precompiles/common/types.go +++ b/precompiles/common/types.go @@ -23,7 +23,7 @@ var ( DefaultChainID = evmosutils.MainnetChainID + "-1" // DefaultPrecompilesBech32 is the standard bech32 address for the precompiles DefaultPrecompilesBech32 = []string{ - "evmos1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqn2svlxe", // secp256r1 curve precompile + "evmos1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqgqjuj7hv", // secp256r1 curve precompile "evmos1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqpqqnqcxyd", // bech32 precompile "evmos1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqzqq4xrkxv", // Staking precompile "evmos1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqzqpgshrm7", // Distribution precompile From 66a02dcacaa9d36c09d61c3ae22ad929891f9a9c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 May 2024 11:33:20 -0300 Subject: [PATCH 242/345] build(deps): bump github.com/onsi/ginkgo/v2 from 2.17.2 to 2.17.3 (#2549) * build(deps): bump github.com/onsi/ginkgo/v2 from 2.17.2 to 2.17.3 Bumps [github.com/onsi/ginkgo/v2](https://github.com/onsi/ginkgo) from 2.17.2 to 2.17.3. - [Release notes](https://github.com/onsi/ginkgo/releases) - [Changelog](https://github.com/onsi/ginkgo/blob/master/CHANGELOG.md) - [Commits](https://github.com/onsi/ginkgo/compare/v2.17.2...v2.17.3) --- updated-dependencies: - dependency-name: github.com/onsi/ginkgo/v2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * update gomod2nix.toml file --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index ec6feb41bd..1e661968a8 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,7 @@ require ( github.com/hashicorp/go-version v1.6.0 github.com/improbable-eng/grpc-web v0.15.0 github.com/linxGnu/grocksdb v1.8.14 - github.com/onsi/ginkgo/v2 v2.17.2 + github.com/onsi/ginkgo/v2 v2.17.3 github.com/onsi/gomega v1.33.1 github.com/ory/dockertest/v3 v3.10.0 github.com/pkg/errors v0.9.1 diff --git a/go.sum b/go.sum index 1d2d4ab35f..dcccd80c85 100644 --- a/go.sum +++ b/go.sum @@ -936,8 +936,8 @@ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108 github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo/v2 v2.17.2 h1:7eMhcy3GimbsA3hEnVKdw/PQM9XN9krpKVXsZdph0/g= -github.com/onsi/ginkgo/v2 v2.17.2/go.mod h1:nP2DPOQoNsQmsVyv5rDA8JkXQoCs6goXIvr/PRJ1eCc= +github.com/onsi/ginkgo/v2 v2.17.3 h1:oJcvKpIb7/8uLpDDtnQuf18xVnwKp8DTD7DQ6gTd/MU= +github.com/onsi/ginkgo/v2 v2.17.3/go.mod h1:nP2DPOQoNsQmsVyv5rDA8JkXQoCs6goXIvr/PRJ1eCc= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= diff --git a/gomod2nix.toml b/gomod2nix.toml index 4488a28a68..dbc019e0f3 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -480,8 +480,8 @@ schema = 3 version = "v0.0.5" hash = "sha256-/5i70IkH/qSW5KjGzv8aQNKh9tHoz98tqtL0K2DMFn4=" [mod."github.com/onsi/ginkgo/v2"] - version = "v2.17.2" - hash = "sha256-APrPglqYnX2a6EypqDXi05Quou30UQdcDxztT1yhM3s=" + version = "v2.17.3" + hash = "sha256-HKRJMYAVSVgCrLWMAMU6qqEG4K8+bwwdkzL8FGIyRS8=" [mod."github.com/onsi/gomega"] version = "v1.33.1" hash = "sha256-oYfRaN1xqngIHQQxEEc+FQZ6UHC99VZQzAePT0Xkz8s=" From 86a17c6488ae013341a5a1d8d2a7f445bf962fb1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 May 2024 09:39:23 +0200 Subject: [PATCH 243/345] build(deps): bump golangci/golangci-lint-action from 6.0.0 to 6.0.1 (#2548) Bumps [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action) from 6.0.0 to 6.0.1. - [Release notes](https://github.com/golangci/golangci-lint-action/releases) - [Commits](https://github.com/golangci/golangci-lint-action/compare/v6.0.0...v6.0.1) --- updated-dependencies: - dependency-name: golangci/golangci-lint-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 5beab7705d..6bd989cf81 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -26,7 +26,7 @@ jobs: go.mod go.sum *.toml - - uses: golangci/golangci-lint-action@v6.0.0 + - uses: golangci/golangci-lint-action@v6.0.1 with: # Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version. version: latest From 7aed7b6c0339bce9dcfd3909dad36063851668d8 Mon Sep 17 00:00:00 2001 From: Sandoche ADITTANE Date: Thu, 9 May 2024 10:47:15 +0200 Subject: [PATCH 244/345] chore: replacing safu document (#2536) * chore: replacing safu document * chore: updating changelog * Update SAFU.md Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Signed-off-by: Sandoche ADITTANE * Update SAFU.md Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Signed-off-by: Sandoche ADITTANE * chore: Update SAFU.md Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Signed-off-by: Sandoche ADITTANE * chore: Update SAFU.md Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Signed-off-by: Sandoche ADITTANE * chore: Update SAFU.md Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Signed-off-by: Sandoche ADITTANE * Update SAFU.md Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Signed-off-by: Sandoche ADITTANE * chore: Update SAFU.md Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Signed-off-by: Sandoche ADITTANE * chore: Update SAFU.md Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Signed-off-by: Sandoche ADITTANE --------- Signed-off-by: Sandoche ADITTANE Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- CHANGELOG.md | 3 +- SAFU.md | 134 +++++++++++++++++++++++++++++++++++++++++++++++++++ SAFU.pdf | Bin 158571 -> 0 bytes 3 files changed, 135 insertions(+), 2 deletions(-) create mode 100644 SAFU.md delete mode 100644 SAFU.pdf diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d0466f421..b10cb720e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -57,13 +57,13 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (upgrade) [#2533](https://github.com/evmos/evmos/pull/2533) Add upgrade handler for v19. - (precompiles) [#2550](https://github.com/evmos/evmos/pull/2550) Update secp256r1 curve precompile bech32 address to its corresponding value. - ### Bug Fixes - (inflation) [#2299](https://github.com/evmos/evmos/pull/2299) Fix emission function and tests. ### Improvements +- (all) [#2536](https://github.com/evmos/evmos/pull/2536) Updating the replaced safu pdf to safu markdown. - (all) [#2451](https://github.com/evmos/evmos/pull/2451) Updating the safu.pdf document. - (ante) [#2028](https://github.com/evmos/evmos/pull/2028) MonoAnteHandler for EVM transaction. - (staking-precompile) [#2105](https://github.com/evmos/evmos/pull/2105) Detect the length of the ed25519 pubkey in precompile `CreateValidator` to prevent panic. @@ -999,4 +999,3 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (cli) [#26](https://github.com/evmos/evmos/pull/26) Use config on genesis accounts. - (deps) [#28](https://github.com/evmos/evmos/pull/28) Bump Ethermint version to `v0.7.0`. - diff --git a/SAFU.md b/SAFU.md new file mode 100644 index 0000000000..83835aeda1 --- /dev/null +++ b/SAFU.md @@ -0,0 +1,134 @@ +# Simple Arrangement for Funding Upload + +## Overview + +This Simple Arrangement for Funding Upload (the +“[SAFU](https://jumpcrypto.com/safu-creating-a-standard-for-whitehats/)” or +“Arrangement”) is intended as a simple yet extensible way to specify a +post-exploit policy for whitehats, particularly rewards and distributions. It is +based in the SAFU Framework designed by [Jump Crypto](https://jumpcrypto.com/). + +This Arrangement attempts to address the following issues during active +vulnerabilities and post-exploits: + +- **Legal uncertainty**: No clear grace period during which the hacker can + declare themselves as a white hat. No formal guarantees as the team can decide + at any time to take legal action or not. +- **Lack of clarity**: What to do with the funds secured from an exploit? Where + should the white hat transfer the secured funds? Is there a + compensation/reward promised for securing affected users’ funds? +- **Execution risk**: Conflicting proposals and stressful negotiation may arise + during and after the exploit of a vulnerability, leading to additional + confusion and uncertainty between the parties involved. + +## Concepts + +- **Dropbox Address (”Dropbox”)**: An address or contract to which funds taken + from the protocol should be deposited. In the case of contracts, a Dropbox can + be *automatic*, handling claims and rewards on a per-depositor basis without + human input, or *conditional*, requiring additional input such as governance + approvals or identity verification (KYC). +- **Deposit Interval:** the grace period in which a sender must deposit funds in + the Dropbox after removing them from the protocol. +- **Claim Delay:** a minimum waiting period before a sender may claim rewards. + We recommend at least 24 hours, during which the extent of an exploit will + become clear. +- **Sender Claim Interval:** a maximum waiting period after which the protocol + may reclaim the sender’s reward, to avoid leaving funds stranded in the + contract. +- **Bounty Percent**: Pro-rata share of funds secured that are claimable by the + whitehats. +- **Bounty Cap**: Maximum amount of tokens that a whitehat can claim after + securing the vulnerable funds. + +## Statement for Whitehats + +Tharsis Labs Ltd. (the ”Team”) commits to not pursue legal action against white +hats who act in accordance with the Arrangement for vulnerabilities found in the +Evmos blockchain (chain ID: 9001). + +### Timeline + +The Team gives 48 hours to hackers (”Grace Period”) to deposit the funds to the +Dropbox from the moment they obtain the tokens from the exploited vulnerability. +After this time, the Team will assume that the hacker is acting maliciously and +against this Arrangement if they haven’t transferred the full amount of tokens. + +Evmos guarantees that the claiming for the funds process to begin not after 30 +days (Claim Delay) of the transfer or during the next upgrade. This is due to +the fact that transfers will need to be executed during an upgrade. We expect +this process to become automatic after a dedicated trustless Cosmos module is +incorporated for this purpose. + +If the whitehat doesn’t reclaim the tokens transferred before the 30th day from +the transfer day (Sender Claim Interval), the tokens will be reclaimed and +transferred to the Evmos community pool (aka. community treasury). + +### Reward Policy + +Whitehats that secure vulnerable funds are able to claim 5% of the total funds +secured (Bounty Percent) up to a total of 250,000 EVMOS (Bounty Cap). + +There is no minimum to the amount that can be secured. The reward white hack +hacker can secure from 1 atto EVMOS (1e-18 EVMOS or the equivalent unit of 1 wei +on Ethereum). + +We encourage whitehat hackers to report undisclosed vulnerabilities using the + email. + +## Dropbox for Protocol Funds + +The following Dropbox address is available on the Evmos blockchain for +transferring secured funds by whitehats: + +| | Bech32 Format | Hex Format | +| ------- | -------------------------------------------- | ------------------------------------------ | +| Dropbox | evmos1c6jdy4gy86s69auueqwfjs86vse7kz3grxm9h2 | 0xc6A4d255043ea1A2F79CC81c9940FA6433eb0A28 | + +While the original purpose for the Dropbox address is to primarily help secure +vulnerable EVMOS tokens, it can also be used as a general purpose escrow account +for whitehackers to help secure other tokens (Native or ERC20) that have been +exploited due to a vulnerability and thus declare behaviour in accordance to +this Agreement. + +The Team offers to serve as mediator between the project exploited and the +whitehat hackers that have transferred secured funds to the Dropbox. However, +the Team is not responsible or liable for any reward payout result of the +negotiation between these two parties. + +### Address Derivation + +The Dropbox address corresponds a `ModuleAccount` address that is not controlled +by the team nor any individual. The module `ModuleAccount` address provided is +derived from the first 20 bytes of the SHA256 sum for the `“safu”` string, using +the following algorithm: + +```bash +address = address(shaSum256([]byte("safu"))[:20])) +``` + +### Source Addresses + +In the event of a vulnerability, the rewards for whitehats will be taken out +from the Dropbox account. The total amount claimable by each whitehat is defined +by the Bounty Percent and Bounty Cap using the following formula: + +```bash +amount_claimable = min(bounty_cap, amount_secured * bounty_percent) +``` + +### Conditions for Claiming + +**KYC/KYB Requirements** + +The Agreement requires KYC/KYB to be done for all whitehats wanting a reward +valued above US$ 1,000. The information required (photographic ID, utility bill) +is assessed by Provenance (the “KYC Provider”). Whitehats that are business +entities will have to provide additional information (e.g., directors, owners). +Please anticipate that the KYC Provider might require documentation in English, +or in certified translations to it. The collection and assessment of this +information will be done by the KYC Provider. + +## References + +- [Jump Crypto: SAFU - Creating a Standard for Whitehats](https://jumpcrypto.com/safu-creating-a-standard-for-whitehats/) diff --git a/SAFU.pdf b/SAFU.pdf deleted file mode 100644 index dc2e554e2f1ce8ff5b5af47875f2ca39076a515d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158571 zcma&MQ;aS^yRF+j+vaTBwr$(CzqW1LwrAV6ZQHip=U->-?3`rnlkB7}-i*4bs~Yck zGDsCf#Aq4m*r7=WiwC;~TL$x>nFtsN?2N3Sd3fk$Ol{4bEeM$ZqbSjfSz0@rI?{_- z8#S!enDX&KJ2^X=8rnd+XIJZJR#J~5`SSM)&4x0!zMcaUVw_tL01LySKNx%= zB5yj_|7qtqx-Co96W1kPhevlV*6gUP1iV|FSCaXB+-{aVPtx;$-=+2bICl8@czwP~ z<}4M<@PJj9nXZ(1?Dy*T_le@I*@Y_z;h3ZWWKGeQ)ZFKV7gKiJM# zsU`f-p?@h*Z}%>gVCz9U2k66}lj;1lb#Z&Y*RXZ8m1|Z`cJcyr@fJdR7Op%*x)?5H zV00cVfif|6-fkZ8cW?4`d)8@pVbkp7`lpj#JdU;cCy1+cxUUVZ2q?T1*g&6daFS)+V=H<)(PYh)R~@$Y)W@{rN&68RD!3nW;)0S4Gg zs@d6}=W@_YoqsW9Y-e{X48v4ok(N%V$rMfwS(6`6kdSyWD`mdv{5U0X@0AJih1XJsn83Sddqp6-68P&#M zR6GslH_L-;l0*w8a?+3ETuC$;HlYAoI5YM`U9)1Rwvw<>NHu9funyud!V9gl zn}`jYh*yRrhl^~0;WtPiG7P6a8fY!WD`=T=he)}5V|WoK=d6jY=)LoAnI}nYz^zFp z^~x(qHWj%sE4?yFwF7$S@;!PE=Q4TH4HXKjtvPt2(O#Wk+jUv)bJ02_uo0S||IRIV@JXtckHg`gt9>oya#HIpo24ow+mG#IFp{ zuMMSbp%^FFwnrrKYl2>h_pyXH2sdfj%D}DnGph(UvS+eupXAIpru(I;pOaQjT5FTD zD_Gu)4DR07wUXX3$Yj1 z`8J$J&^;i6&zq5#M(7D<_2N!SJwS|@a^d}MplMXkmb|NiEIiDpY4Hk98=?TX4vkeY*TB|NR2>ZSg&7k^d z^K5QOpHGsIsxx1pNeWr!>w4gy4z%k4)iQ1m{aS8V#TC$bY@RCS#|2g76xgOzXm&}0 zA-EJFrQ5@!G{ZR*SSk4+a`gcfPQ>ajQX*tf5+6v~-9~CVS6kxObunV?fR?dSaqBF9 zoy!h)3h}WQUeqLeAENcaa`r$k*PEmMH@X|7j2ud*yLbFS;IRF8HAS3jZE!aNIw+wa zo|>oC!~g?K7wglE6oPMH(->l?Hg0p#SW!L}OcU5Pq_MygZKGRS(f!;OYMhJ_!m$-A z@O<|_2*UFx28?6aqkhE+VFrrCqr-;JF(u-wsupW%2h-jKPtlV!z_!sG6k!hF1037( zJJ^k62Rsb`N<0FT6yB1dAVR&y3Au?j5G97IGf+M|j*L)i)HOln325N}5T;OrnZV!Y z{cvK;iTY($$~Bq*L{b`#4r%z(f_0tyYwJvG{0)t%|jydO$=5XbNQ@ zD=uOQE9iU@Zhiz=aant&Y+~UD5tv}?#x$b!{!bfZKw*ocFH&O!jb!Pb-RS4a$cCi* znp)i%fo14o>{J};Ym|~nr~!F9DEgO4ke4%*mMfImne{xWM3GMvpS&{ka(R;=7KrvV zU?Dk#fpY#L`h>bk$}`@EyBE;#*k|u(I2w;XtbvtO^MwOTe{XU|mPBtqBjY5;`BLeA z12eUzPgFT<=x}biY(mAbQ%F%%rOxtXhBz!DN+Oo z&0VHqpB}-T8`;o~S6x{1`V$8C0(d4=!N@S!1U5XRk<%eNoklXG4(g;8H&AbZ{JZlv zNlifqrNXBAFBB0Cu&$C3IrgBhyBK@9F zbTaGRW7AN3+1xW_L}C+c$wYyaQkY~ND*5}-rXXd?^g%=^pZ&eC)IvK)z(?;$NkHR_ zToar&2k*{%$B~$mPX%~@o8raDIAbywue@A_BHqp5)_Mjxn$6!uQnL`g5RZ5jaFDX8 zty!{@s8kZjWRktU!29r-xj!LXq=_}MU?&p(=)A+cV1+=tm7<#)p#3vNX&b_H0WBT@ z57v1W(k+<^31;c5;xnHUQgCfBY{NK$VR^X=)X<^fvbY;Q{1tdEgmxC!CNZG075(;i z7<%Qs$y3=nPGg!ELEFM}puvpO{WGaZcfr+8n=S~&ZFp-{$hkc6p- z{j>|#9NKN-`)WZN&d3980+S9S3gu7Wri8{}*Kjnrmc*$S|114Qr-dcsIkWBJf%zp& z4CEWG3CK0ZH)yP`>-kjw)H0!}@d>p7Nh=e~BjiQyPpm4vsE8p64v6NgtJ^C?Qx9V@ z6#aF?q+~%XJ?Ao4a0M;|00`%jE2mKj1$X_($y}X@XIMxE8o#los4`#4iKmbnr;&rj zVSx4C$naiai?q~Vu)vt}h?A5+7M-%QN{=d*uI%gjL#wDTU8eo;l3wCXV$~;CSrQ|w zzEB2HRw+1~A(I9>C*j&eBF#%2jxh@s;H`(&Ku7NjB9Fg7~IjdYR&s>pSUXu&Yg_`bJD^UMl?HTQ81104psuu_1 z&-9g1suj`LRhpf@Fl;^)ILKl(FsOzWliD`8KKt{`rn>!-8+z;7TD%^-A}^Gd-~EOX za#Tzn4QWn?*<(h)3Zp^iA3A2xf2ZJWNn~eqX$icUaD~&%`-n5@aA>hB4O00mT&4RN z&HrQnCJO9Uplv;^ojsX58!?w@QxpJek+>UYxf7V7whmX|BMRz+ZDQxq@%Q1K8g>-^N#BNlvidzx+y zbQ0sE0adr2qY|;(?$(2h)e6zVvydMP#W?cEyH=1OpS3m97f1R$L*nZ}I6}Wn(vAxy zC@SkV4BEDQRIIqNk~Wp3=B=VI@r0z66Bnafk;QQbd`wFrd%UpTa6j@$D4GZW{-pJK zaIHscG9YaX6`N+w&2}NEH^CD@`DF=e#-@sn+jA&?6bSV0r=I-Y<3!7o`R|J2HkL-; zbu|9J?4FV(%oW&W!2<+PHz;l*d=$Ul(%IQHQ)oGSh2J52oH9ytn>;1zO}u%Z3`BC~ zIIYo*NTr!=e%cApc^}PA92r-QWXjYXwsA`B1$nLvq)qP9=E*u&$v^+fcfsIesPY}R z7OP7~vL7=pYan`JMz5zLEUBQ&ys~{8B5zG3=8~`RjeQb!4+w9%Q%Mk8|$G4OsO8r^81~8=*#!S5NW4mi^RPJ~N2nQZ0BR{}umX zjus5*x2oqkATB@i(zD3vU?d?G*Nlx*h*Q{n+-z#;Sn|(_EKs-dv7lKJ{(YCT6YEIF zW~D#bI!3}Yyxl0EeQxRrzW^BKPgh4(dk9+R2XU4$Topl)Y9`JKh%IG~eu-5Bcc z!yxAE{}jl?gaGLBQjfu;ejyo^ZI3H>&i-aBjBk9Yv6Po zF^zM;tF}p+VPnx2j3_5W7P>+c_LkGoa$y@?Ed?naA8!@?I=spB2v4iZ=#QF)IO17S z%*5*n68mUKv2lBE;Sb=ZiN$>pYzgzTil_!x5dCp-)!@S<`GXbnZSLrEB6;fZp8$ju z=Mhd54cvoHYNXDu$juNYT#w6cZ4}oH)GH0dzy*UZ-s?BqPb;z0w8X``nHO1WD~cP!W``**SYtR*tYriAwTzySAe~nqG+Bro?f;CO+pmdjas_(WorZT;O(2Zr{vE4)H|;K zMIc&<*0M5N&BecPgxI7x;c5a;Vrrs*ayiP4`)+rLZXJ=T27vI`N@AaDoP4dp*D+g9 z>c$8q_)uZbIVaVZ;T4H%7xmZeriUGBv+lRg>MjZAipsnlNq}G^=Fs!8VWw=BPs{S8 zQLoGi9`&(8jY>KuX(r(eBwtqtlbe}?XJuZs-S@0;SDyQ8uWe?6)2A%PY^nU@1{~B1Bm>B-+ z`u`Of*%|%^*x5afu5 z@x6JCOH|92`Vc7KW@6Ph70Tw{GYeLWWxriM?Y~ct2)p0!^!#}>`rA7{E=uIhlu2@e zm$c$Okr}@~PuH9Hy&T_Ww*Pi-llTD?uXcLJ|Fig{P#rsEys8KJ%@I7yFT}> zVck96Uw7ZVejhL1KM$3gw|sIJj_tl%p{8)W8fnM!w?56Uv$`6O17vH{f38RD6vfy2 zH@n)m=)T-5&<$!WaCOS#mSAQ9V_sN0%G{&!5Il+Vz$+2g(AEkyM_r;k&^!D;yEopK z*xv;=h8_sWm|y-9HF-NtE?Md~sH!_cOl9(Zygu(hk;|!0Ts|K+S&iRw_~>qIZ>QUN zvZ4QZ*3)O}XIX1)o~!*NZepf->*2+TYkgfygwOQ5L(!F)f-dNvS%I0d-rDkeYAe{Y zEC}E6(`7lYzbZq670&bKDfGASeqoIp%g+xr%bMGJXkH#+(t^4vV+nPI{Zy?X_97s5 zXj3(;cIN)lA+h-h9BwUcZ&G>JAQDaI54p2){mP5S;YW*-&Lj`}+!|wpzg#*y)0(_* z0OPYoRbJS<3n{Pi?kzEP&KS@>aL=wJ3y-_7hA_%U= zd!CdU|4}qo8EH5M2j(5zYpz^|SCmqH4g)>gG$M*@{tft&Vi!&%$qow4@XT7SAY|!< z5iQ!~sdn0b_H~UygEdt7uNBW5<)a}@1)2RhH^zlShk)+F0ZfG#)VT6B%>g}~H5zo+ zIuS0e-1dWp&K_czs8EQOLP4Ko;v$0nLQNSmH!xvyv@0SPKyRdH&X$>z&U<DRp~Fbzim*X2QO%l#l? z5U(BFm}Hi4J5LJ5gsBB#jy`z0x1wzXkc4s-vvcS%vcerA_uY`ab&PKT`@2WFl6x7yBM@? zHYVzp(X2}coVew7PY=}}A%BRS6|l_*?=A(6{?8<1GaWPPUA!l2fxAFK&8!2sDa2=P zdGU*skv?@@6We=rG&-?^d}GH@tQVI;~&g*#OV!Ss@{Mw4y{a#zMa3aN`KN2 zvzsCxh0K_MbU`7IM2IH^L;TAS+T<1lLlc6V8PPnT&{05RRNAPlt${x@apUCT6*!oT zQ*Af3Bpg-vG*;SS8cZ0>TnT{Jn$#^sC%`jT8KHy+Ld7FHSXkIWm#pn80&|Q-rDx$NUK26|qvGs^E!zX$VN^+kyVCo3JqvJY3 zjUqDw%AsQ^3pq>!eRZ7){w3KPJM4Q8#whcMr8k)R# zsusMn#mh&es!Ct^NSKZVXbx+N-f+j(OvRTaVsu2ekm!cDA+5ho$V|H5YZYg39y5$d z{!uJo5LjEJ3#tO%_ehF+5v7-Vd)!WmSAu1^TQ^QKN-zXIO6gQRqRB3GR;AWNKTIl7 zopY>vx zW6433&-CvqT4N>ci|OUAJ4hU%0j34OfJDIN;Uxf89$_0@1DWrTZ+@=MX28BEMdNlQ z7kNpSXzH8t7oo`+^Pf%NSOA8EnVu%Uic|Ml;@`nWZ^>t?apPcw(!MaoESuFO>?*3H zP7xqHME|Ip@GasaD%+OmieeQi8@hMZs{rc^QxNWqN0q-=Rk!ODlrpIZ;L82jd{dF) zGRBpUOzF)=p~o^j1Z|-a^OdMUz3O-D3*NWCY#I~0kJSc4ds5zy0*8j93dz7OjCO&LoRQA22*+@-6NImuI^8!@t9! zlY*_9*@fuz)=kpjk&skR(Z&>;3RBmLzIk)J6aMbj*fO4!#2Z*K%Ta{t<%8=1)^*Yp z%9m4kjxrTgSpw-X z_4mAuHcHxC^utx-c1RsqX;|l61XFmM{Uds{!c!>=qE}&Ul*oO}i9)GSEqHT{jIm#Y zzbcRAGA0~!L5F|a59%!tmuZ*hUL%Q|(h^7h+lsiiX9hn;$NL5eIOt%pU9B7!b%(6AD4jXUi>#3OihSRxN@G|Jo*e z7-G>IA+s^Mw8YMJmJ0kA^l*>?yH>HDd65#r6Wr=8;RD(Zgxw*EK?RIPU3e)d_?-_u z;x;?*bfV)`Ae>Som9%d`j4?tAtWlSV6ARjwDS?b#S%jv<%2Y!24fI;(%@Wo3S#bC4 zvE!+}+&u|Pkx{tnFdTnpmkwX>iOWX=oZeVyrhJF}F))4gzRIPHh zh++XucY@4dO&{~yklh}2s)e40iKcbfV%-f3^9)P_d#QrTNk;$Kr)+h_-{4l2h&x4x z9-J+07^rn#yj~EFH$$I_JjewX0z0z#CX}(=CpnK8p3D^NvbkdX#PaBAR1U&!Or2U# zw^zEhylEqEUz5rNLxvUlO66M>!61Z&y978lj8viDPEuPWQTR|0hI-^{QK~Uccv8G{ zr5%Y}jwCPwt$a=$KsJ7n!bcZDUf9i|!n)+|yg>0XhNuO;Xg5)zN;%Qd&QzA{4XtA` zCXp9_CXUY}lZTgMDa5OgCr5DP8xF19U`?C3$Nz8RZYz4F`vj|N^(>YtuvYqe}lIw8Ge(hCEoTSa4IrdcI~;SgFncy^5-XO z5EM&?6p-twSF>xwcZ9)EaozhfkkFa9X{;K@4%T7QCCd?~(X*ji$u#{IW}Dl1bH?WI zqv}9wJ?++HQ5_RjLNrAXr1+eTd84(CG(1M#PP0Ur^pw-0lKQNnq>Dmb6)j0wG(wxM z5)qcR{i#amuRupA2fc zO8jJo^o{WLzzJq0V~#%G8Zqwykm&KU$T=qw2*nSNMa{zG6b~g$!nlGxRc}LpV=UqE z&LHWkg|&6#Vt1}qkgBAT*JNXrMmGThQS}L&MYhw855jcdpzJ(Uv88{YM7yJ4i&^3@ z`Xn7+q`^#iQ%FjY2I>Z2vRYlj%Fi!aY--<%8-(OthaP^k;;s16#Cer8xz!CPv>ukd z<0@izS(CMCWx_tX9!t-ugsV@Xclgi}NJ$LI0ZKtyQQMf6tcU2daa}YRYt@AWW1j3N^pw& zhF`q^?r>mO*VS(rNUdg2q(i9{e9tzP-Y9lid#-tweYM4*r@nO`g>4L(Ueru&1k|Bf zeJL9`%Itd>fMDRI-+v!@kVCP7=pmTJ07e=}dEcSggE<-qVtzceaAl9qs*zD;ZCbQ? zMSf8X&m!WIaLl9y^6t?8g-M=>w$qoMe6T?ipJp@v(M2Iwt^d*9Ba`s(KBvNAaLH9P z`><*gW2ORZ3BAUX%Qg9=2aRp>w9uJlT9`|X8U37#z;8(9#TuXF4#ZK9W4CEnblt(6qX7F+Pe4M=x8Yn@mg;J zqh%8@vbDm7o5Wc97mAac zNP4Kr=_$J~4O;h#nvU3Qx(eZ1z zL4ljuCOiuM9lLqr=dRe8~C?YERq0 zl&}s}{hO?7Vy@CK88$~7ugA!&ow*LW2nAzC>FF;9-hIZu^8=~*7{{Cs-g@qXUqyg;94VD%pOWj#DO-^p85#W zPnE$w84hAS0JP7AtCJ!WzHU#W<;5}Y#;i@&90%$A9kKPzU0T|LICFeVi21^0;C^`~ zAT5%IRvc~~gZGkjy!~DoDMv5SPn5@Iy;zj8X{hMLM=iI5GPlZs>$7d^(RMy8t*EAdE|{xUiO%YVi;(ocOur^^?Xu|?=AOwW>8WgtI5h=z`AyalJq z_$VoGr7@6?wo~e8mQc4Qt6PFPOfkEi48Ol>^@zoFoMzG^CNEMPZKJLrV5iOxJy!6( zHU^KMoc>S|CLziBsBMY}wHS$!T?3hl7uIFf#dvHBuSz1@m*dGB>`twfFWtlzpeX`sqj}Zc zG^VnBIq_TA(3nysBE~yQr$CPexigS3{e!L3$lX9Br?m)4wmyCW(Y^;BF#(8o6v3<~ ziq|+?XEGtKHjOOKs)(kG>&EY%LWLS6PdD8>!WW|I7`N$?6B$p7qxR8Xx>+w(noWa+s-diG zL0Z;1ej58CBz5KJ7h^0L$p=!feXgDnX9gSiS@akuA~(!nc5-MHu4*QXp1!PQ&Px@h zLCSEY7~oa@-MTcGs;XMSyh2Td{d?TcW33ViMi*Gk(`@_LM-Y=@Q>jwI5G4rwgrIWp z#HhZ<$&0>*d#5a(vr(y%>Of}wxdeO@Mq~SG{Ls1yS>>oJ(gP#N3CBvRERIP`Y>>BU z68Strmw)kjw})6-zK{gjc=9!Z3oK$Z{YF8Tq{yeLf1~q{cFnCk;#aA_nZy>9fQBtxh1s!E*YOz&MNVtR<48ece2us_Fa^)N}xoAgniN>o#B3Z znqdihALDfA-=0;FB$j9-HjehsL~`L+e@U2<#)3CtbYYXInF%wrih8%VYH6eJ>$~Q~ zCjs=kyA(Y1-!7kkQ5%k(2Xa=^_r*Adw~k+`0Lcqdh;*I4M(H2O6joo}R}zXLaHn+y z36G1Z#AJdJ)i}?{Yj<#n#GP&0SQz5IMWABrsS2hkU!a zYb9y(gT8TMx4!AAV{}y|+!FS5chvsOJXyYZ@DBFH2tIwawe6`pbm*k$`zF`|XlJsw zcBMIG;okU#DV)3DUh8hR78N1|?`TTrxjDBue|>F_?u2-a&8qz|#PEHZ1<#kbg&Kt^ zB+*8#oW8NIplcnye1r%ruqVk(z+7x-aB_S+cn1p+jW}>Pl$Ih-PEnW1R^e>7npnDM zoT-sqk;~#MvOTF=LTsgE(NpY zcg`E~Ak7kK4n!ur6aS~H^U#K<)D81o0CI;d!Y^cJlx1&q)SsYC5ga*>Q$7pyLCQA) zhoH--BaDru^$$_CKgspU`00-)*y&zgylX#MGL+^Oh1xO;Fy`H~VakeTU?Oc8z+XdX?J5 z+Vs5r+}H1%279r7RwdTQSkH9&!l?6~S_`}i%);g-&*0v=gMNa+tcT&>EIDB4htUUb znY@X8f%pUQhe6^eso&(^K)&3*5_kMxhkb2Fv`*8_U{Nc#{2%mbA3WIobj5A;26I|}o2 zn}Zf_8~dAKpP>+9KjGeUVTKkV7!{!l?1Og1Pp{Yh4)TTS^>7<>(NTBn?s!d8Qe8-P z!{|cNdLg$XyXL09guc*P=dEwX6pc9|ni-=>5hhsw!gj%mL##=?#;Q&HyX5!|NoFQE zIq}tprVldP&}y6M9gdn8V-l2? zeR_!NFUj;n%Q?ym?D$4j>QQLgpBx)4gnKp=sUVomb1d-={N(gZ@`8~5`aXN@3Ius0 z@krN()VL%5u{Oki+^bM2HCs+^Mx@NLfQuFHxNS*O9Mnxar6^i zBa$_CJ12=Tx?0G6r{&Ar0hMwnJ*Ph>%s>SlLTi+8Hb|eS=F5J+2Q2a?Uf`WxiE;*tfUyK^{Kb=R z)GGpVfXo!W0s{}L0zvq5Iv6$gkPtSfOME$>nxH+;kq^-+Mi+pJFL+y+HBbC@u^*)f zF%g{b$d*e!MM4k5EIyL3eFWE#zQxz#SJ3=ukLUy0i$5^EK7iDe^-HT2Z6#)l@eXI; z2CT5wIcMbz&jsB41?iYRjVpRQ2s74`kf8&y^or|zGd4)fSd|Y)Y*UWM8`47$Rjw%| zfd6`+FYH4vMr$%J!M@701$}ML+$4mo1;C!myL_wuO8F`~1IKu51?g@_7@0O^a6DTR zAAhX9xw+WdnC~%l+ANK!#$KrfXl^%Mb%mBlU!X6M0cQ9rJui|g##2zJCnm{~Q={?K zvni-(#^O$oPfW}$>!+eENN}LRzxZlLua$D(JEto&Oe9g=V+~Yv(wLo6R9lRT$PsL0fstyFkxG%6?OJ>#aw z=E3hDoYH{352Lfis$WThPMO^ig06wgP5WWAbnORWtI=y0ET8*rhQv1c+ASFtBD1f}ODkC$0%uXWvT z8agl&s;WjDhP&NAGP9SvDa^HMnfnX#&uOys96W1>8s@buZRVagdJc*@?J!j4FI1s6 zH?o_jsZ*aFr(;+U)c-u>%wxBmiP%4(A-l=zw@`mu25;)3TQ8qo-)wg_?R?JYrv9)* z-v$q*a{35eV0_i2*0oOa*btl#!=Rn!jO9BElW=t8Qh}qJ^R^&tvT-_0Mz;8=qS@$QMIf8EYCFH? zbj$FqEm%(AOQw-zc}Y}#8drRbu%q-@Fy@o&?xBKU@bHgV?$P7S{cx-BmER7f>|XoT z=dqp7o7K%`e%(5rZ0gvqjBd&4G?~iz@pin(0Dkr?r9UJZ@|OrUmItO(FD6>dGHuc0 zL--L5T>?OmV%8;w7}%KAc38Fe+Nv}({DjfN#by`U)lZ%Q#2CHGNJe(#ah>=}-CMSC zP%+jnw@4@5Zq-J3KvWi)vyF9t4(Ah1H8-C0noz~e@V*dYadKqhMkMTzGp)H|fZoa= zFk6j@#QxJ@{-JPnP1A@4jW@W%GkzrsgxPQ#NqVz zDRw)7iUMdr6aHms2Bgtk5~s`PvsOFk)A4A#N`R>K3qiq^1U!iq zv0KoEmYx$cMd5QMiNAHU!6Z#HM6bXi^U5qUM>a+$5@^(59zBywGP5BV zHsGxkjnXj~P2P!=$ioxwafI_O{l4^1Cz?u@FmaM{vU;%nBb*~*DMt{37vB1Z@thX} zus6XkZVv}TILP%;PD&7_DG?Q$!V8xi^i(obaKxgeB^;BleOs8vqS5WC`n3i98^01M#k z#!>);Hz7<%vfb=d_tQgYnaU0_eaqnQA5au8t!*}LL}N$%k&E8h*i#Kv|5lU|R%+L^ zK3RckS2SqN(7ny9oraUzjhZbpf0>Q!wL_kme}tf`Ht+BnzB%@f)9l7%F)qTfzYJ$< zK+Pv{Ye+O0$zJi7sf&#zjX~xlNa8%bB8EY}id=Vj<>Yh$5Q6jipUVZ$Of0OhEog8$ z&nXQ3j!1COBAb%X+;3l~Ji=qUecWwtcluskhb~>qc=|^tvg?tfD4?^MG1suy|ddAZ2+pupASu1OzxwUYzF0V+C`1(iVf?p}+L zCrp30n=oc+TadWTMYYy^Mg)PH)(kI8tCW_s45=uA2avYlz_6%1x16@6VrQ$C5|D0l z?Q{dEb{h7v16Lm$0CMz1qrM0TLg? zgxCDMgyLu#RWcCgJLjT_>ivLP$UG$tn0Sg)Mx#=hdw_67vE|3IK&G=mt0L!G4N++s z*Ft}Oa6YVtt{A>qAuU-jf%ZOoc)YI%oTb_dS9#s$-;pfV9HPevfqlb;ku%u@?w}O0 zNZd$yCHCa)B@*6HFhWceIRx9v1Sp&Svyr-^%9NW|gjJxImsOr3s1{-QFVpX_6tGOD z98UzHfD?U&jNpC~QRdGkjNq57wErdc+yABNij->K*r`OBw9=*UJ3=uLcg+@oqsRq6 z&A1Z~R%l)ar$l55U;z40Ib)XZfv^SdjukGpv>yot&tfl7jaoW39cU%ML~szx z7H)Ug<|D<_M1da^ufdMqcSHyx0yW|FOLpEH`k%<=FFtV$~FBug+0dO#L$ z_XqKP%3n9G3dDm9ksUbPn~XC_2<*k3Zv6P+k&Kht(d=kBg=Q7YG4-TblYN7obHzhD zkh>avo!(Ke!glg{qBC^UrhBGm)1%1KQ!K6eitTwIRahApd2WemrBeCo-m{KRB>Ja|%f z88pnna)8b)zv8I)CyHeB_?YWTjgb03F%Z}k&Y2bI^w>-|ox((HB!p13;pv0{KJTf> z0b?ksI4iVVV-QC0?7GjZE*!$aZh?(X`O&?UwggjHF_!%LDHaXP%09M44VN>D@l@hqI~xxX;B0E zRVgeRf%4>>*^*2xpj`tEvc^$>%4#E9{A2$i`==j?Go096XNX@8<7fh6V?^^i1L&z) zP#qM2%nGHR(pgbl>?~AN#*~ztCY#ApPn3&4I~_Mlt|pVIqIdENQS8n`uKnZz;>))O zp{s@J)ZlbT4ZorObG7g?ibk))=+bt*wep-lGJ@pHYYcXROr z1d8oU3wv#~&rm`jQgGOjM@kEAYRLCIoY6X z%Q|Yfmbh%QZ88Kbe^dJ-xAAv1FHt!gN9o zW2QxrN60yH34EW{{zP$6M)uL1>FCgQ5kSVw#z{gDS z;K}n)H=8Gn97tv!ITj9IYTX5!`>`_@c^Sjg1@kQrKuNiEmT3XPfcoFLO zw_?~|PNC*=RFY&err;^0lxVhKM}5V*3X&96ski}vWF&-EqERRl$AjL26p|_w)+_2d z=G{EdFltDwP$WJyF0ouBu@w7Da*|_fM5HYW=Qg-pDAtw-B}G>JzUKw zPHA#FA(>ft1g4Qu3L505g==~wF)E{`3jZ_)GbY>}C?ZOjQ6p7QdL*f_gHnlv#|LO9 zMgb~yKto=zAG$F25-73+`34rI0DRgY|5yr+wUb8uSj4=btqydMl@+pTbaB=jh!Pm^ zKcd{*gD&5AAu^_`_2<20ZFZf{i4mJyovyEw`b?`j7Z#WpfKpX?f zeJ=!h|AB!?sc^Np*4t=UFF3AHnZY1FR8MeJP?0HvqfkbtOes2ocw`94_&|a!JZYvM z7{l-hu|$JYt1r&<7!?5-Dkn=BT<*3o1p;rYx(Ox5!H7I zm4rFN2aKl`#T7A`0QeIqboBKOdtgz2zQ9;dt+yo8|Z(#+jW|KgoXiu7`_n|AXx+j8auToSh?`-?}o1O;fo9 zXy?6%8hAWVd``AX2@%^8K&!y6>b~H&{;m5RG~BoOe*ii_#lO6rcW_q4B7k~ecgUh7 z*#MSBn*^gjrRO3|vU%YV;W!%RqhXxJ+r03WB~uXOOkfRzq$6oTvh9N;!Gs*fR)nz? zbb1Z7NZg`@{LB11Jhz9({2<0j>q6U6=^Y!l$A)e6UUf<@OXPB?MGstp$`=K2-UJrckYC!1cfttFo#AxZ%5)W2+oWob})A_~xI=-71EiTz2TkIZ} z#f~@`TbWpc6idM#8Ozz42YX1i%cM9iQ`m5sB*vvPo1|Jksp1r!l=~X~@=4N_#$QCn zU&ctjOu#@QV<KuBF za-?&BBSoPN3s5DO&04Y8Vz(59?BSw9dr?u9eUh&-GNouvQIox?XrsNgXjSQM`!$7k z`@a)@)b1+)ag7OZ`BZKTQRt!2V+997M+%+`yB{dce_W&+C*xP zs;5va5DO-Xiz=%4s^U5P?BWKwF|kf=O>DRAvb|{g)c$G0RaxP{yjqf55h%;@23Hog z7m~tgiKE7GvtzGg#3Af;Jn8t@!8wkYMCV|G!$w6;hpwqJ0F)5gDGnR$1P4>R9C4$| z9YNOR`x_jNC>IzckM#$Ob=#$*Ay}*^)0PHr^G2f*O4S9`4HY4DdXVL_! zPtqhN(}-bhKq6C=^0IQNVazad{*CHn05SB*rF@@aP%f2-X?p_jhoqGjJC_wW*VNi_ z2g&(KM}88;)wmWfjXxO|ssL4)y)8aC^12Qj0n%!)>-YrvJZY!wx9VsWxvvUW1t6P) zH1U8=$di_aKwdDr#2g4E=0GUX$4JuEP?Gz!__9c1VvR^duW5|(nzkMzo$(E#gEqft zqm>gGXBL@mC^8XTWGbMj(wc}9CZ|bQhERPPPAZIxGfekO@oY9s67RlCt*9pwz^7r* zFd{Pg@>bohTE%RtbkHOi!-fk;Sad}l^)aLX&#UHjNV)e^{lDjHb*T>FZ$&8-_Ah-X~6bmkAP zUU0<%ufrbB%~Q6FJF9VPaO?GRlg;Ohzwp%OSD!T*zf}-b3+9*1UUh!`Sv!z!0pi|+ zaqP$Mu~F<1IMG8MQ3usObAR!i;?8(PesJVeGTUme*s0<>)mMVYgCjv+lf4eF-yIdG zwr5xD4x6Jk-G1Uo6a5^f<_FrIBR80&2pnX3p0$9&Rxd?4D@AD+?R6_dX=^r%!R*Gg z=dElE!u_YZF~X`)w6;<^JtGd*B+%LsD~5mTf*{4%aK)sG-r%Vq=?LBz>FfuvVCU2<Hnw>~BRHCLf0^_z2&iY$ zjm!)st4~)mY;78A(W97LtCT_#IEyb<8ijbf}A5 zvt@Jbt-lz03aI|H;d8kU0b4Rr5h-N&vdU@|yv5c$?>uXrSF~h=GK#HnZ*fkQb&~fS z>r8Khw9LA}`kC@ipJRMZasJskXXnq$-&1^Fu{0@bQejQ;OzX_7y22${OA1@1HCby4 zR~7dZznTAj)<-!X=eq)a(Kkr;4HQH@5(d(mR5etJRxy#83d}%M$)!nEh(?`CU3S!_ z_Ph3*J`G!B8pN95DPztkS8htrQ6>IEpE$Z zMha+k(dQ{(^v{!KqyPn_1T+*txj+DrjZw6Gpn_y#g`0{R6U$v}J|yl*vsc*!odZ^|1_xQ+e| zAbIbRcqD1keNwM0l&E;c zbl1aVBMRb4`__HQ7;*Xpi1Up8s3%U-PN(z6)DYz=FIQir-JX)cInYSU27t{0Y2?b1 zmNu-|?JkF6VP+{sq&;3_KtY;PB_@$N%8@+ zLjq^uysAsINTLjqlxlHDkV|w%Fff6lE3Uwatxc#ivL7ja4@aPnpzB1%30()B zg>})sQfRk6+e_e2eu)?xPZE`pH7X>#9n=NbA&F;p=iE_TJ zjcXBF6d*f+C@;By?s>=1dvBVV*_)#GYJ)d7!f1Ph2_6!q;*7RS%(N`2M(8OfJTrg| zAPTU7MFC@M9ZfoN^D0U~U6)iCyquI0mJc*Y6W)p72#sT<@-n~<6W1IjA$J%uaVo>Lej+I+H?>%}5uS=^7S~0}W_Gn3}BEh#%Fk z89r@IG@VH_rK#P9-Kyp!40^zvtE4kHVCm5u#uQOK0#n?T zAt^hKF|aL)&93WS77bHJ0nL!$&M;z%On(9=|r#vyVj#}SG-sg_fm0|cGt@|MqriM^opn_-~e}$8lE9CZ8Bs@4*_V{hs ze_k*^h2$`kzynP74!D_UlTs%GOvDYOr0#&%5OO}z zrS1Tm0t`^8+fLhSB!G_wa9}~0qP(99+~HGU(hHVeBTG{)c#;xt3|uZY&V zxr8EoO|@<&VFWeIs}8%~1vH)|qeefhxrK(+}m1MDOUb2XRz=7R6ltJVRlYsnC=R zTZj5@oG|O$#W!C|sy=@c2K7w9f_Gp9xKIZ1urY9nLU?hRofM{G|_8c%ZV zt&$5VKESMCt&)aU!BP8d zupFZ!CYk}|$#Xf!prA923OmhsAay(QRP_}XR$WQgDp!w-k1=W-W0cv&q;6MA>UJ@y z+r{X!i!oO=`^_dCT&C1LI`4hNEZuHOY{ur#3t-y)3;W zjYzyXSCE-DF_6hP1fvrYldvTwVbh6$g=qwW;u#aK(`9QaS~E->N>rcFDQz`9TvaY( z){hchkg|N#?ypcW%i#bGGon*l$;l>!5;f)SDn@G!9MffJe*lmRr_oz(a?5j<|7P39 z*REW3drAM0_V~8#-+$!d3-7Z{0nt~NtIt5CnFdDCzG+r@jypp2v3U5pn|BK;_LJ13_@k*0#YU9|s9okv*)uyJc zjFgzuI=U*9KuwW-B8>j>18t%O5i8M0Kb?Mo5l{G>>|DYIKO6fle$_K;hd+Pqm&2cR zJTvQwOJ6@A9R6b8Tf<*`?jfUEza@9F)kpTS<*3#GvM4%7J+9AI;=qFH;%1VqW4 z;gHg1V?RwZ9)6md3=wRG;}ig?sGsW{!lD{5@JWGW@*HKWq5!0qboFccbiqMU!=!}6 z9KicAw8|1fP>?=uX3QRkd~kl=xF zaumCm1eM26Xe#T8LjGJ1RCCiesWEqSrOye=e#YmWi@l;ESr&^dLi#|WVINAa>@B);X`cL^u zhyOl*uYbhP`-#^iYhIJAdCkG${pJ~mZ!lxYUovC))67^zpKkDd*&)p^T2a25=2Mg6 zw}=rpplvCOl|yt$c@EJQ!FJhcy3!z!N^v4`z^WjH6F@g99cU9IeeOF^m74$7-5b&! zVg@cdy8VZ92exfmcw@D2caL5vGQ@>`*ad z!Q3m~GhHa(OL{2M^3n0uSQv+MLrG7tqKv*? z#uWCTex^e)P%BZtME(+?tZ)}`t zdN+`z44@^Xz(HC_&CnJ74O*^~DXC6Y5vRt?estV=X+fM0X7tkyfck`Y($(P1eg|Rd zbw^NWg5kx`v~|8Ybm@>ysBrCEU{0AN5?d+LOB>uLJE<#mB2ja4E1NH&zAMzDnqKr7 z6Jx>zMtd@UTxO2oEsncXx9U+jG25<1kflJ1U|}4bGQDt{<;aPk>>RsIE>t48Am5^h z2|j{iY6hhb3Cb1p6XOX*i7T$S0;Lfe>iya@8o;FTq=GQcu*TyV<9TM39B&PU!@dlr zsrp7IWn6SZrmCczIc@uOxhX%MKb}mim{j={pKbVM5?!l}*Yr8ByZDj|C+2-`jI(lrd1Z61STJj6K`b%* z;`PBrD;8DeL^C`}Zh7q`E0*s)?{T13mkggvRtc{n6)n(ZuY4y)s#}s(br6^LqrDCp zu1S})*Kq;jR8HeK?s3<5Z=giEY3R&J^~_01a+z=v=|@fp8}36mPFxk0lPb$aiB9JN z%Dr>jFXu0R>WZEDXXQYf4WIiI{scQddUNRWR~mQUe&k2Pv0)93DbaRTB3l6|P>DrR zF>+gInUuX8hU);@%U$50MiFC<^pgQ&*7O9!WC!JePDP=Z8FLWF<8GtWw9md$a_qF2 zCHLeY7wwaHemR|@P|460(8bwjRZQL<>hoXo-)D6!HFPcWV@;qNr5LKC1d(4UKyjr~sYgl0A|&1Z3IRlw3S%LQg<3d7>JCA5 zH766K5u-e`Eoc~Xhor5-LWv;QtaP&Vtpv0U9LEyJ5~zfEaX|YdD-}tW^DK(jVo?xB z2uLzsjG-VP9#~|V5G+cHg+o{l(c9hiLX{ae2Jb9u?cfqOxbfZ*-s$SHKW!I(5i3KinC5SQ6JNk#38dD-^y43EEIV2roff4!x;Vu{74~`ldEq9x$-d0lQPyRF2rurPbNI;tx zB@D{E1C)7nj50rp=fRYQp4|}4eZ`7ZYtp*P+GFK)&D_d7BCL#M(Fs?^1Ffd9)M`56 z0&tu$Lw(YgP11H_7cre<^eKK&&&!e9bkgEYUp+%8)#p#kIa9vn3}?Pj1D8k0*L&>_ zo8E|~`>rj`eb+t4efN_uyYB{>`>t1a-_4vg*3mD`eV2uuV0wJ&k*OQ%BJWryUaY7N zADbz2Sb0&`=0%B^BCes*d$2~mIxo`E8Ta&|o|It&MNX61y zwm<&;ZQCCQ!S|mx*Wdh7*YL-~uYVWc{`Au8kNy0W=Z^su%o;wI`v|CDnEaGUzs_Jv zUoZfl3HVLG2~GZEW6i^9lOQ_Gr*;#trQ)Z|*d|~%0czSalS)xvYWPd1oEeJO$yvE* z$mtfXq9^HgYSyGpb23@Y87fJH-wFqhg+nU6FqbAKT}1kwQS787v@2Rw;B9a|sc=bq z(n*|JL1~3bPm;~z_S=K*d~3cf-#*DU$v)9>m&;nAJ{!k?(5zZr2U&8$8!}?^GVKKBXRU9rk{x{KflE`;hvncO;tW_5>Y{X-f^t=l58n z5#Bk&d6koMhEkQ#9k2A|cvV$E(40=2>TuBeL6~_gQRA^6Ivwc9VAPV)*5%xO;);}b`$p?o_4^Avr%0{p^sRbB{f^A zt=`5hw2jyZbilO!5+}3}sTqi9m#hmWpb3YlD<2R+>d6;WPoD^>Cjf23LG>hq02xo} zRFP6dnfmn!KocDRAgIYMhgw}NKR376v3PE8aMY9Uh`zpa|ArIA|35YSiL)R-9ahZ2!}Ar3VCq|z30g1Eq1lTlfH zW+7jnH-_IR#RY)|B(lrBQ;Vx-2V8N%I=uOrw-VX0#GeO-+iG)5FKMV4UjL|CkQ>?L z%-{=#?%H<6CELlS&wuvhw8q6$R=6D@z6hwYfF9Ik987pFQ$R8^eUOLuON2A6E}SFf z18>eOaR2Shf@u{wV;Vy~F{cznI;Ajb3elD6_nO$U-5NTHfH=0;5Xo%npeA9c!dbrC zpCP{%4uAHKCuj{0!)X^fhB#EoY7ivVAo*0UMD6Hu^d#c%gE;r`_ut7Rt|qz`k`5qD zH&vjE!f2us%YBEB9Xm!-TL?PyNzj?Yq*<4p0;6(|Vmj(tOu(6PxHbVw*waUNh2wHS zL~1;tZq6Ly-BGI)jPh3O@JTY8%eLtzRc2n*r{0(+*0I-~XLC{Nb4_LRpwhuCiw(!3 z(>>Dzi#>}2t30a$-yz@O?zTUuK1gR5Ldr(c%54<3**fe!_J?fyEeDkSHk;pejqT5b zb7Ze{wmUC}(aQWs;-!cdih7XHB}vE8DP%!TrxlHsF$zVmRle4I?QC%7I+!D-BRc}^ zHYOSx`6v|)@)~s+$qUe(`?3&!i*u!iTdOe z-8NqH846)mgD>}G2~&GDF`U-fYAuO5LrEsJHk{t+#AKvm)OS>8UTKz{PGj4OLsUDT z+z3xQPgDJ{ll2G4ZlE@)O()==t(yflXUa#Qd|`y#4yV)22Mt$stD9+FR>@o`TVkqR zrklE9zc!UEI?TE1eHkDB@Xg_Wb$)Q&6Mu+38M=J=wU0e`)yA9f)q#UA;|#1kj>#2I z-XGc2_Ux;#Kl3fx1JJ7*$!5T@v)DKYb&w8@%*XRVX3Rk(EOgMd!hFY#l&zm=Qr|-* z^I<3;C_mkO2Xu}SHX1w=vwXFr5D)I(4=*@Dm-tWMqAE$~<6uo2+t)`#io;YP2qM+=1^@?zA2xgSMYpUvm6HeUtl* z|rkK(~}O3yNqPlL(|W3UBZyG>9j7v z1MgDbRZpK}BvKdOO?K5}NbpStx2keFcgfEI&w5Tj!$o2Yth!O>Py>!&MwOMew>6{6 zmK~_#;Gp+?Syd{VOz>6V?5rwFGFoMhi$>;BmoPb3Bxz&KM->z3T*j%W7DHV;K@}(u zP!?4QP!5-mo%pKZyZ-pS@zLVE{@)JYg0Fw;%_+klkODmX>8#Re<)07RhJK09X&i2% zH247^LDYtAMJE|1``FBPYT8?|WLlBTd=I>;yFyyRouet5ohV`Z|IJx&lUIE(USsbxQ+2?&PMPqabQr}M-Hak+(a z+W#S(5jl&EHkPPcJ&C@=kXi9ffTKf+8Sa*HI~3v;HBVLrsJ*B9-TBl-?9>2U-2w~9 zVgbpkAVlPOffp++vv?s-9H%T(c5vI2H@QEH(nBK75#v&xTqRDn)Y$9ojeMiHOlq`T z%I_5JvOF*Tntxq9A$}nJOZ-&!xfMm=IG%{2WU#zwltcfwbe`09SMZZ_fIPFvLwvf2NbHEUhEr()Aqx-K`t9H8jN4qMOA zjU9j^rN{tKt^iZy`E;>WQe_zM96K9C&_36KW0tEpVhP$^71Tl2pa)6CQk+p`kux%? zDHZO^pv3sKK8;=WWmOpj00dVIL?FRrTyf+mPz%6-qkVpQdAm<#Bpfd6&c-hLtOfyL zJd$SRev8Ml*AKaQz18dlZ=LB2(wG0XFQP}M&NfX3wAB=lf#x_B&LZ-Nmx1i?qCQPR z$xfikkPb1WI9PIBJAfbiV0a^b`t9NSFBcAf@f7YI-afRJ#4Z{>AI6c0kZ=(Anp^nW zQy{OTMu;QD)AXq>yV0|H7pvxaO(C@}14&uSxG@ViQ}#5~TyiCfspX)SG^bdH34=H} z8pE9yLmrJmeHzW;jj`$J#S_h?1boWMXGvS6>KI)k=Cq|^xXnJDOeX54$;!+^M#VW&_gt)uU{Lm+1Z50 z`@qVn7ldZh9~>QU=o?KOO_or|m1Osdi^IqU`VkhLfGc*JNXMPc1^SJ`yA)$H0o{w# z1p@c6W9sY2)YlSB&DJrB*}_Kc>VBse7x9G(ImdOr>n0aRE5|0#kDHrU95&T^gOKHs^>y-8XtuXpbhFOs_DL*ilQ0rx+}&n*R3R{<)p=Q|3V z`R)?$WK`+iAzvfk$=zXl7(YTDv4Sdq4v2>xKLg_VhUI z)fHC~t|j~;WreHFb%|@YOK~YYhcN99y<yl(ma=G0JK?2e*IiR2O><+Kp?vPzh zXF`#^@H!Gwc2z{MVM)rquTK*J5{MTz~+aOidL`S zcI9$~D1&5a(o*lj?XJsR)DdK9(y9u06Mqzz zL%BnvX^zyHLIRkQ;hLEmt>5%Vjn&L@;t5dm35cc~o;!Tx@S`<+`J;#SPCVeOh_B0gf3bs$dLVcftl(EJHi0LcC{kOg{ z#PpTn{u^JJ0}a&sl(1a~CZDD6K2TnvU&oc|*MdU*nxpSZ(4Ud1UxQ(Nmx3a@TA>Mh zgeO6Q(_kdt3@y})_!4H7cn6(Af?I>YJ&0q`nWq#A8p8YEOyT__Q+Pj<)CDVziBu2p zuQ#R{mjIRedJqOQq1y72u9H((r+4@3~A!&XV|s_1lZ*A-ohVH4StxQOlv%FDbM3WkG3v??~mu5hBy z@AZ59oEYH(S=jA>Q&5g(VZY+aLTn%w!QU0QDY6f#rs|V1M)lFvo-#VY?DlzygXH98 zQ7fmufmlw~z4+4~EWfO=yKBKkw;a2Acpt91<@*!r=HJn_;ECa12#0+c^HvYP{M^IC z!;dzXJuzuQ-3Jf7_phQ%>XpBA`v_7_ zT|nC^=wiB%izx%HpsP4xEy$#ExAhLr;qan`7&E^NyXpdV$7e?E*_mE}S%;oWG?h_D z=#ymzM@vv+o_g%HW9nN!rP?6*QXxKM9Y+Be5zuo%7qbL@L#|`<`chUU=@}(wO$pEQ zCv(pCpO>?aYx8doug|$Cd}-zl;p;Q+_CFeaD*U1UJ?)I^q{|P@grEslC3Nq^* zD;>n)h|)~(s|%^88`&^GvyIiJy9LG4usfDEl@`NQ$eI?vFL*2k@TeN&?H>lX&5JeJvVeCM0azd%jYnB~B`M{8JfZb$iqQE8|9f1FKYK@ zGb0`}d`e-bZJ+X;IGaqY$QSh$U8uaw?{=wdCmLKaYSZg@!hcEg;!77!!jq0{KJW#W zp1=9z#TWhO1CPH+e*XRL3;Q0u z|KZbI#di)och3z^K562&3-DV7iZsmdTQ|5V;Y?oeX4>rmi|LtTVJpiSeQ_Z+e~J9M zzdxfD6hn_u5!hJ!5HZBQF)8WOnilHyV{G;Hk-k_RlGHtS*l0m2qrYa7qiH4=@Zv6V zt@T>xiw?meS%aj`GtYNUXnJIcXN7M?Xi;R7w8^^0)8^Y0S{2zzc8J@p7ddx{cS^Ub zF9zQvuZyo+fA0*ZiZo{1#jo95CFyDibXgdRQI~qvLM+TmJ-R>R`{w34mOZi2?FzoM zlRke++2phrWQoKCCY~5z-c&FbgtJP=iw_nyyeiNmt6AbqnBNBP7`?*^Z2aCSN0E&yg58P{Ol8V9>m`r zzT@Llcmv+}QR_7@_TK?S`y6mg!44)}D5J}3%zZ@6) zZYFoh{Np^fAWDzu-F;ahv$^wKmICZQ-pSBJscP9;OkKhwZChJ9h1 zkhD8>(SnkPQUPm1QXoRedKg#ZtC4Q@-kKP*FhbuawuVaG=EgKBQ$Ccss~S(Vw7`I`6} z_j}?8whx19A<4ESd{tzkZ4Q}fTTWWZ8@AsE|Lp%D^j_o(;>5h&8;)8fhY0k_iW~t) zIU2JJ42_wZ8C~{^=mG>MR-H-bDrb+A&t%JfGnr`OWD5|SsRam5wgAEDH$3fzb!T#? zpH8zlO~*eLoyi!^?yuPg#F(uKG`MoVvc}*`b2Q0<1}T@#g|UUb5?k0S`E}!*z7tVK z=9icB8Y_C!mK>OidFiswFYhm=Z!d;@uclCK*e0$E-3a zF1lmskA^>PfAzATZhc@V>+uV_9(r>7w(kwM5_#$ZJRVE;4PW`tO`lEYo;Y^w*%w}W z{ROH+JP6VxU1wm$Gj%U*yRo`}=Q1tIeab7KT7r^ll|kwnBUH*`Y`lh0xxWFFUP+|F zFxxI7wXi^BBC*K)yxE2km~9o&)MLkXVl@?nQ9Gw@DnHm@)r@hdFDm#SEF6;!&*?N- z({C8eH9OYq3++^a=IH{1rmbmHZKeyg9-?;^Tj^h2)l_0Q!$*n`Kllv!?3rhVMB(tzLuC19GfDr@e5lPm(B{Mky= zyErp^e*>q9qF^d9LaMt2wgEBR|4Uy7A~b1MtXUUYS6Mr(JyyXgr_X8_^BkJqPj)Es z|7?vP|JANat?_G2UpB`4+o^l|=`Z&U+Zd#(Y8TIJ6S}l;2r78|pv_ewYc^_Hrds-h zQmO>d=_WZjlUa%n%&d}=Wja_^C1r=I$l%D^2SNar=^zcwVPMjlQzbdPaCqqb=>r}B zGjuQmKpzD^+2=DSs0_l*3;~VISZw2Dge5>2J{@5UOEISCf?fB#z>&i*d@(E>{`?C5 z^3P`SJ)idg{SMRp#{gRtWG7L5=F>K6hP8`hr%%!*R4ggZn3`fSJ55aWUW!+mfMog) zq&5SSOxZ$~Q*jI$DVu;`0-_06Ou*p6$;t-zGTR2*-L^+;ZA?nWb632Tvj_2%%*zCN-9U(`Mj0nCjsUV(*DCi}HA0+Dz3WAc%h*c;ilU8(z z(AbDlw}|4(q+Lp8=Tt~NSrer_PNFOD-U>uiq7jbhrc$=%>BIr%7P;Rsh;P_OMW??} z)T3Bvpxt{aW6|pA>NC~mZce-OsSc;pY1)bGBX9S)tL%d#uO+SJRb2MCDvr;{sAjkT zT%FE4cx_2*m91xCl`R>svSml%I?kBb_&SpjN<AgBArwAhI>9V5}@Ollx+Ix%vpPU0NIw+xg8&A~sq>9DCH z1iO0aN;0y(Ki7!<96s~L8^dRAS$)l> z4Od^cZvC}W=ImK~#UoFA>+*-WNa39u?|bu|`_|o2Sp3|zPmLgqkKX(fykx^wSFT*M z>#8qC=I^P0sOMXcJwhd_%_Dyi4hgTKJp3?|w!;x`#79=;;|pXDc5}J8D9arnc_@>u ztf5;7ic2vT1DOsEki&v;JU=gYjHs2H*5A1)`<=ZZR|C#ZwER_!j-5!YBpAnvz=Mwc*q80Ak@-p5Zkj4|bxJ?p$UN=vj9bMc!viauW zSMK}W@ZN!byzuvXF}^kaWY+2f?N>juBWv<5Om4aC)Y+uwaXfUqv+EGP;CHX%u7UM~ z|54h}GymMH>aX4V-0&wo&6U`t+i>|I;OTZ0#N+k-R9ak{ykxFA*L%KtzL&S!GU<#@ zAgJ%I;2why>ASwWM>lYF$K@k{9d=_0sjN^mkeL-kcmJoIDTlQ%hW~Kz8&~qeyY~O> zHVt2OPYI=4c1`hmfx5LReFd-SpTfjz+Ku}hHnv@Z!$G%e2!8!`4P|Tr5Xs7N0h}_= zlEPc(x82(K(eR7I*W!zxy0>ZGgsXz5?iTl zmF+tDI?Ep0QQIk-RkJO$f!JV`iNSs?*k)yu6E!u4gIca)v1qd31tk$kqecWTA%X?6 z`an~VY-y2k3z3=RRZz81#y#>L8SXJo+DWpYY9+xplf8rx8sgG~g#sxRRtbBAqrxdc z5C+M${nk~F1QQ|3WvJbR9znW4Jg5NS(8*v8^E@;5Kc(BB>bsnJN9XkVkQ0Q$|Ln84 zF}=uMAc`NEyk>510mPof+$<6MHXO5zHKi{$Nt4C&l_#=n3i8Iv6HJ}V;6iGLe)em8 z>G)XoIDEtNL(hOT|J$C93oqmgKbr}7cPB!klde7C^jR{w$ZGU20BIdZXE@L3gG_eV zU5t!_Q0rn^*+q1nduh7&tIW-6L z7XxGLuFU7)=u!2RSB}!TZ>l%ZCP1bgHYTx2Es>o$cIMex&}9`$!UG|nWnTEHe{IAE=R-(=n#?l?Y3)dKZB;U&9TjKa)o@J zz1XpgJD=ZfztFMEE?bEpSJ@{y>d9PghLn`&+ow5{JIP(#?b7Y?BizH1=q5n2O9kQ; z1R{fkSt`f?%C<$$MRY|ik?CjFLA`c3RN7Cg+&ymMK1?2gfj*&6&|pAJ*l)8a=9bCE zzQ{>SgQ6vEms_#*FjU)ttq>Q6inY(le4W$xDLtc;gM$r7b9Sg$9V870H5f|F1Asiz z@1klo9Y&{{s)J0WW@`}OE}V9IqKV>lb;=Wf{=(|XlVjIsO(;dF&4icz2vpL~0b^fB zWaM>YP}$&FLHe}19aLn8LLVA>(rX8@svN~xOjkNkS>-6JWZ?dB5IWBE)uPKv*|fT@ zNZYN{>f(@XGI1K)4%44LOPZw*!Yo&g3xh&^C(gy^m-<7X|6t+BaKn?s%V0GA{g&Aa zzr%e2`t{F0pU5BoT%+Ip0-5bC;Wgwy5xj))4q`x#!$R<_>eG%pK-FG&jULZElG5nJ(i=;hqef;WT->(_}x+ zl#J($Q`VlEFEE5XPXpcSI5m<&(KVyHEa^hu0@F5T2Bc3SG&OCF?4$nWWdm(i3m0PY z7RRN{3!tnrp3bW>Ijd6N550nb5RTU1Yw@I?$J}+?Z2}(C%I(a(v2x5seW~!9+OpvLG z$5JBj&~xf@3CdP0-1^dQcAgvFnXxu}l!$%9D`%{uA0kIsNPlRj(|+9Qq8DbocK zDNRe1y2eg+(lzaD(s_^OehN=SPJA20oZRQwj}PO?lp`jssrjZou|a(6K2!fYeUeUd zCQ`azb^0_Xh}ccQq)+UU$0r2C8$6{44p>TsQY&@G;S6`2Mz++`Scw!#+7OD`Jr0N6 z&ifRm0Q!8+)Fi0W%_Ku7KdJz-)eLlB-;(rY@ zZaD9Tf=6#6Zwwu*zv`BwSnj^@^v{NHkGlK%=N`DbufE1l{`2wS?JI`Q{OW~U`i>(3 z?HGAU+zYy$6$MZP<)d;uSzjT(C$uL_Hpt;fWRTpQbOuA-U@#Pn_?)5egoOJkvKLu! z3$l^DNh=o)g*Y4u2J;GNcnreFlf8X;*635@Zj`_XO(1voXFonsr1w6!cS4dDI%v05 zoVT1cJ!|)q>~m^ECsTe~Cw1SQD#I=XZ9bti2+G$YTwa)&h@o^3IIJ? z`ts-)o(mzSs~%HW@Nk*TQDxoLA^8aj-lZnNL;Y{$K~@7{m# znydHWs_Bi(r_F$a%f9uCKjL@qy#pTXf(KJ*U|r*Ke))I*@YAOczxX`+-?CQSz zrmoMrM9ZiD!Z+Rfd-~u7{9N~UZs?{Ds6NmP8kt{s7)HtUtVbQs*)b3QMCL7=9Z?cc zN-%G+*}FK7&;e9WR+4tmyu(hp%ko!L4@_ny;cDR0jxWbN4mpgW!ghD4o`3q}0`&}? z=c95fReb1vENn~w=0^rBw3T#yhhcSjjj;koM4Tw)Ome#`o4Nfr44<4k$$5zT)<3S} zKYQYa+lJl4pAY{23H%{`;U2`XHFO{7`;?&~{I))$!-MWu$V4@MW==!Sx|}Y{RTi-| zyiMq^bXl(yuC$8zehU}OFUs_1(2oedpZ3j&_rE$xoeVZuEFO1eQBh$b(!GvinVBvm z2gfkFU>f}irmPl9LohCyzWnbc^Vl>I+h;*z{E>E@-So0m#g zZODt;qBLC_(|c{qeTk-J3l~Ef4Mvb@^25xOuABM4Sd8&yB{%Uk?n~@@hq{8BzN5#N z*JH3v&e;NG%p82#jBf-qlp?F z3g1rRkNmuA-TJF&l@!uYnSBlFK;0QV=&Fo8=x*T$-1qH=xB>eM_E*q}jDKXf9PSKPMg~_T7PyL{ zT5OiR!F!&sA+$l*lyR~9diUMjU5>k>kKhN%Bd*^#Jjjc}s#gv3bV8=Dpo$sKw1O(t zi7+4WWZJk$CT~&W&T~*)!x)ES0khLbH<(QcL4mj?V>xB$k{PDRq0E%jW6C^d=mLk6 zjIpyNVnFYjsK5i1uTx)R$2(Qk#z&aw1N6beL?0Vxehwymja|Bp$yj7Zd|o%DZv4PA zXAM95?#bcbe&UWzEP|D1Zup1M9D(LYM!gcBCn9@61qPrMfLk-!}oJ5 zr9_}dn~uKJ>r>!ma|vF}G4m^ha2z^z>=@U0?AR9%A3Fvz(jSLg`Q5{Rg&Yfw)w(rw zWgiOh(`%W3gSo0NvJcVJXbW&a&0_qc!>!-?7L>UY-_K9sMONkwERB3Y#Jprdc^uB; zh?K|kVjd9Pz2s#=$kPG}TX0CG959tU)PVY|Rq(k^@- zC0(8h6bg0Rpd;D*(?cgHS!e=cK>e+Cmuq%4KXwpFM(L)BP62cdpWyR)RfMtPR0Y+V zR0PUap`XgsV`Z-Ll4EdC0m!AFjO}y+@%(a8np7D8G66W3PaSwG% zAfUxm7a>}V3UIGc*OroFsD$l=#I`wlt}NxT$TGCK-Rv_}r;`?^im`vNY36 z!)V%lkhD29#dcF=emh^68#R5<{Ag~^=_{P43RA@+!qegr=>_@4s5HmcXj|ggWLxXF z$bFILI`>oVcf;>SPK9kxTMv3jrlQKC_);|NjYh+AG|XWlhohW56O`}=`|DlUY<&fA zT|Kg9%#N9vIc8>N#+aFX&CI@LX2;CT5HoYkF*7qW$Gpz}=FQC3?yXX()ly3>U8(Dw zQlGCONM3+i@}jT{vEg#qq}4RWu0tFHE?$8%=j5KK2_BDCft9*v%!iN}g*Yo;WN^h54V6tE?cyHYZu(dF2d#nkWaduXMwL(B9$ z7@V?`3@2$}8Qi$IqzzW*$WnEvSwhGei|^z)qUx>mp@&a(J4rv_D77de6qw0)+I0PX z$>@Ji5ZrjYc>fdMPXE5Z_b2Y~hkmE0*+c&%?@yB3a7xRHMZC_lR<}i)=Lf!aK8Eh= zZPYOWuajP@49X)f2A! zse?HkqP3n&41!&OM2O%a)Tc!cqdW^^2Xj?>96k`I<7U-X0F^E!6|Q<)VX;73Gx9NM zA}SUr+^r^Px-=KqJau`+{iH)5$eYx;0D_YyVb)!;NuyTvpp#c%2Svsa@>^`&hG=Wq&&*x zibHS$en6k-rg>d*bFYd&h0PJJBk#OlRBW+m#nPEKR+fJ?wS5_wF+~>34y-nK=P_Pm zk{TCYWOEbr&&M*7+RFqKHMxmHI=5)x1A?^vzkW;bfEOO>^I!d=$0@?u{J@k z=huL6vcu@j?sD$UZgTEry!gCAG((;3noQ;Ij=Q5B|DLPyyM3-P((}4R(xI z-r3^Vg5QBWT_sUiERC!Khqw9k;xQ_qfn^;yQT=?$49AE$N0$@fiZ)=--889>NF{~V zhLWNJD51ehKque_lBG5*(MEov%;;_hJyM>lRmh2~<$F4^WH2t}G#FT)y-m8_n6%ij zAblu6?)=ySY2Qtw=M_K1)-gGmn*0c<$5@bS|040h>Ktc%aDX`3v6oQI_h*FRIkZcz zQH%8kQyGF8zN7{zKU>M}(ZeN&VqDt=%Kn=z!y}nQ%X!$jyA0zm)s{zO4?@HpiAS)Z z%Wf)3a~*}#Te@c*8Ps~ZsYxZ#XXJAbpR9=3lZ)63Y&{H=_lGo0la7Hkfnmpfy&LR; zIhu!%Y`FN?qFBB?{9}AX4^7Wyk?iE`hd9b2N%w~$gNo}F{YC>nxRGNa zc8IC2X8%V(Hq7@zeY3mR({THD&(mSF@Kkbr3*s>7w%9_lNF^QS&n8~-oEsF{enD<} z{Kq);LUrD~Qs+4l&muiU4?)i!5!)o&`#3wP&6_xcvVIY*Jq!j-S_bx&89=?`@Cz8C z4POR6&OFF?_&%W|Yc84yD(d&>+I~%&K#cKbs0ql z6pX@eBPr$ffaajDlv6<}lXRK;`mOG0!hX9>;)B-&wHWAmUoDuw8K0-QNl_fge72=d zOKW7cGL)Jvj9yDmh-|^v)FsDMSV@{!ahxS{0gcKETqu{78>^x!t`n(ER;g9W*4b-T zwS3Q?p{2Q5rlw5%^dvS_102gVN!N_4XIuhKjSRyELU4m|{w=+`DmbI3OWbBGej|%t1+6)p! zqR3(s?zC^UXMrZnE60S3L@(_m0-uu0lkgQWJ_y<}3^*Pv`9@qsF+6JxH|?vtRai&y zwvhLubx28Nk4rO&UBOmQUeA?)vTYZkWL@glXl3|)OUD=af$Z!1(mBWyDUTng4#{d< ztt8!*1W75;PUKq-eYeTpF@!nngUHw$UbJ?#IuUA zZF2pqCo0(lU^u89IA^<{$D_jyrQs%~U7k8xhjUbBGVz=b!{_AvDFh!28P~qy0V4lo z0lJWmb0~jCcR(&5Z3ld%9K(fCT2noWfvT7yQ%~|zwns?cPv6Z(*9n<$qI1f@{C=5u z>5QTt2eV7fgKKHo8quE@R3lvaa~#QR>EJmTTE_bDWdX*@Cc}GOxcS^DN9AhT!<=I{ zSibMzvAcnq7c>HLQq6ZPS5U)-J#u~9d8LD(8JC+M>kdBV`y<$a#hs;7`w?5~8l^UC z+m!Y!rY97H=ENODC%^ubO}z%QkL{Or`i$AKGWs|Z9otAbglF&)nMPtzF_f0v6KAbE zJ`Sm=bJx~5JOuDQ%PNQ*SeQKc34YE5$(}=kDXMP>!I0PYF9g$}j-0H%RCsteFrgs< zuqRq(-fu>B#ydT)&S$>eD;f0H)xe3M8HHRFP9a&xA})g#^tRthIoK0{=3>Vupto&| z#Xs;15T9+Nh@}?s3=hJlmV>&)EhEUz*_&yn==*G-@$#bLeQoyD5$Jil zs!#Kth1VLZoa~0`aDN}xch9j;)La&j)V{`W+QHHb=fe9oEW1*>eu2(RD(qUkSZ!jI zSW=8#2ZynP@u+VkCtW36&Uul|G6t*pTadY=)MnHaoK34&cvHAG zO;r*{+oI+AP1Di*4cqkM{^BcrxD7 z!ZWI|J{Gm)TSf~!HUfTckF@v~epSDmFIG=Q}RwcZyuh}(OhRE}JBW@Gc&P~w){mKtAM4g{l&j3M~68Vwaw07 zwP!@Ab+hX{qV6WGu_l=aOH~|(vrb3?8 zX*{leK~1&7xnJsYfWm0>Bsku2gBvYdlaFc2)ZBrP&dI9a=O;P5e{OL;y^&K#Q(zaN zg#|Id!wBRPeY*Q@V%kN}WGoB^pf;_gpYyNn))3HrO6XsXYq?zWb zQZs&C<0J!w(lRb3b&n@{)rFJ<9+P?O6jky7Is~bYOr)$nJQ=Nr)3u6bdmvW`!jG)IkzSAE>;C+PxL)RG7p&D@D@R5(hmoBOa z6p2rNcX!xdz^F5l{nxu9OI#KQWk#vi@75k^OIXkmtC<(hQit-xedzWL~ z11RhI=eZ{pL<1Mpu)06vz^cTGHPA?CqzNc`s-cSsMJUIGL8tTpAu*=n>P_R)eR+N` z7kF`|Qb@6Jx5&e|cVNrE*~nLcIbfs`Gqt1ByPW$-OHdh3$D|S*%Jltzq=HVBcyK@p z5$akC;#AHj@^QzfZReZQl|!lQNqW0FN)V>$E-U8Utja?-Oj*oBBv7ahLe__u0tlQh z--0>mXT!gB-kYo>+duvmT8U`*=3>566)me$vf*m?$ORz9N_j*SFQ=^&aKu<=D`8L^ z=z`7vQxS$4^V8RvhWjLGuExLwOm=xw+^uloIJDF^ARhQT<2=iM0Pnd7jaH6&@&-K) zsy!Kg(a9dC(z4V{ zCWV)`hX1l!IY%aOI9bZeOe zstkUn@eA!bzt2c=!ESvg0|;T=a^=dMcG1Y2H^gxy#ws#m-5+ljVGRB$NJ&xkd7^<% zT>W0`Rd=K>BB{NBWQP^D-gJCJN!ZfhoxNytj?-agdI=QrWHv-6*vOC_J}=WR8VLVX_L z(=`6ftyXY~aw3Yjy#wg@Uxc7wJ(6>nS~FQ+%eJ2!p4xGvVxhkys^(NLbjMlSt|Bjo zf)8pQ!>Fs-h>OEFGpZ*u45?nU6KwwZyp6A#X>Im-9<+%wdAFw_Fd#Q%pEvOO_ za4E;eojJF@k};mM37E0f)ZL1&#a5FJ!)91nOA&U`TjgaQLE+mX4O`z_2PAQ*ex|0N zk%fthKa205I9W$>A!dDIc`th?EY~{N$#JTU-tYF5sq_;bnRByv3kdh2euolW-g8_? z*0ikvYo`=T8Cn?0FzyJZ(@I&^RF0mU#4`<1X>V=L9|y0b*doAtQt9T=*)D$hW_GCF za^xcp47SwC8l0E28N_yY^FjQ_umfB4e6H|54EoSiUzpVxS?d``9!D?7*0nRD zr_tx~L@TK)-?k{>*TJNpTq=Z5ZMyvM`oE{bbD73VPMvi1|@c~ zpT{~1niZ?<71ocI$vd=`D8_^|wJDF#eo-N(jYzl(1#pI$~H8EbzC2G zbdz4#NQWl8^mUYF!i*m&q&uRE`B?^m2E_N%?K_&1Na66ODqd8d>AHfez++^jo~H}2 zcgBOXBuBGtzr#V(=_Bm2`}qOF&D*Z!JEzV^eb!?~c6>^^!RnP7?{+yZg?3S%jgH6u zgeGn^h_yM75t9Hk)XLb;&cZRzqWjf_OHBn$Ln7nnr>HdPz?u9r_4h(awE<$K59l&2 zGzciWH-BN9Y%XE8Ngax6zg|-5`3~k~ZZWEDD|g{XlI~4Fn*x^Wgyq3>5dwTP69(z} z&v5Q$aRjX-CR=p!;~4ZZy2cpn49he|`sW-+QSrM=e}O|x z;@wzF=o!~q3_;jPg^w-jEWVB}ava7**{Qy;qR=QfQ!uZfZED_d=R56F^nNu#r#i|I z^LAL+B(ZrF+n-?ea4`U+Y}in!E$r8vX;S;5YjYTe+?VaH!~u~~$c^?Of-j-OXE-fp zz4xx}kBmLA+nRJbS#cj=_MI3TnA^+7_Pp>{ok(tF4jo`a*3e!^Ff38r(gs)rZfNrqJk-o)oFt~rnhlt%k1w+yUS%>&XmUN?d(1{<>-m-Yc})uhd`EJv_J4<4 zk|u(~`kF2bj4CD1RoO^D}56 zArwwSyeQMC2csb)!>EUd$8j=^GyJ?d2b(ds@Pz{s?se|17{rNc^-TioAbx8bPD7AA z*1CrzfmaVKc?w+Nm!B!x-ES5H*z(&-HiLFi-dN$$)WaiJ?rlQG)TTHb{$Ydo;O-uS z@Zj!IgS1{>v!4(!>Dcd~AR@SCEpS*XjHE_AQz6*FkZ?Aswab2a@GP!aj17i^>|&jnZ<{l5{@Tdu--3>GA_!#B$h?P(VQPu&ZKZwRhod*T ziiRVQU~*VWKy@g-go+T8ffOZUJWLf9kDB+1xW7 z?V68(!Hj>w4N`n)25o1`G}!+`YYtKXo-W|${S}bo#K?`#-o}4vb-N>Z0Q?+uJfwXd zX(hl_P?Ar^2X@cufCW)`^DDqE(3w@T8GpuF%<79Cm^~ElsqB71k+goqC`d%f1+@|r zjR;HO6o>=ca5MHz9-vYvBdX=FXB`r{NTFE>yIt8O|9oonWcnd`Uvp?hSY&n!$i|zO zH(p6TxS*s^vR+y?=(r52u=w+Nrrjm(0l~fbN3eCEhLz?R0Lk`Y2#*TYCQI#M17o2{ zW%-4URvdN(&ST~i&we6ZiG-zku&mTx# zT9W6p51PXp@7g{{W#2cuuIJqgG-c9H%`; zPzxMKs>t9gu&XlLXS{wJYgx7F$crtUs0pf+na|^N5#V<1TH(e&1JZTWLtaEiJBR|3 zvh5tGa~Ku{FKh8DvlbXfZ(MAe`bz;c1za{!ZK>a{#%vTe0mh0TzZmdXlDqj`I^jM_ zY%=7($-bVMH1z)BK<)3YhBUj-r(2w3#mi-zKAjoAVHuLAETHGXes2(=u`xtze8ROV z-_^Uts+{>|-0rYoRn(s-?uM0^p1g1-$AXXZ<0kL}M#3egY2YYrdTtzf#^qFvc$6}eYF?aYTKLn0 zH0b!v#7GYI2jvPJkUL`i1HFc$_9o+r@4Pj*EPgg=F!t_!p*DA5*ov=zpH93Rv!2@x z$6KR>FOiwG{$cTD`Ij+%4L2N2^`YRC--KIpA!8AC^eB&hvH1t$omhEry5{;Se75mS zY$L4+ZbLM`xVT5|V2f6UKMRBzc6X~C^1iV#8NtzcUjw_=Sc~i`7WeHu_dDh>)5+@S z28*#Tp9{@9iVMr?`tXr+pOfq#KSM|`&%twdnELVr#n6o?!Mu~*B z5tP-?_($lQg(Da>ogI@_F?kiZ)pFVa*9tu@@nAaZ#`K&1lyTNgjVT)=*G3}K_YQ1j zYjd>2(|bhScb3-Q7B8up)(z1!fYGJqHms_t7t2Pa%g?~rj@URo>48BsL^BBFm)}bKy&~#;#9K71`@TUt`q2T4`q8&(IsVq<)>eZ=0({ znaUi(b(!CtegH6LPx0sPXFzpNYt7fOr;bartN>@X+mNK?XLBGFQWz1G5bY)m*mQqu z)l68hXsvpj**2(oD#)2P=2c0r8bJ2kZl@+$wu_xrrkE;eSsJfi@IH96ChK);?ebhQJCdKq)KYxg}z@YAtBJ0e#Mr8x1$8XDn8s*YK9a0U~zU_YD`an!0z7VuY*c>){k zX2*<-8XxqdkonMWpOgzqx>x8M=B+d{rX1Y&F}POsf`(LoKbe+ZLRgT&G~_co&+SIhvbX zqHE5rZEUsY>VVqXP9@7YDjKJtaCJ9bMQ$9*J5N(FLxBUjCoc8*SSkW*yXk7y4qYKn{r*oLmrwA zs*P+6o!rb%(-+Ka99XQP=xv1O_v*fTG*;W-i^&}L~)Grv1+6dmn{aKers0lG%NmO7FsLkob=tJq zXE%ia+z(+l{5Aq{fo3 zd9*khT^lNGYzQ_tTDyWak_3Mz4MKklx-hkv7K0W4@$^jm<|1;vC?4g(I#|(=#?d5_ zWii`eZ3hT698LE+%Po=PGFw_bhXouu*BXM~hfrAfH!rxci;Pv$EiAb7AwiyL*5|c4 z@y(?*F*TsyQFT-|)`aA>2eV7Fkn&JuzfD>R!OpGC&m)kA?hLIwu&uI-#Il~w2VELLmJRm$Ko?~O95vR&>IbBV;Xx{qw&y2YHxP=PXZ!jR2rb{@=xsBZvVZ3K93 zDLWaE3Fph4u%+k4&t5nmtgZl@4#qWSG%Ck4>rFu9oG8e&D(EV88%!qd zif%120kA3bS{mIg2z5CiBlM~D1_va=MYh280PoGo!}-gegw-elEtWvVw4 zwXWlPSX|8UG&Zkr_IBV#6gPCH8Wed&7JH5SBn&m1kKTFa)4)p9%2Q+g$&&Vc+$agg zIMupG{iz1ho;vKuY|8I4eZdN*PGE0>n7uY!qfP_a{fUPY#v-~^W8?vCF+8)A5+9jD z2I@wsd3cW(?8)7C3l%G4Pw@Pym!im1@iFFtYFC27#?-D%0uNqj!E@O(OEb$g%Ldd{ zA-ZK~%W){#BIX=A_Qc#qSqIIr_3`sv;4eP-A>s?h$3GuqDta(H?|kR?mw=iNuUWm1 z?7Qd3!o_aN&Ue1!`;Sg3hOGWKubtD698`VJ%Qvr^)6F0HAK9c;uDFpm; z#wK?r1Dxhl@tOqNHWNodIql5b{NzzNw)DIOLb0OX58S#4*cXY2SQ8W;?_W+fyU5iS zwOWmyNtda>23o+?gUYwH<|xg6LAD0GyE8tFs^}1NBS3A#yr5v$isI?T!AfYiV+*q(C@&7 zr_k>Z!6)VD-=#g4cjn)9x?JRItc~4nvtXyrTD$swi*tYa>U4h^#pT)X&9mVvy64p& zz%yI7Mt9rosOOPtZ3=$Xy%VsM?7sEVkA-5Am~xORG5!I?16v$ z8rmtS-w(7lz5wr{zWo#HomrS)+!l?LF#g9gs$<>eHub8u7s3;&CrV7o_SSID)}zFY zgfkbH{3_lAoBdhvE`U=nWY?He)DaJO*>h=g!|s^StoRj=&Au|onBj94*GzaQ9G0}=)H#J)RQQ(C)?J54wcnA4zz|G z8S}XY)M^Plk$ZqZ3=Xwp*|f;(6ujUKR$|;)ap$5~7IA2%r6Q355}d zsalzmqZFXP=Z?Pd@6-BiHK?!RQjYvNck89&8?b9bC-RKYcL5W;L+d_*@jLpq(S-lW zsac0c;u}b*0T0XGxtIA8FiX_>XkZJhtOKGhSZ0|(HOwGb6yZ-v^B^g>P7yvQmYBZC z>nkZm*^cE<(MH_k4e}{$XN$EQf~?I3c+vOssc&Ult~r5RNNr_PU5xzVlUj2ER|qLS z>K*ZCYE~T~y72h=$m{RbX0L$vxVN3HvsSP@x<@o}lA$s|?{YSyF9U_IGs%rx8vDaU zDAEjMVz!7)q5sL0Q+!Dmg#@tdxu;0cY4(UYfAqLplGxaP<$pWHO zCq5}mGARry&$-xBixN{{?+rHujYslpA|zn*_k{dE>o_FMNgw)mQ>kUfZWEQRQ|L{<7;ya0Jsx93p^qMxq3T_U$ScyB6u7Cf)NXFB6-ny>YfcG z2w@9nM<5!t;4Ns(iA;~wQtBBg)%ZcVJr2+pq=41R6x17K151siAffsZ|Z7OKx%@(FBu_Isb%)(Z(`OJ1`L*7PQ`(DM|`-7pc=| z)77Gwm-$i1T&6LaV5A&^7T-~)t!Db{fGd`4s&rsVLb@!2Nl1BA$5~T46FEG~GHH-B z#WJn_icE{@jBs*q?=-SDFnhJOQD8N-Hm`M=Hoz6A!R6*r6UPGo*mjuTDpPzfFaH}q zQ5@r5jpE=z8g^2@32`?Ahqxg{hbQba7;T_?5Tq{tv5P{Wt3#Y8bl5$*a3lL%a42 z>79pPm17s_UBMHe;~K_;`_XBO41YM0J-x)~hQ#sHU9$h<>-86x_a6g4{AFg{C4aEo zyStrU-)#AWrN}TKO&SS#(CTFm^zB@y4z4aHX>%Cs+tNp(e!-6(IEJw}cF-FQH!{I%1ucbVtlIccVpuN0PmZK`CCC8n83g-}lgU!Wu%MYULzuQTMhb7hfPN-zXm zi!v5KaOkQFJmPq3l$9Z~|Ck$OqdC!XJW<=9YwW2le|$d24d~>nV6)jw7k?H!-QTHD zt63JT8K>)v=AvWqT-^IT^&qEv%@(UZHKgKXb|yk|l1#hWOtQ>eU}x!QsVjdQHTbRx zOG7=h=b}qp6A`TcV@Wt&17h4tZGVxsx-iy!x`P^^m&975Ir8bY^GnfZyUvF>eSy;_ z7<^Ju7A#%v3)gHxn&yPPt?X6P#Hd`r#;c2$Afn_-Lm4)c!vx}_dE>J zE5ECBRad4N-~R`BHy)<9Iuk%O-C1RY3$xHTG4;{Dg&5G*JPo-x8D4Go9BA&+IdXul zyAC~mPN&7&+Ir`<=TYeLR>dm$L?T_9Gt2zVPA0(eJlkZvNz%;qFTJv08@U8o&~;O>7Zm5 zC2V1tx2+jFZW?2KP}LVz@0dA*>|O$wCf>5vHksCH;#Y)eBZ4i8Iw+2E6ix6cXG=_= z6}HY;OF|(J!LFp~ZxZ#v%F(D)vWc*?GIolo4+uqs`w$pYTN5W|M^i(azm%PkB@7HJ zGY1hP(O;5Dbv>iRf6ES&5h#85xO~7+D#08Kj&ItpUbD zw&vERM2s*DLQck}w$4OcjBGFre@FRSpkroYf?*Ibw3jpmm|Hl13bJs)FsL}2+Ncq6 ze#-nEKpbFg%1p${%>JpZG7LZee@%evKNFBOwKaFPAYx-UyI_NsXI3wlfj4vvBjs*>)3|nU&FAA{VgIfCp=NicTSej&+i8b8#r>^@M?-v z?5ecx?<0e=u|r(@+GV>(9}e`*K`W;)72wIUYgF^8kF^mn>acn;bI)c`_IUK2BgJz# z!sC3~A!EmMGp9OIOwBvza=rLEUZ85_lnFQ*QDcldR4s6*Aiy5_^lVQUqJNF@@{OT> zpV@8~P<`7<&^4E$u~dHO!?Sr&JapT!w;2>Wgyd9fB_Zu(vujhD!MX6pWfobda}c?1 zn>Nt(cBu!gOxK?8x$>4W`G$5PEO+W3OSA|q}GuIsrZ}vOPy^p8w6rn=5 zQEWDF;Bx=?ajBq0pLX`LisCI|5efUmY?FZ0qGGE_X{ze=B8U5|o$ zhM~0JO6GV<8{KT~`!j^k)ZKee*`3#!`s_>WA@y6YYuTfcZuJT*O;<&2z3r81s}HE5YiB7s>BG&Xj2&S=rCc#hfBmL}0OtIkQAy+3B!QIJ`_+->-Jynp!q zw(q*l-scN1bLq<8Q)NBUa>tFhyoM<Zeu~sBTpJT?_ zt2>%cCgW@+ELJc(`QE^~#afwysykDYA0J%q-&fSHK?=Jg*nR#lMK9Q{XX# zCCD$}Mp4ucSk_Z=Wzshfoyy2dW$mcX%z$C1^;Vu`t|{sPg$$?Xb^u2o>b`x*iG6*f zRKbY(XhBAlsKhJyJW^v8vi#siMV7?x98th1U}Sx5fcR$+bzGmAPIu~ZG2Umm7E=Kn z5jP?zOK~?No>4*i2DEu2f|H;rxj!3A=(UJb5Jz4|y-TxyR+fwvfi#}zJ_w|L5D5xU z8n8|n#B`6qF8Jnf+M$l8*i8iMl}KIl5biL%k34~d>oLH9Zrm3CUJIyc zJv4uGu7GTzNe~-gsC@3@PcX_|2zT->_>UwkDN2v5_7tAsw~(RNSicRB#ILM4f`|no zKXZJ;^@czj^n-A(idvvHgD;0DC4;<0`FCAjU0zdOQ<0*w!+_Y@crR!kafo!H>Ung6 ztD#fS++pwdo#F2h?;#ULG}+;cJ5cuEIX#5PX@x&LXJjtO5Pwj%46NC#!M-{J>3y+3 zWZv<&#SK&Dh{Yz)BY^_XqIc@GCC1&L8%!cELf^sAIw4zj4DWb7!L)pFJ0ssEpP*K9 zqEmKda#MgE_?s~~JvCeU+lYqAVLme>*2)l_4{`jtvyFQ%d#*=sE`RVyFXP-s^oL6_ zdy1S`THx2fbb@gAV;p=Bs=VVEwn}d9Umf`&X;f%`qoxN*1P=vc2D2EYEq!~4xRhCx zUOaubp>;bG$fs&!#|e-5a(UwSqZ(BD^$Q=gw=dGd)}i3EZzyt(U``M9AA6jM0Ed(v z9Gy_iZP@F97Fhkr=IzUEzCU`eL_id?FHS@#QGBA*lBmZ-x_h2=(QC2@eTUE<(H&wj zKV}&nIWV_`*S=RLYftF@stVH~d2F5iX=w|D5g67V*c=z= zBi!>Pr$wU=oeb=|?Ni!T@8jCeloZWLCBcYDiHMExO%w%$%n_Z(0ZHHF79&;c>7#Vg zsOZ8lAGXkLupF+muK>f61H5%TzeRo`$o-^w4;gKxs*Fra?qACMHAblfxI zG{LbzzSomP%YEOZ6pkle;k4}ytq0_!7?c#YrufA! z5)e@!Vgn4=jj|rY(EoPi;Eglcr@o8Q0r3{n(n8_QM;*y0=}x<=jJ;mlt*|wJ> zBcu}njO7n|_v5(Ugm_|&xClajV|oUAM}FqPFe3DK-W9}g@k?y|`sWQ&v`7#4te);C zVJDH$LU>I<;P(Pa@*TW)YG+6ve}1HxFB0PrQl8W+;~#z>DwSl(h&*tv*q&$)>sqXc zuD`u{$R~x;i|IqMs-ZNM;o93k=p?d^EaNV&8wty*&`MR`$VI9s-k+jZJyISy5;hB#S= zdU@hn!ZjC^*NFlK#25#xGZv^$bt9~lfpORPt-KgO)bx|a&3;wp!F+=_uo+|-`Epkx zEaMh1#|>lr%=gTq$TK*Y1m&0q!w}fSFM^pbe`E-0*#l(&fsm&hSE;(z4bsW-6McN( z_)neG-C({ zJ3Q+TaoQ9qb*c25M5baQV*5AKX6-^Q|%&^EX_WiR0O--1R1&?poJ# z`F#Pe9g4Q{u4;@dq;c8Be@Y6A$zDDk#m9~%>sBi<>PIZ5#<-=>++z$9)$vOK>Lk4n z(1dWmb8-}B{Sk(bQsbrxl!z+K9J9h^Cd$A4uqsz{x>vU>*OGJTplG5tEu|GuC_|u% z*H?o`RO;}Sg6-i@htNtI20$_xUD-lre36#{120;sZ;}q*axLOkb{bg8nm<>aS_28} zVpd!(nw%7Yx`X@z|3z%ge*!k3|8wICXy~#R5BmMVz<%2T~Ypc^CJGrB?)Yz{X)@N&* zVD>L5CJPOhmHyRspd<@y-==U|^BTzm?EL7_xly@kY=FA{mg%#=GL(2QCon5Fy%hwR z-BoO%=!}^VAO3s$Gw>T#8lDVoP(b|6o}iV4>L>`*%5n?fR|WOP2>Fu-R3&@#PpIF? zoCd6N;BA9rSij0uN~;|*>r!Jrfra6amDIj5CM19P4WRIG9v9_N9}lv;T8sdpnfXdH zgC9?`>ZWBr?Hxgg%v=RxdRPL@No4>RfNsx;)IMrtIGCq=NSrUDl=;y3}iX!@&aCG@HwQIpdI47#e^q>+9} zI=Du0Ngg_`bSek>B64k1^4+6zkgdJI-`e)#&b`;Z7!@>Sp68X&u5Ukf=&L%azbQ7G zctk39*7M1)wjD@)tMWc@*Tjn;Q*E*zAw!5aiAe%g(c{%iqtJ>%=0|-Gk1FFK#bYEN z>yeiGwZgCO)pRmD^G-ZbTA1O-io+vPtKm#Q$3Hq;Ikk6pCUq=Tz;dx?(BU07$HuVP zsv=NU2?;(mk;Mj5WM=*{5i`BCkOVS-v*eM=D@?Gwti7JCF*UsuuR9W-o}p!kVs%Yx zpcZgI0KIiCgHY=3HG7lXuV#PU#L*0gDoee3*hDbwSC`yxP*X~qGNqF)g$g5=%MItv zFY8;4Z*%8Z4C0?&wL9$1 z$7~R&z=WRm9o2lt6oR&jBzKrKjbH(97MBCx8J)xV#yKX z@P;hl=s8LWe6#8qDOVYOKo22*MmiReAY8LJ`vd*!)#9wQ{Eu1i<#z2bwljC<^wuwV zqeJgHg`AihcmXynWNVB0r1GG9Nk-1N#V@uw#8GD0O~g-rl3bU$1Q}74bb)6GfiHA{ z-zq}cr~^&EPVaw{Q#*$&JnW^7|JqB^<5(7MN5AIquAoqo z?W%CDCnZp3;95cwxv#dWe1H?*zpB^>!7G{p(L-2IdO6N~`nYL!p_ct}=cKw^pq@3Z zxg*LksuQgrNy}e|J!nNy8#?qzA4gusagr)cDIqcBdUo0@^S)lwcG~)lOFk0xe(?Rz z_eL6l9NDKE{88kLUZ~~%Ng+-52g5`#FuVHWF$g7AZm|@m-@z`13Y>~!B#VhX#LdRct^C>9wp?7L(RFZ&> zJsFqi1b@TMM96sV;FL;sZ8b+}X-1jYc#B%db9R@fJ6GI`TEkVUG9|jMJp)Uaz5Bwg z2eeF34=9$vURvG=rx4^(P~ljOJx81h7K1fSMK+l#KSfAlQku-7i8dmg)O*hb!a7cw zWC1HHjL^Eo%KS(vk>`-5e88&;z`Gw|l*q#Swy zIZOfoZaqT-2z0E76kq~-HbVCT`|Q{;fcC371lV!@aE}4#T2!m9g!-oD_uH+3Kt!_= zafKo?y0p$FB2P={r>Ka=r)d@Mt0qD=2Hlm8ot<(%<0_K@M3~Wo%QhBi$??vyTg&Qh zuQR-}&cUUZSH7QS6j#g_%7@*t3dj61&%Z}L5<3`>+SRW{3+LNt0cjQUPMFK27t`ye zcuAXNpYhHax&gf8nJAkanuODD0k0W<5-wB=7)w`)^=fvlt!?0J+t?BG922Fx9`-g& z60GG#^z>yQNayosBdc&HlnKCvW$A=*R~XN(FjOy^s+($DUA)}a7GTf-GBB(D7{kYc z{&!IZ#rUXz-H(_q zXP>iaLf+@2DW6z=X^#fz1FPVtg9Oa^f_yo+qq;SAH-lK8*xl+%9!Jv=rCp*2bJ@^w z0XZ**tJY)dwp3#+%M<2x!D>Q#b65kK~BrvnyO~5Ka zO;_sk;8`Koyl?;{GFkLSv__Z+#gmd1QdWai7xHW8{II~>jH|8&=Y%X1<^=0a7=l~2 ze-HjKuv8Ih!iUq^lM1>8XA97Jn9DvQ5KCC;%@E( zN{u@A>QVWR$D#iQEe3OuHw_Uq4I<;lx5ZSz*JFw!pzY&-c~(tHG2zZ^oF>$7c*=U* zc#?CyV_A(z&L$xz57W1>dD`1;9v!{j9~L6Fs?I@DtjDhGR|E$^=@$j+hP0 zaAe`8nl16Le7*cs9C0K72kCK5ta)76p=NTTo93y@rM|y=sC&m}a(bhRJdES#oAQsX za)Uy?Y)Zl(rU;XE64H{NwRUTs>Nq97pIuANfoP_nfuIGhss&yW-jsHZJJajLn?;`i zt4kG$!Y(J;{Jj9h%8kMk96UZzzOG4^>H4EoFUae*VywKtM^oxX{kB6d>U-(!kYUF+ z`l?&b0j*%ipJSM2tfObsB&I`lZ%0e!u#teXYE1@zxo0F!hsomnB$+BpLfbO)B!a0HKiTjSL)nQm+*m971 z5GlkDUm;|V!r>OW;(8<}XuT{fp%>Di9}*fz{)fuyn zZ;#uI?=WUE{+WG9AC*(j)qiZhSdV=t^Q&Ri045_^5AV!B(Io@8Ob)e74ncY&ih(zv zFTwB65RHC1%zoGGUtmRzF3b$?F@=IQAh0hEUOKWsDn(N=Lm5>dB1J=w1jT^&(KW(o z1`&=T_8x$=gxd*Jo)tC1&PsZWVHcS0S?P66@CO02?ohIUe>b~up&N1hkUWO47i9e8htj{)scgO7o z{#dmBeAJCN!8r&k>P{-zK=RP+7YSdwOc%r)1D1Zru0PQ&E| z;2Y2{Ph4PJ?uGdZzb4GyA2^DkPN=7!sCC~cgGSFdeu}vX!rWUZ&GIYk`2iY#&waas zF95$!h@6mPhE!@wc3mcAUKrAxP-4Nmu??@y(9Td`Ja3rLJS?|lc^^z6Psq&B3<*a9f<)UJJ)flR z7~OKu;04-w#;b}qnQz;dgjds-%a_bq*q8Lz^P8gw@`z-7rE4F+@p0kB!5fZ_%OAP{ z5b>CDhQF6{thC;KLW?B(`k7dzHnWn1CN` zpBhj;l!SB~@Ye_kc!p5uf zlonLCeZ=BsuzZ9mHBX6}QFE(+0YoAbT{*=(>wyqnDf|Wc7l*|t$pdzx?cZH+x-XX% zZURmS+eqGrFI>d@t*1BkB1(AgsMS%t(z2A4{C`aR|2pNOe9Y<_MR`{*V@TX2-!N>M zdn>v9{f_*IG+!)P;JEc-l&zdwk#%2m65~F6FZ(hbZUKx$&thxR zM9w6nC`VCeeU;*gXrm~HFvZguPDy=7vN7>5W4?|;Y%bjnn42REDP65c zHjmUdlO||ssRml>ZnGh?+pn}M2l7s33ud&tEO~WYmy*ZFea2xr@-JRGQiBr%uH|8V z{(rK6p6FFAD5asvRPCFJ*9*%J>Ee%!_Zht_ywfbxN?4960mAk0o%Z;T5a9o?V9O`; zYBeUWnX_tKp|cGp7&2%CDo~j&O3|%@vpdU<);;{TR3TjA9*z2?jqsQjpcmyKWak<+ zw5o0(bnTl;xP%L*4dP9Z<&7bl`IBkjWN*=2_3hUaQt*a}J+AF0svh-d+icXk?$@zZ ztJbC=Z!AwEzeJs=Jy_pdrsnGqS_gBjsiA#1baV>i1;F|vlMvr#g6pH=3XuUdz$s;uhyAW0`)xKIw0zLjUSrNf@3_ut zCaQkP9C6l5jM%D%+)i&p=L_{P=cr4&8>rh2>g9_)x}&0oi@sjrQAq4M@35tT%Qt>d zOKVj%udL2n3;l=0w_KVr<8MJ9kP20w0J=g_sE`MbDfgiv z!qX|7KtWn|e5#a4^BR!xXxI!!-P}cV3?6spFB59F1nNNPFmZI}^f)d8$#AW!PQn-$bsAkXePowde4ii=_KAgvaeVj@y&rjFV;yWOwFLgIi6V7t9 znO%F@8Z}f+s-7jH)0Y#T!Lxd#&@E#oGWFP{%%Hd=cB8BzKUE9^2!mYa*@#sW`#lWy z#mmc4=qrUXYEllseWQbRSGB;%S$$P-Gb*b=L2>0+CJJ#hs@bUXqOg_{>)3GZ#6|Z# z{n@gUjai^cRkkH)(#4XLo7&&@*hNTcnrO`mKp2@h7LSWG#4E z8h&M_V;?~Go73Z*mv`0f;87ZrPE#^vvCH$?ygGUMTV|HMZSu`sY%0+m*b6~DXKdp+ zaDU%#pttc)yo@P7r$9+qjbcy4rNV-;Vqn?U;A47oIuwr|E+a0>9jU=AcTGWW?mFS+ z?%y34w0oUh;9ey4E8YG@6CS=;;7Tnc=(%}IqOD6&mQX^f@c*?GmL z0|OaY*JJD{0*n?46m;nR`>h111xl6{#E%h5yeupTvO<)H3KyZdMdnH`#qxU@#U7`3 zV3=;8lPu!_YH&KwTSWlOf3mc%|p(S1JhQ`NO|s`$fu zE@~5+;l0f{$qCK6DRVeccWM>AM5S*aC{vf%caAark zR#4_9y>|MP+p``TlCwm?1+szH*3+kx1lD;f9<;#i!At}Di9>Dnpwk9qQM69I!%my1FrROarlJ?Ehm)tF5EX+{-})N}Ihrmv&pPU> zvx+N`bZK|`BI1%u{paQ?ps$8~JS{EPZk(JR3ve)s5}obo>3dfbw$+kjN(#wJGtpn` zI+tUV8C{j^YVmX6N^8LNR^SJ>J@T}ku7gHYB_BmPS5pX*nMsnr8xEKDeLf%Fa>jaQ zdkR+A?5}Vb#PQlhI^|r0$#LSpdvlIw?sCHW4b1Con%r1?k$vfWbL?W=Vw_@RZceTY z!VrG78B`}$P%$svIS1gGkY5;Q>C8@Kj$(u96s`zD1j@`idUW}h3}?uaFDAX|%R2Wh z|JtvDde`sOF?@C1hY?|mSn+TPgp`6h=ZuW#VWeMdKC5o-uB4KzghPK%Gbx`-$Zckw z-Sw{JbsEvLDAFHm28F%U=;Zc*>?VAxI4xQEB|4oor24mq%jK7kt0-V(_VJUyA~cvR z&W~2k8}7H;cF+kUc;Nwf&fnI5CzSh(1ITo0`A$|5!^~tAQCEs5pS41=P_jPi@0d$3 z8+xkS)6;GWv!9FeuUc6ahDN>h86PBD`OyZf-GptiG>DgLSD{1HP(Wj7T(e)FiIy(>A)}> z2NFAJhjuxtZyUAG>wD-0b9DpgxN=u}>(bUM+C9Y=B8UQ}HZj@ZK1e*s-Y5CX?_$>j zk6oVle1P6hrSbFv$rq7Z(|Eg=TprC{@x{|;j6Mw~|1t8pP%-=fn0qK=nI2mej7hp} zBl-xHfcU?>zmfw6l&Tsv>zq+;RIeZ+%4Rd8P)y?*w#KsT4NQPaAP1OLt|%1yWm+~y zQXI-hu(t)Zkur;*KrXbT9UR{S0#aC`Jv_T1v<{mD|c2=!FDi=r5^@|ZYk2rLBjlI#tUg&RLh8#S3g1%INwD?gspv~p^o2KT54_8b`Q2d=vQ_%vV1sMBf^=S- zht%Oe78nA?Cz!Jn`pB#9h4Z1%wM=JeR?m#h zt}CPpg3*ZGf*?E(N(wX!$2M`eyseCa8eMii`t8?xoc2v42?}vx>d|oZ9b%9*cq066 zan{ZynbKM&>N3S`Zh?;mYp^pVPfQFxglfHpCIV*hMKe}$!$0j^DyWO}T|ztB>QqIJ z?vM_F7EQK7?B%S(!IZWY=bKaZV5-I7wl%$Gub7Pr?ER;UKbsGnfrC;~^ekb}2>%#s z%WB!BP~Kv376?yh=>=f=3o-F3U8YdL6>evd#P1QOX^!Hk%~{h(X-LbR7}QDq`7)_# z{w&S&%pc6tjcy!zJ4n0*VAP8>H}bbDtkZs`hV4cINND>62^Z1$zCyB~v6I$oZ&w3R z=K~V*dvLjc6liih4{lgC8&1kgH_b!3R;DZc1v}NW+ZdcRDeJJMyA*Ait+U3d*!e-U zkg`RJ?J28?lQxBuRYWb1>objaQM657H=o?&y_?O`EnS`(J2@4TDrh?>ZzAm{t9rlz zHGO7`hgj0;CMg?fwv6rCon)XRwkZ5JOsK3%1dQ}B+fsSDu|oXWZ1=+oHsjhwKJ_8R>C`@ zGv18Sv~K>w<;6|(+EjLum2KddB+m7lmrdWLv+hT2U%WKFkYr4d%82Q9ew2vJ@inGO zJ_hhQS^{c(xm~s2(>0rGuG*_fEsGr`(k(4^<2`*p7OQLxK%aQ*N7~$H@Y)(LZ)r>% zwqmY*cOelFwh#u>A>PKxafHiSwY2XNPY_e>`A&S#IgUAwd5#y9NmYxLifJFVCwBJS zBX?5rk-eeE(ImYdUL|CUTINe8ZjIcSyfUdq=?+>vuO++bj=C2|6!0XM*2=(33T33b z{ye@dZk5>x;99-GR4kcgDAv9ia@ajU}+RXd<+W`F_g#J zZl(~Aj%d?r$#(teIcjw#x|4A~5VmeRwaD6%6G?&bhil#=ezDZcn)CF!9TG}+&V-II zqAD`PXs#7w(Uf%0YEqhABWO+n$?oxX` z-^iKKWTx?O$%cWMqq7~kzkyHGZ3V)MZK1Rhe57~z7QUGXLI7>Wk$_14 zG76m1g@Iz}8dxohb7(6@?WFF3Mkeo^FQkQnGjYA_v_U6^-6c=yY9|VwT(-N_uE_$A zB)b^MXSXMhuoI{=5D#4CsBQ&cMww|>J2T!6q{>GM{VU#D+?!z`_J9}z+%Gzv$0QB+ z$&-`u>=;9vOO=F8eb=l+Q~>HrLr5hORo(JljJ3UY#`nd`m6EpN1aRTBRq)n^2qwtB z9KP|-0jH}%#CtEhYl;O(Y@IOYED?t@{Oo}m_t%2m@2)j2V5CAF?B<0G z5xz-e1i~SvojVwCe7UHth^wU(8gY zUR}08<2A75B$%y|cDlx@x-AO3`cu>iv9zk_#WfkEF~OnID7Mzv?K7Yj9IuDmg@2{= zEFG(9!NhdS4r`J@zX7c$In4;iPaYJBd0G4s#*{0V*BT>EGM8`HBJM?X!JNW z+F?hM#+*5)?RhKSTq9IdR+D4l!a)hG6n5Aa^33>r;~8Pb5-pq(ifu+EVbarqZhdkDsR#)?)f@Par`=VXh z9m6ZqgWPWHYilLCbN+Ufm)Py;GMob!!lCi6Csd`Sk4#QCa9QeY*xw4E& z6SDa<(YpokUM1N=V$};PL-cLbqTRNl8BXfFnSHWgd@v7Y zqT*f77bzzYr2XcSl26T~`8B*VlM9fY*XaPmCd%s*066TwL|t}|RA1YEu1%l%UUgp1 ziJqf%zmCgpw*&lrCvJrUnUeash67+SQj}C_l^i+O*<7Z(EWSoJ(6yFpZ?mJGw?A^E zs}Lr8_HHBCn&6#Q8<(QoANoCv zcHR9`;5@cdBfUB$?M8LF7R+FCt#~CzQyL!Ce>BwprV_2>x*KKF>y{_6Hi%goYrkBE=zY7KA&Q`I*|;i%X}Nah^5K==iE39 zy?h9VkrP>w1z5eBbOo;ckup#fvYU&Kv@!WRD-*h$|JYTrka%=VDgaxwtI(fziThLZn zJ$4-C(qe_w+@Cj18oS3!*E_ZvXKZtx^Q9;@3cl$*C1#f2#;l}f;Xv=8iI*1pNhkXFaC zoAG((Lp?iX;fENMm6Ci`|DN?Iqj0!+Lo8GB!{#!Vou`PFiWGBDscA(e_R@A)_POoa zzxl>Ed*?G32DcCp67UqT?OP7m0v7`3EXpnQLt&psEhI)Ii6f@GzbET~UM%i{DHQLj z=|;JXw8oX8akdzln--@7mvtMdr!_Duk5F6HWFD6iNiSsf0Pg#n|3n!FbWQOXx6c>{ znpQ>W0l2>Wk;>6q1S4i|xF-HdW+V8F`X{>)~2as4>ZFajJYI8zx8I<{z;VsOCuf}m2V`>Tuhd){dDqH)$V%0G?&WAVtD0R zv2116oKWLuq~ygQS&pkF1}J8#3;k{u^C=VCKi$wI8p}AisMnv5I>Yc@xGH?A{sm;6 z4hyC#thZb^6@Ch%nO;V*Ua2&DceKjK_BIid-xFgqqPj=V%CoMH^O<$CM}_w`G!s(o z7D=q@bPVc6r4zk!!1bi_yX>svYv6RJ0N=-ntY|ZTm4X+ua|{R2tkF63nx5cAW~>Um zHu5RvHfSHl^#{kH^T2(j!ja>4sybtfSlU)_mw~u#{)4nao-dq9$*}8JMX{#9uMGN9 zxO|Nd@!(#cML4PT6l%Ywrb`N{n%f}lHB=$i9=Zt>20U=xxzl>Qo&BDro|T@R?@ry@ zoY?3U(_L8IQRmGrBz)2B&7c`K4M!}@2Zih?u4q7?T51<$<=J`b^Uo+a3eRZlOTCQjc!`^WBFsAcYHYncB`5VrigLXQt+4;3>*MaSbYTcI4;IBhdTQ@?FV;;SX4gC|vj-~Jq zvj|Qa&C%rU*Yq#8o8rtq&y7p)?`Ux)dj~X6eR^fHZ4M3Cs_fogoa5EjEDKKh89Sv?`e4xeySpD+D0COfW|ZB zgvfvJn8FEQ(EY@O1#?DNL$c+1dF<@bCt-1H_N4t6afRv8>CpoFn3+*dxk~VOg4_sD zwMd%q&@Jb6+4Y%QlvhdFpF8-0zvf?PQ;pXdK)eg^BM;8p(xbLn4X{ZwM({{>K2K-! zPSZ|(GM$q>Pd7<&gm*|4Z%gDsFROeyqc$Z&_z_S78zFkqc7NC2Rc7|1_7PWrU7@1E zyT696)cH5l)Cbs5al=(g(p9{Rvu-E5@txZ2mZqF$!FNkPp8d6Ixp)K-W%v157G56n z*dq7QfD_LbivJsZf+}!>2qxEtLw3%Qwt$(-x-^(t>xqfWC&3vS{K^@o)G^qtCOCY< zjI2wQrpMxm9@C@c_$9ai6Vl)kDNczyhd6YP9tMQY$xl;3 zaPh$Ku^QZ2)U8zw$psF{{TsUT7&tDxZ#DKqUhW&jF6ppmRS&Vn-+TkG$r`RFFr#CS`3y8-RFz^uUD%2pMWC6mw>N$L#) zR#^viZv%-Sqrst2o1bK_L_Dif9^Svj_p0i3@d?~J|Dd0*#5Q@Qc$N7OwZ(tueWZR- zyoP;MezXPjg?noD+38A+o z>Jrr~=?bvkDWH}eR2*`C2Dif;p>-Vs8?s25-08bFcW+Y5?-7sJZ;N|%Y9{Z449L34 z(7}j^Q=&}`8#GV-s}?YY#y$<4nzzb*Mm?scuWrJQd{?3ZhvkG1R3M4RONL`ra_=86 zwn3!jw*H(lPmklq%BVUPqJyqUI5Ln{`W>jFJBbAJi+KREZ`cH_x$q%_fqk?X>Fx27 z$cWUtC~JkP)dP+Y}O`(W}v(htqJD$f>4pwA0F|8bz=rs=-zhQOfIUAve9@})2?OEszo z)W+~vV+9waJiB7xx4n9_sS7%lqTj_1I)^Xsg~$NezD)ilybs|rTH>7Zwe=;Yp!!%W%}Nv zz`!sH(0mo?!vFk&hQv(4o*`JZLM?6$pAtwk8A3(HLnz;kwTNw#{&@u%5#U*jhWmln z?8Phpidpw;wg&ailkW(V8eJFeg(|viYN{UtBvl$4Z|FqpCgCOyTq;yLZ))W9Z$q6J z%<1FS@coVeDVoMbd`)9IFx|tdDJrtR1!fC92s$a?TjO*wQv@h8Vy7H`eJFR5bArIs zCXgGFm9oC!d22$G-v|y^j0SwRChCx>pX|3afA{L@ssGjzgfOqGYWjtdKpZ-iJ;(uN zVj5qDLr&c_Q07W#Gz;m>$Q7ArFExD6#~JxII(LG@2jgrIu>XvYFY?nTKHU9BMFN4~ z6b8F}(9@RnDyd9-2fSf#q=j$AUf0_KkXU~hkp8%kU&8Oy)8guL^Q1XqL!^kW&f8@% z5@m?rSLpws1N!F!snh3;SJOXza%wQ2Jz-_yT>vaXpb|m}1Mv-iO6t)S2?{&XyvNoCoCN7SWU zQ%lFQT}UZhX7TY(Bvh6k??IYWsL>FDSZsTRQun@|A)>(A!+c##|6XrB@RBk`@4b^x zL!l+8>yU=#Dud{` zD%6mFQSkitCg#a6qW&quj2eyW`89<(`(RW}+c=t4Bx03S)o#tR41rbabd#c+jW(@oqC>_+5n3Lg%K?)U zZKwGHZ`Z#EnG4qcRH4>Zh)KId#ZqR>9cvx0D&q&!o~Bm0KCAmSqtg^|fh9`^tGl#X z-zVsN??y?`CNOnIVRa|G!&g=BNE|MnyC2Z?gNrT|vs6cX)(-pllA^v1P_x=vA=&-1 zY4!$Xdw|w6PYsmZzee=B?+?iJk?O@LE+vDi(UbGIUVMyV73NI7WJ{5D|D=x;gN=H3WrIq%OjUZ`J|5Acg6d6Oshh}i5?pG0k``b zliD-~jW6V%8x*fI46Ebo?p*K-E?@n-#1aD_KRMxGs9{}Z?@$Vd^f6=w2m`ZXZ^%od z2DlZV*D)>)9&4fp8oy{EJk>u#59q6WQ~So8q+zzB2WpGKeGTj=v1icjQ=>&Sb>G%Y zx@XZs^L+Ff1DQ_K(PW~2mIR~Iv!~3L*qP%%yrEbeOqyO2U60BfwHTl1R}?z5z$Vd6XY@L z0R?J?d~VE<6nhSu%F9L2ld(kZ7Z2SC&kJo4)XDPG^!BD+4zo{N>J84#r7n%^bu45- za_Ev56{|R-p^NZI`lb$5WgE~8nTHF$e&x^FF-PgA3cLwp?0xV_eo#OsxBvtlT_Pce zhb;uzI1A&9dfEc|mS$j*eT2vHxxl;SvG2iLb_6=2Y`yjBMy&j~eyPP!_jnGM7Se*!Z|BP-GY`kjZ-n#V$4Dv@&w)|RK> z$|_`M$igXaB2QN0Oy)^xpGaa+SbHf^)35n&J z7nhz*VkowntaoK$##Ga<>=XAO1wBf$`?TIy-4f2D7y%4Px&w$PI+cbyczRx2bm62Ismv=X#H>JMZ|BWka5el9VWo0c}*wp%F(3QI=V(CG6p z{Qi0l+laa`dfFH+o@$%FHvA&hk#?y*QYa;e<&*S;Vu~ABpXW1O$n!Z>Woh`bGw+f= zD0XX#pMdnsN7C+vZHi#-ePx8j69i#4&CC%~?~~+720wu@1LGS2l(ft=wtk0TT7IW9 zLR>vhY$W?pHYE{QR(TyIX~nrdXhFK3$5N*AV#-}^-u!r%#IfUH5b88iwmIS?#CsK}#sC(y-MTJ;f++G^Uj`qEZ~#mu1iU(th}TE;DL^6+7*Swt5|0S?Kp@kC||z zZKcdb5TjrQwc@j^t<3S=k&r?o{y43*W6G)ACAO1GlMRe z+dAvF*22(bxU+qiM|Q_|+O(|Q5#RE=(-GFNtIRjpRAE)iFu3+z_cFbX4!-U)H|t4v zEAO%qLJ}-)X!{1IqH7L&h7mefRL2C->3?}+a_UPAX4 zES>y&Mv>;WYN2MplkQNl(!$}{pgY;H^EM?Ea^mwgu1u1%GqTLW3TOGmqu= z<_P8~F8P9QTMmM}o#O%v6^$4R0%t!5h!*z$l)%F(d^Ea|&@>ShIW zMjmGTa~fk#8Os8s>jOmd52l3)cE(bb)KZu!@66 zauJe4>R{&J69$UX#}l0i6nhxIRRa%&T;d_4M!RjCY&$MOT_ zf(GqTg%i`FDkYK(xFX6T0o2|If=TQWZ6Z$#L-Wkpb)$9d(eas;`D0ZiUlqpjrG~_2 ztR(8C$>s3mKy7Z-TJtiBhlUS_buJu#o&9X;%K7C>hUngs_Xp+9A zalSPo4XS_lMR!SGoZ93|R2b5yt?9#_U!pYVA7T`==^FXWHCGB~kCiu=tBV^&N>6~t zCxA1o({m-A9OZJAB38#rCGM#zR>xb%TlMKVwVYJ(t2WhpJ1ga5m-a;l#dLqPG*2Mt zczZU>Rz;#RPglkpd9+{#U3xK?xl()yvrFZLcE#k4T2Hy@l5uQDuIZJB@t2+{-&L8r zwQEnkjR9AM=UZai7S)P#&AD31pl1*#&urQJ4%2E&IZXZ%C^pwydt%>XmbUjeP?o55 zLw&8M^2*y+^_qmQYRbIx>v;9_bhV6eR&s@t%VW*?#dQ&~k++izoRd?{1zqXs#kCq+ zi>bD007`>ev|vNxrSMk8n}?Y%$BAQ#^W)=!iUf3cas8%O$adwDU!4m%s5fqwc8V)N zyBJXUHRALo3Vz@oIj-!Di`}tOBY&=16H-S0Dq%P?e*HMUf30lkx$F!$p@72$_1>yz z=SnPw7m4*Twm6&Izl)>#4D9NI96!R%NE9F#2O{B{Qi1SDRQA@! z1=V(!Fm?5%qZZGeuj^JkySfOOSC%V+*^l-qYN@!nzxD?#w{8L~W%wKf5@)xS{|6 zRTPC~f~9SLx+NX-+%Yu)3;uH^-R_#c3oakdox_3}2XGR{lAd}piOkxnPE~u;orpxT)}%_(}@`~kGR8Vf7HiD#3FD$jka5ZCHW%>}k_lWFr9X5duNrxG&~ ztKAnA@|>xs;-&Xkl+yNV4-;kR-~U}K?iqP(`O4T zSB3xpe1Fi}NP65S#jqyUaiI$C@iY^{UJCMn^7Esm2(W9X_DRzeS8zI@Sf>OdzwLtUVg$ZsDO)8mS?mDbt1J&o%ASW&1E8JbCNSVac*6$+{yt(3B5 zHs)rPHWmu!KV%zWI2g+c!WtL*qy8f0ric>?M_^lf9%#65%0v0#?n|&0cpBzLOZx>Kc0Mc<0bi86y2g&yp9Y*!<8MP# zQL&SO>a46W1v+XQN?9dJ%*(9u0gKGbLJx_Ve)2O|z@0-&8dQmkgdpf|}AO?gmF7^a1UwcM&ee40jrO4r4%AgQRwDys1hjUe^}KYSPpT4i*?+y@l~^ zcr96;(Vl6Zc-fGo$+F|$zE2v`GyN^9mODCCpSq4sPgg_hE$BZ{rMG9@(|30Si}ZrG zXWP^F)C7z5V|SO{`%}Qx228Up-D)@GR8N;thSykf?sN;f^^Q)Xx98l`cYQ?jog=BV zuJ^*PL>0j+eoDt`J(Xpk%g=w#Jvy8*Yuuj+79{r;vyidfuvx)x`25?43uR-*zcPIa zvy2|S3?oh?Qy9z)aA{0=CAIsehe%UoY0dTKD`Uh(q`$1wmEJSP$rQ>@@aJnopC24w z*1Smg0&~VHKESEzl^s91&{ z>fk=(VEjna<#@AO=xwr`J|=JgbP8v>Ha9u;YWrM#P($^zwsUMB${6xYEjd1;PKn_k zn+co9rLg;CB7;ib%h1TrhK=|j0xE8lh#>@aVn;sQf6~I2@q?QgS-1)dHDB+Z`=h%A&DB1)!~_xsDJ@s`bp;tN)F_dpv3p}^Gl<#>WL z2`__hxxtVi0PJs|K^S1so{64zt-}a3+^}%!lsKCMPy^)nA~ix`_5e#lXzpjB7xwId zfl@rIxTwbWPz)8uXGA^qUGv~t)P5hR8X-hE1ny_SpT$&Io^6nMmjZuVA=@BBs(dVi zv)_T&LHzBW31Eu9x8~(-X2O!@j<1m<73wtfkFNRQ5TU~DB4*{Gz|ySxg6wXn8dV9UXI-`?o+~>|idu zp2h4;7|Nj>)=Hs3fU#_W&0q}QvVg9FlsA4+H6g25kilAz+2QZI@Q=ZlDvoLgd$dKF zu?2MjDKNFjNI`fKMLY_87(B^kn1QpF1Y(o^XL&Gey9`KU?^cW#9iE8W6rDS*eTRs`X|p&XXiGC6Z7+!BWR1jtZHGop^r9OaMDF`IhL$HdY!i|+Oqs&VRZy7du? zG>LA7{7Xg3%0o0n0?%KUy7e&GBw~cUJcvqA9b?h@-NXtE5RUl|f6S=3LopWNXLKM4 z-84odXXr~aH~r2D5zP#lf@lz%1zRERZabm-T?xF<`SR#=BeELYjUJQ``zyL$Yj{)pI z7^DxuIDr3oXWx#+ANX`|Z4fP|{44QQ?4d)Nv!c}7kW(7cmadCD}*1wf{{|H3+@q0bXQ4F zk~5P1K4(FHsSUbXRX6E)>7d_-kpIY2#{c^_CXYySs`9i6G804S_uJo;BXC?C;|(q_ zGYdY4{#Qlw!uUwr%cItZ7wvXVgzeN2Dq~uxJLwsUlAzvht1t`1$xDn7`7e_x;4!C( zyqL|eyfngl%$bjpzQMofgnhE}Sw{{?Q`w@hLq8{S z*W>kl;s56CRT5NX!QdJTn#0=&kP%Kt8XBANfQNiG5K7=brOdB$CJLkDMUdyf$@=jd z+JHd-?({eN4VQNLuD-j!iTJ-^5Ybi-tc?>xPamb;2KGF@8(#VR#!up2qZ}hZb-)odb#ttmveJgrK`C@(NcW!id zZ*JM%HW&$gSAFZg)j6dW!!<__LOepSkc`55jHYM2w>1ICzEB~BB}_(b??qjSN@;|G`G+Kby-X&szU%QegX zPP2lG)cK6vhasj$5Iu1!t#Gq3GAXf94q*|Il*Bm99mRv zx(%&@8A~jgqdAKjQI!tjY@QBQRBrZmP(Y=QoUOs5o74p^d$p1(t{jRA8FJo1<@B8t za~`}M?5+wf6oh(}Ux20=&E{{p)m{fRAs;@avF8TLUE+6jA)iUk2$bxac+46`@6K_j zW%SUQl{-skoV9Qe6imS?Btt!$K`?)`Bh^FI**`yG zxudXa$!>9`50{OHL@#r0aj5my{%r?*Z{cPnZ#&>C!t?3LEpjUVN^y5OO+EoJsGf4p zuBab@03ev#G&ST$--DfAwof>C_@{*ty;A(Vb}<`8Z6k=!HD&RD>h%f@!Wx3O5qs(z zKWf#O;b=j9CcG!6n;(gitRbkK)5Ci4|F#gye%Y>_(>c{(WqFz0$omTX7zL!kvo$6mIi$l-sXA7 zp6!S#pV|FC&h9xnlJ0L5{Un*#wmq?J+qN^YZQIVo*2G4~m{=3r?%2uA^Pc;h_uR97 z7wi7ft7`4qySjUI?Ok0PpYIMo0({5|YRET-eDt4y6U28u#$QQ)xCsgcsTOcfM^>kU zd@m3wBlzW)KRl}5tDgf0gDjuluf+|?n>Ha)ErT7&)Hz2Jn#7wHp7!3hdWmeK=1`08 zK0(YgIzIlR&H9hq`HyqV%*4XZ^50DGmqq$N(*NI_W6^(@8j=w}@ zIu?#En)QER$87BXKe1!BFADiTV#oi*lKyW}DeHfKi+`n3Hs=4Jl>V(*#6>eQ{tOAOZFG{&n4Z{+2;UJC(}ij-TF}8KL~Vm0F6x{HklD z`+XfjY0;;8ioovn9@f<9&eCDRaQGVU=QSoFh8ntU6@t@HZxBGR8Dc@yy6EFSa zNXiYv_8z~t81rAnld?X8qu-D9uoec@m6d8$8^7s%us(FEoc~-ed|n#EEK)aBmRq5! z7+2nft&DcnWY#$BWmp@vnz?P`I|pM8ypie3Oj=B!-s0F~8YIwMdZX(^ezTq;e@dPh0PMV^ypuzGsGkmOL0R}$ zAo`QS`R{s{o=+cX8Yo}|EEO! zkFxteMc^-u_aDjkUs3oU&G#R@_g{_p-@O0GzF+$=|7yYiA&P*X6FAY|6l1}W&U~p{~!ea zSG(|k6@pp*sbv3Kz5B-<|EE>?YCZm~cP#&i>i^F|Fb6vm^Z!~Czl2~PwV``X{&Br6 zudSs0ZkwwxS_V@}L1D%uTuEW!fDoj#^2F~bL=C3kgW7%Y3EFbj(bljvGD>SG{lDYqfx@&sPJ19!B@6iC>vq&W96R7Uq}UcP=$Q z#Sog1l}u^17T2%G^7J{Qki0O6&-EHwB;0F!9@qmENXRY>R_kpR-3jg6L5U9#BpLKu zoZjaMH*XHXpxXIGEdR_M)J)P{Rl2t$XDx!-qS1!O@Q`whCGsGunY`~uk zBy6@f_)6V|4`)_DP3j|@JXdAao^u{}sD-f7ENO7mTE#lcSBJ3P87$AvZf@K%BZwib zs*eBR>Cooc?0$q)^jCotj;kU@93Xt<{Fb7br6`nQD%QM$FQ2Y+>*4!Rew-o5$WG5s z%v4Mn`!#wk2U`{|_9^fl0jY$Ch?vhw3_nE7diU2Mq8iI9I#o;^p<8Sd#C#~b??pFM zzuyQ?kkFW6H57Gb-jcx!+#Brd$Cae9CInEcKa+Lg1X(23X`kg z@P0JDG~as$_Q}e1YbLrJiI08)?}fny5+MO@Ul{+`)&=8uoFZ9rZ|28B412zTNu)fg zJ?jL48N>fBpnq&YQ8ip7+ay*F~}WkgDNjy9hM`yA`#`-84f3&qHh$VV5l5-Bj!>N02&Cp!|hX+A>cs= z6b;812AL9f!S8^+2vo*=*rwto{EW~QiAw~)B1YB1;e%B}Thh(A@V&6T;Cm6igUN70 z9_^d~LEa#P#=LHz7sF>}OsMeXBwUY~n-KJ(y=HUD3Hcz_-`Fz6%4S`g6g&)`SZ}_M zzLE>hx6TmUp?M)6PDbxZ;XLEY6>`jZpETZyU_~ml5jZIHQ{4m%X977ehqvHwyRbKc z{DKI?UuT8#kG^`9yzslhRTcVafQwHfPfBmdA0cFkOvM>Z$%IM#P6=+l|dyW<)AFnz2S9_2(-DoJsz za(Iso=)Ki%zuw4S(BJUI7>YDzt&idFFeLH&5%9t(cd3v{(&_BOz1^S2k zE7%N*6iUKZkdKd2IHlkfiQSQK6BWZg3%5H&)(IaYvqwGyIb^!D)~Wf)_-S*|1(Lhw zL|~M2@h7m}oJ~DVZTA&KT8NhvcNI4k*Ji>cMI#x#CoQpo`*z!7zC`!}65+F``N*FE zA5aV3fgd3sG4kI+KfmBtfw*Cir|1DKBAv!-^e1T_x`|!NJs8aDBQ5=4a08sdiY*ox+ z7orP$$%Jw<3O6Cov@j1U$280Vu|3r^Aso9@mF%uQgFnKqAfqi*|Ap@jtO?P?1-S!6 zLFf$lXjGavh)<-abxiLSAub6H(Hw9!kUS%Chjm2$Y63GELy*4ZnB_e_4gOc4SR>Rq#A&lyXUED?lV|3XZ` zybqXSVUV0x*n)2tMOCv}tD+F2L?0PG|Jdfx+8&tDdrOglQu$8u=>d?F)Z2s@mb43I($@99rEb8$V0FS{D~O20w){=&_5p>P4cG(qT} z*1#G*5oZvY82Lz!XBO+^uRwi0k?w|~^V#G@o^g*!H9Or4m!QR)=lBGlweE1SwkS1) zAQkzS;V`R9R741&r@^is3bU!i0ja)oXhx`By1ZlxLWuC_LHY)S$^a#-_+i@4+}^z=QJPP4`RL6NA#NAct1lVekVCa|&z?w&07UaWD%PDx%J#3(nleYLe z1QkU}N>PLXk(Ocp)gf7bQ={JP`R`3Bv!#9O20NYSS2#N!*o&4GkS4GN%;fcY+!5J6 zJR+upWOvkJ&cMo^<^6`69z!Q=(t`NXG>+E0#VIXKeT?*!g@l~N@G?3n{q^vqvWNDs zcqUoHohQkq_hVhS-LdeHz7ktGt{!KTU^v?ADJPavc0YS;j0kP*41GPA3$_}1GOFak zrzi^?ubM)$CDMmyYYqb0bI4omHmV=-a~mC8exi7@vkKxWrWdQTenl(%ZEvm%w+~7j zQ6c1AoRXfaJzJfs^ z7&&aR5mEATkt@n-hbc;aUm1u!2!~*47Jg&`$;a+g4cT ztQtIOwO1sj1n7~70HJ5b_4Le@^u)e>;amt*Xjb{1lgJed6`Lt=yI&an zmXfdZ>Zm{~#s!T5e>8G~fzL9+NCTBvOBULZd) zI;UDH9Eyhfm~a}%=ioxr{!L4%w5E}uNuK?xFpdO{Y{a0_CR)UW87W=kpfIGhjAUxt za_gNEl1^^meH4F9#hefOa#B)H!&E?ZOeHI$OWNY@?6cM1gck}6{fwUDpgZsdt`_Bd z4N20)`*fQPtIqstP?v?jHRxkrLw`$aCc#8-F)7cqZ~lU9|Bzo>RoZ0beFYPN1fVWy zI68yD8FS^rCCSY!Y>at~|Js1qWPVHvg=AgUx2-T(M*Mx;R9XSwsgiHA1A>3YJWWoU zZq^Vog;I_)P=4#OK1r8>6XY2TPYI5z(Ura} zLFO6YWBEOSidQ&M4uhbNs$6oHG~}To`~z=vf&T{qZEj5tO)i^ejP$p^{J|q_U1SPL zl;{Llvi{$Ratp2<@b~Th>e3{7-q?noK zv<9wMh+h=-IUnIDjb$3!0&OpfSXQy)TgxqV3G4=?Lczg98_34?Bm#qwxDvDLYdLzH z+!o-2%SimE#+S!YK5&maTI1Fg?C%!nBDw_N`dsu_?&6jydIFdo%C0XeZs2PEu+aRT zY}eH}uvXAyZo#zIXpyjwKZ*U+-xYC$+|6~vd%%l*mGeUT(~llkS$t}$U4Zkj63JG8 z<7<*e78=x&F<7qHm!b85V?Mlgpf<2`UBI z3D5yf@W)?FcxsQ7@IT3iT=Y^XNy0n%8^{mhgx?uBBy&$5l_vxfc^i4E3zPa($b*lt zWV9?NLKN0X>#Sp~;)iF!+WH)>UPHr4tNbv5@6i zK1I1j_-^N_$Sn-jQNr)tD3V@^=CoDKrsLqF^6?Y; z6gX&0Yp)JMQ}4MFi_6N$5Ri&Jn-s1Xq!5zFN=bDhgcsMVy!tzc2x;%{5b6ctBg;Dc zqH*f?+X%C-#p19#GJI|rbxs5b5O@M$0hc}0_7CWbB`Z<_nm2ni2)|xORHj!t&|p(!Xd5l(^3bQ9zj}Eh^RzJ2=f!F zhfgR9gEf*B3zTe-Ehm9bID_k?w@;9&@e!uDDdL1_NlIbGYC#$!$KNNj%mQiHav)t) z{0`0>Ohk}F$ObXxK;!^{;ZU!xt9(xP$BgEA!kmfnc5M|k z+ZmKLsd;yIQUNXd#>BF62U=cnUTq`<2feB=z{m?}^qVa5rHxGpc952Ip%mv>x+pcq zTX6h?SZ*oiUKT*&gV|qyf257}Cc^`m48t5bL2zziq1N0xiyK(K=JnQ1Z`v|!MLY+&3ESR}0+go?OtzbGq z*t=P^-AJ>W4JN@rtRy)+R5J5`GuFc+86x%!m)OwPohgC$J3ctGP&1obE)Fl7jtTE+ zmMe^=%MTS3?YI*z#G}L^;`X)-YIH?%<`^ttIs%3S=wL0D(d0cyN&`xQH^zp&fj)h# zy&{n-Nn$J$+Lu?>5 z)$toaE!#YJ?&2HBuMs@C_Pz!9uJkalcU&LvU>Uyi+IcK#sWv=FDEc@X3P7r_SB1+xxLyDx2y^hqc z*vPiA`w#xT5LzVYUSUuN3P;h8)(bG)dSZaN7Mes#5m-!AyE(y-bG{l+Tp+kU_`}Ft zJ(%X!zy-X+9@;Wy9Y@(zFX{n%F4rQ|nFVK9>JDAQLNW9=%%qGVqcloSRu3@wKe(OK zOxS;>(88CSjN`oKd{a$LQwX_?Qvo&$QId!_=FAI-zJF{ zm6koE zHS_nB_yV{SDQ3)cd}3x;x~U=^x0|Wm8k^b6sl(qGo+ArY(M_~DzfbvNUyYHXY0-y( zuT`2eJi^!xl-RKY0xar!nLX4G9c{RKt)cs5)44V;G5dsAM%=$43pzL!t2JBqfv5kR&-Z#PI zyz-CPjt%J};y#6)WIX4sq-er}@bR)=3Po@!H|$^YfKn`zWVrHdQ^6rJFe`Fw#etlV zaKR08s0LjO=|SznTuGFb;z90H-aTZZ1cXN;j=&S=vrFE`1fB1`ipI;sXGD_JcINRQ zJPAq|CMmMIXu-F}F&QRIl*S<$h93)Ma_)sJsOu3^EU|Fs-0p`gGvBr$1=)QJ>1C!E zzZokg#I{>-8=+(x0f*6;#y6m{TB}gq`wx3(>WpZFk?IPB;Q|+JzTM_(e`|y*)iIVP zp`fOtl^QeY?ZFK2`({0DPAIbCi5|2S`D^NR+kKjE2RjcrqU#J<`ZC*lV4Cpr$oXIs zTdfg?F>cbw%*yUStYkxMc7H2S$88-zZ-1}`$kJkWze$NYHLz(n0ZgM($&Y0!qj<`u z8Q-eVPcblP%|XZpl2h=)+@KE9#B{S`W2AsWXgb2`i_Ps>q2rJ}rLW@Nbl!AkIpE~D z0m^2}nn`CRKx?i0^+!mjif)iQfr6@lhOL$*dbB}RNyKFW2bc<`&=z5fKm$oJ>K0Z? z-=T+wcQs7k(O7?afpY%i!m|VW_9g44e)f&_UU4Z|q5wVl@PV4ub7?dLD!0x{hu}Z% zdxC<9B>s#M=Lix+mbc~+Hjy3pROKsYc)D4o3g5S$z!YypAyXCB<8&n=gHPk&5kR#C zwj92nS_N@>$W)V3V6g}yoadr5y7D^X^BDPNNpETwev5U2)3s^thZ~S)W8?L9u;x4k zOI{tKc>ksxHuYdFb{SZpLDT>bOhGN&&_+JIjmKuLc2@arnD|;vo&Fq^7ts7v(urx{ z?>*N_YOjxKz}>$8o0jigxdqrtU%lyeU+fLxFHXOKr=#gK6hs|P!XgBTmB`g!#u#2< z3HqD8rwDUXfOGC8R0iuFKJq7bEDBRkm~lFOo+`u=UW6_DO7NO1GfJ zP|r)E4?Z$`erSwqe(whgO(O=xpo6*B6xmj>p;Bqa1#Y$iC_*P+gxEe5X9F0kWqfS( z{DqK!>F~-(hjFm7zIX~R`*{P?xKJ4Us8CjrsPl8QZeBkL220ZVL*$82C&nukcJOZR zMXu4YW65Z)^;NS(U8A9NbRJfw@&Yt0 z_Aek7GG6TUvyBo4Mi$M&xH(-ZV`Rto+~Gq|{M_E3oE(m;`!cX2!&X9Th^<@BF5?oo zwa2*WaXDZsDps{#`OlNB*IjC^i(554m2Q8Vv0sX-f2|j%JW=nQ-PZc;#mDbT@o;Ms zzMk_iTpDPVY&DNafSz%<@B!MK&(v@+z*Lq3e_sW7#tCuz4LxmQT>V9ggf_ZzU!a@9 z)wNLVE3>p}iXEn@Z%N?Wh8BMo*6$WlYO%@|iLZLqo35<=S`Ta5X>%KtF34I5tzC%m z12*-n<$0=Ps%oF6TO-Ua$-jK7YV*oRmcJNJMPDs$O}`O9b@X5qm1Voe*cgSkEuW&uEPF*MW|r8OsK9IEjP!JbBRqz4T3Gp0aK^0)|4q zT+IRgsVS=T_>bd3HA#>F#|G9_YCl4!Q}c_B@OCFi5>js{d&WR0UpTs22S#vyKjFW{}9;Z*`(%P&UT z?;pQLJ$vw6i5)|iO=R_IIf-^KuysJ<;f$^y_*Ryw0XBSfgT;51d`-(a6YTFDR#@knD z9~~aXY?u~vPUT`{3Hpx>ajgo?xA~`#=EHiV*JCc6ck|{nYPtC!^Boh~y+dlMMI2*VhaStLk)Vx52 zTFlENeaFnwzTX}$AKZS82ps(>USA3y6>OQOUJOag!}DfI!|d9Y@-?q`FI3RdT? z-`hA%?JdSfkM988wGN5B9kl$fw!)9yiLZy>Y~!dKXPwGDJV%+#`i_U+X`#(DtuAPG z1iBJ-9n#}CTU-BCd|OPlVGrpVbAebEs$^J6It8 z2G4=-u7Q3sZAxuI?MzgL=V`FtPm2XgB~Ft2tL{>WO6K8RXi7px>vX=i>ZPetBgqwt z#qTGw(XBdbb5(R>^3r(959SP(g>aDXguGQc_1{`4dI)<7dxHSTpyH{*c@?%vgB

CF>#(9rFew2kS;C}_ zbPn1aoCM}AV#d)g(woWn6i}DR1DnNt-sqis0Tyr~S$0>wPP0dh{WzxSm!bssIj<=MRVi>ur2GzcT9t4kRd%X zKDIDt-tbcZ*4N!^<5x_T`Nf}8YdCYX7jyIJ4BwHz3lQ8#L*cnGcRg5{Et|X0u1#_j#c7!tDe(jIAWcXP9Nn_N0|bXHc|BWF=I?-XSUcVxaq@L{}W6f53zo z%JC90+G?^VW+hsR`)FWMWsg1vcPtQJBv2(G$WWFvCVhJyF!OdruZqAIj_K%tr?qP#Fk`Mhk<3)B7$C!EQxqT-0C%${zJKXc51I zn$h7%uOC7kZ1kr^gf#@5H$dZp?R*&l)uU#IhZYZ0GS?8Q85BLrHeW^%Q=sY9Yy1FG zqab?4dnPlJ5We&MO*Mh~fF(}=4UbnpMpXNh9F_ps65LZ^k-1G z)}ezCHZM{0EO7M#RT7rh(E3L*v6DK*=(?hI7FJ8#qHkY2(xGnu>&v@clE6=8u>DeD zyC>Lou7qrp1A=wA9~0|7qmuwe%v)!0JG}jZM)8>Li0^M=nzxvdNYNeYqA*P)`8OvU zq+uYLr68tJ_;$tyNe&th^VbL$F{Ixt z=RT;Jtd0JPJu3MR8YR|pDE<95%YB2)n5~4(ui-3(m5{O(T*5h(7E1iDNxh=aLazuK zgsZ`XiGke++56rze7k&eIS)BWKB4R8YeWI@l{O9=f(KTwB{z5_>NTx3M7FBA z5ilW+#)-B`UlAwb_FYnFOr=(w!jg7p^qg>h2&yQxt5QtY;r`A(U*gfPTVX6*re7sD zjUE>2lob_fflp`_hZ}}c>KooidH9t?Mg1d`+B+r0s0rbw_MK>oQfLz*!ftR`QICgz zV(GS#(q`H1k)&CV{Iph*yzLyc2Xjo4On}WMy4dY!@EwQ-YC86HL=N$ZQ?AV@e*UyV zP^d39a!v}8G{h+2k@JX=-1j#!>vj7ui!6QLxEYc&(Nko$MHhA3Y6K9W;eE2McQs7@ zQpqIaTdvP{{9zx;V5#`J9n)k6*eb<$27T ziST~?s00VXWbdM;Y@eDY8X zsvW}mzipD(xm#y>4tP@Y3UWNkzT)+eezhXP@qZ*z(`T)p&~JYDs(EPnAlsZ({gHXt zo0@;Ze@VOh{r3B&{;B@X{($t}WbJ!kO(Mi{?&uF%g_8_X0p+V`dTDPBw0$TEYMs?oZlHs!c+=9wQq)WG(!HB?9} zgYt~ZaMB3NIYSQcXzc%GjW;uuA@eiu3l5_QAarQhN*hc=(h)k(s720x z<%2mJJ_}$gLWf2|n}n}lTPTene5#K|{i8;mdP2)f5bn0!>>+2mX+Uc4_sKCo7#vKZ zkI`-pWPbaYCIy(6ZNlfPpk@x{ql!=Y=+q=r^@BDDY7@amI3matN~+?X-=YIHen*6a zly8T73TAjR32FTS`&6o1xd{1@KiXTR)H}A2VvxvesTx2j#_pi<7JWW)PI-P8f=~MD z77%tGFEGPLN`e7p69`i?;eDngY)Uz<4tlTsUf>W zPM#av`LRsreRYP2?bpP9?YzTO*I^gT(tYG@_^2EZBMwl(ok~I0z?yBVFZIvuD>m5S zoZbR@Hd0QIsodW_9hCjn-Ec&b32RF?;hEI&DH3@$x4wY^2C<19HzOrx#P}|1n9?{AEVJP(d804xHou;YbMHI4=kq|) z7%9+tF9oUUsAdR|K+hAl&SIy5<2b|3ZO~WWNMU~C#d56c6O#@QP>sh@M^^0gyRGn( zA9!GeXHrA0Q5M!={2lN#BBc$pAA?T)$w`iBQ6ljx0l6qHZeo``LQL6+}`u`62d4#jv~z$2oc(A@A%k zg#H?Egas92IxcQE6F-_myi(9#Oc&0$4bP=e-pzP0%BSLxnzZu}u`Fc1nv@VJ1{lim zZUdVdTco1FpzSleTz-5wYN3+F03b*{%8ifr!ArH)b&`_vau~mz*CDy;dZ#AHZm#=5 z!^A>Np`Di}@S0^!zfosvGPNJ#;K<3RE(3TfY`3=iybUJe=_cYi>h+EuVu_)NEJW8U z)<4fHnY!7cjN;E8kxvo)_7&uhiZ6de1A=?keULD|wZOwhguS{AolX)|n~{An@iY@n z2b*VF?MmxZ_tfgTn$%jCFIO&?aq-V*Xnq@(2|FO~*Q67}w(97u-|}v;>CiBfy0a>h z!~hWa280AyM+5{tM4r(m?8dUe=fc|F0s)CB@(27*zcnmie$PC19t+z}VWx^x+MWWx zZ_Q($?GoDN$Xms|$W;WqA>uj}0iXSPE{=vs8JE=?3n~tgB*fvoDP;+b{o?* z$erRH@*M*A#S7MZ^2gfYpSlu>np-zA7$sGO@3)clVPPo)OXPGccPy6ik5JFe!>otl*U~> zu+=y$qi)r=j{=N0!;Ku6s!DqML%?Zoq)$+>dOS>WlR2i@Z~m3Yp}pM|Vr#R|tl$68 zVtEbo8Y!%3MB5F0XZiKrzGJ6vG?)$XVLcB|mSaJ?S*qkP=i^(u^(PjJ$nbI$LV`hI zA}$K!5+VCd@Mzz#^EoZgQU}$}-^xbQgbizU3`BN}+wnJ}6^S$ulPe0gpiN^Gda|<} zR>X3ejHVsT$y%*cX9jwCjvx6teSj z67g50H-fh+^gn8H+V)E*Kf*!*?_z+LEFKbo=XvjCf74RN{Qrf zrOvh;kS@YD-ha`Ze01q>824K4nw3ATn>|?aOV4V?_Q6Z$wF#(J(ZvgIAD?&X(_#72kv3kLw;$`} zSdX0)H|a@a#>PU^RLjUI_pCFEL{3`?HMu_5x;5lJFKTab1(qGPF1yzBkrCBDcmF&b z)l%Ote`xuLOb#|60Sgc;J29UGkvYeP)%9wMyH64B+q~3M3ymb?*9YbLWK>1#e(%bA zrhBP!lHeyAq)jET+%;{>Vk8aeHVghpIEscXjy+}nne78`0r+HbqZbA&%<#`iAfh@v zjyk@8JO}(ZFQIeTGs8wk4t7V>lS!f{6&OD$;jtw22$>Kb{@y24S`j7_(4E%%0KvY^ zD0y=6j>1C<*l-vZ9~;!iUix<5O2sTd(26E*K>@t&YW?k-vce^8lySA0IZk>PaG!lL@cr2SpMXORngD^s5u;X*m3zLpb-PAm146Eq%;5vU0L@ z$9Ee0J}Stn2~AMFGj-cAvZWGC z6g@Psv=C!a2R;@rMRr~TMiF1EeAoJiZsyeMuDiz_R(c$vX zZl%}+jjQ+}6k)K%&WJzzL#fia*ev>=*gs>(jZs)PxU>6BSESd!?&|eCqPxVlP&Qj& z6`}yi`VWRK`8@lRV( zU75dguDf1a<|OP?&4#L9aVOu6+Z8Xe6%J=Y8#oi?m7^A5l*NZslYSIephhYd+CALE zsG@*p_70<0ow2qqRphQx85-r}<$SZ z6A}Da1(u+mQs-is*%e%^4)i@CEi)P$NE*`>8@{W$qvU~aY>;+kA91|lzIXcx1&=s> zN&$K|C+6PeJ_Zs}-XO=e`l#?$-eH02E3OaQqhpBk{FVzkFn^A-Nzkac=EtVOZmzNY zq(8rVTN^!zM(9PZ=AbSsJrFE%1$H*E9{~%H)=J}EG~F}jW>)+dcnEphw{*x#J69GD z#(XbHK7kPF_{h&mKC?^{lYR6_ycD{l>nq`o#%6dqO`Jiu5Il#h`u-~=dVSD)b{UZJ zQ;^etH#!jkZ$FnFy-H6R+T(+&;n>6u6Fd!T*i^0Ca>#OzBkb;s7h#8OzcH}m9doB& zpteSd{7{EWjiM2 zot2=gEuu8lks2sqe@NShPm)#iMH^~JT{mC4lww4jVUvR7$@Y2$B`Rjmq!5vbma$M< zB~i1ee-AnS&37&K{C6?-?+TPRmLf##A$z0gj89-jo*ZjG0V?^~=)hw}9?N9E8fPuB z(==qFzxW3bPXA*Bu-CLa8rdtSx8--=0a>ect5bO3gZGSz;AVHd^L|PURExQ1Z^3<&^hJ$9X+_`WP%c|=NCRM(t8hTuNvIki*Qlg z2B-88j_=lbh){g492ZDnR_5ROLj*>vxDL*$BfnW1(mVK@hCtz&2PvoY`c0eMco8u? zVK{o_Nu7EH1|0mhZRe2=gSYFXF=pdA`0~`0>_h3&5&mDLk5kmQ<~(_oJOn^rQGIp| zV|T9!coFun_Cyd5#@l(O-de7=k(v9xoR6{Z#vLw(3tjaZuZX0M8rQ*vN+L&|4{)bX z^AjPvW;RJ_15JU*flb@DR)61Wj{GjDZWb|1+J5~R+Ku}!kAxb{o+TC zN~h?KRW2;uD-SF`3130=z-y4oZ?L34BQ;~#erdYzYE!zc+Wa6tueRR@ z#xGx_d8(R9!Bj*Uq>8E)px7X)K{J-;l>ayk_l=^0G9>9^Od46HUPuQNoIma2{>jYa zQT}sa7uXD9Vt+@)m6<(cACJdCtzEBd!|xc-y}3RFz-2t;ogSaMm4B?#KjV$R8s=Hy zi`-FkwMfkGBnILl`{DM}bJVc#K2gqbaS|TsN)Yr4VClww;&^g4(A_MJ4+RHrkzND? zKF-CRfLnaUle(f5 zzw9qkyIPxc@Xq@l)~8lCkT-pSl0lHBD?Z&1f$a7kc<5a#}B7pK)tFz3aWsh(Clj<|RVdyUq z%k^8JU_Dur6DA)xu2EuL?l)Vg4?ZZrMjI<0KTbPp&Uqs$ zKhRPko`L5H`dcG-vOxc@*sO{X$&zOy47_fNaaQtwcDGry1az;03`-kjA-jUfkO7p51A4K+nvrb0KMx$7~b1dn8#2 z_DOM@dU2G$$w1;|kx&9K$`#nk6B*X9xTizf&;D9gmz=HKOuw7*Z07|_uYsTwOvy2$ z7Bf1a_LKuyTklr8z|ow}(!}_RyUH3^`sYI+58=~JN?4V)g>0K+x`(1FW%H(!;eF=l zqx#=6iBH?}Vy@-;Q9gmF`-b<^m;(2ZJq$>FcJ363*Tc7zc&dD2owGXT+i-+ngp3W(`kpQgJYy=LDuE6H-c<$m=Bp zDr5BM49fOu;S+oS1RWueUqz?gy-j4yf_Hw?+~&}PI~wFMa?3vVseoz!D1$&P27q55 z5Io9>PmHuBo=$lQ_3t5UefRg~O)Qf0bqd;7@k{}&ERa(r19j*5UpWd4t36dG3sDQ! zf0xws0fv+7sf`-FAG94FZ`lm~3^#oP&heN1ofISg#_LE&Hlilm63N2fYxZsb>j#0WKwaTYj*P?!s*QBHsnz_)d#$6V+N}XzE z(V0g7bc#x{ozDR;4#1!Sx5{nAQQMJb&Q^zA+@-Bh&aGk3m-!jo0ouGX)Ffq@n6|tG zrBSJ|@^_^*|Loe_mFESdN2Ghe4UzV!^(RIunQ+B7W70pSgGfO^Vs0T9L6xfkRy+`t zkZu!(7-mXnWZ4@Cl`EyWNp^KcYeG)YF%BI@CgH+m$MA1McQOx2xM!LGZmX zTIP?~ehht-xthc6MH7Iy|IQ4i^cKTJAzGImGD;#WA{t(vV?)%Mq_>a61tI+eW=sj$ z2gOsp#v#)^hse~hX|XL&^%;exvOv&zNLPsTJ$R^xL{OlI(1q>T`XTPlPXSqt zSB#|7#6&q#*ZLeU=79+*r8D z3G~HWX%YhDygxP6gql!4zj>B!RSegYcF{&c%&m0rR4B7yz?oV?KK&&4fEQ~3Gb+u= zLgI^@5`LZVRA9|{{5>V_rm!$}hq^YFne~?g|2mS1@! zh6WmDC%X2DMf%V9{06IqosXa>#hV8U7DXyQqz zacI8f96s!b@$>Ev@Vmk9!ge|Y%wTEqfE+?s62K2BR>D>iqG;|K026>nST&5h471-? z4xl|iP`oik4DH_NFWTHte4apZj!;Um^jD!QG!OX==!L_FEBsR~t5}QdW zz5)Z@R^s*u{LEyc|8{C1>HX1|H~(^^Vf%-z@-|ln;rU3d@yhVDj=?V=@5S>P#zcWN zj-pmQhMH0q4uF@8{yYc}UKjX2cV zl+!QoSY}b?p8lD!$Lg7$iy`j~+1zV>O))JlkV8+0gb|@yfS^!a`dTLQnD}~(@TuRB zNAS2-BO+Am{-iiFjsV_0ipWI}zO>VXJh-0Nh?Zwc04>L+dZsyZVt$Kr6rGvhel5;n zZZOBRzTn$Dd2wGt%D}?}mrWUFG;rw3pMBO#j&N?su-X>h)ixa6-TI_zAF~7*H>)rK zHfVgd=5>A+oz)T4^Q4J!L<(;7vE=ctysCVs39fQMlFD+^7Fg zg#Ph%WO|w7TyFT}?zTK3{TYG|UAp!H&!Vr8i;@{z8vBN)fRe=US*N>BqDO4-+eR^dRlnKbz+?0)>|$c)=6h*N zzjN{<^Hq3{#(V5Xe9?o104^$eBPk=LCRWwZ!%%EAPwuv48@Hp8W!KOe94qqEF#q=y zTl!awWX;nyoD5+idwSpacUoiycK@}A8!z_U!Y*~zwj>JKSy|?lAaK?&n+8K<@KJf# zG({LLn?7bM;xbxIA$vb+*Mp4YNAxC*+#1oa+~dJv zsm#{(5y}|3N4`o39<@2+O&LBtUt_>MJ)?5|njFps%mjgl+-R_9?z|BO27bI{b4`q- z0=9y*J_xbT8Lvq(;GXw94G{Pl_GoCahS_?c`666Wrv2A`BjtNF;WZ2M!ZruD&c}W6 z&kKFdr9zdkh7UGjZ|rf2VB{s18k-A&mkE(h! zM@J5_6mM$6R!n;hd9JZ4y*dVP@9>W-C|?R_TY$fti$x>eij9a2kp4FZh(y<@yZji% z90=|B_wX%;Qbbcn?DXHk@Llu2H_eVh>#M)kV|OqYwBp*UnPC$&ejG~0Bv^UkRR2N7 zC&R_y!iqK%@jGar-C16jQ@l3I&H4}br72t@{r0YDNx{^^*MF(~&I>^5Fo&7&&%L)w zV603Rb=O{HT=on*_c~nSG}>Uk%<_#_MRrQ8k!81Uc0-15r`2@jUgS+jv zgsBEiNYbG(X*@I3aC>c@Z<(1rRpH)gPL3$?PU;=0S0o1b9|VfIa-9Eo2b~D##!8(( zr!SMRG5o3d2v`U`%ujPp8Fqp>#M}LV=2wvU)H&VqYaGD1o&fkWM>oSWY6R9*tJR=> ztk8xHAH=W2*RBt6F=eFC9va(+R5J|&_W4||0h zP0e(BT1d|-%iALu;KAtzxK7mH>l(>HonmRR^)Ar@vH*JItC5B3@&+)2r&a12=s7X- zZ8`Ar^;+&>^U`HWb_cfZS4idG%JKCFtmqD0U;)XKGCyL}dUZqf42HD0nM2Cs?w*q# z#V%Z~Twvz3z8%wAqcO{wKV-1YOdd*npIG9aC?eBk@Wq;3&?2$j#kM9}lj%InzUlsV}hpxiQKNyEgKihsTDG=nD^G#afxxTNlpL6 zqxmGzR^$6{wjIN@6H&m7JD?$)%q%i2vE1Jn`XbYEQZ4|us38S6W$j?>&h;cTMc#=? z%!jLq0qSJ{Q{7|@o!jjG!8KDYN0mp$@u{(A`-$5s+zh9ALraHR2r~%TvUV>~<@9M! z`{Ub}v(JEL%xy&$0`FE+=a72|m`N>=Hm1cPPn=@svWA)Xv^zuWPA@y8T4RhS8OBv( ziR<$wf0=miyx)M}%3|jTF94s|lUF zZLYDMmyWE*8W+-aZfW7v4QBIV9Bm$ZL%C86XKigdnR+u5dWlnHXL#odtjmKklYL0I z-qROht(VDW?vg`o!bgOwGaPrjt&tnBIk-&nsng6LryfxxoTjIfu_qVBcx6 zOnJOI#0fIeJA-4sFYU;62u5&-M4apH`aECs-+hKujCp>*>eSrwVpn`QMd!y|gSj*! zDjfZq$8A5tvCgrvd^u8P=G$DI(bAIL>%=}UrMs$p%S89v>cG_mt$;O0xwBQkJjd)S z0^^@!sRP%ThoC?Pbjx_h%&mYMMUsAU#H@1GMsa&ggt&k#I-*G)S|*o*zb#Lpm+3^K z-|&z8u5ZSzjc(+FaWWUywcD=7o+UKL|AWPwWi3?OxvV(47NMraKK-W-|K>gpNncV8 z?b0!|Mk}^7@PVdcM%kh@ym9cz{9VJr;{h@Y4ZWZsQ=;5-;ea*Qf?T0`%@c9)+lKCj z9~D8Z)VU3R2s9%|N7 zd+Xoyf8dYe8kF2;4sdDosvOwJ?v{A*Ym~E&rjK&-M^8Ss{FE``8l>JQ$>t#@Leuq< zI|(hAJ9+CgJl_8|6YcdG_3e zzJJ-TcqxCFKj%B;(Z07l*TXy48|Sk-?&KhMMX09^UDI2{5N@{>f8=aY!mezaX_SSked%gOm`htRbF$2qk6S|6ZnU)pq zB_K}%x(dE=Tbfp9>DHBW4S8FGF-%s}mHl#U{|yv$Q?^~BU`e5Qa= znokE{ZLrp$owMFx;`usqa6#MN&|LJjXPsL9#PJE2ey~egZmfkEe(VWtmKNvx>K1J?F?`2+Pmb23;5Iu+ICOZh>hua@B$g20<@h2 zyY~EgYc(AO1lC3mzMLe(jYmOXS;Ixfs>J))ej|Q&l06rf`o?mtnS=tCw7?dv@(BkB z#wyoQLz8?;9f+)k3jG=M)nOVr3-KeKcDR2UIj;sGU&~xWhePk9?ZPww_@3$=N zyU~+6%&7m}rXvq;pigtQrNNb~+-Twg#`T-=KA3j*ak**2?6?MMB#!13bbYcb8;H4f z&0T?BRgaL@*MjaB+Tg}!yx{uXk;1O+zD(t3^O02Jx-@X3%YOXO;)>4h?mXqVAtlMEwcTvd{<(9;;97yD|<_wksbAk*l0G!+>3pmZsFO8#j5_*ab`Lyf24z+ zu2vnPSrHhUN;-O9s*;0%Q2KE(W5;xqYCF%@QUDf-4!CuTItWumn}4#K;$~(tjdsc% zEXU9!|?kOzquf!3>O5yL2&m zVO~QngQK=i9+0J>p~KRM+rkiNX09<_SsbW8VxBZvIqCl;f@a7;fbz97JswMIE1U5Y z^u;T(*Os#t(VM>;@oKLzGt=TSk*9+gkuI8`ZqHmS^;bXP zOcz@Z7;(x5dr#`=w7geit6gR+oFA(M1e%~n)>QuZa}rS6yszbDsW-1X5F6ftZINA# zVl{Uqp1X18REsuX^&Wr)jGCOy(fGzoXS!d&^1GtB{KjGr_bNvFc{tJ&BJUOj=C;F- z?vKPKp%0%Kf_7k5m4+9FwE9(i*;E=s-SxbtOaZp=*1EZ-f_AMyEj?D9|VOL$veA7{U(@%Qb|gvZd$HT)mW-cRG_ z+Z>IdpO>wCtmnHN9KSv{+k{xnFEe!d?Cp>`o5kJ^(64V--ZC=!VC<1Yn{UT$cQ_iu zHrL2MI?vc0_kzaiG$IE+=e1T+jF|=Ej{nrJ!JKaMq)b!j(z?4?e?on@TyVJNPZxn? z{haj@k}-%<^WO-bgT6zmd#v=l@IMrkpFEsc?SQs!+P5>w9;(mZ=KElbG7ulsF#ghm z<#R1UuQ<8j7(^=#%Pij9_5paf-niSeD+^ki1~~4yGkUiZhVONaW9&`^x(Voz&e1v*Fc0Et-)-=T>N!yV!n#`oldxR zVwdgsbssX&0L)B1aBG`6?M2}=bQLel97>xj&VYvQ5>^~pHe1U-a4|aJ?b#j~R;IiQ z0RenR46Imfzozdyq0I~TEl+%OH5~18pZ#Q6-VmgQKQZ|}&Fi7XERJx47`?E3hl}R? zPmamXVo-BIQS;zjh^Rw6w(+Tm5+5nE0vVYtRjDIeiP3PSZRj%(|)p#squU+$A zQTxa@6!Ran?pJ+7GyyceJvGPYB}>`T+UoA$u$cHlg((f&w>J zI0>6ybQ=rH#mrhsYSeyeM5v#qvD5kW5@`oFh;Rb?->mVmO zak~L|K?T7fMr+NB>FeF^A10GeV=1zNyfmX_hZ5ojI(+MaKorfj1|JDl1o;is^ANX& z(v~b_eul-9cF)m^eHF>)M%US(nx8b~K&Dy@>a>g^k|b@>5U)|TmT&dE0U{DQjPovT z*#U)$=DaoO9WHbGsfkVM7b5Ms2WKK!96SZO%^8${I3XO16kyH}gopT&3--IJ(FN8s zI<{s&$Y(^pK%MutKql^pKn2kf6=mSOHy5 z(u8w=FQOY{C?TZ<1~1bf&VZK5JbnNnQIu@Zoan}aXjd9!q@jU?sb^|RvS6{HrwjO- zT!D%d(HmOVrYJK~)0>Uo4Cus#d5C{esDDw2e?IK@&bbEahSb5!0eKU!rngjFd zZ42QU<(z|&uPo$|htnP`BOLjTW{KwF&1Q*);>P2Y>yhzelmn4@*P=38__5vP-1oHpnRKVgF}#goqSvh?Zm;rcvi%SANm> z5fux!)e@0@k}|GWO2Ku3IOI+lQTf-MAc7DE4`K`=4H1!fvB!d$PUQ1)vQR3KW)MF| zWdFKC0fG?^M^e8LkMgAm8xjN+Dg2M*zg4fpPwFAU3+0lS2Fb4>oNs6=!@fg2f>04S zD?d0uU-z1^ZblxYDP=O@>?jbnL2P?Mo)VUaQ~~wKLe3KE!Wt3>2}icQVL-K?Vf^rB z>c=ce?Lz()2K+SuNI8&Cn(kYXx;D3Y5cu$TU&IiIwAD_j*F_ohxFyDWA!5t>12fo> zx(`8!mtZI7!Tb%g)E446@JNEt5V8KDh(d5~CZ|%Q?vDT;Lf*m0o$|op$5o6-0k!_m z9%yR^{*f+sAzpyME;(f-M}G4=)+`}(8Xf6F(Iz@|{VwR7I6n9qC+dMCqG@dCt4K}| z1n3&Ui@V29-Zp_dM{&8M_DEo`ON91}YW_Q;7ohGCp1Z-!L*YpZK8zPzFS{cS+n<(8 zBB86 zy|Vqi5NRzUXDE4zKsPc3NjHSmRr3Cu`v@G-T-fU4Ly^rz-_(_tkAy`PJWIjY|o%HOtEI5=fpMdT&Eu zxLwcblDFACU@e2@(QKsM(#gJbErarreCS7inMJsaBPF|-(h@)n5sd1`gFu0K^=0WR zS(I3OSN6A1ww~<1H*EfHXd#x^#z~1Xsr$7O-vs6|h`rw}9X(?w`~?p)!L3Xk1^)XF zc=`dQ7^l7j<8t_24O}UAVZ$npIgQwAiwbaeadaS<^9-O==4f`2r?>Jt9zce;ZP%@i z>T6Ssw%bBe)6Ki!w}A~2pb{6W zeGC<}L`2wRnFc{l(Sdjqdx*Q7sU*!kB;BcSV|ZL+;_V8fK7!o*8;X$P3Q}eex zP!HgO9eE|vJn+eeg|%1%YJTOf`QVfFivC7`%byAbBD?k5n&qx1nGGA#Ng7*%wyXOv>hO-kXlJuE1pyn6 z>x-N_jHn5NK?YVC#zRTime9EM)22u*Q7>I@BwX-7D-Nb+U0rD_JtBSwekV&k4tyE^ z=y5b;YJELnnU8x{ruw560XnfUDed!{`p<*KtEt)bUjFrc(<=ak+N0@M#YINnk7V)W z(bvern(a@T@I$4MTemXmzHw8y^#zJrb2$a_Pl2D2j^G|};7zdLPcYz|FyJ20;7w5A zm<}N2jlhMgK&`evr`fxVE-C9B{p=tf4;!34cv2^?mw*60Kq);yfp$OHIJ)E*ySQ<- z3^2bhz&S8RMuJ}D_P)ijetaW$>=F0HRwR#1MY|I;L9ZC@Tkl;a$-!qGs~h_S!N%lC z{U6<+f7O)#A;D$j;QU+SZvvW?h4bGU%YQjTMNOTJoh%((?420I?d@FT4Q)*sME<)3 zSIWiE#?tuTDqMC>=zo+J7Pj}$p<`p?`VSW_6AKq3Arm7L=YMtK(y=f?GYB~wo7%Y$ zaxs4SZvP(hZ-S1Q>B}`LV(1`gYH4oa^0z9-|7OGetKj@^R!**eH|L*LPDalE%Z3|2 z`enmK6nlJurk@ofbQBJQ`VQ%EhIy5TFn0_wG_!<+sPc`D;q7rh%TOm51}1cm7yg)v zsg*7K>J>(Bi*`(%#Kc2#Prg$~OV)%^3y_+|@CO8k8j!OV5j8iC44 z=g-I2u@DnmwSpY*jtRZVFBdMoy4rmDyxk%?Zpi0^t~^)vOALLXVuo;8cquy*S>cFX zmqLw!fPYq1?Ur^kFbB3uVEchx_hii_)En`dp!L`Nud7=c_>Ad}nui`HQz902ZR`BkE4skK%s5b3kYL?5m6Tg}!Rv zKh^*~NXtLq+a=%mPGVnpJmOy#e^J~&dYF%VT>Ua!8(zV*F20%*y!h+xxF*Wl(W7a`AL9 zWl(i;HT_4fu%WZ*-@yHU2JQdoxn=#|Jh%V!(Ek1W>%RT#xc%#x{il!i@Ah90?q9d; zS03~~y|jP7|Ibd^|6GUTumASTP5akF`;Yzp+gbY$PwhXB`Stxj>;G$CU*-QE=YR9p z{_WEL&0qVsTm09a!pijTOZm^9!ur>g{r~jWGBa~_ zn}PEXkpI{fq!b|$W=I!ethom%VxZx7@YEni6EjI+D>f@OBo!QhnvOMF1=E0)D`c3k z4{3w;X2s&e!+PoaZobvriUk4mTKyvz3#{kU@{diw&R0LbgT1r%hZSo;`^M`S?(`*| zqY&vCIKEB04qh*q)HM^(6*5rR@%jbEr}cEfBgq^0&pd#Alb^M{(jz~R8r)AOtZa%X zb!EH6mzA-r8Q@XSE2|>*Xlh}x+U5IGq_;1GH zitV3S#{#ok^k+$IlQ%)=6K-zlu0guT`pHl8dk@lH1Z2*|!p(1qQxly1yT1cwca86@Bdy5%BV>ALHz`y(MUd*G6WI2i`7K#AfizwWJsx{T zdTkHrIa0-urm3tsaBb5AEGJNd$q&IV@)P6}`xE20_!3oH!Q8~b*upsc*hOZ$_e0+q zj)e-!o*>`N8e~c!Nc{@1MsIx;M!PG8{$_CNw!Q}_xgm6P@8mX{2MB*iClVeNF^v?~ zF-f2ah379^l9>3MIE`ldiEiH>05BhRgI^^(cxm5cJrtfoh0B_x93ysg!a30Fsf8>R_491h;VJFa7y0Gihw8s3p$$~UpP$G2(Kjn-agm^$dikY=sFzb9f%=&pzT>5Cqlb9kM;-27=% z37#CMeS&i#;(<_0lAhRWHkM%N6w@>58*{d^xlL?{mv*2}LWB0>NCkV#in*KZh9O=h z)icJpZ7vSj4(!<9(j&qrr>(zU1jLgILXj6I7xI zy-H(2DZjJ*;MwCpyUzU5Y6a;I{V#76Vg-7YoPwt&5polGxcqe^ny(0Duh;_6)q9mb zD0!veZ#zlRJv5i3LWbySACBptL_H-vei3M(!j#l9jJ;*A$>^u?O}v9in;C4an!gNZ z2_qluqoua%*Ttgacip=i^>cz+1=TPT*!Oru^{y0l(*g!Y)DThU)ZS8s^V!8*bE65-Vu+s@qJKXUN1N zU|?=;%ag^LxnOE*na5$6MOD1Ct)!iljf8!4%bCc(My|!gtVmd`l9c@~$iCNSl(qH? zy15Guu`kZ;O;<1bLrP%g@emT1dhyE%o|&2K_(Iz^jG<&(N)a%&$TWoUN-3+3Vsc zSysA;?P(eE3P7K+~e|t z1JOX2M}NFUbsRQJ1$!!0!kk4+@Ku(pDSX(232G@?#JF*BR!P9&%g-Tm#&d1WDQ>#z zb=6%THQDUiW3-v7fxv$6sHl+^=$i5LyV#?HVBcEZb}b#)xk%n<0%?o0M3Yji7MdA^ znzV8*EErBeCKjdg;Hj1DRx>UzbH|yWBpgicX$`_n$FmK(dSU&Fgoe=l%>~Zn1U+9L zG$vIndY}y(_;ZOSj}*^L)r8Adchs=lohyF3C}FGgC(8O3yajdZAZ!7u!XgB!7I-b^ z161znc+qA~jN=fdY4SEoE+JgB;?Hd#M0ibFf3XM)-D2wLILcjWcKu}Yb^c+rj8HgY zHw%7?i!Rfw0x*l)NZ6Bk917d1z`(AHdb}CUpzK7F?=)2|;7xYi&di)Bi}L1f5az<8 zt>c&-63ewlx`J7FFGU=EIOiY*z{sCqv-Fl7mGiodZX%%;1gFWiI*aV~q~i<-f-I;kk)Hgwa1#Y9!s{OXo1dVMY2*e*SJ1x8fmTX71R_8(xk% zqFxxMOX!D9)INyOn82AtVQ`9+@DH}BthDW2((G$%wkqc_Hl8=D_A2)tW8!LU9i+t` zGget^Uu!q+eYnV#pfHcwOhqo5Goi`hBMs449^a)F z(gyLdEfT4&dS;ctQlg#rnBrp;#;7azASr{S;{6gsA<@91ktCIA&|I=XvQ_0R=)IYz zjh^akTFR##3d;>!U`LSHeWJ&AdLoY^k7#Wmq2HT_a^BVoe@+Ub%I{=X89w0s*3=AE zXc^t2T3s2vkyIB=UcgN=r6Ws0Hud)k_VN|?3#poGk)%Q0Gm*IV8j|KX)bub`6;*PI z?l+416(05LSNJ3=S!@t`K9yDyo|4HXI?Hi6zmYuBhoj!Bk&I9?QpWOG601``6 ztGE0YnVQANb=PsLM&sV!7l4Y2*X`^H9BpG_SIZQ7`bkEjfDLtv z50$5k{nQa{3ZVFM`3~eot`5m|EI+E^>YC}C*!NC(cJGXVqUw;s+@O(+$iaFp3(K8; ztMRrq-fngSo615=?@k%XoT6$nS5*yCcW^V+L(!X3y7)k%-n;%SZ)hwM>|j4G0JCI& z7QGnbJ40;H*b_R5337af4Ra}Kp{{MZ1q)(ejwVI(XO*R7DC8fY{`5T~+YsK9`j|Ol z6Reu1@|Yb8bA^>W7UvYkCvih1OD?BGfU1{Hs4Yhq03{H5SG0;MezdHgAF;Z?t1T_G=rD#A)uim%>1i*-&W7x+6Y+UZpla;*u-qis`i|9ejxe>W zF=+bjc83#VdTz_6UE>`by94&JWml_4;BT`HU3S_Ox|N%V zjbZ@GC>^sJ7`T@ePO;=zKx1DLq^VahFioB<9X5ATdMAq`1(sZ!{~EmCq#`+)nFReH zgXMdOzi0t>V4tY7kM=hVJX`PpgrL6fQw3>>)byd0D6-tPF7QXJM$Dx4(g*Pr&9FM; z7M$`ZcnXrcBagJ-=>ya);zRaW4s5nL7)d(ql_ z1*2p-F^cc_v1E^FEq0dA3(g`C@RdB<8(jEVdljv>d-LlL=aus;cKs-uE_3hOMWJT= zymL?a$0$DM(Qn~qHOJF@jdL4s)C;lWn44%8hoqW76h(v}y=ul?lo-`vMcu3Z2XmCp z=xeDS#__SKb>wL(-PM205MI(Us%B+?r<>E>~6LO<|17{)Al-7=0=4~Vs(u1`N36%TEF&t@_ngQZ>7G?@$oxff16^Y$Zp-ySM zYwXOH^e6CCk>)6ncXpb>5@U}B&(gs7GH7^jXGajK_L1z;IOsFB8>rS4$r6L!Hk z`pD|~_^|fm{+biN(T<|$=HGyYrqv23$D0nrMjqAjBsoazqS^X|re+T!O3%?%h zx7^vS{toqnm4%P-D9n*n=yr#n^@P56u=|@UwPr45B$JwhwEB!7;JD^ycD1;$JD-jnIAfAk@jFY!e?QBS$PAToVvZy2H!B=Gm*#Pjq5*byNoYY6&5&O`i z@`m?nw|P)5*-GQ61#sUy^u6OULv%jzjAZ9a-MT{kvppSFf-2%{g;K%arcCjN?D}G8 zxLCra)I-lkyK)4#QM^&VC{m6PjFhAYyOBPRL0CyToOopCWa#9V%x+?sm+v2SoU*VW z)CBQ@MX|ngPTM(|mgu1r*cUmkm=7TJbgB4f$q*q`lZa&%(g?o3%-_QyRPNH$+!g^& zb8X*agdWvs$2AiRPBO_3aeTR%=!wjFqDSJ5n(1#tF4z2CZ{7WxZYe6WB+P$!ZOZ<3 zy)7_s)c<5N??-nZ$CJ>1?T?Y{_eWV9@l#Kr;B8%X|J=&a*iiM_Whmh*ox*3cKp;uo zcGfXq=9`|eBr#z%jp~aM+a%yas~C%-AEKVrMrow4WRP#B3A|#ec7%ycy=C&TA_uTy zaZSh)CL`uP51OZ6MY0$rlBVBjM`5aDOB2=;*7Md=-S?`BS)Gt_8Akk}$WjWFVHMvc zrD`Cvgg(9%=VI+9_xTp=nuhJQSK%C7Kn_R7P&kak8VQRjfvMa*8$Ds$Tb_j}Peztp zDeuJXa+cLYfA;k=%n%Vl;N`cv83Liq5VAi1y9;l+_wSKnBQiPe_e5$_G%D@}*Y%DU zogCYZANz~+js!zGbxFFrOD^u4^BG?7$$Qk%3OSagPrD2q9~bKx(7YRm!_#2i_ASw* zmrWlTjehQ+w|SUw*#p$;krnMaLg}cjXaGtNHYO@)RCgMD^-RSvYE|6HQ3RN=WD7A` z6J7z(bj*_2Zm1_Lht_R0mmIl>$w80+lM*>0nQ82UBx%egWaAMc&7PmhjO;T7$y<;z z7*jK1N+?)l$}wax0c0>1!$z94T7--ID+1a=6yr>{r<%pFS!#pA2j-q~iU_f5tI>=ZgTZ%%;g0ng+kUE0EAJT1K2I#cIiAiertvzi zlbaRn%6HT{z?LhkZs8`q+?tdg z?L|IkN!BeW<8pp1b?XbacZS25rrl1j3UEDdaG3MAy@!7-@3?wNb^oxmE6agUf4SNa zxh5>F&;2$n6Enf<>~R}o*Ky7Rwr-#`>%IKZy14Poq8)k(u9ytD94otHvusa}dlmx(}pVGwh>^AP#-%;U7v4fXSpM*z_C1Yt{Hiw;zeaEfmf~tI!DI>x#mG1>zkVfX0}>WHkM+dM*f=4neOMC^<1GJc zUpI!lh@6yk&_$GhLM3-U6NQ3AvX3+^eTy5C-=CY}?k+5c*L3!XX(?X0qa#N9e6Arx zp|Rbx3!ud!l|wF1!M38OW>3bB$^Q;C`e<3cQ8cQFB`|Kq)eX?Oi@=~URuG8NtKuu` zwy4rMXY}i_l^9^|}i_6(IC`Icv-;y1PoIDg2r}pK`otiuM>)BCz?; zP42r)aYD-W>iLX+86ywsXH~cflt|_w@01(22~p!(s>Twfi1i}I4bo{J>gOU&itJMb zT&70S_>G{(r}lE&gC*K`Ppb*kQI8Y9uN8W*e~AZea>nAPvPTXsd1!Og8ditFFO&;q z6Ph0Y7aG6(7QJMx(EES{eUzWT(BJXCy(TdjS^im4|Io|r1e!WF5$~^cMY8FuRg2Rt zguR{WK^v(83R`1iE*E@)$5I!jb{7p%+uHj<-D^d;7h$3aV(b$GD{&0^@t#{Rsd^{D zEGvk_Lf4B+8I=ip8*8mPS_Kq0(EqnKGM2g#?BYljG&;`WXcabcl((rSh}$kORl%#qf!&Zd~>Ir>Ds7N2+WSn5IwFTY^( z-)94@r$5M(zE0Ulj)R3W;3U-@0Gl7}i2}Po%+G#liZyU4?`hA-885ENA7==xe4CF| zF4D#=pb!G~YusSqJIH>H0Zs3afFECA6l|wl2$g<~0_{BC=PGmL%YjTyKhq0^N$QNu zLzwv!hiU50=g1c6ND-lQNSuNYa-a&OZ?_Sa_)CBjcoEZ!JXYZyJ$MG@M;Wv1H3uVS z!u4}DtO`E@iw9D#07EY-!?Hlk^>YNQaXf~sistwkK|oxG;^_B64Z~zul{aK)3Fem` zaI8WPbo;n5hF}ur$RAW~@E3z9)sWDJOo@bZ;2>K)9l*SdL5&3BhN*_sj(cLM4e))f zSYrGWs$GQo#C3#~1dFfTgW~jOdXnvUIu!YlJ!Rk$e7{_~;rqVk3y3t?JLGun@rSob z#K!#c;TxKTYlnO!mfbA$7J2pPJ(Vkv|`unG$hqlqvoDod^@0`iK4zPp+1jRDOTOYgTScmtdj%M z%RwH2`%;2xt!XAyz4&{gYQAs1ea!muUV=+ToRhYiR9_?lZ~!h2e5hveh2mnMZrEx6YOw-IitxfKeh( ztP|w9`0Z~5hDKZ*&#^rGyRr`^F31*yFzQ424^Nwx~i{buARmr zohuY}%|T7E%-9om3S)*(%{`}vjnqukaZIbJ`r`!>352Y|Z>wkvlw?hvn4U8u?KCGy zXl@4)SItwU=qk>Wnw$2j1F!MTux-Ss1v2u>yi#$y+cTfo^2XL7UssSW(muLyRAGM&X3cD z!1oD#FWNE%1l*-U{1zLw(a11!^wmWIuF)f}ZY>el-gTSRL;8W{MQ8daA7BomQ`CMd zp$p*G%^;SwMZ;K8_h%dHt4g8Gku=7uBggmco~3bJ zbi+E1sz21Q42(N1F}x;c2X<4>4AywYT4L4RycIVvPjX_OCGKvmC2XI`4jEFA&VS9A zJBL}4jo4m)yqq3hx|%_77|&G4ox$hU|)f@`pJO!}-7{w<|VLm*s-QY@WNEp7b zRf69+;J$a5k;DRrO5$KbFfPj~&}nQB)U>V2-ap&;Hal`^wb_u}sYb=jK|hO2V~}BM zuoRF{0i&GL*`hUBYA3Xs)1Iy^S6Z~~1+ky*ZIv~e-kd;rBtld6h~FS%U~vW=fvDX` zitrq}x&}ofwccyuI7~4wIh3+pFM4C>f96Oq8s8lY+ufE;AY-smx=qpc$Mi{xMWFDI zwmNXx@wD@JaLZCKr!>@Lw5f;Gp(go)%RFUVavI0Y?Wr>tUnXgDm=!YHqu{o*353f_ zv!Cnp5%u_)!DD1>nZhG}e3`PXaLi!exL){1EvEeOc~W-}jQ0f2^3qs|yRS(`i!`fk zo8qMt2e|vT0{qOT0jkuo4qssuJ)}eo*VoRrJI$4|RM-a12%T80jJGq^(~6HL)GD?z zE6Wi%2Hgh7ac$U2m+hC0tc2@XXJ4g}_4!oyLlsG*y7+RB2M1vTzIUsvgoY|{A>JUW zes5`RodHQ@e244&h+tZdYQz=v9NIiHX#_ zp4Jkq7HMDBQ$0`g-bS?ge2IfZk7l(q;Fwlwb;zZ7z*7o?C*kKsCc`Q9w9;#Nf_ZUF zvCqB7xTRXRjbiVgv|0nQhjB`-{Z4T6)g`FuAeyq&!iq63w`DWcRWJ7RS?L>9ve^*r zq?KIgZSc0mAe+S=ZK>pBM!Q?v#_aJ)C8-y+AzQLqT@)Otjbf90_5&Jj>m=Xho;yzO z#d})h^T^Tw%QfuqSS$4Q_`B|-#0LxL1ksh47k1s`@2U|7u_VYTTRyF4$Ij=%75d#a z!uwWm=RQOe&yNve!4Wcj4ZtZ&TUa+w5}|rV1%o_i*W7P*lZqXhOq`SrO|KAd{MG&Y z&Yq2}Uk*N1)u^(;(-k6ixYm%BqjayqV)H%*c(0fBb|Zkf$DGXKuSDN%WTp%^GWF_y zCQe?$1?^{Ak z0&Eb9MlT%@UT$dG>;}JAZ2G$h87DI1mTm|zA63oO_FlR^w%{3+1!4_R(Cb&XQIfVF;b7t8yX0HG@QQr+RL`;y+qp)D zlUR@nxI&0U{D@gPb>(`aFFSI14Ve~GpJv)a4Q;o}JQqX8c!1C0JiD=TeSIIQG*4_M zwr~)T&;7!Rb7L;P7w|c2N@f}Y2DxTV8^c+r94eA3q3nK!pJNJ+_mHmoXS9TRK}ck> zQU}g>hk#4;82aRK}v-oxA2@b(W3u>aG(~lpDV0sT5>_l`FlnLDF*Ho9=#g^FF+uqN2=G21sjBoD; zjE6?JPtIlSG~G^1>!Zpza`0yPqvOs;t+2QVRiMah<4h>4*iv^@FEF)bZ0!~Xm~FpJ z84+z>Hfz^-Imjy?O1G(W^Hgw@v%)9`V-`EV$h~X(Tq3I^YFhnBNtfQsi!m#-SP8cr z6>Rrx)LID4>B$Fw3>TX~Ug2^`{qC1YDdvSxoh_G!!^tErwHIny12$yJnOXA(gld_cODI`J<+J;eypacysX0^hs0vpH*lPaW%!G2 zW3E9|Ck3moZJ02vZ3hc6I-M0^nZ?D1l?o#<8Cx1QNmm(^nxca~G`UEq zO6xiq-QtpdPkbR{Zae$>$zf$vK(T~=g^MGnBR~Jos38WFhTX-)t3}XT^M3|vRsh$eUu(Q4tB2Vku6@6gO@xkO$+#|hPGG~X2 zuCLVVyUbgM&DeA&SUO+eqi_@4#BIs1AodH$_95?BaB{m$7(uKDe<;)Rk}IYQ2*Iua zJpLM^Fxz+@Uc+BBdGAPQcpCypSSl`RVyy0v_yez?8w5Laf^&moVrGAH&NpxzAj8hvg|-wpmoOPK@=O!>tJ= zUW+W8RMT~};$D_rp*!3LqBvU4Fw4>ExlM{XNymMFx+5sB1)g3Q5^oqsbRDOXnbW0cu~!b1$c z@9Dy&JkhD-atYs*@ibY7`M%F)*s<2#mT{$eK(&?_i~&L5yO$i+aX;q zP%>#PXClgwkaf!}*JhO(A|cN>2A_@RZK(T2@7q_mw8yrevE-(1*{UnmfV;wHr2Q*{ z?tAN!+__RZrQGnxX4wOQ`nkZL6~6*2zhJ9R>G=<%`47|5_u$fZu+n$*`48Ip4_38u zZgE@1)48}4$a?JxRTwLIxD(A6jYISo4CiWTkn_ZEwqW2moGVT<1RzeLquPT|VvDScbY@9Yq=aTD=TVT*<94OV?=V zcb~!e8T0crU7~1e6c2@ZmW&#=VaGuL@1m%;udd71wF1wd;EyYKI3;7of)++of!f*< zlNdfR!b(};5Q636GE=|Ku*d^?_+f=wR+j4#ws@%FCt`v3FE`1e53)oRZc2^M_-QE7 zJQfyiSe`I?eNdKsmcfYIqnTj@s&(QOBE6o|*omVV6n%tz909uqji`)qA^kzDamO%? z+{n08S;=@qBhplAa&aSKT#}M(lHmlY8xhiH8;b0)=~U8mN+wAZG4~puk{Ijyek1o; zP0I^Rjoy=qktk&XdrbZQH~gf!la0jPE9y^t3%V?S$S-zbp$&Uv6lFPQfrbP`TD0V< zaE^ur86e9=55zTAOoD_*rm(NJr#3|usn1=I|9QygNqs$%ghe$tZ0I@i^T=Y2L{`4j z4^$x5!d)Zy<9ToL*V^lE`l{l3dc_Vmk-;WuQ-r0KGHxUd%s$KdhvDS}WM+amQ`F&G zq8>!~{5Ys->=;%psf4h^T*xeRg75&GV4bN;V>-0tFmwM;aHeWw_y3X5{EHC&MT?mj znOXi5XUxj-Z`|--L@!*9bnV^n36p^c{B<@3gH9rt(h!{2z z^mf-OgM5qJ3h*7)>UUgqwncH8!HqLoZ3h=cZEekidFWieNa+O90%a)om>xaZETXZ; zhSi<#R(FgTV1}3cjhwC1>tYjpyoe80WSRvMEv;%5F{|^b45@-VBT`z*P=S7v&gS|p zP?|?895Y2ps}CLffGuMd!C6EKM^q*mO<9UAH!o0S2mP76N||rkAERViHpdXx%UTBM zPs$StQpZ`~hgjS&@?0;7IS>TK??}Gk@b{i~Snrs=!a4Z}M=~zqKf)`g)Lf!E2JH6@ zpI#H6aGDNt?iH)GPc=~BNzOnUf3v=2r=-ET1)t)KIfdo@kMYCy@5}qIIQf4NzW-ae z{Eu`m6ALthhNX#%g|p6oP`Q6e-oF&>U&8hu@4x9U!uLPt{Z0Rqz}5Q?#QooKOUU|< z!2YkaE$iP9`EOD47ghh;EqHku{zcpVMe_d-+Lncr^S{ux-cUX$i}RORTrAq+HL)fc z<4gFfn7iL?7C|9nK|SMyzS|5YYsJTFH<-{?(TT-7;tI>nKm-LPvqli%?8{i9=awYQ z^pTU=Vq>R&vo#QYdA(`*V<~B=zn=Jzk5e6bxyC~x!ybZ6IQrS5tK5}prTa$pdC&K*+4Q`&&UlG*rsum?>YwDKg3Z5XdcIzI?!+^`fA0Y~ za)@fh+t0yj7hU!m%#f>5J-x?w;h~B{H{N(Ph4}e<)!$ob^{J@*v%( z^!gj83zL>MKUQqxI*)zYJfdl?_vbUM51o74%Ec~Ksec%>E_`{tk>3pmeeYN4-`0(E z&U(G0i8qqFNdMZR#OF=s&cUUxUvXvE9dSG1ajo5#JoF1E1m~MUg zW6-IMI=6Jg?ac+NWXj&wC687znOt_^mh!Wlrb^%Uz5OCDY#z^#8=YmW@^}=|)uZ=H z$NHirW#(T;M+@i4@r_Rm++?ZocChDqr)R0lqe>L6Twxt>>gCUV>g#)?rQ7P41u?;s zS0<&#IlWhwQ|->f!Y@g^kDq;*2Q{(#W6p*!E)e`2v> zJOA01}O{^WJ2a#~qXuja?YKZRSK@R|Bh zFGX==`OmPvo_DABt4lZVFid*stK=dxbLNLbv97I#`d!`|OSd*3=8o(VZ({d+vGU3Y z9pgg={OX7u@%iVf>uP-)4qiEb_%rW)Mq6zWOMP@+s!2=#lZRLj%x}tsB&q*ZzFnvK z;Z=|G7j(BO?JCxD+RoDTxt6xHs#rJmoZ11K_qw4uA$i+IWxg7q);u-mfbq?;kZ)o9 z+N6DFb3^hTvtLc9JgohuczNauVZYadW<9@fI_k+mv(Rfx+x)A(-Ha~%^yJ?8(=Th5 zHJ2uB&DyS-=D1ic$dy+Sx4GZxrU7?WT^o9Bl9NjJja$F137-@5ZNvvnvor1wPO+B` zHJ2LN%ivbQkC|s{K9ygJ2*?}qPx$E%mtD>n^b@|$+|0_J-T;fNvwvhp@pY)ABBq}H7bQw+RJ+-BxO}MJe6@s z7CiB>ZU1_p*=NMV8>Jf4yEoevCog^e@>TV>$dZN`{cao&I5R6&H9KgkH>3^M<$#wVrCVlUEMTzohp)smMc3DR1ZF zX7!&B+#GkkYt)#X-Euj~ZH3Lv!1kwQA1*u|>{V`Est)JdsE^RBjG2(kWzb9X&x%`-CZc<}GT%bqoz(WW7$rY*gR2B}bFn=DU z@ac~ACoeT!`JUT|7mE*YwXv3rrC9LrvmI*5{hU`NDL+iWJ9#dsCDeD;q1{yl9PDFjq@gy(gQOx@<2l`oq=&gH;zVewMAt{&4fD@vwjD zzqU3!$=~hMcEYAD>QG?cXJ@}P*!8J7nO^ky)^p9D1vP;dtK0V_CUz;U$?A3T)OLO2 z*s}HaxR)21p7^-msbc7+1CM7tPwmy^a*H6KP5oi+@-=~Ve7Ti7W;GYbmtMb|5@26* z(Bf-zscsgFwMOpk*+*M1=(G%bc<6|ge8QSiqpm+~ADhS(akutXxTDo$pDOSDewWj3 zSJV|YUG_Y?L(QRQrtbPRh9&YpkLr~s*t9$jie>c>IvV*!OkDC-XHr64ctJ^)ukvGU z_vdv@rkWR;#;-5p`xJAKJa^?>;6sdH?2sgL)b8gDp#K*U11X!hg; z#fS&T#&kW{`8><@N&c6s%V<9qIOUS27j|K$0Vl2w(5E(X1Q5L$WYU4qWg zt_4@B^YR=@oUJAuP=0}I_jTJo+UmZC+NzgMKkj`r`Vp^GuLH`n%J-%ywrN=al7pT{+S_NAO{qPmxB-rz6&%p7s3tZdFtJ zsvqz53afX@TKqKp&h}UrG%LTowMeh6rKxAkI6b@8oq8G@KaMfGcDiZLVyFHW)Llm< zyomqHNJ?SW+3JOFxFdE5YNn1`GR*3H^I)rKGFrWdHF{_)ShMO=dF+w1Q3~}nHIIDO zEO&NxE(&_&yfV7h{A#Pxn^#?ny{o2}GdCpfomRh} z8=M!M-kW%&&w){mhkx$KZoa*7L;3ymWiuY_?6KoppNV0?cSj8Mx0+`;Jov)dp!cWG zju4ub4bS^oefg?IO;D|k#gm}gxF(%7pD(p0e+tP(%KrX<#KeZx*B6a$xl`Y$uM;~% zy0^A!oLgCL(emB#Z5*|)33-EWe5(#EbyQ0m^SQ?apTVEMvdT=%t{F@)wKmw7wb1+I zzV>YqJ4Oes_S6crZ!EX5NQ?Yj6y`lePjBVw$oOhfc_Afj&YBo7W{%;;ITP<~ znf7tV;pcX$qf$?NS!mUKVs+!ylNUpfQWp?o)iLe&X_QC*8F^if1y_AuDJWZmn@hvaqk4P?g(&5YT3QH~3m7j(b0W`XXdHMiC7>T#QjeSsWcd+rsCG&x~JF5*Y zud{1l{q*%TW3734C4Ob{{Gc6)x}gD2PPcJi6oxK1BE&pX+h}5FG z>3cS1m%q8q7Hrqk5p4XYp`f|WF?7c#-E|+{xqLZc&^mvysq*)m+q?3n$p&5hSt849JF9jf-P zn*C<=vXPe*M{v%yn78$4f79k&Gj-_D%bTiP5dHvFX`7q!lLq^BuhxnysegH8-htbe zvu+6o=dSnjJy7N{XXY-y@e4LsE?YdxJaI(Zm2oE>?0pui4e(YzHt=ELqX4BMBX60d z19CR)4S15e_feT%pULZ$>sCCmsf#-|{Hko94@1fnGt>7WS8tX+J(U@{^L)bj@3t?t zc&u;j!hic?@!+e6jlYk-G|NM+w_A>Dly}c+ZH>t#*H&`M&3f2brh;ams72H*v4|v8LYX$Ggdo z53HV;tQYxloXdtCURfiXLiYB%V}E>Ijs|O!PQkQOPYw?hPV?AbU69%u9$mHar&>zj zsiySB^X{;A-Lhj(+<9qCQ>@E`UVtFGQTvIM;5@ss1V6GPuOoG*MA;qz(5 z!Nqq!s&4yYGtxMI+^kCT%E=|AmOeF7N&~7+H0Hb>5%I27w<)#dLc4LR^Q(Wlq(2>T zMZ=};mZSP%UO(T`E0r&%j!6D_f+8&3lOYiyZqr@Zzm}u{DnLfQ>!EKxSoadea=Kh=4TfVxjYu@9u z38Hv+?}hBu@@uoV^ViPO+8le??b--`M6b(r>4Amv29d0y9ZSnptLG^scO9yq6Mv-m zu7{FeR9spgn_VmWmB=j``Z8W-;)^zY^})mRH@~_q{L;@L;iTC(ws1l}ndrE*u%WUPVpq zrGLJDsQqBO`ukVs_Ew&eGymA38CywsL>v;XhqtV++VhWufuG_Oowu_bWiaxKej;xz}h86QB z|44L~hUB}~rM4zlULVDZ+kNI_KmUd|4XbHA&w1(i&f(!CJ}>m4-S;b})av7YF7wN}c%ZOWJ+$lb;cFZN%#Wu} zoF~`o*yi(5N|Ty5Txp-Wcis*?*Bou-v->q}N6Z_2c)I@>xkN|Hr-k3M-+g~JHT3YE z`|`bxe|mBD`=}R7hwcpbWTocnaNm9|>YKl7sq=d!YZd#fA2sE~ zV|nQ_w+ctr&NbhmE*oKaKGIT0$t2R(xK!uVxQG2qD!$0%r~3ExyOXoSc=^|jV`GN( zUU?zk&SG)&u*HfdhOtLi9k5#yfBA!KacTZG*_FqoS3b0C*14-(b!FM6A$5sr#!{!! zkK6Q1xxCz9|H!qQz7LR!dAv#AG#9COyQS{#gCUFi*7==NsffBez}?w#$em)hZEi0| zu}-}0y|HWbYS~Y57s9W9wR3j7Ht@hF&UeS#Gi)>rbEakXHelt?#=5BX&+x%o!q@`ei!RwGSo$7^SDS|`1n`bpy6!K1lOD3ZVP>pS(Mm-r zuT^GUtG2}dWiacu!lwO0uQX1`o~iY+OQWvv@!KU!wkw7ydaCy@+Uya(FP!&f%eKdg zy}ldSI&KZ}rTet3zhw8lx;|un$@zrxPoF;$}xNKQr?ftu^s)w@1FHS(?o8X%*Ru? z*KD8powylyYySJ0shh7<-7NGA^o@RGJJ;T7-e~*#RkQ7@w6_}#jXfS#6ZaHH{q)k^m<*)H%-ubND z6#YrQd0tPrWp!f%CK`H7bFY$1pY3F8?_l?Kg{|$av9o5U<)&Uaax3EK4my+Ul0h76N?l2zdF`j|%M%{Z@&q_j!eQ-{sxmRa*1H$NCHH^}U9#nD@H z8~O$c!r!D!_>}4{lN8l`oMqISG&AJT>aj;nU*~3cJ~l|1;9sTvxxP-(eq#2FmF9yY zP2V}#mg(&8_c8T)#@+ffUW$K1NYBia^W5&miG_n^WbKL!A6Su<{c3)hqtdF&y_%Oz z%&oe6v*Pfc$)DrzA2s=Fe(*G<9+}!VB7!HlxSg~yF7-ayb?@*SD?JiFO5t$Y`PFR;9HMTa&`gVPmMVl`R0^q`j+GFC(M+`90}YO zrV+SJK4V?I>9KXG{%=$!7V(jp&t4_4W`-+{pOadAWM}>2<6~A$@f>TCeO1kFyoqOl zlil$#^DoaeiL9FWY3#k36Vl~s;VvQyy)W_H$ChzOg zOciXcPHq|OWF0uBkaH=qaYm$_@uwHFjjh81$2fz+=();8yKR)MJd_pG4K~CC)Lb!c z9|Hb9yJDQb>5B2f4dqP_pVbcLY=0HfbG%||SX5eqO7ygmd<% zog9$Fww@_9W`?%Ork0{{6=tKRtJ;{1E-I`YWxeUcP=RN`AVlLbcYxe=i%l(?HlB&q zNetZ1o0lAOaACz-pM<-8?ns{=Kcc;LdHLM7uXQtDkIF4mtZOuy<+XkA&j!C`xqEIs zyR17R#&zgcyXX07smk`8y1B9kU%F1#F&jPf$eCwB{qJ*B=Idp~`L6jZFZ991?E#)c zcWTX)FZj0S^JC>zD>UM?q5`@`c@4NFTvswYCnP}HeCfucUeix^tI}N?TRygX%U91g z_v>22<_#{W?eF>AHPpcDLs;swtGX|I@1_W*FZ0bTe61UKJf`}_M)mG9dS<5G%SDFR z%#>-GrIxv5(d3`Onm6mWYK2;N(_h-N`LCIQ?|RKPY8>$Sz*mz6pGZxGq2bM)F~xV@DOXm<1dZWEW({q0Ki=mJS1@?0Oxt9K!;7k-oW>ti z_`F&#?nuIu&r3p%FP!&~lhLqbh5hj~Kbuu%%?&!L_J2EEihd{SIpC0AFO{lIFI`uc z%IHKzM4m~#6Q!kL)M_)@(fFrj+VHfg_8F%#^543CJlg8CC~>zNQhev4(^sWMe%!j@ zF^7_`rR*P|duFHA=B&w9VSAR}O);#vJ94P&u*FUXJ{jL$WBVa}m}~s)1eGm{ntqGj z&L6A@PUtbgi@8!*<(WA0<-$Y+K^)|54E}uvg#D zGi@KPh;VUA415Llx;EL_^1G*9$({T`C#1gbYli}4Q;B-U$Nd#wy$<&~+rA-t>!|dZ zO2aJ>NsWgshBd&uzPg9}G0_BEg2b#{qjYn>pZn*U<^jnx`*8NP<252j~s1}6x8 zx9qA;QSfxTaM5hxCDqsS6q3BnwPmgQWR>(kJuPffGkbfdN|hF?4mC(=G(bfy&GNBQj%XpDXbXVcS*f_ ztaWI1;enH$5Au%sMZUC@{XD!X=%9{K-N5#<+J^bF_tQ@~(z3vn}fB{SNKi{jPl23!Rc- z6`}S0dVesqcvK?Lv~fMO@Y?r^f;!#)YF_6RdRpl@Yzg{#Q03+5vq<8jGc)?tIqF{2 znQ*W*V#T#b^LGlhM@K7aluo!>{FZ;L=#}fffGK*LU!J?;cXoGDw`C>oKL$rf9F^ZV z??PWquHDrMUPk4ObIur!-fY)zqCvLtj7O}*h1*tsQEYQcb1>7DJz{TS;LsdbGP~ja z(P>+@Z(1>&*LP(0Ho?&3an_sdcUTN^$}2*^t9c*j4lXO2bEE2MQd+QW#A)}ENri9w zT}&=Y@g2HVqi~${jm1Yeo=tlzoWj{Va!N8^S1p|9y!p&4CpCw%V8Qme6KC3OaGe?2 zyUgzC2^&Y_pdEE)%1)IZrSvl_cRG)K?|1safggt_98L93jPX^Tv~!DZ)Xbc2Cp@>c z>%a46Rjgoz%x>4Q8*#@sO*K7oUf+YWSSdR+O09PsUOWFzwRYR_>w(#Q$`>9wJ#N|9 z$^+mC&pAOtx1(ccZ=U(_tm4YbK{A$;_y*yAeqQ50$15M1;=WYx#ku(7)?+g&j+xzH zjr*>+>*z4~f6@#Ry%O37wd_i0_fGU>KawB)Q~k-|4-*#1AAT%naB%Bu`;z5{7Y>{G zKs$0&;pv4ppL^CFv%b}ovf^OuZq}^AKHDE!aW`9UIa{{4W@KOAIR#(*k<@Vy8s}cS zv-!<@1NKq9bMcvJiucBuSADQeKD^1`?2gwnCWdzP3-p{~Tau-e**&`wQC(vuQzcdS zFlfoJMXWdWp7)|}JztdgB?9 zZ47QRD5;tD&f!*h|3l4g`9}QdDdp}gGj%CX=i`Cvt6Xc0kCcubeO_9Aovm+d=+Jv| zR-pkq(yx88J#(YEIw&bK!1?RvyRxwn&FhTpoRa71%}~r9F=oxJpDM3YTBltd|NXik zVd2HCuWoI5vw!P7m+ezd=f{T4ayDuGXH{BmzV)%IO?szKjOjbsMelrmEaz6`!-fMV z#za4~k6iNQHOM8G`64qVDL;1l6mMsZug*!CZq6DCK39LtY?!>Nymr2Ia(UIvy3hCK z$KGsuU-9Zmv_<;)G4ubLFYI@@JZQJc!YM1fxu0JLC8U=7?lw`p;~uH|X7!%=s;_HT zB-C3RFCMchYEoR==D>t85tpq~&uucvNSPn?P48mOcFxgKy^Nae0kb~LXfFvdu2>mr zd~*10z$?X0G5YXIKR~a##)@-#-#^oZXP=LruYW@=-_(EXY}?)2_GU;$6f3sLYgJ!3=6TDb*{gp;guUzFcD~2k ze;gK_IPI*;kF|2T*w*7lb&R|quG>GiBGxEe);ss?gF?$*sq{fDCziHkbZ@Wdn||t9 zdC=f3YwVt0^=`4@e@PD4+ZX;%MnO;iXR>3LTZh*UzWhVYv+&#bXWb_0Sjl|&nK?D= zL!Y+HziMoso|V2})9sSUTIZmvC*)hwl-tWgf`1scSae?sbOBa!<_%} z$=^OI|44z7M$@H1EqPLUHc!)~hrNk7Xk2map!6`4b;ej`%4Zc2;Sh%~OZ&A@VI-rOJb!JyLjZmhbquVZ+7Hw{-&v^(;er=|wf?$43ivzc1$>T^Yn$npZr= z+hpx|v#g27lP-qI}V@V)Z6R^fw+$NClyoipk3sgnb* zxf^E94%e=qXD{{M?eL3Z3*QAFHd(8rFgB8}ZnQfB(y)HJsF^-$ea(CtF} z{(@l5D1+4N8d?hc=%l}jq{nD%JN&ou;0J@U4rJ!YWo2$;Ic2GDTQGdQs``TKRWDC2 zu%3EqtyPz=R26dVX*8M_xzuc%FJ7!v~i@1|59p>dz;5SlwpS|tng2pu-*4DSOZIX}69$3x+46p00iB6)|M2QdI+LP36o&v?=r|MyEKJDffGaE!6%LD~ z!WJSbY;eqy3#@<#KJ(D)E!pVzTc2EwSzyxK|JT^;(D@1<-4%hL8Dgy93RG!Nc zsL&mpgRiN?OildY9G7%Wr4dVo!$!LS9GV00u**QfKiQxZJv9ja$pNLrKe;L#tjj3X ziH@i0=-{3Oq|hgT1ALZ#KCU+I0gjrM(~UG|y9Wo%mj*}gM7~UdfgMY;_X+fKbq8+C#c$FycXwOjg5HOVqDK3aFGS{R+64Fox(47s_E!N;YXI&l z1r_E|MPRvTXsdyW%03YB|VwVqaMWk|Fswx+`ms|gZoWE_miH?;gXID z8~6l*4rYVnwSNAfqq*40N=-8t>;pVjVc!$SEb*UeY0h2}u+&}0$k510OADO$)B?At zYVr8sKkxwopV_P_*iaeZh#7+B9EZ685m1zh*8G1pjA63YoCVARpup5E2AR}ZjGv4A z`&>-R*8llrOF#D&|F)li0rwnQ@~6#bi(ud?X9NT4fR5*4R*GA=;ZpZyV4eZW^9b~F z2Ob6*fSq{-|MXBH+-{l*I1+0CRJzh9FhJ9Csf(-oGT;lE`b&LWy`(j<+oZv)r!`3n z{1&(n_7`;{)H^jzfoF;NDX9l&kXWK1Fz{pura<#zm5{VaQ_1utD}K=yQ%6iCD&n%G8l9j)^)pi8t)O zx(R!}H5F9H*i6?(3>27x@WJ|D`!RI{!A-G|nmSbf0W56%rNSZ|`2SU3vCtt4okK{l zxD;5VQH`dW|LiSn)T6>;VCi6zhG6k1uq3y27M-z!x&F771=a-+EItL6+F04E31IuiN)uV=4xLszdo}~R$G1QfyQd8Hn2dzD=mvY}xajO2dQAi! zE;_rX4EJow?H=EpQtTdkzrwHEiS-weawxWx0Mm|`Ka$_w@Q33){)z`GE(Ufl%5x(x zalo7=j!W`24xTed#l^tx@%_HI-Glj19GB$dJsuFF;$kq~b7<@yOt#{gw&?0sG zf?`B8c2C4u#Ow>q)8e=!w|hM1Lg_Co8uA;v|2GUnT0(<$h!`$%Fz65M9uLS+aWSxa zeCJQGFUojNj#&IDF1qm^WTXCe9>RkV6kL??9+UZXzyH_#h(Unti-Fz4JAAO0rHuEO zjD)!8#(N%v)jfD06*O;yMU%LFNpANT1ZsbQNd0g1$fH^3fHj#IE=)$U{=y(YxERg2bas!$0)O33Y<|Szl9a7BSO<#Zl6<_!!;zG6g2%w_c{JlaSY(Rh zl6<_!AW-#)MQwlAUo>_P)~DjQB)5A!a7^hhJ_Ebw)7U*&e~aP5WPaVg{~EtA2vC19 zuzNn8-BZSUOh!Unbau~YFy8Y~o2J@5WxU5^B*aCxzUMQrdvJRKjEgefV=@xrq8sl8 z490svK*6{u<2@!L87>S0)xHD_>|Q`;_muG-laUY?3IW2!!0rV!b`Lf&V*ZH9NQjHh z?gb3&UO;2_VE-eIOY-p^g8=mx1G^W{*ge=>iQ|%dycf{fJs?(pyPg2=AcX85?A^q1 zNj~0V5UBlya%CdkiDvza&D($&hH+8GdrU?$`@$eVxER|V&g z?uB%APZ{qq83}RGjrT$Zb}yu}d&+o^$w-Kc&h7zY%fP_s44*RK3ne#v90S$Dz>%Ea zBLlCnrLi%}n2!rd)@e8j7#jog2k-2Jv4Ksz*m!{pNs5im16W!NT!5uT;{zZDK*1*Y z;E$t#`;CDcu(W9W00bE**d(6-SX#86z=XMFY0h*40mb;1|u`CC9|{B{~((J{E- z*oHVZOh`g|!%#pv1=IlpY;?XrnG0AL*DEPDT3^73)L++#O`j|}E*Au8DE-z6U!bRR z8S%Mvgf58jP_T8v7ic+M79&y@qiiYrCU9FI1zRV4ftJ{1VZ7?^bV^6wBcovJgfGytyey1k{dH?` zKc(Y&K@g6DtrNaL%k;9CP`xZVt{24lDA+pT3$$!6iwWJ!qT_o(kWd_3CkS601!Qkb zC|?#G=L_PH6l|UF1q=m@jfpSN@xCC4Nx{|$U%<#`7#ou{5*_yo;-nO8o$v*WfQGO! zp?_Hzw@aB9K#-M!trNaL%K)>OP{1rY4j7yf701>I5*SAT_ZyQn5*-f=g1{7Po$v)( zCYXisu)iC7>9}AJL#ANsgfGyt!7M1vgNAlx(ec3`NKL`k316UPgjq}|VHO=H3}W0A zY@P50T2`3FgcfGe@xmZMK^$8rh+!NB+>x3`h=iMpn3X2In z%%bCm0nb3e)(KyrWr$f|Y5iX-LVS%x#}NaLfP$?PzJQ^CbjpM#X3_D)fCr&q>x3`R zGQ}(=R56Q=D+U~fIJQoZ#W)JM-vd1)+!JBiQYW4#TMNvJjfCYt{m&HfL#SYWv$6i(uU84O|Zz*S{j93$`F z1Q)6;Fd>UsWVTqOG$?-qm-_Xhif;SfQ5g#Z0u2^SIAa!>H14R8I;%@S8+TO3!hk^V zm{7+cyS5|t(NQCHVwZqD?x>7KOCYnDFvu)2h1^jib#9k{MDC~z2LkurfBOSIyOWvZ zjvA@cy98WvM`bJl3IvA7WW!7*lsjsq&hVI&#I8ZhDzh+7_t$k2y@w9<#J;ox9(9t( z*ymqY^&8KnC6`%D*ku-(UhaTLP5i*cB*sTeGP9Vl%q%j^Ou|PU*d<_^Nwv|E%`71k z=OEL~q#CJ%yabFhsWuD=W5u2L6GN>1Yx@%ItxQNsfN7CgGz@AGnz0_|SO_?mq_pfskow56{3ilrq{~%`? zlkidI4@3fznp7J`mc#fMtga9;O--tiGJoJ=lJ_62e=wn{5i(Ux!bh1ua52g8(fS7y zx*8$V)g*kB`2!b|7#}TVjlSpXzc#zr{DzPzYZ5-{{2>8pO{$GPDVYgvjgV<;QjOI4 zLxRj?Qf;)&0^pmWEz`B z{YSgLVv@y-km+m^KI;4-K_+uYZ3r!;4PIBuM8CA#b86xWB0)wo86T~GFrl>(GOgWF zBj_&i^}Pg{%^kHNwA41jgxW^P)OJUWKq2DzBp|mtYQvF0{(%w8zqV<7ek0S{9W?@V zQtHZ&Q6n%n3cf!lG&*WS zXsK?53Du2|sqT&%fk9L7{W-zcQ5%i~>OUrQH$tYnJ8A^(AdXK0!n>n3gf(39uX zWE!MX>^VZqo+C`Mu@QRq94t7*=eJJL=Qt9$|CsDQ$Z6Rf9!E{8K{~~sBeeWE!h}CZ z==pQ7AfohNr}iJT{5iseKS${KbFiEe$JZ(T97h7_mkEE4(DUci1RGrJ*S_|f`Gb}} zN0{*E2t9vJO|rqoB*#ZPe=y13M(Fu-YN8D;COJO3`Gd`bKS${KbFdtx*k5P-14lx& zKQ@z8ZZp!i{p&ih`Ik-4pM#l1%>Hn(U)S~D;|q=i(k~PKoK4T4QxkA-F^Tcf^5<+O{5hMR zKc^<);9`>FqvOxnOj5kr^!zzB5eFBO93QQJFiG=f)AQ%lWE@;fa(uM@!Gu3Y-vvUm z|DY!1;9`>Fqn$sP@aJrL{+ybWgNsRwkCs1YGvUwK^!zzBF$Wiu93QQJFyYVH^!zzB zIR_V$93QQJFyYVH^!zzBK?fI;93QQJFyYVH^!z#4?uySJo#M~gv?<_hCj2>@o<9d0 zY6`wit*>bLb2bzHoK4T4Q@oNtCj2>@o<9fS z0&)Fzia%%5^5<+O{5hMP65g>t2LTBRzRvI;I1)&|O!#v)J%0|u85De-@()`6oXvzk zXVdfNAao;+uT%Uvjs)&M)GB{%)A;(Co<9fS77D)3@aJq={+!K(KWEeP=OCa%!Pgo7 z97h88AA|T6o1Q-hQ6mbzPWcBdf6ivYpR?)ta}aQ%;Omrs(58#CnegXqdj1@QtHkkj zia*DZK>B6EpR?)ta}b)N;Omrs(58*EnWT-g>G^XIb)(?xlz-6j=WHhYIh&q82LU?@ zzE1fEEq~5t!k@G0`Ew8zq~Pn6f6(&hY$p6Uo1Q-hp-pjoo#M}NB#?hF;m_Ih{5gnP zQt)-kKWO=L_HX!U`ea|?rFsANlxQ{+HkvJ3K>;@UUm#ExGcNV(iJK-^MXC%30x6RT z8O{JvzgG)Y!VGks*$=%{&N#p-HvjNTBXxLPE1iBs8f;5W1(} z`{P9lsW$X2&~TC)`abF3tCvJVlWGL~gE+oFC!tBT;Yi^AV={4&NN7@xfLfs7`{P9l zsWvt(3C(6gLbFLEG^s}D?RkHm#7(LVM*{aBlc|G5LX&EwCP}mZJc*lB8=E$Xo5O^J zW|K&0QjOFkX$??(p2NM#SLn5Kc_$Yf1TugF&wEn?_gyxV)Xfi&^<^va#7#}SO z&0#`9b4VmK86S22`12%gQf)XAXnbZuLUTwYG^s|wdWw&Kf1boms*OXN#LdCti?B{+ z`?7N@XORB);Y{3V`?Qy<_n zA%}y1wsywV}Q>@ zefZ8?MFrmigTI6vzNrJB2|0Y10=f}Y0Rg6e8ERkx6Tk*lqMap4`v_o93t|Cp`WDaBq1%ZEvG%ivR zar-oo5h;l!(h^IgCgR3mR7PY-B25t&&w{T+x?+ixMciKsz9Q5m%@XO0xCRsbO4J*o z;2C}aBWjzXcolJjAX@UTun2}oaV(MMSR&Q2M7ksH2?IYDX^%yyPnx)53jIn{vq*!) z?L@%TMH(dT+d)eRVd4fEP$JSGe%T2CPh38N{zD`z(jakf1^DV;?;@D;wQOzQ!LquMOr_P`VMSe%*jG!f=28uL@=MkX7A`RjvNJ zk7(Rvi(HQ_QXCN&06!Ngj@asgNkKGt5}P-)glHGB9YIS7T@VXwP$C*Ui6tXiLSQBq zK`PS3Y6E;FQk?iKPNw~41upY7A9TUCk3H<9UtM{=c!yd5GkNo1iAaW>*k zLLzEJ+^|Q)Kt%5@Bi<7x&BAu^pxdw`+vs1Si$#4b>SR$bi@KTUXZ+1O;CDn%i{9nJ zBKjJCQwsQ==xx!vH&{e}vxp975k1Z#x}10~fi!w4F1l30Z~aIA68MOI7v0&;B6=Rb z5go`8ea|8~pSaH&Oo1Y6!3_$(nb{gFCt1MM@Vk(~uL%bf&4Ho|ZbdiAimq%G-Hj@` zgp@_-1Ha$X8cc9_$~NF#(+MAyh5gjPh?qTm;yfaefe5nZPty0$`e zJp^$L1DLSz_KL0*5T);n(&X{Pcu*gq6;XOMLTCj~Tt>eq+DrI_D9schJOd$I10j4v zlm>_={(;{U?jcGaBhs|M1V-Q^Tm&KXfhY8U-x2x{rG<#nFW7`W@WcjdFoEIt*n~dt z1M#4o&QKbdiO4V!>m;Ig2p$DYOSlhdQ#gj#GTTy%zkBC}>$p=Tr!N)9VJdy^= z32oq!A@nmLM`(jXXoEv&L$ogy?f>RW&z~|y+TGg?-SmOU3Z3-G`#(z;4|jiQO>1|5 zpFlrXcYmB9P@4%%? z@&D5T4;4uRl-Qb4S`&X4iD>@{%CY%bTGPzM+e6*md!nt4hP0-+i=UT?_aYx19qga( zZYlwOf$ji089nB{MAsPjxw{1T_~{rK8X0M6ae%V;U^wG}iH6Ug0vh1w;}+=Z{_pn& z;5#As56ED0T<{z4J06et5B(0f9}koR5iQ_3TEN=15JU9epg!zzpyAV90^HT7Yl9IJ zn1dErhG=oMxZ|~0YFb)q8YHa2e(sCFGJ?ZnNrUQ$|Ech}T(AmUq=J=!4Ip-o75!4h z8!toujjlJ*|8iXLUeZ_ z{#!1#0jHEpygHpzY{anC-bt&M(wjtob zx)cat+Ys3^~wmg;B8LUfC}lKrfDnsdP~>>9E`?k) zW=fIc!+s>>qtPjf9L;&0K;#xK!x#|p=Yr)p)HV>&g)oDCEnLQd{2YWcAU_9Xke`Ea2Q(&vFhA_) zAXW;uLkRmh%{mcmS71K}>qMv>z?>m{aKJW(sv`~-?iKGpAO`7!!-f5v1FwNWNC)zB z7GR>lR+{__uxo?HAuTO1&%pQu@OZ$1*V({K;W3emg&N4u1q&{WYM_*H;lAQ>&?qcL z4s1Q)GT1-30varQG~6LxAK0`~_eX%Ufqj*S@od!JqCqH185R(tlwnK}rHljZ^FRm< z4S!JNcxbSiQpSb$Q6SughEgbUd^9*nDHB3_MDSaa69;1xE*{x+zvjCZSaL?fR6GE0o)FO7OW3}7OW2e7BCgBPr!op zA;3ag6gez7NGXG303h@U>q7t*)zo$fK!^n@0}DX73~q-|3)Y7KES#vn6=DHwam+%D z3ZRs+VSNa(U@b+C3%5haf!iVE!R-)&kQ9VZ0JlTPhuQ(+QLtTsDS%oZ*zH5@0KbLw z0T@xJ9U#;UwF88mp>}{Ws2w0I4YdQEl3{$Xp93zIrX8@KgHRCM4m2`F=~ECPgWCaE zAXpCea}Yj<+rfhU9E6r2eE_}~ZU^9P;OD}A4wz+{cEElPf{}1Lz``BsXTY~W&jkxg zSPu4c5K4pF0r(TRKG@Fz`wh1PoD_hc3;Q{sAmDZYV}qXy`#GR1V0{24A9^lW*Fp7x zbsa1R`#Bph@vt21=im`E?STCpTt5Ko0|c63d^CQ}q49G-i9`4}G=2_3`>-61pL1yZ zoI~U1AdC;!N8{%l8b9aI_&JBh&$%>y4#MrwbGbBr4q}3^9F3oYwH_=-TIoTT>Vxji2*r{G3nY=X@GJ7tr`QpT^Gx zG=2_31rR;~jh};9A1p`X=K>l(7tr{*fX2@SG=2_3H}G?5{9Hie=Rz7k7t;8-kjBr2 zG=46m@pBMLgYXGy{9H)m=Rz7k7t;8-kjBr2u%CnB9`X-R2Kfgdo}qaVoRWgtfijU) z{{V-mAbqev42mL$?w!#?0p#^A00P?(cm`yDAfy1rG5`|v5COS9aJB~K_`q+W_!Y27 zD6RsgH^`m=>xv$<5Pt?>VyUqka5fBzJphs(J>)_8Ef-CCqLguYv5EG6#D`P)S#FkC_|4Kh+_faE2wQ?NTkMsz`+72h62i<_#`-Z0LAb?*awQ6 zalrXc__=UA2lN!&4g`=kP&+`-94dq3*&r+hw*zccp!&f1OQ=3@_63&1jslAJDOlLS za&U~61J1I*a(uWQVCsS81T^gs!0iCxcDNmI9Fqg6CrA#&`k?1>u-tR;_JU4@<-kkm zsrmpzCoBiY=71PYI|Oh$IDA+iT$r2SaD;F>1UxF2fR0U6jsS!Nh3Ekya(mG-s$YUb zBG`M?#pO8AT&4xi*HFh;a8QJg9yJvEEhwXo&p-}LK2$j%Mv04R@j$mw>jP6G)n3ru zFSVaR8Fqk93=0|tq39AU7{J6Jjs+Z#VN5iZ8z5|0)P4a)*daWM91lH6M=7H@lK_$gDEa`^X`x3>#eNGS z`moRNK`&6{09Q%vXRw_i+faa?%aWz;e$wE0lg*M4khsHRX`5a9W6d!(!pj4oZAE=6EJ*%p%E8+n8w!EH{=?Db4kA!K@WmW_i;5??C$F2 zAGl0K6Z}+bx}lMw)-(a1HC@0pV(|>QY(sELZMr@(ZJIuM;>th3#V-Im!UUq@fZ>uJ KJJ!&`Ncw-`VbUD{ From d88e9c565d0833c96a4810006edc056ef21bd1ed Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 10 May 2024 07:32:38 +0000 Subject: [PATCH 245/345] build(deps): bump golang from 1.22.2-alpine3.18 to 1.22.3-alpine3.18 (#2547) Bumps golang from 1.22.2-alpine3.18 to 1.22.3-alpine3.18. --- updated-dependencies: - dependency-name: golang dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: Vladislav Varadinov --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 496b210560..b2f6d690f1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.22.2-alpine3.18 AS build-env +FROM golang:1.22.3-alpine3.18 AS build-env ARG DB_BACKEND=goleveldb ARG ROCKSDB_VERSION="8.11.3" From c3923a2543e9a96e518d737d0a48eb7de1099970 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 10 May 2024 08:14:15 +0000 Subject: [PATCH 246/345] build(deps): bump golang.org/x/net from 0.24.0 to 0.25.0 (#2545) * build(deps): bump golang.org/x/net from 0.24.0 to 0.25.0 Bumps [golang.org/x/net](https://github.com/golang/net) from 0.24.0 to 0.25.0. - [Commits](https://github.com/golang/net/compare/v0.24.0...v0.25.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * gomod2nix generate --------- Signed-off-by: dependabot[bot] Signed-off-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: tom Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 1e661968a8..1591fe93e2 100644 --- a/go.mod +++ b/go.mod @@ -46,7 +46,7 @@ require ( github.com/zondax/hid v0.9.2 go.opencensus.io v0.24.0 golang.org/x/crypto v0.23.0 - golang.org/x/net v0.24.0 + golang.org/x/net v0.25.0 golang.org/x/text v0.15.0 google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de google.golang.org/grpc v1.63.2 diff --git a/go.sum b/go.sum index dcccd80c85..7b10fa9a6a 100644 --- a/go.sum +++ b/go.sum @@ -1336,8 +1336,8 @@ golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= -golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= diff --git a/gomod2nix.toml b/gomod2nix.toml index dbc019e0f3..672523be65 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -670,8 +670,8 @@ schema = 3 version = "v0.17.0" hash = "sha256-CLaPeF6uTFuRDv4oHwOQE6MCMvrzkUjWN3NuyywZjKU=" [mod."golang.org/x/net"] - version = "v0.24.0" - hash = "sha256-w1c21ljta5wNIyel9CSIn/crPzwOCRofNKhqmfs4aEQ=" + version = "v0.25.0" + hash = "sha256-IjFfXLYNj27WLF7vpkZ6mfFXBnp+7QER3OQ0RgjxN54=" [mod."golang.org/x/oauth2"] version = "v0.17.0" hash = "sha256-M2ZZQZt449RJL18YpzGiAiqfGsDVMsr1IVWbYp/G/go=" From 27e8ebf8afbd74f1cd08d70e490809c10001d805 Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Mon, 13 May 2024 11:27:07 -0300 Subject: [PATCH 247/345] chore(docker): update rclone dep (#2554) --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index b2f6d690f1..6da1fda5c5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -41,7 +41,7 @@ COPY --from=build-env /target/usr/lib /usr/lib COPY --from=build-env /target/usr/local/lib /usr/local/lib COPY --from=build-env /target/usr/include /usr/include -RUN apk add --no-cache ca-certificates=20240226-r0 jq=1.7.1-r0 curl=8.5.0-r0 bash=5.2.21-r0 vim=9.0.2127-r0 lz4=1.9.4-r5 rclone=1.65.0-r2 \ +RUN apk add --no-cache ca-certificates=20240226-r0 jq=1.7.1-r0 curl=8.5.0-r0 bash=5.2.21-r0 vim=9.0.2127-r0 lz4=1.9.4-r5 rclone=1.65.0-r3 \ && addgroup -g 1000 evmos \ && adduser -S -h /home/evmos -D evmos -u 1000 -G evmos From 0c5f7db6534a87a5b608beaf0e04673d901810e4 Mon Sep 17 00:00:00 2001 From: artik <100273990+timwhite2@users.noreply.github.com> Date: Mon, 13 May 2024 23:02:19 +0800 Subject: [PATCH 248/345] feat(jsonrpc): add support for allow-insecure-unlock (#2375) * feat: impl geth allow-insecure-unlock Allow insecure account unlocking when account-related RPCs are exposed by http * fix: Solidity Test error * remove JSONRPC.Enable check 1.remove JSONRPC.Enable check 2.add changelog 3.modify JSONRPC.Enable description * change log type * Update CHANGELOG.md * fix lint issues * fix test-nix error * fix: test error * Update init-node.sh * Update CHANGELOG.md Co-authored-by: Ramiro Carlucho * fix: solidity test error * fix: rpc test error * Update server/config/config.go Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> * Update local_node.sh Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Signed-off-by: Tom <54514587+GAtom22@users.noreply.github.com> * remove duplicated file * set default value to true to ensure backwards compatibility * remove unnecessary change --------- Signed-off-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: Freddy Caceres Co-authored-by: Ramiro Carlucho Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Co-authored-by: tom --- CHANGELOG.md | 1 + rpc/backend/backend_suite_test.go | 1 + rpc/backend/node_info.go | 16 ++++++++++++++++ rpc/backend/sign_tx.go | 5 +++++ server/config/config.go | 6 ++++++ server/config/toml.go | 5 ++++- server/flags/flags.go | 1 + server/start.go | 5 +++-- tests/nix_tests/configs/default.jsonnet | 8 ++++---- 9 files changed, 41 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b10cb720e1..845f17b7c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -98,6 +98,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (cli) [#2503](https://github.com/evmos/evmos/pull/2503) Revert deletion of ConvertCoin for ERC-20 module (#2155). - (ibc) [#2504](https://github.com/evmos/evmos/pull/2504) Refactor repeated unpacking of IBC packet data. - (make) [#2487](https://github.com/evmos/evmos/pull/2487) Improve make command to compile all smart contracts in repository. +- (rpc) [#2375](https://github.com/evmos/evmos/pull/2375) Add support for allow-insecure-unlock. ## [v18.0.0](https://github.com/evmos/evmos/releases/tag/v18.0.0) - 2024-04-22 diff --git a/rpc/backend/backend_suite_test.go b/rpc/backend/backend_suite_test.go index 37e8040bd8..eb3ec77713 100644 --- a/rpc/backend/backend_suite_test.go +++ b/rpc/backend/backend_suite_test.go @@ -85,6 +85,7 @@ func (suite *BackendTestSuite) SetupTest() { suite.backend = NewBackend(ctx, ctx.Logger, clientCtx, allowUnprotectedTxs, idxer) suite.backend.cfg.JSONRPC.GasCap = 0 suite.backend.cfg.JSONRPC.EVMTimeout = 0 + suite.backend.cfg.JSONRPC.AllowInsecureUnlock = true suite.backend.queryClient.QueryClient = mocks.NewEVMQueryClient(suite.T()) suite.backend.clientCtx.Client = mocks.NewClient(suite.T()) suite.backend.queryClient.FeeMarket = mocks.NewFeeMarketQueryClient(suite.T()) diff --git a/rpc/backend/node_info.go b/rpc/backend/node_info.go index cb2fcc0220..7e6bde3849 100644 --- a/rpc/backend/node_info.go +++ b/rpc/backend/node_info.go @@ -21,6 +21,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/crypto" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" rpctypes "github.com/evmos/evmos/v18/rpc/types" "github.com/evmos/evmos/v18/server/config" @@ -32,6 +33,11 @@ import ( func (b *Backend) Accounts() ([]common.Address, error) { addresses := make([]common.Address, 0) // return [] instead of nil if empty + if !b.cfg.JSONRPC.AllowInsecureUnlock { + b.logger.Debug("account unlock with HTTP access is forbidden") + return addresses, fmt.Errorf("account unlock with HTTP access is forbidden") + } + infos, err := b.clientCtx.Keyring.List() if err != nil { return addresses, err @@ -77,6 +83,11 @@ func (b *Backend) Syncing() (interface{}, error) { // SetEtherbase sets the etherbase of the miner func (b *Backend) SetEtherbase(etherbase common.Address) bool { + if !b.cfg.JSONRPC.AllowInsecureUnlock { + b.logger.Debug("account unlock with HTTP access is forbidden") + return false + } + delAddr, err := b.GetCoinbase() if err != nil { b.logger.Debug("failed to get coinbase address", "error", err.Error()) @@ -218,6 +229,11 @@ func (b *Backend) ImportRawKey(privkey, password string) (common.Address, error) func (b *Backend) ListAccounts() ([]common.Address, error) { addrs := []common.Address{} + if !b.cfg.JSONRPC.AllowInsecureUnlock { + b.logger.Debug("account unlock with HTTP access is forbidden") + return addrs, fmt.Errorf("account unlock with HTTP access is forbidden") + } + list, err := b.clientCtx.Keyring.List() if err != nil { return nil, err diff --git a/rpc/backend/sign_tx.go b/rpc/backend/sign_tx.go index 0ab4e92e4d..8df2ea9eeb 100644 --- a/rpc/backend/sign_tx.go +++ b/rpc/backend/sign_tx.go @@ -23,6 +23,11 @@ import ( // SendTransaction sends transaction based on received args using Node's key to sign it func (b *Backend) SendTransaction(args evmtypes.TransactionArgs) (common.Hash, error) { // Look up the wallet containing the requested signer + if !b.cfg.JSONRPC.AllowInsecureUnlock { + b.logger.Debug("account unlock with HTTP access is forbidden") + return common.Hash{}, fmt.Errorf("account unlock with HTTP access is forbidden") + } + _, err := b.clientCtx.Keyring.KeyByAddress(sdk.AccAddress(args.GetFrom().Bytes())) if err != nil { b.logger.Error("failed to find key in keyring", "address", args.GetFrom(), "error", err.Error()) diff --git a/server/config/config.go b/server/config/config.go index 9ac0359515..6467aa5ecb 100644 --- a/server/config/config.go +++ b/server/config/config.go @@ -62,6 +62,9 @@ const ( // DefaultGasCap is the default cap on gas that can be used in eth_call/estimateGas DefaultGasCap uint64 = 25000000 + // DefaultJSONRPCAllowInsecureUnlock is true + DefaultJSONRPCAllowInsecureUnlock bool = true + // DefaultFilterCap is the default cap for total number of filters that can be created DefaultFilterCap int32 = 200 @@ -150,6 +153,8 @@ type JSONRPCConfig struct { WsAddress string `mapstructure:"ws-address"` // GasCap is the global gas cap for eth-call variants. GasCap uint64 `mapstructure:"gas-cap"` + // AllowInsecureUnlock toggles if account unlocking is enabled when account-related RPCs are exposed by http. + AllowInsecureUnlock bool `mapstructure:"allow-insecure-unlock"` // EVMTimeout is the global timeout for eth-call. EVMTimeout time.Duration `mapstructure:"evm-timeout"` // TxFeeCap is the global tx-fee cap for send transaction @@ -276,6 +281,7 @@ func DefaultJSONRPCConfig() *JSONRPCConfig { Address: DefaultJSONRPCAddress, WsAddress: DefaultJSONRPCWsAddress, GasCap: DefaultGasCap, + AllowInsecureUnlock: DefaultJSONRPCAllowInsecureUnlock, EVMTimeout: DefaultEVMTimeout, TxFeeCap: DefaultTxFeeCap, FilterCap: DefaultFilterCap, diff --git a/server/config/toml.go b/server/config/toml.go index f5a20b8adf..c4f7838a77 100644 --- a/server/config/toml.go +++ b/server/config/toml.go @@ -28,7 +28,7 @@ max-tx-gas-wanted = {{ .EVM.MaxTxGasWanted }} [json-rpc] -# Enable defines if the gRPC server should be enabled. +# Enable defines if the JSONRPC server should be enabled. enable = {{ .JSONRPC.Enable }} # Address defines the EVM RPC HTTP server address to bind to. @@ -44,6 +44,9 @@ api = "{{range $index, $elmt := .JSONRPC.API}}{{if $index}},{{$elmt}}{{else}}{{$ # GasCap sets a cap on gas that can be used in eth_call/estimateGas (0=infinite). Default: 25,000,000. gas-cap = {{ .JSONRPC.GasCap }} +# Allow insecure account unlocking when account-related RPCs are exposed by http +allow-insecure-unlock = {{ .JSONRPC.AllowInsecureUnlock }} + # EVMTimeout is the global timeout for eth_call. Default: 5s. evm-timeout = "{{ .JSONRPC.EVMTimeout }}" diff --git a/server/flags/flags.go b/server/flags/flags.go index c888b0f1cf..8dcd06b772 100644 --- a/server/flags/flags.go +++ b/server/flags/flags.go @@ -42,6 +42,7 @@ const ( JSONRPCAddress = "json-rpc.address" JSONWsAddress = "json-rpc.ws-address" JSONRPCGasCap = "json-rpc.gas-cap" + JSONRPCAllowInsecureUnlock = "json-rpc.allow-insecure-unlock" JSONRPCEVMTimeout = "json-rpc.evm-timeout" JSONRPCTxFeeCap = "json-rpc.txfee-cap" JSONRPCFilterCap = "json-rpc.filter-cap" diff --git a/server/start.go b/server/start.go index 3a427b6f15..9273559060 100644 --- a/server/start.go +++ b/server/start.go @@ -187,8 +187,9 @@ which accepts a path for the resulting pprof file. cmd.Flags().StringSlice(srvflags.JSONRPCAPI, config.GetDefaultAPINamespaces(), "Defines a list of JSON-RPC namespaces that should be enabled") cmd.Flags().String(srvflags.JSONRPCAddress, config.DefaultJSONRPCAddress, "the JSON-RPC server address to listen on") cmd.Flags().String(srvflags.JSONWsAddress, config.DefaultJSONRPCWsAddress, "the JSON-RPC WS server address to listen on") - cmd.Flags().Uint64(srvflags.JSONRPCGasCap, config.DefaultGasCap, "Sets a cap on gas that can be used in eth_call/estimateGas unit is aevmos (0=infinite)") //nolint:lll - cmd.Flags().Float64(srvflags.JSONRPCTxFeeCap, config.DefaultTxFeeCap, "Sets a cap on transaction fee that can be sent via the RPC APIs (1 = default 1 evmos)") //nolint:lll + cmd.Flags().Uint64(srvflags.JSONRPCGasCap, config.DefaultGasCap, "Sets a cap on gas that can be used in eth_call/estimateGas unit is aevmos (0=infinite)") //nolint:lll + cmd.Flags().Bool(srvflags.JSONRPCAllowInsecureUnlock, config.DefaultJSONRPCAllowInsecureUnlock, "Allow insecure account unlocking when account-related RPCs are exposed by http") //nolint:lll + cmd.Flags().Float64(srvflags.JSONRPCTxFeeCap, config.DefaultTxFeeCap, "Sets a cap on transaction fee that can be sent via the RPC APIs (1 = default 1 evmos)") //nolint:lll cmd.Flags().Int32(srvflags.JSONRPCFilterCap, config.DefaultFilterCap, "Sets the global cap for total number of filters that can be created") cmd.Flags().Duration(srvflags.JSONRPCEVMTimeout, config.DefaultEVMTimeout, "Sets a timeout used for eth_call (0=infinite)") cmd.Flags().Duration(srvflags.JSONRPCHTTPTimeout, config.DefaultHTTPTimeout, "Sets a read/write timeout for json-rpc http server (0=infinite)") diff --git a/tests/nix_tests/configs/default.jsonnet b/tests/nix_tests/configs/default.jsonnet index d8a957822a..29f556a72a 100644 --- a/tests/nix_tests/configs/default.jsonnet +++ b/tests/nix_tests/configs/default.jsonnet @@ -6,7 +6,7 @@ cmd: 'evmosd', 'start-flags': '--trace', 'app-config': { - 'app-db-backend': 'goleveldb', + 'app-db-backend': 'goleveldb', 'minimum-gas-prices': '0aevmos', 'index-events': ['ethereum_tx.ethereumTxHash'], 'json-rpc': { @@ -67,12 +67,12 @@ params: { bond_denom: 'aevmos', }, - }, + }, inflation: { params: { mint_denom: 'aevmos', }, - }, + }, gov: { voting_params: { voting_period: '10s', @@ -94,7 +94,7 @@ }, ], max_deposit_period: '10s', - voting_period: '10s', + voting_period: '10s', }, }, transfer: { From c364d54794b126188ca1090fa7b15a949b12c3ce Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Tue, 14 May 2024 12:19:35 -0300 Subject: [PATCH 249/345] chore(deps): update go-getter to v1.7.4 (#2555) --- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 1591fe93e2..b848a33517 100644 --- a/go.mod +++ b/go.mod @@ -151,7 +151,7 @@ require ( github.com/gtank/merlin v0.1.1 // indirect github.com/gtank/ristretto255 v0.1.2 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-getter v1.7.1 // indirect + github.com/hashicorp/go-getter v1.7.4 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-safetemp v1.0.0 // indirect github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d // indirect diff --git a/go.sum b/go.sum index 7b10fa9a6a..f42f1ae694 100644 --- a/go.sum +++ b/go.sum @@ -736,8 +736,8 @@ github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtng github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-getter v1.7.1 h1:SWiSWN/42qdpR0MdhaOc/bLR48PLuP1ZQtYLRlM69uY= -github.com/hashicorp/go-getter v1.7.1/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= +github.com/hashicorp/go-getter v1.7.4 h1:3yQjWuxICvSpYwqSayAdKRFcvBl1y/vogCxczWSmix0= +github.com/hashicorp/go-getter v1.7.4/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= diff --git a/gomod2nix.toml b/gomod2nix.toml index 672523be65..f1a3d522fa 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -366,8 +366,8 @@ schema = 3 version = "v0.5.2" hash = "sha256-N9GOKYo7tK6XQUFhvhImtL7PZW/mr4C4Manx/yPVvcQ=" [mod."github.com/hashicorp/go-getter"] - version = "v1.7.1" - hash = "sha256-szIdn7GPvJ78gKKzQRWlx39X81QRDsXtJKo3P/4oMIg=" + version = "v1.7.4" + hash = "sha256-GtJSwcS1WXLn9lFAuTRCseIQBXJOElAywEhTtYrsfbE=" [mod."github.com/hashicorp/go-immutable-radix"] version = "v1.3.1" hash = "sha256-65+A2HiVfS/GV9G+6/TkXXjzXhI/V98e6RlJWjxy+mg=" From af0b1d143271f5ea8fa1e00aebf0b00a73e14692 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Federico=20Kunze=20K=C3=BCllmer?= <31522760+fedekunze@users.noreply.github.com> Date: Wed, 15 May 2024 13:25:27 +0200 Subject: [PATCH 250/345] [Snyk] Security upgrade golang from 1.22.2-bullseye to 1.22.3-bullseye (#2557) fix: tests/e2e/Dockerfile.repo to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-DEBIAN11-CURL-3320493 - https://snyk.io/vuln/SNYK-DEBIAN11-CURL-3320493 - https://snyk.io/vuln/SNYK-DEBIAN11-CURL-3320493 - https://snyk.io/vuln/SNYK-DEBIAN11-GLIBC-6673955 - https://snyk.io/vuln/SNYK-DEBIAN11-ZLIB-6008961 Co-authored-by: snyk-bot --- tests/e2e/Dockerfile.repo | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/e2e/Dockerfile.repo b/tests/e2e/Dockerfile.repo index 5e6c5eeddb..144d54a94c 100644 --- a/tests/e2e/Dockerfile.repo +++ b/tests/e2e/Dockerfile.repo @@ -1,4 +1,4 @@ -FROM golang:1.22.2-bullseye AS build-env +FROM golang:1.22.3-bullseye AS build-env # checkov:skip=CKV_DOCKER_3:No need to create a user, this is only used on tests ARG BRANCH_NAME @@ -13,7 +13,7 @@ RUN git checkout ${BRANCH_NAME} RUN make build -FROM golang:1.22.2-bullseye +FROM golang:1.22.3-bullseye # checkov:skip=CKV_DOCKER_5:No problem if it is cached because targets specific version RUN apt-get update \ From 1987b814ff237e22cc962fc22e47e06d6e9538a6 Mon Sep 17 00:00:00 2001 From: stepit <48993133+0xstepit@users.noreply.github.com> Date: Thu, 16 May 2024 11:12:48 +0200 Subject: [PATCH 251/345] fix(changelog): add missing PR to changelog (#2561) * add changelog entry * fix changelog checker * add outposts to deprecated whitelist --- CHANGELOG.md | 1 + scripts/changelog_checker/config.py | 7 ++----- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 845f17b7c4..c7977414dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -56,6 +56,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (precompiles) [#2529](https://github.com/evmos/evmos/pull/2529) Remove Outposts precompiles. - (upgrade) [#2533](https://github.com/evmos/evmos/pull/2533) Add upgrade handler for v19. - (precompiles) [#2550](https://github.com/evmos/evmos/pull/2550) Update secp256r1 curve precompile bech32 address to its corresponding value. +- (evm) [#2373](https://github.com/evmos/evmos/pull/2373) Remove check on hardcoded ChainID identifier. ### Bug Fixes diff --git a/scripts/changelog_checker/config.py b/scripts/changelog_checker/config.py index 3fabb006eb..9ac1eb9183 100644 --- a/scripts/changelog_checker/config.py +++ b/scripts/changelog_checker/config.py @@ -72,6 +72,8 @@ def get_allowed_categories() -> List[str]: "recovery", "incentives", "revenue", + "osmosis-outpost", + "stride-outpost", ] base_path = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) @@ -86,11 +88,6 @@ def get_allowed_categories() -> List[str]: if os.path.isdir(os.path.join(precompile_path, precompile)): allowed_categories.append(precompile + "-precompile") - outpost_path = os.path.join(base_path, "precompiles", "outposts") - for outpost in os.listdir(outpost_path): - if os.path.isdir(os.path.join(outpost_path, outpost)): - allowed_categories.append(outpost + "-outpost") - return allowed_categories From 211b644e4cc764cadad6f1c54c8a73c6d75f2a70 Mon Sep 17 00:00:00 2001 From: Vladislav Varadinov Date: Fri, 17 May 2024 15:59:36 +0300 Subject: [PATCH 252/345] fix(evm): duplicate event emitting (#2559) * fix: duplicate event emitting * CHANGELOG * CHANGELOG --- CHANGELOG.md | 1 + x/evm/keeper/state_transition.go | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c7977414dc..0cc86d5cec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -61,6 +61,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### Bug Fixes - (inflation) [#2299](https://github.com/evmos/evmos/pull/2299) Fix emission function and tests. +- (evm) [#2559](https://github.com/evmos/evmos/pull/2559) Fix duplicate event emitting of cached events. ### Improvements diff --git a/x/evm/keeper/state_transition.go b/x/evm/keeper/state_transition.go index 26f4aff2eb..c04da62e52 100644 --- a/x/evm/keeper/state_transition.go +++ b/x/evm/keeper/state_transition.go @@ -225,7 +225,6 @@ func (k *Keeper) ApplyTransaction(ctx sdk.Context, tx *ethtypes.Transaction) (*t commit() // Since the post-processing can alter the log, we need to update the result res.Logs = types.NewLogsFromEth(receipt.Logs) - ctx.EventManager().EmitEvents(tmpCtx.EventManager().Events()) } } From 93885776392b1b6e1e573a6f832849ab79f061b2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 May 2024 09:17:10 +0200 Subject: [PATCH 253/345] build(deps): bump bufbuild/buf-setup-action from 1.31.0 to 1.32.0 (#2563) Bumps [bufbuild/buf-setup-action](https://github.com/bufbuild/buf-setup-action) from 1.31.0 to 1.32.0. - [Release notes](https://github.com/bufbuild/buf-setup-action/releases) - [Commits](https://github.com/bufbuild/buf-setup-action/compare/v1.31.0...v1.32.0) --- updated-dependencies: - dependency-name: bufbuild/buf-setup-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Vladislav Varadinov --- .github/workflows/bsr-push.yml | 2 +- .github/workflows/proto.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/bsr-push.yml b/.github/workflows/bsr-push.yml index 7186efb999..52acd22de4 100644 --- a/.github/workflows/bsr-push.yml +++ b/.github/workflows/bsr-push.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: bufbuild/buf-setup-action@v1.31.0 + - uses: bufbuild/buf-setup-action@v1.32.0 # Push Evmos protos to the Buf Schema Registry - uses: bufbuild/buf-push-action@v1.2.0 with: diff --git a/.github/workflows/proto.yml b/.github/workflows/proto.yml index 50e700f1cc..961161f9c3 100644 --- a/.github/workflows/proto.yml +++ b/.github/workflows/proto.yml @@ -32,7 +32,7 @@ jobs: timeout-minutes: 5 steps: - uses: actions/checkout@v4 - - uses: bufbuild/buf-setup-action@v1.31.0 + - uses: bufbuild/buf-setup-action@v1.32.0 - uses: bufbuild/buf-lint-action@v1 with: input: "proto" @@ -41,7 +41,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: bufbuild/buf-setup-action@v1.31.0 + - uses: bufbuild/buf-setup-action@v1.32.0 - uses: bufbuild/buf-breaking-action@v1 with: input: "proto" From e4ced05e0e01b236895ea3ad11de8c2077355106 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 May 2024 07:32:38 +0000 Subject: [PATCH 254/345] build(deps): bump cachix/install-nix-action from 26 to 27 (#2562) Bumps [cachix/install-nix-action](https://github.com/cachix/install-nix-action) from 26 to 27. - [Release notes](https://github.com/cachix/install-nix-action/releases) - [Commits](https://github.com/cachix/install-nix-action/compare/v26...V27) --- updated-dependencies: - dependency-name: cachix/install-nix-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> --- .github/workflows/e2e-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-test.yml b/.github/workflows/e2e-test.yml index 47f122f6e8..2f27735842 100644 --- a/.github/workflows/e2e-test.yml +++ b/.github/workflows/e2e-test.yml @@ -99,7 +99,7 @@ jobs: with: token: ${{ steps.token_check.outputs.token }} - name: Install Nix - uses: cachix/install-nix-action@v26 + uses: cachix/install-nix-action@V27 with: install_url: https://releases.nixos.org/nix/nix-2.13.3/install nix_path: nixpkgs=channel:nixos-22.11 From 599239842378a26a735bddad070c9c7274bdb418 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 23 May 2024 03:58:27 -0300 Subject: [PATCH 255/345] build(deps): bump cachix/cachix-action from 14 to 15 (#2566) --- updated-dependencies: - dependency-name: cachix/cachix-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/e2e-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-test.yml b/.github/workflows/e2e-test.yml index 2f27735842..5a0b01f76d 100644 --- a/.github/workflows/e2e-test.yml +++ b/.github/workflows/e2e-test.yml @@ -106,7 +106,7 @@ jobs: extra_nix_config: | access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} - name: Setup Cachix - uses: cachix/cachix-action@v14 + uses: cachix/cachix-action@v15 with: name: evmosd authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}" From 28be1e599d401bc3f802dd250946e9090daaa2d2 Mon Sep 17 00:00:00 2001 From: Luke Date: Thu, 23 May 2024 15:29:54 +0800 Subject: [PATCH 256/345] imp(staking): implement the EditValidator function for staking precompiled contract (#2051) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * imp(staking): implement the EditValidator function for staking precompiled contract * imp(staking): use [do-not-modify] instead of empty string for validator description to not change origin value * chore: make lint * imp(staking): update EditValidator * imp(staking): change ValidatorAddress string to address type for EditValidator * imp(staking): use the opposite value for readability * imp(staking): add commissionRate and minSelfDelegation check for negative numbers * imp(staking): import cosmossdk errors instead of cosmos-sdk errors * imp(staking): update commissionRate and minSelfDelegation check * imp(staking): update commissionRate check * imp(staking): update commissionRate and minSelfDelegation check * chore: add comment * chore: update debug info * fix: fix imports, events and types, format and lint * fix: solidity linter * chore: update comment * chore: update comment * add unit tests * add unit tests for event editValidator * make format * fix lint warnings * fix chlog * add more test cases * make format * address lint issues * chore: fix some comment * chore: fix some comment * chore: fix some comment * fix(test): fix a unit test for editValidator --------- Signed-off-by: Luke Co-authored-by: Vladislav Varadinov Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> Co-authored-by: tom Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- CHANGELOG.md | 1 + precompiles/common/errors.go | 2 +- precompiles/staking/StakingI.sol | 41 +++- precompiles/staking/abi.json | 86 ++++++++ precompiles/staking/errors.go | 2 + precompiles/staking/events.go | 43 +++- precompiles/staking/events_test.go | 70 +++++++ precompiles/staking/staking.go | 4 + precompiles/staking/tx.go | 45 ++++- precompiles/staking/tx_test.go | 307 +++++++++++++++++++++++++++++ precompiles/staking/types.go | 109 ++++++++-- precompiles/staking/utils_test.go | 2 +- 12 files changed, 684 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0cc86d5cec..5f697af5aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -56,6 +56,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (precompiles) [#2529](https://github.com/evmos/evmos/pull/2529) Remove Outposts precompiles. - (upgrade) [#2533](https://github.com/evmos/evmos/pull/2533) Add upgrade handler for v19. - (precompiles) [#2550](https://github.com/evmos/evmos/pull/2550) Update secp256r1 curve precompile bech32 address to its corresponding value. +- (staking) [#2051](https://github.com/evmos/evmos/pull/2051) Implement the `EditValidator` function for staking precompiled contract. - (evm) [#2373](https://github.com/evmos/evmos/pull/2373) Remove check on hardcoded ChainID identifier. ### Bug Fixes diff --git a/precompiles/common/errors.go b/precompiles/common/errors.go index d7cf66119c..cb5a91e77f 100644 --- a/precompiles/common/errors.go +++ b/precompiles/common/errors.go @@ -14,7 +14,7 @@ const ( ErrInvalidAmount = "invalid amount: %v" // ErrInvalidDelegator is raised when the delegator address is not valid. ErrInvalidDelegator = "invalid delegator address: %s" - // ErrInvalidValidator is raised when the Validator address is not valid. + // ErrInvalidValidator is raised when the validator address is not valid. ErrInvalidValidator = "invalid validator address: %s" // ErrInvalidDenom is raised when the denom is not valid. ErrInvalidDenom = "invalid denom: %s" diff --git a/precompiles/staking/StakingI.sol b/precompiles/staking/StakingI.sol index 6f74c9eacc..5ebe752c36 100644 --- a/precompiles/staking/StakingI.sol +++ b/precompiles/staking/StakingI.sol @@ -12,11 +12,18 @@ StakingI constant STAKING_CONTRACT = StakingI(STAKING_PRECOMPILE_ADDRESS); /// @dev Define all the available staking methods. string constant MSG_CREATE_VALIDATOR = "/cosmos.staking.v1beta1.MsgCreateValidator"; +string constant MSG_EDIT_VALIDATOR = "/cosmos.staking.v1beta1.MsgEditValidator"; string constant MSG_DELEGATE = "/cosmos.staking.v1beta1.MsgDelegate"; string constant MSG_UNDELEGATE = "/cosmos.staking.v1beta1.MsgUndelegate"; string constant MSG_REDELEGATE = "/cosmos.staking.v1beta1.MsgBeginRedelegate"; string constant MSG_CANCEL_UNDELEGATION = "/cosmos.staking.v1beta1.MsgCancelUnbondingDelegation"; +/// @dev Constant used in flags to indicate that commission rate field should not be updated +int256 constant DO_NOT_MODIFY_COMMISSION_RATE = -1; + +/// @dev Constant used in flags to indicate that min self delegation field should not be updated +int256 constant DO_NOT_MODIFY_MIN_SELF_DELEGATION = -1; + /// @dev Defines the initial description to be used for creating /// a validator. struct Description { @@ -41,7 +48,6 @@ struct Commission { uint256 updateTime; } - /// @dev Represents a validator in the staking module. struct Validator { string operatorAddress; @@ -142,6 +148,21 @@ interface StakingI is authorization.AuthorizationI { uint256 value ) external returns (bool success); + /// @dev Defines a method for edit a validator. + /// @param description Description parameter to be updated. Use the string "[do-not-modify]" + /// as the value of fields that should not be updated. + /// @param commissionRate CommissionRate parameter to be updated. + /// Use commissionRate = -1 to keep the current value and not update it. + /// @param minSelfDelegation MinSelfDelegation parameter to be updated. + /// Use minSelfDelegation = -1 to keep the current value and not update it. + /// @return success Whether or not edit validator was successful. + function editValidator( + Description calldata description, + address validatorAddress, + int256 commissionRate, + int256 minSelfDelegation + ) external returns (bool success); + /// @dev Defines a method for performing a delegation of coins from a delegator to a validator. /// @param delegatorAddress The address of the delegator /// @param validatorAddress The address of the validator @@ -210,7 +231,10 @@ interface StakingI is authorization.AuthorizationI { function unbondingDelegation( address delegatorAddress, string memory validatorAddress - ) external view returns (UnbondingDelegationOutput calldata unbondingDelegation); + ) + external + view + returns (UnbondingDelegationOutput calldata unbondingDelegation); /// @dev Queries validator info for a given validator address. /// @param validatorAddress The address of the validator. @@ -237,7 +261,7 @@ interface StakingI is authorization.AuthorizationI { /// @param delegatorAddress The address of the delegator. /// @param srcValidatorAddress Defines the validator address to redelegate from. /// @param dstValidatorAddress Defines the validator address to redelegate to. - /// @return redelegation The active redelegations for the given delegator, source and destination + /// @return redelegation The active redelegations for the given delegator, source and destination /// validator combination. function redelegation( address delegatorAddress, @@ -270,9 +294,16 @@ interface StakingI is authorization.AuthorizationI { /// @dev CreateValidator defines an Event emitted when a create a new validator. /// @param validatorAddress The address of the validator /// @param value The amount of coin being self delegated - event CreateValidator( + event CreateValidator(address indexed validatorAddress, uint256 value); + + /// @dev EditValidator defines an Event emitted when edit a validator. + /// @param validatorAddress The address of the validator. + /// @param commissionRate The commission rate. + /// @param minSelfDelegation The min self delegation. + event EditValidator( address indexed validatorAddress, - uint256 value + int256 commissionRate, + int256 minSelfDelegation ); /// @dev Delegate defines an Event emitted when a given amount of tokens are delegated from the diff --git a/precompiles/staking/abi.json b/precompiles/staking/abi.json index c35c79a947..dc8cc8bd01 100644 --- a/precompiles/staking/abi.json +++ b/precompiles/staking/abi.json @@ -142,6 +142,31 @@ "name": "Delegate", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "validatorAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "int256", + "name": "commissionRate", + "type": "int256" + }, + { + "indexed": false, + "internalType": "int256", + "name": "minSelfDelegation", + "type": "int256" + } + ], + "name": "EditValidator", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -514,6 +539,67 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "components": [ + { + "internalType": "string", + "name": "moniker", + "type": "string" + }, + { + "internalType": "string", + "name": "identity", + "type": "string" + }, + { + "internalType": "string", + "name": "website", + "type": "string" + }, + { + "internalType": "string", + "name": "securityContact", + "type": "string" + }, + { + "internalType": "string", + "name": "details", + "type": "string" + } + ], + "internalType": "struct Description", + "name": "description", + "type": "tuple" + }, + { + "internalType": "address", + "name": "validatorAddress", + "type": "address" + }, + { + "internalType": "int256", + "name": "commissionRate", + "type": "int256" + }, + { + "internalType": "int256", + "name": "minSelfDelegation", + "type": "int256" + } + ], + "name": "editValidator", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { diff --git a/precompiles/staking/errors.go b/precompiles/staking/errors.go index e427b4865f..22cadd6c6d 100644 --- a/precompiles/staking/errors.go +++ b/precompiles/staking/errors.go @@ -10,4 +10,6 @@ const ( ErrDifferentOriginFromDelegator = "origin address %s is not the same as delegator address %s" // ErrNoDelegationFound is raised when no delegation is found for the given delegator and validator addresses. ErrNoDelegationFound = "delegation with delegator %s not found for validator %s" + // ErrDifferentOriginFromValidator is raised when the origin address is not the same as the validator address. + ErrDifferentOriginFromValidator = "origin address %s is not the same as validator operator address %s" ) diff --git a/precompiles/staking/events.go b/precompiles/staking/events.go index 1dd5edb904..626323862d 100644 --- a/precompiles/staking/events.go +++ b/precompiles/staking/events.go @@ -22,6 +22,8 @@ import ( const ( // EventTypeCreateValidator defines the event type for the staking CreateValidator transaction. EventTypeCreateValidator = "CreateValidator" + // EventTypeEditValidator defines the event type for the staking EditValidator transaction. + EventTypeEditValidator = "EditValidator" // EventTypeDelegate defines the event type for the staking Delegate transaction. EventTypeDelegate = "Delegate" // EventTypeUnbond defines the event type for the staking Undelegate transaction. @@ -129,7 +131,7 @@ func (p Precompile) EmitCreateValidatorEvent(ctx sdk.Context, stateDB vm.StateDB // Prepare the event topics event := p.ABI.Events[EventTypeCreateValidator] - topics, err := p.createValidatorTxTopics(2, event, validatorAddr) + topics, err := p.createEditValidatorTxTopics(2, event, validatorAddr) if err != nil { return err } @@ -148,6 +150,41 @@ func (p Precompile) EmitCreateValidatorEvent(ctx sdk.Context, stateDB vm.StateDB return nil } +// EmitEditValidatorEvent creates a new edit validator event emitted on a EditValidator transaction. +func (p Precompile) EmitEditValidatorEvent(ctx sdk.Context, stateDB vm.StateDB, msg *stakingtypes.MsgEditValidator, validatorAddr common.Address) error { + // Prepare the event topics + event := p.ABI.Events[EventTypeEditValidator] + + topics, err := p.createEditValidatorTxTopics(2, event, validatorAddr) + if err != nil { + return err + } + + commissionRate := big.NewInt(DoNotModifyCommissionRate) + if msg.CommissionRate != nil { + commissionRate = msg.CommissionRate.BigInt() + } + + minSelfDelegation := big.NewInt(DoNotModifyMinSelfDelegation) + if msg.MinSelfDelegation != nil { + minSelfDelegation = msg.MinSelfDelegation.BigInt() + } + + // Prepare the event data + var b bytes.Buffer + b.Write(cmn.PackNum(reflect.ValueOf(commissionRate))) + b.Write(cmn.PackNum(reflect.ValueOf(minSelfDelegation))) + + stateDB.AddLog(ðtypes.Log{ + Address: p.Address(), + Topics: topics, + Data: b.Bytes(), + BlockNumber: uint64(ctx.BlockHeight()), + }) + + return nil +} + // EmitDelegateEvent creates a new delegate event emitted on a Delegate transaction. func (p Precompile) EmitDelegateEvent(ctx sdk.Context, stateDB vm.StateDB, msg *stakingtypes.MsgDelegate, delegatorAddr common.Address) error { valAddr, err := sdk.ValAddressFromBech32(msg.ValidatorAddress) @@ -307,8 +344,8 @@ func (p Precompile) createStakingTxTopics(topicsLen uint64, event abi.Event, del return topics, nil } -// createValidatorTxTopics creates the topics for staking transaction CreateValidator. -func (p Precompile) createValidatorTxTopics(topicsLen uint64, event abi.Event, validatorAddr common.Address) ([]common.Hash, error) { +// createEditValidatorTxTopics creates the topics for staking transactions CreateValidator and EditValidator. +func (p Precompile) createEditValidatorTxTopics(topicsLen uint64, event abi.Event, validatorAddr common.Address) ([]common.Hash, error) { topics := make([]common.Hash, topicsLen) // NOTE: If your solidity event contains indexed event types, then they become a topic rather than part of the data property of the log. // In solidity you may only have up to 4 topics but only 3 indexed event types. The first topic is always the signature of the event. diff --git a/precompiles/staking/events_test.go b/precompiles/staking/events_test.go index 59342b77e4..fb2b3c8ec7 100644 --- a/precompiles/staking/events_test.go +++ b/precompiles/staking/events_test.go @@ -299,6 +299,76 @@ func (s *PrecompileTestSuite) TestCreateValidatorEvent() { } } +func (s *PrecompileTestSuite) TestEditValidatorEvent() { + var ( + valOperAddr common.Address + method = s.precompile.Methods[staking.EditValidatorMethod] + minSelfDel = big.NewInt(11) + commRate = math.LegacyNewDecWithPrec(5, 2).BigInt() + ) + testCases := []struct { + name string + malleate func() []interface{} + expErr bool + errContains string + postCheck func() + }{ + { + name: "success - the correct event is emitted", + malleate: func() []interface{} { + return []interface{}{ + staking.Description{ + Moniker: "node0-edited", + Identity: "", + Website: "", + SecurityContact: "", + Details: "", + }, + valOperAddr, + commRate, + minSelfDel, + } + }, + postCheck: func() { + s.Require().Equal(len(s.stateDB.Logs()), 1) + log := s.stateDB.Logs()[0] + s.Require().Equal(log.Address, s.precompile.Address()) + + // Check event signature matches the one emitted + event := s.precompile.ABI.Events[staking.EventTypeEditValidator] + s.Require().Equal(crypto.Keccak256Hash([]byte(event.Sig)), common.HexToHash(log.Topics[0].Hex())) + s.Require().Equal(log.BlockNumber, uint64(s.ctx.BlockHeight())) + + // Check the fully unpacked event matches the one emitted + var editValidatorEvent staking.EventEditValidator + err := cmn.UnpackLog(s.precompile.ABI, &editValidatorEvent, staking.EventTypeEditValidator, *log) + s.Require().NoError(err) + s.Require().Equal(valOperAddr, editValidatorEvent.ValidatorAddress) + s.Require().Equal(minSelfDel, editValidatorEvent.MinSelfDelegation) + s.Require().Equal(commRate, editValidatorEvent.CommissionRate) + }, + }, + } + + for _, tc := range testCases { + s.Run(tc.name, func() { + s.SetupTest() // reset + valOperAddr = common.BytesToAddress(s.validators[0].GetOperator().Bytes()) + + contract := vm.NewContract(vm.AccountRef(valOperAddr), s.precompile, big.NewInt(0), 200000) + _, err := s.precompile.EditValidator(s.ctx, valOperAddr, contract, s.stateDB, &method, tc.malleate()) + + if tc.expErr { + s.Require().Error(err) + s.Require().Contains(err.Error(), tc.errContains) + } else { + s.Require().NoError(err) + tc.postCheck() + } + }) + } +} + func (s *PrecompileTestSuite) TestDelegateEvent() { var ( delegationAmt = big.NewInt(1500000000000000000) diff --git a/precompiles/staking/staking.go b/precompiles/staking/staking.go index 5eb18cccf5..2cdf64fb13 100644 --- a/precompiles/staking/staking.go +++ b/precompiles/staking/staking.go @@ -111,6 +111,8 @@ func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, readOnly bool) (bz [ // Staking transactions case CreateValidatorMethod: bz, err = p.CreateValidator(ctx, evm.Origin, contract, stateDB, method, args) + case EditValidatorMethod: + bz, err = p.EditValidator(ctx, evm.Origin, contract, stateDB, method, args) case DelegateMethod: bz, err = p.Delegate(ctx, evm.Origin, contract, stateDB, method, args) case UndelegateMethod: @@ -154,6 +156,7 @@ func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, readOnly bool) (bz [ // // Available staking transactions are: // - CreateValidator +// - EditValidator // - Delegate // - Undelegate // - Redelegate @@ -167,6 +170,7 @@ func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, readOnly bool) (bz [ func (Precompile) IsTransaction(method string) bool { switch method { case CreateValidatorMethod, + EditValidatorMethod, DelegateMethod, UndelegateMethod, RedelegateMethod, diff --git a/precompiles/staking/tx.go b/precompiles/staking/tx.go index 5545c8a443..ccaae2a8a0 100644 --- a/precompiles/staking/tx.go +++ b/precompiles/staking/tx.go @@ -20,6 +20,8 @@ import ( const ( // CreateValidatorMethod defines the ABI method name for the staking create validator transaction CreateValidatorMethod = "createValidator" + // EditValidatorMethod defines the ABI method name for the staking edit validator transaction + EditValidatorMethod = "editValidator" // DelegateMethod defines the ABI method name for the staking Delegate // transaction. DelegateMethod = "delegate" @@ -80,7 +82,7 @@ func (p Precompile) CreateValidator( return nil, err } - // Emit the event for the delegate transaction + // Emit the event for the create validator transaction if err = p.EmitCreateValidatorEvent(ctx, stateDB, msg, validatorHexAddr); err != nil { return nil, err } @@ -88,6 +90,47 @@ func (p Precompile) CreateValidator( return method.Outputs.Pack(true) } +// EditValidator performs edit validator. +func (p Precompile) EditValidator( + ctx sdk.Context, + origin common.Address, + _ *vm.Contract, + stateDB vm.StateDB, + method *abi.Method, + args []interface{}, +) ([]byte, error) { + msg, validatorHexAddr, err := NewMsgEditValidator(args) + if err != nil { + return nil, err + } + + p.Logger(ctx).Debug( + "tx called", + "method", method.Name, + "validator_address", msg.ValidatorAddress, + "commission_rate", msg.CommissionRate, + "min_self_delegation", msg.MinSelfDelegation, + ) + + // we only allow the tx signer "origin" to edit their own validator. + if origin != validatorHexAddr { + return nil, fmt.Errorf(ErrDifferentOriginFromValidator, origin.String(), validatorHexAddr.String()) + } + + // Execute the transaction using the message server + msgSrv := stakingkeeper.NewMsgServerImpl(&p.stakingKeeper) + if _, err = msgSrv.EditValidator(sdk.WrapSDKContext(ctx), msg); err != nil { + return nil, err + } + + // Emit the event for the edit validator transaction + if err = p.EmitEditValidatorEvent(ctx, stateDB, msg, validatorHexAddr); err != nil { + return nil, err + } + + return method.Outputs.Pack(true) +} + // Delegate performs a delegation of coins from a delegator to a validator. func (p Precompile) Delegate( ctx sdk.Context, diff --git a/precompiles/staking/tx_test.go b/precompiles/staking/tx_test.go index 2b42f63ccf..446042c5a9 100644 --- a/precompiles/staking/tx_test.go +++ b/precompiles/staking/tx_test.go @@ -297,6 +297,313 @@ func (s *PrecompileTestSuite) TestCreateValidator() { } } +func (s *PrecompileTestSuite) TestEditValidator() { + var ( + validatorAddress geth.Address + commissionRate *big.Int + minSelfDelegation *big.Int + method = s.precompile.Methods[staking.EditValidatorMethod] + description = staking.Description{ + Moniker: "node0-edited", + Identity: "", + Website: "", + SecurityContact: "", + Details: "", + } + ) + + testCases := []struct { + name string + malleate func() []interface{} + gas uint64 + postCheck func(data []byte) + expError bool + errContains string + }{ + { + "fail - empty input args", + func() []interface{} { + return []interface{}{} + }, + 200000, + func([]byte) {}, + true, + fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 4, 0), + }, + { + "fail - different origin than delegator", + func() []interface{} { + differentAddr := evmosutiltx.GenerateAddress() + return []interface{}{ + description, + differentAddr, + commissionRate, + minSelfDelegation, + } + }, + 200000, + func([]byte) {}, + true, + "is not the same as validator operator address", + }, + { + "fail - invalid description", + func() []interface{} { + return []interface{}{ + "", + validatorAddress, + commissionRate, + minSelfDelegation, + } + }, + 200000, + func([]byte) {}, + true, + "invalid description", + }, + { + "fail - invalid commission rate", + func() []interface{} { + return []interface{}{ + description, + validatorAddress, + "", + minSelfDelegation, + } + }, + 200000, + func([]byte) {}, + true, + "invalid type for commissionRate", + }, + { + "fail - invalid min self delegation", + func() []interface{} { + return []interface{}{ + description, + validatorAddress, + commissionRate, + "", + } + }, + 200000, + func([]byte) {}, + true, + "invalid type for minSelfDelegation", + }, + { + "fail - invalid validator address", + func() []interface{} { + return []interface{}{ + description, + 1205, + commissionRate, + minSelfDelegation, + } + }, + 200000, + func([]byte) {}, + true, + "invalid validator address", + }, + { + "fail - commission change rate too high", + func() []interface{} { + return []interface{}{ + description, + validatorAddress, + math.LegacyNewDecWithPrec(7, 2).BigInt(), + minSelfDelegation, + } + }, + 200000, + func([]byte) {}, + true, + "commission cannot be changed more than max change rate", + }, + { + "fail - negative commission rate", + func() []interface{} { + return []interface{}{ + description, + validatorAddress, + math.LegacyNewDecWithPrec(-5, 2).BigInt(), + minSelfDelegation, + } + }, + 200000, + func([]byte) {}, + true, + "commission rate must be between 0 and 1 (inclusive)", + }, + { + "fail - negative min self delegation", + func() []interface{} { + return []interface{}{ + description, + validatorAddress, + commissionRate, + math.LegacyNewDecWithPrec(-5, 2).BigInt(), + } + }, + 200000, + func([]byte) {}, + true, + "minimum self delegation must be a positive integer", + }, + { + "success", + func() []interface{} { + return []interface{}{ + description, + validatorAddress, + commissionRate, + minSelfDelegation, + } + }, + 200000, + func(data []byte) { + success, err := s.precompile.Unpack(staking.EditValidatorMethod, data) + s.Require().NoError(err) + s.Require().Equal(success[0], true) + + log := s.stateDB.Logs()[0] + s.Require().Equal(log.Address, s.precompile.Address()) + + // Check event signature matches the one emitted + event := s.precompile.ABI.Events[staking.EventTypeEditValidator] + s.Require().Equal(crypto.Keccak256Hash([]byte(event.Sig)), geth.HexToHash(log.Topics[0].Hex())) + s.Require().Equal(log.BlockNumber, uint64(s.ctx.BlockHeight())) + + // Check the fully unpacked event matches the one emitted + var editValidatorEvent staking.EventEditValidator + err = cmn.UnpackLog(s.precompile.ABI, &editValidatorEvent, staking.EventTypeEditValidator, *log) + s.Require().NoError(err) + s.Require().Equal(validatorAddress, editValidatorEvent.ValidatorAddress) + s.Require().Equal(commissionRate, editValidatorEvent.CommissionRate) + s.Require().Equal(minSelfDelegation, editValidatorEvent.MinSelfDelegation) + }, + false, + "", + }, + { + "success - should not update commission rate", + func() []interface{} { + // expected commission rate is the previous one (0) + commissionRate = math.LegacyZeroDec().BigInt() + return []interface{}{ + description, + validatorAddress, + big.NewInt(-1), + minSelfDelegation, + } + }, + 200000, + func(data []byte) { //nolint:dupl + success, err := s.precompile.Unpack(staking.EditValidatorMethod, data) + s.Require().NoError(err) + s.Require().Equal(success[0], true) + + log := s.stateDB.Logs()[0] + s.Require().Equal(log.Address, s.precompile.Address()) + + // Check event signature matches the one emitted + event := s.precompile.ABI.Events[staking.EventTypeEditValidator] + s.Require().Equal(crypto.Keccak256Hash([]byte(event.Sig)), geth.HexToHash(log.Topics[0].Hex())) + s.Require().Equal(log.BlockNumber, uint64(s.ctx.BlockHeight())) + + // Check the fully unpacked event matches the one emitted + var editValidatorEvent staking.EventEditValidator + err = cmn.UnpackLog(s.precompile.ABI, &editValidatorEvent, staking.EventTypeEditValidator, *log) + s.Require().NoError(err) + s.Require().Equal(validatorAddress, editValidatorEvent.ValidatorAddress) + }, + false, + "", + }, + { + "success - should not update minimum self delegation", + func() []interface{} { + // expected min self delegation is the previous one (0) + minSelfDelegation = math.LegacyZeroDec().BigInt() + return []interface{}{ + description, + validatorAddress, + commissionRate, + big.NewInt(-1), + } + }, + 200000, + func(data []byte) { //nolint:dupl + success, err := s.precompile.Unpack(staking.EditValidatorMethod, data) + s.Require().NoError(err) + s.Require().Equal(success[0], true) + + log := s.stateDB.Logs()[0] + s.Require().Equal(log.Address, s.precompile.Address()) + + // Check event signature matches the one emitted + event := s.precompile.ABI.Events[staking.EventTypeEditValidator] + s.Require().Equal(crypto.Keccak256Hash([]byte(event.Sig)), geth.HexToHash(log.Topics[0].Hex())) + s.Require().Equal(log.BlockNumber, uint64(s.ctx.BlockHeight())) + + // Check the fully unpacked event matches the one emitted + var editValidatorEvent staking.EventEditValidator + err = cmn.UnpackLog(s.precompile.ABI, &editValidatorEvent, staking.EventTypeEditValidator, *log) + s.Require().NoError(err) + s.Require().Equal(validatorAddress, editValidatorEvent.ValidatorAddress) + }, + false, + "", + }, + } + + for _, tc := range testCases { + s.Run(tc.name, func() { + s.SetupTest() + commissionRate = math.LegacyNewDecWithPrec(5, 2).BigInt() + minSelfDelegation = big.NewInt(11) + + // reset sender + validatorAddress = geth.BytesToAddress(s.validators[0].GetOperator().Bytes()) + + var contract *vm.Contract + contract, s.ctx = testutil.NewPrecompileContract(s.T(), s.ctx, s.address, s.precompile, tc.gas) + + bz, err := s.precompile.EditValidator(s.ctx, validatorAddress, contract, s.stateDB, &method, tc.malleate()) + + // query the validator in the staking keeper + validator := s.app.StakingKeeper.Validator(s.ctx, validatorAddress.Bytes()) + if tc.expError { + s.Require().ErrorContains(err, tc.errContains) + s.Require().Empty(bz) + } else { + s.Require().NoError(err) + s.Require().NotNil(validator, "expected validator not to be nil") + tc.postCheck(bz) + + isBonded := validator.IsBonded() + s.Require().Equal(true, isBonded, "expected validator bonded to be %t; got %t", true, isBonded) + + operator := validator.GetOperator().String() + s.Require().Equal(sdk.ValAddress(validatorAddress.Bytes()).String(), operator, "expected validator operator to be %s; got %s", validatorAddress, operator) + + updatedCommRate := validator.GetCommission() + s.Require().Equal(commissionRate.String(), updatedCommRate.BigInt().String(), "expected validator commission rate to be %s; got %s", commissionRate.String(), commissionRate.String()) + + valMinSelfDelegation := validator.GetMinSelfDelegation() + s.Require().Equal(minSelfDelegation.String(), valMinSelfDelegation.String(), "expected validator min self delegation to be %s; got %s", minSelfDelegation.String(), valMinSelfDelegation.String()) + + moniker := validator.GetMoniker() + s.Require().Equal(description.Moniker, moniker, "expected validator moniker to be %s; got %s", description.Moniker, moniker) + + jailed := validator.IsJailed() + s.Require().Equal(false, jailed, "expected validator jailed to be %t; got %t", false, jailed) + } + }) + } +} + func (s *PrecompileTestSuite) TestDelegate() { method := s.precompile.Methods[staking.DelegateMethod] diff --git a/precompiles/staking/types.go b/precompiles/staking/types.go index cb19805b05..285c685dc8 100644 --- a/precompiles/staking/types.go +++ b/precompiles/staking/types.go @@ -22,12 +22,26 @@ import ( cmn "github.com/evmos/evmos/v18/precompiles/common" ) +const ( + // DoNotModifyCommissionRate constant used in flags to indicate that commission rate field should not be updated + DoNotModifyCommissionRate = -1 + // DoNotModifyMinSelfDelegation constant used in flags to indicate that min self delegation field should not be updated + DoNotModifyMinSelfDelegation = -1 +) + // EventCreateValidator defines the event data for the staking CreateValidator transaction. type EventCreateValidator struct { ValidatorAddress common.Address Value *big.Int } +// EventEditValidator defines the event data for the staking EditValidator transaction. +type EventEditValidator struct { + ValidatorAddress common.Address + CommissionRate *big.Int + MinSelfDelegation *big.Int +} + // EventDelegate defines the event data for the staking Delegate transaction. type EventDelegate struct { DelegatorAddress common.Address @@ -85,23 +99,13 @@ func NewMsgCreateValidator(args []interface{}, denom string) (*stakingtypes.MsgC return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 6, len(args)) } - description := stakingtypes.Description{} - if descriptionInput, ok := args[0].(Description); ok { - description.Moniker = descriptionInput.Moniker - description.Identity = descriptionInput.Identity - description.Website = descriptionInput.Website - description.SecurityContact = descriptionInput.SecurityContact - description.Details = descriptionInput.Details - } else { + description, ok := args[0].(Description) + if !ok { return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidDescription, args[0]) } - commission := stakingtypes.CommissionRates{} - if commissionInput, ok := args[1].(Commission); ok { - commission.Rate = math.LegacyNewDecFromBigIntWithPrec(commissionInput.Rate, math.LegacyPrecision) - commission.MaxRate = math.LegacyNewDecFromBigIntWithPrec(commissionInput.MaxRate, math.LegacyPrecision) - commission.MaxChangeRate = math.LegacyNewDecFromBigIntWithPrec(commissionInput.MaxChangeRate, math.LegacyPrecision) - } else { + commission, ok := args[1].(Commission) + if !ok { return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidCommission, args[1]) } @@ -142,9 +146,19 @@ func NewMsgCreateValidator(args []interface{}, denom string) (*stakingtypes.MsgC } msg := &stakingtypes.MsgCreateValidator{ - Description: description, - Commission: commission, - MinSelfDelegation: math.NewIntFromBigInt(minSelfDelegation), + Description: stakingtypes.Description{ + Moniker: description.Moniker, + Identity: description.Identity, + Website: description.Website, + SecurityContact: description.SecurityContact, + Details: description.Details, + }, + Commission: stakingtypes.CommissionRates{ + Rate: sdk.NewDecFromBigIntWithPrec(commission.Rate, sdk.Precision), + MaxRate: sdk.NewDecFromBigIntWithPrec(commission.Rate, sdk.Precision), + MaxChangeRate: sdk.NewDecFromBigIntWithPrec(commission.Rate, sdk.Precision), + }, + MinSelfDelegation: sdk.NewIntFromBigInt(minSelfDelegation), DelegatorAddress: sdk.AccAddress(validatorAddress.Bytes()).String(), ValidatorAddress: sdk.ValAddress(validatorAddress.Bytes()).String(), Pubkey: pubkey, @@ -158,6 +172,67 @@ func NewMsgCreateValidator(args []interface{}, denom string) (*stakingtypes.MsgC return msg, validatorAddress, nil } +// NewMsgEditValidator creates a new MsgEditValidator instance and does sanity checks +// on the given arguments before populating the message. +func NewMsgEditValidator(args []interface{}) (*stakingtypes.MsgEditValidator, common.Address, error) { + if len(args) != 4 { + return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 4, len(args)) + } + + description, ok := args[0].(Description) + if !ok { + return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidDescription, args[0]) + } + + validatorHexAddr, ok := args[1].(common.Address) + if !ok || validatorHexAddr == (common.Address{}) { + return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidValidator, args[1]) + } + + commissionRateBigInt, ok := args[2].(*big.Int) + if !ok { + return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidType, "commissionRate", &big.Int{}, args[2]) + } + + // The default value of a variable declared using a pointer is nil, indicating that the user does not want to modify its value. + // If the value passed in by the user is not DoNotModifyCommissionRate, which is -1, it means that the user wants to modify its value. + var commissionRate *math.LegacyDec + if commissionRateBigInt.Cmp(big.NewInt(DoNotModifyCommissionRate)) != 0 { + cr := sdk.NewDecFromBigIntWithPrec(commissionRateBigInt, sdk.Precision) + commissionRate = &cr + } + + minSelfDelegationBigInt, ok := args[3].(*big.Int) + if !ok { + return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidType, "minSelfDelegation", &big.Int{}, args[3]) + } + + var minSelfDelegation *math.Int + if minSelfDelegationBigInt.Cmp(big.NewInt(DoNotModifyMinSelfDelegation)) != 0 { + msd := math.NewIntFromBigInt(minSelfDelegationBigInt) + minSelfDelegation = &msd + } + + msg := &stakingtypes.MsgEditValidator{ + Description: stakingtypes.Description{ + Moniker: description.Moniker, + Identity: description.Identity, + Website: description.Website, + SecurityContact: description.SecurityContact, + Details: description.Details, + }, + ValidatorAddress: sdk.ValAddress(validatorHexAddr.Bytes()).String(), + CommissionRate: commissionRate, + MinSelfDelegation: minSelfDelegation, + } + + if err := msg.ValidateBasic(); err != nil { + return nil, common.Address{}, err + } + + return msg, validatorHexAddr, nil +} + // NewMsgDelegate creates a new MsgDelegate instance and does sanity checks // on the given arguments before populating the message. func NewMsgDelegate(args []interface{}, denom string) (*stakingtypes.MsgDelegate, common.Address, error) { diff --git a/precompiles/staking/utils_test.go b/precompiles/staking/utils_test.go index 32dcc4c434..dafebbb836 100644 --- a/precompiles/staking/utils_test.go +++ b/precompiles/staking/utils_test.go @@ -81,7 +81,7 @@ func (s *PrecompileTestSuite) SetupWithGenesisValSet(valSet *tmtypes.ValidatorSe Description: stakingtypes.Description{}, UnbondingHeight: int64(0), UnbondingTime: time.Unix(0, 0).UTC(), - Commission: stakingtypes.NewCommission(math.LegacyZeroDec(), math.LegacyZeroDec(), math.LegacyZeroDec()), + Commission: stakingtypes.NewCommission(math.LegacyZeroDec(), math.LegacyNewDecWithPrec(5, 1), math.LegacyNewDecWithPrec(5, 2)), MinSelfDelegation: math.ZeroInt(), } validators = append(validators, validator) From 6da862283b4e17805fb04f3090c96dbba69f7390 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 23 May 2024 09:20:23 +0000 Subject: [PATCH 257/345] build(deps): bump github.com/onsi/ginkgo/v2 from 2.17.3 to 2.18.0 (#2567) * --- updated-dependencies: - dependency-name: github.com/onsi/ginkgo/v2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * update gomod2nix.toml file --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- gomod2nix.toml | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index b848a33517..3a8f516b15 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,7 @@ require ( github.com/hashicorp/go-version v1.6.0 github.com/improbable-eng/grpc-web v0.15.0 github.com/linxGnu/grocksdb v1.8.14 - github.com/onsi/ginkgo/v2 v2.17.3 + github.com/onsi/ginkgo/v2 v2.18.0 github.com/onsi/gomega v1.33.1 github.com/ory/dockertest/v3 v3.10.0 github.com/pkg/errors v0.9.1 @@ -238,7 +238,7 @@ require ( golang.org/x/sys v0.20.0 // indirect golang.org/x/term v0.20.0 // indirect golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.20.0 // indirect + golang.org/x/tools v0.21.0 // indirect google.golang.org/api v0.162.0 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect diff --git a/go.sum b/go.sum index f42f1ae694..8e32bc6195 100644 --- a/go.sum +++ b/go.sum @@ -936,8 +936,8 @@ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108 github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo/v2 v2.17.3 h1:oJcvKpIb7/8uLpDDtnQuf18xVnwKp8DTD7DQ6gTd/MU= -github.com/onsi/ginkgo/v2 v2.17.3/go.mod h1:nP2DPOQoNsQmsVyv5rDA8JkXQoCs6goXIvr/PRJ1eCc= +github.com/onsi/ginkgo/v2 v2.18.0 h1:W9Y7IWXxPUpAit9ieMOLI7PJZGaW22DTKgiVAuhDTLc= +github.com/onsi/ginkgo/v2 v2.18.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= @@ -1582,8 +1582,8 @@ golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.20.0 h1:hz/CVckiOxybQvFw6h7b/q80NTr9IUQb4s1IIzW7KNY= -golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg= +golang.org/x/tools v0.21.0 h1:qc0xYgIbsSDt9EyWz05J5wfa7LOVW0YTLOXrqdLAWIw= +golang.org/x/tools v0.21.0/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/gomod2nix.toml b/gomod2nix.toml index f1a3d522fa..049132ad3f 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -480,8 +480,8 @@ schema = 3 version = "v0.0.5" hash = "sha256-/5i70IkH/qSW5KjGzv8aQNKh9tHoz98tqtL0K2DMFn4=" [mod."github.com/onsi/ginkgo/v2"] - version = "v2.17.3" - hash = "sha256-HKRJMYAVSVgCrLWMAMU6qqEG4K8+bwwdkzL8FGIyRS8=" + version = "v2.18.0" + hash = "sha256-6wjy0DXUPg/SFtfTrh32cl/Cnbd7zd16WHTglgvBnXs=" [mod."github.com/onsi/gomega"] version = "v1.33.1" hash = "sha256-oYfRaN1xqngIHQQxEEc+FQZ6UHC99VZQzAePT0Xkz8s=" @@ -691,8 +691,8 @@ schema = 3 version = "v0.5.0" hash = "sha256-W6RgwgdYTO3byIPOFxrP2IpAZdgaGowAaVfYby7AULU=" [mod."golang.org/x/tools"] - version = "v0.20.0" - hash = "sha256-g5T5FrNPO/cf2W1lc+/93FcFB3HftPjqI72FueD9Wt8=" + version = "v0.21.0" + hash = "sha256-TU0gAxUX410AYc/nMxxZiaqXeORih1cXbKh3sxKufVg=" [mod."google.golang.org/api"] version = "v0.162.0" hash = "sha256-+AsT4DPjefEmPPelZoSHuQ8nCHhmhhUWU4UGnJ/8+fg=" From 696c42bbbb5335bc33568ea1ca952df863b4a023 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 23 May 2024 09:30:03 +0000 Subject: [PATCH 258/345] build(deps): bump bufbuild/buf-setup-action from 1.32.0 to 1.32.1 (#2568) --- updated-dependencies: - dependency-name: bufbuild/buf-setup-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/bsr-push.yml | 2 +- .github/workflows/proto.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/bsr-push.yml b/.github/workflows/bsr-push.yml index 52acd22de4..cb007fb41b 100644 --- a/.github/workflows/bsr-push.yml +++ b/.github/workflows/bsr-push.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: bufbuild/buf-setup-action@v1.32.0 + - uses: bufbuild/buf-setup-action@v1.32.1 # Push Evmos protos to the Buf Schema Registry - uses: bufbuild/buf-push-action@v1.2.0 with: diff --git a/.github/workflows/proto.yml b/.github/workflows/proto.yml index 961161f9c3..16cb2bd8e2 100644 --- a/.github/workflows/proto.yml +++ b/.github/workflows/proto.yml @@ -32,7 +32,7 @@ jobs: timeout-minutes: 5 steps: - uses: actions/checkout@v4 - - uses: bufbuild/buf-setup-action@v1.32.0 + - uses: bufbuild/buf-setup-action@v1.32.1 - uses: bufbuild/buf-lint-action@v1 with: input: "proto" @@ -41,7 +41,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: bufbuild/buf-setup-action@v1.32.0 + - uses: bufbuild/buf-setup-action@v1.32.1 - uses: bufbuild/buf-breaking-action@v1 with: input: "proto" From 6afe636a980f80d717bf9d942f32f1eb0e3b557f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 23 May 2024 10:29:01 +0000 Subject: [PATCH 259/345] build(deps): bump google.golang.org/grpc from 1.63.2 to 1.64.0 (#2558) * build(deps): bump google.golang.org/grpc from 1.63.2 to 1.64.0 Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.63.2 to 1.64.0. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.63.2...v1.64.0) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * update gomod2nix.toml file --------- Signed-off-by: dependabot[bot] Signed-off-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- go.mod | 28 ++++++++++----------- go.sum | 67 ++++++++++++++++++++++++-------------------------- gomod2nix.toml | 56 ++++++++++++++++++++--------------------- 3 files changed, 74 insertions(+), 77 deletions(-) diff --git a/go.mod b/go.mod index 3a8f516b15..3edcc0e117 100644 --- a/go.mod +++ b/go.mod @@ -48,18 +48,18 @@ require ( golang.org/x/crypto v0.23.0 golang.org/x/net v0.25.0 golang.org/x/text v0.15.0 - google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de - google.golang.org/grpc v1.63.2 + google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237 + google.golang.org/grpc v1.64.0 google.golang.org/protobuf v1.34.1 sigs.k8s.io/yaml v1.4.0 ) require ( - cloud.google.com/go v0.112.0 // indirect - cloud.google.com/go/compute v1.24.0 // indirect + cloud.google.com/go v0.112.1 // indirect + cloud.google.com/go/compute v1.25.1 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect cloud.google.com/go/iam v1.1.6 // indirect - cloud.google.com/go/storage v1.36.0 // indirect + cloud.google.com/go/storage v1.38.0 // indirect cosmossdk.io/core v0.6.1 // indirect cosmossdk.io/depinject v1.0.0-alpha.4 // indirect cosmossdk.io/log v1.3.0 // indirect @@ -144,7 +144,7 @@ require ( github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/google/uuid v1.6.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect - github.com/googleapis/gax-go/v2 v2.12.0 // indirect + github.com/googleapis/gax-go/v2 v2.12.2 // indirect github.com/gorilla/handlers v1.5.1 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect @@ -226,23 +226,23 @@ require ( github.com/zbiljic/go-filelock v0.0.0-20170914061330-1dbf7103ab7d // indirect github.com/zondax/ledger-go v0.14.3 // indirect go.etcd.io/bbolt v1.4.0-alpha.0.0.20240404170359-43604f3112c5 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 // indirect - go.opentelemetry.io/otel v1.22.0 // indirect - go.opentelemetry.io/otel/metric v1.22.0 // indirect - go.opentelemetry.io/otel/trace v1.22.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect + go.opentelemetry.io/otel v1.24.0 // indirect + go.opentelemetry.io/otel/metric v1.24.0 // indirect + go.opentelemetry.io/otel/trace v1.24.0 // indirect golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb // indirect golang.org/x/mod v0.17.0 // indirect - golang.org/x/oauth2 v0.17.0 // indirect + golang.org/x/oauth2 v0.18.0 // indirect golang.org/x/sync v0.7.0 // indirect golang.org/x/sys v0.20.0 // indirect golang.org/x/term v0.20.0 // indirect golang.org/x/time v0.5.0 // indirect golang.org/x/tools v0.21.0 // indirect - google.golang.org/api v0.162.0 // indirect + google.golang.org/api v0.169.0 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index 8e32bc6195..653e1227f0 100644 --- a/go.sum +++ b/go.sum @@ -32,8 +32,8 @@ cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w9 cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.112.0 h1:tpFCD7hpHFlQ8yPwT3x+QeXqc2T6+n6T+hmABHfDUSM= -cloud.google.com/go v0.112.0/go.mod h1:3jEEVwZ/MHU4djK5t5RHuKOA/GbLddgTdVubX1qnPD4= +cloud.google.com/go v0.112.1 h1:uJSeirPke5UNZHIb4SxfZklVSiWWVqW4oXlETwZziwM= +cloud.google.com/go v0.112.1/go.mod h1:+Vbu+Y1UU+I1rjmzeMOb/8RfkKJK2Gyxi1X6jJCZLo4= cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= @@ -70,8 +70,8 @@ cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.24.0 h1:phWcR2eWzRJaL/kOiJwfFsPs4BaKq1j6vnpZrc1YlVg= -cloud.google.com/go/compute v1.24.0/go.mod h1:kw1/T+h/+tK2LJK0wiPPx1intgdAM3j/g3hFDlscY40= +cloud.google.com/go/compute v1.25.1 h1:ZRpHJedLtTpKgr3RV1Fx23NuaAEN1Zfx9hw1u4aJdjU= +cloud.google.com/go/compute v1.25.1/go.mod h1:oopOIR53ly6viBYxaDhBfJwzUAxf1zE//uf3IB011ls= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= @@ -174,8 +174,8 @@ cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3f cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cloud.google.com/go/storage v1.36.0 h1:P0mOkAcaJxhCTvAkMhxMfrTKiNcub4YmmPBtlhAyTr8= -cloud.google.com/go/storage v1.36.0/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= +cloud.google.com/go/storage v1.38.0 h1:Az68ZRGlnNTpIBbLjSMIV2BDcwwXYlRlQzis0llkpJg= +cloud.google.com/go/storage v1.38.0/go.mod h1:tlUADB0mAb9BgYls9lq+8MGkfzOXuLrnHXlpHmvFJoY= cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= @@ -339,8 +339,6 @@ github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa h1:jQCWAUqqlij9Pgj2i/PB79y4KOPYVyFYdROxgaCwdTQ= -github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM= github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= @@ -472,8 +470,6 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.m github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= -github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= github.com/evmos/cosmos-sdk v0.47.8-evmos h1:XOkJq3MeWDnTrNfDZk1bvCdrmjyyoxyL5gaTrguHPuA= github.com/evmos/cosmos-sdk v0.47.8-evmos/go.mod h1:VTAtthIsmfplanhFfUTfT6ED4F+kkJxT7nmvmKXRthI= github.com/evmos/go-ethereum v1.10.26-evmos-rc2 h1:tYghk1ZZ8X4/OQ4YI9hvtm8aSN8OSqO0g9vo/sCMdBo= @@ -695,8 +691,8 @@ github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99 github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= -github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= +github.com/googleapis/gax-go/v2 v2.12.2 h1:mhN09QQW1jEWeMF74zGR81R30z4VJzjZsfkUhuHF+DA= +github.com/googleapis/gax-go/v2 v2.12.2/go.mod h1:61M8vcyyXR2kqKFxKrfA22jaA8JGF7Dc8App1U3H6jc= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -1183,18 +1179,18 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0 h1:UNQQKPfTDe1J81ViolILjTKPr9WetKW6uei2hFgJmFs= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0/go.mod h1:r9vWsPS/3AQItv3OSlEJ/E4mbrhUbbw18meOjArPtKQ= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 h1:sv9kVfal0MK0wBMCOGr+HeJm9v803BkJxGrk2au7j08= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0/go.mod h1:SK2UL73Zy1quvRPonmOmRDiWk1KBV3LyIeeIxcEApWw= -go.opentelemetry.io/otel v1.22.0 h1:xS7Ku+7yTFvDfDraDIJVpw7XPyuHlB9MCiqqX5mcJ6Y= -go.opentelemetry.io/otel v1.22.0/go.mod h1:eoV4iAi3Ea8LkAEI9+GFT44O6T/D0GWAVFyZVCC6pMI= -go.opentelemetry.io/otel/metric v1.22.0 h1:lypMQnGyJYeuYPhOM/bgjbFM6WE44W1/T45er4d8Hhg= -go.opentelemetry.io/otel/metric v1.22.0/go.mod h1:evJGjVpZv0mQ5QBRJoBF64yMuOf4xCWdXjK8pzFvliY= -go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8= -go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= -go.opentelemetry.io/otel/trace v1.22.0 h1:Hg6pPujv0XG9QaVbGOBVHunyuLcCC3jN7WEhPx83XD0= -go.opentelemetry.io/otel/trace v1.22.0/go.mod h1:RbbHXVqKES9QhzZq/fE5UnOSILqRt40a21sPw2He1xo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 h1:4Pp6oUg3+e/6M4C0A/3kJ2VYa++dsWVTtGgLVj5xtHg= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= +go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= +go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= +go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= +go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= +go.opentelemetry.io/otel/sdk v1.22.0 h1:6coWHw9xw7EfClIC/+O31R8IY3/+EiRFHevmHafB2Gw= +go.opentelemetry.io/otel/sdk v1.22.0/go.mod h1:iu7luyVGYovrRpe2fmj3CVKouQNdTOkxtLzPvPz1DOc= +go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= +go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -1363,8 +1359,8 @@ golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= -golang.org/x/oauth2 v0.17.0 h1:6m3ZPmLEFdVxKKWnKq4VqZ60gutO35zm+zrAHVmHyDQ= -golang.org/x/oauth2 v0.17.0/go.mod h1:OzPDGQiuQMguemayvdylqddI7qcD9lnSDb+1FiwQ5HA= +golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= +golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1591,8 +1587,9 @@ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= @@ -1642,8 +1639,8 @@ google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.162.0 h1:Vhs54HkaEpkMBdgGdOT2P6F0csGG/vxDS0hWHJzmmps= -google.golang.org/api v0.162.0/go.mod h1:6SulDkfoBIg4NFmCuZ39XeeAgSHCPecfSUuDyYlAHs0= +google.golang.org/api v0.169.0 h1:QwWPy71FgMWqJN/l6jVlFHUa29a7dcUy02I8o799nPY= +google.golang.org/api v0.169.0/go.mod h1:gpNOiMA2tZ4mf5R9Iwf4rK/Dcz0fbdIgWYWVoxmsyLg= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1764,10 +1761,10 @@ google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY= google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo= -google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de h1:jFNzHPIeuzhdRwVhbZdiym9q0ory/xY3sA+v2wPg8I0= -google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de h1:cZGRis4/ot9uVm639a+rHCUaG0JJHEsdyzSQTMX+suY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:H4O17MA/PE9BsGx3w+a+W2VOLLD1Qf7oJneAoU6WktY= +google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237 h1:RFiFrvy37/mpSpdySBDrUdipW/dHwsRwh3J3+A9VgT4= +google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237/go.mod h1:Z5Iiy3jtmioajWHDGFk7CeugTyHtPvMHA4UTmUkyalE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -1809,8 +1806,8 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= -google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= +google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= +google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= diff --git a/gomod2nix.toml b/gomod2nix.toml index 049132ad3f..65fc6963ed 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -2,11 +2,11 @@ schema = 3 [mod] [mod."cloud.google.com/go"] - version = "v0.112.0" - hash = "sha256-lmNLoqmLURfxu+a6V/SeoP8xVn0Wi2SD7uxxAtSjm+o=" + version = "v0.112.1" + hash = "sha256-r2N7sr7XoAqi4aRdp/F1OJh6riZCpavsE1Yhl1Fc5ew=" [mod."cloud.google.com/go/compute"] - version = "v1.24.0" - hash = "sha256-icDjR0uxYeazRbhsBgl8Dx7z/oRZJ/iqK6CGjCtsaQQ=" + version = "v1.25.1" + hash = "sha256-A5Wiq8eKgolb81ZpAnoGaBNrTtHpDLLPFgXBJaKcnSA=" [mod."cloud.google.com/go/compute/metadata"] version = "v0.2.3" hash = "sha256-kYB1FTQRdTDqCqJzSU/jJYbVUGyxbkASUKbEs36FUyU=" @@ -14,8 +14,8 @@ schema = 3 version = "v1.1.6" hash = "sha256-u91oZdyy/wgk3J8Z+4mWmn+YliSBIATu6kpyH20Dd8k=" [mod."cloud.google.com/go/storage"] - version = "v1.36.0" - hash = "sha256-dRKH1NEyAfEpVo5Mma677L7z0JO9Mfd1bv1lr1uFngI=" + version = "v1.38.0" + hash = "sha256-6WI+JwdXR1QDGPC+vbWYFyEjELtkz236FUBjiK2Tbws=" [mod."cosmossdk.io/api"] version = "v0.3.1" hash = "sha256-yQUn04n0/s3DpNWu7TF3NG+awWKxgvRpV9CYIV+dR7k=" @@ -336,8 +336,8 @@ schema = 3 version = "v0.3.2" hash = "sha256-wVuR3QC0mYFl5LNeKdRXdKdod7BGP5sv2h6VVib85v8=" [mod."github.com/googleapis/gax-go/v2"] - version = "v2.12.0" - hash = "sha256-ZcXS+1B11UaJHf8D15N3ZCh00fiMUncpHd+eNRffLZ4=" + version = "v2.12.2" + hash = "sha256-Ip0d68jgTxN3v1MWFW6nwCsMc70Q9PCM87bhXJdOkHY=" [mod."github.com/gorilla/handlers"] version = "v1.5.1" hash = "sha256-GnBAARgOx1E+hDMQ63SI17hdhGtLQxb31lZOmn5j/pU=" @@ -646,20 +646,20 @@ schema = 3 version = "v0.24.0" hash = "sha256-4H+mGZgG2c9I1y0m8avF4qmt8LUKxxVsTqR8mKgP4yo=" [mod."go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc"] - version = "v0.47.0" - hash = "sha256-D+bP2jEZcB4S8AprlDM3qAghYtxhqc8fSKZNac6WVFs=" + version = "v0.49.0" + hash = "sha256-cgb4o14zow/ztWOKyXi7XQwVxV7OIsT2Ko8yaqQ7Lb8=" [mod."go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"] - version = "v0.47.0" - hash = "sha256-Pv1X0oIWYXyVxEaDQmgYcw+49I9+65N9Y+1wbxoXOog=" + version = "v0.49.0" + hash = "sha256-1/7YxtXZM4i75rXXIO6UN4CTY93nE/v2k2htS0uUOVg=" [mod."go.opentelemetry.io/otel"] - version = "v1.22.0" - hash = "sha256-4K70RPjaPzPpTO/VkE9ueoSo9EANuNXneDR6jEiUaJQ=" + version = "v1.24.0" + hash = "sha256-VGyV7EqJX6mRY0Ecyg+g0IZy+dt1GES4r9txQcaTNUg=" [mod."go.opentelemetry.io/otel/metric"] - version = "v1.22.0" - hash = "sha256-Lb4wdlZNmz6Ut6CljBAePSUA8X0RBEOEDyOl2oO+pL8=" + version = "v1.24.0" + hash = "sha256-KB5UQiaVmbB2VZO3al4WHb5HY79ioWaAQjaGkUKLvP8=" [mod."go.opentelemetry.io/otel/trace"] - version = "v1.22.0" - hash = "sha256-38zzkmcoOzYYeDN+rC44HmwmdnalIcEpObCS6tIvMO8=" + version = "v1.24.0" + hash = "sha256-FHP0hg+i7+wxCsM0u/5hQcgvvr3D+lq8o/7E/HkaW4s=" [mod."golang.org/x/crypto"] version = "v0.23.0" hash = "sha256-6hZjb/OazWFBef0C/aH63l49YQnzCh2vpIduzyfSSG8=" @@ -673,8 +673,8 @@ schema = 3 version = "v0.25.0" hash = "sha256-IjFfXLYNj27WLF7vpkZ6mfFXBnp+7QER3OQ0RgjxN54=" [mod."golang.org/x/oauth2"] - version = "v0.17.0" - hash = "sha256-M2ZZQZt449RJL18YpzGiAiqfGsDVMsr1IVWbYp/G/go=" + version = "v0.18.0" + hash = "sha256-TX4CvtvHU+SGSmqlxaQqlgJjlJiOtLGYAZa0zeBfZak=" [mod."golang.org/x/sync"] version = "v0.7.0" hash = "sha256-2ETllEu2GDWoOd/yMkOkLC2hWBpKzbVZ8LhjLu0d2A8=" @@ -694,8 +694,8 @@ schema = 3 version = "v0.21.0" hash = "sha256-TU0gAxUX410AYc/nMxxZiaqXeORih1cXbKh3sxKufVg=" [mod."google.golang.org/api"] - version = "v0.162.0" - hash = "sha256-+AsT4DPjefEmPPelZoSHuQ8nCHhmhhUWU4UGnJ/8+fg=" + version = "v0.169.0" + hash = "sha256-7+EAvbTTnUutkXpQBbxPSmZTS5P0mrKTiFooMI81w0k=" [mod."google.golang.org/appengine"] version = "v1.6.8" hash = "sha256-decMa0MiWfW/Bzr8QPPzzpeya0YWGHhZAt4Cr/bD1wQ=" @@ -703,14 +703,14 @@ schema = 3 version = "v0.0.0-20240227224415-6ceb2ff114de" hash = "sha256-G+tvsCTXxzk3sS6HbBxPN1DYaN1tPOqKsa60mI05Feg=" [mod."google.golang.org/genproto/googleapis/api"] - version = "v0.0.0-20240227224415-6ceb2ff114de" - hash = "sha256-H3d2ZhPJI9RH5EK9NsxUAFmT6tr2DgGV9SjZgqJ80r4=" + version = "v0.0.0-20240318140521-94a12d6c2237" + hash = "sha256-Tl2ABoESriYlPfeawE9xd5gPQYGzW4j/Il6gXEw33f0=" [mod."google.golang.org/genproto/googleapis/rpc"] - version = "v0.0.0-20240227224415-6ceb2ff114de" - hash = "sha256-XF1eaB8Uwjuii1SVpiZABBhrpszJy5ujOtN+7qAAouM=" + version = "v0.0.0-20240318140521-94a12d6c2237" + hash = "sha256-P5SBku16dYnK4koUQxTeGwPxAAWH8rxbDm2pOzFLo/Q=" [mod."google.golang.org/grpc"] - version = "v1.63.2" - hash = "sha256-RmtVjYLam97k7IHTHU7Gn16xNX+GvA9AiLKlQwOiZXU=" + version = "v1.64.0" + hash = "sha256-04Noi8lrzr+4ac2BA7KNXUXN/xZL/A2SsEpC2Hern84=" [mod."google.golang.org/protobuf"] version = "v1.34.1" hash = "sha256-qnHqY6KLZiZDbTVTN6uzF4jedxROYlPCYHoiv6XI0sc=" From fad3d97fd27c7211f32e8355217c47ac1fcfdc00 Mon Sep 17 00:00:00 2001 From: omahs <73983677+omahs@users.noreply.github.com> Date: Wed, 29 May 2024 15:29:57 +0200 Subject: [PATCH 260/345] chore: fix typos (#2570) * fix typo Signed-off-by: omahs <73983677+omahs@users.noreply.github.com> * fix typos * fix typos * fix typo --------- Signed-off-by: omahs <73983677+omahs@users.noreply.github.com> --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- LICENSE_FAQ.md | 4 ++-- SAFU.md | 2 +- SECURITY.md | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 78d590ad5d..b79f30c7e2 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -3,7 +3,7 @@ - + diff --git a/LICENSE_FAQ.md b/LICENSE_FAQ.md index 31ae1ddb2d..5114cabc47 100644 --- a/LICENSE_FAQ.md +++ b/LICENSE_FAQ.md @@ -45,7 +45,7 @@ transaction of economic value. "Designated Blockchains" refers to the version of the digital blockchain ledger that, at any given time, is recognized as canonical in accordance with the -blockchain consensus.The initial Designated Blockchains shall be the Evmos +blockchain consensus. The initial Designated Blockchains shall be the Evmos blockchains, identified by chain identifiers 9000 (testing network or testnet) and 9001 (main network or mainnet). @@ -169,7 +169,7 @@ ENCL code in violation of the conditions of the license. to maintain the code as part of the ENCL-1.0 project. How do I contribute it?** **A:** First, a big thank you! You can contribute the code to the official Evmos -repository by following the contributing guidelines a nd the official Code of +repository by following the contributing guidelines and the official Code of Conduct (see CONTRIBUTING). You will need to sign a Contributor License Agreement (CLA) before your contribution is peer-reviewed and accepted. A bot has been implemented to assist you through the signing process when diff --git a/SAFU.md b/SAFU.md index 83835aeda1..b988cdf825 100644 --- a/SAFU.md +++ b/SAFU.md @@ -6,7 +6,7 @@ This Simple Arrangement for Funding Upload (the “[SAFU](https://jumpcrypto.com/safu-creating-a-standard-for-whitehats/)” or “Arrangement”) is intended as a simple yet extensible way to specify a post-exploit policy for whitehats, particularly rewards and distributions. It is -based in the SAFU Framework designed by [Jump Crypto](https://jumpcrypto.com/). +based on the SAFU Framework designed by [Jump Crypto](https://jumpcrypto.com/). This Arrangement attempts to address the following issues during active vulnerabilities and post-exploits: diff --git a/SECURITY.md b/SECURITY.md index 960d08eff4..a5f81aeb91 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -65,7 +65,7 @@ Once the vulnerability severity is defined, the following steps apply: We also publish a security Advisory on GitHub and publish a [CVE](https://en.wikipedia.org/wiki/Common_Vulnerabilities_and_Exposures) -- For `Informational` , `Low` and `Medium` severities: +- For `Informational`, `Low` and `Medium` severities: 1. `Medium` and `Low` severity bug reports are included in a public issue and will be incorporated in the current sprint and patched in the next release. `Informational` reports are additionally categorized as with low or medium priority @@ -133,7 +133,7 @@ excluded from scope: - Findings derived from social engineering (e.g., phishing). Examples of vulnerabilities that are of interest to us include memory allocation bugs, race conditions, -timing attacks,information leaks, authentication bypasses, denial of service +timing attacks, information leaks, authentication bypasses, denial of service (specifically at the application- or protocol-layer), lost-write bugs, unauthorized account or capability access, stolen or loss of funds, token inflation bugs, payloads/transactions that cause panics, non deterministic logic, etc. From 69f312ed1c41bb756c6d88061c58c9656f310619 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 May 2024 20:33:59 +0000 Subject: [PATCH 261/345] build(deps): bump github.com/onsi/ginkgo/v2 from 2.18.0 to 2.19.0 (#2577) * build(deps): bump github.com/onsi/ginkgo/v2 from 2.18.0 to 2.19.0 Bumps [github.com/onsi/ginkgo/v2](https://github.com/onsi/ginkgo) from 2.18.0 to 2.19.0. - [Release notes](https://github.com/onsi/ginkgo/releases) - [Changelog](https://github.com/onsi/ginkgo/blob/master/CHANGELOG.md) - [Commits](https://github.com/onsi/ginkgo/compare/v2.18.0...v2.19.0) --- updated-dependencies: - dependency-name: github.com/onsi/ginkgo/v2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * update gomod2nix.toml file --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 3edcc0e117..cb7e580e2b 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,7 @@ require ( github.com/hashicorp/go-version v1.6.0 github.com/improbable-eng/grpc-web v0.15.0 github.com/linxGnu/grocksdb v1.8.14 - github.com/onsi/ginkgo/v2 v2.18.0 + github.com/onsi/ginkgo/v2 v2.19.0 github.com/onsi/gomega v1.33.1 github.com/ory/dockertest/v3 v3.10.0 github.com/pkg/errors v0.9.1 diff --git a/go.sum b/go.sum index 653e1227f0..076ed57c7c 100644 --- a/go.sum +++ b/go.sum @@ -932,8 +932,8 @@ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108 github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo/v2 v2.18.0 h1:W9Y7IWXxPUpAit9ieMOLI7PJZGaW22DTKgiVAuhDTLc= -github.com/onsi/ginkgo/v2 v2.18.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= +github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA= +github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= diff --git a/gomod2nix.toml b/gomod2nix.toml index 65fc6963ed..30489c1b33 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -480,8 +480,8 @@ schema = 3 version = "v0.0.5" hash = "sha256-/5i70IkH/qSW5KjGzv8aQNKh9tHoz98tqtL0K2DMFn4=" [mod."github.com/onsi/ginkgo/v2"] - version = "v2.18.0" - hash = "sha256-6wjy0DXUPg/SFtfTrh32cl/Cnbd7zd16WHTglgvBnXs=" + version = "v2.19.0" + hash = "sha256-el0o74ZgX/0wqCwK0zeFksv0Ja9lHKTgmCwuzQEWauo=" [mod."github.com/onsi/gomega"] version = "v1.33.1" hash = "sha256-oYfRaN1xqngIHQQxEEc+FQZ6UHC99VZQzAePT0Xkz8s=" From 48d7d40f48fb0dce93eeaa893711786c22624df3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 30 May 2024 14:58:03 +0200 Subject: [PATCH 262/345] build(deps): bump bufbuild/buf-setup-action from 1.32.1 to 1.32.2 (#2588) Bumps [bufbuild/buf-setup-action](https://github.com/bufbuild/buf-setup-action) from 1.32.1 to 1.32.2. - [Release notes](https://github.com/bufbuild/buf-setup-action/releases) - [Commits](https://github.com/bufbuild/buf-setup-action/compare/v1.32.1...v1.32.2) --- updated-dependencies: - dependency-name: bufbuild/buf-setup-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: Vladislav Varadinov --- .github/workflows/bsr-push.yml | 2 +- .github/workflows/proto.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/bsr-push.yml b/.github/workflows/bsr-push.yml index cb007fb41b..833dd01078 100644 --- a/.github/workflows/bsr-push.yml +++ b/.github/workflows/bsr-push.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: bufbuild/buf-setup-action@v1.32.1 + - uses: bufbuild/buf-setup-action@v1.32.2 # Push Evmos protos to the Buf Schema Registry - uses: bufbuild/buf-push-action@v1.2.0 with: diff --git a/.github/workflows/proto.yml b/.github/workflows/proto.yml index 16cb2bd8e2..7a4ce32204 100644 --- a/.github/workflows/proto.yml +++ b/.github/workflows/proto.yml @@ -32,7 +32,7 @@ jobs: timeout-minutes: 5 steps: - uses: actions/checkout@v4 - - uses: bufbuild/buf-setup-action@v1.32.1 + - uses: bufbuild/buf-setup-action@v1.32.2 - uses: bufbuild/buf-lint-action@v1 with: input: "proto" @@ -41,7 +41,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: bufbuild/buf-setup-action@v1.32.1 + - uses: bufbuild/buf-setup-action@v1.32.2 - uses: bufbuild/buf-breaking-action@v1 with: input: "proto" From e580b65f516cc31a4f3d8eb490f696c778c5030b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 30 May 2024 12:59:12 +0000 Subject: [PATCH 263/345] build(deps): bump alpine from 3.19 to 3.20 (#2569) * build(deps): bump alpine from 3.19 to 3.20 Bumps alpine from 3.19 to 3.20. --- updated-dependencies: - dependency-name: alpine dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * update deps --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: tom Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- Dockerfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 6da1fda5c5..8a439f76f8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.22.3-alpine3.18 AS build-env +FROM golang:1.22.3-alpine3.20 AS build-env ARG DB_BACKEND=goleveldb ARG ROCKSDB_VERSION="8.11.3" @@ -7,7 +7,7 @@ WORKDIR /go/src/github.com/evmos/evmos COPY go.mod go.sum ./ -RUN set -eux; apk add --no-cache ca-certificates=20240226-r0 build-base=0.5-r3 git=2.40.1-r0 linux-headers=6.3-r0 bash=5.2.15-r5 +RUN set -eux; apk add --no-cache ca-certificates=20240226-r0 build-base=0.5-r3 git=2.45.1-r0 linux-headers=6.6-r0 bash=5.2.26-r0 RUN --mount=type=bind,target=. --mount=type=secret,id=GITHUB_TOKEN \ git config --global url."https://$(cat /run/secrets/GITHUB_TOKEN)@github.com/".insteadOf "https://github.com/"; \ @@ -29,7 +29,7 @@ fi RUN go install github.com/MinseokOh/toml-cli@latest -FROM alpine:3.19 +FROM alpine:3.20 WORKDIR /root @@ -41,7 +41,7 @@ COPY --from=build-env /target/usr/lib /usr/lib COPY --from=build-env /target/usr/local/lib /usr/local/lib COPY --from=build-env /target/usr/include /usr/include -RUN apk add --no-cache ca-certificates=20240226-r0 jq=1.7.1-r0 curl=8.5.0-r0 bash=5.2.21-r0 vim=9.0.2127-r0 lz4=1.9.4-r5 rclone=1.65.0-r3 \ +RUN apk add --no-cache ca-certificates=20240226-r0 jq=1.7.1-r0 curl=8.7.1-r0 bash=5.2.26-r0 vim=9.1.0414-r0 lz4=1.9.4-r5 rclone=1.66.0-r2 \ && addgroup -g 1000 evmos \ && adduser -S -h /home/evmos -D evmos -u 1000 -G evmos From 7ec0ad483bc51490b8c392c6b13af964d21471b1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 30 May 2024 11:20:49 -0300 Subject: [PATCH 264/345] build(deps): bump github.com/linxGnu/grocksdb from 1.8.14 to 1.9.1 (#2565) * --- updated-dependencies: - dependency-name: github.com/linxGnu/grocksdb dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * update gomod2nix.toml file * bump rockdb version --------- Signed-off-by: dependabot[bot] Signed-off-by: Tom <54514587+GAtom22@users.noreply.github.com> Signed-off-by: Vladislav Varadinov Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] Co-authored-by: tom Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: Vladislav Varadinov --- Dockerfile | 2 +- Makefile | 2 +- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- nix/rocksdb.nix | 4 ++-- scripts/install_librocksdb.sh | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Dockerfile b/Dockerfile index 8a439f76f8..02937852fa 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ FROM golang:1.22.3-alpine3.20 AS build-env ARG DB_BACKEND=goleveldb -ARG ROCKSDB_VERSION="8.11.3" +ARG ROCKSDB_VERSION="9.1.1" WORKDIR /go/src/github.com/evmos/evmos diff --git a/Makefile b/Makefile index 692bb3eb9b..013c90967f 100644 --- a/Makefile +++ b/Makefile @@ -26,7 +26,7 @@ DOCKER_TAG := $(COMMIT_HASH) # e2e env MOUNT_PATH := $(shell pwd)/build/:/root/ E2E_SKIP_CLEANUP := false -ROCKSDB_VERSION ?= "8.11.3" +ROCKSDB_VERSION ?= "9.1.1" # Deps DEPS_COSMOS_SDK_VERSION := $(shell cat go.sum | grep 'github.com/evmos/cosmos-sdk' | grep -v -e 'go.mod' | tail -n 1 | awk '{ print $$2; }') DEPS_IBC_GO_VERSION := $(shell cat go.sum | grep 'github.com/cosmos/ibc-go' | grep -v -e 'go.mod' | tail -n 1 | awk '{ print $$2; }') diff --git a/go.mod b/go.mod index cb7e580e2b..b9d7628ee4 100644 --- a/go.mod +++ b/go.mod @@ -29,7 +29,7 @@ require ( github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/hashicorp/go-version v1.6.0 github.com/improbable-eng/grpc-web v0.15.0 - github.com/linxGnu/grocksdb v1.8.14 + github.com/linxGnu/grocksdb v1.9.1 github.com/onsi/ginkgo/v2 v2.19.0 github.com/onsi/gomega v1.33.1 github.com/ory/dockertest/v3 v3.10.0 diff --git a/go.sum b/go.sum index 076ed57c7c..d0a120304e 100644 --- a/go.sum +++ b/go.sum @@ -850,8 +850,8 @@ github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6 github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/linxGnu/grocksdb v1.8.14 h1:HTgyYalNwBSG/1qCQUIott44wU5b2Y9Kr3z7SK5OfGQ= -github.com/linxGnu/grocksdb v1.8.14/go.mod h1:QYiYypR2d4v63Wj1adOOfzglnoII0gLj3PNh4fZkcFA= +github.com/linxGnu/grocksdb v1.9.1 h1:LmwuHzsWglxJrIES9jvS2O1xTPD2nnKYhAQDx5dIyRo= +github.com/linxGnu/grocksdb v1.9.1/go.mod h1:QYiYypR2d4v63Wj1adOOfzglnoII0gLj3PNh4fZkcFA= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= diff --git a/gomod2nix.toml b/gomod2nix.toml index 30489c1b33..bf6e7a6004 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -435,8 +435,8 @@ schema = 3 version = "v0.1.0" hash = "sha256-wQqGTtRWsfR9n0O/SXHVgECebbnNmHddxJIbG63OJBQ=" [mod."github.com/linxGnu/grocksdb"] - version = "v1.8.14" - hash = "sha256-dT647UzB25Ye1Gv6b9JEtJZjuWKdJo4D8kw9cB0W8gA=" + version = "v1.9.1" + hash = "sha256-yRSGvZ5YeDqGOEmGPRSKxPjNoCQ/Xk/DMtNtutkbPGg=" [mod."github.com/magiconair/properties"] version = "v1.8.7" hash = "sha256-XQ2bnc2s7/IH3WxEO4GishZurMyKwEclZy1DXg+2xXc=" diff --git a/nix/rocksdb.nix b/nix/rocksdb.nix index 20a95aa528..5195a55ce3 100644 --- a/nix/rocksdb.nix +++ b/nix/rocksdb.nix @@ -17,13 +17,13 @@ stdenv.mkDerivation rec { pname = "rocksdb"; - version = "8.11.3"; + version = "9.1.1"; src = fetchFromGitHub { owner = "facebook"; repo = pname; rev = "v${version}"; - sha256 = "sha256-OpEiMwGxZuxb9o3RQuSrwZMQGLhe9xLT1aa3HpI4KPs="; + sha256 = "sha256-/Xf0bzNJPclH9IP80QNaABfhj4IAR5LycYET18VFCXc="; }; nativeBuildInputs = [ cmake ninja ]; diff --git a/scripts/install_librocksdb.sh b/scripts/install_librocksdb.sh index 5668475a75..dafade95a5 100755 --- a/scripts/install_librocksdb.sh +++ b/scripts/install_librocksdb.sh @@ -1,6 +1,6 @@ #!/bin/bash -ROCKSDB_VERSION=${1:-"8.11.3"} +ROCKSDB_VERSION=${1:-"9.1.1"} # Check if RocksDB is already installed if [[ $(find /usr/lib -name "librocksdb.so.${ROCKSDB_VERSION}" -print -quit) ]]; then From 9cb831eff351093643797c182d38a7398b163854 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 30 May 2024 14:58:05 +0000 Subject: [PATCH 265/345] build(deps): bump github.com/hashicorp/go-version from 1.6.0 to 1.7.0 (#2571) * build(deps): bump github.com/hashicorp/go-version from 1.6.0 to 1.7.0 Bumps [github.com/hashicorp/go-version](https://github.com/hashicorp/go-version) from 1.6.0 to 1.7.0. - [Release notes](https://github.com/hashicorp/go-version/releases) - [Changelog](https://github.com/hashicorp/go-version/blob/main/CHANGELOG.md) - [Commits](https://github.com/hashicorp/go-version/compare/v1.6.0...v1.7.0) --- updated-dependencies: - dependency-name: github.com/hashicorp/go-version dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * update gomod2nix.toml file --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: Vladislav Varadinov --- go.mod | 2 +- go.sum | 3 ++- gomod2nix.toml | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index b9d7628ee4..15a55380a7 100644 --- a/go.mod +++ b/go.mod @@ -27,7 +27,7 @@ require ( github.com/gorilla/mux v1.8.1 github.com/gorilla/websocket v1.5.1 github.com/grpc-ecosystem/grpc-gateway v1.16.0 - github.com/hashicorp/go-version v1.6.0 + github.com/hashicorp/go-version v1.7.0 github.com/improbable-eng/grpc-web v0.15.0 github.com/linxGnu/grocksdb v1.9.1 github.com/onsi/ginkgo/v2 v2.19.0 diff --git a/go.sum b/go.sum index d0a120304e..2cdd0a05e6 100644 --- a/go.sum +++ b/go.sum @@ -749,8 +749,9 @@ github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= diff --git a/gomod2nix.toml b/gomod2nix.toml index bf6e7a6004..c2be08e962 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -375,8 +375,8 @@ schema = 3 version = "v1.0.0" hash = "sha256-g5i9m7FSRInQzZ4iRpIsoUu685AY7fppUwjhuZCezT8=" [mod."github.com/hashicorp/go-version"] - version = "v1.6.0" - hash = "sha256-UV0equpmW6BiJnp4W3TZlSJ+PTHuTA+CdOs2JTeHhjs=" + version = "v1.7.0" + hash = "sha256-Umc/Q2mxRrPF4aEcDuDJq4lFBT+PSsnyANfyFwUIaxI=" [mod."github.com/hashicorp/golang-lru"] version = "v0.5.5-0.20210104140557-80c98217689d" hash = "sha256-w5utLMR7p5pF9xX+mI3N9NyfQ8ixNXNTgfXDu8fudmc=" From 7db8ccad8b9f858df275dad72c7fdd2bf0f82e96 Mon Sep 17 00:00:00 2001 From: stepit <48993133+0xstepit@users.noreply.github.com> Date: Fri, 31 May 2024 15:03:05 +0200 Subject: [PATCH 266/345] chore: fix wrong error message (#2581) * fix wrong error message * add changelog entry --- CHANGELOG.md | 1 + x/evm/types/dynamic_fee_tx.go | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f697af5aa..9cd76d590b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -102,6 +102,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (ibc) [#2504](https://github.com/evmos/evmos/pull/2504) Refactor repeated unpacking of IBC packet data. - (make) [#2487](https://github.com/evmos/evmos/pull/2487) Improve make command to compile all smart contracts in repository. - (rpc) [#2375](https://github.com/evmos/evmos/pull/2375) Add support for allow-insecure-unlock. +- (evm) [#2581](https://github.com/evmos/evmos/pull/2581) Fix wrong error message returned for DynamicFee txs. ## [v18.0.0](https://github.com/evmos/evmos/releases/tag/v18.0.0) - 2024-04-22 diff --git a/x/evm/types/dynamic_fee_tx.go b/x/evm/types/dynamic_fee_tx.go index a1809ef407..8725ca6fd6 100644 --- a/x/evm/types/dynamic_fee_tx.go +++ b/x/evm/types/dynamic_fee_tx.go @@ -250,7 +250,7 @@ func (tx DynamicFeeTx) Validate() error { if tx.GetChainID() == nil { return errorsmod.Wrap( errortypes.ErrInvalidChainID, - "chain ID must be present on AccessList txs", + "chain ID must be present on DynamicFee txs", ) } From 86e176112821aeb3048f80de14dbecaeee2e2eaa Mon Sep 17 00:00:00 2001 From: Luke Date: Fri, 31 May 2024 21:41:22 +0800 Subject: [PATCH 267/345] imp: use config.Bech32Prefix instead of evmos (#2574) Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> --- precompiles/distribution/events_test.go | 3 ++- precompiles/distribution/types.go | 4 +++- precompiles/staking/tx_test.go | 8 +++++--- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/precompiles/distribution/events_test.go b/precompiles/distribution/events_test.go index 35cad44f3c..26181c093b 100644 --- a/precompiles/distribution/events_test.go +++ b/precompiles/distribution/events_test.go @@ -9,6 +9,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" + "github.com/evmos/evmos/v18/cmd/config" cmn "github.com/evmos/evmos/v18/precompiles/common" "github.com/evmos/evmos/v18/precompiles/distribution" "github.com/evmos/evmos/v18/utils" @@ -46,7 +47,7 @@ func (s *PrecompileTestSuite) TestSetWithdrawAddressEvent() { err := cmn.UnpackLog(s.precompile.ABI, &setWithdrawerAddrEvent, distribution.EventTypeSetWithdrawAddress, *log) s.Require().NoError(err) s.Require().Equal(s.address, setWithdrawerAddrEvent.Caller) - s.Require().Equal(sdk.MustBech32ifyAddressBytes("evmos", s.address.Bytes()), setWithdrawerAddrEvent.WithdrawerAddress) + s.Require().Equal(sdk.MustBech32ifyAddressBytes(config.Bech32Prefix, s.address.Bytes()), setWithdrawerAddrEvent.WithdrawerAddress) }, 20000, false, diff --git a/precompiles/distribution/types.go b/precompiles/distribution/types.go index 96481d726b..20b9890c4d 100644 --- a/precompiles/distribution/types.go +++ b/precompiles/distribution/types.go @@ -8,11 +8,13 @@ import ( "math/big" "cosmossdk.io/math" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/query" distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" + "github.com/evmos/evmos/v18/cmd/config" cmn "github.com/evmos/evmos/v18/precompiles/common" ) @@ -76,7 +78,7 @@ func NewMsgSetWithdrawAddress(args []interface{}) (*distributiontypes.MsgSetWith // If the withdrawer address is a hex address, convert it to a bech32 address. if common.IsHexAddress(withdrawerAddress) { var err error - withdrawerAddress, err = sdk.Bech32ifyAddressBytes("evmos", common.HexToAddress(withdrawerAddress).Bytes()) + withdrawerAddress, err = sdk.Bech32ifyAddressBytes(config.Bech32Prefix, common.HexToAddress(withdrawerAddress).Bytes()) if err != nil { return nil, common.Address{}, err } diff --git a/precompiles/staking/tx_test.go b/precompiles/staking/tx_test.go index 446042c5a9..5f8d138eb9 100644 --- a/precompiles/staking/tx_test.go +++ b/precompiles/staking/tx_test.go @@ -6,10 +6,12 @@ import ( "math/big" "cosmossdk.io/math" + sdk "github.com/cosmos/cosmos-sdk/types" geth "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" + "github.com/evmos/evmos/v18/cmd/config" cmn "github.com/evmos/evmos/v18/precompiles/common" "github.com/evmos/evmos/v18/precompiles/staking" "github.com/evmos/evmos/v18/precompiles/testutil" @@ -933,7 +935,7 @@ func (s *PrecompileTestSuite) TestUndelegate() { s.Require().NotEmpty(bz) tc.postCheck(bz) - bech32Addr, err := sdk.Bech32ifyAddressBytes("evmos", s.address.Bytes()) + bech32Addr, err := sdk.Bech32ifyAddressBytes(config.Bech32Prefix, s.address.Bytes()) s.Require().NoError(err) s.Require().Equal(undelegations[0].DelegatorAddress, bech32Addr) s.Require().Equal(undelegations[0].ValidatorAddress, s.validators[0].OperatorAddress) @@ -1078,7 +1080,7 @@ func (s *PrecompileTestSuite) TestRedelegate() { s.Require().NoError(err) s.Require().NotEmpty(bz) - bech32Addr, err := sdk.Bech32ifyAddressBytes("evmos", s.address.Bytes()) + bech32Addr, err := sdk.Bech32ifyAddressBytes(config.Bech32Prefix, s.address.Bytes()) s.Require().NoError(err) s.Require().Equal(redelegations[0].DelegatorAddress, bech32Addr) s.Require().Equal(redelegations[0].ValidatorSrcAddress, s.validators[0].OperatorAddress) @@ -1254,7 +1256,7 @@ func (s *PrecompileTestSuite) TestCancelUnbondingDelegation() { delegation, found := s.app.StakingKeeper.GetDelegation(s.ctx, s.address.Bytes(), s.validators[0].GetOperator()) s.Require().True(found) - bech32Addr, err := sdk.Bech32ifyAddressBytes("evmos", s.address.Bytes()) + bech32Addr, err := sdk.Bech32ifyAddressBytes(config.Bech32Prefix, s.address.Bytes()) s.Require().NoError(err) s.Require().Equal(delegation.DelegatorAddress, bech32Addr) s.Require().Equal(delegation.ValidatorAddress, s.validators[0].OperatorAddress) From 1b5416363b4b54f5895b6daaaaacb92fcd614846 Mon Sep 17 00:00:00 2001 From: Vladislav Varadinov Date: Mon, 3 Jun 2024 11:38:00 +0300 Subject: [PATCH 268/345] chore(evm): Move CallEVM and CallEVMWithData to evm module (#2594) * fix: move CallEvm and CallEVmWIthParams to evm module * fix: add the correct mocks in the unit tests * run make format * CHANGELOG * fix: add missing license to file --------- Co-authored-by: Vvaradinov --- CHANGELOG.md | 1 + x/erc20/keeper/erc20_utils_test.go | 4 +- x/erc20/keeper/evm.go | 107 ++---------------- x/erc20/keeper/evm_hooks.go | 2 +- x/erc20/keeper/evm_test.go | 40 ++++--- .../keeper/ibc_callbacks_integration_test.go | 16 +-- x/erc20/keeper/msg_server.go | 8 +- x/erc20/keeper/msg_server_test.go | 28 ++++- x/erc20/keeper/proposals_test.go | 1 + x/erc20/types/errors.go | 3 - x/erc20/types/interfaces.go | 19 +++- x/erc20/types/mocks/EVMKeeper.go | 98 +++++++++++++++- x/evm/keeper/call_evm.go | 102 +++++++++++++++++ x/evm/types/errors.go | 8 ++ x/evm/types/interfaces.go | 1 + 15 files changed, 296 insertions(+), 142 deletions(-) create mode 100644 x/evm/keeper/call_evm.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 9cd76d590b..e34a7eba5e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -103,6 +103,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (make) [#2487](https://github.com/evmos/evmos/pull/2487) Improve make command to compile all smart contracts in repository. - (rpc) [#2375](https://github.com/evmos/evmos/pull/2375) Add support for allow-insecure-unlock. - (evm) [#2581](https://github.com/evmos/evmos/pull/2581) Fix wrong error message returned for DynamicFee txs. +- (evm) [#2594](https://github.com/evmos/evmos/pull/2594) Move `CallEVM` and `CallEVMWithData` to `x/evm` module. ## [v18.0.0](https://github.com/evmos/evmos/releases/tag/v18.0.0) - 2024-04-22 diff --git a/x/erc20/keeper/erc20_utils_test.go b/x/erc20/keeper/erc20_utils_test.go index c78026d307..485c103221 100644 --- a/x/erc20/keeper/erc20_utils_test.go +++ b/x/erc20/keeper/erc20_utils_test.go @@ -38,7 +38,7 @@ func (suite *KeeperTestSuite) GrantERC20Token(contractAddr, from, to common.Addr func (suite *KeeperTestSuite) BalanceOf(contract, account common.Address) interface{} { erc20 := contracts.ERC20MinterBurnerDecimalsContract.ABI - res, err := suite.app.Erc20Keeper.CallEVM(suite.ctx, erc20, types.ModuleAddress, contract, false, "balanceOf", account) + res, err := suite.app.EvmKeeper.CallEVM(suite.ctx, erc20, types.ModuleAddress, contract, false, "balanceOf", account) if err != nil { return nil } @@ -57,7 +57,7 @@ func (suite *KeeperTestSuite) BalanceOf(contract, account common.Address) interf func (suite *KeeperTestSuite) NameOf(contract common.Address) string { erc20 := contracts.ERC20MinterBurnerDecimalsContract.ABI - res, err := suite.app.Erc20Keeper.CallEVM(suite.ctx, erc20, types.ModuleAddress, contract, false, "name") + res, err := suite.app.EvmKeeper.CallEVM(suite.ctx, erc20, types.ModuleAddress, contract, false, "name") suite.Require().NoError(err) suite.Require().NotNil(res) diff --git a/x/erc20/keeper/evm.go b/x/erc20/keeper/evm.go index 70e64131ca..10ce0979ab 100644 --- a/x/erc20/keeper/evm.go +++ b/x/erc20/keeper/evm.go @@ -4,19 +4,14 @@ package keeper import ( - "encoding/json" "math/big" errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" - errortypes "github.com/cosmos/cosmos-sdk/types/errors" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v18/server/config" evmtypes "github.com/evmos/evmos/v18/x/evm/types" "github.com/evmos/evmos/v18/contracts" @@ -41,7 +36,7 @@ func (k Keeper) DeployERC20Contract( decimals, ) if err != nil { - return common.Address{}, errorsmod.Wrapf(types.ErrABIPack, "coin metadata is invalid %s: %s", coinMetadata.Name, err.Error()) + return common.Address{}, errorsmod.Wrapf(evmtypes.ErrABIPack, "coin metadata is invalid %s: %s", coinMetadata.Name, err.Error()) } data := make([]byte, len(contracts.ERC20MinterBurnerDecimalsContract.Bin)+len(ctorArgs)) @@ -54,7 +49,7 @@ func (k Keeper) DeployERC20Contract( } contractAddr := crypto.CreateAddress(types.ModuleAddress, nonce) - _, err = k.CallEVMWithData(ctx, types.ModuleAddress, nil, data, true) + _, err = k.evmKeeper.CallEVMWithData(ctx, types.ModuleAddress, nil, data, true) if err != nil { return common.Address{}, errorsmod.Wrapf(err, "failed to deploy contract for %s", coinMetadata.Name) } @@ -76,38 +71,38 @@ func (k Keeper) QueryERC20( erc20 := contracts.ERC20MinterBurnerDecimalsContract.ABI // Name - res, err := k.CallEVM(ctx, erc20, types.ModuleAddress, contract, false, "name") + res, err := k.evmKeeper.CallEVM(ctx, erc20, types.ModuleAddress, contract, false, "name") if err != nil { return types.ERC20Data{}, err } if err := erc20.UnpackIntoInterface(&nameRes, "name", res.Ret); err != nil { return types.ERC20Data{}, errorsmod.Wrapf( - types.ErrABIUnpack, "failed to unpack name: %s", err.Error(), + evmtypes.ErrABIUnpack, "failed to unpack name: %s", err.Error(), ) } // Symbol - res, err = k.CallEVM(ctx, erc20, types.ModuleAddress, contract, false, "symbol") + res, err = k.evmKeeper.CallEVM(ctx, erc20, types.ModuleAddress, contract, false, "symbol") if err != nil { return types.ERC20Data{}, err } if err := erc20.UnpackIntoInterface(&symbolRes, "symbol", res.Ret); err != nil { return types.ERC20Data{}, errorsmod.Wrapf( - types.ErrABIUnpack, "failed to unpack symbol: %s", err.Error(), + evmtypes.ErrABIUnpack, "failed to unpack symbol: %s", err.Error(), ) } // Decimals - res, err = k.CallEVM(ctx, erc20, types.ModuleAddress, contract, false, "decimals") + res, err = k.evmKeeper.CallEVM(ctx, erc20, types.ModuleAddress, contract, false, "decimals") if err != nil { return types.ERC20Data{}, err } if err := erc20.UnpackIntoInterface(&decimalRes, "decimals", res.Ret); err != nil { return types.ERC20Data{}, errorsmod.Wrapf( - types.ErrABIUnpack, "failed to unpack decimals: %s", err.Error(), + evmtypes.ErrABIUnpack, "failed to unpack decimals: %s", err.Error(), ) } @@ -120,7 +115,7 @@ func (k Keeper) BalanceOf( abi abi.ABI, contract, account common.Address, ) *big.Int { - res, err := k.CallEVM(ctx, abi, types.ModuleAddress, contract, false, "balanceOf", account) + res, err := k.evmKeeper.CallEVM(ctx, abi, types.ModuleAddress, contract, false, "balanceOf", account) if err != nil { return nil } @@ -138,90 +133,6 @@ func (k Keeper) BalanceOf( return balance } -// CallEVM performs a smart contract method call using given args -func (k Keeper) CallEVM( - ctx sdk.Context, - abi abi.ABI, - from, contract common.Address, - commit bool, - method string, - args ...interface{}, -) (*evmtypes.MsgEthereumTxResponse, error) { - data, err := abi.Pack(method, args...) - if err != nil { - return nil, errorsmod.Wrap( - types.ErrABIPack, - errorsmod.Wrap(err, "failed to create transaction data").Error(), - ) - } - - resp, err := k.CallEVMWithData(ctx, from, &contract, data, commit) - if err != nil { - return nil, errorsmod.Wrapf(err, "contract call failed: method '%s', contract '%s'", method, contract) - } - return resp, nil -} - -// CallEVMWithData performs a smart contract method call using contract data -func (k Keeper) CallEVMWithData( - ctx sdk.Context, - from common.Address, - contract *common.Address, - data []byte, - commit bool, -) (*evmtypes.MsgEthereumTxResponse, error) { - nonce, err := k.accountKeeper.GetSequence(ctx, from.Bytes()) - if err != nil { - return nil, err - } - - gasCap := config.DefaultGasCap - if commit { - args, err := json.Marshal(evmtypes.TransactionArgs{ - From: &from, - To: contract, - Data: (*hexutil.Bytes)(&data), - }) - if err != nil { - return nil, errorsmod.Wrapf(errortypes.ErrJSONMarshal, "failed to marshal tx args: %s", err.Error()) - } - - gasRes, err := k.evmKeeper.EstimateGasInternal(sdk.WrapSDKContext(ctx), &evmtypes.EthCallRequest{ - Args: args, - GasCap: config.DefaultGasCap, - }, evmtypes.Internal) - if err != nil { - return nil, err - } - gasCap = gasRes.Gas - } - - msg := ethtypes.NewMessage( - from, - contract, - nonce, - big.NewInt(0), // amount - gasCap, // gasLimit - big.NewInt(0), // gasFeeCap - big.NewInt(0), // gasTipCap - big.NewInt(0), // gasPrice - data, - ethtypes.AccessList{}, // AccessList - !commit, // isFake - ) - - res, err := k.evmKeeper.ApplyMessage(ctx, msg, evmtypes.NewNoOpTracer(), commit) - if err != nil { - return nil, err - } - - if res.Failed() { - return nil, errorsmod.Wrap(evmtypes.ErrVMExecution, res.VmError) - } - - return res, nil -} - // monitorApprovalEvent returns an error if the given transactions logs include // an unexpected `Approval` event func (k Keeper) monitorApprovalEvent(res *evmtypes.MsgEthereumTxResponse) error { diff --git a/x/erc20/keeper/evm_hooks.go b/x/erc20/keeper/evm_hooks.go index 44d0c61987..3f9d189e6c 100644 --- a/x/erc20/keeper/evm_hooks.go +++ b/x/erc20/keeper/evm_hooks.go @@ -178,7 +178,7 @@ func (k Keeper) PostProcessTransferEvent( // registered token wants to mint a Cosmos coin. switch pair.ContractOwner { case types.OWNER_MODULE: - _, err = k.CallEVM(ctx, erc20, types.ModuleAddress, contractAddr, true, "burn", tokens) + _, err = k.evmKeeper.CallEVM(ctx, erc20, types.ModuleAddress, contractAddr, true, "burn", tokens) case types.OWNER_EXTERNAL: err = k.bankKeeper.MintCoins(ctx, types.ModuleName, coins) default: diff --git a/x/erc20/keeper/evm_test.go b/x/erc20/keeper/evm_test.go index f7108f5074..c8b1e4f681 100644 --- a/x/erc20/keeper/evm_test.go +++ b/x/erc20/keeper/evm_test.go @@ -42,6 +42,7 @@ func (suite *KeeperTestSuite) TestQueryERC20() { res, err := suite.app.Erc20Keeper.QueryERC20(suite.ctx, contract) if tc.res { + suite.Require().NoError(err) suite.Require().Equal( types.ERC20Data{Name: "coin", Symbol: "token", Decimals: erc20Decimals}, @@ -66,7 +67,7 @@ func (suite *KeeperTestSuite) TestBalanceOf() { { "Failed to call Evm", func() { - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced ApplyMessage error")) + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) }, int64(0), false, @@ -74,7 +75,7 @@ func (suite *KeeperTestSuite) TestBalanceOf() { { "Incorrect res", func() { - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: []uint8{0, 0}}, nil).Once() + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: []uint8{0, 0}}, nil).Once() }, int64(0), false, @@ -84,7 +85,7 @@ func (suite *KeeperTestSuite) TestBalanceOf() { func() { balance := make([]uint8, 32) balance[31] = uint8(10) - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Once() + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Once() }, int64(10), true, @@ -114,6 +115,8 @@ func (suite *KeeperTestSuite) TestBalanceOf() { } else { suite.Require().Nil(balance) } + + mockEVMKeeper.AssertExpectations(suite.T()) } } @@ -142,7 +145,7 @@ func (suite *KeeperTestSuite) TestCallEVM() { suite.Require().NoError(err) account := utiltx.GenerateAddress() - res, err := suite.app.Erc20Keeper.CallEVM(suite.ctx, erc20, types.ModuleAddress, contract, true, tc.method, account) + res, err := suite.app.EvmKeeper.CallEVM(suite.ctx, erc20, types.ModuleAddress, contract, true, tc.method, account) if tc.expPass { suite.Require().IsTypef(&evmtypes.MsgEthereumTxResponse{}, res, tc.name) suite.Require().NoError(err) @@ -236,7 +239,7 @@ func (suite *KeeperTestSuite) TestCallEVMWithData() { data, contract := tc.malleate() - res, err := suite.app.Erc20Keeper.CallEVMWithData(suite.ctx, tc.from, contract, data, true) + res, err := suite.app.EvmKeeper.CallEVMWithData(suite.ctx, tc.from, contract, data, true) if tc.expPass { suite.Require().IsTypef(&evmtypes.MsgEthereumTxResponse{}, res, tc.name) suite.Require().NoError(err) @@ -259,7 +262,8 @@ func (suite *KeeperTestSuite) TestForceFail() { { "Force estimate gas error", func() { - mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced EstimateGas error")) + mockEVMKeeper.On("CallEVMWithData", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVMWithData error")).Once() + mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced EstimateGas error")).Once() }, true, false, @@ -267,8 +271,9 @@ func (suite *KeeperTestSuite) TestForceFail() { { "Force ApplyMessage error", func() { - mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil) - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced ApplyMessage error")) + mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil).Once() + mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced ApplyMessage error")).Once() + mockEVMKeeper.On("CallEVMWithData", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVMWithData error")).Once() }, true, false, @@ -276,8 +281,9 @@ func (suite *KeeperTestSuite) TestForceFail() { { "Force ApplyMessage failed", func() { - mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil) - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{VmError: "SomeError"}, nil) + mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil).Once() + mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{VmError: "SomeError"}, nil).Once() + mockEVMKeeper.On("CallEVMWithData", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVMWithData error")).Once() }, true, false, @@ -288,12 +294,6 @@ func (suite *KeeperTestSuite) TestForceFail() { suite.Run(fmt.Sprintf("Case %s", tc.name), func() { suite.SetupTest() // reset mockEVMKeeper = &erc20mocks.EVMKeeper{} - suite.app.Erc20Keeper = keeper.NewKeeper( - suite.app.GetKey("erc20"), suite.app.AppCodec(), - authtypes.NewModuleAddress(govtypes.ModuleName), suite.app.AccountKeeper, - suite.app.BankKeeper, mockEVMKeeper, suite.app.StakingKeeper, - s.app.AuthzKeeper, &s.app.TransferKeeper, - ) tc.malleate() @@ -302,7 +302,7 @@ func (suite *KeeperTestSuite) TestForceFail() { account := utiltx.GenerateAddress() data, _ := erc20.Pack("balanceOf", account) - res, err := suite.app.Erc20Keeper.CallEVMWithData(suite.ctx, types.ModuleAddress, &contract, data, tc.commit) + res, err := mockEVMKeeper.CallEVMWithData(suite.ctx, types.ModuleAddress, &contract, data, tc.commit) if tc.expPass { suite.Require().IsTypef(&evmtypes.MsgEthereumTxResponse{}, res, tc.name) suite.Require().NoError(err) @@ -324,6 +324,7 @@ func (suite *KeeperTestSuite) TestQueryERC20ForceFail() { { "Failed to call Evm", func() { + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced ApplyMessage error")) }, false, @@ -331,6 +332,7 @@ func (suite *KeeperTestSuite) TestQueryERC20ForceFail() { { "Incorrect res", func() { + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: []uint8{0, 0}}, nil).Once() }, false, @@ -339,6 +341,7 @@ func (suite *KeeperTestSuite) TestQueryERC20ForceFail() { "Correct res for name - incorrect for symbol", func() { ret := []uint8{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 67, 111, 105, 110, 32, 84, 111, 107, 101, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: ret}, nil).Once() mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{VmError: "Error"}, nil).Once() }, @@ -348,6 +351,7 @@ func (suite *KeeperTestSuite) TestQueryERC20ForceFail() { "incorrect symbol res", func() { ret := []uint8{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 67, 111, 105, 110, 32, 84, 111, 107, 101, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: ret}, nil).Once() mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: []uint8{0, 0}}, nil).Once() }, @@ -358,6 +362,7 @@ func (suite *KeeperTestSuite) TestQueryERC20ForceFail() { func() { ret := []uint8{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 67, 111, 105, 110, 32, 84, 111, 107, 101, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} retSymbol := []uint8{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 67, 84, 75, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: ret}, nil).Once() mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: retSymbol}, nil).Once() mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{VmError: "Error"}, nil).Once() @@ -369,6 +374,7 @@ func (suite *KeeperTestSuite) TestQueryERC20ForceFail() { func() { ret := []uint8{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 67, 111, 105, 110, 32, 84, 111, 107, 101, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} retSymbol := []uint8{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 67, 84, 75, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: ret}, nil).Once() mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: retSymbol}, nil).Once() mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: []uint8{0, 0}}, nil).Once() diff --git a/x/erc20/keeper/ibc_callbacks_integration_test.go b/x/erc20/keeper/ibc_callbacks_integration_test.go index 247213dc4b..a397157cfc 100644 --- a/x/erc20/keeper/ibc_callbacks_integration_test.go +++ b/x/erc20/keeper/ibc_callbacks_integration_test.go @@ -242,7 +242,7 @@ var _ = Describe("Convert receiving IBC to Erc20", Ordered, func() { }) It("should convert erc20 ibc voucher to original erc20", func() { // Mint tokens and send to receiver - _, err := s.app.Erc20Keeper.CallEVM(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, common.BytesToAddress(senderAcc.Bytes()), pair.GetERC20Contract(), true, "mint", common.BytesToAddress(senderAcc.Bytes()), big.NewInt(amount)) + _, err := s.app.EvmKeeper.CallEVM(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, common.BytesToAddress(senderAcc.Bytes()), pair.GetERC20Contract(), true, "mint", common.BytesToAddress(senderAcc.Bytes()), big.NewInt(amount)) s.Require().NoError(err) // Check Balance balanceToken := s.app.Erc20Keeper.BalanceOf(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, pair.GetERC20Contract(), common.BytesToAddress(senderAcc.Bytes())) @@ -287,7 +287,7 @@ var _ = Describe("Convert receiving IBC to Erc20", Ordered, func() { }) It("should convert full available balance of erc20 coin to original erc20 token", func() { // Mint tokens and send to receiver - _, err := s.app.Erc20Keeper.CallEVM(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, common.BytesToAddress(senderAcc.Bytes()), pair.GetERC20Contract(), true, "mint", common.BytesToAddress(senderAcc.Bytes()), big.NewInt(amount)) + _, err := s.app.EvmKeeper.CallEVM(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, common.BytesToAddress(senderAcc.Bytes()), pair.GetERC20Contract(), true, "mint", common.BytesToAddress(senderAcc.Bytes()), big.NewInt(amount)) s.Require().NoError(err) // Check Balance balanceToken := s.app.Erc20Keeper.BalanceOf(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, pair.GetERC20Contract(), common.BytesToAddress(senderAcc.Bytes())) @@ -336,7 +336,7 @@ var _ = Describe("Convert receiving IBC to Erc20", Ordered, func() { }) It("send native ERC-20 to osmosis, when sending back IBC coins should convert full balance back to erc20 token", func() { // Mint tokens and send to receiver - _, err := s.app.Erc20Keeper.CallEVM(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, common.BytesToAddress(senderAcc.Bytes()), pair.GetERC20Contract(), true, "mint", common.BytesToAddress(senderAcc.Bytes()), big.NewInt(amount)) + _, err := s.app.EvmKeeper.CallEVM(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, common.BytesToAddress(senderAcc.Bytes()), pair.GetERC20Contract(), true, "mint", common.BytesToAddress(senderAcc.Bytes()), big.NewInt(amount)) s.Require().NoError(err) // Check Balance balanceToken := s.app.Erc20Keeper.BalanceOf(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, pair.GetERC20Contract(), common.BytesToAddress(senderAcc.Bytes())) @@ -489,7 +489,7 @@ var _ = Describe("Convert outgoing ERC20 to IBC", Ordered, func() { }) It("should fail transfer and not convert to IBC", func() { // Mint tokens and send to receiver - _, err := s.app.Erc20Keeper.CallEVM(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, common.BytesToAddress(senderAcc.Bytes()), pair.GetERC20Contract(), true, "mint", common.BytesToAddress(senderAcc.Bytes()), big.NewInt(amount)) + _, err := s.app.EvmKeeper.CallEVM(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, common.BytesToAddress(senderAcc.Bytes()), pair.GetERC20Contract(), true, "mint", common.BytesToAddress(senderAcc.Bytes()), big.NewInt(amount)) s.Require().NoError(err) // Check Balance balanceToken := s.app.Erc20Keeper.BalanceOf(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, pair.GetERC20Contract(), common.BytesToAddress(senderAcc.Bytes())) @@ -564,7 +564,7 @@ var _ = Describe("Convert outgoing ERC20 to IBC", Ordered, func() { }) It("should transfer available balance", func() { // Mint tokens and send to receiver - _, err := s.app.Erc20Keeper.CallEVM(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, common.BytesToAddress(senderAcc.Bytes()), pair.GetERC20Contract(), true, "mint", common.BytesToAddress(senderAcc.Bytes()), big.NewInt(amount*2)) + _, err := s.app.EvmKeeper.CallEVM(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, common.BytesToAddress(senderAcc.Bytes()), pair.GetERC20Contract(), true, "mint", common.BytesToAddress(senderAcc.Bytes()), big.NewInt(amount*2)) s.Require().NoError(err) // Check Balance balanceToken := s.app.Erc20Keeper.BalanceOf(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, pair.GetERC20Contract(), common.BytesToAddress(senderAcc.Bytes())) @@ -607,7 +607,7 @@ var _ = Describe("Convert outgoing ERC20 to IBC", Ordered, func() { }) It("should convert and transfer if no ibc balance", func() { // Mint tokens and send to receiver - _, err := s.app.Erc20Keeper.CallEVM(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, common.BytesToAddress(senderAcc.Bytes()), pair.GetERC20Contract(), true, "mint", common.BytesToAddress(senderAcc.Bytes()), big.NewInt(amount)) + _, err := s.app.EvmKeeper.CallEVM(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, common.BytesToAddress(senderAcc.Bytes()), pair.GetERC20Contract(), true, "mint", common.BytesToAddress(senderAcc.Bytes()), big.NewInt(amount)) s.Require().NoError(err) // Check Balance @@ -628,7 +628,7 @@ var _ = Describe("Convert outgoing ERC20 to IBC", Ordered, func() { }) It("should fail if balance is not enough", func() { // Mint tokens and send to receiver - _, err := s.app.Erc20Keeper.CallEVM(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, common.BytesToAddress(senderAcc.Bytes()), pair.GetERC20Contract(), true, "mint", common.BytesToAddress(senderAcc.Bytes()), big.NewInt(amount)) + _, err := s.app.EvmKeeper.CallEVM(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, common.BytesToAddress(senderAcc.Bytes()), pair.GetERC20Contract(), true, "mint", common.BytesToAddress(senderAcc.Bytes()), big.NewInt(amount)) s.Require().NoError(err) // Check Balance @@ -673,7 +673,7 @@ var _ = Describe("Convert outgoing ERC20 to IBC", Ordered, func() { }) It("should timeout and reconvert to ERC20", func() { // Mint tokens and send to receiver - _, err := s.app.Erc20Keeper.CallEVM(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, common.BytesToAddress(senderAcc.Bytes()), pair.GetERC20Contract(), true, "mint", common.BytesToAddress(senderAcc.Bytes()), big.NewInt(amount)) + _, err := s.app.EvmKeeper.CallEVM(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, common.BytesToAddress(senderAcc.Bytes()), pair.GetERC20Contract(), true, "mint", common.BytesToAddress(senderAcc.Bytes()), big.NewInt(amount)) s.Require().NoError(err) // Check Balance diff --git a/x/erc20/keeper/msg_server.go b/x/erc20/keeper/msg_server.go index e2fdbd5a61..e77665fb64 100644 --- a/x/erc20/keeper/msg_server.go +++ b/x/erc20/keeper/msg_server.go @@ -133,7 +133,7 @@ func (k Keeper) convertCoinNativeCoin( } // Mint tokens and send to receiver - _, err = k.CallEVM(ctx, erc20, types.ModuleAddress, contract, true, "mint", receiver, msg.Coin.Amount.BigInt()) + _, err = k.evmKeeper.CallEVM(ctx, erc20, types.ModuleAddress, contract, true, "mint", receiver, msg.Coin.Amount.BigInt()) if err != nil { return nil, err } @@ -219,7 +219,7 @@ func (k Keeper) convertERC20NativeCoin( } // Burn escrowed tokens - _, err := k.CallEVM(ctx, erc20, types.ModuleAddress, contract, true, "burnCoins", sender, msg.Amount.BigInt()) + _, err := k.evmKeeper.CallEVM(ctx, erc20, types.ModuleAddress, contract, true, "burnCoins", sender, msg.Amount.BigInt()) if err != nil { return nil, err } @@ -330,7 +330,7 @@ func (k Keeper) convertERC20NativeToken( return nil, err } - res, err := k.CallEVMWithData(ctx, sender, &contract, transferData, true) + res, err := k.evmKeeper.CallEVMWithData(ctx, sender, &contract, transferData, true) if err != nil { return nil, err } @@ -455,7 +455,7 @@ func (k Keeper) convertCoinNativeERC20( } // Unescrow Tokens and send to receiver - res, err := k.CallEVM(ctx, erc20, types.ModuleAddress, contract, true, "transfer", receiver, msg.Coin.Amount.BigInt()) + res, err := k.evmKeeper.CallEVM(ctx, erc20, types.ModuleAddress, contract, true, "transfer", receiver, msg.Coin.Amount.BigInt()) if err != nil { return nil, err } diff --git a/x/erc20/keeper/msg_server_test.go b/x/erc20/keeper/msg_server_test.go index 1f48da5785..bd483c4970 100644 --- a/x/erc20/keeper/msg_server_test.go +++ b/x/erc20/keeper/msg_server_test.go @@ -105,6 +105,7 @@ func (suite *KeeperTestSuite) TestConvertCoinNativeCoin() { mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Once() mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced ApplyMessage error")) mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) }, false, false, }, { @@ -130,6 +131,7 @@ func (suite *KeeperTestSuite) TestConvertCoinNativeCoin() { // Extra call on test mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{}, nil) mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) }, false, false, }, { @@ -148,6 +150,7 @@ func (suite *KeeperTestSuite) TestConvertCoinNativeCoin() { mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil) mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Times(4) mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) }, false, false, }, } @@ -247,6 +250,7 @@ func (suite *KeeperTestSuite) TestConvertERC20NativeCoin() { mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Once() mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced ApplyMessage error")) mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) }, false, }, @@ -273,6 +277,7 @@ func (suite *KeeperTestSuite) TestConvertERC20NativeCoin() { // Extra call on test mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{}, nil) mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) }, false, }, @@ -299,6 +304,7 @@ func (suite *KeeperTestSuite) TestConvertERC20NativeCoin() { // Extra call on test mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{}, nil) mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) }, false, }, @@ -544,6 +550,7 @@ func (suite *KeeperTestSuite) TestConvertERC20NativeERC20() { mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Once() mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced ApplyMessage error")) mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) }, contractMinterBurner, false, @@ -554,7 +561,7 @@ func (suite *KeeperTestSuite) TestConvertERC20NativeERC20() { 100, 10, func(common.Address) {}, - func() { //nolint:dupl + func() { mockEVMKeeper := &erc20mocks.EVMKeeper{} suite.app.Erc20Keeper = keeper.NewKeeper( suite.app.GetKey("erc20"), suite.app.AppCodec(), @@ -570,6 +577,7 @@ func (suite *KeeperTestSuite) TestConvertERC20NativeERC20() { mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Twice() mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced balance error")) mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) }, contractMinterBurner, false, @@ -580,7 +588,7 @@ func (suite *KeeperTestSuite) TestConvertERC20NativeERC20() { 100, 10, func(common.Address) {}, - func() { //nolint:dupl + func() { mockEVMKeeper := &erc20mocks.EVMKeeper{} suite.app.Erc20Keeper = keeper.NewKeeper( suite.app.GetKey("erc20"), suite.app.AppCodec(), @@ -595,6 +603,7 @@ func (suite *KeeperTestSuite) TestConvertERC20NativeERC20() { mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Once() mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{}, nil) mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) }, contractMinterBurner, false, @@ -621,6 +630,7 @@ func (suite *KeeperTestSuite) TestConvertERC20NativeERC20() { mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Once() mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil) mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) }, contractMinterBurner, false, @@ -845,6 +855,7 @@ func (suite *KeeperTestSuite) TestConvertCoinNativeERC20() { mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Once() mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced ApplyMessage error")) mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) }, contractMinterBurner, false, @@ -854,7 +865,7 @@ func (suite *KeeperTestSuite) TestConvertCoinNativeERC20() { 100, 10, func(common.Address) {}, - func() { //nolint:dupl + func() { mockEVMKeeper := &erc20mocks.EVMKeeper{} suite.app.Erc20Keeper = keeper.NewKeeper( suite.app.GetKey("erc20"), suite.app.AppCodec(), @@ -869,6 +880,7 @@ func (suite *KeeperTestSuite) TestConvertCoinNativeERC20() { mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Once() mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{}, nil) mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) }, contractMinterBurner, false, @@ -878,7 +890,7 @@ func (suite *KeeperTestSuite) TestConvertCoinNativeERC20() { 100, 10, func(common.Address) {}, - func() { //nolint:dupl + func() { mockEVMKeeper := &erc20mocks.EVMKeeper{} suite.app.Erc20Keeper = keeper.NewKeeper( suite.app.GetKey("erc20"), suite.app.AppCodec(), @@ -894,6 +906,7 @@ func (suite *KeeperTestSuite) TestConvertCoinNativeERC20() { mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Twice() mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("fail second balance")) mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) }, contractMinterBurner, false, @@ -917,6 +930,7 @@ func (suite *KeeperTestSuite) TestConvertCoinNativeERC20() { mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil) mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil) mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) }, contractMinterBurner, false, @@ -1123,6 +1137,7 @@ func (suite *KeeperTestSuite) TestConvertCoinNativeIBCVoucher() { mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Once() mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced ApplyMessage error")) mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) }, false, false, }, { @@ -1148,6 +1163,7 @@ func (suite *KeeperTestSuite) TestConvertCoinNativeIBCVoucher() { // Extra call on test mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{}, nil) mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) }, false, false, }, { @@ -1166,6 +1182,7 @@ func (suite *KeeperTestSuite) TestConvertCoinNativeIBCVoucher() { mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil) mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Times(4) mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) }, false, false, }, } @@ -1263,6 +1280,7 @@ func (suite *KeeperTestSuite) TestConvertERC20NativeIBCVoucher() { mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Once() mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced ApplyMessage error")) mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) }, false, }, @@ -1289,6 +1307,7 @@ func (suite *KeeperTestSuite) TestConvertERC20NativeIBCVoucher() { // Extra call on test mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{}, nil) mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) }, false, }, @@ -1315,6 +1334,7 @@ func (suite *KeeperTestSuite) TestConvertERC20NativeIBCVoucher() { // Extra call on test mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{}, nil) mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) }, false, }, diff --git a/x/erc20/keeper/proposals_test.go b/x/erc20/keeper/proposals_test.go index af2f823bb8..4dcea58dc8 100644 --- a/x/erc20/keeper/proposals_test.go +++ b/x/erc20/keeper/proposals_test.go @@ -152,6 +152,7 @@ func (suite KeeperTestSuite) TestRegisterERC20() { //nolint:govet // we can copy ) mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil) + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced ApplyMessage error")) }, false, diff --git a/x/erc20/types/errors.go b/x/erc20/types/errors.go index d8b0289780..a70be6dc94 100644 --- a/x/erc20/types/errors.go +++ b/x/erc20/types/errors.go @@ -16,9 +16,6 @@ var ( ErrUndefinedOwner = errorsmod.Register(ModuleName, 6, "undefined owner of contract pair") ErrBalanceInvariance = errorsmod.Register(ModuleName, 7, "post transfer balance invariant failed") ErrUnexpectedEvent = errorsmod.Register(ModuleName, 8, "unexpected event") - ErrABIPack = errorsmod.Register(ModuleName, 9, "contract ABI pack failed") - ErrABIUnpack = errorsmod.Register(ModuleName, 10, "contract ABI unpack failed") - ErrEVMDenom = errorsmod.Register(ModuleName, 11, "EVM denomination registration") ErrEVMCall = errorsmod.Register(ModuleName, 12, "EVM call unexpected error") ErrERC20TokenPairDisabled = errorsmod.Register(ModuleName, 13, "erc20 token pair is disabled") ) diff --git a/x/erc20/types/interfaces.go b/x/erc20/types/interfaces.go index 442d16399d..4f5e321cb4 100644 --- a/x/erc20/types/interfaces.go +++ b/x/erc20/types/interfaces.go @@ -6,10 +6,10 @@ package types import ( "context" - paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" + "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" @@ -39,6 +39,21 @@ type EVMKeeper interface { AddEVMExtensions(ctx sdk.Context, precompiles ...vm.PrecompiledContract) error DeleteAccount(ctx sdk.Context, addr common.Address) error IsAvailablePrecompile(addr common.Address) bool + CallEVMWithData( + ctx sdk.Context, + from common.Address, + contract *common.Address, + data []byte, + commit bool, + ) (*evmtypes.MsgEthereumTxResponse, error) + CallEVM( + ctx sdk.Context, + abi abi.ABI, + from, contract common.Address, + commit bool, + method string, + args ...interface{}, + ) (*evmtypes.MsgEthereumTxResponse, error) } type ( diff --git a/x/erc20/types/mocks/EVMKeeper.go b/x/erc20/types/mocks/EVMKeeper.go index 04558942d5..f4a2b2bd81 100644 --- a/x/erc20/types/mocks/EVMKeeper.go +++ b/x/erc20/types/mocks/EVMKeeper.go @@ -1,12 +1,13 @@ -// Code generated by mockery v2.36.1. DO NOT EDIT. +// Code generated by mockery v2.43.2. DO NOT EDIT. package mocks import ( - context "context" - + abi "github.com/ethereum/go-ethereum/accounts/abi" common "github.com/ethereum/go-ethereum/common" + context "context" + core "github.com/ethereum/go-ethereum/core" evmtypes "github.com/evmos/evmos/v18/x/evm/types" @@ -36,6 +37,10 @@ func (_m *EVMKeeper) AddEVMExtensions(ctx types.Context, precompiles ...vm.Preco _ca = append(_ca, _va...) ret := _m.Called(_ca...) + if len(ret) == 0 { + panic("no return value specified for AddEVMExtensions") + } + var r0 error if rf, ok := ret.Get(0).(func(types.Context, ...vm.PrecompiledContract) error); ok { r0 = rf(ctx, precompiles...) @@ -50,6 +55,10 @@ func (_m *EVMKeeper) AddEVMExtensions(ctx types.Context, precompiles ...vm.Preco func (_m *EVMKeeper) ApplyMessage(ctx types.Context, msg core.Message, tracer vm.EVMLogger, commit bool) (*evmtypes.MsgEthereumTxResponse, error) { ret := _m.Called(ctx, msg, tracer, commit) + if len(ret) == 0 { + panic("no return value specified for ApplyMessage") + } + var r0 *evmtypes.MsgEthereumTxResponse var r1 error if rf, ok := ret.Get(0).(func(types.Context, core.Message, vm.EVMLogger, bool) (*evmtypes.MsgEthereumTxResponse, error)); ok { @@ -72,10 +81,77 @@ func (_m *EVMKeeper) ApplyMessage(ctx types.Context, msg core.Message, tracer vm return r0, r1 } +// CallEVM provides a mock function with given fields: ctx, _a1, from, contract, commit, method, args +func (_m *EVMKeeper) CallEVM(ctx types.Context, _a1 abi.ABI, from common.Address, contract common.Address, commit bool, method string, args ...interface{}) (*evmtypes.MsgEthereumTxResponse, error) { + var _ca []interface{} + _ca = append(_ca, ctx, _a1, from, contract, commit, method) + _ca = append(_ca, args...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for CallEVM") + } + + var r0 *evmtypes.MsgEthereumTxResponse + var r1 error + if rf, ok := ret.Get(0).(func(types.Context, abi.ABI, common.Address, common.Address, bool, string, ...interface{}) (*evmtypes.MsgEthereumTxResponse, error)); ok { + return rf(ctx, _a1, from, contract, commit, method, args...) + } + if rf, ok := ret.Get(0).(func(types.Context, abi.ABI, common.Address, common.Address, bool, string, ...interface{}) *evmtypes.MsgEthereumTxResponse); ok { + r0 = rf(ctx, _a1, from, contract, commit, method, args...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*evmtypes.MsgEthereumTxResponse) + } + } + + if rf, ok := ret.Get(1).(func(types.Context, abi.ABI, common.Address, common.Address, bool, string, ...interface{}) error); ok { + r1 = rf(ctx, _a1, from, contract, commit, method, args...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// CallEVMWithData provides a mock function with given fields: ctx, from, contract, data, commit +func (_m *EVMKeeper) CallEVMWithData(ctx types.Context, from common.Address, contract *common.Address, data []byte, commit bool) (*evmtypes.MsgEthereumTxResponse, error) { + ret := _m.Called(ctx, from, contract, data, commit) + + if len(ret) == 0 { + panic("no return value specified for CallEVMWithData") + } + + var r0 *evmtypes.MsgEthereumTxResponse + var r1 error + if rf, ok := ret.Get(0).(func(types.Context, common.Address, *common.Address, []byte, bool) (*evmtypes.MsgEthereumTxResponse, error)); ok { + return rf(ctx, from, contract, data, commit) + } + if rf, ok := ret.Get(0).(func(types.Context, common.Address, *common.Address, []byte, bool) *evmtypes.MsgEthereumTxResponse); ok { + r0 = rf(ctx, from, contract, data, commit) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*evmtypes.MsgEthereumTxResponse) + } + } + + if rf, ok := ret.Get(1).(func(types.Context, common.Address, *common.Address, []byte, bool) error); ok { + r1 = rf(ctx, from, contract, data, commit) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // DeleteAccount provides a mock function with given fields: ctx, addr func (_m *EVMKeeper) DeleteAccount(ctx types.Context, addr common.Address) error { ret := _m.Called(ctx, addr) + if len(ret) == 0 { + panic("no return value specified for DeleteAccount") + } + var r0 error if rf, ok := ret.Get(0).(func(types.Context, common.Address) error); ok { r0 = rf(ctx, addr) @@ -90,6 +166,10 @@ func (_m *EVMKeeper) DeleteAccount(ctx types.Context, addr common.Address) error func (_m *EVMKeeper) EstimateGasInternal(c context.Context, req *evmtypes.EthCallRequest, fromType evmtypes.CallType) (*evmtypes.EstimateGasResponse, error) { ret := _m.Called(c, req, fromType) + if len(ret) == 0 { + panic("no return value specified for EstimateGasInternal") + } + var r0 *evmtypes.EstimateGasResponse var r1 error if rf, ok := ret.Get(0).(func(context.Context, *evmtypes.EthCallRequest, evmtypes.CallType) (*evmtypes.EstimateGasResponse, error)); ok { @@ -116,6 +196,10 @@ func (_m *EVMKeeper) EstimateGasInternal(c context.Context, req *evmtypes.EthCal func (_m *EVMKeeper) GetAccountWithoutBalance(ctx types.Context, addr common.Address) *statedb.Account { ret := _m.Called(ctx, addr) + if len(ret) == 0 { + panic("no return value specified for GetAccountWithoutBalance") + } + var r0 *statedb.Account if rf, ok := ret.Get(0).(func(types.Context, common.Address) *statedb.Account); ok { r0 = rf(ctx, addr) @@ -132,6 +216,10 @@ func (_m *EVMKeeper) GetAccountWithoutBalance(ctx types.Context, addr common.Add func (_m *EVMKeeper) GetParams(ctx types.Context) evmtypes.Params { ret := _m.Called(ctx) + if len(ret) == 0 { + panic("no return value specified for GetParams") + } + var r0 evmtypes.Params if rf, ok := ret.Get(0).(func(types.Context) evmtypes.Params); ok { r0 = rf(ctx) @@ -146,6 +234,10 @@ func (_m *EVMKeeper) GetParams(ctx types.Context) evmtypes.Params { func (_m *EVMKeeper) IsAvailablePrecompile(addr common.Address) bool { ret := _m.Called(addr) + if len(ret) == 0 { + panic("no return value specified for IsAvailablePrecompile") + } + var r0 bool if rf, ok := ret.Get(0).(func(common.Address) bool); ok { r0 = rf(addr) diff --git a/x/evm/keeper/call_evm.go b/x/evm/keeper/call_evm.go new file mode 100644 index 0000000000..0631ec0f6c --- /dev/null +++ b/x/evm/keeper/call_evm.go @@ -0,0 +1,102 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) +package keeper + +import ( + "encoding/json" + "math/big" + + errorsmod "cosmossdk.io/errors" + sdk "github.com/cosmos/cosmos-sdk/types" + errortypes "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + ethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/evmos/evmos/v18/server/config" + "github.com/evmos/evmos/v18/x/evm/types" +) + +// CallEVM performs a smart contract method call using given args +func (k Keeper) CallEVM( + ctx sdk.Context, + abi abi.ABI, + from, contract common.Address, + commit bool, + method string, + args ...interface{}, +) (*types.MsgEthereumTxResponse, error) { + data, err := abi.Pack(method, args...) + if err != nil { + return nil, errorsmod.Wrap( + types.ErrABIPack, + errorsmod.Wrap(err, "failed to create transaction data").Error(), + ) + } + + resp, err := k.CallEVMWithData(ctx, from, &contract, data, commit) + if err != nil { + return nil, errorsmod.Wrapf(err, "contract call failed: method '%s', contract '%s'", method, contract) + } + return resp, nil +} + +// CallEVMWithData performs a smart contract method call using contract data +func (k Keeper) CallEVMWithData( + ctx sdk.Context, + from common.Address, + contract *common.Address, + data []byte, + commit bool, +) (*types.MsgEthereumTxResponse, error) { + nonce, err := k.accountKeeper.GetSequence(ctx, from.Bytes()) + if err != nil { + return nil, err + } + + gasCap := config.DefaultGasCap + if commit { + args, err := json.Marshal(types.TransactionArgs{ + From: &from, + To: contract, + Data: (*hexutil.Bytes)(&data), + }) + if err != nil { + return nil, errorsmod.Wrapf(errortypes.ErrJSONMarshal, "failed to marshal tx args: %s", err.Error()) + } + + gasRes, err := k.EstimateGasInternal(sdk.WrapSDKContext(ctx), &types.EthCallRequest{ + Args: args, + GasCap: config.DefaultGasCap, + }, types.Internal) + if err != nil { + return nil, err + } + gasCap = gasRes.Gas + } + + msg := ethtypes.NewMessage( + from, + contract, + nonce, + big.NewInt(0), // amount + gasCap, // gasLimit + big.NewInt(0), // gasFeeCap + big.NewInt(0), // gasTipCap + big.NewInt(0), // gasPrice + data, + ethtypes.AccessList{}, // AccessList + !commit, // isFake + ) + + res, err := k.ApplyMessage(ctx, msg, types.NewNoOpTracer(), commit) + if err != nil { + return nil, err + } + + if res.Failed() { + return nil, errorsmod.Wrap(types.ErrVMExecution, res.VmError) + } + + return res, nil +} diff --git a/x/evm/types/errors.go b/x/evm/types/errors.go index 0baf612dc8..d666b0765d 100644 --- a/x/evm/types/errors.go +++ b/x/evm/types/errors.go @@ -30,6 +30,8 @@ const ( codeErrInvalidAccount codeErrInvalidGasLimit codeErrInactivePrecompile + codeErrABIPack + codeErrABIUnpack ) var ErrPostTxProcessing = errors.New("failed to execute post processing") @@ -82,6 +84,12 @@ var ( // ErrInactivePrecompile returns an error if a call is made to an inactive precompile ErrInactivePrecompile = errorsmod.Register(ModuleName, codeErrInactivePrecompile, "precompile not enabled") + + // ErrABIPack returns an error if the contract ABI packing fails + ErrABIPack = errorsmod.Register(ModuleName, codeErrABIPack, "contract ABI pack failed") + + // ErrABIUnpack returns an error if the contract ABI unpacking fails + ErrABIUnpack = errorsmod.Register(ModuleName, codeErrABIUnpack, "contract ABI unpack failed") ) // NewExecErrorWithReason unpacks the revert return bytes and returns a wrapped error diff --git a/x/evm/types/interfaces.go b/x/evm/types/interfaces.go index cbb5731865..97b5f6bff7 100644 --- a/x/evm/types/interfaces.go +++ b/x/evm/types/interfaces.go @@ -24,6 +24,7 @@ type AccountKeeper interface { SetAccount(ctx sdk.Context, account authtypes.AccountI) RemoveAccount(ctx sdk.Context, account authtypes.AccountI) GetParams(ctx sdk.Context) (params authtypes.Params) + GetSequence(ctx sdk.Context, account sdk.AccAddress) (uint64, error) } // BankKeeper defines the expected interface needed to retrieve account balances. From 73323089fc826c46ccbcf3dad0458d93bdf59c85 Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Mon, 3 Jun 2024 10:29:42 -0300 Subject: [PATCH 269/345] chore(app): backport v18.1 changes to main (#2596) * Merge pull request from GHSA-xgr7-jgq3-mhmc * fix: push fix and nix tests to confirm * fix: add code size check to ensure it only applies to contracts * fix: denom balance subbing only for native bond denom * fix: return sender instead of origin * fix: add test in separate file * fix formating * fix: remove print statements * fix: remove multiple builds in nix test * fix: add another nix test * fix: add another case for the fix * fix: address comments from PR review * add debug_trace_tx util func * Update tests/nix_tests/hardhat/contracts/ICS20FromContract.sol Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Signed-off-by: Vladislav Varadinov * fix: clean nix tests * update balance validation * add rocksdb build on tests * update transfer from EOA test * fix: update gas because we added staking keeper --------- Signed-off-by: Vladislav Varadinov Co-authored-by: tom Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> * update chlog * update chlog * update chlog * remove unused imports * update e2e-test.yml * fix lint warnings --------- Signed-off-by: Vladislav Varadinov Co-authored-by: Vladislav Varadinov Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> --- .github/workflows/e2e-test.yml | 1 + CHANGELOG.md | 23 +- precompiles/ics20/ics20.go | 4 + precompiles/ics20/tx.go | 24 +- precompiles/ics20/types.go | 2 +- precompiles/ics20/utils_test.go | 2 +- .../hardhat/contracts/ICS20FromContract.sol | 62 ++++++ tests/nix_tests/test_ics20_precompile.py | 208 ++++++++++++++++++ tests/nix_tests/test_precompiles.py | 2 +- tests/nix_tests/utils.py | 16 ++ x/evm/keeper/precompiles.go | 2 +- 11 files changed, 329 insertions(+), 17 deletions(-) create mode 100644 tests/nix_tests/hardhat/contracts/ICS20FromContract.sol create mode 100644 tests/nix_tests/test_ics20_precompile.py diff --git a/.github/workflows/e2e-test.yml b/.github/workflows/e2e-test.yml index 5a0b01f76d..93d55bc6ef 100644 --- a/.github/workflows/e2e-test.yml +++ b/.github/workflows/e2e-test.yml @@ -50,6 +50,7 @@ jobs: "test_fee_history.py" "test_grpc_only.py" "test_ibc.py" + "test_ics20_precompile.py" "test_no_abci_resp.py" "test_precompiles.py" "test_priority.py" diff --git a/CHANGELOG.md b/CHANGELOG.md index e34a7eba5e..5ee53a03f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -51,18 +51,14 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (evm) [#2380](https://github.com/evmos/evmos/pull/2380) Remove EVM hooks from app and EVM module. - (evm) [#2501](https://github.com/evmos/evmos/pull/2501) Revert deletion of EVM hooks (#2380). - (erc20) [#2502](https://github.com/evmos/evmos/pull/2502) Revert deletion of EVM hooks (#2154) (#2442). -- (vesting) [#2507](https://github.com/evmos/evmos/pull/2507) Consider locked-up vested delegated coins in `LockedCoins` calculation. - (erc20) [#2508](https://github.com/evmos/evmos/pull/2508) Add bookkeping logic in preparation for STRV2 upgrade. - (precompiles) [#2529](https://github.com/evmos/evmos/pull/2529) Remove Outposts precompiles. - (upgrade) [#2533](https://github.com/evmos/evmos/pull/2533) Add upgrade handler for v19. -- (precompiles) [#2550](https://github.com/evmos/evmos/pull/2550) Update secp256r1 curve precompile bech32 address to its corresponding value. - (staking) [#2051](https://github.com/evmos/evmos/pull/2051) Implement the `EditValidator` function for staking precompiled contract. -- (evm) [#2373](https://github.com/evmos/evmos/pull/2373) Remove check on hardcoded ChainID identifier. ### Bug Fixes - (inflation) [#2299](https://github.com/evmos/evmos/pull/2299) Fix emission function and tests. -- (evm) [#2559](https://github.com/evmos/evmos/pull/2559) Fix duplicate event emitting of cached events. ### Improvements @@ -101,9 +97,26 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (cli) [#2503](https://github.com/evmos/evmos/pull/2503) Revert deletion of ConvertCoin for ERC-20 module (#2155). - (ibc) [#2504](https://github.com/evmos/evmos/pull/2504) Refactor repeated unpacking of IBC packet data. - (make) [#2487](https://github.com/evmos/evmos/pull/2487) Improve make command to compile all smart contracts in repository. +- (evm) [#2594](https://github.com/evmos/evmos/pull/2594) Move `CallEVM` and `CallEVMWithData` to `x/evm` module. + +## [v18.1.0](https://github.com/evmos/evmos/releases/tag/v18.1.0) - 2024-05-31 + +### Improvements + +- (app) [#2373](https://github.com/evmos/evmos/pull/2373) Remove ChainID constraint. - (rpc) [#2375](https://github.com/evmos/evmos/pull/2375) Add support for allow-insecure-unlock. - (evm) [#2581](https://github.com/evmos/evmos/pull/2581) Fix wrong error message returned for DynamicFee txs. -- (evm) [#2594](https://github.com/evmos/evmos/pull/2594) Move `CallEVM` and `CallEVMWithData` to `x/evm` module. + +### State Machine Breaking + +- (evm) [#2559](https://github.com/evmos/evmos/pull/2559) Fix duplicate event emitting of cached events. +- (precompiles) [#2550](https://github.com/evmos/evmos/pull/2550) Update secp256r1 curve precompile bech32 address to its corresponding value. +- (vesting) [#2507](https://github.com/evmos/evmos/pull/2507) Consider locked-up vested delegated coins in `LockedCoins` calculation. +- (security) [#2596](https://github.com/evmos/evmos/pull/2596) Merge security advisory GHSA-xgr7-jgq3-mhmc + +## [v18.0.1](https://github.com/evmos/evmos/releases/tag/v18.0.1) - 2024-05-29 + +- (app) [2589](https://github.com/evmos/evmos/pull/2589) Schedule v18.1 upgrade ## [v18.0.0](https://github.com/evmos/evmos/releases/tag/v18.0.0) - 2024-04-22 diff --git a/precompiles/ics20/ics20.go b/precompiles/ics20/ics20.go index 7df8d463c3..a5e0611b78 100644 --- a/precompiles/ics20/ics20.go +++ b/precompiles/ics20/ics20.go @@ -17,6 +17,7 @@ import ( "github.com/evmos/evmos/v18/precompiles/authorization" cmn "github.com/evmos/evmos/v18/precompiles/common" transferkeeper "github.com/evmos/evmos/v18/x/ibc/transfer/keeper" + stakingkeeper "github.com/evmos/evmos/v18/x/staking/keeper" ) var _ vm.PrecompiledContract = &Precompile{} @@ -28,6 +29,7 @@ var f embed.FS type Precompile struct { cmn.Precompile + stakingKeeper stakingkeeper.Keeper transferKeeper transferkeeper.Keeper channelKeeper channelkeeper.Keeper } @@ -35,6 +37,7 @@ type Precompile struct { // NewPrecompile creates a new ICS-20 Precompile instance as a // PrecompiledContract interface. func NewPrecompile( + stakingKeeper stakingkeeper.Keeper, transferKeeper transferkeeper.Keeper, channelKeeper channelkeeper.Keeper, authzKeeper authzkeeper.Keeper, @@ -59,6 +62,7 @@ func NewPrecompile( }, transferKeeper: transferKeeper, channelKeeper: channelKeeper, + stakingKeeper: stakingKeeper, }, nil } diff --git a/precompiles/ics20/tx.go b/precompiles/ics20/tx.go index 8fa1cddf74..43dee10ca7 100644 --- a/precompiles/ics20/tx.go +++ b/precompiles/ics20/tx.go @@ -4,12 +4,16 @@ package ics20 import ( + "fmt" + errorsmod "cosmossdk.io/errors" + sdk "github.com/cosmos/cosmos-sdk/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" + "github.com/evmos/evmos/v18/x/evm/statedb" ) const ( @@ -37,14 +41,12 @@ func (p Precompile) Transfer( return nil, errorsmod.Wrapf(channeltypes.ErrChannelNotFound, "port ID (%s) channel ID (%s)", msg.SourcePort, msg.SourceChannel) } - // The provided sender address should always be equal to the origin address. - // In case the contract caller address is the same as the sender address provided, - // update the sender address to be equal to the origin address. - // Otherwise, if the provided delegator address is different from the origin address, - // return an error because is a forbidden operation - sender, err = CheckOriginAndSender(contract, origin, sender) - if err != nil { - return nil, err + // isCallerSender is true when the contract caller is the same as the sender + isCallerSender := contract.CallerAddress == sender + + // If the contract caller is not the same as the sender, the sender must be the origin + if !isCallerSender && origin != sender { + return nil, fmt.Errorf(ErrDifferentOriginFromSender, origin.String(), sender.String()) } // no need to have authorization when the contract caller is the same as origin (owner of funds) @@ -78,5 +80,11 @@ func (p Precompile) Transfer( return nil, err } + // NOTE: This ensures that the changes in the bank keeper are correctly mirrored to the EVM stateDB. + // This prevents the stateDB from overwriting the changed balance in the bank keeper when committing the EVM state. + if isCallerSender && msg.Token.Denom == p.stakingKeeper.BondDenom(ctx) { + stateDB.(*statedb.StateDB).SubBalance(contract.CallerAddress, msg.Token.Amount.BigInt()) + } + return method.Outputs.Pack(res.Sequence) } diff --git a/precompiles/ics20/types.go b/precompiles/ics20/types.go index 7f41909d87..03c0e313e9 100644 --- a/precompiles/ics20/types.go +++ b/precompiles/ics20/types.go @@ -378,7 +378,7 @@ func convertToAllocation(allocs []transfertypes.Allocation) []cmn.ICS20Allocatio // CheckOriginAndSender ensures the correct sender is being used. func CheckOriginAndSender(contract *vm.Contract, origin common.Address, sender common.Address) (common.Address, error) { if contract.CallerAddress == sender { - return origin, nil + return sender, nil } else if origin != sender { return common.Address{}, fmt.Errorf(ErrDifferentOriginFromSender, origin.String(), sender.String()) } diff --git a/precompiles/ics20/utils_test.go b/precompiles/ics20/utils_test.go index c04f2d4246..bbac64d951 100644 --- a/precompiles/ics20/utils_test.go +++ b/precompiles/ics20/utils_test.go @@ -273,7 +273,7 @@ func (s *PrecompileTestSuite) NewTestChainWithValSet(coord *ibctesting.Coordinat s.app.FeeMarketKeeper.SetBlockGasWanted(s.ctx, 0) s.app.FeeMarketKeeper.SetTransientBlockGasWanted(s.ctx, 0) - precompile, err := ics20.NewPrecompile(s.app.TransferKeeper, s.app.IBCKeeper.ChannelKeeper, s.app.AuthzKeeper) + precompile, err := ics20.NewPrecompile(s.app.StakingKeeper, s.app.TransferKeeper, s.app.IBCKeeper.ChannelKeeper, s.app.AuthzKeeper) s.Require().NoError(err) s.precompile = precompile diff --git a/tests/nix_tests/hardhat/contracts/ICS20FromContract.sol b/tests/nix_tests/hardhat/contracts/ICS20FromContract.sol new file mode 100644 index 0000000000..6c57295965 --- /dev/null +++ b/tests/nix_tests/hardhat/contracts/ICS20FromContract.sol @@ -0,0 +1,62 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity >=0.8.18; + +import "./evmos/ics20/ICS20I.sol"; +import "./evmos/common/Types.sol"; + + +contract ICS20FromContract { + int64 public counter; + + function balanceOfContract() public view returns (uint256) { + return address(this).balance; + } + + function deposit() public payable {} + + function transfer( + string memory sourcePort, + string memory sourceChannel, + string memory denom, + uint256 amount, + string memory receiver + ) external { + counter += 1; + Height memory timeoutHeight = Height(100, 100); + ICS20_CONTRACT.transfer( + sourcePort, + sourceChannel, + denom, + amount, + address(this), + receiver, + timeoutHeight, + 0, + "" + ); + counter -= 1; + } + + function transferFromEOA( + string memory sourcePort, + string memory sourceChannel, + string memory denom, + uint256 amount, + string memory receiver + ) external { + counter += 1; + Height memory timeoutHeight = Height(100, 100); + ICS20_CONTRACT.transfer( + sourcePort, + sourceChannel, + denom, + amount, + msg.sender, + receiver, + timeoutHeight, + 0, + "" + ); + counter -= 1; + } +} diff --git a/tests/nix_tests/test_ics20_precompile.py b/tests/nix_tests/test_ics20_precompile.py new file mode 100644 index 0000000000..bb4543e6fa --- /dev/null +++ b/tests/nix_tests/test_ics20_precompile.py @@ -0,0 +1,208 @@ +import pytest + +from .ibc_utils import EVMOS_IBC_DENOM, assert_ready, get_balance, prepare_network +from .network import Evmos +from .utils import ( + ADDRS, + CONTRACTS, + KEYS, + deploy_contract, + get_precompile_contract, + send_transaction, + wait_for_fn, +) + + +@pytest.fixture(scope="module", params=["evmos", "evmos-rocksdb"]) +def ibc(request, tmp_path_factory): + """ + Prepares the network. + """ + name = "ibc-precompile" + evmos_build = request.param + path = tmp_path_factory.mktemp(name) + network = prepare_network(path, name, [evmos_build, "chainmain"]) + yield from network + + +def test_ibc_transfer_from_contract(ibc): + """Test ibc transfer from contract""" + assert_ready(ibc) + + evmos: Evmos = ibc.chains["evmos"] + w3 = evmos.w3 + + dst_addr = ibc.chains["chainmain"].cosmos_cli().address("signer2") + amt = 1000000000000000000 + src_denom = "aevmos" + gas_limit = 200_000 + + pc = get_precompile_contract(ibc.chains["evmos"].w3, "ICS20I") + evmos_gas_price = ibc.chains["evmos"].w3.eth.gas_price + + src_adr = ibc.chains["evmos"].cosmos_cli().address("signer2") + + # Deployment of contracts and initial checks + eth_contract, tx_receipt = deploy_contract(w3, CONTRACTS["ICS20FromContract"]) + assert tx_receipt.status == 1 + + counter = eth_contract.functions.counter().call() + assert counter == 0 + + # Approve the contract to spend the src_denom + approve_tx = pc.functions.approve( + eth_contract.address, [["transfer", "channel-0", [[src_denom, amt]], []]] + ).build_transaction( + { + "from": ADDRS["signer2"], + "gasPrice": evmos_gas_price, + "gas": gas_limit, + } + ) + tx_receipt = send_transaction(ibc.chains["evmos"].w3, approve_tx, KEYS["signer2"]) + assert tx_receipt.status == 1 + + def check_allowance_set(): + new_allowance = pc.functions.allowance( + eth_contract.address, ADDRS["signer2"] + ).call() + return new_allowance != [] + + wait_for_fn("allowance has changed", check_allowance_set) + + src_amount_evmos_prev = get_balance(ibc.chains["evmos"], src_adr, src_denom) + # Deposit into the contract + deposit_tx = eth_contract.functions.deposit().build_transaction( + { + "from": ADDRS["signer2"], + "value": amt, + "gas": gas_limit, + "gasPrice": evmos_gas_price, + } + ) + deposit_receipt = send_transaction( + ibc.chains["evmos"].w3, deposit_tx, KEYS["signer2"] + ) + assert deposit_receipt.status == 1 + fees = deposit_receipt.gasUsed * evmos_gas_price + + def check_contract_balance(): + new_contract_balance = eth_contract.functions.balanceOfContract().call() + return new_contract_balance > 0 + + wait_for_fn("contract balance change", check_contract_balance) + + # Calling the actual transfer function on the custom contract + send_tx = eth_contract.functions.transfer( + "transfer", "channel-0", src_denom, amt, dst_addr + ).build_transaction( + { + "from": ADDRS["signer2"], + "gasPrice": evmos_gas_price, + "gas": gas_limit, + } + ) + receipt = send_transaction(ibc.chains["evmos"].w3, send_tx, KEYS["signer2"]) + assert receipt.status == 1 + fees += receipt.gasUsed * evmos_gas_price + + final_dest_balance = 0 + + def check_dest_balance(): + nonlocal final_dest_balance + final_dest_balance = get_balance( + ibc.chains["chainmain"], dst_addr, EVMOS_IBC_DENOM + ) + return final_dest_balance > 0 + + # check balance of destination + wait_for_fn("destination balance change", check_dest_balance) + assert final_dest_balance == amt + + # check balance of contract + final_contract_balance = eth_contract.functions.balanceOfContract().call() + assert final_contract_balance == 0 + + src_amount_evmos = get_balance(ibc.chains["evmos"], src_adr, src_denom) + assert src_amount_evmos == src_amount_evmos_prev - amt - fees + + # check counter of contract + counter_after = eth_contract.functions.counter().call() + assert counter_after == 0 + + +def test_ibc_transfer_from_eoa_through_contract(ibc): + """Test ibc transfer from contract""" + assert_ready(ibc) + + evmos: Evmos = ibc.chains["evmos"] + w3 = evmos.w3 + + amt = 1000000000000000000 + src_denom = "aevmos" + gas_limit = 200_000 + evmos_gas_price = ibc.chains["evmos"].w3.eth.gas_price + + dst_addr = ibc.chains["chainmain"].cosmos_cli().address("signer2") + src_adr = ibc.chains["evmos"].cosmos_cli().address("signer2") + + # Deployment of contracts and initial checks + eth_contract, tx_receipt = deploy_contract(w3, CONTRACTS["ICS20FromContract"]) + assert tx_receipt.status == 1 + + counter = eth_contract.functions.counter().call() + assert counter == 0 + + pc = get_precompile_contract(ibc.chains["evmos"].w3, "ICS20I") + # Approve the contract to spend the src_denom + approve_tx = pc.functions.approve( + eth_contract.address, [["transfer", "channel-0", [[src_denom, amt]], []]] + ).build_transaction( + { + "from": ADDRS["signer2"], + "gasPrice": evmos_gas_price, + "gas": gas_limit, + } + ) + tx_receipt = send_transaction(ibc.chains["evmos"].w3, approve_tx, KEYS["signer2"]) + assert tx_receipt.status == 1 + + def check_allowance_set(): + new_allowance = pc.functions.allowance( + eth_contract.address, ADDRS["signer2"] + ).call() + return new_allowance != [] + + wait_for_fn("allowance has changed", check_allowance_set) + + src_starting_balance = get_balance(ibc.chains["evmos"], src_adr, "aevmos") + dest_starting_balance = get_balance( + ibc.chains["chainmain"], dst_addr, EVMOS_IBC_DENOM + ) + # Calling the actual transfer function on the custom contract + send_tx = eth_contract.functions.transferFromEOA( + "transfer", "channel-0", src_denom, amt, dst_addr + ).build_transaction( + {"from": ADDRS["signer2"], "gasPrice": evmos_gas_price, "gas": gas_limit} + ) + receipt = send_transaction(ibc.chains["evmos"].w3, send_tx, KEYS["signer2"]) + assert receipt.status == 1 + fees = receipt.gasUsed * evmos_gas_price + + final_dest_balance = dest_starting_balance + + def check_dest_balance(): + nonlocal final_dest_balance + final_dest_balance = get_balance( + ibc.chains["chainmain"], dst_addr, EVMOS_IBC_DENOM + ) + return final_dest_balance > dest_starting_balance + + wait_for_fn("destination balance change", check_dest_balance) + assert final_dest_balance == dest_starting_balance + amt + + src_final_amount_evmos = get_balance(ibc.chains["evmos"], src_adr, src_denom) + assert src_final_amount_evmos == src_starting_balance - amt - fees + + counter_after = eth_contract.functions.counter().call() + assert counter_after == 0 diff --git a/tests/nix_tests/test_precompiles.py b/tests/nix_tests/test_precompiles.py index f8bfd9ac7d..e9c0efdb4d 100644 --- a/tests/nix_tests/test_precompiles.py +++ b/tests/nix_tests/test_precompiles.py @@ -67,7 +67,7 @@ def test_ibc_transfer(ibc): assert receipt.status == 1 # check gas used - assert receipt.gasUsed == 48184 + assert receipt.gasUsed == 49307 # check gas estimation is accurate assert receipt.gasUsed == gas_estimation diff --git a/tests/nix_tests/utils.py b/tests/nix_tests/utils.py index 2689c19e94..70710c5bb7 100644 --- a/tests/nix_tests/utils.py +++ b/tests/nix_tests/utils.py @@ -10,10 +10,12 @@ from pathlib import Path import bech32 +import requests from dateutil.parser import isoparse from dotenv import load_dotenv from eth_account import Account from hexbytes import HexBytes +from pystarport import ports from pystarport.cluster import SUPERVISOR_CONFIG_FILE from web3 import Web3 from web3._utils.transactions import fill_nonce, fill_transaction_defaults @@ -39,6 +41,7 @@ "TestChainID": "ChainID.sol", "Mars": "Mars.sol", "StateContract": "StateContract.sol", + "ICS20FromContract": "ICS20FromContract.sol", "ICS20I": "evmos/ics20/ICS20I.sol", "DistributionI": "evmos/distribution/DistributionI.sol", "StakingI": "evmos/staking/StakingI.sol", @@ -516,3 +519,16 @@ def erc20_balance(w3, erc20_contract_addr, addr): info = json.loads(CONTRACTS["IERC20"].read_text()) contract = w3.eth.contract(erc20_contract_addr, abi=info["abi"]) return contract.functions.balanceOf(addr).call() + + +def debug_trace_tx(evmos, tx_hash: str): + url = f"http://127.0.0.1:{ports.evmrpc_port(evmos.base_port(0))}" + params = { + "method": "debug_traceTransaction", + "params": [tx_hash, {"tracer": "callTracer"}], + "id": 1, + "jsonrpc": "2.0", + } + rsp = requests.post(url, json=params) + assert rsp.status_code == 200 + return rsp.json()["result"] diff --git a/x/evm/keeper/precompiles.go b/x/evm/keeper/precompiles.go index 581d7489a2..e96ffba1c5 100644 --- a/x/evm/keeper/precompiles.go +++ b/x/evm/keeper/precompiles.go @@ -64,7 +64,7 @@ func AvailablePrecompiles( panic(fmt.Errorf("failed to instantiate distribution precompile: %w", err)) } - ibcTransferPrecompile, err := ics20precompile.NewPrecompile(transferKeeper, channelKeeper, authzKeeper) + ibcTransferPrecompile, err := ics20precompile.NewPrecompile(stakingKeeper, transferKeeper, channelKeeper, authzKeeper) if err != nil { panic(fmt.Errorf("failed to instantiate ICS20 precompile: %w", err)) } From eb9d6b1996bef79e70003652ef13dfb345116c0e Mon Sep 17 00:00:00 2001 From: tcpdumppy <847462026@qq.com> Date: Wed, 5 Jun 2024 04:00:25 +0900 Subject: [PATCH 270/345] chore: make function comments match function names (#2598) Signed-off-by: tcpdumppy <847462026@qq.com> --- app/post/setup_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/post/setup_test.go b/app/post/setup_test.go index 9be087b45d..8c49764687 100644 --- a/app/post/setup_test.go +++ b/app/post/setup_test.go @@ -90,7 +90,7 @@ func (s *PostTestSuite) BuildEthTx() sdk.Tx { return tx } -// BuildCosmosTxWithSendMsg is an utils function to create an sdk.Tx containing +// BuildCosmosTxWithNSendMsg is an utils function to create an sdk.Tx containing // a single message of type MsgSend from the bank module. func (s *PostTestSuite) BuildCosmosTxWithNSendMsg(n int, feeAmount sdk.Coins) sdk.Tx { messages := make([]sdk.Msg, n) @@ -112,7 +112,7 @@ func (s *PostTestSuite) BuildCosmosTxWithNSendMsg(n int, feeAmount sdk.Coins) sd return s.txBuilder.GetTx() } -// MintCoinForFeeCollector allows to mint a specific amount of coins from the bank +// MintCoinsForFeeCollector allows to mint a specific amount of coins from the bank // and to transfer them to the FeeCollector. func (s *PostTestSuite) MintCoinsForFeeCollector(amount sdk.Coins) { // Minting tokens for the FeeCollector to simulate fee accrued. From 5ab9bb26ef5fa0d6c458d847846deea6af9c0729 Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Wed, 5 Jun 2024 13:52:46 +0200 Subject: [PATCH 271/345] fix(docker): Update Git version in Dockerfile (#2601) fix docker build --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 02937852fa..da0d3fefc1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,7 +7,7 @@ WORKDIR /go/src/github.com/evmos/evmos COPY go.mod go.sum ./ -RUN set -eux; apk add --no-cache ca-certificates=20240226-r0 build-base=0.5-r3 git=2.45.1-r0 linux-headers=6.6-r0 bash=5.2.26-r0 +RUN set -eux; apk add --no-cache ca-certificates=20240226-r0 build-base=0.5-r3 git=2.45.2-r0 linux-headers=6.6-r0 bash=5.2.26-r0 RUN --mount=type=bind,target=. --mount=type=secret,id=GITHUB_TOKEN \ git config --global url."https://$(cat /run/secrets/GITHUB_TOKEN)@github.com/".insteadOf "https://github.com/"; \ From 5f0e5e46669d5d7961962c828a1683b65758e87a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 Jun 2024 14:19:01 -0300 Subject: [PATCH 272/345] build(deps): bump golang from 1.22.3-alpine3.20 to 1.22.4-alpine3.20 (#2605) Bumps golang from 1.22.3-alpine3.20 to 1.22.4-alpine3.20. --- updated-dependencies: - dependency-name: golang dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index da0d3fefc1..e0a6ad76bc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.22.3-alpine3.20 AS build-env +FROM golang:1.22.4-alpine3.20 AS build-env ARG DB_BACKEND=goleveldb ARG ROCKSDB_VERSION="9.1.1" From 4d3e86951ab51b5864202e7c2859e5a5eebd40e7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 Jun 2024 17:31:59 +0000 Subject: [PATCH 273/345] build(deps): bump golang.org/x/net from 0.25.0 to 0.26.0 (#2604) * build(deps): bump golang.org/x/net from 0.25.0 to 0.26.0 Bumps [golang.org/x/net](https://github.com/golang/net) from 0.25.0 to 0.26.0. - [Commits](https://github.com/golang/net/compare/v0.25.0...v0.26.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * update gomod2nix.toml file --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- go.mod | 12 ++++++------ go.sum | 24 ++++++++++++------------ gomod2nix.toml | 24 ++++++++++++------------ 3 files changed, 30 insertions(+), 30 deletions(-) diff --git a/go.mod b/go.mod index 15a55380a7..996d6db082 100644 --- a/go.mod +++ b/go.mod @@ -45,9 +45,9 @@ require ( github.com/tyler-smith/go-bip39 v1.1.0 github.com/zondax/hid v0.9.2 go.opencensus.io v0.24.0 - golang.org/x/crypto v0.23.0 - golang.org/x/net v0.25.0 - golang.org/x/text v0.15.0 + golang.org/x/crypto v0.24.0 + golang.org/x/net v0.26.0 + golang.org/x/text v0.16.0 google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237 google.golang.org/grpc v1.64.0 google.golang.org/protobuf v1.34.1 @@ -235,10 +235,10 @@ require ( golang.org/x/mod v0.17.0 // indirect golang.org/x/oauth2 v0.18.0 // indirect golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/term v0.20.0 // indirect + golang.org/x/sys v0.21.0 // indirect + golang.org/x/term v0.21.0 // indirect golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.21.0 // indirect + golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect google.golang.org/api v0.169.0 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect diff --git a/go.sum b/go.sum index 2cdd0a05e6..ab56aa3737 100644 --- a/go.sum +++ b/go.sum @@ -1224,8 +1224,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= +golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1333,8 +1333,8 @@ golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1483,16 +1483,16 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= -golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= +golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1507,8 +1507,8 @@ golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1579,8 +1579,8 @@ golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.21.0 h1:qc0xYgIbsSDt9EyWz05J5wfa7LOVW0YTLOXrqdLAWIw= -golang.org/x/tools v0.21.0/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/gomod2nix.toml b/gomod2nix.toml index c2be08e962..bef92ac9a0 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -661,8 +661,8 @@ schema = 3 version = "v1.24.0" hash = "sha256-FHP0hg+i7+wxCsM0u/5hQcgvvr3D+lq8o/7E/HkaW4s=" [mod."golang.org/x/crypto"] - version = "v0.23.0" - hash = "sha256-6hZjb/OazWFBef0C/aH63l49YQnzCh2vpIduzyfSSG8=" + version = "v0.24.0" + hash = "sha256-wpxJApwSmmn9meVdpFdOU0gzeJbIXcKuFfYUUVogSss=" [mod."golang.org/x/exp"] version = "v0.0.0-20230711153332-06a737ee72cb" hash = "sha256-Cbw10ZJ+jATPV232G47xZrn6ExO1FDtiT6nlMRCH7EI=" @@ -670,8 +670,8 @@ schema = 3 version = "v0.17.0" hash = "sha256-CLaPeF6uTFuRDv4oHwOQE6MCMvrzkUjWN3NuyywZjKU=" [mod."golang.org/x/net"] - version = "v0.25.0" - hash = "sha256-IjFfXLYNj27WLF7vpkZ6mfFXBnp+7QER3OQ0RgjxN54=" + version = "v0.26.0" + hash = "sha256-WfY33QERNbcIiDkH3+p2XGrAVqvWBQfc8neUt6TH6dQ=" [mod."golang.org/x/oauth2"] version = "v0.18.0" hash = "sha256-TX4CvtvHU+SGSmqlxaQqlgJjlJiOtLGYAZa0zeBfZak=" @@ -679,20 +679,20 @@ schema = 3 version = "v0.7.0" hash = "sha256-2ETllEu2GDWoOd/yMkOkLC2hWBpKzbVZ8LhjLu0d2A8=" [mod."golang.org/x/sys"] - version = "v0.20.0" - hash = "sha256-mowlaoG2k4n1c1rApWef5EMiXd3I77CsUi8jPh6pTYA=" + version = "v0.21.0" + hash = "sha256-gapzPWuEqY36V6W2YhIDYR49sEvjJRd7bSuf9K1f4JY=" [mod."golang.org/x/term"] - version = "v0.20.0" - hash = "sha256-kU+OVJbYktTIn4ZTAdomsOjL069Vj45sdroEMRKaRDI=" + version = "v0.21.0" + hash = "sha256-zRm7uPBM1+TJkODYHkk/BtN3la5QAaSgslE2hSTm27Y=" [mod."golang.org/x/text"] - version = "v0.15.0" - hash = "sha256-pBnj0AEkfkvZf+3bN7h6epCD2kurw59clDP7yWvxKlk=" + version = "v0.16.0" + hash = "sha256-hMTO45upjEuA4sJzGplJT+La2n3oAfHccfYWZuHcH+8=" [mod."golang.org/x/time"] version = "v0.5.0" hash = "sha256-W6RgwgdYTO3byIPOFxrP2IpAZdgaGowAaVfYby7AULU=" [mod."golang.org/x/tools"] - version = "v0.21.0" - hash = "sha256-TU0gAxUX410AYc/nMxxZiaqXeORih1cXbKh3sxKufVg=" + version = "v0.21.1-0.20240508182429-e35e4ccd0d2d" + hash = "sha256-KfnS+3fREPAWQUBoUedPupQp9yLrugxMmmEoHvyzKNE=" [mod."google.golang.org/api"] version = "v0.169.0" hash = "sha256-7+EAvbTTnUutkXpQBbxPSmZTS5P0mrKTiFooMI81w0k=" From 81928f2cdbc7df09682e518131910c70992b08a8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 Jun 2024 20:24:22 +0200 Subject: [PATCH 274/345] build(deps): bump golang.org/x/text from 0.15.0 to 0.16.0 (#2603) * build(deps): bump golang.org/x/text from 0.15.0 to 0.16.0 Bumps [golang.org/x/text](https://github.com/golang/text) from 0.15.0 to 0.16.0. - [Release notes](https://github.com/golang/text/releases) - [Commits](https://github.com/golang/text/compare/v0.15.0...v0.16.0) --- updated-dependencies: - dependency-name: golang.org/x/text dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * update gomod2nix.toml file --------- Signed-off-by: dependabot[bot] Signed-off-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> From 693844033089c55323b7decaaf8547f455ae3a8d Mon Sep 17 00:00:00 2001 From: Freddy Caceres Date: Thu, 6 Jun 2024 15:05:56 +0200 Subject: [PATCH 275/345] feat(evm): Add PermissionsPolicy for permissioned EVM (#2538) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(evm): Add Create OpHook for permissioned contract deployment * remove go.mod replae * rename function * permission policy implementaion * remove enable create and call parmas * add validate * revert go.mod replace * fix proto names * update geth version * fix lint * policy unit tests * integration tests * fix tests * fix test * rename permission to accesscontrol * fix params tests * fix lint * fix test * proto lint * add licenses * rename param * fix proto lint issue * add balance checks to mint * run make format * gomod2nix generate * add store migration to v7 * fix comment * fix proto-lint issues * fix proto names on migration * add changelog entry * fix migration tests * add address list for permissionless * add integration tests * update tests * adding necessary tests * update tests * run make format * fix lint * small refractor * expect common.Address instead of string * update comments * fix review comments --------- Co-authored-by: Ramiro Carlucho Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: facs95 Co-authored-by: tom Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> --- CHANGELOG.md | 1 + app/ante/evm/04_validate.go | 19 +- app/ante/evm/04_validate_test.go | 14 +- app/ante/evm/ante_test.go | 38 +- client/docs/swagger-ui/swagger.json | 1617 +++---- go.mod | 2 +- go.sum | 4 +- gomod2nix.toml | 4 +- proto/buf.yaml | 1 + proto/ethermint/evm/v1/evm.proto | 41 +- testutil/integration/evmos/factory/factory.go | 4 +- x/erc20/keeper/evm_test.go | 2 +- x/evm/keeper/grpc_query_test.go | 60 +- x/evm/keeper/hooks_test.go | 90 - x/evm/keeper/integration_test.go | 474 +- x/evm/keeper/migrations.go | 6 + x/evm/keeper/opcodes_hooks.go | 45 + x/evm/keeper/params_test.go | 24 +- x/evm/keeper/setup_test.go | 8 + x/evm/keeper/state_transition.go | 13 +- x/evm/keeper/state_transition_test.go | 40 +- x/evm/migrations/v4/migrate.go | 9 - x/evm/migrations/v4/migrate_test.go | 2 - x/evm/migrations/v5/migrate.go | 2 - x/evm/migrations/v5/migrate_test.go | 2 - x/evm/migrations/v6/migrate.go | 2 - x/evm/migrations/v6/migrate_test.go | 4 - x/evm/migrations/v7/migrate.go | 69 + x/evm/migrations/v7/migrate_test.go | 62 + x/evm/migrations/v7/types/evm.pb.go | 4175 +++++++++++++++++ x/evm/module.go | 6 +- x/evm/types/evm.pb.go | 871 +++- x/evm/types/params.go | 120 +- x/evm/types/params_legacy.go | 2 - x/evm/types/params_test.go | 4 +- x/evm/types/permissions.go | 115 + x/evm/types/permissions_test.go | 233 + 37 files changed, 6732 insertions(+), 1453 deletions(-) delete mode 100644 x/evm/keeper/hooks_test.go create mode 100644 x/evm/keeper/opcodes_hooks.go create mode 100644 x/evm/migrations/v7/migrate.go create mode 100644 x/evm/migrations/v7/migrate_test.go create mode 100644 x/evm/migrations/v7/types/evm.pb.go create mode 100644 x/evm/types/permissions.go create mode 100644 x/evm/types/permissions_test.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ee53a03f3..09873bff39 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -55,6 +55,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (precompiles) [#2529](https://github.com/evmos/evmos/pull/2529) Remove Outposts precompiles. - (upgrade) [#2533](https://github.com/evmos/evmos/pull/2533) Add upgrade handler for v19. - (staking) [#2051](https://github.com/evmos/evmos/pull/2051) Implement the `EditValidator` function for staking precompiled contract. +- (evm) [2538](https://github.com/evmos/evmos/pull/2538) Add Permissions Policy for permissioned EVM. ### Bug Fixes diff --git a/app/ante/evm/04_validate.go b/app/ante/evm/04_validate.go index fe321412a2..5a907d2972 100644 --- a/app/ante/evm/04_validate.go +++ b/app/ante/evm/04_validate.go @@ -28,8 +28,7 @@ func ValidateMsg( return checkDisabledCreateCall( txData, - evmParams.EnableCreate, - evmParams.EnableCall, + &evmParams.AccessControl, ) } @@ -37,22 +36,18 @@ func ValidateMsg( // and it is disabled through governance func checkDisabledCreateCall( txData evmtypes.TxData, - enableCreate, - enableCall bool, + permissions *evmtypes.AccessControl, ) error { to := txData.GetTo() - data := txData.GetData() - // If its not a contract creation or contract call this check is irrelevant - if data == nil { - return nil - } + blockCreate := permissions.Create.AccessType == evmtypes.AccessTypeRestricted + blockCall := permissions.Call.AccessType == evmtypes.AccessTypeRestricted // return error if contract creation or call are disabled through governance // and the transaction is trying to create a contract or call a contract - if !enableCreate && to == nil { + if blockCreate && to == nil { return errorsmod.Wrap(evmtypes.ErrCreateDisabled, "failed to create new contract") - } else if !enableCall && to != nil { - return errorsmod.Wrap(evmtypes.ErrCallDisabled, "failed to call contract") + } else if blockCall && to != nil { + return errorsmod.Wrap(evmtypes.ErrCallDisabled, "failed to perform a call") } return nil } diff --git a/app/ante/evm/04_validate_test.go b/app/ante/evm/04_validate_test.go index 196908ec66..a6efb8eba0 100644 --- a/app/ante/evm/04_validate_test.go +++ b/app/ante/evm/04_validate_test.go @@ -54,15 +54,15 @@ func (suite *EvmAnteTestSuite) TestValidateMsg() { }, { name: "success: transfer with disable call and create", - expectedError: nil, + expectedError: evmtypes.ErrCallDisabled, getFunctionParams: func() validateMsgParams { txArgs := getTxByType("transfer", keyring.GetAddr(1)) txData, err := txArgs.ToTxData() suite.Require().NoError(err) params := evmtypes.DefaultParams() - params.EnableCall = false - params.EnableCreate = false + params.AccessControl.Call.AccessType = evmtypes.AccessTypeRestricted + params.AccessControl.Create.AccessType = evmtypes.AccessTypeRestricted return validateMsgParams{ evmParams: params, @@ -94,7 +94,7 @@ func (suite *EvmAnteTestSuite) TestValidateMsg() { suite.Require().NoError(err) params := evmtypes.DefaultParams() - params.EnableCreate = false + params.AccessControl.Create.AccessType = evmtypes.AccessTypeRestricted return validateMsgParams{ evmParams: params, @@ -112,7 +112,7 @@ func (suite *EvmAnteTestSuite) TestValidateMsg() { suite.Require().NoError(err) params := evmtypes.DefaultParams() - params.EnableCall = false + params.AccessControl.Call.AccessType = evmtypes.AccessTypeRestricted return validateMsgParams{ evmParams: params, @@ -144,7 +144,7 @@ func (suite *EvmAnteTestSuite) TestValidateMsg() { suite.Require().NoError(err) params := evmtypes.DefaultParams() - params.EnableCall = false + params.AccessControl.Call.AccessType = evmtypes.AccessTypeRestricted return validateMsgParams{ evmParams: params, @@ -162,7 +162,7 @@ func (suite *EvmAnteTestSuite) TestValidateMsg() { suite.Require().NoError(err) params := evmtypes.DefaultParams() - params.EnableCreate = false + params.AccessControl.Create.AccessType = evmtypes.AccessTypeRestricted return validateMsgParams{ evmParams: params, diff --git a/app/ante/evm/ante_test.go b/app/ante/evm/ante_test.go index c8b9cc3ddd..0ef3b24640 100644 --- a/app/ante/evm/ante_test.go +++ b/app/ante/evm/ante_test.go @@ -1165,11 +1165,10 @@ func (suite *AnteTestSuite) TestAnteHandlerWithParams() { } testCases := []struct { - name string - txFn func() sdk.Tx - enableCall bool - enableCreate bool - expErr error + name string + txFn func() sdk.Tx + permissions evmtypes.AccessControl + expErr error }{ { "fail - Contract Creation Disabled", @@ -1180,7 +1179,16 @@ func (suite *AnteTestSuite) TestAnteHandlerWithParams() { tx := suite.CreateTestTx(signedContractTx, privKey, 1, false) return tx }, - true, false, + evmtypes.AccessControl{ + Create: evmtypes.AccessControlType{ + AccessType: evmtypes.AccessTypeRestricted, + AccessControlList: evmtypes.DefaultCreateAllowlistAddresses, + }, + Call: evmtypes.AccessControlType{ + AccessType: evmtypes.AccessTypePermissionless, + AccessControlList: evmtypes.DefaultCreateAllowlistAddresses, + }, + }, evmtypes.ErrCreateDisabled, }, { @@ -1192,7 +1200,7 @@ func (suite *AnteTestSuite) TestAnteHandlerWithParams() { tx := suite.CreateTestTx(signedContractTx, privKey, 1, false) return tx }, - true, true, + evmtypes.DefaultAccessControl, nil, }, { @@ -1204,7 +1212,16 @@ func (suite *AnteTestSuite) TestAnteHandlerWithParams() { tx := suite.CreateTestTx(signedTx, privKey, 1, false) return tx }, - false, true, + evmtypes.AccessControl{ + Create: evmtypes.AccessControlType{ + AccessType: evmtypes.AccessTypePermissionless, + AccessControlList: evmtypes.DefaultCreateAllowlistAddresses, + }, + Call: evmtypes.AccessControlType{ + AccessType: evmtypes.AccessTypeRestricted, + AccessControlList: evmtypes.DefaultCreateAllowlistAddresses, + }, + }, evmtypes.ErrCallDisabled, }, { @@ -1216,7 +1233,7 @@ func (suite *AnteTestSuite) TestAnteHandlerWithParams() { tx := suite.CreateTestTx(signedTx, privKey, 1, false) return tx }, - true, true, + evmtypes.DefaultAccessControl, nil, }, } @@ -1224,8 +1241,7 @@ func (suite *AnteTestSuite) TestAnteHandlerWithParams() { for _, tc := range testCases { suite.Run(tc.name, func() { suite.evmParamsOption = func(params *evmtypes.Params) { - params.EnableCall = tc.enableCall - params.EnableCreate = tc.enableCreate + params.AccessControl = tc.permissions } suite.SetupTest() // reset diff --git a/client/docs/swagger-ui/swagger.json b/client/docs/swagger-ui/swagger.json index b819a7d576..9d09ddcf80 100644 --- a/client/docs/swagger-ui/swagger.json +++ b/client/docs/swagger-ui/swagger.json @@ -7,22 +7,19 @@ }, "//": [ "checkov:skip=CKV_OPENAPI_13: The API is public, no need for authentication", - "checkov:skip=CKV_OPENAPI_6: The API is public, no need for authentication" + "checkov:skip=CKV_OPENAPI_6: The API is public, no need for authentication", + "checkov:skip=CKV_OPENAPI_4: The API is public, no need for authentication" ], "securityDefinitions": { "default": { "type": "basic" } }, - "security": { - "default": [] - }, "paths": { "/evmos/epochs/v1/current_epoch": { "get": { "summary": "CurrentEpoch provide current epoch of specified identifier", "operationId": "CurrentEpoch", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -55,7 +52,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -82,14 +78,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/evmos/epochs/v1/epochs": { "get": { "summary": "EpochInfos provide running epochInfos", "operationId": "EpochInfos", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -98,7 +95,6 @@ "properties": { "epochs": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -176,7 +172,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -234,14 +229,15 @@ "type": "boolean" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/evmos/erc20/v1/params": { "get": { "summary": "Params retrieves the erc20 module params", "operationId": "ERC20Params", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -283,7 +279,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -301,14 +296,15 @@ } } }, - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/evmos/erc20/v1/token_pairs": { "get": { "summary": "TokenPairs retrieves registered token pairs", "operationId": "TokenPairs", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -317,7 +313,6 @@ "properties": { "token_pairs": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -386,7 +381,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -444,14 +438,15 @@ "type": "boolean" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/evmos/erc20/v1/token_pairs/{token}": { "get": { "summary": "TokenPair retrieves a registered token pair", "operationId": "TokenPair", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -509,7 +504,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -536,14 +530,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/evmos/inflation/v1/circulating_supply": { "get": { "summary": "CirculatingSupply retrieves the total number of tokens that are in\ncirculation (i.e. excluding unvested tokens).", "operationId": "CirculatingSupply", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -584,7 +579,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -602,14 +596,15 @@ } } }, - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/evmos/inflation/v1/epoch_mint_provision": { "get": { "summary": "EpochMintProvision retrieves current minting epoch provision value.", "operationId": "EpochMintProvision", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -649,7 +644,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -667,14 +661,15 @@ } } }, - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/evmos/inflation/v1/inflation_rate": { "get": { "summary": "InflationRate retrieves the inflation rate of the current period.", "operationId": "InflationRate", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -706,7 +701,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -724,14 +718,15 @@ } } }, - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/evmos/inflation/v1/params": { "get": { "summary": "Params retrieves the total set of minting parameters.", "operationId": "InflationParams", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -817,7 +812,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -835,14 +829,15 @@ } } }, - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/evmos/inflation/v1/period": { "get": { "summary": "Period retrieves current period.", "operationId": "Period", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -875,7 +870,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -893,14 +887,15 @@ } } }, - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/evmos/inflation/v1/skipped_epochs": { "get": { "summary": "SkippedEpochs retrieves the total number of skipped epochs.", "operationId": "SkippedEpochs", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -933,7 +928,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -951,14 +945,15 @@ } } }, - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/evmos/vesting/v2/balances/{address}": { "get": { "summary": "Balances retrieves the unvested, vested and locked tokens for a vesting account", "operationId": "Balances", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -967,7 +962,6 @@ "properties": { "locked": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -984,7 +978,6 @@ }, "unvested": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -1001,7 +994,6 @@ }, "vested": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -1037,7 +1029,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -1064,14 +1055,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/evmos/evm/v1/account/{address}": { "get": { "summary": "Account queries an Ethereum account.", "operationId": "Account", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -1112,7 +1104,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -1142,14 +1133,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/evmos/evm/v1/balances/{address}": { "get": { "summary": "Balance queries the balance of a the EVM denomination for a single\nEthAccount.", "operationId": "Balance", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -1181,7 +1173,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -1211,14 +1202,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/evmos/evm/v1/base_fee": { "get": { "summary": "BaseFee queries the base fee of the parent block of the current block,\nit's similar to feemarket module's method, but also checks london hardfork status.", "operationId": "BaseFee", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -1250,7 +1242,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -1271,14 +1262,15 @@ } } }, - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/evmos/evm/v1/codes/{address}": { "get": { "summary": "Code queries the balance of all coins for a single account.", "operationId": "Code", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -1311,7 +1303,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -1341,14 +1332,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/evmos/evm/v1/cosmos_account/{address}": { "get": { "summary": "CosmosAccount queries an Ethereum account's Cosmos Address.", "operationId": "CosmosAccount", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -1390,7 +1382,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -1420,14 +1411,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/evmos/evm/v1/estimate_gas": { "get": { "summary": "EstimateGas implements the `eth_estimateGas` rpc api", "operationId": "EstimateGas", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -1460,7 +1452,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -1515,14 +1506,15 @@ "format": "int64" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/evmos/evm/v1/eth_call": { "get": { "summary": "EthCall implements the `eth_call` rpc api", "operationId": "EthCall", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -1535,7 +1527,6 @@ }, "logs": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -1545,7 +1536,6 @@ }, "topics": { "type": "array", - "maxItems": 10, "items": { "type": "string" }, @@ -1623,7 +1613,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -1678,14 +1667,15 @@ "format": "int64" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/evmos/evm/v1/params": { "get": { "summary": "Params queries the parameters of x/evm module.", "operationId": "EvmParams", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -1700,17 +1690,8 @@ "type": "string", "description": "evm_denom represents the token denomination used to run the EVM state\ntransitions." }, - "enable_create": { - "type": "boolean", - "title": "enable_create toggles state transitions that use the vm.Create function" - }, - "enable_call": { - "type": "boolean", - "title": "enable_call toggles state transitions that use the vm.Call function" - }, "extra_eips": { "type": "array", - "maxItems": 10, "items": { "type": "string", "format": "int64" @@ -1806,7 +1787,6 @@ }, "active_precompiles": { "type": "array", - "maxItems": 10, "items": { "type": "string" }, @@ -1814,11 +1794,64 @@ }, "evm_channels": { "type": "array", - "maxItems": 10, "items": { "type": "string" }, "title": "evm_channels is the list of channel identifiers from EVM compatible chains" + }, + "access_control": { + "title": "access_control defines the permission policy of the EVM", + "type": "object", + "properties": { + "create": { + "title": "create defines the permission policy for creating contracts", + "type": "object", + "properties": { + "access_type": { + "title": "access_type defines which type of permission is required for the operation", + "type": "string", + "enum": [ + "ACCESS_TYPE_PERMISSIONLESS", + "ACCESS_TYPE_RESTRICTED", + "ACCESS_TYPE_PERMISSIONED" + ], + "default": "ACCESS_TYPE_PERMISSIONLESS", + "description": "- ACCESS_TYPE_PERMISSIONLESS: ACCESS_TYPE_PERMISSIONLESS does not restrict the operation to anyone\n - ACCESS_TYPE_RESTRICTED: ACCESS_TYPE_RESTRICTED restrict the operation to anyone\n - ACCESS_TYPE_PERMISSIONED: ACCESS_TYPE_PERMISSIONED only allows the operation for specific addresses" + }, + "allowlist_addresses": { + "type": "array", + "items": { + "type": "string" + }, + "title": "allowlist_addresses defines which addresses have permissions in case of permissioned access_type" + } + } + }, + "call": { + "title": "call defines the permission policy for calling contracts", + "type": "object", + "properties": { + "access_type": { + "title": "access_type defines which type of permission is required for the operation", + "type": "string", + "enum": [ + "ACCESS_TYPE_PERMISSIONLESS", + "ACCESS_TYPE_RESTRICTED", + "ACCESS_TYPE_PERMISSIONED" + ], + "default": "ACCESS_TYPE_PERMISSIONLESS", + "description": "- ACCESS_TYPE_PERMISSIONLESS: ACCESS_TYPE_PERMISSIONLESS does not restrict the operation to anyone\n - ACCESS_TYPE_RESTRICTED: ACCESS_TYPE_RESTRICTED restrict the operation to anyone\n - ACCESS_TYPE_PERMISSIONED: ACCESS_TYPE_PERMISSIONED only allows the operation for specific addresses" + }, + "allowlist_addresses": { + "type": "array", + "items": { + "type": "string" + }, + "title": "allowlist_addresses defines which addresses have permissions in case of permissioned access_type" + } + } + } + } } }, "title": "Params defines the EVM module parameters" @@ -1844,7 +1877,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -1865,14 +1897,15 @@ } } }, - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/evmos/evm/v1/storage/{address}/{key}": { "get": { "summary": "Storage queries the balance of all coins for a single account.", "operationId": "Storage", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -1904,7 +1937,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -1941,14 +1973,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/evmos/evm/v1/trace_block": { "get": { "summary": "TraceBlock implements the `debug_traceBlockByNumber` and `debug_traceBlockByHash` rpc api", "operationId": "TraceBlock", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -1981,7 +2014,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -2256,14 +2288,15 @@ "format": "int64" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/evmos/evm/v1/trace_tx": { "get": { "summary": "TraceTx implements the `debug_traceTransaction` rpc api", "operationId": "TraceTx", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -2296,7 +2329,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -2608,14 +2640,15 @@ "format": "int64" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/evmos/evm/v1/validator_account/{cons_address}": { "get": { "summary": "ValidatorAccount queries an Ethereum account's from a validator consensus\nAddress.", "operationId": "ValidatorAccount", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -2657,7 +2690,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -2687,14 +2719,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/evmos/feemarket/v1/base_fee": { "get": { "summary": "BaseFee queries the base fee of the parent block of the current block.", "operationId": "FeeMarketBaseFee", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -2726,7 +2759,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -2744,14 +2776,15 @@ } } }, - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/evmos/feemarket/v1/block_gas": { "get": { "summary": "BlockGas queries the gas used at a given block height", "operationId": "BlockGas", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -2784,7 +2817,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -2802,14 +2834,15 @@ } } }, - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/evmos/feemarket/v1/params": { "get": { "summary": "Params queries the parameters of x/feemarket module.", "operationId": "FeeMarketParams", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -2875,7 +2908,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -2893,14 +2925,15 @@ } } }, - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/ibc/apps/transfer/v1/channels/{channel_id}/ports/{port_id}/escrow_address": { "get": { "summary": "EscrowAddress returns the escrow address for a particular port and channel id.", "operationId": "EscrowAddress", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -2932,7 +2965,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -2966,14 +2998,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/ibc/apps/transfer/v1/denom_hashes/{trace}": { "get": { "summary": "DenomHash queries a denomination hash information.", "operationId": "DenomHash", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -3005,7 +3038,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -3032,14 +3064,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/ibc/apps/transfer/v1/denom_traces": { "get": { "summary": "DenomTraces queries all denomination traces.", "operationId": "DenomTraces", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -3048,7 +3081,6 @@ "properties": { "denom_traces": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -3102,7 +3134,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -3160,14 +3191,15 @@ "type": "boolean" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/ibc/apps/transfer/v1/denom_traces/{hash}": { "get": { "summary": "DenomTrace queries a denomination trace information.", "operationId": "DenomTrace", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -3209,7 +3241,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -3236,14 +3267,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/ibc/apps/transfer/v1/denoms/{denom}/total_escrow": { "get": { "summary": "TotalEscrowForDenom returns the total amount of tokens in escrow based on the denom.", "operationId": "TotalEscrowForDenom", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -3283,7 +3315,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -3309,14 +3340,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/ibc/apps/transfer/v1/params": { "get": { "summary": "Params queries all parameters of the ibc-transfer module.", "operationId": "TransferParams", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -3358,7 +3390,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -3376,14 +3407,15 @@ } } }, - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/ibc/core/client/v1/client_states": { "get": { "summary": "ClientStates queries all the IBC light clients of a chain.", "operationId": "ClientStates", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -3392,7 +3424,6 @@ "properties": { "client_states": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -3459,7 +3490,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -3520,14 +3550,15 @@ "type": "boolean" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/ibc/core/client/v1/client_states/{client_id}": { "get": { "summary": "ClientState queries an IBC light client.", "operationId": "ClientState", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -3593,7 +3624,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -3623,14 +3653,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/ibc/core/client/v1/client_status/{client_id}": { "get": { "summary": "Status queries the status of an IBC client.", "operationId": "ClientStatus", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -3661,7 +3692,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -3691,14 +3721,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/ibc/core/client/v1/consensus_states/{client_id}": { "get": { "summary": "ConsensusStates queries all the consensus state associated with a given\nclient.", "operationId": "ConsensusStates", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -3707,7 +3738,6 @@ "properties": { "consensus_states": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -3787,7 +3817,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -3855,14 +3884,15 @@ "type": "boolean" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/ibc/core/client/v1/consensus_states/{client_id}/heights": { "get": { "summary": "ConsensusStateHeights queries the height of every consensus states associated with a given client.", "operationId": "ConsensusStateHeights", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -3871,7 +3901,6 @@ "properties": { "consensus_state_heights": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -3929,7 +3958,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -3997,14 +4025,15 @@ "type": "boolean" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/ibc/core/client/v1/consensus_states/{client_id}/revision/{revision_number}/height/{revision_height}": { "get": { "summary": "ConsensusState queries a consensus state associated with a client state at\na given height.", "operationId": "ConsensusState", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -4070,7 +4099,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -4123,14 +4151,15 @@ "type": "boolean" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/ibc/core/client/v1/params": { "get": { "summary": "ClientParams queries all parameters of the ibc client submodule.", "operationId": "ClientParams", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -4143,7 +4172,6 @@ "properties": { "allowed_clients": { "type": "array", - "maxItems": 10, "items": { "type": "string" }, @@ -4172,7 +4200,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -4193,14 +4220,15 @@ } } }, - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/ibc/core/client/v1/upgraded_client_states": { "get": { "summary": "UpgradedClientState queries an Upgraded IBC light client.", "operationId": "UpgradedClientState", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -4244,7 +4272,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -4265,14 +4292,15 @@ } } }, - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/ibc/core/client/v1/upgraded_consensus_states": { "get": { "summary": "UpgradedConsensusState queries an Upgraded IBC consensus state.", "operationId": "UpgradedConsensusState", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -4316,7 +4344,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -4337,14 +4364,15 @@ } } }, - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/ibc/core/connection/v1/client_connections/{client_id}": { "get": { "summary": "ClientConnections queries the connection paths associated with a client\nstate.", "operationId": "ClientConnections", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -4353,7 +4381,6 @@ "properties": { "connection_paths": { "type": "array", - "maxItems": 10, "items": { "type": "string" }, @@ -4402,7 +4429,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -4432,14 +4458,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/ibc/core/connection/v1/connections": { "get": { "summary": "Connections queries all the IBC connections of a chain.", "operationId": "Connections", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -4448,7 +4475,6 @@ "properties": { "connections": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -4462,7 +4488,6 @@ }, "versions": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -4472,7 +4497,6 @@ }, "features": { "type": "array", - "maxItems": 10, "items": { "type": "string" }, @@ -4584,7 +4608,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -4645,14 +4668,15 @@ "type": "boolean" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/ibc/core/connection/v1/connections/{connection_id}": { "get": { "summary": "Connection queries an IBC connection end.", "operationId": "Connection", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -4669,7 +4693,6 @@ }, "versions": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -4679,7 +4702,6 @@ }, "features": { "type": "array", - "maxItems": 10, "items": { "type": "string" }, @@ -4777,7 +4799,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -4807,14 +4828,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/ibc/core/connection/v1/connections/{connection_id}/client_state": { "get": { "summary": "ConnectionClientState queries the client state associated with the\nconnection.", "operationId": "ConnectionClientState", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -4891,7 +4913,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -4921,14 +4942,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/ibc/core/connection/v1/connections/{connection_id}/consensus_state/revision/{revision_number}/height/{revision_height}": { "get": { "summary": "ConnectionConsensusState queries the consensus state associated with the\nconnection.", "operationId": "ConnectionConsensusState", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -4998,7 +5020,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -5042,14 +5063,15 @@ "format": "uint64" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/ibc/core/connection/v1/params": { "get": { "summary": "ConnectionParams queries all parameters of the ibc connection submodule.", "operationId": "ConnectionParams", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -5088,7 +5110,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -5109,14 +5130,15 @@ } } }, - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/ibc/core/channel/v1/channels": { "get": { "summary": "Channels queries all the IBC channels of a chain.", "operationId": "Channels", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -5125,7 +5147,6 @@ "properties": { "channels": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -5169,7 +5190,6 @@ }, "connection_hops": { "type": "array", - "maxItems": 10, "items": { "type": "string" }, @@ -5247,7 +5267,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -5308,14 +5327,15 @@ "type": "boolean" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}": { "get": { "summary": "Channel queries an IBC Channel.", "operationId": "Channel", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -5366,7 +5386,6 @@ }, "connection_hops": { "type": "array", - "maxItems": 10, "items": { "type": "string" }, @@ -5422,7 +5441,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -5459,14 +5477,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/client_state": { "get": { "summary": "ChannelClientState queries for the client state for the channel associated\nwith the provided channel identifiers.", "operationId": "ChannelClientState", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -5543,7 +5562,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -5580,14 +5598,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/consensus_state/revision/{revision_number}/height/{revision_height}": { "get": { "summary": "ChannelConsensusState queries for the consensus state for the channel\nassociated with the provided channel identifiers.", "operationId": "ChannelConsensusState", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -5657,7 +5676,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -5710,14 +5728,15 @@ "format": "uint64" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/next_sequence": { "get": { "summary": "NextSequenceReceive returns the next receive sequence for a given channel.", "operationId": "NextSequenceReceive", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -5772,7 +5791,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -5809,14 +5827,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_acknowledgements": { "get": { "summary": "PacketAcknowledgements returns all the packet acknowledgements associated\nwith a channel.", "operationId": "PacketAcknowledgements", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -5825,7 +5844,6 @@ "properties": { "acknowledgements": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -5906,7 +5924,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -5986,7 +6003,6 @@ "in": "query", "required": false, "type": "array", - "maxItems": 10, "items": { "type": "string", "format": "uint64" @@ -5994,14 +6010,15 @@ "collectionFormat": "multi" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_acks/{sequence}": { "get": { "summary": "PacketAcknowledgement queries a stored packet acknowledgement hash.", "operationId": "PacketAcknowledgement", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -6056,7 +6073,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -6101,14 +6117,15 @@ "format": "uint64" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_commitments": { "get": { "summary": "PacketCommitments returns all the packet commitments hashes associated\nwith a channel.", "operationId": "PacketCommitments", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -6117,7 +6134,6 @@ "properties": { "commitments": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -6198,7 +6214,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -6273,14 +6288,15 @@ "type": "boolean" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_commitments/{packet_ack_sequences}/unreceived_acks": { "get": { "summary": "UnreceivedAcks returns all the unreceived IBC acknowledgements associated\nwith a channel and sequences.", "operationId": "UnreceivedAcks", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -6289,7 +6305,6 @@ "properties": { "sequences": { "type": "array", - "maxItems": 10, "items": { "type": "string", "format": "uint64" @@ -6334,7 +6349,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -6376,7 +6390,6 @@ "in": "path", "required": true, "type": "array", - "maxItems": 10, "items": { "type": "string", "format": "uint64" @@ -6385,14 +6398,15 @@ "minItems": 1 } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_commitments/{packet_commitment_sequences}/unreceived_packets": { "get": { "summary": "UnreceivedPackets returns all the unreceived IBC packets associated with a\nchannel and sequences.", "operationId": "UnreceivedPackets", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -6401,7 +6415,6 @@ "properties": { "sequences": { "type": "array", - "maxItems": 10, "items": { "type": "string", "format": "uint64" @@ -6446,7 +6459,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -6488,7 +6500,6 @@ "in": "path", "required": true, "type": "array", - "maxItems": 10, "items": { "type": "string", "format": "uint64" @@ -6497,14 +6508,15 @@ "minItems": 1 } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_commitments/{sequence}": { "get": { "summary": "PacketCommitment queries a stored packet commitment hash.", "operationId": "PacketCommitment", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -6559,7 +6571,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -6604,14 +6615,15 @@ "format": "uint64" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_receipts/{sequence}": { "get": { "summary": "PacketReceipt queries if a given packet sequence has been received on the\nqueried chain", "operationId": "PacketReceipt", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -6665,7 +6677,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -6710,14 +6721,15 @@ "format": "uint64" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/ibc/core/channel/v1/connections/{connection}/channels": { "get": { "summary": "ConnectionChannels queries all the channels associated with a connection\nend.", "operationId": "ConnectionChannels", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -6726,7 +6738,6 @@ "properties": { "channels": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -6770,7 +6781,6 @@ }, "connection_hops": { "type": "array", - "maxItems": 10, "items": { "type": "string" }, @@ -6848,7 +6858,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -6916,7 +6925,9 @@ "type": "boolean" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/auth/v1beta1/account_info/{address}": { @@ -6924,7 +6935,6 @@ "summary": "AccountInfo queries account info which is common to all account types.", "description": "Since: cosmos-sdk 0.47", "operationId": "AccountInfo", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -6984,7 +6994,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -7014,7 +7023,9 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/auth/v1beta1/accounts": { @@ -7022,7 +7033,6 @@ "summary": "Accounts returns all the existing accounts.", "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.\n\nSince: cosmos-sdk 0.43", "operationId": "Accounts", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -7031,7 +7041,6 @@ "properties": { "accounts": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -7086,7 +7095,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -7147,14 +7155,15 @@ "type": "boolean" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/auth/v1beta1/accounts/{address}": { "get": { "summary": "Account returns account details based on address.", "operationId": "AuthAccount", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -7197,7 +7206,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -7227,7 +7235,9 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/auth/v1beta1/address_by_id/{id}": { @@ -7235,7 +7245,6 @@ "summary": "AccountAddressByID returns account address based on account number.", "description": "Since: cosmos-sdk 0.46.2", "operationId": "AccountAddressByID", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -7267,7 +7276,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -7306,7 +7314,9 @@ "format": "uint64" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/auth/v1beta1/bech32": { @@ -7314,7 +7324,6 @@ "summary": "Bech32Prefix queries bech32Prefix", "description": "Since: cosmos-sdk 0.46", "operationId": "Bech32Prefix", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -7345,7 +7354,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -7366,7 +7374,9 @@ } } }, - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/auth/v1beta1/bech32/{address_bytes}": { @@ -7374,7 +7384,6 @@ "summary": "AddressBytesToString converts Account Address bytes to string", "description": "Since: cosmos-sdk 0.46", "operationId": "AddressBytesToString", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -7405,7 +7414,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -7435,7 +7443,9 @@ "format": "byte" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/auth/v1beta1/bech32/{address_string}": { @@ -7443,7 +7453,6 @@ "summary": "AddressStringToBytes converts Address string to bytes", "description": "Since: cosmos-sdk 0.46", "operationId": "AddressStringToBytes", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -7475,7 +7484,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -7504,7 +7512,9 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/auth/v1beta1/module_accounts": { @@ -7512,7 +7522,6 @@ "summary": "ModuleAccounts returns all the existing module accounts.", "description": "Since: cosmos-sdk 0.46", "operationId": "ModuleAccounts", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -7521,7 +7530,6 @@ "properties": { "accounts": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -7559,7 +7567,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -7580,14 +7587,15 @@ } } }, - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/auth/v1beta1/module_accounts/{name}": { "get": { "summary": "ModuleAccountByName returns the module account info by module name", "operationId": "ModuleAccountByName", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -7630,7 +7638,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -7659,14 +7666,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/auth/v1beta1/params": { "get": { "summary": "Params queries all parameters.", "operationId": "AuthParams", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -7720,7 +7728,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -7741,14 +7748,15 @@ } } }, - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/authz/v1beta1/grants": { "get": { "summary": "Returns list of `Authorization`, granted to the grantee by the granter.", "operationId": "Grants", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -7757,7 +7765,6 @@ "properties": { "grants": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -7823,7 +7830,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -7903,7 +7909,9 @@ "type": "boolean" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/authz/v1beta1/grants/grantee/{grantee}": { @@ -7911,7 +7919,6 @@ "summary": "GranteeGrants returns a list of `GrantAuthorization` by grantee.", "description": "Since: cosmos-sdk 0.46", "operationId": "GranteeGrants", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -7920,7 +7927,6 @@ "properties": { "grants": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -7991,7 +7997,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -8058,7 +8063,9 @@ "type": "boolean" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/authz/v1beta1/grants/granter/{granter}": { @@ -8066,7 +8073,6 @@ "summary": "GranterGrants returns list of `GrantAuthorization`, granted by granter.", "description": "Since: cosmos-sdk 0.46", "operationId": "GranterGrants", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -8075,7 +8081,6 @@ "properties": { "grants": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -8146,7 +8151,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -8213,7 +8217,9 @@ "type": "boolean" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/bank/v1beta1/balances/{address}": { @@ -8221,7 +8227,6 @@ "summary": "AllBalances queries the balance of all coins for a single account.", "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", "operationId": "AllBalances", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -8230,7 +8235,6 @@ "properties": { "balances": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -8282,7 +8286,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -8347,14 +8350,15 @@ "type": "boolean" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/bank/v1beta1/balances/{address}/by_denom": { "get": { "summary": "Balance queries the balance of a single coin for a single account.", "operationId": "BankBalance", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -8394,7 +8398,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -8428,7 +8431,9 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/bank/v1beta1/denom_owners/{denom}": { @@ -8436,7 +8441,6 @@ "summary": "DenomOwners queries for all account addresses that own a particular token\ndenomination.", "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.\n\nSince: cosmos-sdk 0.46", "operationId": "DenomOwners", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -8445,7 +8449,6 @@ "properties": { "denom_owners": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -8506,7 +8509,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -8571,14 +8573,15 @@ "type": "boolean" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/bank/v1beta1/denoms_metadata": { "get": { "summary": "DenomsMetadata queries the client metadata for all registered coin\ndenominations.", "operationId": "DenomsMetadata", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -8587,7 +8590,6 @@ "properties": { "metadatas": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -8596,7 +8598,6 @@ }, "denom_units": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -8611,7 +8612,6 @@ }, "aliases": { "type": "array", - "maxItems": 10, "items": { "type": "string" }, @@ -8689,7 +8689,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -8747,14 +8746,15 @@ "type": "boolean" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/bank/v1beta1/denoms_metadata/{denom}": { "get": { "summary": "DenomsMetadata queries the client metadata of a given coin denomination.", "operationId": "DenomMetadata", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -8769,7 +8769,6 @@ }, "denom_units": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -8784,7 +8783,6 @@ }, "aliases": { "type": "array", - "maxItems": 10, "items": { "type": "string" }, @@ -8844,7 +8842,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -8871,14 +8868,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/bank/v1beta1/params": { "get": { "summary": "Params queries the parameters of x/bank module.", "operationId": "BankParams", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -8890,7 +8888,6 @@ "properties": { "send_enabled": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -8932,7 +8929,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -8950,7 +8946,9 @@ } } }, - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/bank/v1beta1/send_enabled": { @@ -8958,7 +8956,6 @@ "summary": "SendEnabled queries for SendEnabled entries.", "description": "This query only returns denominations that have specific SendEnabled settings.\nAny denomination that does not have a specific setting will use the default\nparams.default_send_enabled, and will not be returned by this query.\n\nSince: cosmos-sdk 0.47", "operationId": "SendEnabled", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -8967,7 +8964,6 @@ "properties": { "send_enabled": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -9018,7 +9014,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -9043,7 +9038,6 @@ "in": "query", "required": false, "type": "array", - "maxItems": 10, "items": { "type": "string" }, @@ -9088,7 +9082,9 @@ "type": "boolean" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/bank/v1beta1/spendable_balances/{address}": { @@ -9096,7 +9092,6 @@ "summary": "SpendableBalances queries the spendable balance of all coins for a single\naccount.", "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.\n\nSince: cosmos-sdk 0.46", "operationId": "SpendableBalances", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -9105,7 +9100,6 @@ "properties": { "balances": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -9157,7 +9151,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -9222,7 +9215,9 @@ "type": "boolean" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/bank/v1beta1/spendable_balances/{address}/by_denom": { @@ -9230,7 +9225,6 @@ "summary": "SpendableBalanceByDenom queries the spendable balance of a single denom for\na single account.", "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.\n\nSince: cosmos-sdk 0.47", "operationId": "SpendableBalanceByDenom", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -9270,7 +9264,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -9304,7 +9297,9 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/bank/v1beta1/supply": { @@ -9312,7 +9307,6 @@ "summary": "TotalSupply queries the total supply of all coins.", "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", "operationId": "TotalSupply", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -9321,7 +9315,6 @@ "properties": { "supply": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -9373,7 +9366,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -9431,7 +9423,9 @@ "type": "boolean" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/bank/v1beta1/supply/by_denom": { @@ -9439,7 +9433,6 @@ "summary": "SupplyOf queries the supply of a single coin.", "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", "operationId": "SupplyOf", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -9479,7 +9472,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -9506,14 +9498,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/distribution/v1beta1/community_pool": { "get": { "summary": "CommunityPool queries the community pool coins.", "operationId": "CommunityPool", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -9522,7 +9515,6 @@ "properties": { "pool": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -9558,7 +9550,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -9576,14 +9567,15 @@ } } }, - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/distribution/v1beta1/delegators/{delegator_address}/rewards": { "get": { "summary": "DelegationTotalRewards queries the total rewards accrued by a each\nvalidator.", "operationId": "DelegationTotalRewards", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -9592,7 +9584,6 @@ "properties": { "rewards": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -9601,7 +9592,6 @@ }, "reward": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -9622,7 +9612,6 @@ }, "total": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -9658,7 +9647,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -9685,14 +9673,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/distribution/v1beta1/delegators/{delegator_address}/rewards/{validator_address}": { "get": { "summary": "DelegationRewards queries the total rewards accrued by a delegation.", "operationId": "DelegationRewards", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -9701,7 +9690,6 @@ "properties": { "rewards": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -9737,7 +9725,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -9771,14 +9758,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/distribution/v1beta1/delegators/{delegator_address}/validators": { "get": { "summary": "DelegatorValidators queries the validators of a delegator.", "operationId": "DistDelegatorValidators", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -9787,7 +9775,6 @@ "properties": { "validators": { "type": "array", - "maxItems": 10, "items": { "type": "string" }, @@ -9814,7 +9801,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -9841,14 +9827,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/distribution/v1beta1/delegators/{delegator_address}/withdraw_address": { "get": { "summary": "DelegatorWithdrawAddress queries withdraw address of a delegator.", "operationId": "DelegatorWithdrawAddress", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -9880,7 +9867,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -9907,14 +9893,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/distribution/v1beta1/params": { "get": { "summary": "Params queries params of the distribution module.", "operationId": "DistributionParams", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -9962,7 +9949,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -9980,14 +9966,15 @@ } } }, - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/distribution/v1beta1/validators/{validator_address}": { "get": { "summary": "ValidatorDistributionInfo queries validator commission and self-delegation rewards for validator", "operationId": "ValidatorDistributionInfo", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -10000,7 +9987,6 @@ }, "self_bond_rewards": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -10017,7 +10003,6 @@ }, "commission": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -10053,7 +10038,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -10080,14 +10064,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/distribution/v1beta1/validators/{validator_address}/commission": { "get": { "summary": "ValidatorCommission queries accumulated commission for a validator.", "operationId": "ValidatorCommission", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -10100,7 +10085,6 @@ "properties": { "commission": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -10137,7 +10121,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -10164,14 +10147,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/distribution/v1beta1/validators/{validator_address}/outstanding_rewards": { "get": { "summary": "ValidatorOutstandingRewards queries rewards of a validator address.", "operationId": "ValidatorOutstandingRewards", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -10183,7 +10167,6 @@ "properties": { "rewards": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -10221,7 +10204,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -10248,14 +10230,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/distribution/v1beta1/validators/{validator_address}/slashes": { "get": { "summary": "ValidatorSlashes queries slash events of a validator.", "operationId": "ValidatorSlashes", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -10264,7 +10247,6 @@ "properties": { "slashes": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -10317,7 +10299,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -10398,14 +10379,15 @@ "type": "boolean" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/feegrant/v1beta1/allowance/{granter}/{grantee}": { "get": { "summary": "Allowance returns fee granted to the grantee by the granter.", "operationId": "Allowance", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -10463,7 +10445,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -10500,14 +10481,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/feegrant/v1beta1/allowances/{grantee}": { "get": { "summary": "Allowances returns all the grants for address.", "operationId": "Allowances", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -10516,7 +10498,6 @@ "properties": { "allowances": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -10585,7 +10566,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -10652,7 +10632,9 @@ "type": "boolean" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/feegrant/v1beta1/issued/{granter}": { @@ -10660,7 +10642,6 @@ "summary": "AllowancesByGranter returns all the grants given by an address", "description": "Since: cosmos-sdk 0.46", "operationId": "AllowancesByGranter", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -10669,7 +10650,6 @@ "properties": { "allowances": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -10738,7 +10718,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -10805,14 +10784,15 @@ "type": "boolean" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/evidence/v1beta1/evidence": { "get": { "summary": "AllEvidence queries all evidence.", "operationId": "AllEvidence", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -10821,7 +10801,6 @@ "properties": { "evidence": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -10876,7 +10855,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -10937,14 +10915,15 @@ "type": "boolean" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/evidence/v1beta1/evidence/{hash}": { "get": { "summary": "Evidence queries evidence based on evidence hash.", "operationId": "Evidence", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -10987,7 +10966,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -11025,14 +11003,15 @@ "format": "byte" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/gov/v1beta1/params/{params_type}": { "get": { "summary": "Params queries all parameters of the gov module.", "operationId": "GovParams", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -11055,7 +11034,6 @@ "properties": { "min_deposit": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -11118,7 +11096,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -11148,14 +11125,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/gov/v1beta1/proposals": { "get": { "summary": "Proposals queries all proposals based on given status.", "operationId": "Proposals", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -11164,7 +11142,6 @@ "properties": { "proposals": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -11235,7 +11212,6 @@ }, "total_deposit": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -11302,7 +11278,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -11393,14 +11368,15 @@ "type": "boolean" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/gov/v1beta1/proposals/{proposal_id}": { "get": { "summary": "Proposal queries proposal details based on ProposalID.", "operationId": "Proposal", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -11477,7 +11453,6 @@ }, "total_deposit": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -11526,7 +11501,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -11557,14 +11531,15 @@ "format": "uint64" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/gov/v1beta1/proposals/{proposal_id}/deposits": { "get": { "summary": "Deposits queries all deposits of a single proposal.", "operationId": "Deposits", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -11573,7 +11548,6 @@ "properties": { "deposits": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -11588,7 +11562,6 @@ }, "amount": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -11645,7 +11618,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -11714,14 +11686,15 @@ "type": "boolean" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/gov/v1beta1/proposals/{proposal_id}/deposits/{depositor}": { "get": { "summary": "Deposit queries single deposit information based proposalID, depositAddr.", "operationId": "Deposit", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -11742,7 +11715,6 @@ }, "amount": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -11781,7 +11753,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -11819,14 +11790,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/gov/v1beta1/proposals/{proposal_id}/tally": { "get": { "summary": "TallyResult queries the tally of a proposal vote.", "operationId": "TallyResult", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -11876,7 +11848,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -11907,14 +11878,15 @@ "format": "uint64" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/gov/v1beta1/proposals/{proposal_id}/votes": { "get": { "summary": "Votes queries votes of a given proposal.", "operationId": "Votes", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -11923,7 +11895,6 @@ "properties": { "votes": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -11950,7 +11921,6 @@ }, "options": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -12017,7 +11987,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -12086,14 +12055,15 @@ "type": "boolean" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/gov/v1beta1/proposals/{proposal_id}/votes/{voter}": { "get": { "summary": "Vote queries voted information based on proposalID, voterAddr.", "operationId": "Vote", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -12126,7 +12096,6 @@ }, "options": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -12175,7 +12144,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -12213,14 +12181,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/gov/v1/params/{params_type}": { "get": { "summary": "Params queries all parameters of the gov module.", "operationId": "GovV1Params", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -12243,7 +12212,6 @@ "properties": { "min_deposit": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -12288,7 +12256,6 @@ "properties": { "min_deposit": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -12362,7 +12329,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -12392,14 +12358,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/gov/v1/proposals": { "get": { "summary": "Proposals queries all proposals based on given status.", "operationId": "GovV1Proposal", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -12408,7 +12375,6 @@ "properties": { "proposals": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -12419,7 +12385,6 @@ }, "messages": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -12484,7 +12449,6 @@ }, "total_deposit": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -12570,7 +12534,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -12661,14 +12624,15 @@ "type": "boolean" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/gov/v1/proposals/{proposal_id}": { "get": { "summary": "Proposal queries proposal details based on ProposalID.", "operationId": "GovV1Proposal", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -12685,7 +12649,6 @@ }, "messages": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -12750,7 +12713,6 @@ }, "total_deposit": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -12818,7 +12780,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -12849,14 +12810,15 @@ "format": "uint64" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/gov/v1/proposals/{proposal_id}/deposits": { "get": { "summary": "Deposits queries all deposits of a single proposal.", "operationId": "GovV1Deposit", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -12865,7 +12827,6 @@ "properties": { "deposits": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -12880,7 +12841,6 @@ }, "amount": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -12937,7 +12897,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -13006,14 +12965,15 @@ "type": "boolean" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/gov/v1/proposals/{proposal_id}/deposits/{depositor}": { "get": { "summary": "Deposit queries single deposit information based proposalID, depositAddr.", "operationId": "GovV1Deposit", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -13034,7 +12994,6 @@ }, "amount": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -13073,7 +13032,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -13111,14 +13069,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/gov/v1/proposals/{proposal_id}/tally": { "get": { "summary": "TallyResult queries the tally of a proposal vote.", "operationId": "GovV1TallyResult", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -13168,7 +13127,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -13199,14 +13157,15 @@ "format": "uint64" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/gov/v1/proposals/{proposal_id}/votes": { "get": { "summary": "Votes queries votes of a given proposal.", "operationId": "GovV1Votes", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -13215,7 +13174,6 @@ "properties": { "votes": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -13230,7 +13188,6 @@ }, "options": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -13301,7 +13258,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -13370,14 +13326,15 @@ "type": "boolean" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/gov/v1/proposals/{proposal_id}/votes/{voter}": { "get": { "summary": "Vote queries voted information based on proposalID, voterAddr.", "operationId": "GovV1Vote", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -13398,7 +13355,6 @@ }, "options": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -13451,7 +13407,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -13489,14 +13444,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/slashing/v1beta1/params": { "get": { "summary": "Params queries the parameters of slashing module", "operationId": "SlashingParams", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -13549,7 +13505,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -13567,14 +13522,15 @@ } } }, - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/slashing/v1beta1/signing_infos": { "get": { "summary": "SigningInfos queries signing info of all validators", "operationId": "SigningInfos", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -13583,7 +13539,6 @@ "properties": { "info": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -13656,7 +13611,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -13714,14 +13668,15 @@ "type": "boolean" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/slashing/v1beta1/signing_infos/{cons_address}": { "get": { "summary": "SigningInfo queries the signing info of given cons address", "operationId": "SigningInfo", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -13783,7 +13738,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -13810,7 +13764,9 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/staking/v1beta1/delegations/{delegator_addr}": { @@ -13818,7 +13774,6 @@ "summary": "DelegatorDelegations queries all delegations of a given delegator address.", "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", "operationId": "DelegatorDelegations", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -13827,7 +13782,6 @@ "properties": { "delegation_responses": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -13903,7 +13857,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -13971,7 +13924,9 @@ "type": "boolean" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/staking/v1beta1/delegators/{delegator_addr}/redelegations": { @@ -13979,7 +13934,6 @@ "summary": "Redelegations queries redelegations of given address.", "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", "operationId": "Redelegations", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -13988,7 +13942,6 @@ "properties": { "redelegation_responses": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -14009,7 +13962,6 @@ }, "entries": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -14051,7 +14003,6 @@ }, "entries": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -14137,7 +14088,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -14219,7 +14169,9 @@ "type": "boolean" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/staking/v1beta1/delegators/{delegator_addr}/unbonding_delegations": { @@ -14227,7 +14179,6 @@ "summary": "DelegatorUnbondingDelegations queries all unbonding delegations of a given\ndelegator address.", "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", "operationId": "DelegatorUnbondingDelegations", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -14236,7 +14187,6 @@ "properties": { "unbonding_responses": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -14250,7 +14200,6 @@ }, "entries": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -14328,7 +14277,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -14396,7 +14344,9 @@ "type": "boolean" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/staking/v1beta1/delegators/{delegator_addr}/validators": { @@ -14404,7 +14354,6 @@ "summary": "DelegatorValidators queries all validators info for given delegator\naddress.", "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", "operationId": "DelegatorValidators", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -14413,7 +14362,6 @@ "properties": { "validators": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -14535,7 +14483,6 @@ }, "unbonding_ids": { "type": "array", - "maxItems": 10, "items": { "type": "string", "format": "uint64" @@ -14584,7 +14531,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -14652,14 +14598,15 @@ "type": "boolean" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/staking/v1beta1/delegators/{delegator_addr}/validators/{validator_addr}": { "get": { "summary": "DelegatorValidator queries validator info for given delegator validator\npair.", "operationId": "DelegatorValidator", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -14787,7 +14734,6 @@ }, "unbonding_ids": { "type": "array", - "maxItems": 10, "items": { "type": "string", "format": "uint64" @@ -14818,7 +14764,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -14855,14 +14800,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/staking/v1beta1/historical_info/{height}": { "get": { "summary": "HistoricalInfo queries the historical info for given height.", "operationId": "HistoricalInfo", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -14970,7 +14916,6 @@ }, "valset": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -15092,7 +15037,6 @@ }, "unbonding_ids": { "type": "array", - "maxItems": 10, "items": { "type": "string", "format": "uint64" @@ -15126,7 +15070,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -15157,14 +15100,15 @@ "format": "int64" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/staking/v1beta1/params": { "get": { "summary": "Parameters queries the staking parameters.", "operationId": "StakingParams", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -15225,7 +15169,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -15246,14 +15189,15 @@ } } }, - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/staking/v1beta1/pool": { "get": { "summary": "Pool queries the pool info.", "operationId": "Pool", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -15293,7 +15237,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -15314,7 +15257,9 @@ } } }, - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/staking/v1beta1/validators": { @@ -15322,7 +15267,6 @@ "summary": "Validators queries all validators that match the given status.", "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", "operationId": "Validators", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -15331,7 +15275,6 @@ "properties": { "validators": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -15453,7 +15396,6 @@ }, "unbonding_ids": { "type": "array", - "maxItems": 10, "items": { "type": "string", "format": "uint64" @@ -15502,7 +15444,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -15570,14 +15511,15 @@ "type": "boolean" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/staking/v1beta1/validators/{validator_addr}": { "get": { "summary": "Validator queries validator info for given validator address.", "operationId": "Validator", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -15705,7 +15647,6 @@ }, "unbonding_ids": { "type": "array", - "maxItems": 10, "items": { "type": "string", "format": "uint64" @@ -15736,7 +15677,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -15766,7 +15706,9 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/staking/v1beta1/validators/{validator_addr}/delegations": { @@ -15774,7 +15716,6 @@ "summary": "ValidatorDelegations queries delegate info for given validator.", "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", "operationId": "ValidatorDelegations", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -15783,7 +15724,6 @@ "properties": { "delegation_responses": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -15858,7 +15798,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -15926,14 +15865,15 @@ "type": "boolean" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/staking/v1beta1/validators/{validator_addr}/delegations/{delegator_addr}": { "get": { "summary": "Delegation queries delegate info for given validator delegator pair.", "operationId": "Delegation", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -15997,7 +15937,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -16034,14 +15973,15 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/staking/v1beta1/validators/{validator_addr}/delegations/{delegator_addr}/unbonding_delegation": { "get": { "summary": "UnbondingDelegation queries unbonding info for given validator delegator\npair.", "operationId": "UnbondingDelegation", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -16061,7 +16001,6 @@ }, "entries": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -16122,7 +16061,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -16159,7 +16097,9 @@ "type": "string" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/staking/v1beta1/validators/{validator_addr}/unbonding_delegations": { @@ -16167,7 +16107,6 @@ "summary": "ValidatorUnbondingDelegations queries unbonding delegations of a validator.", "description": "When called from another module, this query might consume a high amount of\ngas if the pagination field is incorrectly set.", "operationId": "ValidatorUnbondingDelegations", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -16176,7 +16115,6 @@ "properties": { "unbonding_responses": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -16190,7 +16128,6 @@ }, "entries": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -16268,7 +16205,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -16336,7 +16272,9 @@ "type": "boolean" } ], - "tags": ["Query"] + "tags": [ + "Query" + ] } }, "/cosmos/tx/v1beta1/decode": { @@ -16344,8 +16282,6 @@ "summary": "TxDecode decodes the transaction.", "description": "Since: cosmos-sdk 0.47", "operationId": "TxDecode", - "consumes": ["application/json"], - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -16370,7 +16306,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -16409,7 +16344,9 @@ } } ], - "tags": ["Service"] + "tags": [ + "Service" + ] } }, "/cosmos/tx/v1beta1/decode/amino": { @@ -16417,8 +16354,6 @@ "summary": "TxDecodeAmino decodes an Amino transaction from encoded bytes to JSON.", "description": "Since: cosmos-sdk 0.47", "operationId": "TxDecodeAmino", - "consumes": ["application/json"], - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -16449,7 +16384,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -16487,7 +16421,9 @@ } } ], - "tags": ["Service"] + "tags": [ + "Service" + ] } }, "/cosmos/tx/v1beta1/encode": { @@ -16495,8 +16431,6 @@ "summary": "TxEncode encodes the transaction.", "description": "Since: cosmos-sdk 0.47", "operationId": "TxEncode", - "consumes": ["application/json"], - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -16529,7 +16463,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -16560,7 +16493,9 @@ } } ], - "tags": ["Service"] + "tags": [ + "Service" + ] } }, "/cosmos/tx/v1beta1/encode/amino": { @@ -16568,8 +16503,6 @@ "summary": "TxEncodeAmino encodes an Amino transaction from JSON to encoded bytes.", "description": "Since: cosmos-sdk 0.47", "operationId": "TxEncodeAmino", - "consumes": ["application/json"], - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -16601,7 +16534,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -16638,15 +16570,15 @@ } } ], - "tags": ["Service"] + "tags": [ + "Service" + ] } }, "/cosmos/tx/v1beta1/simulate": { "post": { "summary": "Simulate simulates executing a transaction for estimating gas usage.", "operationId": "Simulate", - "consumes": ["application/json"], - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -16684,7 +16616,6 @@ }, "events": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -16693,7 +16624,6 @@ }, "attributes": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -16717,7 +16647,6 @@ }, "msg_responses": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -16758,7 +16687,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -16789,14 +16717,15 @@ } } ], - "tags": ["Service"] + "tags": [ + "Service" + ] } }, "/cosmos/tx/v1beta1/txs": { "get": { "summary": "GetTxsEvent fetches txs by event.", "operationId": "GetTxsEvent", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -16821,7 +16750,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -16849,7 +16777,6 @@ "in": "query", "required": false, "type": "array", - "maxItems": 10, "items": { "type": "string" }, @@ -16899,7 +16826,11 @@ "in": "query", "required": false, "type": "string", - "enum": ["ORDER_BY_UNSPECIFIED", "ORDER_BY_ASC", "ORDER_BY_DESC"], + "enum": [ + "ORDER_BY_UNSPECIFIED", + "ORDER_BY_ASC", + "ORDER_BY_DESC" + ], "default": "ORDER_BY_UNSPECIFIED" }, { @@ -16919,13 +16850,13 @@ "format": "uint64" } ], - "tags": ["Service"] + "tags": [ + "Service" + ] }, "post": { "summary": "BroadcastTx broadcast transaction.", "operationId": "BroadcastTx", - "produces": ["application/json"], - "consumes": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -16963,7 +16894,6 @@ }, "logs": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -16976,7 +16906,6 @@ }, "events": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -16985,7 +16914,6 @@ }, "attributes": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -17044,7 +16972,6 @@ }, "events": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -17053,7 +16980,6 @@ }, "attributes": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -17099,7 +17025,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -17149,7 +17074,9 @@ } } ], - "tags": ["Service"] + "tags": [ + "Service" + ] } }, "/cosmos/tx/v1beta1/txs/block/{height}": { @@ -17157,7 +17084,6 @@ "summary": "GetBlockWithTxs fetches a block with decoded txs.", "description": "Since: cosmos-sdk 0.45.2", "operationId": "GetBlockWithTxs", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -17182,7 +17108,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -17251,14 +17176,15 @@ "type": "boolean" } ], - "tags": ["Service"] + "tags": [ + "Service" + ] } }, "/cosmos/tx/v1beta1/txs/{hash}": { "get": { "summary": "GetTx fetches a tx by hash.", "operationId": "GetTx", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -17283,7 +17209,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -17313,7 +17238,9 @@ "type": "string" } ], - "tags": ["Service"] + "tags": [ + "Service" + ] } }, "/cosmos/base/tendermint/v1beta1/abci_query": { @@ -17321,7 +17248,6 @@ "summary": "ABCIQuery defines a query handler that supports ABCI queries directly to the\napplication, bypassing Tendermint completely. The ABCI query must contain\na valid and supported path, including app, custom, p2p, and store.", "description": "Since: cosmos-sdk 0.46", "operationId": "ABCIQuery", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -17355,7 +17281,6 @@ "properties": { "ops": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -17405,7 +17330,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -17454,14 +17378,15 @@ "type": "boolean" } ], - "tags": ["Service"] + "tags": [ + "Service" + ] } }, "/cosmos/base/tendermint/v1beta1/blocks/latest": { "get": { "summary": "GetLatestBlock returns the latest block.", "operationId": "GetLatestBlock", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -17596,7 +17521,6 @@ "properties": { "txs": { "type": "array", - "maxItems": 10, "items": { "type": "string", "format": "byte" @@ -17611,7 +17535,6 @@ "properties": { "evidence": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -17904,7 +17827,6 @@ }, "signatures": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -17945,7 +17867,6 @@ "properties": { "validators": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -18023,7 +17944,6 @@ }, "byzantine_validators": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -18109,7 +18029,6 @@ }, "signatures": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -18249,7 +18168,6 @@ "properties": { "txs": { "type": "array", - "maxItems": 10, "items": { "type": "string", "format": "byte" @@ -18264,7 +18182,6 @@ "properties": { "evidence": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -18557,7 +18474,6 @@ }, "signatures": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -18598,7 +18514,6 @@ "properties": { "validators": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -18676,7 +18591,6 @@ }, "byzantine_validators": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -18762,7 +18676,6 @@ }, "signatures": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -18820,7 +18733,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -18841,14 +18753,15 @@ } } }, - "tags": ["Service"] + "tags": [ + "Service" + ] } }, "/cosmos/base/tendermint/v1beta1/blocks/{height}": { "get": { "summary": "GetBlockByHeight queries block for given height.", "operationId": "GetBlockByHeight", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -18983,7 +18896,6 @@ "properties": { "txs": { "type": "array", - "maxItems": 10, "items": { "type": "string", "format": "byte" @@ -18998,7 +18910,6 @@ "properties": { "evidence": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -19291,7 +19202,6 @@ }, "signatures": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -19332,7 +19242,6 @@ "properties": { "validators": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -19410,7 +19319,6 @@ }, "byzantine_validators": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -19496,7 +19404,6 @@ }, "signatures": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -19636,7 +19543,6 @@ "properties": { "txs": { "type": "array", - "maxItems": 10, "items": { "type": "string", "format": "byte" @@ -19651,7 +19557,6 @@ "properties": { "evidence": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -19944,7 +19849,6 @@ }, "signatures": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -19985,7 +19889,6 @@ "properties": { "validators": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -20063,7 +19966,6 @@ }, "byzantine_validators": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -20149,7 +20051,6 @@ }, "signatures": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -20207,7 +20108,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -20237,14 +20137,15 @@ "format": "int64" } ], - "tags": ["Service"] + "tags": [ + "Service" + ] } }, "/cosmos/base/tendermint/v1beta1/node_info": { "get": { "summary": "GetNodeInfo queries the current node info.", "operationId": "GetNodeInfo", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -20326,7 +20227,6 @@ }, "build_deps": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -20374,7 +20274,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -20395,14 +20294,15 @@ } } }, - "tags": ["Service"] + "tags": [ + "Service" + ] } }, "/cosmos/base/tendermint/v1beta1/syncing": { "get": { "summary": "GetSyncing queries node syncing.", "operationId": "GetSyncing", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -20433,7 +20333,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -20454,14 +20353,15 @@ } } }, - "tags": ["Service"] + "tags": [ + "Service" + ] } }, "/cosmos/base/tendermint/v1beta1/validatorsets/latest": { "get": { "summary": "GetLatestValidatorSet queries latest validator-set.", "operationId": "GetLatestValidatorSet", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -20474,7 +20374,6 @@ }, "validators": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -20545,7 +20444,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -20606,14 +20504,15 @@ "type": "boolean" } ], - "tags": ["Service"] + "tags": [ + "Service" + ] } }, "/cosmos/base/tendermint/v1beta1/validatorsets/{height}": { "get": { "summary": "GetValidatorSetByHeight queries validator-set at a given height.", "operationId": "GetValidatorSetByHeight", - "produces": ["application/json"], "responses": { "200": { "description": "A successful response.", @@ -20626,7 +20525,6 @@ }, "validators": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -20697,7 +20595,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -20765,7 +20662,9 @@ "type": "boolean" } ], - "tags": ["Service"] + "tags": [ + "Service" + ] } } }, @@ -20870,7 +20769,6 @@ "properties": { "epochs": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -20960,7 +20858,6 @@ }, "details": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -20981,7 +20878,11 @@ }, "evmos.erc20.v1.Owner": { "type": "string", - "enum": ["OWNER_UNSPECIFIED", "OWNER_MODULE", "OWNER_EXTERNAL"], + "enum": [ + "OWNER_UNSPECIFIED", + "OWNER_MODULE", + "OWNER_EXTERNAL" + ], "default": "OWNER_UNSPECIFIED", "description": "Owner enumerates the ownership of a ERC20 contract.\n\n - OWNER_UNSPECIFIED: OWNER_UNSPECIFIED defines an invalid/undefined owner.\n - OWNER_MODULE: OWNER_MODULE - erc20 is owned by the erc20 module account.\n - OWNER_EXTERNAL: OWNER_EXTERNAL - erc20 is owned by an external account." }, @@ -21040,7 +20941,11 @@ "contract_owner": { "title": "contract_owner is the an ENUM specifying the type of ERC20 owner (0 invalid, 1 ModuleAccount, 2 external address)", "type": "string", - "enum": ["OWNER_UNSPECIFIED", "OWNER_MODULE", "OWNER_EXTERNAL"], + "enum": [ + "OWNER_UNSPECIFIED", + "OWNER_MODULE", + "OWNER_EXTERNAL" + ], "default": "OWNER_UNSPECIFIED", "description": "Owner enumerates the ownership of a ERC20 contract.\n\n - OWNER_UNSPECIFIED: OWNER_UNSPECIFIED defines an invalid/undefined owner.\n - OWNER_MODULE: OWNER_MODULE - erc20 is owned by the erc20 module account.\n - OWNER_EXTERNAL: OWNER_EXTERNAL - erc20 is owned by an external account." } @@ -21056,7 +20961,6 @@ "properties": { "token_pairs": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -21075,7 +20979,11 @@ "contract_owner": { "title": "contract_owner is the an ENUM specifying the type of ERC20 owner (0 invalid, 1 ModuleAccount, 2 external address)", "type": "string", - "enum": ["OWNER_UNSPECIFIED", "OWNER_MODULE", "OWNER_EXTERNAL"], + "enum": [ + "OWNER_UNSPECIFIED", + "OWNER_MODULE", + "OWNER_EXTERNAL" + ], "default": "OWNER_UNSPECIFIED", "description": "Owner enumerates the ownership of a ERC20 contract.\n\n - OWNER_UNSPECIFIED: OWNER_UNSPECIFIED defines an invalid/undefined owner.\n - OWNER_MODULE: OWNER_MODULE - erc20 is owned by the erc20 module account.\n - OWNER_EXTERNAL: OWNER_EXTERNAL - erc20 is owned by an external account." } @@ -21121,7 +21029,11 @@ "contract_owner": { "title": "contract_owner is the an ENUM specifying the type of ERC20 owner (0 invalid, 1 ModuleAccount, 2 external address)", "type": "string", - "enum": ["OWNER_UNSPECIFIED", "OWNER_MODULE", "OWNER_EXTERNAL"], + "enum": [ + "OWNER_UNSPECIFIED", + "OWNER_MODULE", + "OWNER_EXTERNAL" + ], "default": "OWNER_UNSPECIFIED", "description": "Owner enumerates the ownership of a ERC20 contract.\n\n - OWNER_UNSPECIFIED: OWNER_UNSPECIFIED defines an invalid/undefined owner.\n - OWNER_MODULE: OWNER_MODULE - erc20 is owned by the erc20 module account.\n - OWNER_EXTERNAL: OWNER_EXTERNAL - erc20 is owned by an external account." } @@ -21392,7 +21304,6 @@ "properties": { "locked": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -21409,7 +21320,6 @@ }, "unvested": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -21426,7 +21336,6 @@ }, "vested": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -21444,6 +21353,95 @@ }, "description": "QueryBalancesResponse is the response type for the Query/Balances RPC\nmethod." }, + "ethermint.evm.v1.AccessControl": { + "type": "object", + "properties": { + "create": { + "title": "create defines the permission policy for creating contracts", + "type": "object", + "properties": { + "access_type": { + "title": "access_type defines which type of permission is required for the operation", + "type": "string", + "enum": [ + "ACCESS_TYPE_PERMISSIONLESS", + "ACCESS_TYPE_RESTRICTED", + "ACCESS_TYPE_PERMISSIONED" + ], + "default": "ACCESS_TYPE_PERMISSIONLESS", + "description": "- ACCESS_TYPE_PERMISSIONLESS: ACCESS_TYPE_PERMISSIONLESS does not restrict the operation to anyone\n - ACCESS_TYPE_RESTRICTED: ACCESS_TYPE_RESTRICTED restrict the operation to anyone\n - ACCESS_TYPE_PERMISSIONED: ACCESS_TYPE_PERMISSIONED only allows the operation for specific addresses" + }, + "allowlist_addresses": { + "type": "array", + "items": { + "type": "string" + }, + "title": "allowlist_addresses defines which addresses have permissions in case of permissioned access_type" + } + } + }, + "call": { + "title": "call defines the permission policy for calling contracts", + "type": "object", + "properties": { + "access_type": { + "title": "access_type defines which type of permission is required for the operation", + "type": "string", + "enum": [ + "ACCESS_TYPE_PERMISSIONLESS", + "ACCESS_TYPE_RESTRICTED", + "ACCESS_TYPE_PERMISSIONED" + ], + "default": "ACCESS_TYPE_PERMISSIONLESS", + "description": "- ACCESS_TYPE_PERMISSIONLESS: ACCESS_TYPE_PERMISSIONLESS does not restrict the operation to anyone\n - ACCESS_TYPE_RESTRICTED: ACCESS_TYPE_RESTRICTED restrict the operation to anyone\n - ACCESS_TYPE_PERMISSIONED: ACCESS_TYPE_PERMISSIONED only allows the operation for specific addresses" + }, + "allowlist_addresses": { + "type": "array", + "items": { + "type": "string" + }, + "title": "allowlist_addresses defines which addresses have permissions in case of permissioned access_type" + } + } + } + }, + "title": "AccessControl defines the permission policy of the EVM\nfor creating and calling contracts" + }, + "ethermint.evm.v1.AccessControlType": { + "type": "object", + "properties": { + "access_type": { + "title": "access_type defines which type of permission is required for the operation", + "type": "string", + "enum": [ + "ACCESS_TYPE_PERMISSIONLESS", + "ACCESS_TYPE_RESTRICTED", + "ACCESS_TYPE_PERMISSIONED" + ], + "default": "ACCESS_TYPE_PERMISSIONLESS", + "description": "- ACCESS_TYPE_PERMISSIONLESS: ACCESS_TYPE_PERMISSIONLESS does not restrict the operation to anyone\n - ACCESS_TYPE_RESTRICTED: ACCESS_TYPE_RESTRICTED restrict the operation to anyone\n - ACCESS_TYPE_PERMISSIONED: ACCESS_TYPE_PERMISSIONED only allows the operation for specific addresses" + }, + "allowlist_addresses": { + "type": "array", + "items": { + "type": "string" + }, + "title": "allowlist_addresses defines which addresses have permissions in case of permissioned access_type" + } + }, + "title": "AccessControlType defines the permission type for policies" + }, + "ethermint.evm.v1.AccessType": { + "type": "string", + "enum": [ + "ACCESS_TYPE_PERMISSIONLESS", + "ACCESS_TYPE_RESTRICTED", + "ACCESS_TYPE_PERMISSIONED" + ], + "default": "ACCESS_TYPE_PERMISSIONLESS", + "description": "- ACCESS_TYPE_PERMISSIONLESS: ACCESS_TYPE_PERMISSIONLESS does not restrict the operation to anyone\n - ACCESS_TYPE_RESTRICTED: ACCESS_TYPE_RESTRICTED restrict the operation to anyone\n - ACCESS_TYPE_PERMISSIONED: ACCESS_TYPE_PERMISSIONED only allows the operation for specific addresses", + "title": "AccessType defines the types of permissions for the operations" + }, "ethermint.evm.v1.ChainConfig": { "type": "object", "properties": { @@ -21546,7 +21544,6 @@ }, "topics": { "type": "array", - "maxItems": 10, "items": { "type": "string" }, @@ -21631,7 +21628,6 @@ }, "logs": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -21641,7 +21637,6 @@ }, "topics": { "type": "array", - "maxItems": 10, "items": { "type": "string" }, @@ -21708,17 +21703,8 @@ "type": "string", "description": "evm_denom represents the token denomination used to run the EVM state\ntransitions." }, - "enable_create": { - "type": "boolean", - "title": "enable_create toggles state transitions that use the vm.Create function" - }, - "enable_call": { - "type": "boolean", - "title": "enable_call toggles state transitions that use the vm.Call function" - }, "extra_eips": { "type": "array", - "maxItems": 10, "items": { "type": "string", "format": "int64" @@ -21814,7 +21800,6 @@ }, "active_precompiles": { "type": "array", - "maxItems": 10, "items": { "type": "string" }, @@ -21822,11 +21807,64 @@ }, "evm_channels": { "type": "array", - "maxItems": 10, "items": { "type": "string" }, "title": "evm_channels is the list of channel identifiers from EVM compatible chains" + }, + "access_control": { + "title": "access_control defines the permission policy of the EVM", + "type": "object", + "properties": { + "create": { + "title": "create defines the permission policy for creating contracts", + "type": "object", + "properties": { + "access_type": { + "title": "access_type defines which type of permission is required for the operation", + "type": "string", + "enum": [ + "ACCESS_TYPE_PERMISSIONLESS", + "ACCESS_TYPE_RESTRICTED", + "ACCESS_TYPE_PERMISSIONED" + ], + "default": "ACCESS_TYPE_PERMISSIONLESS", + "description": "- ACCESS_TYPE_PERMISSIONLESS: ACCESS_TYPE_PERMISSIONLESS does not restrict the operation to anyone\n - ACCESS_TYPE_RESTRICTED: ACCESS_TYPE_RESTRICTED restrict the operation to anyone\n - ACCESS_TYPE_PERMISSIONED: ACCESS_TYPE_PERMISSIONED only allows the operation for specific addresses" + }, + "allowlist_addresses": { + "type": "array", + "items": { + "type": "string" + }, + "title": "allowlist_addresses defines which addresses have permissions in case of permissioned access_type" + } + } + }, + "call": { + "title": "call defines the permission policy for calling contracts", + "type": "object", + "properties": { + "access_type": { + "title": "access_type defines which type of permission is required for the operation", + "type": "string", + "enum": [ + "ACCESS_TYPE_PERMISSIONLESS", + "ACCESS_TYPE_RESTRICTED", + "ACCESS_TYPE_PERMISSIONED" + ], + "default": "ACCESS_TYPE_PERMISSIONLESS", + "description": "- ACCESS_TYPE_PERMISSIONLESS: ACCESS_TYPE_PERMISSIONLESS does not restrict the operation to anyone\n - ACCESS_TYPE_RESTRICTED: ACCESS_TYPE_RESTRICTED restrict the operation to anyone\n - ACCESS_TYPE_PERMISSIONED: ACCESS_TYPE_PERMISSIONED only allows the operation for specific addresses" + }, + "allowlist_addresses": { + "type": "array", + "items": { + "type": "string" + }, + "title": "allowlist_addresses defines which addresses have permissions in case of permissioned access_type" + } + } + } + } } }, "title": "Params defines the EVM module parameters" @@ -21912,17 +21950,8 @@ "type": "string", "description": "evm_denom represents the token denomination used to run the EVM state\ntransitions." }, - "enable_create": { - "type": "boolean", - "title": "enable_create toggles state transitions that use the vm.Create function" - }, - "enable_call": { - "type": "boolean", - "title": "enable_call toggles state transitions that use the vm.Call function" - }, "extra_eips": { "type": "array", - "maxItems": 10, "items": { "type": "string", "format": "int64" @@ -22018,7 +22047,6 @@ }, "active_precompiles": { "type": "array", - "maxItems": 10, "items": { "type": "string" }, @@ -22026,11 +22054,64 @@ }, "evm_channels": { "type": "array", - "maxItems": 10, "items": { "type": "string" }, "title": "evm_channels is the list of channel identifiers from EVM compatible chains" + }, + "access_control": { + "title": "access_control defines the permission policy of the EVM", + "type": "object", + "properties": { + "create": { + "title": "create defines the permission policy for creating contracts", + "type": "object", + "properties": { + "access_type": { + "title": "access_type defines which type of permission is required for the operation", + "type": "string", + "enum": [ + "ACCESS_TYPE_PERMISSIONLESS", + "ACCESS_TYPE_RESTRICTED", + "ACCESS_TYPE_PERMISSIONED" + ], + "default": "ACCESS_TYPE_PERMISSIONLESS", + "description": "- ACCESS_TYPE_PERMISSIONLESS: ACCESS_TYPE_PERMISSIONLESS does not restrict the operation to anyone\n - ACCESS_TYPE_RESTRICTED: ACCESS_TYPE_RESTRICTED restrict the operation to anyone\n - ACCESS_TYPE_PERMISSIONED: ACCESS_TYPE_PERMISSIONED only allows the operation for specific addresses" + }, + "allowlist_addresses": { + "type": "array", + "items": { + "type": "string" + }, + "title": "allowlist_addresses defines which addresses have permissions in case of permissioned access_type" + } + } + }, + "call": { + "title": "call defines the permission policy for calling contracts", + "type": "object", + "properties": { + "access_type": { + "title": "access_type defines which type of permission is required for the operation", + "type": "string", + "enum": [ + "ACCESS_TYPE_PERMISSIONLESS", + "ACCESS_TYPE_RESTRICTED", + "ACCESS_TYPE_PERMISSIONED" + ], + "default": "ACCESS_TYPE_PERMISSIONLESS", + "description": "- ACCESS_TYPE_PERMISSIONLESS: ACCESS_TYPE_PERMISSIONLESS does not restrict the operation to anyone\n - ACCESS_TYPE_RESTRICTED: ACCESS_TYPE_RESTRICTED restrict the operation to anyone\n - ACCESS_TYPE_PERMISSIONED: ACCESS_TYPE_PERMISSIONED only allows the operation for specific addresses" + }, + "allowlist_addresses": { + "type": "array", + "items": { + "type": "string" + }, + "title": "allowlist_addresses defines which addresses have permissions in case of permissioned access_type" + } + } + } + } } }, "title": "Params defines the EVM module parameters" @@ -22386,7 +22467,6 @@ "properties": { "denom_traces": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -22557,7 +22637,6 @@ "properties": { "allowed_clients": { "type": "array", - "maxItems": 10, "items": { "type": "string" }, @@ -22575,7 +22654,6 @@ "properties": { "allowed_clients": { "type": "array", - "maxItems": 10, "items": { "type": "string" }, @@ -22635,7 +22713,6 @@ "properties": { "client_states": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -22698,7 +22775,6 @@ "properties": { "consensus_state_heights": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -22787,7 +22863,6 @@ "properties": { "consensus_states": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -22912,7 +22987,6 @@ }, "versions": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -22922,7 +22996,6 @@ }, "features": { "type": "array", - "maxItems": 10, "items": { "type": "string" }, @@ -23015,7 +23088,6 @@ }, "versions": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -23025,7 +23097,6 @@ }, "features": { "type": "array", - "maxItems": 10, "items": { "type": "string" }, @@ -23096,7 +23167,6 @@ "properties": { "connection_paths": { "type": "array", - "maxItems": 10, "items": { "type": "string" }, @@ -23260,7 +23330,6 @@ }, "versions": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -23270,7 +23339,6 @@ }, "features": { "type": "array", - "maxItems": 10, "items": { "type": "string" }, @@ -23355,7 +23423,6 @@ "properties": { "connections": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -23369,7 +23436,6 @@ }, "versions": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -23379,7 +23445,6 @@ }, "features": { "type": "array", - "maxItems": 10, "items": { "type": "string" }, @@ -23493,7 +23558,6 @@ }, "features": { "type": "array", - "maxItems": 10, "items": { "type": "string" }, @@ -23545,7 +23609,6 @@ }, "connection_hops": { "type": "array", - "maxItems": 10, "items": { "type": "string" }, @@ -23615,7 +23678,6 @@ }, "connection_hops": { "type": "array", - "maxItems": 10, "items": { "type": "string" }, @@ -23638,7 +23700,11 @@ }, "ibc.core.channel.v1.Order": { "type": "string", - "enum": ["ORDER_NONE_UNSPECIFIED", "ORDER_UNORDERED", "ORDER_ORDERED"], + "enum": [ + "ORDER_NONE_UNSPECIFIED", + "ORDER_UNORDERED", + "ORDER_ORDERED" + ], "default": "ORDER_NONE_UNSPECIFIED", "description": "- ORDER_NONE_UNSPECIFIED: zero-value for channel ordering\n - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in\nwhich they were sent.\n - ORDER_ORDERED: packets are delivered exactly in the order which they were sent", "title": "Order defines if a channel is ORDERED or UNORDERED" @@ -23817,7 +23883,6 @@ }, "connection_hops": { "type": "array", - "maxItems": 10, "items": { "type": "string" }, @@ -23860,7 +23925,6 @@ "properties": { "channels": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -23904,7 +23968,6 @@ }, "connection_hops": { "type": "array", - "maxItems": 10, "items": { "type": "string" }, @@ -23969,7 +24032,6 @@ "properties": { "channels": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -24013,7 +24075,6 @@ }, "connection_hops": { "type": "array", - "maxItems": 10, "items": { "type": "string" }, @@ -24144,7 +24205,6 @@ "properties": { "acknowledgements": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -24245,7 +24305,6 @@ "properties": { "commitments": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -24345,7 +24404,6 @@ "properties": { "sequences": { "type": "array", - "maxItems": 10, "items": { "type": "string", "format": "uint64" @@ -24377,7 +24435,6 @@ "properties": { "sequences": { "type": "array", - "maxItems": 10, "items": { "type": "string", "format": "uint64" @@ -24576,7 +24633,6 @@ "properties": { "accounts": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -24639,7 +24695,6 @@ "properties": { "accounts": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -24753,7 +24808,6 @@ "properties": { "grants": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -24811,7 +24865,6 @@ "properties": { "grants": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -24869,7 +24922,6 @@ "properties": { "grants": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -24953,7 +25005,6 @@ }, "aliases": { "type": "array", - "maxItems": 10, "items": { "type": "string" }, @@ -24970,7 +25021,6 @@ }, "denom_units": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -24985,7 +25035,6 @@ }, "aliases": { "type": "array", - "maxItems": 10, "items": { "type": "string" }, @@ -25029,7 +25078,6 @@ "properties": { "send_enabled": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -25055,7 +25103,6 @@ "properties": { "balances": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -25118,7 +25165,6 @@ }, "denom_units": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -25133,7 +25179,6 @@ }, "aliases": { "type": "array", - "maxItems": 10, "items": { "type": "string" }, @@ -25180,7 +25225,6 @@ "properties": { "denom_owners": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -25228,7 +25272,6 @@ "properties": { "metadatas": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -25237,7 +25280,6 @@ }, "denom_units": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -25252,7 +25294,6 @@ }, "aliases": { "type": "array", - "maxItems": 10, "items": { "type": "string" }, @@ -25320,7 +25361,6 @@ "properties": { "send_enabled": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -25349,7 +25389,6 @@ "properties": { "send_enabled": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -25405,7 +25444,6 @@ "properties": { "balances": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -25462,7 +25500,6 @@ "properties": { "supply": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -25516,7 +25553,6 @@ }, "reward": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -25558,7 +25594,6 @@ "properties": { "pool": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -25581,7 +25616,6 @@ "properties": { "rewards": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -25604,7 +25638,6 @@ "properties": { "rewards": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -25613,7 +25646,6 @@ }, "reward": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -25634,7 +25666,6 @@ }, "total": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -25657,7 +25688,6 @@ "properties": { "validators": { "type": "array", - "maxItems": 10, "items": { "type": "string" }, @@ -25711,7 +25741,6 @@ "properties": { "commission": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -25739,7 +25768,6 @@ }, "self_bond_rewards": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -25756,7 +25784,6 @@ }, "commission": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -25782,7 +25809,6 @@ "properties": { "rewards": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -25807,7 +25833,6 @@ "properties": { "slashes": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -25847,7 +25872,6 @@ "properties": { "commission": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -25869,7 +25893,6 @@ "properties": { "rewards": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -25969,7 +25992,6 @@ "properties": { "allowances": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -26025,7 +26047,6 @@ "properties": { "allowances": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -26081,7 +26102,6 @@ "properties": { "evidence": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -26153,7 +26173,6 @@ }, "amount": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -26176,7 +26195,6 @@ "properties": { "min_deposit": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -26268,7 +26286,6 @@ }, "total_deposit": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -26326,7 +26343,6 @@ }, "amount": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -26352,7 +26368,6 @@ "properties": { "deposits": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -26367,7 +26382,6 @@ }, "amount": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -26425,7 +26439,6 @@ "properties": { "min_deposit": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -26543,7 +26556,6 @@ }, "total_deposit": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -26579,7 +26591,6 @@ "properties": { "proposals": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -26650,7 +26661,6 @@ }, "total_deposit": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -26756,7 +26766,6 @@ }, "options": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -26792,7 +26801,6 @@ "properties": { "votes": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -26819,7 +26827,6 @@ }, "options": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -26937,7 +26944,6 @@ }, "options": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -27023,7 +27029,6 @@ }, "amount": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -27046,7 +27051,6 @@ "properties": { "min_deposit": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -27073,7 +27077,6 @@ "properties": { "min_deposit": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -27137,7 +27140,6 @@ }, "messages": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -27202,7 +27204,6 @@ }, "total_deposit": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -27279,7 +27280,6 @@ }, "amount": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -27305,7 +27305,6 @@ "properties": { "deposits": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -27320,7 +27319,6 @@ }, "amount": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -27378,7 +27376,6 @@ "properties": { "min_deposit": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -27423,7 +27420,6 @@ "properties": { "min_deposit": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -27492,7 +27488,6 @@ }, "messages": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -27557,7 +27552,6 @@ }, "total_deposit": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -27612,7 +27606,6 @@ "properties": { "proposals": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -27623,7 +27616,6 @@ }, "messages": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -27688,7 +27680,6 @@ }, "total_deposit": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -27801,7 +27792,6 @@ }, "options": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -27841,7 +27831,6 @@ "properties": { "votes": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -27856,7 +27845,6 @@ }, "options": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -27963,7 +27951,6 @@ }, "options": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -28140,7 +28127,6 @@ "properties": { "info": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -28466,7 +28452,6 @@ }, "valset": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -28588,7 +28573,6 @@ }, "unbonding_ids": { "type": "array", - "maxItems": 10, "items": { "type": "string", "format": "uint64" @@ -28694,7 +28678,6 @@ "properties": { "delegation_responses": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -28757,7 +28740,6 @@ "properties": { "unbonding_responses": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -28771,7 +28753,6 @@ }, "entries": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -28955,7 +28936,6 @@ }, "unbonding_ids": { "type": "array", - "maxItems": 10, "items": { "type": "string", "format": "uint64" @@ -28973,7 +28953,6 @@ "properties": { "validators": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -29095,7 +29074,6 @@ }, "unbonding_ids": { "type": "array", - "maxItems": 10, "items": { "type": "string", "format": "uint64" @@ -29230,7 +29208,6 @@ }, "valset": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -29352,7 +29329,6 @@ }, "unbonding_ids": { "type": "array", - "maxItems": 10, "items": { "type": "string", "format": "uint64" @@ -29430,7 +29406,6 @@ "properties": { "redelegation_responses": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -29451,7 +29426,6 @@ }, "entries": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -29493,7 +29467,6 @@ }, "entries": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -29577,7 +29550,6 @@ }, "entries": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -29625,7 +29597,6 @@ "properties": { "delegation_responses": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -29806,7 +29777,6 @@ }, "unbonding_ids": { "type": "array", - "maxItems": 10, "items": { "type": "string", "format": "uint64" @@ -29824,7 +29794,6 @@ "properties": { "unbonding_responses": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -29838,7 +29807,6 @@ }, "entries": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -29903,7 +29871,6 @@ "properties": { "validators": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -30025,7 +29992,6 @@ }, "unbonding_ids": { "type": "array", - "maxItems": 10, "items": { "type": "string", "format": "uint64" @@ -30073,7 +30039,6 @@ }, "entries": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -30210,7 +30175,6 @@ }, "entries": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -30252,7 +30216,6 @@ }, "entries": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -30313,7 +30276,6 @@ }, "entries": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -30508,7 +30470,6 @@ }, "unbonding_ids": { "type": "array", - "maxItems": 10, "items": { "type": "string", "format": "uint64" @@ -30677,7 +30638,6 @@ }, "events": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -30686,7 +30646,6 @@ }, "attributes": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -30750,7 +30709,6 @@ }, "events": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -30759,7 +30717,6 @@ }, "attributes": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -30783,7 +30740,6 @@ }, "msg_responses": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -30812,7 +30768,6 @@ }, "attributes": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -30860,7 +30815,6 @@ }, "logs": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -30873,7 +30827,6 @@ }, "events": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -30882,7 +30835,6 @@ }, "attributes": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -30941,7 +30893,6 @@ }, "events": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -30950,7 +30901,6 @@ }, "attributes": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -31007,7 +30957,6 @@ "properties": { "signer_infos": { "type": "array", - "maxItems": 10, "items": { "$ref": "#/definitions/cosmos.tx.v1beta1.SignerInfo" }, @@ -31019,7 +30968,6 @@ "properties": { "amount": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -31055,7 +31003,6 @@ "properties": { "amount": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -31146,7 +31093,6 @@ }, "logs": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -31159,7 +31105,6 @@ }, "events": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -31168,7 +31113,6 @@ }, "attributes": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -31227,7 +31171,6 @@ }, "events": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -31236,7 +31179,6 @@ }, "attributes": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -31269,7 +31211,6 @@ "properties": { "amount": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -31305,7 +31246,6 @@ "properties": { "txs": { "type": "array", - "maxItems": 10, "items": { "$ref": "#/definitions/cosmos.tx.v1beta1.Tx" }, @@ -31438,7 +31378,6 @@ "properties": { "txs": { "type": "array", - "maxItems": 10, "items": { "type": "string", "format": "byte" @@ -31453,7 +31392,6 @@ "properties": { "evidence": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -31746,7 +31684,6 @@ }, "signatures": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -31787,7 +31724,6 @@ "properties": { "validators": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -31865,7 +31801,6 @@ }, "byzantine_validators": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -31951,7 +31886,6 @@ }, "signatures": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -32044,7 +31978,6 @@ }, "logs": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -32057,7 +31990,6 @@ }, "events": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -32066,7 +31998,6 @@ }, "attributes": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -32125,7 +32056,6 @@ }, "events": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -32134,7 +32064,6 @@ }, "attributes": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -32167,7 +32096,6 @@ "properties": { "txs": { "type": "array", - "maxItems": 10, "items": { "$ref": "#/definitions/cosmos.tx.v1beta1.Tx" }, @@ -32175,7 +32103,6 @@ }, "tx_responses": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -32207,7 +32134,6 @@ }, "logs": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -32220,7 +32146,6 @@ }, "events": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -32229,7 +32154,6 @@ }, "attributes": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -32288,7 +32212,6 @@ }, "events": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -32297,7 +32220,6 @@ }, "attributes": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -32398,7 +32320,6 @@ }, "mode_infos": { "type": "array", - "maxItems": 10, "items": { "$ref": "#/definitions/cosmos.tx.v1beta1.ModeInfo" }, @@ -32429,7 +32350,11 @@ }, "cosmos.tx.v1beta1.OrderBy": { "type": "string", - "enum": ["ORDER_BY_UNSPECIFIED", "ORDER_BY_ASC", "ORDER_BY_DESC"], + "enum": [ + "ORDER_BY_UNSPECIFIED", + "ORDER_BY_ASC", + "ORDER_BY_DESC" + ], "default": "ORDER_BY_UNSPECIFIED", "description": "- ORDER_BY_UNSPECIFIED: ORDER_BY_UNSPECIFIED specifies an unknown sorting order. OrderBy defaults to ASC in this case.\n - ORDER_BY_ASC: ORDER_BY_ASC defines ascending order\n - ORDER_BY_DESC: ORDER_BY_DESC defines descending order", "title": "OrderBy defines the sorting order" @@ -32513,7 +32438,6 @@ }, "events": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -32522,7 +32446,6 @@ }, "attributes": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -32546,7 +32469,6 @@ }, "msg_responses": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -32574,7 +32496,6 @@ "properties": { "amount": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -32605,7 +32526,6 @@ "properties": { "messages": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -32634,7 +32554,6 @@ }, "extension_options": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -32654,7 +32573,6 @@ }, "non_critical_extension_options": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -32681,7 +32599,6 @@ }, "signatures": { "type": "array", - "maxItems": 10, "items": { "type": "string", "format": "byte" @@ -32696,7 +32613,6 @@ "properties": { "messages": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -32725,7 +32641,6 @@ }, "extension_options": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -32745,7 +32660,6 @@ }, "non_critical_extension_options": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -32854,7 +32768,6 @@ }, "attributes": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -33006,7 +32919,6 @@ "properties": { "txs": { "type": "array", - "maxItems": 10, "items": { "type": "string", "format": "byte" @@ -33021,7 +32933,6 @@ "properties": { "evidence": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -33314,7 +33225,6 @@ }, "signatures": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -33355,7 +33265,6 @@ "properties": { "validators": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -33433,7 +33342,6 @@ }, "byzantine_validators": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -33519,7 +33427,6 @@ }, "signatures": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -33603,7 +33510,6 @@ }, "signatures": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -33671,7 +33577,6 @@ "properties": { "txs": { "type": "array", - "maxItems": 10, "items": { "type": "string", "format": "byte" @@ -34121,7 +34026,6 @@ }, "signatures": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -34162,7 +34066,6 @@ "properties": { "validators": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -34240,7 +34143,6 @@ }, "byzantine_validators": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -34291,7 +34193,6 @@ "properties": { "evidence": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -34584,7 +34485,6 @@ }, "signatures": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -34625,7 +34525,6 @@ "properties": { "validators": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -34703,7 +34602,6 @@ }, "byzantine_validators": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -34890,7 +34788,6 @@ }, "signatures": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -34931,7 +34828,6 @@ "properties": { "validators": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -35144,7 +35040,6 @@ }, "signatures": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -35185,7 +35080,6 @@ "properties": { "validators": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -35263,7 +35157,6 @@ }, "byzantine_validators": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -35442,7 +35335,6 @@ }, "signatures": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -35525,7 +35417,6 @@ "properties": { "validators": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -35690,7 +35581,6 @@ "properties": { "ops": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -35825,7 +35715,6 @@ "properties": { "txs": { "type": "array", - "maxItems": 10, "items": { "type": "string", "format": "byte" @@ -35840,7 +35729,6 @@ "properties": { "evidence": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -36133,7 +36021,6 @@ }, "signatures": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -36174,7 +36061,6 @@ "properties": { "validators": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -36252,7 +36138,6 @@ }, "byzantine_validators": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -36338,7 +36223,6 @@ }, "signatures": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -36506,7 +36390,6 @@ "properties": { "txs": { "type": "array", - "maxItems": 10, "items": { "type": "string", "format": "byte" @@ -36521,7 +36404,6 @@ "properties": { "evidence": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -36814,7 +36696,6 @@ }, "signatures": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -36855,7 +36736,6 @@ "properties": { "validators": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -36933,7 +36813,6 @@ }, "byzantine_validators": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -37019,7 +36898,6 @@ }, "signatures": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -37159,7 +37037,6 @@ "properties": { "txs": { "type": "array", - "maxItems": 10, "items": { "type": "string", "format": "byte" @@ -37174,7 +37051,6 @@ "properties": { "evidence": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -37467,7 +37343,6 @@ }, "signatures": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -37508,7 +37383,6 @@ "properties": { "validators": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -37586,7 +37460,6 @@ }, "byzantine_validators": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -37672,7 +37545,6 @@ }, "signatures": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -37843,7 +37715,6 @@ "properties": { "txs": { "type": "array", - "maxItems": 10, "items": { "type": "string", "format": "byte" @@ -37858,7 +37729,6 @@ "properties": { "evidence": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -38151,7 +38021,6 @@ }, "signatures": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -38192,7 +38061,6 @@ "properties": { "validators": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -38270,7 +38138,6 @@ }, "byzantine_validators": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -38356,7 +38223,6 @@ }, "signatures": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -38496,7 +38362,6 @@ "properties": { "txs": { "type": "array", - "maxItems": 10, "items": { "type": "string", "format": "byte" @@ -38511,7 +38376,6 @@ "properties": { "evidence": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -38804,7 +38668,6 @@ }, "signatures": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -38845,7 +38708,6 @@ "properties": { "validators": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -38923,7 +38785,6 @@ }, "byzantine_validators": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -39009,7 +38870,6 @@ }, "signatures": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -39058,7 +38918,6 @@ }, "validators": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -39189,7 +39048,6 @@ }, "build_deps": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -39237,7 +39095,6 @@ }, "validators": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -39425,7 +39282,6 @@ "properties": { "ops": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -39502,7 +39358,6 @@ }, "build_deps": { "type": "array", - "maxItems": 10, "items": { "type": "object", "properties": { @@ -39610,4 +39465,4 @@ } } } -} +} \ No newline at end of file diff --git a/go.mod b/go.mod index 996d6db082..18e4764d3c 100644 --- a/go.mod +++ b/go.mod @@ -257,7 +257,7 @@ replace ( // use Cosmos-SDK fork to enable Ledger functionality github.com/cosmos/cosmos-sdk => github.com/evmos/cosmos-sdk v0.47.8-evmos // use Evmos geth fork - github.com/ethereum/go-ethereum => github.com/evmos/go-ethereum v1.10.26-evmos-rc2 + github.com/ethereum/go-ethereum => github.com/evmos/go-ethereum v1.10.26-evmos-rc4 // Security Advisory https://github.com/advisories/GHSA-h395-qcrw-5vmq github.com/gin-gonic/gin => github.com/gin-gonic/gin v1.9.1 // replace broken goleveldb diff --git a/go.sum b/go.sum index ab56aa3737..a3f161a904 100644 --- a/go.sum +++ b/go.sum @@ -472,8 +472,8 @@ github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go. github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evmos/cosmos-sdk v0.47.8-evmos h1:XOkJq3MeWDnTrNfDZk1bvCdrmjyyoxyL5gaTrguHPuA= github.com/evmos/cosmos-sdk v0.47.8-evmos/go.mod h1:VTAtthIsmfplanhFfUTfT6ED4F+kkJxT7nmvmKXRthI= -github.com/evmos/go-ethereum v1.10.26-evmos-rc2 h1:tYghk1ZZ8X4/OQ4YI9hvtm8aSN8OSqO0g9vo/sCMdBo= -github.com/evmos/go-ethereum v1.10.26-evmos-rc2/go.mod h1:/6CsT5Ceen2WPLI/oCA3xMcZ5sWMF/D46SjM/ayY0Oo= +github.com/evmos/go-ethereum v1.10.26-evmos-rc4 h1:vwDVMScuB2KSu8ze5oWUuxm6v3bMUp6dL3PWvJNJY+I= +github.com/evmos/go-ethereum v1.10.26-evmos-rc4/go.mod h1:/6CsT5Ceen2WPLI/oCA3xMcZ5sWMF/D46SjM/ayY0Oo= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= diff --git a/gomod2nix.toml b/gomod2nix.toml index bef92ac9a0..fee75bc187 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -238,8 +238,8 @@ schema = 3 version = "v1.1.0" hash = "sha256-LFcJue98awAFkSPRc93tVvon3kWS7AvumrluxxRzt4c=" [mod."github.com/ethereum/go-ethereum"] - version = "v1.10.26-evmos-rc2" - hash = "sha256-hHTSv2zX22f3aoOKR6E2xvGqO8gZqJxw1y9YIMavpXk=" + version = "v1.10.26-evmos-rc4" + hash = "sha256-6yEh1YOYIbnTmXfSaAkEfc0p9ufALhDGT8Jn1jB64zo=" replaced = "github.com/evmos/go-ethereum" [mod."github.com/felixge/httpsnoop"] version = "v1.0.4" diff --git a/proto/buf.yaml b/proto/buf.yaml index d7876a9fc2..d12661f152 100644 --- a/proto/buf.yaml +++ b/proto/buf.yaml @@ -20,6 +20,7 @@ lint: - RPC_RESPONSE_STANDARD_NAME - RPC_REQUEST_RESPONSE_UNIQUE - COMMENT_MESSAGE + - ENUM_ZERO_VALUE_SUFFIX breaking: use: - FILE diff --git a/proto/ethermint/evm/v1/evm.proto b/proto/ethermint/evm/v1/evm.proto index 5ba7c2cb89..4e558df26d 100644 --- a/proto/ethermint/evm/v1/evm.proto +++ b/proto/ethermint/evm/v1/evm.proto @@ -12,10 +12,8 @@ message Params { // evm_denom represents the token denomination used to run the EVM state // transitions. string evm_denom = 1 [(gogoproto.moretags) = "yaml:\"evm_denom\""]; - // enable_create toggles state transitions that use the vm.Create function - bool enable_create = 2 [(gogoproto.moretags) = "yaml:\"enable_create\""]; - // enable_call toggles state transitions that use the vm.Call function - bool enable_call = 3 [(gogoproto.moretags) = "yaml:\"enable_call\""]; + // enable_create and enable call have been deprecated + reserved 2, 3; // extra_eips defines the additional EIPs for the vm.Config repeated int64 extra_eips = 4 [(gogoproto.customname) = "ExtraEIPs", (gogoproto.moretags) = "yaml:\"extra_eips\""]; // chain_config defines the EVM chain configuration parameters @@ -28,6 +26,41 @@ message Params { repeated string active_precompiles = 7; // evm_channels is the list of channel identifiers from EVM compatible chains repeated string evm_channels = 8 [(gogoproto.customname) = "EVMChannels"]; + // access_control defines the permission policy of the EVM + AccessControl access_control = 9 [(gogoproto.customname) = "AccessControl", (gogoproto.nullable) = false]; +} + +// AccessControl defines the permission policy of the EVM +// for creating and calling contracts +message AccessControl { + // create defines the permission policy for creating contracts + AccessControlType create = 1 [(gogoproto.nullable) = false]; + // call defines the permission policy for calling contracts + AccessControlType call = 2 [(gogoproto.nullable) = false]; +} + +// AccessControlType defines the permission type for policies +message AccessControlType { + // access_type defines which type of permission is required for the operation + AccessType access_type = 1 [(gogoproto.customname) = "AccessType", (gogoproto.moretags) = "yaml:\"access_type\""]; + // allowlist_addresses defines defines different things depending on the AccessType: + // - ACCESS_TYPE_PERMISSIONLESS: list of addresses that are blocked from performing the operation + // - ACCESS_TYPE_RESTRICTED: ignored + // - ACCESS_TYPE_PERMISSIONED: list of addresses that are allowed to perform the operation + repeated string access_control_list = 2 + [(gogoproto.customname) = "AccessControlList", (gogoproto.moretags) = "yaml:\"access_control_list\""]; +} + +// AccessType defines the types of permissions for the operations +enum AccessType { + option (gogoproto.goproto_enum_prefix) = false; + + // ACCESS_TYPE_PERMISSIONLESS does not restrict the operation to anyone + ACCESS_TYPE_PERMISSIONLESS = 0 [(gogoproto.enumvalue_customname) = "AccessTypePermissionless"]; + // ACCESS_TYPE_RESTRICTED restrict the operation to anyone + ACCESS_TYPE_RESTRICTED = 1 [(gogoproto.enumvalue_customname) = "AccessTypeRestricted"]; + // ACCESS_TYPE_PERMISSIONED only allows the operation for specific addresses + ACCESS_TYPE_PERMISSIONED = 2 [(gogoproto.enumvalue_customname) = "AccessTypePermissioned"]; } // ChainConfig defines the Ethereum ChainConfig parameters using *sdk.Int values diff --git a/testutil/integration/evmos/factory/factory.go b/testutil/integration/evmos/factory/factory.go index 7fe6c67ea2..e588d99714 100644 --- a/testutil/integration/evmos/factory/factory.go +++ b/testutil/integration/evmos/factory/factory.go @@ -168,7 +168,7 @@ func (tf *IntegrationTxFactory) buildSignedTx(msg evmtypes.MsgEthereumTx) (signi func (tf *IntegrationTxFactory) checkEthTxResponse(res *abcitypes.ResponseDeliverTx) error { var txData sdktypes.TxMsgData if !res.IsOK() { - return fmt.Errorf("tx failed. Code: %d, Logs: %s", res.Code, res.Log) + return fmt.Errorf("tx failed with Code: %d, Logs: %s", res.Code, res.Log) } cdc := tf.ec.Codec @@ -186,7 +186,7 @@ func (tf *IntegrationTxFactory) checkEthTxResponse(res *abcitypes.ResponseDelive } if evmRes.Failed() { - return fmt.Errorf("tx failed. VmError: %v, Logs: %s", evmRes.VmError, res.GetLog()) + return fmt.Errorf("tx failed with VmError: %v, Logs: %s", evmRes.VmError, res.GetLog()) } return nil } diff --git a/x/erc20/keeper/evm_test.go b/x/erc20/keeper/evm_test.go index c8b1e4f681..40b578f48e 100644 --- a/x/erc20/keeper/evm_test.go +++ b/x/erc20/keeper/evm_test.go @@ -223,7 +223,7 @@ func (suite *KeeperTestSuite) TestCallEVMWithData() { types.ModuleAddress, func() ([]byte, *common.Address) { params := suite.app.EvmKeeper.GetParams(suite.ctx) - params.EnableCreate = false + params.AccessControl.Create.AccessType = evmtypes.AccessTypeRestricted _ = suite.app.EvmKeeper.SetParams(suite.ctx, params) ctorArgs, _ := contracts.ERC20MinterBurnerDecimalsContract.ABI.Pack("", "test", "test", uint8(18)) data := append(contracts.ERC20MinterBurnerDecimalsContract.Bin, ctorArgs...) //nolint:gocritic diff --git a/x/evm/keeper/grpc_query_test.go b/x/evm/keeper/grpc_query_test.go index d3ed335427..fadd6cc7ef 100644 --- a/x/evm/keeper/grpc_query_test.go +++ b/x/evm/keeper/grpc_query_test.go @@ -27,10 +27,10 @@ import ( const invalidAddress = "0x0000" // expGasConsumed is the gas consumed in traceTx setup (GetProposerAddr + CalculateBaseFee) -const expGasConsumed = 7436 +const expGasConsumed = 7442 // expGasConsumedWithFeeMkt is the gas consumed in traceTx setup (GetProposerAddr + CalculateBaseFee) with enabled feemarket -const expGasConsumedWithFeeMkt = 7430 +const expGasConsumedWithFeeMkt = 7436 func (suite *KeeperTestSuite) TestQueryAccount() { var ( @@ -692,7 +692,11 @@ func (suite *KeeperTestSuite) TestEstimateGas() { Data: (*hexutil.Bytes)(&data), } params := suite.app.EvmKeeper.GetParams(suite.ctx) - params.EnableCreate = false + params.AccessControl = types.AccessControl{ + Create: types.AccessControlType{ + AccessType: types.AccessTypeRestricted, + }, + } err = suite.app.EvmKeeper.SetParams(suite.ctx, params) suite.Require().NoError(err) }, @@ -940,13 +944,17 @@ func (suite *KeeperTestSuite) TestTraceTx() { suite.Commit() params := suite.app.EvmKeeper.GetParams(suite.ctx) - params.EnableCreate = false + params.AccessControl = types.AccessControl{ + Create: types.AccessControlType{ + AccessType: types.AccessTypeRestricted, + }, + } err := suite.app.EvmKeeper.SetParams(suite.ctx, params) suite.Require().NoError(err) }, expPass: true, traceResponse: "{\"gas\":34828,\"failed\":false,\"returnValue\":\"0000000000000000000000000000000000000000000000000000000000000001\",\"structLogs\":[{\"pc\":0,\"op\":\"PUSH1\",\"gas\":", - expFinalGas: 26540, // gas consumed in traceTx setup (GetProposerAddr + CalculateBaseFee) + gas consumed in malleate func + expFinalGas: 26744, // gas consumed in traceTx setup (GetProposerAddr + CalculateBaseFee) + gas consumed in malleate func }, { msg: "invalid chain id", @@ -1323,9 +1331,9 @@ func (suite *KeeperTestSuite) TestEthCall() { data = append(data, ctorArgs...) testCases := []struct { - name string - malleate func() - expPass bool + name string + malleate func() + expVMError bool }{ { "invalid args", @@ -1350,7 +1358,7 @@ func (suite *KeeperTestSuite) TestEthCall() { false, }, { - "set param EnableCreate = false", + "set param AccessControl - no Access", func() { args, err := json.Marshal(&types.TransactionArgs{ From: &address, @@ -1361,11 +1369,37 @@ func (suite *KeeperTestSuite) TestEthCall() { req = &types.EthCallRequest{Args: args, GasCap: config.DefaultGasCap} params := suite.app.EvmKeeper.GetParams(suite.ctx) - params.EnableCreate = false + params.AccessControl = types.AccessControl{ + Create: types.AccessControlType{ + AccessType: types.AccessTypeRestricted, + }, + } err = suite.app.EvmKeeper.SetParams(suite.ctx, params) suite.Require().NoError(err) }, - false, + true, + }, + { + "set param AccessControl = non whitelist", + func() { + args, err := json.Marshal(&types.TransactionArgs{ + From: &address, + Data: (*hexutil.Bytes)(&data), + }) + + suite.Require().NoError(err) + req = &types.EthCallRequest{Args: args, GasCap: config.DefaultGasCap} + + params := suite.app.EvmKeeper.GetParams(suite.ctx) + params.AccessControl = types.AccessControl{ + Create: types.AccessControlType{ + AccessType: types.AccessTypePermissioned, + }, + } + err = suite.app.EvmKeeper.SetParams(suite.ctx, params) + suite.Require().NoError(err) + }, + true, }, } for _, tc := range testCases { @@ -1374,9 +1408,9 @@ func (suite *KeeperTestSuite) TestEthCall() { tc.malleate() res, err := suite.queryClient.EthCall(suite.ctx, req) - if tc.expPass { + if tc.expVMError { suite.Require().NotNil(res) - suite.Require().NoError(err) + suite.Require().Contains(res.VmError, "does not have permission to deploy contracts") } else { suite.Require().Error(err) } diff --git a/x/evm/keeper/hooks_test.go b/x/evm/keeper/hooks_test.go deleted file mode 100644 index 900e971541..0000000000 --- a/x/evm/keeper/hooks_test.go +++ /dev/null @@ -1,90 +0,0 @@ -package keeper_test - -import ( - "errors" - "math/big" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" - ethtypes "github.com/ethereum/go-ethereum/core/types" - - "github.com/evmos/evmos/v18/x/evm/keeper" - "github.com/evmos/evmos/v18/x/evm/statedb" - "github.com/evmos/evmos/v18/x/evm/types" -) - -// LogRecordHook records all the logs -type LogRecordHook struct { - Logs []*ethtypes.Log -} - -func (dh *LogRecordHook) PostTxProcessing(_ sdk.Context, _ core.Message, receipt *ethtypes.Receipt) error { - dh.Logs = receipt.Logs - return nil -} - -// FailureHook always fail -type FailureHook struct{} - -func (dh FailureHook) PostTxProcessing(_ sdk.Context, _ core.Message, _ *ethtypes.Receipt) error { - return errors.New("post tx processing failed") -} - -func (suite *KeeperTestSuite) TestEvmHooks() { - testCases := []struct { - msg string - setupHook func() types.EvmHooks - expFunc func(hook types.EvmHooks, result error) - }{ - { - "log collect hook", - func() types.EvmHooks { - return &LogRecordHook{} - }, - func(hook types.EvmHooks, result error) { - suite.Require().NoError(result) - suite.Require().Equal(1, len((hook.(*LogRecordHook).Logs))) - }, - }, - { - "always fail hook", - func() types.EvmHooks { - return &FailureHook{} - }, - func(_ types.EvmHooks, result error) { - suite.Require().Error(result) - }, - }, - } - - for _, tc := range testCases { - suite.SetupTest() - suite.app.EvmKeeper = suite.app.EvmKeeper.CleanHooks() - hook := tc.setupHook() - suite.app.EvmKeeper.SetHooks(keeper.NewMultiEvmHooks(hook)) - - k := suite.app.EvmKeeper - ctx := suite.ctx - txHash := common.BigToHash(big.NewInt(1)) - vmdb := statedb.New(ctx, k, statedb.NewTxConfig( - common.BytesToHash(ctx.HeaderHash().Bytes()), - txHash, - 0, - 0, - )) - - vmdb.AddLog(ðtypes.Log{ - Topics: []common.Hash{}, - Address: suite.address, - }) - logs := vmdb.Logs() - receipt := ðtypes.Receipt{ - TxHash: txHash, - Logs: logs, - } - result := k.PostTxProcessing(ctx, ethtypes.Message{}, receipt) - - tc.expFunc(hook, result) - } -} diff --git a/x/evm/keeper/integration_test.go b/x/evm/keeper/integration_test.go index 220eb41962..03c6572c22 100644 --- a/x/evm/keeper/integration_test.go +++ b/x/evm/keeper/integration_test.go @@ -48,7 +48,7 @@ var _ = Describe("Handling a MsgEthereumTx message", Label("EVM"), Ordered, func var s *IntegrationTestSuite BeforeAll(func() { - keyring := testkeyring.New(3) + keyring := testkeyring.New(4) integrationNetwork := network.New( network.WithPreFundedAccounts(keyring.GetAllAccAddrs()...), ) @@ -226,13 +226,7 @@ var _ = Describe("Handling a MsgEthereumTx message", Label("EVM"), Ordered, func Expect(err).To(BeNil()) Expect(mintResponse.IsOK()).To(Equal(true), "transaction should have succeeded", mintResponse.GetLog()) - // Check contract call response has the expected topics for a mint - // call within an ERC20 contract - expectedTopics := []string{ - "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", - "0x0000000000000000000000000000000000000000000000000000000000000000", - } - err = integrationutils.CheckTxTopics(mintResponse, expectedTopics) + err = checkMintTopics(mintResponse) Expect(err).To(BeNil()) err = s.network.NextBlock() @@ -291,103 +285,61 @@ var _ = Describe("Handling a MsgEthereumTx message", Label("EVM"), Ordered, func }) }) - When("EnableCreate param is set to false", Ordered, func() { - BeforeAll(func() { - // Set params to default values - defaultParams := evmtypes.DefaultParams() - defaultParams.EnableCreate = false - err := s.network.UpdateEvmParams(defaultParams) - Expect(err).To(BeNil()) - - err = s.network.NextBlock() - Expect(err).To(BeNil()) - }) - - It("performs a transfer transaction", func() { - senderKey := s.keyring.GetKey(0) - receiverKey := s.keyring.GetKey(1) - denom := s.network.GetDenom() - - senderPrevBalanceResponse, err := s.grpcHandler.GetBalance(senderKey.AccAddr, denom) - Expect(err).To(BeNil()) - senderPrevBalance := senderPrevBalanceResponse.GetBalance().Amount - - receiverPrevBalanceResponse, err := s.grpcHandler.GetBalance(receiverKey.AccAddr, denom) - Expect(err).To(BeNil()) - receiverPrevBalance := receiverPrevBalanceResponse.GetBalance().Amount - - transferAmount := int64(1000) + DescribeTable("Performs transfer and contract call", func(getTestParams func() evmtypes.Params, transferParams, contractCallParams PermissionsTableTest) { + params := getTestParams() + err := s.network.UpdateEvmParams(params) + Expect(err).To(BeNil()) - txArgs := evmtypes.EvmTxArgs{ - To: &receiverKey.Addr, - Amount: big.NewInt(transferAmount), - } + err = s.network.NextBlock() + Expect(err).To(BeNil()) - res, err := s.factory.ExecuteEthTx(senderKey.Priv, txArgs) + signer := s.keyring.GetKey(transferParams.SignerIndex) + receiver := s.keyring.GetKey(1) + txArgs := evmtypes.EvmTxArgs{ + To: &receiver.Addr, + Amount: big.NewInt(1000), + // Hard coded gas limit to avoid failure on gas estimation because + // of the param + GasLimit: 100000, + } + res, err := s.factory.ExecuteEthTx(signer.Priv, txArgs) + if transferParams.ExpFail { + Expect(err).NotTo(BeNil()) + Expect(err.Error()).To(ContainSubstring("does not have permission to perform a call")) + } else { Expect(err).To(BeNil()) Expect(res.IsOK()).To(Equal(true), "transaction should have succeeded", res.GetLog()) + } - err = s.network.NextBlock() - Expect(err).To(BeNil()) - - // Check sender balance after transaction - senderBalanceResultBeforeFees := senderPrevBalance.Sub(math.NewInt(transferAmount)) - senderAfterBalance, err := s.grpcHandler.GetBalance(senderKey.AccAddr, denom) - Expect(err).To(BeNil()) - Expect(senderAfterBalance.GetBalance().Amount.LTE(senderBalanceResultBeforeFees)).To(BeTrue()) + senderKey := s.keyring.GetKey(contractCallParams.SignerIndex) + contractAddress := common.HexToAddress(staking.PrecompileAddress) + validatorAddress := s.network.GetValidators()[1].OperatorAddress + contractABI, err := staking.LoadABI() + Expect(err).To(BeNil()) - // Check receiver balance after transaction - receiverBalanceResult := receiverPrevBalance.Add(math.NewInt(transferAmount)) - receverAfterBalanceResponse, err := s.grpcHandler.GetBalance(receiverKey.AccAddr, denom) - Expect(err).To(BeNil()) - Expect(receverAfterBalanceResponse.GetBalance().Amount).To(Equal(receiverBalanceResult)) - }) + // If grpc query fails, that means there were no previous delegations + prevDelegation := big.NewInt(0) + prevDelegationRes, err := s.grpcHandler.GetDelegation(senderKey.AccAddr.String(), validatorAddress) + if err == nil { + prevDelegation = prevDelegationRes.DelegationResponse.Balance.Amount.BigInt() + } - It("fails when trying to perform contract deployment", func() { - senderPriv := s.keyring.GetPrivKey(0) - constructorArgs := []interface{}{"coin", "token", uint8(18)} - compiledContract := contracts.ERC20MinterBurnerDecimalsContract - contractAddr, err := s.factory.DeployContract( - senderPriv, - evmtypes.EvmTxArgs{}, // Default values - factory.ContractDeploymentData{ - Contract: compiledContract, - ConstructorArgs: constructorArgs, - }, - ) + amountToDelegate := big.NewInt(200) + totalSupplyTxArgs := evmtypes.EvmTxArgs{ + To: &contractAddress, + } + // Perform a delegate transaction to the staking precompile + delegateArgs := factory.CallArgs{ + ContractABI: contractABI, + MethodName: staking.DelegateMethod, + Args: []interface{}{senderKey.Addr, validatorAddress, amountToDelegate}, + } + delegateResponse, err := s.factory.ExecuteContractCall(senderKey.Priv, totalSupplyTxArgs, delegateArgs) + if contractCallParams.ExpFail { Expect(err).NotTo(BeNil()) - Expect(err.Error()).To(ContainSubstring("EVM Create operation is disabled")) - Expect(contractAddr).To(Equal(common.Address{})) - }) - - It("performs a contract call to the staking precompile", func() { - senderKey := s.keyring.GetKey(1) - contractAddress := common.HexToAddress(staking.PrecompileAddress) - validatorAddress := s.network.GetValidators()[1].OperatorAddress - contractABI, err := staking.LoadABI() - Expect(err).To(BeNil()) - - // If grpc query fails, that means there were no previous delegations - prevDelegation := big.NewInt(0) - prevDelegationRes, err := s.grpcHandler.GetDelegation(senderKey.AccAddr.String(), validatorAddress) - if err == nil { - prevDelegation = prevDelegationRes.DelegationResponse.Balance.Amount.BigInt() - } - - amountToDelegate := big.NewInt(200) - - totalSupplyTxArgs := evmtypes.EvmTxArgs{ - To: &contractAddress, - } - - // Perform a delegate transaction to the staking precompile - delegateArgs := factory.CallArgs{ - ContractABI: contractABI, - MethodName: staking.DelegateMethod, - Args: []interface{}{senderKey.Addr, validatorAddress, amountToDelegate}, - } - delegateResponse, err := s.factory.ExecuteContractCall(senderKey.Priv, totalSupplyTxArgs, delegateArgs) + Expect(err.Error()).To(ContainSubstring("does not have permission to perform a call")) + } else { Expect(err).To(BeNil()) Expect(delegateResponse.IsOK()).To(Equal(true), "transaction should have succeeded", delegateResponse.GetLog()) @@ -411,68 +363,290 @@ var _ = Describe("Handling a MsgEthereumTx message", Label("EVM"), Ordered, func expectedDelegationAmt := amountToDelegate.Add(amountToDelegate, prevDelegation) Expect(delegationOutput.Balance.Amount.String()).To(Equal(expectedDelegationAmt.String())) - }) - }) - - When("EnableCall param is set to false", Ordered, func() { - BeforeAll(func() { + } + }, + // Entry("transfer and call fail with CALL permission policy set to restricted", func() evmtypes.Params { + // // Set params to default values + // defaultParams := evmtypes.DefaultParams() + // defaultParams.AccessControl.Call = evmtypes.AccessControlType{ + // AccessType: evmtypes.AccessTypeRestricted, + // } + // return defaultParams + // }, + // OpcodeTestTable{ExpFail: true, SignerIndex: 0}, + // OpcodeTestTable{ExpFail: true, SignerIndex: 0}, + // ), + Entry("transfer and call succeed with CALL permission policy set to default and CREATE permission policy set to restricted", func() evmtypes.Params { + blockedSignerIndex := 1 // Set params to default values defaultParams := evmtypes.DefaultParams() - defaultParams.EnableCall = false - err := s.network.UpdateEvmParams(defaultParams) - Expect(err).To(BeNil()) + defaultParams.AccessControl.Create = evmtypes.AccessControlType{ + AccessType: evmtypes.AccessTypeRestricted, + AccessControlList: []string{s.keyring.GetAddr(blockedSignerIndex).String()}, + } + return defaultParams + }, + PermissionsTableTest{ExpFail: false, SignerIndex: 0}, + PermissionsTableTest{ExpFail: false, SignerIndex: 0}, + ), + Entry("transfer and call are successful with CALL permission policy set to permissionless and address not blocked", func() evmtypes.Params { + blockedSignerIndex := 1 + // Set params to default values + defaultParams := evmtypes.DefaultParams() + defaultParams.AccessControl.Call = evmtypes.AccessControlType{ + AccessType: evmtypes.AccessTypePermissionless, + AccessControlList: []string{s.keyring.GetAddr(blockedSignerIndex).String()}, + } + return defaultParams + }, + PermissionsTableTest{ExpFail: false, SignerIndex: 0}, + PermissionsTableTest{ExpFail: false, SignerIndex: 0}, + ), + Entry("transfer fails with signer blocked and call succeeds with signer NOT blocked permission policy set to permissionless", func() evmtypes.Params { + blockedSignerIndex := 1 + // Set params to default values + defaultParams := evmtypes.DefaultParams() + defaultParams.AccessControl.Call = evmtypes.AccessControlType{ + AccessType: evmtypes.AccessTypePermissionless, + AccessControlList: []string{s.keyring.GetAddr(blockedSignerIndex).String()}, + } + return defaultParams + }, + PermissionsTableTest{ExpFail: true, SignerIndex: 1}, + PermissionsTableTest{ExpFail: false, SignerIndex: 0}, + ), + Entry("transfer succeeds with signer NOT blocked and call fails with signer blocked permission policy set to permissionless", func() evmtypes.Params { + blockedSignerIndex := 1 + // Set params to default values + defaultParams := evmtypes.DefaultParams() + defaultParams.AccessControl.Call = evmtypes.AccessControlType{ + AccessType: evmtypes.AccessTypePermissionless, + AccessControlList: []string{s.keyring.GetAddr(blockedSignerIndex).String()}, + } + return defaultParams + }, + PermissionsTableTest{ExpFail: false, SignerIndex: 0}, + PermissionsTableTest{ExpFail: true, SignerIndex: 1}, + ), + Entry("transfer and call succeeds with CALL permission policy set to permissioned and signer whitelisted on both", func() evmtypes.Params { + blockedSignerIndex := 1 + // Set params to default values + defaultParams := evmtypes.DefaultParams() + defaultParams.AccessControl.Call = evmtypes.AccessControlType{ + AccessType: evmtypes.AccessTypePermissioned, + AccessControlList: []string{s.keyring.GetAddr(blockedSignerIndex).String()}, + } + return defaultParams + }, + PermissionsTableTest{ExpFail: false, SignerIndex: 1}, + PermissionsTableTest{ExpFail: false, SignerIndex: 1}, + ), + Entry("transfer and call fails with CALL permission policy set to permissioned and signer not whitelisted on both", func() evmtypes.Params { + blockedSignerIndex := 1 + // Set params to default values + defaultParams := evmtypes.DefaultParams() + defaultParams.AccessControl.Call = evmtypes.AccessControlType{ + AccessType: evmtypes.AccessTypePermissioned, + AccessControlList: []string{s.keyring.GetAddr(blockedSignerIndex).String()}, + } + return defaultParams + }, + PermissionsTableTest{ExpFail: true, SignerIndex: 0}, + PermissionsTableTest{ExpFail: true, SignerIndex: 0}, + ), + ) + + DescribeTable("Performs contract deployment and contract call with AccessControl", func(getTestParams func() evmtypes.Params, createParams, callParams PermissionsTableTest) { + params := getTestParams() + err := s.network.UpdateEvmParams(params) + Expect(err).To(BeNil()) - err = s.network.NextBlock() - Expect(err).To(BeNil()) - }) + err = s.network.NextBlock() + Expect(err).To(BeNil()) - It("fails when performing a transfer transaction", func() { - senderPriv := s.keyring.GetPrivKey(0) - receiver := s.keyring.GetKey(1) - txArgs := evmtypes.EvmTxArgs{ - To: &receiver.Addr, - Amount: big.NewInt(1000), - // Hard coded gas limit to avoid failure on gas estimation because - // of the param - GasLimit: 100000, - } + createSigner := s.keyring.GetPrivKey(createParams.SignerIndex) + constructorArgs := []interface{}{"coin", "token", uint8(18)} + compiledContract := contracts.ERC20MinterBurnerDecimalsContract - res, err := s.factory.ExecuteEthTx(senderPriv, txArgs) + contractAddr, err := s.factory.DeployContract( + createSigner, + evmtypes.EvmTxArgs{}, // Default values + factory.ContractDeploymentData{ + Contract: compiledContract, + ConstructorArgs: constructorArgs, + }, + ) + if createParams.ExpFail { Expect(err).NotTo(BeNil()) - Expect(err.Error()).To(ContainSubstring("EVM Call operation is disabled")) - Expect(res.IsErr()).To(Equal(true), "transaction should have failed", res.GetLog()) - }) + Expect(err.Error()).To(ContainSubstring("does not have permission to deploy contracts")) + // If contract deployment is expected to fail, we can skip the rest of the test + return + } - It("performs a contract deployment and fails to perform a contract call", func() { - senderPriv := s.keyring.GetPrivKey(0) - constructorArgs := []interface{}{"coin", "token", uint8(18)} - compiledContract := contracts.ERC20MinterBurnerDecimalsContract - contractAddr, err := s.factory.DeployContract( - senderPriv, - evmtypes.EvmTxArgs{}, // Default values - factory.ContractDeploymentData{ - Contract: compiledContract, - ConstructorArgs: constructorArgs, - }, - ) - Expect(err).To(BeNil()) - Expect(contractAddr).ToNot(Equal(common.Address{})) + Expect(err).To(BeNil()) + Expect(contractAddr).ToNot(Equal(common.Address{})) - txArgs := evmtypes.EvmTxArgs{ - To: &contractAddr, - // Hard coded gas limit to avoid failure on gas estimation because - // of the param - GasLimit: 100000, + err = s.network.NextBlock() + Expect(err).To(BeNil()) + + callSigner := s.keyring.GetPrivKey(callParams.SignerIndex) + totalSupplyTxArgs := evmtypes.EvmTxArgs{ + To: &contractAddr, + } + totalSupplyArgs := factory.CallArgs{ + ContractABI: compiledContract.ABI, + MethodName: "totalSupply", + Args: []interface{}{}, + } + res, err := s.factory.ExecuteContractCall(callSigner, totalSupplyTxArgs, totalSupplyArgs) + if callParams.ExpFail { + Expect(err).NotTo(BeNil()) + Expect(err.Error()).To(ContainSubstring("does not have permission to perform a call")) + } else { + Expect(err).To(BeNil()) + Expect(res.IsOK()).To(Equal(true), "transaction should have succeeded", res.GetLog()) + } + }, + Entry("Create and call is successful with create permission policy set to permissionless and address not blocked ", func() evmtypes.Params { + blockedSignerIndex := 1 + // Set params to default values + defaultParams := evmtypes.DefaultParams() + defaultParams.AccessControl.Create = evmtypes.AccessControlType{ + AccessType: evmtypes.AccessTypePermissionless, + AccessControlList: []string{s.keyring.GetAddr(blockedSignerIndex).String()}, } - callArgs := factory.CallArgs{ - ContractABI: compiledContract.ABI, - MethodName: "mint", - Args: []interface{}{s.keyring.GetAddr(1), big.NewInt(1e18)}, + return defaultParams + }, + PermissionsTableTest{ExpFail: false, SignerIndex: 0}, + PermissionsTableTest{ExpFail: false, SignerIndex: 0}, + ), + Entry("Create fails with create permission policy set to permissionless and signer is blocked ", func() evmtypes.Params { + blockedSignerIndex := 1 + // Set params to default values + defaultParams := evmtypes.DefaultParams() + defaultParams.AccessControl.Create = evmtypes.AccessControlType{ + AccessType: evmtypes.AccessTypePermissionless, + AccessControlList: []string{s.keyring.GetAddr(blockedSignerIndex).String()}, } - res, err := s.factory.ExecuteContractCall(senderPriv, txArgs, callArgs) - Expect(err).NotTo(BeNil()) - Expect(err.Error()).To(ContainSubstring("EVM Call operation is disabled")) - Expect(res.IsErr()).To(Equal(true), "transaction should have failed", res.GetLog()) - }) - }) + return defaultParams + }, + PermissionsTableTest{ExpFail: true, SignerIndex: 1}, + PermissionsTableTest{}, // Call should not be executed + ), + Entry("Create and call is successful with call permission policy set to permissionless and address not blocked ", func() evmtypes.Params { + blockedSignerIndex := 1 + // Set params to default values + defaultParams := evmtypes.DefaultParams() + defaultParams.AccessControl.Call = evmtypes.AccessControlType{ + AccessType: evmtypes.AccessTypePermissionless, + AccessControlList: []string{s.keyring.GetAddr(blockedSignerIndex).String()}, + } + return defaultParams + }, + PermissionsTableTest{ExpFail: false, SignerIndex: 0}, + PermissionsTableTest{ExpFail: false, SignerIndex: 0}, + ), + Entry("Create is successful and call fails with call permission policy set to permissionless and address blocked ", func() evmtypes.Params { + blockedSignerIndex := 1 + // Set params to default values + defaultParams := evmtypes.DefaultParams() + defaultParams.AccessControl.Call = evmtypes.AccessControlType{ + AccessType: evmtypes.AccessTypePermissionless, + AccessControlList: []string{s.keyring.GetAddr(blockedSignerIndex).String()}, + } + return defaultParams + }, + PermissionsTableTest{ExpFail: false, SignerIndex: 0}, + PermissionsTableTest{ExpFail: true, SignerIndex: 1}, + ), + Entry("Create fails create permission policy set to restricted", func() evmtypes.Params { + // Set params to default values + defaultParams := evmtypes.DefaultParams() + defaultParams.AccessControl.Create = evmtypes.AccessControlType{ + AccessType: evmtypes.AccessTypeRestricted, + } + return defaultParams + }, + PermissionsTableTest{ExpFail: true, SignerIndex: 0}, + PermissionsTableTest{}, // Call should not be executed + ), + Entry("Create succeeds and call fails when call permission policy set to restricted", func() evmtypes.Params { + // Set params to default values + defaultParams := evmtypes.DefaultParams() + defaultParams.AccessControl.Call = evmtypes.AccessControlType{ + AccessType: evmtypes.AccessTypeRestricted, + } + return defaultParams + }, + PermissionsTableTest{ExpFail: false, SignerIndex: 0}, + PermissionsTableTest{ExpFail: true, SignerIndex: 0}, + ), + Entry("Create and call are successful with create permission policy set to permissioned and signer whitelisted", func() evmtypes.Params { + whitelistedSignerIndex := 1 + // Set params to default values + defaultParams := evmtypes.DefaultParams() + defaultParams.AccessControl.Create = evmtypes.AccessControlType{ + AccessType: evmtypes.AccessTypePermissioned, + AccessControlList: []string{s.keyring.GetAddr(whitelistedSignerIndex).String()}, + } + return defaultParams + }, + PermissionsTableTest{ExpFail: false, SignerIndex: 1}, + PermissionsTableTest{ExpFail: false, SignerIndex: 0}, + ), + Entry("Create fails with create permission policy set to permissioned and signer NOT whitelisted", func() evmtypes.Params { + whitelistedSignerIndex := 1 + // Set params to default values + defaultParams := evmtypes.DefaultParams() + defaultParams.AccessControl.Create = evmtypes.AccessControlType{ + AccessType: evmtypes.AccessTypePermissioned, + AccessControlList: []string{s.keyring.GetAddr(whitelistedSignerIndex).String()}, + } + return defaultParams + }, + PermissionsTableTest{ExpFail: true, SignerIndex: 0}, + PermissionsTableTest{}, + ), + Entry("Create and call are successful with call permission policy set to permissioned and signer whitelisted", func() evmtypes.Params { + whitelistedSignerIndex := 1 + // Set params to default values + defaultParams := evmtypes.DefaultParams() + defaultParams.AccessControl.Call = evmtypes.AccessControlType{ + AccessType: evmtypes.AccessTypePermissioned, + AccessControlList: []string{s.keyring.GetAddr(whitelistedSignerIndex).String()}, + } + return defaultParams + }, + PermissionsTableTest{ExpFail: false, SignerIndex: 0}, + PermissionsTableTest{ExpFail: false, SignerIndex: 1}, + ), + Entry("Create succeeds and call fails with call permission policy set to permissioned and signer NOT whitelisted", func() evmtypes.Params { + whitelistedSignerIndex := 1 + // Set params to default values + defaultParams := evmtypes.DefaultParams() + defaultParams.AccessControl.Call = evmtypes.AccessControlType{ + AccessType: evmtypes.AccessTypePermissioned, + AccessControlList: []string{s.keyring.GetAddr(whitelistedSignerIndex).String()}, + } + return defaultParams + }, + PermissionsTableTest{ExpFail: false, SignerIndex: 0}, + PermissionsTableTest{ExpFail: true, SignerIndex: 0}, + ), + ) }) + +type PermissionsTableTest struct { + ExpFail bool + SignerIndex int +} + +func checkMintTopics(res abcitypes.ResponseDeliverTx) error { + // Check contract call response has the expected topics for a mint + // call within an ERC20 contract + expectedTopics := []string{ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + } + return integrationutils.CheckTxTopics(res, expectedTopics) +} diff --git a/x/evm/keeper/migrations.go b/x/evm/keeper/migrations.go index eccc0f62de..10dcc20479 100644 --- a/x/evm/keeper/migrations.go +++ b/x/evm/keeper/migrations.go @@ -7,6 +7,7 @@ import ( v4 "github.com/evmos/evmos/v18/x/evm/migrations/v4" v5 "github.com/evmos/evmos/v18/x/evm/migrations/v5" v6 "github.com/evmos/evmos/v18/x/evm/migrations/v6" + v7 "github.com/evmos/evmos/v18/x/evm/migrations/v7" "github.com/evmos/evmos/v18/x/evm/types" ) @@ -38,3 +39,8 @@ func (m Migrator) Migrate4to5(ctx sdk.Context) error { func (m Migrator) Migrate5to6(ctx sdk.Context) error { return v6.MigrateStore(ctx, m.keeper.storeKey, m.keeper.cdc) } + +// Migrate6to7 migrates the store from consensus version 6 to 7 +func (m Migrator) Migrate6to7(ctx sdk.Context) error { + return v7.MigrateStore(ctx, m.keeper.storeKey, m.keeper.cdc) +} diff --git a/x/evm/keeper/opcodes_hooks.go b/x/evm/keeper/opcodes_hooks.go new file mode 100644 index 0000000000..ad2d9899ab --- /dev/null +++ b/x/evm/keeper/opcodes_hooks.go @@ -0,0 +1,45 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package keeper + +import ( + "fmt" + + "github.com/evmos/evmos/v18/x/evm/types" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/vm" +) + +// DefaultOpCodesHooks is the default implementation of OpCodeHooks for EVMOS chain +// The hooks are used to enforce access control policies on EVM operations. +// They are ran BEFORE the respective opcode execution every time they are called. +type DefaultOpCodesHooks struct { + accessControl types.PermissionPolicy + signer common.Address +} + +// NewDefaultOpCodesHooks creates a new DefaultOpCodesHooks instance +func NewDefaultOpCodesHooks(accessControl types.PermissionPolicy, signer common.Address) vm.OpCodeHooks { + return &DefaultOpCodesHooks{ + accessControl: accessControl, + signer: signer, + } +} + +// CreateHook checks if the caller has permission to deploy contracts +func (h *DefaultOpCodesHooks) CreateHook(_ *vm.EVM, caller common.Address) error { + if h.accessControl.CanCreate(h.signer, caller) { + return nil + } + return fmt.Errorf("caller address %s does not have permission to deploy contracts", h.signer) +} + +// CallHook checks if the caller has permission to perform a call +func (h *DefaultOpCodesHooks) CallHook(_ *vm.EVM, caller common.Address, recipient common.Address) error { + if h.accessControl.CanCall(h.signer, caller, recipient) { + return nil + } + return fmt.Errorf("caller address %s does not have permission to perform a call", h.signer) +} diff --git a/x/evm/keeper/params_test.go b/x/evm/keeper/params_test.go index 17a01fbe4a..8ace1f0514 100644 --- a/x/evm/keeper/params_test.go +++ b/x/evm/keeper/params_test.go @@ -40,30 +40,38 @@ func (suite *KeeperTestSuite) TestParams() { true, }, { - "success - Check EnableCreate param is set to false and can be retrieved correctly", + "success - Check Access Control Create param is set to restricted and can be retrieved correctly", func() interface{} { - params.EnableCreate = false + params.AccessControl = types.AccessControl{ + Create: types.AccessControlType{ + AccessType: types.AccessTypeRestricted, + }, + } err := suite.app.EvmKeeper.SetParams(suite.ctx, params) suite.Require().NoError(err) - return params.EnableCreate + return types.AccessTypeRestricted }, func() interface{} { evmParams := suite.app.EvmKeeper.GetParams(suite.ctx) - return evmParams.GetEnableCreate() + return evmParams.GetAccessControl().Create.AccessType }, true, }, { - "success - Check EnableCall param is set to false and can be retrieved correctly", + "success - Check Access control param is set to restricted and can be retrieved correctly", func() interface{} { - params.EnableCall = false + params.AccessControl = types.AccessControl{ + Call: types.AccessControlType{ + AccessType: types.AccessTypeRestricted, + }, + } err := suite.app.EvmKeeper.SetParams(suite.ctx, params) suite.Require().NoError(err) - return params.EnableCall + return types.AccessTypeRestricted }, func() interface{} { evmParams := suite.app.EvmKeeper.GetParams(suite.ctx) - return evmParams.GetEnableCall() + return evmParams.GetAccessControl().Call.AccessType }, true, }, diff --git a/x/evm/keeper/setup_test.go b/x/evm/keeper/setup_test.go index 12d1ec82ce..a4f1b0d3ec 100644 --- a/x/evm/keeper/setup_test.go +++ b/x/evm/keeper/setup_test.go @@ -63,6 +63,10 @@ type KeeperTestSuite struct { denom string } +type UnitTestSuite struct { + suite.Suite +} + var s *KeeperTestSuite func TestKeeperTestSuite(t *testing.T) { @@ -71,6 +75,10 @@ func TestKeeperTestSuite(t *testing.T) { s.enableLondonHF = true suite.Run(t, s) + // Run UnitTestSuite + unitTestSuite := new(UnitTestSuite) + suite.Run(t, unitTestSuite) + // Run Ginkgo integration tests RegisterFailHandler(Fail) RunSpecs(t, "Keeper Suite") diff --git a/x/evm/keeper/state_transition.go b/x/evm/keeper/state_transition.go index c04da62e52..ec0281a3d0 100644 --- a/x/evm/keeper/state_transition.go +++ b/x/evm/keeper/state_transition.go @@ -58,7 +58,11 @@ func (k *Keeper) NewEVM( tracer = k.Tracer(ctx, msg, cfg.ChainConfig) } vmConfig := k.VMConfig(ctx, msg, cfg, tracer) - return vm.NewEVM(blockCtx, txCtx, stateDB, cfg.ChainConfig, vmConfig) + + signer := msg.From() + AccessControl := types.NewRestrictedPermissionPolicy(&cfg.Params.AccessControl, signer) + evmHooks := NewDefaultOpCodesHooks(AccessControl, signer) + return vm.NewEVMWithHooks(evmHooks, blockCtx, txCtx, stateDB, cfg.ChainConfig, vmConfig) } // GetHashFn implements vm.GetHashFunc for Ethermint. It handles 3 cases: @@ -313,13 +317,6 @@ func (k *Keeper) ApplyMessageWithConfig( vmErr error // vm errors do not effect consensus and are therefore not assigned to err ) - // return error if contract creation or call are disabled through governance - if !cfg.Params.EnableCreate && msg.To() == nil { - return nil, errorsmod.Wrap(types.ErrCreateDisabled, "failed to create new contract") - } else if !cfg.Params.EnableCall && msg.To() != nil { - return nil, errorsmod.Wrap(types.ErrCallDisabled, "failed to call contract") - } - stateDB := statedb.New(ctx, k, txConfig) evm := k.NewEVM(ctx, msg, cfg, tracer, stateDB) diff --git a/x/evm/keeper/state_transition_test.go b/x/evm/keeper/state_transition_test.go index 6f21ccc60b..ba03a59dd5 100644 --- a/x/evm/keeper/state_transition_test.go +++ b/x/evm/keeper/state_transition_test.go @@ -20,7 +20,7 @@ import ( utiltx "github.com/evmos/evmos/v18/testutil/tx" "github.com/evmos/evmos/v18/x/evm/keeper" "github.com/evmos/evmos/v18/x/evm/statedb" - "github.com/evmos/evmos/v18/x/evm/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) func (suite *KeeperTestSuite) TestGetHashFn() { @@ -448,7 +448,7 @@ func (suite *KeeperTestSuite) TestRefundGas() { refund := keeper.GasToRefund(vmdb.GetRefund(), gasUsed, tc.refundQuotient) suite.Require().Equal(tc.expGasRefund, refund) - err = suite.app.EvmKeeper.RefundGas(suite.ctx, m, refund, types.DefaultEVMDenom) + err = suite.app.EvmKeeper.RefundGas(suite.ctx, m, refund, evmtypes.DefaultEVMDenom) if tc.noError { suite.Require().NoError(err) } else { @@ -522,11 +522,11 @@ func (suite *KeeperTestSuite) TestEVMConfig() { proposerAddress := suite.ctx.BlockHeader().ProposerAddress cfg, err := suite.app.EvmKeeper.EVMConfig(suite.ctx, proposerAddress, big.NewInt(9000)) suite.Require().NoError(err) - suite.Require().Equal(types.DefaultParams(), cfg.Params) + suite.Require().Equal(evmtypes.DefaultParams(), cfg.Params) // london hardfork is enabled by default suite.Require().Equal(big.NewInt(0), cfg.BaseFee) suite.Require().Equal(suite.address, cfg.CoinBase) - suite.Require().Equal(types.DefaultParams().ChainConfig.EthereumConfig(big.NewInt(9000)), cfg.ChainConfig) + suite.Require().Equal(evmtypes.DefaultParams().ChainConfig.EthereumConfig(big.NewInt(9000)), cfg.ChainConfig) } func (suite *KeeperTestSuite) TestContractDeployment() { @@ -575,7 +575,7 @@ func (suite *KeeperTestSuite) TestApplyMessageWithConfig() { err error expectedGasUsed uint64 config *statedb.EVMConfig - keeperParams types.Params + keeperParams evmtypes.Params signer ethtypes.Signer vmdb *statedb.StateDB txConfig statedb.TxConfig @@ -586,6 +586,7 @@ func (suite *KeeperTestSuite) TestApplyMessageWithConfig() { name string malleate func() expErr bool + expVMErr bool }{ { "message applied ok", @@ -604,11 +605,16 @@ func (suite *KeeperTestSuite) TestApplyMessageWithConfig() { suite.Require().NoError(err) }, false, + false, }, { "call contract tx with config param EnableCall = false", func() { - config.Params.EnableCall = false + config.Params.AccessControl = evmtypes.AccessControl{ + Call: evmtypes.AccessControlType{ + AccessType: evmtypes.AccessTypeRestricted, + }, + } msg, err = newNativeMessage( vmdb.GetNonce(suite.address), suite.ctx.BlockHeight(), @@ -622,15 +628,21 @@ func (suite *KeeperTestSuite) TestApplyMessageWithConfig() { ) suite.Require().NoError(err) }, + false, true, }, { "create contract tx with config param EnableCreate = false", func() { - msg, err = suite.createContractGethMsg(vmdb.GetNonce(suite.address), signer, chainCfg, big.NewInt(1)) + msg, err = suite.createContractGethMsg(vmdb.GetNonce(suite.address), signer, chainCfg, big.NewInt(2)) suite.Require().NoError(err) - config.Params.EnableCreate = false + config.Params.AccessControl = evmtypes.AccessControl{ + Create: evmtypes.AccessControlType{ + AccessType: evmtypes.AccessTypeRestricted, + }, + } }, + false, true, }, { @@ -654,6 +666,7 @@ func (suite *KeeperTestSuite) TestApplyMessageWithConfig() { suite.Require().NoError(err) }, true, + false, }, } @@ -680,6 +693,11 @@ func (suite *KeeperTestSuite) TestApplyMessageWithConfig() { return } + if tc.expVMErr { + suite.Require().NotEmpty(res.VmError) + return + } + suite.Require().NoError(err) suite.Require().False(res.Failed()) suite.Require().Equal(expectedGasUsed, res.GasUsed) @@ -697,16 +715,16 @@ func (suite *KeeperTestSuite) createContractGethMsg(nonce uint64, signer ethtype return ethMsg.AsMessage(msgSigner, nil) } -func (suite *KeeperTestSuite) createContractMsgTx(nonce uint64, signer ethtypes.Signer, gasPrice *big.Int) (*types.MsgEthereumTx, error) { +func (suite *KeeperTestSuite) createContractMsgTx(nonce uint64, signer ethtypes.Signer, gasPrice *big.Int) (*evmtypes.MsgEthereumTx, error) { contractCreateTx := ðtypes.AccessListTx{ GasPrice: gasPrice, - Gas: params.TxGasContractCreation, + Gas: params.TxGasContractCreation + 1000, // account for data length To: nil, Data: []byte("contract_data"), Nonce: nonce, } ethTx := ethtypes.NewTx(contractCreateTx) - ethMsg := &types.MsgEthereumTx{} + ethMsg := &evmtypes.MsgEthereumTx{} err := ethMsg.FromEthereumTx(ethTx) suite.Require().NoError(err) ethMsg.From = suite.address.Hex() diff --git a/x/evm/migrations/v4/migrate.go b/x/evm/migrations/v4/migrate.go index cf6425a8a1..8e5dcd45de 100644 --- a/x/evm/migrations/v4/migrate.go +++ b/x/evm/migrations/v4/migrate.go @@ -40,14 +40,5 @@ func MigrateStore( if params.AllowUnprotectedTxs { store.Set(types.ParamStoreKeyAllowUnprotectedTxs, []byte{0x01}) } - - if params.EnableCall { - store.Set(types.ParamStoreKeyEnableCall, []byte{0x01}) - } - - if params.EnableCreate { - store.Set(types.ParamStoreKeyEnableCreate, []byte{0x01}) - } - return nil } diff --git a/x/evm/migrations/v4/migrate_test.go b/x/evm/migrations/v4/migrate_test.go index 0bc11d9fb9..1ff833927a 100644 --- a/x/evm/migrations/v4/migrate_test.go +++ b/x/evm/migrations/v4/migrate_test.go @@ -81,8 +81,6 @@ func TestMigrate(t *testing.T) { ExtraEIPs: extraEIPs, } - require.Equal(t, legacySubspace.ps.EnableCall, params.EnableCall) - require.Equal(t, legacySubspace.ps.EnableCreate, params.EnableCreate) require.Equal(t, legacySubspace.ps.AllowUnprotectedTxs, params.AllowUnprotectedTxs) require.Equal(t, legacySubspace.ps.ExtraEIPs, params.ExtraEIPs.EIPs) require.EqualValues(t, legacySubspace.ps.ChainConfig, params.V4ChainConfig) diff --git a/x/evm/migrations/v5/migrate.go b/x/evm/migrations/v5/migrate.go index 79891e390d..a81f772739 100644 --- a/x/evm/migrations/v5/migrate.go +++ b/x/evm/migrations/v5/migrate.go @@ -44,8 +44,6 @@ func MigrateStore( params.EvmDenom = denom params.ExtraEIPs = extraEIPs.EIPs params.ChainConfig = chainConfig - params.EnableCreate = store.Has(types.ParamStoreKeyEnableCreate) - params.EnableCall = store.Has(types.ParamStoreKeyEnableCall) params.AllowUnprotectedTxs = store.Has(types.ParamStoreKeyAllowUnprotectedTxs) store.Delete(types.ParamStoreKeyChainConfig) diff --git a/x/evm/migrations/v5/migrate_test.go b/x/evm/migrations/v5/migrate_test.go index 0ddbf72909..c4eda647ac 100644 --- a/x/evm/migrations/v5/migrate_test.go +++ b/x/evm/migrations/v5/migrate_test.go @@ -67,8 +67,6 @@ func TestMigrate(t *testing.T) { // test that the params have been migrated correctly require.Equal(t, types.DefaultEVMDenom, params.EvmDenom) - require.True(t, params.EnableCreate) - require.True(t, params.EnableCall) require.True(t, params.AllowUnprotectedTxs) require.Equal(t, chainConfig, params.ChainConfig) require.Equal(t, extraEIPs.EIPs, params.ExtraEIPs) diff --git a/x/evm/migrations/v6/migrate.go b/x/evm/migrations/v6/migrate.go index b27b37a5f0..fb0b3d71b7 100644 --- a/x/evm/migrations/v6/migrate.go +++ b/x/evm/migrations/v6/migrate.go @@ -30,8 +30,6 @@ func MigrateStore( cdc.MustUnmarshal(paramsV5Bz, ¶msV5) params.EvmDenom = paramsV5.EvmDenom - params.EnableCreate = paramsV5.EnableCreate - params.EnableCall = paramsV5.EnableCall params.ExtraEIPs = paramsV5.ExtraEIPs params.ChainConfig = types.ChainConfig{ HomesteadBlock: paramsV5.ChainConfig.HomesteadBlock, diff --git a/x/evm/migrations/v6/migrate_test.go b/x/evm/migrations/v6/migrate_test.go index a0b3bd56a0..20bc913eb4 100644 --- a/x/evm/migrations/v6/migrate_test.go +++ b/x/evm/migrations/v6/migrate_test.go @@ -34,8 +34,6 @@ func TestMigrate(t *testing.T) { require.NoError(t, err) v5Params := v5types.V5Params{ EvmDenom: types.DefaultEVMDenom, - EnableCreate: types.DefaultEnableCreate, - EnableCall: types.DefaultEnableCall, ChainConfig: chainCfgV5, ExtraEIPs: types.DefaultExtraEIPs, AllowUnprotectedTxs: types.DefaultAllowUnprotectedTxs, @@ -55,8 +53,6 @@ func TestMigrate(t *testing.T) { // test that the params have been migrated correctly require.Equal(t, types.DefaultEVMDenom, params.EvmDenom) - require.True(t, params.EnableCreate) - require.True(t, params.EnableCall) require.False(t, params.AllowUnprotectedTxs) require.Equal(t, chainConfig, params.ChainConfig) require.Equal(t, types.DefaultExtraEIPs, params.ExtraEIPs) diff --git a/x/evm/migrations/v7/migrate.go b/x/evm/migrations/v7/migrate.go new file mode 100644 index 0000000000..be3287a1e8 --- /dev/null +++ b/x/evm/migrations/v7/migrate.go @@ -0,0 +1,69 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) +package v7 + +import ( + "github.com/cosmos/cosmos-sdk/codec" + storetypes "github.com/cosmos/cosmos-sdk/store/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/evmos/evmos/v18/x/evm/types" + + v6types "github.com/evmos/evmos/v18/x/evm/migrations/v7/types" +) + +// MigrateStore migrates the x/evm module state from the consensus version 6 to +// version 7. Specifically, it adds the new AccessControl policy. +func MigrateStore( + ctx sdk.Context, + storeKey storetypes.StoreKey, + cdc codec.BinaryCodec, +) error { + var ( + paramsV6 v6types.V6Params + params types.Params + ) + + store := ctx.KVStore(storeKey) + + paramsV6Bz := store.Get(types.KeyPrefixParams) + cdc.MustUnmarshal(paramsV6Bz, ¶msV6) + + params.EvmDenom = paramsV6.EvmDenom + params.ExtraEIPs = paramsV6.ExtraEIPs + params.ChainConfig = types.ChainConfig{ + HomesteadBlock: paramsV6.ChainConfig.HomesteadBlock, + DAOForkBlock: paramsV6.ChainConfig.DAOForkBlock, + DAOForkSupport: paramsV6.ChainConfig.DAOForkSupport, + EIP150Block: paramsV6.ChainConfig.EIP150Block, + EIP150Hash: paramsV6.ChainConfig.EIP150Hash, + EIP155Block: paramsV6.ChainConfig.EIP155Block, + EIP158Block: paramsV6.ChainConfig.EIP158Block, + ByzantiumBlock: paramsV6.ChainConfig.ByzantiumBlock, + ConstantinopleBlock: paramsV6.ChainConfig.ConstantinopleBlock, + PetersburgBlock: paramsV6.ChainConfig.PetersburgBlock, + IstanbulBlock: paramsV6.ChainConfig.IstanbulBlock, + MuirGlacierBlock: paramsV6.ChainConfig.MuirGlacierBlock, + BerlinBlock: paramsV6.ChainConfig.BerlinBlock, + LondonBlock: paramsV6.ChainConfig.LondonBlock, + ArrowGlacierBlock: paramsV6.ChainConfig.ArrowGlacierBlock, + GrayGlacierBlock: paramsV6.ChainConfig.GrayGlacierBlock, + MergeNetsplitBlock: paramsV6.ChainConfig.MergeNetsplitBlock, + ShanghaiBlock: paramsV6.ChainConfig.ShanghaiBlock, + CancunBlock: paramsV6.ChainConfig.CancunBlock, + } + params.AllowUnprotectedTxs = paramsV6.AllowUnprotectedTxs + params.ActivePrecompiles = paramsV6.ActivePrecompiles + params.EVMChannels = paramsV6.EVMChannels + + // set the default access control configuration + params.AccessControl = types.DefaultAccessControl + + if err := params.Validate(); err != nil { + return err + } + + bz := cdc.MustMarshal(¶ms) + + store.Set(types.KeyPrefixParams, bz) + return nil +} diff --git a/x/evm/migrations/v7/migrate_test.go b/x/evm/migrations/v7/migrate_test.go new file mode 100644 index 0000000000..8e2fa01f7e --- /dev/null +++ b/x/evm/migrations/v7/migrate_test.go @@ -0,0 +1,62 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) +package v7_test + +import ( + "encoding/json" + "testing" + + "github.com/cosmos/cosmos-sdk/testutil" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/require" + + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/encoding" + "github.com/evmos/evmos/v18/x/evm/migrations/v7" + v6types "github.com/evmos/evmos/v18/x/evm/migrations/v7/types" + "github.com/evmos/evmos/v18/x/evm/types" +) + +func TestMigrate(t *testing.T) { + encCfg := encoding.MakeConfig(app.ModuleBasics) + cdc := encCfg.Codec + + storeKey := sdk.NewKVStoreKey(types.ModuleName) + tKey := sdk.NewTransientStoreKey("transient_test") + ctx := testutil.DefaultContext(storeKey, tKey) + kvStore := ctx.KVStore(storeKey) + + chainConfig := types.DefaultChainConfig() + bz, err := json.Marshal(chainConfig) + require.NoError(t, err) + var chainCfgV6 v6types.V6ChainConfig + err = json.Unmarshal(bz, &chainCfgV6) + require.NoError(t, err) + v6Params := v6types.V6Params{ + EvmDenom: types.DefaultEVMDenom, + ChainConfig: chainCfgV6, + ExtraEIPs: types.DefaultExtraEIPs, + AllowUnprotectedTxs: types.DefaultAllowUnprotectedTxs, + ActivePrecompiles: types.AvailableEVMExtensions, + EVMChannels: types.DefaultEVMChannels, + } + + // Set the params in the store + paramsV6Bz := cdc.MustMarshal(&v6Params) + kvStore.Set(types.KeyPrefixParams, paramsV6Bz) + + err = v7.MigrateStore(ctx, storeKey, cdc) + require.NoError(t, err) + + paramsBz := kvStore.Get(types.KeyPrefixParams) + var params types.Params + cdc.MustUnmarshal(paramsBz, ¶ms) + + // test that the params have been migrated correctly + require.Equal(t, types.DefaultEVMDenom, params.EvmDenom) + require.False(t, params.AllowUnprotectedTxs) + require.Equal(t, chainConfig, params.ChainConfig) + require.Equal(t, types.DefaultExtraEIPs, params.ExtraEIPs) + require.Equal(t, types.DefaultEVMChannels, params.EVMChannels) + require.Equal(t, types.DefaultAccessControl, params.AccessControl) +} diff --git a/x/evm/migrations/v7/types/evm.pb.go b/x/evm/migrations/v7/types/evm.pb.go new file mode 100644 index 0000000000..d6184e6984 --- /dev/null +++ b/x/evm/migrations/v7/types/evm.pb.go @@ -0,0 +1,4175 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: ethermint/evm/v1/evm.proto + +package types + +import ( + cosmossdk_io_math "cosmossdk.io/math" + fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// V6Params defines the EVM module parameters +type V6Params struct { + // evm_denom represents the token denomination used to run the EVM state + // transitions. + EvmDenom string `protobuf:"bytes,1,opt,name=evm_denom,json=evmDenom,proto3" json:"evm_denom,omitempty" yaml:"evm_denom"` + // enable_create toggles state transitions that use the vm.Create function + EnableCreate bool `protobuf:"varint,2,opt,name=enable_create,json=enableCreate,proto3" json:"enable_create,omitempty" yaml:"enable_create"` + // enable_call toggles state transitions that use the vm.Call function + EnableCall bool `protobuf:"varint,3,opt,name=enable_call,json=enableCall,proto3" json:"enable_call,omitempty" yaml:"enable_call"` + // extra_eips defines the additional EIPs for the vm.Config + ExtraEIPs []int64 `protobuf:"varint,4,rep,packed,name=extra_eips,json=extraEips,proto3" json:"extra_eips,omitempty" yaml:"extra_eips"` + // chain_config defines the EVM chain configuration parameters + ChainConfig V6ChainConfig `protobuf:"bytes,5,opt,name=chain_config,json=chainConfig,proto3" json:"chain_config" yaml:"chain_config"` + // allow_unprotected_txs defines if replay-protected (i.e non EIP155 + // signed) transactions can be executed on the state machine. + AllowUnprotectedTxs bool `protobuf:"varint,6,opt,name=allow_unprotected_txs,json=allowUnprotectedTxs,proto3" json:"allow_unprotected_txs,omitempty"` + // active_precompiles defines the slice of hex addresses of the precompiled + // contracts that are active + ActivePrecompiles []string `protobuf:"bytes,7,rep,name=active_precompiles,json=activePrecompiles,proto3" json:"active_precompiles,omitempty"` + // evm_channels is the list of channel identifiers from EVM compatible chains + EVMChannels []string `protobuf:"bytes,8,rep,name=evm_channels,json=evmChannels,proto3" json:"evm_channels,omitempty"` +} + +func (m *V6Params) Reset() { *m = V6Params{} } +func (m *V6Params) String() string { return proto.CompactTextString(m) } +func (*V6Params) ProtoMessage() {} +func (*V6Params) Descriptor() ([]byte, []int) { + return fileDescriptor_d21ecc92c8c8583e, []int{0} +} +func (m *V6Params) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *V6Params) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Params.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *V6Params) XXX_Merge(src proto.Message) { + xxx_messageInfo_Params.Merge(m, src) +} +func (m *V6Params) XXX_Size() int { + return m.Size() +} +func (m *V6Params) XXX_DiscardUnknown() { + xxx_messageInfo_Params.DiscardUnknown(m) +} + +var xxx_messageInfo_Params proto.InternalMessageInfo + +func (m *V6Params) GetEvmDenom() string { + if m != nil { + return m.EvmDenom + } + return "" +} + +func (m *V6Params) GetEnableCreate() bool { + if m != nil { + return m.EnableCreate + } + return false +} + +func (m *V6Params) GetEnableCall() bool { + if m != nil { + return m.EnableCall + } + return false +} + +func (m *V6Params) GetExtraEIPs() []int64 { + if m != nil { + return m.ExtraEIPs + } + return nil +} + +func (m *V6Params) GetChainConfig() V6ChainConfig { + if m != nil { + return m.ChainConfig + } + return V6ChainConfig{} +} + +func (m *V6Params) GetAllowUnprotectedTxs() bool { + if m != nil { + return m.AllowUnprotectedTxs + } + return false +} + +func (m *V6Params) GetActivePrecompiles() []string { + if m != nil { + return m.ActivePrecompiles + } + return nil +} + +func (m *V6Params) GetEVMChannels() []string { + if m != nil { + return m.EVMChannels + } + return nil +} + +// V6ChainConfig defines the Ethereum V6ChainConfig parameters using *sdk.Int values +// instead of *big.Int. +type V6ChainConfig struct { + // homestead_block switch (nil no fork, 0 = already homestead) + HomesteadBlock *cosmossdk_io_math.Int `protobuf:"bytes,1,opt,name=homestead_block,json=homesteadBlock,proto3,customtype=cosmossdk.io/math.Int" json:"homestead_block,omitempty" yaml:"homestead_block"` + // dao_fork_block corresponds to TheDAO hard-fork switch block (nil no fork) + DAOForkBlock *cosmossdk_io_math.Int `protobuf:"bytes,2,opt,name=dao_fork_block,json=daoForkBlock,proto3,customtype=cosmossdk.io/math.Int" json:"dao_fork_block,omitempty" yaml:"dao_fork_block"` + // dao_fork_support defines whether the nodes supports or opposes the DAO hard-fork + DAOForkSupport bool `protobuf:"varint,3,opt,name=dao_fork_support,json=daoForkSupport,proto3" json:"dao_fork_support,omitempty" yaml:"dao_fork_support"` + // eip150_block: EIP150 implements the Gas price changes + // (https://github.com/ethereum/EIPs/issues/150) EIP150 HF block (nil no fork) + EIP150Block *cosmossdk_io_math.Int `protobuf:"bytes,4,opt,name=eip150_block,json=eip150Block,proto3,customtype=cosmossdk.io/math.Int" json:"eip150_block,omitempty" yaml:"eip150_block"` + // eip150_hash: EIP150 HF hash (needed for header only clients as only gas pricing changed) + EIP150Hash string `protobuf:"bytes,5,opt,name=eip150_hash,json=eip150Hash,proto3" json:"eip150_hash,omitempty" yaml:"byzantium_block"` + // eip155_block: EIP155Block HF block + EIP155Block *cosmossdk_io_math.Int `protobuf:"bytes,6,opt,name=eip155_block,json=eip155Block,proto3,customtype=cosmossdk.io/math.Int" json:"eip155_block,omitempty" yaml:"eip155_block"` + // eip158_block: EIP158 HF block + EIP158Block *cosmossdk_io_math.Int `protobuf:"bytes,7,opt,name=eip158_block,json=eip158Block,proto3,customtype=cosmossdk.io/math.Int" json:"eip158_block,omitempty" yaml:"eip158_block"` + // byzantium_block: Byzantium switch block (nil no fork, 0 = already on byzantium) + ByzantiumBlock *cosmossdk_io_math.Int `protobuf:"bytes,8,opt,name=byzantium_block,json=byzantiumBlock,proto3,customtype=cosmossdk.io/math.Int" json:"byzantium_block,omitempty" yaml:"byzantium_block"` + // constantinople_block: Constantinople switch block (nil no fork, 0 = already activated) + ConstantinopleBlock *cosmossdk_io_math.Int `protobuf:"bytes,9,opt,name=constantinople_block,json=constantinopleBlock,proto3,customtype=cosmossdk.io/math.Int" json:"constantinople_block,omitempty" yaml:"constantinople_block"` + // petersburg_block: Petersburg switch block (nil same as Constantinople) + PetersburgBlock *cosmossdk_io_math.Int `protobuf:"bytes,10,opt,name=petersburg_block,json=petersburgBlock,proto3,customtype=cosmossdk.io/math.Int" json:"petersburg_block,omitempty" yaml:"petersburg_block"` + // istanbul_block: Istanbul switch block (nil no fork, 0 = already on istanbul) + IstanbulBlock *cosmossdk_io_math.Int `protobuf:"bytes,11,opt,name=istanbul_block,json=istanbulBlock,proto3,customtype=cosmossdk.io/math.Int" json:"istanbul_block,omitempty" yaml:"istanbul_block"` + // muir_glacier_block: Eip-2384 (bomb delay) switch block (nil no fork, 0 = already activated) + MuirGlacierBlock *cosmossdk_io_math.Int `protobuf:"bytes,12,opt,name=muir_glacier_block,json=muirGlacierBlock,proto3,customtype=cosmossdk.io/math.Int" json:"muir_glacier_block,omitempty" yaml:"muir_glacier_block"` + // berlin_block: Berlin switch block (nil = no fork, 0 = already on berlin) + BerlinBlock *cosmossdk_io_math.Int `protobuf:"bytes,13,opt,name=berlin_block,json=berlinBlock,proto3,customtype=cosmossdk.io/math.Int" json:"berlin_block,omitempty" yaml:"berlin_block"` + // london_block: London switch block (nil = no fork, 0 = already on london) + LondonBlock *cosmossdk_io_math.Int `protobuf:"bytes,17,opt,name=london_block,json=londonBlock,proto3,customtype=cosmossdk.io/math.Int" json:"london_block,omitempty" yaml:"london_block"` + // arrow_glacier_block: Eip-4345 (bomb delay) switch block (nil = no fork, 0 = already activated) + ArrowGlacierBlock *cosmossdk_io_math.Int `protobuf:"bytes,18,opt,name=arrow_glacier_block,json=arrowGlacierBlock,proto3,customtype=cosmossdk.io/math.Int" json:"arrow_glacier_block,omitempty" yaml:"arrow_glacier_block"` + // gray_glacier_block: EIP-5133 (bomb delay) switch block (nil = no fork, 0 = already activated) + GrayGlacierBlock *cosmossdk_io_math.Int `protobuf:"bytes,20,opt,name=gray_glacier_block,json=grayGlacierBlock,proto3,customtype=cosmossdk.io/math.Int" json:"gray_glacier_block,omitempty" yaml:"gray_glacier_block"` + // merge_netsplit_block: Virtual fork after The Merge to use as a network splitter + MergeNetsplitBlock *cosmossdk_io_math.Int `protobuf:"bytes,21,opt,name=merge_netsplit_block,json=mergeNetsplitBlock,proto3,customtype=cosmossdk.io/math.Int" json:"merge_netsplit_block,omitempty" yaml:"merge_netsplit_block"` + // shanghai_block switch block (nil = no fork, 0 = already on shanghai) + ShanghaiBlock *cosmossdk_io_math.Int `protobuf:"bytes,22,opt,name=shanghai_block,json=shanghaiBlock,proto3,customtype=cosmossdk.io/math.Int" json:"shanghai_block,omitempty" yaml:"shanghai_block"` + // cancun_block switch block (nil = no fork, 0 = already on cancun) + CancunBlock *cosmossdk_io_math.Int `protobuf:"bytes,23,opt,name=cancun_block,json=cancunBlock,proto3,customtype=cosmossdk.io/math.Int" json:"cancun_block,omitempty" yaml:"cancun_block"` +} + +func (m *V6ChainConfig) Reset() { *m = V6ChainConfig{} } +func (m *V6ChainConfig) String() string { return proto.CompactTextString(m) } +func (*V6ChainConfig) ProtoMessage() {} +func (*V6ChainConfig) Descriptor() ([]byte, []int) { + return fileDescriptor_d21ecc92c8c8583e, []int{1} +} +func (m *V6ChainConfig) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *V6ChainConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ChainConfig.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *V6ChainConfig) XXX_Merge(src proto.Message) { + xxx_messageInfo_ChainConfig.Merge(m, src) +} +func (m *V6ChainConfig) XXX_Size() int { + return m.Size() +} +func (m *V6ChainConfig) XXX_DiscardUnknown() { + xxx_messageInfo_ChainConfig.DiscardUnknown(m) +} + +var xxx_messageInfo_ChainConfig proto.InternalMessageInfo + +func (m *V6ChainConfig) GetDAOForkSupport() bool { + if m != nil { + return m.DAOForkSupport + } + return false +} + +func (m *V6ChainConfig) GetEIP150Hash() string { + if m != nil { + return m.EIP150Hash + } + return "" +} + +// V6State represents a single Storage key value pair item. +type V6State struct { + // key is the stored key + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + // value is the stored value for the given key + Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *V6State) Reset() { *m = V6State{} } +func (m *V6State) String() string { return proto.CompactTextString(m) } +func (*V6State) ProtoMessage() {} +func (*V6State) Descriptor() ([]byte, []int) { + return fileDescriptor_d21ecc92c8c8583e, []int{2} +} +func (m *V6State) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *V6State) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_State.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *V6State) XXX_Merge(src proto.Message) { + xxx_messageInfo_State.Merge(m, src) +} +func (m *V6State) XXX_Size() int { + return m.Size() +} +func (m *V6State) XXX_DiscardUnknown() { + xxx_messageInfo_State.DiscardUnknown(m) +} + +var xxx_messageInfo_State proto.InternalMessageInfo + +func (m *V6State) GetKey() string { + if m != nil { + return m.Key + } + return "" +} + +func (m *V6State) GetValue() string { + if m != nil { + return m.Value + } + return "" +} + +// V6TransactionLogs define the logs generated from a transaction execution +// with a given hash. It it used for import/export data as transactions are not +// persisted on blockchain state after an upgrade. +type V6TransactionLogs struct { + // hash of the transaction + Hash string `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` + // logs is an array of Logs for the given transaction hash + Logs []*V6Log `protobuf:"bytes,2,rep,name=logs,proto3" json:"logs,omitempty"` +} + +func (m *V6TransactionLogs) Reset() { *m = V6TransactionLogs{} } +func (m *V6TransactionLogs) String() string { return proto.CompactTextString(m) } +func (*V6TransactionLogs) ProtoMessage() {} +func (*V6TransactionLogs) Descriptor() ([]byte, []int) { + return fileDescriptor_d21ecc92c8c8583e, []int{3} +} +func (m *V6TransactionLogs) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *V6TransactionLogs) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TransactionLogs.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *V6TransactionLogs) XXX_Merge(src proto.Message) { + xxx_messageInfo_TransactionLogs.Merge(m, src) +} +func (m *V6TransactionLogs) XXX_Size() int { + return m.Size() +} +func (m *V6TransactionLogs) XXX_DiscardUnknown() { + xxx_messageInfo_TransactionLogs.DiscardUnknown(m) +} + +var xxx_messageInfo_TransactionLogs proto.InternalMessageInfo + +func (m *V6TransactionLogs) GetHash() string { + if m != nil { + return m.Hash + } + return "" +} + +func (m *V6TransactionLogs) GetLogs() []*V6Log { + if m != nil { + return m.Logs + } + return nil +} + +// V6Log represents an protobuf compatible Ethereum V6Log that defines a contract +// log event. These events are generated by the LOG opcode and stored/indexed by +// the node. +// +// NOTE: address, topics and data are consensus fields. The rest of the fields +// are derived, i.e. filled in by the nodes, but not secured by consensus. +type V6Log struct { + // address of the contract that generated the event + Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` + // topics is a list of topics provided by the contract. + Topics []string `protobuf:"bytes,2,rep,name=topics,proto3" json:"topics,omitempty"` + // data which is supplied by the contract, usually ABI-encoded + Data []byte `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` + // block_number of the block in which the transaction was included + BlockNumber uint64 `protobuf:"varint,4,opt,name=block_number,json=blockNumber,proto3" json:"blockNumber"` + // tx_hash is the transaction hash + TxHash string `protobuf:"bytes,5,opt,name=tx_hash,json=txHash,proto3" json:"transactionHash"` + // tx_index of the transaction in the block + TxIndex uint64 `protobuf:"varint,6,opt,name=tx_index,json=txIndex,proto3" json:"transactionIndex"` + // block_hash of the block in which the transaction was included + BlockHash string `protobuf:"bytes,7,opt,name=block_hash,json=blockHash,proto3" json:"blockHash"` + // index of the log in the block + Index uint64 `protobuf:"varint,8,opt,name=index,proto3" json:"logIndex"` + // removed is true if this log was reverted due to a chain + // reorganisation. You must pay attention to this field if you receive logs + // through a filter query. + Removed bool `protobuf:"varint,9,opt,name=removed,proto3" json:"removed,omitempty"` +} + +func (m *V6Log) Reset() { *m = V6Log{} } +func (m *V6Log) String() string { return proto.CompactTextString(m) } +func (*V6Log) ProtoMessage() {} +func (*V6Log) Descriptor() ([]byte, []int) { + return fileDescriptor_d21ecc92c8c8583e, []int{4} +} +func (m *V6Log) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *V6Log) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Log.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *V6Log) XXX_Merge(src proto.Message) { + xxx_messageInfo_Log.Merge(m, src) +} +func (m *V6Log) XXX_Size() int { + return m.Size() +} +func (m *V6Log) XXX_DiscardUnknown() { + xxx_messageInfo_Log.DiscardUnknown(m) +} + +var xxx_messageInfo_Log proto.InternalMessageInfo + +func (m *V6Log) GetAddress() string { + if m != nil { + return m.Address + } + return "" +} + +func (m *V6Log) GetTopics() []string { + if m != nil { + return m.Topics + } + return nil +} + +func (m *V6Log) GetData() []byte { + if m != nil { + return m.Data + } + return nil +} + +func (m *V6Log) GetBlockNumber() uint64 { + if m != nil { + return m.BlockNumber + } + return 0 +} + +func (m *V6Log) GetTxHash() string { + if m != nil { + return m.TxHash + } + return "" +} + +func (m *V6Log) GetTxIndex() uint64 { + if m != nil { + return m.TxIndex + } + return 0 +} + +func (m *V6Log) GetBlockHash() string { + if m != nil { + return m.BlockHash + } + return "" +} + +func (m *V6Log) GetIndex() uint64 { + if m != nil { + return m.Index + } + return 0 +} + +func (m *V6Log) GetRemoved() bool { + if m != nil { + return m.Removed + } + return false +} + +// V6TxResult stores results of Tx execution. +type V6TxResult struct { + // contract_address contains the ethereum address of the created contract (if + // any). If the state transition is an evm.Call, the contract address will be + // empty. + ContractAddress string `protobuf:"bytes,1,opt,name=contract_address,json=contractAddress,proto3" json:"contract_address,omitempty" yaml:"contract_address"` + // bloom represents the bloom filter bytes + Bloom []byte `protobuf:"bytes,2,opt,name=bloom,proto3" json:"bloom,omitempty"` + // tx_logs contains the transaction hash and the proto-compatible ethereum + // logs. + TxLogs V6TransactionLogs `protobuf:"bytes,3,opt,name=tx_logs,json=txLogs,proto3" json:"tx_logs" yaml:"tx_logs"` + // ret defines the bytes from the execution. + Ret []byte `protobuf:"bytes,4,opt,name=ret,proto3" json:"ret,omitempty"` + // reverted flag is set to true when the call has been reverted + Reverted bool `protobuf:"varint,5,opt,name=reverted,proto3" json:"reverted,omitempty"` + // gas_used notes the amount of gas consumed while execution + GasUsed uint64 `protobuf:"varint,6,opt,name=gas_used,json=gasUsed,proto3" json:"gas_used,omitempty"` +} + +func (m *V6TxResult) Reset() { *m = V6TxResult{} } +func (m *V6TxResult) String() string { return proto.CompactTextString(m) } +func (*V6TxResult) ProtoMessage() {} +func (*V6TxResult) Descriptor() ([]byte, []int) { + return fileDescriptor_d21ecc92c8c8583e, []int{5} +} +func (m *V6TxResult) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *V6TxResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TxResult.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *V6TxResult) XXX_Merge(src proto.Message) { + xxx_messageInfo_TxResult.Merge(m, src) +} +func (m *V6TxResult) XXX_Size() int { + return m.Size() +} +func (m *V6TxResult) XXX_DiscardUnknown() { + xxx_messageInfo_TxResult.DiscardUnknown(m) +} + +var xxx_messageInfo_TxResult proto.InternalMessageInfo + +// V6AccessTuple is the element type of an access list. +type V6AccessTuple struct { + // address is a hex formatted ethereum address + Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` + // storage_keys are hex formatted hashes of the storage keys + StorageKeys []string `protobuf:"bytes,2,rep,name=storage_keys,json=storageKeys,proto3" json:"storageKeys"` +} + +func (m *V6AccessTuple) Reset() { *m = V6AccessTuple{} } +func (m *V6AccessTuple) String() string { return proto.CompactTextString(m) } +func (*V6AccessTuple) ProtoMessage() {} +func (*V6AccessTuple) Descriptor() ([]byte, []int) { + return fileDescriptor_d21ecc92c8c8583e, []int{6} +} +func (m *V6AccessTuple) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *V6AccessTuple) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_AccessTuple.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *V6AccessTuple) XXX_Merge(src proto.Message) { + xxx_messageInfo_AccessTuple.Merge(m, src) +} +func (m *V6AccessTuple) XXX_Size() int { + return m.Size() +} +func (m *V6AccessTuple) XXX_DiscardUnknown() { + xxx_messageInfo_AccessTuple.DiscardUnknown(m) +} + +var xxx_messageInfo_AccessTuple proto.InternalMessageInfo + +// V6TraceConfig holds extra parameters to trace functions. +type V6TraceConfig struct { + // tracer is a custom javascript tracer + Tracer string `protobuf:"bytes,1,opt,name=tracer,proto3" json:"tracer,omitempty"` + // timeout overrides the default timeout of 5 seconds for JavaScript-based tracing + // calls + Timeout string `protobuf:"bytes,2,opt,name=timeout,proto3" json:"timeout,omitempty"` + // reexec defines the number of blocks the tracer is willing to go back + Reexec uint64 `protobuf:"varint,3,opt,name=reexec,proto3" json:"reexec,omitempty"` + // disable_stack switches stack capture + DisableStack bool `protobuf:"varint,5,opt,name=disable_stack,json=disableStack,proto3" json:"disableStack"` + // disable_storage switches storage capture + DisableStorage bool `protobuf:"varint,6,opt,name=disable_storage,json=disableStorage,proto3" json:"disableStorage"` + // debug can be used to print output during capture end + Debug bool `protobuf:"varint,8,opt,name=debug,proto3" json:"debug,omitempty"` + // limit defines the maximum length of output, but zero means unlimited + Limit int32 `protobuf:"varint,9,opt,name=limit,proto3" json:"limit,omitempty"` + // overrides can be used to execute a trace using future fork rules + Overrides *V6ChainConfig `protobuf:"bytes,10,opt,name=overrides,proto3" json:"overrides,omitempty"` + // enable_memory switches memory capture + EnableMemory bool `protobuf:"varint,11,opt,name=enable_memory,json=enableMemory,proto3" json:"enableMemory"` + // enable_return_data switches the capture of return data + EnableReturnData bool `protobuf:"varint,12,opt,name=enable_return_data,json=enableReturnData,proto3" json:"enableReturnData"` + // tracer_json_config configures the tracer using a JSON string + TracerJsonConfig string `protobuf:"bytes,13,opt,name=tracer_json_config,json=tracerJsonConfig,proto3" json:"tracerConfig"` +} + +func (m *V6TraceConfig) Reset() { *m = V6TraceConfig{} } +func (m *V6TraceConfig) String() string { return proto.CompactTextString(m) } +func (*V6TraceConfig) ProtoMessage() {} +func (*V6TraceConfig) Descriptor() ([]byte, []int) { + return fileDescriptor_d21ecc92c8c8583e, []int{7} +} +func (m *V6TraceConfig) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *V6TraceConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TraceConfig.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *V6TraceConfig) XXX_Merge(src proto.Message) { + xxx_messageInfo_TraceConfig.Merge(m, src) +} +func (m *V6TraceConfig) XXX_Size() int { + return m.Size() +} +func (m *V6TraceConfig) XXX_DiscardUnknown() { + xxx_messageInfo_TraceConfig.DiscardUnknown(m) +} + +var xxx_messageInfo_TraceConfig proto.InternalMessageInfo + +func (m *V6TraceConfig) GetTracer() string { + if m != nil { + return m.Tracer + } + return "" +} + +func (m *V6TraceConfig) GetTimeout() string { + if m != nil { + return m.Timeout + } + return "" +} + +func (m *V6TraceConfig) GetReexec() uint64 { + if m != nil { + return m.Reexec + } + return 0 +} + +func (m *V6TraceConfig) GetDisableStack() bool { + if m != nil { + return m.DisableStack + } + return false +} + +func (m *V6TraceConfig) GetDisableStorage() bool { + if m != nil { + return m.DisableStorage + } + return false +} + +func (m *V6TraceConfig) GetDebug() bool { + if m != nil { + return m.Debug + } + return false +} + +func (m *V6TraceConfig) GetLimit() int32 { + if m != nil { + return m.Limit + } + return 0 +} + +func (m *V6TraceConfig) GetOverrides() *V6ChainConfig { + if m != nil { + return m.Overrides + } + return nil +} + +func (m *V6TraceConfig) GetEnableMemory() bool { + if m != nil { + return m.EnableMemory + } + return false +} + +func (m *V6TraceConfig) GetEnableReturnData() bool { + if m != nil { + return m.EnableReturnData + } + return false +} + +func (m *V6TraceConfig) GetTracerJsonConfig() string { + if m != nil { + return m.TracerJsonConfig + } + return "" +} + +func init() { + proto.RegisterType((*V6Params)(nil), "ethermint.evm.v1.V6Params") + proto.RegisterType((*V6ChainConfig)(nil), "ethermint.evm.v1.V6ChainConfig") + proto.RegisterType((*V6State)(nil), "ethermint.evm.v1.V6State") + proto.RegisterType((*V6TransactionLogs)(nil), "ethermint.evm.v1.V6TransactionLogs") + proto.RegisterType((*V6Log)(nil), "ethermint.evm.v1.V6Log") + proto.RegisterType((*V6TxResult)(nil), "ethermint.evm.v1.V6TxResult") + proto.RegisterType((*V6AccessTuple)(nil), "ethermint.evm.v1.V6AccessTuple") + proto.RegisterType((*V6TraceConfig)(nil), "ethermint.evm.v1.V6TraceConfig") +} + +func init() { proto.RegisterFile("ethermint/evm/v1/evm.proto", fileDescriptor_d21ecc92c8c8583e) } + +var fileDescriptor_d21ecc92c8c8583e = []byte{ + // 1661 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x57, 0xcd, 0x4f, 0x23, 0xc9, + 0x15, 0x07, 0x6c, 0xa0, 0x5d, 0x36, 0x76, 0x53, 0x18, 0xd6, 0x3b, 0xa3, 0xd0, 0xa4, 0x0f, 0x11, + 0x91, 0x76, 0x61, 0x60, 0x42, 0x16, 0xed, 0x2a, 0x1f, 0xd3, 0x33, 0x6c, 0x02, 0x99, 0xdd, 0xa0, + 0x1a, 0x36, 0x51, 0xa2, 0x44, 0xad, 0x72, 0x77, 0x6d, 0xbb, 0x97, 0xee, 0x2e, 0xab, 0xaa, 0xda, + 0x63, 0xe7, 0x2f, 0x88, 0x94, 0x4b, 0xfe, 0x84, 0xfd, 0x73, 0x56, 0x39, 0xcd, 0x31, 0xca, 0xa1, + 0x15, 0x31, 0x37, 0x94, 0x13, 0xf7, 0x48, 0x51, 0x7d, 0xb8, 0xfd, 0x01, 0x61, 0x7d, 0x81, 0xfa, + 0xbd, 0x8f, 0xdf, 0xab, 0xf7, 0xea, 0xb5, 0x5f, 0x15, 0x78, 0x42, 0x44, 0x8f, 0xb0, 0x34, 0xce, + 0xc4, 0x21, 0x19, 0xa4, 0x87, 0x83, 0x23, 0xf9, 0xef, 0xa0, 0xcf, 0xa8, 0xa0, 0xd0, 0x2e, 0x75, + 0x07, 0x52, 0x38, 0x38, 0x7a, 0xd2, 0x8e, 0x68, 0x44, 0x95, 0xf2, 0x50, 0xae, 0xb4, 0x9d, 0xfb, + 0x9f, 0x0a, 0x58, 0xbb, 0xc4, 0x0c, 0xa7, 0x1c, 0x1e, 0x81, 0x1a, 0x19, 0xa4, 0x7e, 0x48, 0x32, + 0x9a, 0x76, 0x96, 0xf7, 0x96, 0xf7, 0x6b, 0x5e, 0xfb, 0xae, 0x70, 0xec, 0x11, 0x4e, 0x93, 0x4f, + 0xdd, 0x52, 0xe5, 0x22, 0x8b, 0x0c, 0xd2, 0x57, 0x72, 0x09, 0x7f, 0x06, 0x36, 0x48, 0x86, 0xbb, + 0x09, 0xf1, 0x03, 0x46, 0xb0, 0x20, 0x9d, 0x95, 0xbd, 0xe5, 0x7d, 0xcb, 0xeb, 0xdc, 0x15, 0x4e, + 0xdb, 0xb8, 0x4d, 0xab, 0x5d, 0xd4, 0xd0, 0xf8, 0xa5, 0x82, 0xf0, 0x13, 0x50, 0x1f, 0xeb, 0x71, + 0x92, 0x74, 0x2a, 0xca, 0x79, 0xe7, 0xae, 0x70, 0xe0, 0xac, 0x33, 0x4e, 0x12, 0x17, 0x01, 0xe3, + 0x8a, 0x93, 0x04, 0xbe, 0x00, 0x80, 0x0c, 0x05, 0xc3, 0x3e, 0x89, 0xfb, 0xbc, 0x53, 0xdd, 0xab, + 0xec, 0x57, 0x3c, 0xf7, 0xa6, 0x70, 0x6a, 0x67, 0x52, 0x7a, 0x76, 0x7e, 0xc9, 0xef, 0x0a, 0x67, + 0xd3, 0x90, 0x94, 0x86, 0x2e, 0xaa, 0x29, 0x70, 0x16, 0xf7, 0x39, 0xfc, 0x33, 0x68, 0x04, 0x3d, + 0x1c, 0x67, 0x7e, 0x40, 0xb3, 0xaf, 0xe3, 0xa8, 0xb3, 0xba, 0xb7, 0xbc, 0x5f, 0x3f, 0xfe, 0xc1, + 0xc1, 0x7c, 0xdd, 0x0e, 0x5e, 0x4a, 0xab, 0x97, 0xca, 0xc8, 0x7b, 0xfa, 0x5d, 0xe1, 0x2c, 0xdd, + 0x15, 0xce, 0x96, 0xa6, 0x9e, 0x26, 0x70, 0x51, 0x3d, 0x98, 0x58, 0xc2, 0x63, 0xb0, 0x8d, 0x93, + 0x84, 0xbe, 0xf5, 0xf3, 0x4c, 0x16, 0x9a, 0x04, 0x82, 0x84, 0xbe, 0x18, 0xf2, 0xce, 0x9a, 0x4c, + 0x12, 0x6d, 0x29, 0xe5, 0x57, 0x13, 0xdd, 0xd5, 0x90, 0xc3, 0x8f, 0x01, 0xc4, 0x81, 0x88, 0x07, + 0xc4, 0xef, 0x33, 0x12, 0xd0, 0xb4, 0x1f, 0x27, 0x84, 0x77, 0xd6, 0xf7, 0x2a, 0xfb, 0x35, 0xb4, + 0xa9, 0x35, 0x97, 0x13, 0x05, 0x3c, 0x06, 0x0d, 0x79, 0x28, 0x41, 0x0f, 0x67, 0x19, 0x49, 0x78, + 0xc7, 0x92, 0x86, 0x5e, 0xeb, 0xa6, 0x70, 0xea, 0x67, 0xbf, 0xfb, 0xe2, 0xa5, 0x11, 0xa3, 0x3a, + 0x19, 0xa4, 0x63, 0xe0, 0xfe, 0xb7, 0x09, 0xea, 0x53, 0x09, 0xc1, 0x3f, 0x81, 0x56, 0x8f, 0xa6, + 0x84, 0x0b, 0x82, 0x43, 0xbf, 0x9b, 0xd0, 0xe0, 0xda, 0x9c, 0xfc, 0xf3, 0x7f, 0x15, 0xce, 0x76, + 0x40, 0x79, 0x4a, 0x39, 0x0f, 0xaf, 0x0f, 0x62, 0x7a, 0x98, 0x62, 0xd1, 0x3b, 0x38, 0xcf, 0xc4, + 0x5d, 0xe1, 0xec, 0xe8, 0xf4, 0xe7, 0x3c, 0x5d, 0xd4, 0x2c, 0x25, 0x9e, 0x14, 0xc0, 0x1e, 0x68, + 0x86, 0x98, 0xfa, 0x5f, 0x53, 0x76, 0x6d, 0xc8, 0x57, 0x14, 0xb9, 0xf7, 0x7f, 0xc9, 0x6f, 0x0a, + 0xa7, 0xf1, 0xea, 0xc5, 0x6f, 0x3f, 0xa7, 0xec, 0x5a, 0x51, 0xdc, 0x15, 0xce, 0xb6, 0x0e, 0x36, + 0x4b, 0xe4, 0xa2, 0x46, 0x88, 0x69, 0x69, 0x06, 0x7f, 0x0f, 0xec, 0xd2, 0x80, 0xe7, 0xfd, 0x3e, + 0x65, 0xc2, 0xb4, 0xd3, 0xc7, 0x37, 0x85, 0xd3, 0x34, 0x94, 0x6f, 0xb4, 0xe6, 0xae, 0x70, 0x3e, + 0x98, 0x23, 0x35, 0x3e, 0x2e, 0x6a, 0x1a, 0x5a, 0x63, 0x0a, 0xbb, 0xa0, 0x41, 0xe2, 0xfe, 0xd1, + 0xc9, 0x33, 0x93, 0x40, 0x55, 0x25, 0xf0, 0x8b, 0xc7, 0x12, 0xa8, 0x9f, 0x9d, 0x5f, 0x1e, 0x9d, + 0x3c, 0x1b, 0xef, 0xdf, 0xf4, 0xca, 0x34, 0x8b, 0x8b, 0xea, 0x1a, 0xea, 0xcd, 0x9f, 0x03, 0x03, + 0xfd, 0x1e, 0xe6, 0x3d, 0xd5, 0x89, 0x35, 0x6f, 0xff, 0xa6, 0x70, 0x80, 0x66, 0xfa, 0x35, 0xe6, + 0xbd, 0x49, 0xd5, 0xbb, 0xa3, 0xbf, 0xe0, 0x4c, 0xc4, 0x79, 0x3a, 0xe6, 0x02, 0xda, 0x59, 0x5a, + 0x95, 0xdb, 0x3d, 0x31, 0xdb, 0x5d, 0x5b, 0x74, 0xbb, 0x27, 0x0f, 0x6d, 0xf7, 0x64, 0x76, 0xbb, + 0xda, 0xa6, 0x8c, 0x71, 0x6a, 0x62, 0xac, 0x2f, 0x1a, 0xe3, 0xf4, 0xa1, 0x18, 0xa7, 0xb3, 0x31, + 0xb4, 0x8d, 0xec, 0xcb, 0xb9, 0x3c, 0x3b, 0xd6, 0xc2, 0x7d, 0x79, 0xaf, 0x42, 0xcd, 0x52, 0xa2, + 0xd9, 0xaf, 0x41, 0x3b, 0xa0, 0x19, 0x17, 0x52, 0x96, 0xd1, 0x7e, 0x42, 0x4c, 0x88, 0x9a, 0x0a, + 0x71, 0xfa, 0x58, 0x88, 0xa7, 0xe6, 0xcb, 0x7f, 0xc0, 0xdd, 0x45, 0x5b, 0xb3, 0x62, 0x1d, 0xcc, + 0x07, 0x76, 0x9f, 0x08, 0xc2, 0x78, 0x37, 0x67, 0x91, 0x09, 0x04, 0x54, 0xa0, 0x9f, 0x3c, 0x16, + 0xc8, 0x74, 0xe8, 0xbc, 0xab, 0x8b, 0x5a, 0x13, 0x91, 0x0e, 0xf0, 0x07, 0xd0, 0x8c, 0x65, 0xd4, + 0x6e, 0x9e, 0x18, 0xfa, 0xba, 0xa2, 0x3f, 0x7e, 0x8c, 0xde, 0x7c, 0x55, 0xb3, 0x8e, 0x2e, 0xda, + 0x18, 0x0b, 0x34, 0x75, 0x08, 0x60, 0x9a, 0xc7, 0xcc, 0x8f, 0x12, 0x1c, 0xc4, 0x84, 0x19, 0xfa, + 0x86, 0xa2, 0xff, 0xe9, 0x63, 0xf4, 0x1f, 0x6a, 0xfa, 0xfb, 0xce, 0x2e, 0xb2, 0xa5, 0xf0, 0x57, + 0x5a, 0xa6, 0xa3, 0xbc, 0x01, 0x8d, 0x2e, 0x61, 0x49, 0x9c, 0x19, 0xfe, 0x0d, 0xc5, 0xff, 0xec, + 0x31, 0x7e, 0xd3, 0x41, 0xd3, 0x6e, 0x2e, 0xaa, 0x6b, 0x58, 0x92, 0x26, 0x34, 0x0b, 0xe9, 0x98, + 0x74, 0x73, 0x61, 0xd2, 0x69, 0x37, 0x17, 0xd5, 0x35, 0xd4, 0xa4, 0x11, 0xd8, 0xc2, 0x8c, 0xd1, + 0xb7, 0x73, 0x05, 0x81, 0x8a, 0xfb, 0x93, 0xc7, 0xb8, 0x9f, 0x68, 0xee, 0x07, 0xbc, 0x5d, 0xb4, + 0xa9, 0xa4, 0x33, 0x25, 0x09, 0x01, 0x8c, 0x18, 0x1e, 0xcd, 0xc5, 0x69, 0x2f, 0x5c, 0xf8, 0xfb, + 0xce, 0x2e, 0xb2, 0xa5, 0x70, 0x26, 0xca, 0x37, 0xa0, 0x9d, 0x12, 0x16, 0x11, 0x3f, 0x23, 0x82, + 0xf7, 0x93, 0x58, 0x98, 0x38, 0xdb, 0x0b, 0x7f, 0x07, 0x0f, 0xb9, 0xbb, 0x08, 0x2a, 0xf1, 0x97, + 0x46, 0x5a, 0x76, 0x29, 0xef, 0xe1, 0x2c, 0xea, 0xe1, 0xd8, 0x44, 0xd9, 0x59, 0xb8, 0x4b, 0x67, + 0x1d, 0x5d, 0xb4, 0x31, 0x16, 0x94, 0x47, 0x1d, 0xe0, 0x2c, 0xc8, 0xc7, 0x47, 0xfd, 0xc1, 0xc2, + 0x47, 0x3d, 0xed, 0x26, 0x07, 0xb8, 0x82, 0x8a, 0xf4, 0xa2, 0x6a, 0x35, 0xed, 0xd6, 0x45, 0xd5, + 0x6a, 0xd9, 0xf6, 0x45, 0xd5, 0xb2, 0xed, 0xcd, 0x8b, 0xaa, 0xb5, 0x65, 0xb7, 0xd1, 0xc6, 0x88, + 0x26, 0xd4, 0x1f, 0x3c, 0xd7, 0x4e, 0xa8, 0x4e, 0xde, 0x62, 0x6e, 0x7e, 0x68, 0x50, 0x33, 0xc0, + 0x02, 0x27, 0x23, 0x6e, 0x0a, 0x81, 0x6c, 0x5d, 0x9e, 0xa9, 0xb1, 0x75, 0x08, 0x56, 0xdf, 0x08, + 0x79, 0xf5, 0xb1, 0x41, 0xe5, 0x9a, 0x8c, 0xf4, 0xb0, 0x45, 0x72, 0x09, 0xdb, 0x60, 0x75, 0x80, + 0x93, 0x5c, 0xdf, 0xa1, 0x6a, 0x48, 0x03, 0xf7, 0x12, 0xb4, 0xae, 0x18, 0xce, 0xb8, 0x1c, 0xff, + 0x34, 0x7b, 0x4d, 0x23, 0x0e, 0x21, 0xa8, 0xaa, 0x39, 0xa1, 0x7d, 0xd5, 0x1a, 0xfe, 0x18, 0x54, + 0x13, 0x1a, 0xf1, 0xce, 0xca, 0x5e, 0x65, 0xbf, 0x7e, 0xbc, 0x7d, 0xff, 0x16, 0xf3, 0x9a, 0x46, + 0x48, 0x99, 0xb8, 0xff, 0x58, 0x01, 0x95, 0xd7, 0x34, 0x82, 0x1d, 0xb0, 0x8e, 0xc3, 0x90, 0x11, + 0xce, 0x0d, 0xd3, 0x18, 0xc2, 0x1d, 0xb0, 0x26, 0x68, 0x3f, 0x0e, 0x34, 0x5d, 0x0d, 0x19, 0x24, + 0x03, 0x87, 0x58, 0x60, 0x35, 0x58, 0x1b, 0x48, 0xad, 0xe5, 0x25, 0x44, 0x65, 0xe6, 0x67, 0x79, + 0xda, 0x25, 0x4c, 0xcd, 0xc7, 0xaa, 0xd7, 0xba, 0x2d, 0x9c, 0xba, 0x92, 0x7f, 0xa9, 0xc4, 0x68, + 0x1a, 0xc0, 0x8f, 0xc0, 0xba, 0x18, 0x4e, 0xcf, 0xba, 0xad, 0xdb, 0xc2, 0x69, 0x89, 0x49, 0x9a, + 0x72, 0x94, 0xa1, 0x35, 0x31, 0x54, 0x23, 0xed, 0x10, 0x58, 0x62, 0xe8, 0xc7, 0x59, 0x48, 0x86, + 0x6a, 0x9c, 0x55, 0xbd, 0xf6, 0x6d, 0xe1, 0xd8, 0x53, 0xe6, 0xe7, 0x52, 0x87, 0xd6, 0xc5, 0x50, + 0x2d, 0xe0, 0x47, 0x00, 0xe8, 0x2d, 0xa9, 0x08, 0x7a, 0x3a, 0x6d, 0xdc, 0x16, 0x4e, 0x4d, 0x49, + 0x15, 0xf7, 0x64, 0x09, 0x5d, 0xb0, 0xaa, 0xb9, 0x2d, 0xc5, 0xdd, 0xb8, 0x2d, 0x1c, 0x2b, 0xa1, + 0x91, 0xe6, 0xd4, 0x2a, 0x59, 0x2a, 0x46, 0x52, 0x3a, 0x20, 0xa1, 0x1a, 0x11, 0x16, 0x1a, 0x43, + 0xf7, 0x6f, 0x2b, 0xc0, 0xba, 0x1a, 0x22, 0xc2, 0xf3, 0x44, 0xc0, 0xcf, 0x81, 0x1d, 0xd0, 0x4c, + 0x30, 0x1c, 0x08, 0x7f, 0xa6, 0xb4, 0xde, 0xd3, 0xc9, 0x0f, 0xfa, 0xbc, 0x85, 0x8b, 0x5a, 0x63, + 0xd1, 0x0b, 0x53, 0xff, 0x36, 0x58, 0xed, 0x26, 0x94, 0xa6, 0xaa, 0x13, 0x1a, 0x48, 0x03, 0x88, + 0x54, 0xd5, 0xd4, 0x29, 0x57, 0xd4, 0x5d, 0xf5, 0x87, 0xf7, 0x4f, 0x79, 0xae, 0x55, 0xbc, 0x1d, + 0x73, 0x5f, 0x6d, 0xea, 0xd8, 0xc6, 0xdf, 0x95, 0xb5, 0x55, 0xad, 0x64, 0x83, 0x0a, 0x23, 0x42, + 0x1d, 0x5a, 0x03, 0xc9, 0x25, 0x7c, 0x02, 0x2c, 0x46, 0x06, 0x84, 0x09, 0x12, 0xaa, 0xc3, 0xb1, + 0x50, 0x89, 0xe1, 0x87, 0xc0, 0x8a, 0x30, 0xf7, 0x73, 0x4e, 0x42, 0x7d, 0x12, 0x68, 0x3d, 0xc2, + 0xfc, 0x2b, 0x4e, 0xc2, 0x4f, 0xab, 0x7f, 0xfd, 0xd6, 0x59, 0x72, 0x31, 0xa8, 0xbf, 0x08, 0x02, + 0xc2, 0xf9, 0x55, 0xde, 0x4f, 0xc8, 0x23, 0x1d, 0x76, 0x0c, 0x1a, 0x5c, 0x50, 0x86, 0x23, 0xe2, + 0x5f, 0x93, 0x91, 0xe9, 0x33, 0xdd, 0x35, 0x46, 0xfe, 0x1b, 0x32, 0xe2, 0x68, 0x1a, 0x98, 0x10, + 0xdf, 0x56, 0x41, 0xfd, 0x8a, 0xe1, 0x80, 0x98, 0x0b, 0xac, 0xec, 0x55, 0x09, 0x99, 0x09, 0x61, + 0x90, 0x8c, 0x2d, 0xe2, 0x94, 0xd0, 0x5c, 0x98, 0xef, 0x69, 0x0c, 0xa5, 0x07, 0x23, 0x64, 0x48, + 0x02, 0x55, 0xc6, 0x2a, 0x32, 0x08, 0x9e, 0x80, 0x8d, 0x30, 0xe6, 0xea, 0xc1, 0xc1, 0x05, 0x0e, + 0xae, 0x75, 0xfa, 0x9e, 0x7d, 0x5b, 0x38, 0x0d, 0xa3, 0x78, 0x23, 0xe5, 0x68, 0x06, 0xc1, 0xcf, + 0x40, 0x6b, 0xe2, 0xa6, 0x76, 0xab, 0xaf, 0xf8, 0x1e, 0xbc, 0x2d, 0x9c, 0x66, 0x69, 0xaa, 0x34, + 0x68, 0x0e, 0xcb, 0x93, 0x0e, 0x49, 0x37, 0x8f, 0x54, 0xf3, 0x59, 0x48, 0x03, 0x29, 0x4d, 0xe2, + 0x34, 0x16, 0xaa, 0xd9, 0x56, 0x91, 0x06, 0xf0, 0x33, 0x50, 0xa3, 0x03, 0xc2, 0x58, 0x1c, 0x12, + 0xae, 0x2e, 0x10, 0xdf, 0xf7, 0x5a, 0x41, 0x13, 0x7b, 0x99, 0x9c, 0x79, 0x4c, 0xa5, 0x24, 0xa5, + 0x6c, 0xa4, 0xae, 0x08, 0x26, 0x39, 0xad, 0xf8, 0x42, 0xc9, 0xd1, 0x0c, 0x82, 0x1e, 0x80, 0xc6, + 0x8d, 0x11, 0x91, 0xb3, 0xcc, 0x57, 0xdf, 0x7f, 0x43, 0xf9, 0xaa, 0xaf, 0x50, 0x6b, 0x91, 0x52, + 0xbe, 0xc2, 0x02, 0xa3, 0x7b, 0x12, 0xf8, 0x73, 0x00, 0xf5, 0x99, 0xf8, 0xdf, 0x70, 0x5a, 0x3e, + 0xb7, 0xf4, 0x8c, 0x57, 0xf1, 0xb5, 0xd6, 0xec, 0xd9, 0xd6, 0xe8, 0x82, 0x53, 0x93, 0xc5, 0x45, + 0xd5, 0xaa, 0xda, 0xab, 0x17, 0x55, 0x6b, 0xdd, 0xb6, 0xca, 0xfa, 0x99, 0x2c, 0xd0, 0xd6, 0x18, + 0x4f, 0x6d, 0xcf, 0xfb, 0xe5, 0x77, 0x37, 0xbb, 0xcb, 0xef, 0x6e, 0x76, 0x97, 0xff, 0x7d, 0xb3, + 0xbb, 0xfc, 0xf7, 0xf7, 0xbb, 0x4b, 0xef, 0xde, 0xef, 0x2e, 0xfd, 0xf3, 0xfd, 0xee, 0xd2, 0x1f, + 0x7f, 0x14, 0xc5, 0xa2, 0x97, 0x77, 0x0f, 0x02, 0x9a, 0xca, 0xa7, 0x32, 0xe5, 0xe6, 0xef, 0xe0, + 0xe8, 0xf4, 0x70, 0xa8, 0xde, 0xd0, 0x62, 0xd4, 0x27, 0xbc, 0xbb, 0xa6, 0xde, 0xc6, 0xcf, 0xff, + 0x17, 0x00, 0x00, 0xff, 0xff, 0xc3, 0x00, 0x49, 0xb2, 0x61, 0x0f, 0x00, 0x00, +} + +func (m *V6Params) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *V6Params) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *V6Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.EVMChannels) > 0 { + for iNdEx := len(m.EVMChannels) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.EVMChannels[iNdEx]) + copy(dAtA[i:], m.EVMChannels[iNdEx]) + i = encodeVarintEvm(dAtA, i, uint64(len(m.EVMChannels[iNdEx]))) + i-- + dAtA[i] = 0x42 + } + } + if len(m.ActivePrecompiles) > 0 { + for iNdEx := len(m.ActivePrecompiles) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.ActivePrecompiles[iNdEx]) + copy(dAtA[i:], m.ActivePrecompiles[iNdEx]) + i = encodeVarintEvm(dAtA, i, uint64(len(m.ActivePrecompiles[iNdEx]))) + i-- + dAtA[i] = 0x3a + } + } + if m.AllowUnprotectedTxs { + i-- + if m.AllowUnprotectedTxs { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x30 + } + { + size, err := m.ChainConfig.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvm(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + if len(m.ExtraEIPs) > 0 { + dAtA3 := make([]byte, len(m.ExtraEIPs)*10) + var j2 int + for _, num1 := range m.ExtraEIPs { + num := uint64(num1) + for num >= 1<<7 { + dAtA3[j2] = uint8(uint64(num)&0x7f | 0x80) + num >>= 7 + j2++ + } + dAtA3[j2] = uint8(num) + j2++ + } + i -= j2 + copy(dAtA[i:], dAtA3[:j2]) + i = encodeVarintEvm(dAtA, i, uint64(j2)) + i-- + dAtA[i] = 0x22 + } + if m.EnableCall { + i-- + if m.EnableCall { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 + } + if m.EnableCreate { + i-- + if m.EnableCreate { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + if len(m.EvmDenom) > 0 { + i -= len(m.EvmDenom) + copy(dAtA[i:], m.EvmDenom) + i = encodeVarintEvm(dAtA, i, uint64(len(m.EvmDenom))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *V6ChainConfig) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *V6ChainConfig) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *V6ChainConfig) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.CancunBlock != nil { + { + size := m.CancunBlock.Size() + i -= size + if _, err := m.CancunBlock.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintEvm(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xba + } + if m.ShanghaiBlock != nil { + { + size := m.ShanghaiBlock.Size() + i -= size + if _, err := m.ShanghaiBlock.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintEvm(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xb2 + } + if m.MergeNetsplitBlock != nil { + { + size := m.MergeNetsplitBlock.Size() + i -= size + if _, err := m.MergeNetsplitBlock.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintEvm(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xaa + } + if m.GrayGlacierBlock != nil { + { + size := m.GrayGlacierBlock.Size() + i -= size + if _, err := m.GrayGlacierBlock.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintEvm(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xa2 + } + if m.ArrowGlacierBlock != nil { + { + size := m.ArrowGlacierBlock.Size() + i -= size + if _, err := m.ArrowGlacierBlock.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintEvm(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x92 + } + if m.LondonBlock != nil { + { + size := m.LondonBlock.Size() + i -= size + if _, err := m.LondonBlock.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintEvm(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x8a + } + if m.BerlinBlock != nil { + { + size := m.BerlinBlock.Size() + i -= size + if _, err := m.BerlinBlock.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintEvm(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x6a + } + if m.MuirGlacierBlock != nil { + { + size := m.MuirGlacierBlock.Size() + i -= size + if _, err := m.MuirGlacierBlock.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintEvm(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x62 + } + if m.IstanbulBlock != nil { + { + size := m.IstanbulBlock.Size() + i -= size + if _, err := m.IstanbulBlock.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintEvm(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x5a + } + if m.PetersburgBlock != nil { + { + size := m.PetersburgBlock.Size() + i -= size + if _, err := m.PetersburgBlock.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintEvm(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x52 + } + if m.ConstantinopleBlock != nil { + { + size := m.ConstantinopleBlock.Size() + i -= size + if _, err := m.ConstantinopleBlock.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintEvm(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x4a + } + if m.ByzantiumBlock != nil { + { + size := m.ByzantiumBlock.Size() + i -= size + if _, err := m.ByzantiumBlock.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintEvm(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x42 + } + if m.EIP158Block != nil { + { + size := m.EIP158Block.Size() + i -= size + if _, err := m.EIP158Block.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintEvm(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a + } + if m.EIP155Block != nil { + { + size := m.EIP155Block.Size() + i -= size + if _, err := m.EIP155Block.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintEvm(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + if len(m.EIP150Hash) > 0 { + i -= len(m.EIP150Hash) + copy(dAtA[i:], m.EIP150Hash) + i = encodeVarintEvm(dAtA, i, uint64(len(m.EIP150Hash))) + i-- + dAtA[i] = 0x2a + } + if m.EIP150Block != nil { + { + size := m.EIP150Block.Size() + i -= size + if _, err := m.EIP150Block.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintEvm(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + if m.DAOForkSupport { + i-- + if m.DAOForkSupport { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 + } + if m.DAOForkBlock != nil { + { + size := m.DAOForkBlock.Size() + i -= size + if _, err := m.DAOForkBlock.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintEvm(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if m.HomesteadBlock != nil { + { + size := m.HomesteadBlock.Size() + i -= size + if _, err := m.HomesteadBlock.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintEvm(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *V6State) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *V6State) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *V6State) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Value) > 0 { + i -= len(m.Value) + copy(dAtA[i:], m.Value) + i = encodeVarintEvm(dAtA, i, uint64(len(m.Value))) + i-- + dAtA[i] = 0x12 + } + if len(m.Key) > 0 { + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintEvm(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *V6TransactionLogs) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *V6TransactionLogs) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *V6TransactionLogs) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Logs) > 0 { + for iNdEx := len(m.Logs) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Logs[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvm(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Hash) > 0 { + i -= len(m.Hash) + copy(dAtA[i:], m.Hash) + i = encodeVarintEvm(dAtA, i, uint64(len(m.Hash))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *V6Log) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *V6Log) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *V6Log) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Removed { + i-- + if m.Removed { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x48 + } + if m.Index != 0 { + i = encodeVarintEvm(dAtA, i, uint64(m.Index)) + i-- + dAtA[i] = 0x40 + } + if len(m.BlockHash) > 0 { + i -= len(m.BlockHash) + copy(dAtA[i:], m.BlockHash) + i = encodeVarintEvm(dAtA, i, uint64(len(m.BlockHash))) + i-- + dAtA[i] = 0x3a + } + if m.TxIndex != 0 { + i = encodeVarintEvm(dAtA, i, uint64(m.TxIndex)) + i-- + dAtA[i] = 0x30 + } + if len(m.TxHash) > 0 { + i -= len(m.TxHash) + copy(dAtA[i:], m.TxHash) + i = encodeVarintEvm(dAtA, i, uint64(len(m.TxHash))) + i-- + dAtA[i] = 0x2a + } + if m.BlockNumber != 0 { + i = encodeVarintEvm(dAtA, i, uint64(m.BlockNumber)) + i-- + dAtA[i] = 0x20 + } + if len(m.Data) > 0 { + i -= len(m.Data) + copy(dAtA[i:], m.Data) + i = encodeVarintEvm(dAtA, i, uint64(len(m.Data))) + i-- + dAtA[i] = 0x1a + } + if len(m.Topics) > 0 { + for iNdEx := len(m.Topics) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Topics[iNdEx]) + copy(dAtA[i:], m.Topics[iNdEx]) + i = encodeVarintEvm(dAtA, i, uint64(len(m.Topics[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Address) > 0 { + i -= len(m.Address) + copy(dAtA[i:], m.Address) + i = encodeVarintEvm(dAtA, i, uint64(len(m.Address))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *V6TxResult) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *V6TxResult) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *V6TxResult) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.GasUsed != 0 { + i = encodeVarintEvm(dAtA, i, uint64(m.GasUsed)) + i-- + dAtA[i] = 0x30 + } + if m.Reverted { + i-- + if m.Reverted { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x28 + } + if len(m.Ret) > 0 { + i -= len(m.Ret) + copy(dAtA[i:], m.Ret) + i = encodeVarintEvm(dAtA, i, uint64(len(m.Ret))) + i-- + dAtA[i] = 0x22 + } + { + size, err := m.TxLogs.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvm(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + if len(m.Bloom) > 0 { + i -= len(m.Bloom) + copy(dAtA[i:], m.Bloom) + i = encodeVarintEvm(dAtA, i, uint64(len(m.Bloom))) + i-- + dAtA[i] = 0x12 + } + if len(m.ContractAddress) > 0 { + i -= len(m.ContractAddress) + copy(dAtA[i:], m.ContractAddress) + i = encodeVarintEvm(dAtA, i, uint64(len(m.ContractAddress))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *V6AccessTuple) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *V6AccessTuple) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *V6AccessTuple) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.StorageKeys) > 0 { + for iNdEx := len(m.StorageKeys) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.StorageKeys[iNdEx]) + copy(dAtA[i:], m.StorageKeys[iNdEx]) + i = encodeVarintEvm(dAtA, i, uint64(len(m.StorageKeys[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Address) > 0 { + i -= len(m.Address) + copy(dAtA[i:], m.Address) + i = encodeVarintEvm(dAtA, i, uint64(len(m.Address))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *V6TraceConfig) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *V6TraceConfig) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *V6TraceConfig) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.TracerJsonConfig) > 0 { + i -= len(m.TracerJsonConfig) + copy(dAtA[i:], m.TracerJsonConfig) + i = encodeVarintEvm(dAtA, i, uint64(len(m.TracerJsonConfig))) + i-- + dAtA[i] = 0x6a + } + if m.EnableReturnData { + i-- + if m.EnableReturnData { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x60 + } + if m.EnableMemory { + i-- + if m.EnableMemory { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x58 + } + if m.Overrides != nil { + { + size, err := m.Overrides.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvm(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x52 + } + if m.Limit != 0 { + i = encodeVarintEvm(dAtA, i, uint64(m.Limit)) + i-- + dAtA[i] = 0x48 + } + if m.Debug { + i-- + if m.Debug { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x40 + } + if m.DisableStorage { + i-- + if m.DisableStorage { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x30 + } + if m.DisableStack { + i-- + if m.DisableStack { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x28 + } + if m.Reexec != 0 { + i = encodeVarintEvm(dAtA, i, uint64(m.Reexec)) + i-- + dAtA[i] = 0x18 + } + if len(m.Timeout) > 0 { + i -= len(m.Timeout) + copy(dAtA[i:], m.Timeout) + i = encodeVarintEvm(dAtA, i, uint64(len(m.Timeout))) + i-- + dAtA[i] = 0x12 + } + if len(m.Tracer) > 0 { + i -= len(m.Tracer) + copy(dAtA[i:], m.Tracer) + i = encodeVarintEvm(dAtA, i, uint64(len(m.Tracer))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintEvm(dAtA []byte, offset int, v uint64) int { + offset -= sovEvm(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *V6Params) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.EvmDenom) + if l > 0 { + n += 1 + l + sovEvm(uint64(l)) + } + if m.EnableCreate { + n += 2 + } + if m.EnableCall { + n += 2 + } + if len(m.ExtraEIPs) > 0 { + l = 0 + for _, e := range m.ExtraEIPs { + l += sovEvm(uint64(e)) + } + n += 1 + sovEvm(uint64(l)) + l + } + l = m.ChainConfig.Size() + n += 1 + l + sovEvm(uint64(l)) + if m.AllowUnprotectedTxs { + n += 2 + } + if len(m.ActivePrecompiles) > 0 { + for _, s := range m.ActivePrecompiles { + l = len(s) + n += 1 + l + sovEvm(uint64(l)) + } + } + if len(m.EVMChannels) > 0 { + for _, s := range m.EVMChannels { + l = len(s) + n += 1 + l + sovEvm(uint64(l)) + } + } + return n +} + +func (m *V6ChainConfig) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.HomesteadBlock != nil { + l = m.HomesteadBlock.Size() + n += 1 + l + sovEvm(uint64(l)) + } + if m.DAOForkBlock != nil { + l = m.DAOForkBlock.Size() + n += 1 + l + sovEvm(uint64(l)) + } + if m.DAOForkSupport { + n += 2 + } + if m.EIP150Block != nil { + l = m.EIP150Block.Size() + n += 1 + l + sovEvm(uint64(l)) + } + l = len(m.EIP150Hash) + if l > 0 { + n += 1 + l + sovEvm(uint64(l)) + } + if m.EIP155Block != nil { + l = m.EIP155Block.Size() + n += 1 + l + sovEvm(uint64(l)) + } + if m.EIP158Block != nil { + l = m.EIP158Block.Size() + n += 1 + l + sovEvm(uint64(l)) + } + if m.ByzantiumBlock != nil { + l = m.ByzantiumBlock.Size() + n += 1 + l + sovEvm(uint64(l)) + } + if m.ConstantinopleBlock != nil { + l = m.ConstantinopleBlock.Size() + n += 1 + l + sovEvm(uint64(l)) + } + if m.PetersburgBlock != nil { + l = m.PetersburgBlock.Size() + n += 1 + l + sovEvm(uint64(l)) + } + if m.IstanbulBlock != nil { + l = m.IstanbulBlock.Size() + n += 1 + l + sovEvm(uint64(l)) + } + if m.MuirGlacierBlock != nil { + l = m.MuirGlacierBlock.Size() + n += 1 + l + sovEvm(uint64(l)) + } + if m.BerlinBlock != nil { + l = m.BerlinBlock.Size() + n += 1 + l + sovEvm(uint64(l)) + } + if m.LondonBlock != nil { + l = m.LondonBlock.Size() + n += 2 + l + sovEvm(uint64(l)) + } + if m.ArrowGlacierBlock != nil { + l = m.ArrowGlacierBlock.Size() + n += 2 + l + sovEvm(uint64(l)) + } + if m.GrayGlacierBlock != nil { + l = m.GrayGlacierBlock.Size() + n += 2 + l + sovEvm(uint64(l)) + } + if m.MergeNetsplitBlock != nil { + l = m.MergeNetsplitBlock.Size() + n += 2 + l + sovEvm(uint64(l)) + } + if m.ShanghaiBlock != nil { + l = m.ShanghaiBlock.Size() + n += 2 + l + sovEvm(uint64(l)) + } + if m.CancunBlock != nil { + l = m.CancunBlock.Size() + n += 2 + l + sovEvm(uint64(l)) + } + return n +} + +func (m *V6State) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Key) + if l > 0 { + n += 1 + l + sovEvm(uint64(l)) + } + l = len(m.Value) + if l > 0 { + n += 1 + l + sovEvm(uint64(l)) + } + return n +} + +func (m *V6TransactionLogs) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Hash) + if l > 0 { + n += 1 + l + sovEvm(uint64(l)) + } + if len(m.Logs) > 0 { + for _, e := range m.Logs { + l = e.Size() + n += 1 + l + sovEvm(uint64(l)) + } + } + return n +} + +func (m *V6Log) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Address) + if l > 0 { + n += 1 + l + sovEvm(uint64(l)) + } + if len(m.Topics) > 0 { + for _, s := range m.Topics { + l = len(s) + n += 1 + l + sovEvm(uint64(l)) + } + } + l = len(m.Data) + if l > 0 { + n += 1 + l + sovEvm(uint64(l)) + } + if m.BlockNumber != 0 { + n += 1 + sovEvm(uint64(m.BlockNumber)) + } + l = len(m.TxHash) + if l > 0 { + n += 1 + l + sovEvm(uint64(l)) + } + if m.TxIndex != 0 { + n += 1 + sovEvm(uint64(m.TxIndex)) + } + l = len(m.BlockHash) + if l > 0 { + n += 1 + l + sovEvm(uint64(l)) + } + if m.Index != 0 { + n += 1 + sovEvm(uint64(m.Index)) + } + if m.Removed { + n += 2 + } + return n +} + +func (m *V6TxResult) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ContractAddress) + if l > 0 { + n += 1 + l + sovEvm(uint64(l)) + } + l = len(m.Bloom) + if l > 0 { + n += 1 + l + sovEvm(uint64(l)) + } + l = m.TxLogs.Size() + n += 1 + l + sovEvm(uint64(l)) + l = len(m.Ret) + if l > 0 { + n += 1 + l + sovEvm(uint64(l)) + } + if m.Reverted { + n += 2 + } + if m.GasUsed != 0 { + n += 1 + sovEvm(uint64(m.GasUsed)) + } + return n +} + +func (m *V6AccessTuple) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Address) + if l > 0 { + n += 1 + l + sovEvm(uint64(l)) + } + if len(m.StorageKeys) > 0 { + for _, s := range m.StorageKeys { + l = len(s) + n += 1 + l + sovEvm(uint64(l)) + } + } + return n +} + +func (m *V6TraceConfig) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Tracer) + if l > 0 { + n += 1 + l + sovEvm(uint64(l)) + } + l = len(m.Timeout) + if l > 0 { + n += 1 + l + sovEvm(uint64(l)) + } + if m.Reexec != 0 { + n += 1 + sovEvm(uint64(m.Reexec)) + } + if m.DisableStack { + n += 2 + } + if m.DisableStorage { + n += 2 + } + if m.Debug { + n += 2 + } + if m.Limit != 0 { + n += 1 + sovEvm(uint64(m.Limit)) + } + if m.Overrides != nil { + l = m.Overrides.Size() + n += 1 + l + sovEvm(uint64(l)) + } + if m.EnableMemory { + n += 2 + } + if m.EnableReturnData { + n += 2 + } + l = len(m.TracerJsonConfig) + if l > 0 { + n += 1 + l + sovEvm(uint64(l)) + } + return n +} + +func sovEvm(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozEvm(x uint64) (n int) { + return sovEvm(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *V6Params) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Params: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Params: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EvmDenom", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.EvmDenom = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field EnableCreate", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.EnableCreate = bool(v != 0) + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field EnableCall", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.EnableCall = bool(v != 0) + case 4: + if wireType == 0 { + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.ExtraEIPs = append(m.ExtraEIPs, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + packedLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var elementCount int + var count int + for _, integer := range dAtA[iNdEx:postIndex] { + if integer < 128 { + count++ + } + } + elementCount = count + if elementCount != 0 && len(m.ExtraEIPs) == 0 { + m.ExtraEIPs = make([]int64, 0, elementCount) + } + for iNdEx < postIndex { + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.ExtraEIPs = append(m.ExtraEIPs, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field ExtraEIPs", wireType) + } + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainConfig", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ChainConfig.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AllowUnprotectedTxs", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.AllowUnprotectedTxs = bool(v != 0) + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ActivePrecompiles", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ActivePrecompiles = append(m.ActivePrecompiles, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EVMChannels", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.EVMChannels = append(m.EVMChannels, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvm(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvm + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *V6ChainConfig) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ChainConfig: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ChainConfig: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field HomesteadBlock", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var v cosmossdk_io_math.Int + m.HomesteadBlock = &v + if err := m.HomesteadBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DAOForkBlock", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var v cosmossdk_io_math.Int + m.DAOForkBlock = &v + if err := m.DAOForkBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DAOForkSupport", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.DAOForkSupport = bool(v != 0) + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EIP150Block", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var v cosmossdk_io_math.Int + m.EIP150Block = &v + if err := m.EIP150Block.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EIP150Hash", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.EIP150Hash = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EIP155Block", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var v cosmossdk_io_math.Int + m.EIP155Block = &v + if err := m.EIP155Block.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EIP158Block", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var v cosmossdk_io_math.Int + m.EIP158Block = &v + if err := m.EIP158Block.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ByzantiumBlock", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var v cosmossdk_io_math.Int + m.ByzantiumBlock = &v + if err := m.ByzantiumBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConstantinopleBlock", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var v cosmossdk_io_math.Int + m.ConstantinopleBlock = &v + if err := m.ConstantinopleBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PetersburgBlock", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var v cosmossdk_io_math.Int + m.PetersburgBlock = &v + if err := m.PetersburgBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IstanbulBlock", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var v cosmossdk_io_math.Int + m.IstanbulBlock = &v + if err := m.IstanbulBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 12: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MuirGlacierBlock", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var v cosmossdk_io_math.Int + m.MuirGlacierBlock = &v + if err := m.MuirGlacierBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 13: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BerlinBlock", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var v cosmossdk_io_math.Int + m.BerlinBlock = &v + if err := m.BerlinBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 17: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LondonBlock", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var v cosmossdk_io_math.Int + m.LondonBlock = &v + if err := m.LondonBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 18: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ArrowGlacierBlock", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var v cosmossdk_io_math.Int + m.ArrowGlacierBlock = &v + if err := m.ArrowGlacierBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 20: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GrayGlacierBlock", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var v cosmossdk_io_math.Int + m.GrayGlacierBlock = &v + if err := m.GrayGlacierBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 21: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MergeNetsplitBlock", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var v cosmossdk_io_math.Int + m.MergeNetsplitBlock = &v + if err := m.MergeNetsplitBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 22: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ShanghaiBlock", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var v cosmossdk_io_math.Int + m.ShanghaiBlock = &v + if err := m.ShanghaiBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 23: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CancunBlock", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var v cosmossdk_io_math.Int + m.CancunBlock = &v + if err := m.CancunBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvm(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvm + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *V6State) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: State: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: State: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvm(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvm + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *V6TransactionLogs) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TransactionLogs: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TransactionLogs: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Hash", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Hash = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Logs", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Logs = append(m.Logs, &V6Log{}) + if err := m.Logs[len(m.Logs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvm(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvm + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *V6Log) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Log: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Log: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Address = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Topics", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Topics = append(m.Topics, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) + if m.Data == nil { + m.Data = []byte{} + } + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field BlockNumber", wireType) + } + m.BlockNumber = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.BlockNumber |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TxHash", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TxHash = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TxIndex", wireType) + } + m.TxIndex = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.TxIndex |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BlockHash", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.BlockHash = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) + } + m.Index = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Index |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 9: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Removed", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Removed = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipEvm(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvm + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *V6TxResult) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TxResult: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TxResult: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ContractAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ContractAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Bloom", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Bloom = append(m.Bloom[:0], dAtA[iNdEx:postIndex]...) + if m.Bloom == nil { + m.Bloom = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TxLogs", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.TxLogs.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Ret", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Ret = append(m.Ret[:0], dAtA[iNdEx:postIndex]...) + if m.Ret == nil { + m.Ret = []byte{} + } + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Reverted", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Reverted = bool(v != 0) + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field GasUsed", wireType) + } + m.GasUsed = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.GasUsed |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipEvm(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvm + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *V6AccessTuple) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AccessTuple: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AccessTuple: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Address = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StorageKeys", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.StorageKeys = append(m.StorageKeys, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvm(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvm + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *V6TraceConfig) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TraceConfig: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TraceConfig: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Tracer", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Tracer = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Timeout", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Timeout = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Reexec", wireType) + } + m.Reexec = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Reexec |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DisableStack", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.DisableStack = bool(v != 0) + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DisableStorage", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.DisableStorage = bool(v != 0) + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Debug", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Debug = bool(v != 0) + case 9: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Limit", wireType) + } + m.Limit = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Limit |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Overrides", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Overrides == nil { + m.Overrides = &V6ChainConfig{} + } + if err := m.Overrides.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 11: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field EnableMemory", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.EnableMemory = bool(v != 0) + case 12: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field EnableReturnData", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.EnableReturnData = bool(v != 0) + case 13: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TracerJsonConfig", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TracerJsonConfig = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvm(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvm + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipEvm(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowEvm + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowEvm + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowEvm + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthEvm + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupEvm + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthEvm + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthEvm = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowEvm = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupEvm = fmt.Errorf("proto: unexpected end of group") +) \ No newline at end of file diff --git a/x/evm/module.go b/x/evm/module.go index bd10d4bf6f..30e536733c 100644 --- a/x/evm/module.go +++ b/x/evm/module.go @@ -26,7 +26,7 @@ import ( ) // consensusVersion defines the current x/evm module consensus version. -const consensusVersion = 6 +const consensusVersion = 7 var ( _ module.AppModule = AppModule{} @@ -144,6 +144,10 @@ func (am AppModule) RegisterServices(cfg module.Configurator) { if err := cfg.RegisterMigration(types.ModuleName, 5, m.Migrate5to6); err != nil { panic(err) } + + if err := cfg.RegisterMigration(types.ModuleName, 6, m.Migrate6to7); err != nil { + panic(err) + } } // BeginBlock returns the begin block for the evm module. diff --git a/x/evm/types/evm.pb.go b/x/evm/types/evm.pb.go index cf94077eb6..aa0220cb3f 100644 --- a/x/evm/types/evm.pb.go +++ b/x/evm/types/evm.pb.go @@ -24,15 +24,43 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package +// AccessType defines the types of permissions for the operations +type AccessType int32 + +const ( + // ACCESS_TYPE_PERMISSIONLESS does not restrict the operation to anyone + AccessTypePermissionless AccessType = 0 + // ACCESS_TYPE_RESTRICTED restrict the operation to anyone + AccessTypeRestricted AccessType = 1 + // ACCESS_TYPE_PERMISSIONED only allows the operation for specific addresses + AccessTypePermissioned AccessType = 2 +) + +var AccessType_name = map[int32]string{ + 0: "ACCESS_TYPE_PERMISSIONLESS", + 1: "ACCESS_TYPE_RESTRICTED", + 2: "ACCESS_TYPE_PERMISSIONED", +} + +var AccessType_value = map[string]int32{ + "ACCESS_TYPE_PERMISSIONLESS": 0, + "ACCESS_TYPE_RESTRICTED": 1, + "ACCESS_TYPE_PERMISSIONED": 2, +} + +func (x AccessType) String() string { + return proto.EnumName(AccessType_name, int32(x)) +} + +func (AccessType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_d21ecc92c8c8583e, []int{0} +} + // Params defines the EVM module parameters type Params struct { // evm_denom represents the token denomination used to run the EVM state // transitions. EvmDenom string `protobuf:"bytes,1,opt,name=evm_denom,json=evmDenom,proto3" json:"evm_denom,omitempty" yaml:"evm_denom"` - // enable_create toggles state transitions that use the vm.Create function - EnableCreate bool `protobuf:"varint,2,opt,name=enable_create,json=enableCreate,proto3" json:"enable_create,omitempty" yaml:"enable_create"` - // enable_call toggles state transitions that use the vm.Call function - EnableCall bool `protobuf:"varint,3,opt,name=enable_call,json=enableCall,proto3" json:"enable_call,omitempty" yaml:"enable_call"` // extra_eips defines the additional EIPs for the vm.Config ExtraEIPs []int64 `protobuf:"varint,4,rep,packed,name=extra_eips,json=extraEips,proto3" json:"extra_eips,omitempty" yaml:"extra_eips"` // chain_config defines the EVM chain configuration parameters @@ -45,6 +73,8 @@ type Params struct { ActivePrecompiles []string `protobuf:"bytes,7,rep,name=active_precompiles,json=activePrecompiles,proto3" json:"active_precompiles,omitempty"` // evm_channels is the list of channel identifiers from EVM compatible chains EVMChannels []string `protobuf:"bytes,8,rep,name=evm_channels,json=evmChannels,proto3" json:"evm_channels,omitempty"` + // access_control defines the permission policy of the EVM + AccessControl AccessControl `protobuf:"bytes,9,opt,name=access_control,json=accessControl,proto3" json:"access_control"` } func (m *Params) Reset() { *m = Params{} } @@ -87,20 +117,6 @@ func (m *Params) GetEvmDenom() string { return "" } -func (m *Params) GetEnableCreate() bool { - if m != nil { - return m.EnableCreate - } - return false -} - -func (m *Params) GetEnableCall() bool { - if m != nil { - return m.EnableCall - } - return false -} - func (m *Params) GetExtraEIPs() []int64 { if m != nil { return m.ExtraEIPs @@ -136,6 +152,127 @@ func (m *Params) GetEVMChannels() []string { return nil } +func (m *Params) GetAccessControl() AccessControl { + if m != nil { + return m.AccessControl + } + return AccessControl{} +} + +// AccessControl defines the permission policy of the EVM +// for creating and calling contracts +type AccessControl struct { + // create defines the permission policy for creating contracts + Create AccessControlType `protobuf:"bytes,1,opt,name=create,proto3" json:"create"` + // call defines the permission policy for calling contracts + Call AccessControlType `protobuf:"bytes,2,opt,name=call,proto3" json:"call"` +} + +func (m *AccessControl) Reset() { *m = AccessControl{} } +func (m *AccessControl) String() string { return proto.CompactTextString(m) } +func (*AccessControl) ProtoMessage() {} +func (*AccessControl) Descriptor() ([]byte, []int) { + return fileDescriptor_d21ecc92c8c8583e, []int{1} +} +func (m *AccessControl) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *AccessControl) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_AccessControl.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *AccessControl) XXX_Merge(src proto.Message) { + xxx_messageInfo_AccessControl.Merge(m, src) +} +func (m *AccessControl) XXX_Size() int { + return m.Size() +} +func (m *AccessControl) XXX_DiscardUnknown() { + xxx_messageInfo_AccessControl.DiscardUnknown(m) +} + +var xxx_messageInfo_AccessControl proto.InternalMessageInfo + +func (m *AccessControl) GetCreate() AccessControlType { + if m != nil { + return m.Create + } + return AccessControlType{} +} + +func (m *AccessControl) GetCall() AccessControlType { + if m != nil { + return m.Call + } + return AccessControlType{} +} + +// AccessControlType defines the permission type for policies +type AccessControlType struct { + // access_type defines which type of permission is required for the operation + AccessType AccessType `protobuf:"varint,1,opt,name=access_type,json=accessType,proto3,enum=ethermint.evm.v1.AccessType" json:"access_type,omitempty" yaml:"access_type"` + // allowlist_addresses defines defines different things depending on the AccessType: + // - ACCESS_TYPE_PERMISSIONLESS: list of addresses that are blocked from performing the operation + // - ACCESS_TYPE_RESTRICTED: ignored + // - ACCESS_TYPE_PERMISSIONED: list of addresses that are allowed to perform the operation + AccessControlList []string `protobuf:"bytes,2,rep,name=access_control_list,json=accessControlList,proto3" json:"access_control_list,omitempty" yaml:"access_control_list"` +} + +func (m *AccessControlType) Reset() { *m = AccessControlType{} } +func (m *AccessControlType) String() string { return proto.CompactTextString(m) } +func (*AccessControlType) ProtoMessage() {} +func (*AccessControlType) Descriptor() ([]byte, []int) { + return fileDescriptor_d21ecc92c8c8583e, []int{2} +} +func (m *AccessControlType) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *AccessControlType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_AccessControlType.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *AccessControlType) XXX_Merge(src proto.Message) { + xxx_messageInfo_AccessControlType.Merge(m, src) +} +func (m *AccessControlType) XXX_Size() int { + return m.Size() +} +func (m *AccessControlType) XXX_DiscardUnknown() { + xxx_messageInfo_AccessControlType.DiscardUnknown(m) +} + +var xxx_messageInfo_AccessControlType proto.InternalMessageInfo + +func (m *AccessControlType) GetAccessType() AccessType { + if m != nil { + return m.AccessType + } + return AccessTypePermissionless +} + +func (m *AccessControlType) GetAccessControlList() []string { + if m != nil { + return m.AccessControlList + } + return nil +} + // ChainConfig defines the Ethereum ChainConfig parameters using *sdk.Int values // instead of *big.Int. type ChainConfig struct { @@ -184,7 +321,7 @@ func (m *ChainConfig) Reset() { *m = ChainConfig{} } func (m *ChainConfig) String() string { return proto.CompactTextString(m) } func (*ChainConfig) ProtoMessage() {} func (*ChainConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_d21ecc92c8c8583e, []int{1} + return fileDescriptor_d21ecc92c8c8583e, []int{3} } func (m *ChainConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -239,7 +376,7 @@ func (m *State) Reset() { *m = State{} } func (m *State) String() string { return proto.CompactTextString(m) } func (*State) ProtoMessage() {} func (*State) Descriptor() ([]byte, []int) { - return fileDescriptor_d21ecc92c8c8583e, []int{2} + return fileDescriptor_d21ecc92c8c8583e, []int{4} } func (m *State) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -296,7 +433,7 @@ func (m *TransactionLogs) Reset() { *m = TransactionLogs{} } func (m *TransactionLogs) String() string { return proto.CompactTextString(m) } func (*TransactionLogs) ProtoMessage() {} func (*TransactionLogs) Descriptor() ([]byte, []int) { - return fileDescriptor_d21ecc92c8c8583e, []int{3} + return fileDescriptor_d21ecc92c8c8583e, []int{5} } func (m *TransactionLogs) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -372,7 +509,7 @@ func (m *Log) Reset() { *m = Log{} } func (m *Log) String() string { return proto.CompactTextString(m) } func (*Log) ProtoMessage() {} func (*Log) Descriptor() ([]byte, []int) { - return fileDescriptor_d21ecc92c8c8583e, []int{4} + return fileDescriptor_d21ecc92c8c8583e, []int{6} } func (m *Log) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -487,7 +624,7 @@ func (m *TxResult) Reset() { *m = TxResult{} } func (m *TxResult) String() string { return proto.CompactTextString(m) } func (*TxResult) ProtoMessage() {} func (*TxResult) Descriptor() ([]byte, []int) { - return fileDescriptor_d21ecc92c8c8583e, []int{5} + return fileDescriptor_d21ecc92c8c8583e, []int{7} } func (m *TxResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -528,7 +665,7 @@ func (m *AccessTuple) Reset() { *m = AccessTuple{} } func (m *AccessTuple) String() string { return proto.CompactTextString(m) } func (*AccessTuple) ProtoMessage() {} func (*AccessTuple) Descriptor() ([]byte, []int) { - return fileDescriptor_d21ecc92c8c8583e, []int{6} + return fileDescriptor_d21ecc92c8c8583e, []int{8} } func (m *AccessTuple) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -588,7 +725,7 @@ func (m *TraceConfig) Reset() { *m = TraceConfig{} } func (m *TraceConfig) String() string { return proto.CompactTextString(m) } func (*TraceConfig) ProtoMessage() {} func (*TraceConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_d21ecc92c8c8583e, []int{7} + return fileDescriptor_d21ecc92c8c8583e, []int{9} } func (m *TraceConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -695,7 +832,10 @@ func (m *TraceConfig) GetTracerJsonConfig() string { } func init() { + proto.RegisterEnum("ethermint.evm.v1.AccessType", AccessType_name, AccessType_value) proto.RegisterType((*Params)(nil), "ethermint.evm.v1.Params") + proto.RegisterType((*AccessControl)(nil), "ethermint.evm.v1.AccessControl") + proto.RegisterType((*AccessControlType)(nil), "ethermint.evm.v1.AccessControlType") proto.RegisterType((*ChainConfig)(nil), "ethermint.evm.v1.ChainConfig") proto.RegisterType((*State)(nil), "ethermint.evm.v1.State") proto.RegisterType((*TransactionLogs)(nil), "ethermint.evm.v1.TransactionLogs") @@ -708,111 +848,125 @@ func init() { func init() { proto.RegisterFile("ethermint/evm/v1/evm.proto", fileDescriptor_d21ecc92c8c8583e) } var fileDescriptor_d21ecc92c8c8583e = []byte{ - // 1661 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x57, 0xcd, 0x4f, 0x23, 0xc9, - 0x15, 0x07, 0x6c, 0xa0, 0x5d, 0x36, 0x76, 0x53, 0x18, 0xd6, 0x3b, 0xa3, 0xd0, 0xa4, 0x0f, 0x11, - 0x91, 0x76, 0x61, 0x60, 0x42, 0x16, 0xed, 0x2a, 0x1f, 0xd3, 0x33, 0x6c, 0x02, 0x99, 0xdd, 0xa0, - 0x1a, 0x36, 0x51, 0xa2, 0x44, 0xad, 0x72, 0x77, 0x6d, 0xbb, 0x97, 0xee, 0x2e, 0xab, 0xaa, 0xda, - 0x63, 0xe7, 0x2f, 0x88, 0x94, 0x4b, 0xfe, 0x84, 0xfd, 0x73, 0x56, 0x39, 0xcd, 0x31, 0xca, 0xa1, - 0x15, 0x31, 0x37, 0x94, 0x13, 0xf7, 0x48, 0x51, 0x7d, 0xb8, 0xfd, 0x01, 0x61, 0x7d, 0x81, 0xfa, - 0xbd, 0x8f, 0xdf, 0xab, 0xf7, 0xea, 0xb5, 0x5f, 0x15, 0x78, 0x42, 0x44, 0x8f, 0xb0, 0x34, 0xce, - 0xc4, 0x21, 0x19, 0xa4, 0x87, 0x83, 0x23, 0xf9, 0xef, 0xa0, 0xcf, 0xa8, 0xa0, 0xd0, 0x2e, 0x75, - 0x07, 0x52, 0x38, 0x38, 0x7a, 0xd2, 0x8e, 0x68, 0x44, 0x95, 0xf2, 0x50, 0xae, 0xb4, 0x9d, 0xfb, - 0x9f, 0x0a, 0x58, 0xbb, 0xc4, 0x0c, 0xa7, 0x1c, 0x1e, 0x81, 0x1a, 0x19, 0xa4, 0x7e, 0x48, 0x32, - 0x9a, 0x76, 0x96, 0xf7, 0x96, 0xf7, 0x6b, 0x5e, 0xfb, 0xae, 0x70, 0xec, 0x11, 0x4e, 0x93, 0x4f, - 0xdd, 0x52, 0xe5, 0x22, 0x8b, 0x0c, 0xd2, 0x57, 0x72, 0x09, 0x7f, 0x06, 0x36, 0x48, 0x86, 0xbb, - 0x09, 0xf1, 0x03, 0x46, 0xb0, 0x20, 0x9d, 0x95, 0xbd, 0xe5, 0x7d, 0xcb, 0xeb, 0xdc, 0x15, 0x4e, - 0xdb, 0xb8, 0x4d, 0xab, 0x5d, 0xd4, 0xd0, 0xf8, 0xa5, 0x82, 0xf0, 0x13, 0x50, 0x1f, 0xeb, 0x71, - 0x92, 0x74, 0x2a, 0xca, 0x79, 0xe7, 0xae, 0x70, 0xe0, 0xac, 0x33, 0x4e, 0x12, 0x17, 0x01, 0xe3, - 0x8a, 0x93, 0x04, 0xbe, 0x00, 0x80, 0x0c, 0x05, 0xc3, 0x3e, 0x89, 0xfb, 0xbc, 0x53, 0xdd, 0xab, - 0xec, 0x57, 0x3c, 0xf7, 0xa6, 0x70, 0x6a, 0x67, 0x52, 0x7a, 0x76, 0x7e, 0xc9, 0xef, 0x0a, 0x67, - 0xd3, 0x90, 0x94, 0x86, 0x2e, 0xaa, 0x29, 0x70, 0x16, 0xf7, 0x39, 0xfc, 0x33, 0x68, 0x04, 0x3d, - 0x1c, 0x67, 0x7e, 0x40, 0xb3, 0xaf, 0xe3, 0xa8, 0xb3, 0xba, 0xb7, 0xbc, 0x5f, 0x3f, 0xfe, 0xc1, - 0xc1, 0x7c, 0xdd, 0x0e, 0x5e, 0x4a, 0xab, 0x97, 0xca, 0xc8, 0x7b, 0xfa, 0x5d, 0xe1, 0x2c, 0xdd, - 0x15, 0xce, 0x96, 0xa6, 0x9e, 0x26, 0x70, 0x51, 0x3d, 0x98, 0x58, 0xc2, 0x63, 0xb0, 0x8d, 0x93, - 0x84, 0xbe, 0xf5, 0xf3, 0x4c, 0x16, 0x9a, 0x04, 0x82, 0x84, 0xbe, 0x18, 0xf2, 0xce, 0x9a, 0x4c, - 0x12, 0x6d, 0x29, 0xe5, 0x57, 0x13, 0xdd, 0xd5, 0x90, 0xc3, 0x8f, 0x01, 0xc4, 0x81, 0x88, 0x07, - 0xc4, 0xef, 0x33, 0x12, 0xd0, 0xb4, 0x1f, 0x27, 0x84, 0x77, 0xd6, 0xf7, 0x2a, 0xfb, 0x35, 0xb4, - 0xa9, 0x35, 0x97, 0x13, 0x05, 0x3c, 0x06, 0x0d, 0x79, 0x28, 0x41, 0x0f, 0x67, 0x19, 0x49, 0x78, - 0xc7, 0x92, 0x86, 0x5e, 0xeb, 0xa6, 0x70, 0xea, 0x67, 0xbf, 0xfb, 0xe2, 0xa5, 0x11, 0xa3, 0x3a, - 0x19, 0xa4, 0x63, 0xe0, 0xfe, 0xb7, 0x09, 0xea, 0x53, 0x09, 0xc1, 0x3f, 0x81, 0x56, 0x8f, 0xa6, - 0x84, 0x0b, 0x82, 0x43, 0xbf, 0x9b, 0xd0, 0xe0, 0xda, 0x9c, 0xfc, 0xf3, 0x7f, 0x15, 0xce, 0x76, - 0x40, 0x79, 0x4a, 0x39, 0x0f, 0xaf, 0x0f, 0x62, 0x7a, 0x98, 0x62, 0xd1, 0x3b, 0x38, 0xcf, 0xc4, - 0x5d, 0xe1, 0xec, 0xe8, 0xf4, 0xe7, 0x3c, 0x5d, 0xd4, 0x2c, 0x25, 0x9e, 0x14, 0xc0, 0x1e, 0x68, - 0x86, 0x98, 0xfa, 0x5f, 0x53, 0x76, 0x6d, 0xc8, 0x57, 0x14, 0xb9, 0xf7, 0x7f, 0xc9, 0x6f, 0x0a, - 0xa7, 0xf1, 0xea, 0xc5, 0x6f, 0x3f, 0xa7, 0xec, 0x5a, 0x51, 0xdc, 0x15, 0xce, 0xb6, 0x0e, 0x36, - 0x4b, 0xe4, 0xa2, 0x46, 0x88, 0x69, 0x69, 0x06, 0x7f, 0x0f, 0xec, 0xd2, 0x80, 0xe7, 0xfd, 0x3e, - 0x65, 0xc2, 0xb4, 0xd3, 0xc7, 0x37, 0x85, 0xd3, 0x34, 0x94, 0x6f, 0xb4, 0xe6, 0xae, 0x70, 0x3e, - 0x98, 0x23, 0x35, 0x3e, 0x2e, 0x6a, 0x1a, 0x5a, 0x63, 0x0a, 0xbb, 0xa0, 0x41, 0xe2, 0xfe, 0xd1, - 0xc9, 0x33, 0x93, 0x40, 0x55, 0x25, 0xf0, 0x8b, 0xc7, 0x12, 0xa8, 0x9f, 0x9d, 0x5f, 0x1e, 0x9d, - 0x3c, 0x1b, 0xef, 0xdf, 0xf4, 0xca, 0x34, 0x8b, 0x8b, 0xea, 0x1a, 0xea, 0xcd, 0x9f, 0x03, 0x03, - 0xfd, 0x1e, 0xe6, 0x3d, 0xd5, 0x89, 0x35, 0x6f, 0xff, 0xa6, 0x70, 0x80, 0x66, 0xfa, 0x35, 0xe6, - 0xbd, 0x49, 0xd5, 0xbb, 0xa3, 0xbf, 0xe0, 0x4c, 0xc4, 0x79, 0x3a, 0xe6, 0x02, 0xda, 0x59, 0x5a, - 0x95, 0xdb, 0x3d, 0x31, 0xdb, 0x5d, 0x5b, 0x74, 0xbb, 0x27, 0x0f, 0x6d, 0xf7, 0x64, 0x76, 0xbb, - 0xda, 0xa6, 0x8c, 0x71, 0x6a, 0x62, 0xac, 0x2f, 0x1a, 0xe3, 0xf4, 0xa1, 0x18, 0xa7, 0xb3, 0x31, - 0xb4, 0x8d, 0xec, 0xcb, 0xb9, 0x3c, 0x3b, 0xd6, 0xc2, 0x7d, 0x79, 0xaf, 0x42, 0xcd, 0x52, 0xa2, - 0xd9, 0xaf, 0x41, 0x3b, 0xa0, 0x19, 0x17, 0x52, 0x96, 0xd1, 0x7e, 0x42, 0x4c, 0x88, 0x9a, 0x0a, - 0x71, 0xfa, 0x58, 0x88, 0xa7, 0xe6, 0xcb, 0x7f, 0xc0, 0xdd, 0x45, 0x5b, 0xb3, 0x62, 0x1d, 0xcc, - 0x07, 0x76, 0x9f, 0x08, 0xc2, 0x78, 0x37, 0x67, 0x91, 0x09, 0x04, 0x54, 0xa0, 0x9f, 0x3c, 0x16, - 0xc8, 0x74, 0xe8, 0xbc, 0xab, 0x8b, 0x5a, 0x13, 0x91, 0x0e, 0xf0, 0x07, 0xd0, 0x8c, 0x65, 0xd4, - 0x6e, 0x9e, 0x18, 0xfa, 0xba, 0xa2, 0x3f, 0x7e, 0x8c, 0xde, 0x7c, 0x55, 0xb3, 0x8e, 0x2e, 0xda, - 0x18, 0x0b, 0x34, 0x75, 0x08, 0x60, 0x9a, 0xc7, 0xcc, 0x8f, 0x12, 0x1c, 0xc4, 0x84, 0x19, 0xfa, - 0x86, 0xa2, 0xff, 0xe9, 0x63, 0xf4, 0x1f, 0x6a, 0xfa, 0xfb, 0xce, 0x2e, 0xb2, 0xa5, 0xf0, 0x57, - 0x5a, 0xa6, 0xa3, 0xbc, 0x01, 0x8d, 0x2e, 0x61, 0x49, 0x9c, 0x19, 0xfe, 0x0d, 0xc5, 0xff, 0xec, - 0x31, 0x7e, 0xd3, 0x41, 0xd3, 0x6e, 0x2e, 0xaa, 0x6b, 0x58, 0x92, 0x26, 0x34, 0x0b, 0xe9, 0x98, - 0x74, 0x73, 0x61, 0xd2, 0x69, 0x37, 0x17, 0xd5, 0x35, 0xd4, 0xa4, 0x11, 0xd8, 0xc2, 0x8c, 0xd1, - 0xb7, 0x73, 0x05, 0x81, 0x8a, 0xfb, 0x93, 0xc7, 0xb8, 0x9f, 0x68, 0xee, 0x07, 0xbc, 0x5d, 0xb4, - 0xa9, 0xa4, 0x33, 0x25, 0x09, 0x01, 0x8c, 0x18, 0x1e, 0xcd, 0xc5, 0x69, 0x2f, 0x5c, 0xf8, 0xfb, - 0xce, 0x2e, 0xb2, 0xa5, 0x70, 0x26, 0xca, 0x37, 0xa0, 0x9d, 0x12, 0x16, 0x11, 0x3f, 0x23, 0x82, - 0xf7, 0x93, 0x58, 0x98, 0x38, 0xdb, 0x0b, 0x7f, 0x07, 0x0f, 0xb9, 0xbb, 0x08, 0x2a, 0xf1, 0x97, - 0x46, 0x5a, 0x76, 0x29, 0xef, 0xe1, 0x2c, 0xea, 0xe1, 0xd8, 0x44, 0xd9, 0x59, 0xb8, 0x4b, 0x67, - 0x1d, 0x5d, 0xb4, 0x31, 0x16, 0x94, 0x47, 0x1d, 0xe0, 0x2c, 0xc8, 0xc7, 0x47, 0xfd, 0xc1, 0xc2, - 0x47, 0x3d, 0xed, 0x26, 0x07, 0xb8, 0x82, 0x8a, 0xf4, 0xa2, 0x6a, 0x35, 0xed, 0xd6, 0x45, 0xd5, - 0x6a, 0xd9, 0xf6, 0x45, 0xd5, 0xb2, 0xed, 0xcd, 0x8b, 0xaa, 0xb5, 0x65, 0xb7, 0xd1, 0xc6, 0x88, - 0x26, 0xd4, 0x1f, 0x3c, 0xd7, 0x4e, 0xa8, 0x4e, 0xde, 0x62, 0x6e, 0x7e, 0x68, 0x50, 0x33, 0xc0, - 0x02, 0x27, 0x23, 0x6e, 0x0a, 0x81, 0x6c, 0x5d, 0x9e, 0xa9, 0xb1, 0x75, 0x08, 0x56, 0xdf, 0x08, - 0x79, 0xf5, 0xb1, 0x41, 0xe5, 0x9a, 0x8c, 0xf4, 0xb0, 0x45, 0x72, 0x09, 0xdb, 0x60, 0x75, 0x80, - 0x93, 0x5c, 0xdf, 0xa1, 0x6a, 0x48, 0x03, 0xf7, 0x12, 0xb4, 0xae, 0x18, 0xce, 0xb8, 0x1c, 0xff, - 0x34, 0x7b, 0x4d, 0x23, 0x0e, 0x21, 0xa8, 0xaa, 0x39, 0xa1, 0x7d, 0xd5, 0x1a, 0xfe, 0x18, 0x54, - 0x13, 0x1a, 0xf1, 0xce, 0xca, 0x5e, 0x65, 0xbf, 0x7e, 0xbc, 0x7d, 0xff, 0x16, 0xf3, 0x9a, 0x46, - 0x48, 0x99, 0xb8, 0xff, 0x58, 0x01, 0x95, 0xd7, 0x34, 0x82, 0x1d, 0xb0, 0x8e, 0xc3, 0x90, 0x11, - 0xce, 0x0d, 0xd3, 0x18, 0xc2, 0x1d, 0xb0, 0x26, 0x68, 0x3f, 0x0e, 0x34, 0x5d, 0x0d, 0x19, 0x24, - 0x03, 0x87, 0x58, 0x60, 0x35, 0x58, 0x1b, 0x48, 0xad, 0xe5, 0x25, 0x44, 0x65, 0xe6, 0x67, 0x79, - 0xda, 0x25, 0x4c, 0xcd, 0xc7, 0xaa, 0xd7, 0xba, 0x2d, 0x9c, 0xba, 0x92, 0x7f, 0xa9, 0xc4, 0x68, - 0x1a, 0xc0, 0x8f, 0xc0, 0xba, 0x18, 0x4e, 0xcf, 0xba, 0xad, 0xdb, 0xc2, 0x69, 0x89, 0x49, 0x9a, - 0x72, 0x94, 0xa1, 0x35, 0x31, 0x54, 0x23, 0xed, 0x10, 0x58, 0x62, 0xe8, 0xc7, 0x59, 0x48, 0x86, - 0x6a, 0x9c, 0x55, 0xbd, 0xf6, 0x6d, 0xe1, 0xd8, 0x53, 0xe6, 0xe7, 0x52, 0x87, 0xd6, 0xc5, 0x50, - 0x2d, 0xe0, 0x47, 0x00, 0xe8, 0x2d, 0xa9, 0x08, 0x7a, 0x3a, 0x6d, 0xdc, 0x16, 0x4e, 0x4d, 0x49, - 0x15, 0xf7, 0x64, 0x09, 0x5d, 0xb0, 0xaa, 0xb9, 0x2d, 0xc5, 0xdd, 0xb8, 0x2d, 0x1c, 0x2b, 0xa1, - 0x91, 0xe6, 0xd4, 0x2a, 0x59, 0x2a, 0x46, 0x52, 0x3a, 0x20, 0xa1, 0x1a, 0x11, 0x16, 0x1a, 0x43, - 0xf7, 0x6f, 0x2b, 0xc0, 0xba, 0x1a, 0x22, 0xc2, 0xf3, 0x44, 0xc0, 0xcf, 0x81, 0x1d, 0xd0, 0x4c, - 0x30, 0x1c, 0x08, 0x7f, 0xa6, 0xb4, 0xde, 0xd3, 0xc9, 0x0f, 0xfa, 0xbc, 0x85, 0x8b, 0x5a, 0x63, - 0xd1, 0x0b, 0x53, 0xff, 0x36, 0x58, 0xed, 0x26, 0x94, 0xa6, 0xaa, 0x13, 0x1a, 0x48, 0x03, 0x88, - 0x54, 0xd5, 0xd4, 0x29, 0x57, 0xd4, 0x5d, 0xf5, 0x87, 0xf7, 0x4f, 0x79, 0xae, 0x55, 0xbc, 0x1d, - 0x73, 0x5f, 0x6d, 0xea, 0xd8, 0xc6, 0xdf, 0x95, 0xb5, 0x55, 0xad, 0x64, 0x83, 0x0a, 0x23, 0x42, - 0x1d, 0x5a, 0x03, 0xc9, 0x25, 0x7c, 0x02, 0x2c, 0x46, 0x06, 0x84, 0x09, 0x12, 0xaa, 0xc3, 0xb1, - 0x50, 0x89, 0xe1, 0x87, 0xc0, 0x8a, 0x30, 0xf7, 0x73, 0x4e, 0x42, 0x7d, 0x12, 0x68, 0x3d, 0xc2, - 0xfc, 0x2b, 0x4e, 0xc2, 0x4f, 0xab, 0x7f, 0xfd, 0xd6, 0x59, 0x72, 0x31, 0xa8, 0xbf, 0x08, 0x02, - 0xc2, 0xf9, 0x55, 0xde, 0x4f, 0xc8, 0x23, 0x1d, 0x76, 0x0c, 0x1a, 0x5c, 0x50, 0x86, 0x23, 0xe2, - 0x5f, 0x93, 0x91, 0xe9, 0x33, 0xdd, 0x35, 0x46, 0xfe, 0x1b, 0x32, 0xe2, 0x68, 0x1a, 0x98, 0x10, - 0xdf, 0x56, 0x41, 0xfd, 0x8a, 0xe1, 0x80, 0x98, 0x0b, 0xac, 0xec, 0x55, 0x09, 0x99, 0x09, 0x61, - 0x90, 0x8c, 0x2d, 0xe2, 0x94, 0xd0, 0x5c, 0x98, 0xef, 0x69, 0x0c, 0xa5, 0x07, 0x23, 0x64, 0x48, - 0x02, 0x55, 0xc6, 0x2a, 0x32, 0x08, 0x9e, 0x80, 0x8d, 0x30, 0xe6, 0xea, 0xc1, 0xc1, 0x05, 0x0e, - 0xae, 0x75, 0xfa, 0x9e, 0x7d, 0x5b, 0x38, 0x0d, 0xa3, 0x78, 0x23, 0xe5, 0x68, 0x06, 0xc1, 0xcf, - 0x40, 0x6b, 0xe2, 0xa6, 0x76, 0xab, 0xaf, 0xf8, 0x1e, 0xbc, 0x2d, 0x9c, 0x66, 0x69, 0xaa, 0x34, - 0x68, 0x0e, 0xcb, 0x93, 0x0e, 0x49, 0x37, 0x8f, 0x54, 0xf3, 0x59, 0x48, 0x03, 0x29, 0x4d, 0xe2, - 0x34, 0x16, 0xaa, 0xd9, 0x56, 0x91, 0x06, 0xf0, 0x33, 0x50, 0xa3, 0x03, 0xc2, 0x58, 0x1c, 0x12, - 0xae, 0x2e, 0x10, 0xdf, 0xf7, 0x5a, 0x41, 0x13, 0x7b, 0x99, 0x9c, 0x79, 0x4c, 0xa5, 0x24, 0xa5, - 0x6c, 0xa4, 0xae, 0x08, 0x26, 0x39, 0xad, 0xf8, 0x42, 0xc9, 0xd1, 0x0c, 0x82, 0x1e, 0x80, 0xc6, - 0x8d, 0x11, 0x91, 0xb3, 0xcc, 0x57, 0xdf, 0x7f, 0x43, 0xf9, 0xaa, 0xaf, 0x50, 0x6b, 0x91, 0x52, - 0xbe, 0xc2, 0x02, 0xa3, 0x7b, 0x12, 0xf8, 0x73, 0x00, 0xf5, 0x99, 0xf8, 0xdf, 0x70, 0x5a, 0x3e, - 0xb7, 0xf4, 0x8c, 0x57, 0xf1, 0xb5, 0xd6, 0xec, 0xd9, 0xd6, 0xe8, 0x82, 0x53, 0x93, 0xc5, 0x45, - 0xd5, 0xaa, 0xda, 0xab, 0x17, 0x55, 0x6b, 0xdd, 0xb6, 0xca, 0xfa, 0x99, 0x2c, 0xd0, 0xd6, 0x18, - 0x4f, 0x6d, 0xcf, 0xfb, 0xe5, 0x77, 0x37, 0xbb, 0xcb, 0xef, 0x6e, 0x76, 0x97, 0xff, 0x7d, 0xb3, - 0xbb, 0xfc, 0xf7, 0xf7, 0xbb, 0x4b, 0xef, 0xde, 0xef, 0x2e, 0xfd, 0xf3, 0xfd, 0xee, 0xd2, 0x1f, - 0x7f, 0x14, 0xc5, 0xa2, 0x97, 0x77, 0x0f, 0x02, 0x9a, 0xca, 0xa7, 0x32, 0xe5, 0xe6, 0xef, 0xe0, - 0xe8, 0xf4, 0x70, 0xa8, 0xde, 0xd0, 0x62, 0xd4, 0x27, 0xbc, 0xbb, 0xa6, 0xde, 0xc6, 0xcf, 0xff, - 0x17, 0x00, 0x00, 0xff, 0xff, 0xc3, 0x00, 0x49, 0xb2, 0x61, 0x0f, 0x00, 0x00, + // 1884 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x58, 0xdd, 0x4f, 0x2b, 0xc7, + 0x15, 0xc7, 0x78, 0x81, 0xf5, 0xd8, 0xd8, 0xcb, 0x60, 0x88, 0xe3, 0xa4, 0x2c, 0xdd, 0x56, 0x15, + 0xad, 0x12, 0xb8, 0x70, 0x43, 0x8b, 0x92, 0x7e, 0x61, 0x70, 0x5a, 0x28, 0xf7, 0x06, 0x8d, 0x49, + 0xab, 0x54, 0x8d, 0x56, 0xe3, 0xdd, 0x89, 0xbd, 0x61, 0x77, 0xc7, 0xda, 0x19, 0xfb, 0xda, 0xfd, + 0x0b, 0xa2, 0xdb, 0x97, 0xf6, 0x0f, 0xb8, 0x52, 0xa4, 0xfe, 0x23, 0x7d, 0x8c, 0xfa, 0x94, 0xc7, + 0xaa, 0x52, 0xb7, 0x95, 0xef, 0x1b, 0x8f, 0xbc, 0x57, 0xaa, 0xe6, 0xc3, 0x9f, 0x10, 0x42, 0x5f, + 0x60, 0xce, 0xd7, 0xef, 0x77, 0xce, 0x99, 0xb3, 0x3b, 0xb3, 0x06, 0x55, 0xc2, 0xdb, 0x24, 0x89, + 0x82, 0x98, 0xef, 0x91, 0x5e, 0xb4, 0xd7, 0xdb, 0x17, 0xff, 0x76, 0x3b, 0x09, 0xe5, 0x14, 0x5a, + 0x63, 0xdb, 0xae, 0x50, 0xf6, 0xf6, 0xab, 0xe5, 0x16, 0x6d, 0x51, 0x69, 0xdc, 0x13, 0x2b, 0xe5, + 0xe7, 0xfc, 0x3b, 0x0b, 0x96, 0x2f, 0x71, 0x82, 0x23, 0x06, 0xf7, 0x41, 0x8e, 0xf4, 0x22, 0xd7, + 0x27, 0x31, 0x8d, 0x2a, 0x99, 0xed, 0xcc, 0x4e, 0xae, 0x56, 0xbe, 0x4d, 0x6d, 0x6b, 0x80, 0xa3, + 0xf0, 0x7d, 0x67, 0x6c, 0x72, 0x90, 0x49, 0x7a, 0xd1, 0xa9, 0x58, 0xc2, 0x63, 0x00, 0x48, 0x9f, + 0x27, 0xd8, 0x25, 0x41, 0x87, 0x55, 0x8c, 0xed, 0xec, 0x4e, 0xb6, 0xe6, 0x0c, 0x53, 0x3b, 0x57, + 0x17, 0xda, 0xfa, 0xd9, 0x25, 0xbb, 0x4d, 0xed, 0x35, 0x0d, 0x30, 0x76, 0x74, 0x50, 0x4e, 0x0a, + 0xf5, 0xa0, 0xc3, 0xe0, 0xa7, 0xa0, 0xe0, 0xb5, 0x71, 0x10, 0xbb, 0x1e, 0x8d, 0x3f, 0x0b, 0x5a, + 0x95, 0xa5, 0xed, 0xcc, 0x4e, 0xfe, 0xe0, 0x3b, 0xbb, 0xf3, 0xf9, 0xef, 0x9e, 0x08, 0xaf, 0x13, + 0xe9, 0x54, 0x7b, 0xeb, 0xab, 0xd4, 0x5e, 0xb8, 0x4d, 0xed, 0x75, 0x05, 0x3d, 0x0d, 0xe0, 0xa0, + 0xbc, 0x37, 0xf1, 0x84, 0x07, 0x60, 0x03, 0x87, 0x21, 0x7d, 0xe1, 0x76, 0x63, 0x51, 0x30, 0xf1, + 0x38, 0xf1, 0x5d, 0xde, 0x67, 0x95, 0xe5, 0xed, 0xcc, 0x8e, 0x89, 0xd6, 0xa5, 0xf1, 0xe3, 0x89, + 0xed, 0xaa, 0xcf, 0xe0, 0xbb, 0x00, 0x62, 0x8f, 0x07, 0x3d, 0xe2, 0x76, 0x12, 0xe2, 0xd1, 0xa8, + 0x13, 0x84, 0x84, 0x55, 0x56, 0xb6, 0xb3, 0x3b, 0x39, 0xb4, 0xa6, 0x2c, 0x97, 0x13, 0x03, 0x3c, + 0x00, 0x05, 0xd1, 0x1c, 0xaf, 0x8d, 0xe3, 0x98, 0x84, 0xac, 0x62, 0x0a, 0xc7, 0x5a, 0x69, 0x98, + 0xda, 0xf9, 0xfa, 0x6f, 0x9f, 0x9d, 0x68, 0x35, 0xca, 0x93, 0x5e, 0x34, 0x12, 0xe0, 0xa7, 0xa0, + 0x88, 0x3d, 0x8f, 0x30, 0x26, 0xb2, 0xe6, 0x09, 0x0d, 0x2b, 0x39, 0x59, 0xb7, 0x7d, 0xb7, 0xee, + 0x63, 0xe9, 0x77, 0xa2, 0xdc, 0x6a, 0x1b, 0xa2, 0xf2, 0x61, 0x6a, 0xaf, 0xce, 0xa8, 0xd1, 0x2a, + 0x9e, 0x16, 0xcf, 0x0d, 0x73, 0xd1, 0xca, 0x9e, 0x1b, 0x66, 0xd6, 0x32, 0x9c, 0xbf, 0x64, 0xc0, + 0xac, 0x33, 0x3c, 0x06, 0xcb, 0x5e, 0x42, 0x30, 0x27, 0x72, 0x97, 0xf3, 0x07, 0xdf, 0xfb, 0x16, + 0xd2, 0xab, 0x41, 0x87, 0xd4, 0x0c, 0x41, 0x8c, 0x74, 0x20, 0xfc, 0x19, 0x30, 0x3c, 0x1c, 0x86, + 0x95, 0xc5, 0xff, 0x17, 0x40, 0x86, 0x39, 0xff, 0xca, 0x80, 0xb5, 0x3b, 0x1e, 0xd0, 0x03, 0x79, + 0xdd, 0x14, 0x3e, 0xe8, 0xa8, 0xe4, 0x8a, 0x07, 0x6f, 0x7f, 0x13, 0xb6, 0x04, 0xfd, 0xfe, 0x30, + 0xb5, 0xc1, 0x44, 0xbe, 0x4d, 0x6d, 0xa8, 0x46, 0x62, 0x0a, 0xc8, 0x41, 0x00, 0x8f, 0x3d, 0xa0, + 0x07, 0xd6, 0x67, 0x3b, 0xef, 0x86, 0x01, 0xe3, 0x95, 0x45, 0xb9, 0x69, 0x4f, 0x87, 0xa9, 0x3d, + 0x9b, 0xd8, 0x45, 0xc0, 0xf8, 0x6d, 0x6a, 0x57, 0x67, 0x50, 0xa7, 0x23, 0x1d, 0x31, 0x12, 0x73, + 0x01, 0xce, 0x7f, 0x8b, 0x20, 0x3f, 0x35, 0xaf, 0xf0, 0x0f, 0xa0, 0xd4, 0xa6, 0x11, 0x61, 0x9c, + 0x60, 0xdf, 0x6d, 0x86, 0xd4, 0xbb, 0xd6, 0x0f, 0xd8, 0xd3, 0x7f, 0xa6, 0xf6, 0x86, 0x47, 0x59, + 0x44, 0x19, 0xf3, 0xaf, 0x77, 0x03, 0xba, 0x17, 0x61, 0xde, 0xde, 0x3d, 0x8b, 0x05, 0xe9, 0xa6, + 0x22, 0x9d, 0x8b, 0x74, 0x50, 0x71, 0xac, 0xa9, 0x09, 0x05, 0x6c, 0x83, 0xa2, 0x8f, 0xa9, 0xfb, + 0x19, 0x4d, 0xae, 0x35, 0xf8, 0xa2, 0x04, 0xaf, 0x7d, 0x23, 0xf8, 0x30, 0xb5, 0x0b, 0xa7, 0xc7, + 0x1f, 0x7d, 0x48, 0x93, 0x6b, 0x09, 0x71, 0x9b, 0xda, 0x1b, 0x8a, 0x6c, 0x16, 0xc8, 0x41, 0x05, + 0x1f, 0xd3, 0xb1, 0x1b, 0xfc, 0x1d, 0xb0, 0xc6, 0x0e, 0xac, 0xdb, 0xe9, 0xd0, 0x84, 0x57, 0xb2, + 0xe2, 0x41, 0xaa, 0xbd, 0x3b, 0x4c, 0xed, 0xa2, 0x86, 0x6c, 0x28, 0xcb, 0x6d, 0x6a, 0xbf, 0x31, + 0x07, 0xaa, 0x63, 0x1c, 0x54, 0xd4, 0xb0, 0xda, 0x15, 0x36, 0x41, 0x81, 0x04, 0x9d, 0xfd, 0xc3, + 0x27, 0xba, 0x00, 0x43, 0x16, 0xf0, 0x8b, 0x87, 0x0a, 0xc8, 0xd7, 0xcf, 0x2e, 0xf7, 0x0f, 0x9f, + 0x8c, 0xf2, 0xd7, 0xaf, 0x82, 0x69, 0x14, 0x07, 0xe5, 0x95, 0xa8, 0x92, 0x3f, 0x03, 0x5a, 0x74, + 0xdb, 0x98, 0xb5, 0xe5, 0x8b, 0x26, 0x57, 0xdb, 0x11, 0x03, 0xa4, 0x90, 0x7e, 0x8d, 0x59, 0x7b, + 0xd2, 0xf5, 0xe6, 0xe0, 0x8f, 0x38, 0xe6, 0x41, 0x37, 0x1a, 0x61, 0x01, 0x15, 0x2c, 0xbc, 0xc6, + 0xe9, 0x1e, 0xea, 0x74, 0x97, 0x1f, 0x9b, 0xee, 0xe1, 0x7d, 0xe9, 0x1e, 0xce, 0xa6, 0xab, 0x7c, + 0xc6, 0x1c, 0x47, 0x9a, 0x63, 0xe5, 0xb1, 0x1c, 0x47, 0xf7, 0x71, 0x1c, 0xcd, 0x72, 0x28, 0x1f, + 0x31, 0x97, 0x73, 0x75, 0x56, 0xcc, 0x47, 0xcf, 0xe5, 0x9d, 0x0e, 0x15, 0xc7, 0x1a, 0x85, 0x7e, + 0x0d, 0xca, 0x1e, 0x8d, 0x19, 0x17, 0xba, 0x98, 0x76, 0x42, 0xa2, 0x29, 0x72, 0x92, 0xe2, 0xe8, + 0x21, 0x8a, 0xb7, 0xf4, 0x8b, 0xfd, 0x9e, 0x70, 0x07, 0xad, 0xcf, 0xaa, 0x15, 0x99, 0x0b, 0xac, + 0x0e, 0xe1, 0x24, 0x61, 0xcd, 0x6e, 0xd2, 0xd2, 0x44, 0x40, 0x12, 0xbd, 0xf7, 0x10, 0x91, 0x9e, + 0xd0, 0xf9, 0x50, 0x07, 0x95, 0x26, 0x2a, 0x45, 0xf0, 0x09, 0x28, 0x06, 0x82, 0xb5, 0xd9, 0x0d, + 0x35, 0x7c, 0x5e, 0xc2, 0x1f, 0x3c, 0x04, 0xaf, 0x9f, 0xaa, 0xd9, 0x40, 0x07, 0xad, 0x8e, 0x14, + 0x0a, 0xda, 0x07, 0x30, 0xea, 0x06, 0x89, 0xdb, 0x0a, 0xb1, 0x17, 0x90, 0x44, 0xc3, 0x17, 0x24, + 0xfc, 0x8f, 0x1f, 0x82, 0x7f, 0x53, 0xc1, 0xdf, 0x0d, 0x76, 0x90, 0x25, 0x94, 0xbf, 0x52, 0x3a, + 0xc5, 0xd2, 0x00, 0x85, 0x26, 0x49, 0xc2, 0x20, 0xd6, 0xf8, 0xab, 0x12, 0xff, 0xc9, 0x43, 0xf8, + 0x7a, 0x82, 0xa6, 0xc3, 0x1c, 0x94, 0x57, 0xe2, 0x18, 0x34, 0xa4, 0xb1, 0x4f, 0x47, 0xa0, 0x6b, + 0x8f, 0x06, 0x9d, 0x0e, 0x73, 0x50, 0x5e, 0x89, 0x0a, 0xb4, 0x05, 0xd6, 0x71, 0x92, 0xd0, 0x17, + 0x73, 0x0d, 0x81, 0x12, 0xfb, 0x27, 0x0f, 0x61, 0x8f, 0xde, 0xd3, 0x77, 0xa3, 0xc5, 0x7b, 0x5a, + 0x68, 0x67, 0x5a, 0xe2, 0x03, 0xd8, 0x4a, 0xf0, 0x60, 0x8e, 0xa7, 0xfc, 0xe8, 0xc6, 0xdf, 0x0d, + 0x76, 0x90, 0x25, 0x94, 0x33, 0x2c, 0x9f, 0x83, 0x72, 0x44, 0x92, 0x16, 0x71, 0x63, 0xc2, 0x59, + 0x27, 0x0c, 0xb8, 0xe6, 0xd9, 0x78, 0xf4, 0x73, 0x70, 0x5f, 0xb8, 0x83, 0xa0, 0x54, 0x3f, 0xd7, + 0xda, 0xf1, 0x94, 0xb2, 0x36, 0x8e, 0x5b, 0x6d, 0x1c, 0x68, 0x96, 0xcd, 0x47, 0x4f, 0xe9, 0x6c, + 0xa0, 0x83, 0x56, 0x47, 0x8a, 0xf1, 0x56, 0x7b, 0x38, 0xf6, 0xba, 0xa3, 0xad, 0x7e, 0xe3, 0xd1, + 0x5b, 0x3d, 0x1d, 0x26, 0xee, 0x67, 0x52, 0x94, 0xa0, 0xe7, 0x86, 0x59, 0xb4, 0x4a, 0xe7, 0x86, + 0x59, 0xb2, 0xac, 0x73, 0xc3, 0xb4, 0xac, 0xb5, 0x73, 0xc3, 0x5c, 0xb7, 0xca, 0x68, 0x75, 0x40, + 0x43, 0xea, 0xf6, 0x9e, 0xaa, 0x20, 0x94, 0x27, 0x2f, 0x30, 0xd3, 0x2f, 0x1a, 0x54, 0xf4, 0x30, + 0xc7, 0xe1, 0x80, 0xe9, 0x46, 0x20, 0x4b, 0xb5, 0x67, 0xea, 0xd8, 0xda, 0x03, 0x4b, 0x0d, 0x2e, + 0xee, 0x29, 0x16, 0xc8, 0x5e, 0x93, 0x81, 0x3a, 0x6c, 0x91, 0x58, 0xc2, 0x32, 0x58, 0xea, 0xe1, + 0xb0, 0x4b, 0xd4, 0x19, 0x89, 0x94, 0xe0, 0x5c, 0x82, 0xd2, 0x55, 0x82, 0x63, 0x26, 0x6e, 0x77, + 0x34, 0xbe, 0xa0, 0x2d, 0x06, 0x21, 0x30, 0xe4, 0x39, 0xa1, 0x62, 0xe5, 0x1a, 0xfe, 0x10, 0x18, + 0x21, 0x6d, 0x31, 0x79, 0x5b, 0xc8, 0x1f, 0x6c, 0xdc, 0xbd, 0x9a, 0x5c, 0xd0, 0x16, 0x92, 0x2e, + 0xce, 0xdf, 0x17, 0x41, 0xf6, 0x82, 0xb6, 0x60, 0x05, 0xac, 0x60, 0xdf, 0x4f, 0x08, 0x63, 0x1a, + 0x69, 0x24, 0xc2, 0x4d, 0xb0, 0xcc, 0x69, 0x27, 0xf0, 0x14, 0x5c, 0x0e, 0x69, 0x49, 0x10, 0xfb, + 0x98, 0x63, 0x79, 0xb0, 0x16, 0x90, 0x5c, 0x8b, 0x3b, 0xa6, 0xac, 0xcc, 0x8d, 0xbb, 0x51, 0x93, + 0x24, 0xf2, 0x7c, 0x34, 0x6a, 0xa5, 0x9b, 0xd4, 0xce, 0x4b, 0xfd, 0x73, 0xa9, 0x46, 0xd3, 0x02, + 0x7c, 0x07, 0xac, 0xf0, 0xfe, 0xf4, 0x59, 0xb7, 0x7e, 0x93, 0xda, 0x25, 0x3e, 0x29, 0x53, 0x1c, + 0x65, 0x68, 0x99, 0xf7, 0xe5, 0x91, 0xb6, 0x07, 0x4c, 0xde, 0x77, 0x83, 0xd8, 0x27, 0x7d, 0x79, + 0x9c, 0x19, 0xb5, 0xf2, 0x4d, 0x6a, 0x5b, 0x53, 0xee, 0x67, 0xc2, 0x86, 0x56, 0x78, 0x5f, 0x2e, + 0xe0, 0x3b, 0x00, 0xa8, 0x94, 0x24, 0x83, 0x3a, 0x9d, 0x56, 0x6f, 0x52, 0x3b, 0x27, 0xb5, 0x12, + 0x7b, 0xb2, 0x84, 0x0e, 0x58, 0x52, 0xd8, 0xa6, 0xc4, 0x2e, 0xdc, 0xa4, 0xb6, 0x19, 0xd2, 0x96, + 0xc2, 0x54, 0x26, 0xd1, 0xaa, 0x84, 0x44, 0xb4, 0x47, 0x7c, 0x79, 0x44, 0x98, 0x68, 0x24, 0x3a, + 0x7f, 0x5a, 0x04, 0xe6, 0x55, 0x1f, 0x11, 0xd6, 0x0d, 0x39, 0xfc, 0x10, 0x58, 0xf2, 0x02, 0x86, + 0x3d, 0xee, 0xce, 0xb4, 0xb6, 0xf6, 0xd6, 0xe4, 0x85, 0x3e, 0xef, 0xe1, 0xa0, 0xd2, 0x48, 0x75, + 0xac, 0xfb, 0x5f, 0x06, 0x4b, 0xcd, 0x90, 0xd2, 0x48, 0x4e, 0x42, 0x01, 0x29, 0x01, 0x22, 0xd9, + 0x35, 0xb9, 0xcb, 0x59, 0x79, 0xb9, 0xfd, 0xee, 0xdd, 0x5d, 0x9e, 0x1b, 0x95, 0xda, 0xa6, 0xfe, + 0x1c, 0x29, 0x2a, 0x6e, 0x1d, 0xef, 0x88, 0xde, 0xca, 0x51, 0xb2, 0x40, 0x36, 0x21, 0x5c, 0x6e, + 0x5a, 0x01, 0x89, 0x25, 0xac, 0x02, 0x33, 0x21, 0x3d, 0x92, 0x70, 0xe2, 0xcb, 0xcd, 0x31, 0xd1, + 0x58, 0x86, 0x6f, 0x02, 0xb3, 0x85, 0x99, 0xdb, 0x65, 0xc4, 0x57, 0x3b, 0x81, 0x56, 0x5a, 0x98, + 0x7d, 0xcc, 0x88, 0xff, 0xbe, 0xf1, 0xc5, 0x97, 0xf6, 0x82, 0x83, 0x41, 0x5e, 0x5f, 0x79, 0xbb, + 0x9d, 0x90, 0x3c, 0x30, 0x61, 0x07, 0xa0, 0xc0, 0x38, 0x4d, 0x70, 0x8b, 0xb8, 0xd7, 0x64, 0xa0, + 0xe7, 0x4c, 0x4d, 0x8d, 0xd6, 0xff, 0x86, 0x0c, 0x18, 0x9a, 0x16, 0x34, 0xc5, 0x97, 0x06, 0xc8, + 0x5f, 0x25, 0xd8, 0x23, 0xfa, 0x02, 0x2b, 0x66, 0x55, 0x88, 0x89, 0xa6, 0xd0, 0x92, 0xe0, 0xe6, + 0x41, 0x44, 0x68, 0x97, 0xeb, 0xe7, 0x69, 0x24, 0x8a, 0x88, 0x84, 0x90, 0x3e, 0xf1, 0x64, 0x1b, + 0x0d, 0xa4, 0x25, 0x78, 0x08, 0x56, 0xfd, 0x80, 0xe1, 0x66, 0x48, 0x5c, 0xc6, 0xb1, 0x77, 0xad, + 0xca, 0xaf, 0x59, 0x37, 0xa9, 0x5d, 0xd0, 0x86, 0x86, 0xd0, 0xa3, 0x19, 0x09, 0x7e, 0x00, 0x4a, + 0x93, 0x30, 0x99, 0xad, 0xfa, 0x82, 0xab, 0xc1, 0x9b, 0xd4, 0x2e, 0x8e, 0x5d, 0xa5, 0x05, 0xcd, + 0xc9, 0x62, 0xa7, 0x7d, 0xd2, 0xec, 0xb6, 0xe4, 0xf0, 0x99, 0x48, 0x09, 0x42, 0x1b, 0x06, 0x51, + 0xc0, 0xe5, 0xb0, 0x2d, 0x21, 0x25, 0xc0, 0x0f, 0x40, 0x8e, 0xf6, 0x48, 0x92, 0x04, 0x3e, 0x61, + 0xf2, 0x02, 0xf1, 0x6d, 0x1f, 0xa3, 0x68, 0xe2, 0x2f, 0x8a, 0x23, 0xb1, 0x4c, 0x32, 0x22, 0x11, + 0x4d, 0x06, 0xf2, 0x8a, 0xa0, 0x8b, 0x53, 0x86, 0x67, 0x52, 0x8f, 0x66, 0x24, 0x58, 0x03, 0x50, + 0x87, 0x25, 0x84, 0x77, 0x93, 0xd8, 0x95, 0xcf, 0x7f, 0x41, 0xc6, 0xca, 0xa7, 0x50, 0x59, 0x91, + 0x34, 0x9e, 0x62, 0x8e, 0xd1, 0x1d, 0x0d, 0xfc, 0x39, 0x80, 0x6a, 0x4f, 0xdc, 0xcf, 0x19, 0x1d, + 0x7f, 0x4d, 0xab, 0x33, 0x5e, 0xf2, 0x2b, 0xab, 0xce, 0xd9, 0x52, 0xd2, 0x39, 0xa3, 0xba, 0x8a, + 0x73, 0xc3, 0x34, 0xac, 0xa5, 0x73, 0xc3, 0x5c, 0xb1, 0xcc, 0x71, 0xff, 0x74, 0x15, 0x68, 0x7d, + 0x24, 0x4f, 0xa5, 0xf7, 0xa3, 0xbf, 0x65, 0xc0, 0xd4, 0x97, 0x17, 0xfc, 0x29, 0xa8, 0x1e, 0x9f, + 0x9c, 0xd4, 0x1b, 0x0d, 0xf7, 0xea, 0x93, 0xcb, 0xba, 0x7b, 0x59, 0x47, 0xcf, 0xce, 0x1a, 0x8d, + 0xb3, 0x8f, 0x9e, 0x5f, 0xd4, 0x1b, 0x0d, 0x6b, 0xa1, 0xfa, 0xf6, 0xcb, 0x57, 0xdb, 0x95, 0x89, + 0xff, 0xa5, 0xe8, 0x27, 0x63, 0x01, 0x8d, 0x43, 0x31, 0xa9, 0xef, 0x81, 0xcd, 0xe9, 0x68, 0x54, + 0x6f, 0x5c, 0xa1, 0xb3, 0x93, 0xab, 0xfa, 0xa9, 0x95, 0xa9, 0x56, 0x5e, 0xbe, 0xda, 0x2e, 0x4f, + 0x22, 0x11, 0x61, 0x3c, 0x09, 0xc4, 0xb7, 0x3a, 0x3c, 0x02, 0x95, 0xfb, 0x39, 0xeb, 0xa7, 0xd6, + 0x62, 0xb5, 0xfa, 0xf2, 0xd5, 0xf6, 0xe6, 0x7d, 0x8c, 0xc4, 0xaf, 0x1a, 0x5f, 0xfc, 0x75, 0x6b, + 0xa1, 0xf6, 0xcb, 0xaf, 0x86, 0x5b, 0x99, 0xaf, 0x87, 0x5b, 0x99, 0xff, 0x0c, 0xb7, 0x32, 0x7f, + 0x7e, 0xbd, 0xb5, 0xf0, 0xf5, 0xeb, 0xad, 0x85, 0x7f, 0xbc, 0xde, 0x5a, 0xf8, 0xfd, 0x0f, 0x5a, + 0x01, 0x6f, 0x77, 0x9b, 0xbb, 0x1e, 0x8d, 0xf6, 0x48, 0x2f, 0xa2, 0x4c, 0xff, 0xed, 0xed, 0x1f, + 0xed, 0xf5, 0xe5, 0xaf, 0x2d, 0xe2, 0xcb, 0x92, 0x35, 0x97, 0xe5, 0xaf, 0x28, 0x4f, 0xff, 0x17, + 0x00, 0x00, 0xff, 0xff, 0x97, 0xcf, 0xe9, 0x62, 0x8b, 0x11, 0x00, 0x00, } func (m *Params) Marshal() (dAtA []byte, err error) { @@ -835,6 +989,16 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + { + size, err := m.AccessControl.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvm(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x4a if len(m.EVMChannels) > 0 { for iNdEx := len(m.EVMChannels) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.EVMChannels[iNdEx]) @@ -874,44 +1038,24 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x2a if len(m.ExtraEIPs) > 0 { - dAtA3 := make([]byte, len(m.ExtraEIPs)*10) - var j2 int + dAtA4 := make([]byte, len(m.ExtraEIPs)*10) + var j3 int for _, num1 := range m.ExtraEIPs { num := uint64(num1) for num >= 1<<7 { - dAtA3[j2] = uint8(uint64(num)&0x7f | 0x80) + dAtA4[j3] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j2++ + j3++ } - dAtA3[j2] = uint8(num) - j2++ + dAtA4[j3] = uint8(num) + j3++ } - i -= j2 - copy(dAtA[i:], dAtA3[:j2]) - i = encodeVarintEvm(dAtA, i, uint64(j2)) + i -= j3 + copy(dAtA[i:], dAtA4[:j3]) + i = encodeVarintEvm(dAtA, i, uint64(j3)) i-- dAtA[i] = 0x22 } - if m.EnableCall { - i-- - if m.EnableCall { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x18 - } - if m.EnableCreate { - i-- - if m.EnableCreate { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 - } if len(m.EvmDenom) > 0 { i -= len(m.EvmDenom) copy(dAtA[i:], m.EvmDenom) @@ -922,6 +1066,86 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *AccessControl) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AccessControl) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AccessControl) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Call.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvm(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.Create.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvm(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *AccessControlType) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AccessControlType) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AccessControlType) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.AccessControlList) > 0 { + for iNdEx := len(m.AccessControlList) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.AccessControlList[iNdEx]) + copy(dAtA[i:], m.AccessControlList[iNdEx]) + i = encodeVarintEvm(dAtA, i, uint64(len(m.AccessControlList[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if m.AccessType != 0 { + i = encodeVarintEvm(dAtA, i, uint64(m.AccessType)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func (m *ChainConfig) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1589,12 +1813,6 @@ func (m *Params) Size() (n int) { if l > 0 { n += 1 + l + sovEvm(uint64(l)) } - if m.EnableCreate { - n += 2 - } - if m.EnableCall { - n += 2 - } if len(m.ExtraEIPs) > 0 { l = 0 for _, e := range m.ExtraEIPs { @@ -1619,6 +1837,39 @@ func (m *Params) Size() (n int) { n += 1 + l + sovEvm(uint64(l)) } } + l = m.AccessControl.Size() + n += 1 + l + sovEvm(uint64(l)) + return n +} + +func (m *AccessControl) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Create.Size() + n += 1 + l + sovEvm(uint64(l)) + l = m.Call.Size() + n += 1 + l + sovEvm(uint64(l)) + return n +} + +func (m *AccessControlType) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.AccessType != 0 { + n += 1 + sovEvm(uint64(m.AccessType)) + } + if len(m.AccessControlList) > 0 { + for _, s := range m.AccessControlList { + l = len(s) + n += 1 + l + sovEvm(uint64(l)) + } + } return n } @@ -1946,46 +2197,6 @@ func (m *Params) Unmarshal(dAtA []byte) error { } m.EvmDenom = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field EnableCreate", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.EnableCreate = bool(v != 0) - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field EnableCall", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.EnableCall = bool(v != 0) case 4: if wireType == 0 { var v int64 @@ -2179,6 +2390,256 @@ func (m *Params) Unmarshal(dAtA []byte) error { } m.EVMChannels = append(m.EVMChannels, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AccessControl", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.AccessControl.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvm(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvm + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AccessControl) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AccessControl: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AccessControl: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Create", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Create.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Call", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Call.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvm(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvm + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AccessControlType) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AccessControlType: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AccessControlType: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AccessType", wireType) + } + m.AccessType = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.AccessType |= AccessType(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AccessControlList", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AccessControlList = append(m.AccessControlList, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvm(dAtA[iNdEx:]) diff --git a/x/evm/types/params.go b/x/evm/types/params.go index d5e49c4a8c..e406e8f7b9 100644 --- a/x/evm/types/params.go +++ b/x/evm/types/params.go @@ -27,10 +27,6 @@ var ( DefaultEVMDenom = utils.BaseDenom // DefaultAllowUnprotectedTxs rejects all unprotected txs (i.e false) DefaultAllowUnprotectedTxs = false - // DefaultEnableCreate enables contract creation (i.e true) - DefaultEnableCreate = true - // DefaultEnableCall enables contract calls (i.e true) - DefaultEnableCall = true // AvailableEVMExtensions defines the default active precompiles AvailableEVMExtensions = []string{ p256.PrecompileAddress, // P256 precompile @@ -49,28 +45,38 @@ var ( "channel-31", // Cronos "channel-83", // Kava } + DefaultCreateAllowlistAddresses []string + DefaultCallAllowlistAddresses []string + DefaultAccessControl = AccessControl{ + Create: AccessControlType{ + AccessType: AccessTypePermissionless, + AccessControlList: DefaultCreateAllowlistAddresses, + }, + Call: AccessControlType{ + AccessType: AccessTypePermissionless, + AccessControlList: DefaultCreateAllowlistAddresses, + }, + } ) // NewParams creates a new Params instance func NewParams( evmDenom string, - allowUnprotectedTxs, - enableCreate, - enableCall bool, + allowUnprotectedTxs bool, config ChainConfig, extraEIPs []int64, activePrecompiles, evmChannels []string, + accessControl AccessControl, ) Params { return Params{ EvmDenom: evmDenom, AllowUnprotectedTxs: allowUnprotectedTxs, - EnableCreate: enableCreate, - EnableCall: enableCall, ExtraEIPs: extraEIPs, ChainConfig: config, ActivePrecompiles: activePrecompiles, EVMChannels: evmChannels, + AccessControl: accessControl, } } @@ -81,13 +87,12 @@ func NewParams( func DefaultParams() Params { return Params{ EvmDenom: DefaultEVMDenom, - EnableCreate: DefaultEnableCreate, - EnableCall: DefaultEnableCall, ChainConfig: DefaultChainConfig(), ExtraEIPs: DefaultExtraEIPs, AllowUnprotectedTxs: DefaultAllowUnprotectedTxs, ActivePrecompiles: AvailableEVMExtensions, EVMChannels: DefaultEVMChannels, + AccessControl: DefaultAccessControl, } } @@ -119,14 +124,6 @@ func (p Params) Validate() error { return err } - if err := validateBool(p.EnableCall); err != nil { - return err - } - - if err := validateBool(p.EnableCreate); err != nil { - return err - } - if err := validateBool(p.AllowUnprotectedTxs); err != nil { return err } @@ -139,6 +136,10 @@ func (p Params) Validate() error { return err } + if err := p.AccessControl.Validate(); err != nil { + return err + } + return validateChannels(p.EVMChannels) } @@ -182,6 +183,87 @@ func (p Params) IsActivePrecompile(address string) bool { return found } +func (ac AccessControl) Validate() error { + if err := ac.Create.Validate(); err != nil { + return err + } + + if err := ac.Call.Validate(); err != nil { + return err + } + + return nil +} + +func (act AccessControlType) Validate() error { + if err := validateAccessType(act.AccessType); err != nil { + return err + } + + if err := validateAllowlistAddresses(act.AccessControlList); err != nil { + return err + } + return nil +} + +// func validateAccessControl(i interface{}) error { +// permissions, ok := i.(AccessControl) +// if !ok { +// return fmt.Errorf("invalid permissions policy type: %T", i) +// } +// +// if err := validatePermissionType(permissions.Create); err != nil { +// return err +// } +// +// return validatePermissionType(permissions.Call) +// } +// +// func validatePermissionType(i interface{}) error { +// permission, ok := i.(AccessControlType) +// if !ok { +// return fmt.Errorf("invalid permission type: %T", i) +// } +// +// if err := validateAccessType(permission.AccessType); err != nil { +// return err +// } +// +// if err := validateAllowlistAddresses(permission.AccessControlList); err != nil { +// return err +// } +// +// return nil +// } + +func validateAccessType(i interface{}) error { + accessType, ok := i.(AccessType) + if !ok { + return fmt.Errorf("invalid access type type: %T", i) + } + + switch accessType { + case AccessTypePermissionless, AccessTypeRestricted, AccessTypePermissioned: + return nil + default: + return fmt.Errorf("invalid access type: %s", accessType) + } +} + +func validateAllowlistAddresses(i interface{}) error { + addresses, ok := i.([]string) + if !ok { + return fmt.Errorf("invalid whitelist addresses type: %T", i) + } + + for _, address := range addresses { + if err := types.ValidateAddress(address); err != nil { + return fmt.Errorf("invalid whitelist address: %s", address) + } + } + return nil +} + func validateEVMDenom(i interface{}) error { denom, ok := i.(string) if !ok { diff --git a/x/evm/types/params_legacy.go b/x/evm/types/params_legacy.go index 02f94fca0f..4cf1b76747 100644 --- a/x/evm/types/params_legacy.go +++ b/x/evm/types/params_legacy.go @@ -29,8 +29,6 @@ func ParamKeyTable() paramtypes.KeyTable { func (p *Params) ParamSetPairs() paramtypes.ParamSetPairs { return paramtypes.ParamSetPairs{ paramtypes.NewParamSetPair(ParamStoreKeyEVMDenom, &p.EvmDenom, validateEVMDenom), - paramtypes.NewParamSetPair(ParamStoreKeyEnableCreate, &p.EnableCreate, validateBool), - paramtypes.NewParamSetPair(ParamStoreKeyEnableCall, &p.EnableCall, validateBool), paramtypes.NewParamSetPair(ParamStoreKeyExtraEIPs, &p.ExtraEIPs, validateEIPs), paramtypes.NewParamSetPair(ParamStoreKeyChainConfig, &p.ChainConfig, validateChainConfig), paramtypes.NewParamSetPair(ParamStoreKeyAllowUnprotectedTxs, &p.AllowUnprotectedTxs, validateBool), diff --git a/x/evm/types/params_test.go b/x/evm/types/params_test.go index 51236f14a5..67b6edbc16 100644 --- a/x/evm/types/params_test.go +++ b/x/evm/types/params_test.go @@ -25,7 +25,7 @@ func TestParamsValidate(t *testing.T) { }, { name: "valid", - params: NewParams(DefaultEVMDenom, false, true, true, DefaultChainConfig(), extraEips, nil, nil), + params: NewParams(DefaultEVMDenom, false, DefaultChainConfig(), extraEips, nil, nil, DefaultAccessControl), expPass: true, }, { @@ -87,7 +87,7 @@ func TestParamsValidate(t *testing.T) { func TestParamsEIPs(t *testing.T) { extraEips := []int64{2929, 1884, 1344} - params := NewParams("ara", false, true, true, DefaultChainConfig(), extraEips, nil, nil) + params := NewParams("ara", false, DefaultChainConfig(), extraEips, nil, nil, DefaultAccessControl) actual := params.EIPs() require.Equal(t, []int{2929, 1884, 1344}, actual) diff --git a/x/evm/types/permissions.go b/x/evm/types/permissions.go new file mode 100644 index 0000000000..3fffa5c9f7 --- /dev/null +++ b/x/evm/types/permissions.go @@ -0,0 +1,115 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package types + +import ( + "slices" + + "github.com/ethereum/go-ethereum/common" +) + +// PermissionPolicy is the interface that defines the permission policy for contract creation and calls. +// It is used to enforce access control policies on EVM operations. +// The policy is ran BEFORE the respective opcode execution every time they are called. +type PermissionPolicy interface { + // CanCreate checks if the contract creation is allowed. + CanCreate(signer, caller common.Address) bool + // CanCall checks if the any type of CALL opcode execution is allowed. This includes + // contract calls and transfers. + CanCall(signer, caller, recipient common.Address) bool +} + +// RestrictedPermissionPolicy is a permission policy that restricts contract creation and calls based on a set of accessControl. +// Note that all the properties are private, this enforces the permissions not to be modified +// anywhere else within the code. +// For users that require a custom permission policy, they can implement the PermissionPolicy interface. +type RestrictedPermissionPolicy struct { + accessControl *AccessControl + canCreate callerFn + canCall callerFn +} + +func NewRestrictedPermissionPolicy(accessControl *AccessControl, signer common.Address) RestrictedPermissionPolicy { + // generate create function at instantiation for signer address to be check only once + // since it remains constant + canCreate := getCanCreateFn(accessControl, signer) + canCall := getCanCallFn(accessControl, signer) + return RestrictedPermissionPolicy{ + accessControl: accessControl, + canCreate: canCreate, + canCall: canCall, + } +} + +var _ PermissionPolicy = RestrictedPermissionPolicy{} + +// CanCreate implements the PermissionPolicy interface. +// It allows contract creation if access type is set to everybody. +// Otherwise, it checks if: +// - The signer is allowed to do so. +// - If the signer is not allowed, then we check if the caller is allowed to do so. +func (p RestrictedPermissionPolicy) CanCreate(_, caller common.Address) bool { + return p.canCreate(caller) +} + +type callerFn = func(caller common.Address) bool + +func getCanCreateFn(accessControl *AccessControl, signer common.Address) callerFn { + addresses := accessControl.Create.AccessControlList + + switch accessControl.Create.AccessType { + case AccessTypePermissionless: + return permissionlessCheckFn(addresses, signer) + case AccessTypeRestricted: + return func(_ common.Address) bool { return false } + case AccessTypePermissioned: + return permissionedCheckFn(addresses, signer) + } + return func(_ common.Address) bool { return false } +} + +// CanCreate implements the PermissionPolicy interface. +// It allows calls if access type is set to everybody. +// Otherwise, it checks if: +// - The signer is allowed to do so. +// - If the signer is not allowed, then we check if the caller is allowed to do so. +func (p RestrictedPermissionPolicy) CanCall(_, caller, _ common.Address) bool { + return p.canCall(caller) +} + +func getCanCallFn(accessControl *AccessControl, signer common.Address) callerFn { + addresses := accessControl.Call.AccessControlList + + switch accessControl.Call.AccessType { + case AccessTypePermissionless: + return permissionlessCheckFn(addresses, signer) + case AccessTypeRestricted: + return func(_ common.Address) bool { return false } + case AccessTypePermissioned: + return permissionedCheckFn(addresses, signer) + } + return func(_ common.Address) bool { return false } +} + +// permissionlessCheckFn returns a callerFn that returns true unless the signer or the caller is +// within the addresses slice. +func permissionlessCheckFn(addresses []string, signer common.Address) callerFn { + strSigner := signer.String() + isSignerBlocked := !slices.Contains(addresses, strSigner) + return func(caller common.Address) bool { + strCaller := caller.String() + return isSignerBlocked && !slices.Contains(addresses, strCaller) + } +} + +// permissionedCheckFn returns a callerFn that returns true if the signer or caller +// is within the addresses slice. +func permissionedCheckFn(addresses []string, signer common.Address) callerFn { + strSigner := signer.String() + isSignerAllowed := slices.Contains(addresses, strSigner) + return func(caller common.Address) bool { + strCaller := caller.String() + return isSignerAllowed || slices.Contains(addresses, strCaller) + } +} diff --git a/x/evm/types/permissions_test.go b/x/evm/types/permissions_test.go new file mode 100644 index 0000000000..53163732e5 --- /dev/null +++ b/x/evm/types/permissions_test.go @@ -0,0 +1,233 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package types_test + +import ( + "testing" + + "github.com/ethereum/go-ethereum/common" + testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v18/x/evm/types" + "github.com/stretchr/testify/suite" +) + +type UnitTestSuite struct { + suite.Suite +} + +func TestPermissionsSuite(t *testing.T) { + suite.Run(t, new(UnitTestSuite)) +} + +func (suite *UnitTestSuite) TestAccessControl() { + keyring := testkeyring.New(2) + + testCases := []struct { + name string + getAccessControl func() types.AccessControl + canCall bool + canCreate bool + signer common.Address + caller common.Address + recipient common.Address + }{ + { + name: "should allow call and create with default accessControl", + getAccessControl: func() types.AccessControl { + return types.DefaultParams().AccessControl + }, + canCall: true, + canCreate: true, + signer: keyring.GetAddr(0), + caller: keyring.GetAddr(0), + recipient: keyring.GetAddr(0), + }, + { + name: "should not allow call and create with nobody accessControl", + getAccessControl: func() types.AccessControl { + p := types.DefaultParams().AccessControl + p.Create.AccessType = types.AccessTypeRestricted + p.Call.AccessType = types.AccessTypeRestricted + return p + }, + canCall: false, + canCreate: false, + signer: keyring.GetAddr(0), + caller: keyring.GetAddr(0), + recipient: keyring.GetAddr(0), + }, + { + name: "should not allow call with permissionless policy and signer in AccessControlList", + getAccessControl: func() types.AccessControl { + p := types.DefaultParams().AccessControl + p.Call.AccessType = types.AccessTypePermissionless + p.Call.AccessControlList = []string{keyring.GetAddr(0).String()} + return p + }, + canCall: false, + canCreate: true, + signer: keyring.GetAddr(0), + caller: keyring.GetAddr(1), + recipient: keyring.GetAddr(1), + }, + { + name: "should not allow call with permissionless policy and signer not in AccessControlList", + getAccessControl: func() types.AccessControl { + p := types.DefaultParams().AccessControl + p.Call.AccessType = types.AccessTypePermissionless + p.Call.AccessControlList = []string{keyring.GetAddr(0).String()} + return p + }, + canCall: false, + canCreate: true, + signer: keyring.GetAddr(1), + caller: keyring.GetAddr(0), + recipient: keyring.GetAddr(1), + }, + { + name: "should allow call with permissionless policy while caller nor signer are in AccessControlList", + getAccessControl: func() types.AccessControl { + p := types.DefaultParams().AccessControl + p.Call.AccessType = types.AccessTypePermissionless + p.Call.AccessControlList = []string{keyring.GetAddr(0).String()} + return p + }, + canCall: true, + canCreate: true, + signer: keyring.GetAddr(1), + caller: keyring.GetAddr(1), + recipient: keyring.GetAddr(1), + }, + { + name: "should allow call with permissionless policy and caller not in AccessControlList", + getAccessControl: func() types.AccessControl { + p := types.DefaultParams().AccessControl + p.Call.AccessType = types.AccessTypePermissionless + p.Call.AccessControlList = []string{keyring.GetAddr(1).String()} + return p + }, + canCall: false, + canCreate: true, + signer: keyring.GetAddr(1), + caller: keyring.GetAddr(0), + recipient: keyring.GetAddr(1), + }, + { + name: "should not allow create with permissionless policy and signer in AccessControlList", + getAccessControl: func() types.AccessControl { + p := types.DefaultParams().AccessControl + p.Create.AccessType = types.AccessTypePermissionless + p.Create.AccessControlList = []string{keyring.GetAddr(0).String()} + return p + }, + canCall: true, + canCreate: false, + signer: keyring.GetAddr(0), + caller: keyring.GetAddr(1), + recipient: keyring.GetAddr(1), + }, + { + name: "should not allow create with permissionless policy and signer not in AccessControlList", + getAccessControl: func() types.AccessControl { + p := types.DefaultParams().AccessControl + p.Create.AccessType = types.AccessTypePermissionless + p.Create.AccessControlList = []string{keyring.GetAddr(0).String()} + return p + }, + canCall: true, + canCreate: false, + signer: keyring.GetAddr(1), + caller: keyring.GetAddr(0), + recipient: keyring.GetAddr(1), + }, + { + name: "should allow create with permissionless policy while caller nor signer are in AccessControlList", + getAccessControl: func() types.AccessControl { + p := types.DefaultParams().AccessControl + p.Create.AccessType = types.AccessTypePermissionless + p.Create.AccessControlList = []string{keyring.GetAddr(0).String()} + return p + }, + canCall: true, + canCreate: true, + signer: keyring.GetAddr(1), + caller: keyring.GetAddr(1), + recipient: keyring.GetAddr(1), + }, + { + name: "should allow create with permissionless policy and caller not in AccessControlList", + getAccessControl: func() types.AccessControl { + p := types.DefaultParams().AccessControl + p.Create.AccessType = types.AccessTypePermissionless + p.Create.AccessControlList = []string{keyring.GetAddr(1).String()} + return p + }, + canCall: true, + canCreate: false, + signer: keyring.GetAddr(1), + caller: keyring.GetAddr(0), + recipient: keyring.GetAddr(1), + }, + { + name: "should not allow call with permissioned policy and not in AccessControlList", + getAccessControl: func() types.AccessControl { + p := types.DefaultParams().AccessControl + p.Call.AccessType = types.AccessTypePermissioned + p.Call.AccessControlList = []string{keyring.GetAddr(1).String()} + return p + }, + canCall: false, + canCreate: true, + signer: keyring.GetAddr(0), + caller: keyring.GetAddr(0), + recipient: keyring.GetAddr(0), + }, + { + name: "should not allow create with permissioned policy and not in AccessControlList", + getAccessControl: func() types.AccessControl { + p := types.DefaultParams().AccessControl + p.Create.AccessType = types.AccessTypePermissioned + p.Create.AccessControlList = []string{keyring.GetAddr(1).String()} + return p + }, + canCall: true, + canCreate: false, + signer: keyring.GetAddr(0), + caller: keyring.GetAddr(0), + recipient: keyring.GetAddr(0), + }, + { + name: "should allow call and create with permissioned policy and address in AccessControlList", + getAccessControl: func() types.AccessControl { + p := types.DefaultParams().AccessControl + p.Create.AccessType = types.AccessTypePermissioned + p.Create.AccessControlList = []string{keyring.GetAddr(0).String()} + p.Call.AccessType = types.AccessTypePermissioned + p.Call.AccessControlList = []string{keyring.GetAddr(0).String()} + return p + }, + canCall: true, + canCreate: true, + signer: keyring.GetAddr(0), + caller: keyring.GetAddr(0), + recipient: keyring.GetAddr(0), + }, + } + + for _, tc := range testCases { + suite.Run(tc.name, func() { + accessControl := tc.getAccessControl() + permissionPolicy := types.NewRestrictedPermissionPolicy( + &accessControl, + tc.signer, + ) + + canCreate := permissionPolicy.CanCreate(tc.signer, tc.caller) + suite.Require().Equal(tc.canCreate, canCreate, "expected %v, got %v", tc.canCreate, canCreate) + + canCall := permissionPolicy.CanCall(tc.signer, tc.caller, tc.recipient) + suite.Require().Equal(tc.canCall, canCall, "expected %v, got %v", tc.canCall, canCall) + }) + } +} From 663e4cb3cdaa0accd12557ad42d5fc8e9258480f Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Fri, 7 Jun 2024 09:21:42 -0300 Subject: [PATCH 276/345] chore(docker): update docker dep (#2610) update docker dep --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index e0a6ad76bc..9e5daa08b4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -41,7 +41,7 @@ COPY --from=build-env /target/usr/lib /usr/lib COPY --from=build-env /target/usr/local/lib /usr/local/lib COPY --from=build-env /target/usr/include /usr/include -RUN apk add --no-cache ca-certificates=20240226-r0 jq=1.7.1-r0 curl=8.7.1-r0 bash=5.2.26-r0 vim=9.1.0414-r0 lz4=1.9.4-r5 rclone=1.66.0-r2 \ +RUN apk add --no-cache ca-certificates=20240226-r0 jq=1.7.1-r0 curl=8.7.1-r0 bash=5.2.26-r0 vim=9.1.0414-r0 lz4=1.9.4-r5 rclone=1.66.0-r3 \ && addgroup -g 1000 evmos \ && adduser -S -h /home/evmos -D evmos -u 1000 -G evmos From f6576868b0f223fea4941e4000e316d3cb237186 Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Fri, 7 Jun 2024 09:52:26 -0300 Subject: [PATCH 277/345] Revert "chore(erc20): re-add deleted erc20 evm hooks (#2502)" & remove STRv2 tracking logic (#2609) * Revert "chore(erc20): re-add deleted erc20 evm hooks (#2502)" This reverts commit 994f54da651a213a637f6f39ddfc551dfcd30252. * remove strv2 tracking logic * add changelog entry --- CHANGELOG.md | 4 +- app/app.go | 4 +- x/erc20/keeper/evm_hooks.go | 277 -------- x/erc20/keeper/evm_hooks_test.go | 432 ------------ .../keeper/ibc_callbacks_integration_test.go | 61 -- x/erc20/keeper/msg_server.go | 12 - x/erc20/keeper/str_v2.go | 58 -- x/erc20/keeper/str_v2_test.go | 126 ---- x/erc20/strv2/strv2_hooks_test.go | 311 --------- x/erc20/strv2/strv2_integration_test.go | 628 ------------------ x/erc20/strv2/strv2_integration_utils_test.go | 192 ------ x/erc20/types/events.go | 7 - 12 files changed, 3 insertions(+), 2109 deletions(-) delete mode 100644 x/erc20/keeper/evm_hooks.go delete mode 100644 x/erc20/keeper/evm_hooks_test.go delete mode 100644 x/erc20/keeper/str_v2.go delete mode 100644 x/erc20/keeper/str_v2_test.go delete mode 100644 x/erc20/strv2/strv2_hooks_test.go delete mode 100644 x/erc20/strv2/strv2_integration_test.go delete mode 100644 x/erc20/strv2/strv2_integration_utils_test.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 09873bff39..43aed70ddb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -50,12 +50,12 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (revenue) [#2379](https://github.com/evmos/evmos/pull/2379) Remove `x/revenue` module. - (evm) [#2380](https://github.com/evmos/evmos/pull/2380) Remove EVM hooks from app and EVM module. - (evm) [#2501](https://github.com/evmos/evmos/pull/2501) Revert deletion of EVM hooks (#2380). -- (erc20) [#2502](https://github.com/evmos/evmos/pull/2502) Revert deletion of EVM hooks (#2154) (#2442). - (erc20) [#2508](https://github.com/evmos/evmos/pull/2508) Add bookkeping logic in preparation for STRV2 upgrade. - (precompiles) [#2529](https://github.com/evmos/evmos/pull/2529) Remove Outposts precompiles. - (upgrade) [#2533](https://github.com/evmos/evmos/pull/2533) Add upgrade handler for v19. - (staking) [#2051](https://github.com/evmos/evmos/pull/2051) Implement the `EditValidator` function for staking precompiled contract. -- (evm) [2538](https://github.com/evmos/evmos/pull/2538) Add Permissions Policy for permissioned EVM. +- (evm) [#2538](https://github.com/evmos/evmos/pull/2538) Add Permissions Policy for permissioned EVM. +- (erc20) [#2609] (https://github.com/evmos/evmos/pull/2609) Remove STRv2 tracking logic. ### Bug Fixes diff --git a/app/app.go b/app/app.go index 1573c6eb16..64b5441039 100644 --- a/app/app.go +++ b/app/app.go @@ -527,9 +527,7 @@ func NewEvmos( ) app.EvmKeeper = app.EvmKeeper.SetHooks( - evmkeeper.NewMultiEvmHooks( - app.Erc20Keeper.Hooks(), - ), + evmkeeper.NewMultiEvmHooks(), ) // Override the ICS20 app module diff --git a/x/erc20/keeper/evm_hooks.go b/x/erc20/keeper/evm_hooks.go deleted file mode 100644 index 3f9d189e6c..0000000000 --- a/x/erc20/keeper/evm_hooks.go +++ /dev/null @@ -1,277 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package keeper - -import ( - "bytes" - "math/big" - - "cosmossdk.io/math" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" - ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v18/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" - - "github.com/evmos/evmos/v18/contracts" - erc20precompile "github.com/evmos/evmos/v18/precompiles/erc20" - "github.com/evmos/evmos/v18/x/erc20/types" -) - -var _ evmtypes.EvmHooks = Hooks{} - -// Hooks wrapper struct for erc20 keeper -type Hooks struct { - k Keeper -} - -// Return the wrapper struct -func (k Keeper) Hooks() Hooks { - return Hooks{k} -} - -// PostTxProcessing is a wrapper for calling the EVM PostTxProcessing hook on -// the module keeper -func (h Hooks) PostTxProcessing(ctx sdk.Context, msg core.Message, receipt *ethtypes.Receipt) error { - return h.k.PostTxProcessing(ctx, msg, receipt) -} - -// PostTxProcessing implements EvmHooks.PostTxProcessing. The EVM hooks allows -// users to convert ERC20s to Cosmos Coins by sending an Ethereum tx transfer to -// the module account address. This hook applies to both token pairs that have -// been registered through a native Cosmos coin or an ERC20 token. If token pair -// has been registered with: -// - coin -> burn tokens and transfer escrowed coins on module to sender -// - token -> escrow tokens on module account and mint & transfer coins to sender -// -// Note that the PostTxProcessing hook is only called by sending an EVM -// transaction that triggers `ApplyTransaction`. A cosmos tx with a -// `ConvertERC20` msg does not trigger the hook as it only calls `ApplyMessage`. -func (k Keeper) PostTxProcessing( - ctx sdk.Context, - _ core.Message, - receipt *ethtypes.Receipt, -) error { - params := k.GetParams(ctx) - if !params.EnableErc20 || !params.EnableEVMHook { - // no error is returned to avoid reverting the tx and allow for other post - // processing txs to pass and - return nil - } - - erc20 := contracts.ERC20MinterBurnerDecimalsContract.ABI - - for i, log := range receipt.Logs { - // Note: the `Transfer` event contains 3 topics (id, from, to) - // Note: the `Withdraw` and `Deposit` events contains 3 topics (id, from, to) - switch len(log.Topics) { - case 2: - k.PostProcessWithdrawDepositEvent(ctx, receipt, log) - continue - case 3: - k.PostProcessTransferEvent(ctx, receipt, erc20, log, i) - continue - default: - continue - } - } - - return nil -} - -func (k Keeper) PostProcessTransferEvent( - ctx sdk.Context, - receipt *ethtypes.Receipt, - erc20 abi.ABI, - log *ethtypes.Log, - logid int, -) { - // Check if event is included in ERC20 - eventID := log.Topics[0] - event, err := erc20.EventByID(eventID) - if err != nil { - return - } - - // Check if event is a `Transfer` event. - if event.Name != types.ERC20EventTransfer { - k.Logger(ctx).Info("emitted event", "name", event.Name, "signature", event.Sig) - return - } - - transferEvent, err := erc20.Unpack(event.Name, log.Data) - if err != nil { - k.Logger(ctx).Error("failed to unpack transfer event", "error", err.Error()) - return - } - - if len(transferEvent) == 0 { - return - } - - tokens, ok := transferEvent[0].(*big.Int) - // safety check and ignore if amount not positive - if !ok || tokens == nil || tokens.Sign() != 1 { - return - } - - // Check that the contract is a registered token pair - contractAddr := log.Address - - isWevmos := getIsWevmos(ctx, contractAddr) - var pair types.TokenPair - var found bool - if !isWevmos { - id := k.GetERC20Map(ctx, contractAddr) - if len(id) == 0 { - return - } - - pair, found = k.GetTokenPair(ctx, id) - if !found { - return - } - } - - from := common.BytesToAddress(log.Topics[1].Bytes()) - to := common.BytesToAddress(log.Topics[2].Bytes()) - - // Check if tokens are sent to module address - if !bytes.Equal(to.Bytes(), types.ModuleAddress.Bytes()) { - // if tokens are not sent to module address, we want to - // track the interaction of both addresses - // TODO: remove after the STRv2 migration - - // this only applies to native SDK coins and wevmos - if !pair.IsNativeCoin() && !isWevmos { - return - } - - if !k.HasSTRv2Address(ctx, from.Bytes()) { - k.SetSTRv2Address(ctx, from.Bytes()) - } - if !k.HasSTRv2Address(ctx, to.Bytes()) { - k.SetSTRv2Address(ctx, to.Bytes()) - } - - return - } - - // Check that conversion for the pair is enabled. Fail - if !pair.Enabled { - // continue to allow transfers for the ERC20 in case the token pair is - // disabled - k.Logger(ctx).Debug( - "ERC20 token -> Cosmos coin conversion is disabled for pair", - "coin", pair.Denom, "contract", pair.Erc20Address, - ) - return - } - - // create the corresponding sdk.Coin that is paired with ERC20 - coins := sdk.Coins{{Denom: pair.Denom, Amount: math.NewIntFromBigInt(tokens)}} - - // Perform token conversion. We can now assume that the sender of a - // registered token wants to mint a Cosmos coin. - switch pair.ContractOwner { - case types.OWNER_MODULE: - _, err = k.evmKeeper.CallEVM(ctx, erc20, types.ModuleAddress, contractAddr, true, "burn", tokens) - case types.OWNER_EXTERNAL: - err = k.bankKeeper.MintCoins(ctx, types.ModuleName, coins) - default: - err = types.ErrUndefinedOwner - } - - if err != nil { - k.Logger(ctx).Debug( - "failed to process EVM hook for ER20 -> coin conversion", - "coin", pair.Denom, "contract", pair.Erc20Address, "error", err.Error(), - ) - return - } - - // Only need last 20 bytes from log.topics - recipient := sdk.AccAddress(from.Bytes()) - - // transfer the tokens from ModuleAccount to sender address - if err := k.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, recipient, coins); err != nil { - k.Logger(ctx).Debug( - "failed to process EVM hook for ER20 -> coin conversion", - "tx-hash", receipt.TxHash.Hex(), "log-idx", logid, - "coin", pair.Denom, "contract", pair.Erc20Address, "error", err.Error(), - ) - return - } - - // If a sender is converting tokens to coins, we want to track their address too - // - // NOTE: this only applies to native SDK coins and Wevmos - if (pair.IsNativeCoin() || isWevmos) && !k.HasSTRv2Address(ctx, from.Bytes()) { - k.SetSTRv2Address(ctx, from.Bytes()) - } -} - -func (k Keeper) PostProcessWithdrawDepositEvent( - ctx sdk.Context, - _ *ethtypes.Receipt, - log *ethtypes.Log, -) { - wevmos := contracts.WEVMOSContract.ABI - - // Check if event is included in WevmosContract - eventID := log.Topics[0] - event, err := wevmos.EventByID(eventID) - if err != nil { - return - } - - // Check if event is a `Withdrawal` or `Deposit` event. - if event.Name != types.WevmosEventWithdraw && event.Name != types.WevmosEventDeposit { - return - } - - withdrawEvent, err := wevmos.Unpack(event.Name, log.Data) - if err != nil { - return - } - - if len(withdrawEvent) == 0 { - return - } - - tokens, ok := withdrawEvent[0].(*big.Int) - // safety check and ignore if amount not positive - if !ok || tokens == nil || tokens.Sign() != 1 { - return - } - - // Check that the contract is a registered token pair - contractAddr := log.Address - - isWevmos := getIsWevmos(ctx, contractAddr) - if !isWevmos { - return - } - - from := common.BytesToAddress(log.Topics[1].Bytes()) - - if !k.HasSTRv2Address(ctx, from.Bytes()) { - k.SetSTRv2Address(ctx, from.Bytes()) - } -} - -func getIsWevmos(ctx sdk.Context, contractAddr common.Address) bool { - switch { - case utils.IsMainnet(ctx.ChainID()): - return contractAddr.String() == erc20precompile.WEVMOSContractMainnet - case utils.IsTestnet(ctx.ChainID()): - return contractAddr.String() == erc20precompile.WEVMOSContractTestnet - case utils.IsTesting(ctx.ChainID()): - return true - default: - return false - } -} diff --git a/x/erc20/keeper/evm_hooks_test.go b/x/erc20/keeper/evm_hooks_test.go deleted file mode 100644 index 46a8f0ae8d..0000000000 --- a/x/erc20/keeper/evm_hooks_test.go +++ /dev/null @@ -1,432 +0,0 @@ -package keeper_test - -import ( - "fmt" - "math/big" - - "cosmossdk.io/math" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/ethereum/go-ethereum/common" - ethtypes "github.com/ethereum/go-ethereum/core/types" - - "github.com/evmos/evmos/v18/contracts" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/x/erc20/types" -) - -// ensureHooksSet tries to set the hooks on EVMKeeper, this will fail if the erc20 hook is already set -func (suite *KeeperTestSuite) ensureHooksSet() { - // TODO: PR to Ethermint to add the functionality `GetHooks` or `areHooksSet` to avoid catching a panic - defer func() { - err := recover() - suite.Require().NotNil(err) - }() - suite.app.EvmKeeper.SetHooks(suite.app.Erc20Keeper.Hooks()) -} - -func (suite *KeeperTestSuite) TestEvmHooksRegisteredERC20() { - testCases := []struct { - name string - malleate func(common.Address) - result bool - }{ - { - "correct execution", - func(contractAddr common.Address) { - _, err := suite.app.Erc20Keeper.RegisterERC20(suite.ctx, contractAddr) - suite.Require().NoError(err) - - // Mint 10 tokens to suite.address (owner) - _ = suite.MintERC20Token(contractAddr, suite.address, suite.address, big.NewInt(10)) - suite.Commit() - - // Burn the 10 tokens of suite.address (owner) - _ = suite.TransferERC20TokenToModule(contractAddr, suite.address, big.NewInt(10)) - }, - true, - }, - { - "unregistered pair", - func(contractAddr common.Address) { - // Mint 10 tokens to suite.address (owner) - _ = suite.MintERC20Token(contractAddr, suite.address, suite.address, big.NewInt(10)) - suite.Commit() - - // Burn the 10 tokens of suite.address (owner) - _ = suite.TransferERC20TokenToModule(contractAddr, suite.address, big.NewInt(10)) - }, - false, - }, - { - "wrong event", - func(contractAddr common.Address) { - _, err := suite.app.Erc20Keeper.RegisterERC20(suite.ctx, contractAddr) - suite.Require().NoError(err) - - // Mint 10 tokens to suite.address (owner) - _ = suite.MintERC20Token(contractAddr, suite.address, suite.address, big.NewInt(10)) - }, - false, - }, - { - "Pair is disabled", - func(contractAddr common.Address) { - pair, err := suite.app.Erc20Keeper.RegisterERC20(suite.ctx, contractAddr) - suite.Require().NoError(err) - - pair.Enabled = false - suite.app.Erc20Keeper.SetTokenPair(suite.ctx, *pair) - // Mint 10 tokens to suite.address (owner) - _ = suite.MintERC20Token(contractAddr, suite.address, suite.address, big.NewInt(10)) - suite.Commit() - - // Burn the 10 tokens of suite.address (owner) - _ = suite.TransferERC20TokenToModule(contractAddr, suite.address, big.NewInt(10)) - }, - false, - }, - { - "Pair is incorrectly loaded", - func(contractAddr common.Address) { - pair, err := suite.app.Erc20Keeper.RegisterERC20(suite.ctx, contractAddr) - suite.Require().NoError(err) - - suite.app.Erc20Keeper.DeleteTokenPair(suite.ctx, *pair) - - suite.app.Erc20Keeper.SetDenomMap(suite.ctx, pair.Denom, pair.GetID()) - suite.app.Erc20Keeper.SetERC20Map(suite.ctx, pair.GetERC20Contract(), pair.GetID()) - // Mint 10 tokens to suite.address (owner) - _ = suite.MintERC20Token(contractAddr, suite.address, suite.address, big.NewInt(10)) - suite.Commit() - - // Burn the 10 tokens of suite.address (owner) - _ = suite.TransferERC20TokenToModule(contractAddr, suite.address, big.NewInt(10)) - }, - false, - }, - } - for _, tc := range testCases { - suite.Run(fmt.Sprintf("Case %s", tc.name), func() { - suite.mintFeeCollector = true - suite.SetupTest() - - suite.ensureHooksSet() - - contractAddr, err := suite.DeployContract("coin test erc20", "token", erc20Decimals) - suite.Require().NoError(err) - - tc.malleate(contractAddr) - - balance := suite.app.BankKeeper.GetBalance(suite.ctx, sdk.AccAddress(suite.address.Bytes()), types.CreateDenom(contractAddr.String())) - suite.Commit() - if tc.result { - // Check if the execution was successful - suite.Require().Equal(int64(10), balance.Amount.Int64()) - } else { - // Check that no changes were made to the account - suite.Require().Equal(int64(0), balance.Amount.Int64()) - } - }) - } - suite.mintFeeCollector = false -} - -func (suite *KeeperTestSuite) TestEvmHooksRegisteredCoin() { - testCases := []struct { - name string - mint int64 - burn int64 - reconvert int64 - - result bool - }{ - {"correct execution", 100, 10, 5, true}, - } - for _, tc := range testCases { - suite.Run(fmt.Sprintf("Case %s", tc.name), func() { - suite.mintFeeCollector = true - suite.SetupTest() - - suite.ensureHooksSet() - - pair := suite.setupRegisterCoin(metadataCoin) - suite.Require().NotNil(metadataCoin) - suite.Require().NotNil(pair) - - sender := sdk.AccAddress(suite.address.Bytes()) - contractAddr := common.HexToAddress(pair.Erc20Address) - - coins := sdk.NewCoins(sdk.NewCoin(cosmosTokenBase, math.NewInt(tc.mint))) - err := suite.app.BankKeeper.MintCoins(suite.ctx, types.ModuleName, coins) - suite.Require().NoError(err, tc.name) - err = suite.app.BankKeeper.SendCoinsFromModuleToAccount(suite.ctx, types.ModuleName, sender, coins) - suite.Require().NoError(err, tc.name) - - convertCoin := types.NewMsgConvertCoin( - sdk.NewCoin(cosmosTokenBase, math.NewInt(tc.burn)), - suite.address, - sender, - ) - - ctx := sdk.WrapSDKContext(suite.ctx) - _, err = suite.app.Erc20Keeper.ConvertCoin(ctx, convertCoin) - suite.Require().NoError(err, tc.name) - suite.Commit() - - balance := suite.BalanceOf(common.HexToAddress(pair.Erc20Address), suite.address) - cosmosBalance := suite.app.BankKeeper.GetBalance(suite.ctx, sender, metadataCoin.Base) - suite.Require().Equal(cosmosBalance.Amount.Int64(), math.NewInt(tc.mint-tc.burn).Int64()) - suite.Require().Equal(balance, big.NewInt(tc.burn)) - - // Burn the 10 tokens of suite.address (owner) - _ = suite.TransferERC20TokenToModule(contractAddr, suite.address, big.NewInt(tc.reconvert)) - - balance = suite.BalanceOf(common.HexToAddress(pair.Erc20Address), suite.address) - cosmosBalance = suite.app.BankKeeper.GetBalance(suite.ctx, sender, metadataCoin.Base) - - if tc.result { - suite.Require().Equal(balance, big.NewInt(tc.burn-tc.reconvert)) - // Check if the execution was successful - suite.Require().NoError(err) - suite.Require().Equal(cosmosBalance.Amount, math.NewInt(tc.mint-tc.burn+tc.reconvert)) - } else { - // Check that no changes were made to the account - suite.Require().Error(err) - suite.Require().Equal(cosmosBalance.Amount, math.NewInt(tc.mint-tc.burn)) - } - }) - } - suite.mintFeeCollector = false -} - -func (suite *KeeperTestSuite) TestPostTxProcessing() { - var ( - receipt *ethtypes.Receipt - pair *types.TokenPair - ) - - msg := ethtypes.NewMessage( - types.ModuleAddress, - &common.Address{}, - 0, - big.NewInt(0), // amount - uint64(0), // gasLimit - big.NewInt(0), // gasFeeCap - big.NewInt(0), // gasTipCap - big.NewInt(0), // gasPrice - []byte{}, - ethtypes.AccessList{}, // AccessList - true, // checkNonce - ) - - account := utiltx.GenerateAddress() - - transferData := []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - transferData[31] = uint8(10) - - erc20 := contracts.ERC20MinterBurnerDecimalsContract.ABI - - transferEvent := erc20.Events["Transfer"] - - testCases := []struct { - name string - malleate func() - expConversion bool - }{ - { - "Empty logs", - func() { - log := ethtypes.Log{} - receipt = ðtypes.Receipt{ - Logs: []*ethtypes.Log{&log}, - } - }, - false, - }, - { - "No log data", - func() { - topics := []common.Hash{transferEvent.ID, account.Hash(), types.ModuleAddress.Hash()} - log := ethtypes.Log{ - Topics: topics, - } - receipt = ðtypes.Receipt{ - Logs: []*ethtypes.Log{&log}, - } - }, - false, - }, - { - "Non recognized event", - func() { - topics := []common.Hash{{}, account.Hash(), account.Hash()} - log := ethtypes.Log{ - Topics: topics, - Data: transferData, - } - receipt = ðtypes.Receipt{ - Logs: []*ethtypes.Log{&log}, - } - }, - false, - }, - { - "Non transfer event", - func() { - aprovalEvent := erc20.Events["Approval"] - topics := []common.Hash{aprovalEvent.ID, account.Hash(), account.Hash()} - log := ethtypes.Log{ - Topics: topics, - Data: transferData, - } - receipt = ðtypes.Receipt{ - Logs: []*ethtypes.Log{&log}, - } - }, - false, - }, - { - "No log address", - func() { - topics := []common.Hash{transferEvent.ID, account.Hash(), types.ModuleAddress.Hash()} - log := ethtypes.Log{ - Topics: topics, - Data: transferData, - } - receipt = ðtypes.Receipt{ - Logs: []*ethtypes.Log{&log}, - } - }, - false, - }, - { - "No data on topic", - func() { - topics := []common.Hash{transferEvent.ID} - log := ethtypes.Log{ - Topics: topics, - Data: transferData, - } - receipt = ðtypes.Receipt{ - Logs: []*ethtypes.Log{&log}, - } - }, - false, - }, - { - "transfer to non-evm-module account", - func() { - contractAddr, err := suite.DeployContract("coin", "token", erc20Decimals) - suite.Require().NoError(err) - - _, err = suite.app.Erc20Keeper.RegisterERC20(suite.ctx, contractAddr) - suite.Require().NoError(err) - - topics := []common.Hash{transferEvent.ID, account.Hash(), account.Hash()} - log := ethtypes.Log{ - Topics: topics, - Data: transferData, - Address: contractAddr, - } - receipt = ðtypes.Receipt{ - Logs: []*ethtypes.Log{&log}, - } - }, - false, - }, - { - "correct burn", - func() { - contractAddr, err := suite.DeployContract("coin", "token", erc20Decimals) - suite.Require().NoError(err) - - pair, err = suite.app.Erc20Keeper.RegisterERC20(suite.ctx, contractAddr) - suite.Require().NoError(err) - - topics := []common.Hash{transferEvent.ID, account.Hash(), types.ModuleAddress.Hash()} - log := ethtypes.Log{ - Topics: topics, - Data: transferData, - Address: contractAddr, - } - receipt = ðtypes.Receipt{ - Logs: []*ethtypes.Log{&log}, - } - }, - true, - }, - { - "Unspecified Owner", - func() { - contractAddr, err := suite.DeployContract("coin", "token", erc20Decimals) - suite.Require().NoError(err) - - pair, err := suite.app.Erc20Keeper.RegisterERC20(suite.ctx, contractAddr) - suite.Require().NoError(err) - - pair.ContractOwner = types.OWNER_UNSPECIFIED - suite.app.Erc20Keeper.SetTokenPair(suite.ctx, *pair) - - topics := []common.Hash{transferEvent.ID, account.Hash(), types.ModuleAddress.Hash()} - log := ethtypes.Log{ - Topics: topics, - Data: transferData, - Address: contractAddr, - } - receipt = ðtypes.Receipt{ - Logs: []*ethtypes.Log{&log}, - } - }, - false, - }, - { - "Fail Evm", - func() { - contractAddr, err := suite.DeployContract("coin", "token", erc20Decimals) - suite.Require().NoError(err) - - pair, err := suite.app.Erc20Keeper.RegisterERC20(suite.ctx, contractAddr) - suite.Require().NoError(err) - - pair.ContractOwner = types.OWNER_MODULE - suite.app.Erc20Keeper.SetTokenPair(suite.ctx, *pair) - - topics := []common.Hash{transferEvent.ID, account.Hash(), types.ModuleAddress.Hash()} - log := ethtypes.Log{ - Topics: topics, - Data: transferData, - Address: contractAddr, - } - receipt = ðtypes.Receipt{ - Logs: []*ethtypes.Log{&log}, - } - }, - false, - }, - } - for _, tc := range testCases { - suite.Run(fmt.Sprintf("Case %s", tc.name), func() { - suite.mintFeeCollector = true - suite.SetupTest() - suite.ensureHooksSet() - suite.Commit() - - tc.malleate() - - err := suite.app.Erc20Keeper.Hooks().PostTxProcessing(suite.ctx, msg, receipt) - suite.Require().NoError(err) - - if tc.expConversion { - sender := sdk.AccAddress(account.Bytes()) - cosmosBalance := suite.app.BankKeeper.GetBalance(suite.ctx, sender, pair.Denom) - - transferEvent, err := erc20.Unpack("Transfer", transferData) - suite.Require().NoError(err) - - tokens, _ := transferEvent[0].(*big.Int) - suite.Require().Equal(cosmosBalance.Amount.String(), tokens.String()) - } - }) - } - suite.mintFeeCollector = false -} diff --git a/x/erc20/keeper/ibc_callbacks_integration_test.go b/x/erc20/keeper/ibc_callbacks_integration_test.go index a397157cfc..6eb83d9de5 100644 --- a/x/erc20/keeper/ibc_callbacks_integration_test.go +++ b/x/erc20/keeper/ibc_callbacks_integration_test.go @@ -371,67 +371,6 @@ var _ = Describe("Convert receiving IBC to Erc20", Ordered, func() { s.Require().Equal(int64(0), erc20CoinsBalance.Amount.Int64()) }) }) - Describe("strv2 bookkeeping - registered uosmo", func() { - BeforeEach(func() { - erc20params := types.DefaultParams() - erc20params.EnableErc20 = true - err := s.app.Erc20Keeper.SetParams(s.EvmosChain.GetContext(), erc20params) - s.Require().NoError(err) - - sender = s.IBCOsmosisChain.SenderAccount.GetAddress().String() - receiver = s.EvmosChain.SenderAccount.GetAddress().String() - senderAcc = sdk.MustAccAddressFromBech32(sender) - receiverAcc = sdk.MustAccAddressFromBech32(receiver) - - // Register uosmo pair - pair, err = s.app.Erc20Keeper.RegisterCoin(s.EvmosChain.GetContext(), osmoMeta) - s.Require().NoError(err) - }) - It("should register receiver address", func() { - found := s.app.Erc20Keeper.HasSTRv2Address(s.EvmosChain.GetContext(), receiverAcc) - s.Require().False(found) - - s.EvmosChain.Coordinator.CommitBlock() - // Send coins - s.SendAndReceiveMessage(s.pathOsmosisEvmos, s.IBCOsmosisChain, "uosmo", amount, sender, receiver, 1, "") - s.EvmosChain.Coordinator.CommitBlock() - - found = s.app.Erc20Keeper.HasSTRv2Address(s.EvmosChain.GetContext(), receiverAcc) - s.Require().True(found) - - s.SendAndReceiveMessage(s.pathOsmosisEvmos, s.IBCOsmosisChain, "uosmo", amount, sender, receiver, 2, "") - s.EvmosChain.Coordinator.CommitBlock() - - found = s.app.Erc20Keeper.HasSTRv2Address(s.EvmosChain.GetContext(), receiverAcc) - s.Require().True(found) - }) - }) - - Describe("strv2 bookkeeping - unregistered uosmo", func() { - BeforeEach(func() { - erc20params := types.DefaultParams() - erc20params.EnableErc20 = true - err := s.app.Erc20Keeper.SetParams(s.EvmosChain.GetContext(), erc20params) - s.Require().NoError(err) - - sender = s.IBCOsmosisChain.SenderAccount.GetAddress().String() - receiver = s.EvmosChain.SenderAccount.GetAddress().String() - senderAcc = sdk.MustAccAddressFromBech32(sender) - receiverAcc = sdk.MustAccAddressFromBech32(receiver) - }) - It("should not register receiver address", func() { - found := s.app.Erc20Keeper.HasSTRv2Address(s.EvmosChain.GetContext(), receiverAcc) - s.Require().False(found) - - s.EvmosChain.Coordinator.CommitBlock() - // Send coins - s.SendAndReceiveMessage(s.pathOsmosisEvmos, s.IBCOsmosisChain, "uosmo", amount, sender, receiver, 1, "") - s.EvmosChain.Coordinator.CommitBlock() - - found = s.app.Erc20Keeper.HasSTRv2Address(s.EvmosChain.GetContext(), receiverAcc) - s.Require().False(found) - }) - }) }) var _ = Describe("Convert outgoing ERC20 to IBC", Ordered, func() { diff --git a/x/erc20/keeper/msg_server.go b/x/erc20/keeper/msg_server.go index e77665fb64..9902556c95 100644 --- a/x/erc20/keeper/msg_server.go +++ b/x/erc20/keeper/msg_server.go @@ -138,12 +138,6 @@ func (k Keeper) convertCoinNativeCoin( return nil, err } - // Keep track of interactions for STR v2 migration - // TODO: to be removed in 2nd upgrade - if !k.HasSTRv2Address(ctx, receiver.Bytes()) { - k.SetSTRv2Address(ctx, receiver.Bytes()) - } - // Check expected receiver balance after transfer tokens := msg.Coin.Amount.BigInt() balanceTokenAfter := k.BalanceOf(ctx, erc20, contract, receiver) @@ -257,12 +251,6 @@ func (k Keeper) convertERC20NativeCoin( ) } - // Keep track of interactions for STR v2 migration - // TODO: to be removed in 2nd upgrade - if !k.HasSTRv2Address(ctx, receiver) { - k.SetSTRv2Address(ctx, receiver) - } - defer func() { telemetry.IncrCounterWithLabels( []string{"tx", "msg", "convert", "erc20", "total"}, diff --git a/x/erc20/keeper/str_v2.go b/x/erc20/keeper/str_v2.go deleted file mode 100644 index 8bb4748b96..0000000000 --- a/x/erc20/keeper/str_v2.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package keeper - -import ( - "github.com/cosmos/cosmos-sdk/store/prefix" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/x/erc20/types" -) - -// SetSTRv2Address stores an address that will be affected by the -// Single Token Representation v2 migration. -func (k Keeper) SetSTRv2Address(ctx sdk.Context, address sdk.AccAddress) { - store := prefix.NewStore( - ctx.KVStore(k.storeKey), - types.KeyPrefixSTRv2Addresses, - ) - store.Set(address.Bytes(), []byte{}) -} - -// HasSTRv2Address checks if a given address has already been stored as -// affected by the STR v2 migration. -func (k Keeper) HasSTRv2Address(ctx sdk.Context, address sdk.AccAddress) bool { - store := prefix.NewStore( - ctx.KVStore(k.storeKey), - types.KeyPrefixSTRv2Addresses, - ) - return store.Has(address.Bytes()) -} - -// DeleteSTRv2Address removes the entry already stored -// NOTE: for testing purpose only -func (k Keeper) DeleteSTRv2Address(ctx sdk.Context, address sdk.AccAddress) { - store := prefix.NewStore( - ctx.KVStore(k.storeKey), - types.KeyPrefixSTRv2Addresses, - ) - store.Delete(address.Bytes()) -} - -// GetAllSTRV2Address iterates over all the stored accounts that interacted with registered coins. -// and returns them in an array -func (k Keeper) GetAllSTRV2Address(ctx sdk.Context) []sdk.AccAddress { - store := ctx.KVStore(k.storeKey) - iterator := sdk.KVStorePrefixIterator(store, types.KeyPrefixSTRv2Addresses) - defer iterator.Close() - - accAddresses := []sdk.AccAddress{} - - for ; iterator.Valid(); iterator.Next() { - // First byte is the prefix, final bytes is the address - // iterator.Value is empty - address := sdk.AccAddress(iterator.Key()[1:]) - accAddresses = append(accAddresses, address) - } - return accAddresses -} diff --git a/x/erc20/keeper/str_v2_test.go b/x/erc20/keeper/str_v2_test.go deleted file mode 100644 index 4442ead820..0000000000 --- a/x/erc20/keeper/str_v2_test.go +++ /dev/null @@ -1,126 +0,0 @@ -package keeper_test - -import ( - "fmt" - - sdk "github.com/cosmos/cosmos-sdk/types" -) - -func (suite *KeeperTestSuite) TestSetDeleteSTRV2Address() { - address1 := suite.address.Bytes() - address2 := suite.consAddress.Bytes() - - suite.SetupTest() - - // Set the same address twice, and it shouldn't fail - suite.app.Erc20Keeper.SetSTRv2Address(suite.ctx, address1) - suite.Require().Equal(true, suite.app.Erc20Keeper.HasSTRv2Address(suite.ctx, address1)) - suite.app.Erc20Keeper.SetSTRv2Address(suite.ctx, address1) - suite.Require().Equal(true, suite.app.Erc20Keeper.HasSTRv2Address(suite.ctx, address1)) - - // Set a different address and it shouldn't affect the first address - suite.app.Erc20Keeper.SetSTRv2Address(suite.ctx, address2) - suite.Require().Equal(true, suite.app.Erc20Keeper.HasSTRv2Address(suite.ctx, address2)) - suite.app.Erc20Keeper.SetSTRv2Address(suite.ctx, address1) - suite.Require().Equal(true, suite.app.Erc20Keeper.HasSTRv2Address(suite.ctx, address1)) - - // Delete the first address. - // - it should delete the first address - // - it shouldn't affect the second one - suite.app.Erc20Keeper.DeleteSTRv2Address(suite.ctx, address1) - suite.Require().Equal(false, suite.app.Erc20Keeper.HasSTRv2Address(suite.ctx, address1)) - suite.app.Erc20Keeper.DeleteSTRv2Address(suite.ctx, address1) - suite.Require().Equal(false, suite.app.Erc20Keeper.HasSTRv2Address(suite.ctx, address1)) - suite.Require().Equal(true, suite.app.Erc20Keeper.HasSTRv2Address(suite.ctx, address2)) - - // Set the deleted address again - suite.app.Erc20Keeper.SetSTRv2Address(suite.ctx, address1) - suite.Require().Equal(true, suite.app.Erc20Keeper.HasSTRv2Address(suite.ctx, address1)) - suite.Require().Equal(true, suite.app.Erc20Keeper.HasSTRv2Address(suite.ctx, address2)) -} - -func (suite *KeeperTestSuite) TestHasSTRV2Address() { - address1 := suite.address.Bytes() - address2 := suite.consAddress.Bytes() - - testCases := []struct { - name string - malleate func() - expected bool - }{ - { - "space is empty", - func() { - }, - false, - }, - { - "set one address - should have it", - func() { - suite.app.Erc20Keeper.SetSTRv2Address(suite.ctx, address1) - }, - true, - }, - { - "set two addresses - should have the first one", - func() { - suite.app.Erc20Keeper.SetSTRv2Address(suite.ctx, address1) - suite.app.Erc20Keeper.SetSTRv2Address(suite.ctx, address2) - }, - true, - }, - } - for _, tc := range testCases { - suite.Run(fmt.Sprintf("Case %s", tc.name), func() { - suite.SetupTest() // reset - - tc.malleate() - - actual := suite.app.Erc20Keeper.HasSTRv2Address(suite.ctx, address1) - suite.Require().Equal(tc.expected, actual) - }) - } -} - -func (suite *KeeperTestSuite) TestGetAllSTRV2Address() { - address1 := suite.address.Bytes() - address2 := suite.consAddress.Bytes() - - testCases := []struct { - name string - malleate func() - expected []sdk.AccAddress - }{ - { - "space is empty", - func() { - }, - []sdk.AccAddress{}, - }, - { - "set one address - should return it", - func() { - suite.app.Erc20Keeper.SetSTRv2Address(suite.ctx, address1) - }, - []sdk.AccAddress{address1}, - }, - { - "set two addresses - should return both", - func() { - suite.app.Erc20Keeper.SetSTRv2Address(suite.ctx, address1) - suite.app.Erc20Keeper.SetSTRv2Address(suite.ctx, address2) - }, - []sdk.AccAddress{address1, address2}, - }, - } - for _, tc := range testCases { - suite.Run(fmt.Sprintf("Case %s", tc.name), func() { - suite.SetupTest() // reset - - tc.malleate() - - addresses := suite.app.Erc20Keeper.GetAllSTRV2Address(suite.ctx) - suite.Require().ElementsMatch(tc.expected, addresses) - }) - } -} diff --git a/x/erc20/strv2/strv2_hooks_test.go b/x/erc20/strv2/strv2_hooks_test.go deleted file mode 100644 index bc168de292..0000000000 --- a/x/erc20/strv2/strv2_hooks_test.go +++ /dev/null @@ -1,311 +0,0 @@ -package strv2_test - -import ( - "testing" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/contracts" - testfactory "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" - grpchandler "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - "github.com/evmos/evmos/v18/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" - "github.com/stretchr/testify/require" -) - -type STRV2WEVMOSHooksTestSuite struct { - keyring testkeyring.Keyring - network *network.UnitTestNetwork - factory testfactory.TxFactory - - // account is the address of the account to withdraw WEVMOS from. - account common.Address - // wevmosContract is the address of the WEVMOS contract. - wevmosContract common.Address -} - -const ( - - // erc20Deployer is the index for the account that deploys the ERC-20 contract. - erc20Deployer = 0 -) - -// sentWEVMOS is the amount of WEVMOS sent to the WEVMOS contract during testing. -var sentWEVMOS = sdk.NewInt(1e18) - -func TestDepositWEVMOS(t *testing.T) { - t.Parallel() - - senderIdx := 0 - kr := testkeyring.New(1) - - testcases := []struct { - name string - malleate func(suite *STRV2WEVMOSHooksTestSuite) error - expFound bool - errContains string - chainID string - }{ - { - name: "found - deposit WEVMOS", - malleate: func(ts *STRV2WEVMOSHooksTestSuite) error { - // Deploy WEVMOS contract - wevmosAddr, err := ts.factory.DeployContract( - ts.keyring.GetPrivKey(erc20Deployer), - evmtypes.EvmTxArgs{}, - testfactory.ContractDeploymentData{Contract: contracts.WEVMOSContract}, - ) - require.NoError(t, err, "failed to deploy WEVMOS contract") - - ts.account = kr.GetAddr(senderIdx) - ts.wevmosContract = wevmosAddr - - require.False(t, ts.network.App.Erc20Keeper.HasSTRv2Address(ts.network.GetContext(), ts.keyring.GetAccAddr(0))) - - return nil - }, - expFound: true, - chainID: utils.TestingChainID + "-1", - }, - { - name: "found - should not fail if address already there while deposit WEVMOS", - malleate: func(ts *STRV2WEVMOSHooksTestSuite) error { - // Deploy WEVMOS contract - wevmosAddr, err := ts.factory.DeployContract( - ts.keyring.GetPrivKey(erc20Deployer), - evmtypes.EvmTxArgs{}, - testfactory.ContractDeploymentData{Contract: contracts.WEVMOSContract}, - ) - require.NoError(t, err, "failed to deploy WEVMOS contract") - - ts.account = kr.GetAddr(senderIdx) - ts.wevmosContract = wevmosAddr - - ts.network.App.Erc20Keeper.SetSTRv2Address(ts.network.GetContext(), ts.keyring.GetAccAddr(0)) - - return nil - }, - expFound: true, - chainID: utils.TestingChainID + "-1", - }, - { - name: "not found - should not register since its not expected contract", - malleate: func(ts *STRV2WEVMOSHooksTestSuite) error { - // Deploy WEVMOS contract - wevmosAddr, err := ts.factory.DeployContract( - ts.keyring.GetPrivKey(erc20Deployer), - evmtypes.EvmTxArgs{}, - testfactory.ContractDeploymentData{Contract: contracts.WEVMOSContract}, - ) - require.NoError(t, err, "failed to deploy WEVMOS contract") - - ts.account = kr.GetAddr(senderIdx) - ts.wevmosContract = wevmosAddr - - return nil - }, - expFound: false, - chainID: utils.TestnetChainID + "-1", - }, - } - - for _, tc := range testcases { - tc := tc // capture range variable (for parallel testing) - - t.Run(tc.name, func(t *testing.T) { - t.Parallel() - - // Set up a new network - nw := network.NewUnitTestNetwork( - network.WithChainID(tc.chainID), - network.WithPreFundedAccounts(kr.GetAllAccAddrs()...), - ) - handler := grpchandler.NewIntegrationHandler(nw) - txFactory := testfactory.New(nw, handler) - - ts := &STRV2WEVMOSHooksTestSuite{ - keyring: kr, - network: nw, - factory: txFactory, - } - - err := tc.malleate(ts) - require.NoError(t, err, "failed to malleate test suite") - - // Send WEVMOS to account - _, err = ts.factory.ExecuteEthTx( - ts.keyring.GetPrivKey(senderIdx), - evmtypes.EvmTxArgs{ - To: &ts.wevmosContract, - Amount: sentWEVMOS.BigInt(), - // FIXME: the gas simulation is not working correctly - otherwise results in out of gas - GasLimit: 100_000, - }, - ) - require.NoError(t, err, "failed to send WEVMOS to account") - - require.Equal(t, tc.expFound, ts.network.App.Erc20Keeper.HasSTRv2Address(ts.network.GetContext(), ts.keyring.GetAccAddr(0))) - }) - } -} - -func TestWithdrawWEVMOS(t *testing.T) { - t.Parallel() - - senderIdx := 0 - kr := testkeyring.New(1) - - testcases := []struct { - name string - malleate func(suite *STRV2WEVMOSHooksTestSuite) error - expFound bool - errContains string - chainID string - }{ - { - name: "found - withdraw WEVMOS", - malleate: func(ts *STRV2WEVMOSHooksTestSuite) error { - // Deploy WEVMOS contract - wevmosAddr, err := ts.factory.DeployContract( - ts.keyring.GetPrivKey(erc20Deployer), - evmtypes.EvmTxArgs{}, - testfactory.ContractDeploymentData{Contract: contracts.WEVMOSContract}, - ) - require.NoError(t, err, "failed to deploy WEVMOS contract") - - // Send WEVMOS to account - _, err = ts.factory.ExecuteEthTx( - ts.keyring.GetPrivKey(senderIdx), - evmtypes.EvmTxArgs{ - To: &wevmosAddr, - Amount: sentWEVMOS.BigInt(), - // FIXME: the gas simulation is not working correctly - otherwise results in out of gas - GasLimit: 100_000, - }, - ) - require.NoError(t, err, "failed to send WEVMOS to account") - - // Address was added after deposit, delete the entry to test withdraw - require.True(t, ts.network.App.Erc20Keeper.HasSTRv2Address(ts.network.GetContext(), ts.keyring.GetAccAddr(0))) - ts.network.App.Erc20Keeper.DeleteSTRv2Address(ts.network.GetContext(), ts.keyring.GetAccAddr(0)) - require.False(t, ts.network.App.Erc20Keeper.HasSTRv2Address(ts.network.GetContext(), ts.keyring.GetAccAddr(0))) - - ts.account = kr.GetAddr(senderIdx) - ts.wevmosContract = wevmosAddr - - return nil - }, - expFound: true, - chainID: utils.TestingChainID + "-1", - }, - { //nolint:dupl - name: "found - with address already registered - withdraw WEVMOS", - malleate: func(ts *STRV2WEVMOSHooksTestSuite) error { - // Deploy WEVMOS contract - wevmosAddr, err := ts.factory.DeployContract( - ts.keyring.GetPrivKey(erc20Deployer), - evmtypes.EvmTxArgs{}, - testfactory.ContractDeploymentData{Contract: contracts.WEVMOSContract}, - ) - require.NoError(t, err, "failed to deploy WEVMOS contract") - - // Send WEVMOS to account - _, err = ts.factory.ExecuteEthTx( - ts.keyring.GetPrivKey(senderIdx), - evmtypes.EvmTxArgs{ - To: &wevmosAddr, - Amount: sentWEVMOS.BigInt(), - // FIXME: the gas simulation is not working correctly - otherwise results in out of gas - GasLimit: 100_000, - }, - ) - require.NoError(t, err, "failed to send WEVMOS to account") - - require.True(t, ts.network.App.Erc20Keeper.HasSTRv2Address(ts.network.GetContext(), ts.keyring.GetAccAddr(0))) - - ts.account = kr.GetAddr(senderIdx) - ts.wevmosContract = wevmosAddr - - return nil - }, - expFound: true, - chainID: utils.TestingChainID + "-1", - }, - { //nolint:dupl - name: "not found - wrong contract - withdraw WEVMOS", - malleate: func(ts *STRV2WEVMOSHooksTestSuite) error { - // Deploy WEVMOS contract - wevmosAddr, err := ts.factory.DeployContract( - ts.keyring.GetPrivKey(erc20Deployer), - evmtypes.EvmTxArgs{}, - testfactory.ContractDeploymentData{Contract: contracts.WEVMOSContract}, - ) - require.NoError(t, err, "failed to deploy WEVMOS contract") - - // Send WEVMOS to account - _, err = ts.factory.ExecuteEthTx( - ts.keyring.GetPrivKey(senderIdx), - evmtypes.EvmTxArgs{ - To: &wevmosAddr, - Amount: sentWEVMOS.BigInt(), - // FIXME: the gas simulation is not working correctly - otherwise results in out of gas - GasLimit: 100_000, - }, - ) - require.NoError(t, err, "failed to send WEVMOS to account") - - require.True(t, ts.network.App.Erc20Keeper.HasSTRv2Address(ts.network.GetContext(), ts.keyring.GetAccAddr(0))) - - ts.account = kr.GetAddr(senderIdx) - ts.wevmosContract = wevmosAddr - - return nil - }, - expFound: false, - chainID: utils.TestnetChainID + "-1", - }, - } - - for _, tc := range testcases { - tc := tc // capture range variable (for parallel testing) - - t.Run(tc.name, func(t *testing.T) { - t.Parallel() - - // Set up a new network - nw := network.NewUnitTestNetwork( - network.WithChainID(utils.TestingChainID+"-1"), - network.WithPreFundedAccounts(kr.GetAllAccAddrs()...), - ) - handler := grpchandler.NewIntegrationHandler(nw) - txFactory := testfactory.New(nw, handler) - - ts := &STRV2WEVMOSHooksTestSuite{ - keyring: kr, - network: nw, - factory: txFactory, - } - - err := tc.malleate(ts) - require.NoError(t, err, "failed to malleate test suite") - - _, err = ts.factory.ExecuteContractCall( - ts.keyring.GetPrivKey(0), - evmtypes.EvmTxArgs{ - To: &ts.wevmosContract, - }, - testfactory.CallArgs{ - ContractABI: contracts.WEVMOSContract.ABI, - MethodName: "withdraw", - Args: []interface{}{ - transferAmount, - }, - }, - ) - require.NoError(t, err) - require.True(t, ts.network.App.Erc20Keeper.HasSTRv2Address(ts.network.GetContext(), ts.keyring.GetAccAddr(0))) - }) - } -} diff --git a/x/erc20/strv2/strv2_integration_test.go b/x/erc20/strv2/strv2_integration_test.go deleted file mode 100644 index 1df53a797d..0000000000 --- a/x/erc20/strv2/strv2_integration_test.go +++ /dev/null @@ -1,628 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package strv2_test - -import ( - "math/big" - "testing" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/contracts" - commonfactory "github.com/evmos/evmos/v18/testutil/integration/common/factory" - testfactory "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" - testnetwork "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - "github.com/evmos/evmos/v18/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" - - "github.com/evmos/evmos/v18/x/erc20/keeper/testdata" - erc20types "github.com/evmos/evmos/v18/x/erc20/types" - - . "github.com/onsi/ginkgo/v2" //nolint:revive - . "github.com/onsi/gomega" //nolint:revive -) - -func TestSTRv2Tracking(t *testing.T) { - // Run Ginkgo BDD tests - RegisterFailHandler(Fail) - RunSpecs(t, "STRv2 Tracking Tests") -} - -type STRv2TrackingSuite struct { - keyring testkeyring.Keyring - network *testnetwork.UnitTestNetwork - handler grpc.Handler - factory testfactory.TxFactory - - nativeCoinERC20Addr common.Address - registeredERC20Addr common.Address - unregisteredERC20Addr common.Address - wevmosAddr common.Address -} - -const ( - deployerIdx = 0 - nativeIBCCoinDenom = "coin" -) - -var ( - mintAmount = big.NewInt(1000000000000000000) - convertAmount = testnetwork.PrefundedAccountInitialBalance.QuoRaw(10) - transferAmount = convertAmount.QuoRaw(10).BigInt() -) - -var _ = Describe("STRv2 Tracking -", func() { - var s *STRv2TrackingSuite - - BeforeEach(func() { - var err error - s, err = CreateTestSuite(utils.MainnetChainID + "-1") - Expect(err).ToNot(HaveOccurred(), "failed to create test suite") - - // NOTE: this is necessary to enable e.g. erc20Keeper.BalanceOf(...) to work - // correctly internally. - // Removing it will break a bunch of tests giving errors like: "failed to retrieve balance" - Expect(s.network.NextBlock()).To(BeNil(), "failed to advance block") - }) - - When("sending an EVM transaction", func() { - Context("which interacts with a registered native token pair ERC-20 contract", func() { - Context("in a direct call to the token pair contract", func() { - It("should add the from and to addresses to the store if it is not already stored", func() { //nolint:all - sender := s.keyring.GetKey(0) - receiver := s.keyring.GetKey(2) - - senderAddrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) - Expect(senderAddrTracked).To(BeFalse(), "expected address not to be stored before conversion") - receiverAddrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), receiver.AccAddr) - Expect(receiverAddrTracked).To(BeFalse(), "expected address not to be stored before conversion") - - _, err := s.factory.ExecuteContractCall( - sender.Priv, - evmtypes.EvmTxArgs{ - To: &s.nativeCoinERC20Addr, - }, - testfactory.CallArgs{ - ContractABI: contracts.ERC20MinterBurnerDecimalsContract.ABI, - MethodName: "transfer", - Args: []interface{}{ - receiver.Addr, - transferAmount, - }, - }, - ) - Expect(err).ToNot(HaveOccurred(), "failed to transfer tokens of Cosmos native ERC-20 token pair") - - Expect(s.network.NextBlock()).To(BeNil(), "failed to advance block") - - senderAddrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) - Expect(senderAddrTracked).To(BeTrue(), "expected address to be stored") - receiverAddrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) - Expect(receiverAddrTracked).To(BeTrue(), "expected address to be stored") - }) - - It("should not fail if the addresses are already stored", func() { - sender := s.keyring.GetKey(0) - receiver := s.keyring.GetKey(2) - - senderAddrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) - Expect(senderAddrTracked).To(BeFalse(), "expected address not to be stored before conversion") - receiverAddrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), receiver.AccAddr) - Expect(receiverAddrTracked).To(BeFalse(), "expected address not to be stored before conversion") - - _, err := s.factory.ExecuteContractCall( - sender.Priv, - evmtypes.EvmTxArgs{ - To: &s.nativeCoinERC20Addr, - }, - testfactory.CallArgs{ - ContractABI: contracts.ERC20MinterBurnerDecimalsContract.ABI, - MethodName: "transfer", - Args: []interface{}{ - receiver.Addr, - transferAmount, - }, - }, - ) - Expect(err).ToNot(HaveOccurred(), "failed to transfer tokens of Cosmos native ERC-20 token pair") - - Expect(s.network.NextBlock()).To(BeNil(), "failed to advance block") - - _, err = s.factory.ExecuteContractCall( - sender.Priv, - evmtypes.EvmTxArgs{ - To: &s.nativeCoinERC20Addr, - }, - testfactory.CallArgs{ - ContractABI: contracts.ERC20MinterBurnerDecimalsContract.ABI, - MethodName: "transfer", - Args: []interface{}{ - receiver.Addr, - transferAmount, - }, - }, - ) - Expect(err).ToNot(HaveOccurred(), "failed to transfer tokens of Cosmos native ERC-20 token pair (2nd call)") - - Expect(s.network.NextBlock()).To(BeNil(), "failed to advance block") - - senderAddrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) - Expect(senderAddrTracked).To(BeTrue(), "expected address to be still stored") - receiverAddrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), receiver.AccAddr) - Expect(receiverAddrTracked).To(BeTrue(), "expected address to be still stored") - }) - It("should not store anything if calling a different method than transfer or transferFrom", func() { //nolint:all - sender := s.keyring.GetKey(0) - grantee := s.keyring.GetKey(2) - - senderAddrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) - Expect(senderAddrTracked).To(BeFalse(), "expected address not to be stored before conversion") - receiverAddrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), grantee.AccAddr) - Expect(receiverAddrTracked).To(BeFalse(), "expected address not to be stored before conversion") - - _, err := s.factory.ExecuteContractCall( - sender.Priv, - evmtypes.EvmTxArgs{ - To: &s.nativeCoinERC20Addr, - }, - testfactory.CallArgs{ - ContractABI: contracts.ERC20MinterBurnerDecimalsContract.ABI, - MethodName: "approve", - Args: []interface{}{ - grantee.Addr, - transferAmount, - }, - }, - ) - Expect(err).ToNot(HaveOccurred(), "failed to approve ERC-20 transfer") - - Expect(s.network.NextBlock()).To(BeNil(), "failed to advance block") - - senderAddrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) - Expect(senderAddrTracked).To(BeFalse(), "expected address not to be stored") - receiverAddrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), grantee.AccAddr) - Expect(receiverAddrTracked).To(BeFalse(), "expected address not to be stored") - }) - }) - - Context("in a call to the token pair contract from another contract", func() { - var ( - senderIdx = deployerIdx - tokenTransferAddr common.Address - ) - - BeforeEach(func() { - deployer := s.keyring.GetKey(deployerIdx) - sender := s.keyring.GetKey(senderIdx) - - var err error - tokenTransferAddr, err = s.factory.DeployContract( - deployer.Priv, - evmtypes.EvmTxArgs{}, - testfactory.ContractDeploymentData{ - Contract: testdata.TokenTransferContract, - ConstructorArgs: []interface{}{s.nativeCoinERC20Addr}, - }, - ) - Expect(err).ToNot(HaveOccurred(), "failed to deploy ERC-20 transfer contract") - - Expect(s.network.NextBlock()).To(BeNil(), "failed to advance block") - - // approve the contract to spend on behalf of the sender - _, err = s.factory.ExecuteContractCall( - sender.Priv, - evmtypes.EvmTxArgs{ - To: &s.nativeCoinERC20Addr, - }, - testfactory.CallArgs{ - ContractABI: contracts.ERC20MinterBurnerDecimalsContract.ABI, - MethodName: "approve", - Args: []interface{}{ - tokenTransferAddr, - transferAmount, - }, - }, - ) - Expect(err).ToNot(HaveOccurred(), "failed to approve ERC-20 transfer contract to spend on behalf of the sender") - - Expect(s.network.NextBlock()).To(BeNil(), "failed to advance block") - }) - - It("should add the from AND to address to the store if it is not already stored", func() { - sender := s.keyring.GetKey(senderIdx) - receiver := s.keyring.GetKey(senderIdx + 1) - - senderAddrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) - Expect(senderAddrTracked).To(BeFalse(), "expected address not to be stored before conversion") - receiverAddrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), receiver.AccAddr) - Expect(receiverAddrTracked).To(BeFalse(), "expected address not to be stored before conversion") - - _, err := s.factory.ExecuteContractCall( - sender.Priv, - evmtypes.EvmTxArgs{ - To: &tokenTransferAddr, - }, - testfactory.CallArgs{ - ContractABI: testdata.TokenTransferContract.ABI, - MethodName: "transferToken", - Args: []interface{}{ - receiver.Addr, - transferAmount, - }, - }, - ) - Expect(err).ToNot(HaveOccurred(), "failed to transfer tokens of Cosmos native ERC-20 token pair") - - Expect(s.network.NextBlock()).To(BeNil(), "failed to advance block") - - senderAddrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) - Expect(senderAddrTracked).To(BeTrue(), "expected address to be stored") - receiverAddrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), receiver.AccAddr) - Expect(receiverAddrTracked).To(BeTrue(), "expected address to be stored") - }) - - It("should add the from address if sending to the ERC-20 module address", func() { - sender := s.keyring.GetKey(senderIdx) - - senderAddrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) - Expect(senderAddrTracked).To(BeFalse(), "expected address not to be stored before conversion") - - _, err := s.factory.ExecuteContractCall( - sender.Priv, - evmtypes.EvmTxArgs{ - To: &tokenTransferAddr, - }, - testfactory.CallArgs{ - ContractABI: testdata.TokenTransferContract.ABI, - MethodName: "transferToken", - Args: []interface{}{ - erc20types.ModuleAddress, - transferAmount, - }, - }, - ) - Expect(err).ToNot(HaveOccurred(), "failed to transfer tokens of Cosmos native ERC-20 token pair") - - Expect(s.network.NextBlock()).To(BeNil(), "failed to advance block") - - senderAddrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) - Expect(senderAddrTracked).To(BeTrue(), "expected address to be stored") - }) - }) - - // NOTE: this is running the coin conversion too - Context("sending tokens to the module address", func() { - It("should add the sender address in a direct call", func() { - sender := s.keyring.GetKey(0) - - senderAddrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) - Expect(senderAddrTracked).To(BeFalse(), "expected address not to be stored before conversion") - - _, err := s.factory.ExecuteContractCall( - sender.Priv, - evmtypes.EvmTxArgs{ - To: &s.nativeCoinERC20Addr, - }, - testfactory.CallArgs{ - ContractABI: contracts.ERC20MinterBurnerDecimalsContract.ABI, - MethodName: "transfer", - Args: []interface{}{ - erc20types.ModuleAddress, - transferAmount, - }, - }, - ) - Expect(err).ToNot(HaveOccurred(), "failed to transfer tokens of Cosmos native ERC-20 token pair") - - Expect(s.network.NextBlock()).To(BeNil(), "failed to advance block") - - senderAddrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) - Expect(senderAddrTracked).To(BeTrue(), "expected address to be stored") - erc20AddrTrack := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), erc20types.ModuleAddress.Bytes()) - Expect(erc20AddrTrack).To(BeFalse(), "expected module address not to be stored") - }) - }) - }) - - Context("which interacts with a registered non-native token pair ERC-20 contract", func() { - It("should not add the address to the store", func() { - deployer := s.keyring.GetKey(deployerIdx) - - addrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), deployer.AccAddr) - Expect(addrTracked).To(BeFalse(), "expected address not to be stored before conversion") - - _, err := s.factory.ExecuteContractCall( - deployer.Priv, - evmtypes.EvmTxArgs{ - To: &s.registeredERC20Addr, - }, - testfactory.CallArgs{ - ContractABI: contracts.ERC20MinterBurnerDecimalsContract.ABI, - MethodName: "mint", - Args: []interface{}{ - deployer.Addr, - mintAmount, - }, - }, - ) - Expect(err).ToNot(HaveOccurred(), "failed to interact with registered ERC-20 contract") - - addrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), deployer.AccAddr) - Expect(addrTracked).To(BeFalse(), "expected address to not be stored") - }) - }) - - Context("which interacts with an unregistered ERC-20 contract", func() { - It("should not add the address to the store", func() { - deployer := s.keyring.GetKey(deployerIdx) - - _, err := s.factory.ExecuteContractCall( - deployer.Priv, - evmtypes.EvmTxArgs{ - To: &s.unregisteredERC20Addr, - }, - testfactory.CallArgs{ - ContractABI: contracts.ERC20MinterBurnerDecimalsContract.ABI, - MethodName: "mint", - Args: []interface{}{ - deployer.Addr, - mintAmount, - }, - }, - ) - Expect(err).ToNot(HaveOccurred(), "failed to interact with unregistered ERC-20 contract") - - deployerAddrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), deployer.AccAddr) - Expect(deployerAddrTracked).To(BeFalse(), "expected address to not be stored") - }) - }) - }) - - When("manually converting", func() { - Context("a registered coin into its ERC-20 representation", func() { - It("should add the address to the store if it is not already stored", func() { - sender := s.keyring.GetKey(1) - - addrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) - Expect(addrTracked).To(BeFalse(), "expected address not to be stored before conversion") - - _, err := s.factory.ExecuteCosmosTx( - sender.Priv, - commonfactory.CosmosTxArgs{ - Msgs: []sdk.Msg{ - &erc20types.MsgConvertCoin{ - Sender: sender.AccAddr.String(), - Receiver: sender.Addr.String(), - Coin: sdk.NewCoin(nativeIBCCoinDenom, convertAmount), - }, - }, - }, - ) - Expect(err).ToNot(HaveOccurred(), "failed to convert native IBC coin") - - Expect(s.network.NextBlock()).To(BeNil(), "failed to advance block") - - addrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) - Expect(addrTracked).To(BeTrue(), "expected address to be stored") - }) - - // TODO: is this correct? Yes, because only the addresses with ERC-20 tokens are relevant? - It("should store only the receiving address if the sender and receiver are not the same account", func() { - sender := s.keyring.GetKey(1) - receiver := s.keyring.GetKey(2) - - senderAddrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) - Expect(senderAddrTracked).To(BeFalse(), "expected address not to be stored before conversion") - receiverAddrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), receiver.AccAddr) - Expect(receiverAddrTracked).To(BeFalse(), "expected address not to be stored before conversion") - - _, err := s.factory.ExecuteCosmosTx( - sender.Priv, - commonfactory.CosmosTxArgs{ - Msgs: []sdk.Msg{ - &erc20types.MsgConvertCoin{ - Sender: sender.AccAddr.String(), - Receiver: receiver.Addr.String(), - Coin: sdk.NewCoin(nativeIBCCoinDenom, convertAmount), - }, - }, - }, - ) - Expect(err).ToNot(HaveOccurred(), "failed to convert native IBC coin") - - Expect(s.network.NextBlock()).To(BeNil(), "failed to advance block") - - senderAddrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) - Expect(senderAddrTracked).To(BeFalse(), "expected address to be stored") - receiverAddrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), receiver.AccAddr) - Expect(receiverAddrTracked).To(BeTrue(), "expected address to be stored") - }) - - It("should not fail if the address is already stored", func() { - sender := s.keyring.GetKey(1) - - addrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) - Expect(addrTracked).To(BeFalse(), "expected address not to be stored before conversion") - - _, err := s.factory.ExecuteCosmosTx( - sender.Priv, - commonfactory.CosmosTxArgs{ - Msgs: []sdk.Msg{ - &erc20types.MsgConvertCoin{ - Sender: sender.AccAddr.String(), - Receiver: sender.Addr.String(), - Coin: sdk.NewCoin(nativeIBCCoinDenom, testnetwork.PrefundedAccountInitialBalance.QuoRaw(10)), - }, - }, - }, - ) - Expect(err).ToNot(HaveOccurred(), "failed to convert native IBC coin") - - Expect(s.network.NextBlock()).To(BeNil(), "failed to advance block") - - _, err = s.factory.ExecuteCosmosTx( - sender.Priv, - commonfactory.CosmosTxArgs{ - Msgs: []sdk.Msg{ - &erc20types.MsgConvertCoin{ - Sender: sender.AccAddr.String(), - Receiver: sender.Addr.String(), - Coin: sdk.NewCoin(nativeIBCCoinDenom, testnetwork.PrefundedAccountInitialBalance.QuoRaw(10)), - }, - }, - }, - ) - Expect(err).ToNot(HaveOccurred(), "failed to convert native IBC coin") - - Expect(s.network.NextBlock()).To(BeNil(), "failed to advance block") - - addrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) - Expect(addrTracked).To(BeTrue(), "expected address to be still stored") - }) - }) - - Context("a registered ERC-20 representation into its native coin", func() { - It("should add the address to the store if it is not already stored", func() { - sender := s.keyring.GetKey(deployerIdx) - - addrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) - Expect(addrTracked).To(BeFalse(), "expected address not to be stored before conversion") - - _, err := s.factory.ExecuteCosmosTx( - sender.Priv, - commonfactory.CosmosTxArgs{ - Msgs: []sdk.Msg{ - &erc20types.MsgConvertERC20{ - ContractAddress: s.nativeCoinERC20Addr.String(), - Sender: sender.Addr.String(), - Receiver: sender.AccAddr.String(), - Amount: convertAmount, - }, - }, - }, - ) - Expect(err).ToNot(HaveOccurred(), "failed to convert native IBC coin") - - Expect(s.network.NextBlock()).To(BeNil(), "failed to advance block") - - addrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) - Expect(addrTracked).To(BeTrue(), "expected address to be stored") - }) - }) - }) -}) - -var _ = Describe("STRv2 Tracking Wevmos-", func() { - var s *STRv2TrackingSuite - - BeforeEach(func() { - var err error - s, err = CreateTestSuite(utils.TestingChainID + "-1") - Expect(err).ToNot(HaveOccurred(), "failed to create test suite") - - // NOTE: this is necessary to enable e.g. erc20Keeper.BalanceOf(...) to work - // correctly internally. - // Removing it will break a bunch of tests giving errors like: "failed to retrieve balance" - Expect(s.network.NextBlock()).To(BeNil(), "failed to advance block") - - // Deploy WEVMOS contract - s.wevmosAddr, err = s.factory.DeployContract( - s.keyring.GetPrivKey(erc20Deployer), - evmtypes.EvmTxArgs{}, - testfactory.ContractDeploymentData{Contract: contracts.WEVMOSContract}, - ) - Expect(err).ToNot(HaveOccurred(), "failed to deploy wevmos contract") - // Send WEVMOS to account - _, err = s.factory.ExecuteEthTx( - s.keyring.GetPrivKey(0), - evmtypes.EvmTxArgs{ - To: &s.wevmosAddr, - Amount: sentWEVMOS.BigInt(), - // FIXME: the gas simulation is not working correctly - otherwise results in out of gas - GasLimit: 100_000, - }, - ) - Expect(err).ToNot(HaveOccurred(), "failed to deposit to wevmos") - - s.network.App.Erc20Keeper.DeleteSTRv2Address(s.network.GetContext(), s.keyring.GetKey(0).AccAddr) - s.network.App.Erc20Keeper.DeleteSTRv2Address(s.network.GetContext(), s.keyring.GetKey(2).AccAddr) - }) - - When("sending an EVM transaction", func() { - Context("which interacts with a registered native token pair ERC-20 contract", func() { - Context("in a direct call to the token pair contract", func() { - It("should add the from and to addresses to the store if it is not already stored", func() { - sender := s.keyring.GetKey(0) - receiver := s.keyring.GetKey(2) - - senderAddrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) - Expect(senderAddrTracked).To(BeFalse(), "expected address not to be stored before conversion") - receiverAddrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), receiver.AccAddr) - Expect(receiverAddrTracked).To(BeFalse(), "expected address not to be stored before conversion") - - _, err := s.factory.ExecuteContractCall( - sender.Priv, - evmtypes.EvmTxArgs{ - To: &s.wevmosAddr, - GasLimit: 100_000, - }, - testfactory.CallArgs{ - ContractABI: contracts.WEVMOSContract.ABI, - MethodName: "transfer", - Args: []interface{}{ - receiver.Addr, - transferAmount, - }, - }, - ) - Expect(err).ToNot(HaveOccurred(), "failed to transfer tokens of Cosmos native ERC-20 token pair") - - Expect(s.network.NextBlock()).To(BeNil(), "failed to advance block") - - senderAddrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) - Expect(senderAddrTracked).To(BeTrue(), "expected address to be stored") - receiverAddrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) - Expect(receiverAddrTracked).To(BeTrue(), "expected address to be stored") - }) - It("should not fail if the addresses are already stored", func() { - sender := s.keyring.GetKey(0) - receiver := s.keyring.GetKey(2) - - senderAddrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) - Expect(senderAddrTracked).To(BeFalse(), "expected address not to be stored before conversion") - receiverAddrTracked := s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), receiver.AccAddr) - Expect(receiverAddrTracked).To(BeFalse(), "expected address not to be stored before conversion") - - s.network.App.Erc20Keeper.SetSTRv2Address(s.network.GetContext(), s.keyring.GetKey(0).AccAddr) - s.network.App.Erc20Keeper.SetSTRv2Address(s.network.GetContext(), s.keyring.GetKey(2).AccAddr) - - _, err := s.factory.ExecuteContractCall( - sender.Priv, - evmtypes.EvmTxArgs{ - To: &s.wevmosAddr, - }, - testfactory.CallArgs{ - ContractABI: contracts.WEVMOSContract.ABI, - MethodName: "transfer", - Args: []interface{}{ - receiver.Addr, - transferAmount, - }, - }, - ) - Expect(err).ToNot(HaveOccurred(), "failed to transfer tokens of Cosmos native ERC-20 token pair") - - Expect(s.network.NextBlock()).To(BeNil(), "failed to advance block") - - senderAddrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) - Expect(senderAddrTracked).To(BeTrue(), "expected address to be stored") - receiverAddrTracked = s.network.App.Erc20Keeper.HasSTRv2Address(s.network.GetContext(), sender.AccAddr) - Expect(receiverAddrTracked).To(BeTrue(), "expected address to be stored") - }) - }) - }) - }) -}) diff --git a/x/erc20/strv2/strv2_integration_utils_test.go b/x/erc20/strv2/strv2_integration_utils_test.go deleted file mode 100644 index 6095f6302a..0000000000 --- a/x/erc20/strv2/strv2_integration_utils_test.go +++ /dev/null @@ -1,192 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package strv2_test - -import ( - errorsmod "cosmossdk.io/errors" - sdk "github.com/cosmos/cosmos-sdk/types" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/contracts" - commonfactory "github.com/evmos/evmos/v18/testutil/integration/common/factory" - testfactory "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" - testnetwork "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - "github.com/evmos/evmos/v18/utils" - erc20types "github.com/evmos/evmos/v18/x/erc20/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" - "github.com/pkg/errors" -) - -func CreateTestSuite(chainID string) (*STRv2TrackingSuite, error) { - keyring := testkeyring.New(3) - - genesisBalances := []banktypes.Balance{ - { - Address: keyring.GetAccAddr(0).String(), - Coins: sdk.NewCoins( - sdk.Coin{Denom: utils.BaseDenom, Amount: testnetwork.PrefundedAccountInitialBalance}, - sdk.Coin{Denom: nativeIBCCoinDenom, Amount: testnetwork.PrefundedAccountInitialBalance}, - ), - }, - { - Address: keyring.GetAccAddr(1).String(), - Coins: sdk.NewCoins( - sdk.Coin{Denom: utils.BaseDenom, Amount: testnetwork.PrefundedAccountInitialBalance}, - sdk.Coin{Denom: nativeIBCCoinDenom, Amount: testnetwork.PrefundedAccountInitialBalance.QuoRaw(2)}, - ), - }, - } - - network := testnetwork.NewUnitTestNetwork( - testnetwork.WithChainID(chainID), - testnetwork.WithBalances(genesisBalances...), - ) - handler := grpc.NewIntegrationHandler(network) - factory := testfactory.New(network, handler) - - deployer := keyring.GetKey(deployerIdx) - - // ------------------------------------------------------------------ - // Register the native IBC coin - ibcCoinMetaData := banktypes.Metadata{ - Description: "The native IBC coin", - Base: nativeIBCCoinDenom, - Display: nativeIBCCoinDenom, - DenomUnits: []*banktypes.DenomUnit{ - {Denom: nativeIBCCoinDenom, Exponent: 0}, - {Denom: "u" + nativeIBCCoinDenom, Exponent: 6}, - }, - } - - ibcNativeTokenPair, err := network.App.Erc20Keeper.RegisterCoin(network.GetContext(), ibcCoinMetaData) - if err != nil { - return &STRv2TrackingSuite{}, errorsmod.Wrap(err, "failed to register native IBC coin") - } - nativeCoinERC20Addr := common.HexToAddress(ibcNativeTokenPair.Erc20Address) - - if err := network.NextBlock(); err != nil { - return &STRv2TrackingSuite{}, errorsmod.Wrap(err, "failed to advance block") - } - - // Convert a balance for the deployer - msgConvertCoin := erc20types.MsgConvertCoin{ - Sender: deployer.AccAddr.String(), - Receiver: deployer.Addr.String(), - Coin: sdk.NewCoin(nativeIBCCoinDenom, convertAmount), - } - _, err = factory.ExecuteCosmosTx(deployer.Priv, commonfactory.CosmosTxArgs{ - Msgs: []sdk.Msg{&msgConvertCoin}, - }) - if err != nil { - return &STRv2TrackingSuite{}, errorsmod.Wrap(err, "failed to convert a balance") - } - - if err := network.NextBlock(); err != nil { - return &STRv2TrackingSuite{}, errorsmod.Wrap(err, "failed to advance block") - } - - // ------------------------------------------------------------------ - // Register an ERC-20 token pair - registeredERC20Addr, err := factory.DeployContract( - deployer.Priv, - evmtypes.EvmTxArgs{}, - testfactory.ContractDeploymentData{ - Contract: contracts.ERC20MinterBurnerDecimalsContract, - ConstructorArgs: []interface{}{"TestToken", "TTK", uint8(18)}, - }, - ) - if err != nil { - return &STRv2TrackingSuite{}, errorsmod.Wrap(err, "failed to deploy ERC-20 contract") - } - - if err := network.NextBlock(); err != nil { - return &STRv2TrackingSuite{}, errorsmod.Wrap(err, "failed to advance block") - } - - // Mint some tokens for the deployer - _, err = factory.ExecuteContractCall( - deployer.Priv, - evmtypes.EvmTxArgs{ - To: ®isteredERC20Addr, - }, - testfactory.CallArgs{ - ContractABI: contracts.ERC20MinterBurnerDecimalsContract.ABI, - MethodName: "mint", - Args: []interface{}{ - deployer.Addr, - mintAmount, - }, - }, - ) - if err != nil { - return &STRv2TrackingSuite{}, errorsmod.Wrap(err, "failed to mint ERC-20 tokens") - } - - _, err = network.App.Erc20Keeper.RegisterERC20(network.GetContext(), registeredERC20Addr) - if err != nil { - return &STRv2TrackingSuite{}, errorsmod.Wrap(err, "failed to register token pair") - } - - if err := network.NextBlock(); err != nil { - return &STRv2TrackingSuite{}, errorsmod.Wrap(err, "failed to advance block") - } - - // ------------------------------------------------------------------ - // Deploy an unregistered ERC-20 contract - unregisteredERC20Addr, err := factory.DeployContract( - deployer.Priv, - evmtypes.EvmTxArgs{}, - testfactory.ContractDeploymentData{ - Contract: contracts.ERC20MinterBurnerDecimalsContract, - ConstructorArgs: []interface{}{"UnregisteredToken", "URT", uint8(18)}, - }, - ) - if err != nil { - return &STRv2TrackingSuite{}, errorsmod.Wrap(err, "failed to deploy ERC-20 contract") - } - - if err := network.NextBlock(); err != nil { - return &STRv2TrackingSuite{}, errorsmod.Wrap(err, "failed to advance block") - } - - // Mint some tokens for the deployer - _, err = factory.ExecuteContractCall( - deployer.Priv, - evmtypes.EvmTxArgs{ - To: &unregisteredERC20Addr, - }, - testfactory.CallArgs{ - ContractABI: contracts.ERC20MinterBurnerDecimalsContract.ABI, - MethodName: "mint", - Args: []interface{}{ - deployer.Addr, - mintAmount, - }, - }, - ) - if err != nil { - return &STRv2TrackingSuite{}, errorsmod.Wrap(err, "failed to mint ERC-20 tokens") - } - - network.App.Erc20Keeper.DeleteSTRv2Address(network.GetContext(), keyring.GetAccAddr(0)) - - // NOTE: this is necessary to enable e.g. erc20Keeper.BalanceOf(...) to work - // correctly internally. - // Removing it will break a bunch of tests giving errors like: "failed to retrieve balance" - if err = network.NextBlock(); err != nil { - return nil, errors.Wrap(err, "failed to advance block") - } - - return &STRv2TrackingSuite{ - keyring: keyring, - network: network, - handler: handler, - factory: factory, - nativeCoinERC20Addr: nativeCoinERC20Addr, - registeredERC20Addr: registeredERC20Addr, - unregisteredERC20Addr: unregisteredERC20Addr, - }, nil -} diff --git a/x/erc20/types/events.go b/x/erc20/types/events.go index 6022a1594a..00d1d97722 100644 --- a/x/erc20/types/events.go +++ b/x/erc20/types/events.go @@ -24,13 +24,6 @@ const ( AttributeKeyCosmosCoin = "cosmos_coin" AttributeKeyERC20Token = "erc20_token" // #nosec AttributeKeyReceiver = "receiver" - - // ERC20EventTransfer defines the transfer event for ERC20 - ERC20EventTransfer = "Transfer" - // WevmosEventWithdraw defines the withdrawal event for Wevmos - WevmosEventWithdraw = "Withdrawal" - // WevmosEventWithdraw defines the deposit event for Wevmos - WevmosEventDeposit = "Deposit" ) // LogTransfer Event type for Transfer(address from, address to, uint256 value) From e237edbf6f69e46d68c087e2e164d20fc75885ef Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Fri, 7 Jun 2024 10:07:16 -0300 Subject: [PATCH 278/345] Revert "imp(evm): Add evm hook logic again (#2501)" (#2608) This reverts commit d0ddd88b9ecbc7777f440aeb5feeb468148868e0. Signed-off-by: Tom <54514587+GAtom22@users.noreply.github.com> --- CHANGELOG.md | 1 - app/app.go | 4 -- x/evm/keeper/hooks.go | 31 -------------- x/evm/keeper/keeper.go | 33 --------------- x/evm/keeper/state_transition.go | 72 +++++--------------------------- x/evm/types/errors.go | 2 - x/evm/types/interfaces.go | 12 +----- 7 files changed, 11 insertions(+), 144 deletions(-) delete mode 100644 x/evm/keeper/hooks.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 43aed70ddb..d8e06a1c03 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,7 +49,6 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (deps) [#2355](https://github.com/evmos/evmos/pull/2355) Bump Cosmos-SDK to v0.47.8-evmos. - (revenue) [#2379](https://github.com/evmos/evmos/pull/2379) Remove `x/revenue` module. - (evm) [#2380](https://github.com/evmos/evmos/pull/2380) Remove EVM hooks from app and EVM module. -- (evm) [#2501](https://github.com/evmos/evmos/pull/2501) Revert deletion of EVM hooks (#2380). - (erc20) [#2508](https://github.com/evmos/evmos/pull/2508) Add bookkeping logic in preparation for STRV2 upgrade. - (precompiles) [#2529](https://github.com/evmos/evmos/pull/2529) Remove Outposts precompiles. - (upgrade) [#2533](https://github.com/evmos/evmos/pull/2533) Add upgrade handler for v19. diff --git a/app/app.go b/app/app.go index 64b5441039..2d13f14395 100644 --- a/app/app.go +++ b/app/app.go @@ -526,10 +526,6 @@ func NewEvmos( ), ) - app.EvmKeeper = app.EvmKeeper.SetHooks( - evmkeeper.NewMultiEvmHooks(), - ) - // Override the ICS20 app module transferModule := transfer.NewAppModule(app.TransferKeeper) diff --git a/x/evm/keeper/hooks.go b/x/evm/keeper/hooks.go deleted file mode 100644 index 80a5f780e2..0000000000 --- a/x/evm/keeper/hooks.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) -package keeper - -import ( - errorsmod "cosmossdk.io/errors" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/ethereum/go-ethereum/core" - ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v18/x/evm/types" -) - -var _ types.EvmHooks = MultiEvmHooks{} - -// MultiEvmHooks combine multiple evm hooks, all hook functions are run in array sequence -type MultiEvmHooks []types.EvmHooks - -// NewMultiEvmHooks combine multiple evm hooks -func NewMultiEvmHooks(hooks ...types.EvmHooks) MultiEvmHooks { - return hooks -} - -// PostTxProcessing delegate the call to underlying hooks -func (mh MultiEvmHooks) PostTxProcessing(ctx sdk.Context, msg core.Message, receipt *ethtypes.Receipt) error { - for i := range mh { - if err := mh[i].PostTxProcessing(ctx, msg, receipt); err != nil { - return errorsmod.Wrapf(err, "EVM hook %T failed", mh[i]) - } - } - return nil -} diff --git a/x/evm/keeper/keeper.go b/x/evm/keeper/keeper.go index 7cafb0d4aa..d349d03c10 100644 --- a/x/evm/keeper/keeper.go +++ b/x/evm/keeper/keeper.go @@ -55,9 +55,6 @@ type Keeper struct { // Tracer used to collect execution traces from the EVM transaction execution tracer string - // EVM Hooks for tx post-processing - hooks types.EvmHooks - // Legacy subspace ss paramstypes.Subspace @@ -352,33 +349,3 @@ func (k Keeper) AddTransientGasUsed(ctx sdk.Context, gasUsed uint64) (uint64, er k.SetTransientGasUsed(ctx, result) return result, nil } - -// ---------------------------------------------------------------------------- -// Hooks -// ---------------------------------------------------------------------------- - -// SetHooks sets the hooks for the EVM module -// It should be called only once during initialization, it panic if called more than once. -func (k *Keeper) SetHooks(eh types.EvmHooks) *Keeper { - if k.hooks != nil { - panic("cannot set evm hooks twice") - } - - k.hooks = eh - return k -} - -// CleanHooks resets the hooks for the EVM module -// NOTE: Should only be used for testing purposes -func (k *Keeper) CleanHooks() *Keeper { - k.hooks = nil - return k -} - -// PostTxProcessing delegate the call to the hooks. If no hook has been registered, this function returns with a `nil` error -func (k *Keeper) PostTxProcessing(ctx sdk.Context, msg core.Message, receipt *ethtypes.Receipt) error { - if k.hooks == nil { - return nil - } - return k.hooks.PostTxProcessing(ctx, msg, receipt) -} diff --git a/x/evm/keeper/state_transition.go b/x/evm/keeper/state_transition.go index ec0281a3d0..078399e34c 100644 --- a/x/evm/keeper/state_transition.go +++ b/x/evm/keeper/state_transition.go @@ -20,7 +20,6 @@ import ( "github.com/ethereum/go-ethereum/core" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/params" ) @@ -139,10 +138,7 @@ func (k Keeper) GetHashFn(ctx sdk.Context) vm.GetHashFunc { // // For relevant discussion see: https://github.com/cosmos/cosmos-sdk/discussions/9072 func (k *Keeper) ApplyTransaction(ctx sdk.Context, tx *ethtypes.Transaction) (*types.MsgEthereumTxResponse, error) { - var ( - bloom *big.Int - bloomReceipt ethtypes.Bloom - ) + var bloom *big.Int cfg, err := k.EVMConfig(ctx, sdk.ConsAddress(ctx.BlockHeader().ProposerAddress), k.eip155ChainID) if err != nil { @@ -157,23 +153,17 @@ func (k *Keeper) ApplyTransaction(ctx sdk.Context, tx *ethtypes.Transaction) (*t return nil, errorsmod.Wrap(err, "failed to return ethereum transaction as core message") } - // snapshot to contain the tx processing and post processing in same scope - var commit func() - tmpCtx := ctx - if k.hooks != nil { - // Create a cache context to revert state when tx hooks fails, - // the cache context is only committed when both tx and hooks executed successfully. - // Didn't use `Snapshot` because the context stack has exponential complexity on certain operations, - // thus restricted to be used only inside `ApplyMessage`. - tmpCtx, commit = ctx.CacheContext() - } + // Create a cache context to revert state. The cache context is only committed when both tx and hooks executed successfully. + // Didn't use `Snapshot` because the context stack has exponential complexity on certain operations, + // thus restricted to be used only inside `ApplyMessage`. + tmpCtx, commit := ctx.CacheContext() // pass true to commit the StateDB res, err := k.ApplyMessageWithConfig(tmpCtx, msg, nil, true, cfg, txConfig) if err != nil { // when a transaction contains multiple msg, as long as one of the msg fails // all gas will be deducted. so is not msg.Gas() - k.ResetGasMeterAndConsumeGas(ctx, ctx.GasMeter().Limit()) + k.ResetGasMeterAndConsumeGas(tmpCtx, tmpCtx.GasMeter().Limit()) return nil, errorsmod.Wrap(err, "failed to apply ethereum core message") } @@ -183,53 +173,11 @@ func (k *Keeper) ApplyTransaction(ctx sdk.Context, tx *ethtypes.Transaction) (*t if len(logs) > 0 { bloom = k.GetBlockBloomTransient(ctx) bloom.Or(bloom, big.NewInt(0).SetBytes(ethtypes.LogsBloom(logs))) - bloomReceipt = ethtypes.BytesToBloom(bloom.Bytes()) - } - - cumulativeGasUsed := res.GasUsed - if ctx.BlockGasMeter() != nil { - limit := ctx.BlockGasMeter().Limit() - cumulativeGasUsed += ctx.BlockGasMeter().GasConsumed() - if cumulativeGasUsed > limit { - cumulativeGasUsed = limit - } - } - - var contractAddr common.Address - if msg.To() == nil { - contractAddr = crypto.CreateAddress(msg.From(), msg.Nonce()) - } - - receipt := ðtypes.Receipt{ - Type: tx.Type(), - PostState: nil, // TODO: intermediate state root - CumulativeGasUsed: cumulativeGasUsed, - Bloom: bloomReceipt, - Logs: logs, - TxHash: txConfig.TxHash, - ContractAddress: contractAddr, - GasUsed: res.GasUsed, - BlockHash: txConfig.BlockHash, - BlockNumber: big.NewInt(ctx.BlockHeight()), - TransactionIndex: txConfig.TxIndex, } if !res.Failed() { - receipt.Status = ethtypes.ReceiptStatusSuccessful - // Only call hooks if tx executed successfully. - if err = k.PostTxProcessing(tmpCtx, msg, receipt); err != nil { - // If hooks return error, revert the whole tx. - res.VmError = types.ErrPostTxProcessing.Error() - k.Logger(ctx).Error("tx post processing failed", "error", err) - - // If the tx failed in post processing hooks, we should clear the logs - res.Logs = nil - } else if commit != nil { - // PostTxProcessing is successful, commit the tmpCtx - commit() - // Since the post-processing can alter the log, we need to update the result - res.Logs = types.NewLogsFromEth(receipt.Logs) - } + commit() + ctx.EventManager().EmitEvents(tmpCtx.EventManager().Events()) } // refund gas in order to match the Ethereum gas consumption instead of the default SDK one. @@ -237,9 +185,9 @@ func (k *Keeper) ApplyTransaction(ctx sdk.Context, tx *ethtypes.Transaction) (*t return nil, errorsmod.Wrapf(err, "failed to refund gas leftover gas to sender %s", msg.From()) } - if len(receipt.Logs) > 0 { + if len(logs) > 0 { // Update transient block bloom filter - k.SetBlockBloomTransient(ctx, receipt.Bloom.Big()) + k.SetBlockBloomTransient(ctx, bloom) k.SetLogSizeTransient(ctx, uint64(txConfig.LogIndex)+uint64(len(logs))) } diff --git a/x/evm/types/errors.go b/x/evm/types/errors.go index d666b0765d..197b2ce80d 100644 --- a/x/evm/types/errors.go +++ b/x/evm/types/errors.go @@ -34,8 +34,6 @@ const ( codeErrABIUnpack ) -var ErrPostTxProcessing = errors.New("failed to execute post processing") - var ( // ErrInvalidState returns an error resulting from an invalid Storage State. ErrInvalidState = errorsmod.Register(ModuleName, codeErrInvalidState, "invalid storage state") diff --git a/x/evm/types/interfaces.go b/x/evm/types/interfaces.go index 97b5f6bff7..3e8c9c3dba 100644 --- a/x/evm/types/interfaces.go +++ b/x/evm/types/interfaces.go @@ -6,12 +6,11 @@ import ( "math/big" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - "github.com/ethereum/go-ethereum/core" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - ethtypes "github.com/ethereum/go-ethereum/core/types" + feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" ) @@ -49,15 +48,6 @@ type FeeMarketKeeper interface { CalculateBaseFee(ctx sdk.Context) *big.Int } -// Event Hooks -// These can be utilized to customize evm transaction processing. - -// EvmHooks event hooks for evm tx processing -type EvmHooks interface { - // Must be called after tx is processed successfully, if return an error, the whole transaction is reverted. - PostTxProcessing(ctx sdk.Context, msg core.Message, receipt *ethtypes.Receipt) error -} - type ( LegacyParams = paramtypes.ParamSet // Subspace defines an interface that implements the legacy Cosmos SDK x/params Subspace type. From e813f30a9a6422c02ae357f56154ffd6eee0f534 Mon Sep 17 00:00:00 2001 From: Freddy Caceres Date: Fri, 7 Jun 2024 15:20:03 +0200 Subject: [PATCH 279/345] imp(evm): Move OpcodeHooks into types (#2611) * imp(evm): Move OpcodeHooks into types * run make format * fix lint * update comments * run make format --------- Co-authored-by: facs95 --- x/evm/keeper/opcodes_hooks.go | 45 -------------------- x/evm/keeper/state_transition.go | 12 +++++- x/evm/types/opcodes_hooks.go | 70 ++++++++++++++++++++++++++++++++ x/evm/types/permissions.go | 31 +++++++++++++- 4 files changed, 110 insertions(+), 48 deletions(-) delete mode 100644 x/evm/keeper/opcodes_hooks.go create mode 100644 x/evm/types/opcodes_hooks.go diff --git a/x/evm/keeper/opcodes_hooks.go b/x/evm/keeper/opcodes_hooks.go deleted file mode 100644 index ad2d9899ab..0000000000 --- a/x/evm/keeper/opcodes_hooks.go +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package keeper - -import ( - "fmt" - - "github.com/evmos/evmos/v18/x/evm/types" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" -) - -// DefaultOpCodesHooks is the default implementation of OpCodeHooks for EVMOS chain -// The hooks are used to enforce access control policies on EVM operations. -// They are ran BEFORE the respective opcode execution every time they are called. -type DefaultOpCodesHooks struct { - accessControl types.PermissionPolicy - signer common.Address -} - -// NewDefaultOpCodesHooks creates a new DefaultOpCodesHooks instance -func NewDefaultOpCodesHooks(accessControl types.PermissionPolicy, signer common.Address) vm.OpCodeHooks { - return &DefaultOpCodesHooks{ - accessControl: accessControl, - signer: signer, - } -} - -// CreateHook checks if the caller has permission to deploy contracts -func (h *DefaultOpCodesHooks) CreateHook(_ *vm.EVM, caller common.Address) error { - if h.accessControl.CanCreate(h.signer, caller) { - return nil - } - return fmt.Errorf("caller address %s does not have permission to deploy contracts", h.signer) -} - -// CallHook checks if the caller has permission to perform a call -func (h *DefaultOpCodesHooks) CallHook(_ *vm.EVM, caller common.Address, recipient common.Address) error { - if h.accessControl.CanCall(h.signer, caller, recipient) { - return nil - } - return fmt.Errorf("caller address %s does not have permission to perform a call", h.signer) -} diff --git a/x/evm/keeper/state_transition.go b/x/evm/keeper/state_transition.go index 078399e34c..f51d249ccc 100644 --- a/x/evm/keeper/state_transition.go +++ b/x/evm/keeper/state_transition.go @@ -59,8 +59,16 @@ func (k *Keeper) NewEVM( vmConfig := k.VMConfig(ctx, msg, cfg, tracer) signer := msg.From() - AccessControl := types.NewRestrictedPermissionPolicy(&cfg.Params.AccessControl, signer) - evmHooks := NewDefaultOpCodesHooks(AccessControl, signer) + accessControl := types.NewRestrictedPermissionPolicy(&cfg.Params.AccessControl, signer) + + // Set hooks for the EVM opcodes + evmHooks := types.NewDefaultOpCodesHooks() + evmHooks.AddCreateHooks( + accessControl.GetCreateHook(signer), + ) + evmHooks.AddCallHooks( + accessControl.GetCallHook(signer), + ) return vm.NewEVMWithHooks(evmHooks, blockCtx, txCtx, stateDB, cfg.ChainConfig, vmConfig) } diff --git a/x/evm/types/opcodes_hooks.go b/x/evm/types/opcodes_hooks.go new file mode 100644 index 0000000000..3f89a5ef0c --- /dev/null +++ b/x/evm/types/opcodes_hooks.go @@ -0,0 +1,70 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package types + +import ( + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/vm" +) + +// OpCodeHooks extends the geth OpCodeHooks interface to add custom hooks for EVM operations. +// The hooks run before the respective opcode execution every time they are called. +type OpCodeHooks interface { + vm.OpCodeHooks + AddCallHooks(hooks ...CallHook) + AddCreateHooks(hooks ...CreateHook) +} + +// DefaultOpCodesHooks is the default implementation of OpCodeHooks for EVMOS chain +// The hooks are used to enforce access control policies on EVM operations. +// They are ran BEFORE the respective opcode execution every time they are called. +type DefaultOpCodesHooks struct { + callHooks []CallHook + createHooks []CreateHook +} + +// Make sure we comply with geth's OpCodeHooks interface +var _ OpCodeHooks = (*DefaultOpCodesHooks)(nil) + +type ( + CreateHook func(ev *vm.EVM, caller common.Address) error + CallHook func(ev *vm.EVM, caller common.Address, recipient common.Address) error +) + +// NewDefaultOpCodesHooks creates a new DefaultOpCodesHooks instance +func NewDefaultOpCodesHooks() OpCodeHooks { + return &DefaultOpCodesHooks{} +} + +// AddCallHooks adds one or more hooks to the queue to be executed before the CALL opcode. +// Hooks will be executed in the order they are added. +func (h *DefaultOpCodesHooks) AddCallHooks(hooks ...CallHook) { + h.callHooks = append(h.callHooks, hooks...) +} + +// AddCreateHooks adds one or more hooks to the queue to be executed before the CREATE opcode. +// Hooks will be executed in the order they are added. +func (h *DefaultOpCodesHooks) AddCreateHooks(hooks ...CreateHook) { + h.createHooks = append(h.createHooks, hooks...) +} + +// CreateHook checks if the caller has permission to deploy contracts +func (h *DefaultOpCodesHooks) CreateHook(evm *vm.EVM, caller common.Address) error { + for _, hook := range h.createHooks { + if err := hook(evm, caller); err != nil { + return err + } + } + return nil +} + +// CallHook checks if the caller has permission to perform a call +func (h *DefaultOpCodesHooks) CallHook(evm *vm.EVM, caller common.Address, recipient common.Address) error { + for _, hook := range h.callHooks { + if err := hook(evm, caller, recipient); err != nil { + return err + } + } + return nil +} diff --git a/x/evm/types/permissions.go b/x/evm/types/permissions.go index 3fffa5c9f7..d51e209591 100644 --- a/x/evm/types/permissions.go +++ b/x/evm/types/permissions.go @@ -4,9 +4,11 @@ package types import ( + "fmt" "slices" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/vm" ) // PermissionPolicy is the interface that defines the permission policy for contract creation and calls. @@ -18,6 +20,13 @@ type PermissionPolicy interface { // CanCall checks if the any type of CALL opcode execution is allowed. This includes // contract calls and transfers. CanCall(signer, caller, recipient common.Address) bool + + // GetCallHook returns a CallHook that checks if the caller is allowed to perform a call. + // This is used by the EVM opcode hooks to enforce access control policies. + GetCallHook(signer common.Address) CallHook + // GetCreateHook returns a CreateHook that checks if the caller is allowed to deploy contracts. + // This is used by the EVM opcode hooks to enforce access control policies. + GetCreateHook(signer common.Address) CreateHook } // RestrictedPermissionPolicy is a permission policy that restricts contract creation and calls based on a set of accessControl. @@ -30,7 +39,7 @@ type RestrictedPermissionPolicy struct { canCall callerFn } -func NewRestrictedPermissionPolicy(accessControl *AccessControl, signer common.Address) RestrictedPermissionPolicy { +func NewRestrictedPermissionPolicy(accessControl *AccessControl, signer common.Address) PermissionPolicy { // generate create function at instantiation for signer address to be check only once // since it remains constant canCreate := getCanCreateFn(accessControl, signer) @@ -44,6 +53,26 @@ func NewRestrictedPermissionPolicy(accessControl *AccessControl, signer common.A var _ PermissionPolicy = RestrictedPermissionPolicy{} +// GetCallHook returns a CallHook that checks if the caller is allowed to perform a call. +func (p RestrictedPermissionPolicy) GetCallHook(signer common.Address) CallHook { + return func(_ *vm.EVM, caller, recipient common.Address) error { + if p.CanCall(signer, caller, recipient) { + return nil + } + return fmt.Errorf("caller address %s does not have permission to perform a call", caller) + } +} + +// GetCreateHook returns a CreateHook that checks if the caller is allowed to deploy contracts. +func (p RestrictedPermissionPolicy) GetCreateHook(signer common.Address) CreateHook { + return func(_ *vm.EVM, caller common.Address) error { + if p.CanCreate(signer, caller) { + return nil + } + return fmt.Errorf("caller address %s does not have permission to deploy contracts", caller) + } +} + // CanCreate implements the PermissionPolicy interface. // It allows contract creation if access type is set to everybody. // Otherwise, it checks if: From adb7b91e3ee202357a22ee63ecc5b3d04ce29155 Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Mon, 10 Jun 2024 14:18:29 +0200 Subject: [PATCH 280/345] fix(contracts): Remove unused contract and make script compatible with Python <3.12 (#2613) * remove unused contract and run make contracts-compile * remove Union operator to support Python <3.12 * add changelog entry --- CHANGELOG.md | 1 + .../staking/testdata/StakingCaller.json | 4 +-- .../compile_smart_contracts.py | 8 +++--- .../ERC20DirectBalanceManipulation.json | 6 ++--- .../testdata/ERC20MaliciousDelayed.json | 6 ++--- x/erc20/keeper/testdata/tokenTransfer.go | 26 ------------------- x/erc20/keeper/testdata/tokenTransfer.json | 4 --- x/erc20/keeper/testdata/tokenTransfer.sol | 26 ------------------- x/evm/statedb/testdata/FlashLoan.json | 4 +-- 9 files changed, 15 insertions(+), 70 deletions(-) delete mode 100644 x/erc20/keeper/testdata/tokenTransfer.go delete mode 100644 x/erc20/keeper/testdata/tokenTransfer.json delete mode 100644 x/erc20/keeper/testdata/tokenTransfer.sol diff --git a/CHANGELOG.md b/CHANGELOG.md index d8e06a1c03..38276fb415 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -98,6 +98,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (ibc) [#2504](https://github.com/evmos/evmos/pull/2504) Refactor repeated unpacking of IBC packet data. - (make) [#2487](https://github.com/evmos/evmos/pull/2487) Improve make command to compile all smart contracts in repository. - (evm) [#2594](https://github.com/evmos/evmos/pull/2594) Move `CallEVM` and `CallEVMWithData` to `x/evm` module. +- (contracts) [#2613](https://github.com/evmos/evmos/pull/2613) Remove unused contract and make script useable with Python <3.12. ## [v18.1.0](https://github.com/evmos/evmos/releases/tag/v18.1.0) - 2024-05-31 diff --git a/precompiles/staking/testdata/StakingCaller.json b/precompiles/staking/testdata/StakingCaller.json index c427485580..ed2804fa6f 100644 --- a/precompiles/staking/testdata/StakingCaller.json +++ b/precompiles/staking/testdata/StakingCaller.json @@ -922,8 +922,8 @@ "type": "function" } ], - "bytecode": "0x6080604052604051806020016040528060405180606001604052806023815260200162005c286023913981525060019060016200003e92919062000053565b503480156200004c57600080fd5b50620004a1565b828054828255906000526020600020908101928215620000a0579160200282015b828111156200009f5782518290816200008e9190620003ba565b509160200191906001019062000074565b5b509050620000af9190620000b3565b5090565b5b80821115620000d75760008181620000cd9190620000db565b50600101620000b4565b5090565b508054620000e990620001a9565b6000825580601f10620000fd57506200011e565b601f0160209004906000526020600020908101906200011d919062000121565b5b50565b5b808211156200013c57600081600090555060010162000122565b5090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620001c257607f821691505b602082108103620001d857620001d76200017a565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620002427fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000203565b6200024e868362000203565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200029b620002956200028f8462000266565b62000270565b62000266565b9050919050565b6000819050919050565b620002b7836200027a565b620002cf620002c682620002a2565b84845462000210565b825550505050565b600090565b620002e6620002d7565b620002f3818484620002ac565b505050565b5b818110156200031b576200030f600082620002dc565b600181019050620002f9565b5050565b601f8211156200036a576200033481620001de565b6200033f84620001f3565b810160208510156200034f578190505b620003676200035e85620001f3565b830182620002f8565b50505b505050565b600082821c905092915050565b60006200038f600019846008026200036f565b1980831691505092915050565b6000620003aa83836200037c565b9150826002028217905092915050565b620003c58262000140565b67ffffffffffffffff811115620003e157620003e06200014b565b5b620003ed8254620001a9565b620003fa8282856200031f565b600060209050601f8311600181146200043257600084156200041d578287015190505b6200042985826200039c565b86555062000499565b601f1984166200044286620001de565b60005b828110156200046c5784890151825560018201915060208501945060208101905062000445565b868310156200048c578489015162000488601f8916826200037c565b8355505b6001600288020188555050505b505050505050565b61577780620004b16000396000f3fe6080604052600436106101355760003560e01c80637e51b811116100ab578063cf2753cf1161006f578063cf2753cf14610418578063ec9485df14610456578063f40a214614610493578063f5714e64146104bc578063f700dbd2146104d8578063f732b0651461050157610135565b80637e51b811146103435780638939e7831461036c5780638edb3f8b146103955780639eab6711146103b1578063b13d4242146103da57610135565b8063455b8551116100fd578063455b85511461023057806355dc4b221461026d578063570467ac146102965780635e269bfe146102d357806360deaa2a146102fc57806361bc221a1461031857610135565b80630a4433e21461013a5780631904bb2e1461016357806319b16c4c146101a057806331bcbcb3146101de5780633566cb9514610207575b600080fd5b34801561014657600080fd5b50610161600480360381019061015c919061221e565b61053f565b005b34801561016f57600080fd5b5061018a60048036038101906101859190612292565b61060e565b6040516101979190612509565b60405180910390f35b3480156101ac57600080fd5b506101c760048036038101906101c2919061265b565b61069e565b6040516101d5929190612732565b60405180910390f35b3480156101ea57600080fd5b5061020560048036038101906102009190612762565b610b9d565b005b34801561021357600080fd5b5061022e600480360381019061022991906127d1565b610e2a565b005b34801561023c57600080fd5b506102576004803603810190610252919061282d565b610f92565b6040516102649190612a34565b60405180910390f35b34801561027957600080fd5b50610294600480360381019061028f9190612a56565b611025565b005b3480156102a257600080fd5b506102bd60048036038101906102b8919061265b565b611417565b6040516102ca9190612c71565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f59190612c93565b6114ad565b005b61031660048036038101906103119190612d16565b611538565b005b34801561032457600080fd5b5061032d611686565b60405161033a9190612d5f565b60405180910390f35b34801561034f57600080fd5b5061036a60048036038101906103659190612762565b61168c565b005b34801561037857600080fd5b50610393600480360381019061038e9190612762565b611714565b005b6103af60048036038101906103aa9190612d16565b61179c565b005b3480156103bd57600080fd5b506103d860048036038101906103d39190612d7a565b611931565b005b3480156103e657600080fd5b5061040160048036038101906103fc9190612e3d565b6119bc565b60405161040f929190613106565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a919061282d565b611a54565b60405161044d929190612732565b60405180910390f35b34801561046257600080fd5b5061047d6004803603810190610478919061282d565b611aec565b60405161048a9190612d5f565b60405180910390f35b34801561049f57600080fd5b506104ba60048036038101906104b5919061313d565b611b76565b005b6104d660048036038101906104d19190612d16565b611d52565b005b3480156104e457600080fd5b506104ff60048036038101906104fa91906131c0565b611eac565b005b34801561050d57600080fd5b50610528600480360381019061052391906133cb565b611f78565b6040516105369291906136e2565b60405180910390f35b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895868487876040518563ffffffff1660e01b8152600401610582949392919061387b565b6020604051808303816000875af11580156105a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c591906138d0565b905080610607576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105fe90613980565b60405180910390fd5b5050505050565b610616612016565b61080073ffffffffffffffffffffffffffffffffffffffff1663223b3b7a836040518263ffffffff1660e01b815260040161065191906139a0565b600060405180830381865afa15801561066e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906106979190613bf1565b9050919050565b60006106a861208a565b60006108009050600086866040516024016106c4929190613c73565b6040516020818303038152906040527f241774e6000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000856040516020016107569190613cdf565b60405160208183030381529060405280519060200120905060405160200161077d90613d42565b604051602081830303815290604052805190602001208103610869576000808473ffffffffffffffffffffffffffffffffffffffff16846040516107c19190613d93565b600060405180830381855af49150503d80600081146107fc576040519150601f19603f3d011682016040523d82523d6000602084013e610801565b606091505b509150915081610846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083d90613e1c565b60405180910390fd5b8080602001905181019061085a9190613ea8565b80975081985050505050610b92565b60405160200161087890613f50565b604051602081830303815290604052805190602001208103610964576000808473ffffffffffffffffffffffffffffffffffffffff16846040516108bc9190613d93565b600060405180830381855afa9150503d80600081146108f7576040519150601f19603f3d011682016040523d82523d6000602084013e6108fc565b606091505b509150915081610941576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093890613fb1565b60405180910390fd5b808060200190518101906109559190613ea8565b80975081985050505050610b91565b6040516020016109739061401d565b604051602081830303815290604052805190602001208103610a61576000808473ffffffffffffffffffffffffffffffffffffffff16846040516109b79190613d93565b6000604051808303816000865af19150503d80600081146109f4576040519150601f19603f3d011682016040523d82523d6000602084013e6109f9565b606091505b509150915081610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a359061407e565b60405180910390fd5b80806020019051810190610a529190613ea8565b80975081985050505050610b90565b604051602001610a70906140ea565b604051602081830303815290604052805190602001208103610b545760006040518060400160405280601a81526020017f64656c65676174696f6e28616464726573732c737472696e6729000000000000815250805190602001209050600060a490506060600060208b01516020808d0101516040518681528e6004820152604060248201526033604482015282606482015281608482015260c081878360008e5af281519c5060608201519450610100820160405280610b3057600080fd5b50505050604051806040016040528083815260200182815250975050505050610b8f565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b869061414b565b60405180910390fd5b5b5b5b505050935093915050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610bdf93929190614319565b6020604051808303816000875af1158015610bfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2291906138d0565b905080610c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5b906143a3565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff163384604051602401610c909291906143c3565b6040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610d1a9190613d93565b6000604051808303816000865af19150503d8060008114610d57576040519150601f19603f3d011682016040523d82523d6000602084013e610d5c565b606091505b5050905080610da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9790614438565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3386866040518463ffffffff1660e01b8152600401610ddf93929190614458565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906138d0565b505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610e6c93929190614319565b6020604051808303816000875af1158015610e8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eaf91906138d0565b905080610ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee8906144e2565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3085856040518463ffffffff1660e01b8152600401610f3093929190614458565b6020604051808303816000875af1158015610f4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7391906138d0565b506001600080828254610f869190614531565b92505081905550505050565b610f9a6120a4565b61080073ffffffffffffffffffffffffffffffffffffffff1663a03ffee184846040518363ffffffff1660e01b8152600401610fd7929190613c73565b600060405180830381865afa158015610ff4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061101d9190614795565b905092915050565b60006108009050600085858560405160240161104393929190614458565b6040516020818303038152906040527f3edab33c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000836040516020016110d59190613cdf565b6040516020818303038152906040528051906020012090506040516020016110fc90613d42565b6040516020818303038152906040528051906020012081036111c95760008373ffffffffffffffffffffffffffffffffffffffff168360405161113f9190613d93565b600060405180830381855af49150503d806000811461117a576040519150601f19603f3d011682016040523d82523d6000602084013e61117f565b606091505b50509050806111c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ba90613e1c565b60405180910390fd5b5061140e565b6040516020016111d890613f50565b6040516020818303038152906040528051906020012081036112a55760008373ffffffffffffffffffffffffffffffffffffffff168360405161121b9190613d93565b600060405180830381855afa9150503d8060008114611256576040519150601f19603f3d011682016040523d82523d6000602084013e61125b565b606091505b505090508061129f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129690613fb1565b60405180910390fd5b5061140d565b6040516020016112b49061401d565b6040516020818303038152906040528051906020012081036113835760008373ffffffffffffffffffffffffffffffffffffffff16836040516112f79190613d93565b6000604051808303816000865af19150503d8060008114611334576040519150601f19603f3d011682016040523d82523d6000602084013e611339565b606091505b505090508061137d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113749061407e565b60405180910390fd5b5061140c565b604051602001611392906140ea565b6040516020818303038152906040528051906020012081036113d05760208201825160008082846000895af2806113c857600080fd5b50505061140b565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114029061414b565b60405180910390fd5b5b5b5b50505050505050565b61141f6120c5565b61080073ffffffffffffffffffffffffffffffffffffffff16637d9f939c8585856040518463ffffffff1660e01b815260040161145e939291906147de565b600060405180830381865afa15801561147b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906114a49190614a46565b90509392505050565b61080073ffffffffffffffffffffffffffffffffffffffff166312d58dfe858585856040518563ffffffff1660e01b81526004016114ee9493929190614a8f565b6020604051808303816000875af115801561150d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153191906138d0565b5050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895303460016040518463ffffffff1660e01b815260040161157a93929190614319565b6020604051808303816000875af1158015611599573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115bd91906138d0565b9050806115ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f690614b27565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b815260040161163e93929190614458565b6020604051808303816000875af115801561165d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168191906138d0565b505050565b60005481565b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c8484846040518463ffffffff1660e01b81526004016116cb93929190614458565b6020604051808303816000875af11580156116ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170e9190614b47565b50505050565b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb8484846040518463ffffffff1660e01b815260040161175393929190614458565b6020604051808303816000875af1158015611772573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179691906138d0565b50505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b81526004016117de93929190614319565b6020604051808303816000875af11580156117fd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182191906138d0565b905080611863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185a90614b27565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b81526004016118a293929190614458565b6020604051808303816000875af11580156118c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e591906138d0565b503373ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f1935050505015801561192c573d6000803e3d6000fd5b505050565b61080073ffffffffffffffffffffffffffffffffffffffff166354b826f5858585856040518563ffffffff1660e01b81526004016119729493929190614b74565b6020604051808303816000875af1158015611991573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b59190614b47565b5050505050565b60606119c66120ed565b61080073ffffffffffffffffffffffffffffffffffffffff1663186b216785856040518363ffffffff1660e01b8152600401611a03929190614d25565b600060405180830381865afa158015611a20573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611a499190614f19565b915091509250929050565b6000611a5e61208a565b61080073ffffffffffffffffffffffffffffffffffffffff1663241774e685856040518363ffffffff1660e01b8152600401611a9b929190613c73565b600060405180830381865afa158015611ab8573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611ae19190613ea8565b915091509250929050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663fc08930c8433856040518463ffffffff1660e01b8152600401611b2d93929190614f91565b602060405180830381865afa158015611b4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6e9190614fcf565b905092915050565b6000600167ffffffffffffffff811115611b9357611b92612530565b5b604051908082528060200260200182016040528015611bc657816020015b6060815260200190600190039081611bb15790505b50905060405180606001604052806025815260200161571d6025913981600081518110611bf657611bf5614ffc565b5b6020026020010181905250600061080073ffffffffffffffffffffffffffffffffffffffff1663b60398958787856040518463ffffffff1660e01b8152600401611c42939291906150dc565b6020604051808303816000875af1158015611c61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8591906138d0565b905080611cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbe9061518c565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c3285876040518463ffffffff1660e01b8152600401611d0693929190614458565b6020604051808303816000875af1158015611d25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d499190614b47565b50505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b8152600401611d9493929190614319565b6020604051808303816000875af1158015611db3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd791906138d0565b905080611e19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1090614b27565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084600134611e469190614531565b6040518463ffffffff1660e01b8152600401611e6493929190614458565b6020604051808303816000875af1158015611e83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea791906138d0565b505050565b600061080073ffffffffffffffffffffffffffffffffffffffff166361dc5c3b8585856040518463ffffffff1660e01b8152600401611eed939291906151ac565b6020604051808303816000875af1158015611f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f3091906138d0565b905080611f72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6990615250565b60405180910390fd5b50505050565b6060611f826120ed565b61080073ffffffffffffffffffffffffffffffffffffffff166310a2851c878787876040518563ffffffff1660e01b8152600401611fc394939291906152e6565b600060405180830381865afa158015611fe0573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061200991906156a4565b9150915094509492505050565b60405180610160016040528060608152602001606081526020016000151581526020016000600381111561204d5761204c61236a565b5b8152602001600081526020016000815260200160608152602001600060070b8152602001600060070b815260200160008152602001600081525090565b604051806040016040528060608152602001600081525090565b60405180606001604052806060815260200160608152602001606081525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061215082612125565b9050919050565b61216081612145565b811461216b57600080fd5b50565b60008135905061217d81612157565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126121a8576121a7612183565b5b8235905067ffffffffffffffff8111156121c5576121c4612188565b5b6020830191508360208202830111156121e1576121e061218d565b5b9250929050565b6000819050919050565b6121fb816121e8565b811461220657600080fd5b50565b600081359050612218816121f2565b92915050565b600080600080606085870312156122385761223761211b565b5b60006122468782880161216e565b945050602085013567ffffffffffffffff81111561226757612266612120565b5b61227387828801612192565b9350935050604061228687828801612209565b91505092959194509250565b6000602082840312156122a8576122a761211b565b5b60006122b68482850161216e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156122f95780820151818401526020810190506122de565b60008484015250505050565b6000601f19601f8301169050919050565b6000612321826122bf565b61232b81856122ca565b935061233b8185602086016122db565b61234481612305565b840191505092915050565b60008115159050919050565b6123648161234f565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106123aa576123a961236a565b5b50565b60008190506123bb82612399565b919050565b60006123cb826123ad565b9050919050565b6123db816123c0565b82525050565b6123ea816121e8565b82525050565b60008160070b9050919050565b612406816123f0565b82525050565b600061016083016000830151848203600086015261242a8282612316565b915050602083015184820360208601526124448282612316565b9150506040830151612459604086018261235b565b50606083015161246c60608601826123d2565b50608083015161247f60808601826123e1565b5060a083015161249260a08601826123e1565b5060c083015184820360c08601526124aa8282612316565b91505060e08301516124bf60e08601826123fd565b506101008301516124d46101008601826123fd565b506101208301516124e96101208601826123e1565b506101408301516124fe6101408601826123e1565b508091505092915050565b60006020820190508181036000830152612523818461240c565b905092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61256882612305565b810181811067ffffffffffffffff8211171561258757612586612530565b5b80604052505050565b600061259a612111565b90506125a6828261255f565b919050565b600067ffffffffffffffff8211156125c6576125c5612530565b5b6125cf82612305565b9050602081019050919050565b82818337600083830152505050565b60006125fe6125f9846125ab565b612590565b90508281526020810184848401111561261a5761261961252b565b5b6126258482856125dc565b509392505050565b600082601f83011261264257612641612183565b5b81356126528482602086016125eb565b91505092915050565b6000806000606084860312156126745761267361211b565b5b60006126828682870161216e565b935050602084013567ffffffffffffffff8111156126a3576126a2612120565b5b6126af8682870161262d565b925050604084013567ffffffffffffffff8111156126d0576126cf612120565b5b6126dc8682870161262d565b9150509250925092565b6126ef816121e8565b82525050565b600060408301600083015184820360008601526127128282612316565b915050602083015161272760208601826123e1565b508091505092915050565b600060408201905061274760008301856126e6565b818103602083015261275981846126f5565b90509392505050565b60008060006060848603121561277b5761277a61211b565b5b60006127898682870161216e565b935050602084013567ffffffffffffffff8111156127aa576127a9612120565b5b6127b68682870161262d565b92505060406127c786828701612209565b9150509250925092565b600080604083850312156127e8576127e761211b565b5b600083013567ffffffffffffffff81111561280657612805612120565b5b6128128582860161262d565b925050602061282385828601612209565b9150509250929050565b600080604083850312156128445761284361211b565b5b60006128528582860161216e565b925050602083013567ffffffffffffffff81111561287357612872612120565b5b61287f8582860161262d565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600067ffffffffffffffff82169050919050565b6128d2816128b5565b82525050565b60c0820160008201516128ee60008501826123fd565b50602082015161290160208501826123fd565b50604082015161291460408501826123e1565b50606082015161292760608501826123e1565b50608082015161293a60808501826128c9565b5060a082015161294d60a08501826123fd565b50505050565b600061295f83836128d8565b60c08301905092915050565b6000602082019050919050565b600061298382612889565b61298d8185612894565b9350612998836128a5565b8060005b838110156129c95781516129b08882612953565b97506129bb8361296b565b92505060018101905061299c565b5085935050505092915050565b600060608301600083015184820360008601526129f38282612316565b91505060208301518482036020860152612a0d8282612316565b91505060408301518482036040860152612a278282612978565b9150508091505092915050565b60006020820190508181036000830152612a4e81846129d6565b905092915050565b60008060008060808587031215612a7057612a6f61211b565b5b6000612a7e8782880161216e565b945050602085013567ffffffffffffffff811115612a9f57612a9e612120565b5b612aab8782880161262d565b9350506040612abc87828801612209565b925050606085013567ffffffffffffffff811115612add57612adc612120565b5b612ae98782880161262d565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b608082016000820151612b3760008501826123fd565b506020820151612b4a60208501826123fd565b506040820151612b5d60408501826123e1565b506060820151612b7060608501826123e1565b50505050565b6000612b828383612b21565b60808301905092915050565b6000602082019050919050565b6000612ba682612af5565b612bb08185612b00565b9350612bbb83612b11565b8060005b83811015612bec578151612bd38882612b76565b9750612bde83612b8e565b925050600181019050612bbf565b5085935050505092915050565b60006080830160008301518482036000860152612c168282612316565b91505060208301518482036020860152612c308282612316565b91505060408301518482036040860152612c4a8282612316565b91505060608301518482036060860152612c648282612b9b565b9150508091505092915050565b60006020820190508181036000830152612c8b8184612bf9565b905092915050565b60008060008060808587031215612cad57612cac61211b565b5b6000612cbb8782880161216e565b945050602085013567ffffffffffffffff811115612cdc57612cdb612120565b5b612ce88782880161262d565b9350506040612cf987828801612209565b9250506060612d0a87828801612209565b91505092959194509250565b600060208284031215612d2c57612d2b61211b565b5b600082013567ffffffffffffffff811115612d4a57612d49612120565b5b612d568482850161262d565b91505092915050565b6000602082019050612d7460008301846126e6565b92915050565b60008060008060808587031215612d9457612d9361211b565b5b6000612da28782880161216e565b945050602085013567ffffffffffffffff811115612dc357612dc2612120565b5b612dcf8782880161262d565b935050604085013567ffffffffffffffff811115612df057612def612120565b5b612dfc8782880161262d565b9250506060612e0d87828801612209565b91505092959194509250565b600080fd5b600060a08284031215612e3457612e33612e19565b5b81905092915050565b60008060408385031215612e5457612e5361211b565b5b600083013567ffffffffffffffff811115612e7257612e71612120565b5b612e7e8582860161262d565b925050602083013567ffffffffffffffff811115612e9f57612e9e612120565b5b612eab85828601612e1e565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000610160830160008301518482036000860152612eff8282612316565b91505060208301518482036020860152612f198282612316565b9150506040830151612f2e604086018261235b565b506060830151612f4160608601826123d2565b506080830151612f5460808601826123e1565b5060a0830151612f6760a08601826123e1565b5060c083015184820360c0860152612f7f8282612316565b91505060e0830151612f9460e08601826123fd565b50610100830151612fa96101008601826123fd565b50610120830151612fbe6101208601826123e1565b50610140830151612fd36101408601826123e1565b508091505092915050565b6000612fea8383612ee1565b905092915050565b6000602082019050919050565b600061300a82612eb5565b6130148185612ec0565b93508360208202850161302685612ed1565b8060005b8581101561306257848403895281516130438582612fde565b945061304e83612ff2565b925060208a0199505060018101905061302a565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b600061309b82613074565b6130a5818561307f565b93506130b58185602086016122db565b6130be81612305565b840191505092915050565b600060408301600083015184820360008601526130e68282613090565b91505060208301516130fb60208601826128c9565b508091505092915050565b600060408201905081810360008301526131208185612fff565b9050818103602083015261313481846130c9565b90509392505050565b600080600080608085870312156131575761315661211b565b5b60006131658782880161216e565b945050602061317687828801612209565b935050604061318787828801612209565b925050606085013567ffffffffffffffff8111156131a8576131a7612120565b5b6131b48782880161262d565b91505092959194509250565b6000806000604084860312156131d9576131d861211b565b5b60006131e78682870161216e565b935050602084013567ffffffffffffffff81111561320857613207612120565b5b61321486828701612192565b92509250509250925092565b600080fd5b600080fd5b600067ffffffffffffffff82111561324557613244612530565b5b61324e82612305565b9050602081019050919050565b600061326e6132698461322a565b612590565b90508281526020810184848401111561328a5761328961252b565b5b6132958482856125dc565b509392505050565b600082601f8301126132b2576132b1612183565b5b81356132c284826020860161325b565b91505092915050565b6132d4816128b5565b81146132df57600080fd5b50565b6000813590506132f1816132cb565b92915050565b6133008161234f565b811461330b57600080fd5b50565b60008135905061331d816132f7565b92915050565b600060a0828403121561333957613338613220565b5b61334360a0612590565b9050600082013567ffffffffffffffff81111561336357613362613225565b5b61336f8482850161329d565b6000830152506020613383848285016132e2565b6020830152506040613397848285016132e2565b60408301525060606133ab8482850161330e565b60608301525060806133bf8482850161330e565b60808301525092915050565b600080600080608085870312156133e5576133e461211b565b5b60006133f38782880161216e565b945050602085013567ffffffffffffffff81111561341457613413612120565b5b6134208782880161262d565b935050604085013567ffffffffffffffff81111561344157613440612120565b5b61344d8782880161262d565b925050606085013567ffffffffffffffff81111561346e5761346d612120565b5b61347a87828801613323565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060808301600083015184820360008601526134cf8282612316565b915050602083015184820360208601526134e98282612316565b915050604083015184820360408601526135038282612316565b9150506060830151848203606086015261351d8282612b9b565b9150508091505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60a08201600082015161356c6000850182612b21565b50602082015161357f60808501826123e1565b50505050565b60006135918383613556565b60a08301905092915050565b6000602082019050919050565b60006135b58261352a565b6135bf8185613535565b93506135ca83613546565b8060005b838110156135fb5781516135e28882613585565b97506135ed8361359d565b9250506001810190506135ce565b5085935050505092915050565b6000604083016000830151848203600086015261362582826134b2565b9150506020830151848203602086015261363f82826135aa565b9150508091505092915050565b60006136588383613608565b905092915050565b6000602082019050919050565b600061367882613486565b6136828185613491565b935083602082028501613694856134a2565b8060005b858110156136d057848403895281516136b1858261364c565b94506136bc83613660565b925060208a01995050600181019050613698565b50829750879550505050505092915050565b600060408201905081810360008301526136fc818561366d565b9050818103602083015261371081846130c9565b90509392505050565b61372281612145565b82525050565b600082825260208201905092915050565b6000819050919050565b600061374f83856122ca565b935061375c8385846125dc565b61376583612305565b840190509392505050565b600061377d848484613743565b90509392505050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126137b2576137b1613790565b5b83810192508235915060208301925067ffffffffffffffff8211156137da576137d9613786565b5b6001820236038313156137f0576137ef61378b565b5b509250929050565b6000602082019050919050565b60006138118385613728565b93508360208402850161382384613739565b8060005b8781101561386957848403895261383e8284613795565b613849868284613770565b9550613854846137f8565b935060208b019a505050600181019050613827565b50829750879450505050509392505050565b60006060820190506138906000830187613719565b61389d60208301866126e6565b81810360408301526138b0818486613805565b905095945050505050565b6000815190506138ca816132f7565b92915050565b6000602082840312156138e6576138e561211b565b5b60006138f4848285016138bb565b91505092915050565b600082825260208201905092915050565b7f4661696c656420746f20617070726f7665207374616b696e67206d6574686f6460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061396a6021836138fd565b91506139758261390e565b604082019050919050565b600060208201905081810360008301526139998161395d565b9050919050565b60006020820190506139b56000830184613719565b92915050565b60006139ce6139c9846125ab565b612590565b9050828152602081018484840111156139ea576139e961252b565b5b6139f58482856122db565b509392505050565b600082601f830112613a1257613a11612183565b5b8151613a228482602086016139bb565b91505092915050565b60048110613a3857600080fd5b50565b600081519050613a4a81613a2b565b92915050565b600081519050613a5f816121f2565b92915050565b613a6e816123f0565b8114613a7957600080fd5b50565b600081519050613a8b81613a65565b92915050565b60006101608284031215613aa857613aa7613220565b5b613ab3610160612590565b9050600082015167ffffffffffffffff811115613ad357613ad2613225565b5b613adf848285016139fd565b600083015250602082015167ffffffffffffffff811115613b0357613b02613225565b5b613b0f848285016139fd565b6020830152506040613b23848285016138bb565b6040830152506060613b3784828501613a3b565b6060830152506080613b4b84828501613a50565b60808301525060a0613b5f84828501613a50565b60a08301525060c082015167ffffffffffffffff811115613b8357613b82613225565b5b613b8f848285016139fd565b60c08301525060e0613ba384828501613a7c565b60e083015250610100613bb884828501613a7c565b61010083015250610120613bce84828501613a50565b61012083015250610140613be484828501613a50565b6101408301525092915050565b600060208284031215613c0757613c0661211b565b5b600082015167ffffffffffffffff811115613c2557613c24612120565b5b613c3184828501613a91565b91505092915050565b6000613c45826122bf565b613c4f81856138fd565b9350613c5f8185602086016122db565b613c6881612305565b840191505092915050565b6000604082019050613c886000830185613719565b8181036020830152613c9a8184613c3a565b90509392505050565b600081905092915050565b6000613cb9826122bf565b613cc38185613ca3565b9350613cd38185602086016122db565b80840191505092915050565b6000613ceb8284613cae565b915081905092915050565b7f64656c656761746563616c6c0000000000000000000000000000000000000000600082015250565b6000613d2c600c83613ca3565b9150613d3782613cf6565b600c82019050919050565b6000613d4d82613d1f565b9150819050919050565b600081905092915050565b6000613d6d82613074565b613d778185613d57565b9350613d878185602086016122db565b80840191505092915050565b6000613d9f8284613d62565b915081905092915050565b7f6661696c65642064656c656761746563616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e066021836138fd565b9150613e1182613daa565b604082019050919050565b60006020820190508181036000830152613e3581613df9565b9050919050565b600060408284031215613e5257613e51613220565b5b613e5c6040612590565b9050600082015167ffffffffffffffff811115613e7c57613e7b613225565b5b613e88848285016139fd565b6000830152506020613e9c84828501613a50565b60208301525092915050565b60008060408385031215613ebf57613ebe61211b565b5b6000613ecd85828601613a50565b925050602083015167ffffffffffffffff811115613eee57613eed612120565b5b613efa85828601613e3c565b9150509250929050565b7f73746174696363616c6c00000000000000000000000000000000000000000000600082015250565b6000613f3a600a83613ca3565b9150613f4582613f04565b600a82019050919050565b6000613f5b82613f2d565b9150819050919050565b7f6661696c65642073746174696363616c6c20746f20707265636f6d70696c6500600082015250565b6000613f9b601f836138fd565b9150613fa682613f65565b602082019050919050565b60006020820190508181036000830152613fca81613f8e565b9050919050565b7f63616c6c00000000000000000000000000000000000000000000000000000000600082015250565b6000614007600483613ca3565b915061401282613fd1565b600482019050919050565b600061402882613ffa565b9150819050919050565b7f6661696c65642063616c6c20746f20707265636f6d70696c6500000000000000600082015250565b60006140686019836138fd565b915061407382614032565b602082019050919050565b600060208201905081810360008301526140978161405b565b9050919050565b7f63616c6c636f6465000000000000000000000000000000000000000000000000600082015250565b60006140d4600883613ca3565b91506140df8261409e565b600882019050919050565b60006140f5826140c7565b9150819050919050565b7f696e76616c69642063616c6c7479706500000000000000000000000000000000600082015250565b60006141356010836138fd565b9150614140826140ff565b602082019050919050565b6000602082019050818103600083015261416481614128565b9050919050565b600081549050919050565b60008190508160005260206000209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806141d257607f821691505b6020821081036141e5576141e461418b565b5b50919050565b60008190508160005260206000209050919050565b6000815461420d816141ba565b61421781866122ca565b9450600182166000811461423257600181146142485761427b565b60ff19831686528115156020028601935061427b565b614251856141eb565b60005b8381101561427357815481890152600182019150602081019050614254565b808801955050505b50505092915050565b60006142908383614200565b905092915050565b6000600182019050919050565b60006142b08261416b565b6142ba8185613728565b9350836020820285016142cc85614176565b8060005b85811015614307578484038952816142e88582614284565b94506142f383614298565b925060208a019950506001810190506142d0565b50829750879550505050505092915050565b600060608201905061432e6000830186613719565b61433b60208301856126e6565b818103604083015261434d81846142a5565b9050949350505050565b7f64656c65676174696f6e20617070726f76616c206661696c6564000000000000600082015250565b600061438d601a836138fd565b915061439882614357565b602082019050919050565b600060208201905081810360008301526143bc81614380565b9050919050565b60006040820190506143d86000830185613719565b6143e560208301846126e6565b9392505050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000614422600f836138fd565b915061442d826143ec565b602082019050919050565b6000602082019050818103600083015261445181614415565b9050919050565b600060608201905061446d6000830186613719565b818103602083015261447f8185613c3a565b905061448e60408301846126e6565b949350505050565b7f5374616b696e6720417070726f7665206661696c656400000000000000000000600082015250565b60006144cc6016836138fd565b91506144d782614496565b602082019050919050565b600060208201905081810360008301526144fb816144bf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061453c826121e8565b9150614547836121e8565b925082820190508082111561455f5761455e614502565b5b92915050565b600067ffffffffffffffff8211156145805761457f612530565b5b602082029050602081019050919050565b6000815190506145a0816132cb565b92915050565b600060c082840312156145bc576145bb613220565b5b6145c660c0612590565b905060006145d684828501613a7c565b60008301525060206145ea84828501613a7c565b60208301525060406145fe84828501613a50565b604083015250606061461284828501613a50565b606083015250608061462684828501614591565b60808301525060a061463a84828501613a7c565b60a08301525092915050565b600061465961465484614565565b612590565b90508083825260208201905060c0840283018581111561467c5761467b61218d565b5b835b818110156146a5578061469188826145a6565b84526020840193505060c08101905061467e565b5050509392505050565b600082601f8301126146c4576146c3612183565b5b81516146d4848260208601614646565b91505092915050565b6000606082840312156146f3576146f2613220565b5b6146fd6060612590565b9050600082015167ffffffffffffffff81111561471d5761471c613225565b5b614729848285016139fd565b600083015250602082015167ffffffffffffffff81111561474d5761474c613225565b5b614759848285016139fd565b602083015250604082015167ffffffffffffffff81111561477d5761477c613225565b5b614789848285016146af565b60408301525092915050565b6000602082840312156147ab576147aa61211b565b5b600082015167ffffffffffffffff8111156147c9576147c8612120565b5b6147d5848285016146dd565b91505092915050565b60006060820190506147f36000830186613719565b81810360208301526148058185613c3a565b905081810360408301526148198184613c3a565b9050949350505050565b600067ffffffffffffffff82111561483e5761483d612530565b5b602082029050602081019050919050565b60006080828403121561486557614864613220565b5b61486f6080612590565b9050600061487f84828501613a7c565b600083015250602061489384828501613a7c565b60208301525060406148a784828501613a50565b60408301525060606148bb84828501613a50565b60608301525092915050565b60006148da6148d584614823565b612590565b905080838252602082019050608084028301858111156148fd576148fc61218d565b5b835b818110156149265780614912888261484f565b8452602084019350506080810190506148ff565b5050509392505050565b600082601f83011261494557614944612183565b5b81516149558482602086016148c7565b91505092915050565b60006080828403121561497457614973613220565b5b61497e6080612590565b9050600082015167ffffffffffffffff81111561499e5761499d613225565b5b6149aa848285016139fd565b600083015250602082015167ffffffffffffffff8111156149ce576149cd613225565b5b6149da848285016139fd565b602083015250604082015167ffffffffffffffff8111156149fe576149fd613225565b5b614a0a848285016139fd565b604083015250606082015167ffffffffffffffff811115614a2e57614a2d613225565b5b614a3a84828501614930565b60608301525092915050565b600060208284031215614a5c57614a5b61211b565b5b600082015167ffffffffffffffff811115614a7a57614a79612120565b5b614a868482850161495e565b91505092915050565b6000608082019050614aa46000830187613719565b8181036020830152614ab68186613c3a565b9050614ac560408301856126e6565b614ad260608301846126e6565b95945050505050565b7f44656c656761746520417070726f7665206661696c6564000000000000000000600082015250565b6000614b116017836138fd565b9150614b1c82614adb565b602082019050919050565b60006020820190508181036000830152614b4081614b04565b9050919050565b600060208284031215614b5d57614b5c61211b565b5b6000614b6b84828501613a7c565b91505092915050565b6000608082019050614b896000830187613719565b8181036020830152614b9b8186613c3a565b90508181036040830152614baf8185613c3a565b9050614bbe60608301846126e6565b95945050505050565b60008083356001602003843603038112614be457614be3613790565b5b83810192508235915060208301925067ffffffffffffffff821115614c0c57614c0b613786565b5b600182023603831315614c2257614c2161378b565b5b509250929050565b6000614c36838561307f565b9350614c438385846125dc565b614c4c83612305565b840190509392505050565b6000614c6660208401846132e2565b905092915050565b6000614c7d602084018461330e565b905092915050565b600060a08301614c986000840184614bc7565b8583036000870152614cab838284614c2a565b92505050614cbc6020840184614c57565b614cc960208601826128c9565b50614cd76040840184614c57565b614ce460408601826128c9565b50614cf26060840184614c6e565b614cff606086018261235b565b50614d0d6080840184614c6e565b614d1a608086018261235b565b508091505092915050565b60006040820190508181036000830152614d3f8185613c3a565b90508181036020830152614d538184614c85565b90509392505050565b600067ffffffffffffffff821115614d7757614d76612530565b5b602082029050602081019050919050565b6000614d9b614d9684614d5c565b612590565b90508083825260208201905060208402830185811115614dbe57614dbd61218d565b5b835b81811015614e0557805167ffffffffffffffff811115614de357614de2612183565b5b808601614df08982613a91565b85526020850194505050602081019050614dc0565b5050509392505050565b600082601f830112614e2457614e23612183565b5b8151614e34848260208601614d88565b91505092915050565b6000614e50614e4b8461322a565b612590565b905082815260208101848484011115614e6c57614e6b61252b565b5b614e778482856122db565b509392505050565b600082601f830112614e9457614e93612183565b5b8151614ea4848260208601614e3d565b91505092915050565b600060408284031215614ec357614ec2613220565b5b614ecd6040612590565b9050600082015167ffffffffffffffff811115614eed57614eec613225565b5b614ef984828501614e7f565b6000830152506020614f0d84828501614591565b60208301525092915050565b60008060408385031215614f3057614f2f61211b565b5b600083015167ffffffffffffffff811115614f4e57614f4d612120565b5b614f5a85828601614e0f565b925050602083015167ffffffffffffffff811115614f7b57614f7a612120565b5b614f8785828601614ead565b9150509250929050565b6000606082019050614fa66000830186613719565b614fb36020830185613719565b8181036040830152614fc58184613c3a565b9050949350505050565b600060208284031215614fe557614fe461211b565b5b6000614ff384828501613a50565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b6000819050602082019050919050565b60006150528383612316565b905092915050565b6000602082019050919050565b60006150728261502b565b61507c8185613728565b93508360208202850161508e85615036565b8060005b858110156150ca57848403895281516150ab8582615046565b94506150b68361505a565b925060208a01995050600181019050615092565b50829750879550505050505092915050565b60006060820190506150f16000830186613719565b6150fe60208301856126e6565b81810360408301526151108184615067565b9050949350505050565b7f6661696c656420746f20617070726f766520756e64656c65676174696f6e206d60008201527f6574686f64000000000000000000000000000000000000000000000000000000602082015250565b60006151766025836138fd565b91506151818261511a565b604082019050919050565b600060208201905081810360008301526151a581615169565b9050919050565b60006040820190506151c16000830186613719565b81810360208301526151d4818486613805565b9050949350505050565b7f4661696c656420746f207265766f6b6520617070726f76616c20666f7220737460008201527f616b696e67206d6574686f647300000000000000000000000000000000000000602082015250565b600061523a602d836138fd565b9150615245826151de565b604082019050919050565b600060208201905081810360008301526152698161522d565b9050919050565b600060a083016000830151848203600086015261528d8282613090565b91505060208301516152a260208601826128c9565b5060408301516152b560408601826128c9565b5060608301516152c8606086018261235b565b5060808301516152db608086018261235b565b508091505092915050565b60006080820190506152fb6000830187613719565b818103602083015261530d8186613c3a565b905081810360408301526153218185613c3a565b905081810360608301526153358184615270565b905095945050505050565b600067ffffffffffffffff82111561535b5761535a612530565b5b602082029050602081019050919050565b60006080828403121561538257615381613220565b5b61538c6080612590565b9050600082015167ffffffffffffffff8111156153ac576153ab613225565b5b6153b8848285016139fd565b600083015250602082015167ffffffffffffffff8111156153dc576153db613225565b5b6153e8848285016139fd565b602083015250604082015167ffffffffffffffff81111561540c5761540b613225565b5b615418848285016139fd565b604083015250606082015167ffffffffffffffff81111561543c5761543b613225565b5b61544884828501614930565b60608301525092915050565b600067ffffffffffffffff82111561546f5761546e612530565b5b602082029050602081019050919050565b600060a0828403121561549657615495613220565b5b6154a06040612590565b905060006154b08482850161484f565b60008301525060806154c484828501613a50565b60208301525092915050565b60006154e36154de84615454565b612590565b90508083825260208201905060a084028301858111156155065761550561218d565b5b835b8181101561552f578061551b8882615480565b84526020840193505060a081019050615508565b5050509392505050565b600082601f83011261554e5761554d612183565b5b815161555e8482602086016154d0565b91505092915050565b60006040828403121561557d5761557c613220565b5b6155876040612590565b9050600082015167ffffffffffffffff8111156155a7576155a6613225565b5b6155b38482850161536c565b600083015250602082015167ffffffffffffffff8111156155d7576155d6613225565b5b6155e384828501615539565b60208301525092915050565b60006156026155fd84615340565b612590565b905080838252602082019050602084028301858111156156255761562461218d565b5b835b8181101561566c57805167ffffffffffffffff81111561564a57615649612183565b5b8086016156578982615567565b85526020850194505050602081019050615627565b5050509392505050565b600082601f83011261568b5761568a612183565b5b815161569b8482602086016155ef565b91505092915050565b600080604083850312156156bb576156ba61211b565b5b600083015167ffffffffffffffff8111156156d9576156d8612120565b5b6156e585828601615676565b925050602083015167ffffffffffffffff81111561570657615705612120565b5b61571285828601614ead565b915050925092905056fe2f636f736d6f732e7374616b696e672e763162657461312e4d7367556e64656c6567617465a2646970667358221220de0011d99ddea95ddc965752da4725396f8e9020c40f2730d27ec604f349de3e64736f6c634300081300332f636f736d6f732e7374616b696e672e763162657461312e4d736744656c6567617465", - "deployedBytecode": "0x6080604052600436106101355760003560e01c80637e51b811116100ab578063cf2753cf1161006f578063cf2753cf14610418578063ec9485df14610456578063f40a214614610493578063f5714e64146104bc578063f700dbd2146104d8578063f732b0651461050157610135565b80637e51b811146103435780638939e7831461036c5780638edb3f8b146103955780639eab6711146103b1578063b13d4242146103da57610135565b8063455b8551116100fd578063455b85511461023057806355dc4b221461026d578063570467ac146102965780635e269bfe146102d357806360deaa2a146102fc57806361bc221a1461031857610135565b80630a4433e21461013a5780631904bb2e1461016357806319b16c4c146101a057806331bcbcb3146101de5780633566cb9514610207575b600080fd5b34801561014657600080fd5b50610161600480360381019061015c919061221e565b61053f565b005b34801561016f57600080fd5b5061018a60048036038101906101859190612292565b61060e565b6040516101979190612509565b60405180910390f35b3480156101ac57600080fd5b506101c760048036038101906101c2919061265b565b61069e565b6040516101d5929190612732565b60405180910390f35b3480156101ea57600080fd5b5061020560048036038101906102009190612762565b610b9d565b005b34801561021357600080fd5b5061022e600480360381019061022991906127d1565b610e2a565b005b34801561023c57600080fd5b506102576004803603810190610252919061282d565b610f92565b6040516102649190612a34565b60405180910390f35b34801561027957600080fd5b50610294600480360381019061028f9190612a56565b611025565b005b3480156102a257600080fd5b506102bd60048036038101906102b8919061265b565b611417565b6040516102ca9190612c71565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f59190612c93565b6114ad565b005b61031660048036038101906103119190612d16565b611538565b005b34801561032457600080fd5b5061032d611686565b60405161033a9190612d5f565b60405180910390f35b34801561034f57600080fd5b5061036a60048036038101906103659190612762565b61168c565b005b34801561037857600080fd5b50610393600480360381019061038e9190612762565b611714565b005b6103af60048036038101906103aa9190612d16565b61179c565b005b3480156103bd57600080fd5b506103d860048036038101906103d39190612d7a565b611931565b005b3480156103e657600080fd5b5061040160048036038101906103fc9190612e3d565b6119bc565b60405161040f929190613106565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a919061282d565b611a54565b60405161044d929190612732565b60405180910390f35b34801561046257600080fd5b5061047d6004803603810190610478919061282d565b611aec565b60405161048a9190612d5f565b60405180910390f35b34801561049f57600080fd5b506104ba60048036038101906104b5919061313d565b611b76565b005b6104d660048036038101906104d19190612d16565b611d52565b005b3480156104e457600080fd5b506104ff60048036038101906104fa91906131c0565b611eac565b005b34801561050d57600080fd5b50610528600480360381019061052391906133cb565b611f78565b6040516105369291906136e2565b60405180910390f35b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895868487876040518563ffffffff1660e01b8152600401610582949392919061387b565b6020604051808303816000875af11580156105a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c591906138d0565b905080610607576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105fe90613980565b60405180910390fd5b5050505050565b610616612016565b61080073ffffffffffffffffffffffffffffffffffffffff1663223b3b7a836040518263ffffffff1660e01b815260040161065191906139a0565b600060405180830381865afa15801561066e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906106979190613bf1565b9050919050565b60006106a861208a565b60006108009050600086866040516024016106c4929190613c73565b6040516020818303038152906040527f241774e6000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000856040516020016107569190613cdf565b60405160208183030381529060405280519060200120905060405160200161077d90613d42565b604051602081830303815290604052805190602001208103610869576000808473ffffffffffffffffffffffffffffffffffffffff16846040516107c19190613d93565b600060405180830381855af49150503d80600081146107fc576040519150601f19603f3d011682016040523d82523d6000602084013e610801565b606091505b509150915081610846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083d90613e1c565b60405180910390fd5b8080602001905181019061085a9190613ea8565b80975081985050505050610b92565b60405160200161087890613f50565b604051602081830303815290604052805190602001208103610964576000808473ffffffffffffffffffffffffffffffffffffffff16846040516108bc9190613d93565b600060405180830381855afa9150503d80600081146108f7576040519150601f19603f3d011682016040523d82523d6000602084013e6108fc565b606091505b509150915081610941576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093890613fb1565b60405180910390fd5b808060200190518101906109559190613ea8565b80975081985050505050610b91565b6040516020016109739061401d565b604051602081830303815290604052805190602001208103610a61576000808473ffffffffffffffffffffffffffffffffffffffff16846040516109b79190613d93565b6000604051808303816000865af19150503d80600081146109f4576040519150601f19603f3d011682016040523d82523d6000602084013e6109f9565b606091505b509150915081610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a359061407e565b60405180910390fd5b80806020019051810190610a529190613ea8565b80975081985050505050610b90565b604051602001610a70906140ea565b604051602081830303815290604052805190602001208103610b545760006040518060400160405280601a81526020017f64656c65676174696f6e28616464726573732c737472696e6729000000000000815250805190602001209050600060a490506060600060208b01516020808d0101516040518681528e6004820152604060248201526033604482015282606482015281608482015260c081878360008e5af281519c5060608201519450610100820160405280610b3057600080fd5b50505050604051806040016040528083815260200182815250975050505050610b8f565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b869061414b565b60405180910390fd5b5b5b5b505050935093915050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610bdf93929190614319565b6020604051808303816000875af1158015610bfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2291906138d0565b905080610c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5b906143a3565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff163384604051602401610c909291906143c3565b6040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610d1a9190613d93565b6000604051808303816000865af19150503d8060008114610d57576040519150601f19603f3d011682016040523d82523d6000602084013e610d5c565b606091505b5050905080610da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9790614438565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3386866040518463ffffffff1660e01b8152600401610ddf93929190614458565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906138d0565b505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610e6c93929190614319565b6020604051808303816000875af1158015610e8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eaf91906138d0565b905080610ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee8906144e2565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3085856040518463ffffffff1660e01b8152600401610f3093929190614458565b6020604051808303816000875af1158015610f4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7391906138d0565b506001600080828254610f869190614531565b92505081905550505050565b610f9a6120a4565b61080073ffffffffffffffffffffffffffffffffffffffff1663a03ffee184846040518363ffffffff1660e01b8152600401610fd7929190613c73565b600060405180830381865afa158015610ff4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061101d9190614795565b905092915050565b60006108009050600085858560405160240161104393929190614458565b6040516020818303038152906040527f3edab33c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000836040516020016110d59190613cdf565b6040516020818303038152906040528051906020012090506040516020016110fc90613d42565b6040516020818303038152906040528051906020012081036111c95760008373ffffffffffffffffffffffffffffffffffffffff168360405161113f9190613d93565b600060405180830381855af49150503d806000811461117a576040519150601f19603f3d011682016040523d82523d6000602084013e61117f565b606091505b50509050806111c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ba90613e1c565b60405180910390fd5b5061140e565b6040516020016111d890613f50565b6040516020818303038152906040528051906020012081036112a55760008373ffffffffffffffffffffffffffffffffffffffff168360405161121b9190613d93565b600060405180830381855afa9150503d8060008114611256576040519150601f19603f3d011682016040523d82523d6000602084013e61125b565b606091505b505090508061129f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129690613fb1565b60405180910390fd5b5061140d565b6040516020016112b49061401d565b6040516020818303038152906040528051906020012081036113835760008373ffffffffffffffffffffffffffffffffffffffff16836040516112f79190613d93565b6000604051808303816000865af19150503d8060008114611334576040519150601f19603f3d011682016040523d82523d6000602084013e611339565b606091505b505090508061137d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113749061407e565b60405180910390fd5b5061140c565b604051602001611392906140ea565b6040516020818303038152906040528051906020012081036113d05760208201825160008082846000895af2806113c857600080fd5b50505061140b565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114029061414b565b60405180910390fd5b5b5b5b50505050505050565b61141f6120c5565b61080073ffffffffffffffffffffffffffffffffffffffff16637d9f939c8585856040518463ffffffff1660e01b815260040161145e939291906147de565b600060405180830381865afa15801561147b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906114a49190614a46565b90509392505050565b61080073ffffffffffffffffffffffffffffffffffffffff166312d58dfe858585856040518563ffffffff1660e01b81526004016114ee9493929190614a8f565b6020604051808303816000875af115801561150d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153191906138d0565b5050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895303460016040518463ffffffff1660e01b815260040161157a93929190614319565b6020604051808303816000875af1158015611599573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115bd91906138d0565b9050806115ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f690614b27565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b815260040161163e93929190614458565b6020604051808303816000875af115801561165d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168191906138d0565b505050565b60005481565b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c8484846040518463ffffffff1660e01b81526004016116cb93929190614458565b6020604051808303816000875af11580156116ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170e9190614b47565b50505050565b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb8484846040518463ffffffff1660e01b815260040161175393929190614458565b6020604051808303816000875af1158015611772573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179691906138d0565b50505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b81526004016117de93929190614319565b6020604051808303816000875af11580156117fd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182191906138d0565b905080611863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185a90614b27565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b81526004016118a293929190614458565b6020604051808303816000875af11580156118c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e591906138d0565b503373ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f1935050505015801561192c573d6000803e3d6000fd5b505050565b61080073ffffffffffffffffffffffffffffffffffffffff166354b826f5858585856040518563ffffffff1660e01b81526004016119729493929190614b74565b6020604051808303816000875af1158015611991573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b59190614b47565b5050505050565b60606119c66120ed565b61080073ffffffffffffffffffffffffffffffffffffffff1663186b216785856040518363ffffffff1660e01b8152600401611a03929190614d25565b600060405180830381865afa158015611a20573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611a499190614f19565b915091509250929050565b6000611a5e61208a565b61080073ffffffffffffffffffffffffffffffffffffffff1663241774e685856040518363ffffffff1660e01b8152600401611a9b929190613c73565b600060405180830381865afa158015611ab8573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611ae19190613ea8565b915091509250929050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663fc08930c8433856040518463ffffffff1660e01b8152600401611b2d93929190614f91565b602060405180830381865afa158015611b4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6e9190614fcf565b905092915050565b6000600167ffffffffffffffff811115611b9357611b92612530565b5b604051908082528060200260200182016040528015611bc657816020015b6060815260200190600190039081611bb15790505b50905060405180606001604052806025815260200161571d6025913981600081518110611bf657611bf5614ffc565b5b6020026020010181905250600061080073ffffffffffffffffffffffffffffffffffffffff1663b60398958787856040518463ffffffff1660e01b8152600401611c42939291906150dc565b6020604051808303816000875af1158015611c61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8591906138d0565b905080611cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbe9061518c565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c3285876040518463ffffffff1660e01b8152600401611d0693929190614458565b6020604051808303816000875af1158015611d25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d499190614b47565b50505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b8152600401611d9493929190614319565b6020604051808303816000875af1158015611db3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd791906138d0565b905080611e19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1090614b27565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084600134611e469190614531565b6040518463ffffffff1660e01b8152600401611e6493929190614458565b6020604051808303816000875af1158015611e83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea791906138d0565b505050565b600061080073ffffffffffffffffffffffffffffffffffffffff166361dc5c3b8585856040518463ffffffff1660e01b8152600401611eed939291906151ac565b6020604051808303816000875af1158015611f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f3091906138d0565b905080611f72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6990615250565b60405180910390fd5b50505050565b6060611f826120ed565b61080073ffffffffffffffffffffffffffffffffffffffff166310a2851c878787876040518563ffffffff1660e01b8152600401611fc394939291906152e6565b600060405180830381865afa158015611fe0573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061200991906156a4565b9150915094509492505050565b60405180610160016040528060608152602001606081526020016000151581526020016000600381111561204d5761204c61236a565b5b8152602001600081526020016000815260200160608152602001600060070b8152602001600060070b815260200160008152602001600081525090565b604051806040016040528060608152602001600081525090565b60405180606001604052806060815260200160608152602001606081525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061215082612125565b9050919050565b61216081612145565b811461216b57600080fd5b50565b60008135905061217d81612157565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126121a8576121a7612183565b5b8235905067ffffffffffffffff8111156121c5576121c4612188565b5b6020830191508360208202830111156121e1576121e061218d565b5b9250929050565b6000819050919050565b6121fb816121e8565b811461220657600080fd5b50565b600081359050612218816121f2565b92915050565b600080600080606085870312156122385761223761211b565b5b60006122468782880161216e565b945050602085013567ffffffffffffffff81111561226757612266612120565b5b61227387828801612192565b9350935050604061228687828801612209565b91505092959194509250565b6000602082840312156122a8576122a761211b565b5b60006122b68482850161216e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156122f95780820151818401526020810190506122de565b60008484015250505050565b6000601f19601f8301169050919050565b6000612321826122bf565b61232b81856122ca565b935061233b8185602086016122db565b61234481612305565b840191505092915050565b60008115159050919050565b6123648161234f565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106123aa576123a961236a565b5b50565b60008190506123bb82612399565b919050565b60006123cb826123ad565b9050919050565b6123db816123c0565b82525050565b6123ea816121e8565b82525050565b60008160070b9050919050565b612406816123f0565b82525050565b600061016083016000830151848203600086015261242a8282612316565b915050602083015184820360208601526124448282612316565b9150506040830151612459604086018261235b565b50606083015161246c60608601826123d2565b50608083015161247f60808601826123e1565b5060a083015161249260a08601826123e1565b5060c083015184820360c08601526124aa8282612316565b91505060e08301516124bf60e08601826123fd565b506101008301516124d46101008601826123fd565b506101208301516124e96101208601826123e1565b506101408301516124fe6101408601826123e1565b508091505092915050565b60006020820190508181036000830152612523818461240c565b905092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61256882612305565b810181811067ffffffffffffffff8211171561258757612586612530565b5b80604052505050565b600061259a612111565b90506125a6828261255f565b919050565b600067ffffffffffffffff8211156125c6576125c5612530565b5b6125cf82612305565b9050602081019050919050565b82818337600083830152505050565b60006125fe6125f9846125ab565b612590565b90508281526020810184848401111561261a5761261961252b565b5b6126258482856125dc565b509392505050565b600082601f83011261264257612641612183565b5b81356126528482602086016125eb565b91505092915050565b6000806000606084860312156126745761267361211b565b5b60006126828682870161216e565b935050602084013567ffffffffffffffff8111156126a3576126a2612120565b5b6126af8682870161262d565b925050604084013567ffffffffffffffff8111156126d0576126cf612120565b5b6126dc8682870161262d565b9150509250925092565b6126ef816121e8565b82525050565b600060408301600083015184820360008601526127128282612316565b915050602083015161272760208601826123e1565b508091505092915050565b600060408201905061274760008301856126e6565b818103602083015261275981846126f5565b90509392505050565b60008060006060848603121561277b5761277a61211b565b5b60006127898682870161216e565b935050602084013567ffffffffffffffff8111156127aa576127a9612120565b5b6127b68682870161262d565b92505060406127c786828701612209565b9150509250925092565b600080604083850312156127e8576127e761211b565b5b600083013567ffffffffffffffff81111561280657612805612120565b5b6128128582860161262d565b925050602061282385828601612209565b9150509250929050565b600080604083850312156128445761284361211b565b5b60006128528582860161216e565b925050602083013567ffffffffffffffff81111561287357612872612120565b5b61287f8582860161262d565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600067ffffffffffffffff82169050919050565b6128d2816128b5565b82525050565b60c0820160008201516128ee60008501826123fd565b50602082015161290160208501826123fd565b50604082015161291460408501826123e1565b50606082015161292760608501826123e1565b50608082015161293a60808501826128c9565b5060a082015161294d60a08501826123fd565b50505050565b600061295f83836128d8565b60c08301905092915050565b6000602082019050919050565b600061298382612889565b61298d8185612894565b9350612998836128a5565b8060005b838110156129c95781516129b08882612953565b97506129bb8361296b565b92505060018101905061299c565b5085935050505092915050565b600060608301600083015184820360008601526129f38282612316565b91505060208301518482036020860152612a0d8282612316565b91505060408301518482036040860152612a278282612978565b9150508091505092915050565b60006020820190508181036000830152612a4e81846129d6565b905092915050565b60008060008060808587031215612a7057612a6f61211b565b5b6000612a7e8782880161216e565b945050602085013567ffffffffffffffff811115612a9f57612a9e612120565b5b612aab8782880161262d565b9350506040612abc87828801612209565b925050606085013567ffffffffffffffff811115612add57612adc612120565b5b612ae98782880161262d565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b608082016000820151612b3760008501826123fd565b506020820151612b4a60208501826123fd565b506040820151612b5d60408501826123e1565b506060820151612b7060608501826123e1565b50505050565b6000612b828383612b21565b60808301905092915050565b6000602082019050919050565b6000612ba682612af5565b612bb08185612b00565b9350612bbb83612b11565b8060005b83811015612bec578151612bd38882612b76565b9750612bde83612b8e565b925050600181019050612bbf565b5085935050505092915050565b60006080830160008301518482036000860152612c168282612316565b91505060208301518482036020860152612c308282612316565b91505060408301518482036040860152612c4a8282612316565b91505060608301518482036060860152612c648282612b9b565b9150508091505092915050565b60006020820190508181036000830152612c8b8184612bf9565b905092915050565b60008060008060808587031215612cad57612cac61211b565b5b6000612cbb8782880161216e565b945050602085013567ffffffffffffffff811115612cdc57612cdb612120565b5b612ce88782880161262d565b9350506040612cf987828801612209565b9250506060612d0a87828801612209565b91505092959194509250565b600060208284031215612d2c57612d2b61211b565b5b600082013567ffffffffffffffff811115612d4a57612d49612120565b5b612d568482850161262d565b91505092915050565b6000602082019050612d7460008301846126e6565b92915050565b60008060008060808587031215612d9457612d9361211b565b5b6000612da28782880161216e565b945050602085013567ffffffffffffffff811115612dc357612dc2612120565b5b612dcf8782880161262d565b935050604085013567ffffffffffffffff811115612df057612def612120565b5b612dfc8782880161262d565b9250506060612e0d87828801612209565b91505092959194509250565b600080fd5b600060a08284031215612e3457612e33612e19565b5b81905092915050565b60008060408385031215612e5457612e5361211b565b5b600083013567ffffffffffffffff811115612e7257612e71612120565b5b612e7e8582860161262d565b925050602083013567ffffffffffffffff811115612e9f57612e9e612120565b5b612eab85828601612e1e565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000610160830160008301518482036000860152612eff8282612316565b91505060208301518482036020860152612f198282612316565b9150506040830151612f2e604086018261235b565b506060830151612f4160608601826123d2565b506080830151612f5460808601826123e1565b5060a0830151612f6760a08601826123e1565b5060c083015184820360c0860152612f7f8282612316565b91505060e0830151612f9460e08601826123fd565b50610100830151612fa96101008601826123fd565b50610120830151612fbe6101208601826123e1565b50610140830151612fd36101408601826123e1565b508091505092915050565b6000612fea8383612ee1565b905092915050565b6000602082019050919050565b600061300a82612eb5565b6130148185612ec0565b93508360208202850161302685612ed1565b8060005b8581101561306257848403895281516130438582612fde565b945061304e83612ff2565b925060208a0199505060018101905061302a565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b600061309b82613074565b6130a5818561307f565b93506130b58185602086016122db565b6130be81612305565b840191505092915050565b600060408301600083015184820360008601526130e68282613090565b91505060208301516130fb60208601826128c9565b508091505092915050565b600060408201905081810360008301526131208185612fff565b9050818103602083015261313481846130c9565b90509392505050565b600080600080608085870312156131575761315661211b565b5b60006131658782880161216e565b945050602061317687828801612209565b935050604061318787828801612209565b925050606085013567ffffffffffffffff8111156131a8576131a7612120565b5b6131b48782880161262d565b91505092959194509250565b6000806000604084860312156131d9576131d861211b565b5b60006131e78682870161216e565b935050602084013567ffffffffffffffff81111561320857613207612120565b5b61321486828701612192565b92509250509250925092565b600080fd5b600080fd5b600067ffffffffffffffff82111561324557613244612530565b5b61324e82612305565b9050602081019050919050565b600061326e6132698461322a565b612590565b90508281526020810184848401111561328a5761328961252b565b5b6132958482856125dc565b509392505050565b600082601f8301126132b2576132b1612183565b5b81356132c284826020860161325b565b91505092915050565b6132d4816128b5565b81146132df57600080fd5b50565b6000813590506132f1816132cb565b92915050565b6133008161234f565b811461330b57600080fd5b50565b60008135905061331d816132f7565b92915050565b600060a0828403121561333957613338613220565b5b61334360a0612590565b9050600082013567ffffffffffffffff81111561336357613362613225565b5b61336f8482850161329d565b6000830152506020613383848285016132e2565b6020830152506040613397848285016132e2565b60408301525060606133ab8482850161330e565b60608301525060806133bf8482850161330e565b60808301525092915050565b600080600080608085870312156133e5576133e461211b565b5b60006133f38782880161216e565b945050602085013567ffffffffffffffff81111561341457613413612120565b5b6134208782880161262d565b935050604085013567ffffffffffffffff81111561344157613440612120565b5b61344d8782880161262d565b925050606085013567ffffffffffffffff81111561346e5761346d612120565b5b61347a87828801613323565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060808301600083015184820360008601526134cf8282612316565b915050602083015184820360208601526134e98282612316565b915050604083015184820360408601526135038282612316565b9150506060830151848203606086015261351d8282612b9b565b9150508091505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60a08201600082015161356c6000850182612b21565b50602082015161357f60808501826123e1565b50505050565b60006135918383613556565b60a08301905092915050565b6000602082019050919050565b60006135b58261352a565b6135bf8185613535565b93506135ca83613546565b8060005b838110156135fb5781516135e28882613585565b97506135ed8361359d565b9250506001810190506135ce565b5085935050505092915050565b6000604083016000830151848203600086015261362582826134b2565b9150506020830151848203602086015261363f82826135aa565b9150508091505092915050565b60006136588383613608565b905092915050565b6000602082019050919050565b600061367882613486565b6136828185613491565b935083602082028501613694856134a2565b8060005b858110156136d057848403895281516136b1858261364c565b94506136bc83613660565b925060208a01995050600181019050613698565b50829750879550505050505092915050565b600060408201905081810360008301526136fc818561366d565b9050818103602083015261371081846130c9565b90509392505050565b61372281612145565b82525050565b600082825260208201905092915050565b6000819050919050565b600061374f83856122ca565b935061375c8385846125dc565b61376583612305565b840190509392505050565b600061377d848484613743565b90509392505050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126137b2576137b1613790565b5b83810192508235915060208301925067ffffffffffffffff8211156137da576137d9613786565b5b6001820236038313156137f0576137ef61378b565b5b509250929050565b6000602082019050919050565b60006138118385613728565b93508360208402850161382384613739565b8060005b8781101561386957848403895261383e8284613795565b613849868284613770565b9550613854846137f8565b935060208b019a505050600181019050613827565b50829750879450505050509392505050565b60006060820190506138906000830187613719565b61389d60208301866126e6565b81810360408301526138b0818486613805565b905095945050505050565b6000815190506138ca816132f7565b92915050565b6000602082840312156138e6576138e561211b565b5b60006138f4848285016138bb565b91505092915050565b600082825260208201905092915050565b7f4661696c656420746f20617070726f7665207374616b696e67206d6574686f6460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061396a6021836138fd565b91506139758261390e565b604082019050919050565b600060208201905081810360008301526139998161395d565b9050919050565b60006020820190506139b56000830184613719565b92915050565b60006139ce6139c9846125ab565b612590565b9050828152602081018484840111156139ea576139e961252b565b5b6139f58482856122db565b509392505050565b600082601f830112613a1257613a11612183565b5b8151613a228482602086016139bb565b91505092915050565b60048110613a3857600080fd5b50565b600081519050613a4a81613a2b565b92915050565b600081519050613a5f816121f2565b92915050565b613a6e816123f0565b8114613a7957600080fd5b50565b600081519050613a8b81613a65565b92915050565b60006101608284031215613aa857613aa7613220565b5b613ab3610160612590565b9050600082015167ffffffffffffffff811115613ad357613ad2613225565b5b613adf848285016139fd565b600083015250602082015167ffffffffffffffff811115613b0357613b02613225565b5b613b0f848285016139fd565b6020830152506040613b23848285016138bb565b6040830152506060613b3784828501613a3b565b6060830152506080613b4b84828501613a50565b60808301525060a0613b5f84828501613a50565b60a08301525060c082015167ffffffffffffffff811115613b8357613b82613225565b5b613b8f848285016139fd565b60c08301525060e0613ba384828501613a7c565b60e083015250610100613bb884828501613a7c565b61010083015250610120613bce84828501613a50565b61012083015250610140613be484828501613a50565b6101408301525092915050565b600060208284031215613c0757613c0661211b565b5b600082015167ffffffffffffffff811115613c2557613c24612120565b5b613c3184828501613a91565b91505092915050565b6000613c45826122bf565b613c4f81856138fd565b9350613c5f8185602086016122db565b613c6881612305565b840191505092915050565b6000604082019050613c886000830185613719565b8181036020830152613c9a8184613c3a565b90509392505050565b600081905092915050565b6000613cb9826122bf565b613cc38185613ca3565b9350613cd38185602086016122db565b80840191505092915050565b6000613ceb8284613cae565b915081905092915050565b7f64656c656761746563616c6c0000000000000000000000000000000000000000600082015250565b6000613d2c600c83613ca3565b9150613d3782613cf6565b600c82019050919050565b6000613d4d82613d1f565b9150819050919050565b600081905092915050565b6000613d6d82613074565b613d778185613d57565b9350613d878185602086016122db565b80840191505092915050565b6000613d9f8284613d62565b915081905092915050565b7f6661696c65642064656c656761746563616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e066021836138fd565b9150613e1182613daa565b604082019050919050565b60006020820190508181036000830152613e3581613df9565b9050919050565b600060408284031215613e5257613e51613220565b5b613e5c6040612590565b9050600082015167ffffffffffffffff811115613e7c57613e7b613225565b5b613e88848285016139fd565b6000830152506020613e9c84828501613a50565b60208301525092915050565b60008060408385031215613ebf57613ebe61211b565b5b6000613ecd85828601613a50565b925050602083015167ffffffffffffffff811115613eee57613eed612120565b5b613efa85828601613e3c565b9150509250929050565b7f73746174696363616c6c00000000000000000000000000000000000000000000600082015250565b6000613f3a600a83613ca3565b9150613f4582613f04565b600a82019050919050565b6000613f5b82613f2d565b9150819050919050565b7f6661696c65642073746174696363616c6c20746f20707265636f6d70696c6500600082015250565b6000613f9b601f836138fd565b9150613fa682613f65565b602082019050919050565b60006020820190508181036000830152613fca81613f8e565b9050919050565b7f63616c6c00000000000000000000000000000000000000000000000000000000600082015250565b6000614007600483613ca3565b915061401282613fd1565b600482019050919050565b600061402882613ffa565b9150819050919050565b7f6661696c65642063616c6c20746f20707265636f6d70696c6500000000000000600082015250565b60006140686019836138fd565b915061407382614032565b602082019050919050565b600060208201905081810360008301526140978161405b565b9050919050565b7f63616c6c636f6465000000000000000000000000000000000000000000000000600082015250565b60006140d4600883613ca3565b91506140df8261409e565b600882019050919050565b60006140f5826140c7565b9150819050919050565b7f696e76616c69642063616c6c7479706500000000000000000000000000000000600082015250565b60006141356010836138fd565b9150614140826140ff565b602082019050919050565b6000602082019050818103600083015261416481614128565b9050919050565b600081549050919050565b60008190508160005260206000209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806141d257607f821691505b6020821081036141e5576141e461418b565b5b50919050565b60008190508160005260206000209050919050565b6000815461420d816141ba565b61421781866122ca565b9450600182166000811461423257600181146142485761427b565b60ff19831686528115156020028601935061427b565b614251856141eb565b60005b8381101561427357815481890152600182019150602081019050614254565b808801955050505b50505092915050565b60006142908383614200565b905092915050565b6000600182019050919050565b60006142b08261416b565b6142ba8185613728565b9350836020820285016142cc85614176565b8060005b85811015614307578484038952816142e88582614284565b94506142f383614298565b925060208a019950506001810190506142d0565b50829750879550505050505092915050565b600060608201905061432e6000830186613719565b61433b60208301856126e6565b818103604083015261434d81846142a5565b9050949350505050565b7f64656c65676174696f6e20617070726f76616c206661696c6564000000000000600082015250565b600061438d601a836138fd565b915061439882614357565b602082019050919050565b600060208201905081810360008301526143bc81614380565b9050919050565b60006040820190506143d86000830185613719565b6143e560208301846126e6565b9392505050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000614422600f836138fd565b915061442d826143ec565b602082019050919050565b6000602082019050818103600083015261445181614415565b9050919050565b600060608201905061446d6000830186613719565b818103602083015261447f8185613c3a565b905061448e60408301846126e6565b949350505050565b7f5374616b696e6720417070726f7665206661696c656400000000000000000000600082015250565b60006144cc6016836138fd565b91506144d782614496565b602082019050919050565b600060208201905081810360008301526144fb816144bf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061453c826121e8565b9150614547836121e8565b925082820190508082111561455f5761455e614502565b5b92915050565b600067ffffffffffffffff8211156145805761457f612530565b5b602082029050602081019050919050565b6000815190506145a0816132cb565b92915050565b600060c082840312156145bc576145bb613220565b5b6145c660c0612590565b905060006145d684828501613a7c565b60008301525060206145ea84828501613a7c565b60208301525060406145fe84828501613a50565b604083015250606061461284828501613a50565b606083015250608061462684828501614591565b60808301525060a061463a84828501613a7c565b60a08301525092915050565b600061465961465484614565565b612590565b90508083825260208201905060c0840283018581111561467c5761467b61218d565b5b835b818110156146a5578061469188826145a6565b84526020840193505060c08101905061467e565b5050509392505050565b600082601f8301126146c4576146c3612183565b5b81516146d4848260208601614646565b91505092915050565b6000606082840312156146f3576146f2613220565b5b6146fd6060612590565b9050600082015167ffffffffffffffff81111561471d5761471c613225565b5b614729848285016139fd565b600083015250602082015167ffffffffffffffff81111561474d5761474c613225565b5b614759848285016139fd565b602083015250604082015167ffffffffffffffff81111561477d5761477c613225565b5b614789848285016146af565b60408301525092915050565b6000602082840312156147ab576147aa61211b565b5b600082015167ffffffffffffffff8111156147c9576147c8612120565b5b6147d5848285016146dd565b91505092915050565b60006060820190506147f36000830186613719565b81810360208301526148058185613c3a565b905081810360408301526148198184613c3a565b9050949350505050565b600067ffffffffffffffff82111561483e5761483d612530565b5b602082029050602081019050919050565b60006080828403121561486557614864613220565b5b61486f6080612590565b9050600061487f84828501613a7c565b600083015250602061489384828501613a7c565b60208301525060406148a784828501613a50565b60408301525060606148bb84828501613a50565b60608301525092915050565b60006148da6148d584614823565b612590565b905080838252602082019050608084028301858111156148fd576148fc61218d565b5b835b818110156149265780614912888261484f565b8452602084019350506080810190506148ff565b5050509392505050565b600082601f83011261494557614944612183565b5b81516149558482602086016148c7565b91505092915050565b60006080828403121561497457614973613220565b5b61497e6080612590565b9050600082015167ffffffffffffffff81111561499e5761499d613225565b5b6149aa848285016139fd565b600083015250602082015167ffffffffffffffff8111156149ce576149cd613225565b5b6149da848285016139fd565b602083015250604082015167ffffffffffffffff8111156149fe576149fd613225565b5b614a0a848285016139fd565b604083015250606082015167ffffffffffffffff811115614a2e57614a2d613225565b5b614a3a84828501614930565b60608301525092915050565b600060208284031215614a5c57614a5b61211b565b5b600082015167ffffffffffffffff811115614a7a57614a79612120565b5b614a868482850161495e565b91505092915050565b6000608082019050614aa46000830187613719565b8181036020830152614ab68186613c3a565b9050614ac560408301856126e6565b614ad260608301846126e6565b95945050505050565b7f44656c656761746520417070726f7665206661696c6564000000000000000000600082015250565b6000614b116017836138fd565b9150614b1c82614adb565b602082019050919050565b60006020820190508181036000830152614b4081614b04565b9050919050565b600060208284031215614b5d57614b5c61211b565b5b6000614b6b84828501613a7c565b91505092915050565b6000608082019050614b896000830187613719565b8181036020830152614b9b8186613c3a565b90508181036040830152614baf8185613c3a565b9050614bbe60608301846126e6565b95945050505050565b60008083356001602003843603038112614be457614be3613790565b5b83810192508235915060208301925067ffffffffffffffff821115614c0c57614c0b613786565b5b600182023603831315614c2257614c2161378b565b5b509250929050565b6000614c36838561307f565b9350614c438385846125dc565b614c4c83612305565b840190509392505050565b6000614c6660208401846132e2565b905092915050565b6000614c7d602084018461330e565b905092915050565b600060a08301614c986000840184614bc7565b8583036000870152614cab838284614c2a565b92505050614cbc6020840184614c57565b614cc960208601826128c9565b50614cd76040840184614c57565b614ce460408601826128c9565b50614cf26060840184614c6e565b614cff606086018261235b565b50614d0d6080840184614c6e565b614d1a608086018261235b565b508091505092915050565b60006040820190508181036000830152614d3f8185613c3a565b90508181036020830152614d538184614c85565b90509392505050565b600067ffffffffffffffff821115614d7757614d76612530565b5b602082029050602081019050919050565b6000614d9b614d9684614d5c565b612590565b90508083825260208201905060208402830185811115614dbe57614dbd61218d565b5b835b81811015614e0557805167ffffffffffffffff811115614de357614de2612183565b5b808601614df08982613a91565b85526020850194505050602081019050614dc0565b5050509392505050565b600082601f830112614e2457614e23612183565b5b8151614e34848260208601614d88565b91505092915050565b6000614e50614e4b8461322a565b612590565b905082815260208101848484011115614e6c57614e6b61252b565b5b614e778482856122db565b509392505050565b600082601f830112614e9457614e93612183565b5b8151614ea4848260208601614e3d565b91505092915050565b600060408284031215614ec357614ec2613220565b5b614ecd6040612590565b9050600082015167ffffffffffffffff811115614eed57614eec613225565b5b614ef984828501614e7f565b6000830152506020614f0d84828501614591565b60208301525092915050565b60008060408385031215614f3057614f2f61211b565b5b600083015167ffffffffffffffff811115614f4e57614f4d612120565b5b614f5a85828601614e0f565b925050602083015167ffffffffffffffff811115614f7b57614f7a612120565b5b614f8785828601614ead565b9150509250929050565b6000606082019050614fa66000830186613719565b614fb36020830185613719565b8181036040830152614fc58184613c3a565b9050949350505050565b600060208284031215614fe557614fe461211b565b5b6000614ff384828501613a50565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b6000819050602082019050919050565b60006150528383612316565b905092915050565b6000602082019050919050565b60006150728261502b565b61507c8185613728565b93508360208202850161508e85615036565b8060005b858110156150ca57848403895281516150ab8582615046565b94506150b68361505a565b925060208a01995050600181019050615092565b50829750879550505050505092915050565b60006060820190506150f16000830186613719565b6150fe60208301856126e6565b81810360408301526151108184615067565b9050949350505050565b7f6661696c656420746f20617070726f766520756e64656c65676174696f6e206d60008201527f6574686f64000000000000000000000000000000000000000000000000000000602082015250565b60006151766025836138fd565b91506151818261511a565b604082019050919050565b600060208201905081810360008301526151a581615169565b9050919050565b60006040820190506151c16000830186613719565b81810360208301526151d4818486613805565b9050949350505050565b7f4661696c656420746f207265766f6b6520617070726f76616c20666f7220737460008201527f616b696e67206d6574686f647300000000000000000000000000000000000000602082015250565b600061523a602d836138fd565b9150615245826151de565b604082019050919050565b600060208201905081810360008301526152698161522d565b9050919050565b600060a083016000830151848203600086015261528d8282613090565b91505060208301516152a260208601826128c9565b5060408301516152b560408601826128c9565b5060608301516152c8606086018261235b565b5060808301516152db608086018261235b565b508091505092915050565b60006080820190506152fb6000830187613719565b818103602083015261530d8186613c3a565b905081810360408301526153218185613c3a565b905081810360608301526153358184615270565b905095945050505050565b600067ffffffffffffffff82111561535b5761535a612530565b5b602082029050602081019050919050565b60006080828403121561538257615381613220565b5b61538c6080612590565b9050600082015167ffffffffffffffff8111156153ac576153ab613225565b5b6153b8848285016139fd565b600083015250602082015167ffffffffffffffff8111156153dc576153db613225565b5b6153e8848285016139fd565b602083015250604082015167ffffffffffffffff81111561540c5761540b613225565b5b615418848285016139fd565b604083015250606082015167ffffffffffffffff81111561543c5761543b613225565b5b61544884828501614930565b60608301525092915050565b600067ffffffffffffffff82111561546f5761546e612530565b5b602082029050602081019050919050565b600060a0828403121561549657615495613220565b5b6154a06040612590565b905060006154b08482850161484f565b60008301525060806154c484828501613a50565b60208301525092915050565b60006154e36154de84615454565b612590565b90508083825260208201905060a084028301858111156155065761550561218d565b5b835b8181101561552f578061551b8882615480565b84526020840193505060a081019050615508565b5050509392505050565b600082601f83011261554e5761554d612183565b5b815161555e8482602086016154d0565b91505092915050565b60006040828403121561557d5761557c613220565b5b6155876040612590565b9050600082015167ffffffffffffffff8111156155a7576155a6613225565b5b6155b38482850161536c565b600083015250602082015167ffffffffffffffff8111156155d7576155d6613225565b5b6155e384828501615539565b60208301525092915050565b60006156026155fd84615340565b612590565b905080838252602082019050602084028301858111156156255761562461218d565b5b835b8181101561566c57805167ffffffffffffffff81111561564a57615649612183565b5b8086016156578982615567565b85526020850194505050602081019050615627565b5050509392505050565b600082601f83011261568b5761568a612183565b5b815161569b8482602086016155ef565b91505092915050565b600080604083850312156156bb576156ba61211b565b5b600083015167ffffffffffffffff8111156156d9576156d8612120565b5b6156e585828601615676565b925050602083015167ffffffffffffffff81111561570657615705612120565b5b61571285828601614ead565b915050925092905056fe2f636f736d6f732e7374616b696e672e763162657461312e4d7367556e64656c6567617465a2646970667358221220de0011d99ddea95ddc965752da4725396f8e9020c40f2730d27ec604f349de3e64736f6c63430008130033", + "bytecode": "0x6080604052604051806020016040528060405180606001604052806023815260200162005c286023913981525060019060016200003e92919062000053565b503480156200004c57600080fd5b50620004a1565b828054828255906000526020600020908101928215620000a0579160200282015b828111156200009f5782518290816200008e9190620003ba565b509160200191906001019062000074565b5b509050620000af9190620000b3565b5090565b5b80821115620000d75760008181620000cd9190620000db565b50600101620000b4565b5090565b508054620000e990620001a9565b6000825580601f10620000fd57506200011e565b601f0160209004906000526020600020908101906200011d919062000121565b5b50565b5b808211156200013c57600081600090555060010162000122565b5090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620001c257607f821691505b602082108103620001d857620001d76200017a565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620002427fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000203565b6200024e868362000203565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200029b620002956200028f8462000266565b62000270565b62000266565b9050919050565b6000819050919050565b620002b7836200027a565b620002cf620002c682620002a2565b84845462000210565b825550505050565b600090565b620002e6620002d7565b620002f3818484620002ac565b505050565b5b818110156200031b576200030f600082620002dc565b600181019050620002f9565b5050565b601f8211156200036a576200033481620001de565b6200033f84620001f3565b810160208510156200034f578190505b620003676200035e85620001f3565b830182620002f8565b50505b505050565b600082821c905092915050565b60006200038f600019846008026200036f565b1980831691505092915050565b6000620003aa83836200037c565b9150826002028217905092915050565b620003c58262000140565b67ffffffffffffffff811115620003e157620003e06200014b565b5b620003ed8254620001a9565b620003fa8282856200031f565b600060209050601f8311600181146200043257600084156200041d578287015190505b6200042985826200039c565b86555062000499565b601f1984166200044286620001de565b60005b828110156200046c5784890151825560018201915060208501945060208101905062000445565b868310156200048c578489015162000488601f8916826200037c565b8355505b6001600288020188555050505b505050505050565b61577780620004b16000396000f3fe6080604052600436106101355760003560e01c80637e51b811116100ab578063cf2753cf1161006f578063cf2753cf14610418578063ec9485df14610456578063f40a214614610493578063f5714e64146104bc578063f700dbd2146104d8578063f732b0651461050157610135565b80637e51b811146103435780638939e7831461036c5780638edb3f8b146103955780639eab6711146103b1578063b13d4242146103da57610135565b8063455b8551116100fd578063455b85511461023057806355dc4b221461026d578063570467ac146102965780635e269bfe146102d357806360deaa2a146102fc57806361bc221a1461031857610135565b80630a4433e21461013a5780631904bb2e1461016357806319b16c4c146101a057806331bcbcb3146101de5780633566cb9514610207575b600080fd5b34801561014657600080fd5b50610161600480360381019061015c919061221e565b61053f565b005b34801561016f57600080fd5b5061018a60048036038101906101859190612292565b61060e565b6040516101979190612509565b60405180910390f35b3480156101ac57600080fd5b506101c760048036038101906101c2919061265b565b61069e565b6040516101d5929190612732565b60405180910390f35b3480156101ea57600080fd5b5061020560048036038101906102009190612762565b610b9d565b005b34801561021357600080fd5b5061022e600480360381019061022991906127d1565b610e2a565b005b34801561023c57600080fd5b506102576004803603810190610252919061282d565b610f92565b6040516102649190612a34565b60405180910390f35b34801561027957600080fd5b50610294600480360381019061028f9190612a56565b611025565b005b3480156102a257600080fd5b506102bd60048036038101906102b8919061265b565b611417565b6040516102ca9190612c71565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f59190612c93565b6114ad565b005b61031660048036038101906103119190612d16565b611538565b005b34801561032457600080fd5b5061032d611686565b60405161033a9190612d5f565b60405180910390f35b34801561034f57600080fd5b5061036a60048036038101906103659190612762565b61168c565b005b34801561037857600080fd5b50610393600480360381019061038e9190612762565b611714565b005b6103af60048036038101906103aa9190612d16565b61179c565b005b3480156103bd57600080fd5b506103d860048036038101906103d39190612d7a565b611931565b005b3480156103e657600080fd5b5061040160048036038101906103fc9190612e3d565b6119bc565b60405161040f929190613106565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a919061282d565b611a54565b60405161044d929190612732565b60405180910390f35b34801561046257600080fd5b5061047d6004803603810190610478919061282d565b611aec565b60405161048a9190612d5f565b60405180910390f35b34801561049f57600080fd5b506104ba60048036038101906104b5919061313d565b611b76565b005b6104d660048036038101906104d19190612d16565b611d52565b005b3480156104e457600080fd5b506104ff60048036038101906104fa91906131c0565b611eac565b005b34801561050d57600080fd5b50610528600480360381019061052391906133cb565b611f78565b6040516105369291906136e2565b60405180910390f35b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895868487876040518563ffffffff1660e01b8152600401610582949392919061387b565b6020604051808303816000875af11580156105a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c591906138d0565b905080610607576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105fe90613980565b60405180910390fd5b5050505050565b610616612016565b61080073ffffffffffffffffffffffffffffffffffffffff1663223b3b7a836040518263ffffffff1660e01b815260040161065191906139a0565b600060405180830381865afa15801561066e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906106979190613bf1565b9050919050565b60006106a861208a565b60006108009050600086866040516024016106c4929190613c73565b6040516020818303038152906040527f241774e6000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000856040516020016107569190613cdf565b60405160208183030381529060405280519060200120905060405160200161077d90613d42565b604051602081830303815290604052805190602001208103610869576000808473ffffffffffffffffffffffffffffffffffffffff16846040516107c19190613d93565b600060405180830381855af49150503d80600081146107fc576040519150601f19603f3d011682016040523d82523d6000602084013e610801565b606091505b509150915081610846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083d90613e1c565b60405180910390fd5b8080602001905181019061085a9190613ea8565b80975081985050505050610b92565b60405160200161087890613f50565b604051602081830303815290604052805190602001208103610964576000808473ffffffffffffffffffffffffffffffffffffffff16846040516108bc9190613d93565b600060405180830381855afa9150503d80600081146108f7576040519150601f19603f3d011682016040523d82523d6000602084013e6108fc565b606091505b509150915081610941576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093890613fb1565b60405180910390fd5b808060200190518101906109559190613ea8565b80975081985050505050610b91565b6040516020016109739061401d565b604051602081830303815290604052805190602001208103610a61576000808473ffffffffffffffffffffffffffffffffffffffff16846040516109b79190613d93565b6000604051808303816000865af19150503d80600081146109f4576040519150601f19603f3d011682016040523d82523d6000602084013e6109f9565b606091505b509150915081610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a359061407e565b60405180910390fd5b80806020019051810190610a529190613ea8565b80975081985050505050610b90565b604051602001610a70906140ea565b604051602081830303815290604052805190602001208103610b545760006040518060400160405280601a81526020017f64656c65676174696f6e28616464726573732c737472696e6729000000000000815250805190602001209050600060a490506060600060208b01516020808d0101516040518681528e6004820152604060248201526033604482015282606482015281608482015260c081878360008e5af281519c5060608201519450610100820160405280610b3057600080fd5b50505050604051806040016040528083815260200182815250975050505050610b8f565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b869061414b565b60405180910390fd5b5b5b5b505050935093915050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610bdf93929190614319565b6020604051808303816000875af1158015610bfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2291906138d0565b905080610c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5b906143a3565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff163384604051602401610c909291906143c3565b6040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610d1a9190613d93565b6000604051808303816000865af19150503d8060008114610d57576040519150601f19603f3d011682016040523d82523d6000602084013e610d5c565b606091505b5050905080610da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9790614438565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3386866040518463ffffffff1660e01b8152600401610ddf93929190614458565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906138d0565b505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610e6c93929190614319565b6020604051808303816000875af1158015610e8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eaf91906138d0565b905080610ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee8906144e2565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3085856040518463ffffffff1660e01b8152600401610f3093929190614458565b6020604051808303816000875af1158015610f4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7391906138d0565b506001600080828254610f869190614531565b92505081905550505050565b610f9a6120a4565b61080073ffffffffffffffffffffffffffffffffffffffff1663a03ffee184846040518363ffffffff1660e01b8152600401610fd7929190613c73565b600060405180830381865afa158015610ff4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061101d9190614795565b905092915050565b60006108009050600085858560405160240161104393929190614458565b6040516020818303038152906040527f3edab33c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000836040516020016110d59190613cdf565b6040516020818303038152906040528051906020012090506040516020016110fc90613d42565b6040516020818303038152906040528051906020012081036111c95760008373ffffffffffffffffffffffffffffffffffffffff168360405161113f9190613d93565b600060405180830381855af49150503d806000811461117a576040519150601f19603f3d011682016040523d82523d6000602084013e61117f565b606091505b50509050806111c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ba90613e1c565b60405180910390fd5b5061140e565b6040516020016111d890613f50565b6040516020818303038152906040528051906020012081036112a55760008373ffffffffffffffffffffffffffffffffffffffff168360405161121b9190613d93565b600060405180830381855afa9150503d8060008114611256576040519150601f19603f3d011682016040523d82523d6000602084013e61125b565b606091505b505090508061129f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129690613fb1565b60405180910390fd5b5061140d565b6040516020016112b49061401d565b6040516020818303038152906040528051906020012081036113835760008373ffffffffffffffffffffffffffffffffffffffff16836040516112f79190613d93565b6000604051808303816000865af19150503d8060008114611334576040519150601f19603f3d011682016040523d82523d6000602084013e611339565b606091505b505090508061137d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113749061407e565b60405180910390fd5b5061140c565b604051602001611392906140ea565b6040516020818303038152906040528051906020012081036113d05760208201825160008082846000895af2806113c857600080fd5b50505061140b565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114029061414b565b60405180910390fd5b5b5b5b50505050505050565b61141f6120c5565b61080073ffffffffffffffffffffffffffffffffffffffff16637d9f939c8585856040518463ffffffff1660e01b815260040161145e939291906147de565b600060405180830381865afa15801561147b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906114a49190614a46565b90509392505050565b61080073ffffffffffffffffffffffffffffffffffffffff166312d58dfe858585856040518563ffffffff1660e01b81526004016114ee9493929190614a8f565b6020604051808303816000875af115801561150d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153191906138d0565b5050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895303460016040518463ffffffff1660e01b815260040161157a93929190614319565b6020604051808303816000875af1158015611599573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115bd91906138d0565b9050806115ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f690614b27565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b815260040161163e93929190614458565b6020604051808303816000875af115801561165d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168191906138d0565b505050565b60005481565b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c8484846040518463ffffffff1660e01b81526004016116cb93929190614458565b6020604051808303816000875af11580156116ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170e9190614b47565b50505050565b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb8484846040518463ffffffff1660e01b815260040161175393929190614458565b6020604051808303816000875af1158015611772573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179691906138d0565b50505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b81526004016117de93929190614319565b6020604051808303816000875af11580156117fd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182191906138d0565b905080611863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185a90614b27565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b81526004016118a293929190614458565b6020604051808303816000875af11580156118c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e591906138d0565b503373ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f1935050505015801561192c573d6000803e3d6000fd5b505050565b61080073ffffffffffffffffffffffffffffffffffffffff166354b826f5858585856040518563ffffffff1660e01b81526004016119729493929190614b74565b6020604051808303816000875af1158015611991573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b59190614b47565b5050505050565b60606119c66120ed565b61080073ffffffffffffffffffffffffffffffffffffffff1663186b216785856040518363ffffffff1660e01b8152600401611a03929190614d25565b600060405180830381865afa158015611a20573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611a499190614f19565b915091509250929050565b6000611a5e61208a565b61080073ffffffffffffffffffffffffffffffffffffffff1663241774e685856040518363ffffffff1660e01b8152600401611a9b929190613c73565b600060405180830381865afa158015611ab8573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611ae19190613ea8565b915091509250929050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663fc08930c8433856040518463ffffffff1660e01b8152600401611b2d93929190614f91565b602060405180830381865afa158015611b4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6e9190614fcf565b905092915050565b6000600167ffffffffffffffff811115611b9357611b92612530565b5b604051908082528060200260200182016040528015611bc657816020015b6060815260200190600190039081611bb15790505b50905060405180606001604052806025815260200161571d6025913981600081518110611bf657611bf5614ffc565b5b6020026020010181905250600061080073ffffffffffffffffffffffffffffffffffffffff1663b60398958787856040518463ffffffff1660e01b8152600401611c42939291906150dc565b6020604051808303816000875af1158015611c61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8591906138d0565b905080611cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbe9061518c565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c3285876040518463ffffffff1660e01b8152600401611d0693929190614458565b6020604051808303816000875af1158015611d25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d499190614b47565b50505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b8152600401611d9493929190614319565b6020604051808303816000875af1158015611db3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd791906138d0565b905080611e19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1090614b27565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084600134611e469190614531565b6040518463ffffffff1660e01b8152600401611e6493929190614458565b6020604051808303816000875af1158015611e83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea791906138d0565b505050565b600061080073ffffffffffffffffffffffffffffffffffffffff166361dc5c3b8585856040518463ffffffff1660e01b8152600401611eed939291906151ac565b6020604051808303816000875af1158015611f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f3091906138d0565b905080611f72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6990615250565b60405180910390fd5b50505050565b6060611f826120ed565b61080073ffffffffffffffffffffffffffffffffffffffff166310a2851c878787876040518563ffffffff1660e01b8152600401611fc394939291906152e6565b600060405180830381865afa158015611fe0573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061200991906156a4565b9150915094509492505050565b60405180610160016040528060608152602001606081526020016000151581526020016000600381111561204d5761204c61236a565b5b8152602001600081526020016000815260200160608152602001600060070b8152602001600060070b815260200160008152602001600081525090565b604051806040016040528060608152602001600081525090565b60405180606001604052806060815260200160608152602001606081525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061215082612125565b9050919050565b61216081612145565b811461216b57600080fd5b50565b60008135905061217d81612157565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126121a8576121a7612183565b5b8235905067ffffffffffffffff8111156121c5576121c4612188565b5b6020830191508360208202830111156121e1576121e061218d565b5b9250929050565b6000819050919050565b6121fb816121e8565b811461220657600080fd5b50565b600081359050612218816121f2565b92915050565b600080600080606085870312156122385761223761211b565b5b60006122468782880161216e565b945050602085013567ffffffffffffffff81111561226757612266612120565b5b61227387828801612192565b9350935050604061228687828801612209565b91505092959194509250565b6000602082840312156122a8576122a761211b565b5b60006122b68482850161216e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156122f95780820151818401526020810190506122de565b60008484015250505050565b6000601f19601f8301169050919050565b6000612321826122bf565b61232b81856122ca565b935061233b8185602086016122db565b61234481612305565b840191505092915050565b60008115159050919050565b6123648161234f565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106123aa576123a961236a565b5b50565b60008190506123bb82612399565b919050565b60006123cb826123ad565b9050919050565b6123db816123c0565b82525050565b6123ea816121e8565b82525050565b60008160070b9050919050565b612406816123f0565b82525050565b600061016083016000830151848203600086015261242a8282612316565b915050602083015184820360208601526124448282612316565b9150506040830151612459604086018261235b565b50606083015161246c60608601826123d2565b50608083015161247f60808601826123e1565b5060a083015161249260a08601826123e1565b5060c083015184820360c08601526124aa8282612316565b91505060e08301516124bf60e08601826123fd565b506101008301516124d46101008601826123fd565b506101208301516124e96101208601826123e1565b506101408301516124fe6101408601826123e1565b508091505092915050565b60006020820190508181036000830152612523818461240c565b905092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61256882612305565b810181811067ffffffffffffffff8211171561258757612586612530565b5b80604052505050565b600061259a612111565b90506125a6828261255f565b919050565b600067ffffffffffffffff8211156125c6576125c5612530565b5b6125cf82612305565b9050602081019050919050565b82818337600083830152505050565b60006125fe6125f9846125ab565b612590565b90508281526020810184848401111561261a5761261961252b565b5b6126258482856125dc565b509392505050565b600082601f83011261264257612641612183565b5b81356126528482602086016125eb565b91505092915050565b6000806000606084860312156126745761267361211b565b5b60006126828682870161216e565b935050602084013567ffffffffffffffff8111156126a3576126a2612120565b5b6126af8682870161262d565b925050604084013567ffffffffffffffff8111156126d0576126cf612120565b5b6126dc8682870161262d565b9150509250925092565b6126ef816121e8565b82525050565b600060408301600083015184820360008601526127128282612316565b915050602083015161272760208601826123e1565b508091505092915050565b600060408201905061274760008301856126e6565b818103602083015261275981846126f5565b90509392505050565b60008060006060848603121561277b5761277a61211b565b5b60006127898682870161216e565b935050602084013567ffffffffffffffff8111156127aa576127a9612120565b5b6127b68682870161262d565b92505060406127c786828701612209565b9150509250925092565b600080604083850312156127e8576127e761211b565b5b600083013567ffffffffffffffff81111561280657612805612120565b5b6128128582860161262d565b925050602061282385828601612209565b9150509250929050565b600080604083850312156128445761284361211b565b5b60006128528582860161216e565b925050602083013567ffffffffffffffff81111561287357612872612120565b5b61287f8582860161262d565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600067ffffffffffffffff82169050919050565b6128d2816128b5565b82525050565b60c0820160008201516128ee60008501826123fd565b50602082015161290160208501826123fd565b50604082015161291460408501826123e1565b50606082015161292760608501826123e1565b50608082015161293a60808501826128c9565b5060a082015161294d60a08501826123fd565b50505050565b600061295f83836128d8565b60c08301905092915050565b6000602082019050919050565b600061298382612889565b61298d8185612894565b9350612998836128a5565b8060005b838110156129c95781516129b08882612953565b97506129bb8361296b565b92505060018101905061299c565b5085935050505092915050565b600060608301600083015184820360008601526129f38282612316565b91505060208301518482036020860152612a0d8282612316565b91505060408301518482036040860152612a278282612978565b9150508091505092915050565b60006020820190508181036000830152612a4e81846129d6565b905092915050565b60008060008060808587031215612a7057612a6f61211b565b5b6000612a7e8782880161216e565b945050602085013567ffffffffffffffff811115612a9f57612a9e612120565b5b612aab8782880161262d565b9350506040612abc87828801612209565b925050606085013567ffffffffffffffff811115612add57612adc612120565b5b612ae98782880161262d565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b608082016000820151612b3760008501826123fd565b506020820151612b4a60208501826123fd565b506040820151612b5d60408501826123e1565b506060820151612b7060608501826123e1565b50505050565b6000612b828383612b21565b60808301905092915050565b6000602082019050919050565b6000612ba682612af5565b612bb08185612b00565b9350612bbb83612b11565b8060005b83811015612bec578151612bd38882612b76565b9750612bde83612b8e565b925050600181019050612bbf565b5085935050505092915050565b60006080830160008301518482036000860152612c168282612316565b91505060208301518482036020860152612c308282612316565b91505060408301518482036040860152612c4a8282612316565b91505060608301518482036060860152612c648282612b9b565b9150508091505092915050565b60006020820190508181036000830152612c8b8184612bf9565b905092915050565b60008060008060808587031215612cad57612cac61211b565b5b6000612cbb8782880161216e565b945050602085013567ffffffffffffffff811115612cdc57612cdb612120565b5b612ce88782880161262d565b9350506040612cf987828801612209565b9250506060612d0a87828801612209565b91505092959194509250565b600060208284031215612d2c57612d2b61211b565b5b600082013567ffffffffffffffff811115612d4a57612d49612120565b5b612d568482850161262d565b91505092915050565b6000602082019050612d7460008301846126e6565b92915050565b60008060008060808587031215612d9457612d9361211b565b5b6000612da28782880161216e565b945050602085013567ffffffffffffffff811115612dc357612dc2612120565b5b612dcf8782880161262d565b935050604085013567ffffffffffffffff811115612df057612def612120565b5b612dfc8782880161262d565b9250506060612e0d87828801612209565b91505092959194509250565b600080fd5b600060a08284031215612e3457612e33612e19565b5b81905092915050565b60008060408385031215612e5457612e5361211b565b5b600083013567ffffffffffffffff811115612e7257612e71612120565b5b612e7e8582860161262d565b925050602083013567ffffffffffffffff811115612e9f57612e9e612120565b5b612eab85828601612e1e565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000610160830160008301518482036000860152612eff8282612316565b91505060208301518482036020860152612f198282612316565b9150506040830151612f2e604086018261235b565b506060830151612f4160608601826123d2565b506080830151612f5460808601826123e1565b5060a0830151612f6760a08601826123e1565b5060c083015184820360c0860152612f7f8282612316565b91505060e0830151612f9460e08601826123fd565b50610100830151612fa96101008601826123fd565b50610120830151612fbe6101208601826123e1565b50610140830151612fd36101408601826123e1565b508091505092915050565b6000612fea8383612ee1565b905092915050565b6000602082019050919050565b600061300a82612eb5565b6130148185612ec0565b93508360208202850161302685612ed1565b8060005b8581101561306257848403895281516130438582612fde565b945061304e83612ff2565b925060208a0199505060018101905061302a565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b600061309b82613074565b6130a5818561307f565b93506130b58185602086016122db565b6130be81612305565b840191505092915050565b600060408301600083015184820360008601526130e68282613090565b91505060208301516130fb60208601826128c9565b508091505092915050565b600060408201905081810360008301526131208185612fff565b9050818103602083015261313481846130c9565b90509392505050565b600080600080608085870312156131575761315661211b565b5b60006131658782880161216e565b945050602061317687828801612209565b935050604061318787828801612209565b925050606085013567ffffffffffffffff8111156131a8576131a7612120565b5b6131b48782880161262d565b91505092959194509250565b6000806000604084860312156131d9576131d861211b565b5b60006131e78682870161216e565b935050602084013567ffffffffffffffff81111561320857613207612120565b5b61321486828701612192565b92509250509250925092565b600080fd5b600080fd5b600067ffffffffffffffff82111561324557613244612530565b5b61324e82612305565b9050602081019050919050565b600061326e6132698461322a565b612590565b90508281526020810184848401111561328a5761328961252b565b5b6132958482856125dc565b509392505050565b600082601f8301126132b2576132b1612183565b5b81356132c284826020860161325b565b91505092915050565b6132d4816128b5565b81146132df57600080fd5b50565b6000813590506132f1816132cb565b92915050565b6133008161234f565b811461330b57600080fd5b50565b60008135905061331d816132f7565b92915050565b600060a0828403121561333957613338613220565b5b61334360a0612590565b9050600082013567ffffffffffffffff81111561336357613362613225565b5b61336f8482850161329d565b6000830152506020613383848285016132e2565b6020830152506040613397848285016132e2565b60408301525060606133ab8482850161330e565b60608301525060806133bf8482850161330e565b60808301525092915050565b600080600080608085870312156133e5576133e461211b565b5b60006133f38782880161216e565b945050602085013567ffffffffffffffff81111561341457613413612120565b5b6134208782880161262d565b935050604085013567ffffffffffffffff81111561344157613440612120565b5b61344d8782880161262d565b925050606085013567ffffffffffffffff81111561346e5761346d612120565b5b61347a87828801613323565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060808301600083015184820360008601526134cf8282612316565b915050602083015184820360208601526134e98282612316565b915050604083015184820360408601526135038282612316565b9150506060830151848203606086015261351d8282612b9b565b9150508091505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60a08201600082015161356c6000850182612b21565b50602082015161357f60808501826123e1565b50505050565b60006135918383613556565b60a08301905092915050565b6000602082019050919050565b60006135b58261352a565b6135bf8185613535565b93506135ca83613546565b8060005b838110156135fb5781516135e28882613585565b97506135ed8361359d565b9250506001810190506135ce565b5085935050505092915050565b6000604083016000830151848203600086015261362582826134b2565b9150506020830151848203602086015261363f82826135aa565b9150508091505092915050565b60006136588383613608565b905092915050565b6000602082019050919050565b600061367882613486565b6136828185613491565b935083602082028501613694856134a2565b8060005b858110156136d057848403895281516136b1858261364c565b94506136bc83613660565b925060208a01995050600181019050613698565b50829750879550505050505092915050565b600060408201905081810360008301526136fc818561366d565b9050818103602083015261371081846130c9565b90509392505050565b61372281612145565b82525050565b600082825260208201905092915050565b6000819050919050565b600061374f83856122ca565b935061375c8385846125dc565b61376583612305565b840190509392505050565b600061377d848484613743565b90509392505050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126137b2576137b1613790565b5b83810192508235915060208301925067ffffffffffffffff8211156137da576137d9613786565b5b6001820236038313156137f0576137ef61378b565b5b509250929050565b6000602082019050919050565b60006138118385613728565b93508360208402850161382384613739565b8060005b8781101561386957848403895261383e8284613795565b613849868284613770565b9550613854846137f8565b935060208b019a505050600181019050613827565b50829750879450505050509392505050565b60006060820190506138906000830187613719565b61389d60208301866126e6565b81810360408301526138b0818486613805565b905095945050505050565b6000815190506138ca816132f7565b92915050565b6000602082840312156138e6576138e561211b565b5b60006138f4848285016138bb565b91505092915050565b600082825260208201905092915050565b7f4661696c656420746f20617070726f7665207374616b696e67206d6574686f6460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061396a6021836138fd565b91506139758261390e565b604082019050919050565b600060208201905081810360008301526139998161395d565b9050919050565b60006020820190506139b56000830184613719565b92915050565b60006139ce6139c9846125ab565b612590565b9050828152602081018484840111156139ea576139e961252b565b5b6139f58482856122db565b509392505050565b600082601f830112613a1257613a11612183565b5b8151613a228482602086016139bb565b91505092915050565b60048110613a3857600080fd5b50565b600081519050613a4a81613a2b565b92915050565b600081519050613a5f816121f2565b92915050565b613a6e816123f0565b8114613a7957600080fd5b50565b600081519050613a8b81613a65565b92915050565b60006101608284031215613aa857613aa7613220565b5b613ab3610160612590565b9050600082015167ffffffffffffffff811115613ad357613ad2613225565b5b613adf848285016139fd565b600083015250602082015167ffffffffffffffff811115613b0357613b02613225565b5b613b0f848285016139fd565b6020830152506040613b23848285016138bb565b6040830152506060613b3784828501613a3b565b6060830152506080613b4b84828501613a50565b60808301525060a0613b5f84828501613a50565b60a08301525060c082015167ffffffffffffffff811115613b8357613b82613225565b5b613b8f848285016139fd565b60c08301525060e0613ba384828501613a7c565b60e083015250610100613bb884828501613a7c565b61010083015250610120613bce84828501613a50565b61012083015250610140613be484828501613a50565b6101408301525092915050565b600060208284031215613c0757613c0661211b565b5b600082015167ffffffffffffffff811115613c2557613c24612120565b5b613c3184828501613a91565b91505092915050565b6000613c45826122bf565b613c4f81856138fd565b9350613c5f8185602086016122db565b613c6881612305565b840191505092915050565b6000604082019050613c886000830185613719565b8181036020830152613c9a8184613c3a565b90509392505050565b600081905092915050565b6000613cb9826122bf565b613cc38185613ca3565b9350613cd38185602086016122db565b80840191505092915050565b6000613ceb8284613cae565b915081905092915050565b7f64656c656761746563616c6c0000000000000000000000000000000000000000600082015250565b6000613d2c600c83613ca3565b9150613d3782613cf6565b600c82019050919050565b6000613d4d82613d1f565b9150819050919050565b600081905092915050565b6000613d6d82613074565b613d778185613d57565b9350613d878185602086016122db565b80840191505092915050565b6000613d9f8284613d62565b915081905092915050565b7f6661696c65642064656c656761746563616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e066021836138fd565b9150613e1182613daa565b604082019050919050565b60006020820190508181036000830152613e3581613df9565b9050919050565b600060408284031215613e5257613e51613220565b5b613e5c6040612590565b9050600082015167ffffffffffffffff811115613e7c57613e7b613225565b5b613e88848285016139fd565b6000830152506020613e9c84828501613a50565b60208301525092915050565b60008060408385031215613ebf57613ebe61211b565b5b6000613ecd85828601613a50565b925050602083015167ffffffffffffffff811115613eee57613eed612120565b5b613efa85828601613e3c565b9150509250929050565b7f73746174696363616c6c00000000000000000000000000000000000000000000600082015250565b6000613f3a600a83613ca3565b9150613f4582613f04565b600a82019050919050565b6000613f5b82613f2d565b9150819050919050565b7f6661696c65642073746174696363616c6c20746f20707265636f6d70696c6500600082015250565b6000613f9b601f836138fd565b9150613fa682613f65565b602082019050919050565b60006020820190508181036000830152613fca81613f8e565b9050919050565b7f63616c6c00000000000000000000000000000000000000000000000000000000600082015250565b6000614007600483613ca3565b915061401282613fd1565b600482019050919050565b600061402882613ffa565b9150819050919050565b7f6661696c65642063616c6c20746f20707265636f6d70696c6500000000000000600082015250565b60006140686019836138fd565b915061407382614032565b602082019050919050565b600060208201905081810360008301526140978161405b565b9050919050565b7f63616c6c636f6465000000000000000000000000000000000000000000000000600082015250565b60006140d4600883613ca3565b91506140df8261409e565b600882019050919050565b60006140f5826140c7565b9150819050919050565b7f696e76616c69642063616c6c7479706500000000000000000000000000000000600082015250565b60006141356010836138fd565b9150614140826140ff565b602082019050919050565b6000602082019050818103600083015261416481614128565b9050919050565b600081549050919050565b60008190508160005260206000209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806141d257607f821691505b6020821081036141e5576141e461418b565b5b50919050565b60008190508160005260206000209050919050565b6000815461420d816141ba565b61421781866122ca565b9450600182166000811461423257600181146142485761427b565b60ff19831686528115156020028601935061427b565b614251856141eb565b60005b8381101561427357815481890152600182019150602081019050614254565b808801955050505b50505092915050565b60006142908383614200565b905092915050565b6000600182019050919050565b60006142b08261416b565b6142ba8185613728565b9350836020820285016142cc85614176565b8060005b85811015614307578484038952816142e88582614284565b94506142f383614298565b925060208a019950506001810190506142d0565b50829750879550505050505092915050565b600060608201905061432e6000830186613719565b61433b60208301856126e6565b818103604083015261434d81846142a5565b9050949350505050565b7f64656c65676174696f6e20617070726f76616c206661696c6564000000000000600082015250565b600061438d601a836138fd565b915061439882614357565b602082019050919050565b600060208201905081810360008301526143bc81614380565b9050919050565b60006040820190506143d86000830185613719565b6143e560208301846126e6565b9392505050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000614422600f836138fd565b915061442d826143ec565b602082019050919050565b6000602082019050818103600083015261445181614415565b9050919050565b600060608201905061446d6000830186613719565b818103602083015261447f8185613c3a565b905061448e60408301846126e6565b949350505050565b7f5374616b696e6720417070726f7665206661696c656400000000000000000000600082015250565b60006144cc6016836138fd565b91506144d782614496565b602082019050919050565b600060208201905081810360008301526144fb816144bf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061453c826121e8565b9150614547836121e8565b925082820190508082111561455f5761455e614502565b5b92915050565b600067ffffffffffffffff8211156145805761457f612530565b5b602082029050602081019050919050565b6000815190506145a0816132cb565b92915050565b600060c082840312156145bc576145bb613220565b5b6145c660c0612590565b905060006145d684828501613a7c565b60008301525060206145ea84828501613a7c565b60208301525060406145fe84828501613a50565b604083015250606061461284828501613a50565b606083015250608061462684828501614591565b60808301525060a061463a84828501613a7c565b60a08301525092915050565b600061465961465484614565565b612590565b90508083825260208201905060c0840283018581111561467c5761467b61218d565b5b835b818110156146a5578061469188826145a6565b84526020840193505060c08101905061467e565b5050509392505050565b600082601f8301126146c4576146c3612183565b5b81516146d4848260208601614646565b91505092915050565b6000606082840312156146f3576146f2613220565b5b6146fd6060612590565b9050600082015167ffffffffffffffff81111561471d5761471c613225565b5b614729848285016139fd565b600083015250602082015167ffffffffffffffff81111561474d5761474c613225565b5b614759848285016139fd565b602083015250604082015167ffffffffffffffff81111561477d5761477c613225565b5b614789848285016146af565b60408301525092915050565b6000602082840312156147ab576147aa61211b565b5b600082015167ffffffffffffffff8111156147c9576147c8612120565b5b6147d5848285016146dd565b91505092915050565b60006060820190506147f36000830186613719565b81810360208301526148058185613c3a565b905081810360408301526148198184613c3a565b9050949350505050565b600067ffffffffffffffff82111561483e5761483d612530565b5b602082029050602081019050919050565b60006080828403121561486557614864613220565b5b61486f6080612590565b9050600061487f84828501613a7c565b600083015250602061489384828501613a7c565b60208301525060406148a784828501613a50565b60408301525060606148bb84828501613a50565b60608301525092915050565b60006148da6148d584614823565b612590565b905080838252602082019050608084028301858111156148fd576148fc61218d565b5b835b818110156149265780614912888261484f565b8452602084019350506080810190506148ff565b5050509392505050565b600082601f83011261494557614944612183565b5b81516149558482602086016148c7565b91505092915050565b60006080828403121561497457614973613220565b5b61497e6080612590565b9050600082015167ffffffffffffffff81111561499e5761499d613225565b5b6149aa848285016139fd565b600083015250602082015167ffffffffffffffff8111156149ce576149cd613225565b5b6149da848285016139fd565b602083015250604082015167ffffffffffffffff8111156149fe576149fd613225565b5b614a0a848285016139fd565b604083015250606082015167ffffffffffffffff811115614a2e57614a2d613225565b5b614a3a84828501614930565b60608301525092915050565b600060208284031215614a5c57614a5b61211b565b5b600082015167ffffffffffffffff811115614a7a57614a79612120565b5b614a868482850161495e565b91505092915050565b6000608082019050614aa46000830187613719565b8181036020830152614ab68186613c3a565b9050614ac560408301856126e6565b614ad260608301846126e6565b95945050505050565b7f44656c656761746520417070726f7665206661696c6564000000000000000000600082015250565b6000614b116017836138fd565b9150614b1c82614adb565b602082019050919050565b60006020820190508181036000830152614b4081614b04565b9050919050565b600060208284031215614b5d57614b5c61211b565b5b6000614b6b84828501613a7c565b91505092915050565b6000608082019050614b896000830187613719565b8181036020830152614b9b8186613c3a565b90508181036040830152614baf8185613c3a565b9050614bbe60608301846126e6565b95945050505050565b60008083356001602003843603038112614be457614be3613790565b5b83810192508235915060208301925067ffffffffffffffff821115614c0c57614c0b613786565b5b600182023603831315614c2257614c2161378b565b5b509250929050565b6000614c36838561307f565b9350614c438385846125dc565b614c4c83612305565b840190509392505050565b6000614c6660208401846132e2565b905092915050565b6000614c7d602084018461330e565b905092915050565b600060a08301614c986000840184614bc7565b8583036000870152614cab838284614c2a565b92505050614cbc6020840184614c57565b614cc960208601826128c9565b50614cd76040840184614c57565b614ce460408601826128c9565b50614cf26060840184614c6e565b614cff606086018261235b565b50614d0d6080840184614c6e565b614d1a608086018261235b565b508091505092915050565b60006040820190508181036000830152614d3f8185613c3a565b90508181036020830152614d538184614c85565b90509392505050565b600067ffffffffffffffff821115614d7757614d76612530565b5b602082029050602081019050919050565b6000614d9b614d9684614d5c565b612590565b90508083825260208201905060208402830185811115614dbe57614dbd61218d565b5b835b81811015614e0557805167ffffffffffffffff811115614de357614de2612183565b5b808601614df08982613a91565b85526020850194505050602081019050614dc0565b5050509392505050565b600082601f830112614e2457614e23612183565b5b8151614e34848260208601614d88565b91505092915050565b6000614e50614e4b8461322a565b612590565b905082815260208101848484011115614e6c57614e6b61252b565b5b614e778482856122db565b509392505050565b600082601f830112614e9457614e93612183565b5b8151614ea4848260208601614e3d565b91505092915050565b600060408284031215614ec357614ec2613220565b5b614ecd6040612590565b9050600082015167ffffffffffffffff811115614eed57614eec613225565b5b614ef984828501614e7f565b6000830152506020614f0d84828501614591565b60208301525092915050565b60008060408385031215614f3057614f2f61211b565b5b600083015167ffffffffffffffff811115614f4e57614f4d612120565b5b614f5a85828601614e0f565b925050602083015167ffffffffffffffff811115614f7b57614f7a612120565b5b614f8785828601614ead565b9150509250929050565b6000606082019050614fa66000830186613719565b614fb36020830185613719565b8181036040830152614fc58184613c3a565b9050949350505050565b600060208284031215614fe557614fe461211b565b5b6000614ff384828501613a50565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b6000819050602082019050919050565b60006150528383612316565b905092915050565b6000602082019050919050565b60006150728261502b565b61507c8185613728565b93508360208202850161508e85615036565b8060005b858110156150ca57848403895281516150ab8582615046565b94506150b68361505a565b925060208a01995050600181019050615092565b50829750879550505050505092915050565b60006060820190506150f16000830186613719565b6150fe60208301856126e6565b81810360408301526151108184615067565b9050949350505050565b7f6661696c656420746f20617070726f766520756e64656c65676174696f6e206d60008201527f6574686f64000000000000000000000000000000000000000000000000000000602082015250565b60006151766025836138fd565b91506151818261511a565b604082019050919050565b600060208201905081810360008301526151a581615169565b9050919050565b60006040820190506151c16000830186613719565b81810360208301526151d4818486613805565b9050949350505050565b7f4661696c656420746f207265766f6b6520617070726f76616c20666f7220737460008201527f616b696e67206d6574686f647300000000000000000000000000000000000000602082015250565b600061523a602d836138fd565b9150615245826151de565b604082019050919050565b600060208201905081810360008301526152698161522d565b9050919050565b600060a083016000830151848203600086015261528d8282613090565b91505060208301516152a260208601826128c9565b5060408301516152b560408601826128c9565b5060608301516152c8606086018261235b565b5060808301516152db608086018261235b565b508091505092915050565b60006080820190506152fb6000830187613719565b818103602083015261530d8186613c3a565b905081810360408301526153218185613c3a565b905081810360608301526153358184615270565b905095945050505050565b600067ffffffffffffffff82111561535b5761535a612530565b5b602082029050602081019050919050565b60006080828403121561538257615381613220565b5b61538c6080612590565b9050600082015167ffffffffffffffff8111156153ac576153ab613225565b5b6153b8848285016139fd565b600083015250602082015167ffffffffffffffff8111156153dc576153db613225565b5b6153e8848285016139fd565b602083015250604082015167ffffffffffffffff81111561540c5761540b613225565b5b615418848285016139fd565b604083015250606082015167ffffffffffffffff81111561543c5761543b613225565b5b61544884828501614930565b60608301525092915050565b600067ffffffffffffffff82111561546f5761546e612530565b5b602082029050602081019050919050565b600060a0828403121561549657615495613220565b5b6154a06040612590565b905060006154b08482850161484f565b60008301525060806154c484828501613a50565b60208301525092915050565b60006154e36154de84615454565b612590565b90508083825260208201905060a084028301858111156155065761550561218d565b5b835b8181101561552f578061551b8882615480565b84526020840193505060a081019050615508565b5050509392505050565b600082601f83011261554e5761554d612183565b5b815161555e8482602086016154d0565b91505092915050565b60006040828403121561557d5761557c613220565b5b6155876040612590565b9050600082015167ffffffffffffffff8111156155a7576155a6613225565b5b6155b38482850161536c565b600083015250602082015167ffffffffffffffff8111156155d7576155d6613225565b5b6155e384828501615539565b60208301525092915050565b60006156026155fd84615340565b612590565b905080838252602082019050602084028301858111156156255761562461218d565b5b835b8181101561566c57805167ffffffffffffffff81111561564a57615649612183565b5b8086016156578982615567565b85526020850194505050602081019050615627565b5050509392505050565b600082601f83011261568b5761568a612183565b5b815161569b8482602086016155ef565b91505092915050565b600080604083850312156156bb576156ba61211b565b5b600083015167ffffffffffffffff8111156156d9576156d8612120565b5b6156e585828601615676565b925050602083015167ffffffffffffffff81111561570657615705612120565b5b61571285828601614ead565b915050925092905056fe2f636f736d6f732e7374616b696e672e763162657461312e4d7367556e64656c6567617465a264697066735822122025fb99f701996d5dbfba7bb291edb892dd49aca0491bb08fa976e3078bf77f5464736f6c634300081300332f636f736d6f732e7374616b696e672e763162657461312e4d736744656c6567617465", + "deployedBytecode": "0x6080604052600436106101355760003560e01c80637e51b811116100ab578063cf2753cf1161006f578063cf2753cf14610418578063ec9485df14610456578063f40a214614610493578063f5714e64146104bc578063f700dbd2146104d8578063f732b0651461050157610135565b80637e51b811146103435780638939e7831461036c5780638edb3f8b146103955780639eab6711146103b1578063b13d4242146103da57610135565b8063455b8551116100fd578063455b85511461023057806355dc4b221461026d578063570467ac146102965780635e269bfe146102d357806360deaa2a146102fc57806361bc221a1461031857610135565b80630a4433e21461013a5780631904bb2e1461016357806319b16c4c146101a057806331bcbcb3146101de5780633566cb9514610207575b600080fd5b34801561014657600080fd5b50610161600480360381019061015c919061221e565b61053f565b005b34801561016f57600080fd5b5061018a60048036038101906101859190612292565b61060e565b6040516101979190612509565b60405180910390f35b3480156101ac57600080fd5b506101c760048036038101906101c2919061265b565b61069e565b6040516101d5929190612732565b60405180910390f35b3480156101ea57600080fd5b5061020560048036038101906102009190612762565b610b9d565b005b34801561021357600080fd5b5061022e600480360381019061022991906127d1565b610e2a565b005b34801561023c57600080fd5b506102576004803603810190610252919061282d565b610f92565b6040516102649190612a34565b60405180910390f35b34801561027957600080fd5b50610294600480360381019061028f9190612a56565b611025565b005b3480156102a257600080fd5b506102bd60048036038101906102b8919061265b565b611417565b6040516102ca9190612c71565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f59190612c93565b6114ad565b005b61031660048036038101906103119190612d16565b611538565b005b34801561032457600080fd5b5061032d611686565b60405161033a9190612d5f565b60405180910390f35b34801561034f57600080fd5b5061036a60048036038101906103659190612762565b61168c565b005b34801561037857600080fd5b50610393600480360381019061038e9190612762565b611714565b005b6103af60048036038101906103aa9190612d16565b61179c565b005b3480156103bd57600080fd5b506103d860048036038101906103d39190612d7a565b611931565b005b3480156103e657600080fd5b5061040160048036038101906103fc9190612e3d565b6119bc565b60405161040f929190613106565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a919061282d565b611a54565b60405161044d929190612732565b60405180910390f35b34801561046257600080fd5b5061047d6004803603810190610478919061282d565b611aec565b60405161048a9190612d5f565b60405180910390f35b34801561049f57600080fd5b506104ba60048036038101906104b5919061313d565b611b76565b005b6104d660048036038101906104d19190612d16565b611d52565b005b3480156104e457600080fd5b506104ff60048036038101906104fa91906131c0565b611eac565b005b34801561050d57600080fd5b50610528600480360381019061052391906133cb565b611f78565b6040516105369291906136e2565b60405180910390f35b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895868487876040518563ffffffff1660e01b8152600401610582949392919061387b565b6020604051808303816000875af11580156105a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c591906138d0565b905080610607576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105fe90613980565b60405180910390fd5b5050505050565b610616612016565b61080073ffffffffffffffffffffffffffffffffffffffff1663223b3b7a836040518263ffffffff1660e01b815260040161065191906139a0565b600060405180830381865afa15801561066e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906106979190613bf1565b9050919050565b60006106a861208a565b60006108009050600086866040516024016106c4929190613c73565b6040516020818303038152906040527f241774e6000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000856040516020016107569190613cdf565b60405160208183030381529060405280519060200120905060405160200161077d90613d42565b604051602081830303815290604052805190602001208103610869576000808473ffffffffffffffffffffffffffffffffffffffff16846040516107c19190613d93565b600060405180830381855af49150503d80600081146107fc576040519150601f19603f3d011682016040523d82523d6000602084013e610801565b606091505b509150915081610846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083d90613e1c565b60405180910390fd5b8080602001905181019061085a9190613ea8565b80975081985050505050610b92565b60405160200161087890613f50565b604051602081830303815290604052805190602001208103610964576000808473ffffffffffffffffffffffffffffffffffffffff16846040516108bc9190613d93565b600060405180830381855afa9150503d80600081146108f7576040519150601f19603f3d011682016040523d82523d6000602084013e6108fc565b606091505b509150915081610941576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093890613fb1565b60405180910390fd5b808060200190518101906109559190613ea8565b80975081985050505050610b91565b6040516020016109739061401d565b604051602081830303815290604052805190602001208103610a61576000808473ffffffffffffffffffffffffffffffffffffffff16846040516109b79190613d93565b6000604051808303816000865af19150503d80600081146109f4576040519150601f19603f3d011682016040523d82523d6000602084013e6109f9565b606091505b509150915081610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a359061407e565b60405180910390fd5b80806020019051810190610a529190613ea8565b80975081985050505050610b90565b604051602001610a70906140ea565b604051602081830303815290604052805190602001208103610b545760006040518060400160405280601a81526020017f64656c65676174696f6e28616464726573732c737472696e6729000000000000815250805190602001209050600060a490506060600060208b01516020808d0101516040518681528e6004820152604060248201526033604482015282606482015281608482015260c081878360008e5af281519c5060608201519450610100820160405280610b3057600080fd5b50505050604051806040016040528083815260200182815250975050505050610b8f565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b869061414b565b60405180910390fd5b5b5b5b505050935093915050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610bdf93929190614319565b6020604051808303816000875af1158015610bfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2291906138d0565b905080610c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5b906143a3565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff163384604051602401610c909291906143c3565b6040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610d1a9190613d93565b6000604051808303816000865af19150503d8060008114610d57576040519150601f19603f3d011682016040523d82523d6000602084013e610d5c565b606091505b5050905080610da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9790614438565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3386866040518463ffffffff1660e01b8152600401610ddf93929190614458565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906138d0565b505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610e6c93929190614319565b6020604051808303816000875af1158015610e8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eaf91906138d0565b905080610ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee8906144e2565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3085856040518463ffffffff1660e01b8152600401610f3093929190614458565b6020604051808303816000875af1158015610f4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7391906138d0565b506001600080828254610f869190614531565b92505081905550505050565b610f9a6120a4565b61080073ffffffffffffffffffffffffffffffffffffffff1663a03ffee184846040518363ffffffff1660e01b8152600401610fd7929190613c73565b600060405180830381865afa158015610ff4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061101d9190614795565b905092915050565b60006108009050600085858560405160240161104393929190614458565b6040516020818303038152906040527f3edab33c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000836040516020016110d59190613cdf565b6040516020818303038152906040528051906020012090506040516020016110fc90613d42565b6040516020818303038152906040528051906020012081036111c95760008373ffffffffffffffffffffffffffffffffffffffff168360405161113f9190613d93565b600060405180830381855af49150503d806000811461117a576040519150601f19603f3d011682016040523d82523d6000602084013e61117f565b606091505b50509050806111c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ba90613e1c565b60405180910390fd5b5061140e565b6040516020016111d890613f50565b6040516020818303038152906040528051906020012081036112a55760008373ffffffffffffffffffffffffffffffffffffffff168360405161121b9190613d93565b600060405180830381855afa9150503d8060008114611256576040519150601f19603f3d011682016040523d82523d6000602084013e61125b565b606091505b505090508061129f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129690613fb1565b60405180910390fd5b5061140d565b6040516020016112b49061401d565b6040516020818303038152906040528051906020012081036113835760008373ffffffffffffffffffffffffffffffffffffffff16836040516112f79190613d93565b6000604051808303816000865af19150503d8060008114611334576040519150601f19603f3d011682016040523d82523d6000602084013e611339565b606091505b505090508061137d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113749061407e565b60405180910390fd5b5061140c565b604051602001611392906140ea565b6040516020818303038152906040528051906020012081036113d05760208201825160008082846000895af2806113c857600080fd5b50505061140b565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114029061414b565b60405180910390fd5b5b5b5b50505050505050565b61141f6120c5565b61080073ffffffffffffffffffffffffffffffffffffffff16637d9f939c8585856040518463ffffffff1660e01b815260040161145e939291906147de565b600060405180830381865afa15801561147b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906114a49190614a46565b90509392505050565b61080073ffffffffffffffffffffffffffffffffffffffff166312d58dfe858585856040518563ffffffff1660e01b81526004016114ee9493929190614a8f565b6020604051808303816000875af115801561150d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153191906138d0565b5050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895303460016040518463ffffffff1660e01b815260040161157a93929190614319565b6020604051808303816000875af1158015611599573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115bd91906138d0565b9050806115ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f690614b27565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b815260040161163e93929190614458565b6020604051808303816000875af115801561165d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168191906138d0565b505050565b60005481565b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c8484846040518463ffffffff1660e01b81526004016116cb93929190614458565b6020604051808303816000875af11580156116ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170e9190614b47565b50505050565b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb8484846040518463ffffffff1660e01b815260040161175393929190614458565b6020604051808303816000875af1158015611772573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179691906138d0565b50505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b81526004016117de93929190614319565b6020604051808303816000875af11580156117fd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182191906138d0565b905080611863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185a90614b27565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b81526004016118a293929190614458565b6020604051808303816000875af11580156118c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e591906138d0565b503373ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f1935050505015801561192c573d6000803e3d6000fd5b505050565b61080073ffffffffffffffffffffffffffffffffffffffff166354b826f5858585856040518563ffffffff1660e01b81526004016119729493929190614b74565b6020604051808303816000875af1158015611991573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b59190614b47565b5050505050565b60606119c66120ed565b61080073ffffffffffffffffffffffffffffffffffffffff1663186b216785856040518363ffffffff1660e01b8152600401611a03929190614d25565b600060405180830381865afa158015611a20573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611a499190614f19565b915091509250929050565b6000611a5e61208a565b61080073ffffffffffffffffffffffffffffffffffffffff1663241774e685856040518363ffffffff1660e01b8152600401611a9b929190613c73565b600060405180830381865afa158015611ab8573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611ae19190613ea8565b915091509250929050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663fc08930c8433856040518463ffffffff1660e01b8152600401611b2d93929190614f91565b602060405180830381865afa158015611b4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6e9190614fcf565b905092915050565b6000600167ffffffffffffffff811115611b9357611b92612530565b5b604051908082528060200260200182016040528015611bc657816020015b6060815260200190600190039081611bb15790505b50905060405180606001604052806025815260200161571d6025913981600081518110611bf657611bf5614ffc565b5b6020026020010181905250600061080073ffffffffffffffffffffffffffffffffffffffff1663b60398958787856040518463ffffffff1660e01b8152600401611c42939291906150dc565b6020604051808303816000875af1158015611c61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8591906138d0565b905080611cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbe9061518c565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c3285876040518463ffffffff1660e01b8152600401611d0693929190614458565b6020604051808303816000875af1158015611d25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d499190614b47565b50505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b8152600401611d9493929190614319565b6020604051808303816000875af1158015611db3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd791906138d0565b905080611e19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1090614b27565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084600134611e469190614531565b6040518463ffffffff1660e01b8152600401611e6493929190614458565b6020604051808303816000875af1158015611e83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea791906138d0565b505050565b600061080073ffffffffffffffffffffffffffffffffffffffff166361dc5c3b8585856040518463ffffffff1660e01b8152600401611eed939291906151ac565b6020604051808303816000875af1158015611f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f3091906138d0565b905080611f72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6990615250565b60405180910390fd5b50505050565b6060611f826120ed565b61080073ffffffffffffffffffffffffffffffffffffffff166310a2851c878787876040518563ffffffff1660e01b8152600401611fc394939291906152e6565b600060405180830381865afa158015611fe0573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061200991906156a4565b9150915094509492505050565b60405180610160016040528060608152602001606081526020016000151581526020016000600381111561204d5761204c61236a565b5b8152602001600081526020016000815260200160608152602001600060070b8152602001600060070b815260200160008152602001600081525090565b604051806040016040528060608152602001600081525090565b60405180606001604052806060815260200160608152602001606081525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061215082612125565b9050919050565b61216081612145565b811461216b57600080fd5b50565b60008135905061217d81612157565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126121a8576121a7612183565b5b8235905067ffffffffffffffff8111156121c5576121c4612188565b5b6020830191508360208202830111156121e1576121e061218d565b5b9250929050565b6000819050919050565b6121fb816121e8565b811461220657600080fd5b50565b600081359050612218816121f2565b92915050565b600080600080606085870312156122385761223761211b565b5b60006122468782880161216e565b945050602085013567ffffffffffffffff81111561226757612266612120565b5b61227387828801612192565b9350935050604061228687828801612209565b91505092959194509250565b6000602082840312156122a8576122a761211b565b5b60006122b68482850161216e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156122f95780820151818401526020810190506122de565b60008484015250505050565b6000601f19601f8301169050919050565b6000612321826122bf565b61232b81856122ca565b935061233b8185602086016122db565b61234481612305565b840191505092915050565b60008115159050919050565b6123648161234f565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106123aa576123a961236a565b5b50565b60008190506123bb82612399565b919050565b60006123cb826123ad565b9050919050565b6123db816123c0565b82525050565b6123ea816121e8565b82525050565b60008160070b9050919050565b612406816123f0565b82525050565b600061016083016000830151848203600086015261242a8282612316565b915050602083015184820360208601526124448282612316565b9150506040830151612459604086018261235b565b50606083015161246c60608601826123d2565b50608083015161247f60808601826123e1565b5060a083015161249260a08601826123e1565b5060c083015184820360c08601526124aa8282612316565b91505060e08301516124bf60e08601826123fd565b506101008301516124d46101008601826123fd565b506101208301516124e96101208601826123e1565b506101408301516124fe6101408601826123e1565b508091505092915050565b60006020820190508181036000830152612523818461240c565b905092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61256882612305565b810181811067ffffffffffffffff8211171561258757612586612530565b5b80604052505050565b600061259a612111565b90506125a6828261255f565b919050565b600067ffffffffffffffff8211156125c6576125c5612530565b5b6125cf82612305565b9050602081019050919050565b82818337600083830152505050565b60006125fe6125f9846125ab565b612590565b90508281526020810184848401111561261a5761261961252b565b5b6126258482856125dc565b509392505050565b600082601f83011261264257612641612183565b5b81356126528482602086016125eb565b91505092915050565b6000806000606084860312156126745761267361211b565b5b60006126828682870161216e565b935050602084013567ffffffffffffffff8111156126a3576126a2612120565b5b6126af8682870161262d565b925050604084013567ffffffffffffffff8111156126d0576126cf612120565b5b6126dc8682870161262d565b9150509250925092565b6126ef816121e8565b82525050565b600060408301600083015184820360008601526127128282612316565b915050602083015161272760208601826123e1565b508091505092915050565b600060408201905061274760008301856126e6565b818103602083015261275981846126f5565b90509392505050565b60008060006060848603121561277b5761277a61211b565b5b60006127898682870161216e565b935050602084013567ffffffffffffffff8111156127aa576127a9612120565b5b6127b68682870161262d565b92505060406127c786828701612209565b9150509250925092565b600080604083850312156127e8576127e761211b565b5b600083013567ffffffffffffffff81111561280657612805612120565b5b6128128582860161262d565b925050602061282385828601612209565b9150509250929050565b600080604083850312156128445761284361211b565b5b60006128528582860161216e565b925050602083013567ffffffffffffffff81111561287357612872612120565b5b61287f8582860161262d565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600067ffffffffffffffff82169050919050565b6128d2816128b5565b82525050565b60c0820160008201516128ee60008501826123fd565b50602082015161290160208501826123fd565b50604082015161291460408501826123e1565b50606082015161292760608501826123e1565b50608082015161293a60808501826128c9565b5060a082015161294d60a08501826123fd565b50505050565b600061295f83836128d8565b60c08301905092915050565b6000602082019050919050565b600061298382612889565b61298d8185612894565b9350612998836128a5565b8060005b838110156129c95781516129b08882612953565b97506129bb8361296b565b92505060018101905061299c565b5085935050505092915050565b600060608301600083015184820360008601526129f38282612316565b91505060208301518482036020860152612a0d8282612316565b91505060408301518482036040860152612a278282612978565b9150508091505092915050565b60006020820190508181036000830152612a4e81846129d6565b905092915050565b60008060008060808587031215612a7057612a6f61211b565b5b6000612a7e8782880161216e565b945050602085013567ffffffffffffffff811115612a9f57612a9e612120565b5b612aab8782880161262d565b9350506040612abc87828801612209565b925050606085013567ffffffffffffffff811115612add57612adc612120565b5b612ae98782880161262d565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b608082016000820151612b3760008501826123fd565b506020820151612b4a60208501826123fd565b506040820151612b5d60408501826123e1565b506060820151612b7060608501826123e1565b50505050565b6000612b828383612b21565b60808301905092915050565b6000602082019050919050565b6000612ba682612af5565b612bb08185612b00565b9350612bbb83612b11565b8060005b83811015612bec578151612bd38882612b76565b9750612bde83612b8e565b925050600181019050612bbf565b5085935050505092915050565b60006080830160008301518482036000860152612c168282612316565b91505060208301518482036020860152612c308282612316565b91505060408301518482036040860152612c4a8282612316565b91505060608301518482036060860152612c648282612b9b565b9150508091505092915050565b60006020820190508181036000830152612c8b8184612bf9565b905092915050565b60008060008060808587031215612cad57612cac61211b565b5b6000612cbb8782880161216e565b945050602085013567ffffffffffffffff811115612cdc57612cdb612120565b5b612ce88782880161262d565b9350506040612cf987828801612209565b9250506060612d0a87828801612209565b91505092959194509250565b600060208284031215612d2c57612d2b61211b565b5b600082013567ffffffffffffffff811115612d4a57612d49612120565b5b612d568482850161262d565b91505092915050565b6000602082019050612d7460008301846126e6565b92915050565b60008060008060808587031215612d9457612d9361211b565b5b6000612da28782880161216e565b945050602085013567ffffffffffffffff811115612dc357612dc2612120565b5b612dcf8782880161262d565b935050604085013567ffffffffffffffff811115612df057612def612120565b5b612dfc8782880161262d565b9250506060612e0d87828801612209565b91505092959194509250565b600080fd5b600060a08284031215612e3457612e33612e19565b5b81905092915050565b60008060408385031215612e5457612e5361211b565b5b600083013567ffffffffffffffff811115612e7257612e71612120565b5b612e7e8582860161262d565b925050602083013567ffffffffffffffff811115612e9f57612e9e612120565b5b612eab85828601612e1e565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000610160830160008301518482036000860152612eff8282612316565b91505060208301518482036020860152612f198282612316565b9150506040830151612f2e604086018261235b565b506060830151612f4160608601826123d2565b506080830151612f5460808601826123e1565b5060a0830151612f6760a08601826123e1565b5060c083015184820360c0860152612f7f8282612316565b91505060e0830151612f9460e08601826123fd565b50610100830151612fa96101008601826123fd565b50610120830151612fbe6101208601826123e1565b50610140830151612fd36101408601826123e1565b508091505092915050565b6000612fea8383612ee1565b905092915050565b6000602082019050919050565b600061300a82612eb5565b6130148185612ec0565b93508360208202850161302685612ed1565b8060005b8581101561306257848403895281516130438582612fde565b945061304e83612ff2565b925060208a0199505060018101905061302a565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b600061309b82613074565b6130a5818561307f565b93506130b58185602086016122db565b6130be81612305565b840191505092915050565b600060408301600083015184820360008601526130e68282613090565b91505060208301516130fb60208601826128c9565b508091505092915050565b600060408201905081810360008301526131208185612fff565b9050818103602083015261313481846130c9565b90509392505050565b600080600080608085870312156131575761315661211b565b5b60006131658782880161216e565b945050602061317687828801612209565b935050604061318787828801612209565b925050606085013567ffffffffffffffff8111156131a8576131a7612120565b5b6131b48782880161262d565b91505092959194509250565b6000806000604084860312156131d9576131d861211b565b5b60006131e78682870161216e565b935050602084013567ffffffffffffffff81111561320857613207612120565b5b61321486828701612192565b92509250509250925092565b600080fd5b600080fd5b600067ffffffffffffffff82111561324557613244612530565b5b61324e82612305565b9050602081019050919050565b600061326e6132698461322a565b612590565b90508281526020810184848401111561328a5761328961252b565b5b6132958482856125dc565b509392505050565b600082601f8301126132b2576132b1612183565b5b81356132c284826020860161325b565b91505092915050565b6132d4816128b5565b81146132df57600080fd5b50565b6000813590506132f1816132cb565b92915050565b6133008161234f565b811461330b57600080fd5b50565b60008135905061331d816132f7565b92915050565b600060a0828403121561333957613338613220565b5b61334360a0612590565b9050600082013567ffffffffffffffff81111561336357613362613225565b5b61336f8482850161329d565b6000830152506020613383848285016132e2565b6020830152506040613397848285016132e2565b60408301525060606133ab8482850161330e565b60608301525060806133bf8482850161330e565b60808301525092915050565b600080600080608085870312156133e5576133e461211b565b5b60006133f38782880161216e565b945050602085013567ffffffffffffffff81111561341457613413612120565b5b6134208782880161262d565b935050604085013567ffffffffffffffff81111561344157613440612120565b5b61344d8782880161262d565b925050606085013567ffffffffffffffff81111561346e5761346d612120565b5b61347a87828801613323565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060808301600083015184820360008601526134cf8282612316565b915050602083015184820360208601526134e98282612316565b915050604083015184820360408601526135038282612316565b9150506060830151848203606086015261351d8282612b9b565b9150508091505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60a08201600082015161356c6000850182612b21565b50602082015161357f60808501826123e1565b50505050565b60006135918383613556565b60a08301905092915050565b6000602082019050919050565b60006135b58261352a565b6135bf8185613535565b93506135ca83613546565b8060005b838110156135fb5781516135e28882613585565b97506135ed8361359d565b9250506001810190506135ce565b5085935050505092915050565b6000604083016000830151848203600086015261362582826134b2565b9150506020830151848203602086015261363f82826135aa565b9150508091505092915050565b60006136588383613608565b905092915050565b6000602082019050919050565b600061367882613486565b6136828185613491565b935083602082028501613694856134a2565b8060005b858110156136d057848403895281516136b1858261364c565b94506136bc83613660565b925060208a01995050600181019050613698565b50829750879550505050505092915050565b600060408201905081810360008301526136fc818561366d565b9050818103602083015261371081846130c9565b90509392505050565b61372281612145565b82525050565b600082825260208201905092915050565b6000819050919050565b600061374f83856122ca565b935061375c8385846125dc565b61376583612305565b840190509392505050565b600061377d848484613743565b90509392505050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126137b2576137b1613790565b5b83810192508235915060208301925067ffffffffffffffff8211156137da576137d9613786565b5b6001820236038313156137f0576137ef61378b565b5b509250929050565b6000602082019050919050565b60006138118385613728565b93508360208402850161382384613739565b8060005b8781101561386957848403895261383e8284613795565b613849868284613770565b9550613854846137f8565b935060208b019a505050600181019050613827565b50829750879450505050509392505050565b60006060820190506138906000830187613719565b61389d60208301866126e6565b81810360408301526138b0818486613805565b905095945050505050565b6000815190506138ca816132f7565b92915050565b6000602082840312156138e6576138e561211b565b5b60006138f4848285016138bb565b91505092915050565b600082825260208201905092915050565b7f4661696c656420746f20617070726f7665207374616b696e67206d6574686f6460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061396a6021836138fd565b91506139758261390e565b604082019050919050565b600060208201905081810360008301526139998161395d565b9050919050565b60006020820190506139b56000830184613719565b92915050565b60006139ce6139c9846125ab565b612590565b9050828152602081018484840111156139ea576139e961252b565b5b6139f58482856122db565b509392505050565b600082601f830112613a1257613a11612183565b5b8151613a228482602086016139bb565b91505092915050565b60048110613a3857600080fd5b50565b600081519050613a4a81613a2b565b92915050565b600081519050613a5f816121f2565b92915050565b613a6e816123f0565b8114613a7957600080fd5b50565b600081519050613a8b81613a65565b92915050565b60006101608284031215613aa857613aa7613220565b5b613ab3610160612590565b9050600082015167ffffffffffffffff811115613ad357613ad2613225565b5b613adf848285016139fd565b600083015250602082015167ffffffffffffffff811115613b0357613b02613225565b5b613b0f848285016139fd565b6020830152506040613b23848285016138bb565b6040830152506060613b3784828501613a3b565b6060830152506080613b4b84828501613a50565b60808301525060a0613b5f84828501613a50565b60a08301525060c082015167ffffffffffffffff811115613b8357613b82613225565b5b613b8f848285016139fd565b60c08301525060e0613ba384828501613a7c565b60e083015250610100613bb884828501613a7c565b61010083015250610120613bce84828501613a50565b61012083015250610140613be484828501613a50565b6101408301525092915050565b600060208284031215613c0757613c0661211b565b5b600082015167ffffffffffffffff811115613c2557613c24612120565b5b613c3184828501613a91565b91505092915050565b6000613c45826122bf565b613c4f81856138fd565b9350613c5f8185602086016122db565b613c6881612305565b840191505092915050565b6000604082019050613c886000830185613719565b8181036020830152613c9a8184613c3a565b90509392505050565b600081905092915050565b6000613cb9826122bf565b613cc38185613ca3565b9350613cd38185602086016122db565b80840191505092915050565b6000613ceb8284613cae565b915081905092915050565b7f64656c656761746563616c6c0000000000000000000000000000000000000000600082015250565b6000613d2c600c83613ca3565b9150613d3782613cf6565b600c82019050919050565b6000613d4d82613d1f565b9150819050919050565b600081905092915050565b6000613d6d82613074565b613d778185613d57565b9350613d878185602086016122db565b80840191505092915050565b6000613d9f8284613d62565b915081905092915050565b7f6661696c65642064656c656761746563616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e066021836138fd565b9150613e1182613daa565b604082019050919050565b60006020820190508181036000830152613e3581613df9565b9050919050565b600060408284031215613e5257613e51613220565b5b613e5c6040612590565b9050600082015167ffffffffffffffff811115613e7c57613e7b613225565b5b613e88848285016139fd565b6000830152506020613e9c84828501613a50565b60208301525092915050565b60008060408385031215613ebf57613ebe61211b565b5b6000613ecd85828601613a50565b925050602083015167ffffffffffffffff811115613eee57613eed612120565b5b613efa85828601613e3c565b9150509250929050565b7f73746174696363616c6c00000000000000000000000000000000000000000000600082015250565b6000613f3a600a83613ca3565b9150613f4582613f04565b600a82019050919050565b6000613f5b82613f2d565b9150819050919050565b7f6661696c65642073746174696363616c6c20746f20707265636f6d70696c6500600082015250565b6000613f9b601f836138fd565b9150613fa682613f65565b602082019050919050565b60006020820190508181036000830152613fca81613f8e565b9050919050565b7f63616c6c00000000000000000000000000000000000000000000000000000000600082015250565b6000614007600483613ca3565b915061401282613fd1565b600482019050919050565b600061402882613ffa565b9150819050919050565b7f6661696c65642063616c6c20746f20707265636f6d70696c6500000000000000600082015250565b60006140686019836138fd565b915061407382614032565b602082019050919050565b600060208201905081810360008301526140978161405b565b9050919050565b7f63616c6c636f6465000000000000000000000000000000000000000000000000600082015250565b60006140d4600883613ca3565b91506140df8261409e565b600882019050919050565b60006140f5826140c7565b9150819050919050565b7f696e76616c69642063616c6c7479706500000000000000000000000000000000600082015250565b60006141356010836138fd565b9150614140826140ff565b602082019050919050565b6000602082019050818103600083015261416481614128565b9050919050565b600081549050919050565b60008190508160005260206000209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806141d257607f821691505b6020821081036141e5576141e461418b565b5b50919050565b60008190508160005260206000209050919050565b6000815461420d816141ba565b61421781866122ca565b9450600182166000811461423257600181146142485761427b565b60ff19831686528115156020028601935061427b565b614251856141eb565b60005b8381101561427357815481890152600182019150602081019050614254565b808801955050505b50505092915050565b60006142908383614200565b905092915050565b6000600182019050919050565b60006142b08261416b565b6142ba8185613728565b9350836020820285016142cc85614176565b8060005b85811015614307578484038952816142e88582614284565b94506142f383614298565b925060208a019950506001810190506142d0565b50829750879550505050505092915050565b600060608201905061432e6000830186613719565b61433b60208301856126e6565b818103604083015261434d81846142a5565b9050949350505050565b7f64656c65676174696f6e20617070726f76616c206661696c6564000000000000600082015250565b600061438d601a836138fd565b915061439882614357565b602082019050919050565b600060208201905081810360008301526143bc81614380565b9050919050565b60006040820190506143d86000830185613719565b6143e560208301846126e6565b9392505050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000614422600f836138fd565b915061442d826143ec565b602082019050919050565b6000602082019050818103600083015261445181614415565b9050919050565b600060608201905061446d6000830186613719565b818103602083015261447f8185613c3a565b905061448e60408301846126e6565b949350505050565b7f5374616b696e6720417070726f7665206661696c656400000000000000000000600082015250565b60006144cc6016836138fd565b91506144d782614496565b602082019050919050565b600060208201905081810360008301526144fb816144bf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061453c826121e8565b9150614547836121e8565b925082820190508082111561455f5761455e614502565b5b92915050565b600067ffffffffffffffff8211156145805761457f612530565b5b602082029050602081019050919050565b6000815190506145a0816132cb565b92915050565b600060c082840312156145bc576145bb613220565b5b6145c660c0612590565b905060006145d684828501613a7c565b60008301525060206145ea84828501613a7c565b60208301525060406145fe84828501613a50565b604083015250606061461284828501613a50565b606083015250608061462684828501614591565b60808301525060a061463a84828501613a7c565b60a08301525092915050565b600061465961465484614565565b612590565b90508083825260208201905060c0840283018581111561467c5761467b61218d565b5b835b818110156146a5578061469188826145a6565b84526020840193505060c08101905061467e565b5050509392505050565b600082601f8301126146c4576146c3612183565b5b81516146d4848260208601614646565b91505092915050565b6000606082840312156146f3576146f2613220565b5b6146fd6060612590565b9050600082015167ffffffffffffffff81111561471d5761471c613225565b5b614729848285016139fd565b600083015250602082015167ffffffffffffffff81111561474d5761474c613225565b5b614759848285016139fd565b602083015250604082015167ffffffffffffffff81111561477d5761477c613225565b5b614789848285016146af565b60408301525092915050565b6000602082840312156147ab576147aa61211b565b5b600082015167ffffffffffffffff8111156147c9576147c8612120565b5b6147d5848285016146dd565b91505092915050565b60006060820190506147f36000830186613719565b81810360208301526148058185613c3a565b905081810360408301526148198184613c3a565b9050949350505050565b600067ffffffffffffffff82111561483e5761483d612530565b5b602082029050602081019050919050565b60006080828403121561486557614864613220565b5b61486f6080612590565b9050600061487f84828501613a7c565b600083015250602061489384828501613a7c565b60208301525060406148a784828501613a50565b60408301525060606148bb84828501613a50565b60608301525092915050565b60006148da6148d584614823565b612590565b905080838252602082019050608084028301858111156148fd576148fc61218d565b5b835b818110156149265780614912888261484f565b8452602084019350506080810190506148ff565b5050509392505050565b600082601f83011261494557614944612183565b5b81516149558482602086016148c7565b91505092915050565b60006080828403121561497457614973613220565b5b61497e6080612590565b9050600082015167ffffffffffffffff81111561499e5761499d613225565b5b6149aa848285016139fd565b600083015250602082015167ffffffffffffffff8111156149ce576149cd613225565b5b6149da848285016139fd565b602083015250604082015167ffffffffffffffff8111156149fe576149fd613225565b5b614a0a848285016139fd565b604083015250606082015167ffffffffffffffff811115614a2e57614a2d613225565b5b614a3a84828501614930565b60608301525092915050565b600060208284031215614a5c57614a5b61211b565b5b600082015167ffffffffffffffff811115614a7a57614a79612120565b5b614a868482850161495e565b91505092915050565b6000608082019050614aa46000830187613719565b8181036020830152614ab68186613c3a565b9050614ac560408301856126e6565b614ad260608301846126e6565b95945050505050565b7f44656c656761746520417070726f7665206661696c6564000000000000000000600082015250565b6000614b116017836138fd565b9150614b1c82614adb565b602082019050919050565b60006020820190508181036000830152614b4081614b04565b9050919050565b600060208284031215614b5d57614b5c61211b565b5b6000614b6b84828501613a7c565b91505092915050565b6000608082019050614b896000830187613719565b8181036020830152614b9b8186613c3a565b90508181036040830152614baf8185613c3a565b9050614bbe60608301846126e6565b95945050505050565b60008083356001602003843603038112614be457614be3613790565b5b83810192508235915060208301925067ffffffffffffffff821115614c0c57614c0b613786565b5b600182023603831315614c2257614c2161378b565b5b509250929050565b6000614c36838561307f565b9350614c438385846125dc565b614c4c83612305565b840190509392505050565b6000614c6660208401846132e2565b905092915050565b6000614c7d602084018461330e565b905092915050565b600060a08301614c986000840184614bc7565b8583036000870152614cab838284614c2a565b92505050614cbc6020840184614c57565b614cc960208601826128c9565b50614cd76040840184614c57565b614ce460408601826128c9565b50614cf26060840184614c6e565b614cff606086018261235b565b50614d0d6080840184614c6e565b614d1a608086018261235b565b508091505092915050565b60006040820190508181036000830152614d3f8185613c3a565b90508181036020830152614d538184614c85565b90509392505050565b600067ffffffffffffffff821115614d7757614d76612530565b5b602082029050602081019050919050565b6000614d9b614d9684614d5c565b612590565b90508083825260208201905060208402830185811115614dbe57614dbd61218d565b5b835b81811015614e0557805167ffffffffffffffff811115614de357614de2612183565b5b808601614df08982613a91565b85526020850194505050602081019050614dc0565b5050509392505050565b600082601f830112614e2457614e23612183565b5b8151614e34848260208601614d88565b91505092915050565b6000614e50614e4b8461322a565b612590565b905082815260208101848484011115614e6c57614e6b61252b565b5b614e778482856122db565b509392505050565b600082601f830112614e9457614e93612183565b5b8151614ea4848260208601614e3d565b91505092915050565b600060408284031215614ec357614ec2613220565b5b614ecd6040612590565b9050600082015167ffffffffffffffff811115614eed57614eec613225565b5b614ef984828501614e7f565b6000830152506020614f0d84828501614591565b60208301525092915050565b60008060408385031215614f3057614f2f61211b565b5b600083015167ffffffffffffffff811115614f4e57614f4d612120565b5b614f5a85828601614e0f565b925050602083015167ffffffffffffffff811115614f7b57614f7a612120565b5b614f8785828601614ead565b9150509250929050565b6000606082019050614fa66000830186613719565b614fb36020830185613719565b8181036040830152614fc58184613c3a565b9050949350505050565b600060208284031215614fe557614fe461211b565b5b6000614ff384828501613a50565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b6000819050602082019050919050565b60006150528383612316565b905092915050565b6000602082019050919050565b60006150728261502b565b61507c8185613728565b93508360208202850161508e85615036565b8060005b858110156150ca57848403895281516150ab8582615046565b94506150b68361505a565b925060208a01995050600181019050615092565b50829750879550505050505092915050565b60006060820190506150f16000830186613719565b6150fe60208301856126e6565b81810360408301526151108184615067565b9050949350505050565b7f6661696c656420746f20617070726f766520756e64656c65676174696f6e206d60008201527f6574686f64000000000000000000000000000000000000000000000000000000602082015250565b60006151766025836138fd565b91506151818261511a565b604082019050919050565b600060208201905081810360008301526151a581615169565b9050919050565b60006040820190506151c16000830186613719565b81810360208301526151d4818486613805565b9050949350505050565b7f4661696c656420746f207265766f6b6520617070726f76616c20666f7220737460008201527f616b696e67206d6574686f647300000000000000000000000000000000000000602082015250565b600061523a602d836138fd565b9150615245826151de565b604082019050919050565b600060208201905081810360008301526152698161522d565b9050919050565b600060a083016000830151848203600086015261528d8282613090565b91505060208301516152a260208601826128c9565b5060408301516152b560408601826128c9565b5060608301516152c8606086018261235b565b5060808301516152db608086018261235b565b508091505092915050565b60006080820190506152fb6000830187613719565b818103602083015261530d8186613c3a565b905081810360408301526153218185613c3a565b905081810360608301526153358184615270565b905095945050505050565b600067ffffffffffffffff82111561535b5761535a612530565b5b602082029050602081019050919050565b60006080828403121561538257615381613220565b5b61538c6080612590565b9050600082015167ffffffffffffffff8111156153ac576153ab613225565b5b6153b8848285016139fd565b600083015250602082015167ffffffffffffffff8111156153dc576153db613225565b5b6153e8848285016139fd565b602083015250604082015167ffffffffffffffff81111561540c5761540b613225565b5b615418848285016139fd565b604083015250606082015167ffffffffffffffff81111561543c5761543b613225565b5b61544884828501614930565b60608301525092915050565b600067ffffffffffffffff82111561546f5761546e612530565b5b602082029050602081019050919050565b600060a0828403121561549657615495613220565b5b6154a06040612590565b905060006154b08482850161484f565b60008301525060806154c484828501613a50565b60208301525092915050565b60006154e36154de84615454565b612590565b90508083825260208201905060a084028301858111156155065761550561218d565b5b835b8181101561552f578061551b8882615480565b84526020840193505060a081019050615508565b5050509392505050565b600082601f83011261554e5761554d612183565b5b815161555e8482602086016154d0565b91505092915050565b60006040828403121561557d5761557c613220565b5b6155876040612590565b9050600082015167ffffffffffffffff8111156155a7576155a6613225565b5b6155b38482850161536c565b600083015250602082015167ffffffffffffffff8111156155d7576155d6613225565b5b6155e384828501615539565b60208301525092915050565b60006156026155fd84615340565b612590565b905080838252602082019050602084028301858111156156255761562461218d565b5b835b8181101561566c57805167ffffffffffffffff81111561564a57615649612183565b5b8086016156578982615567565b85526020850194505050602081019050615627565b5050509392505050565b600082601f83011261568b5761568a612183565b5b815161569b8482602086016155ef565b91505092915050565b600080604083850312156156bb576156ba61211b565b5b600083015167ffffffffffffffff8111156156d9576156d8612120565b5b6156e585828601615676565b925050602083015167ffffffffffffffff81111561570657615705612120565b5b61571285828601614ead565b915050925092905056fe2f636f736d6f732e7374616b696e672e763162657461312e4d7367556e64656c6567617465a264697066735822122025fb99f701996d5dbfba7bb291edb892dd49aca0491bb08fa976e3078bf77f5464736f6c63430008130033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/scripts/compile_smart_contracts/compile_smart_contracts.py b/scripts/compile_smart_contracts/compile_smart_contracts.py index c4574ecbe2..fe90f6b3a9 100644 --- a/scripts/compile_smart_contracts/compile_smart_contracts.py +++ b/scripts/compile_smart_contracts/compile_smart_contracts.py @@ -16,7 +16,7 @@ from dataclasses import dataclass from pathlib import Path from shutil import copy, rmtree -from typing import List +from typing import List, Union # The path to the main level of the Evmos repository. REPO_PATH = Path(__file__).parent.parent.parent @@ -60,7 +60,7 @@ class Contract: as well as the path to where the compiled JSON data is stored. """ - compiledJSONPath: Path | None + compiledJSONPath: Union[Path, None] filename: str path: Path relative_path: Path @@ -68,7 +68,7 @@ class Contract: def find_solidity_contracts( path: Path, - added_contract: str | None = None, + added_contract: Union[str, None] = None, ) -> List[Contract]: """ Finds all Solidity files in the given Path. @@ -273,7 +273,7 @@ def is_relative_target(path: Path) -> bool: return path == RELATIVE_TARGET -def compile_files(repo_path: Path, added_contract: str | None = None): +def compile_files(repo_path: Path, added_contract: Union[str, None] = None): """ This function compiles the Solidity contracts in the repository with Hardhat. diff --git a/x/erc20/keeper/testdata/ERC20DirectBalanceManipulation.json b/x/erc20/keeper/testdata/ERC20DirectBalanceManipulation.json index 19c984c659..0ff17069fc 100644 --- a/x/erc20/keeper/testdata/ERC20DirectBalanceManipulation.json +++ b/x/erc20/keeper/testdata/ERC20DirectBalanceManipulation.json @@ -1,7 +1,7 @@ { "_format": "hh-sol-artifact-1", "contractName": "ERC20DirectBalanceManipulation", - "sourceName": "solidity/ERC20DirectBalanceManipulation.sol", + "sourceName": "solidity/x/erc20/keeper/testdata/ERC20DirectBalanceManipulation.sol", "abi": [ { "inputs": [ @@ -660,8 +660,8 @@ "type": "function" } ], - "bytecode": "0x6080604052734dc6ac40af078661fc43823086e1513635eeab14600760016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200006657600080fd5b5060405162003dca38038062003dca83398181016040528101906200008c9190620006ef565b6040518060400160405280601e81526020017f455243323044697265637442616c616e63654d616e6970756c6174696f6e00008152506040518060400160405280601e81526020017f455243323044697265637442616c616e63654d616e6970756c6174696f6e0000815250818181600590816200010b919062000991565b5080600690816200011d919062000991565b5050506000600760006101000a81548160ff0219169083151502179055506200015f6000801b620001536200021160201b60201c565b6200021960201b60201c565b620001a07f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6620001946200021160201b60201c565b6200021960201b60201c565b620001e17f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a620001d56200021160201b60201c565b6200021960201b60201c565b5050620001f86000801b336200021960201b60201c565b6200020a33826200022f60201b60201c565b5062000c2b565b600033905090565b6200022b82826200039d60201b60201c565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620002a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002989062000ad9565b60405180910390fd5b620002b560008383620003db60201b60201c565b8060046000828254620002c9919062000b2a565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200037d919062000b76565b60405180910390a36200039960008383620003f360201b60201c565b5050565b620003af8282620003f860201b60201c565b620003d68160016000858152602001908152602001600020620004e960201b90919060201c565b505050565b620003ee8383836200052160201b60201c565b505050565b505050565b6200040a82826200058c60201b60201c565b620004e557600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200048a6200021160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600062000519836000018373ffffffffffffffffffffffffffffffffffffffff1660001b620005f660201b60201c565b905092915050565b620005348383836200067060201b60201c565b620005446200067560201b60201c565b1562000587576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200057e9062000c09565b60405180910390fd5b505050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60006200060a83836200068c60201b60201c565b620006655782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506200066a565b600090505b92915050565b505050565b6000600760009054906101000a900460ff16905090565b600080836001016000848152602001908152602001600020541415905092915050565b600080fd5b6000819050919050565b620006c981620006b4565b8114620006d557600080fd5b50565b600081519050620006e981620006be565b92915050565b600060208284031215620007085762000707620006af565b5b60006200071884828501620006d8565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620007a357607f821691505b602082108103620007b957620007b86200075b565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620008237fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620007e4565b6200082f8683620007e4565b95508019841693508086168417925050509392505050565b6000819050919050565b6000620008726200086c6200086684620006b4565b62000847565b620006b4565b9050919050565b6000819050919050565b6200088e8362000851565b620008a66200089d8262000879565b848454620007f1565b825550505050565b600090565b620008bd620008ae565b620008ca81848462000883565b505050565b5b81811015620008f257620008e6600082620008b3565b600181019050620008d0565b5050565b601f82111562000941576200090b81620007bf565b6200091684620007d4565b8101602085101562000926578190505b6200093e6200093585620007d4565b830182620008cf565b50505b505050565b600082821c905092915050565b6000620009666000198460080262000946565b1980831691505092915050565b600062000981838362000953565b9150826002028217905092915050565b6200099c8262000721565b67ffffffffffffffff811115620009b857620009b76200072c565b5b620009c482546200078a565b620009d1828285620008f6565b600060209050601f83116001811462000a095760008415620009f4578287015190505b62000a00858262000973565b86555062000a70565b601f19841662000a1986620007bf565b60005b8281101562000a435784890151825560018201915060208501945060208101905062000a1c565b8683101562000a63578489015162000a5f601f89168262000953565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000ac1601f8362000a78565b915062000ace8262000a89565b602082019050919050565b6000602082019050818103600083015262000af48162000ab2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000b3782620006b4565b915062000b4483620006b4565b925082820190508082111562000b5f5762000b5e62000afb565b5b92915050565b62000b7081620006b4565b82525050565b600060208201905062000b8d600083018462000b65565b92915050565b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b600062000bf1602a8362000a78565b915062000bfe8262000b93565b604082019050919050565b6000602082019050818103600083015262000c248162000be2565b9050919050565b61318f8062000c3b6000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063a457c2d711610097578063d539139311610071578063d53913931461052d578063d547741f1461054b578063dd62ed3e14610567578063e63ab1e914610597576101c4565b8063a457c2d71461049d578063a9059cbb146104cd578063ca15c873146104fd576101c4565b80639010d07c116100d35780639010d07c1461040157806391d148541461043157806395d89b4114610461578063a217fddf1461047f576101c4565b806370a08231146103ab57806379cc6790146103db5780638456cb59146103f7576101c4565b8063313ce567116101665780633f4ba83a116101405780633f4ba83a1461034b57806340c10f191461035557806342966c68146103715780635c975abb1461038d576101c4565b8063313ce567146102e157806336568abe146102ff578063395093511461031b576101c4565b806318160ddd116101a257806318160ddd1461024757806323b872dd14610265578063248a9ca3146102955780632f2ff15d146102c5576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063095ea7b314610217575b600080fd5b6101e360048036038101906101de9190612008565b6105b5565b6040516101f09190612050565b60405180910390f35b61020161062f565b60405161020e91906120fb565b60405180910390f35b610231600480360381019061022c91906121b1565b6106c1565b60405161023e9190612050565b60405180910390f35b61024f6106e4565b60405161025c9190612200565b60405180910390f35b61027f600480360381019061027a919061221b565b6106ee565b60405161028c9190612050565b60405180910390f35b6102af60048036038101906102aa91906122a4565b61071d565b6040516102bc91906122e0565b60405180910390f35b6102df60048036038101906102da91906122fb565b61073c565b005b6102e961075d565b6040516102f69190612357565b60405180910390f35b610319600480360381019061031491906122fb565b610766565b005b610335600480360381019061033091906121b1565b6107e9565b6040516103429190612050565b60405180910390f35b610353610820565b005b61036f600480360381019061036a91906121b1565b61089a565b005b61038b60048036038101906103869190612372565b610918565b005b61039561092c565b6040516103a29190612050565b60405180910390f35b6103c560048036038101906103c0919061239f565b610943565b6040516103d29190612200565b60405180910390f35b6103f560048036038101906103f091906121b1565b61098c565b005b6103ff6109ac565b005b61041b600480360381019061041691906123cc565b610a26565b604051610428919061241b565b60405180910390f35b61044b600480360381019061044691906122fb565b610a55565b6040516104589190612050565b60405180910390f35b610469610abf565b60405161047691906120fb565b60405180910390f35b610487610b51565b60405161049491906122e0565b60405180910390f35b6104b760048036038101906104b291906121b1565b610b58565b6040516104c49190612050565b60405180910390f35b6104e760048036038101906104e291906121b1565b610bcf565b6040516104f49190612050565b60405180910390f35b610517600480360381019061051291906122a4565b610c2c565b6040516105249190612200565b60405180910390f35b610535610c50565b60405161054291906122e0565b60405180910390f35b610565600480360381019061056091906122fb565b610c74565b005b610581600480360381019061057c9190612436565b610c95565b60405161058e9190612200565b60405180910390f35b61059f610d1c565b6040516105ac91906122e0565b60405180910390f35b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610628575061062782610d40565b5b9050919050565b60606005805461063e906124a5565b80601f016020809104026020016040519081016040528092919081815260200182805461066a906124a5565b80156106b75780601f1061068c576101008083540402835291602001916106b7565b820191906000526020600020905b81548152906001019060200180831161069a57829003601f168201915b5050505050905090565b6000806106cc610dba565b90506106d9818585610dc2565b600191505092915050565b6000600454905090565b6000806106f9610dba565b9050610706858285610f8b565b610711858585611017565b60019150509392505050565b6000806000838152602001908152602001600020600101549050919050565b6107458261071d565b61074e81611290565b61075883836112a4565b505050565b60006012905090565b61076e610dba565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146107db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d290612548565b60405180910390fd5b6107e582826112d8565b5050565b6000806107f4610dba565b90506108158185856108068589610c95565b6108109190612597565b610dc2565b600191505092915050565b6108517f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61084c610dba565b610a55565b610890576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108879061263d565b60405180910390fd5b61089861130c565b565b6108cb7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66108c6610dba565b610a55565b61090a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610901906126cf565b60405180910390fd5b610914828261136f565b5050565b610929610923610dba565b826114c6565b50565b6000600760009054906101000a900460ff16905090565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61099e82610998610dba565b83610f8b565b6109a882826114c6565b5050565b6109dd7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6109d8610dba565b610a55565b610a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1390612761565b60405180910390fd5b610a24611695565b565b6000610a4d82600160008681526020019081526020016000206116f890919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060068054610ace906124a5565b80601f0160208091040260200160405190810160405280929190818152602001828054610afa906124a5565b8015610b475780601f10610b1c57610100808354040283529160200191610b47565b820191906000526020600020905b815481529060010190602001808311610b2a57829003601f168201915b5050505050905090565b6000801b81565b600080610b63610dba565b90506000610b718286610c95565b905083811015610bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bad906127f3565b60405180910390fd5b610bc38286868403610dc2565b60019250505092915050565b600080600283610bdf9190612842565b9050610c18600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff168285610c139190612873565b611712565b50610c238482611712565b91505092915050565b6000610c4960016000848152602001908152602001600020611735565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610c7d8261071d565b610c8681611290565b610c9083836112d8565b505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610db35750610db28261174a565b5b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2890612919565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ea0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e97906129ab565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610f7e9190612200565b60405180910390a3505050565b6000610f978484610c95565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146110115781811015611003576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffa90612a17565b60405180910390fd5b6110108484848403610dc2565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611086576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107d90612aa9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ec90612b3b565b60405180910390fd5b6111008383836117b4565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117e90612bcd565b60405180910390fd5b818103600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516112779190612200565b60405180910390a361128a8484846117c4565b50505050565b6112a18161129c610dba565b6117c9565b50565b6112ae828261184e565b6112d3816001600085815260200190815260200160002061192e90919063ffffffff16565b505050565b6112e2828261195e565b6113078160016000858152602001908152602001600020611a3f90919063ffffffff16565b505050565b611314611a6f565b6000600760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611358610dba565b604051611365919061241b565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d590612c39565b60405180910390fd5b6113ea600083836117b4565b80600460008282546113fc9190612597565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516114ae9190612200565b60405180910390a36114c2600083836117c4565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152c90612ccb565b60405180910390fd5b611541826000836117b4565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156115c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bf90612d5d565b60405180910390fd5b818103600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600460008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161167c9190612200565b60405180910390a3611690836000846117c4565b505050565b61169d611ab8565b6001600760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586116e1610dba565b6040516116ee919061241b565b60405180910390a1565b60006117078360000183611b02565b60001c905092915050565b60008061171d610dba565b905061172a818585611017565b600191505092915050565b600061174382600001611b2d565b9050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6117bf838383611b3e565b505050565b505050565b6117d38282610a55565b61184a576117e081611b96565b6117ee8360001c6020611bc3565b6040516020016117ff929190612e51565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184191906120fb565b60405180910390fd5b5050565b6118588282610a55565b61192a57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506118cf610dba565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000611956836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611dff565b905092915050565b6119688282610a55565b15611a3b57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506119e0610dba565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000611a67836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611e6f565b905092915050565b611a7761092c565b611ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aad90612ed7565b60405180910390fd5b565b611ac061092c565b15611b00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af790612f43565b60405180910390fd5b565b6000826000018281548110611b1a57611b19612f63565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b611b49838383611f83565b611b5161092c565b15611b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8890613004565b60405180910390fd5b505050565b6060611bbc8273ffffffffffffffffffffffffffffffffffffffff16601460ff16611bc3565b9050919050565b606060006002836002611bd69190613024565b611be09190612597565b67ffffffffffffffff811115611bf957611bf8613066565b5b6040519080825280601f01601f191660200182016040528015611c2b5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611c6357611c62612f63565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611cc757611cc6612f63565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611d079190613024565b611d119190612597565b90505b6001811115611db1577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611d5357611d52612f63565b5b1a60f81b828281518110611d6a57611d69612f63565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611daa90613095565b9050611d14565b5060008414611df5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dec9061310a565b60405180910390fd5b8091505092915050565b6000611e0b8383611f88565b611e64578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611e69565b600090505b92915050565b60008083600101600084815260200190815260200160002054905060008114611f77576000600182611ea19190612873565b9050600060018660000180549050611eb99190612873565b9050818114611f28576000866000018281548110611eda57611ed9612f63565b5b9060005260206000200154905080876000018481548110611efe57611efd612f63565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480611f3c57611f3b61312a565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050611f7d565b60009150505b92915050565b505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611fe581611fb0565b8114611ff057600080fd5b50565b60008135905061200281611fdc565b92915050565b60006020828403121561201e5761201d611fab565b5b600061202c84828501611ff3565b91505092915050565b60008115159050919050565b61204a81612035565b82525050565b60006020820190506120656000830184612041565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156120a557808201518184015260208101905061208a565b60008484015250505050565b6000601f19601f8301169050919050565b60006120cd8261206b565b6120d78185612076565b93506120e7818560208601612087565b6120f0816120b1565b840191505092915050565b6000602082019050818103600083015261211581846120c2565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006121488261211d565b9050919050565b6121588161213d565b811461216357600080fd5b50565b6000813590506121758161214f565b92915050565b6000819050919050565b61218e8161217b565b811461219957600080fd5b50565b6000813590506121ab81612185565b92915050565b600080604083850312156121c8576121c7611fab565b5b60006121d685828601612166565b92505060206121e78582860161219c565b9150509250929050565b6121fa8161217b565b82525050565b600060208201905061221560008301846121f1565b92915050565b60008060006060848603121561223457612233611fab565b5b600061224286828701612166565b935050602061225386828701612166565b92505060406122648682870161219c565b9150509250925092565b6000819050919050565b6122818161226e565b811461228c57600080fd5b50565b60008135905061229e81612278565b92915050565b6000602082840312156122ba576122b9611fab565b5b60006122c88482850161228f565b91505092915050565b6122da8161226e565b82525050565b60006020820190506122f560008301846122d1565b92915050565b6000806040838503121561231257612311611fab565b5b60006123208582860161228f565b925050602061233185828601612166565b9150509250929050565b600060ff82169050919050565b6123518161233b565b82525050565b600060208201905061236c6000830184612348565b92915050565b60006020828403121561238857612387611fab565b5b60006123968482850161219c565b91505092915050565b6000602082840312156123b5576123b4611fab565b5b60006123c384828501612166565b91505092915050565b600080604083850312156123e3576123e2611fab565b5b60006123f18582860161228f565b92505060206124028582860161219c565b9150509250929050565b6124158161213d565b82525050565b6000602082019050612430600083018461240c565b92915050565b6000806040838503121561244d5761244c611fab565b5b600061245b85828601612166565b925050602061246c85828601612166565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806124bd57607f821691505b6020821081036124d0576124cf612476565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000612532602f83612076565b915061253d826124d6565b604082019050919050565b6000602082019050818103600083015261256181612525565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006125a28261217b565b91506125ad8361217b565b92508282019050808211156125c5576125c4612568565b5b92915050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f20756e706175736500000000000000602082015250565b6000612627603983612076565b9150612632826125cb565b604082019050919050565b600060208201905081810360008301526126568161261a565b9050919050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f7665206d696e74657220726f6c6520746f206d696e7400000000000000000000602082015250565b60006126b9603683612076565b91506126c48261265d565b604082019050919050565b600060208201905081810360008301526126e8816126ac565b9050919050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f207061757365000000000000000000602082015250565b600061274b603783612076565b9150612756826126ef565b604082019050919050565b6000602082019050818103600083015261277a8161273e565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006127dd602583612076565b91506127e882612781565b604082019050919050565b6000602082019050818103600083015261280c816127d0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061284d8261217b565b91506128588361217b565b92508261286857612867612813565b5b828204905092915050565b600061287e8261217b565b91506128898361217b565b92508282039050818111156128a1576128a0612568565b5b92915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612903602483612076565b915061290e826128a7565b604082019050919050565b60006020820190508181036000830152612932816128f6565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612995602283612076565b91506129a082612939565b604082019050919050565b600060208201905081810360008301526129c481612988565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612a01601d83612076565b9150612a0c826129cb565b602082019050919050565b60006020820190508181036000830152612a30816129f4565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612a93602583612076565b9150612a9e82612a37565b604082019050919050565b60006020820190508181036000830152612ac281612a86565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612b25602383612076565b9150612b3082612ac9565b604082019050919050565b60006020820190508181036000830152612b5481612b18565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000612bb7602683612076565b9150612bc282612b5b565b604082019050919050565b60006020820190508181036000830152612be681612baa565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000612c23601f83612076565b9150612c2e82612bed565b602082019050919050565b60006020820190508181036000830152612c5281612c16565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000612cb5602183612076565b9150612cc082612c59565b604082019050919050565b60006020820190508181036000830152612ce481612ca8565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000612d47602283612076565b9150612d5282612ceb565b604082019050919050565b60006020820190508181036000830152612d7681612d3a565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000612dbe601783612d7d565b9150612dc982612d88565b601782019050919050565b6000612ddf8261206b565b612de98185612d7d565b9350612df9818560208601612087565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000612e3b601183612d7d565b9150612e4682612e05565b601182019050919050565b6000612e5c82612db1565b9150612e688285612dd4565b9150612e7382612e2e565b9150612e7f8284612dd4565b91508190509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000612ec1601483612076565b9150612ecc82612e8b565b602082019050919050565b60006020820190508181036000830152612ef081612eb4565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000612f2d601083612076565b9150612f3882612ef7565b602082019050919050565b60006020820190508181036000830152612f5c81612f20565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b6000612fee602a83612076565b9150612ff982612f92565b604082019050919050565b6000602082019050818103600083015261301d81612fe1565b9050919050565b600061302f8261217b565b915061303a8361217b565b92508282026130488161217b565b9150828204841483151761305f5761305e612568565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006130a08261217b565b9150600082036130b3576130b2612568565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006130f4602083612076565b91506130ff826130be565b602082019050919050565b60006020820190508181036000830152613123816130e7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212201826981466f1ec51b03f9f3c18a6408f6a40a7fb82f51fb8099b09cf179c13eb64736f6c63430008130033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063a457c2d711610097578063d539139311610071578063d53913931461052d578063d547741f1461054b578063dd62ed3e14610567578063e63ab1e914610597576101c4565b8063a457c2d71461049d578063a9059cbb146104cd578063ca15c873146104fd576101c4565b80639010d07c116100d35780639010d07c1461040157806391d148541461043157806395d89b4114610461578063a217fddf1461047f576101c4565b806370a08231146103ab57806379cc6790146103db5780638456cb59146103f7576101c4565b8063313ce567116101665780633f4ba83a116101405780633f4ba83a1461034b57806340c10f191461035557806342966c68146103715780635c975abb1461038d576101c4565b8063313ce567146102e157806336568abe146102ff578063395093511461031b576101c4565b806318160ddd116101a257806318160ddd1461024757806323b872dd14610265578063248a9ca3146102955780632f2ff15d146102c5576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063095ea7b314610217575b600080fd5b6101e360048036038101906101de9190612008565b6105b5565b6040516101f09190612050565b60405180910390f35b61020161062f565b60405161020e91906120fb565b60405180910390f35b610231600480360381019061022c91906121b1565b6106c1565b60405161023e9190612050565b60405180910390f35b61024f6106e4565b60405161025c9190612200565b60405180910390f35b61027f600480360381019061027a919061221b565b6106ee565b60405161028c9190612050565b60405180910390f35b6102af60048036038101906102aa91906122a4565b61071d565b6040516102bc91906122e0565b60405180910390f35b6102df60048036038101906102da91906122fb565b61073c565b005b6102e961075d565b6040516102f69190612357565b60405180910390f35b610319600480360381019061031491906122fb565b610766565b005b610335600480360381019061033091906121b1565b6107e9565b6040516103429190612050565b60405180910390f35b610353610820565b005b61036f600480360381019061036a91906121b1565b61089a565b005b61038b60048036038101906103869190612372565b610918565b005b61039561092c565b6040516103a29190612050565b60405180910390f35b6103c560048036038101906103c0919061239f565b610943565b6040516103d29190612200565b60405180910390f35b6103f560048036038101906103f091906121b1565b61098c565b005b6103ff6109ac565b005b61041b600480360381019061041691906123cc565b610a26565b604051610428919061241b565b60405180910390f35b61044b600480360381019061044691906122fb565b610a55565b6040516104589190612050565b60405180910390f35b610469610abf565b60405161047691906120fb565b60405180910390f35b610487610b51565b60405161049491906122e0565b60405180910390f35b6104b760048036038101906104b291906121b1565b610b58565b6040516104c49190612050565b60405180910390f35b6104e760048036038101906104e291906121b1565b610bcf565b6040516104f49190612050565b60405180910390f35b610517600480360381019061051291906122a4565b610c2c565b6040516105249190612200565b60405180910390f35b610535610c50565b60405161054291906122e0565b60405180910390f35b610565600480360381019061056091906122fb565b610c74565b005b610581600480360381019061057c9190612436565b610c95565b60405161058e9190612200565b60405180910390f35b61059f610d1c565b6040516105ac91906122e0565b60405180910390f35b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610628575061062782610d40565b5b9050919050565b60606005805461063e906124a5565b80601f016020809104026020016040519081016040528092919081815260200182805461066a906124a5565b80156106b75780601f1061068c576101008083540402835291602001916106b7565b820191906000526020600020905b81548152906001019060200180831161069a57829003601f168201915b5050505050905090565b6000806106cc610dba565b90506106d9818585610dc2565b600191505092915050565b6000600454905090565b6000806106f9610dba565b9050610706858285610f8b565b610711858585611017565b60019150509392505050565b6000806000838152602001908152602001600020600101549050919050565b6107458261071d565b61074e81611290565b61075883836112a4565b505050565b60006012905090565b61076e610dba565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146107db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d290612548565b60405180910390fd5b6107e582826112d8565b5050565b6000806107f4610dba565b90506108158185856108068589610c95565b6108109190612597565b610dc2565b600191505092915050565b6108517f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61084c610dba565b610a55565b610890576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108879061263d565b60405180910390fd5b61089861130c565b565b6108cb7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66108c6610dba565b610a55565b61090a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610901906126cf565b60405180910390fd5b610914828261136f565b5050565b610929610923610dba565b826114c6565b50565b6000600760009054906101000a900460ff16905090565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61099e82610998610dba565b83610f8b565b6109a882826114c6565b5050565b6109dd7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6109d8610dba565b610a55565b610a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1390612761565b60405180910390fd5b610a24611695565b565b6000610a4d82600160008681526020019081526020016000206116f890919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060068054610ace906124a5565b80601f0160208091040260200160405190810160405280929190818152602001828054610afa906124a5565b8015610b475780601f10610b1c57610100808354040283529160200191610b47565b820191906000526020600020905b815481529060010190602001808311610b2a57829003601f168201915b5050505050905090565b6000801b81565b600080610b63610dba565b90506000610b718286610c95565b905083811015610bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bad906127f3565b60405180910390fd5b610bc38286868403610dc2565b60019250505092915050565b600080600283610bdf9190612842565b9050610c18600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff168285610c139190612873565b611712565b50610c238482611712565b91505092915050565b6000610c4960016000848152602001908152602001600020611735565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610c7d8261071d565b610c8681611290565b610c9083836112d8565b505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610db35750610db28261174a565b5b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2890612919565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ea0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e97906129ab565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610f7e9190612200565b60405180910390a3505050565b6000610f978484610c95565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146110115781811015611003576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffa90612a17565b60405180910390fd5b6110108484848403610dc2565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611086576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107d90612aa9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ec90612b3b565b60405180910390fd5b6111008383836117b4565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117e90612bcd565b60405180910390fd5b818103600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516112779190612200565b60405180910390a361128a8484846117c4565b50505050565b6112a18161129c610dba565b6117c9565b50565b6112ae828261184e565b6112d3816001600085815260200190815260200160002061192e90919063ffffffff16565b505050565b6112e2828261195e565b6113078160016000858152602001908152602001600020611a3f90919063ffffffff16565b505050565b611314611a6f565b6000600760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611358610dba565b604051611365919061241b565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d590612c39565b60405180910390fd5b6113ea600083836117b4565b80600460008282546113fc9190612597565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516114ae9190612200565b60405180910390a36114c2600083836117c4565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152c90612ccb565b60405180910390fd5b611541826000836117b4565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156115c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bf90612d5d565b60405180910390fd5b818103600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600460008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161167c9190612200565b60405180910390a3611690836000846117c4565b505050565b61169d611ab8565b6001600760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586116e1610dba565b6040516116ee919061241b565b60405180910390a1565b60006117078360000183611b02565b60001c905092915050565b60008061171d610dba565b905061172a818585611017565b600191505092915050565b600061174382600001611b2d565b9050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6117bf838383611b3e565b505050565b505050565b6117d38282610a55565b61184a576117e081611b96565b6117ee8360001c6020611bc3565b6040516020016117ff929190612e51565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184191906120fb565b60405180910390fd5b5050565b6118588282610a55565b61192a57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506118cf610dba565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000611956836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611dff565b905092915050565b6119688282610a55565b15611a3b57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506119e0610dba565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000611a67836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611e6f565b905092915050565b611a7761092c565b611ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aad90612ed7565b60405180910390fd5b565b611ac061092c565b15611b00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af790612f43565b60405180910390fd5b565b6000826000018281548110611b1a57611b19612f63565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b611b49838383611f83565b611b5161092c565b15611b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8890613004565b60405180910390fd5b505050565b6060611bbc8273ffffffffffffffffffffffffffffffffffffffff16601460ff16611bc3565b9050919050565b606060006002836002611bd69190613024565b611be09190612597565b67ffffffffffffffff811115611bf957611bf8613066565b5b6040519080825280601f01601f191660200182016040528015611c2b5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611c6357611c62612f63565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611cc757611cc6612f63565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611d079190613024565b611d119190612597565b90505b6001811115611db1577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611d5357611d52612f63565b5b1a60f81b828281518110611d6a57611d69612f63565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611daa90613095565b9050611d14565b5060008414611df5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dec9061310a565b60405180910390fd5b8091505092915050565b6000611e0b8383611f88565b611e64578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611e69565b600090505b92915050565b60008083600101600084815260200190815260200160002054905060008114611f77576000600182611ea19190612873565b9050600060018660000180549050611eb99190612873565b9050818114611f28576000866000018281548110611eda57611ed9612f63565b5b9060005260206000200154905080876000018481548110611efe57611efd612f63565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480611f3c57611f3b61312a565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050611f7d565b60009150505b92915050565b505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611fe581611fb0565b8114611ff057600080fd5b50565b60008135905061200281611fdc565b92915050565b60006020828403121561201e5761201d611fab565b5b600061202c84828501611ff3565b91505092915050565b60008115159050919050565b61204a81612035565b82525050565b60006020820190506120656000830184612041565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156120a557808201518184015260208101905061208a565b60008484015250505050565b6000601f19601f8301169050919050565b60006120cd8261206b565b6120d78185612076565b93506120e7818560208601612087565b6120f0816120b1565b840191505092915050565b6000602082019050818103600083015261211581846120c2565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006121488261211d565b9050919050565b6121588161213d565b811461216357600080fd5b50565b6000813590506121758161214f565b92915050565b6000819050919050565b61218e8161217b565b811461219957600080fd5b50565b6000813590506121ab81612185565b92915050565b600080604083850312156121c8576121c7611fab565b5b60006121d685828601612166565b92505060206121e78582860161219c565b9150509250929050565b6121fa8161217b565b82525050565b600060208201905061221560008301846121f1565b92915050565b60008060006060848603121561223457612233611fab565b5b600061224286828701612166565b935050602061225386828701612166565b92505060406122648682870161219c565b9150509250925092565b6000819050919050565b6122818161226e565b811461228c57600080fd5b50565b60008135905061229e81612278565b92915050565b6000602082840312156122ba576122b9611fab565b5b60006122c88482850161228f565b91505092915050565b6122da8161226e565b82525050565b60006020820190506122f560008301846122d1565b92915050565b6000806040838503121561231257612311611fab565b5b60006123208582860161228f565b925050602061233185828601612166565b9150509250929050565b600060ff82169050919050565b6123518161233b565b82525050565b600060208201905061236c6000830184612348565b92915050565b60006020828403121561238857612387611fab565b5b60006123968482850161219c565b91505092915050565b6000602082840312156123b5576123b4611fab565b5b60006123c384828501612166565b91505092915050565b600080604083850312156123e3576123e2611fab565b5b60006123f18582860161228f565b92505060206124028582860161219c565b9150509250929050565b6124158161213d565b82525050565b6000602082019050612430600083018461240c565b92915050565b6000806040838503121561244d5761244c611fab565b5b600061245b85828601612166565b925050602061246c85828601612166565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806124bd57607f821691505b6020821081036124d0576124cf612476565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000612532602f83612076565b915061253d826124d6565b604082019050919050565b6000602082019050818103600083015261256181612525565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006125a28261217b565b91506125ad8361217b565b92508282019050808211156125c5576125c4612568565b5b92915050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f20756e706175736500000000000000602082015250565b6000612627603983612076565b9150612632826125cb565b604082019050919050565b600060208201905081810360008301526126568161261a565b9050919050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f7665206d696e74657220726f6c6520746f206d696e7400000000000000000000602082015250565b60006126b9603683612076565b91506126c48261265d565b604082019050919050565b600060208201905081810360008301526126e8816126ac565b9050919050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f207061757365000000000000000000602082015250565b600061274b603783612076565b9150612756826126ef565b604082019050919050565b6000602082019050818103600083015261277a8161273e565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006127dd602583612076565b91506127e882612781565b604082019050919050565b6000602082019050818103600083015261280c816127d0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061284d8261217b565b91506128588361217b565b92508261286857612867612813565b5b828204905092915050565b600061287e8261217b565b91506128898361217b565b92508282039050818111156128a1576128a0612568565b5b92915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612903602483612076565b915061290e826128a7565b604082019050919050565b60006020820190508181036000830152612932816128f6565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612995602283612076565b91506129a082612939565b604082019050919050565b600060208201905081810360008301526129c481612988565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612a01601d83612076565b9150612a0c826129cb565b602082019050919050565b60006020820190508181036000830152612a30816129f4565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612a93602583612076565b9150612a9e82612a37565b604082019050919050565b60006020820190508181036000830152612ac281612a86565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612b25602383612076565b9150612b3082612ac9565b604082019050919050565b60006020820190508181036000830152612b5481612b18565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000612bb7602683612076565b9150612bc282612b5b565b604082019050919050565b60006020820190508181036000830152612be681612baa565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000612c23601f83612076565b9150612c2e82612bed565b602082019050919050565b60006020820190508181036000830152612c5281612c16565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000612cb5602183612076565b9150612cc082612c59565b604082019050919050565b60006020820190508181036000830152612ce481612ca8565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000612d47602283612076565b9150612d5282612ceb565b604082019050919050565b60006020820190508181036000830152612d7681612d3a565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000612dbe601783612d7d565b9150612dc982612d88565b601782019050919050565b6000612ddf8261206b565b612de98185612d7d565b9350612df9818560208601612087565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000612e3b601183612d7d565b9150612e4682612e05565b601182019050919050565b6000612e5c82612db1565b9150612e688285612dd4565b9150612e7382612e2e565b9150612e7f8284612dd4565b91508190509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000612ec1601483612076565b9150612ecc82612e8b565b602082019050919050565b60006020820190508181036000830152612ef081612eb4565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000612f2d601083612076565b9150612f3882612ef7565b602082019050919050565b60006020820190508181036000830152612f5c81612f20565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b6000612fee602a83612076565b9150612ff982612f92565b604082019050919050565b6000602082019050818103600083015261301d81612fe1565b9050919050565b600061302f8261217b565b915061303a8361217b565b92508282026130488161217b565b9150828204841483151761305f5761305e612568565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006130a08261217b565b9150600082036130b3576130b2612568565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006130f4602083612076565b91506130ff826130be565b602082019050919050565b60006020820190508181036000830152613123816130e7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212201826981466f1ec51b03f9f3c18a6408f6a40a7fb82f51fb8099b09cf179c13eb64736f6c63430008130033", + "bytecode": "0x6080604052734dc6ac40af078661fc43823086e1513635eeab14600760016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200006657600080fd5b5060405162003dca38038062003dca83398181016040528101906200008c9190620006ef565b6040518060400160405280601e81526020017f455243323044697265637442616c616e63654d616e6970756c6174696f6e00008152506040518060400160405280601e81526020017f455243323044697265637442616c616e63654d616e6970756c6174696f6e0000815250818181600590816200010b919062000991565b5080600690816200011d919062000991565b5050506000600760006101000a81548160ff0219169083151502179055506200015f6000801b620001536200021160201b60201c565b6200021960201b60201c565b620001a07f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6620001946200021160201b60201c565b6200021960201b60201c565b620001e17f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a620001d56200021160201b60201c565b6200021960201b60201c565b5050620001f86000801b336200021960201b60201c565b6200020a33826200022f60201b60201c565b5062000c2b565b600033905090565b6200022b82826200039d60201b60201c565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620002a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002989062000ad9565b60405180910390fd5b620002b560008383620003db60201b60201c565b8060046000828254620002c9919062000b2a565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200037d919062000b76565b60405180910390a36200039960008383620003f360201b60201c565b5050565b620003af8282620003f860201b60201c565b620003d68160016000858152602001908152602001600020620004e960201b90919060201c565b505050565b620003ee8383836200052160201b60201c565b505050565b505050565b6200040a82826200058c60201b60201c565b620004e557600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200048a6200021160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600062000519836000018373ffffffffffffffffffffffffffffffffffffffff1660001b620005f660201b60201c565b905092915050565b620005348383836200067060201b60201c565b620005446200067560201b60201c565b1562000587576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200057e9062000c09565b60405180910390fd5b505050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60006200060a83836200068c60201b60201c565b620006655782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506200066a565b600090505b92915050565b505050565b6000600760009054906101000a900460ff16905090565b600080836001016000848152602001908152602001600020541415905092915050565b600080fd5b6000819050919050565b620006c981620006b4565b8114620006d557600080fd5b50565b600081519050620006e981620006be565b92915050565b600060208284031215620007085762000707620006af565b5b60006200071884828501620006d8565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620007a357607f821691505b602082108103620007b957620007b86200075b565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620008237fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620007e4565b6200082f8683620007e4565b95508019841693508086168417925050509392505050565b6000819050919050565b6000620008726200086c6200086684620006b4565b62000847565b620006b4565b9050919050565b6000819050919050565b6200088e8362000851565b620008a66200089d8262000879565b848454620007f1565b825550505050565b600090565b620008bd620008ae565b620008ca81848462000883565b505050565b5b81811015620008f257620008e6600082620008b3565b600181019050620008d0565b5050565b601f82111562000941576200090b81620007bf565b6200091684620007d4565b8101602085101562000926578190505b6200093e6200093585620007d4565b830182620008cf565b50505b505050565b600082821c905092915050565b6000620009666000198460080262000946565b1980831691505092915050565b600062000981838362000953565b9150826002028217905092915050565b6200099c8262000721565b67ffffffffffffffff811115620009b857620009b76200072c565b5b620009c482546200078a565b620009d1828285620008f6565b600060209050601f83116001811462000a095760008415620009f4578287015190505b62000a00858262000973565b86555062000a70565b601f19841662000a1986620007bf565b60005b8281101562000a435784890151825560018201915060208501945060208101905062000a1c565b8683101562000a63578489015162000a5f601f89168262000953565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000ac1601f8362000a78565b915062000ace8262000a89565b602082019050919050565b6000602082019050818103600083015262000af48162000ab2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000b3782620006b4565b915062000b4483620006b4565b925082820190508082111562000b5f5762000b5e62000afb565b5b92915050565b62000b7081620006b4565b82525050565b600060208201905062000b8d600083018462000b65565b92915050565b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b600062000bf1602a8362000a78565b915062000bfe8262000b93565b604082019050919050565b6000602082019050818103600083015262000c248162000be2565b9050919050565b61318f8062000c3b6000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063a457c2d711610097578063d539139311610071578063d53913931461052d578063d547741f1461054b578063dd62ed3e14610567578063e63ab1e914610597576101c4565b8063a457c2d71461049d578063a9059cbb146104cd578063ca15c873146104fd576101c4565b80639010d07c116100d35780639010d07c1461040157806391d148541461043157806395d89b4114610461578063a217fddf1461047f576101c4565b806370a08231146103ab57806379cc6790146103db5780638456cb59146103f7576101c4565b8063313ce567116101665780633f4ba83a116101405780633f4ba83a1461034b57806340c10f191461035557806342966c68146103715780635c975abb1461038d576101c4565b8063313ce567146102e157806336568abe146102ff578063395093511461031b576101c4565b806318160ddd116101a257806318160ddd1461024757806323b872dd14610265578063248a9ca3146102955780632f2ff15d146102c5576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063095ea7b314610217575b600080fd5b6101e360048036038101906101de9190612008565b6105b5565b6040516101f09190612050565b60405180910390f35b61020161062f565b60405161020e91906120fb565b60405180910390f35b610231600480360381019061022c91906121b1565b6106c1565b60405161023e9190612050565b60405180910390f35b61024f6106e4565b60405161025c9190612200565b60405180910390f35b61027f600480360381019061027a919061221b565b6106ee565b60405161028c9190612050565b60405180910390f35b6102af60048036038101906102aa91906122a4565b61071d565b6040516102bc91906122e0565b60405180910390f35b6102df60048036038101906102da91906122fb565b61073c565b005b6102e961075d565b6040516102f69190612357565b60405180910390f35b610319600480360381019061031491906122fb565b610766565b005b610335600480360381019061033091906121b1565b6107e9565b6040516103429190612050565b60405180910390f35b610353610820565b005b61036f600480360381019061036a91906121b1565b61089a565b005b61038b60048036038101906103869190612372565b610918565b005b61039561092c565b6040516103a29190612050565b60405180910390f35b6103c560048036038101906103c0919061239f565b610943565b6040516103d29190612200565b60405180910390f35b6103f560048036038101906103f091906121b1565b61098c565b005b6103ff6109ac565b005b61041b600480360381019061041691906123cc565b610a26565b604051610428919061241b565b60405180910390f35b61044b600480360381019061044691906122fb565b610a55565b6040516104589190612050565b60405180910390f35b610469610abf565b60405161047691906120fb565b60405180910390f35b610487610b51565b60405161049491906122e0565b60405180910390f35b6104b760048036038101906104b291906121b1565b610b58565b6040516104c49190612050565b60405180910390f35b6104e760048036038101906104e291906121b1565b610bcf565b6040516104f49190612050565b60405180910390f35b610517600480360381019061051291906122a4565b610c2c565b6040516105249190612200565b60405180910390f35b610535610c50565b60405161054291906122e0565b60405180910390f35b610565600480360381019061056091906122fb565b610c74565b005b610581600480360381019061057c9190612436565b610c95565b60405161058e9190612200565b60405180910390f35b61059f610d1c565b6040516105ac91906122e0565b60405180910390f35b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610628575061062782610d40565b5b9050919050565b60606005805461063e906124a5565b80601f016020809104026020016040519081016040528092919081815260200182805461066a906124a5565b80156106b75780601f1061068c576101008083540402835291602001916106b7565b820191906000526020600020905b81548152906001019060200180831161069a57829003601f168201915b5050505050905090565b6000806106cc610dba565b90506106d9818585610dc2565b600191505092915050565b6000600454905090565b6000806106f9610dba565b9050610706858285610f8b565b610711858585611017565b60019150509392505050565b6000806000838152602001908152602001600020600101549050919050565b6107458261071d565b61074e81611290565b61075883836112a4565b505050565b60006012905090565b61076e610dba565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146107db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d290612548565b60405180910390fd5b6107e582826112d8565b5050565b6000806107f4610dba565b90506108158185856108068589610c95565b6108109190612597565b610dc2565b600191505092915050565b6108517f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61084c610dba565b610a55565b610890576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108879061263d565b60405180910390fd5b61089861130c565b565b6108cb7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66108c6610dba565b610a55565b61090a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610901906126cf565b60405180910390fd5b610914828261136f565b5050565b610929610923610dba565b826114c6565b50565b6000600760009054906101000a900460ff16905090565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61099e82610998610dba565b83610f8b565b6109a882826114c6565b5050565b6109dd7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6109d8610dba565b610a55565b610a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1390612761565b60405180910390fd5b610a24611695565b565b6000610a4d82600160008681526020019081526020016000206116f890919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060068054610ace906124a5565b80601f0160208091040260200160405190810160405280929190818152602001828054610afa906124a5565b8015610b475780601f10610b1c57610100808354040283529160200191610b47565b820191906000526020600020905b815481529060010190602001808311610b2a57829003601f168201915b5050505050905090565b6000801b81565b600080610b63610dba565b90506000610b718286610c95565b905083811015610bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bad906127f3565b60405180910390fd5b610bc38286868403610dc2565b60019250505092915050565b600080600283610bdf9190612842565b9050610c18600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff168285610c139190612873565b611712565b50610c238482611712565b91505092915050565b6000610c4960016000848152602001908152602001600020611735565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610c7d8261071d565b610c8681611290565b610c9083836112d8565b505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610db35750610db28261174a565b5b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2890612919565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ea0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e97906129ab565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610f7e9190612200565b60405180910390a3505050565b6000610f978484610c95565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146110115781811015611003576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffa90612a17565b60405180910390fd5b6110108484848403610dc2565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611086576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107d90612aa9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ec90612b3b565b60405180910390fd5b6111008383836117b4565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117e90612bcd565b60405180910390fd5b818103600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516112779190612200565b60405180910390a361128a8484846117c4565b50505050565b6112a18161129c610dba565b6117c9565b50565b6112ae828261184e565b6112d3816001600085815260200190815260200160002061192e90919063ffffffff16565b505050565b6112e2828261195e565b6113078160016000858152602001908152602001600020611a3f90919063ffffffff16565b505050565b611314611a6f565b6000600760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611358610dba565b604051611365919061241b565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d590612c39565b60405180910390fd5b6113ea600083836117b4565b80600460008282546113fc9190612597565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516114ae9190612200565b60405180910390a36114c2600083836117c4565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152c90612ccb565b60405180910390fd5b611541826000836117b4565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156115c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bf90612d5d565b60405180910390fd5b818103600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600460008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161167c9190612200565b60405180910390a3611690836000846117c4565b505050565b61169d611ab8565b6001600760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586116e1610dba565b6040516116ee919061241b565b60405180910390a1565b60006117078360000183611b02565b60001c905092915050565b60008061171d610dba565b905061172a818585611017565b600191505092915050565b600061174382600001611b2d565b9050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6117bf838383611b3e565b505050565b505050565b6117d38282610a55565b61184a576117e081611b96565b6117ee8360001c6020611bc3565b6040516020016117ff929190612e51565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184191906120fb565b60405180910390fd5b5050565b6118588282610a55565b61192a57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506118cf610dba565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000611956836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611dff565b905092915050565b6119688282610a55565b15611a3b57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506119e0610dba565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000611a67836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611e6f565b905092915050565b611a7761092c565b611ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aad90612ed7565b60405180910390fd5b565b611ac061092c565b15611b00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af790612f43565b60405180910390fd5b565b6000826000018281548110611b1a57611b19612f63565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b611b49838383611f83565b611b5161092c565b15611b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8890613004565b60405180910390fd5b505050565b6060611bbc8273ffffffffffffffffffffffffffffffffffffffff16601460ff16611bc3565b9050919050565b606060006002836002611bd69190613024565b611be09190612597565b67ffffffffffffffff811115611bf957611bf8613066565b5b6040519080825280601f01601f191660200182016040528015611c2b5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611c6357611c62612f63565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611cc757611cc6612f63565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611d079190613024565b611d119190612597565b90505b6001811115611db1577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611d5357611d52612f63565b5b1a60f81b828281518110611d6a57611d69612f63565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611daa90613095565b9050611d14565b5060008414611df5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dec9061310a565b60405180910390fd5b8091505092915050565b6000611e0b8383611f88565b611e64578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611e69565b600090505b92915050565b60008083600101600084815260200190815260200160002054905060008114611f77576000600182611ea19190612873565b9050600060018660000180549050611eb99190612873565b9050818114611f28576000866000018281548110611eda57611ed9612f63565b5b9060005260206000200154905080876000018481548110611efe57611efd612f63565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480611f3c57611f3b61312a565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050611f7d565b60009150505b92915050565b505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611fe581611fb0565b8114611ff057600080fd5b50565b60008135905061200281611fdc565b92915050565b60006020828403121561201e5761201d611fab565b5b600061202c84828501611ff3565b91505092915050565b60008115159050919050565b61204a81612035565b82525050565b60006020820190506120656000830184612041565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156120a557808201518184015260208101905061208a565b60008484015250505050565b6000601f19601f8301169050919050565b60006120cd8261206b565b6120d78185612076565b93506120e7818560208601612087565b6120f0816120b1565b840191505092915050565b6000602082019050818103600083015261211581846120c2565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006121488261211d565b9050919050565b6121588161213d565b811461216357600080fd5b50565b6000813590506121758161214f565b92915050565b6000819050919050565b61218e8161217b565b811461219957600080fd5b50565b6000813590506121ab81612185565b92915050565b600080604083850312156121c8576121c7611fab565b5b60006121d685828601612166565b92505060206121e78582860161219c565b9150509250929050565b6121fa8161217b565b82525050565b600060208201905061221560008301846121f1565b92915050565b60008060006060848603121561223457612233611fab565b5b600061224286828701612166565b935050602061225386828701612166565b92505060406122648682870161219c565b9150509250925092565b6000819050919050565b6122818161226e565b811461228c57600080fd5b50565b60008135905061229e81612278565b92915050565b6000602082840312156122ba576122b9611fab565b5b60006122c88482850161228f565b91505092915050565b6122da8161226e565b82525050565b60006020820190506122f560008301846122d1565b92915050565b6000806040838503121561231257612311611fab565b5b60006123208582860161228f565b925050602061233185828601612166565b9150509250929050565b600060ff82169050919050565b6123518161233b565b82525050565b600060208201905061236c6000830184612348565b92915050565b60006020828403121561238857612387611fab565b5b60006123968482850161219c565b91505092915050565b6000602082840312156123b5576123b4611fab565b5b60006123c384828501612166565b91505092915050565b600080604083850312156123e3576123e2611fab565b5b60006123f18582860161228f565b92505060206124028582860161219c565b9150509250929050565b6124158161213d565b82525050565b6000602082019050612430600083018461240c565b92915050565b6000806040838503121561244d5761244c611fab565b5b600061245b85828601612166565b925050602061246c85828601612166565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806124bd57607f821691505b6020821081036124d0576124cf612476565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000612532602f83612076565b915061253d826124d6565b604082019050919050565b6000602082019050818103600083015261256181612525565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006125a28261217b565b91506125ad8361217b565b92508282019050808211156125c5576125c4612568565b5b92915050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f20756e706175736500000000000000602082015250565b6000612627603983612076565b9150612632826125cb565b604082019050919050565b600060208201905081810360008301526126568161261a565b9050919050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f7665206d696e74657220726f6c6520746f206d696e7400000000000000000000602082015250565b60006126b9603683612076565b91506126c48261265d565b604082019050919050565b600060208201905081810360008301526126e8816126ac565b9050919050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f207061757365000000000000000000602082015250565b600061274b603783612076565b9150612756826126ef565b604082019050919050565b6000602082019050818103600083015261277a8161273e565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006127dd602583612076565b91506127e882612781565b604082019050919050565b6000602082019050818103600083015261280c816127d0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061284d8261217b565b91506128588361217b565b92508261286857612867612813565b5b828204905092915050565b600061287e8261217b565b91506128898361217b565b92508282039050818111156128a1576128a0612568565b5b92915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612903602483612076565b915061290e826128a7565b604082019050919050565b60006020820190508181036000830152612932816128f6565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612995602283612076565b91506129a082612939565b604082019050919050565b600060208201905081810360008301526129c481612988565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612a01601d83612076565b9150612a0c826129cb565b602082019050919050565b60006020820190508181036000830152612a30816129f4565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612a93602583612076565b9150612a9e82612a37565b604082019050919050565b60006020820190508181036000830152612ac281612a86565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612b25602383612076565b9150612b3082612ac9565b604082019050919050565b60006020820190508181036000830152612b5481612b18565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000612bb7602683612076565b9150612bc282612b5b565b604082019050919050565b60006020820190508181036000830152612be681612baa565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000612c23601f83612076565b9150612c2e82612bed565b602082019050919050565b60006020820190508181036000830152612c5281612c16565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000612cb5602183612076565b9150612cc082612c59565b604082019050919050565b60006020820190508181036000830152612ce481612ca8565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000612d47602283612076565b9150612d5282612ceb565b604082019050919050565b60006020820190508181036000830152612d7681612d3a565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000612dbe601783612d7d565b9150612dc982612d88565b601782019050919050565b6000612ddf8261206b565b612de98185612d7d565b9350612df9818560208601612087565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000612e3b601183612d7d565b9150612e4682612e05565b601182019050919050565b6000612e5c82612db1565b9150612e688285612dd4565b9150612e7382612e2e565b9150612e7f8284612dd4565b91508190509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000612ec1601483612076565b9150612ecc82612e8b565b602082019050919050565b60006020820190508181036000830152612ef081612eb4565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000612f2d601083612076565b9150612f3882612ef7565b602082019050919050565b60006020820190508181036000830152612f5c81612f20565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b6000612fee602a83612076565b9150612ff982612f92565b604082019050919050565b6000602082019050818103600083015261301d81612fe1565b9050919050565b600061302f8261217b565b915061303a8361217b565b92508282026130488161217b565b9150828204841483151761305f5761305e612568565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006130a08261217b565b9150600082036130b3576130b2612568565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006130f4602083612076565b91506130ff826130be565b602082019050919050565b60006020820190508181036000830152613123816130e7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212207e51811b14cef92dc9d1d2828ebf82f27a791da8bf268f130c73b8d14693a41764736f6c63430008130033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063a457c2d711610097578063d539139311610071578063d53913931461052d578063d547741f1461054b578063dd62ed3e14610567578063e63ab1e914610597576101c4565b8063a457c2d71461049d578063a9059cbb146104cd578063ca15c873146104fd576101c4565b80639010d07c116100d35780639010d07c1461040157806391d148541461043157806395d89b4114610461578063a217fddf1461047f576101c4565b806370a08231146103ab57806379cc6790146103db5780638456cb59146103f7576101c4565b8063313ce567116101665780633f4ba83a116101405780633f4ba83a1461034b57806340c10f191461035557806342966c68146103715780635c975abb1461038d576101c4565b8063313ce567146102e157806336568abe146102ff578063395093511461031b576101c4565b806318160ddd116101a257806318160ddd1461024757806323b872dd14610265578063248a9ca3146102955780632f2ff15d146102c5576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063095ea7b314610217575b600080fd5b6101e360048036038101906101de9190612008565b6105b5565b6040516101f09190612050565b60405180910390f35b61020161062f565b60405161020e91906120fb565b60405180910390f35b610231600480360381019061022c91906121b1565b6106c1565b60405161023e9190612050565b60405180910390f35b61024f6106e4565b60405161025c9190612200565b60405180910390f35b61027f600480360381019061027a919061221b565b6106ee565b60405161028c9190612050565b60405180910390f35b6102af60048036038101906102aa91906122a4565b61071d565b6040516102bc91906122e0565b60405180910390f35b6102df60048036038101906102da91906122fb565b61073c565b005b6102e961075d565b6040516102f69190612357565b60405180910390f35b610319600480360381019061031491906122fb565b610766565b005b610335600480360381019061033091906121b1565b6107e9565b6040516103429190612050565b60405180910390f35b610353610820565b005b61036f600480360381019061036a91906121b1565b61089a565b005b61038b60048036038101906103869190612372565b610918565b005b61039561092c565b6040516103a29190612050565b60405180910390f35b6103c560048036038101906103c0919061239f565b610943565b6040516103d29190612200565b60405180910390f35b6103f560048036038101906103f091906121b1565b61098c565b005b6103ff6109ac565b005b61041b600480360381019061041691906123cc565b610a26565b604051610428919061241b565b60405180910390f35b61044b600480360381019061044691906122fb565b610a55565b6040516104589190612050565b60405180910390f35b610469610abf565b60405161047691906120fb565b60405180910390f35b610487610b51565b60405161049491906122e0565b60405180910390f35b6104b760048036038101906104b291906121b1565b610b58565b6040516104c49190612050565b60405180910390f35b6104e760048036038101906104e291906121b1565b610bcf565b6040516104f49190612050565b60405180910390f35b610517600480360381019061051291906122a4565b610c2c565b6040516105249190612200565b60405180910390f35b610535610c50565b60405161054291906122e0565b60405180910390f35b610565600480360381019061056091906122fb565b610c74565b005b610581600480360381019061057c9190612436565b610c95565b60405161058e9190612200565b60405180910390f35b61059f610d1c565b6040516105ac91906122e0565b60405180910390f35b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610628575061062782610d40565b5b9050919050565b60606005805461063e906124a5565b80601f016020809104026020016040519081016040528092919081815260200182805461066a906124a5565b80156106b75780601f1061068c576101008083540402835291602001916106b7565b820191906000526020600020905b81548152906001019060200180831161069a57829003601f168201915b5050505050905090565b6000806106cc610dba565b90506106d9818585610dc2565b600191505092915050565b6000600454905090565b6000806106f9610dba565b9050610706858285610f8b565b610711858585611017565b60019150509392505050565b6000806000838152602001908152602001600020600101549050919050565b6107458261071d565b61074e81611290565b61075883836112a4565b505050565b60006012905090565b61076e610dba565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146107db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d290612548565b60405180910390fd5b6107e582826112d8565b5050565b6000806107f4610dba565b90506108158185856108068589610c95565b6108109190612597565b610dc2565b600191505092915050565b6108517f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61084c610dba565b610a55565b610890576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108879061263d565b60405180910390fd5b61089861130c565b565b6108cb7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66108c6610dba565b610a55565b61090a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610901906126cf565b60405180910390fd5b610914828261136f565b5050565b610929610923610dba565b826114c6565b50565b6000600760009054906101000a900460ff16905090565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61099e82610998610dba565b83610f8b565b6109a882826114c6565b5050565b6109dd7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6109d8610dba565b610a55565b610a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1390612761565b60405180910390fd5b610a24611695565b565b6000610a4d82600160008681526020019081526020016000206116f890919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060068054610ace906124a5565b80601f0160208091040260200160405190810160405280929190818152602001828054610afa906124a5565b8015610b475780601f10610b1c57610100808354040283529160200191610b47565b820191906000526020600020905b815481529060010190602001808311610b2a57829003601f168201915b5050505050905090565b6000801b81565b600080610b63610dba565b90506000610b718286610c95565b905083811015610bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bad906127f3565b60405180910390fd5b610bc38286868403610dc2565b60019250505092915050565b600080600283610bdf9190612842565b9050610c18600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff168285610c139190612873565b611712565b50610c238482611712565b91505092915050565b6000610c4960016000848152602001908152602001600020611735565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610c7d8261071d565b610c8681611290565b610c9083836112d8565b505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610db35750610db28261174a565b5b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2890612919565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ea0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e97906129ab565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610f7e9190612200565b60405180910390a3505050565b6000610f978484610c95565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146110115781811015611003576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffa90612a17565b60405180910390fd5b6110108484848403610dc2565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611086576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107d90612aa9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ec90612b3b565b60405180910390fd5b6111008383836117b4565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117e90612bcd565b60405180910390fd5b818103600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516112779190612200565b60405180910390a361128a8484846117c4565b50505050565b6112a18161129c610dba565b6117c9565b50565b6112ae828261184e565b6112d3816001600085815260200190815260200160002061192e90919063ffffffff16565b505050565b6112e2828261195e565b6113078160016000858152602001908152602001600020611a3f90919063ffffffff16565b505050565b611314611a6f565b6000600760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611358610dba565b604051611365919061241b565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d590612c39565b60405180910390fd5b6113ea600083836117b4565b80600460008282546113fc9190612597565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516114ae9190612200565b60405180910390a36114c2600083836117c4565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152c90612ccb565b60405180910390fd5b611541826000836117b4565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156115c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bf90612d5d565b60405180910390fd5b818103600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600460008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161167c9190612200565b60405180910390a3611690836000846117c4565b505050565b61169d611ab8565b6001600760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586116e1610dba565b6040516116ee919061241b565b60405180910390a1565b60006117078360000183611b02565b60001c905092915050565b60008061171d610dba565b905061172a818585611017565b600191505092915050565b600061174382600001611b2d565b9050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6117bf838383611b3e565b505050565b505050565b6117d38282610a55565b61184a576117e081611b96565b6117ee8360001c6020611bc3565b6040516020016117ff929190612e51565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184191906120fb565b60405180910390fd5b5050565b6118588282610a55565b61192a57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506118cf610dba565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000611956836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611dff565b905092915050565b6119688282610a55565b15611a3b57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506119e0610dba565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000611a67836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611e6f565b905092915050565b611a7761092c565b611ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aad90612ed7565b60405180910390fd5b565b611ac061092c565b15611b00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af790612f43565b60405180910390fd5b565b6000826000018281548110611b1a57611b19612f63565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b611b49838383611f83565b611b5161092c565b15611b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8890613004565b60405180910390fd5b505050565b6060611bbc8273ffffffffffffffffffffffffffffffffffffffff16601460ff16611bc3565b9050919050565b606060006002836002611bd69190613024565b611be09190612597565b67ffffffffffffffff811115611bf957611bf8613066565b5b6040519080825280601f01601f191660200182016040528015611c2b5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611c6357611c62612f63565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611cc757611cc6612f63565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611d079190613024565b611d119190612597565b90505b6001811115611db1577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611d5357611d52612f63565b5b1a60f81b828281518110611d6a57611d69612f63565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611daa90613095565b9050611d14565b5060008414611df5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dec9061310a565b60405180910390fd5b8091505092915050565b6000611e0b8383611f88565b611e64578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611e69565b600090505b92915050565b60008083600101600084815260200190815260200160002054905060008114611f77576000600182611ea19190612873565b9050600060018660000180549050611eb99190612873565b9050818114611f28576000866000018281548110611eda57611ed9612f63565b5b9060005260206000200154905080876000018481548110611efe57611efd612f63565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480611f3c57611f3b61312a565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050611f7d565b60009150505b92915050565b505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611fe581611fb0565b8114611ff057600080fd5b50565b60008135905061200281611fdc565b92915050565b60006020828403121561201e5761201d611fab565b5b600061202c84828501611ff3565b91505092915050565b60008115159050919050565b61204a81612035565b82525050565b60006020820190506120656000830184612041565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156120a557808201518184015260208101905061208a565b60008484015250505050565b6000601f19601f8301169050919050565b60006120cd8261206b565b6120d78185612076565b93506120e7818560208601612087565b6120f0816120b1565b840191505092915050565b6000602082019050818103600083015261211581846120c2565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006121488261211d565b9050919050565b6121588161213d565b811461216357600080fd5b50565b6000813590506121758161214f565b92915050565b6000819050919050565b61218e8161217b565b811461219957600080fd5b50565b6000813590506121ab81612185565b92915050565b600080604083850312156121c8576121c7611fab565b5b60006121d685828601612166565b92505060206121e78582860161219c565b9150509250929050565b6121fa8161217b565b82525050565b600060208201905061221560008301846121f1565b92915050565b60008060006060848603121561223457612233611fab565b5b600061224286828701612166565b935050602061225386828701612166565b92505060406122648682870161219c565b9150509250925092565b6000819050919050565b6122818161226e565b811461228c57600080fd5b50565b60008135905061229e81612278565b92915050565b6000602082840312156122ba576122b9611fab565b5b60006122c88482850161228f565b91505092915050565b6122da8161226e565b82525050565b60006020820190506122f560008301846122d1565b92915050565b6000806040838503121561231257612311611fab565b5b60006123208582860161228f565b925050602061233185828601612166565b9150509250929050565b600060ff82169050919050565b6123518161233b565b82525050565b600060208201905061236c6000830184612348565b92915050565b60006020828403121561238857612387611fab565b5b60006123968482850161219c565b91505092915050565b6000602082840312156123b5576123b4611fab565b5b60006123c384828501612166565b91505092915050565b600080604083850312156123e3576123e2611fab565b5b60006123f18582860161228f565b92505060206124028582860161219c565b9150509250929050565b6124158161213d565b82525050565b6000602082019050612430600083018461240c565b92915050565b6000806040838503121561244d5761244c611fab565b5b600061245b85828601612166565b925050602061246c85828601612166565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806124bd57607f821691505b6020821081036124d0576124cf612476565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000612532602f83612076565b915061253d826124d6565b604082019050919050565b6000602082019050818103600083015261256181612525565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006125a28261217b565b91506125ad8361217b565b92508282019050808211156125c5576125c4612568565b5b92915050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f20756e706175736500000000000000602082015250565b6000612627603983612076565b9150612632826125cb565b604082019050919050565b600060208201905081810360008301526126568161261a565b9050919050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f7665206d696e74657220726f6c6520746f206d696e7400000000000000000000602082015250565b60006126b9603683612076565b91506126c48261265d565b604082019050919050565b600060208201905081810360008301526126e8816126ac565b9050919050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f207061757365000000000000000000602082015250565b600061274b603783612076565b9150612756826126ef565b604082019050919050565b6000602082019050818103600083015261277a8161273e565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006127dd602583612076565b91506127e882612781565b604082019050919050565b6000602082019050818103600083015261280c816127d0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061284d8261217b565b91506128588361217b565b92508261286857612867612813565b5b828204905092915050565b600061287e8261217b565b91506128898361217b565b92508282039050818111156128a1576128a0612568565b5b92915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612903602483612076565b915061290e826128a7565b604082019050919050565b60006020820190508181036000830152612932816128f6565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612995602283612076565b91506129a082612939565b604082019050919050565b600060208201905081810360008301526129c481612988565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612a01601d83612076565b9150612a0c826129cb565b602082019050919050565b60006020820190508181036000830152612a30816129f4565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612a93602583612076565b9150612a9e82612a37565b604082019050919050565b60006020820190508181036000830152612ac281612a86565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612b25602383612076565b9150612b3082612ac9565b604082019050919050565b60006020820190508181036000830152612b5481612b18565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000612bb7602683612076565b9150612bc282612b5b565b604082019050919050565b60006020820190508181036000830152612be681612baa565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000612c23601f83612076565b9150612c2e82612bed565b602082019050919050565b60006020820190508181036000830152612c5281612c16565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000612cb5602183612076565b9150612cc082612c59565b604082019050919050565b60006020820190508181036000830152612ce481612ca8565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000612d47602283612076565b9150612d5282612ceb565b604082019050919050565b60006020820190508181036000830152612d7681612d3a565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000612dbe601783612d7d565b9150612dc982612d88565b601782019050919050565b6000612ddf8261206b565b612de98185612d7d565b9350612df9818560208601612087565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000612e3b601183612d7d565b9150612e4682612e05565b601182019050919050565b6000612e5c82612db1565b9150612e688285612dd4565b9150612e7382612e2e565b9150612e7f8284612dd4565b91508190509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000612ec1601483612076565b9150612ecc82612e8b565b602082019050919050565b60006020820190508181036000830152612ef081612eb4565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000612f2d601083612076565b9150612f3882612ef7565b602082019050919050565b60006020820190508181036000830152612f5c81612f20565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b6000612fee602a83612076565b9150612ff982612f92565b604082019050919050565b6000602082019050818103600083015261301d81612fe1565b9050919050565b600061302f8261217b565b915061303a8361217b565b92508282026130488161217b565b9150828204841483151761305f5761305e612568565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006130a08261217b565b9150600082036130b3576130b2612568565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006130f4602083612076565b91506130ff826130be565b602082019050919050565b60006020820190508181036000830152613123816130e7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212207e51811b14cef92dc9d1d2828ebf82f27a791da8bf268f130c73b8d14693a41764736f6c63430008130033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/x/erc20/keeper/testdata/ERC20MaliciousDelayed.json b/x/erc20/keeper/testdata/ERC20MaliciousDelayed.json index fadc57851b..49ce550220 100644 --- a/x/erc20/keeper/testdata/ERC20MaliciousDelayed.json +++ b/x/erc20/keeper/testdata/ERC20MaliciousDelayed.json @@ -1,7 +1,7 @@ { "_format": "hh-sol-artifact-1", "contractName": "ERC20MaliciousDelayed", - "sourceName": "solidity/ERC20MaliciousDelayed.sol", + "sourceName": "solidity/x/erc20/keeper/testdata/ERC20MaliciousDelayed.sol", "abi": [ { "inputs": [ @@ -660,8 +660,8 @@ "type": "function" } ], - "bytecode": "0x6080604052734dc6ac40af078661fc43823086e1513635eeab14600760016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550670de0b6b3a76400006008553480156200007257600080fd5b5060405162003d5c38038062003d5c8339818101604052810190620000989190620006fb565b6040518060400160405280601581526020017f45524332304d616c6963696f757344656c6179656400000000000000000000008152506040518060400160405280601581526020017f45524332304d414c4943494f555344454c415945440000000000000000000000815250818181600590816200011791906200099d565b5080600690816200012991906200099d565b5050506000600760006101000a81548160ff0219169083151502179055506200016b6000801b6200015f6200021d60201b60201c565b6200022560201b60201c565b620001ac7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6620001a06200021d60201b60201c565b6200022560201b60201c565b620001ed7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a620001e16200021d60201b60201c565b6200022560201b60201c565b5050620002046000801b336200022560201b60201c565b6200021633826200023b60201b60201c565b5062000c37565b600033905090565b620002378282620003a960201b60201c565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620002ad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002a49062000ae5565b60405180910390fd5b620002c160008383620003e760201b60201c565b8060046000828254620002d5919062000b36565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000389919062000b82565b60405180910390a3620003a560008383620003ff60201b60201c565b5050565b620003bb82826200040460201b60201c565b620003e28160016000858152602001908152602001600020620004f560201b90919060201c565b505050565b620003fa8383836200052d60201b60201c565b505050565b505050565b6200041682826200059860201b60201c565b620004f157600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620004966200021d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600062000525836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200060260201b60201c565b905092915050565b620005408383836200067c60201b60201c565b620005506200068160201b60201c565b1562000593576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200058a9062000c15565b60405180910390fd5b505050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60006200061683836200069860201b60201c565b6200067157826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905062000676565b600090505b92915050565b505050565b6000600760009054906101000a900460ff16905090565b600080836001016000848152602001908152602001600020541415905092915050565b600080fd5b6000819050919050565b620006d581620006c0565b8114620006e157600080fd5b50565b600081519050620006f581620006ca565b92915050565b600060208284031215620007145762000713620006bb565b5b60006200072484828501620006e4565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620007af57607f821691505b602082108103620007c557620007c462000767565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200082f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620007f0565b6200083b8683620007f0565b95508019841693508086168417925050509392505050565b6000819050919050565b60006200087e620008786200087284620006c0565b62000853565b620006c0565b9050919050565b6000819050919050565b6200089a836200085d565b620008b2620008a98262000885565b848454620007fd565b825550505050565b600090565b620008c9620008ba565b620008d68184846200088f565b505050565b5b81811015620008fe57620008f2600082620008bf565b600181019050620008dc565b5050565b601f8211156200094d576200091781620007cb565b6200092284620007e0565b8101602085101562000932578190505b6200094a6200094185620007e0565b830182620008db565b50505b505050565b600082821c905092915050565b6000620009726000198460080262000952565b1980831691505092915050565b60006200098d83836200095f565b9150826002028217905092915050565b620009a8826200072d565b67ffffffffffffffff811115620009c457620009c362000738565b5b620009d0825462000796565b620009dd82828562000902565b600060209050601f83116001811462000a15576000841562000a00578287015190505b62000a0c85826200097f565b86555062000a7c565b601f19841662000a2586620007cb565b60005b8281101562000a4f5784890151825560018201915060208501945060208101905062000a28565b8683101562000a6f578489015162000a6b601f8916826200095f565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000acd601f8362000a84565b915062000ada8262000a95565b602082019050919050565b6000602082019050818103600083015262000b008162000abe565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000b4382620006c0565b915062000b5083620006c0565b925082820190508082111562000b6b5762000b6a62000b07565b5b92915050565b62000b7c81620006c0565b82525050565b600060208201905062000b99600083018462000b71565b92915050565b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b600062000bfd602a8362000a84565b915062000c0a8262000b9f565b604082019050919050565b6000602082019050818103600083015262000c308162000bee565b9050919050565b6131158062000c476000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063a457c2d711610097578063d539139311610071578063d53913931461052d578063d547741f1461054b578063dd62ed3e14610567578063e63ab1e914610597576101c4565b8063a457c2d71461049d578063a9059cbb146104cd578063ca15c873146104fd576101c4565b80639010d07c116100d35780639010d07c1461040157806391d148541461043157806395d89b4114610461578063a217fddf1461047f576101c4565b806370a08231146103ab57806379cc6790146103db5780638456cb59146103f7576101c4565b8063313ce567116101665780633f4ba83a116101405780633f4ba83a1461034b57806340c10f191461035557806342966c68146103715780635c975abb1461038d576101c4565b8063313ce567146102e157806336568abe146102ff578063395093511461031b576101c4565b806318160ddd116101a257806318160ddd1461024757806323b872dd14610265578063248a9ca3146102955780632f2ff15d146102c5576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063095ea7b314610217575b600080fd5b6101e360048036038101906101de9190611fee565b6105b5565b6040516101f09190612036565b60405180910390f35b61020161062f565b60405161020e91906120e1565b60405180910390f35b610231600480360381019061022c9190612197565b6106c1565b60405161023e9190612036565b60405180910390f35b61024f6106e4565b60405161025c91906121e6565b60405180910390f35b61027f600480360381019061027a9190612201565b6106ee565b60405161028c9190612036565b60405180910390f35b6102af60048036038101906102aa919061228a565b61071d565b6040516102bc91906122c6565b60405180910390f35b6102df60048036038101906102da91906122e1565b61073c565b005b6102e961075d565b6040516102f6919061233d565b60405180910390f35b610319600480360381019061031491906122e1565b610766565b005b61033560048036038101906103309190612197565b6107e9565b6040516103429190612036565b60405180910390f35b610353610820565b005b61036f600480360381019061036a9190612197565b61089a565b005b61038b60048036038101906103869190612358565b610918565b005b61039561092c565b6040516103a29190612036565b60405180910390f35b6103c560048036038101906103c09190612385565b610943565b6040516103d291906121e6565b60405180910390f35b6103f560048036038101906103f09190612197565b61098c565b005b6103ff6109ac565b005b61041b600480360381019061041691906123b2565b610a26565b6040516104289190612401565b60405180910390f35b61044b600480360381019061044691906122e1565b610a55565b6040516104589190612036565b60405180910390f35b610469610abf565b60405161047691906120e1565b60405180910390f35b610487610b51565b60405161049491906122c6565b60405180910390f35b6104b760048036038101906104b29190612197565b610b58565b6040516104c49190612036565b60405180910390f35b6104e760048036038101906104e29190612197565b610bcf565b6040516104f49190612036565b60405180910390f35b6105176004803603810190610512919061228a565b610c12565b60405161052491906121e6565b60405180910390f35b610535610c36565b60405161054291906122c6565b60405180910390f35b610565600480360381019061056091906122e1565b610c5a565b005b610581600480360381019061057c919061241c565b610c7b565b60405161058e91906121e6565b60405180910390f35b61059f610d02565b6040516105ac91906122c6565b60405180910390f35b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610628575061062782610d26565b5b9050919050565b60606005805461063e9061248b565b80601f016020809104026020016040519081016040528092919081815260200182805461066a9061248b565b80156106b75780601f1061068c576101008083540402835291602001916106b7565b820191906000526020600020905b81548152906001019060200180831161069a57829003601f168201915b5050505050905090565b6000806106cc610da0565b90506106d9818585610da8565b600191505092915050565b6000600454905090565b6000806106f9610da0565b9050610706858285610f71565b610711858585610ffd565b60019150509392505050565b6000806000838152602001908152602001600020600101549050919050565b6107458261071d565b61074e81611276565b610758838361128a565b505050565b60006012905090565b61076e610da0565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146107db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d29061252e565b60405180910390fd5b6107e582826112be565b5050565b6000806107f4610da0565b90506108158185856108068589610c7b565b610810919061257d565b610da8565b600191505092915050565b6108517f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61084c610da0565b610a55565b610890576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088790612623565b60405180910390fd5b6108986112f2565b565b6108cb7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66108c6610da0565b610a55565b61090a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610901906126b5565b60405180910390fd5b6109148282611355565b5050565b610929610923610da0565b826114ac565b50565b6000600760009054906101000a900460ff16905090565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61099e82610998610da0565b83610f71565b6109a882826114ac565b5050565b6109dd7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6109d8610da0565b610a55565b610a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1390612747565b60405180910390fd5b610a2461167b565b565b6000610a4d82600160008681526020019081526020016000206116de90919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060068054610ace9061248b565b80601f0160208091040260200160405190810160405280929190818152602001828054610afa9061248b565b8015610b475780601f10610b1c57610100808354040283529160200191610b47565b820191906000526020600020905b815481529060010190602001808311610b2a57829003601f168201915b5050505050905090565b6000801b81565b600080610b63610da0565b90506000610b718286610c7b565b905083811015610bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bad906127d9565b60405180910390fd5b610bc38286868403610da8565b60019250505092915050565b6000610c0083600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600854610da8565b610c0a83836116f8565b905092915050565b6000610c2f6001600084815260200190815260200160002061171b565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610c638261071d565b610c6c81611276565b610c7683836112be565b505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d995750610d9882611730565b5b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0e9061286b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7d906128fd565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610f6491906121e6565b60405180910390a3505050565b6000610f7d8484610c7b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ff75781811015610fe9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe090612969565b60405180910390fd5b610ff68484848403610da8565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361106c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611063906129fb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d290612a8d565b60405180910390fd5b6110e683838361179a565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561116d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116490612b1f565b60405180910390fd5b818103600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161125d91906121e6565b60405180910390a36112708484846117aa565b50505050565b61128781611282610da0565b6117af565b50565b6112948282611834565b6112b9816001600085815260200190815260200160002061191490919063ffffffff16565b505050565b6112c88282611944565b6112ed8160016000858152602001908152602001600020611a2590919063ffffffff16565b505050565b6112fa611a55565b6000600760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61133e610da0565b60405161134b9190612401565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bb90612b8b565b60405180910390fd5b6113d06000838361179a565b80600460008282546113e2919061257d565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161149491906121e6565b60405180910390a36114a8600083836117aa565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361151b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151290612c1d565b60405180910390fd5b6115278260008361179a565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156115ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a590612caf565b60405180910390fd5b818103600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600460008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161166291906121e6565b60405180910390a3611676836000846117aa565b505050565b611683611a9e565b6001600760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586116c7610da0565b6040516116d49190612401565b60405180910390a1565b60006116ed8360000183611ae8565b60001c905092915050565b600080611703610da0565b9050611710818585610ffd565b600191505092915050565b600061172982600001611b13565b9050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6117a5838383611b24565b505050565b505050565b6117b98282610a55565b611830576117c681611b7c565b6117d48360001c6020611ba9565b6040516020016117e5929190612da3565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182791906120e1565b60405180910390fd5b5050565b61183e8282610a55565b61191057600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506118b5610da0565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600061193c836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611de5565b905092915050565b61194e8282610a55565b15611a2157600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506119c6610da0565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000611a4d836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611e55565b905092915050565b611a5d61092c565b611a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9390612e29565b60405180910390fd5b565b611aa661092c565b15611ae6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611add90612e95565b60405180910390fd5b565b6000826000018281548110611b0057611aff612eb5565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b611b2f838383611f69565b611b3761092c565b15611b77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6e90612f56565b60405180910390fd5b505050565b6060611ba28273ffffffffffffffffffffffffffffffffffffffff16601460ff16611ba9565b9050919050565b606060006002836002611bbc9190612f76565b611bc6919061257d565b67ffffffffffffffff811115611bdf57611bde612fb8565b5b6040519080825280601f01601f191660200182016040528015611c115781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611c4957611c48612eb5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611cad57611cac612eb5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611ced9190612f76565b611cf7919061257d565b90505b6001811115611d97577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611d3957611d38612eb5565b5b1a60f81b828281518110611d5057611d4f612eb5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611d9090612fe7565b9050611cfa565b5060008414611ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd29061305c565b60405180910390fd5b8091505092915050565b6000611df18383611f6e565b611e4a578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611e4f565b600090505b92915050565b60008083600101600084815260200190815260200160002054905060008114611f5d576000600182611e87919061307c565b9050600060018660000180549050611e9f919061307c565b9050818114611f0e576000866000018281548110611ec057611ebf612eb5565b5b9060005260206000200154905080876000018481548110611ee457611ee3612eb5565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480611f2257611f216130b0565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050611f63565b60009150505b92915050565b505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611fcb81611f96565b8114611fd657600080fd5b50565b600081359050611fe881611fc2565b92915050565b60006020828403121561200457612003611f91565b5b600061201284828501611fd9565b91505092915050565b60008115159050919050565b6120308161201b565b82525050565b600060208201905061204b6000830184612027565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561208b578082015181840152602081019050612070565b60008484015250505050565b6000601f19601f8301169050919050565b60006120b382612051565b6120bd818561205c565b93506120cd81856020860161206d565b6120d681612097565b840191505092915050565b600060208201905081810360008301526120fb81846120a8565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061212e82612103565b9050919050565b61213e81612123565b811461214957600080fd5b50565b60008135905061215b81612135565b92915050565b6000819050919050565b61217481612161565b811461217f57600080fd5b50565b6000813590506121918161216b565b92915050565b600080604083850312156121ae576121ad611f91565b5b60006121bc8582860161214c565b92505060206121cd85828601612182565b9150509250929050565b6121e081612161565b82525050565b60006020820190506121fb60008301846121d7565b92915050565b60008060006060848603121561221a57612219611f91565b5b60006122288682870161214c565b93505060206122398682870161214c565b925050604061224a86828701612182565b9150509250925092565b6000819050919050565b61226781612254565b811461227257600080fd5b50565b6000813590506122848161225e565b92915050565b6000602082840312156122a05761229f611f91565b5b60006122ae84828501612275565b91505092915050565b6122c081612254565b82525050565b60006020820190506122db60008301846122b7565b92915050565b600080604083850312156122f8576122f7611f91565b5b600061230685828601612275565b92505060206123178582860161214c565b9150509250929050565b600060ff82169050919050565b61233781612321565b82525050565b6000602082019050612352600083018461232e565b92915050565b60006020828403121561236e5761236d611f91565b5b600061237c84828501612182565b91505092915050565b60006020828403121561239b5761239a611f91565b5b60006123a98482850161214c565b91505092915050565b600080604083850312156123c9576123c8611f91565b5b60006123d785828601612275565b92505060206123e885828601612182565b9150509250929050565b6123fb81612123565b82525050565b600060208201905061241660008301846123f2565b92915050565b6000806040838503121561243357612432611f91565b5b60006124418582860161214c565b92505060206124528582860161214c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806124a357607f821691505b6020821081036124b6576124b561245c565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000612518602f8361205c565b9150612523826124bc565b604082019050919050565b600060208201905081810360008301526125478161250b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061258882612161565b915061259383612161565b92508282019050808211156125ab576125aa61254e565b5b92915050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f20756e706175736500000000000000602082015250565b600061260d60398361205c565b9150612618826125b1565b604082019050919050565b6000602082019050818103600083015261263c81612600565b9050919050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f7665206d696e74657220726f6c6520746f206d696e7400000000000000000000602082015250565b600061269f60368361205c565b91506126aa82612643565b604082019050919050565b600060208201905081810360008301526126ce81612692565b9050919050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f207061757365000000000000000000602082015250565b600061273160378361205c565b915061273c826126d5565b604082019050919050565b6000602082019050818103600083015261276081612724565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006127c360258361205c565b91506127ce82612767565b604082019050919050565b600060208201905081810360008301526127f2816127b6565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061285560248361205c565b9150612860826127f9565b604082019050919050565b6000602082019050818103600083015261288481612848565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006128e760228361205c565b91506128f28261288b565b604082019050919050565b60006020820190508181036000830152612916816128da565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612953601d8361205c565b915061295e8261291d565b602082019050919050565b6000602082019050818103600083015261298281612946565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006129e560258361205c565b91506129f082612989565b604082019050919050565b60006020820190508181036000830152612a14816129d8565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612a7760238361205c565b9150612a8282612a1b565b604082019050919050565b60006020820190508181036000830152612aa681612a6a565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000612b0960268361205c565b9150612b1482612aad565b604082019050919050565b60006020820190508181036000830152612b3881612afc565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000612b75601f8361205c565b9150612b8082612b3f565b602082019050919050565b60006020820190508181036000830152612ba481612b68565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000612c0760218361205c565b9150612c1282612bab565b604082019050919050565b60006020820190508181036000830152612c3681612bfa565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000612c9960228361205c565b9150612ca482612c3d565b604082019050919050565b60006020820190508181036000830152612cc881612c8c565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000612d10601783612ccf565b9150612d1b82612cda565b601782019050919050565b6000612d3182612051565b612d3b8185612ccf565b9350612d4b81856020860161206d565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000612d8d601183612ccf565b9150612d9882612d57565b601182019050919050565b6000612dae82612d03565b9150612dba8285612d26565b9150612dc582612d80565b9150612dd18284612d26565b91508190509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000612e1360148361205c565b9150612e1e82612ddd565b602082019050919050565b60006020820190508181036000830152612e4281612e06565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000612e7f60108361205c565b9150612e8a82612e49565b602082019050919050565b60006020820190508181036000830152612eae81612e72565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b6000612f40602a8361205c565b9150612f4b82612ee4565b604082019050919050565b60006020820190508181036000830152612f6f81612f33565b9050919050565b6000612f8182612161565b9150612f8c83612161565b9250828202612f9a81612161565b91508282048414831517612fb157612fb061254e565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000612ff282612161565b9150600082036130055761300461254e565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061304660208361205c565b915061305182613010565b602082019050919050565b6000602082019050818103600083015261307581613039565b9050919050565b600061308782612161565b915061309283612161565b92508282039050818111156130aa576130a961254e565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea264697066735822122048dbc607f899fe32ad35f6b79035fe92c713a380571de42e1ed7404d0a2da28464736f6c63430008130033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063a457c2d711610097578063d539139311610071578063d53913931461052d578063d547741f1461054b578063dd62ed3e14610567578063e63ab1e914610597576101c4565b8063a457c2d71461049d578063a9059cbb146104cd578063ca15c873146104fd576101c4565b80639010d07c116100d35780639010d07c1461040157806391d148541461043157806395d89b4114610461578063a217fddf1461047f576101c4565b806370a08231146103ab57806379cc6790146103db5780638456cb59146103f7576101c4565b8063313ce567116101665780633f4ba83a116101405780633f4ba83a1461034b57806340c10f191461035557806342966c68146103715780635c975abb1461038d576101c4565b8063313ce567146102e157806336568abe146102ff578063395093511461031b576101c4565b806318160ddd116101a257806318160ddd1461024757806323b872dd14610265578063248a9ca3146102955780632f2ff15d146102c5576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063095ea7b314610217575b600080fd5b6101e360048036038101906101de9190611fee565b6105b5565b6040516101f09190612036565b60405180910390f35b61020161062f565b60405161020e91906120e1565b60405180910390f35b610231600480360381019061022c9190612197565b6106c1565b60405161023e9190612036565b60405180910390f35b61024f6106e4565b60405161025c91906121e6565b60405180910390f35b61027f600480360381019061027a9190612201565b6106ee565b60405161028c9190612036565b60405180910390f35b6102af60048036038101906102aa919061228a565b61071d565b6040516102bc91906122c6565b60405180910390f35b6102df60048036038101906102da91906122e1565b61073c565b005b6102e961075d565b6040516102f6919061233d565b60405180910390f35b610319600480360381019061031491906122e1565b610766565b005b61033560048036038101906103309190612197565b6107e9565b6040516103429190612036565b60405180910390f35b610353610820565b005b61036f600480360381019061036a9190612197565b61089a565b005b61038b60048036038101906103869190612358565b610918565b005b61039561092c565b6040516103a29190612036565b60405180910390f35b6103c560048036038101906103c09190612385565b610943565b6040516103d291906121e6565b60405180910390f35b6103f560048036038101906103f09190612197565b61098c565b005b6103ff6109ac565b005b61041b600480360381019061041691906123b2565b610a26565b6040516104289190612401565b60405180910390f35b61044b600480360381019061044691906122e1565b610a55565b6040516104589190612036565b60405180910390f35b610469610abf565b60405161047691906120e1565b60405180910390f35b610487610b51565b60405161049491906122c6565b60405180910390f35b6104b760048036038101906104b29190612197565b610b58565b6040516104c49190612036565b60405180910390f35b6104e760048036038101906104e29190612197565b610bcf565b6040516104f49190612036565b60405180910390f35b6105176004803603810190610512919061228a565b610c12565b60405161052491906121e6565b60405180910390f35b610535610c36565b60405161054291906122c6565b60405180910390f35b610565600480360381019061056091906122e1565b610c5a565b005b610581600480360381019061057c919061241c565b610c7b565b60405161058e91906121e6565b60405180910390f35b61059f610d02565b6040516105ac91906122c6565b60405180910390f35b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610628575061062782610d26565b5b9050919050565b60606005805461063e9061248b565b80601f016020809104026020016040519081016040528092919081815260200182805461066a9061248b565b80156106b75780601f1061068c576101008083540402835291602001916106b7565b820191906000526020600020905b81548152906001019060200180831161069a57829003601f168201915b5050505050905090565b6000806106cc610da0565b90506106d9818585610da8565b600191505092915050565b6000600454905090565b6000806106f9610da0565b9050610706858285610f71565b610711858585610ffd565b60019150509392505050565b6000806000838152602001908152602001600020600101549050919050565b6107458261071d565b61074e81611276565b610758838361128a565b505050565b60006012905090565b61076e610da0565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146107db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d29061252e565b60405180910390fd5b6107e582826112be565b5050565b6000806107f4610da0565b90506108158185856108068589610c7b565b610810919061257d565b610da8565b600191505092915050565b6108517f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61084c610da0565b610a55565b610890576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088790612623565b60405180910390fd5b6108986112f2565b565b6108cb7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66108c6610da0565b610a55565b61090a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610901906126b5565b60405180910390fd5b6109148282611355565b5050565b610929610923610da0565b826114ac565b50565b6000600760009054906101000a900460ff16905090565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61099e82610998610da0565b83610f71565b6109a882826114ac565b5050565b6109dd7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6109d8610da0565b610a55565b610a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1390612747565b60405180910390fd5b610a2461167b565b565b6000610a4d82600160008681526020019081526020016000206116de90919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060068054610ace9061248b565b80601f0160208091040260200160405190810160405280929190818152602001828054610afa9061248b565b8015610b475780601f10610b1c57610100808354040283529160200191610b47565b820191906000526020600020905b815481529060010190602001808311610b2a57829003601f168201915b5050505050905090565b6000801b81565b600080610b63610da0565b90506000610b718286610c7b565b905083811015610bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bad906127d9565b60405180910390fd5b610bc38286868403610da8565b60019250505092915050565b6000610c0083600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600854610da8565b610c0a83836116f8565b905092915050565b6000610c2f6001600084815260200190815260200160002061171b565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610c638261071d565b610c6c81611276565b610c7683836112be565b505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d995750610d9882611730565b5b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0e9061286b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7d906128fd565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610f6491906121e6565b60405180910390a3505050565b6000610f7d8484610c7b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ff75781811015610fe9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe090612969565b60405180910390fd5b610ff68484848403610da8565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361106c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611063906129fb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d290612a8d565b60405180910390fd5b6110e683838361179a565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561116d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116490612b1f565b60405180910390fd5b818103600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161125d91906121e6565b60405180910390a36112708484846117aa565b50505050565b61128781611282610da0565b6117af565b50565b6112948282611834565b6112b9816001600085815260200190815260200160002061191490919063ffffffff16565b505050565b6112c88282611944565b6112ed8160016000858152602001908152602001600020611a2590919063ffffffff16565b505050565b6112fa611a55565b6000600760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61133e610da0565b60405161134b9190612401565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bb90612b8b565b60405180910390fd5b6113d06000838361179a565b80600460008282546113e2919061257d565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161149491906121e6565b60405180910390a36114a8600083836117aa565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361151b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151290612c1d565b60405180910390fd5b6115278260008361179a565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156115ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a590612caf565b60405180910390fd5b818103600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600460008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161166291906121e6565b60405180910390a3611676836000846117aa565b505050565b611683611a9e565b6001600760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586116c7610da0565b6040516116d49190612401565b60405180910390a1565b60006116ed8360000183611ae8565b60001c905092915050565b600080611703610da0565b9050611710818585610ffd565b600191505092915050565b600061172982600001611b13565b9050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6117a5838383611b24565b505050565b505050565b6117b98282610a55565b611830576117c681611b7c565b6117d48360001c6020611ba9565b6040516020016117e5929190612da3565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182791906120e1565b60405180910390fd5b5050565b61183e8282610a55565b61191057600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506118b5610da0565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600061193c836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611de5565b905092915050565b61194e8282610a55565b15611a2157600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506119c6610da0565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000611a4d836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611e55565b905092915050565b611a5d61092c565b611a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9390612e29565b60405180910390fd5b565b611aa661092c565b15611ae6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611add90612e95565b60405180910390fd5b565b6000826000018281548110611b0057611aff612eb5565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b611b2f838383611f69565b611b3761092c565b15611b77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6e90612f56565b60405180910390fd5b505050565b6060611ba28273ffffffffffffffffffffffffffffffffffffffff16601460ff16611ba9565b9050919050565b606060006002836002611bbc9190612f76565b611bc6919061257d565b67ffffffffffffffff811115611bdf57611bde612fb8565b5b6040519080825280601f01601f191660200182016040528015611c115781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611c4957611c48612eb5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611cad57611cac612eb5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611ced9190612f76565b611cf7919061257d565b90505b6001811115611d97577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611d3957611d38612eb5565b5b1a60f81b828281518110611d5057611d4f612eb5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611d9090612fe7565b9050611cfa565b5060008414611ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd29061305c565b60405180910390fd5b8091505092915050565b6000611df18383611f6e565b611e4a578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611e4f565b600090505b92915050565b60008083600101600084815260200190815260200160002054905060008114611f5d576000600182611e87919061307c565b9050600060018660000180549050611e9f919061307c565b9050818114611f0e576000866000018281548110611ec057611ebf612eb5565b5b9060005260206000200154905080876000018481548110611ee457611ee3612eb5565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480611f2257611f216130b0565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050611f63565b60009150505b92915050565b505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611fcb81611f96565b8114611fd657600080fd5b50565b600081359050611fe881611fc2565b92915050565b60006020828403121561200457612003611f91565b5b600061201284828501611fd9565b91505092915050565b60008115159050919050565b6120308161201b565b82525050565b600060208201905061204b6000830184612027565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561208b578082015181840152602081019050612070565b60008484015250505050565b6000601f19601f8301169050919050565b60006120b382612051565b6120bd818561205c565b93506120cd81856020860161206d565b6120d681612097565b840191505092915050565b600060208201905081810360008301526120fb81846120a8565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061212e82612103565b9050919050565b61213e81612123565b811461214957600080fd5b50565b60008135905061215b81612135565b92915050565b6000819050919050565b61217481612161565b811461217f57600080fd5b50565b6000813590506121918161216b565b92915050565b600080604083850312156121ae576121ad611f91565b5b60006121bc8582860161214c565b92505060206121cd85828601612182565b9150509250929050565b6121e081612161565b82525050565b60006020820190506121fb60008301846121d7565b92915050565b60008060006060848603121561221a57612219611f91565b5b60006122288682870161214c565b93505060206122398682870161214c565b925050604061224a86828701612182565b9150509250925092565b6000819050919050565b61226781612254565b811461227257600080fd5b50565b6000813590506122848161225e565b92915050565b6000602082840312156122a05761229f611f91565b5b60006122ae84828501612275565b91505092915050565b6122c081612254565b82525050565b60006020820190506122db60008301846122b7565b92915050565b600080604083850312156122f8576122f7611f91565b5b600061230685828601612275565b92505060206123178582860161214c565b9150509250929050565b600060ff82169050919050565b61233781612321565b82525050565b6000602082019050612352600083018461232e565b92915050565b60006020828403121561236e5761236d611f91565b5b600061237c84828501612182565b91505092915050565b60006020828403121561239b5761239a611f91565b5b60006123a98482850161214c565b91505092915050565b600080604083850312156123c9576123c8611f91565b5b60006123d785828601612275565b92505060206123e885828601612182565b9150509250929050565b6123fb81612123565b82525050565b600060208201905061241660008301846123f2565b92915050565b6000806040838503121561243357612432611f91565b5b60006124418582860161214c565b92505060206124528582860161214c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806124a357607f821691505b6020821081036124b6576124b561245c565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000612518602f8361205c565b9150612523826124bc565b604082019050919050565b600060208201905081810360008301526125478161250b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061258882612161565b915061259383612161565b92508282019050808211156125ab576125aa61254e565b5b92915050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f20756e706175736500000000000000602082015250565b600061260d60398361205c565b9150612618826125b1565b604082019050919050565b6000602082019050818103600083015261263c81612600565b9050919050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f7665206d696e74657220726f6c6520746f206d696e7400000000000000000000602082015250565b600061269f60368361205c565b91506126aa82612643565b604082019050919050565b600060208201905081810360008301526126ce81612692565b9050919050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f207061757365000000000000000000602082015250565b600061273160378361205c565b915061273c826126d5565b604082019050919050565b6000602082019050818103600083015261276081612724565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006127c360258361205c565b91506127ce82612767565b604082019050919050565b600060208201905081810360008301526127f2816127b6565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061285560248361205c565b9150612860826127f9565b604082019050919050565b6000602082019050818103600083015261288481612848565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006128e760228361205c565b91506128f28261288b565b604082019050919050565b60006020820190508181036000830152612916816128da565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612953601d8361205c565b915061295e8261291d565b602082019050919050565b6000602082019050818103600083015261298281612946565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006129e560258361205c565b91506129f082612989565b604082019050919050565b60006020820190508181036000830152612a14816129d8565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612a7760238361205c565b9150612a8282612a1b565b604082019050919050565b60006020820190508181036000830152612aa681612a6a565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000612b0960268361205c565b9150612b1482612aad565b604082019050919050565b60006020820190508181036000830152612b3881612afc565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000612b75601f8361205c565b9150612b8082612b3f565b602082019050919050565b60006020820190508181036000830152612ba481612b68565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000612c0760218361205c565b9150612c1282612bab565b604082019050919050565b60006020820190508181036000830152612c3681612bfa565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000612c9960228361205c565b9150612ca482612c3d565b604082019050919050565b60006020820190508181036000830152612cc881612c8c565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000612d10601783612ccf565b9150612d1b82612cda565b601782019050919050565b6000612d3182612051565b612d3b8185612ccf565b9350612d4b81856020860161206d565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000612d8d601183612ccf565b9150612d9882612d57565b601182019050919050565b6000612dae82612d03565b9150612dba8285612d26565b9150612dc582612d80565b9150612dd18284612d26565b91508190509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000612e1360148361205c565b9150612e1e82612ddd565b602082019050919050565b60006020820190508181036000830152612e4281612e06565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000612e7f60108361205c565b9150612e8a82612e49565b602082019050919050565b60006020820190508181036000830152612eae81612e72565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b6000612f40602a8361205c565b9150612f4b82612ee4565b604082019050919050565b60006020820190508181036000830152612f6f81612f33565b9050919050565b6000612f8182612161565b9150612f8c83612161565b9250828202612f9a81612161565b91508282048414831517612fb157612fb061254e565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000612ff282612161565b9150600082036130055761300461254e565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061304660208361205c565b915061305182613010565b602082019050919050565b6000602082019050818103600083015261307581613039565b9050919050565b600061308782612161565b915061309283612161565b92508282039050818111156130aa576130a961254e565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea264697066735822122048dbc607f899fe32ad35f6b79035fe92c713a380571de42e1ed7404d0a2da28464736f6c63430008130033", + "bytecode": "0x6080604052734dc6ac40af078661fc43823086e1513635eeab14600760016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550670de0b6b3a76400006008553480156200007257600080fd5b5060405162003d5c38038062003d5c8339818101604052810190620000989190620006fb565b6040518060400160405280601581526020017f45524332304d616c6963696f757344656c6179656400000000000000000000008152506040518060400160405280601581526020017f45524332304d414c4943494f555344454c415945440000000000000000000000815250818181600590816200011791906200099d565b5080600690816200012991906200099d565b5050506000600760006101000a81548160ff0219169083151502179055506200016b6000801b6200015f6200021d60201b60201c565b6200022560201b60201c565b620001ac7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6620001a06200021d60201b60201c565b6200022560201b60201c565b620001ed7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a620001e16200021d60201b60201c565b6200022560201b60201c565b5050620002046000801b336200022560201b60201c565b6200021633826200023b60201b60201c565b5062000c37565b600033905090565b620002378282620003a960201b60201c565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620002ad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002a49062000ae5565b60405180910390fd5b620002c160008383620003e760201b60201c565b8060046000828254620002d5919062000b36565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000389919062000b82565b60405180910390a3620003a560008383620003ff60201b60201c565b5050565b620003bb82826200040460201b60201c565b620003e28160016000858152602001908152602001600020620004f560201b90919060201c565b505050565b620003fa8383836200052d60201b60201c565b505050565b505050565b6200041682826200059860201b60201c565b620004f157600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620004966200021d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600062000525836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200060260201b60201c565b905092915050565b620005408383836200067c60201b60201c565b620005506200068160201b60201c565b1562000593576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200058a9062000c15565b60405180910390fd5b505050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60006200061683836200069860201b60201c565b6200067157826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905062000676565b600090505b92915050565b505050565b6000600760009054906101000a900460ff16905090565b600080836001016000848152602001908152602001600020541415905092915050565b600080fd5b6000819050919050565b620006d581620006c0565b8114620006e157600080fd5b50565b600081519050620006f581620006ca565b92915050565b600060208284031215620007145762000713620006bb565b5b60006200072484828501620006e4565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620007af57607f821691505b602082108103620007c557620007c462000767565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200082f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620007f0565b6200083b8683620007f0565b95508019841693508086168417925050509392505050565b6000819050919050565b60006200087e620008786200087284620006c0565b62000853565b620006c0565b9050919050565b6000819050919050565b6200089a836200085d565b620008b2620008a98262000885565b848454620007fd565b825550505050565b600090565b620008c9620008ba565b620008d68184846200088f565b505050565b5b81811015620008fe57620008f2600082620008bf565b600181019050620008dc565b5050565b601f8211156200094d576200091781620007cb565b6200092284620007e0565b8101602085101562000932578190505b6200094a6200094185620007e0565b830182620008db565b50505b505050565b600082821c905092915050565b6000620009726000198460080262000952565b1980831691505092915050565b60006200098d83836200095f565b9150826002028217905092915050565b620009a8826200072d565b67ffffffffffffffff811115620009c457620009c362000738565b5b620009d0825462000796565b620009dd82828562000902565b600060209050601f83116001811462000a15576000841562000a00578287015190505b62000a0c85826200097f565b86555062000a7c565b601f19841662000a2586620007cb565b60005b8281101562000a4f5784890151825560018201915060208501945060208101905062000a28565b8683101562000a6f578489015162000a6b601f8916826200095f565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000acd601f8362000a84565b915062000ada8262000a95565b602082019050919050565b6000602082019050818103600083015262000b008162000abe565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000b4382620006c0565b915062000b5083620006c0565b925082820190508082111562000b6b5762000b6a62000b07565b5b92915050565b62000b7c81620006c0565b82525050565b600060208201905062000b99600083018462000b71565b92915050565b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b600062000bfd602a8362000a84565b915062000c0a8262000b9f565b604082019050919050565b6000602082019050818103600083015262000c308162000bee565b9050919050565b6131158062000c476000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063a457c2d711610097578063d539139311610071578063d53913931461052d578063d547741f1461054b578063dd62ed3e14610567578063e63ab1e914610597576101c4565b8063a457c2d71461049d578063a9059cbb146104cd578063ca15c873146104fd576101c4565b80639010d07c116100d35780639010d07c1461040157806391d148541461043157806395d89b4114610461578063a217fddf1461047f576101c4565b806370a08231146103ab57806379cc6790146103db5780638456cb59146103f7576101c4565b8063313ce567116101665780633f4ba83a116101405780633f4ba83a1461034b57806340c10f191461035557806342966c68146103715780635c975abb1461038d576101c4565b8063313ce567146102e157806336568abe146102ff578063395093511461031b576101c4565b806318160ddd116101a257806318160ddd1461024757806323b872dd14610265578063248a9ca3146102955780632f2ff15d146102c5576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063095ea7b314610217575b600080fd5b6101e360048036038101906101de9190611fee565b6105b5565b6040516101f09190612036565b60405180910390f35b61020161062f565b60405161020e91906120e1565b60405180910390f35b610231600480360381019061022c9190612197565b6106c1565b60405161023e9190612036565b60405180910390f35b61024f6106e4565b60405161025c91906121e6565b60405180910390f35b61027f600480360381019061027a9190612201565b6106ee565b60405161028c9190612036565b60405180910390f35b6102af60048036038101906102aa919061228a565b61071d565b6040516102bc91906122c6565b60405180910390f35b6102df60048036038101906102da91906122e1565b61073c565b005b6102e961075d565b6040516102f6919061233d565b60405180910390f35b610319600480360381019061031491906122e1565b610766565b005b61033560048036038101906103309190612197565b6107e9565b6040516103429190612036565b60405180910390f35b610353610820565b005b61036f600480360381019061036a9190612197565b61089a565b005b61038b60048036038101906103869190612358565b610918565b005b61039561092c565b6040516103a29190612036565b60405180910390f35b6103c560048036038101906103c09190612385565b610943565b6040516103d291906121e6565b60405180910390f35b6103f560048036038101906103f09190612197565b61098c565b005b6103ff6109ac565b005b61041b600480360381019061041691906123b2565b610a26565b6040516104289190612401565b60405180910390f35b61044b600480360381019061044691906122e1565b610a55565b6040516104589190612036565b60405180910390f35b610469610abf565b60405161047691906120e1565b60405180910390f35b610487610b51565b60405161049491906122c6565b60405180910390f35b6104b760048036038101906104b29190612197565b610b58565b6040516104c49190612036565b60405180910390f35b6104e760048036038101906104e29190612197565b610bcf565b6040516104f49190612036565b60405180910390f35b6105176004803603810190610512919061228a565b610c12565b60405161052491906121e6565b60405180910390f35b610535610c36565b60405161054291906122c6565b60405180910390f35b610565600480360381019061056091906122e1565b610c5a565b005b610581600480360381019061057c919061241c565b610c7b565b60405161058e91906121e6565b60405180910390f35b61059f610d02565b6040516105ac91906122c6565b60405180910390f35b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610628575061062782610d26565b5b9050919050565b60606005805461063e9061248b565b80601f016020809104026020016040519081016040528092919081815260200182805461066a9061248b565b80156106b75780601f1061068c576101008083540402835291602001916106b7565b820191906000526020600020905b81548152906001019060200180831161069a57829003601f168201915b5050505050905090565b6000806106cc610da0565b90506106d9818585610da8565b600191505092915050565b6000600454905090565b6000806106f9610da0565b9050610706858285610f71565b610711858585610ffd565b60019150509392505050565b6000806000838152602001908152602001600020600101549050919050565b6107458261071d565b61074e81611276565b610758838361128a565b505050565b60006012905090565b61076e610da0565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146107db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d29061252e565b60405180910390fd5b6107e582826112be565b5050565b6000806107f4610da0565b90506108158185856108068589610c7b565b610810919061257d565b610da8565b600191505092915050565b6108517f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61084c610da0565b610a55565b610890576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088790612623565b60405180910390fd5b6108986112f2565b565b6108cb7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66108c6610da0565b610a55565b61090a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610901906126b5565b60405180910390fd5b6109148282611355565b5050565b610929610923610da0565b826114ac565b50565b6000600760009054906101000a900460ff16905090565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61099e82610998610da0565b83610f71565b6109a882826114ac565b5050565b6109dd7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6109d8610da0565b610a55565b610a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1390612747565b60405180910390fd5b610a2461167b565b565b6000610a4d82600160008681526020019081526020016000206116de90919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060068054610ace9061248b565b80601f0160208091040260200160405190810160405280929190818152602001828054610afa9061248b565b8015610b475780601f10610b1c57610100808354040283529160200191610b47565b820191906000526020600020905b815481529060010190602001808311610b2a57829003601f168201915b5050505050905090565b6000801b81565b600080610b63610da0565b90506000610b718286610c7b565b905083811015610bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bad906127d9565b60405180910390fd5b610bc38286868403610da8565b60019250505092915050565b6000610c0083600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600854610da8565b610c0a83836116f8565b905092915050565b6000610c2f6001600084815260200190815260200160002061171b565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610c638261071d565b610c6c81611276565b610c7683836112be565b505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d995750610d9882611730565b5b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0e9061286b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7d906128fd565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610f6491906121e6565b60405180910390a3505050565b6000610f7d8484610c7b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ff75781811015610fe9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe090612969565b60405180910390fd5b610ff68484848403610da8565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361106c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611063906129fb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d290612a8d565b60405180910390fd5b6110e683838361179a565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561116d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116490612b1f565b60405180910390fd5b818103600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161125d91906121e6565b60405180910390a36112708484846117aa565b50505050565b61128781611282610da0565b6117af565b50565b6112948282611834565b6112b9816001600085815260200190815260200160002061191490919063ffffffff16565b505050565b6112c88282611944565b6112ed8160016000858152602001908152602001600020611a2590919063ffffffff16565b505050565b6112fa611a55565b6000600760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61133e610da0565b60405161134b9190612401565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bb90612b8b565b60405180910390fd5b6113d06000838361179a565b80600460008282546113e2919061257d565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161149491906121e6565b60405180910390a36114a8600083836117aa565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361151b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151290612c1d565b60405180910390fd5b6115278260008361179a565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156115ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a590612caf565b60405180910390fd5b818103600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600460008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161166291906121e6565b60405180910390a3611676836000846117aa565b505050565b611683611a9e565b6001600760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586116c7610da0565b6040516116d49190612401565b60405180910390a1565b60006116ed8360000183611ae8565b60001c905092915050565b600080611703610da0565b9050611710818585610ffd565b600191505092915050565b600061172982600001611b13565b9050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6117a5838383611b24565b505050565b505050565b6117b98282610a55565b611830576117c681611b7c565b6117d48360001c6020611ba9565b6040516020016117e5929190612da3565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182791906120e1565b60405180910390fd5b5050565b61183e8282610a55565b61191057600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506118b5610da0565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600061193c836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611de5565b905092915050565b61194e8282610a55565b15611a2157600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506119c6610da0565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000611a4d836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611e55565b905092915050565b611a5d61092c565b611a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9390612e29565b60405180910390fd5b565b611aa661092c565b15611ae6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611add90612e95565b60405180910390fd5b565b6000826000018281548110611b0057611aff612eb5565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b611b2f838383611f69565b611b3761092c565b15611b77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6e90612f56565b60405180910390fd5b505050565b6060611ba28273ffffffffffffffffffffffffffffffffffffffff16601460ff16611ba9565b9050919050565b606060006002836002611bbc9190612f76565b611bc6919061257d565b67ffffffffffffffff811115611bdf57611bde612fb8565b5b6040519080825280601f01601f191660200182016040528015611c115781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611c4957611c48612eb5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611cad57611cac612eb5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611ced9190612f76565b611cf7919061257d565b90505b6001811115611d97577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611d3957611d38612eb5565b5b1a60f81b828281518110611d5057611d4f612eb5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611d9090612fe7565b9050611cfa565b5060008414611ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd29061305c565b60405180910390fd5b8091505092915050565b6000611df18383611f6e565b611e4a578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611e4f565b600090505b92915050565b60008083600101600084815260200190815260200160002054905060008114611f5d576000600182611e87919061307c565b9050600060018660000180549050611e9f919061307c565b9050818114611f0e576000866000018281548110611ec057611ebf612eb5565b5b9060005260206000200154905080876000018481548110611ee457611ee3612eb5565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480611f2257611f216130b0565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050611f63565b60009150505b92915050565b505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611fcb81611f96565b8114611fd657600080fd5b50565b600081359050611fe881611fc2565b92915050565b60006020828403121561200457612003611f91565b5b600061201284828501611fd9565b91505092915050565b60008115159050919050565b6120308161201b565b82525050565b600060208201905061204b6000830184612027565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561208b578082015181840152602081019050612070565b60008484015250505050565b6000601f19601f8301169050919050565b60006120b382612051565b6120bd818561205c565b93506120cd81856020860161206d565b6120d681612097565b840191505092915050565b600060208201905081810360008301526120fb81846120a8565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061212e82612103565b9050919050565b61213e81612123565b811461214957600080fd5b50565b60008135905061215b81612135565b92915050565b6000819050919050565b61217481612161565b811461217f57600080fd5b50565b6000813590506121918161216b565b92915050565b600080604083850312156121ae576121ad611f91565b5b60006121bc8582860161214c565b92505060206121cd85828601612182565b9150509250929050565b6121e081612161565b82525050565b60006020820190506121fb60008301846121d7565b92915050565b60008060006060848603121561221a57612219611f91565b5b60006122288682870161214c565b93505060206122398682870161214c565b925050604061224a86828701612182565b9150509250925092565b6000819050919050565b61226781612254565b811461227257600080fd5b50565b6000813590506122848161225e565b92915050565b6000602082840312156122a05761229f611f91565b5b60006122ae84828501612275565b91505092915050565b6122c081612254565b82525050565b60006020820190506122db60008301846122b7565b92915050565b600080604083850312156122f8576122f7611f91565b5b600061230685828601612275565b92505060206123178582860161214c565b9150509250929050565b600060ff82169050919050565b61233781612321565b82525050565b6000602082019050612352600083018461232e565b92915050565b60006020828403121561236e5761236d611f91565b5b600061237c84828501612182565b91505092915050565b60006020828403121561239b5761239a611f91565b5b60006123a98482850161214c565b91505092915050565b600080604083850312156123c9576123c8611f91565b5b60006123d785828601612275565b92505060206123e885828601612182565b9150509250929050565b6123fb81612123565b82525050565b600060208201905061241660008301846123f2565b92915050565b6000806040838503121561243357612432611f91565b5b60006124418582860161214c565b92505060206124528582860161214c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806124a357607f821691505b6020821081036124b6576124b561245c565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000612518602f8361205c565b9150612523826124bc565b604082019050919050565b600060208201905081810360008301526125478161250b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061258882612161565b915061259383612161565b92508282019050808211156125ab576125aa61254e565b5b92915050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f20756e706175736500000000000000602082015250565b600061260d60398361205c565b9150612618826125b1565b604082019050919050565b6000602082019050818103600083015261263c81612600565b9050919050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f7665206d696e74657220726f6c6520746f206d696e7400000000000000000000602082015250565b600061269f60368361205c565b91506126aa82612643565b604082019050919050565b600060208201905081810360008301526126ce81612692565b9050919050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f207061757365000000000000000000602082015250565b600061273160378361205c565b915061273c826126d5565b604082019050919050565b6000602082019050818103600083015261276081612724565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006127c360258361205c565b91506127ce82612767565b604082019050919050565b600060208201905081810360008301526127f2816127b6565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061285560248361205c565b9150612860826127f9565b604082019050919050565b6000602082019050818103600083015261288481612848565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006128e760228361205c565b91506128f28261288b565b604082019050919050565b60006020820190508181036000830152612916816128da565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612953601d8361205c565b915061295e8261291d565b602082019050919050565b6000602082019050818103600083015261298281612946565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006129e560258361205c565b91506129f082612989565b604082019050919050565b60006020820190508181036000830152612a14816129d8565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612a7760238361205c565b9150612a8282612a1b565b604082019050919050565b60006020820190508181036000830152612aa681612a6a565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000612b0960268361205c565b9150612b1482612aad565b604082019050919050565b60006020820190508181036000830152612b3881612afc565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000612b75601f8361205c565b9150612b8082612b3f565b602082019050919050565b60006020820190508181036000830152612ba481612b68565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000612c0760218361205c565b9150612c1282612bab565b604082019050919050565b60006020820190508181036000830152612c3681612bfa565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000612c9960228361205c565b9150612ca482612c3d565b604082019050919050565b60006020820190508181036000830152612cc881612c8c565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000612d10601783612ccf565b9150612d1b82612cda565b601782019050919050565b6000612d3182612051565b612d3b8185612ccf565b9350612d4b81856020860161206d565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000612d8d601183612ccf565b9150612d9882612d57565b601182019050919050565b6000612dae82612d03565b9150612dba8285612d26565b9150612dc582612d80565b9150612dd18284612d26565b91508190509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000612e1360148361205c565b9150612e1e82612ddd565b602082019050919050565b60006020820190508181036000830152612e4281612e06565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000612e7f60108361205c565b9150612e8a82612e49565b602082019050919050565b60006020820190508181036000830152612eae81612e72565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b6000612f40602a8361205c565b9150612f4b82612ee4565b604082019050919050565b60006020820190508181036000830152612f6f81612f33565b9050919050565b6000612f8182612161565b9150612f8c83612161565b9250828202612f9a81612161565b91508282048414831517612fb157612fb061254e565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000612ff282612161565b9150600082036130055761300461254e565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061304660208361205c565b915061305182613010565b602082019050919050565b6000602082019050818103600083015261307581613039565b9050919050565b600061308782612161565b915061309283612161565b92508282039050818111156130aa576130a961254e565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea264697066735822122086af0a619cd72bc143e0e1e5535b82ae75ed217cc17e83643dd95cd6d28d1fb164736f6c63430008130033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063a457c2d711610097578063d539139311610071578063d53913931461052d578063d547741f1461054b578063dd62ed3e14610567578063e63ab1e914610597576101c4565b8063a457c2d71461049d578063a9059cbb146104cd578063ca15c873146104fd576101c4565b80639010d07c116100d35780639010d07c1461040157806391d148541461043157806395d89b4114610461578063a217fddf1461047f576101c4565b806370a08231146103ab57806379cc6790146103db5780638456cb59146103f7576101c4565b8063313ce567116101665780633f4ba83a116101405780633f4ba83a1461034b57806340c10f191461035557806342966c68146103715780635c975abb1461038d576101c4565b8063313ce567146102e157806336568abe146102ff578063395093511461031b576101c4565b806318160ddd116101a257806318160ddd1461024757806323b872dd14610265578063248a9ca3146102955780632f2ff15d146102c5576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063095ea7b314610217575b600080fd5b6101e360048036038101906101de9190611fee565b6105b5565b6040516101f09190612036565b60405180910390f35b61020161062f565b60405161020e91906120e1565b60405180910390f35b610231600480360381019061022c9190612197565b6106c1565b60405161023e9190612036565b60405180910390f35b61024f6106e4565b60405161025c91906121e6565b60405180910390f35b61027f600480360381019061027a9190612201565b6106ee565b60405161028c9190612036565b60405180910390f35b6102af60048036038101906102aa919061228a565b61071d565b6040516102bc91906122c6565b60405180910390f35b6102df60048036038101906102da91906122e1565b61073c565b005b6102e961075d565b6040516102f6919061233d565b60405180910390f35b610319600480360381019061031491906122e1565b610766565b005b61033560048036038101906103309190612197565b6107e9565b6040516103429190612036565b60405180910390f35b610353610820565b005b61036f600480360381019061036a9190612197565b61089a565b005b61038b60048036038101906103869190612358565b610918565b005b61039561092c565b6040516103a29190612036565b60405180910390f35b6103c560048036038101906103c09190612385565b610943565b6040516103d291906121e6565b60405180910390f35b6103f560048036038101906103f09190612197565b61098c565b005b6103ff6109ac565b005b61041b600480360381019061041691906123b2565b610a26565b6040516104289190612401565b60405180910390f35b61044b600480360381019061044691906122e1565b610a55565b6040516104589190612036565b60405180910390f35b610469610abf565b60405161047691906120e1565b60405180910390f35b610487610b51565b60405161049491906122c6565b60405180910390f35b6104b760048036038101906104b29190612197565b610b58565b6040516104c49190612036565b60405180910390f35b6104e760048036038101906104e29190612197565b610bcf565b6040516104f49190612036565b60405180910390f35b6105176004803603810190610512919061228a565b610c12565b60405161052491906121e6565b60405180910390f35b610535610c36565b60405161054291906122c6565b60405180910390f35b610565600480360381019061056091906122e1565b610c5a565b005b610581600480360381019061057c919061241c565b610c7b565b60405161058e91906121e6565b60405180910390f35b61059f610d02565b6040516105ac91906122c6565b60405180910390f35b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610628575061062782610d26565b5b9050919050565b60606005805461063e9061248b565b80601f016020809104026020016040519081016040528092919081815260200182805461066a9061248b565b80156106b75780601f1061068c576101008083540402835291602001916106b7565b820191906000526020600020905b81548152906001019060200180831161069a57829003601f168201915b5050505050905090565b6000806106cc610da0565b90506106d9818585610da8565b600191505092915050565b6000600454905090565b6000806106f9610da0565b9050610706858285610f71565b610711858585610ffd565b60019150509392505050565b6000806000838152602001908152602001600020600101549050919050565b6107458261071d565b61074e81611276565b610758838361128a565b505050565b60006012905090565b61076e610da0565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146107db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d29061252e565b60405180910390fd5b6107e582826112be565b5050565b6000806107f4610da0565b90506108158185856108068589610c7b565b610810919061257d565b610da8565b600191505092915050565b6108517f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61084c610da0565b610a55565b610890576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088790612623565b60405180910390fd5b6108986112f2565b565b6108cb7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66108c6610da0565b610a55565b61090a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610901906126b5565b60405180910390fd5b6109148282611355565b5050565b610929610923610da0565b826114ac565b50565b6000600760009054906101000a900460ff16905090565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61099e82610998610da0565b83610f71565b6109a882826114ac565b5050565b6109dd7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6109d8610da0565b610a55565b610a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1390612747565b60405180910390fd5b610a2461167b565b565b6000610a4d82600160008681526020019081526020016000206116de90919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060068054610ace9061248b565b80601f0160208091040260200160405190810160405280929190818152602001828054610afa9061248b565b8015610b475780601f10610b1c57610100808354040283529160200191610b47565b820191906000526020600020905b815481529060010190602001808311610b2a57829003601f168201915b5050505050905090565b6000801b81565b600080610b63610da0565b90506000610b718286610c7b565b905083811015610bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bad906127d9565b60405180910390fd5b610bc38286868403610da8565b60019250505092915050565b6000610c0083600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600854610da8565b610c0a83836116f8565b905092915050565b6000610c2f6001600084815260200190815260200160002061171b565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610c638261071d565b610c6c81611276565b610c7683836112be565b505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d995750610d9882611730565b5b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0e9061286b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7d906128fd565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610f6491906121e6565b60405180910390a3505050565b6000610f7d8484610c7b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ff75781811015610fe9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe090612969565b60405180910390fd5b610ff68484848403610da8565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361106c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611063906129fb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d290612a8d565b60405180910390fd5b6110e683838361179a565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561116d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116490612b1f565b60405180910390fd5b818103600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161125d91906121e6565b60405180910390a36112708484846117aa565b50505050565b61128781611282610da0565b6117af565b50565b6112948282611834565b6112b9816001600085815260200190815260200160002061191490919063ffffffff16565b505050565b6112c88282611944565b6112ed8160016000858152602001908152602001600020611a2590919063ffffffff16565b505050565b6112fa611a55565b6000600760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61133e610da0565b60405161134b9190612401565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bb90612b8b565b60405180910390fd5b6113d06000838361179a565b80600460008282546113e2919061257d565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161149491906121e6565b60405180910390a36114a8600083836117aa565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361151b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151290612c1d565b60405180910390fd5b6115278260008361179a565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156115ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a590612caf565b60405180910390fd5b818103600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600460008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161166291906121e6565b60405180910390a3611676836000846117aa565b505050565b611683611a9e565b6001600760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586116c7610da0565b6040516116d49190612401565b60405180910390a1565b60006116ed8360000183611ae8565b60001c905092915050565b600080611703610da0565b9050611710818585610ffd565b600191505092915050565b600061172982600001611b13565b9050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6117a5838383611b24565b505050565b505050565b6117b98282610a55565b611830576117c681611b7c565b6117d48360001c6020611ba9565b6040516020016117e5929190612da3565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182791906120e1565b60405180910390fd5b5050565b61183e8282610a55565b61191057600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506118b5610da0565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600061193c836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611de5565b905092915050565b61194e8282610a55565b15611a2157600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506119c6610da0565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000611a4d836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611e55565b905092915050565b611a5d61092c565b611a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9390612e29565b60405180910390fd5b565b611aa661092c565b15611ae6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611add90612e95565b60405180910390fd5b565b6000826000018281548110611b0057611aff612eb5565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b611b2f838383611f69565b611b3761092c565b15611b77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6e90612f56565b60405180910390fd5b505050565b6060611ba28273ffffffffffffffffffffffffffffffffffffffff16601460ff16611ba9565b9050919050565b606060006002836002611bbc9190612f76565b611bc6919061257d565b67ffffffffffffffff811115611bdf57611bde612fb8565b5b6040519080825280601f01601f191660200182016040528015611c115781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611c4957611c48612eb5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611cad57611cac612eb5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611ced9190612f76565b611cf7919061257d565b90505b6001811115611d97577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611d3957611d38612eb5565b5b1a60f81b828281518110611d5057611d4f612eb5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611d9090612fe7565b9050611cfa565b5060008414611ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd29061305c565b60405180910390fd5b8091505092915050565b6000611df18383611f6e565b611e4a578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611e4f565b600090505b92915050565b60008083600101600084815260200190815260200160002054905060008114611f5d576000600182611e87919061307c565b9050600060018660000180549050611e9f919061307c565b9050818114611f0e576000866000018281548110611ec057611ebf612eb5565b5b9060005260206000200154905080876000018481548110611ee457611ee3612eb5565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480611f2257611f216130b0565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050611f63565b60009150505b92915050565b505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611fcb81611f96565b8114611fd657600080fd5b50565b600081359050611fe881611fc2565b92915050565b60006020828403121561200457612003611f91565b5b600061201284828501611fd9565b91505092915050565b60008115159050919050565b6120308161201b565b82525050565b600060208201905061204b6000830184612027565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561208b578082015181840152602081019050612070565b60008484015250505050565b6000601f19601f8301169050919050565b60006120b382612051565b6120bd818561205c565b93506120cd81856020860161206d565b6120d681612097565b840191505092915050565b600060208201905081810360008301526120fb81846120a8565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061212e82612103565b9050919050565b61213e81612123565b811461214957600080fd5b50565b60008135905061215b81612135565b92915050565b6000819050919050565b61217481612161565b811461217f57600080fd5b50565b6000813590506121918161216b565b92915050565b600080604083850312156121ae576121ad611f91565b5b60006121bc8582860161214c565b92505060206121cd85828601612182565b9150509250929050565b6121e081612161565b82525050565b60006020820190506121fb60008301846121d7565b92915050565b60008060006060848603121561221a57612219611f91565b5b60006122288682870161214c565b93505060206122398682870161214c565b925050604061224a86828701612182565b9150509250925092565b6000819050919050565b61226781612254565b811461227257600080fd5b50565b6000813590506122848161225e565b92915050565b6000602082840312156122a05761229f611f91565b5b60006122ae84828501612275565b91505092915050565b6122c081612254565b82525050565b60006020820190506122db60008301846122b7565b92915050565b600080604083850312156122f8576122f7611f91565b5b600061230685828601612275565b92505060206123178582860161214c565b9150509250929050565b600060ff82169050919050565b61233781612321565b82525050565b6000602082019050612352600083018461232e565b92915050565b60006020828403121561236e5761236d611f91565b5b600061237c84828501612182565b91505092915050565b60006020828403121561239b5761239a611f91565b5b60006123a98482850161214c565b91505092915050565b600080604083850312156123c9576123c8611f91565b5b60006123d785828601612275565b92505060206123e885828601612182565b9150509250929050565b6123fb81612123565b82525050565b600060208201905061241660008301846123f2565b92915050565b6000806040838503121561243357612432611f91565b5b60006124418582860161214c565b92505060206124528582860161214c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806124a357607f821691505b6020821081036124b6576124b561245c565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000612518602f8361205c565b9150612523826124bc565b604082019050919050565b600060208201905081810360008301526125478161250b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061258882612161565b915061259383612161565b92508282019050808211156125ab576125aa61254e565b5b92915050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f20756e706175736500000000000000602082015250565b600061260d60398361205c565b9150612618826125b1565b604082019050919050565b6000602082019050818103600083015261263c81612600565b9050919050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f7665206d696e74657220726f6c6520746f206d696e7400000000000000000000602082015250565b600061269f60368361205c565b91506126aa82612643565b604082019050919050565b600060208201905081810360008301526126ce81612692565b9050919050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f207061757365000000000000000000602082015250565b600061273160378361205c565b915061273c826126d5565b604082019050919050565b6000602082019050818103600083015261276081612724565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006127c360258361205c565b91506127ce82612767565b604082019050919050565b600060208201905081810360008301526127f2816127b6565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061285560248361205c565b9150612860826127f9565b604082019050919050565b6000602082019050818103600083015261288481612848565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006128e760228361205c565b91506128f28261288b565b604082019050919050565b60006020820190508181036000830152612916816128da565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612953601d8361205c565b915061295e8261291d565b602082019050919050565b6000602082019050818103600083015261298281612946565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006129e560258361205c565b91506129f082612989565b604082019050919050565b60006020820190508181036000830152612a14816129d8565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612a7760238361205c565b9150612a8282612a1b565b604082019050919050565b60006020820190508181036000830152612aa681612a6a565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000612b0960268361205c565b9150612b1482612aad565b604082019050919050565b60006020820190508181036000830152612b3881612afc565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000612b75601f8361205c565b9150612b8082612b3f565b602082019050919050565b60006020820190508181036000830152612ba481612b68565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000612c0760218361205c565b9150612c1282612bab565b604082019050919050565b60006020820190508181036000830152612c3681612bfa565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000612c9960228361205c565b9150612ca482612c3d565b604082019050919050565b60006020820190508181036000830152612cc881612c8c565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000612d10601783612ccf565b9150612d1b82612cda565b601782019050919050565b6000612d3182612051565b612d3b8185612ccf565b9350612d4b81856020860161206d565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000612d8d601183612ccf565b9150612d9882612d57565b601182019050919050565b6000612dae82612d03565b9150612dba8285612d26565b9150612dc582612d80565b9150612dd18284612d26565b91508190509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000612e1360148361205c565b9150612e1e82612ddd565b602082019050919050565b60006020820190508181036000830152612e4281612e06565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000612e7f60108361205c565b9150612e8a82612e49565b602082019050919050565b60006020820190508181036000830152612eae81612e72565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b6000612f40602a8361205c565b9150612f4b82612ee4565b604082019050919050565b60006020820190508181036000830152612f6f81612f33565b9050919050565b6000612f8182612161565b9150612f8c83612161565b9250828202612f9a81612161565b91508282048414831517612fb157612fb061254e565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000612ff282612161565b9150600082036130055761300461254e565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061304660208361205c565b915061305182613010565b602082019050919050565b6000602082019050818103600083015261307581613039565b9050919050565b600061308782612161565b915061309283612161565b92508282039050818111156130aa576130a961254e565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea264697066735822122086af0a619cd72bc143e0e1e5535b82ae75ed217cc17e83643dd95cd6d28d1fb164736f6c63430008130033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/x/erc20/keeper/testdata/tokenTransfer.go b/x/erc20/keeper/testdata/tokenTransfer.go deleted file mode 100644 index 4cdd6684a1..0000000000 --- a/x/erc20/keeper/testdata/tokenTransfer.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package testdata - -import ( - _ "embed" // embed compiled smart contract - "encoding/json" - - evmtypes "github.com/evmos/evmos/v18/x/evm/types" -) - -var ( - //go:embed tokenTransfer.json - tokenTransferJSON []byte - - // TokenTransferContract is the compiled tokenTransfer contract - TokenTransferContract evmtypes.CompiledContract -) - -func init() { - err := json.Unmarshal(tokenTransferJSON, &TokenTransferContract) - if err != nil { - panic(err) - } -} diff --git a/x/erc20/keeper/testdata/tokenTransfer.json b/x/erc20/keeper/testdata/tokenTransfer.json deleted file mode 100644 index 3c1d9c3dec..0000000000 --- a/x/erc20/keeper/testdata/tokenTransfer.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "abi": "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - "bin": "608060405234801561000f575f80fd5b506040516103ae3803806103ae833981810160405281019061003191906100d4565b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506100ff565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6100a38261007a565b9050919050565b6100b381610099565b81146100bd575f80fd5b50565b5f815190506100ce816100aa565b92915050565b5f602082840312156100e9576100e8610076565b5b5f6100f6848285016100c0565b91505092915050565b6102a28061010c5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c80631072cbea1461002d575b5f80fd5b6100476004803603810190610042919061017b565b610049565b005b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3384846040518463ffffffff1660e01b81526004016100a5939291906101d7565b6020604051808303815f875af11580156100c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e59190610241565b505050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610117826100ee565b9050919050565b6101278161010d565b8114610131575f80fd5b50565b5f813590506101428161011e565b92915050565b5f819050919050565b61015a81610148565b8114610164575f80fd5b50565b5f8135905061017581610151565b92915050565b5f8060408385031215610191576101906100ea565b5b5f61019e85828601610134565b92505060206101af85828601610167565b9150509250929050565b6101c28161010d565b82525050565b6101d181610148565b82525050565b5f6060820190506101ea5f8301866101b9565b6101f760208301856101b9565b61020460408301846101c8565b949350505050565b5f8115159050919050565b6102208161020c565b811461022a575f80fd5b50565b5f8151905061023b81610217565b92915050565b5f60208284031215610256576102556100ea565b5b5f6102638482850161022d565b9150509291505056fea2646970667358221220bbc26fe3b0578219ad6235976ab9666151b3049b14b3d87a76d448f47aad0e8964736f6c63430008180033" -} \ No newline at end of file diff --git a/x/erc20/keeper/testdata/tokenTransfer.sol b/x/erc20/keeper/testdata/tokenTransfer.sol deleted file mode 100644 index 7d11c67368..0000000000 --- a/x/erc20/keeper/testdata/tokenTransfer.sol +++ /dev/null @@ -1,26 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.20; - -import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; - -/* - @title tokenTransfer - @dev This contract is used to test that any addresses transferring ERC-20 tokens - are tracked if they're ERC-20 representations of native Cosmos coins. -*/ -contract tokenTransfer { - ERC20 token; - - constructor(address tokenAddress){ - token = ERC20(tokenAddress); - } - - /* - @notice This function is used to transfer ERC-20 tokens to a given address. - @param to The address to transfer the tokens to - @param amount The amount of tokens to transfer - */ - function transferToken(address to, uint256 amount) public { - token.transfer(to, amount); - } -} diff --git a/x/evm/statedb/testdata/FlashLoan.json b/x/evm/statedb/testdata/FlashLoan.json index 74a8e275d9..e3520273ae 100644 --- a/x/evm/statedb/testdata/FlashLoan.json +++ b/x/evm/statedb/testdata/FlashLoan.json @@ -51,8 +51,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610eea806100606000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80638da5cb5b1461003b578063ee52ad7114610059575b600080fd5b610043610089565b60405161005091906106dd565b60405180910390f35b610073600480360381019061006e91906108b4565b6100ad565b604051610080919061093e565b60405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461013e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610135906109dc565b60405180910390fd5b6000849050828173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b815260040161017f9291906109fc565b602060405180830381865afa15801561019c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101c09190610a3a565b1015610201576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f890610ab3565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161023c91906106dd565b602060405180830381865afa158015610259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027d9190610a3a565b905060008273ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b81526004016102be93929190610ae2565b6020604051808303816000875af11580156102dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103019190610b45565b905080610343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033a90610be4565b60405180910390fd5b848261034f9190610c33565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161038891906106dd565b602060405180830381865afa1580156103a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c99190610a3a565b14610409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040090610cb3565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3388886040518463ffffffff1660e01b815260040161044893929190610d41565b6020604051808303816000875af1158015610467573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048b9190610b45565b9050806104cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104c490610dcb565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161050691906106dd565b602060405180830381865afa158015610523573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105479190610a3a565b91508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33876040518363ffffffff1660e01b8152600401610584929190610deb565b6020604051808303816000875af11580156105a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c79190610b45565b5084826105d49190610e14565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161060d91906106dd565b602060405180830381865afa15801561062a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064e9190610a3a565b1461068e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068590610e94565b60405180910390fd5b600193505050509392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106c78261069c565b9050919050565b6106d7816106bc565b82525050565b60006020820190506106f260008301846106ce565b92915050565b6000604051905090565b600080fd5b600080fd5b610715816106bc565b811461072057600080fd5b50565b6000813590506107328161070c565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61078b82610742565b810181811067ffffffffffffffff821117156107aa576107a9610753565b5b80604052505050565b60006107bd6106f8565b90506107c98282610782565b919050565b600067ffffffffffffffff8211156107e9576107e8610753565b5b6107f282610742565b9050602081019050919050565b82818337600083830152505050565b600061082161081c846107ce565b6107b3565b90508281526020810184848401111561083d5761083c61073d565b5b6108488482856107ff565b509392505050565b600082601f83011261086557610864610738565b5b813561087584826020860161080e565b91505092915050565b6000819050919050565b6108918161087e565b811461089c57600080fd5b50565b6000813590506108ae81610888565b92915050565b6000806000606084860312156108cd576108cc610702565b5b60006108db86828701610723565b935050602084013567ffffffffffffffff8111156108fc576108fb610707565b5b61090886828701610850565b92505060406109198682870161089f565b9150509250925092565b60008115159050919050565b61093881610923565b82525050565b6000602082019050610953600083018461092f565b92915050565b600082825260208201905092915050565b7f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b60006109c6602183610959565b91506109d18261096a565b604082019050919050565b600060208201905081810360008301526109f5816109b9565b9050919050565b6000604082019050610a1160008301856106ce565b610a1e60208301846106ce565b9392505050565b600081519050610a3481610888565b92915050565b600060208284031215610a5057610a4f610702565b5b6000610a5e84828501610a25565b91505092915050565b7f496e73756666696369656e7420616c6c6f77616e636500000000000000000000600082015250565b6000610a9d601683610959565b9150610aa882610a67565b602082019050919050565b60006020820190508181036000830152610acc81610a90565b9050919050565b610adc8161087e565b82525050565b6000606082019050610af760008301866106ce565b610b0460208301856106ce565b610b116040830184610ad3565b949350505050565b610b2281610923565b8114610b2d57600080fd5b50565b600081519050610b3f81610b19565b92915050565b600060208284031215610b5b57610b5a610702565b5b6000610b6984828501610b30565b91505092915050565b7f4661696c656420746f207472616e7366657220746f6b656e7320666f7220666c60008201527f617368206c6f616e000000000000000000000000000000000000000000000000602082015250565b6000610bce602883610959565b9150610bd982610b72565b604082019050919050565b60006020820190508181036000830152610bfd81610bc1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610c3e8261087e565b9150610c498361087e565b9250828201905080821115610c6157610c60610c04565b5b92915050565b7f466c617368206c6f616e206661696c6564000000000000000000000000000000600082015250565b6000610c9d601183610959565b9150610ca882610c67565b602082019050919050565b60006020820190508181036000830152610ccc81610c90565b9050919050565b600081519050919050565b60005b83811015610cfc578082015181840152602081019050610ce1565b60008484015250505050565b6000610d1382610cd3565b610d1d8185610959565b9350610d2d818560208601610cde565b610d3681610742565b840191505092915050565b6000606082019050610d5660008301866106ce565b8181036020830152610d688185610d08565b9050610d776040830184610ad3565b949350505050565b7f6661696c656420746f2064656c65676174650000000000000000000000000000600082015250565b6000610db5601283610959565b9150610dc082610d7f565b602082019050919050565b60006020820190508181036000830152610de481610da8565b9050919050565b6000604082019050610e0060008301856106ce565b610e0d6020830184610ad3565b9392505050565b6000610e1f8261087e565b9150610e2a8361087e565b9250828203905081811115610e4257610e41610c04565b5b92915050565b7f466c617368206c6f616e2072657061796d656e74206661696c65640000000000600082015250565b6000610e7e601b83610959565b9150610e8982610e48565b602082019050919050565b60006020820190508181036000830152610ead81610e71565b905091905056fea2646970667358221220380a26745b780a2cbfbf5500215cef409c0954dff89462eb5ad27cea8bd373e164736f6c63430008130033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c80638da5cb5b1461003b578063ee52ad7114610059575b600080fd5b610043610089565b60405161005091906106dd565b60405180910390f35b610073600480360381019061006e91906108b4565b6100ad565b604051610080919061093e565b60405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461013e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610135906109dc565b60405180910390fd5b6000849050828173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b815260040161017f9291906109fc565b602060405180830381865afa15801561019c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101c09190610a3a565b1015610201576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f890610ab3565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161023c91906106dd565b602060405180830381865afa158015610259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027d9190610a3a565b905060008273ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b81526004016102be93929190610ae2565b6020604051808303816000875af11580156102dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103019190610b45565b905080610343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033a90610be4565b60405180910390fd5b848261034f9190610c33565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161038891906106dd565b602060405180830381865afa1580156103a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c99190610a3a565b14610409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040090610cb3565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3388886040518463ffffffff1660e01b815260040161044893929190610d41565b6020604051808303816000875af1158015610467573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048b9190610b45565b9050806104cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104c490610dcb565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161050691906106dd565b602060405180830381865afa158015610523573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105479190610a3a565b91508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33876040518363ffffffff1660e01b8152600401610584929190610deb565b6020604051808303816000875af11580156105a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c79190610b45565b5084826105d49190610e14565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161060d91906106dd565b602060405180830381865afa15801561062a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064e9190610a3a565b1461068e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068590610e94565b60405180910390fd5b600193505050509392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106c78261069c565b9050919050565b6106d7816106bc565b82525050565b60006020820190506106f260008301846106ce565b92915050565b6000604051905090565b600080fd5b600080fd5b610715816106bc565b811461072057600080fd5b50565b6000813590506107328161070c565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61078b82610742565b810181811067ffffffffffffffff821117156107aa576107a9610753565b5b80604052505050565b60006107bd6106f8565b90506107c98282610782565b919050565b600067ffffffffffffffff8211156107e9576107e8610753565b5b6107f282610742565b9050602081019050919050565b82818337600083830152505050565b600061082161081c846107ce565b6107b3565b90508281526020810184848401111561083d5761083c61073d565b5b6108488482856107ff565b509392505050565b600082601f83011261086557610864610738565b5b813561087584826020860161080e565b91505092915050565b6000819050919050565b6108918161087e565b811461089c57600080fd5b50565b6000813590506108ae81610888565b92915050565b6000806000606084860312156108cd576108cc610702565b5b60006108db86828701610723565b935050602084013567ffffffffffffffff8111156108fc576108fb610707565b5b61090886828701610850565b92505060406109198682870161089f565b9150509250925092565b60008115159050919050565b61093881610923565b82525050565b6000602082019050610953600083018461092f565b92915050565b600082825260208201905092915050565b7f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b60006109c6602183610959565b91506109d18261096a565b604082019050919050565b600060208201905081810360008301526109f5816109b9565b9050919050565b6000604082019050610a1160008301856106ce565b610a1e60208301846106ce565b9392505050565b600081519050610a3481610888565b92915050565b600060208284031215610a5057610a4f610702565b5b6000610a5e84828501610a25565b91505092915050565b7f496e73756666696369656e7420616c6c6f77616e636500000000000000000000600082015250565b6000610a9d601683610959565b9150610aa882610a67565b602082019050919050565b60006020820190508181036000830152610acc81610a90565b9050919050565b610adc8161087e565b82525050565b6000606082019050610af760008301866106ce565b610b0460208301856106ce565b610b116040830184610ad3565b949350505050565b610b2281610923565b8114610b2d57600080fd5b50565b600081519050610b3f81610b19565b92915050565b600060208284031215610b5b57610b5a610702565b5b6000610b6984828501610b30565b91505092915050565b7f4661696c656420746f207472616e7366657220746f6b656e7320666f7220666c60008201527f617368206c6f616e000000000000000000000000000000000000000000000000602082015250565b6000610bce602883610959565b9150610bd982610b72565b604082019050919050565b60006020820190508181036000830152610bfd81610bc1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610c3e8261087e565b9150610c498361087e565b9250828201905080821115610c6157610c60610c04565b5b92915050565b7f466c617368206c6f616e206661696c6564000000000000000000000000000000600082015250565b6000610c9d601183610959565b9150610ca882610c67565b602082019050919050565b60006020820190508181036000830152610ccc81610c90565b9050919050565b600081519050919050565b60005b83811015610cfc578082015181840152602081019050610ce1565b60008484015250505050565b6000610d1382610cd3565b610d1d8185610959565b9350610d2d818560208601610cde565b610d3681610742565b840191505092915050565b6000606082019050610d5660008301866106ce565b8181036020830152610d688185610d08565b9050610d776040830184610ad3565b949350505050565b7f6661696c656420746f2064656c65676174650000000000000000000000000000600082015250565b6000610db5601283610959565b9150610dc082610d7f565b602082019050919050565b60006020820190508181036000830152610de481610da8565b9050919050565b6000604082019050610e0060008301856106ce565b610e0d6020830184610ad3565b9392505050565b6000610e1f8261087e565b9150610e2a8361087e565b9250828203905081811115610e4257610e41610c04565b5b92915050565b7f466c617368206c6f616e2072657061796d656e74206661696c65640000000000600082015250565b6000610e7e601b83610959565b9150610e8982610e48565b602082019050919050565b60006020820190508181036000830152610ead81610e71565b905091905056fea2646970667358221220380a26745b780a2cbfbf5500215cef409c0954dff89462eb5ad27cea8bd373e164736f6c63430008130033", + "bytecode": "0x608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610eea806100606000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80638da5cb5b1461003b578063ee52ad7114610059575b600080fd5b610043610089565b60405161005091906106dd565b60405180910390f35b610073600480360381019061006e91906108b4565b6100ad565b604051610080919061093e565b60405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461013e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610135906109dc565b60405180910390fd5b6000849050828173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b815260040161017f9291906109fc565b602060405180830381865afa15801561019c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101c09190610a3a565b1015610201576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f890610ab3565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161023c91906106dd565b602060405180830381865afa158015610259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027d9190610a3a565b905060008273ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b81526004016102be93929190610ae2565b6020604051808303816000875af11580156102dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103019190610b45565b905080610343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033a90610be4565b60405180910390fd5b848261034f9190610c33565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161038891906106dd565b602060405180830381865afa1580156103a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c99190610a3a565b14610409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040090610cb3565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3388886040518463ffffffff1660e01b815260040161044893929190610d41565b6020604051808303816000875af1158015610467573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048b9190610b45565b9050806104cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104c490610dcb565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161050691906106dd565b602060405180830381865afa158015610523573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105479190610a3a565b91508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33876040518363ffffffff1660e01b8152600401610584929190610deb565b6020604051808303816000875af11580156105a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c79190610b45565b5084826105d49190610e14565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161060d91906106dd565b602060405180830381865afa15801561062a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064e9190610a3a565b1461068e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068590610e94565b60405180910390fd5b600193505050509392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106c78261069c565b9050919050565b6106d7816106bc565b82525050565b60006020820190506106f260008301846106ce565b92915050565b6000604051905090565b600080fd5b600080fd5b610715816106bc565b811461072057600080fd5b50565b6000813590506107328161070c565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61078b82610742565b810181811067ffffffffffffffff821117156107aa576107a9610753565b5b80604052505050565b60006107bd6106f8565b90506107c98282610782565b919050565b600067ffffffffffffffff8211156107e9576107e8610753565b5b6107f282610742565b9050602081019050919050565b82818337600083830152505050565b600061082161081c846107ce565b6107b3565b90508281526020810184848401111561083d5761083c61073d565b5b6108488482856107ff565b509392505050565b600082601f83011261086557610864610738565b5b813561087584826020860161080e565b91505092915050565b6000819050919050565b6108918161087e565b811461089c57600080fd5b50565b6000813590506108ae81610888565b92915050565b6000806000606084860312156108cd576108cc610702565b5b60006108db86828701610723565b935050602084013567ffffffffffffffff8111156108fc576108fb610707565b5b61090886828701610850565b92505060406109198682870161089f565b9150509250925092565b60008115159050919050565b61093881610923565b82525050565b6000602082019050610953600083018461092f565b92915050565b600082825260208201905092915050565b7f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b60006109c6602183610959565b91506109d18261096a565b604082019050919050565b600060208201905081810360008301526109f5816109b9565b9050919050565b6000604082019050610a1160008301856106ce565b610a1e60208301846106ce565b9392505050565b600081519050610a3481610888565b92915050565b600060208284031215610a5057610a4f610702565b5b6000610a5e84828501610a25565b91505092915050565b7f496e73756666696369656e7420616c6c6f77616e636500000000000000000000600082015250565b6000610a9d601683610959565b9150610aa882610a67565b602082019050919050565b60006020820190508181036000830152610acc81610a90565b9050919050565b610adc8161087e565b82525050565b6000606082019050610af760008301866106ce565b610b0460208301856106ce565b610b116040830184610ad3565b949350505050565b610b2281610923565b8114610b2d57600080fd5b50565b600081519050610b3f81610b19565b92915050565b600060208284031215610b5b57610b5a610702565b5b6000610b6984828501610b30565b91505092915050565b7f4661696c656420746f207472616e7366657220746f6b656e7320666f7220666c60008201527f617368206c6f616e000000000000000000000000000000000000000000000000602082015250565b6000610bce602883610959565b9150610bd982610b72565b604082019050919050565b60006020820190508181036000830152610bfd81610bc1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610c3e8261087e565b9150610c498361087e565b9250828201905080821115610c6157610c60610c04565b5b92915050565b7f466c617368206c6f616e206661696c6564000000000000000000000000000000600082015250565b6000610c9d601183610959565b9150610ca882610c67565b602082019050919050565b60006020820190508181036000830152610ccc81610c90565b9050919050565b600081519050919050565b60005b83811015610cfc578082015181840152602081019050610ce1565b60008484015250505050565b6000610d1382610cd3565b610d1d8185610959565b9350610d2d818560208601610cde565b610d3681610742565b840191505092915050565b6000606082019050610d5660008301866106ce565b8181036020830152610d688185610d08565b9050610d776040830184610ad3565b949350505050565b7f6661696c656420746f2064656c65676174650000000000000000000000000000600082015250565b6000610db5601283610959565b9150610dc082610d7f565b602082019050919050565b60006020820190508181036000830152610de481610da8565b9050919050565b6000604082019050610e0060008301856106ce565b610e0d6020830184610ad3565b9392505050565b6000610e1f8261087e565b9150610e2a8361087e565b9250828203905081811115610e4257610e41610c04565b5b92915050565b7f466c617368206c6f616e2072657061796d656e74206661696c65640000000000600082015250565b6000610e7e601b83610959565b9150610e8982610e48565b602082019050919050565b60006020820190508181036000830152610ead81610e71565b905091905056fea264697066735822122057b4e05b96b02acf54c697cdf4a7032ce06061074aa1ac3505b5ac0ef5d5908a64736f6c63430008130033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c80638da5cb5b1461003b578063ee52ad7114610059575b600080fd5b610043610089565b60405161005091906106dd565b60405180910390f35b610073600480360381019061006e91906108b4565b6100ad565b604051610080919061093e565b60405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461013e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610135906109dc565b60405180910390fd5b6000849050828173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b815260040161017f9291906109fc565b602060405180830381865afa15801561019c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101c09190610a3a565b1015610201576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f890610ab3565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161023c91906106dd565b602060405180830381865afa158015610259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027d9190610a3a565b905060008273ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b81526004016102be93929190610ae2565b6020604051808303816000875af11580156102dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103019190610b45565b905080610343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033a90610be4565b60405180910390fd5b848261034f9190610c33565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161038891906106dd565b602060405180830381865afa1580156103a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c99190610a3a565b14610409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040090610cb3565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3388886040518463ffffffff1660e01b815260040161044893929190610d41565b6020604051808303816000875af1158015610467573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048b9190610b45565b9050806104cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104c490610dcb565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161050691906106dd565b602060405180830381865afa158015610523573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105479190610a3a565b91508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33876040518363ffffffff1660e01b8152600401610584929190610deb565b6020604051808303816000875af11580156105a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c79190610b45565b5084826105d49190610e14565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161060d91906106dd565b602060405180830381865afa15801561062a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064e9190610a3a565b1461068e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068590610e94565b60405180910390fd5b600193505050509392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106c78261069c565b9050919050565b6106d7816106bc565b82525050565b60006020820190506106f260008301846106ce565b92915050565b6000604051905090565b600080fd5b600080fd5b610715816106bc565b811461072057600080fd5b50565b6000813590506107328161070c565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61078b82610742565b810181811067ffffffffffffffff821117156107aa576107a9610753565b5b80604052505050565b60006107bd6106f8565b90506107c98282610782565b919050565b600067ffffffffffffffff8211156107e9576107e8610753565b5b6107f282610742565b9050602081019050919050565b82818337600083830152505050565b600061082161081c846107ce565b6107b3565b90508281526020810184848401111561083d5761083c61073d565b5b6108488482856107ff565b509392505050565b600082601f83011261086557610864610738565b5b813561087584826020860161080e565b91505092915050565b6000819050919050565b6108918161087e565b811461089c57600080fd5b50565b6000813590506108ae81610888565b92915050565b6000806000606084860312156108cd576108cc610702565b5b60006108db86828701610723565b935050602084013567ffffffffffffffff8111156108fc576108fb610707565b5b61090886828701610850565b92505060406109198682870161089f565b9150509250925092565b60008115159050919050565b61093881610923565b82525050565b6000602082019050610953600083018461092f565b92915050565b600082825260208201905092915050565b7f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b60006109c6602183610959565b91506109d18261096a565b604082019050919050565b600060208201905081810360008301526109f5816109b9565b9050919050565b6000604082019050610a1160008301856106ce565b610a1e60208301846106ce565b9392505050565b600081519050610a3481610888565b92915050565b600060208284031215610a5057610a4f610702565b5b6000610a5e84828501610a25565b91505092915050565b7f496e73756666696369656e7420616c6c6f77616e636500000000000000000000600082015250565b6000610a9d601683610959565b9150610aa882610a67565b602082019050919050565b60006020820190508181036000830152610acc81610a90565b9050919050565b610adc8161087e565b82525050565b6000606082019050610af760008301866106ce565b610b0460208301856106ce565b610b116040830184610ad3565b949350505050565b610b2281610923565b8114610b2d57600080fd5b50565b600081519050610b3f81610b19565b92915050565b600060208284031215610b5b57610b5a610702565b5b6000610b6984828501610b30565b91505092915050565b7f4661696c656420746f207472616e7366657220746f6b656e7320666f7220666c60008201527f617368206c6f616e000000000000000000000000000000000000000000000000602082015250565b6000610bce602883610959565b9150610bd982610b72565b604082019050919050565b60006020820190508181036000830152610bfd81610bc1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610c3e8261087e565b9150610c498361087e565b9250828201905080821115610c6157610c60610c04565b5b92915050565b7f466c617368206c6f616e206661696c6564000000000000000000000000000000600082015250565b6000610c9d601183610959565b9150610ca882610c67565b602082019050919050565b60006020820190508181036000830152610ccc81610c90565b9050919050565b600081519050919050565b60005b83811015610cfc578082015181840152602081019050610ce1565b60008484015250505050565b6000610d1382610cd3565b610d1d8185610959565b9350610d2d818560208601610cde565b610d3681610742565b840191505092915050565b6000606082019050610d5660008301866106ce565b8181036020830152610d688185610d08565b9050610d776040830184610ad3565b949350505050565b7f6661696c656420746f2064656c65676174650000000000000000000000000000600082015250565b6000610db5601283610959565b9150610dc082610d7f565b602082019050919050565b60006020820190508181036000830152610de481610da8565b9050919050565b6000604082019050610e0060008301856106ce565b610e0d6020830184610ad3565b9392505050565b6000610e1f8261087e565b9150610e2a8361087e565b9250828203905081811115610e4257610e41610c04565b5b92915050565b7f466c617368206c6f616e2072657061796d656e74206661696c65640000000000600082015250565b6000610e7e601b83610959565b9150610e8982610e48565b602082019050919050565b60006020820190508181036000830152610ead81610e71565b905091905056fea264697066735822122057b4e05b96b02acf54c697cdf4a7032ce06061074aa1ac3505b5ac0ef5d5908a64736f6c63430008130033", "linkReferences": {}, "deployedLinkReferences": {} } From e1d830f0facd6d13e74dfa734683b9bc04cd85cd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Jun 2024 14:34:46 +0200 Subject: [PATCH 281/345] build(deps): bump github.com/gorilla/websocket from 1.5.1 to 1.5.2 (#2612) * build(deps): bump github.com/gorilla/websocket from 1.5.1 to 1.5.2 Bumps [github.com/gorilla/websocket](https://github.com/gorilla/websocket) from 1.5.1 to 1.5.2. - [Release notes](https://github.com/gorilla/websocket/releases) - [Commits](https://github.com/gorilla/websocket/compare/v1.5.1...v1.5.2) --- updated-dependencies: - dependency-name: github.com/gorilla/websocket dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * update gomod2nix.toml file --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 18e4764d3c..4efbd6fd0a 100644 --- a/go.mod +++ b/go.mod @@ -25,7 +25,7 @@ require ( github.com/ethereum/go-ethereum v1.11.5 github.com/golang/protobuf v1.5.4 github.com/gorilla/mux v1.8.1 - github.com/gorilla/websocket v1.5.1 + github.com/gorilla/websocket v1.5.2 github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/hashicorp/go-version v1.7.0 github.com/improbable-eng/grpc-web v0.15.0 diff --git a/go.sum b/go.sum index a3f161a904..8b7f08a09d 100644 --- a/go.sum +++ b/go.sum @@ -706,8 +706,8 @@ github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWS github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= -github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= +github.com/gorilla/websocket v1.5.2 h1:qoW6V1GT3aZxybsbC6oLnailWnB+qTMVwMreOso9XUw= +github.com/gorilla/websocket v1.5.2/go.mod h1:0n9H61RBAcf5/38py2MCYbxzPIY9rOkpvvMT24Rqs30= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= diff --git a/gomod2nix.toml b/gomod2nix.toml index fee75bc187..084524c728 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -345,8 +345,8 @@ schema = 3 version = "v1.8.1" hash = "sha256-nDABvAhlYgxUW2N/brrep7NkQXoSGcHhA+XI4+tK0F0=" [mod."github.com/gorilla/websocket"] - version = "v1.5.1" - hash = "sha256-eHZ/U+eeE5tSgWc1jEDuBwtTRbXKP9fqP9zfW4Zw8T0=" + version = "v1.5.2" + hash = "sha256-dAKmnxHWkqdyqhkx+xo7kD0dDd26f/V5I4RnGUI0BHc=" [mod."github.com/grpc-ecosystem/go-grpc-middleware"] version = "v1.4.0" hash = "sha256-0UymBjkg41C9MPqkBLz/ZY9WbimZrabpJk+8C/X63h8=" From 28ea5b7351c34118775fc9671a57cf69415f8b00 Mon Sep 17 00:00:00 2001 From: Luke Date: Tue, 11 Jun 2024 00:24:39 +0800 Subject: [PATCH 282/345] imp: add integration test for precompile tx `CreateValidator` (#2575) * imp: add integration test for precompile tx CreateValidator * chore: update comment * feat(precompile): add staking module create validator integration test * change hardcoded tendermint pub key with util function --------- Signed-off-by: Luke Signed-off-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: stepit --- CHANGELOG.md | 1 + precompiles/staking/integration_test.go | 127 +++++++++++++ .../staking/testdata/StakingCaller.json | 157 +++++++++++++++- .../staking/testdata/StakingCaller.sol | 173 ++++++++++++------ precompiles/staking/utils_test.go | 10 + precompiles/testutil/contracts/types.go | 3 +- 6 files changed, 407 insertions(+), 64 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 38276fb415..99f3dd5e35 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -106,6 +106,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (app) [#2373](https://github.com/evmos/evmos/pull/2373) Remove ChainID constraint. - (rpc) [#2375](https://github.com/evmos/evmos/pull/2375) Add support for allow-insecure-unlock. +- (tests) [#2575](https://github.com/evmos/evmos/pull/2575) Add integration test for precompile tx `CreateValidator`. - (evm) [#2581](https://github.com/evmos/evmos/pull/2581) Fix wrong error message returned for DynamicFee txs. ### State Machine Breaking diff --git a/precompiles/staking/integration_test.go b/precompiles/staking/integration_test.go index 65a8fef095..12ca6f9579 100644 --- a/precompiles/staking/integration_test.go +++ b/precompiles/staking/integration_test.go @@ -406,6 +406,69 @@ var _ = Describe("Calling staking precompile directly", func() { }) }) + Describe("to create validator", func() { + var ( + defaultDescription = staking.Description{ + Moniker: "new node", + Identity: "", + Website: "", + SecurityContact: "", + Details: "", + } + defaultCommission = staking.Commission{ + Rate: big.NewInt(100000000000000000), + MaxRate: big.NewInt(100000000000000000), + MaxChangeRate: big.NewInt(100000000000000000), + } + defaultMinSelfDelegation = big.NewInt(1) + defaultPubkeyBase64Str = GenerateBase64PubKey() + defaultValue = big.NewInt(1) + + // defaultCreateValidatorArgs are the default arguments for the createValidator call + // + // NOTE: this has to be populated in the BeforeEach block because the private key is not initialized before + defaultCreateValidatorArgs contracts.CallArgs + ) + + BeforeEach(func() { + // populate the default createValidator args + defaultCreateValidatorArgs = defaultCallArgs.WithMethodName(staking.CreateValidatorMethod) + }) + + Context("when validator address is the origin", func() { + It("should succeed", func() { + createValidatorArgs := defaultCreateValidatorArgs.WithArgs( + defaultDescription, defaultCommission, defaultMinSelfDelegation, s.address, defaultPubkeyBase64Str, defaultValue, + ) + + logCheckArgs := passCheck.WithExpEvents(staking.EventTypeCreateValidator) + + _, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, createValidatorArgs, logCheckArgs) + Expect(err).To(BeNil(), "error while calling the smart contract: %v", err) + + _, found := s.app.StakingKeeper.GetValidator(s.ctx, s.address.Bytes()) + Expect(found).To(BeTrue(), "expected validator to be found") + }) + }) + + Context("when validator address is not the origin", func() { + It("should fail", func() { + differentAddr := testutiltx.GenerateAddress() + + createValidatorArgs := defaultCreateValidatorArgs.WithArgs( + defaultDescription, defaultCommission, defaultMinSelfDelegation, differentAddr, defaultPubkeyBase64Str, defaultValue, + ) + + logCheckArgs := defaultLogCheck.WithErrContains( + fmt.Sprintf(staking.ErrDifferentOriginFromDelegator, s.address, differentAddr), + ) + + _, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, createValidatorArgs, logCheckArgs) + Expect(err).To(HaveOccurred(), "error while calling the smart contract: %v", err) + }) + }) + }) + Describe("to delegate", func() { var ( // prevDelegation is the delegation that is available prior to the test (an initial delegation is @@ -1766,6 +1829,70 @@ var _ = Describe("Calling staking precompile via Solidity", func() { }) }) + Context("create a validator", func() { + var ( + valPriv *ethsecp256k1.PrivKey + valAddr sdk.AccAddress + + defaultDescription = staking.Description{ + Moniker: "new node", + Identity: "", + Website: "", + SecurityContact: "", + Details: "", + } + defaultCommission = staking.Commission{ + Rate: big.NewInt(100000000000000000), + MaxRate: big.NewInt(100000000000000000), + MaxChangeRate: big.NewInt(100000000000000000), + } + defaultMinSelfDelegation = big.NewInt(1) + defaultPubkeyBase64Str = GenerateBase64PubKey() + defaultValue = big.NewInt(1e8) + + // NOTE: this has to be populated in the BeforeEach block because the private key is not initialized before + defaultCreateValidatorArgs contracts.CallArgs + ) + + BeforeEach(func() { + defaultCreateValidatorArgs = defaultCallArgs.WithMethodName("testCreateValidator") + valAddr, valPriv = testutiltx.NewAccAddressAndKey() + err := evmosutil.FundAccountWithBaseDenom(s.ctx, s.app.BankKeeper, valAddr, 1e18) + Expect(err).To(BeNil(), "error while funding account: %v", err) + + s.NextBlock() + }) + + It("tx from validator operator - should create a validator success", func() { + cArgs := defaultCreateValidatorArgs. + WithPrivKey(s.privKey). + WithArgs(defaultDescription, defaultCommission, defaultMinSelfDelegation, s.address, defaultPubkeyBase64Str, defaultValue) + + logCheckArgs := passCheck.WithExpEvents(staking.EventTypeCreateValidator) + + _, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, cArgs, logCheckArgs) + Expect(err).To(BeNil(), "error while calling the smart contract: %v", err) + + validator, found := s.app.StakingKeeper.GetValidator(s.ctx, s.address.Bytes()) + Expect(found).To(BeTrue(), "expected validator to be found") + Expect(validator.Description.Moniker).To(Equal(defaultDescription.Moniker), "expected validator moniker to be 'new node'") + }) + + It("tx from another EOA - should create a validator fail", func() { + cArgs := defaultCreateValidatorArgs. + WithPrivKey(valPriv). + WithArgs(defaultDescription, defaultCommission, defaultMinSelfDelegation, s.address, defaultPubkeyBase64Str, defaultValue) + + logCheckArgs := defaultLogCheck.WithErrContains(fmt.Sprintf(staking.ErrDifferentOriginFromDelegator, s.address.String(), common.BytesToAddress(valAddr.Bytes()).String())) + + _, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, cArgs, logCheckArgs) + Expect(err).To(HaveOccurred(), "error while calling the smart contract: %v", err) + + _, found := s.app.StakingKeeper.GetValidator(s.ctx, s.address.Bytes()) + Expect(found).To(BeFalse(), "expected validator not to be found") + }) + }) + Context("delegating", func() { var ( // prevDelegation is the delegation that is available prior to the test (an initial delegation is diff --git a/precompiles/staking/testdata/StakingCaller.json b/precompiles/staking/testdata/StakingCaller.json index ed2804fa6f..ed92a2c127 100644 --- a/precompiles/staking/testdata/StakingCaller.json +++ b/precompiles/staking/testdata/StakingCaller.json @@ -1,7 +1,7 @@ { "_format": "hh-sol-artifact-1", "contractName": "StakingCaller", - "sourceName": "solidity/precompiles/staking/testdata/StakingCaller.sol", + "sourceName": "contracts/evmos/staking/testdata/StakingCaller.sol", "abi": [ { "inputs": [ @@ -811,6 +811,94 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "components": [ + { + "internalType": "string", + "name": "moniker", + "type": "string" + }, + { + "internalType": "string", + "name": "identity", + "type": "string" + }, + { + "internalType": "string", + "name": "website", + "type": "string" + }, + { + "internalType": "string", + "name": "securityContact", + "type": "string" + }, + { + "internalType": "string", + "name": "details", + "type": "string" + } + ], + "internalType": "struct Description", + "name": "_descr", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "rate", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxRate", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxChangeRate", + "type": "uint256" + } + ], + "internalType": "struct CommissionRates", + "name": "_commRates", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_minSelfDel", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_valAddr", + "type": "address" + }, + { + "internalType": "string", + "name": "_pubkey", + "type": "string" + }, + { + "internalType": "uint256", + "name": "_value", + "type": "uint256" + } + ], + "name": "testCreateValidator", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -852,6 +940,67 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "components": [ + { + "internalType": "string", + "name": "moniker", + "type": "string" + }, + { + "internalType": "string", + "name": "identity", + "type": "string" + }, + { + "internalType": "string", + "name": "website", + "type": "string" + }, + { + "internalType": "string", + "name": "securityContact", + "type": "string" + }, + { + "internalType": "string", + "name": "details", + "type": "string" + } + ], + "internalType": "struct Description", + "name": "_descr", + "type": "tuple" + }, + { + "internalType": "address", + "name": "_valAddr", + "type": "address" + }, + { + "internalType": "int256", + "name": "_commRate", + "type": "int256" + }, + { + "internalType": "int256", + "name": "_minSelfDel", + "type": "int256" + } + ], + "name": "testEditValidator", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -922,8 +1071,8 @@ "type": "function" } ], - "bytecode": "0x6080604052604051806020016040528060405180606001604052806023815260200162005c286023913981525060019060016200003e92919062000053565b503480156200004c57600080fd5b50620004a1565b828054828255906000526020600020908101928215620000a0579160200282015b828111156200009f5782518290816200008e9190620003ba565b509160200191906001019062000074565b5b509050620000af9190620000b3565b5090565b5b80821115620000d75760008181620000cd9190620000db565b50600101620000b4565b5090565b508054620000e990620001a9565b6000825580601f10620000fd57506200011e565b601f0160209004906000526020600020908101906200011d919062000121565b5b50565b5b808211156200013c57600081600090555060010162000122565b5090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620001c257607f821691505b602082108103620001d857620001d76200017a565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620002427fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000203565b6200024e868362000203565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200029b620002956200028f8462000266565b62000270565b62000266565b9050919050565b6000819050919050565b620002b7836200027a565b620002cf620002c682620002a2565b84845462000210565b825550505050565b600090565b620002e6620002d7565b620002f3818484620002ac565b505050565b5b818110156200031b576200030f600082620002dc565b600181019050620002f9565b5050565b601f8211156200036a576200033481620001de565b6200033f84620001f3565b810160208510156200034f578190505b620003676200035e85620001f3565b830182620002f8565b50505b505050565b600082821c905092915050565b60006200038f600019846008026200036f565b1980831691505092915050565b6000620003aa83836200037c565b9150826002028217905092915050565b620003c58262000140565b67ffffffffffffffff811115620003e157620003e06200014b565b5b620003ed8254620001a9565b620003fa8282856200031f565b600060209050601f8311600181146200043257600084156200041d578287015190505b6200042985826200039c565b86555062000499565b601f1984166200044286620001de565b60005b828110156200046c5784890151825560018201915060208501945060208101905062000445565b868310156200048c578489015162000488601f8916826200037c565b8355505b6001600288020188555050505b505050505050565b61577780620004b16000396000f3fe6080604052600436106101355760003560e01c80637e51b811116100ab578063cf2753cf1161006f578063cf2753cf14610418578063ec9485df14610456578063f40a214614610493578063f5714e64146104bc578063f700dbd2146104d8578063f732b0651461050157610135565b80637e51b811146103435780638939e7831461036c5780638edb3f8b146103955780639eab6711146103b1578063b13d4242146103da57610135565b8063455b8551116100fd578063455b85511461023057806355dc4b221461026d578063570467ac146102965780635e269bfe146102d357806360deaa2a146102fc57806361bc221a1461031857610135565b80630a4433e21461013a5780631904bb2e1461016357806319b16c4c146101a057806331bcbcb3146101de5780633566cb9514610207575b600080fd5b34801561014657600080fd5b50610161600480360381019061015c919061221e565b61053f565b005b34801561016f57600080fd5b5061018a60048036038101906101859190612292565b61060e565b6040516101979190612509565b60405180910390f35b3480156101ac57600080fd5b506101c760048036038101906101c2919061265b565b61069e565b6040516101d5929190612732565b60405180910390f35b3480156101ea57600080fd5b5061020560048036038101906102009190612762565b610b9d565b005b34801561021357600080fd5b5061022e600480360381019061022991906127d1565b610e2a565b005b34801561023c57600080fd5b506102576004803603810190610252919061282d565b610f92565b6040516102649190612a34565b60405180910390f35b34801561027957600080fd5b50610294600480360381019061028f9190612a56565b611025565b005b3480156102a257600080fd5b506102bd60048036038101906102b8919061265b565b611417565b6040516102ca9190612c71565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f59190612c93565b6114ad565b005b61031660048036038101906103119190612d16565b611538565b005b34801561032457600080fd5b5061032d611686565b60405161033a9190612d5f565b60405180910390f35b34801561034f57600080fd5b5061036a60048036038101906103659190612762565b61168c565b005b34801561037857600080fd5b50610393600480360381019061038e9190612762565b611714565b005b6103af60048036038101906103aa9190612d16565b61179c565b005b3480156103bd57600080fd5b506103d860048036038101906103d39190612d7a565b611931565b005b3480156103e657600080fd5b5061040160048036038101906103fc9190612e3d565b6119bc565b60405161040f929190613106565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a919061282d565b611a54565b60405161044d929190612732565b60405180910390f35b34801561046257600080fd5b5061047d6004803603810190610478919061282d565b611aec565b60405161048a9190612d5f565b60405180910390f35b34801561049f57600080fd5b506104ba60048036038101906104b5919061313d565b611b76565b005b6104d660048036038101906104d19190612d16565b611d52565b005b3480156104e457600080fd5b506104ff60048036038101906104fa91906131c0565b611eac565b005b34801561050d57600080fd5b50610528600480360381019061052391906133cb565b611f78565b6040516105369291906136e2565b60405180910390f35b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895868487876040518563ffffffff1660e01b8152600401610582949392919061387b565b6020604051808303816000875af11580156105a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c591906138d0565b905080610607576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105fe90613980565b60405180910390fd5b5050505050565b610616612016565b61080073ffffffffffffffffffffffffffffffffffffffff1663223b3b7a836040518263ffffffff1660e01b815260040161065191906139a0565b600060405180830381865afa15801561066e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906106979190613bf1565b9050919050565b60006106a861208a565b60006108009050600086866040516024016106c4929190613c73565b6040516020818303038152906040527f241774e6000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000856040516020016107569190613cdf565b60405160208183030381529060405280519060200120905060405160200161077d90613d42565b604051602081830303815290604052805190602001208103610869576000808473ffffffffffffffffffffffffffffffffffffffff16846040516107c19190613d93565b600060405180830381855af49150503d80600081146107fc576040519150601f19603f3d011682016040523d82523d6000602084013e610801565b606091505b509150915081610846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083d90613e1c565b60405180910390fd5b8080602001905181019061085a9190613ea8565b80975081985050505050610b92565b60405160200161087890613f50565b604051602081830303815290604052805190602001208103610964576000808473ffffffffffffffffffffffffffffffffffffffff16846040516108bc9190613d93565b600060405180830381855afa9150503d80600081146108f7576040519150601f19603f3d011682016040523d82523d6000602084013e6108fc565b606091505b509150915081610941576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093890613fb1565b60405180910390fd5b808060200190518101906109559190613ea8565b80975081985050505050610b91565b6040516020016109739061401d565b604051602081830303815290604052805190602001208103610a61576000808473ffffffffffffffffffffffffffffffffffffffff16846040516109b79190613d93565b6000604051808303816000865af19150503d80600081146109f4576040519150601f19603f3d011682016040523d82523d6000602084013e6109f9565b606091505b509150915081610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a359061407e565b60405180910390fd5b80806020019051810190610a529190613ea8565b80975081985050505050610b90565b604051602001610a70906140ea565b604051602081830303815290604052805190602001208103610b545760006040518060400160405280601a81526020017f64656c65676174696f6e28616464726573732c737472696e6729000000000000815250805190602001209050600060a490506060600060208b01516020808d0101516040518681528e6004820152604060248201526033604482015282606482015281608482015260c081878360008e5af281519c5060608201519450610100820160405280610b3057600080fd5b50505050604051806040016040528083815260200182815250975050505050610b8f565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b869061414b565b60405180910390fd5b5b5b5b505050935093915050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610bdf93929190614319565b6020604051808303816000875af1158015610bfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2291906138d0565b905080610c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5b906143a3565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff163384604051602401610c909291906143c3565b6040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610d1a9190613d93565b6000604051808303816000865af19150503d8060008114610d57576040519150601f19603f3d011682016040523d82523d6000602084013e610d5c565b606091505b5050905080610da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9790614438565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3386866040518463ffffffff1660e01b8152600401610ddf93929190614458565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906138d0565b505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610e6c93929190614319565b6020604051808303816000875af1158015610e8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eaf91906138d0565b905080610ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee8906144e2565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3085856040518463ffffffff1660e01b8152600401610f3093929190614458565b6020604051808303816000875af1158015610f4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7391906138d0565b506001600080828254610f869190614531565b92505081905550505050565b610f9a6120a4565b61080073ffffffffffffffffffffffffffffffffffffffff1663a03ffee184846040518363ffffffff1660e01b8152600401610fd7929190613c73565b600060405180830381865afa158015610ff4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061101d9190614795565b905092915050565b60006108009050600085858560405160240161104393929190614458565b6040516020818303038152906040527f3edab33c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000836040516020016110d59190613cdf565b6040516020818303038152906040528051906020012090506040516020016110fc90613d42565b6040516020818303038152906040528051906020012081036111c95760008373ffffffffffffffffffffffffffffffffffffffff168360405161113f9190613d93565b600060405180830381855af49150503d806000811461117a576040519150601f19603f3d011682016040523d82523d6000602084013e61117f565b606091505b50509050806111c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ba90613e1c565b60405180910390fd5b5061140e565b6040516020016111d890613f50565b6040516020818303038152906040528051906020012081036112a55760008373ffffffffffffffffffffffffffffffffffffffff168360405161121b9190613d93565b600060405180830381855afa9150503d8060008114611256576040519150601f19603f3d011682016040523d82523d6000602084013e61125b565b606091505b505090508061129f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129690613fb1565b60405180910390fd5b5061140d565b6040516020016112b49061401d565b6040516020818303038152906040528051906020012081036113835760008373ffffffffffffffffffffffffffffffffffffffff16836040516112f79190613d93565b6000604051808303816000865af19150503d8060008114611334576040519150601f19603f3d011682016040523d82523d6000602084013e611339565b606091505b505090508061137d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113749061407e565b60405180910390fd5b5061140c565b604051602001611392906140ea565b6040516020818303038152906040528051906020012081036113d05760208201825160008082846000895af2806113c857600080fd5b50505061140b565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114029061414b565b60405180910390fd5b5b5b5b50505050505050565b61141f6120c5565b61080073ffffffffffffffffffffffffffffffffffffffff16637d9f939c8585856040518463ffffffff1660e01b815260040161145e939291906147de565b600060405180830381865afa15801561147b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906114a49190614a46565b90509392505050565b61080073ffffffffffffffffffffffffffffffffffffffff166312d58dfe858585856040518563ffffffff1660e01b81526004016114ee9493929190614a8f565b6020604051808303816000875af115801561150d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153191906138d0565b5050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895303460016040518463ffffffff1660e01b815260040161157a93929190614319565b6020604051808303816000875af1158015611599573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115bd91906138d0565b9050806115ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f690614b27565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b815260040161163e93929190614458565b6020604051808303816000875af115801561165d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168191906138d0565b505050565b60005481565b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c8484846040518463ffffffff1660e01b81526004016116cb93929190614458565b6020604051808303816000875af11580156116ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170e9190614b47565b50505050565b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb8484846040518463ffffffff1660e01b815260040161175393929190614458565b6020604051808303816000875af1158015611772573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179691906138d0565b50505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b81526004016117de93929190614319565b6020604051808303816000875af11580156117fd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182191906138d0565b905080611863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185a90614b27565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b81526004016118a293929190614458565b6020604051808303816000875af11580156118c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e591906138d0565b503373ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f1935050505015801561192c573d6000803e3d6000fd5b505050565b61080073ffffffffffffffffffffffffffffffffffffffff166354b826f5858585856040518563ffffffff1660e01b81526004016119729493929190614b74565b6020604051808303816000875af1158015611991573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b59190614b47565b5050505050565b60606119c66120ed565b61080073ffffffffffffffffffffffffffffffffffffffff1663186b216785856040518363ffffffff1660e01b8152600401611a03929190614d25565b600060405180830381865afa158015611a20573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611a499190614f19565b915091509250929050565b6000611a5e61208a565b61080073ffffffffffffffffffffffffffffffffffffffff1663241774e685856040518363ffffffff1660e01b8152600401611a9b929190613c73565b600060405180830381865afa158015611ab8573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611ae19190613ea8565b915091509250929050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663fc08930c8433856040518463ffffffff1660e01b8152600401611b2d93929190614f91565b602060405180830381865afa158015611b4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6e9190614fcf565b905092915050565b6000600167ffffffffffffffff811115611b9357611b92612530565b5b604051908082528060200260200182016040528015611bc657816020015b6060815260200190600190039081611bb15790505b50905060405180606001604052806025815260200161571d6025913981600081518110611bf657611bf5614ffc565b5b6020026020010181905250600061080073ffffffffffffffffffffffffffffffffffffffff1663b60398958787856040518463ffffffff1660e01b8152600401611c42939291906150dc565b6020604051808303816000875af1158015611c61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8591906138d0565b905080611cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbe9061518c565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c3285876040518463ffffffff1660e01b8152600401611d0693929190614458565b6020604051808303816000875af1158015611d25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d499190614b47565b50505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b8152600401611d9493929190614319565b6020604051808303816000875af1158015611db3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd791906138d0565b905080611e19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1090614b27565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084600134611e469190614531565b6040518463ffffffff1660e01b8152600401611e6493929190614458565b6020604051808303816000875af1158015611e83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea791906138d0565b505050565b600061080073ffffffffffffffffffffffffffffffffffffffff166361dc5c3b8585856040518463ffffffff1660e01b8152600401611eed939291906151ac565b6020604051808303816000875af1158015611f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f3091906138d0565b905080611f72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6990615250565b60405180910390fd5b50505050565b6060611f826120ed565b61080073ffffffffffffffffffffffffffffffffffffffff166310a2851c878787876040518563ffffffff1660e01b8152600401611fc394939291906152e6565b600060405180830381865afa158015611fe0573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061200991906156a4565b9150915094509492505050565b60405180610160016040528060608152602001606081526020016000151581526020016000600381111561204d5761204c61236a565b5b8152602001600081526020016000815260200160608152602001600060070b8152602001600060070b815260200160008152602001600081525090565b604051806040016040528060608152602001600081525090565b60405180606001604052806060815260200160608152602001606081525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061215082612125565b9050919050565b61216081612145565b811461216b57600080fd5b50565b60008135905061217d81612157565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126121a8576121a7612183565b5b8235905067ffffffffffffffff8111156121c5576121c4612188565b5b6020830191508360208202830111156121e1576121e061218d565b5b9250929050565b6000819050919050565b6121fb816121e8565b811461220657600080fd5b50565b600081359050612218816121f2565b92915050565b600080600080606085870312156122385761223761211b565b5b60006122468782880161216e565b945050602085013567ffffffffffffffff81111561226757612266612120565b5b61227387828801612192565b9350935050604061228687828801612209565b91505092959194509250565b6000602082840312156122a8576122a761211b565b5b60006122b68482850161216e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156122f95780820151818401526020810190506122de565b60008484015250505050565b6000601f19601f8301169050919050565b6000612321826122bf565b61232b81856122ca565b935061233b8185602086016122db565b61234481612305565b840191505092915050565b60008115159050919050565b6123648161234f565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106123aa576123a961236a565b5b50565b60008190506123bb82612399565b919050565b60006123cb826123ad565b9050919050565b6123db816123c0565b82525050565b6123ea816121e8565b82525050565b60008160070b9050919050565b612406816123f0565b82525050565b600061016083016000830151848203600086015261242a8282612316565b915050602083015184820360208601526124448282612316565b9150506040830151612459604086018261235b565b50606083015161246c60608601826123d2565b50608083015161247f60808601826123e1565b5060a083015161249260a08601826123e1565b5060c083015184820360c08601526124aa8282612316565b91505060e08301516124bf60e08601826123fd565b506101008301516124d46101008601826123fd565b506101208301516124e96101208601826123e1565b506101408301516124fe6101408601826123e1565b508091505092915050565b60006020820190508181036000830152612523818461240c565b905092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61256882612305565b810181811067ffffffffffffffff8211171561258757612586612530565b5b80604052505050565b600061259a612111565b90506125a6828261255f565b919050565b600067ffffffffffffffff8211156125c6576125c5612530565b5b6125cf82612305565b9050602081019050919050565b82818337600083830152505050565b60006125fe6125f9846125ab565b612590565b90508281526020810184848401111561261a5761261961252b565b5b6126258482856125dc565b509392505050565b600082601f83011261264257612641612183565b5b81356126528482602086016125eb565b91505092915050565b6000806000606084860312156126745761267361211b565b5b60006126828682870161216e565b935050602084013567ffffffffffffffff8111156126a3576126a2612120565b5b6126af8682870161262d565b925050604084013567ffffffffffffffff8111156126d0576126cf612120565b5b6126dc8682870161262d565b9150509250925092565b6126ef816121e8565b82525050565b600060408301600083015184820360008601526127128282612316565b915050602083015161272760208601826123e1565b508091505092915050565b600060408201905061274760008301856126e6565b818103602083015261275981846126f5565b90509392505050565b60008060006060848603121561277b5761277a61211b565b5b60006127898682870161216e565b935050602084013567ffffffffffffffff8111156127aa576127a9612120565b5b6127b68682870161262d565b92505060406127c786828701612209565b9150509250925092565b600080604083850312156127e8576127e761211b565b5b600083013567ffffffffffffffff81111561280657612805612120565b5b6128128582860161262d565b925050602061282385828601612209565b9150509250929050565b600080604083850312156128445761284361211b565b5b60006128528582860161216e565b925050602083013567ffffffffffffffff81111561287357612872612120565b5b61287f8582860161262d565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600067ffffffffffffffff82169050919050565b6128d2816128b5565b82525050565b60c0820160008201516128ee60008501826123fd565b50602082015161290160208501826123fd565b50604082015161291460408501826123e1565b50606082015161292760608501826123e1565b50608082015161293a60808501826128c9565b5060a082015161294d60a08501826123fd565b50505050565b600061295f83836128d8565b60c08301905092915050565b6000602082019050919050565b600061298382612889565b61298d8185612894565b9350612998836128a5565b8060005b838110156129c95781516129b08882612953565b97506129bb8361296b565b92505060018101905061299c565b5085935050505092915050565b600060608301600083015184820360008601526129f38282612316565b91505060208301518482036020860152612a0d8282612316565b91505060408301518482036040860152612a278282612978565b9150508091505092915050565b60006020820190508181036000830152612a4e81846129d6565b905092915050565b60008060008060808587031215612a7057612a6f61211b565b5b6000612a7e8782880161216e565b945050602085013567ffffffffffffffff811115612a9f57612a9e612120565b5b612aab8782880161262d565b9350506040612abc87828801612209565b925050606085013567ffffffffffffffff811115612add57612adc612120565b5b612ae98782880161262d565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b608082016000820151612b3760008501826123fd565b506020820151612b4a60208501826123fd565b506040820151612b5d60408501826123e1565b506060820151612b7060608501826123e1565b50505050565b6000612b828383612b21565b60808301905092915050565b6000602082019050919050565b6000612ba682612af5565b612bb08185612b00565b9350612bbb83612b11565b8060005b83811015612bec578151612bd38882612b76565b9750612bde83612b8e565b925050600181019050612bbf565b5085935050505092915050565b60006080830160008301518482036000860152612c168282612316565b91505060208301518482036020860152612c308282612316565b91505060408301518482036040860152612c4a8282612316565b91505060608301518482036060860152612c648282612b9b565b9150508091505092915050565b60006020820190508181036000830152612c8b8184612bf9565b905092915050565b60008060008060808587031215612cad57612cac61211b565b5b6000612cbb8782880161216e565b945050602085013567ffffffffffffffff811115612cdc57612cdb612120565b5b612ce88782880161262d565b9350506040612cf987828801612209565b9250506060612d0a87828801612209565b91505092959194509250565b600060208284031215612d2c57612d2b61211b565b5b600082013567ffffffffffffffff811115612d4a57612d49612120565b5b612d568482850161262d565b91505092915050565b6000602082019050612d7460008301846126e6565b92915050565b60008060008060808587031215612d9457612d9361211b565b5b6000612da28782880161216e565b945050602085013567ffffffffffffffff811115612dc357612dc2612120565b5b612dcf8782880161262d565b935050604085013567ffffffffffffffff811115612df057612def612120565b5b612dfc8782880161262d565b9250506060612e0d87828801612209565b91505092959194509250565b600080fd5b600060a08284031215612e3457612e33612e19565b5b81905092915050565b60008060408385031215612e5457612e5361211b565b5b600083013567ffffffffffffffff811115612e7257612e71612120565b5b612e7e8582860161262d565b925050602083013567ffffffffffffffff811115612e9f57612e9e612120565b5b612eab85828601612e1e565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000610160830160008301518482036000860152612eff8282612316565b91505060208301518482036020860152612f198282612316565b9150506040830151612f2e604086018261235b565b506060830151612f4160608601826123d2565b506080830151612f5460808601826123e1565b5060a0830151612f6760a08601826123e1565b5060c083015184820360c0860152612f7f8282612316565b91505060e0830151612f9460e08601826123fd565b50610100830151612fa96101008601826123fd565b50610120830151612fbe6101208601826123e1565b50610140830151612fd36101408601826123e1565b508091505092915050565b6000612fea8383612ee1565b905092915050565b6000602082019050919050565b600061300a82612eb5565b6130148185612ec0565b93508360208202850161302685612ed1565b8060005b8581101561306257848403895281516130438582612fde565b945061304e83612ff2565b925060208a0199505060018101905061302a565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b600061309b82613074565b6130a5818561307f565b93506130b58185602086016122db565b6130be81612305565b840191505092915050565b600060408301600083015184820360008601526130e68282613090565b91505060208301516130fb60208601826128c9565b508091505092915050565b600060408201905081810360008301526131208185612fff565b9050818103602083015261313481846130c9565b90509392505050565b600080600080608085870312156131575761315661211b565b5b60006131658782880161216e565b945050602061317687828801612209565b935050604061318787828801612209565b925050606085013567ffffffffffffffff8111156131a8576131a7612120565b5b6131b48782880161262d565b91505092959194509250565b6000806000604084860312156131d9576131d861211b565b5b60006131e78682870161216e565b935050602084013567ffffffffffffffff81111561320857613207612120565b5b61321486828701612192565b92509250509250925092565b600080fd5b600080fd5b600067ffffffffffffffff82111561324557613244612530565b5b61324e82612305565b9050602081019050919050565b600061326e6132698461322a565b612590565b90508281526020810184848401111561328a5761328961252b565b5b6132958482856125dc565b509392505050565b600082601f8301126132b2576132b1612183565b5b81356132c284826020860161325b565b91505092915050565b6132d4816128b5565b81146132df57600080fd5b50565b6000813590506132f1816132cb565b92915050565b6133008161234f565b811461330b57600080fd5b50565b60008135905061331d816132f7565b92915050565b600060a0828403121561333957613338613220565b5b61334360a0612590565b9050600082013567ffffffffffffffff81111561336357613362613225565b5b61336f8482850161329d565b6000830152506020613383848285016132e2565b6020830152506040613397848285016132e2565b60408301525060606133ab8482850161330e565b60608301525060806133bf8482850161330e565b60808301525092915050565b600080600080608085870312156133e5576133e461211b565b5b60006133f38782880161216e565b945050602085013567ffffffffffffffff81111561341457613413612120565b5b6134208782880161262d565b935050604085013567ffffffffffffffff81111561344157613440612120565b5b61344d8782880161262d565b925050606085013567ffffffffffffffff81111561346e5761346d612120565b5b61347a87828801613323565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060808301600083015184820360008601526134cf8282612316565b915050602083015184820360208601526134e98282612316565b915050604083015184820360408601526135038282612316565b9150506060830151848203606086015261351d8282612b9b565b9150508091505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60a08201600082015161356c6000850182612b21565b50602082015161357f60808501826123e1565b50505050565b60006135918383613556565b60a08301905092915050565b6000602082019050919050565b60006135b58261352a565b6135bf8185613535565b93506135ca83613546565b8060005b838110156135fb5781516135e28882613585565b97506135ed8361359d565b9250506001810190506135ce565b5085935050505092915050565b6000604083016000830151848203600086015261362582826134b2565b9150506020830151848203602086015261363f82826135aa565b9150508091505092915050565b60006136588383613608565b905092915050565b6000602082019050919050565b600061367882613486565b6136828185613491565b935083602082028501613694856134a2565b8060005b858110156136d057848403895281516136b1858261364c565b94506136bc83613660565b925060208a01995050600181019050613698565b50829750879550505050505092915050565b600060408201905081810360008301526136fc818561366d565b9050818103602083015261371081846130c9565b90509392505050565b61372281612145565b82525050565b600082825260208201905092915050565b6000819050919050565b600061374f83856122ca565b935061375c8385846125dc565b61376583612305565b840190509392505050565b600061377d848484613743565b90509392505050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126137b2576137b1613790565b5b83810192508235915060208301925067ffffffffffffffff8211156137da576137d9613786565b5b6001820236038313156137f0576137ef61378b565b5b509250929050565b6000602082019050919050565b60006138118385613728565b93508360208402850161382384613739565b8060005b8781101561386957848403895261383e8284613795565b613849868284613770565b9550613854846137f8565b935060208b019a505050600181019050613827565b50829750879450505050509392505050565b60006060820190506138906000830187613719565b61389d60208301866126e6565b81810360408301526138b0818486613805565b905095945050505050565b6000815190506138ca816132f7565b92915050565b6000602082840312156138e6576138e561211b565b5b60006138f4848285016138bb565b91505092915050565b600082825260208201905092915050565b7f4661696c656420746f20617070726f7665207374616b696e67206d6574686f6460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061396a6021836138fd565b91506139758261390e565b604082019050919050565b600060208201905081810360008301526139998161395d565b9050919050565b60006020820190506139b56000830184613719565b92915050565b60006139ce6139c9846125ab565b612590565b9050828152602081018484840111156139ea576139e961252b565b5b6139f58482856122db565b509392505050565b600082601f830112613a1257613a11612183565b5b8151613a228482602086016139bb565b91505092915050565b60048110613a3857600080fd5b50565b600081519050613a4a81613a2b565b92915050565b600081519050613a5f816121f2565b92915050565b613a6e816123f0565b8114613a7957600080fd5b50565b600081519050613a8b81613a65565b92915050565b60006101608284031215613aa857613aa7613220565b5b613ab3610160612590565b9050600082015167ffffffffffffffff811115613ad357613ad2613225565b5b613adf848285016139fd565b600083015250602082015167ffffffffffffffff811115613b0357613b02613225565b5b613b0f848285016139fd565b6020830152506040613b23848285016138bb565b6040830152506060613b3784828501613a3b565b6060830152506080613b4b84828501613a50565b60808301525060a0613b5f84828501613a50565b60a08301525060c082015167ffffffffffffffff811115613b8357613b82613225565b5b613b8f848285016139fd565b60c08301525060e0613ba384828501613a7c565b60e083015250610100613bb884828501613a7c565b61010083015250610120613bce84828501613a50565b61012083015250610140613be484828501613a50565b6101408301525092915050565b600060208284031215613c0757613c0661211b565b5b600082015167ffffffffffffffff811115613c2557613c24612120565b5b613c3184828501613a91565b91505092915050565b6000613c45826122bf565b613c4f81856138fd565b9350613c5f8185602086016122db565b613c6881612305565b840191505092915050565b6000604082019050613c886000830185613719565b8181036020830152613c9a8184613c3a565b90509392505050565b600081905092915050565b6000613cb9826122bf565b613cc38185613ca3565b9350613cd38185602086016122db565b80840191505092915050565b6000613ceb8284613cae565b915081905092915050565b7f64656c656761746563616c6c0000000000000000000000000000000000000000600082015250565b6000613d2c600c83613ca3565b9150613d3782613cf6565b600c82019050919050565b6000613d4d82613d1f565b9150819050919050565b600081905092915050565b6000613d6d82613074565b613d778185613d57565b9350613d878185602086016122db565b80840191505092915050565b6000613d9f8284613d62565b915081905092915050565b7f6661696c65642064656c656761746563616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e066021836138fd565b9150613e1182613daa565b604082019050919050565b60006020820190508181036000830152613e3581613df9565b9050919050565b600060408284031215613e5257613e51613220565b5b613e5c6040612590565b9050600082015167ffffffffffffffff811115613e7c57613e7b613225565b5b613e88848285016139fd565b6000830152506020613e9c84828501613a50565b60208301525092915050565b60008060408385031215613ebf57613ebe61211b565b5b6000613ecd85828601613a50565b925050602083015167ffffffffffffffff811115613eee57613eed612120565b5b613efa85828601613e3c565b9150509250929050565b7f73746174696363616c6c00000000000000000000000000000000000000000000600082015250565b6000613f3a600a83613ca3565b9150613f4582613f04565b600a82019050919050565b6000613f5b82613f2d565b9150819050919050565b7f6661696c65642073746174696363616c6c20746f20707265636f6d70696c6500600082015250565b6000613f9b601f836138fd565b9150613fa682613f65565b602082019050919050565b60006020820190508181036000830152613fca81613f8e565b9050919050565b7f63616c6c00000000000000000000000000000000000000000000000000000000600082015250565b6000614007600483613ca3565b915061401282613fd1565b600482019050919050565b600061402882613ffa565b9150819050919050565b7f6661696c65642063616c6c20746f20707265636f6d70696c6500000000000000600082015250565b60006140686019836138fd565b915061407382614032565b602082019050919050565b600060208201905081810360008301526140978161405b565b9050919050565b7f63616c6c636f6465000000000000000000000000000000000000000000000000600082015250565b60006140d4600883613ca3565b91506140df8261409e565b600882019050919050565b60006140f5826140c7565b9150819050919050565b7f696e76616c69642063616c6c7479706500000000000000000000000000000000600082015250565b60006141356010836138fd565b9150614140826140ff565b602082019050919050565b6000602082019050818103600083015261416481614128565b9050919050565b600081549050919050565b60008190508160005260206000209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806141d257607f821691505b6020821081036141e5576141e461418b565b5b50919050565b60008190508160005260206000209050919050565b6000815461420d816141ba565b61421781866122ca565b9450600182166000811461423257600181146142485761427b565b60ff19831686528115156020028601935061427b565b614251856141eb565b60005b8381101561427357815481890152600182019150602081019050614254565b808801955050505b50505092915050565b60006142908383614200565b905092915050565b6000600182019050919050565b60006142b08261416b565b6142ba8185613728565b9350836020820285016142cc85614176565b8060005b85811015614307578484038952816142e88582614284565b94506142f383614298565b925060208a019950506001810190506142d0565b50829750879550505050505092915050565b600060608201905061432e6000830186613719565b61433b60208301856126e6565b818103604083015261434d81846142a5565b9050949350505050565b7f64656c65676174696f6e20617070726f76616c206661696c6564000000000000600082015250565b600061438d601a836138fd565b915061439882614357565b602082019050919050565b600060208201905081810360008301526143bc81614380565b9050919050565b60006040820190506143d86000830185613719565b6143e560208301846126e6565b9392505050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000614422600f836138fd565b915061442d826143ec565b602082019050919050565b6000602082019050818103600083015261445181614415565b9050919050565b600060608201905061446d6000830186613719565b818103602083015261447f8185613c3a565b905061448e60408301846126e6565b949350505050565b7f5374616b696e6720417070726f7665206661696c656400000000000000000000600082015250565b60006144cc6016836138fd565b91506144d782614496565b602082019050919050565b600060208201905081810360008301526144fb816144bf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061453c826121e8565b9150614547836121e8565b925082820190508082111561455f5761455e614502565b5b92915050565b600067ffffffffffffffff8211156145805761457f612530565b5b602082029050602081019050919050565b6000815190506145a0816132cb565b92915050565b600060c082840312156145bc576145bb613220565b5b6145c660c0612590565b905060006145d684828501613a7c565b60008301525060206145ea84828501613a7c565b60208301525060406145fe84828501613a50565b604083015250606061461284828501613a50565b606083015250608061462684828501614591565b60808301525060a061463a84828501613a7c565b60a08301525092915050565b600061465961465484614565565b612590565b90508083825260208201905060c0840283018581111561467c5761467b61218d565b5b835b818110156146a5578061469188826145a6565b84526020840193505060c08101905061467e565b5050509392505050565b600082601f8301126146c4576146c3612183565b5b81516146d4848260208601614646565b91505092915050565b6000606082840312156146f3576146f2613220565b5b6146fd6060612590565b9050600082015167ffffffffffffffff81111561471d5761471c613225565b5b614729848285016139fd565b600083015250602082015167ffffffffffffffff81111561474d5761474c613225565b5b614759848285016139fd565b602083015250604082015167ffffffffffffffff81111561477d5761477c613225565b5b614789848285016146af565b60408301525092915050565b6000602082840312156147ab576147aa61211b565b5b600082015167ffffffffffffffff8111156147c9576147c8612120565b5b6147d5848285016146dd565b91505092915050565b60006060820190506147f36000830186613719565b81810360208301526148058185613c3a565b905081810360408301526148198184613c3a565b9050949350505050565b600067ffffffffffffffff82111561483e5761483d612530565b5b602082029050602081019050919050565b60006080828403121561486557614864613220565b5b61486f6080612590565b9050600061487f84828501613a7c565b600083015250602061489384828501613a7c565b60208301525060406148a784828501613a50565b60408301525060606148bb84828501613a50565b60608301525092915050565b60006148da6148d584614823565b612590565b905080838252602082019050608084028301858111156148fd576148fc61218d565b5b835b818110156149265780614912888261484f565b8452602084019350506080810190506148ff565b5050509392505050565b600082601f83011261494557614944612183565b5b81516149558482602086016148c7565b91505092915050565b60006080828403121561497457614973613220565b5b61497e6080612590565b9050600082015167ffffffffffffffff81111561499e5761499d613225565b5b6149aa848285016139fd565b600083015250602082015167ffffffffffffffff8111156149ce576149cd613225565b5b6149da848285016139fd565b602083015250604082015167ffffffffffffffff8111156149fe576149fd613225565b5b614a0a848285016139fd565b604083015250606082015167ffffffffffffffff811115614a2e57614a2d613225565b5b614a3a84828501614930565b60608301525092915050565b600060208284031215614a5c57614a5b61211b565b5b600082015167ffffffffffffffff811115614a7a57614a79612120565b5b614a868482850161495e565b91505092915050565b6000608082019050614aa46000830187613719565b8181036020830152614ab68186613c3a565b9050614ac560408301856126e6565b614ad260608301846126e6565b95945050505050565b7f44656c656761746520417070726f7665206661696c6564000000000000000000600082015250565b6000614b116017836138fd565b9150614b1c82614adb565b602082019050919050565b60006020820190508181036000830152614b4081614b04565b9050919050565b600060208284031215614b5d57614b5c61211b565b5b6000614b6b84828501613a7c565b91505092915050565b6000608082019050614b896000830187613719565b8181036020830152614b9b8186613c3a565b90508181036040830152614baf8185613c3a565b9050614bbe60608301846126e6565b95945050505050565b60008083356001602003843603038112614be457614be3613790565b5b83810192508235915060208301925067ffffffffffffffff821115614c0c57614c0b613786565b5b600182023603831315614c2257614c2161378b565b5b509250929050565b6000614c36838561307f565b9350614c438385846125dc565b614c4c83612305565b840190509392505050565b6000614c6660208401846132e2565b905092915050565b6000614c7d602084018461330e565b905092915050565b600060a08301614c986000840184614bc7565b8583036000870152614cab838284614c2a565b92505050614cbc6020840184614c57565b614cc960208601826128c9565b50614cd76040840184614c57565b614ce460408601826128c9565b50614cf26060840184614c6e565b614cff606086018261235b565b50614d0d6080840184614c6e565b614d1a608086018261235b565b508091505092915050565b60006040820190508181036000830152614d3f8185613c3a565b90508181036020830152614d538184614c85565b90509392505050565b600067ffffffffffffffff821115614d7757614d76612530565b5b602082029050602081019050919050565b6000614d9b614d9684614d5c565b612590565b90508083825260208201905060208402830185811115614dbe57614dbd61218d565b5b835b81811015614e0557805167ffffffffffffffff811115614de357614de2612183565b5b808601614df08982613a91565b85526020850194505050602081019050614dc0565b5050509392505050565b600082601f830112614e2457614e23612183565b5b8151614e34848260208601614d88565b91505092915050565b6000614e50614e4b8461322a565b612590565b905082815260208101848484011115614e6c57614e6b61252b565b5b614e778482856122db565b509392505050565b600082601f830112614e9457614e93612183565b5b8151614ea4848260208601614e3d565b91505092915050565b600060408284031215614ec357614ec2613220565b5b614ecd6040612590565b9050600082015167ffffffffffffffff811115614eed57614eec613225565b5b614ef984828501614e7f565b6000830152506020614f0d84828501614591565b60208301525092915050565b60008060408385031215614f3057614f2f61211b565b5b600083015167ffffffffffffffff811115614f4e57614f4d612120565b5b614f5a85828601614e0f565b925050602083015167ffffffffffffffff811115614f7b57614f7a612120565b5b614f8785828601614ead565b9150509250929050565b6000606082019050614fa66000830186613719565b614fb36020830185613719565b8181036040830152614fc58184613c3a565b9050949350505050565b600060208284031215614fe557614fe461211b565b5b6000614ff384828501613a50565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b6000819050602082019050919050565b60006150528383612316565b905092915050565b6000602082019050919050565b60006150728261502b565b61507c8185613728565b93508360208202850161508e85615036565b8060005b858110156150ca57848403895281516150ab8582615046565b94506150b68361505a565b925060208a01995050600181019050615092565b50829750879550505050505092915050565b60006060820190506150f16000830186613719565b6150fe60208301856126e6565b81810360408301526151108184615067565b9050949350505050565b7f6661696c656420746f20617070726f766520756e64656c65676174696f6e206d60008201527f6574686f64000000000000000000000000000000000000000000000000000000602082015250565b60006151766025836138fd565b91506151818261511a565b604082019050919050565b600060208201905081810360008301526151a581615169565b9050919050565b60006040820190506151c16000830186613719565b81810360208301526151d4818486613805565b9050949350505050565b7f4661696c656420746f207265766f6b6520617070726f76616c20666f7220737460008201527f616b696e67206d6574686f647300000000000000000000000000000000000000602082015250565b600061523a602d836138fd565b9150615245826151de565b604082019050919050565b600060208201905081810360008301526152698161522d565b9050919050565b600060a083016000830151848203600086015261528d8282613090565b91505060208301516152a260208601826128c9565b5060408301516152b560408601826128c9565b5060608301516152c8606086018261235b565b5060808301516152db608086018261235b565b508091505092915050565b60006080820190506152fb6000830187613719565b818103602083015261530d8186613c3a565b905081810360408301526153218185613c3a565b905081810360608301526153358184615270565b905095945050505050565b600067ffffffffffffffff82111561535b5761535a612530565b5b602082029050602081019050919050565b60006080828403121561538257615381613220565b5b61538c6080612590565b9050600082015167ffffffffffffffff8111156153ac576153ab613225565b5b6153b8848285016139fd565b600083015250602082015167ffffffffffffffff8111156153dc576153db613225565b5b6153e8848285016139fd565b602083015250604082015167ffffffffffffffff81111561540c5761540b613225565b5b615418848285016139fd565b604083015250606082015167ffffffffffffffff81111561543c5761543b613225565b5b61544884828501614930565b60608301525092915050565b600067ffffffffffffffff82111561546f5761546e612530565b5b602082029050602081019050919050565b600060a0828403121561549657615495613220565b5b6154a06040612590565b905060006154b08482850161484f565b60008301525060806154c484828501613a50565b60208301525092915050565b60006154e36154de84615454565b612590565b90508083825260208201905060a084028301858111156155065761550561218d565b5b835b8181101561552f578061551b8882615480565b84526020840193505060a081019050615508565b5050509392505050565b600082601f83011261554e5761554d612183565b5b815161555e8482602086016154d0565b91505092915050565b60006040828403121561557d5761557c613220565b5b6155876040612590565b9050600082015167ffffffffffffffff8111156155a7576155a6613225565b5b6155b38482850161536c565b600083015250602082015167ffffffffffffffff8111156155d7576155d6613225565b5b6155e384828501615539565b60208301525092915050565b60006156026155fd84615340565b612590565b905080838252602082019050602084028301858111156156255761562461218d565b5b835b8181101561566c57805167ffffffffffffffff81111561564a57615649612183565b5b8086016156578982615567565b85526020850194505050602081019050615627565b5050509392505050565b600082601f83011261568b5761568a612183565b5b815161569b8482602086016155ef565b91505092915050565b600080604083850312156156bb576156ba61211b565b5b600083015167ffffffffffffffff8111156156d9576156d8612120565b5b6156e585828601615676565b925050602083015167ffffffffffffffff81111561570657615705612120565b5b61571285828601614ead565b915050925092905056fe2f636f736d6f732e7374616b696e672e763162657461312e4d7367556e64656c6567617465a264697066735822122025fb99f701996d5dbfba7bb291edb892dd49aca0491bb08fa976e3078bf77f5464736f6c634300081300332f636f736d6f732e7374616b696e672e763162657461312e4d736744656c6567617465", - "deployedBytecode": "0x6080604052600436106101355760003560e01c80637e51b811116100ab578063cf2753cf1161006f578063cf2753cf14610418578063ec9485df14610456578063f40a214614610493578063f5714e64146104bc578063f700dbd2146104d8578063f732b0651461050157610135565b80637e51b811146103435780638939e7831461036c5780638edb3f8b146103955780639eab6711146103b1578063b13d4242146103da57610135565b8063455b8551116100fd578063455b85511461023057806355dc4b221461026d578063570467ac146102965780635e269bfe146102d357806360deaa2a146102fc57806361bc221a1461031857610135565b80630a4433e21461013a5780631904bb2e1461016357806319b16c4c146101a057806331bcbcb3146101de5780633566cb9514610207575b600080fd5b34801561014657600080fd5b50610161600480360381019061015c919061221e565b61053f565b005b34801561016f57600080fd5b5061018a60048036038101906101859190612292565b61060e565b6040516101979190612509565b60405180910390f35b3480156101ac57600080fd5b506101c760048036038101906101c2919061265b565b61069e565b6040516101d5929190612732565b60405180910390f35b3480156101ea57600080fd5b5061020560048036038101906102009190612762565b610b9d565b005b34801561021357600080fd5b5061022e600480360381019061022991906127d1565b610e2a565b005b34801561023c57600080fd5b506102576004803603810190610252919061282d565b610f92565b6040516102649190612a34565b60405180910390f35b34801561027957600080fd5b50610294600480360381019061028f9190612a56565b611025565b005b3480156102a257600080fd5b506102bd60048036038101906102b8919061265b565b611417565b6040516102ca9190612c71565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f59190612c93565b6114ad565b005b61031660048036038101906103119190612d16565b611538565b005b34801561032457600080fd5b5061032d611686565b60405161033a9190612d5f565b60405180910390f35b34801561034f57600080fd5b5061036a60048036038101906103659190612762565b61168c565b005b34801561037857600080fd5b50610393600480360381019061038e9190612762565b611714565b005b6103af60048036038101906103aa9190612d16565b61179c565b005b3480156103bd57600080fd5b506103d860048036038101906103d39190612d7a565b611931565b005b3480156103e657600080fd5b5061040160048036038101906103fc9190612e3d565b6119bc565b60405161040f929190613106565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a919061282d565b611a54565b60405161044d929190612732565b60405180910390f35b34801561046257600080fd5b5061047d6004803603810190610478919061282d565b611aec565b60405161048a9190612d5f565b60405180910390f35b34801561049f57600080fd5b506104ba60048036038101906104b5919061313d565b611b76565b005b6104d660048036038101906104d19190612d16565b611d52565b005b3480156104e457600080fd5b506104ff60048036038101906104fa91906131c0565b611eac565b005b34801561050d57600080fd5b50610528600480360381019061052391906133cb565b611f78565b6040516105369291906136e2565b60405180910390f35b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895868487876040518563ffffffff1660e01b8152600401610582949392919061387b565b6020604051808303816000875af11580156105a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c591906138d0565b905080610607576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105fe90613980565b60405180910390fd5b5050505050565b610616612016565b61080073ffffffffffffffffffffffffffffffffffffffff1663223b3b7a836040518263ffffffff1660e01b815260040161065191906139a0565b600060405180830381865afa15801561066e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906106979190613bf1565b9050919050565b60006106a861208a565b60006108009050600086866040516024016106c4929190613c73565b6040516020818303038152906040527f241774e6000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000856040516020016107569190613cdf565b60405160208183030381529060405280519060200120905060405160200161077d90613d42565b604051602081830303815290604052805190602001208103610869576000808473ffffffffffffffffffffffffffffffffffffffff16846040516107c19190613d93565b600060405180830381855af49150503d80600081146107fc576040519150601f19603f3d011682016040523d82523d6000602084013e610801565b606091505b509150915081610846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083d90613e1c565b60405180910390fd5b8080602001905181019061085a9190613ea8565b80975081985050505050610b92565b60405160200161087890613f50565b604051602081830303815290604052805190602001208103610964576000808473ffffffffffffffffffffffffffffffffffffffff16846040516108bc9190613d93565b600060405180830381855afa9150503d80600081146108f7576040519150601f19603f3d011682016040523d82523d6000602084013e6108fc565b606091505b509150915081610941576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093890613fb1565b60405180910390fd5b808060200190518101906109559190613ea8565b80975081985050505050610b91565b6040516020016109739061401d565b604051602081830303815290604052805190602001208103610a61576000808473ffffffffffffffffffffffffffffffffffffffff16846040516109b79190613d93565b6000604051808303816000865af19150503d80600081146109f4576040519150601f19603f3d011682016040523d82523d6000602084013e6109f9565b606091505b509150915081610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a359061407e565b60405180910390fd5b80806020019051810190610a529190613ea8565b80975081985050505050610b90565b604051602001610a70906140ea565b604051602081830303815290604052805190602001208103610b545760006040518060400160405280601a81526020017f64656c65676174696f6e28616464726573732c737472696e6729000000000000815250805190602001209050600060a490506060600060208b01516020808d0101516040518681528e6004820152604060248201526033604482015282606482015281608482015260c081878360008e5af281519c5060608201519450610100820160405280610b3057600080fd5b50505050604051806040016040528083815260200182815250975050505050610b8f565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b869061414b565b60405180910390fd5b5b5b5b505050935093915050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610bdf93929190614319565b6020604051808303816000875af1158015610bfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2291906138d0565b905080610c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5b906143a3565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff163384604051602401610c909291906143c3565b6040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610d1a9190613d93565b6000604051808303816000865af19150503d8060008114610d57576040519150601f19603f3d011682016040523d82523d6000602084013e610d5c565b606091505b5050905080610da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9790614438565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3386866040518463ffffffff1660e01b8152600401610ddf93929190614458565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906138d0565b505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610e6c93929190614319565b6020604051808303816000875af1158015610e8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eaf91906138d0565b905080610ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee8906144e2565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3085856040518463ffffffff1660e01b8152600401610f3093929190614458565b6020604051808303816000875af1158015610f4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7391906138d0565b506001600080828254610f869190614531565b92505081905550505050565b610f9a6120a4565b61080073ffffffffffffffffffffffffffffffffffffffff1663a03ffee184846040518363ffffffff1660e01b8152600401610fd7929190613c73565b600060405180830381865afa158015610ff4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061101d9190614795565b905092915050565b60006108009050600085858560405160240161104393929190614458565b6040516020818303038152906040527f3edab33c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000836040516020016110d59190613cdf565b6040516020818303038152906040528051906020012090506040516020016110fc90613d42565b6040516020818303038152906040528051906020012081036111c95760008373ffffffffffffffffffffffffffffffffffffffff168360405161113f9190613d93565b600060405180830381855af49150503d806000811461117a576040519150601f19603f3d011682016040523d82523d6000602084013e61117f565b606091505b50509050806111c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ba90613e1c565b60405180910390fd5b5061140e565b6040516020016111d890613f50565b6040516020818303038152906040528051906020012081036112a55760008373ffffffffffffffffffffffffffffffffffffffff168360405161121b9190613d93565b600060405180830381855afa9150503d8060008114611256576040519150601f19603f3d011682016040523d82523d6000602084013e61125b565b606091505b505090508061129f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129690613fb1565b60405180910390fd5b5061140d565b6040516020016112b49061401d565b6040516020818303038152906040528051906020012081036113835760008373ffffffffffffffffffffffffffffffffffffffff16836040516112f79190613d93565b6000604051808303816000865af19150503d8060008114611334576040519150601f19603f3d011682016040523d82523d6000602084013e611339565b606091505b505090508061137d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113749061407e565b60405180910390fd5b5061140c565b604051602001611392906140ea565b6040516020818303038152906040528051906020012081036113d05760208201825160008082846000895af2806113c857600080fd5b50505061140b565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114029061414b565b60405180910390fd5b5b5b5b50505050505050565b61141f6120c5565b61080073ffffffffffffffffffffffffffffffffffffffff16637d9f939c8585856040518463ffffffff1660e01b815260040161145e939291906147de565b600060405180830381865afa15801561147b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906114a49190614a46565b90509392505050565b61080073ffffffffffffffffffffffffffffffffffffffff166312d58dfe858585856040518563ffffffff1660e01b81526004016114ee9493929190614a8f565b6020604051808303816000875af115801561150d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153191906138d0565b5050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895303460016040518463ffffffff1660e01b815260040161157a93929190614319565b6020604051808303816000875af1158015611599573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115bd91906138d0565b9050806115ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f690614b27565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b815260040161163e93929190614458565b6020604051808303816000875af115801561165d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168191906138d0565b505050565b60005481565b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c8484846040518463ffffffff1660e01b81526004016116cb93929190614458565b6020604051808303816000875af11580156116ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170e9190614b47565b50505050565b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb8484846040518463ffffffff1660e01b815260040161175393929190614458565b6020604051808303816000875af1158015611772573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179691906138d0565b50505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b81526004016117de93929190614319565b6020604051808303816000875af11580156117fd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182191906138d0565b905080611863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185a90614b27565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b81526004016118a293929190614458565b6020604051808303816000875af11580156118c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e591906138d0565b503373ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f1935050505015801561192c573d6000803e3d6000fd5b505050565b61080073ffffffffffffffffffffffffffffffffffffffff166354b826f5858585856040518563ffffffff1660e01b81526004016119729493929190614b74565b6020604051808303816000875af1158015611991573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b59190614b47565b5050505050565b60606119c66120ed565b61080073ffffffffffffffffffffffffffffffffffffffff1663186b216785856040518363ffffffff1660e01b8152600401611a03929190614d25565b600060405180830381865afa158015611a20573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611a499190614f19565b915091509250929050565b6000611a5e61208a565b61080073ffffffffffffffffffffffffffffffffffffffff1663241774e685856040518363ffffffff1660e01b8152600401611a9b929190613c73565b600060405180830381865afa158015611ab8573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611ae19190613ea8565b915091509250929050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663fc08930c8433856040518463ffffffff1660e01b8152600401611b2d93929190614f91565b602060405180830381865afa158015611b4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6e9190614fcf565b905092915050565b6000600167ffffffffffffffff811115611b9357611b92612530565b5b604051908082528060200260200182016040528015611bc657816020015b6060815260200190600190039081611bb15790505b50905060405180606001604052806025815260200161571d6025913981600081518110611bf657611bf5614ffc565b5b6020026020010181905250600061080073ffffffffffffffffffffffffffffffffffffffff1663b60398958787856040518463ffffffff1660e01b8152600401611c42939291906150dc565b6020604051808303816000875af1158015611c61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8591906138d0565b905080611cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbe9061518c565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c3285876040518463ffffffff1660e01b8152600401611d0693929190614458565b6020604051808303816000875af1158015611d25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d499190614b47565b50505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b8152600401611d9493929190614319565b6020604051808303816000875af1158015611db3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd791906138d0565b905080611e19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1090614b27565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084600134611e469190614531565b6040518463ffffffff1660e01b8152600401611e6493929190614458565b6020604051808303816000875af1158015611e83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea791906138d0565b505050565b600061080073ffffffffffffffffffffffffffffffffffffffff166361dc5c3b8585856040518463ffffffff1660e01b8152600401611eed939291906151ac565b6020604051808303816000875af1158015611f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f3091906138d0565b905080611f72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6990615250565b60405180910390fd5b50505050565b6060611f826120ed565b61080073ffffffffffffffffffffffffffffffffffffffff166310a2851c878787876040518563ffffffff1660e01b8152600401611fc394939291906152e6565b600060405180830381865afa158015611fe0573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061200991906156a4565b9150915094509492505050565b60405180610160016040528060608152602001606081526020016000151581526020016000600381111561204d5761204c61236a565b5b8152602001600081526020016000815260200160608152602001600060070b8152602001600060070b815260200160008152602001600081525090565b604051806040016040528060608152602001600081525090565b60405180606001604052806060815260200160608152602001606081525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061215082612125565b9050919050565b61216081612145565b811461216b57600080fd5b50565b60008135905061217d81612157565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126121a8576121a7612183565b5b8235905067ffffffffffffffff8111156121c5576121c4612188565b5b6020830191508360208202830111156121e1576121e061218d565b5b9250929050565b6000819050919050565b6121fb816121e8565b811461220657600080fd5b50565b600081359050612218816121f2565b92915050565b600080600080606085870312156122385761223761211b565b5b60006122468782880161216e565b945050602085013567ffffffffffffffff81111561226757612266612120565b5b61227387828801612192565b9350935050604061228687828801612209565b91505092959194509250565b6000602082840312156122a8576122a761211b565b5b60006122b68482850161216e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156122f95780820151818401526020810190506122de565b60008484015250505050565b6000601f19601f8301169050919050565b6000612321826122bf565b61232b81856122ca565b935061233b8185602086016122db565b61234481612305565b840191505092915050565b60008115159050919050565b6123648161234f565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106123aa576123a961236a565b5b50565b60008190506123bb82612399565b919050565b60006123cb826123ad565b9050919050565b6123db816123c0565b82525050565b6123ea816121e8565b82525050565b60008160070b9050919050565b612406816123f0565b82525050565b600061016083016000830151848203600086015261242a8282612316565b915050602083015184820360208601526124448282612316565b9150506040830151612459604086018261235b565b50606083015161246c60608601826123d2565b50608083015161247f60808601826123e1565b5060a083015161249260a08601826123e1565b5060c083015184820360c08601526124aa8282612316565b91505060e08301516124bf60e08601826123fd565b506101008301516124d46101008601826123fd565b506101208301516124e96101208601826123e1565b506101408301516124fe6101408601826123e1565b508091505092915050565b60006020820190508181036000830152612523818461240c565b905092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61256882612305565b810181811067ffffffffffffffff8211171561258757612586612530565b5b80604052505050565b600061259a612111565b90506125a6828261255f565b919050565b600067ffffffffffffffff8211156125c6576125c5612530565b5b6125cf82612305565b9050602081019050919050565b82818337600083830152505050565b60006125fe6125f9846125ab565b612590565b90508281526020810184848401111561261a5761261961252b565b5b6126258482856125dc565b509392505050565b600082601f83011261264257612641612183565b5b81356126528482602086016125eb565b91505092915050565b6000806000606084860312156126745761267361211b565b5b60006126828682870161216e565b935050602084013567ffffffffffffffff8111156126a3576126a2612120565b5b6126af8682870161262d565b925050604084013567ffffffffffffffff8111156126d0576126cf612120565b5b6126dc8682870161262d565b9150509250925092565b6126ef816121e8565b82525050565b600060408301600083015184820360008601526127128282612316565b915050602083015161272760208601826123e1565b508091505092915050565b600060408201905061274760008301856126e6565b818103602083015261275981846126f5565b90509392505050565b60008060006060848603121561277b5761277a61211b565b5b60006127898682870161216e565b935050602084013567ffffffffffffffff8111156127aa576127a9612120565b5b6127b68682870161262d565b92505060406127c786828701612209565b9150509250925092565b600080604083850312156127e8576127e761211b565b5b600083013567ffffffffffffffff81111561280657612805612120565b5b6128128582860161262d565b925050602061282385828601612209565b9150509250929050565b600080604083850312156128445761284361211b565b5b60006128528582860161216e565b925050602083013567ffffffffffffffff81111561287357612872612120565b5b61287f8582860161262d565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600067ffffffffffffffff82169050919050565b6128d2816128b5565b82525050565b60c0820160008201516128ee60008501826123fd565b50602082015161290160208501826123fd565b50604082015161291460408501826123e1565b50606082015161292760608501826123e1565b50608082015161293a60808501826128c9565b5060a082015161294d60a08501826123fd565b50505050565b600061295f83836128d8565b60c08301905092915050565b6000602082019050919050565b600061298382612889565b61298d8185612894565b9350612998836128a5565b8060005b838110156129c95781516129b08882612953565b97506129bb8361296b565b92505060018101905061299c565b5085935050505092915050565b600060608301600083015184820360008601526129f38282612316565b91505060208301518482036020860152612a0d8282612316565b91505060408301518482036040860152612a278282612978565b9150508091505092915050565b60006020820190508181036000830152612a4e81846129d6565b905092915050565b60008060008060808587031215612a7057612a6f61211b565b5b6000612a7e8782880161216e565b945050602085013567ffffffffffffffff811115612a9f57612a9e612120565b5b612aab8782880161262d565b9350506040612abc87828801612209565b925050606085013567ffffffffffffffff811115612add57612adc612120565b5b612ae98782880161262d565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b608082016000820151612b3760008501826123fd565b506020820151612b4a60208501826123fd565b506040820151612b5d60408501826123e1565b506060820151612b7060608501826123e1565b50505050565b6000612b828383612b21565b60808301905092915050565b6000602082019050919050565b6000612ba682612af5565b612bb08185612b00565b9350612bbb83612b11565b8060005b83811015612bec578151612bd38882612b76565b9750612bde83612b8e565b925050600181019050612bbf565b5085935050505092915050565b60006080830160008301518482036000860152612c168282612316565b91505060208301518482036020860152612c308282612316565b91505060408301518482036040860152612c4a8282612316565b91505060608301518482036060860152612c648282612b9b565b9150508091505092915050565b60006020820190508181036000830152612c8b8184612bf9565b905092915050565b60008060008060808587031215612cad57612cac61211b565b5b6000612cbb8782880161216e565b945050602085013567ffffffffffffffff811115612cdc57612cdb612120565b5b612ce88782880161262d565b9350506040612cf987828801612209565b9250506060612d0a87828801612209565b91505092959194509250565b600060208284031215612d2c57612d2b61211b565b5b600082013567ffffffffffffffff811115612d4a57612d49612120565b5b612d568482850161262d565b91505092915050565b6000602082019050612d7460008301846126e6565b92915050565b60008060008060808587031215612d9457612d9361211b565b5b6000612da28782880161216e565b945050602085013567ffffffffffffffff811115612dc357612dc2612120565b5b612dcf8782880161262d565b935050604085013567ffffffffffffffff811115612df057612def612120565b5b612dfc8782880161262d565b9250506060612e0d87828801612209565b91505092959194509250565b600080fd5b600060a08284031215612e3457612e33612e19565b5b81905092915050565b60008060408385031215612e5457612e5361211b565b5b600083013567ffffffffffffffff811115612e7257612e71612120565b5b612e7e8582860161262d565b925050602083013567ffffffffffffffff811115612e9f57612e9e612120565b5b612eab85828601612e1e565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000610160830160008301518482036000860152612eff8282612316565b91505060208301518482036020860152612f198282612316565b9150506040830151612f2e604086018261235b565b506060830151612f4160608601826123d2565b506080830151612f5460808601826123e1565b5060a0830151612f6760a08601826123e1565b5060c083015184820360c0860152612f7f8282612316565b91505060e0830151612f9460e08601826123fd565b50610100830151612fa96101008601826123fd565b50610120830151612fbe6101208601826123e1565b50610140830151612fd36101408601826123e1565b508091505092915050565b6000612fea8383612ee1565b905092915050565b6000602082019050919050565b600061300a82612eb5565b6130148185612ec0565b93508360208202850161302685612ed1565b8060005b8581101561306257848403895281516130438582612fde565b945061304e83612ff2565b925060208a0199505060018101905061302a565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b600061309b82613074565b6130a5818561307f565b93506130b58185602086016122db565b6130be81612305565b840191505092915050565b600060408301600083015184820360008601526130e68282613090565b91505060208301516130fb60208601826128c9565b508091505092915050565b600060408201905081810360008301526131208185612fff565b9050818103602083015261313481846130c9565b90509392505050565b600080600080608085870312156131575761315661211b565b5b60006131658782880161216e565b945050602061317687828801612209565b935050604061318787828801612209565b925050606085013567ffffffffffffffff8111156131a8576131a7612120565b5b6131b48782880161262d565b91505092959194509250565b6000806000604084860312156131d9576131d861211b565b5b60006131e78682870161216e565b935050602084013567ffffffffffffffff81111561320857613207612120565b5b61321486828701612192565b92509250509250925092565b600080fd5b600080fd5b600067ffffffffffffffff82111561324557613244612530565b5b61324e82612305565b9050602081019050919050565b600061326e6132698461322a565b612590565b90508281526020810184848401111561328a5761328961252b565b5b6132958482856125dc565b509392505050565b600082601f8301126132b2576132b1612183565b5b81356132c284826020860161325b565b91505092915050565b6132d4816128b5565b81146132df57600080fd5b50565b6000813590506132f1816132cb565b92915050565b6133008161234f565b811461330b57600080fd5b50565b60008135905061331d816132f7565b92915050565b600060a0828403121561333957613338613220565b5b61334360a0612590565b9050600082013567ffffffffffffffff81111561336357613362613225565b5b61336f8482850161329d565b6000830152506020613383848285016132e2565b6020830152506040613397848285016132e2565b60408301525060606133ab8482850161330e565b60608301525060806133bf8482850161330e565b60808301525092915050565b600080600080608085870312156133e5576133e461211b565b5b60006133f38782880161216e565b945050602085013567ffffffffffffffff81111561341457613413612120565b5b6134208782880161262d565b935050604085013567ffffffffffffffff81111561344157613440612120565b5b61344d8782880161262d565b925050606085013567ffffffffffffffff81111561346e5761346d612120565b5b61347a87828801613323565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060808301600083015184820360008601526134cf8282612316565b915050602083015184820360208601526134e98282612316565b915050604083015184820360408601526135038282612316565b9150506060830151848203606086015261351d8282612b9b565b9150508091505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60a08201600082015161356c6000850182612b21565b50602082015161357f60808501826123e1565b50505050565b60006135918383613556565b60a08301905092915050565b6000602082019050919050565b60006135b58261352a565b6135bf8185613535565b93506135ca83613546565b8060005b838110156135fb5781516135e28882613585565b97506135ed8361359d565b9250506001810190506135ce565b5085935050505092915050565b6000604083016000830151848203600086015261362582826134b2565b9150506020830151848203602086015261363f82826135aa565b9150508091505092915050565b60006136588383613608565b905092915050565b6000602082019050919050565b600061367882613486565b6136828185613491565b935083602082028501613694856134a2565b8060005b858110156136d057848403895281516136b1858261364c565b94506136bc83613660565b925060208a01995050600181019050613698565b50829750879550505050505092915050565b600060408201905081810360008301526136fc818561366d565b9050818103602083015261371081846130c9565b90509392505050565b61372281612145565b82525050565b600082825260208201905092915050565b6000819050919050565b600061374f83856122ca565b935061375c8385846125dc565b61376583612305565b840190509392505050565b600061377d848484613743565b90509392505050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126137b2576137b1613790565b5b83810192508235915060208301925067ffffffffffffffff8211156137da576137d9613786565b5b6001820236038313156137f0576137ef61378b565b5b509250929050565b6000602082019050919050565b60006138118385613728565b93508360208402850161382384613739565b8060005b8781101561386957848403895261383e8284613795565b613849868284613770565b9550613854846137f8565b935060208b019a505050600181019050613827565b50829750879450505050509392505050565b60006060820190506138906000830187613719565b61389d60208301866126e6565b81810360408301526138b0818486613805565b905095945050505050565b6000815190506138ca816132f7565b92915050565b6000602082840312156138e6576138e561211b565b5b60006138f4848285016138bb565b91505092915050565b600082825260208201905092915050565b7f4661696c656420746f20617070726f7665207374616b696e67206d6574686f6460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061396a6021836138fd565b91506139758261390e565b604082019050919050565b600060208201905081810360008301526139998161395d565b9050919050565b60006020820190506139b56000830184613719565b92915050565b60006139ce6139c9846125ab565b612590565b9050828152602081018484840111156139ea576139e961252b565b5b6139f58482856122db565b509392505050565b600082601f830112613a1257613a11612183565b5b8151613a228482602086016139bb565b91505092915050565b60048110613a3857600080fd5b50565b600081519050613a4a81613a2b565b92915050565b600081519050613a5f816121f2565b92915050565b613a6e816123f0565b8114613a7957600080fd5b50565b600081519050613a8b81613a65565b92915050565b60006101608284031215613aa857613aa7613220565b5b613ab3610160612590565b9050600082015167ffffffffffffffff811115613ad357613ad2613225565b5b613adf848285016139fd565b600083015250602082015167ffffffffffffffff811115613b0357613b02613225565b5b613b0f848285016139fd565b6020830152506040613b23848285016138bb565b6040830152506060613b3784828501613a3b565b6060830152506080613b4b84828501613a50565b60808301525060a0613b5f84828501613a50565b60a08301525060c082015167ffffffffffffffff811115613b8357613b82613225565b5b613b8f848285016139fd565b60c08301525060e0613ba384828501613a7c565b60e083015250610100613bb884828501613a7c565b61010083015250610120613bce84828501613a50565b61012083015250610140613be484828501613a50565b6101408301525092915050565b600060208284031215613c0757613c0661211b565b5b600082015167ffffffffffffffff811115613c2557613c24612120565b5b613c3184828501613a91565b91505092915050565b6000613c45826122bf565b613c4f81856138fd565b9350613c5f8185602086016122db565b613c6881612305565b840191505092915050565b6000604082019050613c886000830185613719565b8181036020830152613c9a8184613c3a565b90509392505050565b600081905092915050565b6000613cb9826122bf565b613cc38185613ca3565b9350613cd38185602086016122db565b80840191505092915050565b6000613ceb8284613cae565b915081905092915050565b7f64656c656761746563616c6c0000000000000000000000000000000000000000600082015250565b6000613d2c600c83613ca3565b9150613d3782613cf6565b600c82019050919050565b6000613d4d82613d1f565b9150819050919050565b600081905092915050565b6000613d6d82613074565b613d778185613d57565b9350613d878185602086016122db565b80840191505092915050565b6000613d9f8284613d62565b915081905092915050565b7f6661696c65642064656c656761746563616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e066021836138fd565b9150613e1182613daa565b604082019050919050565b60006020820190508181036000830152613e3581613df9565b9050919050565b600060408284031215613e5257613e51613220565b5b613e5c6040612590565b9050600082015167ffffffffffffffff811115613e7c57613e7b613225565b5b613e88848285016139fd565b6000830152506020613e9c84828501613a50565b60208301525092915050565b60008060408385031215613ebf57613ebe61211b565b5b6000613ecd85828601613a50565b925050602083015167ffffffffffffffff811115613eee57613eed612120565b5b613efa85828601613e3c565b9150509250929050565b7f73746174696363616c6c00000000000000000000000000000000000000000000600082015250565b6000613f3a600a83613ca3565b9150613f4582613f04565b600a82019050919050565b6000613f5b82613f2d565b9150819050919050565b7f6661696c65642073746174696363616c6c20746f20707265636f6d70696c6500600082015250565b6000613f9b601f836138fd565b9150613fa682613f65565b602082019050919050565b60006020820190508181036000830152613fca81613f8e565b9050919050565b7f63616c6c00000000000000000000000000000000000000000000000000000000600082015250565b6000614007600483613ca3565b915061401282613fd1565b600482019050919050565b600061402882613ffa565b9150819050919050565b7f6661696c65642063616c6c20746f20707265636f6d70696c6500000000000000600082015250565b60006140686019836138fd565b915061407382614032565b602082019050919050565b600060208201905081810360008301526140978161405b565b9050919050565b7f63616c6c636f6465000000000000000000000000000000000000000000000000600082015250565b60006140d4600883613ca3565b91506140df8261409e565b600882019050919050565b60006140f5826140c7565b9150819050919050565b7f696e76616c69642063616c6c7479706500000000000000000000000000000000600082015250565b60006141356010836138fd565b9150614140826140ff565b602082019050919050565b6000602082019050818103600083015261416481614128565b9050919050565b600081549050919050565b60008190508160005260206000209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806141d257607f821691505b6020821081036141e5576141e461418b565b5b50919050565b60008190508160005260206000209050919050565b6000815461420d816141ba565b61421781866122ca565b9450600182166000811461423257600181146142485761427b565b60ff19831686528115156020028601935061427b565b614251856141eb565b60005b8381101561427357815481890152600182019150602081019050614254565b808801955050505b50505092915050565b60006142908383614200565b905092915050565b6000600182019050919050565b60006142b08261416b565b6142ba8185613728565b9350836020820285016142cc85614176565b8060005b85811015614307578484038952816142e88582614284565b94506142f383614298565b925060208a019950506001810190506142d0565b50829750879550505050505092915050565b600060608201905061432e6000830186613719565b61433b60208301856126e6565b818103604083015261434d81846142a5565b9050949350505050565b7f64656c65676174696f6e20617070726f76616c206661696c6564000000000000600082015250565b600061438d601a836138fd565b915061439882614357565b602082019050919050565b600060208201905081810360008301526143bc81614380565b9050919050565b60006040820190506143d86000830185613719565b6143e560208301846126e6565b9392505050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000614422600f836138fd565b915061442d826143ec565b602082019050919050565b6000602082019050818103600083015261445181614415565b9050919050565b600060608201905061446d6000830186613719565b818103602083015261447f8185613c3a565b905061448e60408301846126e6565b949350505050565b7f5374616b696e6720417070726f7665206661696c656400000000000000000000600082015250565b60006144cc6016836138fd565b91506144d782614496565b602082019050919050565b600060208201905081810360008301526144fb816144bf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061453c826121e8565b9150614547836121e8565b925082820190508082111561455f5761455e614502565b5b92915050565b600067ffffffffffffffff8211156145805761457f612530565b5b602082029050602081019050919050565b6000815190506145a0816132cb565b92915050565b600060c082840312156145bc576145bb613220565b5b6145c660c0612590565b905060006145d684828501613a7c565b60008301525060206145ea84828501613a7c565b60208301525060406145fe84828501613a50565b604083015250606061461284828501613a50565b606083015250608061462684828501614591565b60808301525060a061463a84828501613a7c565b60a08301525092915050565b600061465961465484614565565b612590565b90508083825260208201905060c0840283018581111561467c5761467b61218d565b5b835b818110156146a5578061469188826145a6565b84526020840193505060c08101905061467e565b5050509392505050565b600082601f8301126146c4576146c3612183565b5b81516146d4848260208601614646565b91505092915050565b6000606082840312156146f3576146f2613220565b5b6146fd6060612590565b9050600082015167ffffffffffffffff81111561471d5761471c613225565b5b614729848285016139fd565b600083015250602082015167ffffffffffffffff81111561474d5761474c613225565b5b614759848285016139fd565b602083015250604082015167ffffffffffffffff81111561477d5761477c613225565b5b614789848285016146af565b60408301525092915050565b6000602082840312156147ab576147aa61211b565b5b600082015167ffffffffffffffff8111156147c9576147c8612120565b5b6147d5848285016146dd565b91505092915050565b60006060820190506147f36000830186613719565b81810360208301526148058185613c3a565b905081810360408301526148198184613c3a565b9050949350505050565b600067ffffffffffffffff82111561483e5761483d612530565b5b602082029050602081019050919050565b60006080828403121561486557614864613220565b5b61486f6080612590565b9050600061487f84828501613a7c565b600083015250602061489384828501613a7c565b60208301525060406148a784828501613a50565b60408301525060606148bb84828501613a50565b60608301525092915050565b60006148da6148d584614823565b612590565b905080838252602082019050608084028301858111156148fd576148fc61218d565b5b835b818110156149265780614912888261484f565b8452602084019350506080810190506148ff565b5050509392505050565b600082601f83011261494557614944612183565b5b81516149558482602086016148c7565b91505092915050565b60006080828403121561497457614973613220565b5b61497e6080612590565b9050600082015167ffffffffffffffff81111561499e5761499d613225565b5b6149aa848285016139fd565b600083015250602082015167ffffffffffffffff8111156149ce576149cd613225565b5b6149da848285016139fd565b602083015250604082015167ffffffffffffffff8111156149fe576149fd613225565b5b614a0a848285016139fd565b604083015250606082015167ffffffffffffffff811115614a2e57614a2d613225565b5b614a3a84828501614930565b60608301525092915050565b600060208284031215614a5c57614a5b61211b565b5b600082015167ffffffffffffffff811115614a7a57614a79612120565b5b614a868482850161495e565b91505092915050565b6000608082019050614aa46000830187613719565b8181036020830152614ab68186613c3a565b9050614ac560408301856126e6565b614ad260608301846126e6565b95945050505050565b7f44656c656761746520417070726f7665206661696c6564000000000000000000600082015250565b6000614b116017836138fd565b9150614b1c82614adb565b602082019050919050565b60006020820190508181036000830152614b4081614b04565b9050919050565b600060208284031215614b5d57614b5c61211b565b5b6000614b6b84828501613a7c565b91505092915050565b6000608082019050614b896000830187613719565b8181036020830152614b9b8186613c3a565b90508181036040830152614baf8185613c3a565b9050614bbe60608301846126e6565b95945050505050565b60008083356001602003843603038112614be457614be3613790565b5b83810192508235915060208301925067ffffffffffffffff821115614c0c57614c0b613786565b5b600182023603831315614c2257614c2161378b565b5b509250929050565b6000614c36838561307f565b9350614c438385846125dc565b614c4c83612305565b840190509392505050565b6000614c6660208401846132e2565b905092915050565b6000614c7d602084018461330e565b905092915050565b600060a08301614c986000840184614bc7565b8583036000870152614cab838284614c2a565b92505050614cbc6020840184614c57565b614cc960208601826128c9565b50614cd76040840184614c57565b614ce460408601826128c9565b50614cf26060840184614c6e565b614cff606086018261235b565b50614d0d6080840184614c6e565b614d1a608086018261235b565b508091505092915050565b60006040820190508181036000830152614d3f8185613c3a565b90508181036020830152614d538184614c85565b90509392505050565b600067ffffffffffffffff821115614d7757614d76612530565b5b602082029050602081019050919050565b6000614d9b614d9684614d5c565b612590565b90508083825260208201905060208402830185811115614dbe57614dbd61218d565b5b835b81811015614e0557805167ffffffffffffffff811115614de357614de2612183565b5b808601614df08982613a91565b85526020850194505050602081019050614dc0565b5050509392505050565b600082601f830112614e2457614e23612183565b5b8151614e34848260208601614d88565b91505092915050565b6000614e50614e4b8461322a565b612590565b905082815260208101848484011115614e6c57614e6b61252b565b5b614e778482856122db565b509392505050565b600082601f830112614e9457614e93612183565b5b8151614ea4848260208601614e3d565b91505092915050565b600060408284031215614ec357614ec2613220565b5b614ecd6040612590565b9050600082015167ffffffffffffffff811115614eed57614eec613225565b5b614ef984828501614e7f565b6000830152506020614f0d84828501614591565b60208301525092915050565b60008060408385031215614f3057614f2f61211b565b5b600083015167ffffffffffffffff811115614f4e57614f4d612120565b5b614f5a85828601614e0f565b925050602083015167ffffffffffffffff811115614f7b57614f7a612120565b5b614f8785828601614ead565b9150509250929050565b6000606082019050614fa66000830186613719565b614fb36020830185613719565b8181036040830152614fc58184613c3a565b9050949350505050565b600060208284031215614fe557614fe461211b565b5b6000614ff384828501613a50565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b6000819050602082019050919050565b60006150528383612316565b905092915050565b6000602082019050919050565b60006150728261502b565b61507c8185613728565b93508360208202850161508e85615036565b8060005b858110156150ca57848403895281516150ab8582615046565b94506150b68361505a565b925060208a01995050600181019050615092565b50829750879550505050505092915050565b60006060820190506150f16000830186613719565b6150fe60208301856126e6565b81810360408301526151108184615067565b9050949350505050565b7f6661696c656420746f20617070726f766520756e64656c65676174696f6e206d60008201527f6574686f64000000000000000000000000000000000000000000000000000000602082015250565b60006151766025836138fd565b91506151818261511a565b604082019050919050565b600060208201905081810360008301526151a581615169565b9050919050565b60006040820190506151c16000830186613719565b81810360208301526151d4818486613805565b9050949350505050565b7f4661696c656420746f207265766f6b6520617070726f76616c20666f7220737460008201527f616b696e67206d6574686f647300000000000000000000000000000000000000602082015250565b600061523a602d836138fd565b9150615245826151de565b604082019050919050565b600060208201905081810360008301526152698161522d565b9050919050565b600060a083016000830151848203600086015261528d8282613090565b91505060208301516152a260208601826128c9565b5060408301516152b560408601826128c9565b5060608301516152c8606086018261235b565b5060808301516152db608086018261235b565b508091505092915050565b60006080820190506152fb6000830187613719565b818103602083015261530d8186613c3a565b905081810360408301526153218185613c3a565b905081810360608301526153358184615270565b905095945050505050565b600067ffffffffffffffff82111561535b5761535a612530565b5b602082029050602081019050919050565b60006080828403121561538257615381613220565b5b61538c6080612590565b9050600082015167ffffffffffffffff8111156153ac576153ab613225565b5b6153b8848285016139fd565b600083015250602082015167ffffffffffffffff8111156153dc576153db613225565b5b6153e8848285016139fd565b602083015250604082015167ffffffffffffffff81111561540c5761540b613225565b5b615418848285016139fd565b604083015250606082015167ffffffffffffffff81111561543c5761543b613225565b5b61544884828501614930565b60608301525092915050565b600067ffffffffffffffff82111561546f5761546e612530565b5b602082029050602081019050919050565b600060a0828403121561549657615495613220565b5b6154a06040612590565b905060006154b08482850161484f565b60008301525060806154c484828501613a50565b60208301525092915050565b60006154e36154de84615454565b612590565b90508083825260208201905060a084028301858111156155065761550561218d565b5b835b8181101561552f578061551b8882615480565b84526020840193505060a081019050615508565b5050509392505050565b600082601f83011261554e5761554d612183565b5b815161555e8482602086016154d0565b91505092915050565b60006040828403121561557d5761557c613220565b5b6155876040612590565b9050600082015167ffffffffffffffff8111156155a7576155a6613225565b5b6155b38482850161536c565b600083015250602082015167ffffffffffffffff8111156155d7576155d6613225565b5b6155e384828501615539565b60208301525092915050565b60006156026155fd84615340565b612590565b905080838252602082019050602084028301858111156156255761562461218d565b5b835b8181101561566c57805167ffffffffffffffff81111561564a57615649612183565b5b8086016156578982615567565b85526020850194505050602081019050615627565b5050509392505050565b600082601f83011261568b5761568a612183565b5b815161569b8482602086016155ef565b91505092915050565b600080604083850312156156bb576156ba61211b565b5b600083015167ffffffffffffffff8111156156d9576156d8612120565b5b6156e585828601615676565b925050602083015167ffffffffffffffff81111561570657615705612120565b5b61571285828601614ead565b915050925092905056fe2f636f736d6f732e7374616b696e672e763162657461312e4d7367556e64656c6567617465a264697066735822122025fb99f701996d5dbfba7bb291edb892dd49aca0491bb08fa976e3078bf77f5464736f6c63430008130033", + "bytecode": "0x60806040526040518060200160405280604051806060016040528060238152602001620061c56023913981525060019060016200003e92919062000053565b503480156200004c57600080fd5b50620004a1565b828054828255906000526020600020908101928215620000a0579160200282015b828111156200009f5782518290816200008e9190620003ba565b509160200191906001019062000074565b5b509050620000af9190620000b3565b5090565b5b80821115620000d75760008181620000cd9190620000db565b50600101620000b4565b5090565b508054620000e990620001a9565b6000825580601f10620000fd57506200011e565b601f0160209004906000526020600020908101906200011d919062000121565b5b50565b5b808211156200013c57600081600090555060010162000122565b5090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620001c257607f821691505b602082108103620001d857620001d76200017a565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620002427fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000203565b6200024e868362000203565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200029b620002956200028f8462000266565b62000270565b62000266565b9050919050565b6000819050919050565b620002b7836200027a565b620002cf620002c682620002a2565b84845462000210565b825550505050565b600090565b620002e6620002d7565b620002f3818484620002ac565b505050565b5b818110156200031b576200030f600082620002dc565b600181019050620002f9565b5050565b601f8211156200036a576200033481620001de565b6200033f84620001f3565b810160208510156200034f578190505b620003676200035e85620001f3565b830182620002f8565b50505b505050565b600082821c905092915050565b60006200038f600019846008026200036f565b1980831691505092915050565b6000620003aa83836200037c565b9150826002028217905092915050565b620003c58262000140565b67ffffffffffffffff811115620003e157620003e06200014b565b5b620003ed8254620001a9565b620003fa8282856200031f565b600060209050601f8311600181146200043257600084156200041d578287015190505b6200042985826200039c565b86555062000499565b601f1984166200044286620001de565b60005b828110156200046c5784890151825560018201915060208501945060208101905062000445565b868310156200048c578489015162000488601f8916826200037c565b8355505b6001600288020188555050505b505050505050565b615d1480620004b16000396000f3fe60806040526004361061014b5760003560e01c80637e51b811116100b6578063cf2753cf1161006f578063cf2753cf146104a8578063ec9485df146104e6578063f40a214614610523578063f5714e641461054c578063f700dbd214610568578063f732b065146105915761014b565b80637e51b811146103965780638939e783146103bf5780638edb3f8b146103e85780639eab671114610404578063af9a90b21461042d578063b13d42421461046a5761014b565b806355dc4b221161010857806355dc4b2214610283578063570467ac146102ac5780635e269bfe146102e957806360deaa2a1461031257806361bc221a1461032e57806368ac3df3146103595761014b565b80630a4433e2146101505780631904bb2e1461017957806319b16c4c146101b657806331bcbcb3146101f45780633566cb951461021d578063455b855114610246575b600080fd5b34801561015c57600080fd5b50610177600480360381019061017291906123d4565b6105cf565b005b34801561018557600080fd5b506101a0600480360381019061019b9190612448565b61069e565b6040516101ad91906126bf565b60405180910390f35b3480156101c257600080fd5b506101dd60048036038101906101d89190612811565b61072e565b6040516101eb9291906128e8565b60405180910390f35b34801561020057600080fd5b5061021b60048036038101906102169190612918565b610c2d565b005b34801561022957600080fd5b50610244600480360381019061023f9190612987565b610eba565b005b34801561025257600080fd5b5061026d600480360381019061026891906129e3565b611022565b60405161027a9190612bea565b60405180910390f35b34801561028f57600080fd5b506102aa60048036038101906102a59190612c0c565b6110b5565b005b3480156102b857600080fd5b506102d360048036038101906102ce9190612811565b6114a7565b6040516102e09190612e27565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190612e49565b61153d565b005b61032c60048036038101906103279190612ecc565b6115c8565b005b34801561033a57600080fd5b50610343611716565b6040516103509190612f15565b60405180910390f35b34801561036557600080fd5b50610380600480360381019061037b9190612f73565b61171c565b60405161038d9190613048565b60405180910390f35b3480156103a257600080fd5b506103bd60048036038101906103b89190612918565b6117b2565b005b3480156103cb57600080fd5b506103e660048036038101906103e19190612918565b61183a565b005b61040260048036038101906103fd9190612ecc565b6118c2565b005b34801561041057600080fd5b5061042b60048036038101906104269190613063565b611a57565b005b34801561043957600080fd5b50610454600480360381019061044f9190613138565b611ae2565b6040516104619190613048565b60405180910390f35b34801561047657600080fd5b50610491600480360381019061048c91906131da565b611b72565b60405161049f9291906134a3565b60405180910390f35b3480156104b457600080fd5b506104cf60048036038101906104ca91906129e3565b611c0a565b6040516104dd9291906128e8565b60405180910390f35b3480156104f257600080fd5b5061050d600480360381019061050891906129e3565b611ca2565b60405161051a9190612f15565b60405180910390f35b34801561052f57600080fd5b5061054a600480360381019061054591906134da565b611d2c565b005b61056660048036038101906105619190612ecc565b611f08565b005b34801561057457600080fd5b5061058f600480360381019061058a919061355d565b612062565b005b34801561059d57600080fd5b506105b860048036038101906105b39190613768565b61212e565b6040516105c6929190613a7f565b60405180910390f35b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895868487876040518563ffffffff1660e01b81526004016106129493929190613c18565b6020604051808303816000875af1158015610631573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106559190613c6d565b905080610697576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068e90613d1d565b60405180910390fd5b5050505050565b6106a66121cc565b61080073ffffffffffffffffffffffffffffffffffffffff1663223b3b7a836040518263ffffffff1660e01b81526004016106e19190613d3d565b600060405180830381865afa1580156106fe573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906107279190613f8e565b9050919050565b6000610738612240565b6000610800905060008686604051602401610754929190614010565b6040516020818303038152906040527f241774e6000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000856040516020016107e6919061407c565b60405160208183030381529060405280519060200120905060405160200161080d906140df565b6040516020818303038152906040528051906020012081036108f9576000808473ffffffffffffffffffffffffffffffffffffffff16846040516108519190614130565b600060405180830381855af49150503d806000811461088c576040519150601f19603f3d011682016040523d82523d6000602084013e610891565b606091505b5091509150816108d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cd906141b9565b60405180910390fd5b808060200190518101906108ea9190614245565b80975081985050505050610c22565b604051602001610908906142ed565b6040516020818303038152906040528051906020012081036109f4576000808473ffffffffffffffffffffffffffffffffffffffff168460405161094c9190614130565b600060405180830381855afa9150503d8060008114610987576040519150601f19603f3d011682016040523d82523d6000602084013e61098c565b606091505b5091509150816109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c89061434e565b60405180910390fd5b808060200190518101906109e59190614245565b80975081985050505050610c21565b604051602001610a03906143ba565b604051602081830303815290604052805190602001208103610af1576000808473ffffffffffffffffffffffffffffffffffffffff1684604051610a479190614130565b6000604051808303816000865af19150503d8060008114610a84576040519150601f19603f3d011682016040523d82523d6000602084013e610a89565b606091505b509150915081610ace576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac59061441b565b60405180910390fd5b80806020019051810190610ae29190614245565b80975081985050505050610c20565b604051602001610b0090614487565b604051602081830303815290604052805190602001208103610be45760006040518060400160405280601a81526020017f64656c65676174696f6e28616464726573732c737472696e6729000000000000815250805190602001209050600060a490506060600060208b01516020808d0101516040518681528e6004820152604060248201526033604482015282606482015281608482015260c081878360008e5af281519c5060608201519450610100820160405280610bc057600080fd5b50505050604051806040016040528083815260200182815250975050505050610c1f565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c16906144e8565b60405180910390fd5b5b5b5b505050935093915050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610c6f939291906146b6565b6020604051808303816000875af1158015610c8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb29190613c6d565b905080610cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ceb90614740565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff163384604051602401610d20929190614760565b6040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610daa9190614130565b6000604051808303816000865af19150503d8060008114610de7576040519150601f19603f3d011682016040523d82523d6000602084013e610dec565b606091505b5050905080610e30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e27906147d5565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3386866040518463ffffffff1660e01b8152600401610e6f939291906147f5565b6020604051808303816000875af1158015610e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb29190613c6d565b505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610efc939291906146b6565b6020604051808303816000875af1158015610f1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3f9190613c6d565b905080610f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f789061487f565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3085856040518463ffffffff1660e01b8152600401610fc0939291906147f5565b6020604051808303816000875af1158015610fdf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110039190613c6d565b50600160008082825461101691906148ce565b92505081905550505050565b61102a61225a565b61080073ffffffffffffffffffffffffffffffffffffffff1663a03ffee184846040518363ffffffff1660e01b8152600401611067929190614010565b600060405180830381865afa158015611084573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110ad9190614b32565b905092915050565b6000610800905060008585856040516024016110d3939291906147f5565b6040516020818303038152906040527f3edab33c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600083604051602001611165919061407c565b60405160208183030381529060405280519060200120905060405160200161118c906140df565b6040516020818303038152906040528051906020012081036112595760008373ffffffffffffffffffffffffffffffffffffffff16836040516111cf9190614130565b600060405180830381855af49150503d806000811461120a576040519150601f19603f3d011682016040523d82523d6000602084013e61120f565b606091505b5050905080611253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124a906141b9565b60405180910390fd5b5061149e565b604051602001611268906142ed565b6040516020818303038152906040528051906020012081036113355760008373ffffffffffffffffffffffffffffffffffffffff16836040516112ab9190614130565b600060405180830381855afa9150503d80600081146112e6576040519150601f19603f3d011682016040523d82523d6000602084013e6112eb565b606091505b505090508061132f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113269061434e565b60405180910390fd5b5061149d565b604051602001611344906143ba565b6040516020818303038152906040528051906020012081036114135760008373ffffffffffffffffffffffffffffffffffffffff16836040516113879190614130565b6000604051808303816000865af19150503d80600081146113c4576040519150601f19603f3d011682016040523d82523d6000602084013e6113c9565b606091505b505090508061140d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114049061441b565b60405180910390fd5b5061149c565b60405160200161142290614487565b6040516020818303038152906040528051906020012081036114605760208201825160008082846000895af28061145857600080fd5b50505061149b565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611492906144e8565b60405180910390fd5b5b5b5b50505050505050565b6114af61227b565b61080073ffffffffffffffffffffffffffffffffffffffff16637d9f939c8585856040518463ffffffff1660e01b81526004016114ee93929190614b7b565b600060405180830381865afa15801561150b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906115349190614de3565b90509392505050565b61080073ffffffffffffffffffffffffffffffffffffffff166312d58dfe858585856040518563ffffffff1660e01b815260040161157e9493929190614e2c565b6020604051808303816000875af115801561159d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c19190613c6d565b5050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895303460016040518463ffffffff1660e01b815260040161160a939291906146b6565b6020604051808303816000875af1158015611629573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164d9190613c6d565b90508061168f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168690614ec4565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b81526004016116ce939291906147f5565b6020604051808303816000875af11580156116ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117119190613c6d565b505050565b60005481565b600061080073ffffffffffffffffffffffffffffffffffffffff1663f7cd55168888888888886040518763ffffffff1660e01b815260040161176396959493929190615019565b6020604051808303816000875af1158015611782573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a69190613c6d565b90509695505050505050565b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c8484846040518463ffffffff1660e01b81526004016117f1939291906147f5565b6020604051808303816000875af1158015611810573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118349190615089565b50505050565b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb8484846040518463ffffffff1660e01b8152600401611879939291906147f5565b6020604051808303816000875af1158015611898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bc9190613c6d565b50505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b8152600401611904939291906146b6565b6020604051808303816000875af1158015611923573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119479190613c6d565b905080611989576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198090614ec4565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b81526004016119c8939291906147f5565b6020604051808303816000875af11580156119e7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0b9190613c6d565b503373ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611a52573d6000803e3d6000fd5b505050565b61080073ffffffffffffffffffffffffffffffffffffffff166354b826f5858585856040518563ffffffff1660e01b8152600401611a9894939291906150b6565b6020604051808303816000875af1158015611ab7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611adb9190615089565b5050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663a50f05ac868686866040518563ffffffff1660e01b8152600401611b259493929190615118565b6020604051808303816000875af1158015611b44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b689190613c6d565b9050949350505050565b6060611b7c6122a3565b61080073ffffffffffffffffffffffffffffffffffffffff1663186b216785856040518363ffffffff1660e01b8152600401611bb99291906152c2565b600060405180830381865afa158015611bd6573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611bff91906154b6565b915091509250929050565b6000611c14612240565b61080073ffffffffffffffffffffffffffffffffffffffff1663241774e685856040518363ffffffff1660e01b8152600401611c51929190614010565b600060405180830381865afa158015611c6e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611c979190614245565b915091509250929050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663fc08930c8433856040518463ffffffff1660e01b8152600401611ce39392919061552e565b602060405180830381865afa158015611d00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d24919061556c565b905092915050565b6000600167ffffffffffffffff811115611d4957611d486126e6565b5b604051908082528060200260200182016040528015611d7c57816020015b6060815260200190600190039081611d675790505b509050604051806060016040528060258152602001615cba6025913981600081518110611dac57611dab615599565b5b6020026020010181905250600061080073ffffffffffffffffffffffffffffffffffffffff1663b60398958787856040518463ffffffff1660e01b8152600401611df893929190615679565b6020604051808303816000875af1158015611e17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3b9190613c6d565b905080611e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7490615729565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c3285876040518463ffffffff1660e01b8152600401611ebc939291906147f5565b6020604051808303816000875af1158015611edb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eff9190615089565b50505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b8152600401611f4a939291906146b6565b6020604051808303816000875af1158015611f69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8d9190613c6d565b905080611fcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc690614ec4565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084600134611ffc91906148ce565b6040518463ffffffff1660e01b815260040161201a939291906147f5565b6020604051808303816000875af1158015612039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205d9190613c6d565b505050565b600061080073ffffffffffffffffffffffffffffffffffffffff166361dc5c3b8585856040518463ffffffff1660e01b81526004016120a393929190615749565b6020604051808303816000875af11580156120c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e69190613c6d565b905080612128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211f906157ed565b60405180910390fd5b50505050565b60606121386122a3565b61080073ffffffffffffffffffffffffffffffffffffffff166310a2851c878787876040518563ffffffff1660e01b81526004016121799493929190615883565b600060405180830381865afa158015612196573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906121bf9190615c41565b9150915094509492505050565b60405180610160016040528060608152602001606081526020016000151581526020016000600381111561220357612202612520565b5b8152602001600081526020016000815260200160608152602001600060070b8152602001600060070b815260200160008152602001600081525090565b604051806040016040528060608152602001600081525090565b60405180606001604052806060815260200160608152602001606081525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612306826122db565b9050919050565b612316816122fb565b811461232157600080fd5b50565b6000813590506123338161230d565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261235e5761235d612339565b5b8235905067ffffffffffffffff81111561237b5761237a61233e565b5b60208301915083602082028301111561239757612396612343565b5b9250929050565b6000819050919050565b6123b18161239e565b81146123bc57600080fd5b50565b6000813590506123ce816123a8565b92915050565b600080600080606085870312156123ee576123ed6122d1565b5b60006123fc87828801612324565b945050602085013567ffffffffffffffff81111561241d5761241c6122d6565b5b61242987828801612348565b9350935050604061243c878288016123bf565b91505092959194509250565b60006020828403121561245e5761245d6122d1565b5b600061246c84828501612324565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156124af578082015181840152602081019050612494565b60008484015250505050565b6000601f19601f8301169050919050565b60006124d782612475565b6124e18185612480565b93506124f1818560208601612491565b6124fa816124bb565b840191505092915050565b60008115159050919050565b61251a81612505565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106125605761255f612520565b5b50565b60008190506125718261254f565b919050565b600061258182612563565b9050919050565b61259181612576565b82525050565b6125a08161239e565b82525050565b60008160070b9050919050565b6125bc816125a6565b82525050565b60006101608301600083015184820360008601526125e082826124cc565b915050602083015184820360208601526125fa82826124cc565b915050604083015161260f6040860182612511565b5060608301516126226060860182612588565b5060808301516126356080860182612597565b5060a083015161264860a0860182612597565b5060c083015184820360c086015261266082826124cc565b91505060e083015161267560e08601826125b3565b5061010083015161268a6101008601826125b3565b5061012083015161269f610120860182612597565b506101408301516126b4610140860182612597565b508091505092915050565b600060208201905081810360008301526126d981846125c2565b905092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61271e826124bb565b810181811067ffffffffffffffff8211171561273d5761273c6126e6565b5b80604052505050565b60006127506122c7565b905061275c8282612715565b919050565b600067ffffffffffffffff82111561277c5761277b6126e6565b5b612785826124bb565b9050602081019050919050565b82818337600083830152505050565b60006127b46127af84612761565b612746565b9050828152602081018484840111156127d0576127cf6126e1565b5b6127db848285612792565b509392505050565b600082601f8301126127f8576127f7612339565b5b81356128088482602086016127a1565b91505092915050565b60008060006060848603121561282a576128296122d1565b5b600061283886828701612324565b935050602084013567ffffffffffffffff811115612859576128586122d6565b5b612865868287016127e3565b925050604084013567ffffffffffffffff811115612886576128856122d6565b5b612892868287016127e3565b9150509250925092565b6128a58161239e565b82525050565b600060408301600083015184820360008601526128c882826124cc565b91505060208301516128dd6020860182612597565b508091505092915050565b60006040820190506128fd600083018561289c565b818103602083015261290f81846128ab565b90509392505050565b600080600060608486031215612931576129306122d1565b5b600061293f86828701612324565b935050602084013567ffffffffffffffff8111156129605761295f6122d6565b5b61296c868287016127e3565b925050604061297d868287016123bf565b9150509250925092565b6000806040838503121561299e5761299d6122d1565b5b600083013567ffffffffffffffff8111156129bc576129bb6122d6565b5b6129c8858286016127e3565b92505060206129d9858286016123bf565b9150509250929050565b600080604083850312156129fa576129f96122d1565b5b6000612a0885828601612324565b925050602083013567ffffffffffffffff811115612a2957612a286122d6565b5b612a35858286016127e3565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600067ffffffffffffffff82169050919050565b612a8881612a6b565b82525050565b60c082016000820151612aa460008501826125b3565b506020820151612ab760208501826125b3565b506040820151612aca6040850182612597565b506060820151612add6060850182612597565b506080820151612af06080850182612a7f565b5060a0820151612b0360a08501826125b3565b50505050565b6000612b158383612a8e565b60c08301905092915050565b6000602082019050919050565b6000612b3982612a3f565b612b438185612a4a565b9350612b4e83612a5b565b8060005b83811015612b7f578151612b668882612b09565b9750612b7183612b21565b925050600181019050612b52565b5085935050505092915050565b60006060830160008301518482036000860152612ba982826124cc565b91505060208301518482036020860152612bc382826124cc565b91505060408301518482036040860152612bdd8282612b2e565b9150508091505092915050565b60006020820190508181036000830152612c048184612b8c565b905092915050565b60008060008060808587031215612c2657612c256122d1565b5b6000612c3487828801612324565b945050602085013567ffffffffffffffff811115612c5557612c546122d6565b5b612c61878288016127e3565b9350506040612c72878288016123bf565b925050606085013567ffffffffffffffff811115612c9357612c926122d6565b5b612c9f878288016127e3565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b608082016000820151612ced60008501826125b3565b506020820151612d0060208501826125b3565b506040820151612d136040850182612597565b506060820151612d266060850182612597565b50505050565b6000612d388383612cd7565b60808301905092915050565b6000602082019050919050565b6000612d5c82612cab565b612d668185612cb6565b9350612d7183612cc7565b8060005b83811015612da2578151612d898882612d2c565b9750612d9483612d44565b925050600181019050612d75565b5085935050505092915050565b60006080830160008301518482036000860152612dcc82826124cc565b91505060208301518482036020860152612de682826124cc565b91505060408301518482036040860152612e0082826124cc565b91505060608301518482036060860152612e1a8282612d51565b9150508091505092915050565b60006020820190508181036000830152612e418184612daf565b905092915050565b60008060008060808587031215612e6357612e626122d1565b5b6000612e7187828801612324565b945050602085013567ffffffffffffffff811115612e9257612e916122d6565b5b612e9e878288016127e3565b9350506040612eaf878288016123bf565b9250506060612ec0878288016123bf565b91505092959194509250565b600060208284031215612ee257612ee16122d1565b5b600082013567ffffffffffffffff811115612f0057612eff6122d6565b5b612f0c848285016127e3565b91505092915050565b6000602082019050612f2a600083018461289c565b92915050565b600080fd5b600060a08284031215612f4b57612f4a612f30565b5b81905092915050565b600060608284031215612f6a57612f69612f30565b5b81905092915050565b6000806000806000806101008789031215612f9157612f906122d1565b5b600087013567ffffffffffffffff811115612faf57612fae6122d6565b5b612fbb89828a01612f35565b9650506020612fcc89828a01612f54565b9550506080612fdd89828a016123bf565b94505060a0612fee89828a01612324565b93505060c087013567ffffffffffffffff81111561300f5761300e6122d6565b5b61301b89828a016127e3565b92505060e061302c89828a016123bf565b9150509295509295509295565b61304281612505565b82525050565b600060208201905061305d6000830184613039565b92915050565b6000806000806080858703121561307d5761307c6122d1565b5b600061308b87828801612324565b945050602085013567ffffffffffffffff8111156130ac576130ab6122d6565b5b6130b8878288016127e3565b935050604085013567ffffffffffffffff8111156130d9576130d86122d6565b5b6130e5878288016127e3565b92505060606130f6878288016123bf565b91505092959194509250565b6000819050919050565b61311581613102565b811461312057600080fd5b50565b6000813590506131328161310c565b92915050565b60008060008060808587031215613152576131516122d1565b5b600085013567ffffffffffffffff8111156131705761316f6122d6565b5b61317c87828801612f35565b945050602061318d87828801612324565b935050604061319e87828801613123565b92505060606131af87828801613123565b91505092959194509250565b600060a082840312156131d1576131d0612f30565b5b81905092915050565b600080604083850312156131f1576131f06122d1565b5b600083013567ffffffffffffffff81111561320f5761320e6122d6565b5b61321b858286016127e3565b925050602083013567ffffffffffffffff81111561323c5761323b6122d6565b5b613248858286016131bb565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061016083016000830151848203600086015261329c82826124cc565b915050602083015184820360208601526132b682826124cc565b91505060408301516132cb6040860182612511565b5060608301516132de6060860182612588565b5060808301516132f16080860182612597565b5060a083015161330460a0860182612597565b5060c083015184820360c086015261331c82826124cc565b91505060e083015161333160e08601826125b3565b506101008301516133466101008601826125b3565b5061012083015161335b610120860182612597565b50610140830151613370610140860182612597565b508091505092915050565b6000613387838361327e565b905092915050565b6000602082019050919050565b60006133a782613252565b6133b1818561325d565b9350836020820285016133c38561326e565b8060005b858110156133ff57848403895281516133e0858261337b565b94506133eb8361338f565b925060208a019950506001810190506133c7565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b600061343882613411565b613442818561341c565b9350613452818560208601612491565b61345b816124bb565b840191505092915050565b60006040830160008301518482036000860152613483828261342d565b91505060208301516134986020860182612a7f565b508091505092915050565b600060408201905081810360008301526134bd818561339c565b905081810360208301526134d18184613466565b90509392505050565b600080600080608085870312156134f4576134f36122d1565b5b600061350287828801612324565b9450506020613513878288016123bf565b9350506040613524878288016123bf565b925050606085013567ffffffffffffffff811115613545576135446122d6565b5b613551878288016127e3565b91505092959194509250565b600080600060408486031215613576576135756122d1565b5b600061358486828701612324565b935050602084013567ffffffffffffffff8111156135a5576135a46122d6565b5b6135b186828701612348565b92509250509250925092565b600080fd5b600080fd5b600067ffffffffffffffff8211156135e2576135e16126e6565b5b6135eb826124bb565b9050602081019050919050565b600061360b613606846135c7565b612746565b905082815260208101848484011115613627576136266126e1565b5b613632848285612792565b509392505050565b600082601f83011261364f5761364e612339565b5b813561365f8482602086016135f8565b91505092915050565b61367181612a6b565b811461367c57600080fd5b50565b60008135905061368e81613668565b92915050565b61369d81612505565b81146136a857600080fd5b50565b6000813590506136ba81613694565b92915050565b600060a082840312156136d6576136d56135bd565b5b6136e060a0612746565b9050600082013567ffffffffffffffff811115613700576136ff6135c2565b5b61370c8482850161363a565b60008301525060206137208482850161367f565b60208301525060406137348482850161367f565b6040830152506060613748848285016136ab565b606083015250608061375c848285016136ab565b60808301525092915050565b60008060008060808587031215613782576137816122d1565b5b600061379087828801612324565b945050602085013567ffffffffffffffff8111156137b1576137b06122d6565b5b6137bd878288016127e3565b935050604085013567ffffffffffffffff8111156137de576137dd6122d6565b5b6137ea878288016127e3565b925050606085013567ffffffffffffffff81111561380b5761380a6122d6565b5b613817878288016136c0565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000608083016000830151848203600086015261386c82826124cc565b9150506020830151848203602086015261388682826124cc565b915050604083015184820360408601526138a082826124cc565b915050606083015184820360608601526138ba8282612d51565b9150508091505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60a0820160008201516139096000850182612cd7565b50602082015161391c6080850182612597565b50505050565b600061392e83836138f3565b60a08301905092915050565b6000602082019050919050565b6000613952826138c7565b61395c81856138d2565b9350613967836138e3565b8060005b8381101561399857815161397f8882613922565b975061398a8361393a565b92505060018101905061396b565b5085935050505092915050565b600060408301600083015184820360008601526139c2828261384f565b915050602083015184820360208601526139dc8282613947565b9150508091505092915050565b60006139f583836139a5565b905092915050565b6000602082019050919050565b6000613a1582613823565b613a1f818561382e565b935083602082028501613a318561383f565b8060005b85811015613a6d5784840389528151613a4e85826139e9565b9450613a59836139fd565b925060208a01995050600181019050613a35565b50829750879550505050505092915050565b60006040820190508181036000830152613a998185613a0a565b90508181036020830152613aad8184613466565b90509392505050565b613abf816122fb565b82525050565b600082825260208201905092915050565b6000819050919050565b6000613aec8385612480565b9350613af9838584612792565b613b02836124bb565b840190509392505050565b6000613b1a848484613ae0565b90509392505050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112613b4f57613b4e613b2d565b5b83810192508235915060208301925067ffffffffffffffff821115613b7757613b76613b23565b5b600182023603831315613b8d57613b8c613b28565b5b509250929050565b6000602082019050919050565b6000613bae8385613ac5565b935083602084028501613bc084613ad6565b8060005b87811015613c06578484038952613bdb8284613b32565b613be6868284613b0d565b9550613bf184613b95565b935060208b019a505050600181019050613bc4565b50829750879450505050509392505050565b6000606082019050613c2d6000830187613ab6565b613c3a602083018661289c565b8181036040830152613c4d818486613ba2565b905095945050505050565b600081519050613c6781613694565b92915050565b600060208284031215613c8357613c826122d1565b5b6000613c9184828501613c58565b91505092915050565b600082825260208201905092915050565b7f4661696c656420746f20617070726f7665207374616b696e67206d6574686f6460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d07602183613c9a565b9150613d1282613cab565b604082019050919050565b60006020820190508181036000830152613d3681613cfa565b9050919050565b6000602082019050613d526000830184613ab6565b92915050565b6000613d6b613d6684612761565b612746565b905082815260208101848484011115613d8757613d866126e1565b5b613d92848285612491565b509392505050565b600082601f830112613daf57613dae612339565b5b8151613dbf848260208601613d58565b91505092915050565b60048110613dd557600080fd5b50565b600081519050613de781613dc8565b92915050565b600081519050613dfc816123a8565b92915050565b613e0b816125a6565b8114613e1657600080fd5b50565b600081519050613e2881613e02565b92915050565b60006101608284031215613e4557613e446135bd565b5b613e50610160612746565b9050600082015167ffffffffffffffff811115613e7057613e6f6135c2565b5b613e7c84828501613d9a565b600083015250602082015167ffffffffffffffff811115613ea057613e9f6135c2565b5b613eac84828501613d9a565b6020830152506040613ec084828501613c58565b6040830152506060613ed484828501613dd8565b6060830152506080613ee884828501613ded565b60808301525060a0613efc84828501613ded565b60a08301525060c082015167ffffffffffffffff811115613f2057613f1f6135c2565b5b613f2c84828501613d9a565b60c08301525060e0613f4084828501613e19565b60e083015250610100613f5584828501613e19565b61010083015250610120613f6b84828501613ded565b61012083015250610140613f8184828501613ded565b6101408301525092915050565b600060208284031215613fa457613fa36122d1565b5b600082015167ffffffffffffffff811115613fc257613fc16122d6565b5b613fce84828501613e2e565b91505092915050565b6000613fe282612475565b613fec8185613c9a565b9350613ffc818560208601612491565b614005816124bb565b840191505092915050565b60006040820190506140256000830185613ab6565b81810360208301526140378184613fd7565b90509392505050565b600081905092915050565b600061405682612475565b6140608185614040565b9350614070818560208601612491565b80840191505092915050565b6000614088828461404b565b915081905092915050565b7f64656c656761746563616c6c0000000000000000000000000000000000000000600082015250565b60006140c9600c83614040565b91506140d482614093565b600c82019050919050565b60006140ea826140bc565b9150819050919050565b600081905092915050565b600061410a82613411565b61411481856140f4565b9350614124818560208601612491565b80840191505092915050565b600061413c82846140ff565b915081905092915050565b7f6661696c65642064656c656761746563616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b60006141a3602183613c9a565b91506141ae82614147565b604082019050919050565b600060208201905081810360008301526141d281614196565b9050919050565b6000604082840312156141ef576141ee6135bd565b5b6141f96040612746565b9050600082015167ffffffffffffffff811115614219576142186135c2565b5b61422584828501613d9a565b600083015250602061423984828501613ded565b60208301525092915050565b6000806040838503121561425c5761425b6122d1565b5b600061426a85828601613ded565b925050602083015167ffffffffffffffff81111561428b5761428a6122d6565b5b614297858286016141d9565b9150509250929050565b7f73746174696363616c6c00000000000000000000000000000000000000000000600082015250565b60006142d7600a83614040565b91506142e2826142a1565b600a82019050919050565b60006142f8826142ca565b9150819050919050565b7f6661696c65642073746174696363616c6c20746f20707265636f6d70696c6500600082015250565b6000614338601f83613c9a565b915061434382614302565b602082019050919050565b600060208201905081810360008301526143678161432b565b9050919050565b7f63616c6c00000000000000000000000000000000000000000000000000000000600082015250565b60006143a4600483614040565b91506143af8261436e565b600482019050919050565b60006143c582614397565b9150819050919050565b7f6661696c65642063616c6c20746f20707265636f6d70696c6500000000000000600082015250565b6000614405601983613c9a565b9150614410826143cf565b602082019050919050565b60006020820190508181036000830152614434816143f8565b9050919050565b7f63616c6c636f6465000000000000000000000000000000000000000000000000600082015250565b6000614471600883614040565b915061447c8261443b565b600882019050919050565b600061449282614464565b9150819050919050565b7f696e76616c69642063616c6c7479706500000000000000000000000000000000600082015250565b60006144d2601083613c9a565b91506144dd8261449c565b602082019050919050565b60006020820190508181036000830152614501816144c5565b9050919050565b600081549050919050565b60008190508160005260206000209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061456f57607f821691505b60208210810361458257614581614528565b5b50919050565b60008190508160005260206000209050919050565b600081546145aa81614557565b6145b48186612480565b945060018216600081146145cf57600181146145e557614618565b60ff198316865281151560200286019350614618565b6145ee85614588565b60005b83811015614610578154818901526001820191506020810190506145f1565b808801955050505b50505092915050565b600061462d838361459d565b905092915050565b6000600182019050919050565b600061464d82614508565b6146578185613ac5565b93508360208202850161466985614513565b8060005b858110156146a4578484038952816146858582614621565b945061469083614635565b925060208a0199505060018101905061466d565b50829750879550505050505092915050565b60006060820190506146cb6000830186613ab6565b6146d8602083018561289c565b81810360408301526146ea8184614642565b9050949350505050565b7f64656c65676174696f6e20617070726f76616c206661696c6564000000000000600082015250565b600061472a601a83613c9a565b9150614735826146f4565b602082019050919050565b600060208201905081810360008301526147598161471d565b9050919050565b60006040820190506147756000830185613ab6565b614782602083018461289c565b9392505050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b60006147bf600f83613c9a565b91506147ca82614789565b602082019050919050565b600060208201905081810360008301526147ee816147b2565b9050919050565b600060608201905061480a6000830186613ab6565b818103602083015261481c8185613fd7565b905061482b604083018461289c565b949350505050565b7f5374616b696e6720417070726f7665206661696c656400000000000000000000600082015250565b6000614869601683613c9a565b915061487482614833565b602082019050919050565b600060208201905081810360008301526148988161485c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006148d98261239e565b91506148e48361239e565b92508282019050808211156148fc576148fb61489f565b5b92915050565b600067ffffffffffffffff82111561491d5761491c6126e6565b5b602082029050602081019050919050565b60008151905061493d81613668565b92915050565b600060c08284031215614959576149586135bd565b5b61496360c0612746565b9050600061497384828501613e19565b600083015250602061498784828501613e19565b602083015250604061499b84828501613ded565b60408301525060606149af84828501613ded565b60608301525060806149c38482850161492e565b60808301525060a06149d784828501613e19565b60a08301525092915050565b60006149f66149f184614902565b612746565b90508083825260208201905060c08402830185811115614a1957614a18612343565b5b835b81811015614a425780614a2e8882614943565b84526020840193505060c081019050614a1b565b5050509392505050565b600082601f830112614a6157614a60612339565b5b8151614a718482602086016149e3565b91505092915050565b600060608284031215614a9057614a8f6135bd565b5b614a9a6060612746565b9050600082015167ffffffffffffffff811115614aba57614ab96135c2565b5b614ac684828501613d9a565b600083015250602082015167ffffffffffffffff811115614aea57614ae96135c2565b5b614af684828501613d9a565b602083015250604082015167ffffffffffffffff811115614b1a57614b196135c2565b5b614b2684828501614a4c565b60408301525092915050565b600060208284031215614b4857614b476122d1565b5b600082015167ffffffffffffffff811115614b6657614b656122d6565b5b614b7284828501614a7a565b91505092915050565b6000606082019050614b906000830186613ab6565b8181036020830152614ba28185613fd7565b90508181036040830152614bb68184613fd7565b9050949350505050565b600067ffffffffffffffff821115614bdb57614bda6126e6565b5b602082029050602081019050919050565b600060808284031215614c0257614c016135bd565b5b614c0c6080612746565b90506000614c1c84828501613e19565b6000830152506020614c3084828501613e19565b6020830152506040614c4484828501613ded565b6040830152506060614c5884828501613ded565b60608301525092915050565b6000614c77614c7284614bc0565b612746565b90508083825260208201905060808402830185811115614c9a57614c99612343565b5b835b81811015614cc35780614caf8882614bec565b845260208401935050608081019050614c9c565b5050509392505050565b600082601f830112614ce257614ce1612339565b5b8151614cf2848260208601614c64565b91505092915050565b600060808284031215614d1157614d106135bd565b5b614d1b6080612746565b9050600082015167ffffffffffffffff811115614d3b57614d3a6135c2565b5b614d4784828501613d9a565b600083015250602082015167ffffffffffffffff811115614d6b57614d6a6135c2565b5b614d7784828501613d9a565b602083015250604082015167ffffffffffffffff811115614d9b57614d9a6135c2565b5b614da784828501613d9a565b604083015250606082015167ffffffffffffffff811115614dcb57614dca6135c2565b5b614dd784828501614ccd565b60608301525092915050565b600060208284031215614df957614df86122d1565b5b600082015167ffffffffffffffff811115614e1757614e166122d6565b5b614e2384828501614cfb565b91505092915050565b6000608082019050614e416000830187613ab6565b8181036020830152614e538186613fd7565b9050614e62604083018561289c565b614e6f606083018461289c565b95945050505050565b7f44656c656761746520417070726f7665206661696c6564000000000000000000600082015250565b6000614eae601783613c9a565b9150614eb982614e78565b602082019050919050565b60006020820190508181036000830152614edd81614ea1565b9050919050565b600060a08301614ef76000840184613b32565b8583036000870152614f0a838284613ae0565b92505050614f1b6020840184613b32565b8583036020870152614f2e838284613ae0565b92505050614f3f6040840184613b32565b8583036040870152614f52838284613ae0565b92505050614f636060840184613b32565b8583036060870152614f76838284613ae0565b92505050614f876080840184613b32565b8583036080870152614f9a838284613ae0565b925050508091505092915050565b6000614fb760208401846123bf565b905092915050565b60608201614fd06000830183614fa8565b614fdd6000850182612597565b50614feb6020830183614fa8565b614ff86020850182612597565b506150066040830183614fa8565b6150136040850182612597565b50505050565b60006101008201905081810360008301526150348189614ee4565b90506150436020830188614fbf565b615050608083018761289c565b61505d60a0830186613ab6565b81810360c083015261506f8185613fd7565b905061507e60e083018461289c565b979650505050505050565b60006020828403121561509f5761509e6122d1565b5b60006150ad84828501613e19565b91505092915050565b60006080820190506150cb6000830187613ab6565b81810360208301526150dd8186613fd7565b905081810360408301526150f18185613fd7565b9050615100606083018461289c565b95945050505050565b61511281613102565b82525050565b600060808201905081810360008301526151328187614ee4565b90506151416020830186613ab6565b61514e6040830185615109565b61515b6060830184615109565b95945050505050565b6000808335600160200384360303811261518157615180613b2d565b5b83810192508235915060208301925067ffffffffffffffff8211156151a9576151a8613b23565b5b6001820236038313156151bf576151be613b28565b5b509250929050565b60006151d3838561341c565b93506151e0838584612792565b6151e9836124bb565b840190509392505050565b6000615203602084018461367f565b905092915050565b600061521a60208401846136ab565b905092915050565b600060a083016152356000840184615164565b85830360008701526152488382846151c7565b9250505061525960208401846151f4565b6152666020860182612a7f565b5061527460408401846151f4565b6152816040860182612a7f565b5061528f606084018461520b565b61529c6060860182612511565b506152aa608084018461520b565b6152b76080860182612511565b508091505092915050565b600060408201905081810360008301526152dc8185613fd7565b905081810360208301526152f08184615222565b90509392505050565b600067ffffffffffffffff821115615314576153136126e6565b5b602082029050602081019050919050565b6000615338615333846152f9565b612746565b9050808382526020820190506020840283018581111561535b5761535a612343565b5b835b818110156153a257805167ffffffffffffffff8111156153805761537f612339565b5b80860161538d8982613e2e565b8552602085019450505060208101905061535d565b5050509392505050565b600082601f8301126153c1576153c0612339565b5b81516153d1848260208601615325565b91505092915050565b60006153ed6153e8846135c7565b612746565b905082815260208101848484011115615409576154086126e1565b5b615414848285612491565b509392505050565b600082601f83011261543157615430612339565b5b81516154418482602086016153da565b91505092915050565b6000604082840312156154605761545f6135bd565b5b61546a6040612746565b9050600082015167ffffffffffffffff81111561548a576154896135c2565b5b6154968482850161541c565b60008301525060206154aa8482850161492e565b60208301525092915050565b600080604083850312156154cd576154cc6122d1565b5b600083015167ffffffffffffffff8111156154eb576154ea6122d6565b5b6154f7858286016153ac565b925050602083015167ffffffffffffffff811115615518576155176122d6565b5b6155248582860161544a565b9150509250929050565b60006060820190506155436000830186613ab6565b6155506020830185613ab6565b81810360408301526155628184613fd7565b9050949350505050565b600060208284031215615582576155816122d1565b5b600061559084828501613ded565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b6000819050602082019050919050565b60006155ef83836124cc565b905092915050565b6000602082019050919050565b600061560f826155c8565b6156198185613ac5565b93508360208202850161562b856155d3565b8060005b85811015615667578484038952815161564885826155e3565b9450615653836155f7565b925060208a0199505060018101905061562f565b50829750879550505050505092915050565b600060608201905061568e6000830186613ab6565b61569b602083018561289c565b81810360408301526156ad8184615604565b9050949350505050565b7f6661696c656420746f20617070726f766520756e64656c65676174696f6e206d60008201527f6574686f64000000000000000000000000000000000000000000000000000000602082015250565b6000615713602583613c9a565b915061571e826156b7565b604082019050919050565b6000602082019050818103600083015261574281615706565b9050919050565b600060408201905061575e6000830186613ab6565b8181036020830152615771818486613ba2565b9050949350505050565b7f4661696c656420746f207265766f6b6520617070726f76616c20666f7220737460008201527f616b696e67206d6574686f647300000000000000000000000000000000000000602082015250565b60006157d7602d83613c9a565b91506157e28261577b565b604082019050919050565b60006020820190508181036000830152615806816157ca565b9050919050565b600060a083016000830151848203600086015261582a828261342d565b915050602083015161583f6020860182612a7f565b5060408301516158526040860182612a7f565b5060608301516158656060860182612511565b5060808301516158786080860182612511565b508091505092915050565b60006080820190506158986000830187613ab6565b81810360208301526158aa8186613fd7565b905081810360408301526158be8185613fd7565b905081810360608301526158d2818461580d565b905095945050505050565b600067ffffffffffffffff8211156158f8576158f76126e6565b5b602082029050602081019050919050565b60006080828403121561591f5761591e6135bd565b5b6159296080612746565b9050600082015167ffffffffffffffff811115615949576159486135c2565b5b61595584828501613d9a565b600083015250602082015167ffffffffffffffff811115615979576159786135c2565b5b61598584828501613d9a565b602083015250604082015167ffffffffffffffff8111156159a9576159a86135c2565b5b6159b584828501613d9a565b604083015250606082015167ffffffffffffffff8111156159d9576159d86135c2565b5b6159e584828501614ccd565b60608301525092915050565b600067ffffffffffffffff821115615a0c57615a0b6126e6565b5b602082029050602081019050919050565b600060a08284031215615a3357615a326135bd565b5b615a3d6040612746565b90506000615a4d84828501614bec565b6000830152506080615a6184828501613ded565b60208301525092915050565b6000615a80615a7b846159f1565b612746565b90508083825260208201905060a08402830185811115615aa357615aa2612343565b5b835b81811015615acc5780615ab88882615a1d565b84526020840193505060a081019050615aa5565b5050509392505050565b600082601f830112615aeb57615aea612339565b5b8151615afb848260208601615a6d565b91505092915050565b600060408284031215615b1a57615b196135bd565b5b615b246040612746565b9050600082015167ffffffffffffffff811115615b4457615b436135c2565b5b615b5084828501615909565b600083015250602082015167ffffffffffffffff811115615b7457615b736135c2565b5b615b8084828501615ad6565b60208301525092915050565b6000615b9f615b9a846158dd565b612746565b90508083825260208201905060208402830185811115615bc257615bc1612343565b5b835b81811015615c0957805167ffffffffffffffff811115615be757615be6612339565b5b808601615bf48982615b04565b85526020850194505050602081019050615bc4565b5050509392505050565b600082601f830112615c2857615c27612339565b5b8151615c38848260208601615b8c565b91505092915050565b60008060408385031215615c5857615c576122d1565b5b600083015167ffffffffffffffff811115615c7657615c756122d6565b5b615c8285828601615c13565b925050602083015167ffffffffffffffff811115615ca357615ca26122d6565b5b615caf8582860161544a565b915050925092905056fe2f636f736d6f732e7374616b696e672e763162657461312e4d7367556e64656c6567617465a2646970667358221220b1862923f78a295a0f30b8d05151c1dc82fb92c0b2dc98be2f6486b611ef4ede64736f6c634300081200332f636f736d6f732e7374616b696e672e763162657461312e4d736744656c6567617465", + "deployedBytecode": "0x60806040526004361061014b5760003560e01c80637e51b811116100b6578063cf2753cf1161006f578063cf2753cf146104a8578063ec9485df146104e6578063f40a214614610523578063f5714e641461054c578063f700dbd214610568578063f732b065146105915761014b565b80637e51b811146103965780638939e783146103bf5780638edb3f8b146103e85780639eab671114610404578063af9a90b21461042d578063b13d42421461046a5761014b565b806355dc4b221161010857806355dc4b2214610283578063570467ac146102ac5780635e269bfe146102e957806360deaa2a1461031257806361bc221a1461032e57806368ac3df3146103595761014b565b80630a4433e2146101505780631904bb2e1461017957806319b16c4c146101b657806331bcbcb3146101f45780633566cb951461021d578063455b855114610246575b600080fd5b34801561015c57600080fd5b50610177600480360381019061017291906123d4565b6105cf565b005b34801561018557600080fd5b506101a0600480360381019061019b9190612448565b61069e565b6040516101ad91906126bf565b60405180910390f35b3480156101c257600080fd5b506101dd60048036038101906101d89190612811565b61072e565b6040516101eb9291906128e8565b60405180910390f35b34801561020057600080fd5b5061021b60048036038101906102169190612918565b610c2d565b005b34801561022957600080fd5b50610244600480360381019061023f9190612987565b610eba565b005b34801561025257600080fd5b5061026d600480360381019061026891906129e3565b611022565b60405161027a9190612bea565b60405180910390f35b34801561028f57600080fd5b506102aa60048036038101906102a59190612c0c565b6110b5565b005b3480156102b857600080fd5b506102d360048036038101906102ce9190612811565b6114a7565b6040516102e09190612e27565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190612e49565b61153d565b005b61032c60048036038101906103279190612ecc565b6115c8565b005b34801561033a57600080fd5b50610343611716565b6040516103509190612f15565b60405180910390f35b34801561036557600080fd5b50610380600480360381019061037b9190612f73565b61171c565b60405161038d9190613048565b60405180910390f35b3480156103a257600080fd5b506103bd60048036038101906103b89190612918565b6117b2565b005b3480156103cb57600080fd5b506103e660048036038101906103e19190612918565b61183a565b005b61040260048036038101906103fd9190612ecc565b6118c2565b005b34801561041057600080fd5b5061042b60048036038101906104269190613063565b611a57565b005b34801561043957600080fd5b50610454600480360381019061044f9190613138565b611ae2565b6040516104619190613048565b60405180910390f35b34801561047657600080fd5b50610491600480360381019061048c91906131da565b611b72565b60405161049f9291906134a3565b60405180910390f35b3480156104b457600080fd5b506104cf60048036038101906104ca91906129e3565b611c0a565b6040516104dd9291906128e8565b60405180910390f35b3480156104f257600080fd5b5061050d600480360381019061050891906129e3565b611ca2565b60405161051a9190612f15565b60405180910390f35b34801561052f57600080fd5b5061054a600480360381019061054591906134da565b611d2c565b005b61056660048036038101906105619190612ecc565b611f08565b005b34801561057457600080fd5b5061058f600480360381019061058a919061355d565b612062565b005b34801561059d57600080fd5b506105b860048036038101906105b39190613768565b61212e565b6040516105c6929190613a7f565b60405180910390f35b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895868487876040518563ffffffff1660e01b81526004016106129493929190613c18565b6020604051808303816000875af1158015610631573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106559190613c6d565b905080610697576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068e90613d1d565b60405180910390fd5b5050505050565b6106a66121cc565b61080073ffffffffffffffffffffffffffffffffffffffff1663223b3b7a836040518263ffffffff1660e01b81526004016106e19190613d3d565b600060405180830381865afa1580156106fe573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906107279190613f8e565b9050919050565b6000610738612240565b6000610800905060008686604051602401610754929190614010565b6040516020818303038152906040527f241774e6000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000856040516020016107e6919061407c565b60405160208183030381529060405280519060200120905060405160200161080d906140df565b6040516020818303038152906040528051906020012081036108f9576000808473ffffffffffffffffffffffffffffffffffffffff16846040516108519190614130565b600060405180830381855af49150503d806000811461088c576040519150601f19603f3d011682016040523d82523d6000602084013e610891565b606091505b5091509150816108d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cd906141b9565b60405180910390fd5b808060200190518101906108ea9190614245565b80975081985050505050610c22565b604051602001610908906142ed565b6040516020818303038152906040528051906020012081036109f4576000808473ffffffffffffffffffffffffffffffffffffffff168460405161094c9190614130565b600060405180830381855afa9150503d8060008114610987576040519150601f19603f3d011682016040523d82523d6000602084013e61098c565b606091505b5091509150816109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c89061434e565b60405180910390fd5b808060200190518101906109e59190614245565b80975081985050505050610c21565b604051602001610a03906143ba565b604051602081830303815290604052805190602001208103610af1576000808473ffffffffffffffffffffffffffffffffffffffff1684604051610a479190614130565b6000604051808303816000865af19150503d8060008114610a84576040519150601f19603f3d011682016040523d82523d6000602084013e610a89565b606091505b509150915081610ace576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac59061441b565b60405180910390fd5b80806020019051810190610ae29190614245565b80975081985050505050610c20565b604051602001610b0090614487565b604051602081830303815290604052805190602001208103610be45760006040518060400160405280601a81526020017f64656c65676174696f6e28616464726573732c737472696e6729000000000000815250805190602001209050600060a490506060600060208b01516020808d0101516040518681528e6004820152604060248201526033604482015282606482015281608482015260c081878360008e5af281519c5060608201519450610100820160405280610bc057600080fd5b50505050604051806040016040528083815260200182815250975050505050610c1f565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c16906144e8565b60405180910390fd5b5b5b5b505050935093915050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610c6f939291906146b6565b6020604051808303816000875af1158015610c8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb29190613c6d565b905080610cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ceb90614740565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff163384604051602401610d20929190614760565b6040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610daa9190614130565b6000604051808303816000865af19150503d8060008114610de7576040519150601f19603f3d011682016040523d82523d6000602084013e610dec565b606091505b5050905080610e30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e27906147d5565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3386866040518463ffffffff1660e01b8152600401610e6f939291906147f5565b6020604051808303816000875af1158015610e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb29190613c6d565b505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610efc939291906146b6565b6020604051808303816000875af1158015610f1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3f9190613c6d565b905080610f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f789061487f565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3085856040518463ffffffff1660e01b8152600401610fc0939291906147f5565b6020604051808303816000875af1158015610fdf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110039190613c6d565b50600160008082825461101691906148ce565b92505081905550505050565b61102a61225a565b61080073ffffffffffffffffffffffffffffffffffffffff1663a03ffee184846040518363ffffffff1660e01b8152600401611067929190614010565b600060405180830381865afa158015611084573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110ad9190614b32565b905092915050565b6000610800905060008585856040516024016110d3939291906147f5565b6040516020818303038152906040527f3edab33c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600083604051602001611165919061407c565b60405160208183030381529060405280519060200120905060405160200161118c906140df565b6040516020818303038152906040528051906020012081036112595760008373ffffffffffffffffffffffffffffffffffffffff16836040516111cf9190614130565b600060405180830381855af49150503d806000811461120a576040519150601f19603f3d011682016040523d82523d6000602084013e61120f565b606091505b5050905080611253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124a906141b9565b60405180910390fd5b5061149e565b604051602001611268906142ed565b6040516020818303038152906040528051906020012081036113355760008373ffffffffffffffffffffffffffffffffffffffff16836040516112ab9190614130565b600060405180830381855afa9150503d80600081146112e6576040519150601f19603f3d011682016040523d82523d6000602084013e6112eb565b606091505b505090508061132f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113269061434e565b60405180910390fd5b5061149d565b604051602001611344906143ba565b6040516020818303038152906040528051906020012081036114135760008373ffffffffffffffffffffffffffffffffffffffff16836040516113879190614130565b6000604051808303816000865af19150503d80600081146113c4576040519150601f19603f3d011682016040523d82523d6000602084013e6113c9565b606091505b505090508061140d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114049061441b565b60405180910390fd5b5061149c565b60405160200161142290614487565b6040516020818303038152906040528051906020012081036114605760208201825160008082846000895af28061145857600080fd5b50505061149b565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611492906144e8565b60405180910390fd5b5b5b5b50505050505050565b6114af61227b565b61080073ffffffffffffffffffffffffffffffffffffffff16637d9f939c8585856040518463ffffffff1660e01b81526004016114ee93929190614b7b565b600060405180830381865afa15801561150b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906115349190614de3565b90509392505050565b61080073ffffffffffffffffffffffffffffffffffffffff166312d58dfe858585856040518563ffffffff1660e01b815260040161157e9493929190614e2c565b6020604051808303816000875af115801561159d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c19190613c6d565b5050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895303460016040518463ffffffff1660e01b815260040161160a939291906146b6565b6020604051808303816000875af1158015611629573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164d9190613c6d565b90508061168f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168690614ec4565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b81526004016116ce939291906147f5565b6020604051808303816000875af11580156116ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117119190613c6d565b505050565b60005481565b600061080073ffffffffffffffffffffffffffffffffffffffff1663f7cd55168888888888886040518763ffffffff1660e01b815260040161176396959493929190615019565b6020604051808303816000875af1158015611782573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a69190613c6d565b90509695505050505050565b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c8484846040518463ffffffff1660e01b81526004016117f1939291906147f5565b6020604051808303816000875af1158015611810573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118349190615089565b50505050565b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb8484846040518463ffffffff1660e01b8152600401611879939291906147f5565b6020604051808303816000875af1158015611898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bc9190613c6d565b50505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b8152600401611904939291906146b6565b6020604051808303816000875af1158015611923573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119479190613c6d565b905080611989576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198090614ec4565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b81526004016119c8939291906147f5565b6020604051808303816000875af11580156119e7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0b9190613c6d565b503373ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611a52573d6000803e3d6000fd5b505050565b61080073ffffffffffffffffffffffffffffffffffffffff166354b826f5858585856040518563ffffffff1660e01b8152600401611a9894939291906150b6565b6020604051808303816000875af1158015611ab7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611adb9190615089565b5050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663a50f05ac868686866040518563ffffffff1660e01b8152600401611b259493929190615118565b6020604051808303816000875af1158015611b44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b689190613c6d565b9050949350505050565b6060611b7c6122a3565b61080073ffffffffffffffffffffffffffffffffffffffff1663186b216785856040518363ffffffff1660e01b8152600401611bb99291906152c2565b600060405180830381865afa158015611bd6573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611bff91906154b6565b915091509250929050565b6000611c14612240565b61080073ffffffffffffffffffffffffffffffffffffffff1663241774e685856040518363ffffffff1660e01b8152600401611c51929190614010565b600060405180830381865afa158015611c6e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611c979190614245565b915091509250929050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663fc08930c8433856040518463ffffffff1660e01b8152600401611ce39392919061552e565b602060405180830381865afa158015611d00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d24919061556c565b905092915050565b6000600167ffffffffffffffff811115611d4957611d486126e6565b5b604051908082528060200260200182016040528015611d7c57816020015b6060815260200190600190039081611d675790505b509050604051806060016040528060258152602001615cba6025913981600081518110611dac57611dab615599565b5b6020026020010181905250600061080073ffffffffffffffffffffffffffffffffffffffff1663b60398958787856040518463ffffffff1660e01b8152600401611df893929190615679565b6020604051808303816000875af1158015611e17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3b9190613c6d565b905080611e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7490615729565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c3285876040518463ffffffff1660e01b8152600401611ebc939291906147f5565b6020604051808303816000875af1158015611edb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eff9190615089565b50505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b8152600401611f4a939291906146b6565b6020604051808303816000875af1158015611f69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8d9190613c6d565b905080611fcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc690614ec4565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084600134611ffc91906148ce565b6040518463ffffffff1660e01b815260040161201a939291906147f5565b6020604051808303816000875af1158015612039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205d9190613c6d565b505050565b600061080073ffffffffffffffffffffffffffffffffffffffff166361dc5c3b8585856040518463ffffffff1660e01b81526004016120a393929190615749565b6020604051808303816000875af11580156120c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e69190613c6d565b905080612128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211f906157ed565b60405180910390fd5b50505050565b60606121386122a3565b61080073ffffffffffffffffffffffffffffffffffffffff166310a2851c878787876040518563ffffffff1660e01b81526004016121799493929190615883565b600060405180830381865afa158015612196573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906121bf9190615c41565b9150915094509492505050565b60405180610160016040528060608152602001606081526020016000151581526020016000600381111561220357612202612520565b5b8152602001600081526020016000815260200160608152602001600060070b8152602001600060070b815260200160008152602001600081525090565b604051806040016040528060608152602001600081525090565b60405180606001604052806060815260200160608152602001606081525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612306826122db565b9050919050565b612316816122fb565b811461232157600080fd5b50565b6000813590506123338161230d565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261235e5761235d612339565b5b8235905067ffffffffffffffff81111561237b5761237a61233e565b5b60208301915083602082028301111561239757612396612343565b5b9250929050565b6000819050919050565b6123b18161239e565b81146123bc57600080fd5b50565b6000813590506123ce816123a8565b92915050565b600080600080606085870312156123ee576123ed6122d1565b5b60006123fc87828801612324565b945050602085013567ffffffffffffffff81111561241d5761241c6122d6565b5b61242987828801612348565b9350935050604061243c878288016123bf565b91505092959194509250565b60006020828403121561245e5761245d6122d1565b5b600061246c84828501612324565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156124af578082015181840152602081019050612494565b60008484015250505050565b6000601f19601f8301169050919050565b60006124d782612475565b6124e18185612480565b93506124f1818560208601612491565b6124fa816124bb565b840191505092915050565b60008115159050919050565b61251a81612505565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106125605761255f612520565b5b50565b60008190506125718261254f565b919050565b600061258182612563565b9050919050565b61259181612576565b82525050565b6125a08161239e565b82525050565b60008160070b9050919050565b6125bc816125a6565b82525050565b60006101608301600083015184820360008601526125e082826124cc565b915050602083015184820360208601526125fa82826124cc565b915050604083015161260f6040860182612511565b5060608301516126226060860182612588565b5060808301516126356080860182612597565b5060a083015161264860a0860182612597565b5060c083015184820360c086015261266082826124cc565b91505060e083015161267560e08601826125b3565b5061010083015161268a6101008601826125b3565b5061012083015161269f610120860182612597565b506101408301516126b4610140860182612597565b508091505092915050565b600060208201905081810360008301526126d981846125c2565b905092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61271e826124bb565b810181811067ffffffffffffffff8211171561273d5761273c6126e6565b5b80604052505050565b60006127506122c7565b905061275c8282612715565b919050565b600067ffffffffffffffff82111561277c5761277b6126e6565b5b612785826124bb565b9050602081019050919050565b82818337600083830152505050565b60006127b46127af84612761565b612746565b9050828152602081018484840111156127d0576127cf6126e1565b5b6127db848285612792565b509392505050565b600082601f8301126127f8576127f7612339565b5b81356128088482602086016127a1565b91505092915050565b60008060006060848603121561282a576128296122d1565b5b600061283886828701612324565b935050602084013567ffffffffffffffff811115612859576128586122d6565b5b612865868287016127e3565b925050604084013567ffffffffffffffff811115612886576128856122d6565b5b612892868287016127e3565b9150509250925092565b6128a58161239e565b82525050565b600060408301600083015184820360008601526128c882826124cc565b91505060208301516128dd6020860182612597565b508091505092915050565b60006040820190506128fd600083018561289c565b818103602083015261290f81846128ab565b90509392505050565b600080600060608486031215612931576129306122d1565b5b600061293f86828701612324565b935050602084013567ffffffffffffffff8111156129605761295f6122d6565b5b61296c868287016127e3565b925050604061297d868287016123bf565b9150509250925092565b6000806040838503121561299e5761299d6122d1565b5b600083013567ffffffffffffffff8111156129bc576129bb6122d6565b5b6129c8858286016127e3565b92505060206129d9858286016123bf565b9150509250929050565b600080604083850312156129fa576129f96122d1565b5b6000612a0885828601612324565b925050602083013567ffffffffffffffff811115612a2957612a286122d6565b5b612a35858286016127e3565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600067ffffffffffffffff82169050919050565b612a8881612a6b565b82525050565b60c082016000820151612aa460008501826125b3565b506020820151612ab760208501826125b3565b506040820151612aca6040850182612597565b506060820151612add6060850182612597565b506080820151612af06080850182612a7f565b5060a0820151612b0360a08501826125b3565b50505050565b6000612b158383612a8e565b60c08301905092915050565b6000602082019050919050565b6000612b3982612a3f565b612b438185612a4a565b9350612b4e83612a5b565b8060005b83811015612b7f578151612b668882612b09565b9750612b7183612b21565b925050600181019050612b52565b5085935050505092915050565b60006060830160008301518482036000860152612ba982826124cc565b91505060208301518482036020860152612bc382826124cc565b91505060408301518482036040860152612bdd8282612b2e565b9150508091505092915050565b60006020820190508181036000830152612c048184612b8c565b905092915050565b60008060008060808587031215612c2657612c256122d1565b5b6000612c3487828801612324565b945050602085013567ffffffffffffffff811115612c5557612c546122d6565b5b612c61878288016127e3565b9350506040612c72878288016123bf565b925050606085013567ffffffffffffffff811115612c9357612c926122d6565b5b612c9f878288016127e3565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b608082016000820151612ced60008501826125b3565b506020820151612d0060208501826125b3565b506040820151612d136040850182612597565b506060820151612d266060850182612597565b50505050565b6000612d388383612cd7565b60808301905092915050565b6000602082019050919050565b6000612d5c82612cab565b612d668185612cb6565b9350612d7183612cc7565b8060005b83811015612da2578151612d898882612d2c565b9750612d9483612d44565b925050600181019050612d75565b5085935050505092915050565b60006080830160008301518482036000860152612dcc82826124cc565b91505060208301518482036020860152612de682826124cc565b91505060408301518482036040860152612e0082826124cc565b91505060608301518482036060860152612e1a8282612d51565b9150508091505092915050565b60006020820190508181036000830152612e418184612daf565b905092915050565b60008060008060808587031215612e6357612e626122d1565b5b6000612e7187828801612324565b945050602085013567ffffffffffffffff811115612e9257612e916122d6565b5b612e9e878288016127e3565b9350506040612eaf878288016123bf565b9250506060612ec0878288016123bf565b91505092959194509250565b600060208284031215612ee257612ee16122d1565b5b600082013567ffffffffffffffff811115612f0057612eff6122d6565b5b612f0c848285016127e3565b91505092915050565b6000602082019050612f2a600083018461289c565b92915050565b600080fd5b600060a08284031215612f4b57612f4a612f30565b5b81905092915050565b600060608284031215612f6a57612f69612f30565b5b81905092915050565b6000806000806000806101008789031215612f9157612f906122d1565b5b600087013567ffffffffffffffff811115612faf57612fae6122d6565b5b612fbb89828a01612f35565b9650506020612fcc89828a01612f54565b9550506080612fdd89828a016123bf565b94505060a0612fee89828a01612324565b93505060c087013567ffffffffffffffff81111561300f5761300e6122d6565b5b61301b89828a016127e3565b92505060e061302c89828a016123bf565b9150509295509295509295565b61304281612505565b82525050565b600060208201905061305d6000830184613039565b92915050565b6000806000806080858703121561307d5761307c6122d1565b5b600061308b87828801612324565b945050602085013567ffffffffffffffff8111156130ac576130ab6122d6565b5b6130b8878288016127e3565b935050604085013567ffffffffffffffff8111156130d9576130d86122d6565b5b6130e5878288016127e3565b92505060606130f6878288016123bf565b91505092959194509250565b6000819050919050565b61311581613102565b811461312057600080fd5b50565b6000813590506131328161310c565b92915050565b60008060008060808587031215613152576131516122d1565b5b600085013567ffffffffffffffff8111156131705761316f6122d6565b5b61317c87828801612f35565b945050602061318d87828801612324565b935050604061319e87828801613123565b92505060606131af87828801613123565b91505092959194509250565b600060a082840312156131d1576131d0612f30565b5b81905092915050565b600080604083850312156131f1576131f06122d1565b5b600083013567ffffffffffffffff81111561320f5761320e6122d6565b5b61321b858286016127e3565b925050602083013567ffffffffffffffff81111561323c5761323b6122d6565b5b613248858286016131bb565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061016083016000830151848203600086015261329c82826124cc565b915050602083015184820360208601526132b682826124cc565b91505060408301516132cb6040860182612511565b5060608301516132de6060860182612588565b5060808301516132f16080860182612597565b5060a083015161330460a0860182612597565b5060c083015184820360c086015261331c82826124cc565b91505060e083015161333160e08601826125b3565b506101008301516133466101008601826125b3565b5061012083015161335b610120860182612597565b50610140830151613370610140860182612597565b508091505092915050565b6000613387838361327e565b905092915050565b6000602082019050919050565b60006133a782613252565b6133b1818561325d565b9350836020820285016133c38561326e565b8060005b858110156133ff57848403895281516133e0858261337b565b94506133eb8361338f565b925060208a019950506001810190506133c7565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b600061343882613411565b613442818561341c565b9350613452818560208601612491565b61345b816124bb565b840191505092915050565b60006040830160008301518482036000860152613483828261342d565b91505060208301516134986020860182612a7f565b508091505092915050565b600060408201905081810360008301526134bd818561339c565b905081810360208301526134d18184613466565b90509392505050565b600080600080608085870312156134f4576134f36122d1565b5b600061350287828801612324565b9450506020613513878288016123bf565b9350506040613524878288016123bf565b925050606085013567ffffffffffffffff811115613545576135446122d6565b5b613551878288016127e3565b91505092959194509250565b600080600060408486031215613576576135756122d1565b5b600061358486828701612324565b935050602084013567ffffffffffffffff8111156135a5576135a46122d6565b5b6135b186828701612348565b92509250509250925092565b600080fd5b600080fd5b600067ffffffffffffffff8211156135e2576135e16126e6565b5b6135eb826124bb565b9050602081019050919050565b600061360b613606846135c7565b612746565b905082815260208101848484011115613627576136266126e1565b5b613632848285612792565b509392505050565b600082601f83011261364f5761364e612339565b5b813561365f8482602086016135f8565b91505092915050565b61367181612a6b565b811461367c57600080fd5b50565b60008135905061368e81613668565b92915050565b61369d81612505565b81146136a857600080fd5b50565b6000813590506136ba81613694565b92915050565b600060a082840312156136d6576136d56135bd565b5b6136e060a0612746565b9050600082013567ffffffffffffffff811115613700576136ff6135c2565b5b61370c8482850161363a565b60008301525060206137208482850161367f565b60208301525060406137348482850161367f565b6040830152506060613748848285016136ab565b606083015250608061375c848285016136ab565b60808301525092915050565b60008060008060808587031215613782576137816122d1565b5b600061379087828801612324565b945050602085013567ffffffffffffffff8111156137b1576137b06122d6565b5b6137bd878288016127e3565b935050604085013567ffffffffffffffff8111156137de576137dd6122d6565b5b6137ea878288016127e3565b925050606085013567ffffffffffffffff81111561380b5761380a6122d6565b5b613817878288016136c0565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000608083016000830151848203600086015261386c82826124cc565b9150506020830151848203602086015261388682826124cc565b915050604083015184820360408601526138a082826124cc565b915050606083015184820360608601526138ba8282612d51565b9150508091505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60a0820160008201516139096000850182612cd7565b50602082015161391c6080850182612597565b50505050565b600061392e83836138f3565b60a08301905092915050565b6000602082019050919050565b6000613952826138c7565b61395c81856138d2565b9350613967836138e3565b8060005b8381101561399857815161397f8882613922565b975061398a8361393a565b92505060018101905061396b565b5085935050505092915050565b600060408301600083015184820360008601526139c2828261384f565b915050602083015184820360208601526139dc8282613947565b9150508091505092915050565b60006139f583836139a5565b905092915050565b6000602082019050919050565b6000613a1582613823565b613a1f818561382e565b935083602082028501613a318561383f565b8060005b85811015613a6d5784840389528151613a4e85826139e9565b9450613a59836139fd565b925060208a01995050600181019050613a35565b50829750879550505050505092915050565b60006040820190508181036000830152613a998185613a0a565b90508181036020830152613aad8184613466565b90509392505050565b613abf816122fb565b82525050565b600082825260208201905092915050565b6000819050919050565b6000613aec8385612480565b9350613af9838584612792565b613b02836124bb565b840190509392505050565b6000613b1a848484613ae0565b90509392505050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112613b4f57613b4e613b2d565b5b83810192508235915060208301925067ffffffffffffffff821115613b7757613b76613b23565b5b600182023603831315613b8d57613b8c613b28565b5b509250929050565b6000602082019050919050565b6000613bae8385613ac5565b935083602084028501613bc084613ad6565b8060005b87811015613c06578484038952613bdb8284613b32565b613be6868284613b0d565b9550613bf184613b95565b935060208b019a505050600181019050613bc4565b50829750879450505050509392505050565b6000606082019050613c2d6000830187613ab6565b613c3a602083018661289c565b8181036040830152613c4d818486613ba2565b905095945050505050565b600081519050613c6781613694565b92915050565b600060208284031215613c8357613c826122d1565b5b6000613c9184828501613c58565b91505092915050565b600082825260208201905092915050565b7f4661696c656420746f20617070726f7665207374616b696e67206d6574686f6460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d07602183613c9a565b9150613d1282613cab565b604082019050919050565b60006020820190508181036000830152613d3681613cfa565b9050919050565b6000602082019050613d526000830184613ab6565b92915050565b6000613d6b613d6684612761565b612746565b905082815260208101848484011115613d8757613d866126e1565b5b613d92848285612491565b509392505050565b600082601f830112613daf57613dae612339565b5b8151613dbf848260208601613d58565b91505092915050565b60048110613dd557600080fd5b50565b600081519050613de781613dc8565b92915050565b600081519050613dfc816123a8565b92915050565b613e0b816125a6565b8114613e1657600080fd5b50565b600081519050613e2881613e02565b92915050565b60006101608284031215613e4557613e446135bd565b5b613e50610160612746565b9050600082015167ffffffffffffffff811115613e7057613e6f6135c2565b5b613e7c84828501613d9a565b600083015250602082015167ffffffffffffffff811115613ea057613e9f6135c2565b5b613eac84828501613d9a565b6020830152506040613ec084828501613c58565b6040830152506060613ed484828501613dd8565b6060830152506080613ee884828501613ded565b60808301525060a0613efc84828501613ded565b60a08301525060c082015167ffffffffffffffff811115613f2057613f1f6135c2565b5b613f2c84828501613d9a565b60c08301525060e0613f4084828501613e19565b60e083015250610100613f5584828501613e19565b61010083015250610120613f6b84828501613ded565b61012083015250610140613f8184828501613ded565b6101408301525092915050565b600060208284031215613fa457613fa36122d1565b5b600082015167ffffffffffffffff811115613fc257613fc16122d6565b5b613fce84828501613e2e565b91505092915050565b6000613fe282612475565b613fec8185613c9a565b9350613ffc818560208601612491565b614005816124bb565b840191505092915050565b60006040820190506140256000830185613ab6565b81810360208301526140378184613fd7565b90509392505050565b600081905092915050565b600061405682612475565b6140608185614040565b9350614070818560208601612491565b80840191505092915050565b6000614088828461404b565b915081905092915050565b7f64656c656761746563616c6c0000000000000000000000000000000000000000600082015250565b60006140c9600c83614040565b91506140d482614093565b600c82019050919050565b60006140ea826140bc565b9150819050919050565b600081905092915050565b600061410a82613411565b61411481856140f4565b9350614124818560208601612491565b80840191505092915050565b600061413c82846140ff565b915081905092915050565b7f6661696c65642064656c656761746563616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b60006141a3602183613c9a565b91506141ae82614147565b604082019050919050565b600060208201905081810360008301526141d281614196565b9050919050565b6000604082840312156141ef576141ee6135bd565b5b6141f96040612746565b9050600082015167ffffffffffffffff811115614219576142186135c2565b5b61422584828501613d9a565b600083015250602061423984828501613ded565b60208301525092915050565b6000806040838503121561425c5761425b6122d1565b5b600061426a85828601613ded565b925050602083015167ffffffffffffffff81111561428b5761428a6122d6565b5b614297858286016141d9565b9150509250929050565b7f73746174696363616c6c00000000000000000000000000000000000000000000600082015250565b60006142d7600a83614040565b91506142e2826142a1565b600a82019050919050565b60006142f8826142ca565b9150819050919050565b7f6661696c65642073746174696363616c6c20746f20707265636f6d70696c6500600082015250565b6000614338601f83613c9a565b915061434382614302565b602082019050919050565b600060208201905081810360008301526143678161432b565b9050919050565b7f63616c6c00000000000000000000000000000000000000000000000000000000600082015250565b60006143a4600483614040565b91506143af8261436e565b600482019050919050565b60006143c582614397565b9150819050919050565b7f6661696c65642063616c6c20746f20707265636f6d70696c6500000000000000600082015250565b6000614405601983613c9a565b9150614410826143cf565b602082019050919050565b60006020820190508181036000830152614434816143f8565b9050919050565b7f63616c6c636f6465000000000000000000000000000000000000000000000000600082015250565b6000614471600883614040565b915061447c8261443b565b600882019050919050565b600061449282614464565b9150819050919050565b7f696e76616c69642063616c6c7479706500000000000000000000000000000000600082015250565b60006144d2601083613c9a565b91506144dd8261449c565b602082019050919050565b60006020820190508181036000830152614501816144c5565b9050919050565b600081549050919050565b60008190508160005260206000209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061456f57607f821691505b60208210810361458257614581614528565b5b50919050565b60008190508160005260206000209050919050565b600081546145aa81614557565b6145b48186612480565b945060018216600081146145cf57600181146145e557614618565b60ff198316865281151560200286019350614618565b6145ee85614588565b60005b83811015614610578154818901526001820191506020810190506145f1565b808801955050505b50505092915050565b600061462d838361459d565b905092915050565b6000600182019050919050565b600061464d82614508565b6146578185613ac5565b93508360208202850161466985614513565b8060005b858110156146a4578484038952816146858582614621565b945061469083614635565b925060208a0199505060018101905061466d565b50829750879550505050505092915050565b60006060820190506146cb6000830186613ab6565b6146d8602083018561289c565b81810360408301526146ea8184614642565b9050949350505050565b7f64656c65676174696f6e20617070726f76616c206661696c6564000000000000600082015250565b600061472a601a83613c9a565b9150614735826146f4565b602082019050919050565b600060208201905081810360008301526147598161471d565b9050919050565b60006040820190506147756000830185613ab6565b614782602083018461289c565b9392505050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b60006147bf600f83613c9a565b91506147ca82614789565b602082019050919050565b600060208201905081810360008301526147ee816147b2565b9050919050565b600060608201905061480a6000830186613ab6565b818103602083015261481c8185613fd7565b905061482b604083018461289c565b949350505050565b7f5374616b696e6720417070726f7665206661696c656400000000000000000000600082015250565b6000614869601683613c9a565b915061487482614833565b602082019050919050565b600060208201905081810360008301526148988161485c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006148d98261239e565b91506148e48361239e565b92508282019050808211156148fc576148fb61489f565b5b92915050565b600067ffffffffffffffff82111561491d5761491c6126e6565b5b602082029050602081019050919050565b60008151905061493d81613668565b92915050565b600060c08284031215614959576149586135bd565b5b61496360c0612746565b9050600061497384828501613e19565b600083015250602061498784828501613e19565b602083015250604061499b84828501613ded565b60408301525060606149af84828501613ded565b60608301525060806149c38482850161492e565b60808301525060a06149d784828501613e19565b60a08301525092915050565b60006149f66149f184614902565b612746565b90508083825260208201905060c08402830185811115614a1957614a18612343565b5b835b81811015614a425780614a2e8882614943565b84526020840193505060c081019050614a1b565b5050509392505050565b600082601f830112614a6157614a60612339565b5b8151614a718482602086016149e3565b91505092915050565b600060608284031215614a9057614a8f6135bd565b5b614a9a6060612746565b9050600082015167ffffffffffffffff811115614aba57614ab96135c2565b5b614ac684828501613d9a565b600083015250602082015167ffffffffffffffff811115614aea57614ae96135c2565b5b614af684828501613d9a565b602083015250604082015167ffffffffffffffff811115614b1a57614b196135c2565b5b614b2684828501614a4c565b60408301525092915050565b600060208284031215614b4857614b476122d1565b5b600082015167ffffffffffffffff811115614b6657614b656122d6565b5b614b7284828501614a7a565b91505092915050565b6000606082019050614b906000830186613ab6565b8181036020830152614ba28185613fd7565b90508181036040830152614bb68184613fd7565b9050949350505050565b600067ffffffffffffffff821115614bdb57614bda6126e6565b5b602082029050602081019050919050565b600060808284031215614c0257614c016135bd565b5b614c0c6080612746565b90506000614c1c84828501613e19565b6000830152506020614c3084828501613e19565b6020830152506040614c4484828501613ded565b6040830152506060614c5884828501613ded565b60608301525092915050565b6000614c77614c7284614bc0565b612746565b90508083825260208201905060808402830185811115614c9a57614c99612343565b5b835b81811015614cc35780614caf8882614bec565b845260208401935050608081019050614c9c565b5050509392505050565b600082601f830112614ce257614ce1612339565b5b8151614cf2848260208601614c64565b91505092915050565b600060808284031215614d1157614d106135bd565b5b614d1b6080612746565b9050600082015167ffffffffffffffff811115614d3b57614d3a6135c2565b5b614d4784828501613d9a565b600083015250602082015167ffffffffffffffff811115614d6b57614d6a6135c2565b5b614d7784828501613d9a565b602083015250604082015167ffffffffffffffff811115614d9b57614d9a6135c2565b5b614da784828501613d9a565b604083015250606082015167ffffffffffffffff811115614dcb57614dca6135c2565b5b614dd784828501614ccd565b60608301525092915050565b600060208284031215614df957614df86122d1565b5b600082015167ffffffffffffffff811115614e1757614e166122d6565b5b614e2384828501614cfb565b91505092915050565b6000608082019050614e416000830187613ab6565b8181036020830152614e538186613fd7565b9050614e62604083018561289c565b614e6f606083018461289c565b95945050505050565b7f44656c656761746520417070726f7665206661696c6564000000000000000000600082015250565b6000614eae601783613c9a565b9150614eb982614e78565b602082019050919050565b60006020820190508181036000830152614edd81614ea1565b9050919050565b600060a08301614ef76000840184613b32565b8583036000870152614f0a838284613ae0565b92505050614f1b6020840184613b32565b8583036020870152614f2e838284613ae0565b92505050614f3f6040840184613b32565b8583036040870152614f52838284613ae0565b92505050614f636060840184613b32565b8583036060870152614f76838284613ae0565b92505050614f876080840184613b32565b8583036080870152614f9a838284613ae0565b925050508091505092915050565b6000614fb760208401846123bf565b905092915050565b60608201614fd06000830183614fa8565b614fdd6000850182612597565b50614feb6020830183614fa8565b614ff86020850182612597565b506150066040830183614fa8565b6150136040850182612597565b50505050565b60006101008201905081810360008301526150348189614ee4565b90506150436020830188614fbf565b615050608083018761289c565b61505d60a0830186613ab6565b81810360c083015261506f8185613fd7565b905061507e60e083018461289c565b979650505050505050565b60006020828403121561509f5761509e6122d1565b5b60006150ad84828501613e19565b91505092915050565b60006080820190506150cb6000830187613ab6565b81810360208301526150dd8186613fd7565b905081810360408301526150f18185613fd7565b9050615100606083018461289c565b95945050505050565b61511281613102565b82525050565b600060808201905081810360008301526151328187614ee4565b90506151416020830186613ab6565b61514e6040830185615109565b61515b6060830184615109565b95945050505050565b6000808335600160200384360303811261518157615180613b2d565b5b83810192508235915060208301925067ffffffffffffffff8211156151a9576151a8613b23565b5b6001820236038313156151bf576151be613b28565b5b509250929050565b60006151d3838561341c565b93506151e0838584612792565b6151e9836124bb565b840190509392505050565b6000615203602084018461367f565b905092915050565b600061521a60208401846136ab565b905092915050565b600060a083016152356000840184615164565b85830360008701526152488382846151c7565b9250505061525960208401846151f4565b6152666020860182612a7f565b5061527460408401846151f4565b6152816040860182612a7f565b5061528f606084018461520b565b61529c6060860182612511565b506152aa608084018461520b565b6152b76080860182612511565b508091505092915050565b600060408201905081810360008301526152dc8185613fd7565b905081810360208301526152f08184615222565b90509392505050565b600067ffffffffffffffff821115615314576153136126e6565b5b602082029050602081019050919050565b6000615338615333846152f9565b612746565b9050808382526020820190506020840283018581111561535b5761535a612343565b5b835b818110156153a257805167ffffffffffffffff8111156153805761537f612339565b5b80860161538d8982613e2e565b8552602085019450505060208101905061535d565b5050509392505050565b600082601f8301126153c1576153c0612339565b5b81516153d1848260208601615325565b91505092915050565b60006153ed6153e8846135c7565b612746565b905082815260208101848484011115615409576154086126e1565b5b615414848285612491565b509392505050565b600082601f83011261543157615430612339565b5b81516154418482602086016153da565b91505092915050565b6000604082840312156154605761545f6135bd565b5b61546a6040612746565b9050600082015167ffffffffffffffff81111561548a576154896135c2565b5b6154968482850161541c565b60008301525060206154aa8482850161492e565b60208301525092915050565b600080604083850312156154cd576154cc6122d1565b5b600083015167ffffffffffffffff8111156154eb576154ea6122d6565b5b6154f7858286016153ac565b925050602083015167ffffffffffffffff811115615518576155176122d6565b5b6155248582860161544a565b9150509250929050565b60006060820190506155436000830186613ab6565b6155506020830185613ab6565b81810360408301526155628184613fd7565b9050949350505050565b600060208284031215615582576155816122d1565b5b600061559084828501613ded565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b6000819050602082019050919050565b60006155ef83836124cc565b905092915050565b6000602082019050919050565b600061560f826155c8565b6156198185613ac5565b93508360208202850161562b856155d3565b8060005b85811015615667578484038952815161564885826155e3565b9450615653836155f7565b925060208a0199505060018101905061562f565b50829750879550505050505092915050565b600060608201905061568e6000830186613ab6565b61569b602083018561289c565b81810360408301526156ad8184615604565b9050949350505050565b7f6661696c656420746f20617070726f766520756e64656c65676174696f6e206d60008201527f6574686f64000000000000000000000000000000000000000000000000000000602082015250565b6000615713602583613c9a565b915061571e826156b7565b604082019050919050565b6000602082019050818103600083015261574281615706565b9050919050565b600060408201905061575e6000830186613ab6565b8181036020830152615771818486613ba2565b9050949350505050565b7f4661696c656420746f207265766f6b6520617070726f76616c20666f7220737460008201527f616b696e67206d6574686f647300000000000000000000000000000000000000602082015250565b60006157d7602d83613c9a565b91506157e28261577b565b604082019050919050565b60006020820190508181036000830152615806816157ca565b9050919050565b600060a083016000830151848203600086015261582a828261342d565b915050602083015161583f6020860182612a7f565b5060408301516158526040860182612a7f565b5060608301516158656060860182612511565b5060808301516158786080860182612511565b508091505092915050565b60006080820190506158986000830187613ab6565b81810360208301526158aa8186613fd7565b905081810360408301526158be8185613fd7565b905081810360608301526158d2818461580d565b905095945050505050565b600067ffffffffffffffff8211156158f8576158f76126e6565b5b602082029050602081019050919050565b60006080828403121561591f5761591e6135bd565b5b6159296080612746565b9050600082015167ffffffffffffffff811115615949576159486135c2565b5b61595584828501613d9a565b600083015250602082015167ffffffffffffffff811115615979576159786135c2565b5b61598584828501613d9a565b602083015250604082015167ffffffffffffffff8111156159a9576159a86135c2565b5b6159b584828501613d9a565b604083015250606082015167ffffffffffffffff8111156159d9576159d86135c2565b5b6159e584828501614ccd565b60608301525092915050565b600067ffffffffffffffff821115615a0c57615a0b6126e6565b5b602082029050602081019050919050565b600060a08284031215615a3357615a326135bd565b5b615a3d6040612746565b90506000615a4d84828501614bec565b6000830152506080615a6184828501613ded565b60208301525092915050565b6000615a80615a7b846159f1565b612746565b90508083825260208201905060a08402830185811115615aa357615aa2612343565b5b835b81811015615acc5780615ab88882615a1d565b84526020840193505060a081019050615aa5565b5050509392505050565b600082601f830112615aeb57615aea612339565b5b8151615afb848260208601615a6d565b91505092915050565b600060408284031215615b1a57615b196135bd565b5b615b246040612746565b9050600082015167ffffffffffffffff811115615b4457615b436135c2565b5b615b5084828501615909565b600083015250602082015167ffffffffffffffff811115615b7457615b736135c2565b5b615b8084828501615ad6565b60208301525092915050565b6000615b9f615b9a846158dd565b612746565b90508083825260208201905060208402830185811115615bc257615bc1612343565b5b835b81811015615c0957805167ffffffffffffffff811115615be757615be6612339565b5b808601615bf48982615b04565b85526020850194505050602081019050615bc4565b5050509392505050565b600082601f830112615c2857615c27612339565b5b8151615c38848260208601615b8c565b91505092915050565b60008060408385031215615c5857615c576122d1565b5b600083015167ffffffffffffffff811115615c7657615c756122d6565b5b615c8285828601615c13565b925050602083015167ffffffffffffffff811115615ca357615ca26122d6565b5b615caf8582860161544a565b915050925092905056fe2f636f736d6f732e7374616b696e672e763162657461312e4d7367556e64656c6567617465a2646970667358221220b1862923f78a295a0f30b8d05151c1dc82fb92c0b2dc98be2f6486b611ef4ede64736f6c63430008120033", "linkReferences": {}, "deployedLinkReferences": {} -} +} \ No newline at end of file diff --git a/precompiles/staking/testdata/StakingCaller.sol b/precompiles/staking/testdata/StakingCaller.sol index 21ad5f3ca9..e42874de01 100644 --- a/precompiles/staking/testdata/StakingCaller.sol +++ b/precompiles/staking/testdata/StakingCaller.sol @@ -7,7 +7,7 @@ import "../StakingI.sol" as staking; /// @author Evmos Core Team /// @dev This contract is used to test external contract calls to the staking precompile. contract StakingCaller { - /// counter is used to test the state persistence bug, when EVM and Cosmos state were both + /// counter is used to test the state persistence bug, when EVM and Cosmos state were both /// changed in the same function. uint256 public counter; string[] private delegateMethod = [staking.MSG_DELEGATE]; @@ -31,17 +31,64 @@ contract StakingCaller { /// @dev This function calls the staking precompile's revoke method. /// @param _grantee The address that was approved to spend the funds. /// @param _methods The methods to revoke. - function testRevoke( - address _grantee, - string[] calldata _methods - ) public { - bool success = staking.STAKING_CONTRACT.revoke( - _grantee, - _methods - ); + function testRevoke(address _grantee, string[] calldata _methods) public { + bool success = staking.STAKING_CONTRACT.revoke(_grantee, _methods); require(success, "Failed to revoke approval for staking methods"); } + /// @dev This function calls the staking precompile's create validator method + /// using the msg.sender as the validator's operator address. + /// @param _descr The initial description + /// @param _commRates The initial commissionRates + /// @param _minSelfDel The validator's self declared minimum self delegation + /// @param _valAddr The validator's operator address + /// @param _pubkey The consensus public key of the validator + /// @param _value The amount of the coin to be self delegated to the validator + /// @return success Whether or not the create validator was successful + function testCreateValidator( + staking.Description calldata _descr, + staking.CommissionRates calldata _commRates, + uint256 _minSelfDel, + address _valAddr, + string memory _pubkey, + uint256 _value + ) public returns (bool) { + return + staking.STAKING_CONTRACT.createValidator( + _descr, + _commRates, + _minSelfDel, + _valAddr, + _pubkey, + _value + ); + } + + /// @dev This function calls the staking precompile's edit validator + /// method using the msg.sender as the validator's operator address. + /// @param _descr Description parameter to be updated. Use the string "[do-not-modify]" + /// as the value of fields that should not be updated. + /// @param _valAddr The validator's operator address + /// @param _commRate CommissionRate parameter to be updated. + /// Use commissionRate = -1 to keep the current value and not update it. + /// @param _minSelfDel MinSelfDelegation parameter to be updated. + /// Use minSelfDelegation = -1 to keep the current value and not update it. + /// @return success Whether or not edit validator was successful. + function testEditValidator( + staking.Description calldata _descr, + address _valAddr, + int256 _commRate, + int256 _minSelfDel + ) public returns (bool) { + return + staking.STAKING_CONTRACT.editValidator( + _descr, + _valAddr, + _commRate, + _minSelfDel + ); + } + /// @dev This function calls the staking precompile's delegate method. /// @param _addr The address to approve. /// @param _validatorAddr The validator address to delegate to. @@ -133,12 +180,12 @@ contract StakingCaller { string memory _status, staking.PageRequest calldata _pageRequest ) - public - view - returns ( - staking.Validator[] memory validators, - staking.PageResponse memory pageResponse - ) + public + view + returns ( + staking.Validator[] memory validators, + staking.PageResponse memory pageResponse + ) { return staking.STAKING_CONTRACT.validators(_status, _pageRequest); } @@ -167,10 +214,10 @@ contract StakingCaller { ) public view returns (staking.RedelegationOutput memory redelegation) { return staking.STAKING_CONTRACT.redelegation( - _addr, - _validatorSrcAddr, - _validatorDstAddr - ); + _addr, + _validatorSrcAddr, + _validatorDstAddr + ); } /// @dev This function calls the staking precompile's redelegations query method. @@ -185,20 +232,20 @@ contract StakingCaller { string memory _validatorDstAddr, staking.PageRequest memory _pageRequest ) - public - view - returns ( - staking.RedelegationResponse[] memory response, - staking.PageResponse memory pageResponse - ) + public + view + returns ( + staking.RedelegationResponse[] memory response, + staking.PageResponse memory pageResponse + ) { return staking.STAKING_CONTRACT.redelegations( - _delegatorAddr, - _validatorSrcAddr, - _validatorDstAddr, - _pageRequest - ); + _delegatorAddr, + _validatorSrcAddr, + _validatorDstAddr, + _pageRequest + ); } /// @dev This function calls the staking precompile's unbonding delegation query method. @@ -208,7 +255,11 @@ contract StakingCaller { function getUnbondingDelegation( address _addr, string memory _validatorAddr - ) public view returns (staking.UnbondingDelegationOutput memory unbondingDelegation) { + ) + public + view + returns (staking.UnbondingDelegationOutput memory unbondingDelegation) + { return staking.STAKING_CONTRACT.unbondingDelegation(_addr, _validatorAddr); } @@ -240,7 +291,7 @@ contract StakingCaller { ); } - /// @dev This function is used to test the behaviour when executing transactions using special + /// @dev This function is used to test the behaviour when executing transactions using special /// function calling opcodes, /// like call, delegatecall, staticcall, and callcode. /// @param _addr The address to approve. @@ -274,12 +325,12 @@ contract StakingCaller { } else if (calltypeHash == keccak256(abi.encodePacked("callcode"))) { // NOTE: callcode is deprecated and now only available via inline assembly assembly { - // Load the function signature and argument data onto the stack + // Load the function signature and argument data onto the stack let ptr := add(payload, 0x20) let len := mload(payload) - // Invoke the contract at calledContractAddress in the context of the current contract - // using CALLCODE opcode and the loaded function signature and argument data + // Invoke the contract at calledContractAddress in the context of the current contract + // using CALLCODE opcode and the loaded function signature and argument data let success := callcode( gas(), calledContractAddress, @@ -290,7 +341,7 @@ contract StakingCaller { 0 ) - // Check if the call was successful and revert the transaction if it failed + // Check if the call was successful and revert the transaction if it failed if iszero(success) { revert(0, 0) } @@ -356,7 +407,7 @@ contract StakingCaller { let chunk1 := mload(add(_validatorAddr, 32)) // first 32 bytes of validator address string let chunk2 := mload(add(add(_validatorAddr, 32), 32)) // remaining 19 bytes of val address string - // Load the function signature and argument data onto the stack + // Load the function signature and argument data onto the stack let x := mload(0x40) // Find empty storage location using "free memory pointer" mstore(x, sig) // Place function signature at beginning of empty storage mstore(add(x, 0x04), _addr) // Place the address (input param) after the function sig @@ -365,8 +416,8 @@ contract StakingCaller { mstore(add(x, 0x64), chunk1) // Place the validator address in 2 chunks (input param) mstore(add(x, 0x84), chunk2) // because mstore stores 32bytes - // Invoke the contract at calledContractAddress in the context of the current contract - // using CALLCODE opcode and the loaded function signature and argument data + // Invoke the contract at calledContractAddress in the context of the current contract + // using CALLCODE opcode and the loaded function signature and argument data let success := callcode( gas(), calledContractAddress, // to addr @@ -377,26 +428,26 @@ contract StakingCaller { 0xC0 // output length for this call ) - // output length for this call is 192 bytes splitted on these 32 bytes chunks: - // 1 - 0x00..amt -> @ 0x40 - // 2 - 0x000..00 -> @ 0x60 - // 3 - 0x40..000 -> @ 0x80 - // 4 - 0x00..amt -> @ 0xC0 - // 5 - 0x00..denom -> @ 0xE0 TODO: cannot get the return value + // output length for this call is 192 bytes splitted on these 32 bytes chunks: + // 1 - 0x00..amt -> @ 0x40 + // 2 - 0x000..00 -> @ 0x60 + // 3 - 0x40..000 -> @ 0x80 + // 4 - 0x00..amt -> @ 0xC0 + // 5 - 0x00..denom -> @ 0xE0 TODO: cannot get the return value shares := mload(x) // Assign shares output value - 32 bytes long amt := mload(add(x, 0x60)) // Assign output value to c - 64 bytes long (string & uint256) mstore(0x40, add(x, 0x100)) // Set storage pointer to empty space - // Check if the call was successful and revert the transaction if it failed + // Check if the call was successful and revert the transaction if it failed if iszero(success) { revert(0, 0) } } - // NOTE: this is returning a blank denom because unpacking the denom is not + // NOTE: this is returning a blank denom because unpacking the denom is not // straightforward and hasn't been solved, which is okay for this generic test case. - coin = staking.Coin(denom, amt); + coin = staking.Coin(denom, amt); } else { revert("invalid calltype"); } @@ -429,7 +480,9 @@ contract StakingCaller { /// @dev This function showcases the possibility to deposit into the contract /// and immediately delegate to a validator using the same balance in the same transaction. - function approveDepositAndDelegate(string memory _validatorAddr) payable public { + function approveDepositAndDelegate( + string memory _validatorAddr + ) public payable { bool successTx = staking.STAKING_CONTRACT.approve( address(this), msg.value, @@ -445,7 +498,9 @@ contract StakingCaller { /// @dev This function is suppose to fail because the amount to delegate is /// higher than the amount approved. - function approveDepositAndDelegateExceedingAllowance(string memory _validatorAddr) payable public { + function approveDepositAndDelegateExceedingAllowance( + string memory _validatorAddr + ) public payable { bool successTx = staking.STAKING_CONTRACT.approve( tx.origin, msg.value, @@ -461,7 +516,9 @@ contract StakingCaller { /// @dev This function is suppose to fail because the amount to delegate is /// higher than the amount approved. - function approveDepositDelegateAndFailCustomLogic(string memory _validatorAddr) payable public { + function approveDepositDelegateAndFailCustomLogic( + string memory _validatorAddr + ) public payable { bool successTx = staking.STAKING_CONTRACT.approve( tx.origin, msg.value, @@ -498,14 +555,14 @@ contract StakingCaller { require(successApprove, "delegation approval failed"); (bool success, ) = _contract.call( - abi.encodeWithSignature("transfer(address,uint256)", msg.sender, _amount) + abi.encodeWithSignature( + "transfer(address,uint256)", + msg.sender, + _amount + ) ); require(success, "transfer failed"); - staking.STAKING_CONTRACT.delegate( - msg.sender, - _validatorAddr, - _amount - ); + staking.STAKING_CONTRACT.delegate(msg.sender, _validatorAddr, _amount); } -} +} \ No newline at end of file diff --git a/precompiles/staking/utils_test.go b/precompiles/staking/utils_test.go index dafebbb836..3b4bd03ae1 100644 --- a/precompiles/staking/utils_test.go +++ b/precompiles/staking/utils_test.go @@ -1,6 +1,7 @@ package staking_test import ( + "encoding/base64" "encoding/json" "fmt" "math/big" @@ -17,6 +18,7 @@ import ( "github.com/cosmos/cosmos-sdk/baseapp" codectypes "github.com/cosmos/cosmos-sdk/codec/types" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/cosmos/cosmos-sdk/testutil/mock" sdk "github.com/cosmos/cosmos-sdk/types" @@ -572,3 +574,11 @@ func (s *PrecompileTestSuite) setupVestingAccount(funder, vestAcc sdk.AccAddress return clawbackAccount } + +// Generate the Base64 encoded PubKey associated with a PrivKey generated with +// the ed25519 algorithm used in Tendermint nodes. +func GenerateBase64PubKey() string { + privKey := ed25519.GenPrivKey() + pubKey := privKey.PubKey().(*ed25519.PubKey) + return base64.StdEncoding.EncodeToString(pubKey.Bytes()) +} diff --git a/precompiles/testutil/contracts/types.go b/precompiles/testutil/contracts/types.go index 66e69bf166..bea3d71e70 100644 --- a/precompiles/testutil/contracts/types.go +++ b/precompiles/testutil/contracts/types.go @@ -10,7 +10,6 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" ) // CallArgs is a struct to define all relevant data to call a smart contract. @@ -72,7 +71,7 @@ func (c CallArgs) WithGasLimit(gasLimit uint64) CallArgs { } // WithPrivKey returns the CallArgs with the given private key. -func (c CallArgs) WithPrivKey(privKey *ethsecp256k1.PrivKey) CallArgs { +func (c CallArgs) WithPrivKey(privKey cryptotypes.PrivKey) CallArgs { c.PrivKey = privKey return c } From 4dcb43d38be73af3320bf3be0ccb18001fea4b8f Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Tue, 11 Jun 2024 09:48:01 -0300 Subject: [PATCH 283/345] chore(precompiles): update distribution precompile (#2614) * chore(precompiles): update distribution precompile * add changelog entry * add more test cases * Update CHANGELOG.md Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Signed-off-by: Tom <54514587+GAtom22@users.noreply.github.com> --------- Signed-off-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> --- CHANGELOG.md | 1 + precompiles/distribution/integration_test.go | 162 ++++++++++++++++- precompiles/distribution/tx.go | 65 ++++++- .../contracts/DistributionCaller.json | 17 +- .../testutil/contracts/DistributionCaller.sol | 164 +++++++++--------- 5 files changed, 318 insertions(+), 91 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 99f3dd5e35..1d19215535 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -55,6 +55,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (staking) [#2051](https://github.com/evmos/evmos/pull/2051) Implement the `EditValidator` function for staking precompiled contract. - (evm) [#2538](https://github.com/evmos/evmos/pull/2538) Add Permissions Policy for permissioned EVM. - (erc20) [#2609] (https://github.com/evmos/evmos/pull/2609) Remove STRv2 tracking logic. +- (distribution-precompile) [#2614] (https://github.com/evmos/evmos/pull/2614) Add withdrawer address check in transactions. ### Bug Fixes diff --git a/precompiles/distribution/integration_test.go b/precompiles/distribution/integration_test.go index f1daaa7f22..59ae287f69 100644 --- a/precompiles/distribution/integration_test.go +++ b/precompiles/distribution/integration_test.go @@ -20,6 +20,7 @@ import ( evmosutil "github.com/evmos/evmos/v18/testutil" testutiltx "github.com/evmos/evmos/v18/testutil/tx" "github.com/evmos/evmos/v18/utils" + //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" //nolint:revive // dot imports are fine for Ginkgo @@ -173,6 +174,52 @@ var _ = Describe("Calling distribution precompile from EOA", func() { expFinal := initialBalance.Amount.Int64() + expRewardAmt.Int64() - fees Expect(finalBalance.Amount.Equal(math.NewInt(expFinal))).To(BeTrue(), "expected final balance to be equal to initial balance + rewards - fees") }) + + It("should withdraw delegation rewards to a smart contract", func() { + // deploy a smart contract to use as withdrawer + distributionCallerContract, err := contracts.LoadDistributionCallerContract() + Expect(err).To(BeNil(), "error while loading the smart contract: %v", err) + + contractAddr, err := s.DeployContract(distributionCallerContract) + Expect(err).To(BeNil(), "error while deploying the smart contract: %v", err) + + initialWithdrawerBalance := s.app.BankKeeper.GetBalance(s.ctx, contractAddr.Bytes(), s.bondDenom) + Expect(initialWithdrawerBalance.Amount).To(Equal(sdk.ZeroInt())) + + // set contract address as withdrawer address + err = s.app.DistrKeeper.SetWithdrawAddr(s.ctx, s.address.Bytes(), contractAddr.Bytes()) + Expect(err).To(BeNil()) + + // get tx sender initial balance + initialBalance := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + + withdrawRewardsArgs := defaultWithdrawRewardsArgs. + WithArgs(s.address, s.validators[0].OperatorAddress). + WithGasPrice(gasPrice) + + withdrawalCheck := passCheck. + WithExpEvents(distribution.EventTypeWithdrawDelegatorRewards) + + res, ethRes, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, withdrawRewardsArgs, withdrawalCheck) + Expect(err).To(BeNil(), "error while calling the precompile") + + var rewards []cmn.Coin + err = s.precompile.UnpackIntoInterface(&rewards, distribution.WithdrawDelegatorRewardsMethod, ethRes.Ret) + Expect(err).To(BeNil()) + Expect(len(rewards)).To(Equal(1)) + Expect(rewards[0].Denom).To(Equal(s.bondDenom)) + Expect(rewards[0].Amount).To(Equal(expRewardAmt)) + + // check tx sender balance is reduced by fees paid + finalBalance := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + fees := sdk.NewIntFromBigInt(gasPrice).MulRaw(res.GasUsed) + expFinal := initialBalance.Amount.Sub(fees) + Expect(finalBalance.Amount).To(Equal(expFinal), "expected final balance to be equal to initial balance - fees") + + // check that the rewards were added to the withdrawer balance + finalWithdrawerBalance := s.app.BankKeeper.GetBalance(s.ctx, contractAddr.Bytes(), s.bondDenom) + Expect(finalWithdrawerBalance.Amount.BigInt()).To(Equal(expRewardAmt)) + }) }) Describe("Validator Commission: Execute WithdrawValidatorCommission tx", func() { @@ -258,6 +305,52 @@ var _ = Describe("Calling distribution precompile from EOA", func() { expFinal := initialBalance.Amount.Int64() + expCommAmt.Int64() - fees Expect(finalBalance.Amount.Equal(math.NewInt(expFinal))).To(BeTrue(), "expected final balance to be equal to the final balance after withdrawing commission") }) + + It("should withdraw validator commission to a smart contract", func() { + // deploy a smart contract to use as withdrawer + distributionCallerContract, err := contracts.LoadDistributionCallerContract() + Expect(err).To(BeNil(), "error while loading the smart contract: %v", err) + + contractAddr, err := s.DeployContract(distributionCallerContract) + Expect(err).To(BeNil(), "error while deploying the smart contract: %v", err) + + initialWithdrawerBalance := s.app.BankKeeper.GetBalance(s.ctx, contractAddr.Bytes(), s.bondDenom) + Expect(initialWithdrawerBalance.Amount).To(Equal(sdk.ZeroInt())) + + // set contract address as withdrawer address + err = s.app.DistrKeeper.SetWithdrawAddr(s.ctx, s.address.Bytes(), contractAddr.Bytes()) + Expect(err).To(BeNil()) + + // initial balance should be the initial amount minus the staked amount used to create the validator, minus fees paid for deploying contract + initialBalance := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + Expect(initialBalance.Amount).To(Equal(math.NewInt(4997609489499999900))) + + withdrawCommissionArgs := defaultWithdrawCommissionArgs. + WithArgs(valAddr.String()). + WithGasPrice(gasPrice) + + withdrawalCheck := passCheck. + WithExpEvents(distribution.EventTypeWithdrawValidatorCommission) + + res, ethRes, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, withdrawCommissionArgs, withdrawalCheck) + Expect(err).To(BeNil(), "error while calling the precompile") + + var comm []cmn.Coin + err = s.precompile.UnpackIntoInterface(&comm, distribution.WithdrawValidatorCommissionMethod, ethRes.Ret) + Expect(err).To(BeNil()) + Expect(len(comm)).To(Equal(1)) + Expect(comm[0].Denom).To(Equal(s.bondDenom)) + Expect(comm[0].Amount).To(Equal(expCommAmt)) + + finalBalance := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + fees := sdk.NewIntFromBigInt(gasPrice).MulRaw(res.GasUsed) + expFinal := initialBalance.Amount.Sub(fees) + Expect(finalBalance.Amount).To(Equal(expFinal), "expected final balance to be equal to the final balance after withdrawing commission") + + // check that the commission was added to the withdrawer balance + finalWithdrawerBalance := s.app.BankKeeper.GetBalance(s.ctx, contractAddr.Bytes(), s.bondDenom) + Expect(finalWithdrawerBalance.Amount.BigInt()).To(Equal(expCommAmt)) + }) }) Describe("Execute ClaimRewards transaction", func() { @@ -769,6 +862,31 @@ var _ = Describe("Calling distribution precompile from another contract", func() finalBalance := s.app.BankKeeper.GetBalance(s.ctx, contractAddr.Bytes(), s.bondDenom) Expect(finalBalance.Amount.GT(initialBalance.Amount)).To(BeTrue(), "expected final balance to be greater than initial balance after withdrawing rewards") }) + + It("should withdraw rewards successfully without origin check to a withdrawer address", func() { + withdrawerAddr, _ := testutiltx.NewAccAddressAndKey() + + initialWithdrawerBalance := s.app.BankKeeper.GetBalance(s.ctx, withdrawerAddr.Bytes(), s.bondDenom) + Expect(initialWithdrawerBalance.Amount).To(Equal(sdk.ZeroInt())) + + err := s.app.DistrKeeper.SetWithdrawAddr(s.ctx, contractAddr.Bytes(), withdrawerAddr.Bytes()) + Expect(err).To(BeNil()) + + withdrawDelRewardsArgs := defaultWithdrawDelRewardsArgs.WithArgs(s.validators[0].OperatorAddress) + + logCheckArgs := passCheck.WithExpEvents(distribution.EventTypeWithdrawDelegatorRewards) + + _, _, err = contracts.CallContractAndCheckLogs(s.ctx, s.app, withdrawDelRewardsArgs, logCheckArgs) + Expect(err).To(BeNil(), "error while calling the smart contract: %v", err) + + // withdrawer balance should increase with the rewards amt + finalWithdrawerBalance := s.app.BankKeeper.GetBalance(s.ctx, withdrawerAddr.Bytes(), s.bondDenom) + Expect(finalWithdrawerBalance.Amount.Equal(rewards)).To(BeTrue(), "expected final balance to be greater than initial balance after withdrawing rewards") + + // delegator balance (contract) should remain unchanged + finalDelegatorBalance := s.app.BankKeeper.GetBalance(s.ctx, contractAddr.Bytes(), s.bondDenom) + Expect(finalDelegatorBalance.Amount.Equal(initialBalance.Amount)).To(BeTrue(), "expected delegator final balance remain unchanged after withdrawing rewards to withdrawer") + }) }) Context("withdrawValidatorCommission", func() { @@ -852,6 +970,31 @@ var _ = Describe("Calling distribution precompile from another contract", func() expFinal := initialBalance.Amount.Int64() + expValAmount - fees Expect(finalBalance.Amount).To(Equal(math.NewInt(expFinal)), "expected final balance to be equal to initial balance + validator commission - fees") }) + + It("should withdraw commission successfully to withdrawer address (contract)", func() { + initialWithdrawerBalance := s.app.BankKeeper.GetBalance(s.ctx, contractAddr.Bytes(), s.bondDenom) + Expect(initialWithdrawerBalance.Amount).To(Equal(sdk.ZeroInt())) + + err := s.app.DistrKeeper.SetWithdrawAddr(s.ctx, s.address.Bytes(), contractAddr.Bytes()) + Expect(err).To(BeNil()) + + withdrawValCommArgs := defaultWithdrawValCommArgs. + WithArgs(valAddr.String()). + WithGasPrice(gasPrice) + logCheckArgs := passCheck. + WithExpEvents(distribution.EventTypeWithdrawValidatorCommission) + + res, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, withdrawValCommArgs, logCheckArgs) + Expect(err).To(BeNil(), "error while calling the smart contract: %v", err) + + finalWithdrawerBalance := s.app.BankKeeper.GetBalance(s.ctx, contractAddr.Bytes(), s.bondDenom) + Expect(finalWithdrawerBalance.Amount).To(Equal(math.NewInt(expValAmount)), "expected final balance to be equal to initial balance + validator commission") + + finalBalance := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + fees := gasPrice.Int64() * res.GasUsed + expFinal := initialBalance.Amount.Int64() - fees + Expect(finalBalance.Amount).To(Equal(math.NewInt(expFinal)), "expected final balance to be equal to initial balance - fees") + }) }) Context("claimRewards", func() { @@ -938,7 +1081,6 @@ var _ = Describe("Calling distribution precompile from another contract", func() }...) expectedBalance = sdk.Coin{Denom: utils.BaseDenom, Amount: math.NewInt(2e18)} - // populate default arguments defaultClaimRewardsArgs = defaultCallArgs.WithMethodName( "testClaimRewards", @@ -959,9 +1101,13 @@ var _ = Describe("Calling distribution precompile from another contract", func() }) It("should withdraw rewards successfully to a different address without origin check", func() { - initialBalance := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + withdrawerAddr, _ := testutiltx.NewAccAddressAndKey() + initialWithdrawerBalance := s.app.BankKeeper.GetBalance(s.ctx, withdrawerAddr.Bytes(), s.bondDenom) + Expect(initialWithdrawerBalance.Amount).To(Equal(sdk.ZeroInt())) - err := s.app.DistrKeeper.SetWithdrawAddr(s.ctx, contractAddr.Bytes(), s.address.Bytes()) + initialDelegatorBalance := s.app.BankKeeper.GetBalance(s.ctx, contractAddr.Bytes(), s.bondDenom) + + err := s.app.DistrKeeper.SetWithdrawAddr(s.ctx, contractAddr.Bytes(), withdrawerAddr.Bytes()) Expect(err).To(BeNil()) claimRewardsArgs := defaultClaimRewardsArgs.WithArgs(contractAddr, uint32(2)) @@ -971,9 +1117,13 @@ var _ = Describe("Calling distribution precompile from another contract", func() _, _, err = contracts.CallContractAndCheckLogs(s.ctx, s.app, claimRewardsArgs, logCheckArgs) Expect(err).To(BeNil(), "error while calling the smart contract: %v", err) - // balance should increase - finalBalance := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) - Expect(finalBalance.Amount.GT(initialBalance.Amount)).To(BeTrue(), "expected final balance to be greater than initial balance after withdrawing rewards") + // withdrawer balance should increase + finalWithdrawerBalance := s.app.BankKeeper.GetBalance(s.ctx, withdrawerAddr.Bytes(), s.bondDenom) + Expect(finalWithdrawerBalance.Equal(expectedBalance)).To(BeTrue(), "expected final withdrawer balance to be greater than initial balance after withdrawing rewards") + + // delegator (contract) balance should remain unchanged + finalDelegatorBalance := s.app.BankKeeper.GetBalance(s.ctx, contractAddr.Bytes(), s.bondDenom) + Expect(finalDelegatorBalance.Amount.Equal(initialDelegatorBalance.Amount)).To(BeTrue(), "expected final delegator balance to same as initial balance after withdrawing rewards") }) }) diff --git a/precompiles/distribution/tx.go b/precompiles/distribution/tx.go index 52d736277a..3c758dab21 100644 --- a/precompiles/distribution/tx.go +++ b/precompiles/distribution/tx.go @@ -14,6 +14,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" distributionkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" + distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/core/vm" ) @@ -71,6 +72,20 @@ func (p Precompile) ClaimRewards( totalCoins = totalCoins.Add(coins...) } + // rewards go to the withdrawer address + // check if it is a contract + ok, withdrawerHexAddr, err := p.isContractWithdrawer(ctx, stateDB, sdk.AccAddress(delegatorAddr.Bytes())) + if err != nil { + return nil, err + } + + // NOTE: This ensures that the changes in the bank keeper are correctly mirrored to the EVM stateDB. + // This prevents the stateDB from overwriting the changed balance in the bank keeper when committing the EVM state. + // this happens when the precompile is called from a smart contract + if ok && contract.CallerAddress != origin { + stateDB.(*statedb.StateDB).AddBalance(withdrawerHexAddr, totalCoins[0].Amount.BigInt()) + } + if err := p.EmitClaimRewardsEvent(ctx, stateDB, delegatorAddr, totalCoins); err != nil { return nil, err } @@ -138,14 +153,21 @@ func (p Precompile) WithdrawDelegatorRewards( return nil, err } - if err = p.EmitWithdrawDelegatorRewardsEvent(ctx, stateDB, delegatorHexAddr, msg.ValidatorAddress, res.Amount); err != nil { + // rewards go to the withdrawer address + // check if it is a contract + ok, withdrawerHexAddr, err := p.isContractWithdrawer(ctx, stateDB, sdk.AccAddress(delegatorHexAddr.Bytes())) + if err != nil { return nil, err } // NOTE: This ensures that the changes in the bank keeper are correctly mirrored to the EVM stateDB. // This prevents the stateDB from overwriting the changed balance in the bank keeper when committing the EVM state. - if isContractDelegator { - stateDB.(*statedb.StateDB).AddBalance(contract.CallerAddress, res.Amount[0].Amount.BigInt()) + if ok && contract.CallerAddress != origin { + stateDB.(*statedb.StateDB).AddBalance(withdrawerHexAddr, res.Amount[0].Amount.BigInt()) + } + + if err = p.EmitWithdrawDelegatorRewardsEvent(ctx, stateDB, delegatorHexAddr, msg.ValidatorAddress, res.Amount); err != nil { + return nil, err } return method.Outputs.Pack(cmn.NewCoinsResponse(res.Amount)) @@ -178,9 +200,46 @@ func (p Precompile) WithdrawValidatorCommission( return nil, err } + // commissions go to the withdrawer address + // check if it is a contract + ok, withdrawerHexAddr, err := p.isContractWithdrawer(ctx, stateDB, sdk.AccAddress(validatorHexAddr.Bytes())) + if err != nil { + return nil, err + } + // NOTE: This ensures that the changes in the bank keeper are correctly mirrored to the EVM stateDB. + // This prevents the stateDB from overwriting the changed balance in the bank keeper when committing the EVM state. + if ok && contract.CallerAddress != origin { + stateDB.(*statedb.StateDB).AddBalance(withdrawerHexAddr, res.Amount[0].Amount.BigInt()) + } + if err = p.EmitWithdrawValidatorCommissionEvent(ctx, stateDB, msg.ValidatorAddress, res.Amount); err != nil { return nil, err } return method.Outputs.Pack(cmn.NewCoinsResponse(res.Amount)) } + +// isContractWithdrawer is a helper function to check if the withdrawer address of a +// delegator is a smart contract. It returns a boolean specifying if the withdrawer +// is a smart contract, and the corresponding withdrawer hex address +func (p Precompile) isContractWithdrawer(ctx sdk.Context, stateDB vm.StateDB, delegatorAccAddr sdk.AccAddress) (bool, common.Address, error) { + // check if withdrawer address is a contract + querier := distributionkeeper.Querier{Keeper: p.distributionKeeper} + qRes, err := querier.DelegatorWithdrawAddress( + ctx, + &distributiontypes.QueryDelegatorWithdrawAddressRequest{ + DelegatorAddress: delegatorAccAddr.String(), + }, + ) + if err != nil { + return false, common.Address{}, err + } + + withdrawerAccAddr, err := sdk.AccAddressFromBech32(qRes.WithdrawAddress) + if err != nil { + return false, common.Address{}, err + } + + withdrawerHexAddr := common.BytesToAddress(withdrawerAccAddr) + return stateDB.GetCodeSize(withdrawerHexAddr) > 0, withdrawerHexAddr, nil +} diff --git a/precompiles/testutil/contracts/DistributionCaller.json b/precompiles/testutil/contracts/DistributionCaller.json index 10d145e26e..87a97ee07e 100644 --- a/precompiles/testutil/contracts/DistributionCaller.json +++ b/precompiles/testutil/contracts/DistributionCaller.json @@ -3,6 +3,19 @@ "contractName": "DistributionCaller", "sourceName": "solidity/precompiles/testutil/contracts/DistributionCaller.sol", "abi": [ + { + "inputs": [], + "name": "counter", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -658,8 +671,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b50612f60806100206000396000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c806388b2d581116100a2578063b6a216ae11610071578063b6a216ae14610364578063cb85aa0a14610394578063d3f831be146103c4578063e0421e39146103f4578063e236c7a61461042457610116565b806388b2d581146102a3578063963516e4146102d45780639819459314610304578063b2d178831461033457610116565b806346e16d34116100e957806346e16d34146101c75780636f669da4146101f757806378a5dfd114610227578063796b96d2146102575780637c9db0bb1461027357610116565b806301b680001461011b5780630c05e9e41461014b578063296c60aa1461017b5780632d0ee16a14610197575b600080fd5b610135600480360381019061013091906111e1565b610455565b604051610142919061129e565b60405180910390f35b610165600480360381019061016091906113f5565b61059d565b6040516101729190611638565b60405180910390f35b6101956004803603810190610190919061165a565b61062d565b005b6101b160048036038101906101ac91906113f5565b61076e565b6040516101be91906117b5565b60405180910390f35b6101e160048036038101906101dc919061165a565b6107fc565b6040516101ee91906117f2565b60405180910390f35b610211600480360381019061020c9190611849565b610886565b60405161021e91906117f2565b60405180910390f35b610241600480360381019061023c919061165a565b610910565b60405161024e919061190f565b60405180910390f35b610271600480360381019061026c919061165a565b61099d565b005b61028d600480360381019061028891906113f5565b610ade565b60405161029a919061190f565b60405180910390f35b6102bd60048036038101906102b89190611995565b610b68565b6040516102cb929190611bd7565b60405180910390f35b6102ee60048036038101906102e991906113f5565b610c06565b6040516102fb91906117f2565b60405180910390f35b61031e6004803603810190610319919061165a565b610c8f565b60405161032b91906117b5565b60405180910390f35b61034e60048036038101906103499190611c0e565b610d1e565b60405161035b91906117b5565b60405180910390f35b61037e600480360381019061037991906111e1565b610e73565b60405161038b9190611d5b565b60405180910390f35b6103ae60048036038101906103a991906111e1565b610efd565b6040516103bb9190611dc7565b60405180910390f35b6103de60048036038101906103d991906113f5565b610f87565b6040516103eb919061190f565b60405180910390f35b61040e600480360381019061040991906113f5565b611011565b60405161041b91906117b5565b60405180910390f35b61043e600480360381019061043991906111e1565b61109d565b60405161044c929190611eef565b60405180910390f35b606060008061080173ffffffffffffffffffffffffffffffffffffffff16846040516024016104849190611f35565b6040516020818303038152906040527f5431f450000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161050e9190611f8c565b600060405180830381855afa9150503d8060008114610549576040519150601f19603f3d011682016040523d82523d6000602084013e61054e565b606091505b509150915081610593576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058a90611fef565b60405180910390fd5b8092505050919050565b6105a561112a565b61080173ffffffffffffffffffffffffffffffffffffffff166354212a89836040518263ffffffff1660e01b81526004016105e09190611dc7565b600060405180830381865afa1580156105fd573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061062691906122ff565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff16838360405160240161065b929190612348565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516106e59190611f8c565b600060405180830381855af49150503d8060008114610720576040519150601f19603f3d011682016040523d82523d6000602084013e610725565b606091505b5050905080610769576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610760906123ea565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6130846040518363ffffffff1660e01b81526004016107ad929190612348565b6000604051808303816000875af11580156107cc573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906107f59190612557565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9684846040518363ffffffff1660e01b815260040161083b929190612348565b6020604051808303816000875af115801561085a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087e91906125cc565b905092915050565b600061080173ffffffffffffffffffffffffffffffffffffffff16632efe8a5f84846040518363ffffffff1660e01b81526004016108c5929190612608565b6020604051808303816000875af11580156108e4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090891906125cc565b905092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff16639ad563b484846040518363ffffffff1660e01b815260040161094f929190612348565b600060405180830381865afa15801561096c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906109959190612631565b905092915050565b600061080173ffffffffffffffffffffffffffffffffffffffff1683836040516024016109cb929190612348565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610a559190611f8c565b600060405180830381855afa9150503d8060008114610a90576040519150601f19603f3d011682016040523d82523d6000602084013e610a95565b606091505b5050905080610ad9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad090611fef565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633dd40f78836040518263ffffffff1660e01b8152600401610b1b9190611dc7565b600060405180830381865afa158015610b38573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610b619190612631565b9050919050565b6060610b7261114b565b61080173ffffffffffffffffffffffffffffffffffffffff16638f2473ce878787876040518563ffffffff1660e01b8152600401610bb3949392919061281a565b600060405180830381865afa158015610bd0573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610bf99190612af2565b9150915094509492505050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9630846040518363ffffffff1660e01b8152600401610c45929190612348565b6020604051808303816000875af1158015610c64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8891906125cc565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6184846040518363ffffffff1660e01b8152600401610cce929190612348565b6000604051808303816000875af1158015610ced573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610d169190612557565b905092915050565b6060600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9633876040518363ffffffff1660e01b8152600401610d5f929190612348565b6020604051808303816000875af1158015610d7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da291906125cc565b905080610de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddb90612bb6565b60405180910390fd5b61080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6185856040518363ffffffff1660e01b8152600401610e21929190612348565b6000604051808303816000875af1158015610e40573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610e699190612557565b9150509392505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663a66cb605836040518263ffffffff1660e01b8152600401610eb09190611f35565b600060405180830381865afa158015610ecd573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610ef69190612cb7565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff16635431f450836040518263ffffffff1660e01b8152600401610f3a9190611f35565b600060405180830381865afa158015610f57573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610f809190612d00565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff166385b2d2da836040518263ffffffff1660e01b8152600401610fc49190611dc7565b600060405180830381865afa158015610fe1573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061100a9190612631565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633ce4e3be836040518263ffffffff1660e01b815260040161104e9190611dc7565b6000604051808303816000875af115801561106d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110969190612557565b9050919050565b60608061080173ffffffffffffffffffffffffffffffffffffffff166354be1a28846040518263ffffffff1660e01b81526004016110db9190611f35565b600060405180830381865afa1580156110f8573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906111219190612eb2565b91509150915091565b60405180606001604052806060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006111ae82611183565b9050919050565b6111be816111a3565b81146111c957600080fd5b50565b6000813590506111db816111b5565b92915050565b6000602082840312156111f7576111f6611179565b5b6000611205848285016111cc565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561124857808201518184015260208101905061122d565b60008484015250505050565b6000601f19601f8301169050919050565b60006112708261120e565b61127a8185611219565b935061128a81856020860161122a565b61129381611254565b840191505092915050565b600060208201905081810360008301526112b88184611265565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61130282611254565b810181811067ffffffffffffffff82111715611321576113206112ca565b5b80604052505050565b600061133461116f565b905061134082826112f9565b919050565b600067ffffffffffffffff8211156113605761135f6112ca565b5b61136982611254565b9050602081019050919050565b82818337600083830152505050565b600061139861139384611345565b61132a565b9050828152602081018484840111156113b4576113b36112c5565b5b6113bf848285611376565b509392505050565b600082601f8301126113dc576113db6112c0565b5b81356113ec848260208601611385565b91505092915050565b60006020828403121561140b5761140a611179565b5b600082013567ffffffffffffffff8111156114295761142861117e565b5b611435848285016113c7565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60006114658261143e565b61146f8185611449565b935061147f81856020860161122a565b61148881611254565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000819050919050565b6114d2816114bf565b82525050565b600060ff82169050919050565b6114ee816114d8565b82525050565b60006060830160008301518482036000860152611511828261145a565b915050602083015161152660208601826114c9565b50604083015161153960408601826114e5565b508091505092915050565b600061155083836114f4565b905092915050565b6000602082019050919050565b600061157082611493565b61157a818561149e565b93508360208202850161158c856114af565b8060005b858110156115c857848403895281516115a98582611544565b94506115b483611558565b925060208a01995050600181019050611590565b50829750879550505050505092915050565b600060608301600083015184820360008601526115f7828261145a565b915050602083015184820360208601526116118282611565565b9150506040830151848203604086015261162b8282611565565b9150508091505092915050565b6000602082019050818103600083015261165281846115da565b905092915050565b6000806040838503121561167157611670611179565b5b600061167f858286016111cc565b925050602083013567ffffffffffffffff8111156116a05761169f61117e565b5b6116ac858286016113c7565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060408301600083015184820360008601526116ff828261145a565b915050602083015161171460208601826114c9565b508091505092915050565b600061172b83836116e2565b905092915050565b6000602082019050919050565b600061174b826116b6565b61175581856116c1565b935083602082028501611767856116d2565b8060005b858110156117a35784840389528151611784858261171f565b945061178f83611733565b925060208a0199505060018101905061176b565b50829750879550505050505092915050565b600060208201905081810360008301526117cf8184611740565b905092915050565b60008115159050919050565b6117ec816117d7565b82525050565b600060208201905061180760008301846117e3565b92915050565b600063ffffffff82169050919050565b6118268161180d565b811461183157600080fd5b50565b6000813590506118438161181d565b92915050565b600080604083850312156118605761185f611179565b5b600061186e858286016111cc565b925050602061187f85828601611834565b9150509250929050565b600082825260208201905092915050565b60006118a582611493565b6118af8185611889565b9350836020820285016118c1856114af565b8060005b858110156118fd57848403895281516118de8582611544565b94506118e983611558565b925060208a019950506001810190506118c5565b50829750879550505050505092915050565b60006020820190508181036000830152611929818461189a565b905092915050565b600067ffffffffffffffff82169050919050565b61194e81611931565b811461195957600080fd5b50565b60008135905061196b81611945565b92915050565b600080fd5b600060a0828403121561198c5761198b611971565b5b81905092915050565b600080600080608085870312156119af576119ae611179565b5b600085013567ffffffffffffffff8111156119cd576119cc61117e565b5b6119d9878288016113c7565b94505060206119ea8782880161195c565b93505060406119fb8782880161195c565b925050606085013567ffffffffffffffff811115611a1c57611a1b61117e565b5b611a2887828801611976565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611a6981611931565b82525050565b604082016000820151611a8560008501826114c9565b506020820151611a9860208501826114e5565b50505050565b606082016000820151611ab46000850182611a60565b506020820151611ac76020850182611a6f565b50505050565b6000611ad98383611a9e565b60608301905092915050565b6000602082019050919050565b6000611afd82611a34565b611b078185611a3f565b9350611b1283611a50565b8060005b83811015611b43578151611b2a8882611acd565b9750611b3583611ae5565b925050600181019050611b16565b5085935050505092915050565b600082825260208201905092915050565b6000611b6c8261120e565b611b768185611b50565b9350611b8681856020860161122a565b611b8f81611254565b840191505092915050565b60006040830160008301518482036000860152611bb78282611b61565b9150506020830151611bcc6020860182611a60565b508091505092915050565b60006040820190508181036000830152611bf18185611af2565b90508181036020830152611c058184611b9a565b90509392505050565b600080600060608486031215611c2757611c26611179565b5b600084013567ffffffffffffffff811115611c4557611c4461117e565b5b611c51868287016113c7565b9350506020611c62868287016111cc565b925050604084013567ffffffffffffffff811115611c8357611c8261117e565b5b611c8f868287016113c7565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000611cd1838361145a565b905092915050565b6000602082019050919050565b6000611cf182611c99565b611cfb8185611ca4565b935083602082028501611d0d85611cb5565b8060005b85811015611d495784840389528151611d2a8582611cc5565b9450611d3583611cd9565b925060208a01995050600181019050611d11565b50829750879550505050505092915050565b60006020820190508181036000830152611d758184611ce6565b905092915050565b600082825260208201905092915050565b6000611d998261143e565b611da38185611d7d565b9350611db381856020860161122a565b611dbc81611254565b840191505092915050565b60006020820190508181036000830152611de18184611d8e565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006040830160008301518482036000860152611e32828261145a565b91505060208301518482036020860152611e4c8282611565565b9150508091505092915050565b6000611e658383611e15565b905092915050565b6000602082019050919050565b6000611e8582611de9565b611e8f8185611df4565b935083602082028501611ea185611e05565b8060005b85811015611edd5784840389528151611ebe8582611e59565b9450611ec983611e6d565b925060208a01995050600181019050611ea5565b50829750879550505050505092915050565b60006040820190508181036000830152611f098185611e7a565b90508181036020830152611f1d818461189a565b90509392505050565b611f2f816111a3565b82525050565b6000602082019050611f4a6000830184611f26565b92915050565b600081905092915050565b6000611f668261120e565b611f708185611f50565b9350611f8081856020860161122a565b80840191505092915050565b6000611f988284611f5b565b915081905092915050565b7f6661696c65642073746174696343616c6c20746f20707265636f6d70696c6500600082015250565b6000611fd9601f83611d7d565b9150611fe482611fa3565b602082019050919050565b6000602082019050818103600083015261200881611fcc565b9050919050565b600080fd5b600080fd5b600061202c61202784611345565b61132a565b905082815260208101848484011115612048576120476112c5565b5b61205384828561122a565b509392505050565b600082601f8301126120705761206f6112c0565b5b8151612080848260208601612019565b91505092915050565b600067ffffffffffffffff8211156120a4576120a36112ca565b5b602082029050602081019050919050565b600080fd5b6120c3816114bf565b81146120ce57600080fd5b50565b6000815190506120e0816120ba565b92915050565b6120ef816114d8565b81146120fa57600080fd5b50565b60008151905061210c816120e6565b92915050565b6000606082840312156121285761212761200f565b5b612132606061132a565b9050600082015167ffffffffffffffff81111561215257612151612014565b5b61215e8482850161205b565b6000830152506020612172848285016120d1565b6020830152506040612186848285016120fd565b60408301525092915050565b60006121a56121a084612089565b61132a565b905080838252602082019050602084028301858111156121c8576121c76120b5565b5b835b8181101561220f57805167ffffffffffffffff8111156121ed576121ec6112c0565b5b8086016121fa8982612112565b855260208501945050506020810190506121ca565b5050509392505050565b600082601f83011261222e5761222d6112c0565b5b815161223e848260208601612192565b91505092915050565b60006060828403121561225d5761225c61200f565b5b612267606061132a565b9050600082015167ffffffffffffffff81111561228757612286612014565b5b6122938482850161205b565b600083015250602082015167ffffffffffffffff8111156122b7576122b6612014565b5b6122c384828501612219565b602083015250604082015167ffffffffffffffff8111156122e7576122e6612014565b5b6122f384828501612219565b60408301525092915050565b60006020828403121561231557612314611179565b5b600082015167ffffffffffffffff8111156123335761233261117e565b5b61233f84828501612247565b91505092915050565b600060408201905061235d6000830185611f26565b818103602083015261236f8184611d8e565b90509392505050565b7f6661696c65642064656c656761746543616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b60006123d4602183611d7d565b91506123df82612378565b604082019050919050565b60006020820190508181036000830152612403816123c7565b9050919050565b600067ffffffffffffffff821115612425576124246112ca565b5b602082029050602081019050919050565b60006040828403121561244c5761244b61200f565b5b612456604061132a565b9050600082015167ffffffffffffffff81111561247657612475612014565b5b6124828482850161205b565b6000830152506020612496848285016120d1565b60208301525092915050565b60006124b56124b08461240a565b61132a565b905080838252602082019050602084028301858111156124d8576124d76120b5565b5b835b8181101561251f57805167ffffffffffffffff8111156124fd576124fc6112c0565b5b80860161250a8982612436565b855260208501945050506020810190506124da565b5050509392505050565b600082601f83011261253e5761253d6112c0565b5b815161254e8482602086016124a2565b91505092915050565b60006020828403121561256d5761256c611179565b5b600082015167ffffffffffffffff81111561258b5761258a61117e565b5b61259784828501612529565b91505092915050565b6125a9816117d7565b81146125b457600080fd5b50565b6000815190506125c6816125a0565b92915050565b6000602082840312156125e2576125e1611179565b5b60006125f0848285016125b7565b91505092915050565b6126028161180d565b82525050565b600060408201905061261d6000830185611f26565b61262a60208301846125f9565b9392505050565b60006020828403121561264757612646611179565b5b600082015167ffffffffffffffff8111156126655761266461117e565b5b61267184828501612219565b91505092915050565b61268381611931565b82525050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126126b5576126b4612693565b5b83810192508235915060208301925067ffffffffffffffff8211156126dd576126dc612689565b5b6001820236038313156126f3576126f261268e565b5b509250929050565b60006127078385611b50565b9350612714838584611376565b61271d83611254565b840190509392505050565b6000612737602084018461195c565b905092915050565b60008135905061274e816125a0565b92915050565b6000612763602084018461273f565b905092915050565b612774816117d7565b82525050565b600060a0830161278d6000840184612698565b85830360008701526127a08382846126fb565b925050506127b16020840184612728565b6127be6020860182611a60565b506127cc6040840184612728565b6127d96040860182611a60565b506127e76060840184612754565b6127f4606086018261276b565b506128026080840184612754565b61280f608086018261276b565b508091505092915050565b600060808201905081810360008301526128348187611d8e565b9050612843602083018661267a565b612850604083018561267a565b8181036060830152612862818461277a565b905095945050505050565b600067ffffffffffffffff821115612888576128876112ca565b5b602082029050602081019050919050565b6000815190506128a881611945565b92915050565b6000604082840312156128c4576128c361200f565b5b6128ce604061132a565b905060006128de848285016120d1565b60008301525060206128f2848285016120fd565b60208301525092915050565b6000606082840312156129145761291361200f565b5b61291e604061132a565b9050600061292e84828501612899565b6000830152506020612942848285016128ae565b60208301525092915050565b600061296161295c8461286d565b61132a565b90508083825260208201905060608402830185811115612984576129836120b5565b5b835b818110156129ad578061299988826128fe565b845260208401935050606081019050612986565b5050509392505050565b600082601f8301126129cc576129cb6112c0565b5b81516129dc84826020860161294e565b91505092915050565b600067ffffffffffffffff821115612a00576129ff6112ca565b5b612a0982611254565b9050602081019050919050565b6000612a29612a24846129e5565b61132a565b905082815260208101848484011115612a4557612a446112c5565b5b612a5084828561122a565b509392505050565b600082601f830112612a6d57612a6c6112c0565b5b8151612a7d848260208601612a16565b91505092915050565b600060408284031215612a9c57612a9b61200f565b5b612aa6604061132a565b9050600082015167ffffffffffffffff811115612ac657612ac5612014565b5b612ad284828501612a58565b6000830152506020612ae684828501612899565b60208301525092915050565b60008060408385031215612b0957612b08611179565b5b600083015167ffffffffffffffff811115612b2757612b2661117e565b5b612b33858286016129b7565b925050602083015167ffffffffffffffff811115612b5457612b5361117e565b5b612b6085828601612a86565b9150509250929050565b7f6661696c656420746f2073657420776974686472617720616464726573730000600082015250565b6000612ba0601e83611d7d565b9150612bab82612b6a565b602082019050919050565b60006020820190508181036000830152612bcf81612b93565b9050919050565b600067ffffffffffffffff821115612bf157612bf06112ca565b5b602082029050602081019050919050565b6000612c15612c1084612bd6565b61132a565b90508083825260208201905060208402830185811115612c3857612c376120b5565b5b835b81811015612c7f57805167ffffffffffffffff811115612c5d57612c5c6112c0565b5b808601612c6a898261205b565b85526020850194505050602081019050612c3a565b5050509392505050565b600082601f830112612c9e57612c9d6112c0565b5b8151612cae848260208601612c02565b91505092915050565b600060208284031215612ccd57612ccc611179565b5b600082015167ffffffffffffffff811115612ceb57612cea61117e565b5b612cf784828501612c89565b91505092915050565b600060208284031215612d1657612d15611179565b5b600082015167ffffffffffffffff811115612d3457612d3361117e565b5b612d408482850161205b565b91505092915050565b600067ffffffffffffffff821115612d6457612d636112ca565b5b602082029050602081019050919050565b600060408284031215612d8b57612d8a61200f565b5b612d95604061132a565b9050600082015167ffffffffffffffff811115612db557612db4612014565b5b612dc18482850161205b565b600083015250602082015167ffffffffffffffff811115612de557612de4612014565b5b612df184828501612219565b60208301525092915050565b6000612e10612e0b84612d49565b61132a565b90508083825260208201905060208402830185811115612e3357612e326120b5565b5b835b81811015612e7a57805167ffffffffffffffff811115612e5857612e576112c0565b5b808601612e658982612d75565b85526020850194505050602081019050612e35565b5050509392505050565b600082601f830112612e9957612e986112c0565b5b8151612ea9848260208601612dfd565b91505092915050565b60008060408385031215612ec957612ec8611179565b5b600083015167ffffffffffffffff811115612ee757612ee661117e565b5b612ef385828601612e84565b925050602083015167ffffffffffffffff811115612f1457612f1361117e565b5b612f2085828601612219565b915050925092905056fea2646970667358221220ca1dd756af2118cc5041e4bd9542a13fbf7b9e315028de6ce067eeaf65d30ed364736f6c63430008130033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101165760003560e01c806388b2d581116100a2578063b6a216ae11610071578063b6a216ae14610364578063cb85aa0a14610394578063d3f831be146103c4578063e0421e39146103f4578063e236c7a61461042457610116565b806388b2d581146102a3578063963516e4146102d45780639819459314610304578063b2d178831461033457610116565b806346e16d34116100e957806346e16d34146101c75780636f669da4146101f757806378a5dfd114610227578063796b96d2146102575780637c9db0bb1461027357610116565b806301b680001461011b5780630c05e9e41461014b578063296c60aa1461017b5780632d0ee16a14610197575b600080fd5b610135600480360381019061013091906111e1565b610455565b604051610142919061129e565b60405180910390f35b610165600480360381019061016091906113f5565b61059d565b6040516101729190611638565b60405180910390f35b6101956004803603810190610190919061165a565b61062d565b005b6101b160048036038101906101ac91906113f5565b61076e565b6040516101be91906117b5565b60405180910390f35b6101e160048036038101906101dc919061165a565b6107fc565b6040516101ee91906117f2565b60405180910390f35b610211600480360381019061020c9190611849565b610886565b60405161021e91906117f2565b60405180910390f35b610241600480360381019061023c919061165a565b610910565b60405161024e919061190f565b60405180910390f35b610271600480360381019061026c919061165a565b61099d565b005b61028d600480360381019061028891906113f5565b610ade565b60405161029a919061190f565b60405180910390f35b6102bd60048036038101906102b89190611995565b610b68565b6040516102cb929190611bd7565b60405180910390f35b6102ee60048036038101906102e991906113f5565b610c06565b6040516102fb91906117f2565b60405180910390f35b61031e6004803603810190610319919061165a565b610c8f565b60405161032b91906117b5565b60405180910390f35b61034e60048036038101906103499190611c0e565b610d1e565b60405161035b91906117b5565b60405180910390f35b61037e600480360381019061037991906111e1565b610e73565b60405161038b9190611d5b565b60405180910390f35b6103ae60048036038101906103a991906111e1565b610efd565b6040516103bb9190611dc7565b60405180910390f35b6103de60048036038101906103d991906113f5565b610f87565b6040516103eb919061190f565b60405180910390f35b61040e600480360381019061040991906113f5565b611011565b60405161041b91906117b5565b60405180910390f35b61043e600480360381019061043991906111e1565b61109d565b60405161044c929190611eef565b60405180910390f35b606060008061080173ffffffffffffffffffffffffffffffffffffffff16846040516024016104849190611f35565b6040516020818303038152906040527f5431f450000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161050e9190611f8c565b600060405180830381855afa9150503d8060008114610549576040519150601f19603f3d011682016040523d82523d6000602084013e61054e565b606091505b509150915081610593576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058a90611fef565b60405180910390fd5b8092505050919050565b6105a561112a565b61080173ffffffffffffffffffffffffffffffffffffffff166354212a89836040518263ffffffff1660e01b81526004016105e09190611dc7565b600060405180830381865afa1580156105fd573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061062691906122ff565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff16838360405160240161065b929190612348565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516106e59190611f8c565b600060405180830381855af49150503d8060008114610720576040519150601f19603f3d011682016040523d82523d6000602084013e610725565b606091505b5050905080610769576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610760906123ea565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6130846040518363ffffffff1660e01b81526004016107ad929190612348565b6000604051808303816000875af11580156107cc573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906107f59190612557565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9684846040518363ffffffff1660e01b815260040161083b929190612348565b6020604051808303816000875af115801561085a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087e91906125cc565b905092915050565b600061080173ffffffffffffffffffffffffffffffffffffffff16632efe8a5f84846040518363ffffffff1660e01b81526004016108c5929190612608565b6020604051808303816000875af11580156108e4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090891906125cc565b905092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff16639ad563b484846040518363ffffffff1660e01b815260040161094f929190612348565b600060405180830381865afa15801561096c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906109959190612631565b905092915050565b600061080173ffffffffffffffffffffffffffffffffffffffff1683836040516024016109cb929190612348565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610a559190611f8c565b600060405180830381855afa9150503d8060008114610a90576040519150601f19603f3d011682016040523d82523d6000602084013e610a95565b606091505b5050905080610ad9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad090611fef565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633dd40f78836040518263ffffffff1660e01b8152600401610b1b9190611dc7565b600060405180830381865afa158015610b38573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610b619190612631565b9050919050565b6060610b7261114b565b61080173ffffffffffffffffffffffffffffffffffffffff16638f2473ce878787876040518563ffffffff1660e01b8152600401610bb3949392919061281a565b600060405180830381865afa158015610bd0573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610bf99190612af2565b9150915094509492505050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9630846040518363ffffffff1660e01b8152600401610c45929190612348565b6020604051808303816000875af1158015610c64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8891906125cc565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6184846040518363ffffffff1660e01b8152600401610cce929190612348565b6000604051808303816000875af1158015610ced573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610d169190612557565b905092915050565b6060600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9633876040518363ffffffff1660e01b8152600401610d5f929190612348565b6020604051808303816000875af1158015610d7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da291906125cc565b905080610de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddb90612bb6565b60405180910390fd5b61080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6185856040518363ffffffff1660e01b8152600401610e21929190612348565b6000604051808303816000875af1158015610e40573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610e699190612557565b9150509392505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663a66cb605836040518263ffffffff1660e01b8152600401610eb09190611f35565b600060405180830381865afa158015610ecd573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610ef69190612cb7565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff16635431f450836040518263ffffffff1660e01b8152600401610f3a9190611f35565b600060405180830381865afa158015610f57573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610f809190612d00565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff166385b2d2da836040518263ffffffff1660e01b8152600401610fc49190611dc7565b600060405180830381865afa158015610fe1573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061100a9190612631565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633ce4e3be836040518263ffffffff1660e01b815260040161104e9190611dc7565b6000604051808303816000875af115801561106d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110969190612557565b9050919050565b60608061080173ffffffffffffffffffffffffffffffffffffffff166354be1a28846040518263ffffffff1660e01b81526004016110db9190611f35565b600060405180830381865afa1580156110f8573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906111219190612eb2565b91509150915091565b60405180606001604052806060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006111ae82611183565b9050919050565b6111be816111a3565b81146111c957600080fd5b50565b6000813590506111db816111b5565b92915050565b6000602082840312156111f7576111f6611179565b5b6000611205848285016111cc565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561124857808201518184015260208101905061122d565b60008484015250505050565b6000601f19601f8301169050919050565b60006112708261120e565b61127a8185611219565b935061128a81856020860161122a565b61129381611254565b840191505092915050565b600060208201905081810360008301526112b88184611265565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61130282611254565b810181811067ffffffffffffffff82111715611321576113206112ca565b5b80604052505050565b600061133461116f565b905061134082826112f9565b919050565b600067ffffffffffffffff8211156113605761135f6112ca565b5b61136982611254565b9050602081019050919050565b82818337600083830152505050565b600061139861139384611345565b61132a565b9050828152602081018484840111156113b4576113b36112c5565b5b6113bf848285611376565b509392505050565b600082601f8301126113dc576113db6112c0565b5b81356113ec848260208601611385565b91505092915050565b60006020828403121561140b5761140a611179565b5b600082013567ffffffffffffffff8111156114295761142861117e565b5b611435848285016113c7565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60006114658261143e565b61146f8185611449565b935061147f81856020860161122a565b61148881611254565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000819050919050565b6114d2816114bf565b82525050565b600060ff82169050919050565b6114ee816114d8565b82525050565b60006060830160008301518482036000860152611511828261145a565b915050602083015161152660208601826114c9565b50604083015161153960408601826114e5565b508091505092915050565b600061155083836114f4565b905092915050565b6000602082019050919050565b600061157082611493565b61157a818561149e565b93508360208202850161158c856114af565b8060005b858110156115c857848403895281516115a98582611544565b94506115b483611558565b925060208a01995050600181019050611590565b50829750879550505050505092915050565b600060608301600083015184820360008601526115f7828261145a565b915050602083015184820360208601526116118282611565565b9150506040830151848203604086015261162b8282611565565b9150508091505092915050565b6000602082019050818103600083015261165281846115da565b905092915050565b6000806040838503121561167157611670611179565b5b600061167f858286016111cc565b925050602083013567ffffffffffffffff8111156116a05761169f61117e565b5b6116ac858286016113c7565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060408301600083015184820360008601526116ff828261145a565b915050602083015161171460208601826114c9565b508091505092915050565b600061172b83836116e2565b905092915050565b6000602082019050919050565b600061174b826116b6565b61175581856116c1565b935083602082028501611767856116d2565b8060005b858110156117a35784840389528151611784858261171f565b945061178f83611733565b925060208a0199505060018101905061176b565b50829750879550505050505092915050565b600060208201905081810360008301526117cf8184611740565b905092915050565b60008115159050919050565b6117ec816117d7565b82525050565b600060208201905061180760008301846117e3565b92915050565b600063ffffffff82169050919050565b6118268161180d565b811461183157600080fd5b50565b6000813590506118438161181d565b92915050565b600080604083850312156118605761185f611179565b5b600061186e858286016111cc565b925050602061187f85828601611834565b9150509250929050565b600082825260208201905092915050565b60006118a582611493565b6118af8185611889565b9350836020820285016118c1856114af565b8060005b858110156118fd57848403895281516118de8582611544565b94506118e983611558565b925060208a019950506001810190506118c5565b50829750879550505050505092915050565b60006020820190508181036000830152611929818461189a565b905092915050565b600067ffffffffffffffff82169050919050565b61194e81611931565b811461195957600080fd5b50565b60008135905061196b81611945565b92915050565b600080fd5b600060a0828403121561198c5761198b611971565b5b81905092915050565b600080600080608085870312156119af576119ae611179565b5b600085013567ffffffffffffffff8111156119cd576119cc61117e565b5b6119d9878288016113c7565b94505060206119ea8782880161195c565b93505060406119fb8782880161195c565b925050606085013567ffffffffffffffff811115611a1c57611a1b61117e565b5b611a2887828801611976565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611a6981611931565b82525050565b604082016000820151611a8560008501826114c9565b506020820151611a9860208501826114e5565b50505050565b606082016000820151611ab46000850182611a60565b506020820151611ac76020850182611a6f565b50505050565b6000611ad98383611a9e565b60608301905092915050565b6000602082019050919050565b6000611afd82611a34565b611b078185611a3f565b9350611b1283611a50565b8060005b83811015611b43578151611b2a8882611acd565b9750611b3583611ae5565b925050600181019050611b16565b5085935050505092915050565b600082825260208201905092915050565b6000611b6c8261120e565b611b768185611b50565b9350611b8681856020860161122a565b611b8f81611254565b840191505092915050565b60006040830160008301518482036000860152611bb78282611b61565b9150506020830151611bcc6020860182611a60565b508091505092915050565b60006040820190508181036000830152611bf18185611af2565b90508181036020830152611c058184611b9a565b90509392505050565b600080600060608486031215611c2757611c26611179565b5b600084013567ffffffffffffffff811115611c4557611c4461117e565b5b611c51868287016113c7565b9350506020611c62868287016111cc565b925050604084013567ffffffffffffffff811115611c8357611c8261117e565b5b611c8f868287016113c7565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000611cd1838361145a565b905092915050565b6000602082019050919050565b6000611cf182611c99565b611cfb8185611ca4565b935083602082028501611d0d85611cb5565b8060005b85811015611d495784840389528151611d2a8582611cc5565b9450611d3583611cd9565b925060208a01995050600181019050611d11565b50829750879550505050505092915050565b60006020820190508181036000830152611d758184611ce6565b905092915050565b600082825260208201905092915050565b6000611d998261143e565b611da38185611d7d565b9350611db381856020860161122a565b611dbc81611254565b840191505092915050565b60006020820190508181036000830152611de18184611d8e565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006040830160008301518482036000860152611e32828261145a565b91505060208301518482036020860152611e4c8282611565565b9150508091505092915050565b6000611e658383611e15565b905092915050565b6000602082019050919050565b6000611e8582611de9565b611e8f8185611df4565b935083602082028501611ea185611e05565b8060005b85811015611edd5784840389528151611ebe8582611e59565b9450611ec983611e6d565b925060208a01995050600181019050611ea5565b50829750879550505050505092915050565b60006040820190508181036000830152611f098185611e7a565b90508181036020830152611f1d818461189a565b90509392505050565b611f2f816111a3565b82525050565b6000602082019050611f4a6000830184611f26565b92915050565b600081905092915050565b6000611f668261120e565b611f708185611f50565b9350611f8081856020860161122a565b80840191505092915050565b6000611f988284611f5b565b915081905092915050565b7f6661696c65642073746174696343616c6c20746f20707265636f6d70696c6500600082015250565b6000611fd9601f83611d7d565b9150611fe482611fa3565b602082019050919050565b6000602082019050818103600083015261200881611fcc565b9050919050565b600080fd5b600080fd5b600061202c61202784611345565b61132a565b905082815260208101848484011115612048576120476112c5565b5b61205384828561122a565b509392505050565b600082601f8301126120705761206f6112c0565b5b8151612080848260208601612019565b91505092915050565b600067ffffffffffffffff8211156120a4576120a36112ca565b5b602082029050602081019050919050565b600080fd5b6120c3816114bf565b81146120ce57600080fd5b50565b6000815190506120e0816120ba565b92915050565b6120ef816114d8565b81146120fa57600080fd5b50565b60008151905061210c816120e6565b92915050565b6000606082840312156121285761212761200f565b5b612132606061132a565b9050600082015167ffffffffffffffff81111561215257612151612014565b5b61215e8482850161205b565b6000830152506020612172848285016120d1565b6020830152506040612186848285016120fd565b60408301525092915050565b60006121a56121a084612089565b61132a565b905080838252602082019050602084028301858111156121c8576121c76120b5565b5b835b8181101561220f57805167ffffffffffffffff8111156121ed576121ec6112c0565b5b8086016121fa8982612112565b855260208501945050506020810190506121ca565b5050509392505050565b600082601f83011261222e5761222d6112c0565b5b815161223e848260208601612192565b91505092915050565b60006060828403121561225d5761225c61200f565b5b612267606061132a565b9050600082015167ffffffffffffffff81111561228757612286612014565b5b6122938482850161205b565b600083015250602082015167ffffffffffffffff8111156122b7576122b6612014565b5b6122c384828501612219565b602083015250604082015167ffffffffffffffff8111156122e7576122e6612014565b5b6122f384828501612219565b60408301525092915050565b60006020828403121561231557612314611179565b5b600082015167ffffffffffffffff8111156123335761233261117e565b5b61233f84828501612247565b91505092915050565b600060408201905061235d6000830185611f26565b818103602083015261236f8184611d8e565b90509392505050565b7f6661696c65642064656c656761746543616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b60006123d4602183611d7d565b91506123df82612378565b604082019050919050565b60006020820190508181036000830152612403816123c7565b9050919050565b600067ffffffffffffffff821115612425576124246112ca565b5b602082029050602081019050919050565b60006040828403121561244c5761244b61200f565b5b612456604061132a565b9050600082015167ffffffffffffffff81111561247657612475612014565b5b6124828482850161205b565b6000830152506020612496848285016120d1565b60208301525092915050565b60006124b56124b08461240a565b61132a565b905080838252602082019050602084028301858111156124d8576124d76120b5565b5b835b8181101561251f57805167ffffffffffffffff8111156124fd576124fc6112c0565b5b80860161250a8982612436565b855260208501945050506020810190506124da565b5050509392505050565b600082601f83011261253e5761253d6112c0565b5b815161254e8482602086016124a2565b91505092915050565b60006020828403121561256d5761256c611179565b5b600082015167ffffffffffffffff81111561258b5761258a61117e565b5b61259784828501612529565b91505092915050565b6125a9816117d7565b81146125b457600080fd5b50565b6000815190506125c6816125a0565b92915050565b6000602082840312156125e2576125e1611179565b5b60006125f0848285016125b7565b91505092915050565b6126028161180d565b82525050565b600060408201905061261d6000830185611f26565b61262a60208301846125f9565b9392505050565b60006020828403121561264757612646611179565b5b600082015167ffffffffffffffff8111156126655761266461117e565b5b61267184828501612219565b91505092915050565b61268381611931565b82525050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126126b5576126b4612693565b5b83810192508235915060208301925067ffffffffffffffff8211156126dd576126dc612689565b5b6001820236038313156126f3576126f261268e565b5b509250929050565b60006127078385611b50565b9350612714838584611376565b61271d83611254565b840190509392505050565b6000612737602084018461195c565b905092915050565b60008135905061274e816125a0565b92915050565b6000612763602084018461273f565b905092915050565b612774816117d7565b82525050565b600060a0830161278d6000840184612698565b85830360008701526127a08382846126fb565b925050506127b16020840184612728565b6127be6020860182611a60565b506127cc6040840184612728565b6127d96040860182611a60565b506127e76060840184612754565b6127f4606086018261276b565b506128026080840184612754565b61280f608086018261276b565b508091505092915050565b600060808201905081810360008301526128348187611d8e565b9050612843602083018661267a565b612850604083018561267a565b8181036060830152612862818461277a565b905095945050505050565b600067ffffffffffffffff821115612888576128876112ca565b5b602082029050602081019050919050565b6000815190506128a881611945565b92915050565b6000604082840312156128c4576128c361200f565b5b6128ce604061132a565b905060006128de848285016120d1565b60008301525060206128f2848285016120fd565b60208301525092915050565b6000606082840312156129145761291361200f565b5b61291e604061132a565b9050600061292e84828501612899565b6000830152506020612942848285016128ae565b60208301525092915050565b600061296161295c8461286d565b61132a565b90508083825260208201905060608402830185811115612984576129836120b5565b5b835b818110156129ad578061299988826128fe565b845260208401935050606081019050612986565b5050509392505050565b600082601f8301126129cc576129cb6112c0565b5b81516129dc84826020860161294e565b91505092915050565b600067ffffffffffffffff821115612a00576129ff6112ca565b5b612a0982611254565b9050602081019050919050565b6000612a29612a24846129e5565b61132a565b905082815260208101848484011115612a4557612a446112c5565b5b612a5084828561122a565b509392505050565b600082601f830112612a6d57612a6c6112c0565b5b8151612a7d848260208601612a16565b91505092915050565b600060408284031215612a9c57612a9b61200f565b5b612aa6604061132a565b9050600082015167ffffffffffffffff811115612ac657612ac5612014565b5b612ad284828501612a58565b6000830152506020612ae684828501612899565b60208301525092915050565b60008060408385031215612b0957612b08611179565b5b600083015167ffffffffffffffff811115612b2757612b2661117e565b5b612b33858286016129b7565b925050602083015167ffffffffffffffff811115612b5457612b5361117e565b5b612b6085828601612a86565b9150509250929050565b7f6661696c656420746f2073657420776974686472617720616464726573730000600082015250565b6000612ba0601e83611d7d565b9150612bab82612b6a565b602082019050919050565b60006020820190508181036000830152612bcf81612b93565b9050919050565b600067ffffffffffffffff821115612bf157612bf06112ca565b5b602082029050602081019050919050565b6000612c15612c1084612bd6565b61132a565b90508083825260208201905060208402830185811115612c3857612c376120b5565b5b835b81811015612c7f57805167ffffffffffffffff811115612c5d57612c5c6112c0565b5b808601612c6a898261205b565b85526020850194505050602081019050612c3a565b5050509392505050565b600082601f830112612c9e57612c9d6112c0565b5b8151612cae848260208601612c02565b91505092915050565b600060208284031215612ccd57612ccc611179565b5b600082015167ffffffffffffffff811115612ceb57612cea61117e565b5b612cf784828501612c89565b91505092915050565b600060208284031215612d1657612d15611179565b5b600082015167ffffffffffffffff811115612d3457612d3361117e565b5b612d408482850161205b565b91505092915050565b600067ffffffffffffffff821115612d6457612d636112ca565b5b602082029050602081019050919050565b600060408284031215612d8b57612d8a61200f565b5b612d95604061132a565b9050600082015167ffffffffffffffff811115612db557612db4612014565b5b612dc18482850161205b565b600083015250602082015167ffffffffffffffff811115612de557612de4612014565b5b612df184828501612219565b60208301525092915050565b6000612e10612e0b84612d49565b61132a565b90508083825260208201905060208402830185811115612e3357612e326120b5565b5b835b81811015612e7a57805167ffffffffffffffff811115612e5857612e576112c0565b5b808601612e658982612d75565b85526020850194505050602081019050612e35565b5050509392505050565b600082601f830112612e9957612e986112c0565b5b8151612ea9848260208601612dfd565b91505092915050565b60008060408385031215612ec957612ec8611179565b5b600083015167ffffffffffffffff811115612ee757612ee661117e565b5b612ef385828601612e84565b925050602083015167ffffffffffffffff811115612f1457612f1361117e565b5b612f2085828601612219565b915050925092905056fea2646970667358221220ca1dd756af2118cc5041e4bd9542a13fbf7b9e315028de6ce067eeaf65d30ed364736f6c63430008130033", + "bytecode": "0x608060405234801561001057600080fd5b50613087806100206000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c80637c9db0bb116100ad578063b6a216ae11610071578063b6a216ae1461038d578063cb85aa0a146103bd578063d3f831be146103ed578063e0421e391461041d578063e236c7a61461044d57610121565b80637c9db0bb1461029c57806388b2d581146102cc578063963516e4146102fd578063981945931461032d578063b2d178831461035d57610121565b806346e16d34116100f457806346e16d34146101d257806361bc221a146102025780636f669da41461022057806378a5dfd114610250578063796b96d21461028057610121565b806301b68000146101265780630c05e9e414610156578063296c60aa146101865780632d0ee16a146101a2575b600080fd5b610140600480360381019061013b919061123e565b61047e565b60405161014d91906112fb565b60405180910390f35b610170600480360381019061016b9190611452565b6105c6565b60405161017d9190611695565b60405180910390f35b6101a0600480360381019061019b91906116b7565b610656565b005b6101bc60048036038101906101b79190611452565b610797565b6040516101c99190611812565b60405180910390f35b6101ec60048036038101906101e791906116b7565b610825565b6040516101f9919061184f565b60405180910390f35b61020a6108af565b6040516102179190611879565b60405180910390f35b61023a600480360381019061023591906118d0565b6108b5565b604051610247919061184f565b60405180910390f35b61026a600480360381019061026591906116b7565b61096d565b6040516102779190611996565b60405180910390f35b61029a600480360381019061029591906116b7565b6109fa565b005b6102b660048036038101906102b19190611452565b610b3b565b6040516102c39190611996565b60405180910390f35b6102e660048036038101906102e19190611a1c565b610bc5565b6040516102f4929190611c5e565b60405180910390f35b61031760048036038101906103129190611452565b610c63565b604051610324919061184f565b60405180910390f35b610347600480360381019061034291906116b7565b610cec565b6040516103549190611812565b60405180910390f35b61037760048036038101906103729190611c95565b610d7b565b6040516103849190611812565b60405180910390f35b6103a760048036038101906103a2919061123e565b610ed0565b6040516103b49190611de2565b60405180910390f35b6103d760048036038101906103d2919061123e565b610f5a565b6040516103e49190611e4e565b60405180910390f35b61040760048036038101906104029190611452565b610fe4565b6040516104149190611996565b60405180910390f35b61043760048036038101906104329190611452565b61106e565b6040516104449190611812565b60405180910390f35b6104676004803603810190610462919061123e565b6110fa565b604051610475929190611f76565b60405180910390f35b606060008061080173ffffffffffffffffffffffffffffffffffffffff16846040516024016104ad9190611fbc565b6040516020818303038152906040527f5431f450000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516105379190612013565b600060405180830381855afa9150503d8060008114610572576040519150601f19603f3d011682016040523d82523d6000602084013e610577565b606091505b5091509150816105bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b390612076565b60405180910390fd5b8092505050919050565b6105ce611187565b61080173ffffffffffffffffffffffffffffffffffffffff166354212a89836040518263ffffffff1660e01b81526004016106099190611e4e565b600060405180830381865afa158015610626573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061064f9190612386565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff1683836040516024016106849291906123cf565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161070e9190612013565b600060405180830381855af49150503d8060008114610749576040519150601f19603f3d011682016040523d82523d6000602084013e61074e565b606091505b5050905080610792576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078990612471565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6130846040518363ffffffff1660e01b81526004016107d69291906123cf565b6000604051808303816000875af11580156107f5573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061081e91906125de565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9684846040518363ffffffff1660e01b81526004016108649291906123cf565b6020604051808303816000875af1158015610883573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a79190612653565b905092915050565b60005481565b60008060008154809291906108c9906126af565b919050555061080173ffffffffffffffffffffffffffffffffffffffff16632efe8a5f84846040518363ffffffff1660e01b815260040161090b929190612706565b6020604051808303816000875af115801561092a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094e9190612653565b90506000808154809291906109629061272f565b919050555092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff16639ad563b484846040518363ffffffff1660e01b81526004016109ac9291906123cf565b600060405180830381865afa1580156109c9573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906109f29190612758565b905092915050565b600061080173ffffffffffffffffffffffffffffffffffffffff168383604051602401610a289291906123cf565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610ab29190612013565b600060405180830381855afa9150503d8060008114610aed576040519150601f19603f3d011682016040523d82523d6000602084013e610af2565b606091505b5050905080610b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2d90612076565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633dd40f78836040518263ffffffff1660e01b8152600401610b789190611e4e565b600060405180830381865afa158015610b95573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610bbe9190612758565b9050919050565b6060610bcf6111a8565b61080173ffffffffffffffffffffffffffffffffffffffff16638f2473ce878787876040518563ffffffff1660e01b8152600401610c109493929190612941565b600060405180830381865afa158015610c2d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610c569190612c19565b9150915094509492505050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9630846040518363ffffffff1660e01b8152600401610ca29291906123cf565b6020604051808303816000875af1158015610cc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce59190612653565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6184846040518363ffffffff1660e01b8152600401610d2b9291906123cf565b6000604051808303816000875af1158015610d4a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610d7391906125de565b905092915050565b6060600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9633876040518363ffffffff1660e01b8152600401610dbc9291906123cf565b6020604051808303816000875af1158015610ddb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dff9190612653565b905080610e41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3890612cdd565b60405180910390fd5b61080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6185856040518363ffffffff1660e01b8152600401610e7e9291906123cf565b6000604051808303816000875af1158015610e9d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610ec691906125de565b9150509392505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663a66cb605836040518263ffffffff1660e01b8152600401610f0d9190611fbc565b600060405180830381865afa158015610f2a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610f539190612dde565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff16635431f450836040518263ffffffff1660e01b8152600401610f979190611fbc565b600060405180830381865afa158015610fb4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610fdd9190612e27565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff166385b2d2da836040518263ffffffff1660e01b81526004016110219190611e4e565b600060405180830381865afa15801561103e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110679190612758565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633ce4e3be836040518263ffffffff1660e01b81526004016110ab9190611e4e565b6000604051808303816000875af11580156110ca573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110f391906125de565b9050919050565b60608061080173ffffffffffffffffffffffffffffffffffffffff166354be1a28846040518263ffffffff1660e01b81526004016111389190611fbc565b600060405180830381865afa158015611155573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061117e9190612fd9565b91509150915091565b60405180606001604052806060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061120b826111e0565b9050919050565b61121b81611200565b811461122657600080fd5b50565b60008135905061123881611212565b92915050565b600060208284031215611254576112536111d6565b5b600061126284828501611229565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156112a557808201518184015260208101905061128a565b60008484015250505050565b6000601f19601f8301169050919050565b60006112cd8261126b565b6112d78185611276565b93506112e7818560208601611287565b6112f0816112b1565b840191505092915050565b6000602082019050818103600083015261131581846112c2565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61135f826112b1565b810181811067ffffffffffffffff8211171561137e5761137d611327565b5b80604052505050565b60006113916111cc565b905061139d8282611356565b919050565b600067ffffffffffffffff8211156113bd576113bc611327565b5b6113c6826112b1565b9050602081019050919050565b82818337600083830152505050565b60006113f56113f0846113a2565b611387565b90508281526020810184848401111561141157611410611322565b5b61141c8482856113d3565b509392505050565b600082601f8301126114395761143861131d565b5b81356114498482602086016113e2565b91505092915050565b600060208284031215611468576114676111d6565b5b600082013567ffffffffffffffff811115611486576114856111db565b5b61149284828501611424565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60006114c28261149b565b6114cc81856114a6565b93506114dc818560208601611287565b6114e5816112b1565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000819050919050565b61152f8161151c565b82525050565b600060ff82169050919050565b61154b81611535565b82525050565b6000606083016000830151848203600086015261156e82826114b7565b91505060208301516115836020860182611526565b5060408301516115966040860182611542565b508091505092915050565b60006115ad8383611551565b905092915050565b6000602082019050919050565b60006115cd826114f0565b6115d781856114fb565b9350836020820285016115e98561150c565b8060005b85811015611625578484038952815161160685826115a1565b9450611611836115b5565b925060208a019950506001810190506115ed565b50829750879550505050505092915050565b6000606083016000830151848203600086015261165482826114b7565b9150506020830151848203602086015261166e82826115c2565b9150506040830151848203604086015261168882826115c2565b9150508091505092915050565b600060208201905081810360008301526116af8184611637565b905092915050565b600080604083850312156116ce576116cd6111d6565b5b60006116dc85828601611229565b925050602083013567ffffffffffffffff8111156116fd576116fc6111db565b5b61170985828601611424565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000604083016000830151848203600086015261175c82826114b7565b91505060208301516117716020860182611526565b508091505092915050565b6000611788838361173f565b905092915050565b6000602082019050919050565b60006117a882611713565b6117b2818561171e565b9350836020820285016117c48561172f565b8060005b8581101561180057848403895281516117e1858261177c565b94506117ec83611790565b925060208a019950506001810190506117c8565b50829750879550505050505092915050565b6000602082019050818103600083015261182c818461179d565b905092915050565b60008115159050919050565b61184981611834565b82525050565b60006020820190506118646000830184611840565b92915050565b6118738161151c565b82525050565b600060208201905061188e600083018461186a565b92915050565b600063ffffffff82169050919050565b6118ad81611894565b81146118b857600080fd5b50565b6000813590506118ca816118a4565b92915050565b600080604083850312156118e7576118e66111d6565b5b60006118f585828601611229565b9250506020611906858286016118bb565b9150509250929050565b600082825260208201905092915050565b600061192c826114f0565b6119368185611910565b9350836020820285016119488561150c565b8060005b85811015611984578484038952815161196585826115a1565b9450611970836115b5565b925060208a0199505060018101905061194c565b50829750879550505050505092915050565b600060208201905081810360008301526119b08184611921565b905092915050565b600067ffffffffffffffff82169050919050565b6119d5816119b8565b81146119e057600080fd5b50565b6000813590506119f2816119cc565b92915050565b600080fd5b600060a08284031215611a1357611a126119f8565b5b81905092915050565b60008060008060808587031215611a3657611a356111d6565b5b600085013567ffffffffffffffff811115611a5457611a536111db565b5b611a6087828801611424565b9450506020611a71878288016119e3565b9350506040611a82878288016119e3565b925050606085013567ffffffffffffffff811115611aa357611aa26111db565b5b611aaf878288016119fd565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611af0816119b8565b82525050565b604082016000820151611b0c6000850182611526565b506020820151611b1f6020850182611542565b50505050565b606082016000820151611b3b6000850182611ae7565b506020820151611b4e6020850182611af6565b50505050565b6000611b608383611b25565b60608301905092915050565b6000602082019050919050565b6000611b8482611abb565b611b8e8185611ac6565b9350611b9983611ad7565b8060005b83811015611bca578151611bb18882611b54565b9750611bbc83611b6c565b925050600181019050611b9d565b5085935050505092915050565b600082825260208201905092915050565b6000611bf38261126b565b611bfd8185611bd7565b9350611c0d818560208601611287565b611c16816112b1565b840191505092915050565b60006040830160008301518482036000860152611c3e8282611be8565b9150506020830151611c536020860182611ae7565b508091505092915050565b60006040820190508181036000830152611c788185611b79565b90508181036020830152611c8c8184611c21565b90509392505050565b600080600060608486031215611cae57611cad6111d6565b5b600084013567ffffffffffffffff811115611ccc57611ccb6111db565b5b611cd886828701611424565b9350506020611ce986828701611229565b925050604084013567ffffffffffffffff811115611d0a57611d096111db565b5b611d1686828701611424565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000611d5883836114b7565b905092915050565b6000602082019050919050565b6000611d7882611d20565b611d828185611d2b565b935083602082028501611d9485611d3c565b8060005b85811015611dd05784840389528151611db18582611d4c565b9450611dbc83611d60565b925060208a01995050600181019050611d98565b50829750879550505050505092915050565b60006020820190508181036000830152611dfc8184611d6d565b905092915050565b600082825260208201905092915050565b6000611e208261149b565b611e2a8185611e04565b9350611e3a818560208601611287565b611e43816112b1565b840191505092915050565b60006020820190508181036000830152611e688184611e15565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006040830160008301518482036000860152611eb982826114b7565b91505060208301518482036020860152611ed382826115c2565b9150508091505092915050565b6000611eec8383611e9c565b905092915050565b6000602082019050919050565b6000611f0c82611e70565b611f168185611e7b565b935083602082028501611f2885611e8c565b8060005b85811015611f645784840389528151611f458582611ee0565b9450611f5083611ef4565b925060208a01995050600181019050611f2c565b50829750879550505050505092915050565b60006040820190508181036000830152611f908185611f01565b90508181036020830152611fa48184611921565b90509392505050565b611fb681611200565b82525050565b6000602082019050611fd16000830184611fad565b92915050565b600081905092915050565b6000611fed8261126b565b611ff78185611fd7565b9350612007818560208601611287565b80840191505092915050565b600061201f8284611fe2565b915081905092915050565b7f6661696c65642073746174696343616c6c20746f20707265636f6d70696c6500600082015250565b6000612060601f83611e04565b915061206b8261202a565b602082019050919050565b6000602082019050818103600083015261208f81612053565b9050919050565b600080fd5b600080fd5b60006120b36120ae846113a2565b611387565b9050828152602081018484840111156120cf576120ce611322565b5b6120da848285611287565b509392505050565b600082601f8301126120f7576120f661131d565b5b81516121078482602086016120a0565b91505092915050565b600067ffffffffffffffff82111561212b5761212a611327565b5b602082029050602081019050919050565b600080fd5b61214a8161151c565b811461215557600080fd5b50565b60008151905061216781612141565b92915050565b61217681611535565b811461218157600080fd5b50565b6000815190506121938161216d565b92915050565b6000606082840312156121af576121ae612096565b5b6121b96060611387565b9050600082015167ffffffffffffffff8111156121d9576121d861209b565b5b6121e5848285016120e2565b60008301525060206121f984828501612158565b602083015250604061220d84828501612184565b60408301525092915050565b600061222c61222784612110565b611387565b9050808382526020820190506020840283018581111561224f5761224e61213c565b5b835b8181101561229657805167ffffffffffffffff8111156122745761227361131d565b5b8086016122818982612199565b85526020850194505050602081019050612251565b5050509392505050565b600082601f8301126122b5576122b461131d565b5b81516122c5848260208601612219565b91505092915050565b6000606082840312156122e4576122e3612096565b5b6122ee6060611387565b9050600082015167ffffffffffffffff81111561230e5761230d61209b565b5b61231a848285016120e2565b600083015250602082015167ffffffffffffffff81111561233e5761233d61209b565b5b61234a848285016122a0565b602083015250604082015167ffffffffffffffff81111561236e5761236d61209b565b5b61237a848285016122a0565b60408301525092915050565b60006020828403121561239c5761239b6111d6565b5b600082015167ffffffffffffffff8111156123ba576123b96111db565b5b6123c6848285016122ce565b91505092915050565b60006040820190506123e46000830185611fad565b81810360208301526123f68184611e15565b90509392505050565b7f6661696c65642064656c656761746543616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b600061245b602183611e04565b9150612466826123ff565b604082019050919050565b6000602082019050818103600083015261248a8161244e565b9050919050565b600067ffffffffffffffff8211156124ac576124ab611327565b5b602082029050602081019050919050565b6000604082840312156124d3576124d2612096565b5b6124dd6040611387565b9050600082015167ffffffffffffffff8111156124fd576124fc61209b565b5b612509848285016120e2565b600083015250602061251d84828501612158565b60208301525092915050565b600061253c61253784612491565b611387565b9050808382526020820190506020840283018581111561255f5761255e61213c565b5b835b818110156125a657805167ffffffffffffffff8111156125845761258361131d565b5b80860161259189826124bd565b85526020850194505050602081019050612561565b5050509392505050565b600082601f8301126125c5576125c461131d565b5b81516125d5848260208601612529565b91505092915050565b6000602082840312156125f4576125f36111d6565b5b600082015167ffffffffffffffff811115612612576126116111db565b5b61261e848285016125b0565b91505092915050565b61263081611834565b811461263b57600080fd5b50565b60008151905061264d81612627565b92915050565b600060208284031215612669576126686111d6565b5b60006126778482850161263e565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006126ba8261151c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036126ec576126eb612680565b5b600182019050919050565b61270081611894565b82525050565b600060408201905061271b6000830185611fad565b61272860208301846126f7565b9392505050565b600061273a8261151c565b91506000820361274d5761274c612680565b5b600182039050919050565b60006020828403121561276e5761276d6111d6565b5b600082015167ffffffffffffffff81111561278c5761278b6111db565b5b612798848285016122a0565b91505092915050565b6127aa816119b8565b82525050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126127dc576127db6127ba565b5b83810192508235915060208301925067ffffffffffffffff821115612804576128036127b0565b5b60018202360383131561281a576128196127b5565b5b509250929050565b600061282e8385611bd7565b935061283b8385846113d3565b612844836112b1565b840190509392505050565b600061285e60208401846119e3565b905092915050565b60008135905061287581612627565b92915050565b600061288a6020840184612866565b905092915050565b61289b81611834565b82525050565b600060a083016128b460008401846127bf565b85830360008701526128c7838284612822565b925050506128d8602084018461284f565b6128e56020860182611ae7565b506128f3604084018461284f565b6129006040860182611ae7565b5061290e606084018461287b565b61291b6060860182612892565b50612929608084018461287b565b6129366080860182612892565b508091505092915050565b6000608082019050818103600083015261295b8187611e15565b905061296a60208301866127a1565b61297760408301856127a1565b818103606083015261298981846128a1565b905095945050505050565b600067ffffffffffffffff8211156129af576129ae611327565b5b602082029050602081019050919050565b6000815190506129cf816119cc565b92915050565b6000604082840312156129eb576129ea612096565b5b6129f56040611387565b90506000612a0584828501612158565b6000830152506020612a1984828501612184565b60208301525092915050565b600060608284031215612a3b57612a3a612096565b5b612a456040611387565b90506000612a55848285016129c0565b6000830152506020612a69848285016129d5565b60208301525092915050565b6000612a88612a8384612994565b611387565b90508083825260208201905060608402830185811115612aab57612aaa61213c565b5b835b81811015612ad45780612ac08882612a25565b845260208401935050606081019050612aad565b5050509392505050565b600082601f830112612af357612af261131d565b5b8151612b03848260208601612a75565b91505092915050565b600067ffffffffffffffff821115612b2757612b26611327565b5b612b30826112b1565b9050602081019050919050565b6000612b50612b4b84612b0c565b611387565b905082815260208101848484011115612b6c57612b6b611322565b5b612b77848285611287565b509392505050565b600082601f830112612b9457612b9361131d565b5b8151612ba4848260208601612b3d565b91505092915050565b600060408284031215612bc357612bc2612096565b5b612bcd6040611387565b9050600082015167ffffffffffffffff811115612bed57612bec61209b565b5b612bf984828501612b7f565b6000830152506020612c0d848285016129c0565b60208301525092915050565b60008060408385031215612c3057612c2f6111d6565b5b600083015167ffffffffffffffff811115612c4e57612c4d6111db565b5b612c5a85828601612ade565b925050602083015167ffffffffffffffff811115612c7b57612c7a6111db565b5b612c8785828601612bad565b9150509250929050565b7f6661696c656420746f2073657420776974686472617720616464726573730000600082015250565b6000612cc7601e83611e04565b9150612cd282612c91565b602082019050919050565b60006020820190508181036000830152612cf681612cba565b9050919050565b600067ffffffffffffffff821115612d1857612d17611327565b5b602082029050602081019050919050565b6000612d3c612d3784612cfd565b611387565b90508083825260208201905060208402830185811115612d5f57612d5e61213c565b5b835b81811015612da657805167ffffffffffffffff811115612d8457612d8361131d565b5b808601612d9189826120e2565b85526020850194505050602081019050612d61565b5050509392505050565b600082601f830112612dc557612dc461131d565b5b8151612dd5848260208601612d29565b91505092915050565b600060208284031215612df457612df36111d6565b5b600082015167ffffffffffffffff811115612e1257612e116111db565b5b612e1e84828501612db0565b91505092915050565b600060208284031215612e3d57612e3c6111d6565b5b600082015167ffffffffffffffff811115612e5b57612e5a6111db565b5b612e67848285016120e2565b91505092915050565b600067ffffffffffffffff821115612e8b57612e8a611327565b5b602082029050602081019050919050565b600060408284031215612eb257612eb1612096565b5b612ebc6040611387565b9050600082015167ffffffffffffffff811115612edc57612edb61209b565b5b612ee8848285016120e2565b600083015250602082015167ffffffffffffffff811115612f0c57612f0b61209b565b5b612f18848285016122a0565b60208301525092915050565b6000612f37612f3284612e70565b611387565b90508083825260208201905060208402830185811115612f5a57612f5961213c565b5b835b81811015612fa157805167ffffffffffffffff811115612f7f57612f7e61131d565b5b808601612f8c8982612e9c565b85526020850194505050602081019050612f5c565b5050509392505050565b600082601f830112612fc057612fbf61131d565b5b8151612fd0848260208601612f24565b91505092915050565b60008060408385031215612ff057612fef6111d6565b5b600083015167ffffffffffffffff81111561300e5761300d6111db565b5b61301a85828601612fab565b925050602083015167ffffffffffffffff81111561303b5761303a6111db565b5b613047858286016122a0565b915050925092905056fea2646970667358221220da4f3e927603d81ab48a6e4fb5139eaedb56b9fef37e7e9e393c598ae51dcb8e64736f6c63430008130033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101215760003560e01c80637c9db0bb116100ad578063b6a216ae11610071578063b6a216ae1461038d578063cb85aa0a146103bd578063d3f831be146103ed578063e0421e391461041d578063e236c7a61461044d57610121565b80637c9db0bb1461029c57806388b2d581146102cc578063963516e4146102fd578063981945931461032d578063b2d178831461035d57610121565b806346e16d34116100f457806346e16d34146101d257806361bc221a146102025780636f669da41461022057806378a5dfd114610250578063796b96d21461028057610121565b806301b68000146101265780630c05e9e414610156578063296c60aa146101865780632d0ee16a146101a2575b600080fd5b610140600480360381019061013b919061123e565b61047e565b60405161014d91906112fb565b60405180910390f35b610170600480360381019061016b9190611452565b6105c6565b60405161017d9190611695565b60405180910390f35b6101a0600480360381019061019b91906116b7565b610656565b005b6101bc60048036038101906101b79190611452565b610797565b6040516101c99190611812565b60405180910390f35b6101ec60048036038101906101e791906116b7565b610825565b6040516101f9919061184f565b60405180910390f35b61020a6108af565b6040516102179190611879565b60405180910390f35b61023a600480360381019061023591906118d0565b6108b5565b604051610247919061184f565b60405180910390f35b61026a600480360381019061026591906116b7565b61096d565b6040516102779190611996565b60405180910390f35b61029a600480360381019061029591906116b7565b6109fa565b005b6102b660048036038101906102b19190611452565b610b3b565b6040516102c39190611996565b60405180910390f35b6102e660048036038101906102e19190611a1c565b610bc5565b6040516102f4929190611c5e565b60405180910390f35b61031760048036038101906103129190611452565b610c63565b604051610324919061184f565b60405180910390f35b610347600480360381019061034291906116b7565b610cec565b6040516103549190611812565b60405180910390f35b61037760048036038101906103729190611c95565b610d7b565b6040516103849190611812565b60405180910390f35b6103a760048036038101906103a2919061123e565b610ed0565b6040516103b49190611de2565b60405180910390f35b6103d760048036038101906103d2919061123e565b610f5a565b6040516103e49190611e4e565b60405180910390f35b61040760048036038101906104029190611452565b610fe4565b6040516104149190611996565b60405180910390f35b61043760048036038101906104329190611452565b61106e565b6040516104449190611812565b60405180910390f35b6104676004803603810190610462919061123e565b6110fa565b604051610475929190611f76565b60405180910390f35b606060008061080173ffffffffffffffffffffffffffffffffffffffff16846040516024016104ad9190611fbc565b6040516020818303038152906040527f5431f450000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516105379190612013565b600060405180830381855afa9150503d8060008114610572576040519150601f19603f3d011682016040523d82523d6000602084013e610577565b606091505b5091509150816105bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b390612076565b60405180910390fd5b8092505050919050565b6105ce611187565b61080173ffffffffffffffffffffffffffffffffffffffff166354212a89836040518263ffffffff1660e01b81526004016106099190611e4e565b600060405180830381865afa158015610626573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061064f9190612386565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff1683836040516024016106849291906123cf565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161070e9190612013565b600060405180830381855af49150503d8060008114610749576040519150601f19603f3d011682016040523d82523d6000602084013e61074e565b606091505b5050905080610792576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078990612471565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6130846040518363ffffffff1660e01b81526004016107d69291906123cf565b6000604051808303816000875af11580156107f5573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061081e91906125de565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9684846040518363ffffffff1660e01b81526004016108649291906123cf565b6020604051808303816000875af1158015610883573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a79190612653565b905092915050565b60005481565b60008060008154809291906108c9906126af565b919050555061080173ffffffffffffffffffffffffffffffffffffffff16632efe8a5f84846040518363ffffffff1660e01b815260040161090b929190612706565b6020604051808303816000875af115801561092a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094e9190612653565b90506000808154809291906109629061272f565b919050555092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff16639ad563b484846040518363ffffffff1660e01b81526004016109ac9291906123cf565b600060405180830381865afa1580156109c9573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906109f29190612758565b905092915050565b600061080173ffffffffffffffffffffffffffffffffffffffff168383604051602401610a289291906123cf565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610ab29190612013565b600060405180830381855afa9150503d8060008114610aed576040519150601f19603f3d011682016040523d82523d6000602084013e610af2565b606091505b5050905080610b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2d90612076565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633dd40f78836040518263ffffffff1660e01b8152600401610b789190611e4e565b600060405180830381865afa158015610b95573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610bbe9190612758565b9050919050565b6060610bcf6111a8565b61080173ffffffffffffffffffffffffffffffffffffffff16638f2473ce878787876040518563ffffffff1660e01b8152600401610c109493929190612941565b600060405180830381865afa158015610c2d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610c569190612c19565b9150915094509492505050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9630846040518363ffffffff1660e01b8152600401610ca29291906123cf565b6020604051808303816000875af1158015610cc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce59190612653565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6184846040518363ffffffff1660e01b8152600401610d2b9291906123cf565b6000604051808303816000875af1158015610d4a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610d7391906125de565b905092915050565b6060600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9633876040518363ffffffff1660e01b8152600401610dbc9291906123cf565b6020604051808303816000875af1158015610ddb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dff9190612653565b905080610e41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3890612cdd565b60405180910390fd5b61080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6185856040518363ffffffff1660e01b8152600401610e7e9291906123cf565b6000604051808303816000875af1158015610e9d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610ec691906125de565b9150509392505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663a66cb605836040518263ffffffff1660e01b8152600401610f0d9190611fbc565b600060405180830381865afa158015610f2a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610f539190612dde565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff16635431f450836040518263ffffffff1660e01b8152600401610f979190611fbc565b600060405180830381865afa158015610fb4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610fdd9190612e27565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff166385b2d2da836040518263ffffffff1660e01b81526004016110219190611e4e565b600060405180830381865afa15801561103e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110679190612758565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633ce4e3be836040518263ffffffff1660e01b81526004016110ab9190611e4e565b6000604051808303816000875af11580156110ca573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110f391906125de565b9050919050565b60608061080173ffffffffffffffffffffffffffffffffffffffff166354be1a28846040518263ffffffff1660e01b81526004016111389190611fbc565b600060405180830381865afa158015611155573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061117e9190612fd9565b91509150915091565b60405180606001604052806060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061120b826111e0565b9050919050565b61121b81611200565b811461122657600080fd5b50565b60008135905061123881611212565b92915050565b600060208284031215611254576112536111d6565b5b600061126284828501611229565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156112a557808201518184015260208101905061128a565b60008484015250505050565b6000601f19601f8301169050919050565b60006112cd8261126b565b6112d78185611276565b93506112e7818560208601611287565b6112f0816112b1565b840191505092915050565b6000602082019050818103600083015261131581846112c2565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61135f826112b1565b810181811067ffffffffffffffff8211171561137e5761137d611327565b5b80604052505050565b60006113916111cc565b905061139d8282611356565b919050565b600067ffffffffffffffff8211156113bd576113bc611327565b5b6113c6826112b1565b9050602081019050919050565b82818337600083830152505050565b60006113f56113f0846113a2565b611387565b90508281526020810184848401111561141157611410611322565b5b61141c8482856113d3565b509392505050565b600082601f8301126114395761143861131d565b5b81356114498482602086016113e2565b91505092915050565b600060208284031215611468576114676111d6565b5b600082013567ffffffffffffffff811115611486576114856111db565b5b61149284828501611424565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60006114c28261149b565b6114cc81856114a6565b93506114dc818560208601611287565b6114e5816112b1565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000819050919050565b61152f8161151c565b82525050565b600060ff82169050919050565b61154b81611535565b82525050565b6000606083016000830151848203600086015261156e82826114b7565b91505060208301516115836020860182611526565b5060408301516115966040860182611542565b508091505092915050565b60006115ad8383611551565b905092915050565b6000602082019050919050565b60006115cd826114f0565b6115d781856114fb565b9350836020820285016115e98561150c565b8060005b85811015611625578484038952815161160685826115a1565b9450611611836115b5565b925060208a019950506001810190506115ed565b50829750879550505050505092915050565b6000606083016000830151848203600086015261165482826114b7565b9150506020830151848203602086015261166e82826115c2565b9150506040830151848203604086015261168882826115c2565b9150508091505092915050565b600060208201905081810360008301526116af8184611637565b905092915050565b600080604083850312156116ce576116cd6111d6565b5b60006116dc85828601611229565b925050602083013567ffffffffffffffff8111156116fd576116fc6111db565b5b61170985828601611424565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000604083016000830151848203600086015261175c82826114b7565b91505060208301516117716020860182611526565b508091505092915050565b6000611788838361173f565b905092915050565b6000602082019050919050565b60006117a882611713565b6117b2818561171e565b9350836020820285016117c48561172f565b8060005b8581101561180057848403895281516117e1858261177c565b94506117ec83611790565b925060208a019950506001810190506117c8565b50829750879550505050505092915050565b6000602082019050818103600083015261182c818461179d565b905092915050565b60008115159050919050565b61184981611834565b82525050565b60006020820190506118646000830184611840565b92915050565b6118738161151c565b82525050565b600060208201905061188e600083018461186a565b92915050565b600063ffffffff82169050919050565b6118ad81611894565b81146118b857600080fd5b50565b6000813590506118ca816118a4565b92915050565b600080604083850312156118e7576118e66111d6565b5b60006118f585828601611229565b9250506020611906858286016118bb565b9150509250929050565b600082825260208201905092915050565b600061192c826114f0565b6119368185611910565b9350836020820285016119488561150c565b8060005b85811015611984578484038952815161196585826115a1565b9450611970836115b5565b925060208a0199505060018101905061194c565b50829750879550505050505092915050565b600060208201905081810360008301526119b08184611921565b905092915050565b600067ffffffffffffffff82169050919050565b6119d5816119b8565b81146119e057600080fd5b50565b6000813590506119f2816119cc565b92915050565b600080fd5b600060a08284031215611a1357611a126119f8565b5b81905092915050565b60008060008060808587031215611a3657611a356111d6565b5b600085013567ffffffffffffffff811115611a5457611a536111db565b5b611a6087828801611424565b9450506020611a71878288016119e3565b9350506040611a82878288016119e3565b925050606085013567ffffffffffffffff811115611aa357611aa26111db565b5b611aaf878288016119fd565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611af0816119b8565b82525050565b604082016000820151611b0c6000850182611526565b506020820151611b1f6020850182611542565b50505050565b606082016000820151611b3b6000850182611ae7565b506020820151611b4e6020850182611af6565b50505050565b6000611b608383611b25565b60608301905092915050565b6000602082019050919050565b6000611b8482611abb565b611b8e8185611ac6565b9350611b9983611ad7565b8060005b83811015611bca578151611bb18882611b54565b9750611bbc83611b6c565b925050600181019050611b9d565b5085935050505092915050565b600082825260208201905092915050565b6000611bf38261126b565b611bfd8185611bd7565b9350611c0d818560208601611287565b611c16816112b1565b840191505092915050565b60006040830160008301518482036000860152611c3e8282611be8565b9150506020830151611c536020860182611ae7565b508091505092915050565b60006040820190508181036000830152611c788185611b79565b90508181036020830152611c8c8184611c21565b90509392505050565b600080600060608486031215611cae57611cad6111d6565b5b600084013567ffffffffffffffff811115611ccc57611ccb6111db565b5b611cd886828701611424565b9350506020611ce986828701611229565b925050604084013567ffffffffffffffff811115611d0a57611d096111db565b5b611d1686828701611424565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000611d5883836114b7565b905092915050565b6000602082019050919050565b6000611d7882611d20565b611d828185611d2b565b935083602082028501611d9485611d3c565b8060005b85811015611dd05784840389528151611db18582611d4c565b9450611dbc83611d60565b925060208a01995050600181019050611d98565b50829750879550505050505092915050565b60006020820190508181036000830152611dfc8184611d6d565b905092915050565b600082825260208201905092915050565b6000611e208261149b565b611e2a8185611e04565b9350611e3a818560208601611287565b611e43816112b1565b840191505092915050565b60006020820190508181036000830152611e688184611e15565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006040830160008301518482036000860152611eb982826114b7565b91505060208301518482036020860152611ed382826115c2565b9150508091505092915050565b6000611eec8383611e9c565b905092915050565b6000602082019050919050565b6000611f0c82611e70565b611f168185611e7b565b935083602082028501611f2885611e8c565b8060005b85811015611f645784840389528151611f458582611ee0565b9450611f5083611ef4565b925060208a01995050600181019050611f2c565b50829750879550505050505092915050565b60006040820190508181036000830152611f908185611f01565b90508181036020830152611fa48184611921565b90509392505050565b611fb681611200565b82525050565b6000602082019050611fd16000830184611fad565b92915050565b600081905092915050565b6000611fed8261126b565b611ff78185611fd7565b9350612007818560208601611287565b80840191505092915050565b600061201f8284611fe2565b915081905092915050565b7f6661696c65642073746174696343616c6c20746f20707265636f6d70696c6500600082015250565b6000612060601f83611e04565b915061206b8261202a565b602082019050919050565b6000602082019050818103600083015261208f81612053565b9050919050565b600080fd5b600080fd5b60006120b36120ae846113a2565b611387565b9050828152602081018484840111156120cf576120ce611322565b5b6120da848285611287565b509392505050565b600082601f8301126120f7576120f661131d565b5b81516121078482602086016120a0565b91505092915050565b600067ffffffffffffffff82111561212b5761212a611327565b5b602082029050602081019050919050565b600080fd5b61214a8161151c565b811461215557600080fd5b50565b60008151905061216781612141565b92915050565b61217681611535565b811461218157600080fd5b50565b6000815190506121938161216d565b92915050565b6000606082840312156121af576121ae612096565b5b6121b96060611387565b9050600082015167ffffffffffffffff8111156121d9576121d861209b565b5b6121e5848285016120e2565b60008301525060206121f984828501612158565b602083015250604061220d84828501612184565b60408301525092915050565b600061222c61222784612110565b611387565b9050808382526020820190506020840283018581111561224f5761224e61213c565b5b835b8181101561229657805167ffffffffffffffff8111156122745761227361131d565b5b8086016122818982612199565b85526020850194505050602081019050612251565b5050509392505050565b600082601f8301126122b5576122b461131d565b5b81516122c5848260208601612219565b91505092915050565b6000606082840312156122e4576122e3612096565b5b6122ee6060611387565b9050600082015167ffffffffffffffff81111561230e5761230d61209b565b5b61231a848285016120e2565b600083015250602082015167ffffffffffffffff81111561233e5761233d61209b565b5b61234a848285016122a0565b602083015250604082015167ffffffffffffffff81111561236e5761236d61209b565b5b61237a848285016122a0565b60408301525092915050565b60006020828403121561239c5761239b6111d6565b5b600082015167ffffffffffffffff8111156123ba576123b96111db565b5b6123c6848285016122ce565b91505092915050565b60006040820190506123e46000830185611fad565b81810360208301526123f68184611e15565b90509392505050565b7f6661696c65642064656c656761746543616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b600061245b602183611e04565b9150612466826123ff565b604082019050919050565b6000602082019050818103600083015261248a8161244e565b9050919050565b600067ffffffffffffffff8211156124ac576124ab611327565b5b602082029050602081019050919050565b6000604082840312156124d3576124d2612096565b5b6124dd6040611387565b9050600082015167ffffffffffffffff8111156124fd576124fc61209b565b5b612509848285016120e2565b600083015250602061251d84828501612158565b60208301525092915050565b600061253c61253784612491565b611387565b9050808382526020820190506020840283018581111561255f5761255e61213c565b5b835b818110156125a657805167ffffffffffffffff8111156125845761258361131d565b5b80860161259189826124bd565b85526020850194505050602081019050612561565b5050509392505050565b600082601f8301126125c5576125c461131d565b5b81516125d5848260208601612529565b91505092915050565b6000602082840312156125f4576125f36111d6565b5b600082015167ffffffffffffffff811115612612576126116111db565b5b61261e848285016125b0565b91505092915050565b61263081611834565b811461263b57600080fd5b50565b60008151905061264d81612627565b92915050565b600060208284031215612669576126686111d6565b5b60006126778482850161263e565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006126ba8261151c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036126ec576126eb612680565b5b600182019050919050565b61270081611894565b82525050565b600060408201905061271b6000830185611fad565b61272860208301846126f7565b9392505050565b600061273a8261151c565b91506000820361274d5761274c612680565b5b600182039050919050565b60006020828403121561276e5761276d6111d6565b5b600082015167ffffffffffffffff81111561278c5761278b6111db565b5b612798848285016122a0565b91505092915050565b6127aa816119b8565b82525050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126127dc576127db6127ba565b5b83810192508235915060208301925067ffffffffffffffff821115612804576128036127b0565b5b60018202360383131561281a576128196127b5565b5b509250929050565b600061282e8385611bd7565b935061283b8385846113d3565b612844836112b1565b840190509392505050565b600061285e60208401846119e3565b905092915050565b60008135905061287581612627565b92915050565b600061288a6020840184612866565b905092915050565b61289b81611834565b82525050565b600060a083016128b460008401846127bf565b85830360008701526128c7838284612822565b925050506128d8602084018461284f565b6128e56020860182611ae7565b506128f3604084018461284f565b6129006040860182611ae7565b5061290e606084018461287b565b61291b6060860182612892565b50612929608084018461287b565b6129366080860182612892565b508091505092915050565b6000608082019050818103600083015261295b8187611e15565b905061296a60208301866127a1565b61297760408301856127a1565b818103606083015261298981846128a1565b905095945050505050565b600067ffffffffffffffff8211156129af576129ae611327565b5b602082029050602081019050919050565b6000815190506129cf816119cc565b92915050565b6000604082840312156129eb576129ea612096565b5b6129f56040611387565b90506000612a0584828501612158565b6000830152506020612a1984828501612184565b60208301525092915050565b600060608284031215612a3b57612a3a612096565b5b612a456040611387565b90506000612a55848285016129c0565b6000830152506020612a69848285016129d5565b60208301525092915050565b6000612a88612a8384612994565b611387565b90508083825260208201905060608402830185811115612aab57612aaa61213c565b5b835b81811015612ad45780612ac08882612a25565b845260208401935050606081019050612aad565b5050509392505050565b600082601f830112612af357612af261131d565b5b8151612b03848260208601612a75565b91505092915050565b600067ffffffffffffffff821115612b2757612b26611327565b5b612b30826112b1565b9050602081019050919050565b6000612b50612b4b84612b0c565b611387565b905082815260208101848484011115612b6c57612b6b611322565b5b612b77848285611287565b509392505050565b600082601f830112612b9457612b9361131d565b5b8151612ba4848260208601612b3d565b91505092915050565b600060408284031215612bc357612bc2612096565b5b612bcd6040611387565b9050600082015167ffffffffffffffff811115612bed57612bec61209b565b5b612bf984828501612b7f565b6000830152506020612c0d848285016129c0565b60208301525092915050565b60008060408385031215612c3057612c2f6111d6565b5b600083015167ffffffffffffffff811115612c4e57612c4d6111db565b5b612c5a85828601612ade565b925050602083015167ffffffffffffffff811115612c7b57612c7a6111db565b5b612c8785828601612bad565b9150509250929050565b7f6661696c656420746f2073657420776974686472617720616464726573730000600082015250565b6000612cc7601e83611e04565b9150612cd282612c91565b602082019050919050565b60006020820190508181036000830152612cf681612cba565b9050919050565b600067ffffffffffffffff821115612d1857612d17611327565b5b602082029050602081019050919050565b6000612d3c612d3784612cfd565b611387565b90508083825260208201905060208402830185811115612d5f57612d5e61213c565b5b835b81811015612da657805167ffffffffffffffff811115612d8457612d8361131d565b5b808601612d9189826120e2565b85526020850194505050602081019050612d61565b5050509392505050565b600082601f830112612dc557612dc461131d565b5b8151612dd5848260208601612d29565b91505092915050565b600060208284031215612df457612df36111d6565b5b600082015167ffffffffffffffff811115612e1257612e116111db565b5b612e1e84828501612db0565b91505092915050565b600060208284031215612e3d57612e3c6111d6565b5b600082015167ffffffffffffffff811115612e5b57612e5a6111db565b5b612e67848285016120e2565b91505092915050565b600067ffffffffffffffff821115612e8b57612e8a611327565b5b602082029050602081019050919050565b600060408284031215612eb257612eb1612096565b5b612ebc6040611387565b9050600082015167ffffffffffffffff811115612edc57612edb61209b565b5b612ee8848285016120e2565b600083015250602082015167ffffffffffffffff811115612f0c57612f0b61209b565b5b612f18848285016122a0565b60208301525092915050565b6000612f37612f3284612e70565b611387565b90508083825260208201905060208402830185811115612f5a57612f5961213c565b5b835b81811015612fa157805167ffffffffffffffff811115612f7f57612f7e61131d565b5b808601612f8c8982612e9c565b85526020850194505050602081019050612f5c565b5050509392505050565b600082601f830112612fc057612fbf61131d565b5b8151612fd0848260208601612f24565b91505092915050565b60008060408385031215612ff057612fef6111d6565b5b600083015167ffffffffffffffff81111561300e5761300d6111db565b5b61301a85828601612fab565b925050602083015167ffffffffffffffff81111561303b5761303a6111db565b5b613047858286016122a0565b915050925092905056fea2646970667358221220da4f3e927603d81ab48a6e4fb5139eaedb56b9fef37e7e9e393c598ae51dcb8e64736f6c63430008130033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/precompiles/testutil/contracts/DistributionCaller.sol b/precompiles/testutil/contracts/DistributionCaller.sol index 82f990cf53..5a848f375e 100644 --- a/precompiles/testutil/contracts/DistributionCaller.sol +++ b/precompiles/testutil/contracts/DistributionCaller.sol @@ -5,25 +5,28 @@ import "../../distribution/DistributionI.sol" as distribution; import "../../common/Types.sol" as types; contract DistributionCaller { + /// counter is used to test the state persistence bug, when EVM and Cosmos state were both + /// changed in the same function. + uint256 public counter; function testSetWithdrawAddressFromContract( string memory _withdrawAddr ) public returns (bool) { return - distribution.DISTRIBUTION_CONTRACT.setWithdrawAddress( - address(this), - _withdrawAddr - ); + distribution.DISTRIBUTION_CONTRACT.setWithdrawAddress( + address(this), + _withdrawAddr + ); } function testWithdrawDelegatorRewardsFromContract( string memory _valAddr ) public returns (types.Coin[] memory) { return - distribution.DISTRIBUTION_CONTRACT.withdrawDelegatorRewards( - address(this), - _valAddr - ); + distribution.DISTRIBUTION_CONTRACT.withdrawDelegatorRewards( + address(this), + _valAddr + ); } function testSetWithdrawAddress( @@ -31,10 +34,10 @@ contract DistributionCaller { string memory _withdrawAddr ) public returns (bool) { return - distribution.DISTRIBUTION_CONTRACT.setWithdrawAddress( - _delAddr, - _withdrawAddr - ); + distribution.DISTRIBUTION_CONTRACT.setWithdrawAddress( + _delAddr, + _withdrawAddr + ); } function testWithdrawDelegatorRewards( @@ -42,48 +45,49 @@ contract DistributionCaller { string memory _valAddr ) public returns (types.Coin[] memory) { return - distribution.DISTRIBUTION_CONTRACT.withdrawDelegatorRewards( - _delAddr, - _valAddr - ); + distribution.DISTRIBUTION_CONTRACT.withdrawDelegatorRewards( + _delAddr, + _valAddr + ); } function testWithdrawValidatorCommission( string memory _valAddr ) public returns (types.Coin[] memory) { return - distribution.DISTRIBUTION_CONTRACT.withdrawValidatorCommission( - _valAddr - ); + distribution.DISTRIBUTION_CONTRACT.withdrawValidatorCommission( + _valAddr + ); } function testClaimRewards( address _delAddr, uint32 _maxRetrieve ) public returns (bool success) { - return - distribution.DISTRIBUTION_CONTRACT.claimRewards( + counter++; + success = distribution.DISTRIBUTION_CONTRACT.claimRewards( _delAddr, _maxRetrieve ); + counter--; } function getValidatorDistributionInfo( string memory _valAddr ) public view returns (distribution.ValidatorDistributionInfo memory) { return - distribution.DISTRIBUTION_CONTRACT.validatorDistributionInfo( - _valAddr - ); + distribution.DISTRIBUTION_CONTRACT.validatorDistributionInfo( + _valAddr + ); } function getValidatorOutstandingRewards( string memory _valAddr ) public view returns (types.DecCoin[] memory) { return - distribution.DISTRIBUTION_CONTRACT.validatorOutstandingRewards( - _valAddr - ); + distribution.DISTRIBUTION_CONTRACT.validatorOutstandingRewards( + _valAddr + ); } function getValidatorCommission( @@ -98,20 +102,20 @@ contract DistributionCaller { uint64 _endingHeight, types.PageRequest calldata pageRequest ) - public - view - returns ( - distribution.ValidatorSlashEvent[] memory, - distribution.PageResponse memory - ) + public + view + returns ( + distribution.ValidatorSlashEvent[] memory, + distribution.PageResponse memory + ) { return - distribution.DISTRIBUTION_CONTRACT.validatorSlashes( - _valAddr, - _startingHeight, - _endingHeight, - pageRequest - ); + distribution.DISTRIBUTION_CONTRACT.validatorSlashes( + _valAddr, + _startingHeight, + _endingHeight, + pageRequest + ); } function getDelegationRewards( @@ -119,24 +123,24 @@ contract DistributionCaller { string memory _valAddr ) public view returns (types.DecCoin[] memory) { return - distribution.DISTRIBUTION_CONTRACT.delegationRewards( - _delAddr, - _valAddr - ); + distribution.DISTRIBUTION_CONTRACT.delegationRewards( + _delAddr, + _valAddr + ); } function getDelegationTotalRewards( address _delAddr ) - public - view - returns ( - distribution.DelegationDelegatorReward[] memory rewards, - types.DecCoin[] memory total - ) + public + view + returns ( + distribution.DelegationDelegatorReward[] memory rewards, + types.DecCoin[] memory total + ) { return - distribution.DISTRIBUTION_CONTRACT.delegationTotalRewards(_delAddr); + distribution.DISTRIBUTION_CONTRACT.delegationTotalRewards(_delAddr); } function getDelegatorValidators( @@ -149,9 +153,9 @@ contract DistributionCaller { address _delAddr ) public view returns (string memory) { return - distribution.DISTRIBUTION_CONTRACT.delegatorWithdrawAddress( - _delAddr - ); + distribution.DISTRIBUTION_CONTRACT.delegatorWithdrawAddress( + _delAddr + ); } // testRevertState allows sender to change the withdraw address @@ -168,10 +172,10 @@ contract DistributionCaller { require(success, "failed to set withdraw address"); return - distribution.DISTRIBUTION_CONTRACT.withdrawDelegatorRewards( - _delAddr, - _valAddr - ); + distribution.DISTRIBUTION_CONTRACT.withdrawDelegatorRewards( + _delAddr, + _valAddr + ); } function delegateCallSetWithdrawAddress( @@ -179,14 +183,14 @@ contract DistributionCaller { string memory _withdrawAddr ) public { (bool success, ) = distribution - .DISTRIBUTION_PRECOMPILE_ADDRESS - .delegatecall( - abi.encodeWithSignature( - "setWithdrawAddress(address,string)", - _delAddr, - _withdrawAddr - ) - ); + .DISTRIBUTION_PRECOMPILE_ADDRESS + .delegatecall( + abi.encodeWithSignature( + "setWithdrawAddress(address,string)", + _delAddr, + _withdrawAddr + ) + ); require(success, "failed delegateCall to precompile"); } @@ -195,14 +199,14 @@ contract DistributionCaller { string memory _withdrawAddr ) public view { (bool success, ) = distribution - .DISTRIBUTION_PRECOMPILE_ADDRESS - .staticcall( - abi.encodeWithSignature( - "setWithdrawAddress(address,string)", - _delAddr, - _withdrawAddr - ) - ); + .DISTRIBUTION_PRECOMPILE_ADDRESS + .staticcall( + abi.encodeWithSignature( + "setWithdrawAddress(address,string)", + _delAddr, + _withdrawAddr + ) + ); require(success, "failed staticCall to precompile"); } @@ -210,13 +214,13 @@ contract DistributionCaller { address _delAddr ) public view returns (bytes memory) { (bool success, bytes memory data) = distribution - .DISTRIBUTION_PRECOMPILE_ADDRESS - .staticcall( - abi.encodeWithSignature( - "delegatorWithdrawAddress(address)", - _delAddr - ) - ); + .DISTRIBUTION_PRECOMPILE_ADDRESS + .staticcall( + abi.encodeWithSignature( + "delegatorWithdrawAddress(address)", + _delAddr + ) + ); require(success, "failed staticCall to precompile"); return data; } From 76ce66d2be3bcbae9890ae155ca7e0515fd854b9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Jun 2024 10:01:27 -0300 Subject: [PATCH 284/345] build(deps): bump google.golang.org/protobuf from 1.34.1 to 1.34.2 (#2615) * build(deps): bump google.golang.org/protobuf from 1.34.1 to 1.34.2 Bumps google.golang.org/protobuf from 1.34.1 to 1.34.2. --- updated-dependencies: - dependency-name: google.golang.org/protobuf dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * update gomod2nix.toml file --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 4efbd6fd0a..151489d0ab 100644 --- a/go.mod +++ b/go.mod @@ -50,7 +50,7 @@ require ( golang.org/x/text v0.16.0 google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237 google.golang.org/grpc v1.64.0 - google.golang.org/protobuf v1.34.1 + google.golang.org/protobuf v1.34.2 sigs.k8s.io/yaml v1.4.0 ) diff --git a/go.sum b/go.sum index 8b7f08a09d..2a9cfe6bf7 100644 --- a/go.sum +++ b/go.sum @@ -1826,8 +1826,8 @@ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/gomod2nix.toml b/gomod2nix.toml index 084524c728..1f756e2be1 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -712,8 +712,8 @@ schema = 3 version = "v1.64.0" hash = "sha256-04Noi8lrzr+4ac2BA7KNXUXN/xZL/A2SsEpC2Hern84=" [mod."google.golang.org/protobuf"] - version = "v1.34.1" - hash = "sha256-qnHqY6KLZiZDbTVTN6uzF4jedxROYlPCYHoiv6XI0sc=" + version = "v1.34.2" + hash = "sha256-nMTlrDEE2dbpWz50eQMPBQXCyQh4IdjrTIccaU0F3m0=" [mod."gopkg.in/ini.v1"] version = "v1.67.0" hash = "sha256-V10ahGNGT+NLRdKUyRg1dos5RxLBXBk1xutcnquc/+4=" From 317206dbc9c6e39338b0d28ec2f6d1d8a21a4dec Mon Sep 17 00:00:00 2001 From: Luke Date: Wed, 12 Jun 2024 01:01:02 +0800 Subject: [PATCH 285/345] imp: add integration test for precompile tx `EditValidator` (#2576) * imp: add integration test for precompile tx EditValidator * imp: expected validator commission rate remain unchanged * imp: expected validator commission rate remain unchanged * update StakingCaller contract * add edit validator from sc call test * add fail test case * add missing checks in test * Update precompiles/staking/testdata/StakingCaller.json Signed-off-by: Tom <54514587+GAtom22@users.noreply.github.com> * improve specs readability * make contracts compile * add missing checks in tests * chore: merge the contents of the main branch manually --------- Signed-off-by: Tom <54514587+GAtom22@users.noreply.github.com> Signed-off-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: tom Co-authored-by: stepit Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> --- CHANGELOG.md | 1 + precompiles/staking/integration_test.go | 211 ++++++++++++++++++++++++ 2 files changed, 212 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d19215535..51e0dccc99 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -108,6 +108,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (app) [#2373](https://github.com/evmos/evmos/pull/2373) Remove ChainID constraint. - (rpc) [#2375](https://github.com/evmos/evmos/pull/2375) Add support for allow-insecure-unlock. - (tests) [#2575](https://github.com/evmos/evmos/pull/2575) Add integration test for precompile tx `CreateValidator`. +- (tests) [#2576](https://github.com/evmos/evmos/pull/2576) Add integration test for precompile tx `EditValidator`. - (evm) [#2581](https://github.com/evmos/evmos/pull/2581) Fix wrong error message returned for DynamicFee txs. ### State Machine Breaking diff --git a/precompiles/staking/integration_test.go b/precompiles/staking/integration_test.go index 12ca6f9579..0ea4ef2d8f 100644 --- a/precompiles/staking/integration_test.go +++ b/precompiles/staking/integration_test.go @@ -469,6 +469,104 @@ var _ = Describe("Calling staking precompile directly", func() { }) }) + Describe("to edit validator", func() { + var ( + defaultDescription = staking.Description{ + Moniker: "edit node", + Identity: "[do-not-modify]", + Website: "[do-not-modify]", + SecurityContact: "[do-not-modify]", + Details: "[do-not-modify]", + } + defaultCommissionRate = big.NewInt(staking.DoNotModifyCommissionRate) + defaultMinSelfDelegation = big.NewInt(staking.DoNotModifyMinSelfDelegation) + + // defaultEditValidatorArgs are the default arguments for the editValidator call + // + // NOTE: this has to be populated in the BeforeEach block because the private key is not initialized before + defaultEditValidatorArgs contracts.CallArgs + ) + + BeforeEach(func() { + // populate the default editValidator args + defaultEditValidatorArgs = defaultCallArgs.WithMethodName(staking.EditValidatorMethod) + }) + + Context("when origin is equal to validator address", func() { + It("should succeed", func() { + // create a new validator + newAddr, newPriv := testutiltx.NewAccAddressAndKey() + hexAddr := common.BytesToAddress(newAddr.Bytes()) + err := evmosutil.FundAccountWithBaseDenom(s.ctx, s.app.BankKeeper, newAddr, 2e18) + Expect(err).To(BeNil(), "error while funding account: %v", err) + + description := staking.Description{ + Moniker: "new node", + Identity: "", + Website: "", + SecurityContact: "", + Details: "", + } + commission := staking.Commission{ + Rate: big.NewInt(100000000000000000), + MaxRate: big.NewInt(100000000000000000), + MaxChangeRate: big.NewInt(100000000000000000), + } + minSelfDelegation := big.NewInt(1) + pubkeyBase64Str := "UuhHQmkUh2cPBA6Rg4ei0M2B04cVYGNn/F8SAUsYIb4=" + value := big.NewInt(1e18) + + createValidatorArgs := defaultCallArgs.WithMethodName(staking.CreateValidatorMethod). + WithPrivKey(newPriv). + WithArgs(description, commission, minSelfDelegation, hexAddr, pubkeyBase64Str, value) + + logCheckArgs := passCheck.WithExpEvents(staking.EventTypeCreateValidator) + + _, _, err = contracts.CallContractAndCheckLogs(s.ctx, s.app, createValidatorArgs, logCheckArgs) + Expect(err).To(BeNil(), "error while calling the smart contract: %v", err) + + s.NextBlock() + + // edit validator + editValidatorArgs := defaultEditValidatorArgs. + WithPrivKey(newPriv). + WithArgs(defaultDescription, hexAddr, defaultCommissionRate, defaultMinSelfDelegation) + + logCheckArgs = passCheck.WithExpEvents(staking.EventTypeEditValidator) + + _, _, err = contracts.CallContractAndCheckLogs(s.ctx, s.app, editValidatorArgs, logCheckArgs) + Expect(err).To(BeNil(), "error while calling the smart contract: %v", err) + + validator, found := s.app.StakingKeeper.GetValidator(s.ctx, newAddr.Bytes()) + Expect(found).To(BeTrue(), "expected validator to be found") + Expect(validator.Description.Moniker).To(Equal(defaultDescription.Moniker), "expected validator moniker is updated") + // Other fields should not be modified due to the value "[do-not-modify]". + Expect(validator.Description.Identity).To(Equal(description.Identity), "expected validator identity not to be updated") + Expect(validator.Description.Website).To(Equal(description.Website), "expected validator website not to be updated") + Expect(validator.Description.SecurityContact).To(Equal(description.SecurityContact), "expected validator security contact not to be updated") + Expect(validator.Description.Details).To(Equal(description.Details), "expected validator details not to be updated") + + Expect(validator.Commission.Rate.BigInt().String()).To(Equal(commission.Rate.String()), "expected validator commission rate remain unchanged") + Expect(validator.Commission.MaxRate.BigInt().String()).To(Equal(commission.MaxRate.String()), "expected validator max commission rate remain unchanged") + Expect(validator.Commission.MaxChangeRate.BigInt().String()).To(Equal(commission.MaxChangeRate.String()), "expected validator max change rate remain unchanged") + Expect(validator.MinSelfDelegation.String()).To(Equal(minSelfDelegation.String()), "expected validator min self delegation remain unchanged") + }) + }) + + Context("with origin different than validator address", func() { + It("should fail", func() { + editValidatorArgs := defaultEditValidatorArgs.WithArgs( + defaultDescription, common.BytesToAddress(valAddr.Bytes()), defaultCommissionRate, defaultMinSelfDelegation, + ) + + logCheckArgs := passCheck.WithExpEvents(staking.EventTypeEditValidator) + + _, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, editValidatorArgs, logCheckArgs) + Expect(err).To(HaveOccurred(), "error while calling the smart contract: %v", err) + }) + }) + }) + Describe("to delegate", func() { var ( // prevDelegation is the delegation that is available prior to the test (an initial delegation is @@ -1893,6 +1991,119 @@ var _ = Describe("Calling staking precompile via Solidity", func() { }) }) + Context("to edit a validator", func() { + var ( + // NOTE: this has to be populated in the BeforeEach block because the private key is not initialized before + defaultEditValArgs contracts.CallArgs + valPriv *ethsecp256k1.PrivKey + valAddr sdk.AccAddress + valHexAddr common.Address + + defaultDescription = staking.Description{ + Moniker: "edit node", + Identity: "[do-not-modify]", + Website: "[do-not-modify]", + SecurityContact: "[do-not-modify]", + Details: "[do-not-modify]", + } + defaultCommissionRate = big.NewInt(staking.DoNotModifyCommissionRate) + defaultMinSelfDelegation = big.NewInt(staking.DoNotModifyMinSelfDelegation) + + minSelfDelegation = big.NewInt(1) + + description = staking.Description{} + commission = staking.Commission{} + ) + + BeforeEach(func() { + defaultEditValArgs = defaultCallArgs.WithMethodName("testEditValidator") + + // create a new validator + valAddr, valPriv = testutiltx.NewAccAddressAndKey() + valHexAddr = common.BytesToAddress(valAddr.Bytes()) + err := evmosutil.FundAccountWithBaseDenom(s.ctx, s.app.BankKeeper, valAddr, 2e18) + Expect(err).To(BeNil(), "error while funding account: %v", err) + + description = staking.Description{ + Moniker: "original moniker", + Identity: "", + Website: "", + SecurityContact: "", + Details: "", + } + commission = staking.Commission{ + Rate: big.NewInt(100000000000000000), + MaxRate: big.NewInt(100000000000000000), + MaxChangeRate: big.NewInt(100000000000000000), + } + pubkeyBase64Str := "UuhHQmkUh2cPBA6Rg4ei0M2B04cVYGNn/F8SAUsYIb4=" + value := big.NewInt(1e18) + + createValidatorArgs := contracts.CallArgs{ + ContractAddr: s.precompile.Address(), + ContractABI: s.precompile.ABI, + MethodName: staking.CreateValidatorMethod, + PrivKey: valPriv, + Args: []interface{}{description, commission, minSelfDelegation, valHexAddr, pubkeyBase64Str, value}, + } + + logCheckArgs := passCheck.WithExpEvents(staking.EventTypeCreateValidator) + + _, _, err = contracts.CallContractAndCheckLogs(s.ctx, s.app, createValidatorArgs, logCheckArgs) + Expect(err).To(BeNil(), "error while calling the smart contract: %v", err) + + s.NextBlock() + }) + + It("with tx from validator operator - should edit a validator", func() { + cArgs := defaultEditValArgs. + WithPrivKey(valPriv). + WithArgs( + defaultDescription, valHexAddr, + defaultCommissionRate, defaultMinSelfDelegation, + ) + + logCheckArgs := passCheck. + WithExpEvents(staking.EventTypeEditValidator) + + _, _, err = contracts.CallContractAndCheckLogs(s.ctx, s.app, cArgs, logCheckArgs) + Expect(err).To(BeNil(), "error while calling the smart contract: %v", err) + + validator, found := s.app.StakingKeeper.GetValidator(s.ctx, valAddr.Bytes()) + Expect(found).To(BeTrue(), "expected validator to be found") + Expect(validator.Description.Moniker).To(Equal(defaultDescription.Moniker), "expected validator moniker to be updated") + // Other fields should not be modified due to the value "[do-not-modify]". + Expect(validator.Description.Identity).To(Equal(description.Identity), "expected validator identity not to be updated") + Expect(validator.Description.Website).To(Equal(description.Website), "expected validator website not to be updated") + Expect(validator.Description.SecurityContact).To(Equal(description.SecurityContact), "expected validator security contact not to be updated") + Expect(validator.Description.Details).To(Equal(description.Details), "expected validator details not to be updated") + + Expect(validator.Commission.Rate.BigInt().String()).To(Equal(commission.Rate.String()), "expected validator commission rate remain unchanged") + Expect(validator.Commission.MaxRate.BigInt().String()).To(Equal(commission.MaxRate.String()), "expected validator max commission rate remain unchanged") + Expect(validator.Commission.MaxChangeRate.BigInt().String()).To(Equal(commission.MaxChangeRate.String()), "expected validator max change rate remain unchanged") + Expect(validator.MinSelfDelegation.String()).To(Equal(minSelfDelegation.String()), "expected validator min self delegation remain unchanged") + }) + + It("with tx from another EOA - should fail", func() { + cArgs := defaultEditValArgs. + WithPrivKey(s.privKey). + WithArgs( + defaultDescription, valHexAddr, + defaultCommissionRate, defaultMinSelfDelegation, + ) + + _, _, err = contracts.CallContractAndCheckLogs(s.ctx, s.app, cArgs, execRevertedCheck) + Expect(err).To(HaveOccurred(), "expected error while calling the precompile") + Expect(err.Error()).To(ContainSubstring(vm.ErrExecutionReverted.Error())) + + // validator should remain unchanged + validator, found := s.app.StakingKeeper.GetValidator(s.ctx, valAddr.Bytes()) + Expect(found).To(BeTrue(), "expected validator to be found") + Expect(validator.Description.Moniker).To(Equal("original moniker"), "expected validator moniker is updated") + Expect(validator.Commission.Rate.BigInt().String()).To(Equal("100000000000000000"), "expected validator commission rate remain unchanged") + }) + }) + Context("delegating", func() { var ( // prevDelegation is the delegation that is available prior to the test (an initial delegation is From 2d2f357f425ae39c243aa88785c51c8bc5598c9c Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Tue, 11 Jun 2024 20:53:55 +0200 Subject: [PATCH 286/345] imp(precompiles): Add unit test to ensure correct Bech32 addresses for default precompiles (#2597) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add a test case for the bech32 converted precompile addresses in the default precompiles * run make format * address linter * fix some f-up during merge * fix changelog * fix panic when estimating gas during call to precompiles without input * remove default precompiles bech32 and move to blocked addrs function * add all Ethereum native precompiles to blocked addresses too * run make format * format * f auto-format * add comments as suggested in code review * add utility method for future use to convert addresses * fix changelog --------- Co-authored-by: MalteHerrmann Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> --- CHANGELOG.md | 13 +-- app/app.go | 28 +++++- app/app_test.go | 107 ++++++++++++++++++----- precompiles/bank/bank.go | 5 ++ precompiles/bech32/bech32.go | 5 ++ precompiles/common/types.go | 10 --- precompiles/distribution/distribution.go | 10 ++- precompiles/erc20/erc20.go | 2 +- precompiles/ics20/ics20.go | 10 ++- precompiles/staking/staking.go | 5 ++ precompiles/vesting/vesting.go | 10 ++- scripts/changelog_checker/config.py | 1 + utils/utils.go | 11 +++ 13 files changed, 174 insertions(+), 43 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 51e0dccc99..5eb0132d96 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -54,8 +54,8 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (upgrade) [#2533](https://github.com/evmos/evmos/pull/2533) Add upgrade handler for v19. - (staking) [#2051](https://github.com/evmos/evmos/pull/2051) Implement the `EditValidator` function for staking precompiled contract. - (evm) [#2538](https://github.com/evmos/evmos/pull/2538) Add Permissions Policy for permissioned EVM. -- (erc20) [#2609] (https://github.com/evmos/evmos/pull/2609) Remove STRv2 tracking logic. -- (distribution-precompile) [#2614] (https://github.com/evmos/evmos/pull/2614) Add withdrawer address check in transactions. +- (erc20) [#2609](https://github.com/evmos/evmos/pull/2609) Remove STRv2 tracking logic. +- (distribution-precompile) [#2614](https://github.com/evmos/evmos/pull/2614) Add withdrawer address check in transactions. ### Bug Fixes @@ -99,9 +99,10 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (ibc) [#2504](https://github.com/evmos/evmos/pull/2504) Refactor repeated unpacking of IBC packet data. - (make) [#2487](https://github.com/evmos/evmos/pull/2487) Improve make command to compile all smart contracts in repository. - (evm) [#2594](https://github.com/evmos/evmos/pull/2594) Move `CallEVM` and `CallEVMWithData` to `x/evm` module. +- (app) [#2597](https://github.com/evmos/evmos/pull/2597) Remove hardcoded Bech32 conversions for blocked precompile addresses. - (contracts) [#2613](https://github.com/evmos/evmos/pull/2613) Remove unused contract and make script useable with Python <3.12. -## [v18.1.0](https://github.com/evmos/evmos/releases/tag/v18.1.0) - 2024-05-31 +## [v18.1.0](https://github.com/evmos/evmos/releases/tag/v18.1.0) - 2024-05-31 ### Improvements @@ -116,11 +117,13 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (evm) [#2559](https://github.com/evmos/evmos/pull/2559) Fix duplicate event emitting of cached events. - (precompiles) [#2550](https://github.com/evmos/evmos/pull/2550) Update secp256r1 curve precompile bech32 address to its corresponding value. - (vesting) [#2507](https://github.com/evmos/evmos/pull/2507) Consider locked-up vested delegated coins in `LockedCoins` calculation. -- (security) [#2596](https://github.com/evmos/evmos/pull/2596) Merge security advisory GHSA-xgr7-jgq3-mhmc +- (ics20) [#2596](https://github.com/evmos/evmos/pull/2596) Merge security advisory GHSA-xgr7-jgq3-mhmc. ## [v18.0.1](https://github.com/evmos/evmos/releases/tag/v18.0.1) - 2024-05-29 -- (app) [2589](https://github.com/evmos/evmos/pull/2589) Schedule v18.1 upgrade +### Improvements + +- (app) [#2589](https://github.com/evmos/evmos/pull/2589) Schedule v18.1 upgrade. ## [v18.0.0](https://github.com/evmos/evmos/releases/tag/v18.0.0) - 2024-04-22 diff --git a/app/app.go b/app/app.go index 2d13f14395..86e5bfb800 100644 --- a/app/app.go +++ b/app/app.go @@ -117,8 +117,11 @@ import ( consensusparamkeeper "github.com/cosmos/cosmos-sdk/x/consensus/keeper" consensusparamtypes "github.com/cosmos/cosmos-sdk/x/consensus/types" + "github.com/ethereum/go-ethereum/core/vm" + // unnamed import of statik for swagger UI support _ "github.com/evmos/evmos/v18/client/docs/statik" + "github.com/evmos/evmos/v18/utils" "github.com/evmos/evmos/v18/app/ante" ethante "github.com/evmos/evmos/v18/app/ante/evm" @@ -128,7 +131,13 @@ import ( v19 "github.com/evmos/evmos/v18/app/upgrades/v19" "github.com/evmos/evmos/v18/encoding" "github.com/evmos/evmos/v18/ethereum/eip712" - "github.com/evmos/evmos/v18/precompiles/common" + bankprecompile "github.com/evmos/evmos/v18/precompiles/bank" + bech32precompile "github.com/evmos/evmos/v18/precompiles/bech32" + distprecompile "github.com/evmos/evmos/v18/precompiles/distribution" + ics20precompile "github.com/evmos/evmos/v18/precompiles/ics20" + p256precompile "github.com/evmos/evmos/v18/precompiles/p256" + stakingprecompile "github.com/evmos/evmos/v18/precompiles/staking" + vestingprecompile "github.com/evmos/evmos/v18/precompiles/vesting" srvflags "github.com/evmos/evmos/v18/server/flags" evmostypes "github.com/evmos/evmos/v18/types" "github.com/evmos/evmos/v18/x/epochs" @@ -935,8 +944,21 @@ func (app *Evmos) BlockedAddrs() map[string]bool { blockedAddrs[authtypes.NewModuleAddress(acc).String()] = true } - for _, precompile := range common.DefaultPrecompilesBech32 { - blockedAddrs[precompile] = true + blockedPrecompilesHex := []string{ + p256precompile.PrecompileAddress, + bech32precompile.PrecompileAddress, + bankprecompile.PrecompileAddress, + stakingprecompile.PrecompileAddress, + distprecompile.PrecompileAddress, + ics20precompile.PrecompileAddress, + vestingprecompile.PrecompileAddress, + } + for _, addr := range vm.PrecompiledAddressesBerlin { + blockedPrecompilesHex = append(blockedPrecompilesHex, addr.Hex()) + } + + for _, precompile := range blockedPrecompilesHex { + blockedAddrs[utils.EthHexToSDKAddr(precompile).String()] = true } return blockedAddrs diff --git a/app/app_test.go b/app/app_test.go index 4e7fed63e6..76701934ae 100644 --- a/app/app_test.go +++ b/app/app_test.go @@ -1,13 +1,18 @@ -package app +package app_test import ( "encoding/json" + "fmt" + "math/big" "os" + "slices" "testing" "cosmossdk.io/math" - "github.com/stretchr/testify/require" - + dbm "github.com/cometbft/cometbft-db" + abci "github.com/cometbft/cometbft/abci/types" + "github.com/cometbft/cometbft/libs/log" + tmtypes "github.com/cometbft/cometbft/types" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" @@ -15,14 +20,17 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/cosmos/ibc-go/v7/testing/mock" - - dbm "github.com/cometbft/cometbft-db" - abci "github.com/cometbft/cometbft/abci/types" - "github.com/cometbft/cometbft/libs/log" - tmtypes "github.com/cometbft/cometbft/types" - + ethcommon "github.com/ethereum/go-ethereum/common" + "github.com/evmos/evmos/v18/app" "github.com/evmos/evmos/v18/encoding" + commontestfactory "github.com/evmos/evmos/v18/testutil/integration/common/factory" + testfactory "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" + testnetwork "github.com/evmos/evmos/v18/testutil/integration/evmos/network" "github.com/evmos/evmos/v18/utils" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/stretchr/testify/require" ) func TestEvmosExport(t *testing.T) { @@ -45,39 +53,96 @@ func TestEvmosExport(t *testing.T) { db := dbm.NewMemDB() chainID := utils.MainnetChainID + "-1" - app := NewEvmos( + evmosApp := app.NewEvmos( log.NewTMLogger(log.NewSyncWriter(os.Stdout)), db, nil, true, map[int64]bool{}, - DefaultNodeHome, 0, - encoding.MakeConfig(ModuleBasics), - simtestutil.NewAppOptionsWithFlagHome(DefaultNodeHome), + app.DefaultNodeHome, 0, + encoding.MakeConfig(app.ModuleBasics), + simtestutil.NewAppOptionsWithFlagHome(app.DefaultNodeHome), baseapp.SetChainID(chainID), ) - genesisState := NewDefaultGenesisState() - genesisState = GenesisStateWithValSet(app, genesisState, valSet, []authtypes.GenesisAccount{acc}, balance) + genesisState := app.NewDefaultGenesisState() + genesisState = app.GenesisStateWithValSet(evmosApp, genesisState, valSet, []authtypes.GenesisAccount{acc}, balance) stateBytes, err := json.MarshalIndent(genesisState, "", " ") require.NoError(t, err) // Initialize the chain - app.InitChain( + evmosApp.InitChain( abci.RequestInitChain{ ChainId: chainID, Validators: []abci.ValidatorUpdate{}, AppStateBytes: stateBytes, }, ) - app.Commit() + evmosApp.Commit() // Making a new app object with the db, so that initchain hasn't been called - app2 := NewEvmos( + app2 := app.NewEvmos( log.NewTMLogger(log.NewSyncWriter(os.Stdout)), db, nil, true, map[int64]bool{}, - DefaultNodeHome, 0, - encoding.MakeConfig(ModuleBasics), - simtestutil.NewAppOptionsWithFlagHome(DefaultNodeHome), + app.DefaultNodeHome, 0, + encoding.MakeConfig(app.ModuleBasics), + simtestutil.NewAppOptionsWithFlagHome(app.DefaultNodeHome), baseapp.SetChainID(chainID), ) _, err = app2.ExportAppStateAndValidators(false, []string{}, []string{}) require.NoError(t, err, "ExportAppStateAndValidators should not have an error") } + +// This test checks is a safeguard to avoid missing precompiles that should be blocked addresses. +// +// It does so, by initially expecting all precompiles available in the EVM to be blocked, and +// require developers to specify exactly which should be an exception to this rule. +func TestPrecompilesAreBlockedAddrs(t *testing.T) { + keyring := testkeyring.New(1) + signer := keyring.GetKey(0) + network := testnetwork.NewUnitTestNetwork( + testnetwork.WithPreFundedAccounts(signer.AccAddr), + ) + handler := grpc.NewIntegrationHandler(network) + factory := testfactory.New(network, handler) + + // NOTE: all precompiles that should NOT be blocked addresses need to go in here + // + // For now there are no exceptions, so this slice is empty. + var precompilesAbleToReceiveFunds []ethcommon.Address + + availablePrecompiles := network.App.EvmKeeper.GetAvailablePrecompileAddrs() + for _, precompileAddr := range availablePrecompiles { + t.Run(fmt.Sprintf("Cosmos Tx to %s\n", precompileAddr), func(t *testing.T) { + _, err := factory.ExecuteCosmosTx(signer.Priv, commontestfactory.CosmosTxArgs{ + Msgs: []sdk.Msg{ + banktypes.NewMsgSend( + signer.AccAddr, + precompileAddr.Bytes(), + sdk.NewCoins(sdk.NewCoin(network.GetDenom(), sdk.NewInt(1e10))), + ), + }, + }) + + require.NoError(t, network.NextBlock(), "failed to advance block") + + if slices.Contains(precompilesAbleToReceiveFunds, precompileAddr) { + require.NoError(t, err, "failed to send funds to precompile %s that should not be blocked", precompileAddr) + } else { + require.Error(t, err, "was able to send funds to precompile %s that should be blocked", precompileAddr) + } + }) + + t.Run(fmt.Sprintf("EVM Tx to %s\n", precompileAddr), func(t *testing.T) { + _, err := factory.ExecuteEthTx(signer.Priv, evmtypes.EvmTxArgs{ + To: &precompileAddr, + Amount: big.NewInt(1e10), + }) + + require.NoError(t, network.NextBlock(), "failed to advance block") + + if slices.Contains(precompilesAbleToReceiveFunds, precompileAddr) { + require.NoError(t, err, "failed to send funds with Eth transaction to precompile %s that should not be blocked", precompileAddr) + } else { + require.Error(t, err, "was able to send funds with Eth transaction to precompile %s that should be blocked", precompileAddr) + } + }) + } +} diff --git a/precompiles/bank/bank.go b/precompiles/bank/bank.go index 0857e1594d..46847dd125 100644 --- a/precompiles/bank/bank.go +++ b/precompiles/bank/bank.go @@ -75,6 +75,11 @@ func (Precompile) Address() common.Address { // RequiredGas calculates the precompiled contract's base gas rate. func (p Precompile) RequiredGas(input []byte) uint64 { + // NOTE: This check avoid panicking when trying to decode the method ID + if len(input) < 4 { + return 0 + } + methodID := input[:4] method, err := p.MethodById(methodID) diff --git a/precompiles/bech32/bech32.go b/precompiles/bech32/bech32.go index a2f5cb954b..d4f9dd2f00 100644 --- a/precompiles/bech32/bech32.go +++ b/precompiles/bech32/bech32.go @@ -62,6 +62,11 @@ func (p Precompile) RequiredGas(_ []byte) uint64 { // Run executes the precompiled contract bech32 methods defined in the ABI. func (p Precompile) Run(_ *vm.EVM, contract *vm.Contract, _ bool) (bz []byte, err error) { + // NOTE: This check avoid panicking when trying to decode the method ID + if len(contract.Input) < 4 { + return nil, vm.ErrExecutionReverted + } + methodID := contract.Input[:4] // NOTE: this function iterates over the method map and returns // the method with the given ID diff --git a/precompiles/common/types.go b/precompiles/common/types.go index 9c9da04b23..668c30a759 100644 --- a/precompiles/common/types.go +++ b/precompiles/common/types.go @@ -21,16 +21,6 @@ var ( DefaultExpirationDuration = time.Hour * 24 * 365 // DefaultChainID is the standard chain id used for testing purposes DefaultChainID = evmosutils.MainnetChainID + "-1" - // DefaultPrecompilesBech32 is the standard bech32 address for the precompiles - DefaultPrecompilesBech32 = []string{ - "evmos1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqgqjuj7hv", // secp256r1 curve precompile - "evmos1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqpqqnqcxyd", // bech32 precompile - "evmos1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqzqq4xrkxv", // Staking precompile - "evmos1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqzqpgshrm7", // Distribution precompile - "evmos1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqzqzxrz44p", // ICS20 transfer precompile - "evmos1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqzqrm4kqgn", // Vesting precompile - "evmos1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqzqy6vpsfk", // Bank precompile - } ) // ICS20Allocation defines the spend limit for a particular port and channel. diff --git a/precompiles/distribution/distribution.go b/precompiles/distribution/distribution.go index 7486c36219..a9aa2ebc54 100644 --- a/precompiles/distribution/distribution.go +++ b/precompiles/distribution/distribution.go @@ -18,6 +18,9 @@ import ( stakingkeeper "github.com/evmos/evmos/v18/x/staking/keeper" ) +// PrecompileAddress of the distribution EVM extension in hex format. +const PrecompileAddress = "0x0000000000000000000000000000000000000801" + var _ vm.PrecompiledContract = &Precompile{} // Embed abi json file to the executable binary. Needed when importing as dependency. @@ -65,11 +68,16 @@ func NewPrecompile( // Address defines the address of the distribution compile contract. // address: 0x0000000000000000000000000000000000000801 func (p Precompile) Address() common.Address { - return common.HexToAddress("0x0000000000000000000000000000000000000801") + return common.HexToAddress(PrecompileAddress) } // RequiredGas calculates the precompiled contract's base gas rate. func (p Precompile) RequiredGas(input []byte) uint64 { + // NOTE: This check avoid panicking when trying to decode the method ID + if len(input) < 4 { + return 0 + } + methodID := input[:4] method, err := p.MethodById(methodID) diff --git a/precompiles/erc20/erc20.go b/precompiles/erc20/erc20.go index 9235465a24..8ba7f607e5 100644 --- a/precompiles/erc20/erc20.go +++ b/precompiles/erc20/erc20.go @@ -87,7 +87,7 @@ func (p Precompile) Address() common.Address { // RequiredGas calculates the contract gas used for the func (p Precompile) RequiredGas(input []byte) uint64 { - // Validate input length + // NOTE: This check avoid panicking when trying to decode the method ID if len(input) < 4 { return 0 } diff --git a/precompiles/ics20/ics20.go b/precompiles/ics20/ics20.go index a5e0611b78..eaed77f4bb 100644 --- a/precompiles/ics20/ics20.go +++ b/precompiles/ics20/ics20.go @@ -20,6 +20,9 @@ import ( stakingkeeper "github.com/evmos/evmos/v18/x/staking/keeper" ) +// PrecompileAddress of the ICS-20 EVM extension in hex format. +const PrecompileAddress = "0x0000000000000000000000000000000000000802" + var _ vm.PrecompiledContract = &Precompile{} // Embed abi json file to the executable binary. Needed when importing as dependency. @@ -69,11 +72,16 @@ func NewPrecompile( // Address defines the address of the ICS-20 compile contract. // address: 0x0000000000000000000000000000000000000802 func (Precompile) Address() common.Address { - return common.HexToAddress("0x0000000000000000000000000000000000000802") + return common.HexToAddress(PrecompileAddress) } // RequiredGas calculates the precompiled contract's base gas rate. func (p Precompile) RequiredGas(input []byte) uint64 { + // NOTE: This check avoid panicking when trying to decode the method ID + if len(input) < 4 { + return 0 + } + methodID := input[:4] method, err := p.MethodById(methodID) diff --git a/precompiles/staking/staking.go b/precompiles/staking/staking.go index 2cdf64fb13..a866120764 100644 --- a/precompiles/staking/staking.go +++ b/precompiles/staking/staking.go @@ -66,6 +66,11 @@ func NewPrecompile( // RequiredGas returns the required bare minimum gas to execute the precompile. func (p Precompile) RequiredGas(input []byte) uint64 { + // NOTE: This check avoid panicking when trying to decode the method ID + if len(input) < 4 { + return 0 + } + methodID := input[:4] method, err := p.MethodById(methodID) diff --git a/precompiles/vesting/vesting.go b/precompiles/vesting/vesting.go index e7d7a08fae..300a0740c5 100644 --- a/precompiles/vesting/vesting.go +++ b/precompiles/vesting/vesting.go @@ -22,6 +22,9 @@ import ( vestingkeeper "github.com/evmos/evmos/v18/x/vesting/keeper" ) +// PrecompileAddress of the vesting EVM extension in hex format. +const PrecompileAddress = "0x0000000000000000000000000000000000000803" + var _ vm.PrecompiledContract = &Precompile{} // Embed abi json file to the executable binary. Needed when importing as dependency. @@ -37,6 +40,11 @@ type Precompile struct { // RequiredGas returns the required bare minimum gas to execute the precompile. func (p Precompile) RequiredGas(input []byte) uint64 { + // NOTE: This check avoid panicking when trying to decode the method ID + if len(input) < 4 { + return 0 + } + methodID := input[:4] method, err := p.MethodById(methodID) @@ -79,7 +87,7 @@ func NewPrecompile( // Address defines the address of the staking compile contract. // address: 0x0000000000000000000000000000000000000803 func (Precompile) Address() common.Address { - return common.HexToAddress("0x0000000000000000000000000000000000000803") + return common.HexToAddress(PrecompileAddress) } // Run executes the precompiled contract staking methods defined in the ABI. diff --git a/scripts/changelog_checker/config.py b/scripts/changelog_checker/config.py index 9ac1eb9183..c39f82a8f1 100644 --- a/scripts/changelog_checker/config.py +++ b/scripts/changelog_checker/config.py @@ -39,6 +39,7 @@ def get_allowed_categories() -> List[str]: "ci", "cli", "crisis", + "contracts", "db", "deps", "docs", diff --git a/utils/utils.go b/utils/utils.go index dfabc48aa5..f0e06fd2e2 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -31,6 +31,17 @@ const ( BaseDenom = "aevmos" ) +// EthHexToSDKAddr takes a given Hex string and derives a Cosmos SDK account address +// from it. +func EthHexToSDKAddr(hexAddr string) sdk.AccAddress { + return EthToSDKAddr(common.HexToAddress(hexAddr)) +} + +// EthToSDKAddr converts a given Ethereum style address to an SDK address. +func EthToSDKAddr(addr common.Address) sdk.AccAddress { + return sdk.AccAddress(addr.Bytes()) +} + // IsMainnet returns true if the chain-id has the Evmos mainnet EIP155 chain prefix. func IsMainnet(chainID string) bool { return strings.HasPrefix(chainID, MainnetChainID) From dd43f33db7c0b04fdb0982f537e2cd0da55ec893 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Jun 2024 11:53:55 +0200 Subject: [PATCH 287/345] build(deps): bump the npm_and_yarn group across 3 directories with 2 updates (#2616) Bumps the npm_and_yarn group with 1 update in the /contracts directory: [braces](https://github.com/micromatch/braces). Bumps the npm_and_yarn group with 2 updates in the /tests/nix_tests/hardhat directory: [braces](https://github.com/micromatch/braces) and [axios](https://github.com/axios/axios). Bumps the npm_and_yarn group with 1 update in the /tests/solidity directory: [braces](https://github.com/micromatch/braces). Updates `braces` from 3.0.2 to 3.0.3 - [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3) Updates `braces` from 3.0.2 to 3.0.3 - [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3) Updates `axios` from 1.6.1 to 1.7.2 - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md) - [Commits](https://github.com/axios/axios/compare/v1.6.1...v1.7.2) Updates `braces` from 3.0.2 to 3.0.3 - [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3) --- updated-dependencies: - dependency-name: braces dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: braces dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: axios dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: braces dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- contracts/package-lock.json | 14 ++++---- tests/nix_tests/hardhat/package-lock.json | 44 +++++++++++------------ tests/solidity/yarn.lock | 16 ++++----- 3 files changed, 37 insertions(+), 37 deletions(-) diff --git a/contracts/package-lock.json b/contracts/package-lock.json index c9f30c5524..c13e990ac4 100644 --- a/contracts/package-lock.json +++ b/contracts/package-lock.json @@ -1363,12 +1363,12 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -1828,9 +1828,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" diff --git a/tests/nix_tests/hardhat/package-lock.json b/tests/nix_tests/hardhat/package-lock.json index 4a4f87d816..a3bb629c93 100644 --- a/tests/nix_tests/hardhat/package-lock.json +++ b/tests/nix_tests/hardhat/package-lock.json @@ -2117,12 +2117,12 @@ } }, "node_modules/axios": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.1.tgz", - "integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", "dev": true, "dependencies": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -2316,12 +2316,12 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -3392,9 +3392,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" @@ -8284,12 +8284,12 @@ "dev": true }, "axios": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.1.tgz", - "integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", "dev": true, "requires": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -8440,12 +8440,12 @@ } }, "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "requires": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" } }, "brorand": { @@ -9308,9 +9308,9 @@ } }, "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "requires": { "to-regex-range": "^5.0.1" diff --git a/tests/solidity/yarn.lock b/tests/solidity/yarn.lock index 4b2b81c5ae..22e6e81246 100644 --- a/tests/solidity/yarn.lock +++ b/tests/solidity/yarn.lock @@ -3387,11 +3387,11 @@ brace-expansion@^2.0.1: balanced-match "^1.0.0" braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - fill-range "^7.0.1" + fill-range "^7.1.1" brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" @@ -5369,10 +5369,10 @@ file-uri-to-path@1.0.0: resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" From 2628978e6fda9f5f426056fa00aa3af2938a7fba Mon Sep 17 00:00:00 2001 From: Luke Date: Fri, 14 Jun 2024 00:31:42 +0800 Subject: [PATCH 288/345] feat(precompile): add `FundCommunityPool` precompile tx for distribution module (#2572) * feat(precompile): add FundCommunityPool precompile tx for distribution module * chore: update CHANGELOG.md * chore: add nolint for TestFundCommunityPoolEvent and TestClaimRewardsEvent * chore: add nolint for TestFundCommunityPoolEvent and TestClaimRewardsEvent * feat(precompile): add contract can call FundCommunityPool tx * chore: lint check * chore: fix make lint and rename delegator to depositor * update DistributionCaller contract * add nix tests * use base denom as in msg build stage * fix gh action yml * fix doc * add sender post balance check * Update precompiles/distribution/types.go Signed-off-by: stepit <48993133+0xstepit@users.noreply.github.com> * chore: bring back deposit and tesatFundCommunityPool methods --------- Signed-off-by: Tom <54514587+GAtom22@users.noreply.github.com> Signed-off-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: tom Co-authored-by: stepit Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> --- .github/workflows/e2e-test.yml | 1 + CHANGELOG.md | 2 + precompiles/common/errors.go | 8 +- precompiles/distribution/DistributionI.sol | 54 ++++--- precompiles/distribution/abi.json | 43 +++++ precompiles/distribution/distribution.go | 5 +- precompiles/distribution/distribution_test.go | 20 +++ precompiles/distribution/events.go | 31 ++++ precompiles/distribution/events_test.go | 39 +++++ precompiles/distribution/integration_test.go | 18 +-- precompiles/distribution/tx.go | 51 +++++- precompiles/distribution/tx_test.go | 78 +++++++++ precompiles/distribution/types.go | 36 +++++ .../contracts/DistributionCaller.json | 41 ++++- .../testutil/contracts/DistributionCaller.sol | 149 ++++++++++-------- tests/nix_tests/cosmoscli.py | 8 +- tests/nix_tests/test_distr_precompile.py | 148 +++++++++++++++++ tests/nix_tests/utils.py | 1 + 18 files changed, 622 insertions(+), 111 deletions(-) create mode 100644 tests/nix_tests/test_distr_precompile.py diff --git a/.github/workflows/e2e-test.yml b/.github/workflows/e2e-test.yml index 93d55bc6ef..0be51fe97f 100644 --- a/.github/workflows/e2e-test.yml +++ b/.github/workflows/e2e-test.yml @@ -46,6 +46,7 @@ jobs: # Define parallel test files PARALLEL_TESTS=( "test_account.py" + "test_distr_precompile.py" "test_filters.py" "test_fee_history.py" "test_grpc_only.py" diff --git a/CHANGELOG.md b/CHANGELOG.md index 5eb0132d96..a7c79ad597 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -53,6 +53,8 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (precompiles) [#2529](https://github.com/evmos/evmos/pull/2529) Remove Outposts precompiles. - (upgrade) [#2533](https://github.com/evmos/evmos/pull/2533) Add upgrade handler for v19. - (staking) [#2051](https://github.com/evmos/evmos/pull/2051) Implement the `EditValidator` function for staking precompiled contract. +- (evm) [#2373](https://github.com/evmos/evmos/pull/2373) Remove check on hardcoded ChainID identifier. +- (precompiles) [#2572](https://github.com/evmos/evmos/pull/2572) Add `FundCommunityPool` precompile tx for distribution module. - (evm) [#2538](https://github.com/evmos/evmos/pull/2538) Add Permissions Policy for permissioned EVM. - (erc20) [#2609](https://github.com/evmos/evmos/pull/2609) Remove STRv2 tracking logic. - (distribution-precompile) [#2614](https://github.com/evmos/evmos/pull/2614) Add withdrawer address check in transactions. diff --git a/precompiles/common/errors.go b/precompiles/common/errors.go index cb5a91e77f..7c31bcb538 100644 --- a/precompiles/common/errors.go +++ b/precompiles/common/errors.go @@ -6,12 +6,16 @@ package common const ( // ErrNotRunInEvm is raised when a function is not called inside the EVM. ErrNotRunInEvm = "not run in EVM" - // ErrDifferentOrigin is raised when an approval is set but the origin address is not the same as the spender. - ErrDifferentOrigin = "tx origin address %s does not match the delegator address %s" + // ErrDelegatorDifferentOrigin is raised when an approval is set but the origin address is not the same as the spender. + ErrDelegatorDifferentOrigin = "tx origin address %s does not match the delegator address %s" + // ErrSpenderDifferentOrigin is raised when the origin address is not the same as the spender. + ErrSpenderDifferentOrigin = "tx origin address %s does not match the spender address %s" // ErrInvalidABI is raised when the ABI cannot be parsed. ErrInvalidABI = "invalid ABI: %w" // ErrInvalidAmount is raised when the amount cannot be cast to a big.Int. ErrInvalidAmount = "invalid amount: %v" + // ErrInvalidHexAddress is raised when the hex address is not valid. + ErrInvalidHexAddress = "invalid hex address address: %s" // ErrInvalidDelegator is raised when the delegator address is not valid. ErrInvalidDelegator = "invalid delegator address: %s" // ErrInvalidValidator is raised when the validator address is not valid. diff --git a/precompiles/distribution/DistributionI.sol b/precompiles/distribution/DistributionI.sol index d46c989d95..ae58acec67 100644 --- a/precompiles/distribution/DistributionI.sol +++ b/precompiles/distribution/DistributionI.sol @@ -40,10 +40,7 @@ interface DistributionI { /// @dev ClaimRewards defines an Event emitted when rewards are claimed /// @param delegatorAddress the address of the delegator /// @param amount the amount being claimed - event ClaimRewards( - address indexed delegatorAddress, - uint256 amount - ); + event ClaimRewards(address indexed delegatorAddress, uint256 amount); /// @dev SetWithdrawerAddress defines an Event emitted when a new withdrawer address is being set /// @param caller the caller of the transaction @@ -71,6 +68,12 @@ interface DistributionI { uint256 commission ); + /// @dev FundCommunityPool defines an Event emitted when an account + /// fund the community pool + /// @param depositor the address funding the community pool + /// @param amount the amount being sent to the community pool + event FundCommunityPool(address indexed depositor, uint256 amount); + /// TRANSACTIONS /// @dev Claims all rewards from a select set of validators or all of them for a delegator. @@ -108,6 +111,16 @@ interface DistributionI { string memory validatorAddress ) external returns (Coin[] calldata amount); + /// @dev fundCommunityPool defines a method to allow an account to directly + /// fund the community pool. + /// @param depositor The address of the depositor + /// @param amount The amount of coin sent to the community pool + /// @return success Whether the transaction was successful or not + function fundCommunityPool( + address depositor, + uint256 amount + ) external returns (bool success); + /// QUERIES /// @dev Queries validator commission and self-delegation rewards for validator. /// @param validatorAddress The address of the validator @@ -115,11 +128,9 @@ interface DistributionI { function validatorDistributionInfo( string memory validatorAddress ) - external - view - returns ( - ValidatorDistributionInfo calldata distributionInfo - ); + external + view + returns (ValidatorDistributionInfo calldata distributionInfo); /// @dev Queries the outstanding rewards of a validator address. /// @param validatorAddress The address of the validator @@ -149,12 +160,12 @@ interface DistributionI { uint64 endingHeight, PageRequest calldata pageRequest ) - external - view - returns ( - ValidatorSlashEvent[] calldata slashes, - PageResponse calldata pageResponse - ); + external + view + returns ( + ValidatorSlashEvent[] calldata slashes, + PageResponse calldata pageResponse + ); /// @dev Queries the total rewards accrued by a delegation from a specific address to a given validator. /// @param delegatorAddress The address of the delegator @@ -173,12 +184,12 @@ interface DistributionI { function delegationTotalRewards( address delegatorAddress ) - external - view - returns ( - DelegationDelegatorReward[] calldata rewards, - DecCoin[] calldata total - ); + external + view + returns ( + DelegationDelegatorReward[] calldata rewards, + DecCoin[] calldata total + ); /// @dev Queries all validators, that a given address has delegated to. /// @param delegatorAddress The address of the delegator @@ -193,5 +204,4 @@ interface DistributionI { function delegatorWithdrawAddress( address delegatorAddress ) external view returns (string memory withdrawAddress); - } diff --git a/precompiles/distribution/abi.json b/precompiles/distribution/abi.json index cf7388d7fa..6acd10dfa2 100644 --- a/precompiles/distribution/abi.json +++ b/precompiles/distribution/abi.json @@ -18,6 +18,25 @@ "name": "ClaimRewards", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "depositor", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "FundCommunityPool", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -254,6 +273,30 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "depositor", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "fundCommunityPool", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { diff --git a/precompiles/distribution/distribution.go b/precompiles/distribution/distribution.go index a9aa2ebc54..edb1bbff6b 100644 --- a/precompiles/distribution/distribution.go +++ b/precompiles/distribution/distribution.go @@ -115,6 +115,8 @@ func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, readOnly bool) (bz [ bz, err = p.WithdrawDelegatorRewards(ctx, evm.Origin, contract, stateDB, method, args) case WithdrawValidatorCommissionMethod: bz, err = p.WithdrawValidatorCommission(ctx, evm.Origin, contract, stateDB, method, args) + case FundCommunityPoolMethod: + bz, err = p.FundCommunityPool(ctx, evm.Origin, contract, stateDB, method, args) // Distribution queries case ValidatorDistributionInfoMethod: bz, err = p.ValidatorDistributionInfo(ctx, contract, method, args) @@ -159,7 +161,8 @@ func (Precompile) IsTransaction(methodName string) bool { case ClaimRewardsMethod, SetWithdrawAddressMethod, WithdrawDelegatorRewardsMethod, - WithdrawValidatorCommissionMethod: + WithdrawValidatorCommissionMethod, + FundCommunityPoolMethod: return true default: return false diff --git a/precompiles/distribution/distribution_test.go b/precompiles/distribution/distribution_test.go index 0a89b32aa9..e4a59ff608 100644 --- a/precompiles/distribution/distribution_test.go +++ b/precompiles/distribution/distribution_test.go @@ -36,6 +36,11 @@ func (s *PrecompileTestSuite) TestIsTransaction() { s.precompile.Methods[distribution.WithdrawValidatorCommissionMethod].Name, true, }, + { + distribution.FundCommunityPoolMethod, + s.precompile.Methods[distribution.FundCommunityPoolMethod].Name, + true, + }, { distribution.ValidatorDistributionInfoMethod, s.precompile.Methods[distribution.ValidatorDistributionInfoMethod].Name, @@ -150,6 +155,21 @@ func (s *PrecompileTestSuite) TestRun() { readOnly: false, expPass: true, }, + { + name: "pass - fund community pool transaction", + malleate: func() (common.Address, []byte) { + input, err := s.precompile.Pack( + distribution.FundCommunityPoolMethod, + s.address, + big.NewInt(1e18), + ) + s.Require().NoError(err, "failed to pack input") + + return s.address, input + }, + readOnly: false, + expPass: true, + }, } for _, tc := range testcases { diff --git a/precompiles/distribution/events.go b/precompiles/distribution/events.go index 90bff124a1..60c97a1056 100644 --- a/precompiles/distribution/events.go +++ b/precompiles/distribution/events.go @@ -24,6 +24,8 @@ const ( EventTypeWithdrawValidatorCommission = "WithdrawValidatorCommission" // EventTypeClaimRewards defines the event type for the distribution ClaimRewardsMethod transaction. EventTypeClaimRewards = "ClaimRewards" + // EventTypeFundCommunityPool defines the event type for the distribution FundCommunityPoolMethod transaction. + EventTypeFundCommunityPool = "FundCommunityPool" ) // EmitClaimRewardsEvent creates a new event emitted on a ClaimRewards transaction. @@ -157,3 +159,32 @@ func (p Precompile) EmitWithdrawValidatorCommissionEvent(ctx sdk.Context, stateD return nil } + +// EmitFundCommunityPoolEvent creates a new event emitted on a FundCommunityPool transaction. +func (p Precompile) EmitFundCommunityPoolEvent(ctx sdk.Context, stateDB vm.StateDB, depositor common.Address, coins sdk.Coins) error { + // Prepare the event topics + event := p.ABI.Events[EventTypeFundCommunityPool] + topics := make([]common.Hash, 2) + + // The first topic is always the signature of the event. + topics[0] = event.ID + + var err error + topics[1], err = cmn.MakeTopic(depositor) + if err != nil { + return err + } + + // Prepare the event data + var b bytes.Buffer + b.Write(cmn.PackNum(reflect.ValueOf(coins[0].Amount.BigInt()))) + + stateDB.AddLog(ðtypes.Log{ + Address: p.Address(), + Topics: topics, + Data: b.Bytes(), + BlockNumber: uint64(ctx.BlockHeight()), + }) + + return nil +} diff --git a/precompiles/distribution/events_test.go b/precompiles/distribution/events_test.go index 26181c093b..2f2a00c4dc 100644 --- a/precompiles/distribution/events_test.go +++ b/precompiles/distribution/events_test.go @@ -212,6 +212,7 @@ func (s *PrecompileTestSuite) TestWithdrawValidatorCommissionEvent() { } } +//nolint:dupl func (s *PrecompileTestSuite) TestClaimRewardsEvent() { testCases := []struct { name string @@ -248,3 +249,41 @@ func (s *PrecompileTestSuite) TestClaimRewardsEvent() { }) } } + +//nolint:dupl +func (s *PrecompileTestSuite) TestFundCommunityPoolEvent() { + testCases := []struct { + name string + coins sdk.Coins + postCheck func() + }{ + { + "success - the correct event is emitted", + sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, math.NewInt(1e18))), + func() { + log := s.stateDB.Logs()[0] + s.Require().Equal(log.Address, s.precompile.Address()) + // Check event signature matches the one emitted + event := s.precompile.ABI.Events[distribution.EventTypeFundCommunityPool] + s.Require().Equal(event.ID, common.HexToHash(log.Topics[0].Hex())) + s.Require().Equal(log.BlockNumber, uint64(s.ctx.BlockHeight())) + + var fundCommunityPoolEvent distribution.EventFundCommunityPool + err := cmn.UnpackLog(s.precompile.ABI, &fundCommunityPoolEvent, distribution.EventTypeFundCommunityPool, *log) + s.Require().NoError(err) + s.Require().Equal(common.BytesToAddress(s.address.Bytes()), fundCommunityPoolEvent.Depositor) + s.Require().Equal(big.NewInt(1e18), fundCommunityPoolEvent.Amount) + }, + }, + } + + for _, tc := range testCases { + s.Run(tc.name, func() { + s.SetupTest() + + err := s.precompile.EmitFundCommunityPoolEvent(s.ctx, s.stateDB, s.address, tc.coins) + s.Require().NoError(err) + tc.postCheck() + }) + } +} diff --git a/precompiles/distribution/integration_test.go b/precompiles/distribution/integration_test.go index 59ae287f69..ee5306c27e 100644 --- a/precompiles/distribution/integration_test.go +++ b/precompiles/distribution/integration_test.go @@ -98,11 +98,11 @@ var _ = Describe("Calling distribution precompile from EOA", func() { It("should return error if the origin is different than the delegator", func() { setWithdrawArgs := defaultSetWithdrawArgs.WithArgs(differentAddr, s.address.String()) - withdrawAddrSetCheck := defaultLogCheck.WithErrContains(cmn.ErrDifferentOrigin, s.address.String(), differentAddr.String()) + withdrawAddrSetCheck := defaultLogCheck.WithErrContains(cmn.ErrDelegatorDifferentOrigin, s.address.String(), differentAddr.String()) _, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, setWithdrawArgs, withdrawAddrSetCheck) Expect(err).To(HaveOccurred(), "error while calling the precompile") - Expect(err.Error()).To(ContainSubstring(fmt.Sprintf(cmn.ErrDifferentOrigin, s.address, differentAddr)), "expected different origin error") + Expect(err.Error()).To(ContainSubstring(fmt.Sprintf(cmn.ErrDelegatorDifferentOrigin, s.address, differentAddr)), "expected different origin error") }) It("should set withdraw address", func() { @@ -139,11 +139,11 @@ var _ = Describe("Calling distribution precompile from EOA", func() { It("should return error if the origin is different than the delegator", func() { withdrawRewardsArgs := defaultWithdrawRewardsArgs.WithArgs(differentAddr, s.validators[0].OperatorAddress) - withdrawalCheck := defaultLogCheck.WithErrContains(cmn.ErrDifferentOrigin, s.address.String(), differentAddr.String()) + withdrawalCheck := defaultLogCheck.WithErrContains(cmn.ErrDelegatorDifferentOrigin, s.address.String(), differentAddr.String()) _, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, withdrawRewardsArgs, withdrawalCheck) Expect(err).To(HaveOccurred(), "error while calling the precompile") - Expect(err.Error()).To(ContainSubstring(fmt.Sprintf(cmn.ErrDifferentOrigin, s.address, differentAddr)), "expected different origin error") + Expect(err.Error()).To(ContainSubstring(fmt.Sprintf(cmn.ErrDelegatorDifferentOrigin, s.address, differentAddr)), "expected different origin error") }) It("should withdraw delegation rewards", func() { @@ -271,11 +271,11 @@ var _ = Describe("Calling distribution precompile from EOA", func() { withdrawCommissionArgs := defaultWithdrawCommissionArgs.WithArgs(s.validators[0].OperatorAddress) validatorHexAddr := common.BytesToAddress(s.validators[0].GetOperator()) - withdrawalCheck := defaultLogCheck.WithErrContains(cmn.ErrDifferentOrigin, s.address.String(), validatorHexAddr.String()) + withdrawalCheck := defaultLogCheck.WithErrContains(cmn.ErrDelegatorDifferentOrigin, s.address.String(), validatorHexAddr.String()) _, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, withdrawCommissionArgs, withdrawalCheck) Expect(err).To(HaveOccurred(), "error while calling the precompile") - Expect(err.Error()).To(ContainSubstring(fmt.Sprintf(cmn.ErrDifferentOrigin, s.address, validatorHexAddr)), "expected different origin error") + Expect(err.Error()).To(ContainSubstring(fmt.Sprintf(cmn.ErrDelegatorDifferentOrigin, s.address, validatorHexAddr)), "expected different origin error") }) It("should withdraw validator commission", func() { @@ -323,7 +323,7 @@ var _ = Describe("Calling distribution precompile from EOA", func() { // initial balance should be the initial amount minus the staked amount used to create the validator, minus fees paid for deploying contract initialBalance := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) - Expect(initialBalance.Amount).To(Equal(math.NewInt(4997609489499999900))) + Expect(initialBalance.Amount).To(Equal(math.NewInt(4997457315624999900))) withdrawCommissionArgs := defaultWithdrawCommissionArgs. WithArgs(valAddr.String()). @@ -371,11 +371,11 @@ var _ = Describe("Calling distribution precompile from EOA", func() { It("should return err if the origin is different than the delegator", func() { claimRewardsArgs := defaultClaimRewardsArgs.WithArgs(differentAddr, uint32(1)) - claimRewardsCheck := defaultLogCheck.WithErrContains(cmn.ErrDifferentOrigin, s.address.String(), differentAddr.String()) + claimRewardsCheck := defaultLogCheck.WithErrContains(cmn.ErrDelegatorDifferentOrigin, s.address.String(), differentAddr.String()) _, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, claimRewardsArgs, claimRewardsCheck) Expect(err).To(HaveOccurred(), "error while calling the precompile") - Expect(err.Error()).To(ContainSubstring(fmt.Sprintf(cmn.ErrDifferentOrigin, s.address, differentAddr)), "expected different origin error") + Expect(err.Error()).To(ContainSubstring(fmt.Sprintf(cmn.ErrDelegatorDifferentOrigin, s.address, differentAddr)), "expected different origin error") }) It("should claim all rewards from all validators", func() { diff --git a/precompiles/distribution/tx.go b/precompiles/distribution/tx.go index 3c758dab21..1452a7ead8 100644 --- a/precompiles/distribution/tx.go +++ b/precompiles/distribution/tx.go @@ -6,6 +6,7 @@ package distribution import ( "fmt" + "github.com/evmos/evmos/v18/utils" "github.com/evmos/evmos/v18/x/evm/statedb" cmn "github.com/evmos/evmos/v18/precompiles/common" @@ -31,6 +32,8 @@ const ( WithdrawValidatorCommissionMethod = "withdrawValidatorCommission" // ClaimRewardsMethod defines the ABI method name for the custom ClaimRewards transaction ClaimRewardsMethod = "claimRewards" + // FundCommunityPoolMethod defines the ABI method name for the fundCommunityPool transaction + FundCommunityPoolMethod = "fundCommunityPool" ) // ClaimRewards claims the rewards accumulated by a delegator from multiple or all validators. @@ -51,7 +54,7 @@ func (p Precompile) ClaimRewards( // Otherwise check if the origin matches the delegator address isContractDelegator := contract.CallerAddress == delegatorAddr if !isContractDelegator && origin != delegatorAddr { - return nil, fmt.Errorf(cmn.ErrDifferentOrigin, origin.String(), delegatorAddr.String()) + return nil, fmt.Errorf(cmn.ErrDelegatorDifferentOrigin, origin.String(), delegatorAddr.String()) } validators := p.stakingKeeper.GetDelegatorValidators(ctx, delegatorAddr.Bytes(), maxRetrieve) @@ -111,7 +114,7 @@ func (p Precompile) SetWithdrawAddress( // Otherwise check if the origin matches the delegator address isContractDelegator := contract.CallerAddress == delegatorHexAddr if !isContractDelegator && origin != delegatorHexAddr { - return nil, fmt.Errorf(cmn.ErrDifferentOrigin, origin.String(), delegatorHexAddr.String()) + return nil, fmt.Errorf(cmn.ErrDelegatorDifferentOrigin, origin.String(), delegatorHexAddr.String()) } msgSrv := distributionkeeper.NewMsgServerImpl(p.distributionKeeper) @@ -144,7 +147,7 @@ func (p Precompile) WithdrawDelegatorRewards( // Otherwise check if the origin matches the delegator address isContractDelegator := contract.CallerAddress == delegatorHexAddr if !isContractDelegator && origin != delegatorHexAddr { - return nil, fmt.Errorf(cmn.ErrDifferentOrigin, origin.String(), delegatorHexAddr.String()) + return nil, fmt.Errorf(cmn.ErrDelegatorDifferentOrigin, origin.String(), delegatorHexAddr.String()) } msgSrv := distributionkeeper.NewMsgServerImpl(p.distributionKeeper) @@ -191,7 +194,7 @@ func (p Precompile) WithdrawValidatorCommission( // Otherwise check if the origin matches the validator address isContractValidator := contract.CallerAddress == validatorHexAddr if !isContractValidator && origin != validatorHexAddr { - return nil, fmt.Errorf(cmn.ErrDifferentOrigin, origin.String(), validatorHexAddr.String()) + return nil, fmt.Errorf(cmn.ErrDelegatorDifferentOrigin, origin.String(), validatorHexAddr.String()) } msgSrv := distributionkeeper.NewMsgServerImpl(p.distributionKeeper) @@ -219,6 +222,46 @@ func (p Precompile) WithdrawValidatorCommission( return method.Outputs.Pack(cmn.NewCoinsResponse(res.Amount)) } +// FundCommunityPool directly fund the community pool +func (p Precompile) FundCommunityPool( + ctx sdk.Context, + origin common.Address, + contract *vm.Contract, + stateDB vm.StateDB, + method *abi.Method, + args []interface{}, +) ([]byte, error) { + msg, depositorHexAddr, err := NewMsgFundCommunityPool(args) + if err != nil { + return nil, err + } + + // If the contract is the depositor, we don't need an origin check + // Otherwise check if the origin matches the depositor address + isContractDepositor := contract.CallerAddress == depositorHexAddr + if !isContractDepositor && origin != depositorHexAddr { + return nil, fmt.Errorf(cmn.ErrSpenderDifferentOrigin, origin.String(), depositorHexAddr.String()) + } + + msgSrv := distributionkeeper.NewMsgServerImpl(p.distributionKeeper) + _, err = msgSrv.FundCommunityPool(sdk.WrapSDKContext(ctx), msg) + if err != nil { + return nil, err + } + + // NOTE: This ensures that the changes in the bank keeper are correctly mirrored to the EVM stateDB. + // This prevents the stateDB from overwriting the changed balance in the bank keeper when committing the EVM state. + if isContractDepositor { + stateDB.(*statedb.StateDB).SubBalance(contract.CallerAddress, msg.Amount.AmountOf(utils.BaseDenom).BigInt()) + } + + if err = p.EmitFundCommunityPoolEvent(ctx, stateDB, depositorHexAddr, msg.Amount); err != nil { + return nil, err + } + + return method.Outputs.Pack(true) +} + // isContractWithdrawer is a helper function to check if the withdrawer address of a // delegator is a smart contract. It returns a boolean specifying if the withdrawer // is a smart contract, and the corresponding withdrawer hex address diff --git a/precompiles/distribution/tx_test.go b/precompiles/distribution/tx_test.go index 9e92f6cc84..fc8fee5ece 100644 --- a/precompiles/distribution/tx_test.go +++ b/precompiles/distribution/tx_test.go @@ -416,3 +416,81 @@ func (s *PrecompileTestSuite) TestClaimRewards() { }) } } + +func (s *PrecompileTestSuite) TestFundCommunityPool() { + method := s.precompile.Methods[distribution.ClaimRewardsMethod] + + testCases := []struct { + name string + malleate func() []interface{} + postCheck func(data []byte) + gas uint64 + expError bool + errContains string + }{ + { + "fail - empty input args", + func() []interface{} { + return []interface{}{} + }, + func([]byte) {}, + 200000, + true, + fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 2, 0), + }, + { + "fail - invalid depositor address", + func() []interface{} { + return []interface{}{ + nil, + big.NewInt(1e18), + } + }, + func([]byte) {}, + 200000, + true, + "invalid hex address address", + }, + { + "success - fund the community pool 1 EVMOS", + func() []interface{} { + return []interface{}{ + s.address, + big.NewInt(1e18), + } + }, + func([]byte) { + coins := s.app.DistrKeeper.GetFeePoolCommunityCoins(s.ctx) + expectedAmount := new(big.Int).Mul(big.NewInt(1e18), new(big.Int).Exp(big.NewInt(10), big.NewInt(int64(sdk.Precision)), nil)) + s.Require().Equal(expectedAmount, coins.AmountOf(utils.BaseDenom).BigInt()) + userBalance := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), utils.BaseDenom) + s.Require().Equal(big.NewInt(4e18), userBalance.Amount.BigInt()) + }, + 20000, + false, + "", + }, + } + + for _, tc := range testCases { + s.Run(tc.name, func() { + s.SetupTest() + + var contract *vm.Contract + contract, s.ctx = testutil.NewPrecompileContract(s.T(), s.ctx, s.address, s.precompile, tc.gas) + + // Sanity check to make sure the starting balance is always 5 EVMOS + balance := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), utils.BaseDenom) + s.Require().Equal(balance.Amount.BigInt(), big.NewInt(5e18)) + + bz, err := s.precompile.FundCommunityPool(s.ctx, s.address, contract, s.stateDB, &method, tc.malleate()) + + if tc.expError { + s.Require().ErrorContains(err, tc.errContains) + } else { + s.Require().NoError(err) + tc.postCheck(bz) + } + }) + } +} diff --git a/precompiles/distribution/types.go b/precompiles/distribution/types.go index 20b9890c4d..fdbd846e21 100644 --- a/precompiles/distribution/types.go +++ b/precompiles/distribution/types.go @@ -7,6 +7,8 @@ import ( "fmt" "math/big" + "github.com/evmos/evmos/v18/utils" + "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" @@ -43,6 +45,12 @@ type EventClaimRewards struct { Amount *big.Int } +// EventFundCommunityPool defines the event data for the FundCommunityPool transaction. +type EventFundCommunityPool struct { + Depositor common.Address + Amount *big.Int +} + // parseClaimRewardsArgs parses the arguments for the ClaimRewards method. func parseClaimRewardsArgs(args []interface{}) (common.Address, uint32, error) { if len(args) != 2 { @@ -145,6 +153,34 @@ func NewMsgWithdrawValidatorCommission(args []interface{}) (*distributiontypes.M return msg, validatorHexAddr, nil } +// NewMsgFundCommunityPool creates a new NewMsgFundCommunityPool message. +func NewMsgFundCommunityPool(args []interface{}) (*distributiontypes.MsgFundCommunityPool, common.Address, error) { + if len(args) != 2 { + return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 2, len(args)) + } + + depositorAddress, ok := args[0].(common.Address) + if !ok || depositorAddress == (common.Address{}) { + return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidHexAddress, args[0]) + } + + amount, ok := args[1].(*big.Int) + if !ok { + return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidAmount, args[1]) + } + + msg := &distributiontypes.MsgFundCommunityPool{ + Depositor: sdk.AccAddress(depositorAddress.Bytes()).String(), + Amount: sdk.Coins{sdk.Coin{Denom: utils.BaseDenom, Amount: math.NewIntFromBigInt(amount)}}, + } + + if err := msg.ValidateBasic(); err != nil { + return nil, common.Address{}, err + } + + return msg, depositorAddress, nil +} + // NewValidatorDistributionInfoRequest creates a new QueryValidatorDistributionInfoRequest instance and does sanity // checks on the provided arguments. func NewValidatorDistributionInfoRequest(args []interface{}) (*distributiontypes.QueryValidatorDistributionInfoRequest, error) { diff --git a/precompiles/testutil/contracts/DistributionCaller.json b/precompiles/testutil/contracts/DistributionCaller.json index 87a97ee07e..74267241f5 100644 --- a/precompiles/testutil/contracts/DistributionCaller.json +++ b/precompiles/testutil/contracts/DistributionCaller.json @@ -1,16 +1,16 @@ { "_format": "hh-sol-artifact-1", "contractName": "DistributionCaller", - "sourceName": "solidity/precompiles/testutil/contracts/DistributionCaller.sol", + "sourceName": "contracts/evmos/testutil/contracts/DistributionCaller.sol", "abi": [ { "inputs": [], "name": "counter", "outputs": [ { - "internalType": "uint256", + "internalType": "int64", "name": "", - "type": "uint256" + "type": "int64" } ], "stateMutability": "view", @@ -34,6 +34,13 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "deposit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, { "inputs": [ { @@ -488,6 +495,30 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "depositor", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "testFundCommunityPool", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -671,8 +702,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b50613087806100206000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c80637c9db0bb116100ad578063b6a216ae11610071578063b6a216ae1461038d578063cb85aa0a146103bd578063d3f831be146103ed578063e0421e391461041d578063e236c7a61461044d57610121565b80637c9db0bb1461029c57806388b2d581146102cc578063963516e4146102fd578063981945931461032d578063b2d178831461035d57610121565b806346e16d34116100f457806346e16d34146101d257806361bc221a146102025780636f669da41461022057806378a5dfd114610250578063796b96d21461028057610121565b806301b68000146101265780630c05e9e414610156578063296c60aa146101865780632d0ee16a146101a2575b600080fd5b610140600480360381019061013b919061123e565b61047e565b60405161014d91906112fb565b60405180910390f35b610170600480360381019061016b9190611452565b6105c6565b60405161017d9190611695565b60405180910390f35b6101a0600480360381019061019b91906116b7565b610656565b005b6101bc60048036038101906101b79190611452565b610797565b6040516101c99190611812565b60405180910390f35b6101ec60048036038101906101e791906116b7565b610825565b6040516101f9919061184f565b60405180910390f35b61020a6108af565b6040516102179190611879565b60405180910390f35b61023a600480360381019061023591906118d0565b6108b5565b604051610247919061184f565b60405180910390f35b61026a600480360381019061026591906116b7565b61096d565b6040516102779190611996565b60405180910390f35b61029a600480360381019061029591906116b7565b6109fa565b005b6102b660048036038101906102b19190611452565b610b3b565b6040516102c39190611996565b60405180910390f35b6102e660048036038101906102e19190611a1c565b610bc5565b6040516102f4929190611c5e565b60405180910390f35b61031760048036038101906103129190611452565b610c63565b604051610324919061184f565b60405180910390f35b610347600480360381019061034291906116b7565b610cec565b6040516103549190611812565b60405180910390f35b61037760048036038101906103729190611c95565b610d7b565b6040516103849190611812565b60405180910390f35b6103a760048036038101906103a2919061123e565b610ed0565b6040516103b49190611de2565b60405180910390f35b6103d760048036038101906103d2919061123e565b610f5a565b6040516103e49190611e4e565b60405180910390f35b61040760048036038101906104029190611452565b610fe4565b6040516104149190611996565b60405180910390f35b61043760048036038101906104329190611452565b61106e565b6040516104449190611812565b60405180910390f35b6104676004803603810190610462919061123e565b6110fa565b604051610475929190611f76565b60405180910390f35b606060008061080173ffffffffffffffffffffffffffffffffffffffff16846040516024016104ad9190611fbc565b6040516020818303038152906040527f5431f450000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516105379190612013565b600060405180830381855afa9150503d8060008114610572576040519150601f19603f3d011682016040523d82523d6000602084013e610577565b606091505b5091509150816105bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b390612076565b60405180910390fd5b8092505050919050565b6105ce611187565b61080173ffffffffffffffffffffffffffffffffffffffff166354212a89836040518263ffffffff1660e01b81526004016106099190611e4e565b600060405180830381865afa158015610626573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061064f9190612386565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff1683836040516024016106849291906123cf565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161070e9190612013565b600060405180830381855af49150503d8060008114610749576040519150601f19603f3d011682016040523d82523d6000602084013e61074e565b606091505b5050905080610792576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078990612471565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6130846040518363ffffffff1660e01b81526004016107d69291906123cf565b6000604051808303816000875af11580156107f5573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061081e91906125de565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9684846040518363ffffffff1660e01b81526004016108649291906123cf565b6020604051808303816000875af1158015610883573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a79190612653565b905092915050565b60005481565b60008060008154809291906108c9906126af565b919050555061080173ffffffffffffffffffffffffffffffffffffffff16632efe8a5f84846040518363ffffffff1660e01b815260040161090b929190612706565b6020604051808303816000875af115801561092a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094e9190612653565b90506000808154809291906109629061272f565b919050555092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff16639ad563b484846040518363ffffffff1660e01b81526004016109ac9291906123cf565b600060405180830381865afa1580156109c9573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906109f29190612758565b905092915050565b600061080173ffffffffffffffffffffffffffffffffffffffff168383604051602401610a289291906123cf565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610ab29190612013565b600060405180830381855afa9150503d8060008114610aed576040519150601f19603f3d011682016040523d82523d6000602084013e610af2565b606091505b5050905080610b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2d90612076565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633dd40f78836040518263ffffffff1660e01b8152600401610b789190611e4e565b600060405180830381865afa158015610b95573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610bbe9190612758565b9050919050565b6060610bcf6111a8565b61080173ffffffffffffffffffffffffffffffffffffffff16638f2473ce878787876040518563ffffffff1660e01b8152600401610c109493929190612941565b600060405180830381865afa158015610c2d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610c569190612c19565b9150915094509492505050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9630846040518363ffffffff1660e01b8152600401610ca29291906123cf565b6020604051808303816000875af1158015610cc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce59190612653565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6184846040518363ffffffff1660e01b8152600401610d2b9291906123cf565b6000604051808303816000875af1158015610d4a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610d7391906125de565b905092915050565b6060600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9633876040518363ffffffff1660e01b8152600401610dbc9291906123cf565b6020604051808303816000875af1158015610ddb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dff9190612653565b905080610e41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3890612cdd565b60405180910390fd5b61080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6185856040518363ffffffff1660e01b8152600401610e7e9291906123cf565b6000604051808303816000875af1158015610e9d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610ec691906125de565b9150509392505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663a66cb605836040518263ffffffff1660e01b8152600401610f0d9190611fbc565b600060405180830381865afa158015610f2a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610f539190612dde565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff16635431f450836040518263ffffffff1660e01b8152600401610f979190611fbc565b600060405180830381865afa158015610fb4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610fdd9190612e27565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff166385b2d2da836040518263ffffffff1660e01b81526004016110219190611e4e565b600060405180830381865afa15801561103e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110679190612758565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633ce4e3be836040518263ffffffff1660e01b81526004016110ab9190611e4e565b6000604051808303816000875af11580156110ca573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110f391906125de565b9050919050565b60608061080173ffffffffffffffffffffffffffffffffffffffff166354be1a28846040518263ffffffff1660e01b81526004016111389190611fbc565b600060405180830381865afa158015611155573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061117e9190612fd9565b91509150915091565b60405180606001604052806060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061120b826111e0565b9050919050565b61121b81611200565b811461122657600080fd5b50565b60008135905061123881611212565b92915050565b600060208284031215611254576112536111d6565b5b600061126284828501611229565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156112a557808201518184015260208101905061128a565b60008484015250505050565b6000601f19601f8301169050919050565b60006112cd8261126b565b6112d78185611276565b93506112e7818560208601611287565b6112f0816112b1565b840191505092915050565b6000602082019050818103600083015261131581846112c2565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61135f826112b1565b810181811067ffffffffffffffff8211171561137e5761137d611327565b5b80604052505050565b60006113916111cc565b905061139d8282611356565b919050565b600067ffffffffffffffff8211156113bd576113bc611327565b5b6113c6826112b1565b9050602081019050919050565b82818337600083830152505050565b60006113f56113f0846113a2565b611387565b90508281526020810184848401111561141157611410611322565b5b61141c8482856113d3565b509392505050565b600082601f8301126114395761143861131d565b5b81356114498482602086016113e2565b91505092915050565b600060208284031215611468576114676111d6565b5b600082013567ffffffffffffffff811115611486576114856111db565b5b61149284828501611424565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60006114c28261149b565b6114cc81856114a6565b93506114dc818560208601611287565b6114e5816112b1565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000819050919050565b61152f8161151c565b82525050565b600060ff82169050919050565b61154b81611535565b82525050565b6000606083016000830151848203600086015261156e82826114b7565b91505060208301516115836020860182611526565b5060408301516115966040860182611542565b508091505092915050565b60006115ad8383611551565b905092915050565b6000602082019050919050565b60006115cd826114f0565b6115d781856114fb565b9350836020820285016115e98561150c565b8060005b85811015611625578484038952815161160685826115a1565b9450611611836115b5565b925060208a019950506001810190506115ed565b50829750879550505050505092915050565b6000606083016000830151848203600086015261165482826114b7565b9150506020830151848203602086015261166e82826115c2565b9150506040830151848203604086015261168882826115c2565b9150508091505092915050565b600060208201905081810360008301526116af8184611637565b905092915050565b600080604083850312156116ce576116cd6111d6565b5b60006116dc85828601611229565b925050602083013567ffffffffffffffff8111156116fd576116fc6111db565b5b61170985828601611424565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000604083016000830151848203600086015261175c82826114b7565b91505060208301516117716020860182611526565b508091505092915050565b6000611788838361173f565b905092915050565b6000602082019050919050565b60006117a882611713565b6117b2818561171e565b9350836020820285016117c48561172f565b8060005b8581101561180057848403895281516117e1858261177c565b94506117ec83611790565b925060208a019950506001810190506117c8565b50829750879550505050505092915050565b6000602082019050818103600083015261182c818461179d565b905092915050565b60008115159050919050565b61184981611834565b82525050565b60006020820190506118646000830184611840565b92915050565b6118738161151c565b82525050565b600060208201905061188e600083018461186a565b92915050565b600063ffffffff82169050919050565b6118ad81611894565b81146118b857600080fd5b50565b6000813590506118ca816118a4565b92915050565b600080604083850312156118e7576118e66111d6565b5b60006118f585828601611229565b9250506020611906858286016118bb565b9150509250929050565b600082825260208201905092915050565b600061192c826114f0565b6119368185611910565b9350836020820285016119488561150c565b8060005b85811015611984578484038952815161196585826115a1565b9450611970836115b5565b925060208a0199505060018101905061194c565b50829750879550505050505092915050565b600060208201905081810360008301526119b08184611921565b905092915050565b600067ffffffffffffffff82169050919050565b6119d5816119b8565b81146119e057600080fd5b50565b6000813590506119f2816119cc565b92915050565b600080fd5b600060a08284031215611a1357611a126119f8565b5b81905092915050565b60008060008060808587031215611a3657611a356111d6565b5b600085013567ffffffffffffffff811115611a5457611a536111db565b5b611a6087828801611424565b9450506020611a71878288016119e3565b9350506040611a82878288016119e3565b925050606085013567ffffffffffffffff811115611aa357611aa26111db565b5b611aaf878288016119fd565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611af0816119b8565b82525050565b604082016000820151611b0c6000850182611526565b506020820151611b1f6020850182611542565b50505050565b606082016000820151611b3b6000850182611ae7565b506020820151611b4e6020850182611af6565b50505050565b6000611b608383611b25565b60608301905092915050565b6000602082019050919050565b6000611b8482611abb565b611b8e8185611ac6565b9350611b9983611ad7565b8060005b83811015611bca578151611bb18882611b54565b9750611bbc83611b6c565b925050600181019050611b9d565b5085935050505092915050565b600082825260208201905092915050565b6000611bf38261126b565b611bfd8185611bd7565b9350611c0d818560208601611287565b611c16816112b1565b840191505092915050565b60006040830160008301518482036000860152611c3e8282611be8565b9150506020830151611c536020860182611ae7565b508091505092915050565b60006040820190508181036000830152611c788185611b79565b90508181036020830152611c8c8184611c21565b90509392505050565b600080600060608486031215611cae57611cad6111d6565b5b600084013567ffffffffffffffff811115611ccc57611ccb6111db565b5b611cd886828701611424565b9350506020611ce986828701611229565b925050604084013567ffffffffffffffff811115611d0a57611d096111db565b5b611d1686828701611424565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000611d5883836114b7565b905092915050565b6000602082019050919050565b6000611d7882611d20565b611d828185611d2b565b935083602082028501611d9485611d3c565b8060005b85811015611dd05784840389528151611db18582611d4c565b9450611dbc83611d60565b925060208a01995050600181019050611d98565b50829750879550505050505092915050565b60006020820190508181036000830152611dfc8184611d6d565b905092915050565b600082825260208201905092915050565b6000611e208261149b565b611e2a8185611e04565b9350611e3a818560208601611287565b611e43816112b1565b840191505092915050565b60006020820190508181036000830152611e688184611e15565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006040830160008301518482036000860152611eb982826114b7565b91505060208301518482036020860152611ed382826115c2565b9150508091505092915050565b6000611eec8383611e9c565b905092915050565b6000602082019050919050565b6000611f0c82611e70565b611f168185611e7b565b935083602082028501611f2885611e8c565b8060005b85811015611f645784840389528151611f458582611ee0565b9450611f5083611ef4565b925060208a01995050600181019050611f2c565b50829750879550505050505092915050565b60006040820190508181036000830152611f908185611f01565b90508181036020830152611fa48184611921565b90509392505050565b611fb681611200565b82525050565b6000602082019050611fd16000830184611fad565b92915050565b600081905092915050565b6000611fed8261126b565b611ff78185611fd7565b9350612007818560208601611287565b80840191505092915050565b600061201f8284611fe2565b915081905092915050565b7f6661696c65642073746174696343616c6c20746f20707265636f6d70696c6500600082015250565b6000612060601f83611e04565b915061206b8261202a565b602082019050919050565b6000602082019050818103600083015261208f81612053565b9050919050565b600080fd5b600080fd5b60006120b36120ae846113a2565b611387565b9050828152602081018484840111156120cf576120ce611322565b5b6120da848285611287565b509392505050565b600082601f8301126120f7576120f661131d565b5b81516121078482602086016120a0565b91505092915050565b600067ffffffffffffffff82111561212b5761212a611327565b5b602082029050602081019050919050565b600080fd5b61214a8161151c565b811461215557600080fd5b50565b60008151905061216781612141565b92915050565b61217681611535565b811461218157600080fd5b50565b6000815190506121938161216d565b92915050565b6000606082840312156121af576121ae612096565b5b6121b96060611387565b9050600082015167ffffffffffffffff8111156121d9576121d861209b565b5b6121e5848285016120e2565b60008301525060206121f984828501612158565b602083015250604061220d84828501612184565b60408301525092915050565b600061222c61222784612110565b611387565b9050808382526020820190506020840283018581111561224f5761224e61213c565b5b835b8181101561229657805167ffffffffffffffff8111156122745761227361131d565b5b8086016122818982612199565b85526020850194505050602081019050612251565b5050509392505050565b600082601f8301126122b5576122b461131d565b5b81516122c5848260208601612219565b91505092915050565b6000606082840312156122e4576122e3612096565b5b6122ee6060611387565b9050600082015167ffffffffffffffff81111561230e5761230d61209b565b5b61231a848285016120e2565b600083015250602082015167ffffffffffffffff81111561233e5761233d61209b565b5b61234a848285016122a0565b602083015250604082015167ffffffffffffffff81111561236e5761236d61209b565b5b61237a848285016122a0565b60408301525092915050565b60006020828403121561239c5761239b6111d6565b5b600082015167ffffffffffffffff8111156123ba576123b96111db565b5b6123c6848285016122ce565b91505092915050565b60006040820190506123e46000830185611fad565b81810360208301526123f68184611e15565b90509392505050565b7f6661696c65642064656c656761746543616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b600061245b602183611e04565b9150612466826123ff565b604082019050919050565b6000602082019050818103600083015261248a8161244e565b9050919050565b600067ffffffffffffffff8211156124ac576124ab611327565b5b602082029050602081019050919050565b6000604082840312156124d3576124d2612096565b5b6124dd6040611387565b9050600082015167ffffffffffffffff8111156124fd576124fc61209b565b5b612509848285016120e2565b600083015250602061251d84828501612158565b60208301525092915050565b600061253c61253784612491565b611387565b9050808382526020820190506020840283018581111561255f5761255e61213c565b5b835b818110156125a657805167ffffffffffffffff8111156125845761258361131d565b5b80860161259189826124bd565b85526020850194505050602081019050612561565b5050509392505050565b600082601f8301126125c5576125c461131d565b5b81516125d5848260208601612529565b91505092915050565b6000602082840312156125f4576125f36111d6565b5b600082015167ffffffffffffffff811115612612576126116111db565b5b61261e848285016125b0565b91505092915050565b61263081611834565b811461263b57600080fd5b50565b60008151905061264d81612627565b92915050565b600060208284031215612669576126686111d6565b5b60006126778482850161263e565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006126ba8261151c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036126ec576126eb612680565b5b600182019050919050565b61270081611894565b82525050565b600060408201905061271b6000830185611fad565b61272860208301846126f7565b9392505050565b600061273a8261151c565b91506000820361274d5761274c612680565b5b600182039050919050565b60006020828403121561276e5761276d6111d6565b5b600082015167ffffffffffffffff81111561278c5761278b6111db565b5b612798848285016122a0565b91505092915050565b6127aa816119b8565b82525050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126127dc576127db6127ba565b5b83810192508235915060208301925067ffffffffffffffff821115612804576128036127b0565b5b60018202360383131561281a576128196127b5565b5b509250929050565b600061282e8385611bd7565b935061283b8385846113d3565b612844836112b1565b840190509392505050565b600061285e60208401846119e3565b905092915050565b60008135905061287581612627565b92915050565b600061288a6020840184612866565b905092915050565b61289b81611834565b82525050565b600060a083016128b460008401846127bf565b85830360008701526128c7838284612822565b925050506128d8602084018461284f565b6128e56020860182611ae7565b506128f3604084018461284f565b6129006040860182611ae7565b5061290e606084018461287b565b61291b6060860182612892565b50612929608084018461287b565b6129366080860182612892565b508091505092915050565b6000608082019050818103600083015261295b8187611e15565b905061296a60208301866127a1565b61297760408301856127a1565b818103606083015261298981846128a1565b905095945050505050565b600067ffffffffffffffff8211156129af576129ae611327565b5b602082029050602081019050919050565b6000815190506129cf816119cc565b92915050565b6000604082840312156129eb576129ea612096565b5b6129f56040611387565b90506000612a0584828501612158565b6000830152506020612a1984828501612184565b60208301525092915050565b600060608284031215612a3b57612a3a612096565b5b612a456040611387565b90506000612a55848285016129c0565b6000830152506020612a69848285016129d5565b60208301525092915050565b6000612a88612a8384612994565b611387565b90508083825260208201905060608402830185811115612aab57612aaa61213c565b5b835b81811015612ad45780612ac08882612a25565b845260208401935050606081019050612aad565b5050509392505050565b600082601f830112612af357612af261131d565b5b8151612b03848260208601612a75565b91505092915050565b600067ffffffffffffffff821115612b2757612b26611327565b5b612b30826112b1565b9050602081019050919050565b6000612b50612b4b84612b0c565b611387565b905082815260208101848484011115612b6c57612b6b611322565b5b612b77848285611287565b509392505050565b600082601f830112612b9457612b9361131d565b5b8151612ba4848260208601612b3d565b91505092915050565b600060408284031215612bc357612bc2612096565b5b612bcd6040611387565b9050600082015167ffffffffffffffff811115612bed57612bec61209b565b5b612bf984828501612b7f565b6000830152506020612c0d848285016129c0565b60208301525092915050565b60008060408385031215612c3057612c2f6111d6565b5b600083015167ffffffffffffffff811115612c4e57612c4d6111db565b5b612c5a85828601612ade565b925050602083015167ffffffffffffffff811115612c7b57612c7a6111db565b5b612c8785828601612bad565b9150509250929050565b7f6661696c656420746f2073657420776974686472617720616464726573730000600082015250565b6000612cc7601e83611e04565b9150612cd282612c91565b602082019050919050565b60006020820190508181036000830152612cf681612cba565b9050919050565b600067ffffffffffffffff821115612d1857612d17611327565b5b602082029050602081019050919050565b6000612d3c612d3784612cfd565b611387565b90508083825260208201905060208402830185811115612d5f57612d5e61213c565b5b835b81811015612da657805167ffffffffffffffff811115612d8457612d8361131d565b5b808601612d9189826120e2565b85526020850194505050602081019050612d61565b5050509392505050565b600082601f830112612dc557612dc461131d565b5b8151612dd5848260208601612d29565b91505092915050565b600060208284031215612df457612df36111d6565b5b600082015167ffffffffffffffff811115612e1257612e116111db565b5b612e1e84828501612db0565b91505092915050565b600060208284031215612e3d57612e3c6111d6565b5b600082015167ffffffffffffffff811115612e5b57612e5a6111db565b5b612e67848285016120e2565b91505092915050565b600067ffffffffffffffff821115612e8b57612e8a611327565b5b602082029050602081019050919050565b600060408284031215612eb257612eb1612096565b5b612ebc6040611387565b9050600082015167ffffffffffffffff811115612edc57612edb61209b565b5b612ee8848285016120e2565b600083015250602082015167ffffffffffffffff811115612f0c57612f0b61209b565b5b612f18848285016122a0565b60208301525092915050565b6000612f37612f3284612e70565b611387565b90508083825260208201905060208402830185811115612f5a57612f5961213c565b5b835b81811015612fa157805167ffffffffffffffff811115612f7f57612f7e61131d565b5b808601612f8c8982612e9c565b85526020850194505050602081019050612f5c565b5050509392505050565b600082601f830112612fc057612fbf61131d565b5b8151612fd0848260208601612f24565b91505092915050565b60008060408385031215612ff057612fef6111d6565b5b600083015167ffffffffffffffff81111561300e5761300d6111db565b5b61301a85828601612fab565b925050602083015167ffffffffffffffff81111561303b5761303a6111db565b5b613047858286016122a0565b915050925092905056fea2646970667358221220da4f3e927603d81ab48a6e4fb5139eaedb56b9fef37e7e9e393c598ae51dcb8e64736f6c63430008130033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101215760003560e01c80637c9db0bb116100ad578063b6a216ae11610071578063b6a216ae1461038d578063cb85aa0a146103bd578063d3f831be146103ed578063e0421e391461041d578063e236c7a61461044d57610121565b80637c9db0bb1461029c57806388b2d581146102cc578063963516e4146102fd578063981945931461032d578063b2d178831461035d57610121565b806346e16d34116100f457806346e16d34146101d257806361bc221a146102025780636f669da41461022057806378a5dfd114610250578063796b96d21461028057610121565b806301b68000146101265780630c05e9e414610156578063296c60aa146101865780632d0ee16a146101a2575b600080fd5b610140600480360381019061013b919061123e565b61047e565b60405161014d91906112fb565b60405180910390f35b610170600480360381019061016b9190611452565b6105c6565b60405161017d9190611695565b60405180910390f35b6101a0600480360381019061019b91906116b7565b610656565b005b6101bc60048036038101906101b79190611452565b610797565b6040516101c99190611812565b60405180910390f35b6101ec60048036038101906101e791906116b7565b610825565b6040516101f9919061184f565b60405180910390f35b61020a6108af565b6040516102179190611879565b60405180910390f35b61023a600480360381019061023591906118d0565b6108b5565b604051610247919061184f565b60405180910390f35b61026a600480360381019061026591906116b7565b61096d565b6040516102779190611996565b60405180910390f35b61029a600480360381019061029591906116b7565b6109fa565b005b6102b660048036038101906102b19190611452565b610b3b565b6040516102c39190611996565b60405180910390f35b6102e660048036038101906102e19190611a1c565b610bc5565b6040516102f4929190611c5e565b60405180910390f35b61031760048036038101906103129190611452565b610c63565b604051610324919061184f565b60405180910390f35b610347600480360381019061034291906116b7565b610cec565b6040516103549190611812565b60405180910390f35b61037760048036038101906103729190611c95565b610d7b565b6040516103849190611812565b60405180910390f35b6103a760048036038101906103a2919061123e565b610ed0565b6040516103b49190611de2565b60405180910390f35b6103d760048036038101906103d2919061123e565b610f5a565b6040516103e49190611e4e565b60405180910390f35b61040760048036038101906104029190611452565b610fe4565b6040516104149190611996565b60405180910390f35b61043760048036038101906104329190611452565b61106e565b6040516104449190611812565b60405180910390f35b6104676004803603810190610462919061123e565b6110fa565b604051610475929190611f76565b60405180910390f35b606060008061080173ffffffffffffffffffffffffffffffffffffffff16846040516024016104ad9190611fbc565b6040516020818303038152906040527f5431f450000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516105379190612013565b600060405180830381855afa9150503d8060008114610572576040519150601f19603f3d011682016040523d82523d6000602084013e610577565b606091505b5091509150816105bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b390612076565b60405180910390fd5b8092505050919050565b6105ce611187565b61080173ffffffffffffffffffffffffffffffffffffffff166354212a89836040518263ffffffff1660e01b81526004016106099190611e4e565b600060405180830381865afa158015610626573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061064f9190612386565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff1683836040516024016106849291906123cf565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161070e9190612013565b600060405180830381855af49150503d8060008114610749576040519150601f19603f3d011682016040523d82523d6000602084013e61074e565b606091505b5050905080610792576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078990612471565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6130846040518363ffffffff1660e01b81526004016107d69291906123cf565b6000604051808303816000875af11580156107f5573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061081e91906125de565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9684846040518363ffffffff1660e01b81526004016108649291906123cf565b6020604051808303816000875af1158015610883573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a79190612653565b905092915050565b60005481565b60008060008154809291906108c9906126af565b919050555061080173ffffffffffffffffffffffffffffffffffffffff16632efe8a5f84846040518363ffffffff1660e01b815260040161090b929190612706565b6020604051808303816000875af115801561092a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094e9190612653565b90506000808154809291906109629061272f565b919050555092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff16639ad563b484846040518363ffffffff1660e01b81526004016109ac9291906123cf565b600060405180830381865afa1580156109c9573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906109f29190612758565b905092915050565b600061080173ffffffffffffffffffffffffffffffffffffffff168383604051602401610a289291906123cf565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610ab29190612013565b600060405180830381855afa9150503d8060008114610aed576040519150601f19603f3d011682016040523d82523d6000602084013e610af2565b606091505b5050905080610b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2d90612076565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633dd40f78836040518263ffffffff1660e01b8152600401610b789190611e4e565b600060405180830381865afa158015610b95573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610bbe9190612758565b9050919050565b6060610bcf6111a8565b61080173ffffffffffffffffffffffffffffffffffffffff16638f2473ce878787876040518563ffffffff1660e01b8152600401610c109493929190612941565b600060405180830381865afa158015610c2d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610c569190612c19565b9150915094509492505050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9630846040518363ffffffff1660e01b8152600401610ca29291906123cf565b6020604051808303816000875af1158015610cc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce59190612653565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6184846040518363ffffffff1660e01b8152600401610d2b9291906123cf565b6000604051808303816000875af1158015610d4a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610d7391906125de565b905092915050565b6060600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9633876040518363ffffffff1660e01b8152600401610dbc9291906123cf565b6020604051808303816000875af1158015610ddb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dff9190612653565b905080610e41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3890612cdd565b60405180910390fd5b61080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6185856040518363ffffffff1660e01b8152600401610e7e9291906123cf565b6000604051808303816000875af1158015610e9d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610ec691906125de565b9150509392505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663a66cb605836040518263ffffffff1660e01b8152600401610f0d9190611fbc565b600060405180830381865afa158015610f2a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610f539190612dde565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff16635431f450836040518263ffffffff1660e01b8152600401610f979190611fbc565b600060405180830381865afa158015610fb4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610fdd9190612e27565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff166385b2d2da836040518263ffffffff1660e01b81526004016110219190611e4e565b600060405180830381865afa15801561103e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110679190612758565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633ce4e3be836040518263ffffffff1660e01b81526004016110ab9190611e4e565b6000604051808303816000875af11580156110ca573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110f391906125de565b9050919050565b60608061080173ffffffffffffffffffffffffffffffffffffffff166354be1a28846040518263ffffffff1660e01b81526004016111389190611fbc565b600060405180830381865afa158015611155573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061117e9190612fd9565b91509150915091565b60405180606001604052806060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061120b826111e0565b9050919050565b61121b81611200565b811461122657600080fd5b50565b60008135905061123881611212565b92915050565b600060208284031215611254576112536111d6565b5b600061126284828501611229565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156112a557808201518184015260208101905061128a565b60008484015250505050565b6000601f19601f8301169050919050565b60006112cd8261126b565b6112d78185611276565b93506112e7818560208601611287565b6112f0816112b1565b840191505092915050565b6000602082019050818103600083015261131581846112c2565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61135f826112b1565b810181811067ffffffffffffffff8211171561137e5761137d611327565b5b80604052505050565b60006113916111cc565b905061139d8282611356565b919050565b600067ffffffffffffffff8211156113bd576113bc611327565b5b6113c6826112b1565b9050602081019050919050565b82818337600083830152505050565b60006113f56113f0846113a2565b611387565b90508281526020810184848401111561141157611410611322565b5b61141c8482856113d3565b509392505050565b600082601f8301126114395761143861131d565b5b81356114498482602086016113e2565b91505092915050565b600060208284031215611468576114676111d6565b5b600082013567ffffffffffffffff811115611486576114856111db565b5b61149284828501611424565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60006114c28261149b565b6114cc81856114a6565b93506114dc818560208601611287565b6114e5816112b1565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000819050919050565b61152f8161151c565b82525050565b600060ff82169050919050565b61154b81611535565b82525050565b6000606083016000830151848203600086015261156e82826114b7565b91505060208301516115836020860182611526565b5060408301516115966040860182611542565b508091505092915050565b60006115ad8383611551565b905092915050565b6000602082019050919050565b60006115cd826114f0565b6115d781856114fb565b9350836020820285016115e98561150c565b8060005b85811015611625578484038952815161160685826115a1565b9450611611836115b5565b925060208a019950506001810190506115ed565b50829750879550505050505092915050565b6000606083016000830151848203600086015261165482826114b7565b9150506020830151848203602086015261166e82826115c2565b9150506040830151848203604086015261168882826115c2565b9150508091505092915050565b600060208201905081810360008301526116af8184611637565b905092915050565b600080604083850312156116ce576116cd6111d6565b5b60006116dc85828601611229565b925050602083013567ffffffffffffffff8111156116fd576116fc6111db565b5b61170985828601611424565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000604083016000830151848203600086015261175c82826114b7565b91505060208301516117716020860182611526565b508091505092915050565b6000611788838361173f565b905092915050565b6000602082019050919050565b60006117a882611713565b6117b2818561171e565b9350836020820285016117c48561172f565b8060005b8581101561180057848403895281516117e1858261177c565b94506117ec83611790565b925060208a019950506001810190506117c8565b50829750879550505050505092915050565b6000602082019050818103600083015261182c818461179d565b905092915050565b60008115159050919050565b61184981611834565b82525050565b60006020820190506118646000830184611840565b92915050565b6118738161151c565b82525050565b600060208201905061188e600083018461186a565b92915050565b600063ffffffff82169050919050565b6118ad81611894565b81146118b857600080fd5b50565b6000813590506118ca816118a4565b92915050565b600080604083850312156118e7576118e66111d6565b5b60006118f585828601611229565b9250506020611906858286016118bb565b9150509250929050565b600082825260208201905092915050565b600061192c826114f0565b6119368185611910565b9350836020820285016119488561150c565b8060005b85811015611984578484038952815161196585826115a1565b9450611970836115b5565b925060208a0199505060018101905061194c565b50829750879550505050505092915050565b600060208201905081810360008301526119b08184611921565b905092915050565b600067ffffffffffffffff82169050919050565b6119d5816119b8565b81146119e057600080fd5b50565b6000813590506119f2816119cc565b92915050565b600080fd5b600060a08284031215611a1357611a126119f8565b5b81905092915050565b60008060008060808587031215611a3657611a356111d6565b5b600085013567ffffffffffffffff811115611a5457611a536111db565b5b611a6087828801611424565b9450506020611a71878288016119e3565b9350506040611a82878288016119e3565b925050606085013567ffffffffffffffff811115611aa357611aa26111db565b5b611aaf878288016119fd565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611af0816119b8565b82525050565b604082016000820151611b0c6000850182611526565b506020820151611b1f6020850182611542565b50505050565b606082016000820151611b3b6000850182611ae7565b506020820151611b4e6020850182611af6565b50505050565b6000611b608383611b25565b60608301905092915050565b6000602082019050919050565b6000611b8482611abb565b611b8e8185611ac6565b9350611b9983611ad7565b8060005b83811015611bca578151611bb18882611b54565b9750611bbc83611b6c565b925050600181019050611b9d565b5085935050505092915050565b600082825260208201905092915050565b6000611bf38261126b565b611bfd8185611bd7565b9350611c0d818560208601611287565b611c16816112b1565b840191505092915050565b60006040830160008301518482036000860152611c3e8282611be8565b9150506020830151611c536020860182611ae7565b508091505092915050565b60006040820190508181036000830152611c788185611b79565b90508181036020830152611c8c8184611c21565b90509392505050565b600080600060608486031215611cae57611cad6111d6565b5b600084013567ffffffffffffffff811115611ccc57611ccb6111db565b5b611cd886828701611424565b9350506020611ce986828701611229565b925050604084013567ffffffffffffffff811115611d0a57611d096111db565b5b611d1686828701611424565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000611d5883836114b7565b905092915050565b6000602082019050919050565b6000611d7882611d20565b611d828185611d2b565b935083602082028501611d9485611d3c565b8060005b85811015611dd05784840389528151611db18582611d4c565b9450611dbc83611d60565b925060208a01995050600181019050611d98565b50829750879550505050505092915050565b60006020820190508181036000830152611dfc8184611d6d565b905092915050565b600082825260208201905092915050565b6000611e208261149b565b611e2a8185611e04565b9350611e3a818560208601611287565b611e43816112b1565b840191505092915050565b60006020820190508181036000830152611e688184611e15565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006040830160008301518482036000860152611eb982826114b7565b91505060208301518482036020860152611ed382826115c2565b9150508091505092915050565b6000611eec8383611e9c565b905092915050565b6000602082019050919050565b6000611f0c82611e70565b611f168185611e7b565b935083602082028501611f2885611e8c565b8060005b85811015611f645784840389528151611f458582611ee0565b9450611f5083611ef4565b925060208a01995050600181019050611f2c565b50829750879550505050505092915050565b60006040820190508181036000830152611f908185611f01565b90508181036020830152611fa48184611921565b90509392505050565b611fb681611200565b82525050565b6000602082019050611fd16000830184611fad565b92915050565b600081905092915050565b6000611fed8261126b565b611ff78185611fd7565b9350612007818560208601611287565b80840191505092915050565b600061201f8284611fe2565b915081905092915050565b7f6661696c65642073746174696343616c6c20746f20707265636f6d70696c6500600082015250565b6000612060601f83611e04565b915061206b8261202a565b602082019050919050565b6000602082019050818103600083015261208f81612053565b9050919050565b600080fd5b600080fd5b60006120b36120ae846113a2565b611387565b9050828152602081018484840111156120cf576120ce611322565b5b6120da848285611287565b509392505050565b600082601f8301126120f7576120f661131d565b5b81516121078482602086016120a0565b91505092915050565b600067ffffffffffffffff82111561212b5761212a611327565b5b602082029050602081019050919050565b600080fd5b61214a8161151c565b811461215557600080fd5b50565b60008151905061216781612141565b92915050565b61217681611535565b811461218157600080fd5b50565b6000815190506121938161216d565b92915050565b6000606082840312156121af576121ae612096565b5b6121b96060611387565b9050600082015167ffffffffffffffff8111156121d9576121d861209b565b5b6121e5848285016120e2565b60008301525060206121f984828501612158565b602083015250604061220d84828501612184565b60408301525092915050565b600061222c61222784612110565b611387565b9050808382526020820190506020840283018581111561224f5761224e61213c565b5b835b8181101561229657805167ffffffffffffffff8111156122745761227361131d565b5b8086016122818982612199565b85526020850194505050602081019050612251565b5050509392505050565b600082601f8301126122b5576122b461131d565b5b81516122c5848260208601612219565b91505092915050565b6000606082840312156122e4576122e3612096565b5b6122ee6060611387565b9050600082015167ffffffffffffffff81111561230e5761230d61209b565b5b61231a848285016120e2565b600083015250602082015167ffffffffffffffff81111561233e5761233d61209b565b5b61234a848285016122a0565b602083015250604082015167ffffffffffffffff81111561236e5761236d61209b565b5b61237a848285016122a0565b60408301525092915050565b60006020828403121561239c5761239b6111d6565b5b600082015167ffffffffffffffff8111156123ba576123b96111db565b5b6123c6848285016122ce565b91505092915050565b60006040820190506123e46000830185611fad565b81810360208301526123f68184611e15565b90509392505050565b7f6661696c65642064656c656761746543616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b600061245b602183611e04565b9150612466826123ff565b604082019050919050565b6000602082019050818103600083015261248a8161244e565b9050919050565b600067ffffffffffffffff8211156124ac576124ab611327565b5b602082029050602081019050919050565b6000604082840312156124d3576124d2612096565b5b6124dd6040611387565b9050600082015167ffffffffffffffff8111156124fd576124fc61209b565b5b612509848285016120e2565b600083015250602061251d84828501612158565b60208301525092915050565b600061253c61253784612491565b611387565b9050808382526020820190506020840283018581111561255f5761255e61213c565b5b835b818110156125a657805167ffffffffffffffff8111156125845761258361131d565b5b80860161259189826124bd565b85526020850194505050602081019050612561565b5050509392505050565b600082601f8301126125c5576125c461131d565b5b81516125d5848260208601612529565b91505092915050565b6000602082840312156125f4576125f36111d6565b5b600082015167ffffffffffffffff811115612612576126116111db565b5b61261e848285016125b0565b91505092915050565b61263081611834565b811461263b57600080fd5b50565b60008151905061264d81612627565b92915050565b600060208284031215612669576126686111d6565b5b60006126778482850161263e565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006126ba8261151c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036126ec576126eb612680565b5b600182019050919050565b61270081611894565b82525050565b600060408201905061271b6000830185611fad565b61272860208301846126f7565b9392505050565b600061273a8261151c565b91506000820361274d5761274c612680565b5b600182039050919050565b60006020828403121561276e5761276d6111d6565b5b600082015167ffffffffffffffff81111561278c5761278b6111db565b5b612798848285016122a0565b91505092915050565b6127aa816119b8565b82525050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126127dc576127db6127ba565b5b83810192508235915060208301925067ffffffffffffffff821115612804576128036127b0565b5b60018202360383131561281a576128196127b5565b5b509250929050565b600061282e8385611bd7565b935061283b8385846113d3565b612844836112b1565b840190509392505050565b600061285e60208401846119e3565b905092915050565b60008135905061287581612627565b92915050565b600061288a6020840184612866565b905092915050565b61289b81611834565b82525050565b600060a083016128b460008401846127bf565b85830360008701526128c7838284612822565b925050506128d8602084018461284f565b6128e56020860182611ae7565b506128f3604084018461284f565b6129006040860182611ae7565b5061290e606084018461287b565b61291b6060860182612892565b50612929608084018461287b565b6129366080860182612892565b508091505092915050565b6000608082019050818103600083015261295b8187611e15565b905061296a60208301866127a1565b61297760408301856127a1565b818103606083015261298981846128a1565b905095945050505050565b600067ffffffffffffffff8211156129af576129ae611327565b5b602082029050602081019050919050565b6000815190506129cf816119cc565b92915050565b6000604082840312156129eb576129ea612096565b5b6129f56040611387565b90506000612a0584828501612158565b6000830152506020612a1984828501612184565b60208301525092915050565b600060608284031215612a3b57612a3a612096565b5b612a456040611387565b90506000612a55848285016129c0565b6000830152506020612a69848285016129d5565b60208301525092915050565b6000612a88612a8384612994565b611387565b90508083825260208201905060608402830185811115612aab57612aaa61213c565b5b835b81811015612ad45780612ac08882612a25565b845260208401935050606081019050612aad565b5050509392505050565b600082601f830112612af357612af261131d565b5b8151612b03848260208601612a75565b91505092915050565b600067ffffffffffffffff821115612b2757612b26611327565b5b612b30826112b1565b9050602081019050919050565b6000612b50612b4b84612b0c565b611387565b905082815260208101848484011115612b6c57612b6b611322565b5b612b77848285611287565b509392505050565b600082601f830112612b9457612b9361131d565b5b8151612ba4848260208601612b3d565b91505092915050565b600060408284031215612bc357612bc2612096565b5b612bcd6040611387565b9050600082015167ffffffffffffffff811115612bed57612bec61209b565b5b612bf984828501612b7f565b6000830152506020612c0d848285016129c0565b60208301525092915050565b60008060408385031215612c3057612c2f6111d6565b5b600083015167ffffffffffffffff811115612c4e57612c4d6111db565b5b612c5a85828601612ade565b925050602083015167ffffffffffffffff811115612c7b57612c7a6111db565b5b612c8785828601612bad565b9150509250929050565b7f6661696c656420746f2073657420776974686472617720616464726573730000600082015250565b6000612cc7601e83611e04565b9150612cd282612c91565b602082019050919050565b60006020820190508181036000830152612cf681612cba565b9050919050565b600067ffffffffffffffff821115612d1857612d17611327565b5b602082029050602081019050919050565b6000612d3c612d3784612cfd565b611387565b90508083825260208201905060208402830185811115612d5f57612d5e61213c565b5b835b81811015612da657805167ffffffffffffffff811115612d8457612d8361131d565b5b808601612d9189826120e2565b85526020850194505050602081019050612d61565b5050509392505050565b600082601f830112612dc557612dc461131d565b5b8151612dd5848260208601612d29565b91505092915050565b600060208284031215612df457612df36111d6565b5b600082015167ffffffffffffffff811115612e1257612e116111db565b5b612e1e84828501612db0565b91505092915050565b600060208284031215612e3d57612e3c6111d6565b5b600082015167ffffffffffffffff811115612e5b57612e5a6111db565b5b612e67848285016120e2565b91505092915050565b600067ffffffffffffffff821115612e8b57612e8a611327565b5b602082029050602081019050919050565b600060408284031215612eb257612eb1612096565b5b612ebc6040611387565b9050600082015167ffffffffffffffff811115612edc57612edb61209b565b5b612ee8848285016120e2565b600083015250602082015167ffffffffffffffff811115612f0c57612f0b61209b565b5b612f18848285016122a0565b60208301525092915050565b6000612f37612f3284612e70565b611387565b90508083825260208201905060208402830185811115612f5a57612f5961213c565b5b835b81811015612fa157805167ffffffffffffffff811115612f7f57612f7e61131d565b5b808601612f8c8982612e9c565b85526020850194505050602081019050612f5c565b5050509392505050565b600082601f830112612fc057612fbf61131d565b5b8151612fd0848260208601612f24565b91505092915050565b60008060408385031215612ff057612fef6111d6565b5b600083015167ffffffffffffffff81111561300e5761300d6111db565b5b61301a85828601612fab565b925050602083015167ffffffffffffffff81111561303b5761303a6111db565b5b613047858286016122a0565b915050925092905056fea2646970667358221220da4f3e927603d81ab48a6e4fb5139eaedb56b9fef37e7e9e393c598ae51dcb8e64736f6c63430008130033", + "bytecode": "0x608060405234801561001057600080fd5b506133ae806100206000396000f3fe60806040526004361061012a5760003560e01c806388b2d581116100ab578063c7804bb51161006f578063c7804bb514610489578063cb85aa0a146104c6578063d0e30db014610503578063d3f831be1461050d578063e0421e391461054a578063e236c7a6146105875761012a565b806388b2d58114610357578063963516e41461039557806398194593146103d2578063b2d178831461040f578063b6a216ae1461044c5761012a565b806361bc221a116100f257806361bc221a1461024c5780636f669da41461027757806378a5dfd1146102b4578063796b96d2146102f15780637c9db0bb1461031a5761012a565b806301b680001461012f5780630c05e9e41461016c578063296c60aa146101a95780632d0ee16a146101d257806346e16d341461020f575b600080fd5b34801561013b57600080fd5b506101566004803603810190610151919061147c565b6105c5565b6040516101639190611539565b60405180910390f35b34801561017857600080fd5b50610193600480360381019061018e9190611690565b61070d565b6040516101a091906118d3565b60405180910390f35b3480156101b557600080fd5b506101d060048036038101906101cb91906118f5565b61079d565b005b3480156101de57600080fd5b506101f960048036038101906101f49190611690565b6108de565b6040516102069190611a50565b60405180910390f35b34801561021b57600080fd5b50610236600480360381019061023191906118f5565b61096c565b6040516102439190611a8d565b60405180910390f35b34801561025857600080fd5b506102616109f6565b60405161026e9190611ac4565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190611b1b565b610a07565b6040516102ab9190611a8d565b60405180910390f35b3480156102c057600080fd5b506102db60048036038101906102d691906118f5565b610a91565b6040516102e89190611be1565b60405180910390f35b3480156102fd57600080fd5b50610318600480360381019061031391906118f5565b610b1e565b005b34801561032657600080fd5b50610341600480360381019061033c9190611690565b610c5f565b60405161034e9190611be1565b60405180910390f35b34801561036357600080fd5b5061037e60048036038101906103799190611c67565b610ce9565b60405161038c929190611ea9565b60405180910390f35b3480156103a157600080fd5b506103bc60048036038101906103b79190611690565b610d87565b6040516103c99190611a8d565b60405180910390f35b3480156103de57600080fd5b506103f960048036038101906103f491906118f5565b610e10565b6040516104069190611a50565b60405180910390f35b34801561041b57600080fd5b5061043660048036038101906104319190611ee0565b610e9f565b6040516104439190611a50565b60405180910390f35b34801561045857600080fd5b50610473600480360381019061046e919061147c565b610ff4565b604051610480919061202d565b60405180910390f35b34801561049557600080fd5b506104b060048036038101906104ab919061207b565b61107e565b6040516104bd9190611a8d565b60405180910390f35b3480156104d257600080fd5b506104ed60048036038101906104e8919061147c565b611196565b6040516104fa9190612105565b60405180910390f35b61050b611220565b005b34801561051957600080fd5b50610534600480360381019061052f9190611690565b611222565b6040516105419190611be1565b60405180910390f35b34801561055657600080fd5b50610571600480360381019061056c9190611690565b6112ac565b60405161057e9190611a50565b60405180910390f35b34801561059357600080fd5b506105ae60048036038101906105a9919061147c565b611338565b6040516105bc92919061222d565b60405180910390f35b606060008061080173ffffffffffffffffffffffffffffffffffffffff16846040516024016105f49190612273565b6040516020818303038152906040527f5431f450000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161067e91906122ca565b600060405180830381855afa9150503d80600081146106b9576040519150601f19603f3d011682016040523d82523d6000602084013e6106be565b606091505b509150915081610703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106fa9061232d565b60405180910390fd5b8092505050919050565b6107156113c5565b61080173ffffffffffffffffffffffffffffffffffffffff166354212a89836040518263ffffffff1660e01b81526004016107509190612105565b600060405180830381865afa15801561076d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906107969190612626565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff1683836040516024016107cb92919061266f565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161085591906122ca565b600060405180830381855af49150503d8060008114610890576040519150601f19603f3d011682016040523d82523d6000602084013e610895565b606091505b50509050806108d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d090612711565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6130846040518363ffffffff1660e01b815260040161091d92919061266f565b6000604051808303816000875af115801561093c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610965919061287e565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9684846040518363ffffffff1660e01b81526004016109ab92919061266f565b6020604051808303816000875af11580156109ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ee91906128f3565b905092915050565b60008054906101000a900460070b81565b600061080173ffffffffffffffffffffffffffffffffffffffff16632efe8a5f84846040518363ffffffff1660e01b8152600401610a4692919061292f565b6020604051808303816000875af1158015610a65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8991906128f3565b905092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff16639ad563b484846040518363ffffffff1660e01b8152600401610ad092919061266f565b600060405180830381865afa158015610aed573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610b169190612958565b905092915050565b600061080173ffffffffffffffffffffffffffffffffffffffff168383604051602401610b4c92919061266f565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610bd691906122ca565b600060405180830381855afa9150503d8060008114610c11576040519150601f19603f3d011682016040523d82523d6000602084013e610c16565b606091505b5050905080610c5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c519061232d565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633dd40f78836040518263ffffffff1660e01b8152600401610c9c9190612105565b600060405180830381865afa158015610cb9573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610ce29190612958565b9050919050565b6060610cf36113e6565b61080173ffffffffffffffffffffffffffffffffffffffff16638f2473ce878787876040518563ffffffff1660e01b8152600401610d349493929190612b41565b600060405180830381865afa158015610d51573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610d7a9190612e19565b9150915094509492505050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9630846040518363ffffffff1660e01b8152600401610dc692919061266f565b6020604051808303816000875af1158015610de5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0991906128f3565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6184846040518363ffffffff1660e01b8152600401610e4f92919061266f565b6000604051808303816000875af1158015610e6e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610e97919061287e565b905092915050565b6060600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9633876040518363ffffffff1660e01b8152600401610ee092919061266f565b6020604051808303816000875af1158015610eff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2391906128f3565b905080610f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5c90612edd565b60405180910390fd5b61080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6185856040518363ffffffff1660e01b8152600401610fa292919061266f565b6000604051808303816000875af1158015610fc1573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610fea919061287e565b9150509392505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663a66cb605836040518263ffffffff1660e01b81526004016110319190612273565b600060405180830381865afa15801561104e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110779190612fde565b9050919050565b600060016000808282829054906101000a900460070b61109e9190613056565b92506101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff16021790555061080173ffffffffffffffffffffffffffffffffffffffff1663ed41d0b684846040518363ffffffff1660e01b81526004016111049291906130c5565b6020604051808303816000875af1158015611123573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114791906128f3565b905060016000808282829054906101000a900460070b61116791906130ee565b92506101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff16021790555092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff16635431f450836040518263ffffffff1660e01b81526004016111d39190612273565b600060405180830381865afa1580156111f0573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611219919061314e565b9050919050565b565b606061080173ffffffffffffffffffffffffffffffffffffffff166385b2d2da836040518263ffffffff1660e01b815260040161125f9190612105565b600060405180830381865afa15801561127c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906112a59190612958565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633ce4e3be836040518263ffffffff1660e01b81526004016112e99190612105565b6000604051808303816000875af1158015611308573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611331919061287e565b9050919050565b60608061080173ffffffffffffffffffffffffffffffffffffffff166354be1a28846040518263ffffffff1660e01b81526004016113769190612273565b600060405180830381865afa158015611393573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906113bc9190613300565b91509150915091565b60405180606001604052806060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006114498261141e565b9050919050565b6114598161143e565b811461146457600080fd5b50565b60008135905061147681611450565b92915050565b60006020828403121561149257611491611414565b5b60006114a084828501611467565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156114e35780820151818401526020810190506114c8565b60008484015250505050565b6000601f19601f8301169050919050565b600061150b826114a9565b61151581856114b4565b93506115258185602086016114c5565b61152e816114ef565b840191505092915050565b600060208201905081810360008301526115538184611500565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61159d826114ef565b810181811067ffffffffffffffff821117156115bc576115bb611565565b5b80604052505050565b60006115cf61140a565b90506115db8282611594565b919050565b600067ffffffffffffffff8211156115fb576115fa611565565b5b611604826114ef565b9050602081019050919050565b82818337600083830152505050565b600061163361162e846115e0565b6115c5565b90508281526020810184848401111561164f5761164e611560565b5b61165a848285611611565b509392505050565b600082601f8301126116775761167661155b565b5b8135611687848260208601611620565b91505092915050565b6000602082840312156116a6576116a5611414565b5b600082013567ffffffffffffffff8111156116c4576116c3611419565b5b6116d084828501611662565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000611700826116d9565b61170a81856116e4565b935061171a8185602086016114c5565b611723816114ef565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000819050919050565b61176d8161175a565b82525050565b600060ff82169050919050565b61178981611773565b82525050565b600060608301600083015184820360008601526117ac82826116f5565b91505060208301516117c16020860182611764565b5060408301516117d46040860182611780565b508091505092915050565b60006117eb838361178f565b905092915050565b6000602082019050919050565b600061180b8261172e565b6118158185611739565b9350836020820285016118278561174a565b8060005b85811015611863578484038952815161184485826117df565b945061184f836117f3565b925060208a0199505060018101905061182b565b50829750879550505050505092915050565b6000606083016000830151848203600086015261189282826116f5565b915050602083015184820360208601526118ac8282611800565b915050604083015184820360408601526118c68282611800565b9150508091505092915050565b600060208201905081810360008301526118ed8184611875565b905092915050565b6000806040838503121561190c5761190b611414565b5b600061191a85828601611467565b925050602083013567ffffffffffffffff81111561193b5761193a611419565b5b61194785828601611662565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000604083016000830151848203600086015261199a82826116f5565b91505060208301516119af6020860182611764565b508091505092915050565b60006119c6838361197d565b905092915050565b6000602082019050919050565b60006119e682611951565b6119f0818561195c565b935083602082028501611a028561196d565b8060005b85811015611a3e5784840389528151611a1f85826119ba565b9450611a2a836119ce565b925060208a01995050600181019050611a06565b50829750879550505050505092915050565b60006020820190508181036000830152611a6a81846119db565b905092915050565b60008115159050919050565b611a8781611a72565b82525050565b6000602082019050611aa26000830184611a7e565b92915050565b60008160070b9050919050565b611abe81611aa8565b82525050565b6000602082019050611ad96000830184611ab5565b92915050565b600063ffffffff82169050919050565b611af881611adf565b8114611b0357600080fd5b50565b600081359050611b1581611aef565b92915050565b60008060408385031215611b3257611b31611414565b5b6000611b4085828601611467565b9250506020611b5185828601611b06565b9150509250929050565b600082825260208201905092915050565b6000611b778261172e565b611b818185611b5b565b935083602082028501611b938561174a565b8060005b85811015611bcf5784840389528151611bb085826117df565b9450611bbb836117f3565b925060208a01995050600181019050611b97565b50829750879550505050505092915050565b60006020820190508181036000830152611bfb8184611b6c565b905092915050565b600067ffffffffffffffff82169050919050565b611c2081611c03565b8114611c2b57600080fd5b50565b600081359050611c3d81611c17565b92915050565b600080fd5b600060a08284031215611c5e57611c5d611c43565b5b81905092915050565b60008060008060808587031215611c8157611c80611414565b5b600085013567ffffffffffffffff811115611c9f57611c9e611419565b5b611cab87828801611662565b9450506020611cbc87828801611c2e565b9350506040611ccd87828801611c2e565b925050606085013567ffffffffffffffff811115611cee57611ced611419565b5b611cfa87828801611c48565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611d3b81611c03565b82525050565b604082016000820151611d576000850182611764565b506020820151611d6a6020850182611780565b50505050565b606082016000820151611d866000850182611d32565b506020820151611d996020850182611d41565b50505050565b6000611dab8383611d70565b60608301905092915050565b6000602082019050919050565b6000611dcf82611d06565b611dd98185611d11565b9350611de483611d22565b8060005b83811015611e15578151611dfc8882611d9f565b9750611e0783611db7565b925050600181019050611de8565b5085935050505092915050565b600082825260208201905092915050565b6000611e3e826114a9565b611e488185611e22565b9350611e588185602086016114c5565b611e61816114ef565b840191505092915050565b60006040830160008301518482036000860152611e898282611e33565b9150506020830151611e9e6020860182611d32565b508091505092915050565b60006040820190508181036000830152611ec38185611dc4565b90508181036020830152611ed78184611e6c565b90509392505050565b600080600060608486031215611ef957611ef8611414565b5b600084013567ffffffffffffffff811115611f1757611f16611419565b5b611f2386828701611662565b9350506020611f3486828701611467565b925050604084013567ffffffffffffffff811115611f5557611f54611419565b5b611f6186828701611662565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000611fa383836116f5565b905092915050565b6000602082019050919050565b6000611fc382611f6b565b611fcd8185611f76565b935083602082028501611fdf85611f87565b8060005b8581101561201b5784840389528151611ffc8582611f97565b945061200783611fab565b925060208a01995050600181019050611fe3565b50829750879550505050505092915050565b600060208201905081810360008301526120478184611fb8565b905092915050565b6120588161175a565b811461206357600080fd5b50565b6000813590506120758161204f565b92915050565b6000806040838503121561209257612091611414565b5b60006120a085828601611467565b92505060206120b185828601612066565b9150509250929050565b600082825260208201905092915050565b60006120d7826116d9565b6120e181856120bb565b93506120f18185602086016114c5565b6120fa816114ef565b840191505092915050565b6000602082019050818103600083015261211f81846120cc565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000604083016000830151848203600086015261217082826116f5565b9150506020830151848203602086015261218a8282611800565b9150508091505092915050565b60006121a38383612153565b905092915050565b6000602082019050919050565b60006121c382612127565b6121cd8185612132565b9350836020820285016121df85612143565b8060005b8581101561221b57848403895281516121fc8582612197565b9450612207836121ab565b925060208a019950506001810190506121e3565b50829750879550505050505092915050565b6000604082019050818103600083015261224781856121b8565b9050818103602083015261225b8184611b6c565b90509392505050565b61226d8161143e565b82525050565b60006020820190506122886000830184612264565b92915050565b600081905092915050565b60006122a4826114a9565b6122ae818561228e565b93506122be8185602086016114c5565b80840191505092915050565b60006122d68284612299565b915081905092915050565b7f6661696c65642073746174696343616c6c20746f20707265636f6d70696c6500600082015250565b6000612317601f836120bb565b9150612322826122e1565b602082019050919050565b600060208201905081810360008301526123468161230a565b9050919050565b600080fd5b600080fd5b600061236a612365846115e0565b6115c5565b90508281526020810184848401111561238657612385611560565b5b6123918482856114c5565b509392505050565b600082601f8301126123ae576123ad61155b565b5b81516123be848260208601612357565b91505092915050565b600067ffffffffffffffff8211156123e2576123e1611565565b5b602082029050602081019050919050565b600080fd5b6000815190506124078161204f565b92915050565b61241681611773565b811461242157600080fd5b50565b6000815190506124338161240d565b92915050565b60006060828403121561244f5761244e61234d565b5b61245960606115c5565b9050600082015167ffffffffffffffff81111561247957612478612352565b5b61248584828501612399565b6000830152506020612499848285016123f8565b60208301525060406124ad84828501612424565b60408301525092915050565b60006124cc6124c7846123c7565b6115c5565b905080838252602082019050602084028301858111156124ef576124ee6123f3565b5b835b8181101561253657805167ffffffffffffffff8111156125145761251361155b565b5b8086016125218982612439565b855260208501945050506020810190506124f1565b5050509392505050565b600082601f8301126125555761255461155b565b5b81516125658482602086016124b9565b91505092915050565b6000606082840312156125845761258361234d565b5b61258e60606115c5565b9050600082015167ffffffffffffffff8111156125ae576125ad612352565b5b6125ba84828501612399565b600083015250602082015167ffffffffffffffff8111156125de576125dd612352565b5b6125ea84828501612540565b602083015250604082015167ffffffffffffffff81111561260e5761260d612352565b5b61261a84828501612540565b60408301525092915050565b60006020828403121561263c5761263b611414565b5b600082015167ffffffffffffffff81111561265a57612659611419565b5b6126668482850161256e565b91505092915050565b60006040820190506126846000830185612264565b818103602083015261269681846120cc565b90509392505050565b7f6661696c65642064656c656761746543616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b60006126fb6021836120bb565b91506127068261269f565b604082019050919050565b6000602082019050818103600083015261272a816126ee565b9050919050565b600067ffffffffffffffff82111561274c5761274b611565565b5b602082029050602081019050919050565b6000604082840312156127735761277261234d565b5b61277d60406115c5565b9050600082015167ffffffffffffffff81111561279d5761279c612352565b5b6127a984828501612399565b60008301525060206127bd848285016123f8565b60208301525092915050565b60006127dc6127d784612731565b6115c5565b905080838252602082019050602084028301858111156127ff576127fe6123f3565b5b835b8181101561284657805167ffffffffffffffff8111156128245761282361155b565b5b808601612831898261275d565b85526020850194505050602081019050612801565b5050509392505050565b600082601f8301126128655761286461155b565b5b81516128758482602086016127c9565b91505092915050565b60006020828403121561289457612893611414565b5b600082015167ffffffffffffffff8111156128b2576128b1611419565b5b6128be84828501612850565b91505092915050565b6128d081611a72565b81146128db57600080fd5b50565b6000815190506128ed816128c7565b92915050565b60006020828403121561290957612908611414565b5b6000612917848285016128de565b91505092915050565b61292981611adf565b82525050565b60006040820190506129446000830185612264565b6129516020830184612920565b9392505050565b60006020828403121561296e5761296d611414565b5b600082015167ffffffffffffffff81111561298c5761298b611419565b5b61299884828501612540565b91505092915050565b6129aa81611c03565b82525050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126129dc576129db6129ba565b5b83810192508235915060208301925067ffffffffffffffff821115612a0457612a036129b0565b5b600182023603831315612a1a57612a196129b5565b5b509250929050565b6000612a2e8385611e22565b9350612a3b838584611611565b612a44836114ef565b840190509392505050565b6000612a5e6020840184611c2e565b905092915050565b600081359050612a75816128c7565b92915050565b6000612a8a6020840184612a66565b905092915050565b612a9b81611a72565b82525050565b600060a08301612ab460008401846129bf565b8583036000870152612ac7838284612a22565b92505050612ad86020840184612a4f565b612ae56020860182611d32565b50612af36040840184612a4f565b612b006040860182611d32565b50612b0e6060840184612a7b565b612b1b6060860182612a92565b50612b296080840184612a7b565b612b366080860182612a92565b508091505092915050565b60006080820190508181036000830152612b5b81876120cc565b9050612b6a60208301866129a1565b612b7760408301856129a1565b8181036060830152612b898184612aa1565b905095945050505050565b600067ffffffffffffffff821115612baf57612bae611565565b5b602082029050602081019050919050565b600081519050612bcf81611c17565b92915050565b600060408284031215612beb57612bea61234d565b5b612bf560406115c5565b90506000612c05848285016123f8565b6000830152506020612c1984828501612424565b60208301525092915050565b600060608284031215612c3b57612c3a61234d565b5b612c4560406115c5565b90506000612c5584828501612bc0565b6000830152506020612c6984828501612bd5565b60208301525092915050565b6000612c88612c8384612b94565b6115c5565b90508083825260208201905060608402830185811115612cab57612caa6123f3565b5b835b81811015612cd45780612cc08882612c25565b845260208401935050606081019050612cad565b5050509392505050565b600082601f830112612cf357612cf261155b565b5b8151612d03848260208601612c75565b91505092915050565b600067ffffffffffffffff821115612d2757612d26611565565b5b612d30826114ef565b9050602081019050919050565b6000612d50612d4b84612d0c565b6115c5565b905082815260208101848484011115612d6c57612d6b611560565b5b612d778482856114c5565b509392505050565b600082601f830112612d9457612d9361155b565b5b8151612da4848260208601612d3d565b91505092915050565b600060408284031215612dc357612dc261234d565b5b612dcd60406115c5565b9050600082015167ffffffffffffffff811115612ded57612dec612352565b5b612df984828501612d7f565b6000830152506020612e0d84828501612bc0565b60208301525092915050565b60008060408385031215612e3057612e2f611414565b5b600083015167ffffffffffffffff811115612e4e57612e4d611419565b5b612e5a85828601612cde565b925050602083015167ffffffffffffffff811115612e7b57612e7a611419565b5b612e8785828601612dad565b9150509250929050565b7f6661696c656420746f2073657420776974686472617720616464726573730000600082015250565b6000612ec7601e836120bb565b9150612ed282612e91565b602082019050919050565b60006020820190508181036000830152612ef681612eba565b9050919050565b600067ffffffffffffffff821115612f1857612f17611565565b5b602082029050602081019050919050565b6000612f3c612f3784612efd565b6115c5565b90508083825260208201905060208402830185811115612f5f57612f5e6123f3565b5b835b81811015612fa657805167ffffffffffffffff811115612f8457612f8361155b565b5b808601612f918982612399565b85526020850194505050602081019050612f61565b5050509392505050565b600082601f830112612fc557612fc461155b565b5b8151612fd5848260208601612f29565b91505092915050565b600060208284031215612ff457612ff3611414565b5b600082015167ffffffffffffffff81111561301257613011611419565b5b61301e84828501612fb0565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061306182611aa8565b915061306c83611aa8565b925082820190507fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008112677fffffffffffffff821317156130b0576130af613027565b5b92915050565b6130bf8161175a565b82525050565b60006040820190506130da6000830185612264565b6130e760208301846130b6565b9392505050565b60006130f982611aa8565b915061310483611aa8565b92508282039050677fffffffffffffff81137fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008212171561314857613147613027565b5b92915050565b60006020828403121561316457613163611414565b5b600082015167ffffffffffffffff81111561318257613181611419565b5b61318e84828501612399565b91505092915050565b600067ffffffffffffffff8211156131b2576131b1611565565b5b602082029050602081019050919050565b6000604082840312156131d9576131d861234d565b5b6131e360406115c5565b9050600082015167ffffffffffffffff81111561320357613202612352565b5b61320f84828501612399565b600083015250602082015167ffffffffffffffff81111561323357613232612352565b5b61323f84828501612540565b60208301525092915050565b600061325e61325984613197565b6115c5565b90508083825260208201905060208402830185811115613281576132806123f3565b5b835b818110156132c857805167ffffffffffffffff8111156132a6576132a561155b565b5b8086016132b389826131c3565b85526020850194505050602081019050613283565b5050509392505050565b600082601f8301126132e7576132e661155b565b5b81516132f784826020860161324b565b91505092915050565b6000806040838503121561331757613316611414565b5b600083015167ffffffffffffffff81111561333557613334611419565b5b613341858286016132d2565b925050602083015167ffffffffffffffff81111561336257613361611419565b5b61336e85828601612540565b915050925092905056fea264697066735822122098cf28e1eaebfa4ab5717b6e13f8a9f4a27ffa9a4ab2c11b08247ad17d35919964736f6c63430008120033", + "deployedBytecode": "0x60806040526004361061012a5760003560e01c806388b2d581116100ab578063c7804bb51161006f578063c7804bb514610489578063cb85aa0a146104c6578063d0e30db014610503578063d3f831be1461050d578063e0421e391461054a578063e236c7a6146105875761012a565b806388b2d58114610357578063963516e41461039557806398194593146103d2578063b2d178831461040f578063b6a216ae1461044c5761012a565b806361bc221a116100f257806361bc221a1461024c5780636f669da41461027757806378a5dfd1146102b4578063796b96d2146102f15780637c9db0bb1461031a5761012a565b806301b680001461012f5780630c05e9e41461016c578063296c60aa146101a95780632d0ee16a146101d257806346e16d341461020f575b600080fd5b34801561013b57600080fd5b506101566004803603810190610151919061147c565b6105c5565b6040516101639190611539565b60405180910390f35b34801561017857600080fd5b50610193600480360381019061018e9190611690565b61070d565b6040516101a091906118d3565b60405180910390f35b3480156101b557600080fd5b506101d060048036038101906101cb91906118f5565b61079d565b005b3480156101de57600080fd5b506101f960048036038101906101f49190611690565b6108de565b6040516102069190611a50565b60405180910390f35b34801561021b57600080fd5b50610236600480360381019061023191906118f5565b61096c565b6040516102439190611a8d565b60405180910390f35b34801561025857600080fd5b506102616109f6565b60405161026e9190611ac4565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190611b1b565b610a07565b6040516102ab9190611a8d565b60405180910390f35b3480156102c057600080fd5b506102db60048036038101906102d691906118f5565b610a91565b6040516102e89190611be1565b60405180910390f35b3480156102fd57600080fd5b50610318600480360381019061031391906118f5565b610b1e565b005b34801561032657600080fd5b50610341600480360381019061033c9190611690565b610c5f565b60405161034e9190611be1565b60405180910390f35b34801561036357600080fd5b5061037e60048036038101906103799190611c67565b610ce9565b60405161038c929190611ea9565b60405180910390f35b3480156103a157600080fd5b506103bc60048036038101906103b79190611690565b610d87565b6040516103c99190611a8d565b60405180910390f35b3480156103de57600080fd5b506103f960048036038101906103f491906118f5565b610e10565b6040516104069190611a50565b60405180910390f35b34801561041b57600080fd5b5061043660048036038101906104319190611ee0565b610e9f565b6040516104439190611a50565b60405180910390f35b34801561045857600080fd5b50610473600480360381019061046e919061147c565b610ff4565b604051610480919061202d565b60405180910390f35b34801561049557600080fd5b506104b060048036038101906104ab919061207b565b61107e565b6040516104bd9190611a8d565b60405180910390f35b3480156104d257600080fd5b506104ed60048036038101906104e8919061147c565b611196565b6040516104fa9190612105565b60405180910390f35b61050b611220565b005b34801561051957600080fd5b50610534600480360381019061052f9190611690565b611222565b6040516105419190611be1565b60405180910390f35b34801561055657600080fd5b50610571600480360381019061056c9190611690565b6112ac565b60405161057e9190611a50565b60405180910390f35b34801561059357600080fd5b506105ae60048036038101906105a9919061147c565b611338565b6040516105bc92919061222d565b60405180910390f35b606060008061080173ffffffffffffffffffffffffffffffffffffffff16846040516024016105f49190612273565b6040516020818303038152906040527f5431f450000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161067e91906122ca565b600060405180830381855afa9150503d80600081146106b9576040519150601f19603f3d011682016040523d82523d6000602084013e6106be565b606091505b509150915081610703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106fa9061232d565b60405180910390fd5b8092505050919050565b6107156113c5565b61080173ffffffffffffffffffffffffffffffffffffffff166354212a89836040518263ffffffff1660e01b81526004016107509190612105565b600060405180830381865afa15801561076d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906107969190612626565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff1683836040516024016107cb92919061266f565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161085591906122ca565b600060405180830381855af49150503d8060008114610890576040519150601f19603f3d011682016040523d82523d6000602084013e610895565b606091505b50509050806108d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d090612711565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6130846040518363ffffffff1660e01b815260040161091d92919061266f565b6000604051808303816000875af115801561093c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610965919061287e565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9684846040518363ffffffff1660e01b81526004016109ab92919061266f565b6020604051808303816000875af11580156109ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ee91906128f3565b905092915050565b60008054906101000a900460070b81565b600061080173ffffffffffffffffffffffffffffffffffffffff16632efe8a5f84846040518363ffffffff1660e01b8152600401610a4692919061292f565b6020604051808303816000875af1158015610a65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8991906128f3565b905092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff16639ad563b484846040518363ffffffff1660e01b8152600401610ad092919061266f565b600060405180830381865afa158015610aed573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610b169190612958565b905092915050565b600061080173ffffffffffffffffffffffffffffffffffffffff168383604051602401610b4c92919061266f565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610bd691906122ca565b600060405180830381855afa9150503d8060008114610c11576040519150601f19603f3d011682016040523d82523d6000602084013e610c16565b606091505b5050905080610c5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c519061232d565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633dd40f78836040518263ffffffff1660e01b8152600401610c9c9190612105565b600060405180830381865afa158015610cb9573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610ce29190612958565b9050919050565b6060610cf36113e6565b61080173ffffffffffffffffffffffffffffffffffffffff16638f2473ce878787876040518563ffffffff1660e01b8152600401610d349493929190612b41565b600060405180830381865afa158015610d51573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610d7a9190612e19565b9150915094509492505050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9630846040518363ffffffff1660e01b8152600401610dc692919061266f565b6020604051808303816000875af1158015610de5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0991906128f3565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6184846040518363ffffffff1660e01b8152600401610e4f92919061266f565b6000604051808303816000875af1158015610e6e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610e97919061287e565b905092915050565b6060600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9633876040518363ffffffff1660e01b8152600401610ee092919061266f565b6020604051808303816000875af1158015610eff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2391906128f3565b905080610f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5c90612edd565b60405180910390fd5b61080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6185856040518363ffffffff1660e01b8152600401610fa292919061266f565b6000604051808303816000875af1158015610fc1573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610fea919061287e565b9150509392505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663a66cb605836040518263ffffffff1660e01b81526004016110319190612273565b600060405180830381865afa15801561104e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110779190612fde565b9050919050565b600060016000808282829054906101000a900460070b61109e9190613056565b92506101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff16021790555061080173ffffffffffffffffffffffffffffffffffffffff1663ed41d0b684846040518363ffffffff1660e01b81526004016111049291906130c5565b6020604051808303816000875af1158015611123573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114791906128f3565b905060016000808282829054906101000a900460070b61116791906130ee565b92506101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff16021790555092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff16635431f450836040518263ffffffff1660e01b81526004016111d39190612273565b600060405180830381865afa1580156111f0573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611219919061314e565b9050919050565b565b606061080173ffffffffffffffffffffffffffffffffffffffff166385b2d2da836040518263ffffffff1660e01b815260040161125f9190612105565b600060405180830381865afa15801561127c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906112a59190612958565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633ce4e3be836040518263ffffffff1660e01b81526004016112e99190612105565b6000604051808303816000875af1158015611308573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611331919061287e565b9050919050565b60608061080173ffffffffffffffffffffffffffffffffffffffff166354be1a28846040518263ffffffff1660e01b81526004016113769190612273565b600060405180830381865afa158015611393573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906113bc9190613300565b91509150915091565b60405180606001604052806060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006114498261141e565b9050919050565b6114598161143e565b811461146457600080fd5b50565b60008135905061147681611450565b92915050565b60006020828403121561149257611491611414565b5b60006114a084828501611467565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156114e35780820151818401526020810190506114c8565b60008484015250505050565b6000601f19601f8301169050919050565b600061150b826114a9565b61151581856114b4565b93506115258185602086016114c5565b61152e816114ef565b840191505092915050565b600060208201905081810360008301526115538184611500565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61159d826114ef565b810181811067ffffffffffffffff821117156115bc576115bb611565565b5b80604052505050565b60006115cf61140a565b90506115db8282611594565b919050565b600067ffffffffffffffff8211156115fb576115fa611565565b5b611604826114ef565b9050602081019050919050565b82818337600083830152505050565b600061163361162e846115e0565b6115c5565b90508281526020810184848401111561164f5761164e611560565b5b61165a848285611611565b509392505050565b600082601f8301126116775761167661155b565b5b8135611687848260208601611620565b91505092915050565b6000602082840312156116a6576116a5611414565b5b600082013567ffffffffffffffff8111156116c4576116c3611419565b5b6116d084828501611662565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000611700826116d9565b61170a81856116e4565b935061171a8185602086016114c5565b611723816114ef565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000819050919050565b61176d8161175a565b82525050565b600060ff82169050919050565b61178981611773565b82525050565b600060608301600083015184820360008601526117ac82826116f5565b91505060208301516117c16020860182611764565b5060408301516117d46040860182611780565b508091505092915050565b60006117eb838361178f565b905092915050565b6000602082019050919050565b600061180b8261172e565b6118158185611739565b9350836020820285016118278561174a565b8060005b85811015611863578484038952815161184485826117df565b945061184f836117f3565b925060208a0199505060018101905061182b565b50829750879550505050505092915050565b6000606083016000830151848203600086015261189282826116f5565b915050602083015184820360208601526118ac8282611800565b915050604083015184820360408601526118c68282611800565b9150508091505092915050565b600060208201905081810360008301526118ed8184611875565b905092915050565b6000806040838503121561190c5761190b611414565b5b600061191a85828601611467565b925050602083013567ffffffffffffffff81111561193b5761193a611419565b5b61194785828601611662565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000604083016000830151848203600086015261199a82826116f5565b91505060208301516119af6020860182611764565b508091505092915050565b60006119c6838361197d565b905092915050565b6000602082019050919050565b60006119e682611951565b6119f0818561195c565b935083602082028501611a028561196d565b8060005b85811015611a3e5784840389528151611a1f85826119ba565b9450611a2a836119ce565b925060208a01995050600181019050611a06565b50829750879550505050505092915050565b60006020820190508181036000830152611a6a81846119db565b905092915050565b60008115159050919050565b611a8781611a72565b82525050565b6000602082019050611aa26000830184611a7e565b92915050565b60008160070b9050919050565b611abe81611aa8565b82525050565b6000602082019050611ad96000830184611ab5565b92915050565b600063ffffffff82169050919050565b611af881611adf565b8114611b0357600080fd5b50565b600081359050611b1581611aef565b92915050565b60008060408385031215611b3257611b31611414565b5b6000611b4085828601611467565b9250506020611b5185828601611b06565b9150509250929050565b600082825260208201905092915050565b6000611b778261172e565b611b818185611b5b565b935083602082028501611b938561174a565b8060005b85811015611bcf5784840389528151611bb085826117df565b9450611bbb836117f3565b925060208a01995050600181019050611b97565b50829750879550505050505092915050565b60006020820190508181036000830152611bfb8184611b6c565b905092915050565b600067ffffffffffffffff82169050919050565b611c2081611c03565b8114611c2b57600080fd5b50565b600081359050611c3d81611c17565b92915050565b600080fd5b600060a08284031215611c5e57611c5d611c43565b5b81905092915050565b60008060008060808587031215611c8157611c80611414565b5b600085013567ffffffffffffffff811115611c9f57611c9e611419565b5b611cab87828801611662565b9450506020611cbc87828801611c2e565b9350506040611ccd87828801611c2e565b925050606085013567ffffffffffffffff811115611cee57611ced611419565b5b611cfa87828801611c48565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611d3b81611c03565b82525050565b604082016000820151611d576000850182611764565b506020820151611d6a6020850182611780565b50505050565b606082016000820151611d866000850182611d32565b506020820151611d996020850182611d41565b50505050565b6000611dab8383611d70565b60608301905092915050565b6000602082019050919050565b6000611dcf82611d06565b611dd98185611d11565b9350611de483611d22565b8060005b83811015611e15578151611dfc8882611d9f565b9750611e0783611db7565b925050600181019050611de8565b5085935050505092915050565b600082825260208201905092915050565b6000611e3e826114a9565b611e488185611e22565b9350611e588185602086016114c5565b611e61816114ef565b840191505092915050565b60006040830160008301518482036000860152611e898282611e33565b9150506020830151611e9e6020860182611d32565b508091505092915050565b60006040820190508181036000830152611ec38185611dc4565b90508181036020830152611ed78184611e6c565b90509392505050565b600080600060608486031215611ef957611ef8611414565b5b600084013567ffffffffffffffff811115611f1757611f16611419565b5b611f2386828701611662565b9350506020611f3486828701611467565b925050604084013567ffffffffffffffff811115611f5557611f54611419565b5b611f6186828701611662565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000611fa383836116f5565b905092915050565b6000602082019050919050565b6000611fc382611f6b565b611fcd8185611f76565b935083602082028501611fdf85611f87565b8060005b8581101561201b5784840389528151611ffc8582611f97565b945061200783611fab565b925060208a01995050600181019050611fe3565b50829750879550505050505092915050565b600060208201905081810360008301526120478184611fb8565b905092915050565b6120588161175a565b811461206357600080fd5b50565b6000813590506120758161204f565b92915050565b6000806040838503121561209257612091611414565b5b60006120a085828601611467565b92505060206120b185828601612066565b9150509250929050565b600082825260208201905092915050565b60006120d7826116d9565b6120e181856120bb565b93506120f18185602086016114c5565b6120fa816114ef565b840191505092915050565b6000602082019050818103600083015261211f81846120cc565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000604083016000830151848203600086015261217082826116f5565b9150506020830151848203602086015261218a8282611800565b9150508091505092915050565b60006121a38383612153565b905092915050565b6000602082019050919050565b60006121c382612127565b6121cd8185612132565b9350836020820285016121df85612143565b8060005b8581101561221b57848403895281516121fc8582612197565b9450612207836121ab565b925060208a019950506001810190506121e3565b50829750879550505050505092915050565b6000604082019050818103600083015261224781856121b8565b9050818103602083015261225b8184611b6c565b90509392505050565b61226d8161143e565b82525050565b60006020820190506122886000830184612264565b92915050565b600081905092915050565b60006122a4826114a9565b6122ae818561228e565b93506122be8185602086016114c5565b80840191505092915050565b60006122d68284612299565b915081905092915050565b7f6661696c65642073746174696343616c6c20746f20707265636f6d70696c6500600082015250565b6000612317601f836120bb565b9150612322826122e1565b602082019050919050565b600060208201905081810360008301526123468161230a565b9050919050565b600080fd5b600080fd5b600061236a612365846115e0565b6115c5565b90508281526020810184848401111561238657612385611560565b5b6123918482856114c5565b509392505050565b600082601f8301126123ae576123ad61155b565b5b81516123be848260208601612357565b91505092915050565b600067ffffffffffffffff8211156123e2576123e1611565565b5b602082029050602081019050919050565b600080fd5b6000815190506124078161204f565b92915050565b61241681611773565b811461242157600080fd5b50565b6000815190506124338161240d565b92915050565b60006060828403121561244f5761244e61234d565b5b61245960606115c5565b9050600082015167ffffffffffffffff81111561247957612478612352565b5b61248584828501612399565b6000830152506020612499848285016123f8565b60208301525060406124ad84828501612424565b60408301525092915050565b60006124cc6124c7846123c7565b6115c5565b905080838252602082019050602084028301858111156124ef576124ee6123f3565b5b835b8181101561253657805167ffffffffffffffff8111156125145761251361155b565b5b8086016125218982612439565b855260208501945050506020810190506124f1565b5050509392505050565b600082601f8301126125555761255461155b565b5b81516125658482602086016124b9565b91505092915050565b6000606082840312156125845761258361234d565b5b61258e60606115c5565b9050600082015167ffffffffffffffff8111156125ae576125ad612352565b5b6125ba84828501612399565b600083015250602082015167ffffffffffffffff8111156125de576125dd612352565b5b6125ea84828501612540565b602083015250604082015167ffffffffffffffff81111561260e5761260d612352565b5b61261a84828501612540565b60408301525092915050565b60006020828403121561263c5761263b611414565b5b600082015167ffffffffffffffff81111561265a57612659611419565b5b6126668482850161256e565b91505092915050565b60006040820190506126846000830185612264565b818103602083015261269681846120cc565b90509392505050565b7f6661696c65642064656c656761746543616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b60006126fb6021836120bb565b91506127068261269f565b604082019050919050565b6000602082019050818103600083015261272a816126ee565b9050919050565b600067ffffffffffffffff82111561274c5761274b611565565b5b602082029050602081019050919050565b6000604082840312156127735761277261234d565b5b61277d60406115c5565b9050600082015167ffffffffffffffff81111561279d5761279c612352565b5b6127a984828501612399565b60008301525060206127bd848285016123f8565b60208301525092915050565b60006127dc6127d784612731565b6115c5565b905080838252602082019050602084028301858111156127ff576127fe6123f3565b5b835b8181101561284657805167ffffffffffffffff8111156128245761282361155b565b5b808601612831898261275d565b85526020850194505050602081019050612801565b5050509392505050565b600082601f8301126128655761286461155b565b5b81516128758482602086016127c9565b91505092915050565b60006020828403121561289457612893611414565b5b600082015167ffffffffffffffff8111156128b2576128b1611419565b5b6128be84828501612850565b91505092915050565b6128d081611a72565b81146128db57600080fd5b50565b6000815190506128ed816128c7565b92915050565b60006020828403121561290957612908611414565b5b6000612917848285016128de565b91505092915050565b61292981611adf565b82525050565b60006040820190506129446000830185612264565b6129516020830184612920565b9392505050565b60006020828403121561296e5761296d611414565b5b600082015167ffffffffffffffff81111561298c5761298b611419565b5b61299884828501612540565b91505092915050565b6129aa81611c03565b82525050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126129dc576129db6129ba565b5b83810192508235915060208301925067ffffffffffffffff821115612a0457612a036129b0565b5b600182023603831315612a1a57612a196129b5565b5b509250929050565b6000612a2e8385611e22565b9350612a3b838584611611565b612a44836114ef565b840190509392505050565b6000612a5e6020840184611c2e565b905092915050565b600081359050612a75816128c7565b92915050565b6000612a8a6020840184612a66565b905092915050565b612a9b81611a72565b82525050565b600060a08301612ab460008401846129bf565b8583036000870152612ac7838284612a22565b92505050612ad86020840184612a4f565b612ae56020860182611d32565b50612af36040840184612a4f565b612b006040860182611d32565b50612b0e6060840184612a7b565b612b1b6060860182612a92565b50612b296080840184612a7b565b612b366080860182612a92565b508091505092915050565b60006080820190508181036000830152612b5b81876120cc565b9050612b6a60208301866129a1565b612b7760408301856129a1565b8181036060830152612b898184612aa1565b905095945050505050565b600067ffffffffffffffff821115612baf57612bae611565565b5b602082029050602081019050919050565b600081519050612bcf81611c17565b92915050565b600060408284031215612beb57612bea61234d565b5b612bf560406115c5565b90506000612c05848285016123f8565b6000830152506020612c1984828501612424565b60208301525092915050565b600060608284031215612c3b57612c3a61234d565b5b612c4560406115c5565b90506000612c5584828501612bc0565b6000830152506020612c6984828501612bd5565b60208301525092915050565b6000612c88612c8384612b94565b6115c5565b90508083825260208201905060608402830185811115612cab57612caa6123f3565b5b835b81811015612cd45780612cc08882612c25565b845260208401935050606081019050612cad565b5050509392505050565b600082601f830112612cf357612cf261155b565b5b8151612d03848260208601612c75565b91505092915050565b600067ffffffffffffffff821115612d2757612d26611565565b5b612d30826114ef565b9050602081019050919050565b6000612d50612d4b84612d0c565b6115c5565b905082815260208101848484011115612d6c57612d6b611560565b5b612d778482856114c5565b509392505050565b600082601f830112612d9457612d9361155b565b5b8151612da4848260208601612d3d565b91505092915050565b600060408284031215612dc357612dc261234d565b5b612dcd60406115c5565b9050600082015167ffffffffffffffff811115612ded57612dec612352565b5b612df984828501612d7f565b6000830152506020612e0d84828501612bc0565b60208301525092915050565b60008060408385031215612e3057612e2f611414565b5b600083015167ffffffffffffffff811115612e4e57612e4d611419565b5b612e5a85828601612cde565b925050602083015167ffffffffffffffff811115612e7b57612e7a611419565b5b612e8785828601612dad565b9150509250929050565b7f6661696c656420746f2073657420776974686472617720616464726573730000600082015250565b6000612ec7601e836120bb565b9150612ed282612e91565b602082019050919050565b60006020820190508181036000830152612ef681612eba565b9050919050565b600067ffffffffffffffff821115612f1857612f17611565565b5b602082029050602081019050919050565b6000612f3c612f3784612efd565b6115c5565b90508083825260208201905060208402830185811115612f5f57612f5e6123f3565b5b835b81811015612fa657805167ffffffffffffffff811115612f8457612f8361155b565b5b808601612f918982612399565b85526020850194505050602081019050612f61565b5050509392505050565b600082601f830112612fc557612fc461155b565b5b8151612fd5848260208601612f29565b91505092915050565b600060208284031215612ff457612ff3611414565b5b600082015167ffffffffffffffff81111561301257613011611419565b5b61301e84828501612fb0565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061306182611aa8565b915061306c83611aa8565b925082820190507fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008112677fffffffffffffff821317156130b0576130af613027565b5b92915050565b6130bf8161175a565b82525050565b60006040820190506130da6000830185612264565b6130e760208301846130b6565b9392505050565b60006130f982611aa8565b915061310483611aa8565b92508282039050677fffffffffffffff81137fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008212171561314857613147613027565b5b92915050565b60006020828403121561316457613163611414565b5b600082015167ffffffffffffffff81111561318257613181611419565b5b61318e84828501612399565b91505092915050565b600067ffffffffffffffff8211156131b2576131b1611565565b5b602082029050602081019050919050565b6000604082840312156131d9576131d861234d565b5b6131e360406115c5565b9050600082015167ffffffffffffffff81111561320357613202612352565b5b61320f84828501612399565b600083015250602082015167ffffffffffffffff81111561323357613232612352565b5b61323f84828501612540565b60208301525092915050565b600061325e61325984613197565b6115c5565b90508083825260208201905060208402830185811115613281576132806123f3565b5b835b818110156132c857805167ffffffffffffffff8111156132a6576132a561155b565b5b8086016132b389826131c3565b85526020850194505050602081019050613283565b5050509392505050565b600082601f8301126132e7576132e661155b565b5b81516132f784826020860161324b565b91505092915050565b6000806040838503121561331757613316611414565b5b600083015167ffffffffffffffff81111561333557613334611419565b5b613341858286016132d2565b925050602083015167ffffffffffffffff81111561336257613361611419565b5b61336e85828601612540565b915050925092905056fea264697066735822122098cf28e1eaebfa4ab5717b6e13f8a9f4a27ffa9a4ab2c11b08247ad17d35919964736f6c63430008120033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/precompiles/testutil/contracts/DistributionCaller.sol b/precompiles/testutil/contracts/DistributionCaller.sol index 5a848f375e..e41d8ee93b 100644 --- a/precompiles/testutil/contracts/DistributionCaller.sol +++ b/precompiles/testutil/contracts/DistributionCaller.sol @@ -5,18 +5,16 @@ import "../../distribution/DistributionI.sol" as distribution; import "../../common/Types.sol" as types; contract DistributionCaller { - /// counter is used to test the state persistence bug, when EVM and Cosmos state were both - /// changed in the same function. - uint256 public counter; + int64 public counter; function testSetWithdrawAddressFromContract( string memory _withdrawAddr ) public returns (bool) { return distribution.DISTRIBUTION_CONTRACT.setWithdrawAddress( - address(this), - _withdrawAddr - ); + address(this), + _withdrawAddr + ); } function testWithdrawDelegatorRewardsFromContract( @@ -24,9 +22,9 @@ contract DistributionCaller { ) public returns (types.Coin[] memory) { return distribution.DISTRIBUTION_CONTRACT.withdrawDelegatorRewards( - address(this), - _valAddr - ); + address(this), + _valAddr + ); } function testSetWithdrawAddress( @@ -35,9 +33,9 @@ contract DistributionCaller { ) public returns (bool) { return distribution.DISTRIBUTION_CONTRACT.setWithdrawAddress( - _delAddr, - _withdrawAddr - ); + _delAddr, + _withdrawAddr + ); } function testWithdrawDelegatorRewards( @@ -46,9 +44,9 @@ contract DistributionCaller { ) public returns (types.Coin[] memory) { return distribution.DISTRIBUTION_CONTRACT.withdrawDelegatorRewards( - _delAddr, - _valAddr - ); + _delAddr, + _valAddr + ); } function testWithdrawValidatorCommission( @@ -56,20 +54,37 @@ contract DistributionCaller { ) public returns (types.Coin[] memory) { return distribution.DISTRIBUTION_CONTRACT.withdrawValidatorCommission( - _valAddr - ); + _valAddr + ); } function testClaimRewards( address _delAddr, uint32 _maxRetrieve ) public returns (bool success) { - counter++; - success = distribution.DISTRIBUTION_CONTRACT.claimRewards( + return + distribution.DISTRIBUTION_CONTRACT.claimRewards( _delAddr, _maxRetrieve ); - counter--; + } + + /// @dev testFundCommunityPool defines a method to allow an account to directly + /// fund the community pool. + /// @param depositor The address of the depositor + /// @param amount The amount of coin fund community pool + /// @return success Whether the transaction was successful or not + function testFundCommunityPool( + address depositor, + uint256 amount + ) public returns (bool success) { + counter += 1; + success = distribution.DISTRIBUTION_CONTRACT.fundCommunityPool( + depositor, + amount + ); + counter -= 1; + return success; } function getValidatorDistributionInfo( @@ -77,8 +92,8 @@ contract DistributionCaller { ) public view returns (distribution.ValidatorDistributionInfo memory) { return distribution.DISTRIBUTION_CONTRACT.validatorDistributionInfo( - _valAddr - ); + _valAddr + ); } function getValidatorOutstandingRewards( @@ -86,8 +101,8 @@ contract DistributionCaller { ) public view returns (types.DecCoin[] memory) { return distribution.DISTRIBUTION_CONTRACT.validatorOutstandingRewards( - _valAddr - ); + _valAddr + ); } function getValidatorCommission( @@ -102,20 +117,20 @@ contract DistributionCaller { uint64 _endingHeight, types.PageRequest calldata pageRequest ) - public - view - returns ( - distribution.ValidatorSlashEvent[] memory, - distribution.PageResponse memory - ) + public + view + returns ( + distribution.ValidatorSlashEvent[] memory, + distribution.PageResponse memory + ) { return distribution.DISTRIBUTION_CONTRACT.validatorSlashes( - _valAddr, - _startingHeight, - _endingHeight, - pageRequest - ); + _valAddr, + _startingHeight, + _endingHeight, + pageRequest + ); } function getDelegationRewards( @@ -124,20 +139,20 @@ contract DistributionCaller { ) public view returns (types.DecCoin[] memory) { return distribution.DISTRIBUTION_CONTRACT.delegationRewards( - _delAddr, - _valAddr - ); + _delAddr, + _valAddr + ); } function getDelegationTotalRewards( address _delAddr ) - public - view - returns ( - distribution.DelegationDelegatorReward[] memory rewards, - types.DecCoin[] memory total - ) + public + view + returns ( + distribution.DelegationDelegatorReward[] memory rewards, + types.DecCoin[] memory total + ) { return distribution.DISTRIBUTION_CONTRACT.delegationTotalRewards(_delAddr); @@ -154,8 +169,8 @@ contract DistributionCaller { ) public view returns (string memory) { return distribution.DISTRIBUTION_CONTRACT.delegatorWithdrawAddress( - _delAddr - ); + _delAddr + ); } // testRevertState allows sender to change the withdraw address @@ -173,9 +188,9 @@ contract DistributionCaller { return distribution.DISTRIBUTION_CONTRACT.withdrawDelegatorRewards( - _delAddr, - _valAddr - ); + _delAddr, + _valAddr + ); } function delegateCallSetWithdrawAddress( @@ -185,12 +200,12 @@ contract DistributionCaller { (bool success, ) = distribution .DISTRIBUTION_PRECOMPILE_ADDRESS .delegatecall( - abi.encodeWithSignature( - "setWithdrawAddress(address,string)", - _delAddr, - _withdrawAddr - ) - ); + abi.encodeWithSignature( + "setWithdrawAddress(address,string)", + _delAddr, + _withdrawAddr + ) + ); require(success, "failed delegateCall to precompile"); } @@ -201,12 +216,12 @@ contract DistributionCaller { (bool success, ) = distribution .DISTRIBUTION_PRECOMPILE_ADDRESS .staticcall( - abi.encodeWithSignature( - "setWithdrawAddress(address,string)", - _delAddr, - _withdrawAddr - ) - ); + abi.encodeWithSignature( + "setWithdrawAddress(address,string)", + _delAddr, + _withdrawAddr + ) + ); require(success, "failed staticCall to precompile"); } @@ -216,12 +231,14 @@ contract DistributionCaller { (bool success, bytes memory data) = distribution .DISTRIBUTION_PRECOMPILE_ADDRESS .staticcall( - abi.encodeWithSignature( - "delegatorWithdrawAddress(address)", - _delAddr - ) - ); + abi.encodeWithSignature( + "delegatorWithdrawAddress(address)", + _delAddr + ) + ); require(success, "failed staticCall to precompile"); return data; } + + function deposit() public payable {} } diff --git a/tests/nix_tests/cosmoscli.py b/tests/nix_tests/cosmoscli.py index 1690136fb3..bb10de65e6 100644 --- a/tests/nix_tests/cosmoscli.py +++ b/tests/nix_tests/cosmoscli.py @@ -395,8 +395,12 @@ def distribution_community(self): output="json", node=self.node_rpc, ) - )["pool"][0] - return float(coin["amount"]) + ) + if "pool" not in coin: + return 0 + if len(coin["pool"]) == 0: + return 0 + return float(coin["pool"][0]["amount"]) def distribution_reward(self, delegator_addr): coin = json.loads( diff --git a/tests/nix_tests/test_distr_precompile.py b/tests/nix_tests/test_distr_precompile.py new file mode 100644 index 0000000000..fffddfb9e3 --- /dev/null +++ b/tests/nix_tests/test_distr_precompile.py @@ -0,0 +1,148 @@ +import json +import pytest + +from .ibc_utils import get_balance +from .utils import ( + ADDRS, + CONTRACTS, + KEYS, + debug_trace_tx, + deploy_contract, + send_transaction, + wait_for_fn, +) + + +# fund from EOA (msg.sender) +# fund from contract (deposit first) +# fund from another EOA +@pytest.mark.parametrize( + "name, deposit_amt, args, err_contains", + [ + ( + "fund from another EOA", + None, + [ADDRS["signer2"], int(1e18)], + "does not match the spender address", + ), + ( + "fund from EOA (origin)", + None, + [ADDRS["signer1"], int(1e18)], + None, + ), + ( + "fund from contract (deposit first)", + int(1e18), + ["CONTRACT_ADDR", int(1e18)], + None, + ), + ], +) +def test_fund_community_pool(evmos_cluster, name, deposit_amt, args, err_contains): + """ + Test the fundCommunityPool function of the distribution + precompile calling it from another precompile + """ + denom = "aevmos" + gas_limit = 200_000 + gas_price = evmos_cluster.w3.eth.gas_price + + # Deployment of distr precompile caller and initial checks + eth_contract, tx_receipt = deploy_contract( + evmos_cluster.w3, CONTRACTS["DistributionCaller"] + ) + assert tx_receipt.status == 1 + + counter = eth_contract.functions.counter().call() + assert counter == 0 + + if deposit_amt is not None: + # deposit some funds to the contract + deposit_tx = eth_contract.functions.deposit().build_transaction( + { + "from": ADDRS["signer1"], + "value": deposit_amt, + "gas": gas_limit, + "gasPrice": gas_price, + } + ) + deposit_receipt = send_transaction( + evmos_cluster.w3, deposit_tx, KEYS["signer1"] + ) + assert deposit_receipt.status == 1, f"Failed: {name}" + + def check_contract_balance(): + new_contract_balance = evmos_cluster.w3.eth.get_balance( + eth_contract.address + ) + return new_contract_balance > 0 + + wait_for_fn("contract balance change", check_contract_balance) + + signer1_prev_balance = get_balance( + evmos_cluster, evmos_cluster.cosmos_cli().address("signer1"), denom + ) + signer2_prev_balance = get_balance( + evmos_cluster, evmos_cluster.cosmos_cli().address("signer2"), denom + ) + + community_prev_balance = evmos_cluster.cosmos_cli().distribution_community() + + # call the smart contract to fund the community pool + if args[0] == "CONTRACT_ADDR": + args[0] = eth_contract.address + send_tx = eth_contract.functions.testFundCommunityPool(*args).build_transaction( + { + "from": ADDRS["signer1"], + "gasPrice": gas_price, + "gas": gas_limit, + } + ) + receipt = send_transaction(evmos_cluster.w3, send_tx, KEYS["signer1"]) + + if err_contains is not None: + assert receipt.status == 0 + trace = debug_trace_tx(evmos_cluster, receipt.transactionHash.hex()) + # stringify the tx trace to look for the expected error message + trace_str = json.dumps(trace, separators=(",", ":")) + assert err_contains in trace_str, f"Failed: {name}" + return + + assert receipt.status == 1, f"Failed: {name}" + fees = receipt.gasUsed * gas_price + + # check that contract's balance is 0 + final_contract_balance = evmos_cluster.w3.eth.get_balance(eth_contract.address) + assert final_contract_balance == 0, f"Failed: {name}" + + # check counter of contract + counter_after = eth_contract.functions.counter().call() + assert counter_after == 0, f"Failed: {name}" + + # check that community pool balance increased + funds_sent_amt = args[1] + community_final_balance = evmos_cluster.cosmos_cli().distribution_community() + assert community_final_balance >= community_prev_balance + funds_sent_amt, f"Failed: {name}" + + # signer2 balance should remain unchanged + signer2_final_balance = get_balance( + evmos_cluster, evmos_cluster.cosmos_cli().address("signer2"), denom + ) + + assert signer2_final_balance == signer2_prev_balance, f"Failed: {name}" + + signer1_final_balance = get_balance( + evmos_cluster, evmos_cluster.cosmos_cli().address("signer1"), denom + ) + # if there was a deposit in the contract + # the community pool was funded by the contract + # and the tx sender (signer1) only paid the fees + if deposit_amt is not None: + assert signer1_final_balance == signer1_prev_balance - fees, f"Failed: {name}" + return + + # signer1 account sent the funds to the community pool + assert ( + signer1_final_balance == signer1_prev_balance - funds_sent_amt - fees + ), f"Failed: {name}" diff --git a/tests/nix_tests/utils.py b/tests/nix_tests/utils.py index 70710c5bb7..68bd29b503 100644 --- a/tests/nix_tests/utils.py +++ b/tests/nix_tests/utils.py @@ -44,6 +44,7 @@ "ICS20FromContract": "ICS20FromContract.sol", "ICS20I": "evmos/ics20/ICS20I.sol", "DistributionI": "evmos/distribution/DistributionI.sol", + "DistributionCaller": "evmos/testutil/contracts/DistributionCaller.sol", "StakingI": "evmos/staking/StakingI.sol", "StakingCaller": "evmos/staking/testdata/StakingCaller.sol", "IStrideOutpost": "evmos/outposts/stride/IStrideOutpost.sol", From 2c3b6f5e40f8652c8881fddf3d18f320926047be Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Jun 2024 13:04:12 +0200 Subject: [PATCH 289/345] build(deps): bump github.com/cosmos/ibc-go/v7 from 7.4.0 to 7.5.0 (#2556) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * build(deps): bump github.com/cosmos/ibc-go/v7 from 7.4.0 to 7.5.0 Bumps [github.com/cosmos/ibc-go/v7](https://github.com/cosmos/ibc-go) from 7.4.0 to 7.5.0. - [Release notes](https://github.com/cosmos/ibc-go/releases) - [Changelog](https://github.com/cosmos/ibc-go/blob/v7.5.0/CHANGELOG.md) - [Commits](https://github.com/cosmos/ibc-go/compare/v7.4.0...v7.5.0) --- updated-dependencies: - dependency-name: github.com/cosmos/ibc-go/v7 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * update gomod2nix.toml file * gomod tidy * update go mod * add query router to ICA host keeper * update deps * add changelog entry * go mod tidy * fix chlog * update ICS20 precompile with new TransferAuth field * run make format * fix chlog * fix chlog * update ics20 nix tests --------- Signed-off-by: dependabot[bot] Signed-off-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: tom Co-authored-by: GAtom22 Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> --- CHANGELOG.md | 1 + app/app.go | 1 + go.mod | 40 +++--- go.sum | 115 +++++++----------- gomod2nix.toml | 75 +++++++----- precompiles/common/Types.sol | 1 + precompiles/common/types.go | 9 +- precompiles/ics20/abi.json | 15 +++ precompiles/ics20/approve_test.go | 18 +-- precompiles/ics20/events_test.go | 8 +- precompiles/ics20/integration_test.go | 30 +++-- precompiles/ics20/query.go | 9 +- precompiles/ics20/query_test.go | 28 +++-- precompiles/ics20/tx_test.go | 60 ++++++--- precompiles/ics20/types.go | 17 +-- precompiles/ics20/utils_test.go | 18 +-- .../testutil/contracts/InterchainSender.json | 14 ++- tests/nix_tests/test_ics20_precompile.py | 4 +- 18 files changed, 264 insertions(+), 199 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a7c79ad597..8f91a00478 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -53,6 +53,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (precompiles) [#2529](https://github.com/evmos/evmos/pull/2529) Remove Outposts precompiles. - (upgrade) [#2533](https://github.com/evmos/evmos/pull/2533) Add upgrade handler for v19. - (staking) [#2051](https://github.com/evmos/evmos/pull/2051) Implement the `EditValidator` function for staking precompiled contract. +- (app) [#2556](https://github.com/evmos/evmos/pull/2556) Bump IBC-go to v7.5.2 and Cosmos-SDK to v0.47.11. - (evm) [#2373](https://github.com/evmos/evmos/pull/2373) Remove check on hardcoded ChainID identifier. - (precompiles) [#2572](https://github.com/evmos/evmos/pull/2572) Add `FundCommunityPool` precompile tx for distribution module. - (evm) [#2538](https://github.com/evmos/evmos/pull/2538) Add Permissions Policy for permissioned EVM. diff --git a/app/app.go b/app/app.go index 86e5bfb800..0990bf9781 100644 --- a/app/app.go +++ b/app/app.go @@ -549,6 +549,7 @@ func NewEvmos( scopedICAHostKeeper, bApp.MsgServiceRouter(), ) + app.ICAHostKeeper.WithQueryRouter(bApp.GRPCQueryRouter()) // create host IBC module icaHostIBCModule := icahost.NewIBCModule(app.ICAHostKeeper) diff --git a/go.mod b/go.mod index 151489d0ab..65b80ba784 100644 --- a/go.mod +++ b/go.mod @@ -11,17 +11,17 @@ require ( github.com/armon/go-metrics v0.4.1 github.com/btcsuite/btcd v0.24.0 github.com/btcsuite/btcd/btcutil v1.1.5 - github.com/cometbft/cometbft v0.37.4 + github.com/cometbft/cometbft v0.37.5 github.com/cometbft/cometbft-db v0.12.0 github.com/cosmos/cosmos-proto v1.0.0-beta.5 - github.com/cosmos/cosmos-sdk v0.47.8 + github.com/cosmos/cosmos-sdk v0.47.11 github.com/cosmos/go-bip39 v1.0.0 github.com/cosmos/gogoproto v1.4.10 - github.com/cosmos/ibc-go/v7 v7.4.0 + github.com/cosmos/ibc-go/v7 v7.5.2-0.20240607065443-0f1cf8bf766b github.com/crypto-org-chain/cronos/memiavl v0.0.5-0.20240129013154-12efd9b7643f github.com/crypto-org-chain/cronos/store v0.0.5-0.20240129013154-12efd9b7643f github.com/crypto-org-chain/cronos/versiondb v0.0.0-20240129013154-12efd9b7643f - github.com/davecgh/go-spew v1.1.1 + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc github.com/ethereum/go-ethereum v1.11.5 github.com/golang/protobuf v1.5.4 github.com/gorilla/mux v1.8.1 @@ -38,7 +38,7 @@ require ( github.com/rs/cors v1.11.0 github.com/spf13/cast v1.6.0 github.com/spf13/cobra v1.8.0 - github.com/spf13/viper v1.16.0 + github.com/spf13/viper v1.18.2 github.com/stretchr/testify v1.9.0 github.com/tidwall/gjson v1.17.1 github.com/tidwall/sjson v1.2.5 @@ -62,14 +62,14 @@ require ( cloud.google.com/go/storage v1.38.0 // indirect cosmossdk.io/core v0.6.1 // indirect cosmossdk.io/depinject v1.0.0-alpha.4 // indirect - cosmossdk.io/log v1.3.0 // indirect + cosmossdk.io/log v1.3.1 // indirect filippo.io/edwards25519 v1.0.0 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect github.com/99designs/keyring v1.2.1 // indirect github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect github.com/ChainSafe/go-schnorrkel v1.0.0 // indirect github.com/DataDog/zstd v1.5.2 // indirect - github.com/Microsoft/go-winio v0.6.0 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect github.com/StackExchange/wmi v1.2.1 // indirect github.com/VictoriaMetrics/fastcache v1.6.0 // indirect @@ -115,7 +115,7 @@ require ( github.com/dvsekhvalnov/jose2go v1.6.0 // indirect github.com/edsrzf/mmap-go v1.1.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff // indirect github.com/getsentry/sentry-go v0.23.0 // indirect github.com/gin-gonic/gin v1.9.1 // indirect @@ -166,7 +166,7 @@ require ( github.com/jackpal/go-nat-pmp v1.0.2 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/jmhodges/levigo v1.0.0 // indirect - github.com/klauspost/compress v1.16.7 // indirect + github.com/klauspost/compress v1.17.0 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/ledgerwatch/erigon-lib v0.0.0-20230210071639-db0e7ed11263 // indirect @@ -189,9 +189,9 @@ require ( github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0-rc2 // indirect github.com/opencontainers/runc v1.1.12 // indirect - github.com/pelletier/go-toml/v2 v2.0.9 // indirect + github.com/pelletier/go-toml/v2 v2.1.0 // indirect github.com/petermattis/goid v0.0.0-20230518223814-80aa455d8761 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_golang v1.16.0 // indirect github.com/prometheus/client_model v0.4.0 // indirect github.com/prometheus/common v0.44.0 // indirect @@ -200,16 +200,18 @@ require ( github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/rjeczalik/notify v0.9.3 // indirect github.com/rogpeppe/go-internal v1.11.0 // indirect - github.com/rs/zerolog v1.31.0 // indirect + github.com/rs/zerolog v1.32.0 // indirect + github.com/sagikazarmark/locafero v0.4.0 // indirect + github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/sasha-s/go-deadlock v0.3.1 // indirect github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect github.com/sirupsen/logrus v1.9.0 // indirect - github.com/spf13/afero v1.9.5 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spf13/afero v1.11.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/status-im/keycard-go v0.2.0 // indirect github.com/stretchr/objx v0.5.2 // indirect - github.com/subosito/gotenv v1.4.2 // indirect + github.com/subosito/gotenv v1.6.0 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect github.com/tendermint/go-amino v0.16.0 // indirect github.com/tidwall/btree v1.6.0 // indirect @@ -231,7 +233,9 @@ require ( go.opentelemetry.io/otel v1.24.0 // indirect go.opentelemetry.io/otel/metric v1.24.0 // indirect go.opentelemetry.io/otel/trace v1.24.0 // indirect - golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb // indirect + go.uber.org/atomic v1.10.0 // indirect + go.uber.org/multierr v1.9.0 // indirect + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/mod v0.17.0 // indirect golang.org/x/oauth2 v0.18.0 // indirect golang.org/x/sync v0.7.0 // indirect @@ -255,11 +259,13 @@ replace ( // use cosmos fork of keyring github.com/99designs/keyring => github.com/cosmos/keyring v1.2.0 // use Cosmos-SDK fork to enable Ledger functionality - github.com/cosmos/cosmos-sdk => github.com/evmos/cosmos-sdk v0.47.8-evmos + github.com/cosmos/cosmos-sdk => github.com/evmos/cosmos-sdk v0.47.11-evmos // use Evmos geth fork github.com/ethereum/go-ethereum => github.com/evmos/go-ethereum v1.10.26-evmos-rc4 // Security Advisory https://github.com/advisories/GHSA-h395-qcrw-5vmq github.com/gin-gonic/gin => github.com/gin-gonic/gin v1.9.1 // replace broken goleveldb github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 + // need this replace with cosmos-sdk v0.47.11 (more info here https://github.com/cosmos/cosmos-sdk/issues/20159) + golang.org/x/exp => golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb ) diff --git a/go.sum b/go.sum index 2a9cfe6bf7..573c2aae11 100644 --- a/go.sum +++ b/go.sum @@ -3,7 +3,6 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= @@ -16,7 +15,6 @@ cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOY cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= @@ -170,7 +168,6 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= @@ -195,15 +192,14 @@ cosmossdk.io/depinject v1.0.0-alpha.4 h1:PLNp8ZYAMPTUKyG9IK2hsbciDWqna2z1Wsl98ok cosmossdk.io/depinject v1.0.0-alpha.4/go.mod h1:HeDk7IkR5ckZ3lMGs/o91AVUc7E596vMaOmslGFM3yU= cosmossdk.io/errors v1.0.1 h1:bzu+Kcr0kS/1DuPBtUFdWjzLqyUuCiyHjyJB6srBV/0= cosmossdk.io/errors v1.0.1/go.mod h1:MeelVSZThMi4bEakzhhhE/CKqVv3nOJDA25bIqRDu/U= -cosmossdk.io/log v1.3.0 h1:L0Z0XstClo2kOU4h3V1iDoE5Ji64sg5HLOogzGg67Oo= -cosmossdk.io/log v1.3.0/go.mod h1:HIDyvWLqZe2ovlWabsDN4aPMpY/nUEquAhgfTf2ZzB8= +cosmossdk.io/log v1.3.1 h1:UZx8nWIkfbbNEWusZqzAx3ZGvu54TZacWib3EzUYmGI= +cosmossdk.io/log v1.3.1/go.mod h1:2/dIomt8mKdk6vl3OWJcPk2be3pGOS8OQaLUM/3/tCM= cosmossdk.io/math v1.3.0 h1:RC+jryuKeytIiictDslBP9i1fhkVm6ZDmZEoNP316zE= cosmossdk.io/math v1.3.0/go.mod h1:vnRTxewy+M7BtXBNFybkuhSH4WfedVAAnERHgVFhp3k= cosmossdk.io/simapp v0.0.0-20230608160436-666c345ad23d h1:E/8y0oG3u9hBR8l4F9MtC0LdZIamPCUwUoLlrHrX86I= cosmossdk.io/simapp v0.0.0-20230608160436-666c345ad23d/go.mod h1:xbjky3L3DJEylaho6gXplkrMvJ5sFgv+qNX+Nn47bzY= cosmossdk.io/tools/rosetta v0.2.1 h1:ddOMatOH+pbxWbrGJKRAawdBkPYLfKXutK9IETnjYxw= cosmossdk.io/tools/rosetta v0.2.1/go.mod h1:Pqdc1FdvkNV3LcNIkYWt2RQY6IP1ge6YWZk8MhhO9Hw= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= filippo.io/edwards25519 v1.0.0 h1:0wAIcmJUqRdI8IJ/3eGi5/HwXZWPujYXXlkrQogz0Ek= filippo.io/edwards25519 v1.0.0/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= @@ -211,15 +207,14 @@ github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/ChainSafe/go-schnorrkel v1.0.0 h1:3aDA67lAykLaG1y3AOjs88dMxC88PgUuHRrLeDnvGIM= github.com/ChainSafe/go-schnorrkel v1.0.0/go.mod h1:dpzHYVxLZcp8pjlV+O+UR8K0Hp/z7vcchBSbMBEhCw4= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= -github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= -github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= @@ -357,8 +352,8 @@ github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1: github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/coinbase/rosetta-sdk-go/types v1.0.0 h1:jpVIwLcPoOeCR6o1tU+Xv7r5bMONNbHU7MuEHboiFuA= github.com/coinbase/rosetta-sdk-go/types v1.0.0/go.mod h1:eq7W2TMRH22GTW0N0beDnN931DW0/WOI1R2sdHNHG4c= -github.com/cometbft/cometbft v0.37.4 h1:xyvvEqlyfK8MgNIIKVJaMsuIp03wxOcFmVkT26+Ikpg= -github.com/cometbft/cometbft v0.37.4/go.mod h1:Cmg5Hp4sNpapm7j+x0xRyt2g0juQfmB752ous+pA0G8= +github.com/cometbft/cometbft v0.37.5 h1:/U/TlgMh4NdnXNo+YU9T2NMCWyhXNDF34Mx582jlvq0= +github.com/cometbft/cometbft v0.37.5/go.mod h1:QC+mU0lBhKn8r9qvmnq53Dmf3DWBt4VtkcKw2C81wxY= github.com/cometbft/cometbft-db v0.12.0 h1:v77/z0VyfSU7k682IzZeZPFZrQAKiQwkqGN0QzAjMi0= github.com/cometbft/cometbft-db v0.12.0/go.mod h1:aX2NbCrjNVd2ZajYxt1BsiFf/Z+TQ2MN0VxdicheYuw= github.com/confio/ics23/go v0.9.0 h1:cWs+wdbS2KRPZezoaaj+qBleXgUk5WOQFMP3CQFGTr4= @@ -383,8 +378,8 @@ github.com/cosmos/gogoproto v1.4.10 h1:QH/yT8X+c0F4ZDacDv3z+xE3WU1P1Z3wQoLMBRJoK github.com/cosmos/gogoproto v1.4.10/go.mod h1:3aAZzeRWpAwr+SS/LLkICX2/kDFyaYVzckBDzygIxek= github.com/cosmos/iavl v0.21.0-alpha.1.0.20230904092046-df3db2d96583 h1:3Matt7/LjZiZkIBPalYazOZcw2B05Ch14dU5TJyqJEc= github.com/cosmos/iavl v0.21.0-alpha.1.0.20230904092046-df3db2d96583/go.mod h1:WO7FyvaZJoH65+HFOsDir7xU9FWk2w9cHXNW1XHcl7A= -github.com/cosmos/ibc-go/v7 v7.4.0 h1:8FqYMptvksgMvlbN4UW9jFxTXzsPyfAzEZurujXac8M= -github.com/cosmos/ibc-go/v7 v7.4.0/go.mod h1:L/KaEhzV5TGUCTfGysVgMBQtl5Dm7hHitfpk+GIeoAo= +github.com/cosmos/ibc-go/v7 v7.5.2-0.20240607065443-0f1cf8bf766b h1:Lm2UaIiBDQfs5wcLIrgxKsSHFcUFMVQ5vwGm1KMhZr0= +github.com/cosmos/ibc-go/v7 v7.5.2-0.20240607065443-0f1cf8bf766b/go.mod h1:ktFg5GvKOyrGCqTWtW7Grj5uweU4ZapxrNeVS1CLLbo= github.com/cosmos/ics23/go v0.10.0 h1:iXqLLgp2Lp+EdpIuwXTYIQU+AiHj9mOC2X9ab++bZDM= github.com/cosmos/ics23/go v0.10.0/go.mod h1:ZfJSmng/TBNTBkFemHHHj5YY7VAU/MBU980F4VU1NG0= github.com/cosmos/keyring v1.2.0 h1:8C1lBP9xhImmIabyXW4c3vFjjLiBdGCmfLUfeZlV1Yo= @@ -412,8 +407,9 @@ github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuA github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4= github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= @@ -470,8 +466,8 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.m github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evmos/cosmos-sdk v0.47.8-evmos h1:XOkJq3MeWDnTrNfDZk1bvCdrmjyyoxyL5gaTrguHPuA= -github.com/evmos/cosmos-sdk v0.47.8-evmos/go.mod h1:VTAtthIsmfplanhFfUTfT6ED4F+kkJxT7nmvmKXRthI= +github.com/evmos/cosmos-sdk v0.47.11-evmos h1:v7q/YdkSmCpDrymqeQf13iIx0Bez5fgt3BYVnN2Yjb0= +github.com/evmos/cosmos-sdk v0.47.11-evmos/go.mod h1:ADjORYzUQqQv/FxDi0H0K5gW/rAk1CiDR3ZKsExfJV0= github.com/evmos/go-ethereum v1.10.26-evmos-rc4 h1:vwDVMScuB2KSu8ze5oWUuxm6v3bMUp6dL3PWvJNJY+I= github.com/evmos/go-ethereum v1.10.26-evmos-rc4/go.mod h1:/6CsT5Ceen2WPLI/oCA3xMcZ5sWMF/D46SjM/ayY0Oo= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= @@ -488,8 +484,8 @@ github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHk github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= @@ -503,9 +499,6 @@ github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= @@ -659,7 +652,6 @@ github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= @@ -694,7 +686,6 @@ github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMd github.com/googleapis/gax-go/v2 v2.12.2 h1:mhN09QQW1jEWeMF74zGR81R30z4VJzjZsfkUhuHF+DA= github.com/googleapis/gax-go/v2 v2.12.2/go.mod h1:61M8vcyyXR2kqKFxKrfA22jaA8JGF7Dc8App1U3H6jc= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= @@ -824,14 +815,13 @@ github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6 github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= -github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= -github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM= +github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -966,8 +956,8 @@ github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0Mw github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= -github.com/pelletier/go-toml/v2 v2.0.9 h1:uH2qQXheeefCCkuBBSLi7jCiSmj3VRh2+Goq2N7Xxu0= -github.com/pelletier/go-toml/v2 v2.0.9/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= +github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= +github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= github.com/petermattis/goid v0.0.0-20230518223814-80aa455d8761 h1:W04oB3d0J01W5jgYRGKsV8LCM6g9EkCvPkZcmFuy0OE= @@ -982,9 +972,9 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= @@ -1037,13 +1027,17 @@ github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.11.0 h1:0B9GE/r9Bc2UxRMMtymBkHTenPkHDv0CW4Y98GBY+po= github.com/rs/cors v1.11.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.31.0 h1:FcTR3NnLWW+NnTwwhFWiJSZr4ECLpqCm6QsEnyvbV4A= -github.com/rs/zerolog v1.31.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= +github.com/rs/zerolog v1.32.0 h1:keLypqrlIjaFsbmJOBdB/qvyF8KEtCWHwobLp5l/mQ0= +github.com/rs/zerolog v1.32.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= +github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= +github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= +github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/sasha-s/go-deadlock v0.3.1 h1:sqv7fDNShgjcaxkO0JNcOAlr8B9+cV5Ey/OB71efZx0= github.com/sasha-s/go-deadlock v0.3.1/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= @@ -1061,21 +1055,21 @@ github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1 github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= -github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= -github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= +github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= +github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= @@ -1101,8 +1095,8 @@ github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXl github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= -github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= @@ -1197,10 +1191,14 @@ go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= +go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= +go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= @@ -1219,28 +1217,14 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb h1:xIApU0ow1zwMa2uL1VDNeQlNVFTWMQxZUZCMDy0Q4Us= golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1253,19 +1237,17 @@ golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPI golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1310,14 +1292,12 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= @@ -1390,7 +1370,6 @@ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1401,7 +1380,6 @@ golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1434,14 +1412,12 @@ golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1475,7 +1451,6 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1522,7 +1497,6 @@ golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= @@ -1531,9 +1505,7 @@ golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1549,7 +1521,6 @@ golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -1570,7 +1541,6 @@ golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= @@ -1578,6 +1548,7 @@ golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= @@ -1690,10 +1661,8 @@ google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= diff --git a/gomod2nix.toml b/gomod2nix.toml index 1f756e2be1..2470fa2db7 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -29,8 +29,8 @@ schema = 3 version = "v1.0.1" hash = "sha256-MgTocXkBzri9FKkNtkARJXPmxRrRO/diQJS5ZzvYrJY=" [mod."cosmossdk.io/log"] - version = "v1.3.0" - hash = "sha256-ti835PlPIWxP8c2Drfo5asi2Kd6kBkmXaadQZ/BiMqw=" + version = "v1.3.1" + hash = "sha256-otkUvsz35VuuUWXoTmWBwR61+o6YzvWETGdLfwWDvwY=" [mod."cosmossdk.io/math"] version = "v1.3.0" hash = "sha256-EEFK43Cr0g0ndhQhkIKher0FqV3mvkmE9z0sP7uVSHg=" @@ -60,8 +60,8 @@ schema = 3 version = "v1.5.2" hash = "sha256-LVkZHLG8O4CzmqyQVbGn+0r6AKIMABej8a4HKMFw/xo=" [mod."github.com/Microsoft/go-winio"] - version = "v0.6.0" - hash = "sha256-TQ0AvXZfuT3PDnb4p/h5zmyT8m9VPcwxlXMJuVD6ltE=" + version = "v0.6.1" + hash = "sha256-BL0BVaHtmPKQts/711W59AbHXjGKqFS4ZTal0RYnR9I=" [mod."github.com/Nvveen/Gotty"] version = "v0.0.0-20120604004816-cd527374f1e5" hash = "sha256-2EwwPSTvPqMcKRKxCXX1OhknkkO/8fGGtmaAa27Im/o=" @@ -132,8 +132,8 @@ schema = 3 version = "v1.0.0" hash = "sha256-z/0E0NiEGo7zxM7d94ImgUf8P0/KG6hbP9T4Vuym4p0=" [mod."github.com/cometbft/cometbft"] - version = "v0.37.4" - hash = "sha256-rEzIdkxeE5FsIGwvzZiPdifPr0v9SmKHQw78I7v2WUA=" + version = "v0.37.5" + hash = "sha256-l/63NGQFsrG31uLsOolr6z6yMU8fKSbLA//E17mAMsI=" [mod."github.com/cometbft/cometbft-db"] version = "v0.12.0" hash = "sha256-mfeUD8+V+xUzEhSOLgQQP0GFDWt7ch/TeBw9gnTJuHk=" @@ -150,8 +150,8 @@ schema = 3 version = "v1.0.0-beta.5" hash = "sha256-Fy/PbsOsd6iq0Njy3DVWK6HqWsogI+MkE8QslHGWyVg=" [mod."github.com/cosmos/cosmos-sdk"] - version = "v0.47.8-evmos" - hash = "sha256-B+0qa8x/FKNcTV4iQIStB7zz26JXzruoTBRP4voZlbo=" + version = "v0.47.11-evmos" + hash = "sha256-endMjF3Y/4SK7sQraCQu3e9ciJx/deRyMlZpZVYXe38=" replaced = "github.com/evmos/cosmos-sdk" [mod."github.com/cosmos/go-bip39"] version = "v1.0.0" @@ -166,8 +166,8 @@ schema = 3 version = "v0.21.0-alpha.1.0.20230904092046-df3db2d96583" hash = "sha256-3Va8Ljq63IXty0oHlRpqfsC6WsMut6TWZ2R+/nYtfTU=" [mod."github.com/cosmos/ibc-go/v7"] - version = "v7.4.0" - hash = "sha256-pvG3HQL7lVtcGOlxSQLGqDN00Ol7g3HSorOexEVD8xE=" + version = "v7.5.2-0.20240607065443-0f1cf8bf766b" + hash = "sha256-SH4ZcEWQ1bNuRBj1Kj3r3kPoWJmeOtmb8b/YVGf1JsY=" [mod."github.com/cosmos/ics23/go"] version = "v0.10.0" hash = "sha256-KYEv727BO/ht63JO02xiKFGFAddg41Ve9l2vSSZZBq0=" @@ -193,8 +193,8 @@ schema = 3 version = "v1.1.2" hash = "sha256-Nnklfg12vmWCOhELGyoRqEF4w4srp0WbPwreaChYLKs=" [mod."github.com/davecgh/go-spew"] - version = "v1.1.1" - hash = "sha256-nhzSUrE1fCkN0+RL04N4h8jWmRFPPPWbCuDc7Ss0akI=" + version = "v1.1.2-0.20180830191138-d8f796af33cc" + hash = "sha256-fV9oI51xjHdOmEx6+dlq7Ku2Ag+m/bmbzPo6A4Y74qc=" [mod."github.com/deckarep/golang-set"] version = "v1.8.0" hash = "sha256-ELJKphksU9AOYwV3BtjvwPtUpbZvX9YMmo7eIiauQSc=" @@ -245,8 +245,8 @@ schema = 3 version = "v1.0.4" hash = "sha256-c1JKoRSndwwOyOxq9ddCe+8qn7mG9uRq2o/822x5O/c=" [mod."github.com/fsnotify/fsnotify"] - version = "v1.6.0" - hash = "sha256-DQesOCweQPEwmAn6s7DCP/Dwy8IypC+osbpfsvpkdP0=" + version = "v1.7.0" + hash = "sha256-MdT2rQyQHspPJcx6n9ozkLbsktIOJutOqDuKpNAtoZY=" [mod."github.com/gballet/go-libpcsclite"] version = "v0.0.0-20190607065134-2772fd86a8ff" hash = "sha256-Nr5ocU9s1F2Lhx/Zq6/nIo+KkKEqMjDYOEs3yWRC48g=" @@ -417,8 +417,8 @@ schema = 3 version = "v1.0.0" hash = "sha256-xEd0mDBeq3eR/GYeXjoTVb2sPs8sTCosn5ayWkcgENI=" [mod."github.com/klauspost/compress"] - version = "v1.16.7" - hash = "sha256-8miX/lnXyNLPSqhhn5BesLauaIAxETpQpWtr1cu2f+0=" + version = "v1.17.0" + hash = "sha256-Ig86slHz98UbvvkCYK1QXReArAK74T/UNedVq/ZjH5k=" [mod."github.com/kr/pretty"] version = "v0.3.1" hash = "sha256-DlER7XM+xiaLjvebcIPiB12oVNjyZHuJHoRGITzzpKU=" @@ -498,8 +498,8 @@ schema = 3 version = "v3.10.0" hash = "sha256-lu+21U7zG00tsTSXBuc2Aq8Ao320OlNxnsLA1LV0qeo=" [mod."github.com/pelletier/go-toml/v2"] - version = "v2.0.9" - hash = "sha256-mLpNBZOK72qPpForSmzQkDrqR5xzmpUdM/0XxB2AYFA=" + version = "v2.1.0" + hash = "sha256-0u6oV8YMM26y2bw1oe3gLmEJc/whpNaFtEe4yOkN24c=" [mod."github.com/petermattis/goid"] version = "v0.0.0-20230518223814-80aa455d8761" hash = "sha256-PxSWG219xbSAw+NA/LHL6SvBd2XYH7W0EvtckRHtT9U=" @@ -507,8 +507,8 @@ schema = 3 version = "v0.9.1" hash = "sha256-mNfQtcrQmu3sNg/7IwiieKWOgFQOVVe2yXgKBpe/wZw=" [mod."github.com/pmezard/go-difflib"] - version = "v1.0.0" - hash = "sha256-/FtmHnaGjdvEIKAJtrUfEhV7EVo5A/eYrtdnUkuxLDA=" + version = "v1.0.1-0.20181226105442-5d4384ee4fb2" + hash = "sha256-XA4Oj1gdmdV/F/+8kMI+DBxKPthZ768hbKsO3d9Gx90=" [mod."github.com/prometheus/client_golang"] version = "v1.16.0" hash = "sha256-P/b4/8m1ztF0fCLSJ+eRXN74Bncx2vjOJx7nFl2QEg4=" @@ -540,8 +540,14 @@ schema = 3 version = "v1.11.0" hash = "sha256-hF25bVehtWCQsxiOfLuL4Hv8NKVunEqLPk/Vcuheha0=" [mod."github.com/rs/zerolog"] - version = "v1.31.0" - hash = "sha256-OF4VM+Rv6M5EAaUVD2nOzcbZLQ4b7OAMteyyTqIoU0M=" + version = "v1.32.0" + hash = "sha256-9dZjtsES+wLp1cFiSVMuEUbdeXVFcgT0dgg5ACZkILk=" + [mod."github.com/sagikazarmark/locafero"] + version = "v0.4.0" + hash = "sha256-7I1Oatc7GAaHgAqBFO6Tv4IbzFiYeU9bJAfJhXuWaXk=" + [mod."github.com/sagikazarmark/slog-shim"] + version = "v0.1.0" + hash = "sha256-F92BQXXmn3mCwu3mBaGh+joTRItQDSDhsjU6SofkYdA=" [mod."github.com/sasha-s/go-deadlock"] version = "v0.3.1" hash = "sha256-2CBEi9/iN/OMt7wEIG+hRjgDH6CRWIgibGGGy1dQ78I=" @@ -551,24 +557,24 @@ schema = 3 [mod."github.com/sirupsen/logrus"] version = "v1.9.0" hash = "sha256-xOwGFsYGIxNiurS8Zue8mhlFK/G7U1LVFFrv4vcr1GM=" + [mod."github.com/sourcegraph/conc"] + version = "v0.3.0" + hash = "sha256-mIdMs9MLAOBKf3/0quf1iI3v8uNWydy7ae5MFa+F2Ko=" [mod."github.com/spf13/afero"] - version = "v1.9.5" - hash = "sha256-+XECQxkx0P+ZaQDm4dQ6ItMtHMj+2uNemEC18dsdor0=" + version = "v1.11.0" + hash = "sha256-+rV3cDZr13N8E0rJ7iHmwsKYKH+EhV+IXBut+JbBiIE=" [mod."github.com/spf13/cast"] version = "v1.6.0" hash = "sha256-hxioqRZfXE0AE5099wmn3YG0AZF8Wda2EB4c7zHF6zI=" [mod."github.com/spf13/cobra"] version = "v1.8.0" hash = "sha256-oAE+fEaRfZPE541IPWE0GMeBBYgH2DMhtZNxzp7DFlY=" - [mod."github.com/spf13/jwalterweatherman"] - version = "v1.1.0" - hash = "sha256-62BQtqTLF/eVrTOr7pUXE7AiHRjOVC8jQs3/Ehmflfs=" [mod."github.com/spf13/pflag"] version = "v1.0.5" hash = "sha256-w9LLYzxxP74WHT4ouBspH/iQZXjuAh2WQCHsuvyEjAw=" [mod."github.com/spf13/viper"] - version = "v1.16.0" - hash = "sha256-TgBr1SBMaus1oAlA5Kn+iNUJfQCMyo0hT/xFaA7hreQ=" + version = "v1.18.2" + hash = "sha256-MXYbK6w1LEaoZ2/L/STF3WU1tbK+7NwGVxUCLKPkwks=" [mod."github.com/status-im/keycard-go"] version = "v0.2.0" hash = "sha256-UUiGmlgaIZDeMUJv3fdZBoQ9hJeSsg2ixRGmm6TgHug=" @@ -579,8 +585,8 @@ schema = 3 version = "v1.9.0" hash = "sha256-uUp/On+1nK+lARkTVtb5RxlW15zxtw2kaAFuIASA+J0=" [mod."github.com/subosito/gotenv"] - version = "v1.4.2" - hash = "sha256-LnrDR1k/AoCFWBMcU7vQsoQLkZ65evT2hoQHLDudTsg=" + version = "v1.6.0" + hash = "sha256-LspbjTniiq2xAICSXmgqP7carwlNaLqnCTQfw2pa80A=" [mod."github.com/syndtr/goleveldb"] version = "v1.0.1-0.20210819022825-2ae1ddf74ef7" hash = "sha256-36a4hgVQfwtS2zhylKpQuFhrjdc/Y8pF0dxc26jcZIU=" @@ -660,12 +666,19 @@ schema = 3 [mod."go.opentelemetry.io/otel/trace"] version = "v1.24.0" hash = "sha256-FHP0hg+i7+wxCsM0u/5hQcgvvr3D+lq8o/7E/HkaW4s=" + [mod."go.uber.org/atomic"] + version = "v1.10.0" + hash = "sha256-E6UEDc1eh/cLUFd+J86cDesQ0B8wEv/DdaAVKb+x2t8=" + [mod."go.uber.org/multierr"] + version = "v1.9.0" + hash = "sha256-tlDRooh/V4HDhZohsUrxot/Y6uVInVBtRWCZbj/tPds=" [mod."golang.org/x/crypto"] version = "v0.24.0" hash = "sha256-wpxJApwSmmn9meVdpFdOU0gzeJbIXcKuFfYUUVogSss=" [mod."golang.org/x/exp"] version = "v0.0.0-20230711153332-06a737ee72cb" hash = "sha256-Cbw10ZJ+jATPV232G47xZrn6ExO1FDtiT6nlMRCH7EI=" + replaced = "golang.org/x/exp" [mod."golang.org/x/mod"] version = "v0.17.0" hash = "sha256-CLaPeF6uTFuRDv4oHwOQE6MCMvrzkUjWN3NuyywZjKU=" diff --git a/precompiles/common/Types.sol b/precompiles/common/Types.sol index 2d51744c6f..deeb78d03f 100644 --- a/precompiles/common/Types.sol +++ b/precompiles/common/Types.sol @@ -8,6 +8,7 @@ struct ICS20Allocation { string sourceChannel; Coin[] spendLimit; string[] allowList; + string[] allowedPacketData; } /// @dev Dec represents a fixed point decimal value. The value is stored as an integer, and the diff --git a/precompiles/common/types.go b/precompiles/common/types.go index 668c30a759..3a5a01cc4b 100644 --- a/precompiles/common/types.go +++ b/precompiles/common/types.go @@ -26,10 +26,11 @@ var ( // ICS20Allocation defines the spend limit for a particular port and channel. // We need this to be able to unpack to big.Int instead of math.Int. type ICS20Allocation struct { - SourcePort string - SourceChannel string - SpendLimit []Coin - AllowList []string + SourcePort string + SourceChannel string + SpendLimit []Coin + AllowList []string + AllowedPacketData []string } // Coin defines a struct that stores all needed information about a coin diff --git a/precompiles/ics20/abi.json b/precompiles/ics20/abi.json index 36cac8ce02..395fc28ed2 100644 --- a/precompiles/ics20/abi.json +++ b/precompiles/ics20/abi.json @@ -96,6 +96,11 @@ "internalType": "string[]", "name": "allowList", "type": "string[]" + }, + { + "internalType": "string[]", + "name": "allowedPacketData", + "type": "string[]" } ], "indexed": false, @@ -155,6 +160,11 @@ "internalType": "string[]", "name": "allowList", "type": "string[]" + }, + { + "internalType": "string[]", + "name": "allowedPacketData", + "type": "string[]" } ], "internalType": "struct ICS20Allocation[]", @@ -205,6 +215,11 @@ "internalType": "string[]", "name": "allowList", "type": "string[]" + }, + { + "internalType": "string[]", + "name": "allowedPacketData", + "type": "string[]" } ], "internalType": "struct ICS20Allocation[]", diff --git a/precompiles/ics20/approve_test.go b/precompiles/ics20/approve_test.go index 5a939bb8e9..ba261191df 100644 --- a/precompiles/ics20/approve_test.go +++ b/precompiles/ics20/approve_test.go @@ -73,7 +73,7 @@ var defaultAllowanceCases = []allowanceTestCase{ func() []interface{} { path := NewTransferPath(s.chainA, s.chainB) s.coordinator.Setup(path) - err := s.NewTransferAuthorization(s.ctx, s.app, s.address, s.address, path, maxUint256Coins, nil) + err := s.NewTransferAuthorization(s.ctx, s.app, s.address, s.address, path, maxUint256Coins, nil, nil) s.Require().NoError(err) return []interface{}{ s.address, @@ -94,7 +94,7 @@ var defaultAllowanceCases = []allowanceTestCase{ func() []interface{} { path := NewTransferPath(s.chainA, s.chainB) s.coordinator.Setup(path) - err := s.NewTransferAuthorization(s.ctx, s.app, s.address, s.address, path, maxUint256Coins, nil) + err := s.NewTransferAuthorization(s.ctx, s.app, s.address, s.address, path, maxUint256Coins, nil, nil) s.Require().NoError(err) return []interface{}{ s.address, @@ -276,7 +276,7 @@ func (s *PrecompileTestSuite) TestRevoke() { func() []interface{} { path := NewTransferPath(s.chainA, s.chainB) s.coordinator.Setup(path) - err := s.NewTransferAuthorization(s.ctx, s.app, differentAddress, s.address, path, defaultCoins, nil) + err := s.NewTransferAuthorization(s.ctx, s.app, differentAddress, s.address, path, defaultCoins, nil, nil) s.Require().NoError(err) authz, _ := s.app.AuthzKeeper.GetAuthorization(s.ctx, differentAddress.Bytes(), s.address.Bytes(), ics20.TransferMsgURL) s.Require().NotNil(authz) @@ -323,7 +323,7 @@ func (s *PrecompileTestSuite) TestIncreaseAllowance() { path := NewTransferPath(s.chainA, s.chainB) s.coordinator.Setup(path) overflowTestCoins := maxUint256Coins.Sub(sdk.NewInt64Coin(utils.BaseDenom, 1)) - err := s.NewTransferAuthorization(s.ctx, s.app, differentAddress, s.address, path, overflowTestCoins, nil) + err := s.NewTransferAuthorization(s.ctx, s.app, differentAddress, s.address, path, overflowTestCoins, nil, nil) s.Require().NoError(err) transferAuthz := s.GetTransferAuthorization(s.ctx, differentAddress, s.address) s.Require().Equal(transferAuthz.Allocations[0].SpendLimit, overflowTestCoins) @@ -345,7 +345,7 @@ func (s *PrecompileTestSuite) TestIncreaseAllowance() { func() []interface{} { path := NewTransferPath(s.chainA, s.chainB) s.coordinator.Setup(path) - err := s.NewTransferAuthorization(s.ctx, s.app, differentAddress, s.address, path, defaultCoins, nil) + err := s.NewTransferAuthorization(s.ctx, s.app, differentAddress, s.address, path, defaultCoins, nil, nil) s.Require().NoError(err) transferAuthz := s.GetTransferAuthorization(s.ctx, differentAddress, s.address) s.Require().Equal(transferAuthz.Allocations[0].SpendLimit, defaultCoins) @@ -371,7 +371,7 @@ func (s *PrecompileTestSuite) TestIncreaseAllowance() { func() []interface{} { path := NewTransferPath(s.chainA, s.chainB) s.coordinator.Setup(path) - err := s.NewTransferAuthorization(s.ctx, s.app, differentAddress, s.address, path, mutliSpendLimit, nil) + err := s.NewTransferAuthorization(s.ctx, s.app, differentAddress, s.address, path, mutliSpendLimit, nil, nil) s.Require().NoError(err) transferAuthz := s.GetTransferAuthorization(s.ctx, differentAddress, s.address) s.Require().Equal(transferAuthz.Allocations[0].SpendLimit, mutliSpendLimit) @@ -465,7 +465,7 @@ func (s *PrecompileTestSuite) TestDecreaseAllowance() { func() []interface{} { path := NewTransferPath(s.chainA, s.chainB) s.coordinator.Setup(path) - err := s.NewTransferAuthorization(s.ctx, s.app, differentAddress, s.address, path, defaultCoins, nil) + err := s.NewTransferAuthorization(s.ctx, s.app, differentAddress, s.address, path, defaultCoins, nil, nil) s.Require().NoError(err) transferAuthz := s.GetTransferAuthorization(s.ctx, differentAddress, s.address) s.Require().NotNil(transferAuthz) @@ -489,7 +489,7 @@ func (s *PrecompileTestSuite) TestDecreaseAllowance() { func() []interface{} { path := NewTransferPath(s.chainA, s.chainB) s.coordinator.Setup(path) - err := s.NewTransferAuthorization(s.ctx, s.app, differentAddress, s.address, path, defaultCoins, nil) + err := s.NewTransferAuthorization(s.ctx, s.app, differentAddress, s.address, path, defaultCoins, nil, nil) s.Require().NoError(err) transferAuthz := s.GetTransferAuthorization(s.ctx, differentAddress, s.address) s.Require().NotNil(transferAuthz) @@ -520,7 +520,7 @@ func (s *PrecompileTestSuite) TestDecreaseAllowance() { func() []interface{} { path := NewTransferPath(s.chainA, s.chainB) s.coordinator.Setup(path) - err := s.NewTransferAuthorization(s.ctx, s.app, differentAddress, s.address, path, mutliSpendLimit, nil) + err := s.NewTransferAuthorization(s.ctx, s.app, differentAddress, s.address, path, mutliSpendLimit, nil, nil) s.Require().NoError(err) transferAuthz := s.GetTransferAuthorization(s.ctx, differentAddress, s.address) s.Require().Equal(transferAuthz.Allocations[0].SpendLimit, mutliSpendLimit) diff --git a/precompiles/ics20/events_test.go b/precompiles/ics20/events_test.go index 46b8909241..269b82b9e4 100644 --- a/precompiles/ics20/events_test.go +++ b/precompiles/ics20/events_test.go @@ -27,7 +27,7 @@ func (s *PrecompileTestSuite) TestTransferEvent() { func(sender, receiver sdk.AccAddress) []interface{} { path := NewTransferPath(s.chainA, s.chainB) s.coordinator.Setup(path) - err := s.NewTransferAuthorization(s.ctx, s.app, common.BytesToAddress(sender), common.BytesToAddress(sender), path, defaultCoins, nil) + err := s.NewTransferAuthorization(s.ctx, s.app, common.BytesToAddress(sender), common.BytesToAddress(sender), path, defaultCoins, nil, []string{"memo"}) s.Require().NoError(err) return []interface{}{ path.EndpointA.ChannelConfig.PortID, @@ -165,7 +165,7 @@ func (s *PrecompileTestSuite) TestRevokeTransferAuthorizationEvent() { func() []interface{} { path := NewTransferPath(s.chainA, s.chainB) s.coordinator.Setup(path) - err := s.NewTransferAuthorization(s.ctx, s.app, s.address, s.address, path, defaultCoins, nil) + err := s.NewTransferAuthorization(s.ctx, s.app, s.address, s.address, path, defaultCoins, nil, nil) s.Require().NoError(err) return []interface{}{ s.address, @@ -222,7 +222,7 @@ func (s *PrecompileTestSuite) TestIncreaseAllowanceEvent() { func() []interface{} { path := NewTransferPath(s.chainA, s.chainB) s.coordinator.Setup(path) - err := s.NewTransferAuthorization(s.ctx, s.app, s.address, s.address, path, defaultCoins, nil) + err := s.NewTransferAuthorization(s.ctx, s.app, s.address, s.address, path, defaultCoins, nil, nil) s.Require().NoError(err) return []interface{}{ s.address, @@ -273,7 +273,7 @@ func (s *PrecompileTestSuite) TestDecreaseAllowanceEvent() { func() []interface{} { path := NewTransferPath(s.chainA, s.chainB) s.coordinator.Setup(path) - err := s.NewTransferAuthorization(s.ctx, s.app, s.address, s.address, path, defaultCoins, nil) + err := s.NewTransferAuthorization(s.ctx, s.app, s.address, s.address, path, defaultCoins, nil, nil) s.Require().NoError(err) return []interface{}{ s.address, diff --git a/precompiles/ics20/integration_test.go b/precompiles/ics20/integration_test.go index 97211f2ccb..8dfcb74507 100644 --- a/precompiles/ics20/integration_test.go +++ b/precompiles/ics20/integration_test.go @@ -67,7 +67,6 @@ var _ = Describe("IBCTransfer Precompile", func() { s.setupAllocationsForTesting() var err error - interchainSenderContract, err = contracts.LoadInterchainSenderContract() Expect(err).To(BeNil(), "error while loading the interchain sender contract: %v", err) // set the default call arguments @@ -94,9 +93,10 @@ var _ = Describe("IBCTransfer Precompile", func() { Expect(auths).To(HaveLen(0), "expected no authorizations before tests") defaultSingleAlloc = []cmn.ICS20Allocation{ { - SourcePort: ibctesting.TransferPort, - SourceChannel: s.transferPath.EndpointA.ChannelID, - SpendLimit: defaultCmnCoins, + SourcePort: ibctesting.TransferPort, + SourceChannel: s.transferPath.EndpointA.ChannelID, + SpendLimit: defaultCmnCoins, + AllowedPacketData: []string{"memo"}, }, } }) @@ -1042,6 +1042,8 @@ var _ = Describe("IBCTransfer Precompile", func() { Expect(out[0].SourceChannel).To(Equal(defaultSingleAlloc[0].SourceChannel)) Expect(out[0].SpendLimit).To(Equal(defaultSingleAlloc[0].SpendLimit)) Expect(out[0].AllowList).To(HaveLen(0)) + Expect(out[0].AllowedPacketData).To(HaveLen(1)) + Expect(out[0].AllowedPacketData[0]).To(Equal("memo")) }) }) }) @@ -1331,10 +1333,11 @@ var _ = Describe("Calling ICS20 precompile from another contract", func() { // create grant to allow spending the ibc coins args := defaultApproveArgs.WithArgs([]cmn.ICS20Allocation{ { - SourcePort: ibctesting.TransferPort, - SourceChannel: s.transferPath.EndpointA.ChannelID, - SpendLimit: []cmn.Coin{{Denom: ibcDenom, Amount: amt.BigInt()}}, - AllowList: []string{}, + SourcePort: ibctesting.TransferPort, + SourceChannel: s.transferPath.EndpointA.ChannelID, + SpendLimit: []cmn.Coin{{Denom: ibcDenom, Amount: amt.BigInt()}}, + AllowList: []string{}, + AllowedPacketData: []string{"memo"}, }, }) s.setTransferApprovalForContract(args) @@ -1458,10 +1461,11 @@ var _ = Describe("Calling ICS20 precompile from another contract", func() { // create grant to allow spending the erc20 tokens args := defaultApproveArgs.WithArgs([]cmn.ICS20Allocation{ { - SourcePort: ibctesting.TransferPort, - SourceChannel: s.transferPath.EndpointA.ChannelID, - SpendLimit: []cmn.Coin{{Denom: denom, Amount: sentAmount}}, - AllowList: []string{}, + SourcePort: ibctesting.TransferPort, + SourceChannel: s.transferPath.EndpointA.ChannelID, + SpendLimit: []cmn.Coin{{Denom: denom, Amount: sentAmount}}, + AllowList: []string{}, + AllowedPacketData: []string{"memo"}, }, }) s.setTransferApprovalForContract(args) @@ -1611,6 +1615,8 @@ var _ = Describe("Calling ICS20 precompile from another contract", func() { Expect(out[0].SourceChannel).To(Equal(defaultSingleAlloc[0].SourceChannel)) Expect(out[0].SpendLimit).To(Equal(defaultSingleAlloc[0].SpendLimit)) Expect(out[0].AllowList).To(HaveLen(0)) + Expect(out[0].AllowedPacketData).To(HaveLen(1)) + Expect(out[0].AllowedPacketData[0]).To(Equal("memo")) }) }) }) diff --git a/precompiles/ics20/query.go b/precompiles/ics20/query.go index 6122dec7f6..d119d92bd8 100644 --- a/precompiles/ics20/query.go +++ b/precompiles/ics20/query.go @@ -136,10 +136,11 @@ func (p Precompile) Allowance( } allocs[i] = cmn.ICS20Allocation{ - SourcePort: a.SourcePort, - SourceChannel: a.SourceChannel, - SpendLimit: spendLimit, - AllowList: a.AllowList, + SourcePort: a.SourcePort, + SourceChannel: a.SourceChannel, + SpendLimit: spendLimit, + AllowList: a.AllowList, + AllowedPacketData: a.AllowedPacketData, } } diff --git a/precompiles/ics20/query_test.go b/precompiles/ics20/query_test.go index d06ae99144..4df1aff901 100644 --- a/precompiles/ics20/query_test.go +++ b/precompiles/ics20/query_test.go @@ -296,6 +296,7 @@ func (s *PrecompileTestSuite) TestAllowance() { path, defaultCoins, []string{s.chainB.SenderAccount.GetAddress().String()}, + []string{"memo"}, ) s.Require().NoError(err) @@ -307,10 +308,11 @@ func (s *PrecompileTestSuite) TestAllowance() { func(bz []byte) { expAllocs := []cmn.ICS20Allocation{ { - SourcePort: path.EndpointA.ChannelConfig.PortID, - SourceChannel: path.EndpointA.ChannelID, - SpendLimit: defaultCmnCoins, - AllowList: []string{s.chainB.SenderAccount.GetAddress().String()}, + SourcePort: path.EndpointA.ChannelConfig.PortID, + SourceChannel: path.EndpointA.ChannelID, + SpendLimit: defaultCmnCoins, + AllowList: []string{s.chainB.SenderAccount.GetAddress().String()}, + AllowedPacketData: []string{"memo"}, }, } @@ -330,10 +332,11 @@ func (s *PrecompileTestSuite) TestAllowance() { allocs := make([]types.Allocation, len(paths)) for i, p := range paths { allocs[i] = types.Allocation{ - SourcePort: p.EndpointA.ChannelConfig.PortID, - SourceChannel: p.EndpointA.ChannelID, - SpendLimit: mutliSpendLimit, - AllowList: []string{s.chainB.SenderAccount.GetAddress().String()}, + SourcePort: p.EndpointA.ChannelConfig.PortID, + SourceChannel: p.EndpointA.ChannelID, + SpendLimit: mutliSpendLimit, + AllowList: []string{s.chainB.SenderAccount.GetAddress().String()}, + AllowedPacketData: []string{"memo"}, } } @@ -355,10 +358,11 @@ func (s *PrecompileTestSuite) TestAllowance() { expAllocs := make([]cmn.ICS20Allocation, len(paths)) for i, p := range paths { expAllocs[i] = cmn.ICS20Allocation{ - SourcePort: p.EndpointA.ChannelConfig.PortID, - SourceChannel: p.EndpointA.ChannelID, - SpendLimit: mutliCmnCoins, - AllowList: []string{s.chainB.SenderAccount.GetAddress().String()}, + SourcePort: p.EndpointA.ChannelConfig.PortID, + SourceChannel: p.EndpointA.ChannelID, + SpendLimit: mutliCmnCoins, + AllowList: []string{s.chainB.SenderAccount.GetAddress().String()}, + AllowedPacketData: []string{"memo"}, } } diff --git a/precompiles/ics20/tx_test.go b/precompiles/ics20/tx_test.go index d04f7c0dbd..f5915669a8 100644 --- a/precompiles/ics20/tx_test.go +++ b/precompiles/ics20/tx_test.go @@ -93,7 +93,7 @@ func (s *PrecompileTestSuite) TestTransfer() { func(sender, _ sdk.AccAddress) []interface{} { path := NewTransferPath(s.chainA, s.chainB) s.coordinator.Setup(path) - err := s.NewTransferAuthorization(s.ctx, s.app, callingContractAddr, common.BytesToAddress(sender), path, defaultCoins, nil) + err := s.NewTransferAuthorization(s.ctx, s.app, callingContractAddr, common.BytesToAddress(sender), path, defaultCoins, nil, []string{"memo"}) s.Require().NoError(err) return []interface{}{ path.EndpointA.ChannelConfig.PortID, @@ -118,7 +118,7 @@ func (s *PrecompileTestSuite) TestTransfer() { func(sender, _ sdk.AccAddress) []interface{} { path := NewTransferPath(s.chainA, s.chainB) s.coordinator.Setup(path) - err := s.NewTransferAuthorization(s.ctx, s.app, callingContractAddr, common.BytesToAddress(sender), path, defaultCoins, nil) + err := s.NewTransferAuthorization(s.ctx, s.app, callingContractAddr, common.BytesToAddress(sender), path, defaultCoins, nil, []string{"memo"}) s.Require().NoError(err) return []interface{}{ path.EndpointA.ChannelConfig.PortID, @@ -143,7 +143,7 @@ func (s *PrecompileTestSuite) TestTransfer() { func(sender, receiver sdk.AccAddress) []interface{} { path := NewTransferPath(s.chainA, s.chainB) s.coordinator.Setup(path) - err := s.NewTransferAuthorization(s.ctx, s.app, common.BytesToAddress(sender), common.BytesToAddress(sender), path, defaultCoins, nil) + err := s.NewTransferAuthorization(s.ctx, s.app, common.BytesToAddress(sender), common.BytesToAddress(sender), path, defaultCoins, nil, []string{"memo"}) s.Require().NoError(err) // fund another user's account err = evmosutil.FundAccountWithBaseDenom(s.ctx, s.app.BankKeeper, differentAddress.Bytes(), amt) @@ -176,12 +176,41 @@ func (s *PrecompileTestSuite) TestTransfer() { true, "does not exist", }, + { + "fail - transfer with memo string, but authorization does not allows it", + func(sender, receiver sdk.AccAddress) []interface{} { + path := NewTransferPath(s.chainA, s.chainB) + s.coordinator.Setup(path) + err := s.NewTransferAuthorization(s.ctx, s.app, callingContractAddr, common.BytesToAddress(sender), path, defaultCoins, nil, nil) + s.Require().NoError(err) + return []interface{}{ + path.EndpointA.ChannelConfig.PortID, + path.EndpointA.ChannelID, + utils.BaseDenom, + big.NewInt(1e18), + common.BytesToAddress(sender.Bytes()), + receiver.String(), + s.chainB.GetTimeoutHeight(), + uint64(0), + "memo", + } + }, + func(sender, _ sdk.AccAddress, _ []byte, _ []interface{}) { + // Check allowance remains unchanged + authz, _ := s.app.AuthzKeeper.GetAuthorization(s.ctx, callingContractAddr.Bytes(), sender, ics20.TransferMsgURL) + transferAuthz := authz.(*transfertypes.TransferAuthorization) + s.Require().Equal(transferAuthz.Allocations[0].SpendLimit, defaultCoins) + }, + 200000, + true, + "memo must be empty because allowed packet data in allocation is empty", + }, { "pass - transfer 1 Evmos from chainA to chainB and spend the entire allowance", func(sender, receiver sdk.AccAddress) []interface{} { path := NewTransferPath(s.chainA, s.chainB) s.coordinator.Setup(path) - err := s.NewTransferAuthorization(s.ctx, s.app, callingContractAddr, common.BytesToAddress(sender), path, defaultCoins, nil) + err := s.NewTransferAuthorization(s.ctx, s.app, callingContractAddr, common.BytesToAddress(sender), path, defaultCoins, nil, []string{"memo"}) s.Require().NoError(err) return []interface{}{ path.EndpointA.ChannelConfig.PortID, @@ -214,7 +243,7 @@ func (s *PrecompileTestSuite) TestTransfer() { func(sender, receiver sdk.AccAddress) []interface{} { path := NewTransferPath(s.chainA, s.chainB) s.coordinator.Setup(path) - err := s.NewTransferAuthorization(s.ctx, s.app, callingContractAddr, common.BytesToAddress(sender), path, maxUint256Coins, nil) + err := s.NewTransferAuthorization(s.ctx, s.app, callingContractAddr, common.BytesToAddress(sender), path, maxUint256Coins, nil, []string{"memo"}) s.Require().NoError(err) return []interface{}{ path.EndpointA.ChannelConfig.PortID, @@ -248,7 +277,7 @@ func (s *PrecompileTestSuite) TestTransfer() { func(sender, receiver sdk.AccAddress) []interface{} { path := NewTransferPath(s.chainA, s.chainB) s.coordinator.Setup(path) - err := s.NewTransferAuthorization(s.ctx, s.app, callingContractAddr, common.BytesToAddress(sender), path, mutliSpendLimit, nil) + err := s.NewTransferAuthorization(s.ctx, s.app, callingContractAddr, common.BytesToAddress(sender), path, mutliSpendLimit, nil, []string{"memo"}) s.Require().NoError(err) return []interface{}{ path.EndpointA.ChannelConfig.PortID, @@ -283,16 +312,19 @@ func (s *PrecompileTestSuite) TestTransfer() { s.coordinator.Setup(path) allocations := []transfertypes.Allocation{ { - SourcePort: "port-01", - SourceChannel: "channel-03", - SpendLimit: atomCoins, - AllowList: nil, + SourcePort: "port-01", + SourceChannel: "channel-03", + SpendLimit: atomCoins, + AllowList: nil, + AllowedPacketData: []string{"*"}, // allow any memo string + }, { - SourcePort: path.EndpointA.ChannelConfig.PortID, - SourceChannel: path.EndpointA.ChannelID, - SpendLimit: defaultCoins, - AllowList: nil, + SourcePort: path.EndpointA.ChannelConfig.PortID, + SourceChannel: path.EndpointA.ChannelID, + SpendLimit: defaultCoins, + AllowList: nil, + AllowedPacketData: []string{"*"}, // allow any memo string }, } err := s.NewTransferAuthorizationWithAllocations(s.ctx, s.app, callingContractAddr, common.BytesToAddress(sender), allocations) diff --git a/precompiles/ics20/types.go b/precompiles/ics20/types.go index 03c0e313e9..e8b1331f93 100644 --- a/precompiles/ics20/types.go +++ b/precompiles/ics20/types.go @@ -321,9 +321,11 @@ func checkTransferAuthzArgs(method *abi.Method, args []interface{}) (common.Addr } allocations[i] = transfertypes.Allocation{ - SourcePort: a.SourcePort, - SourceChannel: a.SourceChannel, - SpendLimit: spendLimit, + SourcePort: a.SourcePort, + SourceChannel: a.SourceChannel, + SpendLimit: spendLimit, + AllowList: a.AllowList, + AllowedPacketData: a.AllowedPacketData, } } @@ -365,10 +367,11 @@ func convertToAllocation(allocs []transfertypes.Allocation) []cmn.ICS20Allocatio } allocations[i] = cmn.ICS20Allocation{ - SourcePort: allocation.SourcePort, - SourceChannel: allocation.SourceChannel, - SpendLimit: spendLimit, - AllowList: allocation.AllowList, + SourcePort: allocation.SourcePort, + SourceChannel: allocation.SourceChannel, + SpendLimit: spendLimit, + AllowList: allocation.AllowList, + AllowedPacketData: allocation.AllowedPacketData, } } diff --git a/precompiles/ics20/utils_test.go b/precompiles/ics20/utils_test.go index bbac64d951..c46c852362 100644 --- a/precompiles/ics20/utils_test.go +++ b/precompiles/ics20/utils_test.go @@ -327,13 +327,14 @@ func (s *PrecompileTestSuite) NewTransferAuthorizationWithAllocations(ctx sdk.Co } // NewTransferAuthorization creates a new transfer authorization for the given grantee and granter and the given coins -func (s *PrecompileTestSuite) NewTransferAuthorization(ctx sdk.Context, app *evmosapp.Evmos, grantee, granter common.Address, path *ibctesting.Path, coins sdk.Coins, allowList []string) error { +func (s *PrecompileTestSuite) NewTransferAuthorization(ctx sdk.Context, app *evmosapp.Evmos, grantee, granter common.Address, path *ibctesting.Path, coins sdk.Coins, allowList []string, allowedPacketData []string) error { allocations := []transfertypes.Allocation{ { - SourcePort: path.EndpointA.ChannelConfig.PortID, - SourceChannel: path.EndpointA.ChannelID, - SpendLimit: coins, - AllowList: allowList, + SourcePort: path.EndpointA.ChannelConfig.PortID, + SourceChannel: path.EndpointA.ChannelID, + SpendLimit: coins, + AllowList: allowList, + AllowedPacketData: allowedPacketData, }, } @@ -494,9 +495,10 @@ func (s *PrecompileTestSuite) setTransferApprovalForContract(args contracts.Call func (s *PrecompileTestSuite) setupAllocationsForTesting() { defaultSingleAlloc = []cmn.ICS20Allocation{ { - SourcePort: ibctesting.TransferPort, - SourceChannel: s.transferPath.EndpointA.ChannelID, - SpendLimit: defaultCmnCoins, + SourcePort: ibctesting.TransferPort, + SourceChannel: s.transferPath.EndpointA.ChannelID, + SpendLimit: defaultCmnCoins, + AllowedPacketData: []string{"memo"}, }, } } diff --git a/precompiles/testutil/contracts/InterchainSender.json b/precompiles/testutil/contracts/InterchainSender.json index dd9aee7ed3..d9997ee30e 100644 --- a/precompiles/testutil/contracts/InterchainSender.json +++ b/precompiles/testutil/contracts/InterchainSender.json @@ -51,6 +51,11 @@ "internalType": "string[]", "name": "allowList", "type": "string[]" + }, + { + "internalType": "string[]", + "name": "allowedPacketData", + "type": "string[]" } ], "internalType": "struct ICS20Allocation[]", @@ -96,6 +101,11 @@ "internalType": "string[]", "name": "allowList", "type": "string[]" + }, + { + "internalType": "string[]", + "name": "allowedPacketData", + "type": "string[]" } ], "internalType": "struct ICS20Allocation[]", @@ -429,8 +439,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b5061294e806100206000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063a363df8411610066578063a363df8414610145578063c595699a14610175578063dfa10f39146101a5578063ee5766d9146101d6578063f298e7a8146102065761009e565b8063424af9f6146100a357806367b10abe146100bf5780636fdf23cc146100db5780637492bdd81461010b5780637a6185e11461013b575b600080fd5b6100bd60048036038101906100b891906109ca565b610222565b005b6100d960048036038101906100d49190610ae9565b6102fc565b005b6100f560048036038101906100f09190610d11565b6103c7565b6040516101029190610e63565b60405180910390f35b61012560048036038101906101209190610d11565b610465565b6040516101329190610e63565b60405180910390f35b610143610503565b005b61015f600480360381019061015a9190610edc565b6105c8565b60405161016c91906112a5565b60405180910390f35b61018f600480360381019061018a91906112c7565b610655565b60405161019c919061135a565b60405180910390f35b6101bf60048036038101906101ba91906113a0565b6106df565b6040516101cd929190611590565b60405180910390f35b6101f060048036038101906101eb91906112c7565b610773565b6040516101fd919061160b565b60405180910390f35b610220600480360381019061021b91906109ca565b610803565b005b600061080273ffffffffffffffffffffffffffffffffffffffff166354de647b308a8a8a8a8a8a8a6040518963ffffffff1660e01b815260040161026d989796959493929190611678565b6020604051808303816000875af115801561028c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102b0919061171e565b9050806102f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102e990611797565b60405180910390fd5b5050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663e3fee9273085856040518463ffffffff1660e01b815260040161033d93929190611c53565b6020604051808303816000875af115801561035c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610380919061171e565b9050806103c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103b990611cd1565b60405180910390fd5b505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663632535b98a8a8a8a308b8b8b8b6040518a63ffffffff1660e01b815260040161041499989796959493929190611d20565b6020604051808303816000875af1158015610433573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104579190611de6565b905098975050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663632535b98a8a8a8a338b8b8b8b6040518a63ffffffff1660e01b81526004016104b299989796959493929190611d20565b6020604051808303816000875af11580156104d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f59190611de6565b905098975050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff166374a8f103306040518263ffffffff1660e01b81526004016105409190611e13565b6020604051808303816000875af115801561055f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610583919061171e565b9050806105c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc90611e7a565b60405180910390fd5b50565b606061080273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84846040518363ffffffff1660e01b8152600401610607929190611e9a565b600060405180830381865afa158015610624573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061064d919061233f565b905092915050565b606061080273ffffffffffffffffffffffffffffffffffffffff1663b5cb6e7d836040518263ffffffff1660e01b8152600401610692919061135a565b600060405180830381865afa1580156106af573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906106d89190612388565b9050919050565b60606106e96108dd565b61080273ffffffffffffffffffffffffffffffffffffffff166322b6fad6846040518263ffffffff1660e01b81526004016107249190612553565b600060405180830381865afa158015610741573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061076a91906127eb565b91509150915091565b61077b610901565b61080273ffffffffffffffffffffffffffffffffffffffff1663a815cdd9836040518263ffffffff1660e01b81526004016107b6919061135a565b600060405180830381865afa1580156107d3573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906107fc9190612863565b9050919050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663b3f536ec308a8a8a8a8a8a8a6040518963ffffffff1660e01b815260040161084e989796959493929190611678565b6020604051808303816000875af115801561086d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610891919061171e565b9050806108d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca906128f8565b60405180910390fd5b5050505050505050565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b604051806040016040528060608152602001606081525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126109545761095361092f565b5b8235905067ffffffffffffffff81111561097157610970610934565b5b60208301915083600182028301111561098d5761098c610939565b5b9250929050565b6000819050919050565b6109a781610994565b81146109b257600080fd5b50565b6000813590506109c48161099e565b92915050565b60008060008060008060006080888a0312156109e9576109e8610925565b5b600088013567ffffffffffffffff811115610a0757610a0661092a565b5b610a138a828b0161093e565b9750975050602088013567ffffffffffffffff811115610a3657610a3561092a565b5b610a428a828b0161093e565b9550955050604088013567ffffffffffffffff811115610a6557610a6461092a565b5b610a718a828b0161093e565b93509350506060610a848a828b016109b5565b91505092959891949750929550565b60008083601f840112610aa957610aa861092f565b5b8235905067ffffffffffffffff811115610ac657610ac5610934565b5b602083019150836020820283011115610ae257610ae1610939565b5b9250929050565b60008060208385031215610b0057610aff610925565b5b600083013567ffffffffffffffff811115610b1e57610b1d61092a565b5b610b2a85828601610a93565b92509250509250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610b8482610b3b565b810181811067ffffffffffffffff82111715610ba357610ba2610b4c565b5b80604052505050565b6000610bb661091b565b9050610bc28282610b7b565b919050565b600067ffffffffffffffff821115610be257610be1610b4c565b5b610beb82610b3b565b9050602081019050919050565b82818337600083830152505050565b6000610c1a610c1584610bc7565b610bac565b905082815260208101848484011115610c3657610c35610b36565b5b610c41848285610bf8565b509392505050565b600082601f830112610c5e57610c5d61092f565b5b8135610c6e848260208601610c07565b91505092915050565b600080fd5b600080fd5b600067ffffffffffffffff82169050919050565b610c9e81610c81565b8114610ca957600080fd5b50565b600081359050610cbb81610c95565b92915050565b600060408284031215610cd757610cd6610c77565b5b610ce16040610bac565b90506000610cf184828501610cac565b6000830152506020610d0584828501610cac565b60208301525092915050565b600080600080600080600080610120898b031215610d3257610d31610925565b5b600089013567ffffffffffffffff811115610d5057610d4f61092a565b5b610d5c8b828c01610c49565b985050602089013567ffffffffffffffff811115610d7d57610d7c61092a565b5b610d898b828c01610c49565b975050604089013567ffffffffffffffff811115610daa57610da961092a565b5b610db68b828c01610c49565b9650506060610dc78b828c016109b5565b955050608089013567ffffffffffffffff811115610de857610de761092a565b5b610df48b828c01610c49565b94505060a0610e058b828c01610cc1565b93505060e0610e168b828c01610cac565b92505061010089013567ffffffffffffffff811115610e3857610e3761092a565b5b610e448b828c01610c49565b9150509295985092959890939650565b610e5d81610c81565b82525050565b6000602082019050610e786000830184610e54565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610ea982610e7e565b9050919050565b610eb981610e9e565b8114610ec457600080fd5b50565b600081359050610ed681610eb0565b92915050565b60008060408385031215610ef357610ef2610925565b5b6000610f0185828601610ec7565b9250506020610f1285828601610ec7565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610f82578082015181840152602081019050610f67565b60008484015250505050565b6000610f9982610f48565b610fa38185610f53565b9350610fb3818560208601610f64565b610fbc81610b3b565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b610ffc81610994565b82525050565b6000604083016000830151848203600086015261101f8282610f8e565b91505060208301516110346020860182610ff3565b508091505092915050565b600061104b8383611002565b905092915050565b6000602082019050919050565b600061106b82610fc7565b6110758185610fd2565b93508360208202850161108785610fe3565b8060005b858110156110c357848403895281516110a4858261103f565b94506110af83611053565b925060208a0199505060018101905061108b565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061110d8383610f8e565b905092915050565b6000602082019050919050565b600061112d826110d5565b61113781856110e0565b935083602082028501611149856110f1565b8060005b8581101561118557848403895281516111668582611101565b945061117183611115565b925060208a0199505060018101905061114d565b50829750879550505050505092915050565b600060808301600083015184820360008601526111b48282610f8e565b915050602083015184820360208601526111ce8282610f8e565b915050604083015184820360408601526111e88282611060565b915050606083015184820360608601526112028282611122565b9150508091505092915050565b600061121b8383611197565b905092915050565b6000602082019050919050565b600061123b82610f1c565b6112458185610f27565b93508360208202850161125785610f38565b8060005b858110156112935784840389528151611274858261120f565b945061127f83611223565b925060208a0199505060018101905061125b565b50829750879550505050505092915050565b600060208201905081810360008301526112bf8184611230565b905092915050565b6000602082840312156112dd576112dc610925565b5b600082013567ffffffffffffffff8111156112fb576112fa61092a565b5b61130784828501610c49565b91505092915050565b600082825260208201905092915050565b600061132c82610f48565b6113368185611310565b9350611346818560208601610f64565b61134f81610b3b565b840191505092915050565b600060208201905081810360008301526113748184611321565b905092915050565b600080fd5b600060a082840312156113975761139661137c565b5b81905092915050565b6000602082840312156113b6576113b5610925565b5b600082013567ffffffffffffffff8111156113d4576113d361092a565b5b6113e084828501611381565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060408301600083015184820360008601526114328282610f8e565b9150506020830151848203602086015261144c8282610f8e565b9150508091505092915050565b60006114658383611415565b905092915050565b6000602082019050919050565b6000611485826113e9565b61148f81856113f4565b9350836020820285016114a185611405565b8060005b858110156114dd57848403895281516114be8582611459565b94506114c98361146d565b925060208a019950506001810190506114a5565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b6000611516826114ef565b61152081856114fa565b9350611530818560208601610f64565b61153981610b3b565b840191505092915050565b61154d81610c81565b82525050565b60006040830160008301518482036000860152611570828261150b565b91505060208301516115856020860182611544565b508091505092915050565b600060408201905081810360008301526115aa818561147a565b905081810360208301526115be8184611553565b90509392505050565b600060408301600083015184820360008601526115e48282610f8e565b915050602083015184820360208601526115fe8282610f8e565b9150508091505092915050565b6000602082019050818103600083015261162581846115c7565b905092915050565b61163681610e9e565b82525050565b60006116488385611310565b9350611655838584610bf8565b61165e83610b3b565b840190509392505050565b61167281610994565b82525050565b600060a08201905061168d600083018b61162d565b81810360208301526116a081898b61163c565b905081810360408301526116b581878961163c565b905081810360608301526116ca81858761163c565b90506116d96080830184611669565b9998505050505050505050565b60008115159050919050565b6116fb816116e6565b811461170657600080fd5b50565b600081519050611718816116f2565b92915050565b60006020828403121561173457611733610925565b5b600061174284828501611709565b91505092915050565b7f4661696c656420746f20696e63726561736520616c6c6f77616e636500000000600082015250565b6000611781601c83611310565b915061178c8261174b565b602082019050919050565b600060208201905081810360008301526117b081611774565b9050919050565b6000819050919050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126117ed576117ec6117cb565b5b83810192508235915060208301925067ffffffffffffffff821115611815576118146117c1565b5b60018202360383131561182b5761182a6117c6565b5b509250929050565b600061183f8385610f53565b935061184c838584610bf8565b61185583610b3b565b840190509392505050565b6000808335600160200384360303811261187d5761187c6117cb565b5b83810192508235915060208301925067ffffffffffffffff8211156118a5576118a46117c1565b5b6020820236038313156118bb576118ba6117c6565b5b509250929050565b6000819050919050565b60006118dc60208401846109b5565b905092915050565b6000604083016118f760008401846117d0565b858303600087015261190a838284611833565b9250505061191b60208401846118cd565b6119286020860182610ff3565b508091505092915050565b600061193f83836118e4565b905092915050565b600082356001604003833603038112611963576119626117cb565b5b82810191505092915050565b6000602082019050919050565b60006119888385610fd2565b93508360208402850161199a846118c3565b8060005b878110156119de5784840389526119b58284611947565b6119bf8582611933565b94506119ca8361196f565b925060208a0199505060018101905061199e565b50829750879450505050509392505050565b60008083356001602003843603038112611a0d57611a0c6117cb565b5b83810192508235915060208301925067ffffffffffffffff821115611a3557611a346117c1565b5b602082023603831315611a4b57611a4a6117c6565b5b509250929050565b6000819050919050565b6000611a6a848484611833565b90509392505050565b6000602082019050919050565b6000611a8c83856110e0565b935083602084028501611a9e84611a53565b8060005b87811015611ae4578484038952611ab982846117d0565b611ac4868284611a5d565b9550611acf84611a73565b935060208b019a505050600181019050611aa2565b50829750879450505050509392505050565b600060808301611b0960008401846117d0565b8583036000870152611b1c838284611833565b92505050611b2d60208401846117d0565b8583036020870152611b40838284611833565b92505050611b516040840184611860565b8583036040870152611b6483828461197c565b92505050611b7560608401846119f0565b8583036060870152611b88838284611a80565b925050508091505092915050565b6000611ba28383611af6565b905092915050565b600082356001608003833603038112611bc657611bc56117cb565b5b82810191505092915050565b6000602082019050919050565b6000611beb8385610f27565b935083602084028501611bfd846117b7565b8060005b87811015611c41578484038952611c188284611baa565b611c228582611b96565b9450611c2d83611bd2565b925060208a01995050600181019050611c01565b50829750879450505050509392505050565b6000604082019050611c68600083018661162d565b8181036020830152611c7b818486611bdf565b9050949350505050565b7f4661696c656420746f20706572666f726d20617070726f76616c000000000000600082015250565b6000611cbb601a83611310565b9150611cc682611c85565b602082019050919050565b60006020820190508181036000830152611cea81611cae565b9050919050565b604082016000820151611d076000850182611544565b506020820151611d1a6020850182611544565b50505050565b6000610140820190508181036000830152611d3b818c611321565b90508181036020830152611d4f818b611321565b90508181036040830152611d63818a611321565b9050611d726060830189611669565b611d7f608083018861162d565b81810360a0830152611d918187611321565b9050611da060c0830186611cf1565b611dae610100830185610e54565b818103610120830152611dc18184611321565b90509a9950505050505050505050565b600081519050611de081610c95565b92915050565b600060208284031215611dfc57611dfb610925565b5b6000611e0a84828501611dd1565b91505092915050565b6000602082019050611e28600083018461162d565b92915050565b7f4661696c656420746f207265766f6b6520617070726f76616c00000000000000600082015250565b6000611e64601983611310565b9150611e6f82611e2e565b602082019050919050565b60006020820190508181036000830152611e9381611e57565b9050919050565b6000604082019050611eaf600083018561162d565b611ebc602083018461162d565b9392505050565b600067ffffffffffffffff821115611ede57611edd610b4c565b5b602082029050602081019050919050565b6000611f02611efd84610bc7565b610bac565b905082815260208101848484011115611f1e57611f1d610b36565b5b611f29848285610f64565b509392505050565b600082601f830112611f4657611f4561092f565b5b8151611f56848260208601611eef565b91505092915050565b600067ffffffffffffffff821115611f7a57611f79610b4c565b5b602082029050602081019050919050565b600081519050611f9a8161099e565b92915050565b600060408284031215611fb657611fb5610c77565b5b611fc06040610bac565b9050600082015167ffffffffffffffff811115611fe057611fdf610c7c565b5b611fec84828501611f31565b600083015250602061200084828501611f8b565b60208301525092915050565b600061201f61201a84611f5f565b610bac565b9050808382526020820190506020840283018581111561204257612041610939565b5b835b8181101561208957805167ffffffffffffffff8111156120675761206661092f565b5b8086016120748982611fa0565b85526020850194505050602081019050612044565b5050509392505050565b600082601f8301126120a8576120a761092f565b5b81516120b884826020860161200c565b91505092915050565b600067ffffffffffffffff8211156120dc576120db610b4c565b5b602082029050602081019050919050565b60006121006120fb846120c1565b610bac565b9050808382526020820190506020840283018581111561212357612122610939565b5b835b8181101561216a57805167ffffffffffffffff8111156121485761214761092f565b5b8086016121558982611f31565b85526020850194505050602081019050612125565b5050509392505050565b600082601f8301126121895761218861092f565b5b81516121998482602086016120ed565b91505092915050565b6000608082840312156121b8576121b7610c77565b5b6121c26080610bac565b9050600082015167ffffffffffffffff8111156121e2576121e1610c7c565b5b6121ee84828501611f31565b600083015250602082015167ffffffffffffffff81111561221257612211610c7c565b5b61221e84828501611f31565b602083015250604082015167ffffffffffffffff81111561224257612241610c7c565b5b61224e84828501612093565b604083015250606082015167ffffffffffffffff81111561227257612271610c7c565b5b61227e84828501612174565b60608301525092915050565b600061229d61229884611ec3565b610bac565b905080838252602082019050602084028301858111156122c0576122bf610939565b5b835b8181101561230757805167ffffffffffffffff8111156122e5576122e461092f565b5b8086016122f289826121a2565b855260208501945050506020810190506122c2565b5050509392505050565b600082601f8301126123265761232561092f565b5b815161233684826020860161228a565b91505092915050565b60006020828403121561235557612354610925565b5b600082015167ffffffffffffffff8111156123735761237261092a565b5b61237f84828501612311565b91505092915050565b60006020828403121561239e5761239d610925565b5b600082015167ffffffffffffffff8111156123bc576123bb61092a565b5b6123c884828501611f31565b91505092915050565b600080833560016020038436030381126123ee576123ed6117cb565b5b83810192508235915060208301925067ffffffffffffffff821115612416576124156117c1565b5b60018202360383131561242c5761242b6117c6565b5b509250929050565b600061244083856114fa565b935061244d838584610bf8565b61245683610b3b565b840190509392505050565b60006124706020840184610cac565b905092915050565b600081359050612487816116f2565b92915050565b600061249c6020840184612478565b905092915050565b6124ad816116e6565b82525050565b600060a083016124c660008401846123d1565b85830360008701526124d9838284612434565b925050506124ea6020840184612461565b6124f76020860182611544565b506125056040840184612461565b6125126040860182611544565b50612520606084018461248d565b61252d60608601826124a4565b5061253b608084018461248d565b61254860808601826124a4565b508091505092915050565b6000602082019050818103600083015261256d81846124b3565b905092915050565b600067ffffffffffffffff8211156125905761258f610b4c565b5b602082029050602081019050919050565b6000604082840312156125b7576125b6610c77565b5b6125c16040610bac565b9050600082015167ffffffffffffffff8111156125e1576125e0610c7c565b5b6125ed84828501611f31565b600083015250602082015167ffffffffffffffff81111561261157612610610c7c565b5b61261d84828501611f31565b60208301525092915050565b600061263c61263784612575565b610bac565b9050808382526020820190506020840283018581111561265f5761265e610939565b5b835b818110156126a657805167ffffffffffffffff8111156126845761268361092f565b5b80860161269189826125a1565b85526020850194505050602081019050612661565b5050509392505050565b600082601f8301126126c5576126c461092f565b5b81516126d5848260208601612629565b91505092915050565b600067ffffffffffffffff8211156126f9576126f8610b4c565b5b61270282610b3b565b9050602081019050919050565b600061272261271d846126de565b610bac565b90508281526020810184848401111561273e5761273d610b36565b5b612749848285610f64565b509392505050565b600082601f8301126127665761276561092f565b5b815161277684826020860161270f565b91505092915050565b60006040828403121561279557612794610c77565b5b61279f6040610bac565b9050600082015167ffffffffffffffff8111156127bf576127be610c7c565b5b6127cb84828501612751565b60008301525060206127df84828501611dd1565b60208301525092915050565b6000806040838503121561280257612801610925565b5b600083015167ffffffffffffffff8111156128205761281f61092a565b5b61282c858286016126b0565b925050602083015167ffffffffffffffff81111561284d5761284c61092a565b5b6128598582860161277f565b9150509250929050565b60006020828403121561287957612878610925565b5b600082015167ffffffffffffffff8111156128975761289661092a565b5b6128a3848285016125a1565b91505092915050565b7f4661696c656420746f20646563726561736520616c6c6f77616e636500000000600082015250565b60006128e2601c83611310565b91506128ed826128ac565b602082019050919050565b60006020820190508181036000830152612911816128d5565b905091905056fea26469706673582212207ab56f70e9096bd8ce811007f83333b057542914c55d2c5dd45b422f3a0b397064736f6c63430008130033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061009e5760003560e01c8063a363df8411610066578063a363df8414610145578063c595699a14610175578063dfa10f39146101a5578063ee5766d9146101d6578063f298e7a8146102065761009e565b8063424af9f6146100a357806367b10abe146100bf5780636fdf23cc146100db5780637492bdd81461010b5780637a6185e11461013b575b600080fd5b6100bd60048036038101906100b891906109ca565b610222565b005b6100d960048036038101906100d49190610ae9565b6102fc565b005b6100f560048036038101906100f09190610d11565b6103c7565b6040516101029190610e63565b60405180910390f35b61012560048036038101906101209190610d11565b610465565b6040516101329190610e63565b60405180910390f35b610143610503565b005b61015f600480360381019061015a9190610edc565b6105c8565b60405161016c91906112a5565b60405180910390f35b61018f600480360381019061018a91906112c7565b610655565b60405161019c919061135a565b60405180910390f35b6101bf60048036038101906101ba91906113a0565b6106df565b6040516101cd929190611590565b60405180910390f35b6101f060048036038101906101eb91906112c7565b610773565b6040516101fd919061160b565b60405180910390f35b610220600480360381019061021b91906109ca565b610803565b005b600061080273ffffffffffffffffffffffffffffffffffffffff166354de647b308a8a8a8a8a8a8a6040518963ffffffff1660e01b815260040161026d989796959493929190611678565b6020604051808303816000875af115801561028c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102b0919061171e565b9050806102f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102e990611797565b60405180910390fd5b5050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663e3fee9273085856040518463ffffffff1660e01b815260040161033d93929190611c53565b6020604051808303816000875af115801561035c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610380919061171e565b9050806103c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103b990611cd1565b60405180910390fd5b505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663632535b98a8a8a8a308b8b8b8b6040518a63ffffffff1660e01b815260040161041499989796959493929190611d20565b6020604051808303816000875af1158015610433573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104579190611de6565b905098975050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663632535b98a8a8a8a338b8b8b8b6040518a63ffffffff1660e01b81526004016104b299989796959493929190611d20565b6020604051808303816000875af11580156104d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f59190611de6565b905098975050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff166374a8f103306040518263ffffffff1660e01b81526004016105409190611e13565b6020604051808303816000875af115801561055f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610583919061171e565b9050806105c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc90611e7a565b60405180910390fd5b50565b606061080273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84846040518363ffffffff1660e01b8152600401610607929190611e9a565b600060405180830381865afa158015610624573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061064d919061233f565b905092915050565b606061080273ffffffffffffffffffffffffffffffffffffffff1663b5cb6e7d836040518263ffffffff1660e01b8152600401610692919061135a565b600060405180830381865afa1580156106af573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906106d89190612388565b9050919050565b60606106e96108dd565b61080273ffffffffffffffffffffffffffffffffffffffff166322b6fad6846040518263ffffffff1660e01b81526004016107249190612553565b600060405180830381865afa158015610741573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061076a91906127eb565b91509150915091565b61077b610901565b61080273ffffffffffffffffffffffffffffffffffffffff1663a815cdd9836040518263ffffffff1660e01b81526004016107b6919061135a565b600060405180830381865afa1580156107d3573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906107fc9190612863565b9050919050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663b3f536ec308a8a8a8a8a8a8a6040518963ffffffff1660e01b815260040161084e989796959493929190611678565b6020604051808303816000875af115801561086d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610891919061171e565b9050806108d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca906128f8565b60405180910390fd5b5050505050505050565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b604051806040016040528060608152602001606081525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126109545761095361092f565b5b8235905067ffffffffffffffff81111561097157610970610934565b5b60208301915083600182028301111561098d5761098c610939565b5b9250929050565b6000819050919050565b6109a781610994565b81146109b257600080fd5b50565b6000813590506109c48161099e565b92915050565b60008060008060008060006080888a0312156109e9576109e8610925565b5b600088013567ffffffffffffffff811115610a0757610a0661092a565b5b610a138a828b0161093e565b9750975050602088013567ffffffffffffffff811115610a3657610a3561092a565b5b610a428a828b0161093e565b9550955050604088013567ffffffffffffffff811115610a6557610a6461092a565b5b610a718a828b0161093e565b93509350506060610a848a828b016109b5565b91505092959891949750929550565b60008083601f840112610aa957610aa861092f565b5b8235905067ffffffffffffffff811115610ac657610ac5610934565b5b602083019150836020820283011115610ae257610ae1610939565b5b9250929050565b60008060208385031215610b0057610aff610925565b5b600083013567ffffffffffffffff811115610b1e57610b1d61092a565b5b610b2a85828601610a93565b92509250509250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610b8482610b3b565b810181811067ffffffffffffffff82111715610ba357610ba2610b4c565b5b80604052505050565b6000610bb661091b565b9050610bc28282610b7b565b919050565b600067ffffffffffffffff821115610be257610be1610b4c565b5b610beb82610b3b565b9050602081019050919050565b82818337600083830152505050565b6000610c1a610c1584610bc7565b610bac565b905082815260208101848484011115610c3657610c35610b36565b5b610c41848285610bf8565b509392505050565b600082601f830112610c5e57610c5d61092f565b5b8135610c6e848260208601610c07565b91505092915050565b600080fd5b600080fd5b600067ffffffffffffffff82169050919050565b610c9e81610c81565b8114610ca957600080fd5b50565b600081359050610cbb81610c95565b92915050565b600060408284031215610cd757610cd6610c77565b5b610ce16040610bac565b90506000610cf184828501610cac565b6000830152506020610d0584828501610cac565b60208301525092915050565b600080600080600080600080610120898b031215610d3257610d31610925565b5b600089013567ffffffffffffffff811115610d5057610d4f61092a565b5b610d5c8b828c01610c49565b985050602089013567ffffffffffffffff811115610d7d57610d7c61092a565b5b610d898b828c01610c49565b975050604089013567ffffffffffffffff811115610daa57610da961092a565b5b610db68b828c01610c49565b9650506060610dc78b828c016109b5565b955050608089013567ffffffffffffffff811115610de857610de761092a565b5b610df48b828c01610c49565b94505060a0610e058b828c01610cc1565b93505060e0610e168b828c01610cac565b92505061010089013567ffffffffffffffff811115610e3857610e3761092a565b5b610e448b828c01610c49565b9150509295985092959890939650565b610e5d81610c81565b82525050565b6000602082019050610e786000830184610e54565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610ea982610e7e565b9050919050565b610eb981610e9e565b8114610ec457600080fd5b50565b600081359050610ed681610eb0565b92915050565b60008060408385031215610ef357610ef2610925565b5b6000610f0185828601610ec7565b9250506020610f1285828601610ec7565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610f82578082015181840152602081019050610f67565b60008484015250505050565b6000610f9982610f48565b610fa38185610f53565b9350610fb3818560208601610f64565b610fbc81610b3b565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b610ffc81610994565b82525050565b6000604083016000830151848203600086015261101f8282610f8e565b91505060208301516110346020860182610ff3565b508091505092915050565b600061104b8383611002565b905092915050565b6000602082019050919050565b600061106b82610fc7565b6110758185610fd2565b93508360208202850161108785610fe3565b8060005b858110156110c357848403895281516110a4858261103f565b94506110af83611053565b925060208a0199505060018101905061108b565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061110d8383610f8e565b905092915050565b6000602082019050919050565b600061112d826110d5565b61113781856110e0565b935083602082028501611149856110f1565b8060005b8581101561118557848403895281516111668582611101565b945061117183611115565b925060208a0199505060018101905061114d565b50829750879550505050505092915050565b600060808301600083015184820360008601526111b48282610f8e565b915050602083015184820360208601526111ce8282610f8e565b915050604083015184820360408601526111e88282611060565b915050606083015184820360608601526112028282611122565b9150508091505092915050565b600061121b8383611197565b905092915050565b6000602082019050919050565b600061123b82610f1c565b6112458185610f27565b93508360208202850161125785610f38565b8060005b858110156112935784840389528151611274858261120f565b945061127f83611223565b925060208a0199505060018101905061125b565b50829750879550505050505092915050565b600060208201905081810360008301526112bf8184611230565b905092915050565b6000602082840312156112dd576112dc610925565b5b600082013567ffffffffffffffff8111156112fb576112fa61092a565b5b61130784828501610c49565b91505092915050565b600082825260208201905092915050565b600061132c82610f48565b6113368185611310565b9350611346818560208601610f64565b61134f81610b3b565b840191505092915050565b600060208201905081810360008301526113748184611321565b905092915050565b600080fd5b600060a082840312156113975761139661137c565b5b81905092915050565b6000602082840312156113b6576113b5610925565b5b600082013567ffffffffffffffff8111156113d4576113d361092a565b5b6113e084828501611381565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060408301600083015184820360008601526114328282610f8e565b9150506020830151848203602086015261144c8282610f8e565b9150508091505092915050565b60006114658383611415565b905092915050565b6000602082019050919050565b6000611485826113e9565b61148f81856113f4565b9350836020820285016114a185611405565b8060005b858110156114dd57848403895281516114be8582611459565b94506114c98361146d565b925060208a019950506001810190506114a5565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b6000611516826114ef565b61152081856114fa565b9350611530818560208601610f64565b61153981610b3b565b840191505092915050565b61154d81610c81565b82525050565b60006040830160008301518482036000860152611570828261150b565b91505060208301516115856020860182611544565b508091505092915050565b600060408201905081810360008301526115aa818561147a565b905081810360208301526115be8184611553565b90509392505050565b600060408301600083015184820360008601526115e48282610f8e565b915050602083015184820360208601526115fe8282610f8e565b9150508091505092915050565b6000602082019050818103600083015261162581846115c7565b905092915050565b61163681610e9e565b82525050565b60006116488385611310565b9350611655838584610bf8565b61165e83610b3b565b840190509392505050565b61167281610994565b82525050565b600060a08201905061168d600083018b61162d565b81810360208301526116a081898b61163c565b905081810360408301526116b581878961163c565b905081810360608301526116ca81858761163c565b90506116d96080830184611669565b9998505050505050505050565b60008115159050919050565b6116fb816116e6565b811461170657600080fd5b50565b600081519050611718816116f2565b92915050565b60006020828403121561173457611733610925565b5b600061174284828501611709565b91505092915050565b7f4661696c656420746f20696e63726561736520616c6c6f77616e636500000000600082015250565b6000611781601c83611310565b915061178c8261174b565b602082019050919050565b600060208201905081810360008301526117b081611774565b9050919050565b6000819050919050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126117ed576117ec6117cb565b5b83810192508235915060208301925067ffffffffffffffff821115611815576118146117c1565b5b60018202360383131561182b5761182a6117c6565b5b509250929050565b600061183f8385610f53565b935061184c838584610bf8565b61185583610b3b565b840190509392505050565b6000808335600160200384360303811261187d5761187c6117cb565b5b83810192508235915060208301925067ffffffffffffffff8211156118a5576118a46117c1565b5b6020820236038313156118bb576118ba6117c6565b5b509250929050565b6000819050919050565b60006118dc60208401846109b5565b905092915050565b6000604083016118f760008401846117d0565b858303600087015261190a838284611833565b9250505061191b60208401846118cd565b6119286020860182610ff3565b508091505092915050565b600061193f83836118e4565b905092915050565b600082356001604003833603038112611963576119626117cb565b5b82810191505092915050565b6000602082019050919050565b60006119888385610fd2565b93508360208402850161199a846118c3565b8060005b878110156119de5784840389526119b58284611947565b6119bf8582611933565b94506119ca8361196f565b925060208a0199505060018101905061199e565b50829750879450505050509392505050565b60008083356001602003843603038112611a0d57611a0c6117cb565b5b83810192508235915060208301925067ffffffffffffffff821115611a3557611a346117c1565b5b602082023603831315611a4b57611a4a6117c6565b5b509250929050565b6000819050919050565b6000611a6a848484611833565b90509392505050565b6000602082019050919050565b6000611a8c83856110e0565b935083602084028501611a9e84611a53565b8060005b87811015611ae4578484038952611ab982846117d0565b611ac4868284611a5d565b9550611acf84611a73565b935060208b019a505050600181019050611aa2565b50829750879450505050509392505050565b600060808301611b0960008401846117d0565b8583036000870152611b1c838284611833565b92505050611b2d60208401846117d0565b8583036020870152611b40838284611833565b92505050611b516040840184611860565b8583036040870152611b6483828461197c565b92505050611b7560608401846119f0565b8583036060870152611b88838284611a80565b925050508091505092915050565b6000611ba28383611af6565b905092915050565b600082356001608003833603038112611bc657611bc56117cb565b5b82810191505092915050565b6000602082019050919050565b6000611beb8385610f27565b935083602084028501611bfd846117b7565b8060005b87811015611c41578484038952611c188284611baa565b611c228582611b96565b9450611c2d83611bd2565b925060208a01995050600181019050611c01565b50829750879450505050509392505050565b6000604082019050611c68600083018661162d565b8181036020830152611c7b818486611bdf565b9050949350505050565b7f4661696c656420746f20706572666f726d20617070726f76616c000000000000600082015250565b6000611cbb601a83611310565b9150611cc682611c85565b602082019050919050565b60006020820190508181036000830152611cea81611cae565b9050919050565b604082016000820151611d076000850182611544565b506020820151611d1a6020850182611544565b50505050565b6000610140820190508181036000830152611d3b818c611321565b90508181036020830152611d4f818b611321565b90508181036040830152611d63818a611321565b9050611d726060830189611669565b611d7f608083018861162d565b81810360a0830152611d918187611321565b9050611da060c0830186611cf1565b611dae610100830185610e54565b818103610120830152611dc18184611321565b90509a9950505050505050505050565b600081519050611de081610c95565b92915050565b600060208284031215611dfc57611dfb610925565b5b6000611e0a84828501611dd1565b91505092915050565b6000602082019050611e28600083018461162d565b92915050565b7f4661696c656420746f207265766f6b6520617070726f76616c00000000000000600082015250565b6000611e64601983611310565b9150611e6f82611e2e565b602082019050919050565b60006020820190508181036000830152611e9381611e57565b9050919050565b6000604082019050611eaf600083018561162d565b611ebc602083018461162d565b9392505050565b600067ffffffffffffffff821115611ede57611edd610b4c565b5b602082029050602081019050919050565b6000611f02611efd84610bc7565b610bac565b905082815260208101848484011115611f1e57611f1d610b36565b5b611f29848285610f64565b509392505050565b600082601f830112611f4657611f4561092f565b5b8151611f56848260208601611eef565b91505092915050565b600067ffffffffffffffff821115611f7a57611f79610b4c565b5b602082029050602081019050919050565b600081519050611f9a8161099e565b92915050565b600060408284031215611fb657611fb5610c77565b5b611fc06040610bac565b9050600082015167ffffffffffffffff811115611fe057611fdf610c7c565b5b611fec84828501611f31565b600083015250602061200084828501611f8b565b60208301525092915050565b600061201f61201a84611f5f565b610bac565b9050808382526020820190506020840283018581111561204257612041610939565b5b835b8181101561208957805167ffffffffffffffff8111156120675761206661092f565b5b8086016120748982611fa0565b85526020850194505050602081019050612044565b5050509392505050565b600082601f8301126120a8576120a761092f565b5b81516120b884826020860161200c565b91505092915050565b600067ffffffffffffffff8211156120dc576120db610b4c565b5b602082029050602081019050919050565b60006121006120fb846120c1565b610bac565b9050808382526020820190506020840283018581111561212357612122610939565b5b835b8181101561216a57805167ffffffffffffffff8111156121485761214761092f565b5b8086016121558982611f31565b85526020850194505050602081019050612125565b5050509392505050565b600082601f8301126121895761218861092f565b5b81516121998482602086016120ed565b91505092915050565b6000608082840312156121b8576121b7610c77565b5b6121c26080610bac565b9050600082015167ffffffffffffffff8111156121e2576121e1610c7c565b5b6121ee84828501611f31565b600083015250602082015167ffffffffffffffff81111561221257612211610c7c565b5b61221e84828501611f31565b602083015250604082015167ffffffffffffffff81111561224257612241610c7c565b5b61224e84828501612093565b604083015250606082015167ffffffffffffffff81111561227257612271610c7c565b5b61227e84828501612174565b60608301525092915050565b600061229d61229884611ec3565b610bac565b905080838252602082019050602084028301858111156122c0576122bf610939565b5b835b8181101561230757805167ffffffffffffffff8111156122e5576122e461092f565b5b8086016122f289826121a2565b855260208501945050506020810190506122c2565b5050509392505050565b600082601f8301126123265761232561092f565b5b815161233684826020860161228a565b91505092915050565b60006020828403121561235557612354610925565b5b600082015167ffffffffffffffff8111156123735761237261092a565b5b61237f84828501612311565b91505092915050565b60006020828403121561239e5761239d610925565b5b600082015167ffffffffffffffff8111156123bc576123bb61092a565b5b6123c884828501611f31565b91505092915050565b600080833560016020038436030381126123ee576123ed6117cb565b5b83810192508235915060208301925067ffffffffffffffff821115612416576124156117c1565b5b60018202360383131561242c5761242b6117c6565b5b509250929050565b600061244083856114fa565b935061244d838584610bf8565b61245683610b3b565b840190509392505050565b60006124706020840184610cac565b905092915050565b600081359050612487816116f2565b92915050565b600061249c6020840184612478565b905092915050565b6124ad816116e6565b82525050565b600060a083016124c660008401846123d1565b85830360008701526124d9838284612434565b925050506124ea6020840184612461565b6124f76020860182611544565b506125056040840184612461565b6125126040860182611544565b50612520606084018461248d565b61252d60608601826124a4565b5061253b608084018461248d565b61254860808601826124a4565b508091505092915050565b6000602082019050818103600083015261256d81846124b3565b905092915050565b600067ffffffffffffffff8211156125905761258f610b4c565b5b602082029050602081019050919050565b6000604082840312156125b7576125b6610c77565b5b6125c16040610bac565b9050600082015167ffffffffffffffff8111156125e1576125e0610c7c565b5b6125ed84828501611f31565b600083015250602082015167ffffffffffffffff81111561261157612610610c7c565b5b61261d84828501611f31565b60208301525092915050565b600061263c61263784612575565b610bac565b9050808382526020820190506020840283018581111561265f5761265e610939565b5b835b818110156126a657805167ffffffffffffffff8111156126845761268361092f565b5b80860161269189826125a1565b85526020850194505050602081019050612661565b5050509392505050565b600082601f8301126126c5576126c461092f565b5b81516126d5848260208601612629565b91505092915050565b600067ffffffffffffffff8211156126f9576126f8610b4c565b5b61270282610b3b565b9050602081019050919050565b600061272261271d846126de565b610bac565b90508281526020810184848401111561273e5761273d610b36565b5b612749848285610f64565b509392505050565b600082601f8301126127665761276561092f565b5b815161277684826020860161270f565b91505092915050565b60006040828403121561279557612794610c77565b5b61279f6040610bac565b9050600082015167ffffffffffffffff8111156127bf576127be610c7c565b5b6127cb84828501612751565b60008301525060206127df84828501611dd1565b60208301525092915050565b6000806040838503121561280257612801610925565b5b600083015167ffffffffffffffff8111156128205761281f61092a565b5b61282c858286016126b0565b925050602083015167ffffffffffffffff81111561284d5761284c61092a565b5b6128598582860161277f565b9150509250929050565b60006020828403121561287957612878610925565b5b600082015167ffffffffffffffff8111156128975761289661092a565b5b6128a3848285016125a1565b91505092915050565b7f4661696c656420746f20646563726561736520616c6c6f77616e636500000000600082015250565b60006128e2601c83611310565b91506128ed826128ac565b602082019050919050565b60006020820190508181036000830152612911816128d5565b905091905056fea26469706673582212207ab56f70e9096bd8ce811007f83333b057542914c55d2c5dd45b422f3a0b397064736f6c63430008130033", + "bytecode": "0x608060405234801561001057600080fd5b506129bc806100206000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063c595699a11610066578063c595699a14610159578063dfa10f3914610189578063ee5766d9146101ba578063f298e7a8146101ea578063f3675f08146102065761009e565b8063424af9f6146100a35780636fdf23cc146100bf5780637492bdd8146100ef5780637a6185e11461011f578063a363df8414610129575b600080fd5b6100bd60048036038101906100b891906109ca565b610222565b005b6100d960048036038101906100d49190610c6e565b6102fc565b6040516100e69190610dc0565b60405180910390f35b61010960048036038101906101049190610c6e565b61039a565b6040516101169190610dc0565b60405180910390f35b610127610438565b005b610143600480360381019061013e9190610e39565b6104fd565b604051610150919061121c565b60405180910390f35b610173600480360381019061016e919061123e565b61058a565b60405161018091906112d1565b60405180910390f35b6101a3600480360381019061019e9190611317565b610614565b6040516101b1929190611507565b60405180910390f35b6101d460048036038101906101cf919061123e565b6106a8565b6040516101e19190611582565b60405180910390f35b61020460048036038101906101ff91906109ca565b610738565b005b610220600480360381019061021b91906115fa565b610812565b005b600061080273ffffffffffffffffffffffffffffffffffffffff166354de647b308a8a8a8a8a8a8a6040518963ffffffff1660e01b815260040161026d989796959493929190611692565b6020604051808303816000875af115801561028c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102b09190611738565b9050806102f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102e9906117b1565b60405180910390fd5b5050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663632535b98a8a8a8a308b8b8b8b6040518a63ffffffff1660e01b815260040161034999989796959493929190611800565b6020604051808303816000875af1158015610368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038c91906118c6565b905098975050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663632535b98a8a8a8a338b8b8b8b6040518a63ffffffff1660e01b81526004016103e799989796959493929190611800565b6020604051808303816000875af1158015610406573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061042a91906118c6565b905098975050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff166374a8f103306040518263ffffffff1660e01b815260040161047591906118f3565b6020604051808303816000875af1158015610494573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b89190611738565b9050806104fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f19061195a565b60405180910390fd5b50565b606061080273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84846040518363ffffffff1660e01b815260040161053c92919061197a565b600060405180830381865afa158015610559573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906105829190611e4f565b905092915050565b606061080273ffffffffffffffffffffffffffffffffffffffff1663b5cb6e7d836040518263ffffffff1660e01b81526004016105c791906112d1565b600060405180830381865afa1580156105e4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061060d9190611e98565b9050919050565b606061061e6108dd565b61080273ffffffffffffffffffffffffffffffffffffffff166322b6fad6846040518263ffffffff1660e01b81526004016106599190612072565b600060405180830381865afa158015610676573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061069f919061230a565b91509150915091565b6106b0610901565b61080273ffffffffffffffffffffffffffffffffffffffff1663a815cdd9836040518263ffffffff1660e01b81526004016106eb91906112d1565b600060405180830381865afa158015610708573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906107319190612382565b9050919050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663b3f536ec308a8a8a8a8a8a8a6040518963ffffffff1660e01b8152600401610783989796959493929190611692565b6020604051808303816000875af11580156107a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c69190611738565b905080610808576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ff90612417565b60405180910390fd5b5050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663473c90c73085856040518463ffffffff1660e01b8152600401610853939291906128e8565b6020604051808303816000875af1158015610872573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108969190611738565b9050806108d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cf90612966565b60405180910390fd5b505050565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b604051806040016040528060608152602001606081525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126109545761095361092f565b5b8235905067ffffffffffffffff81111561097157610970610934565b5b60208301915083600182028301111561098d5761098c610939565b5b9250929050565b6000819050919050565b6109a781610994565b81146109b257600080fd5b50565b6000813590506109c48161099e565b92915050565b60008060008060008060006080888a0312156109e9576109e8610925565b5b600088013567ffffffffffffffff811115610a0757610a0661092a565b5b610a138a828b0161093e565b9750975050602088013567ffffffffffffffff811115610a3657610a3561092a565b5b610a428a828b0161093e565b9550955050604088013567ffffffffffffffff811115610a6557610a6461092a565b5b610a718a828b0161093e565b93509350506060610a848a828b016109b5565b91505092959891949750929550565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610ae182610a98565b810181811067ffffffffffffffff82111715610b0057610aff610aa9565b5b80604052505050565b6000610b1361091b565b9050610b1f8282610ad8565b919050565b600067ffffffffffffffff821115610b3f57610b3e610aa9565b5b610b4882610a98565b9050602081019050919050565b82818337600083830152505050565b6000610b77610b7284610b24565b610b09565b905082815260208101848484011115610b9357610b92610a93565b5b610b9e848285610b55565b509392505050565b600082601f830112610bbb57610bba61092f565b5b8135610bcb848260208601610b64565b91505092915050565b600080fd5b600080fd5b600067ffffffffffffffff82169050919050565b610bfb81610bde565b8114610c0657600080fd5b50565b600081359050610c1881610bf2565b92915050565b600060408284031215610c3457610c33610bd4565b5b610c3e6040610b09565b90506000610c4e84828501610c09565b6000830152506020610c6284828501610c09565b60208301525092915050565b600080600080600080600080610120898b031215610c8f57610c8e610925565b5b600089013567ffffffffffffffff811115610cad57610cac61092a565b5b610cb98b828c01610ba6565b985050602089013567ffffffffffffffff811115610cda57610cd961092a565b5b610ce68b828c01610ba6565b975050604089013567ffffffffffffffff811115610d0757610d0661092a565b5b610d138b828c01610ba6565b9650506060610d248b828c016109b5565b955050608089013567ffffffffffffffff811115610d4557610d4461092a565b5b610d518b828c01610ba6565b94505060a0610d628b828c01610c1e565b93505060e0610d738b828c01610c09565b92505061010089013567ffffffffffffffff811115610d9557610d9461092a565b5b610da18b828c01610ba6565b9150509295985092959890939650565b610dba81610bde565b82525050565b6000602082019050610dd56000830184610db1565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610e0682610ddb565b9050919050565b610e1681610dfb565b8114610e2157600080fd5b50565b600081359050610e3381610e0d565b92915050565b60008060408385031215610e5057610e4f610925565b5b6000610e5e85828601610e24565b9250506020610e6f85828601610e24565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610edf578082015181840152602081019050610ec4565b60008484015250505050565b6000610ef682610ea5565b610f008185610eb0565b9350610f10818560208601610ec1565b610f1981610a98565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b610f5981610994565b82525050565b60006040830160008301518482036000860152610f7c8282610eeb565b9150506020830151610f916020860182610f50565b508091505092915050565b6000610fa88383610f5f565b905092915050565b6000602082019050919050565b6000610fc882610f24565b610fd28185610f2f565b935083602082028501610fe485610f40565b8060005b8581101561102057848403895281516110018582610f9c565b945061100c83610fb0565b925060208a01995050600181019050610fe8565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061106a8383610eeb565b905092915050565b6000602082019050919050565b600061108a82611032565b611094818561103d565b9350836020820285016110a68561104e565b8060005b858110156110e257848403895281516110c3858261105e565b94506110ce83611072565b925060208a019950506001810190506110aa565b50829750879550505050505092915050565b600060a08301600083015184820360008601526111118282610eeb565b9150506020830151848203602086015261112b8282610eeb565b915050604083015184820360408601526111458282610fbd565b9150506060830151848203606086015261115f828261107f565b91505060808301518482036080860152611179828261107f565b9150508091505092915050565b600061119283836110f4565b905092915050565b6000602082019050919050565b60006111b282610e79565b6111bc8185610e84565b9350836020820285016111ce85610e95565b8060005b8581101561120a57848403895281516111eb8582611186565b94506111f68361119a565b925060208a019950506001810190506111d2565b50829750879550505050505092915050565b6000602082019050818103600083015261123681846111a7565b905092915050565b60006020828403121561125457611253610925565b5b600082013567ffffffffffffffff8111156112725761127161092a565b5b61127e84828501610ba6565b91505092915050565b600082825260208201905092915050565b60006112a382610ea5565b6112ad8185611287565b93506112bd818560208601610ec1565b6112c681610a98565b840191505092915050565b600060208201905081810360008301526112eb8184611298565b905092915050565b600080fd5b600060a0828403121561130e5761130d6112f3565b5b81905092915050565b60006020828403121561132d5761132c610925565b5b600082013567ffffffffffffffff81111561134b5761134a61092a565b5b611357848285016112f8565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060408301600083015184820360008601526113a98282610eeb565b915050602083015184820360208601526113c38282610eeb565b9150508091505092915050565b60006113dc838361138c565b905092915050565b6000602082019050919050565b60006113fc82611360565b611406818561136b565b9350836020820285016114188561137c565b8060005b85811015611454578484038952815161143585826113d0565b9450611440836113e4565b925060208a0199505060018101905061141c565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b600061148d82611466565b6114978185611471565b93506114a7818560208601610ec1565b6114b081610a98565b840191505092915050565b6114c481610bde565b82525050565b600060408301600083015184820360008601526114e78282611482565b91505060208301516114fc60208601826114bb565b508091505092915050565b6000604082019050818103600083015261152181856113f1565b9050818103602083015261153581846114ca565b90509392505050565b6000604083016000830151848203600086015261155b8282610eeb565b915050602083015184820360208601526115758282610eeb565b9150508091505092915050565b6000602082019050818103600083015261159c818461153e565b905092915050565b60008083601f8401126115ba576115b961092f565b5b8235905067ffffffffffffffff8111156115d7576115d6610934565b5b6020830191508360208202830111156115f3576115f2610939565b5b9250929050565b6000806020838503121561161157611610610925565b5b600083013567ffffffffffffffff81111561162f5761162e61092a565b5b61163b858286016115a4565b92509250509250929050565b61165081610dfb565b82525050565b60006116628385611287565b935061166f838584610b55565b61167883610a98565b840190509392505050565b61168c81610994565b82525050565b600060a0820190506116a7600083018b611647565b81810360208301526116ba81898b611656565b905081810360408301526116cf818789611656565b905081810360608301526116e4818587611656565b90506116f36080830184611683565b9998505050505050505050565b60008115159050919050565b61171581611700565b811461172057600080fd5b50565b6000815190506117328161170c565b92915050565b60006020828403121561174e5761174d610925565b5b600061175c84828501611723565b91505092915050565b7f4661696c656420746f20696e63726561736520616c6c6f77616e636500000000600082015250565b600061179b601c83611287565b91506117a682611765565b602082019050919050565b600060208201905081810360008301526117ca8161178e565b9050919050565b6040820160008201516117e760008501826114bb565b5060208201516117fa60208501826114bb565b50505050565b600061014082019050818103600083015261181b818c611298565b9050818103602083015261182f818b611298565b90508181036040830152611843818a611298565b90506118526060830189611683565b61185f6080830188611647565b81810360a08301526118718187611298565b905061188060c08301866117d1565b61188e610100830185610db1565b8181036101208301526118a18184611298565b90509a9950505050505050505050565b6000815190506118c081610bf2565b92915050565b6000602082840312156118dc576118db610925565b5b60006118ea848285016118b1565b91505092915050565b60006020820190506119086000830184611647565b92915050565b7f4661696c656420746f207265766f6b6520617070726f76616c00000000000000600082015250565b6000611944601983611287565b915061194f8261190e565b602082019050919050565b6000602082019050818103600083015261197381611937565b9050919050565b600060408201905061198f6000830185611647565b61199c6020830184611647565b9392505050565b600067ffffffffffffffff8211156119be576119bd610aa9565b5b602082029050602081019050919050565b60006119e26119dd84610b24565b610b09565b9050828152602081018484840111156119fe576119fd610a93565b5b611a09848285610ec1565b509392505050565b600082601f830112611a2657611a2561092f565b5b8151611a368482602086016119cf565b91505092915050565b600067ffffffffffffffff821115611a5a57611a59610aa9565b5b602082029050602081019050919050565b600081519050611a7a8161099e565b92915050565b600060408284031215611a9657611a95610bd4565b5b611aa06040610b09565b9050600082015167ffffffffffffffff811115611ac057611abf610bd9565b5b611acc84828501611a11565b6000830152506020611ae084828501611a6b565b60208301525092915050565b6000611aff611afa84611a3f565b610b09565b90508083825260208201905060208402830185811115611b2257611b21610939565b5b835b81811015611b6957805167ffffffffffffffff811115611b4757611b4661092f565b5b808601611b548982611a80565b85526020850194505050602081019050611b24565b5050509392505050565b600082601f830112611b8857611b8761092f565b5b8151611b98848260208601611aec565b91505092915050565b600067ffffffffffffffff821115611bbc57611bbb610aa9565b5b602082029050602081019050919050565b6000611be0611bdb84611ba1565b610b09565b90508083825260208201905060208402830185811115611c0357611c02610939565b5b835b81811015611c4a57805167ffffffffffffffff811115611c2857611c2761092f565b5b808601611c358982611a11565b85526020850194505050602081019050611c05565b5050509392505050565b600082601f830112611c6957611c6861092f565b5b8151611c79848260208601611bcd565b91505092915050565b600060a08284031215611c9857611c97610bd4565b5b611ca260a0610b09565b9050600082015167ffffffffffffffff811115611cc257611cc1610bd9565b5b611cce84828501611a11565b600083015250602082015167ffffffffffffffff811115611cf257611cf1610bd9565b5b611cfe84828501611a11565b602083015250604082015167ffffffffffffffff811115611d2257611d21610bd9565b5b611d2e84828501611b73565b604083015250606082015167ffffffffffffffff811115611d5257611d51610bd9565b5b611d5e84828501611c54565b606083015250608082015167ffffffffffffffff811115611d8257611d81610bd9565b5b611d8e84828501611c54565b60808301525092915050565b6000611dad611da8846119a3565b610b09565b90508083825260208201905060208402830185811115611dd057611dcf610939565b5b835b81811015611e1757805167ffffffffffffffff811115611df557611df461092f565b5b808601611e028982611c82565b85526020850194505050602081019050611dd2565b5050509392505050565b600082601f830112611e3657611e3561092f565b5b8151611e46848260208601611d9a565b91505092915050565b600060208284031215611e6557611e64610925565b5b600082015167ffffffffffffffff811115611e8357611e8261092a565b5b611e8f84828501611e21565b91505092915050565b600060208284031215611eae57611ead610925565b5b600082015167ffffffffffffffff811115611ecc57611ecb61092a565b5b611ed884828501611a11565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112611f0d57611f0c611eeb565b5b83810192508235915060208301925067ffffffffffffffff821115611f3557611f34611ee1565b5b600182023603831315611f4b57611f4a611ee6565b5b509250929050565b6000611f5f8385611471565b9350611f6c838584610b55565b611f7583610a98565b840190509392505050565b6000611f8f6020840184610c09565b905092915050565b600081359050611fa68161170c565b92915050565b6000611fbb6020840184611f97565b905092915050565b611fcc81611700565b82525050565b600060a08301611fe56000840184611ef0565b8583036000870152611ff8838284611f53565b925050506120096020840184611f80565b61201660208601826114bb565b506120246040840184611f80565b61203160408601826114bb565b5061203f6060840184611fac565b61204c6060860182611fc3565b5061205a6080840184611fac565b6120676080860182611fc3565b508091505092915050565b6000602082019050818103600083015261208c8184611fd2565b905092915050565b600067ffffffffffffffff8211156120af576120ae610aa9565b5b602082029050602081019050919050565b6000604082840312156120d6576120d5610bd4565b5b6120e06040610b09565b9050600082015167ffffffffffffffff811115612100576120ff610bd9565b5b61210c84828501611a11565b600083015250602082015167ffffffffffffffff8111156121305761212f610bd9565b5b61213c84828501611a11565b60208301525092915050565b600061215b61215684612094565b610b09565b9050808382526020820190506020840283018581111561217e5761217d610939565b5b835b818110156121c557805167ffffffffffffffff8111156121a3576121a261092f565b5b8086016121b089826120c0565b85526020850194505050602081019050612180565b5050509392505050565b600082601f8301126121e4576121e361092f565b5b81516121f4848260208601612148565b91505092915050565b600067ffffffffffffffff82111561221857612217610aa9565b5b61222182610a98565b9050602081019050919050565b600061224161223c846121fd565b610b09565b90508281526020810184848401111561225d5761225c610a93565b5b612268848285610ec1565b509392505050565b600082601f8301126122855761228461092f565b5b815161229584826020860161222e565b91505092915050565b6000604082840312156122b4576122b3610bd4565b5b6122be6040610b09565b9050600082015167ffffffffffffffff8111156122de576122dd610bd9565b5b6122ea84828501612270565b60008301525060206122fe848285016118b1565b60208301525092915050565b6000806040838503121561232157612320610925565b5b600083015167ffffffffffffffff81111561233f5761233e61092a565b5b61234b858286016121cf565b925050602083015167ffffffffffffffff81111561236c5761236b61092a565b5b6123788582860161229e565b9150509250929050565b60006020828403121561239857612397610925565b5b600082015167ffffffffffffffff8111156123b6576123b561092a565b5b6123c2848285016120c0565b91505092915050565b7f4661696c656420746f20646563726561736520616c6c6f77616e636500000000600082015250565b6000612401601c83611287565b915061240c826123cb565b602082019050919050565b60006020820190508181036000830152612430816123f4565b9050919050565b6000819050919050565b6000808335600160200384360303811261245e5761245d611eeb565b5b83810192508235915060208301925067ffffffffffffffff82111561248657612485611ee1565b5b60018202360383131561249c5761249b611ee6565b5b509250929050565b60006124b08385610eb0565b93506124bd838584610b55565b6124c683610a98565b840190509392505050565b600080833560016020038436030381126124ee576124ed611eeb565b5b83810192508235915060208301925067ffffffffffffffff82111561251657612515611ee1565b5b60208202360383131561252c5761252b611ee6565b5b509250929050565b6000819050919050565b600061254d60208401846109b5565b905092915050565b6000604083016125686000840184612441565b858303600087015261257b8382846124a4565b9250505061258c602084018461253e565b6125996020860182610f50565b508091505092915050565b60006125b08383612555565b905092915050565b6000823560016040038336030381126125d4576125d3611eeb565b5b82810191505092915050565b6000602082019050919050565b60006125f98385610f2f565b93508360208402850161260b84612534565b8060005b8781101561264f57848403895261262682846125b8565b61263085826125a4565b945061263b836125e0565b925060208a0199505060018101905061260f565b50829750879450505050509392505050565b6000808335600160200384360303811261267e5761267d611eeb565b5b83810192508235915060208301925067ffffffffffffffff8211156126a6576126a5611ee1565b5b6020820236038313156126bc576126bb611ee6565b5b509250929050565b6000819050919050565b60006126db8484846124a4565b90509392505050565b6000602082019050919050565b60006126fd838561103d565b93508360208402850161270f846126c4565b8060005b8781101561275557848403895261272a8284612441565b6127358682846126ce565b9550612740846126e4565b935060208b019a505050600181019050612713565b50829750879450505050509392505050565b600060a0830161277a6000840184612441565b858303600087015261278d8382846124a4565b9250505061279e6020840184612441565b85830360208701526127b18382846124a4565b925050506127c260408401846124d1565b85830360408701526127d58382846125ed565b925050506127e66060840184612661565b85830360608701526127f98382846126f1565b9250505061280a6080840184612661565b858303608087015261281d8382846126f1565b925050508091505092915050565b60006128378383612767565b905092915050565b60008235600160a00383360303811261285b5761285a611eeb565b5b82810191505092915050565b6000602082019050919050565b60006128808385610e84565b93508360208402850161289284612437565b8060005b878110156128d65784840389526128ad828461283f565b6128b7858261282b565b94506128c283612867565b925060208a01995050600181019050612896565b50829750879450505050509392505050565b60006040820190506128fd6000830186611647565b8181036020830152612910818486612874565b9050949350505050565b7f4661696c656420746f20706572666f726d20617070726f76616c000000000000600082015250565b6000612950601a83611287565b915061295b8261291a565b602082019050919050565b6000602082019050818103600083015261297f81612943565b905091905056fea2646970667358221220c4fc8b3e524383362758b87771ae0378dd1bdaf5bd1bf9813a42e171bcc4f96864736f6c63430008120033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061009e5760003560e01c8063c595699a11610066578063c595699a14610159578063dfa10f3914610189578063ee5766d9146101ba578063f298e7a8146101ea578063f3675f08146102065761009e565b8063424af9f6146100a35780636fdf23cc146100bf5780637492bdd8146100ef5780637a6185e11461011f578063a363df8414610129575b600080fd5b6100bd60048036038101906100b891906109ca565b610222565b005b6100d960048036038101906100d49190610c6e565b6102fc565b6040516100e69190610dc0565b60405180910390f35b61010960048036038101906101049190610c6e565b61039a565b6040516101169190610dc0565b60405180910390f35b610127610438565b005b610143600480360381019061013e9190610e39565b6104fd565b604051610150919061121c565b60405180910390f35b610173600480360381019061016e919061123e565b61058a565b60405161018091906112d1565b60405180910390f35b6101a3600480360381019061019e9190611317565b610614565b6040516101b1929190611507565b60405180910390f35b6101d460048036038101906101cf919061123e565b6106a8565b6040516101e19190611582565b60405180910390f35b61020460048036038101906101ff91906109ca565b610738565b005b610220600480360381019061021b91906115fa565b610812565b005b600061080273ffffffffffffffffffffffffffffffffffffffff166354de647b308a8a8a8a8a8a8a6040518963ffffffff1660e01b815260040161026d989796959493929190611692565b6020604051808303816000875af115801561028c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102b09190611738565b9050806102f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102e9906117b1565b60405180910390fd5b5050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663632535b98a8a8a8a308b8b8b8b6040518a63ffffffff1660e01b815260040161034999989796959493929190611800565b6020604051808303816000875af1158015610368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038c91906118c6565b905098975050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663632535b98a8a8a8a338b8b8b8b6040518a63ffffffff1660e01b81526004016103e799989796959493929190611800565b6020604051808303816000875af1158015610406573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061042a91906118c6565b905098975050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff166374a8f103306040518263ffffffff1660e01b815260040161047591906118f3565b6020604051808303816000875af1158015610494573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b89190611738565b9050806104fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f19061195a565b60405180910390fd5b50565b606061080273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84846040518363ffffffff1660e01b815260040161053c92919061197a565b600060405180830381865afa158015610559573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906105829190611e4f565b905092915050565b606061080273ffffffffffffffffffffffffffffffffffffffff1663b5cb6e7d836040518263ffffffff1660e01b81526004016105c791906112d1565b600060405180830381865afa1580156105e4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061060d9190611e98565b9050919050565b606061061e6108dd565b61080273ffffffffffffffffffffffffffffffffffffffff166322b6fad6846040518263ffffffff1660e01b81526004016106599190612072565b600060405180830381865afa158015610676573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061069f919061230a565b91509150915091565b6106b0610901565b61080273ffffffffffffffffffffffffffffffffffffffff1663a815cdd9836040518263ffffffff1660e01b81526004016106eb91906112d1565b600060405180830381865afa158015610708573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906107319190612382565b9050919050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663b3f536ec308a8a8a8a8a8a8a6040518963ffffffff1660e01b8152600401610783989796959493929190611692565b6020604051808303816000875af11580156107a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c69190611738565b905080610808576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ff90612417565b60405180910390fd5b5050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663473c90c73085856040518463ffffffff1660e01b8152600401610853939291906128e8565b6020604051808303816000875af1158015610872573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108969190611738565b9050806108d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cf90612966565b60405180910390fd5b505050565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b604051806040016040528060608152602001606081525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126109545761095361092f565b5b8235905067ffffffffffffffff81111561097157610970610934565b5b60208301915083600182028301111561098d5761098c610939565b5b9250929050565b6000819050919050565b6109a781610994565b81146109b257600080fd5b50565b6000813590506109c48161099e565b92915050565b60008060008060008060006080888a0312156109e9576109e8610925565b5b600088013567ffffffffffffffff811115610a0757610a0661092a565b5b610a138a828b0161093e565b9750975050602088013567ffffffffffffffff811115610a3657610a3561092a565b5b610a428a828b0161093e565b9550955050604088013567ffffffffffffffff811115610a6557610a6461092a565b5b610a718a828b0161093e565b93509350506060610a848a828b016109b5565b91505092959891949750929550565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610ae182610a98565b810181811067ffffffffffffffff82111715610b0057610aff610aa9565b5b80604052505050565b6000610b1361091b565b9050610b1f8282610ad8565b919050565b600067ffffffffffffffff821115610b3f57610b3e610aa9565b5b610b4882610a98565b9050602081019050919050565b82818337600083830152505050565b6000610b77610b7284610b24565b610b09565b905082815260208101848484011115610b9357610b92610a93565b5b610b9e848285610b55565b509392505050565b600082601f830112610bbb57610bba61092f565b5b8135610bcb848260208601610b64565b91505092915050565b600080fd5b600080fd5b600067ffffffffffffffff82169050919050565b610bfb81610bde565b8114610c0657600080fd5b50565b600081359050610c1881610bf2565b92915050565b600060408284031215610c3457610c33610bd4565b5b610c3e6040610b09565b90506000610c4e84828501610c09565b6000830152506020610c6284828501610c09565b60208301525092915050565b600080600080600080600080610120898b031215610c8f57610c8e610925565b5b600089013567ffffffffffffffff811115610cad57610cac61092a565b5b610cb98b828c01610ba6565b985050602089013567ffffffffffffffff811115610cda57610cd961092a565b5b610ce68b828c01610ba6565b975050604089013567ffffffffffffffff811115610d0757610d0661092a565b5b610d138b828c01610ba6565b9650506060610d248b828c016109b5565b955050608089013567ffffffffffffffff811115610d4557610d4461092a565b5b610d518b828c01610ba6565b94505060a0610d628b828c01610c1e565b93505060e0610d738b828c01610c09565b92505061010089013567ffffffffffffffff811115610d9557610d9461092a565b5b610da18b828c01610ba6565b9150509295985092959890939650565b610dba81610bde565b82525050565b6000602082019050610dd56000830184610db1565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610e0682610ddb565b9050919050565b610e1681610dfb565b8114610e2157600080fd5b50565b600081359050610e3381610e0d565b92915050565b60008060408385031215610e5057610e4f610925565b5b6000610e5e85828601610e24565b9250506020610e6f85828601610e24565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610edf578082015181840152602081019050610ec4565b60008484015250505050565b6000610ef682610ea5565b610f008185610eb0565b9350610f10818560208601610ec1565b610f1981610a98565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b610f5981610994565b82525050565b60006040830160008301518482036000860152610f7c8282610eeb565b9150506020830151610f916020860182610f50565b508091505092915050565b6000610fa88383610f5f565b905092915050565b6000602082019050919050565b6000610fc882610f24565b610fd28185610f2f565b935083602082028501610fe485610f40565b8060005b8581101561102057848403895281516110018582610f9c565b945061100c83610fb0565b925060208a01995050600181019050610fe8565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061106a8383610eeb565b905092915050565b6000602082019050919050565b600061108a82611032565b611094818561103d565b9350836020820285016110a68561104e565b8060005b858110156110e257848403895281516110c3858261105e565b94506110ce83611072565b925060208a019950506001810190506110aa565b50829750879550505050505092915050565b600060a08301600083015184820360008601526111118282610eeb565b9150506020830151848203602086015261112b8282610eeb565b915050604083015184820360408601526111458282610fbd565b9150506060830151848203606086015261115f828261107f565b91505060808301518482036080860152611179828261107f565b9150508091505092915050565b600061119283836110f4565b905092915050565b6000602082019050919050565b60006111b282610e79565b6111bc8185610e84565b9350836020820285016111ce85610e95565b8060005b8581101561120a57848403895281516111eb8582611186565b94506111f68361119a565b925060208a019950506001810190506111d2565b50829750879550505050505092915050565b6000602082019050818103600083015261123681846111a7565b905092915050565b60006020828403121561125457611253610925565b5b600082013567ffffffffffffffff8111156112725761127161092a565b5b61127e84828501610ba6565b91505092915050565b600082825260208201905092915050565b60006112a382610ea5565b6112ad8185611287565b93506112bd818560208601610ec1565b6112c681610a98565b840191505092915050565b600060208201905081810360008301526112eb8184611298565b905092915050565b600080fd5b600060a0828403121561130e5761130d6112f3565b5b81905092915050565b60006020828403121561132d5761132c610925565b5b600082013567ffffffffffffffff81111561134b5761134a61092a565b5b611357848285016112f8565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060408301600083015184820360008601526113a98282610eeb565b915050602083015184820360208601526113c38282610eeb565b9150508091505092915050565b60006113dc838361138c565b905092915050565b6000602082019050919050565b60006113fc82611360565b611406818561136b565b9350836020820285016114188561137c565b8060005b85811015611454578484038952815161143585826113d0565b9450611440836113e4565b925060208a0199505060018101905061141c565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b600061148d82611466565b6114978185611471565b93506114a7818560208601610ec1565b6114b081610a98565b840191505092915050565b6114c481610bde565b82525050565b600060408301600083015184820360008601526114e78282611482565b91505060208301516114fc60208601826114bb565b508091505092915050565b6000604082019050818103600083015261152181856113f1565b9050818103602083015261153581846114ca565b90509392505050565b6000604083016000830151848203600086015261155b8282610eeb565b915050602083015184820360208601526115758282610eeb565b9150508091505092915050565b6000602082019050818103600083015261159c818461153e565b905092915050565b60008083601f8401126115ba576115b961092f565b5b8235905067ffffffffffffffff8111156115d7576115d6610934565b5b6020830191508360208202830111156115f3576115f2610939565b5b9250929050565b6000806020838503121561161157611610610925565b5b600083013567ffffffffffffffff81111561162f5761162e61092a565b5b61163b858286016115a4565b92509250509250929050565b61165081610dfb565b82525050565b60006116628385611287565b935061166f838584610b55565b61167883610a98565b840190509392505050565b61168c81610994565b82525050565b600060a0820190506116a7600083018b611647565b81810360208301526116ba81898b611656565b905081810360408301526116cf818789611656565b905081810360608301526116e4818587611656565b90506116f36080830184611683565b9998505050505050505050565b60008115159050919050565b61171581611700565b811461172057600080fd5b50565b6000815190506117328161170c565b92915050565b60006020828403121561174e5761174d610925565b5b600061175c84828501611723565b91505092915050565b7f4661696c656420746f20696e63726561736520616c6c6f77616e636500000000600082015250565b600061179b601c83611287565b91506117a682611765565b602082019050919050565b600060208201905081810360008301526117ca8161178e565b9050919050565b6040820160008201516117e760008501826114bb565b5060208201516117fa60208501826114bb565b50505050565b600061014082019050818103600083015261181b818c611298565b9050818103602083015261182f818b611298565b90508181036040830152611843818a611298565b90506118526060830189611683565b61185f6080830188611647565b81810360a08301526118718187611298565b905061188060c08301866117d1565b61188e610100830185610db1565b8181036101208301526118a18184611298565b90509a9950505050505050505050565b6000815190506118c081610bf2565b92915050565b6000602082840312156118dc576118db610925565b5b60006118ea848285016118b1565b91505092915050565b60006020820190506119086000830184611647565b92915050565b7f4661696c656420746f207265766f6b6520617070726f76616c00000000000000600082015250565b6000611944601983611287565b915061194f8261190e565b602082019050919050565b6000602082019050818103600083015261197381611937565b9050919050565b600060408201905061198f6000830185611647565b61199c6020830184611647565b9392505050565b600067ffffffffffffffff8211156119be576119bd610aa9565b5b602082029050602081019050919050565b60006119e26119dd84610b24565b610b09565b9050828152602081018484840111156119fe576119fd610a93565b5b611a09848285610ec1565b509392505050565b600082601f830112611a2657611a2561092f565b5b8151611a368482602086016119cf565b91505092915050565b600067ffffffffffffffff821115611a5a57611a59610aa9565b5b602082029050602081019050919050565b600081519050611a7a8161099e565b92915050565b600060408284031215611a9657611a95610bd4565b5b611aa06040610b09565b9050600082015167ffffffffffffffff811115611ac057611abf610bd9565b5b611acc84828501611a11565b6000830152506020611ae084828501611a6b565b60208301525092915050565b6000611aff611afa84611a3f565b610b09565b90508083825260208201905060208402830185811115611b2257611b21610939565b5b835b81811015611b6957805167ffffffffffffffff811115611b4757611b4661092f565b5b808601611b548982611a80565b85526020850194505050602081019050611b24565b5050509392505050565b600082601f830112611b8857611b8761092f565b5b8151611b98848260208601611aec565b91505092915050565b600067ffffffffffffffff821115611bbc57611bbb610aa9565b5b602082029050602081019050919050565b6000611be0611bdb84611ba1565b610b09565b90508083825260208201905060208402830185811115611c0357611c02610939565b5b835b81811015611c4a57805167ffffffffffffffff811115611c2857611c2761092f565b5b808601611c358982611a11565b85526020850194505050602081019050611c05565b5050509392505050565b600082601f830112611c6957611c6861092f565b5b8151611c79848260208601611bcd565b91505092915050565b600060a08284031215611c9857611c97610bd4565b5b611ca260a0610b09565b9050600082015167ffffffffffffffff811115611cc257611cc1610bd9565b5b611cce84828501611a11565b600083015250602082015167ffffffffffffffff811115611cf257611cf1610bd9565b5b611cfe84828501611a11565b602083015250604082015167ffffffffffffffff811115611d2257611d21610bd9565b5b611d2e84828501611b73565b604083015250606082015167ffffffffffffffff811115611d5257611d51610bd9565b5b611d5e84828501611c54565b606083015250608082015167ffffffffffffffff811115611d8257611d81610bd9565b5b611d8e84828501611c54565b60808301525092915050565b6000611dad611da8846119a3565b610b09565b90508083825260208201905060208402830185811115611dd057611dcf610939565b5b835b81811015611e1757805167ffffffffffffffff811115611df557611df461092f565b5b808601611e028982611c82565b85526020850194505050602081019050611dd2565b5050509392505050565b600082601f830112611e3657611e3561092f565b5b8151611e46848260208601611d9a565b91505092915050565b600060208284031215611e6557611e64610925565b5b600082015167ffffffffffffffff811115611e8357611e8261092a565b5b611e8f84828501611e21565b91505092915050565b600060208284031215611eae57611ead610925565b5b600082015167ffffffffffffffff811115611ecc57611ecb61092a565b5b611ed884828501611a11565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112611f0d57611f0c611eeb565b5b83810192508235915060208301925067ffffffffffffffff821115611f3557611f34611ee1565b5b600182023603831315611f4b57611f4a611ee6565b5b509250929050565b6000611f5f8385611471565b9350611f6c838584610b55565b611f7583610a98565b840190509392505050565b6000611f8f6020840184610c09565b905092915050565b600081359050611fa68161170c565b92915050565b6000611fbb6020840184611f97565b905092915050565b611fcc81611700565b82525050565b600060a08301611fe56000840184611ef0565b8583036000870152611ff8838284611f53565b925050506120096020840184611f80565b61201660208601826114bb565b506120246040840184611f80565b61203160408601826114bb565b5061203f6060840184611fac565b61204c6060860182611fc3565b5061205a6080840184611fac565b6120676080860182611fc3565b508091505092915050565b6000602082019050818103600083015261208c8184611fd2565b905092915050565b600067ffffffffffffffff8211156120af576120ae610aa9565b5b602082029050602081019050919050565b6000604082840312156120d6576120d5610bd4565b5b6120e06040610b09565b9050600082015167ffffffffffffffff811115612100576120ff610bd9565b5b61210c84828501611a11565b600083015250602082015167ffffffffffffffff8111156121305761212f610bd9565b5b61213c84828501611a11565b60208301525092915050565b600061215b61215684612094565b610b09565b9050808382526020820190506020840283018581111561217e5761217d610939565b5b835b818110156121c557805167ffffffffffffffff8111156121a3576121a261092f565b5b8086016121b089826120c0565b85526020850194505050602081019050612180565b5050509392505050565b600082601f8301126121e4576121e361092f565b5b81516121f4848260208601612148565b91505092915050565b600067ffffffffffffffff82111561221857612217610aa9565b5b61222182610a98565b9050602081019050919050565b600061224161223c846121fd565b610b09565b90508281526020810184848401111561225d5761225c610a93565b5b612268848285610ec1565b509392505050565b600082601f8301126122855761228461092f565b5b815161229584826020860161222e565b91505092915050565b6000604082840312156122b4576122b3610bd4565b5b6122be6040610b09565b9050600082015167ffffffffffffffff8111156122de576122dd610bd9565b5b6122ea84828501612270565b60008301525060206122fe848285016118b1565b60208301525092915050565b6000806040838503121561232157612320610925565b5b600083015167ffffffffffffffff81111561233f5761233e61092a565b5b61234b858286016121cf565b925050602083015167ffffffffffffffff81111561236c5761236b61092a565b5b6123788582860161229e565b9150509250929050565b60006020828403121561239857612397610925565b5b600082015167ffffffffffffffff8111156123b6576123b561092a565b5b6123c2848285016120c0565b91505092915050565b7f4661696c656420746f20646563726561736520616c6c6f77616e636500000000600082015250565b6000612401601c83611287565b915061240c826123cb565b602082019050919050565b60006020820190508181036000830152612430816123f4565b9050919050565b6000819050919050565b6000808335600160200384360303811261245e5761245d611eeb565b5b83810192508235915060208301925067ffffffffffffffff82111561248657612485611ee1565b5b60018202360383131561249c5761249b611ee6565b5b509250929050565b60006124b08385610eb0565b93506124bd838584610b55565b6124c683610a98565b840190509392505050565b600080833560016020038436030381126124ee576124ed611eeb565b5b83810192508235915060208301925067ffffffffffffffff82111561251657612515611ee1565b5b60208202360383131561252c5761252b611ee6565b5b509250929050565b6000819050919050565b600061254d60208401846109b5565b905092915050565b6000604083016125686000840184612441565b858303600087015261257b8382846124a4565b9250505061258c602084018461253e565b6125996020860182610f50565b508091505092915050565b60006125b08383612555565b905092915050565b6000823560016040038336030381126125d4576125d3611eeb565b5b82810191505092915050565b6000602082019050919050565b60006125f98385610f2f565b93508360208402850161260b84612534565b8060005b8781101561264f57848403895261262682846125b8565b61263085826125a4565b945061263b836125e0565b925060208a0199505060018101905061260f565b50829750879450505050509392505050565b6000808335600160200384360303811261267e5761267d611eeb565b5b83810192508235915060208301925067ffffffffffffffff8211156126a6576126a5611ee1565b5b6020820236038313156126bc576126bb611ee6565b5b509250929050565b6000819050919050565b60006126db8484846124a4565b90509392505050565b6000602082019050919050565b60006126fd838561103d565b93508360208402850161270f846126c4565b8060005b8781101561275557848403895261272a8284612441565b6127358682846126ce565b9550612740846126e4565b935060208b019a505050600181019050612713565b50829750879450505050509392505050565b600060a0830161277a6000840184612441565b858303600087015261278d8382846124a4565b9250505061279e6020840184612441565b85830360208701526127b18382846124a4565b925050506127c260408401846124d1565b85830360408701526127d58382846125ed565b925050506127e66060840184612661565b85830360608701526127f98382846126f1565b9250505061280a6080840184612661565b858303608087015261281d8382846126f1565b925050508091505092915050565b60006128378383612767565b905092915050565b60008235600160a00383360303811261285b5761285a611eeb565b5b82810191505092915050565b6000602082019050919050565b60006128808385610e84565b93508360208402850161289284612437565b8060005b878110156128d65784840389526128ad828461283f565b6128b7858261282b565b94506128c283612867565b925060208a01995050600181019050612896565b50829750879450505050509392505050565b60006040820190506128fd6000830186611647565b8181036020830152612910818486612874565b9050949350505050565b7f4661696c656420746f20706572666f726d20617070726f76616c000000000000600082015250565b6000612950601a83611287565b915061295b8261291a565b602082019050919050565b6000602082019050818103600083015261297f81612943565b905091905056fea2646970667358221220c4fc8b3e524383362758b87771ae0378dd1bdaf5bd1bf9813a42e171bcc4f96864736f6c63430008120033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/tests/nix_tests/test_ics20_precompile.py b/tests/nix_tests/test_ics20_precompile.py index bb4543e6fa..fb36b1bbfe 100644 --- a/tests/nix_tests/test_ics20_precompile.py +++ b/tests/nix_tests/test_ics20_precompile.py @@ -51,7 +51,7 @@ def test_ibc_transfer_from_contract(ibc): # Approve the contract to spend the src_denom approve_tx = pc.functions.approve( - eth_contract.address, [["transfer", "channel-0", [[src_denom, amt]], []]] + eth_contract.address, [["transfer", "channel-0", [[src_denom, amt]], [], []]] ).build_transaction( { "from": ADDRS["signer2"], @@ -156,7 +156,7 @@ def test_ibc_transfer_from_eoa_through_contract(ibc): pc = get_precompile_contract(ibc.chains["evmos"].w3, "ICS20I") # Approve the contract to spend the src_denom approve_tx = pc.functions.approve( - eth_contract.address, [["transfer", "channel-0", [[src_denom, amt]], []]] + eth_contract.address, [["transfer", "channel-0", [[src_denom, amt]], [], []]] ).build_transaction( { "from": ADDRS["signer2"], From 3e835158132ead198a24fdad6739c58c230a34d3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Jun 2024 14:47:59 +0200 Subject: [PATCH 290/345] build(deps): bump bufbuild/buf-setup-action from 1.32.2 to 1.33.0 (#2621) Bumps [bufbuild/buf-setup-action](https://github.com/bufbuild/buf-setup-action) from 1.32.2 to 1.33.0. - [Release notes](https://github.com/bufbuild/buf-setup-action/releases) - [Commits](https://github.com/bufbuild/buf-setup-action/compare/v1.32.2...v1.33.0) --- updated-dependencies: - dependency-name: bufbuild/buf-setup-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- .github/workflows/bsr-push.yml | 2 +- .github/workflows/proto.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/bsr-push.yml b/.github/workflows/bsr-push.yml index 833dd01078..ccd5b5af8b 100644 --- a/.github/workflows/bsr-push.yml +++ b/.github/workflows/bsr-push.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: bufbuild/buf-setup-action@v1.32.2 + - uses: bufbuild/buf-setup-action@v1.33.0 # Push Evmos protos to the Buf Schema Registry - uses: bufbuild/buf-push-action@v1.2.0 with: diff --git a/.github/workflows/proto.yml b/.github/workflows/proto.yml index 7a4ce32204..e1604ef072 100644 --- a/.github/workflows/proto.yml +++ b/.github/workflows/proto.yml @@ -32,7 +32,7 @@ jobs: timeout-minutes: 5 steps: - uses: actions/checkout@v4 - - uses: bufbuild/buf-setup-action@v1.32.2 + - uses: bufbuild/buf-setup-action@v1.33.0 - uses: bufbuild/buf-lint-action@v1 with: input: "proto" @@ -41,7 +41,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: bufbuild/buf-setup-action@v1.32.2 + - uses: bufbuild/buf-setup-action@v1.33.0 - uses: bufbuild/buf-breaking-action@v1 with: input: "proto" From 27a68ee247c55b356bf2210351f0a68b4c2e14b4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Jun 2024 10:36:36 -0300 Subject: [PATCH 291/345] build(deps): bump github.com/gorilla/websocket from 1.5.2 to 1.5.3 (#2620) * build(deps): bump github.com/gorilla/websocket from 1.5.2 to 1.5.3 Bumps [github.com/gorilla/websocket](https://github.com/gorilla/websocket) from 1.5.2 to 1.5.3. - [Release notes](https://github.com/gorilla/websocket/releases) - [Commits](https://github.com/gorilla/websocket/compare/v1.5.2...v1.5.3) --- updated-dependencies: - dependency-name: github.com/gorilla/websocket dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * update gomod2nix.toml file --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 65b80ba784..02c4103b02 100644 --- a/go.mod +++ b/go.mod @@ -25,7 +25,7 @@ require ( github.com/ethereum/go-ethereum v1.11.5 github.com/golang/protobuf v1.5.4 github.com/gorilla/mux v1.8.1 - github.com/gorilla/websocket v1.5.2 + github.com/gorilla/websocket v1.5.3 github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/hashicorp/go-version v1.7.0 github.com/improbable-eng/grpc-web v0.15.0 diff --git a/go.sum b/go.sum index 573c2aae11..169fec1b4e 100644 --- a/go.sum +++ b/go.sum @@ -697,8 +697,8 @@ github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWS github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.2 h1:qoW6V1GT3aZxybsbC6oLnailWnB+qTMVwMreOso9XUw= -github.com/gorilla/websocket v1.5.2/go.mod h1:0n9H61RBAcf5/38py2MCYbxzPIY9rOkpvvMT24Rqs30= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= diff --git a/gomod2nix.toml b/gomod2nix.toml index 2470fa2db7..9f07332e10 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -345,8 +345,8 @@ schema = 3 version = "v1.8.1" hash = "sha256-nDABvAhlYgxUW2N/brrep7NkQXoSGcHhA+XI4+tK0F0=" [mod."github.com/gorilla/websocket"] - version = "v1.5.2" - hash = "sha256-dAKmnxHWkqdyqhkx+xo7kD0dDd26f/V5I4RnGUI0BHc=" + version = "v1.5.3" + hash = "sha256-vTIGEFMEi+30ZdO6ffMNJ/kId6pZs5bbyqov8xe9BM0=" [mod."github.com/grpc-ecosystem/go-grpc-middleware"] version = "v1.4.0" hash = "sha256-0UymBjkg41C9MPqkBLz/ZY9WbimZrabpJk+8C/X63h8=" From 907a7ded9f3f2ad37fed9638094c12d7ec27d12d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jun 2024 09:37:07 -0300 Subject: [PATCH 292/345] build(deps): bump docker/build-push-action from 5 to 6 (#2622) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 5 to 6. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v5...v6) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docker-push.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-push.yml b/.github/workflows/docker-push.yml index 5b32ff7460..8f6d4ccc22 100644 --- a/.github/workflows/docker-push.yml +++ b/.github/workflows/docker-push.yml @@ -36,7 +36,7 @@ jobs: password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Build and push - uses: docker/build-push-action@v5 + uses: docker/build-push-action@v6 with: context: . push: true From d808206c02c1467aeef67146d93645f109deec83 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jun 2024 09:55:22 -0300 Subject: [PATCH 293/345] build(deps): bump github.com/spf13/cobra from 1.8.0 to 1.8.1 (#2623) * build(deps): bump github.com/spf13/cobra from 1.8.0 to 1.8.1 Bumps [github.com/spf13/cobra](https://github.com/spf13/cobra) from 1.8.0 to 1.8.1. - [Release notes](https://github.com/spf13/cobra/releases) - [Commits](https://github.com/spf13/cobra/compare/v1.8.0...v1.8.1) --- updated-dependencies: - dependency-name: github.com/spf13/cobra dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * update gomod2nix.toml file --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- go.mod | 2 +- go.sum | 8 ++++---- gomod2nix.toml | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index 02c4103b02..8e6efe6cf2 100644 --- a/go.mod +++ b/go.mod @@ -37,7 +37,7 @@ require ( github.com/rakyll/statik v0.1.7 github.com/rs/cors v1.11.0 github.com/spf13/cast v1.6.0 - github.com/spf13/cobra v1.8.0 + github.com/spf13/cobra v1.8.1 github.com/spf13/viper v1.18.2 github.com/stretchr/testify v1.9.0 github.com/tidwall/gjson v1.17.1 diff --git a/go.sum b/go.sum index 169fec1b4e..9dfdea429d 100644 --- a/go.sum +++ b/go.sum @@ -389,8 +389,8 @@ github.com/cosmos/ledger-cosmos-go v0.12.4/go.mod h1:fjfVWRf++Xkygt9wzCsjEBdjcf7 github.com/cosmos/rosetta-sdk-go v0.10.0 h1:E5RhTruuoA7KTIXUcMicL76cffyeoyvNybzUGSKFTcM= github.com/cosmos/rosetta-sdk-go v0.10.0/go.mod h1:SImAZkb96YbwvoRkzSMQB6noNJXFgWl/ENIznEoYQI4= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creachadair/taskgroup v0.4.2 h1:jsBLdAJE42asreGss2xZGZ8fJra7WtwnHWeJFxv2Li8= github.com/creachadair/taskgroup v0.4.2/go.mod h1:qiXUOSrbwAY3u0JPGTzObbE3yf9hcXHDKBZ2ZjpCbgM= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= @@ -1063,8 +1063,8 @@ github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNo github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= -github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= diff --git a/gomod2nix.toml b/gomod2nix.toml index 9f07332e10..c2ab6ac536 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -567,8 +567,8 @@ schema = 3 version = "v1.6.0" hash = "sha256-hxioqRZfXE0AE5099wmn3YG0AZF8Wda2EB4c7zHF6zI=" [mod."github.com/spf13/cobra"] - version = "v1.8.0" - hash = "sha256-oAE+fEaRfZPE541IPWE0GMeBBYgH2DMhtZNxzp7DFlY=" + version = "v1.8.1" + hash = "sha256-yDF6yAHycV1IZOrt3/hofR+QINe+B2yqkcIaVov3Ky8=" [mod."github.com/spf13/pflag"] version = "v1.0.5" hash = "sha256-w9LLYzxxP74WHT4ouBspH/iQZXjuAh2WQCHsuvyEjAw=" From 39195bf2f0af7892a7f1c30451faadba7f6835d2 Mon Sep 17 00:00:00 2001 From: GnaD <89174180+GNaD13@users.noreply.github.com> Date: Mon, 17 Jun 2024 21:37:51 +0700 Subject: [PATCH 294/345] Change anteutils.TxFeeChecker to authante.TxFeeChecker (#2619) * change back to use cosmos TxFeeChecker type instead of utils type * remove unused code * nit * nit * add change log --- CHANGELOG.md | 1 + app/ante/cosmos/fees.go | 11 ++++++++--- app/ante/evm/fee_checker.go | 9 ++++++--- app/ante/handler_options.go | 2 +- app/ante/utils/fee_checker.go | 9 --------- 5 files changed, 16 insertions(+), 16 deletions(-) delete mode 100644 app/ante/utils/fee_checker.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f91a00478..2da37b43e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -104,6 +104,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (evm) [#2594](https://github.com/evmos/evmos/pull/2594) Move `CallEVM` and `CallEVMWithData` to `x/evm` module. - (app) [#2597](https://github.com/evmos/evmos/pull/2597) Remove hardcoded Bech32 conversions for blocked precompile addresses. - (contracts) [#2613](https://github.com/evmos/evmos/pull/2613) Remove unused contract and make script useable with Python <3.12. +- (ante) [#2619](https://github.com/evmos/evmos/pull/2619) Change anteutils.TxFeeChecker to authante.TxFeeChecker ## [v18.1.0](https://github.com/evmos/evmos/releases/tag/v18.1.0) - 2024-05-31 diff --git a/app/ante/cosmos/fees.go b/app/ante/cosmos/fees.go index d1ee412d24..33f42d9c3d 100644 --- a/app/ante/cosmos/fees.go +++ b/app/ante/cosmos/fees.go @@ -29,7 +29,7 @@ type DeductFeeDecorator struct { distributionKeeper anteutils.DistributionKeeper feegrantKeeper authante.FeegrantKeeper stakingKeeper anteutils.StakingKeeper - txFeeChecker anteutils.TxFeeChecker + txFeeChecker authante.TxFeeChecker } // NewDeductFeeDecorator returns a new DeductFeeDecorator. @@ -39,7 +39,7 @@ func NewDeductFeeDecorator( dk anteutils.DistributionKeeper, fk authante.FeegrantKeeper, sk anteutils.StakingKeeper, - tfc anteutils.TxFeeChecker, + tfc authante.TxFeeChecker, ) DeductFeeDecorator { if tfc == nil { tfc = checkTxFeeWithValidatorMinGasPrices @@ -161,7 +161,12 @@ func deductFeesFromBalanceOrUnclaimedStakingRewards( // checkTxFeeWithValidatorMinGasPrices implements the default fee logic, where the minimum price per // unit of gas is fixed and set by each validator, and the tx priority is computed from the gas price. -func checkTxFeeWithValidatorMinGasPrices(ctx sdk.Context, feeTx sdk.FeeTx) (sdk.Coins, int64, error) { +func checkTxFeeWithValidatorMinGasPrices(ctx sdk.Context, tx sdk.Tx) (sdk.Coins, int64, error) { + feeTx, ok := tx.(sdk.FeeTx) + if !ok { + return sdk.Coins{}, 0, errorsmod.Wrap(errortypes.ErrTxDecode, "Tx must be a FeeTx") + } + feeCoins := feeTx.GetFee() gas := feeTx.GetGas() diff --git a/app/ante/evm/fee_checker.go b/app/ante/evm/fee_checker.go index 0b45d68f6c..6efb9fcfbf 100644 --- a/app/ante/evm/fee_checker.go +++ b/app/ante/evm/fee_checker.go @@ -12,7 +12,6 @@ import ( errortypes "github.com/cosmos/cosmos-sdk/types/errors" authante "github.com/cosmos/cosmos-sdk/x/auth/ante" "github.com/ethereum/go-ethereum/params" - anteutils "github.com/evmos/evmos/v18/app/ante/utils" evmostypes "github.com/evmos/evmos/v18/types" "github.com/evmos/evmos/v18/x/evm/types" ) @@ -25,8 +24,12 @@ import ( // - when `ExtensionOptionDynamicFeeTx` is omitted, `tipFeeCap` defaults to `MaxInt64`. // - when london hardfork is not enabled, it falls back to SDK default behavior (validator min-gas-prices). // - Tx priority is set to `effectiveGasPrice / DefaultPriorityReduction`. -func NewDynamicFeeChecker(k DynamicFeeEVMKeeper) anteutils.TxFeeChecker { - return func(ctx sdk.Context, feeTx sdk.FeeTx) (sdk.Coins, int64, error) { +func NewDynamicFeeChecker(k DynamicFeeEVMKeeper) authante.TxFeeChecker { + return func(ctx sdk.Context, tx sdk.Tx) (sdk.Coins, int64, error) { + feeTx, ok := tx.(sdk.FeeTx) + if !ok { + return sdk.Coins{}, 0, errorsmod.Wrap(errortypes.ErrTxDecode, "Tx must be a FeeTx") + } // TODO: in the e2e test, if the fee in the genesis transaction meet the baseFee and minGasPrice in the feemarket, we can remove this code if ctx.BlockHeight() == 0 { // genesis transactions: fallback to min-gas-price logic diff --git a/app/ante/handler_options.go b/app/ante/handler_options.go index 06401f030b..216ca394c0 100644 --- a/app/ante/handler_options.go +++ b/app/ante/handler_options.go @@ -35,7 +35,7 @@ type HandlerOptions struct { SignModeHandler authsigning.SignModeHandler SigGasConsumer func(meter storetypes.GasMeter, sig signing.SignatureV2, params authtypes.Params) error MaxTxGasWanted uint64 - TxFeeChecker anteutils.TxFeeChecker + TxFeeChecker ante.TxFeeChecker } // Validate checks if the keepers are defined diff --git a/app/ante/utils/fee_checker.go b/app/ante/utils/fee_checker.go deleted file mode 100644 index 4e787dd4bb..0000000000 --- a/app/ante/utils/fee_checker.go +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) -package utils - -import sdk "github.com/cosmos/cosmos-sdk/types" - -// TxFeeChecker check if the provided fee is enough and returns the effective fee and tx priority, -// the effective fee should be deducted later, and the priority should be returned in abci response. -type TxFeeChecker func(ctx sdk.Context, feeTx sdk.FeeTx) (sdk.Coins, int64, error) From c750e00859cbc0796d23e99b888fdc4ca4e05adf Mon Sep 17 00:00:00 2001 From: stepit <48993133+0xstepit@users.noreply.github.com> Date: Wed, 19 Jun 2024 09:58:07 +0200 Subject: [PATCH 295/345] chore: clean changelog (#2628) remove duplicate and fix style --- CHANGELOG.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2da37b43e7..01a01eb868 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -54,7 +54,6 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (upgrade) [#2533](https://github.com/evmos/evmos/pull/2533) Add upgrade handler for v19. - (staking) [#2051](https://github.com/evmos/evmos/pull/2051) Implement the `EditValidator` function for staking precompiled contract. - (app) [#2556](https://github.com/evmos/evmos/pull/2556) Bump IBC-go to v7.5.2 and Cosmos-SDK to v0.47.11. -- (evm) [#2373](https://github.com/evmos/evmos/pull/2373) Remove check on hardcoded ChainID identifier. - (precompiles) [#2572](https://github.com/evmos/evmos/pull/2572) Add `FundCommunityPool` precompile tx for distribution module. - (evm) [#2538](https://github.com/evmos/evmos/pull/2538) Add Permissions Policy for permissioned EVM. - (erc20) [#2609](https://github.com/evmos/evmos/pull/2609) Remove STRv2 tracking logic. @@ -104,7 +103,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (evm) [#2594](https://github.com/evmos/evmos/pull/2594) Move `CallEVM` and `CallEVMWithData` to `x/evm` module. - (app) [#2597](https://github.com/evmos/evmos/pull/2597) Remove hardcoded Bech32 conversions for blocked precompile addresses. - (contracts) [#2613](https://github.com/evmos/evmos/pull/2613) Remove unused contract and make script useable with Python <3.12. -- (ante) [#2619](https://github.com/evmos/evmos/pull/2619) Change anteutils.TxFeeChecker to authante.TxFeeChecker +- (ante) [#2619](https://github.com/evmos/evmos/pull/2619) Change anteutils.TxFeeChecker to authante.TxFeeChecker. ## [v18.1.0](https://github.com/evmos/evmos/releases/tag/v18.1.0) - 2024-05-31 From e0470c28cd8d58b81e18ffef6a3af9a310453d43 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Jun 2024 11:09:19 -0300 Subject: [PATCH 296/345] build(deps): bump github.com/cosmos/ibc-go/v7 from 7.5.2-0.20240607065443-0f1cf8bf766b to 7.6.0 (#2631) * build(deps): bump github.com/cosmos/ibc-go/v7 Bumps [github.com/cosmos/ibc-go/v7](https://github.com/cosmos/ibc-go) from 7.5.2-0.20240607065443-0f1cf8bf766b to 7.6.0. - [Release notes](https://github.com/cosmos/ibc-go/releases) - [Changelog](https://github.com/cosmos/ibc-go/blob/v7.6.0/CHANGELOG.md) - [Commits](https://github.com/cosmos/ibc-go/commits/v7.6.0) --- updated-dependencies: - dependency-name: github.com/cosmos/ibc-go/v7 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * update gomod2nix.toml file * bump sdk and add chlog entry --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] Co-authored-by: tom --- CHANGELOG.md | 1 + go.mod | 6 +++--- go.sum | 8 ++++---- gomod2nix.toml | 8 ++++---- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 01a01eb868..2da734c2d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -58,6 +58,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (evm) [#2538](https://github.com/evmos/evmos/pull/2538) Add Permissions Policy for permissioned EVM. - (erc20) [#2609](https://github.com/evmos/evmos/pull/2609) Remove STRv2 tracking logic. - (distribution-precompile) [#2614](https://github.com/evmos/evmos/pull/2614) Add withdrawer address check in transactions. +- (app) [#2631](https://github.com/evmos/evmos/pull/2631) Bump IBC-go to v7.6.0 and Cosmos-SDK to v0.47.12. ### Bug Fixes diff --git a/go.mod b/go.mod index 8e6efe6cf2..06cf397955 100644 --- a/go.mod +++ b/go.mod @@ -14,10 +14,10 @@ require ( github.com/cometbft/cometbft v0.37.5 github.com/cometbft/cometbft-db v0.12.0 github.com/cosmos/cosmos-proto v1.0.0-beta.5 - github.com/cosmos/cosmos-sdk v0.47.11 + github.com/cosmos/cosmos-sdk v0.47.12 github.com/cosmos/go-bip39 v1.0.0 github.com/cosmos/gogoproto v1.4.10 - github.com/cosmos/ibc-go/v7 v7.5.2-0.20240607065443-0f1cf8bf766b + github.com/cosmos/ibc-go/v7 v7.6.0 github.com/crypto-org-chain/cronos/memiavl v0.0.5-0.20240129013154-12efd9b7643f github.com/crypto-org-chain/cronos/store v0.0.5-0.20240129013154-12efd9b7643f github.com/crypto-org-chain/cronos/versiondb v0.0.0-20240129013154-12efd9b7643f @@ -259,7 +259,7 @@ replace ( // use cosmos fork of keyring github.com/99designs/keyring => github.com/cosmos/keyring v1.2.0 // use Cosmos-SDK fork to enable Ledger functionality - github.com/cosmos/cosmos-sdk => github.com/evmos/cosmos-sdk v0.47.11-evmos + github.com/cosmos/cosmos-sdk => github.com/evmos/cosmos-sdk v0.47.12-evmos // use Evmos geth fork github.com/ethereum/go-ethereum => github.com/evmos/go-ethereum v1.10.26-evmos-rc4 // Security Advisory https://github.com/advisories/GHSA-h395-qcrw-5vmq diff --git a/go.sum b/go.sum index 9dfdea429d..29830b742f 100644 --- a/go.sum +++ b/go.sum @@ -378,8 +378,8 @@ github.com/cosmos/gogoproto v1.4.10 h1:QH/yT8X+c0F4ZDacDv3z+xE3WU1P1Z3wQoLMBRJoK github.com/cosmos/gogoproto v1.4.10/go.mod h1:3aAZzeRWpAwr+SS/LLkICX2/kDFyaYVzckBDzygIxek= github.com/cosmos/iavl v0.21.0-alpha.1.0.20230904092046-df3db2d96583 h1:3Matt7/LjZiZkIBPalYazOZcw2B05Ch14dU5TJyqJEc= github.com/cosmos/iavl v0.21.0-alpha.1.0.20230904092046-df3db2d96583/go.mod h1:WO7FyvaZJoH65+HFOsDir7xU9FWk2w9cHXNW1XHcl7A= -github.com/cosmos/ibc-go/v7 v7.5.2-0.20240607065443-0f1cf8bf766b h1:Lm2UaIiBDQfs5wcLIrgxKsSHFcUFMVQ5vwGm1KMhZr0= -github.com/cosmos/ibc-go/v7 v7.5.2-0.20240607065443-0f1cf8bf766b/go.mod h1:ktFg5GvKOyrGCqTWtW7Grj5uweU4ZapxrNeVS1CLLbo= +github.com/cosmos/ibc-go/v7 v7.6.0 h1:S1G5hcIVe9go+jQV6F9+I9yy+hylbJeLiVHUmktQNrM= +github.com/cosmos/ibc-go/v7 v7.6.0/go.mod h1:LifBA7JHRHl95ujjHIaBEHmUqy2qCGyqDCXB7qmAsZk= github.com/cosmos/ics23/go v0.10.0 h1:iXqLLgp2Lp+EdpIuwXTYIQU+AiHj9mOC2X9ab++bZDM= github.com/cosmos/ics23/go v0.10.0/go.mod h1:ZfJSmng/TBNTBkFemHHHj5YY7VAU/MBU980F4VU1NG0= github.com/cosmos/keyring v1.2.0 h1:8C1lBP9xhImmIabyXW4c3vFjjLiBdGCmfLUfeZlV1Yo= @@ -466,8 +466,8 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.m github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evmos/cosmos-sdk v0.47.11-evmos h1:v7q/YdkSmCpDrymqeQf13iIx0Bez5fgt3BYVnN2Yjb0= -github.com/evmos/cosmos-sdk v0.47.11-evmos/go.mod h1:ADjORYzUQqQv/FxDi0H0K5gW/rAk1CiDR3ZKsExfJV0= +github.com/evmos/cosmos-sdk v0.47.12-evmos h1:XyKyNboK9fLTjlY798KyfeaNxFjMIICGXNuibIALrTU= +github.com/evmos/cosmos-sdk v0.47.12-evmos/go.mod h1:ADjORYzUQqQv/FxDi0H0K5gW/rAk1CiDR3ZKsExfJV0= github.com/evmos/go-ethereum v1.10.26-evmos-rc4 h1:vwDVMScuB2KSu8ze5oWUuxm6v3bMUp6dL3PWvJNJY+I= github.com/evmos/go-ethereum v1.10.26-evmos-rc4/go.mod h1:/6CsT5Ceen2WPLI/oCA3xMcZ5sWMF/D46SjM/ayY0Oo= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= diff --git a/gomod2nix.toml b/gomod2nix.toml index c2ab6ac536..f9c87649d5 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -150,8 +150,8 @@ schema = 3 version = "v1.0.0-beta.5" hash = "sha256-Fy/PbsOsd6iq0Njy3DVWK6HqWsogI+MkE8QslHGWyVg=" [mod."github.com/cosmos/cosmos-sdk"] - version = "v0.47.11-evmos" - hash = "sha256-endMjF3Y/4SK7sQraCQu3e9ciJx/deRyMlZpZVYXe38=" + version = "v0.47.12-evmos" + hash = "sha256-NqLa1Hu73zdv1yrdnppIK77RZRXpPV1MPs2pspff58g=" replaced = "github.com/evmos/cosmos-sdk" [mod."github.com/cosmos/go-bip39"] version = "v1.0.0" @@ -166,8 +166,8 @@ schema = 3 version = "v0.21.0-alpha.1.0.20230904092046-df3db2d96583" hash = "sha256-3Va8Ljq63IXty0oHlRpqfsC6WsMut6TWZ2R+/nYtfTU=" [mod."github.com/cosmos/ibc-go/v7"] - version = "v7.5.2-0.20240607065443-0f1cf8bf766b" - hash = "sha256-SH4ZcEWQ1bNuRBj1Kj3r3kPoWJmeOtmb8b/YVGf1JsY=" + version = "v7.6.0" + hash = "sha256-D8INM5nN/d1oL/jAeua9XVX1Aasuv3ZxhOUF9vWcCls=" [mod."github.com/cosmos/ics23/go"] version = "v0.10.0" hash = "sha256-KYEv727BO/ht63JO02xiKFGFAddg41Ve9l2vSSZZBq0=" From d2cad75c2cdefbd095b132a08a391af50262b48f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Jun 2024 14:25:27 -0300 Subject: [PATCH 297/345] build(deps-dev): bump ws from 7.5.9 to 7.5.10 in /contracts in the npm_and_yarn group across 1 directory (#2634) build(deps-dev): bump ws Bumps the npm_and_yarn group with 1 update in the /contracts directory: [ws](https://github.com/websockets/ws). Updates `ws` from 7.5.9 to 7.5.10 - [Release notes](https://github.com/websockets/ws/releases) - [Commits](https://github.com/websockets/ws/compare/7.5.9...7.5.10) --- updated-dependencies: - dependency-name: ws dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- contracts/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/package-lock.json b/contracts/package-lock.json index c13e990ac4..c577335051 100644 --- a/contracts/package-lock.json +++ b/contracts/package-lock.json @@ -3417,9 +3417,9 @@ "dev": true }, "node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "engines": { "node": ">=8.3.0" From c6f7fcf208666ab8ca57e0ccff712cf8920a4e7d Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Fri, 21 Jun 2024 14:49:02 +0200 Subject: [PATCH 298/345] imp(tests): Add function to get ERC-20 balance to integration utils (#2635) * add get erc20 balance util * add changelog entry * add missing license --- CHANGELOG.md | 1 + testutil/integration/evmos/utils/evm.go | 53 ++++++++++++++++ testutil/integration/evmos/utils/evm_test.go | 64 ++++++++++++++++++++ 3 files changed, 118 insertions(+) create mode 100644 testutil/integration/evmos/utils/evm.go create mode 100644 testutil/integration/evmos/utils/evm_test.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 2da734c2d7..c6005a945f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -105,6 +105,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (app) [#2597](https://github.com/evmos/evmos/pull/2597) Remove hardcoded Bech32 conversions for blocked precompile addresses. - (contracts) [#2613](https://github.com/evmos/evmos/pull/2613) Remove unused contract and make script useable with Python <3.12. - (ante) [#2619](https://github.com/evmos/evmos/pull/2619) Change anteutils.TxFeeChecker to authante.TxFeeChecker. +- (tests) [#2635](https://github.com/evmos/evmos/pull/2635) Add function to get ERC-20 balance to integration utils. ## [v18.1.0](https://github.com/evmos/evmos/releases/tag/v18.1.0) - 2024-05-31 diff --git a/testutil/integration/evmos/utils/evm.go b/testutil/integration/evmos/utils/evm.go new file mode 100644 index 0000000000..a042adc5c8 --- /dev/null +++ b/testutil/integration/evmos/utils/evm.go @@ -0,0 +1,53 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package utils + +import ( + "encoding/json" + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/evmos/evmos/v18/contracts" + "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" +) + +// GetERC20Balance returns the token balance of a given account address for +// an ERC-20 token at the given contract address. +func GetERC20Balance(nw network.Network, tokenAddress, accountAddress common.Address) (*big.Int, error) { + input, err := contracts.ERC20MinterBurnerDecimalsContract.ABI.Pack( + "balanceOf", + accountAddress, + ) + if err != nil { + return nil, err + } + + callData, err := json.Marshal(evmtypes.TransactionArgs{ + To: &tokenAddress, + Input: (*hexutil.Bytes)(&input), + }) + if err != nil { + return nil, err + } + + ethRes, err := nw.GetEvmClient().EthCall( + nw.GetContext(), + &evmtypes.EthCallRequest{ + Args: callData, + }, + ) + if err != nil { + return nil, err + } + + var balance *big.Int + err = contracts.ERC20MinterBurnerDecimalsContract.ABI.UnpackIntoInterface(&balance, "balanceOf", ethRes.Ret) + if err != nil { + return nil, err + } + + return balance, nil +} diff --git a/testutil/integration/evmos/utils/evm_test.go b/testutil/integration/evmos/utils/evm_test.go new file mode 100644 index 0000000000..5a817746bf --- /dev/null +++ b/testutil/integration/evmos/utils/evm_test.go @@ -0,0 +1,64 @@ +package utils_test + +import ( + "math/big" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/evmos/evmos/v18/contracts" + testfactory "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" + testhandler "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" + testnetwork "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + "github.com/evmos/evmos/v18/testutil/integration/evmos/utils" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/stretchr/testify/require" +) + +func TestGetERC20Balance(t *testing.T) { + keyring := testkeyring.New(1) + network := testnetwork.NewUnitTestNetwork( + testnetwork.WithPreFundedAccounts(keyring.GetAllAccAddrs()...), + ) + handler := testhandler.NewIntegrationHandler(network) + factory := testfactory.New(network, handler) + + sender := keyring.GetKey(0) + mintAmount := big.NewInt(100) + + // Deploy an ERC-20 contract + erc20Addr, err := factory.DeployContract( + sender.Priv, + evmtypes.EvmTxArgs{}, + testfactory.ContractDeploymentData{ + Contract: contracts.ERC20MinterBurnerDecimalsContract, + ConstructorArgs: []interface{}{"TestToken", "TT", uint8(18)}, + }, + ) + require.NoError(t, err, "failed to deploy contract") + require.NoError(t, network.NextBlock(), "failed to advance block") + + balance, err := utils.GetERC20Balance(network, erc20Addr, sender.Addr) + require.NoError(t, err, "failed to get ERC20 balance") + require.Equal(t, common.Big0.Int64(), balance.Int64(), "expected no balance before minting") + + // Mint some tokens + _, err = factory.ExecuteContractCall( + sender.Priv, + evmtypes.EvmTxArgs{ + To: &erc20Addr, + }, + testfactory.CallArgs{ + ContractABI: contracts.ERC20MinterBurnerDecimalsContract.ABI, + MethodName: "mint", + Args: []interface{}{sender.Addr, mintAmount}, + }, + ) + require.NoError(t, err, "failed to mint tokens") + + require.NoError(t, network.NextBlock(), "failed to advance block") + + balance, err = utils.GetERC20Balance(network, erc20Addr, sender.Addr) + require.NoError(t, err, "failed to get ERC20 balance") + require.Equal(t, mintAmount.Int64(), balance.Int64(), "expected different balance after minting") +} From 49cab07c39f64be0b260d67423c12380a475ce4f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Jun 2024 09:12:17 -0300 Subject: [PATCH 299/345] build(deps): bump bufbuild/buf-setup-action from 1.33.0 to 1.34.0 (#2637) Bumps [bufbuild/buf-setup-action](https://github.com/bufbuild/buf-setup-action) from 1.33.0 to 1.34.0. - [Release notes](https://github.com/bufbuild/buf-setup-action/releases) - [Commits](https://github.com/bufbuild/buf-setup-action/compare/v1.33.0...v1.34.0) --- updated-dependencies: - dependency-name: bufbuild/buf-setup-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/bsr-push.yml | 2 +- .github/workflows/proto.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/bsr-push.yml b/.github/workflows/bsr-push.yml index ccd5b5af8b..cf819ab79f 100644 --- a/.github/workflows/bsr-push.yml +++ b/.github/workflows/bsr-push.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: bufbuild/buf-setup-action@v1.33.0 + - uses: bufbuild/buf-setup-action@v1.34.0 # Push Evmos protos to the Buf Schema Registry - uses: bufbuild/buf-push-action@v1.2.0 with: diff --git a/.github/workflows/proto.yml b/.github/workflows/proto.yml index e1604ef072..6f8848fbc5 100644 --- a/.github/workflows/proto.yml +++ b/.github/workflows/proto.yml @@ -32,7 +32,7 @@ jobs: timeout-minutes: 5 steps: - uses: actions/checkout@v4 - - uses: bufbuild/buf-setup-action@v1.33.0 + - uses: bufbuild/buf-setup-action@v1.34.0 - uses: bufbuild/buf-lint-action@v1 with: input: "proto" @@ -41,7 +41,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: bufbuild/buf-setup-action@v1.33.0 + - uses: bufbuild/buf-setup-action@v1.34.0 - uses: bufbuild/buf-breaking-action@v1 with: input: "proto" From a5d5a9ed79c0dfcf5bd683284983648a4f2444a3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Jun 2024 13:25:26 +0000 Subject: [PATCH 300/345] build(deps): bump github.com/linxGnu/grocksdb from 1.9.1 to 1.9.2 (#2638) * build(deps): bump github.com/linxGnu/grocksdb from 1.9.1 to 1.9.2 Bumps [github.com/linxGnu/grocksdb](https://github.com/linxGnu/grocksdb) from 1.9.1 to 1.9.2. - [Release notes](https://github.com/linxGnu/grocksdb/releases) - [Commits](https://github.com/linxGnu/grocksdb/compare/v1.9.1...v1.9.2) --- updated-dependencies: - dependency-name: github.com/linxGnu/grocksdb dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * update gomod2nix.toml file * update rocksdb version --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: tom --- Dockerfile | 2 +- Makefile | 2 +- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- nix/rocksdb.nix | 4 ++-- scripts/install_librocksdb.sh | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Dockerfile b/Dockerfile index 9e5daa08b4..f8e760afcb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ FROM golang:1.22.4-alpine3.20 AS build-env ARG DB_BACKEND=goleveldb -ARG ROCKSDB_VERSION="9.1.1" +ARG ROCKSDB_VERSION="9.2.1" WORKDIR /go/src/github.com/evmos/evmos diff --git a/Makefile b/Makefile index 013c90967f..21babdbf21 100644 --- a/Makefile +++ b/Makefile @@ -26,7 +26,7 @@ DOCKER_TAG := $(COMMIT_HASH) # e2e env MOUNT_PATH := $(shell pwd)/build/:/root/ E2E_SKIP_CLEANUP := false -ROCKSDB_VERSION ?= "9.1.1" +ROCKSDB_VERSION ?= "9.2.1" # Deps DEPS_COSMOS_SDK_VERSION := $(shell cat go.sum | grep 'github.com/evmos/cosmos-sdk' | grep -v -e 'go.mod' | tail -n 1 | awk '{ print $$2; }') DEPS_IBC_GO_VERSION := $(shell cat go.sum | grep 'github.com/cosmos/ibc-go' | grep -v -e 'go.mod' | tail -n 1 | awk '{ print $$2; }') diff --git a/go.mod b/go.mod index 06cf397955..47d0fcd4db 100644 --- a/go.mod +++ b/go.mod @@ -29,7 +29,7 @@ require ( github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/hashicorp/go-version v1.7.0 github.com/improbable-eng/grpc-web v0.15.0 - github.com/linxGnu/grocksdb v1.9.1 + github.com/linxGnu/grocksdb v1.9.2 github.com/onsi/ginkgo/v2 v2.19.0 github.com/onsi/gomega v1.33.1 github.com/ory/dockertest/v3 v3.10.0 diff --git a/go.sum b/go.sum index 29830b742f..183916f83b 100644 --- a/go.sum +++ b/go.sum @@ -841,8 +841,8 @@ github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6 github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/linxGnu/grocksdb v1.9.1 h1:LmwuHzsWglxJrIES9jvS2O1xTPD2nnKYhAQDx5dIyRo= -github.com/linxGnu/grocksdb v1.9.1/go.mod h1:QYiYypR2d4v63Wj1adOOfzglnoII0gLj3PNh4fZkcFA= +github.com/linxGnu/grocksdb v1.9.2 h1:O3mzvO0wuzQ9mtlHbDrShixyVjVbmuqTjFrzlf43wZ8= +github.com/linxGnu/grocksdb v1.9.2/go.mod h1:QYiYypR2d4v63Wj1adOOfzglnoII0gLj3PNh4fZkcFA= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= diff --git a/gomod2nix.toml b/gomod2nix.toml index f9c87649d5..2f83cb796f 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -435,8 +435,8 @@ schema = 3 version = "v0.1.0" hash = "sha256-wQqGTtRWsfR9n0O/SXHVgECebbnNmHddxJIbG63OJBQ=" [mod."github.com/linxGnu/grocksdb"] - version = "v1.9.1" - hash = "sha256-yRSGvZ5YeDqGOEmGPRSKxPjNoCQ/Xk/DMtNtutkbPGg=" + version = "v1.9.2" + hash = "sha256-ThXtaXx6LvRIFW4xLHsMrVWdsN2qobLPA0InLmlADOM=" [mod."github.com/magiconair/properties"] version = "v1.8.7" hash = "sha256-XQ2bnc2s7/IH3WxEO4GishZurMyKwEclZy1DXg+2xXc=" diff --git a/nix/rocksdb.nix b/nix/rocksdb.nix index 5195a55ce3..f2d6abe8af 100644 --- a/nix/rocksdb.nix +++ b/nix/rocksdb.nix @@ -17,13 +17,13 @@ stdenv.mkDerivation rec { pname = "rocksdb"; - version = "9.1.1"; + version = "9.2.1"; src = fetchFromGitHub { owner = "facebook"; repo = pname; rev = "v${version}"; - sha256 = "sha256-/Xf0bzNJPclH9IP80QNaABfhj4IAR5LycYET18VFCXc="; + sha256 = "sha256-Zifn5Gu/4h6TaEqSaWQ2mFdryeAarqbHWW3fKUGGFac="; }; nativeBuildInputs = [ cmake ninja ]; diff --git a/scripts/install_librocksdb.sh b/scripts/install_librocksdb.sh index dafade95a5..dfb89bfe01 100755 --- a/scripts/install_librocksdb.sh +++ b/scripts/install_librocksdb.sh @@ -1,6 +1,6 @@ #!/bin/bash -ROCKSDB_VERSION=${1:-"9.1.1"} +ROCKSDB_VERSION=${1:-"9.2.1"} # Check if RocksDB is already installed if [[ $(find /usr/lib -name "librocksdb.so.${ROCKSDB_VERSION}" -print -quit) ]]; then From ac4f4deae1196b794d5aafa618dbb2fd3b9e35b1 Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Tue, 25 Jun 2024 17:47:25 +0200 Subject: [PATCH 301/345] fix(ci): Ignore Swagger docs in CheckOV linter (#2639) * ignore client folder in checkov CI * add changelog entry * add minor change in go file to trigger cla flow --- .checkov.yml | 2 ++ CHANGELOG.md | 1 + app/ante/ante.go | 1 + 3 files changed, 4 insertions(+) create mode 100644 .checkov.yml diff --git a/.checkov.yml b/.checkov.yml new file mode 100644 index 0000000000..5fcbcdfe79 --- /dev/null +++ b/.checkov.yml @@ -0,0 +1,2 @@ +skip-path: + - client diff --git a/CHANGELOG.md b/CHANGELOG.md index c6005a945f..43c37dd0bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -106,6 +106,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (contracts) [#2613](https://github.com/evmos/evmos/pull/2613) Remove unused contract and make script useable with Python <3.12. - (ante) [#2619](https://github.com/evmos/evmos/pull/2619) Change anteutils.TxFeeChecker to authante.TxFeeChecker. - (tests) [#2635](https://github.com/evmos/evmos/pull/2635) Add function to get ERC-20 balance to integration utils. +- (ci) [#2639](https://github.com/evmos/evmos/pull/2639) Ignore Swagger JSON in CheckOV linter. ## [v18.1.0](https://github.com/evmos/evmos/releases/tag/v18.1.0) - 2024-05-31 diff --git a/app/ante/ante.go b/app/ante/ante.go index ee7c215a22..345a7c790d 100644 --- a/app/ante/ante.go +++ b/app/ante/ante.go @@ -1,5 +1,6 @@ // Copyright Tharsis Labs Ltd.(Evmos) // SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + package ante import ( From c02f81d051242f9152c03a02b682cf9e774a4769 Mon Sep 17 00:00:00 2001 From: Amine <34750005+Aminechakr@users.noreply.github.com> Date: Wed, 26 Jun 2024 10:51:59 +0100 Subject: [PATCH 302/345] Add: Support PebbleDB image (#2630) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add: config & workflow step for building pebble images * test: comment out GIT_DIFF condition in build workflow * Revert "test: comment out GIT_DIFF condition in build workflow" * test: force a workflow trigger to push test images * Revert "test: force a workflow trigger to push test images" * docs: update changelog * Update: lint * Revert: build.yml * Update CHANGELOG.md Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Signed-off-by: Amine <34750005+Aminechakr@users.noreply.github.com> --------- Signed-off-by: Amine <34750005+Aminechakr@users.noreply.github.com> Signed-off-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> --- .github/workflows/build.yml | 2 +- .github/workflows/docker-push.yml | 37 +++++++++++++++++++------------ CHANGELOG.md | 1 + Makefile | 19 ++++++++++++---- 4 files changed, 40 insertions(+), 19 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c9232f583e..b3cd9c94d4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -4,7 +4,7 @@ on: branches: - main - release/** - + permissions: read-all jobs: diff --git a/.github/workflows/docker-push.yml b/.github/workflows/docker-push.yml index 8f6d4ccc22..e99b85f06b 100644 --- a/.github/workflows/docker-push.yml +++ b/.github/workflows/docker-push.yml @@ -10,35 +10,44 @@ jobs: docker: runs-on: ubuntu-latest steps: - - - name: Checkout + - name: Checkout uses: actions/checkout@v4 - - - name: Git fetch everything + + - name: Git fetch everything run: git fetch --prune --unshallow - - - name: Get Github tag + + - name: Get Github tag id: meta run: | echo "tag=$(git describe --always --tags --match='v*')" >> "$GITHUB_OUTPUT" - - - name: Set up QEMU + + - name: Set up QEMU uses: docker/setup-qemu-action@v3 - - - name: Set up Docker Buildx + + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - - - name: Login to DockerHub + + - name: Login to DockerHub uses: docker/login-action@v3 with: registry: docker.io username: tharsishq password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Build and push + + - name: Build and push goleveldb image uses: docker/build-push-action@v6 with: context: . push: true platforms: linux/amd64, linux/arm64 + build-args: DB_BACKEND=goleveldb tags: tharsishq/evmos:latest, tharsishq/evmos:${{ steps.meta.outputs.tag }} + + - name: Build and push pebbledb image + uses: docker/build-push-action@v6 + with: + context: . + push: true + platforms: linux/amd64, linux/arm64 + build-args: DB_BACKEND=pebbledb + tags: tharsishq/evmos:latest-pebble, tharsishq/evmos:${{ steps.meta.outputs.tag }}-pebble diff --git a/CHANGELOG.md b/CHANGELOG.md index 43c37dd0bc..d8dfc740e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -106,6 +106,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (contracts) [#2613](https://github.com/evmos/evmos/pull/2613) Remove unused contract and make script useable with Python <3.12. - (ante) [#2619](https://github.com/evmos/evmos/pull/2619) Change anteutils.TxFeeChecker to authante.TxFeeChecker. - (tests) [#2635](https://github.com/evmos/evmos/pull/2635) Add function to get ERC-20 balance to integration utils. +- (ci) [#2630](https://github.com/evmos/evmos/pull/2630) Add PebbleDB image to docker-push workflow. - (ci) [#2639](https://github.com/evmos/evmos/pull/2639) Ignore Swagger JSON in CheckOV linter. ## [v18.1.0](https://github.com/evmos/evmos/releases/tag/v18.1.0) - 2024-05-31 diff --git a/Makefile b/Makefile index 21babdbf21..deb5105dfa 100644 --- a/Makefile +++ b/Makefile @@ -163,7 +163,7 @@ build-reproducible: go.sum $(DOCKER) cp -a latest-build:/home/builder/artifacts/ $(CURDIR)/ -build-docker: +build-docker-goleveldb: # TODO replace with kaniko DOCKER_BUILDKIT=1 $(DOCKER) build -t ${DOCKER_IMAGE}:${DOCKER_TAG} ${DOCKER_ARGS} . $(DOCKER) tag ${DOCKER_IMAGE}:${DOCKER_TAG} ${DOCKER_IMAGE}:latest @@ -176,6 +176,15 @@ build-docker: echo 'docker run -it --rm -v $${SCRIPT_PATH}/.evmosd:/home/evmos/.evmosd $$IMAGE_NAME evmosd "$$@"' >> ./build/evmosd chmod +x ./build/evmosd +build-docker-pebbledb: + DOCKER_BUILDKIT=1 $(DOCKER) build --build-arg DB_BACKEND=pebbledb -t ${DOCKER_IMAGE}:${DOCKER_TAG}-pebble ${DOCKER_ARGS} . + $(DOCKER) tag ${DOCKER_IMAGE}:${DOCKER_TAG}-pebble ${DOCKER_IMAGE}:latest-pebble + mkdir -p ./build/.evmosd + echo '#!/usr/bin/env bash' > ./build/evmosd + echo "IMAGE_NAME=${DOCKER_IMAGE}:${COMMIT_HASH}" >> ./build/evmosd + echo 'SCRIPT_PATH=$$(cd $$(dirname $$0) && pwd -P)' >> ./build/evmosd + echo 'docker run -it --rm -v $${SCRIPT_PATH}/.evmosd:/home/evmos/.evmosd $$IMAGE_NAME evmosd "$$@"' >> ./build/evmosd + chmod +x ./build/evmosd build-rocksdb: # Make sure to run this command with root permission @@ -184,9 +193,11 @@ build-rocksdb: CGO_LDFLAGS="-L/usr/lib -lrocksdb -lstdc++ -lm -lz -lbz2 -lsnappy -llz4 -lzstd -ldl" \ COSMOS_BUILD_OPTIONS=rocksdb $(MAKE) build -push-docker: build-docker - $(DOCKER) push ${DOCKER_IMAGE}:${DOCKER_TAG} - $(DOCKER) push ${DOCKER_IMAGE}:latest +push-docker: build-docker-goleveldb build-docker-pebbledb + $(DOCKER) push ${DOCKER_IMAGE}:${DOCKER_TAG} + $(DOCKER) push ${DOCKER_IMAGE}:latest + $(DOCKER) push ${DOCKER_IMAGE}:${DOCKER_TAG}-pebble + $(DOCKER) push ${DOCKER_IMAGE}:latest-pebble $(MOCKS_DIR): mkdir -p $(MOCKS_DIR) From 63cb81cbc153db2647726a54146259b7ac8c736f Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Thu, 27 Jun 2024 13:19:48 +0200 Subject: [PATCH 303/345] fix(tests): Bump Dockerfile dependency and fix make test-e2e target in Makefile (#2642) * fix dockerfile and makefile * fix e2e tests * add changelog entry --- CHANGELOG.md | 1 + Dockerfile | 2 +- Makefile | 2 +- tests/e2e/upgrade/constants.go | 4 +++- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d8dfc740e3..1785d1af27 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -63,6 +63,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### Bug Fixes - (inflation) [#2299](https://github.com/evmos/evmos/pull/2299) Fix emission function and tests. +- (tests) [#2642](https://github.com/evmos/evmos/pull/2642) Fix Dockerfile by bumping dependency and fix E2E tests by adjusting used Docker image. ### Improvements diff --git a/Dockerfile b/Dockerfile index f8e760afcb..ec75b17f4f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -41,7 +41,7 @@ COPY --from=build-env /target/usr/lib /usr/lib COPY --from=build-env /target/usr/local/lib /usr/local/lib COPY --from=build-env /target/usr/include /usr/include -RUN apk add --no-cache ca-certificates=20240226-r0 jq=1.7.1-r0 curl=8.7.1-r0 bash=5.2.26-r0 vim=9.1.0414-r0 lz4=1.9.4-r5 rclone=1.66.0-r3 \ +RUN apk add --no-cache ca-certificates=20240226-r0 jq=1.7.1-r0 curl=8.8.0-r0 bash=5.2.26-r0 vim=9.1.0414-r0 lz4=1.9.4-r5 rclone=1.66.0-r3 \ && addgroup -g 1000 evmos \ && adduser -S -h /home/evmos -D evmos -u 1000 -G evmos diff --git a/Makefile b/Makefile index deb5105dfa..3ec8451028 100644 --- a/Makefile +++ b/Makefile @@ -350,7 +350,7 @@ test-unit-cover: TEST_PACKAGES=$(PACKAGES_UNIT) test-e2e: @if [ -z "$(TARGET_VERSION)" ]; then \ echo "Building docker image from local codebase"; \ - make build-docker; \ + make build-docker-pebbledb; \ fi @mkdir -p ./build @rm -rf build/.evmosd diff --git a/tests/e2e/upgrade/constants.go b/tests/e2e/upgrade/constants.go index f881dc549a..4221b2b0fd 100644 --- a/tests/e2e/upgrade/constants.go +++ b/tests/e2e/upgrade/constants.go @@ -8,7 +8,9 @@ const ( defaultChainID = "evmos_9000-1" // LocalVersionTag defines the docker image ImageTag when building locally - LocalVersionTag = "latest" + // + // NOTE: For upgrade tests we're using the PebbleDB build + LocalVersionTag = "latest-pebble" // tharsisRepo is the docker hub repository that contains the Evmos images pulled during tests tharsisRepo = "tharsishq/evmos" From deea200b4d396b8852831e1e32f2e81119dcda01 Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Thu, 27 Jun 2024 22:12:28 +0200 Subject: [PATCH 304/345] imp(evm): Remove EthAccount type and use BaseAccount instead (#2633) * remove use of EthAccount in repository * remove EthAccount implementation * add missing license * wip adding migration logic * fix migration * add tests for migration * run make format * Update x/evm/genesis.go Signed-off-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> * address review comments and add test for exporting EVM genesis * add iterator and corresponding test * use contract iterator for exporting EVM genesis state * address more review comments * remove unused method from interface definition * apply suggested renaming * address review comments * add changelog entry * add gitleaks allow directive to example contract storage * move changelog entry to breaking section * revert change in local node script --------- Signed-off-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Co-authored-by: MalteHerrmann --- CHANGELOG.md | 1 + app/app.go | 7 +- app/upgrades/v19/upgrades.go | 35 +++- app/upgrades/v19/upgrades_test.go | 165 ++++++++++++++++++ client/docs/swagger-ui/swagger.json | 38 ++-- client/testnet.go | 9 +- cmd/config/config.go | 2 +- cmd/evmosd/genaccounts.go | 11 +- cmd/evmosd/testnet.go | 6 +- ibc/testing/chain.go | 14 +- precompiles/distribution/utils_test.go | 9 +- precompiles/ics20/utils_test.go | 14 +- precompiles/staking/utils_test.go | 9 +- precompiles/vesting/tx_test.go | 16 +- precompiles/vesting/utils_test.go | 9 +- proto/ethermint/evm/v1/evm.proto | 2 +- proto/ethermint/evm/v1/query.proto | 2 +- proto/ethermint/types/v1/account.proto | 27 --- testutil/integration/evmos/network/setup.go | 15 +- testutil/integration/evmos/utils/contracts.go | 15 -- testutil/network/network.go | 7 +- types/account.go | 1 + types/account_test.go | 58 ------ utils/utils.go | 27 ++- utils/utils_test.go | 21 ++- x/erc20/keeper/integration_test.go | 26 +-- x/erc20/keeper/setup_test.go | 7 +- x/erc20/keeper/utils_test.go | 18 +- x/evm/genesis.go | 45 ++--- x/evm/genesis_test.go | 134 +++++++++----- x/evm/keeper/integration_test.go | 20 ++- x/evm/keeper/keeper.go | 10 +- x/evm/keeper/keeper_test.go | 53 ++++-- x/evm/keeper/setup_test.go | 19 +- x/evm/keeper/statedb.go | 144 ++++++++++----- x/evm/keeper/statedb_test.go | 157 +++++++++++++---- x/evm/keeper/utils.go | 17 ++ x/evm/migrations/v7/types/evm.pb.go | 2 +- x/evm/module.go | 2 +- x/evm/statedb/interfaces.go | 2 + x/evm/statedb/mock_test.go | 20 ++- x/evm/statedb/state_object.go | 21 ++- x/evm/statedb/statedb.go | 18 +- x/evm/types/evm.pb.go | 2 +- x/evm/types/interfaces.go | 1 - x/evm/types/key.go | 8 +- x/evm/types/query.pb.go | 4 +- x/evm/types/utils.go | 23 ++- x/feemarket/keeper/utils_test.go | 8 +- x/staking/keeper/msg_server_test.go | 4 +- x/vesting/keeper/keeper.go | 3 + x/vesting/keeper/keeper_test.go | 2 + x/vesting/keeper/msg_server.go | 37 ++-- x/vesting/keeper/msg_server_test.go | 64 ++++--- x/vesting/keeper/setup_test.go | 8 +- x/vesting/types/interfaces.go | 7 + x/vesting/utils_test.go | 11 +- 57 files changed, 864 insertions(+), 553 deletions(-) create mode 100644 app/upgrades/v19/upgrades_test.go delete mode 100644 proto/ethermint/types/v1/account.proto delete mode 100644 types/account_test.go create mode 100644 x/evm/keeper/utils.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 1785d1af27..987b518080 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -59,6 +59,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (erc20) [#2609](https://github.com/evmos/evmos/pull/2609) Remove STRv2 tracking logic. - (distribution-precompile) [#2614](https://github.com/evmos/evmos/pull/2614) Add withdrawer address check in transactions. - (app) [#2631](https://github.com/evmos/evmos/pull/2631) Bump IBC-go to v7.6.0 and Cosmos-SDK to v0.47.12. +- (evm) [#2633](https://github.com/evmos/evmos/pull/2633) Remove `EthAccount` type and use `BaseAccount` instead. ### Bug Fixes diff --git a/app/app.go b/app/app.go index 0990bf9781..951357efd2 100644 --- a/app/app.go +++ b/app/app.go @@ -406,7 +406,7 @@ func NewEvmos( // use custom Ethermint account for contracts app.AccountKeeper = authkeeper.NewAccountKeeper( appCodec, keys[authtypes.StoreKey], - evmostypes.ProtoAccount, maccPerms, + authtypes.ProtoBaseAccount, maccPerms, sdk.GetConfig().GetBech32AccountAddrPrefix(), authAddr, ) @@ -491,7 +491,7 @@ func NewEvmos( app.VestingKeeper = vestingkeeper.NewKeeper( keys[vestingtypes.StoreKey], authtypes.NewModuleAddress(govtypes.ModuleName), appCodec, - app.AccountKeeper, app.BankKeeper, app.DistrKeeper, app.StakingKeeper, govKeeper, // NOTE: app.govKeeper not defined yet, use govKeeper + app.AccountKeeper, app.BankKeeper, app.DistrKeeper, app.EvmKeeper, app.StakingKeeper, govKeeper, // NOTE: app.govKeeper not defined yet, use govKeeper ) app.Erc20Keeper = erc20keeper.NewKeeper( @@ -959,7 +959,7 @@ func (app *Evmos) BlockedAddrs() map[string]bool { } for _, precompile := range blockedPrecompilesHex { - blockedAddrs[utils.EthHexToSDKAddr(precompile).String()] = true + blockedAddrs[utils.EthHexToCosmosAddr(precompile).String()] = true } return blockedAddrs @@ -1157,6 +1157,7 @@ func (app *Evmos) setupUpgradeHandlers() { v19.UpgradeName, v19.CreateUpgradeHandler( app.mm, app.configurator, + app.AccountKeeper, app.EvmKeeper, ), ) diff --git a/app/upgrades/v19/upgrades.go b/app/upgrades/v19/upgrades.go index 95eacba7c0..e28a094bce 100644 --- a/app/upgrades/v19/upgrades.go +++ b/app/upgrades/v19/upgrades.go @@ -6,8 +6,13 @@ package v19 import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" + authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" + "github.com/ethereum/go-ethereum/common" + evmostypes "github.com/evmos/evmos/v18/types" evmkeeper "github.com/evmos/evmos/v18/x/evm/keeper" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) const ( @@ -19,7 +24,8 @@ const ( func CreateUpgradeHandler( mm *module.Manager, configurator module.Configurator, - evmKeeper *evmkeeper.Keeper, + ak authkeeper.AccountKeeper, + ek *evmkeeper.Keeper, ) upgradetypes.UpgradeHandler { return func(ctx sdk.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { logger := ctx.Logger().With("upgrade", UpgradeName) @@ -28,10 +34,12 @@ func CreateUpgradeHandler( delete(vm, "revenue") ctxCache, writeFn := ctx.CacheContext() - if err := RemoveOutpostsFromEvmParams(ctxCache, evmKeeper); err == nil { + if err := RemoveOutpostsFromEvmParams(ctxCache, ek); err == nil { writeFn() } + MigrateEthAccountsToBaseAccounts(ctx, ak, ek) + // Leave modules as-is to avoid running InitGenesis. return mm.RunMigrations(ctx, configurator, vm) } @@ -51,3 +59,26 @@ func RemoveOutpostsFromEvmParams(ctx sdk.Context, params.ActivePrecompiles = newActivePrecompiles return evmKeeper.SetParams(ctx, params) } + +// MigrateEthAccountsToBaseAccounts is used to store the code hash of the associated +// smart contracts in the dedicated store in the EVM module and convert the former +// EthAccounts to standard Cosmos SDK accounts. +func MigrateEthAccountsToBaseAccounts(ctx sdk.Context, ak authkeeper.AccountKeeper, ek *evmkeeper.Keeper) { + ak.IterateAccounts(ctx, func(account authtypes.AccountI) (stop bool) { + ethAcc, ok := account.(*evmostypes.EthAccount) + if !ok { + return false + } + + // NOTE: we only need to add store entries for smart contracts + codeHashBytes := common.HexToHash(ethAcc.CodeHash).Bytes() + if !evmtypes.IsEmptyCodeHash(codeHashBytes) { + ek.SetCodeHash(ctx, ethAcc.EthAddress().Bytes(), codeHashBytes) + } + + // Set the base account in the account keeper instead of the EthAccount + ak.SetAccount(ctx, ethAcc.BaseAccount) + + return false + }) +} diff --git a/app/upgrades/v19/upgrades_test.go b/app/upgrades/v19/upgrades_test.go new file mode 100644 index 0000000000..a97051426a --- /dev/null +++ b/app/upgrades/v19/upgrades_test.go @@ -0,0 +1,165 @@ +package v19_test + +import ( + "testing" + + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + "github.com/evmos/evmos/v18/app/upgrades/v19" + testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" + testnetwork "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + evmostypes "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v18/utils" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/stretchr/testify/require" +) + +const ( + // baseAccountAddress is the address of the base account that is set in genesis. + baseAccountAddress = "evmos1k5c2zrqmmyx4rfkfp3l98qxvrpcr3m4kgxd0dp" + // erc20ContractHex is the string representation of the ERC-20 token pair address. + erc20ContractHex = "0x80b5a32E4F032B2a058b4F29EC95EEfEEB87aDcd" + // SmartContractCode is the hex representation of the smart contract code that is set in genesis. + // + // NOTE: This was printed from the working branch and using ExportGenesis -> then printing the genesis account code. + smartContractCode = "608060405234801561000f575f80fd5b50600436106101d8575f3560e01c80635c975abb11610102578063a217fddf116100a0578063d53913931161006f578063d53913931461057a578063d547741f14610598578063dd62ed3e146105b4578063e63ab1e9146105e4576101d8565b8063a217fddf146104cc578063a457c2d7146104ea578063a9059cbb1461051a578063ca15c8731461054a576101d8565b80638456cb59116100dc5780638456cb59146104445780639010d07c1461044e57806391d148541461047e57806395d89b41146104ae576101d8565b80635c975abb146103da57806370a08231146103f857806379cc679014610428576101d8565b8063282c51f31161017a578063395093511161014957806339509351146103685780633f4ba83a1461039857806340c10f19146103a257806342966c68146103be576101d8565b8063282c51f3146102f45780632f2ff15d14610312578063313ce5671461032e57806336568abe1461034c576101d8565b806318160ddd116101b657806318160ddd1461025a5780631cf2c7e21461027857806323b872dd14610294578063248a9ca3146102c4576101d8565b806301ffc9a7146101dc57806306fdde031461020c578063095ea7b31461022a575b5f80fd5b6101f660048036038101906101f19190612005565b610602565b604051610203919061204a565b60405180910390f35b61021461067b565b60405161022191906120ed565b60405180910390f35b610244600480360381019061023f919061219a565b61070b565b604051610251919061204a565b60405180910390f35b61026261072d565b60405161026f91906121e7565b60405180910390f35b610292600480360381019061028d919061219a565b610736565b005b6102ae60048036038101906102a99190612200565b6107b4565b6040516102bb919061204a565b60405180910390f35b6102de60048036038101906102d99190612283565b6107e2565b6040516102eb91906122bd565b60405180910390f35b6102fc6107fe565b60405161030991906122bd565b60405180910390f35b61032c600480360381019061032791906122d6565b610822565b005b610336610843565b604051610343919061232f565b60405180910390f35b610366600480360381019061036191906122d6565b610859565b005b610382600480360381019061037d919061219a565b6108dc565b60405161038f919061204a565b60405180910390f35b6103a0610912565b005b6103bc60048036038101906103b7919061219a565b61098c565b005b6103d860048036038101906103d39190612348565b610a0a565b005b6103e2610a1e565b6040516103ef919061204a565b60405180910390f35b610412600480360381019061040d9190612373565b610a33565b60405161041f91906121e7565b60405180910390f35b610442600480360381019061043d919061219a565b610a79565b005b61044c610a99565b005b6104686004803603810190610463919061239e565b610b13565b60405161047591906123eb565b60405180910390f35b610498600480360381019061049391906122d6565b610b3f565b6040516104a5919061204a565b60405180910390f35b6104b6610ba2565b6040516104c391906120ed565b60405180910390f35b6104d4610c32565b6040516104e191906122bd565b60405180910390f35b61050460048036038101906104ff919061219a565b610c38565b604051610511919061204a565b60405180910390f35b610534600480360381019061052f919061219a565b610cad565b604051610541919061204a565b60405180910390f35b610564600480360381019061055f9190612283565b610ccf565b60405161057191906121e7565b60405180910390f35b610582610cf0565b60405161058f91906122bd565b60405180910390f35b6105b260048036038101906105ad91906122d6565b610d14565b005b6105ce60048036038101906105c99190612404565b610d35565b6040516105db91906121e7565b60405180910390f35b6105ec610db7565b6040516105f991906122bd565b60405180910390f35b5f7f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610674575061067382610ddb565b5b9050919050565b60606005805461068a9061246f565b80601f01602080910402602001604051908101604052809291908181526020018280546106b69061246f565b80156107015780601f106106d857610100808354040283529160200191610701565b820191905f5260205f20905b8154815290600101906020018083116106e457829003601f168201915b5050505050905090565b5f80610715610e54565b9050610722818585610e5b565b600191505092915050565b5f600454905090565b6107677f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a848610762610e54565b610b3f565b6107a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079d9061250f565b60405180910390fd5b6107b0828261101e565b5050565b5f806107be610e54565b90506107cb8582856111e3565b6107d685858561126e565b60019150509392505050565b5f805f8381526020019081526020015f20600101549050919050565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84881565b61082b826107e2565b610834816114dd565b61083e83836114f1565b505050565b5f600760019054906101000a900460ff16905090565b610861610e54565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146108ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c59061259d565b60405180910390fd5b6108d88282611523565b5050565b5f806108e6610e54565b90506109078185856108f88589610d35565b61090291906125e8565b610e5b565b600191505092915050565b6109437f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61093e610e54565b610b3f565b610982576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109799061268b565b60405180910390fd5b61098a611555565b565b6109bd7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66109b8610e54565b610b3f565b6109fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f390612719565b60405180910390fd5b610a0682826115b6565b5050565b610a1b610a15610e54565b8261101e565b50565b5f60075f9054906101000a900460ff16905090565b5f60025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610a8b82610a85610e54565b836111e3565b610a95828261101e565b5050565b610aca7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610ac5610e54565b610b3f565b610b09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b00906127a7565b60405180910390fd5b610b11611705565b565b5f610b378260015f8681526020019081526020015f2061176790919063ffffffff16565b905092915050565b5f805f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b606060068054610bb19061246f565b80601f0160208091040260200160405190810160405280929190818152602001828054610bdd9061246f565b8015610c285780601f10610bff57610100808354040283529160200191610c28565b820191905f5260205f20905b815481529060010190602001808311610c0b57829003601f168201915b5050505050905090565b5f801b81565b5f80610c42610e54565b90505f610c4f8286610d35565b905083811015610c94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8b90612835565b60405180910390fd5b610ca18286868403610e5b565b60019250505092915050565b5f80610cb7610e54565b9050610cc481858561126e565b600191505092915050565b5f610ce960015f8481526020019081526020015f2061177e565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610d1d826107e2565b610d26816114dd565b610d308383611523565b505050565b5f60035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e4d5750610e4c82611791565b5b9050919050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ec9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec0906128c3565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2e90612951565b60405180910390fd5b8060035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161101191906121e7565b60405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361108c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611083906129df565b60405180910390fd5b611097825f836117fa565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508181101561111b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111290612a6d565b60405180910390fd5b81810360025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160045f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516111cb91906121e7565b60405180910390a36111de835f8461180a565b505050565b5f6111ee8484610d35565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611268578181101561125a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125190612ad5565b60405180910390fd5b6112678484848403610e5b565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390612b63565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361134a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134190612bf1565b60405180910390fd5b6113558383836117fa565b5f60025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156113d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d090612c7f565b60405180910390fd5b81810360025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114c491906121e7565b60405180910390a36114d784848461180a565b50505050565b6114ee816114e9610e54565b61180f565b50565b6114fb8282611893565b61151e8160015f8581526020019081526020015f2061196d90919063ffffffff16565b505050565b61152d828261199a565b6115508160015f8581526020019081526020015f20611a7490919063ffffffff16565b505050565b61155d611aa1565b5f60075f6101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61159f610e54565b6040516115ac91906123eb565b60405180910390a1565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161b90612ce7565b60405180910390fd5b61162f5f83836117fa565b8060045f82825461164091906125e8565b925050819055508060025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516116ee91906121e7565b60405180910390a36117015f838361180a565b5050565b61170d611aea565b600160075f6101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611750610e54565b60405161175d91906123eb565b60405180910390a1565b5f611774835f0183611b34565b5f1c905092915050565b5f61178a825f01611b5b565b9050919050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611805838383611b6a565b505050565b505050565b6118198282610b3f565b61188f5761182681611bc2565b611833835f1c6020611bef565b604051602001611844929190612dd3565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188691906120ed565b60405180910390fd5b5050565b61189d8282610b3f565b6119695760015f808481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061190e610e54565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b5f611992835f018373ffffffffffffffffffffffffffffffffffffffff165f1b611e24565b905092915050565b6119a48282610b3f565b15611a70575f805f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550611a15610e54565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b5f611a99835f018373ffffffffffffffffffffffffffffffffffffffff165f1b611e8b565b905092915050565b611aa9610a1e565b611ae8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adf90612e56565b60405180910390fd5b565b611af2610a1e565b15611b32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2990612ebe565b60405180910390fd5b565b5f825f018281548110611b4a57611b49612edc565b5b905f5260205f200154905092915050565b5f815f01805490509050919050565b611b75838383611f87565b611b7d610a1e565b15611bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb490612f79565b60405180910390fd5b505050565b6060611be88273ffffffffffffffffffffffffffffffffffffffff16601460ff16611bef565b9050919050565b60605f6002836002611c019190612f97565b611c0b91906125e8565b67ffffffffffffffff811115611c2457611c23612fd8565b5b6040519080825280601f01601f191660200182016040528015611c565781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110611c8d57611c8c612edc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611cf057611cef612edc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f6001846002611d2e9190612f97565b611d3891906125e8565b90505b6001811115611dd7577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611d7a57611d79612edc565b5b1a60f81b828281518110611d9157611d90612edc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600485901c945080611dd090613005565b9050611d3b565b505f8414611e1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1190613076565b60405180910390fd5b8091505092915050565b5f611e2f8383611f8c565b611e8157825f0182908060018154018082558091505060019003905f5260205f20015f9091909190915055825f0180549050836001015f8481526020019081526020015f208190555060019050611e85565b5f90505b92915050565b5f80836001015f8481526020019081526020015f205490505f8114611f7c575f600182611eb89190613094565b90505f6001865f0180549050611ece9190613094565b9050818114611f34575f865f018281548110611eed57611eec612edc565b5b905f5260205f200154905080875f018481548110611f0e57611f0d612edc565b5b905f5260205f20018190555083876001015f8381526020019081526020015f2081905550505b855f01805480611f4757611f466130c7565b5b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611f81565b5f9150505b92915050565b505050565b5f80836001015f8481526020019081526020015f20541415905092915050565b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611fe481611fb0565b8114611fee575f80fd5b50565b5f81359050611fff81611fdb565b92915050565b5f6020828403121561201a57612019611fac565b5b5f61202784828501611ff1565b91505092915050565b5f8115159050919050565b61204481612030565b82525050565b5f60208201905061205d5f83018461203b565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561209a57808201518184015260208101905061207f565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6120bf82612063565b6120c9818561206d565b93506120d981856020860161207d565b6120e2816120a5565b840191505092915050565b5f6020820190508181035f83015261210581846120b5565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6121368261210d565b9050919050565b6121468161212c565b8114612150575f80fd5b50565b5f813590506121618161213d565b92915050565b5f819050919050565b61217981612167565b8114612183575f80fd5b50565b5f8135905061219481612170565b92915050565b5f80604083850312156121b0576121af611fac565b5b5f6121bd85828601612153565b92505060206121ce85828601612186565b9150509250929050565b6121e181612167565b82525050565b5f6020820190506121fa5f8301846121d8565b92915050565b5f805f6060848603121561221757612216611fac565b5b5f61222486828701612153565b935050602061223586828701612153565b925050604061224686828701612186565b9150509250925092565b5f819050919050565b61226281612250565b811461226c575f80fd5b50565b5f8135905061227d81612259565b92915050565b5f6020828403121561229857612297611fac565b5b5f6122a58482850161226f565b91505092915050565b6122b781612250565b82525050565b5f6020820190506122d05f8301846122ae565b92915050565b5f80604083850312156122ec576122eb611fac565b5b5f6122f98582860161226f565b925050602061230a85828601612153565b9150509250929050565b5f60ff82169050919050565b61232981612314565b82525050565b5f6020820190506123425f830184612320565b92915050565b5f6020828403121561235d5761235c611fac565b5b5f61236a84828501612186565b91505092915050565b5f6020828403121561238857612387611fac565b5b5f61239584828501612153565b91505092915050565b5f80604083850312156123b4576123b3611fac565b5b5f6123c18582860161226f565b92505060206123d285828601612186565b9150509250929050565b6123e58161212c565b82525050565b5f6020820190506123fe5f8301846123dc565b92915050565b5f806040838503121561241a57612419611fac565b5b5f61242785828601612153565b925050602061243885828601612153565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061248657607f821691505b60208210810361249957612498612442565b5b50919050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d757374205f8201527f68617665206275726e657220726f6c6520746f206275726e0000000000000000602082015250565b5f6124f960388361206d565b91506125048261249f565b604082019050919050565b5f6020820190508181035f830152612526816124ed565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e63655f8201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b5f612587602f8361206d565b91506125928261252d565b604082019050919050565b5f6020820190508181035f8301526125b48161257b565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6125f282612167565b91506125fd83612167565b9250828201905080821115612615576126146125bb565b5b92915050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d757374205f8201527f686176652070617573657220726f6c6520746f20756e70617573650000000000602082015250565b5f612675603b8361206d565b91506126808261261b565b604082019050919050565b5f6020820190508181035f8301526126a281612669565b9050919050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d757374205f8201527f68617665206d696e74657220726f6c6520746f206d696e740000000000000000602082015250565b5f61270360388361206d565b915061270e826126a9565b604082019050919050565b5f6020820190508181035f830152612730816126f7565b9050919050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d757374205f8201527f686176652070617573657220726f6c6520746f20706175736500000000000000602082015250565b5f61279160398361206d565b915061279c82612737565b604082019050919050565b5f6020820190508181035f8301526127be81612785565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f61281f60258361206d565b915061282a826127c5565b604082019050919050565b5f6020820190508181035f83015261284c81612813565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f6128ad60248361206d565b91506128b882612853565b604082019050919050565b5f6020820190508181035f8301526128da816128a1565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f61293b60228361206d565b9150612946826128e1565b604082019050919050565b5f6020820190508181035f8301526129688161292f565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f206164647265735f8201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b5f6129c960218361206d565b91506129d48261296f565b604082019050919050565b5f6020820190508181035f8301526129f6816129bd565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f612a5760228361206d565b9150612a62826129fd565b604082019050919050565b5f6020820190508181035f830152612a8481612a4b565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f612abf601d8361206d565b9150612aca82612a8b565b602082019050919050565b5f6020820190508181035f830152612aec81612ab3565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f612b4d60258361206d565b9150612b5882612af3565b604082019050919050565b5f6020820190508181035f830152612b7a81612b41565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f612bdb60238361206d565b9150612be682612b81565b604082019050919050565b5f6020820190508181035f830152612c0881612bcf565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f612c6960268361206d565b9150612c7482612c0f565b604082019050919050565b5f6020820190508181035f830152612c9681612c5d565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f612cd1601f8361206d565b9150612cdc82612c9d565b602082019050919050565b5f6020820190508181035f830152612cfe81612cc5565b9050919050565b5f81905092915050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000005f82015250565b5f612d43601783612d05565b9150612d4e82612d0f565b601782019050919050565b5f612d6382612063565b612d6d8185612d05565b9350612d7d81856020860161207d565b80840191505092915050565b7f206973206d697373696e6720726f6c65200000000000000000000000000000005f82015250565b5f612dbd601183612d05565b9150612dc882612d89565b601182019050919050565b5f612ddd82612d37565b9150612de98285612d59565b9150612df482612db1565b9150612e008284612d59565b91508190509392505050565b7f5061757361626c653a206e6f74207061757365640000000000000000000000005f82015250565b5f612e4060148361206d565b9150612e4b82612e0c565b602082019050919050565b5f6020820190508181035f830152612e6d81612e34565b9050919050565b7f5061757361626c653a20706175736564000000000000000000000000000000005f82015250565b5f612ea860108361206d565b9150612eb382612e74565b602082019050919050565b5f6020820190508181035f830152612ed581612e9c565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f45524332305061757361626c653a20746f6b656e207472616e736665722077685f8201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b5f612f63602a8361206d565b9150612f6e82612f09565b604082019050919050565b5f6020820190508181035f830152612f9081612f57565b9050919050565b5f612fa182612167565b9150612fac83612167565b9250828202612fba81612167565b91508282048414831517612fd157612fd06125bb565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f61300f82612167565b91505f8203613021576130206125bb565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e745f82015250565b5f61306060208361206d565b915061306b8261302c565b602082019050919050565b5f6020820190508181035f83015261308d81613054565b9050919050565b5f61309e82612167565b91506130a983612167565b92508282039050818111156130c1576130c06125bb565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea26469706673582212208e17db436f847258cc8b148f2ec3689c9d1043000f9acacdf5a893071a6136a964736f6c63430008170033" +) + +var ( + // code is the bytecode of the contract. + // + // These conversions are taken from the code hash check in InitGenesis: + // https://github.com/evmos/evmos/blob/ca0f3e4d3e8407fd983b42aa595b052a67c1598b/x/evm/genesis.go#L48-L64 + code = common.Hex2Bytes(smartContractCode) + // codeHash is the hash of the contract code. + codeHash = crypto.Keccak256Hash(code) + + // storage is the genesis storage for the deployed ERC-20 contract + // + // NOTE: This is generated the same way described above with ExportGenesis and iterating of the genesis accounts on the working example + storage = evmtypes.Storage{ + {Key: "0x0000000000000000000000000000000000000000000000000000000000000005", Value: "0x786d706c00000000000000000000000000000000000000000000000000000008"}, //gitleaks:allow + {Key: "0x0000000000000000000000000000000000000000000000000000000000000006", Value: "0x786d706c00000000000000000000000000000000000000000000000000000008"}, //gitleaks:allow + {Key: "0x0000000000000000000000000000000000000000000000000000000000000007", Value: "0x0000000000000000000000000000000000000000000000000000000000000600"}, //gitleaks:allow + {Key: "0x0eb5be412f275a18f6e4d622aee4ff40b21467c926224771b782d4c095d1444b", Value: "0x00000000000000000000000047eeb2eac350e1923b8cbdfa4396a077b36e62a0"}, //gitleaks:allow + {Key: "0x0ef55e0cc676cf0b0dcbdc7d53c3b797e88e44b10ecee85d45144bc7392574c7", Value: "0x0000000000000000000000000000000000000000000000000000000000000001"}, //gitleaks:allow + {Key: "0x26bde78f605f19d1d853933fa781096670ea82ad96c9a3fb49f407e9600b316a", Value: "0x00000000000000000000000047eeb2eac350e1923b8cbdfa4396a077b36e62a0"}, //gitleaks:allow + {Key: "0x28bcb2563cf7895ce732c75018c5f73c44037088fc4505201fc28c3147d1d4a0", Value: "0x0000000000000000000000000000000000000000000000000000000000000001"}, //gitleaks:allow + {Key: "0x2e681a43037a582fb0535432b520e9dc97303bf239f82648091f9be82f4b677e", Value: "0x0000000000000000000000000000000000000000000000000000000000000001"}, //gitleaks:allow + {Key: "0x42aa905ad67e072b45e9dae81c8fa8bc705cc25014d5e9f10fa5114ae9c0dcf1", Value: "0x0000000000000000000000000000000000000000000000000000000000000001"}, //gitleaks:allow + {Key: "0x4796a5437e25bdc491b74d328cf6b437c8587e216f52049c7df56421f51ae30f", Value: "0x0000000000000000000000000000000000000000000000000000000000000001"}, //gitleaks:allow + {Key: "0x64e21244e91af723e1b962171ed4828dcecc0d7b89872e516a5db8266da80000", Value: "0x0000000000000000000000000000000000000000000000000000000000000001"}, //gitleaks:allow + {Key: "0x6d2487ab6e76634bbe98b9d5b39803d625a8f9249da9e03e70c638bf76d9e29b", Value: "0x00000000000000000000000047eeb2eac350e1923b8cbdfa4396a077b36e62a0"}, //gitleaks:allow + {Key: "0x97c12224ac75d13d2d9a9e30dd25212b81a4e2c19743b211209b4bca3db99142", Value: "0x0000000000000000000000000000000000000000000000000000000000000001"}, //gitleaks:allow + {Key: "0xa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49", Value: "0x0000000000000000000000000000000000000000000000000000000000000001"}, //gitleaks:allow + {Key: "0xb009fbc347bffd144efd545cc4b15a37592e1dd7063753564d9ecc6fea764b6f", Value: "0x00000000000000000000000047eeb2eac350e1923b8cbdfa4396a077b36e62a0"}, //gitleaks:allow + {Key: "0xb9cbbae02fe941283ec0eefd7b121e3bc7f89fae077b27bdd75a7fd4cf1543a8", Value: "0x0000000000000000000000000000000000000000000000000000000000000001"}, //gitleaks:allow + {Key: "0xc5724e8640ef1f7915e4839c81ad4b592af3c601230608793acd429a848553e9", Value: "0x0000000000000000000000000000000000000000000000000000000000000001"}, //gitleaks:allow + {Key: "0xfac4953099c6f6272238a038333d99c9cd0475cb85c72b761909fadae4b6cbcd", Value: "0x0000000000000000000000000000000000000000000000000000000000000001"}, //gitleaks:allow + {Key: "0xfd061ffb53f8d83182630fadee503ca39e0bae885f162932fe84d25caddbc888", Value: "0x0000000000000000000000000000000000000000000000000000000000000001"}, //gitleaks:allow + } + + // erc20Addr is the address of the ERC-20 contract. + erc20Addr = common.HexToAddress(erc20ContractHex) + + // smartContractAddress is the bech32 address of the Ethereum smart contract account that is set in genesis. + smartContractAddress = utils.EthToCosmosAddr(erc20Addr).String() +) + +// createGenesisWithERC20 creates a genesis state that contains the state containing an EthAccount that is a smart contract. +func createGenesisWithERC20(keyring testkeyring.Keyring) testnetwork.CustomGenesisState { + genesisAccounts := []authtypes.AccountI{ + &authtypes.BaseAccount{ + Address: baseAccountAddress, + PubKey: nil, + AccountNumber: 0, + Sequence: 1, + }, + &evmostypes.EthAccount{ + BaseAccount: &authtypes.BaseAccount{ + Address: smartContractAddress, + PubKey: nil, + AccountNumber: 9, + Sequence: 1, + }, + CodeHash: codeHash.String(), + }, + } + + // Add all keys from the keyring to the genesis accounts as well. + // + // NOTE: This is necessary to enable the account to send EVM transactions, + // because the Mono ante handler checks the account balance by querying the + // account from the account keeper first. If these accounts are not in the genesis + // state, the ante handler finds a zero balance because of the missing account. + for i, addr := range keyring.GetAllAccAddrs() { + genesisAccounts = append(genesisAccounts, &authtypes.BaseAccount{ + Address: addr.String(), + PubKey: nil, + AccountNumber: uint64(i + 1), + Sequence: 1, + }) + } + + accGenesisState := authtypes.DefaultGenesisState() + for _, genesisAccount := range genesisAccounts { + // NOTE: This type requires to be packed into a *types.Any as seen on SDK tests, + // e.g. https://github.com/evmos/cosmos-sdk/blob/v0.47.5-evmos.2/x/auth/keeper/keeper_test.go#L193-L223 + accGenesisState.Accounts = append(accGenesisState.Accounts, codectypes.UnsafePackAny(genesisAccount)) + } + + // Add the smart contracts to the EVM genesis + evmGenesisState := evmtypes.DefaultGenesisState() + evmGenesisState.Accounts = append(evmGenesisState.Accounts, evmtypes.GenesisAccount{ + Address: erc20ContractHex, + Code: smartContractCode, + Storage: storage, + }) + + // Combine module genesis states + return testnetwork.CustomGenesisState{ + authtypes.ModuleName: accGenesisState, + evmtypes.ModuleName: evmGenesisState, + } +} + +func TestMigrateEthAccountsToBaseAccounts(t *testing.T) { + keyring := testkeyring.New(1) + network := testnetwork.NewUnitTestNetwork( + // NOTE: This genesis was created using pre-EthAccount removal code + // so that the accounts stored are actual EthAccounts. + testnetwork.WithCustomGenesis(createGenesisWithERC20(keyring)), + ) + + require.NoError(t, network.NextBlock(), "failed to advance block") + + // Check the contract is an EthAccount before migration + erc20AddrAsBech32 := utils.EthToCosmosAddr(erc20Addr) + acc := network.App.AccountKeeper.GetAccount(network.GetContext(), erc20AddrAsBech32) + require.NotNil(t, acc, "account not found") + require.IsType(t, &evmostypes.EthAccount{}, acc, "expected account to be an EthAccount") + + // Migrate the accounts + v19.MigrateEthAccountsToBaseAccounts(network.GetContext(), network.App.AccountKeeper, network.App.EvmKeeper) + + // Check the contract is a BaseAccount after migration + acc = network.App.AccountKeeper.GetAccount(network.GetContext(), erc20AddrAsBech32) + require.NotNil(t, acc, "account not found") + require.IsType(t, &authtypes.BaseAccount{}, acc, "account should be a base account") + + // Check that the keeper has the new store entry + require.Equal(t, + codeHash.String(), + network.App.EvmKeeper.GetCodeHash(network.GetContext(), erc20Addr).String(), + "expected different code hash", + ) + + require.Equal(t, + code, + network.App.EvmKeeper.GetCode(network.GetContext(), codeHash), + "expected different code", + ) +} diff --git a/client/docs/swagger-ui/swagger.json b/client/docs/swagger-ui/swagger.json index 9d09ddcf80..7b1cf6b896 100644 --- a/client/docs/swagger-ui/swagger.json +++ b/client/docs/swagger-ui/swagger.json @@ -1140,7 +1140,7 @@ }, "/evmos/evm/v1/balances/{address}": { "get": { - "summary": "Balance queries the balance of a the EVM denomination for a single\nEthAccount.", + "summary": "Balance queries the balance of a the EVM denomination for a single\naccount.", "operationId": "Balance", "responses": { "200": { @@ -1818,12 +1818,12 @@ "default": "ACCESS_TYPE_PERMISSIONLESS", "description": "- ACCESS_TYPE_PERMISSIONLESS: ACCESS_TYPE_PERMISSIONLESS does not restrict the operation to anyone\n - ACCESS_TYPE_RESTRICTED: ACCESS_TYPE_RESTRICTED restrict the operation to anyone\n - ACCESS_TYPE_PERMISSIONED: ACCESS_TYPE_PERMISSIONED only allows the operation for specific addresses" }, - "allowlist_addresses": { + "access_control_list": { "type": "array", "items": { "type": "string" }, - "title": "allowlist_addresses defines which addresses have permissions in case of permissioned access_type" + "title": "access_control_list defines defines different things depending on the AccessType:\n- ACCESS_TYPE_PERMISSIONLESS: list of addresses that are blocked from performing the operation\n- ACCESS_TYPE_RESTRICTED: ignored\n- ACCESS_TYPE_PERMISSIONED: list of addresses that are allowed to perform the operation" } } }, @@ -1842,12 +1842,12 @@ "default": "ACCESS_TYPE_PERMISSIONLESS", "description": "- ACCESS_TYPE_PERMISSIONLESS: ACCESS_TYPE_PERMISSIONLESS does not restrict the operation to anyone\n - ACCESS_TYPE_RESTRICTED: ACCESS_TYPE_RESTRICTED restrict the operation to anyone\n - ACCESS_TYPE_PERMISSIONED: ACCESS_TYPE_PERMISSIONED only allows the operation for specific addresses" }, - "allowlist_addresses": { + "access_control_list": { "type": "array", "items": { "type": "string" }, - "title": "allowlist_addresses defines which addresses have permissions in case of permissioned access_type" + "title": "access_control_list defines defines different things depending on the AccessType:\n- ACCESS_TYPE_PERMISSIONLESS: list of addresses that are blocked from performing the operation\n- ACCESS_TYPE_RESTRICTED: ignored\n- ACCESS_TYPE_PERMISSIONED: list of addresses that are allowed to perform the operation" } } } @@ -21371,12 +21371,12 @@ "default": "ACCESS_TYPE_PERMISSIONLESS", "description": "- ACCESS_TYPE_PERMISSIONLESS: ACCESS_TYPE_PERMISSIONLESS does not restrict the operation to anyone\n - ACCESS_TYPE_RESTRICTED: ACCESS_TYPE_RESTRICTED restrict the operation to anyone\n - ACCESS_TYPE_PERMISSIONED: ACCESS_TYPE_PERMISSIONED only allows the operation for specific addresses" }, - "allowlist_addresses": { + "access_control_list": { "type": "array", "items": { "type": "string" }, - "title": "allowlist_addresses defines which addresses have permissions in case of permissioned access_type" + "title": "access_control_list defines defines different things depending on the AccessType:\n- ACCESS_TYPE_PERMISSIONLESS: list of addresses that are blocked from performing the operation\n- ACCESS_TYPE_RESTRICTED: ignored\n- ACCESS_TYPE_PERMISSIONED: list of addresses that are allowed to perform the operation" } } }, @@ -21395,12 +21395,12 @@ "default": "ACCESS_TYPE_PERMISSIONLESS", "description": "- ACCESS_TYPE_PERMISSIONLESS: ACCESS_TYPE_PERMISSIONLESS does not restrict the operation to anyone\n - ACCESS_TYPE_RESTRICTED: ACCESS_TYPE_RESTRICTED restrict the operation to anyone\n - ACCESS_TYPE_PERMISSIONED: ACCESS_TYPE_PERMISSIONED only allows the operation for specific addresses" }, - "allowlist_addresses": { + "access_control_list": { "type": "array", "items": { "type": "string" }, - "title": "allowlist_addresses defines which addresses have permissions in case of permissioned access_type" + "title": "access_control_list defines defines different things depending on the AccessType:\n- ACCESS_TYPE_PERMISSIONLESS: list of addresses that are blocked from performing the operation\n- ACCESS_TYPE_RESTRICTED: ignored\n- ACCESS_TYPE_PERMISSIONED: list of addresses that are allowed to perform the operation" } } } @@ -21421,12 +21421,12 @@ "default": "ACCESS_TYPE_PERMISSIONLESS", "description": "- ACCESS_TYPE_PERMISSIONLESS: ACCESS_TYPE_PERMISSIONLESS does not restrict the operation to anyone\n - ACCESS_TYPE_RESTRICTED: ACCESS_TYPE_RESTRICTED restrict the operation to anyone\n - ACCESS_TYPE_PERMISSIONED: ACCESS_TYPE_PERMISSIONED only allows the operation for specific addresses" }, - "allowlist_addresses": { + "access_control_list": { "type": "array", "items": { "type": "string" }, - "title": "allowlist_addresses defines which addresses have permissions in case of permissioned access_type" + "title": "access_control_list defines defines different things depending on the AccessType:\n- ACCESS_TYPE_PERMISSIONLESS: list of addresses that are blocked from performing the operation\n- ACCESS_TYPE_RESTRICTED: ignored\n- ACCESS_TYPE_PERMISSIONED: list of addresses that are allowed to perform the operation" } }, "title": "AccessControlType defines the permission type for policies" @@ -21831,12 +21831,12 @@ "default": "ACCESS_TYPE_PERMISSIONLESS", "description": "- ACCESS_TYPE_PERMISSIONLESS: ACCESS_TYPE_PERMISSIONLESS does not restrict the operation to anyone\n - ACCESS_TYPE_RESTRICTED: ACCESS_TYPE_RESTRICTED restrict the operation to anyone\n - ACCESS_TYPE_PERMISSIONED: ACCESS_TYPE_PERMISSIONED only allows the operation for specific addresses" }, - "allowlist_addresses": { + "access_control_list": { "type": "array", "items": { "type": "string" }, - "title": "allowlist_addresses defines which addresses have permissions in case of permissioned access_type" + "title": "access_control_list defines defines different things depending on the AccessType:\n- ACCESS_TYPE_PERMISSIONLESS: list of addresses that are blocked from performing the operation\n- ACCESS_TYPE_RESTRICTED: ignored\n- ACCESS_TYPE_PERMISSIONED: list of addresses that are allowed to perform the operation" } } }, @@ -21855,12 +21855,12 @@ "default": "ACCESS_TYPE_PERMISSIONLESS", "description": "- ACCESS_TYPE_PERMISSIONLESS: ACCESS_TYPE_PERMISSIONLESS does not restrict the operation to anyone\n - ACCESS_TYPE_RESTRICTED: ACCESS_TYPE_RESTRICTED restrict the operation to anyone\n - ACCESS_TYPE_PERMISSIONED: ACCESS_TYPE_PERMISSIONED only allows the operation for specific addresses" }, - "allowlist_addresses": { + "access_control_list": { "type": "array", "items": { "type": "string" }, - "title": "allowlist_addresses defines which addresses have permissions in case of permissioned access_type" + "title": "access_control_list defines defines different things depending on the AccessType:\n- ACCESS_TYPE_PERMISSIONLESS: list of addresses that are blocked from performing the operation\n- ACCESS_TYPE_RESTRICTED: ignored\n- ACCESS_TYPE_PERMISSIONED: list of addresses that are allowed to perform the operation" } } } @@ -22078,12 +22078,12 @@ "default": "ACCESS_TYPE_PERMISSIONLESS", "description": "- ACCESS_TYPE_PERMISSIONLESS: ACCESS_TYPE_PERMISSIONLESS does not restrict the operation to anyone\n - ACCESS_TYPE_RESTRICTED: ACCESS_TYPE_RESTRICTED restrict the operation to anyone\n - ACCESS_TYPE_PERMISSIONED: ACCESS_TYPE_PERMISSIONED only allows the operation for specific addresses" }, - "allowlist_addresses": { + "access_control_list": { "type": "array", "items": { "type": "string" }, - "title": "allowlist_addresses defines which addresses have permissions in case of permissioned access_type" + "title": "access_control_list defines defines different things depending on the AccessType:\n- ACCESS_TYPE_PERMISSIONLESS: list of addresses that are blocked from performing the operation\n- ACCESS_TYPE_RESTRICTED: ignored\n- ACCESS_TYPE_PERMISSIONED: list of addresses that are allowed to perform the operation" } } }, @@ -22102,12 +22102,12 @@ "default": "ACCESS_TYPE_PERMISSIONLESS", "description": "- ACCESS_TYPE_PERMISSIONLESS: ACCESS_TYPE_PERMISSIONLESS does not restrict the operation to anyone\n - ACCESS_TYPE_RESTRICTED: ACCESS_TYPE_RESTRICTED restrict the operation to anyone\n - ACCESS_TYPE_PERMISSIONED: ACCESS_TYPE_PERMISSIONED only allows the operation for specific addresses" }, - "allowlist_addresses": { + "access_control_list": { "type": "array", "items": { "type": "string" }, - "title": "allowlist_addresses defines which addresses have permissions in case of permissioned access_type" + "title": "access_control_list defines defines different things depending on the AccessType:\n- ACCESS_TYPE_PERMISSIONLESS: list of addresses that are blocked from performing the operation\n- ACCESS_TYPE_RESTRICTED: ignored\n- ACCESS_TYPE_PERMISSIONED: list of addresses that are allowed to perform the operation" } } } diff --git a/client/testnet.go b/client/testnet.go index eaf0b21ab9..6504df609f 100644 --- a/client/testnet.go +++ b/client/testnet.go @@ -13,8 +13,6 @@ import ( "path/filepath" "cosmossdk.io/math" - "github.com/ethereum/go-ethereum/common" - tmconfig "github.com/cometbft/cometbft/config" tmrand "github.com/cometbft/cometbft/libs/rand" "github.com/cometbft/cometbft/types" @@ -304,10 +302,9 @@ func initTestnetFiles( } genBalances = append(genBalances, banktypes.Balance{Address: addr.String(), Coins: coins.Sort()}) - genAccounts = append(genAccounts, &evmostypes.EthAccount{ - BaseAccount: authtypes.NewBaseAccount(addr, nil, 0, 0), - CodeHash: common.BytesToHash(evmtypes.EmptyCodeHash).Hex(), - }) + genAccounts = append(genAccounts, authtypes.NewBaseAccount( + addr, nil, 0, 0), + ) valTokens := sdk.TokensFromConsensusPower(100, evmostypes.PowerReduction) createValMsg, err := stakingtypes.NewMsgCreateValidator( diff --git a/cmd/config/config.go b/cmd/config/config.go index df57620be4..f7be8c59a7 100644 --- a/cmd/config/config.go +++ b/cmd/config/config.go @@ -11,7 +11,7 @@ import ( ) const ( - // Bech32Prefix defines the Bech32 prefix used for EthAccounts + // Bech32Prefix defines the Bech32 prefix used for accounts on the Evmos blockchain Bech32Prefix = "evmos" // Bech32PrefixAccAddr defines the Bech32 prefix of an account's address diff --git a/cmd/evmosd/genaccounts.go b/cmd/evmosd/genaccounts.go index 4d83f7ec4c..e6dea10174 100644 --- a/cmd/evmosd/genaccounts.go +++ b/cmd/evmosd/genaccounts.go @@ -9,7 +9,6 @@ import ( "fmt" "time" - "github.com/ethereum/go-ethereum/common" "github.com/spf13/cobra" "github.com/cosmos/cosmos-sdk/client" @@ -23,9 +22,6 @@ import ( "github.com/cosmos/cosmos-sdk/x/genutil" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" - "github.com/evmos/evmos/v18/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" - evmoskr "github.com/evmos/evmos/v18/crypto/keyring" vestingcli "github.com/evmos/evmos/v18/x/vesting/client/cli" @@ -107,7 +103,7 @@ contain valid denominations. Accounts may optionally be supplied with vesting pa clawback, _ := cmd.Flags().GetBool(vestingcli.FlagClawback) - // Create ClawbackvestingAccount, sdk.VestingAccount or EthAccount + // Create ClawbackvestingAccount or standard Evmos account switch { case clawback: // ClawbackvestingAccount requires clawback, lockup, vesting, and funder @@ -205,10 +201,7 @@ contain valid denominations. Accounts may optionally be supplied with vesting pa ) default: - genAccount = &types.EthAccount{ - BaseAccount: baseAccount, - CodeHash: common.BytesToHash(evmtypes.EmptyCodeHash).Hex(), - } + genAccount = baseAccount } if err := genAccount.Validate(); err != nil { diff --git a/cmd/evmosd/testnet.go b/cmd/evmosd/testnet.go index f35486b413..3257c1cf3d 100644 --- a/cmd/evmosd/testnet.go +++ b/cmd/evmosd/testnet.go @@ -14,7 +14,6 @@ import ( "path/filepath" "strconv" - "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/params" tmconfig "github.com/cometbft/cometbft/config" @@ -329,10 +328,7 @@ func initTestnetFiles( } genBalances = append(genBalances, banktypes.Balance{Address: addr.String(), Coins: coins.Sort()}) - genAccounts = append(genAccounts, &evmostypes.EthAccount{ - BaseAccount: authtypes.NewBaseAccount(addr, nil, 0, 0), - CodeHash: common.BytesToHash(evmtypes.EmptyCodeHash).Hex(), - }) + genAccounts = append(genAccounts, authtypes.NewBaseAccount(addr, nil, 0, 0)) valTokens := sdk.TokensFromConsensusPower(100, evmostypes.PowerReduction) createValMsg, err := stakingtypes.NewMsgCreateValidator( diff --git a/ibc/testing/chain.go b/ibc/testing/chain.go index bd92969cf4..0e6d6e2f36 100644 --- a/ibc/testing/chain.go +++ b/ibc/testing/chain.go @@ -8,8 +8,6 @@ import ( "github.com/stretchr/testify/require" - "github.com/ethereum/go-ethereum/common" - sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" @@ -24,7 +22,6 @@ import ( "github.com/evmos/evmos/v18/crypto/ethsecp256k1" evmostypes "github.com/evmos/evmos/v18/types" "github.com/evmos/evmos/v18/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) // ChainIDPrefix defines the default chain ID prefix for Evmos test chains @@ -66,19 +63,14 @@ func NewTestChain(t *testing.T, coord *ibcgotesting.Coordinator, chainID string) baseAcc := authtypes.NewBaseAccount(senderPrivKey.PubKey().Address().Bytes(), senderPrivKey.PubKey(), 0, 0) - acc := &evmostypes.EthAccount{ - BaseAccount: baseAcc, - CodeHash: common.BytesToHash(evmtypes.EmptyCodeHash).Hex(), - } - amount := sdk.TokensFromConsensusPower(1, evmostypes.PowerReduction) balance := banktypes.Balance{ - Address: acc.GetAddress().String(), + Address: baseAcc.GetAddress().String(), Coins: sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, amount)), } - app := SetupWithGenesisValSet(t, valSet, []authtypes.GenesisAccount{acc}, chainID, balance) + app := SetupWithGenesisValSet(t, valSet, []authtypes.GenesisAccount{baseAcc}, chainID, balance) // create current header and call begin block header := tmproto.Header{ @@ -102,7 +94,7 @@ func NewTestChain(t *testing.T, coord *ibcgotesting.Coordinator, chainID string) Vals: valSet, Signers: signers, SenderPrivKey: senderPrivKey, - SenderAccount: acc, + SenderAccount: baseAcc, NextVals: valSet, } diff --git a/precompiles/distribution/utils_test.go b/precompiles/distribution/utils_test.go index 4530cc4491..68b3ae0dba 100644 --- a/precompiles/distribution/utils_test.go +++ b/precompiles/distribution/utils_test.go @@ -156,19 +156,14 @@ func (s *PrecompileTestSuite) DoSetupTest() { baseAcc := authtypes.NewBaseAccount(priv.PubKey().Address().Bytes(), priv.PubKey(), 0, 0) - acc := &evmostypes.EthAccount{ - BaseAccount: baseAcc, - CodeHash: common.BytesToHash(evmtypes.EmptyCodeHash).Hex(), - } - amount := sdk.TokensFromConsensusPower(5, evmostypes.PowerReduction) balance := banktypes.Balance{ - Address: acc.GetAddress().String(), + Address: baseAcc.GetAddress().String(), Coins: sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, amount)), } - s.SetupWithGenesisValSet(s.valSet, []authtypes.GenesisAccount{acc}, balance) + s.SetupWithGenesisValSet(s.valSet, []authtypes.GenesisAccount{baseAcc}, balance) // Create StateDB s.stateDB = statedb.New(s.ctx, s.app.EvmKeeper, statedb.NewEmptyTxConfig(common.BytesToHash(s.ctx.HeaderHash().Bytes()))) diff --git a/precompiles/ics20/utils_test.go b/precompiles/ics20/utils_test.go index c46c852362..d418d133ba 100644 --- a/precompiles/ics20/utils_test.go +++ b/precompiles/ics20/utils_test.go @@ -232,20 +232,14 @@ func (s *PrecompileTestSuite) NewTestChainWithValSet(coord *ibctesting.Coordinat s.signer = evmosutiltx.NewSigner(priv) baseAcc := authtypes.NewBaseAccount(priv.PubKey().Address().Bytes(), priv.PubKey(), 0, 0) - - acc := &evmostypes.EthAccount{ - BaseAccount: baseAcc, - CodeHash: common.BytesToHash(evmtypes.EmptyCodeHash).Hex(), - } - amount := sdk.TokensFromConsensusPower(5, evmostypes.PowerReduction) balance := banktypes.Balance{ - Address: acc.GetAddress().String(), + Address: baseAcc.GetAddress().String(), Coins: sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, amount)), } - s.SetupWithGenesisValSet(s.valSet, []authtypes.GenesisAccount{acc}, balance) + s.SetupWithGenesisValSet(s.valSet, []authtypes.GenesisAccount{baseAcc}, balance) // create current header and call begin block header := tmproto.Header{ @@ -295,8 +289,8 @@ func (s *PrecompileTestSuite) NewTestChainWithValSet(coord *ibctesting.Coordinat NextVals: valSet, Signers: signers, SenderPrivKey: priv, - SenderAccount: acc, - SenderAccounts: []ibctesting.SenderAccount{{SenderPrivKey: priv, SenderAccount: acc}}, + SenderAccount: baseAcc, + SenderAccounts: []ibctesting.SenderAccount{{SenderPrivKey: priv, SenderAccount: baseAcc}}, } coord.CommitBlock(chain) diff --git a/precompiles/staking/utils_test.go b/precompiles/staking/utils_test.go index 3b4bd03ae1..07ac8dd93a 100644 --- a/precompiles/staking/utils_test.go +++ b/precompiles/staking/utils_test.go @@ -174,19 +174,14 @@ func (s *PrecompileTestSuite) DoSetupTest() { baseAcc := authtypes.NewBaseAccount(priv.PubKey().Address().Bytes(), priv.PubKey(), 0, 0) - acc := &evmostypes.EthAccount{ - BaseAccount: baseAcc, - CodeHash: common.BytesToHash(evmtypes.EmptyCodeHash).Hex(), - } - amount := sdk.TokensFromConsensusPower(5, evmostypes.PowerReduction) balance := banktypes.Balance{ - Address: acc.GetAddress().String(), + Address: baseAcc.GetAddress().String(), Coins: sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, amount)), } - s.SetupWithGenesisValSet(valSet, []authtypes.GenesisAccount{acc}, balance) + s.SetupWithGenesisValSet(valSet, []authtypes.GenesisAccount{baseAcc}, balance) // Create StateDB s.stateDB = statedb.New(s.ctx, s.app.EvmKeeper, statedb.NewEmptyTxConfig(common.BytesToHash(s.ctx.HeaderHash().Bytes()))) diff --git a/precompiles/vesting/tx_test.go b/precompiles/vesting/tx_test.go index a9b344085b..b11fb37895 100644 --- a/precompiles/vesting/tx_test.go +++ b/precompiles/vesting/tx_test.go @@ -8,15 +8,14 @@ import ( "time" "cosmossdk.io/math" - "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v18/precompiles/testutil" - sdk "github.com/cosmos/cosmos-sdk/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + "github.com/ethereum/go-ethereum/core/vm" cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/precompiles/testutil" "github.com/evmos/evmos/v18/precompiles/vesting" evmosutil "github.com/evmos/evmos/v18/testutil" evmosutiltx "github.com/evmos/evmos/v18/testutil/tx" - evmostypes "github.com/evmos/evmos/v18/types" "github.com/evmos/evmos/v18/utils" vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" ) @@ -411,10 +410,13 @@ func (s *PrecompileTestSuite) TestConvertVestingAccount() { s.Require().NoError(err) s.Require().Equal(success[0], true) - // Check if the vesting account was converted back to an EthAccountI + // Check if the vesting account was converted back to an non-vesting account account := s.app.AccountKeeper.GetAccount(s.ctx, toAddr.Bytes()) - _, ok := account.(evmostypes.EthAccountI) - s.Require().True(ok) + _, ok := account.(*authtypes.BaseAccount) + s.Require().True(ok, "expected account to be a base account") + + _, ok = account.(*vestingtypes.ClawbackVestingAccount) + s.Require().False(ok, "expected account not to be a vesting account after converting") }, false, "", diff --git a/precompiles/vesting/utils_test.go b/precompiles/vesting/utils_test.go index 76deb4b68d..0a9aaac7fc 100644 --- a/precompiles/vesting/utils_test.go +++ b/precompiles/vesting/utils_test.go @@ -162,19 +162,14 @@ func (s *PrecompileTestSuite) DoSetupTest() { baseAcc := authtypes.NewBaseAccount(priv.PubKey().Address().Bytes(), priv.PubKey(), 0, 0) - acc := &evmostypes.EthAccount{ - BaseAccount: baseAcc, - CodeHash: common.BytesToHash(evmtypes.EmptyCodeHash).Hex(), - } - amount := sdk.TokensFromConsensusPower(5, evmostypes.PowerReduction) balance := banktypes.Balance{ - Address: acc.GetAddress().String(), + Address: baseAcc.GetAddress().String(), Coins: sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, amount)), } - s.SetupWithGenesisValSet(valSet, []authtypes.GenesisAccount{acc}, balance) + s.SetupWithGenesisValSet(valSet, []authtypes.GenesisAccount{baseAcc}, balance) // Create StateDB s.stateDB = statedb.New(s.ctx, s.app.EvmKeeper, statedb.NewEmptyTxConfig(common.BytesToHash(s.ctx.HeaderHash().Bytes()))) diff --git a/proto/ethermint/evm/v1/evm.proto b/proto/ethermint/evm/v1/evm.proto index 4e558df26d..d0ad1d64c3 100644 --- a/proto/ethermint/evm/v1/evm.proto +++ b/proto/ethermint/evm/v1/evm.proto @@ -43,7 +43,7 @@ message AccessControl { message AccessControlType { // access_type defines which type of permission is required for the operation AccessType access_type = 1 [(gogoproto.customname) = "AccessType", (gogoproto.moretags) = "yaml:\"access_type\""]; - // allowlist_addresses defines defines different things depending on the AccessType: + // access_control_list defines defines different things depending on the AccessType: // - ACCESS_TYPE_PERMISSIONLESS: list of addresses that are blocked from performing the operation // - ACCESS_TYPE_RESTRICTED: ignored // - ACCESS_TYPE_PERMISSIONED: list of addresses that are allowed to perform the operation diff --git a/proto/ethermint/evm/v1/query.proto b/proto/ethermint/evm/v1/query.proto index af2a809f3a..1dfdd4ba6b 100644 --- a/proto/ethermint/evm/v1/query.proto +++ b/proto/ethermint/evm/v1/query.proto @@ -31,7 +31,7 @@ service Query { } // Balance queries the balance of a the EVM denomination for a single - // EthAccount. + // account. rpc Balance(QueryBalanceRequest) returns (QueryBalanceResponse) { option (google.api.http).get = "/evmos/evm/v1/balances/{address}"; } diff --git a/proto/ethermint/types/v1/account.proto b/proto/ethermint/types/v1/account.proto deleted file mode 100644 index a81307e35f..0000000000 --- a/proto/ethermint/types/v1/account.proto +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) -syntax = "proto3"; -package ethermint.types.v1; - -import "cosmos/auth/v1beta1/auth.proto"; -import "cosmos_proto/cosmos.proto"; -import "gogoproto/gogo.proto"; - -option go_package = "github.com/evmos/evmos/v18/types"; - -// EthAccount implements the authtypes.AccountI interface and embeds an -// authtypes.BaseAccount type. It is compatible with the auth AccountKeeper. -message EthAccount { - option (gogoproto.goproto_getters) = false; - option (gogoproto.goproto_stringer) = false; - option (gogoproto.equal) = false; - - option (cosmos_proto.implements_interface) = "github.com/cosmos/cosmos-sdk/x/auth/types.cosmos.auth.v1beta1.AccountI"; - - // base_account is an authtypes.BaseAccount - cosmos.auth.v1beta1.BaseAccount base_account = 1 - [(gogoproto.embed) = true, (gogoproto.moretags) = "yaml:\"base_account\""]; - - // code_hash is the hash calculated from the code contents - string code_hash = 2 [(gogoproto.moretags) = "yaml:\"code_hash\""]; -} diff --git a/testutil/integration/evmos/network/setup.go b/testutil/integration/evmos/network/setup.go index e633bfa815..17a3a26696 100644 --- a/testutil/integration/evmos/network/setup.go +++ b/testutil/integration/evmos/network/setup.go @@ -28,8 +28,6 @@ import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" govtypesv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/ethereum/go-ethereum/crypto" - evmostypes "github.com/evmos/evmos/v18/types" epochstypes "github.com/evmos/evmos/v18/x/epochs/types" infltypes "github.com/evmos/evmos/v18/x/inflation/v1/types" @@ -60,14 +58,10 @@ func createValidatorSetAndSigners(numberOfValidators int) (*tmtypes.ValidatorSet func createGenesisAccounts(accounts []sdktypes.AccAddress) []authtypes.GenesisAccount { numberOfAccounts := len(accounts) genAccounts := make([]authtypes.GenesisAccount, 0, numberOfAccounts) - emptyCodeHash := crypto.Keccak256Hash(nil).String() for _, acc := range accounts { - baseAcc := authtypes.NewBaseAccount(acc, nil, 0, 0) - ethAcc := &evmostypes.EthAccount{ - BaseAccount: baseAcc, - CodeHash: emptyCodeHash, - } - genAccounts = append(genAccounts, ethAcc) + genAccounts = append(genAccounts, authtypes.NewBaseAccount( + acc, nil, 0, 0), + ) } return genAccounts } @@ -270,6 +264,7 @@ func genStateSetter[T proto.Message](moduleName string) genSetupFn { // genesisSetupFunctions contains the available genesis setup functions // that can be used to customize the network genesis var genesisSetupFunctions = map[string]genSetupFn{ + authtypes.ModuleName: genStateSetter[*authtypes.GenesisState](authtypes.ModuleName), evmtypes.ModuleName: genStateSetter[*evmtypes.GenesisState](evmtypes.ModuleName), govtypes.ModuleName: genStateSetter[*govtypesv1.GenesisState](govtypes.ModuleName), infltypes.ModuleName: genStateSetter[*infltypes.GenesisState](infltypes.ModuleName), @@ -325,6 +320,8 @@ func customizeGenesis( if err != nil { return genesisState, err } + } else { + panic("no genesis setup function found for module: " + mod) } } return genesisState, err diff --git a/testutil/integration/evmos/utils/contracts.go b/testutil/integration/evmos/utils/contracts.go index fff3f9f0e1..529e64e9e8 100644 --- a/testutil/integration/evmos/utils/contracts.go +++ b/testutil/integration/evmos/utils/contracts.go @@ -9,8 +9,6 @@ import ( "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" abcitypes "github.com/cometbft/cometbft/abci/types" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - evmostypes "github.com/evmos/evmos/v18/types" evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) @@ -36,19 +34,6 @@ func CheckTxTopics(res abcitypes.ResponseDeliverTx, expectedTopics []string) err return nil } -// IsContractAccount checks if the given account is a contract account -func IsContractAccount(acc authtypes.AccountI) error { - contractETHAccount, ok := acc.(evmostypes.EthAccountI) - if !ok { - return fmt.Errorf("account is not an eth account") - } - - if contractETHAccount.Type() != evmostypes.AccountTypeContract { - return fmt.Errorf("account is not a contract account") - } - return nil -} - // DecodeContractCallResponse decodes the response of a contract call query func DecodeContractCallResponse(response interface{}, callArgs factory.CallArgs, res abcitypes.ResponseDeliverTx) error { msgEthResponse, err := DecodeResponseDeliverTx(res) diff --git a/testutil/network/network.go b/testutil/network/network.go index 81f6a68d55..f63b32f496 100644 --- a/testutil/network/network.go +++ b/testutil/network/network.go @@ -26,7 +26,6 @@ import ( tmrand "github.com/cometbft/cometbft/libs/rand" "github.com/cometbft/cometbft/node" tmclient "github.com/cometbft/cometbft/rpc/client" - "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" "github.com/spf13/cobra" "google.golang.org/grpc" @@ -58,7 +57,6 @@ import ( "github.com/evmos/evmos/v18/encoding" "github.com/evmos/evmos/v18/server/config" evmostypes "github.com/evmos/evmos/v18/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) // package-wide network lock to only allow one test network at a time @@ -417,10 +415,7 @@ func New(l Logger, baseDir string, cfg Config) (*Network, error) { genFiles = append(genFiles, tmCfg.GenesisFile()) genBalances = append(genBalances, banktypes.Balance{Address: addr.String(), Coins: balances.Sort()}) - genAccounts = append(genAccounts, &evmostypes.EthAccount{ - BaseAccount: authtypes.NewBaseAccount(addr, nil, 0, 0), - CodeHash: common.BytesToHash(evmtypes.EmptyCodeHash).Hex(), - }) + genAccounts = append(genAccounts, authtypes.NewBaseAccount(addr, nil, 0, 0)) commission, err := math.LegacyNewDecFromStr("0.5") if err != nil { diff --git a/types/account.go b/types/account.go index 23d1bb53e7..0bbc32e98f 100644 --- a/types/account.go +++ b/types/account.go @@ -1,5 +1,6 @@ // Copyright Tharsis Labs Ltd.(Evmos) // SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + package types import ( diff --git a/types/account_test.go b/types/account_test.go deleted file mode 100644 index f23e006025..0000000000 --- a/types/account_test.go +++ /dev/null @@ -1,58 +0,0 @@ -package types_test - -import ( - "testing" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/stretchr/testify/suite" - - "github.com/cosmos/cosmos-sdk/codec" - codectypes "github.com/cosmos/cosmos-sdk/codec/types" - sdk "github.com/cosmos/cosmos-sdk/types" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - - cryptocodec "github.com/evmos/evmos/v18/crypto/codec" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" - encodingcodec "github.com/evmos/evmos/v18/encoding/codec" - "github.com/evmos/evmos/v18/types" -) - -func init() { - amino := codec.NewLegacyAmino() - cryptocodec.RegisterCrypto(amino) -} - -type AccountTestSuite struct { - suite.Suite - - account *types.EthAccount - cdc codec.JSONCodec -} - -func (suite *AccountTestSuite) SetupTest() { - privKey, err := ethsecp256k1.GenerateKey() - suite.Require().NoError(err) - pubKey := privKey.PubKey() - addr := sdk.AccAddress(pubKey.Address()) - baseAcc := authtypes.NewBaseAccount(addr, pubKey, 10, 50) - suite.account = &types.EthAccount{ - BaseAccount: baseAcc, - CodeHash: common.Hash{}.String(), - } - - interfaceRegistry := codectypes.NewInterfaceRegistry() - encodingcodec.RegisterInterfaces(interfaceRegistry) - suite.cdc = codec.NewProtoCodec(interfaceRegistry) -} - -func TestAccountTestSuite(t *testing.T) { - suite.Run(t, new(AccountTestSuite)) -} - -func (suite *AccountTestSuite) TestAccountType() { - suite.account.CodeHash = common.BytesToHash(crypto.Keccak256(nil)).Hex() - suite.Require().Equal(types.AccountTypeEOA, suite.account.Type()) - suite.account.CodeHash = common.BytesToHash(crypto.Keccak256([]byte{1, 2, 3})).Hex() - suite.Require().Equal(types.AccountTypeContract, suite.account.Type()) -} diff --git a/utils/utils.go b/utils/utils.go index f0e06fd2e2..ea89772c2d 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -31,17 +31,34 @@ const ( BaseDenom = "aevmos" ) -// EthHexToSDKAddr takes a given Hex string and derives a Cosmos SDK account address +// EthHexToCosmosAddr takes a given Hex string and derives a Cosmos SDK account address // from it. -func EthHexToSDKAddr(hexAddr string) sdk.AccAddress { - return EthToSDKAddr(common.HexToAddress(hexAddr)) +func EthHexToCosmosAddr(hexAddr string) sdk.AccAddress { + return EthToCosmosAddr(common.HexToAddress(hexAddr)) } -// EthToSDKAddr converts a given Ethereum style address to an SDK address. -func EthToSDKAddr(addr common.Address) sdk.AccAddress { +// EthToCosmosAddr converts a given Ethereum style address to an SDK address. +func EthToCosmosAddr(addr common.Address) sdk.AccAddress { return sdk.AccAddress(addr.Bytes()) } +// Bech32ToHexAddr converts a given Bech32 address string and converts it to +// an Ethereum address. +func Bech32ToHexAddr(bech32Addr string) (common.Address, error) { + accAddr, err := sdk.AccAddressFromBech32(bech32Addr) + if err != nil { + return common.Address{}, errorsmod.Wrapf(err, "failed to convert bech32 string to address") + } + + return CosmosToEthAddr(accAddr), nil +} + +// CosmosToEthAddr converts a given SDK account address to +// an Ethereum address. +func CosmosToEthAddr(accAddr sdk.AccAddress) common.Address { + return common.BytesToAddress(accAddr.Bytes()) +} + // IsMainnet returns true if the chain-id has the Evmos mainnet EIP155 chain prefix. func IsMainnet(chainID string) bool { return strings.HasPrefix(chainID, MainnetChainID) diff --git a/utils/utils_test.go b/utils/utils_test.go index 175280a615..70995ab169 100644 --- a/utils/utils_test.go +++ b/utils/utils_test.go @@ -4,15 +4,14 @@ import ( "fmt" "testing" - "github.com/stretchr/testify/require" - "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" - + "github.com/ethereum/go-ethereum/common" "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + "github.com/stretchr/testify/require" ) func init() { @@ -233,3 +232,19 @@ func TestAccAddressFromBech32(t *testing.T) { }) } } + +func TestAddressConversion(t *testing.T) { + hex := "0x7cB61D4117AE31a12E393a1Cfa3BaC666481D02E" + bech32 := "evmos10jmp6sgh4cc6zt3e8gw05wavvejgr5pwjnpcky" + + hexAddr := common.HexToAddress(hex) + require.Equal(t, bech32, EthToCosmosAddr(hexAddr).String()) + require.Equal(t, bech32, EthHexToCosmosAddr(hex).String()) + + accAddr := sdk.MustAccAddressFromBech32(bech32) + require.Equal(t, hex, CosmosToEthAddr(accAddr).Hex()) + + gotAddr, err := Bech32ToHexAddr(bech32) + require.NoError(t, err) + require.Equal(t, hex, gotAddr.Hex()) +} diff --git a/x/erc20/keeper/integration_test.go b/x/erc20/keeper/integration_test.go index f13423a476..7d44bd0772 100644 --- a/x/erc20/keeper/integration_test.go +++ b/x/erc20/keeper/integration_test.go @@ -3,24 +3,21 @@ package keeper_test import ( "math/big" - "cosmossdk.io/math" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/ethereum/go-ethereum/common" - //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/gomega" + "cosmossdk.io/math" abci "github.com/cometbft/cometbft/abci/types" + sdk "github.com/cosmos/cosmos-sdk/types" govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" - "github.com/evmos/evmos/v18/utils" - + "github.com/ethereum/go-ethereum/common" "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/crypto/ethsecp256k1" "github.com/evmos/evmos/v18/testutil" + "github.com/evmos/evmos/v18/utils" "github.com/evmos/evmos/v18/x/erc20/types" ) @@ -89,18 +86,22 @@ var _ = Describe("ERC20:", Ordered, func() { addrBz := privKey.PubKey().Address().Bytes() accAddr := sdk.AccAddress(addrBz) addr := common.BytesToAddress(addrBz) - moduleAcc := s.app.AccountKeeper.GetModuleAccount(s.ctx, types.ModuleName).GetAddress() var ( pair *types.TokenPair coin sdk.Coin contract common.Address contract2 common.Address + + // moduleAcc is the address of the ERC-20 module account + moduleAcc sdk.AccAddress ) BeforeEach(func() { s.SetupTest() + moduleAcc = s.app.AccountKeeper.GetModuleAccount(s.ctx, types.ModuleName).GetAddress() + govParams := s.app.GovKeeper.GetParams(s.ctx) govParams.Quorum = "0.0000000001" err := s.app.GovKeeper.SetParams(s.ctx, govParams) @@ -118,10 +119,11 @@ var _ = Describe("ERC20:", Ordered, func() { sdk.NewCoin(metadataCoin.Base, math.NewInt(1)), ) err := testutil.FundAccount(s.ctx, s.app.BankKeeper, accAddr, coins) - s.Require().NoError(err) + Expect(err).To(BeNil()) s.Commit() }) }) + Context("with deployed contracts", func() { BeforeEach(func() { var err error @@ -139,6 +141,7 @@ var _ = Describe("ERC20:", Ordered, func() { s.Require().NoError(err) s.Commit() }) + Describe("for a single ERC20 token", func() { BeforeEach(func() { // register with sufficient deposit @@ -160,12 +163,14 @@ var _ = Describe("ERC20:", Ordered, func() { s.app.EndBlocker(s.ctx, abci.RequestEndBlock{Height: s.ctx.BlockHeight()}) s.Commit() }) + It("should create a token pairs owned by the contract deployer", func() { tokenPairs := s.app.Erc20Keeper.GetTokenPairs(s.ctx) s.Require().Equal(1, len(tokenPairs)) s.Require().Equal(types.OWNER_EXTERNAL, tokenPairs[0].ContractOwner) }) }) + Describe("for multiple ERC20 tokens", func() { BeforeEach(func() { // register with sufficient deposit @@ -186,6 +191,7 @@ var _ = Describe("ERC20:", Ordered, func() { s.app.EndBlocker(s.ctx, abci.RequestEndBlock{Height: s.ctx.BlockHeight()}) s.Commit() }) + It("should create a token pairs owned by the contract deployer", func() { tokenPairs := s.app.Erc20Keeper.GetTokenPairs(s.ctx) s.Require().Equal(2, len(tokenPairs)) diff --git a/x/erc20/keeper/setup_test.go b/x/erc20/keeper/setup_test.go index a71e34dcf2..e51d825a20 100644 --- a/x/erc20/keeper/setup_test.go +++ b/x/erc20/keeper/setup_test.go @@ -3,12 +3,12 @@ package keeper_test import ( "testing" - "cosmossdk.io/math" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/gomega" + "cosmossdk.io/math" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/crypto/keyring" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" @@ -69,11 +69,10 @@ func TestKeeperTestSuite(t *testing.T) { s = new(KeeperTestSuite) suite.Run(t, s) - // Run Ginkgo integration tests RegisterFailHandler(Fail) - RunSpecs(t, "Keeper Suite") + RunSpecs(t, "ERC20 Keeper Integration Tests Suite") } func (suite *KeeperTestSuite) SetupTest() { - suite.DoSetupTest(suite.T()) + suite.DoSetupTest() } diff --git a/x/erc20/keeper/utils_test.go b/x/erc20/keeper/utils_test.go index 17ef1cae46..1d7460bfd3 100644 --- a/x/erc20/keeper/utils_test.go +++ b/x/erc20/keeper/utils_test.go @@ -36,7 +36,6 @@ import ( evm "github.com/evmos/evmos/v18/x/evm/types" feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" - "github.com/stretchr/testify/require" ) func CreatePacket(amount, denom, sender, receiver, srcPort, srcChannel, dstPort, dstChannel string, seq, timeout uint64) channeltypes.Packet { @@ -58,17 +57,18 @@ func CreatePacket(amount, denom, sender, receiver, srcPort, srcChannel, dstPort, ) } -func (suite *KeeperTestSuite) DoSetupTest(t require.TestingT) { +func (suite *KeeperTestSuite) DoSetupTest() { // account key priv, err := ethsecp256k1.GenerateKey() - require.NoError(t, err) + suite.Require().NoError(err) + suite.priv = priv suite.address = common.BytesToAddress(priv.PubKey().Address().Bytes()) suite.signer = utiltx.NewSigner(priv) // consensus key privCons, err := ethsecp256k1.GenerateKey() - require.NoError(t, err) + suite.Require().NoError(err) consAddress := sdk.ConsAddress(privCons.PubKey().Address()) suite.consAddress = consAddress @@ -93,22 +93,22 @@ func (suite *KeeperTestSuite) DoSetupTest(t require.TestingT) { stakingParams := suite.app.StakingKeeper.GetParams(suite.ctx) stakingParams.BondDenom = utils.BaseDenom err = suite.app.StakingKeeper.SetParams(suite.ctx, stakingParams) - require.NoError(t, err) + suite.Require().NoError(err) evmParams := suite.app.EvmKeeper.GetParams(suite.ctx) evmParams.EvmDenom = utils.BaseDenom err = suite.app.EvmKeeper.SetParams(suite.ctx, evmParams) - require.NoError(t, err) + suite.Require().NoError(err) // Set Validator valAddr := sdk.ValAddress(suite.address.Bytes()) validator, err := stakingtypes.NewValidator(valAddr, privCons.PubKey(), stakingtypes.Description{}) - require.NoError(t, err) + suite.Require().NoError(err) validator = stakingkeeper.TestingUpdateValidator(suite.app.StakingKeeper.Keeper, suite.ctx, validator, true) err = suite.app.StakingKeeper.Hooks().AfterValidatorCreated(suite.ctx, validator.GetOperator()) - require.NoError(t, err) + suite.Require().NoError(err) err = suite.app.StakingKeeper.SetValidatorByConsAddr(suite.ctx, validator) - require.NoError(t, err) + suite.Require().NoError(err) // fund signer acc to pay for tx fees amt := sdkmath.NewInt(int64(math.Pow10(18) * 2)) diff --git a/x/evm/genesis.go b/x/evm/genesis.go index 713993c842..ff39e55b37 100644 --- a/x/evm/genesis.go +++ b/x/evm/genesis.go @@ -3,16 +3,13 @@ package evm import ( - "bytes" "fmt" abci "github.com/cometbft/cometbft/abci/types" sdk "github.com/cosmos/cosmos-sdk/types" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - evmostypes "github.com/evmos/evmos/v18/types" "github.com/evmos/evmos/v18/x/evm/keeper" "github.com/evmos/evmos/v18/x/evm/types" ) @@ -39,31 +36,23 @@ func InitGenesis( for _, account := range data.Accounts { address := common.HexToAddress(account.Address) accAddress := sdk.AccAddress(address.Bytes()) - // check that the EVM balance the matches the account balance + + // check that the account is actually found in the account keeper acc := accountKeeper.GetAccount(ctx, accAddress) if acc == nil { panic(fmt.Errorf("account not found for address %s", account.Address)) } - ethAcct, ok := acc.(evmostypes.EthAccountI) - if !ok { - panic( - fmt.Errorf("account %s must be an EthAccount interface, got %T", - account.Address, acc, - ), - ) - } code := common.Hex2Bytes(account.Code) - codeHash := crypto.Keccak256Hash(code) + codeHash := crypto.Keccak256Hash(code).Bytes() - // we ignore the empty Code hash checking, see ethermint PR#1234 - if len(account.Code) != 0 && !bytes.Equal(ethAcct.GetCodeHash().Bytes(), codeHash.Bytes()) { - s := "the evm state code doesn't match with the codehash\n" - panic(fmt.Sprintf("%s account: %s , evm state codehash: %v, ethAccount codehash: %v, evm state code: %s\n", - s, account.Address, codeHash, ethAcct.GetCodeHash(), account.Code)) + if !types.IsEmptyCodeHash(codeHash) { + k.SetCodeHash(ctx, address.Bytes(), codeHash) } - k.SetCode(ctx, codeHash.Bytes(), code) + if len(code) != 0 { + k.SetCode(ctx, codeHash, code) + } for _, storage := range account.Storage { k.SetState(ctx, address, common.HexToHash(storage.Key), common.HexToHash(storage.Value).Bytes()) @@ -74,22 +63,14 @@ func InitGenesis( } // ExportGenesis exports genesis state of the EVM module -func ExportGenesis(ctx sdk.Context, k *keeper.Keeper, ak types.AccountKeeper) *types.GenesisState { +func ExportGenesis(ctx sdk.Context, k *keeper.Keeper) *types.GenesisState { var ethGenAccounts []types.GenesisAccount - ak.IterateAccounts(ctx, func(account authtypes.AccountI) bool { - ethAccount, ok := account.(evmostypes.EthAccountI) - if !ok { - // ignore non EthAccounts - return false - } - - addr := ethAccount.EthAddress() - - storage := k.GetAccountStorage(ctx, addr) + k.IterateContracts(ctx, func(address common.Address, codeHash common.Hash) (stop bool) { + storage := k.GetAccountStorage(ctx, address) genAccount := types.GenesisAccount{ - Address: addr.String(), - Code: common.Bytes2Hex(k.GetCode(ctx, ethAccount.GetCodeHash())), + Address: address.String(), + Code: common.Bytes2Hex(k.GetCode(ctx, codeHash)), Storage: storage, } diff --git a/x/evm/genesis_test.go b/x/evm/genesis_test.go index 4f4a937701..4ffcf5e6d3 100644 --- a/x/evm/genesis_test.go +++ b/x/evm/genesis_test.go @@ -4,12 +4,14 @@ import ( "math/big" "testing" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/evmos/evmos/v18/contracts" "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + testfactory "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" + testhandler "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" testnetwork "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - evmostypes "github.com/evmos/evmos/v18/types" "github.com/evmos/evmos/v18/x/evm" "github.com/evmos/evmos/v18/x/evm/statedb" "github.com/evmos/evmos/v18/x/evm/types" @@ -19,6 +21,8 @@ import ( type GenesisTestSuite struct { keyring testkeyring.Keyring network *testnetwork.UnitTestNetwork + handler testhandler.Handler + factory testfactory.TxFactory } func SetupTest() *GenesisTestSuite { @@ -26,9 +30,14 @@ func SetupTest() *GenesisTestSuite { network := testnetwork.NewUnitTestNetwork( testnetwork.WithPreFundedAccounts(keyring.GetAllAccAddrs()...), ) + handler := testhandler.NewIntegrationHandler(network) + factory := testfactory.New(network, handler) + return &GenesisTestSuite{ keyring: keyring, network: network, + handler: handler, + factory: factory, } } @@ -44,6 +53,7 @@ func TestInitGenesis(t *testing.T) { name string malleate func(*testnetwork.UnitTestNetwork) genState *types.GenesisState + code common.Hash expPanic bool }{ { @@ -83,40 +93,6 @@ func TestInitGenesis(t *testing.T) { }, expPanic: true, }, - { - name: "invalid account type", - malleate: func(network *testnetwork.UnitTestNetwork) { - acc := authtypes.NewBaseAccountWithAddress(address.Bytes()) - network.App.AccountKeeper.SetAccount(network.GetContext(), acc) - }, - genState: &types.GenesisState{ - Params: types.DefaultParams(), - Accounts: []types.GenesisAccount{ - { - Address: address.String(), - }, - }, - }, - expPanic: true, - }, - { - name: "invalid code hash", - malleate: func(network *testnetwork.UnitTestNetwork) { - ctx := network.GetContext() - acc := network.App.AccountKeeper.NewAccountWithAddress(ctx, address.Bytes()) - network.App.AccountKeeper.SetAccount(ctx, acc) - }, - genState: &types.GenesisState{ - Params: types.DefaultParams(), - Accounts: []types.GenesisAccount{ - { - Address: address.String(), - Code: "ffffffff", - }, - }, - }, - expPanic: true, - }, { name: "ignore empty account code checking", malleate: func(network *testnetwork.UnitTestNetwork) { @@ -136,21 +112,18 @@ func TestInitGenesis(t *testing.T) { expPanic: false, }, { - name: "ignore empty account code checking with non-empty codehash", + name: "valid account with code", malleate: func(network *testnetwork.UnitTestNetwork) { - ethAcc := &evmostypes.EthAccount{ - BaseAccount: authtypes.NewBaseAccount(address.Bytes(), nil, 0, 0), - CodeHash: common.BytesToHash([]byte{1, 2, 3}).Hex(), - } - - network.App.AccountKeeper.SetAccount(network.GetContext(), ethAcc) + ctx := network.GetContext() + acc := network.App.AccountKeeper.NewAccountWithAddress(ctx, address.Bytes()) + network.App.AccountKeeper.SetAccount(ctx, acc) }, genState: &types.GenesisState{ Params: types.DefaultParams(), Accounts: []types.GenesisAccount{ { Address: address.String(), - Code: "", + Code: "1234", }, }, }, @@ -191,7 +164,80 @@ func TestInitGenesis(t *testing.T) { *tc.genState, ) }) + + // If the initialization has not panicked we're checking the state + for _, account := range tc.genState.Accounts { + acc := ts.network.App.AccountKeeper.GetAccount(ctx, common.HexToAddress(account.Address).Bytes()) + require.NotNil(t, acc, "account not found in account keeper") + + expHash := crypto.Keccak256Hash(common.Hex2Bytes(account.Code)) + if account.Code == "" { + expHash = common.BytesToHash(types.EmptyCodeHash) + } + + require.Equal(t, + expHash.String(), + ts.network.App.EvmKeeper.GetCodeHash( + ts.network.GetContext(), + common.HexToAddress(account.Address), + ).String(), + "code hash mismatch", + ) + + require.Equal(t, + account.Code, + common.Bytes2Hex( + ts.network.App.EvmKeeper.GetCode( + ts.network.GetContext(), + expHash, + ), + ), + "code mismatch", + ) + + for _, storage := range account.Storage { + key := common.HexToHash(storage.Key) + value := common.HexToHash(storage.Value) + require.Equal(t, value, vmdb.GetState(common.HexToAddress(account.Address), key), "storage mismatch") + } + } } }) } } + +func TestExportGenesis(t *testing.T) { + ts := SetupTest() + + contractAddr, err := ts.factory.DeployContract( + ts.keyring.GetPrivKey(0), + types.EvmTxArgs{}, + testfactory.ContractDeploymentData{ + Contract: contracts.ERC20MinterBurnerDecimalsContract, + ConstructorArgs: []interface{}{"TestToken", "TTK", uint8(18)}, + }, + ) + require.NoError(t, err, "failed to deploy contract") + require.NoError(t, ts.network.NextBlock(), "failed to advance block") + + contractAddr2, err := ts.factory.DeployContract( + ts.keyring.GetPrivKey(0), + types.EvmTxArgs{}, + testfactory.ContractDeploymentData{ + Contract: contracts.ERC20MinterBurnerDecimalsContract, + ConstructorArgs: []interface{}{"AnotherToken", "ATK", uint8(18)}, + }, + ) + require.NoError(t, err, "failed to deploy contract") + require.NoError(t, ts.network.NextBlock(), "failed to advance block") + + genState := evm.ExportGenesis(ts.network.GetContext(), ts.network.App.EvmKeeper) + require.Len(t, genState.Accounts, 2, "expected only one smart contract in the exported genesis") + + genAddresses := make([]string, 0, len(genState.Accounts)) + for _, acc := range genState.Accounts { + genAddresses = append(genAddresses, acc.Address) + } + require.Contains(t, genAddresses, contractAddr.Hex(), "expected contract 1 address in exported genesis") + require.Contains(t, genAddresses, contractAddr2.Hex(), "expected contract 2 address in exported genesis") +} diff --git a/x/evm/keeper/integration_test.go b/x/evm/keeper/integration_test.go index 03c6572c22..24b9f676b9 100644 --- a/x/evm/keeper/integration_test.go +++ b/x/evm/keeper/integration_test.go @@ -5,26 +5,23 @@ package keeper_test import ( "math/big" - "cosmossdk.io/math" - //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/gomega" + "cosmossdk.io/math" + abcitypes "github.com/cometbft/cometbft/abci/types" + sdktypes "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" + ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/evmos/evmos/v18/contracts" "github.com/evmos/evmos/v18/precompiles/staking" - "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" "github.com/evmos/evmos/v18/testutil/integration/evmos/network" integrationutils "github.com/evmos/evmos/v18/testutil/integration/evmos/utils" - - abcitypes "github.com/cometbft/cometbft/abci/types" - sdktypes "github.com/cosmos/cosmos-sdk/types" - ethtypes "github.com/ethereum/go-ethereum/core/types" evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) @@ -161,8 +158,13 @@ var _ = Describe("Handling a MsgEthereumTx message", Label("EVM"), Ordered, func contractBechAddr := sdktypes.AccAddress(contractAddr.Bytes()).String() contractAccount, err := s.grpcHandler.GetAccount(contractBechAddr) Expect(err).To(BeNil()) - err = integrationutils.IsContractAccount(contractAccount) - Expect(err).To(BeNil()) + Expect(contractAccount).ToNot(BeNil(), "expected account to be retrievable via auth query") + + ethAccountRes, err := s.grpcHandler.GetEvmAccount(contractAddr) + Expect(err).To(BeNil(), "expected no error retrieving account from the state db") + Expect(ethAccountRes.CodeHash).ToNot(Equal(common.BytesToHash(evmtypes.EmptyCodeHash).Hex()), + "expected code hash not to be the empty code hash", + ) }, Entry("as a DynamicFeeTx", func() evmtypes.EvmTxArgs { return evmtypes.EvmTxArgs{} }), Entry("as an AccessListTx", diff --git a/x/evm/keeper/keeper.go b/x/evm/keeper/keeper.go index d349d03c10..77f2dd78b1 100644 --- a/x/evm/keeper/keeper.go +++ b/x/evm/keeper/keeper.go @@ -242,19 +242,15 @@ func (k *Keeper) GetAccountWithoutBalance(ctx sdk.Context, addr common.Address) return nil } - codeHash := types.EmptyCodeHash - ethAcct, ok := acct.(evmostypes.EthAccountI) - if ok { - codeHash = ethAcct.GetCodeHash().Bytes() - } + codeHashBz := k.GetCodeHash(ctx, addr).Bytes() return &statedb.Account{ Nonce: acct.GetSequence(), - CodeHash: codeHash, + CodeHash: codeHashBz, } } -// GetAccountOrEmpty returns empty account if not exist, returns error if it's not `EthAccount` +// GetAccountOrEmpty returns empty account if not exist func (k *Keeper) GetAccountOrEmpty(ctx sdk.Context, addr common.Address) statedb.Account { acct := k.GetAccount(ctx, addr) if acct != nil { diff --git a/x/evm/keeper/keeper_test.go b/x/evm/keeper/keeper_test.go index 50058aa2e3..077d8bbcd8 100644 --- a/x/evm/keeper/keeper_test.go +++ b/x/evm/keeper/keeper_test.go @@ -1,11 +1,12 @@ package keeper_test import ( + "fmt" "math/big" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - evmostypes "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v18/utils" "github.com/evmos/evmos/v18/x/evm/keeper" "github.com/evmos/evmos/v18/x/evm/statedb" evmtypes "github.com/evmos/evmos/v18/x/evm/types" @@ -93,40 +94,60 @@ func (suite *KeeperTestSuite) TestBaseFee() { func (suite *KeeperTestSuite) TestGetAccountStorage() { testCases := []struct { name string - malleate func() - expRes []int + malleate func() common.Address }{ { - "Only one account that's not a contract (no storage)", - func() {}, - []int{0}, + name: "Only accounts that are not a contract (no storage)", + malleate: nil, }, { - "Two accounts - one contract (with storage), one wallet", - func() { + name: "One contract (with storage) and other EOAs", + malleate: func() common.Address { supply := big.NewInt(100) - suite.DeployTestContract(suite.T(), suite.address, supply) + contractAddr := suite.DeployTestContract(suite.T(), suite.address, supply) + return contractAddr }, - []int{2, 0}, }, } for _, tc := range testCases { suite.Run(tc.name, func() { suite.SetupTest() - tc.malleate() + + var contractAddr common.Address + if tc.malleate != nil { + contractAddr = tc.malleate() + } + i := 0 suite.app.AccountKeeper.IterateAccounts(suite.ctx, func(account authtypes.AccountI) bool { - ethAccount, ok := account.(evmostypes.EthAccountI) + acc, ok := account.(*authtypes.BaseAccount) if !ok { - // ignore non EthAccounts + // Ignore e.g. module accounts return false } - addr := ethAccount.EthAddress() - storage := suite.app.EvmKeeper.GetAccountStorage(suite.ctx, addr) + address, err := utils.Bech32ToHexAddr(acc.Address) + if err != nil { + // NOTE: we panic in the test to see any potential problems + // instead of skipping to the next account + panic(fmt.Sprintf("failed to convert %s to hex address", err)) + } + + storage := suite.app.EvmKeeper.GetAccountStorage(suite.ctx, address) + + if address == contractAddr { + suite.Require().NotEqual(0, len(storage), + "expected account %d to have non-zero amount of storage slots, got %d", + i, len(storage), + ) + } else { + suite.Require().Len(storage, 0, + "expected account %d to have %d storage slots, got %d", + i, 0, len(storage), + ) + } - suite.Require().Equal(tc.expRes[i], len(storage)) i++ return false }) diff --git a/x/evm/keeper/setup_test.go b/x/evm/keeper/setup_test.go index a4f1b0d3ec..d45bd51f0a 100644 --- a/x/evm/keeper/setup_test.go +++ b/x/evm/keeper/setup_test.go @@ -5,13 +5,6 @@ import ( "testing" "time" - "github.com/evmos/evmos/v18/utils" - - //nolint:revive // dot imports are fine for Ginkgo - . "github.com/onsi/ginkgo/v2" - //nolint:revive // dot imports are fine for Ginkgo - . "github.com/onsi/gomega" - sdkmath "cosmossdk.io/math" "cosmossdk.io/simapp" abci "github.com/cometbft/cometbft/abci/types" @@ -34,7 +27,7 @@ import ( "github.com/evmos/evmos/v18/encoding" "github.com/evmos/evmos/v18/testutil" utiltx "github.com/evmos/evmos/v18/testutil/tx" - evmostypes "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v18/utils" evmtypes "github.com/evmos/evmos/v18/x/evm/types" feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" "github.com/stretchr/testify/require" @@ -78,10 +71,6 @@ func TestKeeperTestSuite(t *testing.T) { // Run UnitTestSuite unitTestSuite := new(UnitTestSuite) suite.Run(t, unitTestSuite) - - // Run Ginkgo integration tests - RegisterFailHandler(Fail) - RunSpecs(t, "Keeper Suite") } func (suite *KeeperTestSuite) SetupTest() { @@ -183,11 +172,7 @@ func (suite *KeeperTestSuite) SetupAppWithT(checkTx bool, t require.TestingT, ch evmtypes.RegisterQueryServer(queryHelper, suite.app.EvmKeeper) suite.queryClient = evmtypes.NewQueryClient(queryHelper) - acc := &evmostypes.EthAccount{ - BaseAccount: authtypes.NewBaseAccount(sdk.AccAddress(suite.address.Bytes()), nil, 0, 0), - CodeHash: common.BytesToHash(crypto.Keccak256(nil)).String(), - } - + acc := authtypes.NewBaseAccount(sdk.AccAddress(suite.address.Bytes()), nil, 0, 0) suite.app.AccountKeeper.SetAccount(suite.ctx, acc) valAddr := sdk.ValAddress(suite.address.Bytes()) diff --git a/x/evm/keeper/statedb.go b/x/evm/keeper/statedb.go index 24a33bf1bf..d3d3770071 100644 --- a/x/evm/keeper/statedb.go +++ b/x/evm/keeper/statedb.go @@ -1,19 +1,17 @@ // Copyright Tharsis Labs Ltd.(Evmos) // SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + package keeper import ( - "fmt" + "errors" "math/big" sdkmath "cosmossdk.io/math" - - errorsmod "cosmossdk.io/errors" "github.com/cosmos/cosmos-sdk/store/prefix" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - evmostypes "github.com/evmos/evmos/v18/types" "github.com/evmos/evmos/v18/x/evm/statedb" "github.com/evmos/evmos/v18/x/evm/types" ) @@ -24,7 +22,7 @@ var _ statedb.Keeper = &Keeper{} // StateDB Keeper implementation // ---------------------------------------------------------------------------- -// GetAccount returns nil if account is not exist, returns error if it's not `EthAccountI` +// GetAccount returns nil if account is not exist func (k *Keeper) GetAccount(ctx sdk.Context, addr common.Address) *statedb.Account { acct := k.GetAccountWithoutBalance(ctx, addr) if acct == nil { @@ -47,6 +45,36 @@ func (k *Keeper) GetState(ctx sdk.Context, addr common.Address, key common.Hash) return common.BytesToHash(value) } +// GetCodeHash loads the code hash from the database for the given contract address. +func (k *Keeper) GetCodeHash(ctx sdk.Context, addr common.Address) common.Hash { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefixCodeHash) + bz := store.Get(addr.Bytes()) + if len(bz) == 0 { + return common.BytesToHash(types.EmptyCodeHash) + } + + return common.BytesToHash(bz) +} + +// IterateContracts iterates over all smart contract addresses in the EVM keeper and +// performs a callback function. +// +// The iteration is stopped when the callback function returns true. +func (k Keeper) IterateContracts(ctx sdk.Context, cb func(addr common.Address, codeHash common.Hash) (stop bool)) { + store := ctx.KVStore(k.storeKey) + iterator := sdk.KVStorePrefixIterator(store, types.KeyPrefixCodeHash) + + defer iterator.Close() + for ; iterator.Valid(); iterator.Next() { + addr := common.BytesToAddress(iterator.Key()) + codeHash := common.BytesToHash(iterator.Value()) + + if cb(addr, codeHash) { + break + } + } +} + // GetCode loads contract code from database, implements `statedb.Keeper` interface. func (k *Keeper) GetCode(ctx sdk.Context, codeHash common.Hash) []byte { store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefixCode) @@ -108,24 +136,20 @@ func (k *Keeper) SetBalance(ctx sdk.Context, addr common.Address, amount *big.In // SetAccount updates nonce/balance/codeHash together. func (k *Keeper) SetAccount(ctx sdk.Context, addr common.Address, account statedb.Account) error { // update account - cosmosAddr := sdk.AccAddress(addr.Bytes()) - acct := k.accountKeeper.GetAccount(ctx, cosmosAddr) + acct := k.accountKeeper.GetAccount(ctx, addr.Bytes()) if acct == nil { - acct = k.accountKeeper.NewAccountWithAddress(ctx, cosmosAddr) + acct = k.accountKeeper.NewAccountWithAddress(ctx, addr.Bytes()) } if err := acct.SetSequence(account.Nonce); err != nil { return err } - codeHash := common.BytesToHash(account.CodeHash) - - if ethAcct, ok := acct.(evmostypes.EthAccountI); ok { - if err := ethAcct.SetCodeHash(codeHash); err != nil { - return err - } + if types.IsEmptyCodeHash(account.CodeHash) { + k.DeleteCodeHash(ctx, addr) + } else { + k.SetCodeHash(ctx, addr.Bytes(), account.CodeHash) } - k.accountKeeper.SetAccount(ctx, acct) if err := k.SetBalance(ctx, addr, account.Balance); err != nil { @@ -136,43 +160,80 @@ func (k *Keeper) SetAccount(ctx sdk.Context, addr common.Address, account stated "account updated", "ethereum-address", addr.Hex(), "nonce", account.Nonce, - "codeHash", codeHash.Hex(), + "codeHash", common.BytesToHash(account.CodeHash).Hex(), "balance", account.Balance, ) return nil } -// SetState update contract storage, delete if value is empty. +// SetState update contract storage. func (k *Keeper) SetState(ctx sdk.Context, addr common.Address, key common.Hash, value []byte) { store := prefix.NewStore(ctx.KVStore(k.storeKey), types.AddressStoragePrefix(addr)) - action := "updated" - if len(value) == 0 { - store.Delete(key.Bytes()) - action = "deleted" - } else { - store.Set(key.Bytes(), value) - } + store.Set(key.Bytes(), value) + + k.Logger(ctx).Debug( + "state updated", + "ethereum-address", addr.Hex(), + "key", key.Hex(), + ) +} + +// DeleteState deletes the entry for the given key in the contract storage +// at the defined contract address. +func (k *Keeper) DeleteState(ctx sdk.Context, addr common.Address, key common.Hash) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.AddressStoragePrefix(addr)) + store.Delete(key.Bytes()) + k.Logger(ctx).Debug( - fmt.Sprintf("state %s", action), + "state deleted", "ethereum-address", addr.Hex(), "key", key.Hex(), ) } -// SetCode set contract code, delete if code is empty. +// SetCodeHash sets the code hash for the given contract address. +func (k *Keeper) SetCodeHash(ctx sdk.Context, addrBytes, hashBytes []byte) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefixCodeHash) + store.Set(addrBytes, hashBytes) + + k.Logger(ctx).Debug( + "code hash updated", + "address", common.BytesToAddress(addrBytes).Hex(), + "code hash", common.BytesToHash(hashBytes).Hex(), + ) +} + +// DeleteCodeHash deletes the code hash for the given contract address from the store. +func (k *Keeper) DeleteCodeHash(ctx sdk.Context, addr common.Address) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefixCodeHash) + store.Delete(addr.Bytes()) + + k.Logger(ctx).Debug( + "code hash deleted", + "address", addr.Hex(), + ) +} + +// SetCode sets the given contract code bytes for the corresponding code hash bytes key +// in the code store. func (k *Keeper) SetCode(ctx sdk.Context, codeHash, code []byte) { store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefixCode) + store.Set(codeHash, code) - // store or delete code - action := "updated" - if len(code) == 0 { - store.Delete(codeHash) - action = "deleted" - } else { - store.Set(codeHash, code) - } k.Logger(ctx).Debug( - fmt.Sprintf("code %s", action), + "code updated", + "code-hash", common.BytesToHash(codeHash).Hex(), + ) +} + +// DeleteCode deletes the contract code for the given code hash bytes in +// the corresponding store. +func (k *Keeper) DeleteCode(ctx sdk.Context, codeHash []byte) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefixCode) + store.Delete(codeHash) + + k.Logger(ctx).Debug( + "code deleted", "code-hash", common.BytesToHash(codeHash).Hex(), ) } @@ -181,6 +242,7 @@ func (k *Keeper) SetCode(ctx sdk.Context, codeHash, code []byte) { // - clear balance // - remove code // - remove states +// - remove the code hash // - remove auth account func (k *Keeper) DeleteAccount(ctx sdk.Context, addr common.Address) error { cosmosAddr := sdk.AccAddress(addr.Bytes()) @@ -189,10 +251,9 @@ func (k *Keeper) DeleteAccount(ctx sdk.Context, addr common.Address) error { return nil } - // NOTE: only Ethereum accounts (contracts) can be selfdestructed - _, ok := acct.(evmostypes.EthAccountI) - if !ok { - return errorsmod.Wrapf(types.ErrInvalidAccount, "type %T, address %s", acct, addr) + // NOTE: only Ethereum contracts can be self-destructed + if !k.IsContract(ctx, addr) { + return errors.New("only smart contracts can be self-destructed") } // clear balance @@ -202,10 +263,13 @@ func (k *Keeper) DeleteAccount(ctx sdk.Context, addr common.Address) error { // clear storage k.ForEachStorage(ctx, addr, func(key, _ common.Hash) bool { - k.SetState(ctx, addr, key, nil) + k.DeleteState(ctx, addr, key) return true }) + // clear code hash + k.DeleteCodeHash(ctx, addr) + // remove auth account k.accountKeeper.RemoveAccount(ctx, acct) diff --git a/x/evm/keeper/statedb_test.go b/x/evm/keeper/statedb_test.go index 165e793c74..a3e0a42470 100644 --- a/x/evm/keeper/statedb_test.go +++ b/x/evm/keeper/statedb_test.go @@ -3,6 +3,7 @@ package keeper_test import ( "fmt" "math/big" + "testing" codectypes "github.com/cosmos/cosmos-sdk/codec/types" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" @@ -16,10 +17,15 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + "github.com/evmos/evmos/v18/contracts" + testfactory "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" + testhandler "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" + testnetwork "github.com/evmos/evmos/v18/testutil/integration/evmos/network" utiltx "github.com/evmos/evmos/v18/testutil/tx" "github.com/evmos/evmos/v18/x/evm/statedb" "github.com/evmos/evmos/v18/x/evm/types" + "github.com/stretchr/testify/require" ) func (suite *KeeperTestSuite) TestCreateAccount() { @@ -237,7 +243,7 @@ func (suite *KeeperTestSuite) TestGetCodeHash() { func(vm.StateDB) {}, }, { - "account not EthAccount type, EmptyCodeHash", + "account is not a smart contract", addr, common.BytesToHash(types.EmptyCodeHash), func(vm.StateDB) {}, @@ -281,7 +287,7 @@ func (suite *KeeperTestSuite) TestSetCode() { false, }, { - "account not EthAccount type", + "account not a smart contract", addr, nil, true, @@ -318,7 +324,7 @@ func (suite *KeeperTestSuite) TestSetCode() { } } -func (suite *KeeperTestSuite) TestKeeperSetCode() { +func (suite *KeeperTestSuite) TestKeeperSetOrDeleteCode() { addr := utiltx.GenerateAddress() baseAcc := &authtypes.BaseAccount{Address: sdk.AccAddress(addr.Bytes()).String()} suite.app.AccountKeeper.SetAccount(suite.ctx, baseAcc) @@ -342,7 +348,11 @@ func (suite *KeeperTestSuite) TestKeeperSetCode() { for _, tc := range testCases { suite.Run(tc.name, func() { - suite.app.EvmKeeper.SetCode(suite.ctx, tc.codeHash, tc.code) + if len(tc.code) == 0 { + suite.app.EvmKeeper.DeleteCode(suite.ctx, tc.codeHash) + } else { + suite.app.EvmKeeper.SetCode(suite.ctx, tc.codeHash, tc.code) + } key := suite.app.GetKey(types.StoreKey) store := prefix.NewStore(suite.ctx.KVStore(key), types.KeyPrefixCode) code := store.Get(tc.codeHash) @@ -352,6 +362,54 @@ func (suite *KeeperTestSuite) TestKeeperSetCode() { } } +func TestIterateContracts(t *testing.T) { + keyring := testkeyring.New(1) + network := testnetwork.NewUnitTestNetwork( + testnetwork.WithPreFundedAccounts(keyring.GetAllAccAddrs()...), + ) + handler := testhandler.NewIntegrationHandler(network) + factory := testfactory.New(network, handler) + + contractAddr, err := factory.DeployContract( + keyring.GetPrivKey(0), + types.EvmTxArgs{}, + testfactory.ContractDeploymentData{ + Contract: contracts.ERC20MinterBurnerDecimalsContract, + ConstructorArgs: []interface{}{"TestToken", "TTK", uint8(18)}, + }, + ) + require.NoError(t, err, "failed to deploy contract") + require.NoError(t, network.NextBlock(), "failed to advance block") + + contractAddr2, err := factory.DeployContract( + keyring.GetPrivKey(0), + types.EvmTxArgs{}, + testfactory.ContractDeploymentData{ + Contract: contracts.ERC20MinterBurnerDecimalsContract, + ConstructorArgs: []interface{}{"AnotherToken", "ATK", uint8(18)}, + }, + ) + require.NoError(t, err, "failed to deploy contract") + require.NoError(t, network.NextBlock(), "failed to advance block") + + var ( + foundAddrs []common.Address + foundHashes []common.Hash + ) + + network.App.EvmKeeper.IterateContracts(network.GetContext(), func(addr common.Address, codeHash common.Hash) bool { + foundAddrs = append(foundAddrs, addr) + foundHashes = append(foundHashes, codeHash) + return false + }) + + require.Len(t, foundAddrs, 2, "expected 2 contracts to be found when iterating") + require.Contains(t, foundAddrs, contractAddr, "expected contract 1 to be found when iterating") + require.Contains(t, foundAddrs, contractAddr2, "expected contract 2 to be found when iterating") + require.Equal(t, foundHashes[0], foundHashes[1], "expected both contracts to have the same code hash") + require.NotEqual(t, types.EmptyCodeHash, foundHashes[0], "expected store code hash not to be the keccak256 of empty code") +} + func (suite *KeeperTestSuite) TestRefund() { testCases := []struct { name string @@ -442,55 +500,69 @@ func (suite *KeeperTestSuite) TestCommittedState() { suite.Require().Equal(value2, tmp) } +func (suite *KeeperTestSuite) TestSetAndGetCodeHash() { + suite.SetupTest() +} + func (suite *KeeperTestSuite) TestSuicide() { - code := []byte("code") + suite.SetupTest() + + // Generate addresses for testing + addr1 := utiltx.GenerateAddress() + addr2 := utiltx.GenerateAddress() + + // Set the code in the code storage + code := []byte("code1") + codeHashBz := crypto.Keccak256(code) + suite.app.EvmKeeper.SetCodeHash(s.ctx, addr1.Bytes(), codeHashBz) + suite.app.EvmKeeper.SetCodeHash(s.ctx, addr2.Bytes(), codeHashBz) + + // NOTE: we're instantiating the StateDB here to have the context already contain the db := suite.StateDB() + // Add code to account - db.SetCode(suite.address, code) - suite.Require().Equal(code, db.GetCode(suite.address)) + db.SetCode(addr1, code) + + suite.Require().Equal(code, db.GetCode(addr1)) // Add state to account for i := 0; i < 5; i++ { - db.SetState(suite.address, common.BytesToHash([]byte(fmt.Sprintf("key%d", i))), common.BytesToHash([]byte(fmt.Sprintf("value%d", i)))) + db.SetState(addr1, common.BytesToHash([]byte(fmt.Sprintf("key%d", i))), common.BytesToHash([]byte(fmt.Sprintf("value%d", i)))) } suite.Require().NoError(db.Commit()) db = suite.StateDB() - // Generate 2nd address - privkey, _ := ethsecp256k1.GenerateKey() - key, err := privkey.ToECDSA() - suite.Require().NoError(err) - addr2 := crypto.PubkeyToAddress(key.PublicKey) - // Add code and state to account 2 db.SetCode(addr2, code) suite.Require().Equal(code, db.GetCode(addr2)) + for i := 0; i < 5; i++ { db.SetState(addr2, common.BytesToHash([]byte(fmt.Sprintf("key%d", i))), common.BytesToHash([]byte(fmt.Sprintf("value%d", i)))) } // Call Suicide - suite.Require().Equal(true, db.Suicide(suite.address)) + suite.Require().Equal(true, db.Suicide(addr1)) // Check suicided is marked - suite.Require().Equal(true, db.HasSuicided(suite.address)) + suite.Require().Equal(true, db.HasSuicided(addr1)) // Commit state suite.Require().NoError(db.Commit()) db = suite.StateDB() // Check code is deleted - suite.Require().Nil(db.GetCode(suite.address)) + suite.Require().Nil(db.GetCode(addr1)) + // Check state is deleted var storage types.Storage - suite.app.EvmKeeper.ForEachStorage(suite.ctx, suite.address, func(key, value common.Hash) bool { + suite.app.EvmKeeper.ForEachStorage(suite.ctx, addr1, func(key, value common.Hash) bool { storage = append(storage, types.NewState(key, value)) return true }) suite.Require().Equal(0, len(storage)) // Check account is deleted - suite.Require().Equal(common.Hash{}, db.GetCodeHash(suite.address)) + suite.Require().Equal(common.Hash{}, db.GetCodeHash(addr1)) // Check code is still present in addr2 and suicided is false suite.Require().NotNil(db.GetCode(addr2)) @@ -936,41 +1008,52 @@ func (suite *KeeperTestSuite) TestSetBalance() { } func (suite *KeeperTestSuite) TestDeleteAccount() { + suite.SetupTest() + supply := big.NewInt(100) contractAddr := suite.DeployTestContract(suite.T(), suite.address, supply) testCases := []struct { - name string - addr common.Address - expErr bool + name string + addr common.Address + expPass bool + errContains string }{ { - "remove address", - suite.address, - false, + name: "remove address", + addr: suite.address, + errContains: "only smart contracts can be self-destructed", }, { - "remove unexistent address - returns nil error", - common.HexToAddress("unexistent_address"), - false, + name: "remove unexistent address - returns nil error", + addr: common.HexToAddress("unexistent_address"), + expPass: true, }, { - "remove deployed contract", - contractAddr, - false, + name: "remove deployed contract", + addr: contractAddr, + expPass: true, }, } for _, tc := range testCases { suite.Run(tc.name, func() { suite.SetupTest() + err := suite.app.EvmKeeper.DeleteAccount(suite.ctx, tc.addr) - if tc.expErr { - suite.Require().Error(err) - } else { - suite.Require().NoError(err) + if tc.expPass { + suite.Require().NoError(err, "expected deleting account to succeed") + + acc := suite.app.EvmKeeper.GetAccount(suite.ctx, tc.addr) + suite.Require().Nil(acc, "expected no account to be found after deleting") + balance := suite.app.EvmKeeper.GetBalance(suite.ctx, tc.addr) - suite.Require().Equal(new(big.Int), balance) + suite.Require().Equal(new(big.Int), balance, "expected balance to be zero after deleting account") + } else { + suite.Require().ErrorContains(err, tc.errContains, "expected error to contain message") + + acc := suite.app.EvmKeeper.GetAccount(suite.ctx, tc.addr) + suite.Require().NotNil(acc, "expected account to still be found after failing to delete") } }) } diff --git a/x/evm/keeper/utils.go b/x/evm/keeper/utils.go new file mode 100644 index 0000000000..7e1ee342ab --- /dev/null +++ b/x/evm/keeper/utils.go @@ -0,0 +1,17 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package keeper + +import ( + "github.com/cosmos/cosmos-sdk/store/prefix" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/common" + "github.com/evmos/evmos/v18/x/evm/types" +) + +// IsContract determines if the given address is a smart contract. +func (k *Keeper) IsContract(ctx sdk.Context, addr common.Address) bool { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefixCodeHash) + return store.Has(addr.Bytes()) +} diff --git a/x/evm/migrations/v7/types/evm.pb.go b/x/evm/migrations/v7/types/evm.pb.go index d6184e6984..825b28faff 100644 --- a/x/evm/migrations/v7/types/evm.pb.go +++ b/x/evm/migrations/v7/types/evm.pb.go @@ -4172,4 +4172,4 @@ var ( ErrInvalidLengthEvm = fmt.Errorf("proto: negative length found during unmarshaling") ErrIntOverflowEvm = fmt.Errorf("proto: integer overflow") ErrUnexpectedEndOfGroupEvm = fmt.Errorf("proto: unexpected end of group") -) \ No newline at end of file +) diff --git a/x/evm/module.go b/x/evm/module.go index 30e536733c..cd286f1ef0 100644 --- a/x/evm/module.go +++ b/x/evm/module.go @@ -173,7 +173,7 @@ func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, data json. // ExportGenesis returns the exported genesis state as raw bytes for the evm // module. func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.RawMessage { - gs := ExportGenesis(ctx, am.keeper, am.ak) + gs := ExportGenesis(ctx, am.keeper) return cdc.MustMarshalJSON(gs) } diff --git a/x/evm/statedb/interfaces.go b/x/evm/statedb/interfaces.go index 4b43539e56..633591b42c 100644 --- a/x/evm/statedb/interfaces.go +++ b/x/evm/statedb/interfaces.go @@ -29,7 +29,9 @@ type Keeper interface { // Write methods, only called by `StateDB.Commit()` SetAccount(ctx sdk.Context, addr common.Address, account Account) error + DeleteState(ctx sdk.Context, addr common.Address, key common.Hash) SetState(ctx sdk.Context, addr common.Address, key common.Hash, value []byte) + DeleteCode(ctx sdk.Context, codeHash []byte) SetCode(ctx sdk.Context, codeHash []byte, code []byte) DeleteAccount(ctx sdk.Context, addr common.Address) error } diff --git a/x/evm/statedb/mock_test.go b/x/evm/statedb/mock_test.go index adb9934b70..80e3d857ad 100644 --- a/x/evm/statedb/mock_test.go +++ b/x/evm/statedb/mock_test.go @@ -1,7 +1,6 @@ package statedb_test import ( - "bytes" "errors" "maps" "math/big" @@ -10,6 +9,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" "github.com/evmos/evmos/v18/x/evm/statedb" + "github.com/evmos/evmos/v18/x/evm/types" ) var ( @@ -78,11 +78,13 @@ func (k MockKeeper) SetAccount(_ sdk.Context, addr common.Address, account state func (k MockKeeper) SetState(_ sdk.Context, addr common.Address, key common.Hash, value []byte) { if acct, ok := k.accounts[addr]; ok { - if len(value) == 0 { - delete(acct.states, key) - } else { - acct.states[key] = common.BytesToHash(value) - } + acct.states[key] = common.BytesToHash(value) + } +} + +func (k MockKeeper) DeleteState(_ sdk.Context, addr common.Address, key common.Hash) { + if acct, ok := k.accounts[addr]; ok { + delete(acct.states, key) } } @@ -90,13 +92,17 @@ func (k MockKeeper) SetCode(_ sdk.Context, codeHash []byte, code []byte) { k.codes[common.BytesToHash(codeHash)] = code } +func (k MockKeeper) DeleteCode(_ sdk.Context, codeHash []byte) { + delete(k.codes, common.BytesToHash(codeHash)) +} + func (k MockKeeper) DeleteAccount(_ sdk.Context, addr common.Address) error { if addr == errAddress { return errors.New("mock db error") } old := k.accounts[addr] delete(k.accounts, addr) - if !bytes.Equal(old.account.CodeHash, emptyCodeHash) { + if !types.IsEmptyCodeHash(old.account.CodeHash) { delete(k.codes, common.BytesToHash(old.account.CodeHash)) } return nil diff --git a/x/evm/statedb/state_object.go b/x/evm/statedb/state_object.go index 0657385446..9df6872d09 100644 --- a/x/evm/statedb/state_object.go +++ b/x/evm/statedb/state_object.go @@ -8,11 +8,9 @@ import ( "sort" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" + "github.com/evmos/evmos/v18/x/evm/types" ) -var emptyCodeHash = crypto.Keccak256(nil) - // Account is the Ethereum consensus representation of accounts. // These objects are stored in the storage of auth module. type Account struct { @@ -25,13 +23,13 @@ type Account struct { func NewEmptyAccount() *Account { return &Account{ Balance: new(big.Int), - CodeHash: emptyCodeHash, + CodeHash: types.EmptyCodeHash, } } // IsContract returns if the account contains contract code. func (acct Account) IsContract() bool { - return !bytes.Equal(acct.CodeHash, emptyCodeHash) + return !types.IsEmptyCodeHash(acct.CodeHash) } // Storage represents in-memory cache/buffer of contract storage. @@ -76,9 +74,11 @@ func newObject(db *StateDB, address common.Address, account Account) *stateObjec if account.Balance == nil { account.Balance = new(big.Int) } + if account.CodeHash == nil { - account.CodeHash = emptyCodeHash + account.CodeHash = types.EmptyCodeHash } + return &stateObject{ db: db, address: address, @@ -91,7 +91,9 @@ func newObject(db *StateDB, address common.Address, account Account) *stateObjec // empty returns whether the account is considered empty. func (s *stateObject) empty() bool { - return s.account.Nonce == 0 && s.account.Balance.Sign() == 0 && bytes.Equal(s.account.CodeHash, emptyCodeHash) + return s.account.Nonce == 0 && + s.account.Balance.Sign() == 0 && + types.IsEmptyCodeHash(s.account.CodeHash) } func (s *stateObject) markSuicided() { @@ -143,11 +145,14 @@ func (s *stateObject) Code() []byte { if s.code != nil { return s.code } - if bytes.Equal(s.CodeHash(), emptyCodeHash) { + + if types.IsEmptyCodeHash(s.CodeHash()) { return nil } + code := s.db.keeper.GetCode(s.db.ctx, common.BytesToHash(s.CodeHash())) s.code = code + return code } diff --git a/x/evm/statedb/statedb.go b/x/evm/statedb/statedb.go index 0e16614c64..a4215fad0b 100644 --- a/x/evm/statedb/statedb.go +++ b/x/evm/statedb/statedb.go @@ -447,15 +447,21 @@ func (s *StateDB) Commit() error { obj := s.stateObjects[addr] if obj.suicided { if err := s.keeper.DeleteAccount(s.ctx, obj.Address()); err != nil { - return errorsmod.Wrap(err, "failed to delete account") + return errorsmod.Wrap(err, fmt.Sprintf("failed to delete account %s", obj.Address())) } } else { if obj.code != nil && obj.dirtyCode { - s.keeper.SetCode(s.ctx, obj.CodeHash(), obj.code) + if len(obj.code) == 0 { + s.keeper.DeleteCode(s.ctx, obj.CodeHash()) + } else { + s.keeper.SetCode(s.ctx, obj.CodeHash(), obj.code) + } } + if err := s.keeper.SetAccount(s.ctx, obj.Address(), obj.account); err != nil { return errorsmod.Wrap(err, "failed to set account") } + for _, key := range obj.dirtyStorage.SortedKeys() { dirtyValue := obj.dirtyStorage[key] originValue := obj.originStorage[key] @@ -465,7 +471,13 @@ func (s *StateDB) Commit() error { (!ok && dirtyValue == originValue) { continue } - s.keeper.SetState(s.ctx, obj.Address(), key, dirtyValue.Bytes()) + + dirtyBytes := dirtyValue.Bytes() + if len(dirtyBytes) == 0 { + s.keeper.DeleteState(s.ctx, obj.Address(), key) + } else { + s.keeper.SetState(s.ctx, obj.Address(), key, dirtyValue.Bytes()) + } // Update the pendingStorage cache to the new value. // This is specially needed for precompiles calls where diff --git a/x/evm/types/evm.pb.go b/x/evm/types/evm.pb.go index aa0220cb3f..21ea1095f5 100644 --- a/x/evm/types/evm.pb.go +++ b/x/evm/types/evm.pb.go @@ -219,7 +219,7 @@ func (m *AccessControl) GetCall() AccessControlType { type AccessControlType struct { // access_type defines which type of permission is required for the operation AccessType AccessType `protobuf:"varint,1,opt,name=access_type,json=accessType,proto3,enum=ethermint.evm.v1.AccessType" json:"access_type,omitempty" yaml:"access_type"` - // allowlist_addresses defines defines different things depending on the AccessType: + // access_control_list defines defines different things depending on the AccessType: // - ACCESS_TYPE_PERMISSIONLESS: list of addresses that are blocked from performing the operation // - ACCESS_TYPE_RESTRICTED: ignored // - ACCESS_TYPE_PERMISSIONED: list of addresses that are allowed to perform the operation diff --git a/x/evm/types/interfaces.go b/x/evm/types/interfaces.go index 3e8c9c3dba..16c20bfd34 100644 --- a/x/evm/types/interfaces.go +++ b/x/evm/types/interfaces.go @@ -18,7 +18,6 @@ import ( type AccountKeeper interface { NewAccountWithAddress(ctx sdk.Context, addr sdk.AccAddress) authtypes.AccountI GetModuleAddress(moduleName string) sdk.AccAddress - IterateAccounts(ctx sdk.Context, cb func(account authtypes.AccountI) bool) GetAccount(ctx sdk.Context, addr sdk.AccAddress) authtypes.AccountI SetAccount(ctx sdk.Context, account authtypes.AccountI) RemoveAccount(ctx sdk.Context, account authtypes.AccountI) diff --git a/x/evm/types/key.go b/x/evm/types/key.go index 2b35d6b71b..e9a163f686 100644 --- a/x/evm/types/key.go +++ b/x/evm/types/key.go @@ -28,6 +28,7 @@ const ( prefixCode = iota + 1 prefixStorage prefixParams + prefixCodeHash ) // prefix bytes for the EVM transient store @@ -40,9 +41,10 @@ const ( // KVStore key prefixes var ( - KeyPrefixCode = []byte{prefixCode} - KeyPrefixStorage = []byte{prefixStorage} - KeyPrefixParams = []byte{prefixParams} + KeyPrefixCode = []byte{prefixCode} + KeyPrefixStorage = []byte{prefixStorage} + KeyPrefixParams = []byte{prefixParams} + KeyPrefixCodeHash = []byte{prefixCodeHash} ) // Transient Store key prefixes diff --git a/x/evm/types/query.pb.go b/x/evm/types/query.pb.go index 4be65d46b1..8a6d471546 100644 --- a/x/evm/types/query.pb.go +++ b/x/evm/types/query.pb.go @@ -1448,7 +1448,7 @@ type QueryClient interface { // Address. ValidatorAccount(ctx context.Context, in *QueryValidatorAccountRequest, opts ...grpc.CallOption) (*QueryValidatorAccountResponse, error) // Balance queries the balance of a the EVM denomination for a single - // EthAccount. + // account. Balance(ctx context.Context, in *QueryBalanceRequest, opts ...grpc.CallOption) (*QueryBalanceResponse, error) // Storage queries the balance of all coins for a single account. Storage(ctx context.Context, in *QueryStorageRequest, opts ...grpc.CallOption) (*QueryStorageResponse, error) @@ -1595,7 +1595,7 @@ type QueryServer interface { // Address. ValidatorAccount(context.Context, *QueryValidatorAccountRequest) (*QueryValidatorAccountResponse, error) // Balance queries the balance of a the EVM denomination for a single - // EthAccount. + // account. Balance(context.Context, *QueryBalanceRequest) (*QueryBalanceResponse, error) // Storage queries the balance of all coins for a single account. Storage(context.Context, *QueryStorageRequest) (*QueryStorageResponse, error) diff --git a/x/evm/types/utils.go b/x/evm/types/utils.go index 5d27b90192..bd01d73edb 100644 --- a/x/evm/types/utils.go +++ b/x/evm/types/utils.go @@ -4,26 +4,33 @@ package types import ( + "bytes" "fmt" "math/big" - "github.com/cosmos/gogoproto/proto" - errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" - + "github.com/cosmos/gogoproto/proto" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/crypto" ) -// DefaultPriorityReduction is the default amount of price values required for 1 unit of priority. -// Because priority is `int64` while price is `big.Int`, it's necessary to scale down the range to keep it more pratical. -// The default value is the same as the `sdk.DefaultPowerReduction`. -var DefaultPriorityReduction = sdk.DefaultPowerReduction +var ( + // DefaultPriorityReduction is the default amount of price values required for 1 unit of priority. + // Because priority is `int64` while price is `big.Int`, it's necessary to scale down the range to keep it more pratical. + // The default value is the same as the `sdk.DefaultPowerReduction`. + DefaultPriorityReduction = sdk.DefaultPowerReduction -var EmptyCodeHash = crypto.Keccak256(nil) + // EmptyCodeHash is keccak256 hash of nil to represent empty code. + EmptyCodeHash = crypto.Keccak256(nil) +) + +// IsEmptyCodeHash checks if the given byte slice represents an empty code hash. +func IsEmptyCodeHash(bz []byte) bool { + return bytes.Equal(bz, EmptyCodeHash) +} // DecodeTxResponse decodes an protobuf-encoded byte slice into TxResponse func DecodeTxResponse(in []byte) (*MsgEthereumTxResponse, error) { diff --git a/x/feemarket/keeper/utils_test.go b/x/feemarket/keeper/utils_test.go index be53167bd2..b3b22d5fca 100644 --- a/x/feemarket/keeper/utils_test.go +++ b/x/feemarket/keeper/utils_test.go @@ -19,14 +19,12 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" "github.com/evmos/evmos/v18/app" "github.com/evmos/evmos/v18/crypto/ethsecp256k1" "github.com/evmos/evmos/v18/encoding" "github.com/evmos/evmos/v18/testutil" utiltx "github.com/evmos/evmos/v18/testutil/tx" - evmostypes "github.com/evmos/evmos/v18/types" evmtypes "github.com/evmos/evmos/v18/x/evm/types" "github.com/evmos/evmos/v18/x/feemarket/types" @@ -60,11 +58,7 @@ func (suite *KeeperTestSuite) SetupApp(checkTx bool, chainID string) { types.RegisterQueryServer(queryHelper, suite.app.FeeMarketKeeper) suite.queryClient = types.NewQueryClient(queryHelper) - acc := &evmostypes.EthAccount{ - BaseAccount: authtypes.NewBaseAccount(sdk.AccAddress(suite.address.Bytes()), nil, 0, 0), - CodeHash: common.BytesToHash(crypto.Keccak256(nil)).String(), - } - + acc := authtypes.NewBaseAccount(sdk.AccAddress(suite.address.Bytes()), nil, 0, 0) suite.app.AccountKeeper.SetAccount(suite.ctx, acc) valAddr := sdk.ValAddress(suite.address.Bytes()) diff --git a/x/staking/keeper/msg_server_test.go b/x/staking/keeper/msg_server_test.go index 990155df05..31ea7f6179 100644 --- a/x/staking/keeper/msg_server_test.go +++ b/x/staking/keeper/msg_server_test.go @@ -37,7 +37,7 @@ func TestMsgDelegate(t *testing.T) { errMsg string }{ { - name: "can delegate from a common EthAccount", + name: "can delegate from a common account", setup: func() sdk.Coin { // Send some funds to delegator account err := testutil.FundAccountWithBaseDenom(ctx, nw.App.BankKeeper, delegatorAddr, defaultDelCoin.Amount.Int64()) @@ -156,7 +156,7 @@ func TestMsgCreateValidator(t *testing.T) { errMsg string }{ { - name: "can create a validator using a common EthAccount", + name: "can create a validator using a common account", setup: func() sdk.Coin { // Send some funds to delegator account err := testutil.FundAccountWithBaseDenom(ctx, nw.App.BankKeeper, validatorAddr, defaultDelCoin.Amount.Int64()) diff --git a/x/vesting/keeper/keeper.go b/x/vesting/keeper/keeper.go index 9a53f0cda7..546abbb92a 100644 --- a/x/vesting/keeper/keeper.go +++ b/x/vesting/keeper/keeper.go @@ -21,6 +21,7 @@ type Keeper struct { accountKeeper types.AccountKeeper bankKeeper types.BankKeeper + evmKeeper types.EVMKeeper stakingKeeper types.StakingKeeper distributionKeeper types.DistributionKeeper govKeeper types.GovKeeper @@ -37,6 +38,7 @@ func NewKeeper( ak types.AccountKeeper, bk types.BankKeeper, dk types.DistributionKeeper, + ek types.EVMKeeper, sk types.StakingKeeper, gk types.GovKeeper, ) Keeper { @@ -52,6 +54,7 @@ func NewKeeper( distributionKeeper: dk, accountKeeper: ak, bankKeeper: bk, + evmKeeper: ek, stakingKeeper: sk, govKeeper: gk, } diff --git a/x/vesting/keeper/keeper_test.go b/x/vesting/keeper/keeper_test.go index 01d5cc958a..8c9036e799 100644 --- a/x/vesting/keeper/keeper_test.go +++ b/x/vesting/keeper/keeper_test.go @@ -41,6 +41,7 @@ func (suite *KeeperTestSuite) TestNewKeeper() { suite.app.AccountKeeper, suite.app.BankKeeper, suite.app.DistrKeeper, + suite.app.EvmKeeper, suite.app.StakingKeeper, suite.app.GovKeeper, ) @@ -54,6 +55,7 @@ func (suite *KeeperTestSuite) TestNewKeeper() { suite.app.AccountKeeper, suite.app.BankKeeper, suite.app.DistrKeeper, + suite.app.EvmKeeper, suite.app.StakingKeeper, suite.app.GovKeeper, ) diff --git a/x/vesting/keeper/msg_server.go b/x/vesting/keeper/msg_server.go index 99c654ed63..f8d0be6210 100644 --- a/x/vesting/keeper/msg_server.go +++ b/x/vesting/keeper/msg_server.go @@ -7,17 +7,14 @@ import ( "context" "time" - "github.com/ethereum/go-ethereum/crypto" - - "github.com/cosmos/cosmos-sdk/telemetry" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - errorsmod "cosmossdk.io/errors" + "github.com/cosmos/cosmos-sdk/telemetry" sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" sdkvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types" - evmostypes "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v18/utils" "github.com/evmos/evmos/v18/x/vesting/types" ) @@ -35,6 +32,7 @@ func (k Keeper) CreateClawbackVestingAccount( ctx := sdk.UnwrapSDKContext(goCtx) ak := k.accountKeeper bk := k.bankKeeper + ek := k.evmKeeper // Error checked during msg validation funderAddress := sdk.MustAccAddressFromBech32(msg.FunderAddress) @@ -62,22 +60,19 @@ func (k Keeper) CreateClawbackVestingAccount( ) } - // Initialize the vesting account - ethAcc, ok := acc.(*evmostypes.EthAccount) - if !ok { + // Check for contract account (code hash is not empty) + if ek.IsContract(ctx, utils.CosmosToEthAddr(acc.GetAddress())) { return nil, errorsmod.Wrapf(errortypes.ErrInvalidRequest, - "account %s is not an Ethereum account", msg.VestingAddress, + "account %s is a contract account and cannot be converted in a clawback vesting account", msg.VestingAddress, ) } - // Check for contract account (code hash is not empty) - if ethAcc.CodeHash != crypto.Keccak256Hash([]byte{}).String() { + baseAcc, ok := acc.(*authtypes.BaseAccount) + if !ok { return nil, errorsmod.Wrapf(errortypes.ErrInvalidRequest, - "account %s is a contract account and cannot be converted in a clawback vesting account", msg.VestingAddress, + "account %s could not be converted to a base account", msg.VestingAddress, ) } - - baseAcc := ethAcc.GetBaseAccount() baseVestingAcc := &sdkvesting.BaseVestingAccount{BaseAccount: baseAcc} vestingAcc := &types.ClawbackVestingAccount{ BaseVestingAccount: baseVestingAcc, @@ -380,9 +375,8 @@ func (k Keeper) ConvertVestingAccount( // if no entry is found for the address, this will no-op k.DeleteGovClawbackDisabled(ctx, address) - ethAccount := evmostypes.ProtoAccount().(*evmostypes.EthAccount) - ethAccount.BaseAccount = vestingAcc.BaseAccount - k.accountKeeper.SetAccount(ctx, ethAccount) + baseAcc := vestingAcc.BaseAccount + k.accountKeeper.SetAccount(ctx, baseAcc) return &types.MsgConvertVestingAccountResponse{}, nil } @@ -451,16 +445,15 @@ func (k Keeper) transferClawback( // Compute clawback amount, unlock unvested tokens and remove future vesting events updatedAcc, toClawBack := vestingAccount.ComputeClawback(ctx.BlockTime().Unix()) - // convert the account back to a normal EthAccount + // convert the account back to a normal account // // NOTE: this is necessary to allow the bank keeper to send the locked coins away to the // destination address. If the account is not converted, the coins will still be seen as locked, // and can therefore not be transferred. - ethAccount := evmostypes.ProtoAccount().(*evmostypes.EthAccount) - ethAccount.BaseAccount = updatedAcc.BaseAccount + baseAcc := updatedAcc.BaseAccount // set the account with the updated values of the vesting schedule - k.accountKeeper.SetAccount(ctx, ethAccount) + k.accountKeeper.SetAccount(ctx, baseAcc) address := updatedAcc.GetAddress() diff --git a/x/vesting/keeper/msg_server_test.go b/x/vesting/keeper/msg_server_test.go index 1f10221c8d..0ed4a20881 100644 --- a/x/vesting/keeper/msg_server_test.go +++ b/x/vesting/keeper/msg_server_test.go @@ -5,14 +5,13 @@ import ( "time" sdk "github.com/cosmos/cosmos-sdk/types" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - sdkvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" - vestingexported "github.com/cosmos/cosmos-sdk/x/auth/vesting/exported" + sdkvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" + "github.com/evmos/evmos/v18/contracts" "github.com/evmos/evmos/v18/testutil" utiltx "github.com/evmos/evmos/v18/testutil/tx" - evmostypes "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v18/utils" "github.com/evmos/evmos/v18/x/vesting/types" ) @@ -211,34 +210,42 @@ func (suite *KeeperTestSuite) TestMsgCreateClawbackVestingAccount() { testcases := []struct { name string - malleate func(funder sdk.AccAddress, vestingAddr sdk.AccAddress) + malleate func(funder sdk.AccAddress) sdk.AccAddress funder sdk.AccAddress - vestingAddr sdk.AccAddress expPass bool errContains string }{ { - name: "fail - account does not exist", - malleate: func(sdk.AccAddress, sdk.AccAddress) {}, + name: "fail - account does not exist", + malleate: func(sdk.AccAddress) sdk.AccAddress { + return vestingAddr + }, funder: funderAddr, - vestingAddr: vestingAddr, expPass: false, errContains: fmt.Sprintf("account %s does not exist", vestingAddr), }, { - name: "fail - account is not an eth account", - malleate: func(_ sdk.AccAddress, vestingAddr sdk.AccAddress) { - acc := authtypes.NewBaseAccountWithAddress(vestingAddr) - s.app.AccountKeeper.SetAccount(s.ctx, acc) + name: "fail - account is a smart contract", + malleate: func(_ sdk.AccAddress) sdk.AccAddress { + contractAddr, err := testutil.DeployContract( + suite.ctx, + suite.app, + suite.priv, + suite.queryClientEvm, + contracts.ERC20MinterBurnerDecimalsContract, + "TestToken", "TTK", uint8(18), + ) + suite.Require().NoError(err, "failed to deploy example contract") + + return utils.EthToCosmosAddr(contractAddr) }, funder: funderAddr, - vestingAddr: vestingAddr, expPass: false, - errContains: fmt.Sprintf("account %s is not an Ethereum account", vestingAddr), + errContains: "is a contract account and cannot be converted in a clawback vesting account", }, { name: "fail - vesting account already exists", - malleate: func(funder sdk.AccAddress, vestingAddr sdk.AccAddress) { + malleate: func(funder sdk.AccAddress) sdk.AccAddress { // fund the funder and vesting accounts from Bankkeeper err := testutil.FundAccount(s.ctx, s.app.BankKeeper, funder, balances) suite.Require().NoError(err) @@ -248,36 +255,39 @@ func (suite *KeeperTestSuite) TestMsgCreateClawbackVestingAccount() { msg := types.NewMsgCreateClawbackVestingAccount(funderAddr, vestingAddr, false) _, err = suite.app.VestingKeeper.CreateClawbackVestingAccount(s.ctx, msg) suite.Require().NoError(err, "failed to create vesting account") + + return vestingAddr }, funder: funderAddr, - vestingAddr: vestingAddr, expPass: false, errContains: "is already a clawback vesting account", }, { name: "fail - vesting address is in the blocked addresses list", - malleate: func(funder sdk.AccAddress, _ sdk.AccAddress) { + malleate: func(funder sdk.AccAddress) sdk.AccAddress { // fund the funder and vesting accounts from Bankkeeper err := testutil.FundAccount(s.ctx, s.app.BankKeeper, funder, balances) suite.Require().NoError(err) + + return authtypes.NewModuleAddress("distribution") }, funder: funderAddr, - vestingAddr: authtypes.NewModuleAddress("distribution"), expPass: false, errContains: "is a blocked address and cannot be converted in a clawback vesting account", }, { name: "success", - malleate: func(funder sdk.AccAddress, vestingAddr sdk.AccAddress) { + malleate: func(funder sdk.AccAddress) sdk.AccAddress { // fund the funder and vesting accounts from Bankkeeper err := testutil.FundAccount(s.ctx, s.app.BankKeeper, funder, balances) suite.Require().NoError(err) err = testutil.FundAccount(s.ctx, s.app.BankKeeper, vestingAddr, balances) suite.Require().NoError(err) + + return vestingAddr }, - funder: funderAddr, - vestingAddr: vestingAddr, - expPass: true, + funder: funderAddr, + expPass: true, }, } @@ -287,16 +297,16 @@ func (suite *KeeperTestSuite) TestMsgCreateClawbackVestingAccount() { suite.Require().NoError(suite.SetupTest()) // Reset ctx := sdk.WrapSDKContext(suite.ctx) - tc.malleate(tc.funder, tc.vestingAddr) + vestingAddr := tc.malleate(tc.funder) - msg := types.NewMsgCreateClawbackVestingAccount(tc.funder, tc.vestingAddr, false) + msg := types.NewMsgCreateClawbackVestingAccount(tc.funder, vestingAddr, false) res, err := suite.app.VestingKeeper.CreateClawbackVestingAccount(ctx, msg) if tc.expPass { suite.Require().NoError(err) suite.Require().Equal(&types.MsgCreateClawbackVestingAccountResponse{}, res) - accI := suite.app.AccountKeeper.GetAccount(suite.ctx, tc.vestingAddr) + accI := suite.app.AccountKeeper.GetAccount(suite.ctx, vestingAddr) suite.Require().NotNil(accI, "expected account to be created") suite.Require().IsType(&types.ClawbackVestingAccount{}, accI, "expected account to be a clawback vesting account") } else { @@ -733,7 +743,7 @@ func (suite *KeeperTestSuite) TestConvertVestingAccount() { _, ok := account.(vestingexported.VestingAccount) suite.Require().False(ok) - _, ok = account.(evmostypes.EthAccountI) + _, ok = account.(*authtypes.BaseAccount) suite.Require().True(ok) } else { diff --git a/x/vesting/keeper/setup_test.go b/x/vesting/keeper/setup_test.go index b18a31fb43..40d1574850 100644 --- a/x/vesting/keeper/setup_test.go +++ b/x/vesting/keeper/setup_test.go @@ -16,7 +16,6 @@ import ( stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" "github.com/stretchr/testify/suite" ethtypes "github.com/ethereum/go-ethereum/core/types" @@ -25,7 +24,6 @@ import ( "github.com/evmos/evmos/v18/encoding" "github.com/evmos/evmos/v18/testutil" utiltx "github.com/evmos/evmos/v18/testutil/tx" - evmostypes "github.com/evmos/evmos/v18/types" "github.com/evmos/evmos/v18/utils" epochstypes "github.com/evmos/evmos/v18/x/epochs/types" evmtypes "github.com/evmos/evmos/v18/x/evm/types" @@ -121,11 +119,7 @@ func (suite *KeeperTestSuite) SetupTest() error { suite.app.EpochsKeeper.SetEpochInfo(suite.ctx, epoch) } - acc := &evmostypes.EthAccount{ - BaseAccount: authtypes.NewBaseAccount(sdk.AccAddress(suite.address.Bytes()), nil, 0, 0), - CodeHash: common.BytesToHash(crypto.Keccak256(nil)).String(), - } - + acc := authtypes.NewBaseAccount(sdk.AccAddress(suite.address.Bytes()), nil, 0, 0) suite.app.AccountKeeper.SetAccount(suite.ctx, acc) // fund signer acc to pay for tx fees diff --git a/x/vesting/types/interfaces.go b/x/vesting/types/interfaces.go index 5439f37d68..5053cc7d6f 100644 --- a/x/vesting/types/interfaces.go +++ b/x/vesting/types/interfaces.go @@ -8,6 +8,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" v1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" + "github.com/ethereum/go-ethereum/common" ) // AccountKeeper defines the expected interface contract the vesting module @@ -27,6 +28,12 @@ type BankKeeper interface { BlockedAddr(addr sdk.AccAddress) bool } +// EVMKeeper defines the expected interface contract the vesting requires +// for checking if a given account is a smart contract. +type EVMKeeper interface { + IsContract(ctx sdk.Context, addr common.Address) bool +} + // StakingKeeper defines the expected interface contract the vesting module // requires for finding and changing the delegated tokens, used in clawback. type StakingKeeper interface { diff --git a/x/vesting/utils_test.go b/x/vesting/utils_test.go index aa37aefe2c..7fe9ccbd56 100644 --- a/x/vesting/utils_test.go +++ b/x/vesting/utils_test.go @@ -15,14 +15,12 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/ethereum/go-ethereum/common" evmosapp "github.com/evmos/evmos/v18/app" cmn "github.com/evmos/evmos/v18/precompiles/common" evmosutil "github.com/evmos/evmos/v18/testutil" testutiltx "github.com/evmos/evmos/v18/testutil/tx" evmostypes "github.com/evmos/evmos/v18/types" "github.com/evmos/evmos/v18/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) // SetupWithGenesisValSet initializes a new EvmosApp with a validator set and genesis accounts @@ -149,17 +147,12 @@ func (s *VestingTestSuite) DoSetupTest() { baseAcc := authtypes.NewBaseAccount(priv.PubKey().Address().Bytes(), priv.PubKey(), 0, 0) - acc := &evmostypes.EthAccount{ - BaseAccount: baseAcc, - CodeHash: common.BytesToHash(evmtypes.EmptyCodeHash).Hex(), - } - amount := sdk.TokensFromConsensusPower(5, evmostypes.PowerReduction) balance := banktypes.Balance{ - Address: acc.GetAddress().String(), + Address: baseAcc.GetAddress().String(), Coins: sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, amount)), } - s.SetupWithGenesisValSet(valSet, []authtypes.GenesisAccount{acc}, balance) + s.SetupWithGenesisValSet(valSet, []authtypes.GenesisAccount{baseAcc}, balance) } From cb403bcf2f80327755dc24b5e78ef406a8ec1c68 Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Thu, 27 Jun 2024 22:26:25 +0200 Subject: [PATCH 305/345] imp(dist): Improve efficiency of reward claiming with distribution precompile (#2643) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * improve reward claim method * add changelog entry * address review comments --------- Signed-off-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> --- CHANGELOG.md | 1 + precompiles/distribution/tx.go | 5 +++++ precompiles/distribution/tx_test.go | 29 +++++++++++++++++++++++++++++ 3 files changed, 35 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 987b518080..5a4a7f0b22 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -59,6 +59,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (erc20) [#2609](https://github.com/evmos/evmos/pull/2609) Remove STRv2 tracking logic. - (distribution-precompile) [#2614](https://github.com/evmos/evmos/pull/2614) Add withdrawer address check in transactions. - (app) [#2631](https://github.com/evmos/evmos/pull/2631) Bump IBC-go to v7.6.0 and Cosmos-SDK to v0.47.12. +- (distribution-precompile) [#2643](https://github.com/evmos/evmos/pull/2643) Improve efficiency of reward claiming with distribution precompile. - (evm) [#2633](https://github.com/evmos/evmos/pull/2633) Remove `EthAccount` type and use `BaseAccount` instead. ### Bug Fixes diff --git a/precompiles/distribution/tx.go b/precompiles/distribution/tx.go index 1452a7ead8..e37fff2f42 100644 --- a/precompiles/distribution/tx.go +++ b/precompiles/distribution/tx.go @@ -50,6 +50,11 @@ func (p Precompile) ClaimRewards( return nil, err } + maxVals := p.stakingKeeper.MaxValidators(ctx) + if maxRetrieve > maxVals { + return nil, fmt.Errorf("maxRetrieve (%d) parameter exceeds the maximum number of validators (%d)", maxRetrieve, maxVals) + } + // If the contract is the delegator, we don't need an origin check // Otherwise check if the origin matches the delegator address isContractDelegator := contract.CallerAddress == delegatorAddr diff --git a/precompiles/distribution/tx_test.go b/precompiles/distribution/tx_test.go index fc8fee5ece..d1ebad511c 100644 --- a/precompiles/distribution/tx_test.go +++ b/precompiles/distribution/tx_test.go @@ -354,6 +354,35 @@ func (s *PrecompileTestSuite) TestClaimRewards() { true, "invalid type for maxRetrieve: expected uint32", }, + { + "pass - withdraw from validators with maxRetrieve higher than number of validators", + func() []interface{} { + return []interface{}{ + s.address, + uint32(10), + } + }, + func([]byte) { + balance := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), utils.BaseDenom) + s.Require().Equal(balance.Amount.BigInt(), big.NewInt(7e18)) + }, + 20000, + false, + "", + }, + { + "fail - too many retrieved results", + func() []interface{} { + return []interface{}{ + s.address, + uint32(32_000_000), + } + }, + func([]byte) {}, + 200000, + true, + "maxRetrieve (32000000) parameter exceeds the maximum number of validators (100)", + }, { "success - withdraw from all validators - 2", func() []interface{} { From eb81f39b815747a17bb4df9436f94e9a5e80c179 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 28 Jun 2024 08:38:30 +0000 Subject: [PATCH 306/345] build(deps): bump github.com/btcsuite/btcd from 0.24.0 to 0.24.2 (#2641) * build(deps): bump github.com/btcsuite/btcd from 0.24.0 to 0.24.2 Bumps [github.com/btcsuite/btcd](https://github.com/btcsuite/btcd) from 0.24.0 to 0.24.2. - [Release notes](https://github.com/btcsuite/btcd/releases) - [Changelog](https://github.com/btcsuite/btcd/blob/master/CHANGES) - [Commits](https://github.com/btcsuite/btcd/compare/v0.24.0...v0.24.2) --- updated-dependencies: - dependency-name: github.com/btcsuite/btcd dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * update gomod2nix.toml file --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 47d0fcd4db..32d39949fa 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( cosmossdk.io/simapp v0.0.0-20230608160436-666c345ad23d cosmossdk.io/tools/rosetta v0.2.1 github.com/armon/go-metrics v0.4.1 - github.com/btcsuite/btcd v0.24.0 + github.com/btcsuite/btcd v0.24.2 github.com/btcsuite/btcd/btcutil v1.1.5 github.com/cometbft/cometbft v0.37.5 github.com/cometbft/cometbft-db v0.12.0 diff --git a/go.sum b/go.sum index 183916f83b..066ae1d7e4 100644 --- a/go.sum +++ b/go.sum @@ -267,8 +267,8 @@ github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsy github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= github.com/btcsuite/btcd v0.23.5-0.20231215221805-96c9fd8078fd/go.mod h1:nm3Bko6zh6bWP60UxwoT5LzdGJsQJaPo6HjduXq9p6A= -github.com/btcsuite/btcd v0.24.0 h1:gL3uHE/IaFj6fcZSu03SvqPMSx7s/dPzfpG/atRwWdo= -github.com/btcsuite/btcd v0.24.0/go.mod h1:K4IDc1593s8jKXIF7yS7yCTSxrknB9z0STzc2j6XgE4= +github.com/btcsuite/btcd v0.24.2 h1:aLmxPguqxza+4ag8R1I2nnJjSu2iFn/kqtHTIImswcY= +github.com/btcsuite/btcd v0.24.2/go.mod h1:5C8ChTkl5ejr3WHj8tkQSCmydiMEPB0ZhQhehpq7Dgg= github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA= github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= diff --git a/gomod2nix.toml b/gomod2nix.toml index 2f83cb796f..86e4858758 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -90,8 +90,8 @@ schema = 3 version = "v0.1.1-0.20220910012023-760eaf8b6816" hash = "sha256-Tx3sPuhsoVwrCfJdIwf4ipn7pD92OQNYvpCxl1Z9Wt0=" [mod."github.com/btcsuite/btcd"] - version = "v0.24.0" - hash = "sha256-ZZhmKXC9nqPFiWpftSnu/X3QVJlgCp3F6ElQ0Oi61cY=" + version = "v0.24.2" + hash = "sha256-ahlpwEr4KfyrEA899X07QtuSDnC8U+SnwL+z72DiK5E=" [mod."github.com/btcsuite/btcd/btcec/v2"] version = "v2.3.2" hash = "sha256-natWs+yIAuD1UI07iZtjPilroQLfXizFn3lNOiOT83U=" From 3f1fb7fa4d9c833723c2e623c4f948e17cd7c84d Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Fri, 28 Jun 2024 13:26:12 +0200 Subject: [PATCH 307/345] imp(app): Split chain configuration template into EVM config and MemIAVL config (#2644) * separate EVM config template from full Evmos chain config template for use in other repos * add changelog entry * address review comments --- CHANGELOG.md | 1 + server/config/config.go | 4 +++- server/config/toml.go | 10 +++------- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a4a7f0b22..15e73e0823 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -111,6 +111,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (tests) [#2635](https://github.com/evmos/evmos/pull/2635) Add function to get ERC-20 balance to integration utils. - (ci) [#2630](https://github.com/evmos/evmos/pull/2630) Add PebbleDB image to docker-push workflow. - (ci) [#2639](https://github.com/evmos/evmos/pull/2639) Ignore Swagger JSON in CheckOV linter. +- (app) [#2644](https://github.com/evmos/evmos/pull/2644) Split full chain configuration template into EVM and MemIAVL templates. ## [v18.1.0](https://github.com/evmos/evmos/releases/tag/v18.1.0) - 2024-05-31 diff --git a/server/config/config.go b/server/config/config.go index 6467aa5ecb..5b4f13e847 100644 --- a/server/config/config.go +++ b/server/config/config.go @@ -223,7 +223,9 @@ func AppConfig(denom string) (string, interface{}) { customAppConfig.Config.MinGasPrices = "0" + denom } - customAppTemplate := config.DefaultConfigTemplate + DefaultConfigTemplate + customAppTemplate := config.DefaultConfigTemplate + + DefaultEVMConfigTemplate + + memiavlcfg.DefaultConfigTemplate return customAppTemplate, *customAppConfig } diff --git a/server/config/toml.go b/server/config/toml.go index c4f7838a77..90ada7602e 100644 --- a/server/config/toml.go +++ b/server/config/toml.go @@ -2,12 +2,8 @@ // SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) package config -import ( - memiavlcfg "github.com/crypto-org-chain/cronos/store/config" -) - -// DefaultConfigTemplate defines the configuration template for the EVM RPC configuration -const DefaultConfigTemplate = ` +// DefaultEVMConfigTemplate defines the configuration template for the EVM RPC configuration. +const DefaultEVMConfigTemplate = ` ############################################################################### ### EVM Configuration ### ############################################################################### @@ -100,4 +96,4 @@ certificate-path = "{{ .TLS.CertificatePath }}" # Key path defines the key.pem file path for the TLS configuration. key-path = "{{ .TLS.KeyPath }}" -` + memiavlcfg.DefaultConfigTemplate +` From 913263cd028d78991d288d2fd145c4e07aa9cf41 Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Mon, 1 Jul 2024 14:16:14 +0200 Subject: [PATCH 308/345] imp(ante): Fix typos in ante package (#2647) * fix typos in ante package * address review comments --- app/ante/cosmos/authz.go | 2 +- app/ante/cosmos/authz_test.go | 2 +- app/ante/doc.go | 2 +- app/ante/evm/01_setup_ctx.go | 2 +- app/ante/evm/03_global_fee.go | 2 ++ app/ante/evm/04_validate.go | 8 +++++--- app/ante/evm/06_account_verification_test.go | 14 +++++++------- app/ante/evm/08_vesting.go | 3 ++- app/ante/evm/08_vesting_test.go | 2 +- app/ante/evm/09_gas_consume.go | 6 +++--- app/ante/evm/09_gas_consume_test.go | 4 ++-- app/ante/evm/mono.go | 2 +- app/ante/evm/signverify_test.go | 4 ++-- app/ante/evm/sigs_test.go | 2 +- app/ante/evm/utils_test.go | 6 +++--- app/ante/utils/claim_rewards_test.go | 2 +- 16 files changed, 34 insertions(+), 29 deletions(-) diff --git a/app/ante/cosmos/authz.go b/app/ante/cosmos/authz.go index 75a139318c..32c0c115d9 100644 --- a/app/ante/cosmos/authz.go +++ b/app/ante/cosmos/authz.go @@ -38,7 +38,7 @@ func (ald AuthzLimiterDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate // checkDisabledMsgs iterates through the msgs and returns an error if it finds any unauthorized msgs. // // When searchOnlyInAuthzMsgs is enabled, only authz MsgGrant and MsgExec are blocked, if they contain unauthorized msg types. -// Otherwise any msg matching the disabled types are blocked, regardless of being in an authz msg or not. +// Otherwise, any msg matching the disabled types are blocked, regardless of being in an authz msg or not. // // This method is recursive as MsgExec's can wrap other MsgExecs. The check for nested messages is performed up to the // maxNestedMsgs threshold. If there are more than that limit, it returns an error diff --git a/app/ante/cosmos/authz_test.go b/app/ante/cosmos/authz_test.go index 1c3b7cf500..301457534e 100644 --- a/app/ante/cosmos/authz_test.go +++ b/app/ante/cosmos/authz_test.go @@ -19,7 +19,7 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" cosmosante "github.com/evmos/evmos/v18/app/ante/cosmos" - testutil "github.com/evmos/evmos/v18/testutil" + "github.com/evmos/evmos/v18/testutil" utiltx "github.com/evmos/evmos/v18/testutil/tx" evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) diff --git a/app/ante/doc.go b/app/ante/doc.go index 0fc539fe64..fa6315bad4 100644 --- a/app/ante/doc.go +++ b/app/ante/doc.go @@ -3,7 +3,7 @@ /* Package ante defines the SDK auth module's AnteHandler as well as an internal -AnteHandler for an Ethereum transaction (i.e MsgEthereumTx). +AnteHandler for an Ethereum transaction (i.e. MsgEthereumTx). During CheckTx, the transaction is passed through a series of pre-message execution validation checks such as signature and account diff --git a/app/ante/evm/01_setup_ctx.go b/app/ante/evm/01_setup_ctx.go index 743412739e..4f69c7f08e 100644 --- a/app/ante/evm/01_setup_ctx.go +++ b/app/ante/evm/01_setup_ctx.go @@ -40,7 +40,7 @@ func SetupContext(ctx sdktypes.Context, tx sdktypes.Tx, evmKeeper EVMKeeper) (sd return ctx, errorsmod.Wrapf(errortypes.ErrInvalidType, "invalid transaction type %T, expected GasTx", tx) } - // We need to setup an empty gas config so that the gas is consistent with Ethereum. + // We need to set up an empty gas config so that the gas is consistent with Ethereum. newCtx := evmante.BuildEvmExecutionCtx(ctx). WithGasMeter(sdktypes.NewInfiniteGasMeter()) // Reset transient gas used to prepare the execution of current cosmos tx. diff --git a/app/ante/evm/03_global_fee.go b/app/ante/evm/03_global_fee.go index d588e52aba..ff9b947797 100644 --- a/app/ante/evm/03_global_fee.go +++ b/app/ante/evm/03_global_fee.go @@ -8,6 +8,8 @@ import ( errortypes "github.com/cosmos/cosmos-sdk/types/errors" ) +// CheckGlobalFee validates the provided fee value against the required global fee. +// // For dynamic transactions, GetFee() uses the GasFeeCap value, which // is the maximum gas price that the signer can pay. In practice, the // signer can pay less, if the block's BaseFee is lower. So, in this case, diff --git a/app/ante/evm/04_validate.go b/app/ante/evm/04_validate.go index 5a907d2972..0d45c1251c 100644 --- a/app/ante/evm/04_validate.go +++ b/app/ante/evm/04_validate.go @@ -32,8 +32,8 @@ func ValidateMsg( ) } -// checkDisabledCreateCall checks if the transaction is a contract creation or call -// and it is disabled through governance +// checkDisabledCreateCall checks if the transaction is a contract creation or call, +// and if those actions are disabled through governance. func checkDisabledCreateCall( txData evmtypes.TxData, permissions *evmtypes.AccessControl, @@ -52,7 +52,9 @@ func checkDisabledCreateCall( return nil } -// FIXME: this shouldn't be required if the tx was an Ethereum transaction type +// ValidateTx validates an Ethereum specific transaction type and returns an error if invalid. +// +// FIXME: this shouldn't be required if the tx was an Ethereum transaction type. func ValidateTx(tx sdktypes.Tx) (*tx.Fee, error) { err := tx.ValidateBasic() // ErrNoSignatures is fine with eth tx diff --git a/app/ante/evm/06_account_verification_test.go b/app/ante/evm/06_account_verification_test.go index 9be61046ae..c797f9beb5 100644 --- a/app/ante/evm/06_account_verification_test.go +++ b/app/ante/evm/06_account_verification_test.go @@ -56,8 +56,8 @@ func (suite *EvmAnteTestSuite) TestVerifyAccountBalance() { balanceResp, err := grpcHandler.GetBalance(senderKey.AccAddr, unitNetwork.GetDenom()) suite.Require().NoError(err) - invalidaAmount := balanceResp.Balance.Amount.Add(math.NewInt(100)) - txArgs.Amount = invalidaAmount.BigInt() + invalidAmount := balanceResp.Balance.Amount.Add(math.NewInt(100)) + txArgs.Amount = invalidAmount.BigInt() return statedbAccount, txArgs }, }, @@ -69,15 +69,15 @@ func (suite *EvmAnteTestSuite) TestVerifyAccountBalance() { txArgs, err := txFactory.GenerateDefaultTxTypeArgs(senderKey.Addr, suite.ethTxType) suite.Require().NoError(err) - // Make tx cost is negative. This has to be a big value because the + // Make tx cost negative. This has to be a big value because // it has to be bigger than the fee for the full cost to be negative - invalidaAmount := big.NewInt(-1e18) - txArgs.Amount = invalidaAmount + invalidAmount := big.NewInt(-1e18) + txArgs.Amount = invalidAmount return statedbAccount, txArgs }, }, { - name: "success: tx is succesfull and account is created if its nil", + name: "success: tx is successful and account is created if its nil", expectedError: errortypes.ErrInsufficientFunds, generateAccountAndArgs: func() (*statedb.Account, evmtypes.EvmTxArgs) { txArgs, err := txFactory.GenerateDefaultTxTypeArgs(senderKey.Addr, suite.ethTxType) @@ -86,7 +86,7 @@ func (suite *EvmAnteTestSuite) TestVerifyAccountBalance() { }, }, { - name: "success: tx is succesfull if account is EOA and exists", + name: "success: tx is successful if account is EOA and exists", expectedError: nil, generateAccountAndArgs: func() (*statedb.Account, evmtypes.EvmTxArgs) { statedbAccount := getDefaultStateDBAccount(unitNetwork, senderKey.Addr) diff --git a/app/ante/evm/08_vesting.go b/app/ante/evm/08_vesting.go index 00238336ae..ccd38e55e7 100644 --- a/app/ante/evm/08_vesting.go +++ b/app/ante/evm/08_vesting.go @@ -31,8 +31,9 @@ type EthVestingExpenseTracker struct { Spendable *big.Int } -// NOTE: Can't delete the legacy decorator yet because vesting module's tests would have to be refactored // NewEthVestingTransactionDecorator returns a new EthVestingTransactionDecorator. +// +// NOTE: Can't delete the legacy decorator yet because vesting module's tests would have to be refactored func NewEthVestingTransactionDecorator(ak evmtypes.AccountKeeper, bk evmtypes.BankKeeper, ek EVMKeeper) EthVestingTransactionDecorator { return EthVestingTransactionDecorator{ ak: ak, diff --git a/app/ante/evm/08_vesting_test.go b/app/ante/evm/08_vesting_test.go index 2ee4dd966b..cecadad5fb 100644 --- a/app/ante/evm/08_vesting_test.go +++ b/app/ante/evm/08_vesting_test.go @@ -87,7 +87,7 @@ func (suite *EvmAnteTestSuite) TestCheckVesting() { }, }, { - name: "error: clawback account with not enough bank + not enough vested unlocked balance < total + previosExpenses should fail", + name: "error: clawback account with not enough bank + not enough vested unlocked balance < total + previousExpenses should fail", expectedError: vestingtypes.ErrInsufficientUnlockedCoins, getAccountAndExpenses: func() (authtypes.AccountI, AccountExpenses) { newIndex := keyring.AddKey() diff --git a/app/ante/evm/09_gas_consume.go b/app/ante/evm/09_gas_consume.go index fb6064d0ca..f3004a7a44 100644 --- a/app/ante/evm/09_gas_consume.go +++ b/app/ante/evm/09_gas_consume.go @@ -15,8 +15,8 @@ import ( evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) -// UpdateComulativeGasWanted updates the cumulative gas wanted -func UpdateComulativeGasWanted( +// UpdateCumulativeGasWanted updates the cumulative gas wanted +func UpdateCumulativeGasWanted( ctx sdktypes.Context, msgGasWanted uint64, maxTxGasWanted uint64, @@ -101,7 +101,7 @@ func deductFees( return nil } -// GetMsgPriority returns the priority of a Eth Tx capped by the minimum priority +// GetMsgPriority returns the priority of an Eth Tx capped by the minimum priority func GetMsgPriority( txData evmtypes.TxData, minPriority int64, diff --git a/app/ante/evm/09_gas_consume_test.go b/app/ante/evm/09_gas_consume_test.go index 5aba86829b..a113705df9 100644 --- a/app/ante/evm/09_gas_consume_test.go +++ b/app/ante/evm/09_gas_consume_test.go @@ -11,7 +11,7 @@ import ( "github.com/evmos/evmos/v18/testutil/integration/evmos/network" ) -func (suite *EvmAnteTestSuite) TestUpdateComulativeGasWanted() { +func (suite *EvmAnteTestSuite) TestUpdateCumulativeGasWanted() { keyring := testkeyring.New(1) unitNetwork := network.NewUnitTestNetwork( network.WithPreFundedAccounts(keyring.GetAllAccAddrs()...), @@ -70,7 +70,7 @@ func (suite *EvmAnteTestSuite) TestUpdateComulativeGasWanted() { for _, tc := range testCases { suite.Run(tc.name, func() { // Function under test - gasWanted := evmante.UpdateComulativeGasWanted( + gasWanted := evmante.UpdateCumulativeGasWanted( tc.getCtx(), tc.msgGasWanted, tc.maxTxGasWanted, diff --git a/app/ante/evm/mono.go b/app/ante/evm/mono.go index 32fd3ff03a..76e99def23 100644 --- a/app/ante/evm/mono.go +++ b/app/ante/evm/mono.go @@ -262,7 +262,7 @@ func (md MonoDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, ne return ctx, err } - gasWanted := UpdateComulativeGasWanted( + gasWanted := UpdateCumulativeGasWanted( ctx, txData.GetGas(), md.maxGasWanted, diff --git a/app/ante/evm/signverify_test.go b/app/ante/evm/signverify_test.go index 5fba87a16c..9fed5b079a 100644 --- a/app/ante/evm/signverify_test.go +++ b/app/ante/evm/signverify_test.go @@ -26,13 +26,13 @@ func (suite *AnteTestSuite) TestEthSigVerificationDecorator() { err := signedTx.Sign(suite.ethSigner, testutiltx.NewSigner(privKey)) suite.Require().NoError(err) - uprotectedEthTxParams := &evmtypes.EvmTxArgs{ + unprotectedEthTxParams := &evmtypes.EvmTxArgs{ Nonce: 1, Amount: big.NewInt(10), GasLimit: 1000, GasPrice: big.NewInt(1), } - unprotectedTx := evmtypes.NewTx(uprotectedEthTxParams) + unprotectedTx := evmtypes.NewTx(unprotectedEthTxParams) unprotectedTx.From = addr.Hex() err = unprotectedTx.Sign(ethtypes.HomesteadSigner{}, testutiltx.NewSigner(privKey)) suite.Require().NoError(err) diff --git a/app/ante/evm/sigs_test.go b/app/ante/evm/sigs_test.go index ba7367a83f..c9875c3bbd 100644 --- a/app/ante/evm/sigs_test.go +++ b/app/ante/evm/sigs_test.go @@ -48,7 +48,7 @@ func (suite *AnteTestSuite) TestSignatures() { ethTx := msgEthereumTx.AsTransaction() ethV, ethR, ethS := ethTx.RawSignatureValues() - // The signatures of MsgehtereumTx should be the same with the corresponding eth tx + // The signatures of MsgEthereumTx should be the same with the corresponding eth tx suite.Require().Equal(msgV, ethV) suite.Require().Equal(msgR, ethR) suite.Require().Equal(msgS, ethS) diff --git a/app/ante/evm/utils_test.go b/app/ante/evm/utils_test.go index 30032960d2..6eacfd9ec9 100644 --- a/app/ante/evm/utils_test.go +++ b/app/ante/evm/utils_test.go @@ -215,7 +215,7 @@ func (suite *AnteTestSuite) CreateTestEIP712MsgCreateValidator(from sdk.AccAddre valAddr, privEd.PubKey(), sdk.NewCoin(evmtypes.DefaultEVMDenom, math.NewInt(20)), - stakingtypes.NewDescription("moniker", "indentity", "website", "security_contract", "details"), + stakingtypes.NewDescription("moniker", "identity", "website", "security_contract", "details"), stakingtypes.NewCommissionRates(math.LegacyOneDec(), math.LegacyOneDec(), math.LegacyOneDec()), math.OneInt(), ) @@ -232,7 +232,7 @@ func (suite *AnteTestSuite) CreateTestEIP712MsgCreateValidator2(from sdk.AccAddr privEd.PubKey(), sdk.NewCoin(evmtypes.DefaultEVMDenom, math.NewInt(20)), // Ensure optional fields can be left blank - stakingtypes.NewDescription("moniker", "indentity", "", "", ""), + stakingtypes.NewDescription("moniker", "identity", "", "", ""), stakingtypes.NewCommissionRates(math.LegacyOneDec(), math.LegacyOneDec(), math.LegacyOneDec()), math.OneInt(), ) @@ -654,7 +654,7 @@ func (suite *AnteTestSuite) CreateTestSingleSignedTx(privKey cryptotypes.PrivKey return txBuilder } -// prepareAccount is a helper function that asigns the corresponding +// prepareAccount is a helper function that assigns the corresponding // balance and rewards to the provided account func (suite *AnteTestSuite) prepareAccount(ctx sdk.Context, addr sdk.AccAddress, balance, rewards math.Int) sdk.Context { ctx, err := testutil.PrepareAccountsForDelegationRewards( diff --git a/app/ante/utils/claim_rewards_test.go b/app/ante/utils/claim_rewards_test.go index c1f7b7d858..c463b7eabe 100644 --- a/app/ante/utils/claim_rewards_test.go +++ b/app/ante/utils/claim_rewards_test.go @@ -56,7 +56,7 @@ func (suite *AnteTestSuite) TestClaimStakingRewardsIfNecessary() { // assigned rewards, of which one is sufficient to cover the transaction fees and the other // is not. This is because the iteration over rewards is done in a non-deterministic fashion, // This means, that e.g. if reward C is sufficient, but A and B are not, - // all of the options [A], [B-A], [B-C-A] or [C-A] are possible to be withdrawn, which + // All options [A], [B-A], [B-C-A] or [C-A] are possible to be withdrawn, which // increases the complexity of assertions. var err error suite.ctx, err = testutil.PrepareAccountsForDelegationRewards( From a3d98c95473a6258204fd25c2c45a084f3af3f10 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Jul 2024 15:13:02 +0200 Subject: [PATCH 309/345] build(deps): bump github.com/cometbft/cometbft from 0.37.5 to 0.37.7 (#2646) * build(deps): bump the go_modules group with 2 updates Bumps the go_modules group with 2 updates: [github.com/cometbft/cometbft](https://github.com/cometbft/cometbft) and [github.com/hashicorp/go-getter](https://github.com/hashicorp/go-getter). Updates `github.com/cometbft/cometbft` from 0.37.5 to 0.38.8 - [Release notes](https://github.com/cometbft/cometbft/releases) - [Changelog](https://github.com/cometbft/cometbft/blob/v0.38.8/CHANGELOG.md) - [Commits](https://github.com/cometbft/cometbft/compare/v0.37.5...v0.38.8) Updates `github.com/hashicorp/go-getter` from 1.7.4 to 1.7.5 - [Release notes](https://github.com/hashicorp/go-getter/releases) - [Changelog](https://github.com/hashicorp/go-getter/blob/main/.goreleaser.yml) - [Commits](https://github.com/hashicorp/go-getter/compare/v1.7.4...v1.7.5) --- updated-dependencies: - dependency-name: github.com/cometbft/cometbft dependency-type: direct:production dependency-group: go_modules - dependency-name: github.com/hashicorp/go-getter dependency-type: indirect dependency-group: go_modules ... Signed-off-by: dependabot[bot] * update gomod2nix.toml file * update cometbft version bump --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] Co-authored-by: tom Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- go.mod | 12 ++++++------ go.sum | 24 ++++++++++++------------ gomod2nix.toml | 26 +++++++++++++------------- 3 files changed, 31 insertions(+), 31 deletions(-) diff --git a/go.mod b/go.mod index 32d39949fa..8bcf2b199e 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/armon/go-metrics v0.4.1 github.com/btcsuite/btcd v0.24.2 github.com/btcsuite/btcd/btcutil v1.1.5 - github.com/cometbft/cometbft v0.37.5 + github.com/cometbft/cometbft v0.37.7 github.com/cometbft/cometbft-db v0.12.0 github.com/cosmos/cosmos-proto v1.0.0-beta.5 github.com/cosmos/cosmos-sdk v0.47.12 @@ -106,7 +106,7 @@ require ( github.com/dgraph-io/badger/v4 v4.2.0 // indirect github.com/dgraph-io/ristretto v0.1.1 // indirect github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91 // indirect - github.com/docker/cli v20.10.24+incompatible // indirect + github.com/docker/cli v23.0.1+incompatible // indirect github.com/docker/docker v24.0.9+incompatible // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect @@ -151,10 +151,11 @@ require ( github.com/gtank/merlin v0.1.1 // indirect github.com/gtank/ristretto255 v0.1.2 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-getter v1.7.4 // indirect + github.com/hashicorp/go-getter v1.7.5 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-safetemp v1.0.0 // indirect github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/hdevalence/ed25519consensus v0.1.0 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect @@ -195,7 +196,7 @@ require ( github.com/prometheus/client_golang v1.16.0 // indirect github.com/prometheus/client_model v0.4.0 // indirect github.com/prometheus/common v0.44.0 // indirect - github.com/prometheus/procfs v0.11.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect github.com/prometheus/tsdb v0.10.0 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/rjeczalik/notify v0.9.3 // indirect @@ -233,8 +234,7 @@ require ( go.opentelemetry.io/otel v1.24.0 // indirect go.opentelemetry.io/otel/metric v1.24.0 // indirect go.opentelemetry.io/otel/trace v1.24.0 // indirect - go.uber.org/atomic v1.10.0 // indirect - go.uber.org/multierr v1.9.0 // indirect + go.uber.org/multierr v1.10.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/mod v0.17.0 // indirect golang.org/x/oauth2 v0.18.0 // indirect diff --git a/go.sum b/go.sum index 066ae1d7e4..9cd165907e 100644 --- a/go.sum +++ b/go.sum @@ -352,8 +352,8 @@ github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1: github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/coinbase/rosetta-sdk-go/types v1.0.0 h1:jpVIwLcPoOeCR6o1tU+Xv7r5bMONNbHU7MuEHboiFuA= github.com/coinbase/rosetta-sdk-go/types v1.0.0/go.mod h1:eq7W2TMRH22GTW0N0beDnN931DW0/WOI1R2sdHNHG4c= -github.com/cometbft/cometbft v0.37.5 h1:/U/TlgMh4NdnXNo+YU9T2NMCWyhXNDF34Mx582jlvq0= -github.com/cometbft/cometbft v0.37.5/go.mod h1:QC+mU0lBhKn8r9qvmnq53Dmf3DWBt4VtkcKw2C81wxY= +github.com/cometbft/cometbft v0.37.7 h1:pwC0PNfGcbKbAKyK/sWm+LwuiYmT00C3bF2nEnnjJ/k= +github.com/cometbft/cometbft v0.37.7/go.mod h1:gFGCFXNGDci6tMLemANPGTfU+j4+oH63PjeLe0iIjJk= github.com/cometbft/cometbft-db v0.12.0 h1:v77/z0VyfSU7k682IzZeZPFZrQAKiQwkqGN0QzAjMi0= github.com/cometbft/cometbft-db v0.12.0/go.mod h1:aX2NbCrjNVd2ZajYxt1BsiFf/Z+TQ2MN0VxdicheYuw= github.com/confio/ics23/go v0.9.0 h1:cWs+wdbS2KRPZezoaaj+qBleXgUk5WOQFMP3CQFGTr4= @@ -432,8 +432,8 @@ github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUn github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91 h1:Izz0+t1Z5nI16/II7vuEo/nHjodOg0p7+OiDpjX5t1E= github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= -github.com/docker/cli v20.10.24+incompatible h1:vfV+1kv9yD0/cpL6wWY9cE+Y9J8hL/NqJDGob0B3RVw= -github.com/docker/cli v20.10.24+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v23.0.1+incompatible h1:LRyWITpGzl2C9e9uGxzisptnxAn1zfZKXy13Ul2Q5oM= +github.com/docker/cli v23.0.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/docker v24.0.9+incompatible h1:HPGzNmwfLZWdxHqK9/II92pyi1EpYKsAqcl4G0Of9v0= github.com/docker/docker v24.0.9+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= @@ -723,8 +723,8 @@ github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtng github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-getter v1.7.4 h1:3yQjWuxICvSpYwqSayAdKRFcvBl1y/vogCxczWSmix0= -github.com/hashicorp/go-getter v1.7.4/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= +github.com/hashicorp/go-getter v1.7.5 h1:dT58k9hQ/vbxNMwoI5+xFYAJuv6152UNvdHokfI5wE4= +github.com/hashicorp/go-getter v1.7.5/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= @@ -748,6 +748,8 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= @@ -1006,8 +1008,8 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.11.0 h1:5EAgkfkMl659uZPbe9AS2N68a7Cc1TJbPEuGzFuRbyk= -github.com/prometheus/procfs v0.11.0/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/prometheus/tsdb v0.10.0 h1:If5rVCMTp6W2SiRAQFlbpJNgVlgMEd+U2GZckwK38ic= github.com/prometheus/tsdb v0.10.0/go.mod h1:oi49uRhEe9dPUTlS3JRZOwJuVi6tmh10QSgwXEyGCt4= github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= @@ -1191,14 +1193,12 @@ go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= -go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= -go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= +go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ= +go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= diff --git a/gomod2nix.toml b/gomod2nix.toml index 86e4858758..ec7dea6f79 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -132,8 +132,8 @@ schema = 3 version = "v1.0.0" hash = "sha256-z/0E0NiEGo7zxM7d94ImgUf8P0/KG6hbP9T4Vuym4p0=" [mod."github.com/cometbft/cometbft"] - version = "v0.37.5" - hash = "sha256-l/63NGQFsrG31uLsOolr6z6yMU8fKSbLA//E17mAMsI=" + version = "v0.37.7" + hash = "sha256-OkJ+yDDF7eO5FBadn/9yGpxEqX6V/331/1NzikitOiA=" [mod."github.com/cometbft/cometbft-db"] version = "v0.12.0" hash = "sha256-mfeUD8+V+xUzEhSOLgQQP0GFDWt7ch/TeBw9gnTJuHk=" @@ -214,8 +214,8 @@ schema = 3 version = "v1.4.1-0.20201116162257-a2a8dda75c91" hash = "sha256-VNNMZIc7NkDg3DVLnqeJNM/KZqkkaZu2/HTLBL8X2xE=" [mod."github.com/docker/cli"] - version = "v20.10.24+incompatible" - hash = "sha256-5bvtx8SXoCnSN/M/Eb8TE0ctW8o0jH7mB2zF1JRx3Eg=" + version = "v23.0.1+incompatible" + hash = "sha256-ckbEh+7rLRonJly6uP/iokLdvxhaSs/wrq2vB7CFOHU=" [mod."github.com/docker/docker"] version = "v24.0.9+incompatible" hash = "sha256-JZToreP7NNxIoPLTsA6NTIFlYCGHi1Kty4uzuA253Xw=" @@ -366,8 +366,8 @@ schema = 3 version = "v0.5.2" hash = "sha256-N9GOKYo7tK6XQUFhvhImtL7PZW/mr4C4Manx/yPVvcQ=" [mod."github.com/hashicorp/go-getter"] - version = "v1.7.4" - hash = "sha256-GtJSwcS1WXLn9lFAuTRCseIQBXJOElAywEhTtYrsfbE=" + version = "v1.7.5" + hash = "sha256-oXUvMoee8GT69MA0E2JHxYm1Q2q8BtmwlfxFshDKXmI=" [mod."github.com/hashicorp/go-immutable-radix"] version = "v1.3.1" hash = "sha256-65+A2HiVfS/GV9G+6/TkXXjzXhI/V98e6RlJWjxy+mg=" @@ -380,6 +380,9 @@ schema = 3 [mod."github.com/hashicorp/golang-lru"] version = "v0.5.5-0.20210104140557-80c98217689d" hash = "sha256-w5utLMR7p5pF9xX+mI3N9NyfQ8ixNXNTgfXDu8fudmc=" + [mod."github.com/hashicorp/golang-lru/v2"] + version = "v2.0.7" + hash = "sha256-t1bcXLgrQNOYUVyYEZ0knxcXpsTk4IuJZDjKvyJX75g=" [mod."github.com/hashicorp/hcl"] version = "v1.0.0" hash = "sha256-xsRCmYyBfglMxeWUvTZqkaRLSW+V2FvNodEDjTGg1WA=" @@ -519,8 +522,8 @@ schema = 3 version = "v0.44.0" hash = "sha256-8n3gSWKDSJtGfOQgxsiCGyTnUjb5hvSxJi/hPcrE5Oo=" [mod."github.com/prometheus/procfs"] - version = "v0.11.0" - hash = "sha256-dfbKDyKmL+BNGVuvEZmw1CiGBiwqUADxJKkIi1Sbv1Y=" + version = "v0.12.0" + hash = "sha256-Y4ZZmxIpVCO67zN3pGwSk2TcI88zvmGJkgwq9DRTwFw=" [mod."github.com/prometheus/tsdb"] version = "v0.10.0" hash = "sha256-5BAv1Y4X9HvncfxTV5dIGVubwlCpEl5Y50OnL6QNffI=" @@ -666,12 +669,9 @@ schema = 3 [mod."go.opentelemetry.io/otel/trace"] version = "v1.24.0" hash = "sha256-FHP0hg+i7+wxCsM0u/5hQcgvvr3D+lq8o/7E/HkaW4s=" - [mod."go.uber.org/atomic"] - version = "v1.10.0" - hash = "sha256-E6UEDc1eh/cLUFd+J86cDesQ0B8wEv/DdaAVKb+x2t8=" [mod."go.uber.org/multierr"] - version = "v1.9.0" - hash = "sha256-tlDRooh/V4HDhZohsUrxot/Y6uVInVBtRWCZbj/tPds=" + version = "v1.10.0" + hash = "sha256-GepuppwpqpOGSNKi6GtGoO01TFxUQWfKZmE0B3M/HQA=" [mod."golang.org/x/crypto"] version = "v0.24.0" hash = "sha256-wpxJApwSmmn9meVdpFdOU0gzeJbIXcKuFfYUUVogSss=" From fff1fb15761d84f97c9f641e492d1669acdba9b1 Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Tue, 2 Jul 2024 12:22:31 +0200 Subject: [PATCH 310/345] imp(ante): Decouple EVM decorator utilities from decorator struct (#2648) * decouple evm decorator utils from concrete implementation * add changelog entry --- CHANGELOG.md | 1 + app/ante/evm/mono.go | 24 ++++++++++++++++-------- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 15e73e0823..a9de10a461 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -112,6 +112,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (ci) [#2630](https://github.com/evmos/evmos/pull/2630) Add PebbleDB image to docker-push workflow. - (ci) [#2639](https://github.com/evmos/evmos/pull/2639) Ignore Swagger JSON in CheckOV linter. - (app) [#2644](https://github.com/evmos/evmos/pull/2644) Split full chain configuration template into EVM and MemIAVL templates. +- (ante) [#2648](https://github.com/evmos/evmos/pull/2648) Decouple EVM mono decorator utilities from concrete decorator implementation. ## [v18.1.0](https://github.com/evmos/evmos/releases/tag/v18.1.0) - 2024-05-31 diff --git a/app/ante/evm/mono.go b/app/ante/evm/mono.go index 76e99def23..ba598d9865 100644 --- a/app/ante/evm/mono.go +++ b/app/ante/evm/mono.go @@ -70,15 +70,23 @@ func NewMonoDecorator( } } -// NewUtils returns a new DecoratorUtils instance. -func (md MonoDecorator) NewUtils(ctx sdk.Context) (*DecoratorUtils, error) { - evmParams := md.evmKeeper.GetParams(ctx) +// NewMonoDecoratorUtils returns a new DecoratorUtils instance. +// +// These utilities are extracted once at the beginning of the ante handle process, +// and are used throughout the entire decorator chain. +// This avoids redundant calls to the keeper and thus improves speed of transaction processing. +func NewMonoDecoratorUtils( + ctx sdk.Context, + ek EVMKeeper, + fmk FeeMarketKeeper, +) (*DecoratorUtils, error) { + evmParams := ek.GetParams(ctx) chainCfg := evmParams.GetChainConfig() - ethCfg := chainCfg.EthereumConfig(md.evmKeeper.ChainID()) + ethCfg := chainCfg.EthereumConfig(ek.ChainID()) blockHeight := big.NewInt(ctx.BlockHeight()) rules := ethCfg.Rules(blockHeight, true) - baseFee := md.evmKeeper.GetBaseFee(ctx, ethCfg) - feeMarketParams := md.feeMarketKeeper.GetParams(ctx) + baseFee := ek.GetBaseFee(ctx, ethCfg) + feeMarketParams := fmk.GetParams(ctx) if rules.IsLondon && baseFee == nil { return nil, errorsmod.Wrap( @@ -96,7 +104,7 @@ func (md MonoDecorator) NewUtils(ctx sdk.Context) (*DecoratorUtils, error) { MempoolMinGasPrice: ctx.MinGasPrices().AmountOf(evmParams.EvmDenom), GlobalMinGasPrice: feeMarketParams.MinGasPrice, EvmDenom: evmParams.EvmDenom, - BlockTxIndex: md.evmKeeper.GetTxIndexTransient(ctx), + BlockTxIndex: ek.GetTxIndexTransient(ctx), TxGasLimit: 0, GasWanted: 0, MinPriority: int64(math.MaxInt64), @@ -123,7 +131,7 @@ func (md MonoDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, ne } // 2. get utils - decUtils, err := md.NewUtils(ctx) + decUtils, err := NewMonoDecoratorUtils(ctx, md.evmKeeper, md.feeMarketKeeper) if err != nil { return ctx, err } From 7609f4d58f03d547a76c1b59a098c8a988b62e41 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2024 16:36:32 +0200 Subject: [PATCH 311/345] build(deps): bump github.com/cometbft/cometbft from 0.37.7 to 0.37.8 (#2649) * build(deps): bump github.com/cometbft/cometbft from 0.37.7 to 0.38.9 Bumps [github.com/cometbft/cometbft](https://github.com/cometbft/cometbft) from 0.37.7 to 0.38.9. - [Release notes](https://github.com/cometbft/cometbft/releases) - [Changelog](https://github.com/cometbft/cometbft/blob/v0.38.9/CHANGELOG.md) - [Commits](https://github.com/cometbft/cometbft/compare/v0.37.7...v0.38.9) --- updated-dependencies: - dependency-name: github.com/cometbft/cometbft dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * update gomod2nix.toml file * update bump version --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] Co-authored-by: tom --- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 8bcf2b199e..b3c2838003 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/armon/go-metrics v0.4.1 github.com/btcsuite/btcd v0.24.2 github.com/btcsuite/btcd/btcutil v1.1.5 - github.com/cometbft/cometbft v0.37.7 + github.com/cometbft/cometbft v0.37.8 github.com/cometbft/cometbft-db v0.12.0 github.com/cosmos/cosmos-proto v1.0.0-beta.5 github.com/cosmos/cosmos-sdk v0.47.12 diff --git a/go.sum b/go.sum index 9cd165907e..d2a1e8c36c 100644 --- a/go.sum +++ b/go.sum @@ -352,8 +352,8 @@ github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1: github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/coinbase/rosetta-sdk-go/types v1.0.0 h1:jpVIwLcPoOeCR6o1tU+Xv7r5bMONNbHU7MuEHboiFuA= github.com/coinbase/rosetta-sdk-go/types v1.0.0/go.mod h1:eq7W2TMRH22GTW0N0beDnN931DW0/WOI1R2sdHNHG4c= -github.com/cometbft/cometbft v0.37.7 h1:pwC0PNfGcbKbAKyK/sWm+LwuiYmT00C3bF2nEnnjJ/k= -github.com/cometbft/cometbft v0.37.7/go.mod h1:gFGCFXNGDci6tMLemANPGTfU+j4+oH63PjeLe0iIjJk= +github.com/cometbft/cometbft v0.37.8 h1:/LLlJd+XilMSGjBGWBGQ1EvLVU//9C5SADWEwvV8cRM= +github.com/cometbft/cometbft v0.37.8/go.mod h1:gFGCFXNGDci6tMLemANPGTfU+j4+oH63PjeLe0iIjJk= github.com/cometbft/cometbft-db v0.12.0 h1:v77/z0VyfSU7k682IzZeZPFZrQAKiQwkqGN0QzAjMi0= github.com/cometbft/cometbft-db v0.12.0/go.mod h1:aX2NbCrjNVd2ZajYxt1BsiFf/Z+TQ2MN0VxdicheYuw= github.com/confio/ics23/go v0.9.0 h1:cWs+wdbS2KRPZezoaaj+qBleXgUk5WOQFMP3CQFGTr4= diff --git a/gomod2nix.toml b/gomod2nix.toml index ec7dea6f79..6ed46e72d6 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -132,8 +132,8 @@ schema = 3 version = "v1.0.0" hash = "sha256-z/0E0NiEGo7zxM7d94ImgUf8P0/KG6hbP9T4Vuym4p0=" [mod."github.com/cometbft/cometbft"] - version = "v0.37.7" - hash = "sha256-OkJ+yDDF7eO5FBadn/9yGpxEqX6V/331/1NzikitOiA=" + version = "v0.37.8" + hash = "sha256-JSYuVQzZnhGcATyc/W7fs7pMzb/tGhu01m6dnQGzFE4=" [mod."github.com/cometbft/cometbft-db"] version = "v0.12.0" hash = "sha256-mfeUD8+V+xUzEhSOLgQQP0GFDWt7ch/TeBw9gnTJuHk=" From cd4647dce2f60b3ab04bcc33295afba9268cf7f2 Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Tue, 2 Jul 2024 21:09:35 +0200 Subject: [PATCH 312/345] imp(scripts): Adjust contract compilation util to include abi.json files (#2650) * adjust script to include abi.json files too * rename vesting interface file to match interface name * adjust utils and precompile ABI loading for Hardhat setup * clean up after compiling contracts with all target * recompile abis * add changelog entry * run black formatter * address some more linters --------- Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- CHANGELOG.md | 1 + Makefile | 6 +- contracts/utils/utils.go | 36 +- precompiles/bank/abi.json | 163 +- precompiles/bech32/abi.json | 99 +- precompiles/common/abi.go | 7 +- precompiles/distribution/abi.json | 1279 ++++----- precompiles/distribution/distribution.go | 9 +- precompiles/erc20/abi.json | 553 ++-- precompiles/ics20/abi.json | 1077 +++---- precompiles/ics20/ics20.go | 9 +- precompiles/staking/abi.json | 2477 +++++++++-------- .../staking/testdata/StakingCaller.json | 8 +- .../contracts/DistributionCaller.json | 6 +- .../testutil/contracts/InterchainSender.json | 4 +- .../vesting/{Vesting.sol => VestingI.sol} | 0 precompiles/vesting/abi.json | 985 +++---- .../vesting/testdata/VestingCaller.json | 4 +- .../vesting/testdata/VestingCaller.sol | 2 +- precompiles/vesting/vesting.go | 9 +- precompiles/werc20/abi.json | 685 ++--- .../compile_smart_contracts.py | 20 +- .../test_compile_smart_contracts.py | 26 +- scripts/license_checker/check_licenses.py | 1 + tests/nix_tests/test_distr_precompile.py | 4 +- x/evm/statedb/testdata/FlashLoan.json | 4 +- 26 files changed, 3790 insertions(+), 3684 deletions(-) rename precompiles/vesting/{Vesting.sol => VestingI.sol} (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index a9de10a461..106c34b481 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -113,6 +113,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (ci) [#2639](https://github.com/evmos/evmos/pull/2639) Ignore Swagger JSON in CheckOV linter. - (app) [#2644](https://github.com/evmos/evmos/pull/2644) Split full chain configuration template into EVM and MemIAVL templates. - (ante) [#2648](https://github.com/evmos/evmos/pull/2648) Decouple EVM mono decorator utilities from concrete decorator implementation. +- (contracts) [#2650](https://github.com/evmos/evmos/pull/2650) Adjust contract compilation util to include `abi.json` files. ## [v18.1.0](https://github.com/evmos/evmos/releases/tag/v18.1.0) - 2024-05-31 diff --git a/Makefile b/Makefile index 3ec8451028..d3e2250246 100644 --- a/Makefile +++ b/Makefile @@ -556,9 +556,9 @@ release: ### Compile Solidity Contracts ### ############################################################################### -# Clean up the contracts directory, install the necessary dependencies -# and then compile the solidity contracts found in the Evmos repository. -contracts-all: contracts-clean contracts-compile +# Install the necessary dependencies, compile the solidity contracts found in the +# Evmos repository and then clean up the contracts data. +contracts-all: contracts-compile contracts-clean # Clean smart contract compilation artifacts, dependencies and cache files contracts-clean: diff --git a/contracts/utils/utils.go b/contracts/utils/utils.go index 027a799214..b1ac938bfc 100644 --- a/contracts/utils/utils.go +++ b/contracts/utils/utils.go @@ -73,6 +73,38 @@ func loadCompiledBytesFromJSONFile(jsonFile string) ([]byte, error) { // ConvertHardhatBytesToCompiledContract is a helper method to convert the embedded bytes from a // Hardhat JSON file into an instance of the CompiledContract type. func ConvertHardhatBytesToCompiledContract(bz []byte) (evmtypes.CompiledContract, error) { + compiledContract, err := convertHardhatBzToCompiledContract(bz) + if err != nil { + return evmtypes.CompiledContract{}, err + } + + if len(compiledContract.Bin) == 0 { + return evmtypes.CompiledContract{}, errors.New("got empty binary data for contract") + } + + return compiledContract, nil +} + +// ConvertPrecompileHardhatBytesToCompiledContract is a helper method to convert the embedded bytes from a +// Hardhat JSON file into an instance of the CompiledContract type. +// +// NOTE: The precompile implementations have to special property that the binary data is empty. +func ConvertPrecompileHardhatBytesToCompiledContract(bz []byte) (evmtypes.CompiledContract, error) { + compiledContract, err := convertHardhatBzToCompiledContract(bz) + if err != nil { + return evmtypes.CompiledContract{}, err + } + + if len(compiledContract.Bin) != 0 { + return evmtypes.CompiledContract{}, errors.New("expected binary data to be empty for precompile contract") + } + + return compiledContract, nil +} + +// convertHardhatBzToCompiledContract is a helper method to convert the embedded bytes from a +// Hardhat JSON file into an instance of the CompiledContract type. +func convertHardhatBzToCompiledContract(bz []byte) (evmtypes.CompiledContract, error) { var hardhatContract evmtypes.HardhatCompiledContract err := json.Unmarshal(bz, &hardhatContract) if err != nil { @@ -84,8 +116,8 @@ func ConvertHardhatBytesToCompiledContract(bz []byte) (evmtypes.CompiledContract return evmtypes.CompiledContract{}, err } - if len(compiledContract.Bin) == 0 { - return evmtypes.CompiledContract{}, errors.New("got empty binary data for contract") + if len(compiledContract.ABI.Methods) == 0 { + return evmtypes.CompiledContract{}, errors.New("got empty array of methods for ABI") } return compiledContract, nil diff --git a/precompiles/bank/abi.json b/precompiles/bank/abi.json index b1e9ea74a6..f64400e249 100644 --- a/precompiles/bank/abi.json +++ b/precompiles/bank/abi.json @@ -1,77 +1,86 @@ -[ - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "balances", - "outputs": [ - { - "components": [ - { - "internalType": "address", - "name": "contractAddress", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct Balance[]", - "name": "balances", - "type": "tuple[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "erc20Address", - "type": "address" - } - ], - "name": "supplyOf", - "outputs": [ - { - "internalType": "uint256", - "name": "totalSupply", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [ - { - "components": [ - { - "internalType": "address", - "name": "contractAddress", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct Balance[]", - "name": "totalSupply", - "type": "tuple[]" - } - ], - "stateMutability": "view", - "type": "function" - } -] \ No newline at end of file +{ + "_format": "hh-sol-artifact-1", + "contractName": "IBank", + "sourceName": "solidity/precompiles/bank/IBank.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balances", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "contractAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Balance[]", + "name": "balances", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "erc20Address", + "type": "address" + } + ], + "name": "supplyOf", + "outputs": [ + { + "internalType": "uint256", + "name": "totalSupply", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "contractAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Balance[]", + "name": "totalSupply", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/precompiles/bech32/abi.json b/precompiles/bech32/abi.json index 7d91447592..de66134bbb 100644 --- a/precompiles/bech32/abi.json +++ b/precompiles/bech32/abi.json @@ -1,45 +1,54 @@ -[ - { - "inputs": [ - { - "internalType": "string", - "name": "bech32Address", - "type": "string" - } - ], - "name": "bech32ToHex", - "outputs": [ - { - "internalType": "address", - "name": "addr", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "addr", - "type": "address" - }, - { - "internalType": "string", - "name": "prefix", - "type": "string" - } - ], - "name": "hexToBech32", - "outputs": [ - { - "internalType": "string", - "name": "bech32Address", - "type": "string" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } -] +{ + "_format": "hh-sol-artifact-1", + "contractName": "Bech32I", + "sourceName": "solidity/precompiles/bech32/Bech32I.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "string", + "name": "bech32Address", + "type": "string" + } + ], + "name": "bech32ToHex", + "outputs": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "string", + "name": "prefix", + "type": "string" + } + ], + "name": "hexToBech32", + "outputs": [ + { + "internalType": "string", + "name": "bech32Address", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/precompiles/common/abi.go b/precompiles/common/abi.go index 6417e93d05..3b4c716b37 100644 --- a/precompiles/common/abi.go +++ b/precompiles/common/abi.go @@ -4,7 +4,6 @@ package common import ( - "bytes" "embed" "fmt" "math/big" @@ -15,6 +14,7 @@ import ( "github.com/ethereum/go-ethereum/common/math" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" + contractutils "github.com/evmos/evmos/v18/contracts/utils" ) // MakeTopic converts a filter query argument into a filter topic. @@ -138,9 +138,10 @@ func LoadABI(fs embed.FS, path string) (abi.ABI, error) { return abi.ABI{}, fmt.Errorf("error loading the ABI %s", err) } - newAbi, err := abi.JSON(bytes.NewReader(abiBz)) + contract, err := contractutils.ConvertPrecompileHardhatBytesToCompiledContract(abiBz) if err != nil { return abi.ABI{}, fmt.Errorf(ErrInvalidABI, err) } - return newAbi, nil + + return contract.ABI, nil } diff --git a/precompiles/distribution/abi.json b/precompiles/distribution/abi.json index 6acd10dfa2..ee69d2c03c 100644 --- a/precompiles/distribution/abi.json +++ b/precompiles/distribution/abi.json @@ -1,635 +1,644 @@ -[ - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "delegatorAddress", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "ClaimRewards", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "depositor", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "FundCommunityPool", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "caller", - "type": "address" - }, - { - "indexed": false, - "internalType": "string", - "name": "withdrawerAddress", - "type": "string" - } - ], - "name": "SetWithdrawerAddress", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "delegatorAddress", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "validatorAddress", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "WithdrawDelegatorRewards", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "string", - "name": "validatorAddress", - "type": "string" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "commission", - "type": "uint256" - } - ], - "name": "WithdrawValidatorCommission", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "delegatorAddress", - "type": "address" - }, - { - "internalType": "uint32", - "name": "maxRetrieve", - "type": "uint32" - } - ], - "name": "claimRewards", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "delegatorAddress", - "type": "address" - }, - { - "internalType": "string", - "name": "validatorAddress", - "type": "string" - } - ], - "name": "delegationRewards", - "outputs": [ - { - "components": [ - { - "internalType": "string", - "name": "denom", - "type": "string" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "precision", - "type": "uint8" - } - ], - "internalType": "struct DecCoin[]", - "name": "rewards", - "type": "tuple[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "delegatorAddress", - "type": "address" - } - ], - "name": "delegationTotalRewards", - "outputs": [ - { - "components": [ - { - "internalType": "string", - "name": "validatorAddress", - "type": "string" - }, - { - "components": [ - { - "internalType": "string", - "name": "denom", - "type": "string" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "precision", - "type": "uint8" - } - ], - "internalType": "struct DecCoin[]", - "name": "reward", - "type": "tuple[]" - } - ], - "internalType": "struct DelegationDelegatorReward[]", - "name": "rewards", - "type": "tuple[]" - }, - { - "components": [ - { - "internalType": "string", - "name": "denom", - "type": "string" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "precision", - "type": "uint8" - } - ], - "internalType": "struct DecCoin[]", - "name": "total", - "type": "tuple[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "delegatorAddress", - "type": "address" - } - ], - "name": "delegatorValidators", - "outputs": [ - { - "internalType": "string[]", - "name": "validators", - "type": "string[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "delegatorAddress", - "type": "address" - } - ], - "name": "delegatorWithdrawAddress", - "outputs": [ - { - "internalType": "string", - "name": "withdrawAddress", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "depositor", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "fundCommunityPool", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "delegatorAddress", - "type": "address" - }, - { - "internalType": "string", - "name": "withdrawerAddress", - "type": "string" - } - ], - "name": "setWithdrawAddress", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "validatorAddress", - "type": "string" - } - ], - "name": "validatorCommission", - "outputs": [ - { - "components": [ - { - "internalType": "string", - "name": "denom", - "type": "string" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "precision", - "type": "uint8" - } - ], - "internalType": "struct DecCoin[]", - "name": "commission", - "type": "tuple[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "validatorAddress", - "type": "string" - } - ], - "name": "validatorDistributionInfo", - "outputs": [ - { - "components": [ - { - "internalType": "string", - "name": "operatorAddress", - "type": "string" - }, - { - "components": [ - { - "internalType": "string", - "name": "denom", - "type": "string" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "precision", - "type": "uint8" - } - ], - "internalType": "struct DecCoin[]", - "name": "selfBondRewards", - "type": "tuple[]" - }, - { - "components": [ - { - "internalType": "string", - "name": "denom", - "type": "string" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "precision", - "type": "uint8" - } - ], - "internalType": "struct DecCoin[]", - "name": "commission", - "type": "tuple[]" - } - ], - "internalType": "struct ValidatorDistributionInfo", - "name": "distributionInfo", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "validatorAddress", - "type": "string" - } - ], - "name": "validatorOutstandingRewards", - "outputs": [ - { - "components": [ - { - "internalType": "string", - "name": "denom", - "type": "string" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "precision", - "type": "uint8" - } - ], - "internalType": "struct DecCoin[]", - "name": "rewards", - "type": "tuple[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "validatorAddress", - "type": "string" - }, - { - "internalType": "uint64", - "name": "startingHeight", - "type": "uint64" - }, - { - "internalType": "uint64", - "name": "endingHeight", - "type": "uint64" - }, - { - "components": [ - { - "internalType": "bytes", - "name": "key", - "type": "bytes" - }, - { - "internalType": "uint64", - "name": "offset", - "type": "uint64" - }, - { - "internalType": "uint64", - "name": "limit", - "type": "uint64" - }, - { - "internalType": "bool", - "name": "countTotal", - "type": "bool" - }, - { - "internalType": "bool", - "name": "reverse", - "type": "bool" - } - ], - "internalType": "struct PageRequest", - "name": "pageRequest", - "type": "tuple" - } - ], - "name": "validatorSlashes", - "outputs": [ - { - "components": [ - { - "internalType": "uint64", - "name": "validatorPeriod", - "type": "uint64" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "precision", - "type": "uint8" - } - ], - "internalType": "struct Dec", - "name": "fraction", - "type": "tuple" - } - ], - "internalType": "struct ValidatorSlashEvent[]", - "name": "slashes", - "type": "tuple[]" - }, - { - "components": [ - { - "internalType": "bytes", - "name": "nextKey", - "type": "bytes" - }, - { - "internalType": "uint64", - "name": "total", - "type": "uint64" - } - ], - "internalType": "struct PageResponse", - "name": "pageResponse", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "delegatorAddress", - "type": "address" - }, - { - "internalType": "string", - "name": "validatorAddress", - "type": "string" - } - ], - "name": "withdrawDelegatorRewards", - "outputs": [ - { - "components": [ - { - "internalType": "string", - "name": "denom", - "type": "string" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct Coin[]", - "name": "amount", - "type": "tuple[]" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "validatorAddress", - "type": "string" - } - ], - "name": "withdrawValidatorCommission", - "outputs": [ - { - "components": [ - { - "internalType": "string", - "name": "denom", - "type": "string" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct Coin[]", - "name": "amount", - "type": "tuple[]" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } -] \ No newline at end of file +{ + "_format": "hh-sol-artifact-1", + "contractName": "DistributionI", + "sourceName": "solidity/precompiles/distribution/DistributionI.sol", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "delegatorAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "ClaimRewards", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "depositor", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "FundCommunityPool", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "caller", + "type": "address" + }, + { + "indexed": false, + "internalType": "string", + "name": "withdrawerAddress", + "type": "string" + } + ], + "name": "SetWithdrawerAddress", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "delegatorAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "validatorAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "WithdrawDelegatorRewards", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "string", + "name": "validatorAddress", + "type": "string" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "commission", + "type": "uint256" + } + ], + "name": "WithdrawValidatorCommission", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegatorAddress", + "type": "address" + }, + { + "internalType": "uint32", + "name": "maxRetrieve", + "type": "uint32" + } + ], + "name": "claimRewards", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegatorAddress", + "type": "address" + }, + { + "internalType": "string", + "name": "validatorAddress", + "type": "string" + } + ], + "name": "delegationRewards", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "precision", + "type": "uint8" + } + ], + "internalType": "struct DecCoin[]", + "name": "rewards", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegatorAddress", + "type": "address" + } + ], + "name": "delegationTotalRewards", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "validatorAddress", + "type": "string" + }, + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "precision", + "type": "uint8" + } + ], + "internalType": "struct DecCoin[]", + "name": "reward", + "type": "tuple[]" + } + ], + "internalType": "struct DelegationDelegatorReward[]", + "name": "rewards", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "precision", + "type": "uint8" + } + ], + "internalType": "struct DecCoin[]", + "name": "total", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegatorAddress", + "type": "address" + } + ], + "name": "delegatorValidators", + "outputs": [ + { + "internalType": "string[]", + "name": "validators", + "type": "string[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegatorAddress", + "type": "address" + } + ], + "name": "delegatorWithdrawAddress", + "outputs": [ + { + "internalType": "string", + "name": "withdrawAddress", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "depositor", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "fundCommunityPool", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegatorAddress", + "type": "address" + }, + { + "internalType": "string", + "name": "withdrawerAddress", + "type": "string" + } + ], + "name": "setWithdrawAddress", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "validatorAddress", + "type": "string" + } + ], + "name": "validatorCommission", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "precision", + "type": "uint8" + } + ], + "internalType": "struct DecCoin[]", + "name": "commission", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "validatorAddress", + "type": "string" + } + ], + "name": "validatorDistributionInfo", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "operatorAddress", + "type": "string" + }, + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "precision", + "type": "uint8" + } + ], + "internalType": "struct DecCoin[]", + "name": "selfBondRewards", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "precision", + "type": "uint8" + } + ], + "internalType": "struct DecCoin[]", + "name": "commission", + "type": "tuple[]" + } + ], + "internalType": "struct ValidatorDistributionInfo", + "name": "distributionInfo", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "validatorAddress", + "type": "string" + } + ], + "name": "validatorOutstandingRewards", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "precision", + "type": "uint8" + } + ], + "internalType": "struct DecCoin[]", + "name": "rewards", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "validatorAddress", + "type": "string" + }, + { + "internalType": "uint64", + "name": "startingHeight", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "endingHeight", + "type": "uint64" + }, + { + "components": [ + { + "internalType": "bytes", + "name": "key", + "type": "bytes" + }, + { + "internalType": "uint64", + "name": "offset", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "limit", + "type": "uint64" + }, + { + "internalType": "bool", + "name": "countTotal", + "type": "bool" + }, + { + "internalType": "bool", + "name": "reverse", + "type": "bool" + } + ], + "internalType": "struct PageRequest", + "name": "pageRequest", + "type": "tuple" + } + ], + "name": "validatorSlashes", + "outputs": [ + { + "components": [ + { + "internalType": "uint64", + "name": "validatorPeriod", + "type": "uint64" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "precision", + "type": "uint8" + } + ], + "internalType": "struct Dec", + "name": "fraction", + "type": "tuple" + } + ], + "internalType": "struct ValidatorSlashEvent[]", + "name": "slashes", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "bytes", + "name": "nextKey", + "type": "bytes" + }, + { + "internalType": "uint64", + "name": "total", + "type": "uint64" + } + ], + "internalType": "struct PageResponse", + "name": "pageResponse", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegatorAddress", + "type": "address" + }, + { + "internalType": "string", + "name": "validatorAddress", + "type": "string" + } + ], + "name": "withdrawDelegatorRewards", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Coin[]", + "name": "amount", + "type": "tuple[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "validatorAddress", + "type": "string" + } + ], + "name": "withdrawValidatorCommission", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Coin[]", + "name": "amount", + "type": "tuple[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/precompiles/distribution/distribution.go b/precompiles/distribution/distribution.go index edb1bbff6b..bf9092ecb5 100644 --- a/precompiles/distribution/distribution.go +++ b/precompiles/distribution/distribution.go @@ -4,14 +4,12 @@ package distribution import ( - "bytes" "embed" "fmt" storetypes "github.com/cosmos/cosmos-sdk/store/types" authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" distributionkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" - "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" cmn "github.com/evmos/evmos/v18/precompiles/common" @@ -42,16 +40,11 @@ func NewPrecompile( stakingKeeper stakingkeeper.Keeper, authzKeeper authzkeeper.Keeper, ) (*Precompile, error) { - abiBz, err := f.ReadFile("abi.json") + newAbi, err := cmn.LoadABI(f, "abi.json") if err != nil { return nil, fmt.Errorf("error loading the distribution ABI %s", err) } - newAbi, err := abi.JSON(bytes.NewReader(abiBz)) - if err != nil { - return nil, fmt.Errorf(cmn.ErrInvalidABI, err) - } - return &Precompile{ Precompile: cmn.Precompile{ ABI: newAbi, diff --git a/precompiles/erc20/abi.json b/precompiles/erc20/abi.json index 453e65c907..46fbced2d6 100644 --- a/precompiles/erc20/abi.json +++ b/precompiles/erc20/abi.json @@ -1,272 +1,281 @@ -[ - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Transfer", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", - "type": "address" - } - ], - "name": "allowance", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "subtractedValue", - "type": "uint256" - } - ], - "name": "decreaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "approved", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "addedValue", - "type": "uint256" - } - ], - "name": "increaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "approved", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } -] \ No newline at end of file +{ + "_format": "hh-sol-artifact-1", + "contractName": "IERC20MetadataAllowance", + "sourceName": "solidity/precompiles/erc20/IERC20MetadataAllowance.sol", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/precompiles/ics20/abi.json b/precompiles/ics20/abi.json index 395fc28ed2..6f475e6d94 100644 --- a/precompiles/ics20/abi.json +++ b/precompiles/ics20/abi.json @@ -1,534 +1,543 @@ -[ - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "indexed": true, - "internalType": "string", - "name": "receiver", - "type": "string" - }, - { - "indexed": false, - "internalType": "string", - "name": "sourcePort", - "type": "string" - }, - { - "indexed": false, - "internalType": "string", - "name": "sourceChannel", - "type": "string" - }, - { - "indexed": false, - "internalType": "string", - "name": "denom", - "type": "string" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "string", - "name": "memo", - "type": "string" - } - ], - "name": "IBCTransfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "grantee", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "granter", - "type": "address" - }, - { - "components": [ - { - "internalType": "string", - "name": "sourcePort", - "type": "string" - }, - { - "internalType": "string", - "name": "sourceChannel", - "type": "string" - }, - { - "components": [ - { - "internalType": "string", - "name": "denom", - "type": "string" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct Coin[]", - "name": "spendLimit", - "type": "tuple[]" - }, - { - "internalType": "string[]", - "name": "allowList", - "type": "string[]" - }, - { - "internalType": "string[]", - "name": "allowedPacketData", - "type": "string[]" - } - ], - "indexed": false, - "internalType": "struct ICS20Allocation[]", - "name": "allocations", - "type": "tuple[]" - } - ], - "name": "IBCTransferAuthorization", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "grantee", - "type": "address" - }, - { - "internalType": "address", - "name": "granter", - "type": "address" - } - ], - "name": "allowance", - "outputs": [ - { - "components": [ - { - "internalType": "string", - "name": "sourcePort", - "type": "string" - }, - { - "internalType": "string", - "name": "sourceChannel", - "type": "string" - }, - { - "components": [ - { - "internalType": "string", - "name": "denom", - "type": "string" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct Coin[]", - "name": "spendLimit", - "type": "tuple[]" - }, - { - "internalType": "string[]", - "name": "allowList", - "type": "string[]" - }, - { - "internalType": "string[]", - "name": "allowedPacketData", - "type": "string[]" - } - ], - "internalType": "struct ICS20Allocation[]", - "name": "allocations", - "type": "tuple[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "grantee", - "type": "address" - }, - { - "components": [ - { - "internalType": "string", - "name": "sourcePort", - "type": "string" - }, - { - "internalType": "string", - "name": "sourceChannel", - "type": "string" - }, - { - "components": [ - { - "internalType": "string", - "name": "denom", - "type": "string" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct Coin[]", - "name": "spendLimit", - "type": "tuple[]" - }, - { - "internalType": "string[]", - "name": "allowList", - "type": "string[]" - }, - { - "internalType": "string[]", - "name": "allowedPacketData", - "type": "string[]" - } - ], - "internalType": "struct ICS20Allocation[]", - "name": "allocations", - "type": "tuple[]" - } - ], - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "approved", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "grantee", - "type": "address" - }, - { - "internalType": "string", - "name": "sourcePort", - "type": "string" - }, - { - "internalType": "string", - "name": "sourceChannel", - "type": "string" - }, - { - "internalType": "string", - "name": "denom", - "type": "string" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "decreaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "approved", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "trace", - "type": "string" - } - ], - "name": "denomHash", - "outputs": [ - { - "internalType": "string", - "name": "hash", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "hash", - "type": "string" - } - ], - "name": "denomTrace", - "outputs": [ - { - "components": [ - { - "internalType": "string", - "name": "path", - "type": "string" - }, - { - "internalType": "string", - "name": "baseDenom", - "type": "string" - } - ], - "internalType": "struct DenomTrace", - "name": "denomTrace", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "bytes", - "name": "key", - "type": "bytes" - }, - { - "internalType": "uint64", - "name": "offset", - "type": "uint64" - }, - { - "internalType": "uint64", - "name": "limit", - "type": "uint64" - }, - { - "internalType": "bool", - "name": "countTotal", - "type": "bool" - }, - { - "internalType": "bool", - "name": "reverse", - "type": "bool" - } - ], - "internalType": "struct PageRequest", - "name": "pageRequest", - "type": "tuple" - } - ], - "name": "denomTraces", - "outputs": [ - { - "components": [ - { - "internalType": "string", - "name": "path", - "type": "string" - }, - { - "internalType": "string", - "name": "baseDenom", - "type": "string" - } - ], - "internalType": "struct DenomTrace[]", - "name": "denomTraces", - "type": "tuple[]" - }, - { - "components": [ - { - "internalType": "bytes", - "name": "nextKey", - "type": "bytes" - }, - { - "internalType": "uint64", - "name": "total", - "type": "uint64" - } - ], - "internalType": "struct PageResponse", - "name": "pageResponse", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "grantee", - "type": "address" - }, - { - "internalType": "string", - "name": "sourcePort", - "type": "string" - }, - { - "internalType": "string", - "name": "sourceChannel", - "type": "string" - }, - { - "internalType": "string", - "name": "denom", - "type": "string" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "increaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "approved", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "grantee", - "type": "address" - } - ], - "name": "revoke", - "outputs": [ - { - "internalType": "bool", - "name": "revoked", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "sourcePort", - "type": "string" - }, - { - "internalType": "string", - "name": "sourceChannel", - "type": "string" - }, - { - "internalType": "string", - "name": "denom", - "type": "string" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "string", - "name": "receiver", - "type": "string" - }, - { - "components": [ - { - "internalType": "uint64", - "name": "revisionNumber", - "type": "uint64" - }, - { - "internalType": "uint64", - "name": "revisionHeight", - "type": "uint64" - } - ], - "internalType": "struct Height", - "name": "timeoutHeight", - "type": "tuple" - }, - { - "internalType": "uint64", - "name": "timeoutTimestamp", - "type": "uint64" - }, - { - "internalType": "string", - "name": "memo", - "type": "string" - } - ], - "name": "transfer", - "outputs": [ - { - "internalType": "uint64", - "name": "nextSequence", - "type": "uint64" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } -] \ No newline at end of file +{ + "_format": "hh-sol-artifact-1", + "contractName": "ICS20I", + "sourceName": "solidity/precompiles/ics20/ICS20I.sol", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": true, + "internalType": "string", + "name": "receiver", + "type": "string" + }, + { + "indexed": false, + "internalType": "string", + "name": "sourcePort", + "type": "string" + }, + { + "indexed": false, + "internalType": "string", + "name": "sourceChannel", + "type": "string" + }, + { + "indexed": false, + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "memo", + "type": "string" + } + ], + "name": "IBCTransfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "grantee", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "granter", + "type": "address" + }, + { + "components": [ + { + "internalType": "string", + "name": "sourcePort", + "type": "string" + }, + { + "internalType": "string", + "name": "sourceChannel", + "type": "string" + }, + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Coin[]", + "name": "spendLimit", + "type": "tuple[]" + }, + { + "internalType": "string[]", + "name": "allowList", + "type": "string[]" + }, + { + "internalType": "string[]", + "name": "allowedPacketData", + "type": "string[]" + } + ], + "indexed": false, + "internalType": "struct ICS20Allocation[]", + "name": "allocations", + "type": "tuple[]" + } + ], + "name": "IBCTransferAuthorization", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "grantee", + "type": "address" + }, + { + "internalType": "address", + "name": "granter", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "sourcePort", + "type": "string" + }, + { + "internalType": "string", + "name": "sourceChannel", + "type": "string" + }, + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Coin[]", + "name": "spendLimit", + "type": "tuple[]" + }, + { + "internalType": "string[]", + "name": "allowList", + "type": "string[]" + }, + { + "internalType": "string[]", + "name": "allowedPacketData", + "type": "string[]" + } + ], + "internalType": "struct ICS20Allocation[]", + "name": "allocations", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "grantee", + "type": "address" + }, + { + "components": [ + { + "internalType": "string", + "name": "sourcePort", + "type": "string" + }, + { + "internalType": "string", + "name": "sourceChannel", + "type": "string" + }, + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Coin[]", + "name": "spendLimit", + "type": "tuple[]" + }, + { + "internalType": "string[]", + "name": "allowList", + "type": "string[]" + }, + { + "internalType": "string[]", + "name": "allowedPacketData", + "type": "string[]" + } + ], + "internalType": "struct ICS20Allocation[]", + "name": "allocations", + "type": "tuple[]" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "grantee", + "type": "address" + }, + { + "internalType": "string", + "name": "sourcePort", + "type": "string" + }, + { + "internalType": "string", + "name": "sourceChannel", + "type": "string" + }, + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "trace", + "type": "string" + } + ], + "name": "denomHash", + "outputs": [ + { + "internalType": "string", + "name": "hash", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "hash", + "type": "string" + } + ], + "name": "denomTrace", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "path", + "type": "string" + }, + { + "internalType": "string", + "name": "baseDenom", + "type": "string" + } + ], + "internalType": "struct DenomTrace", + "name": "denomTrace", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes", + "name": "key", + "type": "bytes" + }, + { + "internalType": "uint64", + "name": "offset", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "limit", + "type": "uint64" + }, + { + "internalType": "bool", + "name": "countTotal", + "type": "bool" + }, + { + "internalType": "bool", + "name": "reverse", + "type": "bool" + } + ], + "internalType": "struct PageRequest", + "name": "pageRequest", + "type": "tuple" + } + ], + "name": "denomTraces", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "path", + "type": "string" + }, + { + "internalType": "string", + "name": "baseDenom", + "type": "string" + } + ], + "internalType": "struct DenomTrace[]", + "name": "denomTraces", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "bytes", + "name": "nextKey", + "type": "bytes" + }, + { + "internalType": "uint64", + "name": "total", + "type": "uint64" + } + ], + "internalType": "struct PageResponse", + "name": "pageResponse", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "grantee", + "type": "address" + }, + { + "internalType": "string", + "name": "sourcePort", + "type": "string" + }, + { + "internalType": "string", + "name": "sourceChannel", + "type": "string" + }, + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "grantee", + "type": "address" + } + ], + "name": "revoke", + "outputs": [ + { + "internalType": "bool", + "name": "revoked", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "sourcePort", + "type": "string" + }, + { + "internalType": "string", + "name": "sourceChannel", + "type": "string" + }, + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "string", + "name": "receiver", + "type": "string" + }, + { + "components": [ + { + "internalType": "uint64", + "name": "revisionNumber", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "revisionHeight", + "type": "uint64" + } + ], + "internalType": "struct Height", + "name": "timeoutHeight", + "type": "tuple" + }, + { + "internalType": "uint64", + "name": "timeoutTimestamp", + "type": "uint64" + }, + { + "internalType": "string", + "name": "memo", + "type": "string" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "uint64", + "name": "nextSequence", + "type": "uint64" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/precompiles/ics20/ics20.go b/precompiles/ics20/ics20.go index eaed77f4bb..8641643351 100644 --- a/precompiles/ics20/ics20.go +++ b/precompiles/ics20/ics20.go @@ -4,14 +4,12 @@ package ics20 import ( - "bytes" "embed" "fmt" storetypes "github.com/cosmos/cosmos-sdk/store/types" authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" channelkeeper "github.com/cosmos/ibc-go/v7/modules/core/04-channel/keeper" - "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" "github.com/evmos/evmos/v18/precompiles/authorization" @@ -45,12 +43,7 @@ func NewPrecompile( channelKeeper channelkeeper.Keeper, authzKeeper authzkeeper.Keeper, ) (*Precompile, error) { - abiBz, err := f.ReadFile("abi.json") - if err != nil { - return nil, err - } - - newAbi, err := abi.JSON(bytes.NewReader(abiBz)) + newAbi, err := cmn.LoadABI(f, "abi.json") if err != nil { return nil, err } diff --git a/precompiles/staking/abi.json b/precompiles/staking/abi.json index dc8cc8bd01..aecfb48ae9 100644 --- a/precompiles/staking/abi.json +++ b/precompiles/staking/abi.json @@ -1,1234 +1,1243 @@ -[ - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "grantee", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "granter", - "type": "address" - }, - { - "indexed": false, - "internalType": "string[]", - "name": "methods", - "type": "string[]" - }, - { - "indexed": false, - "internalType": "uint256[]", - "name": "values", - "type": "uint256[]" - } - ], - "name": "AllowanceChange", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "grantee", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "granter", - "type": "address" - }, - { - "indexed": false, - "internalType": "string[]", - "name": "methods", - "type": "string[]" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "delegatorAddress", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "validatorAddress", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "creationHeight", - "type": "uint256" - } - ], - "name": "CancelUnbondingDelegation", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "validatorAddress", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "CreateValidator", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "delegatorAddress", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "validatorAddress", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "newShares", - "type": "uint256" - } - ], - "name": "Delegate", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "validatorAddress", - "type": "address" - }, - { - "indexed": false, - "internalType": "int256", - "name": "commissionRate", - "type": "int256" - }, - { - "indexed": false, - "internalType": "int256", - "name": "minSelfDelegation", - "type": "int256" - } - ], - "name": "EditValidator", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "delegatorAddress", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "validatorSrcAddress", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "validatorDstAddress", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "completionTime", - "type": "uint256" - } - ], - "name": "Redelegate", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "grantee", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "granter", - "type": "address" - }, - { - "indexed": false, - "internalType": "string[]", - "name": "methods", - "type": "string[]" - } - ], - "name": "Revocation", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "delegatorAddress", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "validatorAddress", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "completionTime", - "type": "uint256" - } - ], - "name": "Unbond", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "grantee", - "type": "address" - }, - { - "internalType": "address", - "name": "granter", - "type": "address" - }, - { - "internalType": "string", - "name": "method", - "type": "string" - } - ], - "name": "allowance", - "outputs": [ - { - "internalType": "uint256", - "name": "remaining", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "grantee", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "string[]", - "name": "methods", - "type": "string[]" - } - ], - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "approved", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "delegatorAddress", - "type": "address" - }, - { - "internalType": "string", - "name": "validatorAddress", - "type": "string" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "creationHeight", - "type": "uint256" - } - ], - "name": "cancelUnbondingDelegation", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "string", - "name": "moniker", - "type": "string" - }, - { - "internalType": "string", - "name": "identity", - "type": "string" - }, - { - "internalType": "string", - "name": "website", - "type": "string" - }, - { - "internalType": "string", - "name": "securityContact", - "type": "string" - }, - { - "internalType": "string", - "name": "details", - "type": "string" - } - ], - "internalType": "struct Description", - "name": "description", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "rate", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxRate", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxChangeRate", - "type": "uint256" - } - ], - "internalType": "struct CommissionRates", - "name": "commissionRates", - "type": "tuple" - }, - { - "internalType": "uint256", - "name": "minSelfDelegation", - "type": "uint256" - }, - { - "internalType": "address", - "name": "validatorAddress", - "type": "address" - }, - { - "internalType": "string", - "name": "pubkey", - "type": "string" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "createValidator", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "grantee", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "string[]", - "name": "methods", - "type": "string[]" - } - ], - "name": "decreaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "approved", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "delegatorAddress", - "type": "address" - }, - { - "internalType": "string", - "name": "validatorAddress", - "type": "string" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "delegate", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "delegatorAddress", - "type": "address" - }, - { - "internalType": "string", - "name": "validatorAddress", - "type": "string" - } - ], - "name": "delegation", - "outputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "string", - "name": "denom", - "type": "string" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct Coin", - "name": "balance", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "string", - "name": "moniker", - "type": "string" - }, - { - "internalType": "string", - "name": "identity", - "type": "string" - }, - { - "internalType": "string", - "name": "website", - "type": "string" - }, - { - "internalType": "string", - "name": "securityContact", - "type": "string" - }, - { - "internalType": "string", - "name": "details", - "type": "string" - } - ], - "internalType": "struct Description", - "name": "description", - "type": "tuple" - }, - { - "internalType": "address", - "name": "validatorAddress", - "type": "address" - }, - { - "internalType": "int256", - "name": "commissionRate", - "type": "int256" - }, - { - "internalType": "int256", - "name": "minSelfDelegation", - "type": "int256" - } - ], - "name": "editValidator", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "grantee", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "string[]", - "name": "methods", - "type": "string[]" - } - ], - "name": "increaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "approved", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "delegatorAddress", - "type": "address" - }, - { - "internalType": "string", - "name": "validatorSrcAddress", - "type": "string" - }, - { - "internalType": "string", - "name": "validatorDstAddress", - "type": "string" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "redelegate", - "outputs": [ - { - "internalType": "int64", - "name": "completionTime", - "type": "int64" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "delegatorAddress", - "type": "address" - }, - { - "internalType": "string", - "name": "srcValidatorAddress", - "type": "string" - }, - { - "internalType": "string", - "name": "dstValidatorAddress", - "type": "string" - } - ], - "name": "redelegation", - "outputs": [ - { - "components": [ - { - "internalType": "string", - "name": "delegatorAddress", - "type": "string" - }, - { - "internalType": "string", - "name": "validatorSrcAddress", - "type": "string" - }, - { - "internalType": "string", - "name": "validatorDstAddress", - "type": "string" - }, - { - "components": [ - { - "internalType": "int64", - "name": "creationHeight", - "type": "int64" - }, - { - "internalType": "int64", - "name": "completionTime", - "type": "int64" - }, - { - "internalType": "uint256", - "name": "initialBalance", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "sharesDst", - "type": "uint256" - } - ], - "internalType": "struct RedelegationEntry[]", - "name": "entries", - "type": "tuple[]" - } - ], - "internalType": "struct RedelegationOutput", - "name": "redelegation", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "delegatorAddress", - "type": "address" - }, - { - "internalType": "string", - "name": "srcValidatorAddress", - "type": "string" - }, - { - "internalType": "string", - "name": "dstValidatorAddress", - "type": "string" - }, - { - "components": [ - { - "internalType": "bytes", - "name": "key", - "type": "bytes" - }, - { - "internalType": "uint64", - "name": "offset", - "type": "uint64" - }, - { - "internalType": "uint64", - "name": "limit", - "type": "uint64" - }, - { - "internalType": "bool", - "name": "countTotal", - "type": "bool" - }, - { - "internalType": "bool", - "name": "reverse", - "type": "bool" - } - ], - "internalType": "struct PageRequest", - "name": "pageRequest", - "type": "tuple" - } - ], - "name": "redelegations", - "outputs": [ - { - "components": [ - { - "components": [ - { - "internalType": "string", - "name": "delegatorAddress", - "type": "string" - }, - { - "internalType": "string", - "name": "validatorSrcAddress", - "type": "string" - }, - { - "internalType": "string", - "name": "validatorDstAddress", - "type": "string" - }, - { - "components": [ - { - "internalType": "int64", - "name": "creationHeight", - "type": "int64" - }, - { - "internalType": "int64", - "name": "completionTime", - "type": "int64" - }, - { - "internalType": "uint256", - "name": "initialBalance", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "sharesDst", - "type": "uint256" - } - ], - "internalType": "struct RedelegationEntry[]", - "name": "entries", - "type": "tuple[]" - } - ], - "internalType": "struct Redelegation", - "name": "redelegation", - "type": "tuple" - }, - { - "components": [ - { - "components": [ - { - "internalType": "int64", - "name": "creationHeight", - "type": "int64" - }, - { - "internalType": "int64", - "name": "completionTime", - "type": "int64" - }, - { - "internalType": "uint256", - "name": "initialBalance", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "sharesDst", - "type": "uint256" - } - ], - "internalType": "struct RedelegationEntry", - "name": "redelegationEntry", - "type": "tuple" - }, - { - "internalType": "uint256", - "name": "balance", - "type": "uint256" - } - ], - "internalType": "struct RedelegationEntryResponse[]", - "name": "entries", - "type": "tuple[]" - } - ], - "internalType": "struct RedelegationResponse[]", - "name": "response", - "type": "tuple[]" - }, - { - "components": [ - { - "internalType": "bytes", - "name": "nextKey", - "type": "bytes" - }, - { - "internalType": "uint64", - "name": "total", - "type": "uint64" - } - ], - "internalType": "struct PageResponse", - "name": "pageResponse", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "grantee", - "type": "address" - }, - { - "internalType": "string[]", - "name": "methods", - "type": "string[]" - } - ], - "name": "revoke", - "outputs": [ - { - "internalType": "bool", - "name": "revoked", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "delegatorAddress", - "type": "address" - }, - { - "internalType": "string", - "name": "validatorAddress", - "type": "string" - } - ], - "name": "unbondingDelegation", - "outputs": [ - { - "components": [ - { - "internalType": "string", - "name": "delegatorAddress", - "type": "string" - }, - { - "internalType": "string", - "name": "validatorAddress", - "type": "string" - }, - { - "components": [ - { - "internalType": "int64", - "name": "creationHeight", - "type": "int64" - }, - { - "internalType": "int64", - "name": "completionTime", - "type": "int64" - }, - { - "internalType": "uint256", - "name": "initialBalance", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "balance", - "type": "uint256" - }, - { - "internalType": "uint64", - "name": "unbondingId", - "type": "uint64" - }, - { - "internalType": "int64", - "name": "unbondingOnHoldRefCount", - "type": "int64" - } - ], - "internalType": "struct UnbondingDelegationEntry[]", - "name": "entries", - "type": "tuple[]" - } - ], - "internalType": "struct UnbondingDelegationOutput", - "name": "unbondingDelegation", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "delegatorAddress", - "type": "address" - }, - { - "internalType": "string", - "name": "validatorAddress", - "type": "string" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "undelegate", - "outputs": [ - { - "internalType": "int64", - "name": "completionTime", - "type": "int64" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "validatorAddress", - "type": "address" - } - ], - "name": "validator", - "outputs": [ - { - "components": [ - { - "internalType": "string", - "name": "operatorAddress", - "type": "string" - }, - { - "internalType": "string", - "name": "consensusPubkey", - "type": "string" - }, - { - "internalType": "bool", - "name": "jailed", - "type": "bool" - }, - { - "internalType": "enum BondStatus", - "name": "status", - "type": "uint8" - }, - { - "internalType": "uint256", - "name": "tokens", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "delegatorShares", - "type": "uint256" - }, - { - "internalType": "string", - "name": "description", - "type": "string" - }, - { - "internalType": "int64", - "name": "unbondingHeight", - "type": "int64" - }, - { - "internalType": "int64", - "name": "unbondingTime", - "type": "int64" - }, - { - "internalType": "uint256", - "name": "commission", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "minSelfDelegation", - "type": "uint256" - } - ], - "internalType": "struct Validator", - "name": "validator", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "status", - "type": "string" - }, - { - "components": [ - { - "internalType": "bytes", - "name": "key", - "type": "bytes" - }, - { - "internalType": "uint64", - "name": "offset", - "type": "uint64" - }, - { - "internalType": "uint64", - "name": "limit", - "type": "uint64" - }, - { - "internalType": "bool", - "name": "countTotal", - "type": "bool" - }, - { - "internalType": "bool", - "name": "reverse", - "type": "bool" - } - ], - "internalType": "struct PageRequest", - "name": "pageRequest", - "type": "tuple" - } - ], - "name": "validators", - "outputs": [ - { - "components": [ - { - "internalType": "string", - "name": "operatorAddress", - "type": "string" - }, - { - "internalType": "string", - "name": "consensusPubkey", - "type": "string" - }, - { - "internalType": "bool", - "name": "jailed", - "type": "bool" - }, - { - "internalType": "enum BondStatus", - "name": "status", - "type": "uint8" - }, - { - "internalType": "uint256", - "name": "tokens", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "delegatorShares", - "type": "uint256" - }, - { - "internalType": "string", - "name": "description", - "type": "string" - }, - { - "internalType": "int64", - "name": "unbondingHeight", - "type": "int64" - }, - { - "internalType": "int64", - "name": "unbondingTime", - "type": "int64" - }, - { - "internalType": "uint256", - "name": "commission", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "minSelfDelegation", - "type": "uint256" - } - ], - "internalType": "struct Validator[]", - "name": "validators", - "type": "tuple[]" - }, - { - "components": [ - { - "internalType": "bytes", - "name": "nextKey", - "type": "bytes" - }, - { - "internalType": "uint64", - "name": "total", - "type": "uint64" - } - ], - "internalType": "struct PageResponse", - "name": "pageResponse", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - } -] \ No newline at end of file +{ + "_format": "hh-sol-artifact-1", + "contractName": "StakingI", + "sourceName": "solidity/precompiles/staking/StakingI.sol", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "grantee", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "granter", + "type": "address" + }, + { + "indexed": false, + "internalType": "string[]", + "name": "methods", + "type": "string[]" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + } + ], + "name": "AllowanceChange", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "grantee", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "granter", + "type": "address" + }, + { + "indexed": false, + "internalType": "string[]", + "name": "methods", + "type": "string[]" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "delegatorAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "validatorAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "creationHeight", + "type": "uint256" + } + ], + "name": "CancelUnbondingDelegation", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "validatorAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "CreateValidator", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "delegatorAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "validatorAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newShares", + "type": "uint256" + } + ], + "name": "Delegate", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "validatorAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "int256", + "name": "commissionRate", + "type": "int256" + }, + { + "indexed": false, + "internalType": "int256", + "name": "minSelfDelegation", + "type": "int256" + } + ], + "name": "EditValidator", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "delegatorAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "validatorSrcAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "validatorDstAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "completionTime", + "type": "uint256" + } + ], + "name": "Redelegate", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "grantee", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "granter", + "type": "address" + }, + { + "indexed": false, + "internalType": "string[]", + "name": "methods", + "type": "string[]" + } + ], + "name": "Revocation", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "delegatorAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "validatorAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "completionTime", + "type": "uint256" + } + ], + "name": "Unbond", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "grantee", + "type": "address" + }, + { + "internalType": "address", + "name": "granter", + "type": "address" + }, + { + "internalType": "string", + "name": "method", + "type": "string" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "remaining", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "grantee", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "string[]", + "name": "methods", + "type": "string[]" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegatorAddress", + "type": "address" + }, + { + "internalType": "string", + "name": "validatorAddress", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "creationHeight", + "type": "uint256" + } + ], + "name": "cancelUnbondingDelegation", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "string", + "name": "moniker", + "type": "string" + }, + { + "internalType": "string", + "name": "identity", + "type": "string" + }, + { + "internalType": "string", + "name": "website", + "type": "string" + }, + { + "internalType": "string", + "name": "securityContact", + "type": "string" + }, + { + "internalType": "string", + "name": "details", + "type": "string" + } + ], + "internalType": "struct Description", + "name": "description", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "rate", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxRate", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxChangeRate", + "type": "uint256" + } + ], + "internalType": "struct CommissionRates", + "name": "commissionRates", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "minSelfDelegation", + "type": "uint256" + }, + { + "internalType": "address", + "name": "validatorAddress", + "type": "address" + }, + { + "internalType": "string", + "name": "pubkey", + "type": "string" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "createValidator", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "grantee", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "string[]", + "name": "methods", + "type": "string[]" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegatorAddress", + "type": "address" + }, + { + "internalType": "string", + "name": "validatorAddress", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "delegate", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegatorAddress", + "type": "address" + }, + { + "internalType": "string", + "name": "validatorAddress", + "type": "string" + } + ], + "name": "delegation", + "outputs": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Coin", + "name": "balance", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "string", + "name": "moniker", + "type": "string" + }, + { + "internalType": "string", + "name": "identity", + "type": "string" + }, + { + "internalType": "string", + "name": "website", + "type": "string" + }, + { + "internalType": "string", + "name": "securityContact", + "type": "string" + }, + { + "internalType": "string", + "name": "details", + "type": "string" + } + ], + "internalType": "struct Description", + "name": "description", + "type": "tuple" + }, + { + "internalType": "address", + "name": "validatorAddress", + "type": "address" + }, + { + "internalType": "int256", + "name": "commissionRate", + "type": "int256" + }, + { + "internalType": "int256", + "name": "minSelfDelegation", + "type": "int256" + } + ], + "name": "editValidator", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "grantee", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "string[]", + "name": "methods", + "type": "string[]" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegatorAddress", + "type": "address" + }, + { + "internalType": "string", + "name": "validatorSrcAddress", + "type": "string" + }, + { + "internalType": "string", + "name": "validatorDstAddress", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "redelegate", + "outputs": [ + { + "internalType": "int64", + "name": "completionTime", + "type": "int64" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegatorAddress", + "type": "address" + }, + { + "internalType": "string", + "name": "srcValidatorAddress", + "type": "string" + }, + { + "internalType": "string", + "name": "dstValidatorAddress", + "type": "string" + } + ], + "name": "redelegation", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "delegatorAddress", + "type": "string" + }, + { + "internalType": "string", + "name": "validatorSrcAddress", + "type": "string" + }, + { + "internalType": "string", + "name": "validatorDstAddress", + "type": "string" + }, + { + "components": [ + { + "internalType": "int64", + "name": "creationHeight", + "type": "int64" + }, + { + "internalType": "int64", + "name": "completionTime", + "type": "int64" + }, + { + "internalType": "uint256", + "name": "initialBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sharesDst", + "type": "uint256" + } + ], + "internalType": "struct RedelegationEntry[]", + "name": "entries", + "type": "tuple[]" + } + ], + "internalType": "struct RedelegationOutput", + "name": "redelegation", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegatorAddress", + "type": "address" + }, + { + "internalType": "string", + "name": "srcValidatorAddress", + "type": "string" + }, + { + "internalType": "string", + "name": "dstValidatorAddress", + "type": "string" + }, + { + "components": [ + { + "internalType": "bytes", + "name": "key", + "type": "bytes" + }, + { + "internalType": "uint64", + "name": "offset", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "limit", + "type": "uint64" + }, + { + "internalType": "bool", + "name": "countTotal", + "type": "bool" + }, + { + "internalType": "bool", + "name": "reverse", + "type": "bool" + } + ], + "internalType": "struct PageRequest", + "name": "pageRequest", + "type": "tuple" + } + ], + "name": "redelegations", + "outputs": [ + { + "components": [ + { + "components": [ + { + "internalType": "string", + "name": "delegatorAddress", + "type": "string" + }, + { + "internalType": "string", + "name": "validatorSrcAddress", + "type": "string" + }, + { + "internalType": "string", + "name": "validatorDstAddress", + "type": "string" + }, + { + "components": [ + { + "internalType": "int64", + "name": "creationHeight", + "type": "int64" + }, + { + "internalType": "int64", + "name": "completionTime", + "type": "int64" + }, + { + "internalType": "uint256", + "name": "initialBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sharesDst", + "type": "uint256" + } + ], + "internalType": "struct RedelegationEntry[]", + "name": "entries", + "type": "tuple[]" + } + ], + "internalType": "struct Redelegation", + "name": "redelegation", + "type": "tuple" + }, + { + "components": [ + { + "components": [ + { + "internalType": "int64", + "name": "creationHeight", + "type": "int64" + }, + { + "internalType": "int64", + "name": "completionTime", + "type": "int64" + }, + { + "internalType": "uint256", + "name": "initialBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sharesDst", + "type": "uint256" + } + ], + "internalType": "struct RedelegationEntry", + "name": "redelegationEntry", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + } + ], + "internalType": "struct RedelegationEntryResponse[]", + "name": "entries", + "type": "tuple[]" + } + ], + "internalType": "struct RedelegationResponse[]", + "name": "response", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "bytes", + "name": "nextKey", + "type": "bytes" + }, + { + "internalType": "uint64", + "name": "total", + "type": "uint64" + } + ], + "internalType": "struct PageResponse", + "name": "pageResponse", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "grantee", + "type": "address" + }, + { + "internalType": "string[]", + "name": "methods", + "type": "string[]" + } + ], + "name": "revoke", + "outputs": [ + { + "internalType": "bool", + "name": "revoked", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegatorAddress", + "type": "address" + }, + { + "internalType": "string", + "name": "validatorAddress", + "type": "string" + } + ], + "name": "unbondingDelegation", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "delegatorAddress", + "type": "string" + }, + { + "internalType": "string", + "name": "validatorAddress", + "type": "string" + }, + { + "components": [ + { + "internalType": "int64", + "name": "creationHeight", + "type": "int64" + }, + { + "internalType": "int64", + "name": "completionTime", + "type": "int64" + }, + { + "internalType": "uint256", + "name": "initialBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "uint64", + "name": "unbondingId", + "type": "uint64" + }, + { + "internalType": "int64", + "name": "unbondingOnHoldRefCount", + "type": "int64" + } + ], + "internalType": "struct UnbondingDelegationEntry[]", + "name": "entries", + "type": "tuple[]" + } + ], + "internalType": "struct UnbondingDelegationOutput", + "name": "unbondingDelegation", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegatorAddress", + "type": "address" + }, + { + "internalType": "string", + "name": "validatorAddress", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "undelegate", + "outputs": [ + { + "internalType": "int64", + "name": "completionTime", + "type": "int64" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "validatorAddress", + "type": "address" + } + ], + "name": "validator", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "operatorAddress", + "type": "string" + }, + { + "internalType": "string", + "name": "consensusPubkey", + "type": "string" + }, + { + "internalType": "bool", + "name": "jailed", + "type": "bool" + }, + { + "internalType": "enum BondStatus", + "name": "status", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "delegatorShares", + "type": "uint256" + }, + { + "internalType": "string", + "name": "description", + "type": "string" + }, + { + "internalType": "int64", + "name": "unbondingHeight", + "type": "int64" + }, + { + "internalType": "int64", + "name": "unbondingTime", + "type": "int64" + }, + { + "internalType": "uint256", + "name": "commission", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minSelfDelegation", + "type": "uint256" + } + ], + "internalType": "struct Validator", + "name": "validator", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "status", + "type": "string" + }, + { + "components": [ + { + "internalType": "bytes", + "name": "key", + "type": "bytes" + }, + { + "internalType": "uint64", + "name": "offset", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "limit", + "type": "uint64" + }, + { + "internalType": "bool", + "name": "countTotal", + "type": "bool" + }, + { + "internalType": "bool", + "name": "reverse", + "type": "bool" + } + ], + "internalType": "struct PageRequest", + "name": "pageRequest", + "type": "tuple" + } + ], + "name": "validators", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "operatorAddress", + "type": "string" + }, + { + "internalType": "string", + "name": "consensusPubkey", + "type": "string" + }, + { + "internalType": "bool", + "name": "jailed", + "type": "bool" + }, + { + "internalType": "enum BondStatus", + "name": "status", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "delegatorShares", + "type": "uint256" + }, + { + "internalType": "string", + "name": "description", + "type": "string" + }, + { + "internalType": "int64", + "name": "unbondingHeight", + "type": "int64" + }, + { + "internalType": "int64", + "name": "unbondingTime", + "type": "int64" + }, + { + "internalType": "uint256", + "name": "commission", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minSelfDelegation", + "type": "uint256" + } + ], + "internalType": "struct Validator[]", + "name": "validators", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "bytes", + "name": "nextKey", + "type": "bytes" + }, + { + "internalType": "uint64", + "name": "total", + "type": "uint64" + } + ], + "internalType": "struct PageResponse", + "name": "pageResponse", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/precompiles/staking/testdata/StakingCaller.json b/precompiles/staking/testdata/StakingCaller.json index ed92a2c127..63909bb3de 100644 --- a/precompiles/staking/testdata/StakingCaller.json +++ b/precompiles/staking/testdata/StakingCaller.json @@ -1,7 +1,7 @@ { "_format": "hh-sol-artifact-1", "contractName": "StakingCaller", - "sourceName": "contracts/evmos/staking/testdata/StakingCaller.sol", + "sourceName": "solidity/precompiles/staking/testdata/StakingCaller.sol", "abi": [ { "inputs": [ @@ -1071,8 +1071,8 @@ "type": "function" } ], - "bytecode": "0x60806040526040518060200160405280604051806060016040528060238152602001620061c56023913981525060019060016200003e92919062000053565b503480156200004c57600080fd5b50620004a1565b828054828255906000526020600020908101928215620000a0579160200282015b828111156200009f5782518290816200008e9190620003ba565b509160200191906001019062000074565b5b509050620000af9190620000b3565b5090565b5b80821115620000d75760008181620000cd9190620000db565b50600101620000b4565b5090565b508054620000e990620001a9565b6000825580601f10620000fd57506200011e565b601f0160209004906000526020600020908101906200011d919062000121565b5b50565b5b808211156200013c57600081600090555060010162000122565b5090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620001c257607f821691505b602082108103620001d857620001d76200017a565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620002427fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000203565b6200024e868362000203565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200029b620002956200028f8462000266565b62000270565b62000266565b9050919050565b6000819050919050565b620002b7836200027a565b620002cf620002c682620002a2565b84845462000210565b825550505050565b600090565b620002e6620002d7565b620002f3818484620002ac565b505050565b5b818110156200031b576200030f600082620002dc565b600181019050620002f9565b5050565b601f8211156200036a576200033481620001de565b6200033f84620001f3565b810160208510156200034f578190505b620003676200035e85620001f3565b830182620002f8565b50505b505050565b600082821c905092915050565b60006200038f600019846008026200036f565b1980831691505092915050565b6000620003aa83836200037c565b9150826002028217905092915050565b620003c58262000140565b67ffffffffffffffff811115620003e157620003e06200014b565b5b620003ed8254620001a9565b620003fa8282856200031f565b600060209050601f8311600181146200043257600084156200041d578287015190505b6200042985826200039c565b86555062000499565b601f1984166200044286620001de565b60005b828110156200046c5784890151825560018201915060208501945060208101905062000445565b868310156200048c578489015162000488601f8916826200037c565b8355505b6001600288020188555050505b505050505050565b615d1480620004b16000396000f3fe60806040526004361061014b5760003560e01c80637e51b811116100b6578063cf2753cf1161006f578063cf2753cf146104a8578063ec9485df146104e6578063f40a214614610523578063f5714e641461054c578063f700dbd214610568578063f732b065146105915761014b565b80637e51b811146103965780638939e783146103bf5780638edb3f8b146103e85780639eab671114610404578063af9a90b21461042d578063b13d42421461046a5761014b565b806355dc4b221161010857806355dc4b2214610283578063570467ac146102ac5780635e269bfe146102e957806360deaa2a1461031257806361bc221a1461032e57806368ac3df3146103595761014b565b80630a4433e2146101505780631904bb2e1461017957806319b16c4c146101b657806331bcbcb3146101f45780633566cb951461021d578063455b855114610246575b600080fd5b34801561015c57600080fd5b50610177600480360381019061017291906123d4565b6105cf565b005b34801561018557600080fd5b506101a0600480360381019061019b9190612448565b61069e565b6040516101ad91906126bf565b60405180910390f35b3480156101c257600080fd5b506101dd60048036038101906101d89190612811565b61072e565b6040516101eb9291906128e8565b60405180910390f35b34801561020057600080fd5b5061021b60048036038101906102169190612918565b610c2d565b005b34801561022957600080fd5b50610244600480360381019061023f9190612987565b610eba565b005b34801561025257600080fd5b5061026d600480360381019061026891906129e3565b611022565b60405161027a9190612bea565b60405180910390f35b34801561028f57600080fd5b506102aa60048036038101906102a59190612c0c565b6110b5565b005b3480156102b857600080fd5b506102d360048036038101906102ce9190612811565b6114a7565b6040516102e09190612e27565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190612e49565b61153d565b005b61032c60048036038101906103279190612ecc565b6115c8565b005b34801561033a57600080fd5b50610343611716565b6040516103509190612f15565b60405180910390f35b34801561036557600080fd5b50610380600480360381019061037b9190612f73565b61171c565b60405161038d9190613048565b60405180910390f35b3480156103a257600080fd5b506103bd60048036038101906103b89190612918565b6117b2565b005b3480156103cb57600080fd5b506103e660048036038101906103e19190612918565b61183a565b005b61040260048036038101906103fd9190612ecc565b6118c2565b005b34801561041057600080fd5b5061042b60048036038101906104269190613063565b611a57565b005b34801561043957600080fd5b50610454600480360381019061044f9190613138565b611ae2565b6040516104619190613048565b60405180910390f35b34801561047657600080fd5b50610491600480360381019061048c91906131da565b611b72565b60405161049f9291906134a3565b60405180910390f35b3480156104b457600080fd5b506104cf60048036038101906104ca91906129e3565b611c0a565b6040516104dd9291906128e8565b60405180910390f35b3480156104f257600080fd5b5061050d600480360381019061050891906129e3565b611ca2565b60405161051a9190612f15565b60405180910390f35b34801561052f57600080fd5b5061054a600480360381019061054591906134da565b611d2c565b005b61056660048036038101906105619190612ecc565b611f08565b005b34801561057457600080fd5b5061058f600480360381019061058a919061355d565b612062565b005b34801561059d57600080fd5b506105b860048036038101906105b39190613768565b61212e565b6040516105c6929190613a7f565b60405180910390f35b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895868487876040518563ffffffff1660e01b81526004016106129493929190613c18565b6020604051808303816000875af1158015610631573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106559190613c6d565b905080610697576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068e90613d1d565b60405180910390fd5b5050505050565b6106a66121cc565b61080073ffffffffffffffffffffffffffffffffffffffff1663223b3b7a836040518263ffffffff1660e01b81526004016106e19190613d3d565b600060405180830381865afa1580156106fe573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906107279190613f8e565b9050919050565b6000610738612240565b6000610800905060008686604051602401610754929190614010565b6040516020818303038152906040527f241774e6000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000856040516020016107e6919061407c565b60405160208183030381529060405280519060200120905060405160200161080d906140df565b6040516020818303038152906040528051906020012081036108f9576000808473ffffffffffffffffffffffffffffffffffffffff16846040516108519190614130565b600060405180830381855af49150503d806000811461088c576040519150601f19603f3d011682016040523d82523d6000602084013e610891565b606091505b5091509150816108d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cd906141b9565b60405180910390fd5b808060200190518101906108ea9190614245565b80975081985050505050610c22565b604051602001610908906142ed565b6040516020818303038152906040528051906020012081036109f4576000808473ffffffffffffffffffffffffffffffffffffffff168460405161094c9190614130565b600060405180830381855afa9150503d8060008114610987576040519150601f19603f3d011682016040523d82523d6000602084013e61098c565b606091505b5091509150816109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c89061434e565b60405180910390fd5b808060200190518101906109e59190614245565b80975081985050505050610c21565b604051602001610a03906143ba565b604051602081830303815290604052805190602001208103610af1576000808473ffffffffffffffffffffffffffffffffffffffff1684604051610a479190614130565b6000604051808303816000865af19150503d8060008114610a84576040519150601f19603f3d011682016040523d82523d6000602084013e610a89565b606091505b509150915081610ace576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac59061441b565b60405180910390fd5b80806020019051810190610ae29190614245565b80975081985050505050610c20565b604051602001610b0090614487565b604051602081830303815290604052805190602001208103610be45760006040518060400160405280601a81526020017f64656c65676174696f6e28616464726573732c737472696e6729000000000000815250805190602001209050600060a490506060600060208b01516020808d0101516040518681528e6004820152604060248201526033604482015282606482015281608482015260c081878360008e5af281519c5060608201519450610100820160405280610bc057600080fd5b50505050604051806040016040528083815260200182815250975050505050610c1f565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c16906144e8565b60405180910390fd5b5b5b5b505050935093915050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610c6f939291906146b6565b6020604051808303816000875af1158015610c8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb29190613c6d565b905080610cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ceb90614740565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff163384604051602401610d20929190614760565b6040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610daa9190614130565b6000604051808303816000865af19150503d8060008114610de7576040519150601f19603f3d011682016040523d82523d6000602084013e610dec565b606091505b5050905080610e30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e27906147d5565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3386866040518463ffffffff1660e01b8152600401610e6f939291906147f5565b6020604051808303816000875af1158015610e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb29190613c6d565b505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610efc939291906146b6565b6020604051808303816000875af1158015610f1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3f9190613c6d565b905080610f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f789061487f565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3085856040518463ffffffff1660e01b8152600401610fc0939291906147f5565b6020604051808303816000875af1158015610fdf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110039190613c6d565b50600160008082825461101691906148ce565b92505081905550505050565b61102a61225a565b61080073ffffffffffffffffffffffffffffffffffffffff1663a03ffee184846040518363ffffffff1660e01b8152600401611067929190614010565b600060405180830381865afa158015611084573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110ad9190614b32565b905092915050565b6000610800905060008585856040516024016110d3939291906147f5565b6040516020818303038152906040527f3edab33c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600083604051602001611165919061407c565b60405160208183030381529060405280519060200120905060405160200161118c906140df565b6040516020818303038152906040528051906020012081036112595760008373ffffffffffffffffffffffffffffffffffffffff16836040516111cf9190614130565b600060405180830381855af49150503d806000811461120a576040519150601f19603f3d011682016040523d82523d6000602084013e61120f565b606091505b5050905080611253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124a906141b9565b60405180910390fd5b5061149e565b604051602001611268906142ed565b6040516020818303038152906040528051906020012081036113355760008373ffffffffffffffffffffffffffffffffffffffff16836040516112ab9190614130565b600060405180830381855afa9150503d80600081146112e6576040519150601f19603f3d011682016040523d82523d6000602084013e6112eb565b606091505b505090508061132f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113269061434e565b60405180910390fd5b5061149d565b604051602001611344906143ba565b6040516020818303038152906040528051906020012081036114135760008373ffffffffffffffffffffffffffffffffffffffff16836040516113879190614130565b6000604051808303816000865af19150503d80600081146113c4576040519150601f19603f3d011682016040523d82523d6000602084013e6113c9565b606091505b505090508061140d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114049061441b565b60405180910390fd5b5061149c565b60405160200161142290614487565b6040516020818303038152906040528051906020012081036114605760208201825160008082846000895af28061145857600080fd5b50505061149b565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611492906144e8565b60405180910390fd5b5b5b5b50505050505050565b6114af61227b565b61080073ffffffffffffffffffffffffffffffffffffffff16637d9f939c8585856040518463ffffffff1660e01b81526004016114ee93929190614b7b565b600060405180830381865afa15801561150b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906115349190614de3565b90509392505050565b61080073ffffffffffffffffffffffffffffffffffffffff166312d58dfe858585856040518563ffffffff1660e01b815260040161157e9493929190614e2c565b6020604051808303816000875af115801561159d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c19190613c6d565b5050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895303460016040518463ffffffff1660e01b815260040161160a939291906146b6565b6020604051808303816000875af1158015611629573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164d9190613c6d565b90508061168f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168690614ec4565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b81526004016116ce939291906147f5565b6020604051808303816000875af11580156116ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117119190613c6d565b505050565b60005481565b600061080073ffffffffffffffffffffffffffffffffffffffff1663f7cd55168888888888886040518763ffffffff1660e01b815260040161176396959493929190615019565b6020604051808303816000875af1158015611782573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a69190613c6d565b90509695505050505050565b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c8484846040518463ffffffff1660e01b81526004016117f1939291906147f5565b6020604051808303816000875af1158015611810573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118349190615089565b50505050565b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb8484846040518463ffffffff1660e01b8152600401611879939291906147f5565b6020604051808303816000875af1158015611898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bc9190613c6d565b50505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b8152600401611904939291906146b6565b6020604051808303816000875af1158015611923573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119479190613c6d565b905080611989576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198090614ec4565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b81526004016119c8939291906147f5565b6020604051808303816000875af11580156119e7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0b9190613c6d565b503373ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611a52573d6000803e3d6000fd5b505050565b61080073ffffffffffffffffffffffffffffffffffffffff166354b826f5858585856040518563ffffffff1660e01b8152600401611a9894939291906150b6565b6020604051808303816000875af1158015611ab7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611adb9190615089565b5050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663a50f05ac868686866040518563ffffffff1660e01b8152600401611b259493929190615118565b6020604051808303816000875af1158015611b44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b689190613c6d565b9050949350505050565b6060611b7c6122a3565b61080073ffffffffffffffffffffffffffffffffffffffff1663186b216785856040518363ffffffff1660e01b8152600401611bb99291906152c2565b600060405180830381865afa158015611bd6573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611bff91906154b6565b915091509250929050565b6000611c14612240565b61080073ffffffffffffffffffffffffffffffffffffffff1663241774e685856040518363ffffffff1660e01b8152600401611c51929190614010565b600060405180830381865afa158015611c6e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611c979190614245565b915091509250929050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663fc08930c8433856040518463ffffffff1660e01b8152600401611ce39392919061552e565b602060405180830381865afa158015611d00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d24919061556c565b905092915050565b6000600167ffffffffffffffff811115611d4957611d486126e6565b5b604051908082528060200260200182016040528015611d7c57816020015b6060815260200190600190039081611d675790505b509050604051806060016040528060258152602001615cba6025913981600081518110611dac57611dab615599565b5b6020026020010181905250600061080073ffffffffffffffffffffffffffffffffffffffff1663b60398958787856040518463ffffffff1660e01b8152600401611df893929190615679565b6020604051808303816000875af1158015611e17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3b9190613c6d565b905080611e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7490615729565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c3285876040518463ffffffff1660e01b8152600401611ebc939291906147f5565b6020604051808303816000875af1158015611edb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eff9190615089565b50505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b8152600401611f4a939291906146b6565b6020604051808303816000875af1158015611f69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8d9190613c6d565b905080611fcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc690614ec4565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084600134611ffc91906148ce565b6040518463ffffffff1660e01b815260040161201a939291906147f5565b6020604051808303816000875af1158015612039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205d9190613c6d565b505050565b600061080073ffffffffffffffffffffffffffffffffffffffff166361dc5c3b8585856040518463ffffffff1660e01b81526004016120a393929190615749565b6020604051808303816000875af11580156120c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e69190613c6d565b905080612128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211f906157ed565b60405180910390fd5b50505050565b60606121386122a3565b61080073ffffffffffffffffffffffffffffffffffffffff166310a2851c878787876040518563ffffffff1660e01b81526004016121799493929190615883565b600060405180830381865afa158015612196573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906121bf9190615c41565b9150915094509492505050565b60405180610160016040528060608152602001606081526020016000151581526020016000600381111561220357612202612520565b5b8152602001600081526020016000815260200160608152602001600060070b8152602001600060070b815260200160008152602001600081525090565b604051806040016040528060608152602001600081525090565b60405180606001604052806060815260200160608152602001606081525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612306826122db565b9050919050565b612316816122fb565b811461232157600080fd5b50565b6000813590506123338161230d565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261235e5761235d612339565b5b8235905067ffffffffffffffff81111561237b5761237a61233e565b5b60208301915083602082028301111561239757612396612343565b5b9250929050565b6000819050919050565b6123b18161239e565b81146123bc57600080fd5b50565b6000813590506123ce816123a8565b92915050565b600080600080606085870312156123ee576123ed6122d1565b5b60006123fc87828801612324565b945050602085013567ffffffffffffffff81111561241d5761241c6122d6565b5b61242987828801612348565b9350935050604061243c878288016123bf565b91505092959194509250565b60006020828403121561245e5761245d6122d1565b5b600061246c84828501612324565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156124af578082015181840152602081019050612494565b60008484015250505050565b6000601f19601f8301169050919050565b60006124d782612475565b6124e18185612480565b93506124f1818560208601612491565b6124fa816124bb565b840191505092915050565b60008115159050919050565b61251a81612505565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106125605761255f612520565b5b50565b60008190506125718261254f565b919050565b600061258182612563565b9050919050565b61259181612576565b82525050565b6125a08161239e565b82525050565b60008160070b9050919050565b6125bc816125a6565b82525050565b60006101608301600083015184820360008601526125e082826124cc565b915050602083015184820360208601526125fa82826124cc565b915050604083015161260f6040860182612511565b5060608301516126226060860182612588565b5060808301516126356080860182612597565b5060a083015161264860a0860182612597565b5060c083015184820360c086015261266082826124cc565b91505060e083015161267560e08601826125b3565b5061010083015161268a6101008601826125b3565b5061012083015161269f610120860182612597565b506101408301516126b4610140860182612597565b508091505092915050565b600060208201905081810360008301526126d981846125c2565b905092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61271e826124bb565b810181811067ffffffffffffffff8211171561273d5761273c6126e6565b5b80604052505050565b60006127506122c7565b905061275c8282612715565b919050565b600067ffffffffffffffff82111561277c5761277b6126e6565b5b612785826124bb565b9050602081019050919050565b82818337600083830152505050565b60006127b46127af84612761565b612746565b9050828152602081018484840111156127d0576127cf6126e1565b5b6127db848285612792565b509392505050565b600082601f8301126127f8576127f7612339565b5b81356128088482602086016127a1565b91505092915050565b60008060006060848603121561282a576128296122d1565b5b600061283886828701612324565b935050602084013567ffffffffffffffff811115612859576128586122d6565b5b612865868287016127e3565b925050604084013567ffffffffffffffff811115612886576128856122d6565b5b612892868287016127e3565b9150509250925092565b6128a58161239e565b82525050565b600060408301600083015184820360008601526128c882826124cc565b91505060208301516128dd6020860182612597565b508091505092915050565b60006040820190506128fd600083018561289c565b818103602083015261290f81846128ab565b90509392505050565b600080600060608486031215612931576129306122d1565b5b600061293f86828701612324565b935050602084013567ffffffffffffffff8111156129605761295f6122d6565b5b61296c868287016127e3565b925050604061297d868287016123bf565b9150509250925092565b6000806040838503121561299e5761299d6122d1565b5b600083013567ffffffffffffffff8111156129bc576129bb6122d6565b5b6129c8858286016127e3565b92505060206129d9858286016123bf565b9150509250929050565b600080604083850312156129fa576129f96122d1565b5b6000612a0885828601612324565b925050602083013567ffffffffffffffff811115612a2957612a286122d6565b5b612a35858286016127e3565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600067ffffffffffffffff82169050919050565b612a8881612a6b565b82525050565b60c082016000820151612aa460008501826125b3565b506020820151612ab760208501826125b3565b506040820151612aca6040850182612597565b506060820151612add6060850182612597565b506080820151612af06080850182612a7f565b5060a0820151612b0360a08501826125b3565b50505050565b6000612b158383612a8e565b60c08301905092915050565b6000602082019050919050565b6000612b3982612a3f565b612b438185612a4a565b9350612b4e83612a5b565b8060005b83811015612b7f578151612b668882612b09565b9750612b7183612b21565b925050600181019050612b52565b5085935050505092915050565b60006060830160008301518482036000860152612ba982826124cc565b91505060208301518482036020860152612bc382826124cc565b91505060408301518482036040860152612bdd8282612b2e565b9150508091505092915050565b60006020820190508181036000830152612c048184612b8c565b905092915050565b60008060008060808587031215612c2657612c256122d1565b5b6000612c3487828801612324565b945050602085013567ffffffffffffffff811115612c5557612c546122d6565b5b612c61878288016127e3565b9350506040612c72878288016123bf565b925050606085013567ffffffffffffffff811115612c9357612c926122d6565b5b612c9f878288016127e3565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b608082016000820151612ced60008501826125b3565b506020820151612d0060208501826125b3565b506040820151612d136040850182612597565b506060820151612d266060850182612597565b50505050565b6000612d388383612cd7565b60808301905092915050565b6000602082019050919050565b6000612d5c82612cab565b612d668185612cb6565b9350612d7183612cc7565b8060005b83811015612da2578151612d898882612d2c565b9750612d9483612d44565b925050600181019050612d75565b5085935050505092915050565b60006080830160008301518482036000860152612dcc82826124cc565b91505060208301518482036020860152612de682826124cc565b91505060408301518482036040860152612e0082826124cc565b91505060608301518482036060860152612e1a8282612d51565b9150508091505092915050565b60006020820190508181036000830152612e418184612daf565b905092915050565b60008060008060808587031215612e6357612e626122d1565b5b6000612e7187828801612324565b945050602085013567ffffffffffffffff811115612e9257612e916122d6565b5b612e9e878288016127e3565b9350506040612eaf878288016123bf565b9250506060612ec0878288016123bf565b91505092959194509250565b600060208284031215612ee257612ee16122d1565b5b600082013567ffffffffffffffff811115612f0057612eff6122d6565b5b612f0c848285016127e3565b91505092915050565b6000602082019050612f2a600083018461289c565b92915050565b600080fd5b600060a08284031215612f4b57612f4a612f30565b5b81905092915050565b600060608284031215612f6a57612f69612f30565b5b81905092915050565b6000806000806000806101008789031215612f9157612f906122d1565b5b600087013567ffffffffffffffff811115612faf57612fae6122d6565b5b612fbb89828a01612f35565b9650506020612fcc89828a01612f54565b9550506080612fdd89828a016123bf565b94505060a0612fee89828a01612324565b93505060c087013567ffffffffffffffff81111561300f5761300e6122d6565b5b61301b89828a016127e3565b92505060e061302c89828a016123bf565b9150509295509295509295565b61304281612505565b82525050565b600060208201905061305d6000830184613039565b92915050565b6000806000806080858703121561307d5761307c6122d1565b5b600061308b87828801612324565b945050602085013567ffffffffffffffff8111156130ac576130ab6122d6565b5b6130b8878288016127e3565b935050604085013567ffffffffffffffff8111156130d9576130d86122d6565b5b6130e5878288016127e3565b92505060606130f6878288016123bf565b91505092959194509250565b6000819050919050565b61311581613102565b811461312057600080fd5b50565b6000813590506131328161310c565b92915050565b60008060008060808587031215613152576131516122d1565b5b600085013567ffffffffffffffff8111156131705761316f6122d6565b5b61317c87828801612f35565b945050602061318d87828801612324565b935050604061319e87828801613123565b92505060606131af87828801613123565b91505092959194509250565b600060a082840312156131d1576131d0612f30565b5b81905092915050565b600080604083850312156131f1576131f06122d1565b5b600083013567ffffffffffffffff81111561320f5761320e6122d6565b5b61321b858286016127e3565b925050602083013567ffffffffffffffff81111561323c5761323b6122d6565b5b613248858286016131bb565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061016083016000830151848203600086015261329c82826124cc565b915050602083015184820360208601526132b682826124cc565b91505060408301516132cb6040860182612511565b5060608301516132de6060860182612588565b5060808301516132f16080860182612597565b5060a083015161330460a0860182612597565b5060c083015184820360c086015261331c82826124cc565b91505060e083015161333160e08601826125b3565b506101008301516133466101008601826125b3565b5061012083015161335b610120860182612597565b50610140830151613370610140860182612597565b508091505092915050565b6000613387838361327e565b905092915050565b6000602082019050919050565b60006133a782613252565b6133b1818561325d565b9350836020820285016133c38561326e565b8060005b858110156133ff57848403895281516133e0858261337b565b94506133eb8361338f565b925060208a019950506001810190506133c7565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b600061343882613411565b613442818561341c565b9350613452818560208601612491565b61345b816124bb565b840191505092915050565b60006040830160008301518482036000860152613483828261342d565b91505060208301516134986020860182612a7f565b508091505092915050565b600060408201905081810360008301526134bd818561339c565b905081810360208301526134d18184613466565b90509392505050565b600080600080608085870312156134f4576134f36122d1565b5b600061350287828801612324565b9450506020613513878288016123bf565b9350506040613524878288016123bf565b925050606085013567ffffffffffffffff811115613545576135446122d6565b5b613551878288016127e3565b91505092959194509250565b600080600060408486031215613576576135756122d1565b5b600061358486828701612324565b935050602084013567ffffffffffffffff8111156135a5576135a46122d6565b5b6135b186828701612348565b92509250509250925092565b600080fd5b600080fd5b600067ffffffffffffffff8211156135e2576135e16126e6565b5b6135eb826124bb565b9050602081019050919050565b600061360b613606846135c7565b612746565b905082815260208101848484011115613627576136266126e1565b5b613632848285612792565b509392505050565b600082601f83011261364f5761364e612339565b5b813561365f8482602086016135f8565b91505092915050565b61367181612a6b565b811461367c57600080fd5b50565b60008135905061368e81613668565b92915050565b61369d81612505565b81146136a857600080fd5b50565b6000813590506136ba81613694565b92915050565b600060a082840312156136d6576136d56135bd565b5b6136e060a0612746565b9050600082013567ffffffffffffffff811115613700576136ff6135c2565b5b61370c8482850161363a565b60008301525060206137208482850161367f565b60208301525060406137348482850161367f565b6040830152506060613748848285016136ab565b606083015250608061375c848285016136ab565b60808301525092915050565b60008060008060808587031215613782576137816122d1565b5b600061379087828801612324565b945050602085013567ffffffffffffffff8111156137b1576137b06122d6565b5b6137bd878288016127e3565b935050604085013567ffffffffffffffff8111156137de576137dd6122d6565b5b6137ea878288016127e3565b925050606085013567ffffffffffffffff81111561380b5761380a6122d6565b5b613817878288016136c0565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000608083016000830151848203600086015261386c82826124cc565b9150506020830151848203602086015261388682826124cc565b915050604083015184820360408601526138a082826124cc565b915050606083015184820360608601526138ba8282612d51565b9150508091505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60a0820160008201516139096000850182612cd7565b50602082015161391c6080850182612597565b50505050565b600061392e83836138f3565b60a08301905092915050565b6000602082019050919050565b6000613952826138c7565b61395c81856138d2565b9350613967836138e3565b8060005b8381101561399857815161397f8882613922565b975061398a8361393a565b92505060018101905061396b565b5085935050505092915050565b600060408301600083015184820360008601526139c2828261384f565b915050602083015184820360208601526139dc8282613947565b9150508091505092915050565b60006139f583836139a5565b905092915050565b6000602082019050919050565b6000613a1582613823565b613a1f818561382e565b935083602082028501613a318561383f565b8060005b85811015613a6d5784840389528151613a4e85826139e9565b9450613a59836139fd565b925060208a01995050600181019050613a35565b50829750879550505050505092915050565b60006040820190508181036000830152613a998185613a0a565b90508181036020830152613aad8184613466565b90509392505050565b613abf816122fb565b82525050565b600082825260208201905092915050565b6000819050919050565b6000613aec8385612480565b9350613af9838584612792565b613b02836124bb565b840190509392505050565b6000613b1a848484613ae0565b90509392505050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112613b4f57613b4e613b2d565b5b83810192508235915060208301925067ffffffffffffffff821115613b7757613b76613b23565b5b600182023603831315613b8d57613b8c613b28565b5b509250929050565b6000602082019050919050565b6000613bae8385613ac5565b935083602084028501613bc084613ad6565b8060005b87811015613c06578484038952613bdb8284613b32565b613be6868284613b0d565b9550613bf184613b95565b935060208b019a505050600181019050613bc4565b50829750879450505050509392505050565b6000606082019050613c2d6000830187613ab6565b613c3a602083018661289c565b8181036040830152613c4d818486613ba2565b905095945050505050565b600081519050613c6781613694565b92915050565b600060208284031215613c8357613c826122d1565b5b6000613c9184828501613c58565b91505092915050565b600082825260208201905092915050565b7f4661696c656420746f20617070726f7665207374616b696e67206d6574686f6460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d07602183613c9a565b9150613d1282613cab565b604082019050919050565b60006020820190508181036000830152613d3681613cfa565b9050919050565b6000602082019050613d526000830184613ab6565b92915050565b6000613d6b613d6684612761565b612746565b905082815260208101848484011115613d8757613d866126e1565b5b613d92848285612491565b509392505050565b600082601f830112613daf57613dae612339565b5b8151613dbf848260208601613d58565b91505092915050565b60048110613dd557600080fd5b50565b600081519050613de781613dc8565b92915050565b600081519050613dfc816123a8565b92915050565b613e0b816125a6565b8114613e1657600080fd5b50565b600081519050613e2881613e02565b92915050565b60006101608284031215613e4557613e446135bd565b5b613e50610160612746565b9050600082015167ffffffffffffffff811115613e7057613e6f6135c2565b5b613e7c84828501613d9a565b600083015250602082015167ffffffffffffffff811115613ea057613e9f6135c2565b5b613eac84828501613d9a565b6020830152506040613ec084828501613c58565b6040830152506060613ed484828501613dd8565b6060830152506080613ee884828501613ded565b60808301525060a0613efc84828501613ded565b60a08301525060c082015167ffffffffffffffff811115613f2057613f1f6135c2565b5b613f2c84828501613d9a565b60c08301525060e0613f4084828501613e19565b60e083015250610100613f5584828501613e19565b61010083015250610120613f6b84828501613ded565b61012083015250610140613f8184828501613ded565b6101408301525092915050565b600060208284031215613fa457613fa36122d1565b5b600082015167ffffffffffffffff811115613fc257613fc16122d6565b5b613fce84828501613e2e565b91505092915050565b6000613fe282612475565b613fec8185613c9a565b9350613ffc818560208601612491565b614005816124bb565b840191505092915050565b60006040820190506140256000830185613ab6565b81810360208301526140378184613fd7565b90509392505050565b600081905092915050565b600061405682612475565b6140608185614040565b9350614070818560208601612491565b80840191505092915050565b6000614088828461404b565b915081905092915050565b7f64656c656761746563616c6c0000000000000000000000000000000000000000600082015250565b60006140c9600c83614040565b91506140d482614093565b600c82019050919050565b60006140ea826140bc565b9150819050919050565b600081905092915050565b600061410a82613411565b61411481856140f4565b9350614124818560208601612491565b80840191505092915050565b600061413c82846140ff565b915081905092915050565b7f6661696c65642064656c656761746563616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b60006141a3602183613c9a565b91506141ae82614147565b604082019050919050565b600060208201905081810360008301526141d281614196565b9050919050565b6000604082840312156141ef576141ee6135bd565b5b6141f96040612746565b9050600082015167ffffffffffffffff811115614219576142186135c2565b5b61422584828501613d9a565b600083015250602061423984828501613ded565b60208301525092915050565b6000806040838503121561425c5761425b6122d1565b5b600061426a85828601613ded565b925050602083015167ffffffffffffffff81111561428b5761428a6122d6565b5b614297858286016141d9565b9150509250929050565b7f73746174696363616c6c00000000000000000000000000000000000000000000600082015250565b60006142d7600a83614040565b91506142e2826142a1565b600a82019050919050565b60006142f8826142ca565b9150819050919050565b7f6661696c65642073746174696363616c6c20746f20707265636f6d70696c6500600082015250565b6000614338601f83613c9a565b915061434382614302565b602082019050919050565b600060208201905081810360008301526143678161432b565b9050919050565b7f63616c6c00000000000000000000000000000000000000000000000000000000600082015250565b60006143a4600483614040565b91506143af8261436e565b600482019050919050565b60006143c582614397565b9150819050919050565b7f6661696c65642063616c6c20746f20707265636f6d70696c6500000000000000600082015250565b6000614405601983613c9a565b9150614410826143cf565b602082019050919050565b60006020820190508181036000830152614434816143f8565b9050919050565b7f63616c6c636f6465000000000000000000000000000000000000000000000000600082015250565b6000614471600883614040565b915061447c8261443b565b600882019050919050565b600061449282614464565b9150819050919050565b7f696e76616c69642063616c6c7479706500000000000000000000000000000000600082015250565b60006144d2601083613c9a565b91506144dd8261449c565b602082019050919050565b60006020820190508181036000830152614501816144c5565b9050919050565b600081549050919050565b60008190508160005260206000209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061456f57607f821691505b60208210810361458257614581614528565b5b50919050565b60008190508160005260206000209050919050565b600081546145aa81614557565b6145b48186612480565b945060018216600081146145cf57600181146145e557614618565b60ff198316865281151560200286019350614618565b6145ee85614588565b60005b83811015614610578154818901526001820191506020810190506145f1565b808801955050505b50505092915050565b600061462d838361459d565b905092915050565b6000600182019050919050565b600061464d82614508565b6146578185613ac5565b93508360208202850161466985614513565b8060005b858110156146a4578484038952816146858582614621565b945061469083614635565b925060208a0199505060018101905061466d565b50829750879550505050505092915050565b60006060820190506146cb6000830186613ab6565b6146d8602083018561289c565b81810360408301526146ea8184614642565b9050949350505050565b7f64656c65676174696f6e20617070726f76616c206661696c6564000000000000600082015250565b600061472a601a83613c9a565b9150614735826146f4565b602082019050919050565b600060208201905081810360008301526147598161471d565b9050919050565b60006040820190506147756000830185613ab6565b614782602083018461289c565b9392505050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b60006147bf600f83613c9a565b91506147ca82614789565b602082019050919050565b600060208201905081810360008301526147ee816147b2565b9050919050565b600060608201905061480a6000830186613ab6565b818103602083015261481c8185613fd7565b905061482b604083018461289c565b949350505050565b7f5374616b696e6720417070726f7665206661696c656400000000000000000000600082015250565b6000614869601683613c9a565b915061487482614833565b602082019050919050565b600060208201905081810360008301526148988161485c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006148d98261239e565b91506148e48361239e565b92508282019050808211156148fc576148fb61489f565b5b92915050565b600067ffffffffffffffff82111561491d5761491c6126e6565b5b602082029050602081019050919050565b60008151905061493d81613668565b92915050565b600060c08284031215614959576149586135bd565b5b61496360c0612746565b9050600061497384828501613e19565b600083015250602061498784828501613e19565b602083015250604061499b84828501613ded565b60408301525060606149af84828501613ded565b60608301525060806149c38482850161492e565b60808301525060a06149d784828501613e19565b60a08301525092915050565b60006149f66149f184614902565b612746565b90508083825260208201905060c08402830185811115614a1957614a18612343565b5b835b81811015614a425780614a2e8882614943565b84526020840193505060c081019050614a1b565b5050509392505050565b600082601f830112614a6157614a60612339565b5b8151614a718482602086016149e3565b91505092915050565b600060608284031215614a9057614a8f6135bd565b5b614a9a6060612746565b9050600082015167ffffffffffffffff811115614aba57614ab96135c2565b5b614ac684828501613d9a565b600083015250602082015167ffffffffffffffff811115614aea57614ae96135c2565b5b614af684828501613d9a565b602083015250604082015167ffffffffffffffff811115614b1a57614b196135c2565b5b614b2684828501614a4c565b60408301525092915050565b600060208284031215614b4857614b476122d1565b5b600082015167ffffffffffffffff811115614b6657614b656122d6565b5b614b7284828501614a7a565b91505092915050565b6000606082019050614b906000830186613ab6565b8181036020830152614ba28185613fd7565b90508181036040830152614bb68184613fd7565b9050949350505050565b600067ffffffffffffffff821115614bdb57614bda6126e6565b5b602082029050602081019050919050565b600060808284031215614c0257614c016135bd565b5b614c0c6080612746565b90506000614c1c84828501613e19565b6000830152506020614c3084828501613e19565b6020830152506040614c4484828501613ded565b6040830152506060614c5884828501613ded565b60608301525092915050565b6000614c77614c7284614bc0565b612746565b90508083825260208201905060808402830185811115614c9a57614c99612343565b5b835b81811015614cc35780614caf8882614bec565b845260208401935050608081019050614c9c565b5050509392505050565b600082601f830112614ce257614ce1612339565b5b8151614cf2848260208601614c64565b91505092915050565b600060808284031215614d1157614d106135bd565b5b614d1b6080612746565b9050600082015167ffffffffffffffff811115614d3b57614d3a6135c2565b5b614d4784828501613d9a565b600083015250602082015167ffffffffffffffff811115614d6b57614d6a6135c2565b5b614d7784828501613d9a565b602083015250604082015167ffffffffffffffff811115614d9b57614d9a6135c2565b5b614da784828501613d9a565b604083015250606082015167ffffffffffffffff811115614dcb57614dca6135c2565b5b614dd784828501614ccd565b60608301525092915050565b600060208284031215614df957614df86122d1565b5b600082015167ffffffffffffffff811115614e1757614e166122d6565b5b614e2384828501614cfb565b91505092915050565b6000608082019050614e416000830187613ab6565b8181036020830152614e538186613fd7565b9050614e62604083018561289c565b614e6f606083018461289c565b95945050505050565b7f44656c656761746520417070726f7665206661696c6564000000000000000000600082015250565b6000614eae601783613c9a565b9150614eb982614e78565b602082019050919050565b60006020820190508181036000830152614edd81614ea1565b9050919050565b600060a08301614ef76000840184613b32565b8583036000870152614f0a838284613ae0565b92505050614f1b6020840184613b32565b8583036020870152614f2e838284613ae0565b92505050614f3f6040840184613b32565b8583036040870152614f52838284613ae0565b92505050614f636060840184613b32565b8583036060870152614f76838284613ae0565b92505050614f876080840184613b32565b8583036080870152614f9a838284613ae0565b925050508091505092915050565b6000614fb760208401846123bf565b905092915050565b60608201614fd06000830183614fa8565b614fdd6000850182612597565b50614feb6020830183614fa8565b614ff86020850182612597565b506150066040830183614fa8565b6150136040850182612597565b50505050565b60006101008201905081810360008301526150348189614ee4565b90506150436020830188614fbf565b615050608083018761289c565b61505d60a0830186613ab6565b81810360c083015261506f8185613fd7565b905061507e60e083018461289c565b979650505050505050565b60006020828403121561509f5761509e6122d1565b5b60006150ad84828501613e19565b91505092915050565b60006080820190506150cb6000830187613ab6565b81810360208301526150dd8186613fd7565b905081810360408301526150f18185613fd7565b9050615100606083018461289c565b95945050505050565b61511281613102565b82525050565b600060808201905081810360008301526151328187614ee4565b90506151416020830186613ab6565b61514e6040830185615109565b61515b6060830184615109565b95945050505050565b6000808335600160200384360303811261518157615180613b2d565b5b83810192508235915060208301925067ffffffffffffffff8211156151a9576151a8613b23565b5b6001820236038313156151bf576151be613b28565b5b509250929050565b60006151d3838561341c565b93506151e0838584612792565b6151e9836124bb565b840190509392505050565b6000615203602084018461367f565b905092915050565b600061521a60208401846136ab565b905092915050565b600060a083016152356000840184615164565b85830360008701526152488382846151c7565b9250505061525960208401846151f4565b6152666020860182612a7f565b5061527460408401846151f4565b6152816040860182612a7f565b5061528f606084018461520b565b61529c6060860182612511565b506152aa608084018461520b565b6152b76080860182612511565b508091505092915050565b600060408201905081810360008301526152dc8185613fd7565b905081810360208301526152f08184615222565b90509392505050565b600067ffffffffffffffff821115615314576153136126e6565b5b602082029050602081019050919050565b6000615338615333846152f9565b612746565b9050808382526020820190506020840283018581111561535b5761535a612343565b5b835b818110156153a257805167ffffffffffffffff8111156153805761537f612339565b5b80860161538d8982613e2e565b8552602085019450505060208101905061535d565b5050509392505050565b600082601f8301126153c1576153c0612339565b5b81516153d1848260208601615325565b91505092915050565b60006153ed6153e8846135c7565b612746565b905082815260208101848484011115615409576154086126e1565b5b615414848285612491565b509392505050565b600082601f83011261543157615430612339565b5b81516154418482602086016153da565b91505092915050565b6000604082840312156154605761545f6135bd565b5b61546a6040612746565b9050600082015167ffffffffffffffff81111561548a576154896135c2565b5b6154968482850161541c565b60008301525060206154aa8482850161492e565b60208301525092915050565b600080604083850312156154cd576154cc6122d1565b5b600083015167ffffffffffffffff8111156154eb576154ea6122d6565b5b6154f7858286016153ac565b925050602083015167ffffffffffffffff811115615518576155176122d6565b5b6155248582860161544a565b9150509250929050565b60006060820190506155436000830186613ab6565b6155506020830185613ab6565b81810360408301526155628184613fd7565b9050949350505050565b600060208284031215615582576155816122d1565b5b600061559084828501613ded565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b6000819050602082019050919050565b60006155ef83836124cc565b905092915050565b6000602082019050919050565b600061560f826155c8565b6156198185613ac5565b93508360208202850161562b856155d3565b8060005b85811015615667578484038952815161564885826155e3565b9450615653836155f7565b925060208a0199505060018101905061562f565b50829750879550505050505092915050565b600060608201905061568e6000830186613ab6565b61569b602083018561289c565b81810360408301526156ad8184615604565b9050949350505050565b7f6661696c656420746f20617070726f766520756e64656c65676174696f6e206d60008201527f6574686f64000000000000000000000000000000000000000000000000000000602082015250565b6000615713602583613c9a565b915061571e826156b7565b604082019050919050565b6000602082019050818103600083015261574281615706565b9050919050565b600060408201905061575e6000830186613ab6565b8181036020830152615771818486613ba2565b9050949350505050565b7f4661696c656420746f207265766f6b6520617070726f76616c20666f7220737460008201527f616b696e67206d6574686f647300000000000000000000000000000000000000602082015250565b60006157d7602d83613c9a565b91506157e28261577b565b604082019050919050565b60006020820190508181036000830152615806816157ca565b9050919050565b600060a083016000830151848203600086015261582a828261342d565b915050602083015161583f6020860182612a7f565b5060408301516158526040860182612a7f565b5060608301516158656060860182612511565b5060808301516158786080860182612511565b508091505092915050565b60006080820190506158986000830187613ab6565b81810360208301526158aa8186613fd7565b905081810360408301526158be8185613fd7565b905081810360608301526158d2818461580d565b905095945050505050565b600067ffffffffffffffff8211156158f8576158f76126e6565b5b602082029050602081019050919050565b60006080828403121561591f5761591e6135bd565b5b6159296080612746565b9050600082015167ffffffffffffffff811115615949576159486135c2565b5b61595584828501613d9a565b600083015250602082015167ffffffffffffffff811115615979576159786135c2565b5b61598584828501613d9a565b602083015250604082015167ffffffffffffffff8111156159a9576159a86135c2565b5b6159b584828501613d9a565b604083015250606082015167ffffffffffffffff8111156159d9576159d86135c2565b5b6159e584828501614ccd565b60608301525092915050565b600067ffffffffffffffff821115615a0c57615a0b6126e6565b5b602082029050602081019050919050565b600060a08284031215615a3357615a326135bd565b5b615a3d6040612746565b90506000615a4d84828501614bec565b6000830152506080615a6184828501613ded565b60208301525092915050565b6000615a80615a7b846159f1565b612746565b90508083825260208201905060a08402830185811115615aa357615aa2612343565b5b835b81811015615acc5780615ab88882615a1d565b84526020840193505060a081019050615aa5565b5050509392505050565b600082601f830112615aeb57615aea612339565b5b8151615afb848260208601615a6d565b91505092915050565b600060408284031215615b1a57615b196135bd565b5b615b246040612746565b9050600082015167ffffffffffffffff811115615b4457615b436135c2565b5b615b5084828501615909565b600083015250602082015167ffffffffffffffff811115615b7457615b736135c2565b5b615b8084828501615ad6565b60208301525092915050565b6000615b9f615b9a846158dd565b612746565b90508083825260208201905060208402830185811115615bc257615bc1612343565b5b835b81811015615c0957805167ffffffffffffffff811115615be757615be6612339565b5b808601615bf48982615b04565b85526020850194505050602081019050615bc4565b5050509392505050565b600082601f830112615c2857615c27612339565b5b8151615c38848260208601615b8c565b91505092915050565b60008060408385031215615c5857615c576122d1565b5b600083015167ffffffffffffffff811115615c7657615c756122d6565b5b615c8285828601615c13565b925050602083015167ffffffffffffffff811115615ca357615ca26122d6565b5b615caf8582860161544a565b915050925092905056fe2f636f736d6f732e7374616b696e672e763162657461312e4d7367556e64656c6567617465a2646970667358221220b1862923f78a295a0f30b8d05151c1dc82fb92c0b2dc98be2f6486b611ef4ede64736f6c634300081200332f636f736d6f732e7374616b696e672e763162657461312e4d736744656c6567617465", - "deployedBytecode": "0x60806040526004361061014b5760003560e01c80637e51b811116100b6578063cf2753cf1161006f578063cf2753cf146104a8578063ec9485df146104e6578063f40a214614610523578063f5714e641461054c578063f700dbd214610568578063f732b065146105915761014b565b80637e51b811146103965780638939e783146103bf5780638edb3f8b146103e85780639eab671114610404578063af9a90b21461042d578063b13d42421461046a5761014b565b806355dc4b221161010857806355dc4b2214610283578063570467ac146102ac5780635e269bfe146102e957806360deaa2a1461031257806361bc221a1461032e57806368ac3df3146103595761014b565b80630a4433e2146101505780631904bb2e1461017957806319b16c4c146101b657806331bcbcb3146101f45780633566cb951461021d578063455b855114610246575b600080fd5b34801561015c57600080fd5b50610177600480360381019061017291906123d4565b6105cf565b005b34801561018557600080fd5b506101a0600480360381019061019b9190612448565b61069e565b6040516101ad91906126bf565b60405180910390f35b3480156101c257600080fd5b506101dd60048036038101906101d89190612811565b61072e565b6040516101eb9291906128e8565b60405180910390f35b34801561020057600080fd5b5061021b60048036038101906102169190612918565b610c2d565b005b34801561022957600080fd5b50610244600480360381019061023f9190612987565b610eba565b005b34801561025257600080fd5b5061026d600480360381019061026891906129e3565b611022565b60405161027a9190612bea565b60405180910390f35b34801561028f57600080fd5b506102aa60048036038101906102a59190612c0c565b6110b5565b005b3480156102b857600080fd5b506102d360048036038101906102ce9190612811565b6114a7565b6040516102e09190612e27565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190612e49565b61153d565b005b61032c60048036038101906103279190612ecc565b6115c8565b005b34801561033a57600080fd5b50610343611716565b6040516103509190612f15565b60405180910390f35b34801561036557600080fd5b50610380600480360381019061037b9190612f73565b61171c565b60405161038d9190613048565b60405180910390f35b3480156103a257600080fd5b506103bd60048036038101906103b89190612918565b6117b2565b005b3480156103cb57600080fd5b506103e660048036038101906103e19190612918565b61183a565b005b61040260048036038101906103fd9190612ecc565b6118c2565b005b34801561041057600080fd5b5061042b60048036038101906104269190613063565b611a57565b005b34801561043957600080fd5b50610454600480360381019061044f9190613138565b611ae2565b6040516104619190613048565b60405180910390f35b34801561047657600080fd5b50610491600480360381019061048c91906131da565b611b72565b60405161049f9291906134a3565b60405180910390f35b3480156104b457600080fd5b506104cf60048036038101906104ca91906129e3565b611c0a565b6040516104dd9291906128e8565b60405180910390f35b3480156104f257600080fd5b5061050d600480360381019061050891906129e3565b611ca2565b60405161051a9190612f15565b60405180910390f35b34801561052f57600080fd5b5061054a600480360381019061054591906134da565b611d2c565b005b61056660048036038101906105619190612ecc565b611f08565b005b34801561057457600080fd5b5061058f600480360381019061058a919061355d565b612062565b005b34801561059d57600080fd5b506105b860048036038101906105b39190613768565b61212e565b6040516105c6929190613a7f565b60405180910390f35b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895868487876040518563ffffffff1660e01b81526004016106129493929190613c18565b6020604051808303816000875af1158015610631573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106559190613c6d565b905080610697576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068e90613d1d565b60405180910390fd5b5050505050565b6106a66121cc565b61080073ffffffffffffffffffffffffffffffffffffffff1663223b3b7a836040518263ffffffff1660e01b81526004016106e19190613d3d565b600060405180830381865afa1580156106fe573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906107279190613f8e565b9050919050565b6000610738612240565b6000610800905060008686604051602401610754929190614010565b6040516020818303038152906040527f241774e6000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000856040516020016107e6919061407c565b60405160208183030381529060405280519060200120905060405160200161080d906140df565b6040516020818303038152906040528051906020012081036108f9576000808473ffffffffffffffffffffffffffffffffffffffff16846040516108519190614130565b600060405180830381855af49150503d806000811461088c576040519150601f19603f3d011682016040523d82523d6000602084013e610891565b606091505b5091509150816108d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cd906141b9565b60405180910390fd5b808060200190518101906108ea9190614245565b80975081985050505050610c22565b604051602001610908906142ed565b6040516020818303038152906040528051906020012081036109f4576000808473ffffffffffffffffffffffffffffffffffffffff168460405161094c9190614130565b600060405180830381855afa9150503d8060008114610987576040519150601f19603f3d011682016040523d82523d6000602084013e61098c565b606091505b5091509150816109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c89061434e565b60405180910390fd5b808060200190518101906109e59190614245565b80975081985050505050610c21565b604051602001610a03906143ba565b604051602081830303815290604052805190602001208103610af1576000808473ffffffffffffffffffffffffffffffffffffffff1684604051610a479190614130565b6000604051808303816000865af19150503d8060008114610a84576040519150601f19603f3d011682016040523d82523d6000602084013e610a89565b606091505b509150915081610ace576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac59061441b565b60405180910390fd5b80806020019051810190610ae29190614245565b80975081985050505050610c20565b604051602001610b0090614487565b604051602081830303815290604052805190602001208103610be45760006040518060400160405280601a81526020017f64656c65676174696f6e28616464726573732c737472696e6729000000000000815250805190602001209050600060a490506060600060208b01516020808d0101516040518681528e6004820152604060248201526033604482015282606482015281608482015260c081878360008e5af281519c5060608201519450610100820160405280610bc057600080fd5b50505050604051806040016040528083815260200182815250975050505050610c1f565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c16906144e8565b60405180910390fd5b5b5b5b505050935093915050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610c6f939291906146b6565b6020604051808303816000875af1158015610c8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb29190613c6d565b905080610cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ceb90614740565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff163384604051602401610d20929190614760565b6040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610daa9190614130565b6000604051808303816000865af19150503d8060008114610de7576040519150601f19603f3d011682016040523d82523d6000602084013e610dec565b606091505b5050905080610e30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e27906147d5565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3386866040518463ffffffff1660e01b8152600401610e6f939291906147f5565b6020604051808303816000875af1158015610e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb29190613c6d565b505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610efc939291906146b6565b6020604051808303816000875af1158015610f1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3f9190613c6d565b905080610f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f789061487f565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3085856040518463ffffffff1660e01b8152600401610fc0939291906147f5565b6020604051808303816000875af1158015610fdf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110039190613c6d565b50600160008082825461101691906148ce565b92505081905550505050565b61102a61225a565b61080073ffffffffffffffffffffffffffffffffffffffff1663a03ffee184846040518363ffffffff1660e01b8152600401611067929190614010565b600060405180830381865afa158015611084573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110ad9190614b32565b905092915050565b6000610800905060008585856040516024016110d3939291906147f5565b6040516020818303038152906040527f3edab33c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600083604051602001611165919061407c565b60405160208183030381529060405280519060200120905060405160200161118c906140df565b6040516020818303038152906040528051906020012081036112595760008373ffffffffffffffffffffffffffffffffffffffff16836040516111cf9190614130565b600060405180830381855af49150503d806000811461120a576040519150601f19603f3d011682016040523d82523d6000602084013e61120f565b606091505b5050905080611253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124a906141b9565b60405180910390fd5b5061149e565b604051602001611268906142ed565b6040516020818303038152906040528051906020012081036113355760008373ffffffffffffffffffffffffffffffffffffffff16836040516112ab9190614130565b600060405180830381855afa9150503d80600081146112e6576040519150601f19603f3d011682016040523d82523d6000602084013e6112eb565b606091505b505090508061132f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113269061434e565b60405180910390fd5b5061149d565b604051602001611344906143ba565b6040516020818303038152906040528051906020012081036114135760008373ffffffffffffffffffffffffffffffffffffffff16836040516113879190614130565b6000604051808303816000865af19150503d80600081146113c4576040519150601f19603f3d011682016040523d82523d6000602084013e6113c9565b606091505b505090508061140d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114049061441b565b60405180910390fd5b5061149c565b60405160200161142290614487565b6040516020818303038152906040528051906020012081036114605760208201825160008082846000895af28061145857600080fd5b50505061149b565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611492906144e8565b60405180910390fd5b5b5b5b50505050505050565b6114af61227b565b61080073ffffffffffffffffffffffffffffffffffffffff16637d9f939c8585856040518463ffffffff1660e01b81526004016114ee93929190614b7b565b600060405180830381865afa15801561150b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906115349190614de3565b90509392505050565b61080073ffffffffffffffffffffffffffffffffffffffff166312d58dfe858585856040518563ffffffff1660e01b815260040161157e9493929190614e2c565b6020604051808303816000875af115801561159d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c19190613c6d565b5050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895303460016040518463ffffffff1660e01b815260040161160a939291906146b6565b6020604051808303816000875af1158015611629573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164d9190613c6d565b90508061168f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168690614ec4565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b81526004016116ce939291906147f5565b6020604051808303816000875af11580156116ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117119190613c6d565b505050565b60005481565b600061080073ffffffffffffffffffffffffffffffffffffffff1663f7cd55168888888888886040518763ffffffff1660e01b815260040161176396959493929190615019565b6020604051808303816000875af1158015611782573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a69190613c6d565b90509695505050505050565b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c8484846040518463ffffffff1660e01b81526004016117f1939291906147f5565b6020604051808303816000875af1158015611810573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118349190615089565b50505050565b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb8484846040518463ffffffff1660e01b8152600401611879939291906147f5565b6020604051808303816000875af1158015611898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bc9190613c6d565b50505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b8152600401611904939291906146b6565b6020604051808303816000875af1158015611923573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119479190613c6d565b905080611989576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198090614ec4565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b81526004016119c8939291906147f5565b6020604051808303816000875af11580156119e7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0b9190613c6d565b503373ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611a52573d6000803e3d6000fd5b505050565b61080073ffffffffffffffffffffffffffffffffffffffff166354b826f5858585856040518563ffffffff1660e01b8152600401611a9894939291906150b6565b6020604051808303816000875af1158015611ab7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611adb9190615089565b5050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663a50f05ac868686866040518563ffffffff1660e01b8152600401611b259493929190615118565b6020604051808303816000875af1158015611b44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b689190613c6d565b9050949350505050565b6060611b7c6122a3565b61080073ffffffffffffffffffffffffffffffffffffffff1663186b216785856040518363ffffffff1660e01b8152600401611bb99291906152c2565b600060405180830381865afa158015611bd6573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611bff91906154b6565b915091509250929050565b6000611c14612240565b61080073ffffffffffffffffffffffffffffffffffffffff1663241774e685856040518363ffffffff1660e01b8152600401611c51929190614010565b600060405180830381865afa158015611c6e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611c979190614245565b915091509250929050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663fc08930c8433856040518463ffffffff1660e01b8152600401611ce39392919061552e565b602060405180830381865afa158015611d00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d24919061556c565b905092915050565b6000600167ffffffffffffffff811115611d4957611d486126e6565b5b604051908082528060200260200182016040528015611d7c57816020015b6060815260200190600190039081611d675790505b509050604051806060016040528060258152602001615cba6025913981600081518110611dac57611dab615599565b5b6020026020010181905250600061080073ffffffffffffffffffffffffffffffffffffffff1663b60398958787856040518463ffffffff1660e01b8152600401611df893929190615679565b6020604051808303816000875af1158015611e17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3b9190613c6d565b905080611e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7490615729565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c3285876040518463ffffffff1660e01b8152600401611ebc939291906147f5565b6020604051808303816000875af1158015611edb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eff9190615089565b50505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b8152600401611f4a939291906146b6565b6020604051808303816000875af1158015611f69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8d9190613c6d565b905080611fcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc690614ec4565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084600134611ffc91906148ce565b6040518463ffffffff1660e01b815260040161201a939291906147f5565b6020604051808303816000875af1158015612039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205d9190613c6d565b505050565b600061080073ffffffffffffffffffffffffffffffffffffffff166361dc5c3b8585856040518463ffffffff1660e01b81526004016120a393929190615749565b6020604051808303816000875af11580156120c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e69190613c6d565b905080612128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211f906157ed565b60405180910390fd5b50505050565b60606121386122a3565b61080073ffffffffffffffffffffffffffffffffffffffff166310a2851c878787876040518563ffffffff1660e01b81526004016121799493929190615883565b600060405180830381865afa158015612196573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906121bf9190615c41565b9150915094509492505050565b60405180610160016040528060608152602001606081526020016000151581526020016000600381111561220357612202612520565b5b8152602001600081526020016000815260200160608152602001600060070b8152602001600060070b815260200160008152602001600081525090565b604051806040016040528060608152602001600081525090565b60405180606001604052806060815260200160608152602001606081525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612306826122db565b9050919050565b612316816122fb565b811461232157600080fd5b50565b6000813590506123338161230d565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261235e5761235d612339565b5b8235905067ffffffffffffffff81111561237b5761237a61233e565b5b60208301915083602082028301111561239757612396612343565b5b9250929050565b6000819050919050565b6123b18161239e565b81146123bc57600080fd5b50565b6000813590506123ce816123a8565b92915050565b600080600080606085870312156123ee576123ed6122d1565b5b60006123fc87828801612324565b945050602085013567ffffffffffffffff81111561241d5761241c6122d6565b5b61242987828801612348565b9350935050604061243c878288016123bf565b91505092959194509250565b60006020828403121561245e5761245d6122d1565b5b600061246c84828501612324565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156124af578082015181840152602081019050612494565b60008484015250505050565b6000601f19601f8301169050919050565b60006124d782612475565b6124e18185612480565b93506124f1818560208601612491565b6124fa816124bb565b840191505092915050565b60008115159050919050565b61251a81612505565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106125605761255f612520565b5b50565b60008190506125718261254f565b919050565b600061258182612563565b9050919050565b61259181612576565b82525050565b6125a08161239e565b82525050565b60008160070b9050919050565b6125bc816125a6565b82525050565b60006101608301600083015184820360008601526125e082826124cc565b915050602083015184820360208601526125fa82826124cc565b915050604083015161260f6040860182612511565b5060608301516126226060860182612588565b5060808301516126356080860182612597565b5060a083015161264860a0860182612597565b5060c083015184820360c086015261266082826124cc565b91505060e083015161267560e08601826125b3565b5061010083015161268a6101008601826125b3565b5061012083015161269f610120860182612597565b506101408301516126b4610140860182612597565b508091505092915050565b600060208201905081810360008301526126d981846125c2565b905092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61271e826124bb565b810181811067ffffffffffffffff8211171561273d5761273c6126e6565b5b80604052505050565b60006127506122c7565b905061275c8282612715565b919050565b600067ffffffffffffffff82111561277c5761277b6126e6565b5b612785826124bb565b9050602081019050919050565b82818337600083830152505050565b60006127b46127af84612761565b612746565b9050828152602081018484840111156127d0576127cf6126e1565b5b6127db848285612792565b509392505050565b600082601f8301126127f8576127f7612339565b5b81356128088482602086016127a1565b91505092915050565b60008060006060848603121561282a576128296122d1565b5b600061283886828701612324565b935050602084013567ffffffffffffffff811115612859576128586122d6565b5b612865868287016127e3565b925050604084013567ffffffffffffffff811115612886576128856122d6565b5b612892868287016127e3565b9150509250925092565b6128a58161239e565b82525050565b600060408301600083015184820360008601526128c882826124cc565b91505060208301516128dd6020860182612597565b508091505092915050565b60006040820190506128fd600083018561289c565b818103602083015261290f81846128ab565b90509392505050565b600080600060608486031215612931576129306122d1565b5b600061293f86828701612324565b935050602084013567ffffffffffffffff8111156129605761295f6122d6565b5b61296c868287016127e3565b925050604061297d868287016123bf565b9150509250925092565b6000806040838503121561299e5761299d6122d1565b5b600083013567ffffffffffffffff8111156129bc576129bb6122d6565b5b6129c8858286016127e3565b92505060206129d9858286016123bf565b9150509250929050565b600080604083850312156129fa576129f96122d1565b5b6000612a0885828601612324565b925050602083013567ffffffffffffffff811115612a2957612a286122d6565b5b612a35858286016127e3565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600067ffffffffffffffff82169050919050565b612a8881612a6b565b82525050565b60c082016000820151612aa460008501826125b3565b506020820151612ab760208501826125b3565b506040820151612aca6040850182612597565b506060820151612add6060850182612597565b506080820151612af06080850182612a7f565b5060a0820151612b0360a08501826125b3565b50505050565b6000612b158383612a8e565b60c08301905092915050565b6000602082019050919050565b6000612b3982612a3f565b612b438185612a4a565b9350612b4e83612a5b565b8060005b83811015612b7f578151612b668882612b09565b9750612b7183612b21565b925050600181019050612b52565b5085935050505092915050565b60006060830160008301518482036000860152612ba982826124cc565b91505060208301518482036020860152612bc382826124cc565b91505060408301518482036040860152612bdd8282612b2e565b9150508091505092915050565b60006020820190508181036000830152612c048184612b8c565b905092915050565b60008060008060808587031215612c2657612c256122d1565b5b6000612c3487828801612324565b945050602085013567ffffffffffffffff811115612c5557612c546122d6565b5b612c61878288016127e3565b9350506040612c72878288016123bf565b925050606085013567ffffffffffffffff811115612c9357612c926122d6565b5b612c9f878288016127e3565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b608082016000820151612ced60008501826125b3565b506020820151612d0060208501826125b3565b506040820151612d136040850182612597565b506060820151612d266060850182612597565b50505050565b6000612d388383612cd7565b60808301905092915050565b6000602082019050919050565b6000612d5c82612cab565b612d668185612cb6565b9350612d7183612cc7565b8060005b83811015612da2578151612d898882612d2c565b9750612d9483612d44565b925050600181019050612d75565b5085935050505092915050565b60006080830160008301518482036000860152612dcc82826124cc565b91505060208301518482036020860152612de682826124cc565b91505060408301518482036040860152612e0082826124cc565b91505060608301518482036060860152612e1a8282612d51565b9150508091505092915050565b60006020820190508181036000830152612e418184612daf565b905092915050565b60008060008060808587031215612e6357612e626122d1565b5b6000612e7187828801612324565b945050602085013567ffffffffffffffff811115612e9257612e916122d6565b5b612e9e878288016127e3565b9350506040612eaf878288016123bf565b9250506060612ec0878288016123bf565b91505092959194509250565b600060208284031215612ee257612ee16122d1565b5b600082013567ffffffffffffffff811115612f0057612eff6122d6565b5b612f0c848285016127e3565b91505092915050565b6000602082019050612f2a600083018461289c565b92915050565b600080fd5b600060a08284031215612f4b57612f4a612f30565b5b81905092915050565b600060608284031215612f6a57612f69612f30565b5b81905092915050565b6000806000806000806101008789031215612f9157612f906122d1565b5b600087013567ffffffffffffffff811115612faf57612fae6122d6565b5b612fbb89828a01612f35565b9650506020612fcc89828a01612f54565b9550506080612fdd89828a016123bf565b94505060a0612fee89828a01612324565b93505060c087013567ffffffffffffffff81111561300f5761300e6122d6565b5b61301b89828a016127e3565b92505060e061302c89828a016123bf565b9150509295509295509295565b61304281612505565b82525050565b600060208201905061305d6000830184613039565b92915050565b6000806000806080858703121561307d5761307c6122d1565b5b600061308b87828801612324565b945050602085013567ffffffffffffffff8111156130ac576130ab6122d6565b5b6130b8878288016127e3565b935050604085013567ffffffffffffffff8111156130d9576130d86122d6565b5b6130e5878288016127e3565b92505060606130f6878288016123bf565b91505092959194509250565b6000819050919050565b61311581613102565b811461312057600080fd5b50565b6000813590506131328161310c565b92915050565b60008060008060808587031215613152576131516122d1565b5b600085013567ffffffffffffffff8111156131705761316f6122d6565b5b61317c87828801612f35565b945050602061318d87828801612324565b935050604061319e87828801613123565b92505060606131af87828801613123565b91505092959194509250565b600060a082840312156131d1576131d0612f30565b5b81905092915050565b600080604083850312156131f1576131f06122d1565b5b600083013567ffffffffffffffff81111561320f5761320e6122d6565b5b61321b858286016127e3565b925050602083013567ffffffffffffffff81111561323c5761323b6122d6565b5b613248858286016131bb565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061016083016000830151848203600086015261329c82826124cc565b915050602083015184820360208601526132b682826124cc565b91505060408301516132cb6040860182612511565b5060608301516132de6060860182612588565b5060808301516132f16080860182612597565b5060a083015161330460a0860182612597565b5060c083015184820360c086015261331c82826124cc565b91505060e083015161333160e08601826125b3565b506101008301516133466101008601826125b3565b5061012083015161335b610120860182612597565b50610140830151613370610140860182612597565b508091505092915050565b6000613387838361327e565b905092915050565b6000602082019050919050565b60006133a782613252565b6133b1818561325d565b9350836020820285016133c38561326e565b8060005b858110156133ff57848403895281516133e0858261337b565b94506133eb8361338f565b925060208a019950506001810190506133c7565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b600061343882613411565b613442818561341c565b9350613452818560208601612491565b61345b816124bb565b840191505092915050565b60006040830160008301518482036000860152613483828261342d565b91505060208301516134986020860182612a7f565b508091505092915050565b600060408201905081810360008301526134bd818561339c565b905081810360208301526134d18184613466565b90509392505050565b600080600080608085870312156134f4576134f36122d1565b5b600061350287828801612324565b9450506020613513878288016123bf565b9350506040613524878288016123bf565b925050606085013567ffffffffffffffff811115613545576135446122d6565b5b613551878288016127e3565b91505092959194509250565b600080600060408486031215613576576135756122d1565b5b600061358486828701612324565b935050602084013567ffffffffffffffff8111156135a5576135a46122d6565b5b6135b186828701612348565b92509250509250925092565b600080fd5b600080fd5b600067ffffffffffffffff8211156135e2576135e16126e6565b5b6135eb826124bb565b9050602081019050919050565b600061360b613606846135c7565b612746565b905082815260208101848484011115613627576136266126e1565b5b613632848285612792565b509392505050565b600082601f83011261364f5761364e612339565b5b813561365f8482602086016135f8565b91505092915050565b61367181612a6b565b811461367c57600080fd5b50565b60008135905061368e81613668565b92915050565b61369d81612505565b81146136a857600080fd5b50565b6000813590506136ba81613694565b92915050565b600060a082840312156136d6576136d56135bd565b5b6136e060a0612746565b9050600082013567ffffffffffffffff811115613700576136ff6135c2565b5b61370c8482850161363a565b60008301525060206137208482850161367f565b60208301525060406137348482850161367f565b6040830152506060613748848285016136ab565b606083015250608061375c848285016136ab565b60808301525092915050565b60008060008060808587031215613782576137816122d1565b5b600061379087828801612324565b945050602085013567ffffffffffffffff8111156137b1576137b06122d6565b5b6137bd878288016127e3565b935050604085013567ffffffffffffffff8111156137de576137dd6122d6565b5b6137ea878288016127e3565b925050606085013567ffffffffffffffff81111561380b5761380a6122d6565b5b613817878288016136c0565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000608083016000830151848203600086015261386c82826124cc565b9150506020830151848203602086015261388682826124cc565b915050604083015184820360408601526138a082826124cc565b915050606083015184820360608601526138ba8282612d51565b9150508091505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60a0820160008201516139096000850182612cd7565b50602082015161391c6080850182612597565b50505050565b600061392e83836138f3565b60a08301905092915050565b6000602082019050919050565b6000613952826138c7565b61395c81856138d2565b9350613967836138e3565b8060005b8381101561399857815161397f8882613922565b975061398a8361393a565b92505060018101905061396b565b5085935050505092915050565b600060408301600083015184820360008601526139c2828261384f565b915050602083015184820360208601526139dc8282613947565b9150508091505092915050565b60006139f583836139a5565b905092915050565b6000602082019050919050565b6000613a1582613823565b613a1f818561382e565b935083602082028501613a318561383f565b8060005b85811015613a6d5784840389528151613a4e85826139e9565b9450613a59836139fd565b925060208a01995050600181019050613a35565b50829750879550505050505092915050565b60006040820190508181036000830152613a998185613a0a565b90508181036020830152613aad8184613466565b90509392505050565b613abf816122fb565b82525050565b600082825260208201905092915050565b6000819050919050565b6000613aec8385612480565b9350613af9838584612792565b613b02836124bb565b840190509392505050565b6000613b1a848484613ae0565b90509392505050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112613b4f57613b4e613b2d565b5b83810192508235915060208301925067ffffffffffffffff821115613b7757613b76613b23565b5b600182023603831315613b8d57613b8c613b28565b5b509250929050565b6000602082019050919050565b6000613bae8385613ac5565b935083602084028501613bc084613ad6565b8060005b87811015613c06578484038952613bdb8284613b32565b613be6868284613b0d565b9550613bf184613b95565b935060208b019a505050600181019050613bc4565b50829750879450505050509392505050565b6000606082019050613c2d6000830187613ab6565b613c3a602083018661289c565b8181036040830152613c4d818486613ba2565b905095945050505050565b600081519050613c6781613694565b92915050565b600060208284031215613c8357613c826122d1565b5b6000613c9184828501613c58565b91505092915050565b600082825260208201905092915050565b7f4661696c656420746f20617070726f7665207374616b696e67206d6574686f6460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d07602183613c9a565b9150613d1282613cab565b604082019050919050565b60006020820190508181036000830152613d3681613cfa565b9050919050565b6000602082019050613d526000830184613ab6565b92915050565b6000613d6b613d6684612761565b612746565b905082815260208101848484011115613d8757613d866126e1565b5b613d92848285612491565b509392505050565b600082601f830112613daf57613dae612339565b5b8151613dbf848260208601613d58565b91505092915050565b60048110613dd557600080fd5b50565b600081519050613de781613dc8565b92915050565b600081519050613dfc816123a8565b92915050565b613e0b816125a6565b8114613e1657600080fd5b50565b600081519050613e2881613e02565b92915050565b60006101608284031215613e4557613e446135bd565b5b613e50610160612746565b9050600082015167ffffffffffffffff811115613e7057613e6f6135c2565b5b613e7c84828501613d9a565b600083015250602082015167ffffffffffffffff811115613ea057613e9f6135c2565b5b613eac84828501613d9a565b6020830152506040613ec084828501613c58565b6040830152506060613ed484828501613dd8565b6060830152506080613ee884828501613ded565b60808301525060a0613efc84828501613ded565b60a08301525060c082015167ffffffffffffffff811115613f2057613f1f6135c2565b5b613f2c84828501613d9a565b60c08301525060e0613f4084828501613e19565b60e083015250610100613f5584828501613e19565b61010083015250610120613f6b84828501613ded565b61012083015250610140613f8184828501613ded565b6101408301525092915050565b600060208284031215613fa457613fa36122d1565b5b600082015167ffffffffffffffff811115613fc257613fc16122d6565b5b613fce84828501613e2e565b91505092915050565b6000613fe282612475565b613fec8185613c9a565b9350613ffc818560208601612491565b614005816124bb565b840191505092915050565b60006040820190506140256000830185613ab6565b81810360208301526140378184613fd7565b90509392505050565b600081905092915050565b600061405682612475565b6140608185614040565b9350614070818560208601612491565b80840191505092915050565b6000614088828461404b565b915081905092915050565b7f64656c656761746563616c6c0000000000000000000000000000000000000000600082015250565b60006140c9600c83614040565b91506140d482614093565b600c82019050919050565b60006140ea826140bc565b9150819050919050565b600081905092915050565b600061410a82613411565b61411481856140f4565b9350614124818560208601612491565b80840191505092915050565b600061413c82846140ff565b915081905092915050565b7f6661696c65642064656c656761746563616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b60006141a3602183613c9a565b91506141ae82614147565b604082019050919050565b600060208201905081810360008301526141d281614196565b9050919050565b6000604082840312156141ef576141ee6135bd565b5b6141f96040612746565b9050600082015167ffffffffffffffff811115614219576142186135c2565b5b61422584828501613d9a565b600083015250602061423984828501613ded565b60208301525092915050565b6000806040838503121561425c5761425b6122d1565b5b600061426a85828601613ded565b925050602083015167ffffffffffffffff81111561428b5761428a6122d6565b5b614297858286016141d9565b9150509250929050565b7f73746174696363616c6c00000000000000000000000000000000000000000000600082015250565b60006142d7600a83614040565b91506142e2826142a1565b600a82019050919050565b60006142f8826142ca565b9150819050919050565b7f6661696c65642073746174696363616c6c20746f20707265636f6d70696c6500600082015250565b6000614338601f83613c9a565b915061434382614302565b602082019050919050565b600060208201905081810360008301526143678161432b565b9050919050565b7f63616c6c00000000000000000000000000000000000000000000000000000000600082015250565b60006143a4600483614040565b91506143af8261436e565b600482019050919050565b60006143c582614397565b9150819050919050565b7f6661696c65642063616c6c20746f20707265636f6d70696c6500000000000000600082015250565b6000614405601983613c9a565b9150614410826143cf565b602082019050919050565b60006020820190508181036000830152614434816143f8565b9050919050565b7f63616c6c636f6465000000000000000000000000000000000000000000000000600082015250565b6000614471600883614040565b915061447c8261443b565b600882019050919050565b600061449282614464565b9150819050919050565b7f696e76616c69642063616c6c7479706500000000000000000000000000000000600082015250565b60006144d2601083613c9a565b91506144dd8261449c565b602082019050919050565b60006020820190508181036000830152614501816144c5565b9050919050565b600081549050919050565b60008190508160005260206000209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061456f57607f821691505b60208210810361458257614581614528565b5b50919050565b60008190508160005260206000209050919050565b600081546145aa81614557565b6145b48186612480565b945060018216600081146145cf57600181146145e557614618565b60ff198316865281151560200286019350614618565b6145ee85614588565b60005b83811015614610578154818901526001820191506020810190506145f1565b808801955050505b50505092915050565b600061462d838361459d565b905092915050565b6000600182019050919050565b600061464d82614508565b6146578185613ac5565b93508360208202850161466985614513565b8060005b858110156146a4578484038952816146858582614621565b945061469083614635565b925060208a0199505060018101905061466d565b50829750879550505050505092915050565b60006060820190506146cb6000830186613ab6565b6146d8602083018561289c565b81810360408301526146ea8184614642565b9050949350505050565b7f64656c65676174696f6e20617070726f76616c206661696c6564000000000000600082015250565b600061472a601a83613c9a565b9150614735826146f4565b602082019050919050565b600060208201905081810360008301526147598161471d565b9050919050565b60006040820190506147756000830185613ab6565b614782602083018461289c565b9392505050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b60006147bf600f83613c9a565b91506147ca82614789565b602082019050919050565b600060208201905081810360008301526147ee816147b2565b9050919050565b600060608201905061480a6000830186613ab6565b818103602083015261481c8185613fd7565b905061482b604083018461289c565b949350505050565b7f5374616b696e6720417070726f7665206661696c656400000000000000000000600082015250565b6000614869601683613c9a565b915061487482614833565b602082019050919050565b600060208201905081810360008301526148988161485c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006148d98261239e565b91506148e48361239e565b92508282019050808211156148fc576148fb61489f565b5b92915050565b600067ffffffffffffffff82111561491d5761491c6126e6565b5b602082029050602081019050919050565b60008151905061493d81613668565b92915050565b600060c08284031215614959576149586135bd565b5b61496360c0612746565b9050600061497384828501613e19565b600083015250602061498784828501613e19565b602083015250604061499b84828501613ded565b60408301525060606149af84828501613ded565b60608301525060806149c38482850161492e565b60808301525060a06149d784828501613e19565b60a08301525092915050565b60006149f66149f184614902565b612746565b90508083825260208201905060c08402830185811115614a1957614a18612343565b5b835b81811015614a425780614a2e8882614943565b84526020840193505060c081019050614a1b565b5050509392505050565b600082601f830112614a6157614a60612339565b5b8151614a718482602086016149e3565b91505092915050565b600060608284031215614a9057614a8f6135bd565b5b614a9a6060612746565b9050600082015167ffffffffffffffff811115614aba57614ab96135c2565b5b614ac684828501613d9a565b600083015250602082015167ffffffffffffffff811115614aea57614ae96135c2565b5b614af684828501613d9a565b602083015250604082015167ffffffffffffffff811115614b1a57614b196135c2565b5b614b2684828501614a4c565b60408301525092915050565b600060208284031215614b4857614b476122d1565b5b600082015167ffffffffffffffff811115614b6657614b656122d6565b5b614b7284828501614a7a565b91505092915050565b6000606082019050614b906000830186613ab6565b8181036020830152614ba28185613fd7565b90508181036040830152614bb68184613fd7565b9050949350505050565b600067ffffffffffffffff821115614bdb57614bda6126e6565b5b602082029050602081019050919050565b600060808284031215614c0257614c016135bd565b5b614c0c6080612746565b90506000614c1c84828501613e19565b6000830152506020614c3084828501613e19565b6020830152506040614c4484828501613ded565b6040830152506060614c5884828501613ded565b60608301525092915050565b6000614c77614c7284614bc0565b612746565b90508083825260208201905060808402830185811115614c9a57614c99612343565b5b835b81811015614cc35780614caf8882614bec565b845260208401935050608081019050614c9c565b5050509392505050565b600082601f830112614ce257614ce1612339565b5b8151614cf2848260208601614c64565b91505092915050565b600060808284031215614d1157614d106135bd565b5b614d1b6080612746565b9050600082015167ffffffffffffffff811115614d3b57614d3a6135c2565b5b614d4784828501613d9a565b600083015250602082015167ffffffffffffffff811115614d6b57614d6a6135c2565b5b614d7784828501613d9a565b602083015250604082015167ffffffffffffffff811115614d9b57614d9a6135c2565b5b614da784828501613d9a565b604083015250606082015167ffffffffffffffff811115614dcb57614dca6135c2565b5b614dd784828501614ccd565b60608301525092915050565b600060208284031215614df957614df86122d1565b5b600082015167ffffffffffffffff811115614e1757614e166122d6565b5b614e2384828501614cfb565b91505092915050565b6000608082019050614e416000830187613ab6565b8181036020830152614e538186613fd7565b9050614e62604083018561289c565b614e6f606083018461289c565b95945050505050565b7f44656c656761746520417070726f7665206661696c6564000000000000000000600082015250565b6000614eae601783613c9a565b9150614eb982614e78565b602082019050919050565b60006020820190508181036000830152614edd81614ea1565b9050919050565b600060a08301614ef76000840184613b32565b8583036000870152614f0a838284613ae0565b92505050614f1b6020840184613b32565b8583036020870152614f2e838284613ae0565b92505050614f3f6040840184613b32565b8583036040870152614f52838284613ae0565b92505050614f636060840184613b32565b8583036060870152614f76838284613ae0565b92505050614f876080840184613b32565b8583036080870152614f9a838284613ae0565b925050508091505092915050565b6000614fb760208401846123bf565b905092915050565b60608201614fd06000830183614fa8565b614fdd6000850182612597565b50614feb6020830183614fa8565b614ff86020850182612597565b506150066040830183614fa8565b6150136040850182612597565b50505050565b60006101008201905081810360008301526150348189614ee4565b90506150436020830188614fbf565b615050608083018761289c565b61505d60a0830186613ab6565b81810360c083015261506f8185613fd7565b905061507e60e083018461289c565b979650505050505050565b60006020828403121561509f5761509e6122d1565b5b60006150ad84828501613e19565b91505092915050565b60006080820190506150cb6000830187613ab6565b81810360208301526150dd8186613fd7565b905081810360408301526150f18185613fd7565b9050615100606083018461289c565b95945050505050565b61511281613102565b82525050565b600060808201905081810360008301526151328187614ee4565b90506151416020830186613ab6565b61514e6040830185615109565b61515b6060830184615109565b95945050505050565b6000808335600160200384360303811261518157615180613b2d565b5b83810192508235915060208301925067ffffffffffffffff8211156151a9576151a8613b23565b5b6001820236038313156151bf576151be613b28565b5b509250929050565b60006151d3838561341c565b93506151e0838584612792565b6151e9836124bb565b840190509392505050565b6000615203602084018461367f565b905092915050565b600061521a60208401846136ab565b905092915050565b600060a083016152356000840184615164565b85830360008701526152488382846151c7565b9250505061525960208401846151f4565b6152666020860182612a7f565b5061527460408401846151f4565b6152816040860182612a7f565b5061528f606084018461520b565b61529c6060860182612511565b506152aa608084018461520b565b6152b76080860182612511565b508091505092915050565b600060408201905081810360008301526152dc8185613fd7565b905081810360208301526152f08184615222565b90509392505050565b600067ffffffffffffffff821115615314576153136126e6565b5b602082029050602081019050919050565b6000615338615333846152f9565b612746565b9050808382526020820190506020840283018581111561535b5761535a612343565b5b835b818110156153a257805167ffffffffffffffff8111156153805761537f612339565b5b80860161538d8982613e2e565b8552602085019450505060208101905061535d565b5050509392505050565b600082601f8301126153c1576153c0612339565b5b81516153d1848260208601615325565b91505092915050565b60006153ed6153e8846135c7565b612746565b905082815260208101848484011115615409576154086126e1565b5b615414848285612491565b509392505050565b600082601f83011261543157615430612339565b5b81516154418482602086016153da565b91505092915050565b6000604082840312156154605761545f6135bd565b5b61546a6040612746565b9050600082015167ffffffffffffffff81111561548a576154896135c2565b5b6154968482850161541c565b60008301525060206154aa8482850161492e565b60208301525092915050565b600080604083850312156154cd576154cc6122d1565b5b600083015167ffffffffffffffff8111156154eb576154ea6122d6565b5b6154f7858286016153ac565b925050602083015167ffffffffffffffff811115615518576155176122d6565b5b6155248582860161544a565b9150509250929050565b60006060820190506155436000830186613ab6565b6155506020830185613ab6565b81810360408301526155628184613fd7565b9050949350505050565b600060208284031215615582576155816122d1565b5b600061559084828501613ded565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b6000819050602082019050919050565b60006155ef83836124cc565b905092915050565b6000602082019050919050565b600061560f826155c8565b6156198185613ac5565b93508360208202850161562b856155d3565b8060005b85811015615667578484038952815161564885826155e3565b9450615653836155f7565b925060208a0199505060018101905061562f565b50829750879550505050505092915050565b600060608201905061568e6000830186613ab6565b61569b602083018561289c565b81810360408301526156ad8184615604565b9050949350505050565b7f6661696c656420746f20617070726f766520756e64656c65676174696f6e206d60008201527f6574686f64000000000000000000000000000000000000000000000000000000602082015250565b6000615713602583613c9a565b915061571e826156b7565b604082019050919050565b6000602082019050818103600083015261574281615706565b9050919050565b600060408201905061575e6000830186613ab6565b8181036020830152615771818486613ba2565b9050949350505050565b7f4661696c656420746f207265766f6b6520617070726f76616c20666f7220737460008201527f616b696e67206d6574686f647300000000000000000000000000000000000000602082015250565b60006157d7602d83613c9a565b91506157e28261577b565b604082019050919050565b60006020820190508181036000830152615806816157ca565b9050919050565b600060a083016000830151848203600086015261582a828261342d565b915050602083015161583f6020860182612a7f565b5060408301516158526040860182612a7f565b5060608301516158656060860182612511565b5060808301516158786080860182612511565b508091505092915050565b60006080820190506158986000830187613ab6565b81810360208301526158aa8186613fd7565b905081810360408301526158be8185613fd7565b905081810360608301526158d2818461580d565b905095945050505050565b600067ffffffffffffffff8211156158f8576158f76126e6565b5b602082029050602081019050919050565b60006080828403121561591f5761591e6135bd565b5b6159296080612746565b9050600082015167ffffffffffffffff811115615949576159486135c2565b5b61595584828501613d9a565b600083015250602082015167ffffffffffffffff811115615979576159786135c2565b5b61598584828501613d9a565b602083015250604082015167ffffffffffffffff8111156159a9576159a86135c2565b5b6159b584828501613d9a565b604083015250606082015167ffffffffffffffff8111156159d9576159d86135c2565b5b6159e584828501614ccd565b60608301525092915050565b600067ffffffffffffffff821115615a0c57615a0b6126e6565b5b602082029050602081019050919050565b600060a08284031215615a3357615a326135bd565b5b615a3d6040612746565b90506000615a4d84828501614bec565b6000830152506080615a6184828501613ded565b60208301525092915050565b6000615a80615a7b846159f1565b612746565b90508083825260208201905060a08402830185811115615aa357615aa2612343565b5b835b81811015615acc5780615ab88882615a1d565b84526020840193505060a081019050615aa5565b5050509392505050565b600082601f830112615aeb57615aea612339565b5b8151615afb848260208601615a6d565b91505092915050565b600060408284031215615b1a57615b196135bd565b5b615b246040612746565b9050600082015167ffffffffffffffff811115615b4457615b436135c2565b5b615b5084828501615909565b600083015250602082015167ffffffffffffffff811115615b7457615b736135c2565b5b615b8084828501615ad6565b60208301525092915050565b6000615b9f615b9a846158dd565b612746565b90508083825260208201905060208402830185811115615bc257615bc1612343565b5b835b81811015615c0957805167ffffffffffffffff811115615be757615be6612339565b5b808601615bf48982615b04565b85526020850194505050602081019050615bc4565b5050509392505050565b600082601f830112615c2857615c27612339565b5b8151615c38848260208601615b8c565b91505092915050565b60008060408385031215615c5857615c576122d1565b5b600083015167ffffffffffffffff811115615c7657615c756122d6565b5b615c8285828601615c13565b925050602083015167ffffffffffffffff811115615ca357615ca26122d6565b5b615caf8582860161544a565b915050925092905056fe2f636f736d6f732e7374616b696e672e763162657461312e4d7367556e64656c6567617465a2646970667358221220b1862923f78a295a0f30b8d05151c1dc82fb92c0b2dc98be2f6486b611ef4ede64736f6c63430008120033", + "bytecode": "0x60806040526040518060200160405280604051806060016040528060238152602001620061c56023913981525060019060016200003e92919062000053565b503480156200004c57600080fd5b50620004a1565b828054828255906000526020600020908101928215620000a0579160200282015b828111156200009f5782518290816200008e9190620003ba565b509160200191906001019062000074565b5b509050620000af9190620000b3565b5090565b5b80821115620000d75760008181620000cd9190620000db565b50600101620000b4565b5090565b508054620000e990620001a9565b6000825580601f10620000fd57506200011e565b601f0160209004906000526020600020908101906200011d919062000121565b5b50565b5b808211156200013c57600081600090555060010162000122565b5090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620001c257607f821691505b602082108103620001d857620001d76200017a565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620002427fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000203565b6200024e868362000203565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200029b620002956200028f8462000266565b62000270565b62000266565b9050919050565b6000819050919050565b620002b7836200027a565b620002cf620002c682620002a2565b84845462000210565b825550505050565b600090565b620002e6620002d7565b620002f3818484620002ac565b505050565b5b818110156200031b576200030f600082620002dc565b600181019050620002f9565b5050565b601f8211156200036a576200033481620001de565b6200033f84620001f3565b810160208510156200034f578190505b620003676200035e85620001f3565b830182620002f8565b50505b505050565b600082821c905092915050565b60006200038f600019846008026200036f565b1980831691505092915050565b6000620003aa83836200037c565b9150826002028217905092915050565b620003c58262000140565b67ffffffffffffffff811115620003e157620003e06200014b565b5b620003ed8254620001a9565b620003fa8282856200031f565b600060209050601f8311600181146200043257600084156200041d578287015190505b6200042985826200039c565b86555062000499565b601f1984166200044286620001de565b60005b828110156200046c5784890151825560018201915060208501945060208101905062000445565b868310156200048c578489015162000488601f8916826200037c565b8355505b6001600288020188555050505b505050505050565b615d1480620004b16000396000f3fe60806040526004361061014b5760003560e01c80637e51b811116100b6578063cf2753cf1161006f578063cf2753cf146104a8578063ec9485df146104e6578063f40a214614610523578063f5714e641461054c578063f700dbd214610568578063f732b065146105915761014b565b80637e51b811146103965780638939e783146103bf5780638edb3f8b146103e85780639eab671114610404578063af9a90b21461042d578063b13d42421461046a5761014b565b806355dc4b221161010857806355dc4b2214610283578063570467ac146102ac5780635e269bfe146102e957806360deaa2a1461031257806361bc221a1461032e57806368ac3df3146103595761014b565b80630a4433e2146101505780631904bb2e1461017957806319b16c4c146101b657806331bcbcb3146101f45780633566cb951461021d578063455b855114610246575b600080fd5b34801561015c57600080fd5b50610177600480360381019061017291906123d4565b6105cf565b005b34801561018557600080fd5b506101a0600480360381019061019b9190612448565b61069e565b6040516101ad91906126bf565b60405180910390f35b3480156101c257600080fd5b506101dd60048036038101906101d89190612811565b61072e565b6040516101eb9291906128e8565b60405180910390f35b34801561020057600080fd5b5061021b60048036038101906102169190612918565b610c2d565b005b34801561022957600080fd5b50610244600480360381019061023f9190612987565b610eba565b005b34801561025257600080fd5b5061026d600480360381019061026891906129e3565b611022565b60405161027a9190612bea565b60405180910390f35b34801561028f57600080fd5b506102aa60048036038101906102a59190612c0c565b6110b5565b005b3480156102b857600080fd5b506102d360048036038101906102ce9190612811565b6114a7565b6040516102e09190612e27565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190612e49565b61153d565b005b61032c60048036038101906103279190612ecc565b6115c8565b005b34801561033a57600080fd5b50610343611716565b6040516103509190612f15565b60405180910390f35b34801561036557600080fd5b50610380600480360381019061037b9190612f73565b61171c565b60405161038d9190613048565b60405180910390f35b3480156103a257600080fd5b506103bd60048036038101906103b89190612918565b6117b2565b005b3480156103cb57600080fd5b506103e660048036038101906103e19190612918565b61183a565b005b61040260048036038101906103fd9190612ecc565b6118c2565b005b34801561041057600080fd5b5061042b60048036038101906104269190613063565b611a57565b005b34801561043957600080fd5b50610454600480360381019061044f9190613138565b611ae2565b6040516104619190613048565b60405180910390f35b34801561047657600080fd5b50610491600480360381019061048c91906131da565b611b72565b60405161049f9291906134a3565b60405180910390f35b3480156104b457600080fd5b506104cf60048036038101906104ca91906129e3565b611c0a565b6040516104dd9291906128e8565b60405180910390f35b3480156104f257600080fd5b5061050d600480360381019061050891906129e3565b611ca2565b60405161051a9190612f15565b60405180910390f35b34801561052f57600080fd5b5061054a600480360381019061054591906134da565b611d2c565b005b61056660048036038101906105619190612ecc565b611f08565b005b34801561057457600080fd5b5061058f600480360381019061058a919061355d565b612062565b005b34801561059d57600080fd5b506105b860048036038101906105b39190613768565b61212e565b6040516105c6929190613a7f565b60405180910390f35b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895868487876040518563ffffffff1660e01b81526004016106129493929190613c18565b6020604051808303816000875af1158015610631573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106559190613c6d565b905080610697576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068e90613d1d565b60405180910390fd5b5050505050565b6106a66121cc565b61080073ffffffffffffffffffffffffffffffffffffffff1663223b3b7a836040518263ffffffff1660e01b81526004016106e19190613d3d565b600060405180830381865afa1580156106fe573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906107279190613f8e565b9050919050565b6000610738612240565b6000610800905060008686604051602401610754929190614010565b6040516020818303038152906040527f241774e6000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000856040516020016107e6919061407c565b60405160208183030381529060405280519060200120905060405160200161080d906140df565b6040516020818303038152906040528051906020012081036108f9576000808473ffffffffffffffffffffffffffffffffffffffff16846040516108519190614130565b600060405180830381855af49150503d806000811461088c576040519150601f19603f3d011682016040523d82523d6000602084013e610891565b606091505b5091509150816108d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cd906141b9565b60405180910390fd5b808060200190518101906108ea9190614245565b80975081985050505050610c22565b604051602001610908906142ed565b6040516020818303038152906040528051906020012081036109f4576000808473ffffffffffffffffffffffffffffffffffffffff168460405161094c9190614130565b600060405180830381855afa9150503d8060008114610987576040519150601f19603f3d011682016040523d82523d6000602084013e61098c565b606091505b5091509150816109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c89061434e565b60405180910390fd5b808060200190518101906109e59190614245565b80975081985050505050610c21565b604051602001610a03906143ba565b604051602081830303815290604052805190602001208103610af1576000808473ffffffffffffffffffffffffffffffffffffffff1684604051610a479190614130565b6000604051808303816000865af19150503d8060008114610a84576040519150601f19603f3d011682016040523d82523d6000602084013e610a89565b606091505b509150915081610ace576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac59061441b565b60405180910390fd5b80806020019051810190610ae29190614245565b80975081985050505050610c20565b604051602001610b0090614487565b604051602081830303815290604052805190602001208103610be45760006040518060400160405280601a81526020017f64656c65676174696f6e28616464726573732c737472696e6729000000000000815250805190602001209050600060a490506060600060208b01516020808d0101516040518681528e6004820152604060248201526033604482015282606482015281608482015260c081878360008e5af281519c5060608201519450610100820160405280610bc057600080fd5b50505050604051806040016040528083815260200182815250975050505050610c1f565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c16906144e8565b60405180910390fd5b5b5b5b505050935093915050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610c6f939291906146b6565b6020604051808303816000875af1158015610c8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb29190613c6d565b905080610cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ceb90614740565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff163384604051602401610d20929190614760565b6040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610daa9190614130565b6000604051808303816000865af19150503d8060008114610de7576040519150601f19603f3d011682016040523d82523d6000602084013e610dec565b606091505b5050905080610e30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e27906147d5565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3386866040518463ffffffff1660e01b8152600401610e6f939291906147f5565b6020604051808303816000875af1158015610e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb29190613c6d565b505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610efc939291906146b6565b6020604051808303816000875af1158015610f1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3f9190613c6d565b905080610f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f789061487f565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3085856040518463ffffffff1660e01b8152600401610fc0939291906147f5565b6020604051808303816000875af1158015610fdf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110039190613c6d565b50600160008082825461101691906148ce565b92505081905550505050565b61102a61225a565b61080073ffffffffffffffffffffffffffffffffffffffff1663a03ffee184846040518363ffffffff1660e01b8152600401611067929190614010565b600060405180830381865afa158015611084573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110ad9190614b32565b905092915050565b6000610800905060008585856040516024016110d3939291906147f5565b6040516020818303038152906040527f3edab33c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600083604051602001611165919061407c565b60405160208183030381529060405280519060200120905060405160200161118c906140df565b6040516020818303038152906040528051906020012081036112595760008373ffffffffffffffffffffffffffffffffffffffff16836040516111cf9190614130565b600060405180830381855af49150503d806000811461120a576040519150601f19603f3d011682016040523d82523d6000602084013e61120f565b606091505b5050905080611253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124a906141b9565b60405180910390fd5b5061149e565b604051602001611268906142ed565b6040516020818303038152906040528051906020012081036113355760008373ffffffffffffffffffffffffffffffffffffffff16836040516112ab9190614130565b600060405180830381855afa9150503d80600081146112e6576040519150601f19603f3d011682016040523d82523d6000602084013e6112eb565b606091505b505090508061132f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113269061434e565b60405180910390fd5b5061149d565b604051602001611344906143ba565b6040516020818303038152906040528051906020012081036114135760008373ffffffffffffffffffffffffffffffffffffffff16836040516113879190614130565b6000604051808303816000865af19150503d80600081146113c4576040519150601f19603f3d011682016040523d82523d6000602084013e6113c9565b606091505b505090508061140d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114049061441b565b60405180910390fd5b5061149c565b60405160200161142290614487565b6040516020818303038152906040528051906020012081036114605760208201825160008082846000895af28061145857600080fd5b50505061149b565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611492906144e8565b60405180910390fd5b5b5b5b50505050505050565b6114af61227b565b61080073ffffffffffffffffffffffffffffffffffffffff16637d9f939c8585856040518463ffffffff1660e01b81526004016114ee93929190614b7b565b600060405180830381865afa15801561150b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906115349190614de3565b90509392505050565b61080073ffffffffffffffffffffffffffffffffffffffff166312d58dfe858585856040518563ffffffff1660e01b815260040161157e9493929190614e2c565b6020604051808303816000875af115801561159d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c19190613c6d565b5050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895303460016040518463ffffffff1660e01b815260040161160a939291906146b6565b6020604051808303816000875af1158015611629573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164d9190613c6d565b90508061168f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168690614ec4565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b81526004016116ce939291906147f5565b6020604051808303816000875af11580156116ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117119190613c6d565b505050565b60005481565b600061080073ffffffffffffffffffffffffffffffffffffffff1663f7cd55168888888888886040518763ffffffff1660e01b815260040161176396959493929190615019565b6020604051808303816000875af1158015611782573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a69190613c6d565b90509695505050505050565b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c8484846040518463ffffffff1660e01b81526004016117f1939291906147f5565b6020604051808303816000875af1158015611810573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118349190615089565b50505050565b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb8484846040518463ffffffff1660e01b8152600401611879939291906147f5565b6020604051808303816000875af1158015611898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bc9190613c6d565b50505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b8152600401611904939291906146b6565b6020604051808303816000875af1158015611923573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119479190613c6d565b905080611989576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198090614ec4565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b81526004016119c8939291906147f5565b6020604051808303816000875af11580156119e7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0b9190613c6d565b503373ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611a52573d6000803e3d6000fd5b505050565b61080073ffffffffffffffffffffffffffffffffffffffff166354b826f5858585856040518563ffffffff1660e01b8152600401611a9894939291906150b6565b6020604051808303816000875af1158015611ab7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611adb9190615089565b5050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663a50f05ac868686866040518563ffffffff1660e01b8152600401611b259493929190615118565b6020604051808303816000875af1158015611b44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b689190613c6d565b9050949350505050565b6060611b7c6122a3565b61080073ffffffffffffffffffffffffffffffffffffffff1663186b216785856040518363ffffffff1660e01b8152600401611bb99291906152c2565b600060405180830381865afa158015611bd6573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611bff91906154b6565b915091509250929050565b6000611c14612240565b61080073ffffffffffffffffffffffffffffffffffffffff1663241774e685856040518363ffffffff1660e01b8152600401611c51929190614010565b600060405180830381865afa158015611c6e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611c979190614245565b915091509250929050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663fc08930c8433856040518463ffffffff1660e01b8152600401611ce39392919061552e565b602060405180830381865afa158015611d00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d24919061556c565b905092915050565b6000600167ffffffffffffffff811115611d4957611d486126e6565b5b604051908082528060200260200182016040528015611d7c57816020015b6060815260200190600190039081611d675790505b509050604051806060016040528060258152602001615cba6025913981600081518110611dac57611dab615599565b5b6020026020010181905250600061080073ffffffffffffffffffffffffffffffffffffffff1663b60398958787856040518463ffffffff1660e01b8152600401611df893929190615679565b6020604051808303816000875af1158015611e17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3b9190613c6d565b905080611e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7490615729565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c3285876040518463ffffffff1660e01b8152600401611ebc939291906147f5565b6020604051808303816000875af1158015611edb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eff9190615089565b50505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b8152600401611f4a939291906146b6565b6020604051808303816000875af1158015611f69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8d9190613c6d565b905080611fcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc690614ec4565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084600134611ffc91906148ce565b6040518463ffffffff1660e01b815260040161201a939291906147f5565b6020604051808303816000875af1158015612039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205d9190613c6d565b505050565b600061080073ffffffffffffffffffffffffffffffffffffffff166361dc5c3b8585856040518463ffffffff1660e01b81526004016120a393929190615749565b6020604051808303816000875af11580156120c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e69190613c6d565b905080612128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211f906157ed565b60405180910390fd5b50505050565b60606121386122a3565b61080073ffffffffffffffffffffffffffffffffffffffff166310a2851c878787876040518563ffffffff1660e01b81526004016121799493929190615883565b600060405180830381865afa158015612196573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906121bf9190615c41565b9150915094509492505050565b60405180610160016040528060608152602001606081526020016000151581526020016000600381111561220357612202612520565b5b8152602001600081526020016000815260200160608152602001600060070b8152602001600060070b815260200160008152602001600081525090565b604051806040016040528060608152602001600081525090565b60405180606001604052806060815260200160608152602001606081525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612306826122db565b9050919050565b612316816122fb565b811461232157600080fd5b50565b6000813590506123338161230d565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261235e5761235d612339565b5b8235905067ffffffffffffffff81111561237b5761237a61233e565b5b60208301915083602082028301111561239757612396612343565b5b9250929050565b6000819050919050565b6123b18161239e565b81146123bc57600080fd5b50565b6000813590506123ce816123a8565b92915050565b600080600080606085870312156123ee576123ed6122d1565b5b60006123fc87828801612324565b945050602085013567ffffffffffffffff81111561241d5761241c6122d6565b5b61242987828801612348565b9350935050604061243c878288016123bf565b91505092959194509250565b60006020828403121561245e5761245d6122d1565b5b600061246c84828501612324565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156124af578082015181840152602081019050612494565b60008484015250505050565b6000601f19601f8301169050919050565b60006124d782612475565b6124e18185612480565b93506124f1818560208601612491565b6124fa816124bb565b840191505092915050565b60008115159050919050565b61251a81612505565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106125605761255f612520565b5b50565b60008190506125718261254f565b919050565b600061258182612563565b9050919050565b61259181612576565b82525050565b6125a08161239e565b82525050565b60008160070b9050919050565b6125bc816125a6565b82525050565b60006101608301600083015184820360008601526125e082826124cc565b915050602083015184820360208601526125fa82826124cc565b915050604083015161260f6040860182612511565b5060608301516126226060860182612588565b5060808301516126356080860182612597565b5060a083015161264860a0860182612597565b5060c083015184820360c086015261266082826124cc565b91505060e083015161267560e08601826125b3565b5061010083015161268a6101008601826125b3565b5061012083015161269f610120860182612597565b506101408301516126b4610140860182612597565b508091505092915050565b600060208201905081810360008301526126d981846125c2565b905092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61271e826124bb565b810181811067ffffffffffffffff8211171561273d5761273c6126e6565b5b80604052505050565b60006127506122c7565b905061275c8282612715565b919050565b600067ffffffffffffffff82111561277c5761277b6126e6565b5b612785826124bb565b9050602081019050919050565b82818337600083830152505050565b60006127b46127af84612761565b612746565b9050828152602081018484840111156127d0576127cf6126e1565b5b6127db848285612792565b509392505050565b600082601f8301126127f8576127f7612339565b5b81356128088482602086016127a1565b91505092915050565b60008060006060848603121561282a576128296122d1565b5b600061283886828701612324565b935050602084013567ffffffffffffffff811115612859576128586122d6565b5b612865868287016127e3565b925050604084013567ffffffffffffffff811115612886576128856122d6565b5b612892868287016127e3565b9150509250925092565b6128a58161239e565b82525050565b600060408301600083015184820360008601526128c882826124cc565b91505060208301516128dd6020860182612597565b508091505092915050565b60006040820190506128fd600083018561289c565b818103602083015261290f81846128ab565b90509392505050565b600080600060608486031215612931576129306122d1565b5b600061293f86828701612324565b935050602084013567ffffffffffffffff8111156129605761295f6122d6565b5b61296c868287016127e3565b925050604061297d868287016123bf565b9150509250925092565b6000806040838503121561299e5761299d6122d1565b5b600083013567ffffffffffffffff8111156129bc576129bb6122d6565b5b6129c8858286016127e3565b92505060206129d9858286016123bf565b9150509250929050565b600080604083850312156129fa576129f96122d1565b5b6000612a0885828601612324565b925050602083013567ffffffffffffffff811115612a2957612a286122d6565b5b612a35858286016127e3565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600067ffffffffffffffff82169050919050565b612a8881612a6b565b82525050565b60c082016000820151612aa460008501826125b3565b506020820151612ab760208501826125b3565b506040820151612aca6040850182612597565b506060820151612add6060850182612597565b506080820151612af06080850182612a7f565b5060a0820151612b0360a08501826125b3565b50505050565b6000612b158383612a8e565b60c08301905092915050565b6000602082019050919050565b6000612b3982612a3f565b612b438185612a4a565b9350612b4e83612a5b565b8060005b83811015612b7f578151612b668882612b09565b9750612b7183612b21565b925050600181019050612b52565b5085935050505092915050565b60006060830160008301518482036000860152612ba982826124cc565b91505060208301518482036020860152612bc382826124cc565b91505060408301518482036040860152612bdd8282612b2e565b9150508091505092915050565b60006020820190508181036000830152612c048184612b8c565b905092915050565b60008060008060808587031215612c2657612c256122d1565b5b6000612c3487828801612324565b945050602085013567ffffffffffffffff811115612c5557612c546122d6565b5b612c61878288016127e3565b9350506040612c72878288016123bf565b925050606085013567ffffffffffffffff811115612c9357612c926122d6565b5b612c9f878288016127e3565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b608082016000820151612ced60008501826125b3565b506020820151612d0060208501826125b3565b506040820151612d136040850182612597565b506060820151612d266060850182612597565b50505050565b6000612d388383612cd7565b60808301905092915050565b6000602082019050919050565b6000612d5c82612cab565b612d668185612cb6565b9350612d7183612cc7565b8060005b83811015612da2578151612d898882612d2c565b9750612d9483612d44565b925050600181019050612d75565b5085935050505092915050565b60006080830160008301518482036000860152612dcc82826124cc565b91505060208301518482036020860152612de682826124cc565b91505060408301518482036040860152612e0082826124cc565b91505060608301518482036060860152612e1a8282612d51565b9150508091505092915050565b60006020820190508181036000830152612e418184612daf565b905092915050565b60008060008060808587031215612e6357612e626122d1565b5b6000612e7187828801612324565b945050602085013567ffffffffffffffff811115612e9257612e916122d6565b5b612e9e878288016127e3565b9350506040612eaf878288016123bf565b9250506060612ec0878288016123bf565b91505092959194509250565b600060208284031215612ee257612ee16122d1565b5b600082013567ffffffffffffffff811115612f0057612eff6122d6565b5b612f0c848285016127e3565b91505092915050565b6000602082019050612f2a600083018461289c565b92915050565b600080fd5b600060a08284031215612f4b57612f4a612f30565b5b81905092915050565b600060608284031215612f6a57612f69612f30565b5b81905092915050565b6000806000806000806101008789031215612f9157612f906122d1565b5b600087013567ffffffffffffffff811115612faf57612fae6122d6565b5b612fbb89828a01612f35565b9650506020612fcc89828a01612f54565b9550506080612fdd89828a016123bf565b94505060a0612fee89828a01612324565b93505060c087013567ffffffffffffffff81111561300f5761300e6122d6565b5b61301b89828a016127e3565b92505060e061302c89828a016123bf565b9150509295509295509295565b61304281612505565b82525050565b600060208201905061305d6000830184613039565b92915050565b6000806000806080858703121561307d5761307c6122d1565b5b600061308b87828801612324565b945050602085013567ffffffffffffffff8111156130ac576130ab6122d6565b5b6130b8878288016127e3565b935050604085013567ffffffffffffffff8111156130d9576130d86122d6565b5b6130e5878288016127e3565b92505060606130f6878288016123bf565b91505092959194509250565b6000819050919050565b61311581613102565b811461312057600080fd5b50565b6000813590506131328161310c565b92915050565b60008060008060808587031215613152576131516122d1565b5b600085013567ffffffffffffffff8111156131705761316f6122d6565b5b61317c87828801612f35565b945050602061318d87828801612324565b935050604061319e87828801613123565b92505060606131af87828801613123565b91505092959194509250565b600060a082840312156131d1576131d0612f30565b5b81905092915050565b600080604083850312156131f1576131f06122d1565b5b600083013567ffffffffffffffff81111561320f5761320e6122d6565b5b61321b858286016127e3565b925050602083013567ffffffffffffffff81111561323c5761323b6122d6565b5b613248858286016131bb565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061016083016000830151848203600086015261329c82826124cc565b915050602083015184820360208601526132b682826124cc565b91505060408301516132cb6040860182612511565b5060608301516132de6060860182612588565b5060808301516132f16080860182612597565b5060a083015161330460a0860182612597565b5060c083015184820360c086015261331c82826124cc565b91505060e083015161333160e08601826125b3565b506101008301516133466101008601826125b3565b5061012083015161335b610120860182612597565b50610140830151613370610140860182612597565b508091505092915050565b6000613387838361327e565b905092915050565b6000602082019050919050565b60006133a782613252565b6133b1818561325d565b9350836020820285016133c38561326e565b8060005b858110156133ff57848403895281516133e0858261337b565b94506133eb8361338f565b925060208a019950506001810190506133c7565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b600061343882613411565b613442818561341c565b9350613452818560208601612491565b61345b816124bb565b840191505092915050565b60006040830160008301518482036000860152613483828261342d565b91505060208301516134986020860182612a7f565b508091505092915050565b600060408201905081810360008301526134bd818561339c565b905081810360208301526134d18184613466565b90509392505050565b600080600080608085870312156134f4576134f36122d1565b5b600061350287828801612324565b9450506020613513878288016123bf565b9350506040613524878288016123bf565b925050606085013567ffffffffffffffff811115613545576135446122d6565b5b613551878288016127e3565b91505092959194509250565b600080600060408486031215613576576135756122d1565b5b600061358486828701612324565b935050602084013567ffffffffffffffff8111156135a5576135a46122d6565b5b6135b186828701612348565b92509250509250925092565b600080fd5b600080fd5b600067ffffffffffffffff8211156135e2576135e16126e6565b5b6135eb826124bb565b9050602081019050919050565b600061360b613606846135c7565b612746565b905082815260208101848484011115613627576136266126e1565b5b613632848285612792565b509392505050565b600082601f83011261364f5761364e612339565b5b813561365f8482602086016135f8565b91505092915050565b61367181612a6b565b811461367c57600080fd5b50565b60008135905061368e81613668565b92915050565b61369d81612505565b81146136a857600080fd5b50565b6000813590506136ba81613694565b92915050565b600060a082840312156136d6576136d56135bd565b5b6136e060a0612746565b9050600082013567ffffffffffffffff811115613700576136ff6135c2565b5b61370c8482850161363a565b60008301525060206137208482850161367f565b60208301525060406137348482850161367f565b6040830152506060613748848285016136ab565b606083015250608061375c848285016136ab565b60808301525092915050565b60008060008060808587031215613782576137816122d1565b5b600061379087828801612324565b945050602085013567ffffffffffffffff8111156137b1576137b06122d6565b5b6137bd878288016127e3565b935050604085013567ffffffffffffffff8111156137de576137dd6122d6565b5b6137ea878288016127e3565b925050606085013567ffffffffffffffff81111561380b5761380a6122d6565b5b613817878288016136c0565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000608083016000830151848203600086015261386c82826124cc565b9150506020830151848203602086015261388682826124cc565b915050604083015184820360408601526138a082826124cc565b915050606083015184820360608601526138ba8282612d51565b9150508091505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60a0820160008201516139096000850182612cd7565b50602082015161391c6080850182612597565b50505050565b600061392e83836138f3565b60a08301905092915050565b6000602082019050919050565b6000613952826138c7565b61395c81856138d2565b9350613967836138e3565b8060005b8381101561399857815161397f8882613922565b975061398a8361393a565b92505060018101905061396b565b5085935050505092915050565b600060408301600083015184820360008601526139c2828261384f565b915050602083015184820360208601526139dc8282613947565b9150508091505092915050565b60006139f583836139a5565b905092915050565b6000602082019050919050565b6000613a1582613823565b613a1f818561382e565b935083602082028501613a318561383f565b8060005b85811015613a6d5784840389528151613a4e85826139e9565b9450613a59836139fd565b925060208a01995050600181019050613a35565b50829750879550505050505092915050565b60006040820190508181036000830152613a998185613a0a565b90508181036020830152613aad8184613466565b90509392505050565b613abf816122fb565b82525050565b600082825260208201905092915050565b6000819050919050565b6000613aec8385612480565b9350613af9838584612792565b613b02836124bb565b840190509392505050565b6000613b1a848484613ae0565b90509392505050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112613b4f57613b4e613b2d565b5b83810192508235915060208301925067ffffffffffffffff821115613b7757613b76613b23565b5b600182023603831315613b8d57613b8c613b28565b5b509250929050565b6000602082019050919050565b6000613bae8385613ac5565b935083602084028501613bc084613ad6565b8060005b87811015613c06578484038952613bdb8284613b32565b613be6868284613b0d565b9550613bf184613b95565b935060208b019a505050600181019050613bc4565b50829750879450505050509392505050565b6000606082019050613c2d6000830187613ab6565b613c3a602083018661289c565b8181036040830152613c4d818486613ba2565b905095945050505050565b600081519050613c6781613694565b92915050565b600060208284031215613c8357613c826122d1565b5b6000613c9184828501613c58565b91505092915050565b600082825260208201905092915050565b7f4661696c656420746f20617070726f7665207374616b696e67206d6574686f6460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d07602183613c9a565b9150613d1282613cab565b604082019050919050565b60006020820190508181036000830152613d3681613cfa565b9050919050565b6000602082019050613d526000830184613ab6565b92915050565b6000613d6b613d6684612761565b612746565b905082815260208101848484011115613d8757613d866126e1565b5b613d92848285612491565b509392505050565b600082601f830112613daf57613dae612339565b5b8151613dbf848260208601613d58565b91505092915050565b60048110613dd557600080fd5b50565b600081519050613de781613dc8565b92915050565b600081519050613dfc816123a8565b92915050565b613e0b816125a6565b8114613e1657600080fd5b50565b600081519050613e2881613e02565b92915050565b60006101608284031215613e4557613e446135bd565b5b613e50610160612746565b9050600082015167ffffffffffffffff811115613e7057613e6f6135c2565b5b613e7c84828501613d9a565b600083015250602082015167ffffffffffffffff811115613ea057613e9f6135c2565b5b613eac84828501613d9a565b6020830152506040613ec084828501613c58565b6040830152506060613ed484828501613dd8565b6060830152506080613ee884828501613ded565b60808301525060a0613efc84828501613ded565b60a08301525060c082015167ffffffffffffffff811115613f2057613f1f6135c2565b5b613f2c84828501613d9a565b60c08301525060e0613f4084828501613e19565b60e083015250610100613f5584828501613e19565b61010083015250610120613f6b84828501613ded565b61012083015250610140613f8184828501613ded565b6101408301525092915050565b600060208284031215613fa457613fa36122d1565b5b600082015167ffffffffffffffff811115613fc257613fc16122d6565b5b613fce84828501613e2e565b91505092915050565b6000613fe282612475565b613fec8185613c9a565b9350613ffc818560208601612491565b614005816124bb565b840191505092915050565b60006040820190506140256000830185613ab6565b81810360208301526140378184613fd7565b90509392505050565b600081905092915050565b600061405682612475565b6140608185614040565b9350614070818560208601612491565b80840191505092915050565b6000614088828461404b565b915081905092915050565b7f64656c656761746563616c6c0000000000000000000000000000000000000000600082015250565b60006140c9600c83614040565b91506140d482614093565b600c82019050919050565b60006140ea826140bc565b9150819050919050565b600081905092915050565b600061410a82613411565b61411481856140f4565b9350614124818560208601612491565b80840191505092915050565b600061413c82846140ff565b915081905092915050565b7f6661696c65642064656c656761746563616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b60006141a3602183613c9a565b91506141ae82614147565b604082019050919050565b600060208201905081810360008301526141d281614196565b9050919050565b6000604082840312156141ef576141ee6135bd565b5b6141f96040612746565b9050600082015167ffffffffffffffff811115614219576142186135c2565b5b61422584828501613d9a565b600083015250602061423984828501613ded565b60208301525092915050565b6000806040838503121561425c5761425b6122d1565b5b600061426a85828601613ded565b925050602083015167ffffffffffffffff81111561428b5761428a6122d6565b5b614297858286016141d9565b9150509250929050565b7f73746174696363616c6c00000000000000000000000000000000000000000000600082015250565b60006142d7600a83614040565b91506142e2826142a1565b600a82019050919050565b60006142f8826142ca565b9150819050919050565b7f6661696c65642073746174696363616c6c20746f20707265636f6d70696c6500600082015250565b6000614338601f83613c9a565b915061434382614302565b602082019050919050565b600060208201905081810360008301526143678161432b565b9050919050565b7f63616c6c00000000000000000000000000000000000000000000000000000000600082015250565b60006143a4600483614040565b91506143af8261436e565b600482019050919050565b60006143c582614397565b9150819050919050565b7f6661696c65642063616c6c20746f20707265636f6d70696c6500000000000000600082015250565b6000614405601983613c9a565b9150614410826143cf565b602082019050919050565b60006020820190508181036000830152614434816143f8565b9050919050565b7f63616c6c636f6465000000000000000000000000000000000000000000000000600082015250565b6000614471600883614040565b915061447c8261443b565b600882019050919050565b600061449282614464565b9150819050919050565b7f696e76616c69642063616c6c7479706500000000000000000000000000000000600082015250565b60006144d2601083613c9a565b91506144dd8261449c565b602082019050919050565b60006020820190508181036000830152614501816144c5565b9050919050565b600081549050919050565b60008190508160005260206000209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061456f57607f821691505b60208210810361458257614581614528565b5b50919050565b60008190508160005260206000209050919050565b600081546145aa81614557565b6145b48186612480565b945060018216600081146145cf57600181146145e557614618565b60ff198316865281151560200286019350614618565b6145ee85614588565b60005b83811015614610578154818901526001820191506020810190506145f1565b808801955050505b50505092915050565b600061462d838361459d565b905092915050565b6000600182019050919050565b600061464d82614508565b6146578185613ac5565b93508360208202850161466985614513565b8060005b858110156146a4578484038952816146858582614621565b945061469083614635565b925060208a0199505060018101905061466d565b50829750879550505050505092915050565b60006060820190506146cb6000830186613ab6565b6146d8602083018561289c565b81810360408301526146ea8184614642565b9050949350505050565b7f64656c65676174696f6e20617070726f76616c206661696c6564000000000000600082015250565b600061472a601a83613c9a565b9150614735826146f4565b602082019050919050565b600060208201905081810360008301526147598161471d565b9050919050565b60006040820190506147756000830185613ab6565b614782602083018461289c565b9392505050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b60006147bf600f83613c9a565b91506147ca82614789565b602082019050919050565b600060208201905081810360008301526147ee816147b2565b9050919050565b600060608201905061480a6000830186613ab6565b818103602083015261481c8185613fd7565b905061482b604083018461289c565b949350505050565b7f5374616b696e6720417070726f7665206661696c656400000000000000000000600082015250565b6000614869601683613c9a565b915061487482614833565b602082019050919050565b600060208201905081810360008301526148988161485c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006148d98261239e565b91506148e48361239e565b92508282019050808211156148fc576148fb61489f565b5b92915050565b600067ffffffffffffffff82111561491d5761491c6126e6565b5b602082029050602081019050919050565b60008151905061493d81613668565b92915050565b600060c08284031215614959576149586135bd565b5b61496360c0612746565b9050600061497384828501613e19565b600083015250602061498784828501613e19565b602083015250604061499b84828501613ded565b60408301525060606149af84828501613ded565b60608301525060806149c38482850161492e565b60808301525060a06149d784828501613e19565b60a08301525092915050565b60006149f66149f184614902565b612746565b90508083825260208201905060c08402830185811115614a1957614a18612343565b5b835b81811015614a425780614a2e8882614943565b84526020840193505060c081019050614a1b565b5050509392505050565b600082601f830112614a6157614a60612339565b5b8151614a718482602086016149e3565b91505092915050565b600060608284031215614a9057614a8f6135bd565b5b614a9a6060612746565b9050600082015167ffffffffffffffff811115614aba57614ab96135c2565b5b614ac684828501613d9a565b600083015250602082015167ffffffffffffffff811115614aea57614ae96135c2565b5b614af684828501613d9a565b602083015250604082015167ffffffffffffffff811115614b1a57614b196135c2565b5b614b2684828501614a4c565b60408301525092915050565b600060208284031215614b4857614b476122d1565b5b600082015167ffffffffffffffff811115614b6657614b656122d6565b5b614b7284828501614a7a565b91505092915050565b6000606082019050614b906000830186613ab6565b8181036020830152614ba28185613fd7565b90508181036040830152614bb68184613fd7565b9050949350505050565b600067ffffffffffffffff821115614bdb57614bda6126e6565b5b602082029050602081019050919050565b600060808284031215614c0257614c016135bd565b5b614c0c6080612746565b90506000614c1c84828501613e19565b6000830152506020614c3084828501613e19565b6020830152506040614c4484828501613ded565b6040830152506060614c5884828501613ded565b60608301525092915050565b6000614c77614c7284614bc0565b612746565b90508083825260208201905060808402830185811115614c9a57614c99612343565b5b835b81811015614cc35780614caf8882614bec565b845260208401935050608081019050614c9c565b5050509392505050565b600082601f830112614ce257614ce1612339565b5b8151614cf2848260208601614c64565b91505092915050565b600060808284031215614d1157614d106135bd565b5b614d1b6080612746565b9050600082015167ffffffffffffffff811115614d3b57614d3a6135c2565b5b614d4784828501613d9a565b600083015250602082015167ffffffffffffffff811115614d6b57614d6a6135c2565b5b614d7784828501613d9a565b602083015250604082015167ffffffffffffffff811115614d9b57614d9a6135c2565b5b614da784828501613d9a565b604083015250606082015167ffffffffffffffff811115614dcb57614dca6135c2565b5b614dd784828501614ccd565b60608301525092915050565b600060208284031215614df957614df86122d1565b5b600082015167ffffffffffffffff811115614e1757614e166122d6565b5b614e2384828501614cfb565b91505092915050565b6000608082019050614e416000830187613ab6565b8181036020830152614e538186613fd7565b9050614e62604083018561289c565b614e6f606083018461289c565b95945050505050565b7f44656c656761746520417070726f7665206661696c6564000000000000000000600082015250565b6000614eae601783613c9a565b9150614eb982614e78565b602082019050919050565b60006020820190508181036000830152614edd81614ea1565b9050919050565b600060a08301614ef76000840184613b32565b8583036000870152614f0a838284613ae0565b92505050614f1b6020840184613b32565b8583036020870152614f2e838284613ae0565b92505050614f3f6040840184613b32565b8583036040870152614f52838284613ae0565b92505050614f636060840184613b32565b8583036060870152614f76838284613ae0565b92505050614f876080840184613b32565b8583036080870152614f9a838284613ae0565b925050508091505092915050565b6000614fb760208401846123bf565b905092915050565b60608201614fd06000830183614fa8565b614fdd6000850182612597565b50614feb6020830183614fa8565b614ff86020850182612597565b506150066040830183614fa8565b6150136040850182612597565b50505050565b60006101008201905081810360008301526150348189614ee4565b90506150436020830188614fbf565b615050608083018761289c565b61505d60a0830186613ab6565b81810360c083015261506f8185613fd7565b905061507e60e083018461289c565b979650505050505050565b60006020828403121561509f5761509e6122d1565b5b60006150ad84828501613e19565b91505092915050565b60006080820190506150cb6000830187613ab6565b81810360208301526150dd8186613fd7565b905081810360408301526150f18185613fd7565b9050615100606083018461289c565b95945050505050565b61511281613102565b82525050565b600060808201905081810360008301526151328187614ee4565b90506151416020830186613ab6565b61514e6040830185615109565b61515b6060830184615109565b95945050505050565b6000808335600160200384360303811261518157615180613b2d565b5b83810192508235915060208301925067ffffffffffffffff8211156151a9576151a8613b23565b5b6001820236038313156151bf576151be613b28565b5b509250929050565b60006151d3838561341c565b93506151e0838584612792565b6151e9836124bb565b840190509392505050565b6000615203602084018461367f565b905092915050565b600061521a60208401846136ab565b905092915050565b600060a083016152356000840184615164565b85830360008701526152488382846151c7565b9250505061525960208401846151f4565b6152666020860182612a7f565b5061527460408401846151f4565b6152816040860182612a7f565b5061528f606084018461520b565b61529c6060860182612511565b506152aa608084018461520b565b6152b76080860182612511565b508091505092915050565b600060408201905081810360008301526152dc8185613fd7565b905081810360208301526152f08184615222565b90509392505050565b600067ffffffffffffffff821115615314576153136126e6565b5b602082029050602081019050919050565b6000615338615333846152f9565b612746565b9050808382526020820190506020840283018581111561535b5761535a612343565b5b835b818110156153a257805167ffffffffffffffff8111156153805761537f612339565b5b80860161538d8982613e2e565b8552602085019450505060208101905061535d565b5050509392505050565b600082601f8301126153c1576153c0612339565b5b81516153d1848260208601615325565b91505092915050565b60006153ed6153e8846135c7565b612746565b905082815260208101848484011115615409576154086126e1565b5b615414848285612491565b509392505050565b600082601f83011261543157615430612339565b5b81516154418482602086016153da565b91505092915050565b6000604082840312156154605761545f6135bd565b5b61546a6040612746565b9050600082015167ffffffffffffffff81111561548a576154896135c2565b5b6154968482850161541c565b60008301525060206154aa8482850161492e565b60208301525092915050565b600080604083850312156154cd576154cc6122d1565b5b600083015167ffffffffffffffff8111156154eb576154ea6122d6565b5b6154f7858286016153ac565b925050602083015167ffffffffffffffff811115615518576155176122d6565b5b6155248582860161544a565b9150509250929050565b60006060820190506155436000830186613ab6565b6155506020830185613ab6565b81810360408301526155628184613fd7565b9050949350505050565b600060208284031215615582576155816122d1565b5b600061559084828501613ded565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b6000819050602082019050919050565b60006155ef83836124cc565b905092915050565b6000602082019050919050565b600061560f826155c8565b6156198185613ac5565b93508360208202850161562b856155d3565b8060005b85811015615667578484038952815161564885826155e3565b9450615653836155f7565b925060208a0199505060018101905061562f565b50829750879550505050505092915050565b600060608201905061568e6000830186613ab6565b61569b602083018561289c565b81810360408301526156ad8184615604565b9050949350505050565b7f6661696c656420746f20617070726f766520756e64656c65676174696f6e206d60008201527f6574686f64000000000000000000000000000000000000000000000000000000602082015250565b6000615713602583613c9a565b915061571e826156b7565b604082019050919050565b6000602082019050818103600083015261574281615706565b9050919050565b600060408201905061575e6000830186613ab6565b8181036020830152615771818486613ba2565b9050949350505050565b7f4661696c656420746f207265766f6b6520617070726f76616c20666f7220737460008201527f616b696e67206d6574686f647300000000000000000000000000000000000000602082015250565b60006157d7602d83613c9a565b91506157e28261577b565b604082019050919050565b60006020820190508181036000830152615806816157ca565b9050919050565b600060a083016000830151848203600086015261582a828261342d565b915050602083015161583f6020860182612a7f565b5060408301516158526040860182612a7f565b5060608301516158656060860182612511565b5060808301516158786080860182612511565b508091505092915050565b60006080820190506158986000830187613ab6565b81810360208301526158aa8186613fd7565b905081810360408301526158be8185613fd7565b905081810360608301526158d2818461580d565b905095945050505050565b600067ffffffffffffffff8211156158f8576158f76126e6565b5b602082029050602081019050919050565b60006080828403121561591f5761591e6135bd565b5b6159296080612746565b9050600082015167ffffffffffffffff811115615949576159486135c2565b5b61595584828501613d9a565b600083015250602082015167ffffffffffffffff811115615979576159786135c2565b5b61598584828501613d9a565b602083015250604082015167ffffffffffffffff8111156159a9576159a86135c2565b5b6159b584828501613d9a565b604083015250606082015167ffffffffffffffff8111156159d9576159d86135c2565b5b6159e584828501614ccd565b60608301525092915050565b600067ffffffffffffffff821115615a0c57615a0b6126e6565b5b602082029050602081019050919050565b600060a08284031215615a3357615a326135bd565b5b615a3d6040612746565b90506000615a4d84828501614bec565b6000830152506080615a6184828501613ded565b60208301525092915050565b6000615a80615a7b846159f1565b612746565b90508083825260208201905060a08402830185811115615aa357615aa2612343565b5b835b81811015615acc5780615ab88882615a1d565b84526020840193505060a081019050615aa5565b5050509392505050565b600082601f830112615aeb57615aea612339565b5b8151615afb848260208601615a6d565b91505092915050565b600060408284031215615b1a57615b196135bd565b5b615b246040612746565b9050600082015167ffffffffffffffff811115615b4457615b436135c2565b5b615b5084828501615909565b600083015250602082015167ffffffffffffffff811115615b7457615b736135c2565b5b615b8084828501615ad6565b60208301525092915050565b6000615b9f615b9a846158dd565b612746565b90508083825260208201905060208402830185811115615bc257615bc1612343565b5b835b81811015615c0957805167ffffffffffffffff811115615be757615be6612339565b5b808601615bf48982615b04565b85526020850194505050602081019050615bc4565b5050509392505050565b600082601f830112615c2857615c27612339565b5b8151615c38848260208601615b8c565b91505092915050565b60008060408385031215615c5857615c576122d1565b5b600083015167ffffffffffffffff811115615c7657615c756122d6565b5b615c8285828601615c13565b925050602083015167ffffffffffffffff811115615ca357615ca26122d6565b5b615caf8582860161544a565b915050925092905056fe2f636f736d6f732e7374616b696e672e763162657461312e4d7367556e64656c6567617465a2646970667358221220869745a83df35e33e4ef5e71f87905ee5baef43e403b5c8fe7ef7c045634645564736f6c634300081300332f636f736d6f732e7374616b696e672e763162657461312e4d736744656c6567617465", + "deployedBytecode": "0x60806040526004361061014b5760003560e01c80637e51b811116100b6578063cf2753cf1161006f578063cf2753cf146104a8578063ec9485df146104e6578063f40a214614610523578063f5714e641461054c578063f700dbd214610568578063f732b065146105915761014b565b80637e51b811146103965780638939e783146103bf5780638edb3f8b146103e85780639eab671114610404578063af9a90b21461042d578063b13d42421461046a5761014b565b806355dc4b221161010857806355dc4b2214610283578063570467ac146102ac5780635e269bfe146102e957806360deaa2a1461031257806361bc221a1461032e57806368ac3df3146103595761014b565b80630a4433e2146101505780631904bb2e1461017957806319b16c4c146101b657806331bcbcb3146101f45780633566cb951461021d578063455b855114610246575b600080fd5b34801561015c57600080fd5b50610177600480360381019061017291906123d4565b6105cf565b005b34801561018557600080fd5b506101a0600480360381019061019b9190612448565b61069e565b6040516101ad91906126bf565b60405180910390f35b3480156101c257600080fd5b506101dd60048036038101906101d89190612811565b61072e565b6040516101eb9291906128e8565b60405180910390f35b34801561020057600080fd5b5061021b60048036038101906102169190612918565b610c2d565b005b34801561022957600080fd5b50610244600480360381019061023f9190612987565b610eba565b005b34801561025257600080fd5b5061026d600480360381019061026891906129e3565b611022565b60405161027a9190612bea565b60405180910390f35b34801561028f57600080fd5b506102aa60048036038101906102a59190612c0c565b6110b5565b005b3480156102b857600080fd5b506102d360048036038101906102ce9190612811565b6114a7565b6040516102e09190612e27565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190612e49565b61153d565b005b61032c60048036038101906103279190612ecc565b6115c8565b005b34801561033a57600080fd5b50610343611716565b6040516103509190612f15565b60405180910390f35b34801561036557600080fd5b50610380600480360381019061037b9190612f73565b61171c565b60405161038d9190613048565b60405180910390f35b3480156103a257600080fd5b506103bd60048036038101906103b89190612918565b6117b2565b005b3480156103cb57600080fd5b506103e660048036038101906103e19190612918565b61183a565b005b61040260048036038101906103fd9190612ecc565b6118c2565b005b34801561041057600080fd5b5061042b60048036038101906104269190613063565b611a57565b005b34801561043957600080fd5b50610454600480360381019061044f9190613138565b611ae2565b6040516104619190613048565b60405180910390f35b34801561047657600080fd5b50610491600480360381019061048c91906131da565b611b72565b60405161049f9291906134a3565b60405180910390f35b3480156104b457600080fd5b506104cf60048036038101906104ca91906129e3565b611c0a565b6040516104dd9291906128e8565b60405180910390f35b3480156104f257600080fd5b5061050d600480360381019061050891906129e3565b611ca2565b60405161051a9190612f15565b60405180910390f35b34801561052f57600080fd5b5061054a600480360381019061054591906134da565b611d2c565b005b61056660048036038101906105619190612ecc565b611f08565b005b34801561057457600080fd5b5061058f600480360381019061058a919061355d565b612062565b005b34801561059d57600080fd5b506105b860048036038101906105b39190613768565b61212e565b6040516105c6929190613a7f565b60405180910390f35b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895868487876040518563ffffffff1660e01b81526004016106129493929190613c18565b6020604051808303816000875af1158015610631573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106559190613c6d565b905080610697576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068e90613d1d565b60405180910390fd5b5050505050565b6106a66121cc565b61080073ffffffffffffffffffffffffffffffffffffffff1663223b3b7a836040518263ffffffff1660e01b81526004016106e19190613d3d565b600060405180830381865afa1580156106fe573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906107279190613f8e565b9050919050565b6000610738612240565b6000610800905060008686604051602401610754929190614010565b6040516020818303038152906040527f241774e6000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000856040516020016107e6919061407c565b60405160208183030381529060405280519060200120905060405160200161080d906140df565b6040516020818303038152906040528051906020012081036108f9576000808473ffffffffffffffffffffffffffffffffffffffff16846040516108519190614130565b600060405180830381855af49150503d806000811461088c576040519150601f19603f3d011682016040523d82523d6000602084013e610891565b606091505b5091509150816108d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cd906141b9565b60405180910390fd5b808060200190518101906108ea9190614245565b80975081985050505050610c22565b604051602001610908906142ed565b6040516020818303038152906040528051906020012081036109f4576000808473ffffffffffffffffffffffffffffffffffffffff168460405161094c9190614130565b600060405180830381855afa9150503d8060008114610987576040519150601f19603f3d011682016040523d82523d6000602084013e61098c565b606091505b5091509150816109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c89061434e565b60405180910390fd5b808060200190518101906109e59190614245565b80975081985050505050610c21565b604051602001610a03906143ba565b604051602081830303815290604052805190602001208103610af1576000808473ffffffffffffffffffffffffffffffffffffffff1684604051610a479190614130565b6000604051808303816000865af19150503d8060008114610a84576040519150601f19603f3d011682016040523d82523d6000602084013e610a89565b606091505b509150915081610ace576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac59061441b565b60405180910390fd5b80806020019051810190610ae29190614245565b80975081985050505050610c20565b604051602001610b0090614487565b604051602081830303815290604052805190602001208103610be45760006040518060400160405280601a81526020017f64656c65676174696f6e28616464726573732c737472696e6729000000000000815250805190602001209050600060a490506060600060208b01516020808d0101516040518681528e6004820152604060248201526033604482015282606482015281608482015260c081878360008e5af281519c5060608201519450610100820160405280610bc057600080fd5b50505050604051806040016040528083815260200182815250975050505050610c1f565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c16906144e8565b60405180910390fd5b5b5b5b505050935093915050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610c6f939291906146b6565b6020604051808303816000875af1158015610c8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb29190613c6d565b905080610cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ceb90614740565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff163384604051602401610d20929190614760565b6040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610daa9190614130565b6000604051808303816000865af19150503d8060008114610de7576040519150601f19603f3d011682016040523d82523d6000602084013e610dec565b606091505b5050905080610e30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e27906147d5565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3386866040518463ffffffff1660e01b8152600401610e6f939291906147f5565b6020604051808303816000875af1158015610e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb29190613c6d565b505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610efc939291906146b6565b6020604051808303816000875af1158015610f1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3f9190613c6d565b905080610f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f789061487f565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3085856040518463ffffffff1660e01b8152600401610fc0939291906147f5565b6020604051808303816000875af1158015610fdf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110039190613c6d565b50600160008082825461101691906148ce565b92505081905550505050565b61102a61225a565b61080073ffffffffffffffffffffffffffffffffffffffff1663a03ffee184846040518363ffffffff1660e01b8152600401611067929190614010565b600060405180830381865afa158015611084573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110ad9190614b32565b905092915050565b6000610800905060008585856040516024016110d3939291906147f5565b6040516020818303038152906040527f3edab33c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600083604051602001611165919061407c565b60405160208183030381529060405280519060200120905060405160200161118c906140df565b6040516020818303038152906040528051906020012081036112595760008373ffffffffffffffffffffffffffffffffffffffff16836040516111cf9190614130565b600060405180830381855af49150503d806000811461120a576040519150601f19603f3d011682016040523d82523d6000602084013e61120f565b606091505b5050905080611253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124a906141b9565b60405180910390fd5b5061149e565b604051602001611268906142ed565b6040516020818303038152906040528051906020012081036113355760008373ffffffffffffffffffffffffffffffffffffffff16836040516112ab9190614130565b600060405180830381855afa9150503d80600081146112e6576040519150601f19603f3d011682016040523d82523d6000602084013e6112eb565b606091505b505090508061132f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113269061434e565b60405180910390fd5b5061149d565b604051602001611344906143ba565b6040516020818303038152906040528051906020012081036114135760008373ffffffffffffffffffffffffffffffffffffffff16836040516113879190614130565b6000604051808303816000865af19150503d80600081146113c4576040519150601f19603f3d011682016040523d82523d6000602084013e6113c9565b606091505b505090508061140d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114049061441b565b60405180910390fd5b5061149c565b60405160200161142290614487565b6040516020818303038152906040528051906020012081036114605760208201825160008082846000895af28061145857600080fd5b50505061149b565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611492906144e8565b60405180910390fd5b5b5b5b50505050505050565b6114af61227b565b61080073ffffffffffffffffffffffffffffffffffffffff16637d9f939c8585856040518463ffffffff1660e01b81526004016114ee93929190614b7b565b600060405180830381865afa15801561150b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906115349190614de3565b90509392505050565b61080073ffffffffffffffffffffffffffffffffffffffff166312d58dfe858585856040518563ffffffff1660e01b815260040161157e9493929190614e2c565b6020604051808303816000875af115801561159d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c19190613c6d565b5050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895303460016040518463ffffffff1660e01b815260040161160a939291906146b6565b6020604051808303816000875af1158015611629573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164d9190613c6d565b90508061168f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168690614ec4565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b81526004016116ce939291906147f5565b6020604051808303816000875af11580156116ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117119190613c6d565b505050565b60005481565b600061080073ffffffffffffffffffffffffffffffffffffffff1663f7cd55168888888888886040518763ffffffff1660e01b815260040161176396959493929190615019565b6020604051808303816000875af1158015611782573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a69190613c6d565b90509695505050505050565b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c8484846040518463ffffffff1660e01b81526004016117f1939291906147f5565b6020604051808303816000875af1158015611810573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118349190615089565b50505050565b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb8484846040518463ffffffff1660e01b8152600401611879939291906147f5565b6020604051808303816000875af1158015611898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bc9190613c6d565b50505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b8152600401611904939291906146b6565b6020604051808303816000875af1158015611923573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119479190613c6d565b905080611989576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198090614ec4565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b81526004016119c8939291906147f5565b6020604051808303816000875af11580156119e7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0b9190613c6d565b503373ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611a52573d6000803e3d6000fd5b505050565b61080073ffffffffffffffffffffffffffffffffffffffff166354b826f5858585856040518563ffffffff1660e01b8152600401611a9894939291906150b6565b6020604051808303816000875af1158015611ab7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611adb9190615089565b5050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663a50f05ac868686866040518563ffffffff1660e01b8152600401611b259493929190615118565b6020604051808303816000875af1158015611b44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b689190613c6d565b9050949350505050565b6060611b7c6122a3565b61080073ffffffffffffffffffffffffffffffffffffffff1663186b216785856040518363ffffffff1660e01b8152600401611bb99291906152c2565b600060405180830381865afa158015611bd6573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611bff91906154b6565b915091509250929050565b6000611c14612240565b61080073ffffffffffffffffffffffffffffffffffffffff1663241774e685856040518363ffffffff1660e01b8152600401611c51929190614010565b600060405180830381865afa158015611c6e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611c979190614245565b915091509250929050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663fc08930c8433856040518463ffffffff1660e01b8152600401611ce39392919061552e565b602060405180830381865afa158015611d00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d24919061556c565b905092915050565b6000600167ffffffffffffffff811115611d4957611d486126e6565b5b604051908082528060200260200182016040528015611d7c57816020015b6060815260200190600190039081611d675790505b509050604051806060016040528060258152602001615cba6025913981600081518110611dac57611dab615599565b5b6020026020010181905250600061080073ffffffffffffffffffffffffffffffffffffffff1663b60398958787856040518463ffffffff1660e01b8152600401611df893929190615679565b6020604051808303816000875af1158015611e17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3b9190613c6d565b905080611e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7490615729565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c3285876040518463ffffffff1660e01b8152600401611ebc939291906147f5565b6020604051808303816000875af1158015611edb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eff9190615089565b50505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b8152600401611f4a939291906146b6565b6020604051808303816000875af1158015611f69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8d9190613c6d565b905080611fcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc690614ec4565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084600134611ffc91906148ce565b6040518463ffffffff1660e01b815260040161201a939291906147f5565b6020604051808303816000875af1158015612039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205d9190613c6d565b505050565b600061080073ffffffffffffffffffffffffffffffffffffffff166361dc5c3b8585856040518463ffffffff1660e01b81526004016120a393929190615749565b6020604051808303816000875af11580156120c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e69190613c6d565b905080612128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211f906157ed565b60405180910390fd5b50505050565b60606121386122a3565b61080073ffffffffffffffffffffffffffffffffffffffff166310a2851c878787876040518563ffffffff1660e01b81526004016121799493929190615883565b600060405180830381865afa158015612196573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906121bf9190615c41565b9150915094509492505050565b60405180610160016040528060608152602001606081526020016000151581526020016000600381111561220357612202612520565b5b8152602001600081526020016000815260200160608152602001600060070b8152602001600060070b815260200160008152602001600081525090565b604051806040016040528060608152602001600081525090565b60405180606001604052806060815260200160608152602001606081525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612306826122db565b9050919050565b612316816122fb565b811461232157600080fd5b50565b6000813590506123338161230d565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261235e5761235d612339565b5b8235905067ffffffffffffffff81111561237b5761237a61233e565b5b60208301915083602082028301111561239757612396612343565b5b9250929050565b6000819050919050565b6123b18161239e565b81146123bc57600080fd5b50565b6000813590506123ce816123a8565b92915050565b600080600080606085870312156123ee576123ed6122d1565b5b60006123fc87828801612324565b945050602085013567ffffffffffffffff81111561241d5761241c6122d6565b5b61242987828801612348565b9350935050604061243c878288016123bf565b91505092959194509250565b60006020828403121561245e5761245d6122d1565b5b600061246c84828501612324565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156124af578082015181840152602081019050612494565b60008484015250505050565b6000601f19601f8301169050919050565b60006124d782612475565b6124e18185612480565b93506124f1818560208601612491565b6124fa816124bb565b840191505092915050565b60008115159050919050565b61251a81612505565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106125605761255f612520565b5b50565b60008190506125718261254f565b919050565b600061258182612563565b9050919050565b61259181612576565b82525050565b6125a08161239e565b82525050565b60008160070b9050919050565b6125bc816125a6565b82525050565b60006101608301600083015184820360008601526125e082826124cc565b915050602083015184820360208601526125fa82826124cc565b915050604083015161260f6040860182612511565b5060608301516126226060860182612588565b5060808301516126356080860182612597565b5060a083015161264860a0860182612597565b5060c083015184820360c086015261266082826124cc565b91505060e083015161267560e08601826125b3565b5061010083015161268a6101008601826125b3565b5061012083015161269f610120860182612597565b506101408301516126b4610140860182612597565b508091505092915050565b600060208201905081810360008301526126d981846125c2565b905092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61271e826124bb565b810181811067ffffffffffffffff8211171561273d5761273c6126e6565b5b80604052505050565b60006127506122c7565b905061275c8282612715565b919050565b600067ffffffffffffffff82111561277c5761277b6126e6565b5b612785826124bb565b9050602081019050919050565b82818337600083830152505050565b60006127b46127af84612761565b612746565b9050828152602081018484840111156127d0576127cf6126e1565b5b6127db848285612792565b509392505050565b600082601f8301126127f8576127f7612339565b5b81356128088482602086016127a1565b91505092915050565b60008060006060848603121561282a576128296122d1565b5b600061283886828701612324565b935050602084013567ffffffffffffffff811115612859576128586122d6565b5b612865868287016127e3565b925050604084013567ffffffffffffffff811115612886576128856122d6565b5b612892868287016127e3565b9150509250925092565b6128a58161239e565b82525050565b600060408301600083015184820360008601526128c882826124cc565b91505060208301516128dd6020860182612597565b508091505092915050565b60006040820190506128fd600083018561289c565b818103602083015261290f81846128ab565b90509392505050565b600080600060608486031215612931576129306122d1565b5b600061293f86828701612324565b935050602084013567ffffffffffffffff8111156129605761295f6122d6565b5b61296c868287016127e3565b925050604061297d868287016123bf565b9150509250925092565b6000806040838503121561299e5761299d6122d1565b5b600083013567ffffffffffffffff8111156129bc576129bb6122d6565b5b6129c8858286016127e3565b92505060206129d9858286016123bf565b9150509250929050565b600080604083850312156129fa576129f96122d1565b5b6000612a0885828601612324565b925050602083013567ffffffffffffffff811115612a2957612a286122d6565b5b612a35858286016127e3565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600067ffffffffffffffff82169050919050565b612a8881612a6b565b82525050565b60c082016000820151612aa460008501826125b3565b506020820151612ab760208501826125b3565b506040820151612aca6040850182612597565b506060820151612add6060850182612597565b506080820151612af06080850182612a7f565b5060a0820151612b0360a08501826125b3565b50505050565b6000612b158383612a8e565b60c08301905092915050565b6000602082019050919050565b6000612b3982612a3f565b612b438185612a4a565b9350612b4e83612a5b565b8060005b83811015612b7f578151612b668882612b09565b9750612b7183612b21565b925050600181019050612b52565b5085935050505092915050565b60006060830160008301518482036000860152612ba982826124cc565b91505060208301518482036020860152612bc382826124cc565b91505060408301518482036040860152612bdd8282612b2e565b9150508091505092915050565b60006020820190508181036000830152612c048184612b8c565b905092915050565b60008060008060808587031215612c2657612c256122d1565b5b6000612c3487828801612324565b945050602085013567ffffffffffffffff811115612c5557612c546122d6565b5b612c61878288016127e3565b9350506040612c72878288016123bf565b925050606085013567ffffffffffffffff811115612c9357612c926122d6565b5b612c9f878288016127e3565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b608082016000820151612ced60008501826125b3565b506020820151612d0060208501826125b3565b506040820151612d136040850182612597565b506060820151612d266060850182612597565b50505050565b6000612d388383612cd7565b60808301905092915050565b6000602082019050919050565b6000612d5c82612cab565b612d668185612cb6565b9350612d7183612cc7565b8060005b83811015612da2578151612d898882612d2c565b9750612d9483612d44565b925050600181019050612d75565b5085935050505092915050565b60006080830160008301518482036000860152612dcc82826124cc565b91505060208301518482036020860152612de682826124cc565b91505060408301518482036040860152612e0082826124cc565b91505060608301518482036060860152612e1a8282612d51565b9150508091505092915050565b60006020820190508181036000830152612e418184612daf565b905092915050565b60008060008060808587031215612e6357612e626122d1565b5b6000612e7187828801612324565b945050602085013567ffffffffffffffff811115612e9257612e916122d6565b5b612e9e878288016127e3565b9350506040612eaf878288016123bf565b9250506060612ec0878288016123bf565b91505092959194509250565b600060208284031215612ee257612ee16122d1565b5b600082013567ffffffffffffffff811115612f0057612eff6122d6565b5b612f0c848285016127e3565b91505092915050565b6000602082019050612f2a600083018461289c565b92915050565b600080fd5b600060a08284031215612f4b57612f4a612f30565b5b81905092915050565b600060608284031215612f6a57612f69612f30565b5b81905092915050565b6000806000806000806101008789031215612f9157612f906122d1565b5b600087013567ffffffffffffffff811115612faf57612fae6122d6565b5b612fbb89828a01612f35565b9650506020612fcc89828a01612f54565b9550506080612fdd89828a016123bf565b94505060a0612fee89828a01612324565b93505060c087013567ffffffffffffffff81111561300f5761300e6122d6565b5b61301b89828a016127e3565b92505060e061302c89828a016123bf565b9150509295509295509295565b61304281612505565b82525050565b600060208201905061305d6000830184613039565b92915050565b6000806000806080858703121561307d5761307c6122d1565b5b600061308b87828801612324565b945050602085013567ffffffffffffffff8111156130ac576130ab6122d6565b5b6130b8878288016127e3565b935050604085013567ffffffffffffffff8111156130d9576130d86122d6565b5b6130e5878288016127e3565b92505060606130f6878288016123bf565b91505092959194509250565b6000819050919050565b61311581613102565b811461312057600080fd5b50565b6000813590506131328161310c565b92915050565b60008060008060808587031215613152576131516122d1565b5b600085013567ffffffffffffffff8111156131705761316f6122d6565b5b61317c87828801612f35565b945050602061318d87828801612324565b935050604061319e87828801613123565b92505060606131af87828801613123565b91505092959194509250565b600060a082840312156131d1576131d0612f30565b5b81905092915050565b600080604083850312156131f1576131f06122d1565b5b600083013567ffffffffffffffff81111561320f5761320e6122d6565b5b61321b858286016127e3565b925050602083013567ffffffffffffffff81111561323c5761323b6122d6565b5b613248858286016131bb565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061016083016000830151848203600086015261329c82826124cc565b915050602083015184820360208601526132b682826124cc565b91505060408301516132cb6040860182612511565b5060608301516132de6060860182612588565b5060808301516132f16080860182612597565b5060a083015161330460a0860182612597565b5060c083015184820360c086015261331c82826124cc565b91505060e083015161333160e08601826125b3565b506101008301516133466101008601826125b3565b5061012083015161335b610120860182612597565b50610140830151613370610140860182612597565b508091505092915050565b6000613387838361327e565b905092915050565b6000602082019050919050565b60006133a782613252565b6133b1818561325d565b9350836020820285016133c38561326e565b8060005b858110156133ff57848403895281516133e0858261337b565b94506133eb8361338f565b925060208a019950506001810190506133c7565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b600061343882613411565b613442818561341c565b9350613452818560208601612491565b61345b816124bb565b840191505092915050565b60006040830160008301518482036000860152613483828261342d565b91505060208301516134986020860182612a7f565b508091505092915050565b600060408201905081810360008301526134bd818561339c565b905081810360208301526134d18184613466565b90509392505050565b600080600080608085870312156134f4576134f36122d1565b5b600061350287828801612324565b9450506020613513878288016123bf565b9350506040613524878288016123bf565b925050606085013567ffffffffffffffff811115613545576135446122d6565b5b613551878288016127e3565b91505092959194509250565b600080600060408486031215613576576135756122d1565b5b600061358486828701612324565b935050602084013567ffffffffffffffff8111156135a5576135a46122d6565b5b6135b186828701612348565b92509250509250925092565b600080fd5b600080fd5b600067ffffffffffffffff8211156135e2576135e16126e6565b5b6135eb826124bb565b9050602081019050919050565b600061360b613606846135c7565b612746565b905082815260208101848484011115613627576136266126e1565b5b613632848285612792565b509392505050565b600082601f83011261364f5761364e612339565b5b813561365f8482602086016135f8565b91505092915050565b61367181612a6b565b811461367c57600080fd5b50565b60008135905061368e81613668565b92915050565b61369d81612505565b81146136a857600080fd5b50565b6000813590506136ba81613694565b92915050565b600060a082840312156136d6576136d56135bd565b5b6136e060a0612746565b9050600082013567ffffffffffffffff811115613700576136ff6135c2565b5b61370c8482850161363a565b60008301525060206137208482850161367f565b60208301525060406137348482850161367f565b6040830152506060613748848285016136ab565b606083015250608061375c848285016136ab565b60808301525092915050565b60008060008060808587031215613782576137816122d1565b5b600061379087828801612324565b945050602085013567ffffffffffffffff8111156137b1576137b06122d6565b5b6137bd878288016127e3565b935050604085013567ffffffffffffffff8111156137de576137dd6122d6565b5b6137ea878288016127e3565b925050606085013567ffffffffffffffff81111561380b5761380a6122d6565b5b613817878288016136c0565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000608083016000830151848203600086015261386c82826124cc565b9150506020830151848203602086015261388682826124cc565b915050604083015184820360408601526138a082826124cc565b915050606083015184820360608601526138ba8282612d51565b9150508091505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60a0820160008201516139096000850182612cd7565b50602082015161391c6080850182612597565b50505050565b600061392e83836138f3565b60a08301905092915050565b6000602082019050919050565b6000613952826138c7565b61395c81856138d2565b9350613967836138e3565b8060005b8381101561399857815161397f8882613922565b975061398a8361393a565b92505060018101905061396b565b5085935050505092915050565b600060408301600083015184820360008601526139c2828261384f565b915050602083015184820360208601526139dc8282613947565b9150508091505092915050565b60006139f583836139a5565b905092915050565b6000602082019050919050565b6000613a1582613823565b613a1f818561382e565b935083602082028501613a318561383f565b8060005b85811015613a6d5784840389528151613a4e85826139e9565b9450613a59836139fd565b925060208a01995050600181019050613a35565b50829750879550505050505092915050565b60006040820190508181036000830152613a998185613a0a565b90508181036020830152613aad8184613466565b90509392505050565b613abf816122fb565b82525050565b600082825260208201905092915050565b6000819050919050565b6000613aec8385612480565b9350613af9838584612792565b613b02836124bb565b840190509392505050565b6000613b1a848484613ae0565b90509392505050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112613b4f57613b4e613b2d565b5b83810192508235915060208301925067ffffffffffffffff821115613b7757613b76613b23565b5b600182023603831315613b8d57613b8c613b28565b5b509250929050565b6000602082019050919050565b6000613bae8385613ac5565b935083602084028501613bc084613ad6565b8060005b87811015613c06578484038952613bdb8284613b32565b613be6868284613b0d565b9550613bf184613b95565b935060208b019a505050600181019050613bc4565b50829750879450505050509392505050565b6000606082019050613c2d6000830187613ab6565b613c3a602083018661289c565b8181036040830152613c4d818486613ba2565b905095945050505050565b600081519050613c6781613694565b92915050565b600060208284031215613c8357613c826122d1565b5b6000613c9184828501613c58565b91505092915050565b600082825260208201905092915050565b7f4661696c656420746f20617070726f7665207374616b696e67206d6574686f6460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d07602183613c9a565b9150613d1282613cab565b604082019050919050565b60006020820190508181036000830152613d3681613cfa565b9050919050565b6000602082019050613d526000830184613ab6565b92915050565b6000613d6b613d6684612761565b612746565b905082815260208101848484011115613d8757613d866126e1565b5b613d92848285612491565b509392505050565b600082601f830112613daf57613dae612339565b5b8151613dbf848260208601613d58565b91505092915050565b60048110613dd557600080fd5b50565b600081519050613de781613dc8565b92915050565b600081519050613dfc816123a8565b92915050565b613e0b816125a6565b8114613e1657600080fd5b50565b600081519050613e2881613e02565b92915050565b60006101608284031215613e4557613e446135bd565b5b613e50610160612746565b9050600082015167ffffffffffffffff811115613e7057613e6f6135c2565b5b613e7c84828501613d9a565b600083015250602082015167ffffffffffffffff811115613ea057613e9f6135c2565b5b613eac84828501613d9a565b6020830152506040613ec084828501613c58565b6040830152506060613ed484828501613dd8565b6060830152506080613ee884828501613ded565b60808301525060a0613efc84828501613ded565b60a08301525060c082015167ffffffffffffffff811115613f2057613f1f6135c2565b5b613f2c84828501613d9a565b60c08301525060e0613f4084828501613e19565b60e083015250610100613f5584828501613e19565b61010083015250610120613f6b84828501613ded565b61012083015250610140613f8184828501613ded565b6101408301525092915050565b600060208284031215613fa457613fa36122d1565b5b600082015167ffffffffffffffff811115613fc257613fc16122d6565b5b613fce84828501613e2e565b91505092915050565b6000613fe282612475565b613fec8185613c9a565b9350613ffc818560208601612491565b614005816124bb565b840191505092915050565b60006040820190506140256000830185613ab6565b81810360208301526140378184613fd7565b90509392505050565b600081905092915050565b600061405682612475565b6140608185614040565b9350614070818560208601612491565b80840191505092915050565b6000614088828461404b565b915081905092915050565b7f64656c656761746563616c6c0000000000000000000000000000000000000000600082015250565b60006140c9600c83614040565b91506140d482614093565b600c82019050919050565b60006140ea826140bc565b9150819050919050565b600081905092915050565b600061410a82613411565b61411481856140f4565b9350614124818560208601612491565b80840191505092915050565b600061413c82846140ff565b915081905092915050565b7f6661696c65642064656c656761746563616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b60006141a3602183613c9a565b91506141ae82614147565b604082019050919050565b600060208201905081810360008301526141d281614196565b9050919050565b6000604082840312156141ef576141ee6135bd565b5b6141f96040612746565b9050600082015167ffffffffffffffff811115614219576142186135c2565b5b61422584828501613d9a565b600083015250602061423984828501613ded565b60208301525092915050565b6000806040838503121561425c5761425b6122d1565b5b600061426a85828601613ded565b925050602083015167ffffffffffffffff81111561428b5761428a6122d6565b5b614297858286016141d9565b9150509250929050565b7f73746174696363616c6c00000000000000000000000000000000000000000000600082015250565b60006142d7600a83614040565b91506142e2826142a1565b600a82019050919050565b60006142f8826142ca565b9150819050919050565b7f6661696c65642073746174696363616c6c20746f20707265636f6d70696c6500600082015250565b6000614338601f83613c9a565b915061434382614302565b602082019050919050565b600060208201905081810360008301526143678161432b565b9050919050565b7f63616c6c00000000000000000000000000000000000000000000000000000000600082015250565b60006143a4600483614040565b91506143af8261436e565b600482019050919050565b60006143c582614397565b9150819050919050565b7f6661696c65642063616c6c20746f20707265636f6d70696c6500000000000000600082015250565b6000614405601983613c9a565b9150614410826143cf565b602082019050919050565b60006020820190508181036000830152614434816143f8565b9050919050565b7f63616c6c636f6465000000000000000000000000000000000000000000000000600082015250565b6000614471600883614040565b915061447c8261443b565b600882019050919050565b600061449282614464565b9150819050919050565b7f696e76616c69642063616c6c7479706500000000000000000000000000000000600082015250565b60006144d2601083613c9a565b91506144dd8261449c565b602082019050919050565b60006020820190508181036000830152614501816144c5565b9050919050565b600081549050919050565b60008190508160005260206000209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061456f57607f821691505b60208210810361458257614581614528565b5b50919050565b60008190508160005260206000209050919050565b600081546145aa81614557565b6145b48186612480565b945060018216600081146145cf57600181146145e557614618565b60ff198316865281151560200286019350614618565b6145ee85614588565b60005b83811015614610578154818901526001820191506020810190506145f1565b808801955050505b50505092915050565b600061462d838361459d565b905092915050565b6000600182019050919050565b600061464d82614508565b6146578185613ac5565b93508360208202850161466985614513565b8060005b858110156146a4578484038952816146858582614621565b945061469083614635565b925060208a0199505060018101905061466d565b50829750879550505050505092915050565b60006060820190506146cb6000830186613ab6565b6146d8602083018561289c565b81810360408301526146ea8184614642565b9050949350505050565b7f64656c65676174696f6e20617070726f76616c206661696c6564000000000000600082015250565b600061472a601a83613c9a565b9150614735826146f4565b602082019050919050565b600060208201905081810360008301526147598161471d565b9050919050565b60006040820190506147756000830185613ab6565b614782602083018461289c565b9392505050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b60006147bf600f83613c9a565b91506147ca82614789565b602082019050919050565b600060208201905081810360008301526147ee816147b2565b9050919050565b600060608201905061480a6000830186613ab6565b818103602083015261481c8185613fd7565b905061482b604083018461289c565b949350505050565b7f5374616b696e6720417070726f7665206661696c656400000000000000000000600082015250565b6000614869601683613c9a565b915061487482614833565b602082019050919050565b600060208201905081810360008301526148988161485c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006148d98261239e565b91506148e48361239e565b92508282019050808211156148fc576148fb61489f565b5b92915050565b600067ffffffffffffffff82111561491d5761491c6126e6565b5b602082029050602081019050919050565b60008151905061493d81613668565b92915050565b600060c08284031215614959576149586135bd565b5b61496360c0612746565b9050600061497384828501613e19565b600083015250602061498784828501613e19565b602083015250604061499b84828501613ded565b60408301525060606149af84828501613ded565b60608301525060806149c38482850161492e565b60808301525060a06149d784828501613e19565b60a08301525092915050565b60006149f66149f184614902565b612746565b90508083825260208201905060c08402830185811115614a1957614a18612343565b5b835b81811015614a425780614a2e8882614943565b84526020840193505060c081019050614a1b565b5050509392505050565b600082601f830112614a6157614a60612339565b5b8151614a718482602086016149e3565b91505092915050565b600060608284031215614a9057614a8f6135bd565b5b614a9a6060612746565b9050600082015167ffffffffffffffff811115614aba57614ab96135c2565b5b614ac684828501613d9a565b600083015250602082015167ffffffffffffffff811115614aea57614ae96135c2565b5b614af684828501613d9a565b602083015250604082015167ffffffffffffffff811115614b1a57614b196135c2565b5b614b2684828501614a4c565b60408301525092915050565b600060208284031215614b4857614b476122d1565b5b600082015167ffffffffffffffff811115614b6657614b656122d6565b5b614b7284828501614a7a565b91505092915050565b6000606082019050614b906000830186613ab6565b8181036020830152614ba28185613fd7565b90508181036040830152614bb68184613fd7565b9050949350505050565b600067ffffffffffffffff821115614bdb57614bda6126e6565b5b602082029050602081019050919050565b600060808284031215614c0257614c016135bd565b5b614c0c6080612746565b90506000614c1c84828501613e19565b6000830152506020614c3084828501613e19565b6020830152506040614c4484828501613ded565b6040830152506060614c5884828501613ded565b60608301525092915050565b6000614c77614c7284614bc0565b612746565b90508083825260208201905060808402830185811115614c9a57614c99612343565b5b835b81811015614cc35780614caf8882614bec565b845260208401935050608081019050614c9c565b5050509392505050565b600082601f830112614ce257614ce1612339565b5b8151614cf2848260208601614c64565b91505092915050565b600060808284031215614d1157614d106135bd565b5b614d1b6080612746565b9050600082015167ffffffffffffffff811115614d3b57614d3a6135c2565b5b614d4784828501613d9a565b600083015250602082015167ffffffffffffffff811115614d6b57614d6a6135c2565b5b614d7784828501613d9a565b602083015250604082015167ffffffffffffffff811115614d9b57614d9a6135c2565b5b614da784828501613d9a565b604083015250606082015167ffffffffffffffff811115614dcb57614dca6135c2565b5b614dd784828501614ccd565b60608301525092915050565b600060208284031215614df957614df86122d1565b5b600082015167ffffffffffffffff811115614e1757614e166122d6565b5b614e2384828501614cfb565b91505092915050565b6000608082019050614e416000830187613ab6565b8181036020830152614e538186613fd7565b9050614e62604083018561289c565b614e6f606083018461289c565b95945050505050565b7f44656c656761746520417070726f7665206661696c6564000000000000000000600082015250565b6000614eae601783613c9a565b9150614eb982614e78565b602082019050919050565b60006020820190508181036000830152614edd81614ea1565b9050919050565b600060a08301614ef76000840184613b32565b8583036000870152614f0a838284613ae0565b92505050614f1b6020840184613b32565b8583036020870152614f2e838284613ae0565b92505050614f3f6040840184613b32565b8583036040870152614f52838284613ae0565b92505050614f636060840184613b32565b8583036060870152614f76838284613ae0565b92505050614f876080840184613b32565b8583036080870152614f9a838284613ae0565b925050508091505092915050565b6000614fb760208401846123bf565b905092915050565b60608201614fd06000830183614fa8565b614fdd6000850182612597565b50614feb6020830183614fa8565b614ff86020850182612597565b506150066040830183614fa8565b6150136040850182612597565b50505050565b60006101008201905081810360008301526150348189614ee4565b90506150436020830188614fbf565b615050608083018761289c565b61505d60a0830186613ab6565b81810360c083015261506f8185613fd7565b905061507e60e083018461289c565b979650505050505050565b60006020828403121561509f5761509e6122d1565b5b60006150ad84828501613e19565b91505092915050565b60006080820190506150cb6000830187613ab6565b81810360208301526150dd8186613fd7565b905081810360408301526150f18185613fd7565b9050615100606083018461289c565b95945050505050565b61511281613102565b82525050565b600060808201905081810360008301526151328187614ee4565b90506151416020830186613ab6565b61514e6040830185615109565b61515b6060830184615109565b95945050505050565b6000808335600160200384360303811261518157615180613b2d565b5b83810192508235915060208301925067ffffffffffffffff8211156151a9576151a8613b23565b5b6001820236038313156151bf576151be613b28565b5b509250929050565b60006151d3838561341c565b93506151e0838584612792565b6151e9836124bb565b840190509392505050565b6000615203602084018461367f565b905092915050565b600061521a60208401846136ab565b905092915050565b600060a083016152356000840184615164565b85830360008701526152488382846151c7565b9250505061525960208401846151f4565b6152666020860182612a7f565b5061527460408401846151f4565b6152816040860182612a7f565b5061528f606084018461520b565b61529c6060860182612511565b506152aa608084018461520b565b6152b76080860182612511565b508091505092915050565b600060408201905081810360008301526152dc8185613fd7565b905081810360208301526152f08184615222565b90509392505050565b600067ffffffffffffffff821115615314576153136126e6565b5b602082029050602081019050919050565b6000615338615333846152f9565b612746565b9050808382526020820190506020840283018581111561535b5761535a612343565b5b835b818110156153a257805167ffffffffffffffff8111156153805761537f612339565b5b80860161538d8982613e2e565b8552602085019450505060208101905061535d565b5050509392505050565b600082601f8301126153c1576153c0612339565b5b81516153d1848260208601615325565b91505092915050565b60006153ed6153e8846135c7565b612746565b905082815260208101848484011115615409576154086126e1565b5b615414848285612491565b509392505050565b600082601f83011261543157615430612339565b5b81516154418482602086016153da565b91505092915050565b6000604082840312156154605761545f6135bd565b5b61546a6040612746565b9050600082015167ffffffffffffffff81111561548a576154896135c2565b5b6154968482850161541c565b60008301525060206154aa8482850161492e565b60208301525092915050565b600080604083850312156154cd576154cc6122d1565b5b600083015167ffffffffffffffff8111156154eb576154ea6122d6565b5b6154f7858286016153ac565b925050602083015167ffffffffffffffff811115615518576155176122d6565b5b6155248582860161544a565b9150509250929050565b60006060820190506155436000830186613ab6565b6155506020830185613ab6565b81810360408301526155628184613fd7565b9050949350505050565b600060208284031215615582576155816122d1565b5b600061559084828501613ded565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b6000819050602082019050919050565b60006155ef83836124cc565b905092915050565b6000602082019050919050565b600061560f826155c8565b6156198185613ac5565b93508360208202850161562b856155d3565b8060005b85811015615667578484038952815161564885826155e3565b9450615653836155f7565b925060208a0199505060018101905061562f565b50829750879550505050505092915050565b600060608201905061568e6000830186613ab6565b61569b602083018561289c565b81810360408301526156ad8184615604565b9050949350505050565b7f6661696c656420746f20617070726f766520756e64656c65676174696f6e206d60008201527f6574686f64000000000000000000000000000000000000000000000000000000602082015250565b6000615713602583613c9a565b915061571e826156b7565b604082019050919050565b6000602082019050818103600083015261574281615706565b9050919050565b600060408201905061575e6000830186613ab6565b8181036020830152615771818486613ba2565b9050949350505050565b7f4661696c656420746f207265766f6b6520617070726f76616c20666f7220737460008201527f616b696e67206d6574686f647300000000000000000000000000000000000000602082015250565b60006157d7602d83613c9a565b91506157e28261577b565b604082019050919050565b60006020820190508181036000830152615806816157ca565b9050919050565b600060a083016000830151848203600086015261582a828261342d565b915050602083015161583f6020860182612a7f565b5060408301516158526040860182612a7f565b5060608301516158656060860182612511565b5060808301516158786080860182612511565b508091505092915050565b60006080820190506158986000830187613ab6565b81810360208301526158aa8186613fd7565b905081810360408301526158be8185613fd7565b905081810360608301526158d2818461580d565b905095945050505050565b600067ffffffffffffffff8211156158f8576158f76126e6565b5b602082029050602081019050919050565b60006080828403121561591f5761591e6135bd565b5b6159296080612746565b9050600082015167ffffffffffffffff811115615949576159486135c2565b5b61595584828501613d9a565b600083015250602082015167ffffffffffffffff811115615979576159786135c2565b5b61598584828501613d9a565b602083015250604082015167ffffffffffffffff8111156159a9576159a86135c2565b5b6159b584828501613d9a565b604083015250606082015167ffffffffffffffff8111156159d9576159d86135c2565b5b6159e584828501614ccd565b60608301525092915050565b600067ffffffffffffffff821115615a0c57615a0b6126e6565b5b602082029050602081019050919050565b600060a08284031215615a3357615a326135bd565b5b615a3d6040612746565b90506000615a4d84828501614bec565b6000830152506080615a6184828501613ded565b60208301525092915050565b6000615a80615a7b846159f1565b612746565b90508083825260208201905060a08402830185811115615aa357615aa2612343565b5b835b81811015615acc5780615ab88882615a1d565b84526020840193505060a081019050615aa5565b5050509392505050565b600082601f830112615aeb57615aea612339565b5b8151615afb848260208601615a6d565b91505092915050565b600060408284031215615b1a57615b196135bd565b5b615b246040612746565b9050600082015167ffffffffffffffff811115615b4457615b436135c2565b5b615b5084828501615909565b600083015250602082015167ffffffffffffffff811115615b7457615b736135c2565b5b615b8084828501615ad6565b60208301525092915050565b6000615b9f615b9a846158dd565b612746565b90508083825260208201905060208402830185811115615bc257615bc1612343565b5b835b81811015615c0957805167ffffffffffffffff811115615be757615be6612339565b5b808601615bf48982615b04565b85526020850194505050602081019050615bc4565b5050509392505050565b600082601f830112615c2857615c27612339565b5b8151615c38848260208601615b8c565b91505092915050565b60008060408385031215615c5857615c576122d1565b5b600083015167ffffffffffffffff811115615c7657615c756122d6565b5b615c8285828601615c13565b925050602083015167ffffffffffffffff811115615ca357615ca26122d6565b5b615caf8582860161544a565b915050925092905056fe2f636f736d6f732e7374616b696e672e763162657461312e4d7367556e64656c6567617465a2646970667358221220869745a83df35e33e4ef5e71f87905ee5baef43e403b5c8fe7ef7c045634645564736f6c63430008130033", "linkReferences": {}, "deployedLinkReferences": {} -} \ No newline at end of file +} diff --git a/precompiles/testutil/contracts/DistributionCaller.json b/precompiles/testutil/contracts/DistributionCaller.json index 74267241f5..fbcdaca501 100644 --- a/precompiles/testutil/contracts/DistributionCaller.json +++ b/precompiles/testutil/contracts/DistributionCaller.json @@ -1,7 +1,7 @@ { "_format": "hh-sol-artifact-1", "contractName": "DistributionCaller", - "sourceName": "contracts/evmos/testutil/contracts/DistributionCaller.sol", + "sourceName": "solidity/precompiles/testutil/contracts/DistributionCaller.sol", "abi": [ { "inputs": [], @@ -702,8 +702,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b506133ae806100206000396000f3fe60806040526004361061012a5760003560e01c806388b2d581116100ab578063c7804bb51161006f578063c7804bb514610489578063cb85aa0a146104c6578063d0e30db014610503578063d3f831be1461050d578063e0421e391461054a578063e236c7a6146105875761012a565b806388b2d58114610357578063963516e41461039557806398194593146103d2578063b2d178831461040f578063b6a216ae1461044c5761012a565b806361bc221a116100f257806361bc221a1461024c5780636f669da41461027757806378a5dfd1146102b4578063796b96d2146102f15780637c9db0bb1461031a5761012a565b806301b680001461012f5780630c05e9e41461016c578063296c60aa146101a95780632d0ee16a146101d257806346e16d341461020f575b600080fd5b34801561013b57600080fd5b506101566004803603810190610151919061147c565b6105c5565b6040516101639190611539565b60405180910390f35b34801561017857600080fd5b50610193600480360381019061018e9190611690565b61070d565b6040516101a091906118d3565b60405180910390f35b3480156101b557600080fd5b506101d060048036038101906101cb91906118f5565b61079d565b005b3480156101de57600080fd5b506101f960048036038101906101f49190611690565b6108de565b6040516102069190611a50565b60405180910390f35b34801561021b57600080fd5b50610236600480360381019061023191906118f5565b61096c565b6040516102439190611a8d565b60405180910390f35b34801561025857600080fd5b506102616109f6565b60405161026e9190611ac4565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190611b1b565b610a07565b6040516102ab9190611a8d565b60405180910390f35b3480156102c057600080fd5b506102db60048036038101906102d691906118f5565b610a91565b6040516102e89190611be1565b60405180910390f35b3480156102fd57600080fd5b50610318600480360381019061031391906118f5565b610b1e565b005b34801561032657600080fd5b50610341600480360381019061033c9190611690565b610c5f565b60405161034e9190611be1565b60405180910390f35b34801561036357600080fd5b5061037e60048036038101906103799190611c67565b610ce9565b60405161038c929190611ea9565b60405180910390f35b3480156103a157600080fd5b506103bc60048036038101906103b79190611690565b610d87565b6040516103c99190611a8d565b60405180910390f35b3480156103de57600080fd5b506103f960048036038101906103f491906118f5565b610e10565b6040516104069190611a50565b60405180910390f35b34801561041b57600080fd5b5061043660048036038101906104319190611ee0565b610e9f565b6040516104439190611a50565b60405180910390f35b34801561045857600080fd5b50610473600480360381019061046e919061147c565b610ff4565b604051610480919061202d565b60405180910390f35b34801561049557600080fd5b506104b060048036038101906104ab919061207b565b61107e565b6040516104bd9190611a8d565b60405180910390f35b3480156104d257600080fd5b506104ed60048036038101906104e8919061147c565b611196565b6040516104fa9190612105565b60405180910390f35b61050b611220565b005b34801561051957600080fd5b50610534600480360381019061052f9190611690565b611222565b6040516105419190611be1565b60405180910390f35b34801561055657600080fd5b50610571600480360381019061056c9190611690565b6112ac565b60405161057e9190611a50565b60405180910390f35b34801561059357600080fd5b506105ae60048036038101906105a9919061147c565b611338565b6040516105bc92919061222d565b60405180910390f35b606060008061080173ffffffffffffffffffffffffffffffffffffffff16846040516024016105f49190612273565b6040516020818303038152906040527f5431f450000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161067e91906122ca565b600060405180830381855afa9150503d80600081146106b9576040519150601f19603f3d011682016040523d82523d6000602084013e6106be565b606091505b509150915081610703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106fa9061232d565b60405180910390fd5b8092505050919050565b6107156113c5565b61080173ffffffffffffffffffffffffffffffffffffffff166354212a89836040518263ffffffff1660e01b81526004016107509190612105565b600060405180830381865afa15801561076d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906107969190612626565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff1683836040516024016107cb92919061266f565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161085591906122ca565b600060405180830381855af49150503d8060008114610890576040519150601f19603f3d011682016040523d82523d6000602084013e610895565b606091505b50509050806108d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d090612711565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6130846040518363ffffffff1660e01b815260040161091d92919061266f565b6000604051808303816000875af115801561093c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610965919061287e565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9684846040518363ffffffff1660e01b81526004016109ab92919061266f565b6020604051808303816000875af11580156109ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ee91906128f3565b905092915050565b60008054906101000a900460070b81565b600061080173ffffffffffffffffffffffffffffffffffffffff16632efe8a5f84846040518363ffffffff1660e01b8152600401610a4692919061292f565b6020604051808303816000875af1158015610a65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8991906128f3565b905092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff16639ad563b484846040518363ffffffff1660e01b8152600401610ad092919061266f565b600060405180830381865afa158015610aed573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610b169190612958565b905092915050565b600061080173ffffffffffffffffffffffffffffffffffffffff168383604051602401610b4c92919061266f565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610bd691906122ca565b600060405180830381855afa9150503d8060008114610c11576040519150601f19603f3d011682016040523d82523d6000602084013e610c16565b606091505b5050905080610c5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c519061232d565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633dd40f78836040518263ffffffff1660e01b8152600401610c9c9190612105565b600060405180830381865afa158015610cb9573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610ce29190612958565b9050919050565b6060610cf36113e6565b61080173ffffffffffffffffffffffffffffffffffffffff16638f2473ce878787876040518563ffffffff1660e01b8152600401610d349493929190612b41565b600060405180830381865afa158015610d51573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610d7a9190612e19565b9150915094509492505050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9630846040518363ffffffff1660e01b8152600401610dc692919061266f565b6020604051808303816000875af1158015610de5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0991906128f3565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6184846040518363ffffffff1660e01b8152600401610e4f92919061266f565b6000604051808303816000875af1158015610e6e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610e97919061287e565b905092915050565b6060600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9633876040518363ffffffff1660e01b8152600401610ee092919061266f565b6020604051808303816000875af1158015610eff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2391906128f3565b905080610f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5c90612edd565b60405180910390fd5b61080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6185856040518363ffffffff1660e01b8152600401610fa292919061266f565b6000604051808303816000875af1158015610fc1573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610fea919061287e565b9150509392505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663a66cb605836040518263ffffffff1660e01b81526004016110319190612273565b600060405180830381865afa15801561104e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110779190612fde565b9050919050565b600060016000808282829054906101000a900460070b61109e9190613056565b92506101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff16021790555061080173ffffffffffffffffffffffffffffffffffffffff1663ed41d0b684846040518363ffffffff1660e01b81526004016111049291906130c5565b6020604051808303816000875af1158015611123573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114791906128f3565b905060016000808282829054906101000a900460070b61116791906130ee565b92506101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff16021790555092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff16635431f450836040518263ffffffff1660e01b81526004016111d39190612273565b600060405180830381865afa1580156111f0573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611219919061314e565b9050919050565b565b606061080173ffffffffffffffffffffffffffffffffffffffff166385b2d2da836040518263ffffffff1660e01b815260040161125f9190612105565b600060405180830381865afa15801561127c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906112a59190612958565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633ce4e3be836040518263ffffffff1660e01b81526004016112e99190612105565b6000604051808303816000875af1158015611308573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611331919061287e565b9050919050565b60608061080173ffffffffffffffffffffffffffffffffffffffff166354be1a28846040518263ffffffff1660e01b81526004016113769190612273565b600060405180830381865afa158015611393573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906113bc9190613300565b91509150915091565b60405180606001604052806060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006114498261141e565b9050919050565b6114598161143e565b811461146457600080fd5b50565b60008135905061147681611450565b92915050565b60006020828403121561149257611491611414565b5b60006114a084828501611467565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156114e35780820151818401526020810190506114c8565b60008484015250505050565b6000601f19601f8301169050919050565b600061150b826114a9565b61151581856114b4565b93506115258185602086016114c5565b61152e816114ef565b840191505092915050565b600060208201905081810360008301526115538184611500565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61159d826114ef565b810181811067ffffffffffffffff821117156115bc576115bb611565565b5b80604052505050565b60006115cf61140a565b90506115db8282611594565b919050565b600067ffffffffffffffff8211156115fb576115fa611565565b5b611604826114ef565b9050602081019050919050565b82818337600083830152505050565b600061163361162e846115e0565b6115c5565b90508281526020810184848401111561164f5761164e611560565b5b61165a848285611611565b509392505050565b600082601f8301126116775761167661155b565b5b8135611687848260208601611620565b91505092915050565b6000602082840312156116a6576116a5611414565b5b600082013567ffffffffffffffff8111156116c4576116c3611419565b5b6116d084828501611662565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000611700826116d9565b61170a81856116e4565b935061171a8185602086016114c5565b611723816114ef565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000819050919050565b61176d8161175a565b82525050565b600060ff82169050919050565b61178981611773565b82525050565b600060608301600083015184820360008601526117ac82826116f5565b91505060208301516117c16020860182611764565b5060408301516117d46040860182611780565b508091505092915050565b60006117eb838361178f565b905092915050565b6000602082019050919050565b600061180b8261172e565b6118158185611739565b9350836020820285016118278561174a565b8060005b85811015611863578484038952815161184485826117df565b945061184f836117f3565b925060208a0199505060018101905061182b565b50829750879550505050505092915050565b6000606083016000830151848203600086015261189282826116f5565b915050602083015184820360208601526118ac8282611800565b915050604083015184820360408601526118c68282611800565b9150508091505092915050565b600060208201905081810360008301526118ed8184611875565b905092915050565b6000806040838503121561190c5761190b611414565b5b600061191a85828601611467565b925050602083013567ffffffffffffffff81111561193b5761193a611419565b5b61194785828601611662565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000604083016000830151848203600086015261199a82826116f5565b91505060208301516119af6020860182611764565b508091505092915050565b60006119c6838361197d565b905092915050565b6000602082019050919050565b60006119e682611951565b6119f0818561195c565b935083602082028501611a028561196d565b8060005b85811015611a3e5784840389528151611a1f85826119ba565b9450611a2a836119ce565b925060208a01995050600181019050611a06565b50829750879550505050505092915050565b60006020820190508181036000830152611a6a81846119db565b905092915050565b60008115159050919050565b611a8781611a72565b82525050565b6000602082019050611aa26000830184611a7e565b92915050565b60008160070b9050919050565b611abe81611aa8565b82525050565b6000602082019050611ad96000830184611ab5565b92915050565b600063ffffffff82169050919050565b611af881611adf565b8114611b0357600080fd5b50565b600081359050611b1581611aef565b92915050565b60008060408385031215611b3257611b31611414565b5b6000611b4085828601611467565b9250506020611b5185828601611b06565b9150509250929050565b600082825260208201905092915050565b6000611b778261172e565b611b818185611b5b565b935083602082028501611b938561174a565b8060005b85811015611bcf5784840389528151611bb085826117df565b9450611bbb836117f3565b925060208a01995050600181019050611b97565b50829750879550505050505092915050565b60006020820190508181036000830152611bfb8184611b6c565b905092915050565b600067ffffffffffffffff82169050919050565b611c2081611c03565b8114611c2b57600080fd5b50565b600081359050611c3d81611c17565b92915050565b600080fd5b600060a08284031215611c5e57611c5d611c43565b5b81905092915050565b60008060008060808587031215611c8157611c80611414565b5b600085013567ffffffffffffffff811115611c9f57611c9e611419565b5b611cab87828801611662565b9450506020611cbc87828801611c2e565b9350506040611ccd87828801611c2e565b925050606085013567ffffffffffffffff811115611cee57611ced611419565b5b611cfa87828801611c48565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611d3b81611c03565b82525050565b604082016000820151611d576000850182611764565b506020820151611d6a6020850182611780565b50505050565b606082016000820151611d866000850182611d32565b506020820151611d996020850182611d41565b50505050565b6000611dab8383611d70565b60608301905092915050565b6000602082019050919050565b6000611dcf82611d06565b611dd98185611d11565b9350611de483611d22565b8060005b83811015611e15578151611dfc8882611d9f565b9750611e0783611db7565b925050600181019050611de8565b5085935050505092915050565b600082825260208201905092915050565b6000611e3e826114a9565b611e488185611e22565b9350611e588185602086016114c5565b611e61816114ef565b840191505092915050565b60006040830160008301518482036000860152611e898282611e33565b9150506020830151611e9e6020860182611d32565b508091505092915050565b60006040820190508181036000830152611ec38185611dc4565b90508181036020830152611ed78184611e6c565b90509392505050565b600080600060608486031215611ef957611ef8611414565b5b600084013567ffffffffffffffff811115611f1757611f16611419565b5b611f2386828701611662565b9350506020611f3486828701611467565b925050604084013567ffffffffffffffff811115611f5557611f54611419565b5b611f6186828701611662565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000611fa383836116f5565b905092915050565b6000602082019050919050565b6000611fc382611f6b565b611fcd8185611f76565b935083602082028501611fdf85611f87565b8060005b8581101561201b5784840389528151611ffc8582611f97565b945061200783611fab565b925060208a01995050600181019050611fe3565b50829750879550505050505092915050565b600060208201905081810360008301526120478184611fb8565b905092915050565b6120588161175a565b811461206357600080fd5b50565b6000813590506120758161204f565b92915050565b6000806040838503121561209257612091611414565b5b60006120a085828601611467565b92505060206120b185828601612066565b9150509250929050565b600082825260208201905092915050565b60006120d7826116d9565b6120e181856120bb565b93506120f18185602086016114c5565b6120fa816114ef565b840191505092915050565b6000602082019050818103600083015261211f81846120cc565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000604083016000830151848203600086015261217082826116f5565b9150506020830151848203602086015261218a8282611800565b9150508091505092915050565b60006121a38383612153565b905092915050565b6000602082019050919050565b60006121c382612127565b6121cd8185612132565b9350836020820285016121df85612143565b8060005b8581101561221b57848403895281516121fc8582612197565b9450612207836121ab565b925060208a019950506001810190506121e3565b50829750879550505050505092915050565b6000604082019050818103600083015261224781856121b8565b9050818103602083015261225b8184611b6c565b90509392505050565b61226d8161143e565b82525050565b60006020820190506122886000830184612264565b92915050565b600081905092915050565b60006122a4826114a9565b6122ae818561228e565b93506122be8185602086016114c5565b80840191505092915050565b60006122d68284612299565b915081905092915050565b7f6661696c65642073746174696343616c6c20746f20707265636f6d70696c6500600082015250565b6000612317601f836120bb565b9150612322826122e1565b602082019050919050565b600060208201905081810360008301526123468161230a565b9050919050565b600080fd5b600080fd5b600061236a612365846115e0565b6115c5565b90508281526020810184848401111561238657612385611560565b5b6123918482856114c5565b509392505050565b600082601f8301126123ae576123ad61155b565b5b81516123be848260208601612357565b91505092915050565b600067ffffffffffffffff8211156123e2576123e1611565565b5b602082029050602081019050919050565b600080fd5b6000815190506124078161204f565b92915050565b61241681611773565b811461242157600080fd5b50565b6000815190506124338161240d565b92915050565b60006060828403121561244f5761244e61234d565b5b61245960606115c5565b9050600082015167ffffffffffffffff81111561247957612478612352565b5b61248584828501612399565b6000830152506020612499848285016123f8565b60208301525060406124ad84828501612424565b60408301525092915050565b60006124cc6124c7846123c7565b6115c5565b905080838252602082019050602084028301858111156124ef576124ee6123f3565b5b835b8181101561253657805167ffffffffffffffff8111156125145761251361155b565b5b8086016125218982612439565b855260208501945050506020810190506124f1565b5050509392505050565b600082601f8301126125555761255461155b565b5b81516125658482602086016124b9565b91505092915050565b6000606082840312156125845761258361234d565b5b61258e60606115c5565b9050600082015167ffffffffffffffff8111156125ae576125ad612352565b5b6125ba84828501612399565b600083015250602082015167ffffffffffffffff8111156125de576125dd612352565b5b6125ea84828501612540565b602083015250604082015167ffffffffffffffff81111561260e5761260d612352565b5b61261a84828501612540565b60408301525092915050565b60006020828403121561263c5761263b611414565b5b600082015167ffffffffffffffff81111561265a57612659611419565b5b6126668482850161256e565b91505092915050565b60006040820190506126846000830185612264565b818103602083015261269681846120cc565b90509392505050565b7f6661696c65642064656c656761746543616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b60006126fb6021836120bb565b91506127068261269f565b604082019050919050565b6000602082019050818103600083015261272a816126ee565b9050919050565b600067ffffffffffffffff82111561274c5761274b611565565b5b602082029050602081019050919050565b6000604082840312156127735761277261234d565b5b61277d60406115c5565b9050600082015167ffffffffffffffff81111561279d5761279c612352565b5b6127a984828501612399565b60008301525060206127bd848285016123f8565b60208301525092915050565b60006127dc6127d784612731565b6115c5565b905080838252602082019050602084028301858111156127ff576127fe6123f3565b5b835b8181101561284657805167ffffffffffffffff8111156128245761282361155b565b5b808601612831898261275d565b85526020850194505050602081019050612801565b5050509392505050565b600082601f8301126128655761286461155b565b5b81516128758482602086016127c9565b91505092915050565b60006020828403121561289457612893611414565b5b600082015167ffffffffffffffff8111156128b2576128b1611419565b5b6128be84828501612850565b91505092915050565b6128d081611a72565b81146128db57600080fd5b50565b6000815190506128ed816128c7565b92915050565b60006020828403121561290957612908611414565b5b6000612917848285016128de565b91505092915050565b61292981611adf565b82525050565b60006040820190506129446000830185612264565b6129516020830184612920565b9392505050565b60006020828403121561296e5761296d611414565b5b600082015167ffffffffffffffff81111561298c5761298b611419565b5b61299884828501612540565b91505092915050565b6129aa81611c03565b82525050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126129dc576129db6129ba565b5b83810192508235915060208301925067ffffffffffffffff821115612a0457612a036129b0565b5b600182023603831315612a1a57612a196129b5565b5b509250929050565b6000612a2e8385611e22565b9350612a3b838584611611565b612a44836114ef565b840190509392505050565b6000612a5e6020840184611c2e565b905092915050565b600081359050612a75816128c7565b92915050565b6000612a8a6020840184612a66565b905092915050565b612a9b81611a72565b82525050565b600060a08301612ab460008401846129bf565b8583036000870152612ac7838284612a22565b92505050612ad86020840184612a4f565b612ae56020860182611d32565b50612af36040840184612a4f565b612b006040860182611d32565b50612b0e6060840184612a7b565b612b1b6060860182612a92565b50612b296080840184612a7b565b612b366080860182612a92565b508091505092915050565b60006080820190508181036000830152612b5b81876120cc565b9050612b6a60208301866129a1565b612b7760408301856129a1565b8181036060830152612b898184612aa1565b905095945050505050565b600067ffffffffffffffff821115612baf57612bae611565565b5b602082029050602081019050919050565b600081519050612bcf81611c17565b92915050565b600060408284031215612beb57612bea61234d565b5b612bf560406115c5565b90506000612c05848285016123f8565b6000830152506020612c1984828501612424565b60208301525092915050565b600060608284031215612c3b57612c3a61234d565b5b612c4560406115c5565b90506000612c5584828501612bc0565b6000830152506020612c6984828501612bd5565b60208301525092915050565b6000612c88612c8384612b94565b6115c5565b90508083825260208201905060608402830185811115612cab57612caa6123f3565b5b835b81811015612cd45780612cc08882612c25565b845260208401935050606081019050612cad565b5050509392505050565b600082601f830112612cf357612cf261155b565b5b8151612d03848260208601612c75565b91505092915050565b600067ffffffffffffffff821115612d2757612d26611565565b5b612d30826114ef565b9050602081019050919050565b6000612d50612d4b84612d0c565b6115c5565b905082815260208101848484011115612d6c57612d6b611560565b5b612d778482856114c5565b509392505050565b600082601f830112612d9457612d9361155b565b5b8151612da4848260208601612d3d565b91505092915050565b600060408284031215612dc357612dc261234d565b5b612dcd60406115c5565b9050600082015167ffffffffffffffff811115612ded57612dec612352565b5b612df984828501612d7f565b6000830152506020612e0d84828501612bc0565b60208301525092915050565b60008060408385031215612e3057612e2f611414565b5b600083015167ffffffffffffffff811115612e4e57612e4d611419565b5b612e5a85828601612cde565b925050602083015167ffffffffffffffff811115612e7b57612e7a611419565b5b612e8785828601612dad565b9150509250929050565b7f6661696c656420746f2073657420776974686472617720616464726573730000600082015250565b6000612ec7601e836120bb565b9150612ed282612e91565b602082019050919050565b60006020820190508181036000830152612ef681612eba565b9050919050565b600067ffffffffffffffff821115612f1857612f17611565565b5b602082029050602081019050919050565b6000612f3c612f3784612efd565b6115c5565b90508083825260208201905060208402830185811115612f5f57612f5e6123f3565b5b835b81811015612fa657805167ffffffffffffffff811115612f8457612f8361155b565b5b808601612f918982612399565b85526020850194505050602081019050612f61565b5050509392505050565b600082601f830112612fc557612fc461155b565b5b8151612fd5848260208601612f29565b91505092915050565b600060208284031215612ff457612ff3611414565b5b600082015167ffffffffffffffff81111561301257613011611419565b5b61301e84828501612fb0565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061306182611aa8565b915061306c83611aa8565b925082820190507fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008112677fffffffffffffff821317156130b0576130af613027565b5b92915050565b6130bf8161175a565b82525050565b60006040820190506130da6000830185612264565b6130e760208301846130b6565b9392505050565b60006130f982611aa8565b915061310483611aa8565b92508282039050677fffffffffffffff81137fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008212171561314857613147613027565b5b92915050565b60006020828403121561316457613163611414565b5b600082015167ffffffffffffffff81111561318257613181611419565b5b61318e84828501612399565b91505092915050565b600067ffffffffffffffff8211156131b2576131b1611565565b5b602082029050602081019050919050565b6000604082840312156131d9576131d861234d565b5b6131e360406115c5565b9050600082015167ffffffffffffffff81111561320357613202612352565b5b61320f84828501612399565b600083015250602082015167ffffffffffffffff81111561323357613232612352565b5b61323f84828501612540565b60208301525092915050565b600061325e61325984613197565b6115c5565b90508083825260208201905060208402830185811115613281576132806123f3565b5b835b818110156132c857805167ffffffffffffffff8111156132a6576132a561155b565b5b8086016132b389826131c3565b85526020850194505050602081019050613283565b5050509392505050565b600082601f8301126132e7576132e661155b565b5b81516132f784826020860161324b565b91505092915050565b6000806040838503121561331757613316611414565b5b600083015167ffffffffffffffff81111561333557613334611419565b5b613341858286016132d2565b925050602083015167ffffffffffffffff81111561336257613361611419565b5b61336e85828601612540565b915050925092905056fea264697066735822122098cf28e1eaebfa4ab5717b6e13f8a9f4a27ffa9a4ab2c11b08247ad17d35919964736f6c63430008120033", - "deployedBytecode": "0x60806040526004361061012a5760003560e01c806388b2d581116100ab578063c7804bb51161006f578063c7804bb514610489578063cb85aa0a146104c6578063d0e30db014610503578063d3f831be1461050d578063e0421e391461054a578063e236c7a6146105875761012a565b806388b2d58114610357578063963516e41461039557806398194593146103d2578063b2d178831461040f578063b6a216ae1461044c5761012a565b806361bc221a116100f257806361bc221a1461024c5780636f669da41461027757806378a5dfd1146102b4578063796b96d2146102f15780637c9db0bb1461031a5761012a565b806301b680001461012f5780630c05e9e41461016c578063296c60aa146101a95780632d0ee16a146101d257806346e16d341461020f575b600080fd5b34801561013b57600080fd5b506101566004803603810190610151919061147c565b6105c5565b6040516101639190611539565b60405180910390f35b34801561017857600080fd5b50610193600480360381019061018e9190611690565b61070d565b6040516101a091906118d3565b60405180910390f35b3480156101b557600080fd5b506101d060048036038101906101cb91906118f5565b61079d565b005b3480156101de57600080fd5b506101f960048036038101906101f49190611690565b6108de565b6040516102069190611a50565b60405180910390f35b34801561021b57600080fd5b50610236600480360381019061023191906118f5565b61096c565b6040516102439190611a8d565b60405180910390f35b34801561025857600080fd5b506102616109f6565b60405161026e9190611ac4565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190611b1b565b610a07565b6040516102ab9190611a8d565b60405180910390f35b3480156102c057600080fd5b506102db60048036038101906102d691906118f5565b610a91565b6040516102e89190611be1565b60405180910390f35b3480156102fd57600080fd5b50610318600480360381019061031391906118f5565b610b1e565b005b34801561032657600080fd5b50610341600480360381019061033c9190611690565b610c5f565b60405161034e9190611be1565b60405180910390f35b34801561036357600080fd5b5061037e60048036038101906103799190611c67565b610ce9565b60405161038c929190611ea9565b60405180910390f35b3480156103a157600080fd5b506103bc60048036038101906103b79190611690565b610d87565b6040516103c99190611a8d565b60405180910390f35b3480156103de57600080fd5b506103f960048036038101906103f491906118f5565b610e10565b6040516104069190611a50565b60405180910390f35b34801561041b57600080fd5b5061043660048036038101906104319190611ee0565b610e9f565b6040516104439190611a50565b60405180910390f35b34801561045857600080fd5b50610473600480360381019061046e919061147c565b610ff4565b604051610480919061202d565b60405180910390f35b34801561049557600080fd5b506104b060048036038101906104ab919061207b565b61107e565b6040516104bd9190611a8d565b60405180910390f35b3480156104d257600080fd5b506104ed60048036038101906104e8919061147c565b611196565b6040516104fa9190612105565b60405180910390f35b61050b611220565b005b34801561051957600080fd5b50610534600480360381019061052f9190611690565b611222565b6040516105419190611be1565b60405180910390f35b34801561055657600080fd5b50610571600480360381019061056c9190611690565b6112ac565b60405161057e9190611a50565b60405180910390f35b34801561059357600080fd5b506105ae60048036038101906105a9919061147c565b611338565b6040516105bc92919061222d565b60405180910390f35b606060008061080173ffffffffffffffffffffffffffffffffffffffff16846040516024016105f49190612273565b6040516020818303038152906040527f5431f450000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161067e91906122ca565b600060405180830381855afa9150503d80600081146106b9576040519150601f19603f3d011682016040523d82523d6000602084013e6106be565b606091505b509150915081610703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106fa9061232d565b60405180910390fd5b8092505050919050565b6107156113c5565b61080173ffffffffffffffffffffffffffffffffffffffff166354212a89836040518263ffffffff1660e01b81526004016107509190612105565b600060405180830381865afa15801561076d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906107969190612626565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff1683836040516024016107cb92919061266f565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161085591906122ca565b600060405180830381855af49150503d8060008114610890576040519150601f19603f3d011682016040523d82523d6000602084013e610895565b606091505b50509050806108d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d090612711565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6130846040518363ffffffff1660e01b815260040161091d92919061266f565b6000604051808303816000875af115801561093c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610965919061287e565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9684846040518363ffffffff1660e01b81526004016109ab92919061266f565b6020604051808303816000875af11580156109ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ee91906128f3565b905092915050565b60008054906101000a900460070b81565b600061080173ffffffffffffffffffffffffffffffffffffffff16632efe8a5f84846040518363ffffffff1660e01b8152600401610a4692919061292f565b6020604051808303816000875af1158015610a65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8991906128f3565b905092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff16639ad563b484846040518363ffffffff1660e01b8152600401610ad092919061266f565b600060405180830381865afa158015610aed573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610b169190612958565b905092915050565b600061080173ffffffffffffffffffffffffffffffffffffffff168383604051602401610b4c92919061266f565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610bd691906122ca565b600060405180830381855afa9150503d8060008114610c11576040519150601f19603f3d011682016040523d82523d6000602084013e610c16565b606091505b5050905080610c5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c519061232d565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633dd40f78836040518263ffffffff1660e01b8152600401610c9c9190612105565b600060405180830381865afa158015610cb9573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610ce29190612958565b9050919050565b6060610cf36113e6565b61080173ffffffffffffffffffffffffffffffffffffffff16638f2473ce878787876040518563ffffffff1660e01b8152600401610d349493929190612b41565b600060405180830381865afa158015610d51573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610d7a9190612e19565b9150915094509492505050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9630846040518363ffffffff1660e01b8152600401610dc692919061266f565b6020604051808303816000875af1158015610de5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0991906128f3565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6184846040518363ffffffff1660e01b8152600401610e4f92919061266f565b6000604051808303816000875af1158015610e6e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610e97919061287e565b905092915050565b6060600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9633876040518363ffffffff1660e01b8152600401610ee092919061266f565b6020604051808303816000875af1158015610eff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2391906128f3565b905080610f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5c90612edd565b60405180910390fd5b61080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6185856040518363ffffffff1660e01b8152600401610fa292919061266f565b6000604051808303816000875af1158015610fc1573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610fea919061287e565b9150509392505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663a66cb605836040518263ffffffff1660e01b81526004016110319190612273565b600060405180830381865afa15801561104e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110779190612fde565b9050919050565b600060016000808282829054906101000a900460070b61109e9190613056565b92506101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff16021790555061080173ffffffffffffffffffffffffffffffffffffffff1663ed41d0b684846040518363ffffffff1660e01b81526004016111049291906130c5565b6020604051808303816000875af1158015611123573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114791906128f3565b905060016000808282829054906101000a900460070b61116791906130ee565b92506101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff16021790555092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff16635431f450836040518263ffffffff1660e01b81526004016111d39190612273565b600060405180830381865afa1580156111f0573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611219919061314e565b9050919050565b565b606061080173ffffffffffffffffffffffffffffffffffffffff166385b2d2da836040518263ffffffff1660e01b815260040161125f9190612105565b600060405180830381865afa15801561127c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906112a59190612958565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633ce4e3be836040518263ffffffff1660e01b81526004016112e99190612105565b6000604051808303816000875af1158015611308573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611331919061287e565b9050919050565b60608061080173ffffffffffffffffffffffffffffffffffffffff166354be1a28846040518263ffffffff1660e01b81526004016113769190612273565b600060405180830381865afa158015611393573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906113bc9190613300565b91509150915091565b60405180606001604052806060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006114498261141e565b9050919050565b6114598161143e565b811461146457600080fd5b50565b60008135905061147681611450565b92915050565b60006020828403121561149257611491611414565b5b60006114a084828501611467565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156114e35780820151818401526020810190506114c8565b60008484015250505050565b6000601f19601f8301169050919050565b600061150b826114a9565b61151581856114b4565b93506115258185602086016114c5565b61152e816114ef565b840191505092915050565b600060208201905081810360008301526115538184611500565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61159d826114ef565b810181811067ffffffffffffffff821117156115bc576115bb611565565b5b80604052505050565b60006115cf61140a565b90506115db8282611594565b919050565b600067ffffffffffffffff8211156115fb576115fa611565565b5b611604826114ef565b9050602081019050919050565b82818337600083830152505050565b600061163361162e846115e0565b6115c5565b90508281526020810184848401111561164f5761164e611560565b5b61165a848285611611565b509392505050565b600082601f8301126116775761167661155b565b5b8135611687848260208601611620565b91505092915050565b6000602082840312156116a6576116a5611414565b5b600082013567ffffffffffffffff8111156116c4576116c3611419565b5b6116d084828501611662565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000611700826116d9565b61170a81856116e4565b935061171a8185602086016114c5565b611723816114ef565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000819050919050565b61176d8161175a565b82525050565b600060ff82169050919050565b61178981611773565b82525050565b600060608301600083015184820360008601526117ac82826116f5565b91505060208301516117c16020860182611764565b5060408301516117d46040860182611780565b508091505092915050565b60006117eb838361178f565b905092915050565b6000602082019050919050565b600061180b8261172e565b6118158185611739565b9350836020820285016118278561174a565b8060005b85811015611863578484038952815161184485826117df565b945061184f836117f3565b925060208a0199505060018101905061182b565b50829750879550505050505092915050565b6000606083016000830151848203600086015261189282826116f5565b915050602083015184820360208601526118ac8282611800565b915050604083015184820360408601526118c68282611800565b9150508091505092915050565b600060208201905081810360008301526118ed8184611875565b905092915050565b6000806040838503121561190c5761190b611414565b5b600061191a85828601611467565b925050602083013567ffffffffffffffff81111561193b5761193a611419565b5b61194785828601611662565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000604083016000830151848203600086015261199a82826116f5565b91505060208301516119af6020860182611764565b508091505092915050565b60006119c6838361197d565b905092915050565b6000602082019050919050565b60006119e682611951565b6119f0818561195c565b935083602082028501611a028561196d565b8060005b85811015611a3e5784840389528151611a1f85826119ba565b9450611a2a836119ce565b925060208a01995050600181019050611a06565b50829750879550505050505092915050565b60006020820190508181036000830152611a6a81846119db565b905092915050565b60008115159050919050565b611a8781611a72565b82525050565b6000602082019050611aa26000830184611a7e565b92915050565b60008160070b9050919050565b611abe81611aa8565b82525050565b6000602082019050611ad96000830184611ab5565b92915050565b600063ffffffff82169050919050565b611af881611adf565b8114611b0357600080fd5b50565b600081359050611b1581611aef565b92915050565b60008060408385031215611b3257611b31611414565b5b6000611b4085828601611467565b9250506020611b5185828601611b06565b9150509250929050565b600082825260208201905092915050565b6000611b778261172e565b611b818185611b5b565b935083602082028501611b938561174a565b8060005b85811015611bcf5784840389528151611bb085826117df565b9450611bbb836117f3565b925060208a01995050600181019050611b97565b50829750879550505050505092915050565b60006020820190508181036000830152611bfb8184611b6c565b905092915050565b600067ffffffffffffffff82169050919050565b611c2081611c03565b8114611c2b57600080fd5b50565b600081359050611c3d81611c17565b92915050565b600080fd5b600060a08284031215611c5e57611c5d611c43565b5b81905092915050565b60008060008060808587031215611c8157611c80611414565b5b600085013567ffffffffffffffff811115611c9f57611c9e611419565b5b611cab87828801611662565b9450506020611cbc87828801611c2e565b9350506040611ccd87828801611c2e565b925050606085013567ffffffffffffffff811115611cee57611ced611419565b5b611cfa87828801611c48565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611d3b81611c03565b82525050565b604082016000820151611d576000850182611764565b506020820151611d6a6020850182611780565b50505050565b606082016000820151611d866000850182611d32565b506020820151611d996020850182611d41565b50505050565b6000611dab8383611d70565b60608301905092915050565b6000602082019050919050565b6000611dcf82611d06565b611dd98185611d11565b9350611de483611d22565b8060005b83811015611e15578151611dfc8882611d9f565b9750611e0783611db7565b925050600181019050611de8565b5085935050505092915050565b600082825260208201905092915050565b6000611e3e826114a9565b611e488185611e22565b9350611e588185602086016114c5565b611e61816114ef565b840191505092915050565b60006040830160008301518482036000860152611e898282611e33565b9150506020830151611e9e6020860182611d32565b508091505092915050565b60006040820190508181036000830152611ec38185611dc4565b90508181036020830152611ed78184611e6c565b90509392505050565b600080600060608486031215611ef957611ef8611414565b5b600084013567ffffffffffffffff811115611f1757611f16611419565b5b611f2386828701611662565b9350506020611f3486828701611467565b925050604084013567ffffffffffffffff811115611f5557611f54611419565b5b611f6186828701611662565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000611fa383836116f5565b905092915050565b6000602082019050919050565b6000611fc382611f6b565b611fcd8185611f76565b935083602082028501611fdf85611f87565b8060005b8581101561201b5784840389528151611ffc8582611f97565b945061200783611fab565b925060208a01995050600181019050611fe3565b50829750879550505050505092915050565b600060208201905081810360008301526120478184611fb8565b905092915050565b6120588161175a565b811461206357600080fd5b50565b6000813590506120758161204f565b92915050565b6000806040838503121561209257612091611414565b5b60006120a085828601611467565b92505060206120b185828601612066565b9150509250929050565b600082825260208201905092915050565b60006120d7826116d9565b6120e181856120bb565b93506120f18185602086016114c5565b6120fa816114ef565b840191505092915050565b6000602082019050818103600083015261211f81846120cc565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000604083016000830151848203600086015261217082826116f5565b9150506020830151848203602086015261218a8282611800565b9150508091505092915050565b60006121a38383612153565b905092915050565b6000602082019050919050565b60006121c382612127565b6121cd8185612132565b9350836020820285016121df85612143565b8060005b8581101561221b57848403895281516121fc8582612197565b9450612207836121ab565b925060208a019950506001810190506121e3565b50829750879550505050505092915050565b6000604082019050818103600083015261224781856121b8565b9050818103602083015261225b8184611b6c565b90509392505050565b61226d8161143e565b82525050565b60006020820190506122886000830184612264565b92915050565b600081905092915050565b60006122a4826114a9565b6122ae818561228e565b93506122be8185602086016114c5565b80840191505092915050565b60006122d68284612299565b915081905092915050565b7f6661696c65642073746174696343616c6c20746f20707265636f6d70696c6500600082015250565b6000612317601f836120bb565b9150612322826122e1565b602082019050919050565b600060208201905081810360008301526123468161230a565b9050919050565b600080fd5b600080fd5b600061236a612365846115e0565b6115c5565b90508281526020810184848401111561238657612385611560565b5b6123918482856114c5565b509392505050565b600082601f8301126123ae576123ad61155b565b5b81516123be848260208601612357565b91505092915050565b600067ffffffffffffffff8211156123e2576123e1611565565b5b602082029050602081019050919050565b600080fd5b6000815190506124078161204f565b92915050565b61241681611773565b811461242157600080fd5b50565b6000815190506124338161240d565b92915050565b60006060828403121561244f5761244e61234d565b5b61245960606115c5565b9050600082015167ffffffffffffffff81111561247957612478612352565b5b61248584828501612399565b6000830152506020612499848285016123f8565b60208301525060406124ad84828501612424565b60408301525092915050565b60006124cc6124c7846123c7565b6115c5565b905080838252602082019050602084028301858111156124ef576124ee6123f3565b5b835b8181101561253657805167ffffffffffffffff8111156125145761251361155b565b5b8086016125218982612439565b855260208501945050506020810190506124f1565b5050509392505050565b600082601f8301126125555761255461155b565b5b81516125658482602086016124b9565b91505092915050565b6000606082840312156125845761258361234d565b5b61258e60606115c5565b9050600082015167ffffffffffffffff8111156125ae576125ad612352565b5b6125ba84828501612399565b600083015250602082015167ffffffffffffffff8111156125de576125dd612352565b5b6125ea84828501612540565b602083015250604082015167ffffffffffffffff81111561260e5761260d612352565b5b61261a84828501612540565b60408301525092915050565b60006020828403121561263c5761263b611414565b5b600082015167ffffffffffffffff81111561265a57612659611419565b5b6126668482850161256e565b91505092915050565b60006040820190506126846000830185612264565b818103602083015261269681846120cc565b90509392505050565b7f6661696c65642064656c656761746543616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b60006126fb6021836120bb565b91506127068261269f565b604082019050919050565b6000602082019050818103600083015261272a816126ee565b9050919050565b600067ffffffffffffffff82111561274c5761274b611565565b5b602082029050602081019050919050565b6000604082840312156127735761277261234d565b5b61277d60406115c5565b9050600082015167ffffffffffffffff81111561279d5761279c612352565b5b6127a984828501612399565b60008301525060206127bd848285016123f8565b60208301525092915050565b60006127dc6127d784612731565b6115c5565b905080838252602082019050602084028301858111156127ff576127fe6123f3565b5b835b8181101561284657805167ffffffffffffffff8111156128245761282361155b565b5b808601612831898261275d565b85526020850194505050602081019050612801565b5050509392505050565b600082601f8301126128655761286461155b565b5b81516128758482602086016127c9565b91505092915050565b60006020828403121561289457612893611414565b5b600082015167ffffffffffffffff8111156128b2576128b1611419565b5b6128be84828501612850565b91505092915050565b6128d081611a72565b81146128db57600080fd5b50565b6000815190506128ed816128c7565b92915050565b60006020828403121561290957612908611414565b5b6000612917848285016128de565b91505092915050565b61292981611adf565b82525050565b60006040820190506129446000830185612264565b6129516020830184612920565b9392505050565b60006020828403121561296e5761296d611414565b5b600082015167ffffffffffffffff81111561298c5761298b611419565b5b61299884828501612540565b91505092915050565b6129aa81611c03565b82525050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126129dc576129db6129ba565b5b83810192508235915060208301925067ffffffffffffffff821115612a0457612a036129b0565b5b600182023603831315612a1a57612a196129b5565b5b509250929050565b6000612a2e8385611e22565b9350612a3b838584611611565b612a44836114ef565b840190509392505050565b6000612a5e6020840184611c2e565b905092915050565b600081359050612a75816128c7565b92915050565b6000612a8a6020840184612a66565b905092915050565b612a9b81611a72565b82525050565b600060a08301612ab460008401846129bf565b8583036000870152612ac7838284612a22565b92505050612ad86020840184612a4f565b612ae56020860182611d32565b50612af36040840184612a4f565b612b006040860182611d32565b50612b0e6060840184612a7b565b612b1b6060860182612a92565b50612b296080840184612a7b565b612b366080860182612a92565b508091505092915050565b60006080820190508181036000830152612b5b81876120cc565b9050612b6a60208301866129a1565b612b7760408301856129a1565b8181036060830152612b898184612aa1565b905095945050505050565b600067ffffffffffffffff821115612baf57612bae611565565b5b602082029050602081019050919050565b600081519050612bcf81611c17565b92915050565b600060408284031215612beb57612bea61234d565b5b612bf560406115c5565b90506000612c05848285016123f8565b6000830152506020612c1984828501612424565b60208301525092915050565b600060608284031215612c3b57612c3a61234d565b5b612c4560406115c5565b90506000612c5584828501612bc0565b6000830152506020612c6984828501612bd5565b60208301525092915050565b6000612c88612c8384612b94565b6115c5565b90508083825260208201905060608402830185811115612cab57612caa6123f3565b5b835b81811015612cd45780612cc08882612c25565b845260208401935050606081019050612cad565b5050509392505050565b600082601f830112612cf357612cf261155b565b5b8151612d03848260208601612c75565b91505092915050565b600067ffffffffffffffff821115612d2757612d26611565565b5b612d30826114ef565b9050602081019050919050565b6000612d50612d4b84612d0c565b6115c5565b905082815260208101848484011115612d6c57612d6b611560565b5b612d778482856114c5565b509392505050565b600082601f830112612d9457612d9361155b565b5b8151612da4848260208601612d3d565b91505092915050565b600060408284031215612dc357612dc261234d565b5b612dcd60406115c5565b9050600082015167ffffffffffffffff811115612ded57612dec612352565b5b612df984828501612d7f565b6000830152506020612e0d84828501612bc0565b60208301525092915050565b60008060408385031215612e3057612e2f611414565b5b600083015167ffffffffffffffff811115612e4e57612e4d611419565b5b612e5a85828601612cde565b925050602083015167ffffffffffffffff811115612e7b57612e7a611419565b5b612e8785828601612dad565b9150509250929050565b7f6661696c656420746f2073657420776974686472617720616464726573730000600082015250565b6000612ec7601e836120bb565b9150612ed282612e91565b602082019050919050565b60006020820190508181036000830152612ef681612eba565b9050919050565b600067ffffffffffffffff821115612f1857612f17611565565b5b602082029050602081019050919050565b6000612f3c612f3784612efd565b6115c5565b90508083825260208201905060208402830185811115612f5f57612f5e6123f3565b5b835b81811015612fa657805167ffffffffffffffff811115612f8457612f8361155b565b5b808601612f918982612399565b85526020850194505050602081019050612f61565b5050509392505050565b600082601f830112612fc557612fc461155b565b5b8151612fd5848260208601612f29565b91505092915050565b600060208284031215612ff457612ff3611414565b5b600082015167ffffffffffffffff81111561301257613011611419565b5b61301e84828501612fb0565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061306182611aa8565b915061306c83611aa8565b925082820190507fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008112677fffffffffffffff821317156130b0576130af613027565b5b92915050565b6130bf8161175a565b82525050565b60006040820190506130da6000830185612264565b6130e760208301846130b6565b9392505050565b60006130f982611aa8565b915061310483611aa8565b92508282039050677fffffffffffffff81137fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008212171561314857613147613027565b5b92915050565b60006020828403121561316457613163611414565b5b600082015167ffffffffffffffff81111561318257613181611419565b5b61318e84828501612399565b91505092915050565b600067ffffffffffffffff8211156131b2576131b1611565565b5b602082029050602081019050919050565b6000604082840312156131d9576131d861234d565b5b6131e360406115c5565b9050600082015167ffffffffffffffff81111561320357613202612352565b5b61320f84828501612399565b600083015250602082015167ffffffffffffffff81111561323357613232612352565b5b61323f84828501612540565b60208301525092915050565b600061325e61325984613197565b6115c5565b90508083825260208201905060208402830185811115613281576132806123f3565b5b835b818110156132c857805167ffffffffffffffff8111156132a6576132a561155b565b5b8086016132b389826131c3565b85526020850194505050602081019050613283565b5050509392505050565b600082601f8301126132e7576132e661155b565b5b81516132f784826020860161324b565b91505092915050565b6000806040838503121561331757613316611414565b5b600083015167ffffffffffffffff81111561333557613334611419565b5b613341858286016132d2565b925050602083015167ffffffffffffffff81111561336257613361611419565b5b61336e85828601612540565b915050925092905056fea264697066735822122098cf28e1eaebfa4ab5717b6e13f8a9f4a27ffa9a4ab2c11b08247ad17d35919964736f6c63430008120033", + "bytecode": "0x608060405234801561001057600080fd5b506133ae806100206000396000f3fe60806040526004361061012a5760003560e01c806388b2d581116100ab578063c7804bb51161006f578063c7804bb514610489578063cb85aa0a146104c6578063d0e30db014610503578063d3f831be1461050d578063e0421e391461054a578063e236c7a6146105875761012a565b806388b2d58114610357578063963516e41461039557806398194593146103d2578063b2d178831461040f578063b6a216ae1461044c5761012a565b806361bc221a116100f257806361bc221a1461024c5780636f669da41461027757806378a5dfd1146102b4578063796b96d2146102f15780637c9db0bb1461031a5761012a565b806301b680001461012f5780630c05e9e41461016c578063296c60aa146101a95780632d0ee16a146101d257806346e16d341461020f575b600080fd5b34801561013b57600080fd5b506101566004803603810190610151919061147c565b6105c5565b6040516101639190611539565b60405180910390f35b34801561017857600080fd5b50610193600480360381019061018e9190611690565b61070d565b6040516101a091906118d3565b60405180910390f35b3480156101b557600080fd5b506101d060048036038101906101cb91906118f5565b61079d565b005b3480156101de57600080fd5b506101f960048036038101906101f49190611690565b6108de565b6040516102069190611a50565b60405180910390f35b34801561021b57600080fd5b50610236600480360381019061023191906118f5565b61096c565b6040516102439190611a8d565b60405180910390f35b34801561025857600080fd5b506102616109f6565b60405161026e9190611ac4565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190611b1b565b610a07565b6040516102ab9190611a8d565b60405180910390f35b3480156102c057600080fd5b506102db60048036038101906102d691906118f5565b610a91565b6040516102e89190611be1565b60405180910390f35b3480156102fd57600080fd5b50610318600480360381019061031391906118f5565b610b1e565b005b34801561032657600080fd5b50610341600480360381019061033c9190611690565b610c5f565b60405161034e9190611be1565b60405180910390f35b34801561036357600080fd5b5061037e60048036038101906103799190611c67565b610ce9565b60405161038c929190611ea9565b60405180910390f35b3480156103a157600080fd5b506103bc60048036038101906103b79190611690565b610d87565b6040516103c99190611a8d565b60405180910390f35b3480156103de57600080fd5b506103f960048036038101906103f491906118f5565b610e10565b6040516104069190611a50565b60405180910390f35b34801561041b57600080fd5b5061043660048036038101906104319190611ee0565b610e9f565b6040516104439190611a50565b60405180910390f35b34801561045857600080fd5b50610473600480360381019061046e919061147c565b610ff4565b604051610480919061202d565b60405180910390f35b34801561049557600080fd5b506104b060048036038101906104ab919061207b565b61107e565b6040516104bd9190611a8d565b60405180910390f35b3480156104d257600080fd5b506104ed60048036038101906104e8919061147c565b611196565b6040516104fa9190612105565b60405180910390f35b61050b611220565b005b34801561051957600080fd5b50610534600480360381019061052f9190611690565b611222565b6040516105419190611be1565b60405180910390f35b34801561055657600080fd5b50610571600480360381019061056c9190611690565b6112ac565b60405161057e9190611a50565b60405180910390f35b34801561059357600080fd5b506105ae60048036038101906105a9919061147c565b611338565b6040516105bc92919061222d565b60405180910390f35b606060008061080173ffffffffffffffffffffffffffffffffffffffff16846040516024016105f49190612273565b6040516020818303038152906040527f5431f450000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161067e91906122ca565b600060405180830381855afa9150503d80600081146106b9576040519150601f19603f3d011682016040523d82523d6000602084013e6106be565b606091505b509150915081610703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106fa9061232d565b60405180910390fd5b8092505050919050565b6107156113c5565b61080173ffffffffffffffffffffffffffffffffffffffff166354212a89836040518263ffffffff1660e01b81526004016107509190612105565b600060405180830381865afa15801561076d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906107969190612626565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff1683836040516024016107cb92919061266f565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161085591906122ca565b600060405180830381855af49150503d8060008114610890576040519150601f19603f3d011682016040523d82523d6000602084013e610895565b606091505b50509050806108d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d090612711565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6130846040518363ffffffff1660e01b815260040161091d92919061266f565b6000604051808303816000875af115801561093c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610965919061287e565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9684846040518363ffffffff1660e01b81526004016109ab92919061266f565b6020604051808303816000875af11580156109ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ee91906128f3565b905092915050565b60008054906101000a900460070b81565b600061080173ffffffffffffffffffffffffffffffffffffffff16632efe8a5f84846040518363ffffffff1660e01b8152600401610a4692919061292f565b6020604051808303816000875af1158015610a65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8991906128f3565b905092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff16639ad563b484846040518363ffffffff1660e01b8152600401610ad092919061266f565b600060405180830381865afa158015610aed573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610b169190612958565b905092915050565b600061080173ffffffffffffffffffffffffffffffffffffffff168383604051602401610b4c92919061266f565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610bd691906122ca565b600060405180830381855afa9150503d8060008114610c11576040519150601f19603f3d011682016040523d82523d6000602084013e610c16565b606091505b5050905080610c5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c519061232d565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633dd40f78836040518263ffffffff1660e01b8152600401610c9c9190612105565b600060405180830381865afa158015610cb9573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610ce29190612958565b9050919050565b6060610cf36113e6565b61080173ffffffffffffffffffffffffffffffffffffffff16638f2473ce878787876040518563ffffffff1660e01b8152600401610d349493929190612b41565b600060405180830381865afa158015610d51573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610d7a9190612e19565b9150915094509492505050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9630846040518363ffffffff1660e01b8152600401610dc692919061266f565b6020604051808303816000875af1158015610de5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0991906128f3565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6184846040518363ffffffff1660e01b8152600401610e4f92919061266f565b6000604051808303816000875af1158015610e6e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610e97919061287e565b905092915050565b6060600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9633876040518363ffffffff1660e01b8152600401610ee092919061266f565b6020604051808303816000875af1158015610eff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2391906128f3565b905080610f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5c90612edd565b60405180910390fd5b61080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6185856040518363ffffffff1660e01b8152600401610fa292919061266f565b6000604051808303816000875af1158015610fc1573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610fea919061287e565b9150509392505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663a66cb605836040518263ffffffff1660e01b81526004016110319190612273565b600060405180830381865afa15801561104e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110779190612fde565b9050919050565b600060016000808282829054906101000a900460070b61109e9190613056565b92506101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff16021790555061080173ffffffffffffffffffffffffffffffffffffffff1663ed41d0b684846040518363ffffffff1660e01b81526004016111049291906130c5565b6020604051808303816000875af1158015611123573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114791906128f3565b905060016000808282829054906101000a900460070b61116791906130ee565b92506101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff16021790555092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff16635431f450836040518263ffffffff1660e01b81526004016111d39190612273565b600060405180830381865afa1580156111f0573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611219919061314e565b9050919050565b565b606061080173ffffffffffffffffffffffffffffffffffffffff166385b2d2da836040518263ffffffff1660e01b815260040161125f9190612105565b600060405180830381865afa15801561127c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906112a59190612958565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633ce4e3be836040518263ffffffff1660e01b81526004016112e99190612105565b6000604051808303816000875af1158015611308573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611331919061287e565b9050919050565b60608061080173ffffffffffffffffffffffffffffffffffffffff166354be1a28846040518263ffffffff1660e01b81526004016113769190612273565b600060405180830381865afa158015611393573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906113bc9190613300565b91509150915091565b60405180606001604052806060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006114498261141e565b9050919050565b6114598161143e565b811461146457600080fd5b50565b60008135905061147681611450565b92915050565b60006020828403121561149257611491611414565b5b60006114a084828501611467565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156114e35780820151818401526020810190506114c8565b60008484015250505050565b6000601f19601f8301169050919050565b600061150b826114a9565b61151581856114b4565b93506115258185602086016114c5565b61152e816114ef565b840191505092915050565b600060208201905081810360008301526115538184611500565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61159d826114ef565b810181811067ffffffffffffffff821117156115bc576115bb611565565b5b80604052505050565b60006115cf61140a565b90506115db8282611594565b919050565b600067ffffffffffffffff8211156115fb576115fa611565565b5b611604826114ef565b9050602081019050919050565b82818337600083830152505050565b600061163361162e846115e0565b6115c5565b90508281526020810184848401111561164f5761164e611560565b5b61165a848285611611565b509392505050565b600082601f8301126116775761167661155b565b5b8135611687848260208601611620565b91505092915050565b6000602082840312156116a6576116a5611414565b5b600082013567ffffffffffffffff8111156116c4576116c3611419565b5b6116d084828501611662565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000611700826116d9565b61170a81856116e4565b935061171a8185602086016114c5565b611723816114ef565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000819050919050565b61176d8161175a565b82525050565b600060ff82169050919050565b61178981611773565b82525050565b600060608301600083015184820360008601526117ac82826116f5565b91505060208301516117c16020860182611764565b5060408301516117d46040860182611780565b508091505092915050565b60006117eb838361178f565b905092915050565b6000602082019050919050565b600061180b8261172e565b6118158185611739565b9350836020820285016118278561174a565b8060005b85811015611863578484038952815161184485826117df565b945061184f836117f3565b925060208a0199505060018101905061182b565b50829750879550505050505092915050565b6000606083016000830151848203600086015261189282826116f5565b915050602083015184820360208601526118ac8282611800565b915050604083015184820360408601526118c68282611800565b9150508091505092915050565b600060208201905081810360008301526118ed8184611875565b905092915050565b6000806040838503121561190c5761190b611414565b5b600061191a85828601611467565b925050602083013567ffffffffffffffff81111561193b5761193a611419565b5b61194785828601611662565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000604083016000830151848203600086015261199a82826116f5565b91505060208301516119af6020860182611764565b508091505092915050565b60006119c6838361197d565b905092915050565b6000602082019050919050565b60006119e682611951565b6119f0818561195c565b935083602082028501611a028561196d565b8060005b85811015611a3e5784840389528151611a1f85826119ba565b9450611a2a836119ce565b925060208a01995050600181019050611a06565b50829750879550505050505092915050565b60006020820190508181036000830152611a6a81846119db565b905092915050565b60008115159050919050565b611a8781611a72565b82525050565b6000602082019050611aa26000830184611a7e565b92915050565b60008160070b9050919050565b611abe81611aa8565b82525050565b6000602082019050611ad96000830184611ab5565b92915050565b600063ffffffff82169050919050565b611af881611adf565b8114611b0357600080fd5b50565b600081359050611b1581611aef565b92915050565b60008060408385031215611b3257611b31611414565b5b6000611b4085828601611467565b9250506020611b5185828601611b06565b9150509250929050565b600082825260208201905092915050565b6000611b778261172e565b611b818185611b5b565b935083602082028501611b938561174a565b8060005b85811015611bcf5784840389528151611bb085826117df565b9450611bbb836117f3565b925060208a01995050600181019050611b97565b50829750879550505050505092915050565b60006020820190508181036000830152611bfb8184611b6c565b905092915050565b600067ffffffffffffffff82169050919050565b611c2081611c03565b8114611c2b57600080fd5b50565b600081359050611c3d81611c17565b92915050565b600080fd5b600060a08284031215611c5e57611c5d611c43565b5b81905092915050565b60008060008060808587031215611c8157611c80611414565b5b600085013567ffffffffffffffff811115611c9f57611c9e611419565b5b611cab87828801611662565b9450506020611cbc87828801611c2e565b9350506040611ccd87828801611c2e565b925050606085013567ffffffffffffffff811115611cee57611ced611419565b5b611cfa87828801611c48565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611d3b81611c03565b82525050565b604082016000820151611d576000850182611764565b506020820151611d6a6020850182611780565b50505050565b606082016000820151611d866000850182611d32565b506020820151611d996020850182611d41565b50505050565b6000611dab8383611d70565b60608301905092915050565b6000602082019050919050565b6000611dcf82611d06565b611dd98185611d11565b9350611de483611d22565b8060005b83811015611e15578151611dfc8882611d9f565b9750611e0783611db7565b925050600181019050611de8565b5085935050505092915050565b600082825260208201905092915050565b6000611e3e826114a9565b611e488185611e22565b9350611e588185602086016114c5565b611e61816114ef565b840191505092915050565b60006040830160008301518482036000860152611e898282611e33565b9150506020830151611e9e6020860182611d32565b508091505092915050565b60006040820190508181036000830152611ec38185611dc4565b90508181036020830152611ed78184611e6c565b90509392505050565b600080600060608486031215611ef957611ef8611414565b5b600084013567ffffffffffffffff811115611f1757611f16611419565b5b611f2386828701611662565b9350506020611f3486828701611467565b925050604084013567ffffffffffffffff811115611f5557611f54611419565b5b611f6186828701611662565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000611fa383836116f5565b905092915050565b6000602082019050919050565b6000611fc382611f6b565b611fcd8185611f76565b935083602082028501611fdf85611f87565b8060005b8581101561201b5784840389528151611ffc8582611f97565b945061200783611fab565b925060208a01995050600181019050611fe3565b50829750879550505050505092915050565b600060208201905081810360008301526120478184611fb8565b905092915050565b6120588161175a565b811461206357600080fd5b50565b6000813590506120758161204f565b92915050565b6000806040838503121561209257612091611414565b5b60006120a085828601611467565b92505060206120b185828601612066565b9150509250929050565b600082825260208201905092915050565b60006120d7826116d9565b6120e181856120bb565b93506120f18185602086016114c5565b6120fa816114ef565b840191505092915050565b6000602082019050818103600083015261211f81846120cc565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000604083016000830151848203600086015261217082826116f5565b9150506020830151848203602086015261218a8282611800565b9150508091505092915050565b60006121a38383612153565b905092915050565b6000602082019050919050565b60006121c382612127565b6121cd8185612132565b9350836020820285016121df85612143565b8060005b8581101561221b57848403895281516121fc8582612197565b9450612207836121ab565b925060208a019950506001810190506121e3565b50829750879550505050505092915050565b6000604082019050818103600083015261224781856121b8565b9050818103602083015261225b8184611b6c565b90509392505050565b61226d8161143e565b82525050565b60006020820190506122886000830184612264565b92915050565b600081905092915050565b60006122a4826114a9565b6122ae818561228e565b93506122be8185602086016114c5565b80840191505092915050565b60006122d68284612299565b915081905092915050565b7f6661696c65642073746174696343616c6c20746f20707265636f6d70696c6500600082015250565b6000612317601f836120bb565b9150612322826122e1565b602082019050919050565b600060208201905081810360008301526123468161230a565b9050919050565b600080fd5b600080fd5b600061236a612365846115e0565b6115c5565b90508281526020810184848401111561238657612385611560565b5b6123918482856114c5565b509392505050565b600082601f8301126123ae576123ad61155b565b5b81516123be848260208601612357565b91505092915050565b600067ffffffffffffffff8211156123e2576123e1611565565b5b602082029050602081019050919050565b600080fd5b6000815190506124078161204f565b92915050565b61241681611773565b811461242157600080fd5b50565b6000815190506124338161240d565b92915050565b60006060828403121561244f5761244e61234d565b5b61245960606115c5565b9050600082015167ffffffffffffffff81111561247957612478612352565b5b61248584828501612399565b6000830152506020612499848285016123f8565b60208301525060406124ad84828501612424565b60408301525092915050565b60006124cc6124c7846123c7565b6115c5565b905080838252602082019050602084028301858111156124ef576124ee6123f3565b5b835b8181101561253657805167ffffffffffffffff8111156125145761251361155b565b5b8086016125218982612439565b855260208501945050506020810190506124f1565b5050509392505050565b600082601f8301126125555761255461155b565b5b81516125658482602086016124b9565b91505092915050565b6000606082840312156125845761258361234d565b5b61258e60606115c5565b9050600082015167ffffffffffffffff8111156125ae576125ad612352565b5b6125ba84828501612399565b600083015250602082015167ffffffffffffffff8111156125de576125dd612352565b5b6125ea84828501612540565b602083015250604082015167ffffffffffffffff81111561260e5761260d612352565b5b61261a84828501612540565b60408301525092915050565b60006020828403121561263c5761263b611414565b5b600082015167ffffffffffffffff81111561265a57612659611419565b5b6126668482850161256e565b91505092915050565b60006040820190506126846000830185612264565b818103602083015261269681846120cc565b90509392505050565b7f6661696c65642064656c656761746543616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b60006126fb6021836120bb565b91506127068261269f565b604082019050919050565b6000602082019050818103600083015261272a816126ee565b9050919050565b600067ffffffffffffffff82111561274c5761274b611565565b5b602082029050602081019050919050565b6000604082840312156127735761277261234d565b5b61277d60406115c5565b9050600082015167ffffffffffffffff81111561279d5761279c612352565b5b6127a984828501612399565b60008301525060206127bd848285016123f8565b60208301525092915050565b60006127dc6127d784612731565b6115c5565b905080838252602082019050602084028301858111156127ff576127fe6123f3565b5b835b8181101561284657805167ffffffffffffffff8111156128245761282361155b565b5b808601612831898261275d565b85526020850194505050602081019050612801565b5050509392505050565b600082601f8301126128655761286461155b565b5b81516128758482602086016127c9565b91505092915050565b60006020828403121561289457612893611414565b5b600082015167ffffffffffffffff8111156128b2576128b1611419565b5b6128be84828501612850565b91505092915050565b6128d081611a72565b81146128db57600080fd5b50565b6000815190506128ed816128c7565b92915050565b60006020828403121561290957612908611414565b5b6000612917848285016128de565b91505092915050565b61292981611adf565b82525050565b60006040820190506129446000830185612264565b6129516020830184612920565b9392505050565b60006020828403121561296e5761296d611414565b5b600082015167ffffffffffffffff81111561298c5761298b611419565b5b61299884828501612540565b91505092915050565b6129aa81611c03565b82525050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126129dc576129db6129ba565b5b83810192508235915060208301925067ffffffffffffffff821115612a0457612a036129b0565b5b600182023603831315612a1a57612a196129b5565b5b509250929050565b6000612a2e8385611e22565b9350612a3b838584611611565b612a44836114ef565b840190509392505050565b6000612a5e6020840184611c2e565b905092915050565b600081359050612a75816128c7565b92915050565b6000612a8a6020840184612a66565b905092915050565b612a9b81611a72565b82525050565b600060a08301612ab460008401846129bf565b8583036000870152612ac7838284612a22565b92505050612ad86020840184612a4f565b612ae56020860182611d32565b50612af36040840184612a4f565b612b006040860182611d32565b50612b0e6060840184612a7b565b612b1b6060860182612a92565b50612b296080840184612a7b565b612b366080860182612a92565b508091505092915050565b60006080820190508181036000830152612b5b81876120cc565b9050612b6a60208301866129a1565b612b7760408301856129a1565b8181036060830152612b898184612aa1565b905095945050505050565b600067ffffffffffffffff821115612baf57612bae611565565b5b602082029050602081019050919050565b600081519050612bcf81611c17565b92915050565b600060408284031215612beb57612bea61234d565b5b612bf560406115c5565b90506000612c05848285016123f8565b6000830152506020612c1984828501612424565b60208301525092915050565b600060608284031215612c3b57612c3a61234d565b5b612c4560406115c5565b90506000612c5584828501612bc0565b6000830152506020612c6984828501612bd5565b60208301525092915050565b6000612c88612c8384612b94565b6115c5565b90508083825260208201905060608402830185811115612cab57612caa6123f3565b5b835b81811015612cd45780612cc08882612c25565b845260208401935050606081019050612cad565b5050509392505050565b600082601f830112612cf357612cf261155b565b5b8151612d03848260208601612c75565b91505092915050565b600067ffffffffffffffff821115612d2757612d26611565565b5b612d30826114ef565b9050602081019050919050565b6000612d50612d4b84612d0c565b6115c5565b905082815260208101848484011115612d6c57612d6b611560565b5b612d778482856114c5565b509392505050565b600082601f830112612d9457612d9361155b565b5b8151612da4848260208601612d3d565b91505092915050565b600060408284031215612dc357612dc261234d565b5b612dcd60406115c5565b9050600082015167ffffffffffffffff811115612ded57612dec612352565b5b612df984828501612d7f565b6000830152506020612e0d84828501612bc0565b60208301525092915050565b60008060408385031215612e3057612e2f611414565b5b600083015167ffffffffffffffff811115612e4e57612e4d611419565b5b612e5a85828601612cde565b925050602083015167ffffffffffffffff811115612e7b57612e7a611419565b5b612e8785828601612dad565b9150509250929050565b7f6661696c656420746f2073657420776974686472617720616464726573730000600082015250565b6000612ec7601e836120bb565b9150612ed282612e91565b602082019050919050565b60006020820190508181036000830152612ef681612eba565b9050919050565b600067ffffffffffffffff821115612f1857612f17611565565b5b602082029050602081019050919050565b6000612f3c612f3784612efd565b6115c5565b90508083825260208201905060208402830185811115612f5f57612f5e6123f3565b5b835b81811015612fa657805167ffffffffffffffff811115612f8457612f8361155b565b5b808601612f918982612399565b85526020850194505050602081019050612f61565b5050509392505050565b600082601f830112612fc557612fc461155b565b5b8151612fd5848260208601612f29565b91505092915050565b600060208284031215612ff457612ff3611414565b5b600082015167ffffffffffffffff81111561301257613011611419565b5b61301e84828501612fb0565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061306182611aa8565b915061306c83611aa8565b925082820190507fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008112677fffffffffffffff821317156130b0576130af613027565b5b92915050565b6130bf8161175a565b82525050565b60006040820190506130da6000830185612264565b6130e760208301846130b6565b9392505050565b60006130f982611aa8565b915061310483611aa8565b92508282039050677fffffffffffffff81137fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008212171561314857613147613027565b5b92915050565b60006020828403121561316457613163611414565b5b600082015167ffffffffffffffff81111561318257613181611419565b5b61318e84828501612399565b91505092915050565b600067ffffffffffffffff8211156131b2576131b1611565565b5b602082029050602081019050919050565b6000604082840312156131d9576131d861234d565b5b6131e360406115c5565b9050600082015167ffffffffffffffff81111561320357613202612352565b5b61320f84828501612399565b600083015250602082015167ffffffffffffffff81111561323357613232612352565b5b61323f84828501612540565b60208301525092915050565b600061325e61325984613197565b6115c5565b90508083825260208201905060208402830185811115613281576132806123f3565b5b835b818110156132c857805167ffffffffffffffff8111156132a6576132a561155b565b5b8086016132b389826131c3565b85526020850194505050602081019050613283565b5050509392505050565b600082601f8301126132e7576132e661155b565b5b81516132f784826020860161324b565b91505092915050565b6000806040838503121561331757613316611414565b5b600083015167ffffffffffffffff81111561333557613334611419565b5b613341858286016132d2565b925050602083015167ffffffffffffffff81111561336257613361611419565b5b61336e85828601612540565b915050925092905056fea264697066735822122094c0b1594b5e03b34ef443268583ae4b113d8910918409ef8c270372a0e18db764736f6c63430008130033", + "deployedBytecode": "0x60806040526004361061012a5760003560e01c806388b2d581116100ab578063c7804bb51161006f578063c7804bb514610489578063cb85aa0a146104c6578063d0e30db014610503578063d3f831be1461050d578063e0421e391461054a578063e236c7a6146105875761012a565b806388b2d58114610357578063963516e41461039557806398194593146103d2578063b2d178831461040f578063b6a216ae1461044c5761012a565b806361bc221a116100f257806361bc221a1461024c5780636f669da41461027757806378a5dfd1146102b4578063796b96d2146102f15780637c9db0bb1461031a5761012a565b806301b680001461012f5780630c05e9e41461016c578063296c60aa146101a95780632d0ee16a146101d257806346e16d341461020f575b600080fd5b34801561013b57600080fd5b506101566004803603810190610151919061147c565b6105c5565b6040516101639190611539565b60405180910390f35b34801561017857600080fd5b50610193600480360381019061018e9190611690565b61070d565b6040516101a091906118d3565b60405180910390f35b3480156101b557600080fd5b506101d060048036038101906101cb91906118f5565b61079d565b005b3480156101de57600080fd5b506101f960048036038101906101f49190611690565b6108de565b6040516102069190611a50565b60405180910390f35b34801561021b57600080fd5b50610236600480360381019061023191906118f5565b61096c565b6040516102439190611a8d565b60405180910390f35b34801561025857600080fd5b506102616109f6565b60405161026e9190611ac4565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190611b1b565b610a07565b6040516102ab9190611a8d565b60405180910390f35b3480156102c057600080fd5b506102db60048036038101906102d691906118f5565b610a91565b6040516102e89190611be1565b60405180910390f35b3480156102fd57600080fd5b50610318600480360381019061031391906118f5565b610b1e565b005b34801561032657600080fd5b50610341600480360381019061033c9190611690565b610c5f565b60405161034e9190611be1565b60405180910390f35b34801561036357600080fd5b5061037e60048036038101906103799190611c67565b610ce9565b60405161038c929190611ea9565b60405180910390f35b3480156103a157600080fd5b506103bc60048036038101906103b79190611690565b610d87565b6040516103c99190611a8d565b60405180910390f35b3480156103de57600080fd5b506103f960048036038101906103f491906118f5565b610e10565b6040516104069190611a50565b60405180910390f35b34801561041b57600080fd5b5061043660048036038101906104319190611ee0565b610e9f565b6040516104439190611a50565b60405180910390f35b34801561045857600080fd5b50610473600480360381019061046e919061147c565b610ff4565b604051610480919061202d565b60405180910390f35b34801561049557600080fd5b506104b060048036038101906104ab919061207b565b61107e565b6040516104bd9190611a8d565b60405180910390f35b3480156104d257600080fd5b506104ed60048036038101906104e8919061147c565b611196565b6040516104fa9190612105565b60405180910390f35b61050b611220565b005b34801561051957600080fd5b50610534600480360381019061052f9190611690565b611222565b6040516105419190611be1565b60405180910390f35b34801561055657600080fd5b50610571600480360381019061056c9190611690565b6112ac565b60405161057e9190611a50565b60405180910390f35b34801561059357600080fd5b506105ae60048036038101906105a9919061147c565b611338565b6040516105bc92919061222d565b60405180910390f35b606060008061080173ffffffffffffffffffffffffffffffffffffffff16846040516024016105f49190612273565b6040516020818303038152906040527f5431f450000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161067e91906122ca565b600060405180830381855afa9150503d80600081146106b9576040519150601f19603f3d011682016040523d82523d6000602084013e6106be565b606091505b509150915081610703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106fa9061232d565b60405180910390fd5b8092505050919050565b6107156113c5565b61080173ffffffffffffffffffffffffffffffffffffffff166354212a89836040518263ffffffff1660e01b81526004016107509190612105565b600060405180830381865afa15801561076d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906107969190612626565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff1683836040516024016107cb92919061266f565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161085591906122ca565b600060405180830381855af49150503d8060008114610890576040519150601f19603f3d011682016040523d82523d6000602084013e610895565b606091505b50509050806108d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d090612711565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6130846040518363ffffffff1660e01b815260040161091d92919061266f565b6000604051808303816000875af115801561093c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610965919061287e565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9684846040518363ffffffff1660e01b81526004016109ab92919061266f565b6020604051808303816000875af11580156109ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ee91906128f3565b905092915050565b60008054906101000a900460070b81565b600061080173ffffffffffffffffffffffffffffffffffffffff16632efe8a5f84846040518363ffffffff1660e01b8152600401610a4692919061292f565b6020604051808303816000875af1158015610a65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8991906128f3565b905092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff16639ad563b484846040518363ffffffff1660e01b8152600401610ad092919061266f565b600060405180830381865afa158015610aed573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610b169190612958565b905092915050565b600061080173ffffffffffffffffffffffffffffffffffffffff168383604051602401610b4c92919061266f565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610bd691906122ca565b600060405180830381855afa9150503d8060008114610c11576040519150601f19603f3d011682016040523d82523d6000602084013e610c16565b606091505b5050905080610c5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c519061232d565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633dd40f78836040518263ffffffff1660e01b8152600401610c9c9190612105565b600060405180830381865afa158015610cb9573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610ce29190612958565b9050919050565b6060610cf36113e6565b61080173ffffffffffffffffffffffffffffffffffffffff16638f2473ce878787876040518563ffffffff1660e01b8152600401610d349493929190612b41565b600060405180830381865afa158015610d51573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610d7a9190612e19565b9150915094509492505050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9630846040518363ffffffff1660e01b8152600401610dc692919061266f565b6020604051808303816000875af1158015610de5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0991906128f3565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6184846040518363ffffffff1660e01b8152600401610e4f92919061266f565b6000604051808303816000875af1158015610e6e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610e97919061287e565b905092915050565b6060600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9633876040518363ffffffff1660e01b8152600401610ee092919061266f565b6020604051808303816000875af1158015610eff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2391906128f3565b905080610f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5c90612edd565b60405180910390fd5b61080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6185856040518363ffffffff1660e01b8152600401610fa292919061266f565b6000604051808303816000875af1158015610fc1573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610fea919061287e565b9150509392505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663a66cb605836040518263ffffffff1660e01b81526004016110319190612273565b600060405180830381865afa15801561104e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110779190612fde565b9050919050565b600060016000808282829054906101000a900460070b61109e9190613056565b92506101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff16021790555061080173ffffffffffffffffffffffffffffffffffffffff1663ed41d0b684846040518363ffffffff1660e01b81526004016111049291906130c5565b6020604051808303816000875af1158015611123573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114791906128f3565b905060016000808282829054906101000a900460070b61116791906130ee565b92506101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff16021790555092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff16635431f450836040518263ffffffff1660e01b81526004016111d39190612273565b600060405180830381865afa1580156111f0573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611219919061314e565b9050919050565b565b606061080173ffffffffffffffffffffffffffffffffffffffff166385b2d2da836040518263ffffffff1660e01b815260040161125f9190612105565b600060405180830381865afa15801561127c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906112a59190612958565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633ce4e3be836040518263ffffffff1660e01b81526004016112e99190612105565b6000604051808303816000875af1158015611308573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611331919061287e565b9050919050565b60608061080173ffffffffffffffffffffffffffffffffffffffff166354be1a28846040518263ffffffff1660e01b81526004016113769190612273565b600060405180830381865afa158015611393573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906113bc9190613300565b91509150915091565b60405180606001604052806060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006114498261141e565b9050919050565b6114598161143e565b811461146457600080fd5b50565b60008135905061147681611450565b92915050565b60006020828403121561149257611491611414565b5b60006114a084828501611467565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156114e35780820151818401526020810190506114c8565b60008484015250505050565b6000601f19601f8301169050919050565b600061150b826114a9565b61151581856114b4565b93506115258185602086016114c5565b61152e816114ef565b840191505092915050565b600060208201905081810360008301526115538184611500565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61159d826114ef565b810181811067ffffffffffffffff821117156115bc576115bb611565565b5b80604052505050565b60006115cf61140a565b90506115db8282611594565b919050565b600067ffffffffffffffff8211156115fb576115fa611565565b5b611604826114ef565b9050602081019050919050565b82818337600083830152505050565b600061163361162e846115e0565b6115c5565b90508281526020810184848401111561164f5761164e611560565b5b61165a848285611611565b509392505050565b600082601f8301126116775761167661155b565b5b8135611687848260208601611620565b91505092915050565b6000602082840312156116a6576116a5611414565b5b600082013567ffffffffffffffff8111156116c4576116c3611419565b5b6116d084828501611662565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000611700826116d9565b61170a81856116e4565b935061171a8185602086016114c5565b611723816114ef565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000819050919050565b61176d8161175a565b82525050565b600060ff82169050919050565b61178981611773565b82525050565b600060608301600083015184820360008601526117ac82826116f5565b91505060208301516117c16020860182611764565b5060408301516117d46040860182611780565b508091505092915050565b60006117eb838361178f565b905092915050565b6000602082019050919050565b600061180b8261172e565b6118158185611739565b9350836020820285016118278561174a565b8060005b85811015611863578484038952815161184485826117df565b945061184f836117f3565b925060208a0199505060018101905061182b565b50829750879550505050505092915050565b6000606083016000830151848203600086015261189282826116f5565b915050602083015184820360208601526118ac8282611800565b915050604083015184820360408601526118c68282611800565b9150508091505092915050565b600060208201905081810360008301526118ed8184611875565b905092915050565b6000806040838503121561190c5761190b611414565b5b600061191a85828601611467565b925050602083013567ffffffffffffffff81111561193b5761193a611419565b5b61194785828601611662565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000604083016000830151848203600086015261199a82826116f5565b91505060208301516119af6020860182611764565b508091505092915050565b60006119c6838361197d565b905092915050565b6000602082019050919050565b60006119e682611951565b6119f0818561195c565b935083602082028501611a028561196d565b8060005b85811015611a3e5784840389528151611a1f85826119ba565b9450611a2a836119ce565b925060208a01995050600181019050611a06565b50829750879550505050505092915050565b60006020820190508181036000830152611a6a81846119db565b905092915050565b60008115159050919050565b611a8781611a72565b82525050565b6000602082019050611aa26000830184611a7e565b92915050565b60008160070b9050919050565b611abe81611aa8565b82525050565b6000602082019050611ad96000830184611ab5565b92915050565b600063ffffffff82169050919050565b611af881611adf565b8114611b0357600080fd5b50565b600081359050611b1581611aef565b92915050565b60008060408385031215611b3257611b31611414565b5b6000611b4085828601611467565b9250506020611b5185828601611b06565b9150509250929050565b600082825260208201905092915050565b6000611b778261172e565b611b818185611b5b565b935083602082028501611b938561174a565b8060005b85811015611bcf5784840389528151611bb085826117df565b9450611bbb836117f3565b925060208a01995050600181019050611b97565b50829750879550505050505092915050565b60006020820190508181036000830152611bfb8184611b6c565b905092915050565b600067ffffffffffffffff82169050919050565b611c2081611c03565b8114611c2b57600080fd5b50565b600081359050611c3d81611c17565b92915050565b600080fd5b600060a08284031215611c5e57611c5d611c43565b5b81905092915050565b60008060008060808587031215611c8157611c80611414565b5b600085013567ffffffffffffffff811115611c9f57611c9e611419565b5b611cab87828801611662565b9450506020611cbc87828801611c2e565b9350506040611ccd87828801611c2e565b925050606085013567ffffffffffffffff811115611cee57611ced611419565b5b611cfa87828801611c48565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611d3b81611c03565b82525050565b604082016000820151611d576000850182611764565b506020820151611d6a6020850182611780565b50505050565b606082016000820151611d866000850182611d32565b506020820151611d996020850182611d41565b50505050565b6000611dab8383611d70565b60608301905092915050565b6000602082019050919050565b6000611dcf82611d06565b611dd98185611d11565b9350611de483611d22565b8060005b83811015611e15578151611dfc8882611d9f565b9750611e0783611db7565b925050600181019050611de8565b5085935050505092915050565b600082825260208201905092915050565b6000611e3e826114a9565b611e488185611e22565b9350611e588185602086016114c5565b611e61816114ef565b840191505092915050565b60006040830160008301518482036000860152611e898282611e33565b9150506020830151611e9e6020860182611d32565b508091505092915050565b60006040820190508181036000830152611ec38185611dc4565b90508181036020830152611ed78184611e6c565b90509392505050565b600080600060608486031215611ef957611ef8611414565b5b600084013567ffffffffffffffff811115611f1757611f16611419565b5b611f2386828701611662565b9350506020611f3486828701611467565b925050604084013567ffffffffffffffff811115611f5557611f54611419565b5b611f6186828701611662565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000611fa383836116f5565b905092915050565b6000602082019050919050565b6000611fc382611f6b565b611fcd8185611f76565b935083602082028501611fdf85611f87565b8060005b8581101561201b5784840389528151611ffc8582611f97565b945061200783611fab565b925060208a01995050600181019050611fe3565b50829750879550505050505092915050565b600060208201905081810360008301526120478184611fb8565b905092915050565b6120588161175a565b811461206357600080fd5b50565b6000813590506120758161204f565b92915050565b6000806040838503121561209257612091611414565b5b60006120a085828601611467565b92505060206120b185828601612066565b9150509250929050565b600082825260208201905092915050565b60006120d7826116d9565b6120e181856120bb565b93506120f18185602086016114c5565b6120fa816114ef565b840191505092915050565b6000602082019050818103600083015261211f81846120cc565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000604083016000830151848203600086015261217082826116f5565b9150506020830151848203602086015261218a8282611800565b9150508091505092915050565b60006121a38383612153565b905092915050565b6000602082019050919050565b60006121c382612127565b6121cd8185612132565b9350836020820285016121df85612143565b8060005b8581101561221b57848403895281516121fc8582612197565b9450612207836121ab565b925060208a019950506001810190506121e3565b50829750879550505050505092915050565b6000604082019050818103600083015261224781856121b8565b9050818103602083015261225b8184611b6c565b90509392505050565b61226d8161143e565b82525050565b60006020820190506122886000830184612264565b92915050565b600081905092915050565b60006122a4826114a9565b6122ae818561228e565b93506122be8185602086016114c5565b80840191505092915050565b60006122d68284612299565b915081905092915050565b7f6661696c65642073746174696343616c6c20746f20707265636f6d70696c6500600082015250565b6000612317601f836120bb565b9150612322826122e1565b602082019050919050565b600060208201905081810360008301526123468161230a565b9050919050565b600080fd5b600080fd5b600061236a612365846115e0565b6115c5565b90508281526020810184848401111561238657612385611560565b5b6123918482856114c5565b509392505050565b600082601f8301126123ae576123ad61155b565b5b81516123be848260208601612357565b91505092915050565b600067ffffffffffffffff8211156123e2576123e1611565565b5b602082029050602081019050919050565b600080fd5b6000815190506124078161204f565b92915050565b61241681611773565b811461242157600080fd5b50565b6000815190506124338161240d565b92915050565b60006060828403121561244f5761244e61234d565b5b61245960606115c5565b9050600082015167ffffffffffffffff81111561247957612478612352565b5b61248584828501612399565b6000830152506020612499848285016123f8565b60208301525060406124ad84828501612424565b60408301525092915050565b60006124cc6124c7846123c7565b6115c5565b905080838252602082019050602084028301858111156124ef576124ee6123f3565b5b835b8181101561253657805167ffffffffffffffff8111156125145761251361155b565b5b8086016125218982612439565b855260208501945050506020810190506124f1565b5050509392505050565b600082601f8301126125555761255461155b565b5b81516125658482602086016124b9565b91505092915050565b6000606082840312156125845761258361234d565b5b61258e60606115c5565b9050600082015167ffffffffffffffff8111156125ae576125ad612352565b5b6125ba84828501612399565b600083015250602082015167ffffffffffffffff8111156125de576125dd612352565b5b6125ea84828501612540565b602083015250604082015167ffffffffffffffff81111561260e5761260d612352565b5b61261a84828501612540565b60408301525092915050565b60006020828403121561263c5761263b611414565b5b600082015167ffffffffffffffff81111561265a57612659611419565b5b6126668482850161256e565b91505092915050565b60006040820190506126846000830185612264565b818103602083015261269681846120cc565b90509392505050565b7f6661696c65642064656c656761746543616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b60006126fb6021836120bb565b91506127068261269f565b604082019050919050565b6000602082019050818103600083015261272a816126ee565b9050919050565b600067ffffffffffffffff82111561274c5761274b611565565b5b602082029050602081019050919050565b6000604082840312156127735761277261234d565b5b61277d60406115c5565b9050600082015167ffffffffffffffff81111561279d5761279c612352565b5b6127a984828501612399565b60008301525060206127bd848285016123f8565b60208301525092915050565b60006127dc6127d784612731565b6115c5565b905080838252602082019050602084028301858111156127ff576127fe6123f3565b5b835b8181101561284657805167ffffffffffffffff8111156128245761282361155b565b5b808601612831898261275d565b85526020850194505050602081019050612801565b5050509392505050565b600082601f8301126128655761286461155b565b5b81516128758482602086016127c9565b91505092915050565b60006020828403121561289457612893611414565b5b600082015167ffffffffffffffff8111156128b2576128b1611419565b5b6128be84828501612850565b91505092915050565b6128d081611a72565b81146128db57600080fd5b50565b6000815190506128ed816128c7565b92915050565b60006020828403121561290957612908611414565b5b6000612917848285016128de565b91505092915050565b61292981611adf565b82525050565b60006040820190506129446000830185612264565b6129516020830184612920565b9392505050565b60006020828403121561296e5761296d611414565b5b600082015167ffffffffffffffff81111561298c5761298b611419565b5b61299884828501612540565b91505092915050565b6129aa81611c03565b82525050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126129dc576129db6129ba565b5b83810192508235915060208301925067ffffffffffffffff821115612a0457612a036129b0565b5b600182023603831315612a1a57612a196129b5565b5b509250929050565b6000612a2e8385611e22565b9350612a3b838584611611565b612a44836114ef565b840190509392505050565b6000612a5e6020840184611c2e565b905092915050565b600081359050612a75816128c7565b92915050565b6000612a8a6020840184612a66565b905092915050565b612a9b81611a72565b82525050565b600060a08301612ab460008401846129bf565b8583036000870152612ac7838284612a22565b92505050612ad86020840184612a4f565b612ae56020860182611d32565b50612af36040840184612a4f565b612b006040860182611d32565b50612b0e6060840184612a7b565b612b1b6060860182612a92565b50612b296080840184612a7b565b612b366080860182612a92565b508091505092915050565b60006080820190508181036000830152612b5b81876120cc565b9050612b6a60208301866129a1565b612b7760408301856129a1565b8181036060830152612b898184612aa1565b905095945050505050565b600067ffffffffffffffff821115612baf57612bae611565565b5b602082029050602081019050919050565b600081519050612bcf81611c17565b92915050565b600060408284031215612beb57612bea61234d565b5b612bf560406115c5565b90506000612c05848285016123f8565b6000830152506020612c1984828501612424565b60208301525092915050565b600060608284031215612c3b57612c3a61234d565b5b612c4560406115c5565b90506000612c5584828501612bc0565b6000830152506020612c6984828501612bd5565b60208301525092915050565b6000612c88612c8384612b94565b6115c5565b90508083825260208201905060608402830185811115612cab57612caa6123f3565b5b835b81811015612cd45780612cc08882612c25565b845260208401935050606081019050612cad565b5050509392505050565b600082601f830112612cf357612cf261155b565b5b8151612d03848260208601612c75565b91505092915050565b600067ffffffffffffffff821115612d2757612d26611565565b5b612d30826114ef565b9050602081019050919050565b6000612d50612d4b84612d0c565b6115c5565b905082815260208101848484011115612d6c57612d6b611560565b5b612d778482856114c5565b509392505050565b600082601f830112612d9457612d9361155b565b5b8151612da4848260208601612d3d565b91505092915050565b600060408284031215612dc357612dc261234d565b5b612dcd60406115c5565b9050600082015167ffffffffffffffff811115612ded57612dec612352565b5b612df984828501612d7f565b6000830152506020612e0d84828501612bc0565b60208301525092915050565b60008060408385031215612e3057612e2f611414565b5b600083015167ffffffffffffffff811115612e4e57612e4d611419565b5b612e5a85828601612cde565b925050602083015167ffffffffffffffff811115612e7b57612e7a611419565b5b612e8785828601612dad565b9150509250929050565b7f6661696c656420746f2073657420776974686472617720616464726573730000600082015250565b6000612ec7601e836120bb565b9150612ed282612e91565b602082019050919050565b60006020820190508181036000830152612ef681612eba565b9050919050565b600067ffffffffffffffff821115612f1857612f17611565565b5b602082029050602081019050919050565b6000612f3c612f3784612efd565b6115c5565b90508083825260208201905060208402830185811115612f5f57612f5e6123f3565b5b835b81811015612fa657805167ffffffffffffffff811115612f8457612f8361155b565b5b808601612f918982612399565b85526020850194505050602081019050612f61565b5050509392505050565b600082601f830112612fc557612fc461155b565b5b8151612fd5848260208601612f29565b91505092915050565b600060208284031215612ff457612ff3611414565b5b600082015167ffffffffffffffff81111561301257613011611419565b5b61301e84828501612fb0565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061306182611aa8565b915061306c83611aa8565b925082820190507fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008112677fffffffffffffff821317156130b0576130af613027565b5b92915050565b6130bf8161175a565b82525050565b60006040820190506130da6000830185612264565b6130e760208301846130b6565b9392505050565b60006130f982611aa8565b915061310483611aa8565b92508282039050677fffffffffffffff81137fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008212171561314857613147613027565b5b92915050565b60006020828403121561316457613163611414565b5b600082015167ffffffffffffffff81111561318257613181611419565b5b61318e84828501612399565b91505092915050565b600067ffffffffffffffff8211156131b2576131b1611565565b5b602082029050602081019050919050565b6000604082840312156131d9576131d861234d565b5b6131e360406115c5565b9050600082015167ffffffffffffffff81111561320357613202612352565b5b61320f84828501612399565b600083015250602082015167ffffffffffffffff81111561323357613232612352565b5b61323f84828501612540565b60208301525092915050565b600061325e61325984613197565b6115c5565b90508083825260208201905060208402830185811115613281576132806123f3565b5b835b818110156132c857805167ffffffffffffffff8111156132a6576132a561155b565b5b8086016132b389826131c3565b85526020850194505050602081019050613283565b5050509392505050565b600082601f8301126132e7576132e661155b565b5b81516132f784826020860161324b565b91505092915050565b6000806040838503121561331757613316611414565b5b600083015167ffffffffffffffff81111561333557613334611419565b5b613341858286016132d2565b925050602083015167ffffffffffffffff81111561336257613361611419565b5b61336e85828601612540565b915050925092905056fea264697066735822122094c0b1594b5e03b34ef443268583ae4b113d8910918409ef8c270372a0e18db764736f6c63430008130033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/precompiles/testutil/contracts/InterchainSender.json b/precompiles/testutil/contracts/InterchainSender.json index d9997ee30e..7aece9429c 100644 --- a/precompiles/testutil/contracts/InterchainSender.json +++ b/precompiles/testutil/contracts/InterchainSender.json @@ -439,8 +439,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b506129bc806100206000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063c595699a11610066578063c595699a14610159578063dfa10f3914610189578063ee5766d9146101ba578063f298e7a8146101ea578063f3675f08146102065761009e565b8063424af9f6146100a35780636fdf23cc146100bf5780637492bdd8146100ef5780637a6185e11461011f578063a363df8414610129575b600080fd5b6100bd60048036038101906100b891906109ca565b610222565b005b6100d960048036038101906100d49190610c6e565b6102fc565b6040516100e69190610dc0565b60405180910390f35b61010960048036038101906101049190610c6e565b61039a565b6040516101169190610dc0565b60405180910390f35b610127610438565b005b610143600480360381019061013e9190610e39565b6104fd565b604051610150919061121c565b60405180910390f35b610173600480360381019061016e919061123e565b61058a565b60405161018091906112d1565b60405180910390f35b6101a3600480360381019061019e9190611317565b610614565b6040516101b1929190611507565b60405180910390f35b6101d460048036038101906101cf919061123e565b6106a8565b6040516101e19190611582565b60405180910390f35b61020460048036038101906101ff91906109ca565b610738565b005b610220600480360381019061021b91906115fa565b610812565b005b600061080273ffffffffffffffffffffffffffffffffffffffff166354de647b308a8a8a8a8a8a8a6040518963ffffffff1660e01b815260040161026d989796959493929190611692565b6020604051808303816000875af115801561028c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102b09190611738565b9050806102f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102e9906117b1565b60405180910390fd5b5050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663632535b98a8a8a8a308b8b8b8b6040518a63ffffffff1660e01b815260040161034999989796959493929190611800565b6020604051808303816000875af1158015610368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038c91906118c6565b905098975050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663632535b98a8a8a8a338b8b8b8b6040518a63ffffffff1660e01b81526004016103e799989796959493929190611800565b6020604051808303816000875af1158015610406573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061042a91906118c6565b905098975050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff166374a8f103306040518263ffffffff1660e01b815260040161047591906118f3565b6020604051808303816000875af1158015610494573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b89190611738565b9050806104fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f19061195a565b60405180910390fd5b50565b606061080273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84846040518363ffffffff1660e01b815260040161053c92919061197a565b600060405180830381865afa158015610559573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906105829190611e4f565b905092915050565b606061080273ffffffffffffffffffffffffffffffffffffffff1663b5cb6e7d836040518263ffffffff1660e01b81526004016105c791906112d1565b600060405180830381865afa1580156105e4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061060d9190611e98565b9050919050565b606061061e6108dd565b61080273ffffffffffffffffffffffffffffffffffffffff166322b6fad6846040518263ffffffff1660e01b81526004016106599190612072565b600060405180830381865afa158015610676573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061069f919061230a565b91509150915091565b6106b0610901565b61080273ffffffffffffffffffffffffffffffffffffffff1663a815cdd9836040518263ffffffff1660e01b81526004016106eb91906112d1565b600060405180830381865afa158015610708573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906107319190612382565b9050919050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663b3f536ec308a8a8a8a8a8a8a6040518963ffffffff1660e01b8152600401610783989796959493929190611692565b6020604051808303816000875af11580156107a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c69190611738565b905080610808576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ff90612417565b60405180910390fd5b5050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663473c90c73085856040518463ffffffff1660e01b8152600401610853939291906128e8565b6020604051808303816000875af1158015610872573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108969190611738565b9050806108d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cf90612966565b60405180910390fd5b505050565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b604051806040016040528060608152602001606081525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126109545761095361092f565b5b8235905067ffffffffffffffff81111561097157610970610934565b5b60208301915083600182028301111561098d5761098c610939565b5b9250929050565b6000819050919050565b6109a781610994565b81146109b257600080fd5b50565b6000813590506109c48161099e565b92915050565b60008060008060008060006080888a0312156109e9576109e8610925565b5b600088013567ffffffffffffffff811115610a0757610a0661092a565b5b610a138a828b0161093e565b9750975050602088013567ffffffffffffffff811115610a3657610a3561092a565b5b610a428a828b0161093e565b9550955050604088013567ffffffffffffffff811115610a6557610a6461092a565b5b610a718a828b0161093e565b93509350506060610a848a828b016109b5565b91505092959891949750929550565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610ae182610a98565b810181811067ffffffffffffffff82111715610b0057610aff610aa9565b5b80604052505050565b6000610b1361091b565b9050610b1f8282610ad8565b919050565b600067ffffffffffffffff821115610b3f57610b3e610aa9565b5b610b4882610a98565b9050602081019050919050565b82818337600083830152505050565b6000610b77610b7284610b24565b610b09565b905082815260208101848484011115610b9357610b92610a93565b5b610b9e848285610b55565b509392505050565b600082601f830112610bbb57610bba61092f565b5b8135610bcb848260208601610b64565b91505092915050565b600080fd5b600080fd5b600067ffffffffffffffff82169050919050565b610bfb81610bde565b8114610c0657600080fd5b50565b600081359050610c1881610bf2565b92915050565b600060408284031215610c3457610c33610bd4565b5b610c3e6040610b09565b90506000610c4e84828501610c09565b6000830152506020610c6284828501610c09565b60208301525092915050565b600080600080600080600080610120898b031215610c8f57610c8e610925565b5b600089013567ffffffffffffffff811115610cad57610cac61092a565b5b610cb98b828c01610ba6565b985050602089013567ffffffffffffffff811115610cda57610cd961092a565b5b610ce68b828c01610ba6565b975050604089013567ffffffffffffffff811115610d0757610d0661092a565b5b610d138b828c01610ba6565b9650506060610d248b828c016109b5565b955050608089013567ffffffffffffffff811115610d4557610d4461092a565b5b610d518b828c01610ba6565b94505060a0610d628b828c01610c1e565b93505060e0610d738b828c01610c09565b92505061010089013567ffffffffffffffff811115610d9557610d9461092a565b5b610da18b828c01610ba6565b9150509295985092959890939650565b610dba81610bde565b82525050565b6000602082019050610dd56000830184610db1565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610e0682610ddb565b9050919050565b610e1681610dfb565b8114610e2157600080fd5b50565b600081359050610e3381610e0d565b92915050565b60008060408385031215610e5057610e4f610925565b5b6000610e5e85828601610e24565b9250506020610e6f85828601610e24565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610edf578082015181840152602081019050610ec4565b60008484015250505050565b6000610ef682610ea5565b610f008185610eb0565b9350610f10818560208601610ec1565b610f1981610a98565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b610f5981610994565b82525050565b60006040830160008301518482036000860152610f7c8282610eeb565b9150506020830151610f916020860182610f50565b508091505092915050565b6000610fa88383610f5f565b905092915050565b6000602082019050919050565b6000610fc882610f24565b610fd28185610f2f565b935083602082028501610fe485610f40565b8060005b8581101561102057848403895281516110018582610f9c565b945061100c83610fb0565b925060208a01995050600181019050610fe8565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061106a8383610eeb565b905092915050565b6000602082019050919050565b600061108a82611032565b611094818561103d565b9350836020820285016110a68561104e565b8060005b858110156110e257848403895281516110c3858261105e565b94506110ce83611072565b925060208a019950506001810190506110aa565b50829750879550505050505092915050565b600060a08301600083015184820360008601526111118282610eeb565b9150506020830151848203602086015261112b8282610eeb565b915050604083015184820360408601526111458282610fbd565b9150506060830151848203606086015261115f828261107f565b91505060808301518482036080860152611179828261107f565b9150508091505092915050565b600061119283836110f4565b905092915050565b6000602082019050919050565b60006111b282610e79565b6111bc8185610e84565b9350836020820285016111ce85610e95565b8060005b8581101561120a57848403895281516111eb8582611186565b94506111f68361119a565b925060208a019950506001810190506111d2565b50829750879550505050505092915050565b6000602082019050818103600083015261123681846111a7565b905092915050565b60006020828403121561125457611253610925565b5b600082013567ffffffffffffffff8111156112725761127161092a565b5b61127e84828501610ba6565b91505092915050565b600082825260208201905092915050565b60006112a382610ea5565b6112ad8185611287565b93506112bd818560208601610ec1565b6112c681610a98565b840191505092915050565b600060208201905081810360008301526112eb8184611298565b905092915050565b600080fd5b600060a0828403121561130e5761130d6112f3565b5b81905092915050565b60006020828403121561132d5761132c610925565b5b600082013567ffffffffffffffff81111561134b5761134a61092a565b5b611357848285016112f8565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060408301600083015184820360008601526113a98282610eeb565b915050602083015184820360208601526113c38282610eeb565b9150508091505092915050565b60006113dc838361138c565b905092915050565b6000602082019050919050565b60006113fc82611360565b611406818561136b565b9350836020820285016114188561137c565b8060005b85811015611454578484038952815161143585826113d0565b9450611440836113e4565b925060208a0199505060018101905061141c565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b600061148d82611466565b6114978185611471565b93506114a7818560208601610ec1565b6114b081610a98565b840191505092915050565b6114c481610bde565b82525050565b600060408301600083015184820360008601526114e78282611482565b91505060208301516114fc60208601826114bb565b508091505092915050565b6000604082019050818103600083015261152181856113f1565b9050818103602083015261153581846114ca565b90509392505050565b6000604083016000830151848203600086015261155b8282610eeb565b915050602083015184820360208601526115758282610eeb565b9150508091505092915050565b6000602082019050818103600083015261159c818461153e565b905092915050565b60008083601f8401126115ba576115b961092f565b5b8235905067ffffffffffffffff8111156115d7576115d6610934565b5b6020830191508360208202830111156115f3576115f2610939565b5b9250929050565b6000806020838503121561161157611610610925565b5b600083013567ffffffffffffffff81111561162f5761162e61092a565b5b61163b858286016115a4565b92509250509250929050565b61165081610dfb565b82525050565b60006116628385611287565b935061166f838584610b55565b61167883610a98565b840190509392505050565b61168c81610994565b82525050565b600060a0820190506116a7600083018b611647565b81810360208301526116ba81898b611656565b905081810360408301526116cf818789611656565b905081810360608301526116e4818587611656565b90506116f36080830184611683565b9998505050505050505050565b60008115159050919050565b61171581611700565b811461172057600080fd5b50565b6000815190506117328161170c565b92915050565b60006020828403121561174e5761174d610925565b5b600061175c84828501611723565b91505092915050565b7f4661696c656420746f20696e63726561736520616c6c6f77616e636500000000600082015250565b600061179b601c83611287565b91506117a682611765565b602082019050919050565b600060208201905081810360008301526117ca8161178e565b9050919050565b6040820160008201516117e760008501826114bb565b5060208201516117fa60208501826114bb565b50505050565b600061014082019050818103600083015261181b818c611298565b9050818103602083015261182f818b611298565b90508181036040830152611843818a611298565b90506118526060830189611683565b61185f6080830188611647565b81810360a08301526118718187611298565b905061188060c08301866117d1565b61188e610100830185610db1565b8181036101208301526118a18184611298565b90509a9950505050505050505050565b6000815190506118c081610bf2565b92915050565b6000602082840312156118dc576118db610925565b5b60006118ea848285016118b1565b91505092915050565b60006020820190506119086000830184611647565b92915050565b7f4661696c656420746f207265766f6b6520617070726f76616c00000000000000600082015250565b6000611944601983611287565b915061194f8261190e565b602082019050919050565b6000602082019050818103600083015261197381611937565b9050919050565b600060408201905061198f6000830185611647565b61199c6020830184611647565b9392505050565b600067ffffffffffffffff8211156119be576119bd610aa9565b5b602082029050602081019050919050565b60006119e26119dd84610b24565b610b09565b9050828152602081018484840111156119fe576119fd610a93565b5b611a09848285610ec1565b509392505050565b600082601f830112611a2657611a2561092f565b5b8151611a368482602086016119cf565b91505092915050565b600067ffffffffffffffff821115611a5a57611a59610aa9565b5b602082029050602081019050919050565b600081519050611a7a8161099e565b92915050565b600060408284031215611a9657611a95610bd4565b5b611aa06040610b09565b9050600082015167ffffffffffffffff811115611ac057611abf610bd9565b5b611acc84828501611a11565b6000830152506020611ae084828501611a6b565b60208301525092915050565b6000611aff611afa84611a3f565b610b09565b90508083825260208201905060208402830185811115611b2257611b21610939565b5b835b81811015611b6957805167ffffffffffffffff811115611b4757611b4661092f565b5b808601611b548982611a80565b85526020850194505050602081019050611b24565b5050509392505050565b600082601f830112611b8857611b8761092f565b5b8151611b98848260208601611aec565b91505092915050565b600067ffffffffffffffff821115611bbc57611bbb610aa9565b5b602082029050602081019050919050565b6000611be0611bdb84611ba1565b610b09565b90508083825260208201905060208402830185811115611c0357611c02610939565b5b835b81811015611c4a57805167ffffffffffffffff811115611c2857611c2761092f565b5b808601611c358982611a11565b85526020850194505050602081019050611c05565b5050509392505050565b600082601f830112611c6957611c6861092f565b5b8151611c79848260208601611bcd565b91505092915050565b600060a08284031215611c9857611c97610bd4565b5b611ca260a0610b09565b9050600082015167ffffffffffffffff811115611cc257611cc1610bd9565b5b611cce84828501611a11565b600083015250602082015167ffffffffffffffff811115611cf257611cf1610bd9565b5b611cfe84828501611a11565b602083015250604082015167ffffffffffffffff811115611d2257611d21610bd9565b5b611d2e84828501611b73565b604083015250606082015167ffffffffffffffff811115611d5257611d51610bd9565b5b611d5e84828501611c54565b606083015250608082015167ffffffffffffffff811115611d8257611d81610bd9565b5b611d8e84828501611c54565b60808301525092915050565b6000611dad611da8846119a3565b610b09565b90508083825260208201905060208402830185811115611dd057611dcf610939565b5b835b81811015611e1757805167ffffffffffffffff811115611df557611df461092f565b5b808601611e028982611c82565b85526020850194505050602081019050611dd2565b5050509392505050565b600082601f830112611e3657611e3561092f565b5b8151611e46848260208601611d9a565b91505092915050565b600060208284031215611e6557611e64610925565b5b600082015167ffffffffffffffff811115611e8357611e8261092a565b5b611e8f84828501611e21565b91505092915050565b600060208284031215611eae57611ead610925565b5b600082015167ffffffffffffffff811115611ecc57611ecb61092a565b5b611ed884828501611a11565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112611f0d57611f0c611eeb565b5b83810192508235915060208301925067ffffffffffffffff821115611f3557611f34611ee1565b5b600182023603831315611f4b57611f4a611ee6565b5b509250929050565b6000611f5f8385611471565b9350611f6c838584610b55565b611f7583610a98565b840190509392505050565b6000611f8f6020840184610c09565b905092915050565b600081359050611fa68161170c565b92915050565b6000611fbb6020840184611f97565b905092915050565b611fcc81611700565b82525050565b600060a08301611fe56000840184611ef0565b8583036000870152611ff8838284611f53565b925050506120096020840184611f80565b61201660208601826114bb565b506120246040840184611f80565b61203160408601826114bb565b5061203f6060840184611fac565b61204c6060860182611fc3565b5061205a6080840184611fac565b6120676080860182611fc3565b508091505092915050565b6000602082019050818103600083015261208c8184611fd2565b905092915050565b600067ffffffffffffffff8211156120af576120ae610aa9565b5b602082029050602081019050919050565b6000604082840312156120d6576120d5610bd4565b5b6120e06040610b09565b9050600082015167ffffffffffffffff811115612100576120ff610bd9565b5b61210c84828501611a11565b600083015250602082015167ffffffffffffffff8111156121305761212f610bd9565b5b61213c84828501611a11565b60208301525092915050565b600061215b61215684612094565b610b09565b9050808382526020820190506020840283018581111561217e5761217d610939565b5b835b818110156121c557805167ffffffffffffffff8111156121a3576121a261092f565b5b8086016121b089826120c0565b85526020850194505050602081019050612180565b5050509392505050565b600082601f8301126121e4576121e361092f565b5b81516121f4848260208601612148565b91505092915050565b600067ffffffffffffffff82111561221857612217610aa9565b5b61222182610a98565b9050602081019050919050565b600061224161223c846121fd565b610b09565b90508281526020810184848401111561225d5761225c610a93565b5b612268848285610ec1565b509392505050565b600082601f8301126122855761228461092f565b5b815161229584826020860161222e565b91505092915050565b6000604082840312156122b4576122b3610bd4565b5b6122be6040610b09565b9050600082015167ffffffffffffffff8111156122de576122dd610bd9565b5b6122ea84828501612270565b60008301525060206122fe848285016118b1565b60208301525092915050565b6000806040838503121561232157612320610925565b5b600083015167ffffffffffffffff81111561233f5761233e61092a565b5b61234b858286016121cf565b925050602083015167ffffffffffffffff81111561236c5761236b61092a565b5b6123788582860161229e565b9150509250929050565b60006020828403121561239857612397610925565b5b600082015167ffffffffffffffff8111156123b6576123b561092a565b5b6123c2848285016120c0565b91505092915050565b7f4661696c656420746f20646563726561736520616c6c6f77616e636500000000600082015250565b6000612401601c83611287565b915061240c826123cb565b602082019050919050565b60006020820190508181036000830152612430816123f4565b9050919050565b6000819050919050565b6000808335600160200384360303811261245e5761245d611eeb565b5b83810192508235915060208301925067ffffffffffffffff82111561248657612485611ee1565b5b60018202360383131561249c5761249b611ee6565b5b509250929050565b60006124b08385610eb0565b93506124bd838584610b55565b6124c683610a98565b840190509392505050565b600080833560016020038436030381126124ee576124ed611eeb565b5b83810192508235915060208301925067ffffffffffffffff82111561251657612515611ee1565b5b60208202360383131561252c5761252b611ee6565b5b509250929050565b6000819050919050565b600061254d60208401846109b5565b905092915050565b6000604083016125686000840184612441565b858303600087015261257b8382846124a4565b9250505061258c602084018461253e565b6125996020860182610f50565b508091505092915050565b60006125b08383612555565b905092915050565b6000823560016040038336030381126125d4576125d3611eeb565b5b82810191505092915050565b6000602082019050919050565b60006125f98385610f2f565b93508360208402850161260b84612534565b8060005b8781101561264f57848403895261262682846125b8565b61263085826125a4565b945061263b836125e0565b925060208a0199505060018101905061260f565b50829750879450505050509392505050565b6000808335600160200384360303811261267e5761267d611eeb565b5b83810192508235915060208301925067ffffffffffffffff8211156126a6576126a5611ee1565b5b6020820236038313156126bc576126bb611ee6565b5b509250929050565b6000819050919050565b60006126db8484846124a4565b90509392505050565b6000602082019050919050565b60006126fd838561103d565b93508360208402850161270f846126c4565b8060005b8781101561275557848403895261272a8284612441565b6127358682846126ce565b9550612740846126e4565b935060208b019a505050600181019050612713565b50829750879450505050509392505050565b600060a0830161277a6000840184612441565b858303600087015261278d8382846124a4565b9250505061279e6020840184612441565b85830360208701526127b18382846124a4565b925050506127c260408401846124d1565b85830360408701526127d58382846125ed565b925050506127e66060840184612661565b85830360608701526127f98382846126f1565b9250505061280a6080840184612661565b858303608087015261281d8382846126f1565b925050508091505092915050565b60006128378383612767565b905092915050565b60008235600160a00383360303811261285b5761285a611eeb565b5b82810191505092915050565b6000602082019050919050565b60006128808385610e84565b93508360208402850161289284612437565b8060005b878110156128d65784840389526128ad828461283f565b6128b7858261282b565b94506128c283612867565b925060208a01995050600181019050612896565b50829750879450505050509392505050565b60006040820190506128fd6000830186611647565b8181036020830152612910818486612874565b9050949350505050565b7f4661696c656420746f20706572666f726d20617070726f76616c000000000000600082015250565b6000612950601a83611287565b915061295b8261291a565b602082019050919050565b6000602082019050818103600083015261297f81612943565b905091905056fea2646970667358221220c4fc8b3e524383362758b87771ae0378dd1bdaf5bd1bf9813a42e171bcc4f96864736f6c63430008120033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061009e5760003560e01c8063c595699a11610066578063c595699a14610159578063dfa10f3914610189578063ee5766d9146101ba578063f298e7a8146101ea578063f3675f08146102065761009e565b8063424af9f6146100a35780636fdf23cc146100bf5780637492bdd8146100ef5780637a6185e11461011f578063a363df8414610129575b600080fd5b6100bd60048036038101906100b891906109ca565b610222565b005b6100d960048036038101906100d49190610c6e565b6102fc565b6040516100e69190610dc0565b60405180910390f35b61010960048036038101906101049190610c6e565b61039a565b6040516101169190610dc0565b60405180910390f35b610127610438565b005b610143600480360381019061013e9190610e39565b6104fd565b604051610150919061121c565b60405180910390f35b610173600480360381019061016e919061123e565b61058a565b60405161018091906112d1565b60405180910390f35b6101a3600480360381019061019e9190611317565b610614565b6040516101b1929190611507565b60405180910390f35b6101d460048036038101906101cf919061123e565b6106a8565b6040516101e19190611582565b60405180910390f35b61020460048036038101906101ff91906109ca565b610738565b005b610220600480360381019061021b91906115fa565b610812565b005b600061080273ffffffffffffffffffffffffffffffffffffffff166354de647b308a8a8a8a8a8a8a6040518963ffffffff1660e01b815260040161026d989796959493929190611692565b6020604051808303816000875af115801561028c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102b09190611738565b9050806102f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102e9906117b1565b60405180910390fd5b5050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663632535b98a8a8a8a308b8b8b8b6040518a63ffffffff1660e01b815260040161034999989796959493929190611800565b6020604051808303816000875af1158015610368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038c91906118c6565b905098975050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663632535b98a8a8a8a338b8b8b8b6040518a63ffffffff1660e01b81526004016103e799989796959493929190611800565b6020604051808303816000875af1158015610406573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061042a91906118c6565b905098975050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff166374a8f103306040518263ffffffff1660e01b815260040161047591906118f3565b6020604051808303816000875af1158015610494573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b89190611738565b9050806104fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f19061195a565b60405180910390fd5b50565b606061080273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84846040518363ffffffff1660e01b815260040161053c92919061197a565b600060405180830381865afa158015610559573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906105829190611e4f565b905092915050565b606061080273ffffffffffffffffffffffffffffffffffffffff1663b5cb6e7d836040518263ffffffff1660e01b81526004016105c791906112d1565b600060405180830381865afa1580156105e4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061060d9190611e98565b9050919050565b606061061e6108dd565b61080273ffffffffffffffffffffffffffffffffffffffff166322b6fad6846040518263ffffffff1660e01b81526004016106599190612072565b600060405180830381865afa158015610676573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061069f919061230a565b91509150915091565b6106b0610901565b61080273ffffffffffffffffffffffffffffffffffffffff1663a815cdd9836040518263ffffffff1660e01b81526004016106eb91906112d1565b600060405180830381865afa158015610708573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906107319190612382565b9050919050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663b3f536ec308a8a8a8a8a8a8a6040518963ffffffff1660e01b8152600401610783989796959493929190611692565b6020604051808303816000875af11580156107a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c69190611738565b905080610808576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ff90612417565b60405180910390fd5b5050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663473c90c73085856040518463ffffffff1660e01b8152600401610853939291906128e8565b6020604051808303816000875af1158015610872573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108969190611738565b9050806108d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cf90612966565b60405180910390fd5b505050565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b604051806040016040528060608152602001606081525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126109545761095361092f565b5b8235905067ffffffffffffffff81111561097157610970610934565b5b60208301915083600182028301111561098d5761098c610939565b5b9250929050565b6000819050919050565b6109a781610994565b81146109b257600080fd5b50565b6000813590506109c48161099e565b92915050565b60008060008060008060006080888a0312156109e9576109e8610925565b5b600088013567ffffffffffffffff811115610a0757610a0661092a565b5b610a138a828b0161093e565b9750975050602088013567ffffffffffffffff811115610a3657610a3561092a565b5b610a428a828b0161093e565b9550955050604088013567ffffffffffffffff811115610a6557610a6461092a565b5b610a718a828b0161093e565b93509350506060610a848a828b016109b5565b91505092959891949750929550565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610ae182610a98565b810181811067ffffffffffffffff82111715610b0057610aff610aa9565b5b80604052505050565b6000610b1361091b565b9050610b1f8282610ad8565b919050565b600067ffffffffffffffff821115610b3f57610b3e610aa9565b5b610b4882610a98565b9050602081019050919050565b82818337600083830152505050565b6000610b77610b7284610b24565b610b09565b905082815260208101848484011115610b9357610b92610a93565b5b610b9e848285610b55565b509392505050565b600082601f830112610bbb57610bba61092f565b5b8135610bcb848260208601610b64565b91505092915050565b600080fd5b600080fd5b600067ffffffffffffffff82169050919050565b610bfb81610bde565b8114610c0657600080fd5b50565b600081359050610c1881610bf2565b92915050565b600060408284031215610c3457610c33610bd4565b5b610c3e6040610b09565b90506000610c4e84828501610c09565b6000830152506020610c6284828501610c09565b60208301525092915050565b600080600080600080600080610120898b031215610c8f57610c8e610925565b5b600089013567ffffffffffffffff811115610cad57610cac61092a565b5b610cb98b828c01610ba6565b985050602089013567ffffffffffffffff811115610cda57610cd961092a565b5b610ce68b828c01610ba6565b975050604089013567ffffffffffffffff811115610d0757610d0661092a565b5b610d138b828c01610ba6565b9650506060610d248b828c016109b5565b955050608089013567ffffffffffffffff811115610d4557610d4461092a565b5b610d518b828c01610ba6565b94505060a0610d628b828c01610c1e565b93505060e0610d738b828c01610c09565b92505061010089013567ffffffffffffffff811115610d9557610d9461092a565b5b610da18b828c01610ba6565b9150509295985092959890939650565b610dba81610bde565b82525050565b6000602082019050610dd56000830184610db1565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610e0682610ddb565b9050919050565b610e1681610dfb565b8114610e2157600080fd5b50565b600081359050610e3381610e0d565b92915050565b60008060408385031215610e5057610e4f610925565b5b6000610e5e85828601610e24565b9250506020610e6f85828601610e24565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610edf578082015181840152602081019050610ec4565b60008484015250505050565b6000610ef682610ea5565b610f008185610eb0565b9350610f10818560208601610ec1565b610f1981610a98565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b610f5981610994565b82525050565b60006040830160008301518482036000860152610f7c8282610eeb565b9150506020830151610f916020860182610f50565b508091505092915050565b6000610fa88383610f5f565b905092915050565b6000602082019050919050565b6000610fc882610f24565b610fd28185610f2f565b935083602082028501610fe485610f40565b8060005b8581101561102057848403895281516110018582610f9c565b945061100c83610fb0565b925060208a01995050600181019050610fe8565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061106a8383610eeb565b905092915050565b6000602082019050919050565b600061108a82611032565b611094818561103d565b9350836020820285016110a68561104e565b8060005b858110156110e257848403895281516110c3858261105e565b94506110ce83611072565b925060208a019950506001810190506110aa565b50829750879550505050505092915050565b600060a08301600083015184820360008601526111118282610eeb565b9150506020830151848203602086015261112b8282610eeb565b915050604083015184820360408601526111458282610fbd565b9150506060830151848203606086015261115f828261107f565b91505060808301518482036080860152611179828261107f565b9150508091505092915050565b600061119283836110f4565b905092915050565b6000602082019050919050565b60006111b282610e79565b6111bc8185610e84565b9350836020820285016111ce85610e95565b8060005b8581101561120a57848403895281516111eb8582611186565b94506111f68361119a565b925060208a019950506001810190506111d2565b50829750879550505050505092915050565b6000602082019050818103600083015261123681846111a7565b905092915050565b60006020828403121561125457611253610925565b5b600082013567ffffffffffffffff8111156112725761127161092a565b5b61127e84828501610ba6565b91505092915050565b600082825260208201905092915050565b60006112a382610ea5565b6112ad8185611287565b93506112bd818560208601610ec1565b6112c681610a98565b840191505092915050565b600060208201905081810360008301526112eb8184611298565b905092915050565b600080fd5b600060a0828403121561130e5761130d6112f3565b5b81905092915050565b60006020828403121561132d5761132c610925565b5b600082013567ffffffffffffffff81111561134b5761134a61092a565b5b611357848285016112f8565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060408301600083015184820360008601526113a98282610eeb565b915050602083015184820360208601526113c38282610eeb565b9150508091505092915050565b60006113dc838361138c565b905092915050565b6000602082019050919050565b60006113fc82611360565b611406818561136b565b9350836020820285016114188561137c565b8060005b85811015611454578484038952815161143585826113d0565b9450611440836113e4565b925060208a0199505060018101905061141c565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b600061148d82611466565b6114978185611471565b93506114a7818560208601610ec1565b6114b081610a98565b840191505092915050565b6114c481610bde565b82525050565b600060408301600083015184820360008601526114e78282611482565b91505060208301516114fc60208601826114bb565b508091505092915050565b6000604082019050818103600083015261152181856113f1565b9050818103602083015261153581846114ca565b90509392505050565b6000604083016000830151848203600086015261155b8282610eeb565b915050602083015184820360208601526115758282610eeb565b9150508091505092915050565b6000602082019050818103600083015261159c818461153e565b905092915050565b60008083601f8401126115ba576115b961092f565b5b8235905067ffffffffffffffff8111156115d7576115d6610934565b5b6020830191508360208202830111156115f3576115f2610939565b5b9250929050565b6000806020838503121561161157611610610925565b5b600083013567ffffffffffffffff81111561162f5761162e61092a565b5b61163b858286016115a4565b92509250509250929050565b61165081610dfb565b82525050565b60006116628385611287565b935061166f838584610b55565b61167883610a98565b840190509392505050565b61168c81610994565b82525050565b600060a0820190506116a7600083018b611647565b81810360208301526116ba81898b611656565b905081810360408301526116cf818789611656565b905081810360608301526116e4818587611656565b90506116f36080830184611683565b9998505050505050505050565b60008115159050919050565b61171581611700565b811461172057600080fd5b50565b6000815190506117328161170c565b92915050565b60006020828403121561174e5761174d610925565b5b600061175c84828501611723565b91505092915050565b7f4661696c656420746f20696e63726561736520616c6c6f77616e636500000000600082015250565b600061179b601c83611287565b91506117a682611765565b602082019050919050565b600060208201905081810360008301526117ca8161178e565b9050919050565b6040820160008201516117e760008501826114bb565b5060208201516117fa60208501826114bb565b50505050565b600061014082019050818103600083015261181b818c611298565b9050818103602083015261182f818b611298565b90508181036040830152611843818a611298565b90506118526060830189611683565b61185f6080830188611647565b81810360a08301526118718187611298565b905061188060c08301866117d1565b61188e610100830185610db1565b8181036101208301526118a18184611298565b90509a9950505050505050505050565b6000815190506118c081610bf2565b92915050565b6000602082840312156118dc576118db610925565b5b60006118ea848285016118b1565b91505092915050565b60006020820190506119086000830184611647565b92915050565b7f4661696c656420746f207265766f6b6520617070726f76616c00000000000000600082015250565b6000611944601983611287565b915061194f8261190e565b602082019050919050565b6000602082019050818103600083015261197381611937565b9050919050565b600060408201905061198f6000830185611647565b61199c6020830184611647565b9392505050565b600067ffffffffffffffff8211156119be576119bd610aa9565b5b602082029050602081019050919050565b60006119e26119dd84610b24565b610b09565b9050828152602081018484840111156119fe576119fd610a93565b5b611a09848285610ec1565b509392505050565b600082601f830112611a2657611a2561092f565b5b8151611a368482602086016119cf565b91505092915050565b600067ffffffffffffffff821115611a5a57611a59610aa9565b5b602082029050602081019050919050565b600081519050611a7a8161099e565b92915050565b600060408284031215611a9657611a95610bd4565b5b611aa06040610b09565b9050600082015167ffffffffffffffff811115611ac057611abf610bd9565b5b611acc84828501611a11565b6000830152506020611ae084828501611a6b565b60208301525092915050565b6000611aff611afa84611a3f565b610b09565b90508083825260208201905060208402830185811115611b2257611b21610939565b5b835b81811015611b6957805167ffffffffffffffff811115611b4757611b4661092f565b5b808601611b548982611a80565b85526020850194505050602081019050611b24565b5050509392505050565b600082601f830112611b8857611b8761092f565b5b8151611b98848260208601611aec565b91505092915050565b600067ffffffffffffffff821115611bbc57611bbb610aa9565b5b602082029050602081019050919050565b6000611be0611bdb84611ba1565b610b09565b90508083825260208201905060208402830185811115611c0357611c02610939565b5b835b81811015611c4a57805167ffffffffffffffff811115611c2857611c2761092f565b5b808601611c358982611a11565b85526020850194505050602081019050611c05565b5050509392505050565b600082601f830112611c6957611c6861092f565b5b8151611c79848260208601611bcd565b91505092915050565b600060a08284031215611c9857611c97610bd4565b5b611ca260a0610b09565b9050600082015167ffffffffffffffff811115611cc257611cc1610bd9565b5b611cce84828501611a11565b600083015250602082015167ffffffffffffffff811115611cf257611cf1610bd9565b5b611cfe84828501611a11565b602083015250604082015167ffffffffffffffff811115611d2257611d21610bd9565b5b611d2e84828501611b73565b604083015250606082015167ffffffffffffffff811115611d5257611d51610bd9565b5b611d5e84828501611c54565b606083015250608082015167ffffffffffffffff811115611d8257611d81610bd9565b5b611d8e84828501611c54565b60808301525092915050565b6000611dad611da8846119a3565b610b09565b90508083825260208201905060208402830185811115611dd057611dcf610939565b5b835b81811015611e1757805167ffffffffffffffff811115611df557611df461092f565b5b808601611e028982611c82565b85526020850194505050602081019050611dd2565b5050509392505050565b600082601f830112611e3657611e3561092f565b5b8151611e46848260208601611d9a565b91505092915050565b600060208284031215611e6557611e64610925565b5b600082015167ffffffffffffffff811115611e8357611e8261092a565b5b611e8f84828501611e21565b91505092915050565b600060208284031215611eae57611ead610925565b5b600082015167ffffffffffffffff811115611ecc57611ecb61092a565b5b611ed884828501611a11565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112611f0d57611f0c611eeb565b5b83810192508235915060208301925067ffffffffffffffff821115611f3557611f34611ee1565b5b600182023603831315611f4b57611f4a611ee6565b5b509250929050565b6000611f5f8385611471565b9350611f6c838584610b55565b611f7583610a98565b840190509392505050565b6000611f8f6020840184610c09565b905092915050565b600081359050611fa68161170c565b92915050565b6000611fbb6020840184611f97565b905092915050565b611fcc81611700565b82525050565b600060a08301611fe56000840184611ef0565b8583036000870152611ff8838284611f53565b925050506120096020840184611f80565b61201660208601826114bb565b506120246040840184611f80565b61203160408601826114bb565b5061203f6060840184611fac565b61204c6060860182611fc3565b5061205a6080840184611fac565b6120676080860182611fc3565b508091505092915050565b6000602082019050818103600083015261208c8184611fd2565b905092915050565b600067ffffffffffffffff8211156120af576120ae610aa9565b5b602082029050602081019050919050565b6000604082840312156120d6576120d5610bd4565b5b6120e06040610b09565b9050600082015167ffffffffffffffff811115612100576120ff610bd9565b5b61210c84828501611a11565b600083015250602082015167ffffffffffffffff8111156121305761212f610bd9565b5b61213c84828501611a11565b60208301525092915050565b600061215b61215684612094565b610b09565b9050808382526020820190506020840283018581111561217e5761217d610939565b5b835b818110156121c557805167ffffffffffffffff8111156121a3576121a261092f565b5b8086016121b089826120c0565b85526020850194505050602081019050612180565b5050509392505050565b600082601f8301126121e4576121e361092f565b5b81516121f4848260208601612148565b91505092915050565b600067ffffffffffffffff82111561221857612217610aa9565b5b61222182610a98565b9050602081019050919050565b600061224161223c846121fd565b610b09565b90508281526020810184848401111561225d5761225c610a93565b5b612268848285610ec1565b509392505050565b600082601f8301126122855761228461092f565b5b815161229584826020860161222e565b91505092915050565b6000604082840312156122b4576122b3610bd4565b5b6122be6040610b09565b9050600082015167ffffffffffffffff8111156122de576122dd610bd9565b5b6122ea84828501612270565b60008301525060206122fe848285016118b1565b60208301525092915050565b6000806040838503121561232157612320610925565b5b600083015167ffffffffffffffff81111561233f5761233e61092a565b5b61234b858286016121cf565b925050602083015167ffffffffffffffff81111561236c5761236b61092a565b5b6123788582860161229e565b9150509250929050565b60006020828403121561239857612397610925565b5b600082015167ffffffffffffffff8111156123b6576123b561092a565b5b6123c2848285016120c0565b91505092915050565b7f4661696c656420746f20646563726561736520616c6c6f77616e636500000000600082015250565b6000612401601c83611287565b915061240c826123cb565b602082019050919050565b60006020820190508181036000830152612430816123f4565b9050919050565b6000819050919050565b6000808335600160200384360303811261245e5761245d611eeb565b5b83810192508235915060208301925067ffffffffffffffff82111561248657612485611ee1565b5b60018202360383131561249c5761249b611ee6565b5b509250929050565b60006124b08385610eb0565b93506124bd838584610b55565b6124c683610a98565b840190509392505050565b600080833560016020038436030381126124ee576124ed611eeb565b5b83810192508235915060208301925067ffffffffffffffff82111561251657612515611ee1565b5b60208202360383131561252c5761252b611ee6565b5b509250929050565b6000819050919050565b600061254d60208401846109b5565b905092915050565b6000604083016125686000840184612441565b858303600087015261257b8382846124a4565b9250505061258c602084018461253e565b6125996020860182610f50565b508091505092915050565b60006125b08383612555565b905092915050565b6000823560016040038336030381126125d4576125d3611eeb565b5b82810191505092915050565b6000602082019050919050565b60006125f98385610f2f565b93508360208402850161260b84612534565b8060005b8781101561264f57848403895261262682846125b8565b61263085826125a4565b945061263b836125e0565b925060208a0199505060018101905061260f565b50829750879450505050509392505050565b6000808335600160200384360303811261267e5761267d611eeb565b5b83810192508235915060208301925067ffffffffffffffff8211156126a6576126a5611ee1565b5b6020820236038313156126bc576126bb611ee6565b5b509250929050565b6000819050919050565b60006126db8484846124a4565b90509392505050565b6000602082019050919050565b60006126fd838561103d565b93508360208402850161270f846126c4565b8060005b8781101561275557848403895261272a8284612441565b6127358682846126ce565b9550612740846126e4565b935060208b019a505050600181019050612713565b50829750879450505050509392505050565b600060a0830161277a6000840184612441565b858303600087015261278d8382846124a4565b9250505061279e6020840184612441565b85830360208701526127b18382846124a4565b925050506127c260408401846124d1565b85830360408701526127d58382846125ed565b925050506127e66060840184612661565b85830360608701526127f98382846126f1565b9250505061280a6080840184612661565b858303608087015261281d8382846126f1565b925050508091505092915050565b60006128378383612767565b905092915050565b60008235600160a00383360303811261285b5761285a611eeb565b5b82810191505092915050565b6000602082019050919050565b60006128808385610e84565b93508360208402850161289284612437565b8060005b878110156128d65784840389526128ad828461283f565b6128b7858261282b565b94506128c283612867565b925060208a01995050600181019050612896565b50829750879450505050509392505050565b60006040820190506128fd6000830186611647565b8181036020830152612910818486612874565b9050949350505050565b7f4661696c656420746f20706572666f726d20617070726f76616c000000000000600082015250565b6000612950601a83611287565b915061295b8261291a565b602082019050919050565b6000602082019050818103600083015261297f81612943565b905091905056fea2646970667358221220c4fc8b3e524383362758b87771ae0378dd1bdaf5bd1bf9813a42e171bcc4f96864736f6c63430008120033", + "bytecode": "0x608060405234801561001057600080fd5b506129bc806100206000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063c595699a11610066578063c595699a14610159578063dfa10f3914610189578063ee5766d9146101ba578063f298e7a8146101ea578063f3675f08146102065761009e565b8063424af9f6146100a35780636fdf23cc146100bf5780637492bdd8146100ef5780637a6185e11461011f578063a363df8414610129575b600080fd5b6100bd60048036038101906100b891906109ca565b610222565b005b6100d960048036038101906100d49190610c6e565b6102fc565b6040516100e69190610dc0565b60405180910390f35b61010960048036038101906101049190610c6e565b61039a565b6040516101169190610dc0565b60405180910390f35b610127610438565b005b610143600480360381019061013e9190610e39565b6104fd565b604051610150919061121c565b60405180910390f35b610173600480360381019061016e919061123e565b61058a565b60405161018091906112d1565b60405180910390f35b6101a3600480360381019061019e9190611317565b610614565b6040516101b1929190611507565b60405180910390f35b6101d460048036038101906101cf919061123e565b6106a8565b6040516101e19190611582565b60405180910390f35b61020460048036038101906101ff91906109ca565b610738565b005b610220600480360381019061021b91906115fa565b610812565b005b600061080273ffffffffffffffffffffffffffffffffffffffff166354de647b308a8a8a8a8a8a8a6040518963ffffffff1660e01b815260040161026d989796959493929190611692565b6020604051808303816000875af115801561028c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102b09190611738565b9050806102f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102e9906117b1565b60405180910390fd5b5050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663632535b98a8a8a8a308b8b8b8b6040518a63ffffffff1660e01b815260040161034999989796959493929190611800565b6020604051808303816000875af1158015610368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038c91906118c6565b905098975050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663632535b98a8a8a8a338b8b8b8b6040518a63ffffffff1660e01b81526004016103e799989796959493929190611800565b6020604051808303816000875af1158015610406573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061042a91906118c6565b905098975050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff166374a8f103306040518263ffffffff1660e01b815260040161047591906118f3565b6020604051808303816000875af1158015610494573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b89190611738565b9050806104fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f19061195a565b60405180910390fd5b50565b606061080273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84846040518363ffffffff1660e01b815260040161053c92919061197a565b600060405180830381865afa158015610559573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906105829190611e4f565b905092915050565b606061080273ffffffffffffffffffffffffffffffffffffffff1663b5cb6e7d836040518263ffffffff1660e01b81526004016105c791906112d1565b600060405180830381865afa1580156105e4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061060d9190611e98565b9050919050565b606061061e6108dd565b61080273ffffffffffffffffffffffffffffffffffffffff166322b6fad6846040518263ffffffff1660e01b81526004016106599190612072565b600060405180830381865afa158015610676573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061069f919061230a565b91509150915091565b6106b0610901565b61080273ffffffffffffffffffffffffffffffffffffffff1663a815cdd9836040518263ffffffff1660e01b81526004016106eb91906112d1565b600060405180830381865afa158015610708573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906107319190612382565b9050919050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663b3f536ec308a8a8a8a8a8a8a6040518963ffffffff1660e01b8152600401610783989796959493929190611692565b6020604051808303816000875af11580156107a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c69190611738565b905080610808576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ff90612417565b60405180910390fd5b5050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663473c90c73085856040518463ffffffff1660e01b8152600401610853939291906128e8565b6020604051808303816000875af1158015610872573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108969190611738565b9050806108d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cf90612966565b60405180910390fd5b505050565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b604051806040016040528060608152602001606081525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126109545761095361092f565b5b8235905067ffffffffffffffff81111561097157610970610934565b5b60208301915083600182028301111561098d5761098c610939565b5b9250929050565b6000819050919050565b6109a781610994565b81146109b257600080fd5b50565b6000813590506109c48161099e565b92915050565b60008060008060008060006080888a0312156109e9576109e8610925565b5b600088013567ffffffffffffffff811115610a0757610a0661092a565b5b610a138a828b0161093e565b9750975050602088013567ffffffffffffffff811115610a3657610a3561092a565b5b610a428a828b0161093e565b9550955050604088013567ffffffffffffffff811115610a6557610a6461092a565b5b610a718a828b0161093e565b93509350506060610a848a828b016109b5565b91505092959891949750929550565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610ae182610a98565b810181811067ffffffffffffffff82111715610b0057610aff610aa9565b5b80604052505050565b6000610b1361091b565b9050610b1f8282610ad8565b919050565b600067ffffffffffffffff821115610b3f57610b3e610aa9565b5b610b4882610a98565b9050602081019050919050565b82818337600083830152505050565b6000610b77610b7284610b24565b610b09565b905082815260208101848484011115610b9357610b92610a93565b5b610b9e848285610b55565b509392505050565b600082601f830112610bbb57610bba61092f565b5b8135610bcb848260208601610b64565b91505092915050565b600080fd5b600080fd5b600067ffffffffffffffff82169050919050565b610bfb81610bde565b8114610c0657600080fd5b50565b600081359050610c1881610bf2565b92915050565b600060408284031215610c3457610c33610bd4565b5b610c3e6040610b09565b90506000610c4e84828501610c09565b6000830152506020610c6284828501610c09565b60208301525092915050565b600080600080600080600080610120898b031215610c8f57610c8e610925565b5b600089013567ffffffffffffffff811115610cad57610cac61092a565b5b610cb98b828c01610ba6565b985050602089013567ffffffffffffffff811115610cda57610cd961092a565b5b610ce68b828c01610ba6565b975050604089013567ffffffffffffffff811115610d0757610d0661092a565b5b610d138b828c01610ba6565b9650506060610d248b828c016109b5565b955050608089013567ffffffffffffffff811115610d4557610d4461092a565b5b610d518b828c01610ba6565b94505060a0610d628b828c01610c1e565b93505060e0610d738b828c01610c09565b92505061010089013567ffffffffffffffff811115610d9557610d9461092a565b5b610da18b828c01610ba6565b9150509295985092959890939650565b610dba81610bde565b82525050565b6000602082019050610dd56000830184610db1565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610e0682610ddb565b9050919050565b610e1681610dfb565b8114610e2157600080fd5b50565b600081359050610e3381610e0d565b92915050565b60008060408385031215610e5057610e4f610925565b5b6000610e5e85828601610e24565b9250506020610e6f85828601610e24565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610edf578082015181840152602081019050610ec4565b60008484015250505050565b6000610ef682610ea5565b610f008185610eb0565b9350610f10818560208601610ec1565b610f1981610a98565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b610f5981610994565b82525050565b60006040830160008301518482036000860152610f7c8282610eeb565b9150506020830151610f916020860182610f50565b508091505092915050565b6000610fa88383610f5f565b905092915050565b6000602082019050919050565b6000610fc882610f24565b610fd28185610f2f565b935083602082028501610fe485610f40565b8060005b8581101561102057848403895281516110018582610f9c565b945061100c83610fb0565b925060208a01995050600181019050610fe8565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061106a8383610eeb565b905092915050565b6000602082019050919050565b600061108a82611032565b611094818561103d565b9350836020820285016110a68561104e565b8060005b858110156110e257848403895281516110c3858261105e565b94506110ce83611072565b925060208a019950506001810190506110aa565b50829750879550505050505092915050565b600060a08301600083015184820360008601526111118282610eeb565b9150506020830151848203602086015261112b8282610eeb565b915050604083015184820360408601526111458282610fbd565b9150506060830151848203606086015261115f828261107f565b91505060808301518482036080860152611179828261107f565b9150508091505092915050565b600061119283836110f4565b905092915050565b6000602082019050919050565b60006111b282610e79565b6111bc8185610e84565b9350836020820285016111ce85610e95565b8060005b8581101561120a57848403895281516111eb8582611186565b94506111f68361119a565b925060208a019950506001810190506111d2565b50829750879550505050505092915050565b6000602082019050818103600083015261123681846111a7565b905092915050565b60006020828403121561125457611253610925565b5b600082013567ffffffffffffffff8111156112725761127161092a565b5b61127e84828501610ba6565b91505092915050565b600082825260208201905092915050565b60006112a382610ea5565b6112ad8185611287565b93506112bd818560208601610ec1565b6112c681610a98565b840191505092915050565b600060208201905081810360008301526112eb8184611298565b905092915050565b600080fd5b600060a0828403121561130e5761130d6112f3565b5b81905092915050565b60006020828403121561132d5761132c610925565b5b600082013567ffffffffffffffff81111561134b5761134a61092a565b5b611357848285016112f8565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060408301600083015184820360008601526113a98282610eeb565b915050602083015184820360208601526113c38282610eeb565b9150508091505092915050565b60006113dc838361138c565b905092915050565b6000602082019050919050565b60006113fc82611360565b611406818561136b565b9350836020820285016114188561137c565b8060005b85811015611454578484038952815161143585826113d0565b9450611440836113e4565b925060208a0199505060018101905061141c565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b600061148d82611466565b6114978185611471565b93506114a7818560208601610ec1565b6114b081610a98565b840191505092915050565b6114c481610bde565b82525050565b600060408301600083015184820360008601526114e78282611482565b91505060208301516114fc60208601826114bb565b508091505092915050565b6000604082019050818103600083015261152181856113f1565b9050818103602083015261153581846114ca565b90509392505050565b6000604083016000830151848203600086015261155b8282610eeb565b915050602083015184820360208601526115758282610eeb565b9150508091505092915050565b6000602082019050818103600083015261159c818461153e565b905092915050565b60008083601f8401126115ba576115b961092f565b5b8235905067ffffffffffffffff8111156115d7576115d6610934565b5b6020830191508360208202830111156115f3576115f2610939565b5b9250929050565b6000806020838503121561161157611610610925565b5b600083013567ffffffffffffffff81111561162f5761162e61092a565b5b61163b858286016115a4565b92509250509250929050565b61165081610dfb565b82525050565b60006116628385611287565b935061166f838584610b55565b61167883610a98565b840190509392505050565b61168c81610994565b82525050565b600060a0820190506116a7600083018b611647565b81810360208301526116ba81898b611656565b905081810360408301526116cf818789611656565b905081810360608301526116e4818587611656565b90506116f36080830184611683565b9998505050505050505050565b60008115159050919050565b61171581611700565b811461172057600080fd5b50565b6000815190506117328161170c565b92915050565b60006020828403121561174e5761174d610925565b5b600061175c84828501611723565b91505092915050565b7f4661696c656420746f20696e63726561736520616c6c6f77616e636500000000600082015250565b600061179b601c83611287565b91506117a682611765565b602082019050919050565b600060208201905081810360008301526117ca8161178e565b9050919050565b6040820160008201516117e760008501826114bb565b5060208201516117fa60208501826114bb565b50505050565b600061014082019050818103600083015261181b818c611298565b9050818103602083015261182f818b611298565b90508181036040830152611843818a611298565b90506118526060830189611683565b61185f6080830188611647565b81810360a08301526118718187611298565b905061188060c08301866117d1565b61188e610100830185610db1565b8181036101208301526118a18184611298565b90509a9950505050505050505050565b6000815190506118c081610bf2565b92915050565b6000602082840312156118dc576118db610925565b5b60006118ea848285016118b1565b91505092915050565b60006020820190506119086000830184611647565b92915050565b7f4661696c656420746f207265766f6b6520617070726f76616c00000000000000600082015250565b6000611944601983611287565b915061194f8261190e565b602082019050919050565b6000602082019050818103600083015261197381611937565b9050919050565b600060408201905061198f6000830185611647565b61199c6020830184611647565b9392505050565b600067ffffffffffffffff8211156119be576119bd610aa9565b5b602082029050602081019050919050565b60006119e26119dd84610b24565b610b09565b9050828152602081018484840111156119fe576119fd610a93565b5b611a09848285610ec1565b509392505050565b600082601f830112611a2657611a2561092f565b5b8151611a368482602086016119cf565b91505092915050565b600067ffffffffffffffff821115611a5a57611a59610aa9565b5b602082029050602081019050919050565b600081519050611a7a8161099e565b92915050565b600060408284031215611a9657611a95610bd4565b5b611aa06040610b09565b9050600082015167ffffffffffffffff811115611ac057611abf610bd9565b5b611acc84828501611a11565b6000830152506020611ae084828501611a6b565b60208301525092915050565b6000611aff611afa84611a3f565b610b09565b90508083825260208201905060208402830185811115611b2257611b21610939565b5b835b81811015611b6957805167ffffffffffffffff811115611b4757611b4661092f565b5b808601611b548982611a80565b85526020850194505050602081019050611b24565b5050509392505050565b600082601f830112611b8857611b8761092f565b5b8151611b98848260208601611aec565b91505092915050565b600067ffffffffffffffff821115611bbc57611bbb610aa9565b5b602082029050602081019050919050565b6000611be0611bdb84611ba1565b610b09565b90508083825260208201905060208402830185811115611c0357611c02610939565b5b835b81811015611c4a57805167ffffffffffffffff811115611c2857611c2761092f565b5b808601611c358982611a11565b85526020850194505050602081019050611c05565b5050509392505050565b600082601f830112611c6957611c6861092f565b5b8151611c79848260208601611bcd565b91505092915050565b600060a08284031215611c9857611c97610bd4565b5b611ca260a0610b09565b9050600082015167ffffffffffffffff811115611cc257611cc1610bd9565b5b611cce84828501611a11565b600083015250602082015167ffffffffffffffff811115611cf257611cf1610bd9565b5b611cfe84828501611a11565b602083015250604082015167ffffffffffffffff811115611d2257611d21610bd9565b5b611d2e84828501611b73565b604083015250606082015167ffffffffffffffff811115611d5257611d51610bd9565b5b611d5e84828501611c54565b606083015250608082015167ffffffffffffffff811115611d8257611d81610bd9565b5b611d8e84828501611c54565b60808301525092915050565b6000611dad611da8846119a3565b610b09565b90508083825260208201905060208402830185811115611dd057611dcf610939565b5b835b81811015611e1757805167ffffffffffffffff811115611df557611df461092f565b5b808601611e028982611c82565b85526020850194505050602081019050611dd2565b5050509392505050565b600082601f830112611e3657611e3561092f565b5b8151611e46848260208601611d9a565b91505092915050565b600060208284031215611e6557611e64610925565b5b600082015167ffffffffffffffff811115611e8357611e8261092a565b5b611e8f84828501611e21565b91505092915050565b600060208284031215611eae57611ead610925565b5b600082015167ffffffffffffffff811115611ecc57611ecb61092a565b5b611ed884828501611a11565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112611f0d57611f0c611eeb565b5b83810192508235915060208301925067ffffffffffffffff821115611f3557611f34611ee1565b5b600182023603831315611f4b57611f4a611ee6565b5b509250929050565b6000611f5f8385611471565b9350611f6c838584610b55565b611f7583610a98565b840190509392505050565b6000611f8f6020840184610c09565b905092915050565b600081359050611fa68161170c565b92915050565b6000611fbb6020840184611f97565b905092915050565b611fcc81611700565b82525050565b600060a08301611fe56000840184611ef0565b8583036000870152611ff8838284611f53565b925050506120096020840184611f80565b61201660208601826114bb565b506120246040840184611f80565b61203160408601826114bb565b5061203f6060840184611fac565b61204c6060860182611fc3565b5061205a6080840184611fac565b6120676080860182611fc3565b508091505092915050565b6000602082019050818103600083015261208c8184611fd2565b905092915050565b600067ffffffffffffffff8211156120af576120ae610aa9565b5b602082029050602081019050919050565b6000604082840312156120d6576120d5610bd4565b5b6120e06040610b09565b9050600082015167ffffffffffffffff811115612100576120ff610bd9565b5b61210c84828501611a11565b600083015250602082015167ffffffffffffffff8111156121305761212f610bd9565b5b61213c84828501611a11565b60208301525092915050565b600061215b61215684612094565b610b09565b9050808382526020820190506020840283018581111561217e5761217d610939565b5b835b818110156121c557805167ffffffffffffffff8111156121a3576121a261092f565b5b8086016121b089826120c0565b85526020850194505050602081019050612180565b5050509392505050565b600082601f8301126121e4576121e361092f565b5b81516121f4848260208601612148565b91505092915050565b600067ffffffffffffffff82111561221857612217610aa9565b5b61222182610a98565b9050602081019050919050565b600061224161223c846121fd565b610b09565b90508281526020810184848401111561225d5761225c610a93565b5b612268848285610ec1565b509392505050565b600082601f8301126122855761228461092f565b5b815161229584826020860161222e565b91505092915050565b6000604082840312156122b4576122b3610bd4565b5b6122be6040610b09565b9050600082015167ffffffffffffffff8111156122de576122dd610bd9565b5b6122ea84828501612270565b60008301525060206122fe848285016118b1565b60208301525092915050565b6000806040838503121561232157612320610925565b5b600083015167ffffffffffffffff81111561233f5761233e61092a565b5b61234b858286016121cf565b925050602083015167ffffffffffffffff81111561236c5761236b61092a565b5b6123788582860161229e565b9150509250929050565b60006020828403121561239857612397610925565b5b600082015167ffffffffffffffff8111156123b6576123b561092a565b5b6123c2848285016120c0565b91505092915050565b7f4661696c656420746f20646563726561736520616c6c6f77616e636500000000600082015250565b6000612401601c83611287565b915061240c826123cb565b602082019050919050565b60006020820190508181036000830152612430816123f4565b9050919050565b6000819050919050565b6000808335600160200384360303811261245e5761245d611eeb565b5b83810192508235915060208301925067ffffffffffffffff82111561248657612485611ee1565b5b60018202360383131561249c5761249b611ee6565b5b509250929050565b60006124b08385610eb0565b93506124bd838584610b55565b6124c683610a98565b840190509392505050565b600080833560016020038436030381126124ee576124ed611eeb565b5b83810192508235915060208301925067ffffffffffffffff82111561251657612515611ee1565b5b60208202360383131561252c5761252b611ee6565b5b509250929050565b6000819050919050565b600061254d60208401846109b5565b905092915050565b6000604083016125686000840184612441565b858303600087015261257b8382846124a4565b9250505061258c602084018461253e565b6125996020860182610f50565b508091505092915050565b60006125b08383612555565b905092915050565b6000823560016040038336030381126125d4576125d3611eeb565b5b82810191505092915050565b6000602082019050919050565b60006125f98385610f2f565b93508360208402850161260b84612534565b8060005b8781101561264f57848403895261262682846125b8565b61263085826125a4565b945061263b836125e0565b925060208a0199505060018101905061260f565b50829750879450505050509392505050565b6000808335600160200384360303811261267e5761267d611eeb565b5b83810192508235915060208301925067ffffffffffffffff8211156126a6576126a5611ee1565b5b6020820236038313156126bc576126bb611ee6565b5b509250929050565b6000819050919050565b60006126db8484846124a4565b90509392505050565b6000602082019050919050565b60006126fd838561103d565b93508360208402850161270f846126c4565b8060005b8781101561275557848403895261272a8284612441565b6127358682846126ce565b9550612740846126e4565b935060208b019a505050600181019050612713565b50829750879450505050509392505050565b600060a0830161277a6000840184612441565b858303600087015261278d8382846124a4565b9250505061279e6020840184612441565b85830360208701526127b18382846124a4565b925050506127c260408401846124d1565b85830360408701526127d58382846125ed565b925050506127e66060840184612661565b85830360608701526127f98382846126f1565b9250505061280a6080840184612661565b858303608087015261281d8382846126f1565b925050508091505092915050565b60006128378383612767565b905092915050565b60008235600160a00383360303811261285b5761285a611eeb565b5b82810191505092915050565b6000602082019050919050565b60006128808385610e84565b93508360208402850161289284612437565b8060005b878110156128d65784840389526128ad828461283f565b6128b7858261282b565b94506128c283612867565b925060208a01995050600181019050612896565b50829750879450505050509392505050565b60006040820190506128fd6000830186611647565b8181036020830152612910818486612874565b9050949350505050565b7f4661696c656420746f20706572666f726d20617070726f76616c000000000000600082015250565b6000612950601a83611287565b915061295b8261291a565b602082019050919050565b6000602082019050818103600083015261297f81612943565b905091905056fea2646970667358221220529a2fde619b049468185943bb5bbffc186c5e7297922cf92007dc60d11da84264736f6c63430008130033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061009e5760003560e01c8063c595699a11610066578063c595699a14610159578063dfa10f3914610189578063ee5766d9146101ba578063f298e7a8146101ea578063f3675f08146102065761009e565b8063424af9f6146100a35780636fdf23cc146100bf5780637492bdd8146100ef5780637a6185e11461011f578063a363df8414610129575b600080fd5b6100bd60048036038101906100b891906109ca565b610222565b005b6100d960048036038101906100d49190610c6e565b6102fc565b6040516100e69190610dc0565b60405180910390f35b61010960048036038101906101049190610c6e565b61039a565b6040516101169190610dc0565b60405180910390f35b610127610438565b005b610143600480360381019061013e9190610e39565b6104fd565b604051610150919061121c565b60405180910390f35b610173600480360381019061016e919061123e565b61058a565b60405161018091906112d1565b60405180910390f35b6101a3600480360381019061019e9190611317565b610614565b6040516101b1929190611507565b60405180910390f35b6101d460048036038101906101cf919061123e565b6106a8565b6040516101e19190611582565b60405180910390f35b61020460048036038101906101ff91906109ca565b610738565b005b610220600480360381019061021b91906115fa565b610812565b005b600061080273ffffffffffffffffffffffffffffffffffffffff166354de647b308a8a8a8a8a8a8a6040518963ffffffff1660e01b815260040161026d989796959493929190611692565b6020604051808303816000875af115801561028c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102b09190611738565b9050806102f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102e9906117b1565b60405180910390fd5b5050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663632535b98a8a8a8a308b8b8b8b6040518a63ffffffff1660e01b815260040161034999989796959493929190611800565b6020604051808303816000875af1158015610368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038c91906118c6565b905098975050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663632535b98a8a8a8a338b8b8b8b6040518a63ffffffff1660e01b81526004016103e799989796959493929190611800565b6020604051808303816000875af1158015610406573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061042a91906118c6565b905098975050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff166374a8f103306040518263ffffffff1660e01b815260040161047591906118f3565b6020604051808303816000875af1158015610494573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b89190611738565b9050806104fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f19061195a565b60405180910390fd5b50565b606061080273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84846040518363ffffffff1660e01b815260040161053c92919061197a565b600060405180830381865afa158015610559573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906105829190611e4f565b905092915050565b606061080273ffffffffffffffffffffffffffffffffffffffff1663b5cb6e7d836040518263ffffffff1660e01b81526004016105c791906112d1565b600060405180830381865afa1580156105e4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061060d9190611e98565b9050919050565b606061061e6108dd565b61080273ffffffffffffffffffffffffffffffffffffffff166322b6fad6846040518263ffffffff1660e01b81526004016106599190612072565b600060405180830381865afa158015610676573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061069f919061230a565b91509150915091565b6106b0610901565b61080273ffffffffffffffffffffffffffffffffffffffff1663a815cdd9836040518263ffffffff1660e01b81526004016106eb91906112d1565b600060405180830381865afa158015610708573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906107319190612382565b9050919050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663b3f536ec308a8a8a8a8a8a8a6040518963ffffffff1660e01b8152600401610783989796959493929190611692565b6020604051808303816000875af11580156107a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c69190611738565b905080610808576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ff90612417565b60405180910390fd5b5050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663473c90c73085856040518463ffffffff1660e01b8152600401610853939291906128e8565b6020604051808303816000875af1158015610872573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108969190611738565b9050806108d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cf90612966565b60405180910390fd5b505050565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b604051806040016040528060608152602001606081525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126109545761095361092f565b5b8235905067ffffffffffffffff81111561097157610970610934565b5b60208301915083600182028301111561098d5761098c610939565b5b9250929050565b6000819050919050565b6109a781610994565b81146109b257600080fd5b50565b6000813590506109c48161099e565b92915050565b60008060008060008060006080888a0312156109e9576109e8610925565b5b600088013567ffffffffffffffff811115610a0757610a0661092a565b5b610a138a828b0161093e565b9750975050602088013567ffffffffffffffff811115610a3657610a3561092a565b5b610a428a828b0161093e565b9550955050604088013567ffffffffffffffff811115610a6557610a6461092a565b5b610a718a828b0161093e565b93509350506060610a848a828b016109b5565b91505092959891949750929550565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610ae182610a98565b810181811067ffffffffffffffff82111715610b0057610aff610aa9565b5b80604052505050565b6000610b1361091b565b9050610b1f8282610ad8565b919050565b600067ffffffffffffffff821115610b3f57610b3e610aa9565b5b610b4882610a98565b9050602081019050919050565b82818337600083830152505050565b6000610b77610b7284610b24565b610b09565b905082815260208101848484011115610b9357610b92610a93565b5b610b9e848285610b55565b509392505050565b600082601f830112610bbb57610bba61092f565b5b8135610bcb848260208601610b64565b91505092915050565b600080fd5b600080fd5b600067ffffffffffffffff82169050919050565b610bfb81610bde565b8114610c0657600080fd5b50565b600081359050610c1881610bf2565b92915050565b600060408284031215610c3457610c33610bd4565b5b610c3e6040610b09565b90506000610c4e84828501610c09565b6000830152506020610c6284828501610c09565b60208301525092915050565b600080600080600080600080610120898b031215610c8f57610c8e610925565b5b600089013567ffffffffffffffff811115610cad57610cac61092a565b5b610cb98b828c01610ba6565b985050602089013567ffffffffffffffff811115610cda57610cd961092a565b5b610ce68b828c01610ba6565b975050604089013567ffffffffffffffff811115610d0757610d0661092a565b5b610d138b828c01610ba6565b9650506060610d248b828c016109b5565b955050608089013567ffffffffffffffff811115610d4557610d4461092a565b5b610d518b828c01610ba6565b94505060a0610d628b828c01610c1e565b93505060e0610d738b828c01610c09565b92505061010089013567ffffffffffffffff811115610d9557610d9461092a565b5b610da18b828c01610ba6565b9150509295985092959890939650565b610dba81610bde565b82525050565b6000602082019050610dd56000830184610db1565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610e0682610ddb565b9050919050565b610e1681610dfb565b8114610e2157600080fd5b50565b600081359050610e3381610e0d565b92915050565b60008060408385031215610e5057610e4f610925565b5b6000610e5e85828601610e24565b9250506020610e6f85828601610e24565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610edf578082015181840152602081019050610ec4565b60008484015250505050565b6000610ef682610ea5565b610f008185610eb0565b9350610f10818560208601610ec1565b610f1981610a98565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b610f5981610994565b82525050565b60006040830160008301518482036000860152610f7c8282610eeb565b9150506020830151610f916020860182610f50565b508091505092915050565b6000610fa88383610f5f565b905092915050565b6000602082019050919050565b6000610fc882610f24565b610fd28185610f2f565b935083602082028501610fe485610f40565b8060005b8581101561102057848403895281516110018582610f9c565b945061100c83610fb0565b925060208a01995050600181019050610fe8565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061106a8383610eeb565b905092915050565b6000602082019050919050565b600061108a82611032565b611094818561103d565b9350836020820285016110a68561104e565b8060005b858110156110e257848403895281516110c3858261105e565b94506110ce83611072565b925060208a019950506001810190506110aa565b50829750879550505050505092915050565b600060a08301600083015184820360008601526111118282610eeb565b9150506020830151848203602086015261112b8282610eeb565b915050604083015184820360408601526111458282610fbd565b9150506060830151848203606086015261115f828261107f565b91505060808301518482036080860152611179828261107f565b9150508091505092915050565b600061119283836110f4565b905092915050565b6000602082019050919050565b60006111b282610e79565b6111bc8185610e84565b9350836020820285016111ce85610e95565b8060005b8581101561120a57848403895281516111eb8582611186565b94506111f68361119a565b925060208a019950506001810190506111d2565b50829750879550505050505092915050565b6000602082019050818103600083015261123681846111a7565b905092915050565b60006020828403121561125457611253610925565b5b600082013567ffffffffffffffff8111156112725761127161092a565b5b61127e84828501610ba6565b91505092915050565b600082825260208201905092915050565b60006112a382610ea5565b6112ad8185611287565b93506112bd818560208601610ec1565b6112c681610a98565b840191505092915050565b600060208201905081810360008301526112eb8184611298565b905092915050565b600080fd5b600060a0828403121561130e5761130d6112f3565b5b81905092915050565b60006020828403121561132d5761132c610925565b5b600082013567ffffffffffffffff81111561134b5761134a61092a565b5b611357848285016112f8565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060408301600083015184820360008601526113a98282610eeb565b915050602083015184820360208601526113c38282610eeb565b9150508091505092915050565b60006113dc838361138c565b905092915050565b6000602082019050919050565b60006113fc82611360565b611406818561136b565b9350836020820285016114188561137c565b8060005b85811015611454578484038952815161143585826113d0565b9450611440836113e4565b925060208a0199505060018101905061141c565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b600061148d82611466565b6114978185611471565b93506114a7818560208601610ec1565b6114b081610a98565b840191505092915050565b6114c481610bde565b82525050565b600060408301600083015184820360008601526114e78282611482565b91505060208301516114fc60208601826114bb565b508091505092915050565b6000604082019050818103600083015261152181856113f1565b9050818103602083015261153581846114ca565b90509392505050565b6000604083016000830151848203600086015261155b8282610eeb565b915050602083015184820360208601526115758282610eeb565b9150508091505092915050565b6000602082019050818103600083015261159c818461153e565b905092915050565b60008083601f8401126115ba576115b961092f565b5b8235905067ffffffffffffffff8111156115d7576115d6610934565b5b6020830191508360208202830111156115f3576115f2610939565b5b9250929050565b6000806020838503121561161157611610610925565b5b600083013567ffffffffffffffff81111561162f5761162e61092a565b5b61163b858286016115a4565b92509250509250929050565b61165081610dfb565b82525050565b60006116628385611287565b935061166f838584610b55565b61167883610a98565b840190509392505050565b61168c81610994565b82525050565b600060a0820190506116a7600083018b611647565b81810360208301526116ba81898b611656565b905081810360408301526116cf818789611656565b905081810360608301526116e4818587611656565b90506116f36080830184611683565b9998505050505050505050565b60008115159050919050565b61171581611700565b811461172057600080fd5b50565b6000815190506117328161170c565b92915050565b60006020828403121561174e5761174d610925565b5b600061175c84828501611723565b91505092915050565b7f4661696c656420746f20696e63726561736520616c6c6f77616e636500000000600082015250565b600061179b601c83611287565b91506117a682611765565b602082019050919050565b600060208201905081810360008301526117ca8161178e565b9050919050565b6040820160008201516117e760008501826114bb565b5060208201516117fa60208501826114bb565b50505050565b600061014082019050818103600083015261181b818c611298565b9050818103602083015261182f818b611298565b90508181036040830152611843818a611298565b90506118526060830189611683565b61185f6080830188611647565b81810360a08301526118718187611298565b905061188060c08301866117d1565b61188e610100830185610db1565b8181036101208301526118a18184611298565b90509a9950505050505050505050565b6000815190506118c081610bf2565b92915050565b6000602082840312156118dc576118db610925565b5b60006118ea848285016118b1565b91505092915050565b60006020820190506119086000830184611647565b92915050565b7f4661696c656420746f207265766f6b6520617070726f76616c00000000000000600082015250565b6000611944601983611287565b915061194f8261190e565b602082019050919050565b6000602082019050818103600083015261197381611937565b9050919050565b600060408201905061198f6000830185611647565b61199c6020830184611647565b9392505050565b600067ffffffffffffffff8211156119be576119bd610aa9565b5b602082029050602081019050919050565b60006119e26119dd84610b24565b610b09565b9050828152602081018484840111156119fe576119fd610a93565b5b611a09848285610ec1565b509392505050565b600082601f830112611a2657611a2561092f565b5b8151611a368482602086016119cf565b91505092915050565b600067ffffffffffffffff821115611a5a57611a59610aa9565b5b602082029050602081019050919050565b600081519050611a7a8161099e565b92915050565b600060408284031215611a9657611a95610bd4565b5b611aa06040610b09565b9050600082015167ffffffffffffffff811115611ac057611abf610bd9565b5b611acc84828501611a11565b6000830152506020611ae084828501611a6b565b60208301525092915050565b6000611aff611afa84611a3f565b610b09565b90508083825260208201905060208402830185811115611b2257611b21610939565b5b835b81811015611b6957805167ffffffffffffffff811115611b4757611b4661092f565b5b808601611b548982611a80565b85526020850194505050602081019050611b24565b5050509392505050565b600082601f830112611b8857611b8761092f565b5b8151611b98848260208601611aec565b91505092915050565b600067ffffffffffffffff821115611bbc57611bbb610aa9565b5b602082029050602081019050919050565b6000611be0611bdb84611ba1565b610b09565b90508083825260208201905060208402830185811115611c0357611c02610939565b5b835b81811015611c4a57805167ffffffffffffffff811115611c2857611c2761092f565b5b808601611c358982611a11565b85526020850194505050602081019050611c05565b5050509392505050565b600082601f830112611c6957611c6861092f565b5b8151611c79848260208601611bcd565b91505092915050565b600060a08284031215611c9857611c97610bd4565b5b611ca260a0610b09565b9050600082015167ffffffffffffffff811115611cc257611cc1610bd9565b5b611cce84828501611a11565b600083015250602082015167ffffffffffffffff811115611cf257611cf1610bd9565b5b611cfe84828501611a11565b602083015250604082015167ffffffffffffffff811115611d2257611d21610bd9565b5b611d2e84828501611b73565b604083015250606082015167ffffffffffffffff811115611d5257611d51610bd9565b5b611d5e84828501611c54565b606083015250608082015167ffffffffffffffff811115611d8257611d81610bd9565b5b611d8e84828501611c54565b60808301525092915050565b6000611dad611da8846119a3565b610b09565b90508083825260208201905060208402830185811115611dd057611dcf610939565b5b835b81811015611e1757805167ffffffffffffffff811115611df557611df461092f565b5b808601611e028982611c82565b85526020850194505050602081019050611dd2565b5050509392505050565b600082601f830112611e3657611e3561092f565b5b8151611e46848260208601611d9a565b91505092915050565b600060208284031215611e6557611e64610925565b5b600082015167ffffffffffffffff811115611e8357611e8261092a565b5b611e8f84828501611e21565b91505092915050565b600060208284031215611eae57611ead610925565b5b600082015167ffffffffffffffff811115611ecc57611ecb61092a565b5b611ed884828501611a11565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112611f0d57611f0c611eeb565b5b83810192508235915060208301925067ffffffffffffffff821115611f3557611f34611ee1565b5b600182023603831315611f4b57611f4a611ee6565b5b509250929050565b6000611f5f8385611471565b9350611f6c838584610b55565b611f7583610a98565b840190509392505050565b6000611f8f6020840184610c09565b905092915050565b600081359050611fa68161170c565b92915050565b6000611fbb6020840184611f97565b905092915050565b611fcc81611700565b82525050565b600060a08301611fe56000840184611ef0565b8583036000870152611ff8838284611f53565b925050506120096020840184611f80565b61201660208601826114bb565b506120246040840184611f80565b61203160408601826114bb565b5061203f6060840184611fac565b61204c6060860182611fc3565b5061205a6080840184611fac565b6120676080860182611fc3565b508091505092915050565b6000602082019050818103600083015261208c8184611fd2565b905092915050565b600067ffffffffffffffff8211156120af576120ae610aa9565b5b602082029050602081019050919050565b6000604082840312156120d6576120d5610bd4565b5b6120e06040610b09565b9050600082015167ffffffffffffffff811115612100576120ff610bd9565b5b61210c84828501611a11565b600083015250602082015167ffffffffffffffff8111156121305761212f610bd9565b5b61213c84828501611a11565b60208301525092915050565b600061215b61215684612094565b610b09565b9050808382526020820190506020840283018581111561217e5761217d610939565b5b835b818110156121c557805167ffffffffffffffff8111156121a3576121a261092f565b5b8086016121b089826120c0565b85526020850194505050602081019050612180565b5050509392505050565b600082601f8301126121e4576121e361092f565b5b81516121f4848260208601612148565b91505092915050565b600067ffffffffffffffff82111561221857612217610aa9565b5b61222182610a98565b9050602081019050919050565b600061224161223c846121fd565b610b09565b90508281526020810184848401111561225d5761225c610a93565b5b612268848285610ec1565b509392505050565b600082601f8301126122855761228461092f565b5b815161229584826020860161222e565b91505092915050565b6000604082840312156122b4576122b3610bd4565b5b6122be6040610b09565b9050600082015167ffffffffffffffff8111156122de576122dd610bd9565b5b6122ea84828501612270565b60008301525060206122fe848285016118b1565b60208301525092915050565b6000806040838503121561232157612320610925565b5b600083015167ffffffffffffffff81111561233f5761233e61092a565b5b61234b858286016121cf565b925050602083015167ffffffffffffffff81111561236c5761236b61092a565b5b6123788582860161229e565b9150509250929050565b60006020828403121561239857612397610925565b5b600082015167ffffffffffffffff8111156123b6576123b561092a565b5b6123c2848285016120c0565b91505092915050565b7f4661696c656420746f20646563726561736520616c6c6f77616e636500000000600082015250565b6000612401601c83611287565b915061240c826123cb565b602082019050919050565b60006020820190508181036000830152612430816123f4565b9050919050565b6000819050919050565b6000808335600160200384360303811261245e5761245d611eeb565b5b83810192508235915060208301925067ffffffffffffffff82111561248657612485611ee1565b5b60018202360383131561249c5761249b611ee6565b5b509250929050565b60006124b08385610eb0565b93506124bd838584610b55565b6124c683610a98565b840190509392505050565b600080833560016020038436030381126124ee576124ed611eeb565b5b83810192508235915060208301925067ffffffffffffffff82111561251657612515611ee1565b5b60208202360383131561252c5761252b611ee6565b5b509250929050565b6000819050919050565b600061254d60208401846109b5565b905092915050565b6000604083016125686000840184612441565b858303600087015261257b8382846124a4565b9250505061258c602084018461253e565b6125996020860182610f50565b508091505092915050565b60006125b08383612555565b905092915050565b6000823560016040038336030381126125d4576125d3611eeb565b5b82810191505092915050565b6000602082019050919050565b60006125f98385610f2f565b93508360208402850161260b84612534565b8060005b8781101561264f57848403895261262682846125b8565b61263085826125a4565b945061263b836125e0565b925060208a0199505060018101905061260f565b50829750879450505050509392505050565b6000808335600160200384360303811261267e5761267d611eeb565b5b83810192508235915060208301925067ffffffffffffffff8211156126a6576126a5611ee1565b5b6020820236038313156126bc576126bb611ee6565b5b509250929050565b6000819050919050565b60006126db8484846124a4565b90509392505050565b6000602082019050919050565b60006126fd838561103d565b93508360208402850161270f846126c4565b8060005b8781101561275557848403895261272a8284612441565b6127358682846126ce565b9550612740846126e4565b935060208b019a505050600181019050612713565b50829750879450505050509392505050565b600060a0830161277a6000840184612441565b858303600087015261278d8382846124a4565b9250505061279e6020840184612441565b85830360208701526127b18382846124a4565b925050506127c260408401846124d1565b85830360408701526127d58382846125ed565b925050506127e66060840184612661565b85830360608701526127f98382846126f1565b9250505061280a6080840184612661565b858303608087015261281d8382846126f1565b925050508091505092915050565b60006128378383612767565b905092915050565b60008235600160a00383360303811261285b5761285a611eeb565b5b82810191505092915050565b6000602082019050919050565b60006128808385610e84565b93508360208402850161289284612437565b8060005b878110156128d65784840389526128ad828461283f565b6128b7858261282b565b94506128c283612867565b925060208a01995050600181019050612896565b50829750879450505050509392505050565b60006040820190506128fd6000830186611647565b8181036020830152612910818486612874565b9050949350505050565b7f4661696c656420746f20706572666f726d20617070726f76616c000000000000600082015250565b6000612950601a83611287565b915061295b8261291a565b602082019050919050565b6000602082019050818103600083015261297f81612943565b905091905056fea2646970667358221220529a2fde619b049468185943bb5bbffc186c5e7297922cf92007dc60d11da84264736f6c63430008130033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/precompiles/vesting/Vesting.sol b/precompiles/vesting/VestingI.sol similarity index 100% rename from precompiles/vesting/Vesting.sol rename to precompiles/vesting/VestingI.sol diff --git a/precompiles/vesting/abi.json b/precompiles/vesting/abi.json index 6f6dc6753c..9e83d9a65a 100644 --- a/precompiles/vesting/abi.json +++ b/precompiles/vesting/abi.json @@ -1,488 +1,497 @@ -[ - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "grantee", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "granter", - "type": "address" - }, - { - "indexed": false, - "internalType": "string", - "name": "method", - "type": "string" - } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "funderAddress", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "accountAddress", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "destAddress", - "type": "address" - } - ], - "name": "Clawback", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "vestingAddress", - "type": "address" - } - ], - "name": "ConvertVestingAccount", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "funderAddress", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "vestingAddress", - "type": "address" - } - ], - "name": "CreateClawbackVestingAccount", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "funderAddress", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "vestingAddress", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint64", - "name": "startTime", - "type": "uint64" - }, - { - "components": [ - { - "internalType": "int64", - "name": "length", - "type": "int64" - }, - { - "components": [ - { - "internalType": "string", - "name": "denom", - "type": "string" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct Coin[]", - "name": "amount", - "type": "tuple[]" - } - ], - "indexed": false, - "internalType": "struct Period[]", - "name": "lockupPeriods", - "type": "tuple[]" - }, - { - "components": [ - { - "internalType": "int64", - "name": "length", - "type": "int64" - }, - { - "components": [ - { - "internalType": "string", - "name": "denom", - "type": "string" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct Coin[]", - "name": "amount", - "type": "tuple[]" - } - ], - "indexed": false, - "internalType": "struct Period[]", - "name": "vestingPeriods", - "type": "tuple[]" - } - ], - "name": "FundVestingAccount", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "funderAddress", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "vestingAddress", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "newFunderAddress", - "type": "address" - } - ], - "name": "UpdateVestingFunder", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "grantee", - "type": "address" - }, - { - "internalType": "string", - "name": "method", - "type": "string" - } - ], - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "approved", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "vestingAddress", - "type": "address" - } - ], - "name": "balances", - "outputs": [ - { - "components": [ - { - "internalType": "string", - "name": "denom", - "type": "string" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct Coin[]", - "name": "locked", - "type": "tuple[]" - }, - { - "components": [ - { - "internalType": "string", - "name": "denom", - "type": "string" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct Coin[]", - "name": "unvested", - "type": "tuple[]" - }, - { - "components": [ - { - "internalType": "string", - "name": "denom", - "type": "string" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct Coin[]", - "name": "vested", - "type": "tuple[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "funderAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "accountAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "destAddress", - "type": "address" - } - ], - "name": "clawback", - "outputs": [ - { - "components": [ - { - "internalType": "string", - "name": "denom", - "type": "string" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct Coin[]", - "name": "", - "type": "tuple[]" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "vestingAddress", - "type": "address" - } - ], - "name": "convertVestingAccount", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "funderAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "vestingAddress", - "type": "address" - }, - { - "internalType": "bool", - "name": "enableGovClawback", - "type": "bool" - } - ], - "name": "createClawbackVestingAccount", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "funderAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "vestingAddress", - "type": "address" - }, - { - "internalType": "uint64", - "name": "startTime", - "type": "uint64" - }, - { - "components": [ - { - "internalType": "int64", - "name": "length", - "type": "int64" - }, - { - "components": [ - { - "internalType": "string", - "name": "denom", - "type": "string" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct Coin[]", - "name": "amount", - "type": "tuple[]" - } - ], - "internalType": "struct Period[]", - "name": "lockupPeriods", - "type": "tuple[]" - }, - { - "components": [ - { - "internalType": "int64", - "name": "length", - "type": "int64" - }, - { - "components": [ - { - "internalType": "string", - "name": "denom", - "type": "string" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct Coin[]", - "name": "amount", - "type": "tuple[]" - } - ], - "internalType": "struct Period[]", - "name": "vestingPeriods", - "type": "tuple[]" - } - ], - "name": "fundVestingAccount", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "funderAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "newFunderAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "vestingAddress", - "type": "address" - } - ], - "name": "updateVestingFunder", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } -] \ No newline at end of file +{ + "_format": "hh-sol-artifact-1", + "contractName": "VestingI", + "sourceName": "solidity/precompiles/vesting/VestingI.sol", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "grantee", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "granter", + "type": "address" + }, + { + "indexed": false, + "internalType": "string", + "name": "method", + "type": "string" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "funderAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "accountAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "destAddress", + "type": "address" + } + ], + "name": "Clawback", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "vestingAddress", + "type": "address" + } + ], + "name": "ConvertVestingAccount", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "funderAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "vestingAddress", + "type": "address" + } + ], + "name": "CreateClawbackVestingAccount", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "funderAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "vestingAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "startTime", + "type": "uint64" + }, + { + "components": [ + { + "internalType": "int64", + "name": "length", + "type": "int64" + }, + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Coin[]", + "name": "amount", + "type": "tuple[]" + } + ], + "indexed": false, + "internalType": "struct Period[]", + "name": "lockupPeriods", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "int64", + "name": "length", + "type": "int64" + }, + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Coin[]", + "name": "amount", + "type": "tuple[]" + } + ], + "indexed": false, + "internalType": "struct Period[]", + "name": "vestingPeriods", + "type": "tuple[]" + } + ], + "name": "FundVestingAccount", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "funderAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "vestingAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newFunderAddress", + "type": "address" + } + ], + "name": "UpdateVestingFunder", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "grantee", + "type": "address" + }, + { + "internalType": "string", + "name": "method", + "type": "string" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vestingAddress", + "type": "address" + } + ], + "name": "balances", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Coin[]", + "name": "locked", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Coin[]", + "name": "unvested", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Coin[]", + "name": "vested", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "funderAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "accountAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "destAddress", + "type": "address" + } + ], + "name": "clawback", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Coin[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vestingAddress", + "type": "address" + } + ], + "name": "convertVestingAccount", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "funderAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "vestingAddress", + "type": "address" + }, + { + "internalType": "bool", + "name": "enableGovClawback", + "type": "bool" + } + ], + "name": "createClawbackVestingAccount", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "funderAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "vestingAddress", + "type": "address" + }, + { + "internalType": "uint64", + "name": "startTime", + "type": "uint64" + }, + { + "components": [ + { + "internalType": "int64", + "name": "length", + "type": "int64" + }, + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Coin[]", + "name": "amount", + "type": "tuple[]" + } + ], + "internalType": "struct Period[]", + "name": "lockupPeriods", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "int64", + "name": "length", + "type": "int64" + }, + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Coin[]", + "name": "amount", + "type": "tuple[]" + } + ], + "internalType": "struct Period[]", + "name": "vestingPeriods", + "type": "tuple[]" + } + ], + "name": "fundVestingAccount", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "funderAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "newFunderAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "vestingAddress", + "type": "address" + } + ], + "name": "updateVestingFunder", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/precompiles/vesting/testdata/VestingCaller.json b/precompiles/vesting/testdata/VestingCaller.json index 1b42de7fe5..236dea8e27 100644 --- a/precompiles/vesting/testdata/VestingCaller.json +++ b/precompiles/vesting/testdata/VestingCaller.json @@ -257,8 +257,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b50611707806100206000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c806372e7c9ab1161005b57806372e7c9ab146100ec5780637caef81b1461011c5780639cfef12914610126578063cdb50175146101425761007d565b806327e235e3146100825780634fe1a8df146100b45780635a211064146100d0575b600080fd5b61009c600480360381019061009791906106f5565b61015e565b6040516100ab939291906108ca565b60405180910390f35b6100ce60048036038101906100c991906109bb565b6101f1565b005b6100ea60048036038101906100e591906106f5565b6102c9565b005b61010660048036038101906101019190610a77565b61038f565b6040516101139190610aca565b60405180910390f35b610124610421565b005b610140600480360381019061013b9190610a77565b6104eb565b005b61015c60048036038101906101579190610b24565b6105b7565b005b606080606061080373ffffffffffffffffffffffffffffffffffffffff166327e235e3856040518263ffffffff1660e01b815260040161019e9190610b86565b600060405180830381865afa1580156101bb573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906101e49190610e45565b9250925092509193909250565b600061080373ffffffffffffffffffffffffffffffffffffffff16634fe1a8df898989898989896040518863ffffffff1660e01b815260040161023a97969594939291906112e5565b6020604051808303816000875af1158015610259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027d919061135f565b9050806102bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b69061140f565b60405180910390fd5b5050505050505050565b600061080373ffffffffffffffffffffffffffffffffffffffff16635a211064836040518263ffffffff1660e01b81526004016103069190610b86565b6020604051808303816000875af1158015610325573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610349919061135f565b90508061038b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610382906114a1565b60405180910390fd5b5050565b606061080373ffffffffffffffffffffffffffffffffffffffff166372e7c9ab8585856040518463ffffffff1660e01b81526004016103d0939291906114c1565b6000604051808303816000875af11580156103ef573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061041891906114f8565b90509392505050565b600061080373ffffffffffffffffffffffffffffffffffffffff1663cdb50175333060006040518463ffffffff1660e01b815260040161046393929190611550565b6020604051808303816000875af1158015610482573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104a6919061135f565b9050806104e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104df9061161f565b60405180910390fd5b50565b600061080373ffffffffffffffffffffffffffffffffffffffff16639cfef1298585856040518463ffffffff1660e01b815260040161052c939291906114c1565b6020604051808303816000875af115801561054b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061056f919061135f565b9050806105b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105a8906116b1565b60405180910390fd5b50505050565b600061080373ffffffffffffffffffffffffffffffffffffffff1663cdb501758585856040518463ffffffff1660e01b81526004016105f893929190611550565b6020604051808303816000875af1158015610617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063b919061135f565b90508061067d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106749061140f565b60405180910390fd5b50505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106c282610697565b9050919050565b6106d2816106b7565b81146106dd57600080fd5b50565b6000813590506106ef816106c9565b92915050565b60006020828403121561070b5761070a61068d565b5b6000610719848285016106e0565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561078857808201518184015260208101905061076d565b60008484015250505050565b6000601f19601f8301169050919050565b60006107b08261074e565b6107ba8185610759565b93506107ca81856020860161076a565b6107d381610794565b840191505092915050565b6000819050919050565b6107f1816107de565b82525050565b6000604083016000830151848203600086015261081482826107a5565b915050602083015161082960208601826107e8565b508091505092915050565b600061084083836107f7565b905092915050565b6000602082019050919050565b600061086082610722565b61086a818561072d565b93508360208202850161087c8561073e565b8060005b858110156108b857848403895281516108998582610834565b94506108a483610848565b925060208a01995050600181019050610880565b50829750879550505050505092915050565b600060608201905081810360008301526108e48186610855565b905081810360208301526108f88185610855565b9050818103604083015261090c8184610855565b9050949350505050565b600067ffffffffffffffff82169050919050565b61093381610916565b811461093e57600080fd5b50565b6000813590506109508161092a565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261097b5761097a610956565b5b8235905067ffffffffffffffff8111156109985761099761095b565b5b6020830191508360208202830111156109b4576109b3610960565b5b9250929050565b600080600080600080600060a0888a0312156109da576109d961068d565b5b60006109e88a828b016106e0565b97505060206109f98a828b016106e0565b9650506040610a0a8a828b01610941565b955050606088013567ffffffffffffffff811115610a2b57610a2a610692565b5b610a378a828b01610965565b9450945050608088013567ffffffffffffffff811115610a5a57610a59610692565b5b610a668a828b01610965565b925092505092959891949750929550565b600080600060608486031215610a9057610a8f61068d565b5b6000610a9e868287016106e0565b9350506020610aaf868287016106e0565b9250506040610ac0868287016106e0565b9150509250925092565b60006020820190508181036000830152610ae48184610855565b905092915050565b60008115159050919050565b610b0181610aec565b8114610b0c57600080fd5b50565b600081359050610b1e81610af8565b92915050565b600080600060608486031215610b3d57610b3c61068d565b5b6000610b4b868287016106e0565b9350506020610b5c868287016106e0565b9250506040610b6d86828701610b0f565b9150509250925092565b610b80816106b7565b82525050565b6000602082019050610b9b6000830184610b77565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610bd982610794565b810181811067ffffffffffffffff82111715610bf857610bf7610ba1565b5b80604052505050565b6000610c0b610683565b9050610c178282610bd0565b919050565b600067ffffffffffffffff821115610c3757610c36610ba1565b5b602082029050602081019050919050565b600080fd5b600080fd5b600080fd5b600067ffffffffffffffff821115610c7257610c71610ba1565b5b610c7b82610794565b9050602081019050919050565b6000610c9b610c9684610c57565b610c01565b905082815260208101848484011115610cb757610cb6610c52565b5b610cc284828561076a565b509392505050565b600082601f830112610cdf57610cde610956565b5b8151610cef848260208601610c88565b91505092915050565b610d01816107de565b8114610d0c57600080fd5b50565b600081519050610d1e81610cf8565b92915050565b600060408284031215610d3a57610d39610c48565b5b610d446040610c01565b9050600082015167ffffffffffffffff811115610d6457610d63610c4d565b5b610d7084828501610cca565b6000830152506020610d8484828501610d0f565b60208301525092915050565b6000610da3610d9e84610c1c565b610c01565b90508083825260208201905060208402830185811115610dc657610dc5610960565b5b835b81811015610e0d57805167ffffffffffffffff811115610deb57610dea610956565b5b808601610df88982610d24565b85526020850194505050602081019050610dc8565b5050509392505050565b600082601f830112610e2c57610e2b610956565b5b8151610e3c848260208601610d90565b91505092915050565b600080600060608486031215610e5e57610e5d61068d565b5b600084015167ffffffffffffffff811115610e7c57610e7b610692565b5b610e8886828701610e17565b935050602084015167ffffffffffffffff811115610ea957610ea8610692565b5b610eb586828701610e17565b925050604084015167ffffffffffffffff811115610ed657610ed5610692565b5b610ee286828701610e17565b9150509250925092565b610ef581610916565b82525050565b600082825260208201905092915050565b6000819050919050565b60008160070b9050919050565b610f2c81610f16565b8114610f3757600080fd5b50565b600081359050610f4981610f23565b92915050565b6000610f5e6020840184610f3a565b905092915050565b610f6f81610f16565b82525050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112610fa157610fa0610f7f565b5b83810192508235915060208301925067ffffffffffffffff821115610fc957610fc8610f75565b5b602082023603831315610fdf57610fde610f7a565b5b509250929050565b600082825260208201905092915050565b6000819050919050565b6000808335600160200384360303811261101f5761101e610f7f565b5b83810192508235915060208301925067ffffffffffffffff82111561104757611046610f75565b5b60018202360383131561105d5761105c610f7a565b5b509250929050565b82818337600083830152505050565b60006110808385610759565b935061108d838584611065565b61109683610794565b840190509392505050565b6000813590506110b081610cf8565b92915050565b60006110c560208401846110a1565b905092915050565b6000604083016110e06000840184611002565b85830360008701526110f3838284611074565b9250505061110460208401846110b6565b61111160208601826107e8565b508091505092915050565b600061112883836110cd565b905092915050565b60008235600160400383360303811261114c5761114b610f7f565b5b82810191505092915050565b6000602082019050919050565b60006111718385610fe7565b93508360208402850161118384610ff8565b8060005b878110156111c757848403895261119e8284611130565b6111a8858261111c565b94506111b383611158565b925060208a01995050600181019050611187565b50829750879450505050509392505050565b6000604083016111ec6000840184610f4f565b6111f96000860182610f66565b506112076020840184610f84565b858303602087015261121a838284611165565b925050508091505092915050565b600061123483836111d9565b905092915050565b60008235600160400383360303811261125857611257610f7f565b5b82810191505092915050565b6000602082019050919050565b600061127d8385610efb565b93508360208402850161128f84610f0c565b8060005b878110156112d35784840389526112aa828461123c565b6112b48582611228565b94506112bf83611264565b925060208a01995050600181019050611293565b50829750879450505050509392505050565b600060a0820190506112fa600083018a610b77565b6113076020830189610b77565b6113146040830188610eec565b8181036060830152611327818688611271565b9050818103608083015261133c818486611271565b905098975050505050505050565b60008151905061135981610af8565b92915050565b6000602082840312156113755761137461068d565b5b60006113838482850161134a565b91505092915050565b600082825260208201905092915050565b7f56657374696e6743616c6c65723a2063726561746520636c61776261636b207660008201527f657374696e67206163636f756e74206661696c65640000000000000000000000602082015250565b60006113f960358361138c565b91506114048261139d565b604082019050919050565b60006020820190508181036000830152611428816113ec565b9050919050565b7f56657374696e6743616c6c65723a20636f6e7665727420746f20636c6177626160008201527f636b2076657374696e67206163636f756e74206661696c656400000000000000602082015250565b600061148b60398361138c565b91506114968261142f565b604082019050919050565b600060208201905081810360008301526114ba8161147e565b9050919050565b60006060820190506114d66000830186610b77565b6114e36020830185610b77565b6114f06040830184610b77565b949350505050565b60006020828403121561150e5761150d61068d565b5b600082015167ffffffffffffffff81111561152c5761152b610692565b5b61153884828501610e17565b91505092915050565b61154a81610aec565b82525050565b60006060820190506115656000830186610b77565b6115726020830185610b77565b61157f6040830184611541565b949350505050565b7f56657374696e6743616c6c65723a2063726561746520636c61776261636b207660008201527f657374696e67206163636f756e7420666f7220636f6e7472616374206661696c60208201527f6564000000000000000000000000000000000000000000000000000000000000604082015250565b600061160960428361138c565b915061161482611587565b606082019050919050565b60006020820190508181036000830152611638816115fc565b9050919050565b7f56657374696e6743616c6c65723a207570646174652076657374696e6720667560008201527f6e646572206661696c6564000000000000000000000000000000000000000000602082015250565b600061169b602b8361138c565b91506116a68261163f565b604082019050919050565b600060208201905081810360008301526116ca8161168e565b905091905056fea264697066735822122062a4b3572ecceb2cb3ff661355442e93824209f315372702596d2211b9c0b80364736f6c63430008130033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061007d5760003560e01c806372e7c9ab1161005b57806372e7c9ab146100ec5780637caef81b1461011c5780639cfef12914610126578063cdb50175146101425761007d565b806327e235e3146100825780634fe1a8df146100b45780635a211064146100d0575b600080fd5b61009c600480360381019061009791906106f5565b61015e565b6040516100ab939291906108ca565b60405180910390f35b6100ce60048036038101906100c991906109bb565b6101f1565b005b6100ea60048036038101906100e591906106f5565b6102c9565b005b61010660048036038101906101019190610a77565b61038f565b6040516101139190610aca565b60405180910390f35b610124610421565b005b610140600480360381019061013b9190610a77565b6104eb565b005b61015c60048036038101906101579190610b24565b6105b7565b005b606080606061080373ffffffffffffffffffffffffffffffffffffffff166327e235e3856040518263ffffffff1660e01b815260040161019e9190610b86565b600060405180830381865afa1580156101bb573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906101e49190610e45565b9250925092509193909250565b600061080373ffffffffffffffffffffffffffffffffffffffff16634fe1a8df898989898989896040518863ffffffff1660e01b815260040161023a97969594939291906112e5565b6020604051808303816000875af1158015610259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027d919061135f565b9050806102bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b69061140f565b60405180910390fd5b5050505050505050565b600061080373ffffffffffffffffffffffffffffffffffffffff16635a211064836040518263ffffffff1660e01b81526004016103069190610b86565b6020604051808303816000875af1158015610325573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610349919061135f565b90508061038b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610382906114a1565b60405180910390fd5b5050565b606061080373ffffffffffffffffffffffffffffffffffffffff166372e7c9ab8585856040518463ffffffff1660e01b81526004016103d0939291906114c1565b6000604051808303816000875af11580156103ef573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061041891906114f8565b90509392505050565b600061080373ffffffffffffffffffffffffffffffffffffffff1663cdb50175333060006040518463ffffffff1660e01b815260040161046393929190611550565b6020604051808303816000875af1158015610482573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104a6919061135f565b9050806104e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104df9061161f565b60405180910390fd5b50565b600061080373ffffffffffffffffffffffffffffffffffffffff16639cfef1298585856040518463ffffffff1660e01b815260040161052c939291906114c1565b6020604051808303816000875af115801561054b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061056f919061135f565b9050806105b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105a8906116b1565b60405180910390fd5b50505050565b600061080373ffffffffffffffffffffffffffffffffffffffff1663cdb501758585856040518463ffffffff1660e01b81526004016105f893929190611550565b6020604051808303816000875af1158015610617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063b919061135f565b90508061067d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106749061140f565b60405180910390fd5b50505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106c282610697565b9050919050565b6106d2816106b7565b81146106dd57600080fd5b50565b6000813590506106ef816106c9565b92915050565b60006020828403121561070b5761070a61068d565b5b6000610719848285016106e0565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561078857808201518184015260208101905061076d565b60008484015250505050565b6000601f19601f8301169050919050565b60006107b08261074e565b6107ba8185610759565b93506107ca81856020860161076a565b6107d381610794565b840191505092915050565b6000819050919050565b6107f1816107de565b82525050565b6000604083016000830151848203600086015261081482826107a5565b915050602083015161082960208601826107e8565b508091505092915050565b600061084083836107f7565b905092915050565b6000602082019050919050565b600061086082610722565b61086a818561072d565b93508360208202850161087c8561073e565b8060005b858110156108b857848403895281516108998582610834565b94506108a483610848565b925060208a01995050600181019050610880565b50829750879550505050505092915050565b600060608201905081810360008301526108e48186610855565b905081810360208301526108f88185610855565b9050818103604083015261090c8184610855565b9050949350505050565b600067ffffffffffffffff82169050919050565b61093381610916565b811461093e57600080fd5b50565b6000813590506109508161092a565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261097b5761097a610956565b5b8235905067ffffffffffffffff8111156109985761099761095b565b5b6020830191508360208202830111156109b4576109b3610960565b5b9250929050565b600080600080600080600060a0888a0312156109da576109d961068d565b5b60006109e88a828b016106e0565b97505060206109f98a828b016106e0565b9650506040610a0a8a828b01610941565b955050606088013567ffffffffffffffff811115610a2b57610a2a610692565b5b610a378a828b01610965565b9450945050608088013567ffffffffffffffff811115610a5a57610a59610692565b5b610a668a828b01610965565b925092505092959891949750929550565b600080600060608486031215610a9057610a8f61068d565b5b6000610a9e868287016106e0565b9350506020610aaf868287016106e0565b9250506040610ac0868287016106e0565b9150509250925092565b60006020820190508181036000830152610ae48184610855565b905092915050565b60008115159050919050565b610b0181610aec565b8114610b0c57600080fd5b50565b600081359050610b1e81610af8565b92915050565b600080600060608486031215610b3d57610b3c61068d565b5b6000610b4b868287016106e0565b9350506020610b5c868287016106e0565b9250506040610b6d86828701610b0f565b9150509250925092565b610b80816106b7565b82525050565b6000602082019050610b9b6000830184610b77565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610bd982610794565b810181811067ffffffffffffffff82111715610bf857610bf7610ba1565b5b80604052505050565b6000610c0b610683565b9050610c178282610bd0565b919050565b600067ffffffffffffffff821115610c3757610c36610ba1565b5b602082029050602081019050919050565b600080fd5b600080fd5b600080fd5b600067ffffffffffffffff821115610c7257610c71610ba1565b5b610c7b82610794565b9050602081019050919050565b6000610c9b610c9684610c57565b610c01565b905082815260208101848484011115610cb757610cb6610c52565b5b610cc284828561076a565b509392505050565b600082601f830112610cdf57610cde610956565b5b8151610cef848260208601610c88565b91505092915050565b610d01816107de565b8114610d0c57600080fd5b50565b600081519050610d1e81610cf8565b92915050565b600060408284031215610d3a57610d39610c48565b5b610d446040610c01565b9050600082015167ffffffffffffffff811115610d6457610d63610c4d565b5b610d7084828501610cca565b6000830152506020610d8484828501610d0f565b60208301525092915050565b6000610da3610d9e84610c1c565b610c01565b90508083825260208201905060208402830185811115610dc657610dc5610960565b5b835b81811015610e0d57805167ffffffffffffffff811115610deb57610dea610956565b5b808601610df88982610d24565b85526020850194505050602081019050610dc8565b5050509392505050565b600082601f830112610e2c57610e2b610956565b5b8151610e3c848260208601610d90565b91505092915050565b600080600060608486031215610e5e57610e5d61068d565b5b600084015167ffffffffffffffff811115610e7c57610e7b610692565b5b610e8886828701610e17565b935050602084015167ffffffffffffffff811115610ea957610ea8610692565b5b610eb586828701610e17565b925050604084015167ffffffffffffffff811115610ed657610ed5610692565b5b610ee286828701610e17565b9150509250925092565b610ef581610916565b82525050565b600082825260208201905092915050565b6000819050919050565b60008160070b9050919050565b610f2c81610f16565b8114610f3757600080fd5b50565b600081359050610f4981610f23565b92915050565b6000610f5e6020840184610f3a565b905092915050565b610f6f81610f16565b82525050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112610fa157610fa0610f7f565b5b83810192508235915060208301925067ffffffffffffffff821115610fc957610fc8610f75565b5b602082023603831315610fdf57610fde610f7a565b5b509250929050565b600082825260208201905092915050565b6000819050919050565b6000808335600160200384360303811261101f5761101e610f7f565b5b83810192508235915060208301925067ffffffffffffffff82111561104757611046610f75565b5b60018202360383131561105d5761105c610f7a565b5b509250929050565b82818337600083830152505050565b60006110808385610759565b935061108d838584611065565b61109683610794565b840190509392505050565b6000813590506110b081610cf8565b92915050565b60006110c560208401846110a1565b905092915050565b6000604083016110e06000840184611002565b85830360008701526110f3838284611074565b9250505061110460208401846110b6565b61111160208601826107e8565b508091505092915050565b600061112883836110cd565b905092915050565b60008235600160400383360303811261114c5761114b610f7f565b5b82810191505092915050565b6000602082019050919050565b60006111718385610fe7565b93508360208402850161118384610ff8565b8060005b878110156111c757848403895261119e8284611130565b6111a8858261111c565b94506111b383611158565b925060208a01995050600181019050611187565b50829750879450505050509392505050565b6000604083016111ec6000840184610f4f565b6111f96000860182610f66565b506112076020840184610f84565b858303602087015261121a838284611165565b925050508091505092915050565b600061123483836111d9565b905092915050565b60008235600160400383360303811261125857611257610f7f565b5b82810191505092915050565b6000602082019050919050565b600061127d8385610efb565b93508360208402850161128f84610f0c565b8060005b878110156112d35784840389526112aa828461123c565b6112b48582611228565b94506112bf83611264565b925060208a01995050600181019050611293565b50829750879450505050509392505050565b600060a0820190506112fa600083018a610b77565b6113076020830189610b77565b6113146040830188610eec565b8181036060830152611327818688611271565b9050818103608083015261133c818486611271565b905098975050505050505050565b60008151905061135981610af8565b92915050565b6000602082840312156113755761137461068d565b5b60006113838482850161134a565b91505092915050565b600082825260208201905092915050565b7f56657374696e6743616c6c65723a2063726561746520636c61776261636b207660008201527f657374696e67206163636f756e74206661696c65640000000000000000000000602082015250565b60006113f960358361138c565b91506114048261139d565b604082019050919050565b60006020820190508181036000830152611428816113ec565b9050919050565b7f56657374696e6743616c6c65723a20636f6e7665727420746f20636c6177626160008201527f636b2076657374696e67206163636f756e74206661696c656400000000000000602082015250565b600061148b60398361138c565b91506114968261142f565b604082019050919050565b600060208201905081810360008301526114ba8161147e565b9050919050565b60006060820190506114d66000830186610b77565b6114e36020830185610b77565b6114f06040830184610b77565b949350505050565b60006020828403121561150e5761150d61068d565b5b600082015167ffffffffffffffff81111561152c5761152b610692565b5b61153884828501610e17565b91505092915050565b61154a81610aec565b82525050565b60006060820190506115656000830186610b77565b6115726020830185610b77565b61157f6040830184611541565b949350505050565b7f56657374696e6743616c6c65723a2063726561746520636c61776261636b207660008201527f657374696e67206163636f756e7420666f7220636f6e7472616374206661696c60208201527f6564000000000000000000000000000000000000000000000000000000000000604082015250565b600061160960428361138c565b915061161482611587565b606082019050919050565b60006020820190508181036000830152611638816115fc565b9050919050565b7f56657374696e6743616c6c65723a207570646174652076657374696e6720667560008201527f6e646572206661696c6564000000000000000000000000000000000000000000602082015250565b600061169b602b8361138c565b91506116a68261163f565b604082019050919050565b600060208201905081810360008301526116ca8161168e565b905091905056fea264697066735822122062a4b3572ecceb2cb3ff661355442e93824209f315372702596d2211b9c0b80364736f6c63430008130033", + "bytecode": "0x608060405234801561001057600080fd5b50611707806100206000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c806372e7c9ab1161005b57806372e7c9ab146100ec5780637caef81b1461011c5780639cfef12914610126578063cdb50175146101425761007d565b806327e235e3146100825780634fe1a8df146100b45780635a211064146100d0575b600080fd5b61009c600480360381019061009791906106f5565b61015e565b6040516100ab939291906108ca565b60405180910390f35b6100ce60048036038101906100c991906109bb565b6101f1565b005b6100ea60048036038101906100e591906106f5565b6102c9565b005b61010660048036038101906101019190610a77565b61038f565b6040516101139190610aca565b60405180910390f35b610124610421565b005b610140600480360381019061013b9190610a77565b6104eb565b005b61015c60048036038101906101579190610b24565b6105b7565b005b606080606061080373ffffffffffffffffffffffffffffffffffffffff166327e235e3856040518263ffffffff1660e01b815260040161019e9190610b86565b600060405180830381865afa1580156101bb573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906101e49190610e45565b9250925092509193909250565b600061080373ffffffffffffffffffffffffffffffffffffffff16634fe1a8df898989898989896040518863ffffffff1660e01b815260040161023a97969594939291906112e5565b6020604051808303816000875af1158015610259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027d919061135f565b9050806102bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b69061140f565b60405180910390fd5b5050505050505050565b600061080373ffffffffffffffffffffffffffffffffffffffff16635a211064836040518263ffffffff1660e01b81526004016103069190610b86565b6020604051808303816000875af1158015610325573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610349919061135f565b90508061038b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610382906114a1565b60405180910390fd5b5050565b606061080373ffffffffffffffffffffffffffffffffffffffff166372e7c9ab8585856040518463ffffffff1660e01b81526004016103d0939291906114c1565b6000604051808303816000875af11580156103ef573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061041891906114f8565b90509392505050565b600061080373ffffffffffffffffffffffffffffffffffffffff1663cdb50175333060006040518463ffffffff1660e01b815260040161046393929190611550565b6020604051808303816000875af1158015610482573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104a6919061135f565b9050806104e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104df9061161f565b60405180910390fd5b50565b600061080373ffffffffffffffffffffffffffffffffffffffff16639cfef1298585856040518463ffffffff1660e01b815260040161052c939291906114c1565b6020604051808303816000875af115801561054b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061056f919061135f565b9050806105b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105a8906116b1565b60405180910390fd5b50505050565b600061080373ffffffffffffffffffffffffffffffffffffffff1663cdb501758585856040518463ffffffff1660e01b81526004016105f893929190611550565b6020604051808303816000875af1158015610617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063b919061135f565b90508061067d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106749061140f565b60405180910390fd5b50505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106c282610697565b9050919050565b6106d2816106b7565b81146106dd57600080fd5b50565b6000813590506106ef816106c9565b92915050565b60006020828403121561070b5761070a61068d565b5b6000610719848285016106e0565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561078857808201518184015260208101905061076d565b60008484015250505050565b6000601f19601f8301169050919050565b60006107b08261074e565b6107ba8185610759565b93506107ca81856020860161076a565b6107d381610794565b840191505092915050565b6000819050919050565b6107f1816107de565b82525050565b6000604083016000830151848203600086015261081482826107a5565b915050602083015161082960208601826107e8565b508091505092915050565b600061084083836107f7565b905092915050565b6000602082019050919050565b600061086082610722565b61086a818561072d565b93508360208202850161087c8561073e565b8060005b858110156108b857848403895281516108998582610834565b94506108a483610848565b925060208a01995050600181019050610880565b50829750879550505050505092915050565b600060608201905081810360008301526108e48186610855565b905081810360208301526108f88185610855565b9050818103604083015261090c8184610855565b9050949350505050565b600067ffffffffffffffff82169050919050565b61093381610916565b811461093e57600080fd5b50565b6000813590506109508161092a565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261097b5761097a610956565b5b8235905067ffffffffffffffff8111156109985761099761095b565b5b6020830191508360208202830111156109b4576109b3610960565b5b9250929050565b600080600080600080600060a0888a0312156109da576109d961068d565b5b60006109e88a828b016106e0565b97505060206109f98a828b016106e0565b9650506040610a0a8a828b01610941565b955050606088013567ffffffffffffffff811115610a2b57610a2a610692565b5b610a378a828b01610965565b9450945050608088013567ffffffffffffffff811115610a5a57610a59610692565b5b610a668a828b01610965565b925092505092959891949750929550565b600080600060608486031215610a9057610a8f61068d565b5b6000610a9e868287016106e0565b9350506020610aaf868287016106e0565b9250506040610ac0868287016106e0565b9150509250925092565b60006020820190508181036000830152610ae48184610855565b905092915050565b60008115159050919050565b610b0181610aec565b8114610b0c57600080fd5b50565b600081359050610b1e81610af8565b92915050565b600080600060608486031215610b3d57610b3c61068d565b5b6000610b4b868287016106e0565b9350506020610b5c868287016106e0565b9250506040610b6d86828701610b0f565b9150509250925092565b610b80816106b7565b82525050565b6000602082019050610b9b6000830184610b77565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610bd982610794565b810181811067ffffffffffffffff82111715610bf857610bf7610ba1565b5b80604052505050565b6000610c0b610683565b9050610c178282610bd0565b919050565b600067ffffffffffffffff821115610c3757610c36610ba1565b5b602082029050602081019050919050565b600080fd5b600080fd5b600080fd5b600067ffffffffffffffff821115610c7257610c71610ba1565b5b610c7b82610794565b9050602081019050919050565b6000610c9b610c9684610c57565b610c01565b905082815260208101848484011115610cb757610cb6610c52565b5b610cc284828561076a565b509392505050565b600082601f830112610cdf57610cde610956565b5b8151610cef848260208601610c88565b91505092915050565b610d01816107de565b8114610d0c57600080fd5b50565b600081519050610d1e81610cf8565b92915050565b600060408284031215610d3a57610d39610c48565b5b610d446040610c01565b9050600082015167ffffffffffffffff811115610d6457610d63610c4d565b5b610d7084828501610cca565b6000830152506020610d8484828501610d0f565b60208301525092915050565b6000610da3610d9e84610c1c565b610c01565b90508083825260208201905060208402830185811115610dc657610dc5610960565b5b835b81811015610e0d57805167ffffffffffffffff811115610deb57610dea610956565b5b808601610df88982610d24565b85526020850194505050602081019050610dc8565b5050509392505050565b600082601f830112610e2c57610e2b610956565b5b8151610e3c848260208601610d90565b91505092915050565b600080600060608486031215610e5e57610e5d61068d565b5b600084015167ffffffffffffffff811115610e7c57610e7b610692565b5b610e8886828701610e17565b935050602084015167ffffffffffffffff811115610ea957610ea8610692565b5b610eb586828701610e17565b925050604084015167ffffffffffffffff811115610ed657610ed5610692565b5b610ee286828701610e17565b9150509250925092565b610ef581610916565b82525050565b600082825260208201905092915050565b6000819050919050565b60008160070b9050919050565b610f2c81610f16565b8114610f3757600080fd5b50565b600081359050610f4981610f23565b92915050565b6000610f5e6020840184610f3a565b905092915050565b610f6f81610f16565b82525050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112610fa157610fa0610f7f565b5b83810192508235915060208301925067ffffffffffffffff821115610fc957610fc8610f75565b5b602082023603831315610fdf57610fde610f7a565b5b509250929050565b600082825260208201905092915050565b6000819050919050565b6000808335600160200384360303811261101f5761101e610f7f565b5b83810192508235915060208301925067ffffffffffffffff82111561104757611046610f75565b5b60018202360383131561105d5761105c610f7a565b5b509250929050565b82818337600083830152505050565b60006110808385610759565b935061108d838584611065565b61109683610794565b840190509392505050565b6000813590506110b081610cf8565b92915050565b60006110c560208401846110a1565b905092915050565b6000604083016110e06000840184611002565b85830360008701526110f3838284611074565b9250505061110460208401846110b6565b61111160208601826107e8565b508091505092915050565b600061112883836110cd565b905092915050565b60008235600160400383360303811261114c5761114b610f7f565b5b82810191505092915050565b6000602082019050919050565b60006111718385610fe7565b93508360208402850161118384610ff8565b8060005b878110156111c757848403895261119e8284611130565b6111a8858261111c565b94506111b383611158565b925060208a01995050600181019050611187565b50829750879450505050509392505050565b6000604083016111ec6000840184610f4f565b6111f96000860182610f66565b506112076020840184610f84565b858303602087015261121a838284611165565b925050508091505092915050565b600061123483836111d9565b905092915050565b60008235600160400383360303811261125857611257610f7f565b5b82810191505092915050565b6000602082019050919050565b600061127d8385610efb565b93508360208402850161128f84610f0c565b8060005b878110156112d35784840389526112aa828461123c565b6112b48582611228565b94506112bf83611264565b925060208a01995050600181019050611293565b50829750879450505050509392505050565b600060a0820190506112fa600083018a610b77565b6113076020830189610b77565b6113146040830188610eec565b8181036060830152611327818688611271565b9050818103608083015261133c818486611271565b905098975050505050505050565b60008151905061135981610af8565b92915050565b6000602082840312156113755761137461068d565b5b60006113838482850161134a565b91505092915050565b600082825260208201905092915050565b7f56657374696e6743616c6c65723a2063726561746520636c61776261636b207660008201527f657374696e67206163636f756e74206661696c65640000000000000000000000602082015250565b60006113f960358361138c565b91506114048261139d565b604082019050919050565b60006020820190508181036000830152611428816113ec565b9050919050565b7f56657374696e6743616c6c65723a20636f6e7665727420746f20636c6177626160008201527f636b2076657374696e67206163636f756e74206661696c656400000000000000602082015250565b600061148b60398361138c565b91506114968261142f565b604082019050919050565b600060208201905081810360008301526114ba8161147e565b9050919050565b60006060820190506114d66000830186610b77565b6114e36020830185610b77565b6114f06040830184610b77565b949350505050565b60006020828403121561150e5761150d61068d565b5b600082015167ffffffffffffffff81111561152c5761152b610692565b5b61153884828501610e17565b91505092915050565b61154a81610aec565b82525050565b60006060820190506115656000830186610b77565b6115726020830185610b77565b61157f6040830184611541565b949350505050565b7f56657374696e6743616c6c65723a2063726561746520636c61776261636b207660008201527f657374696e67206163636f756e7420666f7220636f6e7472616374206661696c60208201527f6564000000000000000000000000000000000000000000000000000000000000604082015250565b600061160960428361138c565b915061161482611587565b606082019050919050565b60006020820190508181036000830152611638816115fc565b9050919050565b7f56657374696e6743616c6c65723a207570646174652076657374696e6720667560008201527f6e646572206661696c6564000000000000000000000000000000000000000000602082015250565b600061169b602b8361138c565b91506116a68261163f565b604082019050919050565b600060208201905081810360008301526116ca8161168e565b905091905056fea26469706673582212200c0e5b0043edec654be0a450d53af988547ba7d7bb58c9cf6265cc22d8703ba864736f6c63430008130033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061007d5760003560e01c806372e7c9ab1161005b57806372e7c9ab146100ec5780637caef81b1461011c5780639cfef12914610126578063cdb50175146101425761007d565b806327e235e3146100825780634fe1a8df146100b45780635a211064146100d0575b600080fd5b61009c600480360381019061009791906106f5565b61015e565b6040516100ab939291906108ca565b60405180910390f35b6100ce60048036038101906100c991906109bb565b6101f1565b005b6100ea60048036038101906100e591906106f5565b6102c9565b005b61010660048036038101906101019190610a77565b61038f565b6040516101139190610aca565b60405180910390f35b610124610421565b005b610140600480360381019061013b9190610a77565b6104eb565b005b61015c60048036038101906101579190610b24565b6105b7565b005b606080606061080373ffffffffffffffffffffffffffffffffffffffff166327e235e3856040518263ffffffff1660e01b815260040161019e9190610b86565b600060405180830381865afa1580156101bb573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906101e49190610e45565b9250925092509193909250565b600061080373ffffffffffffffffffffffffffffffffffffffff16634fe1a8df898989898989896040518863ffffffff1660e01b815260040161023a97969594939291906112e5565b6020604051808303816000875af1158015610259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027d919061135f565b9050806102bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b69061140f565b60405180910390fd5b5050505050505050565b600061080373ffffffffffffffffffffffffffffffffffffffff16635a211064836040518263ffffffff1660e01b81526004016103069190610b86565b6020604051808303816000875af1158015610325573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610349919061135f565b90508061038b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610382906114a1565b60405180910390fd5b5050565b606061080373ffffffffffffffffffffffffffffffffffffffff166372e7c9ab8585856040518463ffffffff1660e01b81526004016103d0939291906114c1565b6000604051808303816000875af11580156103ef573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061041891906114f8565b90509392505050565b600061080373ffffffffffffffffffffffffffffffffffffffff1663cdb50175333060006040518463ffffffff1660e01b815260040161046393929190611550565b6020604051808303816000875af1158015610482573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104a6919061135f565b9050806104e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104df9061161f565b60405180910390fd5b50565b600061080373ffffffffffffffffffffffffffffffffffffffff16639cfef1298585856040518463ffffffff1660e01b815260040161052c939291906114c1565b6020604051808303816000875af115801561054b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061056f919061135f565b9050806105b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105a8906116b1565b60405180910390fd5b50505050565b600061080373ffffffffffffffffffffffffffffffffffffffff1663cdb501758585856040518463ffffffff1660e01b81526004016105f893929190611550565b6020604051808303816000875af1158015610617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063b919061135f565b90508061067d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106749061140f565b60405180910390fd5b50505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106c282610697565b9050919050565b6106d2816106b7565b81146106dd57600080fd5b50565b6000813590506106ef816106c9565b92915050565b60006020828403121561070b5761070a61068d565b5b6000610719848285016106e0565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561078857808201518184015260208101905061076d565b60008484015250505050565b6000601f19601f8301169050919050565b60006107b08261074e565b6107ba8185610759565b93506107ca81856020860161076a565b6107d381610794565b840191505092915050565b6000819050919050565b6107f1816107de565b82525050565b6000604083016000830151848203600086015261081482826107a5565b915050602083015161082960208601826107e8565b508091505092915050565b600061084083836107f7565b905092915050565b6000602082019050919050565b600061086082610722565b61086a818561072d565b93508360208202850161087c8561073e565b8060005b858110156108b857848403895281516108998582610834565b94506108a483610848565b925060208a01995050600181019050610880565b50829750879550505050505092915050565b600060608201905081810360008301526108e48186610855565b905081810360208301526108f88185610855565b9050818103604083015261090c8184610855565b9050949350505050565b600067ffffffffffffffff82169050919050565b61093381610916565b811461093e57600080fd5b50565b6000813590506109508161092a565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261097b5761097a610956565b5b8235905067ffffffffffffffff8111156109985761099761095b565b5b6020830191508360208202830111156109b4576109b3610960565b5b9250929050565b600080600080600080600060a0888a0312156109da576109d961068d565b5b60006109e88a828b016106e0565b97505060206109f98a828b016106e0565b9650506040610a0a8a828b01610941565b955050606088013567ffffffffffffffff811115610a2b57610a2a610692565b5b610a378a828b01610965565b9450945050608088013567ffffffffffffffff811115610a5a57610a59610692565b5b610a668a828b01610965565b925092505092959891949750929550565b600080600060608486031215610a9057610a8f61068d565b5b6000610a9e868287016106e0565b9350506020610aaf868287016106e0565b9250506040610ac0868287016106e0565b9150509250925092565b60006020820190508181036000830152610ae48184610855565b905092915050565b60008115159050919050565b610b0181610aec565b8114610b0c57600080fd5b50565b600081359050610b1e81610af8565b92915050565b600080600060608486031215610b3d57610b3c61068d565b5b6000610b4b868287016106e0565b9350506020610b5c868287016106e0565b9250506040610b6d86828701610b0f565b9150509250925092565b610b80816106b7565b82525050565b6000602082019050610b9b6000830184610b77565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610bd982610794565b810181811067ffffffffffffffff82111715610bf857610bf7610ba1565b5b80604052505050565b6000610c0b610683565b9050610c178282610bd0565b919050565b600067ffffffffffffffff821115610c3757610c36610ba1565b5b602082029050602081019050919050565b600080fd5b600080fd5b600080fd5b600067ffffffffffffffff821115610c7257610c71610ba1565b5b610c7b82610794565b9050602081019050919050565b6000610c9b610c9684610c57565b610c01565b905082815260208101848484011115610cb757610cb6610c52565b5b610cc284828561076a565b509392505050565b600082601f830112610cdf57610cde610956565b5b8151610cef848260208601610c88565b91505092915050565b610d01816107de565b8114610d0c57600080fd5b50565b600081519050610d1e81610cf8565b92915050565b600060408284031215610d3a57610d39610c48565b5b610d446040610c01565b9050600082015167ffffffffffffffff811115610d6457610d63610c4d565b5b610d7084828501610cca565b6000830152506020610d8484828501610d0f565b60208301525092915050565b6000610da3610d9e84610c1c565b610c01565b90508083825260208201905060208402830185811115610dc657610dc5610960565b5b835b81811015610e0d57805167ffffffffffffffff811115610deb57610dea610956565b5b808601610df88982610d24565b85526020850194505050602081019050610dc8565b5050509392505050565b600082601f830112610e2c57610e2b610956565b5b8151610e3c848260208601610d90565b91505092915050565b600080600060608486031215610e5e57610e5d61068d565b5b600084015167ffffffffffffffff811115610e7c57610e7b610692565b5b610e8886828701610e17565b935050602084015167ffffffffffffffff811115610ea957610ea8610692565b5b610eb586828701610e17565b925050604084015167ffffffffffffffff811115610ed657610ed5610692565b5b610ee286828701610e17565b9150509250925092565b610ef581610916565b82525050565b600082825260208201905092915050565b6000819050919050565b60008160070b9050919050565b610f2c81610f16565b8114610f3757600080fd5b50565b600081359050610f4981610f23565b92915050565b6000610f5e6020840184610f3a565b905092915050565b610f6f81610f16565b82525050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112610fa157610fa0610f7f565b5b83810192508235915060208301925067ffffffffffffffff821115610fc957610fc8610f75565b5b602082023603831315610fdf57610fde610f7a565b5b509250929050565b600082825260208201905092915050565b6000819050919050565b6000808335600160200384360303811261101f5761101e610f7f565b5b83810192508235915060208301925067ffffffffffffffff82111561104757611046610f75565b5b60018202360383131561105d5761105c610f7a565b5b509250929050565b82818337600083830152505050565b60006110808385610759565b935061108d838584611065565b61109683610794565b840190509392505050565b6000813590506110b081610cf8565b92915050565b60006110c560208401846110a1565b905092915050565b6000604083016110e06000840184611002565b85830360008701526110f3838284611074565b9250505061110460208401846110b6565b61111160208601826107e8565b508091505092915050565b600061112883836110cd565b905092915050565b60008235600160400383360303811261114c5761114b610f7f565b5b82810191505092915050565b6000602082019050919050565b60006111718385610fe7565b93508360208402850161118384610ff8565b8060005b878110156111c757848403895261119e8284611130565b6111a8858261111c565b94506111b383611158565b925060208a01995050600181019050611187565b50829750879450505050509392505050565b6000604083016111ec6000840184610f4f565b6111f96000860182610f66565b506112076020840184610f84565b858303602087015261121a838284611165565b925050508091505092915050565b600061123483836111d9565b905092915050565b60008235600160400383360303811261125857611257610f7f565b5b82810191505092915050565b6000602082019050919050565b600061127d8385610efb565b93508360208402850161128f84610f0c565b8060005b878110156112d35784840389526112aa828461123c565b6112b48582611228565b94506112bf83611264565b925060208a01995050600181019050611293565b50829750879450505050509392505050565b600060a0820190506112fa600083018a610b77565b6113076020830189610b77565b6113146040830188610eec565b8181036060830152611327818688611271565b9050818103608083015261133c818486611271565b905098975050505050505050565b60008151905061135981610af8565b92915050565b6000602082840312156113755761137461068d565b5b60006113838482850161134a565b91505092915050565b600082825260208201905092915050565b7f56657374696e6743616c6c65723a2063726561746520636c61776261636b207660008201527f657374696e67206163636f756e74206661696c65640000000000000000000000602082015250565b60006113f960358361138c565b91506114048261139d565b604082019050919050565b60006020820190508181036000830152611428816113ec565b9050919050565b7f56657374696e6743616c6c65723a20636f6e7665727420746f20636c6177626160008201527f636b2076657374696e67206163636f756e74206661696c656400000000000000602082015250565b600061148b60398361138c565b91506114968261142f565b604082019050919050565b600060208201905081810360008301526114ba8161147e565b9050919050565b60006060820190506114d66000830186610b77565b6114e36020830185610b77565b6114f06040830184610b77565b949350505050565b60006020828403121561150e5761150d61068d565b5b600082015167ffffffffffffffff81111561152c5761152b610692565b5b61153884828501610e17565b91505092915050565b61154a81610aec565b82525050565b60006060820190506115656000830186610b77565b6115726020830185610b77565b61157f6040830184611541565b949350505050565b7f56657374696e6743616c6c65723a2063726561746520636c61776261636b207660008201527f657374696e67206163636f756e7420666f7220636f6e7472616374206661696c60208201527f6564000000000000000000000000000000000000000000000000000000000000604082015250565b600061160960428361138c565b915061161482611587565b606082019050919050565b60006020820190508181036000830152611638816115fc565b9050919050565b7f56657374696e6743616c6c65723a207570646174652076657374696e6720667560008201527f6e646572206661696c6564000000000000000000000000000000000000000000602082015250565b600061169b602b8361138c565b91506116a68261163f565b604082019050919050565b600060208201905081810360008301526116ca8161168e565b905091905056fea26469706673582212200c0e5b0043edec654be0a450d53af988547ba7d7bb58c9cf6265cc22d8703ba864736f6c63430008130033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/precompiles/vesting/testdata/VestingCaller.sol b/precompiles/vesting/testdata/VestingCaller.sol index 1a12e3ab3e..cb0ccc6b46 100644 --- a/precompiles/vesting/testdata/VestingCaller.sol +++ b/precompiles/vesting/testdata/VestingCaller.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.17; import "../../common/Types.sol"; -import "../Vesting.sol" as vesting; +import "../VestingI.sol" as vesting; /// @title VestingCaller /// @author Evmos Core Team diff --git a/precompiles/vesting/vesting.go b/precompiles/vesting/vesting.go index 300a0740c5..dac8e040e0 100644 --- a/precompiles/vesting/vesting.go +++ b/precompiles/vesting/vesting.go @@ -4,7 +4,6 @@ package vesting import ( - "bytes" "embed" "fmt" @@ -15,7 +14,6 @@ import ( "github.com/cometbft/cometbft/libs/log" storetypes "github.com/cosmos/cosmos-sdk/store/types" authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" - "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" cmn "github.com/evmos/evmos/v18/precompiles/common" @@ -62,16 +60,11 @@ func NewPrecompile( vestingKeeper vestingkeeper.Keeper, authzKeeper authzkeeper.Keeper, ) (*Precompile, error) { - abiBz, err := f.ReadFile("abi.json") + newAbi, err := cmn.LoadABI(f, "abi.json") if err != nil { return nil, fmt.Errorf("error loading the staking ABI %s", err) } - newAbi, err := abi.JSON(bytes.NewReader(abiBz)) - if err != nil { - return nil, fmt.Errorf(cmn.ErrInvalidABI, err) - } - return &Precompile{ Precompile: cmn.Precompile{ ABI: newAbi, diff --git a/precompiles/werc20/abi.json b/precompiles/werc20/abi.json index ba7f8b83eb..eac5c1280f 100644 --- a/precompiles/werc20/abi.json +++ b/precompiles/werc20/abi.json @@ -1,338 +1,347 @@ -[ - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "dst", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "wad", - "type": "uint256" - } - ], - "name": "Deposit", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Transfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "src", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "wad", - "type": "uint256" - } - ], - "name": "Withdrawal", - "type": "event" - }, - { - "stateMutability": "payable", - "type": "fallback" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", - "type": "address" - } - ], - "name": "allowance", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "subtractedValue", - "type": "uint256" - } - ], - "name": "decreaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "approved", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "deposit", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "addedValue", - "type": "uint256" - } - ], - "name": "increaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "approved", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "wad", - "type": "uint256" - } - ], - "name": "withdraw", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "stateMutability": "payable", - "type": "receive" - } -] \ No newline at end of file +{ + "_format": "hh-sol-artifact-1", + "contractName": "IWERC20", + "sourceName": "solidity/precompiles/werc20/IWERC20.sol", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "dst", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "Deposit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "src", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "Withdrawal", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "deposit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/scripts/compile_smart_contracts/compile_smart_contracts.py b/scripts/compile_smart_contracts/compile_smart_contracts.py index fe90f6b3a9..64b569e77c 100644 --- a/scripts/compile_smart_contracts/compile_smart_contracts.py +++ b/scripts/compile_smart_contracts/compile_smart_contracts.py @@ -60,7 +60,7 @@ class Contract: as well as the path to where the compiled JSON data is stored. """ - compiledJSONPath: Union[Path, None] + compiled_json_path: Union[Path, None] filename: str path: Path relative_path: Path @@ -95,6 +95,10 @@ def find_solidity_contracts( if re.search(r"(?!\.dbg)\.sol$", file): filename = os.path.splitext(file)[0] + + # NOTE: In the precompile implementations the interfaces + # are usually called `abi.json`. + potential_abi_json_path = Path(root) / "abi.json" potential_json_path = Path(root) / f"{filename}.json" if ( @@ -105,6 +109,8 @@ def find_solidity_contracts( compiledJSONPath = potential_json_path elif os.path.exists(potential_json_path): compiledJSONPath = potential_json_path + elif os.path.exists(potential_abi_json_path): + compiledJSONPath = potential_abi_json_path elif not os.path.exists(potential_json_path): compiledJSONPath = None else: @@ -117,7 +123,7 @@ def find_solidity_contracts( filename=filename, path=Path(os.path.join(root, file)), relative_path=relative_path, - compiledJSONPath=compiledJSONPath, + compiled_json_path=compiledJSONPath, ) ) @@ -132,7 +138,7 @@ def is_ignored_folder(path: str) -> bool: Check if the folder is in the list of ignored folders. """ - return any([re.search(folder, path) for folder in IGNORED_FOLDERS]) + return any(re.search(folder, path) for folder in IGNORED_FOLDERS) def copy_to_contracts_directory(target_dir: Path, contracts: List[Contract]) -> bool: @@ -171,7 +177,7 @@ def is_evmos_repo(path: Path) -> bool: if "go.mod" not in contents: return False - with open(path / "go.mod", "r") as go_mod: + with open(path / "go.mod", "r", encoding="utf-8") as go_mod: while True: line = go_mod.readline() if not line: @@ -219,7 +225,7 @@ def copy_compiled_contracts_back_to_source( """ for contract in contracts: - if contract.compiledJSONPath is None: + if contract.compiled_json_path is None: continue if is_relative_target(contract.relative_path): @@ -236,7 +242,7 @@ def copy_compiled_contracts_back_to_source( print(f"-> did not find compiled JSON file for {contract.filename}") continue - copy(compiled_path, contract.compiledJSONPath) + copy(compiled_path, contract.compiled_json_path) def clean_up_hardhat_project(hardhat_dir: Path): @@ -279,7 +285,7 @@ def compile_files(repo_path: Path, added_contract: Union[str, None] = None): with Hardhat. """ - found_contracts = find_solidity_contracts(REPO_PATH, added_contract=added_contract) + found_contracts = find_solidity_contracts(repo_path, added_contract=added_contract) if not copy_to_contracts_directory(CONTRACTS_TARGET, found_contracts): raise ValueError("Failed to copy contracts to target directory.") diff --git a/scripts/compile_smart_contracts/test_compile_smart_contracts.py b/scripts/compile_smart_contracts/test_compile_smart_contracts.py index d5a91d8603..388f21941f 100644 --- a/scripts/compile_smart_contracts/test_compile_smart_contracts.py +++ b/scripts/compile_smart_contracts/test_compile_smart_contracts.py @@ -33,23 +33,27 @@ def setup_example_contracts_files(tmp_path): (tmp_path / "precompiles" / "Contract4.sol").touch() (tmp_path / "precompiles" / "Contract4.json").touch() + (tmp_path / "precompiles" / "staking").mkdir(parents=True) + (tmp_path / "precompiles" / "staking" / "StakingI.sol").touch() + (tmp_path / "precompiles" / "staking" / "abi.json").touch() + return tmp_path def test_find_solidity_files(setup_example_contracts_files): tmp_path = setup_example_contracts_files found_solidity_contracts = find_solidity_contracts(tmp_path) - assert len(found_solidity_contracts) == 4 + assert len(found_solidity_contracts) == 5 assert found_solidity_contracts[0].filename == "Contract2" assert found_solidity_contracts[0].path == tmp_path / "Contract2.sol" assert found_solidity_contracts[0].relative_path == Path(".") - assert found_solidity_contracts[0].compiledJSONPath is None + assert found_solidity_contracts[0].compiled_json_path is None assert found_solidity_contracts[1].filename == "Contract1" assert found_solidity_contracts[1].path == tmp_path / "Contract1.sol" assert found_solidity_contracts[1].relative_path == Path(".") - assert found_solidity_contracts[1].compiledJSONPath == Path( + assert found_solidity_contracts[1].compiled_json_path == Path( tmp_path / "Contract1.json" ) @@ -58,13 +62,21 @@ def test_find_solidity_files(setup_example_contracts_files): tmp_path / "precompiles" / "Contract4.sol" ) assert found_solidity_contracts[2].relative_path == Path("precompiles") - assert found_solidity_contracts[2].compiledJSONPath == Path( + assert found_solidity_contracts[2].compiled_json_path == Path( tmp_path / "precompiles" / "Contract4.json" ) - assert found_solidity_contracts[3].filename == "Contract3" - assert found_solidity_contracts[3].relative_path == Path(HARDHAT_PROJECT_DIR) - assert found_solidity_contracts[3].compiledJSONPath == Path( + assert found_solidity_contracts[3].filename == "StakingI" + assert found_solidity_contracts[3].path == Path( + tmp_path / "precompiles" / "staking" / "StakingI.sol" + ) + assert found_solidity_contracts[3].compiled_json_path == Path( + tmp_path / "precompiles" / "staking" / "abi.json" + ) + + assert found_solidity_contracts[4].filename == "Contract3" + assert found_solidity_contracts[4].relative_path == Path(HARDHAT_PROJECT_DIR) + assert found_solidity_contracts[4].compiled_json_path == Path( tmp_path / HARDHAT_PROJECT_DIR / "Contract3.json" ) diff --git a/scripts/license_checker/check_licenses.py b/scripts/license_checker/check_licenses.py index 0642976bee..3c431f42b2 100644 --- a/scripts/license_checker/check_licenses.py +++ b/scripts/license_checker/check_licenses.py @@ -7,6 +7,7 @@ - LGPL3: This license is used for all files that are generated by the Cosmos SDK. - Geth: This license is used for all files that are copied from the Geth repository. """ + import os import re import sys diff --git a/tests/nix_tests/test_distr_precompile.py b/tests/nix_tests/test_distr_precompile.py index fffddfb9e3..09eae93a91 100644 --- a/tests/nix_tests/test_distr_precompile.py +++ b/tests/nix_tests/test_distr_precompile.py @@ -123,7 +123,9 @@ def check_contract_balance(): # check that community pool balance increased funds_sent_amt = args[1] community_final_balance = evmos_cluster.cosmos_cli().distribution_community() - assert community_final_balance >= community_prev_balance + funds_sent_amt, f"Failed: {name}" + assert ( + community_final_balance >= community_prev_balance + funds_sent_amt + ), f"Failed: {name}" # signer2 balance should remain unchanged signer2_final_balance = get_balance( diff --git a/x/evm/statedb/testdata/FlashLoan.json b/x/evm/statedb/testdata/FlashLoan.json index e3520273ae..5c3a52bdbe 100644 --- a/x/evm/statedb/testdata/FlashLoan.json +++ b/x/evm/statedb/testdata/FlashLoan.json @@ -51,8 +51,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610eea806100606000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80638da5cb5b1461003b578063ee52ad7114610059575b600080fd5b610043610089565b60405161005091906106dd565b60405180910390f35b610073600480360381019061006e91906108b4565b6100ad565b604051610080919061093e565b60405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461013e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610135906109dc565b60405180910390fd5b6000849050828173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b815260040161017f9291906109fc565b602060405180830381865afa15801561019c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101c09190610a3a565b1015610201576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f890610ab3565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161023c91906106dd565b602060405180830381865afa158015610259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027d9190610a3a565b905060008273ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b81526004016102be93929190610ae2565b6020604051808303816000875af11580156102dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103019190610b45565b905080610343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033a90610be4565b60405180910390fd5b848261034f9190610c33565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161038891906106dd565b602060405180830381865afa1580156103a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c99190610a3a565b14610409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040090610cb3565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3388886040518463ffffffff1660e01b815260040161044893929190610d41565b6020604051808303816000875af1158015610467573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048b9190610b45565b9050806104cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104c490610dcb565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161050691906106dd565b602060405180830381865afa158015610523573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105479190610a3a565b91508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33876040518363ffffffff1660e01b8152600401610584929190610deb565b6020604051808303816000875af11580156105a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c79190610b45565b5084826105d49190610e14565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161060d91906106dd565b602060405180830381865afa15801561062a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064e9190610a3a565b1461068e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068590610e94565b60405180910390fd5b600193505050509392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106c78261069c565b9050919050565b6106d7816106bc565b82525050565b60006020820190506106f260008301846106ce565b92915050565b6000604051905090565b600080fd5b600080fd5b610715816106bc565b811461072057600080fd5b50565b6000813590506107328161070c565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61078b82610742565b810181811067ffffffffffffffff821117156107aa576107a9610753565b5b80604052505050565b60006107bd6106f8565b90506107c98282610782565b919050565b600067ffffffffffffffff8211156107e9576107e8610753565b5b6107f282610742565b9050602081019050919050565b82818337600083830152505050565b600061082161081c846107ce565b6107b3565b90508281526020810184848401111561083d5761083c61073d565b5b6108488482856107ff565b509392505050565b600082601f83011261086557610864610738565b5b813561087584826020860161080e565b91505092915050565b6000819050919050565b6108918161087e565b811461089c57600080fd5b50565b6000813590506108ae81610888565b92915050565b6000806000606084860312156108cd576108cc610702565b5b60006108db86828701610723565b935050602084013567ffffffffffffffff8111156108fc576108fb610707565b5b61090886828701610850565b92505060406109198682870161089f565b9150509250925092565b60008115159050919050565b61093881610923565b82525050565b6000602082019050610953600083018461092f565b92915050565b600082825260208201905092915050565b7f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b60006109c6602183610959565b91506109d18261096a565b604082019050919050565b600060208201905081810360008301526109f5816109b9565b9050919050565b6000604082019050610a1160008301856106ce565b610a1e60208301846106ce565b9392505050565b600081519050610a3481610888565b92915050565b600060208284031215610a5057610a4f610702565b5b6000610a5e84828501610a25565b91505092915050565b7f496e73756666696369656e7420616c6c6f77616e636500000000000000000000600082015250565b6000610a9d601683610959565b9150610aa882610a67565b602082019050919050565b60006020820190508181036000830152610acc81610a90565b9050919050565b610adc8161087e565b82525050565b6000606082019050610af760008301866106ce565b610b0460208301856106ce565b610b116040830184610ad3565b949350505050565b610b2281610923565b8114610b2d57600080fd5b50565b600081519050610b3f81610b19565b92915050565b600060208284031215610b5b57610b5a610702565b5b6000610b6984828501610b30565b91505092915050565b7f4661696c656420746f207472616e7366657220746f6b656e7320666f7220666c60008201527f617368206c6f616e000000000000000000000000000000000000000000000000602082015250565b6000610bce602883610959565b9150610bd982610b72565b604082019050919050565b60006020820190508181036000830152610bfd81610bc1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610c3e8261087e565b9150610c498361087e565b9250828201905080821115610c6157610c60610c04565b5b92915050565b7f466c617368206c6f616e206661696c6564000000000000000000000000000000600082015250565b6000610c9d601183610959565b9150610ca882610c67565b602082019050919050565b60006020820190508181036000830152610ccc81610c90565b9050919050565b600081519050919050565b60005b83811015610cfc578082015181840152602081019050610ce1565b60008484015250505050565b6000610d1382610cd3565b610d1d8185610959565b9350610d2d818560208601610cde565b610d3681610742565b840191505092915050565b6000606082019050610d5660008301866106ce565b8181036020830152610d688185610d08565b9050610d776040830184610ad3565b949350505050565b7f6661696c656420746f2064656c65676174650000000000000000000000000000600082015250565b6000610db5601283610959565b9150610dc082610d7f565b602082019050919050565b60006020820190508181036000830152610de481610da8565b9050919050565b6000604082019050610e0060008301856106ce565b610e0d6020830184610ad3565b9392505050565b6000610e1f8261087e565b9150610e2a8361087e565b9250828203905081811115610e4257610e41610c04565b5b92915050565b7f466c617368206c6f616e2072657061796d656e74206661696c65640000000000600082015250565b6000610e7e601b83610959565b9150610e8982610e48565b602082019050919050565b60006020820190508181036000830152610ead81610e71565b905091905056fea264697066735822122057b4e05b96b02acf54c697cdf4a7032ce06061074aa1ac3505b5ac0ef5d5908a64736f6c63430008130033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c80638da5cb5b1461003b578063ee52ad7114610059575b600080fd5b610043610089565b60405161005091906106dd565b60405180910390f35b610073600480360381019061006e91906108b4565b6100ad565b604051610080919061093e565b60405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461013e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610135906109dc565b60405180910390fd5b6000849050828173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b815260040161017f9291906109fc565b602060405180830381865afa15801561019c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101c09190610a3a565b1015610201576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f890610ab3565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161023c91906106dd565b602060405180830381865afa158015610259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027d9190610a3a565b905060008273ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b81526004016102be93929190610ae2565b6020604051808303816000875af11580156102dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103019190610b45565b905080610343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033a90610be4565b60405180910390fd5b848261034f9190610c33565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161038891906106dd565b602060405180830381865afa1580156103a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c99190610a3a565b14610409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040090610cb3565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3388886040518463ffffffff1660e01b815260040161044893929190610d41565b6020604051808303816000875af1158015610467573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048b9190610b45565b9050806104cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104c490610dcb565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161050691906106dd565b602060405180830381865afa158015610523573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105479190610a3a565b91508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33876040518363ffffffff1660e01b8152600401610584929190610deb565b6020604051808303816000875af11580156105a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c79190610b45565b5084826105d49190610e14565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161060d91906106dd565b602060405180830381865afa15801561062a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064e9190610a3a565b1461068e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068590610e94565b60405180910390fd5b600193505050509392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106c78261069c565b9050919050565b6106d7816106bc565b82525050565b60006020820190506106f260008301846106ce565b92915050565b6000604051905090565b600080fd5b600080fd5b610715816106bc565b811461072057600080fd5b50565b6000813590506107328161070c565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61078b82610742565b810181811067ffffffffffffffff821117156107aa576107a9610753565b5b80604052505050565b60006107bd6106f8565b90506107c98282610782565b919050565b600067ffffffffffffffff8211156107e9576107e8610753565b5b6107f282610742565b9050602081019050919050565b82818337600083830152505050565b600061082161081c846107ce565b6107b3565b90508281526020810184848401111561083d5761083c61073d565b5b6108488482856107ff565b509392505050565b600082601f83011261086557610864610738565b5b813561087584826020860161080e565b91505092915050565b6000819050919050565b6108918161087e565b811461089c57600080fd5b50565b6000813590506108ae81610888565b92915050565b6000806000606084860312156108cd576108cc610702565b5b60006108db86828701610723565b935050602084013567ffffffffffffffff8111156108fc576108fb610707565b5b61090886828701610850565b92505060406109198682870161089f565b9150509250925092565b60008115159050919050565b61093881610923565b82525050565b6000602082019050610953600083018461092f565b92915050565b600082825260208201905092915050565b7f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b60006109c6602183610959565b91506109d18261096a565b604082019050919050565b600060208201905081810360008301526109f5816109b9565b9050919050565b6000604082019050610a1160008301856106ce565b610a1e60208301846106ce565b9392505050565b600081519050610a3481610888565b92915050565b600060208284031215610a5057610a4f610702565b5b6000610a5e84828501610a25565b91505092915050565b7f496e73756666696369656e7420616c6c6f77616e636500000000000000000000600082015250565b6000610a9d601683610959565b9150610aa882610a67565b602082019050919050565b60006020820190508181036000830152610acc81610a90565b9050919050565b610adc8161087e565b82525050565b6000606082019050610af760008301866106ce565b610b0460208301856106ce565b610b116040830184610ad3565b949350505050565b610b2281610923565b8114610b2d57600080fd5b50565b600081519050610b3f81610b19565b92915050565b600060208284031215610b5b57610b5a610702565b5b6000610b6984828501610b30565b91505092915050565b7f4661696c656420746f207472616e7366657220746f6b656e7320666f7220666c60008201527f617368206c6f616e000000000000000000000000000000000000000000000000602082015250565b6000610bce602883610959565b9150610bd982610b72565b604082019050919050565b60006020820190508181036000830152610bfd81610bc1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610c3e8261087e565b9150610c498361087e565b9250828201905080821115610c6157610c60610c04565b5b92915050565b7f466c617368206c6f616e206661696c6564000000000000000000000000000000600082015250565b6000610c9d601183610959565b9150610ca882610c67565b602082019050919050565b60006020820190508181036000830152610ccc81610c90565b9050919050565b600081519050919050565b60005b83811015610cfc578082015181840152602081019050610ce1565b60008484015250505050565b6000610d1382610cd3565b610d1d8185610959565b9350610d2d818560208601610cde565b610d3681610742565b840191505092915050565b6000606082019050610d5660008301866106ce565b8181036020830152610d688185610d08565b9050610d776040830184610ad3565b949350505050565b7f6661696c656420746f2064656c65676174650000000000000000000000000000600082015250565b6000610db5601283610959565b9150610dc082610d7f565b602082019050919050565b60006020820190508181036000830152610de481610da8565b9050919050565b6000604082019050610e0060008301856106ce565b610e0d6020830184610ad3565b9392505050565b6000610e1f8261087e565b9150610e2a8361087e565b9250828203905081811115610e4257610e41610c04565b5b92915050565b7f466c617368206c6f616e2072657061796d656e74206661696c65640000000000600082015250565b6000610e7e601b83610959565b9150610e8982610e48565b602082019050919050565b60006020820190508181036000830152610ead81610e71565b905091905056fea264697066735822122057b4e05b96b02acf54c697cdf4a7032ce06061074aa1ac3505b5ac0ef5d5908a64736f6c63430008130033", + "bytecode": "0x608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610eea806100606000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80638da5cb5b1461003b578063ee52ad7114610059575b600080fd5b610043610089565b60405161005091906106dd565b60405180910390f35b610073600480360381019061006e91906108b4565b6100ad565b604051610080919061093e565b60405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461013e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610135906109dc565b60405180910390fd5b6000849050828173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b815260040161017f9291906109fc565b602060405180830381865afa15801561019c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101c09190610a3a565b1015610201576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f890610ab3565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161023c91906106dd565b602060405180830381865afa158015610259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027d9190610a3a565b905060008273ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b81526004016102be93929190610ae2565b6020604051808303816000875af11580156102dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103019190610b45565b905080610343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033a90610be4565b60405180910390fd5b848261034f9190610c33565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161038891906106dd565b602060405180830381865afa1580156103a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c99190610a3a565b14610409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040090610cb3565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3388886040518463ffffffff1660e01b815260040161044893929190610d41565b6020604051808303816000875af1158015610467573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048b9190610b45565b9050806104cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104c490610dcb565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161050691906106dd565b602060405180830381865afa158015610523573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105479190610a3a565b91508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33876040518363ffffffff1660e01b8152600401610584929190610deb565b6020604051808303816000875af11580156105a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c79190610b45565b5084826105d49190610e14565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161060d91906106dd565b602060405180830381865afa15801561062a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064e9190610a3a565b1461068e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068590610e94565b60405180910390fd5b600193505050509392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106c78261069c565b9050919050565b6106d7816106bc565b82525050565b60006020820190506106f260008301846106ce565b92915050565b6000604051905090565b600080fd5b600080fd5b610715816106bc565b811461072057600080fd5b50565b6000813590506107328161070c565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61078b82610742565b810181811067ffffffffffffffff821117156107aa576107a9610753565b5b80604052505050565b60006107bd6106f8565b90506107c98282610782565b919050565b600067ffffffffffffffff8211156107e9576107e8610753565b5b6107f282610742565b9050602081019050919050565b82818337600083830152505050565b600061082161081c846107ce565b6107b3565b90508281526020810184848401111561083d5761083c61073d565b5b6108488482856107ff565b509392505050565b600082601f83011261086557610864610738565b5b813561087584826020860161080e565b91505092915050565b6000819050919050565b6108918161087e565b811461089c57600080fd5b50565b6000813590506108ae81610888565b92915050565b6000806000606084860312156108cd576108cc610702565b5b60006108db86828701610723565b935050602084013567ffffffffffffffff8111156108fc576108fb610707565b5b61090886828701610850565b92505060406109198682870161089f565b9150509250925092565b60008115159050919050565b61093881610923565b82525050565b6000602082019050610953600083018461092f565b92915050565b600082825260208201905092915050565b7f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b60006109c6602183610959565b91506109d18261096a565b604082019050919050565b600060208201905081810360008301526109f5816109b9565b9050919050565b6000604082019050610a1160008301856106ce565b610a1e60208301846106ce565b9392505050565b600081519050610a3481610888565b92915050565b600060208284031215610a5057610a4f610702565b5b6000610a5e84828501610a25565b91505092915050565b7f496e73756666696369656e7420616c6c6f77616e636500000000000000000000600082015250565b6000610a9d601683610959565b9150610aa882610a67565b602082019050919050565b60006020820190508181036000830152610acc81610a90565b9050919050565b610adc8161087e565b82525050565b6000606082019050610af760008301866106ce565b610b0460208301856106ce565b610b116040830184610ad3565b949350505050565b610b2281610923565b8114610b2d57600080fd5b50565b600081519050610b3f81610b19565b92915050565b600060208284031215610b5b57610b5a610702565b5b6000610b6984828501610b30565b91505092915050565b7f4661696c656420746f207472616e7366657220746f6b656e7320666f7220666c60008201527f617368206c6f616e000000000000000000000000000000000000000000000000602082015250565b6000610bce602883610959565b9150610bd982610b72565b604082019050919050565b60006020820190508181036000830152610bfd81610bc1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610c3e8261087e565b9150610c498361087e565b9250828201905080821115610c6157610c60610c04565b5b92915050565b7f466c617368206c6f616e206661696c6564000000000000000000000000000000600082015250565b6000610c9d601183610959565b9150610ca882610c67565b602082019050919050565b60006020820190508181036000830152610ccc81610c90565b9050919050565b600081519050919050565b60005b83811015610cfc578082015181840152602081019050610ce1565b60008484015250505050565b6000610d1382610cd3565b610d1d8185610959565b9350610d2d818560208601610cde565b610d3681610742565b840191505092915050565b6000606082019050610d5660008301866106ce565b8181036020830152610d688185610d08565b9050610d776040830184610ad3565b949350505050565b7f6661696c656420746f2064656c65676174650000000000000000000000000000600082015250565b6000610db5601283610959565b9150610dc082610d7f565b602082019050919050565b60006020820190508181036000830152610de481610da8565b9050919050565b6000604082019050610e0060008301856106ce565b610e0d6020830184610ad3565b9392505050565b6000610e1f8261087e565b9150610e2a8361087e565b9250828203905081811115610e4257610e41610c04565b5b92915050565b7f466c617368206c6f616e2072657061796d656e74206661696c65640000000000600082015250565b6000610e7e601b83610959565b9150610e8982610e48565b602082019050919050565b60006020820190508181036000830152610ead81610e71565b905091905056fea2646970667358221220f8f1e00d77bb2e4f68e3582e92c72a3b3fd0777a8c0b1e401f2a95ca1ba1df7e64736f6c63430008130033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c80638da5cb5b1461003b578063ee52ad7114610059575b600080fd5b610043610089565b60405161005091906106dd565b60405180910390f35b610073600480360381019061006e91906108b4565b6100ad565b604051610080919061093e565b60405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461013e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610135906109dc565b60405180910390fd5b6000849050828173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b815260040161017f9291906109fc565b602060405180830381865afa15801561019c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101c09190610a3a565b1015610201576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f890610ab3565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161023c91906106dd565b602060405180830381865afa158015610259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027d9190610a3a565b905060008273ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b81526004016102be93929190610ae2565b6020604051808303816000875af11580156102dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103019190610b45565b905080610343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033a90610be4565b60405180910390fd5b848261034f9190610c33565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161038891906106dd565b602060405180830381865afa1580156103a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c99190610a3a565b14610409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040090610cb3565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3388886040518463ffffffff1660e01b815260040161044893929190610d41565b6020604051808303816000875af1158015610467573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048b9190610b45565b9050806104cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104c490610dcb565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161050691906106dd565b602060405180830381865afa158015610523573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105479190610a3a565b91508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33876040518363ffffffff1660e01b8152600401610584929190610deb565b6020604051808303816000875af11580156105a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c79190610b45565b5084826105d49190610e14565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161060d91906106dd565b602060405180830381865afa15801561062a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064e9190610a3a565b1461068e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068590610e94565b60405180910390fd5b600193505050509392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106c78261069c565b9050919050565b6106d7816106bc565b82525050565b60006020820190506106f260008301846106ce565b92915050565b6000604051905090565b600080fd5b600080fd5b610715816106bc565b811461072057600080fd5b50565b6000813590506107328161070c565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61078b82610742565b810181811067ffffffffffffffff821117156107aa576107a9610753565b5b80604052505050565b60006107bd6106f8565b90506107c98282610782565b919050565b600067ffffffffffffffff8211156107e9576107e8610753565b5b6107f282610742565b9050602081019050919050565b82818337600083830152505050565b600061082161081c846107ce565b6107b3565b90508281526020810184848401111561083d5761083c61073d565b5b6108488482856107ff565b509392505050565b600082601f83011261086557610864610738565b5b813561087584826020860161080e565b91505092915050565b6000819050919050565b6108918161087e565b811461089c57600080fd5b50565b6000813590506108ae81610888565b92915050565b6000806000606084860312156108cd576108cc610702565b5b60006108db86828701610723565b935050602084013567ffffffffffffffff8111156108fc576108fb610707565b5b61090886828701610850565b92505060406109198682870161089f565b9150509250925092565b60008115159050919050565b61093881610923565b82525050565b6000602082019050610953600083018461092f565b92915050565b600082825260208201905092915050565b7f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b60006109c6602183610959565b91506109d18261096a565b604082019050919050565b600060208201905081810360008301526109f5816109b9565b9050919050565b6000604082019050610a1160008301856106ce565b610a1e60208301846106ce565b9392505050565b600081519050610a3481610888565b92915050565b600060208284031215610a5057610a4f610702565b5b6000610a5e84828501610a25565b91505092915050565b7f496e73756666696369656e7420616c6c6f77616e636500000000000000000000600082015250565b6000610a9d601683610959565b9150610aa882610a67565b602082019050919050565b60006020820190508181036000830152610acc81610a90565b9050919050565b610adc8161087e565b82525050565b6000606082019050610af760008301866106ce565b610b0460208301856106ce565b610b116040830184610ad3565b949350505050565b610b2281610923565b8114610b2d57600080fd5b50565b600081519050610b3f81610b19565b92915050565b600060208284031215610b5b57610b5a610702565b5b6000610b6984828501610b30565b91505092915050565b7f4661696c656420746f207472616e7366657220746f6b656e7320666f7220666c60008201527f617368206c6f616e000000000000000000000000000000000000000000000000602082015250565b6000610bce602883610959565b9150610bd982610b72565b604082019050919050565b60006020820190508181036000830152610bfd81610bc1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610c3e8261087e565b9150610c498361087e565b9250828201905080821115610c6157610c60610c04565b5b92915050565b7f466c617368206c6f616e206661696c6564000000000000000000000000000000600082015250565b6000610c9d601183610959565b9150610ca882610c67565b602082019050919050565b60006020820190508181036000830152610ccc81610c90565b9050919050565b600081519050919050565b60005b83811015610cfc578082015181840152602081019050610ce1565b60008484015250505050565b6000610d1382610cd3565b610d1d8185610959565b9350610d2d818560208601610cde565b610d3681610742565b840191505092915050565b6000606082019050610d5660008301866106ce565b8181036020830152610d688185610d08565b9050610d776040830184610ad3565b949350505050565b7f6661696c656420746f2064656c65676174650000000000000000000000000000600082015250565b6000610db5601283610959565b9150610dc082610d7f565b602082019050919050565b60006020820190508181036000830152610de481610da8565b9050919050565b6000604082019050610e0060008301856106ce565b610e0d6020830184610ad3565b9392505050565b6000610e1f8261087e565b9150610e2a8361087e565b9250828203905081811115610e4257610e41610c04565b5b92915050565b7f466c617368206c6f616e2072657061796d656e74206661696c65640000000000600082015250565b6000610e7e601b83610959565b9150610e8982610e48565b602082019050919050565b60006020820190508181036000830152610ead81610e71565b905091905056fea2646970667358221220f8f1e00d77bb2e4f68e3582e92c72a3b3fd0777a8c0b1e401f2a95ca1ba1df7e64736f6c63430008130033", "linkReferences": {}, "deployedLinkReferences": {} } From 9f6b18191fa19e2c259163f9b0c4ca582188c6a7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Jul 2024 11:27:31 -0300 Subject: [PATCH 313/345] build(deps): bump golang from 1.22.4-alpine3.20 to 1.22.5-alpine3.20 (#2654) Bumps golang from 1.22.4-alpine3.20 to 1.22.5-alpine3.20. --- updated-dependencies: - dependency-name: golang dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index ec75b17f4f..25f49d6497 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.22.4-alpine3.20 AS build-env +FROM golang:1.22.5-alpine3.20 AS build-env ARG DB_BACKEND=goleveldb ARG ROCKSDB_VERSION="9.2.1" From 70f2e706cd757d3f1e26c3fea46ccfd260e38b06 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Jul 2024 11:41:11 -0300 Subject: [PATCH 314/345] build(deps): bump google.golang.org/grpc from 1.64.0 to 1.65.0 (#2652) * build(deps): bump google.golang.org/grpc from 1.64.0 to 1.65.0 Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.64.0 to 1.65.0. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.64.0...v1.65.0) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * update gomod2nix.toml file --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- go.mod | 16 +++++++--------- go.sum | 32 ++++++++++++++------------------ gomod2nix.toml | 34 ++++++++++++++-------------------- 3 files changed, 35 insertions(+), 47 deletions(-) diff --git a/go.mod b/go.mod index b3c2838003..ba3ba39731 100644 --- a/go.mod +++ b/go.mod @@ -48,16 +48,15 @@ require ( golang.org/x/crypto v0.24.0 golang.org/x/net v0.26.0 golang.org/x/text v0.16.0 - google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237 - google.golang.org/grpc v1.64.0 + google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 + google.golang.org/grpc v1.65.0 google.golang.org/protobuf v1.34.2 sigs.k8s.io/yaml v1.4.0 ) require ( cloud.google.com/go v0.112.1 // indirect - cloud.google.com/go/compute v1.25.1 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect + cloud.google.com/go/compute/metadata v0.3.0 // indirect cloud.google.com/go/iam v1.1.6 // indirect cloud.google.com/go/storage v1.38.0 // indirect cosmossdk.io/core v0.6.1 // indirect @@ -81,7 +80,7 @@ require ( github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 // indirect github.com/cenkalti/backoff/v4 v4.1.3 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/chzyer/readline v1.5.1 // indirect github.com/cockroachdb/apd/v2 v2.0.2 // indirect github.com/cockroachdb/errors v1.11.1 // indirect @@ -131,7 +130,7 @@ require ( github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/gogo/googleapis v1.4.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/glog v1.2.0 // indirect + github.com/golang/glog v1.2.1 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/mock v1.6.0 // indirect github.com/golang/snappy v0.0.4 // indirect @@ -237,16 +236,15 @@ require ( go.uber.org/multierr v1.10.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/mod v0.17.0 // indirect - golang.org/x/oauth2 v0.18.0 // indirect + golang.org/x/oauth2 v0.20.0 // indirect golang.org/x/sync v0.7.0 // indirect golang.org/x/sys v0.21.0 // indirect golang.org/x/term v0.21.0 // indirect golang.org/x/time v0.5.0 // indirect golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect google.golang.org/api v0.169.0 // indirect - google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index d2a1e8c36c..fc700fbf47 100644 --- a/go.sum +++ b/go.sum @@ -68,10 +68,8 @@ cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.25.1 h1:ZRpHJedLtTpKgr3RV1Fx23NuaAEN1Zfx9hw1u4aJdjU= -cloud.google.com/go/compute v1.25.1/go.mod h1:oopOIR53ly6viBYxaDhBfJwzUAxf1zE//uf3IB011ls= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= +cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= @@ -306,8 +304,8 @@ github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= @@ -564,8 +562,8 @@ github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69 github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog= github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= -github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4= +github.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -1340,8 +1338,8 @@ golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= -golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= -golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= +golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= +golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1621,8 +1619,6 @@ google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1731,10 +1727,10 @@ google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY= google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo= -google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237 h1:RFiFrvy37/mpSpdySBDrUdipW/dHwsRwh3J3+A9VgT4= -google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237/go.mod h1:Z5Iiy3jtmioajWHDGFk7CeugTyHtPvMHA4UTmUkyalE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 h1:7whR9kGa5LUwFtpLm2ArCEejtnxlGeLbAyjFY8sGNFw= +google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157/go.mod h1:99sLkeliLXfdj2J75X3Ho+rrVCaJze0uwN7zDDkjPVU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 h1:Zy9XzmMEflZ/MAaA7vNcoebnRAld7FsPW1EeBB7V0m8= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -1776,8 +1772,8 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= +google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= +google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= diff --git a/gomod2nix.toml b/gomod2nix.toml index 6ed46e72d6..0e51cfba4c 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -4,12 +4,9 @@ schema = 3 [mod."cloud.google.com/go"] version = "v0.112.1" hash = "sha256-r2N7sr7XoAqi4aRdp/F1OJh6riZCpavsE1Yhl1Fc5ew=" - [mod."cloud.google.com/go/compute"] - version = "v1.25.1" - hash = "sha256-A5Wiq8eKgolb81ZpAnoGaBNrTtHpDLLPFgXBJaKcnSA=" [mod."cloud.google.com/go/compute/metadata"] - version = "v0.2.3" - hash = "sha256-kYB1FTQRdTDqCqJzSU/jJYbVUGyxbkASUKbEs36FUyU=" + version = "v0.3.0" + hash = "sha256-hj2Xjlz3vj7KYONZO/ItclWGGJEUgo5EvMEkGPfQi1Q=" [mod."cloud.google.com/go/iam"] version = "v1.1.6" hash = "sha256-u91oZdyy/wgk3J8Z+4mWmn+YliSBIATu6kpyH20Dd8k=" @@ -105,8 +102,8 @@ schema = 3 version = "v4.1.3" hash = "sha256-u6MEDopHoTWAZoVvvXOKnAg++xre53YgQx0gmf6t2KU=" [mod."github.com/cespare/xxhash/v2"] - version = "v2.2.0" - hash = "sha256-nPufwYQfTkyrEkbBrpqM3C2vnMxfIz6tAaBmiUP7vd4=" + version = "v2.3.0" + hash = "sha256-7hRlwSR+fos1kx4VZmJ/7snR7zHh8ZFKX+qqqqGcQpY=" [mod."github.com/chzyer/readline"] version = "v1.5.1" hash = "sha256-6wKd6/JZ9/O7FwSyNKE3KOt8fVPZEunqbTHQUxlOUNc=" @@ -294,8 +291,8 @@ schema = 3 version = "v1.3.2" hash = "sha256-pogILFrrk+cAtb0ulqn9+gRZJ7sGnnLLdtqITvxvG6c=" [mod."github.com/golang/glog"] - version = "v1.2.0" - hash = "sha256-eCWkUlsWbHSjsuTw8HcNpj3KxT+QPvW5SSIv88hAsxA=" + version = "v1.2.1" + hash = "sha256-H9gR4sQRFOb4ZlSwvxU0MGR6iKnYWv4NSY3genjN/V4=" [mod."github.com/golang/groupcache"] version = "v0.0.0-20210331224755-41bb18bfe9da" hash = "sha256-7Gs7CS9gEYZkbu5P4hqPGBpeGZWC64VDwraSKFF+VR0=" @@ -686,8 +683,8 @@ schema = 3 version = "v0.26.0" hash = "sha256-WfY33QERNbcIiDkH3+p2XGrAVqvWBQfc8neUt6TH6dQ=" [mod."golang.org/x/oauth2"] - version = "v0.18.0" - hash = "sha256-TX4CvtvHU+SGSmqlxaQqlgJjlJiOtLGYAZa0zeBfZak=" + version = "v0.20.0" + hash = "sha256-A/xfMmGvwqE94IZliqnzi76rAH2UwnMWcSlHQK6VnuE=" [mod."golang.org/x/sync"] version = "v0.7.0" hash = "sha256-2ETllEu2GDWoOd/yMkOkLC2hWBpKzbVZ8LhjLu0d2A8=" @@ -709,21 +706,18 @@ schema = 3 [mod."google.golang.org/api"] version = "v0.169.0" hash = "sha256-7+EAvbTTnUutkXpQBbxPSmZTS5P0mrKTiFooMI81w0k=" - [mod."google.golang.org/appengine"] - version = "v1.6.8" - hash = "sha256-decMa0MiWfW/Bzr8QPPzzpeya0YWGHhZAt4Cr/bD1wQ=" [mod."google.golang.org/genproto"] version = "v0.0.0-20240227224415-6ceb2ff114de" hash = "sha256-G+tvsCTXxzk3sS6HbBxPN1DYaN1tPOqKsa60mI05Feg=" [mod."google.golang.org/genproto/googleapis/api"] - version = "v0.0.0-20240318140521-94a12d6c2237" - hash = "sha256-Tl2ABoESriYlPfeawE9xd5gPQYGzW4j/Il6gXEw33f0=" + version = "v0.0.0-20240528184218-531527333157" + hash = "sha256-if1E4g6xCKqL43uyMiKC4C6qY1e/+T5yfp8DYvQ/HwE=" [mod."google.golang.org/genproto/googleapis/rpc"] - version = "v0.0.0-20240318140521-94a12d6c2237" - hash = "sha256-P5SBku16dYnK4koUQxTeGwPxAAWH8rxbDm2pOzFLo/Q=" + version = "v0.0.0-20240528184218-531527333157" + hash = "sha256-hQjIHJdIBBAthdXMB19Xr3A2Wy6GV6Gjv4w4MZl7qy4=" [mod."google.golang.org/grpc"] - version = "v1.64.0" - hash = "sha256-04Noi8lrzr+4ac2BA7KNXUXN/xZL/A2SsEpC2Hern84=" + version = "v1.65.0" + hash = "sha256-YP4dewjs+YuTH7rD1p/AFNoKHlk037wbVvSLVAtewIA=" [mod."google.golang.org/protobuf"] version = "v1.34.2" hash = "sha256-nMTlrDEE2dbpWz50eQMPBQXCyQh4IdjrTIccaU0F3m0=" From bb2d504eec9078d6eff6981fc0cb214e8a3ca496 Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Thu, 4 Jul 2024 12:02:31 -0300 Subject: [PATCH 315/345] Merge pull request from GHSA-68fc-7mhg-6f6c * fix(stk-precompile): update dirty state * add create validator tests cases * fix(distr-precompile): update dirty state * add additional condition in isContract * refactor test * add more functions to the DistrCaller.sol * fix(ics20-precompile) update dirty state * chore(tests): add more test cases for ics20 precompile * add multi-transfer tx test cases * chore(tests): add more test cases for distr precompile * Update precompiles/common/precompile.go Signed-off-by: Tom <54514587+GAtom22@users.noreply.github.com> * refactor getWithdrawerHexAddr func * chore(staking-precompile): update CreateValidator and EditValidator checks * chore(tests): update staking precompile tests * chore(distr-precompile): remove claimRewards method * make format * add back claimRewards func commented out * comment out claimRewards from distr precompile logic * add staking test with transfer to bonded tokens acc * chore(ibc-transfer): add escrow account to dirties * chore(test): add test cases for ics20 precompile and escrow addr * Update tests/nix_tests/test_ics20_precompile.py Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Signed-off-by: Tom <54514587+GAtom22@users.noreply.github.com> * remove hardcoded exp balance * fix(precompile): use cache ctx on stateDB * add journal entry for precompiles * keep only last writeFn * add MaxPrecompileCalls limit * refactor precompile calls logic * remove unnecessary code * changes based on review comments * add StakingReverter tests * add revert test case for distr precompile * refactor cache ctx on stateDB * refactor: move CommitWithCacheCtx to RunSetup * chore: add events to snapshot * update ICS20 tests * fix err msg * renamve var * add a func on precompile cmn for journal entry * rename var * add comment * update comment description * update expected gas in ibc transfer test * address review comments * update comt * tests(ics20): add helper func to setup contract * tests(ics20): add test for nested revert * address review comments * add distr precompile tests * refactor to remove UpdateDirties func * Update precompiles/distribution/tx.go Co-authored-by: Ramiro Carlucho Signed-off-by: Tom <54514587+GAtom22@users.noreply.github.com> * update vesting prec * refactor balance change entries setter func * add comments * update comment * fix sdk fork deps * comment claimRewards method and test * add smart contract balance check on test * remove transient storage logic * add edge test case with revert on storage change * revert changes to claimRewards * refactor var name * refactor claimRewards logic * refactor claimRewards logic * update cosmos-sdk fork with latest changes (no need for store keys deep copy) * change require with assert for invariant * update comment * update cosmos-sdk fork version * update commit function with latest changes merged from main * add changelog entry * update commit func * fix claimRewards comt --------- Signed-off-by: Tom <54514587+GAtom22@users.noreply.github.com> Signed-off-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: Ramiro Carlucho Co-authored-by: stepit --- CHANGELOG.md | 1 + go.mod | 2 +- go.sum | 4 +- gomod2nix.toml | 4 +- precompiles/bank/bank.go | 23 +- precompiles/common/precompile.go | 98 ++- precompiles/distribution/distribution.go | 24 +- precompiles/distribution/events.go | 6 +- precompiles/distribution/integration_test.go | 444 +++++++++++- precompiles/distribution/tx.go | 101 +-- precompiles/distribution/tx_test.go | 2 +- precompiles/distribution/utils_test.go | 6 +- precompiles/erc20/erc20.go | 19 +- precompiles/ics20/ics20.go | 24 +- precompiles/ics20/integration_test.go | 106 ++- precompiles/ics20/tx.go | 29 +- precompiles/staking/errors.go | 2 + precompiles/staking/integration_test.go | 274 ++++++- precompiles/staking/staking.go | 24 +- .../staking/testdata/StakingCaller.json | 4 +- .../staking/testdata/StakingCaller.sol | 2 + .../staking/testdata/StakingCallerTwo.json | 210 ++++++ .../staking/testdata/StakingCallerTwo.sol | 128 ++++ .../staking/testdata/staking_caller_two.go | 13 + precompiles/staking/tx.go | 37 +- precompiles/staking/tx_test.go | 92 ++- .../contracts/DistributionCaller.json | 216 +++++- .../testutil/contracts/DistributionCaller.sol | 247 +++++-- precompiles/testutil/contracts/FlashLoan.json | 110 +++ .../testutil/contracts}/FlashLoan.sol | 54 +- .../testutil/contracts/InterchainSender.json | 123 +++- .../testutil/contracts/InterchainSender.sol | 89 +++ .../contracts/InterchainSenderCaller.json | 187 +++++ .../contracts/InterchainSenderCaller.sol | 130 ++++ precompiles/testutil/contracts/Reverter.json | 45 ++ precompiles/testutil/contracts/Reverter.sol | 75 ++ .../testutil/contracts/StakingReverter.json | 164 +++++ .../testutil/contracts/StakingReverter.sol | 43 ++ .../testutil/contracts}/flash_loan.go | 2 +- .../contracts/interchain_sender_caller.go | 13 + precompiles/testutil/contracts/reverter.go | 13 + .../testutil/contracts/staking_reverter.go | 13 + .../vesting/testdata/VestingCaller.json | 4 +- precompiles/vesting/vesting.go | 23 +- precompiles/werc20/werc20.go | 6 +- tests/nix_tests/cosmoscli.py | 18 + tests/nix_tests/test_ics20_precompile.py | 680 ++++++++++++++++++ tests/nix_tests/test_precompiles.py | 2 +- tests/nix_tests/utils.py | 2 + x/evm/keeper/state_transition.go | 1 - x/evm/statedb/integration_test.go | 156 ++-- x/evm/statedb/journal.go | 37 + x/evm/statedb/state_object.go | 28 +- x/evm/statedb/statedb.go | 114 ++- x/evm/statedb/statedb_test.go | 6 +- x/evm/statedb/testdata/FlashLoan.json | 58 -- x/evm/types/call.go | 5 + 57 files changed, 3885 insertions(+), 458 deletions(-) create mode 100644 precompiles/staking/testdata/StakingCallerTwo.json create mode 100644 precompiles/staking/testdata/StakingCallerTwo.sol create mode 100644 precompiles/staking/testdata/staking_caller_two.go create mode 100644 precompiles/testutil/contracts/FlashLoan.json rename {x/evm/statedb/testdata => precompiles/testutil/contracts}/FlashLoan.sol (51%) create mode 100644 precompiles/testutil/contracts/InterchainSenderCaller.json create mode 100644 precompiles/testutil/contracts/InterchainSenderCaller.sol create mode 100644 precompiles/testutil/contracts/Reverter.json create mode 100644 precompiles/testutil/contracts/Reverter.sol create mode 100644 precompiles/testutil/contracts/StakingReverter.json create mode 100644 precompiles/testutil/contracts/StakingReverter.sol rename {x/evm/statedb/testdata => precompiles/testutil/contracts}/flash_loan.go (95%) create mode 100644 precompiles/testutil/contracts/interchain_sender_caller.go create mode 100644 precompiles/testutil/contracts/reverter.go create mode 100644 precompiles/testutil/contracts/staking_reverter.go delete mode 100644 x/evm/statedb/testdata/FlashLoan.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 106c34b481..40ace13f29 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -61,6 +61,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (app) [#2631](https://github.com/evmos/evmos/pull/2631) Bump IBC-go to v7.6.0 and Cosmos-SDK to v0.47.12. - (distribution-precompile) [#2643](https://github.com/evmos/evmos/pull/2643) Improve efficiency of reward claiming with distribution precompile. - (evm) [#2633](https://github.com/evmos/evmos/pull/2633) Remove `EthAccount` type and use `BaseAccount` instead. +- (precompiles) [GHSA-68fc-7mhg-6f6c](https://github.com/evmos/evmos/) Refactor precompiles to use journal entries. ### Bug Fixes diff --git a/go.mod b/go.mod index ba3ba39731..358be5113d 100644 --- a/go.mod +++ b/go.mod @@ -257,7 +257,7 @@ replace ( // use cosmos fork of keyring github.com/99designs/keyring => github.com/cosmos/keyring v1.2.0 // use Cosmos-SDK fork to enable Ledger functionality - github.com/cosmos/cosmos-sdk => github.com/evmos/cosmos-sdk v0.47.12-evmos + github.com/cosmos/cosmos-sdk => github.com/evmos/cosmos-sdk v0.47.12-evmos.2 // use Evmos geth fork github.com/ethereum/go-ethereum => github.com/evmos/go-ethereum v1.10.26-evmos-rc4 // Security Advisory https://github.com/advisories/GHSA-h395-qcrw-5vmq diff --git a/go.sum b/go.sum index fc700fbf47..2074974612 100644 --- a/go.sum +++ b/go.sum @@ -464,8 +464,8 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.m github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evmos/cosmos-sdk v0.47.12-evmos h1:XyKyNboK9fLTjlY798KyfeaNxFjMIICGXNuibIALrTU= -github.com/evmos/cosmos-sdk v0.47.12-evmos/go.mod h1:ADjORYzUQqQv/FxDi0H0K5gW/rAk1CiDR3ZKsExfJV0= +github.com/evmos/cosmos-sdk v0.47.12-evmos.2 h1:NODyhYKCqu8JNLeR6b6ff0+TS3KYdcBiMZ4sVzXXD8I= +github.com/evmos/cosmos-sdk v0.47.12-evmos.2/go.mod h1:ADjORYzUQqQv/FxDi0H0K5gW/rAk1CiDR3ZKsExfJV0= github.com/evmos/go-ethereum v1.10.26-evmos-rc4 h1:vwDVMScuB2KSu8ze5oWUuxm6v3bMUp6dL3PWvJNJY+I= github.com/evmos/go-ethereum v1.10.26-evmos-rc4/go.mod h1:/6CsT5Ceen2WPLI/oCA3xMcZ5sWMF/D46SjM/ayY0Oo= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= diff --git a/gomod2nix.toml b/gomod2nix.toml index 0e51cfba4c..3be00e7966 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -147,8 +147,8 @@ schema = 3 version = "v1.0.0-beta.5" hash = "sha256-Fy/PbsOsd6iq0Njy3DVWK6HqWsogI+MkE8QslHGWyVg=" [mod."github.com/cosmos/cosmos-sdk"] - version = "v0.47.12-evmos" - hash = "sha256-NqLa1Hu73zdv1yrdnppIK77RZRXpPV1MPs2pspff58g=" + version = "v0.47.12-evmos.2" + hash = "sha256-xKa3vOnGloUYmgzXI93Jmt99XTkL7RRAXgl2sHN3YT8=" replaced = "github.com/evmos/cosmos-sdk" [mod."github.com/cosmos/go-bip39"] version = "v1.0.0" diff --git a/precompiles/bank/bank.go b/precompiles/bank/bank.go index 46847dd125..a1b82a288d 100644 --- a/precompiles/bank/bank.go +++ b/precompiles/bank/bank.go @@ -56,7 +56,7 @@ func NewPrecompile( // NOTE: we set an empty gas configuration to avoid extra gas costs // during the run execution - return &Precompile{ + p := &Precompile{ Precompile: cmn.Precompile{ ABI: newABI, KvGasConfig: storetypes.GasConfig{}, @@ -64,13 +64,10 @@ func NewPrecompile( }, bankKeeper: bankKeeper, erc20Keeper: erc20Keeper, - }, nil -} - -// Address defines the address of the bank compile contract. -// address: 0x0000000000000000000000000000000000000804 -func (Precompile) Address() common.Address { - return common.HexToAddress(PrecompileAddress) + } + // SetAddress defines the address of the bank compile contract. + p.SetAddress(common.HexToAddress(PrecompileAddress)) + return p, nil } // RequiredGas calculates the precompiled contract's base gas rate. @@ -104,7 +101,7 @@ func (p Precompile) RequiredGas(input []byte) uint64 { // Run executes the precompiled contract bank query methods defined in the ABI. func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, readOnly bool) (bz []byte, err error) { - ctx, stateDB, method, initialGas, args, err := p.RunSetup(evm, contract, readOnly, p.IsTransaction) + ctx, stateDB, snapshot, method, initialGas, args, err := p.RunSetup(evm, contract, readOnly, p.IsTransaction) if err != nil { return nil, err } @@ -113,10 +110,6 @@ func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, readOnly bool) (bz [ // It avoids panics and returns the out of gas error so the EVM can continue gracefully. defer cmn.HandleGasError(ctx, contract, initialGas, &err)() - if err := stateDB.Commit(); err != nil { - return nil, err - } - switch method.Name { // Bank queries case BalancesMethod: @@ -139,6 +132,10 @@ func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, readOnly bool) (bz [ return nil, vm.ErrOutOfGas } + if err := p.AddJournalEntries(stateDB, snapshot); err != nil { + return nil, err + } + return bz, nil } diff --git a/precompiles/common/precompile.go b/precompiles/common/precompile.go index 1c5d9ade7a..be8d853aed 100644 --- a/precompiles/common/precompile.go +++ b/precompiles/common/precompile.go @@ -4,12 +4,14 @@ package common import ( "fmt" + "math/big" "time" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" "github.com/evmos/evmos/v18/x/evm/statedb" ) @@ -22,6 +24,35 @@ type Precompile struct { ApprovalExpiration time.Duration KvGasConfig storetypes.GasConfig TransientKVGasConfig storetypes.GasConfig + address common.Address + journalEntries []balanceChangeEntry +} + +// Operation is a type that defines if the precompile call +// produced an addition or substraction of an account's balance +type Operation int8 + +const ( + Sub Operation = iota + Add +) + +type balanceChangeEntry struct { + Account common.Address + Amount *big.Int + Op Operation +} + +func NewBalanceChangeEntry(acc common.Address, amt *big.Int, op Operation) balanceChangeEntry { + return balanceChangeEntry{acc, amt, op} +} + +// snapshot contains all state and events previous to the precompile call +// This is needed to allow us to revert the changes +// during the EVM execution +type snapshot struct { + MultiStore sdk.CacheMultiStore + Events sdk.Events } // RequiredGas calculates the base minimum required gas for a transaction or a query. @@ -44,12 +75,28 @@ func (p Precompile) RunSetup( contract *vm.Contract, readOnly bool, isTransaction func(name string) bool, -) (ctx sdk.Context, stateDB *statedb.StateDB, method *abi.Method, gasConfig storetypes.Gas, args []interface{}, err error) { +) (ctx sdk.Context, stateDB *statedb.StateDB, s snapshot, method *abi.Method, gasConfig storetypes.Gas, args []interface{}, err error) { stateDB, ok := evm.StateDB.(*statedb.StateDB) if !ok { - return sdk.Context{}, nil, nil, uint64(0), nil, fmt.Errorf(ErrNotRunInEvm) + return sdk.Context{}, nil, s, nil, uint64(0), nil, fmt.Errorf(ErrNotRunInEvm) + } + + // get the stateDB cache ctx + ctx, err = stateDB.GetCacheContext() + if err != nil { + return sdk.Context{}, nil, s, nil, uint64(0), nil, err + } + + // take a snapshot of the current state before any changes + // to be able to revert the changes + s.MultiStore = stateDB.MultiStoreSnapshot() + s.Events = ctx.EventManager().Events() + + // commit the current changes in the cache ctx + // to get the updated state for the precompile call + if err := stateDB.CommitWithCacheCtx(); err != nil { + return sdk.Context{}, nil, s, nil, uint64(0), nil, err } - ctx = stateDB.GetContext() // NOTE: This is a special case where the calling transaction does not specify a function name. // In this case we default to a `fallback` or `receive` function on the contract. @@ -74,12 +121,12 @@ func (p Precompile) RunSetup( } if err != nil { - return sdk.Context{}, nil, nil, uint64(0), nil, err + return sdk.Context{}, nil, s, nil, uint64(0), nil, err } // return error if trying to write to state during a read-only call if readOnly && isTransaction(method.Name) { - return sdk.Context{}, nil, nil, uint64(0), nil, vm.ErrWriteProtection + return sdk.Context{}, nil, s, nil, uint64(0), nil, vm.ErrWriteProtection } // if the method type is `function` continue looking for arguments @@ -87,7 +134,7 @@ func (p Precompile) RunSetup( argsBz := contract.Input[4:] args, err = method.Inputs.Unpack(argsBz) if err != nil { - return sdk.Context{}, nil, nil, uint64(0), nil, err + return sdk.Context{}, nil, s, nil, uint64(0), nil, err } } @@ -103,7 +150,7 @@ func (p Precompile) RunSetup( // we need to consume the gas that was already used by the EVM ctx.GasMeter().ConsumeGas(initialGas, "creating a new gas meter") - return ctx, stateDB, method, initialGas, args, nil + return ctx, stateDB, s, method, initialGas, args, nil } // HandleGasError handles the out of gas panic by resetting the gas meter and returning an error. @@ -128,6 +175,43 @@ func HandleGasError(ctx sdk.Context, contract *vm.Contract, initialGas storetype } } +// AddJournalEntries adds the balanceChange (if corresponds) +// and precompileCall entries on the stateDB journal +// This allows to revert the call changes within an evm tx +func (p Precompile) AddJournalEntries(stateDB *statedb.StateDB, s snapshot) error { + for _, entry := range p.journalEntries { + switch entry.Op { + case Sub: + // add the corresponding balance change to the journal + stateDB.SubBalance(entry.Account, entry.Amount) + case Add: + // add the corresponding balance change to the journal + stateDB.AddBalance(entry.Account, entry.Amount) + } + } + + if err := stateDB.AddPrecompileFn(p.Address(), s.MultiStore, s.Events); err != nil { + return err + } + return nil +} + +// SetBalanceChangeEntries sets the balanceChange entries +// as the journalEntries field of the precompile. +// These entries will be added to the stateDB's journal +// when calling the AddJournalEntries function +func (p *Precompile) SetBalanceChangeEntries(entries ...balanceChangeEntry) { + p.journalEntries = entries +} + +func (p Precompile) Address() common.Address { + return p.address +} + +func (p *Precompile) SetAddress(addr common.Address) { + p.address = addr +} + // emptyCallData is a helper function that returns the method to be called when the calldata is empty. func (p Precompile) emptyCallData(contract *vm.Contract) (method *abi.Method, err error) { switch { diff --git a/precompiles/distribution/distribution.go b/precompiles/distribution/distribution.go index bf9092ecb5..d946ad02d6 100644 --- a/precompiles/distribution/distribution.go +++ b/precompiles/distribution/distribution.go @@ -45,7 +45,7 @@ func NewPrecompile( return nil, fmt.Errorf("error loading the distribution ABI %s", err) } - return &Precompile{ + p := &Precompile{ Precompile: cmn.Precompile{ ABI: newAbi, AuthzKeeper: authzKeeper, @@ -55,13 +55,11 @@ func NewPrecompile( }, stakingKeeper: stakingKeeper, distributionKeeper: distributionKeeper, - }, nil -} - -// Address defines the address of the distribution compile contract. -// address: 0x0000000000000000000000000000000000000801 -func (p Precompile) Address() common.Address { - return common.HexToAddress(PrecompileAddress) + } + // SetAddress defines the address of the distribution compile contract. + // address: 0x0000000000000000000000000000000000000801 + p.SetAddress(common.HexToAddress(PrecompileAddress)) + return p, nil } // RequiredGas calculates the precompiled contract's base gas rate. @@ -84,7 +82,7 @@ func (p Precompile) RequiredGas(input []byte) uint64 { // Run executes the precompiled contract distribution methods defined in the ABI. func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, readOnly bool) (bz []byte, err error) { - ctx, stateDB, method, initialGas, args, err := p.RunSetup(evm, contract, readOnly, p.IsTransaction) + ctx, stateDB, snapshot, method, initialGas, args, err := p.RunSetup(evm, contract, readOnly, p.IsTransaction) if err != nil { return nil, err } @@ -93,10 +91,6 @@ func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, readOnly bool) (bz [ // It avoids panics and returns the out of gas error so the EVM can continue gracefully. defer cmn.HandleGasError(ctx, contract, initialGas, &err)() - if err := stateDB.Commit(); err != nil { - return nil, err - } - switch method.Name { // Custom transactions case ClaimRewardsMethod: @@ -139,6 +133,10 @@ func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, readOnly bool) (bz [ return nil, vm.ErrOutOfGas } + if err := p.AddJournalEntries(stateDB, snapshot); err != nil { + return nil, err + } + return bz, nil } diff --git a/precompiles/distribution/events.go b/precompiles/distribution/events.go index 60c97a1056..e22589220a 100644 --- a/precompiles/distribution/events.go +++ b/precompiles/distribution/events.go @@ -22,16 +22,16 @@ const ( EventTypeWithdrawDelegatorRewards = "WithdrawDelegatorRewards" // EventTypeWithdrawValidatorCommission defines the event type for the distribution WithdrawValidatorCommissionMethod transaction. EventTypeWithdrawValidatorCommission = "WithdrawValidatorCommission" - // EventTypeClaimRewards defines the event type for the distribution ClaimRewardsMethod transaction. - EventTypeClaimRewards = "ClaimRewards" // EventTypeFundCommunityPool defines the event type for the distribution FundCommunityPoolMethod transaction. EventTypeFundCommunityPool = "FundCommunityPool" + // EventTypeClaimRewards defines the event type for the distribution ClaimRewardsMethod transaction. + EventTypeClaimRewards = "ClaimRewards" ) // EmitClaimRewardsEvent creates a new event emitted on a ClaimRewards transaction. func (p Precompile) EmitClaimRewardsEvent(ctx sdk.Context, stateDB vm.StateDB, delegatorAddress common.Address, totalCoins sdk.Coins) error { // Prepare the event topics - event := p.ABI.Events[EventTypeClaimRewards] + event := p.Events[EventTypeClaimRewards] topics := make([]common.Hash, 2) // The first topic is always the signature of the event. diff --git a/precompiles/distribution/integration_test.go b/precompiles/distribution/integration_test.go index ee5306c27e..c95a2069d1 100644 --- a/precompiles/distribution/integration_test.go +++ b/precompiles/distribution/integration_test.go @@ -9,6 +9,7 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/query" + distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/common" @@ -20,6 +21,7 @@ import ( evmosutil "github.com/evmos/evmos/v18/testutil" testutiltx "github.com/evmos/evmos/v18/testutil/tx" "github.com/evmos/evmos/v18/utils" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" @@ -52,6 +54,9 @@ var _ = Describe("Calling distribution precompile from EOA", func() { BeforeEach(func() { s.SetupTest() + initialBalance := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + fmt.Println("Fist Before each: ", initialBalance) + // set the default call arguments defaultCallArgs = contracts.CallArgs{ ContractAddr: s.precompile.Address(), @@ -60,10 +65,13 @@ var _ = Describe("Calling distribution precompile from EOA", func() { } defaultLogCheck = testutil.LogCheckArgs{ - ABIEvents: s.precompile.ABI.Events, + ABIEvents: s.precompile.Events, } passCheck = defaultLogCheck.WithExpPass(true) outOfGasCheck = defaultLogCheck.WithErrContains(vm.ErrOutOfGas.Error()) + + initialBalance = s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + fmt.Println("Fist Before each: ", initialBalance) }) // ===================================== @@ -321,9 +329,8 @@ var _ = Describe("Calling distribution precompile from EOA", func() { err = s.app.DistrKeeper.SetWithdrawAddr(s.ctx, s.address.Bytes(), contractAddr.Bytes()) Expect(err).To(BeNil()) - // initial balance should be the initial amount minus the staked amount used to create the validator, minus fees paid for deploying contract + // get validator initial balance initialBalance := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) - Expect(initialBalance.Amount).To(Equal(math.NewInt(4997457315624999900))) withdrawCommissionArgs := defaultWithdrawCommissionArgs. WithArgs(valAddr.String()). @@ -358,12 +365,15 @@ var _ = Describe("Calling distribution precompile from EOA", func() { // // NOTE: this has to be populated in the BeforeEach block because the private key otherwise is not yet initialized. var defaultClaimRewardsArgs contracts.CallArgs + // starting balance minus delegated tokens startingBalance := math.NewInt(5e18) expectedBalance := math.NewInt(8999665039062500000) BeforeEach(func() { // set the default call arguments defaultClaimRewardsArgs = defaultCallArgs.WithMethodName(distribution.ClaimRewardsMethod) + initialBalance := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + fmt.Println("BeforeEach: ", initialBalance) s.prepareStakingRewards(stakingRewards{s.address.Bytes(), s.validators[0], rewards}) s.prepareStakingRewards(stakingRewards{s.address.Bytes(), s.validators[1], rewards}) }) @@ -393,7 +403,6 @@ var _ = Describe("Calling distribution precompile from EOA", func() { Expect(finalBalance.Amount.Equal(expectedBalance)).To(BeTrue(), "expected final balance to be equal to initial balance + rewards - fees") }) }) - // ===================================== // QUERIES // ===================================== @@ -627,6 +636,15 @@ var _ = Describe("Calling distribution precompile from EOA", func() { }) var _ = Describe("Calling distribution precompile from another contract", func() { + // testCase is a struct used for cases of contracts calls that have some operation + // performed before and/or after the precompile call + type testCase struct { + delegator *common.Address + withdrawer *common.Address + before bool + after bool + } + var ( // initBalanceAmt is the initial balance for testing initBalanceAmt = math.NewInt(5000000000000000000) @@ -800,10 +818,10 @@ var _ = Describe("Calling distribution precompile from another contract", func() Expect(finalBalance.Amount.GT(initialBalance.Amount)).To(BeTrue(), "expected final balance to be greater than initial balance after withdrawing rewards") }) - It("should withdraw rewards successfully to the new withdrawer address", func() { - initialBalance := s.app.BankKeeper.GetBalance(s.ctx, differentAddr.Bytes(), s.bondDenom) + DescribeTable("should withdraw rewards successfully to the new withdrawer address", func(tc testCase) { + initialBalance := s.app.BankKeeper.GetBalance(s.ctx, tc.withdrawer.Bytes(), s.bondDenom) // Set new withdrawer address - err := s.app.DistrKeeper.SetWithdrawAddr(s.ctx, s.address.Bytes(), differentAddr.Bytes()) + err := s.app.DistrKeeper.SetWithdrawAddr(s.ctx, s.address.Bytes(), tc.withdrawer.Bytes()) Expect(err).To(BeNil()) withdrawDelRewardsArgs := defaultWithdrawDelRewardsArgs.WithArgs( @@ -817,8 +835,178 @@ var _ = Describe("Calling distribution precompile from another contract", func() Expect(err).To(BeNil(), "error while calling the smart contract: %v", err) // should increase balance by rewards - finalBalance := s.app.BankKeeper.GetBalance(s.ctx, differentAddr.Bytes(), s.bondDenom) + finalBalance := s.app.BankKeeper.GetBalance(s.ctx, tc.withdrawer.Bytes(), s.bondDenom) Expect(finalBalance.Amount.GT(initialBalance.Amount)).To(BeTrue(), "expected final balance to be greater than initial balance after withdrawing rewards") + }, + Entry("withdrawer addr is existing acc", testCase{ + withdrawer: &differentAddr, + }), + Entry("withdrawer addr is non-existing acc", testCase{ + withdrawer: func() *common.Address { + addr := testutiltx.GenerateAddress() + return &addr + }(), + }), + ) + + // Specific BeforeEach for table-driven tests + Context("Table-driven tests for Withdraw Delegator Rewards", func() { + var ( + args contracts.CallArgs + contractInitialBalance = math.NewInt(100) + ) + BeforeEach(func() { + args = defaultWithdrawDelRewardsArgs. + WithMethodName("testWithdrawDelegatorRewardsWithTransfer"). + WithGasPrice(gasPrice) + + // send some funds to the contract + err := evmosutil.FundAccountWithBaseDenom(s.ctx, s.app.BankKeeper, contractAddr.Bytes(), contractInitialBalance.Int64()) + Expect(err).To(BeNil()) + }) + + DescribeTable("withdraw delegation rewards with internal transfers to delegator - should withdraw rewards successfully to the withdrawer address", + func(tc testCase) { + withdrawerInitialBalance := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + if tc.withdrawer != nil { + // Set new withdrawer address + err := s.app.DistrKeeper.SetWithdrawAddr(s.ctx, s.address.Bytes(), tc.withdrawer.Bytes()) + Expect(err).To(BeNil()) + withdrawerInitialBalance = s.app.BankKeeper.GetBalance(s.ctx, tc.withdrawer.Bytes(), s.bondDenom) + } + + delInitialBalance := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + + // get the pending rewards to claim + qr := distrkeeper.Querier{Keeper: s.app.DistrKeeper} + qRes, err := qr.DelegationRewards(s.ctx, &distrtypes.QueryDelegationRewardsRequest{DelegatorAddress: sdk.AccAddress(s.address.Bytes()).String(), ValidatorAddress: s.validators[0].OperatorAddress}) + Expect(err).To(BeNil()) + expRewards := qRes.Rewards.AmountOf(s.bondDenom).TruncateInt() + + withdrawDelRewardsArgs := args.WithArgs( + s.address, s.validators[0].OperatorAddress, tc.before, tc.after, + ) + + logCheckArgs := passCheck. + WithExpEvents(distribution.EventTypeWithdrawDelegatorRewards) + + res, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, withdrawDelRewardsArgs, logCheckArgs) + Expect(err).To(BeNil(), "error while calling the smart contract: %v", err) + fees := math.NewIntFromBigInt(gasPrice).MulRaw(res.GasUsed) + + // check balances + contractTransferredAmt := math.ZeroInt() + for _, transferred := range []bool{tc.before, tc.after} { + if transferred { + contractTransferredAmt = contractTransferredAmt.AddRaw(15) + } + } + // contract balance be updated according to the transferred amount + contractFinalBalance := s.app.BankKeeper.GetBalance(s.ctx, contractAddr.Bytes(), s.bondDenom) + Expect(contractFinalBalance.Amount).To(Equal(contractInitialBalance.Sub(contractTransferredAmt))) + + expDelFinalBalance := delInitialBalance.Amount.Sub(fees).Add(contractTransferredAmt).Add(expRewards) + if tc.withdrawer != nil { + expDelFinalBalance = delInitialBalance.Amount.Sub(fees).Add(contractTransferredAmt) + expWithdrawerFinalBalance := withdrawerInitialBalance.Amount.Add(expRewards) + // withdrawer balance should have the rewards + withdrawerFinalBalance := s.app.BankKeeper.GetBalance(s.ctx, tc.withdrawer.Bytes(), s.bondDenom) + Expect(withdrawerFinalBalance.Amount).To(Equal(expWithdrawerFinalBalance), "expected final balance to be greater than initial balance after withdrawing rewards") + } + + // delegator balance should have the transferred amt - fees + rewards (when is the withdrawer) + delFinalBalance := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + Expect(delFinalBalance.Amount).To(Equal(expDelFinalBalance), "expected final balance to be greater than initial balance after withdrawing rewards") + }, + + Entry("delegator == withdrawer - with internal transfers before and after precompile call", testCase{ + before: true, + after: true, + }), + + Entry("delegator == withdrawer - with internal transfers before precompile call", testCase{ + before: true, + after: false, + }), + + Entry("delegator == withdrawer - with internal transfers after precompile call", testCase{ + before: false, + after: true, + }), + Entry("delegator != withdrawer - with internal transfers before and after precompile call", testCase{ + withdrawer: &differentAddr, + before: true, + after: true, + }), + + Entry("delegator != withdrawer - with internal transfers before precompile call", testCase{ + withdrawer: &differentAddr, + before: true, + after: false, + }), + + Entry("delegator != withdrawer - with internal transfers after precompile call", testCase{ + withdrawer: &differentAddr, + before: false, + after: true, + }), + ) + + DescribeTable("should revert withdraw rewards successfully and update correspondingly the withdrawer and contract's balances", func(tc testCase) { + // get the pending rewards to claim + qr := distrkeeper.Querier{Keeper: s.app.DistrKeeper} + qRes, err := qr.DelegationRewards(s.ctx, &distrtypes.QueryDelegationRewardsRequest{DelegatorAddress: sdk.AccAddress(s.address.Bytes()).String(), ValidatorAddress: s.validators[0].OperatorAddress}) + Expect(err).To(BeNil()) + initRewards := qRes.Rewards.AmountOf(s.bondDenom).TruncateInt() + + delInitBalance := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + withdrawerInitBalance := s.app.BankKeeper.GetBalance(s.ctx, tc.withdrawer.Bytes(), s.bondDenom) + // Set new withdrawer address + err = s.app.DistrKeeper.SetWithdrawAddr(s.ctx, s.address.Bytes(), tc.withdrawer.Bytes()) + Expect(err).To(BeNil()) + + // update args to call the corresponding contract method + callArgs := args. + WithMethodName("revertWithdrawRewardsAndTransfer"). + WithArgs( + s.address, *tc.withdrawer, s.validators[0].OperatorAddress, true, + ) + + res, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, callArgs, passCheck) + Expect(err).To(BeNil(), "error while calling the smart contract: %v", err) + fees := math.NewIntFromBigInt(gasPrice).MulRaw(res.GasUsed) + + // check balances + contractTransferredAmt := math.NewInt(15) + // contract balance be updated according to the transferred amount + contractFinalBalance := s.app.BankKeeper.GetBalance(s.ctx, contractAddr.Bytes(), s.bondDenom) + Expect(contractFinalBalance.Amount).To(Equal(contractInitialBalance.Sub(contractTransferredAmt))) + + // delegator balance should be initial_balance - fees + delFinalBalance := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + Expect(delFinalBalance.Amount).To(Equal(delInitBalance.Amount.Sub(fees))) + + // withdrawer balance should increase by the transferred amount only + // the rewards withdrawal should revert + withdrawerFinalBalance := s.app.BankKeeper.GetBalance(s.ctx, tc.withdrawer.Bytes(), s.bondDenom) + Expect(withdrawerFinalBalance.Amount).To(Equal(withdrawerInitBalance.Amount.Add(contractTransferredAmt)), "expected final balance to be greater than initial balance after withdrawing rewards") + + // rewards to claim should remain unchanged + qRes, err = qr.DelegationRewards(s.ctx, &distrtypes.QueryDelegationRewardsRequest{DelegatorAddress: sdk.AccAddress(s.address.Bytes()).String(), ValidatorAddress: s.validators[0].OperatorAddress}) + Expect(err).To(BeNil()) + finalRewards := qRes.Rewards.AmountOf(s.bondDenom).TruncateInt() + Expect(finalRewards).To(Equal(initRewards)) + }, + Entry("withdrawer addr is existing acc", testCase{ + withdrawer: &differentAddr, + }), + Entry("withdrawer addr is non-existing acc", testCase{ + withdrawer: func() *common.Address { + addr := testutiltx.GenerateAddress() + return &addr + }(), + }), + ) }) }) @@ -887,6 +1075,75 @@ var _ = Describe("Calling distribution precompile from another contract", func() finalDelegatorBalance := s.app.BankKeeper.GetBalance(s.ctx, contractAddr.Bytes(), s.bondDenom) Expect(finalDelegatorBalance.Amount.Equal(initialBalance.Amount)).To(BeTrue(), "expected delegator final balance remain unchanged after withdrawing rewards to withdrawer") }) + + Context("Withdraw Delegator Rewards with another smart contract (different than the contract calling the precompile) as delegator", func() { + var ( + delContractAddr common.Address + args contracts.CallArgs + contractInitialBalance = math.NewInt(100) + ) + BeforeEach(func() { + args = defaultWithdrawDelRewardsArgs. + WithMethodName("testWithdrawDelegatorRewardsWithTransfer"). + WithGasPrice(gasPrice) + + // deploy a contract to use as delegator contract + delegatorContract, err := contracts.LoadInterchainSenderContract() + Expect(err).To(BeNil()) + + delContractAddr, err = s.DeployContract(delegatorContract) + Expect(err).To(BeNil(), "error while deploying the smart contract: %v", err) + + // send some funds to the contract + err = evmosutil.FundAccountWithBaseDenom(s.ctx, s.app.BankKeeper, contractAddr.Bytes(), contractInitialBalance.Int64()) + Expect(err).To(BeNil()) + + // set some rewards for the delegator contract + s.prepareStakingRewards([]stakingRewards{ + { + Delegator: delContractAddr.Bytes(), + Validator: s.validators[0], + RewardAmt: rewards, + }, + }...) + }) + + It("should NOT allow to withdraw rewards", func() { + txSenderInitialBalance := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + delInitialBalance := s.app.BankKeeper.GetBalance(s.ctx, delContractAddr.Bytes(), s.bondDenom) + + // get the pending rewards to claim + qr := distrkeeper.Querier{Keeper: s.app.DistrKeeper} + qRes, err := qr.DelegationRewards(s.ctx, &distrtypes.QueryDelegationRewardsRequest{DelegatorAddress: sdk.AccAddress(delContractAddr.Bytes()).String(), ValidatorAddress: s.validators[0].OperatorAddress}) + Expect(err).To(BeNil()) + expRewards := qRes.Rewards.AmountOf(s.bondDenom).TruncateInt() + + withdrawDelRewardsArgs := args.WithArgs( + delContractAddr, s.validators[0].OperatorAddress, true, true, + ) + + _, _, err = contracts.CallContractAndCheckLogs(s.ctx, s.app, withdrawDelRewardsArgs, execRevertedCheck) + Expect(err).NotTo(BeNil(), "error while calling the smart contract: %v", err) + + // check balances + // tx signer final balance should be the initial balance - fees + txSignerFinalBalance := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + Expect(txSignerFinalBalance.Amount.LT(txSenderInitialBalance.Amount)).To(BeTrue()) + + // contract balance be updated according to the transferred amount + contractFinalBalance := s.app.BankKeeper.GetBalance(s.ctx, contractAddr.Bytes(), s.bondDenom) + Expect(contractFinalBalance.Amount).To(Equal(contractInitialBalance)) + + // delegator balance should have the transferred amt + rewards (when is the withdrawer) + delFinalBalance := s.app.BankKeeper.GetBalance(s.ctx, delContractAddr.Bytes(), s.bondDenom) + Expect(delFinalBalance.Amount).To(Equal(delInitialBalance.Amount)) + + // delegation rewards should remain unchanged + qRes, err = qr.DelegationRewards(s.ctx, &distrtypes.QueryDelegationRewardsRequest{DelegatorAddress: sdk.AccAddress(delContractAddr.Bytes()).String(), ValidatorAddress: s.validators[0].OperatorAddress}) + Expect(err).To(BeNil()) + Expect(qRes.Rewards.AmountOf(s.bondDenom).TruncateInt()).To(Equal(expRewards)) + }) + }) }) Context("withdrawValidatorCommission", func() { @@ -995,6 +1252,138 @@ var _ = Describe("Calling distribution precompile from another contract", func() expFinal := initialBalance.Amount.Int64() - fees Expect(finalBalance.Amount).To(Equal(math.NewInt(expFinal)), "expected final balance to be equal to initial balance - fees") }) + + // Specific BeforeEach for table-driven tests + Context("Table-driven tests for Withdraw Validator Commission", func() { + var ( + args contracts.CallArgs + contractInitialBalance = math.NewInt(100) + ) + BeforeEach(func() { + args = defaultWithdrawValCommArgs. + WithMethodName("testWithdrawValidatorCommissionWithTransfer"). + WithGasPrice(gasPrice) + + // send some funds to the contract + err := evmosutil.FundAccountWithBaseDenom(s.ctx, s.app.BankKeeper, contractAddr.Bytes(), contractInitialBalance.Int64()) + Expect(err).To(BeNil()) + }) + + DescribeTable("withdraw validator commission with state changes in withdrawer - should withdraw commission successfully to the withdrawer address", + func(tc testCase) { + withdrawerAddr := s.address + withdrawerInitialBalance := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + if tc.withdrawer != nil { + withdrawerAddr = *tc.withdrawer + // Set new withdrawer address + err := s.app.DistrKeeper.SetWithdrawAddr(s.ctx, s.address.Bytes(), tc.withdrawer.Bytes()) + Expect(err).To(BeNil()) + withdrawerInitialBalance = s.app.BankKeeper.GetBalance(s.ctx, tc.withdrawer.Bytes(), s.bondDenom) + } + + valInitialBalance := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + + // get the pending comission to claim + valAccAddr := sdk.ValAddress(s.address.Bytes()) + qr := distrkeeper.Querier{Keeper: s.app.DistrKeeper} + qRes, err := qr.ValidatorCommission(s.ctx, &distrtypes.QueryValidatorCommissionRequest{ValidatorAddress: valAccAddr.String()}) + Expect(err).To(BeNil()) + expCommission := qRes.Commission.Commission.AmountOf(s.bondDenom).TruncateInt() + + withdrawValCommissionArgs := args.WithArgs( + valAccAddr.String(), withdrawerAddr, tc.before, tc.after, + ) + + logCheckArgs := passCheck. + WithExpEvents(distribution.EventTypeWithdrawValidatorCommission) + + res, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, withdrawValCommissionArgs, logCheckArgs) + Expect(err).To(BeNil(), "error while calling the smart contract: %v", err) + fees := math.NewIntFromBigInt(gasPrice).MulRaw(res.GasUsed) + + // calculate the transferred amt during the call + contractTransferredAmt := math.ZeroInt() + for _, transferred := range []bool{tc.before, tc.after} { + if transferred { + contractTransferredAmt = contractTransferredAmt.AddRaw(15) + } + } + + // check balances + expContractFinalBalance := contractInitialBalance.Sub(contractTransferredAmt) + expValFinalBalance := valInitialBalance.Amount.Sub(fees).Add(contractTransferredAmt).Add(expCommission) + if tc.withdrawer != nil { + expValFinalBalance = valInitialBalance.Amount.Sub(fees) + if *tc.withdrawer == contractAddr { + // no internal transfers if the contract itself is the withdrawer + expContractFinalBalance = contractInitialBalance.Add(expCommission) + } else { + expWithdrawerFinalBalance := withdrawerInitialBalance.Amount.Add(expCommission).Add(contractTransferredAmt) + // withdrawer balance should have the rewards + withdrawerFinalBalance := s.app.BankKeeper.GetBalance(s.ctx, tc.withdrawer.Bytes(), s.bondDenom) + Expect(withdrawerFinalBalance.Amount).To(Equal(expWithdrawerFinalBalance), "expected final balance to be greater than initial balance after withdrawing rewards") + } + } + + // contract balance be updated according to the transferred amount + contractFinalBalance := s.app.BankKeeper.GetBalance(s.ctx, contractAddr.Bytes(), s.bondDenom) + Expect(contractFinalBalance.Amount).To(Equal(expContractFinalBalance)) + + // validator balance should have the transferred amt - fees + rewards (when is the withdrawer) + valFinalBalance := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + Expect(valFinalBalance.Amount).To(Equal(expValFinalBalance), "expected final balance to be greater than initial balance after withdrawing rewards") + }, + + Entry("validator == withdrawer - with internal transfers before and after precompile call", testCase{ + before: true, + after: true, + }), + + Entry("validator == withdrawer - with internal transfers before precompile call", testCase{ + before: true, + after: false, + }), + + Entry("validator == withdrawer - with internal transfers after precompile call", testCase{ + before: false, + after: true, + }), + Entry("validator != withdrawer - with internal transfers before and after precompile call", testCase{ + withdrawer: &differentAddr, + before: true, + after: true, + }), + + Entry("validator != withdrawer - with internal transfers before precompile call", testCase{ + withdrawer: &differentAddr, + before: true, + after: false, + }), + + Entry("validator != withdrawer - with internal transfers after precompile call", testCase{ + withdrawer: &differentAddr, + before: false, + after: true, + }), + Entry("contract as withdrawer - with contract state change before and after precompile call", testCase{ + withdrawer: &contractAddr, + before: true, + after: true, + }), + + Entry("contract as withdrawer - with contract state change before precompile call", testCase{ + withdrawer: &contractAddr, + before: true, + after: false, + }), + + Entry("contract as withdrawer - with contract state change after precompile call", testCase{ + withdrawer: &contractAddr, + before: false, + after: true, + }), + ) + }) }) Context("claimRewards", func() { @@ -1465,6 +1854,45 @@ var _ = Describe("Calling distribution precompile from another contract", func() Expect(1).To(Equal(len(out.Total))) Expect(expDelegationRewards).To(Equal(out.Total[0].Amount.Int64())) }) + + Context("query call with revert - all changes should revert to corresponding stateDB snapshot", func() { + var ( + reverterContract evmtypes.CompiledContract + reverterAddr common.Address + testContractInitialBalance = math.NewInt(1000) + ) + BeforeEach(func() { + var err error + // Deploy Reverter contract + reverterContract, err = contracts.LoadReverterContract() + Expect(err).To(BeNil(), "error while loading the Reverter contract") + + reverterAddr, err = s.DeployContract(reverterContract) + Expect(err).To(BeNil(), "error while deploying the Reverter contract") + s.NextBlock() + + // send some funds to the Reverter contracts to transfer to the + // delegator during the tx + err = evmosutil.FundAccount(s.ctx, s.app.BankKeeper, reverterAddr.Bytes(), sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, testContractInitialBalance))) + Expect(err).To(BeNil(), "error while funding the smart contract: %v", err) + }) + + It("should revert the execution - Reverter contract", func() { + args := contracts.CallArgs{ + ContractAddr: reverterAddr, + ContractABI: reverterContract.ABI, + PrivKey: s.privKey, + MethodName: "run", + GasPrice: gasPrice, + } + + _, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, args, execRevertedCheck) + Expect(err).NotTo(BeNil(), "error while calling the smart contract: %v", err) + + contractFinalBalance := s.app.BankKeeper.GetBalance(s.ctx, reverterAddr.Bytes(), s.bondDenom) + Expect(contractFinalBalance.Amount).To(Equal(testContractInitialBalance)) + }) + }) }) Context("get all delegator validators", func() { diff --git a/precompiles/distribution/tx.go b/precompiles/distribution/tx.go index e37fff2f42..4e6e2ab3e5 100644 --- a/precompiles/distribution/tx.go +++ b/precompiles/distribution/tx.go @@ -7,7 +7,6 @@ import ( "fmt" "github.com/evmos/evmos/v18/utils" - "github.com/evmos/evmos/v18/x/evm/statedb" cmn "github.com/evmos/evmos/v18/precompiles/common" @@ -15,7 +14,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" distributionkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" - distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/core/vm" ) @@ -30,10 +28,10 @@ const ( // WithdrawValidatorCommissionMethod defines the ABI method name for the distribution // WithdrawValidatorCommission transaction. WithdrawValidatorCommissionMethod = "withdrawValidatorCommission" - // ClaimRewardsMethod defines the ABI method name for the custom ClaimRewards transaction - ClaimRewardsMethod = "claimRewards" // FundCommunityPoolMethod defines the ABI method name for the fundCommunityPool transaction FundCommunityPoolMethod = "fundCommunityPool" + // ClaimRewardsMethod defines the ABI method name for the custom ClaimRewards transaction + ClaimRewardsMethod = "claimRewards" ) // ClaimRewards claims the rewards accumulated by a delegator from multiple or all validators. @@ -57,7 +55,7 @@ func (p Precompile) ClaimRewards( // If the contract is the delegator, we don't need an origin check // Otherwise check if the origin matches the delegator address - isContractDelegator := contract.CallerAddress == delegatorAddr + isContractDelegator := contract.CallerAddress == delegatorAddr && origin != delegatorAddr if !isContractDelegator && origin != delegatorAddr { return nil, fmt.Errorf(cmn.ErrDelegatorDifferentOrigin, origin.String(), delegatorAddr.String()) } @@ -80,18 +78,13 @@ func (p Precompile) ClaimRewards( totalCoins = totalCoins.Add(coins...) } - // rewards go to the withdrawer address - // check if it is a contract - ok, withdrawerHexAddr, err := p.isContractWithdrawer(ctx, stateDB, sdk.AccAddress(delegatorAddr.Bytes())) - if err != nil { - return nil, err - } - // NOTE: This ensures that the changes in the bank keeper are correctly mirrored to the EVM stateDB. // This prevents the stateDB from overwriting the changed balance in the bank keeper when committing the EVM state. // this happens when the precompile is called from a smart contract - if ok && contract.CallerAddress != origin { - stateDB.(*statedb.StateDB).AddBalance(withdrawerHexAddr, totalCoins[0].Amount.BigInt()) + if contract.CallerAddress != origin { + // rewards go to the withdrawer address + withdrawerHexAddr := p.getWithdrawerHexAddr(ctx, delegatorAddr) + p.SetBalanceChangeEntries(cmn.NewBalanceChangeEntry(withdrawerHexAddr, totalCoins.AmountOf(utils.BaseDenom).BigInt(), cmn.Add)) } if err := p.EmitClaimRewardsEvent(ctx, stateDB, delegatorAddr, totalCoins); err != nil { @@ -117,7 +110,7 @@ func (p Precompile) SetWithdrawAddress( // If the contract is the delegator, we don't need an origin check // Otherwise check if the origin matches the delegator address - isContractDelegator := contract.CallerAddress == delegatorHexAddr + isContractDelegator := contract.CallerAddress == delegatorHexAddr && origin != delegatorHexAddr if !isContractDelegator && origin != delegatorHexAddr { return nil, fmt.Errorf(cmn.ErrDelegatorDifferentOrigin, origin.String(), delegatorHexAddr.String()) } @@ -135,7 +128,7 @@ func (p Precompile) SetWithdrawAddress( } // WithdrawDelegatorRewards withdraws the rewards of a delegator from a single validator. -func (p Precompile) WithdrawDelegatorRewards( +func (p *Precompile) WithdrawDelegatorRewards( ctx sdk.Context, origin common.Address, contract *vm.Contract, @@ -150,7 +143,7 @@ func (p Precompile) WithdrawDelegatorRewards( // If the contract is the delegator, we don't need an origin check // Otherwise check if the origin matches the delegator address - isContractDelegator := contract.CallerAddress == delegatorHexAddr + isContractDelegator := contract.CallerAddress == delegatorHexAddr && origin != delegatorHexAddr if !isContractDelegator && origin != delegatorHexAddr { return nil, fmt.Errorf(cmn.ErrDelegatorDifferentOrigin, origin.String(), delegatorHexAddr.String()) } @@ -161,17 +154,13 @@ func (p Precompile) WithdrawDelegatorRewards( return nil, err } - // rewards go to the withdrawer address - // check if it is a contract - ok, withdrawerHexAddr, err := p.isContractWithdrawer(ctx, stateDB, sdk.AccAddress(delegatorHexAddr.Bytes())) - if err != nil { - return nil, err - } - - // NOTE: This ensures that the changes in the bank keeper are correctly mirrored to the EVM stateDB. + // NOTE: This ensures that the changes in the bank keeper are correctly mirrored to the EVM stateDB + // when calling the precompile from a smart contract // This prevents the stateDB from overwriting the changed balance in the bank keeper when committing the EVM state. - if ok && contract.CallerAddress != origin { - stateDB.(*statedb.StateDB).AddBalance(withdrawerHexAddr, res.Amount[0].Amount.BigInt()) + if contract.CallerAddress != origin { + // rewards go to the withdrawer address + withdrawerHexAddr := p.getWithdrawerHexAddr(ctx, delegatorHexAddr) + p.SetBalanceChangeEntries(cmn.NewBalanceChangeEntry(withdrawerHexAddr, res.Amount[0].Amount.BigInt(), cmn.Add)) } if err = p.EmitWithdrawDelegatorRewardsEvent(ctx, stateDB, delegatorHexAddr, msg.ValidatorAddress, res.Amount); err != nil { @@ -182,7 +171,7 @@ func (p Precompile) WithdrawDelegatorRewards( } // WithdrawValidatorCommission withdraws the rewards of a validator. -func (p Precompile) WithdrawValidatorCommission( +func (p *Precompile) WithdrawValidatorCommission( ctx sdk.Context, origin common.Address, contract *vm.Contract, @@ -197,7 +186,7 @@ func (p Precompile) WithdrawValidatorCommission( // If the contract is the validator, we don't need an origin check // Otherwise check if the origin matches the validator address - isContractValidator := contract.CallerAddress == validatorHexAddr + isContractValidator := contract.CallerAddress == validatorHexAddr && origin != validatorHexAddr if !isContractValidator && origin != validatorHexAddr { return nil, fmt.Errorf(cmn.ErrDelegatorDifferentOrigin, origin.String(), validatorHexAddr.String()) } @@ -208,16 +197,13 @@ func (p Precompile) WithdrawValidatorCommission( return nil, err } - // commissions go to the withdrawer address - // check if it is a contract - ok, withdrawerHexAddr, err := p.isContractWithdrawer(ctx, stateDB, sdk.AccAddress(validatorHexAddr.Bytes())) - if err != nil { - return nil, err - } - // NOTE: This ensures that the changes in the bank keeper are correctly mirrored to the EVM stateDB. + // NOTE: This ensures that the changes in the bank keeper are correctly mirrored to the EVM stateDB + // when calling the precompile from a smart contract // This prevents the stateDB from overwriting the changed balance in the bank keeper when committing the EVM state. - if ok && contract.CallerAddress != origin { - stateDB.(*statedb.StateDB).AddBalance(withdrawerHexAddr, res.Amount[0].Amount.BigInt()) + if contract.CallerAddress != origin { + // commissions go to the withdrawer address + withdrawerHexAddr := p.getWithdrawerHexAddr(ctx, validatorHexAddr) + p.SetBalanceChangeEntries(cmn.NewBalanceChangeEntry(withdrawerHexAddr, res.Amount[0].Amount.BigInt(), cmn.Add)) } if err = p.EmitWithdrawValidatorCommissionEvent(ctx, stateDB, msg.ValidatorAddress, res.Amount); err != nil { @@ -228,7 +214,7 @@ func (p Precompile) WithdrawValidatorCommission( } // FundCommunityPool directly fund the community pool -func (p Precompile) FundCommunityPool( +func (p *Precompile) FundCommunityPool( ctx sdk.Context, origin common.Address, contract *vm.Contract, @@ -243,7 +229,7 @@ func (p Precompile) FundCommunityPool( // If the contract is the depositor, we don't need an origin check // Otherwise check if the origin matches the depositor address - isContractDepositor := contract.CallerAddress == depositorHexAddr + isContractDepositor := contract.CallerAddress == depositorHexAddr && origin != depositorHexAddr if !isContractDepositor && origin != depositorHexAddr { return nil, fmt.Errorf(cmn.ErrSpenderDifferentOrigin, origin.String(), depositorHexAddr.String()) } @@ -254,10 +240,11 @@ func (p Precompile) FundCommunityPool( return nil, err } - // NOTE: This ensures that the changes in the bank keeper are correctly mirrored to the EVM stateDB. + // NOTE: This ensures that the changes in the bank keeper are correctly mirrored to the EVM stateDB + // when calling the precompile from a smart contract // This prevents the stateDB from overwriting the changed balance in the bank keeper when committing the EVM state. - if isContractDepositor { - stateDB.(*statedb.StateDB).SubBalance(contract.CallerAddress, msg.Amount.AmountOf(utils.BaseDenom).BigInt()) + if contract.CallerAddress != origin { + p.SetBalanceChangeEntries(cmn.NewBalanceChangeEntry(depositorHexAddr, msg.Amount.AmountOf(utils.BaseDenom).BigInt(), cmn.Sub)) } if err = p.EmitFundCommunityPoolEvent(ctx, stateDB, depositorHexAddr, msg.Amount); err != nil { @@ -267,27 +254,9 @@ func (p Precompile) FundCommunityPool( return method.Outputs.Pack(true) } -// isContractWithdrawer is a helper function to check if the withdrawer address of a -// delegator is a smart contract. It returns a boolean specifying if the withdrawer -// is a smart contract, and the corresponding withdrawer hex address -func (p Precompile) isContractWithdrawer(ctx sdk.Context, stateDB vm.StateDB, delegatorAccAddr sdk.AccAddress) (bool, common.Address, error) { - // check if withdrawer address is a contract - querier := distributionkeeper.Querier{Keeper: p.distributionKeeper} - qRes, err := querier.DelegatorWithdrawAddress( - ctx, - &distributiontypes.QueryDelegatorWithdrawAddressRequest{ - DelegatorAddress: delegatorAccAddr.String(), - }, - ) - if err != nil { - return false, common.Address{}, err - } - - withdrawerAccAddr, err := sdk.AccAddressFromBech32(qRes.WithdrawAddress) - if err != nil { - return false, common.Address{}, err - } - - withdrawerHexAddr := common.BytesToAddress(withdrawerAccAddr) - return stateDB.GetCodeSize(withdrawerHexAddr) > 0, withdrawerHexAddr, nil +// getWithdrawerHexAddr is a helper function to get the hex address +// of the withdrawer for the specified account address +func (p Precompile) getWithdrawerHexAddr(ctx sdk.Context, delegatorAddr common.Address) common.Address { + withdrawerAccAddr := p.distributionKeeper.GetDelegatorWithdrawAddr(ctx, delegatorAddr.Bytes()) + return common.BytesToAddress(withdrawerAccAddr) } diff --git a/precompiles/distribution/tx_test.go b/precompiles/distribution/tx_test.go index d1ebad511c..76ccd66fc3 100644 --- a/precompiles/distribution/tx_test.go +++ b/precompiles/distribution/tx_test.go @@ -447,7 +447,7 @@ func (s *PrecompileTestSuite) TestClaimRewards() { } func (s *PrecompileTestSuite) TestFundCommunityPool() { - method := s.precompile.Methods[distribution.ClaimRewardsMethod] + method := s.precompile.Methods[distribution.FundCommunityPoolMethod] testCases := []struct { name string diff --git a/precompiles/distribution/utils_test.go b/precompiles/distribution/utils_test.go index 68b3ae0dba..06bc1b2a97 100644 --- a/precompiles/distribution/utils_test.go +++ b/precompiles/distribution/utils_test.go @@ -181,9 +181,9 @@ func (s *PrecompileTestSuite) DoSetupTest() { s.Require().NoError(err) s.precompile = precompile - coins := sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, math.NewInt(5000000000000000000))) - inflCoins := sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, math.NewInt(2000000000000000000))) - distrCoins := sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, math.NewInt(3000000000000000000))) + coins := sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, math.NewInt(5_000_000_000_000_000_000))) + inflCoins := sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, math.NewInt(2_000_000_000_000_000_000))) + distrCoins := sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, math.NewInt(3_000_000_000_000_000_000))) err = s.app.BankKeeper.MintCoins(s.ctx, inflationtypes.ModuleName, coins) s.Require().NoError(err) err = s.app.BankKeeper.SendCoinsFromModuleToModule(s.ctx, inflationtypes.ModuleName, authtypes.FeeCollectorName, inflCoins) diff --git a/precompiles/erc20/erc20.go b/precompiles/erc20/erc20.go index 8ba7f607e5..a197f4ef17 100644 --- a/precompiles/erc20/erc20.go +++ b/precompiles/erc20/erc20.go @@ -10,7 +10,6 @@ import ( cmn "github.com/evmos/evmos/v18/precompiles/common" "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" storetypes "github.com/cosmos/cosmos-sdk/store/types" @@ -66,7 +65,7 @@ func NewPrecompile( return nil, err } - return &Precompile{ + p := &Precompile{ Precompile: cmn.Precompile{ ABI: newABI, AuthzKeeper: authzKeeper, @@ -77,12 +76,10 @@ func NewPrecompile( tokenPair: tokenPair, bankKeeper: bankKeeper, transferKeeper: transferKeeper, - }, nil -} - -// Address defines the address of the ERC-20 precompile contract. -func (p Precompile) Address() common.Address { - return p.tokenPair.GetERC20Contract() + } + // Address defines the address of the ERC-20 precompile contract. + p.SetAddress(p.tokenPair.GetERC20Contract()) + return p, nil } // RequiredGas calculates the contract gas used for the @@ -133,7 +130,7 @@ func (p Precompile) RequiredGas(input []byte) uint64 { // Run executes the precompiled contract ERC-20 methods defined in the ABI. func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, readOnly bool) (bz []byte, err error) { - ctx, stateDB, method, initialGas, args, err := p.RunSetup(evm, contract, readOnly, p.IsTransaction) + ctx, stateDB, snapshot, method, initialGas, args, err := p.RunSetup(evm, contract, readOnly, p.IsTransaction) if err != nil { return nil, err } @@ -152,7 +149,9 @@ func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, readOnly bool) (bz [ if !contract.UseGas(cost) { return nil, vm.ErrOutOfGas } - + if err := p.AddJournalEntries(stateDB, snapshot); err != nil { + return nil, err + } return bz, nil } diff --git a/precompiles/ics20/ics20.go b/precompiles/ics20/ics20.go index 8641643351..7169652b9c 100644 --- a/precompiles/ics20/ics20.go +++ b/precompiles/ics20/ics20.go @@ -48,7 +48,7 @@ func NewPrecompile( return nil, err } - return &Precompile{ + p := &Precompile{ Precompile: cmn.Precompile{ ABI: newAbi, AuthzKeeper: authzKeeper, @@ -59,13 +59,11 @@ func NewPrecompile( transferKeeper: transferKeeper, channelKeeper: channelKeeper, stakingKeeper: stakingKeeper, - }, nil -} - -// Address defines the address of the ICS-20 compile contract. -// address: 0x0000000000000000000000000000000000000802 -func (Precompile) Address() common.Address { - return common.HexToAddress(PrecompileAddress) + } + // SetAddress defines the address of the ICS-20 compile contract. + // address: 0x0000000000000000000000000000000000000802 + p.SetAddress(common.HexToAddress(PrecompileAddress)) + return p, nil } // RequiredGas calculates the precompiled contract's base gas rate. @@ -88,7 +86,7 @@ func (p Precompile) RequiredGas(input []byte) uint64 { // Run executes the precompiled contract IBC transfer methods defined in the ABI. func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, readOnly bool) (bz []byte, err error) { - ctx, stateDB, method, initialGas, args, err := p.RunSetup(evm, contract, readOnly, p.IsTransaction) + ctx, stateDB, snapshot, method, initialGas, args, err := p.RunSetup(evm, contract, readOnly, p.IsTransaction) if err != nil { return nil, err } @@ -97,10 +95,6 @@ func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, readOnly bool) (bz [ // It avoids panics and returns the out of gas error so the EVM can continue gracefully. defer cmn.HandleGasError(ctx, contract, initialGas, &err)() - if err := stateDB.Commit(); err != nil { - return nil, err - } - switch method.Name { // TODO Approval transactions => need cosmos-sdk v0.46 & ibc-go v6.2.0 // Authorization Methods: @@ -138,6 +132,10 @@ func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, readOnly bool) (bz [ return nil, vm.ErrOutOfGas } + if err := p.AddJournalEntries(stateDB, snapshot); err != nil { + return nil, err + } + return bz, nil } diff --git a/precompiles/ics20/integration_test.go b/precompiles/ics20/integration_test.go index 8dfcb74507..287ec3ee9c 100644 --- a/precompiles/ics20/integration_test.go +++ b/precompiles/ics20/integration_test.go @@ -11,6 +11,7 @@ import ( "github.com/cosmos/cosmos-sdk/types/query" transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" ibctesting "github.com/cosmos/ibc-go/v7/testing" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" @@ -1051,8 +1052,13 @@ var _ = Describe("IBCTransfer Precompile", func() { var _ = Describe("Calling ICS20 precompile from another contract", func() { var ( + + // interchainSenderCallerContract is the compiled contract calling the interchain functionality + interchainSenderCallerContract evmtypes.CompiledContract // contractAddr is the address of the smart contract that will be deployed contractAddr common.Address + // senderCallerContractAddr is the address of the InterchainSenderCaller smart contract that will be deployed + senderCallerContractAddr common.Address // execRevertedCheck defines the default log checking arguments which includes the // standard revert message. execRevertedCheck testutil.LogCheckArgs @@ -1065,6 +1071,7 @@ var _ = Describe("Calling ICS20 precompile from another contract", func() { s.SetupTest() s.setupAllocationsForTesting() + // Deploy InterchainSender contract interchainSenderContract, err = contracts.LoadInterchainSenderContract() Expect(err).To(BeNil(), "error while loading the interchain sender contract: %v", err) @@ -1081,11 +1088,33 @@ var _ = Describe("Calling ICS20 precompile from another contract", func() { // NextBlock the smart contract s.chainA.NextBlock() - // check contract was correctly deployed + // Deploy InterchainSenderCaller contract + interchainSenderCallerContract, err = contracts.LoadInterchainSenderCallerContract() + Expect(err).To(BeNil(), "error while loading the interchain sender contract: %v", err) + + senderCallerContractAddr, err = DeployContract( + s.chainA.GetContext(), + s.app, + s.privKey, + gasPrice, + s.queryClientEVM, + interchainSenderCallerContract, + contractAddr, + ) + Expect(err).To(BeNil(), "error while deploying the smart contract: %v", err) + + // NextBlock the smart contract + s.chainA.NextBlock() + + // check contracts were correctly deployed cAcc := s.app.EvmKeeper.GetAccount(s.chainA.GetContext(), contractAddr) Expect(cAcc).ToNot(BeNil(), "contract account should exist") Expect(cAcc.IsContract()).To(BeTrue(), "account should be a contract") + cAcc = s.app.EvmKeeper.GetAccount(s.chainA.GetContext(), senderCallerContractAddr) + Expect(cAcc).ToNot(BeNil(), "contract account should exist") + Expect(cAcc.IsContract()).To(BeTrue(), "account should be a contract") + // populate default call args defaultCallArgs = contracts.CallArgs{ ContractAddr: contractAddr, @@ -1265,6 +1294,81 @@ var _ = Describe("Calling ICS20 precompile from another contract", func() { finalBalance := s.app.BankKeeper.GetBalance(s.chainA.GetContext(), s.address.Bytes(), s.bondDenom) Expect(finalBalance.Amount).To(Equal(initialBalance.Amount.Sub(defaultCoins.AmountOf(s.bondDenom)).Sub(fees))) }) + + Context("Calling the InterchainSender caller contract", func() { + It("should perform 2 transfers and revert 2 transfers", func() { + // setup approval to send transfer without memo + alloc := defaultSingleAlloc + alloc[0].AllowedPacketData = []string{""} + appArgs := defaultApproveArgs.WithArgs(alloc) + s.setTransferApprovalForContract(appArgs) + // Send some funds to the InterchainSender + // to perform internal transfers + initialContractBal := math.NewInt(1e18) + err := evmosutil.FundAccountWithBaseDenom(s.chainA.GetContext(), s.app.BankKeeper, contractAddr.Bytes(), initialContractBal.Int64()) + Expect(err).To(BeNil(), "error while funding account") + + // get initial balances + initialBalance := s.app.BankKeeper.GetBalance(s.chainA.GetContext(), s.address.Bytes(), s.bondDenom) + + // use half of the allowance when calling the fn + // because in total we'll try to send (2 * amt) + // with 4 IBC transfers (2 will succeed & 2 will revert) + amt := defaultCmnCoins[0].ToSDKType().Amount.QuoRaw(2) + args := contracts.CallArgs{ + PrivKey: s.privKey, + ContractAddr: senderCallerContractAddr, + ContractABI: interchainSenderCallerContract.ABI, + MethodName: "transfersWithRevert", + GasPrice: gasPrice, + Args: []interface{}{ + s.address, + s.transferPath.EndpointA.ChannelConfig.PortID, + s.transferPath.EndpointA.ChannelID, + s.bondDenom, + amt.BigInt(), + s.chainB.SenderAccount.GetAddress().String(), // receiver + }, + } + + logCheckArgs := passCheck.WithExpEvents([]string{ics20.EventTypeIBCTransfer, ics20.EventTypeIBCTransfer}...) + + res, _, err := contracts.CallContractAndCheckLogs(s.chainA.GetContext(), s.app, args, logCheckArgs) + Expect(err).To(BeNil(), "error while calling the smart contract: %v", err) + Expect(res.IsOK()).To(BeTrue()) + fees := math.NewIntFromBigInt(gasPrice).MulRaw(res.GasUsed) + + // the response should have two IBC transfer cosmos events (required for the relayer) + expIBCPackets := 2 + ibcTransferCount := 0 + sendPacketCount := 0 + for _, event := range res.Events { + if event.Type == transfertypes.EventTypeTransfer { + ibcTransferCount++ + } + if event.Type == channeltypes.EventTypeSendPacket { + sendPacketCount++ + } + } + Expect(ibcTransferCount).To(Equal(expIBCPackets)) + Expect(sendPacketCount).To(Equal(expIBCPackets)) + + // Check that 2 packages were created + pkgs := s.app.IBCKeeper.ChannelKeeper.GetAllPacketCommitments(s.chainA.GetContext()) + Expect(pkgs).To(HaveLen(expIBCPackets)) + + // check that the escrow amount corresponds to the 2 transfers + coinsEscrowed := s.app.TransferKeeper.GetTotalEscrowForDenom(s.chainA.GetContext(), s.bondDenom) + Expect(coinsEscrowed.Amount).To(Equal(amt)) + + amtTransferredFromContract := math.NewInt(45) + finalBalance := s.app.BankKeeper.GetBalance(s.chainA.GetContext(), s.address.Bytes(), s.bondDenom) + Expect(finalBalance.Amount).To(Equal(initialBalance.Amount.Sub(amt).Sub(fees).Add(amtTransferredFromContract))) + + contractFinalBalance := s.app.BankKeeper.GetBalance(s.chainA.GetContext(), contractAddr.Bytes(), s.bondDenom) + Expect(contractFinalBalance.Amount).To(Equal(initialContractBal.Sub(amtTransferredFromContract))) + }) + }) }) }) diff --git a/precompiles/ics20/tx.go b/precompiles/ics20/tx.go index 43dee10ca7..b5b8c66025 100644 --- a/precompiles/ics20/tx.go +++ b/precompiles/ics20/tx.go @@ -9,11 +9,15 @@ import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" + transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v18/x/evm/statedb" + + cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/utils" ) const ( @@ -23,7 +27,7 @@ const ( ) // Transfer implements the ICS20 transfer transactions. -func (p Precompile) Transfer( +func (p *Precompile) Transfer( ctx sdk.Context, origin common.Address, contract *vm.Contract, @@ -65,6 +69,21 @@ func (p Precompile) Transfer( return nil, err } + if contract.CallerAddress != origin && msg.Token.Denom == utils.BaseDenom { + // escrow address is also changed on this tx, and it is not a module account + // so we need to account for this on the UpdateDirties + escrowAccAddress := transfertypes.GetEscrowAddress(msg.SourcePort, msg.SourceChannel) + escrowHexAddr := common.BytesToAddress(escrowAccAddress) + // NOTE: This ensures that the changes in the bank keeper are correctly mirrored to the EVM stateDB + // when calling the precompile from another smart contract. + // This prevents the stateDB from overwriting the changed balance in the bank keeper when committing the EVM state. + amt := msg.Token.Amount.BigInt() + p.SetBalanceChangeEntries( + cmn.NewBalanceChangeEntry(sender, amt, cmn.Sub), + cmn.NewBalanceChangeEntry(escrowHexAddr, amt, cmn.Add), + ) + } + if err = EmitIBCTransferEvent( ctx, stateDB, @@ -80,11 +99,5 @@ func (p Precompile) Transfer( return nil, err } - // NOTE: This ensures that the changes in the bank keeper are correctly mirrored to the EVM stateDB. - // This prevents the stateDB from overwriting the changed balance in the bank keeper when committing the EVM state. - if isCallerSender && msg.Token.Denom == p.stakingKeeper.BondDenom(ctx) { - stateDB.(*statedb.StateDB).SubBalance(contract.CallerAddress, msg.Token.Amount.BigInt()) - } - return method.Outputs.Pack(res.Sequence) } diff --git a/precompiles/staking/errors.go b/precompiles/staking/errors.go index 22cadd6c6d..13fc2c0b70 100644 --- a/precompiles/staking/errors.go +++ b/precompiles/staking/errors.go @@ -12,4 +12,6 @@ const ( ErrNoDelegationFound = "delegation with delegator %s not found for validator %s" // ErrDifferentOriginFromValidator is raised when the origin address is not the same as the validator address. ErrDifferentOriginFromValidator = "origin address %s is not the same as validator operator address %s" + // ErrCannotCallFromContract is raised when a function cannot be called from a smart contract. + ErrCannotCallFromContract = "this method can only be called directly to the precompile, not from a smart contract" ) diff --git a/precompiles/staking/integration_test.go b/precompiles/staking/integration_test.go index 0ea4ef2d8f..12e4fee554 100644 --- a/precompiles/staking/integration_test.go +++ b/precompiles/staking/integration_test.go @@ -15,6 +15,7 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/query" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" @@ -1628,10 +1629,14 @@ var _ = Describe("Calling staking precompile directly", func() { var _ = Describe("Calling staking precompile via Solidity", func() { var ( // contractAddr is the address of the smart contract that will be deployed - contractAddr common.Address + contractAddr common.Address + contractTwoAddr common.Address + stkReverterAddr common.Address // stakingCallerContract is the contract instance calling into the staking precompile - stakingCallerContract evmtypes.CompiledContract + stakingCallerContract evmtypes.CompiledContract + stakingCallerTwoContract evmtypes.CompiledContract + stakingReverterContract evmtypes.CompiledContract // approvalCheck is a configuration for the log checker to see if an approval event was emitted. approvalCheck testutil.LogCheckArgs @@ -1645,6 +1650,8 @@ var _ = Describe("Calling staking precompile via Solidity", func() { nonExistingAddr = testutiltx.GenerateAddress() // nonExistingVal is a validator address that does not exist in the state of the test suite nonExistingVal = sdk.ValAddress(nonExistingAddr.Bytes()) + + testContractInitialBalance = math.NewInt(100) ) BeforeEach(func() { @@ -1655,11 +1662,35 @@ var _ = Describe("Calling staking precompile via Solidity", func() { contractAddr, err = s.DeployContract(stakingCallerContract) Expect(err).To(BeNil(), "error while deploying the smart contract: %v", err) - valAddr = s.validators[0].GetOperator() - valAddr2 = s.validators[1].GetOperator() + s.NextBlock() + + // Deploy StakingCallerTwo contract + stakingCallerTwoContract, err = testdata.LoadStakingCallerTwoContract() + Expect(err).To(BeNil(), "error while loading the StakingCallerTwo contract") + + contractTwoAddr, err = s.DeployContract(stakingCallerTwoContract) + Expect(err).To(BeNil(), "error while deploying the StakingCallerTwo contract") + s.NextBlock() + // Deploy StakingReverter contract + stakingReverterContract, err = contracts.LoadStakingReverterContract() + Expect(err).To(BeNil(), "error while loading the StakingReverter contract") + + stkReverterAddr, err = s.DeployContract(stakingReverterContract) + Expect(err).To(BeNil(), "error while deploying the StakingReverter contract") s.NextBlock() + // send some funds to the StakingCallerTwo & StakingReverter contracts to transfer to the + // delegator during the tx + err = evmosutil.FundAccount(s.ctx, s.app.BankKeeper, contractTwoAddr.Bytes(), sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, testContractInitialBalance))) + Expect(err).To(BeNil(), "error while funding the smart contract: %v", err) + + err = evmosutil.FundAccount(s.ctx, s.app.BankKeeper, stkReverterAddr.Bytes(), sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, testContractInitialBalance))) + Expect(err).To(BeNil(), "error while funding the smart contract: %v", err) + + valAddr = s.validators[0].GetOperator() + valAddr2 = s.validators[1].GetOperator() + // check contract was correctly deployed cAcc := s.app.EvmKeeper.GetAccount(s.ctx, contractAddr) Expect(cAcc).ToNot(BeNil(), "contract account should exist") @@ -1961,19 +1992,16 @@ var _ = Describe("Calling staking precompile via Solidity", func() { s.NextBlock() }) - It("tx from validator operator - should create a validator success", func() { + It("tx from validator operator - should NOT create a validator", func() { cArgs := defaultCreateValidatorArgs. WithPrivKey(s.privKey). WithArgs(defaultDescription, defaultCommission, defaultMinSelfDelegation, s.address, defaultPubkeyBase64Str, defaultValue) - logCheckArgs := passCheck.WithExpEvents(staking.EventTypeCreateValidator) - - _, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, cArgs, logCheckArgs) - Expect(err).To(BeNil(), "error while calling the smart contract: %v", err) + _, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, cArgs, execRevertedCheck) + Expect(err).NotTo(BeNil(), "error while calling the smart contract: %v", err) - validator, found := s.app.StakingKeeper.GetValidator(s.ctx, s.address.Bytes()) - Expect(found).To(BeTrue(), "expected validator to be found") - Expect(validator.Description.Moniker).To(Equal(defaultDescription.Moniker), "expected validator moniker to be 'new node'") + _, found := s.app.StakingKeeper.GetValidator(s.ctx, s.address.Bytes()) + Expect(found).To(BeFalse(), "expected validator NOT to be found") }) It("tx from another EOA - should create a validator fail", func() { @@ -2055,7 +2083,7 @@ var _ = Describe("Calling staking precompile via Solidity", func() { s.NextBlock() }) - It("with tx from validator operator - should edit a validator", func() { + It("with tx from validator operator - should NOT edit a validator", func() { cArgs := defaultEditValArgs. WithPrivKey(valPriv). WithArgs( @@ -2063,25 +2091,12 @@ var _ = Describe("Calling staking precompile via Solidity", func() { defaultCommissionRate, defaultMinSelfDelegation, ) - logCheckArgs := passCheck. - WithExpEvents(staking.EventTypeEditValidator) - - _, _, err = contracts.CallContractAndCheckLogs(s.ctx, s.app, cArgs, logCheckArgs) - Expect(err).To(BeNil(), "error while calling the smart contract: %v", err) + _, _, err = contracts.CallContractAndCheckLogs(s.ctx, s.app, cArgs, execRevertedCheck) + Expect(err).NotTo(BeNil(), "error while calling the smart contract: %v", err) validator, found := s.app.StakingKeeper.GetValidator(s.ctx, valAddr.Bytes()) Expect(found).To(BeTrue(), "expected validator to be found") - Expect(validator.Description.Moniker).To(Equal(defaultDescription.Moniker), "expected validator moniker to be updated") - // Other fields should not be modified due to the value "[do-not-modify]". - Expect(validator.Description.Identity).To(Equal(description.Identity), "expected validator identity not to be updated") - Expect(validator.Description.Website).To(Equal(description.Website), "expected validator website not to be updated") - Expect(validator.Description.SecurityContact).To(Equal(description.SecurityContact), "expected validator security contact not to be updated") - Expect(validator.Description.Details).To(Equal(description.Details), "expected validator details not to be updated") - - Expect(validator.Commission.Rate.BigInt().String()).To(Equal(commission.Rate.String()), "expected validator commission rate remain unchanged") - Expect(validator.Commission.MaxRate.BigInt().String()).To(Equal(commission.MaxRate.String()), "expected validator max commission rate remain unchanged") - Expect(validator.Commission.MaxChangeRate.BigInt().String()).To(Equal(commission.MaxChangeRate.String()), "expected validator max change rate remain unchanged") - Expect(validator.MinSelfDelegation.String()).To(Equal(minSelfDelegation.String()), "expected validator min self delegation remain unchanged") + Expect(validator.Description.Moniker).NotTo(Equal(defaultDescription.Moniker), "expected validator moniker NOT to be updated") }) It("with tx from another EOA - should fail", func() { @@ -2168,6 +2183,192 @@ var _ = Describe("Calling staking precompile via Solidity", func() { Expect(delegation.GetShares()).To(Equal(expShares), "expected delegation shares to be 2") }) + Context("Calling the precompile from the StakingReverter contract", func() { + var ( + txSenderInitialBal sdk.Coin + contractInitialBalance sdk.Coin + gasPrice = math.NewInt(1e9) + delAmt = math.NewInt(1e18) + ) + + BeforeEach(func() { + // set approval for the StakingReverter contract + s.SetupApproval(s.privKey, stkReverterAddr, delAmt.BigInt(), []string{staking.DelegateMsg}) + + txSenderInitialBal = s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + contractInitialBalance = s.app.BankKeeper.GetBalance(s.ctx, stkReverterAddr.Bytes(), s.bondDenom) + }) + + It("should revert the changes and NOT delegate - successfull tx", func() { + callArgs := contracts.CallArgs{ + ContractAddr: stkReverterAddr, + ContractABI: stakingReverterContract.ABI, + PrivKey: s.privKey, + MethodName: "run", + Args: []interface{}{ + big.NewInt(5), s.validators[0].GetOperator().String(), + }, + GasPrice: gasPrice.BigInt(), + } + + // Tx should be successful, but no state changes happened + res, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, callArgs, passCheck) + Expect(err).To(BeNil()) + fees := gasPrice.MulRaw(res.GasUsed) + + // contract balance should remain unchanged + contractFinalBalance := s.app.BankKeeper.GetBalance(s.ctx, stkReverterAddr.Bytes(), s.bondDenom) + Expect(contractFinalBalance.Amount).To(Equal(contractInitialBalance.Amount)) + + // No delegation should be created + _, found := s.app.StakingKeeper.GetDelegation(s.ctx, stkReverterAddr.Bytes(), s.validators[0].GetOperator()) + Expect(found).To(BeFalse(), "expected NO delegation to be found") + + // Only fees deducted on tx sender + txSenderFinalBal := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + Expect(txSenderFinalBal.Amount).To(Equal(txSenderInitialBal.Amount.Sub(fees))) + }) + + It("should revert the changes and NOT delegate - failed tx - max precompile calls reached", func() { + callArgs := contracts.CallArgs{ + ContractAddr: stkReverterAddr, + ContractABI: stakingReverterContract.ABI, + PrivKey: s.privKey, + MethodName: "run", + Args: []interface{}{ + big.NewInt(7), s.validators[0].GetOperator().String(), + }, + GasPrice: gasPrice.BigInt(), + } + + // Tx should fail due to MaxPrecompileCalls + _, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, callArgs, execRevertedCheck) + Expect(err).NotTo(BeNil()) + + // contract balance should remain unchanged + contractFinalBalance := s.app.BankKeeper.GetBalance(s.ctx, stkReverterAddr.Bytes(), s.bondDenom) + Expect(contractFinalBalance.Amount).To(Equal(contractInitialBalance.Amount)) + + // No delegation should be created + _, found := s.app.StakingKeeper.GetDelegation(s.ctx, stkReverterAddr.Bytes(), s.validators[0].GetOperator()) + Expect(found).To(BeFalse(), "expected NO delegation to be found") + }) + }) + + Context("Table-driven tests for Delegate method", func() { + // testCase is a struct used for cases of contracts calls that have some operation + // performed before and/or after the precompile call + type testCase struct { + before bool + after bool + } + + var ( + args contracts.CallArgs + delegatorInitialBal sdk.Coin + contractInitialBalance sdk.Coin + bondedTokensPoolInitialBalance sdk.Coin + delAmt = math.NewInt(1e18) + gasPrice = math.NewInt(1e9) + bondedTokensPoolAccAddr = authtypes.NewModuleAddress("bonded_tokens_pool") + ) + + BeforeEach(func() { + // set authorization for contract + callCArgs := contracts.CallArgs{ + ContractAddr: contractTwoAddr, + ContractABI: stakingCallerTwoContract.ABI, + PrivKey: s.privKey, + MethodName: "testApprove", + Args: []interface{}{ + contractTwoAddr, []string{staking.DelegateMsg}, delAmt.BigInt(), + }, + } + + s.SetupApprovalWithContractCalls(callCArgs) + + args = callCArgs. + WithMethodName("testDelegateWithCounterAndTransfer"). + WithGasPrice(gasPrice.BigInt()) + + delegatorInitialBal = s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + contractInitialBalance = s.app.BankKeeper.GetBalance(s.ctx, contractTwoAddr.Bytes(), s.bondDenom) + bondedTokensPoolInitialBalance = s.app.BankKeeper.GetBalance(s.ctx, bondedTokensPoolAccAddr, s.bondDenom) + }) + + DescribeTable("should delegate and update balances accordingly", func(tc testCase) { + cArgs := args. + WithArgs( + s.address, valAddr.String(), delAmt.BigInt(), tc.before, tc.after, + ) + + // This is the amount of tokens transferred from the contract to the delegator + // during the contract call + transferToDelAmt := math.ZeroInt() + for _, transferred := range []bool{tc.before, tc.after} { + if transferred { + transferToDelAmt = transferToDelAmt.AddRaw(15) + } + } + + logCheckArgs := passCheck. + WithExpEvents(staking.EventTypeDelegate) + + res, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, cArgs, logCheckArgs) + Expect(err).To(BeNil(), "error while calling the smart contract: %v", err) + fees := gasPrice.MulRaw(res.GasUsed) + + // check the contract's balance was deducted to fund the vesting account + contractFinalBal := s.app.BankKeeper.GetBalance(s.ctx, contractTwoAddr.Bytes(), s.bondDenom) + Expect(contractFinalBal.Amount).To(Equal(contractInitialBalance.Amount.Sub(transferToDelAmt))) + + delegation, found := s.app.StakingKeeper.GetDelegation(s.ctx, s.address.Bytes(), valAddr) + Expect(found).To(BeTrue(), "expected delegation to be found") + expShares := prevDelegation.GetShares().Add(math.LegacyNewDec(1)) + Expect(delegation.GetShares()).To(Equal(expShares), "expected delegation shares to be 2") + + delegatorFinalBal := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + Expect(delegatorFinalBal.Amount).To(Equal(delegatorInitialBal.Amount.Sub(fees).Sub(delAmt).Add(transferToDelAmt))) + + // check the bondedTokenPool is updated with the delegated tokens + bondedTokensPoolFinalBalance := s.app.BankKeeper.GetBalance(s.ctx, bondedTokensPoolAccAddr, s.bondDenom) + Expect(bondedTokensPoolFinalBalance.Amount).To(Equal(bondedTokensPoolInitialBalance.Amount.Add(delAmt))) + }, + Entry("contract tx with transfer to delegator before and after precompile call ", testCase{ + before: true, + after: true, + }), + Entry("contract tx with transfer to delegator before precompile call ", testCase{ + before: true, + after: false, + }), + Entry("contract tx with transfer to delegator after precompile call ", testCase{ + before: false, + after: true, + }), + ) + + It("should NOT delegate and update balances accordingly - internal transfer to tokens pool", func() { + cArgs := args. + WithMethodName("testDelegateWithTransfer"). + WithArgs( + common.BytesToAddress(bondedTokensPoolAccAddr), + s.address, valAddr.String(), delAmt.BigInt(), true, true, + ) + + _, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, cArgs, execRevertedCheck) + Expect(err).NotTo(BeNil()) + + // contract balance should remain unchanged + contractFinalBal := s.app.BankKeeper.GetBalance(s.ctx, contractTwoAddr.Bytes(), s.bondDenom) + Expect(contractFinalBal.Amount).To(Equal(contractInitialBalance.Amount)) + + // check the bondedTokenPool should remain unchanged + bondedTokensPoolFinalBalance := s.app.BankKeeper.GetBalance(s.ctx, bondedTokensPoolAccAddr, s.bondDenom) + Expect(bondedTokensPoolFinalBalance.Amount).To(Equal(bondedTokensPoolInitialBalance.Amount)) + }) + }) + It("should not delegate when exceeding the allowance", func() { cArgs := defaultDelegateArgs.WithArgs( s.address, valAddr.String(), big.NewInt(2e18), @@ -2226,6 +2427,7 @@ var _ = Describe("Calling staking precompile via Solidity", func() { Expect(delegation.GetShares()).To(Equal(math.LegacyNewDecFromInt(math.NewInt(100))), "expected only the delegation from creating the validator, no more") }) }) + Describe("delegation from a vesting account", func() { var ( funder common.Address @@ -2633,7 +2835,7 @@ var _ = Describe("Calling staking precompile via Solidity", func() { defaultCancelUnbondingArgs contracts.CallArgs // expCreationHeight is the expected creation height of the unbonding delegation - expCreationHeight = int64(4) + expCreationHeight = int64(6) ) BeforeEach(func() { @@ -2666,14 +2868,14 @@ var _ = Describe("Calling staking precompile via Solidity", func() { Expect(unbondingDelegations[0].DelegatorAddress).To(Equal(sdk.AccAddress(s.address.Bytes()).String()), "expected delegator address to be %s", s.address) Expect(unbondingDelegations[0].ValidatorAddress).To(Equal(valAddr.String()), "expected validator address to be %s", valAddr) Expect(unbondingDelegations[0].Entries).To(HaveLen(1), "expected one unbonding delegation entry to be found") - Expect(unbondingDelegations[0].Entries[0].CreationHeight).To(Equal(expCreationHeight), "expected different creation height") + Expect(unbondingDelegations[0].Entries[0].CreationHeight).To(Equal(s.ctx.BlockHeight()-1), "expected different creation height") Expect(unbondingDelegations[0].Entries[0].Balance).To(Equal(math.NewInt(1e18)), "expected different balance") }) Context("without approval set", func() { It("should not cancel unbonding delegations", func() { cArgs := defaultCancelUnbondingArgs.WithArgs( - s.address, valAddr.String(), big.NewInt(1e18), big.NewInt(expCreationHeight), + s.address, valAddr.String(), big.NewInt(1e18), big.NewInt(s.ctx.BlockHeight()), ) _, _, err = contracts.CallContractAndCheckLogs(s.ctx, s.app, cArgs, execRevertedCheck) @@ -2716,7 +2918,7 @@ var _ = Describe("Calling staking precompile via Solidity", func() { s.SetupApprovalWithContractCalls(approvalArgs) cArgs := defaultCancelUnbondingArgs.WithArgs( - s.address, valAddr.String(), big.NewInt(1e18), big.NewInt(expCreationHeight), + s.address, valAddr.String(), big.NewInt(1e18), big.NewInt(s.ctx.BlockHeight()), ) _, _, err = contracts.CallContractAndCheckLogs(s.ctx, s.app, cArgs, execRevertedCheck) @@ -2728,7 +2930,7 @@ var _ = Describe("Calling staking precompile via Solidity", func() { It("should not cancel unbonding any delegations when unbonding delegation does not exist", func() { cancelArgs := defaultCancelUnbondingArgs.WithArgs( - s.address, nonExistingVal.String(), big.NewInt(1e18), big.NewInt(expCreationHeight), + s.address, nonExistingVal.String(), big.NewInt(1e18), big.NewInt(s.ctx.BlockHeight()), ) _, _, err = contracts.CallContractAndCheckLogs(s.ctx, s.app, cancelArgs, execRevertedCheck) @@ -2747,7 +2949,7 @@ var _ = Describe("Calling staking precompile via Solidity", func() { cancelUnbondArgs := defaultCancelUnbondingArgs. WithPrivKey(newPriv). - WithArgs(s.address, valAddr.String(), big.NewInt(1e18), big.NewInt(expCreationHeight)) + WithArgs(s.address, valAddr.String(), big.NewInt(1e18), big.NewInt(s.ctx.BlockHeight())) _, _, err = contracts.CallContractAndCheckLogs(s.ctx, s.app, cancelUnbondArgs, execRevertedCheck) Expect(err).To(HaveOccurred(), "error while calling the smart contract: %v", err) @@ -3152,7 +3354,7 @@ var _ = Describe("Calling staking precompile via Solidity", func() { Expect(unbondingDelegations[0].DelegatorAddress).To(Equal(sdk.AccAddress(s.address.Bytes()).String()), "expected delegator address to be %s", s.address) Expect(unbondingDelegations[0].ValidatorAddress).To(Equal(valAddr.String()), "expected validator address to be %s", valAddr) Expect(unbondingDelegations[0].Entries).To(HaveLen(1), "expected one unbonding delegation entry to be found") - Expect(unbondingDelegations[0].Entries[0].CreationHeight).To(Equal(int64(4)), "expected different creation height") + Expect(unbondingDelegations[0].Entries[0].CreationHeight).To(Equal(s.ctx.BlockHeight()), "expected different creation height") Expect(unbondingDelegations[0].Entries[0].Balance).To(Equal(math.NewInt(1e18)), "expected different balance") }) diff --git a/precompiles/staking/staking.go b/precompiles/staking/staking.go index a866120764..d3bf4829a8 100644 --- a/precompiles/staking/staking.go +++ b/precompiles/staking/staking.go @@ -52,7 +52,7 @@ func NewPrecompile( return nil, err } - return &Precompile{ + p := &Precompile{ Precompile: cmn.Precompile{ ABI: abi, AuthzKeeper: authzKeeper, @@ -61,7 +61,11 @@ func NewPrecompile( ApprovalExpiration: cmn.DefaultExpirationDuration, // should be configurable in the future. }, stakingKeeper: stakingKeeper, - }, nil + } + // SetAddress defines the address of the staking compile contract. + // address: 0x0000000000000000000000000000000000000800 + p.SetAddress(common.HexToAddress(PrecompileAddress)) + return p, nil } // RequiredGas returns the required bare minimum gas to execute the precompile. @@ -82,15 +86,9 @@ func (p Precompile) RequiredGas(input []byte) uint64 { return p.Precompile.RequiredGas(input, p.IsTransaction(method.Name)) } -// Address defines the address of the staking compile contract. -// address: 0x0000000000000000000000000000000000000800 -func (Precompile) Address() common.Address { - return common.HexToAddress(PrecompileAddress) -} - // Run executes the precompiled contract staking methods defined in the ABI. func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, readOnly bool) (bz []byte, err error) { - ctx, stateDB, method, initialGas, args, err := p.RunSetup(evm, contract, readOnly, p.IsTransaction) + ctx, stateDB, snapshot, method, initialGas, args, err := p.RunSetup(evm, contract, readOnly, p.IsTransaction) if err != nil { return nil, err } @@ -99,10 +97,6 @@ func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, readOnly bool) (bz [ // It avoids panics and returns the out of gas error so the EVM can continue gracefully. defer cmn.HandleGasError(ctx, contract, initialGas, &err)() - if err := stateDB.Commit(); err != nil { - return nil, err - } - switch method.Name { // Authorization transactions case authorization.ApproveMethod: @@ -154,6 +148,10 @@ func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, readOnly bool) (bz [ return nil, vm.ErrOutOfGas } + if err := p.AddJournalEntries(stateDB, snapshot); err != nil { + return nil, err + } + return bz, nil } diff --git a/precompiles/staking/testdata/StakingCaller.json b/precompiles/staking/testdata/StakingCaller.json index 63909bb3de..fa01a3c800 100644 --- a/precompiles/staking/testdata/StakingCaller.json +++ b/precompiles/staking/testdata/StakingCaller.json @@ -1071,8 +1071,8 @@ "type": "function" } ], - "bytecode": "0x60806040526040518060200160405280604051806060016040528060238152602001620061c56023913981525060019060016200003e92919062000053565b503480156200004c57600080fd5b50620004a1565b828054828255906000526020600020908101928215620000a0579160200282015b828111156200009f5782518290816200008e9190620003ba565b509160200191906001019062000074565b5b509050620000af9190620000b3565b5090565b5b80821115620000d75760008181620000cd9190620000db565b50600101620000b4565b5090565b508054620000e990620001a9565b6000825580601f10620000fd57506200011e565b601f0160209004906000526020600020908101906200011d919062000121565b5b50565b5b808211156200013c57600081600090555060010162000122565b5090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620001c257607f821691505b602082108103620001d857620001d76200017a565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620002427fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000203565b6200024e868362000203565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200029b620002956200028f8462000266565b62000270565b62000266565b9050919050565b6000819050919050565b620002b7836200027a565b620002cf620002c682620002a2565b84845462000210565b825550505050565b600090565b620002e6620002d7565b620002f3818484620002ac565b505050565b5b818110156200031b576200030f600082620002dc565b600181019050620002f9565b5050565b601f8211156200036a576200033481620001de565b6200033f84620001f3565b810160208510156200034f578190505b620003676200035e85620001f3565b830182620002f8565b50505b505050565b600082821c905092915050565b60006200038f600019846008026200036f565b1980831691505092915050565b6000620003aa83836200037c565b9150826002028217905092915050565b620003c58262000140565b67ffffffffffffffff811115620003e157620003e06200014b565b5b620003ed8254620001a9565b620003fa8282856200031f565b600060209050601f8311600181146200043257600084156200041d578287015190505b6200042985826200039c565b86555062000499565b601f1984166200044286620001de565b60005b828110156200046c5784890151825560018201915060208501945060208101905062000445565b868310156200048c578489015162000488601f8916826200037c565b8355505b6001600288020188555050505b505050505050565b615d1480620004b16000396000f3fe60806040526004361061014b5760003560e01c80637e51b811116100b6578063cf2753cf1161006f578063cf2753cf146104a8578063ec9485df146104e6578063f40a214614610523578063f5714e641461054c578063f700dbd214610568578063f732b065146105915761014b565b80637e51b811146103965780638939e783146103bf5780638edb3f8b146103e85780639eab671114610404578063af9a90b21461042d578063b13d42421461046a5761014b565b806355dc4b221161010857806355dc4b2214610283578063570467ac146102ac5780635e269bfe146102e957806360deaa2a1461031257806361bc221a1461032e57806368ac3df3146103595761014b565b80630a4433e2146101505780631904bb2e1461017957806319b16c4c146101b657806331bcbcb3146101f45780633566cb951461021d578063455b855114610246575b600080fd5b34801561015c57600080fd5b50610177600480360381019061017291906123d4565b6105cf565b005b34801561018557600080fd5b506101a0600480360381019061019b9190612448565b61069e565b6040516101ad91906126bf565b60405180910390f35b3480156101c257600080fd5b506101dd60048036038101906101d89190612811565b61072e565b6040516101eb9291906128e8565b60405180910390f35b34801561020057600080fd5b5061021b60048036038101906102169190612918565b610c2d565b005b34801561022957600080fd5b50610244600480360381019061023f9190612987565b610eba565b005b34801561025257600080fd5b5061026d600480360381019061026891906129e3565b611022565b60405161027a9190612bea565b60405180910390f35b34801561028f57600080fd5b506102aa60048036038101906102a59190612c0c565b6110b5565b005b3480156102b857600080fd5b506102d360048036038101906102ce9190612811565b6114a7565b6040516102e09190612e27565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190612e49565b61153d565b005b61032c60048036038101906103279190612ecc565b6115c8565b005b34801561033a57600080fd5b50610343611716565b6040516103509190612f15565b60405180910390f35b34801561036557600080fd5b50610380600480360381019061037b9190612f73565b61171c565b60405161038d9190613048565b60405180910390f35b3480156103a257600080fd5b506103bd60048036038101906103b89190612918565b6117b2565b005b3480156103cb57600080fd5b506103e660048036038101906103e19190612918565b61183a565b005b61040260048036038101906103fd9190612ecc565b6118c2565b005b34801561041057600080fd5b5061042b60048036038101906104269190613063565b611a57565b005b34801561043957600080fd5b50610454600480360381019061044f9190613138565b611ae2565b6040516104619190613048565b60405180910390f35b34801561047657600080fd5b50610491600480360381019061048c91906131da565b611b72565b60405161049f9291906134a3565b60405180910390f35b3480156104b457600080fd5b506104cf60048036038101906104ca91906129e3565b611c0a565b6040516104dd9291906128e8565b60405180910390f35b3480156104f257600080fd5b5061050d600480360381019061050891906129e3565b611ca2565b60405161051a9190612f15565b60405180910390f35b34801561052f57600080fd5b5061054a600480360381019061054591906134da565b611d2c565b005b61056660048036038101906105619190612ecc565b611f08565b005b34801561057457600080fd5b5061058f600480360381019061058a919061355d565b612062565b005b34801561059d57600080fd5b506105b860048036038101906105b39190613768565b61212e565b6040516105c6929190613a7f565b60405180910390f35b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895868487876040518563ffffffff1660e01b81526004016106129493929190613c18565b6020604051808303816000875af1158015610631573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106559190613c6d565b905080610697576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068e90613d1d565b60405180910390fd5b5050505050565b6106a66121cc565b61080073ffffffffffffffffffffffffffffffffffffffff1663223b3b7a836040518263ffffffff1660e01b81526004016106e19190613d3d565b600060405180830381865afa1580156106fe573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906107279190613f8e565b9050919050565b6000610738612240565b6000610800905060008686604051602401610754929190614010565b6040516020818303038152906040527f241774e6000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000856040516020016107e6919061407c565b60405160208183030381529060405280519060200120905060405160200161080d906140df565b6040516020818303038152906040528051906020012081036108f9576000808473ffffffffffffffffffffffffffffffffffffffff16846040516108519190614130565b600060405180830381855af49150503d806000811461088c576040519150601f19603f3d011682016040523d82523d6000602084013e610891565b606091505b5091509150816108d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cd906141b9565b60405180910390fd5b808060200190518101906108ea9190614245565b80975081985050505050610c22565b604051602001610908906142ed565b6040516020818303038152906040528051906020012081036109f4576000808473ffffffffffffffffffffffffffffffffffffffff168460405161094c9190614130565b600060405180830381855afa9150503d8060008114610987576040519150601f19603f3d011682016040523d82523d6000602084013e61098c565b606091505b5091509150816109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c89061434e565b60405180910390fd5b808060200190518101906109e59190614245565b80975081985050505050610c21565b604051602001610a03906143ba565b604051602081830303815290604052805190602001208103610af1576000808473ffffffffffffffffffffffffffffffffffffffff1684604051610a479190614130565b6000604051808303816000865af19150503d8060008114610a84576040519150601f19603f3d011682016040523d82523d6000602084013e610a89565b606091505b509150915081610ace576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac59061441b565b60405180910390fd5b80806020019051810190610ae29190614245565b80975081985050505050610c20565b604051602001610b0090614487565b604051602081830303815290604052805190602001208103610be45760006040518060400160405280601a81526020017f64656c65676174696f6e28616464726573732c737472696e6729000000000000815250805190602001209050600060a490506060600060208b01516020808d0101516040518681528e6004820152604060248201526033604482015282606482015281608482015260c081878360008e5af281519c5060608201519450610100820160405280610bc057600080fd5b50505050604051806040016040528083815260200182815250975050505050610c1f565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c16906144e8565b60405180910390fd5b5b5b5b505050935093915050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610c6f939291906146b6565b6020604051808303816000875af1158015610c8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb29190613c6d565b905080610cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ceb90614740565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff163384604051602401610d20929190614760565b6040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610daa9190614130565b6000604051808303816000865af19150503d8060008114610de7576040519150601f19603f3d011682016040523d82523d6000602084013e610dec565b606091505b5050905080610e30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e27906147d5565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3386866040518463ffffffff1660e01b8152600401610e6f939291906147f5565b6020604051808303816000875af1158015610e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb29190613c6d565b505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610efc939291906146b6565b6020604051808303816000875af1158015610f1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3f9190613c6d565b905080610f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f789061487f565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3085856040518463ffffffff1660e01b8152600401610fc0939291906147f5565b6020604051808303816000875af1158015610fdf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110039190613c6d565b50600160008082825461101691906148ce565b92505081905550505050565b61102a61225a565b61080073ffffffffffffffffffffffffffffffffffffffff1663a03ffee184846040518363ffffffff1660e01b8152600401611067929190614010565b600060405180830381865afa158015611084573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110ad9190614b32565b905092915050565b6000610800905060008585856040516024016110d3939291906147f5565b6040516020818303038152906040527f3edab33c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600083604051602001611165919061407c565b60405160208183030381529060405280519060200120905060405160200161118c906140df565b6040516020818303038152906040528051906020012081036112595760008373ffffffffffffffffffffffffffffffffffffffff16836040516111cf9190614130565b600060405180830381855af49150503d806000811461120a576040519150601f19603f3d011682016040523d82523d6000602084013e61120f565b606091505b5050905080611253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124a906141b9565b60405180910390fd5b5061149e565b604051602001611268906142ed565b6040516020818303038152906040528051906020012081036113355760008373ffffffffffffffffffffffffffffffffffffffff16836040516112ab9190614130565b600060405180830381855afa9150503d80600081146112e6576040519150601f19603f3d011682016040523d82523d6000602084013e6112eb565b606091505b505090508061132f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113269061434e565b60405180910390fd5b5061149d565b604051602001611344906143ba565b6040516020818303038152906040528051906020012081036114135760008373ffffffffffffffffffffffffffffffffffffffff16836040516113879190614130565b6000604051808303816000865af19150503d80600081146113c4576040519150601f19603f3d011682016040523d82523d6000602084013e6113c9565b606091505b505090508061140d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114049061441b565b60405180910390fd5b5061149c565b60405160200161142290614487565b6040516020818303038152906040528051906020012081036114605760208201825160008082846000895af28061145857600080fd5b50505061149b565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611492906144e8565b60405180910390fd5b5b5b5b50505050505050565b6114af61227b565b61080073ffffffffffffffffffffffffffffffffffffffff16637d9f939c8585856040518463ffffffff1660e01b81526004016114ee93929190614b7b565b600060405180830381865afa15801561150b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906115349190614de3565b90509392505050565b61080073ffffffffffffffffffffffffffffffffffffffff166312d58dfe858585856040518563ffffffff1660e01b815260040161157e9493929190614e2c565b6020604051808303816000875af115801561159d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c19190613c6d565b5050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895303460016040518463ffffffff1660e01b815260040161160a939291906146b6565b6020604051808303816000875af1158015611629573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164d9190613c6d565b90508061168f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168690614ec4565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b81526004016116ce939291906147f5565b6020604051808303816000875af11580156116ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117119190613c6d565b505050565b60005481565b600061080073ffffffffffffffffffffffffffffffffffffffff1663f7cd55168888888888886040518763ffffffff1660e01b815260040161176396959493929190615019565b6020604051808303816000875af1158015611782573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a69190613c6d565b90509695505050505050565b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c8484846040518463ffffffff1660e01b81526004016117f1939291906147f5565b6020604051808303816000875af1158015611810573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118349190615089565b50505050565b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb8484846040518463ffffffff1660e01b8152600401611879939291906147f5565b6020604051808303816000875af1158015611898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bc9190613c6d565b50505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b8152600401611904939291906146b6565b6020604051808303816000875af1158015611923573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119479190613c6d565b905080611989576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198090614ec4565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b81526004016119c8939291906147f5565b6020604051808303816000875af11580156119e7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0b9190613c6d565b503373ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611a52573d6000803e3d6000fd5b505050565b61080073ffffffffffffffffffffffffffffffffffffffff166354b826f5858585856040518563ffffffff1660e01b8152600401611a9894939291906150b6565b6020604051808303816000875af1158015611ab7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611adb9190615089565b5050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663a50f05ac868686866040518563ffffffff1660e01b8152600401611b259493929190615118565b6020604051808303816000875af1158015611b44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b689190613c6d565b9050949350505050565b6060611b7c6122a3565b61080073ffffffffffffffffffffffffffffffffffffffff1663186b216785856040518363ffffffff1660e01b8152600401611bb99291906152c2565b600060405180830381865afa158015611bd6573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611bff91906154b6565b915091509250929050565b6000611c14612240565b61080073ffffffffffffffffffffffffffffffffffffffff1663241774e685856040518363ffffffff1660e01b8152600401611c51929190614010565b600060405180830381865afa158015611c6e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611c979190614245565b915091509250929050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663fc08930c8433856040518463ffffffff1660e01b8152600401611ce39392919061552e565b602060405180830381865afa158015611d00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d24919061556c565b905092915050565b6000600167ffffffffffffffff811115611d4957611d486126e6565b5b604051908082528060200260200182016040528015611d7c57816020015b6060815260200190600190039081611d675790505b509050604051806060016040528060258152602001615cba6025913981600081518110611dac57611dab615599565b5b6020026020010181905250600061080073ffffffffffffffffffffffffffffffffffffffff1663b60398958787856040518463ffffffff1660e01b8152600401611df893929190615679565b6020604051808303816000875af1158015611e17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3b9190613c6d565b905080611e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7490615729565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c3285876040518463ffffffff1660e01b8152600401611ebc939291906147f5565b6020604051808303816000875af1158015611edb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eff9190615089565b50505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b8152600401611f4a939291906146b6565b6020604051808303816000875af1158015611f69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8d9190613c6d565b905080611fcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc690614ec4565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084600134611ffc91906148ce565b6040518463ffffffff1660e01b815260040161201a939291906147f5565b6020604051808303816000875af1158015612039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205d9190613c6d565b505050565b600061080073ffffffffffffffffffffffffffffffffffffffff166361dc5c3b8585856040518463ffffffff1660e01b81526004016120a393929190615749565b6020604051808303816000875af11580156120c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e69190613c6d565b905080612128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211f906157ed565b60405180910390fd5b50505050565b60606121386122a3565b61080073ffffffffffffffffffffffffffffffffffffffff166310a2851c878787876040518563ffffffff1660e01b81526004016121799493929190615883565b600060405180830381865afa158015612196573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906121bf9190615c41565b9150915094509492505050565b60405180610160016040528060608152602001606081526020016000151581526020016000600381111561220357612202612520565b5b8152602001600081526020016000815260200160608152602001600060070b8152602001600060070b815260200160008152602001600081525090565b604051806040016040528060608152602001600081525090565b60405180606001604052806060815260200160608152602001606081525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612306826122db565b9050919050565b612316816122fb565b811461232157600080fd5b50565b6000813590506123338161230d565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261235e5761235d612339565b5b8235905067ffffffffffffffff81111561237b5761237a61233e565b5b60208301915083602082028301111561239757612396612343565b5b9250929050565b6000819050919050565b6123b18161239e565b81146123bc57600080fd5b50565b6000813590506123ce816123a8565b92915050565b600080600080606085870312156123ee576123ed6122d1565b5b60006123fc87828801612324565b945050602085013567ffffffffffffffff81111561241d5761241c6122d6565b5b61242987828801612348565b9350935050604061243c878288016123bf565b91505092959194509250565b60006020828403121561245e5761245d6122d1565b5b600061246c84828501612324565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156124af578082015181840152602081019050612494565b60008484015250505050565b6000601f19601f8301169050919050565b60006124d782612475565b6124e18185612480565b93506124f1818560208601612491565b6124fa816124bb565b840191505092915050565b60008115159050919050565b61251a81612505565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106125605761255f612520565b5b50565b60008190506125718261254f565b919050565b600061258182612563565b9050919050565b61259181612576565b82525050565b6125a08161239e565b82525050565b60008160070b9050919050565b6125bc816125a6565b82525050565b60006101608301600083015184820360008601526125e082826124cc565b915050602083015184820360208601526125fa82826124cc565b915050604083015161260f6040860182612511565b5060608301516126226060860182612588565b5060808301516126356080860182612597565b5060a083015161264860a0860182612597565b5060c083015184820360c086015261266082826124cc565b91505060e083015161267560e08601826125b3565b5061010083015161268a6101008601826125b3565b5061012083015161269f610120860182612597565b506101408301516126b4610140860182612597565b508091505092915050565b600060208201905081810360008301526126d981846125c2565b905092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61271e826124bb565b810181811067ffffffffffffffff8211171561273d5761273c6126e6565b5b80604052505050565b60006127506122c7565b905061275c8282612715565b919050565b600067ffffffffffffffff82111561277c5761277b6126e6565b5b612785826124bb565b9050602081019050919050565b82818337600083830152505050565b60006127b46127af84612761565b612746565b9050828152602081018484840111156127d0576127cf6126e1565b5b6127db848285612792565b509392505050565b600082601f8301126127f8576127f7612339565b5b81356128088482602086016127a1565b91505092915050565b60008060006060848603121561282a576128296122d1565b5b600061283886828701612324565b935050602084013567ffffffffffffffff811115612859576128586122d6565b5b612865868287016127e3565b925050604084013567ffffffffffffffff811115612886576128856122d6565b5b612892868287016127e3565b9150509250925092565b6128a58161239e565b82525050565b600060408301600083015184820360008601526128c882826124cc565b91505060208301516128dd6020860182612597565b508091505092915050565b60006040820190506128fd600083018561289c565b818103602083015261290f81846128ab565b90509392505050565b600080600060608486031215612931576129306122d1565b5b600061293f86828701612324565b935050602084013567ffffffffffffffff8111156129605761295f6122d6565b5b61296c868287016127e3565b925050604061297d868287016123bf565b9150509250925092565b6000806040838503121561299e5761299d6122d1565b5b600083013567ffffffffffffffff8111156129bc576129bb6122d6565b5b6129c8858286016127e3565b92505060206129d9858286016123bf565b9150509250929050565b600080604083850312156129fa576129f96122d1565b5b6000612a0885828601612324565b925050602083013567ffffffffffffffff811115612a2957612a286122d6565b5b612a35858286016127e3565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600067ffffffffffffffff82169050919050565b612a8881612a6b565b82525050565b60c082016000820151612aa460008501826125b3565b506020820151612ab760208501826125b3565b506040820151612aca6040850182612597565b506060820151612add6060850182612597565b506080820151612af06080850182612a7f565b5060a0820151612b0360a08501826125b3565b50505050565b6000612b158383612a8e565b60c08301905092915050565b6000602082019050919050565b6000612b3982612a3f565b612b438185612a4a565b9350612b4e83612a5b565b8060005b83811015612b7f578151612b668882612b09565b9750612b7183612b21565b925050600181019050612b52565b5085935050505092915050565b60006060830160008301518482036000860152612ba982826124cc565b91505060208301518482036020860152612bc382826124cc565b91505060408301518482036040860152612bdd8282612b2e565b9150508091505092915050565b60006020820190508181036000830152612c048184612b8c565b905092915050565b60008060008060808587031215612c2657612c256122d1565b5b6000612c3487828801612324565b945050602085013567ffffffffffffffff811115612c5557612c546122d6565b5b612c61878288016127e3565b9350506040612c72878288016123bf565b925050606085013567ffffffffffffffff811115612c9357612c926122d6565b5b612c9f878288016127e3565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b608082016000820151612ced60008501826125b3565b506020820151612d0060208501826125b3565b506040820151612d136040850182612597565b506060820151612d266060850182612597565b50505050565b6000612d388383612cd7565b60808301905092915050565b6000602082019050919050565b6000612d5c82612cab565b612d668185612cb6565b9350612d7183612cc7565b8060005b83811015612da2578151612d898882612d2c565b9750612d9483612d44565b925050600181019050612d75565b5085935050505092915050565b60006080830160008301518482036000860152612dcc82826124cc565b91505060208301518482036020860152612de682826124cc565b91505060408301518482036040860152612e0082826124cc565b91505060608301518482036060860152612e1a8282612d51565b9150508091505092915050565b60006020820190508181036000830152612e418184612daf565b905092915050565b60008060008060808587031215612e6357612e626122d1565b5b6000612e7187828801612324565b945050602085013567ffffffffffffffff811115612e9257612e916122d6565b5b612e9e878288016127e3565b9350506040612eaf878288016123bf565b9250506060612ec0878288016123bf565b91505092959194509250565b600060208284031215612ee257612ee16122d1565b5b600082013567ffffffffffffffff811115612f0057612eff6122d6565b5b612f0c848285016127e3565b91505092915050565b6000602082019050612f2a600083018461289c565b92915050565b600080fd5b600060a08284031215612f4b57612f4a612f30565b5b81905092915050565b600060608284031215612f6a57612f69612f30565b5b81905092915050565b6000806000806000806101008789031215612f9157612f906122d1565b5b600087013567ffffffffffffffff811115612faf57612fae6122d6565b5b612fbb89828a01612f35565b9650506020612fcc89828a01612f54565b9550506080612fdd89828a016123bf565b94505060a0612fee89828a01612324565b93505060c087013567ffffffffffffffff81111561300f5761300e6122d6565b5b61301b89828a016127e3565b92505060e061302c89828a016123bf565b9150509295509295509295565b61304281612505565b82525050565b600060208201905061305d6000830184613039565b92915050565b6000806000806080858703121561307d5761307c6122d1565b5b600061308b87828801612324565b945050602085013567ffffffffffffffff8111156130ac576130ab6122d6565b5b6130b8878288016127e3565b935050604085013567ffffffffffffffff8111156130d9576130d86122d6565b5b6130e5878288016127e3565b92505060606130f6878288016123bf565b91505092959194509250565b6000819050919050565b61311581613102565b811461312057600080fd5b50565b6000813590506131328161310c565b92915050565b60008060008060808587031215613152576131516122d1565b5b600085013567ffffffffffffffff8111156131705761316f6122d6565b5b61317c87828801612f35565b945050602061318d87828801612324565b935050604061319e87828801613123565b92505060606131af87828801613123565b91505092959194509250565b600060a082840312156131d1576131d0612f30565b5b81905092915050565b600080604083850312156131f1576131f06122d1565b5b600083013567ffffffffffffffff81111561320f5761320e6122d6565b5b61321b858286016127e3565b925050602083013567ffffffffffffffff81111561323c5761323b6122d6565b5b613248858286016131bb565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061016083016000830151848203600086015261329c82826124cc565b915050602083015184820360208601526132b682826124cc565b91505060408301516132cb6040860182612511565b5060608301516132de6060860182612588565b5060808301516132f16080860182612597565b5060a083015161330460a0860182612597565b5060c083015184820360c086015261331c82826124cc565b91505060e083015161333160e08601826125b3565b506101008301516133466101008601826125b3565b5061012083015161335b610120860182612597565b50610140830151613370610140860182612597565b508091505092915050565b6000613387838361327e565b905092915050565b6000602082019050919050565b60006133a782613252565b6133b1818561325d565b9350836020820285016133c38561326e565b8060005b858110156133ff57848403895281516133e0858261337b565b94506133eb8361338f565b925060208a019950506001810190506133c7565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b600061343882613411565b613442818561341c565b9350613452818560208601612491565b61345b816124bb565b840191505092915050565b60006040830160008301518482036000860152613483828261342d565b91505060208301516134986020860182612a7f565b508091505092915050565b600060408201905081810360008301526134bd818561339c565b905081810360208301526134d18184613466565b90509392505050565b600080600080608085870312156134f4576134f36122d1565b5b600061350287828801612324565b9450506020613513878288016123bf565b9350506040613524878288016123bf565b925050606085013567ffffffffffffffff811115613545576135446122d6565b5b613551878288016127e3565b91505092959194509250565b600080600060408486031215613576576135756122d1565b5b600061358486828701612324565b935050602084013567ffffffffffffffff8111156135a5576135a46122d6565b5b6135b186828701612348565b92509250509250925092565b600080fd5b600080fd5b600067ffffffffffffffff8211156135e2576135e16126e6565b5b6135eb826124bb565b9050602081019050919050565b600061360b613606846135c7565b612746565b905082815260208101848484011115613627576136266126e1565b5b613632848285612792565b509392505050565b600082601f83011261364f5761364e612339565b5b813561365f8482602086016135f8565b91505092915050565b61367181612a6b565b811461367c57600080fd5b50565b60008135905061368e81613668565b92915050565b61369d81612505565b81146136a857600080fd5b50565b6000813590506136ba81613694565b92915050565b600060a082840312156136d6576136d56135bd565b5b6136e060a0612746565b9050600082013567ffffffffffffffff811115613700576136ff6135c2565b5b61370c8482850161363a565b60008301525060206137208482850161367f565b60208301525060406137348482850161367f565b6040830152506060613748848285016136ab565b606083015250608061375c848285016136ab565b60808301525092915050565b60008060008060808587031215613782576137816122d1565b5b600061379087828801612324565b945050602085013567ffffffffffffffff8111156137b1576137b06122d6565b5b6137bd878288016127e3565b935050604085013567ffffffffffffffff8111156137de576137dd6122d6565b5b6137ea878288016127e3565b925050606085013567ffffffffffffffff81111561380b5761380a6122d6565b5b613817878288016136c0565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000608083016000830151848203600086015261386c82826124cc565b9150506020830151848203602086015261388682826124cc565b915050604083015184820360408601526138a082826124cc565b915050606083015184820360608601526138ba8282612d51565b9150508091505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60a0820160008201516139096000850182612cd7565b50602082015161391c6080850182612597565b50505050565b600061392e83836138f3565b60a08301905092915050565b6000602082019050919050565b6000613952826138c7565b61395c81856138d2565b9350613967836138e3565b8060005b8381101561399857815161397f8882613922565b975061398a8361393a565b92505060018101905061396b565b5085935050505092915050565b600060408301600083015184820360008601526139c2828261384f565b915050602083015184820360208601526139dc8282613947565b9150508091505092915050565b60006139f583836139a5565b905092915050565b6000602082019050919050565b6000613a1582613823565b613a1f818561382e565b935083602082028501613a318561383f565b8060005b85811015613a6d5784840389528151613a4e85826139e9565b9450613a59836139fd565b925060208a01995050600181019050613a35565b50829750879550505050505092915050565b60006040820190508181036000830152613a998185613a0a565b90508181036020830152613aad8184613466565b90509392505050565b613abf816122fb565b82525050565b600082825260208201905092915050565b6000819050919050565b6000613aec8385612480565b9350613af9838584612792565b613b02836124bb565b840190509392505050565b6000613b1a848484613ae0565b90509392505050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112613b4f57613b4e613b2d565b5b83810192508235915060208301925067ffffffffffffffff821115613b7757613b76613b23565b5b600182023603831315613b8d57613b8c613b28565b5b509250929050565b6000602082019050919050565b6000613bae8385613ac5565b935083602084028501613bc084613ad6565b8060005b87811015613c06578484038952613bdb8284613b32565b613be6868284613b0d565b9550613bf184613b95565b935060208b019a505050600181019050613bc4565b50829750879450505050509392505050565b6000606082019050613c2d6000830187613ab6565b613c3a602083018661289c565b8181036040830152613c4d818486613ba2565b905095945050505050565b600081519050613c6781613694565b92915050565b600060208284031215613c8357613c826122d1565b5b6000613c9184828501613c58565b91505092915050565b600082825260208201905092915050565b7f4661696c656420746f20617070726f7665207374616b696e67206d6574686f6460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d07602183613c9a565b9150613d1282613cab565b604082019050919050565b60006020820190508181036000830152613d3681613cfa565b9050919050565b6000602082019050613d526000830184613ab6565b92915050565b6000613d6b613d6684612761565b612746565b905082815260208101848484011115613d8757613d866126e1565b5b613d92848285612491565b509392505050565b600082601f830112613daf57613dae612339565b5b8151613dbf848260208601613d58565b91505092915050565b60048110613dd557600080fd5b50565b600081519050613de781613dc8565b92915050565b600081519050613dfc816123a8565b92915050565b613e0b816125a6565b8114613e1657600080fd5b50565b600081519050613e2881613e02565b92915050565b60006101608284031215613e4557613e446135bd565b5b613e50610160612746565b9050600082015167ffffffffffffffff811115613e7057613e6f6135c2565b5b613e7c84828501613d9a565b600083015250602082015167ffffffffffffffff811115613ea057613e9f6135c2565b5b613eac84828501613d9a565b6020830152506040613ec084828501613c58565b6040830152506060613ed484828501613dd8565b6060830152506080613ee884828501613ded565b60808301525060a0613efc84828501613ded565b60a08301525060c082015167ffffffffffffffff811115613f2057613f1f6135c2565b5b613f2c84828501613d9a565b60c08301525060e0613f4084828501613e19565b60e083015250610100613f5584828501613e19565b61010083015250610120613f6b84828501613ded565b61012083015250610140613f8184828501613ded565b6101408301525092915050565b600060208284031215613fa457613fa36122d1565b5b600082015167ffffffffffffffff811115613fc257613fc16122d6565b5b613fce84828501613e2e565b91505092915050565b6000613fe282612475565b613fec8185613c9a565b9350613ffc818560208601612491565b614005816124bb565b840191505092915050565b60006040820190506140256000830185613ab6565b81810360208301526140378184613fd7565b90509392505050565b600081905092915050565b600061405682612475565b6140608185614040565b9350614070818560208601612491565b80840191505092915050565b6000614088828461404b565b915081905092915050565b7f64656c656761746563616c6c0000000000000000000000000000000000000000600082015250565b60006140c9600c83614040565b91506140d482614093565b600c82019050919050565b60006140ea826140bc565b9150819050919050565b600081905092915050565b600061410a82613411565b61411481856140f4565b9350614124818560208601612491565b80840191505092915050565b600061413c82846140ff565b915081905092915050565b7f6661696c65642064656c656761746563616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b60006141a3602183613c9a565b91506141ae82614147565b604082019050919050565b600060208201905081810360008301526141d281614196565b9050919050565b6000604082840312156141ef576141ee6135bd565b5b6141f96040612746565b9050600082015167ffffffffffffffff811115614219576142186135c2565b5b61422584828501613d9a565b600083015250602061423984828501613ded565b60208301525092915050565b6000806040838503121561425c5761425b6122d1565b5b600061426a85828601613ded565b925050602083015167ffffffffffffffff81111561428b5761428a6122d6565b5b614297858286016141d9565b9150509250929050565b7f73746174696363616c6c00000000000000000000000000000000000000000000600082015250565b60006142d7600a83614040565b91506142e2826142a1565b600a82019050919050565b60006142f8826142ca565b9150819050919050565b7f6661696c65642073746174696363616c6c20746f20707265636f6d70696c6500600082015250565b6000614338601f83613c9a565b915061434382614302565b602082019050919050565b600060208201905081810360008301526143678161432b565b9050919050565b7f63616c6c00000000000000000000000000000000000000000000000000000000600082015250565b60006143a4600483614040565b91506143af8261436e565b600482019050919050565b60006143c582614397565b9150819050919050565b7f6661696c65642063616c6c20746f20707265636f6d70696c6500000000000000600082015250565b6000614405601983613c9a565b9150614410826143cf565b602082019050919050565b60006020820190508181036000830152614434816143f8565b9050919050565b7f63616c6c636f6465000000000000000000000000000000000000000000000000600082015250565b6000614471600883614040565b915061447c8261443b565b600882019050919050565b600061449282614464565b9150819050919050565b7f696e76616c69642063616c6c7479706500000000000000000000000000000000600082015250565b60006144d2601083613c9a565b91506144dd8261449c565b602082019050919050565b60006020820190508181036000830152614501816144c5565b9050919050565b600081549050919050565b60008190508160005260206000209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061456f57607f821691505b60208210810361458257614581614528565b5b50919050565b60008190508160005260206000209050919050565b600081546145aa81614557565b6145b48186612480565b945060018216600081146145cf57600181146145e557614618565b60ff198316865281151560200286019350614618565b6145ee85614588565b60005b83811015614610578154818901526001820191506020810190506145f1565b808801955050505b50505092915050565b600061462d838361459d565b905092915050565b6000600182019050919050565b600061464d82614508565b6146578185613ac5565b93508360208202850161466985614513565b8060005b858110156146a4578484038952816146858582614621565b945061469083614635565b925060208a0199505060018101905061466d565b50829750879550505050505092915050565b60006060820190506146cb6000830186613ab6565b6146d8602083018561289c565b81810360408301526146ea8184614642565b9050949350505050565b7f64656c65676174696f6e20617070726f76616c206661696c6564000000000000600082015250565b600061472a601a83613c9a565b9150614735826146f4565b602082019050919050565b600060208201905081810360008301526147598161471d565b9050919050565b60006040820190506147756000830185613ab6565b614782602083018461289c565b9392505050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b60006147bf600f83613c9a565b91506147ca82614789565b602082019050919050565b600060208201905081810360008301526147ee816147b2565b9050919050565b600060608201905061480a6000830186613ab6565b818103602083015261481c8185613fd7565b905061482b604083018461289c565b949350505050565b7f5374616b696e6720417070726f7665206661696c656400000000000000000000600082015250565b6000614869601683613c9a565b915061487482614833565b602082019050919050565b600060208201905081810360008301526148988161485c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006148d98261239e565b91506148e48361239e565b92508282019050808211156148fc576148fb61489f565b5b92915050565b600067ffffffffffffffff82111561491d5761491c6126e6565b5b602082029050602081019050919050565b60008151905061493d81613668565b92915050565b600060c08284031215614959576149586135bd565b5b61496360c0612746565b9050600061497384828501613e19565b600083015250602061498784828501613e19565b602083015250604061499b84828501613ded565b60408301525060606149af84828501613ded565b60608301525060806149c38482850161492e565b60808301525060a06149d784828501613e19565b60a08301525092915050565b60006149f66149f184614902565b612746565b90508083825260208201905060c08402830185811115614a1957614a18612343565b5b835b81811015614a425780614a2e8882614943565b84526020840193505060c081019050614a1b565b5050509392505050565b600082601f830112614a6157614a60612339565b5b8151614a718482602086016149e3565b91505092915050565b600060608284031215614a9057614a8f6135bd565b5b614a9a6060612746565b9050600082015167ffffffffffffffff811115614aba57614ab96135c2565b5b614ac684828501613d9a565b600083015250602082015167ffffffffffffffff811115614aea57614ae96135c2565b5b614af684828501613d9a565b602083015250604082015167ffffffffffffffff811115614b1a57614b196135c2565b5b614b2684828501614a4c565b60408301525092915050565b600060208284031215614b4857614b476122d1565b5b600082015167ffffffffffffffff811115614b6657614b656122d6565b5b614b7284828501614a7a565b91505092915050565b6000606082019050614b906000830186613ab6565b8181036020830152614ba28185613fd7565b90508181036040830152614bb68184613fd7565b9050949350505050565b600067ffffffffffffffff821115614bdb57614bda6126e6565b5b602082029050602081019050919050565b600060808284031215614c0257614c016135bd565b5b614c0c6080612746565b90506000614c1c84828501613e19565b6000830152506020614c3084828501613e19565b6020830152506040614c4484828501613ded565b6040830152506060614c5884828501613ded565b60608301525092915050565b6000614c77614c7284614bc0565b612746565b90508083825260208201905060808402830185811115614c9a57614c99612343565b5b835b81811015614cc35780614caf8882614bec565b845260208401935050608081019050614c9c565b5050509392505050565b600082601f830112614ce257614ce1612339565b5b8151614cf2848260208601614c64565b91505092915050565b600060808284031215614d1157614d106135bd565b5b614d1b6080612746565b9050600082015167ffffffffffffffff811115614d3b57614d3a6135c2565b5b614d4784828501613d9a565b600083015250602082015167ffffffffffffffff811115614d6b57614d6a6135c2565b5b614d7784828501613d9a565b602083015250604082015167ffffffffffffffff811115614d9b57614d9a6135c2565b5b614da784828501613d9a565b604083015250606082015167ffffffffffffffff811115614dcb57614dca6135c2565b5b614dd784828501614ccd565b60608301525092915050565b600060208284031215614df957614df86122d1565b5b600082015167ffffffffffffffff811115614e1757614e166122d6565b5b614e2384828501614cfb565b91505092915050565b6000608082019050614e416000830187613ab6565b8181036020830152614e538186613fd7565b9050614e62604083018561289c565b614e6f606083018461289c565b95945050505050565b7f44656c656761746520417070726f7665206661696c6564000000000000000000600082015250565b6000614eae601783613c9a565b9150614eb982614e78565b602082019050919050565b60006020820190508181036000830152614edd81614ea1565b9050919050565b600060a08301614ef76000840184613b32565b8583036000870152614f0a838284613ae0565b92505050614f1b6020840184613b32565b8583036020870152614f2e838284613ae0565b92505050614f3f6040840184613b32565b8583036040870152614f52838284613ae0565b92505050614f636060840184613b32565b8583036060870152614f76838284613ae0565b92505050614f876080840184613b32565b8583036080870152614f9a838284613ae0565b925050508091505092915050565b6000614fb760208401846123bf565b905092915050565b60608201614fd06000830183614fa8565b614fdd6000850182612597565b50614feb6020830183614fa8565b614ff86020850182612597565b506150066040830183614fa8565b6150136040850182612597565b50505050565b60006101008201905081810360008301526150348189614ee4565b90506150436020830188614fbf565b615050608083018761289c565b61505d60a0830186613ab6565b81810360c083015261506f8185613fd7565b905061507e60e083018461289c565b979650505050505050565b60006020828403121561509f5761509e6122d1565b5b60006150ad84828501613e19565b91505092915050565b60006080820190506150cb6000830187613ab6565b81810360208301526150dd8186613fd7565b905081810360408301526150f18185613fd7565b9050615100606083018461289c565b95945050505050565b61511281613102565b82525050565b600060808201905081810360008301526151328187614ee4565b90506151416020830186613ab6565b61514e6040830185615109565b61515b6060830184615109565b95945050505050565b6000808335600160200384360303811261518157615180613b2d565b5b83810192508235915060208301925067ffffffffffffffff8211156151a9576151a8613b23565b5b6001820236038313156151bf576151be613b28565b5b509250929050565b60006151d3838561341c565b93506151e0838584612792565b6151e9836124bb565b840190509392505050565b6000615203602084018461367f565b905092915050565b600061521a60208401846136ab565b905092915050565b600060a083016152356000840184615164565b85830360008701526152488382846151c7565b9250505061525960208401846151f4565b6152666020860182612a7f565b5061527460408401846151f4565b6152816040860182612a7f565b5061528f606084018461520b565b61529c6060860182612511565b506152aa608084018461520b565b6152b76080860182612511565b508091505092915050565b600060408201905081810360008301526152dc8185613fd7565b905081810360208301526152f08184615222565b90509392505050565b600067ffffffffffffffff821115615314576153136126e6565b5b602082029050602081019050919050565b6000615338615333846152f9565b612746565b9050808382526020820190506020840283018581111561535b5761535a612343565b5b835b818110156153a257805167ffffffffffffffff8111156153805761537f612339565b5b80860161538d8982613e2e565b8552602085019450505060208101905061535d565b5050509392505050565b600082601f8301126153c1576153c0612339565b5b81516153d1848260208601615325565b91505092915050565b60006153ed6153e8846135c7565b612746565b905082815260208101848484011115615409576154086126e1565b5b615414848285612491565b509392505050565b600082601f83011261543157615430612339565b5b81516154418482602086016153da565b91505092915050565b6000604082840312156154605761545f6135bd565b5b61546a6040612746565b9050600082015167ffffffffffffffff81111561548a576154896135c2565b5b6154968482850161541c565b60008301525060206154aa8482850161492e565b60208301525092915050565b600080604083850312156154cd576154cc6122d1565b5b600083015167ffffffffffffffff8111156154eb576154ea6122d6565b5b6154f7858286016153ac565b925050602083015167ffffffffffffffff811115615518576155176122d6565b5b6155248582860161544a565b9150509250929050565b60006060820190506155436000830186613ab6565b6155506020830185613ab6565b81810360408301526155628184613fd7565b9050949350505050565b600060208284031215615582576155816122d1565b5b600061559084828501613ded565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b6000819050602082019050919050565b60006155ef83836124cc565b905092915050565b6000602082019050919050565b600061560f826155c8565b6156198185613ac5565b93508360208202850161562b856155d3565b8060005b85811015615667578484038952815161564885826155e3565b9450615653836155f7565b925060208a0199505060018101905061562f565b50829750879550505050505092915050565b600060608201905061568e6000830186613ab6565b61569b602083018561289c565b81810360408301526156ad8184615604565b9050949350505050565b7f6661696c656420746f20617070726f766520756e64656c65676174696f6e206d60008201527f6574686f64000000000000000000000000000000000000000000000000000000602082015250565b6000615713602583613c9a565b915061571e826156b7565b604082019050919050565b6000602082019050818103600083015261574281615706565b9050919050565b600060408201905061575e6000830186613ab6565b8181036020830152615771818486613ba2565b9050949350505050565b7f4661696c656420746f207265766f6b6520617070726f76616c20666f7220737460008201527f616b696e67206d6574686f647300000000000000000000000000000000000000602082015250565b60006157d7602d83613c9a565b91506157e28261577b565b604082019050919050565b60006020820190508181036000830152615806816157ca565b9050919050565b600060a083016000830151848203600086015261582a828261342d565b915050602083015161583f6020860182612a7f565b5060408301516158526040860182612a7f565b5060608301516158656060860182612511565b5060808301516158786080860182612511565b508091505092915050565b60006080820190506158986000830187613ab6565b81810360208301526158aa8186613fd7565b905081810360408301526158be8185613fd7565b905081810360608301526158d2818461580d565b905095945050505050565b600067ffffffffffffffff8211156158f8576158f76126e6565b5b602082029050602081019050919050565b60006080828403121561591f5761591e6135bd565b5b6159296080612746565b9050600082015167ffffffffffffffff811115615949576159486135c2565b5b61595584828501613d9a565b600083015250602082015167ffffffffffffffff811115615979576159786135c2565b5b61598584828501613d9a565b602083015250604082015167ffffffffffffffff8111156159a9576159a86135c2565b5b6159b584828501613d9a565b604083015250606082015167ffffffffffffffff8111156159d9576159d86135c2565b5b6159e584828501614ccd565b60608301525092915050565b600067ffffffffffffffff821115615a0c57615a0b6126e6565b5b602082029050602081019050919050565b600060a08284031215615a3357615a326135bd565b5b615a3d6040612746565b90506000615a4d84828501614bec565b6000830152506080615a6184828501613ded565b60208301525092915050565b6000615a80615a7b846159f1565b612746565b90508083825260208201905060a08402830185811115615aa357615aa2612343565b5b835b81811015615acc5780615ab88882615a1d565b84526020840193505060a081019050615aa5565b5050509392505050565b600082601f830112615aeb57615aea612339565b5b8151615afb848260208601615a6d565b91505092915050565b600060408284031215615b1a57615b196135bd565b5b615b246040612746565b9050600082015167ffffffffffffffff811115615b4457615b436135c2565b5b615b5084828501615909565b600083015250602082015167ffffffffffffffff811115615b7457615b736135c2565b5b615b8084828501615ad6565b60208301525092915050565b6000615b9f615b9a846158dd565b612746565b90508083825260208201905060208402830185811115615bc257615bc1612343565b5b835b81811015615c0957805167ffffffffffffffff811115615be757615be6612339565b5b808601615bf48982615b04565b85526020850194505050602081019050615bc4565b5050509392505050565b600082601f830112615c2857615c27612339565b5b8151615c38848260208601615b8c565b91505092915050565b60008060408385031215615c5857615c576122d1565b5b600083015167ffffffffffffffff811115615c7657615c756122d6565b5b615c8285828601615c13565b925050602083015167ffffffffffffffff811115615ca357615ca26122d6565b5b615caf8582860161544a565b915050925092905056fe2f636f736d6f732e7374616b696e672e763162657461312e4d7367556e64656c6567617465a2646970667358221220869745a83df35e33e4ef5e71f87905ee5baef43e403b5c8fe7ef7c045634645564736f6c634300081300332f636f736d6f732e7374616b696e672e763162657461312e4d736744656c6567617465", - "deployedBytecode": "0x60806040526004361061014b5760003560e01c80637e51b811116100b6578063cf2753cf1161006f578063cf2753cf146104a8578063ec9485df146104e6578063f40a214614610523578063f5714e641461054c578063f700dbd214610568578063f732b065146105915761014b565b80637e51b811146103965780638939e783146103bf5780638edb3f8b146103e85780639eab671114610404578063af9a90b21461042d578063b13d42421461046a5761014b565b806355dc4b221161010857806355dc4b2214610283578063570467ac146102ac5780635e269bfe146102e957806360deaa2a1461031257806361bc221a1461032e57806368ac3df3146103595761014b565b80630a4433e2146101505780631904bb2e1461017957806319b16c4c146101b657806331bcbcb3146101f45780633566cb951461021d578063455b855114610246575b600080fd5b34801561015c57600080fd5b50610177600480360381019061017291906123d4565b6105cf565b005b34801561018557600080fd5b506101a0600480360381019061019b9190612448565b61069e565b6040516101ad91906126bf565b60405180910390f35b3480156101c257600080fd5b506101dd60048036038101906101d89190612811565b61072e565b6040516101eb9291906128e8565b60405180910390f35b34801561020057600080fd5b5061021b60048036038101906102169190612918565b610c2d565b005b34801561022957600080fd5b50610244600480360381019061023f9190612987565b610eba565b005b34801561025257600080fd5b5061026d600480360381019061026891906129e3565b611022565b60405161027a9190612bea565b60405180910390f35b34801561028f57600080fd5b506102aa60048036038101906102a59190612c0c565b6110b5565b005b3480156102b857600080fd5b506102d360048036038101906102ce9190612811565b6114a7565b6040516102e09190612e27565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190612e49565b61153d565b005b61032c60048036038101906103279190612ecc565b6115c8565b005b34801561033a57600080fd5b50610343611716565b6040516103509190612f15565b60405180910390f35b34801561036557600080fd5b50610380600480360381019061037b9190612f73565b61171c565b60405161038d9190613048565b60405180910390f35b3480156103a257600080fd5b506103bd60048036038101906103b89190612918565b6117b2565b005b3480156103cb57600080fd5b506103e660048036038101906103e19190612918565b61183a565b005b61040260048036038101906103fd9190612ecc565b6118c2565b005b34801561041057600080fd5b5061042b60048036038101906104269190613063565b611a57565b005b34801561043957600080fd5b50610454600480360381019061044f9190613138565b611ae2565b6040516104619190613048565b60405180910390f35b34801561047657600080fd5b50610491600480360381019061048c91906131da565b611b72565b60405161049f9291906134a3565b60405180910390f35b3480156104b457600080fd5b506104cf60048036038101906104ca91906129e3565b611c0a565b6040516104dd9291906128e8565b60405180910390f35b3480156104f257600080fd5b5061050d600480360381019061050891906129e3565b611ca2565b60405161051a9190612f15565b60405180910390f35b34801561052f57600080fd5b5061054a600480360381019061054591906134da565b611d2c565b005b61056660048036038101906105619190612ecc565b611f08565b005b34801561057457600080fd5b5061058f600480360381019061058a919061355d565b612062565b005b34801561059d57600080fd5b506105b860048036038101906105b39190613768565b61212e565b6040516105c6929190613a7f565b60405180910390f35b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895868487876040518563ffffffff1660e01b81526004016106129493929190613c18565b6020604051808303816000875af1158015610631573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106559190613c6d565b905080610697576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068e90613d1d565b60405180910390fd5b5050505050565b6106a66121cc565b61080073ffffffffffffffffffffffffffffffffffffffff1663223b3b7a836040518263ffffffff1660e01b81526004016106e19190613d3d565b600060405180830381865afa1580156106fe573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906107279190613f8e565b9050919050565b6000610738612240565b6000610800905060008686604051602401610754929190614010565b6040516020818303038152906040527f241774e6000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000856040516020016107e6919061407c565b60405160208183030381529060405280519060200120905060405160200161080d906140df565b6040516020818303038152906040528051906020012081036108f9576000808473ffffffffffffffffffffffffffffffffffffffff16846040516108519190614130565b600060405180830381855af49150503d806000811461088c576040519150601f19603f3d011682016040523d82523d6000602084013e610891565b606091505b5091509150816108d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cd906141b9565b60405180910390fd5b808060200190518101906108ea9190614245565b80975081985050505050610c22565b604051602001610908906142ed565b6040516020818303038152906040528051906020012081036109f4576000808473ffffffffffffffffffffffffffffffffffffffff168460405161094c9190614130565b600060405180830381855afa9150503d8060008114610987576040519150601f19603f3d011682016040523d82523d6000602084013e61098c565b606091505b5091509150816109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c89061434e565b60405180910390fd5b808060200190518101906109e59190614245565b80975081985050505050610c21565b604051602001610a03906143ba565b604051602081830303815290604052805190602001208103610af1576000808473ffffffffffffffffffffffffffffffffffffffff1684604051610a479190614130565b6000604051808303816000865af19150503d8060008114610a84576040519150601f19603f3d011682016040523d82523d6000602084013e610a89565b606091505b509150915081610ace576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac59061441b565b60405180910390fd5b80806020019051810190610ae29190614245565b80975081985050505050610c20565b604051602001610b0090614487565b604051602081830303815290604052805190602001208103610be45760006040518060400160405280601a81526020017f64656c65676174696f6e28616464726573732c737472696e6729000000000000815250805190602001209050600060a490506060600060208b01516020808d0101516040518681528e6004820152604060248201526033604482015282606482015281608482015260c081878360008e5af281519c5060608201519450610100820160405280610bc057600080fd5b50505050604051806040016040528083815260200182815250975050505050610c1f565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c16906144e8565b60405180910390fd5b5b5b5b505050935093915050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610c6f939291906146b6565b6020604051808303816000875af1158015610c8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb29190613c6d565b905080610cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ceb90614740565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff163384604051602401610d20929190614760565b6040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610daa9190614130565b6000604051808303816000865af19150503d8060008114610de7576040519150601f19603f3d011682016040523d82523d6000602084013e610dec565b606091505b5050905080610e30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e27906147d5565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3386866040518463ffffffff1660e01b8152600401610e6f939291906147f5565b6020604051808303816000875af1158015610e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb29190613c6d565b505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610efc939291906146b6565b6020604051808303816000875af1158015610f1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3f9190613c6d565b905080610f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f789061487f565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3085856040518463ffffffff1660e01b8152600401610fc0939291906147f5565b6020604051808303816000875af1158015610fdf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110039190613c6d565b50600160008082825461101691906148ce565b92505081905550505050565b61102a61225a565b61080073ffffffffffffffffffffffffffffffffffffffff1663a03ffee184846040518363ffffffff1660e01b8152600401611067929190614010565b600060405180830381865afa158015611084573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110ad9190614b32565b905092915050565b6000610800905060008585856040516024016110d3939291906147f5565b6040516020818303038152906040527f3edab33c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600083604051602001611165919061407c565b60405160208183030381529060405280519060200120905060405160200161118c906140df565b6040516020818303038152906040528051906020012081036112595760008373ffffffffffffffffffffffffffffffffffffffff16836040516111cf9190614130565b600060405180830381855af49150503d806000811461120a576040519150601f19603f3d011682016040523d82523d6000602084013e61120f565b606091505b5050905080611253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124a906141b9565b60405180910390fd5b5061149e565b604051602001611268906142ed565b6040516020818303038152906040528051906020012081036113355760008373ffffffffffffffffffffffffffffffffffffffff16836040516112ab9190614130565b600060405180830381855afa9150503d80600081146112e6576040519150601f19603f3d011682016040523d82523d6000602084013e6112eb565b606091505b505090508061132f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113269061434e565b60405180910390fd5b5061149d565b604051602001611344906143ba565b6040516020818303038152906040528051906020012081036114135760008373ffffffffffffffffffffffffffffffffffffffff16836040516113879190614130565b6000604051808303816000865af19150503d80600081146113c4576040519150601f19603f3d011682016040523d82523d6000602084013e6113c9565b606091505b505090508061140d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114049061441b565b60405180910390fd5b5061149c565b60405160200161142290614487565b6040516020818303038152906040528051906020012081036114605760208201825160008082846000895af28061145857600080fd5b50505061149b565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611492906144e8565b60405180910390fd5b5b5b5b50505050505050565b6114af61227b565b61080073ffffffffffffffffffffffffffffffffffffffff16637d9f939c8585856040518463ffffffff1660e01b81526004016114ee93929190614b7b565b600060405180830381865afa15801561150b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906115349190614de3565b90509392505050565b61080073ffffffffffffffffffffffffffffffffffffffff166312d58dfe858585856040518563ffffffff1660e01b815260040161157e9493929190614e2c565b6020604051808303816000875af115801561159d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c19190613c6d565b5050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895303460016040518463ffffffff1660e01b815260040161160a939291906146b6565b6020604051808303816000875af1158015611629573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164d9190613c6d565b90508061168f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168690614ec4565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b81526004016116ce939291906147f5565b6020604051808303816000875af11580156116ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117119190613c6d565b505050565b60005481565b600061080073ffffffffffffffffffffffffffffffffffffffff1663f7cd55168888888888886040518763ffffffff1660e01b815260040161176396959493929190615019565b6020604051808303816000875af1158015611782573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a69190613c6d565b90509695505050505050565b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c8484846040518463ffffffff1660e01b81526004016117f1939291906147f5565b6020604051808303816000875af1158015611810573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118349190615089565b50505050565b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb8484846040518463ffffffff1660e01b8152600401611879939291906147f5565b6020604051808303816000875af1158015611898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bc9190613c6d565b50505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b8152600401611904939291906146b6565b6020604051808303816000875af1158015611923573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119479190613c6d565b905080611989576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198090614ec4565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b81526004016119c8939291906147f5565b6020604051808303816000875af11580156119e7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0b9190613c6d565b503373ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611a52573d6000803e3d6000fd5b505050565b61080073ffffffffffffffffffffffffffffffffffffffff166354b826f5858585856040518563ffffffff1660e01b8152600401611a9894939291906150b6565b6020604051808303816000875af1158015611ab7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611adb9190615089565b5050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663a50f05ac868686866040518563ffffffff1660e01b8152600401611b259493929190615118565b6020604051808303816000875af1158015611b44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b689190613c6d565b9050949350505050565b6060611b7c6122a3565b61080073ffffffffffffffffffffffffffffffffffffffff1663186b216785856040518363ffffffff1660e01b8152600401611bb99291906152c2565b600060405180830381865afa158015611bd6573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611bff91906154b6565b915091509250929050565b6000611c14612240565b61080073ffffffffffffffffffffffffffffffffffffffff1663241774e685856040518363ffffffff1660e01b8152600401611c51929190614010565b600060405180830381865afa158015611c6e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611c979190614245565b915091509250929050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663fc08930c8433856040518463ffffffff1660e01b8152600401611ce39392919061552e565b602060405180830381865afa158015611d00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d24919061556c565b905092915050565b6000600167ffffffffffffffff811115611d4957611d486126e6565b5b604051908082528060200260200182016040528015611d7c57816020015b6060815260200190600190039081611d675790505b509050604051806060016040528060258152602001615cba6025913981600081518110611dac57611dab615599565b5b6020026020010181905250600061080073ffffffffffffffffffffffffffffffffffffffff1663b60398958787856040518463ffffffff1660e01b8152600401611df893929190615679565b6020604051808303816000875af1158015611e17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3b9190613c6d565b905080611e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7490615729565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c3285876040518463ffffffff1660e01b8152600401611ebc939291906147f5565b6020604051808303816000875af1158015611edb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eff9190615089565b50505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b8152600401611f4a939291906146b6565b6020604051808303816000875af1158015611f69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8d9190613c6d565b905080611fcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc690614ec4565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084600134611ffc91906148ce565b6040518463ffffffff1660e01b815260040161201a939291906147f5565b6020604051808303816000875af1158015612039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205d9190613c6d565b505050565b600061080073ffffffffffffffffffffffffffffffffffffffff166361dc5c3b8585856040518463ffffffff1660e01b81526004016120a393929190615749565b6020604051808303816000875af11580156120c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e69190613c6d565b905080612128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211f906157ed565b60405180910390fd5b50505050565b60606121386122a3565b61080073ffffffffffffffffffffffffffffffffffffffff166310a2851c878787876040518563ffffffff1660e01b81526004016121799493929190615883565b600060405180830381865afa158015612196573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906121bf9190615c41565b9150915094509492505050565b60405180610160016040528060608152602001606081526020016000151581526020016000600381111561220357612202612520565b5b8152602001600081526020016000815260200160608152602001600060070b8152602001600060070b815260200160008152602001600081525090565b604051806040016040528060608152602001600081525090565b60405180606001604052806060815260200160608152602001606081525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612306826122db565b9050919050565b612316816122fb565b811461232157600080fd5b50565b6000813590506123338161230d565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261235e5761235d612339565b5b8235905067ffffffffffffffff81111561237b5761237a61233e565b5b60208301915083602082028301111561239757612396612343565b5b9250929050565b6000819050919050565b6123b18161239e565b81146123bc57600080fd5b50565b6000813590506123ce816123a8565b92915050565b600080600080606085870312156123ee576123ed6122d1565b5b60006123fc87828801612324565b945050602085013567ffffffffffffffff81111561241d5761241c6122d6565b5b61242987828801612348565b9350935050604061243c878288016123bf565b91505092959194509250565b60006020828403121561245e5761245d6122d1565b5b600061246c84828501612324565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156124af578082015181840152602081019050612494565b60008484015250505050565b6000601f19601f8301169050919050565b60006124d782612475565b6124e18185612480565b93506124f1818560208601612491565b6124fa816124bb565b840191505092915050565b60008115159050919050565b61251a81612505565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106125605761255f612520565b5b50565b60008190506125718261254f565b919050565b600061258182612563565b9050919050565b61259181612576565b82525050565b6125a08161239e565b82525050565b60008160070b9050919050565b6125bc816125a6565b82525050565b60006101608301600083015184820360008601526125e082826124cc565b915050602083015184820360208601526125fa82826124cc565b915050604083015161260f6040860182612511565b5060608301516126226060860182612588565b5060808301516126356080860182612597565b5060a083015161264860a0860182612597565b5060c083015184820360c086015261266082826124cc565b91505060e083015161267560e08601826125b3565b5061010083015161268a6101008601826125b3565b5061012083015161269f610120860182612597565b506101408301516126b4610140860182612597565b508091505092915050565b600060208201905081810360008301526126d981846125c2565b905092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61271e826124bb565b810181811067ffffffffffffffff8211171561273d5761273c6126e6565b5b80604052505050565b60006127506122c7565b905061275c8282612715565b919050565b600067ffffffffffffffff82111561277c5761277b6126e6565b5b612785826124bb565b9050602081019050919050565b82818337600083830152505050565b60006127b46127af84612761565b612746565b9050828152602081018484840111156127d0576127cf6126e1565b5b6127db848285612792565b509392505050565b600082601f8301126127f8576127f7612339565b5b81356128088482602086016127a1565b91505092915050565b60008060006060848603121561282a576128296122d1565b5b600061283886828701612324565b935050602084013567ffffffffffffffff811115612859576128586122d6565b5b612865868287016127e3565b925050604084013567ffffffffffffffff811115612886576128856122d6565b5b612892868287016127e3565b9150509250925092565b6128a58161239e565b82525050565b600060408301600083015184820360008601526128c882826124cc565b91505060208301516128dd6020860182612597565b508091505092915050565b60006040820190506128fd600083018561289c565b818103602083015261290f81846128ab565b90509392505050565b600080600060608486031215612931576129306122d1565b5b600061293f86828701612324565b935050602084013567ffffffffffffffff8111156129605761295f6122d6565b5b61296c868287016127e3565b925050604061297d868287016123bf565b9150509250925092565b6000806040838503121561299e5761299d6122d1565b5b600083013567ffffffffffffffff8111156129bc576129bb6122d6565b5b6129c8858286016127e3565b92505060206129d9858286016123bf565b9150509250929050565b600080604083850312156129fa576129f96122d1565b5b6000612a0885828601612324565b925050602083013567ffffffffffffffff811115612a2957612a286122d6565b5b612a35858286016127e3565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600067ffffffffffffffff82169050919050565b612a8881612a6b565b82525050565b60c082016000820151612aa460008501826125b3565b506020820151612ab760208501826125b3565b506040820151612aca6040850182612597565b506060820151612add6060850182612597565b506080820151612af06080850182612a7f565b5060a0820151612b0360a08501826125b3565b50505050565b6000612b158383612a8e565b60c08301905092915050565b6000602082019050919050565b6000612b3982612a3f565b612b438185612a4a565b9350612b4e83612a5b565b8060005b83811015612b7f578151612b668882612b09565b9750612b7183612b21565b925050600181019050612b52565b5085935050505092915050565b60006060830160008301518482036000860152612ba982826124cc565b91505060208301518482036020860152612bc382826124cc565b91505060408301518482036040860152612bdd8282612b2e565b9150508091505092915050565b60006020820190508181036000830152612c048184612b8c565b905092915050565b60008060008060808587031215612c2657612c256122d1565b5b6000612c3487828801612324565b945050602085013567ffffffffffffffff811115612c5557612c546122d6565b5b612c61878288016127e3565b9350506040612c72878288016123bf565b925050606085013567ffffffffffffffff811115612c9357612c926122d6565b5b612c9f878288016127e3565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b608082016000820151612ced60008501826125b3565b506020820151612d0060208501826125b3565b506040820151612d136040850182612597565b506060820151612d266060850182612597565b50505050565b6000612d388383612cd7565b60808301905092915050565b6000602082019050919050565b6000612d5c82612cab565b612d668185612cb6565b9350612d7183612cc7565b8060005b83811015612da2578151612d898882612d2c565b9750612d9483612d44565b925050600181019050612d75565b5085935050505092915050565b60006080830160008301518482036000860152612dcc82826124cc565b91505060208301518482036020860152612de682826124cc565b91505060408301518482036040860152612e0082826124cc565b91505060608301518482036060860152612e1a8282612d51565b9150508091505092915050565b60006020820190508181036000830152612e418184612daf565b905092915050565b60008060008060808587031215612e6357612e626122d1565b5b6000612e7187828801612324565b945050602085013567ffffffffffffffff811115612e9257612e916122d6565b5b612e9e878288016127e3565b9350506040612eaf878288016123bf565b9250506060612ec0878288016123bf565b91505092959194509250565b600060208284031215612ee257612ee16122d1565b5b600082013567ffffffffffffffff811115612f0057612eff6122d6565b5b612f0c848285016127e3565b91505092915050565b6000602082019050612f2a600083018461289c565b92915050565b600080fd5b600060a08284031215612f4b57612f4a612f30565b5b81905092915050565b600060608284031215612f6a57612f69612f30565b5b81905092915050565b6000806000806000806101008789031215612f9157612f906122d1565b5b600087013567ffffffffffffffff811115612faf57612fae6122d6565b5b612fbb89828a01612f35565b9650506020612fcc89828a01612f54565b9550506080612fdd89828a016123bf565b94505060a0612fee89828a01612324565b93505060c087013567ffffffffffffffff81111561300f5761300e6122d6565b5b61301b89828a016127e3565b92505060e061302c89828a016123bf565b9150509295509295509295565b61304281612505565b82525050565b600060208201905061305d6000830184613039565b92915050565b6000806000806080858703121561307d5761307c6122d1565b5b600061308b87828801612324565b945050602085013567ffffffffffffffff8111156130ac576130ab6122d6565b5b6130b8878288016127e3565b935050604085013567ffffffffffffffff8111156130d9576130d86122d6565b5b6130e5878288016127e3565b92505060606130f6878288016123bf565b91505092959194509250565b6000819050919050565b61311581613102565b811461312057600080fd5b50565b6000813590506131328161310c565b92915050565b60008060008060808587031215613152576131516122d1565b5b600085013567ffffffffffffffff8111156131705761316f6122d6565b5b61317c87828801612f35565b945050602061318d87828801612324565b935050604061319e87828801613123565b92505060606131af87828801613123565b91505092959194509250565b600060a082840312156131d1576131d0612f30565b5b81905092915050565b600080604083850312156131f1576131f06122d1565b5b600083013567ffffffffffffffff81111561320f5761320e6122d6565b5b61321b858286016127e3565b925050602083013567ffffffffffffffff81111561323c5761323b6122d6565b5b613248858286016131bb565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061016083016000830151848203600086015261329c82826124cc565b915050602083015184820360208601526132b682826124cc565b91505060408301516132cb6040860182612511565b5060608301516132de6060860182612588565b5060808301516132f16080860182612597565b5060a083015161330460a0860182612597565b5060c083015184820360c086015261331c82826124cc565b91505060e083015161333160e08601826125b3565b506101008301516133466101008601826125b3565b5061012083015161335b610120860182612597565b50610140830151613370610140860182612597565b508091505092915050565b6000613387838361327e565b905092915050565b6000602082019050919050565b60006133a782613252565b6133b1818561325d565b9350836020820285016133c38561326e565b8060005b858110156133ff57848403895281516133e0858261337b565b94506133eb8361338f565b925060208a019950506001810190506133c7565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b600061343882613411565b613442818561341c565b9350613452818560208601612491565b61345b816124bb565b840191505092915050565b60006040830160008301518482036000860152613483828261342d565b91505060208301516134986020860182612a7f565b508091505092915050565b600060408201905081810360008301526134bd818561339c565b905081810360208301526134d18184613466565b90509392505050565b600080600080608085870312156134f4576134f36122d1565b5b600061350287828801612324565b9450506020613513878288016123bf565b9350506040613524878288016123bf565b925050606085013567ffffffffffffffff811115613545576135446122d6565b5b613551878288016127e3565b91505092959194509250565b600080600060408486031215613576576135756122d1565b5b600061358486828701612324565b935050602084013567ffffffffffffffff8111156135a5576135a46122d6565b5b6135b186828701612348565b92509250509250925092565b600080fd5b600080fd5b600067ffffffffffffffff8211156135e2576135e16126e6565b5b6135eb826124bb565b9050602081019050919050565b600061360b613606846135c7565b612746565b905082815260208101848484011115613627576136266126e1565b5b613632848285612792565b509392505050565b600082601f83011261364f5761364e612339565b5b813561365f8482602086016135f8565b91505092915050565b61367181612a6b565b811461367c57600080fd5b50565b60008135905061368e81613668565b92915050565b61369d81612505565b81146136a857600080fd5b50565b6000813590506136ba81613694565b92915050565b600060a082840312156136d6576136d56135bd565b5b6136e060a0612746565b9050600082013567ffffffffffffffff811115613700576136ff6135c2565b5b61370c8482850161363a565b60008301525060206137208482850161367f565b60208301525060406137348482850161367f565b6040830152506060613748848285016136ab565b606083015250608061375c848285016136ab565b60808301525092915050565b60008060008060808587031215613782576137816122d1565b5b600061379087828801612324565b945050602085013567ffffffffffffffff8111156137b1576137b06122d6565b5b6137bd878288016127e3565b935050604085013567ffffffffffffffff8111156137de576137dd6122d6565b5b6137ea878288016127e3565b925050606085013567ffffffffffffffff81111561380b5761380a6122d6565b5b613817878288016136c0565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000608083016000830151848203600086015261386c82826124cc565b9150506020830151848203602086015261388682826124cc565b915050604083015184820360408601526138a082826124cc565b915050606083015184820360608601526138ba8282612d51565b9150508091505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60a0820160008201516139096000850182612cd7565b50602082015161391c6080850182612597565b50505050565b600061392e83836138f3565b60a08301905092915050565b6000602082019050919050565b6000613952826138c7565b61395c81856138d2565b9350613967836138e3565b8060005b8381101561399857815161397f8882613922565b975061398a8361393a565b92505060018101905061396b565b5085935050505092915050565b600060408301600083015184820360008601526139c2828261384f565b915050602083015184820360208601526139dc8282613947565b9150508091505092915050565b60006139f583836139a5565b905092915050565b6000602082019050919050565b6000613a1582613823565b613a1f818561382e565b935083602082028501613a318561383f565b8060005b85811015613a6d5784840389528151613a4e85826139e9565b9450613a59836139fd565b925060208a01995050600181019050613a35565b50829750879550505050505092915050565b60006040820190508181036000830152613a998185613a0a565b90508181036020830152613aad8184613466565b90509392505050565b613abf816122fb565b82525050565b600082825260208201905092915050565b6000819050919050565b6000613aec8385612480565b9350613af9838584612792565b613b02836124bb565b840190509392505050565b6000613b1a848484613ae0565b90509392505050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112613b4f57613b4e613b2d565b5b83810192508235915060208301925067ffffffffffffffff821115613b7757613b76613b23565b5b600182023603831315613b8d57613b8c613b28565b5b509250929050565b6000602082019050919050565b6000613bae8385613ac5565b935083602084028501613bc084613ad6565b8060005b87811015613c06578484038952613bdb8284613b32565b613be6868284613b0d565b9550613bf184613b95565b935060208b019a505050600181019050613bc4565b50829750879450505050509392505050565b6000606082019050613c2d6000830187613ab6565b613c3a602083018661289c565b8181036040830152613c4d818486613ba2565b905095945050505050565b600081519050613c6781613694565b92915050565b600060208284031215613c8357613c826122d1565b5b6000613c9184828501613c58565b91505092915050565b600082825260208201905092915050565b7f4661696c656420746f20617070726f7665207374616b696e67206d6574686f6460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d07602183613c9a565b9150613d1282613cab565b604082019050919050565b60006020820190508181036000830152613d3681613cfa565b9050919050565b6000602082019050613d526000830184613ab6565b92915050565b6000613d6b613d6684612761565b612746565b905082815260208101848484011115613d8757613d866126e1565b5b613d92848285612491565b509392505050565b600082601f830112613daf57613dae612339565b5b8151613dbf848260208601613d58565b91505092915050565b60048110613dd557600080fd5b50565b600081519050613de781613dc8565b92915050565b600081519050613dfc816123a8565b92915050565b613e0b816125a6565b8114613e1657600080fd5b50565b600081519050613e2881613e02565b92915050565b60006101608284031215613e4557613e446135bd565b5b613e50610160612746565b9050600082015167ffffffffffffffff811115613e7057613e6f6135c2565b5b613e7c84828501613d9a565b600083015250602082015167ffffffffffffffff811115613ea057613e9f6135c2565b5b613eac84828501613d9a565b6020830152506040613ec084828501613c58565b6040830152506060613ed484828501613dd8565b6060830152506080613ee884828501613ded565b60808301525060a0613efc84828501613ded565b60a08301525060c082015167ffffffffffffffff811115613f2057613f1f6135c2565b5b613f2c84828501613d9a565b60c08301525060e0613f4084828501613e19565b60e083015250610100613f5584828501613e19565b61010083015250610120613f6b84828501613ded565b61012083015250610140613f8184828501613ded565b6101408301525092915050565b600060208284031215613fa457613fa36122d1565b5b600082015167ffffffffffffffff811115613fc257613fc16122d6565b5b613fce84828501613e2e565b91505092915050565b6000613fe282612475565b613fec8185613c9a565b9350613ffc818560208601612491565b614005816124bb565b840191505092915050565b60006040820190506140256000830185613ab6565b81810360208301526140378184613fd7565b90509392505050565b600081905092915050565b600061405682612475565b6140608185614040565b9350614070818560208601612491565b80840191505092915050565b6000614088828461404b565b915081905092915050565b7f64656c656761746563616c6c0000000000000000000000000000000000000000600082015250565b60006140c9600c83614040565b91506140d482614093565b600c82019050919050565b60006140ea826140bc565b9150819050919050565b600081905092915050565b600061410a82613411565b61411481856140f4565b9350614124818560208601612491565b80840191505092915050565b600061413c82846140ff565b915081905092915050565b7f6661696c65642064656c656761746563616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b60006141a3602183613c9a565b91506141ae82614147565b604082019050919050565b600060208201905081810360008301526141d281614196565b9050919050565b6000604082840312156141ef576141ee6135bd565b5b6141f96040612746565b9050600082015167ffffffffffffffff811115614219576142186135c2565b5b61422584828501613d9a565b600083015250602061423984828501613ded565b60208301525092915050565b6000806040838503121561425c5761425b6122d1565b5b600061426a85828601613ded565b925050602083015167ffffffffffffffff81111561428b5761428a6122d6565b5b614297858286016141d9565b9150509250929050565b7f73746174696363616c6c00000000000000000000000000000000000000000000600082015250565b60006142d7600a83614040565b91506142e2826142a1565b600a82019050919050565b60006142f8826142ca565b9150819050919050565b7f6661696c65642073746174696363616c6c20746f20707265636f6d70696c6500600082015250565b6000614338601f83613c9a565b915061434382614302565b602082019050919050565b600060208201905081810360008301526143678161432b565b9050919050565b7f63616c6c00000000000000000000000000000000000000000000000000000000600082015250565b60006143a4600483614040565b91506143af8261436e565b600482019050919050565b60006143c582614397565b9150819050919050565b7f6661696c65642063616c6c20746f20707265636f6d70696c6500000000000000600082015250565b6000614405601983613c9a565b9150614410826143cf565b602082019050919050565b60006020820190508181036000830152614434816143f8565b9050919050565b7f63616c6c636f6465000000000000000000000000000000000000000000000000600082015250565b6000614471600883614040565b915061447c8261443b565b600882019050919050565b600061449282614464565b9150819050919050565b7f696e76616c69642063616c6c7479706500000000000000000000000000000000600082015250565b60006144d2601083613c9a565b91506144dd8261449c565b602082019050919050565b60006020820190508181036000830152614501816144c5565b9050919050565b600081549050919050565b60008190508160005260206000209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061456f57607f821691505b60208210810361458257614581614528565b5b50919050565b60008190508160005260206000209050919050565b600081546145aa81614557565b6145b48186612480565b945060018216600081146145cf57600181146145e557614618565b60ff198316865281151560200286019350614618565b6145ee85614588565b60005b83811015614610578154818901526001820191506020810190506145f1565b808801955050505b50505092915050565b600061462d838361459d565b905092915050565b6000600182019050919050565b600061464d82614508565b6146578185613ac5565b93508360208202850161466985614513565b8060005b858110156146a4578484038952816146858582614621565b945061469083614635565b925060208a0199505060018101905061466d565b50829750879550505050505092915050565b60006060820190506146cb6000830186613ab6565b6146d8602083018561289c565b81810360408301526146ea8184614642565b9050949350505050565b7f64656c65676174696f6e20617070726f76616c206661696c6564000000000000600082015250565b600061472a601a83613c9a565b9150614735826146f4565b602082019050919050565b600060208201905081810360008301526147598161471d565b9050919050565b60006040820190506147756000830185613ab6565b614782602083018461289c565b9392505050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b60006147bf600f83613c9a565b91506147ca82614789565b602082019050919050565b600060208201905081810360008301526147ee816147b2565b9050919050565b600060608201905061480a6000830186613ab6565b818103602083015261481c8185613fd7565b905061482b604083018461289c565b949350505050565b7f5374616b696e6720417070726f7665206661696c656400000000000000000000600082015250565b6000614869601683613c9a565b915061487482614833565b602082019050919050565b600060208201905081810360008301526148988161485c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006148d98261239e565b91506148e48361239e565b92508282019050808211156148fc576148fb61489f565b5b92915050565b600067ffffffffffffffff82111561491d5761491c6126e6565b5b602082029050602081019050919050565b60008151905061493d81613668565b92915050565b600060c08284031215614959576149586135bd565b5b61496360c0612746565b9050600061497384828501613e19565b600083015250602061498784828501613e19565b602083015250604061499b84828501613ded565b60408301525060606149af84828501613ded565b60608301525060806149c38482850161492e565b60808301525060a06149d784828501613e19565b60a08301525092915050565b60006149f66149f184614902565b612746565b90508083825260208201905060c08402830185811115614a1957614a18612343565b5b835b81811015614a425780614a2e8882614943565b84526020840193505060c081019050614a1b565b5050509392505050565b600082601f830112614a6157614a60612339565b5b8151614a718482602086016149e3565b91505092915050565b600060608284031215614a9057614a8f6135bd565b5b614a9a6060612746565b9050600082015167ffffffffffffffff811115614aba57614ab96135c2565b5b614ac684828501613d9a565b600083015250602082015167ffffffffffffffff811115614aea57614ae96135c2565b5b614af684828501613d9a565b602083015250604082015167ffffffffffffffff811115614b1a57614b196135c2565b5b614b2684828501614a4c565b60408301525092915050565b600060208284031215614b4857614b476122d1565b5b600082015167ffffffffffffffff811115614b6657614b656122d6565b5b614b7284828501614a7a565b91505092915050565b6000606082019050614b906000830186613ab6565b8181036020830152614ba28185613fd7565b90508181036040830152614bb68184613fd7565b9050949350505050565b600067ffffffffffffffff821115614bdb57614bda6126e6565b5b602082029050602081019050919050565b600060808284031215614c0257614c016135bd565b5b614c0c6080612746565b90506000614c1c84828501613e19565b6000830152506020614c3084828501613e19565b6020830152506040614c4484828501613ded565b6040830152506060614c5884828501613ded565b60608301525092915050565b6000614c77614c7284614bc0565b612746565b90508083825260208201905060808402830185811115614c9a57614c99612343565b5b835b81811015614cc35780614caf8882614bec565b845260208401935050608081019050614c9c565b5050509392505050565b600082601f830112614ce257614ce1612339565b5b8151614cf2848260208601614c64565b91505092915050565b600060808284031215614d1157614d106135bd565b5b614d1b6080612746565b9050600082015167ffffffffffffffff811115614d3b57614d3a6135c2565b5b614d4784828501613d9a565b600083015250602082015167ffffffffffffffff811115614d6b57614d6a6135c2565b5b614d7784828501613d9a565b602083015250604082015167ffffffffffffffff811115614d9b57614d9a6135c2565b5b614da784828501613d9a565b604083015250606082015167ffffffffffffffff811115614dcb57614dca6135c2565b5b614dd784828501614ccd565b60608301525092915050565b600060208284031215614df957614df86122d1565b5b600082015167ffffffffffffffff811115614e1757614e166122d6565b5b614e2384828501614cfb565b91505092915050565b6000608082019050614e416000830187613ab6565b8181036020830152614e538186613fd7565b9050614e62604083018561289c565b614e6f606083018461289c565b95945050505050565b7f44656c656761746520417070726f7665206661696c6564000000000000000000600082015250565b6000614eae601783613c9a565b9150614eb982614e78565b602082019050919050565b60006020820190508181036000830152614edd81614ea1565b9050919050565b600060a08301614ef76000840184613b32565b8583036000870152614f0a838284613ae0565b92505050614f1b6020840184613b32565b8583036020870152614f2e838284613ae0565b92505050614f3f6040840184613b32565b8583036040870152614f52838284613ae0565b92505050614f636060840184613b32565b8583036060870152614f76838284613ae0565b92505050614f876080840184613b32565b8583036080870152614f9a838284613ae0565b925050508091505092915050565b6000614fb760208401846123bf565b905092915050565b60608201614fd06000830183614fa8565b614fdd6000850182612597565b50614feb6020830183614fa8565b614ff86020850182612597565b506150066040830183614fa8565b6150136040850182612597565b50505050565b60006101008201905081810360008301526150348189614ee4565b90506150436020830188614fbf565b615050608083018761289c565b61505d60a0830186613ab6565b81810360c083015261506f8185613fd7565b905061507e60e083018461289c565b979650505050505050565b60006020828403121561509f5761509e6122d1565b5b60006150ad84828501613e19565b91505092915050565b60006080820190506150cb6000830187613ab6565b81810360208301526150dd8186613fd7565b905081810360408301526150f18185613fd7565b9050615100606083018461289c565b95945050505050565b61511281613102565b82525050565b600060808201905081810360008301526151328187614ee4565b90506151416020830186613ab6565b61514e6040830185615109565b61515b6060830184615109565b95945050505050565b6000808335600160200384360303811261518157615180613b2d565b5b83810192508235915060208301925067ffffffffffffffff8211156151a9576151a8613b23565b5b6001820236038313156151bf576151be613b28565b5b509250929050565b60006151d3838561341c565b93506151e0838584612792565b6151e9836124bb565b840190509392505050565b6000615203602084018461367f565b905092915050565b600061521a60208401846136ab565b905092915050565b600060a083016152356000840184615164565b85830360008701526152488382846151c7565b9250505061525960208401846151f4565b6152666020860182612a7f565b5061527460408401846151f4565b6152816040860182612a7f565b5061528f606084018461520b565b61529c6060860182612511565b506152aa608084018461520b565b6152b76080860182612511565b508091505092915050565b600060408201905081810360008301526152dc8185613fd7565b905081810360208301526152f08184615222565b90509392505050565b600067ffffffffffffffff821115615314576153136126e6565b5b602082029050602081019050919050565b6000615338615333846152f9565b612746565b9050808382526020820190506020840283018581111561535b5761535a612343565b5b835b818110156153a257805167ffffffffffffffff8111156153805761537f612339565b5b80860161538d8982613e2e565b8552602085019450505060208101905061535d565b5050509392505050565b600082601f8301126153c1576153c0612339565b5b81516153d1848260208601615325565b91505092915050565b60006153ed6153e8846135c7565b612746565b905082815260208101848484011115615409576154086126e1565b5b615414848285612491565b509392505050565b600082601f83011261543157615430612339565b5b81516154418482602086016153da565b91505092915050565b6000604082840312156154605761545f6135bd565b5b61546a6040612746565b9050600082015167ffffffffffffffff81111561548a576154896135c2565b5b6154968482850161541c565b60008301525060206154aa8482850161492e565b60208301525092915050565b600080604083850312156154cd576154cc6122d1565b5b600083015167ffffffffffffffff8111156154eb576154ea6122d6565b5b6154f7858286016153ac565b925050602083015167ffffffffffffffff811115615518576155176122d6565b5b6155248582860161544a565b9150509250929050565b60006060820190506155436000830186613ab6565b6155506020830185613ab6565b81810360408301526155628184613fd7565b9050949350505050565b600060208284031215615582576155816122d1565b5b600061559084828501613ded565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b6000819050602082019050919050565b60006155ef83836124cc565b905092915050565b6000602082019050919050565b600061560f826155c8565b6156198185613ac5565b93508360208202850161562b856155d3565b8060005b85811015615667578484038952815161564885826155e3565b9450615653836155f7565b925060208a0199505060018101905061562f565b50829750879550505050505092915050565b600060608201905061568e6000830186613ab6565b61569b602083018561289c565b81810360408301526156ad8184615604565b9050949350505050565b7f6661696c656420746f20617070726f766520756e64656c65676174696f6e206d60008201527f6574686f64000000000000000000000000000000000000000000000000000000602082015250565b6000615713602583613c9a565b915061571e826156b7565b604082019050919050565b6000602082019050818103600083015261574281615706565b9050919050565b600060408201905061575e6000830186613ab6565b8181036020830152615771818486613ba2565b9050949350505050565b7f4661696c656420746f207265766f6b6520617070726f76616c20666f7220737460008201527f616b696e67206d6574686f647300000000000000000000000000000000000000602082015250565b60006157d7602d83613c9a565b91506157e28261577b565b604082019050919050565b60006020820190508181036000830152615806816157ca565b9050919050565b600060a083016000830151848203600086015261582a828261342d565b915050602083015161583f6020860182612a7f565b5060408301516158526040860182612a7f565b5060608301516158656060860182612511565b5060808301516158786080860182612511565b508091505092915050565b60006080820190506158986000830187613ab6565b81810360208301526158aa8186613fd7565b905081810360408301526158be8185613fd7565b905081810360608301526158d2818461580d565b905095945050505050565b600067ffffffffffffffff8211156158f8576158f76126e6565b5b602082029050602081019050919050565b60006080828403121561591f5761591e6135bd565b5b6159296080612746565b9050600082015167ffffffffffffffff811115615949576159486135c2565b5b61595584828501613d9a565b600083015250602082015167ffffffffffffffff811115615979576159786135c2565b5b61598584828501613d9a565b602083015250604082015167ffffffffffffffff8111156159a9576159a86135c2565b5b6159b584828501613d9a565b604083015250606082015167ffffffffffffffff8111156159d9576159d86135c2565b5b6159e584828501614ccd565b60608301525092915050565b600067ffffffffffffffff821115615a0c57615a0b6126e6565b5b602082029050602081019050919050565b600060a08284031215615a3357615a326135bd565b5b615a3d6040612746565b90506000615a4d84828501614bec565b6000830152506080615a6184828501613ded565b60208301525092915050565b6000615a80615a7b846159f1565b612746565b90508083825260208201905060a08402830185811115615aa357615aa2612343565b5b835b81811015615acc5780615ab88882615a1d565b84526020840193505060a081019050615aa5565b5050509392505050565b600082601f830112615aeb57615aea612339565b5b8151615afb848260208601615a6d565b91505092915050565b600060408284031215615b1a57615b196135bd565b5b615b246040612746565b9050600082015167ffffffffffffffff811115615b4457615b436135c2565b5b615b5084828501615909565b600083015250602082015167ffffffffffffffff811115615b7457615b736135c2565b5b615b8084828501615ad6565b60208301525092915050565b6000615b9f615b9a846158dd565b612746565b90508083825260208201905060208402830185811115615bc257615bc1612343565b5b835b81811015615c0957805167ffffffffffffffff811115615be757615be6612339565b5b808601615bf48982615b04565b85526020850194505050602081019050615bc4565b5050509392505050565b600082601f830112615c2857615c27612339565b5b8151615c38848260208601615b8c565b91505092915050565b60008060408385031215615c5857615c576122d1565b5b600083015167ffffffffffffffff811115615c7657615c756122d6565b5b615c8285828601615c13565b925050602083015167ffffffffffffffff811115615ca357615ca26122d6565b5b615caf8582860161544a565b915050925092905056fe2f636f736d6f732e7374616b696e672e763162657461312e4d7367556e64656c6567617465a2646970667358221220869745a83df35e33e4ef5e71f87905ee5baef43e403b5c8fe7ef7c045634645564736f6c63430008130033", + "bytecode": "0x60806040526040518060200160405280604051806060016040528060238152602001620062646023913981525060019060016200003e92919062000053565b503480156200004c57600080fd5b50620004a1565b828054828255906000526020600020908101928215620000a0579160200282015b828111156200009f5782518290816200008e9190620003ba565b509160200191906001019062000074565b5b509050620000af9190620000b3565b5090565b5b80821115620000d75760008181620000cd9190620000db565b50600101620000b4565b5090565b508054620000e990620001a9565b6000825580601f10620000fd57506200011e565b601f0160209004906000526020600020908101906200011d919062000121565b5b50565b5b808211156200013c57600081600090555060010162000122565b5090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620001c257607f821691505b602082108103620001d857620001d76200017a565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620002427fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000203565b6200024e868362000203565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200029b620002956200028f8462000266565b62000270565b62000266565b9050919050565b6000819050919050565b620002b7836200027a565b620002cf620002c682620002a2565b84845462000210565b825550505050565b600090565b620002e6620002d7565b620002f3818484620002ac565b505050565b5b818110156200031b576200030f600082620002dc565b600181019050620002f9565b5050565b601f8211156200036a576200033481620001de565b6200033f84620001f3565b810160208510156200034f578190505b620003676200035e85620001f3565b830182620002f8565b50505b505050565b600082821c905092915050565b60006200038f600019846008026200036f565b1980831691505092915050565b6000620003aa83836200037c565b9150826002028217905092915050565b620003c58262000140565b67ffffffffffffffff811115620003e157620003e06200014b565b5b620003ed8254620001a9565b620003fa8282856200031f565b600060209050601f8311600181146200043257600084156200041d578287015190505b6200042985826200039c565b86555062000499565b601f1984166200044286620001de565b60005b828110156200046c5784890151825560018201915060208501945060208101905062000445565b868310156200048c578489015162000488601f8916826200037c565b8355505b6001600288020188555050505b505050505050565b615db380620004b16000396000f3fe60806040526004361061014b5760003560e01c80637e51b811116100b6578063cf2753cf1161006f578063cf2753cf146104a8578063ec9485df146104e6578063f40a214614610523578063f5714e641461054c578063f700dbd214610568578063f732b065146105915761014b565b80637e51b811146103965780638939e783146103bf5780638edb3f8b146103e85780639eab671114610404578063af9a90b21461042d578063b13d42421461046a5761014b565b806355dc4b221161010857806355dc4b2214610283578063570467ac146102ac5780635e269bfe146102e957806360deaa2a1461031257806361bc221a1461032e57806368ac3df3146103595761014b565b80630a4433e2146101505780631904bb2e1461017957806319b16c4c146101b657806331bcbcb3146101f45780633566cb951461021d578063455b855114610246575b600080fd5b34801561015c57600080fd5b5061017760048036038101906101729190612402565b6105cf565b005b34801561018557600080fd5b506101a0600480360381019061019b9190612476565b61069e565b6040516101ad91906126ed565b60405180910390f35b3480156101c257600080fd5b506101dd60048036038101906101d8919061283f565b61072e565b6040516101eb929190612916565b60405180910390f35b34801561020057600080fd5b5061021b60048036038101906102169190612946565b610c2d565b005b34801561022957600080fd5b50610244600480360381019061023f91906129b5565b610eba565b005b34801561025257600080fd5b5061026d60048036038101906102689190612a11565b611022565b60405161027a9190612c18565b60405180910390f35b34801561028f57600080fd5b506102aa60048036038101906102a59190612c3a565b6110b5565b005b3480156102b857600080fd5b506102d360048036038101906102ce919061283f565b6114a7565b6040516102e09190612e55565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190612e77565b61153d565b005b61032c60048036038101906103279190612efa565b6115c8565b005b34801561033a57600080fd5b50610343611716565b6040516103509190612f43565b60405180910390f35b34801561036557600080fd5b50610380600480360381019061037b9190612fa1565b61171c565b60405161038d9190613076565b60405180910390f35b3480156103a257600080fd5b506103bd60048036038101906103b89190612946565b6117b2565b005b3480156103cb57600080fd5b506103e660048036038101906103e19190612946565b61183a565b005b61040260048036038101906103fd9190612efa565b6118f0565b005b34801561041057600080fd5b5061042b60048036038101906104269190613091565b611a85565b005b34801561043957600080fd5b50610454600480360381019061044f9190613166565b611b10565b6040516104619190613076565b60405180910390f35b34801561047657600080fd5b50610491600480360381019061048c9190613208565b611ba0565b60405161049f9291906134d1565b60405180910390f35b3480156104b457600080fd5b506104cf60048036038101906104ca9190612a11565b611c38565b6040516104dd929190612916565b60405180910390f35b3480156104f257600080fd5b5061050d60048036038101906105089190612a11565b611cd0565b60405161051a9190612f43565b60405180910390f35b34801561052f57600080fd5b5061054a60048036038101906105459190613508565b611d5a565b005b61056660048036038101906105619190612efa565b611f36565b005b34801561057457600080fd5b5061058f600480360381019061058a919061358b565b612090565b005b34801561059d57600080fd5b506105b860048036038101906105b39190613796565b61215c565b6040516105c6929190613aad565b60405180910390f35b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895868487876040518563ffffffff1660e01b81526004016106129493929190613c46565b6020604051808303816000875af1158015610631573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106559190613c9b565b905080610697576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068e90613d4b565b60405180910390fd5b5050505050565b6106a66121fa565b61080073ffffffffffffffffffffffffffffffffffffffff1663223b3b7a836040518263ffffffff1660e01b81526004016106e19190613d6b565b600060405180830381865afa1580156106fe573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906107279190613fbc565b9050919050565b600061073861226e565b600061080090506000868660405160240161075492919061403e565b6040516020818303038152906040527f241774e6000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000856040516020016107e691906140aa565b60405160208183030381529060405280519060200120905060405160200161080d9061410d565b6040516020818303038152906040528051906020012081036108f9576000808473ffffffffffffffffffffffffffffffffffffffff1684604051610851919061415e565b600060405180830381855af49150503d806000811461088c576040519150601f19603f3d011682016040523d82523d6000602084013e610891565b606091505b5091509150816108d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cd906141e7565b60405180910390fd5b808060200190518101906108ea9190614273565b80975081985050505050610c22565b6040516020016109089061431b565b6040516020818303038152906040528051906020012081036109f4576000808473ffffffffffffffffffffffffffffffffffffffff168460405161094c919061415e565b600060405180830381855afa9150503d8060008114610987576040519150601f19603f3d011682016040523d82523d6000602084013e61098c565b606091505b5091509150816109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c89061437c565b60405180910390fd5b808060200190518101906109e59190614273565b80975081985050505050610c21565b604051602001610a03906143e8565b604051602081830303815290604052805190602001208103610af1576000808473ffffffffffffffffffffffffffffffffffffffff1684604051610a47919061415e565b6000604051808303816000865af19150503d8060008114610a84576040519150601f19603f3d011682016040523d82523d6000602084013e610a89565b606091505b509150915081610ace576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac590614449565b60405180910390fd5b80806020019051810190610ae29190614273565b80975081985050505050610c20565b604051602001610b00906144b5565b604051602081830303815290604052805190602001208103610be45760006040518060400160405280601a81526020017f64656c65676174696f6e28616464726573732c737472696e6729000000000000815250805190602001209050600060a490506060600060208b01516020808d0101516040518681528e6004820152604060248201526033604482015282606482015281608482015260c081878360008e5af281519c5060608201519450610100820160405280610bc057600080fd5b50505050604051806040016040528083815260200182815250975050505050610c1f565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1690614516565b60405180910390fd5b5b5b5b505050935093915050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610c6f939291906146e4565b6020604051808303816000875af1158015610c8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb29190613c9b565b905080610cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ceb9061476e565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff163384604051602401610d2092919061478e565b6040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610daa919061415e565b6000604051808303816000865af19150503d8060008114610de7576040519150601f19603f3d011682016040523d82523d6000602084013e610dec565b606091505b5050905080610e30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2790614803565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3386866040518463ffffffff1660e01b8152600401610e6f93929190614823565b6020604051808303816000875af1158015610e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb29190613c9b565b505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610efc939291906146e4565b6020604051808303816000875af1158015610f1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3f9190613c9b565b905080610f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f78906148ad565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3085856040518463ffffffff1660e01b8152600401610fc093929190614823565b6020604051808303816000875af1158015610fdf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110039190613c9b565b50600160008082825461101691906148fc565b92505081905550505050565b61102a612288565b61080073ffffffffffffffffffffffffffffffffffffffff1663a03ffee184846040518363ffffffff1660e01b815260040161106792919061403e565b600060405180830381865afa158015611084573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110ad9190614b60565b905092915050565b6000610800905060008585856040516024016110d393929190614823565b6040516020818303038152906040527f3edab33c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060008360405160200161116591906140aa565b60405160208183030381529060405280519060200120905060405160200161118c9061410d565b6040516020818303038152906040528051906020012081036112595760008373ffffffffffffffffffffffffffffffffffffffff16836040516111cf919061415e565b600060405180830381855af49150503d806000811461120a576040519150601f19603f3d011682016040523d82523d6000602084013e61120f565b606091505b5050905080611253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124a906141e7565b60405180910390fd5b5061149e565b6040516020016112689061431b565b6040516020818303038152906040528051906020012081036113355760008373ffffffffffffffffffffffffffffffffffffffff16836040516112ab919061415e565b600060405180830381855afa9150503d80600081146112e6576040519150601f19603f3d011682016040523d82523d6000602084013e6112eb565b606091505b505090508061132f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113269061437c565b60405180910390fd5b5061149d565b604051602001611344906143e8565b6040516020818303038152906040528051906020012081036114135760008373ffffffffffffffffffffffffffffffffffffffff1683604051611387919061415e565b6000604051808303816000865af19150503d80600081146113c4576040519150601f19603f3d011682016040523d82523d6000602084013e6113c9565b606091505b505090508061140d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140490614449565b60405180910390fd5b5061149c565b604051602001611422906144b5565b6040516020818303038152906040528051906020012081036114605760208201825160008082846000895af28061145857600080fd5b50505061149b565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149290614516565b60405180910390fd5b5b5b5b50505050505050565b6114af6122a9565b61080073ffffffffffffffffffffffffffffffffffffffff16637d9f939c8585856040518463ffffffff1660e01b81526004016114ee93929190614ba9565b600060405180830381865afa15801561150b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906115349190614e11565b90509392505050565b61080073ffffffffffffffffffffffffffffffffffffffff166312d58dfe858585856040518563ffffffff1660e01b815260040161157e9493929190614e5a565b6020604051808303816000875af115801561159d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c19190613c9b565b5050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895303460016040518463ffffffff1660e01b815260040161160a939291906146e4565b6020604051808303816000875af1158015611629573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164d9190613c9b565b90508061168f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168690614ef2565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b81526004016116ce93929190614823565b6020604051808303816000875af11580156116ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117119190613c9b565b505050565b60005481565b600061080073ffffffffffffffffffffffffffffffffffffffff1663f7cd55168888888888886040518763ffffffff1660e01b815260040161176396959493929190615047565b6020604051808303816000875af1158015611782573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a69190613c9b565b90509695505050505050565b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c8484846040518463ffffffff1660e01b81526004016117f193929190614823565b6020604051808303816000875af1158015611810573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061183491906150b7565b50505050565b60008081548092919061184c906150e4565b919050555061080073ffffffffffffffffffffffffffffffffffffffff166353266bbb8484846040518463ffffffff1660e01b815260040161189093929190614823565b6020604051808303816000875af11580156118af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d39190613c9b565b506000808154809291906118e69061512c565b9190505550505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b8152600401611932939291906146e4565b6020604051808303816000875af1158015611951573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119759190613c9b565b9050806119b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ae90614ef2565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b81526004016119f693929190614823565b6020604051808303816000875af1158015611a15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a399190613c9b565b503373ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611a80573d6000803e3d6000fd5b505050565b61080073ffffffffffffffffffffffffffffffffffffffff166354b826f5858585856040518563ffffffff1660e01b8152600401611ac69493929190615155565b6020604051808303816000875af1158015611ae5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0991906150b7565b5050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663a50f05ac868686866040518563ffffffff1660e01b8152600401611b5394939291906151b7565b6020604051808303816000875af1158015611b72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b969190613c9b565b9050949350505050565b6060611baa6122d1565b61080073ffffffffffffffffffffffffffffffffffffffff1663186b216785856040518363ffffffff1660e01b8152600401611be7929190615361565b600060405180830381865afa158015611c04573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611c2d9190615555565b915091509250929050565b6000611c4261226e565b61080073ffffffffffffffffffffffffffffffffffffffff1663241774e685856040518363ffffffff1660e01b8152600401611c7f92919061403e565b600060405180830381865afa158015611c9c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611cc59190614273565b915091509250929050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663fc08930c8433856040518463ffffffff1660e01b8152600401611d11939291906155cd565b602060405180830381865afa158015611d2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d52919061560b565b905092915050565b6000600167ffffffffffffffff811115611d7757611d76612714565b5b604051908082528060200260200182016040528015611daa57816020015b6060815260200190600190039081611d955790505b509050604051806060016040528060258152602001615d596025913981600081518110611dda57611dd9615638565b5b6020026020010181905250600061080073ffffffffffffffffffffffffffffffffffffffff1663b60398958787856040518463ffffffff1660e01b8152600401611e2693929190615718565b6020604051808303816000875af1158015611e45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e699190613c9b565b905080611eab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea2906157c8565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c3285876040518463ffffffff1660e01b8152600401611eea93929190614823565b6020604051808303816000875af1158015611f09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f2d91906150b7565b50505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b8152600401611f78939291906146e4565b6020604051808303816000875af1158015611f97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fbb9190613c9b565b905080611ffd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff490614ef2565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb308460013461202a91906148fc565b6040518463ffffffff1660e01b815260040161204893929190614823565b6020604051808303816000875af1158015612067573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208b9190613c9b565b505050565b600061080073ffffffffffffffffffffffffffffffffffffffff166361dc5c3b8585856040518463ffffffff1660e01b81526004016120d1939291906157e8565b6020604051808303816000875af11580156120f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121149190613c9b565b905080612156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214d9061588c565b60405180910390fd5b50505050565b60606121666122d1565b61080073ffffffffffffffffffffffffffffffffffffffff166310a2851c878787876040518563ffffffff1660e01b81526004016121a79493929190615922565b600060405180830381865afa1580156121c4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906121ed9190615ce0565b9150915094509492505050565b6040518061016001604052806060815260200160608152602001600015158152602001600060038111156122315761223061254e565b5b8152602001600081526020016000815260200160608152602001600060070b8152602001600060070b815260200160008152602001600081525090565b604051806040016040528060608152602001600081525090565b60405180606001604052806060815260200160608152602001606081525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061233482612309565b9050919050565b61234481612329565b811461234f57600080fd5b50565b6000813590506123618161233b565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261238c5761238b612367565b5b8235905067ffffffffffffffff8111156123a9576123a861236c565b5b6020830191508360208202830111156123c5576123c4612371565b5b9250929050565b6000819050919050565b6123df816123cc565b81146123ea57600080fd5b50565b6000813590506123fc816123d6565b92915050565b6000806000806060858703121561241c5761241b6122ff565b5b600061242a87828801612352565b945050602085013567ffffffffffffffff81111561244b5761244a612304565b5b61245787828801612376565b9350935050604061246a878288016123ed565b91505092959194509250565b60006020828403121561248c5761248b6122ff565b5b600061249a84828501612352565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156124dd5780820151818401526020810190506124c2565b60008484015250505050565b6000601f19601f8301169050919050565b6000612505826124a3565b61250f81856124ae565b935061251f8185602086016124bf565b612528816124e9565b840191505092915050565b60008115159050919050565b61254881612533565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004811061258e5761258d61254e565b5b50565b600081905061259f8261257d565b919050565b60006125af82612591565b9050919050565b6125bf816125a4565b82525050565b6125ce816123cc565b82525050565b60008160070b9050919050565b6125ea816125d4565b82525050565b600061016083016000830151848203600086015261260e82826124fa565b9150506020830151848203602086015261262882826124fa565b915050604083015161263d604086018261253f565b50606083015161265060608601826125b6565b50608083015161266360808601826125c5565b5060a083015161267660a08601826125c5565b5060c083015184820360c086015261268e82826124fa565b91505060e08301516126a360e08601826125e1565b506101008301516126b86101008601826125e1565b506101208301516126cd6101208601826125c5565b506101408301516126e26101408601826125c5565b508091505092915050565b6000602082019050818103600083015261270781846125f0565b905092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61274c826124e9565b810181811067ffffffffffffffff8211171561276b5761276a612714565b5b80604052505050565b600061277e6122f5565b905061278a8282612743565b919050565b600067ffffffffffffffff8211156127aa576127a9612714565b5b6127b3826124e9565b9050602081019050919050565b82818337600083830152505050565b60006127e26127dd8461278f565b612774565b9050828152602081018484840111156127fe576127fd61270f565b5b6128098482856127c0565b509392505050565b600082601f83011261282657612825612367565b5b81356128368482602086016127cf565b91505092915050565b600080600060608486031215612858576128576122ff565b5b600061286686828701612352565b935050602084013567ffffffffffffffff81111561288757612886612304565b5b61289386828701612811565b925050604084013567ffffffffffffffff8111156128b4576128b3612304565b5b6128c086828701612811565b9150509250925092565b6128d3816123cc565b82525050565b600060408301600083015184820360008601526128f682826124fa565b915050602083015161290b60208601826125c5565b508091505092915050565b600060408201905061292b60008301856128ca565b818103602083015261293d81846128d9565b90509392505050565b60008060006060848603121561295f5761295e6122ff565b5b600061296d86828701612352565b935050602084013567ffffffffffffffff81111561298e5761298d612304565b5b61299a86828701612811565b92505060406129ab868287016123ed565b9150509250925092565b600080604083850312156129cc576129cb6122ff565b5b600083013567ffffffffffffffff8111156129ea576129e9612304565b5b6129f685828601612811565b9250506020612a07858286016123ed565b9150509250929050565b60008060408385031215612a2857612a276122ff565b5b6000612a3685828601612352565b925050602083013567ffffffffffffffff811115612a5757612a56612304565b5b612a6385828601612811565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600067ffffffffffffffff82169050919050565b612ab681612a99565b82525050565b60c082016000820151612ad260008501826125e1565b506020820151612ae560208501826125e1565b506040820151612af860408501826125c5565b506060820151612b0b60608501826125c5565b506080820151612b1e6080850182612aad565b5060a0820151612b3160a08501826125e1565b50505050565b6000612b438383612abc565b60c08301905092915050565b6000602082019050919050565b6000612b6782612a6d565b612b718185612a78565b9350612b7c83612a89565b8060005b83811015612bad578151612b948882612b37565b9750612b9f83612b4f565b925050600181019050612b80565b5085935050505092915050565b60006060830160008301518482036000860152612bd782826124fa565b91505060208301518482036020860152612bf182826124fa565b91505060408301518482036040860152612c0b8282612b5c565b9150508091505092915050565b60006020820190508181036000830152612c328184612bba565b905092915050565b60008060008060808587031215612c5457612c536122ff565b5b6000612c6287828801612352565b945050602085013567ffffffffffffffff811115612c8357612c82612304565b5b612c8f87828801612811565b9350506040612ca0878288016123ed565b925050606085013567ffffffffffffffff811115612cc157612cc0612304565b5b612ccd87828801612811565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b608082016000820151612d1b60008501826125e1565b506020820151612d2e60208501826125e1565b506040820151612d4160408501826125c5565b506060820151612d5460608501826125c5565b50505050565b6000612d668383612d05565b60808301905092915050565b6000602082019050919050565b6000612d8a82612cd9565b612d948185612ce4565b9350612d9f83612cf5565b8060005b83811015612dd0578151612db78882612d5a565b9750612dc283612d72565b925050600181019050612da3565b5085935050505092915050565b60006080830160008301518482036000860152612dfa82826124fa565b91505060208301518482036020860152612e1482826124fa565b91505060408301518482036040860152612e2e82826124fa565b91505060608301518482036060860152612e488282612d7f565b9150508091505092915050565b60006020820190508181036000830152612e6f8184612ddd565b905092915050565b60008060008060808587031215612e9157612e906122ff565b5b6000612e9f87828801612352565b945050602085013567ffffffffffffffff811115612ec057612ebf612304565b5b612ecc87828801612811565b9350506040612edd878288016123ed565b9250506060612eee878288016123ed565b91505092959194509250565b600060208284031215612f1057612f0f6122ff565b5b600082013567ffffffffffffffff811115612f2e57612f2d612304565b5b612f3a84828501612811565b91505092915050565b6000602082019050612f5860008301846128ca565b92915050565b600080fd5b600060a08284031215612f7957612f78612f5e565b5b81905092915050565b600060608284031215612f9857612f97612f5e565b5b81905092915050565b6000806000806000806101008789031215612fbf57612fbe6122ff565b5b600087013567ffffffffffffffff811115612fdd57612fdc612304565b5b612fe989828a01612f63565b9650506020612ffa89828a01612f82565b955050608061300b89828a016123ed565b94505060a061301c89828a01612352565b93505060c087013567ffffffffffffffff81111561303d5761303c612304565b5b61304989828a01612811565b92505060e061305a89828a016123ed565b9150509295509295509295565b61307081612533565b82525050565b600060208201905061308b6000830184613067565b92915050565b600080600080608085870312156130ab576130aa6122ff565b5b60006130b987828801612352565b945050602085013567ffffffffffffffff8111156130da576130d9612304565b5b6130e687828801612811565b935050604085013567ffffffffffffffff81111561310757613106612304565b5b61311387828801612811565b9250506060613124878288016123ed565b91505092959194509250565b6000819050919050565b61314381613130565b811461314e57600080fd5b50565b6000813590506131608161313a565b92915050565b600080600080608085870312156131805761317f6122ff565b5b600085013567ffffffffffffffff81111561319e5761319d612304565b5b6131aa87828801612f63565b94505060206131bb87828801612352565b93505060406131cc87828801613151565b92505060606131dd87828801613151565b91505092959194509250565b600060a082840312156131ff576131fe612f5e565b5b81905092915050565b6000806040838503121561321f5761321e6122ff565b5b600083013567ffffffffffffffff81111561323d5761323c612304565b5b61324985828601612811565b925050602083013567ffffffffffffffff81111561326a57613269612304565b5b613276858286016131e9565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006101608301600083015184820360008601526132ca82826124fa565b915050602083015184820360208601526132e482826124fa565b91505060408301516132f9604086018261253f565b50606083015161330c60608601826125b6565b50608083015161331f60808601826125c5565b5060a083015161333260a08601826125c5565b5060c083015184820360c086015261334a82826124fa565b91505060e083015161335f60e08601826125e1565b506101008301516133746101008601826125e1565b506101208301516133896101208601826125c5565b5061014083015161339e6101408601826125c5565b508091505092915050565b60006133b583836132ac565b905092915050565b6000602082019050919050565b60006133d582613280565b6133df818561328b565b9350836020820285016133f18561329c565b8060005b8581101561342d578484038952815161340e85826133a9565b9450613419836133bd565b925060208a019950506001810190506133f5565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b60006134668261343f565b613470818561344a565b93506134808185602086016124bf565b613489816124e9565b840191505092915050565b600060408301600083015184820360008601526134b1828261345b565b91505060208301516134c66020860182612aad565b508091505092915050565b600060408201905081810360008301526134eb81856133ca565b905081810360208301526134ff8184613494565b90509392505050565b60008060008060808587031215613522576135216122ff565b5b600061353087828801612352565b9450506020613541878288016123ed565b9350506040613552878288016123ed565b925050606085013567ffffffffffffffff81111561357357613572612304565b5b61357f87828801612811565b91505092959194509250565b6000806000604084860312156135a4576135a36122ff565b5b60006135b286828701612352565b935050602084013567ffffffffffffffff8111156135d3576135d2612304565b5b6135df86828701612376565b92509250509250925092565b600080fd5b600080fd5b600067ffffffffffffffff8211156136105761360f612714565b5b613619826124e9565b9050602081019050919050565b6000613639613634846135f5565b612774565b9050828152602081018484840111156136555761365461270f565b5b6136608482856127c0565b509392505050565b600082601f83011261367d5761367c612367565b5b813561368d848260208601613626565b91505092915050565b61369f81612a99565b81146136aa57600080fd5b50565b6000813590506136bc81613696565b92915050565b6136cb81612533565b81146136d657600080fd5b50565b6000813590506136e8816136c2565b92915050565b600060a08284031215613704576137036135eb565b5b61370e60a0612774565b9050600082013567ffffffffffffffff81111561372e5761372d6135f0565b5b61373a84828501613668565b600083015250602061374e848285016136ad565b6020830152506040613762848285016136ad565b6040830152506060613776848285016136d9565b606083015250608061378a848285016136d9565b60808301525092915050565b600080600080608085870312156137b0576137af6122ff565b5b60006137be87828801612352565b945050602085013567ffffffffffffffff8111156137df576137de612304565b5b6137eb87828801612811565b935050604085013567ffffffffffffffff81111561380c5761380b612304565b5b61381887828801612811565b925050606085013567ffffffffffffffff81111561383957613838612304565b5b613845878288016136ee565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000608083016000830151848203600086015261389a82826124fa565b915050602083015184820360208601526138b482826124fa565b915050604083015184820360408601526138ce82826124fa565b915050606083015184820360608601526138e88282612d7f565b9150508091505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60a0820160008201516139376000850182612d05565b50602082015161394a60808501826125c5565b50505050565b600061395c8383613921565b60a08301905092915050565b6000602082019050919050565b6000613980826138f5565b61398a8185613900565b935061399583613911565b8060005b838110156139c65781516139ad8882613950565b97506139b883613968565b925050600181019050613999565b5085935050505092915050565b600060408301600083015184820360008601526139f0828261387d565b91505060208301518482036020860152613a0a8282613975565b9150508091505092915050565b6000613a2383836139d3565b905092915050565b6000602082019050919050565b6000613a4382613851565b613a4d818561385c565b935083602082028501613a5f8561386d565b8060005b85811015613a9b5784840389528151613a7c8582613a17565b9450613a8783613a2b565b925060208a01995050600181019050613a63565b50829750879550505050505092915050565b60006040820190508181036000830152613ac78185613a38565b90508181036020830152613adb8184613494565b90509392505050565b613aed81612329565b82525050565b600082825260208201905092915050565b6000819050919050565b6000613b1a83856124ae565b9350613b278385846127c0565b613b30836124e9565b840190509392505050565b6000613b48848484613b0e565b90509392505050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112613b7d57613b7c613b5b565b5b83810192508235915060208301925067ffffffffffffffff821115613ba557613ba4613b51565b5b600182023603831315613bbb57613bba613b56565b5b509250929050565b6000602082019050919050565b6000613bdc8385613af3565b935083602084028501613bee84613b04565b8060005b87811015613c34578484038952613c098284613b60565b613c14868284613b3b565b9550613c1f84613bc3565b935060208b019a505050600181019050613bf2565b50829750879450505050509392505050565b6000606082019050613c5b6000830187613ae4565b613c6860208301866128ca565b8181036040830152613c7b818486613bd0565b905095945050505050565b600081519050613c95816136c2565b92915050565b600060208284031215613cb157613cb06122ff565b5b6000613cbf84828501613c86565b91505092915050565b600082825260208201905092915050565b7f4661696c656420746f20617070726f7665207374616b696e67206d6574686f6460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d35602183613cc8565b9150613d4082613cd9565b604082019050919050565b60006020820190508181036000830152613d6481613d28565b9050919050565b6000602082019050613d806000830184613ae4565b92915050565b6000613d99613d948461278f565b612774565b905082815260208101848484011115613db557613db461270f565b5b613dc08482856124bf565b509392505050565b600082601f830112613ddd57613ddc612367565b5b8151613ded848260208601613d86565b91505092915050565b60048110613e0357600080fd5b50565b600081519050613e1581613df6565b92915050565b600081519050613e2a816123d6565b92915050565b613e39816125d4565b8114613e4457600080fd5b50565b600081519050613e5681613e30565b92915050565b60006101608284031215613e7357613e726135eb565b5b613e7e610160612774565b9050600082015167ffffffffffffffff811115613e9e57613e9d6135f0565b5b613eaa84828501613dc8565b600083015250602082015167ffffffffffffffff811115613ece57613ecd6135f0565b5b613eda84828501613dc8565b6020830152506040613eee84828501613c86565b6040830152506060613f0284828501613e06565b6060830152506080613f1684828501613e1b565b60808301525060a0613f2a84828501613e1b565b60a08301525060c082015167ffffffffffffffff811115613f4e57613f4d6135f0565b5b613f5a84828501613dc8565b60c08301525060e0613f6e84828501613e47565b60e083015250610100613f8384828501613e47565b61010083015250610120613f9984828501613e1b565b61012083015250610140613faf84828501613e1b565b6101408301525092915050565b600060208284031215613fd257613fd16122ff565b5b600082015167ffffffffffffffff811115613ff057613fef612304565b5b613ffc84828501613e5c565b91505092915050565b6000614010826124a3565b61401a8185613cc8565b935061402a8185602086016124bf565b614033816124e9565b840191505092915050565b60006040820190506140536000830185613ae4565b81810360208301526140658184614005565b90509392505050565b600081905092915050565b6000614084826124a3565b61408e818561406e565b935061409e8185602086016124bf565b80840191505092915050565b60006140b68284614079565b915081905092915050565b7f64656c656761746563616c6c0000000000000000000000000000000000000000600082015250565b60006140f7600c8361406e565b9150614102826140c1565b600c82019050919050565b6000614118826140ea565b9150819050919050565b600081905092915050565b60006141388261343f565b6141428185614122565b93506141528185602086016124bf565b80840191505092915050565b600061416a828461412d565b915081905092915050565b7f6661696c65642064656c656761746563616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b60006141d1602183613cc8565b91506141dc82614175565b604082019050919050565b60006020820190508181036000830152614200816141c4565b9050919050565b60006040828403121561421d5761421c6135eb565b5b6142276040612774565b9050600082015167ffffffffffffffff811115614247576142466135f0565b5b61425384828501613dc8565b600083015250602061426784828501613e1b565b60208301525092915050565b6000806040838503121561428a576142896122ff565b5b600061429885828601613e1b565b925050602083015167ffffffffffffffff8111156142b9576142b8612304565b5b6142c585828601614207565b9150509250929050565b7f73746174696363616c6c00000000000000000000000000000000000000000000600082015250565b6000614305600a8361406e565b9150614310826142cf565b600a82019050919050565b6000614326826142f8565b9150819050919050565b7f6661696c65642073746174696363616c6c20746f20707265636f6d70696c6500600082015250565b6000614366601f83613cc8565b915061437182614330565b602082019050919050565b6000602082019050818103600083015261439581614359565b9050919050565b7f63616c6c00000000000000000000000000000000000000000000000000000000600082015250565b60006143d260048361406e565b91506143dd8261439c565b600482019050919050565b60006143f3826143c5565b9150819050919050565b7f6661696c65642063616c6c20746f20707265636f6d70696c6500000000000000600082015250565b6000614433601983613cc8565b915061443e826143fd565b602082019050919050565b6000602082019050818103600083015261446281614426565b9050919050565b7f63616c6c636f6465000000000000000000000000000000000000000000000000600082015250565b600061449f60088361406e565b91506144aa82614469565b600882019050919050565b60006144c082614492565b9150819050919050565b7f696e76616c69642063616c6c7479706500000000000000000000000000000000600082015250565b6000614500601083613cc8565b915061450b826144ca565b602082019050919050565b6000602082019050818103600083015261452f816144f3565b9050919050565b600081549050919050565b60008190508160005260206000209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061459d57607f821691505b6020821081036145b0576145af614556565b5b50919050565b60008190508160005260206000209050919050565b600081546145d881614585565b6145e281866124ae565b945060018216600081146145fd576001811461461357614646565b60ff198316865281151560200286019350614646565b61461c856145b6565b60005b8381101561463e5781548189015260018201915060208101905061461f565b808801955050505b50505092915050565b600061465b83836145cb565b905092915050565b6000600182019050919050565b600061467b82614536565b6146858185613af3565b93508360208202850161469785614541565b8060005b858110156146d2578484038952816146b3858261464f565b94506146be83614663565b925060208a0199505060018101905061469b565b50829750879550505050505092915050565b60006060820190506146f96000830186613ae4565b61470660208301856128ca565b81810360408301526147188184614670565b9050949350505050565b7f64656c65676174696f6e20617070726f76616c206661696c6564000000000000600082015250565b6000614758601a83613cc8565b915061476382614722565b602082019050919050565b600060208201905081810360008301526147878161474b565b9050919050565b60006040820190506147a36000830185613ae4565b6147b060208301846128ca565b9392505050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b60006147ed600f83613cc8565b91506147f8826147b7565b602082019050919050565b6000602082019050818103600083015261481c816147e0565b9050919050565b60006060820190506148386000830186613ae4565b818103602083015261484a8185614005565b905061485960408301846128ca565b949350505050565b7f5374616b696e6720417070726f7665206661696c656400000000000000000000600082015250565b6000614897601683613cc8565b91506148a282614861565b602082019050919050565b600060208201905081810360008301526148c68161488a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614907826123cc565b9150614912836123cc565b925082820190508082111561492a576149296148cd565b5b92915050565b600067ffffffffffffffff82111561494b5761494a612714565b5b602082029050602081019050919050565b60008151905061496b81613696565b92915050565b600060c08284031215614987576149866135eb565b5b61499160c0612774565b905060006149a184828501613e47565b60008301525060206149b584828501613e47565b60208301525060406149c984828501613e1b565b60408301525060606149dd84828501613e1b565b60608301525060806149f18482850161495c565b60808301525060a0614a0584828501613e47565b60a08301525092915050565b6000614a24614a1f84614930565b612774565b90508083825260208201905060c08402830185811115614a4757614a46612371565b5b835b81811015614a705780614a5c8882614971565b84526020840193505060c081019050614a49565b5050509392505050565b600082601f830112614a8f57614a8e612367565b5b8151614a9f848260208601614a11565b91505092915050565b600060608284031215614abe57614abd6135eb565b5b614ac86060612774565b9050600082015167ffffffffffffffff811115614ae857614ae76135f0565b5b614af484828501613dc8565b600083015250602082015167ffffffffffffffff811115614b1857614b176135f0565b5b614b2484828501613dc8565b602083015250604082015167ffffffffffffffff811115614b4857614b476135f0565b5b614b5484828501614a7a565b60408301525092915050565b600060208284031215614b7657614b756122ff565b5b600082015167ffffffffffffffff811115614b9457614b93612304565b5b614ba084828501614aa8565b91505092915050565b6000606082019050614bbe6000830186613ae4565b8181036020830152614bd08185614005565b90508181036040830152614be48184614005565b9050949350505050565b600067ffffffffffffffff821115614c0957614c08612714565b5b602082029050602081019050919050565b600060808284031215614c3057614c2f6135eb565b5b614c3a6080612774565b90506000614c4a84828501613e47565b6000830152506020614c5e84828501613e47565b6020830152506040614c7284828501613e1b565b6040830152506060614c8684828501613e1b565b60608301525092915050565b6000614ca5614ca084614bee565b612774565b90508083825260208201905060808402830185811115614cc857614cc7612371565b5b835b81811015614cf15780614cdd8882614c1a565b845260208401935050608081019050614cca565b5050509392505050565b600082601f830112614d1057614d0f612367565b5b8151614d20848260208601614c92565b91505092915050565b600060808284031215614d3f57614d3e6135eb565b5b614d496080612774565b9050600082015167ffffffffffffffff811115614d6957614d686135f0565b5b614d7584828501613dc8565b600083015250602082015167ffffffffffffffff811115614d9957614d986135f0565b5b614da584828501613dc8565b602083015250604082015167ffffffffffffffff811115614dc957614dc86135f0565b5b614dd584828501613dc8565b604083015250606082015167ffffffffffffffff811115614df957614df86135f0565b5b614e0584828501614cfb565b60608301525092915050565b600060208284031215614e2757614e266122ff565b5b600082015167ffffffffffffffff811115614e4557614e44612304565b5b614e5184828501614d29565b91505092915050565b6000608082019050614e6f6000830187613ae4565b8181036020830152614e818186614005565b9050614e9060408301856128ca565b614e9d60608301846128ca565b95945050505050565b7f44656c656761746520417070726f7665206661696c6564000000000000000000600082015250565b6000614edc601783613cc8565b9150614ee782614ea6565b602082019050919050565b60006020820190508181036000830152614f0b81614ecf565b9050919050565b600060a08301614f256000840184613b60565b8583036000870152614f38838284613b0e565b92505050614f496020840184613b60565b8583036020870152614f5c838284613b0e565b92505050614f6d6040840184613b60565b8583036040870152614f80838284613b0e565b92505050614f916060840184613b60565b8583036060870152614fa4838284613b0e565b92505050614fb56080840184613b60565b8583036080870152614fc8838284613b0e565b925050508091505092915050565b6000614fe560208401846123ed565b905092915050565b60608201614ffe6000830183614fd6565b61500b60008501826125c5565b506150196020830183614fd6565b61502660208501826125c5565b506150346040830183614fd6565b61504160408501826125c5565b50505050565b60006101008201905081810360008301526150628189614f12565b90506150716020830188614fed565b61507e60808301876128ca565b61508b60a0830186613ae4565b81810360c083015261509d8185614005565b90506150ac60e08301846128ca565b979650505050505050565b6000602082840312156150cd576150cc6122ff565b5b60006150db84828501613e47565b91505092915050565b60006150ef826123cc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615121576151206148cd565b5b600182019050919050565b6000615137826123cc565b91506000820361514a576151496148cd565b5b600182039050919050565b600060808201905061516a6000830187613ae4565b818103602083015261517c8186614005565b905081810360408301526151908185614005565b905061519f60608301846128ca565b95945050505050565b6151b181613130565b82525050565b600060808201905081810360008301526151d18187614f12565b90506151e06020830186613ae4565b6151ed60408301856151a8565b6151fa60608301846151a8565b95945050505050565b600080833560016020038436030381126152205761521f613b5b565b5b83810192508235915060208301925067ffffffffffffffff82111561524857615247613b51565b5b60018202360383131561525e5761525d613b56565b5b509250929050565b6000615272838561344a565b935061527f8385846127c0565b615288836124e9565b840190509392505050565b60006152a260208401846136ad565b905092915050565b60006152b960208401846136d9565b905092915050565b600060a083016152d46000840184615203565b85830360008701526152e7838284615266565b925050506152f86020840184615293565b6153056020860182612aad565b506153136040840184615293565b6153206040860182612aad565b5061532e60608401846152aa565b61533b606086018261253f565b5061534960808401846152aa565b615356608086018261253f565b508091505092915050565b6000604082019050818103600083015261537b8185614005565b9050818103602083015261538f81846152c1565b90509392505050565b600067ffffffffffffffff8211156153b3576153b2612714565b5b602082029050602081019050919050565b60006153d76153d284615398565b612774565b905080838252602082019050602084028301858111156153fa576153f9612371565b5b835b8181101561544157805167ffffffffffffffff81111561541f5761541e612367565b5b80860161542c8982613e5c565b855260208501945050506020810190506153fc565b5050509392505050565b600082601f8301126154605761545f612367565b5b81516154708482602086016153c4565b91505092915050565b600061548c615487846135f5565b612774565b9050828152602081018484840111156154a8576154a761270f565b5b6154b38482856124bf565b509392505050565b600082601f8301126154d0576154cf612367565b5b81516154e0848260208601615479565b91505092915050565b6000604082840312156154ff576154fe6135eb565b5b6155096040612774565b9050600082015167ffffffffffffffff811115615529576155286135f0565b5b615535848285016154bb565b60008301525060206155498482850161495c565b60208301525092915050565b6000806040838503121561556c5761556b6122ff565b5b600083015167ffffffffffffffff81111561558a57615589612304565b5b6155968582860161544b565b925050602083015167ffffffffffffffff8111156155b7576155b6612304565b5b6155c3858286016154e9565b9150509250929050565b60006060820190506155e26000830186613ae4565b6155ef6020830185613ae4565b81810360408301526156018184614005565b9050949350505050565b600060208284031215615621576156206122ff565b5b600061562f84828501613e1b565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b6000819050602082019050919050565b600061568e83836124fa565b905092915050565b6000602082019050919050565b60006156ae82615667565b6156b88185613af3565b9350836020820285016156ca85615672565b8060005b8581101561570657848403895281516156e78582615682565b94506156f283615696565b925060208a019950506001810190506156ce565b50829750879550505050505092915050565b600060608201905061572d6000830186613ae4565b61573a60208301856128ca565b818103604083015261574c81846156a3565b9050949350505050565b7f6661696c656420746f20617070726f766520756e64656c65676174696f6e206d60008201527f6574686f64000000000000000000000000000000000000000000000000000000602082015250565b60006157b2602583613cc8565b91506157bd82615756565b604082019050919050565b600060208201905081810360008301526157e1816157a5565b9050919050565b60006040820190506157fd6000830186613ae4565b8181036020830152615810818486613bd0565b9050949350505050565b7f4661696c656420746f207265766f6b6520617070726f76616c20666f7220737460008201527f616b696e67206d6574686f647300000000000000000000000000000000000000602082015250565b6000615876602d83613cc8565b91506158818261581a565b604082019050919050565b600060208201905081810360008301526158a581615869565b9050919050565b600060a08301600083015184820360008601526158c9828261345b565b91505060208301516158de6020860182612aad565b5060408301516158f16040860182612aad565b506060830151615904606086018261253f565b506080830151615917608086018261253f565b508091505092915050565b60006080820190506159376000830187613ae4565b81810360208301526159498186614005565b9050818103604083015261595d8185614005565b9050818103606083015261597181846158ac565b905095945050505050565b600067ffffffffffffffff82111561599757615996612714565b5b602082029050602081019050919050565b6000608082840312156159be576159bd6135eb565b5b6159c86080612774565b9050600082015167ffffffffffffffff8111156159e8576159e76135f0565b5b6159f484828501613dc8565b600083015250602082015167ffffffffffffffff811115615a1857615a176135f0565b5b615a2484828501613dc8565b602083015250604082015167ffffffffffffffff811115615a4857615a476135f0565b5b615a5484828501613dc8565b604083015250606082015167ffffffffffffffff811115615a7857615a776135f0565b5b615a8484828501614cfb565b60608301525092915050565b600067ffffffffffffffff821115615aab57615aaa612714565b5b602082029050602081019050919050565b600060a08284031215615ad257615ad16135eb565b5b615adc6040612774565b90506000615aec84828501614c1a565b6000830152506080615b0084828501613e1b565b60208301525092915050565b6000615b1f615b1a84615a90565b612774565b90508083825260208201905060a08402830185811115615b4257615b41612371565b5b835b81811015615b6b5780615b578882615abc565b84526020840193505060a081019050615b44565b5050509392505050565b600082601f830112615b8a57615b89612367565b5b8151615b9a848260208601615b0c565b91505092915050565b600060408284031215615bb957615bb86135eb565b5b615bc36040612774565b9050600082015167ffffffffffffffff811115615be357615be26135f0565b5b615bef848285016159a8565b600083015250602082015167ffffffffffffffff811115615c1357615c126135f0565b5b615c1f84828501615b75565b60208301525092915050565b6000615c3e615c398461597c565b612774565b90508083825260208201905060208402830185811115615c6157615c60612371565b5b835b81811015615ca857805167ffffffffffffffff811115615c8657615c85612367565b5b808601615c938982615ba3565b85526020850194505050602081019050615c63565b5050509392505050565b600082601f830112615cc757615cc6612367565b5b8151615cd7848260208601615c2b565b91505092915050565b60008060408385031215615cf757615cf66122ff565b5b600083015167ffffffffffffffff811115615d1557615d14612304565b5b615d2185828601615cb2565b925050602083015167ffffffffffffffff811115615d4257615d41612304565b5b615d4e858286016154e9565b915050925092905056fe2f636f736d6f732e7374616b696e672e763162657461312e4d7367556e64656c6567617465a2646970667358221220610cb91a8933e1804929f56c9cd7a1adc794d98816aa48df9e694b7cd16e831b64736f6c634300081300332f636f736d6f732e7374616b696e672e763162657461312e4d736744656c6567617465", + "deployedBytecode": "0x60806040526004361061014b5760003560e01c80637e51b811116100b6578063cf2753cf1161006f578063cf2753cf146104a8578063ec9485df146104e6578063f40a214614610523578063f5714e641461054c578063f700dbd214610568578063f732b065146105915761014b565b80637e51b811146103965780638939e783146103bf5780638edb3f8b146103e85780639eab671114610404578063af9a90b21461042d578063b13d42421461046a5761014b565b806355dc4b221161010857806355dc4b2214610283578063570467ac146102ac5780635e269bfe146102e957806360deaa2a1461031257806361bc221a1461032e57806368ac3df3146103595761014b565b80630a4433e2146101505780631904bb2e1461017957806319b16c4c146101b657806331bcbcb3146101f45780633566cb951461021d578063455b855114610246575b600080fd5b34801561015c57600080fd5b5061017760048036038101906101729190612402565b6105cf565b005b34801561018557600080fd5b506101a0600480360381019061019b9190612476565b61069e565b6040516101ad91906126ed565b60405180910390f35b3480156101c257600080fd5b506101dd60048036038101906101d8919061283f565b61072e565b6040516101eb929190612916565b60405180910390f35b34801561020057600080fd5b5061021b60048036038101906102169190612946565b610c2d565b005b34801561022957600080fd5b50610244600480360381019061023f91906129b5565b610eba565b005b34801561025257600080fd5b5061026d60048036038101906102689190612a11565b611022565b60405161027a9190612c18565b60405180910390f35b34801561028f57600080fd5b506102aa60048036038101906102a59190612c3a565b6110b5565b005b3480156102b857600080fd5b506102d360048036038101906102ce919061283f565b6114a7565b6040516102e09190612e55565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190612e77565b61153d565b005b61032c60048036038101906103279190612efa565b6115c8565b005b34801561033a57600080fd5b50610343611716565b6040516103509190612f43565b60405180910390f35b34801561036557600080fd5b50610380600480360381019061037b9190612fa1565b61171c565b60405161038d9190613076565b60405180910390f35b3480156103a257600080fd5b506103bd60048036038101906103b89190612946565b6117b2565b005b3480156103cb57600080fd5b506103e660048036038101906103e19190612946565b61183a565b005b61040260048036038101906103fd9190612efa565b6118f0565b005b34801561041057600080fd5b5061042b60048036038101906104269190613091565b611a85565b005b34801561043957600080fd5b50610454600480360381019061044f9190613166565b611b10565b6040516104619190613076565b60405180910390f35b34801561047657600080fd5b50610491600480360381019061048c9190613208565b611ba0565b60405161049f9291906134d1565b60405180910390f35b3480156104b457600080fd5b506104cf60048036038101906104ca9190612a11565b611c38565b6040516104dd929190612916565b60405180910390f35b3480156104f257600080fd5b5061050d60048036038101906105089190612a11565b611cd0565b60405161051a9190612f43565b60405180910390f35b34801561052f57600080fd5b5061054a60048036038101906105459190613508565b611d5a565b005b61056660048036038101906105619190612efa565b611f36565b005b34801561057457600080fd5b5061058f600480360381019061058a919061358b565b612090565b005b34801561059d57600080fd5b506105b860048036038101906105b39190613796565b61215c565b6040516105c6929190613aad565b60405180910390f35b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895868487876040518563ffffffff1660e01b81526004016106129493929190613c46565b6020604051808303816000875af1158015610631573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106559190613c9b565b905080610697576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068e90613d4b565b60405180910390fd5b5050505050565b6106a66121fa565b61080073ffffffffffffffffffffffffffffffffffffffff1663223b3b7a836040518263ffffffff1660e01b81526004016106e19190613d6b565b600060405180830381865afa1580156106fe573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906107279190613fbc565b9050919050565b600061073861226e565b600061080090506000868660405160240161075492919061403e565b6040516020818303038152906040527f241774e6000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000856040516020016107e691906140aa565b60405160208183030381529060405280519060200120905060405160200161080d9061410d565b6040516020818303038152906040528051906020012081036108f9576000808473ffffffffffffffffffffffffffffffffffffffff1684604051610851919061415e565b600060405180830381855af49150503d806000811461088c576040519150601f19603f3d011682016040523d82523d6000602084013e610891565b606091505b5091509150816108d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cd906141e7565b60405180910390fd5b808060200190518101906108ea9190614273565b80975081985050505050610c22565b6040516020016109089061431b565b6040516020818303038152906040528051906020012081036109f4576000808473ffffffffffffffffffffffffffffffffffffffff168460405161094c919061415e565b600060405180830381855afa9150503d8060008114610987576040519150601f19603f3d011682016040523d82523d6000602084013e61098c565b606091505b5091509150816109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c89061437c565b60405180910390fd5b808060200190518101906109e59190614273565b80975081985050505050610c21565b604051602001610a03906143e8565b604051602081830303815290604052805190602001208103610af1576000808473ffffffffffffffffffffffffffffffffffffffff1684604051610a47919061415e565b6000604051808303816000865af19150503d8060008114610a84576040519150601f19603f3d011682016040523d82523d6000602084013e610a89565b606091505b509150915081610ace576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac590614449565b60405180910390fd5b80806020019051810190610ae29190614273565b80975081985050505050610c20565b604051602001610b00906144b5565b604051602081830303815290604052805190602001208103610be45760006040518060400160405280601a81526020017f64656c65676174696f6e28616464726573732c737472696e6729000000000000815250805190602001209050600060a490506060600060208b01516020808d0101516040518681528e6004820152604060248201526033604482015282606482015281608482015260c081878360008e5af281519c5060608201519450610100820160405280610bc057600080fd5b50505050604051806040016040528083815260200182815250975050505050610c1f565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1690614516565b60405180910390fd5b5b5b5b505050935093915050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610c6f939291906146e4565b6020604051808303816000875af1158015610c8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb29190613c9b565b905080610cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ceb9061476e565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff163384604051602401610d2092919061478e565b6040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610daa919061415e565b6000604051808303816000865af19150503d8060008114610de7576040519150601f19603f3d011682016040523d82523d6000602084013e610dec565b606091505b5050905080610e30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2790614803565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3386866040518463ffffffff1660e01b8152600401610e6f93929190614823565b6020604051808303816000875af1158015610e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb29190613c9b565b505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895308460016040518463ffffffff1660e01b8152600401610efc939291906146e4565b6020604051808303816000875af1158015610f1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3f9190613c9b565b905080610f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f78906148ad565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3085856040518463ffffffff1660e01b8152600401610fc093929190614823565b6020604051808303816000875af1158015610fdf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110039190613c9b565b50600160008082825461101691906148fc565b92505081905550505050565b61102a612288565b61080073ffffffffffffffffffffffffffffffffffffffff1663a03ffee184846040518363ffffffff1660e01b815260040161106792919061403e565b600060405180830381865afa158015611084573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110ad9190614b60565b905092915050565b6000610800905060008585856040516024016110d393929190614823565b6040516020818303038152906040527f3edab33c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060008360405160200161116591906140aa565b60405160208183030381529060405280519060200120905060405160200161118c9061410d565b6040516020818303038152906040528051906020012081036112595760008373ffffffffffffffffffffffffffffffffffffffff16836040516111cf919061415e565b600060405180830381855af49150503d806000811461120a576040519150601f19603f3d011682016040523d82523d6000602084013e61120f565b606091505b5050905080611253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124a906141e7565b60405180910390fd5b5061149e565b6040516020016112689061431b565b6040516020818303038152906040528051906020012081036113355760008373ffffffffffffffffffffffffffffffffffffffff16836040516112ab919061415e565b600060405180830381855afa9150503d80600081146112e6576040519150601f19603f3d011682016040523d82523d6000602084013e6112eb565b606091505b505090508061132f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113269061437c565b60405180910390fd5b5061149d565b604051602001611344906143e8565b6040516020818303038152906040528051906020012081036114135760008373ffffffffffffffffffffffffffffffffffffffff1683604051611387919061415e565b6000604051808303816000865af19150503d80600081146113c4576040519150601f19603f3d011682016040523d82523d6000602084013e6113c9565b606091505b505090508061140d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140490614449565b60405180910390fd5b5061149c565b604051602001611422906144b5565b6040516020818303038152906040528051906020012081036114605760208201825160008082846000895af28061145857600080fd5b50505061149b565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149290614516565b60405180910390fd5b5b5b5b50505050505050565b6114af6122a9565b61080073ffffffffffffffffffffffffffffffffffffffff16637d9f939c8585856040518463ffffffff1660e01b81526004016114ee93929190614ba9565b600060405180830381865afa15801561150b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906115349190614e11565b90509392505050565b61080073ffffffffffffffffffffffffffffffffffffffff166312d58dfe858585856040518563ffffffff1660e01b815260040161157e9493929190614e5a565b6020604051808303816000875af115801561159d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c19190613c9b565b5050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895303460016040518463ffffffff1660e01b815260040161160a939291906146e4565b6020604051808303816000875af1158015611629573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164d9190613c9b565b90508061168f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168690614ef2565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b81526004016116ce93929190614823565b6020604051808303816000875af11580156116ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117119190613c9b565b505050565b60005481565b600061080073ffffffffffffffffffffffffffffffffffffffff1663f7cd55168888888888886040518763ffffffff1660e01b815260040161176396959493929190615047565b6020604051808303816000875af1158015611782573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a69190613c9b565b90509695505050505050565b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c8484846040518463ffffffff1660e01b81526004016117f193929190614823565b6020604051808303816000875af1158015611810573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061183491906150b7565b50505050565b60008081548092919061184c906150e4565b919050555061080073ffffffffffffffffffffffffffffffffffffffff166353266bbb8484846040518463ffffffff1660e01b815260040161189093929190614823565b6020604051808303816000875af11580156118af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d39190613c9b565b506000808154809291906118e69061512c565b9190505550505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b8152600401611932939291906146e4565b6020604051808303816000875af1158015611951573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119759190613c9b565b9050806119b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ae90614ef2565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3084346040518463ffffffff1660e01b81526004016119f693929190614823565b6020604051808303816000875af1158015611a15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a399190613c9b565b503373ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611a80573d6000803e3d6000fd5b505050565b61080073ffffffffffffffffffffffffffffffffffffffff166354b826f5858585856040518563ffffffff1660e01b8152600401611ac69493929190615155565b6020604051808303816000875af1158015611ae5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0991906150b7565b5050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663a50f05ac868686866040518563ffffffff1660e01b8152600401611b5394939291906151b7565b6020604051808303816000875af1158015611b72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b969190613c9b565b9050949350505050565b6060611baa6122d1565b61080073ffffffffffffffffffffffffffffffffffffffff1663186b216785856040518363ffffffff1660e01b8152600401611be7929190615361565b600060405180830381865afa158015611c04573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611c2d9190615555565b915091509250929050565b6000611c4261226e565b61080073ffffffffffffffffffffffffffffffffffffffff1663241774e685856040518363ffffffff1660e01b8152600401611c7f92919061403e565b600060405180830381865afa158015611c9c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611cc59190614273565b915091509250929050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663fc08930c8433856040518463ffffffff1660e01b8152600401611d11939291906155cd565b602060405180830381865afa158015611d2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d52919061560b565b905092915050565b6000600167ffffffffffffffff811115611d7757611d76612714565b5b604051908082528060200260200182016040528015611daa57816020015b6060815260200190600190039081611d955790505b509050604051806060016040528060258152602001615d596025913981600081518110611dda57611dd9615638565b5b6020026020010181905250600061080073ffffffffffffffffffffffffffffffffffffffff1663b60398958787856040518463ffffffff1660e01b8152600401611e2693929190615718565b6020604051808303816000875af1158015611e45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e699190613c9b565b905080611eab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea2906157c8565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff16633edab33c3285876040518463ffffffff1660e01b8152600401611eea93929190614823565b6020604051808303816000875af1158015611f09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f2d91906150b7565b50505050505050565b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895323460016040518463ffffffff1660e01b8152600401611f78939291906146e4565b6020604051808303816000875af1158015611f97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fbb9190613c9b565b905080611ffd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff490614ef2565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb308460013461202a91906148fc565b6040518463ffffffff1660e01b815260040161204893929190614823565b6020604051808303816000875af1158015612067573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208b9190613c9b565b505050565b600061080073ffffffffffffffffffffffffffffffffffffffff166361dc5c3b8585856040518463ffffffff1660e01b81526004016120d1939291906157e8565b6020604051808303816000875af11580156120f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121149190613c9b565b905080612156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214d9061588c565b60405180910390fd5b50505050565b60606121666122d1565b61080073ffffffffffffffffffffffffffffffffffffffff166310a2851c878787876040518563ffffffff1660e01b81526004016121a79493929190615922565b600060405180830381865afa1580156121c4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906121ed9190615ce0565b9150915094509492505050565b6040518061016001604052806060815260200160608152602001600015158152602001600060038111156122315761223061254e565b5b8152602001600081526020016000815260200160608152602001600060070b8152602001600060070b815260200160008152602001600081525090565b604051806040016040528060608152602001600081525090565b60405180606001604052806060815260200160608152602001606081525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061233482612309565b9050919050565b61234481612329565b811461234f57600080fd5b50565b6000813590506123618161233b565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261238c5761238b612367565b5b8235905067ffffffffffffffff8111156123a9576123a861236c565b5b6020830191508360208202830111156123c5576123c4612371565b5b9250929050565b6000819050919050565b6123df816123cc565b81146123ea57600080fd5b50565b6000813590506123fc816123d6565b92915050565b6000806000806060858703121561241c5761241b6122ff565b5b600061242a87828801612352565b945050602085013567ffffffffffffffff81111561244b5761244a612304565b5b61245787828801612376565b9350935050604061246a878288016123ed565b91505092959194509250565b60006020828403121561248c5761248b6122ff565b5b600061249a84828501612352565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156124dd5780820151818401526020810190506124c2565b60008484015250505050565b6000601f19601f8301169050919050565b6000612505826124a3565b61250f81856124ae565b935061251f8185602086016124bf565b612528816124e9565b840191505092915050565b60008115159050919050565b61254881612533565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004811061258e5761258d61254e565b5b50565b600081905061259f8261257d565b919050565b60006125af82612591565b9050919050565b6125bf816125a4565b82525050565b6125ce816123cc565b82525050565b60008160070b9050919050565b6125ea816125d4565b82525050565b600061016083016000830151848203600086015261260e82826124fa565b9150506020830151848203602086015261262882826124fa565b915050604083015161263d604086018261253f565b50606083015161265060608601826125b6565b50608083015161266360808601826125c5565b5060a083015161267660a08601826125c5565b5060c083015184820360c086015261268e82826124fa565b91505060e08301516126a360e08601826125e1565b506101008301516126b86101008601826125e1565b506101208301516126cd6101208601826125c5565b506101408301516126e26101408601826125c5565b508091505092915050565b6000602082019050818103600083015261270781846125f0565b905092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61274c826124e9565b810181811067ffffffffffffffff8211171561276b5761276a612714565b5b80604052505050565b600061277e6122f5565b905061278a8282612743565b919050565b600067ffffffffffffffff8211156127aa576127a9612714565b5b6127b3826124e9565b9050602081019050919050565b82818337600083830152505050565b60006127e26127dd8461278f565b612774565b9050828152602081018484840111156127fe576127fd61270f565b5b6128098482856127c0565b509392505050565b600082601f83011261282657612825612367565b5b81356128368482602086016127cf565b91505092915050565b600080600060608486031215612858576128576122ff565b5b600061286686828701612352565b935050602084013567ffffffffffffffff81111561288757612886612304565b5b61289386828701612811565b925050604084013567ffffffffffffffff8111156128b4576128b3612304565b5b6128c086828701612811565b9150509250925092565b6128d3816123cc565b82525050565b600060408301600083015184820360008601526128f682826124fa565b915050602083015161290b60208601826125c5565b508091505092915050565b600060408201905061292b60008301856128ca565b818103602083015261293d81846128d9565b90509392505050565b60008060006060848603121561295f5761295e6122ff565b5b600061296d86828701612352565b935050602084013567ffffffffffffffff81111561298e5761298d612304565b5b61299a86828701612811565b92505060406129ab868287016123ed565b9150509250925092565b600080604083850312156129cc576129cb6122ff565b5b600083013567ffffffffffffffff8111156129ea576129e9612304565b5b6129f685828601612811565b9250506020612a07858286016123ed565b9150509250929050565b60008060408385031215612a2857612a276122ff565b5b6000612a3685828601612352565b925050602083013567ffffffffffffffff811115612a5757612a56612304565b5b612a6385828601612811565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600067ffffffffffffffff82169050919050565b612ab681612a99565b82525050565b60c082016000820151612ad260008501826125e1565b506020820151612ae560208501826125e1565b506040820151612af860408501826125c5565b506060820151612b0b60608501826125c5565b506080820151612b1e6080850182612aad565b5060a0820151612b3160a08501826125e1565b50505050565b6000612b438383612abc565b60c08301905092915050565b6000602082019050919050565b6000612b6782612a6d565b612b718185612a78565b9350612b7c83612a89565b8060005b83811015612bad578151612b948882612b37565b9750612b9f83612b4f565b925050600181019050612b80565b5085935050505092915050565b60006060830160008301518482036000860152612bd782826124fa565b91505060208301518482036020860152612bf182826124fa565b91505060408301518482036040860152612c0b8282612b5c565b9150508091505092915050565b60006020820190508181036000830152612c328184612bba565b905092915050565b60008060008060808587031215612c5457612c536122ff565b5b6000612c6287828801612352565b945050602085013567ffffffffffffffff811115612c8357612c82612304565b5b612c8f87828801612811565b9350506040612ca0878288016123ed565b925050606085013567ffffffffffffffff811115612cc157612cc0612304565b5b612ccd87828801612811565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b608082016000820151612d1b60008501826125e1565b506020820151612d2e60208501826125e1565b506040820151612d4160408501826125c5565b506060820151612d5460608501826125c5565b50505050565b6000612d668383612d05565b60808301905092915050565b6000602082019050919050565b6000612d8a82612cd9565b612d948185612ce4565b9350612d9f83612cf5565b8060005b83811015612dd0578151612db78882612d5a565b9750612dc283612d72565b925050600181019050612da3565b5085935050505092915050565b60006080830160008301518482036000860152612dfa82826124fa565b91505060208301518482036020860152612e1482826124fa565b91505060408301518482036040860152612e2e82826124fa565b91505060608301518482036060860152612e488282612d7f565b9150508091505092915050565b60006020820190508181036000830152612e6f8184612ddd565b905092915050565b60008060008060808587031215612e9157612e906122ff565b5b6000612e9f87828801612352565b945050602085013567ffffffffffffffff811115612ec057612ebf612304565b5b612ecc87828801612811565b9350506040612edd878288016123ed565b9250506060612eee878288016123ed565b91505092959194509250565b600060208284031215612f1057612f0f6122ff565b5b600082013567ffffffffffffffff811115612f2e57612f2d612304565b5b612f3a84828501612811565b91505092915050565b6000602082019050612f5860008301846128ca565b92915050565b600080fd5b600060a08284031215612f7957612f78612f5e565b5b81905092915050565b600060608284031215612f9857612f97612f5e565b5b81905092915050565b6000806000806000806101008789031215612fbf57612fbe6122ff565b5b600087013567ffffffffffffffff811115612fdd57612fdc612304565b5b612fe989828a01612f63565b9650506020612ffa89828a01612f82565b955050608061300b89828a016123ed565b94505060a061301c89828a01612352565b93505060c087013567ffffffffffffffff81111561303d5761303c612304565b5b61304989828a01612811565b92505060e061305a89828a016123ed565b9150509295509295509295565b61307081612533565b82525050565b600060208201905061308b6000830184613067565b92915050565b600080600080608085870312156130ab576130aa6122ff565b5b60006130b987828801612352565b945050602085013567ffffffffffffffff8111156130da576130d9612304565b5b6130e687828801612811565b935050604085013567ffffffffffffffff81111561310757613106612304565b5b61311387828801612811565b9250506060613124878288016123ed565b91505092959194509250565b6000819050919050565b61314381613130565b811461314e57600080fd5b50565b6000813590506131608161313a565b92915050565b600080600080608085870312156131805761317f6122ff565b5b600085013567ffffffffffffffff81111561319e5761319d612304565b5b6131aa87828801612f63565b94505060206131bb87828801612352565b93505060406131cc87828801613151565b92505060606131dd87828801613151565b91505092959194509250565b600060a082840312156131ff576131fe612f5e565b5b81905092915050565b6000806040838503121561321f5761321e6122ff565b5b600083013567ffffffffffffffff81111561323d5761323c612304565b5b61324985828601612811565b925050602083013567ffffffffffffffff81111561326a57613269612304565b5b613276858286016131e9565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006101608301600083015184820360008601526132ca82826124fa565b915050602083015184820360208601526132e482826124fa565b91505060408301516132f9604086018261253f565b50606083015161330c60608601826125b6565b50608083015161331f60808601826125c5565b5060a083015161333260a08601826125c5565b5060c083015184820360c086015261334a82826124fa565b91505060e083015161335f60e08601826125e1565b506101008301516133746101008601826125e1565b506101208301516133896101208601826125c5565b5061014083015161339e6101408601826125c5565b508091505092915050565b60006133b583836132ac565b905092915050565b6000602082019050919050565b60006133d582613280565b6133df818561328b565b9350836020820285016133f18561329c565b8060005b8581101561342d578484038952815161340e85826133a9565b9450613419836133bd565b925060208a019950506001810190506133f5565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b60006134668261343f565b613470818561344a565b93506134808185602086016124bf565b613489816124e9565b840191505092915050565b600060408301600083015184820360008601526134b1828261345b565b91505060208301516134c66020860182612aad565b508091505092915050565b600060408201905081810360008301526134eb81856133ca565b905081810360208301526134ff8184613494565b90509392505050565b60008060008060808587031215613522576135216122ff565b5b600061353087828801612352565b9450506020613541878288016123ed565b9350506040613552878288016123ed565b925050606085013567ffffffffffffffff81111561357357613572612304565b5b61357f87828801612811565b91505092959194509250565b6000806000604084860312156135a4576135a36122ff565b5b60006135b286828701612352565b935050602084013567ffffffffffffffff8111156135d3576135d2612304565b5b6135df86828701612376565b92509250509250925092565b600080fd5b600080fd5b600067ffffffffffffffff8211156136105761360f612714565b5b613619826124e9565b9050602081019050919050565b6000613639613634846135f5565b612774565b9050828152602081018484840111156136555761365461270f565b5b6136608482856127c0565b509392505050565b600082601f83011261367d5761367c612367565b5b813561368d848260208601613626565b91505092915050565b61369f81612a99565b81146136aa57600080fd5b50565b6000813590506136bc81613696565b92915050565b6136cb81612533565b81146136d657600080fd5b50565b6000813590506136e8816136c2565b92915050565b600060a08284031215613704576137036135eb565b5b61370e60a0612774565b9050600082013567ffffffffffffffff81111561372e5761372d6135f0565b5b61373a84828501613668565b600083015250602061374e848285016136ad565b6020830152506040613762848285016136ad565b6040830152506060613776848285016136d9565b606083015250608061378a848285016136d9565b60808301525092915050565b600080600080608085870312156137b0576137af6122ff565b5b60006137be87828801612352565b945050602085013567ffffffffffffffff8111156137df576137de612304565b5b6137eb87828801612811565b935050604085013567ffffffffffffffff81111561380c5761380b612304565b5b61381887828801612811565b925050606085013567ffffffffffffffff81111561383957613838612304565b5b613845878288016136ee565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000608083016000830151848203600086015261389a82826124fa565b915050602083015184820360208601526138b482826124fa565b915050604083015184820360408601526138ce82826124fa565b915050606083015184820360608601526138e88282612d7f565b9150508091505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60a0820160008201516139376000850182612d05565b50602082015161394a60808501826125c5565b50505050565b600061395c8383613921565b60a08301905092915050565b6000602082019050919050565b6000613980826138f5565b61398a8185613900565b935061399583613911565b8060005b838110156139c65781516139ad8882613950565b97506139b883613968565b925050600181019050613999565b5085935050505092915050565b600060408301600083015184820360008601526139f0828261387d565b91505060208301518482036020860152613a0a8282613975565b9150508091505092915050565b6000613a2383836139d3565b905092915050565b6000602082019050919050565b6000613a4382613851565b613a4d818561385c565b935083602082028501613a5f8561386d565b8060005b85811015613a9b5784840389528151613a7c8582613a17565b9450613a8783613a2b565b925060208a01995050600181019050613a63565b50829750879550505050505092915050565b60006040820190508181036000830152613ac78185613a38565b90508181036020830152613adb8184613494565b90509392505050565b613aed81612329565b82525050565b600082825260208201905092915050565b6000819050919050565b6000613b1a83856124ae565b9350613b278385846127c0565b613b30836124e9565b840190509392505050565b6000613b48848484613b0e565b90509392505050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112613b7d57613b7c613b5b565b5b83810192508235915060208301925067ffffffffffffffff821115613ba557613ba4613b51565b5b600182023603831315613bbb57613bba613b56565b5b509250929050565b6000602082019050919050565b6000613bdc8385613af3565b935083602084028501613bee84613b04565b8060005b87811015613c34578484038952613c098284613b60565b613c14868284613b3b565b9550613c1f84613bc3565b935060208b019a505050600181019050613bf2565b50829750879450505050509392505050565b6000606082019050613c5b6000830187613ae4565b613c6860208301866128ca565b8181036040830152613c7b818486613bd0565b905095945050505050565b600081519050613c95816136c2565b92915050565b600060208284031215613cb157613cb06122ff565b5b6000613cbf84828501613c86565b91505092915050565b600082825260208201905092915050565b7f4661696c656420746f20617070726f7665207374616b696e67206d6574686f6460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d35602183613cc8565b9150613d4082613cd9565b604082019050919050565b60006020820190508181036000830152613d6481613d28565b9050919050565b6000602082019050613d806000830184613ae4565b92915050565b6000613d99613d948461278f565b612774565b905082815260208101848484011115613db557613db461270f565b5b613dc08482856124bf565b509392505050565b600082601f830112613ddd57613ddc612367565b5b8151613ded848260208601613d86565b91505092915050565b60048110613e0357600080fd5b50565b600081519050613e1581613df6565b92915050565b600081519050613e2a816123d6565b92915050565b613e39816125d4565b8114613e4457600080fd5b50565b600081519050613e5681613e30565b92915050565b60006101608284031215613e7357613e726135eb565b5b613e7e610160612774565b9050600082015167ffffffffffffffff811115613e9e57613e9d6135f0565b5b613eaa84828501613dc8565b600083015250602082015167ffffffffffffffff811115613ece57613ecd6135f0565b5b613eda84828501613dc8565b6020830152506040613eee84828501613c86565b6040830152506060613f0284828501613e06565b6060830152506080613f1684828501613e1b565b60808301525060a0613f2a84828501613e1b565b60a08301525060c082015167ffffffffffffffff811115613f4e57613f4d6135f0565b5b613f5a84828501613dc8565b60c08301525060e0613f6e84828501613e47565b60e083015250610100613f8384828501613e47565b61010083015250610120613f9984828501613e1b565b61012083015250610140613faf84828501613e1b565b6101408301525092915050565b600060208284031215613fd257613fd16122ff565b5b600082015167ffffffffffffffff811115613ff057613fef612304565b5b613ffc84828501613e5c565b91505092915050565b6000614010826124a3565b61401a8185613cc8565b935061402a8185602086016124bf565b614033816124e9565b840191505092915050565b60006040820190506140536000830185613ae4565b81810360208301526140658184614005565b90509392505050565b600081905092915050565b6000614084826124a3565b61408e818561406e565b935061409e8185602086016124bf565b80840191505092915050565b60006140b68284614079565b915081905092915050565b7f64656c656761746563616c6c0000000000000000000000000000000000000000600082015250565b60006140f7600c8361406e565b9150614102826140c1565b600c82019050919050565b6000614118826140ea565b9150819050919050565b600081905092915050565b60006141388261343f565b6141428185614122565b93506141528185602086016124bf565b80840191505092915050565b600061416a828461412d565b915081905092915050565b7f6661696c65642064656c656761746563616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b60006141d1602183613cc8565b91506141dc82614175565b604082019050919050565b60006020820190508181036000830152614200816141c4565b9050919050565b60006040828403121561421d5761421c6135eb565b5b6142276040612774565b9050600082015167ffffffffffffffff811115614247576142466135f0565b5b61425384828501613dc8565b600083015250602061426784828501613e1b565b60208301525092915050565b6000806040838503121561428a576142896122ff565b5b600061429885828601613e1b565b925050602083015167ffffffffffffffff8111156142b9576142b8612304565b5b6142c585828601614207565b9150509250929050565b7f73746174696363616c6c00000000000000000000000000000000000000000000600082015250565b6000614305600a8361406e565b9150614310826142cf565b600a82019050919050565b6000614326826142f8565b9150819050919050565b7f6661696c65642073746174696363616c6c20746f20707265636f6d70696c6500600082015250565b6000614366601f83613cc8565b915061437182614330565b602082019050919050565b6000602082019050818103600083015261439581614359565b9050919050565b7f63616c6c00000000000000000000000000000000000000000000000000000000600082015250565b60006143d260048361406e565b91506143dd8261439c565b600482019050919050565b60006143f3826143c5565b9150819050919050565b7f6661696c65642063616c6c20746f20707265636f6d70696c6500000000000000600082015250565b6000614433601983613cc8565b915061443e826143fd565b602082019050919050565b6000602082019050818103600083015261446281614426565b9050919050565b7f63616c6c636f6465000000000000000000000000000000000000000000000000600082015250565b600061449f60088361406e565b91506144aa82614469565b600882019050919050565b60006144c082614492565b9150819050919050565b7f696e76616c69642063616c6c7479706500000000000000000000000000000000600082015250565b6000614500601083613cc8565b915061450b826144ca565b602082019050919050565b6000602082019050818103600083015261452f816144f3565b9050919050565b600081549050919050565b60008190508160005260206000209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061459d57607f821691505b6020821081036145b0576145af614556565b5b50919050565b60008190508160005260206000209050919050565b600081546145d881614585565b6145e281866124ae565b945060018216600081146145fd576001811461461357614646565b60ff198316865281151560200286019350614646565b61461c856145b6565b60005b8381101561463e5781548189015260018201915060208101905061461f565b808801955050505b50505092915050565b600061465b83836145cb565b905092915050565b6000600182019050919050565b600061467b82614536565b6146858185613af3565b93508360208202850161469785614541565b8060005b858110156146d2578484038952816146b3858261464f565b94506146be83614663565b925060208a0199505060018101905061469b565b50829750879550505050505092915050565b60006060820190506146f96000830186613ae4565b61470660208301856128ca565b81810360408301526147188184614670565b9050949350505050565b7f64656c65676174696f6e20617070726f76616c206661696c6564000000000000600082015250565b6000614758601a83613cc8565b915061476382614722565b602082019050919050565b600060208201905081810360008301526147878161474b565b9050919050565b60006040820190506147a36000830185613ae4565b6147b060208301846128ca565b9392505050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b60006147ed600f83613cc8565b91506147f8826147b7565b602082019050919050565b6000602082019050818103600083015261481c816147e0565b9050919050565b60006060820190506148386000830186613ae4565b818103602083015261484a8185614005565b905061485960408301846128ca565b949350505050565b7f5374616b696e6720417070726f7665206661696c656400000000000000000000600082015250565b6000614897601683613cc8565b91506148a282614861565b602082019050919050565b600060208201905081810360008301526148c68161488a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614907826123cc565b9150614912836123cc565b925082820190508082111561492a576149296148cd565b5b92915050565b600067ffffffffffffffff82111561494b5761494a612714565b5b602082029050602081019050919050565b60008151905061496b81613696565b92915050565b600060c08284031215614987576149866135eb565b5b61499160c0612774565b905060006149a184828501613e47565b60008301525060206149b584828501613e47565b60208301525060406149c984828501613e1b565b60408301525060606149dd84828501613e1b565b60608301525060806149f18482850161495c565b60808301525060a0614a0584828501613e47565b60a08301525092915050565b6000614a24614a1f84614930565b612774565b90508083825260208201905060c08402830185811115614a4757614a46612371565b5b835b81811015614a705780614a5c8882614971565b84526020840193505060c081019050614a49565b5050509392505050565b600082601f830112614a8f57614a8e612367565b5b8151614a9f848260208601614a11565b91505092915050565b600060608284031215614abe57614abd6135eb565b5b614ac86060612774565b9050600082015167ffffffffffffffff811115614ae857614ae76135f0565b5b614af484828501613dc8565b600083015250602082015167ffffffffffffffff811115614b1857614b176135f0565b5b614b2484828501613dc8565b602083015250604082015167ffffffffffffffff811115614b4857614b476135f0565b5b614b5484828501614a7a565b60408301525092915050565b600060208284031215614b7657614b756122ff565b5b600082015167ffffffffffffffff811115614b9457614b93612304565b5b614ba084828501614aa8565b91505092915050565b6000606082019050614bbe6000830186613ae4565b8181036020830152614bd08185614005565b90508181036040830152614be48184614005565b9050949350505050565b600067ffffffffffffffff821115614c0957614c08612714565b5b602082029050602081019050919050565b600060808284031215614c3057614c2f6135eb565b5b614c3a6080612774565b90506000614c4a84828501613e47565b6000830152506020614c5e84828501613e47565b6020830152506040614c7284828501613e1b565b6040830152506060614c8684828501613e1b565b60608301525092915050565b6000614ca5614ca084614bee565b612774565b90508083825260208201905060808402830185811115614cc857614cc7612371565b5b835b81811015614cf15780614cdd8882614c1a565b845260208401935050608081019050614cca565b5050509392505050565b600082601f830112614d1057614d0f612367565b5b8151614d20848260208601614c92565b91505092915050565b600060808284031215614d3f57614d3e6135eb565b5b614d496080612774565b9050600082015167ffffffffffffffff811115614d6957614d686135f0565b5b614d7584828501613dc8565b600083015250602082015167ffffffffffffffff811115614d9957614d986135f0565b5b614da584828501613dc8565b602083015250604082015167ffffffffffffffff811115614dc957614dc86135f0565b5b614dd584828501613dc8565b604083015250606082015167ffffffffffffffff811115614df957614df86135f0565b5b614e0584828501614cfb565b60608301525092915050565b600060208284031215614e2757614e266122ff565b5b600082015167ffffffffffffffff811115614e4557614e44612304565b5b614e5184828501614d29565b91505092915050565b6000608082019050614e6f6000830187613ae4565b8181036020830152614e818186614005565b9050614e9060408301856128ca565b614e9d60608301846128ca565b95945050505050565b7f44656c656761746520417070726f7665206661696c6564000000000000000000600082015250565b6000614edc601783613cc8565b9150614ee782614ea6565b602082019050919050565b60006020820190508181036000830152614f0b81614ecf565b9050919050565b600060a08301614f256000840184613b60565b8583036000870152614f38838284613b0e565b92505050614f496020840184613b60565b8583036020870152614f5c838284613b0e565b92505050614f6d6040840184613b60565b8583036040870152614f80838284613b0e565b92505050614f916060840184613b60565b8583036060870152614fa4838284613b0e565b92505050614fb56080840184613b60565b8583036080870152614fc8838284613b0e565b925050508091505092915050565b6000614fe560208401846123ed565b905092915050565b60608201614ffe6000830183614fd6565b61500b60008501826125c5565b506150196020830183614fd6565b61502660208501826125c5565b506150346040830183614fd6565b61504160408501826125c5565b50505050565b60006101008201905081810360008301526150628189614f12565b90506150716020830188614fed565b61507e60808301876128ca565b61508b60a0830186613ae4565b81810360c083015261509d8185614005565b90506150ac60e08301846128ca565b979650505050505050565b6000602082840312156150cd576150cc6122ff565b5b60006150db84828501613e47565b91505092915050565b60006150ef826123cc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615121576151206148cd565b5b600182019050919050565b6000615137826123cc565b91506000820361514a576151496148cd565b5b600182039050919050565b600060808201905061516a6000830187613ae4565b818103602083015261517c8186614005565b905081810360408301526151908185614005565b905061519f60608301846128ca565b95945050505050565b6151b181613130565b82525050565b600060808201905081810360008301526151d18187614f12565b90506151e06020830186613ae4565b6151ed60408301856151a8565b6151fa60608301846151a8565b95945050505050565b600080833560016020038436030381126152205761521f613b5b565b5b83810192508235915060208301925067ffffffffffffffff82111561524857615247613b51565b5b60018202360383131561525e5761525d613b56565b5b509250929050565b6000615272838561344a565b935061527f8385846127c0565b615288836124e9565b840190509392505050565b60006152a260208401846136ad565b905092915050565b60006152b960208401846136d9565b905092915050565b600060a083016152d46000840184615203565b85830360008701526152e7838284615266565b925050506152f86020840184615293565b6153056020860182612aad565b506153136040840184615293565b6153206040860182612aad565b5061532e60608401846152aa565b61533b606086018261253f565b5061534960808401846152aa565b615356608086018261253f565b508091505092915050565b6000604082019050818103600083015261537b8185614005565b9050818103602083015261538f81846152c1565b90509392505050565b600067ffffffffffffffff8211156153b3576153b2612714565b5b602082029050602081019050919050565b60006153d76153d284615398565b612774565b905080838252602082019050602084028301858111156153fa576153f9612371565b5b835b8181101561544157805167ffffffffffffffff81111561541f5761541e612367565b5b80860161542c8982613e5c565b855260208501945050506020810190506153fc565b5050509392505050565b600082601f8301126154605761545f612367565b5b81516154708482602086016153c4565b91505092915050565b600061548c615487846135f5565b612774565b9050828152602081018484840111156154a8576154a761270f565b5b6154b38482856124bf565b509392505050565b600082601f8301126154d0576154cf612367565b5b81516154e0848260208601615479565b91505092915050565b6000604082840312156154ff576154fe6135eb565b5b6155096040612774565b9050600082015167ffffffffffffffff811115615529576155286135f0565b5b615535848285016154bb565b60008301525060206155498482850161495c565b60208301525092915050565b6000806040838503121561556c5761556b6122ff565b5b600083015167ffffffffffffffff81111561558a57615589612304565b5b6155968582860161544b565b925050602083015167ffffffffffffffff8111156155b7576155b6612304565b5b6155c3858286016154e9565b9150509250929050565b60006060820190506155e26000830186613ae4565b6155ef6020830185613ae4565b81810360408301526156018184614005565b9050949350505050565b600060208284031215615621576156206122ff565b5b600061562f84828501613e1b565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b6000819050602082019050919050565b600061568e83836124fa565b905092915050565b6000602082019050919050565b60006156ae82615667565b6156b88185613af3565b9350836020820285016156ca85615672565b8060005b8581101561570657848403895281516156e78582615682565b94506156f283615696565b925060208a019950506001810190506156ce565b50829750879550505050505092915050565b600060608201905061572d6000830186613ae4565b61573a60208301856128ca565b818103604083015261574c81846156a3565b9050949350505050565b7f6661696c656420746f20617070726f766520756e64656c65676174696f6e206d60008201527f6574686f64000000000000000000000000000000000000000000000000000000602082015250565b60006157b2602583613cc8565b91506157bd82615756565b604082019050919050565b600060208201905081810360008301526157e1816157a5565b9050919050565b60006040820190506157fd6000830186613ae4565b8181036020830152615810818486613bd0565b9050949350505050565b7f4661696c656420746f207265766f6b6520617070726f76616c20666f7220737460008201527f616b696e67206d6574686f647300000000000000000000000000000000000000602082015250565b6000615876602d83613cc8565b91506158818261581a565b604082019050919050565b600060208201905081810360008301526158a581615869565b9050919050565b600060a08301600083015184820360008601526158c9828261345b565b91505060208301516158de6020860182612aad565b5060408301516158f16040860182612aad565b506060830151615904606086018261253f565b506080830151615917608086018261253f565b508091505092915050565b60006080820190506159376000830187613ae4565b81810360208301526159498186614005565b9050818103604083015261595d8185614005565b9050818103606083015261597181846158ac565b905095945050505050565b600067ffffffffffffffff82111561599757615996612714565b5b602082029050602081019050919050565b6000608082840312156159be576159bd6135eb565b5b6159c86080612774565b9050600082015167ffffffffffffffff8111156159e8576159e76135f0565b5b6159f484828501613dc8565b600083015250602082015167ffffffffffffffff811115615a1857615a176135f0565b5b615a2484828501613dc8565b602083015250604082015167ffffffffffffffff811115615a4857615a476135f0565b5b615a5484828501613dc8565b604083015250606082015167ffffffffffffffff811115615a7857615a776135f0565b5b615a8484828501614cfb565b60608301525092915050565b600067ffffffffffffffff821115615aab57615aaa612714565b5b602082029050602081019050919050565b600060a08284031215615ad257615ad16135eb565b5b615adc6040612774565b90506000615aec84828501614c1a565b6000830152506080615b0084828501613e1b565b60208301525092915050565b6000615b1f615b1a84615a90565b612774565b90508083825260208201905060a08402830185811115615b4257615b41612371565b5b835b81811015615b6b5780615b578882615abc565b84526020840193505060a081019050615b44565b5050509392505050565b600082601f830112615b8a57615b89612367565b5b8151615b9a848260208601615b0c565b91505092915050565b600060408284031215615bb957615bb86135eb565b5b615bc36040612774565b9050600082015167ffffffffffffffff811115615be357615be26135f0565b5b615bef848285016159a8565b600083015250602082015167ffffffffffffffff811115615c1357615c126135f0565b5b615c1f84828501615b75565b60208301525092915050565b6000615c3e615c398461597c565b612774565b90508083825260208201905060208402830185811115615c6157615c60612371565b5b835b81811015615ca857805167ffffffffffffffff811115615c8657615c85612367565b5b808601615c938982615ba3565b85526020850194505050602081019050615c63565b5050509392505050565b600082601f830112615cc757615cc6612367565b5b8151615cd7848260208601615c2b565b91505092915050565b60008060408385031215615cf757615cf66122ff565b5b600083015167ffffffffffffffff811115615d1557615d14612304565b5b615d2185828601615cb2565b925050602083015167ffffffffffffffff811115615d4257615d41612304565b5b615d4e858286016154e9565b915050925092905056fe2f636f736d6f732e7374616b696e672e763162657461312e4d7367556e64656c6567617465a2646970667358221220610cb91a8933e1804929f56c9cd7a1adc794d98816aa48df9e694b7cd16e831b64736f6c63430008130033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/precompiles/staking/testdata/StakingCaller.sol b/precompiles/staking/testdata/StakingCaller.sol index e42874de01..9d87ee9fab 100644 --- a/precompiles/staking/testdata/StakingCaller.sol +++ b/precompiles/staking/testdata/StakingCaller.sol @@ -98,7 +98,9 @@ contract StakingCaller { string memory _validatorAddr, uint256 _amount ) public { + counter++; staking.STAKING_CONTRACT.delegate(_addr, _validatorAddr, _amount); + counter--; } /// @dev This function calls the staking precompile's undelegate method. diff --git a/precompiles/staking/testdata/StakingCallerTwo.json b/precompiles/staking/testdata/StakingCallerTwo.json new file mode 100644 index 0000000000..23e8173ee7 --- /dev/null +++ b/precompiles/staking/testdata/StakingCallerTwo.json @@ -0,0 +1,210 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "StakingCallerTwo", + "sourceName": "solidity/precompiles/staking/testdata/StakingCallerTwo.sol", + "abi": [ + { + "inputs": [], + "name": "counter", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_addr", + "type": "address" + }, + { + "internalType": "string[]", + "name": "_methods", + "type": "string[]" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "testApprove", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "string", + "name": "moniker", + "type": "string" + }, + { + "internalType": "string", + "name": "identity", + "type": "string" + }, + { + "internalType": "string", + "name": "website", + "type": "string" + }, + { + "internalType": "string", + "name": "securityContact", + "type": "string" + }, + { + "internalType": "string", + "name": "details", + "type": "string" + } + ], + "internalType": "struct Description", + "name": "_descr", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "rate", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxRate", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxChangeRate", + "type": "uint256" + } + ], + "internalType": "struct CommissionRates", + "name": "_commRates", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_minSelfDel", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_validator", + "type": "address" + }, + { + "internalType": "string", + "name": "_pubkey", + "type": "string" + }, + { + "internalType": "uint256", + "name": "_value", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "_before", + "type": "bool" + }, + { + "internalType": "bool", + "name": "_after", + "type": "bool" + } + ], + "name": "testCreateValidatorWithTransfer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "_delegator", + "type": "address" + }, + { + "internalType": "string", + "name": "_validatorAddr", + "type": "string" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "_before", + "type": "bool" + }, + { + "internalType": "bool", + "name": "_after", + "type": "bool" + } + ], + "name": "testDelegateWithCounterAndTransfer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "_dest", + "type": "address" + }, + { + "internalType": "address payable", + "name": "_delegator", + "type": "address" + }, + { + "internalType": "string", + "name": "_validatorAddr", + "type": "string" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "_before", + "type": "bool" + }, + { + "internalType": "bool", + "name": "_after", + "type": "bool" + } + ], + "name": "testDelegateWithTransfer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b50611590806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630a4433e21461005c578063365465a814610078578063405da99f1461009457806361bc221a146100b057806389493f41146100ce575b600080fd5b61007660048036038101906100719190610980565b6100ea565b005b610092600480360381019061008d9190610bb0565b6101b9565b005b6100ae60048036038101906100a99190610cde565b610428565b005b6100b861064a565b6040516100c59190610d84565b60405180910390f35b6100e860048036038101906100e39190610d9f565b610650565b005b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895868487876040518563ffffffff1660e01b815260040161012d9493929190610fbb565b6020604051808303816000875af115801561014c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101709190611010565b9050806101b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101a9906110c0565b60405180910390fd5b5050505050565b8115610285576000808154809291906101d19061110f565b919050555060008573ffffffffffffffffffffffffffffffffffffffff16600f6040516101fd90611188565b60006040518083038185875af1925050503d806000811461023a576040519150601f19603f3d011682016040523d82523d6000602084013e61023f565b606091505b5050905080610283576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027a9061120f565b60405180910390fd5b505b600061080073ffffffffffffffffffffffffffffffffffffffff1663f7cd55168a8a8a8a8a8a6040518763ffffffff1660e01b81526004016102cc969594939291906113e1565b6020604051808303816000875af11580156102eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061030f9190611010565b905080610351576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103489061149d565b60405180910390fd5b811561041d576000808154809291906103699061110f565b919050555060008673ffffffffffffffffffffffffffffffffffffffff16600f60405161039590611188565b60006040518083038185875af1925050503d80600081146103d2576040519150601f19603f3d011682016040523d82523d6000602084013e6103d7565b606091505b505090508061041b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104129061120f565b60405180910390fd5b505b505050505050505050565b81156104f4576000808154809291906104409061110f565b919050555060008573ffffffffffffffffffffffffffffffffffffffff16600f60405161046c90611188565b60006040518083038185875af1925050503d80600081146104a9576040519150601f19603f3d011682016040523d82523d6000602084013e6104ae565b606091505b50509050806104f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104e99061120f565b60405180910390fd5b505b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb8686866040518463ffffffff1660e01b81526004016105339392919061151c565b6020604051808303816000875af1158015610552573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105769190611010565b5080156106435760008081548092919061058f9061110f565b919050555060008573ffffffffffffffffffffffffffffffffffffffff16600f6040516105bb90611188565b60006040518083038185875af1925050503d80600081146105f8576040519150601f19603f3d011682016040523d82523d6000602084013e6105fd565b606091505b5050905080610641576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106389061120f565b60405180910390fd5b505b5050505050565b60005481565b811561071c576000808154809291906106689061110f565b919050555060008673ffffffffffffffffffffffffffffffffffffffff16600f60405161069490611188565b60006040518083038185875af1925050503d80600081146106d1576040519150601f19603f3d011682016040523d82523d6000602084013e6106d6565b606091505b505090508061071a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107119061120f565b60405180910390fd5b505b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb8686866040518463ffffffff1660e01b815260040161075b9392919061151c565b6020604051808303816000875af115801561077a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079e9190611010565b50801561086b576000808154809291906107b79061110f565b919050555060008673ffffffffffffffffffffffffffffffffffffffff16600f6040516107e390611188565b60006040518083038185875af1925050503d8060008114610820576040519150601f19603f3d011682016040523d82523d6000602084013e610825565b606091505b5050905080610869576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108609061120f565b60405180910390fd5b505b505050505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006108b282610887565b9050919050565b6108c2816108a7565b81146108cd57600080fd5b50565b6000813590506108df816108b9565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261090a576109096108e5565b5b8235905067ffffffffffffffff811115610927576109266108ea565b5b602083019150836020820283011115610943576109426108ef565b5b9250929050565b6000819050919050565b61095d8161094a565b811461096857600080fd5b50565b60008135905061097a81610954565b92915050565b6000806000806060858703121561099a5761099961087d565b5b60006109a8878288016108d0565b945050602085013567ffffffffffffffff8111156109c9576109c8610882565b5b6109d5878288016108f4565b935093505060406109e88782880161096b565b91505092959194509250565b600080fd5b600060a08284031215610a0f57610a0e6109f4565b5b81905092915050565b600060608284031215610a2e57610a2d6109f4565b5b81905092915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610a8582610a3c565b810181811067ffffffffffffffff82111715610aa457610aa3610a4d565b5b80604052505050565b6000610ab7610873565b9050610ac38282610a7c565b919050565b600067ffffffffffffffff821115610ae357610ae2610a4d565b5b610aec82610a3c565b9050602081019050919050565b82818337600083830152505050565b6000610b1b610b1684610ac8565b610aad565b905082815260208101848484011115610b3757610b36610a37565b5b610b42848285610af9565b509392505050565b600082601f830112610b5f57610b5e6108e5565b5b8135610b6f848260208601610b08565b91505092915050565b60008115159050919050565b610b8d81610b78565b8114610b9857600080fd5b50565b600081359050610baa81610b84565b92915050565b600080600080600080600080610140898b031215610bd157610bd061087d565b5b600089013567ffffffffffffffff811115610bef57610bee610882565b5b610bfb8b828c016109f9565b9850506020610c0c8b828c01610a18565b9750506080610c1d8b828c0161096b565b96505060a0610c2e8b828c016108d0565b95505060c089013567ffffffffffffffff811115610c4f57610c4e610882565b5b610c5b8b828c01610b4a565b94505060e0610c6c8b828c0161096b565b935050610100610c7e8b828c01610b9b565b925050610120610c908b828c01610b9b565b9150509295985092959890939650565b6000610cab82610887565b9050919050565b610cbb81610ca0565b8114610cc657600080fd5b50565b600081359050610cd881610cb2565b92915050565b600080600080600060a08688031215610cfa57610cf961087d565b5b6000610d0888828901610cc9565b955050602086013567ffffffffffffffff811115610d2957610d28610882565b5b610d3588828901610b4a565b9450506040610d468882890161096b565b9350506060610d5788828901610b9b565b9250506080610d6888828901610b9b565b9150509295509295909350565b610d7e8161094a565b82525050565b6000602082019050610d996000830184610d75565b92915050565b60008060008060008060c08789031215610dbc57610dbb61087d565b5b6000610dca89828a01610cc9565b9650506020610ddb89828a01610cc9565b955050604087013567ffffffffffffffff811115610dfc57610dfb610882565b5b610e0889828a01610b4a565b9450506060610e1989828a0161096b565b9350506080610e2a89828a01610b9b565b92505060a0610e3b89828a01610b9b565b9150509295509295509295565b610e51816108a7565b82525050565b600082825260208201905092915050565b6000819050919050565b600082825260208201905092915050565b6000610e8f8385610e72565b9350610e9c838584610af9565b610ea583610a3c565b840190509392505050565b6000610ebd848484610e83565b90509392505050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112610ef257610ef1610ed0565b5b83810192508235915060208301925067ffffffffffffffff821115610f1a57610f19610ec6565b5b600182023603831315610f3057610f2f610ecb565b5b509250929050565b6000602082019050919050565b6000610f518385610e57565b935083602084028501610f6384610e68565b8060005b87811015610fa9578484038952610f7e8284610ed5565b610f89868284610eb0565b9550610f9484610f38565b935060208b019a505050600181019050610f67565b50829750879450505050509392505050565b6000606082019050610fd06000830187610e48565b610fdd6020830186610d75565b8181036040830152610ff0818486610f45565b905095945050505050565b60008151905061100a81610b84565b92915050565b6000602082840312156110265761102561087d565b5b600061103484828501610ffb565b91505092915050565b600082825260208201905092915050565b7f4661696c656420746f20617070726f7665207374616b696e67206d6574686f6460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006110aa60218361103d565b91506110b58261104e565b604082019050919050565b600060208201905081810360008301526110d98161109d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061111a8261094a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361114c5761114b6110e0565b5b600182019050919050565b600081905092915050565b50565b6000611172600083611157565b915061117d82611162565b600082019050919050565b600061119382611165565b9150819050919050565b7f4661696c656420746f2073656e6420457468657220746f2064656c656761746f60008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006111f960218361103d565b91506112048261119d565b604082019050919050565b60006020820190508181036000830152611228816111ec565b9050919050565b600060a083016112426000840184610ed5565b8583036000870152611255838284610e83565b925050506112666020840184610ed5565b8583036020870152611279838284610e83565b9250505061128a6040840184610ed5565b858303604087015261129d838284610e83565b925050506112ae6060840184610ed5565b85830360608701526112c1838284610e83565b925050506112d26080840184610ed5565b85830360808701526112e5838284610e83565b925050508091505092915050565b6000611302602084018461096b565b905092915050565b6113138161094a565b82525050565b6060820161132a60008301836112f3565b611337600085018261130a565b5061134560208301836112f3565b611352602085018261130a565b5061136060408301836112f3565b61136d604085018261130a565b50505050565b600081519050919050565b60005b8381101561139c578082015181840152602081019050611381565b60008484015250505050565b60006113b382611373565b6113bd818561103d565b93506113cd81856020860161137e565b6113d681610a3c565b840191505092915050565b60006101008201905081810360008301526113fc818961122f565b905061140b6020830188611319565b6114186080830187610d75565b61142560a0830186610e48565b81810360c083015261143781856113a8565b905061144660e0830184610d75565b979650505050505050565b7f4661696c656420746f20637265617465207468652076616c696461746f720000600082015250565b6000611487601e8361103d565b915061149282611451565b602082019050919050565b600060208201905081810360008301526114b68161147a565b9050919050565b6000819050919050565b60006114e26114dd6114d884610887565b6114bd565b610887565b9050919050565b60006114f4826114c7565b9050919050565b6000611506826114e9565b9050919050565b611516816114fb565b82525050565b6000606082019050611531600083018661150d565b818103602083015261154381856113a8565b90506115526040830184610d75565b94935050505056fea264697066735822122003832ab382861d2894e6822f69b8ae70f7e7900365e9a257288a1c0152b67c2364736f6c63430008130033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100575760003560e01c80630a4433e21461005c578063365465a814610078578063405da99f1461009457806361bc221a146100b057806389493f41146100ce575b600080fd5b61007660048036038101906100719190610980565b6100ea565b005b610092600480360381019061008d9190610bb0565b6101b9565b005b6100ae60048036038101906100a99190610cde565b610428565b005b6100b861064a565b6040516100c59190610d84565b60405180910390f35b6100e860048036038101906100e39190610d9f565b610650565b005b600061080073ffffffffffffffffffffffffffffffffffffffff1663b6039895868487876040518563ffffffff1660e01b815260040161012d9493929190610fbb565b6020604051808303816000875af115801561014c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101709190611010565b9050806101b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101a9906110c0565b60405180910390fd5b5050505050565b8115610285576000808154809291906101d19061110f565b919050555060008573ffffffffffffffffffffffffffffffffffffffff16600f6040516101fd90611188565b60006040518083038185875af1925050503d806000811461023a576040519150601f19603f3d011682016040523d82523d6000602084013e61023f565b606091505b5050905080610283576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027a9061120f565b60405180910390fd5b505b600061080073ffffffffffffffffffffffffffffffffffffffff1663f7cd55168a8a8a8a8a8a6040518763ffffffff1660e01b81526004016102cc969594939291906113e1565b6020604051808303816000875af11580156102eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061030f9190611010565b905080610351576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103489061149d565b60405180910390fd5b811561041d576000808154809291906103699061110f565b919050555060008673ffffffffffffffffffffffffffffffffffffffff16600f60405161039590611188565b60006040518083038185875af1925050503d80600081146103d2576040519150601f19603f3d011682016040523d82523d6000602084013e6103d7565b606091505b505090508061041b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104129061120f565b60405180910390fd5b505b505050505050505050565b81156104f4576000808154809291906104409061110f565b919050555060008573ffffffffffffffffffffffffffffffffffffffff16600f60405161046c90611188565b60006040518083038185875af1925050503d80600081146104a9576040519150601f19603f3d011682016040523d82523d6000602084013e6104ae565b606091505b50509050806104f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104e99061120f565b60405180910390fd5b505b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb8686866040518463ffffffff1660e01b81526004016105339392919061151c565b6020604051808303816000875af1158015610552573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105769190611010565b5080156106435760008081548092919061058f9061110f565b919050555060008573ffffffffffffffffffffffffffffffffffffffff16600f6040516105bb90611188565b60006040518083038185875af1925050503d80600081146105f8576040519150601f19603f3d011682016040523d82523d6000602084013e6105fd565b606091505b5050905080610641576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106389061120f565b60405180910390fd5b505b5050505050565b60005481565b811561071c576000808154809291906106689061110f565b919050555060008673ffffffffffffffffffffffffffffffffffffffff16600f60405161069490611188565b60006040518083038185875af1925050503d80600081146106d1576040519150601f19603f3d011682016040523d82523d6000602084013e6106d6565b606091505b505090508061071a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107119061120f565b60405180910390fd5b505b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb8686866040518463ffffffff1660e01b815260040161075b9392919061151c565b6020604051808303816000875af115801561077a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079e9190611010565b50801561086b576000808154809291906107b79061110f565b919050555060008673ffffffffffffffffffffffffffffffffffffffff16600f6040516107e390611188565b60006040518083038185875af1925050503d8060008114610820576040519150601f19603f3d011682016040523d82523d6000602084013e610825565b606091505b5050905080610869576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108609061120f565b60405180910390fd5b505b505050505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006108b282610887565b9050919050565b6108c2816108a7565b81146108cd57600080fd5b50565b6000813590506108df816108b9565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261090a576109096108e5565b5b8235905067ffffffffffffffff811115610927576109266108ea565b5b602083019150836020820283011115610943576109426108ef565b5b9250929050565b6000819050919050565b61095d8161094a565b811461096857600080fd5b50565b60008135905061097a81610954565b92915050565b6000806000806060858703121561099a5761099961087d565b5b60006109a8878288016108d0565b945050602085013567ffffffffffffffff8111156109c9576109c8610882565b5b6109d5878288016108f4565b935093505060406109e88782880161096b565b91505092959194509250565b600080fd5b600060a08284031215610a0f57610a0e6109f4565b5b81905092915050565b600060608284031215610a2e57610a2d6109f4565b5b81905092915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610a8582610a3c565b810181811067ffffffffffffffff82111715610aa457610aa3610a4d565b5b80604052505050565b6000610ab7610873565b9050610ac38282610a7c565b919050565b600067ffffffffffffffff821115610ae357610ae2610a4d565b5b610aec82610a3c565b9050602081019050919050565b82818337600083830152505050565b6000610b1b610b1684610ac8565b610aad565b905082815260208101848484011115610b3757610b36610a37565b5b610b42848285610af9565b509392505050565b600082601f830112610b5f57610b5e6108e5565b5b8135610b6f848260208601610b08565b91505092915050565b60008115159050919050565b610b8d81610b78565b8114610b9857600080fd5b50565b600081359050610baa81610b84565b92915050565b600080600080600080600080610140898b031215610bd157610bd061087d565b5b600089013567ffffffffffffffff811115610bef57610bee610882565b5b610bfb8b828c016109f9565b9850506020610c0c8b828c01610a18565b9750506080610c1d8b828c0161096b565b96505060a0610c2e8b828c016108d0565b95505060c089013567ffffffffffffffff811115610c4f57610c4e610882565b5b610c5b8b828c01610b4a565b94505060e0610c6c8b828c0161096b565b935050610100610c7e8b828c01610b9b565b925050610120610c908b828c01610b9b565b9150509295985092959890939650565b6000610cab82610887565b9050919050565b610cbb81610ca0565b8114610cc657600080fd5b50565b600081359050610cd881610cb2565b92915050565b600080600080600060a08688031215610cfa57610cf961087d565b5b6000610d0888828901610cc9565b955050602086013567ffffffffffffffff811115610d2957610d28610882565b5b610d3588828901610b4a565b9450506040610d468882890161096b565b9350506060610d5788828901610b9b565b9250506080610d6888828901610b9b565b9150509295509295909350565b610d7e8161094a565b82525050565b6000602082019050610d996000830184610d75565b92915050565b60008060008060008060c08789031215610dbc57610dbb61087d565b5b6000610dca89828a01610cc9565b9650506020610ddb89828a01610cc9565b955050604087013567ffffffffffffffff811115610dfc57610dfb610882565b5b610e0889828a01610b4a565b9450506060610e1989828a0161096b565b9350506080610e2a89828a01610b9b565b92505060a0610e3b89828a01610b9b565b9150509295509295509295565b610e51816108a7565b82525050565b600082825260208201905092915050565b6000819050919050565b600082825260208201905092915050565b6000610e8f8385610e72565b9350610e9c838584610af9565b610ea583610a3c565b840190509392505050565b6000610ebd848484610e83565b90509392505050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112610ef257610ef1610ed0565b5b83810192508235915060208301925067ffffffffffffffff821115610f1a57610f19610ec6565b5b600182023603831315610f3057610f2f610ecb565b5b509250929050565b6000602082019050919050565b6000610f518385610e57565b935083602084028501610f6384610e68565b8060005b87811015610fa9578484038952610f7e8284610ed5565b610f89868284610eb0565b9550610f9484610f38565b935060208b019a505050600181019050610f67565b50829750879450505050509392505050565b6000606082019050610fd06000830187610e48565b610fdd6020830186610d75565b8181036040830152610ff0818486610f45565b905095945050505050565b60008151905061100a81610b84565b92915050565b6000602082840312156110265761102561087d565b5b600061103484828501610ffb565b91505092915050565b600082825260208201905092915050565b7f4661696c656420746f20617070726f7665207374616b696e67206d6574686f6460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006110aa60218361103d565b91506110b58261104e565b604082019050919050565b600060208201905081810360008301526110d98161109d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061111a8261094a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361114c5761114b6110e0565b5b600182019050919050565b600081905092915050565b50565b6000611172600083611157565b915061117d82611162565b600082019050919050565b600061119382611165565b9150819050919050565b7f4661696c656420746f2073656e6420457468657220746f2064656c656761746f60008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006111f960218361103d565b91506112048261119d565b604082019050919050565b60006020820190508181036000830152611228816111ec565b9050919050565b600060a083016112426000840184610ed5565b8583036000870152611255838284610e83565b925050506112666020840184610ed5565b8583036020870152611279838284610e83565b9250505061128a6040840184610ed5565b858303604087015261129d838284610e83565b925050506112ae6060840184610ed5565b85830360608701526112c1838284610e83565b925050506112d26080840184610ed5565b85830360808701526112e5838284610e83565b925050508091505092915050565b6000611302602084018461096b565b905092915050565b6113138161094a565b82525050565b6060820161132a60008301836112f3565b611337600085018261130a565b5061134560208301836112f3565b611352602085018261130a565b5061136060408301836112f3565b61136d604085018261130a565b50505050565b600081519050919050565b60005b8381101561139c578082015181840152602081019050611381565b60008484015250505050565b60006113b382611373565b6113bd818561103d565b93506113cd81856020860161137e565b6113d681610a3c565b840191505092915050565b60006101008201905081810360008301526113fc818961122f565b905061140b6020830188611319565b6114186080830187610d75565b61142560a0830186610e48565b81810360c083015261143781856113a8565b905061144660e0830184610d75565b979650505050505050565b7f4661696c656420746f20637265617465207468652076616c696461746f720000600082015250565b6000611487601e8361103d565b915061149282611451565b602082019050919050565b600060208201905081810360008301526114b68161147a565b9050919050565b6000819050919050565b60006114e26114dd6114d884610887565b6114bd565b610887565b9050919050565b60006114f4826114c7565b9050919050565b6000611506826114e9565b9050919050565b611516816114fb565b82525050565b6000606082019050611531600083018661150d565b818103602083015261154381856113a8565b90506115526040830184610d75565b94935050505056fea264697066735822122003832ab382861d2894e6822f69b8ae70f7e7900365e9a257288a1c0152b67c2364736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/precompiles/staking/testdata/StakingCallerTwo.sol b/precompiles/staking/testdata/StakingCallerTwo.sol new file mode 100644 index 0000000000..5c13d36c8b --- /dev/null +++ b/precompiles/staking/testdata/StakingCallerTwo.sol @@ -0,0 +1,128 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity >=0.8.17; + +import "../StakingI.sol" as staking; + +/// @title StakingCaller +/// @author Evmos Core Team +/// @dev This contract is used to test external contract calls to the staking precompile. +contract StakingCallerTwo { + /// counter is used to test the state persistence bug, when EVM and Cosmos state were both + /// changed in the same function. + uint256 public counter; + + /// @dev This function calls the staking precompile's approve method. + /// @param _addr The address to approve. + /// @param _methods The methods to approve. + function testApprove( + address _addr, + string[] calldata _methods, + uint256 _amount + ) public { + bool success = staking.STAKING_CONTRACT.approve( + _addr, + _amount, + _methods + ); + require(success, "Failed to approve staking methods"); + } + + /// @dev This function showcased, that there was a bug in the EVM implementation, that occurred when + /// Cosmos state is modified in the same transaction as state information inside + /// the EVM. + /// @param _delegator Address of the delegator + /// @param _validatorAddr Address of the validator to delegate to + /// @param _amount Amount to delegate + /// @param _before Boolean to specify if funds should be transferred to delegator before the precompile call + /// @param _after Boolean to specify if funds should be transferred to delegator after the precompile call + function testDelegateWithCounterAndTransfer( + address payable _delegator, + string memory _validatorAddr, + uint256 _amount, + bool _before, + bool _after + ) public { + if (_before) { + counter++; + (bool sent, ) = _delegator.call{value: 15}(""); + require(sent, "Failed to send Ether to delegator"); + } + staking.STAKING_CONTRACT.delegate(_delegator, _validatorAddr, _amount); + if (_after) { + counter++; + (bool sent, ) = _delegator.call{value: 15}(""); + require(sent, "Failed to send Ether to delegator"); + } + } + + /// @dev This function showcased, that there was a bug in the EVM implementation, that occurred when + /// Cosmos state is modified in the same transaction as state information inside + /// the EVM. + /// @param _dest Address to send some funds from the contract + /// @param _delegator Address of the delegator + /// @param _validatorAddr Address of the validator to delegate to + /// @param _amount Amount to delegate + /// @param _before Boolean to specify if funds should be transferred to delegator before the precompile call + /// @param _after Boolean to specify if funds should be transferred to delegator after the precompile call + function testDelegateWithTransfer( + address payable _dest, + address payable _delegator, + string memory _validatorAddr, + uint256 _amount, + bool _before, + bool _after + ) public { + if (_before) { + counter++; + (bool sent, ) = _dest.call{value: 15}(""); + require(sent, "Failed to send Ether to delegator"); + } + staking.STAKING_CONTRACT.delegate(_delegator, _validatorAddr, _amount); + if (_after) { + counter++; + (bool sent, ) = _dest.call{value: 15}(""); + require(sent, "Failed to send Ether to delegator"); + } + } + + /// @dev This function calls the staking precompile's create validator method + /// and transfers of funds to the validator address (if specified). + /// @param _descr The initial description + /// @param _commRates The initial commissionRates + /// @param _minSelfDel The validator's self declared minimum self delegation + /// @param _validator The validator's operator address + /// @param _pubkey The consensus public key of the validator + /// @param _value The amount of the coin to be self delegated to the validator + /// @param _before Boolean to specify if funds should be transferred to delegator before the precompile call + /// @param _after Boolean to specify if funds should be transferred to delegator after the precompile call + function testCreateValidatorWithTransfer( + staking.Description calldata _descr, + staking.CommissionRates calldata _commRates, + uint256 _minSelfDel, + address _validator, + string memory _pubkey, + uint256 _value, + bool _before, + bool _after + ) public { + if (_before) { + counter++; + (bool sent, ) = _validator.call{value: 15}(""); + require(sent, "Failed to send Ether to delegator"); + } + bool success = staking.STAKING_CONTRACT.createValidator( + _descr, + _commRates, + _minSelfDel, + _validator, + _pubkey, + _value + ); + require(success, "Failed to create the validator"); + if (_after) { + counter++; + (bool sent, ) = _validator.call{value: 15}(""); + require(sent, "Failed to send Ether to delegator"); + } + } +} diff --git a/precompiles/staking/testdata/staking_caller_two.go b/precompiles/staking/testdata/staking_caller_two.go new file mode 100644 index 0000000000..9b28b27934 --- /dev/null +++ b/precompiles/staking/testdata/staking_caller_two.go @@ -0,0 +1,13 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package testdata + +import ( + contractutils "github.com/evmos/evmos/v18/contracts/utils" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" +) + +func LoadStakingCallerTwoContract() (evmtypes.CompiledContract, error) { + return contractutils.LoadContractFromJSONFile("StakingCallerTwo.json") +} diff --git a/precompiles/staking/tx.go b/precompiles/staking/tx.go index ccaae2a8a0..3c8a69bdfc 100644 --- a/precompiles/staking/tx.go +++ b/precompiles/staking/tx.go @@ -13,7 +13,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" "github.com/evmos/evmos/v18/precompiles/authorization" - "github.com/evmos/evmos/v18/x/evm/statedb" + cmn "github.com/evmos/evmos/v18/precompiles/common" stakingkeeper "github.com/evmos/evmos/v18/x/staking/keeper" ) @@ -51,7 +51,7 @@ const ( func (p Precompile) CreateValidator( ctx sdk.Context, origin common.Address, - _ *vm.Contract, + contract *vm.Contract, stateDB vm.StateDB, method *abi.Method, args []interface{}, @@ -71,6 +71,13 @@ func (p Precompile) CreateValidator( "value", msg.Value.Amount.String(), ) + // ATM there's no authorization type for the MsgCreateValidator + // and MsgEditValidator (source: https://github.com/cosmos/cosmos-sdk/blob/4bd73b667f8aed50ad4602ddf862a4ed6e1450a8/x/staking/proto/cosmos/staking/v1beta1/authz.proto#L39-L50) + // so, for the time being, we won't allow calls from smart contracts + if contract.CallerAddress != origin { + return nil, fmt.Errorf(ErrCannotCallFromContract) + } + // we only allow the tx signer "origin" to create their own validator. if origin != validatorHexAddr { return nil, fmt.Errorf(ErrDifferentOriginFromDelegator, origin.String(), validatorHexAddr.String()) @@ -82,6 +89,9 @@ func (p Precompile) CreateValidator( return nil, err } + // Here we don't add journal entries here because calls from + // smart contracts are not supported at the moment for this method. + // Emit the event for the create validator transaction if err = p.EmitCreateValidatorEvent(ctx, stateDB, msg, validatorHexAddr); err != nil { return nil, err @@ -94,7 +104,7 @@ func (p Precompile) CreateValidator( func (p Precompile) EditValidator( ctx sdk.Context, origin common.Address, - _ *vm.Contract, + contract *vm.Contract, stateDB vm.StateDB, method *abi.Method, args []interface{}, @@ -112,6 +122,13 @@ func (p Precompile) EditValidator( "min_self_delegation", msg.MinSelfDelegation, ) + // ATM there's no authorization type for the MsgCreateValidator + // and MsgEditValidator (source: https://github.com/cosmos/cosmos-sdk/blob/4bd73b667f8aed50ad4602ddf862a4ed6e1450a8/x/staking/proto/cosmos/staking/v1beta1/authz.proto#L39-L50) + // so, for the time being, we won't allow calls from smart contracts + if contract.CallerAddress != origin { + return nil, fmt.Errorf(ErrCannotCallFromContract) + } + // we only allow the tx signer "origin" to edit their own validator. if origin != validatorHexAddr { return nil, fmt.Errorf(ErrDifferentOriginFromValidator, origin.String(), validatorHexAddr.String()) @@ -132,7 +149,7 @@ func (p Precompile) EditValidator( } // Delegate performs a delegation of coins from a delegator to a validator. -func (p Precompile) Delegate( +func (p *Precompile) Delegate( ctx sdk.Context, origin common.Address, contract *vm.Contract, @@ -206,10 +223,14 @@ func (p Precompile) Delegate( return nil, err } - // NOTE: This ensures that the changes in the bank keeper are correctly mirrored to the EVM stateDB. - // This prevents the stateDB from overwriting the changed balance in the bank keeper when committing the EVM state. - if isCallerDelegator { - stateDB.(*statedb.StateDB).SubBalance(contract.CallerAddress, msg.Amount.Amount.BigInt()) + if !isCallerOrigin { + // get the delegator address from the message + delAccAddr := sdk.MustAccAddressFromBech32(msg.DelegatorAddress) + delHexAddr := common.BytesToAddress(delAccAddr) + // NOTE: This ensures that the changes in the bank keeper are correctly mirrored to the EVM stateDB + // when calling the precompile from a smart contract + // This prevents the stateDB from overwriting the changed balance in the bank keeper when committing the EVM state. + p.SetBalanceChangeEntries(cmn.NewBalanceChangeEntry(delHexAddr, msg.Amount.Amount.BigInt(), cmn.Sub)) } return method.Outputs.Pack(true) diff --git a/precompiles/staking/tx_test.go b/precompiles/staking/tx_test.go index 5f8d138eb9..9599cdffc7 100644 --- a/precompiles/staking/tx_test.go +++ b/precompiles/staking/tx_test.go @@ -37,15 +37,17 @@ func (s *PrecompileTestSuite) TestCreateValidator() { validatorAddress = s.address pubkey = "nfJ0axJC9dhta1MAE1EBFaVdxxkYzxYrBaHuJVjG//M=" value = big.NewInt(1205000000000000000) + diffAddr, _ = evmosutiltx.NewAddrKey() ) testCases := []struct { - name string - malleate func() []interface{} - gas uint64 - postCheck func(data []byte) - expError bool - errContains string + name string + malleate func() []interface{} + gas uint64 + callerAddress *geth.Address + postCheck func(data []byte) + expError bool + errContains string }{ { "fail - empty input args", @@ -53,6 +55,7 @@ func (s *PrecompileTestSuite) TestCreateValidator() { return []interface{}{} }, 200000, + nil, func([]byte) {}, true, fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 6, 0), @@ -71,6 +74,7 @@ func (s *PrecompileTestSuite) TestCreateValidator() { } }, 200000, + nil, func([]byte) {}, true, "is not the same as delegator address", @@ -88,6 +92,7 @@ func (s *PrecompileTestSuite) TestCreateValidator() { } }, 200000, + nil, func([]byte) {}, true, "invalid description", @@ -105,6 +110,7 @@ func (s *PrecompileTestSuite) TestCreateValidator() { } }, 200000, + nil, func([]byte) {}, true, "invalid commission", @@ -122,6 +128,7 @@ func (s *PrecompileTestSuite) TestCreateValidator() { } }, 200000, + nil, func([]byte) {}, true, "invalid amount", @@ -139,6 +146,7 @@ func (s *PrecompileTestSuite) TestCreateValidator() { } }, 200000, + nil, func([]byte) {}, true, "invalid validator address", @@ -156,6 +164,7 @@ func (s *PrecompileTestSuite) TestCreateValidator() { } }, 200000, + nil, func([]byte) {}, true, "invalid type for", @@ -173,6 +182,7 @@ func (s *PrecompileTestSuite) TestCreateValidator() { } }, 200000, + nil, func([]byte) {}, true, "illegal base64 data", @@ -190,6 +200,7 @@ func (s *PrecompileTestSuite) TestCreateValidator() { } }, 200000, + nil, func([]byte) {}, true, "consensus pubkey len is invalid", @@ -207,10 +218,29 @@ func (s *PrecompileTestSuite) TestCreateValidator() { } }, 200000, + nil, func([]byte) {}, true, "invalid amount", }, + { + "fail - cannot be called from address != than validator address", + func() []interface{} { + return []interface{}{ + description, + commission, + minSelfDelegation, + validatorAddress, + pubkey, + value, + } + }, + 200000, + &diffAddr, + func([]byte) {}, + true, + "this method can only be called directly to the precompile", + }, { "success", func() []interface{} { @@ -224,6 +254,7 @@ func (s *PrecompileTestSuite) TestCreateValidator() { } }, 200000, + nil, func(data []byte) { success, err := s.precompile.Unpack(staking.CreateValidatorMethod, data) s.Require().NoError(err) @@ -258,6 +289,9 @@ func (s *PrecompileTestSuite) TestCreateValidator() { var contract *vm.Contract contract, s.ctx = testutil.NewPrecompileContract(s.T(), s.ctx, s.address, s.precompile, tc.gas) + if tc.callerAddress != nil { + contract.CallerAddress = *tc.callerAddress + } bz, err := s.precompile.CreateValidator(s.ctx, s.address, contract, s.stateDB, &method, tc.malleate()) @@ -315,12 +349,13 @@ func (s *PrecompileTestSuite) TestEditValidator() { ) testCases := []struct { - name string - malleate func() []interface{} - gas uint64 - postCheck func(data []byte) - expError bool - errContains string + name string + malleate func() []interface{} + gas uint64 + callerAddress *geth.Address + postCheck func(data []byte) + expError bool + errContains string }{ { "fail - empty input args", @@ -328,6 +363,7 @@ func (s *PrecompileTestSuite) TestEditValidator() { return []interface{}{} }, 200000, + nil, func([]byte) {}, true, fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 4, 0), @@ -344,6 +380,7 @@ func (s *PrecompileTestSuite) TestEditValidator() { } }, 200000, + nil, func([]byte) {}, true, "is not the same as validator operator address", @@ -359,6 +396,7 @@ func (s *PrecompileTestSuite) TestEditValidator() { } }, 200000, + nil, func([]byte) {}, true, "invalid description", @@ -374,6 +412,7 @@ func (s *PrecompileTestSuite) TestEditValidator() { } }, 200000, + nil, func([]byte) {}, true, "invalid type for commissionRate", @@ -389,6 +428,7 @@ func (s *PrecompileTestSuite) TestEditValidator() { } }, 200000, + nil, func([]byte) {}, true, "invalid type for minSelfDelegation", @@ -404,6 +444,7 @@ func (s *PrecompileTestSuite) TestEditValidator() { } }, 200000, + nil, func([]byte) {}, true, "invalid validator address", @@ -419,6 +460,7 @@ func (s *PrecompileTestSuite) TestEditValidator() { } }, 200000, + nil, func([]byte) {}, true, "commission cannot be changed more than max change rate", @@ -434,6 +476,7 @@ func (s *PrecompileTestSuite) TestEditValidator() { } }, 200000, + nil, func([]byte) {}, true, "commission rate must be between 0 and 1 (inclusive)", @@ -449,10 +492,27 @@ func (s *PrecompileTestSuite) TestEditValidator() { } }, 200000, + nil, func([]byte) {}, true, "minimum self delegation must be a positive integer", }, + { + "fail - calling precompile from a different address than validator (smart contract call)", + func() []interface{} { + return []interface{}{ + description, + validatorAddress, + commissionRate, + minSelfDelegation, + } + }, + 200000, + &s.address, + func([]byte) {}, + true, + "this method can only be called directly to the precompile", + }, { "success", func() []interface{} { @@ -464,6 +524,7 @@ func (s *PrecompileTestSuite) TestEditValidator() { } }, 200000, + nil, func(data []byte) { success, err := s.precompile.Unpack(staking.EditValidatorMethod, data) s.Require().NoError(err) @@ -501,6 +562,7 @@ func (s *PrecompileTestSuite) TestEditValidator() { } }, 200000, + nil, func(data []byte) { //nolint:dupl success, err := s.precompile.Unpack(staking.EditValidatorMethod, data) s.Require().NoError(err) @@ -536,6 +598,7 @@ func (s *PrecompileTestSuite) TestEditValidator() { } }, 200000, + nil, func(data []byte) { //nolint:dupl success, err := s.precompile.Unpack(staking.EditValidatorMethod, data) s.Require().NoError(err) @@ -570,7 +633,10 @@ func (s *PrecompileTestSuite) TestEditValidator() { validatorAddress = geth.BytesToAddress(s.validators[0].GetOperator().Bytes()) var contract *vm.Contract - contract, s.ctx = testutil.NewPrecompileContract(s.T(), s.ctx, s.address, s.precompile, tc.gas) + contract, s.ctx = testutil.NewPrecompileContract(s.T(), s.ctx, validatorAddress, s.precompile, tc.gas) + if tc.callerAddress != nil { + contract.CallerAddress = *tc.callerAddress + } bz, err := s.precompile.EditValidator(s.ctx, validatorAddress, contract, s.stateDB, &method, tc.malleate()) diff --git a/precompiles/testutil/contracts/DistributionCaller.json b/precompiles/testutil/contracts/DistributionCaller.json index fbcdaca501..f02162b747 100644 --- a/precompiles/testutil/contracts/DistributionCaller.json +++ b/precompiles/testutil/contracts/DistributionCaller.json @@ -434,6 +434,34 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "_delAddr", + "type": "address" + }, + { + "internalType": "address payable", + "name": "_withdrawer", + "type": "address" + }, + { + "internalType": "string", + "name": "_valAddr", + "type": "string" + }, + { + "internalType": "bool", + "name": "_after", + "type": "bool" + } + ], + "name": "revertWithdrawRewardsAndTransfer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -495,6 +523,34 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "_delAddr", + "type": "address" + }, + { + "internalType": "uint32", + "name": "_maxRetrieve", + "type": "uint32" + }, + { + "internalType": "bool", + "name": "_before", + "type": "bool" + }, + { + "internalType": "bool", + "name": "_after", + "type": "bool" + } + ], + "name": "testClaimRewardsWithTransfer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -519,6 +575,34 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "depositor", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "_before", + "type": "bool" + }, + { + "internalType": "bool", + "name": "_after", + "type": "bool" + } + ], + "name": "testFundCommunityPoolWithTransfer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -670,6 +754,52 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "_delAddr", + "type": "address" + }, + { + "internalType": "string", + "name": "_valAddr", + "type": "string" + }, + { + "internalType": "bool", + "name": "_before", + "type": "bool" + }, + { + "internalType": "bool", + "name": "_after", + "type": "bool" + } + ], + "name": "testWithdrawDelegatorRewardsWithTransfer", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Coin[]", + "name": "coins", + "type": "tuple[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -700,10 +830,92 @@ ], "stateMutability": "nonpayable", "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_valAddr", + "type": "string" + }, + { + "internalType": "address payable", + "name": "_withdrawer", + "type": "address" + }, + { + "internalType": "bool", + "name": "_before", + "type": "bool" + }, + { + "internalType": "bool", + "name": "_after", + "type": "bool" + } + ], + "name": "testWithdrawValidatorCommissionWithTransfer", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Coin[]", + "name": "coins", + "type": "tuple[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_delAddr", + "type": "address" + }, + { + "internalType": "string", + "name": "_valAddr", + "type": "string" + } + ], + "name": "withdrawDelegatorRewardsAndRevert", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Coin[]", + "name": "coins", + "type": "tuple[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b506133ae806100206000396000f3fe60806040526004361061012a5760003560e01c806388b2d581116100ab578063c7804bb51161006f578063c7804bb514610489578063cb85aa0a146104c6578063d0e30db014610503578063d3f831be1461050d578063e0421e391461054a578063e236c7a6146105875761012a565b806388b2d58114610357578063963516e41461039557806398194593146103d2578063b2d178831461040f578063b6a216ae1461044c5761012a565b806361bc221a116100f257806361bc221a1461024c5780636f669da41461027757806378a5dfd1146102b4578063796b96d2146102f15780637c9db0bb1461031a5761012a565b806301b680001461012f5780630c05e9e41461016c578063296c60aa146101a95780632d0ee16a146101d257806346e16d341461020f575b600080fd5b34801561013b57600080fd5b506101566004803603810190610151919061147c565b6105c5565b6040516101639190611539565b60405180910390f35b34801561017857600080fd5b50610193600480360381019061018e9190611690565b61070d565b6040516101a091906118d3565b60405180910390f35b3480156101b557600080fd5b506101d060048036038101906101cb91906118f5565b61079d565b005b3480156101de57600080fd5b506101f960048036038101906101f49190611690565b6108de565b6040516102069190611a50565b60405180910390f35b34801561021b57600080fd5b50610236600480360381019061023191906118f5565b61096c565b6040516102439190611a8d565b60405180910390f35b34801561025857600080fd5b506102616109f6565b60405161026e9190611ac4565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190611b1b565b610a07565b6040516102ab9190611a8d565b60405180910390f35b3480156102c057600080fd5b506102db60048036038101906102d691906118f5565b610a91565b6040516102e89190611be1565b60405180910390f35b3480156102fd57600080fd5b50610318600480360381019061031391906118f5565b610b1e565b005b34801561032657600080fd5b50610341600480360381019061033c9190611690565b610c5f565b60405161034e9190611be1565b60405180910390f35b34801561036357600080fd5b5061037e60048036038101906103799190611c67565b610ce9565b60405161038c929190611ea9565b60405180910390f35b3480156103a157600080fd5b506103bc60048036038101906103b79190611690565b610d87565b6040516103c99190611a8d565b60405180910390f35b3480156103de57600080fd5b506103f960048036038101906103f491906118f5565b610e10565b6040516104069190611a50565b60405180910390f35b34801561041b57600080fd5b5061043660048036038101906104319190611ee0565b610e9f565b6040516104439190611a50565b60405180910390f35b34801561045857600080fd5b50610473600480360381019061046e919061147c565b610ff4565b604051610480919061202d565b60405180910390f35b34801561049557600080fd5b506104b060048036038101906104ab919061207b565b61107e565b6040516104bd9190611a8d565b60405180910390f35b3480156104d257600080fd5b506104ed60048036038101906104e8919061147c565b611196565b6040516104fa9190612105565b60405180910390f35b61050b611220565b005b34801561051957600080fd5b50610534600480360381019061052f9190611690565b611222565b6040516105419190611be1565b60405180910390f35b34801561055657600080fd5b50610571600480360381019061056c9190611690565b6112ac565b60405161057e9190611a50565b60405180910390f35b34801561059357600080fd5b506105ae60048036038101906105a9919061147c565b611338565b6040516105bc92919061222d565b60405180910390f35b606060008061080173ffffffffffffffffffffffffffffffffffffffff16846040516024016105f49190612273565b6040516020818303038152906040527f5431f450000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161067e91906122ca565b600060405180830381855afa9150503d80600081146106b9576040519150601f19603f3d011682016040523d82523d6000602084013e6106be565b606091505b509150915081610703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106fa9061232d565b60405180910390fd5b8092505050919050565b6107156113c5565b61080173ffffffffffffffffffffffffffffffffffffffff166354212a89836040518263ffffffff1660e01b81526004016107509190612105565b600060405180830381865afa15801561076d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906107969190612626565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff1683836040516024016107cb92919061266f565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161085591906122ca565b600060405180830381855af49150503d8060008114610890576040519150601f19603f3d011682016040523d82523d6000602084013e610895565b606091505b50509050806108d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d090612711565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6130846040518363ffffffff1660e01b815260040161091d92919061266f565b6000604051808303816000875af115801561093c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610965919061287e565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9684846040518363ffffffff1660e01b81526004016109ab92919061266f565b6020604051808303816000875af11580156109ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ee91906128f3565b905092915050565b60008054906101000a900460070b81565b600061080173ffffffffffffffffffffffffffffffffffffffff16632efe8a5f84846040518363ffffffff1660e01b8152600401610a4692919061292f565b6020604051808303816000875af1158015610a65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8991906128f3565b905092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff16639ad563b484846040518363ffffffff1660e01b8152600401610ad092919061266f565b600060405180830381865afa158015610aed573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610b169190612958565b905092915050565b600061080173ffffffffffffffffffffffffffffffffffffffff168383604051602401610b4c92919061266f565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610bd691906122ca565b600060405180830381855afa9150503d8060008114610c11576040519150601f19603f3d011682016040523d82523d6000602084013e610c16565b606091505b5050905080610c5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c519061232d565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633dd40f78836040518263ffffffff1660e01b8152600401610c9c9190612105565b600060405180830381865afa158015610cb9573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610ce29190612958565b9050919050565b6060610cf36113e6565b61080173ffffffffffffffffffffffffffffffffffffffff16638f2473ce878787876040518563ffffffff1660e01b8152600401610d349493929190612b41565b600060405180830381865afa158015610d51573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610d7a9190612e19565b9150915094509492505050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9630846040518363ffffffff1660e01b8152600401610dc692919061266f565b6020604051808303816000875af1158015610de5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0991906128f3565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6184846040518363ffffffff1660e01b8152600401610e4f92919061266f565b6000604051808303816000875af1158015610e6e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610e97919061287e565b905092915050565b6060600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9633876040518363ffffffff1660e01b8152600401610ee092919061266f565b6020604051808303816000875af1158015610eff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2391906128f3565b905080610f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5c90612edd565b60405180910390fd5b61080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6185856040518363ffffffff1660e01b8152600401610fa292919061266f565b6000604051808303816000875af1158015610fc1573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610fea919061287e565b9150509392505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663a66cb605836040518263ffffffff1660e01b81526004016110319190612273565b600060405180830381865afa15801561104e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110779190612fde565b9050919050565b600060016000808282829054906101000a900460070b61109e9190613056565b92506101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff16021790555061080173ffffffffffffffffffffffffffffffffffffffff1663ed41d0b684846040518363ffffffff1660e01b81526004016111049291906130c5565b6020604051808303816000875af1158015611123573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114791906128f3565b905060016000808282829054906101000a900460070b61116791906130ee565b92506101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff16021790555092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff16635431f450836040518263ffffffff1660e01b81526004016111d39190612273565b600060405180830381865afa1580156111f0573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611219919061314e565b9050919050565b565b606061080173ffffffffffffffffffffffffffffffffffffffff166385b2d2da836040518263ffffffff1660e01b815260040161125f9190612105565b600060405180830381865afa15801561127c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906112a59190612958565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633ce4e3be836040518263ffffffff1660e01b81526004016112e99190612105565b6000604051808303816000875af1158015611308573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611331919061287e565b9050919050565b60608061080173ffffffffffffffffffffffffffffffffffffffff166354be1a28846040518263ffffffff1660e01b81526004016113769190612273565b600060405180830381865afa158015611393573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906113bc9190613300565b91509150915091565b60405180606001604052806060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006114498261141e565b9050919050565b6114598161143e565b811461146457600080fd5b50565b60008135905061147681611450565b92915050565b60006020828403121561149257611491611414565b5b60006114a084828501611467565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156114e35780820151818401526020810190506114c8565b60008484015250505050565b6000601f19601f8301169050919050565b600061150b826114a9565b61151581856114b4565b93506115258185602086016114c5565b61152e816114ef565b840191505092915050565b600060208201905081810360008301526115538184611500565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61159d826114ef565b810181811067ffffffffffffffff821117156115bc576115bb611565565b5b80604052505050565b60006115cf61140a565b90506115db8282611594565b919050565b600067ffffffffffffffff8211156115fb576115fa611565565b5b611604826114ef565b9050602081019050919050565b82818337600083830152505050565b600061163361162e846115e0565b6115c5565b90508281526020810184848401111561164f5761164e611560565b5b61165a848285611611565b509392505050565b600082601f8301126116775761167661155b565b5b8135611687848260208601611620565b91505092915050565b6000602082840312156116a6576116a5611414565b5b600082013567ffffffffffffffff8111156116c4576116c3611419565b5b6116d084828501611662565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000611700826116d9565b61170a81856116e4565b935061171a8185602086016114c5565b611723816114ef565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000819050919050565b61176d8161175a565b82525050565b600060ff82169050919050565b61178981611773565b82525050565b600060608301600083015184820360008601526117ac82826116f5565b91505060208301516117c16020860182611764565b5060408301516117d46040860182611780565b508091505092915050565b60006117eb838361178f565b905092915050565b6000602082019050919050565b600061180b8261172e565b6118158185611739565b9350836020820285016118278561174a565b8060005b85811015611863578484038952815161184485826117df565b945061184f836117f3565b925060208a0199505060018101905061182b565b50829750879550505050505092915050565b6000606083016000830151848203600086015261189282826116f5565b915050602083015184820360208601526118ac8282611800565b915050604083015184820360408601526118c68282611800565b9150508091505092915050565b600060208201905081810360008301526118ed8184611875565b905092915050565b6000806040838503121561190c5761190b611414565b5b600061191a85828601611467565b925050602083013567ffffffffffffffff81111561193b5761193a611419565b5b61194785828601611662565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000604083016000830151848203600086015261199a82826116f5565b91505060208301516119af6020860182611764565b508091505092915050565b60006119c6838361197d565b905092915050565b6000602082019050919050565b60006119e682611951565b6119f0818561195c565b935083602082028501611a028561196d565b8060005b85811015611a3e5784840389528151611a1f85826119ba565b9450611a2a836119ce565b925060208a01995050600181019050611a06565b50829750879550505050505092915050565b60006020820190508181036000830152611a6a81846119db565b905092915050565b60008115159050919050565b611a8781611a72565b82525050565b6000602082019050611aa26000830184611a7e565b92915050565b60008160070b9050919050565b611abe81611aa8565b82525050565b6000602082019050611ad96000830184611ab5565b92915050565b600063ffffffff82169050919050565b611af881611adf565b8114611b0357600080fd5b50565b600081359050611b1581611aef565b92915050565b60008060408385031215611b3257611b31611414565b5b6000611b4085828601611467565b9250506020611b5185828601611b06565b9150509250929050565b600082825260208201905092915050565b6000611b778261172e565b611b818185611b5b565b935083602082028501611b938561174a565b8060005b85811015611bcf5784840389528151611bb085826117df565b9450611bbb836117f3565b925060208a01995050600181019050611b97565b50829750879550505050505092915050565b60006020820190508181036000830152611bfb8184611b6c565b905092915050565b600067ffffffffffffffff82169050919050565b611c2081611c03565b8114611c2b57600080fd5b50565b600081359050611c3d81611c17565b92915050565b600080fd5b600060a08284031215611c5e57611c5d611c43565b5b81905092915050565b60008060008060808587031215611c8157611c80611414565b5b600085013567ffffffffffffffff811115611c9f57611c9e611419565b5b611cab87828801611662565b9450506020611cbc87828801611c2e565b9350506040611ccd87828801611c2e565b925050606085013567ffffffffffffffff811115611cee57611ced611419565b5b611cfa87828801611c48565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611d3b81611c03565b82525050565b604082016000820151611d576000850182611764565b506020820151611d6a6020850182611780565b50505050565b606082016000820151611d866000850182611d32565b506020820151611d996020850182611d41565b50505050565b6000611dab8383611d70565b60608301905092915050565b6000602082019050919050565b6000611dcf82611d06565b611dd98185611d11565b9350611de483611d22565b8060005b83811015611e15578151611dfc8882611d9f565b9750611e0783611db7565b925050600181019050611de8565b5085935050505092915050565b600082825260208201905092915050565b6000611e3e826114a9565b611e488185611e22565b9350611e588185602086016114c5565b611e61816114ef565b840191505092915050565b60006040830160008301518482036000860152611e898282611e33565b9150506020830151611e9e6020860182611d32565b508091505092915050565b60006040820190508181036000830152611ec38185611dc4565b90508181036020830152611ed78184611e6c565b90509392505050565b600080600060608486031215611ef957611ef8611414565b5b600084013567ffffffffffffffff811115611f1757611f16611419565b5b611f2386828701611662565b9350506020611f3486828701611467565b925050604084013567ffffffffffffffff811115611f5557611f54611419565b5b611f6186828701611662565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000611fa383836116f5565b905092915050565b6000602082019050919050565b6000611fc382611f6b565b611fcd8185611f76565b935083602082028501611fdf85611f87565b8060005b8581101561201b5784840389528151611ffc8582611f97565b945061200783611fab565b925060208a01995050600181019050611fe3565b50829750879550505050505092915050565b600060208201905081810360008301526120478184611fb8565b905092915050565b6120588161175a565b811461206357600080fd5b50565b6000813590506120758161204f565b92915050565b6000806040838503121561209257612091611414565b5b60006120a085828601611467565b92505060206120b185828601612066565b9150509250929050565b600082825260208201905092915050565b60006120d7826116d9565b6120e181856120bb565b93506120f18185602086016114c5565b6120fa816114ef565b840191505092915050565b6000602082019050818103600083015261211f81846120cc565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000604083016000830151848203600086015261217082826116f5565b9150506020830151848203602086015261218a8282611800565b9150508091505092915050565b60006121a38383612153565b905092915050565b6000602082019050919050565b60006121c382612127565b6121cd8185612132565b9350836020820285016121df85612143565b8060005b8581101561221b57848403895281516121fc8582612197565b9450612207836121ab565b925060208a019950506001810190506121e3565b50829750879550505050505092915050565b6000604082019050818103600083015261224781856121b8565b9050818103602083015261225b8184611b6c565b90509392505050565b61226d8161143e565b82525050565b60006020820190506122886000830184612264565b92915050565b600081905092915050565b60006122a4826114a9565b6122ae818561228e565b93506122be8185602086016114c5565b80840191505092915050565b60006122d68284612299565b915081905092915050565b7f6661696c65642073746174696343616c6c20746f20707265636f6d70696c6500600082015250565b6000612317601f836120bb565b9150612322826122e1565b602082019050919050565b600060208201905081810360008301526123468161230a565b9050919050565b600080fd5b600080fd5b600061236a612365846115e0565b6115c5565b90508281526020810184848401111561238657612385611560565b5b6123918482856114c5565b509392505050565b600082601f8301126123ae576123ad61155b565b5b81516123be848260208601612357565b91505092915050565b600067ffffffffffffffff8211156123e2576123e1611565565b5b602082029050602081019050919050565b600080fd5b6000815190506124078161204f565b92915050565b61241681611773565b811461242157600080fd5b50565b6000815190506124338161240d565b92915050565b60006060828403121561244f5761244e61234d565b5b61245960606115c5565b9050600082015167ffffffffffffffff81111561247957612478612352565b5b61248584828501612399565b6000830152506020612499848285016123f8565b60208301525060406124ad84828501612424565b60408301525092915050565b60006124cc6124c7846123c7565b6115c5565b905080838252602082019050602084028301858111156124ef576124ee6123f3565b5b835b8181101561253657805167ffffffffffffffff8111156125145761251361155b565b5b8086016125218982612439565b855260208501945050506020810190506124f1565b5050509392505050565b600082601f8301126125555761255461155b565b5b81516125658482602086016124b9565b91505092915050565b6000606082840312156125845761258361234d565b5b61258e60606115c5565b9050600082015167ffffffffffffffff8111156125ae576125ad612352565b5b6125ba84828501612399565b600083015250602082015167ffffffffffffffff8111156125de576125dd612352565b5b6125ea84828501612540565b602083015250604082015167ffffffffffffffff81111561260e5761260d612352565b5b61261a84828501612540565b60408301525092915050565b60006020828403121561263c5761263b611414565b5b600082015167ffffffffffffffff81111561265a57612659611419565b5b6126668482850161256e565b91505092915050565b60006040820190506126846000830185612264565b818103602083015261269681846120cc565b90509392505050565b7f6661696c65642064656c656761746543616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b60006126fb6021836120bb565b91506127068261269f565b604082019050919050565b6000602082019050818103600083015261272a816126ee565b9050919050565b600067ffffffffffffffff82111561274c5761274b611565565b5b602082029050602081019050919050565b6000604082840312156127735761277261234d565b5b61277d60406115c5565b9050600082015167ffffffffffffffff81111561279d5761279c612352565b5b6127a984828501612399565b60008301525060206127bd848285016123f8565b60208301525092915050565b60006127dc6127d784612731565b6115c5565b905080838252602082019050602084028301858111156127ff576127fe6123f3565b5b835b8181101561284657805167ffffffffffffffff8111156128245761282361155b565b5b808601612831898261275d565b85526020850194505050602081019050612801565b5050509392505050565b600082601f8301126128655761286461155b565b5b81516128758482602086016127c9565b91505092915050565b60006020828403121561289457612893611414565b5b600082015167ffffffffffffffff8111156128b2576128b1611419565b5b6128be84828501612850565b91505092915050565b6128d081611a72565b81146128db57600080fd5b50565b6000815190506128ed816128c7565b92915050565b60006020828403121561290957612908611414565b5b6000612917848285016128de565b91505092915050565b61292981611adf565b82525050565b60006040820190506129446000830185612264565b6129516020830184612920565b9392505050565b60006020828403121561296e5761296d611414565b5b600082015167ffffffffffffffff81111561298c5761298b611419565b5b61299884828501612540565b91505092915050565b6129aa81611c03565b82525050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126129dc576129db6129ba565b5b83810192508235915060208301925067ffffffffffffffff821115612a0457612a036129b0565b5b600182023603831315612a1a57612a196129b5565b5b509250929050565b6000612a2e8385611e22565b9350612a3b838584611611565b612a44836114ef565b840190509392505050565b6000612a5e6020840184611c2e565b905092915050565b600081359050612a75816128c7565b92915050565b6000612a8a6020840184612a66565b905092915050565b612a9b81611a72565b82525050565b600060a08301612ab460008401846129bf565b8583036000870152612ac7838284612a22565b92505050612ad86020840184612a4f565b612ae56020860182611d32565b50612af36040840184612a4f565b612b006040860182611d32565b50612b0e6060840184612a7b565b612b1b6060860182612a92565b50612b296080840184612a7b565b612b366080860182612a92565b508091505092915050565b60006080820190508181036000830152612b5b81876120cc565b9050612b6a60208301866129a1565b612b7760408301856129a1565b8181036060830152612b898184612aa1565b905095945050505050565b600067ffffffffffffffff821115612baf57612bae611565565b5b602082029050602081019050919050565b600081519050612bcf81611c17565b92915050565b600060408284031215612beb57612bea61234d565b5b612bf560406115c5565b90506000612c05848285016123f8565b6000830152506020612c1984828501612424565b60208301525092915050565b600060608284031215612c3b57612c3a61234d565b5b612c4560406115c5565b90506000612c5584828501612bc0565b6000830152506020612c6984828501612bd5565b60208301525092915050565b6000612c88612c8384612b94565b6115c5565b90508083825260208201905060608402830185811115612cab57612caa6123f3565b5b835b81811015612cd45780612cc08882612c25565b845260208401935050606081019050612cad565b5050509392505050565b600082601f830112612cf357612cf261155b565b5b8151612d03848260208601612c75565b91505092915050565b600067ffffffffffffffff821115612d2757612d26611565565b5b612d30826114ef565b9050602081019050919050565b6000612d50612d4b84612d0c565b6115c5565b905082815260208101848484011115612d6c57612d6b611560565b5b612d778482856114c5565b509392505050565b600082601f830112612d9457612d9361155b565b5b8151612da4848260208601612d3d565b91505092915050565b600060408284031215612dc357612dc261234d565b5b612dcd60406115c5565b9050600082015167ffffffffffffffff811115612ded57612dec612352565b5b612df984828501612d7f565b6000830152506020612e0d84828501612bc0565b60208301525092915050565b60008060408385031215612e3057612e2f611414565b5b600083015167ffffffffffffffff811115612e4e57612e4d611419565b5b612e5a85828601612cde565b925050602083015167ffffffffffffffff811115612e7b57612e7a611419565b5b612e8785828601612dad565b9150509250929050565b7f6661696c656420746f2073657420776974686472617720616464726573730000600082015250565b6000612ec7601e836120bb565b9150612ed282612e91565b602082019050919050565b60006020820190508181036000830152612ef681612eba565b9050919050565b600067ffffffffffffffff821115612f1857612f17611565565b5b602082029050602081019050919050565b6000612f3c612f3784612efd565b6115c5565b90508083825260208201905060208402830185811115612f5f57612f5e6123f3565b5b835b81811015612fa657805167ffffffffffffffff811115612f8457612f8361155b565b5b808601612f918982612399565b85526020850194505050602081019050612f61565b5050509392505050565b600082601f830112612fc557612fc461155b565b5b8151612fd5848260208601612f29565b91505092915050565b600060208284031215612ff457612ff3611414565b5b600082015167ffffffffffffffff81111561301257613011611419565b5b61301e84828501612fb0565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061306182611aa8565b915061306c83611aa8565b925082820190507fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008112677fffffffffffffff821317156130b0576130af613027565b5b92915050565b6130bf8161175a565b82525050565b60006040820190506130da6000830185612264565b6130e760208301846130b6565b9392505050565b60006130f982611aa8565b915061310483611aa8565b92508282039050677fffffffffffffff81137fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008212171561314857613147613027565b5b92915050565b60006020828403121561316457613163611414565b5b600082015167ffffffffffffffff81111561318257613181611419565b5b61318e84828501612399565b91505092915050565b600067ffffffffffffffff8211156131b2576131b1611565565b5b602082029050602081019050919050565b6000604082840312156131d9576131d861234d565b5b6131e360406115c5565b9050600082015167ffffffffffffffff81111561320357613202612352565b5b61320f84828501612399565b600083015250602082015167ffffffffffffffff81111561323357613232612352565b5b61323f84828501612540565b60208301525092915050565b600061325e61325984613197565b6115c5565b90508083825260208201905060208402830185811115613281576132806123f3565b5b835b818110156132c857805167ffffffffffffffff8111156132a6576132a561155b565b5b8086016132b389826131c3565b85526020850194505050602081019050613283565b5050509392505050565b600082601f8301126132e7576132e661155b565b5b81516132f784826020860161324b565b91505092915050565b6000806040838503121561331757613316611414565b5b600083015167ffffffffffffffff81111561333557613334611419565b5b613341858286016132d2565b925050602083015167ffffffffffffffff81111561336257613361611419565b5b61336e85828601612540565b915050925092905056fea264697066735822122094c0b1594b5e03b34ef443268583ae4b113d8910918409ef8c270372a0e18db764736f6c63430008130033", - "deployedBytecode": "0x60806040526004361061012a5760003560e01c806388b2d581116100ab578063c7804bb51161006f578063c7804bb514610489578063cb85aa0a146104c6578063d0e30db014610503578063d3f831be1461050d578063e0421e391461054a578063e236c7a6146105875761012a565b806388b2d58114610357578063963516e41461039557806398194593146103d2578063b2d178831461040f578063b6a216ae1461044c5761012a565b806361bc221a116100f257806361bc221a1461024c5780636f669da41461027757806378a5dfd1146102b4578063796b96d2146102f15780637c9db0bb1461031a5761012a565b806301b680001461012f5780630c05e9e41461016c578063296c60aa146101a95780632d0ee16a146101d257806346e16d341461020f575b600080fd5b34801561013b57600080fd5b506101566004803603810190610151919061147c565b6105c5565b6040516101639190611539565b60405180910390f35b34801561017857600080fd5b50610193600480360381019061018e9190611690565b61070d565b6040516101a091906118d3565b60405180910390f35b3480156101b557600080fd5b506101d060048036038101906101cb91906118f5565b61079d565b005b3480156101de57600080fd5b506101f960048036038101906101f49190611690565b6108de565b6040516102069190611a50565b60405180910390f35b34801561021b57600080fd5b50610236600480360381019061023191906118f5565b61096c565b6040516102439190611a8d565b60405180910390f35b34801561025857600080fd5b506102616109f6565b60405161026e9190611ac4565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190611b1b565b610a07565b6040516102ab9190611a8d565b60405180910390f35b3480156102c057600080fd5b506102db60048036038101906102d691906118f5565b610a91565b6040516102e89190611be1565b60405180910390f35b3480156102fd57600080fd5b50610318600480360381019061031391906118f5565b610b1e565b005b34801561032657600080fd5b50610341600480360381019061033c9190611690565b610c5f565b60405161034e9190611be1565b60405180910390f35b34801561036357600080fd5b5061037e60048036038101906103799190611c67565b610ce9565b60405161038c929190611ea9565b60405180910390f35b3480156103a157600080fd5b506103bc60048036038101906103b79190611690565b610d87565b6040516103c99190611a8d565b60405180910390f35b3480156103de57600080fd5b506103f960048036038101906103f491906118f5565b610e10565b6040516104069190611a50565b60405180910390f35b34801561041b57600080fd5b5061043660048036038101906104319190611ee0565b610e9f565b6040516104439190611a50565b60405180910390f35b34801561045857600080fd5b50610473600480360381019061046e919061147c565b610ff4565b604051610480919061202d565b60405180910390f35b34801561049557600080fd5b506104b060048036038101906104ab919061207b565b61107e565b6040516104bd9190611a8d565b60405180910390f35b3480156104d257600080fd5b506104ed60048036038101906104e8919061147c565b611196565b6040516104fa9190612105565b60405180910390f35b61050b611220565b005b34801561051957600080fd5b50610534600480360381019061052f9190611690565b611222565b6040516105419190611be1565b60405180910390f35b34801561055657600080fd5b50610571600480360381019061056c9190611690565b6112ac565b60405161057e9190611a50565b60405180910390f35b34801561059357600080fd5b506105ae60048036038101906105a9919061147c565b611338565b6040516105bc92919061222d565b60405180910390f35b606060008061080173ffffffffffffffffffffffffffffffffffffffff16846040516024016105f49190612273565b6040516020818303038152906040527f5431f450000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161067e91906122ca565b600060405180830381855afa9150503d80600081146106b9576040519150601f19603f3d011682016040523d82523d6000602084013e6106be565b606091505b509150915081610703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106fa9061232d565b60405180910390fd5b8092505050919050565b6107156113c5565b61080173ffffffffffffffffffffffffffffffffffffffff166354212a89836040518263ffffffff1660e01b81526004016107509190612105565b600060405180830381865afa15801561076d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906107969190612626565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff1683836040516024016107cb92919061266f565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161085591906122ca565b600060405180830381855af49150503d8060008114610890576040519150601f19603f3d011682016040523d82523d6000602084013e610895565b606091505b50509050806108d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d090612711565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6130846040518363ffffffff1660e01b815260040161091d92919061266f565b6000604051808303816000875af115801561093c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610965919061287e565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9684846040518363ffffffff1660e01b81526004016109ab92919061266f565b6020604051808303816000875af11580156109ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ee91906128f3565b905092915050565b60008054906101000a900460070b81565b600061080173ffffffffffffffffffffffffffffffffffffffff16632efe8a5f84846040518363ffffffff1660e01b8152600401610a4692919061292f565b6020604051808303816000875af1158015610a65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8991906128f3565b905092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff16639ad563b484846040518363ffffffff1660e01b8152600401610ad092919061266f565b600060405180830381865afa158015610aed573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610b169190612958565b905092915050565b600061080173ffffffffffffffffffffffffffffffffffffffff168383604051602401610b4c92919061266f565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610bd691906122ca565b600060405180830381855afa9150503d8060008114610c11576040519150601f19603f3d011682016040523d82523d6000602084013e610c16565b606091505b5050905080610c5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c519061232d565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633dd40f78836040518263ffffffff1660e01b8152600401610c9c9190612105565b600060405180830381865afa158015610cb9573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610ce29190612958565b9050919050565b6060610cf36113e6565b61080173ffffffffffffffffffffffffffffffffffffffff16638f2473ce878787876040518563ffffffff1660e01b8152600401610d349493929190612b41565b600060405180830381865afa158015610d51573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610d7a9190612e19565b9150915094509492505050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9630846040518363ffffffff1660e01b8152600401610dc692919061266f565b6020604051808303816000875af1158015610de5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0991906128f3565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6184846040518363ffffffff1660e01b8152600401610e4f92919061266f565b6000604051808303816000875af1158015610e6e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610e97919061287e565b905092915050565b6060600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9633876040518363ffffffff1660e01b8152600401610ee092919061266f565b6020604051808303816000875af1158015610eff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2391906128f3565b905080610f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5c90612edd565b60405180910390fd5b61080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6185856040518363ffffffff1660e01b8152600401610fa292919061266f565b6000604051808303816000875af1158015610fc1573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610fea919061287e565b9150509392505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663a66cb605836040518263ffffffff1660e01b81526004016110319190612273565b600060405180830381865afa15801561104e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110779190612fde565b9050919050565b600060016000808282829054906101000a900460070b61109e9190613056565b92506101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff16021790555061080173ffffffffffffffffffffffffffffffffffffffff1663ed41d0b684846040518363ffffffff1660e01b81526004016111049291906130c5565b6020604051808303816000875af1158015611123573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114791906128f3565b905060016000808282829054906101000a900460070b61116791906130ee565b92506101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff16021790555092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff16635431f450836040518263ffffffff1660e01b81526004016111d39190612273565b600060405180830381865afa1580156111f0573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611219919061314e565b9050919050565b565b606061080173ffffffffffffffffffffffffffffffffffffffff166385b2d2da836040518263ffffffff1660e01b815260040161125f9190612105565b600060405180830381865afa15801561127c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906112a59190612958565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633ce4e3be836040518263ffffffff1660e01b81526004016112e99190612105565b6000604051808303816000875af1158015611308573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611331919061287e565b9050919050565b60608061080173ffffffffffffffffffffffffffffffffffffffff166354be1a28846040518263ffffffff1660e01b81526004016113769190612273565b600060405180830381865afa158015611393573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906113bc9190613300565b91509150915091565b60405180606001604052806060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006114498261141e565b9050919050565b6114598161143e565b811461146457600080fd5b50565b60008135905061147681611450565b92915050565b60006020828403121561149257611491611414565b5b60006114a084828501611467565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156114e35780820151818401526020810190506114c8565b60008484015250505050565b6000601f19601f8301169050919050565b600061150b826114a9565b61151581856114b4565b93506115258185602086016114c5565b61152e816114ef565b840191505092915050565b600060208201905081810360008301526115538184611500565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61159d826114ef565b810181811067ffffffffffffffff821117156115bc576115bb611565565b5b80604052505050565b60006115cf61140a565b90506115db8282611594565b919050565b600067ffffffffffffffff8211156115fb576115fa611565565b5b611604826114ef565b9050602081019050919050565b82818337600083830152505050565b600061163361162e846115e0565b6115c5565b90508281526020810184848401111561164f5761164e611560565b5b61165a848285611611565b509392505050565b600082601f8301126116775761167661155b565b5b8135611687848260208601611620565b91505092915050565b6000602082840312156116a6576116a5611414565b5b600082013567ffffffffffffffff8111156116c4576116c3611419565b5b6116d084828501611662565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000611700826116d9565b61170a81856116e4565b935061171a8185602086016114c5565b611723816114ef565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000819050919050565b61176d8161175a565b82525050565b600060ff82169050919050565b61178981611773565b82525050565b600060608301600083015184820360008601526117ac82826116f5565b91505060208301516117c16020860182611764565b5060408301516117d46040860182611780565b508091505092915050565b60006117eb838361178f565b905092915050565b6000602082019050919050565b600061180b8261172e565b6118158185611739565b9350836020820285016118278561174a565b8060005b85811015611863578484038952815161184485826117df565b945061184f836117f3565b925060208a0199505060018101905061182b565b50829750879550505050505092915050565b6000606083016000830151848203600086015261189282826116f5565b915050602083015184820360208601526118ac8282611800565b915050604083015184820360408601526118c68282611800565b9150508091505092915050565b600060208201905081810360008301526118ed8184611875565b905092915050565b6000806040838503121561190c5761190b611414565b5b600061191a85828601611467565b925050602083013567ffffffffffffffff81111561193b5761193a611419565b5b61194785828601611662565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000604083016000830151848203600086015261199a82826116f5565b91505060208301516119af6020860182611764565b508091505092915050565b60006119c6838361197d565b905092915050565b6000602082019050919050565b60006119e682611951565b6119f0818561195c565b935083602082028501611a028561196d565b8060005b85811015611a3e5784840389528151611a1f85826119ba565b9450611a2a836119ce565b925060208a01995050600181019050611a06565b50829750879550505050505092915050565b60006020820190508181036000830152611a6a81846119db565b905092915050565b60008115159050919050565b611a8781611a72565b82525050565b6000602082019050611aa26000830184611a7e565b92915050565b60008160070b9050919050565b611abe81611aa8565b82525050565b6000602082019050611ad96000830184611ab5565b92915050565b600063ffffffff82169050919050565b611af881611adf565b8114611b0357600080fd5b50565b600081359050611b1581611aef565b92915050565b60008060408385031215611b3257611b31611414565b5b6000611b4085828601611467565b9250506020611b5185828601611b06565b9150509250929050565b600082825260208201905092915050565b6000611b778261172e565b611b818185611b5b565b935083602082028501611b938561174a565b8060005b85811015611bcf5784840389528151611bb085826117df565b9450611bbb836117f3565b925060208a01995050600181019050611b97565b50829750879550505050505092915050565b60006020820190508181036000830152611bfb8184611b6c565b905092915050565b600067ffffffffffffffff82169050919050565b611c2081611c03565b8114611c2b57600080fd5b50565b600081359050611c3d81611c17565b92915050565b600080fd5b600060a08284031215611c5e57611c5d611c43565b5b81905092915050565b60008060008060808587031215611c8157611c80611414565b5b600085013567ffffffffffffffff811115611c9f57611c9e611419565b5b611cab87828801611662565b9450506020611cbc87828801611c2e565b9350506040611ccd87828801611c2e565b925050606085013567ffffffffffffffff811115611cee57611ced611419565b5b611cfa87828801611c48565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611d3b81611c03565b82525050565b604082016000820151611d576000850182611764565b506020820151611d6a6020850182611780565b50505050565b606082016000820151611d866000850182611d32565b506020820151611d996020850182611d41565b50505050565b6000611dab8383611d70565b60608301905092915050565b6000602082019050919050565b6000611dcf82611d06565b611dd98185611d11565b9350611de483611d22565b8060005b83811015611e15578151611dfc8882611d9f565b9750611e0783611db7565b925050600181019050611de8565b5085935050505092915050565b600082825260208201905092915050565b6000611e3e826114a9565b611e488185611e22565b9350611e588185602086016114c5565b611e61816114ef565b840191505092915050565b60006040830160008301518482036000860152611e898282611e33565b9150506020830151611e9e6020860182611d32565b508091505092915050565b60006040820190508181036000830152611ec38185611dc4565b90508181036020830152611ed78184611e6c565b90509392505050565b600080600060608486031215611ef957611ef8611414565b5b600084013567ffffffffffffffff811115611f1757611f16611419565b5b611f2386828701611662565b9350506020611f3486828701611467565b925050604084013567ffffffffffffffff811115611f5557611f54611419565b5b611f6186828701611662565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000611fa383836116f5565b905092915050565b6000602082019050919050565b6000611fc382611f6b565b611fcd8185611f76565b935083602082028501611fdf85611f87565b8060005b8581101561201b5784840389528151611ffc8582611f97565b945061200783611fab565b925060208a01995050600181019050611fe3565b50829750879550505050505092915050565b600060208201905081810360008301526120478184611fb8565b905092915050565b6120588161175a565b811461206357600080fd5b50565b6000813590506120758161204f565b92915050565b6000806040838503121561209257612091611414565b5b60006120a085828601611467565b92505060206120b185828601612066565b9150509250929050565b600082825260208201905092915050565b60006120d7826116d9565b6120e181856120bb565b93506120f18185602086016114c5565b6120fa816114ef565b840191505092915050565b6000602082019050818103600083015261211f81846120cc565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000604083016000830151848203600086015261217082826116f5565b9150506020830151848203602086015261218a8282611800565b9150508091505092915050565b60006121a38383612153565b905092915050565b6000602082019050919050565b60006121c382612127565b6121cd8185612132565b9350836020820285016121df85612143565b8060005b8581101561221b57848403895281516121fc8582612197565b9450612207836121ab565b925060208a019950506001810190506121e3565b50829750879550505050505092915050565b6000604082019050818103600083015261224781856121b8565b9050818103602083015261225b8184611b6c565b90509392505050565b61226d8161143e565b82525050565b60006020820190506122886000830184612264565b92915050565b600081905092915050565b60006122a4826114a9565b6122ae818561228e565b93506122be8185602086016114c5565b80840191505092915050565b60006122d68284612299565b915081905092915050565b7f6661696c65642073746174696343616c6c20746f20707265636f6d70696c6500600082015250565b6000612317601f836120bb565b9150612322826122e1565b602082019050919050565b600060208201905081810360008301526123468161230a565b9050919050565b600080fd5b600080fd5b600061236a612365846115e0565b6115c5565b90508281526020810184848401111561238657612385611560565b5b6123918482856114c5565b509392505050565b600082601f8301126123ae576123ad61155b565b5b81516123be848260208601612357565b91505092915050565b600067ffffffffffffffff8211156123e2576123e1611565565b5b602082029050602081019050919050565b600080fd5b6000815190506124078161204f565b92915050565b61241681611773565b811461242157600080fd5b50565b6000815190506124338161240d565b92915050565b60006060828403121561244f5761244e61234d565b5b61245960606115c5565b9050600082015167ffffffffffffffff81111561247957612478612352565b5b61248584828501612399565b6000830152506020612499848285016123f8565b60208301525060406124ad84828501612424565b60408301525092915050565b60006124cc6124c7846123c7565b6115c5565b905080838252602082019050602084028301858111156124ef576124ee6123f3565b5b835b8181101561253657805167ffffffffffffffff8111156125145761251361155b565b5b8086016125218982612439565b855260208501945050506020810190506124f1565b5050509392505050565b600082601f8301126125555761255461155b565b5b81516125658482602086016124b9565b91505092915050565b6000606082840312156125845761258361234d565b5b61258e60606115c5565b9050600082015167ffffffffffffffff8111156125ae576125ad612352565b5b6125ba84828501612399565b600083015250602082015167ffffffffffffffff8111156125de576125dd612352565b5b6125ea84828501612540565b602083015250604082015167ffffffffffffffff81111561260e5761260d612352565b5b61261a84828501612540565b60408301525092915050565b60006020828403121561263c5761263b611414565b5b600082015167ffffffffffffffff81111561265a57612659611419565b5b6126668482850161256e565b91505092915050565b60006040820190506126846000830185612264565b818103602083015261269681846120cc565b90509392505050565b7f6661696c65642064656c656761746543616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b60006126fb6021836120bb565b91506127068261269f565b604082019050919050565b6000602082019050818103600083015261272a816126ee565b9050919050565b600067ffffffffffffffff82111561274c5761274b611565565b5b602082029050602081019050919050565b6000604082840312156127735761277261234d565b5b61277d60406115c5565b9050600082015167ffffffffffffffff81111561279d5761279c612352565b5b6127a984828501612399565b60008301525060206127bd848285016123f8565b60208301525092915050565b60006127dc6127d784612731565b6115c5565b905080838252602082019050602084028301858111156127ff576127fe6123f3565b5b835b8181101561284657805167ffffffffffffffff8111156128245761282361155b565b5b808601612831898261275d565b85526020850194505050602081019050612801565b5050509392505050565b600082601f8301126128655761286461155b565b5b81516128758482602086016127c9565b91505092915050565b60006020828403121561289457612893611414565b5b600082015167ffffffffffffffff8111156128b2576128b1611419565b5b6128be84828501612850565b91505092915050565b6128d081611a72565b81146128db57600080fd5b50565b6000815190506128ed816128c7565b92915050565b60006020828403121561290957612908611414565b5b6000612917848285016128de565b91505092915050565b61292981611adf565b82525050565b60006040820190506129446000830185612264565b6129516020830184612920565b9392505050565b60006020828403121561296e5761296d611414565b5b600082015167ffffffffffffffff81111561298c5761298b611419565b5b61299884828501612540565b91505092915050565b6129aa81611c03565b82525050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126129dc576129db6129ba565b5b83810192508235915060208301925067ffffffffffffffff821115612a0457612a036129b0565b5b600182023603831315612a1a57612a196129b5565b5b509250929050565b6000612a2e8385611e22565b9350612a3b838584611611565b612a44836114ef565b840190509392505050565b6000612a5e6020840184611c2e565b905092915050565b600081359050612a75816128c7565b92915050565b6000612a8a6020840184612a66565b905092915050565b612a9b81611a72565b82525050565b600060a08301612ab460008401846129bf565b8583036000870152612ac7838284612a22565b92505050612ad86020840184612a4f565b612ae56020860182611d32565b50612af36040840184612a4f565b612b006040860182611d32565b50612b0e6060840184612a7b565b612b1b6060860182612a92565b50612b296080840184612a7b565b612b366080860182612a92565b508091505092915050565b60006080820190508181036000830152612b5b81876120cc565b9050612b6a60208301866129a1565b612b7760408301856129a1565b8181036060830152612b898184612aa1565b905095945050505050565b600067ffffffffffffffff821115612baf57612bae611565565b5b602082029050602081019050919050565b600081519050612bcf81611c17565b92915050565b600060408284031215612beb57612bea61234d565b5b612bf560406115c5565b90506000612c05848285016123f8565b6000830152506020612c1984828501612424565b60208301525092915050565b600060608284031215612c3b57612c3a61234d565b5b612c4560406115c5565b90506000612c5584828501612bc0565b6000830152506020612c6984828501612bd5565b60208301525092915050565b6000612c88612c8384612b94565b6115c5565b90508083825260208201905060608402830185811115612cab57612caa6123f3565b5b835b81811015612cd45780612cc08882612c25565b845260208401935050606081019050612cad565b5050509392505050565b600082601f830112612cf357612cf261155b565b5b8151612d03848260208601612c75565b91505092915050565b600067ffffffffffffffff821115612d2757612d26611565565b5b612d30826114ef565b9050602081019050919050565b6000612d50612d4b84612d0c565b6115c5565b905082815260208101848484011115612d6c57612d6b611560565b5b612d778482856114c5565b509392505050565b600082601f830112612d9457612d9361155b565b5b8151612da4848260208601612d3d565b91505092915050565b600060408284031215612dc357612dc261234d565b5b612dcd60406115c5565b9050600082015167ffffffffffffffff811115612ded57612dec612352565b5b612df984828501612d7f565b6000830152506020612e0d84828501612bc0565b60208301525092915050565b60008060408385031215612e3057612e2f611414565b5b600083015167ffffffffffffffff811115612e4e57612e4d611419565b5b612e5a85828601612cde565b925050602083015167ffffffffffffffff811115612e7b57612e7a611419565b5b612e8785828601612dad565b9150509250929050565b7f6661696c656420746f2073657420776974686472617720616464726573730000600082015250565b6000612ec7601e836120bb565b9150612ed282612e91565b602082019050919050565b60006020820190508181036000830152612ef681612eba565b9050919050565b600067ffffffffffffffff821115612f1857612f17611565565b5b602082029050602081019050919050565b6000612f3c612f3784612efd565b6115c5565b90508083825260208201905060208402830185811115612f5f57612f5e6123f3565b5b835b81811015612fa657805167ffffffffffffffff811115612f8457612f8361155b565b5b808601612f918982612399565b85526020850194505050602081019050612f61565b5050509392505050565b600082601f830112612fc557612fc461155b565b5b8151612fd5848260208601612f29565b91505092915050565b600060208284031215612ff457612ff3611414565b5b600082015167ffffffffffffffff81111561301257613011611419565b5b61301e84828501612fb0565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061306182611aa8565b915061306c83611aa8565b925082820190507fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008112677fffffffffffffff821317156130b0576130af613027565b5b92915050565b6130bf8161175a565b82525050565b60006040820190506130da6000830185612264565b6130e760208301846130b6565b9392505050565b60006130f982611aa8565b915061310483611aa8565b92508282039050677fffffffffffffff81137fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008212171561314857613147613027565b5b92915050565b60006020828403121561316457613163611414565b5b600082015167ffffffffffffffff81111561318257613181611419565b5b61318e84828501612399565b91505092915050565b600067ffffffffffffffff8211156131b2576131b1611565565b5b602082029050602081019050919050565b6000604082840312156131d9576131d861234d565b5b6131e360406115c5565b9050600082015167ffffffffffffffff81111561320357613202612352565b5b61320f84828501612399565b600083015250602082015167ffffffffffffffff81111561323357613232612352565b5b61323f84828501612540565b60208301525092915050565b600061325e61325984613197565b6115c5565b90508083825260208201905060208402830185811115613281576132806123f3565b5b835b818110156132c857805167ffffffffffffffff8111156132a6576132a561155b565b5b8086016132b389826131c3565b85526020850194505050602081019050613283565b5050509392505050565b600082601f8301126132e7576132e661155b565b5b81516132f784826020860161324b565b91505092915050565b6000806040838503121561331757613316611414565b5b600083015167ffffffffffffffff81111561333557613334611419565b5b613341858286016132d2565b925050602083015167ffffffffffffffff81111561336257613361611419565b5b61336e85828601612540565b915050925092905056fea264697066735822122094c0b1594b5e03b34ef443268583ae4b113d8910918409ef8c270372a0e18db764736f6c63430008130033", + "bytecode": "0x608060405234801561001057600080fd5b5061477b806100206000396000f3fe60806040526004361061019c5760003560e01c80637c9db0bb116100ec578063b6a216ae1161008a578063d0e30db011610064578063d0e30db0146106a7578063d3f831be146106b1578063e0421e39146106ee578063e236c7a61461072b5761019c565b8063b6a216ae146105f0578063c7804bb51461062d578063cb85aa0a1461066a5761019c565b806398194593116100c657806398194593146104fc578063ad5c4cdd14610539578063adb2378514610576578063b2d17883146105b35761019c565b80637c9db0bb1461044457806388b2d58114610481578063963516e4146104bf5761019c565b806346e16d34116101595780636cc9ac8a116101335780636cc9ac8a146103785780636f669da4146103a157806378a5dfd1146103de578063796b96d21461041b5761019c565b806346e16d34146102d3578063613d4de81461031057806361bc221a1461034d5761019c565b80630183e4b4146101a157806301b68000146101ca5780630c05e9e4146102075780631b05020714610244578063296c60aa1461026d5780632d0ee16a14610296575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c391906123de565b610769565b005b3480156101d657600080fd5b506101f160048036038101906101ec9190612483565b610a96565b6040516101fe9190612540565b60405180910390f35b34801561021357600080fd5b5061022e60048036038101906102299190612697565b610bde565b60405161023b91906128da565b60405180910390f35b34801561025057600080fd5b5061026b600480360381019061026691906128fc565b610c6e565b005b34801561027957600080fd5b50610294600480360381019061028f919061297f565b610df4565b005b3480156102a257600080fd5b506102bd60048036038101906102b89190612697565b610f35565b6040516102ca9190612ada565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f5919061297f565b610fc3565b6040516103079190612b0b565b60405180910390f35b34801561031c57600080fd5b5061033760048036038101906103329190612b26565b61104d565b6040516103449190612ada565b60405180910390f35b34801561035957600080fd5b5061036261133e565b60405161036f9190612bc5565b60405180910390f35b34801561038457600080fd5b5061039f600480360381019061039a9190612c0c565b61134f565b005b3480156103ad57600080fd5b506103c860048036038101906103c39190612c73565b6115de565b6040516103d59190612b0b565b60405180910390f35b3480156103ea57600080fd5b506104056004803603810190610400919061297f565b611668565b6040516104129190612d39565b60405180910390f35b34801561042757600080fd5b50610442600480360381019061043d919061297f565b6116f5565b005b34801561045057600080fd5b5061046b60048036038101906104669190612697565b611836565b6040516104789190612d39565b60405180910390f35b34801561048d57600080fd5b506104a860048036038101906104a39190612dbf565b6118c0565b6040516104b6929190613001565b60405180910390f35b3480156104cb57600080fd5b506104e660048036038101906104e19190612697565b61195e565b6040516104f39190612b0b565b60405180910390f35b34801561050857600080fd5b50610523600480360381019061051e919061297f565b6119e7565b6040516105309190612ada565b60405180910390f35b34801561054557600080fd5b50610560600480360381019061055b919061297f565b611a76565b60405161056d9190612ada565b60405180910390f35b34801561058257600080fd5b5061059d60048036038101906105989190613038565b611b02565b6040516105aa9190612ada565b60405180910390f35b3480156105bf57600080fd5b506105da60048036038101906105d591906130bb565b611d8d565b6040516105e79190612ada565b60405180910390f35b3480156105fc57600080fd5b5061061760048036038101906106129190612483565b611ee2565b6040516106249190613208565b60405180910390f35b34801561063957600080fd5b50610654600480360381019061064f919061322a565b611f6c565b6040516106619190612b0b565b60405180910390f35b34801561067657600080fd5b50610691600480360381019061068c9190612483565b612084565b60405161069e91906132b4565b60405180910390f35b6106af61210e565b005b3480156106bd57600080fd5b506106d860048036038101906106d39190612697565b612110565b6040516106e59190612d39565b60405180910390f35b3480156106fa57600080fd5b5061071560048036038101906107109190612697565b61219a565b6040516107229190612ada565b60405180910390f35b34801561073757600080fd5b50610752600480360381019061074d9190612483565b612226565b6040516107609291906133dc565b60405180910390f35b811561089a5760008081819054906101000a900460070b8092919061078d90613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff160217905550503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146108995760008473ffffffffffffffffffffffffffffffffffffffff16600f604051610811906134a3565b60006040518083038185875af1925050503d806000811461084e576040519150601f19603f3d011682016040523d82523d6000602084013e610853565b606091505b5050905080610897576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088e9061352a565b60405180910390fd5b505b5b600061080173ffffffffffffffffffffffffffffffffffffffff16632efe8a5f86866040518363ffffffff1660e01b81526004016108d99291906135b8565b6020604051808303816000875af11580156108f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091c91906135f6565b90508061095e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109559061366f565b60405180910390fd5b8115610a8f5760008081819054906101000a900460070b8092919061098290613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff160217905550503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614610a8e5760008573ffffffffffffffffffffffffffffffffffffffff16600f604051610a06906134a3565b60006040518083038185875af1925050503d8060008114610a43576040519150601f19603f3d011682016040523d82523d6000602084013e610a48565b606091505b5050905080610a8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a839061352a565b60405180910390fd5b505b5b5050505050565b606060008061080173ffffffffffffffffffffffffffffffffffffffff1684604051602401610ac5919061369e565b6040516020818303038152906040527f5431f450000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610b4f91906136ea565b600060405180830381855afa9150503d8060008114610b8a576040519150601f19603f3d011682016040523d82523d6000602084013e610b8f565b606091505b509150915081610bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcb9061374d565b60405180910390fd5b8092505050919050565b610be66122b3565b61080173ffffffffffffffffffffffffffffffffffffffff166354212a89836040518263ffffffff1660e01b8152600401610c2191906132b4565b600060405180830381865afa158015610c3e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610c679190613a46565b9050919050565b3073ffffffffffffffffffffffffffffffffffffffff1663ad5c4cdd85846040518363ffffffff1660e01b8152600401610ca9929190613a8f565b6000604051808303816000875af1925050508015610cea57506040513d6000823e3d601f19601f82011682018060405250810190610ce79190613c0c565b60015b15610cf157505b8015610dee5760008081819054906101000a900460070b80929190610d1590613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008373ffffffffffffffffffffffffffffffffffffffff16600f604051610d66906134a3565b60006040518083038185875af1925050503d8060008114610da3576040519150601f19603f3d011682016040523d82523d6000602084013e610da8565b606091505b5050905080610dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de39061352a565b60405180910390fd5b505b50505050565b600061080173ffffffffffffffffffffffffffffffffffffffff168383604051602401610e22929190613c55565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610eac91906136ea565b600060405180830381855af49150503d8060008114610ee7576040519150601f19603f3d011682016040523d82523d6000602084013e610eec565b606091505b5050905080610f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2790613cf7565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6130846040518363ffffffff1660e01b8152600401610f74929190613c55565b6000604051808303816000875af1158015610f93573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610fbc9190613c0c565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9684846040518363ffffffff1660e01b8152600401611002929190613c55565b6020604051808303816000875af1158015611021573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104591906135f6565b905092915050565b606082156111805760008081819054906101000a900460070b8092919061107390613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff160217905550503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461117f5760008473ffffffffffffffffffffffffffffffffffffffff16600f6040516110f7906134a3565b60006040518083038185875af1925050503d8060008114611134576040519150601f19603f3d011682016040523d82523d6000602084013e611139565b606091505b505090508061117d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111749061352a565b60405180910390fd5b505b5b61080173ffffffffffffffffffffffffffffffffffffffff16633ce4e3be866040518263ffffffff1660e01b81526004016111bb91906132b4565b6000604051808303816000875af11580156111da573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906112039190613c0c565b905081156113365760008081819054906101000a900460070b8092919061122990613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff160217905550503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146113355760008473ffffffffffffffffffffffffffffffffffffffff16600f6040516112ad906134a3565b60006040518083038185875af1925050503d80600081146112ea576040519150601f19603f3d011682016040523d82523d6000602084013e6112ef565b606091505b5050905080611333576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132a9061352a565b60405180910390fd5b505b5b949350505050565b60008054906101000a900460070b81565b811561144c5760008081819054906101000a900460070b8092919061137390613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008473ffffffffffffffffffffffffffffffffffffffff16600f6040516113c4906134a3565b60006040518083038185875af1925050503d8060008114611401576040519150601f19603f3d011682016040523d82523d6000602084013e611406565b606091505b505090508061144a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114419061352a565b60405180910390fd5b505b600061080173ffffffffffffffffffffffffffffffffffffffff1663ed41d0b686866040518363ffffffff1660e01b815260040161148b929190613d26565b6020604051808303816000875af11580156114aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ce91906135f6565b9050806114da57600080fd5b81156115d75760008081819054906101000a900460070b809291906114fe90613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008573ffffffffffffffffffffffffffffffffffffffff16600f60405161154f906134a3565b60006040518083038185875af1925050503d806000811461158c576040519150601f19603f3d011682016040523d82523d6000602084013e611591565b606091505b50509050806115d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cc9061352a565b60405180910390fd5b505b5050505050565b600061080173ffffffffffffffffffffffffffffffffffffffff16632efe8a5f84846040518363ffffffff1660e01b815260040161161d929190613d4f565b6020604051808303816000875af115801561163c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166091906135f6565b905092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff16639ad563b484846040518363ffffffff1660e01b81526004016116a7929190613c55565b600060405180830381865afa1580156116c4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906116ed9190613d78565b905092915050565b600061080173ffffffffffffffffffffffffffffffffffffffff168383604051602401611723929190613c55565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516117ad91906136ea565b600060405180830381855afa9150503d80600081146117e8576040519150601f19603f3d011682016040523d82523d6000602084013e6117ed565b606091505b5050905080611831576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118289061374d565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633dd40f78836040518263ffffffff1660e01b815260040161187391906132b4565b600060405180830381865afa158015611890573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906118b99190613d78565b9050919050565b60606118ca6122d4565b61080173ffffffffffffffffffffffffffffffffffffffff16638f2473ce878787876040518563ffffffff1660e01b815260040161190b9493929190613f4c565b600060405180830381865afa158015611928573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906119519190614224565b9150915094509492505050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9630846040518363ffffffff1660e01b815260040161199d929190613c55565b6020604051808303816000875af11580156119bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e091906135f6565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6184846040518363ffffffff1660e01b8152600401611a26929190613c55565b6000604051808303816000875af1158015611a45573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611a6e9190613c0c565b905092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6184846040518363ffffffff1660e01b8152600401611ab5929190613c55565b6000604051808303816000875af1158015611ad4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611afd9190613c0c565b600080fd5b60608215611c015760008081819054906101000a900460070b80929190611b2890613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008573ffffffffffffffffffffffffffffffffffffffff16600f604051611b79906134a3565b60006040518083038185875af1925050503d8060008114611bb6576040519150601f19603f3d011682016040523d82523d6000602084013e611bbb565b606091505b5050905080611bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf69061352a565b60405180910390fd5b505b61080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6186866040518363ffffffff1660e01b8152600401611c3e929190613a8f565b6000604051808303816000875af1158015611c5d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611c869190613c0c565b90508115611d855760008081819054906101000a900460070b80929190611cac90613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008573ffffffffffffffffffffffffffffffffffffffff16600f604051611cfd906134a3565b60006040518083038185875af1925050503d8060008114611d3a576040519150601f19603f3d011682016040523d82523d6000602084013e611d3f565b606091505b5050905080611d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7a9061352a565b60405180910390fd5b505b949350505050565b6060600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9633876040518363ffffffff1660e01b8152600401611dce929190613c55565b6020604051808303816000875af1158015611ded573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e1191906135f6565b905080611e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4a906142e8565b60405180910390fd5b61080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6185856040518363ffffffff1660e01b8152600401611e90929190613c55565b6000604051808303816000875af1158015611eaf573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611ed89190613c0c565b9150509392505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663a66cb605836040518263ffffffff1660e01b8152600401611f1f919061369e565b600060405180830381865afa158015611f3c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611f6591906143e9565b9050919050565b600060016000808282829054906101000a900460070b611f8c9190614432565b92506101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff16021790555061080173ffffffffffffffffffffffffffffffffffffffff1663ed41d0b684846040518363ffffffff1660e01b8152600401611ff2929190614492565b6020604051808303816000875af1158015612011573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203591906135f6565b905060016000808282829054906101000a900460070b61205591906144bb565b92506101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff16021790555092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff16635431f450836040518263ffffffff1660e01b81526004016120c1919061369e565b600060405180830381865afa1580156120de573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612107919061451b565b9050919050565b565b606061080173ffffffffffffffffffffffffffffffffffffffff166385b2d2da836040518263ffffffff1660e01b815260040161214d91906132b4565b600060405180830381865afa15801561216a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906121939190613d78565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633ce4e3be836040518263ffffffff1660e01b81526004016121d791906132b4565b6000604051808303816000875af11580156121f6573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061221f9190613c0c565b9050919050565b60608061080173ffffffffffffffffffffffffffffffffffffffff166354be1a28846040518263ffffffff1660e01b8152600401612264919061369e565b600060405180830381865afa158015612281573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906122aa91906146cd565b91509150915091565b60405180606001604052806060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123378261230c565b9050919050565b6123478161232c565b811461235257600080fd5b50565b6000813590506123648161233e565b92915050565b600063ffffffff82169050919050565b6123838161236a565b811461238e57600080fd5b50565b6000813590506123a08161237a565b92915050565b60008115159050919050565b6123bb816123a6565b81146123c657600080fd5b50565b6000813590506123d8816123b2565b92915050565b600080600080608085870312156123f8576123f7612302565b5b600061240687828801612355565b945050602061241787828801612391565b9350506040612428878288016123c9565b9250506060612439878288016123c9565b91505092959194509250565b60006124508261230c565b9050919050565b61246081612445565b811461246b57600080fd5b50565b60008135905061247d81612457565b92915050565b60006020828403121561249957612498612302565b5b60006124a78482850161246e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156124ea5780820151818401526020810190506124cf565b60008484015250505050565b6000601f19601f8301169050919050565b6000612512826124b0565b61251c81856124bb565b935061252c8185602086016124cc565b612535816124f6565b840191505092915050565b6000602082019050818103600083015261255a8184612507565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6125a4826124f6565b810181811067ffffffffffffffff821117156125c3576125c261256c565b5b80604052505050565b60006125d66122f8565b90506125e2828261259b565b919050565b600067ffffffffffffffff8211156126025761260161256c565b5b61260b826124f6565b9050602081019050919050565b82818337600083830152505050565b600061263a612635846125e7565b6125cc565b90508281526020810184848401111561265657612655612567565b5b612661848285612618565b509392505050565b600082601f83011261267e5761267d612562565b5b813561268e848260208601612627565b91505092915050565b6000602082840312156126ad576126ac612302565b5b600082013567ffffffffffffffff8111156126cb576126ca612307565b5b6126d784828501612669565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000612707826126e0565b61271181856126eb565b93506127218185602086016124cc565b61272a816124f6565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000819050919050565b61277481612761565b82525050565b600060ff82169050919050565b6127908161277a565b82525050565b600060608301600083015184820360008601526127b382826126fc565b91505060208301516127c8602086018261276b565b5060408301516127db6040860182612787565b508091505092915050565b60006127f28383612796565b905092915050565b6000602082019050919050565b600061281282612735565b61281c8185612740565b93508360208202850161282e85612751565b8060005b8581101561286a578484038952815161284b85826127e6565b9450612856836127fa565b925060208a01995050600181019050612832565b50829750879550505050505092915050565b6000606083016000830151848203600086015261289982826126fc565b915050602083015184820360208601526128b38282612807565b915050604083015184820360408601526128cd8282612807565b9150508091505092915050565b600060208201905081810360008301526128f4818461287c565b905092915050565b6000806000806080858703121561291657612915612302565b5b600061292487828801612355565b945050602061293587828801612355565b935050604085013567ffffffffffffffff81111561295657612955612307565b5b61296287828801612669565b9250506060612973878288016123c9565b91505092959194509250565b6000806040838503121561299657612995612302565b5b60006129a48582860161246e565b925050602083013567ffffffffffffffff8111156129c5576129c4612307565b5b6129d185828601612669565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006040830160008301518482036000860152612a2482826126fc565b9150506020830151612a39602086018261276b565b508091505092915050565b6000612a508383612a07565b905092915050565b6000602082019050919050565b6000612a70826129db565b612a7a81856129e6565b935083602082028501612a8c856129f7565b8060005b85811015612ac85784840389528151612aa98582612a44565b9450612ab483612a58565b925060208a01995050600181019050612a90565b50829750879550505050505092915050565b60006020820190508181036000830152612af48184612a65565b905092915050565b612b05816123a6565b82525050565b6000602082019050612b206000830184612afc565b92915050565b60008060008060808587031215612b4057612b3f612302565b5b600085013567ffffffffffffffff811115612b5e57612b5d612307565b5b612b6a87828801612669565b9450506020612b7b87828801612355565b9350506040612b8c878288016123c9565b9250506060612b9d878288016123c9565b91505092959194509250565b60008160070b9050919050565b612bbf81612ba9565b82525050565b6000602082019050612bda6000830184612bb6565b92915050565b612be981612761565b8114612bf457600080fd5b50565b600081359050612c0681612be0565b92915050565b60008060008060808587031215612c2657612c25612302565b5b6000612c3487828801612355565b9450506020612c4587828801612bf7565b9350506040612c56878288016123c9565b9250506060612c67878288016123c9565b91505092959194509250565b60008060408385031215612c8a57612c89612302565b5b6000612c988582860161246e565b9250506020612ca985828601612391565b9150509250929050565b600082825260208201905092915050565b6000612ccf82612735565b612cd98185612cb3565b935083602082028501612ceb85612751565b8060005b85811015612d275784840389528151612d0885826127e6565b9450612d13836127fa565b925060208a01995050600181019050612cef565b50829750879550505050505092915050565b60006020820190508181036000830152612d538184612cc4565b905092915050565b600067ffffffffffffffff82169050919050565b612d7881612d5b565b8114612d8357600080fd5b50565b600081359050612d9581612d6f565b92915050565b600080fd5b600060a08284031215612db657612db5612d9b565b5b81905092915050565b60008060008060808587031215612dd957612dd8612302565b5b600085013567ffffffffffffffff811115612df757612df6612307565b5b612e0387828801612669565b9450506020612e1487828801612d86565b9350506040612e2587828801612d86565b925050606085013567ffffffffffffffff811115612e4657612e45612307565b5b612e5287828801612da0565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612e9381612d5b565b82525050565b604082016000820151612eaf600085018261276b565b506020820151612ec26020850182612787565b50505050565b606082016000820151612ede6000850182612e8a565b506020820151612ef16020850182612e99565b50505050565b6000612f038383612ec8565b60608301905092915050565b6000602082019050919050565b6000612f2782612e5e565b612f318185612e69565b9350612f3c83612e7a565b8060005b83811015612f6d578151612f548882612ef7565b9750612f5f83612f0f565b925050600181019050612f40565b5085935050505092915050565b600082825260208201905092915050565b6000612f96826124b0565b612fa08185612f7a565b9350612fb08185602086016124cc565b612fb9816124f6565b840191505092915050565b60006040830160008301518482036000860152612fe18282612f8b565b9150506020830151612ff66020860182612e8a565b508091505092915050565b6000604082019050818103600083015261301b8185612f1c565b9050818103602083015261302f8184612fc4565b90509392505050565b6000806000806080858703121561305257613051612302565b5b600061306087828801612355565b945050602085013567ffffffffffffffff81111561308157613080612307565b5b61308d87828801612669565b935050604061309e878288016123c9565b92505060606130af878288016123c9565b91505092959194509250565b6000806000606084860312156130d4576130d3612302565b5b600084013567ffffffffffffffff8111156130f2576130f1612307565b5b6130fe86828701612669565b935050602061310f8682870161246e565b925050604084013567ffffffffffffffff8111156131305761312f612307565b5b61313c86828701612669565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061317e83836126fc565b905092915050565b6000602082019050919050565b600061319e82613146565b6131a88185613151565b9350836020820285016131ba85613162565b8060005b858110156131f657848403895281516131d78582613172565b94506131e283613186565b925060208a019950506001810190506131be565b50829750879550505050505092915050565b600060208201905081810360008301526132228184613193565b905092915050565b6000806040838503121561324157613240612302565b5b600061324f8582860161246e565b925050602061326085828601612bf7565b9150509250929050565b600082825260208201905092915050565b6000613286826126e0565b613290818561326a565b93506132a08185602086016124cc565b6132a9816124f6565b840191505092915050565b600060208201905081810360008301526132ce818461327b565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000604083016000830151848203600086015261331f82826126fc565b915050602083015184820360208601526133398282612807565b9150508091505092915050565b60006133528383613302565b905092915050565b6000602082019050919050565b6000613372826132d6565b61337c81856132e1565b93508360208202850161338e856132f2565b8060005b858110156133ca57848403895281516133ab8582613346565b94506133b68361335a565b925060208a01995050600181019050613392565b50829750879550505050505092915050565b600060408201905081810360008301526133f68185613367565b9050818103602083015261340a8184612cc4565b90509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061344d82612ba9565b9150677fffffffffffffff820361346757613466613413565b5b600182019050919050565b600081905092915050565b50565b600061348d600083613472565b91506134988261347d565b600082019050919050565b60006134ae82613480565b9150819050919050565b7f4661696c656420746f2073656e6420457468657220746f2064656c656761746f60008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061351460218361326a565b915061351f826134b8565b604082019050919050565b6000602082019050818103600083015261354381613507565b9050919050565b6000819050919050565b600061356f61356a6135658461230c565b61354a565b61230c565b9050919050565b600061358182613554565b9050919050565b600061359382613576565b9050919050565b6135a381613588565b82525050565b6135b28161236a565b82525050565b60006040820190506135cd600083018561359a565b6135da60208301846135a9565b9392505050565b6000815190506135f0816123b2565b92915050565b60006020828403121561360c5761360b612302565b5b600061361a848285016135e1565b91505092915050565b7f6661696c656420746f20636c61696d2072657761726473000000000000000000600082015250565b600061365960178361326a565b915061366482613623565b602082019050919050565b600060208201905081810360008301526136888161364c565b9050919050565b61369881612445565b82525050565b60006020820190506136b3600083018461368f565b92915050565b60006136c4826124b0565b6136ce8185613472565b93506136de8185602086016124cc565b80840191505092915050565b60006136f682846136b9565b915081905092915050565b7f6661696c65642073746174696343616c6c20746f20707265636f6d70696c6500600082015250565b6000613737601f8361326a565b915061374282613701565b602082019050919050565b600060208201905081810360008301526137668161372a565b9050919050565b600080fd5b600080fd5b600061378a613785846125e7565b6125cc565b9050828152602081018484840111156137a6576137a5612567565b5b6137b18482856124cc565b509392505050565b600082601f8301126137ce576137cd612562565b5b81516137de848260208601613777565b91505092915050565b600067ffffffffffffffff8211156138025761380161256c565b5b602082029050602081019050919050565b600080fd5b60008151905061382781612be0565b92915050565b6138368161277a565b811461384157600080fd5b50565b6000815190506138538161382d565b92915050565b60006060828403121561386f5761386e61376d565b5b61387960606125cc565b9050600082015167ffffffffffffffff81111561389957613898613772565b5b6138a5848285016137b9565b60008301525060206138b984828501613818565b60208301525060406138cd84828501613844565b60408301525092915050565b60006138ec6138e7846137e7565b6125cc565b9050808382526020820190506020840283018581111561390f5761390e613813565b5b835b8181101561395657805167ffffffffffffffff81111561393457613933612562565b5b8086016139418982613859565b85526020850194505050602081019050613911565b5050509392505050565b600082601f83011261397557613974612562565b5b81516139858482602086016138d9565b91505092915050565b6000606082840312156139a4576139a361376d565b5b6139ae60606125cc565b9050600082015167ffffffffffffffff8111156139ce576139cd613772565b5b6139da848285016137b9565b600083015250602082015167ffffffffffffffff8111156139fe576139fd613772565b5b613a0a84828501613960565b602083015250604082015167ffffffffffffffff811115613a2e57613a2d613772565b5b613a3a84828501613960565b60408301525092915050565b600060208284031215613a5c57613a5b612302565b5b600082015167ffffffffffffffff811115613a7a57613a79612307565b5b613a868482850161398e565b91505092915050565b6000604082019050613aa4600083018561359a565b8181036020830152613ab6818461327b565b90509392505050565b600067ffffffffffffffff821115613ada57613ad961256c565b5b602082029050602081019050919050565b600060408284031215613b0157613b0061376d565b5b613b0b60406125cc565b9050600082015167ffffffffffffffff811115613b2b57613b2a613772565b5b613b37848285016137b9565b6000830152506020613b4b84828501613818565b60208301525092915050565b6000613b6a613b6584613abf565b6125cc565b90508083825260208201905060208402830185811115613b8d57613b8c613813565b5b835b81811015613bd457805167ffffffffffffffff811115613bb257613bb1612562565b5b808601613bbf8982613aeb565b85526020850194505050602081019050613b8f565b5050509392505050565b600082601f830112613bf357613bf2612562565b5b8151613c03848260208601613b57565b91505092915050565b600060208284031215613c2257613c21612302565b5b600082015167ffffffffffffffff811115613c4057613c3f612307565b5b613c4c84828501613bde565b91505092915050565b6000604082019050613c6a600083018561368f565b8181036020830152613c7c818461327b565b90509392505050565b7f6661696c65642064656c656761746543616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000613ce160218361326a565b9150613cec82613c85565b604082019050919050565b60006020820190508181036000830152613d1081613cd4565b9050919050565b613d2081612761565b82525050565b6000604082019050613d3b600083018561359a565b613d486020830184613d17565b9392505050565b6000604082019050613d64600083018561368f565b613d7160208301846135a9565b9392505050565b600060208284031215613d8e57613d8d612302565b5b600082015167ffffffffffffffff811115613dac57613dab612307565b5b613db884828501613960565b91505092915050565b613dca81612d5b565b82525050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112613dfc57613dfb613dda565b5b83810192508235915060208301925067ffffffffffffffff821115613e2457613e23613dd0565b5b600182023603831315613e3a57613e39613dd5565b5b509250929050565b6000613e4e8385612f7a565b9350613e5b838584612618565b613e64836124f6565b840190509392505050565b6000613e7e6020840184612d86565b905092915050565b6000613e9560208401846123c9565b905092915050565b613ea6816123a6565b82525050565b600060a08301613ebf6000840184613ddf565b8583036000870152613ed2838284613e42565b92505050613ee36020840184613e6f565b613ef06020860182612e8a565b50613efe6040840184613e6f565b613f0b6040860182612e8a565b50613f196060840184613e86565b613f266060860182613e9d565b50613f346080840184613e86565b613f416080860182613e9d565b508091505092915050565b60006080820190508181036000830152613f66818761327b565b9050613f756020830186613dc1565b613f826040830185613dc1565b8181036060830152613f948184613eac565b905095945050505050565b600067ffffffffffffffff821115613fba57613fb961256c565b5b602082029050602081019050919050565b600081519050613fda81612d6f565b92915050565b600060408284031215613ff657613ff561376d565b5b61400060406125cc565b9050600061401084828501613818565b600083015250602061402484828501613844565b60208301525092915050565b6000606082840312156140465761404561376d565b5b61405060406125cc565b9050600061406084828501613fcb565b600083015250602061407484828501613fe0565b60208301525092915050565b600061409361408e84613f9f565b6125cc565b905080838252602082019050606084028301858111156140b6576140b5613813565b5b835b818110156140df57806140cb8882614030565b8452602084019350506060810190506140b8565b5050509392505050565b600082601f8301126140fe576140fd612562565b5b815161410e848260208601614080565b91505092915050565b600067ffffffffffffffff8211156141325761413161256c565b5b61413b826124f6565b9050602081019050919050565b600061415b61415684614117565b6125cc565b90508281526020810184848401111561417757614176612567565b5b6141828482856124cc565b509392505050565b600082601f83011261419f5761419e612562565b5b81516141af848260208601614148565b91505092915050565b6000604082840312156141ce576141cd61376d565b5b6141d860406125cc565b9050600082015167ffffffffffffffff8111156141f8576141f7613772565b5b6142048482850161418a565b600083015250602061421884828501613fcb565b60208301525092915050565b6000806040838503121561423b5761423a612302565b5b600083015167ffffffffffffffff81111561425957614258612307565b5b614265858286016140e9565b925050602083015167ffffffffffffffff81111561428657614285612307565b5b614292858286016141b8565b9150509250929050565b7f6661696c656420746f2073657420776974686472617720616464726573730000600082015250565b60006142d2601e8361326a565b91506142dd8261429c565b602082019050919050565b60006020820190508181036000830152614301816142c5565b9050919050565b600067ffffffffffffffff8211156143235761432261256c565b5b602082029050602081019050919050565b600061434761434284614308565b6125cc565b9050808382526020820190506020840283018581111561436a57614369613813565b5b835b818110156143b157805167ffffffffffffffff81111561438f5761438e612562565b5b80860161439c89826137b9565b8552602085019450505060208101905061436c565b5050509392505050565b600082601f8301126143d0576143cf612562565b5b81516143e0848260208601614334565b91505092915050565b6000602082840312156143ff576143fe612302565b5b600082015167ffffffffffffffff81111561441d5761441c612307565b5b614429848285016143bb565b91505092915050565b600061443d82612ba9565b915061444883612ba9565b925082820190507fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008112677fffffffffffffff8213171561448c5761448b613413565b5b92915050565b60006040820190506144a7600083018561368f565b6144b46020830184613d17565b9392505050565b60006144c682612ba9565b91506144d183612ba9565b92508282039050677fffffffffffffff81137fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008212171561451557614514613413565b5b92915050565b60006020828403121561453157614530612302565b5b600082015167ffffffffffffffff81111561454f5761454e612307565b5b61455b848285016137b9565b91505092915050565b600067ffffffffffffffff82111561457f5761457e61256c565b5b602082029050602081019050919050565b6000604082840312156145a6576145a561376d565b5b6145b060406125cc565b9050600082015167ffffffffffffffff8111156145d0576145cf613772565b5b6145dc848285016137b9565b600083015250602082015167ffffffffffffffff811115614600576145ff613772565b5b61460c84828501613960565b60208301525092915050565b600061462b61462684614564565b6125cc565b9050808382526020820190506020840283018581111561464e5761464d613813565b5b835b8181101561469557805167ffffffffffffffff81111561467357614672612562565b5b8086016146808982614590565b85526020850194505050602081019050614650565b5050509392505050565b600082601f8301126146b4576146b3612562565b5b81516146c4848260208601614618565b91505092915050565b600080604083850312156146e4576146e3612302565b5b600083015167ffffffffffffffff81111561470257614701612307565b5b61470e8582860161469f565b925050602083015167ffffffffffffffff81111561472f5761472e612307565b5b61473b85828601613960565b915050925092905056fea26469706673582212207a2797e1368ab3a260b6425272925c564a5b3820d913462748338f0fc1b6822764736f6c63430008130033", + "deployedBytecode": "0x60806040526004361061019c5760003560e01c80637c9db0bb116100ec578063b6a216ae1161008a578063d0e30db011610064578063d0e30db0146106a7578063d3f831be146106b1578063e0421e39146106ee578063e236c7a61461072b5761019c565b8063b6a216ae146105f0578063c7804bb51461062d578063cb85aa0a1461066a5761019c565b806398194593116100c657806398194593146104fc578063ad5c4cdd14610539578063adb2378514610576578063b2d17883146105b35761019c565b80637c9db0bb1461044457806388b2d58114610481578063963516e4146104bf5761019c565b806346e16d34116101595780636cc9ac8a116101335780636cc9ac8a146103785780636f669da4146103a157806378a5dfd1146103de578063796b96d21461041b5761019c565b806346e16d34146102d3578063613d4de81461031057806361bc221a1461034d5761019c565b80630183e4b4146101a157806301b68000146101ca5780630c05e9e4146102075780631b05020714610244578063296c60aa1461026d5780632d0ee16a14610296575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c391906123de565b610769565b005b3480156101d657600080fd5b506101f160048036038101906101ec9190612483565b610a96565b6040516101fe9190612540565b60405180910390f35b34801561021357600080fd5b5061022e60048036038101906102299190612697565b610bde565b60405161023b91906128da565b60405180910390f35b34801561025057600080fd5b5061026b600480360381019061026691906128fc565b610c6e565b005b34801561027957600080fd5b50610294600480360381019061028f919061297f565b610df4565b005b3480156102a257600080fd5b506102bd60048036038101906102b89190612697565b610f35565b6040516102ca9190612ada565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f5919061297f565b610fc3565b6040516103079190612b0b565b60405180910390f35b34801561031c57600080fd5b5061033760048036038101906103329190612b26565b61104d565b6040516103449190612ada565b60405180910390f35b34801561035957600080fd5b5061036261133e565b60405161036f9190612bc5565b60405180910390f35b34801561038457600080fd5b5061039f600480360381019061039a9190612c0c565b61134f565b005b3480156103ad57600080fd5b506103c860048036038101906103c39190612c73565b6115de565b6040516103d59190612b0b565b60405180910390f35b3480156103ea57600080fd5b506104056004803603810190610400919061297f565b611668565b6040516104129190612d39565b60405180910390f35b34801561042757600080fd5b50610442600480360381019061043d919061297f565b6116f5565b005b34801561045057600080fd5b5061046b60048036038101906104669190612697565b611836565b6040516104789190612d39565b60405180910390f35b34801561048d57600080fd5b506104a860048036038101906104a39190612dbf565b6118c0565b6040516104b6929190613001565b60405180910390f35b3480156104cb57600080fd5b506104e660048036038101906104e19190612697565b61195e565b6040516104f39190612b0b565b60405180910390f35b34801561050857600080fd5b50610523600480360381019061051e919061297f565b6119e7565b6040516105309190612ada565b60405180910390f35b34801561054557600080fd5b50610560600480360381019061055b919061297f565b611a76565b60405161056d9190612ada565b60405180910390f35b34801561058257600080fd5b5061059d60048036038101906105989190613038565b611b02565b6040516105aa9190612ada565b60405180910390f35b3480156105bf57600080fd5b506105da60048036038101906105d591906130bb565b611d8d565b6040516105e79190612ada565b60405180910390f35b3480156105fc57600080fd5b5061061760048036038101906106129190612483565b611ee2565b6040516106249190613208565b60405180910390f35b34801561063957600080fd5b50610654600480360381019061064f919061322a565b611f6c565b6040516106619190612b0b565b60405180910390f35b34801561067657600080fd5b50610691600480360381019061068c9190612483565b612084565b60405161069e91906132b4565b60405180910390f35b6106af61210e565b005b3480156106bd57600080fd5b506106d860048036038101906106d39190612697565b612110565b6040516106e59190612d39565b60405180910390f35b3480156106fa57600080fd5b5061071560048036038101906107109190612697565b61219a565b6040516107229190612ada565b60405180910390f35b34801561073757600080fd5b50610752600480360381019061074d9190612483565b612226565b6040516107609291906133dc565b60405180910390f35b811561089a5760008081819054906101000a900460070b8092919061078d90613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff160217905550503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146108995760008473ffffffffffffffffffffffffffffffffffffffff16600f604051610811906134a3565b60006040518083038185875af1925050503d806000811461084e576040519150601f19603f3d011682016040523d82523d6000602084013e610853565b606091505b5050905080610897576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088e9061352a565b60405180910390fd5b505b5b600061080173ffffffffffffffffffffffffffffffffffffffff16632efe8a5f86866040518363ffffffff1660e01b81526004016108d99291906135b8565b6020604051808303816000875af11580156108f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091c91906135f6565b90508061095e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109559061366f565b60405180910390fd5b8115610a8f5760008081819054906101000a900460070b8092919061098290613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff160217905550503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614610a8e5760008573ffffffffffffffffffffffffffffffffffffffff16600f604051610a06906134a3565b60006040518083038185875af1925050503d8060008114610a43576040519150601f19603f3d011682016040523d82523d6000602084013e610a48565b606091505b5050905080610a8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a839061352a565b60405180910390fd5b505b5b5050505050565b606060008061080173ffffffffffffffffffffffffffffffffffffffff1684604051602401610ac5919061369e565b6040516020818303038152906040527f5431f450000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610b4f91906136ea565b600060405180830381855afa9150503d8060008114610b8a576040519150601f19603f3d011682016040523d82523d6000602084013e610b8f565b606091505b509150915081610bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcb9061374d565b60405180910390fd5b8092505050919050565b610be66122b3565b61080173ffffffffffffffffffffffffffffffffffffffff166354212a89836040518263ffffffff1660e01b8152600401610c2191906132b4565b600060405180830381865afa158015610c3e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610c679190613a46565b9050919050565b3073ffffffffffffffffffffffffffffffffffffffff1663ad5c4cdd85846040518363ffffffff1660e01b8152600401610ca9929190613a8f565b6000604051808303816000875af1925050508015610cea57506040513d6000823e3d601f19601f82011682018060405250810190610ce79190613c0c565b60015b15610cf157505b8015610dee5760008081819054906101000a900460070b80929190610d1590613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008373ffffffffffffffffffffffffffffffffffffffff16600f604051610d66906134a3565b60006040518083038185875af1925050503d8060008114610da3576040519150601f19603f3d011682016040523d82523d6000602084013e610da8565b606091505b5050905080610dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de39061352a565b60405180910390fd5b505b50505050565b600061080173ffffffffffffffffffffffffffffffffffffffff168383604051602401610e22929190613c55565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610eac91906136ea565b600060405180830381855af49150503d8060008114610ee7576040519150601f19603f3d011682016040523d82523d6000602084013e610eec565b606091505b5050905080610f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2790613cf7565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6130846040518363ffffffff1660e01b8152600401610f74929190613c55565b6000604051808303816000875af1158015610f93573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610fbc9190613c0c565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9684846040518363ffffffff1660e01b8152600401611002929190613c55565b6020604051808303816000875af1158015611021573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104591906135f6565b905092915050565b606082156111805760008081819054906101000a900460070b8092919061107390613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff160217905550503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461117f5760008473ffffffffffffffffffffffffffffffffffffffff16600f6040516110f7906134a3565b60006040518083038185875af1925050503d8060008114611134576040519150601f19603f3d011682016040523d82523d6000602084013e611139565b606091505b505090508061117d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111749061352a565b60405180910390fd5b505b5b61080173ffffffffffffffffffffffffffffffffffffffff16633ce4e3be866040518263ffffffff1660e01b81526004016111bb91906132b4565b6000604051808303816000875af11580156111da573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906112039190613c0c565b905081156113365760008081819054906101000a900460070b8092919061122990613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff160217905550503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146113355760008473ffffffffffffffffffffffffffffffffffffffff16600f6040516112ad906134a3565b60006040518083038185875af1925050503d80600081146112ea576040519150601f19603f3d011682016040523d82523d6000602084013e6112ef565b606091505b5050905080611333576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132a9061352a565b60405180910390fd5b505b5b949350505050565b60008054906101000a900460070b81565b811561144c5760008081819054906101000a900460070b8092919061137390613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008473ffffffffffffffffffffffffffffffffffffffff16600f6040516113c4906134a3565b60006040518083038185875af1925050503d8060008114611401576040519150601f19603f3d011682016040523d82523d6000602084013e611406565b606091505b505090508061144a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114419061352a565b60405180910390fd5b505b600061080173ffffffffffffffffffffffffffffffffffffffff1663ed41d0b686866040518363ffffffff1660e01b815260040161148b929190613d26565b6020604051808303816000875af11580156114aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ce91906135f6565b9050806114da57600080fd5b81156115d75760008081819054906101000a900460070b809291906114fe90613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008573ffffffffffffffffffffffffffffffffffffffff16600f60405161154f906134a3565b60006040518083038185875af1925050503d806000811461158c576040519150601f19603f3d011682016040523d82523d6000602084013e611591565b606091505b50509050806115d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cc9061352a565b60405180910390fd5b505b5050505050565b600061080173ffffffffffffffffffffffffffffffffffffffff16632efe8a5f84846040518363ffffffff1660e01b815260040161161d929190613d4f565b6020604051808303816000875af115801561163c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166091906135f6565b905092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff16639ad563b484846040518363ffffffff1660e01b81526004016116a7929190613c55565b600060405180830381865afa1580156116c4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906116ed9190613d78565b905092915050565b600061080173ffffffffffffffffffffffffffffffffffffffff168383604051602401611723929190613c55565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516117ad91906136ea565b600060405180830381855afa9150503d80600081146117e8576040519150601f19603f3d011682016040523d82523d6000602084013e6117ed565b606091505b5050905080611831576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118289061374d565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633dd40f78836040518263ffffffff1660e01b815260040161187391906132b4565b600060405180830381865afa158015611890573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906118b99190613d78565b9050919050565b60606118ca6122d4565b61080173ffffffffffffffffffffffffffffffffffffffff16638f2473ce878787876040518563ffffffff1660e01b815260040161190b9493929190613f4c565b600060405180830381865afa158015611928573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906119519190614224565b9150915094509492505050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9630846040518363ffffffff1660e01b815260040161199d929190613c55565b6020604051808303816000875af11580156119bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e091906135f6565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6184846040518363ffffffff1660e01b8152600401611a26929190613c55565b6000604051808303816000875af1158015611a45573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611a6e9190613c0c565b905092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6184846040518363ffffffff1660e01b8152600401611ab5929190613c55565b6000604051808303816000875af1158015611ad4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611afd9190613c0c565b600080fd5b60608215611c015760008081819054906101000a900460070b80929190611b2890613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008573ffffffffffffffffffffffffffffffffffffffff16600f604051611b79906134a3565b60006040518083038185875af1925050503d8060008114611bb6576040519150601f19603f3d011682016040523d82523d6000602084013e611bbb565b606091505b5050905080611bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf69061352a565b60405180910390fd5b505b61080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6186866040518363ffffffff1660e01b8152600401611c3e929190613a8f565b6000604051808303816000875af1158015611c5d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611c869190613c0c565b90508115611d855760008081819054906101000a900460070b80929190611cac90613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008573ffffffffffffffffffffffffffffffffffffffff16600f604051611cfd906134a3565b60006040518083038185875af1925050503d8060008114611d3a576040519150601f19603f3d011682016040523d82523d6000602084013e611d3f565b606091505b5050905080611d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7a9061352a565b60405180910390fd5b505b949350505050565b6060600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9633876040518363ffffffff1660e01b8152600401611dce929190613c55565b6020604051808303816000875af1158015611ded573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e1191906135f6565b905080611e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4a906142e8565b60405180910390fd5b61080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6185856040518363ffffffff1660e01b8152600401611e90929190613c55565b6000604051808303816000875af1158015611eaf573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611ed89190613c0c565b9150509392505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663a66cb605836040518263ffffffff1660e01b8152600401611f1f919061369e565b600060405180830381865afa158015611f3c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611f6591906143e9565b9050919050565b600060016000808282829054906101000a900460070b611f8c9190614432565b92506101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff16021790555061080173ffffffffffffffffffffffffffffffffffffffff1663ed41d0b684846040518363ffffffff1660e01b8152600401611ff2929190614492565b6020604051808303816000875af1158015612011573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203591906135f6565b905060016000808282829054906101000a900460070b61205591906144bb565b92506101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff16021790555092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff16635431f450836040518263ffffffff1660e01b81526004016120c1919061369e565b600060405180830381865afa1580156120de573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612107919061451b565b9050919050565b565b606061080173ffffffffffffffffffffffffffffffffffffffff166385b2d2da836040518263ffffffff1660e01b815260040161214d91906132b4565b600060405180830381865afa15801561216a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906121939190613d78565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633ce4e3be836040518263ffffffff1660e01b81526004016121d791906132b4565b6000604051808303816000875af11580156121f6573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061221f9190613c0c565b9050919050565b60608061080173ffffffffffffffffffffffffffffffffffffffff166354be1a28846040518263ffffffff1660e01b8152600401612264919061369e565b600060405180830381865afa158015612281573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906122aa91906146cd565b91509150915091565b60405180606001604052806060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123378261230c565b9050919050565b6123478161232c565b811461235257600080fd5b50565b6000813590506123648161233e565b92915050565b600063ffffffff82169050919050565b6123838161236a565b811461238e57600080fd5b50565b6000813590506123a08161237a565b92915050565b60008115159050919050565b6123bb816123a6565b81146123c657600080fd5b50565b6000813590506123d8816123b2565b92915050565b600080600080608085870312156123f8576123f7612302565b5b600061240687828801612355565b945050602061241787828801612391565b9350506040612428878288016123c9565b9250506060612439878288016123c9565b91505092959194509250565b60006124508261230c565b9050919050565b61246081612445565b811461246b57600080fd5b50565b60008135905061247d81612457565b92915050565b60006020828403121561249957612498612302565b5b60006124a78482850161246e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156124ea5780820151818401526020810190506124cf565b60008484015250505050565b6000601f19601f8301169050919050565b6000612512826124b0565b61251c81856124bb565b935061252c8185602086016124cc565b612535816124f6565b840191505092915050565b6000602082019050818103600083015261255a8184612507565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6125a4826124f6565b810181811067ffffffffffffffff821117156125c3576125c261256c565b5b80604052505050565b60006125d66122f8565b90506125e2828261259b565b919050565b600067ffffffffffffffff8211156126025761260161256c565b5b61260b826124f6565b9050602081019050919050565b82818337600083830152505050565b600061263a612635846125e7565b6125cc565b90508281526020810184848401111561265657612655612567565b5b612661848285612618565b509392505050565b600082601f83011261267e5761267d612562565b5b813561268e848260208601612627565b91505092915050565b6000602082840312156126ad576126ac612302565b5b600082013567ffffffffffffffff8111156126cb576126ca612307565b5b6126d784828501612669565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000612707826126e0565b61271181856126eb565b93506127218185602086016124cc565b61272a816124f6565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000819050919050565b61277481612761565b82525050565b600060ff82169050919050565b6127908161277a565b82525050565b600060608301600083015184820360008601526127b382826126fc565b91505060208301516127c8602086018261276b565b5060408301516127db6040860182612787565b508091505092915050565b60006127f28383612796565b905092915050565b6000602082019050919050565b600061281282612735565b61281c8185612740565b93508360208202850161282e85612751565b8060005b8581101561286a578484038952815161284b85826127e6565b9450612856836127fa565b925060208a01995050600181019050612832565b50829750879550505050505092915050565b6000606083016000830151848203600086015261289982826126fc565b915050602083015184820360208601526128b38282612807565b915050604083015184820360408601526128cd8282612807565b9150508091505092915050565b600060208201905081810360008301526128f4818461287c565b905092915050565b6000806000806080858703121561291657612915612302565b5b600061292487828801612355565b945050602061293587828801612355565b935050604085013567ffffffffffffffff81111561295657612955612307565b5b61296287828801612669565b9250506060612973878288016123c9565b91505092959194509250565b6000806040838503121561299657612995612302565b5b60006129a48582860161246e565b925050602083013567ffffffffffffffff8111156129c5576129c4612307565b5b6129d185828601612669565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006040830160008301518482036000860152612a2482826126fc565b9150506020830151612a39602086018261276b565b508091505092915050565b6000612a508383612a07565b905092915050565b6000602082019050919050565b6000612a70826129db565b612a7a81856129e6565b935083602082028501612a8c856129f7565b8060005b85811015612ac85784840389528151612aa98582612a44565b9450612ab483612a58565b925060208a01995050600181019050612a90565b50829750879550505050505092915050565b60006020820190508181036000830152612af48184612a65565b905092915050565b612b05816123a6565b82525050565b6000602082019050612b206000830184612afc565b92915050565b60008060008060808587031215612b4057612b3f612302565b5b600085013567ffffffffffffffff811115612b5e57612b5d612307565b5b612b6a87828801612669565b9450506020612b7b87828801612355565b9350506040612b8c878288016123c9565b9250506060612b9d878288016123c9565b91505092959194509250565b60008160070b9050919050565b612bbf81612ba9565b82525050565b6000602082019050612bda6000830184612bb6565b92915050565b612be981612761565b8114612bf457600080fd5b50565b600081359050612c0681612be0565b92915050565b60008060008060808587031215612c2657612c25612302565b5b6000612c3487828801612355565b9450506020612c4587828801612bf7565b9350506040612c56878288016123c9565b9250506060612c67878288016123c9565b91505092959194509250565b60008060408385031215612c8a57612c89612302565b5b6000612c988582860161246e565b9250506020612ca985828601612391565b9150509250929050565b600082825260208201905092915050565b6000612ccf82612735565b612cd98185612cb3565b935083602082028501612ceb85612751565b8060005b85811015612d275784840389528151612d0885826127e6565b9450612d13836127fa565b925060208a01995050600181019050612cef565b50829750879550505050505092915050565b60006020820190508181036000830152612d538184612cc4565b905092915050565b600067ffffffffffffffff82169050919050565b612d7881612d5b565b8114612d8357600080fd5b50565b600081359050612d9581612d6f565b92915050565b600080fd5b600060a08284031215612db657612db5612d9b565b5b81905092915050565b60008060008060808587031215612dd957612dd8612302565b5b600085013567ffffffffffffffff811115612df757612df6612307565b5b612e0387828801612669565b9450506020612e1487828801612d86565b9350506040612e2587828801612d86565b925050606085013567ffffffffffffffff811115612e4657612e45612307565b5b612e5287828801612da0565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612e9381612d5b565b82525050565b604082016000820151612eaf600085018261276b565b506020820151612ec26020850182612787565b50505050565b606082016000820151612ede6000850182612e8a565b506020820151612ef16020850182612e99565b50505050565b6000612f038383612ec8565b60608301905092915050565b6000602082019050919050565b6000612f2782612e5e565b612f318185612e69565b9350612f3c83612e7a565b8060005b83811015612f6d578151612f548882612ef7565b9750612f5f83612f0f565b925050600181019050612f40565b5085935050505092915050565b600082825260208201905092915050565b6000612f96826124b0565b612fa08185612f7a565b9350612fb08185602086016124cc565b612fb9816124f6565b840191505092915050565b60006040830160008301518482036000860152612fe18282612f8b565b9150506020830151612ff66020860182612e8a565b508091505092915050565b6000604082019050818103600083015261301b8185612f1c565b9050818103602083015261302f8184612fc4565b90509392505050565b6000806000806080858703121561305257613051612302565b5b600061306087828801612355565b945050602085013567ffffffffffffffff81111561308157613080612307565b5b61308d87828801612669565b935050604061309e878288016123c9565b92505060606130af878288016123c9565b91505092959194509250565b6000806000606084860312156130d4576130d3612302565b5b600084013567ffffffffffffffff8111156130f2576130f1612307565b5b6130fe86828701612669565b935050602061310f8682870161246e565b925050604084013567ffffffffffffffff8111156131305761312f612307565b5b61313c86828701612669565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061317e83836126fc565b905092915050565b6000602082019050919050565b600061319e82613146565b6131a88185613151565b9350836020820285016131ba85613162565b8060005b858110156131f657848403895281516131d78582613172565b94506131e283613186565b925060208a019950506001810190506131be565b50829750879550505050505092915050565b600060208201905081810360008301526132228184613193565b905092915050565b6000806040838503121561324157613240612302565b5b600061324f8582860161246e565b925050602061326085828601612bf7565b9150509250929050565b600082825260208201905092915050565b6000613286826126e0565b613290818561326a565b93506132a08185602086016124cc565b6132a9816124f6565b840191505092915050565b600060208201905081810360008301526132ce818461327b565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000604083016000830151848203600086015261331f82826126fc565b915050602083015184820360208601526133398282612807565b9150508091505092915050565b60006133528383613302565b905092915050565b6000602082019050919050565b6000613372826132d6565b61337c81856132e1565b93508360208202850161338e856132f2565b8060005b858110156133ca57848403895281516133ab8582613346565b94506133b68361335a565b925060208a01995050600181019050613392565b50829750879550505050505092915050565b600060408201905081810360008301526133f68185613367565b9050818103602083015261340a8184612cc4565b90509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061344d82612ba9565b9150677fffffffffffffff820361346757613466613413565b5b600182019050919050565b600081905092915050565b50565b600061348d600083613472565b91506134988261347d565b600082019050919050565b60006134ae82613480565b9150819050919050565b7f4661696c656420746f2073656e6420457468657220746f2064656c656761746f60008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061351460218361326a565b915061351f826134b8565b604082019050919050565b6000602082019050818103600083015261354381613507565b9050919050565b6000819050919050565b600061356f61356a6135658461230c565b61354a565b61230c565b9050919050565b600061358182613554565b9050919050565b600061359382613576565b9050919050565b6135a381613588565b82525050565b6135b28161236a565b82525050565b60006040820190506135cd600083018561359a565b6135da60208301846135a9565b9392505050565b6000815190506135f0816123b2565b92915050565b60006020828403121561360c5761360b612302565b5b600061361a848285016135e1565b91505092915050565b7f6661696c656420746f20636c61696d2072657761726473000000000000000000600082015250565b600061365960178361326a565b915061366482613623565b602082019050919050565b600060208201905081810360008301526136888161364c565b9050919050565b61369881612445565b82525050565b60006020820190506136b3600083018461368f565b92915050565b60006136c4826124b0565b6136ce8185613472565b93506136de8185602086016124cc565b80840191505092915050565b60006136f682846136b9565b915081905092915050565b7f6661696c65642073746174696343616c6c20746f20707265636f6d70696c6500600082015250565b6000613737601f8361326a565b915061374282613701565b602082019050919050565b600060208201905081810360008301526137668161372a565b9050919050565b600080fd5b600080fd5b600061378a613785846125e7565b6125cc565b9050828152602081018484840111156137a6576137a5612567565b5b6137b18482856124cc565b509392505050565b600082601f8301126137ce576137cd612562565b5b81516137de848260208601613777565b91505092915050565b600067ffffffffffffffff8211156138025761380161256c565b5b602082029050602081019050919050565b600080fd5b60008151905061382781612be0565b92915050565b6138368161277a565b811461384157600080fd5b50565b6000815190506138538161382d565b92915050565b60006060828403121561386f5761386e61376d565b5b61387960606125cc565b9050600082015167ffffffffffffffff81111561389957613898613772565b5b6138a5848285016137b9565b60008301525060206138b984828501613818565b60208301525060406138cd84828501613844565b60408301525092915050565b60006138ec6138e7846137e7565b6125cc565b9050808382526020820190506020840283018581111561390f5761390e613813565b5b835b8181101561395657805167ffffffffffffffff81111561393457613933612562565b5b8086016139418982613859565b85526020850194505050602081019050613911565b5050509392505050565b600082601f83011261397557613974612562565b5b81516139858482602086016138d9565b91505092915050565b6000606082840312156139a4576139a361376d565b5b6139ae60606125cc565b9050600082015167ffffffffffffffff8111156139ce576139cd613772565b5b6139da848285016137b9565b600083015250602082015167ffffffffffffffff8111156139fe576139fd613772565b5b613a0a84828501613960565b602083015250604082015167ffffffffffffffff811115613a2e57613a2d613772565b5b613a3a84828501613960565b60408301525092915050565b600060208284031215613a5c57613a5b612302565b5b600082015167ffffffffffffffff811115613a7a57613a79612307565b5b613a868482850161398e565b91505092915050565b6000604082019050613aa4600083018561359a565b8181036020830152613ab6818461327b565b90509392505050565b600067ffffffffffffffff821115613ada57613ad961256c565b5b602082029050602081019050919050565b600060408284031215613b0157613b0061376d565b5b613b0b60406125cc565b9050600082015167ffffffffffffffff811115613b2b57613b2a613772565b5b613b37848285016137b9565b6000830152506020613b4b84828501613818565b60208301525092915050565b6000613b6a613b6584613abf565b6125cc565b90508083825260208201905060208402830185811115613b8d57613b8c613813565b5b835b81811015613bd457805167ffffffffffffffff811115613bb257613bb1612562565b5b808601613bbf8982613aeb565b85526020850194505050602081019050613b8f565b5050509392505050565b600082601f830112613bf357613bf2612562565b5b8151613c03848260208601613b57565b91505092915050565b600060208284031215613c2257613c21612302565b5b600082015167ffffffffffffffff811115613c4057613c3f612307565b5b613c4c84828501613bde565b91505092915050565b6000604082019050613c6a600083018561368f565b8181036020830152613c7c818461327b565b90509392505050565b7f6661696c65642064656c656761746543616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000613ce160218361326a565b9150613cec82613c85565b604082019050919050565b60006020820190508181036000830152613d1081613cd4565b9050919050565b613d2081612761565b82525050565b6000604082019050613d3b600083018561359a565b613d486020830184613d17565b9392505050565b6000604082019050613d64600083018561368f565b613d7160208301846135a9565b9392505050565b600060208284031215613d8e57613d8d612302565b5b600082015167ffffffffffffffff811115613dac57613dab612307565b5b613db884828501613960565b91505092915050565b613dca81612d5b565b82525050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112613dfc57613dfb613dda565b5b83810192508235915060208301925067ffffffffffffffff821115613e2457613e23613dd0565b5b600182023603831315613e3a57613e39613dd5565b5b509250929050565b6000613e4e8385612f7a565b9350613e5b838584612618565b613e64836124f6565b840190509392505050565b6000613e7e6020840184612d86565b905092915050565b6000613e9560208401846123c9565b905092915050565b613ea6816123a6565b82525050565b600060a08301613ebf6000840184613ddf565b8583036000870152613ed2838284613e42565b92505050613ee36020840184613e6f565b613ef06020860182612e8a565b50613efe6040840184613e6f565b613f0b6040860182612e8a565b50613f196060840184613e86565b613f266060860182613e9d565b50613f346080840184613e86565b613f416080860182613e9d565b508091505092915050565b60006080820190508181036000830152613f66818761327b565b9050613f756020830186613dc1565b613f826040830185613dc1565b8181036060830152613f948184613eac565b905095945050505050565b600067ffffffffffffffff821115613fba57613fb961256c565b5b602082029050602081019050919050565b600081519050613fda81612d6f565b92915050565b600060408284031215613ff657613ff561376d565b5b61400060406125cc565b9050600061401084828501613818565b600083015250602061402484828501613844565b60208301525092915050565b6000606082840312156140465761404561376d565b5b61405060406125cc565b9050600061406084828501613fcb565b600083015250602061407484828501613fe0565b60208301525092915050565b600061409361408e84613f9f565b6125cc565b905080838252602082019050606084028301858111156140b6576140b5613813565b5b835b818110156140df57806140cb8882614030565b8452602084019350506060810190506140b8565b5050509392505050565b600082601f8301126140fe576140fd612562565b5b815161410e848260208601614080565b91505092915050565b600067ffffffffffffffff8211156141325761413161256c565b5b61413b826124f6565b9050602081019050919050565b600061415b61415684614117565b6125cc565b90508281526020810184848401111561417757614176612567565b5b6141828482856124cc565b509392505050565b600082601f83011261419f5761419e612562565b5b81516141af848260208601614148565b91505092915050565b6000604082840312156141ce576141cd61376d565b5b6141d860406125cc565b9050600082015167ffffffffffffffff8111156141f8576141f7613772565b5b6142048482850161418a565b600083015250602061421884828501613fcb565b60208301525092915050565b6000806040838503121561423b5761423a612302565b5b600083015167ffffffffffffffff81111561425957614258612307565b5b614265858286016140e9565b925050602083015167ffffffffffffffff81111561428657614285612307565b5b614292858286016141b8565b9150509250929050565b7f6661696c656420746f2073657420776974686472617720616464726573730000600082015250565b60006142d2601e8361326a565b91506142dd8261429c565b602082019050919050565b60006020820190508181036000830152614301816142c5565b9050919050565b600067ffffffffffffffff8211156143235761432261256c565b5b602082029050602081019050919050565b600061434761434284614308565b6125cc565b9050808382526020820190506020840283018581111561436a57614369613813565b5b835b818110156143b157805167ffffffffffffffff81111561438f5761438e612562565b5b80860161439c89826137b9565b8552602085019450505060208101905061436c565b5050509392505050565b600082601f8301126143d0576143cf612562565b5b81516143e0848260208601614334565b91505092915050565b6000602082840312156143ff576143fe612302565b5b600082015167ffffffffffffffff81111561441d5761441c612307565b5b614429848285016143bb565b91505092915050565b600061443d82612ba9565b915061444883612ba9565b925082820190507fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008112677fffffffffffffff8213171561448c5761448b613413565b5b92915050565b60006040820190506144a7600083018561368f565b6144b46020830184613d17565b9392505050565b60006144c682612ba9565b91506144d183612ba9565b92508282039050677fffffffffffffff81137fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008212171561451557614514613413565b5b92915050565b60006020828403121561453157614530612302565b5b600082015167ffffffffffffffff81111561454f5761454e612307565b5b61455b848285016137b9565b91505092915050565b600067ffffffffffffffff82111561457f5761457e61256c565b5b602082029050602081019050919050565b6000604082840312156145a6576145a561376d565b5b6145b060406125cc565b9050600082015167ffffffffffffffff8111156145d0576145cf613772565b5b6145dc848285016137b9565b600083015250602082015167ffffffffffffffff811115614600576145ff613772565b5b61460c84828501613960565b60208301525092915050565b600061462b61462684614564565b6125cc565b9050808382526020820190506020840283018581111561464e5761464d613813565b5b835b8181101561469557805167ffffffffffffffff81111561467357614672612562565b5b8086016146808982614590565b85526020850194505050602081019050614650565b5050509392505050565b600082601f8301126146b4576146b3612562565b5b81516146c4848260208601614618565b91505092915050565b600080604083850312156146e4576146e3612302565b5b600083015167ffffffffffffffff81111561470257614701612307565b5b61470e8582860161469f565b925050602083015167ffffffffffffffff81111561472f5761472e612307565b5b61473b85828601613960565b915050925092905056fea26469706673582212207a2797e1368ab3a260b6425272925c564a5b3820d913462748338f0fc1b6822764736f6c63430008130033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/precompiles/testutil/contracts/DistributionCaller.sol b/precompiles/testutil/contracts/DistributionCaller.sol index e41d8ee93b..a3f5507653 100644 --- a/precompiles/testutil/contracts/DistributionCaller.sol +++ b/precompiles/testutil/contracts/DistributionCaller.sol @@ -12,9 +12,9 @@ contract DistributionCaller { ) public returns (bool) { return distribution.DISTRIBUTION_CONTRACT.setWithdrawAddress( - address(this), - _withdrawAddr - ); + address(this), + _withdrawAddr + ); } function testWithdrawDelegatorRewardsFromContract( @@ -22,9 +22,9 @@ contract DistributionCaller { ) public returns (types.Coin[] memory) { return distribution.DISTRIBUTION_CONTRACT.withdrawDelegatorRewards( - address(this), - _valAddr - ); + address(this), + _valAddr + ); } function testSetWithdrawAddress( @@ -33,9 +33,51 @@ contract DistributionCaller { ) public returns (bool) { return distribution.DISTRIBUTION_CONTRACT.setWithdrawAddress( + _delAddr, + _withdrawAddr + ); + } + + function testWithdrawDelegatorRewardsWithTransfer( + address payable _delAddr, + string memory _valAddr, + bool _before, + bool _after + ) public returns (types.Coin[] memory coins) { + if (_before) { + counter++; + (bool sent, ) = _delAddr.call{value: 15}(""); + require(sent, "Failed to send Ether to delegator"); + } + coins = distribution.DISTRIBUTION_CONTRACT.withdrawDelegatorRewards( _delAddr, - _withdrawAddr + _valAddr ); + if (_after) { + counter++; + (bool sent, ) = _delAddr.call{value: 15}(""); + require(sent, "Failed to send Ether to delegator"); + } + return coins; + } + + function revertWithdrawRewardsAndTransfer( + address payable _delAddr, + address payable _withdrawer, + string memory _valAddr, + bool _after + ) public { + try + DistributionCaller(address(this)).withdrawDelegatorRewardsAndRevert( + _delAddr, + _valAddr + ) + {} catch {} + if (_after) { + counter++; + (bool sent, ) = _withdrawer.call{value: 15}(""); + require(sent, "Failed to send Ether to delegator"); + } } function testWithdrawDelegatorRewards( @@ -44,9 +86,20 @@ contract DistributionCaller { ) public returns (types.Coin[] memory) { return distribution.DISTRIBUTION_CONTRACT.withdrawDelegatorRewards( + _delAddr, + _valAddr + ); + } + + function withdrawDelegatorRewardsAndRevert( + address _delAddr, + string memory _valAddr + ) external returns (types.Coin[] memory coins) { + coins = distribution.DISTRIBUTION_CONTRACT.withdrawDelegatorRewards( _delAddr, _valAddr ); + revert(); } function testWithdrawValidatorCommission( @@ -54,8 +107,34 @@ contract DistributionCaller { ) public returns (types.Coin[] memory) { return distribution.DISTRIBUTION_CONTRACT.withdrawValidatorCommission( + _valAddr + ); + } + + function testWithdrawValidatorCommissionWithTransfer( + string memory _valAddr, + address payable _withdrawer, + bool _before, + bool _after + ) public returns (types.Coin[] memory coins) { + if (_before) { + counter++; + if (_withdrawer != address(this)) { + (bool sent, ) = _withdrawer.call{value: 15}(""); + require(sent, "Failed to send Ether to delegator"); + } + } + coins = distribution.DISTRIBUTION_CONTRACT.withdrawValidatorCommission( _valAddr ); + if (_after) { + counter++; + if (_withdrawer != address(this)) { + (bool sent, ) = _withdrawer.call{value: 15}(""); + require(sent, "Failed to send Ether to delegator"); + } + } + return coins; } function testClaimRewards( @@ -64,9 +143,9 @@ contract DistributionCaller { ) public returns (bool success) { return distribution.DISTRIBUTION_CONTRACT.claimRewards( - _delAddr, - _maxRetrieve - ); + _delAddr, + _maxRetrieve + ); } /// @dev testFundCommunityPool defines a method to allow an account to directly @@ -87,13 +166,69 @@ contract DistributionCaller { return success; } + function testClaimRewardsWithTransfer( + address payable _delAddr, + uint32 _maxRetrieve, + bool _before, + bool _after + ) public { + if (_before) { + counter++; + if (_delAddr != address(this)) { + (bool sent, ) = _delAddr.call{value: 15}(""); + require(sent, "Failed to send Ether to delegator"); + } + } + bool success = distribution.DISTRIBUTION_CONTRACT.claimRewards( + _delAddr, + _maxRetrieve + ); + require(success, "failed to claim rewards"); + if (_after) { + counter++; + if (_delAddr != address(this)) { + (bool sent, ) = _delAddr.call{value: 15}(""); + require(sent, "Failed to send Ether to delegator"); + } + } + } + + /// @dev testFundCommunityPoolWithTransfer defines a method to allow an account to directly + /// fund the community pool and performs a transfer to the deposit. + /// @param depositor The address of the depositor + /// @param amount The amount of coin fund community pool + /// @param _before Boolean to specify if funds should be transferred to delegator before the precompile call + /// @param _after Boolean to specify if funds should be transferred to delegator after the precompile call + function testFundCommunityPoolWithTransfer( + address payable depositor, + uint256 amount, + bool _before, + bool _after + ) public { + if (_before) { + counter++; + (bool sent, ) = depositor.call{value: 15}(""); + require(sent, "Failed to send Ether to delegator"); + } + bool success = distribution.DISTRIBUTION_CONTRACT.fundCommunityPool( + depositor, + amount + ); + require(success); + if (_after) { + counter++; + (bool sent, ) = depositor.call{value: 15}(""); + require(sent, "Failed to send Ether to delegator"); + } + } + function getValidatorDistributionInfo( string memory _valAddr ) public view returns (distribution.ValidatorDistributionInfo memory) { return distribution.DISTRIBUTION_CONTRACT.validatorDistributionInfo( - _valAddr - ); + _valAddr + ); } function getValidatorOutstandingRewards( @@ -101,8 +236,8 @@ contract DistributionCaller { ) public view returns (types.DecCoin[] memory) { return distribution.DISTRIBUTION_CONTRACT.validatorOutstandingRewards( - _valAddr - ); + _valAddr + ); } function getValidatorCommission( @@ -117,20 +252,20 @@ contract DistributionCaller { uint64 _endingHeight, types.PageRequest calldata pageRequest ) - public - view - returns ( - distribution.ValidatorSlashEvent[] memory, - distribution.PageResponse memory - ) + public + view + returns ( + distribution.ValidatorSlashEvent[] memory, + distribution.PageResponse memory + ) { return distribution.DISTRIBUTION_CONTRACT.validatorSlashes( - _valAddr, - _startingHeight, - _endingHeight, - pageRequest - ); + _valAddr, + _startingHeight, + _endingHeight, + pageRequest + ); } function getDelegationRewards( @@ -139,20 +274,20 @@ contract DistributionCaller { ) public view returns (types.DecCoin[] memory) { return distribution.DISTRIBUTION_CONTRACT.delegationRewards( - _delAddr, - _valAddr - ); + _delAddr, + _valAddr + ); } function getDelegationTotalRewards( address _delAddr ) - public - view - returns ( - distribution.DelegationDelegatorReward[] memory rewards, - types.DecCoin[] memory total - ) + public + view + returns ( + distribution.DelegationDelegatorReward[] memory rewards, + types.DecCoin[] memory total + ) { return distribution.DISTRIBUTION_CONTRACT.delegationTotalRewards(_delAddr); @@ -169,8 +304,8 @@ contract DistributionCaller { ) public view returns (string memory) { return distribution.DISTRIBUTION_CONTRACT.delegatorWithdrawAddress( - _delAddr - ); + _delAddr + ); } // testRevertState allows sender to change the withdraw address @@ -188,9 +323,9 @@ contract DistributionCaller { return distribution.DISTRIBUTION_CONTRACT.withdrawDelegatorRewards( - _delAddr, - _valAddr - ); + _delAddr, + _valAddr + ); } function delegateCallSetWithdrawAddress( @@ -200,12 +335,12 @@ contract DistributionCaller { (bool success, ) = distribution .DISTRIBUTION_PRECOMPILE_ADDRESS .delegatecall( - abi.encodeWithSignature( - "setWithdrawAddress(address,string)", - _delAddr, - _withdrawAddr - ) - ); + abi.encodeWithSignature( + "setWithdrawAddress(address,string)", + _delAddr, + _withdrawAddr + ) + ); require(success, "failed delegateCall to precompile"); } @@ -216,12 +351,12 @@ contract DistributionCaller { (bool success, ) = distribution .DISTRIBUTION_PRECOMPILE_ADDRESS .staticcall( - abi.encodeWithSignature( - "setWithdrawAddress(address,string)", - _delAddr, - _withdrawAddr - ) - ); + abi.encodeWithSignature( + "setWithdrawAddress(address,string)", + _delAddr, + _withdrawAddr + ) + ); require(success, "failed staticCall to precompile"); } @@ -231,11 +366,11 @@ contract DistributionCaller { (bool success, bytes memory data) = distribution .DISTRIBUTION_PRECOMPILE_ADDRESS .staticcall( - abi.encodeWithSignature( - "delegatorWithdrawAddress(address)", - _delAddr - ) - ); + abi.encodeWithSignature( + "delegatorWithdrawAddress(address)", + _delAddr + ) + ); require(success, "failed staticCall to precompile"); return data; } diff --git a/precompiles/testutil/contracts/FlashLoan.json b/precompiles/testutil/contracts/FlashLoan.json new file mode 100644 index 0000000000..ab47f6a276 --- /dev/null +++ b/precompiles/testutil/contracts/FlashLoan.json @@ -0,0 +1,110 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "FlashLoan", + "sourceName": "contracts/evmos/testutil/contracts/FlashLoan.sol", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_delegator", + "type": "address" + }, + { + "internalType": "string", + "name": "_validator", + "type": "string" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "delegateWithRevert", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_token", + "type": "address" + }, + { + "internalType": "string", + "name": "_validator", + "type": "string" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "flashLoan", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_token", + "type": "address" + }, + { + "internalType": "string", + "name": "_validator", + "type": "string" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "flashLoanWithRevert", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506113ea806100606000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80638da5cb5b146100515780638f5184301461006f578063ee52ad711461008b578063f12fae93146100bb575b600080fd5b6100596100eb565b6040516100669190610bdd565b60405180910390f35b61008960048036038101906100849190610db4565b61010f565b005b6100a560048036038101906100a09190610db4565b6101da565b6040516100b29190610e3e565b60405180910390f35b6100d560048036038101906100d09190610db4565b6107c9565b6040516100e29190610e3e565b60405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061080073ffffffffffffffffffffffffffffffffffffffff166353266bbb8585856040518463ffffffff1660e01b815260040161015093929190610ee7565b6020604051808303816000875af115801561016f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101939190610f51565b9050806101d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101cc90610fca565b60405180910390fd5b600080fd5b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461026b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102629061105c565b60405180910390fd5b6000849050828173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b81526004016102ac92919061107c565b602060405180830381865afa1580156102c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ed91906110ba565b101561032e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161032590611133565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016103699190610bdd565b602060405180830381865afa158015610386573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103aa91906110ba565b905060008273ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b81526004016103eb93929190611153565b6020604051808303816000875af115801561040a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061042e9190610f51565b905080610470576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610467906111fc565b60405180910390fd5b848261047c919061124b565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016104b59190610bdd565b602060405180830381865afa1580156104d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f691906110ba565b14610536576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052d906112cb565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3388886040518463ffffffff1660e01b815260040161057593929190610ee7565b6020604051808303816000875af1158015610594573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b89190610f51565b9050806105fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f190610fca565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016106339190610bdd565b602060405180830381865afa158015610650573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067491906110ba565b91508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33876040518363ffffffff1660e01b81526004016106b19291906112eb565b6020604051808303816000875af11580156106d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f49190610f51565b5084826107019190611314565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161073a9190610bdd565b602060405180830381865afa158015610757573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077b91906110ba565b146107bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b290611394565b60405180910390fd5b600193505050509392505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461085a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108519061105c565b60405180910390fd5b6000849050828173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b815260040161089b92919061107c565b602060405180830381865afa1580156108b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108dc91906110ba565b101561091d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091490611133565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016109589190610bdd565b602060405180830381865afa158015610975573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061099991906110ba565b905060008273ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b81526004016109da93929190611153565b6020604051808303816000875af11580156109f9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1d9190610f51565b905080610a5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a56906111fc565b60405180910390fd5b8482610a6b919061124b565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610aa49190610bdd565b602060405180830381865afa158015610ac1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae591906110ba565b14610b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1c906112cb565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16638f5184303388886040518463ffffffff1660e01b8152600401610b6293929190610ee7565b600060405180830381600087803b158015610b7c57600080fd5b505af1925050508015610b8d575060015b50600193505050509392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610bc782610b9c565b9050919050565b610bd781610bbc565b82525050565b6000602082019050610bf26000830184610bce565b92915050565b6000604051905090565b600080fd5b600080fd5b610c1581610bbc565b8114610c2057600080fd5b50565b600081359050610c3281610c0c565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610c8b82610c42565b810181811067ffffffffffffffff82111715610caa57610ca9610c53565b5b80604052505050565b6000610cbd610bf8565b9050610cc98282610c82565b919050565b600067ffffffffffffffff821115610ce957610ce8610c53565b5b610cf282610c42565b9050602081019050919050565b82818337600083830152505050565b6000610d21610d1c84610cce565b610cb3565b905082815260208101848484011115610d3d57610d3c610c3d565b5b610d48848285610cff565b509392505050565b600082601f830112610d6557610d64610c38565b5b8135610d75848260208601610d0e565b91505092915050565b6000819050919050565b610d9181610d7e565b8114610d9c57600080fd5b50565b600081359050610dae81610d88565b92915050565b600080600060608486031215610dcd57610dcc610c02565b5b6000610ddb86828701610c23565b935050602084013567ffffffffffffffff811115610dfc57610dfb610c07565b5b610e0886828701610d50565b9250506040610e1986828701610d9f565b9150509250925092565b60008115159050919050565b610e3881610e23565b82525050565b6000602082019050610e536000830184610e2f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610e93578082015181840152602081019050610e78565b60008484015250505050565b6000610eaa82610e59565b610eb48185610e64565b9350610ec4818560208601610e75565b610ecd81610c42565b840191505092915050565b610ee181610d7e565b82525050565b6000606082019050610efc6000830186610bce565b8181036020830152610f0e8185610e9f565b9050610f1d6040830184610ed8565b949350505050565b610f2e81610e23565b8114610f3957600080fd5b50565b600081519050610f4b81610f25565b92915050565b600060208284031215610f6757610f66610c02565b5b6000610f7584828501610f3c565b91505092915050565b7f6661696c656420746f2064656c65676174650000000000000000000000000000600082015250565b6000610fb4601283610e64565b9150610fbf82610f7e565b602082019050919050565b60006020820190508181036000830152610fe381610fa7565b9050919050565b7f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b6000611046602183610e64565b915061105182610fea565b604082019050919050565b6000602082019050818103600083015261107581611039565b9050919050565b60006040820190506110916000830185610bce565b61109e6020830184610bce565b9392505050565b6000815190506110b481610d88565b92915050565b6000602082840312156110d0576110cf610c02565b5b60006110de848285016110a5565b91505092915050565b7f496e73756666696369656e7420616c6c6f77616e636500000000000000000000600082015250565b600061111d601683610e64565b9150611128826110e7565b602082019050919050565b6000602082019050818103600083015261114c81611110565b9050919050565b60006060820190506111686000830186610bce565b6111756020830185610bce565b6111826040830184610ed8565b949350505050565b7f4661696c656420746f207472616e7366657220746f6b656e7320666f7220666c60008201527f617368206c6f616e000000000000000000000000000000000000000000000000602082015250565b60006111e6602883610e64565b91506111f18261118a565b604082019050919050565b60006020820190508181036000830152611215816111d9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061125682610d7e565b915061126183610d7e565b92508282019050808211156112795761127861121c565b5b92915050565b7f466c617368206c6f616e206661696c6564000000000000000000000000000000600082015250565b60006112b5601183610e64565b91506112c08261127f565b602082019050919050565b600060208201905081810360008301526112e4816112a8565b9050919050565b60006040820190506113006000830185610bce565b61130d6020830184610ed8565b9392505050565b600061131f82610d7e565b915061132a83610d7e565b92508282039050818111156113425761134161121c565b5b92915050565b7f466c617368206c6f616e2072657061796d656e74206661696c65640000000000600082015250565b600061137e601b83610e64565b915061138982611348565b602082019050919050565b600060208201905081810360008301526113ad81611371565b905091905056fea2646970667358221220c424c19551d9b4559d960ffe973aece9d88bd266c540f629abf8f11eb26a6c1e64736f6c63430008120033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c80638da5cb5b146100515780638f5184301461006f578063ee52ad711461008b578063f12fae93146100bb575b600080fd5b6100596100eb565b6040516100669190610bdd565b60405180910390f35b61008960048036038101906100849190610db4565b61010f565b005b6100a560048036038101906100a09190610db4565b6101da565b6040516100b29190610e3e565b60405180910390f35b6100d560048036038101906100d09190610db4565b6107c9565b6040516100e29190610e3e565b60405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061080073ffffffffffffffffffffffffffffffffffffffff166353266bbb8585856040518463ffffffff1660e01b815260040161015093929190610ee7565b6020604051808303816000875af115801561016f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101939190610f51565b9050806101d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101cc90610fca565b60405180910390fd5b600080fd5b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461026b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102629061105c565b60405180910390fd5b6000849050828173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b81526004016102ac92919061107c565b602060405180830381865afa1580156102c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ed91906110ba565b101561032e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161032590611133565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016103699190610bdd565b602060405180830381865afa158015610386573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103aa91906110ba565b905060008273ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b81526004016103eb93929190611153565b6020604051808303816000875af115801561040a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061042e9190610f51565b905080610470576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610467906111fc565b60405180910390fd5b848261047c919061124b565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016104b59190610bdd565b602060405180830381865afa1580156104d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f691906110ba565b14610536576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052d906112cb565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3388886040518463ffffffff1660e01b815260040161057593929190610ee7565b6020604051808303816000875af1158015610594573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b89190610f51565b9050806105fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f190610fca565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016106339190610bdd565b602060405180830381865afa158015610650573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067491906110ba565b91508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33876040518363ffffffff1660e01b81526004016106b19291906112eb565b6020604051808303816000875af11580156106d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f49190610f51565b5084826107019190611314565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161073a9190610bdd565b602060405180830381865afa158015610757573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077b91906110ba565b146107bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b290611394565b60405180910390fd5b600193505050509392505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461085a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108519061105c565b60405180910390fd5b6000849050828173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b815260040161089b92919061107c565b602060405180830381865afa1580156108b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108dc91906110ba565b101561091d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091490611133565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016109589190610bdd565b602060405180830381865afa158015610975573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061099991906110ba565b905060008273ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b81526004016109da93929190611153565b6020604051808303816000875af11580156109f9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1d9190610f51565b905080610a5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a56906111fc565b60405180910390fd5b8482610a6b919061124b565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610aa49190610bdd565b602060405180830381865afa158015610ac1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae591906110ba565b14610b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1c906112cb565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16638f5184303388886040518463ffffffff1660e01b8152600401610b6293929190610ee7565b600060405180830381600087803b158015610b7c57600080fd5b505af1925050508015610b8d575060015b50600193505050509392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610bc782610b9c565b9050919050565b610bd781610bbc565b82525050565b6000602082019050610bf26000830184610bce565b92915050565b6000604051905090565b600080fd5b600080fd5b610c1581610bbc565b8114610c2057600080fd5b50565b600081359050610c3281610c0c565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610c8b82610c42565b810181811067ffffffffffffffff82111715610caa57610ca9610c53565b5b80604052505050565b6000610cbd610bf8565b9050610cc98282610c82565b919050565b600067ffffffffffffffff821115610ce957610ce8610c53565b5b610cf282610c42565b9050602081019050919050565b82818337600083830152505050565b6000610d21610d1c84610cce565b610cb3565b905082815260208101848484011115610d3d57610d3c610c3d565b5b610d48848285610cff565b509392505050565b600082601f830112610d6557610d64610c38565b5b8135610d75848260208601610d0e565b91505092915050565b6000819050919050565b610d9181610d7e565b8114610d9c57600080fd5b50565b600081359050610dae81610d88565b92915050565b600080600060608486031215610dcd57610dcc610c02565b5b6000610ddb86828701610c23565b935050602084013567ffffffffffffffff811115610dfc57610dfb610c07565b5b610e0886828701610d50565b9250506040610e1986828701610d9f565b9150509250925092565b60008115159050919050565b610e3881610e23565b82525050565b6000602082019050610e536000830184610e2f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610e93578082015181840152602081019050610e78565b60008484015250505050565b6000610eaa82610e59565b610eb48185610e64565b9350610ec4818560208601610e75565b610ecd81610c42565b840191505092915050565b610ee181610d7e565b82525050565b6000606082019050610efc6000830186610bce565b8181036020830152610f0e8185610e9f565b9050610f1d6040830184610ed8565b949350505050565b610f2e81610e23565b8114610f3957600080fd5b50565b600081519050610f4b81610f25565b92915050565b600060208284031215610f6757610f66610c02565b5b6000610f7584828501610f3c565b91505092915050565b7f6661696c656420746f2064656c65676174650000000000000000000000000000600082015250565b6000610fb4601283610e64565b9150610fbf82610f7e565b602082019050919050565b60006020820190508181036000830152610fe381610fa7565b9050919050565b7f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b6000611046602183610e64565b915061105182610fea565b604082019050919050565b6000602082019050818103600083015261107581611039565b9050919050565b60006040820190506110916000830185610bce565b61109e6020830184610bce565b9392505050565b6000815190506110b481610d88565b92915050565b6000602082840312156110d0576110cf610c02565b5b60006110de848285016110a5565b91505092915050565b7f496e73756666696369656e7420616c6c6f77616e636500000000000000000000600082015250565b600061111d601683610e64565b9150611128826110e7565b602082019050919050565b6000602082019050818103600083015261114c81611110565b9050919050565b60006060820190506111686000830186610bce565b6111756020830185610bce565b6111826040830184610ed8565b949350505050565b7f4661696c656420746f207472616e7366657220746f6b656e7320666f7220666c60008201527f617368206c6f616e000000000000000000000000000000000000000000000000602082015250565b60006111e6602883610e64565b91506111f18261118a565b604082019050919050565b60006020820190508181036000830152611215816111d9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061125682610d7e565b915061126183610d7e565b92508282019050808211156112795761127861121c565b5b92915050565b7f466c617368206c6f616e206661696c6564000000000000000000000000000000600082015250565b60006112b5601183610e64565b91506112c08261127f565b602082019050919050565b600060208201905081810360008301526112e4816112a8565b9050919050565b60006040820190506113006000830185610bce565b61130d6020830184610ed8565b9392505050565b600061131f82610d7e565b915061132a83610d7e565b92508282039050818111156113425761134161121c565b5b92915050565b7f466c617368206c6f616e2072657061796d656e74206661696c65640000000000600082015250565b600061137e601b83610e64565b915061138982611348565b602082019050919050565b600060208201905081810360008301526113ad81611371565b905091905056fea2646970667358221220c424c19551d9b4559d960ffe973aece9d88bd266c540f629abf8f11eb26a6c1e64736f6c63430008120033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/x/evm/statedb/testdata/FlashLoan.sol b/precompiles/testutil/contracts/FlashLoan.sol similarity index 51% rename from x/evm/statedb/testdata/FlashLoan.sol rename to precompiles/testutil/contracts/FlashLoan.sol index 72a90681eb..e91b0bffc4 100644 --- a/x/evm/statedb/testdata/FlashLoan.sol +++ b/precompiles/testutil/contracts/FlashLoan.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.17; -import "../../../../precompiles/staking/StakingI.sol" as staking; +import "../../staking/StakingI.sol" as staking; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; contract FlashLoan { @@ -28,7 +28,7 @@ contract FlashLoan { uint256 balancePre = token.balanceOf(address(this)); bool success = token.transferFrom(msg.sender, address(this), _amount); require(success, "Failed to transfer tokens for flash loan"); - require( + assert( token.balanceOf(address(this)) == balancePre + _amount, "Flash loan failed" ); @@ -44,11 +44,59 @@ contract FlashLoan { // Transfer tokens back to end the flash loan balancePre = token.balanceOf(address(this)); token.transfer(msg.sender, _amount); - require( + assert( token.balanceOf(address(this)) == balancePre - _amount, "Flash loan repayment failed" ); return true; } + + function flashLoanWithRevert( + address _token, + string memory _validator, + uint256 _amount + ) public returns (bool) { + require(msg.sender == owner, "Only owner can call this function"); + + // Get some tokens to initiate the flash loan + IERC20 token = IERC20(_token); + require( + token.allowance(msg.sender, address(this)) >= _amount, + "Insufficient allowance" + ); + + uint256 balancePre = token.balanceOf(address(this)); + bool success = token.transferFrom(msg.sender, address(this), _amount); + require(success, "Failed to transfer tokens for flash loan"); + assert( + token.balanceOf(address(this)) == balancePre + _amount, + "Flash loan failed" + ); + + try + FlashLoan(address(this)).delegateWithRevert( + msg.sender, + _validator, + _amount + ) + {} catch {} + + return true; + } + + function delegateWithRevert( + address _delegator, + string memory _validator, + uint256 _amount + ) external { + // Execute some precompile logic and revert (e.g. staking) + bool success = staking.STAKING_CONTRACT.delegate( + _delegator, + _validator, + _amount + ); + require(success, "failed to delegate"); + revert(); + } } diff --git a/precompiles/testutil/contracts/InterchainSender.json b/precompiles/testutil/contracts/InterchainSender.json index 7aece9429c..b07d612300 100644 --- a/precompiles/testutil/contracts/InterchainSender.json +++ b/precompiles/testutil/contracts/InterchainSender.json @@ -3,6 +3,19 @@ "contractName": "InterchainSender", "sourceName": "solidity/precompiles/testutil/contracts/InterchainSender.sol", "abi": [ + { + "inputs": [], + "name": "counter", + "outputs": [ + { + "internalType": "int64", + "name": "", + "type": "int64" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -299,6 +312,59 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "_source", + "type": "address" + }, + { + "internalType": "string", + "name": "sourcePort", + "type": "string" + }, + { + "internalType": "string", + "name": "sourceChannel", + "type": "string" + }, + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "string", + "name": "receiver", + "type": "string" + }, + { + "internalType": "bool", + "name": "_before", + "type": "bool" + }, + { + "internalType": "bool", + "name": "_between", + "type": "bool" + }, + { + "internalType": "bool", + "name": "_after", + "type": "bool" + } + ], + "name": "testMultiTransferWithInternalTransfer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], "name": "testRevoke", @@ -372,6 +438,59 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "_otherAcc", + "type": "address" + }, + { + "internalType": "address", + "name": "_source", + "type": "address" + }, + { + "internalType": "string", + "name": "sourcePort", + "type": "string" + }, + { + "internalType": "string", + "name": "sourceChannel", + "type": "string" + }, + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "string", + "name": "receiver", + "type": "string" + }, + { + "internalType": "bool", + "name": "_before", + "type": "bool" + }, + { + "internalType": "bool", + "name": "_after", + "type": "bool" + } + ], + "name": "testTransferFundsWithTransferToOtherAcc", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -439,8 +558,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b506129bc806100206000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063c595699a11610066578063c595699a14610159578063dfa10f3914610189578063ee5766d9146101ba578063f298e7a8146101ea578063f3675f08146102065761009e565b8063424af9f6146100a35780636fdf23cc146100bf5780637492bdd8146100ef5780637a6185e11461011f578063a363df8414610129575b600080fd5b6100bd60048036038101906100b891906109ca565b610222565b005b6100d960048036038101906100d49190610c6e565b6102fc565b6040516100e69190610dc0565b60405180910390f35b61010960048036038101906101049190610c6e565b61039a565b6040516101169190610dc0565b60405180910390f35b610127610438565b005b610143600480360381019061013e9190610e39565b6104fd565b604051610150919061121c565b60405180910390f35b610173600480360381019061016e919061123e565b61058a565b60405161018091906112d1565b60405180910390f35b6101a3600480360381019061019e9190611317565b610614565b6040516101b1929190611507565b60405180910390f35b6101d460048036038101906101cf919061123e565b6106a8565b6040516101e19190611582565b60405180910390f35b61020460048036038101906101ff91906109ca565b610738565b005b610220600480360381019061021b91906115fa565b610812565b005b600061080273ffffffffffffffffffffffffffffffffffffffff166354de647b308a8a8a8a8a8a8a6040518963ffffffff1660e01b815260040161026d989796959493929190611692565b6020604051808303816000875af115801561028c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102b09190611738565b9050806102f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102e9906117b1565b60405180910390fd5b5050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663632535b98a8a8a8a308b8b8b8b6040518a63ffffffff1660e01b815260040161034999989796959493929190611800565b6020604051808303816000875af1158015610368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038c91906118c6565b905098975050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663632535b98a8a8a8a338b8b8b8b6040518a63ffffffff1660e01b81526004016103e799989796959493929190611800565b6020604051808303816000875af1158015610406573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061042a91906118c6565b905098975050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff166374a8f103306040518263ffffffff1660e01b815260040161047591906118f3565b6020604051808303816000875af1158015610494573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b89190611738565b9050806104fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f19061195a565b60405180910390fd5b50565b606061080273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84846040518363ffffffff1660e01b815260040161053c92919061197a565b600060405180830381865afa158015610559573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906105829190611e4f565b905092915050565b606061080273ffffffffffffffffffffffffffffffffffffffff1663b5cb6e7d836040518263ffffffff1660e01b81526004016105c791906112d1565b600060405180830381865afa1580156105e4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061060d9190611e98565b9050919050565b606061061e6108dd565b61080273ffffffffffffffffffffffffffffffffffffffff166322b6fad6846040518263ffffffff1660e01b81526004016106599190612072565b600060405180830381865afa158015610676573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061069f919061230a565b91509150915091565b6106b0610901565b61080273ffffffffffffffffffffffffffffffffffffffff1663a815cdd9836040518263ffffffff1660e01b81526004016106eb91906112d1565b600060405180830381865afa158015610708573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906107319190612382565b9050919050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663b3f536ec308a8a8a8a8a8a8a6040518963ffffffff1660e01b8152600401610783989796959493929190611692565b6020604051808303816000875af11580156107a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c69190611738565b905080610808576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ff90612417565b60405180910390fd5b5050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663473c90c73085856040518463ffffffff1660e01b8152600401610853939291906128e8565b6020604051808303816000875af1158015610872573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108969190611738565b9050806108d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cf90612966565b60405180910390fd5b505050565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b604051806040016040528060608152602001606081525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126109545761095361092f565b5b8235905067ffffffffffffffff81111561097157610970610934565b5b60208301915083600182028301111561098d5761098c610939565b5b9250929050565b6000819050919050565b6109a781610994565b81146109b257600080fd5b50565b6000813590506109c48161099e565b92915050565b60008060008060008060006080888a0312156109e9576109e8610925565b5b600088013567ffffffffffffffff811115610a0757610a0661092a565b5b610a138a828b0161093e565b9750975050602088013567ffffffffffffffff811115610a3657610a3561092a565b5b610a428a828b0161093e565b9550955050604088013567ffffffffffffffff811115610a6557610a6461092a565b5b610a718a828b0161093e565b93509350506060610a848a828b016109b5565b91505092959891949750929550565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610ae182610a98565b810181811067ffffffffffffffff82111715610b0057610aff610aa9565b5b80604052505050565b6000610b1361091b565b9050610b1f8282610ad8565b919050565b600067ffffffffffffffff821115610b3f57610b3e610aa9565b5b610b4882610a98565b9050602081019050919050565b82818337600083830152505050565b6000610b77610b7284610b24565b610b09565b905082815260208101848484011115610b9357610b92610a93565b5b610b9e848285610b55565b509392505050565b600082601f830112610bbb57610bba61092f565b5b8135610bcb848260208601610b64565b91505092915050565b600080fd5b600080fd5b600067ffffffffffffffff82169050919050565b610bfb81610bde565b8114610c0657600080fd5b50565b600081359050610c1881610bf2565b92915050565b600060408284031215610c3457610c33610bd4565b5b610c3e6040610b09565b90506000610c4e84828501610c09565b6000830152506020610c6284828501610c09565b60208301525092915050565b600080600080600080600080610120898b031215610c8f57610c8e610925565b5b600089013567ffffffffffffffff811115610cad57610cac61092a565b5b610cb98b828c01610ba6565b985050602089013567ffffffffffffffff811115610cda57610cd961092a565b5b610ce68b828c01610ba6565b975050604089013567ffffffffffffffff811115610d0757610d0661092a565b5b610d138b828c01610ba6565b9650506060610d248b828c016109b5565b955050608089013567ffffffffffffffff811115610d4557610d4461092a565b5b610d518b828c01610ba6565b94505060a0610d628b828c01610c1e565b93505060e0610d738b828c01610c09565b92505061010089013567ffffffffffffffff811115610d9557610d9461092a565b5b610da18b828c01610ba6565b9150509295985092959890939650565b610dba81610bde565b82525050565b6000602082019050610dd56000830184610db1565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610e0682610ddb565b9050919050565b610e1681610dfb565b8114610e2157600080fd5b50565b600081359050610e3381610e0d565b92915050565b60008060408385031215610e5057610e4f610925565b5b6000610e5e85828601610e24565b9250506020610e6f85828601610e24565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610edf578082015181840152602081019050610ec4565b60008484015250505050565b6000610ef682610ea5565b610f008185610eb0565b9350610f10818560208601610ec1565b610f1981610a98565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b610f5981610994565b82525050565b60006040830160008301518482036000860152610f7c8282610eeb565b9150506020830151610f916020860182610f50565b508091505092915050565b6000610fa88383610f5f565b905092915050565b6000602082019050919050565b6000610fc882610f24565b610fd28185610f2f565b935083602082028501610fe485610f40565b8060005b8581101561102057848403895281516110018582610f9c565b945061100c83610fb0565b925060208a01995050600181019050610fe8565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061106a8383610eeb565b905092915050565b6000602082019050919050565b600061108a82611032565b611094818561103d565b9350836020820285016110a68561104e565b8060005b858110156110e257848403895281516110c3858261105e565b94506110ce83611072565b925060208a019950506001810190506110aa565b50829750879550505050505092915050565b600060a08301600083015184820360008601526111118282610eeb565b9150506020830151848203602086015261112b8282610eeb565b915050604083015184820360408601526111458282610fbd565b9150506060830151848203606086015261115f828261107f565b91505060808301518482036080860152611179828261107f565b9150508091505092915050565b600061119283836110f4565b905092915050565b6000602082019050919050565b60006111b282610e79565b6111bc8185610e84565b9350836020820285016111ce85610e95565b8060005b8581101561120a57848403895281516111eb8582611186565b94506111f68361119a565b925060208a019950506001810190506111d2565b50829750879550505050505092915050565b6000602082019050818103600083015261123681846111a7565b905092915050565b60006020828403121561125457611253610925565b5b600082013567ffffffffffffffff8111156112725761127161092a565b5b61127e84828501610ba6565b91505092915050565b600082825260208201905092915050565b60006112a382610ea5565b6112ad8185611287565b93506112bd818560208601610ec1565b6112c681610a98565b840191505092915050565b600060208201905081810360008301526112eb8184611298565b905092915050565b600080fd5b600060a0828403121561130e5761130d6112f3565b5b81905092915050565b60006020828403121561132d5761132c610925565b5b600082013567ffffffffffffffff81111561134b5761134a61092a565b5b611357848285016112f8565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060408301600083015184820360008601526113a98282610eeb565b915050602083015184820360208601526113c38282610eeb565b9150508091505092915050565b60006113dc838361138c565b905092915050565b6000602082019050919050565b60006113fc82611360565b611406818561136b565b9350836020820285016114188561137c565b8060005b85811015611454578484038952815161143585826113d0565b9450611440836113e4565b925060208a0199505060018101905061141c565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b600061148d82611466565b6114978185611471565b93506114a7818560208601610ec1565b6114b081610a98565b840191505092915050565b6114c481610bde565b82525050565b600060408301600083015184820360008601526114e78282611482565b91505060208301516114fc60208601826114bb565b508091505092915050565b6000604082019050818103600083015261152181856113f1565b9050818103602083015261153581846114ca565b90509392505050565b6000604083016000830151848203600086015261155b8282610eeb565b915050602083015184820360208601526115758282610eeb565b9150508091505092915050565b6000602082019050818103600083015261159c818461153e565b905092915050565b60008083601f8401126115ba576115b961092f565b5b8235905067ffffffffffffffff8111156115d7576115d6610934565b5b6020830191508360208202830111156115f3576115f2610939565b5b9250929050565b6000806020838503121561161157611610610925565b5b600083013567ffffffffffffffff81111561162f5761162e61092a565b5b61163b858286016115a4565b92509250509250929050565b61165081610dfb565b82525050565b60006116628385611287565b935061166f838584610b55565b61167883610a98565b840190509392505050565b61168c81610994565b82525050565b600060a0820190506116a7600083018b611647565b81810360208301526116ba81898b611656565b905081810360408301526116cf818789611656565b905081810360608301526116e4818587611656565b90506116f36080830184611683565b9998505050505050505050565b60008115159050919050565b61171581611700565b811461172057600080fd5b50565b6000815190506117328161170c565b92915050565b60006020828403121561174e5761174d610925565b5b600061175c84828501611723565b91505092915050565b7f4661696c656420746f20696e63726561736520616c6c6f77616e636500000000600082015250565b600061179b601c83611287565b91506117a682611765565b602082019050919050565b600060208201905081810360008301526117ca8161178e565b9050919050565b6040820160008201516117e760008501826114bb565b5060208201516117fa60208501826114bb565b50505050565b600061014082019050818103600083015261181b818c611298565b9050818103602083015261182f818b611298565b90508181036040830152611843818a611298565b90506118526060830189611683565b61185f6080830188611647565b81810360a08301526118718187611298565b905061188060c08301866117d1565b61188e610100830185610db1565b8181036101208301526118a18184611298565b90509a9950505050505050505050565b6000815190506118c081610bf2565b92915050565b6000602082840312156118dc576118db610925565b5b60006118ea848285016118b1565b91505092915050565b60006020820190506119086000830184611647565b92915050565b7f4661696c656420746f207265766f6b6520617070726f76616c00000000000000600082015250565b6000611944601983611287565b915061194f8261190e565b602082019050919050565b6000602082019050818103600083015261197381611937565b9050919050565b600060408201905061198f6000830185611647565b61199c6020830184611647565b9392505050565b600067ffffffffffffffff8211156119be576119bd610aa9565b5b602082029050602081019050919050565b60006119e26119dd84610b24565b610b09565b9050828152602081018484840111156119fe576119fd610a93565b5b611a09848285610ec1565b509392505050565b600082601f830112611a2657611a2561092f565b5b8151611a368482602086016119cf565b91505092915050565b600067ffffffffffffffff821115611a5a57611a59610aa9565b5b602082029050602081019050919050565b600081519050611a7a8161099e565b92915050565b600060408284031215611a9657611a95610bd4565b5b611aa06040610b09565b9050600082015167ffffffffffffffff811115611ac057611abf610bd9565b5b611acc84828501611a11565b6000830152506020611ae084828501611a6b565b60208301525092915050565b6000611aff611afa84611a3f565b610b09565b90508083825260208201905060208402830185811115611b2257611b21610939565b5b835b81811015611b6957805167ffffffffffffffff811115611b4757611b4661092f565b5b808601611b548982611a80565b85526020850194505050602081019050611b24565b5050509392505050565b600082601f830112611b8857611b8761092f565b5b8151611b98848260208601611aec565b91505092915050565b600067ffffffffffffffff821115611bbc57611bbb610aa9565b5b602082029050602081019050919050565b6000611be0611bdb84611ba1565b610b09565b90508083825260208201905060208402830185811115611c0357611c02610939565b5b835b81811015611c4a57805167ffffffffffffffff811115611c2857611c2761092f565b5b808601611c358982611a11565b85526020850194505050602081019050611c05565b5050509392505050565b600082601f830112611c6957611c6861092f565b5b8151611c79848260208601611bcd565b91505092915050565b600060a08284031215611c9857611c97610bd4565b5b611ca260a0610b09565b9050600082015167ffffffffffffffff811115611cc257611cc1610bd9565b5b611cce84828501611a11565b600083015250602082015167ffffffffffffffff811115611cf257611cf1610bd9565b5b611cfe84828501611a11565b602083015250604082015167ffffffffffffffff811115611d2257611d21610bd9565b5b611d2e84828501611b73565b604083015250606082015167ffffffffffffffff811115611d5257611d51610bd9565b5b611d5e84828501611c54565b606083015250608082015167ffffffffffffffff811115611d8257611d81610bd9565b5b611d8e84828501611c54565b60808301525092915050565b6000611dad611da8846119a3565b610b09565b90508083825260208201905060208402830185811115611dd057611dcf610939565b5b835b81811015611e1757805167ffffffffffffffff811115611df557611df461092f565b5b808601611e028982611c82565b85526020850194505050602081019050611dd2565b5050509392505050565b600082601f830112611e3657611e3561092f565b5b8151611e46848260208601611d9a565b91505092915050565b600060208284031215611e6557611e64610925565b5b600082015167ffffffffffffffff811115611e8357611e8261092a565b5b611e8f84828501611e21565b91505092915050565b600060208284031215611eae57611ead610925565b5b600082015167ffffffffffffffff811115611ecc57611ecb61092a565b5b611ed884828501611a11565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112611f0d57611f0c611eeb565b5b83810192508235915060208301925067ffffffffffffffff821115611f3557611f34611ee1565b5b600182023603831315611f4b57611f4a611ee6565b5b509250929050565b6000611f5f8385611471565b9350611f6c838584610b55565b611f7583610a98565b840190509392505050565b6000611f8f6020840184610c09565b905092915050565b600081359050611fa68161170c565b92915050565b6000611fbb6020840184611f97565b905092915050565b611fcc81611700565b82525050565b600060a08301611fe56000840184611ef0565b8583036000870152611ff8838284611f53565b925050506120096020840184611f80565b61201660208601826114bb565b506120246040840184611f80565b61203160408601826114bb565b5061203f6060840184611fac565b61204c6060860182611fc3565b5061205a6080840184611fac565b6120676080860182611fc3565b508091505092915050565b6000602082019050818103600083015261208c8184611fd2565b905092915050565b600067ffffffffffffffff8211156120af576120ae610aa9565b5b602082029050602081019050919050565b6000604082840312156120d6576120d5610bd4565b5b6120e06040610b09565b9050600082015167ffffffffffffffff811115612100576120ff610bd9565b5b61210c84828501611a11565b600083015250602082015167ffffffffffffffff8111156121305761212f610bd9565b5b61213c84828501611a11565b60208301525092915050565b600061215b61215684612094565b610b09565b9050808382526020820190506020840283018581111561217e5761217d610939565b5b835b818110156121c557805167ffffffffffffffff8111156121a3576121a261092f565b5b8086016121b089826120c0565b85526020850194505050602081019050612180565b5050509392505050565b600082601f8301126121e4576121e361092f565b5b81516121f4848260208601612148565b91505092915050565b600067ffffffffffffffff82111561221857612217610aa9565b5b61222182610a98565b9050602081019050919050565b600061224161223c846121fd565b610b09565b90508281526020810184848401111561225d5761225c610a93565b5b612268848285610ec1565b509392505050565b600082601f8301126122855761228461092f565b5b815161229584826020860161222e565b91505092915050565b6000604082840312156122b4576122b3610bd4565b5b6122be6040610b09565b9050600082015167ffffffffffffffff8111156122de576122dd610bd9565b5b6122ea84828501612270565b60008301525060206122fe848285016118b1565b60208301525092915050565b6000806040838503121561232157612320610925565b5b600083015167ffffffffffffffff81111561233f5761233e61092a565b5b61234b858286016121cf565b925050602083015167ffffffffffffffff81111561236c5761236b61092a565b5b6123788582860161229e565b9150509250929050565b60006020828403121561239857612397610925565b5b600082015167ffffffffffffffff8111156123b6576123b561092a565b5b6123c2848285016120c0565b91505092915050565b7f4661696c656420746f20646563726561736520616c6c6f77616e636500000000600082015250565b6000612401601c83611287565b915061240c826123cb565b602082019050919050565b60006020820190508181036000830152612430816123f4565b9050919050565b6000819050919050565b6000808335600160200384360303811261245e5761245d611eeb565b5b83810192508235915060208301925067ffffffffffffffff82111561248657612485611ee1565b5b60018202360383131561249c5761249b611ee6565b5b509250929050565b60006124b08385610eb0565b93506124bd838584610b55565b6124c683610a98565b840190509392505050565b600080833560016020038436030381126124ee576124ed611eeb565b5b83810192508235915060208301925067ffffffffffffffff82111561251657612515611ee1565b5b60208202360383131561252c5761252b611ee6565b5b509250929050565b6000819050919050565b600061254d60208401846109b5565b905092915050565b6000604083016125686000840184612441565b858303600087015261257b8382846124a4565b9250505061258c602084018461253e565b6125996020860182610f50565b508091505092915050565b60006125b08383612555565b905092915050565b6000823560016040038336030381126125d4576125d3611eeb565b5b82810191505092915050565b6000602082019050919050565b60006125f98385610f2f565b93508360208402850161260b84612534565b8060005b8781101561264f57848403895261262682846125b8565b61263085826125a4565b945061263b836125e0565b925060208a0199505060018101905061260f565b50829750879450505050509392505050565b6000808335600160200384360303811261267e5761267d611eeb565b5b83810192508235915060208301925067ffffffffffffffff8211156126a6576126a5611ee1565b5b6020820236038313156126bc576126bb611ee6565b5b509250929050565b6000819050919050565b60006126db8484846124a4565b90509392505050565b6000602082019050919050565b60006126fd838561103d565b93508360208402850161270f846126c4565b8060005b8781101561275557848403895261272a8284612441565b6127358682846126ce565b9550612740846126e4565b935060208b019a505050600181019050612713565b50829750879450505050509392505050565b600060a0830161277a6000840184612441565b858303600087015261278d8382846124a4565b9250505061279e6020840184612441565b85830360208701526127b18382846124a4565b925050506127c260408401846124d1565b85830360408701526127d58382846125ed565b925050506127e66060840184612661565b85830360608701526127f98382846126f1565b9250505061280a6080840184612661565b858303608087015261281d8382846126f1565b925050508091505092915050565b60006128378383612767565b905092915050565b60008235600160a00383360303811261285b5761285a611eeb565b5b82810191505092915050565b6000602082019050919050565b60006128808385610e84565b93508360208402850161289284612437565b8060005b878110156128d65784840389526128ad828461283f565b6128b7858261282b565b94506128c283612867565b925060208a01995050600181019050612896565b50829750879450505050509392505050565b60006040820190506128fd6000830186611647565b8181036020830152612910818486612874565b9050949350505050565b7f4661696c656420746f20706572666f726d20617070726f76616c000000000000600082015250565b6000612950601a83611287565b915061295b8261291a565b602082019050919050565b6000602082019050818103600083015261297f81612943565b905091905056fea2646970667358221220529a2fde619b049468185943bb5bbffc186c5e7297922cf92007dc60d11da84264736f6c63430008130033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061009e5760003560e01c8063c595699a11610066578063c595699a14610159578063dfa10f3914610189578063ee5766d9146101ba578063f298e7a8146101ea578063f3675f08146102065761009e565b8063424af9f6146100a35780636fdf23cc146100bf5780637492bdd8146100ef5780637a6185e11461011f578063a363df8414610129575b600080fd5b6100bd60048036038101906100b891906109ca565b610222565b005b6100d960048036038101906100d49190610c6e565b6102fc565b6040516100e69190610dc0565b60405180910390f35b61010960048036038101906101049190610c6e565b61039a565b6040516101169190610dc0565b60405180910390f35b610127610438565b005b610143600480360381019061013e9190610e39565b6104fd565b604051610150919061121c565b60405180910390f35b610173600480360381019061016e919061123e565b61058a565b60405161018091906112d1565b60405180910390f35b6101a3600480360381019061019e9190611317565b610614565b6040516101b1929190611507565b60405180910390f35b6101d460048036038101906101cf919061123e565b6106a8565b6040516101e19190611582565b60405180910390f35b61020460048036038101906101ff91906109ca565b610738565b005b610220600480360381019061021b91906115fa565b610812565b005b600061080273ffffffffffffffffffffffffffffffffffffffff166354de647b308a8a8a8a8a8a8a6040518963ffffffff1660e01b815260040161026d989796959493929190611692565b6020604051808303816000875af115801561028c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102b09190611738565b9050806102f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102e9906117b1565b60405180910390fd5b5050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663632535b98a8a8a8a308b8b8b8b6040518a63ffffffff1660e01b815260040161034999989796959493929190611800565b6020604051808303816000875af1158015610368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038c91906118c6565b905098975050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663632535b98a8a8a8a338b8b8b8b6040518a63ffffffff1660e01b81526004016103e799989796959493929190611800565b6020604051808303816000875af1158015610406573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061042a91906118c6565b905098975050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff166374a8f103306040518263ffffffff1660e01b815260040161047591906118f3565b6020604051808303816000875af1158015610494573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b89190611738565b9050806104fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f19061195a565b60405180910390fd5b50565b606061080273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84846040518363ffffffff1660e01b815260040161053c92919061197a565b600060405180830381865afa158015610559573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906105829190611e4f565b905092915050565b606061080273ffffffffffffffffffffffffffffffffffffffff1663b5cb6e7d836040518263ffffffff1660e01b81526004016105c791906112d1565b600060405180830381865afa1580156105e4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061060d9190611e98565b9050919050565b606061061e6108dd565b61080273ffffffffffffffffffffffffffffffffffffffff166322b6fad6846040518263ffffffff1660e01b81526004016106599190612072565b600060405180830381865afa158015610676573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061069f919061230a565b91509150915091565b6106b0610901565b61080273ffffffffffffffffffffffffffffffffffffffff1663a815cdd9836040518263ffffffff1660e01b81526004016106eb91906112d1565b600060405180830381865afa158015610708573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906107319190612382565b9050919050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663b3f536ec308a8a8a8a8a8a8a6040518963ffffffff1660e01b8152600401610783989796959493929190611692565b6020604051808303816000875af11580156107a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c69190611738565b905080610808576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ff90612417565b60405180910390fd5b5050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663473c90c73085856040518463ffffffff1660e01b8152600401610853939291906128e8565b6020604051808303816000875af1158015610872573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108969190611738565b9050806108d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cf90612966565b60405180910390fd5b505050565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b604051806040016040528060608152602001606081525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126109545761095361092f565b5b8235905067ffffffffffffffff81111561097157610970610934565b5b60208301915083600182028301111561098d5761098c610939565b5b9250929050565b6000819050919050565b6109a781610994565b81146109b257600080fd5b50565b6000813590506109c48161099e565b92915050565b60008060008060008060006080888a0312156109e9576109e8610925565b5b600088013567ffffffffffffffff811115610a0757610a0661092a565b5b610a138a828b0161093e565b9750975050602088013567ffffffffffffffff811115610a3657610a3561092a565b5b610a428a828b0161093e565b9550955050604088013567ffffffffffffffff811115610a6557610a6461092a565b5b610a718a828b0161093e565b93509350506060610a848a828b016109b5565b91505092959891949750929550565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610ae182610a98565b810181811067ffffffffffffffff82111715610b0057610aff610aa9565b5b80604052505050565b6000610b1361091b565b9050610b1f8282610ad8565b919050565b600067ffffffffffffffff821115610b3f57610b3e610aa9565b5b610b4882610a98565b9050602081019050919050565b82818337600083830152505050565b6000610b77610b7284610b24565b610b09565b905082815260208101848484011115610b9357610b92610a93565b5b610b9e848285610b55565b509392505050565b600082601f830112610bbb57610bba61092f565b5b8135610bcb848260208601610b64565b91505092915050565b600080fd5b600080fd5b600067ffffffffffffffff82169050919050565b610bfb81610bde565b8114610c0657600080fd5b50565b600081359050610c1881610bf2565b92915050565b600060408284031215610c3457610c33610bd4565b5b610c3e6040610b09565b90506000610c4e84828501610c09565b6000830152506020610c6284828501610c09565b60208301525092915050565b600080600080600080600080610120898b031215610c8f57610c8e610925565b5b600089013567ffffffffffffffff811115610cad57610cac61092a565b5b610cb98b828c01610ba6565b985050602089013567ffffffffffffffff811115610cda57610cd961092a565b5b610ce68b828c01610ba6565b975050604089013567ffffffffffffffff811115610d0757610d0661092a565b5b610d138b828c01610ba6565b9650506060610d248b828c016109b5565b955050608089013567ffffffffffffffff811115610d4557610d4461092a565b5b610d518b828c01610ba6565b94505060a0610d628b828c01610c1e565b93505060e0610d738b828c01610c09565b92505061010089013567ffffffffffffffff811115610d9557610d9461092a565b5b610da18b828c01610ba6565b9150509295985092959890939650565b610dba81610bde565b82525050565b6000602082019050610dd56000830184610db1565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610e0682610ddb565b9050919050565b610e1681610dfb565b8114610e2157600080fd5b50565b600081359050610e3381610e0d565b92915050565b60008060408385031215610e5057610e4f610925565b5b6000610e5e85828601610e24565b9250506020610e6f85828601610e24565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610edf578082015181840152602081019050610ec4565b60008484015250505050565b6000610ef682610ea5565b610f008185610eb0565b9350610f10818560208601610ec1565b610f1981610a98565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b610f5981610994565b82525050565b60006040830160008301518482036000860152610f7c8282610eeb565b9150506020830151610f916020860182610f50565b508091505092915050565b6000610fa88383610f5f565b905092915050565b6000602082019050919050565b6000610fc882610f24565b610fd28185610f2f565b935083602082028501610fe485610f40565b8060005b8581101561102057848403895281516110018582610f9c565b945061100c83610fb0565b925060208a01995050600181019050610fe8565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061106a8383610eeb565b905092915050565b6000602082019050919050565b600061108a82611032565b611094818561103d565b9350836020820285016110a68561104e565b8060005b858110156110e257848403895281516110c3858261105e565b94506110ce83611072565b925060208a019950506001810190506110aa565b50829750879550505050505092915050565b600060a08301600083015184820360008601526111118282610eeb565b9150506020830151848203602086015261112b8282610eeb565b915050604083015184820360408601526111458282610fbd565b9150506060830151848203606086015261115f828261107f565b91505060808301518482036080860152611179828261107f565b9150508091505092915050565b600061119283836110f4565b905092915050565b6000602082019050919050565b60006111b282610e79565b6111bc8185610e84565b9350836020820285016111ce85610e95565b8060005b8581101561120a57848403895281516111eb8582611186565b94506111f68361119a565b925060208a019950506001810190506111d2565b50829750879550505050505092915050565b6000602082019050818103600083015261123681846111a7565b905092915050565b60006020828403121561125457611253610925565b5b600082013567ffffffffffffffff8111156112725761127161092a565b5b61127e84828501610ba6565b91505092915050565b600082825260208201905092915050565b60006112a382610ea5565b6112ad8185611287565b93506112bd818560208601610ec1565b6112c681610a98565b840191505092915050565b600060208201905081810360008301526112eb8184611298565b905092915050565b600080fd5b600060a0828403121561130e5761130d6112f3565b5b81905092915050565b60006020828403121561132d5761132c610925565b5b600082013567ffffffffffffffff81111561134b5761134a61092a565b5b611357848285016112f8565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060408301600083015184820360008601526113a98282610eeb565b915050602083015184820360208601526113c38282610eeb565b9150508091505092915050565b60006113dc838361138c565b905092915050565b6000602082019050919050565b60006113fc82611360565b611406818561136b565b9350836020820285016114188561137c565b8060005b85811015611454578484038952815161143585826113d0565b9450611440836113e4565b925060208a0199505060018101905061141c565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b600061148d82611466565b6114978185611471565b93506114a7818560208601610ec1565b6114b081610a98565b840191505092915050565b6114c481610bde565b82525050565b600060408301600083015184820360008601526114e78282611482565b91505060208301516114fc60208601826114bb565b508091505092915050565b6000604082019050818103600083015261152181856113f1565b9050818103602083015261153581846114ca565b90509392505050565b6000604083016000830151848203600086015261155b8282610eeb565b915050602083015184820360208601526115758282610eeb565b9150508091505092915050565b6000602082019050818103600083015261159c818461153e565b905092915050565b60008083601f8401126115ba576115b961092f565b5b8235905067ffffffffffffffff8111156115d7576115d6610934565b5b6020830191508360208202830111156115f3576115f2610939565b5b9250929050565b6000806020838503121561161157611610610925565b5b600083013567ffffffffffffffff81111561162f5761162e61092a565b5b61163b858286016115a4565b92509250509250929050565b61165081610dfb565b82525050565b60006116628385611287565b935061166f838584610b55565b61167883610a98565b840190509392505050565b61168c81610994565b82525050565b600060a0820190506116a7600083018b611647565b81810360208301526116ba81898b611656565b905081810360408301526116cf818789611656565b905081810360608301526116e4818587611656565b90506116f36080830184611683565b9998505050505050505050565b60008115159050919050565b61171581611700565b811461172057600080fd5b50565b6000815190506117328161170c565b92915050565b60006020828403121561174e5761174d610925565b5b600061175c84828501611723565b91505092915050565b7f4661696c656420746f20696e63726561736520616c6c6f77616e636500000000600082015250565b600061179b601c83611287565b91506117a682611765565b602082019050919050565b600060208201905081810360008301526117ca8161178e565b9050919050565b6040820160008201516117e760008501826114bb565b5060208201516117fa60208501826114bb565b50505050565b600061014082019050818103600083015261181b818c611298565b9050818103602083015261182f818b611298565b90508181036040830152611843818a611298565b90506118526060830189611683565b61185f6080830188611647565b81810360a08301526118718187611298565b905061188060c08301866117d1565b61188e610100830185610db1565b8181036101208301526118a18184611298565b90509a9950505050505050505050565b6000815190506118c081610bf2565b92915050565b6000602082840312156118dc576118db610925565b5b60006118ea848285016118b1565b91505092915050565b60006020820190506119086000830184611647565b92915050565b7f4661696c656420746f207265766f6b6520617070726f76616c00000000000000600082015250565b6000611944601983611287565b915061194f8261190e565b602082019050919050565b6000602082019050818103600083015261197381611937565b9050919050565b600060408201905061198f6000830185611647565b61199c6020830184611647565b9392505050565b600067ffffffffffffffff8211156119be576119bd610aa9565b5b602082029050602081019050919050565b60006119e26119dd84610b24565b610b09565b9050828152602081018484840111156119fe576119fd610a93565b5b611a09848285610ec1565b509392505050565b600082601f830112611a2657611a2561092f565b5b8151611a368482602086016119cf565b91505092915050565b600067ffffffffffffffff821115611a5a57611a59610aa9565b5b602082029050602081019050919050565b600081519050611a7a8161099e565b92915050565b600060408284031215611a9657611a95610bd4565b5b611aa06040610b09565b9050600082015167ffffffffffffffff811115611ac057611abf610bd9565b5b611acc84828501611a11565b6000830152506020611ae084828501611a6b565b60208301525092915050565b6000611aff611afa84611a3f565b610b09565b90508083825260208201905060208402830185811115611b2257611b21610939565b5b835b81811015611b6957805167ffffffffffffffff811115611b4757611b4661092f565b5b808601611b548982611a80565b85526020850194505050602081019050611b24565b5050509392505050565b600082601f830112611b8857611b8761092f565b5b8151611b98848260208601611aec565b91505092915050565b600067ffffffffffffffff821115611bbc57611bbb610aa9565b5b602082029050602081019050919050565b6000611be0611bdb84611ba1565b610b09565b90508083825260208201905060208402830185811115611c0357611c02610939565b5b835b81811015611c4a57805167ffffffffffffffff811115611c2857611c2761092f565b5b808601611c358982611a11565b85526020850194505050602081019050611c05565b5050509392505050565b600082601f830112611c6957611c6861092f565b5b8151611c79848260208601611bcd565b91505092915050565b600060a08284031215611c9857611c97610bd4565b5b611ca260a0610b09565b9050600082015167ffffffffffffffff811115611cc257611cc1610bd9565b5b611cce84828501611a11565b600083015250602082015167ffffffffffffffff811115611cf257611cf1610bd9565b5b611cfe84828501611a11565b602083015250604082015167ffffffffffffffff811115611d2257611d21610bd9565b5b611d2e84828501611b73565b604083015250606082015167ffffffffffffffff811115611d5257611d51610bd9565b5b611d5e84828501611c54565b606083015250608082015167ffffffffffffffff811115611d8257611d81610bd9565b5b611d8e84828501611c54565b60808301525092915050565b6000611dad611da8846119a3565b610b09565b90508083825260208201905060208402830185811115611dd057611dcf610939565b5b835b81811015611e1757805167ffffffffffffffff811115611df557611df461092f565b5b808601611e028982611c82565b85526020850194505050602081019050611dd2565b5050509392505050565b600082601f830112611e3657611e3561092f565b5b8151611e46848260208601611d9a565b91505092915050565b600060208284031215611e6557611e64610925565b5b600082015167ffffffffffffffff811115611e8357611e8261092a565b5b611e8f84828501611e21565b91505092915050565b600060208284031215611eae57611ead610925565b5b600082015167ffffffffffffffff811115611ecc57611ecb61092a565b5b611ed884828501611a11565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112611f0d57611f0c611eeb565b5b83810192508235915060208301925067ffffffffffffffff821115611f3557611f34611ee1565b5b600182023603831315611f4b57611f4a611ee6565b5b509250929050565b6000611f5f8385611471565b9350611f6c838584610b55565b611f7583610a98565b840190509392505050565b6000611f8f6020840184610c09565b905092915050565b600081359050611fa68161170c565b92915050565b6000611fbb6020840184611f97565b905092915050565b611fcc81611700565b82525050565b600060a08301611fe56000840184611ef0565b8583036000870152611ff8838284611f53565b925050506120096020840184611f80565b61201660208601826114bb565b506120246040840184611f80565b61203160408601826114bb565b5061203f6060840184611fac565b61204c6060860182611fc3565b5061205a6080840184611fac565b6120676080860182611fc3565b508091505092915050565b6000602082019050818103600083015261208c8184611fd2565b905092915050565b600067ffffffffffffffff8211156120af576120ae610aa9565b5b602082029050602081019050919050565b6000604082840312156120d6576120d5610bd4565b5b6120e06040610b09565b9050600082015167ffffffffffffffff811115612100576120ff610bd9565b5b61210c84828501611a11565b600083015250602082015167ffffffffffffffff8111156121305761212f610bd9565b5b61213c84828501611a11565b60208301525092915050565b600061215b61215684612094565b610b09565b9050808382526020820190506020840283018581111561217e5761217d610939565b5b835b818110156121c557805167ffffffffffffffff8111156121a3576121a261092f565b5b8086016121b089826120c0565b85526020850194505050602081019050612180565b5050509392505050565b600082601f8301126121e4576121e361092f565b5b81516121f4848260208601612148565b91505092915050565b600067ffffffffffffffff82111561221857612217610aa9565b5b61222182610a98565b9050602081019050919050565b600061224161223c846121fd565b610b09565b90508281526020810184848401111561225d5761225c610a93565b5b612268848285610ec1565b509392505050565b600082601f8301126122855761228461092f565b5b815161229584826020860161222e565b91505092915050565b6000604082840312156122b4576122b3610bd4565b5b6122be6040610b09565b9050600082015167ffffffffffffffff8111156122de576122dd610bd9565b5b6122ea84828501612270565b60008301525060206122fe848285016118b1565b60208301525092915050565b6000806040838503121561232157612320610925565b5b600083015167ffffffffffffffff81111561233f5761233e61092a565b5b61234b858286016121cf565b925050602083015167ffffffffffffffff81111561236c5761236b61092a565b5b6123788582860161229e565b9150509250929050565b60006020828403121561239857612397610925565b5b600082015167ffffffffffffffff8111156123b6576123b561092a565b5b6123c2848285016120c0565b91505092915050565b7f4661696c656420746f20646563726561736520616c6c6f77616e636500000000600082015250565b6000612401601c83611287565b915061240c826123cb565b602082019050919050565b60006020820190508181036000830152612430816123f4565b9050919050565b6000819050919050565b6000808335600160200384360303811261245e5761245d611eeb565b5b83810192508235915060208301925067ffffffffffffffff82111561248657612485611ee1565b5b60018202360383131561249c5761249b611ee6565b5b509250929050565b60006124b08385610eb0565b93506124bd838584610b55565b6124c683610a98565b840190509392505050565b600080833560016020038436030381126124ee576124ed611eeb565b5b83810192508235915060208301925067ffffffffffffffff82111561251657612515611ee1565b5b60208202360383131561252c5761252b611ee6565b5b509250929050565b6000819050919050565b600061254d60208401846109b5565b905092915050565b6000604083016125686000840184612441565b858303600087015261257b8382846124a4565b9250505061258c602084018461253e565b6125996020860182610f50565b508091505092915050565b60006125b08383612555565b905092915050565b6000823560016040038336030381126125d4576125d3611eeb565b5b82810191505092915050565b6000602082019050919050565b60006125f98385610f2f565b93508360208402850161260b84612534565b8060005b8781101561264f57848403895261262682846125b8565b61263085826125a4565b945061263b836125e0565b925060208a0199505060018101905061260f565b50829750879450505050509392505050565b6000808335600160200384360303811261267e5761267d611eeb565b5b83810192508235915060208301925067ffffffffffffffff8211156126a6576126a5611ee1565b5b6020820236038313156126bc576126bb611ee6565b5b509250929050565b6000819050919050565b60006126db8484846124a4565b90509392505050565b6000602082019050919050565b60006126fd838561103d565b93508360208402850161270f846126c4565b8060005b8781101561275557848403895261272a8284612441565b6127358682846126ce565b9550612740846126e4565b935060208b019a505050600181019050612713565b50829750879450505050509392505050565b600060a0830161277a6000840184612441565b858303600087015261278d8382846124a4565b9250505061279e6020840184612441565b85830360208701526127b18382846124a4565b925050506127c260408401846124d1565b85830360408701526127d58382846125ed565b925050506127e66060840184612661565b85830360608701526127f98382846126f1565b9250505061280a6080840184612661565b858303608087015261281d8382846126f1565b925050508091505092915050565b60006128378383612767565b905092915050565b60008235600160a00383360303811261285b5761285a611eeb565b5b82810191505092915050565b6000602082019050919050565b60006128808385610e84565b93508360208402850161289284612437565b8060005b878110156128d65784840389526128ad828461283f565b6128b7858261282b565b94506128c283612867565b925060208a01995050600181019050612896565b50829750879450505050509392505050565b60006040820190506128fd6000830186611647565b8181036020830152612910818486612874565b9050949350505050565b7f4661696c656420746f20706572666f726d20617070726f76616c000000000000600082015250565b6000612950601a83611287565b915061295b8261291a565b602082019050919050565b6000602082019050818103600083015261297f81612943565b905091905056fea2646970667358221220529a2fde619b049468185943bb5bbffc186c5e7297922cf92007dc60d11da84264736f6c63430008130033", + "bytecode": "0x608060405234801561001057600080fd5b50613818806100206000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063a363df841161008c578063dfa10f3911610066578063dfa10f3914610210578063ee5766d914610241578063f298e7a814610271578063f3675f081461028d576100cf565b8063a363df8414610194578063b9672879146101c4578063c595699a146101e0576100cf565b80631dba685b146100d4578063424af9f6146100f057806361bc221a1461010c5780636fdf23cc1461012a5780637492bdd81461015a5780637a6185e11461018a575b600080fd5b6100ee60048036038101906100e99190611302565b6102a9565b005b61010a6004803603810190610105919061149c565b61070f565b005b6101146107e9565b6040516101219190611581565b60405180910390f35b610144600480360381019061013f9190611636565b6107fa565b6040516101519190611788565b60405180910390f35b610174600480360381019061016f9190611636565b610898565b6040516101819190611788565b60405180910390f35b610192610936565b005b6101ae60048036038101906101a991906117e1565b6109fb565b6040516101bb9190611bc4565b60405180910390f35b6101de60048036038101906101d99190611be6565b610a88565b005b6101fa60048036038101906101f59190611d20565b610d4b565b6040516102079190611db3565b60405180910390f35b61022a60048036038101906102259190611df9565b610dd5565b604051610238929190611fe9565b60405180910390f35b61025b60048036038101906102569190611d20565b610e69565b6040516102689190612064565b60405180910390f35b61028b6004803603810190610286919061149c565b610ef9565b005b6102a760048036038101906102a291906120dc565b610fd3565b005b82156103a65760008081819054906101000a900460070b809291906102cd90612158565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008973ffffffffffffffffffffffffffffffffffffffff16600f60405161031e906121b9565b60006040518083038185875af1925050503d806000811461035b576040519150601f19603f3d011682016040523d82523d6000602084013e610360565b606091505b50509050806103a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161039b90612240565b60405180910390fd5b505b60006040518060400160405280606467ffffffffffffffff168152602001606467ffffffffffffffff16815250905061080273ffffffffffffffffffffffffffffffffffffffff1663632535b98a8a8a60028b610403919061228f565b8f8b8860006040518963ffffffff1660e01b815260040161042b9897969594939291906123bb565b6020604051808303816000875af115801561044a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046e919061247f565b50821561056c5760008081819054906101000a900460070b8092919061049390612158565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008a73ffffffffffffffffffffffffffffffffffffffff16600f6040516104e4906121b9565b60006040518083038185875af1925050503d8060008114610521576040519150601f19603f3d011682016040523d82523d6000602084013e610526565b606091505b505090508061056a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056190612240565b60405180910390fd5b505b61080273ffffffffffffffffffffffffffffffffffffffff1663632535b98a8a8a60028b61059a919061228f565b8f8b8860006040518963ffffffff1660e01b81526004016105c29897969594939291906123bb565b6020604051808303816000875af11580156105e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610605919061247f565b5081156107035760008081819054906101000a900460070b8092919061062a90612158565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008a73ffffffffffffffffffffffffffffffffffffffff16600f60405161067b906121b9565b60006040518083038185875af1925050503d80600081146106b8576040519150601f19603f3d011682016040523d82523d6000602084013e6106bd565b606091505b5050905080610701576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106f890612240565b60405180910390fd5b505b50505050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff166354de647b308a8a8a8a8a8a8a6040518963ffffffff1660e01b815260040161075a9897969594939291906124e8565b6020604051808303816000875af1158015610779573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079d919061256b565b9050806107df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d6906125e4565b60405180910390fd5b5050505050505050565b60008054906101000a900460070b81565b600061080273ffffffffffffffffffffffffffffffffffffffff1663632535b98a8a8a8a308b8b8b8b6040518a63ffffffff1660e01b815260040161084799989796959493929190612604565b6020604051808303816000875af1158015610866573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088a919061247f565b905098975050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663632535b98a8a8a8a338b8b8b8b6040518a63ffffffff1660e01b81526004016108e599989796959493929190612604565b6020604051808303816000875af1158015610904573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610928919061247f565b905098975050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff166374a8f103306040518263ffffffff1660e01b815260040161097391906126b5565b6020604051808303816000875af1158015610992573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b6919061256b565b9050806109f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ef9061271c565b60405180910390fd5b50565b606061080273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84846040518363ffffffff1660e01b8152600401610a3a92919061273c565b600060405180830381865afa158015610a57573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610a809190612c11565b905092915050565b8115610b855760008081819054906101000a900460070b80929190610aac90612158565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008973ffffffffffffffffffffffffffffffffffffffff16600f604051610afd906121b9565b60006040518083038185875af1925050503d8060008114610b3a576040519150601f19603f3d011682016040523d82523d6000602084013e610b3f565b606091505b5050905080610b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7a90612240565b60405180910390fd5b505b60006040518060400160405280606467ffffffffffffffff168152602001606467ffffffffffffffff16815250905061080273ffffffffffffffffffffffffffffffffffffffff1663632535b9898989898e8a8860006040518963ffffffff1660e01b8152600401610bfe989796959493929190612c5a565b6020604051808303816000875af1158015610c1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c41919061247f565b508115610d3f5760008081819054906101000a900460070b80929190610c6690612158565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008a73ffffffffffffffffffffffffffffffffffffffff16600f604051610cb7906121b9565b60006040518083038185875af1925050503d8060008114610cf4576040519150601f19603f3d011682016040523d82523d6000602084013e610cf9565b606091505b5050905080610d3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3490612240565b60405180910390fd5b505b50505050505050505050565b606061080273ffffffffffffffffffffffffffffffffffffffff1663b5cb6e7d836040518263ffffffff1660e01b8152600401610d889190611db3565b600060405180830381865afa158015610da5573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610dce9190612d09565b9050919050565b6060610ddf61109e565b61080273ffffffffffffffffffffffffffffffffffffffff166322b6fad6846040518263ffffffff1660e01b8152600401610e1a9190612ece565b600060405180830381865afa158015610e37573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610e609190613166565b91509150915091565b610e716110c2565b61080273ffffffffffffffffffffffffffffffffffffffff1663a815cdd9836040518263ffffffff1660e01b8152600401610eac9190611db3565b600060405180830381865afa158015610ec9573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610ef291906131de565b9050919050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663b3f536ec308a8a8a8a8a8a8a6040518963ffffffff1660e01b8152600401610f449897969594939291906124e8565b6020604051808303816000875af1158015610f63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f87919061256b565b905080610fc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc090613273565b60405180910390fd5b5050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663473c90c73085856040518463ffffffff1660e01b815260040161101493929190613744565b6020604051808303816000875af1158015611033573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611057919061256b565b905080611099576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611090906137c2565b60405180910390fd5b505050565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b604051806040016040528060608152602001606081525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061111b826110f0565b9050919050565b61112b81611110565b811461113657600080fd5b50565b60008135905061114881611122565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6111a182611158565b810181811067ffffffffffffffff821117156111c0576111bf611169565b5b80604052505050565b60006111d36110dc565b90506111df8282611198565b919050565b600067ffffffffffffffff8211156111ff576111fe611169565b5b61120882611158565b9050602081019050919050565b82818337600083830152505050565b6000611237611232846111e4565b6111c9565b90508281526020810184848401111561125357611252611153565b5b61125e848285611215565b509392505050565b600082601f83011261127b5761127a61114e565b5b813561128b848260208601611224565b91505092915050565b6000819050919050565b6112a781611294565b81146112b257600080fd5b50565b6000813590506112c48161129e565b92915050565b60008115159050919050565b6112df816112ca565b81146112ea57600080fd5b50565b6000813590506112fc816112d6565b92915050565b60008060008060008060008060006101208a8c031215611325576113246110e6565b5b60006113338c828d01611139565b99505060208a013567ffffffffffffffff811115611354576113536110eb565b5b6113608c828d01611266565b98505060408a013567ffffffffffffffff811115611381576113806110eb565b5b61138d8c828d01611266565b97505060608a013567ffffffffffffffff8111156113ae576113ad6110eb565b5b6113ba8c828d01611266565b96505060806113cb8c828d016112b5565b95505060a08a013567ffffffffffffffff8111156113ec576113eb6110eb565b5b6113f88c828d01611266565b94505060c06114098c828d016112ed565b93505060e061141a8c828d016112ed565b92505061010061142c8c828d016112ed565b9150509295985092959850929598565b600080fd5b600080fd5b60008083601f84011261145c5761145b61114e565b5b8235905067ffffffffffffffff8111156114795761147861143c565b5b60208301915083600182028301111561149557611494611441565b5b9250929050565b60008060008060008060006080888a0312156114bb576114ba6110e6565b5b600088013567ffffffffffffffff8111156114d9576114d86110eb565b5b6114e58a828b01611446565b9750975050602088013567ffffffffffffffff811115611508576115076110eb565b5b6115148a828b01611446565b9550955050604088013567ffffffffffffffff811115611537576115366110eb565b5b6115438a828b01611446565b935093505060606115568a828b016112b5565b91505092959891949750929550565b60008160070b9050919050565b61157b81611565565b82525050565b60006020820190506115966000830184611572565b92915050565b600080fd5b600080fd5b600067ffffffffffffffff82169050919050565b6115c3816115a6565b81146115ce57600080fd5b50565b6000813590506115e0816115ba565b92915050565b6000604082840312156115fc576115fb61159c565b5b61160660406111c9565b90506000611616848285016115d1565b600083015250602061162a848285016115d1565b60208301525092915050565b600080600080600080600080610120898b031215611657576116566110e6565b5b600089013567ffffffffffffffff811115611675576116746110eb565b5b6116818b828c01611266565b985050602089013567ffffffffffffffff8111156116a2576116a16110eb565b5b6116ae8b828c01611266565b975050604089013567ffffffffffffffff8111156116cf576116ce6110eb565b5b6116db8b828c01611266565b96505060606116ec8b828c016112b5565b955050608089013567ffffffffffffffff81111561170d5761170c6110eb565b5b6117198b828c01611266565b94505060a061172a8b828c016115e6565b93505060e061173b8b828c016115d1565b92505061010089013567ffffffffffffffff81111561175d5761175c6110eb565b5b6117698b828c01611266565b9150509295985092959890939650565b611782816115a6565b82525050565b600060208201905061179d6000830184611779565b92915050565b60006117ae826110f0565b9050919050565b6117be816117a3565b81146117c957600080fd5b50565b6000813590506117db816117b5565b92915050565b600080604083850312156117f8576117f76110e6565b5b6000611806858286016117cc565b9250506020611817858286016117cc565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561188757808201518184015260208101905061186c565b60008484015250505050565b600061189e8261184d565b6118a88185611858565b93506118b8818560208601611869565b6118c181611158565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61190181611294565b82525050565b600060408301600083015184820360008601526119248282611893565b915050602083015161193960208601826118f8565b508091505092915050565b60006119508383611907565b905092915050565b6000602082019050919050565b6000611970826118cc565b61197a81856118d7565b93508360208202850161198c856118e8565b8060005b858110156119c857848403895281516119a98582611944565b94506119b483611958565b925060208a01995050600181019050611990565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000611a128383611893565b905092915050565b6000602082019050919050565b6000611a32826119da565b611a3c81856119e5565b935083602082028501611a4e856119f6565b8060005b85811015611a8a5784840389528151611a6b8582611a06565b9450611a7683611a1a565b925060208a01995050600181019050611a52565b50829750879550505050505092915050565b600060a0830160008301518482036000860152611ab98282611893565b91505060208301518482036020860152611ad38282611893565b91505060408301518482036040860152611aed8282611965565b91505060608301518482036060860152611b078282611a27565b91505060808301518482036080860152611b218282611a27565b9150508091505092915050565b6000611b3a8383611a9c565b905092915050565b6000602082019050919050565b6000611b5a82611821565b611b64818561182c565b935083602082028501611b768561183d565b8060005b85811015611bb25784840389528151611b938582611b2e565b9450611b9e83611b42565b925060208a01995050600181019050611b7a565b50829750879550505050505092915050565b60006020820190508181036000830152611bde8184611b4f565b905092915050565b60008060008060008060008060006101208a8c031215611c0957611c086110e6565b5b6000611c178c828d01611139565b9950506020611c288c828d016117cc565b98505060408a013567ffffffffffffffff811115611c4957611c486110eb565b5b611c558c828d01611266565b97505060608a013567ffffffffffffffff811115611c7657611c756110eb565b5b611c828c828d01611266565b96505060808a013567ffffffffffffffff811115611ca357611ca26110eb565b5b611caf8c828d01611266565b95505060a0611cc08c828d016112b5565b94505060c08a013567ffffffffffffffff811115611ce157611ce06110eb565b5b611ced8c828d01611266565b93505060e0611cfe8c828d016112ed565b925050610100611d108c828d016112ed565b9150509295985092959850929598565b600060208284031215611d3657611d356110e6565b5b600082013567ffffffffffffffff811115611d5457611d536110eb565b5b611d6084828501611266565b91505092915050565b600082825260208201905092915050565b6000611d858261184d565b611d8f8185611d69565b9350611d9f818560208601611869565b611da881611158565b840191505092915050565b60006020820190508181036000830152611dcd8184611d7a565b905092915050565b600080fd5b600060a08284031215611df057611def611dd5565b5b81905092915050565b600060208284031215611e0f57611e0e6110e6565b5b600082013567ffffffffffffffff811115611e2d57611e2c6110eb565b5b611e3984828501611dda565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006040830160008301518482036000860152611e8b8282611893565b91505060208301518482036020860152611ea58282611893565b9150508091505092915050565b6000611ebe8383611e6e565b905092915050565b6000602082019050919050565b6000611ede82611e42565b611ee88185611e4d565b935083602082028501611efa85611e5e565b8060005b85811015611f365784840389528151611f178582611eb2565b9450611f2283611ec6565b925060208a01995050600181019050611efe565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b6000611f6f82611f48565b611f798185611f53565b9350611f89818560208601611869565b611f9281611158565b840191505092915050565b611fa6816115a6565b82525050565b60006040830160008301518482036000860152611fc98282611f64565b9150506020830151611fde6020860182611f9d565b508091505092915050565b600060408201905081810360008301526120038185611ed3565b905081810360208301526120178184611fac565b90509392505050565b6000604083016000830151848203600086015261203d8282611893565b915050602083015184820360208601526120578282611893565b9150508091505092915050565b6000602082019050818103600083015261207e8184612020565b905092915050565b60008083601f84011261209c5761209b61114e565b5b8235905067ffffffffffffffff8111156120b9576120b861143c565b5b6020830191508360208202830111156120d5576120d4611441565b5b9250929050565b600080602083850312156120f3576120f26110e6565b5b600083013567ffffffffffffffff811115612111576121106110eb565b5b61211d85828601612086565b92509250509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061216382611565565b9150677fffffffffffffff820361217d5761217c612129565b5b600182019050919050565b600081905092915050565b50565b60006121a3600083612188565b91506121ae82612193565b600082019050919050565b60006121c482612196565b9150819050919050565b7f4661696c656420746f2073656e6420457468657220746f2064656c656761746f60008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061222a602183611d69565b9150612235826121ce565b604082019050919050565b600060208201905081810360008301526122598161221d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061229a82611294565b91506122a583611294565b9250826122b5576122b4612260565b5b828204905092915050565b6122c981611294565b82525050565b6000819050919050565b60006122f46122ef6122ea846110f0565b6122cf565b6110f0565b9050919050565b6000612306826122d9565b9050919050565b6000612318826122fb565b9050919050565b6123288161230d565b82525050565b6040820160008201516123446000850182611f9d565b5060208201516123576020850182611f9d565b50505050565b6000819050919050565b600061238261237d6123788461235d565b6122cf565b6115a6565b9050919050565b61239281612367565b82525050565b60006123a5600083611d69565b91506123b082612193565b600082019050919050565b60006101408201905081810360008301526123d6818b611d7a565b905081810360208301526123ea818a611d7a565b905081810360408301526123fe8189611d7a565b905061240d60608301886122c0565b61241a608083018761231f565b81810360a083015261242c8186611d7a565b905061243b60c083018561232e565b612449610100830184612389565b81810361012083015261245b81612398565b90509998505050505050505050565b600081519050612479816115ba565b92915050565b600060208284031215612495576124946110e6565b5b60006124a38482850161246a565b91505092915050565b6124b5816117a3565b82525050565b60006124c78385611d69565b93506124d4838584611215565b6124dd83611158565b840190509392505050565b600060a0820190506124fd600083018b6124ac565b818103602083015261251081898b6124bb565b905081810360408301526125258187896124bb565b9050818103606083015261253a8185876124bb565b905061254960808301846122c0565b9998505050505050505050565b600081519050612565816112d6565b92915050565b600060208284031215612581576125806110e6565b5b600061258f84828501612556565b91505092915050565b7f4661696c656420746f20696e63726561736520616c6c6f77616e636500000000600082015250565b60006125ce601c83611d69565b91506125d982612598565b602082019050919050565b600060208201905081810360008301526125fd816125c1565b9050919050565b600061014082019050818103600083015261261f818c611d7a565b90508181036020830152612633818b611d7a565b90508181036040830152612647818a611d7a565b905061265660608301896122c0565b61266360808301886124ac565b81810360a08301526126758187611d7a565b905061268460c083018661232e565b612692610100830185611779565b8181036101208301526126a58184611d7a565b90509a9950505050505050505050565b60006020820190506126ca60008301846124ac565b92915050565b7f4661696c656420746f207265766f6b6520617070726f76616c00000000000000600082015250565b6000612706601983611d69565b9150612711826126d0565b602082019050919050565b60006020820190508181036000830152612735816126f9565b9050919050565b600060408201905061275160008301856124ac565b61275e60208301846124ac565b9392505050565b600067ffffffffffffffff8211156127805761277f611169565b5b602082029050602081019050919050565b60006127a461279f846111e4565b6111c9565b9050828152602081018484840111156127c0576127bf611153565b5b6127cb848285611869565b509392505050565b600082601f8301126127e8576127e761114e565b5b81516127f8848260208601612791565b91505092915050565b600067ffffffffffffffff82111561281c5761281b611169565b5b602082029050602081019050919050565b60008151905061283c8161129e565b92915050565b6000604082840312156128585761285761159c565b5b61286260406111c9565b9050600082015167ffffffffffffffff811115612882576128816115a1565b5b61288e848285016127d3565b60008301525060206128a28482850161282d565b60208301525092915050565b60006128c16128bc84612801565b6111c9565b905080838252602082019050602084028301858111156128e4576128e3611441565b5b835b8181101561292b57805167ffffffffffffffff8111156129095761290861114e565b5b8086016129168982612842565b855260208501945050506020810190506128e6565b5050509392505050565b600082601f83011261294a5761294961114e565b5b815161295a8482602086016128ae565b91505092915050565b600067ffffffffffffffff82111561297e5761297d611169565b5b602082029050602081019050919050565b60006129a261299d84612963565b6111c9565b905080838252602082019050602084028301858111156129c5576129c4611441565b5b835b81811015612a0c57805167ffffffffffffffff8111156129ea576129e961114e565b5b8086016129f789826127d3565b855260208501945050506020810190506129c7565b5050509392505050565b600082601f830112612a2b57612a2a61114e565b5b8151612a3b84826020860161298f565b91505092915050565b600060a08284031215612a5a57612a5961159c565b5b612a6460a06111c9565b9050600082015167ffffffffffffffff811115612a8457612a836115a1565b5b612a90848285016127d3565b600083015250602082015167ffffffffffffffff811115612ab457612ab36115a1565b5b612ac0848285016127d3565b602083015250604082015167ffffffffffffffff811115612ae457612ae36115a1565b5b612af084828501612935565b604083015250606082015167ffffffffffffffff811115612b1457612b136115a1565b5b612b2084828501612a16565b606083015250608082015167ffffffffffffffff811115612b4457612b436115a1565b5b612b5084828501612a16565b60808301525092915050565b6000612b6f612b6a84612765565b6111c9565b90508083825260208201905060208402830185811115612b9257612b91611441565b5b835b81811015612bd957805167ffffffffffffffff811115612bb757612bb661114e565b5b808601612bc48982612a44565b85526020850194505050602081019050612b94565b5050509392505050565b600082601f830112612bf857612bf761114e565b5b8151612c08848260208601612b5c565b91505092915050565b600060208284031215612c2757612c266110e6565b5b600082015167ffffffffffffffff811115612c4557612c446110eb565b5b612c5184828501612be3565b91505092915050565b6000610140820190508181036000830152612c75818b611d7a565b90508181036020830152612c89818a611d7a565b90508181036040830152612c9d8189611d7a565b9050612cac60608301886122c0565b612cb960808301876124ac565b81810360a0830152612ccb8186611d7a565b9050612cda60c083018561232e565b612ce8610100830184612389565b818103610120830152612cfa81612398565b90509998505050505050505050565b600060208284031215612d1f57612d1e6110e6565b5b600082015167ffffffffffffffff811115612d3d57612d3c6110eb565b5b612d49848285016127d3565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612d7e57612d7d612d5c565b5b83810192508235915060208301925067ffffffffffffffff821115612da657612da5612d52565b5b600182023603831315612dbc57612dbb612d57565b5b509250929050565b6000612dd08385611f53565b9350612ddd838584611215565b612de683611158565b840190509392505050565b6000612e0060208401846115d1565b905092915050565b6000612e1760208401846112ed565b905092915050565b612e28816112ca565b82525050565b600060a08301612e416000840184612d61565b8583036000870152612e54838284612dc4565b92505050612e656020840184612df1565b612e726020860182611f9d565b50612e806040840184612df1565b612e8d6040860182611f9d565b50612e9b6060840184612e08565b612ea86060860182612e1f565b50612eb66080840184612e08565b612ec36080860182612e1f565b508091505092915050565b60006020820190508181036000830152612ee88184612e2e565b905092915050565b600067ffffffffffffffff821115612f0b57612f0a611169565b5b602082029050602081019050919050565b600060408284031215612f3257612f3161159c565b5b612f3c60406111c9565b9050600082015167ffffffffffffffff811115612f5c57612f5b6115a1565b5b612f68848285016127d3565b600083015250602082015167ffffffffffffffff811115612f8c57612f8b6115a1565b5b612f98848285016127d3565b60208301525092915050565b6000612fb7612fb284612ef0565b6111c9565b90508083825260208201905060208402830185811115612fda57612fd9611441565b5b835b8181101561302157805167ffffffffffffffff811115612fff57612ffe61114e565b5b80860161300c8982612f1c565b85526020850194505050602081019050612fdc565b5050509392505050565b600082601f8301126130405761303f61114e565b5b8151613050848260208601612fa4565b91505092915050565b600067ffffffffffffffff82111561307457613073611169565b5b61307d82611158565b9050602081019050919050565b600061309d61309884613059565b6111c9565b9050828152602081018484840111156130b9576130b8611153565b5b6130c4848285611869565b509392505050565b600082601f8301126130e1576130e061114e565b5b81516130f184826020860161308a565b91505092915050565b6000604082840312156131105761310f61159c565b5b61311a60406111c9565b9050600082015167ffffffffffffffff81111561313a576131396115a1565b5b613146848285016130cc565b600083015250602061315a8482850161246a565b60208301525092915050565b6000806040838503121561317d5761317c6110e6565b5b600083015167ffffffffffffffff81111561319b5761319a6110eb565b5b6131a78582860161302b565b925050602083015167ffffffffffffffff8111156131c8576131c76110eb565b5b6131d4858286016130fa565b9150509250929050565b6000602082840312156131f4576131f36110e6565b5b600082015167ffffffffffffffff811115613212576132116110eb565b5b61321e84828501612f1c565b91505092915050565b7f4661696c656420746f20646563726561736520616c6c6f77616e636500000000600082015250565b600061325d601c83611d69565b915061326882613227565b602082019050919050565b6000602082019050818103600083015261328c81613250565b9050919050565b6000819050919050565b600080833560016020038436030381126132ba576132b9612d5c565b5b83810192508235915060208301925067ffffffffffffffff8211156132e2576132e1612d52565b5b6001820236038313156132f8576132f7612d57565b5b509250929050565b600061330c8385611858565b9350613319838584611215565b61332283611158565b840190509392505050565b6000808335600160200384360303811261334a57613349612d5c565b5b83810192508235915060208301925067ffffffffffffffff82111561337257613371612d52565b5b60208202360383131561338857613387612d57565b5b509250929050565b6000819050919050565b60006133a960208401846112b5565b905092915050565b6000604083016133c4600084018461329d565b85830360008701526133d7838284613300565b925050506133e8602084018461339a565b6133f560208601826118f8565b508091505092915050565b600061340c83836133b1565b905092915050565b6000823560016040038336030381126134305761342f612d5c565b5b82810191505092915050565b6000602082019050919050565b600061345583856118d7565b93508360208402850161346784613390565b8060005b878110156134ab5784840389526134828284613414565b61348c8582613400565b94506134978361343c565b925060208a0199505060018101905061346b565b50829750879450505050509392505050565b600080833560016020038436030381126134da576134d9612d5c565b5b83810192508235915060208301925067ffffffffffffffff82111561350257613501612d52565b5b60208202360383131561351857613517612d57565b5b509250929050565b6000819050919050565b6000613537848484613300565b90509392505050565b6000602082019050919050565b600061355983856119e5565b93508360208402850161356b84613520565b8060005b878110156135b1578484038952613586828461329d565b61359186828461352a565b955061359c84613540565b935060208b019a50505060018101905061356f565b50829750879450505050509392505050565b600060a083016135d6600084018461329d565b85830360008701526135e9838284613300565b925050506135fa602084018461329d565b858303602087015261360d838284613300565b9250505061361e604084018461332d565b8583036040870152613631838284613449565b9250505061364260608401846134bd565b858303606087015261365583828461354d565b9250505061366660808401846134bd565b858303608087015261367983828461354d565b925050508091505092915050565b600061369383836135c3565b905092915050565b60008235600160a0038336030381126136b7576136b6612d5c565b5b82810191505092915050565b6000602082019050919050565b60006136dc838561182c565b9350836020840285016136ee84613293565b8060005b87811015613732578484038952613709828461369b565b6137138582613687565b945061371e836136c3565b925060208a019950506001810190506136f2565b50829750879450505050509392505050565b600060408201905061375960008301866124ac565b818103602083015261376c8184866136d0565b9050949350505050565b7f4661696c656420746f20706572666f726d20617070726f76616c000000000000600082015250565b60006137ac601a83611d69565b91506137b782613776565b602082019050919050565b600060208201905081810360008301526137db8161379f565b905091905056fea2646970667358221220bcb453fc471282c5300ef2cce92af3966ecb2c9f9fc8ddec271f9520efa16a1164736f6c63430008130033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063a363df841161008c578063dfa10f3911610066578063dfa10f3914610210578063ee5766d914610241578063f298e7a814610271578063f3675f081461028d576100cf565b8063a363df8414610194578063b9672879146101c4578063c595699a146101e0576100cf565b80631dba685b146100d4578063424af9f6146100f057806361bc221a1461010c5780636fdf23cc1461012a5780637492bdd81461015a5780637a6185e11461018a575b600080fd5b6100ee60048036038101906100e99190611302565b6102a9565b005b61010a6004803603810190610105919061149c565b61070f565b005b6101146107e9565b6040516101219190611581565b60405180910390f35b610144600480360381019061013f9190611636565b6107fa565b6040516101519190611788565b60405180910390f35b610174600480360381019061016f9190611636565b610898565b6040516101819190611788565b60405180910390f35b610192610936565b005b6101ae60048036038101906101a991906117e1565b6109fb565b6040516101bb9190611bc4565b60405180910390f35b6101de60048036038101906101d99190611be6565b610a88565b005b6101fa60048036038101906101f59190611d20565b610d4b565b6040516102079190611db3565b60405180910390f35b61022a60048036038101906102259190611df9565b610dd5565b604051610238929190611fe9565b60405180910390f35b61025b60048036038101906102569190611d20565b610e69565b6040516102689190612064565b60405180910390f35b61028b6004803603810190610286919061149c565b610ef9565b005b6102a760048036038101906102a291906120dc565b610fd3565b005b82156103a65760008081819054906101000a900460070b809291906102cd90612158565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008973ffffffffffffffffffffffffffffffffffffffff16600f60405161031e906121b9565b60006040518083038185875af1925050503d806000811461035b576040519150601f19603f3d011682016040523d82523d6000602084013e610360565b606091505b50509050806103a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161039b90612240565b60405180910390fd5b505b60006040518060400160405280606467ffffffffffffffff168152602001606467ffffffffffffffff16815250905061080273ffffffffffffffffffffffffffffffffffffffff1663632535b98a8a8a60028b610403919061228f565b8f8b8860006040518963ffffffff1660e01b815260040161042b9897969594939291906123bb565b6020604051808303816000875af115801561044a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046e919061247f565b50821561056c5760008081819054906101000a900460070b8092919061049390612158565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008a73ffffffffffffffffffffffffffffffffffffffff16600f6040516104e4906121b9565b60006040518083038185875af1925050503d8060008114610521576040519150601f19603f3d011682016040523d82523d6000602084013e610526565b606091505b505090508061056a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056190612240565b60405180910390fd5b505b61080273ffffffffffffffffffffffffffffffffffffffff1663632535b98a8a8a60028b61059a919061228f565b8f8b8860006040518963ffffffff1660e01b81526004016105c29897969594939291906123bb565b6020604051808303816000875af11580156105e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610605919061247f565b5081156107035760008081819054906101000a900460070b8092919061062a90612158565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008a73ffffffffffffffffffffffffffffffffffffffff16600f60405161067b906121b9565b60006040518083038185875af1925050503d80600081146106b8576040519150601f19603f3d011682016040523d82523d6000602084013e6106bd565b606091505b5050905080610701576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106f890612240565b60405180910390fd5b505b50505050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff166354de647b308a8a8a8a8a8a8a6040518963ffffffff1660e01b815260040161075a9897969594939291906124e8565b6020604051808303816000875af1158015610779573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079d919061256b565b9050806107df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d6906125e4565b60405180910390fd5b5050505050505050565b60008054906101000a900460070b81565b600061080273ffffffffffffffffffffffffffffffffffffffff1663632535b98a8a8a8a308b8b8b8b6040518a63ffffffff1660e01b815260040161084799989796959493929190612604565b6020604051808303816000875af1158015610866573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088a919061247f565b905098975050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663632535b98a8a8a8a338b8b8b8b6040518a63ffffffff1660e01b81526004016108e599989796959493929190612604565b6020604051808303816000875af1158015610904573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610928919061247f565b905098975050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff166374a8f103306040518263ffffffff1660e01b815260040161097391906126b5565b6020604051808303816000875af1158015610992573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b6919061256b565b9050806109f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ef9061271c565b60405180910390fd5b50565b606061080273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84846040518363ffffffff1660e01b8152600401610a3a92919061273c565b600060405180830381865afa158015610a57573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610a809190612c11565b905092915050565b8115610b855760008081819054906101000a900460070b80929190610aac90612158565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008973ffffffffffffffffffffffffffffffffffffffff16600f604051610afd906121b9565b60006040518083038185875af1925050503d8060008114610b3a576040519150601f19603f3d011682016040523d82523d6000602084013e610b3f565b606091505b5050905080610b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7a90612240565b60405180910390fd5b505b60006040518060400160405280606467ffffffffffffffff168152602001606467ffffffffffffffff16815250905061080273ffffffffffffffffffffffffffffffffffffffff1663632535b9898989898e8a8860006040518963ffffffff1660e01b8152600401610bfe989796959493929190612c5a565b6020604051808303816000875af1158015610c1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c41919061247f565b508115610d3f5760008081819054906101000a900460070b80929190610c6690612158565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008a73ffffffffffffffffffffffffffffffffffffffff16600f604051610cb7906121b9565b60006040518083038185875af1925050503d8060008114610cf4576040519150601f19603f3d011682016040523d82523d6000602084013e610cf9565b606091505b5050905080610d3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3490612240565b60405180910390fd5b505b50505050505050505050565b606061080273ffffffffffffffffffffffffffffffffffffffff1663b5cb6e7d836040518263ffffffff1660e01b8152600401610d889190611db3565b600060405180830381865afa158015610da5573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610dce9190612d09565b9050919050565b6060610ddf61109e565b61080273ffffffffffffffffffffffffffffffffffffffff166322b6fad6846040518263ffffffff1660e01b8152600401610e1a9190612ece565b600060405180830381865afa158015610e37573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610e609190613166565b91509150915091565b610e716110c2565b61080273ffffffffffffffffffffffffffffffffffffffff1663a815cdd9836040518263ffffffff1660e01b8152600401610eac9190611db3565b600060405180830381865afa158015610ec9573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610ef291906131de565b9050919050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663b3f536ec308a8a8a8a8a8a8a6040518963ffffffff1660e01b8152600401610f449897969594939291906124e8565b6020604051808303816000875af1158015610f63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f87919061256b565b905080610fc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc090613273565b60405180910390fd5b5050505050505050565b600061080273ffffffffffffffffffffffffffffffffffffffff1663473c90c73085856040518463ffffffff1660e01b815260040161101493929190613744565b6020604051808303816000875af1158015611033573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611057919061256b565b905080611099576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611090906137c2565b60405180910390fd5b505050565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b604051806040016040528060608152602001606081525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061111b826110f0565b9050919050565b61112b81611110565b811461113657600080fd5b50565b60008135905061114881611122565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6111a182611158565b810181811067ffffffffffffffff821117156111c0576111bf611169565b5b80604052505050565b60006111d36110dc565b90506111df8282611198565b919050565b600067ffffffffffffffff8211156111ff576111fe611169565b5b61120882611158565b9050602081019050919050565b82818337600083830152505050565b6000611237611232846111e4565b6111c9565b90508281526020810184848401111561125357611252611153565b5b61125e848285611215565b509392505050565b600082601f83011261127b5761127a61114e565b5b813561128b848260208601611224565b91505092915050565b6000819050919050565b6112a781611294565b81146112b257600080fd5b50565b6000813590506112c48161129e565b92915050565b60008115159050919050565b6112df816112ca565b81146112ea57600080fd5b50565b6000813590506112fc816112d6565b92915050565b60008060008060008060008060006101208a8c031215611325576113246110e6565b5b60006113338c828d01611139565b99505060208a013567ffffffffffffffff811115611354576113536110eb565b5b6113608c828d01611266565b98505060408a013567ffffffffffffffff811115611381576113806110eb565b5b61138d8c828d01611266565b97505060608a013567ffffffffffffffff8111156113ae576113ad6110eb565b5b6113ba8c828d01611266565b96505060806113cb8c828d016112b5565b95505060a08a013567ffffffffffffffff8111156113ec576113eb6110eb565b5b6113f88c828d01611266565b94505060c06114098c828d016112ed565b93505060e061141a8c828d016112ed565b92505061010061142c8c828d016112ed565b9150509295985092959850929598565b600080fd5b600080fd5b60008083601f84011261145c5761145b61114e565b5b8235905067ffffffffffffffff8111156114795761147861143c565b5b60208301915083600182028301111561149557611494611441565b5b9250929050565b60008060008060008060006080888a0312156114bb576114ba6110e6565b5b600088013567ffffffffffffffff8111156114d9576114d86110eb565b5b6114e58a828b01611446565b9750975050602088013567ffffffffffffffff811115611508576115076110eb565b5b6115148a828b01611446565b9550955050604088013567ffffffffffffffff811115611537576115366110eb565b5b6115438a828b01611446565b935093505060606115568a828b016112b5565b91505092959891949750929550565b60008160070b9050919050565b61157b81611565565b82525050565b60006020820190506115966000830184611572565b92915050565b600080fd5b600080fd5b600067ffffffffffffffff82169050919050565b6115c3816115a6565b81146115ce57600080fd5b50565b6000813590506115e0816115ba565b92915050565b6000604082840312156115fc576115fb61159c565b5b61160660406111c9565b90506000611616848285016115d1565b600083015250602061162a848285016115d1565b60208301525092915050565b600080600080600080600080610120898b031215611657576116566110e6565b5b600089013567ffffffffffffffff811115611675576116746110eb565b5b6116818b828c01611266565b985050602089013567ffffffffffffffff8111156116a2576116a16110eb565b5b6116ae8b828c01611266565b975050604089013567ffffffffffffffff8111156116cf576116ce6110eb565b5b6116db8b828c01611266565b96505060606116ec8b828c016112b5565b955050608089013567ffffffffffffffff81111561170d5761170c6110eb565b5b6117198b828c01611266565b94505060a061172a8b828c016115e6565b93505060e061173b8b828c016115d1565b92505061010089013567ffffffffffffffff81111561175d5761175c6110eb565b5b6117698b828c01611266565b9150509295985092959890939650565b611782816115a6565b82525050565b600060208201905061179d6000830184611779565b92915050565b60006117ae826110f0565b9050919050565b6117be816117a3565b81146117c957600080fd5b50565b6000813590506117db816117b5565b92915050565b600080604083850312156117f8576117f76110e6565b5b6000611806858286016117cc565b9250506020611817858286016117cc565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561188757808201518184015260208101905061186c565b60008484015250505050565b600061189e8261184d565b6118a88185611858565b93506118b8818560208601611869565b6118c181611158565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61190181611294565b82525050565b600060408301600083015184820360008601526119248282611893565b915050602083015161193960208601826118f8565b508091505092915050565b60006119508383611907565b905092915050565b6000602082019050919050565b6000611970826118cc565b61197a81856118d7565b93508360208202850161198c856118e8565b8060005b858110156119c857848403895281516119a98582611944565b94506119b483611958565b925060208a01995050600181019050611990565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000611a128383611893565b905092915050565b6000602082019050919050565b6000611a32826119da565b611a3c81856119e5565b935083602082028501611a4e856119f6565b8060005b85811015611a8a5784840389528151611a6b8582611a06565b9450611a7683611a1a565b925060208a01995050600181019050611a52565b50829750879550505050505092915050565b600060a0830160008301518482036000860152611ab98282611893565b91505060208301518482036020860152611ad38282611893565b91505060408301518482036040860152611aed8282611965565b91505060608301518482036060860152611b078282611a27565b91505060808301518482036080860152611b218282611a27565b9150508091505092915050565b6000611b3a8383611a9c565b905092915050565b6000602082019050919050565b6000611b5a82611821565b611b64818561182c565b935083602082028501611b768561183d565b8060005b85811015611bb25784840389528151611b938582611b2e565b9450611b9e83611b42565b925060208a01995050600181019050611b7a565b50829750879550505050505092915050565b60006020820190508181036000830152611bde8184611b4f565b905092915050565b60008060008060008060008060006101208a8c031215611c0957611c086110e6565b5b6000611c178c828d01611139565b9950506020611c288c828d016117cc565b98505060408a013567ffffffffffffffff811115611c4957611c486110eb565b5b611c558c828d01611266565b97505060608a013567ffffffffffffffff811115611c7657611c756110eb565b5b611c828c828d01611266565b96505060808a013567ffffffffffffffff811115611ca357611ca26110eb565b5b611caf8c828d01611266565b95505060a0611cc08c828d016112b5565b94505060c08a013567ffffffffffffffff811115611ce157611ce06110eb565b5b611ced8c828d01611266565b93505060e0611cfe8c828d016112ed565b925050610100611d108c828d016112ed565b9150509295985092959850929598565b600060208284031215611d3657611d356110e6565b5b600082013567ffffffffffffffff811115611d5457611d536110eb565b5b611d6084828501611266565b91505092915050565b600082825260208201905092915050565b6000611d858261184d565b611d8f8185611d69565b9350611d9f818560208601611869565b611da881611158565b840191505092915050565b60006020820190508181036000830152611dcd8184611d7a565b905092915050565b600080fd5b600060a08284031215611df057611def611dd5565b5b81905092915050565b600060208284031215611e0f57611e0e6110e6565b5b600082013567ffffffffffffffff811115611e2d57611e2c6110eb565b5b611e3984828501611dda565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006040830160008301518482036000860152611e8b8282611893565b91505060208301518482036020860152611ea58282611893565b9150508091505092915050565b6000611ebe8383611e6e565b905092915050565b6000602082019050919050565b6000611ede82611e42565b611ee88185611e4d565b935083602082028501611efa85611e5e565b8060005b85811015611f365784840389528151611f178582611eb2565b9450611f2283611ec6565b925060208a01995050600181019050611efe565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b6000611f6f82611f48565b611f798185611f53565b9350611f89818560208601611869565b611f9281611158565b840191505092915050565b611fa6816115a6565b82525050565b60006040830160008301518482036000860152611fc98282611f64565b9150506020830151611fde6020860182611f9d565b508091505092915050565b600060408201905081810360008301526120038185611ed3565b905081810360208301526120178184611fac565b90509392505050565b6000604083016000830151848203600086015261203d8282611893565b915050602083015184820360208601526120578282611893565b9150508091505092915050565b6000602082019050818103600083015261207e8184612020565b905092915050565b60008083601f84011261209c5761209b61114e565b5b8235905067ffffffffffffffff8111156120b9576120b861143c565b5b6020830191508360208202830111156120d5576120d4611441565b5b9250929050565b600080602083850312156120f3576120f26110e6565b5b600083013567ffffffffffffffff811115612111576121106110eb565b5b61211d85828601612086565b92509250509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061216382611565565b9150677fffffffffffffff820361217d5761217c612129565b5b600182019050919050565b600081905092915050565b50565b60006121a3600083612188565b91506121ae82612193565b600082019050919050565b60006121c482612196565b9150819050919050565b7f4661696c656420746f2073656e6420457468657220746f2064656c656761746f60008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061222a602183611d69565b9150612235826121ce565b604082019050919050565b600060208201905081810360008301526122598161221d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061229a82611294565b91506122a583611294565b9250826122b5576122b4612260565b5b828204905092915050565b6122c981611294565b82525050565b6000819050919050565b60006122f46122ef6122ea846110f0565b6122cf565b6110f0565b9050919050565b6000612306826122d9565b9050919050565b6000612318826122fb565b9050919050565b6123288161230d565b82525050565b6040820160008201516123446000850182611f9d565b5060208201516123576020850182611f9d565b50505050565b6000819050919050565b600061238261237d6123788461235d565b6122cf565b6115a6565b9050919050565b61239281612367565b82525050565b60006123a5600083611d69565b91506123b082612193565b600082019050919050565b60006101408201905081810360008301526123d6818b611d7a565b905081810360208301526123ea818a611d7a565b905081810360408301526123fe8189611d7a565b905061240d60608301886122c0565b61241a608083018761231f565b81810360a083015261242c8186611d7a565b905061243b60c083018561232e565b612449610100830184612389565b81810361012083015261245b81612398565b90509998505050505050505050565b600081519050612479816115ba565b92915050565b600060208284031215612495576124946110e6565b5b60006124a38482850161246a565b91505092915050565b6124b5816117a3565b82525050565b60006124c78385611d69565b93506124d4838584611215565b6124dd83611158565b840190509392505050565b600060a0820190506124fd600083018b6124ac565b818103602083015261251081898b6124bb565b905081810360408301526125258187896124bb565b9050818103606083015261253a8185876124bb565b905061254960808301846122c0565b9998505050505050505050565b600081519050612565816112d6565b92915050565b600060208284031215612581576125806110e6565b5b600061258f84828501612556565b91505092915050565b7f4661696c656420746f20696e63726561736520616c6c6f77616e636500000000600082015250565b60006125ce601c83611d69565b91506125d982612598565b602082019050919050565b600060208201905081810360008301526125fd816125c1565b9050919050565b600061014082019050818103600083015261261f818c611d7a565b90508181036020830152612633818b611d7a565b90508181036040830152612647818a611d7a565b905061265660608301896122c0565b61266360808301886124ac565b81810360a08301526126758187611d7a565b905061268460c083018661232e565b612692610100830185611779565b8181036101208301526126a58184611d7a565b90509a9950505050505050505050565b60006020820190506126ca60008301846124ac565b92915050565b7f4661696c656420746f207265766f6b6520617070726f76616c00000000000000600082015250565b6000612706601983611d69565b9150612711826126d0565b602082019050919050565b60006020820190508181036000830152612735816126f9565b9050919050565b600060408201905061275160008301856124ac565b61275e60208301846124ac565b9392505050565b600067ffffffffffffffff8211156127805761277f611169565b5b602082029050602081019050919050565b60006127a461279f846111e4565b6111c9565b9050828152602081018484840111156127c0576127bf611153565b5b6127cb848285611869565b509392505050565b600082601f8301126127e8576127e761114e565b5b81516127f8848260208601612791565b91505092915050565b600067ffffffffffffffff82111561281c5761281b611169565b5b602082029050602081019050919050565b60008151905061283c8161129e565b92915050565b6000604082840312156128585761285761159c565b5b61286260406111c9565b9050600082015167ffffffffffffffff811115612882576128816115a1565b5b61288e848285016127d3565b60008301525060206128a28482850161282d565b60208301525092915050565b60006128c16128bc84612801565b6111c9565b905080838252602082019050602084028301858111156128e4576128e3611441565b5b835b8181101561292b57805167ffffffffffffffff8111156129095761290861114e565b5b8086016129168982612842565b855260208501945050506020810190506128e6565b5050509392505050565b600082601f83011261294a5761294961114e565b5b815161295a8482602086016128ae565b91505092915050565b600067ffffffffffffffff82111561297e5761297d611169565b5b602082029050602081019050919050565b60006129a261299d84612963565b6111c9565b905080838252602082019050602084028301858111156129c5576129c4611441565b5b835b81811015612a0c57805167ffffffffffffffff8111156129ea576129e961114e565b5b8086016129f789826127d3565b855260208501945050506020810190506129c7565b5050509392505050565b600082601f830112612a2b57612a2a61114e565b5b8151612a3b84826020860161298f565b91505092915050565b600060a08284031215612a5a57612a5961159c565b5b612a6460a06111c9565b9050600082015167ffffffffffffffff811115612a8457612a836115a1565b5b612a90848285016127d3565b600083015250602082015167ffffffffffffffff811115612ab457612ab36115a1565b5b612ac0848285016127d3565b602083015250604082015167ffffffffffffffff811115612ae457612ae36115a1565b5b612af084828501612935565b604083015250606082015167ffffffffffffffff811115612b1457612b136115a1565b5b612b2084828501612a16565b606083015250608082015167ffffffffffffffff811115612b4457612b436115a1565b5b612b5084828501612a16565b60808301525092915050565b6000612b6f612b6a84612765565b6111c9565b90508083825260208201905060208402830185811115612b9257612b91611441565b5b835b81811015612bd957805167ffffffffffffffff811115612bb757612bb661114e565b5b808601612bc48982612a44565b85526020850194505050602081019050612b94565b5050509392505050565b600082601f830112612bf857612bf761114e565b5b8151612c08848260208601612b5c565b91505092915050565b600060208284031215612c2757612c266110e6565b5b600082015167ffffffffffffffff811115612c4557612c446110eb565b5b612c5184828501612be3565b91505092915050565b6000610140820190508181036000830152612c75818b611d7a565b90508181036020830152612c89818a611d7a565b90508181036040830152612c9d8189611d7a565b9050612cac60608301886122c0565b612cb960808301876124ac565b81810360a0830152612ccb8186611d7a565b9050612cda60c083018561232e565b612ce8610100830184612389565b818103610120830152612cfa81612398565b90509998505050505050505050565b600060208284031215612d1f57612d1e6110e6565b5b600082015167ffffffffffffffff811115612d3d57612d3c6110eb565b5b612d49848285016127d3565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612d7e57612d7d612d5c565b5b83810192508235915060208301925067ffffffffffffffff821115612da657612da5612d52565b5b600182023603831315612dbc57612dbb612d57565b5b509250929050565b6000612dd08385611f53565b9350612ddd838584611215565b612de683611158565b840190509392505050565b6000612e0060208401846115d1565b905092915050565b6000612e1760208401846112ed565b905092915050565b612e28816112ca565b82525050565b600060a08301612e416000840184612d61565b8583036000870152612e54838284612dc4565b92505050612e656020840184612df1565b612e726020860182611f9d565b50612e806040840184612df1565b612e8d6040860182611f9d565b50612e9b6060840184612e08565b612ea86060860182612e1f565b50612eb66080840184612e08565b612ec36080860182612e1f565b508091505092915050565b60006020820190508181036000830152612ee88184612e2e565b905092915050565b600067ffffffffffffffff821115612f0b57612f0a611169565b5b602082029050602081019050919050565b600060408284031215612f3257612f3161159c565b5b612f3c60406111c9565b9050600082015167ffffffffffffffff811115612f5c57612f5b6115a1565b5b612f68848285016127d3565b600083015250602082015167ffffffffffffffff811115612f8c57612f8b6115a1565b5b612f98848285016127d3565b60208301525092915050565b6000612fb7612fb284612ef0565b6111c9565b90508083825260208201905060208402830185811115612fda57612fd9611441565b5b835b8181101561302157805167ffffffffffffffff811115612fff57612ffe61114e565b5b80860161300c8982612f1c565b85526020850194505050602081019050612fdc565b5050509392505050565b600082601f8301126130405761303f61114e565b5b8151613050848260208601612fa4565b91505092915050565b600067ffffffffffffffff82111561307457613073611169565b5b61307d82611158565b9050602081019050919050565b600061309d61309884613059565b6111c9565b9050828152602081018484840111156130b9576130b8611153565b5b6130c4848285611869565b509392505050565b600082601f8301126130e1576130e061114e565b5b81516130f184826020860161308a565b91505092915050565b6000604082840312156131105761310f61159c565b5b61311a60406111c9565b9050600082015167ffffffffffffffff81111561313a576131396115a1565b5b613146848285016130cc565b600083015250602061315a8482850161246a565b60208301525092915050565b6000806040838503121561317d5761317c6110e6565b5b600083015167ffffffffffffffff81111561319b5761319a6110eb565b5b6131a78582860161302b565b925050602083015167ffffffffffffffff8111156131c8576131c76110eb565b5b6131d4858286016130fa565b9150509250929050565b6000602082840312156131f4576131f36110e6565b5b600082015167ffffffffffffffff811115613212576132116110eb565b5b61321e84828501612f1c565b91505092915050565b7f4661696c656420746f20646563726561736520616c6c6f77616e636500000000600082015250565b600061325d601c83611d69565b915061326882613227565b602082019050919050565b6000602082019050818103600083015261328c81613250565b9050919050565b6000819050919050565b600080833560016020038436030381126132ba576132b9612d5c565b5b83810192508235915060208301925067ffffffffffffffff8211156132e2576132e1612d52565b5b6001820236038313156132f8576132f7612d57565b5b509250929050565b600061330c8385611858565b9350613319838584611215565b61332283611158565b840190509392505050565b6000808335600160200384360303811261334a57613349612d5c565b5b83810192508235915060208301925067ffffffffffffffff82111561337257613371612d52565b5b60208202360383131561338857613387612d57565b5b509250929050565b6000819050919050565b60006133a960208401846112b5565b905092915050565b6000604083016133c4600084018461329d565b85830360008701526133d7838284613300565b925050506133e8602084018461339a565b6133f560208601826118f8565b508091505092915050565b600061340c83836133b1565b905092915050565b6000823560016040038336030381126134305761342f612d5c565b5b82810191505092915050565b6000602082019050919050565b600061345583856118d7565b93508360208402850161346784613390565b8060005b878110156134ab5784840389526134828284613414565b61348c8582613400565b94506134978361343c565b925060208a0199505060018101905061346b565b50829750879450505050509392505050565b600080833560016020038436030381126134da576134d9612d5c565b5b83810192508235915060208301925067ffffffffffffffff82111561350257613501612d52565b5b60208202360383131561351857613517612d57565b5b509250929050565b6000819050919050565b6000613537848484613300565b90509392505050565b6000602082019050919050565b600061355983856119e5565b93508360208402850161356b84613520565b8060005b878110156135b1578484038952613586828461329d565b61359186828461352a565b955061359c84613540565b935060208b019a50505060018101905061356f565b50829750879450505050509392505050565b600060a083016135d6600084018461329d565b85830360008701526135e9838284613300565b925050506135fa602084018461329d565b858303602087015261360d838284613300565b9250505061361e604084018461332d565b8583036040870152613631838284613449565b9250505061364260608401846134bd565b858303606087015261365583828461354d565b9250505061366660808401846134bd565b858303608087015261367983828461354d565b925050508091505092915050565b600061369383836135c3565b905092915050565b60008235600160a0038336030381126136b7576136b6612d5c565b5b82810191505092915050565b6000602082019050919050565b60006136dc838561182c565b9350836020840285016136ee84613293565b8060005b87811015613732578484038952613709828461369b565b6137138582613687565b945061371e836136c3565b925060208a019950506001810190506136f2565b50829750879450505050509392505050565b600060408201905061375960008301866124ac565b818103602083015261376c8184866136d0565b9050949350505050565b7f4661696c656420746f20706572666f726d20617070726f76616c000000000000600082015250565b60006137ac601a83611d69565b91506137b782613776565b602082019050919050565b600060208201905081810360008301526137db8161379f565b905091905056fea2646970667358221220bcb453fc471282c5300ef2cce92af3966ecb2c9f9fc8ddec271f9520efa16a1164736f6c63430008130033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/precompiles/testutil/contracts/InterchainSender.sol b/precompiles/testutil/contracts/InterchainSender.sol index 49674078dd..f71f4f33c1 100644 --- a/precompiles/testutil/contracts/InterchainSender.sol +++ b/precompiles/testutil/contracts/InterchainSender.sol @@ -5,6 +5,7 @@ import "./../../ics20/ICS20I.sol"; import "./../../common/Types.sol"; contract InterchainSender { + int64 public counter; /// @dev Approves the required spend limits for IBC transactions. /// @dev This creates a Cosmos Authorization Grants for the given methods. /// @dev This emits an Approval event. @@ -109,6 +110,94 @@ contract InterchainSender { ); } + + function testMultiTransferWithInternalTransfer( + address payable _source, + string memory sourcePort, + string memory sourceChannel, + string memory denom, + uint256 amount, + string memory receiver, + bool _before, + bool _between, + bool _after + ) public { + if (_before) { + counter++; + (bool sent, ) = _source.call{value: 15}(""); + require(sent, "Failed to send Ether to delegator"); + } + Height memory timeoutHeight = Height(100, 100); + ICS20_CONTRACT.transfer( + sourcePort, + sourceChannel, + denom, + amount / 2, + _source, + receiver, + timeoutHeight, + 0, + "" + ); + if (_between) { + counter++; + (bool sent, ) = _source.call{value: 15}(""); + require(sent, "Failed to send Ether to delegator"); + } + ICS20_CONTRACT.transfer( + sourcePort, + sourceChannel, + denom, + amount / 2, + _source, + receiver, + timeoutHeight, + 0, + "" + ); + if (_after) { + counter++; + (bool sent, ) = _source.call{value: 15}(""); + require(sent, "Failed to send Ether to delegator"); + } + } + + + function testTransferFundsWithTransferToOtherAcc( + address payable _otherAcc, + address _source, + string memory sourcePort, + string memory sourceChannel, + string memory denom, + uint256 amount, + string memory receiver, + bool _before, + bool _after + ) public { + if (_before) { + counter++; + (bool sent, ) = _otherAcc.call{value: 15}(""); + require(sent, "Failed to send Ether to delegator"); + } + Height memory timeoutHeight = Height(100, 100); + ICS20_CONTRACT.transfer( + sourcePort, + sourceChannel, + denom, + amount, + _source, + receiver, + timeoutHeight, + 0, + "" + ); + if (_after) { + counter++; + (bool sent, ) = _otherAcc.call{value: 15}(""); + require(sent, "Failed to send Ether to delegator"); + } + } + // QUERIES function testDenomTraces( PageRequest calldata pageRequest diff --git a/precompiles/testutil/contracts/InterchainSenderCaller.json b/precompiles/testutil/contracts/InterchainSenderCaller.json new file mode 100644 index 0000000000..83b75ba843 --- /dev/null +++ b/precompiles/testutil/contracts/InterchainSenderCaller.json @@ -0,0 +1,187 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "InterchainSenderCaller", + "sourceName": "solidity/precompiles/testutil/contracts/InterchainSenderCaller.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_interchainSender", + "type": "address" + } + ], + "stateMutability": "payable", + "type": "constructor" + }, + { + "inputs": [], + "name": "counter", + "outputs": [ + { + "internalType": "int64", + "name": "", + "type": "int64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "_source", + "type": "address" + }, + { + "internalType": "string", + "name": "sourcePort", + "type": "string" + }, + { + "internalType": "string", + "name": "sourceChannel", + "type": "string" + }, + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "string", + "name": "receiver", + "type": "string" + } + ], + "name": "performMultiTransferWithRevert", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "_source", + "type": "address" + }, + { + "internalType": "string", + "name": "sourcePort", + "type": "string" + }, + { + "internalType": "string", + "name": "sourceChannel", + "type": "string" + }, + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "string", + "name": "receiver", + "type": "string" + } + ], + "name": "performNestedTransfers", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "_source", + "type": "address" + }, + { + "internalType": "string", + "name": "sourcePort", + "type": "string" + }, + { + "internalType": "string", + "name": "sourceChannel", + "type": "string" + }, + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "string", + "name": "receiver", + "type": "string" + } + ], + "name": "transfersWithNestedRevert", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "_source", + "type": "address" + }, + { + "internalType": "string", + "name": "sourcePort", + "type": "string" + }, + { + "internalType": "string", + "name": "sourceChannel", + "type": "string" + }, + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "string", + "name": "receiver", + "type": "string" + } + ], + "name": "transfersWithRevert", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6080604052604051610c04380380610c04833981810160405281019061002591906100cf565b80600060086101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506100fc565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061009c82610071565b9050919050565b6100ac81610091565b81146100b757600080fd5b50565b6000815190506100c9816100a3565b92915050565b6000602082840312156100e5576100e461006c565b5b60006100f3848285016100ba565b91505092915050565b610af98061010b6000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063073989ff1461005c578063427c1cb61461007857806361bc221a1461009457806369a98b2b146100b2578063ec3c5a14146100ce575b600080fd5b61007660048036038101906100719190610752565b6100ea565b005b610092600480360381019061008d9190610752565b6101f1565b005b61009c61030d565b6040516100a9919061086b565b60405180910390f35b6100cc60048036038101906100c79190610752565b61031e565b005b6100e860048036038101906100e39190610752565b6104c4565b005b60008081819054906101000a900460070b80929190610108906108b5565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff160217905550503073ffffffffffffffffffffffffffffffffffffffff1663427c1cb68787878787876040518763ffffffff1660e01b815260040161017596959493929190610982565b600060405180830381600087803b15801561018f57600080fd5b505af19250505080156101a0575060015b5060008081819054906101000a900460070b809291906101bf906108b5565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff16021790555050505050505050565b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631dba685b87878787878760018060016040518a63ffffffff1660e01b815260040161025e99989796959493929190610a1a565b600060405180830381600087803b15801561027857600080fd5b505af115801561028c573d6000803e3d6000fd5b505050503073ffffffffffffffffffffffffffffffffffffffff1663ec3c5a148787878787876040518763ffffffff1660e01b81526004016102d396959493929190610982565b600060405180830381600087803b1580156102ed57600080fd5b505af1158015610301573d6000803e3d6000fd5b50505050505050505050565b60008054906101000a900460070b81565b60008081819054906101000a900460070b8092919061033c906108b5565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff16021790555050600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631dba685b87878787878760018060016040518a63ffffffff1660e01b81526004016103d399989796959493929190610a1a565b600060405180830381600087803b1580156103ed57600080fd5b505af1158015610401573d6000803e3d6000fd5b505050503073ffffffffffffffffffffffffffffffffffffffff1663ec3c5a148787878787876040518763ffffffff1660e01b815260040161044896959493929190610982565b600060405180830381600087803b15801561046257600080fd5b505af1925050508015610473575060015b5060008081819054906101000a900460070b80929190610492906108b5565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff16021790555050505050505050565b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631dba685b87878787878760018060016040518a63ffffffff1660e01b815260040161053199989796959493929190610a1a565b600060405180830381600087803b15801561054b57600080fd5b505af115801561055f573d6000803e3d6000fd5b600080fd5b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006105a382610578565b9050919050565b6105b381610598565b81146105be57600080fd5b50565b6000813590506105d0816105aa565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610629826105e0565b810181811067ffffffffffffffff82111715610648576106476105f1565b5b80604052505050565b600061065b610564565b90506106678282610620565b919050565b600067ffffffffffffffff821115610687576106866105f1565b5b610690826105e0565b9050602081019050919050565b82818337600083830152505050565b60006106bf6106ba8461066c565b610651565b9050828152602081018484840111156106db576106da6105db565b5b6106e684828561069d565b509392505050565b600082601f830112610703576107026105d6565b5b81356107138482602086016106ac565b91505092915050565b6000819050919050565b61072f8161071c565b811461073a57600080fd5b50565b60008135905061074c81610726565b92915050565b60008060008060008060c0878903121561076f5761076e61056e565b5b600061077d89828a016105c1565b965050602087013567ffffffffffffffff81111561079e5761079d610573565b5b6107aa89828a016106ee565b955050604087013567ffffffffffffffff8111156107cb576107ca610573565b5b6107d789828a016106ee565b945050606087013567ffffffffffffffff8111156107f8576107f7610573565b5b61080489828a016106ee565b935050608061081589828a0161073d565b92505060a087013567ffffffffffffffff81111561083657610835610573565b5b61084289828a016106ee565b9150509295509295509295565b60008160070b9050919050565b6108658161084f565b82525050565b6000602082019050610880600083018461085c565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006108c08261084f565b9150677fffffffffffffff82036108da576108d9610886565b5b600182019050919050565b6108ee81610598565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561092e578082015181840152602081019050610913565b60008484015250505050565b6000610945826108f4565b61094f81856108ff565b935061095f818560208601610910565b610968816105e0565b840191505092915050565b61097c8161071c565b82525050565b600060c08201905061099760008301896108e5565b81810360208301526109a9818861093a565b905081810360408301526109bd818761093a565b905081810360608301526109d1818661093a565b90506109e06080830185610973565b81810360a08301526109f2818461093a565b9050979650505050505050565b60008115159050919050565b610a14816109ff565b82525050565b600061012082019050610a30600083018c6108e5565b8181036020830152610a42818b61093a565b90508181036040830152610a56818a61093a565b90508181036060830152610a6a818961093a565b9050610a796080830188610973565b81810360a0830152610a8b818761093a565b9050610a9a60c0830186610a0b565b610aa760e0830185610a0b565b610ab5610100830184610a0b565b9a995050505050505050505056fea26469706673582212204a432452bb0bd915f708a0a4612563309d280b35f9edfe9f1f0be2ed5db8033464736f6c63430008130033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100575760003560e01c8063073989ff1461005c578063427c1cb61461007857806361bc221a1461009457806369a98b2b146100b2578063ec3c5a14146100ce575b600080fd5b61007660048036038101906100719190610752565b6100ea565b005b610092600480360381019061008d9190610752565b6101f1565b005b61009c61030d565b6040516100a9919061086b565b60405180910390f35b6100cc60048036038101906100c79190610752565b61031e565b005b6100e860048036038101906100e39190610752565b6104c4565b005b60008081819054906101000a900460070b80929190610108906108b5565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff160217905550503073ffffffffffffffffffffffffffffffffffffffff1663427c1cb68787878787876040518763ffffffff1660e01b815260040161017596959493929190610982565b600060405180830381600087803b15801561018f57600080fd5b505af19250505080156101a0575060015b5060008081819054906101000a900460070b809291906101bf906108b5565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff16021790555050505050505050565b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631dba685b87878787878760018060016040518a63ffffffff1660e01b815260040161025e99989796959493929190610a1a565b600060405180830381600087803b15801561027857600080fd5b505af115801561028c573d6000803e3d6000fd5b505050503073ffffffffffffffffffffffffffffffffffffffff1663ec3c5a148787878787876040518763ffffffff1660e01b81526004016102d396959493929190610982565b600060405180830381600087803b1580156102ed57600080fd5b505af1158015610301573d6000803e3d6000fd5b50505050505050505050565b60008054906101000a900460070b81565b60008081819054906101000a900460070b8092919061033c906108b5565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff16021790555050600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631dba685b87878787878760018060016040518a63ffffffff1660e01b81526004016103d399989796959493929190610a1a565b600060405180830381600087803b1580156103ed57600080fd5b505af1158015610401573d6000803e3d6000fd5b505050503073ffffffffffffffffffffffffffffffffffffffff1663ec3c5a148787878787876040518763ffffffff1660e01b815260040161044896959493929190610982565b600060405180830381600087803b15801561046257600080fd5b505af1925050508015610473575060015b5060008081819054906101000a900460070b80929190610492906108b5565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff16021790555050505050505050565b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631dba685b87878787878760018060016040518a63ffffffff1660e01b815260040161053199989796959493929190610a1a565b600060405180830381600087803b15801561054b57600080fd5b505af115801561055f573d6000803e3d6000fd5b600080fd5b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006105a382610578565b9050919050565b6105b381610598565b81146105be57600080fd5b50565b6000813590506105d0816105aa565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610629826105e0565b810181811067ffffffffffffffff82111715610648576106476105f1565b5b80604052505050565b600061065b610564565b90506106678282610620565b919050565b600067ffffffffffffffff821115610687576106866105f1565b5b610690826105e0565b9050602081019050919050565b82818337600083830152505050565b60006106bf6106ba8461066c565b610651565b9050828152602081018484840111156106db576106da6105db565b5b6106e684828561069d565b509392505050565b600082601f830112610703576107026105d6565b5b81356107138482602086016106ac565b91505092915050565b6000819050919050565b61072f8161071c565b811461073a57600080fd5b50565b60008135905061074c81610726565b92915050565b60008060008060008060c0878903121561076f5761076e61056e565b5b600061077d89828a016105c1565b965050602087013567ffffffffffffffff81111561079e5761079d610573565b5b6107aa89828a016106ee565b955050604087013567ffffffffffffffff8111156107cb576107ca610573565b5b6107d789828a016106ee565b945050606087013567ffffffffffffffff8111156107f8576107f7610573565b5b61080489828a016106ee565b935050608061081589828a0161073d565b92505060a087013567ffffffffffffffff81111561083657610835610573565b5b61084289828a016106ee565b9150509295509295509295565b60008160070b9050919050565b6108658161084f565b82525050565b6000602082019050610880600083018461085c565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006108c08261084f565b9150677fffffffffffffff82036108da576108d9610886565b5b600182019050919050565b6108ee81610598565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561092e578082015181840152602081019050610913565b60008484015250505050565b6000610945826108f4565b61094f81856108ff565b935061095f818560208601610910565b610968816105e0565b840191505092915050565b61097c8161071c565b82525050565b600060c08201905061099760008301896108e5565b81810360208301526109a9818861093a565b905081810360408301526109bd818761093a565b905081810360608301526109d1818661093a565b90506109e06080830185610973565b81810360a08301526109f2818461093a565b9050979650505050505050565b60008115159050919050565b610a14816109ff565b82525050565b600061012082019050610a30600083018c6108e5565b8181036020830152610a42818b61093a565b90508181036040830152610a56818a61093a565b90508181036060830152610a6a818961093a565b9050610a796080830188610973565b81810360a0830152610a8b818761093a565b9050610a9a60c0830186610a0b565b610aa760e0830185610a0b565b610ab5610100830184610a0b565b9a995050505050505050505056fea26469706673582212204a432452bb0bd915f708a0a4612563309d280b35f9edfe9f1f0be2ed5db8033464736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/precompiles/testutil/contracts/InterchainSenderCaller.sol b/precompiles/testutil/contracts/InterchainSenderCaller.sol new file mode 100644 index 0000000000..c907dd31dc --- /dev/null +++ b/precompiles/testutil/contracts/InterchainSenderCaller.sol @@ -0,0 +1,130 @@ +// SPDX-License-Identifier: LGPL-v3 +pragma solidity >=0.8.17; + +import "./InterchainSender.sol"; +import "./../../ics20/ICS20I.sol"; +import "./../../common/Types.sol"; + +contract InterchainSenderCaller { + int64 public counter; + InterchainSender interchainSender; + + constructor(address _interchainSender) payable { + interchainSender = InterchainSender(_interchainSender); + } + + /// @dev This function will perform 2 calls to the testMultiTransferWithInternalTransfer + /// @dev function of the InterchainSender contract + /// @dev However, the second call will be reverted, + /// @dev so in total should perform 2 IBC transfers + function transfersWithRevert( + address payable _source, + string memory sourcePort, + string memory sourceChannel, + string memory denom, + uint256 amount, + string memory receiver + ) external { + counter++; + interchainSender.testMultiTransferWithInternalTransfer( + _source, + sourcePort, + sourceChannel, + denom, + amount, + receiver, + true, + true, + true + ); + try + InterchainSenderCaller(address(this)) + .performMultiTransferWithRevert( + _source, + sourcePort, + sourceChannel, + denom, + amount, + receiver + ) + {} catch {} + counter++; + } + + /// @dev This function will perform 2 calls to the testMultiTransferWithInternalTransfer + /// @dev function of the InterchainSender contract + /// @dev However, the second call will be reverted, + /// @dev and this should revert all 4 IBC transfers + function transfersWithNestedRevert( + address payable _source, + string memory sourcePort, + string memory sourceChannel, + string memory denom, + uint256 amount, + string memory receiver + ) external { + counter++; + try + InterchainSenderCaller(address(this)).performNestedTransfers( + _source, + sourcePort, + sourceChannel, + denom, + amount, + receiver + ) + {} catch {} + counter++; + } + + function performNestedTransfers( + address payable _source, + string memory sourcePort, + string memory sourceChannel, + string memory denom, + uint256 amount, + string memory receiver + ) external { + interchainSender.testMultiTransferWithInternalTransfer( + _source, + sourcePort, + sourceChannel, + denom, + amount, + receiver, + true, + true, + true + ); + InterchainSenderCaller(address(this)).performMultiTransferWithRevert( + _source, + sourcePort, + sourceChannel, + denom, + amount, + receiver + ); + } + + function performMultiTransferWithRevert( + address payable _source, + string memory sourcePort, + string memory sourceChannel, + string memory denom, + uint256 amount, + string memory receiver + ) external { + interchainSender.testMultiTransferWithInternalTransfer( + _source, + sourcePort, + sourceChannel, + denom, + amount, + receiver, + true, + true, + true + ); + revert(); + } +} diff --git a/precompiles/testutil/contracts/Reverter.json b/precompiles/testutil/contracts/Reverter.json new file mode 100644 index 0000000000..96e6c92ccb --- /dev/null +++ b/precompiles/testutil/contracts/Reverter.json @@ -0,0 +1,45 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Reverter", + "sourceName": "solidity/precompiles/testutil/contracts/Reverter.sol", + "abi": [ + { + "inputs": [], + "stateMutability": "payable", + "type": "constructor" + }, + { + "inputs": [], + "name": "run", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "v", + "type": "uint256" + } + ], + "name": "transferFunds", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "bytecode": "0x608060405260008055610c17806100176000396000f3fe60806040526004361061002d5760003560e01c806379388e9414610039578063c04062261461006257610034565b3661003457005b600080fd5b34801561004557600080fd5b50610060600480360381019061005b9190610360565b610079565b005b34801561006e57600080fd5b50610077610131565b005b808290604051610088906102d4565b82906040518091039083f590509050801580156100a9573d6000803e3d6000fd5b505061080173ffffffffffffffffffffffffffffffffffffffff166354be1a28306040518263ffffffff1660e01b81526004016100e691906103e1565b600060405180830381865afa158015610103573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061012c9190610884565b600080fd5b6000808154809291906101439061092b565b91905055503073ffffffffffffffffffffffffffffffffffffffff166379388e9460005460001b476040518363ffffffff1660e01b8152600401610188929190610991565b600060405180830381600087803b1580156101a257600080fd5b505af19250505080156101b3575060015b61022f5760006101c760005460001b610249565b90508073ffffffffffffffffffffffffffffffffffffffff16633ccfd60b6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561021157600080fd5b505af1158015610225573d6000803e3d6000fd5b5050505050610230565b5b6000808154809291906102429061092b565b9190505550565b60008060ff60f81b308460405180602001610263906102d4565b6020820181038252601f19601f820116604052506040516020016102879190610a01565b604051602081830303815290604052805190602001206040516020016102b09493929190610ace565b6040516020818303038152906040528051906020012060001c905080915050919050565b60c580610b1d83390190565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b610307816102f4565b811461031257600080fd5b50565b600081359050610324816102fe565b92915050565b6000819050919050565b61033d8161032a565b811461034857600080fd5b50565b60008135905061035a81610334565b92915050565b60008060408385031215610377576103766102ea565b5b600061038585828601610315565b92505060206103968582860161034b565b9150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103cb826103a0565b9050919050565b6103db816103c0565b82525050565b60006020820190506103f660008301846103d2565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61044a82610401565b810181811067ffffffffffffffff8211171561046957610468610412565b5b80604052505050565b600061047c6102e0565b90506104888282610441565b919050565b600067ffffffffffffffff8211156104a8576104a7610412565b5b602082029050602081019050919050565b600080fd5b600080fd5b600080fd5b600080fd5b600067ffffffffffffffff8211156104e8576104e7610412565b5b6104f182610401565b9050602081019050919050565b60005b8381101561051c578082015181840152602081019050610501565b60008484015250505050565b600061053b610536846104cd565b610472565b905082815260208101848484011115610557576105566104c8565b5b6105628482856104fe565b509392505050565b600082601f83011261057f5761057e6103fc565b5b815161058f848260208601610528565b91505092915050565b600067ffffffffffffffff8211156105b3576105b2610412565b5b602082029050602081019050919050565b6000815190506105d381610334565b92915050565b600060ff82169050919050565b6105ef816105d9565b81146105fa57600080fd5b50565b60008151905061060c816105e6565b92915050565b600060608284031215610628576106276104be565b5b6106326060610472565b9050600082015167ffffffffffffffff811115610652576106516104c3565b5b61065e8482850161056a565b6000830152506020610672848285016105c4565b6020830152506040610686848285016105fd565b60408301525092915050565b60006106a56106a084610598565b610472565b905080838252602082019050602084028301858111156106c8576106c76104b9565b5b835b8181101561070f57805167ffffffffffffffff8111156106ed576106ec6103fc565b5b8086016106fa8982610612565b855260208501945050506020810190506106ca565b5050509392505050565b600082601f83011261072e5761072d6103fc565b5b815161073e848260208601610692565b91505092915050565b60006040828403121561075d5761075c6104be565b5b6107676040610472565b9050600082015167ffffffffffffffff811115610787576107866104c3565b5b6107938482850161056a565b600083015250602082015167ffffffffffffffff8111156107b7576107b66104c3565b5b6107c384828501610719565b60208301525092915050565b60006107e26107dd8461048d565b610472565b90508083825260208201905060208402830185811115610805576108046104b9565b5b835b8181101561084c57805167ffffffffffffffff81111561082a576108296103fc565b5b8086016108378982610747565b85526020850194505050602081019050610807565b5050509392505050565b600082601f83011261086b5761086a6103fc565b5b815161087b8482602086016107cf565b91505092915050565b6000806040838503121561089b5761089a6102ea565b5b600083015167ffffffffffffffff8111156108b9576108b86102ef565b5b6108c585828601610856565b925050602083015167ffffffffffffffff8111156108e6576108e56102ef565b5b6108f285828601610719565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006109368261032a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610968576109676108fc565b5b600182019050919050565b61097c816102f4565b82525050565b61098b8161032a565b82525050565b60006040820190506109a66000830185610973565b6109b36020830184610982565b9392505050565b600081519050919050565b600081905092915050565b60006109db826109ba565b6109e581856109c5565b93506109f58185602086016104fe565b80840191505092915050565b6000610a0d82846109d0565b915081905092915050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b610a5f610a5a82610a18565b610a44565b82525050565b60008160601b9050919050565b6000610a7d82610a65565b9050919050565b6000610a8f82610a72565b9050919050565b610aa7610aa2826103c0565b610a84565b82525050565b6000819050919050565b610ac8610ac3826102f4565b610aad565b82525050565b6000610ada8287610a4e565b600182019150610aea8286610a96565b601482019150610afa8285610ab7565b602082019150610b0a8284610ab7565b6020820191508190509594505050505056fe608060405260b3806100126000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80633ccfd60b14602d575b600080fd5b60336035565b005b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015607a573d6000803e3d6000fd5b5056fea264697066735822122008001b1cb780fb8c81d5ab538ccbeab143f74b68ef571f3c5d058a2620bf412864736f6c63430008130033a2646970667358221220a5fd3d44b59916cad19784e497c1dbfaa58f7fb8006170e93ea2c8bd32af7b0264736f6c63430008130033", + "deployedBytecode": "0x60806040526004361061002d5760003560e01c806379388e9414610039578063c04062261461006257610034565b3661003457005b600080fd5b34801561004557600080fd5b50610060600480360381019061005b9190610360565b610079565b005b34801561006e57600080fd5b50610077610131565b005b808290604051610088906102d4565b82906040518091039083f590509050801580156100a9573d6000803e3d6000fd5b505061080173ffffffffffffffffffffffffffffffffffffffff166354be1a28306040518263ffffffff1660e01b81526004016100e691906103e1565b600060405180830381865afa158015610103573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061012c9190610884565b600080fd5b6000808154809291906101439061092b565b91905055503073ffffffffffffffffffffffffffffffffffffffff166379388e9460005460001b476040518363ffffffff1660e01b8152600401610188929190610991565b600060405180830381600087803b1580156101a257600080fd5b505af19250505080156101b3575060015b61022f5760006101c760005460001b610249565b90508073ffffffffffffffffffffffffffffffffffffffff16633ccfd60b6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561021157600080fd5b505af1158015610225573d6000803e3d6000fd5b5050505050610230565b5b6000808154809291906102429061092b565b9190505550565b60008060ff60f81b308460405180602001610263906102d4565b6020820181038252601f19601f820116604052506040516020016102879190610a01565b604051602081830303815290604052805190602001206040516020016102b09493929190610ace565b6040516020818303038152906040528051906020012060001c905080915050919050565b60c580610b1d83390190565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b610307816102f4565b811461031257600080fd5b50565b600081359050610324816102fe565b92915050565b6000819050919050565b61033d8161032a565b811461034857600080fd5b50565b60008135905061035a81610334565b92915050565b60008060408385031215610377576103766102ea565b5b600061038585828601610315565b92505060206103968582860161034b565b9150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103cb826103a0565b9050919050565b6103db816103c0565b82525050565b60006020820190506103f660008301846103d2565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61044a82610401565b810181811067ffffffffffffffff8211171561046957610468610412565b5b80604052505050565b600061047c6102e0565b90506104888282610441565b919050565b600067ffffffffffffffff8211156104a8576104a7610412565b5b602082029050602081019050919050565b600080fd5b600080fd5b600080fd5b600080fd5b600067ffffffffffffffff8211156104e8576104e7610412565b5b6104f182610401565b9050602081019050919050565b60005b8381101561051c578082015181840152602081019050610501565b60008484015250505050565b600061053b610536846104cd565b610472565b905082815260208101848484011115610557576105566104c8565b5b6105628482856104fe565b509392505050565b600082601f83011261057f5761057e6103fc565b5b815161058f848260208601610528565b91505092915050565b600067ffffffffffffffff8211156105b3576105b2610412565b5b602082029050602081019050919050565b6000815190506105d381610334565b92915050565b600060ff82169050919050565b6105ef816105d9565b81146105fa57600080fd5b50565b60008151905061060c816105e6565b92915050565b600060608284031215610628576106276104be565b5b6106326060610472565b9050600082015167ffffffffffffffff811115610652576106516104c3565b5b61065e8482850161056a565b6000830152506020610672848285016105c4565b6020830152506040610686848285016105fd565b60408301525092915050565b60006106a56106a084610598565b610472565b905080838252602082019050602084028301858111156106c8576106c76104b9565b5b835b8181101561070f57805167ffffffffffffffff8111156106ed576106ec6103fc565b5b8086016106fa8982610612565b855260208501945050506020810190506106ca565b5050509392505050565b600082601f83011261072e5761072d6103fc565b5b815161073e848260208601610692565b91505092915050565b60006040828403121561075d5761075c6104be565b5b6107676040610472565b9050600082015167ffffffffffffffff811115610787576107866104c3565b5b6107938482850161056a565b600083015250602082015167ffffffffffffffff8111156107b7576107b66104c3565b5b6107c384828501610719565b60208301525092915050565b60006107e26107dd8461048d565b610472565b90508083825260208201905060208402830185811115610805576108046104b9565b5b835b8181101561084c57805167ffffffffffffffff81111561082a576108296103fc565b5b8086016108378982610747565b85526020850194505050602081019050610807565b5050509392505050565b600082601f83011261086b5761086a6103fc565b5b815161087b8482602086016107cf565b91505092915050565b6000806040838503121561089b5761089a6102ea565b5b600083015167ffffffffffffffff8111156108b9576108b86102ef565b5b6108c585828601610856565b925050602083015167ffffffffffffffff8111156108e6576108e56102ef565b5b6108f285828601610719565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006109368261032a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610968576109676108fc565b5b600182019050919050565b61097c816102f4565b82525050565b61098b8161032a565b82525050565b60006040820190506109a66000830185610973565b6109b36020830184610982565b9392505050565b600081519050919050565b600081905092915050565b60006109db826109ba565b6109e581856109c5565b93506109f58185602086016104fe565b80840191505092915050565b6000610a0d82846109d0565b915081905092915050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b610a5f610a5a82610a18565b610a44565b82525050565b60008160601b9050919050565b6000610a7d82610a65565b9050919050565b6000610a8f82610a72565b9050919050565b610aa7610aa2826103c0565b610a84565b82525050565b6000819050919050565b610ac8610ac3826102f4565b610aad565b82525050565b6000610ada8287610a4e565b600182019150610aea8286610a96565b601482019150610afa8285610ab7565b602082019150610b0a8284610ab7565b6020820191508190509594505050505056fe608060405260b3806100126000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80633ccfd60b14602d575b600080fd5b60336035565b005b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015607a573d6000803e3d6000fd5b5056fea264697066735822122008001b1cb780fb8c81d5ab538ccbeab143f74b68ef571f3c5d058a2620bf412864736f6c63430008130033a2646970667358221220a5fd3d44b59916cad19784e497c1dbfaa58f7fb8006170e93ea2c8bd32af7b0264736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/precompiles/testutil/contracts/Reverter.sol b/precompiles/testutil/contracts/Reverter.sol new file mode 100644 index 0000000000..1e22df42a6 --- /dev/null +++ b/precompiles/testutil/contracts/Reverter.sol @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "../../distribution/DistributionI.sol"; + +contract Reverter { + uint counter = 0; + + constructor() payable {} + + function run() external { + counter++; + + // call Reverter::transferFunds() externally to create new context, sending this contract's full balance. + try + Reverter(payable(address(this))).transferFunds( + bytes32(counter), + address(this).balance + ) + {} catch { + // Transferer created by the call to Reverter::transferFunds(), as well as the funds sent + // to it, should not exist. Changes should be reverted + // and trying to call the Transferer(t).withdraw() should make the tx fail + address t = predictAddress(bytes32(counter)); + Transferer(t).withdraw(); + } + // increment the salt + counter++; + } + + function transferFunds(bytes32 salt, uint v) external { + // create Transferer, and send it v native tokens + new Transferer{value: v, salt: salt}(); + + // call the distribution precompile + DISTRIBUTION_CONTRACT.delegationTotalRewards(address(this)); + + // newly-created Transferer is removed from the journal, and the native tokens are returned to this + // contract. + revert(); + } + + // calculates the CREATE2 address of deploying Transferer with some salt + function predictAddress(bytes32 salt) internal view returns (address) { + address predictedAddress = address( + uint160( + uint( + keccak256( + abi.encodePacked( + bytes1(0xff), + address(this), + salt, + keccak256( + abi.encodePacked(type(Transferer).creationCode) + ) + ) + ) + ) + ) + ); + + return predictedAddress; + } + + // receive native tokens + receive() external payable {} +} + +contract Transferer { + constructor() payable {} + + function withdraw() external { + payable(msg.sender).transfer(address(this).balance); + } +} diff --git a/precompiles/testutil/contracts/StakingReverter.json b/precompiles/testutil/contracts/StakingReverter.json new file mode 100644 index 0000000000..1b5930741f --- /dev/null +++ b/precompiles/testutil/contracts/StakingReverter.json @@ -0,0 +1,164 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "StakingReverter", + "sourceName": "solidity/precompiles/testutil/contracts/StakingReverter.sol", + "abi": [ + { + "inputs": [], + "stateMutability": "payable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "validatorAddress", + "type": "string" + } + ], + "name": "getCurrentStake", + "outputs": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Coin", + "name": "balance", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "numTimes", + "type": "uint256" + }, + { + "internalType": "address", + "name": "validatorAddress", + "type": "address" + } + ], + "name": "multipleQueries", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "operatorAddress", + "type": "string" + }, + { + "internalType": "string", + "name": "consensusPubkey", + "type": "string" + }, + { + "internalType": "bool", + "name": "jailed", + "type": "bool" + }, + { + "internalType": "enum BondStatus", + "name": "status", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "delegatorShares", + "type": "uint256" + }, + { + "internalType": "string", + "name": "description", + "type": "string" + }, + { + "internalType": "int64", + "name": "unbondingHeight", + "type": "int64" + }, + { + "internalType": "int64", + "name": "unbondingTime", + "type": "int64" + }, + { + "internalType": "uint256", + "name": "commission", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minSelfDelegation", + "type": "uint256" + } + ], + "internalType": "struct Validator", + "name": "validator", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "validatorAddress", + "type": "string" + } + ], + "name": "performDelegation", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "numTimes", + "type": "uint256" + }, + { + "internalType": "string", + "name": "validatorAddress", + "type": "string" + } + ], + "name": "run", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x608060405260008055610f2a806100176000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80634e5a8fe514610051578063668f452b1461006d578063cbc367d41461009e578063f66013d7146100ce575b600080fd5b61006b6004803603810190610066919061049d565b6100ea565b005b610087600480360381019061008291906104fd565b61018c565b604051610095929190610635565b60405180910390f35b6100b860048036038101906100b391906106c3565b610226565b6040516100c591906108ae565b60405180910390f35b6100e860048036038101906100e391906104fd565b6102d6565b005b6000808154809291906100fc906108ff565b919050555060005b83811015610186573073ffffffffffffffffffffffffffffffffffffffff1663f66013d784846040518363ffffffff1660e01b8152600401610147929190610994565b600060405180830381600087803b15801561016157600080fd5b505af1925050508015610172575060015b50808061017e906108ff565b915050610104565b50505050565b6000610196610360565b61080073ffffffffffffffffffffffffffffffffffffffff1663241774e63086866040518463ffffffff1660e01b81526004016101d5939291906109c7565b600060405180830381865afa1580156101f2573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061021b9190610ba5565b915091509250929050565b61022e61037a565b60005b838110156102cf5761080073ffffffffffffffffffffffffffffffffffffffff1663223b3b7a846040518263ffffffff1660e01b81526004016102749190610c01565b600060405180830381865afa158015610291573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906102ba9190610df9565b915080806102c7906108ff565b915050610231565b5092915050565b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb308484600a6040518563ffffffff1660e01b81526004016103189493929190610e87565b6020604051808303816000875af1158015610337573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035b9190610ec7565b600080fd5b604051806040016040528060608152602001600081525090565b6040518061016001604052806060815260200160608152602001600015158152602001600060038111156103b1576103b061071e565b5b8152602001600081526020016000815260200160608152602001600060070b8152602001600060070b815260200160008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61041581610402565b811461042057600080fd5b50565b6000813590506104328161040c565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261045d5761045c610438565b5b8235905067ffffffffffffffff81111561047a5761047961043d565b5b60208301915083600182028301111561049657610495610442565b5b9250929050565b6000806000604084860312156104b6576104b56103f8565b5b60006104c486828701610423565b935050602084013567ffffffffffffffff8111156104e5576104e46103fd565b5b6104f186828701610447565b92509250509250925092565b60008060208385031215610514576105136103f8565b5b600083013567ffffffffffffffff811115610532576105316103fd565b5b61053e85828601610447565b92509250509250929050565b61055381610402565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610593578082015181840152602081019050610578565b60008484015250505050565b6000601f19601f8301169050919050565b60006105bb82610559565b6105c58185610564565b93506105d5818560208601610575565b6105de8161059f565b840191505092915050565b6105f281610402565b82525050565b6000604083016000830151848203600086015261061582826105b0565b915050602083015161062a60208601826105e9565b508091505092915050565b600060408201905061064a600083018561054a565b818103602083015261065c81846105f8565b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061069082610665565b9050919050565b6106a081610685565b81146106ab57600080fd5b50565b6000813590506106bd81610697565b92915050565b600080604083850312156106da576106d96103f8565b5b60006106e885828601610423565b92505060206106f9858286016106ae565b9150509250929050565b60008115159050919050565b61071881610703565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004811061075e5761075d61071e565b5b50565b600081905061076f8261074d565b919050565b600061077f82610761565b9050919050565b61078f81610774565b82525050565b60008160070b9050919050565b6107ab81610795565b82525050565b60006101608301600083015184820360008601526107cf82826105b0565b915050602083015184820360208601526107e982826105b0565b91505060408301516107fe604086018261070f565b5060608301516108116060860182610786565b50608083015161082460808601826105e9565b5060a083015161083760a08601826105e9565b5060c083015184820360c086015261084f82826105b0565b91505060e083015161086460e08601826107a2565b506101008301516108796101008601826107a2565b5061012083015161088e6101208601826105e9565b506101408301516108a36101408601826105e9565b508091505092915050565b600060208201905081810360008301526108c881846107b1565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061090a82610402565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361093c5761093b6108d0565b5b600182019050919050565b600082825260208201905092915050565b82818337600083830152505050565b60006109738385610947565b9350610980838584610958565b6109898361059f565b840190509392505050565b600060208201905081810360008301526109af818486610967565b90509392505050565b6109c181610685565b82525050565b60006040820190506109dc60008301866109b8565b81810360208301526109ef818486610967565b9050949350505050565b600081519050610a088161040c565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610a4b8261059f565b810181811067ffffffffffffffff82111715610a6a57610a69610a13565b5b80604052505050565b6000610a7d6103ee565b9050610a898282610a42565b919050565b600080fd5b600080fd5b600067ffffffffffffffff821115610ab357610ab2610a13565b5b610abc8261059f565b9050602081019050919050565b6000610adc610ad784610a98565b610a73565b905082815260208101848484011115610af857610af7610a93565b5b610b03848285610575565b509392505050565b600082601f830112610b2057610b1f610438565b5b8151610b30848260208601610ac9565b91505092915050565b600060408284031215610b4f57610b4e610a0e565b5b610b596040610a73565b9050600082015167ffffffffffffffff811115610b7957610b78610a8e565b5b610b8584828501610b0b565b6000830152506020610b99848285016109f9565b60208301525092915050565b60008060408385031215610bbc57610bbb6103f8565b5b6000610bca858286016109f9565b925050602083015167ffffffffffffffff811115610beb57610bea6103fd565b5b610bf785828601610b39565b9150509250929050565b6000602082019050610c1660008301846109b8565b92915050565b610c2581610703565b8114610c3057600080fd5b50565b600081519050610c4281610c1c565b92915050565b60048110610c5557600080fd5b50565b600081519050610c6781610c48565b92915050565b610c7681610795565b8114610c8157600080fd5b50565b600081519050610c9381610c6d565b92915050565b60006101608284031215610cb057610caf610a0e565b5b610cbb610160610a73565b9050600082015167ffffffffffffffff811115610cdb57610cda610a8e565b5b610ce784828501610b0b565b600083015250602082015167ffffffffffffffff811115610d0b57610d0a610a8e565b5b610d1784828501610b0b565b6020830152506040610d2b84828501610c33565b6040830152506060610d3f84828501610c58565b6060830152506080610d53848285016109f9565b60808301525060a0610d67848285016109f9565b60a08301525060c082015167ffffffffffffffff811115610d8b57610d8a610a8e565b5b610d9784828501610b0b565b60c08301525060e0610dab84828501610c84565b60e083015250610100610dc084828501610c84565b61010083015250610120610dd6848285016109f9565b61012083015250610140610dec848285016109f9565b6101408301525092915050565b600060208284031215610e0f57610e0e6103f8565b5b600082015167ffffffffffffffff811115610e2d57610e2c6103fd565b5b610e3984828501610c99565b91505092915050565b6000819050919050565b6000819050919050565b6000610e71610e6c610e6784610e42565b610e4c565b610402565b9050919050565b610e8181610e56565b82525050565b6000606082019050610e9c60008301876109b8565b8181036020830152610eaf818587610967565b9050610ebe6040830184610e78565b95945050505050565b600060208284031215610edd57610edc6103f8565b5b6000610eeb84828501610c33565b9150509291505056fea264697066735822122065bd7ead5aeed227652c5f7a1cd2f7e458fbac5943bc70b2e7e985c82969ffac64736f6c63430008130033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c80634e5a8fe514610051578063668f452b1461006d578063cbc367d41461009e578063f66013d7146100ce575b600080fd5b61006b6004803603810190610066919061049d565b6100ea565b005b610087600480360381019061008291906104fd565b61018c565b604051610095929190610635565b60405180910390f35b6100b860048036038101906100b391906106c3565b610226565b6040516100c591906108ae565b60405180910390f35b6100e860048036038101906100e391906104fd565b6102d6565b005b6000808154809291906100fc906108ff565b919050555060005b83811015610186573073ffffffffffffffffffffffffffffffffffffffff1663f66013d784846040518363ffffffff1660e01b8152600401610147929190610994565b600060405180830381600087803b15801561016157600080fd5b505af1925050508015610172575060015b50808061017e906108ff565b915050610104565b50505050565b6000610196610360565b61080073ffffffffffffffffffffffffffffffffffffffff1663241774e63086866040518463ffffffff1660e01b81526004016101d5939291906109c7565b600060405180830381865afa1580156101f2573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061021b9190610ba5565b915091509250929050565b61022e61037a565b60005b838110156102cf5761080073ffffffffffffffffffffffffffffffffffffffff1663223b3b7a846040518263ffffffff1660e01b81526004016102749190610c01565b600060405180830381865afa158015610291573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906102ba9190610df9565b915080806102c7906108ff565b915050610231565b5092915050565b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb308484600a6040518563ffffffff1660e01b81526004016103189493929190610e87565b6020604051808303816000875af1158015610337573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035b9190610ec7565b600080fd5b604051806040016040528060608152602001600081525090565b6040518061016001604052806060815260200160608152602001600015158152602001600060038111156103b1576103b061071e565b5b8152602001600081526020016000815260200160608152602001600060070b8152602001600060070b815260200160008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61041581610402565b811461042057600080fd5b50565b6000813590506104328161040c565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261045d5761045c610438565b5b8235905067ffffffffffffffff81111561047a5761047961043d565b5b60208301915083600182028301111561049657610495610442565b5b9250929050565b6000806000604084860312156104b6576104b56103f8565b5b60006104c486828701610423565b935050602084013567ffffffffffffffff8111156104e5576104e46103fd565b5b6104f186828701610447565b92509250509250925092565b60008060208385031215610514576105136103f8565b5b600083013567ffffffffffffffff811115610532576105316103fd565b5b61053e85828601610447565b92509250509250929050565b61055381610402565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610593578082015181840152602081019050610578565b60008484015250505050565b6000601f19601f8301169050919050565b60006105bb82610559565b6105c58185610564565b93506105d5818560208601610575565b6105de8161059f565b840191505092915050565b6105f281610402565b82525050565b6000604083016000830151848203600086015261061582826105b0565b915050602083015161062a60208601826105e9565b508091505092915050565b600060408201905061064a600083018561054a565b818103602083015261065c81846105f8565b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061069082610665565b9050919050565b6106a081610685565b81146106ab57600080fd5b50565b6000813590506106bd81610697565b92915050565b600080604083850312156106da576106d96103f8565b5b60006106e885828601610423565b92505060206106f9858286016106ae565b9150509250929050565b60008115159050919050565b61071881610703565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004811061075e5761075d61071e565b5b50565b600081905061076f8261074d565b919050565b600061077f82610761565b9050919050565b61078f81610774565b82525050565b60008160070b9050919050565b6107ab81610795565b82525050565b60006101608301600083015184820360008601526107cf82826105b0565b915050602083015184820360208601526107e982826105b0565b91505060408301516107fe604086018261070f565b5060608301516108116060860182610786565b50608083015161082460808601826105e9565b5060a083015161083760a08601826105e9565b5060c083015184820360c086015261084f82826105b0565b91505060e083015161086460e08601826107a2565b506101008301516108796101008601826107a2565b5061012083015161088e6101208601826105e9565b506101408301516108a36101408601826105e9565b508091505092915050565b600060208201905081810360008301526108c881846107b1565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061090a82610402565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361093c5761093b6108d0565b5b600182019050919050565b600082825260208201905092915050565b82818337600083830152505050565b60006109738385610947565b9350610980838584610958565b6109898361059f565b840190509392505050565b600060208201905081810360008301526109af818486610967565b90509392505050565b6109c181610685565b82525050565b60006040820190506109dc60008301866109b8565b81810360208301526109ef818486610967565b9050949350505050565b600081519050610a088161040c565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610a4b8261059f565b810181811067ffffffffffffffff82111715610a6a57610a69610a13565b5b80604052505050565b6000610a7d6103ee565b9050610a898282610a42565b919050565b600080fd5b600080fd5b600067ffffffffffffffff821115610ab357610ab2610a13565b5b610abc8261059f565b9050602081019050919050565b6000610adc610ad784610a98565b610a73565b905082815260208101848484011115610af857610af7610a93565b5b610b03848285610575565b509392505050565b600082601f830112610b2057610b1f610438565b5b8151610b30848260208601610ac9565b91505092915050565b600060408284031215610b4f57610b4e610a0e565b5b610b596040610a73565b9050600082015167ffffffffffffffff811115610b7957610b78610a8e565b5b610b8584828501610b0b565b6000830152506020610b99848285016109f9565b60208301525092915050565b60008060408385031215610bbc57610bbb6103f8565b5b6000610bca858286016109f9565b925050602083015167ffffffffffffffff811115610beb57610bea6103fd565b5b610bf785828601610b39565b9150509250929050565b6000602082019050610c1660008301846109b8565b92915050565b610c2581610703565b8114610c3057600080fd5b50565b600081519050610c4281610c1c565b92915050565b60048110610c5557600080fd5b50565b600081519050610c6781610c48565b92915050565b610c7681610795565b8114610c8157600080fd5b50565b600081519050610c9381610c6d565b92915050565b60006101608284031215610cb057610caf610a0e565b5b610cbb610160610a73565b9050600082015167ffffffffffffffff811115610cdb57610cda610a8e565b5b610ce784828501610b0b565b600083015250602082015167ffffffffffffffff811115610d0b57610d0a610a8e565b5b610d1784828501610b0b565b6020830152506040610d2b84828501610c33565b6040830152506060610d3f84828501610c58565b6060830152506080610d53848285016109f9565b60808301525060a0610d67848285016109f9565b60a08301525060c082015167ffffffffffffffff811115610d8b57610d8a610a8e565b5b610d9784828501610b0b565b60c08301525060e0610dab84828501610c84565b60e083015250610100610dc084828501610c84565b61010083015250610120610dd6848285016109f9565b61012083015250610140610dec848285016109f9565b6101408301525092915050565b600060208284031215610e0f57610e0e6103f8565b5b600082015167ffffffffffffffff811115610e2d57610e2c6103fd565b5b610e3984828501610c99565b91505092915050565b6000819050919050565b6000819050919050565b6000610e71610e6c610e6784610e42565b610e4c565b610402565b9050919050565b610e8181610e56565b82525050565b6000606082019050610e9c60008301876109b8565b8181036020830152610eaf818587610967565b9050610ebe6040830184610e78565b95945050505050565b600060208284031215610edd57610edc6103f8565b5b6000610eeb84828501610c33565b9150509291505056fea264697066735822122065bd7ead5aeed227652c5f7a1cd2f7e458fbac5943bc70b2e7e985c82969ffac64736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/precompiles/testutil/contracts/StakingReverter.sol b/precompiles/testutil/contracts/StakingReverter.sol new file mode 100644 index 0000000000..e287d4709d --- /dev/null +++ b/precompiles/testutil/contracts/StakingReverter.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "../../staking/StakingI.sol"; + +contract StakingReverter { + uint counter = 0; + + constructor() payable {} + + function run(uint numTimes, string calldata validatorAddress) external { + counter++; + + for (uint i = 0; i < numTimes; i++) { + try + StakingReverter(address(this)).performDelegation( + validatorAddress + ) + {} catch {} + } + } + + function performDelegation(string calldata validatorAddress) external { + STAKING_CONTRACT.delegate(address(this), validatorAddress, 10); + revert(); + } + + function getCurrentStake( + string calldata validatorAddress + ) external view returns (uint256 shares, Coin memory balance) { + return STAKING_CONTRACT.delegation(address(this), validatorAddress); + } + + function multipleQueries( + uint numTimes, + address validatorAddress + ) external view returns (Validator memory validator) { + for (uint i = 0; i < numTimes; i++) { + validator = STAKING_CONTRACT.validator(validatorAddress); + } + return validator; + } +} diff --git a/x/evm/statedb/testdata/flash_loan.go b/precompiles/testutil/contracts/flash_loan.go similarity index 95% rename from x/evm/statedb/testdata/flash_loan.go rename to precompiles/testutil/contracts/flash_loan.go index 577c5b005d..c8ffba1c32 100644 --- a/x/evm/statedb/testdata/flash_loan.go +++ b/precompiles/testutil/contracts/flash_loan.go @@ -1,7 +1,7 @@ // Copyright Tharsis Labs Ltd.(Evmos) // SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) -package testdata +package contracts import ( contractutils "github.com/evmos/evmos/v18/contracts/utils" diff --git a/precompiles/testutil/contracts/interchain_sender_caller.go b/precompiles/testutil/contracts/interchain_sender_caller.go new file mode 100644 index 0000000000..f2d18b9239 --- /dev/null +++ b/precompiles/testutil/contracts/interchain_sender_caller.go @@ -0,0 +1,13 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package contracts + +import ( + contractutils "github.com/evmos/evmos/v18/contracts/utils" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" +) + +func LoadInterchainSenderCallerContract() (evmtypes.CompiledContract, error) { + return contractutils.LoadContractFromJSONFile("InterchainSenderCaller.json") +} diff --git a/precompiles/testutil/contracts/reverter.go b/precompiles/testutil/contracts/reverter.go new file mode 100644 index 0000000000..e09ee7fac5 --- /dev/null +++ b/precompiles/testutil/contracts/reverter.go @@ -0,0 +1,13 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package contracts + +import ( + contractutils "github.com/evmos/evmos/v18/contracts/utils" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" +) + +func LoadReverterContract() (evmtypes.CompiledContract, error) { + return contractutils.LoadContractFromJSONFile("Reverter.json") +} diff --git a/precompiles/testutil/contracts/staking_reverter.go b/precompiles/testutil/contracts/staking_reverter.go new file mode 100644 index 0000000000..47c7eb7bad --- /dev/null +++ b/precompiles/testutil/contracts/staking_reverter.go @@ -0,0 +1,13 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package contracts + +import ( + contractutils "github.com/evmos/evmos/v18/contracts/utils" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" +) + +func LoadStakingReverterContract() (evmtypes.CompiledContract, error) { + return contractutils.LoadContractFromJSONFile("StakingReverter.json") +} diff --git a/precompiles/vesting/testdata/VestingCaller.json b/precompiles/vesting/testdata/VestingCaller.json index 236dea8e27..c758af99f4 100644 --- a/precompiles/vesting/testdata/VestingCaller.json +++ b/precompiles/vesting/testdata/VestingCaller.json @@ -257,8 +257,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b50611707806100206000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c806372e7c9ab1161005b57806372e7c9ab146100ec5780637caef81b1461011c5780639cfef12914610126578063cdb50175146101425761007d565b806327e235e3146100825780634fe1a8df146100b45780635a211064146100d0575b600080fd5b61009c600480360381019061009791906106f5565b61015e565b6040516100ab939291906108ca565b60405180910390f35b6100ce60048036038101906100c991906109bb565b6101f1565b005b6100ea60048036038101906100e591906106f5565b6102c9565b005b61010660048036038101906101019190610a77565b61038f565b6040516101139190610aca565b60405180910390f35b610124610421565b005b610140600480360381019061013b9190610a77565b6104eb565b005b61015c60048036038101906101579190610b24565b6105b7565b005b606080606061080373ffffffffffffffffffffffffffffffffffffffff166327e235e3856040518263ffffffff1660e01b815260040161019e9190610b86565b600060405180830381865afa1580156101bb573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906101e49190610e45565b9250925092509193909250565b600061080373ffffffffffffffffffffffffffffffffffffffff16634fe1a8df898989898989896040518863ffffffff1660e01b815260040161023a97969594939291906112e5565b6020604051808303816000875af1158015610259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027d919061135f565b9050806102bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b69061140f565b60405180910390fd5b5050505050505050565b600061080373ffffffffffffffffffffffffffffffffffffffff16635a211064836040518263ffffffff1660e01b81526004016103069190610b86565b6020604051808303816000875af1158015610325573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610349919061135f565b90508061038b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610382906114a1565b60405180910390fd5b5050565b606061080373ffffffffffffffffffffffffffffffffffffffff166372e7c9ab8585856040518463ffffffff1660e01b81526004016103d0939291906114c1565b6000604051808303816000875af11580156103ef573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061041891906114f8565b90509392505050565b600061080373ffffffffffffffffffffffffffffffffffffffff1663cdb50175333060006040518463ffffffff1660e01b815260040161046393929190611550565b6020604051808303816000875af1158015610482573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104a6919061135f565b9050806104e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104df9061161f565b60405180910390fd5b50565b600061080373ffffffffffffffffffffffffffffffffffffffff16639cfef1298585856040518463ffffffff1660e01b815260040161052c939291906114c1565b6020604051808303816000875af115801561054b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061056f919061135f565b9050806105b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105a8906116b1565b60405180910390fd5b50505050565b600061080373ffffffffffffffffffffffffffffffffffffffff1663cdb501758585856040518463ffffffff1660e01b81526004016105f893929190611550565b6020604051808303816000875af1158015610617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063b919061135f565b90508061067d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106749061140f565b60405180910390fd5b50505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106c282610697565b9050919050565b6106d2816106b7565b81146106dd57600080fd5b50565b6000813590506106ef816106c9565b92915050565b60006020828403121561070b5761070a61068d565b5b6000610719848285016106e0565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561078857808201518184015260208101905061076d565b60008484015250505050565b6000601f19601f8301169050919050565b60006107b08261074e565b6107ba8185610759565b93506107ca81856020860161076a565b6107d381610794565b840191505092915050565b6000819050919050565b6107f1816107de565b82525050565b6000604083016000830151848203600086015261081482826107a5565b915050602083015161082960208601826107e8565b508091505092915050565b600061084083836107f7565b905092915050565b6000602082019050919050565b600061086082610722565b61086a818561072d565b93508360208202850161087c8561073e565b8060005b858110156108b857848403895281516108998582610834565b94506108a483610848565b925060208a01995050600181019050610880565b50829750879550505050505092915050565b600060608201905081810360008301526108e48186610855565b905081810360208301526108f88185610855565b9050818103604083015261090c8184610855565b9050949350505050565b600067ffffffffffffffff82169050919050565b61093381610916565b811461093e57600080fd5b50565b6000813590506109508161092a565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261097b5761097a610956565b5b8235905067ffffffffffffffff8111156109985761099761095b565b5b6020830191508360208202830111156109b4576109b3610960565b5b9250929050565b600080600080600080600060a0888a0312156109da576109d961068d565b5b60006109e88a828b016106e0565b97505060206109f98a828b016106e0565b9650506040610a0a8a828b01610941565b955050606088013567ffffffffffffffff811115610a2b57610a2a610692565b5b610a378a828b01610965565b9450945050608088013567ffffffffffffffff811115610a5a57610a59610692565b5b610a668a828b01610965565b925092505092959891949750929550565b600080600060608486031215610a9057610a8f61068d565b5b6000610a9e868287016106e0565b9350506020610aaf868287016106e0565b9250506040610ac0868287016106e0565b9150509250925092565b60006020820190508181036000830152610ae48184610855565b905092915050565b60008115159050919050565b610b0181610aec565b8114610b0c57600080fd5b50565b600081359050610b1e81610af8565b92915050565b600080600060608486031215610b3d57610b3c61068d565b5b6000610b4b868287016106e0565b9350506020610b5c868287016106e0565b9250506040610b6d86828701610b0f565b9150509250925092565b610b80816106b7565b82525050565b6000602082019050610b9b6000830184610b77565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610bd982610794565b810181811067ffffffffffffffff82111715610bf857610bf7610ba1565b5b80604052505050565b6000610c0b610683565b9050610c178282610bd0565b919050565b600067ffffffffffffffff821115610c3757610c36610ba1565b5b602082029050602081019050919050565b600080fd5b600080fd5b600080fd5b600067ffffffffffffffff821115610c7257610c71610ba1565b5b610c7b82610794565b9050602081019050919050565b6000610c9b610c9684610c57565b610c01565b905082815260208101848484011115610cb757610cb6610c52565b5b610cc284828561076a565b509392505050565b600082601f830112610cdf57610cde610956565b5b8151610cef848260208601610c88565b91505092915050565b610d01816107de565b8114610d0c57600080fd5b50565b600081519050610d1e81610cf8565b92915050565b600060408284031215610d3a57610d39610c48565b5b610d446040610c01565b9050600082015167ffffffffffffffff811115610d6457610d63610c4d565b5b610d7084828501610cca565b6000830152506020610d8484828501610d0f565b60208301525092915050565b6000610da3610d9e84610c1c565b610c01565b90508083825260208201905060208402830185811115610dc657610dc5610960565b5b835b81811015610e0d57805167ffffffffffffffff811115610deb57610dea610956565b5b808601610df88982610d24565b85526020850194505050602081019050610dc8565b5050509392505050565b600082601f830112610e2c57610e2b610956565b5b8151610e3c848260208601610d90565b91505092915050565b600080600060608486031215610e5e57610e5d61068d565b5b600084015167ffffffffffffffff811115610e7c57610e7b610692565b5b610e8886828701610e17565b935050602084015167ffffffffffffffff811115610ea957610ea8610692565b5b610eb586828701610e17565b925050604084015167ffffffffffffffff811115610ed657610ed5610692565b5b610ee286828701610e17565b9150509250925092565b610ef581610916565b82525050565b600082825260208201905092915050565b6000819050919050565b60008160070b9050919050565b610f2c81610f16565b8114610f3757600080fd5b50565b600081359050610f4981610f23565b92915050565b6000610f5e6020840184610f3a565b905092915050565b610f6f81610f16565b82525050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112610fa157610fa0610f7f565b5b83810192508235915060208301925067ffffffffffffffff821115610fc957610fc8610f75565b5b602082023603831315610fdf57610fde610f7a565b5b509250929050565b600082825260208201905092915050565b6000819050919050565b6000808335600160200384360303811261101f5761101e610f7f565b5b83810192508235915060208301925067ffffffffffffffff82111561104757611046610f75565b5b60018202360383131561105d5761105c610f7a565b5b509250929050565b82818337600083830152505050565b60006110808385610759565b935061108d838584611065565b61109683610794565b840190509392505050565b6000813590506110b081610cf8565b92915050565b60006110c560208401846110a1565b905092915050565b6000604083016110e06000840184611002565b85830360008701526110f3838284611074565b9250505061110460208401846110b6565b61111160208601826107e8565b508091505092915050565b600061112883836110cd565b905092915050565b60008235600160400383360303811261114c5761114b610f7f565b5b82810191505092915050565b6000602082019050919050565b60006111718385610fe7565b93508360208402850161118384610ff8565b8060005b878110156111c757848403895261119e8284611130565b6111a8858261111c565b94506111b383611158565b925060208a01995050600181019050611187565b50829750879450505050509392505050565b6000604083016111ec6000840184610f4f565b6111f96000860182610f66565b506112076020840184610f84565b858303602087015261121a838284611165565b925050508091505092915050565b600061123483836111d9565b905092915050565b60008235600160400383360303811261125857611257610f7f565b5b82810191505092915050565b6000602082019050919050565b600061127d8385610efb565b93508360208402850161128f84610f0c565b8060005b878110156112d35784840389526112aa828461123c565b6112b48582611228565b94506112bf83611264565b925060208a01995050600181019050611293565b50829750879450505050509392505050565b600060a0820190506112fa600083018a610b77565b6113076020830189610b77565b6113146040830188610eec565b8181036060830152611327818688611271565b9050818103608083015261133c818486611271565b905098975050505050505050565b60008151905061135981610af8565b92915050565b6000602082840312156113755761137461068d565b5b60006113838482850161134a565b91505092915050565b600082825260208201905092915050565b7f56657374696e6743616c6c65723a2063726561746520636c61776261636b207660008201527f657374696e67206163636f756e74206661696c65640000000000000000000000602082015250565b60006113f960358361138c565b91506114048261139d565b604082019050919050565b60006020820190508181036000830152611428816113ec565b9050919050565b7f56657374696e6743616c6c65723a20636f6e7665727420746f20636c6177626160008201527f636b2076657374696e67206163636f756e74206661696c656400000000000000602082015250565b600061148b60398361138c565b91506114968261142f565b604082019050919050565b600060208201905081810360008301526114ba8161147e565b9050919050565b60006060820190506114d66000830186610b77565b6114e36020830185610b77565b6114f06040830184610b77565b949350505050565b60006020828403121561150e5761150d61068d565b5b600082015167ffffffffffffffff81111561152c5761152b610692565b5b61153884828501610e17565b91505092915050565b61154a81610aec565b82525050565b60006060820190506115656000830186610b77565b6115726020830185610b77565b61157f6040830184611541565b949350505050565b7f56657374696e6743616c6c65723a2063726561746520636c61776261636b207660008201527f657374696e67206163636f756e7420666f7220636f6e7472616374206661696c60208201527f6564000000000000000000000000000000000000000000000000000000000000604082015250565b600061160960428361138c565b915061161482611587565b606082019050919050565b60006020820190508181036000830152611638816115fc565b9050919050565b7f56657374696e6743616c6c65723a207570646174652076657374696e6720667560008201527f6e646572206661696c6564000000000000000000000000000000000000000000602082015250565b600061169b602b8361138c565b91506116a68261163f565b604082019050919050565b600060208201905081810360008301526116ca8161168e565b905091905056fea26469706673582212200c0e5b0043edec654be0a450d53af988547ba7d7bb58c9cf6265cc22d8703ba864736f6c63430008130033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061007d5760003560e01c806372e7c9ab1161005b57806372e7c9ab146100ec5780637caef81b1461011c5780639cfef12914610126578063cdb50175146101425761007d565b806327e235e3146100825780634fe1a8df146100b45780635a211064146100d0575b600080fd5b61009c600480360381019061009791906106f5565b61015e565b6040516100ab939291906108ca565b60405180910390f35b6100ce60048036038101906100c991906109bb565b6101f1565b005b6100ea60048036038101906100e591906106f5565b6102c9565b005b61010660048036038101906101019190610a77565b61038f565b6040516101139190610aca565b60405180910390f35b610124610421565b005b610140600480360381019061013b9190610a77565b6104eb565b005b61015c60048036038101906101579190610b24565b6105b7565b005b606080606061080373ffffffffffffffffffffffffffffffffffffffff166327e235e3856040518263ffffffff1660e01b815260040161019e9190610b86565b600060405180830381865afa1580156101bb573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906101e49190610e45565b9250925092509193909250565b600061080373ffffffffffffffffffffffffffffffffffffffff16634fe1a8df898989898989896040518863ffffffff1660e01b815260040161023a97969594939291906112e5565b6020604051808303816000875af1158015610259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027d919061135f565b9050806102bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b69061140f565b60405180910390fd5b5050505050505050565b600061080373ffffffffffffffffffffffffffffffffffffffff16635a211064836040518263ffffffff1660e01b81526004016103069190610b86565b6020604051808303816000875af1158015610325573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610349919061135f565b90508061038b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610382906114a1565b60405180910390fd5b5050565b606061080373ffffffffffffffffffffffffffffffffffffffff166372e7c9ab8585856040518463ffffffff1660e01b81526004016103d0939291906114c1565b6000604051808303816000875af11580156103ef573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061041891906114f8565b90509392505050565b600061080373ffffffffffffffffffffffffffffffffffffffff1663cdb50175333060006040518463ffffffff1660e01b815260040161046393929190611550565b6020604051808303816000875af1158015610482573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104a6919061135f565b9050806104e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104df9061161f565b60405180910390fd5b50565b600061080373ffffffffffffffffffffffffffffffffffffffff16639cfef1298585856040518463ffffffff1660e01b815260040161052c939291906114c1565b6020604051808303816000875af115801561054b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061056f919061135f565b9050806105b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105a8906116b1565b60405180910390fd5b50505050565b600061080373ffffffffffffffffffffffffffffffffffffffff1663cdb501758585856040518463ffffffff1660e01b81526004016105f893929190611550565b6020604051808303816000875af1158015610617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063b919061135f565b90508061067d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106749061140f565b60405180910390fd5b50505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106c282610697565b9050919050565b6106d2816106b7565b81146106dd57600080fd5b50565b6000813590506106ef816106c9565b92915050565b60006020828403121561070b5761070a61068d565b5b6000610719848285016106e0565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561078857808201518184015260208101905061076d565b60008484015250505050565b6000601f19601f8301169050919050565b60006107b08261074e565b6107ba8185610759565b93506107ca81856020860161076a565b6107d381610794565b840191505092915050565b6000819050919050565b6107f1816107de565b82525050565b6000604083016000830151848203600086015261081482826107a5565b915050602083015161082960208601826107e8565b508091505092915050565b600061084083836107f7565b905092915050565b6000602082019050919050565b600061086082610722565b61086a818561072d565b93508360208202850161087c8561073e565b8060005b858110156108b857848403895281516108998582610834565b94506108a483610848565b925060208a01995050600181019050610880565b50829750879550505050505092915050565b600060608201905081810360008301526108e48186610855565b905081810360208301526108f88185610855565b9050818103604083015261090c8184610855565b9050949350505050565b600067ffffffffffffffff82169050919050565b61093381610916565b811461093e57600080fd5b50565b6000813590506109508161092a565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261097b5761097a610956565b5b8235905067ffffffffffffffff8111156109985761099761095b565b5b6020830191508360208202830111156109b4576109b3610960565b5b9250929050565b600080600080600080600060a0888a0312156109da576109d961068d565b5b60006109e88a828b016106e0565b97505060206109f98a828b016106e0565b9650506040610a0a8a828b01610941565b955050606088013567ffffffffffffffff811115610a2b57610a2a610692565b5b610a378a828b01610965565b9450945050608088013567ffffffffffffffff811115610a5a57610a59610692565b5b610a668a828b01610965565b925092505092959891949750929550565b600080600060608486031215610a9057610a8f61068d565b5b6000610a9e868287016106e0565b9350506020610aaf868287016106e0565b9250506040610ac0868287016106e0565b9150509250925092565b60006020820190508181036000830152610ae48184610855565b905092915050565b60008115159050919050565b610b0181610aec565b8114610b0c57600080fd5b50565b600081359050610b1e81610af8565b92915050565b600080600060608486031215610b3d57610b3c61068d565b5b6000610b4b868287016106e0565b9350506020610b5c868287016106e0565b9250506040610b6d86828701610b0f565b9150509250925092565b610b80816106b7565b82525050565b6000602082019050610b9b6000830184610b77565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610bd982610794565b810181811067ffffffffffffffff82111715610bf857610bf7610ba1565b5b80604052505050565b6000610c0b610683565b9050610c178282610bd0565b919050565b600067ffffffffffffffff821115610c3757610c36610ba1565b5b602082029050602081019050919050565b600080fd5b600080fd5b600080fd5b600067ffffffffffffffff821115610c7257610c71610ba1565b5b610c7b82610794565b9050602081019050919050565b6000610c9b610c9684610c57565b610c01565b905082815260208101848484011115610cb757610cb6610c52565b5b610cc284828561076a565b509392505050565b600082601f830112610cdf57610cde610956565b5b8151610cef848260208601610c88565b91505092915050565b610d01816107de565b8114610d0c57600080fd5b50565b600081519050610d1e81610cf8565b92915050565b600060408284031215610d3a57610d39610c48565b5b610d446040610c01565b9050600082015167ffffffffffffffff811115610d6457610d63610c4d565b5b610d7084828501610cca565b6000830152506020610d8484828501610d0f565b60208301525092915050565b6000610da3610d9e84610c1c565b610c01565b90508083825260208201905060208402830185811115610dc657610dc5610960565b5b835b81811015610e0d57805167ffffffffffffffff811115610deb57610dea610956565b5b808601610df88982610d24565b85526020850194505050602081019050610dc8565b5050509392505050565b600082601f830112610e2c57610e2b610956565b5b8151610e3c848260208601610d90565b91505092915050565b600080600060608486031215610e5e57610e5d61068d565b5b600084015167ffffffffffffffff811115610e7c57610e7b610692565b5b610e8886828701610e17565b935050602084015167ffffffffffffffff811115610ea957610ea8610692565b5b610eb586828701610e17565b925050604084015167ffffffffffffffff811115610ed657610ed5610692565b5b610ee286828701610e17565b9150509250925092565b610ef581610916565b82525050565b600082825260208201905092915050565b6000819050919050565b60008160070b9050919050565b610f2c81610f16565b8114610f3757600080fd5b50565b600081359050610f4981610f23565b92915050565b6000610f5e6020840184610f3a565b905092915050565b610f6f81610f16565b82525050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112610fa157610fa0610f7f565b5b83810192508235915060208301925067ffffffffffffffff821115610fc957610fc8610f75565b5b602082023603831315610fdf57610fde610f7a565b5b509250929050565b600082825260208201905092915050565b6000819050919050565b6000808335600160200384360303811261101f5761101e610f7f565b5b83810192508235915060208301925067ffffffffffffffff82111561104757611046610f75565b5b60018202360383131561105d5761105c610f7a565b5b509250929050565b82818337600083830152505050565b60006110808385610759565b935061108d838584611065565b61109683610794565b840190509392505050565b6000813590506110b081610cf8565b92915050565b60006110c560208401846110a1565b905092915050565b6000604083016110e06000840184611002565b85830360008701526110f3838284611074565b9250505061110460208401846110b6565b61111160208601826107e8565b508091505092915050565b600061112883836110cd565b905092915050565b60008235600160400383360303811261114c5761114b610f7f565b5b82810191505092915050565b6000602082019050919050565b60006111718385610fe7565b93508360208402850161118384610ff8565b8060005b878110156111c757848403895261119e8284611130565b6111a8858261111c565b94506111b383611158565b925060208a01995050600181019050611187565b50829750879450505050509392505050565b6000604083016111ec6000840184610f4f565b6111f96000860182610f66565b506112076020840184610f84565b858303602087015261121a838284611165565b925050508091505092915050565b600061123483836111d9565b905092915050565b60008235600160400383360303811261125857611257610f7f565b5b82810191505092915050565b6000602082019050919050565b600061127d8385610efb565b93508360208402850161128f84610f0c565b8060005b878110156112d35784840389526112aa828461123c565b6112b48582611228565b94506112bf83611264565b925060208a01995050600181019050611293565b50829750879450505050509392505050565b600060a0820190506112fa600083018a610b77565b6113076020830189610b77565b6113146040830188610eec565b8181036060830152611327818688611271565b9050818103608083015261133c818486611271565b905098975050505050505050565b60008151905061135981610af8565b92915050565b6000602082840312156113755761137461068d565b5b60006113838482850161134a565b91505092915050565b600082825260208201905092915050565b7f56657374696e6743616c6c65723a2063726561746520636c61776261636b207660008201527f657374696e67206163636f756e74206661696c65640000000000000000000000602082015250565b60006113f960358361138c565b91506114048261139d565b604082019050919050565b60006020820190508181036000830152611428816113ec565b9050919050565b7f56657374696e6743616c6c65723a20636f6e7665727420746f20636c6177626160008201527f636b2076657374696e67206163636f756e74206661696c656400000000000000602082015250565b600061148b60398361138c565b91506114968261142f565b604082019050919050565b600060208201905081810360008301526114ba8161147e565b9050919050565b60006060820190506114d66000830186610b77565b6114e36020830185610b77565b6114f06040830184610b77565b949350505050565b60006020828403121561150e5761150d61068d565b5b600082015167ffffffffffffffff81111561152c5761152b610692565b5b61153884828501610e17565b91505092915050565b61154a81610aec565b82525050565b60006060820190506115656000830186610b77565b6115726020830185610b77565b61157f6040830184611541565b949350505050565b7f56657374696e6743616c6c65723a2063726561746520636c61776261636b207660008201527f657374696e67206163636f756e7420666f7220636f6e7472616374206661696c60208201527f6564000000000000000000000000000000000000000000000000000000000000604082015250565b600061160960428361138c565b915061161482611587565b606082019050919050565b60006020820190508181036000830152611638816115fc565b9050919050565b7f56657374696e6743616c6c65723a207570646174652076657374696e6720667560008201527f6e646572206661696c6564000000000000000000000000000000000000000000602082015250565b600061169b602b8361138c565b91506116a68261163f565b604082019050919050565b600060208201905081810360008301526116ca8161168e565b905091905056fea26469706673582212200c0e5b0043edec654be0a450d53af988547ba7d7bb58c9cf6265cc22d8703ba864736f6c63430008130033", + "bytecode": "0x608060405234801561001057600080fd5b50611707806100206000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c806372e7c9ab1161005b57806372e7c9ab146100ec5780637caef81b1461011c5780639cfef12914610126578063cdb50175146101425761007d565b806327e235e3146100825780634fe1a8df146100b45780635a211064146100d0575b600080fd5b61009c600480360381019061009791906106f5565b61015e565b6040516100ab939291906108ca565b60405180910390f35b6100ce60048036038101906100c991906109bb565b6101f1565b005b6100ea60048036038101906100e591906106f5565b6102c9565b005b61010660048036038101906101019190610a77565b61038f565b6040516101139190610aca565b60405180910390f35b610124610421565b005b610140600480360381019061013b9190610a77565b6104eb565b005b61015c60048036038101906101579190610b24565b6105b7565b005b606080606061080373ffffffffffffffffffffffffffffffffffffffff166327e235e3856040518263ffffffff1660e01b815260040161019e9190610b86565b600060405180830381865afa1580156101bb573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906101e49190610e45565b9250925092509193909250565b600061080373ffffffffffffffffffffffffffffffffffffffff16634fe1a8df898989898989896040518863ffffffff1660e01b815260040161023a97969594939291906112e5565b6020604051808303816000875af1158015610259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027d919061135f565b9050806102bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b69061140f565b60405180910390fd5b5050505050505050565b600061080373ffffffffffffffffffffffffffffffffffffffff16635a211064836040518263ffffffff1660e01b81526004016103069190610b86565b6020604051808303816000875af1158015610325573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610349919061135f565b90508061038b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610382906114a1565b60405180910390fd5b5050565b606061080373ffffffffffffffffffffffffffffffffffffffff166372e7c9ab8585856040518463ffffffff1660e01b81526004016103d0939291906114c1565b6000604051808303816000875af11580156103ef573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061041891906114f8565b90509392505050565b600061080373ffffffffffffffffffffffffffffffffffffffff1663cdb50175333060006040518463ffffffff1660e01b815260040161046393929190611550565b6020604051808303816000875af1158015610482573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104a6919061135f565b9050806104e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104df9061161f565b60405180910390fd5b50565b600061080373ffffffffffffffffffffffffffffffffffffffff16639cfef1298585856040518463ffffffff1660e01b815260040161052c939291906114c1565b6020604051808303816000875af115801561054b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061056f919061135f565b9050806105b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105a8906116b1565b60405180910390fd5b50505050565b600061080373ffffffffffffffffffffffffffffffffffffffff1663cdb501758585856040518463ffffffff1660e01b81526004016105f893929190611550565b6020604051808303816000875af1158015610617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063b919061135f565b90508061067d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106749061140f565b60405180910390fd5b50505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106c282610697565b9050919050565b6106d2816106b7565b81146106dd57600080fd5b50565b6000813590506106ef816106c9565b92915050565b60006020828403121561070b5761070a61068d565b5b6000610719848285016106e0565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561078857808201518184015260208101905061076d565b60008484015250505050565b6000601f19601f8301169050919050565b60006107b08261074e565b6107ba8185610759565b93506107ca81856020860161076a565b6107d381610794565b840191505092915050565b6000819050919050565b6107f1816107de565b82525050565b6000604083016000830151848203600086015261081482826107a5565b915050602083015161082960208601826107e8565b508091505092915050565b600061084083836107f7565b905092915050565b6000602082019050919050565b600061086082610722565b61086a818561072d565b93508360208202850161087c8561073e565b8060005b858110156108b857848403895281516108998582610834565b94506108a483610848565b925060208a01995050600181019050610880565b50829750879550505050505092915050565b600060608201905081810360008301526108e48186610855565b905081810360208301526108f88185610855565b9050818103604083015261090c8184610855565b9050949350505050565b600067ffffffffffffffff82169050919050565b61093381610916565b811461093e57600080fd5b50565b6000813590506109508161092a565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261097b5761097a610956565b5b8235905067ffffffffffffffff8111156109985761099761095b565b5b6020830191508360208202830111156109b4576109b3610960565b5b9250929050565b600080600080600080600060a0888a0312156109da576109d961068d565b5b60006109e88a828b016106e0565b97505060206109f98a828b016106e0565b9650506040610a0a8a828b01610941565b955050606088013567ffffffffffffffff811115610a2b57610a2a610692565b5b610a378a828b01610965565b9450945050608088013567ffffffffffffffff811115610a5a57610a59610692565b5b610a668a828b01610965565b925092505092959891949750929550565b600080600060608486031215610a9057610a8f61068d565b5b6000610a9e868287016106e0565b9350506020610aaf868287016106e0565b9250506040610ac0868287016106e0565b9150509250925092565b60006020820190508181036000830152610ae48184610855565b905092915050565b60008115159050919050565b610b0181610aec565b8114610b0c57600080fd5b50565b600081359050610b1e81610af8565b92915050565b600080600060608486031215610b3d57610b3c61068d565b5b6000610b4b868287016106e0565b9350506020610b5c868287016106e0565b9250506040610b6d86828701610b0f565b9150509250925092565b610b80816106b7565b82525050565b6000602082019050610b9b6000830184610b77565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610bd982610794565b810181811067ffffffffffffffff82111715610bf857610bf7610ba1565b5b80604052505050565b6000610c0b610683565b9050610c178282610bd0565b919050565b600067ffffffffffffffff821115610c3757610c36610ba1565b5b602082029050602081019050919050565b600080fd5b600080fd5b600080fd5b600067ffffffffffffffff821115610c7257610c71610ba1565b5b610c7b82610794565b9050602081019050919050565b6000610c9b610c9684610c57565b610c01565b905082815260208101848484011115610cb757610cb6610c52565b5b610cc284828561076a565b509392505050565b600082601f830112610cdf57610cde610956565b5b8151610cef848260208601610c88565b91505092915050565b610d01816107de565b8114610d0c57600080fd5b50565b600081519050610d1e81610cf8565b92915050565b600060408284031215610d3a57610d39610c48565b5b610d446040610c01565b9050600082015167ffffffffffffffff811115610d6457610d63610c4d565b5b610d7084828501610cca565b6000830152506020610d8484828501610d0f565b60208301525092915050565b6000610da3610d9e84610c1c565b610c01565b90508083825260208201905060208402830185811115610dc657610dc5610960565b5b835b81811015610e0d57805167ffffffffffffffff811115610deb57610dea610956565b5b808601610df88982610d24565b85526020850194505050602081019050610dc8565b5050509392505050565b600082601f830112610e2c57610e2b610956565b5b8151610e3c848260208601610d90565b91505092915050565b600080600060608486031215610e5e57610e5d61068d565b5b600084015167ffffffffffffffff811115610e7c57610e7b610692565b5b610e8886828701610e17565b935050602084015167ffffffffffffffff811115610ea957610ea8610692565b5b610eb586828701610e17565b925050604084015167ffffffffffffffff811115610ed657610ed5610692565b5b610ee286828701610e17565b9150509250925092565b610ef581610916565b82525050565b600082825260208201905092915050565b6000819050919050565b60008160070b9050919050565b610f2c81610f16565b8114610f3757600080fd5b50565b600081359050610f4981610f23565b92915050565b6000610f5e6020840184610f3a565b905092915050565b610f6f81610f16565b82525050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112610fa157610fa0610f7f565b5b83810192508235915060208301925067ffffffffffffffff821115610fc957610fc8610f75565b5b602082023603831315610fdf57610fde610f7a565b5b509250929050565b600082825260208201905092915050565b6000819050919050565b6000808335600160200384360303811261101f5761101e610f7f565b5b83810192508235915060208301925067ffffffffffffffff82111561104757611046610f75565b5b60018202360383131561105d5761105c610f7a565b5b509250929050565b82818337600083830152505050565b60006110808385610759565b935061108d838584611065565b61109683610794565b840190509392505050565b6000813590506110b081610cf8565b92915050565b60006110c560208401846110a1565b905092915050565b6000604083016110e06000840184611002565b85830360008701526110f3838284611074565b9250505061110460208401846110b6565b61111160208601826107e8565b508091505092915050565b600061112883836110cd565b905092915050565b60008235600160400383360303811261114c5761114b610f7f565b5b82810191505092915050565b6000602082019050919050565b60006111718385610fe7565b93508360208402850161118384610ff8565b8060005b878110156111c757848403895261119e8284611130565b6111a8858261111c565b94506111b383611158565b925060208a01995050600181019050611187565b50829750879450505050509392505050565b6000604083016111ec6000840184610f4f565b6111f96000860182610f66565b506112076020840184610f84565b858303602087015261121a838284611165565b925050508091505092915050565b600061123483836111d9565b905092915050565b60008235600160400383360303811261125857611257610f7f565b5b82810191505092915050565b6000602082019050919050565b600061127d8385610efb565b93508360208402850161128f84610f0c565b8060005b878110156112d35784840389526112aa828461123c565b6112b48582611228565b94506112bf83611264565b925060208a01995050600181019050611293565b50829750879450505050509392505050565b600060a0820190506112fa600083018a610b77565b6113076020830189610b77565b6113146040830188610eec565b8181036060830152611327818688611271565b9050818103608083015261133c818486611271565b905098975050505050505050565b60008151905061135981610af8565b92915050565b6000602082840312156113755761137461068d565b5b60006113838482850161134a565b91505092915050565b600082825260208201905092915050565b7f56657374696e6743616c6c65723a2063726561746520636c61776261636b207660008201527f657374696e67206163636f756e74206661696c65640000000000000000000000602082015250565b60006113f960358361138c565b91506114048261139d565b604082019050919050565b60006020820190508181036000830152611428816113ec565b9050919050565b7f56657374696e6743616c6c65723a20636f6e7665727420746f20636c6177626160008201527f636b2076657374696e67206163636f756e74206661696c656400000000000000602082015250565b600061148b60398361138c565b91506114968261142f565b604082019050919050565b600060208201905081810360008301526114ba8161147e565b9050919050565b60006060820190506114d66000830186610b77565b6114e36020830185610b77565b6114f06040830184610b77565b949350505050565b60006020828403121561150e5761150d61068d565b5b600082015167ffffffffffffffff81111561152c5761152b610692565b5b61153884828501610e17565b91505092915050565b61154a81610aec565b82525050565b60006060820190506115656000830186610b77565b6115726020830185610b77565b61157f6040830184611541565b949350505050565b7f56657374696e6743616c6c65723a2063726561746520636c61776261636b207660008201527f657374696e67206163636f756e7420666f7220636f6e7472616374206661696c60208201527f6564000000000000000000000000000000000000000000000000000000000000604082015250565b600061160960428361138c565b915061161482611587565b606082019050919050565b60006020820190508181036000830152611638816115fc565b9050919050565b7f56657374696e6743616c6c65723a207570646174652076657374696e6720667560008201527f6e646572206661696c6564000000000000000000000000000000000000000000602082015250565b600061169b602b8361138c565b91506116a68261163f565b604082019050919050565b600060208201905081810360008301526116ca8161168e565b905091905056fea2646970667358221220b5591174fd0eae8c3194a72e4046b55353e35d6f0b4613d06bca7876629b922764736f6c63430008130033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061007d5760003560e01c806372e7c9ab1161005b57806372e7c9ab146100ec5780637caef81b1461011c5780639cfef12914610126578063cdb50175146101425761007d565b806327e235e3146100825780634fe1a8df146100b45780635a211064146100d0575b600080fd5b61009c600480360381019061009791906106f5565b61015e565b6040516100ab939291906108ca565b60405180910390f35b6100ce60048036038101906100c991906109bb565b6101f1565b005b6100ea60048036038101906100e591906106f5565b6102c9565b005b61010660048036038101906101019190610a77565b61038f565b6040516101139190610aca565b60405180910390f35b610124610421565b005b610140600480360381019061013b9190610a77565b6104eb565b005b61015c60048036038101906101579190610b24565b6105b7565b005b606080606061080373ffffffffffffffffffffffffffffffffffffffff166327e235e3856040518263ffffffff1660e01b815260040161019e9190610b86565b600060405180830381865afa1580156101bb573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906101e49190610e45565b9250925092509193909250565b600061080373ffffffffffffffffffffffffffffffffffffffff16634fe1a8df898989898989896040518863ffffffff1660e01b815260040161023a97969594939291906112e5565b6020604051808303816000875af1158015610259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027d919061135f565b9050806102bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b69061140f565b60405180910390fd5b5050505050505050565b600061080373ffffffffffffffffffffffffffffffffffffffff16635a211064836040518263ffffffff1660e01b81526004016103069190610b86565b6020604051808303816000875af1158015610325573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610349919061135f565b90508061038b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610382906114a1565b60405180910390fd5b5050565b606061080373ffffffffffffffffffffffffffffffffffffffff166372e7c9ab8585856040518463ffffffff1660e01b81526004016103d0939291906114c1565b6000604051808303816000875af11580156103ef573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061041891906114f8565b90509392505050565b600061080373ffffffffffffffffffffffffffffffffffffffff1663cdb50175333060006040518463ffffffff1660e01b815260040161046393929190611550565b6020604051808303816000875af1158015610482573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104a6919061135f565b9050806104e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104df9061161f565b60405180910390fd5b50565b600061080373ffffffffffffffffffffffffffffffffffffffff16639cfef1298585856040518463ffffffff1660e01b815260040161052c939291906114c1565b6020604051808303816000875af115801561054b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061056f919061135f565b9050806105b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105a8906116b1565b60405180910390fd5b50505050565b600061080373ffffffffffffffffffffffffffffffffffffffff1663cdb501758585856040518463ffffffff1660e01b81526004016105f893929190611550565b6020604051808303816000875af1158015610617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063b919061135f565b90508061067d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106749061140f565b60405180910390fd5b50505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106c282610697565b9050919050565b6106d2816106b7565b81146106dd57600080fd5b50565b6000813590506106ef816106c9565b92915050565b60006020828403121561070b5761070a61068d565b5b6000610719848285016106e0565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561078857808201518184015260208101905061076d565b60008484015250505050565b6000601f19601f8301169050919050565b60006107b08261074e565b6107ba8185610759565b93506107ca81856020860161076a565b6107d381610794565b840191505092915050565b6000819050919050565b6107f1816107de565b82525050565b6000604083016000830151848203600086015261081482826107a5565b915050602083015161082960208601826107e8565b508091505092915050565b600061084083836107f7565b905092915050565b6000602082019050919050565b600061086082610722565b61086a818561072d565b93508360208202850161087c8561073e565b8060005b858110156108b857848403895281516108998582610834565b94506108a483610848565b925060208a01995050600181019050610880565b50829750879550505050505092915050565b600060608201905081810360008301526108e48186610855565b905081810360208301526108f88185610855565b9050818103604083015261090c8184610855565b9050949350505050565b600067ffffffffffffffff82169050919050565b61093381610916565b811461093e57600080fd5b50565b6000813590506109508161092a565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261097b5761097a610956565b5b8235905067ffffffffffffffff8111156109985761099761095b565b5b6020830191508360208202830111156109b4576109b3610960565b5b9250929050565b600080600080600080600060a0888a0312156109da576109d961068d565b5b60006109e88a828b016106e0565b97505060206109f98a828b016106e0565b9650506040610a0a8a828b01610941565b955050606088013567ffffffffffffffff811115610a2b57610a2a610692565b5b610a378a828b01610965565b9450945050608088013567ffffffffffffffff811115610a5a57610a59610692565b5b610a668a828b01610965565b925092505092959891949750929550565b600080600060608486031215610a9057610a8f61068d565b5b6000610a9e868287016106e0565b9350506020610aaf868287016106e0565b9250506040610ac0868287016106e0565b9150509250925092565b60006020820190508181036000830152610ae48184610855565b905092915050565b60008115159050919050565b610b0181610aec565b8114610b0c57600080fd5b50565b600081359050610b1e81610af8565b92915050565b600080600060608486031215610b3d57610b3c61068d565b5b6000610b4b868287016106e0565b9350506020610b5c868287016106e0565b9250506040610b6d86828701610b0f565b9150509250925092565b610b80816106b7565b82525050565b6000602082019050610b9b6000830184610b77565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610bd982610794565b810181811067ffffffffffffffff82111715610bf857610bf7610ba1565b5b80604052505050565b6000610c0b610683565b9050610c178282610bd0565b919050565b600067ffffffffffffffff821115610c3757610c36610ba1565b5b602082029050602081019050919050565b600080fd5b600080fd5b600080fd5b600067ffffffffffffffff821115610c7257610c71610ba1565b5b610c7b82610794565b9050602081019050919050565b6000610c9b610c9684610c57565b610c01565b905082815260208101848484011115610cb757610cb6610c52565b5b610cc284828561076a565b509392505050565b600082601f830112610cdf57610cde610956565b5b8151610cef848260208601610c88565b91505092915050565b610d01816107de565b8114610d0c57600080fd5b50565b600081519050610d1e81610cf8565b92915050565b600060408284031215610d3a57610d39610c48565b5b610d446040610c01565b9050600082015167ffffffffffffffff811115610d6457610d63610c4d565b5b610d7084828501610cca565b6000830152506020610d8484828501610d0f565b60208301525092915050565b6000610da3610d9e84610c1c565b610c01565b90508083825260208201905060208402830185811115610dc657610dc5610960565b5b835b81811015610e0d57805167ffffffffffffffff811115610deb57610dea610956565b5b808601610df88982610d24565b85526020850194505050602081019050610dc8565b5050509392505050565b600082601f830112610e2c57610e2b610956565b5b8151610e3c848260208601610d90565b91505092915050565b600080600060608486031215610e5e57610e5d61068d565b5b600084015167ffffffffffffffff811115610e7c57610e7b610692565b5b610e8886828701610e17565b935050602084015167ffffffffffffffff811115610ea957610ea8610692565b5b610eb586828701610e17565b925050604084015167ffffffffffffffff811115610ed657610ed5610692565b5b610ee286828701610e17565b9150509250925092565b610ef581610916565b82525050565b600082825260208201905092915050565b6000819050919050565b60008160070b9050919050565b610f2c81610f16565b8114610f3757600080fd5b50565b600081359050610f4981610f23565b92915050565b6000610f5e6020840184610f3a565b905092915050565b610f6f81610f16565b82525050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112610fa157610fa0610f7f565b5b83810192508235915060208301925067ffffffffffffffff821115610fc957610fc8610f75565b5b602082023603831315610fdf57610fde610f7a565b5b509250929050565b600082825260208201905092915050565b6000819050919050565b6000808335600160200384360303811261101f5761101e610f7f565b5b83810192508235915060208301925067ffffffffffffffff82111561104757611046610f75565b5b60018202360383131561105d5761105c610f7a565b5b509250929050565b82818337600083830152505050565b60006110808385610759565b935061108d838584611065565b61109683610794565b840190509392505050565b6000813590506110b081610cf8565b92915050565b60006110c560208401846110a1565b905092915050565b6000604083016110e06000840184611002565b85830360008701526110f3838284611074565b9250505061110460208401846110b6565b61111160208601826107e8565b508091505092915050565b600061112883836110cd565b905092915050565b60008235600160400383360303811261114c5761114b610f7f565b5b82810191505092915050565b6000602082019050919050565b60006111718385610fe7565b93508360208402850161118384610ff8565b8060005b878110156111c757848403895261119e8284611130565b6111a8858261111c565b94506111b383611158565b925060208a01995050600181019050611187565b50829750879450505050509392505050565b6000604083016111ec6000840184610f4f565b6111f96000860182610f66565b506112076020840184610f84565b858303602087015261121a838284611165565b925050508091505092915050565b600061123483836111d9565b905092915050565b60008235600160400383360303811261125857611257610f7f565b5b82810191505092915050565b6000602082019050919050565b600061127d8385610efb565b93508360208402850161128f84610f0c565b8060005b878110156112d35784840389526112aa828461123c565b6112b48582611228565b94506112bf83611264565b925060208a01995050600181019050611293565b50829750879450505050509392505050565b600060a0820190506112fa600083018a610b77565b6113076020830189610b77565b6113146040830188610eec565b8181036060830152611327818688611271565b9050818103608083015261133c818486611271565b905098975050505050505050565b60008151905061135981610af8565b92915050565b6000602082840312156113755761137461068d565b5b60006113838482850161134a565b91505092915050565b600082825260208201905092915050565b7f56657374696e6743616c6c65723a2063726561746520636c61776261636b207660008201527f657374696e67206163636f756e74206661696c65640000000000000000000000602082015250565b60006113f960358361138c565b91506114048261139d565b604082019050919050565b60006020820190508181036000830152611428816113ec565b9050919050565b7f56657374696e6743616c6c65723a20636f6e7665727420746f20636c6177626160008201527f636b2076657374696e67206163636f756e74206661696c656400000000000000602082015250565b600061148b60398361138c565b91506114968261142f565b604082019050919050565b600060208201905081810360008301526114ba8161147e565b9050919050565b60006060820190506114d66000830186610b77565b6114e36020830185610b77565b6114f06040830184610b77565b949350505050565b60006020828403121561150e5761150d61068d565b5b600082015167ffffffffffffffff81111561152c5761152b610692565b5b61153884828501610e17565b91505092915050565b61154a81610aec565b82525050565b60006060820190506115656000830186610b77565b6115726020830185610b77565b61157f6040830184611541565b949350505050565b7f56657374696e6743616c6c65723a2063726561746520636c61776261636b207660008201527f657374696e67206163636f756e7420666f7220636f6e7472616374206661696c60208201527f6564000000000000000000000000000000000000000000000000000000000000604082015250565b600061160960428361138c565b915061161482611587565b606082019050919050565b60006020820190508181036000830152611638816115fc565b9050919050565b7f56657374696e6743616c6c65723a207570646174652076657374696e6720667560008201527f6e646572206661696c6564000000000000000000000000000000000000000000602082015250565b600061169b602b8361138c565b91506116a68261163f565b604082019050919050565b600060208201905081810360008301526116ca8161168e565b905091905056fea2646970667358221220b5591174fd0eae8c3194a72e4046b55353e35d6f0b4613d06bca7876629b922764736f6c63430008130033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/precompiles/vesting/vesting.go b/precompiles/vesting/vesting.go index dac8e040e0..fd0b366fc3 100644 --- a/precompiles/vesting/vesting.go +++ b/precompiles/vesting/vesting.go @@ -65,7 +65,7 @@ func NewPrecompile( return nil, fmt.Errorf("error loading the staking ABI %s", err) } - return &Precompile{ + p := &Precompile{ Precompile: cmn.Precompile{ ABI: newAbi, AuthzKeeper: authzKeeper, @@ -74,18 +74,15 @@ func NewPrecompile( ApprovalExpiration: cmn.DefaultExpirationDuration, // should be configurable in the future. }, vestingKeeper: vestingKeeper, - }, nil -} - -// Address defines the address of the staking compile contract. -// address: 0x0000000000000000000000000000000000000803 -func (Precompile) Address() common.Address { - return common.HexToAddress(PrecompileAddress) + } + // SetAddress defines the address of the bank compile contract. + p.SetAddress(common.HexToAddress(PrecompileAddress)) + return p, nil } // Run executes the precompiled contract staking methods defined in the ABI. func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, readOnly bool) (bz []byte, err error) { - ctx, stateDB, method, initialGas, args, err := p.RunSetup(evm, contract, readOnly, p.IsTransaction) + ctx, stateDB, snapshot, method, initialGas, args, err := p.RunSetup(evm, contract, readOnly, p.IsTransaction) if err != nil { return nil, err } @@ -94,10 +91,6 @@ func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, readOnly bool) (bz [ // It avoids panics and returns the out of gas error so the EVM can continue gracefully. defer cmn.HandleGasError(ctx, contract, initialGas, &err)() - if err := stateDB.Commit(); err != nil { - return nil, err - } - switch method.Name { // Approval transaction case authorization.ApproveMethod: @@ -128,6 +121,10 @@ func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, readOnly bool) (bz [ return nil, vm.ErrOutOfGas } + if err := p.AddJournalEntries(stateDB, snapshot); err != nil { + return nil, err + } + return bz, nil } diff --git a/precompiles/werc20/werc20.go b/precompiles/werc20/werc20.go index 05f116b503..aebc9417dd 100644 --- a/precompiles/werc20/werc20.go +++ b/precompiles/werc20/werc20.go @@ -100,7 +100,7 @@ func (p Precompile) RequiredGas(input []byte) uint64 { // Run executes the precompiled contract WERC20 methods defined in the ABI. func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, readOnly bool) (bz []byte, err error) { - ctx, stateDB, method, initialGas, args, err := p.Precompile.RunSetup(evm, contract, readOnly, p.IsTransaction) + ctx, stateDB, snapshot, method, initialGas, args, err := p.RunSetup(evm, contract, readOnly, p.IsTransaction) if err != nil { return nil, err } @@ -132,7 +132,9 @@ func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, readOnly bool) (bz [ if !contract.UseGas(cost) { return nil, vm.ErrOutOfGas } - + if err := p.AddJournalEntries(stateDB, snapshot); err != nil { + return nil, err + } return bz, nil } diff --git a/tests/nix_tests/cosmoscli.py b/tests/nix_tests/cosmoscli.py index bb10de65e6..bbe1f1f601 100644 --- a/tests/nix_tests/cosmoscli.py +++ b/tests/nix_tests/cosmoscli.py @@ -869,6 +869,24 @@ def ibc_transfer( ) ) + def escrow_address(self, channel, **kwargs): + default_kwargs = { + "node": self.node_rpc, + "output": "json", + } + return ( + self.raw( + "q", + "ibc-transfer", + "escrow-address", + "transfer", + channel, + **(default_kwargs | kwargs), + ) + .decode() + .strip() + ) + def register_counterparty_payee( self, port_id, channel_id, relayer, counterparty_payee, **kwargs ): diff --git a/tests/nix_tests/test_ics20_precompile.py b/tests/nix_tests/test_ics20_precompile.py index fb36b1bbfe..db75b0cc2f 100644 --- a/tests/nix_tests/test_ics20_precompile.py +++ b/tests/nix_tests/test_ics20_precompile.py @@ -1,15 +1,21 @@ +import json import pytest from .ibc_utils import EVMOS_IBC_DENOM, assert_ready, get_balance, prepare_network from .network import Evmos from .utils import ( + ACCOUNTS, ADDRS, CONTRACTS, KEYS, + debug_trace_tx, + decode_bech32, deploy_contract, + eth_to_bech32, get_precompile_contract, send_transaction, wait_for_fn, + wait_for_new_blocks, ) @@ -206,3 +212,677 @@ def check_dest_balance(): counter_after = eth_contract.functions.counter().call() assert counter_after == 0 + + +@pytest.mark.parametrize( + "name, src_addr, other_addr, transfer_before, transfer_after", + [ + ( + "IBC transfer with internal transfer before and after the precompile call", + ADDRS["signer2"], + None, + True, + True, + ), + ( + "IBC transfer with internal transfer before the precompile call", + ADDRS["signer2"], + None, + True, + False, + ), + ( + "IBC transfer with internal transfer after the precompile call", + ADDRS["signer2"], + None, + False, + True, + ), + ( + "IBC transfer with internal transfer to the escrow addr before and after the precompile call", + ADDRS["signer2"], + "ESCROW_ADDR", + True, + True, + ), + ( + "IBC transfer with internal transfer to the escrow addr before the precompile call", + ADDRS["signer2"], + "ESCROW_ADDR", + True, + False, + ), + ( + "IBC transfer with internal transfer to the escrow addr after the precompile call", + ADDRS["signer2"], + "ESCROW_ADDR", + False, + True, + ), + ], +) +def test_ibc_transfer_from_eoa_with_internal_transfer( + ibc, name, src_addr, other_addr, transfer_before, transfer_after +): + """ + Test ibc transfer from contract + with an internal transfer within the contract call + """ + assert_ready(ibc) + + evmos: Evmos = ibc.chains["evmos"] + w3 = evmos.w3 + + channel = "channel-0" + amt = 1000000000000000000 + src_denom = "aevmos" + gas_limit = 200_000 + evmos_gas_price = w3.eth.gas_price + + dst_addr = ibc.chains["chainmain"].cosmos_cli().address("signer2") + # address that will escrow the aevmos tokens when transferring via IBC + escrow_bech32 = evmos.cosmos_cli().escrow_address(channel) + + if other_addr is None: + other_addr = src_addr + elif other_addr == "ESCROW_ADDR": + other_addr = decode_bech32(escrow_bech32) + + # Deployment of contracts and initial checks + initial_contract_balance = 100 + eth_contract = setup_interchain_sender_contract( + evmos, ACCOUNTS["signer2"], amt, initial_contract_balance + ) + + # get starting balances to check after the tx + src_bech32 = evmos.cosmos_cli().address("signer2") + contract_bech32 = eth_to_bech32(eth_contract.address) + other_addr_bech32 = eth_to_bech32(other_addr) + + src_starting_balance = get_balance(ibc.chains["evmos"], src_bech32, "aevmos") + dest_starting_balance = get_balance( + ibc.chains["chainmain"], dst_addr, EVMOS_IBC_DENOM + ) + other_addr_initial_balance = get_balance( + ibc.chains["evmos"], other_addr_bech32, src_denom + ) + escrow_initial_balance = get_balance(ibc.chains["evmos"], escrow_bech32, src_denom) + + # Calling the actual transfer function on the custom contract + send_tx = eth_contract.functions.testTransferFundsWithTransferToOtherAcc( + other_addr, + src_addr, + "transfer", + channel, + src_denom, + amt, + dst_addr, + transfer_before, + transfer_after, + ).build_transaction( + {"from": ADDRS["signer2"], "gasPrice": evmos_gas_price, "gas": gas_limit} + ) + receipt = send_transaction(ibc.chains["evmos"].w3, send_tx, KEYS["signer2"]) + assert receipt.status == 1, f"Failed {name}" + fees = receipt.gasUsed * evmos_gas_price + + final_dest_balance = dest_starting_balance + + def check_dest_balance(): + nonlocal final_dest_balance + final_dest_balance = get_balance( + ibc.chains["chainmain"], dst_addr, EVMOS_IBC_DENOM + ) + return final_dest_balance > dest_starting_balance + + wait_for_fn("destination balance change", check_dest_balance) + assert final_dest_balance == dest_starting_balance + amt + + # estimate the expected amt transferred and counter state + # based on the test case + exp_amt_tranferred_internally = ( + 30 + if transfer_after and transfer_before + else 0 if not transfer_after and not transfer_before else 15 + ) + exp_counter_after = ( + 2 + if transfer_after and transfer_before + else 0 if not transfer_after and not transfer_before else 1 + ) + + exp_src_final_bal = src_starting_balance - amt - fees + exp_escrow_final_bal = escrow_initial_balance + amt + if other_addr == src_addr: + exp_src_final_bal += exp_amt_tranferred_internally + elif other_addr == decode_bech32(escrow_bech32): + other_addr_final_balance = get_balance( + ibc.chains["evmos"], escrow_bech32, src_denom + ) + # check the escrow account escrowed the coins successfully + # and received the transferred tokens during the contract call + exp_escrow_final_bal += exp_amt_tranferred_internally + else: + other_addr_final_balance = get_balance( + ibc.chains["evmos"], other_addr_bech32, src_denom + ) + assert ( + other_addr_final_balance + == other_addr_initial_balance + exp_amt_tranferred_internally + ) + + # check final balance for source address (tx signer) + src_final_amount_evmos = get_balance(ibc.chains["evmos"], src_bech32, src_denom) + assert src_final_amount_evmos == exp_src_final_bal, f"Failed {name}" + + # Check contracts final state (balance & counter) + contract_final_balance = get_balance( + ibc.chains["evmos"], contract_bech32, src_denom + ) + assert ( + contract_final_balance + == initial_contract_balance - exp_amt_tranferred_internally + ), f"Failed {name}" + + counter_after = eth_contract.functions.counter().call() + assert counter_after == exp_counter_after, f"Failed {name}" + + # check escrow account balance is updated properly + escrow_final_balance = get_balance(ibc.chains["evmos"], escrow_bech32, src_denom) + assert escrow_final_balance == exp_escrow_final_bal + + +@pytest.mark.parametrize( + "name, src_addr, ibc_transfer_amt, transfer_before, transfer_between, transfer_after, err_contains", + [ + ( + "Two IBC transfers with internal transfer before, between and after the precompile call", + ADDRS["signer2"], + int(1e18), + True, + True, + True, + None, + ), + ( + "Two IBC transfers with internal transfer before and between the precompile call", + ADDRS["signer2"], + int(1e18), + True, + True, + False, + None, + ), + ( + "Two IBC transfers with internal transfer between and after the precompile call", + ADDRS["signer2"], + int(1e18), + False, + True, + True, + None, + ), + ( + "Two IBC transfers with internal transfer before and after the precompile call", + ADDRS["signer2"], + int(1e18), + True, + False, + True, + None, + ), + ( + "Two IBC transfers with internal transfer before and between, and second IBC transfer fails", + ADDRS["signer2"], + int(35000e18), + True, + True, + False, + "insufficient funds", + ), + ], +) +def test_ibc_multi_transfer_from_eoa_with_internal_transfer( + ibc, + name, + src_addr, + ibc_transfer_amt, + transfer_before, + transfer_between, + transfer_after, + err_contains, +): + """ + Test ibc transfer from contract + with an internal transfer within the contract call + """ + assert_ready(ibc) + + evmos: Evmos = ibc.chains["evmos"] + w3 = evmos.w3 + + src_denom = "aevmos" + gas_limit = 800_000 + evmos_gas_price = w3.eth.gas_price + + dst_addr = ibc.chains["chainmain"].cosmos_cli().address("signer2") + escrow_bech32 = evmos.cosmos_cli().escrow_address("channel-0") + + # Deployment of contracts and initial checks + initial_contract_balance = 100 + eth_contract = setup_interchain_sender_contract( + evmos, ACCOUNTS["signer2"], ibc_transfer_amt, initial_contract_balance + ) + + # send some funds (100 aevmos) to the contract to perform + # internal transfer within the tx + src_bech32 = eth_to_bech32(src_addr) + contract_bech32 = eth_to_bech32(eth_contract.address) + + # get starting balances to check after the tx + src_starting_balance = get_balance(evmos, src_bech32, "aevmos") + dest_starting_balance = get_balance( + ibc.chains["chainmain"], dst_addr, EVMOS_IBC_DENOM + ) + escrow_initial_balance = get_balance(evmos, escrow_bech32, src_denom) + + # Calling the actual transfer function on the custom contract + send_tx = eth_contract.functions.testMultiTransferWithInternalTransfer( + src_addr, + "transfer", + "channel-0", + src_denom, + ibc_transfer_amt, + dst_addr, + transfer_before, + transfer_between, + transfer_after, + ).build_transaction( + {"from": ADDRS["signer2"], "gasPrice": evmos_gas_price, "gas": gas_limit} + ) + receipt = send_transaction(ibc.chains["evmos"].w3, send_tx, KEYS["signer2"]) + + escrow_final_balance = get_balance(ibc.chains["evmos"], escrow_bech32, src_denom) + + if err_contains is not None: + assert receipt.status == 0 + # check error msg + # get the corresponding error message from the trace + trace = debug_trace_tx(ibc.chains["evmos"], receipt.transactionHash.hex()) + # stringify the tx trace to look for the expected error message + trace_str = json.dumps(trace, separators=(",", ":")) + assert err_contains in trace_str + + # check balances where reverted accordingly + # Check contracts final state (balance & counter) + contract_final_balance = get_balance( + ibc.chains["evmos"], contract_bech32, src_denom + ) + assert contract_final_balance == initial_contract_balance, f"Failed {name}" + counter_after = eth_contract.functions.counter().call() + assert counter_after == 0, f"Failed {name}" + + # check sender balance was decreased only by fees paid + src_final_amount_evmos = get_balance(ibc.chains["evmos"], src_bech32, src_denom) + fees = receipt.gasUsed * evmos_gas_price + + exp_src_final_bal = src_starting_balance - fees + assert src_final_amount_evmos == exp_src_final_bal, f"Failed {name}" + + # check balance on destination chain + # wait a couple of blocks to check on the other chain + wait_for_new_blocks(ibc.chains["chainmain"].cosmos_cli(), 5) + dest_final_balance = get_balance( + ibc.chains["chainmain"], dst_addr, EVMOS_IBC_DENOM + ) + assert dest_final_balance == dest_starting_balance + + # escrow account balance should be same as initial balance + assert escrow_final_balance == escrow_initial_balance + + return + + assert receipt.status == 1, debug_trace_tx( + ibc.chains["evmos"], receipt.transactionHash.hex() + ) + fees = receipt.gasUsed * evmos_gas_price + + final_dest_balance = dest_starting_balance + + def check_dest_balance(): + nonlocal final_dest_balance + final_dest_balance = get_balance( + ibc.chains["chainmain"], dst_addr, EVMOS_IBC_DENOM + ) + return final_dest_balance > dest_starting_balance + + wait_for_fn("destination balance change", check_dest_balance) + assert final_dest_balance == dest_starting_balance + ibc_transfer_amt + + # check the balance was escrowed + assert escrow_final_balance == escrow_initial_balance + ibc_transfer_amt + + # estimate the expected amt transferred and counter state + # based on the test case + exp_amt_tranferred_internally = 0 + exp_counter_after = 0 + for transferred in [transfer_after, transfer_between, transfer_before]: + if transferred: + exp_amt_tranferred_internally += 15 + exp_counter_after += 1 + + # check final balance for source address (tx signer) + src_final_amount_evmos = get_balance(ibc.chains["evmos"], src_bech32, src_denom) + exp_src_final_bal = ( + src_starting_balance - ibc_transfer_amt - fees + exp_amt_tranferred_internally + ) + assert src_final_amount_evmos == exp_src_final_bal, f"Failed {name}" + + # Check contracts final state (balance & counter) + contract_final_balance = get_balance( + ibc.chains["evmos"], contract_bech32, src_denom + ) + assert ( + contract_final_balance + == initial_contract_balance - exp_amt_tranferred_internally + ), f"Failed {name}" + + counter_after = eth_contract.functions.counter().call() + assert counter_after == exp_counter_after, f"Failed {name}" + + +def test_multi_ibc_transfers_with_revert(ibc): + """ + Test ibc transfer from contract + with an internal transfer within the contract call + """ + assert_ready(ibc) + + evmos: Evmos = ibc.chains["evmos"] + w3 = evmos.w3 + + src_denom = "aevmos" + gas_limit = 800_000 + ibc_transfer_amt = int(1e18) + src_addr = ADDRS["signer2"] + evmos_gas_price = ibc.chains["evmos"].w3.eth.gas_price + + dst_addr = ibc.chains["chainmain"].cosmos_cli().address("signer2") + escrow_bech32 = ibc.chains["evmos"].cosmos_cli().escrow_address("channel-0") + + # Deployment of contracts and initial checks + initial_contract_balance = 100 + interchain_sender_contract = setup_interchain_sender_contract( + evmos, ACCOUNTS["signer2"], ibc_transfer_amt * 2, initial_contract_balance + ) + + counter = interchain_sender_contract.functions.counter().call() + assert counter == 0 + + caller_contract, tx_receipt = deploy_contract( + w3, CONTRACTS["InterchainSenderCaller"], [interchain_sender_contract.address] + ) + assert tx_receipt.status == 1 + + counter = caller_contract.functions.counter().call() + assert counter == 0 + + src_bech32 = eth_to_bech32(src_addr) + interchain_sender_contract_bech32 = eth_to_bech32( + interchain_sender_contract.address + ) + + # get starting balances to check after the tx + src_starting_balance = get_balance(ibc.chains["evmos"], src_bech32, "aevmos") + dest_starting_balance = get_balance( + ibc.chains["chainmain"], dst_addr, EVMOS_IBC_DENOM + ) + escrow_initial_balance = get_balance(ibc.chains["evmos"], escrow_bech32, src_denom) + + # Calling the actual transfer function on the custom contract + send_tx = caller_contract.functions.transfersWithRevert( + src_addr, + "transfer", + "channel-0", + src_denom, + ibc_transfer_amt, + dst_addr, + ).build_transaction( + {"from": ADDRS["signer2"], "gasPrice": evmos_gas_price, "gas": gas_limit} + ) + receipt = send_transaction(ibc.chains["evmos"].w3, send_tx, KEYS["signer2"]) + + escrow_final_balance = get_balance(ibc.chains["evmos"], escrow_bech32, src_denom) + + assert receipt.status == 1, debug_trace_tx( + ibc.chains["evmos"], receipt.transactionHash.hex() + ) + fees = receipt.gasUsed * evmos_gas_price + + final_dest_balance = dest_starting_balance + + def check_dest_balance(): + nonlocal final_dest_balance + final_dest_balance = get_balance( + ibc.chains["chainmain"], dst_addr, EVMOS_IBC_DENOM + ) + return final_dest_balance > dest_starting_balance + + wait_for_fn("destination balance change", check_dest_balance) + assert final_dest_balance == dest_starting_balance + ibc_transfer_amt + + # check the balance was escrowed + # note that 4 ibc-transfers where included in the tx for a total + # of 2 x ibc_transfer_amt, but 2 of these transfers where reverted + assert escrow_final_balance == escrow_initial_balance + ibc_transfer_amt + + # estimate the expected amt transferred and counter state + # based on the test case + exp_amt_tranferred_internally = 45 + exp_interchain_sender_counter_after = 3 + + # check final balance for source address (tx signer) + src_final_amount_evmos = get_balance(ibc.chains["evmos"], src_bech32, src_denom) + exp_src_final_bal = ( + src_starting_balance - fees - ibc_transfer_amt + exp_amt_tranferred_internally + ) + assert src_final_amount_evmos == exp_src_final_bal + + # Check contracts final state (balance & counter) + contract_final_balance = get_balance( + ibc.chains["evmos"], interchain_sender_contract_bech32, src_denom + ) + assert ( + contract_final_balance + == initial_contract_balance - exp_amt_tranferred_internally + ) + + counter_after = interchain_sender_contract.functions.counter().call() + assert counter_after == exp_interchain_sender_counter_after + + counter_after = caller_contract.functions.counter().call() + assert counter_after == 2 + + +def test_multi_ibc_transfers_with_nested_revert(ibc): + """ + Test multiple ibc transfer from contract + with an internal transfer within the contract call + and a nested revert + """ + assert_ready(ibc) + + evmos: Evmos = ibc.chains["evmos"] + w3 = evmos.w3 + + src_denom = "aevmos" + gas_limit = 800_000 + ibc_transfer_amt = int(1e18) + src_addr = ADDRS["signer2"] + evmos_gas_price = ibc.chains["evmos"].w3.eth.gas_price + + dst_addr = ibc.chains["chainmain"].cosmos_cli().address("signer2") + escrow_bech32 = ibc.chains["evmos"].cosmos_cli().escrow_address("channel-0") + + # Deployment of contracts and initial checks + initial_contract_balance = 100 + interchain_sender_contract = setup_interchain_sender_contract( + evmos, ACCOUNTS["signer2"], ibc_transfer_amt * 2, initial_contract_balance + ) + + counter = interchain_sender_contract.functions.counter().call() + assert counter == 0 + + caller_contract, tx_receipt = deploy_contract( + w3, CONTRACTS["InterchainSenderCaller"], [interchain_sender_contract.address] + ) + assert tx_receipt.status == 1 + + counter = caller_contract.functions.counter().call() + assert counter == 0 + + src_bech32 = eth_to_bech32(src_addr) + interchain_sender_contract_bech32 = eth_to_bech32( + interchain_sender_contract.address + ) + + # get starting balances to check after the tx + src_starting_balance = get_balance(ibc.chains["evmos"], src_bech32, "aevmos") + dest_starting_balance = get_balance( + ibc.chains["chainmain"], dst_addr, EVMOS_IBC_DENOM + ) + escrow_initial_balance = get_balance(ibc.chains["evmos"], escrow_bech32, src_denom) + + # Calling the actual transfer function on the custom contract + send_tx = caller_contract.functions.transfersWithNestedRevert( + src_addr, + "transfer", + "channel-0", + src_denom, + ibc_transfer_amt, + dst_addr, + ).build_transaction( + {"from": ADDRS["signer2"], "gasPrice": evmos_gas_price, "gas": gas_limit} + ) + receipt = send_transaction(ibc.chains["evmos"].w3, send_tx, KEYS["signer2"]) + + escrow_final_balance = get_balance(ibc.chains["evmos"], escrow_bech32, src_denom) + + # tx should be successfull, but all transfers should be reverted + # only the contract's state should've changed (counter) + exp_caller_contract_final_counter = 2 + assert receipt.status == 1, debug_trace_tx( + ibc.chains["evmos"], receipt.transactionHash.hex() + ) + fees = receipt.gasUsed * evmos_gas_price + + final_dest_balance = dest_starting_balance + + tries = 0 + + def check_dest_balance(): + nonlocal tries + nonlocal final_dest_balance + tries += 1 + final_dest_balance = get_balance( + ibc.chains["chainmain"], dst_addr, EVMOS_IBC_DENOM + ) + if tries == 7: + return True + return final_dest_balance > dest_starting_balance + + wait_for_fn("destination balance change", check_dest_balance) + assert final_dest_balance == dest_starting_balance + + # check the balance was escrowed + # note that 4 ibc-transfers where included in the tx for a total + # of 2 x ibc_transfer_amt, but 2 of these transfers where reverted + assert escrow_final_balance == escrow_initial_balance + + # estimate the expected amt transferred and counter state + # based on the test case + exp_interchain_sender_counter_after = 0 + + # check final balance for source address (tx signer) + src_final_amount_evmos = get_balance(ibc.chains["evmos"], src_bech32, src_denom) + exp_src_final_bal = src_starting_balance - fees + assert src_final_amount_evmos == exp_src_final_bal + + # Check contracts final state (balance & counter) + contract_final_balance = get_balance( + ibc.chains["evmos"], interchain_sender_contract_bech32, src_denom + ) + assert contract_final_balance == initial_contract_balance + + counter_after = interchain_sender_contract.functions.counter().call() + assert counter_after == exp_interchain_sender_counter_after + + counter_after = caller_contract.functions.counter().call() + assert counter_after == exp_caller_contract_final_counter + + +def setup_interchain_sender_contract( + evmos, src_acc, transfer_amt, initial_contract_balance +): + """ + Helper function to setup the InterchainSender contract + used in tests. It deploys the contract, creates an authorization + for the contract to use the provided src_acc's funds, + and sends some funds to the InterchainSender contract + for internal transactions within its methods. + It returns the deployed contract + """ + src_denom = "aevmos" + gas_limit = 200_000 + evmos_gas_price = evmos.w3.eth.gas_price + # Deployment of contracts and initial checks + eth_contract, tx_receipt = deploy_contract(evmos.w3, CONTRACTS["InterchainSender"]) + assert tx_receipt.status == 1 + + counter = eth_contract.functions.counter().call() + assert counter == 0 + + pc = get_precompile_contract(evmos.w3, "ICS20I") + # Approve the contract to spend the src_denom + approve_tx = pc.functions.approve( + eth_contract.address, + [["transfer", "channel-0", [[src_denom, transfer_amt]], [], []]], + ).build_transaction( + { + "from": src_acc.address, + "gasPrice": evmos_gas_price, + "gas": gas_limit, + } + ) + tx_receipt = send_transaction(evmos.w3, approve_tx, src_acc.key) + assert tx_receipt.status == 1 + + def check_allowance_set(): + new_allowance = pc.functions.allowance( + eth_contract.address, src_acc.address + ).call() + return new_allowance != [] + + wait_for_fn("allowance has changed", check_allowance_set) + + # send some funds (100 aevmos) to the contract to perform + # internal transfer within the tx + src_bech32 = eth_to_bech32(src_acc.address) + contract_bech32 = eth_to_bech32(eth_contract.address) + fund_tx = evmos.cosmos_cli().transfer( + src_bech32, + contract_bech32, + f"{initial_contract_balance}aevmos", + gas_prices=f"{evmos_gas_price + 100000}aevmos", + generate_only=True, + ) + + fund_tx = evmos.cosmos_cli().sign_tx_json(fund_tx, src_bech32, max_priority_price=0) + rsp = evmos.cosmos_cli().broadcast_tx_json(fund_tx, broadcast_mode="sync") + assert rsp["code"] == 0, rsp["raw_log"] + txhash = rsp["txhash"] + wait_for_new_blocks(evmos.cosmos_cli(), 2) + receipt = evmos.cosmos_cli().tx_search_rpc(f"tx.hash='{txhash}'")[0] + assert receipt["tx_result"]["code"] == 0, rsp["raw_log"] + + return eth_contract diff --git a/tests/nix_tests/test_precompiles.py b/tests/nix_tests/test_precompiles.py index e9c0efdb4d..f8bfd9ac7d 100644 --- a/tests/nix_tests/test_precompiles.py +++ b/tests/nix_tests/test_precompiles.py @@ -67,7 +67,7 @@ def test_ibc_transfer(ibc): assert receipt.status == 1 # check gas used - assert receipt.gasUsed == 49307 + assert receipt.gasUsed == 48184 # check gas estimation is accurate assert receipt.gasUsed == gas_estimation diff --git a/tests/nix_tests/utils.py b/tests/nix_tests/utils.py index 68bd29b503..8e76b6c5fa 100644 --- a/tests/nix_tests/utils.py +++ b/tests/nix_tests/utils.py @@ -42,6 +42,8 @@ "Mars": "Mars.sol", "StateContract": "StateContract.sol", "ICS20FromContract": "ICS20FromContract.sol", + "InterchainSender": "evmos/testutil/contracts/InterchainSender.sol", + "InterchainSenderCaller": "evmos/testutil/contracts/InterchainSenderCaller.sol", "ICS20I": "evmos/ics20/ICS20I.sol", "DistributionI": "evmos/distribution/DistributionI.sol", "DistributionCaller": "evmos/testutil/contracts/DistributionCaller.sol", diff --git a/x/evm/keeper/state_transition.go b/x/evm/keeper/state_transition.go index f51d249ccc..5f8db539e9 100644 --- a/x/evm/keeper/state_transition.go +++ b/x/evm/keeper/state_transition.go @@ -185,7 +185,6 @@ func (k *Keeper) ApplyTransaction(ctx sdk.Context, tx *ethtypes.Transaction) (*t if !res.Failed() { commit() - ctx.EventManager().EmitEvents(tmpCtx.EventManager().Events()) } // refund gas in order to match the Ethereum gas consumption instead of the default SDK one. diff --git a/x/evm/statedb/integration_test.go b/x/evm/statedb/integration_test.go index f2dce513de..2c0829b5e3 100644 --- a/x/evm/statedb/integration_test.go +++ b/x/evm/statedb/integration_test.go @@ -11,11 +11,11 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/evmos/evmos/v18/contracts" stakingprecompile "github.com/evmos/evmos/v18/precompiles/staking" + testcontracts "github.com/evmos/evmos/v18/precompiles/testutil/contracts" testfactory "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" testnetwork "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - "github.com/evmos/evmos/v18/x/evm/statedb/testdata" evmtypes "github.com/evmos/evmos/v18/x/evm/types" //nolint:revive // okay to use dot imports for Ginkgo @@ -29,8 +29,13 @@ func TestNestedEVMExtensionCall(t *testing.T) { RunSpecs(t, "Nested EVM Extension Call Test Suite") } -// NOTE: This must ONLY be added to the main repository once the vulnerability has been patched! -// +type testCase struct { + method string + expDelegation bool + expSenderERC20Balance *big.Int + expContractERC20Balance *big.Int +} + // This test is a demonstration of the flash loan exploit that was reported. // This happens when interacting with EVM extensions in smart contract methods, // where a resulting state change has the same value as the original state value. @@ -75,21 +80,21 @@ var _ = Describe("testing the flash loan exploit", Ordered, func() { stakingPrecompile, err = stakingprecompile.NewPrecompile(network.App.StakingKeeper, network.App.AuthzKeeper) Expect(err).ToNot(HaveOccurred(), "failed to create staking precompile") + // Load the flash loan contract from the compiled JSON data. + flashLoanContract, err = testcontracts.LoadFlashLoanContract() + Expect(err).ToNot(HaveOccurred(), "failed to load flash loan contract") + }) + + BeforeEach(func() { valsRes, err := handler.GetBondedValidators() Expect(err).ToNot(HaveOccurred(), "failed to get bonded validators") validatorToDelegateTo = valsRes.Validators[0].OperatorAddress - res, err := handler.GetDelegation(deployer.AccAddr.String(), validatorToDelegateTo) + qRes, err := handler.GetDelegation(deployer.AccAddr.String(), validatorToDelegateTo) Expect(err).ToNot(HaveOccurred(), "failed to get delegation") - delegatedAmountPre = res.DelegationResponse.Balance.Amount + delegatedAmountPre = qRes.DelegationResponse.Balance.Amount - // Load the flash loan contract from the compiled JSON data - flashLoanContract, err = testdata.LoadFlashLoanContract() - Expect(err).ToNot(HaveOccurred(), "failed to load flash loan contract") - }) - - It("should deploy an ERC-20 token contract", func() { - var err error + // Deploy an ERC-20 token contract. erc20Addr, err = factory.DeployContract( deployer.Priv, evmtypes.EvmTxArgs{}, @@ -99,11 +104,9 @@ var _ = Describe("testing the flash loan exploit", Ordered, func() { }, ) Expect(err).ToNot(HaveOccurred(), "failed to deploy ERC-20 contract") - }) - It("should mint some tokens", func() { - // Mint some tokens to the deployer - _, err := factory.ExecuteContractCall( + // Mint some tokens to the deployer. + _, err = factory.ExecuteContractCall( deployer.Priv, evmtypes.EvmTxArgs{To: &erc20Addr}, testfactory.CallArgs{ @@ -116,7 +119,7 @@ var _ = Describe("testing the flash loan exploit", Ordered, func() { ) Expect(err).ToNot(HaveOccurred(), "failed to mint tokens") - // Check the balance of the deployer + // Check the balance of the deployer on the ERC20 contract. res, err := factory.ExecuteContractCall( deployer.Priv, evmtypes.EvmTxArgs{To: &erc20Addr}, @@ -131,7 +134,7 @@ var _ = Describe("testing the flash loan exploit", Ordered, func() { Expect(err).ToNot(HaveOccurred(), "failed to get balance") ethRes, err := evmtypes.DecodeTxResponse(res.Data) - Expect(err).ToNot(HaveOccurred(), "failed to decode tx response") + Expect(err).ToNot(HaveOccurred(), "failed to decode balance of tx response") unpacked, err := contracts.ERC20MinterBurnerDecimalsContract.ABI.Unpack( "balanceOf", @@ -142,10 +145,8 @@ var _ = Describe("testing the flash loan exploit", Ordered, func() { balance, ok := unpacked[0].(*big.Int) Expect(ok).To(BeTrue(), "failed to convert balance to big.Int") Expect(balance.String()).To(Equal(mintAmount.String()), "balance is not correct") - }) - It("should deploy the flash loan contract", func() { - var err error + // Deploy the flash loan contract. flashLoanAddr, err = factory.DeployContract( deployer.Priv, evmtypes.EvmTxArgs{}, @@ -154,10 +155,10 @@ var _ = Describe("testing the flash loan exploit", Ordered, func() { }, ) Expect(err).ToNot(HaveOccurred(), "failed to deploy flash loan contract") - }) - It("should approve the flash loan contract to spend tokens", func() { - _, err := factory.ExecuteContractCall( + // Approve the flash loan contract to spend tokens. This is required because + // the contract will get funds from the caller to perform actions. + _, err = factory.ExecuteContractCall( deployer.Priv, evmtypes.EvmTxArgs{To: &erc20Addr}, testfactory.CallArgs{ @@ -170,8 +171,8 @@ var _ = Describe("testing the flash loan exploit", Ordered, func() { ) Expect(err).ToNot(HaveOccurred(), "failed to approve flash loan contract") - // Check the allowance - res, err := factory.ExecuteContractCall( + // Check the allowance. + res, err = factory.ExecuteContractCall( deployer.Priv, evmtypes.EvmTxArgs{To: &erc20Addr}, testfactory.CallArgs{ @@ -184,24 +185,24 @@ var _ = Describe("testing the flash loan exploit", Ordered, func() { ) Expect(err).ToNot(HaveOccurred(), "failed to get allowance") - ethRes, err := evmtypes.DecodeTxResponse(res.Data) - Expect(err).ToNot(HaveOccurred(), "failed to decode tx response") + ethRes, err = evmtypes.DecodeTxResponse(res.Data) + Expect(err).ToNot(HaveOccurred(), "failed to decode allowance tx response") - unpacked, err := contracts.ERC20MinterBurnerDecimalsContract.ABI.Unpack( + unpacked, err = contracts.ERC20MinterBurnerDecimalsContract.ABI.Unpack( "allowance", ethRes.Ret, ) Expect(err).ToNot(HaveOccurred(), "failed to unpack allowance") - allowance, ok := unpacked[0].(*big.Int) + var allowance *big.Int + allowance, ok = unpacked[0].(*big.Int) Expect(ok).To(BeTrue(), "failed to convert allowance to big.Int") Expect(allowance.String()).To(Equal(mintAmount.String()), "allowance is not correct") - }) - It("should approve the flash loan contract to delegate tokens on behalf of user", func() { + // Approve the flash loan contract to delegate tokens on behalf of user. precompileAddr := stakingPrecompile.Address() - _, err := factory.ExecuteContractCall( + _, err = factory.ExecuteContractCall( deployer.Priv, evmtypes.EvmTxArgs{To: &precompileAddr}, testfactory.CallArgs{ @@ -214,8 +215,8 @@ var _ = Describe("testing the flash loan exploit", Ordered, func() { ) Expect(err).ToNot(HaveOccurred(), "failed to approve flash loan contract") - // Check the allowance - res, err := factory.ExecuteContractCall( + // Check the allowance. + res, err = factory.ExecuteContractCall( deployer.Priv, evmtypes.EvmTxArgs{To: &precompileAddr}, testfactory.CallArgs{ @@ -228,22 +229,24 @@ var _ = Describe("testing the flash loan exploit", Ordered, func() { ) Expect(err).ToNot(HaveOccurred(), "failed to get allowance") - ethRes, err := evmtypes.DecodeTxResponse(res.Data) - Expect(err).ToNot(HaveOccurred(), "failed to decode tx response") + ethRes, err = evmtypes.DecodeTxResponse(res.Data) + Expect(err).ToNot(HaveOccurred(), "failed to decode allowance tx response") - var allowance *big.Int - err = stakingPrecompile.ABI.UnpackIntoInterface(&allowance, "allowance", ethRes.Ret) + err = stakingPrecompile.UnpackIntoInterface(&allowance, "allowance", ethRes.Ret) Expect(err).ToNot(HaveOccurred(), "failed to unpack allowance") }) - It("should execute the flash loan contract", func() { - // Execute the flash loan contract + DescribeTable("call the flashLoan contract", func(tc testCase) { _, err := factory.ExecuteContractCall( deployer.Priv, - evmtypes.EvmTxArgs{To: &flashLoanAddr}, + evmtypes.EvmTxArgs{ + To: &flashLoanAddr, + GasPrice: big.NewInt(900_000_000), + GasLimit: 400_000, + }, testfactory.CallArgs{ ContractABI: flashLoanContract.ABI, - MethodName: "flashLoan", + MethodName: tc.method, Args: []interface{}{ erc20Addr, validatorToDelegateTo, @@ -252,19 +255,20 @@ var _ = Describe("testing the flash loan exploit", Ordered, func() { }, ) Expect(err).ToNot(HaveOccurred(), "failed to execute flash loan") - }) - It("should show the delegation", func() { delRes, err := handler.GetDelegation(deployer.AccAddr.String(), validatorToDelegateTo) Expect(err).ToNot(HaveOccurred(), "failed to get delegation") - Expect(delRes.DelegationResponse.Balance.Amount.String()).To(Equal( - delegatedAmountPre.Add(math.NewIntFromBigInt(delegateAmount)).String()), - "delegated amount is not correct", - ) - }) - - It("should have returned the funds from the flash loan", func() { - // Check the balance of the deployer + delAmtPost := delRes.DelegationResponse.Balance.Amount + if tc.expDelegation { + Expect(delAmtPost).To(Equal( + delegatedAmountPre.Add(math.NewIntFromBigInt(delegateAmount))), + "delegated amount is not correct", + ) + } else { + Expect(delAmtPost).To(Equal(delegatedAmountPre)) + } + + // Check the ERC20 token balance of the deployer. res, err := factory.ExecuteContractCall( deployer.Priv, evmtypes.EvmTxArgs{To: &erc20Addr}, @@ -279,7 +283,7 @@ var _ = Describe("testing the flash loan exploit", Ordered, func() { Expect(err).ToNot(HaveOccurred(), "failed to get balance") ethRes, err := evmtypes.DecodeTxResponse(res.Data) - Expect(err).ToNot(HaveOccurred(), "failed to decode tx response") + Expect(err).ToNot(HaveOccurred(), "failed to decode balance of tx response") unpacked, err := contracts.ERC20MinterBurnerDecimalsContract.ABI.Unpack( "balanceOf", @@ -289,6 +293,46 @@ var _ = Describe("testing the flash loan exploit", Ordered, func() { balance, ok := unpacked[0].(*big.Int) Expect(ok).To(BeTrue(), "failed to convert balance to big.Int") - Expect(balance.String()).To(Equal(mintAmount.String()), "balance is not correct") - }) + Expect(balance.String()).To(Equal(tc.expSenderERC20Balance.String()), "balance is not correct") + + // Check FlashLoan smart contract ERC20 token balance. + res, err = factory.ExecuteContractCall( + deployer.Priv, + evmtypes.EvmTxArgs{To: &erc20Addr}, + testfactory.CallArgs{ + ContractABI: contracts.ERC20MinterBurnerDecimalsContract.ABI, + MethodName: "balanceOf", + Args: []interface{}{ + flashLoanAddr, + }, + }, + ) + Expect(err).ToNot(HaveOccurred(), "failed to get balance") + + ethRes, err = evmtypes.DecodeTxResponse(res.Data) + Expect(err).ToNot(HaveOccurred(), "failed to decode balance of tx response") + + unpacked, err = contracts.ERC20MinterBurnerDecimalsContract.ABI.Unpack( + "balanceOf", + ethRes.Ret, + ) + Expect(err).ToNot(HaveOccurred(), "failed to unpack balance") + + balance, ok = unpacked[0].(*big.Int) + Expect(ok).To(BeTrue(), "failed to convert balance to big.Int") + Expect(balance.String()).To(Equal(tc.expContractERC20Balance.String()), "balance is not correct") + }, + Entry("flasLoan method & expect delegation", testCase{ + method: "flashLoan", + expDelegation: true, + expSenderERC20Balance: mintAmount, + expContractERC20Balance: big.NewInt(0), + }), + Entry("flashLoanWithRevert method - delegation reverted", testCase{ + method: "flashLoanWithRevert", + expDelegation: false, + expSenderERC20Balance: delegateAmount, + expContractERC20Balance: delegateAmount, + }), + ) }) diff --git a/x/evm/statedb/journal.go b/x/evm/statedb/journal.go index 14bb7b1df3..615b462709 100644 --- a/x/evm/statedb/journal.go +++ b/x/evm/statedb/journal.go @@ -22,6 +22,8 @@ import ( "sort" "github.com/ethereum/go-ethereum/common" + + sdk "github.com/cosmos/cosmos-sdk/types" ) // JournalEntry is a modification entry in the state change journal that can be @@ -137,8 +139,43 @@ type ( address *common.Address slot *common.Hash } + precompileCallChange struct { + multiStore sdk.CacheMultiStore + events sdk.Events + } ) +var ( + _ JournalEntry = createObjectChange{} + _ JournalEntry = resetObjectChange{} + _ JournalEntry = suicideChange{} + _ JournalEntry = balanceChange{} + _ JournalEntry = nonceChange{} + _ JournalEntry = storageChange{} + _ JournalEntry = codeChange{} + _ JournalEntry = refundChange{} + _ JournalEntry = addLogChange{} + _ JournalEntry = accessListAddAccountChange{} + _ JournalEntry = accessListAddSlotChange{} + _ JournalEntry = precompileCallChange{} +) + +func (pc precompileCallChange) Revert(s *StateDB) { + // rollback multi store from cache ctx to the previous + // state stored in the snapshot + s.cacheCtx = s.cacheCtx.WithMultiStore(pc.multiStore) + s.writeCache = func() { + // rollback the events to the ones snapshot + // on the snapshot + s.ctx.EventManager().EmitEvents(pc.events) + pc.multiStore.Write() + } +} + +func (pc precompileCallChange) Dirtied() *common.Address { + return nil +} + func (ch createObjectChange) Revert(s *StateDB) { delete(s.stateObjects, *ch.account) } diff --git a/x/evm/statedb/state_object.go b/x/evm/statedb/state_object.go index 9df6872d09..9fbd98b864 100644 --- a/x/evm/statedb/state_object.go +++ b/x/evm/statedb/state_object.go @@ -7,6 +7,7 @@ import ( "math/big" "sort" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" "github.com/evmos/evmos/v18/x/evm/types" ) @@ -47,7 +48,7 @@ func (s Storage) SortedKeys() []common.Hash { return keys } -// stateObject is the state of an acount +// stateObject is the state of an account type stateObject struct { db *StateDB @@ -58,10 +59,6 @@ type stateObject struct { originStorage Storage dirtyStorage Storage - // transientStorage is an in memory storage of the latest committed entries in the current transaction execution. - // It is only used when multiple commits are made within the same transaction execution. - transientStorage Storage - address common.Address // flags @@ -80,12 +77,11 @@ func newObject(db *StateDB, address common.Address, account Account) *stateObjec } return &stateObject{ - db: db, - address: address, - account: account, - originStorage: make(Storage), - dirtyStorage: make(Storage), - transientStorage: make(Storage), + db: db, + address: address, + account: account, + originStorage: make(Storage), + dirtyStorage: make(Storage), } } @@ -127,6 +123,16 @@ func (s *stateObject) SetBalance(amount *big.Int) { s.setBalance(amount) } +// AddPrecompileFn appends to the journal an entry +// with a snapshot of the multi-store and events +// previous to the precompile call +func (s *stateObject) AddPrecompileFn(cms sdk.CacheMultiStore, events sdk.Events) { + s.db.journal.append(precompileCallChange{ + multiStore: cms, + events: events, + }) +} + func (s *stateObject) setBalance(amount *big.Int) { s.account.Balance = amount } diff --git a/x/evm/statedb/statedb.go b/x/evm/statedb/statedb.go index a4215fad0b..a5a9fd0792 100644 --- a/x/evm/statedb/statedb.go +++ b/x/evm/statedb/statedb.go @@ -3,6 +3,7 @@ package statedb import ( + "errors" "fmt" "math/big" "sort" @@ -13,6 +14,7 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" + "github.com/evmos/evmos/v18/x/evm/types" ) // revision is the identifier of a version of state. @@ -33,6 +35,11 @@ var _ vm.StateDB = &StateDB{} type StateDB struct { keeper Keeper ctx sdk.Context + // cacheCtx is used on precompile calls. It allows to commit the current journal + // entries to get the updated state in for the precompile call. + cacheCtx sdk.Context + // writeCache function contains all the changes related to precompile calls. + writeCache func() // Journal of state modifications. This is the backbone of // Snapshot and RevertToSnapshot. @@ -52,6 +59,9 @@ type StateDB struct { // Per-transaction access list accessList *accessList + + // The count of calls to precompiles + precompileCallsCounter uint8 } // New creates a new state from a given trie. @@ -77,6 +87,42 @@ func (s *StateDB) GetContext() sdk.Context { return s.ctx } +// GetCacheContext returns the stateDB CacheContext. +func (s *StateDB) GetCacheContext() (sdk.Context, error) { + if s.writeCache == nil { + err := s.cache() + if err != nil { + return s.ctx, err + } + } + return s.cacheCtx, nil +} + +// MultiStoreSnapshot returns a copy of the stateDB CacheMultiStore. +func (s *StateDB) MultiStoreSnapshot() sdk.CacheMultiStore { + if s.writeCache == nil { + err := s.cache() + if err != nil { + return s.ctx.MultiStore().CacheMultiStore() + } + } + // the cacheCtx multi store is already a CacheMultiStore + // so we need to pass a copy of the current state of it + cms := s.cacheCtx.MultiStore().(sdk.CacheMultiStore) + snapshot := cms.Copy() + + return snapshot +} + +// cache creates the stateDB cache context +func (s *StateDB) cache() error { + if s.ctx.MultiStore() == nil { + return errors.New("ctx has no multi store") + } + s.cacheCtx, s.writeCache = s.ctx.CacheContext() + return nil +} + // AddLog adds a log, called by evm. func (s *StateDB) AddLog(log *ethtypes.Log) { s.journal.append(addLogChange{}) @@ -294,6 +340,22 @@ func (s *StateDB) setStateObject(object *stateObject) { * SETTERS */ +// AddPrecompileFn adds a precompileCall journal entry +// with a snapshot of the multi-store and events previous +// to the precompile call. +func (s *StateDB) AddPrecompileFn(addr common.Address, cms sdk.CacheMultiStore, events sdk.Events) error { + stateObject := s.getOrNewStateObject(addr) + if stateObject == nil { + return fmt.Errorf("could not add precompile call to address %s. State object not found", addr) + } + stateObject.AddPrecompileFn(cms, events) + s.precompileCallsCounter++ + if s.precompileCallsCounter > types.MaxPrecompileCalls { + return fmt.Errorf("max calls to precompiles (%d) reached", types.MaxPrecompileCalls) + } + return nil +} + // AddBalance adds amount to the account associated with addr. func (s *StateDB) AddBalance(addr common.Address, amount *big.Int) { stateObject := s.getOrNewStateObject(addr) @@ -443,47 +505,49 @@ func (s *StateDB) RevertToSnapshot(revid int) { // Commit writes the dirty states to keeper // the StateDB object should be discarded after committed. func (s *StateDB) Commit() error { + // writeCache func will exist only when there's a call to a precompile. + // It applies all the store updates preformed by precompile calls. + if s.writeCache != nil { + s.writeCache() + } + return s.commitWithCtx(s.ctx) +} + +// CommitWithCacheCtx writes the dirty states to keeper using the cacheCtx. +// This function is used before any precompile call to make sure the cacheCtx +// is updated with the latest changes within the tx (StateDB's journal entries). +func (s *StateDB) CommitWithCacheCtx() error { + return s.commitWithCtx(s.cacheCtx) +} + +// commitWithCtx writes the dirty states to keeper +// using the provided context +func (s *StateDB) commitWithCtx(ctx sdk.Context) error { for _, addr := range s.journal.sortedDirties() { obj := s.stateObjects[addr] if obj.suicided { - if err := s.keeper.DeleteAccount(s.ctx, obj.Address()); err != nil { - return errorsmod.Wrap(err, fmt.Sprintf("failed to delete account %s", obj.Address())) + if err := s.keeper.DeleteAccount(ctx, obj.Address()); err != nil { + return errorsmod.Wrapf(err, "failed to delete account %s", obj.Address()) } } else { if obj.code != nil && obj.dirtyCode { if len(obj.code) == 0 { - s.keeper.DeleteCode(s.ctx, obj.CodeHash()) + s.keeper.DeleteCode(ctx, obj.CodeHash()) } else { - s.keeper.SetCode(s.ctx, obj.CodeHash(), obj.code) + s.keeper.SetCode(ctx, obj.CodeHash(), obj.code) } } - - if err := s.keeper.SetAccount(s.ctx, obj.Address(), obj.account); err != nil { + if err := s.keeper.SetAccount(ctx, obj.Address(), obj.account); err != nil { return errorsmod.Wrap(err, "failed to set account") } for _, key := range obj.dirtyStorage.SortedKeys() { - dirtyValue := obj.dirtyStorage[key] - originValue := obj.originStorage[key] - // Skip noop changes, persist actual changes - transientStorageValue, ok := obj.transientStorage[key] - if (ok && transientStorageValue == dirtyValue) || - (!ok && dirtyValue == originValue) { - continue - } - - dirtyBytes := dirtyValue.Bytes() - if len(dirtyBytes) == 0 { - s.keeper.DeleteState(s.ctx, obj.Address(), key) + valueBytes := obj.dirtyStorage[key].Bytes() + if len(valueBytes) == 0 { + s.keeper.DeleteState(ctx, obj.Address(), key) } else { - s.keeper.SetState(s.ctx, obj.Address(), key, dirtyValue.Bytes()) + s.keeper.SetState(ctx, obj.Address(), key, valueBytes) } - - // Update the pendingStorage cache to the new value. - // This is specially needed for precompiles calls where - // multiple Commits calls are done within the same transaction - // for the appropriate changes to be committed. - obj.transientStorage[key] = dirtyValue } } } diff --git a/x/evm/statedb/statedb_test.go b/x/evm/statedb/statedb_test.go index 3892097a3c..5fa5abac63 100644 --- a/x/evm/statedb/statedb_test.go +++ b/x/evm/statedb/statedb_test.go @@ -198,10 +198,12 @@ func (suite *StateDBTestSuite) TestState() { {"set empty value", func(db *statedb.StateDB) { db.SetState(address, key1, common.Hash{}) }, statedb.Storage{}}, - {"noop state change", func(db *statedb.StateDB) { + {"set state even if same as original value (due to possible reverts within precompile calls)", func(db *statedb.StateDB) { db.SetState(address, key1, value1) db.SetState(address, key1, common.Hash{}) - }, statedb.Storage{}}, + }, statedb.Storage{ + key1: common.Hash{}, + }}, {"set state", func(db *statedb.StateDB) { // check empty initial state suite.Require().Equal(common.Hash{}, db.GetState(address, key1)) diff --git a/x/evm/statedb/testdata/FlashLoan.json b/x/evm/statedb/testdata/FlashLoan.json deleted file mode 100644 index 5c3a52bdbe..0000000000 --- a/x/evm/statedb/testdata/FlashLoan.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "FlashLoan", - "sourceName": "solidity/x/evm/statedb/testdata/FlashLoan.sol", - "abi": [ - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_token", - "type": "address" - }, - { - "internalType": "string", - "name": "_validator", - "type": "string" - }, - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "flashLoan", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "bytecode": "0x608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610eea806100606000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80638da5cb5b1461003b578063ee52ad7114610059575b600080fd5b610043610089565b60405161005091906106dd565b60405180910390f35b610073600480360381019061006e91906108b4565b6100ad565b604051610080919061093e565b60405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461013e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610135906109dc565b60405180910390fd5b6000849050828173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b815260040161017f9291906109fc565b602060405180830381865afa15801561019c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101c09190610a3a565b1015610201576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f890610ab3565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161023c91906106dd565b602060405180830381865afa158015610259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027d9190610a3a565b905060008273ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b81526004016102be93929190610ae2565b6020604051808303816000875af11580156102dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103019190610b45565b905080610343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033a90610be4565b60405180910390fd5b848261034f9190610c33565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161038891906106dd565b602060405180830381865afa1580156103a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c99190610a3a565b14610409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040090610cb3565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3388886040518463ffffffff1660e01b815260040161044893929190610d41565b6020604051808303816000875af1158015610467573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048b9190610b45565b9050806104cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104c490610dcb565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161050691906106dd565b602060405180830381865afa158015610523573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105479190610a3a565b91508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33876040518363ffffffff1660e01b8152600401610584929190610deb565b6020604051808303816000875af11580156105a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c79190610b45565b5084826105d49190610e14565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161060d91906106dd565b602060405180830381865afa15801561062a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064e9190610a3a565b1461068e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068590610e94565b60405180910390fd5b600193505050509392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106c78261069c565b9050919050565b6106d7816106bc565b82525050565b60006020820190506106f260008301846106ce565b92915050565b6000604051905090565b600080fd5b600080fd5b610715816106bc565b811461072057600080fd5b50565b6000813590506107328161070c565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61078b82610742565b810181811067ffffffffffffffff821117156107aa576107a9610753565b5b80604052505050565b60006107bd6106f8565b90506107c98282610782565b919050565b600067ffffffffffffffff8211156107e9576107e8610753565b5b6107f282610742565b9050602081019050919050565b82818337600083830152505050565b600061082161081c846107ce565b6107b3565b90508281526020810184848401111561083d5761083c61073d565b5b6108488482856107ff565b509392505050565b600082601f83011261086557610864610738565b5b813561087584826020860161080e565b91505092915050565b6000819050919050565b6108918161087e565b811461089c57600080fd5b50565b6000813590506108ae81610888565b92915050565b6000806000606084860312156108cd576108cc610702565b5b60006108db86828701610723565b935050602084013567ffffffffffffffff8111156108fc576108fb610707565b5b61090886828701610850565b92505060406109198682870161089f565b9150509250925092565b60008115159050919050565b61093881610923565b82525050565b6000602082019050610953600083018461092f565b92915050565b600082825260208201905092915050565b7f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b60006109c6602183610959565b91506109d18261096a565b604082019050919050565b600060208201905081810360008301526109f5816109b9565b9050919050565b6000604082019050610a1160008301856106ce565b610a1e60208301846106ce565b9392505050565b600081519050610a3481610888565b92915050565b600060208284031215610a5057610a4f610702565b5b6000610a5e84828501610a25565b91505092915050565b7f496e73756666696369656e7420616c6c6f77616e636500000000000000000000600082015250565b6000610a9d601683610959565b9150610aa882610a67565b602082019050919050565b60006020820190508181036000830152610acc81610a90565b9050919050565b610adc8161087e565b82525050565b6000606082019050610af760008301866106ce565b610b0460208301856106ce565b610b116040830184610ad3565b949350505050565b610b2281610923565b8114610b2d57600080fd5b50565b600081519050610b3f81610b19565b92915050565b600060208284031215610b5b57610b5a610702565b5b6000610b6984828501610b30565b91505092915050565b7f4661696c656420746f207472616e7366657220746f6b656e7320666f7220666c60008201527f617368206c6f616e000000000000000000000000000000000000000000000000602082015250565b6000610bce602883610959565b9150610bd982610b72565b604082019050919050565b60006020820190508181036000830152610bfd81610bc1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610c3e8261087e565b9150610c498361087e565b9250828201905080821115610c6157610c60610c04565b5b92915050565b7f466c617368206c6f616e206661696c6564000000000000000000000000000000600082015250565b6000610c9d601183610959565b9150610ca882610c67565b602082019050919050565b60006020820190508181036000830152610ccc81610c90565b9050919050565b600081519050919050565b60005b83811015610cfc578082015181840152602081019050610ce1565b60008484015250505050565b6000610d1382610cd3565b610d1d8185610959565b9350610d2d818560208601610cde565b610d3681610742565b840191505092915050565b6000606082019050610d5660008301866106ce565b8181036020830152610d688185610d08565b9050610d776040830184610ad3565b949350505050565b7f6661696c656420746f2064656c65676174650000000000000000000000000000600082015250565b6000610db5601283610959565b9150610dc082610d7f565b602082019050919050565b60006020820190508181036000830152610de481610da8565b9050919050565b6000604082019050610e0060008301856106ce565b610e0d6020830184610ad3565b9392505050565b6000610e1f8261087e565b9150610e2a8361087e565b9250828203905081811115610e4257610e41610c04565b5b92915050565b7f466c617368206c6f616e2072657061796d656e74206661696c65640000000000600082015250565b6000610e7e601b83610959565b9150610e8982610e48565b602082019050919050565b60006020820190508181036000830152610ead81610e71565b905091905056fea2646970667358221220f8f1e00d77bb2e4f68e3582e92c72a3b3fd0777a8c0b1e401f2a95ca1ba1df7e64736f6c63430008130033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c80638da5cb5b1461003b578063ee52ad7114610059575b600080fd5b610043610089565b60405161005091906106dd565b60405180910390f35b610073600480360381019061006e91906108b4565b6100ad565b604051610080919061093e565b60405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461013e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610135906109dc565b60405180910390fd5b6000849050828173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b815260040161017f9291906109fc565b602060405180830381865afa15801561019c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101c09190610a3a565b1015610201576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f890610ab3565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161023c91906106dd565b602060405180830381865afa158015610259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027d9190610a3a565b905060008273ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b81526004016102be93929190610ae2565b6020604051808303816000875af11580156102dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103019190610b45565b905080610343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033a90610be4565b60405180910390fd5b848261034f9190610c33565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161038891906106dd565b602060405180830381865afa1580156103a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c99190610a3a565b14610409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040090610cb3565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3388886040518463ffffffff1660e01b815260040161044893929190610d41565b6020604051808303816000875af1158015610467573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048b9190610b45565b9050806104cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104c490610dcb565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161050691906106dd565b602060405180830381865afa158015610523573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105479190610a3a565b91508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33876040518363ffffffff1660e01b8152600401610584929190610deb565b6020604051808303816000875af11580156105a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c79190610b45565b5084826105d49190610e14565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161060d91906106dd565b602060405180830381865afa15801561062a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064e9190610a3a565b1461068e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068590610e94565b60405180910390fd5b600193505050509392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106c78261069c565b9050919050565b6106d7816106bc565b82525050565b60006020820190506106f260008301846106ce565b92915050565b6000604051905090565b600080fd5b600080fd5b610715816106bc565b811461072057600080fd5b50565b6000813590506107328161070c565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61078b82610742565b810181811067ffffffffffffffff821117156107aa576107a9610753565b5b80604052505050565b60006107bd6106f8565b90506107c98282610782565b919050565b600067ffffffffffffffff8211156107e9576107e8610753565b5b6107f282610742565b9050602081019050919050565b82818337600083830152505050565b600061082161081c846107ce565b6107b3565b90508281526020810184848401111561083d5761083c61073d565b5b6108488482856107ff565b509392505050565b600082601f83011261086557610864610738565b5b813561087584826020860161080e565b91505092915050565b6000819050919050565b6108918161087e565b811461089c57600080fd5b50565b6000813590506108ae81610888565b92915050565b6000806000606084860312156108cd576108cc610702565b5b60006108db86828701610723565b935050602084013567ffffffffffffffff8111156108fc576108fb610707565b5b61090886828701610850565b92505060406109198682870161089f565b9150509250925092565b60008115159050919050565b61093881610923565b82525050565b6000602082019050610953600083018461092f565b92915050565b600082825260208201905092915050565b7f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b60006109c6602183610959565b91506109d18261096a565b604082019050919050565b600060208201905081810360008301526109f5816109b9565b9050919050565b6000604082019050610a1160008301856106ce565b610a1e60208301846106ce565b9392505050565b600081519050610a3481610888565b92915050565b600060208284031215610a5057610a4f610702565b5b6000610a5e84828501610a25565b91505092915050565b7f496e73756666696369656e7420616c6c6f77616e636500000000000000000000600082015250565b6000610a9d601683610959565b9150610aa882610a67565b602082019050919050565b60006020820190508181036000830152610acc81610a90565b9050919050565b610adc8161087e565b82525050565b6000606082019050610af760008301866106ce565b610b0460208301856106ce565b610b116040830184610ad3565b949350505050565b610b2281610923565b8114610b2d57600080fd5b50565b600081519050610b3f81610b19565b92915050565b600060208284031215610b5b57610b5a610702565b5b6000610b6984828501610b30565b91505092915050565b7f4661696c656420746f207472616e7366657220746f6b656e7320666f7220666c60008201527f617368206c6f616e000000000000000000000000000000000000000000000000602082015250565b6000610bce602883610959565b9150610bd982610b72565b604082019050919050565b60006020820190508181036000830152610bfd81610bc1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610c3e8261087e565b9150610c498361087e565b9250828201905080821115610c6157610c60610c04565b5b92915050565b7f466c617368206c6f616e206661696c6564000000000000000000000000000000600082015250565b6000610c9d601183610959565b9150610ca882610c67565b602082019050919050565b60006020820190508181036000830152610ccc81610c90565b9050919050565b600081519050919050565b60005b83811015610cfc578082015181840152602081019050610ce1565b60008484015250505050565b6000610d1382610cd3565b610d1d8185610959565b9350610d2d818560208601610cde565b610d3681610742565b840191505092915050565b6000606082019050610d5660008301866106ce565b8181036020830152610d688185610d08565b9050610d776040830184610ad3565b949350505050565b7f6661696c656420746f2064656c65676174650000000000000000000000000000600082015250565b6000610db5601283610959565b9150610dc082610d7f565b602082019050919050565b60006020820190508181036000830152610de481610da8565b9050919050565b6000604082019050610e0060008301856106ce565b610e0d6020830184610ad3565b9392505050565b6000610e1f8261087e565b9150610e2a8361087e565b9250828203905081811115610e4257610e41610c04565b5b92915050565b7f466c617368206c6f616e2072657061796d656e74206661696c65640000000000600082015250565b6000610e7e601b83610959565b9150610e8982610e48565b602082019050919050565b60006020820190508181036000830152610ead81610e71565b905091905056fea2646970667358221220f8f1e00d77bb2e4f68e3582e92c72a3b3fd0777a8c0b1e401f2a95ca1ba1df7e64736f6c63430008130033", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/x/evm/types/call.go b/x/evm/types/call.go index 0d92d29da7..53fa089603 100644 --- a/x/evm/types/call.go +++ b/x/evm/types/call.go @@ -10,3 +10,8 @@ const ( // Internal call type is used in case of smart contract methods calls Internal ) + +// MaxPrecompileCalls is the maximum number of precompile +// calls within a transaction. We want to limit this because +// for each precompile tx we're creating a cached context +const MaxPrecompileCalls uint8 = 7 From 37ddf530a1e32486dd56cdeaeef2580a705a32cb Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Thu, 4 Jul 2024 12:21:43 -0300 Subject: [PATCH 316/345] chore: update changelog (#2655) --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 40ace13f29..a5fbefeac7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -61,7 +61,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (app) [#2631](https://github.com/evmos/evmos/pull/2631) Bump IBC-go to v7.6.0 and Cosmos-SDK to v0.47.12. - (distribution-precompile) [#2643](https://github.com/evmos/evmos/pull/2643) Improve efficiency of reward claiming with distribution precompile. - (evm) [#2633](https://github.com/evmos/evmos/pull/2633) Remove `EthAccount` type and use `BaseAccount` instead. -- (precompiles) [GHSA-68fc-7mhg-6f6c](https://github.com/evmos/evmos/) Refactor precompiles to use journal entries. +- (precompiles) [GHSA-68fc-7mhg-6f6c](https://github.com/evmos/evmos/commit/bb2d504eec9078d6eff6981fc0cb214e8a3ca496) Refactor precompiles to use journal entries. ### Bug Fixes From 0a620e176617a835ac697eea494afea09185dfaf Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Fri, 5 Jul 2024 11:45:14 -0300 Subject: [PATCH 317/345] Merge pull request from GHSA-q6hg-6m9x-5g9c * fix(precompile): add funder and dest check to update balance * add more test cases * restrict funder to be origin or contract caller * restrict dest address when calling from sc * add test case with funds transfer within precompile call * remove print * add check for dirty addresses * add UpdateDirties func * update dirties helper func * Update precompiles/vesting/utils_test.go Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Signed-off-by: Tom <54514587+GAtom22@users.noreply.github.com> * update comment description * changes based on review comments * refactor updateDirties * add test cases for updating funder balance before and after precompile call * add revert state test * update tx logic * update integration tests * refactor auth logic * update tests * add comt * fix: add funder and vest acc to dirties * add test cases for latest changes * address review comments * address review comments * address review comments * fix FlashLoan contract compilation * update logic * use pointer in precompile txs * remove unnecessary comment --------- Signed-off-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> --- precompiles/testutil/contracts/Counter.json | 64 + precompiles/testutil/contracts/Counter.sol | 26 + .../contracts/DistributionCaller.json | 4 +- precompiles/testutil/contracts/FlashLoan.json | 6 +- precompiles/testutil/contracts/FlashLoan.sol | 6 +- precompiles/testutil/contracts/ICounter.sol | 9 + precompiles/testutil/contracts/Reverter.json | 4 +- precompiles/testutil/contracts/counter.go | 13 + precompiles/vesting/errors.go | 2 + precompiles/vesting/events.go | 4 - precompiles/vesting/integration_test.go | 1029 +++++++++++++++-- .../vesting/testdata/VestingCaller.json | 337 +++++- .../vesting/testdata/VestingCaller.sol | 221 +++- precompiles/vesting/tx.go | 96 +- precompiles/vesting/utils_test.go | 25 +- 15 files changed, 1668 insertions(+), 178 deletions(-) create mode 100644 precompiles/testutil/contracts/Counter.json create mode 100644 precompiles/testutil/contracts/Counter.sol create mode 100644 precompiles/testutil/contracts/ICounter.sol create mode 100644 precompiles/testutil/contracts/counter.go diff --git a/precompiles/testutil/contracts/Counter.json b/precompiles/testutil/contracts/Counter.json new file mode 100644 index 0000000000..597e282ad1 --- /dev/null +++ b/precompiles/testutil/contracts/Counter.json @@ -0,0 +1,64 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Counter", + "sourceName": "solidity/precompiles/testutil/contracts/Counter.sol", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "counter", + "type": "uint256" + } + ], + "name": "Added", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "counter", + "type": "uint256" + } + ], + "name": "Changed", + "type": "event" + }, + { + "inputs": [], + "name": "add", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getCounter", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "subtract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60806040526000805534801561001457600080fd5b50610397806100246000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80634f2be91f146100465780636deebae3146100505780638ada066e1461005a575b600080fd5b61004e610078565b005b610058610103565b005b6100626101d2565b60405161006f91906101f4565b60405180910390f35b60008081548092919061008a9061023e565b91905055507f64a55044d1f2eddebe1b90e8e2853e8e96931cefadbfa0b2ceb34bee360619416000546040516100c091906101f4565b60405180910390a17f938d2ee5be9cfb0f7270ee2eff90507e94b37625d9d2b3a61c97d30a4560b8296000546040516100f991906101f4565b60405180910390a1565b60008054116040518060400160405280600f81526020017f434f554e5445525f544f4f5f4c4f5700000000000000000000000000000000008152509061017f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101769190610316565b60405180910390fd5b5060008081548092919061019290610338565b91905055507f938d2ee5be9cfb0f7270ee2eff90507e94b37625d9d2b3a61c97d30a4560b8296000546040516101c891906101f4565b60405180910390a1565b60008054905090565b6000819050919050565b6101ee816101db565b82525050565b600060208201905061020960008301846101e5565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610249826101db565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361027b5761027a61020f565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b60005b838110156102c05780820151818401526020810190506102a5565b60008484015250505050565b6000601f19601f8301169050919050565b60006102e882610286565b6102f28185610291565b93506103028185602086016102a2565b61030b816102cc565b840191505092915050565b6000602082019050818103600083015261033081846102dd565b905092915050565b6000610343826101db565b9150600082036103565761035561020f565b5b60018203905091905056fea26469706673582212202870b2d78304eb0ec6b95f72bacf96e449481ecaa4d58a3ce786c1cba532075d64736f6c63430008130033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c80634f2be91f146100465780636deebae3146100505780638ada066e1461005a575b600080fd5b61004e610078565b005b610058610103565b005b6100626101d2565b60405161006f91906101f4565b60405180910390f35b60008081548092919061008a9061023e565b91905055507f64a55044d1f2eddebe1b90e8e2853e8e96931cefadbfa0b2ceb34bee360619416000546040516100c091906101f4565b60405180910390a17f938d2ee5be9cfb0f7270ee2eff90507e94b37625d9d2b3a61c97d30a4560b8296000546040516100f991906101f4565b60405180910390a1565b60008054116040518060400160405280600f81526020017f434f554e5445525f544f4f5f4c4f5700000000000000000000000000000000008152509061017f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101769190610316565b60405180910390fd5b5060008081548092919061019290610338565b91905055507f938d2ee5be9cfb0f7270ee2eff90507e94b37625d9d2b3a61c97d30a4560b8296000546040516101c891906101f4565b60405180910390a1565b60008054905090565b6000819050919050565b6101ee816101db565b82525050565b600060208201905061020960008301846101e5565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610249826101db565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361027b5761027a61020f565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b60005b838110156102c05780820151818401526020810190506102a5565b60008484015250505050565b6000601f19601f8301169050919050565b60006102e882610286565b6102f28185610291565b93506103028185602086016102a2565b61030b816102cc565b840191505092915050565b6000602082019050818103600083015261033081846102dd565b905092915050565b6000610343826101db565b9150600082036103565761035561020f565b5b60018203905091905056fea26469706673582212202870b2d78304eb0ec6b95f72bacf96e449481ecaa4d58a3ce786c1cba532075d64736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/precompiles/testutil/contracts/Counter.sol b/precompiles/testutil/contracts/Counter.sol new file mode 100644 index 0000000000..0025c5e291 --- /dev/null +++ b/precompiles/testutil/contracts/Counter.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: GPL-3.0 + +pragma solidity >=0.7.0 <0.9.0; + +contract Counter { + uint256 counter = 0; + string internal constant ERROR_TOO_LOW = "COUNTER_TOO_LOW"; + event Changed(uint256 counter); + event Added(uint256 counter); + + function add() public { + counter++; + emit Added(counter); + emit Changed(counter); + } + + function subtract() public { + require(counter > 0, ERROR_TOO_LOW); + counter--; + emit Changed(counter); + } + + function getCounter() public view returns (uint256) { + return counter; + } +} diff --git a/precompiles/testutil/contracts/DistributionCaller.json b/precompiles/testutil/contracts/DistributionCaller.json index f02162b747..3b67a175f2 100644 --- a/precompiles/testutil/contracts/DistributionCaller.json +++ b/precompiles/testutil/contracts/DistributionCaller.json @@ -914,8 +914,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b5061477b806100206000396000f3fe60806040526004361061019c5760003560e01c80637c9db0bb116100ec578063b6a216ae1161008a578063d0e30db011610064578063d0e30db0146106a7578063d3f831be146106b1578063e0421e39146106ee578063e236c7a61461072b5761019c565b8063b6a216ae146105f0578063c7804bb51461062d578063cb85aa0a1461066a5761019c565b806398194593116100c657806398194593146104fc578063ad5c4cdd14610539578063adb2378514610576578063b2d17883146105b35761019c565b80637c9db0bb1461044457806388b2d58114610481578063963516e4146104bf5761019c565b806346e16d34116101595780636cc9ac8a116101335780636cc9ac8a146103785780636f669da4146103a157806378a5dfd1146103de578063796b96d21461041b5761019c565b806346e16d34146102d3578063613d4de81461031057806361bc221a1461034d5761019c565b80630183e4b4146101a157806301b68000146101ca5780630c05e9e4146102075780631b05020714610244578063296c60aa1461026d5780632d0ee16a14610296575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c391906123de565b610769565b005b3480156101d657600080fd5b506101f160048036038101906101ec9190612483565b610a96565b6040516101fe9190612540565b60405180910390f35b34801561021357600080fd5b5061022e60048036038101906102299190612697565b610bde565b60405161023b91906128da565b60405180910390f35b34801561025057600080fd5b5061026b600480360381019061026691906128fc565b610c6e565b005b34801561027957600080fd5b50610294600480360381019061028f919061297f565b610df4565b005b3480156102a257600080fd5b506102bd60048036038101906102b89190612697565b610f35565b6040516102ca9190612ada565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f5919061297f565b610fc3565b6040516103079190612b0b565b60405180910390f35b34801561031c57600080fd5b5061033760048036038101906103329190612b26565b61104d565b6040516103449190612ada565b60405180910390f35b34801561035957600080fd5b5061036261133e565b60405161036f9190612bc5565b60405180910390f35b34801561038457600080fd5b5061039f600480360381019061039a9190612c0c565b61134f565b005b3480156103ad57600080fd5b506103c860048036038101906103c39190612c73565b6115de565b6040516103d59190612b0b565b60405180910390f35b3480156103ea57600080fd5b506104056004803603810190610400919061297f565b611668565b6040516104129190612d39565b60405180910390f35b34801561042757600080fd5b50610442600480360381019061043d919061297f565b6116f5565b005b34801561045057600080fd5b5061046b60048036038101906104669190612697565b611836565b6040516104789190612d39565b60405180910390f35b34801561048d57600080fd5b506104a860048036038101906104a39190612dbf565b6118c0565b6040516104b6929190613001565b60405180910390f35b3480156104cb57600080fd5b506104e660048036038101906104e19190612697565b61195e565b6040516104f39190612b0b565b60405180910390f35b34801561050857600080fd5b50610523600480360381019061051e919061297f565b6119e7565b6040516105309190612ada565b60405180910390f35b34801561054557600080fd5b50610560600480360381019061055b919061297f565b611a76565b60405161056d9190612ada565b60405180910390f35b34801561058257600080fd5b5061059d60048036038101906105989190613038565b611b02565b6040516105aa9190612ada565b60405180910390f35b3480156105bf57600080fd5b506105da60048036038101906105d591906130bb565b611d8d565b6040516105e79190612ada565b60405180910390f35b3480156105fc57600080fd5b5061061760048036038101906106129190612483565b611ee2565b6040516106249190613208565b60405180910390f35b34801561063957600080fd5b50610654600480360381019061064f919061322a565b611f6c565b6040516106619190612b0b565b60405180910390f35b34801561067657600080fd5b50610691600480360381019061068c9190612483565b612084565b60405161069e91906132b4565b60405180910390f35b6106af61210e565b005b3480156106bd57600080fd5b506106d860048036038101906106d39190612697565b612110565b6040516106e59190612d39565b60405180910390f35b3480156106fa57600080fd5b5061071560048036038101906107109190612697565b61219a565b6040516107229190612ada565b60405180910390f35b34801561073757600080fd5b50610752600480360381019061074d9190612483565b612226565b6040516107609291906133dc565b60405180910390f35b811561089a5760008081819054906101000a900460070b8092919061078d90613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff160217905550503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146108995760008473ffffffffffffffffffffffffffffffffffffffff16600f604051610811906134a3565b60006040518083038185875af1925050503d806000811461084e576040519150601f19603f3d011682016040523d82523d6000602084013e610853565b606091505b5050905080610897576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088e9061352a565b60405180910390fd5b505b5b600061080173ffffffffffffffffffffffffffffffffffffffff16632efe8a5f86866040518363ffffffff1660e01b81526004016108d99291906135b8565b6020604051808303816000875af11580156108f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091c91906135f6565b90508061095e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109559061366f565b60405180910390fd5b8115610a8f5760008081819054906101000a900460070b8092919061098290613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff160217905550503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614610a8e5760008573ffffffffffffffffffffffffffffffffffffffff16600f604051610a06906134a3565b60006040518083038185875af1925050503d8060008114610a43576040519150601f19603f3d011682016040523d82523d6000602084013e610a48565b606091505b5050905080610a8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a839061352a565b60405180910390fd5b505b5b5050505050565b606060008061080173ffffffffffffffffffffffffffffffffffffffff1684604051602401610ac5919061369e565b6040516020818303038152906040527f5431f450000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610b4f91906136ea565b600060405180830381855afa9150503d8060008114610b8a576040519150601f19603f3d011682016040523d82523d6000602084013e610b8f565b606091505b509150915081610bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcb9061374d565b60405180910390fd5b8092505050919050565b610be66122b3565b61080173ffffffffffffffffffffffffffffffffffffffff166354212a89836040518263ffffffff1660e01b8152600401610c2191906132b4565b600060405180830381865afa158015610c3e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610c679190613a46565b9050919050565b3073ffffffffffffffffffffffffffffffffffffffff1663ad5c4cdd85846040518363ffffffff1660e01b8152600401610ca9929190613a8f565b6000604051808303816000875af1925050508015610cea57506040513d6000823e3d601f19601f82011682018060405250810190610ce79190613c0c565b60015b15610cf157505b8015610dee5760008081819054906101000a900460070b80929190610d1590613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008373ffffffffffffffffffffffffffffffffffffffff16600f604051610d66906134a3565b60006040518083038185875af1925050503d8060008114610da3576040519150601f19603f3d011682016040523d82523d6000602084013e610da8565b606091505b5050905080610dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de39061352a565b60405180910390fd5b505b50505050565b600061080173ffffffffffffffffffffffffffffffffffffffff168383604051602401610e22929190613c55565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610eac91906136ea565b600060405180830381855af49150503d8060008114610ee7576040519150601f19603f3d011682016040523d82523d6000602084013e610eec565b606091505b5050905080610f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2790613cf7565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6130846040518363ffffffff1660e01b8152600401610f74929190613c55565b6000604051808303816000875af1158015610f93573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610fbc9190613c0c565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9684846040518363ffffffff1660e01b8152600401611002929190613c55565b6020604051808303816000875af1158015611021573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104591906135f6565b905092915050565b606082156111805760008081819054906101000a900460070b8092919061107390613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff160217905550503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461117f5760008473ffffffffffffffffffffffffffffffffffffffff16600f6040516110f7906134a3565b60006040518083038185875af1925050503d8060008114611134576040519150601f19603f3d011682016040523d82523d6000602084013e611139565b606091505b505090508061117d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111749061352a565b60405180910390fd5b505b5b61080173ffffffffffffffffffffffffffffffffffffffff16633ce4e3be866040518263ffffffff1660e01b81526004016111bb91906132b4565b6000604051808303816000875af11580156111da573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906112039190613c0c565b905081156113365760008081819054906101000a900460070b8092919061122990613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff160217905550503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146113355760008473ffffffffffffffffffffffffffffffffffffffff16600f6040516112ad906134a3565b60006040518083038185875af1925050503d80600081146112ea576040519150601f19603f3d011682016040523d82523d6000602084013e6112ef565b606091505b5050905080611333576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132a9061352a565b60405180910390fd5b505b5b949350505050565b60008054906101000a900460070b81565b811561144c5760008081819054906101000a900460070b8092919061137390613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008473ffffffffffffffffffffffffffffffffffffffff16600f6040516113c4906134a3565b60006040518083038185875af1925050503d8060008114611401576040519150601f19603f3d011682016040523d82523d6000602084013e611406565b606091505b505090508061144a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114419061352a565b60405180910390fd5b505b600061080173ffffffffffffffffffffffffffffffffffffffff1663ed41d0b686866040518363ffffffff1660e01b815260040161148b929190613d26565b6020604051808303816000875af11580156114aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ce91906135f6565b9050806114da57600080fd5b81156115d75760008081819054906101000a900460070b809291906114fe90613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008573ffffffffffffffffffffffffffffffffffffffff16600f60405161154f906134a3565b60006040518083038185875af1925050503d806000811461158c576040519150601f19603f3d011682016040523d82523d6000602084013e611591565b606091505b50509050806115d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cc9061352a565b60405180910390fd5b505b5050505050565b600061080173ffffffffffffffffffffffffffffffffffffffff16632efe8a5f84846040518363ffffffff1660e01b815260040161161d929190613d4f565b6020604051808303816000875af115801561163c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166091906135f6565b905092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff16639ad563b484846040518363ffffffff1660e01b81526004016116a7929190613c55565b600060405180830381865afa1580156116c4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906116ed9190613d78565b905092915050565b600061080173ffffffffffffffffffffffffffffffffffffffff168383604051602401611723929190613c55565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516117ad91906136ea565b600060405180830381855afa9150503d80600081146117e8576040519150601f19603f3d011682016040523d82523d6000602084013e6117ed565b606091505b5050905080611831576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118289061374d565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633dd40f78836040518263ffffffff1660e01b815260040161187391906132b4565b600060405180830381865afa158015611890573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906118b99190613d78565b9050919050565b60606118ca6122d4565b61080173ffffffffffffffffffffffffffffffffffffffff16638f2473ce878787876040518563ffffffff1660e01b815260040161190b9493929190613f4c565b600060405180830381865afa158015611928573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906119519190614224565b9150915094509492505050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9630846040518363ffffffff1660e01b815260040161199d929190613c55565b6020604051808303816000875af11580156119bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e091906135f6565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6184846040518363ffffffff1660e01b8152600401611a26929190613c55565b6000604051808303816000875af1158015611a45573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611a6e9190613c0c565b905092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6184846040518363ffffffff1660e01b8152600401611ab5929190613c55565b6000604051808303816000875af1158015611ad4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611afd9190613c0c565b600080fd5b60608215611c015760008081819054906101000a900460070b80929190611b2890613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008573ffffffffffffffffffffffffffffffffffffffff16600f604051611b79906134a3565b60006040518083038185875af1925050503d8060008114611bb6576040519150601f19603f3d011682016040523d82523d6000602084013e611bbb565b606091505b5050905080611bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf69061352a565b60405180910390fd5b505b61080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6186866040518363ffffffff1660e01b8152600401611c3e929190613a8f565b6000604051808303816000875af1158015611c5d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611c869190613c0c565b90508115611d855760008081819054906101000a900460070b80929190611cac90613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008573ffffffffffffffffffffffffffffffffffffffff16600f604051611cfd906134a3565b60006040518083038185875af1925050503d8060008114611d3a576040519150601f19603f3d011682016040523d82523d6000602084013e611d3f565b606091505b5050905080611d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7a9061352a565b60405180910390fd5b505b949350505050565b6060600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9633876040518363ffffffff1660e01b8152600401611dce929190613c55565b6020604051808303816000875af1158015611ded573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e1191906135f6565b905080611e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4a906142e8565b60405180910390fd5b61080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6185856040518363ffffffff1660e01b8152600401611e90929190613c55565b6000604051808303816000875af1158015611eaf573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611ed89190613c0c565b9150509392505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663a66cb605836040518263ffffffff1660e01b8152600401611f1f919061369e565b600060405180830381865afa158015611f3c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611f6591906143e9565b9050919050565b600060016000808282829054906101000a900460070b611f8c9190614432565b92506101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff16021790555061080173ffffffffffffffffffffffffffffffffffffffff1663ed41d0b684846040518363ffffffff1660e01b8152600401611ff2929190614492565b6020604051808303816000875af1158015612011573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203591906135f6565b905060016000808282829054906101000a900460070b61205591906144bb565b92506101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff16021790555092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff16635431f450836040518263ffffffff1660e01b81526004016120c1919061369e565b600060405180830381865afa1580156120de573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612107919061451b565b9050919050565b565b606061080173ffffffffffffffffffffffffffffffffffffffff166385b2d2da836040518263ffffffff1660e01b815260040161214d91906132b4565b600060405180830381865afa15801561216a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906121939190613d78565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633ce4e3be836040518263ffffffff1660e01b81526004016121d791906132b4565b6000604051808303816000875af11580156121f6573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061221f9190613c0c565b9050919050565b60608061080173ffffffffffffffffffffffffffffffffffffffff166354be1a28846040518263ffffffff1660e01b8152600401612264919061369e565b600060405180830381865afa158015612281573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906122aa91906146cd565b91509150915091565b60405180606001604052806060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123378261230c565b9050919050565b6123478161232c565b811461235257600080fd5b50565b6000813590506123648161233e565b92915050565b600063ffffffff82169050919050565b6123838161236a565b811461238e57600080fd5b50565b6000813590506123a08161237a565b92915050565b60008115159050919050565b6123bb816123a6565b81146123c657600080fd5b50565b6000813590506123d8816123b2565b92915050565b600080600080608085870312156123f8576123f7612302565b5b600061240687828801612355565b945050602061241787828801612391565b9350506040612428878288016123c9565b9250506060612439878288016123c9565b91505092959194509250565b60006124508261230c565b9050919050565b61246081612445565b811461246b57600080fd5b50565b60008135905061247d81612457565b92915050565b60006020828403121561249957612498612302565b5b60006124a78482850161246e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156124ea5780820151818401526020810190506124cf565b60008484015250505050565b6000601f19601f8301169050919050565b6000612512826124b0565b61251c81856124bb565b935061252c8185602086016124cc565b612535816124f6565b840191505092915050565b6000602082019050818103600083015261255a8184612507565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6125a4826124f6565b810181811067ffffffffffffffff821117156125c3576125c261256c565b5b80604052505050565b60006125d66122f8565b90506125e2828261259b565b919050565b600067ffffffffffffffff8211156126025761260161256c565b5b61260b826124f6565b9050602081019050919050565b82818337600083830152505050565b600061263a612635846125e7565b6125cc565b90508281526020810184848401111561265657612655612567565b5b612661848285612618565b509392505050565b600082601f83011261267e5761267d612562565b5b813561268e848260208601612627565b91505092915050565b6000602082840312156126ad576126ac612302565b5b600082013567ffffffffffffffff8111156126cb576126ca612307565b5b6126d784828501612669565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000612707826126e0565b61271181856126eb565b93506127218185602086016124cc565b61272a816124f6565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000819050919050565b61277481612761565b82525050565b600060ff82169050919050565b6127908161277a565b82525050565b600060608301600083015184820360008601526127b382826126fc565b91505060208301516127c8602086018261276b565b5060408301516127db6040860182612787565b508091505092915050565b60006127f28383612796565b905092915050565b6000602082019050919050565b600061281282612735565b61281c8185612740565b93508360208202850161282e85612751565b8060005b8581101561286a578484038952815161284b85826127e6565b9450612856836127fa565b925060208a01995050600181019050612832565b50829750879550505050505092915050565b6000606083016000830151848203600086015261289982826126fc565b915050602083015184820360208601526128b38282612807565b915050604083015184820360408601526128cd8282612807565b9150508091505092915050565b600060208201905081810360008301526128f4818461287c565b905092915050565b6000806000806080858703121561291657612915612302565b5b600061292487828801612355565b945050602061293587828801612355565b935050604085013567ffffffffffffffff81111561295657612955612307565b5b61296287828801612669565b9250506060612973878288016123c9565b91505092959194509250565b6000806040838503121561299657612995612302565b5b60006129a48582860161246e565b925050602083013567ffffffffffffffff8111156129c5576129c4612307565b5b6129d185828601612669565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006040830160008301518482036000860152612a2482826126fc565b9150506020830151612a39602086018261276b565b508091505092915050565b6000612a508383612a07565b905092915050565b6000602082019050919050565b6000612a70826129db565b612a7a81856129e6565b935083602082028501612a8c856129f7565b8060005b85811015612ac85784840389528151612aa98582612a44565b9450612ab483612a58565b925060208a01995050600181019050612a90565b50829750879550505050505092915050565b60006020820190508181036000830152612af48184612a65565b905092915050565b612b05816123a6565b82525050565b6000602082019050612b206000830184612afc565b92915050565b60008060008060808587031215612b4057612b3f612302565b5b600085013567ffffffffffffffff811115612b5e57612b5d612307565b5b612b6a87828801612669565b9450506020612b7b87828801612355565b9350506040612b8c878288016123c9565b9250506060612b9d878288016123c9565b91505092959194509250565b60008160070b9050919050565b612bbf81612ba9565b82525050565b6000602082019050612bda6000830184612bb6565b92915050565b612be981612761565b8114612bf457600080fd5b50565b600081359050612c0681612be0565b92915050565b60008060008060808587031215612c2657612c25612302565b5b6000612c3487828801612355565b9450506020612c4587828801612bf7565b9350506040612c56878288016123c9565b9250506060612c67878288016123c9565b91505092959194509250565b60008060408385031215612c8a57612c89612302565b5b6000612c988582860161246e565b9250506020612ca985828601612391565b9150509250929050565b600082825260208201905092915050565b6000612ccf82612735565b612cd98185612cb3565b935083602082028501612ceb85612751565b8060005b85811015612d275784840389528151612d0885826127e6565b9450612d13836127fa565b925060208a01995050600181019050612cef565b50829750879550505050505092915050565b60006020820190508181036000830152612d538184612cc4565b905092915050565b600067ffffffffffffffff82169050919050565b612d7881612d5b565b8114612d8357600080fd5b50565b600081359050612d9581612d6f565b92915050565b600080fd5b600060a08284031215612db657612db5612d9b565b5b81905092915050565b60008060008060808587031215612dd957612dd8612302565b5b600085013567ffffffffffffffff811115612df757612df6612307565b5b612e0387828801612669565b9450506020612e1487828801612d86565b9350506040612e2587828801612d86565b925050606085013567ffffffffffffffff811115612e4657612e45612307565b5b612e5287828801612da0565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612e9381612d5b565b82525050565b604082016000820151612eaf600085018261276b565b506020820151612ec26020850182612787565b50505050565b606082016000820151612ede6000850182612e8a565b506020820151612ef16020850182612e99565b50505050565b6000612f038383612ec8565b60608301905092915050565b6000602082019050919050565b6000612f2782612e5e565b612f318185612e69565b9350612f3c83612e7a565b8060005b83811015612f6d578151612f548882612ef7565b9750612f5f83612f0f565b925050600181019050612f40565b5085935050505092915050565b600082825260208201905092915050565b6000612f96826124b0565b612fa08185612f7a565b9350612fb08185602086016124cc565b612fb9816124f6565b840191505092915050565b60006040830160008301518482036000860152612fe18282612f8b565b9150506020830151612ff66020860182612e8a565b508091505092915050565b6000604082019050818103600083015261301b8185612f1c565b9050818103602083015261302f8184612fc4565b90509392505050565b6000806000806080858703121561305257613051612302565b5b600061306087828801612355565b945050602085013567ffffffffffffffff81111561308157613080612307565b5b61308d87828801612669565b935050604061309e878288016123c9565b92505060606130af878288016123c9565b91505092959194509250565b6000806000606084860312156130d4576130d3612302565b5b600084013567ffffffffffffffff8111156130f2576130f1612307565b5b6130fe86828701612669565b935050602061310f8682870161246e565b925050604084013567ffffffffffffffff8111156131305761312f612307565b5b61313c86828701612669565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061317e83836126fc565b905092915050565b6000602082019050919050565b600061319e82613146565b6131a88185613151565b9350836020820285016131ba85613162565b8060005b858110156131f657848403895281516131d78582613172565b94506131e283613186565b925060208a019950506001810190506131be565b50829750879550505050505092915050565b600060208201905081810360008301526132228184613193565b905092915050565b6000806040838503121561324157613240612302565b5b600061324f8582860161246e565b925050602061326085828601612bf7565b9150509250929050565b600082825260208201905092915050565b6000613286826126e0565b613290818561326a565b93506132a08185602086016124cc565b6132a9816124f6565b840191505092915050565b600060208201905081810360008301526132ce818461327b565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000604083016000830151848203600086015261331f82826126fc565b915050602083015184820360208601526133398282612807565b9150508091505092915050565b60006133528383613302565b905092915050565b6000602082019050919050565b6000613372826132d6565b61337c81856132e1565b93508360208202850161338e856132f2565b8060005b858110156133ca57848403895281516133ab8582613346565b94506133b68361335a565b925060208a01995050600181019050613392565b50829750879550505050505092915050565b600060408201905081810360008301526133f68185613367565b9050818103602083015261340a8184612cc4565b90509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061344d82612ba9565b9150677fffffffffffffff820361346757613466613413565b5b600182019050919050565b600081905092915050565b50565b600061348d600083613472565b91506134988261347d565b600082019050919050565b60006134ae82613480565b9150819050919050565b7f4661696c656420746f2073656e6420457468657220746f2064656c656761746f60008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061351460218361326a565b915061351f826134b8565b604082019050919050565b6000602082019050818103600083015261354381613507565b9050919050565b6000819050919050565b600061356f61356a6135658461230c565b61354a565b61230c565b9050919050565b600061358182613554565b9050919050565b600061359382613576565b9050919050565b6135a381613588565b82525050565b6135b28161236a565b82525050565b60006040820190506135cd600083018561359a565b6135da60208301846135a9565b9392505050565b6000815190506135f0816123b2565b92915050565b60006020828403121561360c5761360b612302565b5b600061361a848285016135e1565b91505092915050565b7f6661696c656420746f20636c61696d2072657761726473000000000000000000600082015250565b600061365960178361326a565b915061366482613623565b602082019050919050565b600060208201905081810360008301526136888161364c565b9050919050565b61369881612445565b82525050565b60006020820190506136b3600083018461368f565b92915050565b60006136c4826124b0565b6136ce8185613472565b93506136de8185602086016124cc565b80840191505092915050565b60006136f682846136b9565b915081905092915050565b7f6661696c65642073746174696343616c6c20746f20707265636f6d70696c6500600082015250565b6000613737601f8361326a565b915061374282613701565b602082019050919050565b600060208201905081810360008301526137668161372a565b9050919050565b600080fd5b600080fd5b600061378a613785846125e7565b6125cc565b9050828152602081018484840111156137a6576137a5612567565b5b6137b18482856124cc565b509392505050565b600082601f8301126137ce576137cd612562565b5b81516137de848260208601613777565b91505092915050565b600067ffffffffffffffff8211156138025761380161256c565b5b602082029050602081019050919050565b600080fd5b60008151905061382781612be0565b92915050565b6138368161277a565b811461384157600080fd5b50565b6000815190506138538161382d565b92915050565b60006060828403121561386f5761386e61376d565b5b61387960606125cc565b9050600082015167ffffffffffffffff81111561389957613898613772565b5b6138a5848285016137b9565b60008301525060206138b984828501613818565b60208301525060406138cd84828501613844565b60408301525092915050565b60006138ec6138e7846137e7565b6125cc565b9050808382526020820190506020840283018581111561390f5761390e613813565b5b835b8181101561395657805167ffffffffffffffff81111561393457613933612562565b5b8086016139418982613859565b85526020850194505050602081019050613911565b5050509392505050565b600082601f83011261397557613974612562565b5b81516139858482602086016138d9565b91505092915050565b6000606082840312156139a4576139a361376d565b5b6139ae60606125cc565b9050600082015167ffffffffffffffff8111156139ce576139cd613772565b5b6139da848285016137b9565b600083015250602082015167ffffffffffffffff8111156139fe576139fd613772565b5b613a0a84828501613960565b602083015250604082015167ffffffffffffffff811115613a2e57613a2d613772565b5b613a3a84828501613960565b60408301525092915050565b600060208284031215613a5c57613a5b612302565b5b600082015167ffffffffffffffff811115613a7a57613a79612307565b5b613a868482850161398e565b91505092915050565b6000604082019050613aa4600083018561359a565b8181036020830152613ab6818461327b565b90509392505050565b600067ffffffffffffffff821115613ada57613ad961256c565b5b602082029050602081019050919050565b600060408284031215613b0157613b0061376d565b5b613b0b60406125cc565b9050600082015167ffffffffffffffff811115613b2b57613b2a613772565b5b613b37848285016137b9565b6000830152506020613b4b84828501613818565b60208301525092915050565b6000613b6a613b6584613abf565b6125cc565b90508083825260208201905060208402830185811115613b8d57613b8c613813565b5b835b81811015613bd457805167ffffffffffffffff811115613bb257613bb1612562565b5b808601613bbf8982613aeb565b85526020850194505050602081019050613b8f565b5050509392505050565b600082601f830112613bf357613bf2612562565b5b8151613c03848260208601613b57565b91505092915050565b600060208284031215613c2257613c21612302565b5b600082015167ffffffffffffffff811115613c4057613c3f612307565b5b613c4c84828501613bde565b91505092915050565b6000604082019050613c6a600083018561368f565b8181036020830152613c7c818461327b565b90509392505050565b7f6661696c65642064656c656761746543616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000613ce160218361326a565b9150613cec82613c85565b604082019050919050565b60006020820190508181036000830152613d1081613cd4565b9050919050565b613d2081612761565b82525050565b6000604082019050613d3b600083018561359a565b613d486020830184613d17565b9392505050565b6000604082019050613d64600083018561368f565b613d7160208301846135a9565b9392505050565b600060208284031215613d8e57613d8d612302565b5b600082015167ffffffffffffffff811115613dac57613dab612307565b5b613db884828501613960565b91505092915050565b613dca81612d5b565b82525050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112613dfc57613dfb613dda565b5b83810192508235915060208301925067ffffffffffffffff821115613e2457613e23613dd0565b5b600182023603831315613e3a57613e39613dd5565b5b509250929050565b6000613e4e8385612f7a565b9350613e5b838584612618565b613e64836124f6565b840190509392505050565b6000613e7e6020840184612d86565b905092915050565b6000613e9560208401846123c9565b905092915050565b613ea6816123a6565b82525050565b600060a08301613ebf6000840184613ddf565b8583036000870152613ed2838284613e42565b92505050613ee36020840184613e6f565b613ef06020860182612e8a565b50613efe6040840184613e6f565b613f0b6040860182612e8a565b50613f196060840184613e86565b613f266060860182613e9d565b50613f346080840184613e86565b613f416080860182613e9d565b508091505092915050565b60006080820190508181036000830152613f66818761327b565b9050613f756020830186613dc1565b613f826040830185613dc1565b8181036060830152613f948184613eac565b905095945050505050565b600067ffffffffffffffff821115613fba57613fb961256c565b5b602082029050602081019050919050565b600081519050613fda81612d6f565b92915050565b600060408284031215613ff657613ff561376d565b5b61400060406125cc565b9050600061401084828501613818565b600083015250602061402484828501613844565b60208301525092915050565b6000606082840312156140465761404561376d565b5b61405060406125cc565b9050600061406084828501613fcb565b600083015250602061407484828501613fe0565b60208301525092915050565b600061409361408e84613f9f565b6125cc565b905080838252602082019050606084028301858111156140b6576140b5613813565b5b835b818110156140df57806140cb8882614030565b8452602084019350506060810190506140b8565b5050509392505050565b600082601f8301126140fe576140fd612562565b5b815161410e848260208601614080565b91505092915050565b600067ffffffffffffffff8211156141325761413161256c565b5b61413b826124f6565b9050602081019050919050565b600061415b61415684614117565b6125cc565b90508281526020810184848401111561417757614176612567565b5b6141828482856124cc565b509392505050565b600082601f83011261419f5761419e612562565b5b81516141af848260208601614148565b91505092915050565b6000604082840312156141ce576141cd61376d565b5b6141d860406125cc565b9050600082015167ffffffffffffffff8111156141f8576141f7613772565b5b6142048482850161418a565b600083015250602061421884828501613fcb565b60208301525092915050565b6000806040838503121561423b5761423a612302565b5b600083015167ffffffffffffffff81111561425957614258612307565b5b614265858286016140e9565b925050602083015167ffffffffffffffff81111561428657614285612307565b5b614292858286016141b8565b9150509250929050565b7f6661696c656420746f2073657420776974686472617720616464726573730000600082015250565b60006142d2601e8361326a565b91506142dd8261429c565b602082019050919050565b60006020820190508181036000830152614301816142c5565b9050919050565b600067ffffffffffffffff8211156143235761432261256c565b5b602082029050602081019050919050565b600061434761434284614308565b6125cc565b9050808382526020820190506020840283018581111561436a57614369613813565b5b835b818110156143b157805167ffffffffffffffff81111561438f5761438e612562565b5b80860161439c89826137b9565b8552602085019450505060208101905061436c565b5050509392505050565b600082601f8301126143d0576143cf612562565b5b81516143e0848260208601614334565b91505092915050565b6000602082840312156143ff576143fe612302565b5b600082015167ffffffffffffffff81111561441d5761441c612307565b5b614429848285016143bb565b91505092915050565b600061443d82612ba9565b915061444883612ba9565b925082820190507fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008112677fffffffffffffff8213171561448c5761448b613413565b5b92915050565b60006040820190506144a7600083018561368f565b6144b46020830184613d17565b9392505050565b60006144c682612ba9565b91506144d183612ba9565b92508282039050677fffffffffffffff81137fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008212171561451557614514613413565b5b92915050565b60006020828403121561453157614530612302565b5b600082015167ffffffffffffffff81111561454f5761454e612307565b5b61455b848285016137b9565b91505092915050565b600067ffffffffffffffff82111561457f5761457e61256c565b5b602082029050602081019050919050565b6000604082840312156145a6576145a561376d565b5b6145b060406125cc565b9050600082015167ffffffffffffffff8111156145d0576145cf613772565b5b6145dc848285016137b9565b600083015250602082015167ffffffffffffffff811115614600576145ff613772565b5b61460c84828501613960565b60208301525092915050565b600061462b61462684614564565b6125cc565b9050808382526020820190506020840283018581111561464e5761464d613813565b5b835b8181101561469557805167ffffffffffffffff81111561467357614672612562565b5b8086016146808982614590565b85526020850194505050602081019050614650565b5050509392505050565b600082601f8301126146b4576146b3612562565b5b81516146c4848260208601614618565b91505092915050565b600080604083850312156146e4576146e3612302565b5b600083015167ffffffffffffffff81111561470257614701612307565b5b61470e8582860161469f565b925050602083015167ffffffffffffffff81111561472f5761472e612307565b5b61473b85828601613960565b915050925092905056fea26469706673582212207a2797e1368ab3a260b6425272925c564a5b3820d913462748338f0fc1b6822764736f6c63430008130033", - "deployedBytecode": "0x60806040526004361061019c5760003560e01c80637c9db0bb116100ec578063b6a216ae1161008a578063d0e30db011610064578063d0e30db0146106a7578063d3f831be146106b1578063e0421e39146106ee578063e236c7a61461072b5761019c565b8063b6a216ae146105f0578063c7804bb51461062d578063cb85aa0a1461066a5761019c565b806398194593116100c657806398194593146104fc578063ad5c4cdd14610539578063adb2378514610576578063b2d17883146105b35761019c565b80637c9db0bb1461044457806388b2d58114610481578063963516e4146104bf5761019c565b806346e16d34116101595780636cc9ac8a116101335780636cc9ac8a146103785780636f669da4146103a157806378a5dfd1146103de578063796b96d21461041b5761019c565b806346e16d34146102d3578063613d4de81461031057806361bc221a1461034d5761019c565b80630183e4b4146101a157806301b68000146101ca5780630c05e9e4146102075780631b05020714610244578063296c60aa1461026d5780632d0ee16a14610296575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c391906123de565b610769565b005b3480156101d657600080fd5b506101f160048036038101906101ec9190612483565b610a96565b6040516101fe9190612540565b60405180910390f35b34801561021357600080fd5b5061022e60048036038101906102299190612697565b610bde565b60405161023b91906128da565b60405180910390f35b34801561025057600080fd5b5061026b600480360381019061026691906128fc565b610c6e565b005b34801561027957600080fd5b50610294600480360381019061028f919061297f565b610df4565b005b3480156102a257600080fd5b506102bd60048036038101906102b89190612697565b610f35565b6040516102ca9190612ada565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f5919061297f565b610fc3565b6040516103079190612b0b565b60405180910390f35b34801561031c57600080fd5b5061033760048036038101906103329190612b26565b61104d565b6040516103449190612ada565b60405180910390f35b34801561035957600080fd5b5061036261133e565b60405161036f9190612bc5565b60405180910390f35b34801561038457600080fd5b5061039f600480360381019061039a9190612c0c565b61134f565b005b3480156103ad57600080fd5b506103c860048036038101906103c39190612c73565b6115de565b6040516103d59190612b0b565b60405180910390f35b3480156103ea57600080fd5b506104056004803603810190610400919061297f565b611668565b6040516104129190612d39565b60405180910390f35b34801561042757600080fd5b50610442600480360381019061043d919061297f565b6116f5565b005b34801561045057600080fd5b5061046b60048036038101906104669190612697565b611836565b6040516104789190612d39565b60405180910390f35b34801561048d57600080fd5b506104a860048036038101906104a39190612dbf565b6118c0565b6040516104b6929190613001565b60405180910390f35b3480156104cb57600080fd5b506104e660048036038101906104e19190612697565b61195e565b6040516104f39190612b0b565b60405180910390f35b34801561050857600080fd5b50610523600480360381019061051e919061297f565b6119e7565b6040516105309190612ada565b60405180910390f35b34801561054557600080fd5b50610560600480360381019061055b919061297f565b611a76565b60405161056d9190612ada565b60405180910390f35b34801561058257600080fd5b5061059d60048036038101906105989190613038565b611b02565b6040516105aa9190612ada565b60405180910390f35b3480156105bf57600080fd5b506105da60048036038101906105d591906130bb565b611d8d565b6040516105e79190612ada565b60405180910390f35b3480156105fc57600080fd5b5061061760048036038101906106129190612483565b611ee2565b6040516106249190613208565b60405180910390f35b34801561063957600080fd5b50610654600480360381019061064f919061322a565b611f6c565b6040516106619190612b0b565b60405180910390f35b34801561067657600080fd5b50610691600480360381019061068c9190612483565b612084565b60405161069e91906132b4565b60405180910390f35b6106af61210e565b005b3480156106bd57600080fd5b506106d860048036038101906106d39190612697565b612110565b6040516106e59190612d39565b60405180910390f35b3480156106fa57600080fd5b5061071560048036038101906107109190612697565b61219a565b6040516107229190612ada565b60405180910390f35b34801561073757600080fd5b50610752600480360381019061074d9190612483565b612226565b6040516107609291906133dc565b60405180910390f35b811561089a5760008081819054906101000a900460070b8092919061078d90613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff160217905550503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146108995760008473ffffffffffffffffffffffffffffffffffffffff16600f604051610811906134a3565b60006040518083038185875af1925050503d806000811461084e576040519150601f19603f3d011682016040523d82523d6000602084013e610853565b606091505b5050905080610897576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088e9061352a565b60405180910390fd5b505b5b600061080173ffffffffffffffffffffffffffffffffffffffff16632efe8a5f86866040518363ffffffff1660e01b81526004016108d99291906135b8565b6020604051808303816000875af11580156108f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091c91906135f6565b90508061095e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109559061366f565b60405180910390fd5b8115610a8f5760008081819054906101000a900460070b8092919061098290613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff160217905550503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614610a8e5760008573ffffffffffffffffffffffffffffffffffffffff16600f604051610a06906134a3565b60006040518083038185875af1925050503d8060008114610a43576040519150601f19603f3d011682016040523d82523d6000602084013e610a48565b606091505b5050905080610a8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a839061352a565b60405180910390fd5b505b5b5050505050565b606060008061080173ffffffffffffffffffffffffffffffffffffffff1684604051602401610ac5919061369e565b6040516020818303038152906040527f5431f450000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610b4f91906136ea565b600060405180830381855afa9150503d8060008114610b8a576040519150601f19603f3d011682016040523d82523d6000602084013e610b8f565b606091505b509150915081610bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcb9061374d565b60405180910390fd5b8092505050919050565b610be66122b3565b61080173ffffffffffffffffffffffffffffffffffffffff166354212a89836040518263ffffffff1660e01b8152600401610c2191906132b4565b600060405180830381865afa158015610c3e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610c679190613a46565b9050919050565b3073ffffffffffffffffffffffffffffffffffffffff1663ad5c4cdd85846040518363ffffffff1660e01b8152600401610ca9929190613a8f565b6000604051808303816000875af1925050508015610cea57506040513d6000823e3d601f19601f82011682018060405250810190610ce79190613c0c565b60015b15610cf157505b8015610dee5760008081819054906101000a900460070b80929190610d1590613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008373ffffffffffffffffffffffffffffffffffffffff16600f604051610d66906134a3565b60006040518083038185875af1925050503d8060008114610da3576040519150601f19603f3d011682016040523d82523d6000602084013e610da8565b606091505b5050905080610dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de39061352a565b60405180910390fd5b505b50505050565b600061080173ffffffffffffffffffffffffffffffffffffffff168383604051602401610e22929190613c55565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610eac91906136ea565b600060405180830381855af49150503d8060008114610ee7576040519150601f19603f3d011682016040523d82523d6000602084013e610eec565b606091505b5050905080610f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2790613cf7565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6130846040518363ffffffff1660e01b8152600401610f74929190613c55565b6000604051808303816000875af1158015610f93573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610fbc9190613c0c565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9684846040518363ffffffff1660e01b8152600401611002929190613c55565b6020604051808303816000875af1158015611021573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104591906135f6565b905092915050565b606082156111805760008081819054906101000a900460070b8092919061107390613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff160217905550503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461117f5760008473ffffffffffffffffffffffffffffffffffffffff16600f6040516110f7906134a3565b60006040518083038185875af1925050503d8060008114611134576040519150601f19603f3d011682016040523d82523d6000602084013e611139565b606091505b505090508061117d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111749061352a565b60405180910390fd5b505b5b61080173ffffffffffffffffffffffffffffffffffffffff16633ce4e3be866040518263ffffffff1660e01b81526004016111bb91906132b4565b6000604051808303816000875af11580156111da573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906112039190613c0c565b905081156113365760008081819054906101000a900460070b8092919061122990613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff160217905550503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146113355760008473ffffffffffffffffffffffffffffffffffffffff16600f6040516112ad906134a3565b60006040518083038185875af1925050503d80600081146112ea576040519150601f19603f3d011682016040523d82523d6000602084013e6112ef565b606091505b5050905080611333576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132a9061352a565b60405180910390fd5b505b5b949350505050565b60008054906101000a900460070b81565b811561144c5760008081819054906101000a900460070b8092919061137390613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008473ffffffffffffffffffffffffffffffffffffffff16600f6040516113c4906134a3565b60006040518083038185875af1925050503d8060008114611401576040519150601f19603f3d011682016040523d82523d6000602084013e611406565b606091505b505090508061144a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114419061352a565b60405180910390fd5b505b600061080173ffffffffffffffffffffffffffffffffffffffff1663ed41d0b686866040518363ffffffff1660e01b815260040161148b929190613d26565b6020604051808303816000875af11580156114aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ce91906135f6565b9050806114da57600080fd5b81156115d75760008081819054906101000a900460070b809291906114fe90613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008573ffffffffffffffffffffffffffffffffffffffff16600f60405161154f906134a3565b60006040518083038185875af1925050503d806000811461158c576040519150601f19603f3d011682016040523d82523d6000602084013e611591565b606091505b50509050806115d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cc9061352a565b60405180910390fd5b505b5050505050565b600061080173ffffffffffffffffffffffffffffffffffffffff16632efe8a5f84846040518363ffffffff1660e01b815260040161161d929190613d4f565b6020604051808303816000875af115801561163c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166091906135f6565b905092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff16639ad563b484846040518363ffffffff1660e01b81526004016116a7929190613c55565b600060405180830381865afa1580156116c4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906116ed9190613d78565b905092915050565b600061080173ffffffffffffffffffffffffffffffffffffffff168383604051602401611723929190613c55565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516117ad91906136ea565b600060405180830381855afa9150503d80600081146117e8576040519150601f19603f3d011682016040523d82523d6000602084013e6117ed565b606091505b5050905080611831576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118289061374d565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633dd40f78836040518263ffffffff1660e01b815260040161187391906132b4565b600060405180830381865afa158015611890573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906118b99190613d78565b9050919050565b60606118ca6122d4565b61080173ffffffffffffffffffffffffffffffffffffffff16638f2473ce878787876040518563ffffffff1660e01b815260040161190b9493929190613f4c565b600060405180830381865afa158015611928573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906119519190614224565b9150915094509492505050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9630846040518363ffffffff1660e01b815260040161199d929190613c55565b6020604051808303816000875af11580156119bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e091906135f6565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6184846040518363ffffffff1660e01b8152600401611a26929190613c55565b6000604051808303816000875af1158015611a45573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611a6e9190613c0c565b905092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6184846040518363ffffffff1660e01b8152600401611ab5929190613c55565b6000604051808303816000875af1158015611ad4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611afd9190613c0c565b600080fd5b60608215611c015760008081819054906101000a900460070b80929190611b2890613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008573ffffffffffffffffffffffffffffffffffffffff16600f604051611b79906134a3565b60006040518083038185875af1925050503d8060008114611bb6576040519150601f19603f3d011682016040523d82523d6000602084013e611bbb565b606091505b5050905080611bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf69061352a565b60405180910390fd5b505b61080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6186866040518363ffffffff1660e01b8152600401611c3e929190613a8f565b6000604051808303816000875af1158015611c5d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611c869190613c0c565b90508115611d855760008081819054906101000a900460070b80929190611cac90613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008573ffffffffffffffffffffffffffffffffffffffff16600f604051611cfd906134a3565b60006040518083038185875af1925050503d8060008114611d3a576040519150601f19603f3d011682016040523d82523d6000602084013e611d3f565b606091505b5050905080611d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7a9061352a565b60405180910390fd5b505b949350505050565b6060600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9633876040518363ffffffff1660e01b8152600401611dce929190613c55565b6020604051808303816000875af1158015611ded573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e1191906135f6565b905080611e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4a906142e8565b60405180910390fd5b61080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6185856040518363ffffffff1660e01b8152600401611e90929190613c55565b6000604051808303816000875af1158015611eaf573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611ed89190613c0c565b9150509392505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663a66cb605836040518263ffffffff1660e01b8152600401611f1f919061369e565b600060405180830381865afa158015611f3c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611f6591906143e9565b9050919050565b600060016000808282829054906101000a900460070b611f8c9190614432565b92506101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff16021790555061080173ffffffffffffffffffffffffffffffffffffffff1663ed41d0b684846040518363ffffffff1660e01b8152600401611ff2929190614492565b6020604051808303816000875af1158015612011573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203591906135f6565b905060016000808282829054906101000a900460070b61205591906144bb565b92506101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff16021790555092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff16635431f450836040518263ffffffff1660e01b81526004016120c1919061369e565b600060405180830381865afa1580156120de573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612107919061451b565b9050919050565b565b606061080173ffffffffffffffffffffffffffffffffffffffff166385b2d2da836040518263ffffffff1660e01b815260040161214d91906132b4565b600060405180830381865afa15801561216a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906121939190613d78565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633ce4e3be836040518263ffffffff1660e01b81526004016121d791906132b4565b6000604051808303816000875af11580156121f6573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061221f9190613c0c565b9050919050565b60608061080173ffffffffffffffffffffffffffffffffffffffff166354be1a28846040518263ffffffff1660e01b8152600401612264919061369e565b600060405180830381865afa158015612281573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906122aa91906146cd565b91509150915091565b60405180606001604052806060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123378261230c565b9050919050565b6123478161232c565b811461235257600080fd5b50565b6000813590506123648161233e565b92915050565b600063ffffffff82169050919050565b6123838161236a565b811461238e57600080fd5b50565b6000813590506123a08161237a565b92915050565b60008115159050919050565b6123bb816123a6565b81146123c657600080fd5b50565b6000813590506123d8816123b2565b92915050565b600080600080608085870312156123f8576123f7612302565b5b600061240687828801612355565b945050602061241787828801612391565b9350506040612428878288016123c9565b9250506060612439878288016123c9565b91505092959194509250565b60006124508261230c565b9050919050565b61246081612445565b811461246b57600080fd5b50565b60008135905061247d81612457565b92915050565b60006020828403121561249957612498612302565b5b60006124a78482850161246e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156124ea5780820151818401526020810190506124cf565b60008484015250505050565b6000601f19601f8301169050919050565b6000612512826124b0565b61251c81856124bb565b935061252c8185602086016124cc565b612535816124f6565b840191505092915050565b6000602082019050818103600083015261255a8184612507565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6125a4826124f6565b810181811067ffffffffffffffff821117156125c3576125c261256c565b5b80604052505050565b60006125d66122f8565b90506125e2828261259b565b919050565b600067ffffffffffffffff8211156126025761260161256c565b5b61260b826124f6565b9050602081019050919050565b82818337600083830152505050565b600061263a612635846125e7565b6125cc565b90508281526020810184848401111561265657612655612567565b5b612661848285612618565b509392505050565b600082601f83011261267e5761267d612562565b5b813561268e848260208601612627565b91505092915050565b6000602082840312156126ad576126ac612302565b5b600082013567ffffffffffffffff8111156126cb576126ca612307565b5b6126d784828501612669565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000612707826126e0565b61271181856126eb565b93506127218185602086016124cc565b61272a816124f6565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000819050919050565b61277481612761565b82525050565b600060ff82169050919050565b6127908161277a565b82525050565b600060608301600083015184820360008601526127b382826126fc565b91505060208301516127c8602086018261276b565b5060408301516127db6040860182612787565b508091505092915050565b60006127f28383612796565b905092915050565b6000602082019050919050565b600061281282612735565b61281c8185612740565b93508360208202850161282e85612751565b8060005b8581101561286a578484038952815161284b85826127e6565b9450612856836127fa565b925060208a01995050600181019050612832565b50829750879550505050505092915050565b6000606083016000830151848203600086015261289982826126fc565b915050602083015184820360208601526128b38282612807565b915050604083015184820360408601526128cd8282612807565b9150508091505092915050565b600060208201905081810360008301526128f4818461287c565b905092915050565b6000806000806080858703121561291657612915612302565b5b600061292487828801612355565b945050602061293587828801612355565b935050604085013567ffffffffffffffff81111561295657612955612307565b5b61296287828801612669565b9250506060612973878288016123c9565b91505092959194509250565b6000806040838503121561299657612995612302565b5b60006129a48582860161246e565b925050602083013567ffffffffffffffff8111156129c5576129c4612307565b5b6129d185828601612669565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006040830160008301518482036000860152612a2482826126fc565b9150506020830151612a39602086018261276b565b508091505092915050565b6000612a508383612a07565b905092915050565b6000602082019050919050565b6000612a70826129db565b612a7a81856129e6565b935083602082028501612a8c856129f7565b8060005b85811015612ac85784840389528151612aa98582612a44565b9450612ab483612a58565b925060208a01995050600181019050612a90565b50829750879550505050505092915050565b60006020820190508181036000830152612af48184612a65565b905092915050565b612b05816123a6565b82525050565b6000602082019050612b206000830184612afc565b92915050565b60008060008060808587031215612b4057612b3f612302565b5b600085013567ffffffffffffffff811115612b5e57612b5d612307565b5b612b6a87828801612669565b9450506020612b7b87828801612355565b9350506040612b8c878288016123c9565b9250506060612b9d878288016123c9565b91505092959194509250565b60008160070b9050919050565b612bbf81612ba9565b82525050565b6000602082019050612bda6000830184612bb6565b92915050565b612be981612761565b8114612bf457600080fd5b50565b600081359050612c0681612be0565b92915050565b60008060008060808587031215612c2657612c25612302565b5b6000612c3487828801612355565b9450506020612c4587828801612bf7565b9350506040612c56878288016123c9565b9250506060612c67878288016123c9565b91505092959194509250565b60008060408385031215612c8a57612c89612302565b5b6000612c988582860161246e565b9250506020612ca985828601612391565b9150509250929050565b600082825260208201905092915050565b6000612ccf82612735565b612cd98185612cb3565b935083602082028501612ceb85612751565b8060005b85811015612d275784840389528151612d0885826127e6565b9450612d13836127fa565b925060208a01995050600181019050612cef565b50829750879550505050505092915050565b60006020820190508181036000830152612d538184612cc4565b905092915050565b600067ffffffffffffffff82169050919050565b612d7881612d5b565b8114612d8357600080fd5b50565b600081359050612d9581612d6f565b92915050565b600080fd5b600060a08284031215612db657612db5612d9b565b5b81905092915050565b60008060008060808587031215612dd957612dd8612302565b5b600085013567ffffffffffffffff811115612df757612df6612307565b5b612e0387828801612669565b9450506020612e1487828801612d86565b9350506040612e2587828801612d86565b925050606085013567ffffffffffffffff811115612e4657612e45612307565b5b612e5287828801612da0565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612e9381612d5b565b82525050565b604082016000820151612eaf600085018261276b565b506020820151612ec26020850182612787565b50505050565b606082016000820151612ede6000850182612e8a565b506020820151612ef16020850182612e99565b50505050565b6000612f038383612ec8565b60608301905092915050565b6000602082019050919050565b6000612f2782612e5e565b612f318185612e69565b9350612f3c83612e7a565b8060005b83811015612f6d578151612f548882612ef7565b9750612f5f83612f0f565b925050600181019050612f40565b5085935050505092915050565b600082825260208201905092915050565b6000612f96826124b0565b612fa08185612f7a565b9350612fb08185602086016124cc565b612fb9816124f6565b840191505092915050565b60006040830160008301518482036000860152612fe18282612f8b565b9150506020830151612ff66020860182612e8a565b508091505092915050565b6000604082019050818103600083015261301b8185612f1c565b9050818103602083015261302f8184612fc4565b90509392505050565b6000806000806080858703121561305257613051612302565b5b600061306087828801612355565b945050602085013567ffffffffffffffff81111561308157613080612307565b5b61308d87828801612669565b935050604061309e878288016123c9565b92505060606130af878288016123c9565b91505092959194509250565b6000806000606084860312156130d4576130d3612302565b5b600084013567ffffffffffffffff8111156130f2576130f1612307565b5b6130fe86828701612669565b935050602061310f8682870161246e565b925050604084013567ffffffffffffffff8111156131305761312f612307565b5b61313c86828701612669565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061317e83836126fc565b905092915050565b6000602082019050919050565b600061319e82613146565b6131a88185613151565b9350836020820285016131ba85613162565b8060005b858110156131f657848403895281516131d78582613172565b94506131e283613186565b925060208a019950506001810190506131be565b50829750879550505050505092915050565b600060208201905081810360008301526132228184613193565b905092915050565b6000806040838503121561324157613240612302565b5b600061324f8582860161246e565b925050602061326085828601612bf7565b9150509250929050565b600082825260208201905092915050565b6000613286826126e0565b613290818561326a565b93506132a08185602086016124cc565b6132a9816124f6565b840191505092915050565b600060208201905081810360008301526132ce818461327b565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000604083016000830151848203600086015261331f82826126fc565b915050602083015184820360208601526133398282612807565b9150508091505092915050565b60006133528383613302565b905092915050565b6000602082019050919050565b6000613372826132d6565b61337c81856132e1565b93508360208202850161338e856132f2565b8060005b858110156133ca57848403895281516133ab8582613346565b94506133b68361335a565b925060208a01995050600181019050613392565b50829750879550505050505092915050565b600060408201905081810360008301526133f68185613367565b9050818103602083015261340a8184612cc4565b90509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061344d82612ba9565b9150677fffffffffffffff820361346757613466613413565b5b600182019050919050565b600081905092915050565b50565b600061348d600083613472565b91506134988261347d565b600082019050919050565b60006134ae82613480565b9150819050919050565b7f4661696c656420746f2073656e6420457468657220746f2064656c656761746f60008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061351460218361326a565b915061351f826134b8565b604082019050919050565b6000602082019050818103600083015261354381613507565b9050919050565b6000819050919050565b600061356f61356a6135658461230c565b61354a565b61230c565b9050919050565b600061358182613554565b9050919050565b600061359382613576565b9050919050565b6135a381613588565b82525050565b6135b28161236a565b82525050565b60006040820190506135cd600083018561359a565b6135da60208301846135a9565b9392505050565b6000815190506135f0816123b2565b92915050565b60006020828403121561360c5761360b612302565b5b600061361a848285016135e1565b91505092915050565b7f6661696c656420746f20636c61696d2072657761726473000000000000000000600082015250565b600061365960178361326a565b915061366482613623565b602082019050919050565b600060208201905081810360008301526136888161364c565b9050919050565b61369881612445565b82525050565b60006020820190506136b3600083018461368f565b92915050565b60006136c4826124b0565b6136ce8185613472565b93506136de8185602086016124cc565b80840191505092915050565b60006136f682846136b9565b915081905092915050565b7f6661696c65642073746174696343616c6c20746f20707265636f6d70696c6500600082015250565b6000613737601f8361326a565b915061374282613701565b602082019050919050565b600060208201905081810360008301526137668161372a565b9050919050565b600080fd5b600080fd5b600061378a613785846125e7565b6125cc565b9050828152602081018484840111156137a6576137a5612567565b5b6137b18482856124cc565b509392505050565b600082601f8301126137ce576137cd612562565b5b81516137de848260208601613777565b91505092915050565b600067ffffffffffffffff8211156138025761380161256c565b5b602082029050602081019050919050565b600080fd5b60008151905061382781612be0565b92915050565b6138368161277a565b811461384157600080fd5b50565b6000815190506138538161382d565b92915050565b60006060828403121561386f5761386e61376d565b5b61387960606125cc565b9050600082015167ffffffffffffffff81111561389957613898613772565b5b6138a5848285016137b9565b60008301525060206138b984828501613818565b60208301525060406138cd84828501613844565b60408301525092915050565b60006138ec6138e7846137e7565b6125cc565b9050808382526020820190506020840283018581111561390f5761390e613813565b5b835b8181101561395657805167ffffffffffffffff81111561393457613933612562565b5b8086016139418982613859565b85526020850194505050602081019050613911565b5050509392505050565b600082601f83011261397557613974612562565b5b81516139858482602086016138d9565b91505092915050565b6000606082840312156139a4576139a361376d565b5b6139ae60606125cc565b9050600082015167ffffffffffffffff8111156139ce576139cd613772565b5b6139da848285016137b9565b600083015250602082015167ffffffffffffffff8111156139fe576139fd613772565b5b613a0a84828501613960565b602083015250604082015167ffffffffffffffff811115613a2e57613a2d613772565b5b613a3a84828501613960565b60408301525092915050565b600060208284031215613a5c57613a5b612302565b5b600082015167ffffffffffffffff811115613a7a57613a79612307565b5b613a868482850161398e565b91505092915050565b6000604082019050613aa4600083018561359a565b8181036020830152613ab6818461327b565b90509392505050565b600067ffffffffffffffff821115613ada57613ad961256c565b5b602082029050602081019050919050565b600060408284031215613b0157613b0061376d565b5b613b0b60406125cc565b9050600082015167ffffffffffffffff811115613b2b57613b2a613772565b5b613b37848285016137b9565b6000830152506020613b4b84828501613818565b60208301525092915050565b6000613b6a613b6584613abf565b6125cc565b90508083825260208201905060208402830185811115613b8d57613b8c613813565b5b835b81811015613bd457805167ffffffffffffffff811115613bb257613bb1612562565b5b808601613bbf8982613aeb565b85526020850194505050602081019050613b8f565b5050509392505050565b600082601f830112613bf357613bf2612562565b5b8151613c03848260208601613b57565b91505092915050565b600060208284031215613c2257613c21612302565b5b600082015167ffffffffffffffff811115613c4057613c3f612307565b5b613c4c84828501613bde565b91505092915050565b6000604082019050613c6a600083018561368f565b8181036020830152613c7c818461327b565b90509392505050565b7f6661696c65642064656c656761746543616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000613ce160218361326a565b9150613cec82613c85565b604082019050919050565b60006020820190508181036000830152613d1081613cd4565b9050919050565b613d2081612761565b82525050565b6000604082019050613d3b600083018561359a565b613d486020830184613d17565b9392505050565b6000604082019050613d64600083018561368f565b613d7160208301846135a9565b9392505050565b600060208284031215613d8e57613d8d612302565b5b600082015167ffffffffffffffff811115613dac57613dab612307565b5b613db884828501613960565b91505092915050565b613dca81612d5b565b82525050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112613dfc57613dfb613dda565b5b83810192508235915060208301925067ffffffffffffffff821115613e2457613e23613dd0565b5b600182023603831315613e3a57613e39613dd5565b5b509250929050565b6000613e4e8385612f7a565b9350613e5b838584612618565b613e64836124f6565b840190509392505050565b6000613e7e6020840184612d86565b905092915050565b6000613e9560208401846123c9565b905092915050565b613ea6816123a6565b82525050565b600060a08301613ebf6000840184613ddf565b8583036000870152613ed2838284613e42565b92505050613ee36020840184613e6f565b613ef06020860182612e8a565b50613efe6040840184613e6f565b613f0b6040860182612e8a565b50613f196060840184613e86565b613f266060860182613e9d565b50613f346080840184613e86565b613f416080860182613e9d565b508091505092915050565b60006080820190508181036000830152613f66818761327b565b9050613f756020830186613dc1565b613f826040830185613dc1565b8181036060830152613f948184613eac565b905095945050505050565b600067ffffffffffffffff821115613fba57613fb961256c565b5b602082029050602081019050919050565b600081519050613fda81612d6f565b92915050565b600060408284031215613ff657613ff561376d565b5b61400060406125cc565b9050600061401084828501613818565b600083015250602061402484828501613844565b60208301525092915050565b6000606082840312156140465761404561376d565b5b61405060406125cc565b9050600061406084828501613fcb565b600083015250602061407484828501613fe0565b60208301525092915050565b600061409361408e84613f9f565b6125cc565b905080838252602082019050606084028301858111156140b6576140b5613813565b5b835b818110156140df57806140cb8882614030565b8452602084019350506060810190506140b8565b5050509392505050565b600082601f8301126140fe576140fd612562565b5b815161410e848260208601614080565b91505092915050565b600067ffffffffffffffff8211156141325761413161256c565b5b61413b826124f6565b9050602081019050919050565b600061415b61415684614117565b6125cc565b90508281526020810184848401111561417757614176612567565b5b6141828482856124cc565b509392505050565b600082601f83011261419f5761419e612562565b5b81516141af848260208601614148565b91505092915050565b6000604082840312156141ce576141cd61376d565b5b6141d860406125cc565b9050600082015167ffffffffffffffff8111156141f8576141f7613772565b5b6142048482850161418a565b600083015250602061421884828501613fcb565b60208301525092915050565b6000806040838503121561423b5761423a612302565b5b600083015167ffffffffffffffff81111561425957614258612307565b5b614265858286016140e9565b925050602083015167ffffffffffffffff81111561428657614285612307565b5b614292858286016141b8565b9150509250929050565b7f6661696c656420746f2073657420776974686472617720616464726573730000600082015250565b60006142d2601e8361326a565b91506142dd8261429c565b602082019050919050565b60006020820190508181036000830152614301816142c5565b9050919050565b600067ffffffffffffffff8211156143235761432261256c565b5b602082029050602081019050919050565b600061434761434284614308565b6125cc565b9050808382526020820190506020840283018581111561436a57614369613813565b5b835b818110156143b157805167ffffffffffffffff81111561438f5761438e612562565b5b80860161439c89826137b9565b8552602085019450505060208101905061436c565b5050509392505050565b600082601f8301126143d0576143cf612562565b5b81516143e0848260208601614334565b91505092915050565b6000602082840312156143ff576143fe612302565b5b600082015167ffffffffffffffff81111561441d5761441c612307565b5b614429848285016143bb565b91505092915050565b600061443d82612ba9565b915061444883612ba9565b925082820190507fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008112677fffffffffffffff8213171561448c5761448b613413565b5b92915050565b60006040820190506144a7600083018561368f565b6144b46020830184613d17565b9392505050565b60006144c682612ba9565b91506144d183612ba9565b92508282039050677fffffffffffffff81137fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008212171561451557614514613413565b5b92915050565b60006020828403121561453157614530612302565b5b600082015167ffffffffffffffff81111561454f5761454e612307565b5b61455b848285016137b9565b91505092915050565b600067ffffffffffffffff82111561457f5761457e61256c565b5b602082029050602081019050919050565b6000604082840312156145a6576145a561376d565b5b6145b060406125cc565b9050600082015167ffffffffffffffff8111156145d0576145cf613772565b5b6145dc848285016137b9565b600083015250602082015167ffffffffffffffff811115614600576145ff613772565b5b61460c84828501613960565b60208301525092915050565b600061462b61462684614564565b6125cc565b9050808382526020820190506020840283018581111561464e5761464d613813565b5b835b8181101561469557805167ffffffffffffffff81111561467357614672612562565b5b8086016146808982614590565b85526020850194505050602081019050614650565b5050509392505050565b600082601f8301126146b4576146b3612562565b5b81516146c4848260208601614618565b91505092915050565b600080604083850312156146e4576146e3612302565b5b600083015167ffffffffffffffff81111561470257614701612307565b5b61470e8582860161469f565b925050602083015167ffffffffffffffff81111561472f5761472e612307565b5b61473b85828601613960565b915050925092905056fea26469706673582212207a2797e1368ab3a260b6425272925c564a5b3820d913462748338f0fc1b6822764736f6c63430008130033", + "bytecode": "0x608060405234801561001057600080fd5b5061477b806100206000396000f3fe60806040526004361061019c5760003560e01c80637c9db0bb116100ec578063b6a216ae1161008a578063d0e30db011610064578063d0e30db0146106a7578063d3f831be146106b1578063e0421e39146106ee578063e236c7a61461072b5761019c565b8063b6a216ae146105f0578063c7804bb51461062d578063cb85aa0a1461066a5761019c565b806398194593116100c657806398194593146104fc578063ad5c4cdd14610539578063adb2378514610576578063b2d17883146105b35761019c565b80637c9db0bb1461044457806388b2d58114610481578063963516e4146104bf5761019c565b806346e16d34116101595780636cc9ac8a116101335780636cc9ac8a146103785780636f669da4146103a157806378a5dfd1146103de578063796b96d21461041b5761019c565b806346e16d34146102d3578063613d4de81461031057806361bc221a1461034d5761019c565b80630183e4b4146101a157806301b68000146101ca5780630c05e9e4146102075780631b05020714610244578063296c60aa1461026d5780632d0ee16a14610296575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c391906123de565b610769565b005b3480156101d657600080fd5b506101f160048036038101906101ec9190612483565b610a96565b6040516101fe9190612540565b60405180910390f35b34801561021357600080fd5b5061022e60048036038101906102299190612697565b610bde565b60405161023b91906128da565b60405180910390f35b34801561025057600080fd5b5061026b600480360381019061026691906128fc565b610c6e565b005b34801561027957600080fd5b50610294600480360381019061028f919061297f565b610df4565b005b3480156102a257600080fd5b506102bd60048036038101906102b89190612697565b610f35565b6040516102ca9190612ada565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f5919061297f565b610fc3565b6040516103079190612b0b565b60405180910390f35b34801561031c57600080fd5b5061033760048036038101906103329190612b26565b61104d565b6040516103449190612ada565b60405180910390f35b34801561035957600080fd5b5061036261133e565b60405161036f9190612bc5565b60405180910390f35b34801561038457600080fd5b5061039f600480360381019061039a9190612c0c565b61134f565b005b3480156103ad57600080fd5b506103c860048036038101906103c39190612c73565b6115de565b6040516103d59190612b0b565b60405180910390f35b3480156103ea57600080fd5b506104056004803603810190610400919061297f565b611668565b6040516104129190612d39565b60405180910390f35b34801561042757600080fd5b50610442600480360381019061043d919061297f565b6116f5565b005b34801561045057600080fd5b5061046b60048036038101906104669190612697565b611836565b6040516104789190612d39565b60405180910390f35b34801561048d57600080fd5b506104a860048036038101906104a39190612dbf565b6118c0565b6040516104b6929190613001565b60405180910390f35b3480156104cb57600080fd5b506104e660048036038101906104e19190612697565b61195e565b6040516104f39190612b0b565b60405180910390f35b34801561050857600080fd5b50610523600480360381019061051e919061297f565b6119e7565b6040516105309190612ada565b60405180910390f35b34801561054557600080fd5b50610560600480360381019061055b919061297f565b611a76565b60405161056d9190612ada565b60405180910390f35b34801561058257600080fd5b5061059d60048036038101906105989190613038565b611b02565b6040516105aa9190612ada565b60405180910390f35b3480156105bf57600080fd5b506105da60048036038101906105d591906130bb565b611d8d565b6040516105e79190612ada565b60405180910390f35b3480156105fc57600080fd5b5061061760048036038101906106129190612483565b611ee2565b6040516106249190613208565b60405180910390f35b34801561063957600080fd5b50610654600480360381019061064f919061322a565b611f6c565b6040516106619190612b0b565b60405180910390f35b34801561067657600080fd5b50610691600480360381019061068c9190612483565b612084565b60405161069e91906132b4565b60405180910390f35b6106af61210e565b005b3480156106bd57600080fd5b506106d860048036038101906106d39190612697565b612110565b6040516106e59190612d39565b60405180910390f35b3480156106fa57600080fd5b5061071560048036038101906107109190612697565b61219a565b6040516107229190612ada565b60405180910390f35b34801561073757600080fd5b50610752600480360381019061074d9190612483565b612226565b6040516107609291906133dc565b60405180910390f35b811561089a5760008081819054906101000a900460070b8092919061078d90613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff160217905550503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146108995760008473ffffffffffffffffffffffffffffffffffffffff16600f604051610811906134a3565b60006040518083038185875af1925050503d806000811461084e576040519150601f19603f3d011682016040523d82523d6000602084013e610853565b606091505b5050905080610897576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088e9061352a565b60405180910390fd5b505b5b600061080173ffffffffffffffffffffffffffffffffffffffff16632efe8a5f86866040518363ffffffff1660e01b81526004016108d99291906135b8565b6020604051808303816000875af11580156108f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091c91906135f6565b90508061095e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109559061366f565b60405180910390fd5b8115610a8f5760008081819054906101000a900460070b8092919061098290613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff160217905550503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614610a8e5760008573ffffffffffffffffffffffffffffffffffffffff16600f604051610a06906134a3565b60006040518083038185875af1925050503d8060008114610a43576040519150601f19603f3d011682016040523d82523d6000602084013e610a48565b606091505b5050905080610a8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a839061352a565b60405180910390fd5b505b5b5050505050565b606060008061080173ffffffffffffffffffffffffffffffffffffffff1684604051602401610ac5919061369e565b6040516020818303038152906040527f5431f450000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610b4f91906136ea565b600060405180830381855afa9150503d8060008114610b8a576040519150601f19603f3d011682016040523d82523d6000602084013e610b8f565b606091505b509150915081610bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcb9061374d565b60405180910390fd5b8092505050919050565b610be66122b3565b61080173ffffffffffffffffffffffffffffffffffffffff166354212a89836040518263ffffffff1660e01b8152600401610c2191906132b4565b600060405180830381865afa158015610c3e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610c679190613a46565b9050919050565b3073ffffffffffffffffffffffffffffffffffffffff1663ad5c4cdd85846040518363ffffffff1660e01b8152600401610ca9929190613a8f565b6000604051808303816000875af1925050508015610cea57506040513d6000823e3d601f19601f82011682018060405250810190610ce79190613c0c565b60015b15610cf157505b8015610dee5760008081819054906101000a900460070b80929190610d1590613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008373ffffffffffffffffffffffffffffffffffffffff16600f604051610d66906134a3565b60006040518083038185875af1925050503d8060008114610da3576040519150601f19603f3d011682016040523d82523d6000602084013e610da8565b606091505b5050905080610dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de39061352a565b60405180910390fd5b505b50505050565b600061080173ffffffffffffffffffffffffffffffffffffffff168383604051602401610e22929190613c55565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610eac91906136ea565b600060405180830381855af49150503d8060008114610ee7576040519150601f19603f3d011682016040523d82523d6000602084013e610eec565b606091505b5050905080610f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2790613cf7565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6130846040518363ffffffff1660e01b8152600401610f74929190613c55565b6000604051808303816000875af1158015610f93573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610fbc9190613c0c565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9684846040518363ffffffff1660e01b8152600401611002929190613c55565b6020604051808303816000875af1158015611021573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104591906135f6565b905092915050565b606082156111805760008081819054906101000a900460070b8092919061107390613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff160217905550503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461117f5760008473ffffffffffffffffffffffffffffffffffffffff16600f6040516110f7906134a3565b60006040518083038185875af1925050503d8060008114611134576040519150601f19603f3d011682016040523d82523d6000602084013e611139565b606091505b505090508061117d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111749061352a565b60405180910390fd5b505b5b61080173ffffffffffffffffffffffffffffffffffffffff16633ce4e3be866040518263ffffffff1660e01b81526004016111bb91906132b4565b6000604051808303816000875af11580156111da573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906112039190613c0c565b905081156113365760008081819054906101000a900460070b8092919061122990613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff160217905550503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146113355760008473ffffffffffffffffffffffffffffffffffffffff16600f6040516112ad906134a3565b60006040518083038185875af1925050503d80600081146112ea576040519150601f19603f3d011682016040523d82523d6000602084013e6112ef565b606091505b5050905080611333576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132a9061352a565b60405180910390fd5b505b5b949350505050565b60008054906101000a900460070b81565b811561144c5760008081819054906101000a900460070b8092919061137390613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008473ffffffffffffffffffffffffffffffffffffffff16600f6040516113c4906134a3565b60006040518083038185875af1925050503d8060008114611401576040519150601f19603f3d011682016040523d82523d6000602084013e611406565b606091505b505090508061144a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114419061352a565b60405180910390fd5b505b600061080173ffffffffffffffffffffffffffffffffffffffff1663ed41d0b686866040518363ffffffff1660e01b815260040161148b929190613d26565b6020604051808303816000875af11580156114aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ce91906135f6565b9050806114da57600080fd5b81156115d75760008081819054906101000a900460070b809291906114fe90613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008573ffffffffffffffffffffffffffffffffffffffff16600f60405161154f906134a3565b60006040518083038185875af1925050503d806000811461158c576040519150601f19603f3d011682016040523d82523d6000602084013e611591565b606091505b50509050806115d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cc9061352a565b60405180910390fd5b505b5050505050565b600061080173ffffffffffffffffffffffffffffffffffffffff16632efe8a5f84846040518363ffffffff1660e01b815260040161161d929190613d4f565b6020604051808303816000875af115801561163c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166091906135f6565b905092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff16639ad563b484846040518363ffffffff1660e01b81526004016116a7929190613c55565b600060405180830381865afa1580156116c4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906116ed9190613d78565b905092915050565b600061080173ffffffffffffffffffffffffffffffffffffffff168383604051602401611723929190613c55565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516117ad91906136ea565b600060405180830381855afa9150503d80600081146117e8576040519150601f19603f3d011682016040523d82523d6000602084013e6117ed565b606091505b5050905080611831576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118289061374d565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633dd40f78836040518263ffffffff1660e01b815260040161187391906132b4565b600060405180830381865afa158015611890573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906118b99190613d78565b9050919050565b60606118ca6122d4565b61080173ffffffffffffffffffffffffffffffffffffffff16638f2473ce878787876040518563ffffffff1660e01b815260040161190b9493929190613f4c565b600060405180830381865afa158015611928573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906119519190614224565b9150915094509492505050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9630846040518363ffffffff1660e01b815260040161199d929190613c55565b6020604051808303816000875af11580156119bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e091906135f6565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6184846040518363ffffffff1660e01b8152600401611a26929190613c55565b6000604051808303816000875af1158015611a45573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611a6e9190613c0c565b905092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6184846040518363ffffffff1660e01b8152600401611ab5929190613c55565b6000604051808303816000875af1158015611ad4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611afd9190613c0c565b600080fd5b60608215611c015760008081819054906101000a900460070b80929190611b2890613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008573ffffffffffffffffffffffffffffffffffffffff16600f604051611b79906134a3565b60006040518083038185875af1925050503d8060008114611bb6576040519150601f19603f3d011682016040523d82523d6000602084013e611bbb565b606091505b5050905080611bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf69061352a565b60405180910390fd5b505b61080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6186866040518363ffffffff1660e01b8152600401611c3e929190613a8f565b6000604051808303816000875af1158015611c5d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611c869190613c0c565b90508115611d855760008081819054906101000a900460070b80929190611cac90613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008573ffffffffffffffffffffffffffffffffffffffff16600f604051611cfd906134a3565b60006040518083038185875af1925050503d8060008114611d3a576040519150601f19603f3d011682016040523d82523d6000602084013e611d3f565b606091505b5050905080611d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7a9061352a565b60405180910390fd5b505b949350505050565b6060600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9633876040518363ffffffff1660e01b8152600401611dce929190613c55565b6020604051808303816000875af1158015611ded573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e1191906135f6565b905080611e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4a906142e8565b60405180910390fd5b61080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6185856040518363ffffffff1660e01b8152600401611e90929190613c55565b6000604051808303816000875af1158015611eaf573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611ed89190613c0c565b9150509392505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663a66cb605836040518263ffffffff1660e01b8152600401611f1f919061369e565b600060405180830381865afa158015611f3c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611f6591906143e9565b9050919050565b600060016000808282829054906101000a900460070b611f8c9190614432565b92506101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff16021790555061080173ffffffffffffffffffffffffffffffffffffffff1663ed41d0b684846040518363ffffffff1660e01b8152600401611ff2929190614492565b6020604051808303816000875af1158015612011573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203591906135f6565b905060016000808282829054906101000a900460070b61205591906144bb565b92506101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff16021790555092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff16635431f450836040518263ffffffff1660e01b81526004016120c1919061369e565b600060405180830381865afa1580156120de573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612107919061451b565b9050919050565b565b606061080173ffffffffffffffffffffffffffffffffffffffff166385b2d2da836040518263ffffffff1660e01b815260040161214d91906132b4565b600060405180830381865afa15801561216a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906121939190613d78565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633ce4e3be836040518263ffffffff1660e01b81526004016121d791906132b4565b6000604051808303816000875af11580156121f6573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061221f9190613c0c565b9050919050565b60608061080173ffffffffffffffffffffffffffffffffffffffff166354be1a28846040518263ffffffff1660e01b8152600401612264919061369e565b600060405180830381865afa158015612281573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906122aa91906146cd565b91509150915091565b60405180606001604052806060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123378261230c565b9050919050565b6123478161232c565b811461235257600080fd5b50565b6000813590506123648161233e565b92915050565b600063ffffffff82169050919050565b6123838161236a565b811461238e57600080fd5b50565b6000813590506123a08161237a565b92915050565b60008115159050919050565b6123bb816123a6565b81146123c657600080fd5b50565b6000813590506123d8816123b2565b92915050565b600080600080608085870312156123f8576123f7612302565b5b600061240687828801612355565b945050602061241787828801612391565b9350506040612428878288016123c9565b9250506060612439878288016123c9565b91505092959194509250565b60006124508261230c565b9050919050565b61246081612445565b811461246b57600080fd5b50565b60008135905061247d81612457565b92915050565b60006020828403121561249957612498612302565b5b60006124a78482850161246e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156124ea5780820151818401526020810190506124cf565b60008484015250505050565b6000601f19601f8301169050919050565b6000612512826124b0565b61251c81856124bb565b935061252c8185602086016124cc565b612535816124f6565b840191505092915050565b6000602082019050818103600083015261255a8184612507565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6125a4826124f6565b810181811067ffffffffffffffff821117156125c3576125c261256c565b5b80604052505050565b60006125d66122f8565b90506125e2828261259b565b919050565b600067ffffffffffffffff8211156126025761260161256c565b5b61260b826124f6565b9050602081019050919050565b82818337600083830152505050565b600061263a612635846125e7565b6125cc565b90508281526020810184848401111561265657612655612567565b5b612661848285612618565b509392505050565b600082601f83011261267e5761267d612562565b5b813561268e848260208601612627565b91505092915050565b6000602082840312156126ad576126ac612302565b5b600082013567ffffffffffffffff8111156126cb576126ca612307565b5b6126d784828501612669565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000612707826126e0565b61271181856126eb565b93506127218185602086016124cc565b61272a816124f6565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000819050919050565b61277481612761565b82525050565b600060ff82169050919050565b6127908161277a565b82525050565b600060608301600083015184820360008601526127b382826126fc565b91505060208301516127c8602086018261276b565b5060408301516127db6040860182612787565b508091505092915050565b60006127f28383612796565b905092915050565b6000602082019050919050565b600061281282612735565b61281c8185612740565b93508360208202850161282e85612751565b8060005b8581101561286a578484038952815161284b85826127e6565b9450612856836127fa565b925060208a01995050600181019050612832565b50829750879550505050505092915050565b6000606083016000830151848203600086015261289982826126fc565b915050602083015184820360208601526128b38282612807565b915050604083015184820360408601526128cd8282612807565b9150508091505092915050565b600060208201905081810360008301526128f4818461287c565b905092915050565b6000806000806080858703121561291657612915612302565b5b600061292487828801612355565b945050602061293587828801612355565b935050604085013567ffffffffffffffff81111561295657612955612307565b5b61296287828801612669565b9250506060612973878288016123c9565b91505092959194509250565b6000806040838503121561299657612995612302565b5b60006129a48582860161246e565b925050602083013567ffffffffffffffff8111156129c5576129c4612307565b5b6129d185828601612669565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006040830160008301518482036000860152612a2482826126fc565b9150506020830151612a39602086018261276b565b508091505092915050565b6000612a508383612a07565b905092915050565b6000602082019050919050565b6000612a70826129db565b612a7a81856129e6565b935083602082028501612a8c856129f7565b8060005b85811015612ac85784840389528151612aa98582612a44565b9450612ab483612a58565b925060208a01995050600181019050612a90565b50829750879550505050505092915050565b60006020820190508181036000830152612af48184612a65565b905092915050565b612b05816123a6565b82525050565b6000602082019050612b206000830184612afc565b92915050565b60008060008060808587031215612b4057612b3f612302565b5b600085013567ffffffffffffffff811115612b5e57612b5d612307565b5b612b6a87828801612669565b9450506020612b7b87828801612355565b9350506040612b8c878288016123c9565b9250506060612b9d878288016123c9565b91505092959194509250565b60008160070b9050919050565b612bbf81612ba9565b82525050565b6000602082019050612bda6000830184612bb6565b92915050565b612be981612761565b8114612bf457600080fd5b50565b600081359050612c0681612be0565b92915050565b60008060008060808587031215612c2657612c25612302565b5b6000612c3487828801612355565b9450506020612c4587828801612bf7565b9350506040612c56878288016123c9565b9250506060612c67878288016123c9565b91505092959194509250565b60008060408385031215612c8a57612c89612302565b5b6000612c988582860161246e565b9250506020612ca985828601612391565b9150509250929050565b600082825260208201905092915050565b6000612ccf82612735565b612cd98185612cb3565b935083602082028501612ceb85612751565b8060005b85811015612d275784840389528151612d0885826127e6565b9450612d13836127fa565b925060208a01995050600181019050612cef565b50829750879550505050505092915050565b60006020820190508181036000830152612d538184612cc4565b905092915050565b600067ffffffffffffffff82169050919050565b612d7881612d5b565b8114612d8357600080fd5b50565b600081359050612d9581612d6f565b92915050565b600080fd5b600060a08284031215612db657612db5612d9b565b5b81905092915050565b60008060008060808587031215612dd957612dd8612302565b5b600085013567ffffffffffffffff811115612df757612df6612307565b5b612e0387828801612669565b9450506020612e1487828801612d86565b9350506040612e2587828801612d86565b925050606085013567ffffffffffffffff811115612e4657612e45612307565b5b612e5287828801612da0565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612e9381612d5b565b82525050565b604082016000820151612eaf600085018261276b565b506020820151612ec26020850182612787565b50505050565b606082016000820151612ede6000850182612e8a565b506020820151612ef16020850182612e99565b50505050565b6000612f038383612ec8565b60608301905092915050565b6000602082019050919050565b6000612f2782612e5e565b612f318185612e69565b9350612f3c83612e7a565b8060005b83811015612f6d578151612f548882612ef7565b9750612f5f83612f0f565b925050600181019050612f40565b5085935050505092915050565b600082825260208201905092915050565b6000612f96826124b0565b612fa08185612f7a565b9350612fb08185602086016124cc565b612fb9816124f6565b840191505092915050565b60006040830160008301518482036000860152612fe18282612f8b565b9150506020830151612ff66020860182612e8a565b508091505092915050565b6000604082019050818103600083015261301b8185612f1c565b9050818103602083015261302f8184612fc4565b90509392505050565b6000806000806080858703121561305257613051612302565b5b600061306087828801612355565b945050602085013567ffffffffffffffff81111561308157613080612307565b5b61308d87828801612669565b935050604061309e878288016123c9565b92505060606130af878288016123c9565b91505092959194509250565b6000806000606084860312156130d4576130d3612302565b5b600084013567ffffffffffffffff8111156130f2576130f1612307565b5b6130fe86828701612669565b935050602061310f8682870161246e565b925050604084013567ffffffffffffffff8111156131305761312f612307565b5b61313c86828701612669565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061317e83836126fc565b905092915050565b6000602082019050919050565b600061319e82613146565b6131a88185613151565b9350836020820285016131ba85613162565b8060005b858110156131f657848403895281516131d78582613172565b94506131e283613186565b925060208a019950506001810190506131be565b50829750879550505050505092915050565b600060208201905081810360008301526132228184613193565b905092915050565b6000806040838503121561324157613240612302565b5b600061324f8582860161246e565b925050602061326085828601612bf7565b9150509250929050565b600082825260208201905092915050565b6000613286826126e0565b613290818561326a565b93506132a08185602086016124cc565b6132a9816124f6565b840191505092915050565b600060208201905081810360008301526132ce818461327b565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000604083016000830151848203600086015261331f82826126fc565b915050602083015184820360208601526133398282612807565b9150508091505092915050565b60006133528383613302565b905092915050565b6000602082019050919050565b6000613372826132d6565b61337c81856132e1565b93508360208202850161338e856132f2565b8060005b858110156133ca57848403895281516133ab8582613346565b94506133b68361335a565b925060208a01995050600181019050613392565b50829750879550505050505092915050565b600060408201905081810360008301526133f68185613367565b9050818103602083015261340a8184612cc4565b90509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061344d82612ba9565b9150677fffffffffffffff820361346757613466613413565b5b600182019050919050565b600081905092915050565b50565b600061348d600083613472565b91506134988261347d565b600082019050919050565b60006134ae82613480565b9150819050919050565b7f4661696c656420746f2073656e6420457468657220746f2064656c656761746f60008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061351460218361326a565b915061351f826134b8565b604082019050919050565b6000602082019050818103600083015261354381613507565b9050919050565b6000819050919050565b600061356f61356a6135658461230c565b61354a565b61230c565b9050919050565b600061358182613554565b9050919050565b600061359382613576565b9050919050565b6135a381613588565b82525050565b6135b28161236a565b82525050565b60006040820190506135cd600083018561359a565b6135da60208301846135a9565b9392505050565b6000815190506135f0816123b2565b92915050565b60006020828403121561360c5761360b612302565b5b600061361a848285016135e1565b91505092915050565b7f6661696c656420746f20636c61696d2072657761726473000000000000000000600082015250565b600061365960178361326a565b915061366482613623565b602082019050919050565b600060208201905081810360008301526136888161364c565b9050919050565b61369881612445565b82525050565b60006020820190506136b3600083018461368f565b92915050565b60006136c4826124b0565b6136ce8185613472565b93506136de8185602086016124cc565b80840191505092915050565b60006136f682846136b9565b915081905092915050565b7f6661696c65642073746174696343616c6c20746f20707265636f6d70696c6500600082015250565b6000613737601f8361326a565b915061374282613701565b602082019050919050565b600060208201905081810360008301526137668161372a565b9050919050565b600080fd5b600080fd5b600061378a613785846125e7565b6125cc565b9050828152602081018484840111156137a6576137a5612567565b5b6137b18482856124cc565b509392505050565b600082601f8301126137ce576137cd612562565b5b81516137de848260208601613777565b91505092915050565b600067ffffffffffffffff8211156138025761380161256c565b5b602082029050602081019050919050565b600080fd5b60008151905061382781612be0565b92915050565b6138368161277a565b811461384157600080fd5b50565b6000815190506138538161382d565b92915050565b60006060828403121561386f5761386e61376d565b5b61387960606125cc565b9050600082015167ffffffffffffffff81111561389957613898613772565b5b6138a5848285016137b9565b60008301525060206138b984828501613818565b60208301525060406138cd84828501613844565b60408301525092915050565b60006138ec6138e7846137e7565b6125cc565b9050808382526020820190506020840283018581111561390f5761390e613813565b5b835b8181101561395657805167ffffffffffffffff81111561393457613933612562565b5b8086016139418982613859565b85526020850194505050602081019050613911565b5050509392505050565b600082601f83011261397557613974612562565b5b81516139858482602086016138d9565b91505092915050565b6000606082840312156139a4576139a361376d565b5b6139ae60606125cc565b9050600082015167ffffffffffffffff8111156139ce576139cd613772565b5b6139da848285016137b9565b600083015250602082015167ffffffffffffffff8111156139fe576139fd613772565b5b613a0a84828501613960565b602083015250604082015167ffffffffffffffff811115613a2e57613a2d613772565b5b613a3a84828501613960565b60408301525092915050565b600060208284031215613a5c57613a5b612302565b5b600082015167ffffffffffffffff811115613a7a57613a79612307565b5b613a868482850161398e565b91505092915050565b6000604082019050613aa4600083018561359a565b8181036020830152613ab6818461327b565b90509392505050565b600067ffffffffffffffff821115613ada57613ad961256c565b5b602082029050602081019050919050565b600060408284031215613b0157613b0061376d565b5b613b0b60406125cc565b9050600082015167ffffffffffffffff811115613b2b57613b2a613772565b5b613b37848285016137b9565b6000830152506020613b4b84828501613818565b60208301525092915050565b6000613b6a613b6584613abf565b6125cc565b90508083825260208201905060208402830185811115613b8d57613b8c613813565b5b835b81811015613bd457805167ffffffffffffffff811115613bb257613bb1612562565b5b808601613bbf8982613aeb565b85526020850194505050602081019050613b8f565b5050509392505050565b600082601f830112613bf357613bf2612562565b5b8151613c03848260208601613b57565b91505092915050565b600060208284031215613c2257613c21612302565b5b600082015167ffffffffffffffff811115613c4057613c3f612307565b5b613c4c84828501613bde565b91505092915050565b6000604082019050613c6a600083018561368f565b8181036020830152613c7c818461327b565b90509392505050565b7f6661696c65642064656c656761746543616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000613ce160218361326a565b9150613cec82613c85565b604082019050919050565b60006020820190508181036000830152613d1081613cd4565b9050919050565b613d2081612761565b82525050565b6000604082019050613d3b600083018561359a565b613d486020830184613d17565b9392505050565b6000604082019050613d64600083018561368f565b613d7160208301846135a9565b9392505050565b600060208284031215613d8e57613d8d612302565b5b600082015167ffffffffffffffff811115613dac57613dab612307565b5b613db884828501613960565b91505092915050565b613dca81612d5b565b82525050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112613dfc57613dfb613dda565b5b83810192508235915060208301925067ffffffffffffffff821115613e2457613e23613dd0565b5b600182023603831315613e3a57613e39613dd5565b5b509250929050565b6000613e4e8385612f7a565b9350613e5b838584612618565b613e64836124f6565b840190509392505050565b6000613e7e6020840184612d86565b905092915050565b6000613e9560208401846123c9565b905092915050565b613ea6816123a6565b82525050565b600060a08301613ebf6000840184613ddf565b8583036000870152613ed2838284613e42565b92505050613ee36020840184613e6f565b613ef06020860182612e8a565b50613efe6040840184613e6f565b613f0b6040860182612e8a565b50613f196060840184613e86565b613f266060860182613e9d565b50613f346080840184613e86565b613f416080860182613e9d565b508091505092915050565b60006080820190508181036000830152613f66818761327b565b9050613f756020830186613dc1565b613f826040830185613dc1565b8181036060830152613f948184613eac565b905095945050505050565b600067ffffffffffffffff821115613fba57613fb961256c565b5b602082029050602081019050919050565b600081519050613fda81612d6f565b92915050565b600060408284031215613ff657613ff561376d565b5b61400060406125cc565b9050600061401084828501613818565b600083015250602061402484828501613844565b60208301525092915050565b6000606082840312156140465761404561376d565b5b61405060406125cc565b9050600061406084828501613fcb565b600083015250602061407484828501613fe0565b60208301525092915050565b600061409361408e84613f9f565b6125cc565b905080838252602082019050606084028301858111156140b6576140b5613813565b5b835b818110156140df57806140cb8882614030565b8452602084019350506060810190506140b8565b5050509392505050565b600082601f8301126140fe576140fd612562565b5b815161410e848260208601614080565b91505092915050565b600067ffffffffffffffff8211156141325761413161256c565b5b61413b826124f6565b9050602081019050919050565b600061415b61415684614117565b6125cc565b90508281526020810184848401111561417757614176612567565b5b6141828482856124cc565b509392505050565b600082601f83011261419f5761419e612562565b5b81516141af848260208601614148565b91505092915050565b6000604082840312156141ce576141cd61376d565b5b6141d860406125cc565b9050600082015167ffffffffffffffff8111156141f8576141f7613772565b5b6142048482850161418a565b600083015250602061421884828501613fcb565b60208301525092915050565b6000806040838503121561423b5761423a612302565b5b600083015167ffffffffffffffff81111561425957614258612307565b5b614265858286016140e9565b925050602083015167ffffffffffffffff81111561428657614285612307565b5b614292858286016141b8565b9150509250929050565b7f6661696c656420746f2073657420776974686472617720616464726573730000600082015250565b60006142d2601e8361326a565b91506142dd8261429c565b602082019050919050565b60006020820190508181036000830152614301816142c5565b9050919050565b600067ffffffffffffffff8211156143235761432261256c565b5b602082029050602081019050919050565b600061434761434284614308565b6125cc565b9050808382526020820190506020840283018581111561436a57614369613813565b5b835b818110156143b157805167ffffffffffffffff81111561438f5761438e612562565b5b80860161439c89826137b9565b8552602085019450505060208101905061436c565b5050509392505050565b600082601f8301126143d0576143cf612562565b5b81516143e0848260208601614334565b91505092915050565b6000602082840312156143ff576143fe612302565b5b600082015167ffffffffffffffff81111561441d5761441c612307565b5b614429848285016143bb565b91505092915050565b600061443d82612ba9565b915061444883612ba9565b925082820190507fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008112677fffffffffffffff8213171561448c5761448b613413565b5b92915050565b60006040820190506144a7600083018561368f565b6144b46020830184613d17565b9392505050565b60006144c682612ba9565b91506144d183612ba9565b92508282039050677fffffffffffffff81137fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008212171561451557614514613413565b5b92915050565b60006020828403121561453157614530612302565b5b600082015167ffffffffffffffff81111561454f5761454e612307565b5b61455b848285016137b9565b91505092915050565b600067ffffffffffffffff82111561457f5761457e61256c565b5b602082029050602081019050919050565b6000604082840312156145a6576145a561376d565b5b6145b060406125cc565b9050600082015167ffffffffffffffff8111156145d0576145cf613772565b5b6145dc848285016137b9565b600083015250602082015167ffffffffffffffff811115614600576145ff613772565b5b61460c84828501613960565b60208301525092915050565b600061462b61462684614564565b6125cc565b9050808382526020820190506020840283018581111561464e5761464d613813565b5b835b8181101561469557805167ffffffffffffffff81111561467357614672612562565b5b8086016146808982614590565b85526020850194505050602081019050614650565b5050509392505050565b600082601f8301126146b4576146b3612562565b5b81516146c4848260208601614618565b91505092915050565b600080604083850312156146e4576146e3612302565b5b600083015167ffffffffffffffff81111561470257614701612307565b5b61470e8582860161469f565b925050602083015167ffffffffffffffff81111561472f5761472e612307565b5b61473b85828601613960565b915050925092905056fea2646970667358221220a8fdbc3760bca6bed7c0d0a8bfa4c3e75e199774f0a60a0a34530a58ee2456ed64736f6c63430008130033", + "deployedBytecode": "0x60806040526004361061019c5760003560e01c80637c9db0bb116100ec578063b6a216ae1161008a578063d0e30db011610064578063d0e30db0146106a7578063d3f831be146106b1578063e0421e39146106ee578063e236c7a61461072b5761019c565b8063b6a216ae146105f0578063c7804bb51461062d578063cb85aa0a1461066a5761019c565b806398194593116100c657806398194593146104fc578063ad5c4cdd14610539578063adb2378514610576578063b2d17883146105b35761019c565b80637c9db0bb1461044457806388b2d58114610481578063963516e4146104bf5761019c565b806346e16d34116101595780636cc9ac8a116101335780636cc9ac8a146103785780636f669da4146103a157806378a5dfd1146103de578063796b96d21461041b5761019c565b806346e16d34146102d3578063613d4de81461031057806361bc221a1461034d5761019c565b80630183e4b4146101a157806301b68000146101ca5780630c05e9e4146102075780631b05020714610244578063296c60aa1461026d5780632d0ee16a14610296575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c391906123de565b610769565b005b3480156101d657600080fd5b506101f160048036038101906101ec9190612483565b610a96565b6040516101fe9190612540565b60405180910390f35b34801561021357600080fd5b5061022e60048036038101906102299190612697565b610bde565b60405161023b91906128da565b60405180910390f35b34801561025057600080fd5b5061026b600480360381019061026691906128fc565b610c6e565b005b34801561027957600080fd5b50610294600480360381019061028f919061297f565b610df4565b005b3480156102a257600080fd5b506102bd60048036038101906102b89190612697565b610f35565b6040516102ca9190612ada565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f5919061297f565b610fc3565b6040516103079190612b0b565b60405180910390f35b34801561031c57600080fd5b5061033760048036038101906103329190612b26565b61104d565b6040516103449190612ada565b60405180910390f35b34801561035957600080fd5b5061036261133e565b60405161036f9190612bc5565b60405180910390f35b34801561038457600080fd5b5061039f600480360381019061039a9190612c0c565b61134f565b005b3480156103ad57600080fd5b506103c860048036038101906103c39190612c73565b6115de565b6040516103d59190612b0b565b60405180910390f35b3480156103ea57600080fd5b506104056004803603810190610400919061297f565b611668565b6040516104129190612d39565b60405180910390f35b34801561042757600080fd5b50610442600480360381019061043d919061297f565b6116f5565b005b34801561045057600080fd5b5061046b60048036038101906104669190612697565b611836565b6040516104789190612d39565b60405180910390f35b34801561048d57600080fd5b506104a860048036038101906104a39190612dbf565b6118c0565b6040516104b6929190613001565b60405180910390f35b3480156104cb57600080fd5b506104e660048036038101906104e19190612697565b61195e565b6040516104f39190612b0b565b60405180910390f35b34801561050857600080fd5b50610523600480360381019061051e919061297f565b6119e7565b6040516105309190612ada565b60405180910390f35b34801561054557600080fd5b50610560600480360381019061055b919061297f565b611a76565b60405161056d9190612ada565b60405180910390f35b34801561058257600080fd5b5061059d60048036038101906105989190613038565b611b02565b6040516105aa9190612ada565b60405180910390f35b3480156105bf57600080fd5b506105da60048036038101906105d591906130bb565b611d8d565b6040516105e79190612ada565b60405180910390f35b3480156105fc57600080fd5b5061061760048036038101906106129190612483565b611ee2565b6040516106249190613208565b60405180910390f35b34801561063957600080fd5b50610654600480360381019061064f919061322a565b611f6c565b6040516106619190612b0b565b60405180910390f35b34801561067657600080fd5b50610691600480360381019061068c9190612483565b612084565b60405161069e91906132b4565b60405180910390f35b6106af61210e565b005b3480156106bd57600080fd5b506106d860048036038101906106d39190612697565b612110565b6040516106e59190612d39565b60405180910390f35b3480156106fa57600080fd5b5061071560048036038101906107109190612697565b61219a565b6040516107229190612ada565b60405180910390f35b34801561073757600080fd5b50610752600480360381019061074d9190612483565b612226565b6040516107609291906133dc565b60405180910390f35b811561089a5760008081819054906101000a900460070b8092919061078d90613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff160217905550503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146108995760008473ffffffffffffffffffffffffffffffffffffffff16600f604051610811906134a3565b60006040518083038185875af1925050503d806000811461084e576040519150601f19603f3d011682016040523d82523d6000602084013e610853565b606091505b5050905080610897576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088e9061352a565b60405180910390fd5b505b5b600061080173ffffffffffffffffffffffffffffffffffffffff16632efe8a5f86866040518363ffffffff1660e01b81526004016108d99291906135b8565b6020604051808303816000875af11580156108f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091c91906135f6565b90508061095e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109559061366f565b60405180910390fd5b8115610a8f5760008081819054906101000a900460070b8092919061098290613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff160217905550503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614610a8e5760008573ffffffffffffffffffffffffffffffffffffffff16600f604051610a06906134a3565b60006040518083038185875af1925050503d8060008114610a43576040519150601f19603f3d011682016040523d82523d6000602084013e610a48565b606091505b5050905080610a8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a839061352a565b60405180910390fd5b505b5b5050505050565b606060008061080173ffffffffffffffffffffffffffffffffffffffff1684604051602401610ac5919061369e565b6040516020818303038152906040527f5431f450000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610b4f91906136ea565b600060405180830381855afa9150503d8060008114610b8a576040519150601f19603f3d011682016040523d82523d6000602084013e610b8f565b606091505b509150915081610bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcb9061374d565b60405180910390fd5b8092505050919050565b610be66122b3565b61080173ffffffffffffffffffffffffffffffffffffffff166354212a89836040518263ffffffff1660e01b8152600401610c2191906132b4565b600060405180830381865afa158015610c3e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610c679190613a46565b9050919050565b3073ffffffffffffffffffffffffffffffffffffffff1663ad5c4cdd85846040518363ffffffff1660e01b8152600401610ca9929190613a8f565b6000604051808303816000875af1925050508015610cea57506040513d6000823e3d601f19601f82011682018060405250810190610ce79190613c0c565b60015b15610cf157505b8015610dee5760008081819054906101000a900460070b80929190610d1590613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008373ffffffffffffffffffffffffffffffffffffffff16600f604051610d66906134a3565b60006040518083038185875af1925050503d8060008114610da3576040519150601f19603f3d011682016040523d82523d6000602084013e610da8565b606091505b5050905080610dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de39061352a565b60405180910390fd5b505b50505050565b600061080173ffffffffffffffffffffffffffffffffffffffff168383604051602401610e22929190613c55565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610eac91906136ea565b600060405180830381855af49150503d8060008114610ee7576040519150601f19603f3d011682016040523d82523d6000602084013e610eec565b606091505b5050905080610f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2790613cf7565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6130846040518363ffffffff1660e01b8152600401610f74929190613c55565b6000604051808303816000875af1158015610f93573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610fbc9190613c0c565b9050919050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9684846040518363ffffffff1660e01b8152600401611002929190613c55565b6020604051808303816000875af1158015611021573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104591906135f6565b905092915050565b606082156111805760008081819054906101000a900460070b8092919061107390613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff160217905550503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461117f5760008473ffffffffffffffffffffffffffffffffffffffff16600f6040516110f7906134a3565b60006040518083038185875af1925050503d8060008114611134576040519150601f19603f3d011682016040523d82523d6000602084013e611139565b606091505b505090508061117d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111749061352a565b60405180910390fd5b505b5b61080173ffffffffffffffffffffffffffffffffffffffff16633ce4e3be866040518263ffffffff1660e01b81526004016111bb91906132b4565b6000604051808303816000875af11580156111da573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906112039190613c0c565b905081156113365760008081819054906101000a900460070b8092919061122990613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff160217905550503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146113355760008473ffffffffffffffffffffffffffffffffffffffff16600f6040516112ad906134a3565b60006040518083038185875af1925050503d80600081146112ea576040519150601f19603f3d011682016040523d82523d6000602084013e6112ef565b606091505b5050905080611333576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132a9061352a565b60405180910390fd5b505b5b949350505050565b60008054906101000a900460070b81565b811561144c5760008081819054906101000a900460070b8092919061137390613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008473ffffffffffffffffffffffffffffffffffffffff16600f6040516113c4906134a3565b60006040518083038185875af1925050503d8060008114611401576040519150601f19603f3d011682016040523d82523d6000602084013e611406565b606091505b505090508061144a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114419061352a565b60405180910390fd5b505b600061080173ffffffffffffffffffffffffffffffffffffffff1663ed41d0b686866040518363ffffffff1660e01b815260040161148b929190613d26565b6020604051808303816000875af11580156114aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ce91906135f6565b9050806114da57600080fd5b81156115d75760008081819054906101000a900460070b809291906114fe90613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008573ffffffffffffffffffffffffffffffffffffffff16600f60405161154f906134a3565b60006040518083038185875af1925050503d806000811461158c576040519150601f19603f3d011682016040523d82523d6000602084013e611591565b606091505b50509050806115d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cc9061352a565b60405180910390fd5b505b5050505050565b600061080173ffffffffffffffffffffffffffffffffffffffff16632efe8a5f84846040518363ffffffff1660e01b815260040161161d929190613d4f565b6020604051808303816000875af115801561163c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166091906135f6565b905092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff16639ad563b484846040518363ffffffff1660e01b81526004016116a7929190613c55565b600060405180830381865afa1580156116c4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906116ed9190613d78565b905092915050565b600061080173ffffffffffffffffffffffffffffffffffffffff168383604051602401611723929190613c55565b6040516020818303038152906040527f5a9d9a96000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516117ad91906136ea565b600060405180830381855afa9150503d80600081146117e8576040519150601f19603f3d011682016040523d82523d6000602084013e6117ed565b606091505b5050905080611831576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118289061374d565b60405180910390fd5b505050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633dd40f78836040518263ffffffff1660e01b815260040161187391906132b4565b600060405180830381865afa158015611890573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906118b99190613d78565b9050919050565b60606118ca6122d4565b61080173ffffffffffffffffffffffffffffffffffffffff16638f2473ce878787876040518563ffffffff1660e01b815260040161190b9493929190613f4c565b600060405180830381865afa158015611928573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906119519190614224565b9150915094509492505050565b600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9630846040518363ffffffff1660e01b815260040161199d929190613c55565b6020604051808303816000875af11580156119bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e091906135f6565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6184846040518363ffffffff1660e01b8152600401611a26929190613c55565b6000604051808303816000875af1158015611a45573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611a6e9190613c0c565b905092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6184846040518363ffffffff1660e01b8152600401611ab5929190613c55565b6000604051808303816000875af1158015611ad4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611afd9190613c0c565b600080fd5b60608215611c015760008081819054906101000a900460070b80929190611b2890613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008573ffffffffffffffffffffffffffffffffffffffff16600f604051611b79906134a3565b60006040518083038185875af1925050503d8060008114611bb6576040519150601f19603f3d011682016040523d82523d6000602084013e611bbb565b606091505b5050905080611bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf69061352a565b60405180910390fd5b505b61080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6186866040518363ffffffff1660e01b8152600401611c3e929190613a8f565b6000604051808303816000875af1158015611c5d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611c869190613c0c565b90508115611d855760008081819054906101000a900460070b80929190611cac90613442565b91906101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055505060008573ffffffffffffffffffffffffffffffffffffffff16600f604051611cfd906134a3565b60006040518083038185875af1925050503d8060008114611d3a576040519150601f19603f3d011682016040523d82523d6000602084013e611d3f565b606091505b5050905080611d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7a9061352a565b60405180910390fd5b505b949350505050565b6060600061080173ffffffffffffffffffffffffffffffffffffffff16635a9d9a9633876040518363ffffffff1660e01b8152600401611dce929190613c55565b6020604051808303816000875af1158015611ded573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e1191906135f6565b905080611e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4a906142e8565b60405180910390fd5b61080173ffffffffffffffffffffffffffffffffffffffff1663b46a8d6185856040518363ffffffff1660e01b8152600401611e90929190613c55565b6000604051808303816000875af1158015611eaf573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611ed89190613c0c565b9150509392505050565b606061080173ffffffffffffffffffffffffffffffffffffffff1663a66cb605836040518263ffffffff1660e01b8152600401611f1f919061369e565b600060405180830381865afa158015611f3c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611f6591906143e9565b9050919050565b600060016000808282829054906101000a900460070b611f8c9190614432565b92506101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff16021790555061080173ffffffffffffffffffffffffffffffffffffffff1663ed41d0b684846040518363ffffffff1660e01b8152600401611ff2929190614492565b6020604051808303816000875af1158015612011573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203591906135f6565b905060016000808282829054906101000a900460070b61205591906144bb565b92506101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff16021790555092915050565b606061080173ffffffffffffffffffffffffffffffffffffffff16635431f450836040518263ffffffff1660e01b81526004016120c1919061369e565b600060405180830381865afa1580156120de573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612107919061451b565b9050919050565b565b606061080173ffffffffffffffffffffffffffffffffffffffff166385b2d2da836040518263ffffffff1660e01b815260040161214d91906132b4565b600060405180830381865afa15801561216a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906121939190613d78565b9050919050565b606061080173ffffffffffffffffffffffffffffffffffffffff16633ce4e3be836040518263ffffffff1660e01b81526004016121d791906132b4565b6000604051808303816000875af11580156121f6573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061221f9190613c0c565b9050919050565b60608061080173ffffffffffffffffffffffffffffffffffffffff166354be1a28846040518263ffffffff1660e01b8152600401612264919061369e565b600060405180830381865afa158015612281573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906122aa91906146cd565b91509150915091565b60405180606001604052806060815260200160608152602001606081525090565b604051806040016040528060608152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123378261230c565b9050919050565b6123478161232c565b811461235257600080fd5b50565b6000813590506123648161233e565b92915050565b600063ffffffff82169050919050565b6123838161236a565b811461238e57600080fd5b50565b6000813590506123a08161237a565b92915050565b60008115159050919050565b6123bb816123a6565b81146123c657600080fd5b50565b6000813590506123d8816123b2565b92915050565b600080600080608085870312156123f8576123f7612302565b5b600061240687828801612355565b945050602061241787828801612391565b9350506040612428878288016123c9565b9250506060612439878288016123c9565b91505092959194509250565b60006124508261230c565b9050919050565b61246081612445565b811461246b57600080fd5b50565b60008135905061247d81612457565b92915050565b60006020828403121561249957612498612302565b5b60006124a78482850161246e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156124ea5780820151818401526020810190506124cf565b60008484015250505050565b6000601f19601f8301169050919050565b6000612512826124b0565b61251c81856124bb565b935061252c8185602086016124cc565b612535816124f6565b840191505092915050565b6000602082019050818103600083015261255a8184612507565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6125a4826124f6565b810181811067ffffffffffffffff821117156125c3576125c261256c565b5b80604052505050565b60006125d66122f8565b90506125e2828261259b565b919050565b600067ffffffffffffffff8211156126025761260161256c565b5b61260b826124f6565b9050602081019050919050565b82818337600083830152505050565b600061263a612635846125e7565b6125cc565b90508281526020810184848401111561265657612655612567565b5b612661848285612618565b509392505050565b600082601f83011261267e5761267d612562565b5b813561268e848260208601612627565b91505092915050565b6000602082840312156126ad576126ac612302565b5b600082013567ffffffffffffffff8111156126cb576126ca612307565b5b6126d784828501612669565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000612707826126e0565b61271181856126eb565b93506127218185602086016124cc565b61272a816124f6565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000819050919050565b61277481612761565b82525050565b600060ff82169050919050565b6127908161277a565b82525050565b600060608301600083015184820360008601526127b382826126fc565b91505060208301516127c8602086018261276b565b5060408301516127db6040860182612787565b508091505092915050565b60006127f28383612796565b905092915050565b6000602082019050919050565b600061281282612735565b61281c8185612740565b93508360208202850161282e85612751565b8060005b8581101561286a578484038952815161284b85826127e6565b9450612856836127fa565b925060208a01995050600181019050612832565b50829750879550505050505092915050565b6000606083016000830151848203600086015261289982826126fc565b915050602083015184820360208601526128b38282612807565b915050604083015184820360408601526128cd8282612807565b9150508091505092915050565b600060208201905081810360008301526128f4818461287c565b905092915050565b6000806000806080858703121561291657612915612302565b5b600061292487828801612355565b945050602061293587828801612355565b935050604085013567ffffffffffffffff81111561295657612955612307565b5b61296287828801612669565b9250506060612973878288016123c9565b91505092959194509250565b6000806040838503121561299657612995612302565b5b60006129a48582860161246e565b925050602083013567ffffffffffffffff8111156129c5576129c4612307565b5b6129d185828601612669565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006040830160008301518482036000860152612a2482826126fc565b9150506020830151612a39602086018261276b565b508091505092915050565b6000612a508383612a07565b905092915050565b6000602082019050919050565b6000612a70826129db565b612a7a81856129e6565b935083602082028501612a8c856129f7565b8060005b85811015612ac85784840389528151612aa98582612a44565b9450612ab483612a58565b925060208a01995050600181019050612a90565b50829750879550505050505092915050565b60006020820190508181036000830152612af48184612a65565b905092915050565b612b05816123a6565b82525050565b6000602082019050612b206000830184612afc565b92915050565b60008060008060808587031215612b4057612b3f612302565b5b600085013567ffffffffffffffff811115612b5e57612b5d612307565b5b612b6a87828801612669565b9450506020612b7b87828801612355565b9350506040612b8c878288016123c9565b9250506060612b9d878288016123c9565b91505092959194509250565b60008160070b9050919050565b612bbf81612ba9565b82525050565b6000602082019050612bda6000830184612bb6565b92915050565b612be981612761565b8114612bf457600080fd5b50565b600081359050612c0681612be0565b92915050565b60008060008060808587031215612c2657612c25612302565b5b6000612c3487828801612355565b9450506020612c4587828801612bf7565b9350506040612c56878288016123c9565b9250506060612c67878288016123c9565b91505092959194509250565b60008060408385031215612c8a57612c89612302565b5b6000612c988582860161246e565b9250506020612ca985828601612391565b9150509250929050565b600082825260208201905092915050565b6000612ccf82612735565b612cd98185612cb3565b935083602082028501612ceb85612751565b8060005b85811015612d275784840389528151612d0885826127e6565b9450612d13836127fa565b925060208a01995050600181019050612cef565b50829750879550505050505092915050565b60006020820190508181036000830152612d538184612cc4565b905092915050565b600067ffffffffffffffff82169050919050565b612d7881612d5b565b8114612d8357600080fd5b50565b600081359050612d9581612d6f565b92915050565b600080fd5b600060a08284031215612db657612db5612d9b565b5b81905092915050565b60008060008060808587031215612dd957612dd8612302565b5b600085013567ffffffffffffffff811115612df757612df6612307565b5b612e0387828801612669565b9450506020612e1487828801612d86565b9350506040612e2587828801612d86565b925050606085013567ffffffffffffffff811115612e4657612e45612307565b5b612e5287828801612da0565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612e9381612d5b565b82525050565b604082016000820151612eaf600085018261276b565b506020820151612ec26020850182612787565b50505050565b606082016000820151612ede6000850182612e8a565b506020820151612ef16020850182612e99565b50505050565b6000612f038383612ec8565b60608301905092915050565b6000602082019050919050565b6000612f2782612e5e565b612f318185612e69565b9350612f3c83612e7a565b8060005b83811015612f6d578151612f548882612ef7565b9750612f5f83612f0f565b925050600181019050612f40565b5085935050505092915050565b600082825260208201905092915050565b6000612f96826124b0565b612fa08185612f7a565b9350612fb08185602086016124cc565b612fb9816124f6565b840191505092915050565b60006040830160008301518482036000860152612fe18282612f8b565b9150506020830151612ff66020860182612e8a565b508091505092915050565b6000604082019050818103600083015261301b8185612f1c565b9050818103602083015261302f8184612fc4565b90509392505050565b6000806000806080858703121561305257613051612302565b5b600061306087828801612355565b945050602085013567ffffffffffffffff81111561308157613080612307565b5b61308d87828801612669565b935050604061309e878288016123c9565b92505060606130af878288016123c9565b91505092959194509250565b6000806000606084860312156130d4576130d3612302565b5b600084013567ffffffffffffffff8111156130f2576130f1612307565b5b6130fe86828701612669565b935050602061310f8682870161246e565b925050604084013567ffffffffffffffff8111156131305761312f612307565b5b61313c86828701612669565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061317e83836126fc565b905092915050565b6000602082019050919050565b600061319e82613146565b6131a88185613151565b9350836020820285016131ba85613162565b8060005b858110156131f657848403895281516131d78582613172565b94506131e283613186565b925060208a019950506001810190506131be565b50829750879550505050505092915050565b600060208201905081810360008301526132228184613193565b905092915050565b6000806040838503121561324157613240612302565b5b600061324f8582860161246e565b925050602061326085828601612bf7565b9150509250929050565b600082825260208201905092915050565b6000613286826126e0565b613290818561326a565b93506132a08185602086016124cc565b6132a9816124f6565b840191505092915050565b600060208201905081810360008301526132ce818461327b565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000604083016000830151848203600086015261331f82826126fc565b915050602083015184820360208601526133398282612807565b9150508091505092915050565b60006133528383613302565b905092915050565b6000602082019050919050565b6000613372826132d6565b61337c81856132e1565b93508360208202850161338e856132f2565b8060005b858110156133ca57848403895281516133ab8582613346565b94506133b68361335a565b925060208a01995050600181019050613392565b50829750879550505050505092915050565b600060408201905081810360008301526133f68185613367565b9050818103602083015261340a8184612cc4565b90509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061344d82612ba9565b9150677fffffffffffffff820361346757613466613413565b5b600182019050919050565b600081905092915050565b50565b600061348d600083613472565b91506134988261347d565b600082019050919050565b60006134ae82613480565b9150819050919050565b7f4661696c656420746f2073656e6420457468657220746f2064656c656761746f60008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061351460218361326a565b915061351f826134b8565b604082019050919050565b6000602082019050818103600083015261354381613507565b9050919050565b6000819050919050565b600061356f61356a6135658461230c565b61354a565b61230c565b9050919050565b600061358182613554565b9050919050565b600061359382613576565b9050919050565b6135a381613588565b82525050565b6135b28161236a565b82525050565b60006040820190506135cd600083018561359a565b6135da60208301846135a9565b9392505050565b6000815190506135f0816123b2565b92915050565b60006020828403121561360c5761360b612302565b5b600061361a848285016135e1565b91505092915050565b7f6661696c656420746f20636c61696d2072657761726473000000000000000000600082015250565b600061365960178361326a565b915061366482613623565b602082019050919050565b600060208201905081810360008301526136888161364c565b9050919050565b61369881612445565b82525050565b60006020820190506136b3600083018461368f565b92915050565b60006136c4826124b0565b6136ce8185613472565b93506136de8185602086016124cc565b80840191505092915050565b60006136f682846136b9565b915081905092915050565b7f6661696c65642073746174696343616c6c20746f20707265636f6d70696c6500600082015250565b6000613737601f8361326a565b915061374282613701565b602082019050919050565b600060208201905081810360008301526137668161372a565b9050919050565b600080fd5b600080fd5b600061378a613785846125e7565b6125cc565b9050828152602081018484840111156137a6576137a5612567565b5b6137b18482856124cc565b509392505050565b600082601f8301126137ce576137cd612562565b5b81516137de848260208601613777565b91505092915050565b600067ffffffffffffffff8211156138025761380161256c565b5b602082029050602081019050919050565b600080fd5b60008151905061382781612be0565b92915050565b6138368161277a565b811461384157600080fd5b50565b6000815190506138538161382d565b92915050565b60006060828403121561386f5761386e61376d565b5b61387960606125cc565b9050600082015167ffffffffffffffff81111561389957613898613772565b5b6138a5848285016137b9565b60008301525060206138b984828501613818565b60208301525060406138cd84828501613844565b60408301525092915050565b60006138ec6138e7846137e7565b6125cc565b9050808382526020820190506020840283018581111561390f5761390e613813565b5b835b8181101561395657805167ffffffffffffffff81111561393457613933612562565b5b8086016139418982613859565b85526020850194505050602081019050613911565b5050509392505050565b600082601f83011261397557613974612562565b5b81516139858482602086016138d9565b91505092915050565b6000606082840312156139a4576139a361376d565b5b6139ae60606125cc565b9050600082015167ffffffffffffffff8111156139ce576139cd613772565b5b6139da848285016137b9565b600083015250602082015167ffffffffffffffff8111156139fe576139fd613772565b5b613a0a84828501613960565b602083015250604082015167ffffffffffffffff811115613a2e57613a2d613772565b5b613a3a84828501613960565b60408301525092915050565b600060208284031215613a5c57613a5b612302565b5b600082015167ffffffffffffffff811115613a7a57613a79612307565b5b613a868482850161398e565b91505092915050565b6000604082019050613aa4600083018561359a565b8181036020830152613ab6818461327b565b90509392505050565b600067ffffffffffffffff821115613ada57613ad961256c565b5b602082029050602081019050919050565b600060408284031215613b0157613b0061376d565b5b613b0b60406125cc565b9050600082015167ffffffffffffffff811115613b2b57613b2a613772565b5b613b37848285016137b9565b6000830152506020613b4b84828501613818565b60208301525092915050565b6000613b6a613b6584613abf565b6125cc565b90508083825260208201905060208402830185811115613b8d57613b8c613813565b5b835b81811015613bd457805167ffffffffffffffff811115613bb257613bb1612562565b5b808601613bbf8982613aeb565b85526020850194505050602081019050613b8f565b5050509392505050565b600082601f830112613bf357613bf2612562565b5b8151613c03848260208601613b57565b91505092915050565b600060208284031215613c2257613c21612302565b5b600082015167ffffffffffffffff811115613c4057613c3f612307565b5b613c4c84828501613bde565b91505092915050565b6000604082019050613c6a600083018561368f565b8181036020830152613c7c818461327b565b90509392505050565b7f6661696c65642064656c656761746543616c6c20746f20707265636f6d70696c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000613ce160218361326a565b9150613cec82613c85565b604082019050919050565b60006020820190508181036000830152613d1081613cd4565b9050919050565b613d2081612761565b82525050565b6000604082019050613d3b600083018561359a565b613d486020830184613d17565b9392505050565b6000604082019050613d64600083018561368f565b613d7160208301846135a9565b9392505050565b600060208284031215613d8e57613d8d612302565b5b600082015167ffffffffffffffff811115613dac57613dab612307565b5b613db884828501613960565b91505092915050565b613dca81612d5b565b82525050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112613dfc57613dfb613dda565b5b83810192508235915060208301925067ffffffffffffffff821115613e2457613e23613dd0565b5b600182023603831315613e3a57613e39613dd5565b5b509250929050565b6000613e4e8385612f7a565b9350613e5b838584612618565b613e64836124f6565b840190509392505050565b6000613e7e6020840184612d86565b905092915050565b6000613e9560208401846123c9565b905092915050565b613ea6816123a6565b82525050565b600060a08301613ebf6000840184613ddf565b8583036000870152613ed2838284613e42565b92505050613ee36020840184613e6f565b613ef06020860182612e8a565b50613efe6040840184613e6f565b613f0b6040860182612e8a565b50613f196060840184613e86565b613f266060860182613e9d565b50613f346080840184613e86565b613f416080860182613e9d565b508091505092915050565b60006080820190508181036000830152613f66818761327b565b9050613f756020830186613dc1565b613f826040830185613dc1565b8181036060830152613f948184613eac565b905095945050505050565b600067ffffffffffffffff821115613fba57613fb961256c565b5b602082029050602081019050919050565b600081519050613fda81612d6f565b92915050565b600060408284031215613ff657613ff561376d565b5b61400060406125cc565b9050600061401084828501613818565b600083015250602061402484828501613844565b60208301525092915050565b6000606082840312156140465761404561376d565b5b61405060406125cc565b9050600061406084828501613fcb565b600083015250602061407484828501613fe0565b60208301525092915050565b600061409361408e84613f9f565b6125cc565b905080838252602082019050606084028301858111156140b6576140b5613813565b5b835b818110156140df57806140cb8882614030565b8452602084019350506060810190506140b8565b5050509392505050565b600082601f8301126140fe576140fd612562565b5b815161410e848260208601614080565b91505092915050565b600067ffffffffffffffff8211156141325761413161256c565b5b61413b826124f6565b9050602081019050919050565b600061415b61415684614117565b6125cc565b90508281526020810184848401111561417757614176612567565b5b6141828482856124cc565b509392505050565b600082601f83011261419f5761419e612562565b5b81516141af848260208601614148565b91505092915050565b6000604082840312156141ce576141cd61376d565b5b6141d860406125cc565b9050600082015167ffffffffffffffff8111156141f8576141f7613772565b5b6142048482850161418a565b600083015250602061421884828501613fcb565b60208301525092915050565b6000806040838503121561423b5761423a612302565b5b600083015167ffffffffffffffff81111561425957614258612307565b5b614265858286016140e9565b925050602083015167ffffffffffffffff81111561428657614285612307565b5b614292858286016141b8565b9150509250929050565b7f6661696c656420746f2073657420776974686472617720616464726573730000600082015250565b60006142d2601e8361326a565b91506142dd8261429c565b602082019050919050565b60006020820190508181036000830152614301816142c5565b9050919050565b600067ffffffffffffffff8211156143235761432261256c565b5b602082029050602081019050919050565b600061434761434284614308565b6125cc565b9050808382526020820190506020840283018581111561436a57614369613813565b5b835b818110156143b157805167ffffffffffffffff81111561438f5761438e612562565b5b80860161439c89826137b9565b8552602085019450505060208101905061436c565b5050509392505050565b600082601f8301126143d0576143cf612562565b5b81516143e0848260208601614334565b91505092915050565b6000602082840312156143ff576143fe612302565b5b600082015167ffffffffffffffff81111561441d5761441c612307565b5b614429848285016143bb565b91505092915050565b600061443d82612ba9565b915061444883612ba9565b925082820190507fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008112677fffffffffffffff8213171561448c5761448b613413565b5b92915050565b60006040820190506144a7600083018561368f565b6144b46020830184613d17565b9392505050565b60006144c682612ba9565b91506144d183612ba9565b92508282039050677fffffffffffffff81137fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008212171561451557614514613413565b5b92915050565b60006020828403121561453157614530612302565b5b600082015167ffffffffffffffff81111561454f5761454e612307565b5b61455b848285016137b9565b91505092915050565b600067ffffffffffffffff82111561457f5761457e61256c565b5b602082029050602081019050919050565b6000604082840312156145a6576145a561376d565b5b6145b060406125cc565b9050600082015167ffffffffffffffff8111156145d0576145cf613772565b5b6145dc848285016137b9565b600083015250602082015167ffffffffffffffff811115614600576145ff613772565b5b61460c84828501613960565b60208301525092915050565b600061462b61462684614564565b6125cc565b9050808382526020820190506020840283018581111561464e5761464d613813565b5b835b8181101561469557805167ffffffffffffffff81111561467357614672612562565b5b8086016146808982614590565b85526020850194505050602081019050614650565b5050509392505050565b600082601f8301126146b4576146b3612562565b5b81516146c4848260208601614618565b91505092915050565b600080604083850312156146e4576146e3612302565b5b600083015167ffffffffffffffff81111561470257614701612307565b5b61470e8582860161469f565b925050602083015167ffffffffffffffff81111561472f5761472e612307565b5b61473b85828601613960565b915050925092905056fea2646970667358221220a8fdbc3760bca6bed7c0d0a8bfa4c3e75e199774f0a60a0a34530a58ee2456ed64736f6c63430008130033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/precompiles/testutil/contracts/FlashLoan.json b/precompiles/testutil/contracts/FlashLoan.json index ab47f6a276..383dc5f949 100644 --- a/precompiles/testutil/contracts/FlashLoan.json +++ b/precompiles/testutil/contracts/FlashLoan.json @@ -1,7 +1,7 @@ { "_format": "hh-sol-artifact-1", "contractName": "FlashLoan", - "sourceName": "contracts/evmos/testutil/contracts/FlashLoan.sol", + "sourceName": "solidity/precompiles/testutil/contracts/FlashLoan.sol", "abi": [ { "inputs": [], @@ -103,8 +103,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506113ea806100606000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80638da5cb5b146100515780638f5184301461006f578063ee52ad711461008b578063f12fae93146100bb575b600080fd5b6100596100eb565b6040516100669190610bdd565b60405180910390f35b61008960048036038101906100849190610db4565b61010f565b005b6100a560048036038101906100a09190610db4565b6101da565b6040516100b29190610e3e565b60405180910390f35b6100d560048036038101906100d09190610db4565b6107c9565b6040516100e29190610e3e565b60405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061080073ffffffffffffffffffffffffffffffffffffffff166353266bbb8585856040518463ffffffff1660e01b815260040161015093929190610ee7565b6020604051808303816000875af115801561016f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101939190610f51565b9050806101d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101cc90610fca565b60405180910390fd5b600080fd5b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461026b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102629061105c565b60405180910390fd5b6000849050828173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b81526004016102ac92919061107c565b602060405180830381865afa1580156102c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ed91906110ba565b101561032e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161032590611133565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016103699190610bdd565b602060405180830381865afa158015610386573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103aa91906110ba565b905060008273ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b81526004016103eb93929190611153565b6020604051808303816000875af115801561040a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061042e9190610f51565b905080610470576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610467906111fc565b60405180910390fd5b848261047c919061124b565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016104b59190610bdd565b602060405180830381865afa1580156104d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f691906110ba565b14610536576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052d906112cb565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3388886040518463ffffffff1660e01b815260040161057593929190610ee7565b6020604051808303816000875af1158015610594573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b89190610f51565b9050806105fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f190610fca565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016106339190610bdd565b602060405180830381865afa158015610650573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067491906110ba565b91508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33876040518363ffffffff1660e01b81526004016106b19291906112eb565b6020604051808303816000875af11580156106d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f49190610f51565b5084826107019190611314565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161073a9190610bdd565b602060405180830381865afa158015610757573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077b91906110ba565b146107bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b290611394565b60405180910390fd5b600193505050509392505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461085a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108519061105c565b60405180910390fd5b6000849050828173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b815260040161089b92919061107c565b602060405180830381865afa1580156108b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108dc91906110ba565b101561091d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091490611133565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016109589190610bdd565b602060405180830381865afa158015610975573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061099991906110ba565b905060008273ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b81526004016109da93929190611153565b6020604051808303816000875af11580156109f9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1d9190610f51565b905080610a5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a56906111fc565b60405180910390fd5b8482610a6b919061124b565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610aa49190610bdd565b602060405180830381865afa158015610ac1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae591906110ba565b14610b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1c906112cb565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16638f5184303388886040518463ffffffff1660e01b8152600401610b6293929190610ee7565b600060405180830381600087803b158015610b7c57600080fd5b505af1925050508015610b8d575060015b50600193505050509392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610bc782610b9c565b9050919050565b610bd781610bbc565b82525050565b6000602082019050610bf26000830184610bce565b92915050565b6000604051905090565b600080fd5b600080fd5b610c1581610bbc565b8114610c2057600080fd5b50565b600081359050610c3281610c0c565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610c8b82610c42565b810181811067ffffffffffffffff82111715610caa57610ca9610c53565b5b80604052505050565b6000610cbd610bf8565b9050610cc98282610c82565b919050565b600067ffffffffffffffff821115610ce957610ce8610c53565b5b610cf282610c42565b9050602081019050919050565b82818337600083830152505050565b6000610d21610d1c84610cce565b610cb3565b905082815260208101848484011115610d3d57610d3c610c3d565b5b610d48848285610cff565b509392505050565b600082601f830112610d6557610d64610c38565b5b8135610d75848260208601610d0e565b91505092915050565b6000819050919050565b610d9181610d7e565b8114610d9c57600080fd5b50565b600081359050610dae81610d88565b92915050565b600080600060608486031215610dcd57610dcc610c02565b5b6000610ddb86828701610c23565b935050602084013567ffffffffffffffff811115610dfc57610dfb610c07565b5b610e0886828701610d50565b9250506040610e1986828701610d9f565b9150509250925092565b60008115159050919050565b610e3881610e23565b82525050565b6000602082019050610e536000830184610e2f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610e93578082015181840152602081019050610e78565b60008484015250505050565b6000610eaa82610e59565b610eb48185610e64565b9350610ec4818560208601610e75565b610ecd81610c42565b840191505092915050565b610ee181610d7e565b82525050565b6000606082019050610efc6000830186610bce565b8181036020830152610f0e8185610e9f565b9050610f1d6040830184610ed8565b949350505050565b610f2e81610e23565b8114610f3957600080fd5b50565b600081519050610f4b81610f25565b92915050565b600060208284031215610f6757610f66610c02565b5b6000610f7584828501610f3c565b91505092915050565b7f6661696c656420746f2064656c65676174650000000000000000000000000000600082015250565b6000610fb4601283610e64565b9150610fbf82610f7e565b602082019050919050565b60006020820190508181036000830152610fe381610fa7565b9050919050565b7f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b6000611046602183610e64565b915061105182610fea565b604082019050919050565b6000602082019050818103600083015261107581611039565b9050919050565b60006040820190506110916000830185610bce565b61109e6020830184610bce565b9392505050565b6000815190506110b481610d88565b92915050565b6000602082840312156110d0576110cf610c02565b5b60006110de848285016110a5565b91505092915050565b7f496e73756666696369656e7420616c6c6f77616e636500000000000000000000600082015250565b600061111d601683610e64565b9150611128826110e7565b602082019050919050565b6000602082019050818103600083015261114c81611110565b9050919050565b60006060820190506111686000830186610bce565b6111756020830185610bce565b6111826040830184610ed8565b949350505050565b7f4661696c656420746f207472616e7366657220746f6b656e7320666f7220666c60008201527f617368206c6f616e000000000000000000000000000000000000000000000000602082015250565b60006111e6602883610e64565b91506111f18261118a565b604082019050919050565b60006020820190508181036000830152611215816111d9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061125682610d7e565b915061126183610d7e565b92508282019050808211156112795761127861121c565b5b92915050565b7f466c617368206c6f616e206661696c6564000000000000000000000000000000600082015250565b60006112b5601183610e64565b91506112c08261127f565b602082019050919050565b600060208201905081810360008301526112e4816112a8565b9050919050565b60006040820190506113006000830185610bce565b61130d6020830184610ed8565b9392505050565b600061131f82610d7e565b915061132a83610d7e565b92508282039050818111156113425761134161121c565b5b92915050565b7f466c617368206c6f616e2072657061796d656e74206661696c65640000000000600082015250565b600061137e601b83610e64565b915061138982611348565b602082019050919050565b600060208201905081810360008301526113ad81611371565b905091905056fea2646970667358221220c424c19551d9b4559d960ffe973aece9d88bd266c540f629abf8f11eb26a6c1e64736f6c63430008120033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c80638da5cb5b146100515780638f5184301461006f578063ee52ad711461008b578063f12fae93146100bb575b600080fd5b6100596100eb565b6040516100669190610bdd565b60405180910390f35b61008960048036038101906100849190610db4565b61010f565b005b6100a560048036038101906100a09190610db4565b6101da565b6040516100b29190610e3e565b60405180910390f35b6100d560048036038101906100d09190610db4565b6107c9565b6040516100e29190610e3e565b60405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061080073ffffffffffffffffffffffffffffffffffffffff166353266bbb8585856040518463ffffffff1660e01b815260040161015093929190610ee7565b6020604051808303816000875af115801561016f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101939190610f51565b9050806101d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101cc90610fca565b60405180910390fd5b600080fd5b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461026b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102629061105c565b60405180910390fd5b6000849050828173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b81526004016102ac92919061107c565b602060405180830381865afa1580156102c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ed91906110ba565b101561032e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161032590611133565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016103699190610bdd565b602060405180830381865afa158015610386573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103aa91906110ba565b905060008273ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b81526004016103eb93929190611153565b6020604051808303816000875af115801561040a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061042e9190610f51565b905080610470576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610467906111fc565b60405180910390fd5b848261047c919061124b565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016104b59190610bdd565b602060405180830381865afa1580156104d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f691906110ba565b14610536576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052d906112cb565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3388886040518463ffffffff1660e01b815260040161057593929190610ee7565b6020604051808303816000875af1158015610594573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b89190610f51565b9050806105fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f190610fca565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016106339190610bdd565b602060405180830381865afa158015610650573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067491906110ba565b91508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33876040518363ffffffff1660e01b81526004016106b19291906112eb565b6020604051808303816000875af11580156106d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f49190610f51565b5084826107019190611314565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161073a9190610bdd565b602060405180830381865afa158015610757573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077b91906110ba565b146107bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b290611394565b60405180910390fd5b600193505050509392505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461085a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108519061105c565b60405180910390fd5b6000849050828173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b815260040161089b92919061107c565b602060405180830381865afa1580156108b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108dc91906110ba565b101561091d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091490611133565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016109589190610bdd565b602060405180830381865afa158015610975573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061099991906110ba565b905060008273ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b81526004016109da93929190611153565b6020604051808303816000875af11580156109f9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1d9190610f51565b905080610a5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a56906111fc565b60405180910390fd5b8482610a6b919061124b565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610aa49190610bdd565b602060405180830381865afa158015610ac1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae591906110ba565b14610b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1c906112cb565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16638f5184303388886040518463ffffffff1660e01b8152600401610b6293929190610ee7565b600060405180830381600087803b158015610b7c57600080fd5b505af1925050508015610b8d575060015b50600193505050509392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610bc782610b9c565b9050919050565b610bd781610bbc565b82525050565b6000602082019050610bf26000830184610bce565b92915050565b6000604051905090565b600080fd5b600080fd5b610c1581610bbc565b8114610c2057600080fd5b50565b600081359050610c3281610c0c565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610c8b82610c42565b810181811067ffffffffffffffff82111715610caa57610ca9610c53565b5b80604052505050565b6000610cbd610bf8565b9050610cc98282610c82565b919050565b600067ffffffffffffffff821115610ce957610ce8610c53565b5b610cf282610c42565b9050602081019050919050565b82818337600083830152505050565b6000610d21610d1c84610cce565b610cb3565b905082815260208101848484011115610d3d57610d3c610c3d565b5b610d48848285610cff565b509392505050565b600082601f830112610d6557610d64610c38565b5b8135610d75848260208601610d0e565b91505092915050565b6000819050919050565b610d9181610d7e565b8114610d9c57600080fd5b50565b600081359050610dae81610d88565b92915050565b600080600060608486031215610dcd57610dcc610c02565b5b6000610ddb86828701610c23565b935050602084013567ffffffffffffffff811115610dfc57610dfb610c07565b5b610e0886828701610d50565b9250506040610e1986828701610d9f565b9150509250925092565b60008115159050919050565b610e3881610e23565b82525050565b6000602082019050610e536000830184610e2f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610e93578082015181840152602081019050610e78565b60008484015250505050565b6000610eaa82610e59565b610eb48185610e64565b9350610ec4818560208601610e75565b610ecd81610c42565b840191505092915050565b610ee181610d7e565b82525050565b6000606082019050610efc6000830186610bce565b8181036020830152610f0e8185610e9f565b9050610f1d6040830184610ed8565b949350505050565b610f2e81610e23565b8114610f3957600080fd5b50565b600081519050610f4b81610f25565b92915050565b600060208284031215610f6757610f66610c02565b5b6000610f7584828501610f3c565b91505092915050565b7f6661696c656420746f2064656c65676174650000000000000000000000000000600082015250565b6000610fb4601283610e64565b9150610fbf82610f7e565b602082019050919050565b60006020820190508181036000830152610fe381610fa7565b9050919050565b7f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b6000611046602183610e64565b915061105182610fea565b604082019050919050565b6000602082019050818103600083015261107581611039565b9050919050565b60006040820190506110916000830185610bce565b61109e6020830184610bce565b9392505050565b6000815190506110b481610d88565b92915050565b6000602082840312156110d0576110cf610c02565b5b60006110de848285016110a5565b91505092915050565b7f496e73756666696369656e7420616c6c6f77616e636500000000000000000000600082015250565b600061111d601683610e64565b9150611128826110e7565b602082019050919050565b6000602082019050818103600083015261114c81611110565b9050919050565b60006060820190506111686000830186610bce565b6111756020830185610bce565b6111826040830184610ed8565b949350505050565b7f4661696c656420746f207472616e7366657220746f6b656e7320666f7220666c60008201527f617368206c6f616e000000000000000000000000000000000000000000000000602082015250565b60006111e6602883610e64565b91506111f18261118a565b604082019050919050565b60006020820190508181036000830152611215816111d9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061125682610d7e565b915061126183610d7e565b92508282019050808211156112795761127861121c565b5b92915050565b7f466c617368206c6f616e206661696c6564000000000000000000000000000000600082015250565b60006112b5601183610e64565b91506112c08261127f565b602082019050919050565b600060208201905081810360008301526112e4816112a8565b9050919050565b60006040820190506113006000830185610bce565b61130d6020830184610ed8565b9392505050565b600061131f82610d7e565b915061132a83610d7e565b92508282039050818111156113425761134161121c565b5b92915050565b7f466c617368206c6f616e2072657061796d656e74206661696c65640000000000600082015250565b600061137e601b83610e64565b915061138982611348565b602082019050919050565b600060208201905081810360008301526113ad81611371565b905091905056fea2646970667358221220c424c19551d9b4559d960ffe973aece9d88bd266c540f629abf8f11eb26a6c1e64736f6c63430008120033", + "bytecode": "0x608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506113ea806100606000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80638da5cb5b146100515780638f5184301461006f578063ee52ad711461008b578063f12fae93146100bb575b600080fd5b6100596100eb565b6040516100669190610bdd565b60405180910390f35b61008960048036038101906100849190610db4565b61010f565b005b6100a560048036038101906100a09190610db4565b6101da565b6040516100b29190610e3e565b60405180910390f35b6100d560048036038101906100d09190610db4565b6107c9565b6040516100e29190610e3e565b60405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061080073ffffffffffffffffffffffffffffffffffffffff166353266bbb8585856040518463ffffffff1660e01b815260040161015093929190610ee7565b6020604051808303816000875af115801561016f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101939190610f51565b9050806101d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101cc90610fca565b60405180910390fd5b600080fd5b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461026b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102629061105c565b60405180910390fd5b6000849050828173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b81526004016102ac92919061107c565b602060405180830381865afa1580156102c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ed91906110ba565b101561032e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161032590611133565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016103699190610bdd565b602060405180830381865afa158015610386573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103aa91906110ba565b905060008273ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b81526004016103eb93929190611153565b6020604051808303816000875af115801561040a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061042e9190610f51565b905080610470576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610467906111fc565b60405180910390fd5b848261047c919061124b565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016104b59190610bdd565b602060405180830381865afa1580156104d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f691906110ba565b14610536576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052d906112cb565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3388886040518463ffffffff1660e01b815260040161057593929190610ee7565b6020604051808303816000875af1158015610594573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b89190610f51565b9050806105fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f190610fca565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016106339190610bdd565b602060405180830381865afa158015610650573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067491906110ba565b91508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33876040518363ffffffff1660e01b81526004016106b19291906112eb565b6020604051808303816000875af11580156106d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f49190610f51565b5084826107019190611314565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161073a9190610bdd565b602060405180830381865afa158015610757573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077b91906110ba565b146107bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b290611394565b60405180910390fd5b600193505050509392505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461085a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108519061105c565b60405180910390fd5b6000849050828173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b815260040161089b92919061107c565b602060405180830381865afa1580156108b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108dc91906110ba565b101561091d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091490611133565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016109589190610bdd565b602060405180830381865afa158015610975573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061099991906110ba565b905060008273ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b81526004016109da93929190611153565b6020604051808303816000875af11580156109f9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1d9190610f51565b905080610a5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a56906111fc565b60405180910390fd5b8482610a6b919061124b565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610aa49190610bdd565b602060405180830381865afa158015610ac1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae591906110ba565b14610b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1c906112cb565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16638f5184303388886040518463ffffffff1660e01b8152600401610b6293929190610ee7565b600060405180830381600087803b158015610b7c57600080fd5b505af1925050508015610b8d575060015b50600193505050509392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610bc782610b9c565b9050919050565b610bd781610bbc565b82525050565b6000602082019050610bf26000830184610bce565b92915050565b6000604051905090565b600080fd5b600080fd5b610c1581610bbc565b8114610c2057600080fd5b50565b600081359050610c3281610c0c565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610c8b82610c42565b810181811067ffffffffffffffff82111715610caa57610ca9610c53565b5b80604052505050565b6000610cbd610bf8565b9050610cc98282610c82565b919050565b600067ffffffffffffffff821115610ce957610ce8610c53565b5b610cf282610c42565b9050602081019050919050565b82818337600083830152505050565b6000610d21610d1c84610cce565b610cb3565b905082815260208101848484011115610d3d57610d3c610c3d565b5b610d48848285610cff565b509392505050565b600082601f830112610d6557610d64610c38565b5b8135610d75848260208601610d0e565b91505092915050565b6000819050919050565b610d9181610d7e565b8114610d9c57600080fd5b50565b600081359050610dae81610d88565b92915050565b600080600060608486031215610dcd57610dcc610c02565b5b6000610ddb86828701610c23565b935050602084013567ffffffffffffffff811115610dfc57610dfb610c07565b5b610e0886828701610d50565b9250506040610e1986828701610d9f565b9150509250925092565b60008115159050919050565b610e3881610e23565b82525050565b6000602082019050610e536000830184610e2f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610e93578082015181840152602081019050610e78565b60008484015250505050565b6000610eaa82610e59565b610eb48185610e64565b9350610ec4818560208601610e75565b610ecd81610c42565b840191505092915050565b610ee181610d7e565b82525050565b6000606082019050610efc6000830186610bce565b8181036020830152610f0e8185610e9f565b9050610f1d6040830184610ed8565b949350505050565b610f2e81610e23565b8114610f3957600080fd5b50565b600081519050610f4b81610f25565b92915050565b600060208284031215610f6757610f66610c02565b5b6000610f7584828501610f3c565b91505092915050565b7f6661696c656420746f2064656c65676174650000000000000000000000000000600082015250565b6000610fb4601283610e64565b9150610fbf82610f7e565b602082019050919050565b60006020820190508181036000830152610fe381610fa7565b9050919050565b7f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b6000611046602183610e64565b915061105182610fea565b604082019050919050565b6000602082019050818103600083015261107581611039565b9050919050565b60006040820190506110916000830185610bce565b61109e6020830184610bce565b9392505050565b6000815190506110b481610d88565b92915050565b6000602082840312156110d0576110cf610c02565b5b60006110de848285016110a5565b91505092915050565b7f496e73756666696369656e7420616c6c6f77616e636500000000000000000000600082015250565b600061111d601683610e64565b9150611128826110e7565b602082019050919050565b6000602082019050818103600083015261114c81611110565b9050919050565b60006060820190506111686000830186610bce565b6111756020830185610bce565b6111826040830184610ed8565b949350505050565b7f4661696c656420746f207472616e7366657220746f6b656e7320666f7220666c60008201527f617368206c6f616e000000000000000000000000000000000000000000000000602082015250565b60006111e6602883610e64565b91506111f18261118a565b604082019050919050565b60006020820190508181036000830152611215816111d9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061125682610d7e565b915061126183610d7e565b92508282019050808211156112795761127861121c565b5b92915050565b7f466c617368206c6f616e206661696c6564000000000000000000000000000000600082015250565b60006112b5601183610e64565b91506112c08261127f565b602082019050919050565b600060208201905081810360008301526112e4816112a8565b9050919050565b60006040820190506113006000830185610bce565b61130d6020830184610ed8565b9392505050565b600061131f82610d7e565b915061132a83610d7e565b92508282039050818111156113425761134161121c565b5b92915050565b7f466c617368206c6f616e2072657061796d656e74206661696c65640000000000600082015250565b600061137e601b83610e64565b915061138982611348565b602082019050919050565b600060208201905081810360008301526113ad81611371565b905091905056fea26469706673582212208e1d52c36a32622af075b98cf15a237fb7323d1e2ace6e9cb8d762d107b21e9864736f6c63430008130033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c80638da5cb5b146100515780638f5184301461006f578063ee52ad711461008b578063f12fae93146100bb575b600080fd5b6100596100eb565b6040516100669190610bdd565b60405180910390f35b61008960048036038101906100849190610db4565b61010f565b005b6100a560048036038101906100a09190610db4565b6101da565b6040516100b29190610e3e565b60405180910390f35b6100d560048036038101906100d09190610db4565b6107c9565b6040516100e29190610e3e565b60405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061080073ffffffffffffffffffffffffffffffffffffffff166353266bbb8585856040518463ffffffff1660e01b815260040161015093929190610ee7565b6020604051808303816000875af115801561016f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101939190610f51565b9050806101d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101cc90610fca565b60405180910390fd5b600080fd5b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461026b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102629061105c565b60405180910390fd5b6000849050828173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b81526004016102ac92919061107c565b602060405180830381865afa1580156102c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ed91906110ba565b101561032e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161032590611133565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016103699190610bdd565b602060405180830381865afa158015610386573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103aa91906110ba565b905060008273ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b81526004016103eb93929190611153565b6020604051808303816000875af115801561040a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061042e9190610f51565b905080610470576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610467906111fc565b60405180910390fd5b848261047c919061124b565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016104b59190610bdd565b602060405180830381865afa1580156104d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f691906110ba565b14610536576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052d906112cb565b60405180910390fd5b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3388886040518463ffffffff1660e01b815260040161057593929190610ee7565b6020604051808303816000875af1158015610594573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b89190610f51565b9050806105fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f190610fca565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016106339190610bdd565b602060405180830381865afa158015610650573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067491906110ba565b91508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33876040518363ffffffff1660e01b81526004016106b19291906112eb565b6020604051808303816000875af11580156106d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f49190610f51565b5084826107019190611314565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161073a9190610bdd565b602060405180830381865afa158015610757573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077b91906110ba565b146107bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b290611394565b60405180910390fd5b600193505050509392505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461085a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108519061105c565b60405180910390fd5b6000849050828173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b815260040161089b92919061107c565b602060405180830381865afa1580156108b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108dc91906110ba565b101561091d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091490611133565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016109589190610bdd565b602060405180830381865afa158015610975573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061099991906110ba565b905060008273ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b81526004016109da93929190611153565b6020604051808303816000875af11580156109f9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1d9190610f51565b905080610a5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a56906111fc565b60405180910390fd5b8482610a6b919061124b565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610aa49190610bdd565b602060405180830381865afa158015610ac1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae591906110ba565b14610b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1c906112cb565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16638f5184303388886040518463ffffffff1660e01b8152600401610b6293929190610ee7565b600060405180830381600087803b158015610b7c57600080fd5b505af1925050508015610b8d575060015b50600193505050509392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610bc782610b9c565b9050919050565b610bd781610bbc565b82525050565b6000602082019050610bf26000830184610bce565b92915050565b6000604051905090565b600080fd5b600080fd5b610c1581610bbc565b8114610c2057600080fd5b50565b600081359050610c3281610c0c565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610c8b82610c42565b810181811067ffffffffffffffff82111715610caa57610ca9610c53565b5b80604052505050565b6000610cbd610bf8565b9050610cc98282610c82565b919050565b600067ffffffffffffffff821115610ce957610ce8610c53565b5b610cf282610c42565b9050602081019050919050565b82818337600083830152505050565b6000610d21610d1c84610cce565b610cb3565b905082815260208101848484011115610d3d57610d3c610c3d565b5b610d48848285610cff565b509392505050565b600082601f830112610d6557610d64610c38565b5b8135610d75848260208601610d0e565b91505092915050565b6000819050919050565b610d9181610d7e565b8114610d9c57600080fd5b50565b600081359050610dae81610d88565b92915050565b600080600060608486031215610dcd57610dcc610c02565b5b6000610ddb86828701610c23565b935050602084013567ffffffffffffffff811115610dfc57610dfb610c07565b5b610e0886828701610d50565b9250506040610e1986828701610d9f565b9150509250925092565b60008115159050919050565b610e3881610e23565b82525050565b6000602082019050610e536000830184610e2f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610e93578082015181840152602081019050610e78565b60008484015250505050565b6000610eaa82610e59565b610eb48185610e64565b9350610ec4818560208601610e75565b610ecd81610c42565b840191505092915050565b610ee181610d7e565b82525050565b6000606082019050610efc6000830186610bce565b8181036020830152610f0e8185610e9f565b9050610f1d6040830184610ed8565b949350505050565b610f2e81610e23565b8114610f3957600080fd5b50565b600081519050610f4b81610f25565b92915050565b600060208284031215610f6757610f66610c02565b5b6000610f7584828501610f3c565b91505092915050565b7f6661696c656420746f2064656c65676174650000000000000000000000000000600082015250565b6000610fb4601283610e64565b9150610fbf82610f7e565b602082019050919050565b60006020820190508181036000830152610fe381610fa7565b9050919050565b7f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b6000611046602183610e64565b915061105182610fea565b604082019050919050565b6000602082019050818103600083015261107581611039565b9050919050565b60006040820190506110916000830185610bce565b61109e6020830184610bce565b9392505050565b6000815190506110b481610d88565b92915050565b6000602082840312156110d0576110cf610c02565b5b60006110de848285016110a5565b91505092915050565b7f496e73756666696369656e7420616c6c6f77616e636500000000000000000000600082015250565b600061111d601683610e64565b9150611128826110e7565b602082019050919050565b6000602082019050818103600083015261114c81611110565b9050919050565b60006060820190506111686000830186610bce565b6111756020830185610bce565b6111826040830184610ed8565b949350505050565b7f4661696c656420746f207472616e7366657220746f6b656e7320666f7220666c60008201527f617368206c6f616e000000000000000000000000000000000000000000000000602082015250565b60006111e6602883610e64565b91506111f18261118a565b604082019050919050565b60006020820190508181036000830152611215816111d9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061125682610d7e565b915061126183610d7e565b92508282019050808211156112795761127861121c565b5b92915050565b7f466c617368206c6f616e206661696c6564000000000000000000000000000000600082015250565b60006112b5601183610e64565b91506112c08261127f565b602082019050919050565b600060208201905081810360008301526112e4816112a8565b9050919050565b60006040820190506113006000830185610bce565b61130d6020830184610ed8565b9392505050565b600061131f82610d7e565b915061132a83610d7e565b92508282039050818111156113425761134161121c565b5b92915050565b7f466c617368206c6f616e2072657061796d656e74206661696c65640000000000600082015250565b600061137e601b83610e64565b915061138982611348565b602082019050919050565b600060208201905081810360008301526113ad81611371565b905091905056fea26469706673582212208e1d52c36a32622af075b98cf15a237fb7323d1e2ace6e9cb8d762d107b21e9864736f6c63430008130033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/precompiles/testutil/contracts/FlashLoan.sol b/precompiles/testutil/contracts/FlashLoan.sol index e91b0bffc4..177cdd3e9e 100644 --- a/precompiles/testutil/contracts/FlashLoan.sol +++ b/precompiles/testutil/contracts/FlashLoan.sol @@ -28,7 +28,7 @@ contract FlashLoan { uint256 balancePre = token.balanceOf(address(this)); bool success = token.transferFrom(msg.sender, address(this), _amount); require(success, "Failed to transfer tokens for flash loan"); - assert( + require( token.balanceOf(address(this)) == balancePre + _amount, "Flash loan failed" ); @@ -44,7 +44,7 @@ contract FlashLoan { // Transfer tokens back to end the flash loan balancePre = token.balanceOf(address(this)); token.transfer(msg.sender, _amount); - assert( + require( token.balanceOf(address(this)) == balancePre - _amount, "Flash loan repayment failed" ); @@ -69,7 +69,7 @@ contract FlashLoan { uint256 balancePre = token.balanceOf(address(this)); bool success = token.transferFrom(msg.sender, address(this), _amount); require(success, "Failed to transfer tokens for flash loan"); - assert( + require( token.balanceOf(address(this)) == balancePre + _amount, "Flash loan failed" ); diff --git a/precompiles/testutil/contracts/ICounter.sol b/precompiles/testutil/contracts/ICounter.sol new file mode 100644 index 0000000000..604ffecef9 --- /dev/null +++ b/precompiles/testutil/contracts/ICounter.sol @@ -0,0 +1,9 @@ +pragma solidity ^0.8.17; + +interface ICounter { + function add() external; + function subtract() external; + function getCounter() external view returns (uint256); + event Changed(uint256 counter); + event Added(uint256 counter); +} diff --git a/precompiles/testutil/contracts/Reverter.json b/precompiles/testutil/contracts/Reverter.json index 96e6c92ccb..d112a79c6d 100644 --- a/precompiles/testutil/contracts/Reverter.json +++ b/precompiles/testutil/contracts/Reverter.json @@ -38,8 +38,8 @@ "type": "receive" } ], - "bytecode": "0x608060405260008055610c17806100176000396000f3fe60806040526004361061002d5760003560e01c806379388e9414610039578063c04062261461006257610034565b3661003457005b600080fd5b34801561004557600080fd5b50610060600480360381019061005b9190610360565b610079565b005b34801561006e57600080fd5b50610077610131565b005b808290604051610088906102d4565b82906040518091039083f590509050801580156100a9573d6000803e3d6000fd5b505061080173ffffffffffffffffffffffffffffffffffffffff166354be1a28306040518263ffffffff1660e01b81526004016100e691906103e1565b600060405180830381865afa158015610103573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061012c9190610884565b600080fd5b6000808154809291906101439061092b565b91905055503073ffffffffffffffffffffffffffffffffffffffff166379388e9460005460001b476040518363ffffffff1660e01b8152600401610188929190610991565b600060405180830381600087803b1580156101a257600080fd5b505af19250505080156101b3575060015b61022f5760006101c760005460001b610249565b90508073ffffffffffffffffffffffffffffffffffffffff16633ccfd60b6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561021157600080fd5b505af1158015610225573d6000803e3d6000fd5b5050505050610230565b5b6000808154809291906102429061092b565b9190505550565b60008060ff60f81b308460405180602001610263906102d4565b6020820181038252601f19601f820116604052506040516020016102879190610a01565b604051602081830303815290604052805190602001206040516020016102b09493929190610ace565b6040516020818303038152906040528051906020012060001c905080915050919050565b60c580610b1d83390190565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b610307816102f4565b811461031257600080fd5b50565b600081359050610324816102fe565b92915050565b6000819050919050565b61033d8161032a565b811461034857600080fd5b50565b60008135905061035a81610334565b92915050565b60008060408385031215610377576103766102ea565b5b600061038585828601610315565b92505060206103968582860161034b565b9150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103cb826103a0565b9050919050565b6103db816103c0565b82525050565b60006020820190506103f660008301846103d2565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61044a82610401565b810181811067ffffffffffffffff8211171561046957610468610412565b5b80604052505050565b600061047c6102e0565b90506104888282610441565b919050565b600067ffffffffffffffff8211156104a8576104a7610412565b5b602082029050602081019050919050565b600080fd5b600080fd5b600080fd5b600080fd5b600067ffffffffffffffff8211156104e8576104e7610412565b5b6104f182610401565b9050602081019050919050565b60005b8381101561051c578082015181840152602081019050610501565b60008484015250505050565b600061053b610536846104cd565b610472565b905082815260208101848484011115610557576105566104c8565b5b6105628482856104fe565b509392505050565b600082601f83011261057f5761057e6103fc565b5b815161058f848260208601610528565b91505092915050565b600067ffffffffffffffff8211156105b3576105b2610412565b5b602082029050602081019050919050565b6000815190506105d381610334565b92915050565b600060ff82169050919050565b6105ef816105d9565b81146105fa57600080fd5b50565b60008151905061060c816105e6565b92915050565b600060608284031215610628576106276104be565b5b6106326060610472565b9050600082015167ffffffffffffffff811115610652576106516104c3565b5b61065e8482850161056a565b6000830152506020610672848285016105c4565b6020830152506040610686848285016105fd565b60408301525092915050565b60006106a56106a084610598565b610472565b905080838252602082019050602084028301858111156106c8576106c76104b9565b5b835b8181101561070f57805167ffffffffffffffff8111156106ed576106ec6103fc565b5b8086016106fa8982610612565b855260208501945050506020810190506106ca565b5050509392505050565b600082601f83011261072e5761072d6103fc565b5b815161073e848260208601610692565b91505092915050565b60006040828403121561075d5761075c6104be565b5b6107676040610472565b9050600082015167ffffffffffffffff811115610787576107866104c3565b5b6107938482850161056a565b600083015250602082015167ffffffffffffffff8111156107b7576107b66104c3565b5b6107c384828501610719565b60208301525092915050565b60006107e26107dd8461048d565b610472565b90508083825260208201905060208402830185811115610805576108046104b9565b5b835b8181101561084c57805167ffffffffffffffff81111561082a576108296103fc565b5b8086016108378982610747565b85526020850194505050602081019050610807565b5050509392505050565b600082601f83011261086b5761086a6103fc565b5b815161087b8482602086016107cf565b91505092915050565b6000806040838503121561089b5761089a6102ea565b5b600083015167ffffffffffffffff8111156108b9576108b86102ef565b5b6108c585828601610856565b925050602083015167ffffffffffffffff8111156108e6576108e56102ef565b5b6108f285828601610719565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006109368261032a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610968576109676108fc565b5b600182019050919050565b61097c816102f4565b82525050565b61098b8161032a565b82525050565b60006040820190506109a66000830185610973565b6109b36020830184610982565b9392505050565b600081519050919050565b600081905092915050565b60006109db826109ba565b6109e581856109c5565b93506109f58185602086016104fe565b80840191505092915050565b6000610a0d82846109d0565b915081905092915050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b610a5f610a5a82610a18565b610a44565b82525050565b60008160601b9050919050565b6000610a7d82610a65565b9050919050565b6000610a8f82610a72565b9050919050565b610aa7610aa2826103c0565b610a84565b82525050565b6000819050919050565b610ac8610ac3826102f4565b610aad565b82525050565b6000610ada8287610a4e565b600182019150610aea8286610a96565b601482019150610afa8285610ab7565b602082019150610b0a8284610ab7565b6020820191508190509594505050505056fe608060405260b3806100126000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80633ccfd60b14602d575b600080fd5b60336035565b005b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015607a573d6000803e3d6000fd5b5056fea264697066735822122008001b1cb780fb8c81d5ab538ccbeab143f74b68ef571f3c5d058a2620bf412864736f6c63430008130033a2646970667358221220a5fd3d44b59916cad19784e497c1dbfaa58f7fb8006170e93ea2c8bd32af7b0264736f6c63430008130033", - "deployedBytecode": "0x60806040526004361061002d5760003560e01c806379388e9414610039578063c04062261461006257610034565b3661003457005b600080fd5b34801561004557600080fd5b50610060600480360381019061005b9190610360565b610079565b005b34801561006e57600080fd5b50610077610131565b005b808290604051610088906102d4565b82906040518091039083f590509050801580156100a9573d6000803e3d6000fd5b505061080173ffffffffffffffffffffffffffffffffffffffff166354be1a28306040518263ffffffff1660e01b81526004016100e691906103e1565b600060405180830381865afa158015610103573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061012c9190610884565b600080fd5b6000808154809291906101439061092b565b91905055503073ffffffffffffffffffffffffffffffffffffffff166379388e9460005460001b476040518363ffffffff1660e01b8152600401610188929190610991565b600060405180830381600087803b1580156101a257600080fd5b505af19250505080156101b3575060015b61022f5760006101c760005460001b610249565b90508073ffffffffffffffffffffffffffffffffffffffff16633ccfd60b6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561021157600080fd5b505af1158015610225573d6000803e3d6000fd5b5050505050610230565b5b6000808154809291906102429061092b565b9190505550565b60008060ff60f81b308460405180602001610263906102d4565b6020820181038252601f19601f820116604052506040516020016102879190610a01565b604051602081830303815290604052805190602001206040516020016102b09493929190610ace565b6040516020818303038152906040528051906020012060001c905080915050919050565b60c580610b1d83390190565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b610307816102f4565b811461031257600080fd5b50565b600081359050610324816102fe565b92915050565b6000819050919050565b61033d8161032a565b811461034857600080fd5b50565b60008135905061035a81610334565b92915050565b60008060408385031215610377576103766102ea565b5b600061038585828601610315565b92505060206103968582860161034b565b9150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103cb826103a0565b9050919050565b6103db816103c0565b82525050565b60006020820190506103f660008301846103d2565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61044a82610401565b810181811067ffffffffffffffff8211171561046957610468610412565b5b80604052505050565b600061047c6102e0565b90506104888282610441565b919050565b600067ffffffffffffffff8211156104a8576104a7610412565b5b602082029050602081019050919050565b600080fd5b600080fd5b600080fd5b600080fd5b600067ffffffffffffffff8211156104e8576104e7610412565b5b6104f182610401565b9050602081019050919050565b60005b8381101561051c578082015181840152602081019050610501565b60008484015250505050565b600061053b610536846104cd565b610472565b905082815260208101848484011115610557576105566104c8565b5b6105628482856104fe565b509392505050565b600082601f83011261057f5761057e6103fc565b5b815161058f848260208601610528565b91505092915050565b600067ffffffffffffffff8211156105b3576105b2610412565b5b602082029050602081019050919050565b6000815190506105d381610334565b92915050565b600060ff82169050919050565b6105ef816105d9565b81146105fa57600080fd5b50565b60008151905061060c816105e6565b92915050565b600060608284031215610628576106276104be565b5b6106326060610472565b9050600082015167ffffffffffffffff811115610652576106516104c3565b5b61065e8482850161056a565b6000830152506020610672848285016105c4565b6020830152506040610686848285016105fd565b60408301525092915050565b60006106a56106a084610598565b610472565b905080838252602082019050602084028301858111156106c8576106c76104b9565b5b835b8181101561070f57805167ffffffffffffffff8111156106ed576106ec6103fc565b5b8086016106fa8982610612565b855260208501945050506020810190506106ca565b5050509392505050565b600082601f83011261072e5761072d6103fc565b5b815161073e848260208601610692565b91505092915050565b60006040828403121561075d5761075c6104be565b5b6107676040610472565b9050600082015167ffffffffffffffff811115610787576107866104c3565b5b6107938482850161056a565b600083015250602082015167ffffffffffffffff8111156107b7576107b66104c3565b5b6107c384828501610719565b60208301525092915050565b60006107e26107dd8461048d565b610472565b90508083825260208201905060208402830185811115610805576108046104b9565b5b835b8181101561084c57805167ffffffffffffffff81111561082a576108296103fc565b5b8086016108378982610747565b85526020850194505050602081019050610807565b5050509392505050565b600082601f83011261086b5761086a6103fc565b5b815161087b8482602086016107cf565b91505092915050565b6000806040838503121561089b5761089a6102ea565b5b600083015167ffffffffffffffff8111156108b9576108b86102ef565b5b6108c585828601610856565b925050602083015167ffffffffffffffff8111156108e6576108e56102ef565b5b6108f285828601610719565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006109368261032a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610968576109676108fc565b5b600182019050919050565b61097c816102f4565b82525050565b61098b8161032a565b82525050565b60006040820190506109a66000830185610973565b6109b36020830184610982565b9392505050565b600081519050919050565b600081905092915050565b60006109db826109ba565b6109e581856109c5565b93506109f58185602086016104fe565b80840191505092915050565b6000610a0d82846109d0565b915081905092915050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b610a5f610a5a82610a18565b610a44565b82525050565b60008160601b9050919050565b6000610a7d82610a65565b9050919050565b6000610a8f82610a72565b9050919050565b610aa7610aa2826103c0565b610a84565b82525050565b6000819050919050565b610ac8610ac3826102f4565b610aad565b82525050565b6000610ada8287610a4e565b600182019150610aea8286610a96565b601482019150610afa8285610ab7565b602082019150610b0a8284610ab7565b6020820191508190509594505050505056fe608060405260b3806100126000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80633ccfd60b14602d575b600080fd5b60336035565b005b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015607a573d6000803e3d6000fd5b5056fea264697066735822122008001b1cb780fb8c81d5ab538ccbeab143f74b68ef571f3c5d058a2620bf412864736f6c63430008130033a2646970667358221220a5fd3d44b59916cad19784e497c1dbfaa58f7fb8006170e93ea2c8bd32af7b0264736f6c63430008130033", + "bytecode": "0x608060405260008055610c17806100176000396000f3fe60806040526004361061002d5760003560e01c806379388e9414610039578063c04062261461006257610034565b3661003457005b600080fd5b34801561004557600080fd5b50610060600480360381019061005b9190610360565b610079565b005b34801561006e57600080fd5b50610077610131565b005b808290604051610088906102d4565b82906040518091039083f590509050801580156100a9573d6000803e3d6000fd5b505061080173ffffffffffffffffffffffffffffffffffffffff166354be1a28306040518263ffffffff1660e01b81526004016100e691906103e1565b600060405180830381865afa158015610103573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061012c9190610884565b600080fd5b6000808154809291906101439061092b565b91905055503073ffffffffffffffffffffffffffffffffffffffff166379388e9460005460001b476040518363ffffffff1660e01b8152600401610188929190610991565b600060405180830381600087803b1580156101a257600080fd5b505af19250505080156101b3575060015b61022f5760006101c760005460001b610249565b90508073ffffffffffffffffffffffffffffffffffffffff16633ccfd60b6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561021157600080fd5b505af1158015610225573d6000803e3d6000fd5b5050505050610230565b5b6000808154809291906102429061092b565b9190505550565b60008060ff60f81b308460405180602001610263906102d4565b6020820181038252601f19601f820116604052506040516020016102879190610a01565b604051602081830303815290604052805190602001206040516020016102b09493929190610ace565b6040516020818303038152906040528051906020012060001c905080915050919050565b60c580610b1d83390190565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b610307816102f4565b811461031257600080fd5b50565b600081359050610324816102fe565b92915050565b6000819050919050565b61033d8161032a565b811461034857600080fd5b50565b60008135905061035a81610334565b92915050565b60008060408385031215610377576103766102ea565b5b600061038585828601610315565b92505060206103968582860161034b565b9150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103cb826103a0565b9050919050565b6103db816103c0565b82525050565b60006020820190506103f660008301846103d2565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61044a82610401565b810181811067ffffffffffffffff8211171561046957610468610412565b5b80604052505050565b600061047c6102e0565b90506104888282610441565b919050565b600067ffffffffffffffff8211156104a8576104a7610412565b5b602082029050602081019050919050565b600080fd5b600080fd5b600080fd5b600080fd5b600067ffffffffffffffff8211156104e8576104e7610412565b5b6104f182610401565b9050602081019050919050565b60005b8381101561051c578082015181840152602081019050610501565b60008484015250505050565b600061053b610536846104cd565b610472565b905082815260208101848484011115610557576105566104c8565b5b6105628482856104fe565b509392505050565b600082601f83011261057f5761057e6103fc565b5b815161058f848260208601610528565b91505092915050565b600067ffffffffffffffff8211156105b3576105b2610412565b5b602082029050602081019050919050565b6000815190506105d381610334565b92915050565b600060ff82169050919050565b6105ef816105d9565b81146105fa57600080fd5b50565b60008151905061060c816105e6565b92915050565b600060608284031215610628576106276104be565b5b6106326060610472565b9050600082015167ffffffffffffffff811115610652576106516104c3565b5b61065e8482850161056a565b6000830152506020610672848285016105c4565b6020830152506040610686848285016105fd565b60408301525092915050565b60006106a56106a084610598565b610472565b905080838252602082019050602084028301858111156106c8576106c76104b9565b5b835b8181101561070f57805167ffffffffffffffff8111156106ed576106ec6103fc565b5b8086016106fa8982610612565b855260208501945050506020810190506106ca565b5050509392505050565b600082601f83011261072e5761072d6103fc565b5b815161073e848260208601610692565b91505092915050565b60006040828403121561075d5761075c6104be565b5b6107676040610472565b9050600082015167ffffffffffffffff811115610787576107866104c3565b5b6107938482850161056a565b600083015250602082015167ffffffffffffffff8111156107b7576107b66104c3565b5b6107c384828501610719565b60208301525092915050565b60006107e26107dd8461048d565b610472565b90508083825260208201905060208402830185811115610805576108046104b9565b5b835b8181101561084c57805167ffffffffffffffff81111561082a576108296103fc565b5b8086016108378982610747565b85526020850194505050602081019050610807565b5050509392505050565b600082601f83011261086b5761086a6103fc565b5b815161087b8482602086016107cf565b91505092915050565b6000806040838503121561089b5761089a6102ea565b5b600083015167ffffffffffffffff8111156108b9576108b86102ef565b5b6108c585828601610856565b925050602083015167ffffffffffffffff8111156108e6576108e56102ef565b5b6108f285828601610719565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006109368261032a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610968576109676108fc565b5b600182019050919050565b61097c816102f4565b82525050565b61098b8161032a565b82525050565b60006040820190506109a66000830185610973565b6109b36020830184610982565b9392505050565b600081519050919050565b600081905092915050565b60006109db826109ba565b6109e581856109c5565b93506109f58185602086016104fe565b80840191505092915050565b6000610a0d82846109d0565b915081905092915050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b610a5f610a5a82610a18565b610a44565b82525050565b60008160601b9050919050565b6000610a7d82610a65565b9050919050565b6000610a8f82610a72565b9050919050565b610aa7610aa2826103c0565b610a84565b82525050565b6000819050919050565b610ac8610ac3826102f4565b610aad565b82525050565b6000610ada8287610a4e565b600182019150610aea8286610a96565b601482019150610afa8285610ab7565b602082019150610b0a8284610ab7565b6020820191508190509594505050505056fe608060405260b3806100126000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80633ccfd60b14602d575b600080fd5b60336035565b005b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015607a573d6000803e3d6000fd5b5056fea26469706673582212200cca7e94767cc41a8eff494693f692a362784efcf8724ef105e5c5948d07a98a64736f6c63430008130033a26469706673582212209eedc0bf8ca98ddf4547c45c1938b3294a8c876293b916e6991af709591c556764736f6c63430008130033", + "deployedBytecode": "0x60806040526004361061002d5760003560e01c806379388e9414610039578063c04062261461006257610034565b3661003457005b600080fd5b34801561004557600080fd5b50610060600480360381019061005b9190610360565b610079565b005b34801561006e57600080fd5b50610077610131565b005b808290604051610088906102d4565b82906040518091039083f590509050801580156100a9573d6000803e3d6000fd5b505061080173ffffffffffffffffffffffffffffffffffffffff166354be1a28306040518263ffffffff1660e01b81526004016100e691906103e1565b600060405180830381865afa158015610103573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061012c9190610884565b600080fd5b6000808154809291906101439061092b565b91905055503073ffffffffffffffffffffffffffffffffffffffff166379388e9460005460001b476040518363ffffffff1660e01b8152600401610188929190610991565b600060405180830381600087803b1580156101a257600080fd5b505af19250505080156101b3575060015b61022f5760006101c760005460001b610249565b90508073ffffffffffffffffffffffffffffffffffffffff16633ccfd60b6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561021157600080fd5b505af1158015610225573d6000803e3d6000fd5b5050505050610230565b5b6000808154809291906102429061092b565b9190505550565b60008060ff60f81b308460405180602001610263906102d4565b6020820181038252601f19601f820116604052506040516020016102879190610a01565b604051602081830303815290604052805190602001206040516020016102b09493929190610ace565b6040516020818303038152906040528051906020012060001c905080915050919050565b60c580610b1d83390190565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b610307816102f4565b811461031257600080fd5b50565b600081359050610324816102fe565b92915050565b6000819050919050565b61033d8161032a565b811461034857600080fd5b50565b60008135905061035a81610334565b92915050565b60008060408385031215610377576103766102ea565b5b600061038585828601610315565b92505060206103968582860161034b565b9150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103cb826103a0565b9050919050565b6103db816103c0565b82525050565b60006020820190506103f660008301846103d2565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61044a82610401565b810181811067ffffffffffffffff8211171561046957610468610412565b5b80604052505050565b600061047c6102e0565b90506104888282610441565b919050565b600067ffffffffffffffff8211156104a8576104a7610412565b5b602082029050602081019050919050565b600080fd5b600080fd5b600080fd5b600080fd5b600067ffffffffffffffff8211156104e8576104e7610412565b5b6104f182610401565b9050602081019050919050565b60005b8381101561051c578082015181840152602081019050610501565b60008484015250505050565b600061053b610536846104cd565b610472565b905082815260208101848484011115610557576105566104c8565b5b6105628482856104fe565b509392505050565b600082601f83011261057f5761057e6103fc565b5b815161058f848260208601610528565b91505092915050565b600067ffffffffffffffff8211156105b3576105b2610412565b5b602082029050602081019050919050565b6000815190506105d381610334565b92915050565b600060ff82169050919050565b6105ef816105d9565b81146105fa57600080fd5b50565b60008151905061060c816105e6565b92915050565b600060608284031215610628576106276104be565b5b6106326060610472565b9050600082015167ffffffffffffffff811115610652576106516104c3565b5b61065e8482850161056a565b6000830152506020610672848285016105c4565b6020830152506040610686848285016105fd565b60408301525092915050565b60006106a56106a084610598565b610472565b905080838252602082019050602084028301858111156106c8576106c76104b9565b5b835b8181101561070f57805167ffffffffffffffff8111156106ed576106ec6103fc565b5b8086016106fa8982610612565b855260208501945050506020810190506106ca565b5050509392505050565b600082601f83011261072e5761072d6103fc565b5b815161073e848260208601610692565b91505092915050565b60006040828403121561075d5761075c6104be565b5b6107676040610472565b9050600082015167ffffffffffffffff811115610787576107866104c3565b5b6107938482850161056a565b600083015250602082015167ffffffffffffffff8111156107b7576107b66104c3565b5b6107c384828501610719565b60208301525092915050565b60006107e26107dd8461048d565b610472565b90508083825260208201905060208402830185811115610805576108046104b9565b5b835b8181101561084c57805167ffffffffffffffff81111561082a576108296103fc565b5b8086016108378982610747565b85526020850194505050602081019050610807565b5050509392505050565b600082601f83011261086b5761086a6103fc565b5b815161087b8482602086016107cf565b91505092915050565b6000806040838503121561089b5761089a6102ea565b5b600083015167ffffffffffffffff8111156108b9576108b86102ef565b5b6108c585828601610856565b925050602083015167ffffffffffffffff8111156108e6576108e56102ef565b5b6108f285828601610719565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006109368261032a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610968576109676108fc565b5b600182019050919050565b61097c816102f4565b82525050565b61098b8161032a565b82525050565b60006040820190506109a66000830185610973565b6109b36020830184610982565b9392505050565b600081519050919050565b600081905092915050565b60006109db826109ba565b6109e581856109c5565b93506109f58185602086016104fe565b80840191505092915050565b6000610a0d82846109d0565b915081905092915050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b610a5f610a5a82610a18565b610a44565b82525050565b60008160601b9050919050565b6000610a7d82610a65565b9050919050565b6000610a8f82610a72565b9050919050565b610aa7610aa2826103c0565b610a84565b82525050565b6000819050919050565b610ac8610ac3826102f4565b610aad565b82525050565b6000610ada8287610a4e565b600182019150610aea8286610a96565b601482019150610afa8285610ab7565b602082019150610b0a8284610ab7565b6020820191508190509594505050505056fe608060405260b3806100126000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80633ccfd60b14602d575b600080fd5b60336035565b005b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015607a573d6000803e3d6000fd5b5056fea26469706673582212200cca7e94767cc41a8eff494693f692a362784efcf8724ef105e5c5948d07a98a64736f6c63430008130033a26469706673582212209eedc0bf8ca98ddf4547c45c1938b3294a8c876293b916e6991af709591c556764736f6c63430008130033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/precompiles/testutil/contracts/counter.go b/precompiles/testutil/contracts/counter.go new file mode 100644 index 0000000000..cd6252a040 --- /dev/null +++ b/precompiles/testutil/contracts/counter.go @@ -0,0 +1,13 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package contracts + +import ( + contractutils "github.com/evmos/evmos/v18/contracts/utils" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" +) + +func LoadCounterContract() (evmtypes.CompiledContract, error) { + return contractutils.LoadContractFromJSONFile("Counter.json") +} diff --git a/precompiles/vesting/errors.go b/precompiles/vesting/errors.go index 38baed9ee6..797f9ef0aa 100644 --- a/precompiles/vesting/errors.go +++ b/precompiles/vesting/errors.go @@ -7,4 +7,6 @@ const ( ErrDifferentFromOrigin = "tx origin address %s does not match the from address %s" // ErrDifferentFunderOrigin is raised when the tx origin address is not the same as the vesting transaction funder. ErrDifferentFunderOrigin = "tx origin address %s does not match the funder address %s" + // ErrInvalidDestination is raised when the destination address is not an EOA or the contract calling the precompile. + ErrInvalidDestination = "invalid destination address %s. Should be an EOA or the contract calling the precompile" ) diff --git a/precompiles/vesting/events.go b/precompiles/vesting/events.go index d6bb199886..d977cb83c3 100644 --- a/precompiles/vesting/events.go +++ b/precompiles/vesting/events.go @@ -90,10 +90,6 @@ func (p Precompile) EmitCreateClawbackVestingAccountEvent( return err } - if err != nil { - return err - } - // Create the event stateDB.AddLog(ðtypes.Log{ Address: p.Address(), diff --git a/precompiles/vesting/integration_test.go b/precompiles/vesting/integration_test.go index c3a4cbae5a..a998feb4e3 100644 --- a/precompiles/vesting/integration_test.go +++ b/precompiles/vesting/integration_test.go @@ -17,6 +17,7 @@ import ( "github.com/evmos/evmos/v18/precompiles/vesting" evmosutil "github.com/evmos/evmos/v18/testutil" testutiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/utils" vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" //nolint:revive // dot imports are fine for Ginkgo @@ -55,6 +56,8 @@ var ( differentAddr = testutiltx.GenerateAddress() // vestingAddr is a new address that is used to test the vesting extension. vestingAddr = testutiltx.GenerateAddress() + // gasPrice to be used on tests txs and calculate the fees + gasPrice = math.NewInt(1e9) ) var _ = Describe("Interacting with the vesting extension", func() { @@ -228,19 +231,22 @@ var _ = Describe("Interacting with the vesting extension", func() { }) Context("to fund a clawback vesting account", func() { + for _, callType := range callTypes { callType := callType - BeforeEach(func() { - if callType.directCall == false { + It(fmt.Sprintf("should fund the vesting when defining only lockup (%s)", callType.name), func() { + if !callType.directCall { + // create authorization to allow contract to spend the funder's (s.address) balance + // when funding a vesting account err = vesting.CreateGenericAuthz(s.ctx, s.app.AuthzKeeper, contractAddr, s.address, vesting.FundVestingAccountMsgURL) Expect(err).ToNot(HaveOccurred(), "error while creating the generic authorization: %v", err) } - }) - - It(fmt.Sprintf("should fund the vesting when defining only lockup (%s)", callType.name), func() { s.CreateTestClawbackVestingAccount(s.address, toAddr) - createClawbackArgs := s.BuildCallArgs(callType, contractAddr). + + vestAccInitialBal := s.app.BankKeeper.GetBalance(s.ctx, toAddr.Bytes(), s.bondDenom) + + fundVestingAccArgs := s.BuildCallArgs(callType, contractAddr). WithMethodName(vesting.FundVestingAccountMethod). WithArgs( s.address, @@ -253,19 +259,200 @@ var _ = Describe("Interacting with the vesting extension", func() { fundClawbackVestingCheck := passCheck. WithExpEvents(vesting.EventTypeFundVestingAccount) - _, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, createClawbackArgs, fundClawbackVestingCheck) + _, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, fundVestingAccArgs, fundClawbackVestingCheck) + Expect(err).ToNot(HaveOccurred(), "error while calling the contract: %v", err) + + // Check the vesting account + // + // NOTE: The vesting account is created with the lockup periods only, since the vesting periods are empty. + // The vesting periods are defaulted to instant vesting, i.e. period length = 0. + s.ExpectVestingAccount(toAddr, defaultPeriods, instantPeriods) + + vestCoinsAmt := math.NewIntFromBigInt(defaultPeriods[0].Amount[0].Amount) + vestAccFinalBal := s.app.BankKeeper.GetBalance(s.ctx, toAddr.Bytes(), s.bondDenom) + Expect(vestAccFinalBal.Amount).To(Equal(vestAccInitialBal.Amount.Add(vestCoinsAmt))) + }) + + It(fmt.Sprintf("should fund the vesting account from a smart contract when defining only lockup (%s)", callType.name), func() { + if callType.directCall { + Skip("this should only be run for smart contract calls") + } + s.CreateTestClawbackVestingAccount(contractAddr, toAddr) + // send some funds to the smart contract + // authorization to be able to fund from the smart contract is already in the setup + err = evmosutil.FundAccount(s.ctx, s.app.BankKeeper, contractAddr.Bytes(), sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, math.NewInt(100)))) + Expect(err).ToNot(HaveOccurred(), "error while funding the contract: %v", err) + + txSenderInitialBal := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + vestAccInitialBal := s.app.BankKeeper.GetBalance(s.ctx, toAddr.Bytes(), s.bondDenom) + + // Build and execute the tx to fund the vesting account from a smart contract + fundVestingAccArgs := s.BuildCallArgs(callType, contractAddr). + WithMethodName(vesting.FundVestingAccountMethod). + WithArgs( + contractAddr, + toAddr, + uint64(time.Now().Unix()), + defaultPeriods, + emptyPeriods, + ). + WithGasPrice(gasPrice.BigInt()) + + fundClawbackVestingCheck := passCheck. + WithExpEvents(vesting.EventTypeFundVestingAccount) + + res, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, fundVestingAccArgs, fundClawbackVestingCheck) Expect(err).ToNot(HaveOccurred(), "error while calling the contract: %v", err) + fees := gasPrice.MulRaw(res.GasUsed) // Check the vesting account // // NOTE: The vesting account is created with the lockup periods only, since the vesting periods are empty. // The vesting periods are defaulted to instant vesting, i.e. period length = 0. s.ExpectVestingAccount(toAddr, defaultPeriods, instantPeriods) + + // check that tx signer's balance is reduced by the fees paid + txSenderFinalBal := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + Expect(txSenderFinalBal.Amount).To(Equal(txSenderInitialBal.Amount.Sub(fees))) + + // check the contract's balance was deducted to fund the vesting account + contractFinalBal := s.app.BankKeeper.GetBalance(s.ctx, contractAddr.Bytes(), s.bondDenom) + Expect(contractFinalBal.Amount).To(Equal(sdk.ZeroInt())) + + vestCoinsAmt := math.NewIntFromBigInt(defaultPeriods[0].Amount[0].Amount) + vestAccFinalBal := s.app.BankKeeper.GetBalance(s.ctx, toAddr.Bytes(), s.bondDenom) + Expect(vestAccFinalBal.Amount).To(Equal(vestAccInitialBal.Amount.Add(vestCoinsAmt))) + }) + + It(fmt.Sprintf("contract that calls funder - should NOT fund the vesting account with a smart contract different than the contract that calls the precompile (%s)", callType.name), func() { + if callType.directCall { + Skip("this should only be run for smart contract calls") + } + counterContract, err := contracts.LoadCounterContract() + Expect(err).ToNot(HaveOccurred()) + + funderContractAddr, err := s.DeployContract(counterContract) + Expect(err).ToNot(HaveOccurred(), "error while deploying the smart contract: %v", err) + + s.CreateTestClawbackVestingAccount(funderContractAddr, toAddr) + // send some funds to the smart contract + // authorization to be able to fund from the smart contract is already in the setup + funderContractInitialAmt := math.NewInt(200) + err = evmosutil.FundAccount(s.ctx, s.app.BankKeeper, funderContractAddr.Bytes(), sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, funderContractInitialAmt))) + Expect(err).ToNot(HaveOccurred(), "error while funding the contract: %v", err) + + // create authorization for tx sender to use funder's balance to fund a vesting account + err = vesting.CreateGenericAuthz(s.ctx, s.app.AuthzKeeper, s.address, funderContractAddr, vesting.FundVestingAccountMsgURL) + Expect(err).ToNot(HaveOccurred(), "error while creating the generic authorization: %v", err) + + txSenderInitialBal := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + + // Build and execute the tx to fund the vesting account from a smart contract + fundVestingAccArgs := s.BuildCallArgs(callType, contractAddr). + WithMethodName(vesting.FundVestingAccountMethod). + WithArgs( + funderContractAddr, + toAddr, + uint64(time.Now().Unix()), + defaultPeriods, + emptyPeriods, + ) + _, _, err = contracts.CallContractAndCheckLogs(s.ctx, s.app, fundVestingAccArgs, execRevertedCheck) + Expect(err).To(HaveOccurred()) + + // check that tx signer's balance is reduced by the fees paid + txSenderFinalBal := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + Expect(txSenderFinalBal.Amount.LTE(txSenderInitialBal.Amount)).To(BeTrue()) + + // the balance of the contract that calls the precompile should remain 0 + contractFinalBal := s.app.BankKeeper.GetBalance(s.ctx, contractAddr.Bytes(), s.bondDenom) + Expect(contractFinalBal.Amount).To(Equal(sdk.ZeroInt())) + + // the balance of the funder contract should remain unchanged + funderContractFinalBal := s.app.BankKeeper.GetBalance(s.ctx, funderContractAddr.Bytes(), s.bondDenom) + Expect(funderContractFinalBal.Amount).To(Equal(funderContractInitialAmt)) + }) + + It(fmt.Sprintf("fund using a third party EOA - should NOT fund the vesting account even if authorized (%s)", callType.name), func() { + if callType.directCall { + Skip("this should only be run for smart contract calls") + } + + // send some funds to the funder, a third party EOA + funderAccAddr, _ := testutiltx.NewAccAddressAndKey() + funderHexAddr := common.BytesToAddress(funderAccAddr) + initialFunderBalance := math.NewInt(200) + err = evmosutil.FundAccount(s.ctx, s.app.BankKeeper, funderAccAddr, sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, initialFunderBalance))) + Expect(err).ToNot(HaveOccurred(), "error while funding the third party EOA: %v", err) + + // create authorization for tx sender to use funder's balance to fund a vesting account + err = vesting.CreateGenericAuthz(s.ctx, s.app.AuthzKeeper, s.address, funderHexAddr, vesting.FundVestingAccountMsgURL) + Expect(err).ToNot(HaveOccurred(), "error while creating the generic authorization: %v", err) + + // create clawback vesting account with the corresponding funder + s.CreateTestClawbackVestingAccount(funderHexAddr, toAddr) + + txSenderInitialBal := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + + // Build and execute the tx to fund the vesting account from a third party EOA + fundVestingAccArgs := s.BuildCallArgs(callType, contractAddr). + WithMethodName(vesting.FundVestingAccountMethod). + WithArgs( + funderHexAddr, + toAddr, + uint64(time.Now().Unix()), + defaultPeriods, + emptyPeriods, + ). + WithGasPrice(gasPrice.BigInt()) + + _, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, fundVestingAccArgs, execRevertedCheck) + Expect(err).To(HaveOccurred()) + + // check that tx signer's balance is reduced by the fees paid + txSenderFinalBal := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + Expect(txSenderFinalBal.Amount.LTE(txSenderInitialBal.Amount)).To(BeTrue()) + + // check the funders's balance remains unchanged + funderFinalBal := s.app.BankKeeper.GetBalance(s.ctx, funderAccAddr, s.bondDenom) + Expect(funderFinalBal.Amount).To(Equal(initialFunderBalance)) + }) + + It(fmt.Sprintf("should NOT fund the vesting with tx origin funds when calling the precompile from a smart contract and WITHOUT authorization (%s)", callType.name), func() { + // when calling from a smart contract + // the funder (s.address) needs to authorize + // for the smart contract to use its funds + if callType.directCall { + Skip("this should only be run for smart contract calls") + } + s.CreateTestClawbackVestingAccount(s.address, toAddr) + fundVestingAccArgs := s.BuildCallArgs(callType, contractAddr). + WithMethodName(vesting.FundVestingAccountMethod). + WithArgs( + s.address, + toAddr, + uint64(time.Now().Unix()), + emptyPeriods, + defaultPeriods, + ) + + _, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, fundVestingAccArgs, execRevertedCheck) + Expect(err).To(HaveOccurred(), "error while calling the contract: %v", err) }) It(fmt.Sprintf("should fund the vesting when defining only vesting (%s)", callType.name), func() { + // when calling from a smart contract + // the funder (s.address) needs to authorize + // for the smart contract to use its funds + if !callType.directCall { + // create authorization to allow contract to spend the funder's (s.address) balance + // when funding a vesting account + err = vesting.CreateGenericAuthz(s.ctx, s.app.AuthzKeeper, contractAddr, s.address, vesting.FundVestingAccountMsgURL) + Expect(err).ToNot(HaveOccurred(), "error while creating the generic authorization: %v", err) + } + s.CreateTestClawbackVestingAccount(s.address, toAddr) - createClawbackArgs := s.BuildCallArgs(callType, contractAddr). + fundVestingAccArgs := s.BuildCallArgs(callType, contractAddr). WithMethodName(vesting.FundVestingAccountMethod). WithArgs( s.address, @@ -278,7 +465,7 @@ var _ = Describe("Interacting with the vesting extension", func() { fundClawbackVestingCheck := passCheck. WithExpEvents(vesting.EventTypeFundVestingAccount) - _, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, createClawbackArgs, fundClawbackVestingCheck) + _, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, fundVestingAccArgs, fundClawbackVestingCheck) Expect(err).ToNot(HaveOccurred(), "error while calling the contract: %v", err) // Check the vesting account @@ -288,8 +475,190 @@ var _ = Describe("Interacting with the vesting extension", func() { s.ExpectVestingAccount(toAddr, instantPeriods, defaultPeriods) }) + Context("Table-driven tests for Withdraw Delegator Rewards", func() { + // testCase is a struct used for cases of contracts calls that have some operation + // performed before and/or after the precompile call + type testCase struct { + transferTo *common.Address + before bool + after bool + } + + var ( + args contracts.CallArgs + funderInitialBal sdk.Coin + vestingAccInitialBal sdk.Coin + contractInitialBalance = math.NewInt(100) + ) + + BeforeEach(func() { + args = s.BuildCallArgs(callType, contractAddr). + WithMethodName("fundVestingAccountAndTransfer"). + WithGasPrice(gasPrice.BigInt()) + + // send some funds to the contract + err := evmosutil.FundAccountWithBaseDenom(s.ctx, s.app.BankKeeper, contractAddr.Bytes(), contractInitialBalance.Int64()) + Expect(err).To(BeNil()) + + s.CreateTestClawbackVestingAccount(s.address, toAddr) + + funderInitialBal = s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + vestingAccInitialBal = s.app.BankKeeper.GetBalance(s.ctx, toAddr.Bytes(), s.bondDenom) + + // create authorization to allow contract to spend the funder's (s.address) balance + // when funding a vesting account + err = vesting.CreateGenericAuthz(s.ctx, s.app.AuthzKeeper, contractAddr, s.address, vesting.FundVestingAccountMsgURL) + Expect(err).ToNot(HaveOccurred(), "error while creating the generic authorization: %v", err) + }) + + DescribeTable(fmt.Sprintf("should fund the vesting account from tx origin when defining only vesting (%s)", callType.name), func(tc testCase) { + if callType.directCall { + Skip("this should only be run for smart contract calls") + } + // if not specified, default the transferTo to the funder address + if tc.transferTo == nil { + tc.transferTo = &s.address + } + fundVestingAccArgs := args. + WithArgs( + s.address, + toAddr, + *tc.transferTo, + uint64(time.Now().Unix()), + emptyPeriods, + defaultPeriods, + tc.before, tc.after, // transfer funds to the funder according to test case + ). + WithGasPrice(gasPrice.BigInt()) + + fundClawbackVestingCheck := passCheck. + WithExpEvents(vesting.EventTypeFundVestingAccount) + + res, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, fundVestingAccArgs, fundClawbackVestingCheck) + Expect(err).ToNot(HaveOccurred(), "error while calling the contract: %v", err) + + fees := gasPrice.MulRaw(res.GasUsed) + + transferredToAmt := math.ZeroInt() + for _, transferred := range []bool{tc.before, tc.after} { + if transferred { + transferredToAmt = transferredToAmt.AddRaw(15) + } + } + // Check the vesting account + // + // NOTE: The vesting account is created with the vesting periods only, since the lockup periods are empty. + // The lockup periods are defaulted to instant unlocking, i.e. period length = 0. + s.ExpectVestingAccount(toAddr, instantPeriods, defaultPeriods) + + // check the contract's balance was deducted to fund the vesting account + contractFinalBal := s.app.BankKeeper.GetBalance(s.ctx, contractAddr.Bytes(), s.bondDenom) + Expect(contractFinalBal.Amount).To(Equal(contractInitialBalance.Sub(transferredToAmt))) + + // check that the vesting account received the funds + vestCoinsAmt := math.NewIntFromBigInt(defaultPeriods[0].Amount[0].Amount) + vestAccFinalBal := s.app.BankKeeper.GetBalance(s.ctx, toAddr.Bytes(), s.bondDenom) + expVestAccFinalBal := vestingAccInitialBal.Amount.Add(vestCoinsAmt) + if *tc.transferTo == toAddr { + expVestAccFinalBal = expVestAccFinalBal.Add(transferredToAmt) + } + + Expect(vestAccFinalBal.Amount).To(Equal(expVestAccFinalBal)) + + // check that funder balance is reduced by the fees paid, the amt to fund the vesting account, + // but also got the funds sent from the contract (when corresponds) + funderFinalBal := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + + expFunderFinalBal := funderInitialBal.Amount.Sub(fees).Sub(vestCoinsAmt) + if *tc.transferTo == s.address { + expFunderFinalBal = expFunderFinalBal.Add(transferredToAmt) + } + + Expect(funderFinalBal.Amount).To(Equal(expFunderFinalBal)) + }, + Entry("funder balance change before & after precompile call", testCase{ + before: true, + after: true, + }), + Entry("funder balance change before precompile call", testCase{ + before: true, + after: false, + }), + Entry("funder balance change after precompile call", testCase{ + before: false, + after: true, + }), + Entry("vesting acc balance change before & after precompile call", testCase{ + transferTo: &toAddr, + before: true, + after: true, + }), + Entry("vesting acc balance change before precompile call", testCase{ + transferTo: &toAddr, + before: true, + after: false, + }), + Entry("vesting acc balance change after precompile call", testCase{ + transferTo: &toAddr, + before: false, + after: true, + }), + ) + }) + + It(fmt.Sprintf("should fund the vesting account from a smart contract when defining only vesting (%s)", callType.name), func() { + if callType.directCall { + Skip("this should only be run for smart contract calls") + } + s.CreateTestClawbackVestingAccount(contractAddr, toAddr) + // send some funds to the smart contract + // authorization is already created in the test setup + err = evmosutil.FundAccount(s.ctx, s.app.BankKeeper, contractAddr.Bytes(), sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, math.NewInt(100)))) + Expect(err).ToNot(HaveOccurred(), "error while funding the contract: %v", err) + + txSenderInitialBal := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + + // Build and execute the tx to fund the vesting account from a smart contract + createClawbackArgs := s.BuildCallArgs(callType, contractAddr). + WithMethodName(vesting.FundVestingAccountMethod). + WithArgs( + contractAddr, + toAddr, + uint64(time.Now().Unix()), + emptyPeriods, + defaultPeriods, + ). + WithGasPrice(gasPrice.BigInt()) + + fundClawbackVestingCheck := passCheck. + WithExpEvents(vesting.EventTypeFundVestingAccount) + + res, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, createClawbackArgs, fundClawbackVestingCheck) + Expect(err).ToNot(HaveOccurred(), "error while calling the contract: %v", err) + fees := gasPrice.MulRaw(res.GasUsed) + + // Check the vesting account + s.ExpectVestingAccount(toAddr, instantPeriods, defaultPeriods) + + // check that tx signer's balance is reduced by the fees paid + txSenderFinalBal := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + Expect(txSenderFinalBal.Amount).To(Equal(txSenderInitialBal.Amount.Sub(fees))) + + // check the contract's balance was deducted to fund the vesting account + contractFinalBal := s.app.BankKeeper.GetBalance(s.ctx, contractAddr.Bytes(), s.bondDenom) + Expect(contractFinalBal.Amount).To(Equal(sdk.ZeroInt())) + }) + It(fmt.Sprintf("should fund the vesting when defining both lockup and vesting (%s)", callType.name), func() { s.CreateTestClawbackVestingAccount(s.address, toAddr) + // funder is an EOA (s.address) + // if calling funding via contract call, + // need auth from funder addr (s.address) + // to the contract address + if !callType.directCall { + err = vesting.CreateGenericAuthz(s.ctx, s.app.AuthzKeeper, contractAddr, s.address, vesting.FundVestingAccountMsgURL) + Expect(err).ToNot(HaveOccurred(), "error while creating the generic authorization: %v", err) + } createClawbackArgs := s.BuildCallArgs(callType, contractAddr). WithMethodName(vesting.FundVestingAccountMethod). WithArgs( @@ -310,6 +679,48 @@ var _ = Describe("Interacting with the vesting extension", func() { s.ExpectVestingAccount(toAddr, defaultPeriods, defaultPeriods) }) + It(fmt.Sprintf("should fund the vesting account from a smart contract when defining both lockup and vesting (%s)", callType.name), func() { + if callType.directCall { + Skip("this should only be run for smart contract calls") + } + s.CreateTestClawbackVestingAccount(contractAddr, toAddr) + // send some funds to the smart contract + err = evmosutil.FundAccount(s.ctx, s.app.BankKeeper, contractAddr.Bytes(), sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, math.NewInt(100)))) + Expect(err).ToNot(HaveOccurred(), "error while funding the contract: %v", err) + + txSenderInitialBal := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + + // Build and execute the tx to fund the vesting account from a smart contract + createClawbackArgs := s.BuildCallArgs(callType, contractAddr). + WithMethodName(vesting.FundVestingAccountMethod). + WithArgs( + contractAddr, + toAddr, + uint64(time.Now().Unix()), + defaultPeriods, + defaultPeriods, + ). + WithGasPrice(gasPrice.BigInt()) + + fundClawbackVestingCheck := passCheck. + WithExpEvents(vesting.EventTypeFundVestingAccount) + + res, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, createClawbackArgs, fundClawbackVestingCheck) + Expect(err).ToNot(HaveOccurred(), "error while calling the contract: %v", err) + fees := gasPrice.MulRaw(res.GasUsed) + + // Check the vesting account + s.ExpectVestingAccount(toAddr, defaultPeriods, defaultPeriods) + + // check that tx signer's balance is reduced by the fees paid + txSenderFinalBal := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + Expect(txSenderFinalBal.Amount).To(Equal(txSenderInitialBal.Amount.Sub(fees))) + + // check the contract's balance was deducted to fund the vesting account + contractFinalBal := s.app.BankKeeper.GetBalance(s.ctx, contractAddr.Bytes(), s.bondDenom) + Expect(contractFinalBal.Amount).To(Equal(sdk.ZeroInt())) + }) + It(fmt.Sprintf("should not fund the vesting when defining different total coins for lockup and vesting (%s)", callType.name), func() { s.CreateTestClawbackVestingAccount(s.address, toAddr) @@ -546,6 +957,8 @@ var _ = Describe("Interacting with the vesting extension", func() { }) Context("to claw back from a vesting account", func() { + var expClawbackAmt = math.NewInt(1000) + BeforeEach(func() { s.CreateTestClawbackVestingAccount(s.address, toAddr) s.FundTestClawbackVestingAccount() @@ -554,132 +967,504 @@ var _ = Describe("Interacting with the vesting extension", func() { for _, callType := range callTypes { callType := callType - BeforeEach(func() { - if callType.directCall == false { - err = vesting.CreateGenericAuthz(s.ctx, s.app.AuthzKeeper, contractAddr, s.address, vesting.ClawbackMsgURL) - Expect(err).ToNot(HaveOccurred(), "error while creating the generic authorization: %v", err) - } - }) - - It(fmt.Sprintf("should claw back from the vesting when sending as the funder (%s)", callType.name), func() { - balancePre := s.app.BankKeeper.GetBalance(s.ctx, toAddr.Bytes(), s.bondDenom) - Expect(balancePre.Amount).To(Equal(math.NewInt(1100)), "expected different balance after setup") - - clawbackArgs := s.BuildCallArgs(callType, contractAddr). - WithMethodName(vesting.ClawbackMethod). - WithArgs( - s.address, - toAddr, - differentAddr, - ) - - clawbackCheck := passCheck. - WithExpEvents(vesting.EventTypeClawback) - - _, ethRes, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, clawbackArgs, clawbackCheck) - Expect(err).ToNot(HaveOccurred(), "error while calling the contract: %v", err) + Context("without authorization", func() { + It(fmt.Sprintf("should NOT claw back from the vesting when sending tx from the funder (%s)", callType.name), func() { + if callType.directCall { + Skip("this should only be run for smart contract calls") + } + balancePre := s.app.BankKeeper.GetBalance(s.ctx, toAddr.Bytes(), s.bondDenom) + Expect(balancePre.Amount).To(Equal(math.NewInt(1100)), "expected different balance after setup") + + clawbackArgs := s.BuildCallArgs(callType, contractAddr). + WithMethodName(vesting.ClawbackMethod). + WithArgs( + s.address, + toAddr, + differentAddr, + ) - var co vesting.ClawbackOutput - err = s.precompile.UnpackIntoInterface(&co, vesting.ClawbackMethod, ethRes.Ret) - Expect(err).ToNot(HaveOccurred(), "error while unpacking the clawback output: %v", err) - Expect(co.Coins).To(Equal(balances), "expected different clawback amount") + _, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, clawbackArgs, execRevertedCheck) + Expect(err).To(HaveOccurred(), "error while calling the contract: %v", err) - balancePost := s.app.BankKeeper.GetBalance(s.ctx, toAddr.Bytes(), s.bondDenom) - Expect(balancePost.Amount.Int64()).To(Equal(int64(100)), "expected only initial balance after clawback") - balanceReceiver := s.app.BankKeeper.GetBalance(s.ctx, differentAddr.Bytes(), s.bondDenom) - Expect(balanceReceiver.Amount).To(Equal(math.NewInt(1000)), "expected receiver to show different balance after clawback") + balancePost := s.app.BankKeeper.GetBalance(s.ctx, toAddr.Bytes(), s.bondDenom) + Expect(balancePost.Amount).To(Equal(balancePre.Amount)) + balanceReceiver := s.app.BankKeeper.GetBalance(s.ctx, differentAddr.Bytes(), s.bondDenom) + Expect(balanceReceiver.Amount).To(Equal(math.ZeroInt())) + }) }) - It(fmt.Sprintf("should return an error when not sending as the funder (%s)", callType.name), func() { - // create and fund new account - differentAddr, differentPriv := testutiltx.NewAddrKey() - err := evmosutil.FundAccountWithBaseDenom(s.ctx, s.app.BankKeeper, differentAddr.Bytes(), 1e18) - Expect(err).ToNot(HaveOccurred(), "error while funding the account: %v", err) - - balancePre := s.app.BankKeeper.GetBalance(s.ctx, toAddr.Bytes(), s.bondDenom) - Expect(balancePre.Amount).To(Equal(math.NewInt(1100)), "expected different balance after setup") - - clawbackArgs := s.BuildCallArgs(callType, contractAddr). - WithMethodName(vesting.ClawbackMethod). - WithPrivKey(differentPriv). - WithArgs( - s.address, - toAddr, - differentAddr, - ) - - clawbackCheck := execRevertedCheck - if callType.directCall { - clawbackCheck = failCheck. - WithErrContains(fmt.Sprintf( - "tx origin address %s does not match the funder address %s", - differentAddr, s.address, - )) - } - - _, _, err = contracts.CallContractAndCheckLogs(s.ctx, s.app, clawbackArgs, clawbackCheck) - Expect(err).To(HaveOccurred(), "error while calling the contract: %v", err) - if callType.directCall { - Expect(err.Error()).To(ContainSubstring("does not match the funder address")) - } - balancePost := s.app.BankKeeper.GetBalance(s.ctx, toAddr.Bytes(), s.bondDenom) - Expect(balancePost).To(Equal(balancePre), "expected balance not to have changed") - }) - - It(fmt.Sprintf("should return an error when the vesting does not exist (%s)", callType.name), func() { - // fund the new account - err := evmosutil.FundAccountWithBaseDenom(s.ctx, s.app.BankKeeper, differentAddr.Bytes(), 1e18) - Expect(err).ToNot(HaveOccurred(), "error while funding the account: %v", err) + Context("with authorization", func() { + BeforeEach(func() { + if callType.directCall == false { + err = vesting.CreateGenericAuthz(s.ctx, s.app.AuthzKeeper, contractAddr, s.address, vesting.ClawbackMsgURL) + Expect(err).ToNot(HaveOccurred(), "error while creating the generic authorization: %v", err) + } + }) + + It(fmt.Sprintf("should claw back from the vesting when sending as the funder (%s)", callType.name), func() { + balancePre := s.app.BankKeeper.GetBalance(s.ctx, toAddr.Bytes(), s.bondDenom) + Expect(balancePre.Amount).To(Equal(math.NewInt(1100)), "expected different balance after setup") + + clawbackArgs := s.BuildCallArgs(callType, contractAddr). + WithMethodName(vesting.ClawbackMethod). + WithArgs( + s.address, + toAddr, + differentAddr, + ) - clawbackArgs := s.BuildCallArgs(callType, contractAddr). - WithMethodName(vesting.ClawbackMethod). - WithArgs( - s.address, - differentAddr, - s.address, + clawbackCheck := passCheck. + WithExpEvents(vesting.EventTypeClawback) + + _, ethRes, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, clawbackArgs, clawbackCheck) + Expect(err).ToNot(HaveOccurred(), "error while calling the contract: %v", err) + + var co vesting.ClawbackOutput + err = s.precompile.UnpackIntoInterface(&co, vesting.ClawbackMethod, ethRes.Ret) + Expect(err).ToNot(HaveOccurred(), "error while unpacking the clawback output: %v", err) + Expect(co.Coins).To(Equal(balances), "expected different clawback amount") + + balancePost := s.app.BankKeeper.GetBalance(s.ctx, toAddr.Bytes(), s.bondDenom) + Expect(balancePost.Amount.Int64()).To(Equal(int64(100)), "expected only initial balance after clawback") + balanceReceiver := s.app.BankKeeper.GetBalance(s.ctx, differentAddr.Bytes(), s.bondDenom) + Expect(balanceReceiver.Amount).To(Equal(math.NewInt(1000)), "expected receiver to show different balance after clawback") + }) + + Context("table tests for clawback with state changes", func() { + type testCase struct { + dest common.Address + transferTo *common.Address + before bool + after bool + } + DescribeTable(fmt.Sprintf("smart contract as funder - contract with state changes on destination address - should claw back from the vesting when sending as the funder (%s)", callType.name), func(tc testCase) { + if callType.directCall { + Skip("this should only be run for smart contract calls") + } + if tc.transferTo == nil { + tc.transferTo = &tc.dest + } + // change the vesting account funder to be the contract + _, err := s.app.VestingKeeper.UpdateVestingFunder(s.ctx, &vestingtypes.MsgUpdateVestingFunder{ + FunderAddress: sdk.AccAddress(s.address.Bytes()).String(), + NewFunderAddress: sdk.AccAddress(contractAddr.Bytes()).String(), + VestingAddress: sdk.AccAddress(toAddr.Bytes()).String(), + }) + Expect(err).ToNot(HaveOccurred()) + + // fund the contract to make internal transfers + contractInitialBalance := math.NewInt(100) + err = evmosutil.FundAccountWithBaseDenom(s.ctx, s.app.BankKeeper, contractAddr.Bytes(), contractInitialBalance.Int64()) + Expect(err).ToNot(HaveOccurred(), "error while funding the contract: %v", err) + + vestAccInitialBal := s.app.BankKeeper.GetBalance(s.ctx, toAddr.Bytes(), s.bondDenom) + Expect(vestAccInitialBal.Amount).To(Equal(math.NewInt(1100)), "expected different balance after setup") + + clawbackArgs := s.BuildCallArgs(callType, contractAddr). + WithMethodName("clawbackWithTransfer"). + WithArgs( + contractAddr, + toAddr, + tc.dest, + *tc.transferTo, + tc.before, + tc.after, + ) + + clawbackCheck := passCheck. + WithExpEvents(vesting.EventTypeClawback) + + _, ethRes, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, clawbackArgs, clawbackCheck) + Expect(err).ToNot(HaveOccurred(), "error while calling the contract: %v", err) + + var co vesting.ClawbackOutput + err = s.precompile.UnpackIntoInterface(&co, vesting.ClawbackMethod, ethRes.Ret) + Expect(err).ToNot(HaveOccurred(), "error while unpacking the clawback output: %v", err) + Expect(co.Coins).To(Equal(balances), "expected different clawback amount") + + contractTransferredAmt := math.ZeroInt() + for _, transferred := range []bool{tc.before, tc.after} { + if transferred { + contractTransferredAmt = contractTransferredAmt.AddRaw(15) + } + } + + vestAccFinalBalance := s.app.BankKeeper.GetBalance(s.ctx, toAddr.Bytes(), s.bondDenom) + expVestAccFinalBal := vestAccInitialBal.Amount.Sub(expClawbackAmt) + if *tc.transferTo == toAddr { + expVestAccFinalBal = expVestAccFinalBal.Add(contractTransferredAmt) + } + Expect(vestAccFinalBalance.Amount).To(Equal(expVestAccFinalBal), "expected only initial balance after clawback") + + // contract transfers balances when it is not the destination + if tc.dest == contractAddr { + contractFinalBalance := s.app.BankKeeper.GetBalance(s.ctx, contractAddr.Bytes(), s.bondDenom) + Expect(contractFinalBalance.Amount).To(Equal(contractInitialBalance.Add(expClawbackAmt))) + return + } + + balanceDest := s.app.BankKeeper.GetBalance(s.ctx, tc.dest.Bytes(), s.bondDenom) + expBalDest := expClawbackAmt + if *tc.transferTo == tc.dest { + expBalDest = expBalDest.Add(contractTransferredAmt) + } + Expect(balanceDest.Amount).To(Equal(expBalDest), "expected receiver to show different balance after clawback") + + contractFinalBalance := s.app.BankKeeper.GetBalance(s.ctx, contractAddr.Bytes(), s.bondDenom) + Expect(contractFinalBalance.Amount).To(Equal(contractInitialBalance.Sub(contractTransferredAmt))) + }, + Entry("funder is the destination address - state changes before & after precompile call", testCase{ + dest: contractAddr, + before: true, + after: true, + }), + Entry("funder is the destination address - state changes before precompile call", testCase{ + dest: contractAddr, + before: true, + after: false, + }), + Entry("funder is the destination address - state changes after precompile call", testCase{ + dest: contractAddr, + before: false, + after: true, + }), + Entry("another address is the destination address - state changes before & after precompile", testCase{ + dest: differentAddr, + before: true, + after: true, + }), + Entry("another address is the destination address - state changes before precompile", testCase{ + dest: differentAddr, + before: true, + after: false, + }), + Entry("another address is the destination address - state changes after precompile", testCase{ + dest: differentAddr, + before: false, + after: true, + }), + Entry("another address is the destination address - transfer to vest acc before & after precompile", testCase{ + dest: differentAddr, + transferTo: &toAddr, + before: true, + after: true, + }), + Entry("another address is the destination address - transfer to vest acc before precompile", testCase{ + dest: differentAddr, + transferTo: &toAddr, + before: true, + after: false, + }), + Entry("another address is the destination address - transfer to vest acc after precompile", testCase{ + dest: differentAddr, + transferTo: &toAddr, + before: false, + after: true, + }), ) + }) + + It(fmt.Sprintf("should claw back from the vesting when sending as the funder with the caller smart contract as destination for the clawed back funds (%s)", callType.name), func() { + balancePre := s.app.BankKeeper.GetBalance(s.ctx, toAddr.Bytes(), s.bondDenom) + Expect(balancePre.Amount).To(Equal(math.NewInt(1100)), "expected different balance after setup") + + // check the contract's (destination) intial balance. Should be 0 + contractInitialBal := s.app.BankKeeper.GetBalance(s.ctx, contractAddr.Bytes(), s.bondDenom) + Expect(contractInitialBal.Amount).To(Equal(sdk.ZeroInt())) + + // get tx sender initial balance + txSenderInitialBal := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + + clawbackArgs := s.BuildCallArgs(callType, contractAddr). + WithMethodName(vesting.ClawbackMethod). + WithArgs( + s.address, + toAddr, + contractAddr, + ). + WithGasPrice(gasPrice.BigInt()) + + clawbackCheck := passCheck. + WithExpEvents(vesting.EventTypeClawback) + + res, ethRes, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, clawbackArgs, clawbackCheck) + Expect(err).ToNot(HaveOccurred(), "error while calling the contract: %v", err) + + fees := gasPrice.MulRaw(res.GasUsed) + + var co vesting.ClawbackOutput + err = s.precompile.UnpackIntoInterface(&co, vesting.ClawbackMethod, ethRes.Ret) + Expect(err).ToNot(HaveOccurred(), "error while unpacking the clawback output: %v", err) + Expect(co.Coins).To(Equal(balances), "expected different clawback amount") + + // check clawback account balance + balancePost := s.app.BankKeeper.GetBalance(s.ctx, toAddr.Bytes(), s.bondDenom) + Expect(balancePost.Amount.Int64()).To(Equal(int64(100)), "expected only initial balance after clawback") + + // check that tx signer's balance is reduced by the fees paid + txSenderFinalBal := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + Expect(txSenderFinalBal.Amount).To(Equal(txSenderInitialBal.Amount.Sub(fees))) + + // check contract's final balance (clawback destination) + contractFinalBal := s.app.BankKeeper.GetBalance(s.ctx, contractAddr.Bytes(), s.bondDenom) + Expect(contractFinalBal.Amount).To(Equal(math.NewInt(1000)), "expected receiver to show different balance after clawback") + }) + + It(fmt.Sprintf("clawback with revert after precompile call but before changing contract state - should NOT claw back and revert all balances to initial values (%s)", callType.name), func() { + if callType.directCall { + Skip("this should only be run for smart contract calls") + } + balancePre := s.app.BankKeeper.GetBalance(s.ctx, toAddr.Bytes(), s.bondDenom) + Expect(balancePre.Amount).To(Equal(math.NewInt(1100)), "expected different balance after setup") + + clawbackArgs := s.BuildCallArgs(callType, contractAddr). + WithMethodName("clawbackWithRevert"). + WithArgs( + s.address, + toAddr, + differentAddr, + true, + ) - clawbackCheck := execRevertedCheck - // FIXME: error messages in fail check now work differently! - if callType.directCall { - clawbackCheck = failCheck. - WithErrContains(vestingtypes.ErrNotSubjectToClawback.Error()) - } - - _, _, err = contracts.CallContractAndCheckLogs(s.ctx, s.app, clawbackArgs, clawbackCheck) - Expect(err).To(HaveOccurred(), "error while calling the contract: %v", err) - if callType.directCall { - Expect(err.Error()).To(ContainSubstring("%s: %s", sdk.AccAddress(differentAddr.Bytes()), vestingtypes.ErrNotSubjectToClawback.Error())) - } - }) + _, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, clawbackArgs, execRevertedCheck) + Expect(err).To(HaveOccurred()) + + balancePost := s.app.BankKeeper.GetBalance(s.ctx, toAddr.Bytes(), s.bondDenom) + Expect(balancePost.Amount).To(Equal(balancePre.Amount), "expected no balance change") + balanceReceiver := s.app.BankKeeper.GetBalance(s.ctx, differentAddr.Bytes(), s.bondDenom) + Expect(balanceReceiver.Amount).To(Equal(math.ZeroInt())) + }) + + It(fmt.Sprintf("clawback with revert after precompile after changing contract state - should NOT claw back and revert all balances to initial values (%s)", callType.name), func() { + if callType.directCall { + Skip("this should only be run for smart contract calls") + } + balancePre := s.app.BankKeeper.GetBalance(s.ctx, toAddr.Bytes(), s.bondDenom) + Expect(balancePre.Amount).To(Equal(math.NewInt(1100)), "expected different balance after setup") + + clawbackArgs := s.BuildCallArgs(callType, contractAddr). + WithMethodName("clawbackWithRevert"). + WithArgs( + s.address, + toAddr, + differentAddr, + false, + ) - It(fmt.Sprintf("should succeed and return empty Coins when all tokens are vested (%s)", callType.name), func() { - // commit block with time so that vesting has ended - ctx, err := evmosutil.CommitAndCreateNewCtx(s.ctx, s.app, time.Hour*24, nil) - Expect(err).ToNot(HaveOccurred(), "error while committing block: %v", err) - s.ctx = ctx + _, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, clawbackArgs, execRevertedCheck) + Expect(err).To(HaveOccurred()) + + balancePost := s.app.BankKeeper.GetBalance(s.ctx, toAddr.Bytes(), s.bondDenom) + Expect(balancePost.Amount).To(Equal(balancePre.Amount), "expected no balance change") + balanceReceiver := s.app.BankKeeper.GetBalance(s.ctx, differentAddr.Bytes(), s.bondDenom) + Expect(balanceReceiver.Amount).To(Equal(math.ZeroInt())) + }) + + It(fmt.Sprintf("another contract as destination - should clawback from the vesting when sending as the funder with another smart contract as destination for the clawed back funds (%s)", callType.name), func() { + counterContract, err := contracts.LoadCounterContract() + Expect(err).ToNot(HaveOccurred()) + + destContractAddr, err := s.DeployContract(counterContract) + Expect(err).ToNot(HaveOccurred(), "error while deploying the smart contract: %v", err) + + balancePre := s.app.BankKeeper.GetBalance(s.ctx, toAddr.Bytes(), s.bondDenom) + Expect(balancePre.Amount).To(Equal(math.NewInt(1100)), "expected different balance after setup") + + // check the contract's (destination) intial balance. Should be 0 + destContractInitialBal := s.app.BankKeeper.GetBalance(s.ctx, destContractAddr.Bytes(), s.bondDenom) + Expect(destContractInitialBal.Amount).To(Equal(sdk.ZeroInt())) + + // get tx sender initial balance + txSenderInitialBal := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + + clawbackCheck := passCheck. + WithExpEvents(vesting.EventTypeClawback) + + clawbackArgs := s.BuildCallArgs(callType, contractAddr). + WithMethodName(vesting.ClawbackMethod). + WithArgs( + s.address, + toAddr, + destContractAddr, + ). + WithGasPrice(gasPrice.BigInt()) + + res, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, clawbackArgs, clawbackCheck) + Expect(err).NotTo(HaveOccurred()) + fees := gasPrice.MulRaw(res.GasUsed) + + // check clawback account balance + balancePost := s.app.BankKeeper.GetBalance(s.ctx, toAddr.Bytes(), s.bondDenom) + Expect(balancePost.Amount).To(Equal(balancePre.Amount.Sub(expClawbackAmt))) + + // check that tx signer's balance is reduced by the fees paid + txSenderFinalBal := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + Expect(txSenderFinalBal.Amount).To(Equal(txSenderInitialBal.Amount.Sub(fees))) + + // check caller contract's final balance should be zero + callerContractFinalBal := s.app.BankKeeper.GetBalance(s.ctx, contractAddr.Bytes(), s.bondDenom) + Expect(callerContractFinalBal.Amount).To(Equal(math.ZeroInt())) + + // check destination contract's final balance should + // have received the clawback amt + destContractFinalBal := s.app.BankKeeper.GetBalance(s.ctx, destContractAddr.Bytes(), s.bondDenom) + Expect(destContractFinalBal.Amount).To(Equal(destContractInitialBal.Amount.Add(expClawbackAmt))) + }) + + It(fmt.Sprintf("another contract as destination - should claw back from the vesting when sending as the funder with another smart contract as destination and triggering state change on destination contract (%s)", callType.name), func() { + if callType.directCall { + Skip("this should only be run for smart contract calls") + } + counterContract, err := contracts.LoadCounterContract() + Expect(err).ToNot(HaveOccurred()) + + destContractAddr, err := s.DeployContract(counterContract) + Expect(err).ToNot(HaveOccurred(), "error while deploying the smart contract: %v", err) + + balancePre := s.app.BankKeeper.GetBalance(s.ctx, toAddr.Bytes(), s.bondDenom) + Expect(balancePre.Amount).To(Equal(math.NewInt(1100)), "expected different balance after setup") + + // check the contract's (destination) intial balance. Should be 0 + destContractInitialBal := s.app.BankKeeper.GetBalance(s.ctx, destContractAddr.Bytes(), s.bondDenom) + Expect(destContractInitialBal.Amount).To(Equal(sdk.ZeroInt())) + + // get tx sender initial balance + txSenderInitialBal := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + + clawbackArgs := s.BuildCallArgs(callType, contractAddr). + WithMethodName("clawbackWithCounterCall"). + WithArgs( + s.address, + toAddr, + destContractAddr, + ). + WithGasPrice(gasPrice.BigInt()) + + // expect the vesting precompile events and the Counter + // contract's events + clawbackCheck := passCheck. + WithABIEvents(mergeEventMaps( + s.precompile.Events, + counterContract.ABI.Events, + )). + WithExpEvents([]string{ + "Added", "Changed", + vesting.EventTypeClawback, + "Changed", + }...) + + res, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, clawbackArgs, clawbackCheck) + Expect(err).NotTo(HaveOccurred()) + fees := gasPrice.MulRaw(res.GasUsed) + + // check clawback account balance + balancePost := s.app.BankKeeper.GetBalance(s.ctx, toAddr.Bytes(), s.bondDenom) + Expect(balancePost.Amount).To(Equal(balancePre.Amount.Sub(expClawbackAmt))) + + // check that tx signer's balance is reduced by the fees paid + txSenderFinalBal := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + Expect(txSenderFinalBal.Amount).To(Equal(txSenderInitialBal.Amount.Sub(fees))) + + // check caller contract's final balance should be zero + callerContractFinalBal := s.app.BankKeeper.GetBalance(s.ctx, contractAddr.Bytes(), s.bondDenom) + Expect(callerContractFinalBal.Amount).To(Equal(math.ZeroInt())) + + // check destination contract's final balance should + // have received the clawback amt + destContractFinalBal := s.app.BankKeeper.GetBalance(s.ctx, destContractAddr.Bytes(), s.bondDenom) + Expect(destContractFinalBal.Amount).To(Equal(destContractInitialBal.Amount.Add(expClawbackAmt))) + }) + + It(fmt.Sprintf("should return an error when not sending as the funder (%s)", callType.name), func() { + // create and fund new account + differentAddr, differentPriv := testutiltx.NewAddrKey() + err := evmosutil.FundAccountWithBaseDenom(s.ctx, s.app.BankKeeper, differentAddr.Bytes(), 1e18) + Expect(err).ToNot(HaveOccurred(), "error while funding the account: %v", err) + + balancePre := s.app.BankKeeper.GetBalance(s.ctx, toAddr.Bytes(), s.bondDenom) + Expect(balancePre.Amount).To(Equal(math.NewInt(1100)), "expected different balance after setup") + + clawbackArgs := s.BuildCallArgs(callType, contractAddr). + WithMethodName(vesting.ClawbackMethod). + WithPrivKey(differentPriv). + WithArgs( + s.address, + toAddr, + differentAddr, + ) - balancePre := s.app.BankKeeper.GetBalance(s.ctx, toAddr.Bytes(), s.bondDenom) - Expect(balancePre.Amount).To(Equal(math.NewInt(1100)), "expected different balance after setup") + clawbackCheck := execRevertedCheck + if callType.directCall { + clawbackCheck = failCheck. + WithErrContains(fmt.Sprintf( + "tx origin address %s does not match the funder address %s", + differentAddr, s.address, + )) + } + + _, _, err = contracts.CallContractAndCheckLogs(s.ctx, s.app, clawbackArgs, clawbackCheck) + Expect(err).To(HaveOccurred(), "error while calling the contract: %v", err) + if callType.directCall { + Expect(err.Error()).To(ContainSubstring("does not match the funder address")) + } + balancePost := s.app.BankKeeper.GetBalance(s.ctx, toAddr.Bytes(), s.bondDenom) + Expect(balancePost).To(Equal(balancePre), "expected balance not to have changed") + }) + + It(fmt.Sprintf("should return an error when the vesting does not exist (%s)", callType.name), func() { + // fund the new account + err := evmosutil.FundAccountWithBaseDenom(s.ctx, s.app.BankKeeper, differentAddr.Bytes(), 1e18) + Expect(err).ToNot(HaveOccurred(), "error while funding the account: %v", err) + + clawbackArgs := s.BuildCallArgs(callType, contractAddr). + WithMethodName(vesting.ClawbackMethod). + WithArgs( + s.address, + differentAddr, + s.address, + ) - clawbackArgs := s.BuildCallArgs(callType, contractAddr). - WithMethodName(vesting.ClawbackMethod). - WithArgs( - s.address, - toAddr, - s.address, - ) + clawbackCheck := execRevertedCheck + if callType.directCall { + clawbackCheck = failCheck. + WithErrContains(vestingtypes.ErrNotSubjectToClawback.Error()) + } + + _, _, err = contracts.CallContractAndCheckLogs(s.ctx, s.app, clawbackArgs, clawbackCheck) + Expect(err).To(HaveOccurred(), "error while calling the contract: %v", err) + if callType.directCall { + Expect(err.Error()).To(ContainSubstring("%s: %s", sdk.AccAddress(differentAddr.Bytes()), vestingtypes.ErrNotSubjectToClawback.Error())) + } + }) + + It(fmt.Sprintf("should succeed and return empty Coins when all tokens are vested (%s)", callType.name), func() { + // commit block with time so that vesting has ended + ctx, err := evmosutil.CommitAndCreateNewCtx(s.ctx, s.app, time.Hour*24, nil) + Expect(err).ToNot(HaveOccurred(), "error while committing block: %v", err) + s.ctx = ctx + + balancePre := s.app.BankKeeper.GetBalance(s.ctx, toAddr.Bytes(), s.bondDenom) + Expect(balancePre.Amount).To(Equal(math.NewInt(1100)), "expected different balance after setup") + + clawbackArgs := s.BuildCallArgs(callType, contractAddr). + WithMethodName(vesting.ClawbackMethod). + WithArgs( + s.address, + toAddr, + s.address, + ) - _, ethRes, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, clawbackArgs, passCheck) - Expect(err).To(HaveOccurred(), "error while calling the contract: %v", err) + _, ethRes, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, clawbackArgs, passCheck) + Expect(err).To(HaveOccurred(), "error while calling the contract: %v", err) - var co vesting.ClawbackOutput - err = s.precompile.UnpackIntoInterface(&co, vesting.ClawbackMethod, ethRes.Ret) - Expect(err).ToNot(HaveOccurred(), "error while unpacking the clawback output: %v", err) - Expect(co.Coins).To(BeEmpty(), "expected empty clawback amount") + var co vesting.ClawbackOutput + err = s.precompile.UnpackIntoInterface(&co, vesting.ClawbackMethod, ethRes.Ret) + Expect(err).ToNot(HaveOccurred(), "error while unpacking the clawback output: %v", err) + Expect(co.Coins).To(BeEmpty(), "expected empty clawback amount") - balancePost := s.app.BankKeeper.GetBalance(s.ctx, toAddr.Bytes(), s.bondDenom) - Expect(balancePost).To(Equal(balancePre), "expected balance not to have changed") + balancePost := s.app.BankKeeper.GetBalance(s.ctx, toAddr.Bytes(), s.bondDenom) + Expect(balancePost).To(Equal(balancePre), "expected balance not to have changed") + }) }) } }) diff --git a/precompiles/vesting/testdata/VestingCaller.json b/precompiles/vesting/testdata/VestingCaller.json index c758af99f4..9afff9b557 100644 --- a/precompiles/vesting/testdata/VestingCaller.json +++ b/precompiles/vesting/testdata/VestingCaller.json @@ -109,6 +109,149 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "funder", + "type": "address" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "address", + "name": "dest", + "type": "address" + } + ], + "name": "clawbackWithCounterCall", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Coin[]", + "name": "coins", + "type": "tuple[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "funder", + "type": "address" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "address", + "name": "dest", + "type": "address" + }, + { + "internalType": "bool", + "name": "before", + "type": "bool" + } + ], + "name": "clawbackWithRevert", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Coin[]", + "name": "coins", + "type": "tuple[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "funder", + "type": "address" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "address", + "name": "dest", + "type": "address" + }, + { + "internalType": "address payable", + "name": "_transferTo", + "type": "address" + }, + { + "internalType": "bool", + "name": "_before", + "type": "bool" + }, + { + "internalType": "bool", + "name": "_after", + "type": "bool" + } + ], + "name": "clawbackWithTransfer", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Coin[]", + "name": "coins", + "type": "tuple[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -122,6 +265,19 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "counter", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -233,6 +389,183 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "funder", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "address payable", + "name": "_transferTo", + "type": "address" + }, + { + "internalType": "uint64", + "name": "startTime", + "type": "uint64" + }, + { + "components": [ + { + "internalType": "int64", + "name": "length", + "type": "int64" + }, + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Coin[]", + "name": "amount", + "type": "tuple[]" + } + ], + "internalType": "struct Period[]", + "name": "lockupPeriods", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "int64", + "name": "length", + "type": "int64" + }, + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Coin[]", + "name": "amount", + "type": "tuple[]" + } + ], + "internalType": "struct Period[]", + "name": "vestingPeriods", + "type": "tuple[]" + }, + { + "internalType": "bool", + "name": "transferBefore", + "type": "bool" + }, + { + "internalType": "bool", + "name": "transferAfter", + "type": "bool" + } + ], + "name": "fundVestingAccountAndTransfer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "funder", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint64", + "name": "startTime", + "type": "uint64" + }, + { + "components": [ + { + "internalType": "int64", + "name": "length", + "type": "int64" + }, + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Coin[]", + "name": "amount", + "type": "tuple[]" + } + ], + "internalType": "struct Period[]", + "name": "lockupPeriods", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "int64", + "name": "length", + "type": "int64" + }, + { + "components": [ + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct Coin[]", + "name": "amount", + "type": "tuple[]" + } + ], + "internalType": "struct Period[]", + "name": "vestingPeriods", + "type": "tuple[]" + } + ], + "name": "fundVestingAccountWithCounterContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -257,8 +590,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b50611707806100206000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c806372e7c9ab1161005b57806372e7c9ab146100ec5780637caef81b1461011c5780639cfef12914610126578063cdb50175146101425761007d565b806327e235e3146100825780634fe1a8df146100b45780635a211064146100d0575b600080fd5b61009c600480360381019061009791906106f5565b61015e565b6040516100ab939291906108ca565b60405180910390f35b6100ce60048036038101906100c991906109bb565b6101f1565b005b6100ea60048036038101906100e591906106f5565b6102c9565b005b61010660048036038101906101019190610a77565b61038f565b6040516101139190610aca565b60405180910390f35b610124610421565b005b610140600480360381019061013b9190610a77565b6104eb565b005b61015c60048036038101906101579190610b24565b6105b7565b005b606080606061080373ffffffffffffffffffffffffffffffffffffffff166327e235e3856040518263ffffffff1660e01b815260040161019e9190610b86565b600060405180830381865afa1580156101bb573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906101e49190610e45565b9250925092509193909250565b600061080373ffffffffffffffffffffffffffffffffffffffff16634fe1a8df898989898989896040518863ffffffff1660e01b815260040161023a97969594939291906112e5565b6020604051808303816000875af1158015610259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027d919061135f565b9050806102bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b69061140f565b60405180910390fd5b5050505050505050565b600061080373ffffffffffffffffffffffffffffffffffffffff16635a211064836040518263ffffffff1660e01b81526004016103069190610b86565b6020604051808303816000875af1158015610325573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610349919061135f565b90508061038b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610382906114a1565b60405180910390fd5b5050565b606061080373ffffffffffffffffffffffffffffffffffffffff166372e7c9ab8585856040518463ffffffff1660e01b81526004016103d0939291906114c1565b6000604051808303816000875af11580156103ef573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061041891906114f8565b90509392505050565b600061080373ffffffffffffffffffffffffffffffffffffffff1663cdb50175333060006040518463ffffffff1660e01b815260040161046393929190611550565b6020604051808303816000875af1158015610482573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104a6919061135f565b9050806104e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104df9061161f565b60405180910390fd5b50565b600061080373ffffffffffffffffffffffffffffffffffffffff16639cfef1298585856040518463ffffffff1660e01b815260040161052c939291906114c1565b6020604051808303816000875af115801561054b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061056f919061135f565b9050806105b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105a8906116b1565b60405180910390fd5b50505050565b600061080373ffffffffffffffffffffffffffffffffffffffff1663cdb501758585856040518463ffffffff1660e01b81526004016105f893929190611550565b6020604051808303816000875af1158015610617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063b919061135f565b90508061067d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106749061140f565b60405180910390fd5b50505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106c282610697565b9050919050565b6106d2816106b7565b81146106dd57600080fd5b50565b6000813590506106ef816106c9565b92915050565b60006020828403121561070b5761070a61068d565b5b6000610719848285016106e0565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561078857808201518184015260208101905061076d565b60008484015250505050565b6000601f19601f8301169050919050565b60006107b08261074e565b6107ba8185610759565b93506107ca81856020860161076a565b6107d381610794565b840191505092915050565b6000819050919050565b6107f1816107de565b82525050565b6000604083016000830151848203600086015261081482826107a5565b915050602083015161082960208601826107e8565b508091505092915050565b600061084083836107f7565b905092915050565b6000602082019050919050565b600061086082610722565b61086a818561072d565b93508360208202850161087c8561073e565b8060005b858110156108b857848403895281516108998582610834565b94506108a483610848565b925060208a01995050600181019050610880565b50829750879550505050505092915050565b600060608201905081810360008301526108e48186610855565b905081810360208301526108f88185610855565b9050818103604083015261090c8184610855565b9050949350505050565b600067ffffffffffffffff82169050919050565b61093381610916565b811461093e57600080fd5b50565b6000813590506109508161092a565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261097b5761097a610956565b5b8235905067ffffffffffffffff8111156109985761099761095b565b5b6020830191508360208202830111156109b4576109b3610960565b5b9250929050565b600080600080600080600060a0888a0312156109da576109d961068d565b5b60006109e88a828b016106e0565b97505060206109f98a828b016106e0565b9650506040610a0a8a828b01610941565b955050606088013567ffffffffffffffff811115610a2b57610a2a610692565b5b610a378a828b01610965565b9450945050608088013567ffffffffffffffff811115610a5a57610a59610692565b5b610a668a828b01610965565b925092505092959891949750929550565b600080600060608486031215610a9057610a8f61068d565b5b6000610a9e868287016106e0565b9350506020610aaf868287016106e0565b9250506040610ac0868287016106e0565b9150509250925092565b60006020820190508181036000830152610ae48184610855565b905092915050565b60008115159050919050565b610b0181610aec565b8114610b0c57600080fd5b50565b600081359050610b1e81610af8565b92915050565b600080600060608486031215610b3d57610b3c61068d565b5b6000610b4b868287016106e0565b9350506020610b5c868287016106e0565b9250506040610b6d86828701610b0f565b9150509250925092565b610b80816106b7565b82525050565b6000602082019050610b9b6000830184610b77565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610bd982610794565b810181811067ffffffffffffffff82111715610bf857610bf7610ba1565b5b80604052505050565b6000610c0b610683565b9050610c178282610bd0565b919050565b600067ffffffffffffffff821115610c3757610c36610ba1565b5b602082029050602081019050919050565b600080fd5b600080fd5b600080fd5b600067ffffffffffffffff821115610c7257610c71610ba1565b5b610c7b82610794565b9050602081019050919050565b6000610c9b610c9684610c57565b610c01565b905082815260208101848484011115610cb757610cb6610c52565b5b610cc284828561076a565b509392505050565b600082601f830112610cdf57610cde610956565b5b8151610cef848260208601610c88565b91505092915050565b610d01816107de565b8114610d0c57600080fd5b50565b600081519050610d1e81610cf8565b92915050565b600060408284031215610d3a57610d39610c48565b5b610d446040610c01565b9050600082015167ffffffffffffffff811115610d6457610d63610c4d565b5b610d7084828501610cca565b6000830152506020610d8484828501610d0f565b60208301525092915050565b6000610da3610d9e84610c1c565b610c01565b90508083825260208201905060208402830185811115610dc657610dc5610960565b5b835b81811015610e0d57805167ffffffffffffffff811115610deb57610dea610956565b5b808601610df88982610d24565b85526020850194505050602081019050610dc8565b5050509392505050565b600082601f830112610e2c57610e2b610956565b5b8151610e3c848260208601610d90565b91505092915050565b600080600060608486031215610e5e57610e5d61068d565b5b600084015167ffffffffffffffff811115610e7c57610e7b610692565b5b610e8886828701610e17565b935050602084015167ffffffffffffffff811115610ea957610ea8610692565b5b610eb586828701610e17565b925050604084015167ffffffffffffffff811115610ed657610ed5610692565b5b610ee286828701610e17565b9150509250925092565b610ef581610916565b82525050565b600082825260208201905092915050565b6000819050919050565b60008160070b9050919050565b610f2c81610f16565b8114610f3757600080fd5b50565b600081359050610f4981610f23565b92915050565b6000610f5e6020840184610f3a565b905092915050565b610f6f81610f16565b82525050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112610fa157610fa0610f7f565b5b83810192508235915060208301925067ffffffffffffffff821115610fc957610fc8610f75565b5b602082023603831315610fdf57610fde610f7a565b5b509250929050565b600082825260208201905092915050565b6000819050919050565b6000808335600160200384360303811261101f5761101e610f7f565b5b83810192508235915060208301925067ffffffffffffffff82111561104757611046610f75565b5b60018202360383131561105d5761105c610f7a565b5b509250929050565b82818337600083830152505050565b60006110808385610759565b935061108d838584611065565b61109683610794565b840190509392505050565b6000813590506110b081610cf8565b92915050565b60006110c560208401846110a1565b905092915050565b6000604083016110e06000840184611002565b85830360008701526110f3838284611074565b9250505061110460208401846110b6565b61111160208601826107e8565b508091505092915050565b600061112883836110cd565b905092915050565b60008235600160400383360303811261114c5761114b610f7f565b5b82810191505092915050565b6000602082019050919050565b60006111718385610fe7565b93508360208402850161118384610ff8565b8060005b878110156111c757848403895261119e8284611130565b6111a8858261111c565b94506111b383611158565b925060208a01995050600181019050611187565b50829750879450505050509392505050565b6000604083016111ec6000840184610f4f565b6111f96000860182610f66565b506112076020840184610f84565b858303602087015261121a838284611165565b925050508091505092915050565b600061123483836111d9565b905092915050565b60008235600160400383360303811261125857611257610f7f565b5b82810191505092915050565b6000602082019050919050565b600061127d8385610efb565b93508360208402850161128f84610f0c565b8060005b878110156112d35784840389526112aa828461123c565b6112b48582611228565b94506112bf83611264565b925060208a01995050600181019050611293565b50829750879450505050509392505050565b600060a0820190506112fa600083018a610b77565b6113076020830189610b77565b6113146040830188610eec565b8181036060830152611327818688611271565b9050818103608083015261133c818486611271565b905098975050505050505050565b60008151905061135981610af8565b92915050565b6000602082840312156113755761137461068d565b5b60006113838482850161134a565b91505092915050565b600082825260208201905092915050565b7f56657374696e6743616c6c65723a2063726561746520636c61776261636b207660008201527f657374696e67206163636f756e74206661696c65640000000000000000000000602082015250565b60006113f960358361138c565b91506114048261139d565b604082019050919050565b60006020820190508181036000830152611428816113ec565b9050919050565b7f56657374696e6743616c6c65723a20636f6e7665727420746f20636c6177626160008201527f636b2076657374696e67206163636f756e74206661696c656400000000000000602082015250565b600061148b60398361138c565b91506114968261142f565b604082019050919050565b600060208201905081810360008301526114ba8161147e565b9050919050565b60006060820190506114d66000830186610b77565b6114e36020830185610b77565b6114f06040830184610b77565b949350505050565b60006020828403121561150e5761150d61068d565b5b600082015167ffffffffffffffff81111561152c5761152b610692565b5b61153884828501610e17565b91505092915050565b61154a81610aec565b82525050565b60006060820190506115656000830186610b77565b6115726020830185610b77565b61157f6040830184611541565b949350505050565b7f56657374696e6743616c6c65723a2063726561746520636c61776261636b207660008201527f657374696e67206163636f756e7420666f7220636f6e7472616374206661696c60208201527f6564000000000000000000000000000000000000000000000000000000000000604082015250565b600061160960428361138c565b915061161482611587565b606082019050919050565b60006020820190508181036000830152611638816115fc565b9050919050565b7f56657374696e6743616c6c65723a207570646174652076657374696e6720667560008201527f6e646572206661696c6564000000000000000000000000000000000000000000602082015250565b600061169b602b8361138c565b91506116a68261163f565b604082019050919050565b600060208201905081810360008301526116ca8161168e565b905091905056fea2646970667358221220b5591174fd0eae8c3194a72e4046b55353e35d6f0b4613d06bca7876629b922764736f6c63430008130033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061007d5760003560e01c806372e7c9ab1161005b57806372e7c9ab146100ec5780637caef81b1461011c5780639cfef12914610126578063cdb50175146101425761007d565b806327e235e3146100825780634fe1a8df146100b45780635a211064146100d0575b600080fd5b61009c600480360381019061009791906106f5565b61015e565b6040516100ab939291906108ca565b60405180910390f35b6100ce60048036038101906100c991906109bb565b6101f1565b005b6100ea60048036038101906100e591906106f5565b6102c9565b005b61010660048036038101906101019190610a77565b61038f565b6040516101139190610aca565b60405180910390f35b610124610421565b005b610140600480360381019061013b9190610a77565b6104eb565b005b61015c60048036038101906101579190610b24565b6105b7565b005b606080606061080373ffffffffffffffffffffffffffffffffffffffff166327e235e3856040518263ffffffff1660e01b815260040161019e9190610b86565b600060405180830381865afa1580156101bb573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906101e49190610e45565b9250925092509193909250565b600061080373ffffffffffffffffffffffffffffffffffffffff16634fe1a8df898989898989896040518863ffffffff1660e01b815260040161023a97969594939291906112e5565b6020604051808303816000875af1158015610259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027d919061135f565b9050806102bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b69061140f565b60405180910390fd5b5050505050505050565b600061080373ffffffffffffffffffffffffffffffffffffffff16635a211064836040518263ffffffff1660e01b81526004016103069190610b86565b6020604051808303816000875af1158015610325573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610349919061135f565b90508061038b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610382906114a1565b60405180910390fd5b5050565b606061080373ffffffffffffffffffffffffffffffffffffffff166372e7c9ab8585856040518463ffffffff1660e01b81526004016103d0939291906114c1565b6000604051808303816000875af11580156103ef573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061041891906114f8565b90509392505050565b600061080373ffffffffffffffffffffffffffffffffffffffff1663cdb50175333060006040518463ffffffff1660e01b815260040161046393929190611550565b6020604051808303816000875af1158015610482573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104a6919061135f565b9050806104e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104df9061161f565b60405180910390fd5b50565b600061080373ffffffffffffffffffffffffffffffffffffffff16639cfef1298585856040518463ffffffff1660e01b815260040161052c939291906114c1565b6020604051808303816000875af115801561054b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061056f919061135f565b9050806105b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105a8906116b1565b60405180910390fd5b50505050565b600061080373ffffffffffffffffffffffffffffffffffffffff1663cdb501758585856040518463ffffffff1660e01b81526004016105f893929190611550565b6020604051808303816000875af1158015610617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063b919061135f565b90508061067d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106749061140f565b60405180910390fd5b50505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106c282610697565b9050919050565b6106d2816106b7565b81146106dd57600080fd5b50565b6000813590506106ef816106c9565b92915050565b60006020828403121561070b5761070a61068d565b5b6000610719848285016106e0565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561078857808201518184015260208101905061076d565b60008484015250505050565b6000601f19601f8301169050919050565b60006107b08261074e565b6107ba8185610759565b93506107ca81856020860161076a565b6107d381610794565b840191505092915050565b6000819050919050565b6107f1816107de565b82525050565b6000604083016000830151848203600086015261081482826107a5565b915050602083015161082960208601826107e8565b508091505092915050565b600061084083836107f7565b905092915050565b6000602082019050919050565b600061086082610722565b61086a818561072d565b93508360208202850161087c8561073e565b8060005b858110156108b857848403895281516108998582610834565b94506108a483610848565b925060208a01995050600181019050610880565b50829750879550505050505092915050565b600060608201905081810360008301526108e48186610855565b905081810360208301526108f88185610855565b9050818103604083015261090c8184610855565b9050949350505050565b600067ffffffffffffffff82169050919050565b61093381610916565b811461093e57600080fd5b50565b6000813590506109508161092a565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261097b5761097a610956565b5b8235905067ffffffffffffffff8111156109985761099761095b565b5b6020830191508360208202830111156109b4576109b3610960565b5b9250929050565b600080600080600080600060a0888a0312156109da576109d961068d565b5b60006109e88a828b016106e0565b97505060206109f98a828b016106e0565b9650506040610a0a8a828b01610941565b955050606088013567ffffffffffffffff811115610a2b57610a2a610692565b5b610a378a828b01610965565b9450945050608088013567ffffffffffffffff811115610a5a57610a59610692565b5b610a668a828b01610965565b925092505092959891949750929550565b600080600060608486031215610a9057610a8f61068d565b5b6000610a9e868287016106e0565b9350506020610aaf868287016106e0565b9250506040610ac0868287016106e0565b9150509250925092565b60006020820190508181036000830152610ae48184610855565b905092915050565b60008115159050919050565b610b0181610aec565b8114610b0c57600080fd5b50565b600081359050610b1e81610af8565b92915050565b600080600060608486031215610b3d57610b3c61068d565b5b6000610b4b868287016106e0565b9350506020610b5c868287016106e0565b9250506040610b6d86828701610b0f565b9150509250925092565b610b80816106b7565b82525050565b6000602082019050610b9b6000830184610b77565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610bd982610794565b810181811067ffffffffffffffff82111715610bf857610bf7610ba1565b5b80604052505050565b6000610c0b610683565b9050610c178282610bd0565b919050565b600067ffffffffffffffff821115610c3757610c36610ba1565b5b602082029050602081019050919050565b600080fd5b600080fd5b600080fd5b600067ffffffffffffffff821115610c7257610c71610ba1565b5b610c7b82610794565b9050602081019050919050565b6000610c9b610c9684610c57565b610c01565b905082815260208101848484011115610cb757610cb6610c52565b5b610cc284828561076a565b509392505050565b600082601f830112610cdf57610cde610956565b5b8151610cef848260208601610c88565b91505092915050565b610d01816107de565b8114610d0c57600080fd5b50565b600081519050610d1e81610cf8565b92915050565b600060408284031215610d3a57610d39610c48565b5b610d446040610c01565b9050600082015167ffffffffffffffff811115610d6457610d63610c4d565b5b610d7084828501610cca565b6000830152506020610d8484828501610d0f565b60208301525092915050565b6000610da3610d9e84610c1c565b610c01565b90508083825260208201905060208402830185811115610dc657610dc5610960565b5b835b81811015610e0d57805167ffffffffffffffff811115610deb57610dea610956565b5b808601610df88982610d24565b85526020850194505050602081019050610dc8565b5050509392505050565b600082601f830112610e2c57610e2b610956565b5b8151610e3c848260208601610d90565b91505092915050565b600080600060608486031215610e5e57610e5d61068d565b5b600084015167ffffffffffffffff811115610e7c57610e7b610692565b5b610e8886828701610e17565b935050602084015167ffffffffffffffff811115610ea957610ea8610692565b5b610eb586828701610e17565b925050604084015167ffffffffffffffff811115610ed657610ed5610692565b5b610ee286828701610e17565b9150509250925092565b610ef581610916565b82525050565b600082825260208201905092915050565b6000819050919050565b60008160070b9050919050565b610f2c81610f16565b8114610f3757600080fd5b50565b600081359050610f4981610f23565b92915050565b6000610f5e6020840184610f3a565b905092915050565b610f6f81610f16565b82525050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112610fa157610fa0610f7f565b5b83810192508235915060208301925067ffffffffffffffff821115610fc957610fc8610f75565b5b602082023603831315610fdf57610fde610f7a565b5b509250929050565b600082825260208201905092915050565b6000819050919050565b6000808335600160200384360303811261101f5761101e610f7f565b5b83810192508235915060208301925067ffffffffffffffff82111561104757611046610f75565b5b60018202360383131561105d5761105c610f7a565b5b509250929050565b82818337600083830152505050565b60006110808385610759565b935061108d838584611065565b61109683610794565b840190509392505050565b6000813590506110b081610cf8565b92915050565b60006110c560208401846110a1565b905092915050565b6000604083016110e06000840184611002565b85830360008701526110f3838284611074565b9250505061110460208401846110b6565b61111160208601826107e8565b508091505092915050565b600061112883836110cd565b905092915050565b60008235600160400383360303811261114c5761114b610f7f565b5b82810191505092915050565b6000602082019050919050565b60006111718385610fe7565b93508360208402850161118384610ff8565b8060005b878110156111c757848403895261119e8284611130565b6111a8858261111c565b94506111b383611158565b925060208a01995050600181019050611187565b50829750879450505050509392505050565b6000604083016111ec6000840184610f4f565b6111f96000860182610f66565b506112076020840184610f84565b858303602087015261121a838284611165565b925050508091505092915050565b600061123483836111d9565b905092915050565b60008235600160400383360303811261125857611257610f7f565b5b82810191505092915050565b6000602082019050919050565b600061127d8385610efb565b93508360208402850161128f84610f0c565b8060005b878110156112d35784840389526112aa828461123c565b6112b48582611228565b94506112bf83611264565b925060208a01995050600181019050611293565b50829750879450505050509392505050565b600060a0820190506112fa600083018a610b77565b6113076020830189610b77565b6113146040830188610eec565b8181036060830152611327818688611271565b9050818103608083015261133c818486611271565b905098975050505050505050565b60008151905061135981610af8565b92915050565b6000602082840312156113755761137461068d565b5b60006113838482850161134a565b91505092915050565b600082825260208201905092915050565b7f56657374696e6743616c6c65723a2063726561746520636c61776261636b207660008201527f657374696e67206163636f756e74206661696c65640000000000000000000000602082015250565b60006113f960358361138c565b91506114048261139d565b604082019050919050565b60006020820190508181036000830152611428816113ec565b9050919050565b7f56657374696e6743616c6c65723a20636f6e7665727420746f20636c6177626160008201527f636b2076657374696e67206163636f756e74206661696c656400000000000000602082015250565b600061148b60398361138c565b91506114968261142f565b604082019050919050565b600060208201905081810360008301526114ba8161147e565b9050919050565b60006060820190506114d66000830186610b77565b6114e36020830185610b77565b6114f06040830184610b77565b949350505050565b60006020828403121561150e5761150d61068d565b5b600082015167ffffffffffffffff81111561152c5761152b610692565b5b61153884828501610e17565b91505092915050565b61154a81610aec565b82525050565b60006060820190506115656000830186610b77565b6115726020830185610b77565b61157f6040830184611541565b949350505050565b7f56657374696e6743616c6c65723a2063726561746520636c61776261636b207660008201527f657374696e67206163636f756e7420666f7220636f6e7472616374206661696c60208201527f6564000000000000000000000000000000000000000000000000000000000000604082015250565b600061160960428361138c565b915061161482611587565b606082019050919050565b60006020820190508181036000830152611638816115fc565b9050919050565b7f56657374696e6743616c6c65723a207570646174652076657374696e6720667560008201527f6e646572206661696c6564000000000000000000000000000000000000000000602082015250565b600061169b602b8361138c565b91506116a68261163f565b604082019050919050565b600060208201905081810360008301526116ca8161168e565b905091905056fea2646970667358221220b5591174fd0eae8c3194a72e4046b55353e35d6f0b4613d06bca7876629b922764736f6c63430008130033", + "bytecode": "0x608060405234801561001057600080fd5b506127ac806100206000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c80636c49d3031161008c5780638e292e40116100665780638e292e40146101fe5780639cfef1291461022e578063cdb501751461024a578063fc9c1a8714610266576100cf565b80636c49d303146101a857806372e7c9ab146101c45780637caef81b146101f4576100cf565b806303f4be50146100d45780631e9178bb1461010457806327e235e3146101205780634fe1a8df146101525780635a2110641461016e57806361bc221a1461018a575b600080fd5b6100ee60048036038101906100e99190611233565b610296565b6040516100fb919061142e565b60405180910390f35b61011e6004803603810190610119919061156b565b61041c565b005b61013a60048036038101906101359190611662565b61068f565b6040516101499392919061168f565b60405180910390f35b61016c600480360381019061016791906116db565b610722565b005b61018860048036038101906101839190611662565b610828565b005b6101926108ee565b60405161019f91906117a6565b60405180910390f35b6101c260048036038101906101bd91906116db565b6108f4565b005b6101de60048036038101906101d99190611233565b610ac0565b6040516101eb919061142e565b60405180910390f35b6101fc610b80565b005b610218600480360381019061021391906117c1565b610c4a565b604051610225919061142e565b60405180910390f35b61024860048036038101906102439190611233565b610d94565b005b610264600480360381019061025f9190611828565b610e60565b005b610280600480360381019061027b919061187b565b610f2c565b60405161028d919061142e565b60405180910390f35b606060008290508073ffffffffffffffffffffffffffffffffffffffff16634f2be91f6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156102e557600080fd5b505af11580156102f9573d6000803e3d6000fd5b5050505060008081548092919061030f90611937565b919050555061080373ffffffffffffffffffffffffffffffffffffffff166372e7c9ab8686866040518463ffffffff1660e01b81526004016103539392919061198e565b6000604051808303816000875af1158015610372573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061039b9190611c69565b91508073ffffffffffffffffffffffffffffffffffffffff16636deebae36040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156103e557600080fd5b505af11580156103f9573d6000803e3d6000fd5b5050505060008081548092919061040f90611cb2565b9190505550509392505050565b81156104e85760008081548092919061043490611937565b919050555060008873ffffffffffffffffffffffffffffffffffffffff16600f60405161046090611d0c565b60006040518083038185875af1925050503d806000811461049d576040519150601f19603f3d011682016040523d82523d6000602084013e6104a2565b606091505b50509050806104e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104dd90611d7e565b60405180910390fd5b505b600061080373ffffffffffffffffffffffffffffffffffffffff16634fe1a8df8c8c8b8b8b8b8b6040518863ffffffff1660e01b815260040161053197969594939291906121f6565b6020604051808303816000875af1158015610550573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105749190612270565b9050806105b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ad9061230f565b60405180910390fd5b81156106825760008973ffffffffffffffffffffffffffffffffffffffff16600f6040516105e390611d0c565b60006040518083038185875af1925050503d8060008114610620576040519150601f19603f3d011682016040523d82523d6000602084013e610625565b606091505b5050905080610669576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066090611d7e565b60405180910390fd5b60008081548092919061067b90611937565b9190505550505b5050505050505050505050565b606080606061080373ffffffffffffffffffffffffffffffffffffffff166327e235e3856040518263ffffffff1660e01b81526004016106cf919061232f565b600060405180830381865afa1580156106ec573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610715919061234a565b9250925092509193909250565b60008081548092919061073490611937565b9190505550600061080373ffffffffffffffffffffffffffffffffffffffff16634fe1a8df898989898989896040518863ffffffff1660e01b815260040161078297969594939291906123f1565b6020604051808303816000875af11580156107a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c59190612270565b905080610807576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fe9061230f565b60405180910390fd5b60008081548092919061081990611cb2565b91905055505050505050505050565b600061080373ffffffffffffffffffffffffffffffffffffffff16635a211064836040518263ffffffff1660e01b8152600401610865919061232f565b6020604051808303816000875af1158015610884573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a89190612270565b9050806108ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e1906124c8565b60405180910390fd5b5050565b60005481565b60008790508073ffffffffffffffffffffffffffffffffffffffff16634f2be91f6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561094157600080fd5b505af1158015610955573d6000803e3d6000fd5b5050505060008081548092919061096b90611937565b9190505550600061080373ffffffffffffffffffffffffffffffffffffffff16634fe1a8df8a8a8a8a8a8a8a6040518863ffffffff1660e01b81526004016109b997969594939291906123f1565b6020604051808303816000875af11580156109d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109fc9190612270565b905080610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a359061230f565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16636deebae36040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610a8657600080fd5b505af1158015610a9a573d6000803e3d6000fd5b50505050600080815480929190610ab090611cb2565b9190505550505050505050505050565b6060600080815480929190610ad490611937565b919050555061080373ffffffffffffffffffffffffffffffffffffffff166372e7c9ab8585856040518463ffffffff1660e01b8152600401610b189392919061198e565b6000604051808303816000875af1158015610b37573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610b609190611c69565b9050600080815480929190610b7490611cb2565b91905055509392505050565b600061080373ffffffffffffffffffffffffffffffffffffffff1663cdb50175333060006040518463ffffffff1660e01b8152600401610bc2939291906124f7565b6020604051808303816000875af1158015610be1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c059190612270565b905080610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e906125c6565b60405180910390fd5b50565b6060600080815480929190610c5e90611937565b919050555061080373ffffffffffffffffffffffffffffffffffffffff166372e7c9ab8686866040518463ffffffff1660e01b8152600401610ca29392919061198e565b6000604051808303816000875af1158015610cc1573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610cea9190611c69565b90508115610d34576000610d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2a90612632565b60405180910390fd5b5b600080815480929190610d4690611cb2565b91905055506000610d8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8390612632565b60405180910390fd5b949350505050565b600061080373ffffffffffffffffffffffffffffffffffffffff16639cfef1298585856040518463ffffffff1660e01b8152600401610dd59392919061198e565b6020604051808303816000875af1158015610df4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e189190612270565b905080610e5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e51906126c4565b60405180910390fd5b50505050565b600061080373ffffffffffffffffffffffffffffffffffffffff1663cdb501758585856040518463ffffffff1660e01b8152600401610ea1939291906124f7565b6020604051808303816000875af1158015610ec0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee49190612270565b905080610f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1d9061230f565b60405180910390fd5b50505050565b6060821561102e57600080815480929190610f4690611937565b91905055503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161461102d5760008473ffffffffffffffffffffffffffffffffffffffff16600f604051610fa590611d0c565b60006040518083038185875af1925050503d8060008114610fe2576040519150601f19603f3d011682016040523d82523d6000602084013e610fe7565b606091505b505090508061102b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102290612756565b60405180910390fd5b505b5b61080373ffffffffffffffffffffffffffffffffffffffff166372e7c9ab8888886040518463ffffffff1660e01b815260040161106d9392919061198e565b6000604051808303816000875af115801561108c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110b59190611c69565b905081156111b7576000808154809291906110cf90611937565b91905055503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146111b65760008473ffffffffffffffffffffffffffffffffffffffff16600f60405161112e90611d0c565b60006040518083038185875af1925050503d806000811461116b576040519150601f19603f3d011682016040523d82523d6000602084013e611170565b606091505b50509050806111b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ab90612756565b60405180910390fd5b505b5b9695505050505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611200826111d5565b9050919050565b611210816111f5565b811461121b57600080fd5b50565b60008135905061122d81611207565b92915050565b60008060006060848603121561124c5761124b6111cb565b5b600061125a8682870161121e565b935050602061126b8682870161121e565b925050604061127c8682870161121e565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b838110156112ec5780820151818401526020810190506112d1565b60008484015250505050565b6000601f19601f8301169050919050565b6000611314826112b2565b61131e81856112bd565b935061132e8185602086016112ce565b611337816112f8565b840191505092915050565b6000819050919050565b61135581611342565b82525050565b600060408301600083015184820360008601526113788282611309565b915050602083015161138d602086018261134c565b508091505092915050565b60006113a4838361135b565b905092915050565b6000602082019050919050565b60006113c482611286565b6113ce8185611291565b9350836020820285016113e0856112a2565b8060005b8581101561141c57848403895281516113fd8582611398565b9450611408836113ac565b925060208a019950506001810190506113e4565b50829750879550505050505092915050565b6000602082019050818103600083015261144881846113b9565b905092915050565b600061145b826111d5565b9050919050565b61146b81611450565b811461147657600080fd5b50565b60008135905061148881611462565b92915050565b600067ffffffffffffffff82169050919050565b6114ab8161148e565b81146114b657600080fd5b50565b6000813590506114c8816114a2565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126114f3576114f26114ce565b5b8235905067ffffffffffffffff8111156115105761150f6114d3565b5b60208301915083602082028301111561152c5761152b6114d8565b5b9250929050565b60008115159050919050565b61154881611533565b811461155357600080fd5b50565b6000813590506115658161153f565b92915050565b6000806000806000806000806000806101008b8d03121561158f5761158e6111cb565b5b600061159d8d828e01611479565b9a505060206115ae8d828e0161121e565b99505060406115bf8d828e01611479565b98505060606115d08d828e016114b9565b97505060808b013567ffffffffffffffff8111156115f1576115f06111d0565b5b6115fd8d828e016114dd565b965096505060a08b013567ffffffffffffffff8111156116205761161f6111d0565b5b61162c8d828e016114dd565b945094505060c061163f8d828e01611556565b92505060e06116508d828e01611556565b9150509295989b9194979a5092959850565b600060208284031215611678576116776111cb565b5b60006116868482850161121e565b91505092915050565b600060608201905081810360008301526116a981866113b9565b905081810360208301526116bd81856113b9565b905081810360408301526116d181846113b9565b9050949350505050565b600080600080600080600060a0888a0312156116fa576116f96111cb565b5b60006117088a828b0161121e565b97505060206117198a828b0161121e565b965050604061172a8a828b016114b9565b955050606088013567ffffffffffffffff81111561174b5761174a6111d0565b5b6117578a828b016114dd565b9450945050608088013567ffffffffffffffff81111561177a576117796111d0565b5b6117868a828b016114dd565b925092505092959891949750929550565b6117a081611342565b82525050565b60006020820190506117bb6000830184611797565b92915050565b600080600080608085870312156117db576117da6111cb565b5b60006117e98782880161121e565b94505060206117fa8782880161121e565b935050604061180b8782880161121e565b925050606061181c87828801611556565b91505092959194509250565b600080600060608486031215611841576118406111cb565b5b600061184f8682870161121e565b93505060206118608682870161121e565b925050604061187186828701611556565b9150509250925092565b60008060008060008060c08789031215611898576118976111cb565b5b60006118a689828a0161121e565b96505060206118b789828a0161121e565b95505060406118c889828a0161121e565b94505060606118d989828a01611479565b93505060806118ea89828a01611556565b92505060a06118fb89828a01611556565b9150509295509295509295565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061194282611342565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361197457611973611908565b5b600182019050919050565b611988816111f5565b82525050565b60006060820190506119a3600083018661197f565b6119b0602083018561197f565b6119bd604083018461197f565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6119fd826112f8565b810181811067ffffffffffffffff82111715611a1c57611a1b6119c5565b5b80604052505050565b6000611a2f6111c1565b9050611a3b82826119f4565b919050565b600067ffffffffffffffff821115611a5b57611a5a6119c5565b5b602082029050602081019050919050565b600080fd5b600080fd5b600080fd5b600067ffffffffffffffff821115611a9657611a956119c5565b5b611a9f826112f8565b9050602081019050919050565b6000611abf611aba84611a7b565b611a25565b905082815260208101848484011115611adb57611ada611a76565b5b611ae68482856112ce565b509392505050565b600082601f830112611b0357611b026114ce565b5b8151611b13848260208601611aac565b91505092915050565b611b2581611342565b8114611b3057600080fd5b50565b600081519050611b4281611b1c565b92915050565b600060408284031215611b5e57611b5d611a6c565b5b611b686040611a25565b9050600082015167ffffffffffffffff811115611b8857611b87611a71565b5b611b9484828501611aee565b6000830152506020611ba884828501611b33565b60208301525092915050565b6000611bc7611bc284611a40565b611a25565b90508083825260208201905060208402830185811115611bea57611be96114d8565b5b835b81811015611c3157805167ffffffffffffffff811115611c0f57611c0e6114ce565b5b808601611c1c8982611b48565b85526020850194505050602081019050611bec565b5050509392505050565b600082601f830112611c5057611c4f6114ce565b5b8151611c60848260208601611bb4565b91505092915050565b600060208284031215611c7f57611c7e6111cb565b5b600082015167ffffffffffffffff811115611c9d57611c9c6111d0565b5b611ca984828501611c3b565b91505092915050565b6000611cbd82611342565b915060008203611cd057611ccf611908565b5b600182039050919050565b600081905092915050565b50565b6000611cf6600083611cdb565b9150611d0182611ce6565b600082019050919050565b6000611d1782611ce9565b9150819050919050565b600082825260208201905092915050565b7f4661696c656420746f2073656e6420457468657220746f2066756e6465720000600082015250565b6000611d68601e83611d21565b9150611d7382611d32565b602082019050919050565b60006020820190508181036000830152611d9781611d5b565b9050919050565b6000819050919050565b6000611dc3611dbe611db9846111d5565b611d9e565b6111d5565b9050919050565b6000611dd582611da8565b9050919050565b6000611de782611dca565b9050919050565b611df781611ddc565b82525050565b611e068161148e565b82525050565b600082825260208201905092915050565b6000819050919050565b60008160070b9050919050565b611e3d81611e27565b8114611e4857600080fd5b50565b600081359050611e5a81611e34565b92915050565b6000611e6f6020840184611e4b565b905092915050565b611e8081611e27565b82525050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112611eb257611eb1611e90565b5b83810192508235915060208301925067ffffffffffffffff821115611eda57611ed9611e86565b5b602082023603831315611ef057611eef611e8b565b5b509250929050565b600082825260208201905092915050565b6000819050919050565b60008083356001602003843603038112611f3057611f2f611e90565b5b83810192508235915060208301925067ffffffffffffffff821115611f5857611f57611e86565b5b600182023603831315611f6e57611f6d611e8b565b5b509250929050565b82818337600083830152505050565b6000611f9183856112bd565b9350611f9e838584611f76565b611fa7836112f8565b840190509392505050565b600081359050611fc181611b1c565b92915050565b6000611fd66020840184611fb2565b905092915050565b600060408301611ff16000840184611f13565b8583036000870152612004838284611f85565b925050506120156020840184611fc7565b612022602086018261134c565b508091505092915050565b60006120398383611fde565b905092915050565b60008235600160400383360303811261205d5761205c611e90565b5b82810191505092915050565b6000602082019050919050565b60006120828385611ef8565b93508360208402850161209484611f09565b8060005b878110156120d85784840389526120af8284612041565b6120b9858261202d565b94506120c483612069565b925060208a01995050600181019050612098565b50829750879450505050509392505050565b6000604083016120fd6000840184611e60565b61210a6000860182611e77565b506121186020840184611e95565b858303602087015261212b838284612076565b925050508091505092915050565b600061214583836120ea565b905092915050565b60008235600160400383360303811261216957612168611e90565b5b82810191505092915050565b6000602082019050919050565b600061218e8385611e0c565b9350836020840285016121a084611e1d565b8060005b878110156121e45784840389526121bb828461214d565b6121c58582612139565b94506121d083612175565b925060208a019950506001810190506121a4565b50829750879450505050509392505050565b600060a08201905061220b600083018a611dee565b612218602083018961197f565b6122256040830188611dfd565b8181036060830152612238818688612182565b9050818103608083015261224d818486612182565b905098975050505050505050565b60008151905061226a8161153f565b92915050565b600060208284031215612286576122856111cb565b5b60006122948482850161225b565b91505092915050565b7f56657374696e6743616c6c65723a2063726561746520636c61776261636b207660008201527f657374696e67206163636f756e74206661696c65640000000000000000000000602082015250565b60006122f9603583611d21565b91506123048261229d565b604082019050919050565b60006020820190508181036000830152612328816122ec565b9050919050565b6000602082019050612344600083018461197f565b92915050565b600080600060608486031215612363576123626111cb565b5b600084015167ffffffffffffffff811115612381576123806111d0565b5b61238d86828701611c3b565b935050602084015167ffffffffffffffff8111156123ae576123ad6111d0565b5b6123ba86828701611c3b565b925050604084015167ffffffffffffffff8111156123db576123da6111d0565b5b6123e786828701611c3b565b9150509250925092565b600060a082019050612406600083018a61197f565b612413602083018961197f565b6124206040830188611dfd565b8181036060830152612433818688612182565b90508181036080830152612448818486612182565b905098975050505050505050565b7f56657374696e6743616c6c65723a20636f6e7665727420746f20636c6177626160008201527f636b2076657374696e67206163636f756e74206661696c656400000000000000602082015250565b60006124b2603983611d21565b91506124bd82612456565b604082019050919050565b600060208201905081810360008301526124e1816124a5565b9050919050565b6124f181611533565b82525050565b600060608201905061250c600083018661197f565b612519602083018561197f565b61252660408301846124e8565b949350505050565b7f56657374696e6743616c6c65723a2063726561746520636c61776261636b207660008201527f657374696e67206163636f756e7420666f7220636f6e7472616374206661696c60208201527f6564000000000000000000000000000000000000000000000000000000000000604082015250565b60006125b0604283611d21565b91506125bb8261252e565b606082019050919050565b600060208201905081810360008301526125df816125a3565b9050919050565b7f7265766572742068657265000000000000000000000000000000000000000000600082015250565b600061261c600b83611d21565b9150612627826125e6565b602082019050919050565b6000602082019050818103600083015261264b8161260f565b9050919050565b7f56657374696e6743616c6c65723a207570646174652076657374696e6720667560008201527f6e646572206661696c6564000000000000000000000000000000000000000000602082015250565b60006126ae602b83611d21565b91506126b982612652565b604082019050919050565b600060208201905081810360008301526126dd816126a1565b9050919050565b7f4661696c656420746f2073656e6420457468657220746f2064656c656761746f60008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612740602183611d21565b915061274b826126e4565b604082019050919050565b6000602082019050818103600083015261276f81612733565b905091905056fea26469706673582212204b37cada22f7b3efcbd3cfcf736d8690d85031d8077a13c463c51a43f0b3f3cf64736f6c63430008130033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c80636c49d3031161008c5780638e292e40116100665780638e292e40146101fe5780639cfef1291461022e578063cdb501751461024a578063fc9c1a8714610266576100cf565b80636c49d303146101a857806372e7c9ab146101c45780637caef81b146101f4576100cf565b806303f4be50146100d45780631e9178bb1461010457806327e235e3146101205780634fe1a8df146101525780635a2110641461016e57806361bc221a1461018a575b600080fd5b6100ee60048036038101906100e99190611233565b610296565b6040516100fb919061142e565b60405180910390f35b61011e6004803603810190610119919061156b565b61041c565b005b61013a60048036038101906101359190611662565b61068f565b6040516101499392919061168f565b60405180910390f35b61016c600480360381019061016791906116db565b610722565b005b61018860048036038101906101839190611662565b610828565b005b6101926108ee565b60405161019f91906117a6565b60405180910390f35b6101c260048036038101906101bd91906116db565b6108f4565b005b6101de60048036038101906101d99190611233565b610ac0565b6040516101eb919061142e565b60405180910390f35b6101fc610b80565b005b610218600480360381019061021391906117c1565b610c4a565b604051610225919061142e565b60405180910390f35b61024860048036038101906102439190611233565b610d94565b005b610264600480360381019061025f9190611828565b610e60565b005b610280600480360381019061027b919061187b565b610f2c565b60405161028d919061142e565b60405180910390f35b606060008290508073ffffffffffffffffffffffffffffffffffffffff16634f2be91f6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156102e557600080fd5b505af11580156102f9573d6000803e3d6000fd5b5050505060008081548092919061030f90611937565b919050555061080373ffffffffffffffffffffffffffffffffffffffff166372e7c9ab8686866040518463ffffffff1660e01b81526004016103539392919061198e565b6000604051808303816000875af1158015610372573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061039b9190611c69565b91508073ffffffffffffffffffffffffffffffffffffffff16636deebae36040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156103e557600080fd5b505af11580156103f9573d6000803e3d6000fd5b5050505060008081548092919061040f90611cb2565b9190505550509392505050565b81156104e85760008081548092919061043490611937565b919050555060008873ffffffffffffffffffffffffffffffffffffffff16600f60405161046090611d0c565b60006040518083038185875af1925050503d806000811461049d576040519150601f19603f3d011682016040523d82523d6000602084013e6104a2565b606091505b50509050806104e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104dd90611d7e565b60405180910390fd5b505b600061080373ffffffffffffffffffffffffffffffffffffffff16634fe1a8df8c8c8b8b8b8b8b6040518863ffffffff1660e01b815260040161053197969594939291906121f6565b6020604051808303816000875af1158015610550573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105749190612270565b9050806105b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ad9061230f565b60405180910390fd5b81156106825760008973ffffffffffffffffffffffffffffffffffffffff16600f6040516105e390611d0c565b60006040518083038185875af1925050503d8060008114610620576040519150601f19603f3d011682016040523d82523d6000602084013e610625565b606091505b5050905080610669576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066090611d7e565b60405180910390fd5b60008081548092919061067b90611937565b9190505550505b5050505050505050505050565b606080606061080373ffffffffffffffffffffffffffffffffffffffff166327e235e3856040518263ffffffff1660e01b81526004016106cf919061232f565b600060405180830381865afa1580156106ec573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610715919061234a565b9250925092509193909250565b60008081548092919061073490611937565b9190505550600061080373ffffffffffffffffffffffffffffffffffffffff16634fe1a8df898989898989896040518863ffffffff1660e01b815260040161078297969594939291906123f1565b6020604051808303816000875af11580156107a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c59190612270565b905080610807576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fe9061230f565b60405180910390fd5b60008081548092919061081990611cb2565b91905055505050505050505050565b600061080373ffffffffffffffffffffffffffffffffffffffff16635a211064836040518263ffffffff1660e01b8152600401610865919061232f565b6020604051808303816000875af1158015610884573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a89190612270565b9050806108ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e1906124c8565b60405180910390fd5b5050565b60005481565b60008790508073ffffffffffffffffffffffffffffffffffffffff16634f2be91f6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561094157600080fd5b505af1158015610955573d6000803e3d6000fd5b5050505060008081548092919061096b90611937565b9190505550600061080373ffffffffffffffffffffffffffffffffffffffff16634fe1a8df8a8a8a8a8a8a8a6040518863ffffffff1660e01b81526004016109b997969594939291906123f1565b6020604051808303816000875af11580156109d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109fc9190612270565b905080610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a359061230f565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16636deebae36040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610a8657600080fd5b505af1158015610a9a573d6000803e3d6000fd5b50505050600080815480929190610ab090611cb2565b9190505550505050505050505050565b6060600080815480929190610ad490611937565b919050555061080373ffffffffffffffffffffffffffffffffffffffff166372e7c9ab8585856040518463ffffffff1660e01b8152600401610b189392919061198e565b6000604051808303816000875af1158015610b37573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610b609190611c69565b9050600080815480929190610b7490611cb2565b91905055509392505050565b600061080373ffffffffffffffffffffffffffffffffffffffff1663cdb50175333060006040518463ffffffff1660e01b8152600401610bc2939291906124f7565b6020604051808303816000875af1158015610be1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c059190612270565b905080610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e906125c6565b60405180910390fd5b50565b6060600080815480929190610c5e90611937565b919050555061080373ffffffffffffffffffffffffffffffffffffffff166372e7c9ab8686866040518463ffffffff1660e01b8152600401610ca29392919061198e565b6000604051808303816000875af1158015610cc1573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610cea9190611c69565b90508115610d34576000610d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2a90612632565b60405180910390fd5b5b600080815480929190610d4690611cb2565b91905055506000610d8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8390612632565b60405180910390fd5b949350505050565b600061080373ffffffffffffffffffffffffffffffffffffffff16639cfef1298585856040518463ffffffff1660e01b8152600401610dd59392919061198e565b6020604051808303816000875af1158015610df4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e189190612270565b905080610e5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e51906126c4565b60405180910390fd5b50505050565b600061080373ffffffffffffffffffffffffffffffffffffffff1663cdb501758585856040518463ffffffff1660e01b8152600401610ea1939291906124f7565b6020604051808303816000875af1158015610ec0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee49190612270565b905080610f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1d9061230f565b60405180910390fd5b50505050565b6060821561102e57600080815480929190610f4690611937565b91905055503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161461102d5760008473ffffffffffffffffffffffffffffffffffffffff16600f604051610fa590611d0c565b60006040518083038185875af1925050503d8060008114610fe2576040519150601f19603f3d011682016040523d82523d6000602084013e610fe7565b606091505b505090508061102b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102290612756565b60405180910390fd5b505b5b61080373ffffffffffffffffffffffffffffffffffffffff166372e7c9ab8888886040518463ffffffff1660e01b815260040161106d9392919061198e565b6000604051808303816000875af115801561108c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110b59190611c69565b905081156111b7576000808154809291906110cf90611937565b91905055503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146111b65760008473ffffffffffffffffffffffffffffffffffffffff16600f60405161112e90611d0c565b60006040518083038185875af1925050503d806000811461116b576040519150601f19603f3d011682016040523d82523d6000602084013e611170565b606091505b50509050806111b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ab90612756565b60405180910390fd5b505b5b9695505050505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611200826111d5565b9050919050565b611210816111f5565b811461121b57600080fd5b50565b60008135905061122d81611207565b92915050565b60008060006060848603121561124c5761124b6111cb565b5b600061125a8682870161121e565b935050602061126b8682870161121e565b925050604061127c8682870161121e565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b838110156112ec5780820151818401526020810190506112d1565b60008484015250505050565b6000601f19601f8301169050919050565b6000611314826112b2565b61131e81856112bd565b935061132e8185602086016112ce565b611337816112f8565b840191505092915050565b6000819050919050565b61135581611342565b82525050565b600060408301600083015184820360008601526113788282611309565b915050602083015161138d602086018261134c565b508091505092915050565b60006113a4838361135b565b905092915050565b6000602082019050919050565b60006113c482611286565b6113ce8185611291565b9350836020820285016113e0856112a2565b8060005b8581101561141c57848403895281516113fd8582611398565b9450611408836113ac565b925060208a019950506001810190506113e4565b50829750879550505050505092915050565b6000602082019050818103600083015261144881846113b9565b905092915050565b600061145b826111d5565b9050919050565b61146b81611450565b811461147657600080fd5b50565b60008135905061148881611462565b92915050565b600067ffffffffffffffff82169050919050565b6114ab8161148e565b81146114b657600080fd5b50565b6000813590506114c8816114a2565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126114f3576114f26114ce565b5b8235905067ffffffffffffffff8111156115105761150f6114d3565b5b60208301915083602082028301111561152c5761152b6114d8565b5b9250929050565b60008115159050919050565b61154881611533565b811461155357600080fd5b50565b6000813590506115658161153f565b92915050565b6000806000806000806000806000806101008b8d03121561158f5761158e6111cb565b5b600061159d8d828e01611479565b9a505060206115ae8d828e0161121e565b99505060406115bf8d828e01611479565b98505060606115d08d828e016114b9565b97505060808b013567ffffffffffffffff8111156115f1576115f06111d0565b5b6115fd8d828e016114dd565b965096505060a08b013567ffffffffffffffff8111156116205761161f6111d0565b5b61162c8d828e016114dd565b945094505060c061163f8d828e01611556565b92505060e06116508d828e01611556565b9150509295989b9194979a5092959850565b600060208284031215611678576116776111cb565b5b60006116868482850161121e565b91505092915050565b600060608201905081810360008301526116a981866113b9565b905081810360208301526116bd81856113b9565b905081810360408301526116d181846113b9565b9050949350505050565b600080600080600080600060a0888a0312156116fa576116f96111cb565b5b60006117088a828b0161121e565b97505060206117198a828b0161121e565b965050604061172a8a828b016114b9565b955050606088013567ffffffffffffffff81111561174b5761174a6111d0565b5b6117578a828b016114dd565b9450945050608088013567ffffffffffffffff81111561177a576117796111d0565b5b6117868a828b016114dd565b925092505092959891949750929550565b6117a081611342565b82525050565b60006020820190506117bb6000830184611797565b92915050565b600080600080608085870312156117db576117da6111cb565b5b60006117e98782880161121e565b94505060206117fa8782880161121e565b935050604061180b8782880161121e565b925050606061181c87828801611556565b91505092959194509250565b600080600060608486031215611841576118406111cb565b5b600061184f8682870161121e565b93505060206118608682870161121e565b925050604061187186828701611556565b9150509250925092565b60008060008060008060c08789031215611898576118976111cb565b5b60006118a689828a0161121e565b96505060206118b789828a0161121e565b95505060406118c889828a0161121e565b94505060606118d989828a01611479565b93505060806118ea89828a01611556565b92505060a06118fb89828a01611556565b9150509295509295509295565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061194282611342565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361197457611973611908565b5b600182019050919050565b611988816111f5565b82525050565b60006060820190506119a3600083018661197f565b6119b0602083018561197f565b6119bd604083018461197f565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6119fd826112f8565b810181811067ffffffffffffffff82111715611a1c57611a1b6119c5565b5b80604052505050565b6000611a2f6111c1565b9050611a3b82826119f4565b919050565b600067ffffffffffffffff821115611a5b57611a5a6119c5565b5b602082029050602081019050919050565b600080fd5b600080fd5b600080fd5b600067ffffffffffffffff821115611a9657611a956119c5565b5b611a9f826112f8565b9050602081019050919050565b6000611abf611aba84611a7b565b611a25565b905082815260208101848484011115611adb57611ada611a76565b5b611ae68482856112ce565b509392505050565b600082601f830112611b0357611b026114ce565b5b8151611b13848260208601611aac565b91505092915050565b611b2581611342565b8114611b3057600080fd5b50565b600081519050611b4281611b1c565b92915050565b600060408284031215611b5e57611b5d611a6c565b5b611b686040611a25565b9050600082015167ffffffffffffffff811115611b8857611b87611a71565b5b611b9484828501611aee565b6000830152506020611ba884828501611b33565b60208301525092915050565b6000611bc7611bc284611a40565b611a25565b90508083825260208201905060208402830185811115611bea57611be96114d8565b5b835b81811015611c3157805167ffffffffffffffff811115611c0f57611c0e6114ce565b5b808601611c1c8982611b48565b85526020850194505050602081019050611bec565b5050509392505050565b600082601f830112611c5057611c4f6114ce565b5b8151611c60848260208601611bb4565b91505092915050565b600060208284031215611c7f57611c7e6111cb565b5b600082015167ffffffffffffffff811115611c9d57611c9c6111d0565b5b611ca984828501611c3b565b91505092915050565b6000611cbd82611342565b915060008203611cd057611ccf611908565b5b600182039050919050565b600081905092915050565b50565b6000611cf6600083611cdb565b9150611d0182611ce6565b600082019050919050565b6000611d1782611ce9565b9150819050919050565b600082825260208201905092915050565b7f4661696c656420746f2073656e6420457468657220746f2066756e6465720000600082015250565b6000611d68601e83611d21565b9150611d7382611d32565b602082019050919050565b60006020820190508181036000830152611d9781611d5b565b9050919050565b6000819050919050565b6000611dc3611dbe611db9846111d5565b611d9e565b6111d5565b9050919050565b6000611dd582611da8565b9050919050565b6000611de782611dca565b9050919050565b611df781611ddc565b82525050565b611e068161148e565b82525050565b600082825260208201905092915050565b6000819050919050565b60008160070b9050919050565b611e3d81611e27565b8114611e4857600080fd5b50565b600081359050611e5a81611e34565b92915050565b6000611e6f6020840184611e4b565b905092915050565b611e8081611e27565b82525050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112611eb257611eb1611e90565b5b83810192508235915060208301925067ffffffffffffffff821115611eda57611ed9611e86565b5b602082023603831315611ef057611eef611e8b565b5b509250929050565b600082825260208201905092915050565b6000819050919050565b60008083356001602003843603038112611f3057611f2f611e90565b5b83810192508235915060208301925067ffffffffffffffff821115611f5857611f57611e86565b5b600182023603831315611f6e57611f6d611e8b565b5b509250929050565b82818337600083830152505050565b6000611f9183856112bd565b9350611f9e838584611f76565b611fa7836112f8565b840190509392505050565b600081359050611fc181611b1c565b92915050565b6000611fd66020840184611fb2565b905092915050565b600060408301611ff16000840184611f13565b8583036000870152612004838284611f85565b925050506120156020840184611fc7565b612022602086018261134c565b508091505092915050565b60006120398383611fde565b905092915050565b60008235600160400383360303811261205d5761205c611e90565b5b82810191505092915050565b6000602082019050919050565b60006120828385611ef8565b93508360208402850161209484611f09565b8060005b878110156120d85784840389526120af8284612041565b6120b9858261202d565b94506120c483612069565b925060208a01995050600181019050612098565b50829750879450505050509392505050565b6000604083016120fd6000840184611e60565b61210a6000860182611e77565b506121186020840184611e95565b858303602087015261212b838284612076565b925050508091505092915050565b600061214583836120ea565b905092915050565b60008235600160400383360303811261216957612168611e90565b5b82810191505092915050565b6000602082019050919050565b600061218e8385611e0c565b9350836020840285016121a084611e1d565b8060005b878110156121e45784840389526121bb828461214d565b6121c58582612139565b94506121d083612175565b925060208a019950506001810190506121a4565b50829750879450505050509392505050565b600060a08201905061220b600083018a611dee565b612218602083018961197f565b6122256040830188611dfd565b8181036060830152612238818688612182565b9050818103608083015261224d818486612182565b905098975050505050505050565b60008151905061226a8161153f565b92915050565b600060208284031215612286576122856111cb565b5b60006122948482850161225b565b91505092915050565b7f56657374696e6743616c6c65723a2063726561746520636c61776261636b207660008201527f657374696e67206163636f756e74206661696c65640000000000000000000000602082015250565b60006122f9603583611d21565b91506123048261229d565b604082019050919050565b60006020820190508181036000830152612328816122ec565b9050919050565b6000602082019050612344600083018461197f565b92915050565b600080600060608486031215612363576123626111cb565b5b600084015167ffffffffffffffff811115612381576123806111d0565b5b61238d86828701611c3b565b935050602084015167ffffffffffffffff8111156123ae576123ad6111d0565b5b6123ba86828701611c3b565b925050604084015167ffffffffffffffff8111156123db576123da6111d0565b5b6123e786828701611c3b565b9150509250925092565b600060a082019050612406600083018a61197f565b612413602083018961197f565b6124206040830188611dfd565b8181036060830152612433818688612182565b90508181036080830152612448818486612182565b905098975050505050505050565b7f56657374696e6743616c6c65723a20636f6e7665727420746f20636c6177626160008201527f636b2076657374696e67206163636f756e74206661696c656400000000000000602082015250565b60006124b2603983611d21565b91506124bd82612456565b604082019050919050565b600060208201905081810360008301526124e1816124a5565b9050919050565b6124f181611533565b82525050565b600060608201905061250c600083018661197f565b612519602083018561197f565b61252660408301846124e8565b949350505050565b7f56657374696e6743616c6c65723a2063726561746520636c61776261636b207660008201527f657374696e67206163636f756e7420666f7220636f6e7472616374206661696c60208201527f6564000000000000000000000000000000000000000000000000000000000000604082015250565b60006125b0604283611d21565b91506125bb8261252e565b606082019050919050565b600060208201905081810360008301526125df816125a3565b9050919050565b7f7265766572742068657265000000000000000000000000000000000000000000600082015250565b600061261c600b83611d21565b9150612627826125e6565b602082019050919050565b6000602082019050818103600083015261264b8161260f565b9050919050565b7f56657374696e6743616c6c65723a207570646174652076657374696e6720667560008201527f6e646572206661696c6564000000000000000000000000000000000000000000602082015250565b60006126ae602b83611d21565b91506126b982612652565b604082019050919050565b600060208201905081810360008301526126dd816126a1565b9050919050565b7f4661696c656420746f2073656e6420457468657220746f2064656c656761746f60008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612740602183611d21565b915061274b826126e4565b604082019050919050565b6000602082019050818103600083015261276f81612733565b905091905056fea26469706673582212204b37cada22f7b3efcbd3cfcf736d8690d85031d8077a13c463c51a43f0b3f3cf64736f6c63430008130033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/precompiles/vesting/testdata/VestingCaller.sol b/precompiles/vesting/testdata/VestingCaller.sol index cb0ccc6b46..f30a6626df 100644 --- a/precompiles/vesting/testdata/VestingCaller.sol +++ b/precompiles/vesting/testdata/VestingCaller.sol @@ -3,12 +3,15 @@ pragma solidity ^0.8.17; import "../../common/Types.sol"; import "../VestingI.sol" as vesting; +import "../../testutil/contracts/ICounter.sol"; /// @title VestingCaller /// @author Evmos Core Team /// @dev This contract is used to test external contract calls to the vesting precompile. contract VestingCaller { - + /// counter is used to test the state persistence bug, when EVM and Cosmos state were both + /// changed in the same function. + uint256 public counter; /// @dev Defines a method to test creating a new clawback vesting account. /// @param funder The address of the account that will fund the vesting account. /// @param to The address of the account that will receive the vesting account. @@ -23,7 +26,10 @@ contract VestingCaller { to, enableGovClawback ); - require(success, "VestingCaller: create clawback vesting account failed"); + require( + success, + "VestingCaller: create clawback vesting account failed" + ); } /// @dev Defines a method to test funding a vesting account @@ -39,6 +45,49 @@ contract VestingCaller { vesting.Period[] calldata lockupPeriods, vesting.Period[] calldata vestingPeriods ) public { + counter++; + bool success = vesting.VESTING_CONTRACT.fundVestingAccount( + funder, + to, + startTime, + lockupPeriods, + vestingPeriods + ); + require( + success, + "VestingCaller: create clawback vesting account failed" + ); + counter--; + } + + /// @dev Defines a method to test funding a vesting account. + /// If specified, it sends 15 aevmos to the funder before and/or after + /// the precompile call + /// @param funder The address of the account that will fund the vesting account. + /// @param to The address of the account that will receive the vesting account. + /// @param _transferTo The address to send some funds to. + /// @param startTime The time at which the vesting account will start. + /// @param lockupPeriods The lockup periods of the vesting account. + /// @param vestingPeriods The vesting periods of the vesting account. + /// @param transferBefore A boolean to specify if the contract should transfer + /// funds to the funder before the precompile call. + /// @param transferAfter A boolean to specify if the contract should transfer + /// funds to the funder after the precompile call. + function fundVestingAccountAndTransfer( + address payable funder, + address to, + address payable _transferTo, + uint64 startTime, + vesting.Period[] calldata lockupPeriods, + vesting.Period[] calldata vestingPeriods, + bool transferBefore, + bool transferAfter + ) public { + if (transferBefore) { + counter++; + (bool sent, ) = _transferTo.call{value: 15}(""); + require(sent, "Failed to send Ether to funder"); + } bool success = vesting.VESTING_CONTRACT.fundVestingAccount( funder, to, @@ -46,7 +95,46 @@ contract VestingCaller { lockupPeriods, vestingPeriods ); - require(success, "VestingCaller: create clawback vesting account failed"); + require( + success, + "VestingCaller: create clawback vesting account failed" + ); + if (transferAfter) { + (bool sent, ) = _transferTo.call{value: 15}(""); + require(sent, "Failed to send Ether to funder"); + counter++; + } + } + + /// @dev Defines a method to test funding a vesting account + /// @param funder The address of the Counter contract that will fund the vesting account. + /// @param to The address of the account that will receive the vesting account. + /// @param startTime The time at which the vesting account will start. + /// @param lockupPeriods The lockup periods of the vesting account. + /// @param vestingPeriods The vesting periods of the vesting account. + function fundVestingAccountWithCounterContract( + address funder, + address to, + uint64 startTime, + vesting.Period[] calldata lockupPeriods, + vesting.Period[] calldata vestingPeriods + ) public { + ICounter counterContract = ICounter(funder); + counterContract.add(); + counter++; + bool success = vesting.VESTING_CONTRACT.fundVestingAccount( + funder, + to, + startTime, + lockupPeriods, + vestingPeriods + ); + require( + success, + "VestingCaller: create clawback vesting account failed" + ); + counterContract.subtract(); + counter--; } /// @dev Defines a method to test clawing back coins from a vesting account. @@ -59,7 +147,86 @@ contract VestingCaller { address account, address dest ) public returns (Coin[] memory coins) { - return vesting.VESTING_CONTRACT.clawback(funder, account, dest); + counter++; + coins = vesting.VESTING_CONTRACT.clawback(funder, account, dest); + counter--; + return coins; + } + + /// @dev Defines a method to test clawing back coins from a vesting account. + /// @param funder The address of the account that funded the vesting account. + /// @param account The address of the vesting account. + /// @param dest The address of the account that will receive the clawed back coins. + /// @param _transferTo The address to send some funds to. + /// @param _before Boolean to specify if funds should be transferred to _transferTo before the precompile call + /// @param _after Boolean to specify if funds should be transferred to _transferTo after the precompile call + /// @return coins The coins that were clawed back from the vesting account. + function clawbackWithTransfer( + address funder, + address account, + address dest, + address payable _transferTo, + bool _before, + bool _after + ) public returns (Coin[] memory coins) { + if (_before) { + counter++; + if (dest != address(this)) { + (bool sent, ) = _transferTo.call{value: 15}(""); + require(sent, "Failed to send Ether to delegator"); + } + } + coins = vesting.VESTING_CONTRACT.clawback(funder, account, dest); + if (_after) { + counter++; + if (dest != address(this)) { + (bool sent, ) = _transferTo.call{value: 15}(""); + require(sent, "Failed to send Ether to delegator"); + } + } + return coins; + } + + /// @dev Defines a method to test clawing back coins from a vesting account. + /// It is used for testing the state revert. + /// @param funder The address of the account that funded the vesting account. + /// @param account The address of the vesting account. + /// @param dest The address of the account that will receive the clawed back coins. + /// @param before Boolean to specify if should revert before counter change. + /// @return coins The coins that were clawed back from the vesting account. + function clawbackWithRevert( + address funder, + address account, + address dest, + bool before + ) public returns (Coin[] memory coins) { + counter++; + coins = vesting.VESTING_CONTRACT.clawback(funder, account, dest); + if (before) { + require(false, "revert here"); + } + counter--; + require(false, "revert here"); + return coins; + } + + /// @dev Defines a method to test clawing back coins from a vesting account. + /// @param funder The address of the account that funded the vesting account. + /// @param account The address of the vesting account. + /// @param dest The address of the Counter smart contract that will receive the clawed back coins. + /// @return coins The coins that were clawed back from the vesting account. + function clawbackWithCounterCall( + address funder, + address account, + address dest + ) public returns (Coin[] memory coins) { + ICounter counterContract = ICounter(dest); + counterContract.add(); + counter++; + coins = vesting.VESTING_CONTRACT.clawback(funder, account, dest); + counterContract.subtract(); + counter--; + return coins; } /// @dev Defines a method to test updating the funder of a vesting account. @@ -71,32 +238,52 @@ contract VestingCaller { address newFunder, address vestingAddr ) public { - bool success = vesting.VESTING_CONTRACT.updateVestingFunder(funder, newFunder, vestingAddr); + bool success = vesting.VESTING_CONTRACT.updateVestingFunder( + funder, + newFunder, + vestingAddr + ); require(success, "VestingCaller: update vesting funder failed"); } /// @dev Defines a method to test converting a vesting account to a clawback vesting account. /// @param vestingAddr The address of the vesting account. - function convertVestingAccount( - address vestingAddr - ) public { - bool success = vesting.VESTING_CONTRACT.convertVestingAccount(vestingAddr); - require(success, "VestingCaller: convert to clawback vesting account failed"); + function convertVestingAccount(address vestingAddr) public { + bool success = vesting.VESTING_CONTRACT.convertVestingAccount( + vestingAddr + ); + require( + success, + "VestingCaller: convert to clawback vesting account failed" + ); } /// @dev Converts a smart contract address to a vesting account on top of it being a smart contract function createClawbackVestingAccountForContract() public { - bool success = vesting.VESTING_CONTRACT.createClawbackVestingAccount(msg.sender, address(this), false); - require(success, "VestingCaller: create clawback vesting account for contract failed"); + bool success = vesting.VESTING_CONTRACT.createClawbackVestingAccount( + msg.sender, + address(this), + false + ); + require( + success, + "VestingCaller: create clawback vesting account for contract failed" + ); } /// @dev Defines a method to test getting the balances of a vesting account. /// @param vestingAddr The address of the vesting account. - function balances(address vestingAddr) public view returns ( - Coin[] memory locked, - Coin[] memory unvested, - Coin[] memory vested - ) { + function balances( + address vestingAddr + ) + public + view + returns ( + Coin[] memory locked, + Coin[] memory unvested, + Coin[] memory vested + ) + { return vesting.VESTING_CONTRACT.balances(vestingAddr); } } diff --git a/precompiles/vesting/tx.go b/precompiles/vesting/tx.go index f9284fe91a..dfc63541d4 100644 --- a/precompiles/vesting/tx.go +++ b/precompiles/vesting/tx.go @@ -6,10 +6,14 @@ import ( "fmt" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" + "github.com/evmos/evmos/v18/precompiles/authorization" + cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/utils" ) const ( @@ -27,7 +31,7 @@ const ( ) // CreateClawbackVestingAccount creates a new clawback vesting account -func (p Precompile) CreateClawbackVestingAccount( +func (p *Precompile) CreateClawbackVestingAccount( ctx sdk.Context, origin common.Address, stateDB vm.StateDB, @@ -39,6 +43,7 @@ func (p Precompile) CreateClawbackVestingAccount( return nil, err } + // Only EOA can be vesting accounts // Check if the origin matches the vesting address if origin != vestingAddr { return nil, fmt.Errorf(ErrDifferentFromOrigin, origin, vestingAddr) @@ -63,7 +68,7 @@ func (p Precompile) CreateClawbackVestingAccount( } // FundVestingAccount funds a vesting account by creating vesting schedules -func (p Precompile) FundVestingAccount( +func (p *Precompile) FundVestingAccount( ctx sdk.Context, contract *vm.Contract, origin common.Address, @@ -76,8 +81,12 @@ func (p Precompile) FundVestingAccount( return nil, err } - // if caller address is origin, the funder MUST match the origin - if contract.CallerAddress == origin && origin != funderAddr { + isContractCaller := contract.CallerAddress != origin + + // funder can only be the origin or the contract.Caller + isContractFunder := contract.CallerAddress == funderAddr && isContractCaller + + if !isContractFunder && origin != funderAddr { return nil, fmt.Errorf(ErrDifferentFromOrigin, origin, funderAddr) } @@ -90,11 +99,15 @@ func (p Precompile) FundVestingAccount( ), ) - if contract.CallerAddress != origin { - // check if authorization exists - _, _, err := authorization.CheckAuthzExists(ctx, p.AuthzKeeper, contract.CallerAddress, origin, FundVestingAccountMsgURL) + // in case the contract is the funder + // don't check for auth. + // The smart contract (funder) should handle who is authorized to make this call + if isContractCaller && !isContractFunder { + // if calling from a contract and the contract is not the funder (origin == funderAddr) + // check that an authorization exists + _, _, err := authorization.CheckAuthzExists(ctx, p.AuthzKeeper, contract.CallerAddress, funderAddr, FundVestingAccountMsgURL) if err != nil { - return nil, fmt.Errorf(authorization.ErrAuthzDoesNotExistOrExpired, contract.CallerAddress, origin) + return nil, fmt.Errorf(authorization.ErrAuthzDoesNotExistOrExpired, FundVestingAccountMsgURL, contract.CallerAddress) } } @@ -103,6 +116,21 @@ func (p Precompile) FundVestingAccount( return nil, err } + if isContractCaller { + vestingCoins := msg.VestingPeriods.TotalAmount() + lockedUpCoins := msg.LockupPeriods.TotalAmount() + if vestingCoins.IsZero() && lockedUpCoins.IsAllPositive() { + vestingCoins = lockedUpCoins + } + + // NOTE: This ensures that the changes in the bank keeper are correctly mirrored to the EVM stateDB. + amt := vestingCoins.AmountOf(utils.BaseDenom).BigInt() + p.SetBalanceChangeEntries( + cmn.NewBalanceChangeEntry(funderAddr, amt, cmn.Sub), + cmn.NewBalanceChangeEntry(vestingAddr, amt, cmn.Add), + ) + } + if err = p.EmitFundVestingAccountEvent(ctx, stateDB, msg, funderAddr, vestingAddr, lockupPeriods, vestingPeriods); err != nil { return nil, err } @@ -111,7 +139,7 @@ func (p Precompile) FundVestingAccount( } // Clawback clawbacks tokens from a clawback vesting account -func (p Precompile) Clawback( +func (p *Precompile) Clawback( ctx sdk.Context, contract *vm.Contract, origin common.Address, @@ -124,8 +152,13 @@ func (p Precompile) Clawback( return nil, err } + isContractCaller := contract.CallerAddress != origin + + // funder can only be the origin or the contract.Caller + isContractFunder := contract.CallerAddress == funderAddr && isContractCaller + // if caller address is origin, the funder MUST match the origin - if contract.CallerAddress == origin && origin != funderAddr { + if !isContractFunder && origin != funderAddr { return nil, fmt.Errorf(ErrDifferentFunderOrigin, origin, funderAddr) } @@ -138,11 +171,15 @@ func (p Precompile) Clawback( ), ) - if contract.CallerAddress != origin { - // check if authorization exists - _, _, err := authorization.CheckAuthzExists(ctx, p.AuthzKeeper, contract.CallerAddress, origin, ClawbackMsgURL) + // in case the contract is the funder + // don't check for auth. + // The smart contract (funder) should handle who is authorized to make this call + if isContractCaller && !isContractFunder { + // if calling from a contract and the contract is not the funder (origin == funderAddr) + // check that an authorization exists. + _, _, err := authorization.CheckAuthzExists(ctx, p.AuthzKeeper, contract.CallerAddress, funderAddr, ClawbackMsgURL) if err != nil { - return nil, fmt.Errorf(authorization.ErrAuthzDoesNotExistOrExpired, contract.CallerAddress, origin) + return nil, fmt.Errorf(authorization.ErrAuthzDoesNotExistOrExpired, ClawbackMsgURL, contract.CallerAddress) } } @@ -151,6 +188,16 @@ func (p Precompile) Clawback( return nil, err } + if isContractCaller { + // NOTE: This ensures that the changes in the bank keeper are correctly mirrored to the EVM stateDB when calling + // the precompile from another contract. + clawbackAmt := response.Coins.AmountOf(utils.BaseDenom).BigInt() + p.SetBalanceChangeEntries( + cmn.NewBalanceChangeEntry(accountAddr, clawbackAmt, cmn.Sub), + cmn.NewBalanceChangeEntry(destAddr, clawbackAmt, cmn.Add), + ) + } + if err = p.EmitClawbackEvent(ctx, stateDB, funderAddr, accountAddr, destAddr); err != nil { return nil, err } @@ -161,7 +208,7 @@ func (p Precompile) Clawback( } // UpdateVestingFunder updates the vesting funder of a clawback vesting account -func (p Precompile) UpdateVestingFunder( +func (p *Precompile) UpdateVestingFunder( ctx sdk.Context, contract *vm.Contract, origin common.Address, @@ -174,8 +221,11 @@ func (p Precompile) UpdateVestingFunder( return nil, err } + isContractCall := contract.CallerAddress != origin + isContractFunder := contract.CallerAddress == funderAddr && isContractCall + // only the funder can update the funder // if caller address is origin, the funder MUST match the origin - if contract.CallerAddress == origin && origin != funderAddr { + if !isContractFunder && origin != funderAddr { return nil, fmt.Errorf(ErrDifferentFunderOrigin, origin, funderAddr) } @@ -188,11 +238,15 @@ func (p Precompile) UpdateVestingFunder( ), ) - if contract.CallerAddress != origin { - // check if authorization exists - _, _, err := authorization.CheckAuthzExists(ctx, p.AuthzKeeper, contract.CallerAddress, origin, UpdateVestingFunderMsgURL) + // in case the contract is the funder + // don't check for auth. + // The smart contract (funder) should handle who is authorized to make this call + if isContractCall && !isContractFunder { + // if calling from a contract and the contract is not the funder (origin == funderAddr) + // check that an authorization exists + _, _, err := authorization.CheckAuthzExists(ctx, p.AuthzKeeper, contract.CallerAddress, funderAddr, UpdateVestingFunderMsgURL) if err != nil { - return nil, fmt.Errorf(authorization.ErrAuthzDoesNotExistOrExpired, contract.CallerAddress, origin) + return nil, fmt.Errorf(authorization.ErrAuthzDoesNotExistOrExpired, UpdateVestingFunderMsgURL, contract.CallerAddress) } } @@ -209,7 +263,7 @@ func (p Precompile) UpdateVestingFunder( } // ConvertVestingAccount converts a clawback vesting account to a base account once the vesting period is over. -func (p Precompile) ConvertVestingAccount( +func (p *Precompile) ConvertVestingAccount( ctx sdk.Context, stateDB vm.StateDB, method *abi.Method, diff --git a/precompiles/vesting/utils_test.go b/precompiles/vesting/utils_test.go index 0a9aaac7fc..d11958ae6c 100644 --- a/precompiles/vesting/utils_test.go +++ b/precompiles/vesting/utils_test.go @@ -18,6 +18,7 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" evmosapp "github.com/evmos/evmos/v18/app" @@ -236,8 +237,8 @@ func (s *PrecompileTestSuite) BuildCallArgs( func (s *PrecompileTestSuite) FundTestClawbackVestingAccount() { method := s.precompile.Methods[vesting.FundVestingAccountMethod] createArgs := []interface{}{s.address, toAddr, uint64(time.Now().Unix()), lockupPeriods, vestingPeriods} - //nolint msg, _, _, _, _, err := vesting.NewMsgFundVestingAccount(createArgs, &method) + s.Require().NoError(err) _, err = s.app.VestingKeeper.FundVestingAccount(s.ctx, msg) s.Require().NoError(err) vestingAcc, err := s.app.VestingKeeper.Balances(s.ctx, &vestingtypes.QueryBalancesRequest{Address: sdk.AccAddress(toAddr.Bytes()).String()}) @@ -249,8 +250,8 @@ func (s *PrecompileTestSuite) FundTestClawbackVestingAccount() { // CreateTestClawbackVestingAccount creates a vesting account that can clawback func (s *PrecompileTestSuite) CreateTestClawbackVestingAccount(funder, vestingAddr common.Address) { msgArgs := []interface{}{funder, vestingAddr, false} - //nolint msg, _, _, err := vesting.NewMsgCreateClawbackVestingAccount(msgArgs) + s.Require().NoError(err) err = evmosutil.FundAccount(s.ctx, s.app.BankKeeper, vestingAddr.Bytes(), sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, math.NewInt(100)))) s.Require().NoError(err) _, err = s.app.VestingKeeper.CreateClawbackVestingAccount(s.ctx, msg) @@ -312,3 +313,23 @@ func (s *PrecompileTestSuite) NextBlock() { s.ctx, err = evmosutil.CommitAndCreateNewCtx(s.ctx, s.app, time.Second, nil) Expect(err).To(BeNil(), "failed to commit block") } + +// mergeEventMaps is a helper function to merge events maps from different contracts. +// If duplicates events are present, map2 override map1 values. +func mergeEventMaps(map1, map2 map[string]abi.Event) map[string]abi.Event { + // Create a new map to hold the merged result + mergedMap := make(map[string]abi.Event) + + // Copy all key-value pairs from map1 to mergedMap + for k, v := range map1 { + mergedMap[k] = v + } + + // Copy all key-value pairs from map2 to mergedMap + // If there are duplicate keys, values from map2 will overwrite those from map1 + for k, v := range map2 { + mergedMap[k] = v + } + + return mergedMap +} From 24609c0322be5d67ae2e51f4f488a60d6062a378 Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Fri, 5 Jul 2024 12:46:44 -0300 Subject: [PATCH 318/345] chore: update CHANGELOG & fix linter (#2657) * add changelog entry * run make format * fix lint warnings * update known exceptions * fix lint warnings * fix lint warnings * fix lint warnings * update solidity test suite deps --------- Co-authored-by: GAtom22 --- CHANGELOG.md | 1 + precompiles/common/precompile.go | 6 +++--- precompiles/distribution/integration_test.go | 3 +-- precompiles/staking/integration_test.go | 2 +- precompiles/vesting/integration_test.go | 17 ++++++++--------- precompiles/vesting/utils_test.go | 2 +- scripts/changelog_checker/config.py | 15 ++++++++++++--- tests/solidity/suites/precompiles/package.json | 1 + tests/solidity/yarn.lock | 5 +++++ 9 files changed, 33 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a5fbefeac7..721684f38c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -62,6 +62,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (distribution-precompile) [#2643](https://github.com/evmos/evmos/pull/2643) Improve efficiency of reward claiming with distribution precompile. - (evm) [#2633](https://github.com/evmos/evmos/pull/2633) Remove `EthAccount` type and use `BaseAccount` instead. - (precompiles) [GHSA-68fc-7mhg-6f6c](https://github.com/evmos/evmos/commit/bb2d504eec9078d6eff6981fc0cb214e8a3ca496) Refactor precompiles to use journal entries. +- (vesting-precompile) [GHSA-q6hg-6m9x-5g9c](https://github.com/evmos/evmos/commit/0a620e176617a835ac697eea494afea09185dfaf) Update vesting precompile authorization checks. ### Bug Fixes diff --git a/precompiles/common/precompile.go b/precompiles/common/precompile.go index be8d853aed..a80da6790f 100644 --- a/precompiles/common/precompile.go +++ b/precompiles/common/precompile.go @@ -29,7 +29,7 @@ type Precompile struct { } // Operation is a type that defines if the precompile call -// produced an addition or substraction of an account's balance +// produced an addition or subtraction of an account's balance type Operation int8 const ( @@ -43,7 +43,7 @@ type balanceChangeEntry struct { Op Operation } -func NewBalanceChangeEntry(acc common.Address, amt *big.Int, op Operation) balanceChangeEntry { +func NewBalanceChangeEntry(acc common.Address, amt *big.Int, op Operation) balanceChangeEntry { //nolint:revive return balanceChangeEntry{acc, amt, op} } @@ -75,7 +75,7 @@ func (p Precompile) RunSetup( contract *vm.Contract, readOnly bool, isTransaction func(name string) bool, -) (ctx sdk.Context, stateDB *statedb.StateDB, s snapshot, method *abi.Method, gasConfig storetypes.Gas, args []interface{}, err error) { +) (ctx sdk.Context, stateDB *statedb.StateDB, s snapshot, method *abi.Method, gasConfig storetypes.Gas, args []interface{}, err error) { //nolint:revive stateDB, ok := evm.StateDB.(*statedb.StateDB) if !ok { return sdk.Context{}, nil, s, nil, uint64(0), nil, fmt.Errorf(ErrNotRunInEvm) diff --git a/precompiles/distribution/integration_test.go b/precompiles/distribution/integration_test.go index c95a2069d1..57b7d88186 100644 --- a/precompiles/distribution/integration_test.go +++ b/precompiles/distribution/integration_test.go @@ -639,7 +639,6 @@ var _ = Describe("Calling distribution precompile from another contract", func() // testCase is a struct used for cases of contracts calls that have some operation // performed before and/or after the precompile call type testCase struct { - delegator *common.Address withdrawer *common.Address before bool after bool @@ -1283,7 +1282,7 @@ var _ = Describe("Calling distribution precompile from another contract", func() valInitialBalance := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) - // get the pending comission to claim + // get the pending commission to claim valAccAddr := sdk.ValAddress(s.address.Bytes()) qr := distrkeeper.Querier{Keeper: s.app.DistrKeeper} qRes, err := qr.ValidatorCommission(s.ctx, &distrtypes.QueryValidatorCommissionRequest{ValidatorAddress: valAccAddr.String()}) diff --git a/precompiles/staking/integration_test.go b/precompiles/staking/integration_test.go index 12e4fee554..6e0f637155 100644 --- a/precompiles/staking/integration_test.go +++ b/precompiles/staking/integration_test.go @@ -2199,7 +2199,7 @@ var _ = Describe("Calling staking precompile via Solidity", func() { contractInitialBalance = s.app.BankKeeper.GetBalance(s.ctx, stkReverterAddr.Bytes(), s.bondDenom) }) - It("should revert the changes and NOT delegate - successfull tx", func() { + It("should revert the changes and NOT delegate - successful tx", func() { callArgs := contracts.CallArgs{ ContractAddr: stkReverterAddr, ContractABI: stakingReverterContract.ABI, diff --git a/precompiles/vesting/integration_test.go b/precompiles/vesting/integration_test.go index a998feb4e3..04b78f3c2f 100644 --- a/precompiles/vesting/integration_test.go +++ b/precompiles/vesting/integration_test.go @@ -231,7 +231,6 @@ var _ = Describe("Interacting with the vesting extension", func() { }) Context("to fund a clawback vesting account", func() { - for _, callType := range callTypes { callType := callType @@ -606,7 +605,7 @@ var _ = Describe("Interacting with the vesting extension", func() { ) }) - It(fmt.Sprintf("should fund the vesting account from a smart contract when defining only vesting (%s)", callType.name), func() { + It(fmt.Sprintf("should fund the vesting account from a smart contract when defining only vesting (%s)", callType.name), func() { //nolint:dupl if callType.directCall { Skip("this should only be run for smart contract calls") } @@ -679,7 +678,7 @@ var _ = Describe("Interacting with the vesting extension", func() { s.ExpectVestingAccount(toAddr, defaultPeriods, defaultPeriods) }) - It(fmt.Sprintf("should fund the vesting account from a smart contract when defining both lockup and vesting (%s)", callType.name), func() { + It(fmt.Sprintf("should fund the vesting account from a smart contract when defining both lockup and vesting (%s)", callType.name), func() { //nolint:dupl if callType.directCall { Skip("this should only be run for smart contract calls") } @@ -957,7 +956,7 @@ var _ = Describe("Interacting with the vesting extension", func() { }) Context("to claw back from a vesting account", func() { - var expClawbackAmt = math.NewInt(1000) + expClawbackAmt := math.NewInt(1000) BeforeEach(func() { s.CreateTestClawbackVestingAccount(s.address, toAddr) @@ -1168,7 +1167,7 @@ var _ = Describe("Interacting with the vesting extension", func() { balancePre := s.app.BankKeeper.GetBalance(s.ctx, toAddr.Bytes(), s.bondDenom) Expect(balancePre.Amount).To(Equal(math.NewInt(1100)), "expected different balance after setup") - // check the contract's (destination) intial balance. Should be 0 + // check the contract's (destination) initial balance. Should be 0 contractInitialBal := s.app.BankKeeper.GetBalance(s.ctx, contractAddr.Bytes(), s.bondDenom) Expect(contractInitialBal.Amount).To(Equal(sdk.ZeroInt())) @@ -1210,7 +1209,7 @@ var _ = Describe("Interacting with the vesting extension", func() { Expect(contractFinalBal.Amount).To(Equal(math.NewInt(1000)), "expected receiver to show different balance after clawback") }) - It(fmt.Sprintf("clawback with revert after precompile call but before changing contract state - should NOT claw back and revert all balances to initial values (%s)", callType.name), func() { + It(fmt.Sprintf("clawback with revert after precompile call but before changing contract state - should NOT claw back and revert all balances to initial values (%s)", callType.name), func() { //nolint:dupl if callType.directCall { Skip("this should only be run for smart contract calls") } @@ -1235,7 +1234,7 @@ var _ = Describe("Interacting with the vesting extension", func() { Expect(balanceReceiver.Amount).To(Equal(math.ZeroInt())) }) - It(fmt.Sprintf("clawback with revert after precompile after changing contract state - should NOT claw back and revert all balances to initial values (%s)", callType.name), func() { + It(fmt.Sprintf("clawback with revert after precompile after changing contract state - should NOT claw back and revert all balances to initial values (%s)", callType.name), func() { //nolint:dupl if callType.directCall { Skip("this should only be run for smart contract calls") } @@ -1270,7 +1269,7 @@ var _ = Describe("Interacting with the vesting extension", func() { balancePre := s.app.BankKeeper.GetBalance(s.ctx, toAddr.Bytes(), s.bondDenom) Expect(balancePre.Amount).To(Equal(math.NewInt(1100)), "expected different balance after setup") - // check the contract's (destination) intial balance. Should be 0 + // check the contract's (destination) initial balance. Should be 0 destContractInitialBal := s.app.BankKeeper.GetBalance(s.ctx, destContractAddr.Bytes(), s.bondDenom) Expect(destContractInitialBal.Amount).To(Equal(sdk.ZeroInt())) @@ -1324,7 +1323,7 @@ var _ = Describe("Interacting with the vesting extension", func() { balancePre := s.app.BankKeeper.GetBalance(s.ctx, toAddr.Bytes(), s.bondDenom) Expect(balancePre.Amount).To(Equal(math.NewInt(1100)), "expected different balance after setup") - // check the contract's (destination) intial balance. Should be 0 + // check the contract's (destination) initial balance. Should be 0 destContractInitialBal := s.app.BankKeeper.GetBalance(s.ctx, destContractAddr.Bytes(), s.bondDenom) Expect(destContractInitialBal.Amount).To(Equal(sdk.ZeroInt())) diff --git a/precompiles/vesting/utils_test.go b/precompiles/vesting/utils_test.go index d11958ae6c..5ea326478c 100644 --- a/precompiles/vesting/utils_test.go +++ b/precompiles/vesting/utils_test.go @@ -237,7 +237,7 @@ func (s *PrecompileTestSuite) BuildCallArgs( func (s *PrecompileTestSuite) FundTestClawbackVestingAccount() { method := s.precompile.Methods[vesting.FundVestingAccountMethod] createArgs := []interface{}{s.address, toAddr, uint64(time.Now().Unix()), lockupPeriods, vestingPeriods} - msg, _, _, _, _, err := vesting.NewMsgFundVestingAccount(createArgs, &method) + msg, _, _, _, _, err := vesting.NewMsgFundVestingAccount(createArgs, &method) //nolint:dogsled s.Require().NoError(err) _, err = s.app.VestingKeeper.FundVestingAccount(s.ctx, msg) s.Require().NoError(err) diff --git a/scripts/changelog_checker/config.py b/scripts/changelog_checker/config.py index c39f82a8f1..22125dbeed 100644 --- a/scripts/changelog_checker/config.py +++ b/scripts/changelog_checker/config.py @@ -127,19 +127,28 @@ def get_allowed_categories() -> List[str]: } # A list of pull requests that are allowed to be mentioned multiple times in the changelog. -# Usually, this only applies to bug fixes that were patched on two versions (e.g. v12.1.6 and v13.0.0). +# Usually, this only applies to bug fixes that were patched +# on two versions (e.g. v12.1.6 and v13.0.0). ALLOWED_DUPLICATES = [ 1370, 1635, ] -# A list of known exceptions to the formattiing. This usually applies to PRs that e.g. merged contents from +# A list of known exceptions to the formattiing. +# This usually applies to PRs that e.g. merged contents from # a security advisory. KNOWN_EXCEPTIONS = [ "- (vesting) Refactor vesting flow.", "- (vesting) Fix vesting bug.", - "- (vesting) [GHSA-2q3r-p2m3-898g](https://github.com/evmos/evmos/commit/39b750cdaf1d69158ab93da85bd43ae4a7da1456" + "- (vesting) [GHSA-2q3r-p2m3-898g]" + + "(https://github.com/evmos/evmos/commit/39b750cdaf1d69158ab93da85bd43ae4a7da1456" + ") Apply ClawbackVestingAccount Barberry patch & Bump SDK to v0.46.13", + "- (precompiles) [GHSA-68fc-7mhg-6f6c]" + + "(https://github.com/evmos/evmos/commit/bb2d504eec9078d6eff6981fc0cb214e8a3ca496)" + + " Refactor precompiles to use journal entries.", + "- (vesting-precompile) [GHSA-q6hg-6m9x-5g9c]" + + "(https://github.com/evmos/evmos/commit/0a620e176617a835ac697eea494afea09185dfaf)" + + " Update vesting precompile authorization checks.", ] # The legacy major version at which to stop the checking. diff --git a/tests/solidity/suites/precompiles/package.json b/tests/solidity/suites/precompiles/package.json index 4324180a8f..ce7309281d 100644 --- a/tests/solidity/suites/precompiles/package.json +++ b/tests/solidity/suites/precompiles/package.json @@ -16,6 +16,7 @@ "@nomicfoundation/hardhat-toolbox": "^3.0.0", "@nomicfoundation/hardhat-verify": "^1.1.1", "@openzeppelin/hardhat-upgrades": "^2.0.2", + "@openzeppelin/contracts": "^4.9.6", "@typechain/ethers-v6": "^0.4.3", "@typechain/hardhat": "^8.0.3", "@types/chai": "^4.3.5", diff --git a/tests/solidity/yarn.lock b/tests/solidity/yarn.lock index 22e6e81246..a5c04e98f5 100644 --- a/tests/solidity/yarn.lock +++ b/tests/solidity/yarn.lock @@ -1152,6 +1152,11 @@ "@nomicfoundation/solidity-analyzer-win32-ia32-msvc" "0.1.1" "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.1" +"@openzeppelin/contracts@^4.9.6": + version "4.9.6" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.9.6.tgz#2a880a24eb19b4f8b25adc2a5095f2aa27f39677" + integrity sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA== + "@openzeppelin/defender-base-client@^1.47.0": version "1.48.0" resolved "https://registry.yarnpkg.com/@openzeppelin/defender-base-client/-/defender-base-client-1.48.0.tgz#9103b1b036db0451b52d7899a277bf24db4c4b06" From 78b24cc473993505805ce8bd23fb3a44374f356a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Federico=20Kunze=20K=C3=BCllmer?= <31522760+fedekunze@users.noreply.github.com> Date: Mon, 8 Jul 2024 09:09:30 +0200 Subject: [PATCH 319/345] [Snyk] Security upgrade golang from 1.22.3-bullseye to 1.23rc1-bullseye (#2656) fix: tests/e2e/Dockerfile.repo to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-DEBIAN11-GNUTLS28-6159417 - https://snyk.io/vuln/SNYK-DEBIAN11-GNUTLS28-6159419 - https://snyk.io/vuln/SNYK-DEBIAN11-LIBSSH2-5861756 - https://snyk.io/vuln/SNYK-DEBIAN11-CURL-3320493 - https://snyk.io/vuln/SNYK-DEBIAN11-ZLIB-6008961 Co-authored-by: snyk-bot Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- tests/e2e/Dockerfile.repo | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/e2e/Dockerfile.repo b/tests/e2e/Dockerfile.repo index 144d54a94c..fb15db42e0 100644 --- a/tests/e2e/Dockerfile.repo +++ b/tests/e2e/Dockerfile.repo @@ -1,4 +1,4 @@ -FROM golang:1.22.3-bullseye AS build-env +FROM golang:1.23rc1-bullseye AS build-env # checkov:skip=CKV_DOCKER_3:No need to create a user, this is only used on tests ARG BRANCH_NAME @@ -13,7 +13,7 @@ RUN git checkout ${BRANCH_NAME} RUN make build -FROM golang:1.22.3-bullseye +FROM golang:1.23rc1-bullseye # checkov:skip=CKV_DOCKER_5:No problem if it is cached because targets specific version RUN apt-get update \ From 39a6638968f5f1a64c70423c9ee7464ef1e819d9 Mon Sep 17 00:00:00 2001 From: Guillermo Paoletti Date: Tue, 9 Jul 2024 17:54:39 +0200 Subject: [PATCH 320/345] feat(vm): move geth vm from fork to evmOS codebase (#2663) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * temp * run make format * fix unit tests * fix imports * add changelog entry * exclude x/evm/core from license checker * remove unnecessary rawdb * remove unused runtime folder * semgrep: skip iteration if map is empty * add new x/evm/folder to ignored path in golangci-lint * feat(evm): add custom EIPs to VM (#2629) * chore: add custom eips integration tests (#2661) * update custom eips + test * move eips to eips package * add eips tests * run make format * revert an error * add missing license to file * remove unused func * enable extra eip and refactor tests * add readme * Apply suggestions from code review Signed-off-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> * update doc and remove unused default eips * make markdown linter happy * fix lint --------- Signed-off-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> Co-authored-by: 0xstepit <0xstepit@users.noreply.github.com> Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> * chore: merge main (#2662) * chore: clean changelog (#2628) remove duplicate and fix style * build(deps): bump github.com/cosmos/ibc-go/v7 from 7.5.2-0.20240607065443-0f1cf8bf766b to 7.6.0 (#2631) * build(deps): bump github.com/cosmos/ibc-go/v7 Bumps [github.com/cosmos/ibc-go/v7](https://github.com/cosmos/ibc-go) from 7.5.2-0.20240607065443-0f1cf8bf766b to 7.6.0. - [Release notes](https://github.com/cosmos/ibc-go/releases) - [Changelog](https://github.com/cosmos/ibc-go/blob/v7.6.0/CHANGELOG.md) - [Commits](https://github.com/cosmos/ibc-go/commits/v7.6.0) --- updated-dependencies: - dependency-name: github.com/cosmos/ibc-go/v7 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * update gomod2nix.toml file * bump sdk and add chlog entry --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] Co-authored-by: tom * build(deps-dev): bump ws from 7.5.9 to 7.5.10 in /contracts in the npm_and_yarn group across 1 directory (#2634) build(deps-dev): bump ws Bumps the npm_and_yarn group with 1 update in the /contracts directory: [ws](https://github.com/websockets/ws). Updates `ws` from 7.5.9 to 7.5.10 - [Release notes](https://github.com/websockets/ws/releases) - [Commits](https://github.com/websockets/ws/compare/7.5.9...7.5.10) --- updated-dependencies: - dependency-name: ws dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * imp(tests): Add function to get ERC-20 balance to integration utils (#2635) * add get erc20 balance util * add changelog entry * add missing license * build(deps): bump bufbuild/buf-setup-action from 1.33.0 to 1.34.0 (#2637) Bumps [bufbuild/buf-setup-action](https://github.com/bufbuild/buf-setup-action) from 1.33.0 to 1.34.0. - [Release notes](https://github.com/bufbuild/buf-setup-action/releases) - [Commits](https://github.com/bufbuild/buf-setup-action/compare/v1.33.0...v1.34.0) --- updated-dependencies: - dependency-name: bufbuild/buf-setup-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): bump github.com/linxGnu/grocksdb from 1.9.1 to 1.9.2 (#2638) * build(deps): bump github.com/linxGnu/grocksdb from 1.9.1 to 1.9.2 Bumps [github.com/linxGnu/grocksdb](https://github.com/linxGnu/grocksdb) from 1.9.1 to 1.9.2. - [Release notes](https://github.com/linxGnu/grocksdb/releases) - [Commits](https://github.com/linxGnu/grocksdb/compare/v1.9.1...v1.9.2) --- updated-dependencies: - dependency-name: github.com/linxGnu/grocksdb dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * update gomod2nix.toml file * update rocksdb version --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: tom * fix(ci): Ignore Swagger docs in CheckOV linter (#2639) * ignore client folder in checkov CI * add changelog entry * add minor change in go file to trigger cla flow * Add: Support PebbleDB image (#2630) * add: config & workflow step for building pebble images * test: comment out GIT_DIFF condition in build workflow * Revert "test: comment out GIT_DIFF condition in build workflow" * test: force a workflow trigger to push test images * Revert "test: force a workflow trigger to push test images" * docs: update changelog * Update: lint * Revert: build.yml * Update CHANGELOG.md Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Signed-off-by: Amine <34750005+Aminechakr@users.noreply.github.com> --------- Signed-off-by: Amine <34750005+Aminechakr@users.noreply.github.com> Signed-off-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> * fix(tests): Bump Dockerfile dependency and fix make test-e2e target in Makefile (#2642) * fix dockerfile and makefile * fix e2e tests * add changelog entry * imp(evm): Remove EthAccount type and use BaseAccount instead (#2633) * remove use of EthAccount in repository * remove EthAccount implementation * add missing license * wip adding migration logic * fix migration * add tests for migration * run make format * Update x/evm/genesis.go Signed-off-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> * address review comments and add test for exporting EVM genesis * add iterator and corresponding test * use contract iterator for exporting EVM genesis state * address more review comments * remove unused method from interface definition * apply suggested renaming * address review comments * add changelog entry * add gitleaks allow directive to example contract storage * move changelog entry to breaking section * revert change in local node script --------- Signed-off-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Co-authored-by: MalteHerrmann * imp(dist): Improve efficiency of reward claiming with distribution precompile (#2643) * improve reward claim method * add changelog entry * address review comments --------- Signed-off-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> * build(deps): bump github.com/btcsuite/btcd from 0.24.0 to 0.24.2 (#2641) * build(deps): bump github.com/btcsuite/btcd from 0.24.0 to 0.24.2 Bumps [github.com/btcsuite/btcd](https://github.com/btcsuite/btcd) from 0.24.0 to 0.24.2. - [Release notes](https://github.com/btcsuite/btcd/releases) - [Changelog](https://github.com/btcsuite/btcd/blob/master/CHANGES) - [Commits](https://github.com/btcsuite/btcd/compare/v0.24.0...v0.24.2) --- updated-dependencies: - dependency-name: github.com/btcsuite/btcd dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * update gomod2nix.toml file --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> * imp(app): Split chain configuration template into EVM config and MemIAVL config (#2644) * separate EVM config template from full Evmos chain config template for use in other repos * add changelog entry * address review comments * imp(ante): Fix typos in ante package (#2647) * fix typos in ante package * address review comments * build(deps): bump github.com/cometbft/cometbft from 0.37.5 to 0.37.7 (#2646) * build(deps): bump the go_modules group with 2 updates Bumps the go_modules group with 2 updates: [github.com/cometbft/cometbft](https://github.com/cometbft/cometbft) and [github.com/hashicorp/go-getter](https://github.com/hashicorp/go-getter). Updates `github.com/cometbft/cometbft` from 0.37.5 to 0.38.8 - [Release notes](https://github.com/cometbft/cometbft/releases) - [Changelog](https://github.com/cometbft/cometbft/blob/v0.38.8/CHANGELOG.md) - [Commits](https://github.com/cometbft/cometbft/compare/v0.37.5...v0.38.8) Updates `github.com/hashicorp/go-getter` from 1.7.4 to 1.7.5 - [Release notes](https://github.com/hashicorp/go-getter/releases) - [Changelog](https://github.com/hashicorp/go-getter/blob/main/.goreleaser.yml) - [Commits](https://github.com/hashicorp/go-getter/compare/v1.7.4...v1.7.5) --- updated-dependencies: - dependency-name: github.com/cometbft/cometbft dependency-type: direct:production dependency-group: go_modules - dependency-name: github.com/hashicorp/go-getter dependency-type: indirect dependency-group: go_modules ... Signed-off-by: dependabot[bot] * update gomod2nix.toml file * update cometbft version bump --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] Co-authored-by: tom Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> * imp(ante): Decouple EVM decorator utilities from decorator struct (#2648) * decouple evm decorator utils from concrete implementation * add changelog entry * build(deps): bump github.com/cometbft/cometbft from 0.37.7 to 0.37.8 (#2649) * build(deps): bump github.com/cometbft/cometbft from 0.37.7 to 0.38.9 Bumps [github.com/cometbft/cometbft](https://github.com/cometbft/cometbft) from 0.37.7 to 0.38.9. - [Release notes](https://github.com/cometbft/cometbft/releases) - [Changelog](https://github.com/cometbft/cometbft/blob/v0.38.9/CHANGELOG.md) - [Commits](https://github.com/cometbft/cometbft/compare/v0.37.7...v0.38.9) --- updated-dependencies: - dependency-name: github.com/cometbft/cometbft dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * update gomod2nix.toml file * update bump version --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] Co-authored-by: tom * imp(scripts): Adjust contract compilation util to include abi.json files (#2650) * adjust script to include abi.json files too * rename vesting interface file to match interface name * adjust utils and precompile ABI loading for Hardhat setup * clean up after compiling contracts with all target * recompile abis * add changelog entry * run black formatter * address some more linters --------- Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> * build(deps): bump golang from 1.22.4-alpine3.20 to 1.22.5-alpine3.20 (#2654) Bumps golang from 1.22.4-alpine3.20 to 1.22.5-alpine3.20. --- updated-dependencies: - dependency-name: golang dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): bump google.golang.org/grpc from 1.64.0 to 1.65.0 (#2652) * build(deps): bump google.golang.org/grpc from 1.64.0 to 1.65.0 Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.64.0 to 1.65.0. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.64.0...v1.65.0) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * update gomod2nix.toml file --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> * Merge pull request from GHSA-68fc-7mhg-6f6c * fix(stk-precompile): update dirty state * add create validator tests cases * fix(distr-precompile): update dirty state * add additional condition in isContract * refactor test * add more functions to the DistrCaller.sol * fix(ics20-precompile) update dirty state * chore(tests): add more test cases for ics20 precompile * add multi-transfer tx test cases * chore(tests): add more test cases for distr precompile * Update precompiles/common/precompile.go Signed-off-by: Tom <54514587+GAtom22@users.noreply.github.com> * refactor getWithdrawerHexAddr func * chore(staking-precompile): update CreateValidator and EditValidator checks * chore(tests): update staking precompile tests * chore(distr-precompile): remove claimRewards method * make format * add back claimRewards func commented out * comment out claimRewards from distr precompile logic * add staking test with transfer to bonded tokens acc * chore(ibc-transfer): add escrow account to dirties * chore(test): add test cases for ics20 precompile and escrow addr * Update tests/nix_tests/test_ics20_precompile.py Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Signed-off-by: Tom <54514587+GAtom22@users.noreply.github.com> * remove hardcoded exp balance * fix(precompile): use cache ctx on stateDB * add journal entry for precompiles * keep only last writeFn * add MaxPrecompileCalls limit * refactor precompile calls logic * remove unnecessary code * changes based on review comments * add StakingReverter tests * add revert test case for distr precompile * refactor cache ctx on stateDB * refactor: move CommitWithCacheCtx to RunSetup * chore: add events to snapshot * update ICS20 tests * fix err msg * renamve var * add a func on precompile cmn for journal entry * rename var * add comment * update comment description * update expected gas in ibc transfer test * address review comments * update comt * tests(ics20): add helper func to setup contract * tests(ics20): add test for nested revert * address review comments * add distr precompile tests * refactor to remove UpdateDirties func * Update precompiles/distribution/tx.go Co-authored-by: Ramiro Carlucho Signed-off-by: Tom <54514587+GAtom22@users.noreply.github.com> * update vesting prec * refactor balance change entries setter func * add comments * update comment * fix sdk fork deps * comment claimRewards method and test * add smart contract balance check on test * remove transient storage logic * add edge test case with revert on storage change * revert changes to claimRewards * refactor var name * refactor claimRewards logic * refactor claimRewards logic * update cosmos-sdk fork with latest changes (no need for store keys deep copy) * change require with assert for invariant * update comment * update cosmos-sdk fork version * update commit function with latest changes merged from main * add changelog entry * update commit func * fix claimRewards comt --------- Signed-off-by: Tom <54514587+GAtom22@users.noreply.github.com> Signed-off-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: Ramiro Carlucho Co-authored-by: stepit * chore: update changelog (#2655) * Merge pull request from GHSA-q6hg-6m9x-5g9c * fix(precompile): add funder and dest check to update balance * add more test cases * restrict funder to be origin or contract caller * restrict dest address when calling from sc * add test case with funds transfer within precompile call * remove print * add check for dirty addresses * add UpdateDirties func * update dirties helper func * Update precompiles/vesting/utils_test.go Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Signed-off-by: Tom <54514587+GAtom22@users.noreply.github.com> * update comment description * changes based on review comments * refactor updateDirties * add test cases for updating funder balance before and after precompile call * add revert state test * update tx logic * update integration tests * refactor auth logic * update tests * add comt * fix: add funder and vest acc to dirties * add test cases for latest changes * address review comments * address review comments * address review comments * fix FlashLoan contract compilation * update logic * use pointer in precompile txs * remove unnecessary comment --------- Signed-off-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> * chore: update CHANGELOG & fix linter (#2657) * add changelog entry * run make format * fix lint warnings * update known exceptions * fix lint warnings * fix lint warnings * fix lint warnings * update solidity test suite deps --------- Co-authored-by: GAtom22 * [Snyk] Security upgrade golang from 1.22.3-bullseye to 1.23rc1-bullseye (#2656) fix: tests/e2e/Dockerfile.repo to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-DEBIAN11-GNUTLS28-6159417 - https://snyk.io/vuln/SNYK-DEBIAN11-GNUTLS28-6159419 - https://snyk.io/vuln/SNYK-DEBIAN11-LIBSSH2-5861756 - https://snyk.io/vuln/SNYK-DEBIAN11-CURL-3320493 - https://snyk.io/vuln/SNYK-DEBIAN11-ZLIB-6008961 Co-authored-by: snyk-bot Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> * update certificate --------- Signed-off-by: dependabot[bot] Signed-off-by: Amine <34750005+Aminechakr@users.noreply.github.com> Signed-off-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> Signed-off-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Signed-off-by: Tom <54514587+GAtom22@users.noreply.github.com> Signed-off-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] Co-authored-by: tom Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Co-authored-by: Amine <34750005+Aminechakr@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> Co-authored-by: MalteHerrmann Co-authored-by: Ramiro Carlucho Co-authored-by: GAtom22 Co-authored-by: snyk-bot * chore: merge main again * run make format * Update CHANGELOG.md Signed-off-by: Guillermo Paoletti * fix: remove import * chore: ignore linter on geth code --------- Signed-off-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> Signed-off-by: dependabot[bot] Signed-off-by: Amine <34750005+Aminechakr@users.noreply.github.com> Signed-off-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Signed-off-by: Tom <54514587+GAtom22@users.noreply.github.com> Signed-off-by: stepit <48993133+0xstepit@users.noreply.github.com> Signed-off-by: Guillermo Paoletti Co-authored-by: Freddy Caceres Co-authored-by: 0xstepit <0xstepit@users.noreply.github.com> Co-authored-by: stepit Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] Co-authored-by: tom Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Co-authored-by: Amine <34750005+Aminechakr@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: MalteHerrmann Co-authored-by: Ramiro Carlucho Co-authored-by: GAtom22 Co-authored-by: snyk-bot Co-authored-by: hanchon --- .golangci.yml | 18 +- .semgrepignore | 5 +- CHANGELOG.md | 1 + Dockerfile | 2 +- app/ante/evm/interfaces.go | 2 +- app/app.go | 6 +- app/config.go | 29 + app/eips/README.md | 258 ++++ app/eips/eips.go | 36 + app/eips/eips_test.go | 375 +++++ app/eips/testdata/Counter.json | 38 + app/eips/testdata/Counter.sol | 15 + app/eips/testdata/CounterFactory.json | 56 + app/eips/testdata/CounterFactory.sol | 25 + app/eips/testdata/contracts.go | 17 + precompiles/authorization/events.go | 2 +- precompiles/bank/bank.go | 2 +- precompiles/bank/query.go | 2 +- precompiles/bech32/bech32.go | 2 +- precompiles/bech32/bech32_test.go | 2 +- precompiles/common/events.go | 2 +- precompiles/common/precompile.go | 2 +- precompiles/distribution/distribution.go | 2 +- precompiles/distribution/distribution_test.go | 2 +- precompiles/distribution/events.go | 2 +- precompiles/distribution/events_test.go | 2 +- precompiles/distribution/integration_test.go | 2 +- precompiles/distribution/query.go | 2 +- precompiles/distribution/query_test.go | 2 +- precompiles/distribution/tx.go | 2 +- precompiles/distribution/tx_test.go | 2 +- precompiles/erc20/approve.go | 2 +- precompiles/erc20/approve_test.go | 2 +- precompiles/erc20/erc20.go | 2 +- precompiles/erc20/errors.go | 2 +- precompiles/erc20/events.go | 2 +- precompiles/erc20/query.go | 2 +- precompiles/erc20/query_test.go | 2 +- precompiles/erc20/tx.go | 2 +- precompiles/erc20/tx_test.go | 2 +- precompiles/ics20/approve.go | 2 +- precompiles/ics20/approve_common.go | 2 +- precompiles/ics20/events.go | 2 +- precompiles/ics20/events_test.go | 2 +- precompiles/ics20/ics20.go | 2 +- precompiles/ics20/integration_test.go | 2 +- precompiles/ics20/query.go | 2 +- precompiles/ics20/tx.go | 2 +- precompiles/ics20/tx_test.go | 2 +- precompiles/ics20/types.go | 2 +- precompiles/ics20/utils_test.go | 2 +- precompiles/p256/p256.go | 2 +- precompiles/p256/p256_test.go | 2 +- precompiles/staking/approve.go | 2 +- precompiles/staking/approve_test.go | 2 +- precompiles/staking/events.go | 2 +- precompiles/staking/events_test.go | 2 +- precompiles/staking/integration_test.go | 2 +- precompiles/staking/query.go | 2 +- precompiles/staking/query_test.go | 2 +- precompiles/staking/staking.go | 2 +- precompiles/staking/staking_test.go | 2 +- precompiles/staking/tx.go | 3 +- precompiles/staking/tx_test.go | 2 +- precompiles/testutil/testing.go | 2 +- precompiles/vesting/approve.go | 2 +- precompiles/vesting/events.go | 2 +- precompiles/vesting/tx.go | 3 +- precompiles/vesting/tx_test.go | 5 +- precompiles/vesting/vesting.go | 2 +- precompiles/werc20/werc20.go | 2 +- rpc/backend/call_tx.go | 2 +- scripts/license_checker/check_licenses.py | 1 + x/erc20/keeper/precompiles.go | 2 +- x/erc20/types/interfaces.go | 2 +- x/erc20/types/mocks/EVMKeeper.go | 2 +- x/evm/config/configurator.go | 71 + x/evm/config/configurator_test.go | 138 ++ x/evm/core/core/utils.go | 46 + x/evm/core/logger/access_list_tracer.go | 168 +++ x/evm/core/logger/logger.go | 448 ++++++ x/evm/core/logger/logger_json.go | 88 ++ x/evm/core/tracers/js/bigint.go | 20 + x/evm/core/tracers/js/goja.go | 962 ++++++++++++ .../internal/tracers/4byte_tracer_legacy.js | 86 ++ .../js/internal/tracers/bigram_tracer.js | 47 + .../js/internal/tracers/call_tracer_legacy.js | 252 ++++ .../js/internal/tracers/evmdis_tracer.js | 93 ++ .../js/internal/tracers/noop_tracer_legacy.js | 29 + .../js/internal/tracers/opcount_tracer.js | 32 + .../tracers/prestate_tracer_legacy.js | 115 ++ .../tracers/js/internal/tracers/tracers.go | 59 + .../js/internal/tracers/trigram_tracer.js | 49 + .../js/internal/tracers/unigram_tracer.js | 41 + x/evm/core/tracers/js/tracer_test.go | 306 ++++ x/evm/core/tracers/native/4byte.go | 153 ++ x/evm/core/tracers/native/call.go | 202 +++ x/evm/core/tracers/native/noop.go | 78 + x/evm/core/tracers/native/prestate.go | 180 +++ x/evm/core/tracers/native/revertreason.go | 108 ++ x/evm/core/tracers/native/tracer.go | 85 ++ x/evm/core/tracers/tracers.go | 52 + x/evm/core/vm/analysis.go | 118 ++ x/evm/core/vm/analysis_test.go | 110 ++ x/evm/core/vm/common.go | 82 + x/evm/core/vm/contract.go | 238 +++ x/evm/core/vm/contracts.go | 1313 +++++++++++++++++ x/evm/core/vm/contracts_test.go | 394 +++++ x/evm/core/vm/custom_eip.go | 74 + x/evm/core/vm/custom_eip_test.go | 98 ++ x/evm/core/vm/doc.go | 24 + x/evm/core/vm/eips.go | 200 +++ x/evm/core/vm/errors.go | 72 + x/evm/core/vm/evm.go | 550 +++++++ x/evm/core/vm/gas.go | 53 + x/evm/core/vm/gas_table.go | 441 ++++++ x/evm/core/vm/gas_table_test.go | 107 ++ x/evm/core/vm/instructions.go | 934 ++++++++++++ x/evm/core/vm/instructions_test.go | 716 +++++++++ x/evm/core/vm/interface.go | 100 ++ x/evm/core/vm/interpreter.go | 234 +++ x/evm/core/vm/interpreter_test.go | 76 + x/evm/core/vm/jump_table.go | 1106 ++++++++++++++ x/evm/core/vm/jump_table_test.go | 35 + x/evm/core/vm/logger.go | 44 + x/evm/core/vm/memory.go | 105 ++ x/evm/core/vm/memory_table.go | 114 ++ x/evm/core/vm/opcode_hooks.go | 47 + x/evm/core/vm/opcodes.go | 551 +++++++ x/evm/core/vm/operations_acl.go | 244 +++ x/evm/core/vm/stack.go | 146 ++ x/evm/core/vm/stack_table.go | 45 + .../core/vm/testdata/precompiles/blake2F.json | 37 + .../vm/testdata/precompiles/blsG1Add.json | 730 +++++++++ .../vm/testdata/precompiles/blsG1Mul.json | 730 +++++++++ .../testdata/precompiles/blsG1MultiExp.json | 723 +++++++++ .../vm/testdata/precompiles/blsG2Add.json | 730 +++++++++ .../vm/testdata/precompiles/blsG2Mul.json | 730 +++++++++ .../testdata/precompiles/blsG2MultiExp.json | 723 +++++++++ .../vm/testdata/precompiles/blsMapG1.json | 702 +++++++++ .../vm/testdata/precompiles/blsMapG2.json | 702 +++++++++ .../vm/testdata/precompiles/blsPairing.json | 702 +++++++++ .../vm/testdata/precompiles/bn256Add.json | 114 ++ .../vm/testdata/precompiles/bn256Pairing.json | 100 ++ .../testdata/precompiles/bn256ScalarMul.json | 128 ++ .../vm/testdata/precompiles/ecRecover.json | 37 + .../vm/testdata/precompiles/fail-blake2f.json | 22 + .../testdata/precompiles/fail-blsG1Add.json | 32 + .../testdata/precompiles/fail-blsG1Mul.json | 32 + .../precompiles/fail-blsG1MultiExp.json | 32 + .../testdata/precompiles/fail-blsG2Add.json | 32 + .../testdata/precompiles/fail-blsG2Mul.json | 32 + .../precompiles/fail-blsG2MultiExp.json | 32 + .../testdata/precompiles/fail-blsMapG1.json | 22 + .../testdata/precompiles/fail-blsMapG2.json | 22 + .../testdata/precompiles/fail-blsPairing.json | 42 + .../core/vm/testdata/precompiles/modexp.json | 121 ++ .../testdata/precompiles/modexp_eip2565.json | 121 ++ x/evm/core/vm/testdata/testcases_add.json | 1 + x/evm/core/vm/testdata/testcases_and.json | 1 + x/evm/core/vm/testdata/testcases_byte.json | 1 + x/evm/core/vm/testdata/testcases_div.json | 1 + x/evm/core/vm/testdata/testcases_eq.json | 1 + x/evm/core/vm/testdata/testcases_exp.json | 1 + x/evm/core/vm/testdata/testcases_gt.json | 1 + x/evm/core/vm/testdata/testcases_lt.json | 1 + x/evm/core/vm/testdata/testcases_mod.json | 1 + x/evm/core/vm/testdata/testcases_mul.json | 1 + x/evm/core/vm/testdata/testcases_or.json | 1 + x/evm/core/vm/testdata/testcases_sar.json | 1 + x/evm/core/vm/testdata/testcases_sdiv.json | 1 + x/evm/core/vm/testdata/testcases_sgt.json | 1 + x/evm/core/vm/testdata/testcases_shl.json | 1 + x/evm/core/vm/testdata/testcases_shr.json | 1 + x/evm/core/vm/testdata/testcases_signext.json | 1 + x/evm/core/vm/testdata/testcases_slt.json | 1 + x/evm/core/vm/testdata/testcases_smod.json | 1 + x/evm/core/vm/testdata/testcases_sub.json | 1 + x/evm/core/vm/testdata/testcases_xor.json | 1 + x/evm/keeper/config.go | 2 +- x/evm/keeper/grpc_query.go | 6 +- x/evm/keeper/grpc_query_test.go | 4 +- x/evm/keeper/keeper.go | 2 +- x/evm/keeper/precompiles.go | 2 +- x/evm/keeper/precompiles_test.go | 2 +- x/evm/keeper/state_transition.go | 9 +- x/evm/keeper/statedb_test.go | 2 +- x/evm/statedb/interfaces.go | 2 +- x/evm/statedb/statedb.go | 2 +- x/evm/statedb/statedb_test.go | 2 +- x/evm/types/opcodes_hooks.go | 2 +- x/evm/types/params.go | 4 +- x/evm/types/params_test.go | 4 +- x/evm/types/permissions.go | 2 +- x/evm/types/query.pb.gw.go | 96 +- x/evm/types/tracer.go | 4 +- x/evm/types/tx.go | 2 +- 197 files changed, 20702 insertions(+), 186 deletions(-) create mode 100644 app/config.go create mode 100644 app/eips/README.md create mode 100644 app/eips/eips.go create mode 100644 app/eips/eips_test.go create mode 100644 app/eips/testdata/Counter.json create mode 100644 app/eips/testdata/Counter.sol create mode 100644 app/eips/testdata/CounterFactory.json create mode 100644 app/eips/testdata/CounterFactory.sol create mode 100644 app/eips/testdata/contracts.go create mode 100644 x/evm/config/configurator.go create mode 100644 x/evm/config/configurator_test.go create mode 100644 x/evm/core/core/utils.go create mode 100644 x/evm/core/logger/access_list_tracer.go create mode 100644 x/evm/core/logger/logger.go create mode 100644 x/evm/core/logger/logger_json.go create mode 100644 x/evm/core/tracers/js/bigint.go create mode 100644 x/evm/core/tracers/js/goja.go create mode 100644 x/evm/core/tracers/js/internal/tracers/4byte_tracer_legacy.js create mode 100644 x/evm/core/tracers/js/internal/tracers/bigram_tracer.js create mode 100644 x/evm/core/tracers/js/internal/tracers/call_tracer_legacy.js create mode 100644 x/evm/core/tracers/js/internal/tracers/evmdis_tracer.js create mode 100644 x/evm/core/tracers/js/internal/tracers/noop_tracer_legacy.js create mode 100644 x/evm/core/tracers/js/internal/tracers/opcount_tracer.js create mode 100644 x/evm/core/tracers/js/internal/tracers/prestate_tracer_legacy.js create mode 100644 x/evm/core/tracers/js/internal/tracers/tracers.go create mode 100644 x/evm/core/tracers/js/internal/tracers/trigram_tracer.js create mode 100644 x/evm/core/tracers/js/internal/tracers/unigram_tracer.js create mode 100644 x/evm/core/tracers/js/tracer_test.go create mode 100644 x/evm/core/tracers/native/4byte.go create mode 100644 x/evm/core/tracers/native/call.go create mode 100644 x/evm/core/tracers/native/noop.go create mode 100644 x/evm/core/tracers/native/prestate.go create mode 100644 x/evm/core/tracers/native/revertreason.go create mode 100644 x/evm/core/tracers/native/tracer.go create mode 100644 x/evm/core/tracers/tracers.go create mode 100644 x/evm/core/vm/analysis.go create mode 100644 x/evm/core/vm/analysis_test.go create mode 100644 x/evm/core/vm/common.go create mode 100644 x/evm/core/vm/contract.go create mode 100644 x/evm/core/vm/contracts.go create mode 100644 x/evm/core/vm/contracts_test.go create mode 100644 x/evm/core/vm/custom_eip.go create mode 100644 x/evm/core/vm/custom_eip_test.go create mode 100644 x/evm/core/vm/doc.go create mode 100644 x/evm/core/vm/eips.go create mode 100644 x/evm/core/vm/errors.go create mode 100644 x/evm/core/vm/evm.go create mode 100644 x/evm/core/vm/gas.go create mode 100644 x/evm/core/vm/gas_table.go create mode 100644 x/evm/core/vm/gas_table_test.go create mode 100644 x/evm/core/vm/instructions.go create mode 100644 x/evm/core/vm/instructions_test.go create mode 100644 x/evm/core/vm/interface.go create mode 100644 x/evm/core/vm/interpreter.go create mode 100644 x/evm/core/vm/interpreter_test.go create mode 100644 x/evm/core/vm/jump_table.go create mode 100644 x/evm/core/vm/jump_table_test.go create mode 100644 x/evm/core/vm/logger.go create mode 100644 x/evm/core/vm/memory.go create mode 100644 x/evm/core/vm/memory_table.go create mode 100644 x/evm/core/vm/opcode_hooks.go create mode 100644 x/evm/core/vm/opcodes.go create mode 100644 x/evm/core/vm/operations_acl.go create mode 100644 x/evm/core/vm/stack.go create mode 100644 x/evm/core/vm/stack_table.go create mode 100644 x/evm/core/vm/testdata/precompiles/blake2F.json create mode 100644 x/evm/core/vm/testdata/precompiles/blsG1Add.json create mode 100644 x/evm/core/vm/testdata/precompiles/blsG1Mul.json create mode 100644 x/evm/core/vm/testdata/precompiles/blsG1MultiExp.json create mode 100644 x/evm/core/vm/testdata/precompiles/blsG2Add.json create mode 100644 x/evm/core/vm/testdata/precompiles/blsG2Mul.json create mode 100644 x/evm/core/vm/testdata/precompiles/blsG2MultiExp.json create mode 100644 x/evm/core/vm/testdata/precompiles/blsMapG1.json create mode 100644 x/evm/core/vm/testdata/precompiles/blsMapG2.json create mode 100644 x/evm/core/vm/testdata/precompiles/blsPairing.json create mode 100644 x/evm/core/vm/testdata/precompiles/bn256Add.json create mode 100644 x/evm/core/vm/testdata/precompiles/bn256Pairing.json create mode 100644 x/evm/core/vm/testdata/precompiles/bn256ScalarMul.json create mode 100644 x/evm/core/vm/testdata/precompiles/ecRecover.json create mode 100644 x/evm/core/vm/testdata/precompiles/fail-blake2f.json create mode 100644 x/evm/core/vm/testdata/precompiles/fail-blsG1Add.json create mode 100644 x/evm/core/vm/testdata/precompiles/fail-blsG1Mul.json create mode 100644 x/evm/core/vm/testdata/precompiles/fail-blsG1MultiExp.json create mode 100644 x/evm/core/vm/testdata/precompiles/fail-blsG2Add.json create mode 100644 x/evm/core/vm/testdata/precompiles/fail-blsG2Mul.json create mode 100644 x/evm/core/vm/testdata/precompiles/fail-blsG2MultiExp.json create mode 100644 x/evm/core/vm/testdata/precompiles/fail-blsMapG1.json create mode 100644 x/evm/core/vm/testdata/precompiles/fail-blsMapG2.json create mode 100644 x/evm/core/vm/testdata/precompiles/fail-blsPairing.json create mode 100644 x/evm/core/vm/testdata/precompiles/modexp.json create mode 100644 x/evm/core/vm/testdata/precompiles/modexp_eip2565.json create mode 100644 x/evm/core/vm/testdata/testcases_add.json create mode 100644 x/evm/core/vm/testdata/testcases_and.json create mode 100644 x/evm/core/vm/testdata/testcases_byte.json create mode 100644 x/evm/core/vm/testdata/testcases_div.json create mode 100644 x/evm/core/vm/testdata/testcases_eq.json create mode 100644 x/evm/core/vm/testdata/testcases_exp.json create mode 100644 x/evm/core/vm/testdata/testcases_gt.json create mode 100644 x/evm/core/vm/testdata/testcases_lt.json create mode 100644 x/evm/core/vm/testdata/testcases_mod.json create mode 100644 x/evm/core/vm/testdata/testcases_mul.json create mode 100644 x/evm/core/vm/testdata/testcases_or.json create mode 100644 x/evm/core/vm/testdata/testcases_sar.json create mode 100644 x/evm/core/vm/testdata/testcases_sdiv.json create mode 100644 x/evm/core/vm/testdata/testcases_sgt.json create mode 100644 x/evm/core/vm/testdata/testcases_shl.json create mode 100644 x/evm/core/vm/testdata/testcases_shr.json create mode 100644 x/evm/core/vm/testdata/testcases_signext.json create mode 100644 x/evm/core/vm/testdata/testcases_slt.json create mode 100644 x/evm/core/vm/testdata/testcases_smod.json create mode 100644 x/evm/core/vm/testdata/testcases_sub.json create mode 100644 x/evm/core/vm/testdata/testcases_xor.json diff --git a/.golangci.yml b/.golangci.yml index 79a2b97842..24c5edff46 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -2,6 +2,8 @@ run: tests: true timeout: 5m concurrency: 4 + skip-dirs: + - x/evm/core linters: enable: @@ -33,8 +35,6 @@ linters: - gofumpt - gomodguard - - linters-settings: dogsled: max-blank-identifiers: 3 @@ -53,10 +53,10 @@ linters-settings: lang-version: "1.22" gomodguard: blocked: - versions: # List of blocked module version constraints - - https://github.com/etcd-io/etcd: # Blocked module with version constraint - version: ">= 3.4.10 || ~3.3.23" # Version constraint, see https://github.com/Masterminds/semver#basic-comparisons - reason: "CVE-2020-15114; CVE-2020-15136; CVE-2020-15115" # Reason why the version constraint exists. (Optional) - - https://github.com/dgrijalva/jwt-go: # Blocked module with version constraint - version: ">= 4.0.0-preview1" # Version constraint, see https://github.com/Masterminds/semver#basic-comparisons - reason: "CVE-2020-26160" # Reason why the version constraint exists. (Optional) + versions: # List of blocked module version constraints + - https://github.com/etcd-io/etcd: # Blocked module with version constraint + version: ">= 3.4.10 || ~3.3.23" # Version constraint, see https://github.com/Masterminds/semver#basic-comparisons + reason: "CVE-2020-15114; CVE-2020-15136; CVE-2020-15115" # Reason why the version constraint exists. (Optional) + - https://github.com/dgrijalva/jwt-go: # Blocked module with version constraint + version: ">= 4.0.0-preview1" # Version constraint, see https://github.com/Masterminds/semver#basic-comparisons + reason: "CVE-2020-26160" # Reason why the version constraint exists. (Optional) diff --git a/.semgrepignore b/.semgrepignore index 2fd10b1385..6f805ccaa7 100644 --- a/.semgrepignore +++ b/.semgrepignore @@ -30,4 +30,7 @@ tests/ .semgrep_logs/ # Documentation -client/docs/ \ No newline at end of file +client/docs/ + +# GETH code +x/evm/core/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 721684f38c..c1b5893889 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -109,6 +109,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (evm) [#2594](https://github.com/evmos/evmos/pull/2594) Move `CallEVM` and `CallEVMWithData` to `x/evm` module. - (app) [#2597](https://github.com/evmos/evmos/pull/2597) Remove hardcoded Bech32 conversions for blocked precompile addresses. - (contracts) [#2613](https://github.com/evmos/evmos/pull/2613) Remove unused contract and make script useable with Python <3.12. +- (evm) [#2663](https://github.com/evmos/evmos/pull/2663) Port Geth `core/vm` into Evmos `x/evm`. - (ante) [#2619](https://github.com/evmos/evmos/pull/2619) Change anteutils.TxFeeChecker to authante.TxFeeChecker. - (tests) [#2635](https://github.com/evmos/evmos/pull/2635) Add function to get ERC-20 balance to integration utils. - (ci) [#2630](https://github.com/evmos/evmos/pull/2630) Add PebbleDB image to docker-push workflow. diff --git a/Dockerfile b/Dockerfile index 25f49d6497..f3de4a83e5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -41,7 +41,7 @@ COPY --from=build-env /target/usr/lib /usr/lib COPY --from=build-env /target/usr/local/lib /usr/local/lib COPY --from=build-env /target/usr/include /usr/include -RUN apk add --no-cache ca-certificates=20240226-r0 jq=1.7.1-r0 curl=8.8.0-r0 bash=5.2.26-r0 vim=9.1.0414-r0 lz4=1.9.4-r5 rclone=1.66.0-r3 \ +RUN apk add --no-cache ca-certificates=20240705-r0 jq=1.7.1-r0 curl=8.8.0-r0 bash=5.2.26-r0 vim=9.1.0414-r0 lz4=1.9.4-r5 rclone=1.66.0-r4 \ && addgroup -g 1000 evmos \ && adduser -S -h /home/evmos -D evmos -u 1000 -G evmos diff --git a/app/ante/evm/interfaces.go b/app/ante/evm/interfaces.go index 5ebddebc88..93f8de99fe 100644 --- a/app/ante/evm/interfaces.go +++ b/app/ante/evm/interfaces.go @@ -9,8 +9,8 @@ import ( "github.com/cosmos/cosmos-sdk/types/tx" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/params" + "github.com/evmos/evmos/v18/x/evm/core/vm" "github.com/evmos/evmos/v18/x/evm/statedb" evmtypes "github.com/evmos/evmos/v18/x/evm/types" diff --git a/app/app.go b/app/app.go index 951357efd2..992f83d176 100644 --- a/app/app.go +++ b/app/app.go @@ -117,7 +117,7 @@ import ( consensusparamkeeper "github.com/cosmos/cosmos-sdk/x/consensus/keeper" consensusparamtypes "github.com/cosmos/cosmos-sdk/x/consensus/types" - "github.com/ethereum/go-ethereum/core/vm" + "github.com/evmos/evmos/v18/x/evm/core/vm" // unnamed import of statik for swagger UI support _ "github.com/evmos/evmos/v18/client/docs/statik" @@ -171,8 +171,8 @@ import ( memiavlstore "github.com/crypto-org-chain/cronos/store" // 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" + _ "github.com/evmos/evmos/v18/x/evm/core/tracers/js" + _ "github.com/evmos/evmos/v18/x/evm/core/tracers/native" ) func init() { diff --git a/app/config.go b/app/config.go new file mode 100644 index 0000000000..4812bf30a1 --- /dev/null +++ b/app/config.go @@ -0,0 +1,29 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package app + +import ( + "github.com/evmos/evmos/v18/app/eips" + evmconfig "github.com/evmos/evmos/v18/x/evm/config" + "github.com/evmos/evmos/v18/x/evm/core/vm" +) + +// The init function of the config file allows to setup the global +// configuration for the EVM, modifying the custom ones defined in evmOS. +func init() { + err := evmconfig.NewEVMConfigurator(). + WithExtendedEips(evmosActivators). + Configure() + if err != nil { + panic(err) + } +} + +// EvmosActivators defines a map of opcode modifiers associated +// with a key defining the corresponding EIP. +var evmosActivators = map[int]func(*vm.JumpTable){ + 0o000: eips.Enable0000, + 0o001: eips.Enable0001, + 0o002: eips.Enable0002, +} diff --git a/app/eips/README.md b/app/eips/README.md new file mode 100644 index 0000000000..fc6ee9118c --- /dev/null +++ b/app/eips/README.md @@ -0,0 +1,258 @@ +# Evmos Custom EIPs + +This document explain how **evmOS** allows chain built on top of it to define custom EIPs to modify the behavior of EVM +opcodes. + +## Custom EIPs + +Inside an EVM, every state transition or query is executed by evaluating opcodes. Custom EIPs are functions used to +change the behavior of these opcodes to tailor the EVM functionalities to fit the app-chain requirements. + +Custom EIPs should be defined in an `eips` package inside the `./app/eips/` folder of chains using the **evmOS** +framework. This organization of custom implementations is not a strict requirement, but is the suggested approach to +have a clean organization of functionalities. In this file, only the custom modifier should be defined. + +Inside this package, custom EIP should be defined in a file called `eips.go`. In this file, the EIPs modifier should be +defined with the signature: + +```go +func(jt *vm.JumpTable) {} +``` + +where `vm` is the package `"github.com/evmos/evmos/v18/x/evm/core/vm"`. + +Custom EIPs are used to modify the behavior of opcodes, which are described by the `operation` structure: + +```go +type operation struct { + // execute is the operation function + execute executionFunc + constantGas uint64 + dynamicGas gasFunc + // minStack tells how many stack items are required + minStack int + // maxStack specifies the max length the stack can have for this operation + // to not overflow the stack. + maxStack int + + // memorySize returns the memory size required for the operation + memorySize memorySizeFunc +} +``` + +With the **evmOS** framework, it is possible to modify any of the fields defined in the type via the `operation` setter +methods: + +- `SetExecute`: update the execution logic for the opcode. + +- `SetConstantGas`: update the value used for the constant gas cost. + +- `SetDynamicGas`: update the function used to compute the dynamic gas cost. + +- `SetMinStack`: update the minimum number of items in the stack required to execute the `operation`. + +- `SetMaxStack`: update the maximum number of items that will be in the stack after executing the `operation`. + +- `SetMemorySize`: the memory size required by the `operation`. + +An example for an EIP which modifies the constant gas used for the `CREATE` opcode is reported below: + +```go +// Enable a custom EIP-0000 +func Enable0000(jt *vm.JumpTable) { + jt[vm.CREATE].SetConstantGas(1) +} +``` + +In the same folder should also be defined tests and contracts used to verify the EIPs logic. + +## Activate Custom EIPs + +The activation of custom EIPs should be done inside the `config.go` file defined in the `./app/` folder. This file has +the role of the single source for modify the EVM implementation which is defined in the +[`x/evm/`](https://github.com/evmos/evmos/tree/main/x/evm) folder +of **evmOS**. + +In this file, 3 main components should be defined: + +- The custom EIPs, also called activators. +- The additional default EIPs enabled. +- The EVM configurator instance. + +All these components will be described in the following sections. + +### Opcode & EIP Activators + +Activators is the name provided by [Go-ethereum](https://geth.ethereum.org/) to the definition of the structure +grouping all possible non-default EIPs: + +```go +var activators = map[int]func(*JumpTable){ + 3855: enable3855, + ... +} +``` + +It can be interpreted as a list of available functionalities that can be toggled to change opcodes behavior. The +structure is a map where the key is the EIP number in the octal representation, and the value is the custom EIP +function that has to be evaluated. + +In **evmOS**, custom activators should be defined in a structure with the same data type, like in the example below: + +```go +// Activate custom EIPs: 0000, 0001, 0002, etc +evmosActivators = map[int]func(*vm.JumpTable){ + 0o000: eips.Enable0000, + 0o001: eips.Enable0001, + 0o002: eips.Enable0002, +} +``` + +It should be noted that the value of each key in the example is the modifier defined in the `eips` package in the +example provided at the of the [Custom EIPs](#custom-eips) section. + +### Default EIPs + +Custom EIPs defined in the `activators` map are not enabled by default. This type is only used to define the list of +custom functionalities that can be activated. To specify which custom EIP activate, we should modify the +**evmOS** `x/evm` module params. The parameter orchestrating enabled custom EIPs is the `DefaultExtraEIPs` and +**evmOS** provide an easy and safe way to customize it. + +To specify which activator enable in the chain, a new variable containing a slice of keys of the custom activators +should be defined. An example is reported below: + +```go +evmosEnabledEIPs = []int64{ + 0o000, +} +``` + +In this way, even though the custom activators defined $3$ new EIPs, we are going to activate only the number `0o000` + +### EVM Configurator + +The EVM configuration is the type used to modify the EVM configuration before starting a node. The type is defined as: + +```go +type EVMConfigurator struct { + extendedEIPs map[int]func(*vm.JumpTable) + extendedDefaultExtraEIPs []int64 + sealed bool +} +``` + +Currently, only 2 customizations are possible: + +- `WithExtendedEips`: extended the default available EIPs. + +- `WithExtendedDefaultExtraEIPs`: extended the default active EIPs. + +It is important to notice that the configurator will only allow to append new entries to the default ones defined by +**evmOS**. The reason behind this choice is to ensure the correct and safe execution of the virtual machine but still +allowing partners to customize their implementation. + +The `EVMConfigurator` type should be constructed using the builder pattern inside the `init()` function of the file so +that it is run during the creation of the application. + +An example of the usage of the configurator is reported below: + +```go +configurator := evmconfig.NewEVMConfigurator(). + WithExtendedEips(customActivators). + WithExtendedDefaultExtraEIPs(defaultEnabledEIPs...). + Configure() + +err := configurator.Configure() +``` + +Errors are raised when the configurator tries to append an item with the same name of one of the default one. Since +this type is used to configure the EVM before starting the node, it is safe, and suggested, to panic: + +```go +if err != nil { + panic(err) +} +``` + +## Custom EIPs Deep Dive + +When the chain receives an EVM transaction, it is handled by the `MsgServer` of the `x/evm` within the method +`EthereumTx`. The method then calls `ApplyTransaction` where the EVM configuration is created: + +```go +cfg, err := k.EVMConfig(ctx, sdk.ConsAddress(ctx.BlockHeader().ProposerAddress), k.eip155ChainID) +``` + +During the creation of this type, a query is made to retrieve the `x/evm` params. After this step, the request is +passed inside the `ApplyMessageWithConfig` where a new instance of the EVM is created: + +```go +evm := k.NewEVM(ctx, msg, cfg, tracer, stateDB) +``` + +The `NewEVM` method calls the `NewEVMWithHooks` where a new instance of the virtual machine interpreter is created: + +```go +evm.interpreter = NewEVMInterpreter(evm, config) +``` + +The management of activators is handled in this function: + +```go +func NewEVMInterpreter(evm *EVM, cfg Config) *EVMInterpreter { + // If jump table was not initialised we set the default one. + if cfg.JumpTable == nil { + cfg.JumpTable = DefaultJumpTable(evm.chainRules) + for i, eip := range cfg.ExtraEips { + // Deep-copy jumptable to prevent modification of opcodes in other tables + copy := CopyJumpTable(cfg.JumpTable) + if err := EnableEIP(eip, copy); err != nil { + // Disable it, so caller can check if it's activated or not + cfg.ExtraEips = append(cfg.ExtraEips[:i], cfg.ExtraEips[i+1:]...) + log.Error("EIP activation failed", "eip", eip, "error", err) + } + cfg.JumpTable = copy + } + } + + return &EVMInterpreter{ + evm: evm, + cfg: cfg, + } +} +``` + +As we can see, a new `JumpTable` is created if it is not received from previous evm executions in the same transaction. +After that, the function iterate over the `ExtraEips` defined in the configuration. Then, it is checked if the EIP is +associated with an activator. If yes, the activator function is execute, otherwise an error is returned and the EIP is +removed from the VM configuration. At this point, all the opcodes are ready to be executed. + +## How to Use It + +In previous sections has been described required structures and files to use the EVM configurator to enable custom +EIPs. In this the general procedure is taken into considerations. Two different scenarios are described: + +- New chain. + +- Running chain. + +### New Chain + +For a new chain starting from block genesis, the procedure described in the sections above is enough. To summarize it: + +- Create the eip file with custom activators. + +- Create the config file with custom activators, default EIPs, and the configurator. + +After starting the chain, the genesis validation will perform all the required checks and the chain will be ready using +the new custom EIPs. + +### Running Chain + +The proper approach to include and enable new EIPs, with the current state of the development, is via coordinate chain +upgrade. During the chain upgrade it is important to define the custom activators since they are not stored in the +chain. To enable them there are two possibilities: + +- Write a migration to add the new enabled EIPsm during the upgrade. + +- After the upgrade, create a governance proposal to modify the `x/evm` params. diff --git a/app/eips/eips.go b/app/eips/eips.go new file mode 100644 index 0000000000..64ace1f27a --- /dev/null +++ b/app/eips/eips.go @@ -0,0 +1,36 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package eips + +import ( + "github.com/evmos/evmos/v18/x/evm/core/vm" +) + +var ( + Multiplier = uint64(10) + SstoreConstantGas = uint64(500) +) + +// enable0000 contains the logic to modify the CREATE and CREATE2 opcodes +// constant gas value. +func Enable0000(jt *vm.JumpTable) { + currentValCreate := jt[vm.CREATE].GetConstantGas() + jt[vm.CREATE].SetConstantGas(currentValCreate * Multiplier) + + currentValCreate2 := jt[vm.CREATE2].GetConstantGas() + jt[vm.CREATE2].SetConstantGas(currentValCreate2 * Multiplier) +} + +// enable0001 contains the logic to modify the CALL opcode +// constant gas value. +func Enable0001(jt *vm.JumpTable) { + currentVal := jt[vm.CALL].GetConstantGas() + jt[vm.CALL].SetConstantGas(currentVal * Multiplier) +} + +// enable0002 contains the logic to modify the SSTORE opcode +// constant gas value. +func Enable0002(jt *vm.JumpTable) { + jt[vm.SSTORE].SetConstantGas(SstoreConstantGas) +} diff --git a/app/eips/eips_test.go b/app/eips/eips_test.go new file mode 100644 index 0000000000..28741685d7 --- /dev/null +++ b/app/eips/eips_test.go @@ -0,0 +1,375 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package eips_test + +import ( + "fmt" + "math/big" + "testing" + + "github.com/cosmos/cosmos-sdk/crypto/types" + "github.com/ethereum/go-ethereum/common" + "github.com/evmos/evmos/v18/app/eips" + "github.com/evmos/evmos/v18/app/eips/testdata" + "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" + "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + + evmtypes "github.com/evmos/evmos/v18/x/evm/types" + + "github.com/ethereum/go-ethereum/params" + + //nolint:revive // dot imports are fine for Ginkgo + . "github.com/onsi/ginkgo/v2" + //nolint:revive // dot imports are fine for Ginkgo + . "github.com/onsi/gomega" +) + +// Below tests are divided in 3 steps: +// 1. Deploy and interact with contracts to compute the gas used BEFORE enabling +// the EIP. +// 2. Activate the EIP under test. +// 3. Deploy and interact with contracts to compute the gas used AFTER enabling +// the EIP. + +func TestEIPs(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "EIPs Suite") +} + +var _ = Describe("EIP0000 - ", Ordered, func() { + var ( + in network.Network + tf factory.TxFactory + gh grpc.Handler + k keyring.Keyring + + senderPriv types.PrivKey + senderAddr common.Address + senderPriv2 types.PrivKey + senderAddr2 common.Address + + // Gas used before enabling the EIP. + gasUsedPre int64 + ) + + // Multiplier used to modify the opcodes associated with EIP 0000. + eipMultiplier := uint64(5) + + // The factory counter is used because it will create a new instance of + // the counter contract, allowing to test the CREATE opcode. + counterFactoryContract, err := testdata.LoadCounterFactoryContract() + Expect(err).ToNot(HaveOccurred(), "failed to load Counter Factory contract") + + deploymentData := factory.ContractDeploymentData{ + Contract: counterFactoryContract, + ConstructorArgs: []interface{}{}, + } + + BeforeAll(func() { + k = keyring.New(2) + in = network.New( + network.WithPreFundedAccounts(k.GetAllAccAddrs()...), + ) + gh = grpc.NewIntegrationHandler(in) + tf = factory.New(in, gh) + + // Account used to deploy the contract before enabling the EIP. + senderPriv = k.GetPrivKey(0) + senderAddr = k.GetAddr(0) + // Account used to deploy the contract after enabling the EIP. A second + // account is used to avoid possible additional gas costs due to the change + // in the Nonce. + senderPriv2 = k.GetPrivKey(0) + senderAddr2 = k.GetAddr(0) + + // Set extra EIPs to empty to allow testing a single modifier. + defaultParams := evmtypes.DefaultParams() + defaultParams.ExtraEIPs = []int64{} + err = in.UpdateEvmParams(defaultParams) + Expect(err).To(BeNil(), "failed during update of evm params") + }) + + It("should deploy the contract before enabling the EIP", func() { + deploymentTxArgs, err := tf.GenerateDeployContractArgs(senderAddr, evmtypes.EvmTxArgs{}, deploymentData) + Expect(err).To(BeNil(), "failed to create deployment tx args") + + res, err := tf.ExecuteEthTx(senderPriv, deploymentTxArgs) + Expect(err).To(BeNil(), "failed during contract deployment") + gasUsedPre = res.GasUsed + }) + + It("should enable the new EIP", func() { + eips.Multiplier = eipMultiplier + newEIP := 0o000 + + qRes, err := gh.GetEvmParams() + Expect(err).To(BeNil(), "failed during query to evm params") + qRes.Params.ExtraEIPs = append(qRes.Params.ExtraEIPs, int64(newEIP)) + err = in.UpdateEvmParams(qRes.Params) + Expect(err).To(BeNil(), "failed during update of evm params") + + qRes, err = gh.GetEvmParams() + Expect(err).To(BeNil(), "failed during query to evm params") + Expect(qRes.Params.ExtraEIPs).To(ContainElement(int64(newEIP)), "expected to have eip 0000 in evm params") + }) + + It("should change CREATE opcode constant gas after enabling EIP", func() { + gasCostPre := params.CreateGas + + deploymentTxArgs, err := tf.GenerateDeployContractArgs(senderAddr2, evmtypes.EvmTxArgs{}, deploymentData) + Expect(err).To(BeNil(), "failed to create deployment tx args") + + res, err := tf.ExecuteEthTx(senderPriv2, deploymentTxArgs) + Expect(err).To(BeNil(), "failed during contract deployment") + + gasUsedPost := res.GasUsed + + // The difference in gas is the new cost of the opcode, minus the cost of the + // opcode before enabling the new eip. + gasUsedDiff := eipMultiplier*gasCostPre - gasCostPre + expectedGas := gasUsedPre + int64(gasUsedDiff) + Expect(gasUsedPost).To(Equal(expectedGas)) + }) +}) + +var _ = Describe("EIP0001 - ", Ordered, func() { + var ( + in network.Network + tf factory.TxFactory + gh grpc.Handler + k keyring.Keyring + + senderPriv types.PrivKey + + // Gas used before enabling the EIP. + gasUsedPre int64 + + // The address of the factory counter. + counterFactoryAddr common.Address + ) + + // Multiplier used to modify the opcodes associated with EIP 0001. + eipMultiplier := uint64(5) + initialCounterValue := 1 + + // The counter factory contract is used to deploy a counter contract and + // perform state transition using the CALL opcode. + counterFactoryContract, err := testdata.LoadCounterFactoryContract() + Expect(err).ToNot(HaveOccurred(), "failed to load Counter Factory contract") + + BeforeAll(func() { + k = keyring.New(1) + in = network.New( + network.WithPreFundedAccounts(k.GetAllAccAddrs()...), + ) + gh = grpc.NewIntegrationHandler(in) + tf = factory.New(in, gh) + + senderPriv = k.GetPrivKey(0) + + // Set extra EIPs to empty to allow testing a single modifier. + defaultParams := evmtypes.DefaultParams() + defaultParams.ExtraEIPs = []int64{} + err = in.UpdateEvmParams(defaultParams) + Expect(err).To(BeNil(), "failed during update of evm params") + }) + + It("should deploy the contract before enabling the EIP", func() { + counterFactoryAddr, err = tf.DeployContract( + senderPriv, + evmtypes.EvmTxArgs{}, + factory.ContractDeploymentData{ + Contract: counterFactoryContract, + ConstructorArgs: []interface{}{}, + }, + ) + Expect(err).ToNot(HaveOccurred(), "failed to deploy counter factory contract") + + res, err := tf.ExecuteContractCall( + senderPriv, + evmtypes.EvmTxArgs{To: &counterFactoryAddr}, + factory.CallArgs{ + ContractABI: counterFactoryContract.ABI, + MethodName: "incrementCounter", + Args: []interface{}{}, + }, + ) + Expect(err).ToNot(HaveOccurred(), "failed to increment counter value") + gasUsedPre = res.GasUsed + + // Query the counter value to check proper state transition later. + res, err = tf.ExecuteContractCall( + senderPriv, + evmtypes.EvmTxArgs{To: &counterFactoryAddr}, + factory.CallArgs{ + ContractABI: counterFactoryContract.ABI, + MethodName: "getCounterValue", + Args: []interface{}{}, + }, + ) + Expect(err).ToNot(HaveOccurred(), "failed to get counter value") + + ethRes, err := evmtypes.DecodeTxResponse(res.Data) + Expect(err).ToNot(HaveOccurred(), "failed to decode tx response") + + unpacked, err := counterFactoryContract.ABI.Unpack( + "getCounterValue", + ethRes.Ret, + ) + Expect(err).ToNot(HaveOccurred(), "failed to unpack counter value") + + counter, ok := unpacked[0].(*big.Int) + Expect(ok).To(BeTrue(), "failed to convert counter to big.Int") + Expect(counter.String()).To(Equal(fmt.Sprintf("%d", initialCounterValue+1)), "counter is not correct") + }) + It("should enable the new EIP", func() { + eips.Multiplier = eipMultiplier + newEIP := 0o001 + + qRes, err := gh.GetEvmParams() + Expect(err).To(BeNil(), "failed during query to evm params") + qRes.Params.ExtraEIPs = append(qRes.Params.ExtraEIPs, int64(newEIP)) + err = in.UpdateEvmParams(qRes.Params) + Expect(err).To(BeNil(), "failed during update of evm params") + + qRes, err = gh.GetEvmParams() + Expect(err).To(BeNil(), "failed during query to evm params") + Expect(qRes.Params.ExtraEIPs).To(ContainElement(int64(newEIP)), "expected to have eip 0001 in evm params") + }) + It("should change CALL opcode constant gas after enabling EIP", func() { + // Constant gas cost used before enabling the new EIP. + gasCostPre := params.WarmStorageReadCostEIP2929 + + res, err := tf.ExecuteContractCall( + senderPriv, + evmtypes.EvmTxArgs{To: &counterFactoryAddr}, + factory.CallArgs{ + ContractABI: counterFactoryContract.ABI, + MethodName: "incrementCounter", + Args: []interface{}{}, + }, + ) + Expect(err).ToNot(HaveOccurred(), "failed to increment counter value") + gasUsedPost := res.GasUsed + + res, err = tf.ExecuteContractCall( + senderPriv, + evmtypes.EvmTxArgs{To: &counterFactoryAddr}, + factory.CallArgs{ + ContractABI: counterFactoryContract.ABI, + MethodName: "getCounterValue", + Args: []interface{}{}, + }, + ) + Expect(err).ToNot(HaveOccurred(), "failed to get counter value") + ethRes, err := evmtypes.DecodeTxResponse(res.Data) + Expect(err).ToNot(HaveOccurred(), "failed to decode tx response") + + unpacked, err := counterFactoryContract.ABI.Unpack( + "getCounterValue", + ethRes.Ret, + ) + Expect(err).ToNot(HaveOccurred(), "failed to unpack counter value") + + counter, ok := unpacked[0].(*big.Int) + Expect(ok).To(BeTrue(), "failed to convert counter to big.Int") + Expect(counter.String()).To(Equal(fmt.Sprintf("%d", initialCounterValue+2)), "counter is not updated correctly") + + // The difference in gas is the new cost of the opcode, minus the cost of the + // opcode before enabling the new eip. + gasUsedDiff := eipMultiplier*gasCostPre - gasCostPre + expectedGas := gasUsedPre + int64(gasUsedDiff) + Expect(gasUsedPost).To(Equal(expectedGas)) + }) +}) + +var _ = Describe("EIP0002 - ", Ordered, func() { + var ( + in network.Network + tf factory.TxFactory + gh grpc.Handler + k keyring.Keyring + + senderPriv types.PrivKey + senderAddr common.Address + senderPriv2 types.PrivKey + senderAddr2 common.Address + gasUsedPre int64 + ) + // Constant gas used to modify the opcodes associated with EIP 0002. + constantGas := uint64(500) + + counterContract, err := testdata.LoadCounterContract() + Expect(err).ToNot(HaveOccurred(), "failed to load Counter contract") + + deploymentData := factory.ContractDeploymentData{ + Contract: counterContract, + ConstructorArgs: []interface{}{}, + } + BeforeAll(func() { + k = keyring.New(2) + in = network.New( + network.WithPreFundedAccounts(k.GetAllAccAddrs()...), + ) + gh = grpc.NewIntegrationHandler(in) + tf = factory.New(in, gh) + + // Account used to deploy the contract before enabling the EIP. + senderPriv = k.GetPrivKey(0) + senderAddr = k.GetAddr(0) + // Account used to deploy the contract after enabling the EIP. A second + // account is used to avoid possible additional gas costs due to the change + // in the Nonce. + senderPriv2 = k.GetPrivKey(0) + senderAddr2 = k.GetAddr(0) + + // Set extra EIPs to empty to allow testing a single modifier. + defaultParams := evmtypes.DefaultParams() + defaultParams.ExtraEIPs = []int64{} + err = in.UpdateEvmParams(defaultParams) + Expect(err).To(BeNil(), "failed during update of evm params") + }) + + It("should deploy the contract before enabling the EIP", func() { + deploymentTxArgs, err := tf.GenerateDeployContractArgs(senderAddr, evmtypes.EvmTxArgs{}, deploymentData) + Expect(err).To(BeNil(), "failed to create deployment tx args") + + res, err := tf.ExecuteEthTx(senderPriv, deploymentTxArgs) + Expect(err).To(BeNil(), "failed during contract deployment") + + gasUsedPre = res.GasUsed + }) + + It("should enable the new EIP", func() { + eips.SstoreConstantGas = constantGas + newEIP := 0o002 + + qRes, err := gh.GetEvmParams() + Expect(err).To(BeNil(), "failed during query to evm params") + qRes.Params.ExtraEIPs = append(qRes.Params.ExtraEIPs, int64(newEIP)) + err = in.UpdateEvmParams(qRes.Params) + Expect(err).To(BeNil(), "failed during update of evm params") + + qRes, err = gh.GetEvmParams() + Expect(err).To(BeNil(), "failed during query to evm params") + Expect(qRes.Params.ExtraEIPs).To(ContainElement(int64(newEIP)), "expected to have eip 0002 in evm params") + }) + + It("should change SSTORE opcode constant gas after enabling EIP", func() { + deploymentTxArgs, err := tf.GenerateDeployContractArgs(senderAddr2, evmtypes.EvmTxArgs{}, deploymentData) + Expect(err).To(BeNil(), "failed to create deployment tx args") + + res, err := tf.ExecuteEthTx(senderPriv2, deploymentTxArgs) + Expect(err).To(BeNil(), "failed during contract deployment") + + gasUsedPost := res.GasUsed + + // The expected gas is previous gas plus the constant gas because + // previous this eip, SSTORE was using only the dynamic gas. + expectedGas := gasUsedPre + int64(constantGas) + Expect(gasUsedPost).To(Equal(expectedGas)) + }) +}) diff --git a/app/eips/testdata/Counter.json b/app/eips/testdata/Counter.json new file mode 100644 index 0000000000..200596b7ca --- /dev/null +++ b/app/eips/testdata/Counter.json @@ -0,0 +1,38 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Counter", + "sourceName": "solidity/app/eips/testdata/Counter.sol", + "abi": [ + { + "inputs": [], + "name": "counter", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decrement", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "increment", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6080604052600160005534801561001557600080fd5b506101ba806100256000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80632baeceb71461004657806361bc221a14610050578063d09de08a1461006e575b600080fd5b61004e610078565b005b610058610091565b60405161006591906100c9565b60405180910390f35b610076610097565b005b60008081548092919061008a90610113565b9190505550565b60005481565b6000808154809291906100a99061013c565b9190505550565b6000819050919050565b6100c3816100b0565b82525050565b60006020820190506100de60008301846100ba565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061011e826100b0565b915060008203610131576101306100e4565b5b600182039050919050565b6000610147826100b0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610179576101786100e4565b5b60018201905091905056fea2646970667358221220dc4491d5c6f55bcb980d93a3b83053c976aa8d20dbfc1151ae5ee919b663522c64736f6c63430008130033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c80632baeceb71461004657806361bc221a14610050578063d09de08a1461006e575b600080fd5b61004e610078565b005b610058610091565b60405161006591906100c9565b60405180910390f35b610076610097565b005b60008081548092919061008a90610113565b9190505550565b60005481565b6000808154809291906100a99061013c565b9190505550565b6000819050919050565b6100c3816100b0565b82525050565b60006020820190506100de60008301846100ba565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061011e826100b0565b915060008203610131576101306100e4565b5b600182039050919050565b6000610147826100b0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610179576101786100e4565b5b60018201905091905056fea2646970667358221220dc4491d5c6f55bcb980d93a3b83053c976aa8d20dbfc1151ae5ee919b663522c64736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/app/eips/testdata/Counter.sol b/app/eips/testdata/Counter.sol new file mode 100644 index 0000000000..30ba0869f7 --- /dev/null +++ b/app/eips/testdata/Counter.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: LGPL-3.0-only + +pragma solidity >=0.7.0 <0.9.0; + +contract Counter { + uint256 public counter = 1; + + function increment() external { + counter++; + } + + function decrement() external { + counter--; + } +} diff --git a/app/eips/testdata/CounterFactory.json b/app/eips/testdata/CounterFactory.json new file mode 100644 index 0000000000..a5955d1980 --- /dev/null +++ b/app/eips/testdata/CounterFactory.json @@ -0,0 +1,56 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Counterfactory", + "sourceName": "solidity/app/eips/testdata/CounterFactory.sol", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "counterInstance", + "outputs": [ + { + "internalType": "contract Counter", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decrementCounter", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getCounterValue", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "incrementCounter", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b5060405161001d9061007e565b604051809103906000f080158015610039573d6000803e3d6000fd5b506000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061008b565b6101df8061045c83390190565b6103c28061009a6000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80635b34b9661461005157806372142b891461005b578063aef38e7214610079578063f5c5ad8314610097575b600080fd5b6100596100a1565b005b610063610123565b6040516100709190610279565b60405180910390f35b6100816101ba565b60405161008e9190610313565b60405180910390f35b61009f6101de565b005b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d09de08a6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561010957600080fd5b505af115801561011d573d6000803e3d6000fd5b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166361bc221a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610191573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101b5919061035f565b905090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632baeceb76040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561024657600080fd5b505af115801561025a573d6000803e3d6000fd5b50505050565b6000819050919050565b61027381610260565b82525050565b600060208201905061028e600083018461026a565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006102d96102d46102cf84610294565b6102b4565b610294565b9050919050565b60006102eb826102be565b9050919050565b60006102fd826102e0565b9050919050565b61030d816102f2565b82525050565b60006020820190506103286000830184610304565b92915050565b600080fd5b61033c81610260565b811461034757600080fd5b50565b60008151905061035981610333565b92915050565b6000602082840312156103755761037461032e565b5b60006103838482850161034a565b9150509291505056fea264697066735822122027b5108356362e27bc64cb585edca368be3a708dcbed69241fc576994e9171dd64736f6c634300081300336080604052600160005534801561001557600080fd5b506101ba806100256000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80632baeceb71461004657806361bc221a14610050578063d09de08a1461006e575b600080fd5b61004e610078565b005b610058610091565b60405161006591906100c9565b60405180910390f35b610076610097565b005b60008081548092919061008a90610113565b9190505550565b60005481565b6000808154809291906100a99061013c565b9190505550565b6000819050919050565b6100c3816100b0565b82525050565b60006020820190506100de60008301846100ba565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061011e826100b0565b915060008203610131576101306100e4565b5b600182039050919050565b6000610147826100b0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610179576101786100e4565b5b60018201905091905056fea2646970667358221220dc4491d5c6f55bcb980d93a3b83053c976aa8d20dbfc1151ae5ee919b663522c64736f6c63430008130033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c80635b34b9661461005157806372142b891461005b578063aef38e7214610079578063f5c5ad8314610097575b600080fd5b6100596100a1565b005b610063610123565b6040516100709190610279565b60405180910390f35b6100816101ba565b60405161008e9190610313565b60405180910390f35b61009f6101de565b005b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d09de08a6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561010957600080fd5b505af115801561011d573d6000803e3d6000fd5b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166361bc221a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610191573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101b5919061035f565b905090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632baeceb76040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561024657600080fd5b505af115801561025a573d6000803e3d6000fd5b50505050565b6000819050919050565b61027381610260565b82525050565b600060208201905061028e600083018461026a565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006102d96102d46102cf84610294565b6102b4565b610294565b9050919050565b60006102eb826102be565b9050919050565b60006102fd826102e0565b9050919050565b61030d816102f2565b82525050565b60006020820190506103286000830184610304565b92915050565b600080fd5b61033c81610260565b811461034757600080fd5b50565b60008151905061035981610333565b92915050565b6000602082840312156103755761037461032e565b5b60006103838482850161034a565b9150509291505056fea264697066735822122027b5108356362e27bc64cb585edca368be3a708dcbed69241fc576994e9171dd64736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/app/eips/testdata/CounterFactory.sol b/app/eips/testdata/CounterFactory.sol new file mode 100644 index 0000000000..7b64412d21 --- /dev/null +++ b/app/eips/testdata/CounterFactory.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: LGPL-3.0-only + +pragma solidity >=0.7.0 <0.9.0; + +import "./Counter.sol"; + +contract Counterfactory { + Counter public counterInstance; + + constructor() { + counterInstance = new Counter(); + } + + function incrementCounter() public { + counterInstance.increment(); + } + + function decrementCounter() public { + counterInstance.decrement(); + } + + function getCounterValue() public view returns (uint256) { + return counterInstance.counter(); + } +} diff --git a/app/eips/testdata/contracts.go b/app/eips/testdata/contracts.go new file mode 100644 index 0000000000..a67137b218 --- /dev/null +++ b/app/eips/testdata/contracts.go @@ -0,0 +1,17 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package testdata + +import ( + contractutils "github.com/evmos/evmos/v18/contracts/utils" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" +) + +func LoadCounterContract() (evmtypes.CompiledContract, error) { + return contractutils.LoadContractFromJSONFile("Counter.json") +} + +func LoadCounterFactoryContract() (evmtypes.CompiledContract, error) { + return contractutils.LoadContractFromJSONFile("CounterFactory.json") +} diff --git a/precompiles/authorization/events.go b/precompiles/authorization/events.go index 272d4c6dc2..fbef44038c 100644 --- a/precompiles/authorization/events.go +++ b/precompiles/authorization/events.go @@ -11,8 +11,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/x/evm/core/vm" ) const ( diff --git a/precompiles/bank/bank.go b/precompiles/bank/bank.go index a1b82a288d..d6acf9dc4b 100644 --- a/precompiles/bank/bank.go +++ b/precompiles/bank/bank.go @@ -10,9 +10,9 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" cmn "github.com/evmos/evmos/v18/precompiles/common" erc20keeper "github.com/evmos/evmos/v18/x/erc20/keeper" + "github.com/evmos/evmos/v18/x/evm/core/vm" ) const ( diff --git a/precompiles/bank/query.go b/precompiles/bank/query.go index 10b373c6f2..916a97f3d7 100644 --- a/precompiles/bank/query.go +++ b/precompiles/bank/query.go @@ -8,7 +8,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/core/vm" + "github.com/evmos/evmos/v18/x/evm/core/vm" ) const ( diff --git a/precompiles/bech32/bech32.go b/precompiles/bech32/bech32.go index d4f9dd2f00..37563608e1 100644 --- a/precompiles/bech32/bech32.go +++ b/precompiles/bech32/bech32.go @@ -9,8 +9,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/x/evm/core/vm" ) var _ vm.PrecompiledContract = &Precompile{} diff --git a/precompiles/bech32/bech32_test.go b/precompiles/bech32/bech32_test.go index 6bc24db9e4..06764752eb 100644 --- a/precompiles/bech32/bech32_test.go +++ b/precompiles/bech32/bech32_test.go @@ -5,9 +5,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" "github.com/evmos/evmos/v18/cmd/config" "github.com/evmos/evmos/v18/precompiles/bech32" + "github.com/evmos/evmos/v18/x/evm/core/vm" ) func (s *PrecompileTestSuite) TestNewPrecompile() { diff --git a/precompiles/common/events.go b/precompiles/common/events.go index e8c847228c..c943de1a22 100644 --- a/precompiles/common/events.go +++ b/precompiles/common/events.go @@ -7,7 +7,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" + "github.com/evmos/evmos/v18/x/evm/core/vm" ) // EmitEventArgs are the arguments required to emit an authorization event. diff --git a/precompiles/common/precompile.go b/precompiles/common/precompile.go index a80da6790f..e830ae85f1 100644 --- a/precompiles/common/precompile.go +++ b/precompiles/common/precompile.go @@ -12,7 +12,7 @@ import ( authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" + "github.com/evmos/evmos/v18/x/evm/core/vm" "github.com/evmos/evmos/v18/x/evm/statedb" ) diff --git a/precompiles/distribution/distribution.go b/precompiles/distribution/distribution.go index d946ad02d6..9543cc5140 100644 --- a/precompiles/distribution/distribution.go +++ b/precompiles/distribution/distribution.go @@ -11,8 +11,8 @@ import ( authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" distributionkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/x/evm/core/vm" stakingkeeper "github.com/evmos/evmos/v18/x/staking/keeper" ) diff --git a/precompiles/distribution/distribution_test.go b/precompiles/distribution/distribution_test.go index e4a59ff608..96312af828 100644 --- a/precompiles/distribution/distribution_test.go +++ b/precompiles/distribution/distribution_test.go @@ -8,10 +8,10 @@ import ( "github.com/cosmos/cosmos-sdk/x/distribution/types" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" "github.com/evmos/evmos/v18/app" "github.com/evmos/evmos/v18/precompiles/distribution" "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v18/x/evm/core/vm" evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) diff --git a/precompiles/distribution/events.go b/precompiles/distribution/events.go index e22589220a..db6681010e 100644 --- a/precompiles/distribution/events.go +++ b/precompiles/distribution/events.go @@ -11,8 +11,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/x/evm/core/vm" ) const ( diff --git a/precompiles/distribution/events_test.go b/precompiles/distribution/events_test.go index 2f2a00c4dc..7dbb51fb02 100644 --- a/precompiles/distribution/events_test.go +++ b/precompiles/distribution/events_test.go @@ -7,12 +7,12 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/distribution/types" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" "github.com/evmos/evmos/v18/cmd/config" cmn "github.com/evmos/evmos/v18/precompiles/common" "github.com/evmos/evmos/v18/precompiles/distribution" "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v18/x/evm/core/vm" ) func (s *PrecompileTestSuite) TestSetWithdrawAddressEvent() { diff --git a/precompiles/distribution/integration_test.go b/precompiles/distribution/integration_test.go index 57b7d88186..c3e637fea5 100644 --- a/precompiles/distribution/integration_test.go +++ b/precompiles/distribution/integration_test.go @@ -13,7 +13,6 @@ import ( distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" cmn "github.com/evmos/evmos/v18/precompiles/common" "github.com/evmos/evmos/v18/precompiles/distribution" "github.com/evmos/evmos/v18/precompiles/testutil" @@ -21,6 +20,7 @@ import ( evmosutil "github.com/evmos/evmos/v18/testutil" testutiltx "github.com/evmos/evmos/v18/testutil/tx" "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v18/x/evm/core/vm" evmtypes "github.com/evmos/evmos/v18/x/evm/types" //nolint:revive // dot imports are fine for Ginkgo diff --git a/precompiles/distribution/query.go b/precompiles/distribution/query.go index c49e230b23..734a076b39 100644 --- a/precompiles/distribution/query.go +++ b/precompiles/distribution/query.go @@ -7,8 +7,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" distributionkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/core/vm" cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/x/evm/core/vm" ) const ( diff --git a/precompiles/distribution/query_test.go b/precompiles/distribution/query_test.go index 0de2a65979..bec9fc1b4a 100644 --- a/precompiles/distribution/query_test.go +++ b/precompiles/distribution/query_test.go @@ -10,7 +10,7 @@ import ( "github.com/cosmos/cosmos-sdk/types/query" "github.com/cosmos/cosmos-sdk/x/distribution/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/ethereum/go-ethereum/core/vm" + "github.com/evmos/evmos/v18/x/evm/core/vm" "github.com/evmos/evmos/v18/testutil" testutiltx "github.com/evmos/evmos/v18/testutil/tx" diff --git a/precompiles/distribution/tx.go b/precompiles/distribution/tx.go index 4e6e2ab3e5..9cb6b7542d 100644 --- a/precompiles/distribution/tx.go +++ b/precompiles/distribution/tx.go @@ -15,7 +15,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" distributionkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/core/vm" + "github.com/evmos/evmos/v18/x/evm/core/vm" ) const ( diff --git a/precompiles/distribution/tx_test.go b/precompiles/distribution/tx_test.go index 76ccd66fc3..9a5b059df9 100644 --- a/precompiles/distribution/tx_test.go +++ b/precompiles/distribution/tx_test.go @@ -5,8 +5,8 @@ import ( "math/big" "cosmossdk.io/math" - "github.com/ethereum/go-ethereum/core/vm" "github.com/evmos/evmos/v18/precompiles/testutil" + "github.com/evmos/evmos/v18/x/evm/core/vm" "github.com/ethereum/go-ethereum/common" diff --git a/precompiles/erc20/approve.go b/precompiles/erc20/approve.go index cfd6b67970..1932cfe5e6 100644 --- a/precompiles/erc20/approve.go +++ b/precompiles/erc20/approve.go @@ -17,9 +17,9 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" auth "github.com/evmos/evmos/v18/precompiles/authorization" cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/x/evm/core/vm" ) // Approve sets the given amount as the allowance of the spender address over diff --git a/precompiles/erc20/approve_test.go b/precompiles/erc20/approve_test.go index 22f92a7cd4..d345a576d1 100644 --- a/precompiles/erc20/approve_test.go +++ b/precompiles/erc20/approve_test.go @@ -9,11 +9,11 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" "github.com/evmos/evmos/v18/precompiles/authorization" cmn "github.com/evmos/evmos/v18/precompiles/common" "github.com/evmos/evmos/v18/precompiles/erc20" "github.com/evmos/evmos/v18/precompiles/testutil" + "github.com/evmos/evmos/v18/x/evm/core/vm" ) //nolint:dupl // tests are not duplicate between the functions diff --git a/precompiles/erc20/erc20.go b/precompiles/erc20/erc20.go index a197f4ef17..a408d69c9c 100644 --- a/precompiles/erc20/erc20.go +++ b/precompiles/erc20/erc20.go @@ -10,7 +10,7 @@ import ( cmn "github.com/evmos/evmos/v18/precompiles/common" "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/core/vm" + "github.com/evmos/evmos/v18/x/evm/core/vm" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" diff --git a/precompiles/erc20/errors.go b/precompiles/erc20/errors.go index bc02f1e68a..d8ca1240fb 100644 --- a/precompiles/erc20/errors.go +++ b/precompiles/erc20/errors.go @@ -9,10 +9,10 @@ import ( "github.com/cosmos/cosmos-sdk/x/authz" "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" "github.com/evmos/evmos/v18/ibc" cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/x/evm/core/vm" evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) diff --git a/precompiles/erc20/events.go b/precompiles/erc20/events.go index b4b05927b9..40e70cb9ed 100644 --- a/precompiles/erc20/events.go +++ b/precompiles/erc20/events.go @@ -11,7 +11,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" + "github.com/evmos/evmos/v18/x/evm/core/vm" auth "github.com/evmos/evmos/v18/precompiles/authorization" cmn "github.com/evmos/evmos/v18/precompiles/common" diff --git a/precompiles/erc20/query.go b/precompiles/erc20/query.go index 932fe07d17..84dd0da3f2 100644 --- a/precompiles/erc20/query.go +++ b/precompiles/erc20/query.go @@ -20,7 +20,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" + "github.com/evmos/evmos/v18/x/evm/core/vm" ) const ( diff --git a/precompiles/erc20/query_test.go b/precompiles/erc20/query_test.go index a6a13d72a5..4db43523bc 100644 --- a/precompiles/erc20/query_test.go +++ b/precompiles/erc20/query_test.go @@ -12,11 +12,11 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" "github.com/evmos/evmos/v18/app" auth "github.com/evmos/evmos/v18/precompiles/authorization" "github.com/evmos/evmos/v18/precompiles/erc20" "github.com/evmos/evmos/v18/testutil" + "github.com/evmos/evmos/v18/x/evm/core/vm" inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" ) diff --git a/precompiles/erc20/tx.go b/precompiles/erc20/tx.go index 49bad6fe50..1cd5de725b 100644 --- a/precompiles/erc20/tx.go +++ b/precompiles/erc20/tx.go @@ -13,7 +13,7 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" + "github.com/evmos/evmos/v18/x/evm/core/vm" ) const ( diff --git a/precompiles/erc20/tx_test.go b/precompiles/erc20/tx_test.go index bf5617af1b..523557e74b 100644 --- a/precompiles/erc20/tx_test.go +++ b/precompiles/erc20/tx_test.go @@ -7,11 +7,11 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/ethereum/go-ethereum/core/vm" "github.com/evmos/evmos/v18/precompiles/erc20" "github.com/evmos/evmos/v18/precompiles/testutil" utiltx "github.com/evmos/evmos/v18/testutil/tx" erc20types "github.com/evmos/evmos/v18/x/erc20/types" + "github.com/evmos/evmos/v18/x/evm/core/vm" ) var ( diff --git a/precompiles/ics20/approve.go b/precompiles/ics20/approve.go index fb91a4f1af..ae82ea2d9c 100644 --- a/precompiles/ics20/approve.go +++ b/precompiles/ics20/approve.go @@ -7,8 +7,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" "github.com/evmos/evmos/v18/precompiles/authorization" + "github.com/evmos/evmos/v18/x/evm/core/vm" ) // Approve implements the ICS20 approve transactions. diff --git a/precompiles/ics20/approve_common.go b/precompiles/ics20/approve_common.go index 08f042b317..1f7ed9716c 100644 --- a/precompiles/ics20/approve_common.go +++ b/precompiles/ics20/approve_common.go @@ -22,8 +22,8 @@ import ( channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/x/evm/core/vm" ) // TransferMsgURL is the ICS20 transfer message URL string. diff --git a/precompiles/ics20/events.go b/precompiles/ics20/events.go index 81b69bcc73..1fd0163d02 100644 --- a/precompiles/ics20/events.go +++ b/precompiles/ics20/events.go @@ -8,8 +8,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/x/evm/core/vm" ) const ( diff --git a/precompiles/ics20/events_test.go b/precompiles/ics20/events_test.go index 269b82b9e4..f8af1ffcc4 100644 --- a/precompiles/ics20/events_test.go +++ b/precompiles/ics20/events_test.go @@ -5,12 +5,12 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" "github.com/evmos/evmos/v18/precompiles/authorization" cmn "github.com/evmos/evmos/v18/precompiles/common" "github.com/evmos/evmos/v18/precompiles/ics20" "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v18/x/evm/core/vm" ) func (s *PrecompileTestSuite) TestTransferEvent() { diff --git a/precompiles/ics20/ics20.go b/precompiles/ics20/ics20.go index 7169652b9c..cc68941dfe 100644 --- a/precompiles/ics20/ics20.go +++ b/precompiles/ics20/ics20.go @@ -11,9 +11,9 @@ import ( authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" channelkeeper "github.com/cosmos/ibc-go/v7/modules/core/04-channel/keeper" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" "github.com/evmos/evmos/v18/precompiles/authorization" cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/x/evm/core/vm" transferkeeper "github.com/evmos/evmos/v18/x/ibc/transfer/keeper" stakingkeeper "github.com/evmos/evmos/v18/x/staking/keeper" ) diff --git a/precompiles/ics20/integration_test.go b/precompiles/ics20/integration_test.go index 287ec3ee9c..d756cbbd82 100644 --- a/precompiles/ics20/integration_test.go +++ b/precompiles/ics20/integration_test.go @@ -14,7 +14,6 @@ import ( channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" ibctesting "github.com/cosmos/ibc-go/v7/testing" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" evmoscontracts "github.com/evmos/evmos/v18/contracts" evmostesting "github.com/evmos/evmos/v18/ibc/testing" "github.com/evmos/evmos/v18/precompiles/authorization" @@ -27,6 +26,7 @@ import ( teststypes "github.com/evmos/evmos/v18/types/tests" "github.com/evmos/evmos/v18/utils" erc20types "github.com/evmos/evmos/v18/x/erc20/types" + "github.com/evmos/evmos/v18/x/evm/core/vm" evmtypes "github.com/evmos/evmos/v18/x/evm/types" inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" diff --git a/precompiles/ics20/query.go b/precompiles/ics20/query.go index d119d92bd8..c6a8ecc0cc 100644 --- a/precompiles/ics20/query.go +++ b/precompiles/ics20/query.go @@ -10,9 +10,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/core/vm" "github.com/evmos/evmos/v18/precompiles/authorization" cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/x/evm/core/vm" ) const ( diff --git a/precompiles/ics20/tx.go b/precompiles/ics20/tx.go index b5b8c66025..613c4b6c7a 100644 --- a/precompiles/ics20/tx.go +++ b/precompiles/ics20/tx.go @@ -14,7 +14,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" + "github.com/evmos/evmos/v18/x/evm/core/vm" cmn "github.com/evmos/evmos/v18/precompiles/common" "github.com/evmos/evmos/v18/utils" diff --git a/precompiles/ics20/tx_test.go b/precompiles/ics20/tx_test.go index f5915669a8..f92182b268 100644 --- a/precompiles/ics20/tx_test.go +++ b/precompiles/ics20/tx_test.go @@ -9,12 +9,12 @@ import ( transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" cmn "github.com/evmos/evmos/v18/precompiles/common" "github.com/evmos/evmos/v18/precompiles/ics20" evmosutil "github.com/evmos/evmos/v18/testutil" testutiltx "github.com/evmos/evmos/v18/testutil/tx" "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v18/x/evm/core/vm" ) var ( diff --git a/precompiles/ics20/types.go b/precompiles/ics20/types.go index e8b1331f93..670ced75db 100644 --- a/precompiles/ics20/types.go +++ b/precompiles/ics20/types.go @@ -10,7 +10,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/authz" authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" - "github.com/ethereum/go-ethereum/core/vm" + "github.com/evmos/evmos/v18/x/evm/core/vm" errorsmod "cosmossdk.io/errors" "cosmossdk.io/math" diff --git a/precompiles/ics20/utils_test.go b/precompiles/ics20/utils_test.go index d418d133ba..c414b13305 100644 --- a/precompiles/ics20/utils_test.go +++ b/precompiles/ics20/utils_test.go @@ -28,7 +28,6 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" evmosapp "github.com/evmos/evmos/v18/app" evmoscontracts "github.com/evmos/evmos/v18/contracts" @@ -43,6 +42,7 @@ import ( evmosutiltx "github.com/evmos/evmos/v18/testutil/tx" evmostypes "github.com/evmos/evmos/v18/types" "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v18/x/evm/core/vm" "github.com/evmos/evmos/v18/x/evm/statedb" evmtypes "github.com/evmos/evmos/v18/x/evm/types" feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" diff --git a/precompiles/p256/p256.go b/precompiles/p256/p256.go index ffd8afd84f..543f58446c 100644 --- a/precompiles/p256/p256.go +++ b/precompiles/p256/p256.go @@ -20,8 +20,8 @@ import ( "math/big" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" "github.com/evmos/evmos/v18/crypto/secp256r1" + "github.com/evmos/evmos/v18/x/evm/core/vm" ) var _ vm.PrecompiledContract = &Precompile{} diff --git a/precompiles/p256/p256_test.go b/precompiles/p256/p256_test.go index 6d824f97ae..eeeab30b19 100644 --- a/precompiles/p256/p256_test.go +++ b/precompiles/p256/p256_test.go @@ -9,8 +9,8 @@ import ( "github.com/cometbft/cometbft/crypto" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" "github.com/evmos/evmos/v18/precompiles/p256" + "github.com/evmos/evmos/v18/x/evm/core/vm" ) var trueValue = common.LeftPadBytes(common.Big1.Bytes(), 32) diff --git a/precompiles/staking/approve.go b/precompiles/staking/approve.go index 0d8de82b5e..805fe7b98b 100644 --- a/precompiles/staking/approve.go +++ b/precompiles/staking/approve.go @@ -14,9 +14,9 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" "github.com/evmos/evmos/v18/precompiles/authorization" cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/x/evm/core/vm" ) var ( diff --git a/precompiles/staking/approve_test.go b/precompiles/staking/approve_test.go index 5fa8107255..b1e78944b9 100644 --- a/precompiles/staking/approve_test.go +++ b/precompiles/staking/approve_test.go @@ -12,12 +12,12 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" sdkauthz "github.com/cosmos/cosmos-sdk/x/authz" "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/core/vm" "github.com/evmos/evmos/v18/precompiles/authorization" cmn "github.com/evmos/evmos/v18/precompiles/common" "github.com/evmos/evmos/v18/precompiles/staking" "github.com/evmos/evmos/v18/precompiles/testutil" evmosutil "github.com/evmos/evmos/v18/testutil" + "github.com/evmos/evmos/v18/x/evm/core/vm" ) func (s *PrecompileTestSuite) TestApprove() { diff --git a/precompiles/staking/events.go b/precompiles/staking/events.go index 626323862d..b67dffa469 100644 --- a/precompiles/staking/events.go +++ b/precompiles/staking/events.go @@ -15,8 +15,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/x/evm/core/vm" ) const ( diff --git a/precompiles/staking/events_test.go b/precompiles/staking/events_test.go index fb2b3c8ec7..8c9e366fab 100644 --- a/precompiles/staking/events_test.go +++ b/precompiles/staking/events_test.go @@ -8,11 +8,11 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" "github.com/evmos/evmos/v18/precompiles/authorization" cmn "github.com/evmos/evmos/v18/precompiles/common" "github.com/evmos/evmos/v18/precompiles/staking" + "github.com/evmos/evmos/v18/x/evm/core/vm" ) func (s *PrecompileTestSuite) TestApprovalEvent() { diff --git a/precompiles/staking/integration_test.go b/precompiles/staking/integration_test.go index 6e0f637155..6617c3f7f8 100644 --- a/precompiles/staking/integration_test.go +++ b/precompiles/staking/integration_test.go @@ -19,7 +19,6 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" compiledcontracts "github.com/evmos/evmos/v18/contracts" "github.com/evmos/evmos/v18/crypto/ethsecp256k1" "github.com/evmos/evmos/v18/precompiles/authorization" @@ -32,6 +31,7 @@ import ( evmosutil "github.com/evmos/evmos/v18/testutil" testutiltx "github.com/evmos/evmos/v18/testutil/tx" "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v18/x/evm/core/vm" evmtypes "github.com/evmos/evmos/v18/x/evm/types" vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" ) diff --git a/precompiles/staking/query.go b/precompiles/staking/query.go index 7d6e23caf5..e4eb0d184c 100644 --- a/precompiles/staking/query.go +++ b/precompiles/staking/query.go @@ -12,9 +12,9 @@ import ( stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/core/vm" "github.com/evmos/evmos/v18/precompiles/authorization" cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/x/evm/core/vm" ) const ( diff --git a/precompiles/staking/query_test.go b/precompiles/staking/query_test.go index 60e301556f..a6ac79b736 100644 --- a/precompiles/staking/query_test.go +++ b/precompiles/staking/query_test.go @@ -9,11 +9,11 @@ import ( "github.com/cosmos/cosmos-sdk/types/query" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" "github.com/evmos/evmos/v18/precompiles/authorization" cmn "github.com/evmos/evmos/v18/precompiles/common" "github.com/evmos/evmos/v18/precompiles/staking" testutiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/x/evm/core/vm" ) func (s *PrecompileTestSuite) TestDelegation() { diff --git a/precompiles/staking/staking.go b/precompiles/staking/staking.go index d3bf4829a8..fc81cd2e16 100644 --- a/precompiles/staking/staking.go +++ b/precompiles/staking/staking.go @@ -13,9 +13,9 @@ import ( authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" "github.com/evmos/evmos/v18/precompiles/authorization" cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/x/evm/core/vm" stakingkeeper "github.com/evmos/evmos/v18/x/staking/keeper" ) diff --git a/precompiles/staking/staking_test.go b/precompiles/staking/staking_test.go index df88c54aa4..9a13769183 100644 --- a/precompiles/staking/staking_test.go +++ b/precompiles/staking/staking_test.go @@ -8,7 +8,7 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" + "github.com/evmos/evmos/v18/x/evm/core/vm" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" diff --git a/precompiles/staking/tx.go b/precompiles/staking/tx.go index 3c8a69bdfc..11f90f93a2 100644 --- a/precompiles/staking/tx.go +++ b/precompiles/staking/tx.go @@ -11,9 +11,10 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" "github.com/evmos/evmos/v18/precompiles/authorization" cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/x/evm/core/vm" + stakingkeeper "github.com/evmos/evmos/v18/x/staking/keeper" ) diff --git a/precompiles/staking/tx_test.go b/precompiles/staking/tx_test.go index 9599cdffc7..10e7bf12d6 100644 --- a/precompiles/staking/tx_test.go +++ b/precompiles/staking/tx_test.go @@ -9,13 +9,13 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" geth "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" "github.com/evmos/evmos/v18/cmd/config" cmn "github.com/evmos/evmos/v18/precompiles/common" "github.com/evmos/evmos/v18/precompiles/staking" "github.com/evmos/evmos/v18/precompiles/testutil" evmosutiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/x/evm/core/vm" ) func (s *PrecompileTestSuite) TestCreateValidator() { diff --git a/precompiles/testutil/testing.go b/precompiles/testutil/testing.go index 9c0e5ef8a6..2cb57e0408 100644 --- a/precompiles/testutil/testing.go +++ b/precompiles/testutil/testing.go @@ -8,7 +8,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" + "github.com/evmos/evmos/v18/x/evm/core/vm" "github.com/stretchr/testify/require" ) diff --git a/precompiles/vesting/approve.go b/precompiles/vesting/approve.go index ab330178a0..a8f90e4351 100644 --- a/precompiles/vesting/approve.go +++ b/precompiles/vesting/approve.go @@ -10,8 +10,8 @@ import ( authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/x/evm/core/vm" vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" ) diff --git a/precompiles/vesting/events.go b/precompiles/vesting/events.go index d977cb83c3..6efa156283 100644 --- a/precompiles/vesting/events.go +++ b/precompiles/vesting/events.go @@ -7,9 +7,9 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" "github.com/evmos/evmos/v18/precompiles/authorization" cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/x/evm/core/vm" vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" ) diff --git a/precompiles/vesting/tx.go b/precompiles/vesting/tx.go index dfc63541d4..7b7ffc42b3 100644 --- a/precompiles/vesting/tx.go +++ b/precompiles/vesting/tx.go @@ -9,11 +9,10 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" - "github.com/evmos/evmos/v18/precompiles/authorization" cmn "github.com/evmos/evmos/v18/precompiles/common" "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v18/x/evm/core/vm" ) const ( diff --git a/precompiles/vesting/tx_test.go b/precompiles/vesting/tx_test.go index b11fb37895..a2e74e03c3 100644 --- a/precompiles/vesting/tx_test.go +++ b/precompiles/vesting/tx_test.go @@ -8,11 +8,12 @@ import ( "time" "cosmossdk.io/math" + "github.com/evmos/evmos/v18/precompiles/testutil" + "github.com/evmos/evmos/v18/x/evm/core/vm" + sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/ethereum/go-ethereum/core/vm" cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/precompiles/testutil" "github.com/evmos/evmos/v18/precompiles/vesting" evmosutil "github.com/evmos/evmos/v18/testutil" evmosutiltx "github.com/evmos/evmos/v18/testutil/tx" diff --git a/precompiles/vesting/vesting.go b/precompiles/vesting/vesting.go index fd0b366fc3..0113c944cf 100644 --- a/precompiles/vesting/vesting.go +++ b/precompiles/vesting/vesting.go @@ -15,8 +15,8 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/x/evm/core/vm" vestingkeeper "github.com/evmos/evmos/v18/x/vesting/keeper" ) diff --git a/precompiles/werc20/werc20.go b/precompiles/werc20/werc20.go index aebc9417dd..59802c846e 100644 --- a/precompiles/werc20/werc20.go +++ b/precompiles/werc20/werc20.go @@ -8,7 +8,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" + "github.com/evmos/evmos/v18/x/evm/core/vm" authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" diff --git a/rpc/backend/call_tx.go b/rpc/backend/call_tx.go index 84a83db798..9e72396706 100644 --- a/rpc/backend/call_tx.go +++ b/rpc/backend/call_tx.go @@ -15,9 +15,9 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" rpctypes "github.com/evmos/evmos/v18/rpc/types" "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v18/x/evm/core/vm" evmtypes "github.com/evmos/evmos/v18/x/evm/types" "github.com/pkg/errors" "google.golang.org/grpc/codes" diff --git a/scripts/license_checker/check_licenses.py b/scripts/license_checker/check_licenses.py index 3c431f42b2..ccd0326ab9 100644 --- a/scripts/license_checker/check_licenses.py +++ b/scripts/license_checker/check_licenses.py @@ -27,6 +27,7 @@ # List of folders that should be ignored. IGNORED_FOLDERS: List[str] = [ r"tests/solidity/node_modules", + r"x/evm/core", ] LGPL3_LICENSE = [ diff --git a/x/erc20/keeper/precompiles.go b/x/erc20/keeper/precompiles.go index 3ebc8eec3b..c1a243a63f 100644 --- a/x/erc20/keeper/precompiles.go +++ b/x/erc20/keeper/precompiles.go @@ -6,10 +6,10 @@ package keeper import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/ethereum/go-ethereum/core/vm" "github.com/evmos/evmos/v18/precompiles/erc20" "github.com/evmos/evmos/v18/precompiles/werc20" "github.com/evmos/evmos/v18/x/erc20/types" + "github.com/evmos/evmos/v18/x/evm/core/vm" ) // RegisterERC20Extensions registers the ERC20 precompiles with the EVM. diff --git a/x/erc20/types/interfaces.go b/x/erc20/types/interfaces.go index 4f5e321cb4..14eb8c866b 100644 --- a/x/erc20/types/interfaces.go +++ b/x/erc20/types/interfaces.go @@ -13,7 +13,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/vm" + "github.com/evmos/evmos/v18/x/evm/core/vm" "github.com/evmos/evmos/v18/x/evm/statedb" evmtypes "github.com/evmos/evmos/v18/x/evm/types" diff --git a/x/erc20/types/mocks/EVMKeeper.go b/x/erc20/types/mocks/EVMKeeper.go index f4a2b2bd81..356055dc3b 100644 --- a/x/erc20/types/mocks/EVMKeeper.go +++ b/x/erc20/types/mocks/EVMKeeper.go @@ -18,7 +18,7 @@ import ( types "github.com/cosmos/cosmos-sdk/types" - vm "github.com/ethereum/go-ethereum/core/vm" + vm "github.com/evmos/evmos/v18/x/evm/core/vm" ) // EVMKeeper is an autogenerated mock type for the EVMKeeper type diff --git a/x/evm/config/configurator.go b/x/evm/config/configurator.go new file mode 100644 index 0000000000..e7e7d01e74 --- /dev/null +++ b/x/evm/config/configurator.go @@ -0,0 +1,71 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) +// +// The config package provides a convinient way to modify x/evm params and values. +// Its primary purpose is to be used during application initialization. + +package config + +import ( + "fmt" + + "golang.org/x/exp/slices" + + "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v18/x/evm/types" +) + +// EVMConfigurator allows to extend x/evm module configurations. The configurator modifies +// the EVM before starting the node. This means that all init genesis validations will be +// applied to each change. +type EVMConfigurator struct { + extendedEIPs map[int]func(*vm.JumpTable) + extendedDefaultExtraEIPs []int64 + sealed bool +} + +// NewEVMConfigurator returns a pointer to a new EVMConfigurator object. +func NewEVMConfigurator() *EVMConfigurator { + return &EVMConfigurator{} +} + +// WithExtendedEips allows to add to the go-ethereum activators map the provided +// EIP activators. +func (ec *EVMConfigurator) WithExtendedEips(extendedEIPs map[int]func(*vm.JumpTable)) *EVMConfigurator { + ec.extendedEIPs = extendedEIPs + return ec +} + +// WithExtendedDefaultExtraEIPs update the x/evm DefaultExtraEIPs params +// by adding provided EIP numbers. +func (ec *EVMConfigurator) WithExtendedDefaultExtraEIPs(eips ...int64) *EVMConfigurator { + ec.extendedDefaultExtraEIPs = eips + return ec +} + +// Configure apply the changes to the virtual machine configuration. +func (ec *EVMConfigurator) Configure() error { + // If Configure method has been already used in the object, return + // an error to avoid overriding configuration. + if ec.sealed { + return fmt.Errorf("EVMConfigurator has been sealed and cannot be modified") + } + + if err := vm.ExtendActivators(ec.extendedEIPs); err != nil { + return err + } + + for _, eip := range ec.extendedDefaultExtraEIPs { + if slices.Contains(types.DefaultExtraEIPs, eip) { + return fmt.Errorf("EIP %d is already present in the default list: %v", eip, types.DefaultExtraEIPs) + } + + types.DefaultExtraEIPs = append(types.DefaultExtraEIPs, eip) + } + + // After applying modifier the configurator is sealed. This way, it is not possible + // to call the configure method twice. + ec.sealed = true + + return nil +} diff --git a/x/evm/config/configurator_test.go b/x/evm/config/configurator_test.go new file mode 100644 index 0000000000..be51df2895 --- /dev/null +++ b/x/evm/config/configurator_test.go @@ -0,0 +1,138 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package config_test + +import ( + "testing" + + "github.com/evmos/evmos/v18/x/evm/config" + "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/stretchr/testify/require" + + "github.com/evmos/evmos/v18/x/evm/types" +) + +func TestEVMConfigurator(t *testing.T) { + evmConfigurator := config.NewEVMConfigurator() + err := evmConfigurator.Configure() + require.NoError(t, err) + + err = evmConfigurator.Configure() + require.Error(t, err) + require.Contains(t, err.Error(), "has been sealed", "expected different error") +} + +func TestExtendedEips(t *testing.T) { + testCases := []struct { + name string + malleate func() *config.EVMConfigurator + expPass bool + errContains string + }{ + { + "fail - eip already present in activators return an error", + func() *config.EVMConfigurator { + extendedEIPs := map[int]func(*vm.JumpTable){ + 3855: func(_ *vm.JumpTable) {}, + } + ec := config.NewEVMConfigurator().WithExtendedEips(extendedEIPs) + return ec + }, + false, + "duplicate activation", + }, + { + "success - new default extra eips without duplication added", + func() *config.EVMConfigurator { + extendedEIPs := map[int]func(*vm.JumpTable){ + 0o000: func(_ *vm.JumpTable) {}, + } + ec := config.NewEVMConfigurator().WithExtendedEips(extendedEIPs) + return ec + }, + true, + "", + }, + } + + for _, tc := range testCases { + ec := tc.malleate() + err := ec.Configure() + + if tc.expPass { + require.NoError(t, err) + } else { + require.Error(t, err) + require.Contains(t, err.Error(), tc.errContains, "expected different error") + } + } +} + +func TestExtendedDefaultExtraEips(t *testing.T) { + defaultExtraEIPsSnapshot := types.DefaultExtraEIPs + testCases := []struct { + name string + malleate func() *config.EVMConfigurator + postCheck func() + expPass bool + errContains string + }{ + { + "fail - duplicate default EIP entiries", + func() *config.EVMConfigurator { + extendedDefaultExtraEIPs := []int64{1_000} + types.DefaultExtraEIPs = append(types.DefaultExtraEIPs, 1_000) + ec := config.NewEVMConfigurator().WithExtendedDefaultExtraEIPs(extendedDefaultExtraEIPs...) + return ec + }, + func() { + require.ElementsMatch(t, append(defaultExtraEIPsSnapshot, 1_000), types.DefaultExtraEIPs) + types.DefaultExtraEIPs = defaultExtraEIPsSnapshot + }, + false, + "EIP 1000 is already present", + }, + { + "success - empty default extra eip", + func() *config.EVMConfigurator { + var extendedDefaultExtraEIPs []int64 + ec := config.NewEVMConfigurator().WithExtendedDefaultExtraEIPs(extendedDefaultExtraEIPs...) + return ec + }, + func() { + require.ElementsMatch(t, defaultExtraEIPsSnapshot, types.DefaultExtraEIPs) + }, + true, + "", + }, + { + "success - extra default eip added", + func() *config.EVMConfigurator { + extendedDefaultExtraEIPs := []int64{1_001} + ec := config.NewEVMConfigurator().WithExtendedDefaultExtraEIPs(extendedDefaultExtraEIPs...) + return ec + }, + func() { + require.ElementsMatch(t, append(defaultExtraEIPsSnapshot, 1_001), types.DefaultExtraEIPs) + types.DefaultExtraEIPs = defaultExtraEIPsSnapshot + }, + true, + "", + }, + } + + for _, tc := range testCases { + ec := tc.malleate() + err := ec.Configure() + + if tc.expPass { + require.NoError(t, err) + } else { + require.Error(t, err) + require.Contains(t, err.Error(), tc.errContains, "expected different error") + } + + tc.postCheck() + } +} diff --git a/x/evm/core/core/utils.go b/x/evm/core/core/utils.go new file mode 100644 index 0000000000..4d9d5601c8 --- /dev/null +++ b/x/evm/core/core/utils.go @@ -0,0 +1,46 @@ +package core + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/evmos/evmos/v18/x/evm/core/vm" +) + +// CanTransfer checks whether there are enough funds in the address' account to make a transfer. +// This does not take the necessary gas in to account to make the transfer valid. +func CanTransfer(db vm.StateDB, addr common.Address, amount *big.Int) bool { + return db.GetBalance(addr).Cmp(amount) >= 0 +} + +// Transfer subtracts amount from sender and adds amount to recipient using the given Db +func Transfer(db vm.StateDB, sender, recipient common.Address, amount *big.Int) { + db.SubBalance(sender, amount) + db.AddBalance(recipient, amount) +} + +// Message represents a message sent to a contract. +type Message interface { + From() common.Address + To() *common.Address + + GasPrice() *big.Int + GasFeeCap() *big.Int + GasTipCap() *big.Int + Gas() uint64 + Value() *big.Int + + Nonce() uint64 + IsFake() bool + Data() []byte + AccessList() types.AccessList +} + +// NewEVMTxContext creates a new transaction context for a single transaction. +func NewEVMTxContext(msg Message) vm.TxContext { + return vm.TxContext{ + Origin: msg.From(), + GasPrice: new(big.Int).Set(msg.GasPrice()), + } +} diff --git a/x/evm/core/logger/access_list_tracer.go b/x/evm/core/logger/access_list_tracer.go new file mode 100644 index 0000000000..2d5105233d --- /dev/null +++ b/x/evm/core/logger/access_list_tracer.go @@ -0,0 +1,168 @@ +package logger + +import ( + "math/big" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/evmos/evmos/v18/x/evm/core/vm" +) + +// accessList is an accumulator for the set of accounts and storage slots an EVM +// contract execution touches. +type accessList map[common.Address]accessListSlots + +// accessListSlots is an accumulator for the set of storage slots within a single +// contract that an EVM contract execution touches. +type accessListSlots map[common.Hash]struct{} + +// newAccessList creates a new accessList. +func newAccessList() accessList { + return make(map[common.Address]accessListSlots) +} + +// addAddress adds an address to the accesslist. +func (al accessList) addAddress(address common.Address) { + // Set address if not previously present + if _, present := al[address]; !present { + al[address] = make(map[common.Hash]struct{}) + } +} + +// addSlot adds a storage slot to the accesslist. +func (al accessList) addSlot(address common.Address, slot common.Hash) { + // Set address if not previously present + al.addAddress(address) + + // Set the slot on the surely existent storage set + al[address][slot] = struct{}{} +} + +// equal checks if the content of the current access list is the same as the +// content of the other one. +func (al accessList) equal(other accessList) bool { + // Cross reference the accounts first + if len(al) != len(other) { + return false + } + // Given that len(al) == len(other), we only need to check that + // all the items from al are in other. + for addr := range al { + if _, ok := other[addr]; !ok { + return false + } + } + + // Accounts match, cross reference the storage slots too + for addr, slots := range al { + otherslots := other[addr] + + if len(slots) != len(otherslots) { + return false + } + // Given that len(slots) == len(otherslots), we only need to check that + // all the items from slots are in otherslots. + for hash := range slots { + if _, ok := otherslots[hash]; !ok { + return false + } + } + } + return true +} + +// accesslist converts the accesslist to a types.AccessList. +func (al accessList) accessList() types.AccessList { + acl := make(types.AccessList, 0, len(al)) + for addr, slots := range al { + tuple := types.AccessTuple{Address: addr, StorageKeys: []common.Hash{}} + for slot := range slots { + tuple.StorageKeys = append(tuple.StorageKeys, slot) + } + acl = append(acl, tuple) + } + return acl +} + +// AccessListTracer is a tracer that accumulates touched accounts and storage +// slots into an internal set. +type AccessListTracer struct { + excl map[common.Address]struct{} // Set of account to exclude from the list + list accessList // Set of accounts and storage slots touched +} + +// NewAccessListTracer creates a new tracer that can generate AccessLists. +// An optional AccessList can be specified to occupy slots and addresses in +// the resulting accesslist. +func NewAccessListTracer(acl types.AccessList, from, to common.Address, precompiles []common.Address) *AccessListTracer { + excl := map[common.Address]struct{}{ + from: {}, to: {}, + } + for _, addr := range precompiles { + excl[addr] = struct{}{} + } + list := newAccessList() + for _, al := range acl { + if _, ok := excl[al.Address]; !ok { + list.addAddress(al.Address) + } + for _, slot := range al.StorageKeys { + list.addSlot(al.Address, slot) + } + } + return &AccessListTracer{ + excl: excl, + list: list, + } +} + +func (a *AccessListTracer) CaptureStart(env *vm.EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) { +} + +// CaptureState captures all opcodes that touch storage or addresses and adds them to the accesslist. +func (a *AccessListTracer) CaptureState(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, depth int, err error) { + stack := scope.Stack + stackData := stack.Data + stackLen := len(stackData) + if (op == vm.SLOAD || op == vm.SSTORE) && stackLen >= 1 { + slot := common.Hash(stackData[stackLen-1].Bytes32()) + a.list.addSlot(scope.Contract.Address(), slot) + } + if (op == vm.EXTCODECOPY || op == vm.EXTCODEHASH || op == vm.EXTCODESIZE || op == vm.BALANCE || op == vm.SELFDESTRUCT) && stackLen >= 1 { + addr := common.Address(stackData[stackLen-1].Bytes20()) + if _, ok := a.excl[addr]; !ok { + a.list.addAddress(addr) + } + } + if (op == vm.DELEGATECALL || op == vm.CALL || op == vm.STATICCALL || op == vm.CALLCODE) && stackLen >= 5 { + addr := common.Address(stackData[stackLen-2].Bytes20()) + if _, ok := a.excl[addr]; !ok { + a.list.addAddress(addr) + } + } +} + +func (*AccessListTracer) CaptureFault(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, depth int, err error) { +} + +func (*AccessListTracer) CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) {} + +func (*AccessListTracer) CaptureEnter(typ vm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) { +} + +func (*AccessListTracer) CaptureExit(output []byte, gasUsed uint64, err error) {} + +func (*AccessListTracer) CaptureTxStart(gasLimit uint64) {} + +func (*AccessListTracer) CaptureTxEnd(restGas uint64) {} + +// AccessList returns the current accesslist maintained by the tracer. +func (a *AccessListTracer) AccessList() types.AccessList { + return a.list.accessList() +} + +// Equal returns if the content of two access list traces are equal. +func (a *AccessListTracer) Equal(other *AccessListTracer) bool { + return a.list.equal(other.list) +} diff --git a/x/evm/core/logger/logger.go b/x/evm/core/logger/logger.go new file mode 100644 index 0000000000..3ddb1703f3 --- /dev/null +++ b/x/evm/core/logger/logger.go @@ -0,0 +1,448 @@ +package logger + +import ( + "encoding/hex" + "encoding/json" + "fmt" + "io" + "math/big" + "strings" + "sync/atomic" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/params" + "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/holiman/uint256" +) + +// Storage represents a contract's storage. +type Storage map[common.Hash]common.Hash + +// Copy duplicates the current storage. +func (s Storage) Copy() Storage { + cpy := make(Storage, len(s)) + for key, value := range s { + cpy[key] = value + } + return cpy +} + +// Config are the configuration options for structured logger the EVM +type Config struct { + EnableMemory bool // enable memory capture + DisableStack bool // disable stack capture + DisableStorage bool // disable storage capture + EnableReturnData bool // enable return data capture + Debug bool // print output during capture end + Limit int // maximum length of output, but zero means unlimited + // Chain overrides, can be used to execute a trace using future fork rules + Overrides *params.ChainConfig `json:"overrides,omitempty"` +} + +//go:generate go run github.com/fjl/gencodec -type StructLog -field-override structLogMarshaling -out gen_structlog.go + +// StructLog is emitted to the EVM each cycle and lists information about the current internal state +// prior to the execution of the statement. +type StructLog struct { + Pc uint64 `json:"pc"` + Op vm.OpCode `json:"op"` + Gas uint64 `json:"gas"` + GasCost uint64 `json:"gasCost"` + Memory []byte `json:"memory,omitempty"` + MemorySize int `json:"memSize"` + Stack []uint256.Int `json:"stack"` + ReturnData []byte `json:"returnData,omitempty"` + Storage map[common.Hash]common.Hash `json:"-"` + Depth int `json:"depth"` + RefundCounter uint64 `json:"refund"` + Err error `json:"-"` +} + +// overrides for gencodec +type structLogMarshaling struct { + Gas math.HexOrDecimal64 + GasCost math.HexOrDecimal64 + Memory hexutil.Bytes + ReturnData hexutil.Bytes + OpName string `json:"opName"` // adds call to OpName() in MarshalJSON + ErrorString string `json:"error,omitempty"` // adds call to ErrorString() in MarshalJSON +} + +// OpName formats the operand name in a human-readable format. +func (s *StructLog) OpName() string { + return s.Op.String() +} + +// ErrorString formats the log's error as a string. +func (s *StructLog) ErrorString() string { + if s.Err != nil { + return s.Err.Error() + } + return "" +} + +// StructLogger is an EVM state logger and implements EVMLogger. +// +// StructLogger can capture state based on the given Log configuration and also keeps +// a track record of modified storage which is used in reporting snapshots of the +// contract their storage. +type StructLogger struct { + cfg Config + env *vm.EVM + + storage map[common.Address]Storage + logs []StructLog + output []byte + err error + gasLimit uint64 + usedGas uint64 + + interrupt uint32 // Atomic flag to signal execution interruption + reason error // Textual reason for the interruption +} + +// NewStructLogger returns a new logger +func NewStructLogger(cfg *Config) *StructLogger { + logger := &StructLogger{ + storage: make(map[common.Address]Storage), + } + if cfg != nil { + logger.cfg = *cfg + } + return logger +} + +// Reset clears the data held by the logger. +func (l *StructLogger) Reset() { + l.storage = make(map[common.Address]Storage) + l.output = make([]byte, 0) + l.logs = l.logs[:0] + l.err = nil +} + +// CaptureStart implements the EVMLogger interface to initialize the tracing operation. +func (l *StructLogger) CaptureStart(env *vm.EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) { + l.env = env +} + +// CaptureState logs a new structured log message and pushes it out to the environment +// +// CaptureState also tracks SLOAD/SSTORE ops to track storage change. +func (l *StructLogger) CaptureState(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, depth int, err error) { + // If tracing was interrupted, set the error and stop + if atomic.LoadUint32(&l.interrupt) > 0 { + l.env.Cancel() + return + } + // check if already accumulated the specified number of logs + if l.cfg.Limit != 0 && l.cfg.Limit <= len(l.logs) { + return + } + + memory := scope.Memory + stack := scope.Stack + contract := scope.Contract + // Copy a snapshot of the current memory state to a new buffer + var mem []byte + if l.cfg.EnableMemory { + mem = make([]byte, len(memory.Data())) + copy(mem, memory.Data()) + } + // Copy a snapshot of the current stack state to a new buffer + var stck []uint256.Int + if !l.cfg.DisableStack { + stck = make([]uint256.Int, len(stack.Data)) + for i, item := range stack.Data { + stck[i] = item + } + } + stackData := stack.Data + stackLen := len(stackData) + // Copy a snapshot of the current storage to a new container + var storage Storage + if !l.cfg.DisableStorage && (op == vm.SLOAD || op == vm.SSTORE) { + // initialise new changed values storage container for this contract + // if not present. + if l.storage[contract.Address()] == nil { + l.storage[contract.Address()] = make(Storage) + } + // capture SLOAD opcodes and record the read entry in the local storage + if op == vm.SLOAD && stackLen >= 1 { + var ( + address = common.Hash(stackData[stackLen-1].Bytes32()) + value = l.env.StateDB.GetState(contract.Address(), address) + ) + l.storage[contract.Address()][address] = value + storage = l.storage[contract.Address()].Copy() + } else if op == vm.SSTORE && stackLen >= 2 { + // capture SSTORE opcodes and record the written entry in the local storage. + var ( + value = common.Hash(stackData[stackLen-2].Bytes32()) + address = common.Hash(stackData[stackLen-1].Bytes32()) + ) + l.storage[contract.Address()][address] = value + storage = l.storage[contract.Address()].Copy() + } + } + var rdata []byte + if l.cfg.EnableReturnData { + rdata = make([]byte, len(rData)) + copy(rdata, rData) + } + // create a new snapshot of the EVM. + log := StructLog{pc, op, gas, cost, mem, memory.Len(), stck, rdata, storage, depth, l.env.StateDB.GetRefund(), err} + l.logs = append(l.logs, log) +} + +// CaptureFault implements the EVMLogger interface to trace an execution fault +// while running an opcode. +func (l *StructLogger) CaptureFault(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, depth int, err error) { +} + +// CaptureEnd is called after the call finishes to finalize the tracing. +func (l *StructLogger) CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) { + l.output = output + l.err = err + if l.cfg.Debug { + fmt.Printf("%#x\n", output) + if err != nil { + fmt.Printf(" error: %v\n", err) + } + } +} + +func (l *StructLogger) CaptureEnter(typ vm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) { +} + +func (l *StructLogger) CaptureExit(output []byte, gasUsed uint64, err error) { +} + +func (l *StructLogger) GetResult() (json.RawMessage, error) { + // Tracing aborted + if l.reason != nil { + return nil, l.reason + } + failed := l.err != nil + returnData := common.CopyBytes(l.output) + // Return data when successful and revert reason when reverted, otherwise empty. + returnVal := fmt.Sprintf("%x", returnData) + if failed && l.err != vm.ErrExecutionReverted { + returnVal = "" + } + return json.Marshal(&ExecutionResult{ + Gas: l.usedGas, + Failed: failed, + ReturnValue: returnVal, + StructLogs: formatLogs(l.StructLogs()), + }) +} + +// Stop terminates execution of the tracer at the first opportune moment. +func (l *StructLogger) Stop(err error) { + l.reason = err + atomic.StoreUint32(&l.interrupt, 1) +} + +func (l *StructLogger) CaptureTxStart(gasLimit uint64) { + l.gasLimit = gasLimit +} + +func (l *StructLogger) CaptureTxEnd(restGas uint64) { + l.usedGas = l.gasLimit - restGas +} + +// StructLogs returns the captured log entries. +func (l *StructLogger) StructLogs() []StructLog { return l.logs } + +// Error returns the VM error captured by the trace. +func (l *StructLogger) Error() error { return l.err } + +// Output returns the VM return value captured by the trace. +func (l *StructLogger) Output() []byte { return l.output } + +// WriteTrace writes a formatted trace to the given writer +func WriteTrace(writer io.Writer, logs []StructLog) { + for _, log := range logs { + fmt.Fprintf(writer, "%-16spc=%08d gas=%v cost=%v", log.Op, log.Pc, log.Gas, log.GasCost) + if log.Err != nil { + fmt.Fprintf(writer, " ERROR: %v", log.Err) + } + fmt.Fprintln(writer) + + if len(log.Stack) > 0 { + fmt.Fprintln(writer, "Stack:") + for i := len(log.Stack) - 1; i >= 0; i-- { + fmt.Fprintf(writer, "%08d %s\n", len(log.Stack)-i-1, log.Stack[i].Hex()) + } + } + if len(log.Memory) > 0 { + fmt.Fprintln(writer, "Memory:") + fmt.Fprint(writer, hex.Dump(log.Memory)) + } + if len(log.Storage) > 0 { + fmt.Fprintln(writer, "Storage:") + for h, item := range log.Storage { + fmt.Fprintf(writer, "%x: %x\n", h, item) + } + } + if len(log.ReturnData) > 0 { + fmt.Fprintln(writer, "ReturnData:") + fmt.Fprint(writer, hex.Dump(log.ReturnData)) + } + fmt.Fprintln(writer) + } +} + +// WriteLogs writes vm logs in a readable format to the given writer +func WriteLogs(writer io.Writer, logs []*types.Log) { + for _, log := range logs { + fmt.Fprintf(writer, "LOG%d: %x bn=%d txi=%x\n", len(log.Topics), log.Address, log.BlockNumber, log.TxIndex) + + for i, topic := range log.Topics { + fmt.Fprintf(writer, "%08d %x\n", i, topic) + } + + fmt.Fprint(writer, hex.Dump(log.Data)) + fmt.Fprintln(writer) + } +} + +type mdLogger struct { + out io.Writer + cfg *Config + env *vm.EVM +} + +// NewMarkdownLogger creates a logger which outputs information in a format adapted +// for human readability, and is also a valid markdown table +func NewMarkdownLogger(cfg *Config, writer io.Writer) *mdLogger { + l := &mdLogger{out: writer, cfg: cfg} + if l.cfg == nil { + l.cfg = &Config{} + } + return l +} + +func (t *mdLogger) CaptureStart(env *vm.EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) { + t.env = env + if !create { + fmt.Fprintf(t.out, "From: `%v`\nTo: `%v`\nData: `%#x`\nGas: `%d`\nValue `%v` wei\n", + from.String(), to.String(), + input, gas, value) + } else { + fmt.Fprintf(t.out, "From: `%v`\nCreate at: `%v`\nData: `%#x`\nGas: `%d`\nValue `%v` wei\n", + from.String(), to.String(), + input, gas, value) + } + + fmt.Fprintf(t.out, ` +| Pc | Op | Cost | Stack | RStack | Refund | +|-------|-------------|------|-----------|-----------|---------| +`) +} + +// CaptureState also tracks SLOAD/SSTORE ops to track storage change. +func (t *mdLogger) CaptureState(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, depth int, err error) { + stack := scope.Stack + fmt.Fprintf(t.out, "| %4d | %10v | %3d |", pc, op, cost) + + if !t.cfg.DisableStack { + // format stack + var a []string + for _, elem := range stack.Data { + a = append(a, elem.Hex()) + } + b := fmt.Sprintf("[%v]", strings.Join(a, ",")) + fmt.Fprintf(t.out, "%10v |", b) + } + fmt.Fprintf(t.out, "%10v |", t.env.StateDB.GetRefund()) + fmt.Fprintln(t.out, "") + if err != nil { + fmt.Fprintf(t.out, "Error: %v\n", err) + } +} + +func (t *mdLogger) CaptureFault(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, depth int, err error) { + fmt.Fprintf(t.out, "\nError: at pc=%d, op=%v: %v\n", pc, op, err) +} + +func (t *mdLogger) CaptureEnd(output []byte, gasUsed uint64, tm time.Duration, err error) { + fmt.Fprintf(t.out, "\nOutput: `%#x`\nConsumed gas: `%d`\nError: `%v`\n", + output, gasUsed, err) +} + +func (t *mdLogger) CaptureEnter(typ vm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) { +} + +func (t *mdLogger) CaptureExit(output []byte, gasUsed uint64, err error) {} + +func (*mdLogger) CaptureTxStart(gasLimit uint64) {} + +func (*mdLogger) CaptureTxEnd(restGas uint64) {} + +// ExecutionResult groups all structured logs emitted by the EVM +// while replaying a transaction in debug mode as well as transaction +// execution status, the amount of gas used and the return value +type ExecutionResult struct { + Gas uint64 `json:"gas"` + Failed bool `json:"failed"` + ReturnValue string `json:"returnValue"` + StructLogs []StructLogRes `json:"structLogs"` +} + +// StructLogRes stores a structured log emitted by the EVM while replaying a +// transaction in debug mode +type StructLogRes struct { + Pc uint64 `json:"pc"` + Op string `json:"op"` + Gas uint64 `json:"gas"` + GasCost uint64 `json:"gasCost"` + Depth int `json:"depth"` + Error string `json:"error,omitempty"` + Stack *[]string `json:"stack,omitempty"` + Memory *[]string `json:"memory,omitempty"` + Storage *map[string]string `json:"storage,omitempty"` + RefundCounter uint64 `json:"refund,omitempty"` +} + +// formatLogs formats EVM returned structured logs for json output +func formatLogs(logs []StructLog) []StructLogRes { + formatted := make([]StructLogRes, len(logs)) + for index, trace := range logs { + formatted[index] = StructLogRes{ + Pc: trace.Pc, + Op: trace.Op.String(), + Gas: trace.Gas, + GasCost: trace.GasCost, + Depth: trace.Depth, + Error: trace.ErrorString(), + RefundCounter: trace.RefundCounter, + } + if trace.Stack != nil { + stack := make([]string, len(trace.Stack)) + for i, stackValue := range trace.Stack { + stack[i] = stackValue.Hex() + } + formatted[index].Stack = &stack + } + if trace.Memory != nil { + memory := make([]string, 0, (len(trace.Memory)+31)/32) + for i := 0; i+32 <= len(trace.Memory); i += 32 { + memory = append(memory, fmt.Sprintf("%x", trace.Memory[i:i+32])) + } + formatted[index].Memory = &memory + } + if trace.Storage != nil { + storage := make(map[string]string) + for i, storageValue := range trace.Storage { + storage[fmt.Sprintf("%x", i)] = fmt.Sprintf("%x", storageValue) + } + formatted[index].Storage = &storage + } + } + return formatted +} diff --git a/x/evm/core/logger/logger_json.go b/x/evm/core/logger/logger_json.go new file mode 100644 index 0000000000..5616be868c --- /dev/null +++ b/x/evm/core/logger/logger_json.go @@ -0,0 +1,88 @@ +package logger + +import ( + "encoding/json" + "io" + "math/big" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" + "github.com/evmos/evmos/v18/x/evm/core/vm" +) + +type JSONLogger struct { + encoder *json.Encoder + cfg *Config + env *vm.EVM +} + +// NewJSONLogger creates a new EVM tracer that prints execution steps as JSON objects +// into the provided stream. +func NewJSONLogger(cfg *Config, writer io.Writer) *JSONLogger { + l := &JSONLogger{encoder: json.NewEncoder(writer), cfg: cfg} + if l.cfg == nil { + l.cfg = &Config{} + } + return l +} + +func (l *JSONLogger) CaptureStart(env *vm.EVM, from, to common.Address, create bool, input []byte, gas uint64, value *big.Int) { + l.env = env +} + +func (l *JSONLogger) CaptureFault(pc uint64, op vm.OpCode, gas uint64, cost uint64, scope *vm.ScopeContext, depth int, err error) { + // TODO: Add rData to this interface as well + l.CaptureState(pc, op, gas, cost, scope, nil, depth, err) +} + +// CaptureState outputs state information on the logger. +func (l *JSONLogger) CaptureState(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, depth int, err error) { + memory := scope.Memory + stack := scope.Stack + + log := StructLog{ + Pc: pc, + Op: op, + Gas: gas, + GasCost: cost, + MemorySize: memory.Len(), + Depth: depth, + RefundCounter: l.env.StateDB.GetRefund(), + Err: err, + } + if l.cfg.EnableMemory { + log.Memory = memory.Data() + } + if !l.cfg.DisableStack { + log.Stack = stack.Data + } + if l.cfg.EnableReturnData { + log.ReturnData = rData + } + l.encoder.Encode(log) +} + +// CaptureEnd is triggered at end of execution. +func (l *JSONLogger) CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) { + type endLog struct { + Output string `json:"output"` + GasUsed math.HexOrDecimal64 `json:"gasUsed"` + Time time.Duration `json:"time"` + Err string `json:"error,omitempty"` + } + var errMsg string + if err != nil { + errMsg = err.Error() + } + l.encoder.Encode(endLog{common.Bytes2Hex(output), math.HexOrDecimal64(gasUsed), t, errMsg}) +} + +func (l *JSONLogger) CaptureEnter(typ vm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) { +} + +func (l *JSONLogger) CaptureExit(output []byte, gasUsed uint64, err error) {} + +func (l *JSONLogger) CaptureTxStart(gasLimit uint64) {} + +func (l *JSONLogger) CaptureTxEnd(restGas uint64) {} diff --git a/x/evm/core/tracers/js/bigint.go b/x/evm/core/tracers/js/bigint.go new file mode 100644 index 0000000000..9aeb330420 --- /dev/null +++ b/x/evm/core/tracers/js/bigint.go @@ -0,0 +1,20 @@ +// Copyright 2021 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package js + +// bigIntegerJS is the minified version of https://github.com/peterolson/BigInteger.js. +const bigIntegerJS = `var bigInt=function(undefined){"use strict";var BASE=1e7,LOG_BASE=7,MAX_INT=9007199254740992,MAX_INT_ARR=smallToArray(MAX_INT),LOG_MAX_INT=Math.log(MAX_INT);function Integer(v,radix){if(typeof v==="undefined")return Integer[0];if(typeof radix!=="undefined")return+radix===10?parseValue(v):parseBase(v,radix);return parseValue(v)}function BigInteger(value,sign){this.value=value;this.sign=sign;this.isSmall=false}BigInteger.prototype=Object.create(Integer.prototype);function SmallInteger(value){this.value=value;this.sign=value<0;this.isSmall=true}SmallInteger.prototype=Object.create(Integer.prototype);function isPrecise(n){return-MAX_INT0)return Math.floor(n);return Math.ceil(n)}function add(a,b){var l_a=a.length,l_b=b.length,r=new Array(l_a),carry=0,base=BASE,sum,i;for(i=0;i=base?1:0;r[i]=sum-carry*base}while(i0)r.push(carry);return r}function addAny(a,b){if(a.length>=b.length)return add(a,b);return add(b,a)}function addSmall(a,carry){var l=a.length,r=new Array(l),base=BASE,sum,i;for(i=0;i0){r[i++]=carry%base;carry=Math.floor(carry/base)}return r}BigInteger.prototype.add=function(v){var n=parseValue(v);if(this.sign!==n.sign){return this.subtract(n.negate())}var a=this.value,b=n.value;if(n.isSmall){return new BigInteger(addSmall(a,Math.abs(b)),this.sign)}return new BigInteger(addAny(a,b),this.sign)};BigInteger.prototype.plus=BigInteger.prototype.add;SmallInteger.prototype.add=function(v){var n=parseValue(v);var a=this.value;if(a<0!==n.sign){return this.subtract(n.negate())}var b=n.value;if(n.isSmall){if(isPrecise(a+b))return new SmallInteger(a+b);b=smallToArray(Math.abs(b))}return new BigInteger(addSmall(b,Math.abs(a)),a<0)};SmallInteger.prototype.plus=SmallInteger.prototype.add;function subtract(a,b){var a_l=a.length,b_l=b.length,r=new Array(a_l),borrow=0,base=BASE,i,difference;for(i=0;i=0){value=subtract(a,b)}else{value=subtract(b,a);sign=!sign}value=arrayToSmall(value);if(typeof value==="number"){if(sign)value=-value;return new SmallInteger(value)}return new BigInteger(value,sign)}function subtractSmall(a,b,sign){var l=a.length,r=new Array(l),carry=-b,base=BASE,i,difference;for(i=0;i=0)};SmallInteger.prototype.minus=SmallInteger.prototype.subtract;BigInteger.prototype.negate=function(){return new BigInteger(this.value,!this.sign)};SmallInteger.prototype.negate=function(){var sign=this.sign;var small=new SmallInteger(-this.value);small.sign=!sign;return small};BigInteger.prototype.abs=function(){return new BigInteger(this.value,false)};SmallInteger.prototype.abs=function(){return new SmallInteger(Math.abs(this.value))};function multiplyLong(a,b){var a_l=a.length,b_l=b.length,l=a_l+b_l,r=createArray(l),base=BASE,product,carry,i,a_i,b_j;for(i=0;i0){r[i++]=carry%base;carry=Math.floor(carry/base)}return r}function shiftLeft(x,n){var r=[];while(n-- >0)r.push(0);return r.concat(x)}function multiplyKaratsuba(x,y){var n=Math.max(x.length,y.length);if(n<=30)return multiplyLong(x,y);n=Math.ceil(n/2);var b=x.slice(n),a=x.slice(0,n),d=y.slice(n),c=y.slice(0,n);var ac=multiplyKaratsuba(a,c),bd=multiplyKaratsuba(b,d),abcd=multiplyKaratsuba(addAny(a,b),addAny(c,d));var product=addAny(addAny(ac,shiftLeft(subtract(subtract(abcd,ac),bd),n)),shiftLeft(bd,2*n));trim(product);return product}function useKaratsuba(l1,l2){return-.012*l1-.012*l2+15e-6*l1*l2>0}BigInteger.prototype.multiply=function(v){var n=parseValue(v),a=this.value,b=n.value,sign=this.sign!==n.sign,abs;if(n.isSmall){if(b===0)return Integer[0];if(b===1)return this;if(b===-1)return this.negate();abs=Math.abs(b);if(abs=0;shift--){quotientDigit=base-1;if(remainder[shift+b_l]!==divisorMostSignificantDigit){quotientDigit=Math.floor((remainder[shift+b_l]*base+remainder[shift+b_l-1])/divisorMostSignificantDigit)}carry=0;borrow=0;l=divisor.length;for(i=0;ib_l){highx=(highx+1)*base}guess=Math.ceil(highx/highy);do{check=multiplySmall(b,guess);if(compareAbs(check,part)<=0)break;guess--}while(guess);result.push(guess);part=subtract(part,check)}result.reverse();return[arrayToSmall(result),arrayToSmall(part)]}function divModSmall(value,lambda){var length=value.length,quotient=createArray(length),base=BASE,i,q,remainder,divisor;remainder=0;for(i=length-1;i>=0;--i){divisor=remainder*base+value[i];q=truncate(divisor/lambda);remainder=divisor-q*lambda;quotient[i]=q|0}return[quotient,remainder|0]}function divModAny(self,v){var value,n=parseValue(v);var a=self.value,b=n.value;var quotient;if(b===0)throw new Error("Cannot divide by zero");if(self.isSmall){if(n.isSmall){return[new SmallInteger(truncate(a/b)),new SmallInteger(a%b)]}return[Integer[0],self]}if(n.isSmall){if(b===1)return[self,Integer[0]];if(b==-1)return[self.negate(),Integer[0]];var abs=Math.abs(b);if(absb.length?1:-1}for(var i=a.length-1;i>=0;i--){if(a[i]!==b[i])return a[i]>b[i]?1:-1}return 0}BigInteger.prototype.compareAbs=function(v){var n=parseValue(v),a=this.value,b=n.value;if(n.isSmall)return 1;return compareAbs(a,b)};SmallInteger.prototype.compareAbs=function(v){var n=parseValue(v),a=Math.abs(this.value),b=n.value;if(n.isSmall){b=Math.abs(b);return a===b?0:a>b?1:-1}return-1};BigInteger.prototype.compare=function(v){if(v===Infinity){return-1}if(v===-Infinity){return 1}var n=parseValue(v),a=this.value,b=n.value;if(this.sign!==n.sign){return n.sign?1:-1}if(n.isSmall){return this.sign?-1:1}return compareAbs(a,b)*(this.sign?-1:1)};BigInteger.prototype.compareTo=BigInteger.prototype.compare;SmallInteger.prototype.compare=function(v){if(v===Infinity){return-1}if(v===-Infinity){return 1}var n=parseValue(v),a=this.value,b=n.value;if(n.isSmall){return a==b?0:a>b?1:-1}if(a<0!==n.sign){return a<0?-1:1}return a<0?1:-1};SmallInteger.prototype.compareTo=SmallInteger.prototype.compare;BigInteger.prototype.equals=function(v){return this.compare(v)===0};SmallInteger.prototype.eq=SmallInteger.prototype.equals=BigInteger.prototype.eq=BigInteger.prototype.equals;BigInteger.prototype.notEquals=function(v){return this.compare(v)!==0};SmallInteger.prototype.neq=SmallInteger.prototype.notEquals=BigInteger.prototype.neq=BigInteger.prototype.notEquals;BigInteger.prototype.greater=function(v){return this.compare(v)>0};SmallInteger.prototype.gt=SmallInteger.prototype.greater=BigInteger.prototype.gt=BigInteger.prototype.greater;BigInteger.prototype.lesser=function(v){return this.compare(v)<0};SmallInteger.prototype.lt=SmallInteger.prototype.lesser=BigInteger.prototype.lt=BigInteger.prototype.lesser;BigInteger.prototype.greaterOrEquals=function(v){return this.compare(v)>=0};SmallInteger.prototype.geq=SmallInteger.prototype.greaterOrEquals=BigInteger.prototype.geq=BigInteger.prototype.greaterOrEquals;BigInteger.prototype.lesserOrEquals=function(v){return this.compare(v)<=0};SmallInteger.prototype.leq=SmallInteger.prototype.lesserOrEquals=BigInteger.prototype.leq=BigInteger.prototype.lesserOrEquals;BigInteger.prototype.isEven=function(){return(this.value[0]&1)===0};SmallInteger.prototype.isEven=function(){return(this.value&1)===0};BigInteger.prototype.isOdd=function(){return(this.value[0]&1)===1};SmallInteger.prototype.isOdd=function(){return(this.value&1)===1};BigInteger.prototype.isPositive=function(){return!this.sign};SmallInteger.prototype.isPositive=function(){return this.value>0};BigInteger.prototype.isNegative=function(){return this.sign};SmallInteger.prototype.isNegative=function(){return this.value<0};BigInteger.prototype.isUnit=function(){return false};SmallInteger.prototype.isUnit=function(){return Math.abs(this.value)===1};BigInteger.prototype.isZero=function(){return false};SmallInteger.prototype.isZero=function(){return this.value===0};BigInteger.prototype.isDivisibleBy=function(v){var n=parseValue(v);var value=n.value;if(value===0)return false;if(value===1)return true;if(value===2)return this.isEven();return this.mod(n).equals(Integer[0])};SmallInteger.prototype.isDivisibleBy=BigInteger.prototype.isDivisibleBy;function isBasicPrime(v){var n=v.abs();if(n.isUnit())return false;if(n.equals(2)||n.equals(3)||n.equals(5))return true;if(n.isEven()||n.isDivisibleBy(3)||n.isDivisibleBy(5))return false;if(n.lesser(25))return true}BigInteger.prototype.isPrime=function(){var isPrime=isBasicPrime(this);if(isPrime!==undefined)return isPrime;var n=this.abs(),nPrev=n.prev();var a=[2,3,5,7,11,13,17,19],b=nPrev,d,t,i,x;while(b.isEven())b=b.divide(2);for(i=0;i-MAX_INT)return new SmallInteger(value-1);return new BigInteger(MAX_INT_ARR,true)};var powersOfTwo=[1];while(2*powersOfTwo[powersOfTwo.length-1]<=BASE)powersOfTwo.push(2*powersOfTwo[powersOfTwo.length-1]);var powers2Length=powersOfTwo.length,highestPower2=powersOfTwo[powers2Length-1];function shift_isSmall(n){return(typeof n==="number"||typeof n==="string")&&+Math.abs(n)<=BASE||n instanceof BigInteger&&n.value.length<=1}BigInteger.prototype.shiftLeft=function(n){if(!shift_isSmall(n)){throw new Error(String(n)+" is too large for shifting.")}n=+n;if(n<0)return this.shiftRight(-n);var result=this;while(n>=powers2Length){result=result.multiply(highestPower2);n-=powers2Length-1}return result.multiply(powersOfTwo[n])};SmallInteger.prototype.shiftLeft=BigInteger.prototype.shiftLeft;BigInteger.prototype.shiftRight=function(n){var remQuo;if(!shift_isSmall(n)){throw new Error(String(n)+" is too large for shifting.")}n=+n;if(n<0)return this.shiftLeft(-n);var result=this;while(n>=powers2Length){if(result.isZero())return result;remQuo=divModAny(result,highestPower2);result=remQuo[1].isNegative()?remQuo[0].prev():remQuo[0];n-=powers2Length-1}remQuo=divModAny(result,powersOfTwo[n]);return remQuo[1].isNegative()?remQuo[0].prev():remQuo[0]};SmallInteger.prototype.shiftRight=BigInteger.prototype.shiftRight;function bitwise(x,y,fn){y=parseValue(y);var xSign=x.isNegative(),ySign=y.isNegative();var xRem=xSign?x.not():x,yRem=ySign?y.not():y;var xDigit=0,yDigit=0;var xDivMod=null,yDivMod=null;var result=[];while(!xRem.isZero()||!yRem.isZero()){xDivMod=divModAny(xRem,highestPower2);xDigit=xDivMod[1].toJSNumber();if(xSign){xDigit=highestPower2-1-xDigit}yDivMod=divModAny(yRem,highestPower2);yDigit=yDivMod[1].toJSNumber();if(ySign){yDigit=highestPower2-1-yDigit}xRem=xDivMod[0];yRem=yDivMod[0];result.push(fn(xDigit,yDigit))}var sum=fn(xSign?1:0,ySign?1:0)!==0?bigInt(-1):bigInt(0);for(var i=result.length-1;i>=0;i-=1){sum=sum.multiply(highestPower2).add(bigInt(result[i]))}return sum}BigInteger.prototype.not=function(){return this.negate().prev()};SmallInteger.prototype.not=BigInteger.prototype.not;BigInteger.prototype.and=function(n){return bitwise(this,n,function(a,b){return a&b})};SmallInteger.prototype.and=BigInteger.prototype.and;BigInteger.prototype.or=function(n){return bitwise(this,n,function(a,b){return a|b})};SmallInteger.prototype.or=BigInteger.prototype.or;BigInteger.prototype.xor=function(n){return bitwise(this,n,function(a,b){return a^b})};SmallInteger.prototype.xor=BigInteger.prototype.xor;var LOBMASK_I=1<<30,LOBMASK_BI=(BASE&-BASE)*(BASE&-BASE)|LOBMASK_I;function roughLOB(n){var v=n.value,x=typeof v==="number"?v|LOBMASK_I:v[0]+v[1]*BASE|LOBMASK_BI;return x&-x}function max(a,b){a=parseValue(a);b=parseValue(b);return a.greater(b)?a:b}function min(a,b){a=parseValue(a);b=parseValue(b);return a.lesser(b)?a:b}function gcd(a,b){a=parseValue(a).abs();b=parseValue(b).abs();if(a.equals(b))return a;if(a.isZero())return b;if(b.isZero())return a;var c=Integer[1],d,t;while(a.isEven()&&b.isEven()){d=Math.min(roughLOB(a),roughLOB(b));a=a.divide(d);b=b.divide(d);c=c.multiply(d)}while(a.isEven()){a=a.divide(roughLOB(a))}do{while(b.isEven()){b=b.divide(roughLOB(b))}if(a.greater(b)){t=b;b=a;a=t}b=b.subtract(a)}while(!b.isZero());return c.isUnit()?a:a.multiply(c)}function lcm(a,b){a=parseValue(a).abs();b=parseValue(b).abs();return a.divide(gcd(a,b)).multiply(b)}function randBetween(a,b){a=parseValue(a);b=parseValue(b);var low=min(a,b),high=max(a,b);var range=high.subtract(low).add(1);if(range.isSmall)return low.add(Math.floor(Math.random()*range));var length=range.value.length-1;var result=[],restricted=true;for(var i=length;i>=0;i--){var top=restricted?range.value[i]:BASE;var digit=truncate(Math.random()*top);result.unshift(digit);if(digit=absBase){if(c==="1"&&absBase===1)continue;throw new Error(c+" is not a valid digit in base "+base+".")}else if(c.charCodeAt(0)-87>=absBase){throw new Error(c+" is not a valid digit in base "+base+".")}}}if(2<=base&&base<=36){if(length<=LOG_MAX_INT/Math.log(base)){var result=parseInt(text,base);if(isNaN(result)){throw new Error(c+" is not a valid digit in base "+base+".")}return new SmallInteger(parseInt(text,base))}}base=parseValue(base);var digits=[];var isNegative=text[0]==="-";for(i=isNegative?1:0;i");digits.push(parseValue(text.slice(start+1,i)))}else throw new Error(c+" is not a valid character")}return parseBaseFromArray(digits,base,isNegative)};function parseBaseFromArray(digits,base,isNegative){var val=Integer[0],pow=Integer[1],i;for(i=digits.length-1;i>=0;i--){val=val.add(digits[i].times(pow));pow=pow.times(base)}return isNegative?val.negate():val}function stringify(digit){var v=digit.value;if(typeof v==="number")v=[v];if(v.length===1&&v[0]<=35){return"0123456789abcdefghijklmnopqrstuvwxyz".charAt(v[0])}return"<"+v+">"}function toBase(n,base){base=bigInt(base);if(base.isZero()){if(n.isZero())return"0";throw new Error("Cannot convert nonzero numbers to base 0.")}if(base.equals(-1)){if(n.isZero())return"0";if(n.isNegative())return new Array(1-n).join("10");return"1"+new Array(+n).join("01")}var minusSign="";if(n.isNegative()&&base.isPositive()){minusSign="-";n=n.abs()}if(base.equals(1)){if(n.isZero())return"0";return minusSign+new Array(+n+1).join(1)}var out=[];var left=n,divmod;while(left.isNegative()||left.compareAbs(base)>=0){divmod=left.divmod(base);left=divmod.quotient;var digit=divmod.remainder;if(digit.isNegative()){digit=base.minus(digit).abs();left=left.next()}out.push(stringify(digit))}out.push(stringify(left));return minusSign+out.reverse().join("")}BigInteger.prototype.toString=function(radix){if(radix===undefined)radix=10;if(radix!==10)return toBase(this,radix);var v=this.value,l=v.length,str=String(v[--l]),zeros="0000000",digit;while(--l>=0){digit=String(v[l]);str+=zeros.slice(digit.length)+digit}var sign=this.sign?"-":"";return sign+str};SmallInteger.prototype.toString=function(radix){if(radix===undefined)radix=10;if(radix!=10)return toBase(this,radix);return String(this.value)};BigInteger.prototype.toJSON=SmallInteger.prototype.toJSON=function(){return this.toString()};BigInteger.prototype.valueOf=function(){return+this.toString()};BigInteger.prototype.toJSNumber=BigInteger.prototype.valueOf;SmallInteger.prototype.valueOf=function(){return this.value};SmallInteger.prototype.toJSNumber=SmallInteger.prototype.valueOf;function parseStringValue(v){if(isPrecise(+v)){var x=+v;if(x===truncate(x))return new SmallInteger(x);throw"Invalid integer: "+v}var sign=v[0]==="-";if(sign)v=v.slice(1);var split=v.split(/e/i);if(split.length>2)throw new Error("Invalid integer: "+split.join("e"));if(split.length===2){var exp=split[1];if(exp[0]==="+")exp=exp.slice(1);exp=+exp;if(exp!==truncate(exp)||!isPrecise(exp))throw new Error("Invalid integer: "+exp+" is not a valid exponent.");var text=split[0];var decimalPlace=text.indexOf(".");if(decimalPlace>=0){exp-=text.length-decimalPlace-1;text=text.slice(0,decimalPlace)+text.slice(decimalPlace+1)}if(exp<0)throw new Error("Cannot include negative exponent part for integers");text+=new Array(exp+1).join("0");v=text}var isValid=/^([0-9][0-9]*)$/.test(v);if(!isValid)throw new Error("Invalid integer: "+v);var r=[],max=v.length,l=LOG_BASE,min=max-l;while(max>0){r.push(+v.slice(min,max));min-=l;if(min<0)min=0;max-=l}trim(r);return new BigInteger(r,sign)}function parseNumberValue(v){if(isPrecise(v)){if(v!==truncate(v))throw new Error(v+" is not an integer.");return new SmallInteger(v)}return parseStringValue(v.toString())}function parseValue(v){if(typeof v==="number"){return parseNumberValue(v)}if(typeof v==="string"){return parseStringValue(v)}return v}for(var i=0;i<1e3;i++){Integer[i]=new SmallInteger(i);if(i>0)Integer[-i]=new SmallInteger(-i)}Integer.one=Integer[1];Integer.zero=Integer[0];Integer.minusOne=Integer[-1];Integer.max=max;Integer.min=min;Integer.gcd=gcd;Integer.lcm=lcm;Integer.isInstance=function(x){return x instanceof BigInteger||x instanceof SmallInteger};Integer.randBetween=randBetween;Integer.fromArray=function(digits,base,isNegative){return parseBaseFromArray(digits.map(parseValue),parseValue(base||10),isNegative)};return Integer}();if(typeof module!=="undefined"&&module.hasOwnProperty("exports")){module.exports=bigInt}if(typeof define==="function"&&define.amd){define("big-integer",[],function(){return bigInt})}; bigInt` diff --git a/x/evm/core/tracers/js/goja.go b/x/evm/core/tracers/js/goja.go new file mode 100644 index 0000000000..2beaf9ba6d --- /dev/null +++ b/x/evm/core/tracers/js/goja.go @@ -0,0 +1,962 @@ +// Copyright 2022 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package js + +import ( + "encoding/json" + "errors" + "fmt" + "math/big" + "time" + + "github.com/dop251/goja" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/crypto" + "github.com/evmos/evmos/v18/x/evm/core/tracers" + jsassets "github.com/evmos/evmos/v18/x/evm/core/tracers/js/internal/tracers" + "github.com/evmos/evmos/v18/x/evm/core/vm" +) + +var assetTracers = make(map[string]string) + +// init retrieves the JavaScript transaction tracers included in go-ethereum. +func init() { + var err error + assetTracers, err = jsassets.Load() + if err != nil { + panic(err) + } + tracers.RegisterLookup(true, newJsTracer) +} + +// bigIntProgram is compiled once and the exported function mostly invoked to convert +// hex strings into big ints. +var bigIntProgram = goja.MustCompile("bigInt", bigIntegerJS, false) + +type ( + toBigFn = func(vm *goja.Runtime, val string) (goja.Value, error) + toBufFn = func(vm *goja.Runtime, val []byte) (goja.Value, error) + fromBufFn = func(vm *goja.Runtime, buf goja.Value, allowString bool) ([]byte, error) +) + +func toBuf(vm *goja.Runtime, bufType goja.Value, val []byte) (goja.Value, error) { + // bufType is usually Uint8Array. This is equivalent to `new Uint8Array(val)` in JS. + return vm.New(bufType, vm.ToValue(vm.NewArrayBuffer(val))) +} + +func fromBuf(vm *goja.Runtime, bufType goja.Value, buf goja.Value, allowString bool) ([]byte, error) { + obj := buf.ToObject(vm) + switch obj.ClassName() { + case "String": + if !allowString { + break + } + return common.FromHex(obj.String()), nil + + case "Array": + var b []byte + if err := vm.ExportTo(buf, &b); err != nil { + return nil, err + } + return b, nil + + case "Object": + if !obj.Get("constructor").SameAs(bufType) { + break + } + b := obj.Get("buffer").Export().(goja.ArrayBuffer).Bytes() + return b, nil + } + return nil, fmt.Errorf("invalid buffer type") +} + +// jsTracer is an implementation of the Tracer interface which evaluates +// JS functions on the relevant EVM hooks. It uses Goja as its JS engine. +type jsTracer struct { + vm *goja.Runtime + env *vm.EVM + toBig toBigFn // Converts a hex string into a JS bigint + toBuf toBufFn // Converts a []byte into a JS buffer + fromBuf fromBufFn // Converts an array, hex string or Uint8Array to a []byte + ctx map[string]goja.Value // KV-bag passed to JS in `result` + activePrecompiles []common.Address // List of active precompiles at current block + traceStep bool // True if tracer object exposes a `step()` method + traceFrame bool // True if tracer object exposes the `enter()` and `exit()` methods + gasLimit uint64 // Amount of gas bought for the whole tx + err error // Any error that should stop tracing + obj *goja.Object // Trace object + + // Methods exposed by tracer + result goja.Callable + fault goja.Callable + step goja.Callable + enter goja.Callable + exit goja.Callable + + // Underlying structs being passed into JS + log *steplog + frame *callframe + frameResult *callframeResult + + // Goja-wrapping of types prepared for JS consumption + logValue goja.Value + dbValue goja.Value + frameValue goja.Value + frameResultValue goja.Value +} + +// newJsTracer instantiates a new JS tracer instance. code is either +// the name of a built-in JS tracer or a Javascript snippet which +// evaluates to an expression returning an object with certain methods. +// The methods `result` and `fault` are required to be present. +// The methods `step`, `enter`, and `exit` are optional, but note that +// `enter` and `exit` always go together. +func newJsTracer(code string, ctx *tracers.Context, cfg json.RawMessage) (tracers.Tracer, error) { + if c, ok := assetTracers[code]; ok { + code = c + } + vm := goja.New() + // By default field names are exported to JS as is, i.e. capitalized. + vm.SetFieldNameMapper(goja.UncapFieldNameMapper()) + t := &jsTracer{ + vm: vm, + ctx: make(map[string]goja.Value), + } + if ctx == nil { + ctx = new(tracers.Context) + } + if ctx.BlockHash != (common.Hash{}) { + t.ctx["blockHash"] = vm.ToValue(ctx.BlockHash.Bytes()) + if ctx.TxHash != (common.Hash{}) { + t.ctx["txIndex"] = vm.ToValue(ctx.TxIndex) + t.ctx["txHash"] = vm.ToValue(ctx.TxHash.Bytes()) + } + } + + t.setTypeConverters() + t.setBuiltinFunctions() + ret, err := vm.RunString("(" + code + ")") + if err != nil { + return nil, err + } + // Check tracer's interface for required and optional methods. + obj := ret.ToObject(vm) + result, ok := goja.AssertFunction(obj.Get("result")) + if !ok { + return nil, errors.New("trace object must expose a function result()") + } + fault, ok := goja.AssertFunction(obj.Get("fault")) + if !ok { + return nil, errors.New("trace object must expose a function fault()") + } + step, ok := goja.AssertFunction(obj.Get("step")) + t.traceStep = ok + enter, hasEnter := goja.AssertFunction(obj.Get("enter")) + exit, hasExit := goja.AssertFunction(obj.Get("exit")) + if hasEnter != hasExit { + return nil, errors.New("trace object must expose either both or none of enter() and exit()") + } + t.traceFrame = hasEnter + t.obj = obj + t.step = step + t.enter = enter + t.exit = exit + t.result = result + t.fault = fault + + // Pass in config + if setup, ok := goja.AssertFunction(obj.Get("setup")); ok { + cfgStr := "{}" + if cfg != nil { + cfgStr = string(cfg) + } + if _, err := setup(obj, vm.ToValue(cfgStr)); err != nil { + return nil, err + } + } + // Setup objects carrying data to JS. These are created once and re-used. + t.log = &steplog{ + vm: vm, + op: &opObj{vm: vm}, + memory: &memoryObj{vm: vm, toBig: t.toBig, toBuf: t.toBuf}, + stack: &stackObj{vm: vm, toBig: t.toBig}, + contract: &contractObj{vm: vm, toBig: t.toBig, toBuf: t.toBuf}, + } + t.frame = &callframe{vm: vm, toBig: t.toBig, toBuf: t.toBuf} + t.frameResult = &callframeResult{vm: vm, toBuf: t.toBuf} + t.frameValue = t.frame.setupObject() + t.frameResultValue = t.frameResult.setupObject() + t.logValue = t.log.setupObject() + return t, nil +} + +// CaptureTxStart implements the Tracer interface and is invoked at the beginning of +// transaction processing. +func (t *jsTracer) CaptureTxStart(gasLimit uint64) { + t.gasLimit = gasLimit +} + +// CaptureTxStart implements the Tracer interface and is invoked at the end of +// transaction processing. +func (t *jsTracer) CaptureTxEnd(restGas uint64) {} + +// CaptureStart implements the Tracer interface to initialize the tracing operation. +func (t *jsTracer) CaptureStart(env *vm.EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) { + t.env = env + db := &dbObj{db: env.StateDB, vm: t.vm, toBig: t.toBig, toBuf: t.toBuf, fromBuf: t.fromBuf} + t.dbValue = db.setupObject() + if create { + t.ctx["type"] = t.vm.ToValue("CREATE") + } else { + t.ctx["type"] = t.vm.ToValue("CALL") + } + t.ctx["from"] = t.vm.ToValue(from.Bytes()) + t.ctx["to"] = t.vm.ToValue(to.Bytes()) + t.ctx["input"] = t.vm.ToValue(input) + t.ctx["gas"] = t.vm.ToValue(gas) + t.ctx["gasPrice"] = t.vm.ToValue(env.GasPrice) + valueBig, err := t.toBig(t.vm, value.String()) + if err != nil { + t.err = err + return + } + t.ctx["value"] = valueBig + t.ctx["block"] = t.vm.ToValue(env.Context.BlockNumber.Uint64()) + // Update list of precompiles based on current block + rules := env.ChainConfig().Rules(env.Context.BlockNumber, env.Context.Random != nil) + t.activePrecompiles = env.ActivePrecompiles(rules) + t.ctx["intrinsicGas"] = t.vm.ToValue(t.gasLimit - gas) +} + +// CaptureState implements the Tracer interface to trace a single step of VM execution. +func (t *jsTracer) CaptureState(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, depth int, err error) { + if !t.traceStep { + return + } + if t.err != nil { + return + } + + log := t.log + log.op.op = op + log.memory.memory = scope.Memory + log.stack.stack = scope.Stack + log.contract.contract = scope.Contract + log.pc = uint(pc) + log.gas = uint(gas) + log.cost = uint(cost) + log.depth = uint(depth) + log.err = err + if _, err := t.step(t.obj, t.logValue, t.dbValue); err != nil { + t.onError("step", err) + } +} + +// CaptureFault implements the Tracer interface to trace an execution fault +func (t *jsTracer) CaptureFault(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, depth int, err error) { + if t.err != nil { + return + } + // Other log fields have been already set as part of the last CaptureState. + t.log.err = err + if _, err := t.fault(t.obj, t.logValue, t.dbValue); err != nil { + t.onError("fault", err) + } +} + +// CaptureEnd is called after the call finishes to finalize the tracing. +func (t *jsTracer) CaptureEnd(output []byte, gasUsed uint64, duration time.Duration, err error) { + t.ctx["output"] = t.vm.ToValue(output) + t.ctx["time"] = t.vm.ToValue(duration.String()) + t.ctx["gasUsed"] = t.vm.ToValue(gasUsed) + if err != nil { + t.ctx["error"] = t.vm.ToValue(err.Error()) + } +} + +// CaptureEnter is called when EVM enters a new scope (via call, create or selfdestruct). +func (t *jsTracer) CaptureEnter(typ vm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) { + if !t.traceFrame { + return + } + if t.err != nil { + return + } + + t.frame.typ = typ.String() + t.frame.from = from + t.frame.to = to + t.frame.input = common.CopyBytes(input) + t.frame.gas = uint(gas) + t.frame.value = nil + if value != nil { + t.frame.value = new(big.Int).SetBytes(value.Bytes()) + } + + if _, err := t.enter(t.obj, t.frameValue); err != nil { + t.onError("enter", err) + } +} + +// CaptureExit is called when EVM exits a scope, even if the scope didn't +// execute any code. +func (t *jsTracer) CaptureExit(output []byte, gasUsed uint64, err error) { + if !t.traceFrame { + return + } + + t.frameResult.gasUsed = uint(gasUsed) + t.frameResult.output = common.CopyBytes(output) + t.frameResult.err = err + + if _, err := t.exit(t.obj, t.frameResultValue); err != nil { + t.onError("exit", err) + } +} + +// GetResult calls the Javascript 'result' function and returns its value, or any accumulated error +func (t *jsTracer) GetResult() (json.RawMessage, error) { + ctx := t.vm.ToValue(t.ctx) + res, err := t.result(t.obj, ctx, t.dbValue) + if err != nil { + return nil, wrapError("result", err) + } + encoded, err := json.Marshal(res) + if err != nil { + return nil, err + } + return json.RawMessage(encoded), t.err +} + +// Stop terminates execution of the tracer at the first opportune moment. +func (t *jsTracer) Stop(err error) { + t.vm.Interrupt(err) +} + +// onError is called anytime the running JS code is interrupted +// and returns an error. It in turn pings the EVM to cancel its +// execution. +func (t *jsTracer) onError(context string, err error) { + t.err = wrapError(context, err) + // `env` is set on CaptureStart which comes before any JS execution. + // So it should be non-nil. + t.env.Cancel() +} + +func wrapError(context string, err error) error { + return fmt.Errorf("%v in server-side tracer function '%v'", err, context) +} + +// setBuiltinFunctions injects Go functions which are available to tracers into the environment. +// It depends on type converters having been set up. +func (t *jsTracer) setBuiltinFunctions() { + vm := t.vm + // TODO: load console from goja-nodejs + vm.Set("toHex", func(v goja.Value) string { + b, err := t.fromBuf(vm, v, false) + if err != nil { + vm.Interrupt(err) + return "" + } + return hexutil.Encode(b) + }) + vm.Set("toWord", func(v goja.Value) goja.Value { + // TODO: add test with []byte len < 32 or > 32 + b, err := t.fromBuf(vm, v, true) + if err != nil { + vm.Interrupt(err) + return nil + } + b = common.BytesToHash(b).Bytes() + res, err := t.toBuf(vm, b) + if err != nil { + vm.Interrupt(err) + return nil + } + return res + }) + vm.Set("toAddress", func(v goja.Value) goja.Value { + a, err := t.fromBuf(vm, v, true) + if err != nil { + vm.Interrupt(err) + return nil + } + a = common.BytesToAddress(a).Bytes() + res, err := t.toBuf(vm, a) + if err != nil { + vm.Interrupt(err) + return nil + } + return res + }) + vm.Set("toContract", func(from goja.Value, nonce uint) goja.Value { + a, err := t.fromBuf(vm, from, true) + if err != nil { + vm.Interrupt(err) + return nil + } + addr := common.BytesToAddress(a) + b := crypto.CreateAddress(addr, uint64(nonce)).Bytes() + res, err := t.toBuf(vm, b) + if err != nil { + vm.Interrupt(err) + return nil + } + return res + }) + vm.Set("toContract2", func(from goja.Value, salt string, initcode goja.Value) goja.Value { + a, err := t.fromBuf(vm, from, true) + if err != nil { + vm.Interrupt(err) + return nil + } + addr := common.BytesToAddress(a) + code, err := t.fromBuf(vm, initcode, true) + if err != nil { + vm.Interrupt(err) + return nil + } + code = common.CopyBytes(code) + codeHash := crypto.Keccak256(code) + b := crypto.CreateAddress2(addr, common.HexToHash(salt), codeHash).Bytes() + res, err := t.toBuf(vm, b) + if err != nil { + vm.Interrupt(err) + return nil + } + return res + }) + vm.Set("isPrecompiled", func(v goja.Value) bool { + a, err := t.fromBuf(vm, v, true) + if err != nil { + vm.Interrupt(err) + return false + } + addr := common.BytesToAddress(a) + for _, p := range t.activePrecompiles { + if p == addr { + return true + } + } + return false + }) + vm.Set("slice", func(slice goja.Value, start, end int) goja.Value { + b, err := t.fromBuf(vm, slice, false) + if err != nil { + vm.Interrupt(err) + return nil + } + if start < 0 || start > end || end > len(b) { + vm.Interrupt(fmt.Sprintf("Tracer accessed out of bound memory: available %d, offset %d, size %d", len(b), start, end-start)) + return nil + } + res, err := t.toBuf(vm, b[start:end]) + if err != nil { + vm.Interrupt(err) + return nil + } + return res + }) +} + +// setTypeConverters sets up utilities for converting Go types into those +// suitable for JS consumption. +func (t *jsTracer) setTypeConverters() error { + // Inject bigint logic. + // TODO: To be replaced after goja adds support for native JS bigint. + toBigCode, err := t.vm.RunProgram(bigIntProgram) + if err != nil { + return err + } + // Used to create JS bigint objects from go. + toBigFn, ok := goja.AssertFunction(toBigCode) + if !ok { + return errors.New("failed to bind bigInt func") + } + toBigWrapper := func(vm *goja.Runtime, val string) (goja.Value, error) { + return toBigFn(goja.Undefined(), vm.ToValue(val)) + } + t.toBig = toBigWrapper + // NOTE: We need this workaround to create JS buffers because + // goja doesn't at the moment expose constructors for typed arrays. + // + // Cache uint8ArrayType once to be used every time for less overhead. + uint8ArrayType := t.vm.Get("Uint8Array") + toBufWrapper := func(vm *goja.Runtime, val []byte) (goja.Value, error) { + return toBuf(vm, uint8ArrayType, val) + } + t.toBuf = toBufWrapper + fromBufWrapper := func(vm *goja.Runtime, buf goja.Value, allowString bool) ([]byte, error) { + return fromBuf(vm, uint8ArrayType, buf, allowString) + } + t.fromBuf = fromBufWrapper + return nil +} + +type opObj struct { + vm *goja.Runtime + op vm.OpCode +} + +func (o *opObj) ToNumber() int { + return int(o.op) +} + +func (o *opObj) ToString() string { + return o.op.String() +} + +func (o *opObj) IsPush() bool { + return o.op.IsPush() +} + +func (o *opObj) setupObject() *goja.Object { + obj := o.vm.NewObject() + obj.Set("toNumber", o.vm.ToValue(o.ToNumber)) + obj.Set("toString", o.vm.ToValue(o.ToString)) + obj.Set("isPush", o.vm.ToValue(o.IsPush)) + return obj +} + +type memoryObj struct { + memory *vm.Memory + vm *goja.Runtime + toBig toBigFn + toBuf toBufFn +} + +func (mo *memoryObj) Slice(begin, end int64) goja.Value { + b, err := mo.slice(begin, end) + if err != nil { + mo.vm.Interrupt(err) + return nil + } + res, err := mo.toBuf(mo.vm, b) + if err != nil { + mo.vm.Interrupt(err) + return nil + } + return res +} + +// slice returns the requested range of memory as a byte slice. +func (mo *memoryObj) slice(begin, end int64) ([]byte, error) { + if end == begin { + return []byte{}, nil + } + if end < begin || begin < 0 { + return nil, fmt.Errorf("tracer accessed out of bound memory: offset %d, end %d", begin, end) + } + if mo.memory.Len() < int(end) { + return nil, fmt.Errorf("tracer accessed out of bound memory: available %d, offset %d, size %d", mo.memory.Len(), begin, end-begin) + } + return mo.memory.GetCopy(begin, end-begin), nil +} + +func (mo *memoryObj) GetUint(addr int64) goja.Value { + value, err := mo.getUint(addr) + if err != nil { + mo.vm.Interrupt(err) + return nil + } + res, err := mo.toBig(mo.vm, value.String()) + if err != nil { + mo.vm.Interrupt(err) + return nil + } + return res +} + +// getUint returns the 32 bytes at the specified address interpreted as a uint. +func (mo *memoryObj) getUint(addr int64) (*big.Int, error) { + if mo.memory.Len() < int(addr)+32 || addr < 0 { + return nil, fmt.Errorf("tracer accessed out of bound memory: available %d, offset %d, size %d", mo.memory.Len(), addr, 32) + } + return new(big.Int).SetBytes(mo.memory.GetPtr(addr, 32)), nil +} + +func (mo *memoryObj) Length() int { + return mo.memory.Len() +} + +func (m *memoryObj) setupObject() *goja.Object { + o := m.vm.NewObject() + o.Set("slice", m.vm.ToValue(m.Slice)) + o.Set("getUint", m.vm.ToValue(m.GetUint)) + o.Set("length", m.vm.ToValue(m.Length)) + return o +} + +type stackObj struct { + stack *vm.Stack + vm *goja.Runtime + toBig toBigFn +} + +func (s *stackObj) Peek(idx int) goja.Value { + value, err := s.peek(idx) + if err != nil { + s.vm.Interrupt(err) + return nil + } + res, err := s.toBig(s.vm, value.String()) + if err != nil { + s.vm.Interrupt(err) + return nil + } + return res +} + +// peek returns the nth-from-the-top element of the stack. +func (s *stackObj) peek(idx int) (*big.Int, error) { + if len(s.stack.Data) <= idx || idx < 0 { + return nil, fmt.Errorf("tracer accessed out of bound stack: size %d, index %d", len(s.stack.Data), idx) + } + return s.stack.Back(idx).ToBig(), nil +} + +func (s *stackObj) Length() int { + return len(s.stack.Data) +} + +func (s *stackObj) setupObject() *goja.Object { + o := s.vm.NewObject() + o.Set("peek", s.vm.ToValue(s.Peek)) + o.Set("length", s.vm.ToValue(s.Length)) + return o +} + +type dbObj struct { + db vm.StateDB + vm *goja.Runtime + toBig toBigFn + toBuf toBufFn + fromBuf fromBufFn +} + +func (do *dbObj) GetBalance(addrSlice goja.Value) goja.Value { + a, err := do.fromBuf(do.vm, addrSlice, false) + if err != nil { + do.vm.Interrupt(err) + return nil + } + addr := common.BytesToAddress(a) + value := do.db.GetBalance(addr) + res, err := do.toBig(do.vm, value.String()) + if err != nil { + do.vm.Interrupt(err) + return nil + } + return res +} + +func (do *dbObj) GetNonce(addrSlice goja.Value) uint64 { + a, err := do.fromBuf(do.vm, addrSlice, false) + if err != nil { + do.vm.Interrupt(err) + return 0 + } + addr := common.BytesToAddress(a) + return do.db.GetNonce(addr) +} + +func (do *dbObj) GetCode(addrSlice goja.Value) goja.Value { + a, err := do.fromBuf(do.vm, addrSlice, false) + if err != nil { + do.vm.Interrupt(err) + return nil + } + addr := common.BytesToAddress(a) + code := do.db.GetCode(addr) + res, err := do.toBuf(do.vm, code) + if err != nil { + do.vm.Interrupt(err) + return nil + } + return res +} + +func (do *dbObj) GetState(addrSlice goja.Value, hashSlice goja.Value) goja.Value { + a, err := do.fromBuf(do.vm, addrSlice, false) + if err != nil { + do.vm.Interrupt(err) + return nil + } + addr := common.BytesToAddress(a) + h, err := do.fromBuf(do.vm, hashSlice, false) + if err != nil { + do.vm.Interrupt(err) + return nil + } + hash := common.BytesToHash(h) + state := do.db.GetState(addr, hash).Bytes() + res, err := do.toBuf(do.vm, state) + if err != nil { + do.vm.Interrupt(err) + return nil + } + return res +} + +func (do *dbObj) Exists(addrSlice goja.Value) bool { + a, err := do.fromBuf(do.vm, addrSlice, false) + if err != nil { + do.vm.Interrupt(err) + return false + } + addr := common.BytesToAddress(a) + return do.db.Exist(addr) +} + +func (do *dbObj) setupObject() *goja.Object { + o := do.vm.NewObject() + o.Set("getBalance", do.vm.ToValue(do.GetBalance)) + o.Set("getNonce", do.vm.ToValue(do.GetNonce)) + o.Set("getCode", do.vm.ToValue(do.GetCode)) + o.Set("getState", do.vm.ToValue(do.GetState)) + o.Set("exists", do.vm.ToValue(do.Exists)) + return o +} + +type contractObj struct { + contract *vm.Contract + vm *goja.Runtime + toBig toBigFn + toBuf toBufFn +} + +func (co *contractObj) GetCaller() goja.Value { + caller := co.contract.Caller().Bytes() + res, err := co.toBuf(co.vm, caller) + if err != nil { + co.vm.Interrupt(err) + return nil + } + return res +} + +func (co *contractObj) GetAddress() goja.Value { + addr := co.contract.Address().Bytes() + res, err := co.toBuf(co.vm, addr) + if err != nil { + co.vm.Interrupt(err) + return nil + } + return res +} + +func (co *contractObj) GetValue() goja.Value { + value := co.contract.Value() + res, err := co.toBig(co.vm, value.String()) + if err != nil { + co.vm.Interrupt(err) + return nil + } + return res +} + +func (co *contractObj) GetInput() goja.Value { + input := common.CopyBytes(co.contract.Input) + res, err := co.toBuf(co.vm, input) + if err != nil { + co.vm.Interrupt(err) + return nil + } + return res +} + +func (c *contractObj) setupObject() *goja.Object { + o := c.vm.NewObject() + o.Set("getCaller", c.vm.ToValue(c.GetCaller)) + o.Set("getAddress", c.vm.ToValue(c.GetAddress)) + o.Set("getValue", c.vm.ToValue(c.GetValue)) + o.Set("getInput", c.vm.ToValue(c.GetInput)) + return o +} + +type callframe struct { + vm *goja.Runtime + toBig toBigFn + toBuf toBufFn + + typ string + from common.Address + to common.Address + input []byte + gas uint + value *big.Int +} + +func (f *callframe) GetType() string { + return f.typ +} + +func (f *callframe) GetFrom() goja.Value { + from := f.from.Bytes() + res, err := f.toBuf(f.vm, from) + if err != nil { + f.vm.Interrupt(err) + return nil + } + return res +} + +func (f *callframe) GetTo() goja.Value { + to := f.to.Bytes() + res, err := f.toBuf(f.vm, to) + if err != nil { + f.vm.Interrupt(err) + return nil + } + return res +} + +func (f *callframe) GetInput() goja.Value { + input := f.input + res, err := f.toBuf(f.vm, input) + if err != nil { + f.vm.Interrupt(err) + return nil + } + return res +} + +func (f *callframe) GetGas() uint { + return f.gas +} + +func (f *callframe) GetValue() goja.Value { + if f.value == nil { + return goja.Undefined() + } + res, err := f.toBig(f.vm, f.value.String()) + if err != nil { + f.vm.Interrupt(err) + return nil + } + return res +} + +func (f *callframe) setupObject() *goja.Object { + o := f.vm.NewObject() + o.Set("getType", f.vm.ToValue(f.GetType)) + o.Set("getFrom", f.vm.ToValue(f.GetFrom)) + o.Set("getTo", f.vm.ToValue(f.GetTo)) + o.Set("getInput", f.vm.ToValue(f.GetInput)) + o.Set("getGas", f.vm.ToValue(f.GetGas)) + o.Set("getValue", f.vm.ToValue(f.GetValue)) + return o +} + +type callframeResult struct { + vm *goja.Runtime + toBuf toBufFn + + gasUsed uint + output []byte + err error +} + +func (r *callframeResult) GetGasUsed() uint { + return r.gasUsed +} + +func (r *callframeResult) GetOutput() goja.Value { + res, err := r.toBuf(r.vm, r.output) + if err != nil { + r.vm.Interrupt(err) + return nil + } + return res +} + +func (r *callframeResult) GetError() goja.Value { + if r.err != nil { + return r.vm.ToValue(r.err.Error()) + } + return goja.Undefined() +} + +func (r *callframeResult) setupObject() *goja.Object { + o := r.vm.NewObject() + o.Set("getGasUsed", r.vm.ToValue(r.GetGasUsed)) + o.Set("getOutput", r.vm.ToValue(r.GetOutput)) + o.Set("getError", r.vm.ToValue(r.GetError)) + return o +} + +type steplog struct { + vm *goja.Runtime + + op *opObj + memory *memoryObj + stack *stackObj + contract *contractObj + + pc uint + gas uint + cost uint + depth uint + refund uint + err error +} + +func (l *steplog) GetPC() uint { + return l.pc +} + +func (l *steplog) GetGas() uint { + return l.gas +} + +func (l *steplog) GetCost() uint { + return l.cost +} + +func (l *steplog) GetDepth() uint { + return l.depth +} + +func (l *steplog) GetRefund() uint { + return l.refund +} + +func (l *steplog) GetError() goja.Value { + if l.err != nil { + return l.vm.ToValue(l.err.Error()) + } + return goja.Undefined() +} + +func (l *steplog) setupObject() *goja.Object { + o := l.vm.NewObject() + // Setup basic fields. + o.Set("getPC", l.vm.ToValue(l.GetPC)) + o.Set("getGas", l.vm.ToValue(l.GetGas)) + o.Set("getCost", l.vm.ToValue(l.GetCost)) + o.Set("getDepth", l.vm.ToValue(l.GetDepth)) + o.Set("getRefund", l.vm.ToValue(l.GetRefund)) + o.Set("getError", l.vm.ToValue(l.GetError)) + // Setup nested objects. + o.Set("op", l.op.setupObject()) + o.Set("stack", l.stack.setupObject()) + o.Set("memory", l.memory.setupObject()) + o.Set("contract", l.contract.setupObject()) + return o +} diff --git a/x/evm/core/tracers/js/internal/tracers/4byte_tracer_legacy.js b/x/evm/core/tracers/js/internal/tracers/4byte_tracer_legacy.js new file mode 100644 index 0000000000..e4714b8bfb --- /dev/null +++ b/x/evm/core/tracers/js/internal/tracers/4byte_tracer_legacy.js @@ -0,0 +1,86 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +// 4byteTracer searches for 4byte-identifiers, and collects them for post-processing. +// It collects the methods identifiers along with the size of the supplied data, so +// a reversed signature can be matched against the size of the data. +// +// Example: +// > debug.traceTransaction( "0x214e597e35da083692f5386141e69f47e973b2c56e7a8073b1ea08fd7571e9de", {tracer: "4byteTracer"}) +// { +// 0x27dc297e-128: 1, +// 0x38cc4831-0: 2, +// 0x524f3889-96: 1, +// 0xadf59f99-288: 1, +// 0xc281d19e-0: 1 +// } +{ + // ids aggregates the 4byte ids found. + ids : {}, + + // callType returns 'false' for non-calls, or the peek-index for the first param + // after 'value', i.e. meminstart. + callType: function(opstr){ + switch(opstr){ + case "CALL": case "CALLCODE": + // gas, addr, val, memin, meminsz, memout, memoutsz + return 3; // stack ptr to memin + + case "DELEGATECALL": case "STATICCALL": + // gas, addr, memin, meminsz, memout, memoutsz + return 2; // stack ptr to memin + } + return false; + }, + + // store save the given identifier and datasize. + store: function(id, size){ + var key = "" + toHex(id) + "-" + size; + this.ids[key] = this.ids[key] + 1 || 1; + }, + + // step is invoked for every opcode that the VM executes. + step: function(log, db) { + // Skip any opcodes that are not internal calls + var ct = this.callType(log.op.toString()); + if (!ct) { + return; + } + // Skip any pre-compile invocations, those are just fancy opcodes + if (isPrecompiled(toAddress(log.stack.peek(1).toString(16)))) { + return; + } + // Gather internal call details + var inSz = log.stack.peek(ct + 1).valueOf(); + if (inSz >= 4) { + var inOff = log.stack.peek(ct).valueOf(); + this.store(log.memory.slice(inOff, inOff + 4), inSz-4); + } + }, + + // fault is invoked when the actual execution of an opcode fails. + fault: function(log, db) { }, + + // result is invoked when all the opcodes have been iterated over and returns + // the final result of the tracing. + result: function(ctx) { + // Save the outer calldata also + if (ctx.input.length >= 4) { + this.store(slice(ctx.input, 0, 4), ctx.input.length-4) + } + return this.ids; + }, +} diff --git a/x/evm/core/tracers/js/internal/tracers/bigram_tracer.js b/x/evm/core/tracers/js/internal/tracers/bigram_tracer.js new file mode 100644 index 0000000000..421c360af9 --- /dev/null +++ b/x/evm/core/tracers/js/internal/tracers/bigram_tracer.js @@ -0,0 +1,47 @@ +// Copyright 2018 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +{ + // hist is the counters of opcode bigrams + hist: {}, + // lastOp is last operation + lastOp: '', + // execution depth of last op + lastDepth: 0, + // step is invoked for every opcode that the VM executes. + step: function(log, db) { + var op = log.op.toString(); + var depth = log.getDepth(); + if (depth == this.lastDepth){ + var key = this.lastOp+'-'+op; + if (this.hist[key]){ + this.hist[key]++; + } + else { + this.hist[key] = 1; + } + } + this.lastOp = op; + this.lastDepth = depth; + }, + // fault is invoked when the actual execution of an opcode fails. + fault: function(log, db) {}, + // result is invoked when all the opcodes have been iterated over and returns + // the final result of the tracing. + result: function(ctx) { + return this.hist; + }, +} diff --git a/x/evm/core/tracers/js/internal/tracers/call_tracer_legacy.js b/x/evm/core/tracers/js/internal/tracers/call_tracer_legacy.js new file mode 100644 index 0000000000..3ca7377738 --- /dev/null +++ b/x/evm/core/tracers/js/internal/tracers/call_tracer_legacy.js @@ -0,0 +1,252 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +// callTracer is a full blown transaction tracer that extracts and reports all +// the internal calls made by a transaction, along with any useful information. +{ + // callstack is the current recursive call stack of the EVM execution. + callstack: [{}], + + // descended tracks whether we've just descended from an outer transaction into + // an inner call. + descended: false, + + // step is invoked for every opcode that the VM executes. + step: function(log, db) { + // Capture any errors immediately + var error = log.getError(); + if (error !== undefined) { + this.fault(log, db); + return; + } + // We only care about system opcodes, faster if we pre-check once + var syscall = (log.op.toNumber() & 0xf0) == 0xf0; + if (syscall) { + var op = log.op.toString(); + } + // If a new contract is being created, add to the call stack + if (syscall && (op == 'CREATE' || op == "CREATE2")) { + var inOff = log.stack.peek(1).valueOf(); + var inEnd = inOff + log.stack.peek(2).valueOf(); + + // Assemble the internal call report and store for completion + var call = { + type: op, + from: toHex(log.contract.getAddress()), + input: toHex(log.memory.slice(inOff, inEnd)), + gasIn: log.getGas(), + gasCost: log.getCost(), + value: '0x' + log.stack.peek(0).toString(16) + }; + this.callstack.push(call); + this.descended = true + return; + } + // If a contract is being self destructed, gather that as a subcall too + if (syscall && op == 'SELFDESTRUCT') { + var left = this.callstack.length; + if (this.callstack[left-1].calls === undefined) { + this.callstack[left-1].calls = []; + } + this.callstack[left-1].calls.push({ + type: op, + from: toHex(log.contract.getAddress()), + to: toHex(toAddress(log.stack.peek(0).toString(16))), + gasIn: log.getGas(), + gasCost: log.getCost(), + value: '0x' + db.getBalance(log.contract.getAddress()).toString(16) + }); + return + } + // If a new method invocation is being done, add to the call stack + if (syscall && (op == 'CALL' || op == 'CALLCODE' || op == 'DELEGATECALL' || op == 'STATICCALL')) { + // Skip any pre-compile invocations, those are just fancy opcodes + var to = toAddress(log.stack.peek(1).toString(16)); + if (isPrecompiled(to)) { + return + } + var off = (op == 'DELEGATECALL' || op == 'STATICCALL' ? 0 : 1); + + var inOff = log.stack.peek(2 + off).valueOf(); + var inEnd = inOff + log.stack.peek(3 + off).valueOf(); + + // Assemble the internal call report and store for completion + var call = { + type: op, + from: toHex(log.contract.getAddress()), + to: toHex(to), + input: toHex(log.memory.slice(inOff, inEnd)), + gasIn: log.getGas(), + gasCost: log.getCost(), + outOff: log.stack.peek(4 + off).valueOf(), + outLen: log.stack.peek(5 + off).valueOf() + }; + if (op != 'DELEGATECALL' && op != 'STATICCALL') { + call.value = '0x' + log.stack.peek(2).toString(16); + } + this.callstack.push(call); + this.descended = true + return; + } + // If we've just descended into an inner call, retrieve it's true allowance. We + // need to extract if from within the call as there may be funky gas dynamics + // with regard to requested and actually given gas (2300 stipend, 63/64 rule). + if (this.descended) { + if (log.getDepth() >= this.callstack.length) { + this.callstack[this.callstack.length - 1].gas = log.getGas(); + } else { + // TODO(karalabe): The call was made to a plain account. We currently don't + // have access to the true gas amount inside the call and so any amount will + // mostly be wrong since it depends on a lot of input args. Skip gas for now. + } + this.descended = false; + } + // If an existing call is returning, pop off the call stack + if (syscall && op == 'REVERT') { + this.callstack[this.callstack.length - 1].error = "execution reverted"; + return; + } + if (log.getDepth() == this.callstack.length - 1) { + // Pop off the last call and get the execution results + var call = this.callstack.pop(); + + if (call.type == 'CREATE' || call.type == "CREATE2") { + // If the call was a CREATE, retrieve the contract address and output code + call.gasUsed = '0x' + bigInt(call.gasIn - call.gasCost - log.getGas()).toString(16); + delete call.gasIn; delete call.gasCost; + + var ret = log.stack.peek(0); + if (!ret.equals(0)) { + call.to = toHex(toAddress(ret.toString(16))); + call.output = toHex(db.getCode(toAddress(ret.toString(16)))); + } else if (call.error === undefined) { + call.error = "internal failure"; // TODO(karalabe): surface these faults somehow + } + } else { + // If the call was a contract call, retrieve the gas usage and output + if (call.gas !== undefined) { + call.gasUsed = '0x' + bigInt(call.gasIn - call.gasCost + call.gas - log.getGas()).toString(16); + } + var ret = log.stack.peek(0); + if (!ret.equals(0)) { + call.output = toHex(log.memory.slice(call.outOff, call.outOff + call.outLen)); + } else if (call.error === undefined) { + call.error = "internal failure"; // TODO(karalabe): surface these faults somehow + } + delete call.gasIn; delete call.gasCost; + delete call.outOff; delete call.outLen; + } + if (call.gas !== undefined) { + call.gas = '0x' + bigInt(call.gas).toString(16); + } + // Inject the call into the previous one + var left = this.callstack.length; + if (this.callstack[left-1].calls === undefined) { + this.callstack[left-1].calls = []; + } + this.callstack[left-1].calls.push(call); + } + }, + + // fault is invoked when the actual execution of an opcode fails. + fault: function(log, db) { + // If the topmost call already reverted, don't handle the additional fault again + if (this.callstack[this.callstack.length - 1].error !== undefined) { + return; + } + // Pop off the just failed call + var call = this.callstack.pop(); + call.error = log.getError(); + + // Consume all available gas and clean any leftovers + if (call.gas !== undefined) { + call.gas = '0x' + bigInt(call.gas).toString(16); + call.gasUsed = call.gas + } + delete call.gasIn; delete call.gasCost; + delete call.outOff; delete call.outLen; + + // Flatten the failed call into its parent + var left = this.callstack.length; + if (left > 0) { + if (this.callstack[left-1].calls === undefined) { + this.callstack[left-1].calls = []; + } + this.callstack[left-1].calls.push(call); + return; + } + // Last call failed too, leave it in the stack + this.callstack.push(call); + }, + + // result is invoked when all the opcodes have been iterated over and returns + // the final result of the tracing. + result: function(ctx, db) { + var result = { + type: ctx.type, + from: toHex(ctx.from), + to: toHex(ctx.to), + value: '0x' + ctx.value.toString(16), + gas: '0x' + bigInt(ctx.gas).toString(16), + gasUsed: '0x' + bigInt(ctx.gasUsed).toString(16), + input: toHex(ctx.input), + output: toHex(ctx.output), + time: ctx.time, + }; + if (this.callstack[0].calls !== undefined) { + result.calls = this.callstack[0].calls; + } + if (this.callstack[0].error !== undefined) { + result.error = this.callstack[0].error; + } else if (ctx.error !== undefined) { + result.error = ctx.error; + } + if (result.error !== undefined && (result.error !== "execution reverted" || result.output ==="0x")) { + delete result.output; + } + return this.finalize(result); + }, + + // finalize recreates a call object using the final desired field oder for json + // serialization. This is a nicety feature to pass meaningfully ordered results + // to users who don't interpret it, just display it. + finalize: function(call) { + var sorted = { + type: call.type, + from: call.from, + to: call.to, + value: call.value, + gas: call.gas, + gasUsed: call.gasUsed, + input: call.input, + output: call.output, + error: call.error, + time: call.time, + calls: call.calls, + } + for (var key in sorted) { + if (sorted[key] === undefined) { + delete sorted[key]; + } + } + if (sorted.calls !== undefined) { + for (var i=0; i. + +// evmdisTracer returns sufficient information from a trace to perform evmdis-style +// disassembly. +{ + stack: [{ops: []}], + + npushes: {0: 0, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1, 10: 1, 11: 1, 16: 1, 17: 1, 18: 1, 19: 1, 20: 1, 21: 1, 22: 1, 23: 1, 24: 1, 25: 1, 26: 1, 32: 1, 48: 1, 49: 1, 50: 1, 51: 1, 52: 1, 53: 1, 54: 1, 55: 0, 56: 1, 57: 0, 58: 1, 59: 1, 60: 0, 64: 1, 65: 1, 66: 1, 67: 1, 68: 1, 69: 1, 80: 0, 81: 1, 82: 0, 83: 0, 84: 1, 85: 0, 86: 0, 87: 0, 88: 1, 89: 1, 90: 1, 91: 0, 96: 1, 97: 1, 98: 1, 99: 1, 100: 1, 101: 1, 102: 1, 103: 1, 104: 1, 105: 1, 106: 1, 107: 1, 108: 1, 109: 1, 110: 1, 111: 1, 112: 1, 113: 1, 114: 1, 115: 1, 116: 1, 117: 1, 118: 1, 119: 1, 120: 1, 121: 1, 122: 1, 123: 1, 124: 1, 125: 1, 126: 1, 127: 1, 128: 2, 129: 3, 130: 4, 131: 5, 132: 6, 133: 7, 134: 8, 135: 9, 136: 10, 137: 11, 138: 12, 139: 13, 140: 14, 141: 15, 142: 16, 143: 17, 144: 2, 145: 3, 146: 4, 147: 5, 148: 6, 149: 7, 150: 8, 151: 9, 152: 10, 153: 11, 154: 12, 155: 13, 156: 14, 157: 15, 158: 16, 159: 17, 160: 0, 161: 0, 162: 0, 163: 0, 164: 0, 240: 1, 241: 1, 242: 1, 243: 0, 244: 0, 255: 0}, + + // result is invoked when all the opcodes have been iterated over and returns + // the final result of the tracing. + result: function() { return this.stack[0].ops; }, + + // fault is invoked when the actual execution of an opcode fails. + fault: function(log, db) { }, + + // step is invoked for every opcode that the VM executes. + step: function(log, db) { + var frame = this.stack[this.stack.length - 1]; + + var error = log.getError(); + if (error) { + frame["error"] = error; + } else if (log.getDepth() == this.stack.length) { + opinfo = { + op: log.op.toNumber(), + depth : log.getDepth(), + result: [], + }; + if (frame.ops.length > 0) { + var prevop = frame.ops[frame.ops.length - 1]; + for(var i = 0; i < this.npushes[prevop.op]; i++) + prevop.result.push(log.stack.peek(i).toString(16)); + } + switch(log.op.toString()) { + case "CALL": case "CALLCODE": + var instart = log.stack.peek(3).valueOf(); + var insize = log.stack.peek(4).valueOf(); + opinfo["gas"] = log.stack.peek(0).valueOf(); + opinfo["to"] = log.stack.peek(1).toString(16); + opinfo["value"] = log.stack.peek(2).toString(); + opinfo["input"] = log.memory.slice(instart, instart + insize); + opinfo["error"] = null; + opinfo["return"] = null; + opinfo["ops"] = []; + this.stack.push(opinfo); + break; + case "DELEGATECALL": case "STATICCALL": + var instart = log.stack.peek(2).valueOf(); + var insize = log.stack.peek(3).valueOf(); + opinfo["op"] = log.op.toString(); + opinfo["gas"] = log.stack.peek(0).valueOf(); + opinfo["to"] = log.stack.peek(1).toString(16); + opinfo["input"] = log.memory.slice(instart, instart + insize); + opinfo["error"] = null; + opinfo["return"] = null; + opinfo["ops"] = []; + this.stack.push(opinfo); + break; + case "RETURN": case "REVERT": + var out = log.stack.peek(0).valueOf(); + var outsize = log.stack.peek(1).valueOf(); + frame.return = log.memory.slice(out, out + outsize); + break; + case "STOP": case "SELFDESTRUCT": + frame.return = log.memory.slice(0, 0); + break; + case "JUMPDEST": + opinfo["pc"] = log.getPC(); + } + if(log.op.isPush()) { + opinfo["len"] = log.op.toNumber() - 0x5e; + } + frame.ops.push(opinfo); + } else { + this.stack = this.stack.slice(0, log.getDepth()); + } + } +} diff --git a/x/evm/core/tracers/js/internal/tracers/noop_tracer_legacy.js b/x/evm/core/tracers/js/internal/tracers/noop_tracer_legacy.js new file mode 100644 index 0000000000..fe7ddc85ab --- /dev/null +++ b/x/evm/core/tracers/js/internal/tracers/noop_tracer_legacy.js @@ -0,0 +1,29 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +// noopTracer is just the barebone boilerplate code required from a JavaScript +// object to be usable as a transaction tracer. +{ + // step is invoked for every opcode that the VM executes. + step: function(log, db) { }, + + // fault is invoked when the actual execution of an opcode fails. + fault: function(log, db) { }, + + // result is invoked when all the opcodes have been iterated over and returns + // the final result of the tracing. + result: function(ctx, db) { return {}; } +} diff --git a/x/evm/core/tracers/js/internal/tracers/opcount_tracer.js b/x/evm/core/tracers/js/internal/tracers/opcount_tracer.js new file mode 100644 index 0000000000..f7984c741a --- /dev/null +++ b/x/evm/core/tracers/js/internal/tracers/opcount_tracer.js @@ -0,0 +1,32 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +// opcountTracer is a sample tracer that just counts the number of instructions +// executed by the EVM before the transaction terminated. +{ + // count tracks the number of EVM instructions executed. + count: 0, + + // step is invoked for every opcode that the VM executes. + step: function(log, db) { this.count++ }, + + // fault is invoked when the actual execution of an opcode fails. + fault: function(log, db) { }, + + // result is invoked when all the opcodes have been iterated over and returns + // the final result of the tracing. + result: function(ctx, db) { return this.count } +} diff --git a/x/evm/core/tracers/js/internal/tracers/prestate_tracer_legacy.js b/x/evm/core/tracers/js/internal/tracers/prestate_tracer_legacy.js new file mode 100644 index 0000000000..77f25209cd --- /dev/null +++ b/x/evm/core/tracers/js/internal/tracers/prestate_tracer_legacy.js @@ -0,0 +1,115 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +// prestateTracer outputs sufficient information to create a local execution of +// the transaction from a custom assembled genesis block. +{ + // prestate is the genesis that we're building. + prestate: null, + + // lookupAccount injects the specified account into the prestate object. + lookupAccount: function(addr, db){ + var acc = toHex(addr); + if (this.prestate[acc] === undefined) { + this.prestate[acc] = { + balance: '0x' + db.getBalance(addr).toString(16), + nonce: db.getNonce(addr), + code: toHex(db.getCode(addr)), + storage: {} + }; + } + }, + + // lookupStorage injects the specified storage entry of the given account into + // the prestate object. + lookupStorage: function(addr, key, db){ + var acc = toHex(addr); + var idx = toHex(key); + + if (this.prestate[acc].storage[idx] === undefined) { + this.prestate[acc].storage[idx] = toHex(db.getState(addr, key)); + } + }, + + // result is invoked when all the opcodes have been iterated over and returns + // the final result of the tracing. + result: function(ctx, db) { + if (this.prestate === null) { + this.prestate = {}; + // If tx is transfer-only, the recipient account + // hasn't been populated. + this.lookupAccount(ctx.to, db); + } + + // At this point, we need to deduct the 'value' from the + // outer transaction, and move it back to the origin + this.lookupAccount(ctx.from, db); + + var fromBal = bigInt(this.prestate[toHex(ctx.from)].balance.slice(2), 16); + var toBal = bigInt(this.prestate[toHex(ctx.to)].balance.slice(2), 16); + + this.prestate[toHex(ctx.to)].balance = '0x'+toBal.subtract(ctx.value).toString(16); + this.prestate[toHex(ctx.from)].balance = '0x'+fromBal.add(ctx.value).add((ctx.gasUsed + ctx.intrinsicGas) * ctx.gasPrice).toString(16); + + // Decrement the caller's nonce, and remove empty create targets + this.prestate[toHex(ctx.from)].nonce--; + if (ctx.type == 'CREATE') { + // We can blibdly delete the contract prestate, as any existing state would + // have caused the transaction to be rejected as invalid in the first place. + delete this.prestate[toHex(ctx.to)]; + } + // Return the assembled allocations (prestate) + return this.prestate; + }, + + // step is invoked for every opcode that the VM executes. + step: function(log, db) { + // Add the current account if we just started tracing + if (this.prestate === null){ + this.prestate = {}; + // Balance will potentially be wrong here, since this will include the value + // sent along with the message. We fix that in 'result()'. + this.lookupAccount(log.contract.getAddress(), db); + } + // Whenever new state is accessed, add it to the prestate + switch (log.op.toString()) { + case "EXTCODECOPY": case "EXTCODESIZE": case "EXTCODEHASH": case "BALANCE": + this.lookupAccount(toAddress(log.stack.peek(0).toString(16)), db); + break; + case "CREATE": + var from = log.contract.getAddress(); + this.lookupAccount(toContract(from, db.getNonce(from)), db); + break; + case "CREATE2": + var from = log.contract.getAddress(); + // stack: salt, size, offset, endowment + var offset = log.stack.peek(1).valueOf() + var size = log.stack.peek(2).valueOf() + var end = offset + size + this.lookupAccount(toContract2(from, log.stack.peek(3).toString(16), log.memory.slice(offset, end)), db); + break; + case "CALL": case "CALLCODE": case "DELEGATECALL": case "STATICCALL": + this.lookupAccount(toAddress(log.stack.peek(1).toString(16)), db); + break; + case 'SSTORE':case 'SLOAD': + this.lookupStorage(log.contract.getAddress(), toWord(log.stack.peek(0).toString(16)), db); + break; + } + }, + + // fault is invoked when the actual execution of an opcode fails. + fault: function(log, db) {} +} diff --git a/x/evm/core/tracers/js/internal/tracers/tracers.go b/x/evm/core/tracers/js/internal/tracers/tracers.go new file mode 100644 index 0000000000..c3c88a0741 --- /dev/null +++ b/x/evm/core/tracers/js/internal/tracers/tracers.go @@ -0,0 +1,59 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +// Package tracers contains the actual JavaScript tracer assets. +package tracers + +import ( + "embed" + "io/fs" + "strings" + "unicode" +) + +//go:embed *.js +var files embed.FS + +// Load reads the built-in JS tracer files embedded in the binary and +// returns a mapping of tracer name to source. +func Load() (map[string]string, error) { + assetTracers := make(map[string]string) + err := fs.WalkDir(files, ".", func(path string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + if d.IsDir() { + return nil + } + b, err := fs.ReadFile(files, path) + if err != nil { + return err + } + name := camel(strings.TrimSuffix(path, ".js")) + assetTracers[name] = string(b) + return nil + }) + return assetTracers, err +} + +// camel converts a snake cased input string into a camel cased output. +func camel(str string) string { + pieces := strings.Split(str, "_") + for i := 1; i < len(pieces); i++ { + pieces[i] = string(unicode.ToUpper(rune(pieces[i][0]))) + pieces[i][1:] + } + return strings.Join(pieces, "") +} diff --git a/x/evm/core/tracers/js/internal/tracers/trigram_tracer.js b/x/evm/core/tracers/js/internal/tracers/trigram_tracer.js new file mode 100644 index 0000000000..8756490dfc --- /dev/null +++ b/x/evm/core/tracers/js/internal/tracers/trigram_tracer.js @@ -0,0 +1,49 @@ +// Copyright 2018 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +{ + // hist is the map of trigram counters + hist: {}, + // lastOp is last operation + lastOps: ['',''], + lastDepth: 0, + // step is invoked for every opcode that the VM executes. + step: function(log, db) { + var depth = log.getDepth(); + if (depth != this.lastDepth){ + this.lastOps = ['','']; + this.lastDepth = depth; + return; + } + var op = log.op.toString(); + var key = this.lastOps[0]+'-'+this.lastOps[1]+'-'+op; + if (this.hist[key]){ + this.hist[key]++; + } + else { + this.hist[key] = 1; + } + this.lastOps[0] = this.lastOps[1]; + this.lastOps[1] = op; + }, + // fault is invoked when the actual execution of an opcode fails. + fault: function(log, db) {}, + // result is invoked when all the opcodes have been iterated over and returns + // the final result of the tracing. + result: function(ctx) { + return this.hist; + }, +} diff --git a/x/evm/core/tracers/js/internal/tracers/unigram_tracer.js b/x/evm/core/tracers/js/internal/tracers/unigram_tracer.js new file mode 100644 index 0000000000..51107d8f3d --- /dev/null +++ b/x/evm/core/tracers/js/internal/tracers/unigram_tracer.js @@ -0,0 +1,41 @@ +// Copyright 2018 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +{ + // hist is the map of opcodes to counters + hist: {}, + // nops counts number of ops + nops: 0, + // step is invoked for every opcode that the VM executes. + step: function(log, db) { + var op = log.op.toString(); + if (this.hist[op]){ + this.hist[op]++; + } + else { + this.hist[op] = 1; + } + this.nops++; + }, + // fault is invoked when the actual execution of an opcode fails. + fault: function(log, db) {}, + + // result is invoked when all the opcodes have been iterated over and returns + // the final result of the tracing. + result: function(ctx) { + return this.hist; + }, +} diff --git a/x/evm/core/tracers/js/tracer_test.go b/x/evm/core/tracers/js/tracer_test.go new file mode 100644 index 0000000000..5e0cf32413 --- /dev/null +++ b/x/evm/core/tracers/js/tracer_test.go @@ -0,0 +1,306 @@ +// Copyright 2021 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package js + +import ( + "encoding/json" + "errors" + "math/big" + "strings" + "testing" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/params" + "github.com/evmos/evmos/v18/x/evm/core/tracers" + "github.com/evmos/evmos/v18/x/evm/core/vm" +) + +type account struct{} + +func (account) SubBalance(amount *big.Int) {} +func (account) AddBalance(amount *big.Int) {} +func (account) SetAddress(common.Address) {} +func (account) Value() *big.Int { return nil } +func (account) SetBalance(*big.Int) {} +func (account) SetNonce(uint64) {} +func (account) Balance() *big.Int { return nil } +func (account) Address() common.Address { return common.Address{} } +func (account) SetCode(common.Hash, []byte) {} +func (account) ForEachStorage(cb func(key, value common.Hash) bool) {} + +type dummyStatedb struct { + state.StateDB +} + +func (*dummyStatedb) GetRefund() uint64 { return 1337 } +func (*dummyStatedb) GetBalance(addr common.Address) *big.Int { return new(big.Int) } + +type vmContext struct { + blockCtx vm.BlockContext + txCtx vm.TxContext +} + +func testCtx() *vmContext { + return &vmContext{blockCtx: vm.BlockContext{BlockNumber: big.NewInt(1)}, txCtx: vm.TxContext{GasPrice: big.NewInt(100000)}} +} + +func runTrace(tracer tracers.Tracer, vmctx *vmContext, chaincfg *params.ChainConfig) (json.RawMessage, error) { + var ( + env = vm.NewEVM(vmctx.blockCtx, vmctx.txCtx, &dummyStatedb{}, chaincfg, vm.Config{Debug: true, Tracer: tracer}) + gasLimit uint64 = 31000 + startGas uint64 = 10000 + value = big.NewInt(0) + contract = vm.NewContract(account{}, account{}, value, startGas) + ) + contract.Code = []byte{byte(vm.PUSH1), 0x1, byte(vm.PUSH1), 0x1, 0x0} + + tracer.CaptureTxStart(gasLimit) + tracer.CaptureStart(env, contract.Caller(), contract.Address(), false, []byte{}, startGas, value) + ret, err := env.Interpreter().Run(contract, []byte{}, false) + tracer.CaptureEnd(ret, startGas-contract.Gas, 1, err) + // Rest gas assumes no refund + tracer.CaptureTxEnd(startGas - contract.Gas) + if err != nil { + return nil, err + } + return tracer.GetResult() +} + +func TestTracer(t *testing.T) { + execTracer := func(code string) ([]byte, string) { + t.Helper() + tracer, err := newJsTracer(code, nil, nil) + if err != nil { + t.Fatal(err) + } + ret, err := runTrace(tracer, testCtx(), params.TestChainConfig) + if err != nil { + return nil, err.Error() // Stringify to allow comparison without nil checks + } + return ret, "" + } + for i, tt := range []struct { + code string + want string + fail string + }{ + { // tests that we don't panic on bad arguments to memory access + code: "{depths: [], step: function(log) { this.depths.push(log.memory.slice(-1,-2)); }, fault: function() {}, result: function() { return this.depths; }}", + want: ``, + fail: "tracer accessed out of bound memory: offset -1, end -2 at step (:1:53(15)) in server-side tracer function 'step'", + }, { // tests that we don't panic on bad arguments to stack peeks + code: "{depths: [], step: function(log) { this.depths.push(log.stack.peek(-1)); }, fault: function() {}, result: function() { return this.depths; }}", + want: ``, + fail: "tracer accessed out of bound stack: size 0, index -1 at step (:1:53(13)) in server-side tracer function 'step'", + }, { // tests that we don't panic on bad arguments to memory getUint + code: "{ depths: [], step: function(log, db) { this.depths.push(log.memory.getUint(-64));}, fault: function() {}, result: function() { return this.depths; }}", + want: ``, + fail: "tracer accessed out of bound memory: available 0, offset -64, size 32 at step (:1:58(13)) in server-side tracer function 'step'", + }, { // tests some general counting + code: "{count: 0, step: function() { this.count += 1; }, fault: function() {}, result: function() { return this.count; }}", + want: `3`, + }, { // tests that depth is reported correctly + code: "{depths: [], step: function(log) { this.depths.push(log.stack.length()); }, fault: function() {}, result: function() { return this.depths; }}", + want: `[0,1,2]`, + }, { // tests memory length + code: "{lengths: [], step: function(log) { this.lengths.push(log.memory.length()); }, fault: function() {}, result: function() { return this.lengths; }}", + want: `[0,0,0]`, + }, { // tests to-string of opcodes + code: "{opcodes: [], step: function(log) { this.opcodes.push(log.op.toString()); }, fault: function() {}, result: function() { return this.opcodes; }}", + want: `["PUSH1","PUSH1","STOP"]`, + }, { // tests intrinsic gas + code: "{depths: [], step: function() {}, fault: function() {}, result: function(ctx) { return ctx.gasPrice+'.'+ctx.gasUsed+'.'+ctx.intrinsicGas; }}", + want: `"100000.6.21000"`, + }, { + code: "{res: null, step: function(log) {}, fault: function() {}, result: function() { return toWord('0xffaa') }}", + want: `{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":255,"31":170}`, + }, { // test feeding a buffer back into go + code: "{res: null, step: function(log) { var address = log.contract.getAddress(); this.res = toAddress(address); }, fault: function() {}, result: function() { return this.res }}", + want: `{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0}`, + }, { + code: "{res: null, step: function(log) { var address = '0x0000000000000000000000000000000000000000'; this.res = toAddress(address); }, fault: function() {}, result: function() { return this.res }}", + want: `{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0}`, + }, { + code: "{res: null, step: function(log) { var address = Array.prototype.slice.call(log.contract.getAddress()); this.res = toAddress(address); }, fault: function() {}, result: function() { return this.res }}", + want: `{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0}`, + }, + } { + if have, err := execTracer(tt.code); tt.want != string(have) || tt.fail != err { + t.Errorf("testcase %d: expected return value to be '%s' got '%s', error to be '%s' got '%s'\n\tcode: %v", i, tt.want, string(have), tt.fail, err, tt.code) + } + } +} + +func TestHalt(t *testing.T) { + timeout := errors.New("stahp") + tracer, err := newJsTracer("{step: function() { while(1); }, result: function() { return null; }, fault: function(){}}", nil, nil) + if err != nil { + t.Fatal(err) + } + go func() { + time.Sleep(1 * time.Second) + tracer.Stop(timeout) + }() + if _, err = runTrace(tracer, testCtx(), params.TestChainConfig); !strings.Contains(err.Error(), "stahp") { + t.Errorf("Expected timeout error, got %v", err) + } +} + +func TestHaltBetweenSteps(t *testing.T) { + tracer, err := newJsTracer("{step: function() {}, fault: function() {}, result: function() { return null; }}", nil, nil) + if err != nil { + t.Fatal(err) + } + env := vm.NewEVM(vm.BlockContext{BlockNumber: big.NewInt(1)}, vm.TxContext{GasPrice: big.NewInt(1)}, &dummyStatedb{}, params.TestChainConfig, vm.Config{Debug: true, Tracer: tracer}) + scope := &vm.ScopeContext{ + Contract: vm.NewContract(&account{}, &account{}, big.NewInt(0), 0), + } + tracer.CaptureStart(env, common.Address{}, common.Address{}, false, []byte{}, 0, big.NewInt(0)) + tracer.CaptureState(0, 0, 0, 0, scope, nil, 0, nil) + timeout := errors.New("stahp") + tracer.Stop(timeout) + tracer.CaptureState(0, 0, 0, 0, scope, nil, 0, nil) + + if _, err := tracer.GetResult(); !strings.Contains(err.Error(), timeout.Error()) { + t.Errorf("Expected timeout error, got %v", err) + } +} + +// testNoStepExec tests a regular value transfer (no exec), and accessing the statedb +// in 'result' +func TestNoStepExec(t *testing.T) { + execTracer := func(code string) []byte { + t.Helper() + tracer, err := newJsTracer(code, nil, nil) + if err != nil { + t.Fatal(err) + } + env := vm.NewEVM(vm.BlockContext{BlockNumber: big.NewInt(1)}, vm.TxContext{GasPrice: big.NewInt(100)}, &dummyStatedb{}, params.TestChainConfig, vm.Config{Debug: true, Tracer: tracer}) + tracer.CaptureStart(env, common.Address{}, common.Address{}, false, []byte{}, 1000, big.NewInt(0)) + tracer.CaptureEnd(nil, 0, 1, nil) + ret, err := tracer.GetResult() + if err != nil { + t.Fatal(err) + } + return ret + } + for i, tt := range []struct { + code string + want string + }{ + { // tests that we don't panic on accessing the db methods + code: "{depths: [], step: function() {}, fault: function() {}, result: function(ctx, db){ return db.getBalance(ctx.to)} }", + want: `"0"`, + }, + } { + if have := execTracer(tt.code); tt.want != string(have) { + t.Errorf("testcase %d: expected return value to be %s got %s\n\tcode: %v", i, tt.want, string(have), tt.code) + } + } +} + +func TestIsPrecompile(t *testing.T) { + chaincfg := ¶ms.ChainConfig{ChainID: big.NewInt(1), HomesteadBlock: big.NewInt(0), DAOForkBlock: nil, DAOForkSupport: false, EIP150Block: big.NewInt(0), EIP150Hash: common.Hash{}, EIP155Block: big.NewInt(0), EIP158Block: big.NewInt(0), ByzantiumBlock: big.NewInt(100), ConstantinopleBlock: big.NewInt(0), PetersburgBlock: big.NewInt(0), IstanbulBlock: big.NewInt(200), MuirGlacierBlock: big.NewInt(0), BerlinBlock: big.NewInt(300), LondonBlock: big.NewInt(0), TerminalTotalDifficulty: nil, Ethash: new(params.EthashConfig), Clique: nil} + chaincfg.ByzantiumBlock = big.NewInt(100) + chaincfg.IstanbulBlock = big.NewInt(200) + chaincfg.BerlinBlock = big.NewInt(300) + txCtx := vm.TxContext{GasPrice: big.NewInt(100000)} + tracer, err := newJsTracer("{addr: toAddress('0000000000000000000000000000000000000009'), res: null, step: function() { this.res = isPrecompiled(this.addr); }, fault: function() {}, result: function() { return this.res; }}", nil, nil) + if err != nil { + t.Fatal(err) + } + + blockCtx := vm.BlockContext{BlockNumber: big.NewInt(150)} + res, err := runTrace(tracer, &vmContext{blockCtx, txCtx}, chaincfg) + if err != nil { + t.Error(err) + } + if string(res) != "false" { + t.Errorf("tracer should not consider blake2f as precompile in byzantium") + } + + tracer, _ = newJsTracer("{addr: toAddress('0000000000000000000000000000000000000009'), res: null, step: function() { this.res = isPrecompiled(this.addr); }, fault: function() {}, result: function() { return this.res; }}", nil, nil) + blockCtx = vm.BlockContext{BlockNumber: big.NewInt(250)} + res, err = runTrace(tracer, &vmContext{blockCtx, txCtx}, chaincfg) + if err != nil { + t.Error(err) + } + if string(res) != "true" { + t.Errorf("tracer should consider blake2f as precompile in istanbul") + } +} + +func TestEnterExit(t *testing.T) { + // test that either both or none of enter() and exit() are defined + if _, err := newJsTracer("{step: function() {}, fault: function() {}, result: function() { return null; }, enter: function() {}}", new(tracers.Context), nil); err == nil { + t.Fatal("tracer creation should've failed without exit() definition") + } + if _, err := newJsTracer("{step: function() {}, fault: function() {}, result: function() { return null; }, enter: function() {}, exit: function() {}}", new(tracers.Context), nil); err != nil { + t.Fatal(err) + } + // test that the enter and exit method are correctly invoked and the values passed + tracer, err := newJsTracer("{enters: 0, exits: 0, enterGas: 0, gasUsed: 0, step: function() {}, fault: function() {}, result: function() { return {enters: this.enters, exits: this.exits, enterGas: this.enterGas, gasUsed: this.gasUsed} }, enter: function(frame) { this.enters++; this.enterGas = frame.getGas(); }, exit: function(res) { this.exits++; this.gasUsed = res.getGasUsed(); }}", new(tracers.Context), nil) + if err != nil { + t.Fatal(err) + } + scope := &vm.ScopeContext{ + Contract: vm.NewContract(&account{}, &account{}, big.NewInt(0), 0), + } + tracer.CaptureEnter(vm.CALL, scope.Contract.Caller(), scope.Contract.Address(), []byte{}, 1000, new(big.Int)) + tracer.CaptureExit([]byte{}, 400, nil) + + have, err := tracer.GetResult() + if err != nil { + t.Fatal(err) + } + want := `{"enters":1,"exits":1,"enterGas":1000,"gasUsed":400}` + if string(have) != want { + t.Errorf("Number of invocations of enter() and exit() is wrong. Have %s, want %s\n", have, want) + } +} + +func TestSetup(t *testing.T) { + // Test empty config + _, err := newJsTracer(`{setup: function(cfg) { if (cfg !== "{}") { throw("invalid empty config") } }, fault: function() {}, result: function() {}}`, new(tracers.Context), nil) + if err != nil { + t.Error(err) + } + + cfg, err := json.Marshal(map[string]string{"foo": "bar"}) + if err != nil { + t.Fatal(err) + } + // Test no setup func + _, err = newJsTracer(`{fault: function() {}, result: function() {}}`, new(tracers.Context), cfg) + if err != nil { + t.Fatal(err) + } + // Test config value + tracer, err := newJsTracer("{config: null, setup: function(cfg) { this.config = JSON.parse(cfg) }, step: function() {}, fault: function() {}, result: function() { return this.config.foo }}", new(tracers.Context), cfg) + if err != nil { + t.Fatal(err) + } + have, err := tracer.GetResult() + if err != nil { + t.Fatal(err) + } + if string(have) != `"bar"` { + t.Errorf("tracer returned wrong result. have: %s, want: \"bar\"\n", string(have)) + } +} diff --git a/x/evm/core/tracers/native/4byte.go b/x/evm/core/tracers/native/4byte.go new file mode 100644 index 0000000000..2ff3ddb5a1 --- /dev/null +++ b/x/evm/core/tracers/native/4byte.go @@ -0,0 +1,153 @@ +// Copyright 2021 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package native + +import ( + "encoding/json" + "math/big" + "strconv" + "sync/atomic" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/evmos/evmos/v18/x/evm/core/tracers" + "github.com/evmos/evmos/v18/x/evm/core/vm" +) + +func init() { + register("4byteTracer", newFourByteTracer) +} + +// fourByteTracer searches for 4byte-identifiers, and collects them for post-processing. +// It collects the methods identifiers along with the size of the supplied data, so +// a reversed signature can be matched against the size of the data. +// +// Example: +// +// > debug.traceTransaction( "0x214e597e35da083692f5386141e69f47e973b2c56e7a8073b1ea08fd7571e9de", {tracer: "4byteTracer"}) +// { +// 0x27dc297e-128: 1, +// 0x38cc4831-0: 2, +// 0x524f3889-96: 1, +// 0xadf59f99-288: 1, +// 0xc281d19e-0: 1 +// } +type fourByteTracer struct { + env *vm.EVM + ids map[string]int // ids aggregates the 4byte ids found + interrupt uint32 // Atomic flag to signal execution interruption + reason error // Textual reason for the interruption + activePrecompiles []common.Address // Updated on CaptureStart based on given rules +} + +// newFourByteTracer returns a native go tracer which collects +// 4 byte-identifiers of a tx, and implements vm.EVMLogger. +func newFourByteTracer(ctx *tracers.Context, _ json.RawMessage) (tracers.Tracer, error) { + t := &fourByteTracer{ + ids: make(map[string]int), + } + return t, nil +} + +// isPrecompiled returns whether the addr is a precompile. Logic borrowed from newJsTracer in eth/tracers/js/tracer.go +func (t *fourByteTracer) isPrecompiled(addr common.Address) bool { + for _, p := range t.activePrecompiles { + if p == addr { + return true + } + } + return false +} + +// store saves the given identifier and datasize. +func (t *fourByteTracer) store(id []byte, size int) { + key := bytesToHex(id) + "-" + strconv.Itoa(size) + t.ids[key] += 1 +} + +// CaptureStart implements the EVMLogger interface to initialize the tracing operation. +func (t *fourByteTracer) CaptureStart(env *vm.EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) { + t.env = env + + // Update list of precompiles based on current block + rules := env.ChainConfig().Rules(env.Context.BlockNumber, env.Context.Random != nil) + t.activePrecompiles = env.ActivePrecompiles(rules) + + // Save the outer calldata also + if len(input) >= 4 { + t.store(input[0:4], len(input)-4) + } +} + +// CaptureState implements the EVMLogger interface to trace a single step of VM execution. +func (t *fourByteTracer) CaptureState(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, depth int, err error) { +} + +// CaptureEnter is called when EVM enters a new scope (via call, create or selfdestruct). +func (t *fourByteTracer) CaptureEnter(op vm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) { + // Skip if tracing was interrupted + if atomic.LoadUint32(&t.interrupt) > 0 { + t.env.Cancel() + return + } + if len(input) < 4 { + return + } + // primarily we want to avoid CREATE/CREATE2/SELFDESTRUCT + if op != vm.DELEGATECALL && op != vm.STATICCALL && + op != vm.CALL && op != vm.CALLCODE { + return + } + // Skip any pre-compile invocations, those are just fancy opcodes + if t.isPrecompiled(to) { + return + } + t.store(input[0:4], len(input)-4) +} + +// CaptureExit is called when EVM exits a scope, even if the scope didn't +// execute any code. +func (t *fourByteTracer) CaptureExit(output []byte, gasUsed uint64, err error) { +} + +// CaptureFault implements the EVMLogger interface to trace an execution fault. +func (t *fourByteTracer) CaptureFault(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, depth int, err error) { +} + +// CaptureEnd is called after the call finishes to finalize the tracing. +func (t *fourByteTracer) CaptureEnd(output []byte, gasUsed uint64, _ time.Duration, err error) { +} + +func (*fourByteTracer) CaptureTxStart(gasLimit uint64) {} + +func (*fourByteTracer) CaptureTxEnd(restGas uint64) {} + +// GetResult returns the json-encoded nested list of call traces, and any +// error arising from the encoding or forceful termination (via `Stop`). +func (t *fourByteTracer) GetResult() (json.RawMessage, error) { + res, err := json.Marshal(t.ids) + if err != nil { + return nil, err + } + return res, t.reason +} + +// Stop terminates execution of the tracer at the first opportune moment. +func (t *fourByteTracer) Stop(err error) { + t.reason = err + atomic.StoreUint32(&t.interrupt, 1) +} diff --git a/x/evm/core/tracers/native/call.go b/x/evm/core/tracers/native/call.go new file mode 100644 index 0000000000..3cde738b04 --- /dev/null +++ b/x/evm/core/tracers/native/call.go @@ -0,0 +1,202 @@ +// Copyright 2021 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package native + +import ( + "encoding/json" + "errors" + "math/big" + "strconv" + "strings" + "sync/atomic" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/evmos/evmos/v18/x/evm/core/tracers" + "github.com/evmos/evmos/v18/x/evm/core/vm" +) + +func init() { + register("callTracer", newCallTracer) +} + +type callFrame struct { + Type string `json:"type"` + From string `json:"from"` + To string `json:"to,omitempty"` + Value string `json:"value,omitempty"` + Gas string `json:"gas"` + GasUsed string `json:"gasUsed"` + Input string `json:"input"` + Output string `json:"output,omitempty"` + Error string `json:"error,omitempty"` + Calls []callFrame `json:"calls,omitempty"` +} + +type callTracer struct { + env *vm.EVM + callstack []callFrame + config callTracerConfig + interrupt uint32 // Atomic flag to signal execution interruption + reason error // Textual reason for the interruption +} + +type callTracerConfig struct { + OnlyTopCall bool `json:"onlyTopCall"` // If true, call tracer won't collect any subcalls +} + +// newCallTracer returns a native go tracer which tracks +// call frames of a tx, and implements vm.EVMLogger. +func newCallTracer(ctx *tracers.Context, cfg json.RawMessage) (tracers.Tracer, error) { + var config callTracerConfig + if cfg != nil { + if err := json.Unmarshal(cfg, &config); err != nil { + return nil, err + } + } + // First callframe contains tx context info + // and is populated on start and end. + return &callTracer{callstack: make([]callFrame, 1), config: config}, nil +} + +// CaptureStart implements the EVMLogger interface to initialize the tracing operation. +func (t *callTracer) CaptureStart(env *vm.EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) { + t.env = env + t.callstack[0] = callFrame{ + Type: "CALL", + From: addrToHex(from), + To: addrToHex(to), + Input: bytesToHex(input), + Gas: uintToHex(gas), + Value: bigToHex(value), + } + if create { + t.callstack[0].Type = "CREATE" + } +} + +// CaptureEnd is called after the call finishes to finalize the tracing. +func (t *callTracer) CaptureEnd(output []byte, gasUsed uint64, _ time.Duration, err error) { + t.callstack[0].GasUsed = uintToHex(gasUsed) + if err != nil { + t.callstack[0].Error = err.Error() + if err.Error() == "execution reverted" && len(output) > 0 { + t.callstack[0].Output = bytesToHex(output) + } + } else { + t.callstack[0].Output = bytesToHex(output) + } +} + +// CaptureState implements the EVMLogger interface to trace a single step of VM execution. +func (t *callTracer) CaptureState(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, depth int, err error) { +} + +// CaptureFault implements the EVMLogger interface to trace an execution fault. +func (t *callTracer) CaptureFault(pc uint64, op vm.OpCode, gas, cost uint64, _ *vm.ScopeContext, depth int, err error) { +} + +// CaptureEnter is called when EVM enters a new scope (via call, create or selfdestruct). +func (t *callTracer) CaptureEnter(typ vm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) { + if t.config.OnlyTopCall { + return + } + // Skip if tracing was interrupted + if atomic.LoadUint32(&t.interrupt) > 0 { + t.env.Cancel() + return + } + + call := callFrame{ + Type: typ.String(), + From: addrToHex(from), + To: addrToHex(to), + Input: bytesToHex(input), + Gas: uintToHex(gas), + Value: bigToHex(value), + } + t.callstack = append(t.callstack, call) +} + +// CaptureExit is called when EVM exits a scope, even if the scope didn't +// execute any code. +func (t *callTracer) CaptureExit(output []byte, gasUsed uint64, err error) { + if t.config.OnlyTopCall { + return + } + size := len(t.callstack) + if size <= 1 { + return + } + // pop call + call := t.callstack[size-1] + t.callstack = t.callstack[:size-1] + size -= 1 + + call.GasUsed = uintToHex(gasUsed) + if err == nil { + call.Output = bytesToHex(output) + } else { + call.Error = err.Error() + if call.Type == "CREATE" || call.Type == "CREATE2" { + call.To = "" + } + } + t.callstack[size-1].Calls = append(t.callstack[size-1].Calls, call) +} + +func (*callTracer) CaptureTxStart(gasLimit uint64) {} + +func (*callTracer) CaptureTxEnd(restGas uint64) {} + +// GetResult returns the json-encoded nested list of call traces, and any +// error arising from the encoding or forceful termination (via `Stop`). +func (t *callTracer) GetResult() (json.RawMessage, error) { + if len(t.callstack) != 1 { + return nil, errors.New("incorrect number of top-level calls") + } + res, err := json.Marshal(t.callstack[0]) + if err != nil { + return nil, err + } + return json.RawMessage(res), t.reason +} + +// Stop terminates execution of the tracer at the first opportune moment. +func (t *callTracer) Stop(err error) { + t.reason = err + atomic.StoreUint32(&t.interrupt, 1) +} + +func bytesToHex(s []byte) string { + return "0x" + common.Bytes2Hex(s) +} + +func bigToHex(n *big.Int) string { + if n == nil { + return "" + } + return "0x" + n.Text(16) +} + +func uintToHex(n uint64) string { + return "0x" + strconv.FormatUint(n, 16) +} + +func addrToHex(a common.Address) string { + return strings.ToLower(a.Hex()) +} diff --git a/x/evm/core/tracers/native/noop.go b/x/evm/core/tracers/native/noop.go new file mode 100644 index 0000000000..5e592dd8bb --- /dev/null +++ b/x/evm/core/tracers/native/noop.go @@ -0,0 +1,78 @@ +// Copyright 2021 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package native + +import ( + "encoding/json" + "math/big" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/evmos/evmos/v18/x/evm/core/tracers" + "github.com/evmos/evmos/v18/x/evm/core/vm" +) + +func init() { + register("noopTracer", newNoopTracer) +} + +// noopTracer is a go implementation of the Tracer interface which +// performs no action. It's mostly useful for testing purposes. +type noopTracer struct{} + +// newNoopTracer returns a new noop tracer. +func newNoopTracer(ctx *tracers.Context, _ json.RawMessage) (tracers.Tracer, error) { + return &noopTracer{}, nil +} + +// CaptureStart implements the EVMLogger interface to initialize the tracing operation. +func (t *noopTracer) CaptureStart(env *vm.EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) { +} + +// CaptureEnd is called after the call finishes to finalize the tracing. +func (t *noopTracer) CaptureEnd(output []byte, gasUsed uint64, _ time.Duration, err error) { +} + +// CaptureState implements the EVMLogger interface to trace a single step of VM execution. +func (t *noopTracer) CaptureState(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, depth int, err error) { +} + +// CaptureFault implements the EVMLogger interface to trace an execution fault. +func (t *noopTracer) CaptureFault(pc uint64, op vm.OpCode, gas, cost uint64, _ *vm.ScopeContext, depth int, err error) { +} + +// CaptureEnter is called when EVM enters a new scope (via call, create or selfdestruct). +func (t *noopTracer) CaptureEnter(typ vm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) { +} + +// CaptureExit is called when EVM exits a scope, even if the scope didn't +// execute any code. +func (t *noopTracer) CaptureExit(output []byte, gasUsed uint64, err error) { +} + +func (*noopTracer) CaptureTxStart(gasLimit uint64) {} + +func (*noopTracer) CaptureTxEnd(restGas uint64) {} + +// GetResult returns an empty json object. +func (t *noopTracer) GetResult() (json.RawMessage, error) { + return json.RawMessage(`{}`), nil +} + +// Stop terminates execution of the tracer at the first opportune moment. +func (t *noopTracer) Stop(err error) { +} diff --git a/x/evm/core/tracers/native/prestate.go b/x/evm/core/tracers/native/prestate.go new file mode 100644 index 0000000000..de71f8b898 --- /dev/null +++ b/x/evm/core/tracers/native/prestate.go @@ -0,0 +1,180 @@ +// Copyright 2022 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package native + +import ( + "encoding/json" + "math/big" + "sync/atomic" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/crypto" + "github.com/evmos/evmos/v18/x/evm/core/tracers" + "github.com/evmos/evmos/v18/x/evm/core/vm" +) + +func init() { + register("prestateTracer", newPrestateTracer) +} + +type ( + prestate = map[common.Address]*account + account struct { + Balance string `json:"balance"` + Nonce uint64 `json:"nonce"` + Code string `json:"code"` + Storage map[common.Hash]common.Hash `json:"storage"` + } +) + +type prestateTracer struct { + env *vm.EVM + prestate prestate + create bool + to common.Address + gasLimit uint64 // Amount of gas bought for the whole tx + interrupt uint32 // Atomic flag to signal execution interruption + reason error // Textual reason for the interruption +} + +func newPrestateTracer(ctx *tracers.Context, _ json.RawMessage) (tracers.Tracer, error) { + // First callframe contains tx context info + // and is populated on start and end. + return &prestateTracer{prestate: prestate{}}, nil +} + +// CaptureStart implements the EVMLogger interface to initialize the tracing operation. +func (t *prestateTracer) CaptureStart(env *vm.EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) { + t.env = env + t.create = create + t.to = to + + t.lookupAccount(from) + t.lookupAccount(to) + + // The recipient balance includes the value transferred. + toBal := hexutil.MustDecodeBig(t.prestate[to].Balance) + toBal = new(big.Int).Sub(toBal, value) + t.prestate[to].Balance = hexutil.EncodeBig(toBal) + + // The sender balance is after reducing: value and gasLimit. + // We need to re-add them to get the pre-tx balance. + fromBal := hexutil.MustDecodeBig(t.prestate[from].Balance) + gasPrice := env.TxContext.GasPrice + consumedGas := new(big.Int).Mul(gasPrice, new(big.Int).SetUint64(t.gasLimit)) + fromBal.Add(fromBal, new(big.Int).Add(value, consumedGas)) + t.prestate[from].Balance = hexutil.EncodeBig(fromBal) + t.prestate[from].Nonce-- +} + +// CaptureEnd is called after the call finishes to finalize the tracing. +func (t *prestateTracer) CaptureEnd(output []byte, gasUsed uint64, _ time.Duration, err error) { + if t.create { + // Exclude created contract. + delete(t.prestate, t.to) + } +} + +// CaptureState implements the EVMLogger interface to trace a single step of VM execution. +func (t *prestateTracer) CaptureState(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, depth int, err error) { + stack := scope.Stack + stackData := stack.Data + stackLen := len(stackData) + switch { + case stackLen >= 1 && (op == vm.SLOAD || op == vm.SSTORE): + slot := common.Hash(stackData[stackLen-1].Bytes32()) + t.lookupStorage(scope.Contract.Address(), slot) + case stackLen >= 1 && (op == vm.EXTCODECOPY || op == vm.EXTCODEHASH || op == vm.EXTCODESIZE || op == vm.BALANCE || op == vm.SELFDESTRUCT): + addr := common.Address(stackData[stackLen-1].Bytes20()) + t.lookupAccount(addr) + case stackLen >= 5 && (op == vm.DELEGATECALL || op == vm.CALL || op == vm.STATICCALL || op == vm.CALLCODE): + addr := common.Address(stackData[stackLen-2].Bytes20()) + t.lookupAccount(addr) + case op == vm.CREATE: + addr := scope.Contract.Address() + nonce := t.env.StateDB.GetNonce(addr) + t.lookupAccount(crypto.CreateAddress(addr, nonce)) + case stackLen >= 4 && op == vm.CREATE2: + offset := stackData[stackLen-2] + size := stackData[stackLen-3] + init := scope.Memory.GetCopy(int64(offset.Uint64()), int64(size.Uint64())) + inithash := crypto.Keccak256(init) + salt := stackData[stackLen-4] + t.lookupAccount(crypto.CreateAddress2(scope.Contract.Address(), salt.Bytes32(), inithash)) + } +} + +// CaptureFault implements the EVMLogger interface to trace an execution fault. +func (t *prestateTracer) CaptureFault(pc uint64, op vm.OpCode, gas, cost uint64, _ *vm.ScopeContext, depth int, err error) { +} + +// CaptureEnter is called when EVM enters a new scope (via call, create or selfdestruct). +func (t *prestateTracer) CaptureEnter(typ vm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) { +} + +// CaptureExit is called when EVM exits a scope, even if the scope didn't +// execute any code. +func (t *prestateTracer) CaptureExit(output []byte, gasUsed uint64, err error) { +} + +func (t *prestateTracer) CaptureTxStart(gasLimit uint64) { + t.gasLimit = gasLimit +} + +func (t *prestateTracer) CaptureTxEnd(restGas uint64) {} + +// GetResult returns the json-encoded nested list of call traces, and any +// error arising from the encoding or forceful termination (via `Stop`). +func (t *prestateTracer) GetResult() (json.RawMessage, error) { + res, err := json.Marshal(t.prestate) + if err != nil { + return nil, err + } + return json.RawMessage(res), t.reason +} + +// Stop terminates execution of the tracer at the first opportune moment. +func (t *prestateTracer) Stop(err error) { + t.reason = err + atomic.StoreUint32(&t.interrupt, 1) +} + +// lookupAccount fetches details of an account and adds it to the prestate +// if it doesn't exist there. +func (t *prestateTracer) lookupAccount(addr common.Address) { + if _, ok := t.prestate[addr]; ok { + return + } + t.prestate[addr] = &account{ + Balance: bigToHex(t.env.StateDB.GetBalance(addr)), + Nonce: t.env.StateDB.GetNonce(addr), + Code: bytesToHex(t.env.StateDB.GetCode(addr)), + Storage: make(map[common.Hash]common.Hash), + } +} + +// lookupStorage fetches the requested storage slot and adds +// it to the prestate of the given contract. It assumes `lookupAccount` +// has been performed on the contract before. +func (t *prestateTracer) lookupStorage(addr common.Address, key common.Hash) { + if _, ok := t.prestate[addr].Storage[key]; ok { + return + } + t.prestate[addr].Storage[key] = t.env.StateDB.GetState(addr, key) +} diff --git a/x/evm/core/tracers/native/revertreason.go b/x/evm/core/tracers/native/revertreason.go new file mode 100644 index 0000000000..391d1031b0 --- /dev/null +++ b/x/evm/core/tracers/native/revertreason.go @@ -0,0 +1,108 @@ +// Copyright 2022 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package native + +import ( + "bytes" + "encoding/json" + "math/big" + "sync/atomic" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/evmos/evmos/v18/x/evm/core/tracers" + "github.com/evmos/evmos/v18/x/evm/core/vm" +) + +func init() { + register("revertReasonTracer", newRevertReasonTracer) +} + +var revertSelector = crypto.Keccak256([]byte("Error(string)"))[:4] + +// revertReasonTracer is a go implementation of the Tracer interface which +// track the error message or revert reason return by the contract. +type revertReasonTracer struct { + env *vm.EVM + revertReason string // The revert reason return from the tx, if tx success, empty string return + interrupt uint32 // Atomic flag to signal execution interruption + reason error // Textual reason for the interruption +} + +// newRevertReasonTracer returns a new revert reason tracer. +func newRevertReasonTracer(_ *tracers.Context, _ json.RawMessage) (tracers.Tracer, error) { + return &revertReasonTracer{}, nil +} + +// CaptureStart implements the EVMLogger interface to initialize the tracing operation. +func (t *revertReasonTracer) CaptureStart(env *vm.EVM, _ common.Address, _ common.Address, _ bool, _ []byte, _ uint64, _ *big.Int) { + t.env = env +} + +// CaptureEnd is called after the call finishes to finalize the tracing. +func (t *revertReasonTracer) CaptureEnd(output []byte, _ uint64, _ time.Duration, err error) { + if err != nil { + if err == vm.ErrExecutionReverted && len(output) > 4 && bytes.Equal(output[:4], revertSelector) { + errMsg, _ := abi.UnpackRevert(output) + t.revertReason = err.Error() + ": " + errMsg + } else { + t.revertReason = err.Error() + } + } +} + +// CaptureState implements the EVMLogger interface to trace a single step of VM execution. +func (t *revertReasonTracer) CaptureState(_ uint64, _ vm.OpCode, _, _ uint64, _ *vm.ScopeContext, _ []byte, _ int, _ error) { +} + +// CaptureFault implements the EVMLogger interface to trace an execution fault. +func (t *revertReasonTracer) CaptureFault(_ uint64, _ vm.OpCode, _, _ uint64, _ *vm.ScopeContext, _ int, _ error) { +} + +// CaptureEnter is called when EVM enters a new scope (via call, create or selfdestruct). +func (t *revertReasonTracer) CaptureEnter(_ vm.OpCode, _ common.Address, _ common.Address, _ []byte, _ uint64, _ *big.Int) { + // Skip if tracing was interrupted + if atomic.LoadUint32(&t.interrupt) > 0 { + t.env.Cancel() + return + } +} + +// CaptureExit is called when EVM exits a scope, even if the scope didn't +// execute any code. +func (t *revertReasonTracer) CaptureExit(_ []byte, _ uint64, _ error) {} + +func (t *revertReasonTracer) CaptureTxStart(_ uint64) {} + +func (t *revertReasonTracer) CaptureTxEnd(_ uint64) {} + +// GetResult returns an error message json object. +func (t *revertReasonTracer) GetResult() (json.RawMessage, error) { + res, err := json.Marshal(t.revertReason) + if err != nil { + return nil, err + } + return res, t.reason +} + +// Stop terminates execution of the tracer at the first opportune moment. +func (t *revertReasonTracer) Stop(err error) { + t.reason = err + atomic.StoreUint32(&t.interrupt, 1) +} diff --git a/x/evm/core/tracers/native/tracer.go b/x/evm/core/tracers/native/tracer.go new file mode 100644 index 0000000000..da39d0d96d --- /dev/null +++ b/x/evm/core/tracers/native/tracer.go @@ -0,0 +1,85 @@ +// Copyright 2021 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +/* +Package native is a collection of tracers written in go. + +In order to add a native tracer and have it compiled into the binary, a new +file needs to be added to this folder, containing an implementation of the +`eth.tracers.Tracer` interface. + +Aside from implementing the tracer, it also needs to register itself, using the +`register` method -- and this needs to be done in the package initialization. + +Example: + +```golang + + func init() { + register("noopTracerNative", newNoopTracer) + } + +``` +*/ +package native + +import ( + "encoding/json" + "errors" + + "github.com/evmos/evmos/v18/x/evm/core/tracers" +) + +// init registers itself this packages as a lookup for tracers. +func init() { + tracers.RegisterLookup(false, lookup) +} + +// ctorFn is the constructor signature of a native tracer. +type ctorFn = func(*tracers.Context, json.RawMessage) (tracers.Tracer, error) + +/* +ctors is a map of package-local tracer constructors. + +We cannot be certain about the order of init-functions within a package, +The go spec (https://golang.org/ref/spec#Package_initialization) says + +> To ensure reproducible initialization behavior, build systems +> are encouraged to present multiple files belonging to the same +> package in lexical file name order to a compiler. + +Hence, we cannot make the map in init, but must make it upon first use. +*/ +var ctors map[string]ctorFn + +// register is used by native tracers to register their presence. +func register(name string, ctor ctorFn) { + if ctors == nil { + ctors = make(map[string]ctorFn) + } + ctors[name] = ctor +} + +// lookup returns a tracer, if one can be matched to the given name. +func lookup(name string, ctx *tracers.Context, cfg json.RawMessage) (tracers.Tracer, error) { + if ctors == nil { + ctors = make(map[string]ctorFn) + } + if ctor, ok := ctors[name]; ok { + return ctor(ctx, cfg) + } + return nil, errors.New("no tracer found") +} diff --git a/x/evm/core/tracers/tracers.go b/x/evm/core/tracers/tracers.go new file mode 100644 index 0000000000..a3f5fc89c0 --- /dev/null +++ b/x/evm/core/tracers/tracers.go @@ -0,0 +1,52 @@ +package tracers + +import ( + "encoding/json" + "errors" + + "github.com/ethereum/go-ethereum/common" + "github.com/evmos/evmos/v18/x/evm/core/vm" +) + +// Context contains some contextual infos for a transaction execution that is not +// available from within the EVM object. +type Context struct { + BlockHash common.Hash // Hash of the block the tx is contained within (zero if dangling tx or call) + TxIndex int // Index of the transaction within a block (zero if dangling tx or call) + TxHash common.Hash // Hash of the transaction being traced (zero if dangling call) +} + +// Tracer interface extends vm.EVMLogger and additionally +// allows collecting the tracing result. +type Tracer interface { + vm.EVMLogger + GetResult() (json.RawMessage, error) + // Stop terminates execution of the tracer at the first opportune moment. + Stop(err error) +} + +type lookupFunc func(string, *Context, json.RawMessage) (Tracer, error) + +var lookups []lookupFunc + +// RegisterLookup registers a method as a lookup for tracers, meaning that +// users can invoke a named tracer through that lookup. If 'wildcard' is true, +// then the lookup will be placed last. This is typically meant for interpreted +// engines (js) which can evaluate dynamic user-supplied code. +func RegisterLookup(wildcard bool, lookup lookupFunc) { + if wildcard { + lookups = append(lookups, lookup) + } else { + lookups = append([]lookupFunc{lookup}, lookups...) + } +} + +// registered lookups. +func New(code string, ctx *Context, cfg json.RawMessage) (Tracer, error) { + for _, lookup := range lookups { + if tracer, err := lookup(code, ctx, cfg); err == nil { + return tracer, nil + } + } + return nil, errors.New("tracer not found") +} diff --git a/x/evm/core/vm/analysis.go b/x/evm/core/vm/analysis.go new file mode 100644 index 0000000000..4aa8cfe70f --- /dev/null +++ b/x/evm/core/vm/analysis.go @@ -0,0 +1,118 @@ +// Copyright 2014 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package vm + +const ( + set2BitsMask = uint16(0b11) + set3BitsMask = uint16(0b111) + set4BitsMask = uint16(0b1111) + set5BitsMask = uint16(0b1_1111) + set6BitsMask = uint16(0b11_1111) + set7BitsMask = uint16(0b111_1111) +) + +// bitvec is a bit vector which maps bytes in a program. +// An unset bit means the byte is an opcode, a set bit means +// it's data (i.e. argument of PUSHxx). +type bitvec []byte + +func (bits bitvec) set1(pos uint64) { + bits[pos/8] |= 1 << (pos % 8) +} + +func (bits bitvec) setN(flag uint16, pos uint64) { + a := flag << (pos % 8) + bits[pos/8] |= byte(a) + if b := byte(a >> 8); b != 0 { + bits[pos/8+1] = b + } +} + +func (bits bitvec) set8(pos uint64) { + a := byte(0xFF << (pos % 8)) + bits[pos/8] |= a + bits[pos/8+1] = ^a +} + +func (bits bitvec) set16(pos uint64) { + a := byte(0xFF << (pos % 8)) + bits[pos/8] |= a + bits[pos/8+1] = 0xFF + bits[pos/8+2] = ^a +} + +// codeSegment checks if the position is in a code segment. +func (bits *bitvec) codeSegment(pos uint64) bool { + return (((*bits)[pos/8] >> (pos % 8)) & 1) == 0 +} + +// codeBitmap collects data locations in code. +func codeBitmap(code []byte) bitvec { + // The bitmap is 4 bytes longer than necessary, in case the code + // ends with a PUSH32, the algorithm will push zeroes onto the + // bitvector outside the bounds of the actual code. + bits := make(bitvec, len(code)/8+1+4) + return codeBitmapInternal(code, bits) +} + +// codeBitmapInternal is the internal implementation of codeBitmap. +// It exists for the purpose of being able to run benchmark tests +// without dynamic allocations affecting the results. +func codeBitmapInternal(code, bits bitvec) bitvec { + for pc := uint64(0); pc < uint64(len(code)); { + op := OpCode(code[pc]) + pc++ + if int8(op) < int8(PUSH1) { // If not PUSH (the int8(op) > int(PUSH32) is always false). + continue + } + numbits := op - PUSH1 + 1 + if numbits >= 8 { + for ; numbits >= 16; numbits -= 16 { + bits.set16(pc) + pc += 16 + } + for ; numbits >= 8; numbits -= 8 { + bits.set8(pc) + pc += 8 + } + } + switch numbits { + case 1: + bits.set1(pc) + pc += 1 + case 2: + bits.setN(set2BitsMask, pc) + pc += 2 + case 3: + bits.setN(set3BitsMask, pc) + pc += 3 + case 4: + bits.setN(set4BitsMask, pc) + pc += 4 + case 5: + bits.setN(set5BitsMask, pc) + pc += 5 + case 6: + bits.setN(set6BitsMask, pc) + pc += 6 + case 7: + bits.setN(set7BitsMask, pc) + pc += 7 + } + } + return bits +} diff --git a/x/evm/core/vm/analysis_test.go b/x/evm/core/vm/analysis_test.go new file mode 100644 index 0000000000..5293e80ae1 --- /dev/null +++ b/x/evm/core/vm/analysis_test.go @@ -0,0 +1,110 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package vm + +import ( + "math/bits" + "testing" + + "github.com/ethereum/go-ethereum/crypto" +) + +func TestJumpDestAnalysis(t *testing.T) { + tests := []struct { + code []byte + exp byte + which int + }{ + {[]byte{byte(PUSH1), 0x01, 0x01, 0x01}, 0b0000_0010, 0}, + {[]byte{byte(PUSH1), byte(PUSH1), byte(PUSH1), byte(PUSH1)}, 0b0000_1010, 0}, + {[]byte{0x00, byte(PUSH1), 0x00, byte(PUSH1), 0x00, byte(PUSH1), 0x00, byte(PUSH1)}, 0b0101_0100, 0}, + {[]byte{byte(PUSH8), byte(PUSH8), byte(PUSH8), byte(PUSH8), byte(PUSH8), byte(PUSH8), byte(PUSH8), byte(PUSH8), 0x01, 0x01, 0x01}, bits.Reverse8(0x7F), 0}, + {[]byte{byte(PUSH8), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0b0000_0001, 1}, + {[]byte{0x01, 0x01, 0x01, 0x01, 0x01, byte(PUSH2), byte(PUSH2), byte(PUSH2), 0x01, 0x01, 0x01}, 0b1100_0000, 0}, + {[]byte{0x01, 0x01, 0x01, 0x01, 0x01, byte(PUSH2), 0x01, 0x01, 0x01, 0x01, 0x01}, 0b0000_0000, 1}, + {[]byte{byte(PUSH3), 0x01, 0x01, 0x01, byte(PUSH1), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0b0010_1110, 0}, + {[]byte{byte(PUSH3), 0x01, 0x01, 0x01, byte(PUSH1), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0b0000_0000, 1}, + {[]byte{0x01, byte(PUSH8), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0b1111_1100, 0}, + {[]byte{0x01, byte(PUSH8), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0b0000_0011, 1}, + {[]byte{byte(PUSH16), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0b1111_1110, 0}, + {[]byte{byte(PUSH16), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0b1111_1111, 1}, + {[]byte{byte(PUSH16), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0b0000_0001, 2}, + {[]byte{byte(PUSH8), 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, byte(PUSH1), 0x01}, 0b1111_1110, 0}, + {[]byte{byte(PUSH8), 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, byte(PUSH1), 0x01}, 0b0000_0101, 1}, + {[]byte{byte(PUSH32)}, 0b1111_1110, 0}, + {[]byte{byte(PUSH32)}, 0b1111_1111, 1}, + {[]byte{byte(PUSH32)}, 0b1111_1111, 2}, + {[]byte{byte(PUSH32)}, 0b1111_1111, 3}, + {[]byte{byte(PUSH32)}, 0b0000_0001, 4}, + } + for i, test := range tests { + ret := codeBitmap(test.code) + if ret[test.which] != test.exp { + t.Fatalf("test %d: expected %x, got %02x", i, test.exp, ret[test.which]) + } + } +} + +const analysisCodeSize = 1200 * 1024 + +func BenchmarkJumpdestAnalysis_1200k(bench *testing.B) { + // 1.4 ms + code := make([]byte, analysisCodeSize) + bench.SetBytes(analysisCodeSize) + bench.ResetTimer() + for i := 0; i < bench.N; i++ { + codeBitmap(code) + } + bench.StopTimer() +} + +func BenchmarkJumpdestHashing_1200k(bench *testing.B) { + // 4 ms + code := make([]byte, analysisCodeSize) + bench.SetBytes(analysisCodeSize) + bench.ResetTimer() + for i := 0; i < bench.N; i++ { + crypto.Keccak256Hash(code) + } + bench.StopTimer() +} + +func BenchmarkJumpdestOpAnalysis(bench *testing.B) { + var op OpCode + bencher := func(b *testing.B) { + code := make([]byte, analysisCodeSize) + b.SetBytes(analysisCodeSize) + for i := range code { + code[i] = byte(op) + } + bits := make(bitvec, len(code)/8+1+4) + b.ResetTimer() + for i := 0; i < b.N; i++ { + for j := range bits { + bits[j] = 0 + } + codeBitmapInternal(code, bits) + } + } + for op = PUSH1; op <= PUSH32; op++ { + bench.Run(op.String(), bencher) + } + op = JUMPDEST + bench.Run(op.String(), bencher) + op = STOP + bench.Run(op.String(), bencher) +} diff --git a/x/evm/core/vm/common.go b/x/evm/core/vm/common.go new file mode 100644 index 0000000000..90ba4a4ad1 --- /dev/null +++ b/x/evm/core/vm/common.go @@ -0,0 +1,82 @@ +// Copyright 2014 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package vm + +import ( + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" + "github.com/holiman/uint256" +) + +// calcMemSize64 calculates the required memory size, and returns +// the size and whether the result overflowed uint64 +func calcMemSize64(off, l *uint256.Int) (uint64, bool) { + if !l.IsUint64() { + return 0, true + } + return calcMemSize64WithUint(off, l.Uint64()) +} + +// calcMemSize64WithUint calculates the required memory size, and returns +// the size and whether the result overflowed uint64 +// Identical to calcMemSize64, but length is a uint64 +func calcMemSize64WithUint(off *uint256.Int, length64 uint64) (uint64, bool) { + // if length is zero, memsize is always zero, regardless of offset + if length64 == 0 { + return 0, false + } + // Check that offset doesn't overflow + offset64, overflow := off.Uint64WithOverflow() + if overflow { + return 0, true + } + val := offset64 + length64 + // if value < either of it's parts, then it overflowed + return val, val < offset64 +} + +// getData returns a slice from the data based on the start and size and pads +// up to size with zero's. This function is overflow safe. +func getData(data []byte, start uint64, size uint64) []byte { + length := uint64(len(data)) + if start > length { + start = length + } + end := start + size + if end > length { + end = length + } + return common.RightPadBytes(data[start:end], int(size)) +} + +// toWordSize returns the ceiled word size required for memory expansion. +func toWordSize(size uint64) uint64 { + if size > math.MaxUint64-31 { + return math.MaxUint64/32 + 1 + } + + return (size + 31) / 32 +} + +func allZero(b []byte) bool { + for _, byte := range b { + if byte != 0 { + return false + } + } + return true +} diff --git a/x/evm/core/vm/contract.go b/x/evm/core/vm/contract.go new file mode 100644 index 0000000000..cf820ce274 --- /dev/null +++ b/x/evm/core/vm/contract.go @@ -0,0 +1,238 @@ +// Copyright 2015 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package vm + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/holiman/uint256" +) + +// ContractRef is a reference to the contract's backing object +type ContractRef interface { + // Address returns the contract's address + Address() common.Address +} + +// AccountRef implements ContractRef. +// +// Account references are used during EVM initialisation and +// it's primary use is to fetch addresses. Removing this object +// proves difficult because of the cached jump destinations which +// are fetched from the parent contract (i.e. the caller), which +// is a ContractRef. +type AccountRef common.Address + +// Address casts AccountRef to a Address +func (ar AccountRef) Address() common.Address { return (common.Address)(ar) } + +// Contract represents an ethereum contract in the state database. It contains +// the contract code, calling arguments. Contract implements ContractRef +type Contract struct { + // CallerAddress is the result of the caller which initialised this + // contract. However when the "call method" is delegated this value + // needs to be initialised to that of the caller's caller. + CallerAddress common.Address + caller ContractRef + self ContractRef + + jumpdests map[common.Hash]bitvec // Aggregated result of JUMPDEST analysis. + analysis bitvec // Locally cached result of JUMPDEST analysis + + Code []byte + CodeHash common.Hash + CodeAddr *common.Address + Input []byte + + Gas uint64 + value *big.Int + isPrecompile bool +} + +// NewContract returns a new contract environment for the execution of EVM. +func NewContract(caller, object ContractRef, value *big.Int, gas uint64) *Contract { + c := &Contract{CallerAddress: caller.Address(), caller: caller, self: object} + + if parent, ok := caller.(*Contract); ok { + // Reuse JUMPDEST analysis from parent context if available. + c.jumpdests = parent.jumpdests + } else { + c.jumpdests = make(map[common.Hash]bitvec) + } + + // Gas should be a pointer so it can safely be reduced through the run + // This pointer will be off the state transition + c.Gas = gas + // ensures a value is set + c.value = value + + return c +} + +// NewPrecompile returns a new instance of a precompiled contract environment for the execution of EVM. +func NewPrecompile(caller, object ContractRef, value *big.Int, gas uint64) *Contract { + c := &Contract{ + CallerAddress: caller.Address(), + caller: caller, + self: object, + isPrecompile: true, + } + + // Gas should be a pointer so it can safely be reduced through the run + // This pointer will be off the state transition + c.Gas = gas + // ensures a value is set + c.value = value + + return c +} + +// IsPrecompile returns true if the contract is a precompiled contract environment +func (c Contract) IsPrecompile() bool { + return c.isPrecompile +} + +func (c *Contract) validJumpdest(dest *uint256.Int) bool { + if c.isPrecompile { + return false + } + + udest, overflow := dest.Uint64WithOverflow() + // PC cannot go beyond len(code) and certainly can't be bigger than 63bits. + // Don't bother checking for JUMPDEST in that case. + if overflow || udest >= uint64(len(c.Code)) { + return false + } + // Only JUMPDESTs allowed for destinations + if OpCode(c.Code[udest]) != JUMPDEST { + return false + } + return c.isCode(udest) +} + +// isCode returns true if the provided PC location is an actual opcode, as +// opposed to a data-segment following a PUSHN operation. +func (c *Contract) isCode(udest uint64) bool { + if c.isPrecompile { + return false + } + + // Do we already have an analysis laying around? + if c.analysis != nil { + return c.analysis.codeSegment(udest) + } + // Do we have a contract hash already? + // If we do have a hash, that means it's a 'regular' contract. For regular + // contracts ( not temporary initcode), we store the analysis in a map + if c.CodeHash != (common.Hash{}) { + // Does parent context have the analysis? + analysis, exist := c.jumpdests[c.CodeHash] + if !exist { + // Do the analysis and save in parent context + // We do not need to store it in c.analysis + analysis = codeBitmap(c.Code) + c.jumpdests[c.CodeHash] = analysis + } + // Also stash it in current contract for faster access + c.analysis = analysis + return analysis.codeSegment(udest) + } + // We don't have the code hash, most likely a piece of initcode not already + // in state trie. In that case, we do an analysis, and save it locally, so + // we don't have to recalculate it for every JUMP instruction in the execution + // However, we don't save it within the parent context + if c.analysis == nil { + c.analysis = codeBitmap(c.Code) + } + return c.analysis.codeSegment(udest) +} + +// AsDelegate sets the contract to be a delegate call and returns the current +// contract (for chaining calls) +func (c *Contract) AsDelegate() *Contract { + if c.isPrecompile { + return c + } + // NOTE: caller must, at all times be a contract. It should never happen + // that caller is something other than a Contract. + parent := c.caller.(*Contract) + c.CallerAddress = parent.CallerAddress + c.value = parent.value + + return c +} + +// GetOp returns the n'th element in the contract's byte array +func (c *Contract) GetOp(n uint64) OpCode { + if n < uint64(len(c.Code)) { + return OpCode(c.Code[n]) + } + + return STOP +} + +// Caller returns the caller of the contract. +// +// Caller will recursively call caller when the contract is a delegate +// call, including that of caller's caller. +func (c *Contract) Caller() common.Address { + return c.CallerAddress +} + +// UseGas attempts the use gas and subtracts it and returns true on success +func (c *Contract) UseGas(gas uint64) (ok bool) { + if c.Gas < gas { + return false + } + c.Gas -= gas + return true +} + +// Address returns the contracts address +func (c *Contract) Address() common.Address { + return c.self.Address() +} + +// Value returns the contract's value (sent to it from it's caller) +func (c *Contract) Value() *big.Int { + return c.value +} + +// SetCallCode sets the code of the contract and address of the backing data +// object +func (c *Contract) SetCallCode(addr *common.Address, hash common.Hash, code []byte) { + if c.isPrecompile { + return + } + + c.Code = code + c.CodeHash = hash + c.CodeAddr = addr +} + +// SetCodeOptionalHash can be used to provide code, but it's optional to provide hash. +// In case hash is not provided, the jumpdest analysis will not be saved to the parent context +func (c *Contract) SetCodeOptionalHash(addr *common.Address, codeAndHash *codeAndHash) { + if c.isPrecompile { + return + } + + c.Code = codeAndHash.code + c.CodeHash = codeAndHash.hash + c.CodeAddr = addr +} diff --git a/x/evm/core/vm/contracts.go b/x/evm/core/vm/contracts.go new file mode 100644 index 0000000000..64b335db74 --- /dev/null +++ b/x/evm/core/vm/contracts.go @@ -0,0 +1,1313 @@ +// Copyright 2014 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package vm + +import ( + "bytes" + "crypto/sha256" + "encoding/binary" + "errors" + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/crypto/blake2b" + "github.com/ethereum/go-ethereum/crypto/bls12381" + "github.com/ethereum/go-ethereum/crypto/bn256" + "github.com/ethereum/go-ethereum/params" + "golang.org/x/crypto/ripemd160" +) + +// PrecompiledContract is the basic interface for native Go contracts. The implementation +// requires a deterministic gas count based on the input size of the Run method of the +// contract. +type PrecompiledContract interface { + ContractRef + // RequiredPrice calculates the contract gas used + RequiredGas(input []byte) uint64 + // Run runs the precompiled contract + Run(evm *EVM, contract *Contract, readonly bool) ([]byte, error) +} + +// PrecompiledContractsHomestead contains the default set of pre-compiled Ethereum +// contracts used in the Frontier and Homestead releases. +var PrecompiledContractsHomestead = map[common.Address]PrecompiledContract{ + ecrecover{}.Address(): &ecrecover{}, + sha256hash{}.Address(): &sha256hash{}, + ripemd160hash{}.Address(): &ripemd160hash{}, + dataCopy{}.Address(): &dataCopy{}, +} + +// PrecompiledContractsByzantium contains the default set of pre-compiled Ethereum +// contracts used in the Byzantium release. +var PrecompiledContractsByzantium = map[common.Address]PrecompiledContract{ + ecrecover{}.Address(): &ecrecover{}, + sha256hash{}.Address(): &sha256hash{}, + ripemd160hash{}.Address(): &ripemd160hash{}, + dataCopy{}.Address(): &dataCopy{}, + bigModExp{}.Address(): &bigModExp{eip2565: false}, + bn256AddByzantium{}.Address(): &bn256AddByzantium{}, + bn256ScalarMulByzantium{}.Address(): &bn256ScalarMulByzantium{}, + bn256PairingByzantium{}.Address(): &bn256PairingByzantium{}, +} + +// PrecompiledContractsIstanbul contains the default set of pre-compiled Ethereum +// contracts used in the Istanbul release. +var PrecompiledContractsIstanbul = map[common.Address]PrecompiledContract{ + ecrecover{}.Address(): &ecrecover{}, + sha256hash{}.Address(): &sha256hash{}, + ripemd160hash{}.Address(): &ripemd160hash{}, + dataCopy{}.Address(): &dataCopy{}, + bigModExp{}.Address(): &bigModExp{eip2565: false}, + bn256AddIstanbul{}.Address(): &bn256AddIstanbul{}, + bn256ScalarMulIstanbul{}.Address(): &bn256ScalarMulIstanbul{}, + bn256PairingIstanbul{}.Address(): &bn256PairingIstanbul{}, + blake2F{}.Address(): &blake2F{}, +} + +// PrecompiledContractsBerlin contains the default set of pre-compiled Ethereum +// contracts used in the Berlin release. +var PrecompiledContractsBerlin = map[common.Address]PrecompiledContract{ + ecrecover{}.Address(): &ecrecover{}, + sha256hash{}.Address(): &sha256hash{}, + ripemd160hash{}.Address(): &ripemd160hash{}, + dataCopy{}.Address(): &dataCopy{}, + bigModExp{}.Address(): &bigModExp{eip2565: true}, + bn256AddIstanbul{}.Address(): &bn256AddIstanbul{}, + bn256ScalarMulIstanbul{}.Address(): &bn256ScalarMulIstanbul{}, + bn256PairingIstanbul{}.Address(): &bn256PairingIstanbul{}, + blake2F{}.Address(): &blake2F{}, +} + +// PrecompiledContractsBLS contains the set of pre-compiled Ethereum +// contracts specified in EIP-2537. These are exported for testing purposes. +var PrecompiledContractsBLS = map[common.Address]PrecompiledContract{ + bls12381G1Add{}.Address(): &bls12381G1Add{}, + bls12381G1Mul{}.Address(): &bls12381G1Mul{}, + bls12381G1MultiExp{}.Address(): &bls12381G1MultiExp{}, + bls12381G2Add{}.Address(): &bls12381G2Add{}, + bls12381G2Mul{}.Address(): &bls12381G2Mul{}, + bls12381G2MultiExp{}.Address(): &bls12381G2MultiExp{}, + bls12381Pairing{}.Address(): &bls12381Pairing{}, + bls12381MapG1{}.Address(): &bls12381MapG1{}, + bls12381MapG2{}.Address(): &bls12381MapG2{}, +} + +var ( + // PrecompiledAddressesBerlin defines the default set of pre-compiled + // Ethereum contract addresses used in the Berlin release. + PrecompiledAddressesBerlin = []common.Address{ + ecrecover{}.Address(), + sha256hash{}.Address(), + ripemd160hash{}.Address(), + dataCopy{}.Address(), + bigModExp{}.Address(), + bn256AddIstanbul{}.Address(), + bn256ScalarMulIstanbul{}.Address(), + bn256PairingIstanbul{}.Address(), + blake2F{}.Address(), + } + // PrecompiledAddressesIstanbul defines the default set of pre-compiled + // Ethereum contract addresses used in the Istanbul release. + PrecompiledAddressesIstanbul = []common.Address{ + ecrecover{}.Address(), + sha256hash{}.Address(), + ripemd160hash{}.Address(), + dataCopy{}.Address(), + bigModExp{}.Address(), + bn256AddIstanbul{}.Address(), + bn256ScalarMulIstanbul{}.Address(), + bn256PairingIstanbul{}.Address(), + blake2F{}.Address(), + } + // PrecompiledAddressesByzantium defines the default set of pre-compiled + // Ethereum contract addresses used in the Byzantium release. + PrecompiledAddressesByzantium = []common.Address{ + ecrecover{}.Address(), + sha256hash{}.Address(), + ripemd160hash{}.Address(), + dataCopy{}.Address(), + bigModExp{}.Address(), + bn256AddByzantium{}.Address(), + bn256ScalarMulByzantium{}.Address(), + bn256PairingByzantium{}.Address(), + } + // PrecompiledAddressesHomestead defines the default set of pre-compiled + // Ethereum contract addresses used in the Homestead release. + PrecompiledAddressesHomestead = []common.Address{ + ecrecover{}.Address(), + sha256hash{}.Address(), + ripemd160hash{}.Address(), + dataCopy{}.Address(), + } +) + +// DefaultActivePrecompiles returns the set of precompiles enabled with the default configuration. +func DefaultActivePrecompiles(rules params.Rules) []common.Address { + switch { + case rules.IsBerlin: + return PrecompiledAddressesBerlin + case rules.IsIstanbul: + return PrecompiledAddressesIstanbul + case rules.IsByzantium: + return PrecompiledAddressesByzantium + default: + return PrecompiledAddressesHomestead + } +} + +// DefaultPrecompiles define the mapping of address and precompiles from the default configuration +func DefaultPrecompiles(rules params.Rules) (precompiles map[common.Address]PrecompiledContract) { + switch { + case rules.IsBerlin: + precompiles = PrecompiledContractsBerlin + case rules.IsIstanbul: + precompiles = PrecompiledContractsIstanbul + case rules.IsByzantium: + precompiles = PrecompiledContractsByzantium + default: + precompiles = PrecompiledContractsHomestead + } + + return precompiles +} + +// ActivePrecompiles returns the precompiles enabled with the current configuration. +// +// NOTE: The rules argument is ignored as the active precompiles can be set via the WithPrecompiles +// method according to the chain rules from the current block context. +func (evm *EVM) ActivePrecompiles(_ params.Rules) []common.Address { + return evm.activePrecompiles +} + +// Precompile returns a precompiled contract for the given address. This +// function returns false if the address is not a registered precompile. +func (evm *EVM) Precompile(addr common.Address) (PrecompiledContract, bool) { + p, ok := evm.precompiles[addr] + return p, ok +} + +// WithPrecompiles sets the precompiled contracts and the slice of actives precompiles. +// IMPORTANT: This function does NOT validate the precompiles provided to the EVM. The caller should +// use the ValidatePrecompiles function for this purpose prior to calling WithPrecompiles. +func (evm *EVM) WithPrecompiles( + precompiles map[common.Address]PrecompiledContract, + activePrecompiles []common.Address, +) { + evm.precompiles = precompiles + evm.activePrecompiles = activePrecompiles +} + +// ValidatePrecompiles validates the precompile map against the active +// precompile slice. +// It returns an error if the precompiled contract map has a different length +// than the slice of active contract addresses. This function also checks for +// duplicates, invalid addresses and empty precompile contract instances. +func ValidatePrecompiles( + precompiles map[common.Address]PrecompiledContract, + activePrecompiles []common.Address, +) error { + if len(precompiles) != len(activePrecompiles) { + return fmt.Errorf("precompiles length mismatch (expected %d, got %d)", len(precompiles), len(activePrecompiles)) + } + + dupActivePrecompiles := make(map[common.Address]bool) + + for _, addr := range activePrecompiles { + if dupActivePrecompiles[addr] { + return fmt.Errorf("duplicate active precompile: %s", addr) + } + + precompile, ok := precompiles[addr] + if !ok { + return fmt.Errorf("active precompile address doesn't exist in precompiles map: %s", addr) + } + + if precompile == nil { + return fmt.Errorf("precompile contract cannot be nil: %s", addr) + } + + if bytes.Equal(addr.Bytes(), common.Address{}.Bytes()) { + return fmt.Errorf("precompile cannot be the zero address: %s", addr) + } + + dupActivePrecompiles[addr] = true + } + + return nil +} + +// RunPrecompiledContract runs and evaluates the output of a precompiled contract. +// It returns +// - the returned bytes, +// - the _remaining_ gas, +// - any error that occurred +func (evm *EVM) RunPrecompiledContract( + p PrecompiledContract, + caller ContractRef, + input []byte, + suppliedGas uint64, + value *big.Int, + readOnly bool, +) (ret []byte, remainingGas uint64, err error) { + return runPrecompiledContract(evm, p, caller, input, suppliedGas, value, readOnly) +} + +func runPrecompiledContract( + evm *EVM, + p PrecompiledContract, + caller ContractRef, + input []byte, + suppliedGas uint64, + value *big.Int, + readOnly bool, +) (ret []byte, remainingGas uint64, err error) { + addrCopy := p.Address() + inputCopy := make([]byte, len(input)) + copy(inputCopy, input) + + contract := NewPrecompile(caller, AccountRef(addrCopy), value, suppliedGas) + contract.Input = inputCopy + + gasCost := p.RequiredGas(input) + if !contract.UseGas(gasCost) { + return nil, contract.Gas, ErrOutOfGas + } + + output, err := p.Run(evm, contract, readOnly) + return output, contract.Gas, err +} + +// ECRECOVER implemented as a native contract. +type ecrecover struct{} + +// Address defines the precompiled contract address. This MUST match the address +// set in the precompiled contract map. +func (ecrecover) Address() common.Address { + return common.BytesToAddress([]byte{1}) +} + +func (c *ecrecover) RequiredGas(input []byte) uint64 { + return params.EcrecoverGas +} + +func (c *ecrecover) Run(evm *EVM, contract *Contract, readonly bool) ([]byte, error) { + const ecRecoverInputLength = 128 + + contract.Input = common.RightPadBytes(contract.Input, ecRecoverInputLength) + // "input" is (hash, v, r, s), each 32 bytes + // but for ecrecover we want (r, s, v) + + r := new(big.Int).SetBytes(contract.Input[64:96]) + s := new(big.Int).SetBytes(contract.Input[96:128]) + v := contract.Input[63] - 27 + + // tighter sig s values input homestead only apply to tx sigs + if !allZero(contract.Input[32:63]) || !crypto.ValidateSignatureValues(v, r, s, false) { + return nil, nil + } + // We must make sure not to modify the 'input', so placing the 'v' along with + // the signature needs to be done on a new allocation + sig := make([]byte, 65) + copy(sig, contract.Input[64:128]) + sig[64] = v + // v needs to be at the end for libsecp256k1 + pubKey, err := crypto.Ecrecover(contract.Input[:32], sig) + // make sure the public key is a valid one + if err != nil { + return nil, nil + } + + // the first byte of pubkey is bitcoin heritage + return common.LeftPadBytes(crypto.Keccak256(pubKey[1:])[12:], 32), nil +} + +// SHA256 implemented as a native contract. +type sha256hash struct{} + +// Address defines the precompiled contract address. This MUST match the address +// set in the precompiled contract map. +func (sha256hash) Address() common.Address { + return common.BytesToAddress([]byte{2}) +} + +// RequiredGas returns the gas required to execute the pre-compiled contract. +// +// This method does not require any overflow checking as the input size gas costs +// required for anything significant is so high it's impossible to pay for. +func (c *sha256hash) RequiredGas(input []byte) uint64 { + return uint64(len(input)+31)/32*params.Sha256PerWordGas + params.Sha256BaseGas +} + +func (c *sha256hash) Run(evm *EVM, contract *Contract, readonly bool) ([]byte, error) { + h := sha256.Sum256(contract.Input) + return h[:], nil +} + +// RIPEMD160 implemented as a native contract. +type ripemd160hash struct{} + +// Address defines the precompiled contract address. This MUST match the address +// set in the precompiled contract map. +func (ripemd160hash) Address() common.Address { + return common.BytesToAddress([]byte{3}) +} + +// RequiredGas returns the gas required to execute the pre-compiled contract. +// +// This method does not require any overflow checking as the input size gas costs +// required for anything significant is so high it's impossible to pay for. +func (c *ripemd160hash) RequiredGas(input []byte) uint64 { + return uint64(len(input)+31)/32*params.Ripemd160PerWordGas + params.Ripemd160BaseGas +} + +func (c *ripemd160hash) Run(evm *EVM, contract *Contract, readonly bool) ([]byte, error) { + ripemd := ripemd160.New() + ripemd.Write(contract.Input) + return common.LeftPadBytes(ripemd.Sum(nil), 32), nil +} + +// data copy implemented as a native contract. +type dataCopy struct{} + +// Address defines the precompiled contract address. This MUST match the address +// set in the precompiled contract map. +func (dataCopy) Address() common.Address { + return common.BytesToAddress([]byte{4}) +} + +// RequiredGas returns the gas required to execute the pre-compiled contract. +// +// This method does not require any overflow checking as the input size gas costs +// required for anything significant is so high it's impossible to pay for. +func (c *dataCopy) RequiredGas(input []byte) uint64 { + return uint64(len(input)+31)/32*params.IdentityPerWordGas + params.IdentityBaseGas +} + +func (c *dataCopy) Run(evm *EVM, contract *Contract, readonly bool) ([]byte, error) { + return common.CopyBytes(contract.Input), nil +} + +// bigModExp implements a native big integer exponential modular operation. +type bigModExp struct { + eip2565 bool +} + +var ( + big0 = big.NewInt(0) + big1 = big.NewInt(1) + big2 = big.NewInt(2) + big3 = big.NewInt(3) + big4 = big.NewInt(4) + big7 = big.NewInt(7) + big8 = big.NewInt(8) + big16 = big.NewInt(16) + big20 = big.NewInt(20) + big32 = big.NewInt(32) + big64 = big.NewInt(64) + big96 = big.NewInt(96) + big480 = big.NewInt(480) + big1024 = big.NewInt(1024) + big3072 = big.NewInt(3072) + big199680 = big.NewInt(199680) +) + +// modexpMultComplexity implements bigModexp multComplexity formula, as defined in EIP-198 +// +// def mult_complexity(x): +// +// if x <= 64: return x ** 2 +// elif x <= 1024: return x ** 2 // 4 + 96 * x - 3072 +// else: return x ** 2 // 16 + 480 * x - 199680 +// +// where is x is max(length_of_MODULUS, length_of_BASE) +func modexpMultComplexity(x *big.Int) *big.Int { + switch { + case x.Cmp(big64) <= 0: + x.Mul(x, x) // x ** 2 + case x.Cmp(big1024) <= 0: + // (x ** 2 // 4 ) + ( 96 * x - 3072) + x = new(big.Int).Add( + new(big.Int).Div(new(big.Int).Mul(x, x), big4), + new(big.Int).Sub(new(big.Int).Mul(big96, x), big3072), + ) + default: + // (x ** 2 // 16) + (480 * x - 199680) + x = new(big.Int).Add( + new(big.Int).Div(new(big.Int).Mul(x, x), big16), + new(big.Int).Sub(new(big.Int).Mul(big480, x), big199680), + ) + } + return x +} + +// Address defines the precompiled contract address. This MUST match the address +// set in the precompiled contract map. +func (bigModExp) Address() common.Address { + return common.BytesToAddress([]byte{5}) +} + +// RequiredGas returns the gas required to execute the pre-compiled contract. +func (c *bigModExp) RequiredGas(input []byte) uint64 { + var ( + baseLen = new(big.Int).SetBytes(getData(input, 0, 32)) + expLen = new(big.Int).SetBytes(getData(input, 32, 32)) + modLen = new(big.Int).SetBytes(getData(input, 64, 32)) + ) + if len(input) > 96 { + input = input[96:] + } else { + input = input[:0] + } + // Retrieve the head 32 bytes of exp for the adjusted exponent length + var expHead *big.Int + if big.NewInt(int64(len(input))).Cmp(baseLen) <= 0 { + expHead = new(big.Int) + } else { + if expLen.Cmp(big32) > 0 { + expHead = new(big.Int).SetBytes(getData(input, baseLen.Uint64(), 32)) + } else { + expHead = new(big.Int).SetBytes(getData(input, baseLen.Uint64(), expLen.Uint64())) + } + } + // Calculate the adjusted exponent length + var msb int + if bitlen := expHead.BitLen(); bitlen > 0 { + msb = bitlen - 1 + } + adjExpLen := new(big.Int) + if expLen.Cmp(big32) > 0 { + adjExpLen.Sub(expLen, big32) + adjExpLen.Mul(big8, adjExpLen) + } + adjExpLen.Add(adjExpLen, big.NewInt(int64(msb))) + // Calculate the gas cost of the operation + gas := new(big.Int).Set(math.BigMax(modLen, baseLen)) + if c.eip2565 { + // EIP-2565 has three changes + // 1. Different multComplexity (inlined here) + // in EIP-2565 (https://eips.ethereum.org/EIPS/eip-2565): + // + // def mult_complexity(x): + // ceiling(x/8)^2 + // + //where is x is max(length_of_MODULUS, length_of_BASE) + gas = gas.Add(gas, big7) + gas = gas.Div(gas, big8) + gas.Mul(gas, gas) + + gas.Mul(gas, math.BigMax(adjExpLen, big1)) + // 2. Different divisor (`GQUADDIVISOR`) (3) + gas.Div(gas, big3) + if gas.BitLen() > 64 { + return math.MaxUint64 + } + // 3. Minimum price of 200 gas + if gas.Uint64() < 200 { + return 200 + } + return gas.Uint64() + } + gas = modexpMultComplexity(gas) + gas.Mul(gas, math.BigMax(adjExpLen, big1)) + gas.Div(gas, big20) + + if gas.BitLen() > 64 { + return math.MaxUint64 + } + return gas.Uint64() +} + +func (c *bigModExp) Run(evm *EVM, contract *Contract, readonly bool) ([]byte, error) { + var ( + baseLen = new(big.Int).SetBytes(getData(contract.Input, 0, 32)).Uint64() + expLen = new(big.Int).SetBytes(getData(contract.Input, 32, 32)).Uint64() + modLen = new(big.Int).SetBytes(getData(contract.Input, 64, 32)).Uint64() + ) + if len(contract.Input) > 96 { + contract.Input = contract.Input[96:] + } else { + contract.Input = contract.Input[:0] + } + // Handle a special case when both the base and mod length is zero + if baseLen == 0 && modLen == 0 { + return []byte{}, nil + } + // Retrieve the operands and execute the exponentiation + var ( + base = new(big.Int).SetBytes(getData(contract.Input, 0, baseLen)) + exp = new(big.Int).SetBytes(getData(contract.Input, baseLen, expLen)) + mod = new(big.Int).SetBytes(getData(contract.Input, baseLen+expLen, modLen)) + ) + if mod.BitLen() == 0 { + // Modulo 0 is undefined, return zero + return common.LeftPadBytes([]byte{}, int(modLen)), nil + } + return common.LeftPadBytes(base.Exp(base, exp, mod).Bytes(), int(modLen)), nil +} + +// newCurvePoint unmarshals a binary blob into a bn256 elliptic curve point, +// returning it, or an error if the point is invalid. +func newCurvePoint(blob []byte) (*bn256.G1, error) { + p := new(bn256.G1) + if _, err := p.Unmarshal(blob); err != nil { + return nil, err + } + return p, nil +} + +// newTwistPoint unmarshals a binary blob into a bn256 elliptic curve point, +// returning it, or an error if the point is invalid. +func newTwistPoint(blob []byte) (*bn256.G2, error) { + p := new(bn256.G2) + if _, err := p.Unmarshal(blob); err != nil { + return nil, err + } + return p, nil +} + +// runBn256Add implements the Bn256Add precompile, referenced by both +// Byzantium and Istanbul operations. +func runBn256Add(input []byte) ([]byte, error) { + x, err := newCurvePoint(getData(input, 0, 64)) + if err != nil { + return nil, err + } + y, err := newCurvePoint(getData(input, 64, 64)) + if err != nil { + return nil, err + } + res := new(bn256.G1) + res.Add(x, y) + return res.Marshal(), nil +} + +// bn256Add implements a native elliptic curve point addition conforming to +// Istanbul consensus rules. +type bn256AddIstanbul struct{} + +// Address defines the precompiled contract address. This MUST match the address +// set in the precompiled contract map. +func (bn256AddIstanbul) Address() common.Address { + return common.BytesToAddress([]byte{6}) +} + +// RequiredGas returns the gas required to execute the pre-compiled contract. +func (c *bn256AddIstanbul) RequiredGas(input []byte) uint64 { + return params.Bn256AddGasIstanbul +} + +func (c *bn256AddIstanbul) Run(evm *EVM, contract *Contract, readonly bool) ([]byte, error) { + return runBn256Add(contract.Input) +} + +// bn256AddByzantium implements a native elliptic curve point addition +// conforming to Byzantium consensus rules. +type bn256AddByzantium struct{} + +// Address defines the precompiled contract address. This MUST match the address +// set in the precompiled contract map. +func (bn256AddByzantium) Address() common.Address { + return common.BytesToAddress([]byte{6}) +} + +// RequiredGas returns the gas required to execute the pre-compiled contract. +func (c *bn256AddByzantium) RequiredGas(input []byte) uint64 { + return params.Bn256AddGasByzantium +} + +func (c *bn256AddByzantium) Run(evm *EVM, contract *Contract, readonly bool) ([]byte, error) { + return runBn256Add(contract.Input) +} + +// runBn256ScalarMul implements the Bn256ScalarMul precompile, referenced by +// both Byzantium and Istanbul operations. +func runBn256ScalarMul(input []byte) ([]byte, error) { + p, err := newCurvePoint(getData(input, 0, 64)) + if err != nil { + return nil, err + } + res := new(bn256.G1) + res.ScalarMult(p, new(big.Int).SetBytes(getData(input, 64, 32))) + return res.Marshal(), nil +} + +// bn256ScalarMulIstanbul implements a native elliptic curve scalar +// multiplication conforming to Istanbul consensus rules. +type bn256ScalarMulIstanbul struct{} + +// Address defines the precompiled contract address. This MUST match the address +// set in the precompiled contract map. +func (bn256ScalarMulIstanbul) Address() common.Address { + return common.BytesToAddress([]byte{7}) +} + +// RequiredGas returns the gas required to execute the pre-compiled contract. +func (c *bn256ScalarMulIstanbul) RequiredGas(input []byte) uint64 { + return params.Bn256ScalarMulGasIstanbul +} + +func (c *bn256ScalarMulIstanbul) Run(evm *EVM, contract *Contract, readonly bool) ([]byte, error) { + return runBn256ScalarMul(contract.Input) +} + +// bn256ScalarMulByzantium implements a native elliptic curve scalar +// multiplication conforming to Byzantium consensus rules. +type bn256ScalarMulByzantium struct{} + +// Address defines the precompiled contract address. This MUST match the address +// set in the precompiled contract map. +func (bn256ScalarMulByzantium) Address() common.Address { + return common.BytesToAddress([]byte{7}) +} + +// RequiredGas returns the gas required to execute the pre-compiled contract. +func (c *bn256ScalarMulByzantium) RequiredGas(input []byte) uint64 { + return params.Bn256ScalarMulGasByzantium +} + +func (c *bn256ScalarMulByzantium) Run(evm *EVM, contract *Contract, readonly bool) ([]byte, error) { + return runBn256ScalarMul(contract.Input) +} + +var ( + // true32Byte is returned if the bn256 pairing check succeeds. + true32Byte = []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1} + + // false32Byte is returned if the bn256 pairing check fails. + false32Byte = make([]byte, 32) + + // errBadPairingInput is returned if the bn256 pairing input is invalid. + errBadPairingInput = errors.New("bad elliptic curve pairing size") +) + +// runBn256Pairing implements the Bn256Pairing precompile, referenced by both +// Byzantium and Istanbul operations. +func runBn256Pairing(input []byte) ([]byte, error) { + // Handle some corner cases cheaply + if len(input)%192 > 0 { + return nil, errBadPairingInput + } + // Convert the input into a set of coordinates + var ( + cs []*bn256.G1 + ts []*bn256.G2 + ) + for i := 0; i < len(input); i += 192 { + c, err := newCurvePoint(input[i : i+64]) + if err != nil { + return nil, err + } + t, err := newTwistPoint(input[i+64 : i+192]) + if err != nil { + return nil, err + } + cs = append(cs, c) + ts = append(ts, t) + } + // Execute the pairing checks and return the results + if bn256.PairingCheck(cs, ts) { + return true32Byte, nil + } + return false32Byte, nil +} + +// bn256PairingIstanbul implements a pairing pre-compile for the bn256 curve +// conforming to Istanbul consensus rules. +type bn256PairingIstanbul struct{} + +// Address defines the precompiled contract address. This MUST match the address +// set in the precompiled contract map. +func (bn256PairingIstanbul) Address() common.Address { + return common.BytesToAddress([]byte{8}) +} + +// RequiredGas returns the gas required to execute the pre-compiled contract. +func (c *bn256PairingIstanbul) RequiredGas(input []byte) uint64 { + return params.Bn256PairingBaseGasIstanbul + uint64(len(input)/192)*params.Bn256PairingPerPointGasIstanbul +} + +func (c *bn256PairingIstanbul) Run(evm *EVM, contract *Contract, readonly bool) ([]byte, error) { + return runBn256Pairing(contract.Input) +} + +// bn256PairingByzantium implements a pairing pre-compile for the bn256 curve +// conforming to Byzantium consensus rules. +type bn256PairingByzantium struct{} + +// Address defines the precompiled contract address. This MUST match the address +// set in the precompiled contract map. +func (bn256PairingByzantium) Address() common.Address { + return common.BytesToAddress([]byte{8}) +} + +// RequiredGas returns the gas required to execute the pre-compiled contract. +func (c *bn256PairingByzantium) RequiredGas(input []byte) uint64 { + return params.Bn256PairingBaseGasByzantium + uint64(len(input)/192)*params.Bn256PairingPerPointGasByzantium +} + +func (c *bn256PairingByzantium) Run(evm *EVM, contract *Contract, readonly bool) ([]byte, error) { + return runBn256Pairing(contract.Input) +} + +type blake2F struct{} + +// Address defines the precompiled contract address. This MUST match the address +// set in the precompiled contract map. +func (blake2F) Address() common.Address { + return common.BytesToAddress([]byte{9}) +} + +func (c *blake2F) RequiredGas(input []byte) uint64 { + // If the input is malformed, we can't calculate the gas, return 0 and let the + // actual call choke and fault. + if len(input) != blake2FInputLength { + return 0 + } + return uint64(binary.BigEndian.Uint32(input[0:4])) +} + +const ( + blake2FInputLength = 213 + blake2FFinalBlockBytes = byte(1) + blake2FNonFinalBlockBytes = byte(0) +) + +var ( + errBlake2FInvalidInputLength = errors.New("invalid input length") + errBlake2FInvalidFinalFlag = errors.New("invalid final flag") +) + +func (c *blake2F) Run(evm *EVM, contract *Contract, readonly bool) ([]byte, error) { + // Make sure the input is valid (correct length and final flag) + if len(contract.Input) != blake2FInputLength { + return nil, errBlake2FInvalidInputLength + } + if contract.Input[212] != blake2FNonFinalBlockBytes && contract.Input[212] != blake2FFinalBlockBytes { + return nil, errBlake2FInvalidFinalFlag + } + // Parse the input into the Blake2b call parameters + var ( + rounds = binary.BigEndian.Uint32(contract.Input[0:4]) + final = contract.Input[212] == blake2FFinalBlockBytes + + h [8]uint64 + m [16]uint64 + t [2]uint64 + ) + for i := 0; i < 8; i++ { + offset := 4 + i*8 + h[i] = binary.LittleEndian.Uint64(contract.Input[offset : offset+8]) + } + for i := 0; i < 16; i++ { + offset := 68 + i*8 + m[i] = binary.LittleEndian.Uint64(contract.Input[offset : offset+8]) + } + t[0] = binary.LittleEndian.Uint64(contract.Input[196:204]) + t[1] = binary.LittleEndian.Uint64(contract.Input[204:212]) + + // Execute the compression function, extract and return the result + blake2b.F(&h, m, t, final, rounds) + + output := make([]byte, 64) + for i := 0; i < 8; i++ { + offset := i * 8 + binary.LittleEndian.PutUint64(output[offset:offset+8], h[i]) + } + return output, nil +} + +var ( + errBLS12381InvalidInputLength = errors.New("invalid input length") + errBLS12381InvalidFieldElementTopBytes = errors.New("invalid field element top bytes") + errBLS12381G1PointSubgroup = errors.New("g1 point is not on correct subgroup") + errBLS12381G2PointSubgroup = errors.New("g2 point is not on correct subgroup") +) + +// bls12381G1Add implements EIP-2537 G1Add precompile. +type bls12381G1Add struct{} + +// Address defines the precompiled contract address. This MUST match the address +// set in the precompiled contract map. +func (bls12381G1Add) Address() common.Address { + return common.BytesToAddress([]byte{10}) +} + +// RequiredGas returns the gas required to execute the pre-compiled contract. +func (c *bls12381G1Add) RequiredGas(input []byte) uint64 { + return params.Bls12381G1AddGas +} + +func (c *bls12381G1Add) Run(evm *EVM, contract *Contract, readonly bool) ([]byte, error) { + // Implements EIP-2537 G1Add precompile. + // > G1 addition call expects `256` bytes as an input that is interpreted as byte concatenation of two G1 points (`128` bytes each). + // > Output is an encoding of addition operation result - single G1 point (`128` bytes). + if len(contract.Input) != 256 { + return nil, errBLS12381InvalidInputLength + } + var err error + var p0, p1 *bls12381.PointG1 + + // Initialize G1 + g := bls12381.NewG1() + + // Decode G1 point p_0 + if p0, err = g.DecodePoint(contract.Input[:128]); err != nil { + return nil, err + } + // Decode G1 point p_1 + if p1, err = g.DecodePoint(contract.Input[128:]); err != nil { + return nil, err + } + + // Compute r = p_0 + p_1 + r := g.New() + g.Add(r, p0, p1) + + // Encode the G1 point result into 128 bytes + return g.EncodePoint(r), nil +} + +// bls12381G1Mul implements EIP-2537 G1Mul precompile. +type bls12381G1Mul struct{} + +// Address defines the precompiled contract address. This MUST match the address +// set in the precompiled contract map. +func (bls12381G1Mul) Address() common.Address { + return common.BytesToAddress([]byte{11}) +} + +// RequiredGas returns the gas required to execute the pre-compiled contract. +func (c *bls12381G1Mul) RequiredGas(input []byte) uint64 { + return params.Bls12381G1MulGas +} + +func (c *bls12381G1Mul) Run(evm *EVM, contract *Contract, readonly bool) ([]byte, error) { + // Implements EIP-2537 G1Mul precompile. + // > G1 multiplication call expects `160` bytes as an input that is interpreted as byte concatenation of encoding of G1 point (`128` bytes) and encoding of a scalar value (`32` bytes). + // > Output is an encoding of multiplication operation result - single G1 point (`128` bytes). + if len(contract.Input) != 160 { + return nil, errBLS12381InvalidInputLength + } + var err error + var p0 *bls12381.PointG1 + + // Initialize G1 + g := bls12381.NewG1() + + // Decode G1 point + if p0, err = g.DecodePoint(contract.Input[:128]); err != nil { + return nil, err + } + // Decode scalar value + e := new(big.Int).SetBytes(contract.Input[128:]) + + // Compute r = e * p_0 + r := g.New() + g.MulScalar(r, p0, e) + + // Encode the G1 point into 128 bytes + return g.EncodePoint(r), nil +} + +// bls12381G1MultiExp implements EIP-2537 G1MultiExp precompile. +type bls12381G1MultiExp struct{} + +// Address defines the precompiled contract address. This MUST match the address +// set in the precompiled contract map. +func (bls12381G1MultiExp) Address() common.Address { + return common.BytesToAddress([]byte{12}) +} + +// RequiredGas returns the gas required to execute the pre-compiled contract. +func (c *bls12381G1MultiExp) RequiredGas(input []byte) uint64 { + // Calculate G1 point, scalar value pair length + k := len(input) / 160 + if k == 0 { + // Return 0 gas for small input length + return 0 + } + // Lookup discount value for G1 point, scalar value pair length + var discount uint64 + if dLen := len(params.Bls12381MultiExpDiscountTable); k < dLen { + discount = params.Bls12381MultiExpDiscountTable[k-1] + } else { + discount = params.Bls12381MultiExpDiscountTable[dLen-1] + } + // Calculate gas and return the result + return (uint64(k) * params.Bls12381G1MulGas * discount) / 1000 +} + +func (c *bls12381G1MultiExp) Run(evm *EVM, contract *Contract, readonly bool) ([]byte, error) { + // Implements EIP-2537 G1MultiExp precompile. + // G1 multiplication call expects `160*k` bytes as an input that is interpreted as byte concatenation of `k` slices each of them being a byte concatenation of encoding of G1 point (`128` bytes) and encoding of a scalar value (`32` bytes). + // Output is an encoding of multiexponentiation operation result - single G1 point (`128` bytes). + k := len(contract.Input) / 160 + if len(contract.Input) == 0 || len(contract.Input)%160 != 0 { + return nil, errBLS12381InvalidInputLength + } + var err error + points := make([]*bls12381.PointG1, k) + scalars := make([]*big.Int, k) + + // Initialize G1 + g := bls12381.NewG1() + + // Decode point scalar pairs + for i := 0; i < k; i++ { + off := 160 * i + t0, t1, t2 := off, off+128, off+160 + // Decode G1 point + if points[i], err = g.DecodePoint(contract.Input[t0:t1]); err != nil { + return nil, err + } + // Decode scalar value + scalars[i] = new(big.Int).SetBytes(contract.Input[t1:t2]) + } + + // Compute r = e_0 * p_0 + e_1 * p_1 + ... + e_(k-1) * p_(k-1) + r := g.New() + g.MultiExp(r, points, scalars) + + // Encode the G1 point to 128 bytes + return g.EncodePoint(r), nil +} + +// bls12381G2Add implements EIP-2537 G2Add precompile. +type bls12381G2Add struct{} + +// Address defines the precompiled contract address. This MUST match the address +// set in the precompiled contract map. +func (bls12381G2Add) Address() common.Address { + return common.BytesToAddress([]byte{13}) +} + +// RequiredGas returns the gas required to execute the pre-compiled contract. +func (c *bls12381G2Add) RequiredGas(input []byte) uint64 { + return params.Bls12381G2AddGas +} + +func (c *bls12381G2Add) Run(evm *EVM, contract *Contract, readonly bool) ([]byte, error) { + // Implements EIP-2537 G2Add precompile. + // > G2 addition call expects `512` bytes as an input that is interpreted as byte concatenation of two G2 points (`256` bytes each). + // > Output is an encoding of addition operation result - single G2 point (`256` bytes). + if len(contract.Input) != 512 { + return nil, errBLS12381InvalidInputLength + } + var err error + var p0, p1 *bls12381.PointG2 + + // Initialize G2 + g := bls12381.NewG2() + r := g.New() + + // Decode G2 point p_0 + if p0, err = g.DecodePoint(contract.Input[:256]); err != nil { + return nil, err + } + // Decode G2 point p_1 + if p1, err = g.DecodePoint(contract.Input[256:]); err != nil { + return nil, err + } + + // Compute r = p_0 + p_1 + g.Add(r, p0, p1) + + // Encode the G2 point into 256 bytes + return g.EncodePoint(r), nil +} + +// bls12381G2Mul implements EIP-2537 G2Mul precompile. +type bls12381G2Mul struct{} + +// Address defines the precompiled contract address. This MUST match the address +// set in the precompiled contract map. +func (bls12381G2Mul) Address() common.Address { + return common.BytesToAddress([]byte{14}) +} + +// RequiredGas returns the gas required to execute the pre-compiled contract. +func (c *bls12381G2Mul) RequiredGas(input []byte) uint64 { + return params.Bls12381G2MulGas +} + +func (c *bls12381G2Mul) Run(evm *EVM, contract *Contract, readonly bool) ([]byte, error) { + // Implements EIP-2537 G2MUL precompile logic. + // > G2 multiplication call expects `288` bytes as an input that is interpreted as byte concatenation of encoding of G2 point (`256` bytes) and encoding of a scalar value (`32` bytes). + // > Output is an encoding of multiplication operation result - single G2 point (`256` bytes). + if len(contract.Input) != 288 { + return nil, errBLS12381InvalidInputLength + } + var err error + var p0 *bls12381.PointG2 + + // Initialize G2 + g := bls12381.NewG2() + + // Decode G2 point + if p0, err = g.DecodePoint(contract.Input[:256]); err != nil { + return nil, err + } + // Decode scalar value + e := new(big.Int).SetBytes(contract.Input[256:]) + + // Compute r = e * p_0 + r := g.New() + g.MulScalar(r, p0, e) + + // Encode the G2 point into 256 bytes + return g.EncodePoint(r), nil +} + +// bls12381G2MultiExp implements EIP-2537 G2MultiExp precompile. +type bls12381G2MultiExp struct{} + +// Address defines the precompiled contract address. This MUST match the address +// set in the precompiled contract map. +func (bls12381G2MultiExp) Address() common.Address { + return common.BytesToAddress([]byte{15}) +} + +// RequiredGas returns the gas required to execute the pre-compiled contract. +func (c *bls12381G2MultiExp) RequiredGas(input []byte) uint64 { + // Calculate G2 point, scalar value pair length + k := len(input) / 288 + if k == 0 { + // Return 0 gas for small input length + return 0 + } + // Lookup discount value for G2 point, scalar value pair length + var discount uint64 + if dLen := len(params.Bls12381MultiExpDiscountTable); k < dLen { + discount = params.Bls12381MultiExpDiscountTable[k-1] + } else { + discount = params.Bls12381MultiExpDiscountTable[dLen-1] + } + // Calculate gas and return the result + return (uint64(k) * params.Bls12381G2MulGas * discount) / 1000 +} + +func (c *bls12381G2MultiExp) Run(evm *EVM, contract *Contract, readonly bool) ([]byte, error) { + // Implements EIP-2537 G2MultiExp precompile logic + // > G2 multiplication call expects `288*k` bytes as an input that is interpreted as byte concatenation of `k` slices each of them being a byte concatenation of encoding of G2 point (`256` bytes) and encoding of a scalar value (`32` bytes). + // > Output is an encoding of multiexponentiation operation result - single G2 point (`256` bytes). + k := len(contract.Input) / 288 + if len(contract.Input) == 0 || len(contract.Input)%288 != 0 { + return nil, errBLS12381InvalidInputLength + } + var err error + points := make([]*bls12381.PointG2, k) + scalars := make([]*big.Int, k) + + // Initialize G2 + g := bls12381.NewG2() + + // Decode point scalar pairs + for i := 0; i < k; i++ { + off := 288 * i + t0, t1, t2 := off, off+256, off+288 + // Decode G1 point + if points[i], err = g.DecodePoint(contract.Input[t0:t1]); err != nil { + return nil, err + } + // Decode scalar value + scalars[i] = new(big.Int).SetBytes(contract.Input[t1:t2]) + } + + // Compute r = e_0 * p_0 + e_1 * p_1 + ... + e_(k-1) * p_(k-1) + r := g.New() + g.MultiExp(r, points, scalars) + + // Encode the G2 point to 256 bytes. + return g.EncodePoint(r), nil +} + +// bls12381Pairing implements EIP-2537 Pairing precompile. +type bls12381Pairing struct{} + +// Address defines the precompiled contract address. This MUST match the address +// set in the precompiled contract map. +func (bls12381Pairing) Address() common.Address { + return common.BytesToAddress([]byte{16}) +} + +// RequiredGas returns the gas required to execute the pre-compiled contract. +func (c *bls12381Pairing) RequiredGas(input []byte) uint64 { + return params.Bls12381PairingBaseGas + uint64(len(input)/384)*params.Bls12381PairingPerPairGas +} + +func (c *bls12381Pairing) Run(evm *EVM, contract *Contract, readonly bool) ([]byte, error) { + // Implements EIP-2537 Pairing precompile logic. + // > Pairing call expects `384*k` bytes as an inputs that is interpreted as byte concatenation of `k` slices. Each slice has the following structure: + // > - `128` bytes of G1 point encoding + // > - `256` bytes of G2 point encoding + // > Output is a `32` bytes where last single byte is `0x01` if pairing result is equal to multiplicative identity in a pairing target field and `0x00` otherwise + // > (which is equivalent of Big Endian encoding of Solidity values `uint256(1)` and `uin256(0)` respectively). + k := len(contract.Input) / 384 + if len(contract.Input) == 0 || len(contract.Input)%384 != 0 { + return nil, errBLS12381InvalidInputLength + } + + // Initialize BLS12-381 pairing engine + e := bls12381.NewPairingEngine() + g1, g2 := e.G1, e.G2 + + // Decode pairs + for i := 0; i < k; i++ { + off := 384 * i + t0, t1, t2 := off, off+128, off+384 + + // Decode G1 point + p1, err := g1.DecodePoint(contract.Input[t0:t1]) + if err != nil { + return nil, err + } + // Decode G2 point + p2, err := g2.DecodePoint(contract.Input[t1:t2]) + if err != nil { + return nil, err + } + + // 'point is on curve' check already done, + // Here we need to apply subgroup checks. + if !g1.InCorrectSubgroup(p1) { + return nil, errBLS12381G1PointSubgroup + } + if !g2.InCorrectSubgroup(p2) { + return nil, errBLS12381G2PointSubgroup + } + + // Update pairing engine with G1 and G2 ponits + e.AddPair(p1, p2) + } + // Prepare 32 byte output + out := make([]byte, 32) + + // Compute pairing and set the result + if e.Check() { + out[31] = 1 + } + return out, nil +} + +// decodeBLS12381FieldElement decodes BLS12-381 elliptic curve field element. +// Removes top 16 bytes of 64 byte input. +func decodeBLS12381FieldElement(in []byte) ([]byte, error) { + if len(in) != 64 { + return nil, errors.New("invalid field element length") + } + // check top bytes + for i := 0; i < 16; i++ { + if in[i] != byte(0x00) { + return nil, errBLS12381InvalidFieldElementTopBytes + } + } + out := make([]byte, 48) + copy(out[:], in[16:]) + return out, nil +} + +// bls12381MapG1 implements EIP-2537 MapG1 precompile. +type bls12381MapG1 struct{} + +// Address defines the precompiled contract address. This MUST match the address +// set in the precompiled contract map. +func (bls12381MapG1) Address() common.Address { + return common.BytesToAddress([]byte{17}) +} + +// RequiredGas returns the gas required to execute the pre-compiled contract. +func (c *bls12381MapG1) RequiredGas(input []byte) uint64 { + return params.Bls12381MapG1Gas +} + +func (c *bls12381MapG1) Run(evm *EVM, contract *Contract, readonly bool) ([]byte, error) { + // Implements EIP-2537 Map_To_G1 precompile. + // > Field-to-curve call expects `64` bytes an an input that is interpreted as a an element of the base field. + // > Output of this call is `128` bytes and is G1 point following respective encoding rules. + if len(contract.Input) != 64 { + return nil, errBLS12381InvalidInputLength + } + + // Decode input field element + fe, err := decodeBLS12381FieldElement(contract.Input) + if err != nil { + return nil, err + } + + // Initialize G1 + g := bls12381.NewG1() + + // Compute mapping + r, err := g.MapToCurve(fe) + if err != nil { + return nil, err + } + + // Encode the G1 point to 128 bytes + return g.EncodePoint(r), nil +} + +// bls12381MapG2 implements EIP-2537 MapG2 precompile. +type bls12381MapG2 struct{} + +// Address defines the precompiled contract address. This MUST match the address +// set in the precompiled contract map. +func (bls12381MapG2) Address() common.Address { + return common.BytesToAddress([]byte{18}) +} + +// RequiredGas returns the gas required to execute the pre-compiled contract. +func (c *bls12381MapG2) RequiredGas(input []byte) uint64 { + return params.Bls12381MapG2Gas +} + +func (c *bls12381MapG2) Run(evm *EVM, contract *Contract, readonly bool) ([]byte, error) { + // Implements EIP-2537 Map_FP2_TO_G2 precompile logic. + // > Field-to-curve call expects `128` bytes an an input that is interpreted as a an element of the quadratic extension field. + // > Output of this call is `256` bytes and is G2 point following respective encoding rules. + if len(contract.Input) != 128 { + return nil, errBLS12381InvalidInputLength + } + + // Decode input field element + fe := make([]byte, 96) + c0, err := decodeBLS12381FieldElement(contract.Input[:64]) + if err != nil { + return nil, err + } + copy(fe[48:], c0) + c1, err := decodeBLS12381FieldElement(contract.Input[64:]) + if err != nil { + return nil, err + } + copy(fe[:48], c1) + + // Initialize G2 + g := bls12381.NewG2() + + // Compute mapping + r, err := g.MapToCurve(fe) + if err != nil { + return nil, err + } + + // Encode the G2 point to 256 bytes + return g.EncodePoint(r), nil +} diff --git a/x/evm/core/vm/contracts_test.go b/x/evm/core/vm/contracts_test.go new file mode 100644 index 0000000000..1d4417c5b9 --- /dev/null +++ b/x/evm/core/vm/contracts_test.go @@ -0,0 +1,394 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package vm + +import ( + "bytes" + "encoding/json" + "fmt" + "math/big" + "os" + "testing" + "time" + + "github.com/ethereum/go-ethereum/common" +) + +// precompiledTest defines the input/output pairs for precompiled contract tests. +type precompiledTest struct { + Input, Expected string + Gas uint64 + Name string + NoBenchmark bool // Benchmark primarily the worst-cases +} + +// precompiledFailureTest defines the input/error pairs for precompiled +// contract failure tests. +type precompiledFailureTest struct { + Input string + ExpectedError string + Name string +} + +// allPrecompiles does not map to the actual set of precompiles, as it also contains +// repriced versions of precompiles at certain slots +var allPrecompiles = map[common.Address]PrecompiledContract{ + common.BytesToAddress([]byte{1}): &ecrecover{}, + common.BytesToAddress([]byte{2}): &sha256hash{}, + common.BytesToAddress([]byte{3}): &ripemd160hash{}, + common.BytesToAddress([]byte{4}): &dataCopy{}, + common.BytesToAddress([]byte{5}): &bigModExp{eip2565: false}, + common.BytesToAddress([]byte{0xf5}): &bigModExp{eip2565: true}, + common.BytesToAddress([]byte{6}): &bn256AddIstanbul{}, + common.BytesToAddress([]byte{7}): &bn256ScalarMulIstanbul{}, + common.BytesToAddress([]byte{8}): &bn256PairingIstanbul{}, + common.BytesToAddress([]byte{9}): &blake2F{}, + common.BytesToAddress([]byte{10}): &bls12381G1Add{}, + common.BytesToAddress([]byte{11}): &bls12381G1Mul{}, + common.BytesToAddress([]byte{12}): &bls12381G1MultiExp{}, + common.BytesToAddress([]byte{13}): &bls12381G2Add{}, + common.BytesToAddress([]byte{14}): &bls12381G2Mul{}, + common.BytesToAddress([]byte{15}): &bls12381G2MultiExp{}, + common.BytesToAddress([]byte{16}): &bls12381Pairing{}, + common.BytesToAddress([]byte{17}): &bls12381MapG1{}, + common.BytesToAddress([]byte{18}): &bls12381MapG2{}, +} + +// EIP-152 test vectors +var blake2FMalformedInputTests = []precompiledFailureTest{ + { + Input: "", + ExpectedError: errBlake2FInvalidInputLength.Error(), + Name: "vector 0: empty input", + }, + { + Input: "00000c48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001", + ExpectedError: errBlake2FInvalidInputLength.Error(), + Name: "vector 1: less than 213 bytes input", + }, + { + Input: "000000000c48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001", + ExpectedError: errBlake2FInvalidInputLength.Error(), + Name: "vector 2: more than 213 bytes input", + }, + { + Input: "0000000c48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000002", + ExpectedError: errBlake2FInvalidFinalFlag.Error(), + Name: "vector 3: malformed final block indicator flag", + }, +} + +func testPrecompiled(addr string, test precompiledTest, t *testing.T) { + p := allPrecompiles[common.HexToAddress(addr)] + in := common.Hex2Bytes(test.Input) + gas := p.RequiredGas(in) + t.Run(fmt.Sprintf("%s-Gas=%d", test.Name, gas), func(t *testing.T) { + if res, _, err := runPrecompiledContract(nil, p, AccountRef(common.Address{}), in, gas, new(big.Int), false); err != nil { + t.Error(err) + } else if common.Bytes2Hex(res) != test.Expected { + t.Errorf("Expected %v, got %v", test.Expected, common.Bytes2Hex(res)) + } + if expGas := test.Gas; expGas != gas { + t.Errorf("%v: gas wrong, expected %d, got %d", test.Name, expGas, gas) + } + // Verify that the precompile did not touch the input buffer + exp := common.Hex2Bytes(test.Input) + if !bytes.Equal(in, exp) { + t.Errorf("Precompiled %v modified input data", addr) + } + }) +} + +func testPrecompiledOOG(addr string, test precompiledTest, t *testing.T) { + p := allPrecompiles[common.HexToAddress(addr)] + in := common.Hex2Bytes(test.Input) + gas := p.RequiredGas(in) - 1 + + t.Run(fmt.Sprintf("%s-Gas=%d", test.Name, gas), func(t *testing.T) { + _, _, err := runPrecompiledContract(nil, p, AccountRef(common.Address{}), in, gas, new(big.Int), false) + if err.Error() != "out of gas" { + t.Errorf("Expected error [out of gas], got [%v]", err) + } + // Verify that the precompile did not touch the input buffer + exp := common.Hex2Bytes(test.Input) + if !bytes.Equal(in, exp) { + t.Errorf("Precompiled %v modified input data", addr) + } + }) +} + +func testPrecompiledFailure(addr string, test precompiledFailureTest, t *testing.T) { + p := allPrecompiles[common.HexToAddress(addr)] + in := common.Hex2Bytes(test.Input) + gas := p.RequiredGas(in) + t.Run(test.Name, func(t *testing.T) { + _, _, err := runPrecompiledContract(nil, p, AccountRef(common.Address{}), in, gas, new(big.Int), false) + if err.Error() != test.ExpectedError { + t.Errorf("Expected error [%v], got [%v]", test.ExpectedError, err) + } + // Verify that the precompile did not touch the input buffer + exp := common.Hex2Bytes(test.Input) + if !bytes.Equal(in, exp) { + t.Errorf("Precompiled %v modified input data", addr) + } + }) +} + +func benchmarkPrecompiled(addr string, test precompiledTest, bench *testing.B) { + if test.NoBenchmark { + return + } + p := allPrecompiles[common.HexToAddress(addr)] + in := common.Hex2Bytes(test.Input) + reqGas := p.RequiredGas(in) + + var ( + res []byte + err error + data = make([]byte, len(in)) + ) + + bench.Run(fmt.Sprintf("%s-Gas=%d", test.Name, reqGas), func(bench *testing.B) { + bench.ReportAllocs() + start := time.Now() + bench.ResetTimer() + for i := 0; i < bench.N; i++ { + copy(data, in) + res, _, err = runPrecompiledContract(nil, p, AccountRef(common.Address{}), in, reqGas, new(big.Int), false) + } + bench.StopTimer() + elapsed := uint64(time.Since(start)) + if elapsed < 1 { + elapsed = 1 + } + gasUsed := reqGas * uint64(bench.N) + bench.ReportMetric(float64(reqGas), "gas/op") + // Keep it as uint64, multiply 100 to get two digit float later + mgasps := (100 * 1000 * gasUsed) / elapsed + bench.ReportMetric(float64(mgasps)/100, "mgas/s") + // Check if it is correct + if err != nil { + bench.Error(err) + return + } + if common.Bytes2Hex(res) != test.Expected { + bench.Errorf("Expected %v, got %v", test.Expected, common.Bytes2Hex(res)) + return + } + }) +} + +// Benchmarks the sample inputs from the ECRECOVER precompile. +func BenchmarkPrecompiledEcrecover(bench *testing.B) { + t := precompiledTest{ + Input: "38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e000000000000000000000000000000000000000000000000000000000000001b38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e789d1dd423d25f0772d2748d60f7e4b81bb14d086eba8e8e8efb6dcff8a4ae02", + Expected: "000000000000000000000000ceaccac640adf55b2028469bd36ba501f28b699d", + Name: "", + } + benchmarkPrecompiled("01", t, bench) +} + +// Benchmarks the sample inputs from the SHA256 precompile. +func BenchmarkPrecompiledSha256(bench *testing.B) { + t := precompiledTest{ + Input: "38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e000000000000000000000000000000000000000000000000000000000000001b38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e789d1dd423d25f0772d2748d60f7e4b81bb14d086eba8e8e8efb6dcff8a4ae02", + Expected: "811c7003375852fabd0d362e40e68607a12bdabae61a7d068fe5fdd1dbbf2a5d", + Name: "128", + } + benchmarkPrecompiled("02", t, bench) +} + +// Benchmarks the sample inputs from the RIPEMD precompile. +func BenchmarkPrecompiledRipeMD(bench *testing.B) { + t := precompiledTest{ + Input: "38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e000000000000000000000000000000000000000000000000000000000000001b38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e789d1dd423d25f0772d2748d60f7e4b81bb14d086eba8e8e8efb6dcff8a4ae02", + Expected: "0000000000000000000000009215b8d9882ff46f0dfde6684d78e831467f65e6", + Name: "128", + } + benchmarkPrecompiled("03", t, bench) +} + +// Benchmarks the sample inputs from the identiy precompile. +func BenchmarkPrecompiledIdentity(bench *testing.B) { + t := precompiledTest{ + Input: "38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e000000000000000000000000000000000000000000000000000000000000001b38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e789d1dd423d25f0772d2748d60f7e4b81bb14d086eba8e8e8efb6dcff8a4ae02", + Expected: "38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e000000000000000000000000000000000000000000000000000000000000001b38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e789d1dd423d25f0772d2748d60f7e4b81bb14d086eba8e8e8efb6dcff8a4ae02", + Name: "128", + } + benchmarkPrecompiled("04", t, bench) +} + +// Tests the sample inputs from the ModExp EIP 198. +func TestPrecompiledModExp(t *testing.T) { testJson("modexp", "05", t) } +func BenchmarkPrecompiledModExp(b *testing.B) { benchJson("modexp", "05", b) } + +func TestPrecompiledModExpEip2565(t *testing.T) { testJson("modexp_eip2565", "f5", t) } +func BenchmarkPrecompiledModExpEip2565(b *testing.B) { benchJson("modexp_eip2565", "f5", b) } + +// Tests the sample inputs from the elliptic curve addition EIP 213. +func TestPrecompiledBn256Add(t *testing.T) { testJson("bn256Add", "06", t) } +func BenchmarkPrecompiledBn256Add(b *testing.B) { benchJson("bn256Add", "06", b) } + +// Tests OOG +func TestPrecompiledModExpOOG(t *testing.T) { + modexpTests, err := loadJson("modexp") + if err != nil { + t.Fatal(err) + } + for _, test := range modexpTests { + testPrecompiledOOG("05", test, t) + } +} + +// Tests the sample inputs from the elliptic curve scalar multiplication EIP 213. +func TestPrecompiledBn256ScalarMul(t *testing.T) { testJson("bn256ScalarMul", "07", t) } +func BenchmarkPrecompiledBn256ScalarMul(b *testing.B) { benchJson("bn256ScalarMul", "07", b) } + +// Tests the sample inputs from the elliptic curve pairing check EIP 197. +func TestPrecompiledBn256Pairing(t *testing.T) { testJson("bn256Pairing", "08", t) } +func BenchmarkPrecompiledBn256Pairing(b *testing.B) { benchJson("bn256Pairing", "08", b) } + +func TestPrecompiledBlake2F(t *testing.T) { testJson("blake2F", "09", t) } +func BenchmarkPrecompiledBlake2F(b *testing.B) { benchJson("blake2F", "09", b) } + +func TestPrecompileBlake2FMalformedInput(t *testing.T) { + for _, test := range blake2FMalformedInputTests { + testPrecompiledFailure("09", test, t) + } +} + +func TestPrecompiledEcrecover(t *testing.T) { testJson("ecRecover", "01", t) } + +func testJson(name, addr string, t *testing.T) { + tests, err := loadJson(name) + if err != nil { + t.Fatal(err) + } + for _, test := range tests { + testPrecompiled(addr, test, t) + } +} + +func testJsonFail(name, addr string, t *testing.T) { + tests, err := loadJsonFail(name) + if err != nil { + t.Fatal(err) + } + for _, test := range tests { + testPrecompiledFailure(addr, test, t) + } +} + +func benchJson(name, addr string, b *testing.B) { + tests, err := loadJson(name) + if err != nil { + b.Fatal(err) + } + for _, test := range tests { + benchmarkPrecompiled(addr, test, b) + } +} + +func TestPrecompiledBLS12381G1Add(t *testing.T) { testJson("blsG1Add", "0a", t) } +func TestPrecompiledBLS12381G1Mul(t *testing.T) { testJson("blsG1Mul", "0b", t) } +func TestPrecompiledBLS12381G1MultiExp(t *testing.T) { testJson("blsG1MultiExp", "0c", t) } +func TestPrecompiledBLS12381G2Add(t *testing.T) { testJson("blsG2Add", "0d", t) } +func TestPrecompiledBLS12381G2Mul(t *testing.T) { testJson("blsG2Mul", "0e", t) } +func TestPrecompiledBLS12381G2MultiExp(t *testing.T) { testJson("blsG2MultiExp", "0f", t) } +func TestPrecompiledBLS12381Pairing(t *testing.T) { testJson("blsPairing", "10", t) } +func TestPrecompiledBLS12381MapG1(t *testing.T) { testJson("blsMapG1", "11", t) } +func TestPrecompiledBLS12381MapG2(t *testing.T) { testJson("blsMapG2", "12", t) } + +func BenchmarkPrecompiledBLS12381G1Add(b *testing.B) { benchJson("blsG1Add", "0a", b) } +func BenchmarkPrecompiledBLS12381G1Mul(b *testing.B) { benchJson("blsG1Mul", "0b", b) } +func BenchmarkPrecompiledBLS12381G1MultiExp(b *testing.B) { benchJson("blsG1MultiExp", "0c", b) } +func BenchmarkPrecompiledBLS12381G2Add(b *testing.B) { benchJson("blsG2Add", "0d", b) } +func BenchmarkPrecompiledBLS12381G2Mul(b *testing.B) { benchJson("blsG2Mul", "0e", b) } +func BenchmarkPrecompiledBLS12381G2MultiExp(b *testing.B) { benchJson("blsG2MultiExp", "0f", b) } +func BenchmarkPrecompiledBLS12381Pairing(b *testing.B) { benchJson("blsPairing", "10", b) } +func BenchmarkPrecompiledBLS12381MapG1(b *testing.B) { benchJson("blsMapG1", "11", b) } +func BenchmarkPrecompiledBLS12381MapG2(b *testing.B) { benchJson("blsMapG2", "12", b) } + +// Failure tests +func TestPrecompiledBLS12381G1AddFail(t *testing.T) { testJsonFail("blsG1Add", "0a", t) } +func TestPrecompiledBLS12381G1MulFail(t *testing.T) { testJsonFail("blsG1Mul", "0b", t) } +func TestPrecompiledBLS12381G1MultiExpFail(t *testing.T) { testJsonFail("blsG1MultiExp", "0c", t) } +func TestPrecompiledBLS12381G2AddFail(t *testing.T) { testJsonFail("blsG2Add", "0d", t) } +func TestPrecompiledBLS12381G2MulFail(t *testing.T) { testJsonFail("blsG2Mul", "0e", t) } +func TestPrecompiledBLS12381G2MultiExpFail(t *testing.T) { testJsonFail("blsG2MultiExp", "0f", t) } +func TestPrecompiledBLS12381PairingFail(t *testing.T) { testJsonFail("blsPairing", "10", t) } +func TestPrecompiledBLS12381MapG1Fail(t *testing.T) { testJsonFail("blsMapG1", "11", t) } +func TestPrecompiledBLS12381MapG2Fail(t *testing.T) { testJsonFail("blsMapG2", "12", t) } + +func loadJson(name string) ([]precompiledTest, error) { + data, err := os.ReadFile(fmt.Sprintf("testdata/precompiles/%v.json", name)) + if err != nil { + return nil, err + } + var testcases []precompiledTest + err = json.Unmarshal(data, &testcases) + return testcases, err +} + +func loadJsonFail(name string) ([]precompiledFailureTest, error) { + data, err := os.ReadFile(fmt.Sprintf("testdata/precompiles/fail-%v.json", name)) + if err != nil { + return nil, err + } + var testcases []precompiledFailureTest + err = json.Unmarshal(data, &testcases) + return testcases, err +} + +// BenchmarkPrecompiledBLS12381G1MultiExpWorstCase benchmarks the worst case we could find that still fits a gaslimit of 10MGas. +func BenchmarkPrecompiledBLS12381G1MultiExpWorstCase(b *testing.B) { + task := "0000000000000000000000000000000008d8c4a16fb9d8800cce987c0eadbb6b3b005c213d44ecb5adeed713bae79d606041406df26169c35df63cf972c94be1" + + "0000000000000000000000000000000011bc8afe71676e6730702a46ef817060249cd06cd82e6981085012ff6d013aa4470ba3a2c71e13ef653e1e223d1ccfe9" + + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + input := task + for i := 0; i < 4787; i++ { + input = input + task + } + testcase := precompiledTest{ + Input: input, + Expected: "0000000000000000000000000000000005a6310ea6f2a598023ae48819afc292b4dfcb40aabad24a0c2cb6c19769465691859eeb2a764342a810c5038d700f18000000000000000000000000000000001268ac944437d15923dc0aec00daa9250252e43e4b35ec7a19d01f0d6cd27f6e139d80dae16ba1c79cc7f57055a93ff5", + Name: "WorstCaseG1", + NoBenchmark: false, + } + benchmarkPrecompiled("0c", testcase, b) +} + +// BenchmarkPrecompiledBLS12381G2MultiExpWorstCase benchmarks the worst case we could find that still fits a gaslimit of 10MGas. +func BenchmarkPrecompiledBLS12381G2MultiExpWorstCase(b *testing.B) { + task := "000000000000000000000000000000000d4f09acd5f362e0a516d4c13c5e2f504d9bd49fdfb6d8b7a7ab35a02c391c8112b03270d5d9eefe9b659dd27601d18f" + + "000000000000000000000000000000000fd489cb75945f3b5ebb1c0e326d59602934c8f78fe9294a8877e7aeb95de5addde0cb7ab53674df8b2cfbb036b30b99" + + "00000000000000000000000000000000055dbc4eca768714e098bbe9c71cf54b40f51c26e95808ee79225a87fb6fa1415178db47f02d856fea56a752d185f86b" + + "000000000000000000000000000000001239b7640f416eb6e921fe47f7501d504fadc190d9cf4e89ae2b717276739a2f4ee9f637c35e23c480df029fd8d247c7" + + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + input := task + for i := 0; i < 1040; i++ { + input = input + task + } + + testcase := precompiledTest{ + Input: input, + Expected: "0000000000000000000000000000000018f5ea0c8b086095cfe23f6bb1d90d45de929292006dba8cdedd6d3203af3c6bbfd592e93ecb2b2c81004961fdcbb46c00000000000000000000000000000000076873199175664f1b6493a43c02234f49dc66f077d3007823e0343ad92e30bd7dc209013435ca9f197aca44d88e9dac000000000000000000000000000000000e6f07f4b23b511eac1e2682a0fc224c15d80e122a3e222d00a41fab15eba645a700b9ae84f331ae4ed873678e2e6c9b000000000000000000000000000000000bcb4849e460612aaed79617255fd30c03f51cf03d2ed4163ca810c13e1954b1e8663157b957a601829bb272a4e6c7b8", + Name: "WorstCaseG2", + NoBenchmark: false, + } + benchmarkPrecompiled("0f", testcase, b) +} diff --git a/x/evm/core/vm/custom_eip.go b/x/evm/core/vm/custom_eip.go new file mode 100644 index 0000000000..29eb34ae1e --- /dev/null +++ b/x/evm/core/vm/custom_eip.go @@ -0,0 +1,74 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package vm + +import ( + "fmt" + "sort" + + "golang.org/x/exp/maps" +) + +// ExtendActivators allows to merge the go ethereum activators map +// with additional activators. +func ExtendActivators(eips map[int]func(*JumpTable)) error { + // Catch early duplicated eip. + keys := make([]int, 0, len(eips)) + for k := range eips { + if ExistsEipActivator(k) { + return fmt.Errorf("duplicate activation: %d is already present in %s", k, ActivateableEips()) + } + keys = append(keys, k) + } + + // Sorting keys to ensure deterministic execution. + sort.Ints(keys) + + for _, k := range keys { + activators[k] = eips[k] + } + return nil +} + +func GetActivatorsEipNumbers() []int { + keys := maps.Keys(activators) + + sort.Ints(keys) + return keys +} + +// GetConstantGas return the constant gas used by the operation. +func (o *operation) GetConstantGas() uint64 { + return o.constantGas +} + +// SetExecute sets the execution function of the operation. +func (o *operation) SetExecute(ef executionFunc) { + o.execute = ef +} + +// SetConstantGas changes the constant gas of the operation. +func (o *operation) SetConstantGas(gas uint64) { + o.constantGas = gas +} + +// SetDynamicGas sets the dynamic gas function of the operation. +func (o *operation) SetDynamicGas(gf gasFunc) { + o.dynamicGas = gf +} + +// SetMinStack sets the minimum stack size required for the operation. +func (o *operation) SetMinStack(minStack int) { + o.minStack = minStack +} + +// SetMaxStack sets the maximum stack size for the operation. +func (o *operation) SetMaxStack(maxStack int) { + o.maxStack = maxStack +} + +// SetMemorySize sets the memory size function for the operation. +func (o *operation) SetMemorySize(msf memorySizeFunc) { + o.memorySize = msf +} diff --git a/x/evm/core/vm/custom_eip_test.go b/x/evm/core/vm/custom_eip_test.go new file mode 100644 index 0000000000..c40ee6865f --- /dev/null +++ b/x/evm/core/vm/custom_eip_test.go @@ -0,0 +1,98 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package vm + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestExtendActivators(t *testing.T) { + eips_snapshot := GetActivatorsEipNumbers() + + testCases := []struct { + name string + new_activators map[int]func(*JumpTable) + expPass bool + errContains string + postCheck func() + }{ + { + "success - nil new activators", + nil, + true, + "", + func() { + eips := GetActivatorsEipNumbers() + require.ElementsMatch(t, eips_snapshot, eips, "expected eips number to be equal") + }, + }, + { + "success - single new activator", + map[int]func(*JumpTable){ + 0o000: func(jt *JumpTable) {}, + }, + true, + "", + func() { + eips := GetActivatorsEipNumbers() + require.ElementsMatch(t, append(eips_snapshot, 0o000), eips, "expected eips number to be equal") + }, + }, + { + "success - multiple new activators", + map[int]func(*JumpTable){ + 0o001: func(jt *JumpTable) {}, + 0o002: func(jt *JumpTable) {}, + }, + true, + "", + func() { + eips := GetActivatorsEipNumbers() + // since we are working with a global function, tests are not independent + require.ElementsMatch(t, append(eips_snapshot, 0o000, 0o001, 0o002), eips, "expected eips number to be equal") + }, + }, + { + "fail - repeated activator", + map[int]func(*JumpTable){ + 3855: func(jt *JumpTable) {}, + }, + false, + "", + func() { + eips := GetActivatorsEipNumbers() + // since we are working with a global function, tests are not independent + require.ElementsMatch(t, append(eips_snapshot, 0o000, 0o001, 0o002), eips, "expected eips number to be equal") + }, + }, + { + "fail - valid activator is not stored if a repeated is present", + map[int]func(*JumpTable){ + 0o003: func(jt *JumpTable) {}, + 3855: func(jt *JumpTable) {}, + }, + false, + "", + func() { + eips := GetActivatorsEipNumbers() + // since we are working with a global function, tests are not independent + require.ElementsMatch(t, append(eips_snapshot, 0o000, 0o001, 0o002), eips, "expected eips number to be equal") + }, + }, + } + + for _, tc := range testCases { + err := ExtendActivators(tc.new_activators) + if tc.expPass { + require.NoError(t, err) + } else { + require.Error(t, err) + require.Contains(t, err.Error(), tc.errContains, "expected different error") + } + + tc.postCheck() + } +} diff --git a/x/evm/core/vm/doc.go b/x/evm/core/vm/doc.go new file mode 100644 index 0000000000..5864d0cfa2 --- /dev/null +++ b/x/evm/core/vm/doc.go @@ -0,0 +1,24 @@ +// Copyright 2015 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +/* +Package vm implements the Ethereum Virtual Machine. + +The vm package implements one EVM, a byte code VM. The BC (Byte Code) VM loops +over a set of bytes and executes them according to the set of rules defined +in the Ethereum yellow paper. +*/ +package vm diff --git a/x/evm/core/vm/eips.go b/x/evm/core/vm/eips.go new file mode 100644 index 0000000000..01f55f22ef --- /dev/null +++ b/x/evm/core/vm/eips.go @@ -0,0 +1,200 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package vm + +import ( + "fmt" + "sort" + + "github.com/ethereum/go-ethereum/params" + "github.com/holiman/uint256" +) + +var activators = map[int]func(*JumpTable){ + 3855: enable3855, + 3529: enable3529, + 3198: enable3198, + 2929: enable2929, + 2200: enable2200, + 1884: enable1884, + 1344: enable1344, +} + +// EnableEIP enables the given EIP on the config. +// This operation writes in-place, and callers need to ensure that the globally +// defined jump tables are not polluted. +func EnableEIP(eipNum int, jt *JumpTable) error { + enablerFn, ok := activators[eipNum] + if !ok { + return fmt.Errorf("undefined eip %d", eipNum) + } + enablerFn(jt) + return nil +} + +// ExistsEipActivator return true if the given EIP +// number is associated with an activator function. +// Return false otherwise. +func ExistsEipActivator(eipNum int) bool { + _, ok := activators[eipNum] + return ok +} + +func ActivateableEips() []string { + var nums []string + if len(activators) > 0 { + for k := range activators { + nums = append(nums, fmt.Sprintf("%d", k)) + } + sort.Strings(nums) + } + return nums +} + +// enable1884 applies EIP-1884 to the given jump table: +// - Increase cost of BALANCE to 700 +// - Increase cost of EXTCODEHASH to 700 +// - Increase cost of SLOAD to 800 +// - Define SELFBALANCE, with cost GasFastStep (5) +func enable1884(jt *JumpTable) { + // Gas cost changes + jt[SLOAD].constantGas = params.SloadGasEIP1884 + jt[BALANCE].constantGas = params.BalanceGasEIP1884 + jt[EXTCODEHASH].constantGas = params.ExtcodeHashGasEIP1884 + + // New opcode + jt[SELFBALANCE] = &operation{ + execute: opSelfBalance, + constantGas: GasFastStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + } +} + +func opSelfBalance(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + balance, _ := uint256.FromBig(interpreter.evm.StateDB.GetBalance(scope.Contract.Address())) + scope.Stack.Push(balance) + return nil, nil +} + +// enable1344 applies EIP-1344 (ChainID Opcode) +// - Adds an opcode that returns the current chain’s EIP-155 unique identifier +func enable1344(jt *JumpTable) { + // New opcode + jt[CHAINID] = &operation{ + execute: opChainID, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + } +} + +// opChainID implements CHAINID opcode +func opChainID(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + chainId, _ := uint256.FromBig(interpreter.evm.chainConfig.ChainID) + scope.Stack.Push(chainId) + return nil, nil +} + +// enable2200 applies EIP-2200 (Rebalance net-metered SSTORE) +func enable2200(jt *JumpTable) { + jt[SLOAD].constantGas = params.SloadGasEIP2200 + jt[SSTORE].dynamicGas = gasSStoreEIP2200 +} + +// enable2929 enables "EIP-2929: Gas cost increases for state access opcodes" +// https://eips.ethereum.org/EIPS/eip-2929 +func enable2929(jt *JumpTable) { + jt[SSTORE].dynamicGas = gasSStoreEIP2929 + + jt[SLOAD].constantGas = 0 + jt[SLOAD].dynamicGas = gasSLoadEIP2929 + + jt[EXTCODECOPY].constantGas = params.WarmStorageReadCostEIP2929 + jt[EXTCODECOPY].dynamicGas = gasExtCodeCopyEIP2929 + + jt[EXTCODESIZE].constantGas = params.WarmStorageReadCostEIP2929 + jt[EXTCODESIZE].dynamicGas = gasEip2929AccountCheck + + jt[EXTCODEHASH].constantGas = params.WarmStorageReadCostEIP2929 + jt[EXTCODEHASH].dynamicGas = gasEip2929AccountCheck + + jt[BALANCE].constantGas = params.WarmStorageReadCostEIP2929 + jt[BALANCE].dynamicGas = gasEip2929AccountCheck + + jt[CALL].constantGas = params.WarmStorageReadCostEIP2929 + jt[CALL].dynamicGas = gasCallEIP2929 + + jt[CALLCODE].constantGas = params.WarmStorageReadCostEIP2929 + jt[CALLCODE].dynamicGas = gasCallCodeEIP2929 + + jt[STATICCALL].constantGas = params.WarmStorageReadCostEIP2929 + jt[STATICCALL].dynamicGas = gasStaticCallEIP2929 + + jt[DELEGATECALL].constantGas = params.WarmStorageReadCostEIP2929 + jt[DELEGATECALL].dynamicGas = gasDelegateCallEIP2929 + + // This was previously part of the dynamic cost, but we're using it as a constantGas + // factor here + jt[SELFDESTRUCT].constantGas = params.SelfdestructGasEIP150 + jt[SELFDESTRUCT].dynamicGas = gasSelfdestructEIP2929 +} + +// enable3529 enabled "EIP-3529: Reduction in refunds": +// - Removes refunds for selfdestructs +// - Reduces refunds for SSTORE +// - Reduces max refunds to 20% gas +func enable3529(jt *JumpTable) { + jt[SSTORE].dynamicGas = gasSStoreEIP3529 + jt[SELFDESTRUCT].dynamicGas = gasSelfdestructEIP3529 +} + +// enable3198 applies EIP-3198 (BASEFEE Opcode) +// - Adds an opcode that returns the current block's base fee. +func enable3198(jt *JumpTable) { + // New opcode + jt[BASEFEE] = &operation{ + execute: opBaseFee, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + } +} + +// opBaseFee implements BASEFEE opcode +func opBaseFee(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + baseFee, _ := uint256.FromBig(interpreter.evm.Context.BaseFee) + scope.Stack.Push(baseFee) + return nil, nil +} + +// enable3855 applies EIP-3855 (PUSH0 opcode) +func enable3855(jt *JumpTable) { + // New opcode + jt[PUSH0] = &operation{ + execute: opPush0, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + } +} + +// opPush0 implements the PUSH0 opcode +func opPush0(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + scope.Stack.Push(new(uint256.Int)) + return nil, nil +} diff --git a/x/evm/core/vm/errors.go b/x/evm/core/vm/errors.go new file mode 100644 index 0000000000..004f8ef1c8 --- /dev/null +++ b/x/evm/core/vm/errors.go @@ -0,0 +1,72 @@ +// Copyright 2014 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package vm + +import ( + "errors" + "fmt" +) + +// List evm execution errors +var ( + ErrOutOfGas = errors.New("out of gas") + ErrCodeStoreOutOfGas = errors.New("contract creation code storage out of gas") + ErrDepth = errors.New("max call depth exceeded") + ErrInsufficientBalance = errors.New("insufficient balance for transfer") + ErrContractAddressCollision = errors.New("contract address collision") + ErrExecutionReverted = errors.New("execution reverted") + ErrMaxCodeSizeExceeded = errors.New("max code size exceeded") + ErrInvalidJump = errors.New("invalid jump destination") + ErrWriteProtection = errors.New("write protection") + ErrReturnDataOutOfBounds = errors.New("return data out of bounds") + ErrGasUintOverflow = errors.New("gas uint64 overflow") + ErrInvalidCode = errors.New("invalid code: must not begin with 0xef") + ErrNonceUintOverflow = errors.New("nonce uint64 overflow") + + // errStopToken is an internal token indicating interpreter loop termination, + // never returned to outside callers. + errStopToken = errors.New("stop token") +) + +// ErrStackUnderflow wraps an evm error when the items on the stack less +// than the minimal requirement. +type ErrStackUnderflow struct { + stackLen int + required int +} + +func (e *ErrStackUnderflow) Error() string { + return fmt.Sprintf("stack underflow (%d <=> %d)", e.stackLen, e.required) +} + +// ErrStackOverflow wraps an evm error when the items on the stack exceeds +// the maximum allowance. +type ErrStackOverflow struct { + stackLen int + limit int +} + +func (e *ErrStackOverflow) Error() string { + return fmt.Sprintf("stack limit reached %d (%d)", e.stackLen, e.limit) +} + +// ErrInvalidOpCode wraps an evm error when an invalid opcode is encountered. +type ErrInvalidOpCode struct { + opcode OpCode +} + +func (e *ErrInvalidOpCode) Error() string { return fmt.Sprintf("invalid opcode: %s", e.opcode) } diff --git a/x/evm/core/vm/evm.go b/x/evm/core/vm/evm.go new file mode 100644 index 0000000000..d8ca6d911c --- /dev/null +++ b/x/evm/core/vm/evm.go @@ -0,0 +1,550 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package vm + +import ( + "math/big" + "sync/atomic" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/params" + "github.com/holiman/uint256" +) + +// emptyCodeHash is used by create to ensure deployment is disallowed to already +// deployed contract addresses (relevant after the account abstraction). +var emptyCodeHash = crypto.Keccak256Hash(nil) + +type ( + // CanTransferFunc is the signature of a transfer guard function + CanTransferFunc func(StateDB, common.Address, *big.Int) bool + // TransferFunc is the signature of a transfer function + TransferFunc func(StateDB, common.Address, common.Address, *big.Int) + // GetHashFunc returns the n'th block hash in the blockchain + // and is used by the BLOCKHASH EVM op code. + GetHashFunc func(uint64) common.Hash +) + +// BlockContext provides the EVM with auxiliary information. Once provided +// it shouldn't be modified. +type BlockContext struct { + // CanTransfer returns whether the account contains + // sufficient ether to transfer the value + CanTransfer CanTransferFunc + // Transfer transfers ether from one account to the other + Transfer TransferFunc + // GetHash returns the hash corresponding to n + GetHash GetHashFunc + + // Block information + Coinbase common.Address // Provides information for COINBASE + GasLimit uint64 // Provides information for GASLIMIT + BlockNumber *big.Int // Provides information for NUMBER + Time *big.Int // Provides information for TIME + Difficulty *big.Int // Provides information for DIFFICULTY + BaseFee *big.Int // Provides information for BASEFEE + Random *common.Hash // Provides information for RANDOM +} + +// TxContext provides the EVM with information about a transaction. +// All fields can change between transactions. +type TxContext struct { + // Message information + Origin common.Address // Provides information for ORIGIN + GasPrice *big.Int // Provides information for GASPRICE +} + +// EVM is the Ethereum Virtual Machine base object and provides +// the necessary tools to run a contract on the given state with +// the provided context. It should be noted that any error +// generated through any of the calls should be considered a +// revert-state-and-consume-all-gas operation, no checks on +// specific errors should ever be performed. The interpreter makes +// sure that any errors generated are to be considered faulty code. +// +// The EVM should never be reused and is not thread safe. +type EVM struct { + // Context provides auxiliary blockchain related information + Context BlockContext + TxContext + // StateDB gives access to the underlying state + StateDB StateDB + // Depth is the current call stack + depth int + + // chainConfig contains information about the current chain + chainConfig *params.ChainConfig + // chain rules contains the chain rules for the current epoch + chainRules params.Rules + // virtual machine configuration options used to initialise the + // evm. + Config Config + // global (to this context) ethereum virtual machine + // used throughout the execution of the tx. + interpreter Interpreter + // abort is used to abort the EVM calling operations + // NOTE: must be set atomically + abort int32 + // callGasTemp holds the gas available for the current call. This is needed because the + // available gas is calculated in gasCall* according to the 63/64 rule and later + // applied in opCall*. + callGasTemp uint64 + // precompiles defines the precompiled contracts used by the EVM + precompiles map[common.Address]PrecompiledContract + // activePrecompiles defines the precompiles that are currently active + activePrecompiles []common.Address + + // hooks is a set of functions that can be used to intercept and modify the + // behavior of the EVM when executing certain opcodes. + // The hooks are called before the execution of the respective opcodes. + hooks OpCodeHooks +} + +// NewEVM returns a new EVM. The returned EVM is not thread safe and should +// only ever be used *once*. +func NewEVM(blockCtx BlockContext, txCtx TxContext, statedb StateDB, chainConfig *params.ChainConfig, config Config) *EVM { + evm := &EVM{ + Context: blockCtx, + TxContext: txCtx, + StateDB: statedb, + Config: config, + chainConfig: chainConfig, + chainRules: chainConfig.Rules(blockCtx.BlockNumber, blockCtx.Random != nil), + hooks: newNoopOpCodeHooks(), + } + // set the default precompiles + evm.activePrecompiles = DefaultActivePrecompiles(evm.chainRules) + evm.precompiles = DefaultPrecompiles(evm.chainRules) + evm.interpreter = NewEVMInterpreter(evm, config) + + return evm +} + +// NewEVMWithHooks returns a new EVM and takes a custom OpCodeHooks. The returned EVM is +// not thread safe and should only ever be used *once*. +func NewEVMWithHooks(hooks OpCodeHooks, blockCtx BlockContext, txCtx TxContext, statedb StateDB, chainConfig *params.ChainConfig, config Config) *EVM { + evm := &EVM{ + Context: blockCtx, + TxContext: txCtx, + StateDB: statedb, + Config: config, + chainConfig: chainConfig, + chainRules: chainConfig.Rules(blockCtx.BlockNumber, blockCtx.Random != nil), + hooks: hooks, + } + // set the default precompiles + evm.activePrecompiles = DefaultActivePrecompiles(evm.chainRules) + evm.precompiles = DefaultPrecompiles(evm.chainRules) + evm.interpreter = NewEVMInterpreter(evm, config) + + return evm +} + +// Reset resets the EVM with a new transaction context.Reset +// This is not threadsafe and should only be done very cautiously. +func (evm *EVM) Reset(txCtx TxContext, statedb StateDB) { + evm.TxContext = txCtx + evm.StateDB = statedb +} + +// Cancel cancels any running EVM operation. This may be called concurrently and +// it's safe to be called multiple times. +func (evm *EVM) Cancel() { + atomic.StoreInt32(&evm.abort, 1) +} + +// Cancelled returns true if Cancel has been called +func (evm *EVM) Cancelled() bool { + return atomic.LoadInt32(&evm.abort) == 1 +} + +// Interpreter returns the current interpreter +func (evm *EVM) Interpreter() Interpreter { + return evm.interpreter +} + +// WithInterpreter sets the interpreter to the EVM instance +func (evm *EVM) WithInterpreter(interpreter Interpreter) { + evm.interpreter = interpreter +} + +// Call executes the contract associated with the addr with the given input as +// parameters. It also handles any necessary value transfer required and takes +// the necessary steps to create accounts and reverses the state in case of an +// execution error or failed value transfer. +func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas uint64, value *big.Int) (ret []byte, leftOverGas uint64, err error) { + if err = evm.hooks.CallHook(evm, caller.Address(), addr); err != nil { + return nil, gas, err + } + + // Fail if we're trying to execute above the call depth limit + if evm.depth > int(params.CallCreateDepth) { + return nil, gas, ErrDepth + } + // Fail if we're trying to transfer more than the available balance + if value.Sign() != 0 && !evm.Context.CanTransfer(evm.StateDB, caller.Address(), value) { + return nil, gas, ErrInsufficientBalance + } + + snapshot := evm.StateDB.Snapshot() + p, isPrecompile := evm.Precompile(addr) + + if !evm.StateDB.Exist(addr) { + if !isPrecompile && evm.chainRules.IsEIP158 && value.Sign() == 0 { + // Calling a non existing account, don't do anything, but ping the tracer + if evm.Config.Debug { + if evm.depth == 0 { + evm.Config.Tracer.CaptureStart(evm, caller.Address(), addr, false, input, gas, value) + evm.Config.Tracer.CaptureEnd(ret, 0, 0, nil) + } else { + evm.Config.Tracer.CaptureEnter(CALL, caller.Address(), addr, input, gas, value) + evm.Config.Tracer.CaptureExit(ret, 0, nil) + } + } + return nil, gas, nil + } + evm.StateDB.CreateAccount(addr) + } + evm.Context.Transfer(evm.StateDB, caller.Address(), addr, value) + + // Capture the tracer start/end events in debug mode + if evm.Config.Debug { + if evm.depth == 0 { + evm.Config.Tracer.CaptureStart(evm, caller.Address(), addr, false, input, gas, value) + defer func(startGas uint64, startTime time.Time) { // Lazy evaluation of the parameters + evm.Config.Tracer.CaptureEnd(ret, startGas-gas, time.Since(startTime), err) + }(gas, time.Now()) + } else { + // Handle tracer events for entering and exiting a call frame + evm.Config.Tracer.CaptureEnter(CALL, caller.Address(), addr, input, gas, value) + defer func(startGas uint64) { + evm.Config.Tracer.CaptureExit(ret, startGas-gas, err) + }(gas) + } + } + + // It is allowed to call precompiles, even via call -- as opposed to callcode, staticcall and delegatecall it can also modify state + if isPrecompile { + ret, gas, err = evm.RunPrecompiledContract(p, caller, input, gas, value, false) + } else { + // Initialise a new contract and set the code that is to be used by the EVM. + // The contract is a scoped environment for this execution context only. + code := evm.StateDB.GetCode(addr) + if len(code) == 0 { + ret, err = nil, nil // gas is unchanged + } else { + addrCopy := addr + // If the account has no code, we can abort here + // The depth-check is already done, and precompiles handled above + contract := NewContract(caller, AccountRef(addrCopy), value, gas) + contract.SetCallCode(&addrCopy, evm.StateDB.GetCodeHash(addrCopy), code) + ret, err = evm.interpreter.Run(contract, input, false) + gas = contract.Gas + } + } + // When an error was returned by the EVM or when setting the creation code + // above we revert to the snapshot and consume any gas remaining. Additionally + // when we're in homestead this also counts for code storage gas errors. + if err != nil { + evm.StateDB.RevertToSnapshot(snapshot) + if err != ErrExecutionReverted { + gas = 0 + } + // TODO: consider clearing up unused snapshots: + //} else { + // evm.StateDB.DiscardSnapshot(snapshot) + } + return ret, gas, err +} + +// CallCode executes the contract associated with the addr with the given input +// as parameters. It also handles any necessary value transfer required and takes +// the necessary steps to create accounts and reverses the state in case of an +// execution error or failed value transfer. +// +// CallCode differs from Call in the sense that it executes the given address' +// code with the caller as context. +func (evm *EVM) CallCode(caller ContractRef, addr common.Address, input []byte, gas uint64, value *big.Int) (ret []byte, leftOverGas uint64, err error) { + if err = evm.hooks.CallHook(evm, caller.Address(), addr); err != nil { + return nil, gas, err + } + + // Fail if we're trying to execute above the call depth limit + if evm.depth > int(params.CallCreateDepth) { + return nil, gas, ErrDepth + } + // Fail if we're trying to transfer more than the available balance + // Note although it's noop to transfer X ether to caller itself. But + // if caller doesn't have enough balance, it would be an error to allow + // over-charging itself. So the check here is necessary. + if !evm.Context.CanTransfer(evm.StateDB, caller.Address(), value) { + return nil, gas, ErrInsufficientBalance + } + snapshot := evm.StateDB.Snapshot() + + // Invoke tracer hooks that signal entering/exiting a call frame + if evm.Config.Debug { + evm.Config.Tracer.CaptureEnter(CALLCODE, caller.Address(), addr, input, gas, value) + defer func(startGas uint64) { + evm.Config.Tracer.CaptureExit(ret, startGas-gas, err) + }(gas) + } + + // It is allowed to call precompiles, even via callcode, but only for reading + if p, isPrecompile := evm.Precompile(addr); isPrecompile { + ret, gas, err = evm.RunPrecompiledContract(p, caller, input, gas, value, true) + } else { + addrCopy := addr + // Initialise a new contract and set the code that is to be used by the EVM. + // The contract is a scoped environment for this execution context only. + contract := NewContract(caller, AccountRef(caller.Address()), value, gas) + contract.SetCallCode(&addrCopy, evm.StateDB.GetCodeHash(addrCopy), evm.StateDB.GetCode(addrCopy)) + ret, err = evm.interpreter.Run(contract, input, false) + gas = contract.Gas + } + if err != nil { + evm.StateDB.RevertToSnapshot(snapshot) + if err != ErrExecutionReverted { + gas = 0 + } + } + return ret, gas, err +} + +// DelegateCall executes the contract associated with the addr with the given input +// as parameters. It reverses the state in case of an execution error. +// +// DelegateCall differs from CallCode in the sense that it executes the given address' +// code with the caller as context and the caller is set to the caller of the caller. +func (evm *EVM) DelegateCall(caller ContractRef, addr common.Address, input []byte, gas uint64) (ret []byte, leftOverGas uint64, err error) { + if err = evm.hooks.CallHook(evm, caller.Address(), addr); err != nil { + return nil, gas, err + } + + // Fail if we're trying to execute above the call depth limit + if evm.depth > int(params.CallCreateDepth) { + return nil, gas, ErrDepth + } + snapshot := evm.StateDB.Snapshot() + + // Invoke tracer hooks that signal entering/exiting a call frame + if evm.Config.Debug { + evm.Config.Tracer.CaptureEnter(DELEGATECALL, caller.Address(), addr, input, gas, nil) + defer func(startGas uint64) { + evm.Config.Tracer.CaptureExit(ret, startGas-gas, err) + }(gas) + } + + // It is allowed to call precompiles, even via delegatecall + if p, isPrecompile := evm.Precompile(addr); isPrecompile { + ret, gas, err = evm.RunPrecompiledContract(p, caller, input, gas, nil, true) + } else { + addrCopy := addr + // Initialise a new contract and make initialise the delegate values + contract := NewContract(caller, AccountRef(caller.Address()), nil, gas).AsDelegate() + contract.SetCallCode(&addrCopy, evm.StateDB.GetCodeHash(addrCopy), evm.StateDB.GetCode(addrCopy)) + ret, err = evm.interpreter.Run(contract, input, false) + gas = contract.Gas + } + if err != nil { + evm.StateDB.RevertToSnapshot(snapshot) + if err != ErrExecutionReverted { + gas = 0 + } + } + return ret, gas, err +} + +// StaticCall executes the contract associated with the addr with the given input +// as parameters while disallowing any modifications to the state during the call. +// Opcodes that attempt to perform such modifications will result in exceptions +// instead of performing the modifications. +func (evm *EVM) StaticCall(caller ContractRef, addr common.Address, input []byte, gas uint64) (ret []byte, leftOverGas uint64, err error) { + if err = evm.hooks.CallHook(evm, caller.Address(), addr); err != nil { + return nil, gas, err + } + + // Fail if we're trying to execute above the call depth limit + if evm.depth > int(params.CallCreateDepth) { + return nil, gas, ErrDepth + } + // We take a snapshot here. This is a bit counter-intuitive, and could probably be skipped. + // However, even a staticcall is considered a 'touch'. On mainnet, static calls were introduced + // after all empty accounts were deleted, so this is not required. However, if we omit this, + // then certain tests start failing; stRevertTest/RevertPrecompiledTouchExactOOG.json. + // We could change this, but for now it's left for legacy reasons + snapshot := evm.StateDB.Snapshot() + + // We do an AddBalance of zero here, just in order to trigger a touch. + // This doesn't matter on Mainnet, where all empties are gone at the time of Byzantium, + // but is the correct thing to do and matters on other networks, in tests, and potential + // future scenarios + evm.StateDB.AddBalance(addr, big0) + + // Invoke tracer hooks that signal entering/exiting a call frame + if evm.Config.Debug { + evm.Config.Tracer.CaptureEnter(STATICCALL, caller.Address(), addr, input, gas, nil) + defer func(startGas uint64) { + evm.Config.Tracer.CaptureExit(ret, startGas-gas, err) + }(gas) + } + + if p, isPrecompile := evm.Precompile(addr); isPrecompile { + // Note: delegate call is not allowed to modify state on precompiles + ret, gas, err = evm.RunPrecompiledContract(p, caller, input, gas, new(big.Int), true) + } else { + // At this point, we use a copy of address. If we don't, the go compiler will + // leak the 'contract' to the outer scope, and make allocation for 'contract' + // even if the actual execution ends on RunPrecompiled above. + addrCopy := addr + // Initialise a new contract and set the code that is to be used by the EVM. + // The contract is a scoped environment for this execution context only. + contract := NewContract(caller, AccountRef(addrCopy), new(big.Int), gas) + contract.SetCallCode(&addrCopy, evm.StateDB.GetCodeHash(addrCopy), evm.StateDB.GetCode(addrCopy)) + // When an error was returned by the EVM or when setting the creation code + // above we revert to the snapshot and consume any gas remaining. Additionally + // when we're in Homestead this also counts for code storage gas errors. + ret, err = evm.interpreter.Run(contract, input, true) + gas = contract.Gas + } + if err != nil { + evm.StateDB.RevertToSnapshot(snapshot) + if err != ErrExecutionReverted { + gas = 0 + } + } + return ret, gas, err +} + +type codeAndHash struct { + code []byte + hash common.Hash +} + +func (c *codeAndHash) Hash() common.Hash { + if c.hash == (common.Hash{}) { + c.hash = crypto.Keccak256Hash(c.code) + } + return c.hash +} + +// create creates a new contract using code as deployment code. +func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gas uint64, value *big.Int, address common.Address, typ OpCode) ([]byte, common.Address, uint64, error) { + // Depth check execution. Fail if we're trying to execute above the + // limit. + if evm.depth > int(params.CallCreateDepth) { + return nil, common.Address{}, gas, ErrDepth + } + if !evm.Context.CanTransfer(evm.StateDB, caller.Address(), value) { + return nil, common.Address{}, gas, ErrInsufficientBalance + } + nonce := evm.StateDB.GetNonce(caller.Address()) + if nonce+1 < nonce { + return nil, common.Address{}, gas, ErrNonceUintOverflow + } + evm.StateDB.SetNonce(caller.Address(), nonce+1) + // We add this to the access list _before_ taking a snapshot. Even if the creation fails, + // the access-list change should not be rolled back + if evm.chainRules.IsBerlin { + evm.StateDB.AddAddressToAccessList(address) + } + // Ensure there's no existing contract already at the designated address + contractHash := evm.StateDB.GetCodeHash(address) + if evm.StateDB.GetNonce(address) != 0 || (contractHash != (common.Hash{}) && contractHash != emptyCodeHash) { + return nil, common.Address{}, 0, ErrContractAddressCollision + } + // Create a new account on the state + snapshot := evm.StateDB.Snapshot() + evm.StateDB.CreateAccount(address) + if evm.chainRules.IsEIP158 { + evm.StateDB.SetNonce(address, 1) + } + evm.Context.Transfer(evm.StateDB, caller.Address(), address, value) + + // Initialise a new contract and set the code that is to be used by the EVM. + // The contract is a scoped environment for this execution context only. + contract := NewContract(caller, AccountRef(address), value, gas) + contract.SetCodeOptionalHash(&address, codeAndHash) + + if evm.Config.Debug { + if evm.depth == 0 { + evm.Config.Tracer.CaptureStart(evm, caller.Address(), address, true, codeAndHash.code, gas, value) + } else { + evm.Config.Tracer.CaptureEnter(typ, caller.Address(), address, codeAndHash.code, gas, value) + } + } + + start := time.Now() + + ret, err := evm.interpreter.Run(contract, nil, false) + + // Check whether the max code size has been exceeded, assign err if the case. + if err == nil && evm.chainRules.IsEIP158 && len(ret) > params.MaxCodeSize { + err = ErrMaxCodeSizeExceeded + } + + // Reject code starting with 0xEF if EIP-3541 is enabled. + if err == nil && len(ret) >= 1 && ret[0] == 0xEF && evm.chainRules.IsLondon { + err = ErrInvalidCode + } + + // if the contract creation ran successfully and no errors were returned + // calculate the gas required to store the code. If the code could not + // be stored due to not enough gas set an error and let it be handled + // by the error checking condition below. + if err == nil { + createDataGas := uint64(len(ret)) * params.CreateDataGas + if contract.UseGas(createDataGas) { + evm.StateDB.SetCode(address, ret) + } else { + err = ErrCodeStoreOutOfGas + } + } + + // When an error was returned by the EVM or when setting the creation code + // above we revert to the snapshot and consume any gas remaining. Additionally + // when we're in homestead this also counts for code storage gas errors. + if err != nil && (evm.chainRules.IsHomestead || err != ErrCodeStoreOutOfGas) { + evm.StateDB.RevertToSnapshot(snapshot) + if err != ErrExecutionReverted { + contract.UseGas(contract.Gas) + } + } + + if evm.Config.Debug { + if evm.depth == 0 { + evm.Config.Tracer.CaptureEnd(ret, gas-contract.Gas, time.Since(start), err) + } else { + evm.Config.Tracer.CaptureExit(ret, gas-contract.Gas, err) + } + } + return ret, address, contract.Gas, err +} + +// Create creates a new contract using code as deployment code. +func (evm *EVM) Create(caller ContractRef, code []byte, gas uint64, value *big.Int) (ret []byte, contractAddr common.Address, leftOverGas uint64, err error) { + if err = evm.hooks.CreateHook(evm, caller.Address()); err != nil { + return nil, common.Address{}, gas, err + } + contractAddr = crypto.CreateAddress(caller.Address(), evm.StateDB.GetNonce(caller.Address())) + return evm.create(caller, &codeAndHash{code: code}, gas, value, contractAddr, CREATE) +} + +// Create2 creates a new contract using code as deployment code. +// +// The different between Create2 with Create is Create2 uses keccak256(0xff ++ msg.sender ++ salt ++ keccak256(init_code))[12:] +// instead of the usual sender-and-nonce-hash as the address where the contract is initialized at. +func (evm *EVM) Create2(caller ContractRef, code []byte, gas uint64, endowment *big.Int, salt *uint256.Int) (ret []byte, contractAddr common.Address, leftOverGas uint64, err error) { + if err = evm.hooks.CreateHook(evm, caller.Address()); err != nil { + return nil, common.Address{}, gas, err + } + codeAndHash := &codeAndHash{code: code} + contractAddr = crypto.CreateAddress2(caller.Address(), salt.Bytes32(), codeAndHash.Hash().Bytes()) + return evm.create(caller, codeAndHash, gas, endowment, contractAddr, CREATE2) +} + +// ChainConfig returns the environment's chain configuration +func (evm *EVM) ChainConfig() *params.ChainConfig { return evm.chainConfig } diff --git a/x/evm/core/vm/gas.go b/x/evm/core/vm/gas.go new file mode 100644 index 0000000000..5cf1d852d2 --- /dev/null +++ b/x/evm/core/vm/gas.go @@ -0,0 +1,53 @@ +// Copyright 2015 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package vm + +import ( + "github.com/holiman/uint256" +) + +// Gas costs +const ( + GasQuickStep uint64 = 2 + GasFastestStep uint64 = 3 + GasFastStep uint64 = 5 + GasMidStep uint64 = 8 + GasSlowStep uint64 = 10 + GasExtStep uint64 = 20 +) + +// callGas returns the actual gas cost of the call. +// +// The cost of gas was changed during the homestead price change HF. +// As part of EIP 150 (TangerineWhistle), the returned gas is gas - base * 63 / 64. +func callGas(isEip150 bool, availableGas, base uint64, callCost *uint256.Int) (uint64, error) { + if isEip150 { + availableGas = availableGas - base + gas := availableGas - availableGas/64 + // If the bit length exceeds 64 bit we know that the newly calculated "gas" for EIP150 + // is smaller than the requested amount. Therefore we return the new gas instead + // of returning an error. + if !callCost.IsUint64() || gas < callCost.Uint64() { + return gas, nil + } + } + if !callCost.IsUint64() { + return 0, ErrGasUintOverflow + } + + return callCost.Uint64(), nil +} diff --git a/x/evm/core/vm/gas_table.go b/x/evm/core/vm/gas_table.go new file mode 100644 index 0000000000..f37d914c26 --- /dev/null +++ b/x/evm/core/vm/gas_table.go @@ -0,0 +1,441 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package vm + +import ( + "errors" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/params" +) + +// memoryGasCost calculates the quadratic gas for memory expansion. It does so +// only for the memory region that is expanded, not the total memory. +func memoryGasCost(mem *Memory, newMemSize uint64) (uint64, error) { + if newMemSize == 0 { + return 0, nil + } + // The maximum that will fit in a uint64 is max_word_count - 1. Anything above + // that will result in an overflow. Additionally, a newMemSize which results in + // a newMemSizeWords larger than 0xFFFFFFFF will cause the square operation to + // overflow. The constant 0x1FFFFFFFE0 is the highest number that can be used + // without overflowing the gas calculation. + if newMemSize > 0x1FFFFFFFE0 { + return 0, ErrGasUintOverflow + } + newMemSizeWords := toWordSize(newMemSize) + newMemSize = newMemSizeWords * 32 + + if newMemSize > uint64(mem.Len()) { + square := newMemSizeWords * newMemSizeWords + linCoef := newMemSizeWords * params.MemoryGas + quadCoef := square / params.QuadCoeffDiv + newTotalFee := linCoef + quadCoef + + fee := newTotalFee - mem.lastGasCost + mem.lastGasCost = newTotalFee + + return fee, nil + } + return 0, nil +} + +// memoryCopierGas creates the gas functions for the following opcodes, and takes +// the stack position of the operand which determines the size of the data to copy +// as argument: +// CALLDATACOPY (stack position 2) +// CODECOPY (stack position 2) +// EXTCODECOPY (stack position 3) +// RETURNDATACOPY (stack position 2) +func memoryCopierGas(stackpos int) gasFunc { + return func(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { + // Gas for expanding the memory + gas, err := memoryGasCost(mem, memorySize) + if err != nil { + return 0, err + } + // And gas for copying data, charged per word at param.CopyGas + words, overflow := stack.Back(stackpos).Uint64WithOverflow() + if overflow { + return 0, ErrGasUintOverflow + } + + if words, overflow = math.SafeMul(toWordSize(words), params.CopyGas); overflow { + return 0, ErrGasUintOverflow + } + + if gas, overflow = math.SafeAdd(gas, words); overflow { + return 0, ErrGasUintOverflow + } + return gas, nil + } +} + +var ( + gasCallDataCopy = memoryCopierGas(2) + gasCodeCopy = memoryCopierGas(2) + gasExtCodeCopy = memoryCopierGas(3) + gasReturnDataCopy = memoryCopierGas(2) +) + +func gasSStore(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { + var ( + y, x = stack.Back(1), stack.Back(0) + current = evm.StateDB.GetState(contract.Address(), x.Bytes32()) + ) + // The legacy gas metering only takes into consideration the current state + // Legacy rules should be applied if we are in Petersburg (removal of EIP-1283) + // OR Constantinople is not active + if evm.chainRules.IsPetersburg || !evm.chainRules.IsConstantinople { + // This checks for 3 scenario's and calculates gas accordingly: + // + // 1. From a zero-value address to a non-zero value (NEW VALUE) + // 2. From a non-zero value address to a zero-value address (DELETE) + // 3. From a non-zero to a non-zero (CHANGE) + switch { + case current == (common.Hash{}) && y.Sign() != 0: // 0 => non 0 + return params.SstoreSetGas, nil + case current != (common.Hash{}) && y.Sign() == 0: // non 0 => 0 + evm.StateDB.AddRefund(params.SstoreRefundGas) + return params.SstoreClearGas, nil + default: // non 0 => non 0 (or 0 => 0) + return params.SstoreResetGas, nil + } + } + // The new gas metering is based on net gas costs (EIP-1283): + // + // 1. If current value equals new value (this is a no-op), 200 gas is deducted. + // 2. If current value does not equal new value + // 2.1. If original value equals current value (this storage slot has not been changed by the current execution context) + // 2.1.1. If original value is 0, 20000 gas is deducted. + // 2.1.2. Otherwise, 5000 gas is deducted. If new value is 0, add 15000 gas to refund counter. + // 2.2. If original value does not equal current value (this storage slot is dirty), 200 gas is deducted. Apply both of the following clauses. + // 2.2.1. If original value is not 0 + // 2.2.1.1. If current value is 0 (also means that new value is not 0), remove 15000 gas from refund counter. We can prove that refund counter will never go below 0. + // 2.2.1.2. If new value is 0 (also means that current value is not 0), add 15000 gas to refund counter. + // 2.2.2. If original value equals new value (this storage slot is reset) + // 2.2.2.1. If original value is 0, add 19800 gas to refund counter. + // 2.2.2.2. Otherwise, add 4800 gas to refund counter. + value := common.Hash(y.Bytes32()) + if current == value { // noop (1) + return params.NetSstoreNoopGas, nil + } + original := evm.StateDB.GetCommittedState(contract.Address(), x.Bytes32()) + if original == current { + if original == (common.Hash{}) { // create slot (2.1.1) + return params.NetSstoreInitGas, nil + } + if value == (common.Hash{}) { // delete slot (2.1.2b) + evm.StateDB.AddRefund(params.NetSstoreClearRefund) + } + return params.NetSstoreCleanGas, nil // write existing slot (2.1.2) + } + if original != (common.Hash{}) { + if current == (common.Hash{}) { // recreate slot (2.2.1.1) + evm.StateDB.SubRefund(params.NetSstoreClearRefund) + } else if value == (common.Hash{}) { // delete slot (2.2.1.2) + evm.StateDB.AddRefund(params.NetSstoreClearRefund) + } + } + if original == value { + if original == (common.Hash{}) { // reset to original inexistent slot (2.2.2.1) + evm.StateDB.AddRefund(params.NetSstoreResetClearRefund) + } else { // reset to original existing slot (2.2.2.2) + evm.StateDB.AddRefund(params.NetSstoreResetRefund) + } + } + return params.NetSstoreDirtyGas, nil +} + +// 0. If *gasleft* is less than or equal to 2300, fail the current call. +// 1. If current value equals new value (this is a no-op), SLOAD_GAS is deducted. +// 2. If current value does not equal new value: +// 2.1. If original value equals current value (this storage slot has not been changed by the current execution context): +// 2.1.1. If original value is 0, SSTORE_SET_GAS (20K) gas is deducted. +// 2.1.2. Otherwise, SSTORE_RESET_GAS gas is deducted. If new value is 0, add SSTORE_CLEARS_SCHEDULE to refund counter. +// 2.2. If original value does not equal current value (this storage slot is dirty), SLOAD_GAS gas is deducted. Apply both of the following clauses: +// 2.2.1. If original value is not 0: +// 2.2.1.1. If current value is 0 (also means that new value is not 0), subtract SSTORE_CLEARS_SCHEDULE gas from refund counter. +// 2.2.1.2. If new value is 0 (also means that current value is not 0), add SSTORE_CLEARS_SCHEDULE gas to refund counter. +// 2.2.2. If original value equals new value (this storage slot is reset): +// 2.2.2.1. If original value is 0, add SSTORE_SET_GAS - SLOAD_GAS to refund counter. +// 2.2.2.2. Otherwise, add SSTORE_RESET_GAS - SLOAD_GAS gas to refund counter. +func gasSStoreEIP2200(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { + // If we fail the minimum gas availability invariant, fail (0) + if contract.Gas <= params.SstoreSentryGasEIP2200 { + return 0, errors.New("not enough gas for reentrancy sentry") + } + // Gas sentry honoured, do the actual gas calculation based on the stored value + var ( + y, x = stack.Back(1), stack.Back(0) + current = evm.StateDB.GetState(contract.Address(), x.Bytes32()) + ) + value := common.Hash(y.Bytes32()) + + if current == value { // noop (1) + return params.SloadGasEIP2200, nil + } + original := evm.StateDB.GetCommittedState(contract.Address(), x.Bytes32()) + if original == current { + if original == (common.Hash{}) { // create slot (2.1.1) + return params.SstoreSetGasEIP2200, nil + } + if value == (common.Hash{}) { // delete slot (2.1.2b) + evm.StateDB.AddRefund(params.SstoreClearsScheduleRefundEIP2200) + } + return params.SstoreResetGasEIP2200, nil // write existing slot (2.1.2) + } + if original != (common.Hash{}) { + if current == (common.Hash{}) { // recreate slot (2.2.1.1) + evm.StateDB.SubRefund(params.SstoreClearsScheduleRefundEIP2200) + } else if value == (common.Hash{}) { // delete slot (2.2.1.2) + evm.StateDB.AddRefund(params.SstoreClearsScheduleRefundEIP2200) + } + } + if original == value { + if original == (common.Hash{}) { // reset to original inexistent slot (2.2.2.1) + evm.StateDB.AddRefund(params.SstoreSetGasEIP2200 - params.SloadGasEIP2200) + } else { // reset to original existing slot (2.2.2.2) + evm.StateDB.AddRefund(params.SstoreResetGasEIP2200 - params.SloadGasEIP2200) + } + } + return params.SloadGasEIP2200, nil // dirty update (2.2) +} + +func makeGasLog(n uint64) gasFunc { + return func(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { + requestedSize, overflow := stack.Back(1).Uint64WithOverflow() + if overflow { + return 0, ErrGasUintOverflow + } + + gas, err := memoryGasCost(mem, memorySize) + if err != nil { + return 0, err + } + + if gas, overflow = math.SafeAdd(gas, params.LogGas); overflow { + return 0, ErrGasUintOverflow + } + if gas, overflow = math.SafeAdd(gas, n*params.LogTopicGas); overflow { + return 0, ErrGasUintOverflow + } + + var memorySizeGas uint64 + if memorySizeGas, overflow = math.SafeMul(requestedSize, params.LogDataGas); overflow { + return 0, ErrGasUintOverflow + } + if gas, overflow = math.SafeAdd(gas, memorySizeGas); overflow { + return 0, ErrGasUintOverflow + } + return gas, nil + } +} + +func gasKeccak256(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { + gas, err := memoryGasCost(mem, memorySize) + if err != nil { + return 0, err + } + wordGas, overflow := stack.Back(1).Uint64WithOverflow() + if overflow { + return 0, ErrGasUintOverflow + } + if wordGas, overflow = math.SafeMul(toWordSize(wordGas), params.Keccak256WordGas); overflow { + return 0, ErrGasUintOverflow + } + if gas, overflow = math.SafeAdd(gas, wordGas); overflow { + return 0, ErrGasUintOverflow + } + return gas, nil +} + +// pureMemoryGascost is used by several operations, which aside from their +// static cost have a dynamic cost which is solely based on the memory +// expansion +func pureMemoryGascost(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { + return memoryGasCost(mem, memorySize) +} + +var ( + gasReturn = pureMemoryGascost + gasRevert = pureMemoryGascost + gasMLoad = pureMemoryGascost + gasMStore8 = pureMemoryGascost + gasMStore = pureMemoryGascost + gasCreate = pureMemoryGascost +) + +func gasCreate2(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { + gas, err := memoryGasCost(mem, memorySize) + if err != nil { + return 0, err + } + wordGas, overflow := stack.Back(2).Uint64WithOverflow() + if overflow { + return 0, ErrGasUintOverflow + } + if wordGas, overflow = math.SafeMul(toWordSize(wordGas), params.Keccak256WordGas); overflow { + return 0, ErrGasUintOverflow + } + if gas, overflow = math.SafeAdd(gas, wordGas); overflow { + return 0, ErrGasUintOverflow + } + return gas, nil +} + +func gasExpFrontier(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { + expByteLen := uint64((stack.Data[stack.Len()-2].BitLen() + 7) / 8) + + var ( + gas = expByteLen * params.ExpByteFrontier // no overflow check required. Max is 256 * ExpByte gas + overflow bool + ) + if gas, overflow = math.SafeAdd(gas, params.ExpGas); overflow { + return 0, ErrGasUintOverflow + } + return gas, nil +} + +func gasExpEIP158(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { + expByteLen := uint64((stack.Data[stack.Len()-2].BitLen() + 7) / 8) + + var ( + gas = expByteLen * params.ExpByteEIP158 // no overflow check required. Max is 256 * ExpByte gas + overflow bool + ) + if gas, overflow = math.SafeAdd(gas, params.ExpGas); overflow { + return 0, ErrGasUintOverflow + } + return gas, nil +} + +func gasCall(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { + var ( + gas uint64 + transfersValue = !stack.Back(2).IsZero() + address = common.Address(stack.Back(1).Bytes20()) + ) + if evm.chainRules.IsEIP158 { + if transfersValue && evm.StateDB.Empty(address) { + gas += params.CallNewAccountGas + } + } else if !evm.StateDB.Exist(address) { + gas += params.CallNewAccountGas + } + if transfersValue { + gas += params.CallValueTransferGas + } + memoryGas, err := memoryGasCost(mem, memorySize) + if err != nil { + return 0, err + } + var overflow bool + if gas, overflow = math.SafeAdd(gas, memoryGas); overflow { + return 0, ErrGasUintOverflow + } + + evm.callGasTemp, err = callGas(evm.chainRules.IsEIP150, contract.Gas, gas, stack.Back(0)) + if err != nil { + return 0, err + } + if gas, overflow = math.SafeAdd(gas, evm.callGasTemp); overflow { + return 0, ErrGasUintOverflow + } + return gas, nil +} + +func gasCallCode(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { + memoryGas, err := memoryGasCost(mem, memorySize) + if err != nil { + return 0, err + } + var ( + gas uint64 + overflow bool + ) + if stack.Back(2).Sign() != 0 { + gas += params.CallValueTransferGas + } + if gas, overflow = math.SafeAdd(gas, memoryGas); overflow { + return 0, ErrGasUintOverflow + } + evm.callGasTemp, err = callGas(evm.chainRules.IsEIP150, contract.Gas, gas, stack.Back(0)) + if err != nil { + return 0, err + } + if gas, overflow = math.SafeAdd(gas, evm.callGasTemp); overflow { + return 0, ErrGasUintOverflow + } + return gas, nil +} + +func gasDelegateCall(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { + gas, err := memoryGasCost(mem, memorySize) + if err != nil { + return 0, err + } + evm.callGasTemp, err = callGas(evm.chainRules.IsEIP150, contract.Gas, gas, stack.Back(0)) + if err != nil { + return 0, err + } + var overflow bool + if gas, overflow = math.SafeAdd(gas, evm.callGasTemp); overflow { + return 0, ErrGasUintOverflow + } + return gas, nil +} + +func gasStaticCall(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { + gas, err := memoryGasCost(mem, memorySize) + if err != nil { + return 0, err + } + evm.callGasTemp, err = callGas(evm.chainRules.IsEIP150, contract.Gas, gas, stack.Back(0)) + if err != nil { + return 0, err + } + var overflow bool + if gas, overflow = math.SafeAdd(gas, evm.callGasTemp); overflow { + return 0, ErrGasUintOverflow + } + return gas, nil +} + +func gasSelfdestruct(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { + var gas uint64 + // EIP150 homestead gas reprice fork: + if evm.chainRules.IsEIP150 { + gas = params.SelfdestructGasEIP150 + address := common.Address(stack.Back(0).Bytes20()) + + if evm.chainRules.IsEIP158 { + // if empty and transfers value + if evm.StateDB.Empty(address) && evm.StateDB.GetBalance(contract.Address()).Sign() != 0 { + gas += params.CreateBySelfdestructGas + } + } else if !evm.StateDB.Exist(address) { + gas += params.CreateBySelfdestructGas + } + } + + if !evm.StateDB.HasSuicided(contract.Address()) { + evm.StateDB.AddRefund(params.SelfdestructRefundGas) + } + return gas, nil +} diff --git a/x/evm/core/vm/gas_table_test.go b/x/evm/core/vm/gas_table_test.go new file mode 100644 index 0000000000..6cd126c9b4 --- /dev/null +++ b/x/evm/core/vm/gas_table_test.go @@ -0,0 +1,107 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package vm + +import ( + "math" + "math/big" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/params" +) + +func TestMemoryGasCost(t *testing.T) { + tests := []struct { + size uint64 + cost uint64 + overflow bool + }{ + {0x1fffffffe0, 36028809887088637, false}, + {0x1fffffffe1, 0, true}, + } + for i, tt := range tests { + v, err := memoryGasCost(&Memory{}, tt.size) + if (err == ErrGasUintOverflow) != tt.overflow { + t.Errorf("test %d: overflow mismatch: have %v, want %v", i, err == ErrGasUintOverflow, tt.overflow) + } + if v != tt.cost { + t.Errorf("test %d: gas cost mismatch: have %v, want %v", i, v, tt.cost) + } + } +} + +var eip2200Tests = []struct { + original byte + gaspool uint64 + input string + used uint64 + refund uint64 + failure error +}{ + {0, math.MaxUint64, "0x60006000556000600055", 1612, 0, nil}, // 0 -> 0 -> 0 + {0, math.MaxUint64, "0x60006000556001600055", 20812, 0, nil}, // 0 -> 0 -> 1 + {0, math.MaxUint64, "0x60016000556000600055", 20812, 19200, nil}, // 0 -> 1 -> 0 + {0, math.MaxUint64, "0x60016000556002600055", 20812, 0, nil}, // 0 -> 1 -> 2 + {0, math.MaxUint64, "0x60016000556001600055", 20812, 0, nil}, // 0 -> 1 -> 1 + {1, math.MaxUint64, "0x60006000556000600055", 5812, 15000, nil}, // 1 -> 0 -> 0 + {1, math.MaxUint64, "0x60006000556001600055", 5812, 4200, nil}, // 1 -> 0 -> 1 + {1, math.MaxUint64, "0x60006000556002600055", 5812, 0, nil}, // 1 -> 0 -> 2 + {1, math.MaxUint64, "0x60026000556000600055", 5812, 15000, nil}, // 1 -> 2 -> 0 + {1, math.MaxUint64, "0x60026000556003600055", 5812, 0, nil}, // 1 -> 2 -> 3 + {1, math.MaxUint64, "0x60026000556001600055", 5812, 4200, nil}, // 1 -> 2 -> 1 + {1, math.MaxUint64, "0x60026000556002600055", 5812, 0, nil}, // 1 -> 2 -> 2 + {1, math.MaxUint64, "0x60016000556000600055", 5812, 15000, nil}, // 1 -> 1 -> 0 + {1, math.MaxUint64, "0x60016000556002600055", 5812, 0, nil}, // 1 -> 1 -> 2 + {1, math.MaxUint64, "0x60016000556001600055", 1612, 0, nil}, // 1 -> 1 -> 1 + {0, math.MaxUint64, "0x600160005560006000556001600055", 40818, 19200, nil}, // 0 -> 1 -> 0 -> 1 + {1, math.MaxUint64, "0x600060005560016000556000600055", 10818, 19200, nil}, // 1 -> 0 -> 1 -> 0 + {1, 2306, "0x6001600055", 2306, 0, ErrOutOfGas}, // 1 -> 1 (2300 sentry + 2xPUSH) + {1, 2307, "0x6001600055", 806, 0, nil}, // 1 -> 1 (2301 sentry + 2xPUSH) +} + +func TestEIP2200(t *testing.T) { + for i, tt := range eip2200Tests { + address := common.BytesToAddress([]byte("contract")) + + statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + statedb.CreateAccount(address) + statedb.SetCode(address, hexutil.MustDecode(tt.input)) + statedb.SetState(address, common.Hash{}, common.BytesToHash([]byte{tt.original})) + statedb.Finalise(true) // Push the state into the "original" slot + + vmctx := BlockContext{ + CanTransfer: func(StateDB, common.Address, *big.Int) bool { return true }, + Transfer: func(StateDB, common.Address, common.Address, *big.Int) {}, + } + vmenv := NewEVM(vmctx, TxContext{}, statedb, params.AllEthashProtocolChanges, Config{ExtraEips: []int{2200}}) + + _, gas, err := vmenv.Call(AccountRef(common.Address{}), address, nil, tt.gaspool, new(big.Int)) + if err != tt.failure { + t.Errorf("test %d: failure mismatch: have %v, want %v", i, err, tt.failure) + } + if used := tt.gaspool - gas; used != tt.used { + t.Errorf("test %d: gas used mismatch: have %v, want %v", i, used, tt.used) + } + if refund := vmenv.StateDB.GetRefund(); refund != tt.refund { + t.Errorf("test %d: gas refund mismatch: have %v, want %v", i, refund, tt.refund) + } + } +} diff --git a/x/evm/core/vm/instructions.go b/x/evm/core/vm/instructions.go new file mode 100644 index 0000000000..46409ce63d --- /dev/null +++ b/x/evm/core/vm/instructions.go @@ -0,0 +1,934 @@ +// Copyright 2015 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package vm + +import ( + "sync/atomic" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/params" + "github.com/holiman/uint256" + "golang.org/x/crypto/sha3" +) + +func opAdd(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x, y := scope.Stack.Pop(), scope.Stack.Peek() + y.Add(&x, y) + return nil, nil +} + +func opSub(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x, y := scope.Stack.Pop(), scope.Stack.Peek() + y.Sub(&x, y) + return nil, nil +} + +func opMul(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x, y := scope.Stack.Pop(), scope.Stack.Peek() + y.Mul(&x, y) + return nil, nil +} + +func opDiv(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x, y := scope.Stack.Pop(), scope.Stack.Peek() + y.Div(&x, y) + return nil, nil +} + +func opSdiv(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x, y := scope.Stack.Pop(), scope.Stack.Peek() + y.SDiv(&x, y) + return nil, nil +} + +func opMod(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x, y := scope.Stack.Pop(), scope.Stack.Peek() + y.Mod(&x, y) + return nil, nil +} + +func opSmod(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x, y := scope.Stack.Pop(), scope.Stack.Peek() + y.SMod(&x, y) + return nil, nil +} + +func opExp(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + base, exponent := scope.Stack.Pop(), scope.Stack.Peek() + exponent.Exp(&base, exponent) + return nil, nil +} + +func opSignExtend(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + back, num := scope.Stack.Pop(), scope.Stack.Peek() + num.ExtendSign(num, &back) + return nil, nil +} + +func opNot(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x := scope.Stack.Peek() + x.Not(x) + return nil, nil +} + +func opLt(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x, y := scope.Stack.Pop(), scope.Stack.Peek() + if x.Lt(y) { + y.SetOne() + } else { + y.Clear() + } + return nil, nil +} + +func opGt(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x, y := scope.Stack.Pop(), scope.Stack.Peek() + if x.Gt(y) { + y.SetOne() + } else { + y.Clear() + } + return nil, nil +} + +func opSlt(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x, y := scope.Stack.Pop(), scope.Stack.Peek() + if x.Slt(y) { + y.SetOne() + } else { + y.Clear() + } + return nil, nil +} + +func opSgt(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x, y := scope.Stack.Pop(), scope.Stack.Peek() + if x.Sgt(y) { + y.SetOne() + } else { + y.Clear() + } + return nil, nil +} + +func opEq(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x, y := scope.Stack.Pop(), scope.Stack.Peek() + if x.Eq(y) { + y.SetOne() + } else { + y.Clear() + } + return nil, nil +} + +func opIszero(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x := scope.Stack.Peek() + if x.IsZero() { + x.SetOne() + } else { + x.Clear() + } + return nil, nil +} + +func opAnd(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x, y := scope.Stack.Pop(), scope.Stack.Peek() + y.And(&x, y) + return nil, nil +} + +func opOr(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x, y := scope.Stack.Pop(), scope.Stack.Peek() + y.Or(&x, y) + return nil, nil +} + +func opXor(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x, y := scope.Stack.Pop(), scope.Stack.Peek() + y.Xor(&x, y) + return nil, nil +} + +func opByte(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + th, val := scope.Stack.Pop(), scope.Stack.Peek() + val.Byte(&th) + return nil, nil +} + +func opAddmod(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x, y, z := scope.Stack.Pop(), scope.Stack.Pop(), scope.Stack.Peek() + if z.IsZero() { + z.Clear() + } else { + z.AddMod(&x, &y, z) + } + return nil, nil +} + +func opMulmod(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x, y, z := scope.Stack.Pop(), scope.Stack.Pop(), scope.Stack.Peek() + z.MulMod(&x, &y, z) + return nil, nil +} + +// opSHL implements Shift Left +// The SHL instruction (shift left) pops 2 values from the stack, first arg1 and then arg2, +// and pushes on the stack arg2 shifted to the left by arg1 number of bits. +func opSHL(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + // Note, second operand is left in the stack; accumulate result into it, and no need to push it afterwards + shift, value := scope.Stack.Pop(), scope.Stack.Peek() + if shift.LtUint64(256) { + value.Lsh(value, uint(shift.Uint64())) + } else { + value.Clear() + } + return nil, nil +} + +// opSHR implements Logical Shift Right +// The SHR instruction (logical shift right) pops 2 values from the stack, first arg1 and then arg2, +// and pushes on the stack arg2 shifted to the right by arg1 number of bits with zero fill. +func opSHR(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + // Note, second operand is left in the stack; accumulate result into it, and no need to push it afterwards + shift, value := scope.Stack.Pop(), scope.Stack.Peek() + if shift.LtUint64(256) { + value.Rsh(value, uint(shift.Uint64())) + } else { + value.Clear() + } + return nil, nil +} + +// opSAR implements Arithmetic Shift Right +// The SAR instruction (arithmetic shift right) pops 2 values from the stack, first arg1 and then arg2, +// and pushes on the stack arg2 shifted to the right by arg1 number of bits with sign extension. +func opSAR(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + shift, value := scope.Stack.Pop(), scope.Stack.Peek() + if shift.GtUint64(256) { + if value.Sign() >= 0 { + value.Clear() + } else { + // Max negative shift: all bits set + value.SetAllOne() + } + return nil, nil + } + n := uint(shift.Uint64()) + value.SRsh(value, n) + return nil, nil +} + +func opKeccak256(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + offset, size := scope.Stack.Pop(), scope.Stack.Peek() + data := scope.Memory.GetPtr(int64(offset.Uint64()), int64(size.Uint64())) + + if interpreter.hasher == nil { + interpreter.hasher = sha3.NewLegacyKeccak256().(keccakState) + } else { + interpreter.hasher.Reset() + } + interpreter.hasher.Write(data) + interpreter.hasher.Read(interpreter.hasherBuf[:]) + + evm := interpreter.evm + if evm.Config.EnablePreimageRecording { + evm.StateDB.AddPreimage(interpreter.hasherBuf, data) + } + + size.SetBytes(interpreter.hasherBuf[:]) + return nil, nil +} + +func opAddress(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + scope.Stack.Push(new(uint256.Int).SetBytes(scope.Contract.Address().Bytes())) + return nil, nil +} + +func opBalance(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + slot := scope.Stack.Peek() + address := common.Address(slot.Bytes20()) + slot.SetFromBig(interpreter.evm.StateDB.GetBalance(address)) + return nil, nil +} + +func opOrigin(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + scope.Stack.Push(new(uint256.Int).SetBytes(interpreter.evm.Origin.Bytes())) + return nil, nil +} + +func opCaller(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + scope.Stack.Push(new(uint256.Int).SetBytes(scope.Contract.Caller().Bytes())) + return nil, nil +} + +func opCallValue(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + v, _ := uint256.FromBig(scope.Contract.value) + scope.Stack.Push(v) + return nil, nil +} + +func opCallDataLoad(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x := scope.Stack.Peek() + if offset, overflow := x.Uint64WithOverflow(); !overflow { + data := getData(scope.Contract.Input, offset, 32) + x.SetBytes(data) + } else { + x.Clear() + } + return nil, nil +} + +func opCallDataSize(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + scope.Stack.Push(new(uint256.Int).SetUint64(uint64(len(scope.Contract.Input)))) + return nil, nil +} + +func opCallDataCopy(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + var ( + memOffset = scope.Stack.Pop() + dataOffset = scope.Stack.Pop() + length = scope.Stack.Pop() + ) + dataOffset64, overflow := dataOffset.Uint64WithOverflow() + if overflow { + dataOffset64 = 0xffffffffffffffff + } + // These values are checked for overflow during gas cost calculation + memOffset64 := memOffset.Uint64() + length64 := length.Uint64() + scope.Memory.Set(memOffset64, length64, getData(scope.Contract.Input, dataOffset64, length64)) + + return nil, nil +} + +func opReturnDataSize(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + scope.Stack.Push(new(uint256.Int).SetUint64(uint64(len(interpreter.returnData)))) + return nil, nil +} + +func opReturnDataCopy(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + var ( + memOffset = scope.Stack.Pop() + dataOffset = scope.Stack.Pop() + length = scope.Stack.Pop() + ) + + offset64, overflow := dataOffset.Uint64WithOverflow() + if overflow { + return nil, ErrReturnDataOutOfBounds + } + // we can reuse dataOffset now (aliasing it for clarity) + end := dataOffset + end.Add(&dataOffset, &length) + end64, overflow := end.Uint64WithOverflow() + if overflow || uint64(len(interpreter.returnData)) < end64 { + return nil, ErrReturnDataOutOfBounds + } + scope.Memory.Set(memOffset.Uint64(), length.Uint64(), interpreter.returnData[offset64:end64]) + return nil, nil +} + +func opExtCodeSize(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + slot := scope.Stack.Peek() + slot.SetUint64(uint64(interpreter.evm.StateDB.GetCodeSize(slot.Bytes20()))) + return nil, nil +} + +func opCodeSize(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + l := new(uint256.Int) + l.SetUint64(uint64(len(scope.Contract.Code))) + scope.Stack.Push(l) + return nil, nil +} + +func opCodeCopy(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + var ( + memOffset = scope.Stack.Pop() + codeOffset = scope.Stack.Pop() + length = scope.Stack.Pop() + ) + uint64CodeOffset, overflow := codeOffset.Uint64WithOverflow() + if overflow { + uint64CodeOffset = 0xffffffffffffffff + } + codeCopy := getData(scope.Contract.Code, uint64CodeOffset, length.Uint64()) + scope.Memory.Set(memOffset.Uint64(), length.Uint64(), codeCopy) + + return nil, nil +} + +func opExtCodeCopy(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + var ( + stack = scope.Stack + a = stack.Pop() + memOffset = stack.Pop() + codeOffset = stack.Pop() + length = stack.Pop() + ) + uint64CodeOffset, overflow := codeOffset.Uint64WithOverflow() + if overflow { + uint64CodeOffset = 0xffffffffffffffff + } + addr := common.Address(a.Bytes20()) + codeCopy := getData(interpreter.evm.StateDB.GetCode(addr), uint64CodeOffset, length.Uint64()) + scope.Memory.Set(memOffset.Uint64(), length.Uint64(), codeCopy) + + return nil, nil +} + +// opExtCodeHash returns the code hash of a specified account. +// There are several cases when the function is called, while we can relay everything +// to `state.GetCodeHash` function to ensure the correctness. +// +// (1) Caller tries to get the code hash of a normal contract account, state +// +// should return the relative code hash and set it as the result. +// +// (2) Caller tries to get the code hash of a non-existent account, state should +// +// return common.Hash{} and zero will be set as the result. +// +// (3) Caller tries to get the code hash for an account without contract code, +// +// state should return emptyCodeHash(0xc5d246...) as the result. +// +// (4) Caller tries to get the code hash of a precompiled account, the result +// +// should be zero or emptyCodeHash. +// +// It is worth noting that in order to avoid unnecessary create and clean, +// all precompile accounts on mainnet have been transferred 1 wei, so the return +// here should be emptyCodeHash. +// If the precompile account is not transferred any amount on a private or +// customized chain, the return value will be zero. +// +// (5) Caller tries to get the code hash for an account which is marked as suicided +// +// in the current transaction, the code hash of this account should be returned. +// +// (6) Caller tries to get the code hash for an account which is marked as deleted, +// +// this account should be regarded as a non-existent account and zero should be returned. +func opExtCodeHash(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + slot := scope.Stack.Peek() + address := common.Address(slot.Bytes20()) + if interpreter.evm.StateDB.Empty(address) { + slot.Clear() + } else { + slot.SetBytes(interpreter.evm.StateDB.GetCodeHash(address).Bytes()) + } + return nil, nil +} + +func opGasprice(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + v, _ := uint256.FromBig(interpreter.evm.GasPrice) + scope.Stack.Push(v) + return nil, nil +} + +func opBlockhash(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + num := scope.Stack.Peek() + num64, overflow := num.Uint64WithOverflow() + if overflow { + num.Clear() + return nil, nil + } + var upper, lower uint64 + upper = interpreter.evm.Context.BlockNumber.Uint64() + if upper < 257 { + lower = 0 + } else { + lower = upper - 256 + } + if num64 >= lower && num64 < upper { + num.SetBytes(interpreter.evm.Context.GetHash(num64).Bytes()) + } else { + num.Clear() + } + return nil, nil +} + +func opCoinbase(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + scope.Stack.Push(new(uint256.Int).SetBytes(interpreter.evm.Context.Coinbase.Bytes())) + return nil, nil +} + +func opTimestamp(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + v, _ := uint256.FromBig(interpreter.evm.Context.Time) + scope.Stack.Push(v) + return nil, nil +} + +func opNumber(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + v, _ := uint256.FromBig(interpreter.evm.Context.BlockNumber) + scope.Stack.Push(v) + return nil, nil +} + +func opDifficulty(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + v, _ := uint256.FromBig(interpreter.evm.Context.Difficulty) + scope.Stack.Push(v) + return nil, nil +} + +func opRandom(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + v := new(uint256.Int).SetBytes(interpreter.evm.Context.Random.Bytes()) + scope.Stack.Push(v) + return nil, nil +} + +func opGasLimit(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + scope.Stack.Push(new(uint256.Int).SetUint64(interpreter.evm.Context.GasLimit)) + return nil, nil +} + +func opPop(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + scope.Stack.Pop() + return nil, nil +} + +func opMload(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + v := scope.Stack.Peek() + offset := int64(v.Uint64()) + v.SetBytes(scope.Memory.GetPtr(offset, 32)) + return nil, nil +} + +func opMstore(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + // pop value of the stack + mStart, val := scope.Stack.Pop(), scope.Stack.Pop() + scope.Memory.Set32(mStart.Uint64(), &val) + return nil, nil +} + +func opMstore8(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + off, val := scope.Stack.Pop(), scope.Stack.Pop() + scope.Memory.store[off.Uint64()] = byte(val.Uint64()) + return nil, nil +} + +func opSload(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + loc := scope.Stack.Peek() + hash := common.Hash(loc.Bytes32()) + val := interpreter.evm.StateDB.GetState(scope.Contract.Address(), hash) + loc.SetBytes(val.Bytes()) + return nil, nil +} + +func opSstore(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + if interpreter.readOnly { + return nil, ErrWriteProtection + } + loc := scope.Stack.Pop() + val := scope.Stack.Pop() + interpreter.evm.StateDB.SetState(scope.Contract.Address(), loc.Bytes32(), val.Bytes32()) + return nil, nil +} + +func opJump(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + if atomic.LoadInt32(&interpreter.evm.abort) != 0 { + return nil, errStopToken + } + pos := scope.Stack.Pop() + if !scope.Contract.validJumpdest(&pos) { + return nil, ErrInvalidJump + } + *pc = pos.Uint64() - 1 // pc will be increased by the interpreter loop + return nil, nil +} + +func opJumpi(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + if atomic.LoadInt32(&interpreter.evm.abort) != 0 { + return nil, errStopToken + } + pos, cond := scope.Stack.Pop(), scope.Stack.Pop() + if !cond.IsZero() { + if !scope.Contract.validJumpdest(&pos) { + return nil, ErrInvalidJump + } + *pc = pos.Uint64() - 1 // pc will be increased by the interpreter loop + } + return nil, nil +} + +func opJumpdest(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + return nil, nil +} + +func opPc(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + scope.Stack.Push(new(uint256.Int).SetUint64(*pc)) + return nil, nil +} + +func opMsize(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + scope.Stack.Push(new(uint256.Int).SetUint64(uint64(scope.Memory.Len()))) + return nil, nil +} + +func opGas(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + scope.Stack.Push(new(uint256.Int).SetUint64(scope.Contract.Gas)) + return nil, nil +} + +func opCreate(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + if interpreter.readOnly { + return nil, ErrWriteProtection + } + var ( + value = scope.Stack.Pop() + offset, size = scope.Stack.Pop(), scope.Stack.Pop() + input = scope.Memory.GetCopy(int64(offset.Uint64()), int64(size.Uint64())) + gas = scope.Contract.Gas + ) + if interpreter.evm.chainRules.IsEIP150 { + gas -= gas / 64 + } + // reuse size int for stackvalue + stackvalue := size + + scope.Contract.UseGas(gas) + // TODO: use uint256.Int instead of converting with toBig() + bigVal := big0 + if !value.IsZero() { + bigVal = value.ToBig() + } + + res, addr, returnGas, suberr := interpreter.evm.Create(scope.Contract, input, gas, bigVal) + // Push item on the stack based on the returned error. If the ruleset is + // homestead we must check for CodeStoreOutOfGasError (homestead only + // rule) and treat as an error, if the ruleset is frontier we must + // ignore this error and pretend the operation was successful. + if interpreter.evm.chainRules.IsHomestead && suberr == ErrCodeStoreOutOfGas { + stackvalue.Clear() + } else if suberr != nil && suberr != ErrCodeStoreOutOfGas { + stackvalue.Clear() + } else { + stackvalue.SetBytes(addr.Bytes()) + } + scope.Stack.Push(&stackvalue) + scope.Contract.Gas += returnGas + + if suberr == ErrExecutionReverted { + interpreter.returnData = res // set REVERT data to return data buffer + return res, nil + } + interpreter.returnData = nil // clear dirty return data buffer + return nil, nil +} + +func opCreate2(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + if interpreter.readOnly { + return nil, ErrWriteProtection + } + var ( + endowment = scope.Stack.Pop() + offset, size = scope.Stack.Pop(), scope.Stack.Pop() + salt = scope.Stack.Pop() + input = scope.Memory.GetCopy(int64(offset.Uint64()), int64(size.Uint64())) + gas = scope.Contract.Gas + ) + + // Apply EIP150 + gas -= gas / 64 + scope.Contract.UseGas(gas) + // reuse size int for stackvalue + stackvalue := size + // TODO: use uint256.Int instead of converting with toBig() + bigEndowment := big0 + if !endowment.IsZero() { + bigEndowment = endowment.ToBig() + } + res, addr, returnGas, suberr := interpreter.evm.Create2(scope.Contract, input, gas, + bigEndowment, &salt) + // Push item on the stack based on the returned error. + if suberr != nil { + stackvalue.Clear() + } else { + stackvalue.SetBytes(addr.Bytes()) + } + scope.Stack.Push(&stackvalue) + scope.Contract.Gas += returnGas + + if suberr == ErrExecutionReverted { + interpreter.returnData = res // set REVERT data to return data buffer + return res, nil + } + interpreter.returnData = nil // clear dirty return data buffer + return nil, nil +} + +func opCall(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + stack := scope.Stack + // Pop gas. The actual gas in interpreter.evm.callGasTemp. + // We can use this as a temporary value + temp := stack.Pop() + gas := interpreter.evm.callGasTemp + // Pop other call parameters. + addr, value, inOffset, inSize, retOffset, retSize := stack.Pop(), stack.Pop(), stack.Pop(), stack.Pop(), stack.Pop(), stack.Pop() + toAddr := common.Address(addr.Bytes20()) + // Get the arguments from the memory. + args := scope.Memory.GetPtr(int64(inOffset.Uint64()), int64(inSize.Uint64())) + + if interpreter.readOnly && !value.IsZero() { + return nil, ErrWriteProtection + } + bigVal := big0 + // TODO: use uint256.Int instead of converting with toBig() + // By using big0 here, we save an alloc for the most common case (non-ether-transferring contract calls), + // but it would make more sense to extend the usage of uint256.Int + if !value.IsZero() { + gas += params.CallStipend + bigVal = value.ToBig() + } + + ret, returnGas, err := interpreter.evm.Call(scope.Contract, toAddr, args, gas, bigVal) + + if err != nil { + temp.Clear() + } else { + temp.SetOne() + } + stack.Push(&temp) + if err == nil || err == ErrExecutionReverted { + ret = common.CopyBytes(ret) + scope.Memory.Set(retOffset.Uint64(), retSize.Uint64(), ret) + } + scope.Contract.Gas += returnGas + + interpreter.returnData = ret + return ret, nil +} + +func opCallCode(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + // Pop gas. The actual gas is in interpreter.evm.callGasTemp. + stack := scope.Stack + // We use it as a temporary value + temp := stack.Pop() + gas := interpreter.evm.callGasTemp + // Pop other call parameters. + addr, value, inOffset, inSize, retOffset, retSize := stack.Pop(), stack.Pop(), stack.Pop(), stack.Pop(), stack.Pop(), stack.Pop() + toAddr := common.Address(addr.Bytes20()) + // Get arguments from the memory. + args := scope.Memory.GetPtr(int64(inOffset.Uint64()), int64(inSize.Uint64())) + + // TODO: use uint256.Int instead of converting with toBig() + bigVal := big0 + if !value.IsZero() { + gas += params.CallStipend + bigVal = value.ToBig() + } + + ret, returnGas, err := interpreter.evm.CallCode(scope.Contract, toAddr, args, gas, bigVal) + if err != nil { + temp.Clear() + } else { + temp.SetOne() + } + stack.Push(&temp) + if err == nil || err == ErrExecutionReverted { + ret = common.CopyBytes(ret) + scope.Memory.Set(retOffset.Uint64(), retSize.Uint64(), ret) + } + scope.Contract.Gas += returnGas + + interpreter.returnData = ret + return ret, nil +} + +func opDelegateCall(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + stack := scope.Stack + // Pop gas. The actual gas is in interpreter.evm.callGasTemp. + // We use it as a temporary value + temp := stack.Pop() + gas := interpreter.evm.callGasTemp + // Pop other call parameters. + addr, inOffset, inSize, retOffset, retSize := stack.Pop(), stack.Pop(), stack.Pop(), stack.Pop(), stack.Pop() + toAddr := common.Address(addr.Bytes20()) + // Get arguments from the memory. + args := scope.Memory.GetPtr(int64(inOffset.Uint64()), int64(inSize.Uint64())) + + ret, returnGas, err := interpreter.evm.DelegateCall(scope.Contract, toAddr, args, gas) + if err != nil { + temp.Clear() + } else { + temp.SetOne() + } + stack.Push(&temp) + if err == nil || err == ErrExecutionReverted { + ret = common.CopyBytes(ret) + scope.Memory.Set(retOffset.Uint64(), retSize.Uint64(), ret) + } + scope.Contract.Gas += returnGas + + interpreter.returnData = ret + return ret, nil +} + +func opStaticCall(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + // Pop gas. The actual gas is in interpreter.evm.callGasTemp. + stack := scope.Stack + // We use it as a temporary value + temp := stack.Pop() + gas := interpreter.evm.callGasTemp + // Pop other call parameters. + addr, inOffset, inSize, retOffset, retSize := stack.Pop(), stack.Pop(), stack.Pop(), stack.Pop(), stack.Pop() + toAddr := common.Address(addr.Bytes20()) + // Get arguments from the memory. + args := scope.Memory.GetPtr(int64(inOffset.Uint64()), int64(inSize.Uint64())) + + ret, returnGas, err := interpreter.evm.StaticCall(scope.Contract, toAddr, args, gas) + if err != nil { + temp.Clear() + } else { + temp.SetOne() + } + stack.Push(&temp) + if err == nil || err == ErrExecutionReverted { + ret = common.CopyBytes(ret) + scope.Memory.Set(retOffset.Uint64(), retSize.Uint64(), ret) + } + scope.Contract.Gas += returnGas + + interpreter.returnData = ret + return ret, nil +} + +func opReturn(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + offset, size := scope.Stack.Pop(), scope.Stack.Pop() + ret := scope.Memory.GetPtr(int64(offset.Uint64()), int64(size.Uint64())) + + return ret, errStopToken +} + +func opRevert(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + offset, size := scope.Stack.Pop(), scope.Stack.Pop() + ret := scope.Memory.GetPtr(int64(offset.Uint64()), int64(size.Uint64())) + + interpreter.returnData = ret + return ret, ErrExecutionReverted +} + +func opUndefined(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + return nil, &ErrInvalidOpCode{opcode: OpCode(scope.Contract.Code[*pc])} +} + +func opStop(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + return nil, errStopToken +} + +func opSelfdestruct(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + if interpreter.readOnly { + return nil, ErrWriteProtection + } + beneficiary := scope.Stack.Pop() + balance := interpreter.evm.StateDB.GetBalance(scope.Contract.Address()) + interpreter.evm.StateDB.AddBalance(beneficiary.Bytes20(), balance) + interpreter.evm.StateDB.Suicide(scope.Contract.Address()) + if interpreter.cfg.Debug { + interpreter.cfg.Tracer.CaptureEnter(SELFDESTRUCT, scope.Contract.Address(), beneficiary.Bytes20(), []byte{}, 0, balance) + interpreter.cfg.Tracer.CaptureExit([]byte{}, 0, nil) + } + return nil, errStopToken +} + +// following functions are used by the instruction jump table + +// make log instruction function +func makeLog(size int) executionFunc { + return func(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + if interpreter.readOnly { + return nil, ErrWriteProtection + } + topics := make([]common.Hash, size) + stack := scope.Stack + mStart, mSize := stack.Pop(), stack.Pop() + for i := 0; i < size; i++ { + addr := stack.Pop() + topics[i] = addr.Bytes32() + } + + d := scope.Memory.GetCopy(int64(mStart.Uint64()), int64(mSize.Uint64())) + interpreter.evm.StateDB.AddLog(&types.Log{ + Address: scope.Contract.Address(), + Topics: topics, + Data: d, + // This is a non-consensus field, but assigned here because + // core/state doesn't know the current block number. + BlockNumber: interpreter.evm.Context.BlockNumber.Uint64(), + }) + + return nil, nil + } +} + +// opPush1 is a specialized version of pushN +func opPush1(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + var ( + codeLen = uint64(len(scope.Contract.Code)) + integer = new(uint256.Int) + ) + *pc += 1 + if *pc < codeLen { + scope.Stack.Push(integer.SetUint64(uint64(scope.Contract.Code[*pc]))) + } else { + scope.Stack.Push(integer.Clear()) + } + return nil, nil +} + +// make push instruction function +func makePush(size uint64, pushByteSize int) executionFunc { + return func(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + codeLen := len(scope.Contract.Code) + + startMin := codeLen + if int(*pc+1) < startMin { + startMin = int(*pc + 1) + } + + endMin := codeLen + if startMin+pushByteSize < endMin { + endMin = startMin + pushByteSize + } + + integer := new(uint256.Int) + scope.Stack.Push(integer.SetBytes(common.RightPadBytes( + scope.Contract.Code[startMin:endMin], pushByteSize))) + + *pc += size + return nil, nil + } +} + +// make dup instruction function +func makeDup(size int64) executionFunc { + return func(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + scope.Stack.Dup(int(size)) + return nil, nil + } +} + +// make swap instruction function +func makeSwap(size int64) executionFunc { + // switch n + 1 otherwise n would be swapped with n + size++ + return func(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + scope.Stack.Swap(int(size)) + return nil, nil + } +} diff --git a/x/evm/core/vm/instructions_test.go b/x/evm/core/vm/instructions_test.go new file mode 100644 index 0000000000..30406b66f1 --- /dev/null +++ b/x/evm/core/vm/instructions_test.go @@ -0,0 +1,716 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package vm + +import ( + "bytes" + "encoding/json" + "fmt" + "math/big" + "os" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/params" + "github.com/holiman/uint256" +) + +type TwoOperandTestcase struct { + X string + Y string + Expected string +} + +type twoOperandParams struct { + x string + y string +} + +var ( + alphabetSoup = "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" + commonParams []*twoOperandParams + twoOpMethods map[string]executionFunc +) + +func init() { + // Params is a list of common edgecases that should be used for some common tests + params := []string{ + "0000000000000000000000000000000000000000000000000000000000000000", // 0 + "0000000000000000000000000000000000000000000000000000000000000001", // +1 + "0000000000000000000000000000000000000000000000000000000000000005", // +5 + "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe", // + max -1 + "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", // + max + "8000000000000000000000000000000000000000000000000000000000000000", // - max + "8000000000000000000000000000000000000000000000000000000000000001", // - max+1 + "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb", // - 5 + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", // - 1 + } + // Params are combined so each param is used on each 'side' + commonParams = make([]*twoOperandParams, len(params)*len(params)) + for i, x := range params { + for j, y := range params { + commonParams[i*len(params)+j] = &twoOperandParams{x, y} + } + } + twoOpMethods = map[string]executionFunc{ + "add": opAdd, + "sub": opSub, + "mul": opMul, + "div": opDiv, + "sdiv": opSdiv, + "mod": opMod, + "smod": opSmod, + "exp": opExp, + "signext": opSignExtend, + "lt": opLt, + "gt": opGt, + "slt": opSlt, + "sgt": opSgt, + "eq": opEq, + "and": opAnd, + "or": opOr, + "xor": opXor, + "byte": opByte, + "shl": opSHL, + "shr": opSHR, + "sar": opSAR, + } +} + +func testTwoOperandOp(t *testing.T, tests []TwoOperandTestcase, opFn executionFunc, name string) { + var ( + env = NewEVM(BlockContext{}, TxContext{}, nil, params.TestChainConfig, Config{}) + stack, err = NewStack() + pc = uint64(0) + interpreter = env.interpreter + ) + + require.NoError(t, err) + + for i, test := range tests { + x := new(uint256.Int).SetBytes(common.Hex2Bytes(test.X)) + y := new(uint256.Int).SetBytes(common.Hex2Bytes(test.Y)) + expected := new(uint256.Int).SetBytes(common.Hex2Bytes(test.Expected)) + stack.Push(x) + stack.Push(y) + opFn(&pc, interpreter.(*EVMInterpreter), &ScopeContext{nil, stack, nil}) + if len(stack.Data) != 1 { + t.Errorf("Expected one item on stack after %v, got %d: ", name, len(stack.Data)) + } + actual := stack.Pop() + + if actual.Cmp(expected) != 0 { + t.Errorf("Testcase %v %d, %v(%x, %x): expected %x, got %x", name, i, name, x, y, expected, actual) + } + } +} + +func TestByteOp(t *testing.T) { + tests := []TwoOperandTestcase{ + {"ABCDEF0908070605040302010000000000000000000000000000000000000000", "00", "AB"}, + {"ABCDEF0908070605040302010000000000000000000000000000000000000000", "01", "CD"}, + {"00CDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff", "00", "00"}, + {"00CDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff", "01", "CD"}, + {"0000000000000000000000000000000000000000000000000000000000102030", "1F", "30"}, + {"0000000000000000000000000000000000000000000000000000000000102030", "1E", "20"}, + {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "20", "00"}, + {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "FFFFFFFFFFFFFFFF", "00"}, + } + testTwoOperandOp(t, tests, opByte, "byte") +} + +func TestSHL(t *testing.T) { + // Testcases from https://github.com/ethereum/EIPs/blob/master/EIPS/eip-145.md#shl-shift-left + tests := []TwoOperandTestcase{ + {"0000000000000000000000000000000000000000000000000000000000000001", "01", "0000000000000000000000000000000000000000000000000000000000000002"}, + {"0000000000000000000000000000000000000000000000000000000000000001", "ff", "8000000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000001", "0100", "0000000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000001", "0101", "0000000000000000000000000000000000000000000000000000000000000000"}, + {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "00", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}, + {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "01", "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"}, + {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "ff", "8000000000000000000000000000000000000000000000000000000000000000"}, + {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0100", "0000000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000000", "01", "0000000000000000000000000000000000000000000000000000000000000000"}, + {"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "01", "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"}, + } + testTwoOperandOp(t, tests, opSHL, "shl") +} + +func TestSHR(t *testing.T) { + // Testcases from https://github.com/ethereum/EIPs/blob/master/EIPS/eip-145.md#shr-logical-shift-right + tests := []TwoOperandTestcase{ + {"0000000000000000000000000000000000000000000000000000000000000001", "00", "0000000000000000000000000000000000000000000000000000000000000001"}, + {"0000000000000000000000000000000000000000000000000000000000000001", "01", "0000000000000000000000000000000000000000000000000000000000000000"}, + {"8000000000000000000000000000000000000000000000000000000000000000", "01", "4000000000000000000000000000000000000000000000000000000000000000"}, + {"8000000000000000000000000000000000000000000000000000000000000000", "ff", "0000000000000000000000000000000000000000000000000000000000000001"}, + {"8000000000000000000000000000000000000000000000000000000000000000", "0100", "0000000000000000000000000000000000000000000000000000000000000000"}, + {"8000000000000000000000000000000000000000000000000000000000000000", "0101", "0000000000000000000000000000000000000000000000000000000000000000"}, + {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "00", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}, + {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "01", "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}, + {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "ff", "0000000000000000000000000000000000000000000000000000000000000001"}, + {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0100", "0000000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000000", "01", "0000000000000000000000000000000000000000000000000000000000000000"}, + } + testTwoOperandOp(t, tests, opSHR, "shr") +} + +func TestSAR(t *testing.T) { + // Testcases from https://github.com/ethereum/EIPs/blob/master/EIPS/eip-145.md#sar-arithmetic-shift-right + tests := []TwoOperandTestcase{ + {"0000000000000000000000000000000000000000000000000000000000000001", "00", "0000000000000000000000000000000000000000000000000000000000000001"}, + {"0000000000000000000000000000000000000000000000000000000000000001", "01", "0000000000000000000000000000000000000000000000000000000000000000"}, + {"8000000000000000000000000000000000000000000000000000000000000000", "01", "c000000000000000000000000000000000000000000000000000000000000000"}, + {"8000000000000000000000000000000000000000000000000000000000000000", "ff", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}, + {"8000000000000000000000000000000000000000000000000000000000000000", "0100", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}, + {"8000000000000000000000000000000000000000000000000000000000000000", "0101", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}, + {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "00", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}, + {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "01", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}, + {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "ff", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}, + {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0100", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}, + {"0000000000000000000000000000000000000000000000000000000000000000", "01", "0000000000000000000000000000000000000000000000000000000000000000"}, + {"4000000000000000000000000000000000000000000000000000000000000000", "fe", "0000000000000000000000000000000000000000000000000000000000000001"}, + {"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "f8", "000000000000000000000000000000000000000000000000000000000000007f"}, + {"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "fe", "0000000000000000000000000000000000000000000000000000000000000001"}, + {"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "ff", "0000000000000000000000000000000000000000000000000000000000000000"}, + {"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0100", "0000000000000000000000000000000000000000000000000000000000000000"}, + } + + testTwoOperandOp(t, tests, opSAR, "sar") +} + +func TestAddMod(t *testing.T) { + var ( + env = NewEVM(BlockContext{}, TxContext{}, nil, params.TestChainConfig, Config{}) + stack, err = NewStack() + evmInterpreter = NewEVMInterpreter(env, env.Config) + pc = uint64(0) + ) + + require.NoError(t, err) + + tests := []struct { + x string + y string + z string + expected string + }{ + { + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe", + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe", + }, + } + // x + y = 0x1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd + // in 256 bit repr, fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd + + for i, test := range tests { + x := new(uint256.Int).SetBytes(common.Hex2Bytes(test.x)) + y := new(uint256.Int).SetBytes(common.Hex2Bytes(test.y)) + z := new(uint256.Int).SetBytes(common.Hex2Bytes(test.z)) + expected := new(uint256.Int).SetBytes(common.Hex2Bytes(test.expected)) + stack.Push(z) + stack.Push(y) + stack.Push(x) + opAddmod(&pc, evmInterpreter, &ScopeContext{nil, stack, nil}) + actual := stack.Pop() + if actual.Cmp(expected) != 0 { + t.Errorf("Testcase %d, expected %x, got %x", i, expected, actual) + } + } +} + +// utility function to fill the json-file with testcases +// Enable this test to generate the 'testcases_xx.json' files +func TestWriteExpectedValues(t *testing.T) { + t.Skip("Enable this test to create json test cases.") + + // getResult is a convenience function to generate the expected values + getResult := func(args []*twoOperandParams, opFn executionFunc) []TwoOperandTestcase { + var ( + env = NewEVM(BlockContext{}, TxContext{}, nil, params.TestChainConfig, Config{}) + stack, err = NewStack() + pc = uint64(0) + interpreter = env.interpreter + ) + + require.NoError(t, err) + + result := make([]TwoOperandTestcase, len(args)) + for i, param := range args { + x := new(uint256.Int).SetBytes(common.Hex2Bytes(param.x)) + y := new(uint256.Int).SetBytes(common.Hex2Bytes(param.y)) + stack.Push(x) + stack.Push(y) + opFn(&pc, interpreter.(*EVMInterpreter), &ScopeContext{nil, stack, nil}) + actual := stack.Pop() + result[i] = TwoOperandTestcase{param.x, param.y, fmt.Sprintf("%064x", actual)} + } + return result + } + + for name, method := range twoOpMethods { + data, err := json.Marshal(getResult(commonParams, method)) + if err != nil { + t.Fatal(err) + } + _ = os.WriteFile(fmt.Sprintf("testdata/testcases_%v.json", name), data, 0o644) + if err != nil { + t.Fatal(err) + } + } +} + +// TestJsonTestcases runs through all the testcases defined as json-files +func TestJsonTestcases(t *testing.T) { + for name := range twoOpMethods { + data, err := os.ReadFile(fmt.Sprintf("testdata/testcases_%v.json", name)) + if err != nil { + t.Fatal("Failed to read file", err) + } + var testcases []TwoOperandTestcase + json.Unmarshal(data, &testcases) + testTwoOperandOp(t, testcases, twoOpMethods[name], name) + } +} + +func opBenchmark(bench *testing.B, op executionFunc, args ...string) { + var ( + env = NewEVM(BlockContext{}, TxContext{}, nil, params.TestChainConfig, Config{}) + stack, _ = NewStack() + scope = &ScopeContext{nil, stack, nil} + evmInterpreter = NewEVMInterpreter(env, env.Config) + ) + env.interpreter = evmInterpreter + // convert args + intArgs := make([]*uint256.Int, len(args)) + for i, arg := range args { + intArgs[i] = new(uint256.Int).SetBytes(common.Hex2Bytes(arg)) + } + pc := uint64(0) + bench.ResetTimer() + for i := 0; i < bench.N; i++ { + for _, arg := range intArgs { + stack.Push(arg) + } + op(&pc, evmInterpreter, scope) + stack.Pop() + } + bench.StopTimer() + + for i, arg := range args { + want := new(uint256.Int).SetBytes(common.Hex2Bytes(arg)) + if have := intArgs[i]; !want.Eq(have) { + bench.Fatalf("input #%d mutated, have %x want %x", i, have, want) + } + } +} + +func BenchmarkOpAdd64(b *testing.B) { + x := "ffffffff" + y := "fd37f3e2bba2c4f" + + opBenchmark(b, opAdd, x, y) +} + +func BenchmarkOpAdd128(b *testing.B) { + x := "ffffffffffffffff" + y := "f5470b43c6549b016288e9a65629687" + + opBenchmark(b, opAdd, x, y) +} + +func BenchmarkOpAdd256(b *testing.B) { + x := "0802431afcbce1fc194c9eaa417b2fb67dc75a95db0bc7ec6b1c8af11df6a1da9" + y := "a1f5aac137876480252e5dcac62c354ec0d42b76b0642b6181ed099849ea1d57" + + opBenchmark(b, opAdd, x, y) +} + +func BenchmarkOpSub64(b *testing.B) { + x := "51022b6317003a9d" + y := "a20456c62e00753a" + + opBenchmark(b, opSub, x, y) +} + +func BenchmarkOpSub128(b *testing.B) { + x := "4dde30faaacdc14d00327aac314e915d" + y := "9bbc61f5559b829a0064f558629d22ba" + + opBenchmark(b, opSub, x, y) +} + +func BenchmarkOpSub256(b *testing.B) { + x := "4bfcd8bb2ac462735b48a17580690283980aa2d679f091c64364594df113ea37" + y := "97f9b1765588c4e6b69142eb00d20507301545acf3e1238c86c8b29be227d46e" + + opBenchmark(b, opSub, x, y) +} + +func BenchmarkOpMul(b *testing.B) { + x := alphabetSoup + y := alphabetSoup + + opBenchmark(b, opMul, x, y) +} + +func BenchmarkOpDiv256(b *testing.B) { + x := "ff3f9014f20db29ae04af2c2d265de17" + y := "fe7fb0d1f59dfe9492ffbf73683fd1e870eec79504c60144cc7f5fc2bad1e611" + opBenchmark(b, opDiv, x, y) +} + +func BenchmarkOpDiv128(b *testing.B) { + x := "fdedc7f10142ff97" + y := "fbdfda0e2ce356173d1993d5f70a2b11" + opBenchmark(b, opDiv, x, y) +} + +func BenchmarkOpDiv64(b *testing.B) { + x := "fcb34eb3" + y := "f97180878e839129" + opBenchmark(b, opDiv, x, y) +} + +func BenchmarkOpSdiv(b *testing.B) { + x := "ff3f9014f20db29ae04af2c2d265de17" + y := "fe7fb0d1f59dfe9492ffbf73683fd1e870eec79504c60144cc7f5fc2bad1e611" + + opBenchmark(b, opSdiv, x, y) +} + +func BenchmarkOpMod(b *testing.B) { + x := alphabetSoup + y := alphabetSoup + + opBenchmark(b, opMod, x, y) +} + +func BenchmarkOpSmod(b *testing.B) { + x := alphabetSoup + y := alphabetSoup + + opBenchmark(b, opSmod, x, y) +} + +func BenchmarkOpExp(b *testing.B) { + x := alphabetSoup + y := alphabetSoup + + opBenchmark(b, opExp, x, y) +} + +func BenchmarkOpSignExtend(b *testing.B) { + x := alphabetSoup + y := alphabetSoup + + opBenchmark(b, opSignExtend, x, y) +} + +func BenchmarkOpLt(b *testing.B) { + x := alphabetSoup + y := alphabetSoup + + opBenchmark(b, opLt, x, y) +} + +func BenchmarkOpGt(b *testing.B) { + x := alphabetSoup + y := alphabetSoup + + opBenchmark(b, opGt, x, y) +} + +func BenchmarkOpSlt(b *testing.B) { + x := alphabetSoup + y := alphabetSoup + + opBenchmark(b, opSlt, x, y) +} + +func BenchmarkOpSgt(b *testing.B) { + x := alphabetSoup + y := alphabetSoup + + opBenchmark(b, opSgt, x, y) +} + +func BenchmarkOpEq(b *testing.B) { + x := alphabetSoup + y := alphabetSoup + + opBenchmark(b, opEq, x, y) +} + +func BenchmarkOpEq2(b *testing.B) { + x := "FBCDEF090807060504030201ffffffffFBCDEF090807060504030201ffffffff" + y := "FBCDEF090807060504030201ffffffffFBCDEF090807060504030201fffffffe" + opBenchmark(b, opEq, x, y) +} + +func BenchmarkOpAnd(b *testing.B) { + x := alphabetSoup + y := alphabetSoup + + opBenchmark(b, opAnd, x, y) +} + +func BenchmarkOpOr(b *testing.B) { + x := alphabetSoup + y := alphabetSoup + + opBenchmark(b, opOr, x, y) +} + +func BenchmarkOpXor(b *testing.B) { + x := alphabetSoup + y := alphabetSoup + + opBenchmark(b, opXor, x, y) +} + +func BenchmarkOpByte(b *testing.B) { + x := alphabetSoup + y := alphabetSoup + + opBenchmark(b, opByte, x, y) +} + +func BenchmarkOpAddmod(b *testing.B) { + x := alphabetSoup + y := alphabetSoup + z := alphabetSoup + + opBenchmark(b, opAddmod, x, y, z) +} + +func BenchmarkOpMulmod(b *testing.B) { + x := alphabetSoup + y := alphabetSoup + z := alphabetSoup + + opBenchmark(b, opMulmod, x, y, z) +} + +func BenchmarkOpSHL(b *testing.B) { + x := "FBCDEF090807060504030201ffffffffFBCDEF090807060504030201ffffffff" + y := "ff" + + opBenchmark(b, opSHL, x, y) +} + +func BenchmarkOpSHR(b *testing.B) { + x := "FBCDEF090807060504030201ffffffffFBCDEF090807060504030201ffffffff" + y := "ff" + + opBenchmark(b, opSHR, x, y) +} + +func BenchmarkOpSAR(b *testing.B) { + x := "FBCDEF090807060504030201ffffffffFBCDEF090807060504030201ffffffff" + y := "ff" + + opBenchmark(b, opSAR, x, y) +} + +func BenchmarkOpIsZero(b *testing.B) { + x := "FBCDEF090807060504030201ffffffffFBCDEF090807060504030201ffffffff" + opBenchmark(b, opIszero, x) +} + +func TestOpMstore(t *testing.T) { + var ( + env = NewEVM(BlockContext{}, TxContext{}, nil, params.TestChainConfig, Config{}) + stack, err = NewStack() + mem = NewMemory() + evmInterpreter = NewEVMInterpreter(env, env.Config) + ) + + require.NoError(t, err) + + env.interpreter = evmInterpreter + mem.Resize(64) + pc := uint64(0) + v := "abcdef00000000000000abba000000000deaf000000c0de00100000000133700" + stack.Push(new(uint256.Int).SetBytes(common.Hex2Bytes(v))) + stack.Push(new(uint256.Int)) + opMstore(&pc, evmInterpreter, &ScopeContext{mem, stack, nil}) + if got := common.Bytes2Hex(mem.GetCopy(0, 32)); got != v { + t.Fatalf("Mstore fail, got %v, expected %v", got, v) + } + stack.Push(new(uint256.Int).SetUint64(0x1)) + stack.Push(new(uint256.Int)) + opMstore(&pc, evmInterpreter, &ScopeContext{mem, stack, nil}) + if common.Bytes2Hex(mem.GetCopy(0, 32)) != "0000000000000000000000000000000000000000000000000000000000000001" { + t.Fatalf("Mstore failed to overwrite previous value") + } +} + +func BenchmarkOpMstore(bench *testing.B) { + var ( + env = NewEVM(BlockContext{}, TxContext{}, nil, params.TestChainConfig, Config{}) + stack, _ = NewStack() + mem = NewMemory() + evmInterpreter = NewEVMInterpreter(env, env.Config) + ) + + env.interpreter = evmInterpreter + mem.Resize(64) + pc := uint64(0) + memStart := new(uint256.Int) + value := new(uint256.Int).SetUint64(0x1337) + + bench.ResetTimer() + for i := 0; i < bench.N; i++ { + stack.Push(value) + stack.Push(memStart) + opMstore(&pc, evmInterpreter, &ScopeContext{mem, stack, nil}) + } +} + +func BenchmarkOpKeccak256(bench *testing.B) { + var ( + env = NewEVM(BlockContext{}, TxContext{}, nil, params.TestChainConfig, Config{}) + stack, _ = NewStack() + mem = NewMemory() + evmInterpreter = NewEVMInterpreter(env, env.Config) + ) + env.interpreter = evmInterpreter + mem.Resize(32) + pc := uint64(0) + start := new(uint256.Int) + + bench.ResetTimer() + for i := 0; i < bench.N; i++ { + stack.Push(uint256.NewInt(32)) + stack.Push(start) + opKeccak256(&pc, evmInterpreter, &ScopeContext{mem, stack, nil}) + } +} + +func TestCreate2Addreses(t *testing.T) { + type testcase struct { + origin string + salt string + code string + expected string + } + + for i, tt := range []testcase{ + { + origin: "0x0000000000000000000000000000000000000000", + salt: "0x0000000000000000000000000000000000000000", + code: "0x00", + expected: "0x4d1a2e2bb4f88f0250f26ffff098b0b30b26bf38", + }, + { + origin: "0xdeadbeef00000000000000000000000000000000", + salt: "0x0000000000000000000000000000000000000000", + code: "0x00", + expected: "0xB928f69Bb1D91Cd65274e3c79d8986362984fDA3", + }, + { + origin: "0xdeadbeef00000000000000000000000000000000", + salt: "0xfeed000000000000000000000000000000000000", + code: "0x00", + expected: "0xD04116cDd17beBE565EB2422F2497E06cC1C9833", + }, + { + origin: "0x0000000000000000000000000000000000000000", + salt: "0x0000000000000000000000000000000000000000", + code: "0xdeadbeef", + expected: "0x70f2b2914A2a4b783FaEFb75f459A580616Fcb5e", + }, + { + origin: "0x00000000000000000000000000000000deadbeef", + salt: "0xcafebabe", + code: "0xdeadbeef", + expected: "0x60f3f640a8508fC6a86d45DF051962668E1e8AC7", + }, + { + origin: "0x00000000000000000000000000000000deadbeef", + salt: "0xcafebabe", + code: "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef", + expected: "0x1d8bfDC5D46DC4f61D6b6115972536eBE6A8854C", + }, + { + origin: "0x0000000000000000000000000000000000000000", + salt: "0x0000000000000000000000000000000000000000", + code: "0x", + expected: "0xE33C0C7F7df4809055C3ebA6c09CFe4BaF1BD9e0", + }, + } { + origin := common.BytesToAddress(common.FromHex(tt.origin)) + salt := common.BytesToHash(common.FromHex(tt.salt)) + code := common.FromHex(tt.code) + codeHash := crypto.Keccak256(code) + address := crypto.CreateAddress2(origin, salt, codeHash) + /* + stack := newstack() + // salt, but we don't need that for this test + stack.push(big.NewInt(int64(len(code)))) //size + stack.push(big.NewInt(0)) // memstart + stack.push(big.NewInt(0)) // value + gas, _ := gasCreate2(params.GasTable{}, nil, nil, stack, nil, 0) + fmt.Printf("Example %d\n* address `0x%x`\n* salt `0x%x`\n* init_code `0x%x`\n* gas (assuming no mem expansion): `%v`\n* result: `%s`\n\n", i,origin, salt, code, gas, address.String()) + */ + expected := common.BytesToAddress(common.FromHex(tt.expected)) + if !bytes.Equal(expected.Bytes(), address.Bytes()) { + t.Errorf("test %d: expected %s, got %s", i, expected.String(), address.String()) + } + } +} + +func TestRandom(t *testing.T) { + type testcase struct { + name string + random common.Hash + } + + for _, tt := range []testcase{ + {name: "empty hash", random: common.Hash{}}, + {name: "1", random: common.Hash{0}}, + {name: "emptyCodeHash", random: emptyCodeHash}, + {name: "hash(0x010203)", random: crypto.Keccak256Hash([]byte{0x01, 0x02, 0x03})}, + } { + var ( + env = NewEVM(BlockContext{Random: &tt.random}, TxContext{}, nil, params.TestChainConfig, Config{}) + stack, err = NewStack() + pc = uint64(0) + interpreter = env.interpreter + ) + + require.NoError(t, err) + + opRandom(&pc, interpreter.(*EVMInterpreter), &ScopeContext{nil, stack, nil}) + if len(stack.Data) != 1 { + t.Errorf("Expected one item on stack after %v, got %d: ", tt.name, len(stack.Data)) + } + actual := stack.Pop() + expected, overflow := uint256.FromBig(new(big.Int).SetBytes(tt.random.Bytes())) + if overflow { + t.Errorf("Testcase %v: invalid overflow", tt.name) + } + if actual.Cmp(expected) != 0 { + t.Errorf("Testcase %v: expected %x, got %x", tt.name, expected, actual) + } + } +} diff --git a/x/evm/core/vm/interface.go b/x/evm/core/vm/interface.go new file mode 100644 index 0000000000..6a407a08d0 --- /dev/null +++ b/x/evm/core/vm/interface.go @@ -0,0 +1,100 @@ +// Copyright 2016 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package vm + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" +) + +// StateDB is an EVM database for full state querying. +type StateDB interface { + CreateAccount(common.Address) + + SubBalance(common.Address, *big.Int) + AddBalance(common.Address, *big.Int) + GetBalance(common.Address) *big.Int + + GetNonce(common.Address) uint64 + SetNonce(common.Address, uint64) + + GetCodeHash(common.Address) common.Hash + GetCode(common.Address) []byte + SetCode(common.Address, []byte) + GetCodeSize(common.Address) int + + AddRefund(uint64) + SubRefund(uint64) + GetRefund() uint64 + + GetCommittedState(common.Address, common.Hash) common.Hash + GetState(common.Address, common.Hash) common.Hash + SetState(common.Address, common.Hash, common.Hash) + + Suicide(common.Address) bool + HasSuicided(common.Address) bool + + // Exist reports whether the given account exists in state. + // Notably this should also return true for suicided accounts. + Exist(common.Address) bool + // Empty returns whether the given account is empty. Empty + // is defined according to EIP161 (balance = nonce = code = 0). + Empty(common.Address) bool + + PrepareAccessList(sender common.Address, dest *common.Address, precompiles []common.Address, txAccesses types.AccessList) + AddressInAccessList(addr common.Address) bool + SlotInAccessList(addr common.Address, slot common.Hash) (addressOk bool, slotOk bool) + // AddAddressToAccessList adds the given address to the access list. This operation is safe to perform + // even if the feature/fork is not active yet + AddAddressToAccessList(addr common.Address) + // AddSlotToAccessList adds the given (address,slot) to the access list. This operation is safe to perform + // even if the feature/fork is not active yet + AddSlotToAccessList(addr common.Address, slot common.Hash) + + RevertToSnapshot(int) + Snapshot() int + + AddLog(*types.Log) + AddPreimage(common.Hash, []byte) + + ForEachStorage(common.Address, func(common.Hash, common.Hash) bool) error +} + +// CallContext provides a basic interface for the EVM calling conventions. The EVM +// depends on this context being implemented for doing subcalls and initialising new EVM contracts. +type CallContext interface { + // Call another contract + Call(env *EVM, me ContractRef, addr common.Address, data []byte, gas, value *big.Int) ([]byte, error) + // Take another's contract code and execute within our own context + CallCode(env *EVM, me ContractRef, addr common.Address, data []byte, gas, value *big.Int) ([]byte, error) + // Same as CallCode except sender and value is propagated from parent to child scope + DelegateCall(env *EVM, me ContractRef, addr common.Address, data []byte, gas *big.Int) ([]byte, error) + // Create a new contract + Create(env *EVM, me ContractRef, data []byte, gas, value *big.Int) ([]byte, common.Address, error) +} + +// Interpreter is used to run Ethereum based contracts and will utilize the +// passed environment to query external sources for state information. +// The Interpreter will run the byte code VM based on the passed +// configuration. +type Interpreter interface { + // Run loops and evaluates the contract's code with the given input data and returns + // the return byte-slice and an error if one occurred. + Run(contract *Contract, input []byte, static bool) ([]byte, error) +} diff --git a/x/evm/core/vm/interpreter.go b/x/evm/core/vm/interpreter.go new file mode 100644 index 0000000000..d657915124 --- /dev/null +++ b/x/evm/core/vm/interpreter.go @@ -0,0 +1,234 @@ +// Copyright 2014 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package vm + +import ( + "hash" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/log" +) + +// Config are the configuration options for the Interpreter +type Config struct { + Debug bool // Enables debugging + Tracer EVMLogger // Opcode logger + NoBaseFee bool // Forces the EIP-1559 baseFee to 0 (needed for 0 price calls) + EnablePreimageRecording bool // Enables recording of SHA3/keccak preimages + + JumpTable *JumpTable // EVM instruction table, automatically populated if unset + + ExtraEips []int // Additional EIPS that are to be enabled +} + +// ScopeContext contains the things that are per-call, such as stack and memory, +// but not transients like pc and gas +type ScopeContext struct { + Memory *Memory + Stack *Stack + Contract *Contract +} + +// keccakState wraps sha3.state. In addition to the usual hash methods, it also supports +// Read to get a variable amount of data from the hash state. Read is faster than Sum +// because it doesn't copy the internal state, but also modifies the internal state. +type keccakState interface { + hash.Hash + Read([]byte) (int, error) +} + +var _ Interpreter = &EVMInterpreter{} + +// EVMInterpreter represents an EVM interpreter +type EVMInterpreter struct { + evm *EVM + cfg Config + + hasher keccakState // Keccak256 hasher instance shared across opcodes + hasherBuf common.Hash // Keccak256 hasher result array shared aross opcodes + + readOnly bool // Whether to throw on stateful modifications + returnData []byte // Last CALL's return data for subsequent reuse +} + +// NewEVMInterpreter returns a new instance of the Interpreter. +func NewEVMInterpreter(evm *EVM, cfg Config) *EVMInterpreter { + // If jump table was not initialised we set the default one. + if cfg.JumpTable == nil { + cfg.JumpTable = DefaultJumpTable(evm.chainRules) + for i, eip := range cfg.ExtraEips { + // Deep-copy jumptable to prevent modification of opcodes in other tables + copy := CopyJumpTable(cfg.JumpTable) + if err := EnableEIP(eip, copy); err != nil { + // Disable it, so caller can check if it's activated or not + cfg.ExtraEips = append(cfg.ExtraEips[:i], cfg.ExtraEips[i+1:]...) + log.Error("EIP activation failed", "eip", eip, "error", err) + } + cfg.JumpTable = copy + } + } + + return &EVMInterpreter{ + evm: evm, + cfg: cfg, + } +} + +// Run loops and evaluates the contract's code with the given input data and returns +// the return byte-slice and an error if one occurred. +// +// It's important to note that any errors returned by the interpreter should be +// considered a revert-and-consume-all-gas operation except for +// ErrExecutionReverted which means revert-and-keep-gas-left. +func (in *EVMInterpreter) Run(contract *Contract, input []byte, readOnly bool) (ret []byte, err error) { + // Increment the call depth which is restricted to 1024 + in.evm.depth++ + defer func() { in.evm.depth-- }() + + // Make sure the readOnly is only set if we aren't in readOnly yet. + // This also makes sure that the readOnly flag isn't removed for child calls. + if readOnly && !in.readOnly { + in.readOnly = true + defer func() { in.readOnly = false }() + } + + // Reset the previous call's return data. It's unimportant to preserve the old buffer + // as every returning call will return new data anyway. + in.returnData = nil + + // Don't bother with the execution if there's no code. + if len(contract.Code) == 0 { + return nil, nil + } + + mem := NewMemory() // bound memory + stack, err := NewStack() // local stack + if err != nil { + return nil, err + } + callContext := &ScopeContext{ + Memory: mem, + Stack: stack, + Contract: contract, + } + + var ( + op OpCode // current opcode + // For optimisation reason we're using uint64 as the program counter. + // It's theoretically possible to go above 2^64. The YP defines the PC + // to be uint256. Practically much less so feasible. + pc uint64 // program counter + cost uint64 + // copies used by tracer + pcCopy uint64 // needed for the deferred EVMLogger + gasCopy uint64 // for EVMLogger to log gas remaining before execution + logged bool // deferred EVMLogger should ignore already logged steps + res []byte // result of the opcode execution function + ) + // Don't move this deferred function, it's placed before the capturestate-deferred method, + // so that it get's executed _after_: the capturestate needs the stacks before + // they are returned to the pools + defer ReturnNormalStack(stack) + contract.Input = input + + if in.cfg.Debug { + defer func() { + if err != nil { + if !logged { + in.cfg.Tracer.CaptureState(pcCopy, op, gasCopy, cost, callContext, in.returnData, in.evm.depth, err) + } else { + in.cfg.Tracer.CaptureFault(pcCopy, op, gasCopy, cost, callContext, in.evm.depth, err) + } + } + }() + } + // The Interpreter main run loop (contextual). This loop runs until either an + // explicit STOP, RETURN or SELFDESTRUCT is executed, an error occurred during + // the execution of one of the operations or until the done flag is set by the + // parent context. + for { + if in.cfg.Debug { + // Capture pre-execution values for tracing. + logged, pcCopy, gasCopy = false, pc, contract.Gas + } + // Get the operation from the jump table and validate the stack to ensure there are + // enough stack items available to perform the operation. + op = contract.GetOp(pc) + operation := in.cfg.JumpTable[op] + cost = operation.constantGas // For tracing + // Validate stack + if sLen := stack.Len(); sLen < operation.minStack { + return nil, &ErrStackUnderflow{stackLen: sLen, required: operation.minStack} + } else if sLen > operation.maxStack { + return nil, &ErrStackOverflow{stackLen: sLen, limit: operation.maxStack} + } + if !contract.UseGas(cost) { + return nil, ErrOutOfGas + } + if operation.dynamicGas != nil { + // All ops with a dynamic memory usage also has a dynamic gas cost. + var memorySize uint64 + // calculate the new memory size and expand the memory to fit + // the operation + // Memory check needs to be done prior to evaluating the dynamic gas portion, + // to detect calculation overflows + if operation.memorySize != nil { + memSize, overflow := operation.memorySize(stack) + if overflow { + return nil, ErrGasUintOverflow + } + // memory is expanded in words of 32 bytes. Gas + // is also calculated in words. + if memorySize, overflow = math.SafeMul(toWordSize(memSize), 32); overflow { + return nil, ErrGasUintOverflow + } + } + // Consume the gas and return an error if not enough gas is available. + // cost is explicitly set so that the capture state defer method can get the proper cost + var dynamicCost uint64 + dynamicCost, err = operation.dynamicGas(in.evm, contract, stack, mem, memorySize) + cost += dynamicCost // for tracing + if err != nil || !contract.UseGas(dynamicCost) { + return nil, ErrOutOfGas + } + // Do tracing before memory expansion + if in.cfg.Debug { + in.cfg.Tracer.CaptureState(pc, op, gasCopy, cost, callContext, in.returnData, in.evm.depth, err) + logged = true + } + if memorySize > 0 { + mem.Resize(memorySize) + } + } else if in.cfg.Debug { + in.cfg.Tracer.CaptureState(pc, op, gasCopy, cost, callContext, in.returnData, in.evm.depth, err) + logged = true + } + // execute the operation + res, err = operation.execute(&pc, in, callContext) + if err != nil { + break + } + pc++ + } + + if err == errStopToken { + err = nil // clear stop token error + } + + return res, err +} diff --git a/x/evm/core/vm/interpreter_test.go b/x/evm/core/vm/interpreter_test.go new file mode 100644 index 0000000000..31ee9922db --- /dev/null +++ b/x/evm/core/vm/interpreter_test.go @@ -0,0 +1,76 @@ +// Copyright 2021 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package vm + +import ( + "math/big" + "testing" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/params" +) + +var loopInterruptTests = []string{ + // infinite loop using JUMP: push(2) jumpdest dup1 jump + "60025b8056", + // infinite loop using JUMPI: push(1) push(4) jumpdest dup2 dup2 jumpi + "600160045b818157", +} + +func TestLoopInterrupt(t *testing.T) { + address := common.BytesToAddress([]byte("contract")) + vmctx := BlockContext{ + Transfer: func(StateDB, common.Address, common.Address, *big.Int) {}, + } + + for i, tt := range loopInterruptTests { + statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + statedb.CreateAccount(address) + statedb.SetCode(address, common.Hex2Bytes(tt)) + statedb.Finalise(true) + + evm := NewEVM(vmctx, TxContext{}, statedb, params.AllEthashProtocolChanges, Config{}) + + errChannel := make(chan error) + timeout := make(chan bool) + + go func(evm *EVM) { + _, _, err := evm.Call(AccountRef(common.Address{}), address, nil, math.MaxUint64, new(big.Int)) + errChannel <- err + }(evm) + + go func() { + <-time.After(time.Second) + timeout <- true + }() + + evm.Cancel() + + select { + case <-timeout: + t.Errorf("test %d timed out", i) + case err := <-errChannel: + if err != nil { + t.Errorf("test %d failure: %v", i, err) + } + } + } +} diff --git a/x/evm/core/vm/jump_table.go b/x/evm/core/vm/jump_table.go new file mode 100644 index 0000000000..ffe33bb014 --- /dev/null +++ b/x/evm/core/vm/jump_table.go @@ -0,0 +1,1106 @@ +// Copyright 2015 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package vm + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/params" +) + +type ( + executionFunc func(pc *uint64, interpreter *EVMInterpreter, callContext *ScopeContext) ([]byte, error) + gasFunc func(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) + // memorySizeFunc returns the required size, and whether the operation overflowed a uint64 + memorySizeFunc func(*Stack) (size uint64, overflow bool) +) + +type operation struct { + // execute is the operation function + execute executionFunc + constantGas uint64 + dynamicGas gasFunc + // minStack tells how many stack items are required + minStack int + // maxStack specifies the max length the stack can have for this operation + // to not overflow the stack. + maxStack int + + // memorySize returns the memory size required for the operation + memorySize memorySizeFunc +} + +var ( + FrontierInstructionSet = newFrontierInstructionSet() + HomesteadInstructionSet = newHomesteadInstructionSet() + TangerineWhistleInstructionSet = newTangerineWhistleInstructionSet() + SpuriousDragonInstructionSet = newSpuriousDragonInstructionSet() + ByzantiumInstructionSet = newByzantiumInstructionSet() + ConstantinopleInstructionSet = newConstantinopleInstructionSet() + IstanbulInstructionSet = newIstanbulInstructionSet() + BerlinInstructionSet = newBerlinInstructionSet() + LondonInstructionSet = newLondonInstructionSet() + MergeInstructionSet = newMergeInstructionSet() +) + +// JumpTable contains the EVM opcodes supported at a given fork. +type JumpTable [256]*operation + +// DefaultJumpTable defines the default jump table used by the EVM interpreter. +func DefaultJumpTable(rules params.Rules) (jumpTable *JumpTable) { + switch { + case rules.IsMerge: + jumpTable = &MergeInstructionSet + case rules.IsLondon: + jumpTable = &LondonInstructionSet + case rules.IsBerlin: + jumpTable = &BerlinInstructionSet + case rules.IsIstanbul: + jumpTable = &IstanbulInstructionSet + case rules.IsConstantinople: + jumpTable = &ConstantinopleInstructionSet + case rules.IsByzantium: + jumpTable = &ByzantiumInstructionSet + case rules.IsEIP158: + jumpTable = &SpuriousDragonInstructionSet + case rules.IsEIP150: + jumpTable = &TangerineWhistleInstructionSet + case rules.IsHomestead: + jumpTable = &HomesteadInstructionSet + default: + jumpTable = &FrontierInstructionSet + } + + return jumpTable +} + +// Validate checks if all the operations are set and if they are valid according to the +// interpreter assumptions. +func (jt JumpTable) Validate() error { + for i, op := range jt { + if op == nil { + return fmt.Errorf("op %#x is not set", i) + } + + // The interpreter has an assumption that if the memorySize function is + // set, then the dynamicGas function is also set. This is a somewhat + // arbitrary assumption, and can be removed if we need to -- but it + // allows us to avoid a condition check. As long as we have that assumption + // in there, this little sanity check prevents us from merging in a + // change which violates it. + if op.memorySize != nil && op.dynamicGas == nil { + return fmt.Errorf("op %v has dynamic memory but not dynamic gas", OpCode(i).String()) + } + } + + return nil +} + +// MustValidate panics if the operations are not valid. +func (jt JumpTable) MustValidate() { + if err := jt.Validate(); err != nil { + panic(err) + } +} + +func newMergeInstructionSet() JumpTable { + instructionSet := newLondonInstructionSet() + instructionSet[RANDOM] = &operation{ + execute: opRandom, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + } + instructionSet.MustValidate() + return instructionSet +} + +// newLondonInstructionSet returns the frontier, homestead, byzantium, +// contantinople, istanbul, petersburg, berlin and london instructions. +func newLondonInstructionSet() JumpTable { + instructionSet := newBerlinInstructionSet() + enable3529(&instructionSet) // EIP-3529: Reduction in refunds https://eips.ethereum.org/EIPS/eip-3529 + enable3198(&instructionSet) // Base fee opcode https://eips.ethereum.org/EIPS/eip-3198 + instructionSet.MustValidate() + return instructionSet +} + +// newBerlinInstructionSet returns the frontier, homestead, byzantium, +// contantinople, istanbul, petersburg and berlin instructions. +func newBerlinInstructionSet() JumpTable { + instructionSet := newIstanbulInstructionSet() + enable2929(&instructionSet) // Access lists for trie accesses https://eips.ethereum.org/EIPS/eip-2929 + instructionSet.MustValidate() + return instructionSet +} + +// newIstanbulInstructionSet returns the frontier, homestead, byzantium, +// contantinople, istanbul and petersburg instructions. +func newIstanbulInstructionSet() JumpTable { + instructionSet := newConstantinopleInstructionSet() + + enable1344(&instructionSet) // ChainID opcode - https://eips.ethereum.org/EIPS/eip-1344 + enable1884(&instructionSet) // Reprice reader opcodes - https://eips.ethereum.org/EIPS/eip-1884 + enable2200(&instructionSet) // Net metered SSTORE - https://eips.ethereum.org/EIPS/eip-2200 + + instructionSet.MustValidate() + return instructionSet +} + +// newConstantinopleInstructionSet returns the frontier, homestead, +// byzantium and contantinople instructions. +func newConstantinopleInstructionSet() JumpTable { + instructionSet := newByzantiumInstructionSet() + instructionSet[SHL] = &operation{ + execute: opSHL, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + } + instructionSet[SHR] = &operation{ + execute: opSHR, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + } + instructionSet[SAR] = &operation{ + execute: opSAR, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + } + instructionSet[EXTCODEHASH] = &operation{ + execute: opExtCodeHash, + constantGas: params.ExtcodeHashGasConstantinople, + minStack: minStack(1, 1), + maxStack: maxStack(1, 1), + } + instructionSet[CREATE2] = &operation{ + execute: opCreate2, + constantGas: params.Create2Gas, + dynamicGas: gasCreate2, + minStack: minStack(4, 1), + maxStack: maxStack(4, 1), + memorySize: memoryCreate2, + } + instructionSet.MustValidate() + return instructionSet +} + +// newByzantiumInstructionSet returns the frontier, homestead and +// byzantium instructions. +func newByzantiumInstructionSet() JumpTable { + instructionSet := newSpuriousDragonInstructionSet() + instructionSet[STATICCALL] = &operation{ + execute: opStaticCall, + constantGas: params.CallGasEIP150, + dynamicGas: gasStaticCall, + minStack: minStack(6, 1), + maxStack: maxStack(6, 1), + memorySize: memoryStaticCall, + } + instructionSet[RETURNDATASIZE] = &operation{ + execute: opReturnDataSize, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + } + instructionSet[RETURNDATACOPY] = &operation{ + execute: opReturnDataCopy, + constantGas: GasFastestStep, + dynamicGas: gasReturnDataCopy, + minStack: minStack(3, 0), + maxStack: maxStack(3, 0), + memorySize: memoryReturnDataCopy, + } + instructionSet[REVERT] = &operation{ + execute: opRevert, + dynamicGas: gasRevert, + minStack: minStack(2, 0), + maxStack: maxStack(2, 0), + memorySize: memoryRevert, + } + instructionSet.MustValidate() + return instructionSet +} + +// EIP 158 a.k.a Spurious Dragon +func newSpuriousDragonInstructionSet() JumpTable { + instructionSet := newTangerineWhistleInstructionSet() + instructionSet[EXP].dynamicGas = gasExpEIP158 + instructionSet.MustValidate() + return instructionSet +} + +// EIP 150 a.k.a Tangerine Whistle +func newTangerineWhistleInstructionSet() JumpTable { + instructionSet := newHomesteadInstructionSet() + instructionSet[BALANCE].constantGas = params.BalanceGasEIP150 + instructionSet[EXTCODESIZE].constantGas = params.ExtcodeSizeGasEIP150 + instructionSet[SLOAD].constantGas = params.SloadGasEIP150 + instructionSet[EXTCODECOPY].constantGas = params.ExtcodeCopyBaseEIP150 + instructionSet[CALL].constantGas = params.CallGasEIP150 + instructionSet[CALLCODE].constantGas = params.CallGasEIP150 + instructionSet[DELEGATECALL].constantGas = params.CallGasEIP150 + instructionSet.MustValidate() + return instructionSet +} + +// newHomesteadInstructionSet returns the frontier and homestead +// instructions that can be executed during the homestead phase. +func newHomesteadInstructionSet() JumpTable { + instructionSet := newFrontierInstructionSet() + instructionSet[DELEGATECALL] = &operation{ + execute: opDelegateCall, + dynamicGas: gasDelegateCall, + constantGas: params.CallGasFrontier, + minStack: minStack(6, 1), + maxStack: maxStack(6, 1), + memorySize: memoryDelegateCall, + } + instructionSet.MustValidate() + return instructionSet +} + +// newFrontierInstructionSet returns the frontier instructions +// that can be executed during the frontier phase. +func newFrontierInstructionSet() JumpTable { + tbl := JumpTable{ + STOP: { + execute: opStop, + constantGas: 0, + minStack: minStack(0, 0), + maxStack: maxStack(0, 0), + }, + ADD: { + execute: opAdd, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + }, + MUL: { + execute: opMul, + constantGas: GasFastStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + }, + SUB: { + execute: opSub, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + }, + DIV: { + execute: opDiv, + constantGas: GasFastStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + }, + SDIV: { + execute: opSdiv, + constantGas: GasFastStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + }, + MOD: { + execute: opMod, + constantGas: GasFastStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + }, + SMOD: { + execute: opSmod, + constantGas: GasFastStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + }, + ADDMOD: { + execute: opAddmod, + constantGas: GasMidStep, + minStack: minStack(3, 1), + maxStack: maxStack(3, 1), + }, + MULMOD: { + execute: opMulmod, + constantGas: GasMidStep, + minStack: minStack(3, 1), + maxStack: maxStack(3, 1), + }, + EXP: { + execute: opExp, + dynamicGas: gasExpFrontier, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + }, + SIGNEXTEND: { + execute: opSignExtend, + constantGas: GasFastStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + }, + LT: { + execute: opLt, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + }, + GT: { + execute: opGt, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + }, + SLT: { + execute: opSlt, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + }, + SGT: { + execute: opSgt, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + }, + EQ: { + execute: opEq, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + }, + ISZERO: { + execute: opIszero, + constantGas: GasFastestStep, + minStack: minStack(1, 1), + maxStack: maxStack(1, 1), + }, + AND: { + execute: opAnd, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + }, + XOR: { + execute: opXor, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + }, + OR: { + execute: opOr, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + }, + NOT: { + execute: opNot, + constantGas: GasFastestStep, + minStack: minStack(1, 1), + maxStack: maxStack(1, 1), + }, + BYTE: { + execute: opByte, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + }, + KECCAK256: { + execute: opKeccak256, + constantGas: params.Keccak256Gas, + dynamicGas: gasKeccak256, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + memorySize: memoryKeccak256, + }, + ADDRESS: { + execute: opAddress, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + BALANCE: { + execute: opBalance, + constantGas: params.BalanceGasFrontier, + minStack: minStack(1, 1), + maxStack: maxStack(1, 1), + }, + ORIGIN: { + execute: opOrigin, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + CALLER: { + execute: opCaller, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + CALLVALUE: { + execute: opCallValue, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + CALLDATALOAD: { + execute: opCallDataLoad, + constantGas: GasFastestStep, + minStack: minStack(1, 1), + maxStack: maxStack(1, 1), + }, + CALLDATASIZE: { + execute: opCallDataSize, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + CALLDATACOPY: { + execute: opCallDataCopy, + constantGas: GasFastestStep, + dynamicGas: gasCallDataCopy, + minStack: minStack(3, 0), + maxStack: maxStack(3, 0), + memorySize: memoryCallDataCopy, + }, + CODESIZE: { + execute: opCodeSize, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + CODECOPY: { + execute: opCodeCopy, + constantGas: GasFastestStep, + dynamicGas: gasCodeCopy, + minStack: minStack(3, 0), + maxStack: maxStack(3, 0), + memorySize: memoryCodeCopy, + }, + GASPRICE: { + execute: opGasprice, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + EXTCODESIZE: { + execute: opExtCodeSize, + constantGas: params.ExtcodeSizeGasFrontier, + minStack: minStack(1, 1), + maxStack: maxStack(1, 1), + }, + EXTCODECOPY: { + execute: opExtCodeCopy, + constantGas: params.ExtcodeCopyBaseFrontier, + dynamicGas: gasExtCodeCopy, + minStack: minStack(4, 0), + maxStack: maxStack(4, 0), + memorySize: memoryExtCodeCopy, + }, + BLOCKHASH: { + execute: opBlockhash, + constantGas: GasExtStep, + minStack: minStack(1, 1), + maxStack: maxStack(1, 1), + }, + COINBASE: { + execute: opCoinbase, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + TIMESTAMP: { + execute: opTimestamp, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + NUMBER: { + execute: opNumber, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + DIFFICULTY: { + execute: opDifficulty, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + GASLIMIT: { + execute: opGasLimit, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + POP: { + execute: opPop, + constantGas: GasQuickStep, + minStack: minStack(1, 0), + maxStack: maxStack(1, 0), + }, + MLOAD: { + execute: opMload, + constantGas: GasFastestStep, + dynamicGas: gasMLoad, + minStack: minStack(1, 1), + maxStack: maxStack(1, 1), + memorySize: memoryMLoad, + }, + MSTORE: { + execute: opMstore, + constantGas: GasFastestStep, + dynamicGas: gasMStore, + minStack: minStack(2, 0), + maxStack: maxStack(2, 0), + memorySize: memoryMStore, + }, + MSTORE8: { + execute: opMstore8, + constantGas: GasFastestStep, + dynamicGas: gasMStore8, + memorySize: memoryMStore8, + minStack: minStack(2, 0), + maxStack: maxStack(2, 0), + }, + SLOAD: { + execute: opSload, + constantGas: params.SloadGasFrontier, + minStack: minStack(1, 1), + maxStack: maxStack(1, 1), + }, + SSTORE: { + execute: opSstore, + dynamicGas: gasSStore, + minStack: minStack(2, 0), + maxStack: maxStack(2, 0), + }, + JUMP: { + execute: opJump, + constantGas: GasMidStep, + minStack: minStack(1, 0), + maxStack: maxStack(1, 0), + }, + JUMPI: { + execute: opJumpi, + constantGas: GasSlowStep, + minStack: minStack(2, 0), + maxStack: maxStack(2, 0), + }, + PC: { + execute: opPc, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + MSIZE: { + execute: opMsize, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + GAS: { + execute: opGas, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + JUMPDEST: { + execute: opJumpdest, + constantGas: params.JumpdestGas, + minStack: minStack(0, 0), + maxStack: maxStack(0, 0), + }, + PUSH1: { + execute: opPush1, + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + PUSH2: { + execute: makePush(2, 2), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + PUSH3: { + execute: makePush(3, 3), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + PUSH4: { + execute: makePush(4, 4), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + PUSH5: { + execute: makePush(5, 5), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + PUSH6: { + execute: makePush(6, 6), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + PUSH7: { + execute: makePush(7, 7), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + PUSH8: { + execute: makePush(8, 8), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + PUSH9: { + execute: makePush(9, 9), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + PUSH10: { + execute: makePush(10, 10), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + PUSH11: { + execute: makePush(11, 11), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + PUSH12: { + execute: makePush(12, 12), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + PUSH13: { + execute: makePush(13, 13), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + PUSH14: { + execute: makePush(14, 14), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + PUSH15: { + execute: makePush(15, 15), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + PUSH16: { + execute: makePush(16, 16), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + PUSH17: { + execute: makePush(17, 17), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + PUSH18: { + execute: makePush(18, 18), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + PUSH19: { + execute: makePush(19, 19), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + PUSH20: { + execute: makePush(20, 20), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + PUSH21: { + execute: makePush(21, 21), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + PUSH22: { + execute: makePush(22, 22), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + PUSH23: { + execute: makePush(23, 23), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + PUSH24: { + execute: makePush(24, 24), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + PUSH25: { + execute: makePush(25, 25), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + PUSH26: { + execute: makePush(26, 26), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + PUSH27: { + execute: makePush(27, 27), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + PUSH28: { + execute: makePush(28, 28), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + PUSH29: { + execute: makePush(29, 29), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + PUSH30: { + execute: makePush(30, 30), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + PUSH31: { + execute: makePush(31, 31), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + PUSH32: { + execute: makePush(32, 32), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + }, + DUP1: { + execute: makeDup(1), + constantGas: GasFastestStep, + minStack: minDupStack(1), + maxStack: maxDupStack(1), + }, + DUP2: { + execute: makeDup(2), + constantGas: GasFastestStep, + minStack: minDupStack(2), + maxStack: maxDupStack(2), + }, + DUP3: { + execute: makeDup(3), + constantGas: GasFastestStep, + minStack: minDupStack(3), + maxStack: maxDupStack(3), + }, + DUP4: { + execute: makeDup(4), + constantGas: GasFastestStep, + minStack: minDupStack(4), + maxStack: maxDupStack(4), + }, + DUP5: { + execute: makeDup(5), + constantGas: GasFastestStep, + minStack: minDupStack(5), + maxStack: maxDupStack(5), + }, + DUP6: { + execute: makeDup(6), + constantGas: GasFastestStep, + minStack: minDupStack(6), + maxStack: maxDupStack(6), + }, + DUP7: { + execute: makeDup(7), + constantGas: GasFastestStep, + minStack: minDupStack(7), + maxStack: maxDupStack(7), + }, + DUP8: { + execute: makeDup(8), + constantGas: GasFastestStep, + minStack: minDupStack(8), + maxStack: maxDupStack(8), + }, + DUP9: { + execute: makeDup(9), + constantGas: GasFastestStep, + minStack: minDupStack(9), + maxStack: maxDupStack(9), + }, + DUP10: { + execute: makeDup(10), + constantGas: GasFastestStep, + minStack: minDupStack(10), + maxStack: maxDupStack(10), + }, + DUP11: { + execute: makeDup(11), + constantGas: GasFastestStep, + minStack: minDupStack(11), + maxStack: maxDupStack(11), + }, + DUP12: { + execute: makeDup(12), + constantGas: GasFastestStep, + minStack: minDupStack(12), + maxStack: maxDupStack(12), + }, + DUP13: { + execute: makeDup(13), + constantGas: GasFastestStep, + minStack: minDupStack(13), + maxStack: maxDupStack(13), + }, + DUP14: { + execute: makeDup(14), + constantGas: GasFastestStep, + minStack: minDupStack(14), + maxStack: maxDupStack(14), + }, + DUP15: { + execute: makeDup(15), + constantGas: GasFastestStep, + minStack: minDupStack(15), + maxStack: maxDupStack(15), + }, + DUP16: { + execute: makeDup(16), + constantGas: GasFastestStep, + minStack: minDupStack(16), + maxStack: maxDupStack(16), + }, + SWAP1: { + execute: makeSwap(1), + constantGas: GasFastestStep, + minStack: minSwapStack(2), + maxStack: maxSwapStack(2), + }, + SWAP2: { + execute: makeSwap(2), + constantGas: GasFastestStep, + minStack: minSwapStack(3), + maxStack: maxSwapStack(3), + }, + SWAP3: { + execute: makeSwap(3), + constantGas: GasFastestStep, + minStack: minSwapStack(4), + maxStack: maxSwapStack(4), + }, + SWAP4: { + execute: makeSwap(4), + constantGas: GasFastestStep, + minStack: minSwapStack(5), + maxStack: maxSwapStack(5), + }, + SWAP5: { + execute: makeSwap(5), + constantGas: GasFastestStep, + minStack: minSwapStack(6), + maxStack: maxSwapStack(6), + }, + SWAP6: { + execute: makeSwap(6), + constantGas: GasFastestStep, + minStack: minSwapStack(7), + maxStack: maxSwapStack(7), + }, + SWAP7: { + execute: makeSwap(7), + constantGas: GasFastestStep, + minStack: minSwapStack(8), + maxStack: maxSwapStack(8), + }, + SWAP8: { + execute: makeSwap(8), + constantGas: GasFastestStep, + minStack: minSwapStack(9), + maxStack: maxSwapStack(9), + }, + SWAP9: { + execute: makeSwap(9), + constantGas: GasFastestStep, + minStack: minSwapStack(10), + maxStack: maxSwapStack(10), + }, + SWAP10: { + execute: makeSwap(10), + constantGas: GasFastestStep, + minStack: minSwapStack(11), + maxStack: maxSwapStack(11), + }, + SWAP11: { + execute: makeSwap(11), + constantGas: GasFastestStep, + minStack: minSwapStack(12), + maxStack: maxSwapStack(12), + }, + SWAP12: { + execute: makeSwap(12), + constantGas: GasFastestStep, + minStack: minSwapStack(13), + maxStack: maxSwapStack(13), + }, + SWAP13: { + execute: makeSwap(13), + constantGas: GasFastestStep, + minStack: minSwapStack(14), + maxStack: maxSwapStack(14), + }, + SWAP14: { + execute: makeSwap(14), + constantGas: GasFastestStep, + minStack: minSwapStack(15), + maxStack: maxSwapStack(15), + }, + SWAP15: { + execute: makeSwap(15), + constantGas: GasFastestStep, + minStack: minSwapStack(16), + maxStack: maxSwapStack(16), + }, + SWAP16: { + execute: makeSwap(16), + constantGas: GasFastestStep, + minStack: minSwapStack(17), + maxStack: maxSwapStack(17), + }, + LOG0: { + execute: makeLog(0), + dynamicGas: makeGasLog(0), + minStack: minStack(2, 0), + maxStack: maxStack(2, 0), + memorySize: memoryLog, + }, + LOG1: { + execute: makeLog(1), + dynamicGas: makeGasLog(1), + minStack: minStack(3, 0), + maxStack: maxStack(3, 0), + memorySize: memoryLog, + }, + LOG2: { + execute: makeLog(2), + dynamicGas: makeGasLog(2), + minStack: minStack(4, 0), + maxStack: maxStack(4, 0), + memorySize: memoryLog, + }, + LOG3: { + execute: makeLog(3), + dynamicGas: makeGasLog(3), + minStack: minStack(5, 0), + maxStack: maxStack(5, 0), + memorySize: memoryLog, + }, + LOG4: { + execute: makeLog(4), + dynamicGas: makeGasLog(4), + minStack: minStack(6, 0), + maxStack: maxStack(6, 0), + memorySize: memoryLog, + }, + CREATE: { + execute: opCreate, + constantGas: params.CreateGas, + dynamicGas: gasCreate, + minStack: minStack(3, 1), + maxStack: maxStack(3, 1), + memorySize: memoryCreate, + }, + CALL: { + execute: opCall, + constantGas: params.CallGasFrontier, + dynamicGas: gasCall, + minStack: minStack(7, 1), + maxStack: maxStack(7, 1), + memorySize: memoryCall, + }, + CALLCODE: { + execute: opCallCode, + constantGas: params.CallGasFrontier, + dynamicGas: gasCallCode, + minStack: minStack(7, 1), + maxStack: maxStack(7, 1), + memorySize: memoryCall, + }, + RETURN: { + execute: opReturn, + dynamicGas: gasReturn, + minStack: minStack(2, 0), + maxStack: maxStack(2, 0), + memorySize: memoryReturn, + }, + SELFDESTRUCT: { + execute: opSelfdestruct, + dynamicGas: gasSelfdestruct, + minStack: minStack(1, 0), + maxStack: maxStack(1, 0), + }, + } + + // Fill all unassigned slots with opUndefined. + for i, entry := range tbl { + if entry == nil { + tbl[i] = &operation{execute: opUndefined, maxStack: maxStack(0, 0)} + } + } + + tbl.MustValidate() + return tbl +} + +// CopyJumpTable creates copy of the operations from the provided source JumpTable. +func CopyJumpTable(source *JumpTable) *JumpTable { + dest := *source + for i, op := range source { + if op != nil { + opCopy := *op + dest[i] = &opCopy + } + } + return &dest +} diff --git a/x/evm/core/vm/jump_table_test.go b/x/evm/core/vm/jump_table_test.go new file mode 100644 index 0000000000..eae6681ac2 --- /dev/null +++ b/x/evm/core/vm/jump_table_test.go @@ -0,0 +1,35 @@ +// Copyright 2022 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package vm + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +// TestJumpTableCopy tests that deep copy is necessery to prevent modify shared jump table +func TestJumpTableCopy(t *testing.T) { + tbl := newMergeInstructionSet() + require.Equal(t, uint64(0), tbl[SLOAD].constantGas) + + // a deep copy won't modify the shared jump table + deepCopy := CopyJumpTable(&tbl) + deepCopy[SLOAD].constantGas = 100 + require.Equal(t, uint64(100), deepCopy[SLOAD].constantGas) + require.Equal(t, uint64(0), tbl[SLOAD].constantGas) +} diff --git a/x/evm/core/vm/logger.go b/x/evm/core/vm/logger.go new file mode 100644 index 0000000000..50fccafcf5 --- /dev/null +++ b/x/evm/core/vm/logger.go @@ -0,0 +1,44 @@ +// Copyright 2015 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package vm + +import ( + "math/big" + "time" + + "github.com/ethereum/go-ethereum/common" +) + +// EVMLogger is used to collect execution traces from an EVM transaction +// execution. CaptureState is called for each step of the VM with the +// current VM state. +// Note that reference types are actual VM data structures; make copies +// if you need to retain them beyond the current call. +type EVMLogger interface { + // Transaction level + CaptureTxStart(gasLimit uint64) + CaptureTxEnd(restGas uint64) + // Top call frame + CaptureStart(env *EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) + CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) + // Rest of call frames + CaptureEnter(typ OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) + CaptureExit(output []byte, gasUsed uint64, err error) + // Opcode level + CaptureState(pc uint64, op OpCode, gas, cost uint64, scope *ScopeContext, rData []byte, depth int, err error) + CaptureFault(pc uint64, op OpCode, gas, cost uint64, scope *ScopeContext, depth int, err error) +} diff --git a/x/evm/core/vm/memory.go b/x/evm/core/vm/memory.go new file mode 100644 index 0000000000..35b7299960 --- /dev/null +++ b/x/evm/core/vm/memory.go @@ -0,0 +1,105 @@ +// Copyright 2015 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package vm + +import ( + "github.com/holiman/uint256" +) + +// Memory implements a simple memory model for the ethereum virtual machine. +type Memory struct { + store []byte + lastGasCost uint64 +} + +// NewMemory returns a new memory model. +func NewMemory() *Memory { + return &Memory{} +} + +// Set sets offset + size to value +func (m *Memory) Set(offset, size uint64, value []byte) { + // It's possible the offset is greater than 0 and size equals 0. This is because + // the calcMemSize (common.go) could potentially return 0 when size is zero (NO-OP) + if size > 0 { + // length of store may never be less than offset + size. + // The store should be resized PRIOR to setting the memory + if offset+size > uint64(len(m.store)) { + panic("invalid memory: store empty") + } + copy(m.store[offset:offset+size], value) + } +} + +// Set32 sets the 32 bytes starting at offset to the value of val, left-padded with zeroes to +// 32 bytes. +func (m *Memory) Set32(offset uint64, val *uint256.Int) { + // length of store may never be less than offset + size. + // The store should be resized PRIOR to setting the memory + if offset+32 > uint64(len(m.store)) { + panic("invalid memory: store empty") + } + // Fill in relevant bits + b32 := val.Bytes32() + copy(m.store[offset:], b32[:]) +} + +// Resize resizes the memory to size +func (m *Memory) Resize(size uint64) { + if uint64(m.Len()) < size { + m.store = append(m.store, make([]byte, size-uint64(m.Len()))...) + } +} + +// GetCopy returns offset + size as a new slice +func (m *Memory) GetCopy(offset, size int64) (cpy []byte) { + if size == 0 { + return nil + } + + if len(m.store) > int(offset) { + cpy = make([]byte, size) + copy(cpy, m.store[offset:offset+size]) + + return + } + + return +} + +// GetPtr returns the offset + size +func (m *Memory) GetPtr(offset, size int64) []byte { + if size == 0 { + return nil + } + + if len(m.store) > int(offset) { + return m.store[offset : offset+size] + } + + return nil +} + +// Len returns the length of the backing slice +func (m *Memory) Len() int { + return len(m.store) +} + +// Data returns the backing slice +func (m *Memory) Data() []byte { + return m.store +} diff --git a/x/evm/core/vm/memory_table.go b/x/evm/core/vm/memory_table.go new file mode 100644 index 0000000000..f83deb3893 --- /dev/null +++ b/x/evm/core/vm/memory_table.go @@ -0,0 +1,114 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package vm + +func memoryKeccak256(stack *Stack) (uint64, bool) { + return calcMemSize64(stack.Back(0), stack.Back(1)) +} + +func memoryCallDataCopy(stack *Stack) (uint64, bool) { + return calcMemSize64(stack.Back(0), stack.Back(2)) +} + +func memoryReturnDataCopy(stack *Stack) (uint64, bool) { + return calcMemSize64(stack.Back(0), stack.Back(2)) +} + +func memoryCodeCopy(stack *Stack) (uint64, bool) { + return calcMemSize64(stack.Back(0), stack.Back(2)) +} + +func memoryExtCodeCopy(stack *Stack) (uint64, bool) { + return calcMemSize64(stack.Back(1), stack.Back(3)) +} + +func memoryMLoad(stack *Stack) (uint64, bool) { + return calcMemSize64WithUint(stack.Back(0), 32) +} + +func memoryMStore8(stack *Stack) (uint64, bool) { + return calcMemSize64WithUint(stack.Back(0), 1) +} + +func memoryMStore(stack *Stack) (uint64, bool) { + return calcMemSize64WithUint(stack.Back(0), 32) +} + +func memoryCreate(stack *Stack) (uint64, bool) { + return calcMemSize64(stack.Back(1), stack.Back(2)) +} + +func memoryCreate2(stack *Stack) (uint64, bool) { + return calcMemSize64(stack.Back(1), stack.Back(2)) +} + +func memoryCall(stack *Stack) (uint64, bool) { + x, overflow := calcMemSize64(stack.Back(5), stack.Back(6)) + if overflow { + return 0, true + } + y, overflow := calcMemSize64(stack.Back(3), stack.Back(4)) + if overflow { + return 0, true + } + if x > y { + return x, false + } + return y, false +} + +func memoryDelegateCall(stack *Stack) (uint64, bool) { + x, overflow := calcMemSize64(stack.Back(4), stack.Back(5)) + if overflow { + return 0, true + } + y, overflow := calcMemSize64(stack.Back(2), stack.Back(3)) + if overflow { + return 0, true + } + if x > y { + return x, false + } + return y, false +} + +func memoryStaticCall(stack *Stack) (uint64, bool) { + x, overflow := calcMemSize64(stack.Back(4), stack.Back(5)) + if overflow { + return 0, true + } + y, overflow := calcMemSize64(stack.Back(2), stack.Back(3)) + if overflow { + return 0, true + } + if x > y { + return x, false + } + return y, false +} + +func memoryReturn(stack *Stack) (uint64, bool) { + return calcMemSize64(stack.Back(0), stack.Back(1)) +} + +func memoryRevert(stack *Stack) (uint64, bool) { + return calcMemSize64(stack.Back(0), stack.Back(1)) +} + +func memoryLog(stack *Stack) (uint64, bool) { + return calcMemSize64(stack.Back(0), stack.Back(1)) +} diff --git a/x/evm/core/vm/opcode_hooks.go b/x/evm/core/vm/opcode_hooks.go new file mode 100644 index 0000000000..4606d38648 --- /dev/null +++ b/x/evm/core/vm/opcode_hooks.go @@ -0,0 +1,47 @@ +// Copyright 2014 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package vm + +import "github.com/ethereum/go-ethereum/common" + +// OpCodeHooks is a set of hooks that can be used to intercept and modify the +// behavior of the EVM when executing certain opcodes. +// The hooks are called before the execution of the respective opcodes. +type OpCodeHooks interface { + // CallHook is called before executing a CALL, CALLCODE, DELEGATECALL and STATICCALL opcodes. + CallHook(evm *EVM, caller common.Address, recipient common.Address) error + // CreateHook is called before executing a CREATE and CREATE2 opcodes. + CreateHook(evm *EVM, caller common.Address) error +} + +type NoopOpCodeHooks struct{} + +func (NoopOpCodeHooks) CallHook(evm *EVM, caller common.Address, recipient common.Address) error { + return nil +} + +func (NoopOpCodeHooks) CreateHook(evm *EVM, caller common.Address) error { + return nil +} + +func newNoopOpCodeHooks() OpCodeHooks { + return NoopOpCodeHooks{} +} + +func NewDefaultOpCodeHooks() OpCodeHooks { + return newNoopOpCodeHooks() +} diff --git a/x/evm/core/vm/opcodes.go b/x/evm/core/vm/opcodes.go new file mode 100644 index 0000000000..7e3a870242 --- /dev/null +++ b/x/evm/core/vm/opcodes.go @@ -0,0 +1,551 @@ +// Copyright 2014 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package vm + +import ( + "fmt" +) + +// OpCode is an EVM opcode +type OpCode byte + +// IsPush specifies if an opcode is a PUSH opcode. +func (op OpCode) IsPush() bool { + switch op { + case PUSH1, PUSH2, PUSH3, PUSH4, PUSH5, PUSH6, PUSH7, PUSH8, PUSH9, PUSH10, PUSH11, PUSH12, PUSH13, PUSH14, PUSH15, PUSH16, PUSH17, PUSH18, PUSH19, PUSH20, PUSH21, PUSH22, PUSH23, PUSH24, PUSH25, PUSH26, PUSH27, PUSH28, PUSH29, PUSH30, PUSH31, PUSH32: + return true + } + return false +} + +// 0x0 range - arithmetic ops. +const ( + STOP OpCode = 0x0 + ADD OpCode = 0x1 + MUL OpCode = 0x2 + SUB OpCode = 0x3 + DIV OpCode = 0x4 + SDIV OpCode = 0x5 + MOD OpCode = 0x6 + SMOD OpCode = 0x7 + ADDMOD OpCode = 0x8 + MULMOD OpCode = 0x9 + EXP OpCode = 0xa + SIGNEXTEND OpCode = 0xb +) + +// 0x10 range - comparison ops. +const ( + LT OpCode = 0x10 + GT OpCode = 0x11 + SLT OpCode = 0x12 + SGT OpCode = 0x13 + EQ OpCode = 0x14 + ISZERO OpCode = 0x15 + AND OpCode = 0x16 + OR OpCode = 0x17 + XOR OpCode = 0x18 + NOT OpCode = 0x19 + BYTE OpCode = 0x1a + SHL OpCode = 0x1b + SHR OpCode = 0x1c + SAR OpCode = 0x1d +) + +// 0x20 range - crypto. +const ( + KECCAK256 OpCode = 0x20 +) + +// 0x30 range - closure state. +const ( + ADDRESS OpCode = 0x30 + BALANCE OpCode = 0x31 + ORIGIN OpCode = 0x32 + CALLER OpCode = 0x33 + CALLVALUE OpCode = 0x34 + CALLDATALOAD OpCode = 0x35 + CALLDATASIZE OpCode = 0x36 + CALLDATACOPY OpCode = 0x37 + CODESIZE OpCode = 0x38 + CODECOPY OpCode = 0x39 + GASPRICE OpCode = 0x3a + EXTCODESIZE OpCode = 0x3b + EXTCODECOPY OpCode = 0x3c + RETURNDATASIZE OpCode = 0x3d + RETURNDATACOPY OpCode = 0x3e + EXTCODEHASH OpCode = 0x3f +) + +// 0x40 range - block operations. +const ( + BLOCKHASH OpCode = 0x40 + COINBASE OpCode = 0x41 + TIMESTAMP OpCode = 0x42 + NUMBER OpCode = 0x43 + DIFFICULTY OpCode = 0x44 + RANDOM OpCode = 0x44 // Same as DIFFICULTY + GASLIMIT OpCode = 0x45 + CHAINID OpCode = 0x46 + SELFBALANCE OpCode = 0x47 + BASEFEE OpCode = 0x48 +) + +// 0x50 range - 'storage' and execution. +const ( + POP OpCode = 0x50 + MLOAD OpCode = 0x51 + MSTORE OpCode = 0x52 + MSTORE8 OpCode = 0x53 + SLOAD OpCode = 0x54 + SSTORE OpCode = 0x55 + JUMP OpCode = 0x56 + JUMPI OpCode = 0x57 + PC OpCode = 0x58 + MSIZE OpCode = 0x59 + GAS OpCode = 0x5a + JUMPDEST OpCode = 0x5b + PUSH0 OpCode = 0x5f +) + +// 0x60 range - pushes. +const ( + PUSH1 OpCode = 0x60 + iota + PUSH2 + PUSH3 + PUSH4 + PUSH5 + PUSH6 + PUSH7 + PUSH8 + PUSH9 + PUSH10 + PUSH11 + PUSH12 + PUSH13 + PUSH14 + PUSH15 + PUSH16 + PUSH17 + PUSH18 + PUSH19 + PUSH20 + PUSH21 + PUSH22 + PUSH23 + PUSH24 + PUSH25 + PUSH26 + PUSH27 + PUSH28 + PUSH29 + PUSH30 + PUSH31 + PUSH32 +) + +// 0x80 range - dups. +const ( + DUP1 = 0x80 + iota + DUP2 + DUP3 + DUP4 + DUP5 + DUP6 + DUP7 + DUP8 + DUP9 + DUP10 + DUP11 + DUP12 + DUP13 + DUP14 + DUP15 + DUP16 +) + +// 0x90 range - swaps. +const ( + SWAP1 = 0x90 + iota + SWAP2 + SWAP3 + SWAP4 + SWAP5 + SWAP6 + SWAP7 + SWAP8 + SWAP9 + SWAP10 + SWAP11 + SWAP12 + SWAP13 + SWAP14 + SWAP15 + SWAP16 +) + +// 0xa0 range - logging ops. +const ( + LOG0 OpCode = 0xa0 + iota + LOG1 + LOG2 + LOG3 + LOG4 +) + +// 0xf0 range - closures. +const ( + CREATE OpCode = 0xf0 + CALL OpCode = 0xf1 + CALLCODE OpCode = 0xf2 + RETURN OpCode = 0xf3 + DELEGATECALL OpCode = 0xf4 + CREATE2 OpCode = 0xf5 + + STATICCALL OpCode = 0xfa + REVERT OpCode = 0xfd + INVALID OpCode = 0xfe + SELFDESTRUCT OpCode = 0xff +) + +// Since the opcodes aren't all in order we can't use a regular slice. +var opCodeToString = map[OpCode]string{ + // 0x0 range - arithmetic ops. + STOP: "STOP", + ADD: "ADD", + MUL: "MUL", + SUB: "SUB", + DIV: "DIV", + SDIV: "SDIV", + MOD: "MOD", + SMOD: "SMOD", + EXP: "EXP", + NOT: "NOT", + LT: "LT", + GT: "GT", + SLT: "SLT", + SGT: "SGT", + EQ: "EQ", + ISZERO: "ISZERO", + SIGNEXTEND: "SIGNEXTEND", + + // 0x10 range - bit ops. + AND: "AND", + OR: "OR", + XOR: "XOR", + BYTE: "BYTE", + SHL: "SHL", + SHR: "SHR", + SAR: "SAR", + ADDMOD: "ADDMOD", + MULMOD: "MULMOD", + + // 0x20 range - crypto. + KECCAK256: "KECCAK256", + + // 0x30 range - closure state. + ADDRESS: "ADDRESS", + BALANCE: "BALANCE", + ORIGIN: "ORIGIN", + CALLER: "CALLER", + CALLVALUE: "CALLVALUE", + CALLDATALOAD: "CALLDATALOAD", + CALLDATASIZE: "CALLDATASIZE", + CALLDATACOPY: "CALLDATACOPY", + CODESIZE: "CODESIZE", + CODECOPY: "CODECOPY", + GASPRICE: "GASPRICE", + EXTCODESIZE: "EXTCODESIZE", + EXTCODECOPY: "EXTCODECOPY", + RETURNDATASIZE: "RETURNDATASIZE", + RETURNDATACOPY: "RETURNDATACOPY", + EXTCODEHASH: "EXTCODEHASH", + + // 0x40 range - block operations. + BLOCKHASH: "BLOCKHASH", + COINBASE: "COINBASE", + TIMESTAMP: "TIMESTAMP", + NUMBER: "NUMBER", + DIFFICULTY: "DIFFICULTY", // TODO (MariusVanDerWijden) rename to RANDOM post merge + GASLIMIT: "GASLIMIT", + CHAINID: "CHAINID", + SELFBALANCE: "SELFBALANCE", + BASEFEE: "BASEFEE", + + // 0x50 range - 'storage' and execution. + POP: "POP", + // DUP: "DUP", + // SWAP: "SWAP", + MLOAD: "MLOAD", + MSTORE: "MSTORE", + MSTORE8: "MSTORE8", + SLOAD: "SLOAD", + SSTORE: "SSTORE", + JUMP: "JUMP", + JUMPI: "JUMPI", + PC: "PC", + MSIZE: "MSIZE", + GAS: "GAS", + JUMPDEST: "JUMPDEST", + PUSH0: "PUSH0", + + // 0x60 range - push. + PUSH1: "PUSH1", + PUSH2: "PUSH2", + PUSH3: "PUSH3", + PUSH4: "PUSH4", + PUSH5: "PUSH5", + PUSH6: "PUSH6", + PUSH7: "PUSH7", + PUSH8: "PUSH8", + PUSH9: "PUSH9", + PUSH10: "PUSH10", + PUSH11: "PUSH11", + PUSH12: "PUSH12", + PUSH13: "PUSH13", + PUSH14: "PUSH14", + PUSH15: "PUSH15", + PUSH16: "PUSH16", + PUSH17: "PUSH17", + PUSH18: "PUSH18", + PUSH19: "PUSH19", + PUSH20: "PUSH20", + PUSH21: "PUSH21", + PUSH22: "PUSH22", + PUSH23: "PUSH23", + PUSH24: "PUSH24", + PUSH25: "PUSH25", + PUSH26: "PUSH26", + PUSH27: "PUSH27", + PUSH28: "PUSH28", + PUSH29: "PUSH29", + PUSH30: "PUSH30", + PUSH31: "PUSH31", + PUSH32: "PUSH32", + + DUP1: "DUP1", + DUP2: "DUP2", + DUP3: "DUP3", + DUP4: "DUP4", + DUP5: "DUP5", + DUP6: "DUP6", + DUP7: "DUP7", + DUP8: "DUP8", + DUP9: "DUP9", + DUP10: "DUP10", + DUP11: "DUP11", + DUP12: "DUP12", + DUP13: "DUP13", + DUP14: "DUP14", + DUP15: "DUP15", + DUP16: "DUP16", + + SWAP1: "SWAP1", + SWAP2: "SWAP2", + SWAP3: "SWAP3", + SWAP4: "SWAP4", + SWAP5: "SWAP5", + SWAP6: "SWAP6", + SWAP7: "SWAP7", + SWAP8: "SWAP8", + SWAP9: "SWAP9", + SWAP10: "SWAP10", + SWAP11: "SWAP11", + SWAP12: "SWAP12", + SWAP13: "SWAP13", + SWAP14: "SWAP14", + SWAP15: "SWAP15", + SWAP16: "SWAP16", + LOG0: "LOG0", + LOG1: "LOG1", + LOG2: "LOG2", + LOG3: "LOG3", + LOG4: "LOG4", + + // 0xf0 range. + CREATE: "CREATE", + CALL: "CALL", + RETURN: "RETURN", + CALLCODE: "CALLCODE", + DELEGATECALL: "DELEGATECALL", + CREATE2: "CREATE2", + STATICCALL: "STATICCALL", + REVERT: "REVERT", + INVALID: "INVALID", + SELFDESTRUCT: "SELFDESTRUCT", +} + +func (op OpCode) String() string { + str := opCodeToString[op] + if len(str) == 0 { + return fmt.Sprintf("opcode %#x not defined", int(op)) + } + + return str +} + +var stringToOp = map[string]OpCode{ + "STOP": STOP, + "ADD": ADD, + "MUL": MUL, + "SUB": SUB, + "DIV": DIV, + "SDIV": SDIV, + "MOD": MOD, + "SMOD": SMOD, + "EXP": EXP, + "NOT": NOT, + "LT": LT, + "GT": GT, + "SLT": SLT, + "SGT": SGT, + "EQ": EQ, + "ISZERO": ISZERO, + "SIGNEXTEND": SIGNEXTEND, + "AND": AND, + "OR": OR, + "XOR": XOR, + "BYTE": BYTE, + "SHL": SHL, + "SHR": SHR, + "SAR": SAR, + "ADDMOD": ADDMOD, + "MULMOD": MULMOD, + "KECCAK256": KECCAK256, + "ADDRESS": ADDRESS, + "BALANCE": BALANCE, + "ORIGIN": ORIGIN, + "CALLER": CALLER, + "CALLVALUE": CALLVALUE, + "CALLDATALOAD": CALLDATALOAD, + "CALLDATASIZE": CALLDATASIZE, + "CALLDATACOPY": CALLDATACOPY, + "CHAINID": CHAINID, + "BASEFEE": BASEFEE, + "DELEGATECALL": DELEGATECALL, + "STATICCALL": STATICCALL, + "CODESIZE": CODESIZE, + "CODECOPY": CODECOPY, + "GASPRICE": GASPRICE, + "EXTCODESIZE": EXTCODESIZE, + "EXTCODECOPY": EXTCODECOPY, + "RETURNDATASIZE": RETURNDATASIZE, + "RETURNDATACOPY": RETURNDATACOPY, + "EXTCODEHASH": EXTCODEHASH, + "BLOCKHASH": BLOCKHASH, + "COINBASE": COINBASE, + "TIMESTAMP": TIMESTAMP, + "NUMBER": NUMBER, + "DIFFICULTY": DIFFICULTY, + "GASLIMIT": GASLIMIT, + "SELFBALANCE": SELFBALANCE, + "POP": POP, + "MLOAD": MLOAD, + "MSTORE": MSTORE, + "MSTORE8": MSTORE8, + "SLOAD": SLOAD, + "SSTORE": SSTORE, + "JUMP": JUMP, + "JUMPI": JUMPI, + "PC": PC, + "MSIZE": MSIZE, + "GAS": GAS, + "JUMPDEST": JUMPDEST, + "PUSH0": PUSH0, + "PUSH1": PUSH1, + "PUSH2": PUSH2, + "PUSH3": PUSH3, + "PUSH4": PUSH4, + "PUSH5": PUSH5, + "PUSH6": PUSH6, + "PUSH7": PUSH7, + "PUSH8": PUSH8, + "PUSH9": PUSH9, + "PUSH10": PUSH10, + "PUSH11": PUSH11, + "PUSH12": PUSH12, + "PUSH13": PUSH13, + "PUSH14": PUSH14, + "PUSH15": PUSH15, + "PUSH16": PUSH16, + "PUSH17": PUSH17, + "PUSH18": PUSH18, + "PUSH19": PUSH19, + "PUSH20": PUSH20, + "PUSH21": PUSH21, + "PUSH22": PUSH22, + "PUSH23": PUSH23, + "PUSH24": PUSH24, + "PUSH25": PUSH25, + "PUSH26": PUSH26, + "PUSH27": PUSH27, + "PUSH28": PUSH28, + "PUSH29": PUSH29, + "PUSH30": PUSH30, + "PUSH31": PUSH31, + "PUSH32": PUSH32, + "DUP1": DUP1, + "DUP2": DUP2, + "DUP3": DUP3, + "DUP4": DUP4, + "DUP5": DUP5, + "DUP6": DUP6, + "DUP7": DUP7, + "DUP8": DUP8, + "DUP9": DUP9, + "DUP10": DUP10, + "DUP11": DUP11, + "DUP12": DUP12, + "DUP13": DUP13, + "DUP14": DUP14, + "DUP15": DUP15, + "DUP16": DUP16, + "SWAP1": SWAP1, + "SWAP2": SWAP2, + "SWAP3": SWAP3, + "SWAP4": SWAP4, + "SWAP5": SWAP5, + "SWAP6": SWAP6, + "SWAP7": SWAP7, + "SWAP8": SWAP8, + "SWAP9": SWAP9, + "SWAP10": SWAP10, + "SWAP11": SWAP11, + "SWAP12": SWAP12, + "SWAP13": SWAP13, + "SWAP14": SWAP14, + "SWAP15": SWAP15, + "SWAP16": SWAP16, + "LOG0": LOG0, + "LOG1": LOG1, + "LOG2": LOG2, + "LOG3": LOG3, + "LOG4": LOG4, + "CREATE": CREATE, + "CREATE2": CREATE2, + "CALL": CALL, + "RETURN": RETURN, + "CALLCODE": CALLCODE, + "REVERT": REVERT, + "INVALID": INVALID, + "SELFDESTRUCT": SELFDESTRUCT, +} + +// StringToOp finds the opcode whose name is stored in `str`. +func StringToOp(str string) OpCode { + return stringToOp[str] +} diff --git a/x/evm/core/vm/operations_acl.go b/x/evm/core/vm/operations_acl.go new file mode 100644 index 0000000000..a2f36d1ee7 --- /dev/null +++ b/x/evm/core/vm/operations_acl.go @@ -0,0 +1,244 @@ +// Copyright 2020 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package vm + +import ( + "errors" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/params" +) + +func makeGasSStoreFunc(clearingRefund uint64) gasFunc { + return func(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { + // If we fail the minimum gas availability invariant, fail (0) + if contract.Gas <= params.SstoreSentryGasEIP2200 { + return 0, errors.New("not enough gas for reentrancy sentry") + } + // Gas sentry honoured, do the actual gas calculation based on the stored value + var ( + y, x = stack.Back(1), stack.Peek() + slot = common.Hash(x.Bytes32()) + current = evm.StateDB.GetState(contract.Address(), slot) + cost = uint64(0) + ) + // Check slot presence in the access list + if addrPresent, slotPresent := evm.StateDB.SlotInAccessList(contract.Address(), slot); !slotPresent { + cost = params.ColdSloadCostEIP2929 + // If the caller cannot afford the cost, this change will be rolled back + evm.StateDB.AddSlotToAccessList(contract.Address(), slot) + if !addrPresent { + // Once we're done with YOLOv2 and schedule this for mainnet, might + // be good to remove this panic here, which is just really a + // canary to have during testing + panic("impossible case: address was not present in access list during sstore op") + } + } + value := common.Hash(y.Bytes32()) + + if current == value { // noop (1) + // EIP 2200 original clause: + // return params.SloadGasEIP2200, nil + return cost + params.WarmStorageReadCostEIP2929, nil // SLOAD_GAS + } + original := evm.StateDB.GetCommittedState(contract.Address(), x.Bytes32()) + if original == current { + if original == (common.Hash{}) { // create slot (2.1.1) + return cost + params.SstoreSetGasEIP2200, nil + } + if value == (common.Hash{}) { // delete slot (2.1.2b) + evm.StateDB.AddRefund(clearingRefund) + } + // EIP-2200 original clause: + // return params.SstoreResetGasEIP2200, nil // write existing slot (2.1.2) + return cost + (params.SstoreResetGasEIP2200 - params.ColdSloadCostEIP2929), nil // write existing slot (2.1.2) + } + if original != (common.Hash{}) { + if current == (common.Hash{}) { // recreate slot (2.2.1.1) + evm.StateDB.SubRefund(clearingRefund) + } else if value == (common.Hash{}) { // delete slot (2.2.1.2) + evm.StateDB.AddRefund(clearingRefund) + } + } + if original == value { + if original == (common.Hash{}) { // reset to original inexistent slot (2.2.2.1) + // EIP 2200 Original clause: + // evm.StateDB.AddRefund(params.SstoreSetGasEIP2200 - params.SloadGasEIP2200) + evm.StateDB.AddRefund(params.SstoreSetGasEIP2200 - params.WarmStorageReadCostEIP2929) + } else { // reset to original existing slot (2.2.2.2) + // EIP 2200 Original clause: + // evm.StateDB.AddRefund(params.SstoreResetGasEIP2200 - params.SloadGasEIP2200) + // - SSTORE_RESET_GAS redefined as (5000 - COLD_SLOAD_COST) + // - SLOAD_GAS redefined as WARM_STORAGE_READ_COST + // Final: (5000 - COLD_SLOAD_COST) - WARM_STORAGE_READ_COST + evm.StateDB.AddRefund((params.SstoreResetGasEIP2200 - params.ColdSloadCostEIP2929) - params.WarmStorageReadCostEIP2929) + } + } + // EIP-2200 original clause: + // return params.SloadGasEIP2200, nil // dirty update (2.2) + return cost + params.WarmStorageReadCostEIP2929, nil // dirty update (2.2) + } +} + +// gasSLoadEIP2929 calculates dynamic gas for SLOAD according to EIP-2929 +// For SLOAD, if the (address, storage_key) pair (where address is the address of the contract +// whose storage is being read) is not yet in accessed_storage_keys, +// charge 2100 gas and add the pair to accessed_storage_keys. +// If the pair is already in accessed_storage_keys, charge 100 gas. +func gasSLoadEIP2929(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { + loc := stack.Peek() + slot := common.Hash(loc.Bytes32()) + // Check slot presence in the access list + if _, slotPresent := evm.StateDB.SlotInAccessList(contract.Address(), slot); !slotPresent { + // If the caller cannot afford the cost, this change will be rolled back + // If he does afford it, we can skip checking the same thing later on, during execution + evm.StateDB.AddSlotToAccessList(contract.Address(), slot) + return params.ColdSloadCostEIP2929, nil + } + return params.WarmStorageReadCostEIP2929, nil +} + +// gasExtCodeCopyEIP2929 implements extcodecopy according to EIP-2929 +// EIP spec: +// > If the target is not in accessed_addresses, +// > charge COLD_ACCOUNT_ACCESS_COST gas, and add the address to accessed_addresses. +// > Otherwise, charge WARM_STORAGE_READ_COST gas. +func gasExtCodeCopyEIP2929(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { + // memory expansion first (dynamic part of pre-2929 implementation) + gas, err := gasExtCodeCopy(evm, contract, stack, mem, memorySize) + if err != nil { + return 0, err + } + addr := common.Address(stack.Peek().Bytes20()) + // Check slot presence in the access list + if !evm.StateDB.AddressInAccessList(addr) { + evm.StateDB.AddAddressToAccessList(addr) + var overflow bool + // We charge (cold-warm), since 'warm' is already charged as constantGas + if gas, overflow = math.SafeAdd(gas, params.ColdAccountAccessCostEIP2929-params.WarmStorageReadCostEIP2929); overflow { + return 0, ErrGasUintOverflow + } + return gas, nil + } + return gas, nil +} + +// gasEip2929AccountCheck checks whether the first stack item (as address) is present in the access list. +// If it is, this method returns '0', otherwise 'cold-warm' gas, presuming that the opcode using it +// is also using 'warm' as constant factor. +// This method is used by: +// - extcodehash, +// - extcodesize, +// - (ext) balance +func gasEip2929AccountCheck(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { + addr := common.Address(stack.Peek().Bytes20()) + // Check slot presence in the access list + if !evm.StateDB.AddressInAccessList(addr) { + // If the caller cannot afford the cost, this change will be rolled back + evm.StateDB.AddAddressToAccessList(addr) + // The warm storage read cost is already charged as constantGas + return params.ColdAccountAccessCostEIP2929 - params.WarmStorageReadCostEIP2929, nil + } + return 0, nil +} + +func makeCallVariantGasCallEIP2929(oldCalculator gasFunc) gasFunc { + return func(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { + addr := common.Address(stack.Back(1).Bytes20()) + // Check slot presence in the access list + warmAccess := evm.StateDB.AddressInAccessList(addr) + // The WarmStorageReadCostEIP2929 (100) is already deducted in the form of a constant cost, so + // the cost to charge for cold access, if any, is Cold - Warm + coldCost := params.ColdAccountAccessCostEIP2929 - params.WarmStorageReadCostEIP2929 + if !warmAccess { + evm.StateDB.AddAddressToAccessList(addr) + // Charge the remaining difference here already, to correctly calculate available + // gas for call + if !contract.UseGas(coldCost) { + return 0, ErrOutOfGas + } + } + // Now call the old calculator, which takes into account + // - create new account + // - transfer value + // - memory expansion + // - 63/64ths rule + gas, err := oldCalculator(evm, contract, stack, mem, memorySize) + if warmAccess || err != nil { + return gas, err + } + // In case of a cold access, we temporarily add the cold charge back, and also + // add it to the returned gas. By adding it to the return, it will be charged + // outside of this function, as part of the dynamic gas, and that will make it + // also become correctly reported to tracers. + contract.Gas += coldCost + return gas + coldCost, nil + } +} + +var ( + gasCallEIP2929 = makeCallVariantGasCallEIP2929(gasCall) + gasDelegateCallEIP2929 = makeCallVariantGasCallEIP2929(gasDelegateCall) + gasStaticCallEIP2929 = makeCallVariantGasCallEIP2929(gasStaticCall) + gasCallCodeEIP2929 = makeCallVariantGasCallEIP2929(gasCallCode) + gasSelfdestructEIP2929 = makeSelfdestructGasFn(true) + // gasSelfdestructEIP3529 implements the changes in EIP-2539 (no refunds) + gasSelfdestructEIP3529 = makeSelfdestructGasFn(false) + + // gasSStoreEIP2929 implements gas cost for SSTORE according to EIP-2929 + // + // When calling SSTORE, check if the (address, storage_key) pair is in accessed_storage_keys. + // If it is not, charge an additional COLD_SLOAD_COST gas, and add the pair to accessed_storage_keys. + // Additionally, modify the parameters defined in EIP 2200 as follows: + // + // Parameter Old value New value + // SLOAD_GAS 800 = WARM_STORAGE_READ_COST + // SSTORE_RESET_GAS 5000 5000 - COLD_SLOAD_COST + // + //The other parameters defined in EIP 2200 are unchanged. + // see gasSStoreEIP2200(...) in core/vm/gas_table.go for more info about how EIP 2200 is specified + gasSStoreEIP2929 = makeGasSStoreFunc(params.SstoreClearsScheduleRefundEIP2200) + + // gasSStoreEIP2539 implements gas cost for SSTORE according to EIP-2539 + // Replace `SSTORE_CLEARS_SCHEDULE` with `SSTORE_RESET_GAS + ACCESS_LIST_STORAGE_KEY_COST` (4,800) + gasSStoreEIP3529 = makeGasSStoreFunc(params.SstoreClearsScheduleRefundEIP3529) +) + +// makeSelfdestructGasFn can create the selfdestruct dynamic gas function for EIP-2929 and EIP-2539 +func makeSelfdestructGasFn(refundsEnabled bool) gasFunc { + gasFunc := func(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { + var ( + gas uint64 + address = common.Address(stack.Peek().Bytes20()) + ) + if !evm.StateDB.AddressInAccessList(address) { + // If the caller cannot afford the cost, this change will be rolled back + evm.StateDB.AddAddressToAccessList(address) + gas = params.ColdAccountAccessCostEIP2929 + } + // if empty and transfers value + if evm.StateDB.Empty(address) && evm.StateDB.GetBalance(contract.Address()).Sign() != 0 { + gas += params.CreateBySelfdestructGas + } + if refundsEnabled && !evm.StateDB.HasSuicided(contract.Address()) { + evm.StateDB.AddRefund(params.SelfdestructRefundGas) + } + return gas, nil + } + return gasFunc +} diff --git a/x/evm/core/vm/stack.go b/x/evm/core/vm/stack.go new file mode 100644 index 0000000000..e0c757f1f2 --- /dev/null +++ b/x/evm/core/vm/stack.go @@ -0,0 +1,146 @@ +// Copyright 2014 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package vm + +import ( + "fmt" + "sync" + + "github.com/holiman/uint256" +) + +var stackPool = sync.Pool{ + New: func() interface{} { + return &Stack{Data: make([]uint256.Int, 0, 16)} + }, +} + +// Stack is an object for basic stack operations. Items popped to the stack are +// expected to be changed and modified. stack does not take care of adding newly +// initialised objects. +type Stack struct { + Data []uint256.Int +} + +func NewStack() (*Stack, error) { + stack, ok := stackPool.Get().(*Stack) + if !ok { + return nil, fmt.Errorf("Type assertion failure: cannot get Stack pointer from stackPool") + } + return stack, nil +} + +func (st *Stack) Push(d *uint256.Int) { + // NOTE push limit (1024) is checked in baseCheck + st.Data = append(st.Data, *d) +} + +func (st *Stack) PushN(ds ...uint256.Int) { + // FIXME: Is there a way to pass args by pointers. + st.Data = append(st.Data, ds...) +} + +func (st *Stack) Pop() (ret uint256.Int) { + ret = st.Data[len(st.Data)-1] + st.Data = st.Data[:len(st.Data)-1] + return +} + +func (st *Stack) Cap() int { + return cap(st.Data) +} + +func (st *Stack) Swap(n int) { + st.Data[st.Len()-n], st.Data[st.Len()-1] = st.Data[st.Len()-1], st.Data[st.Len()-n] +} + +func (st *Stack) Dup(n int) { + st.Push(&st.Data[st.Len()-n]) +} + +func (st *Stack) Peek() *uint256.Int { + return &st.Data[st.Len()-1] +} + +func (st *Stack) Back(n int) *uint256.Int { + return &st.Data[st.Len()-n-1] +} + +func (st *Stack) Reset() { + st.Data = st.Data[:0] +} + +func (st *Stack) Len() int { + return len(st.Data) +} + +// Print dumps the content of the stack +func (st *Stack) Print() { + fmt.Println("### stack ###") + if len(st.Data) > 0 { + for i, val := range st.Data { + fmt.Printf("%-3d %v\n", i, val) + } + } else { + fmt.Println("-- empty --") + } + fmt.Println("#############") +} + +func ReturnNormalStack(s *Stack) { + s.Data = s.Data[:0] + stackPool.Put(s) +} + +var rStackPool = sync.Pool{ + New: func() interface{} { + return &ReturnStack{data: make([]uint32, 0, 10)} + }, +} + +func ReturnRStack(rs *ReturnStack) { + rs.data = rs.data[:0] + rStackPool.Put(rs) +} + +// ReturnStack is an object for basic return stack operations. +type ReturnStack struct { + data []uint32 +} + +func NewReturnStack() (*ReturnStack, error) { + rStack, ok := rStackPool.Get().(*ReturnStack) + if !ok { + return nil, fmt.Errorf("Type assertion failure: cannot get ReturnStack pointer from rStackPool") + } + return rStack, nil +} + +func (st *ReturnStack) Push(d uint32) { + st.data = append(st.data, d) +} + +// Pop A uint32 is sufficient as for code below 4.2G +func (st *ReturnStack) Pop() (ret uint32) { + ret = st.data[len(st.data)-1] + st.data = st.data[:len(st.data)-1] + return +} + +func (st *ReturnStack) Data() []uint32 { + return st.data +} diff --git a/x/evm/core/vm/stack_table.go b/x/evm/core/vm/stack_table.go new file mode 100644 index 0000000000..8f502f560a --- /dev/null +++ b/x/evm/core/vm/stack_table.go @@ -0,0 +1,45 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package vm + +import ( + "github.com/ethereum/go-ethereum/params" +) + +func minSwapStack(n int) int { + return minStack(n, n) +} + +func maxSwapStack(n int) int { + return maxStack(n, n) +} + +func minDupStack(n int) int { + return minStack(n, n+1) +} + +func maxDupStack(n int) int { + return maxStack(n, n+1) +} + +func maxStack(pop, push int) int { + return int(params.StackLimit) + pop - push +} + +func minStack(pops, _ int) int { + return pops +} diff --git a/x/evm/core/vm/testdata/precompiles/blake2F.json b/x/evm/core/vm/testdata/precompiles/blake2F.json new file mode 100644 index 0000000000..a25f9ae501 --- /dev/null +++ b/x/evm/core/vm/testdata/precompiles/blake2F.json @@ -0,0 +1,37 @@ +[ + { + "Input": "0000000048c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001", + "Expected": "08c9bcf367e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d282e6ad7f520e511f6c3e2b8c68059b9442be0454267ce079217e1319cde05b", + "Name": "vector 4", + "Gas": 0, + "NoBenchmark": false + }, + { + "Input": "0000000c48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001", + "Expected": "ba80a53f981c4d0d6a2797b69f12f6e94c212f14685ac4b74b12bb6fdbffa2d17d87c5392aab792dc252d5de4533cc9518d38aa8dbf1925ab92386edd4009923", + "Name": "vector 5", + "Gas": 12, + "NoBenchmark": false + }, + { + "Input": "0000000c48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000", + "Expected": "75ab69d3190a562c51aef8d88f1c2775876944407270c42c9844252c26d2875298743e7f6d5ea2f2d3e8d226039cd31b4e426ac4f2d3d666a610c2116fde4735", + "Name": "vector 6", + "Gas": 12, + "NoBenchmark": false + }, + { + "Input": "0000000148c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001", + "Expected": "b63a380cb2897d521994a85234ee2c181b5f844d2c624c002677e9703449d2fba551b3a8333bcdf5f2f7e08993d53923de3d64fcc68c034e717b9293fed7a421", + "Name": "vector 7", + "Gas": 1, + "NoBenchmark": false + }, + { + "Input": "007A120048c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001", + "Expected": "6d2ce9e534d50e18ff866ae92d70cceba79bbcd14c63819fe48752c8aca87a4bb7dcc230d22a4047f0486cfcfb50a17b24b2899eb8fca370f22240adb5170189", + "Name": "vector 8", + "Gas": 8000000, + "NoBenchmark": false + } +] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/precompiles/blsG1Add.json b/x/evm/core/vm/testdata/precompiles/blsG1Add.json new file mode 100644 index 0000000000..184d765aa1 --- /dev/null +++ b/x/evm/core/vm/testdata/precompiles/blsG1Add.json @@ -0,0 +1,730 @@ +[ + { + "Input": "0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e10000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e1", + "Expected": "000000000000000000000000000000000572cbea904d67468808c8eb50a9450c9721db309128012543902d0ac358a62ae28f75bb8f1c7c42c39a8c5529bf0f4e00000000000000000000000000000000166a9d8cabc673a322fda673779d8e3822ba3ecb8670e461f73bb9021d5fd76a4c56d9d4cd16bd1bba86881979749d28", + "Name": "bls_g1add_(g1+g1=2*g1)", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000572cbea904d67468808c8eb50a9450c9721db309128012543902d0ac358a62ae28f75bb8f1c7c42c39a8c5529bf0f4e00000000000000000000000000000000166a9d8cabc673a322fda673779d8e3822ba3ecb8670e461f73bb9021d5fd76a4c56d9d4cd16bd1bba86881979749d280000000000000000000000000000000009ece308f9d1f0131765212deca99697b112d61f9be9a5f1f3780a51335b3ff981747a0b2ca2179b96d2c0c9024e522400000000000000000000000000000000032b80d3a6f5b09f8a84623389c5f80ca69a0cddabc3097f9d9c27310fd43be6e745256c634af45ca3473b0590ae30d1", + "Expected": "0000000000000000000000000000000010e7791fb972fe014159aa33a98622da3cdc98ff707965e536d8636b5fcc5ac7a91a8c46e59a00dca575af0f18fb13dc0000000000000000000000000000000016ba437edcc6551e30c10512367494bfb6b01cc6681e8a4c3cd2501832ab5c4abc40b4578b85cbaffbf0bcd70d67c6e2", + "Name": "bls_g1add_(2*g1+3*g1=5*g1)", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "Expected": "0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e1", + "Name": "bls_g1add_(inf+g1=g1)", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "Name": "bls_g1add_(inf+inf=inf)", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000012196c5a43d69224d8713389285f26b98f86ee910ab3dd668e413738282003cc5b7357af9a7af54bb713d62255e80f560000000000000000000000000000000006ba8102bfbeea4416b710c73e8cce3032c31c6269c44906f8ac4f7874ce99fb17559992486528963884ce429a992fee000000000000000000000000000000000001101098f5c39893765766af4512a0c74e1bb89bc7e6fdf14e3e7337d257cc0f94658179d83320b99f31ff94cd2bac0000000000000000000000000000000003e1a9f9f44ca2cdab4f43a1a3ee3470fdf90b2fc228eb3b709fcd72f014838ac82a6d797aeefed9a0804b22ed1ce8f7", + "Expected": "000000000000000000000000000000001466e1373ae4a7e7ba885c5f0c3ccfa48cdb50661646ac6b779952f466ac9fc92730dcaed9be831cd1f8c4fefffd5209000000000000000000000000000000000c1fb750d2285d4ca0378e1e8cdbf6044151867c34a711b73ae818aee6dbe9e886f53d7928cc6ed9c851e0422f609b11", + "Name": "matter_g1_add_0", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000117dbe419018f67844f6a5e1b78a1e597283ad7b8ee7ac5e58846f5a5fd68d0da99ce235a91db3ec1cf340fe6b7afcdb0000000000000000000000000000000013316f23de032d25e912ae8dc9b54c8dba1be7cecdbb9d2228d7e8f652011d46be79089dd0a6080a73c82256ce5e4ed2000000000000000000000000000000000441e7f7f96198e4c23bd5eb16f1a7f045dbc8c53219ab2bcea91d3a027e2dfe659feac64905f8b9add7e4bfc91bec2b0000000000000000000000000000000005fc51bb1b40c87cd4292d4b66f8ca5ce4ef9abd2b69d4464b4879064203bda7c9fc3f896a3844ebc713f7bb20951d95", + "Expected": "0000000000000000000000000000000016b8ab56b45a9294466809b8e858c1ad15ad0d52cfcb62f8f5753dc94cee1de6efaaebce10701e3ec2ecaa9551024ea600000000000000000000000000000000124571eec37c0b1361023188d66ec17c1ec230d31b515e0e81e599ec19e40c8a7c8cdea9735bc3d8b4e37ca7e5dd71f6", + "Name": "matter_g1_add_1", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000008ab7b556c672db7883ec47efa6d98bb08cec7902ebb421aac1c31506b177ac444ffa2d9b400a6f1cbdc6240c607ee110000000000000000000000000000000016b7fa9adf4addc2192271ce7ad3c8d8f902d061c43b7d2e8e26922009b777855bffabe7ed1a09155819eabfa87f276f00000000000000000000000000000000114c3f11ba0b47551fa28f09f148936d6b290dc9f2d0534a83c32b0b849ab921ce6bcaa4ff3c917707798d9c74f2084f00000000000000000000000000000000149dc028207fb04a7795d94ea65e21f9952e445000eb954531ee519efde6901675d3d2446614d243efb77a9cfe0ca3ae", + "Expected": "0000000000000000000000000000000002ce7a08719448494857102da464bc65a47c95c77819af325055a23ac50b626df4732daf63feb9a663d71b7c9b8f2c510000000000000000000000000000000016117e87e9b55bd4bd5763d69d5240d30745e014b9aef87c498f9a9e3286ec4d5927df7cd5a2e54ac4179e78645acf27", + "Name": "matter_g1_add_2", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000015ff9a232d9b5a8020a85d5fe08a1dcfb73ece434258fe0e2fddf10ddef0906c42dcb5f5d62fc97f934ba900f17beb330000000000000000000000000000000009cfe4ee2241d9413c616462d7bac035a6766aeaab69c81e094d75b840df45d7e0dfac0265608b93efefb9a8728b98e4000000000000000000000000000000000c3d564ac1fe12f18f528c3750583ab6af8973bff3eded7bb4778c32805d9b17846cc7c687af0f46bc87de7748ab72980000000000000000000000000000000002f164c131cbd5afc85692c246157d38dc4bbb2959d2edfa6daf0a8b17c7a898aad53b400e8bdc2b29bf6688ee863db7", + "Expected": "0000000000000000000000000000000015510826f50b88fa369caf062ecdf8b03a67e660a35b219b44437a5583b5a9adf76991dce7bff9afc50257f847299504000000000000000000000000000000000a83e879895a1b47dbd6cd25ce8b719e7490cfe021614f7539e841fc2f9c09f071e386676de60b6579aa4bf6d37b13dd", + "Name": "matter_g1_add_3", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000017a17b82e3bfadf3250210d8ef572c02c3610d65ab4d7366e0b748768a28ee6a1b51f77ed686a64f087f36f641e7dca900000000000000000000000000000000077ea73d233ccea51dc4d5acecf6d9332bf17ae51598f4b394a5f62fb387e9c9aa1d6823b64a074f5873422ca57545d30000000000000000000000000000000019fe3a64361fea14936ff0b3e630471494d0c0b9423e6a004184a2965221c18849b5ed0eb2708a587323d8d6c6735a90000000000000000000000000000000000340823d314703e5efeb0a65c23069199d7dfff8793aaacb98cdcd6177fc8e61ab3294c57bf13b4406266715752ef3e6", + "Expected": "00000000000000000000000000000000010b1c96d3910f56b0bf54da5ae8c7ab674a07f8143b61fed660e7309e626dc73eaa2b11886cdb82e2b6735e7802cc860000000000000000000000000000000002dabbbedd72872c2c012e7e893d2f3df1834c43873315488d814ddd6bfcca6758a18aa6bd02a0f3aed962cb51f0a222", + "Name": "matter_g1_add_4", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000c1243478f4fbdc21ea9b241655947a28accd058d0cdb4f9f0576d32f09dddaf0850464550ff07cab5927b3e4c863ce90000000000000000000000000000000015fb54db10ffac0b6cd374eb7168a8cb3df0a7d5f872d8e98c1f623deb66df5dd08ff4c3658f2905ec8bd02598bd4f90000000000000000000000000000000001461565b03a86df363d1854b4af74879115dffabeddfa879e2c8db9aa414fb291a076c3bdf0beee82d9c094ea8dc381a000000000000000000000000000000000e19d51ab619ee2daf25ea5bfa51eb217eabcfe0b5cb0358fd2fa105fd7cb0f5203816b990df6fda4e0e8d541be9bcf6", + "Expected": "000000000000000000000000000000000cb40d0bf86a627d3973f1e7846484ffd0bc4943b42a54ff9527c285fed3c056b947a9b6115824cabafe13cd1af8181c00000000000000000000000000000000076255fc12f1a9dbd232025815238baaa6a3977fd87594e8d1606caec0d37b916e1e43ee2d2953d75a40a7ba416df237", + "Name": "matter_g1_add_5", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000328f09584b6d6c98a709fc22e184123994613aca95a28ac53df8523b92273eb6f4e2d9b2a7dcebb474604d54a210719000000000000000000000000000000001220ebde579911fe2e707446aaad8d3789fae96ae2e23670a4fd856ed82daaab704779eb4224027c1ed9460f39951a1b0000000000000000000000000000000019cabba3e09ad34cc3d125e0eb41b527aa48a4562c2b7637467b2dbc71c373897d50eed1bc75b2bde8904ece5626d6e400000000000000000000000000000000056b0746f820cff527358c86479dc924a10b9f7cae24cd495625a4159c8b71a8c3ad1a15ebf22d3561cd4b74e8a6e48b", + "Expected": "000000000000000000000000000000000e115e0b61c1f1b25cc10a7b3bd21cf696b1433a0c366c2e1bca3c26b09482c6eced8c8ecfa69ce6b9b3b4419779262e00000000000000000000000000000000077b85daf61b9f947e81633e3bc64e697bc6c1d873f2c21e5c4c3a11302d4d5ef4c3ff5519564729aaf2a50a3c9f1196", + "Name": "matter_g1_add_6", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000002ebfa98aa92c32a29ebe17fcb1819ba82e686abd9371fcee8ea793b4c72b6464085044f818f1f5902396df0122830cb00000000000000000000000000000000001184715b8432ed190b459113977289a890f68f6085ea111466af15103c9c02467da33e01d6bff87fd57db6ccba442a0000000000000000000000000000000011f649ee35ff8114060fc5e4df9ac828293f6212a9857ca31cb3e9ce49aa1212154a9808f1e763bc989b6d5ba7cf09390000000000000000000000000000000019af81eca7452f58c1a6e99fab50dc0d5eeebc7712153e717a14a31cffdfd0a923dbd585e652704a174905605a2e8b9d", + "Expected": "000000000000000000000000000000000013e37a8950a659265b285c6fb56930fb77759d9d40298acac2714b97b83ec7692a7d1c4ccb83f074384db9eedd809c0000000000000000000000000000000003215d524d6419214568ba42a31502f2a58a97d0139c66908e9d71755f5a7666567aafe30ea84d89308f06768f28a648", + "Name": "matter_g1_add_7", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000009d6424e002439998e91cd509f85751ad25e574830c564e7568347d19e3f38add0cab067c0b4b0801785a78bcbeaf246000000000000000000000000000000000ef6d7db03ee654503b46ff0dbc3297536a422e963bda9871a8da8f4eeb98dedebd6071c4880b4636198f4c2375dc795000000000000000000000000000000000d713e148769fac2efd380886f8566c6d4662dd38317bb7e68744c4339efaedbab88435ce3dc289afaa7ecb37df37a5300000000000000000000000000000000129d9cd031b31c77a4e68093dcdbb585feba786207aa115d9cf120fe4f19ca31a0dca9c692bd0f53721d60a55c333129", + "Expected": "00000000000000000000000000000000029405b9615e14bdac8b5666bbc5f3843d4bca17c97bed66d164f1b58d2a148f0f506d645d665a40e60d53fe29375ed400000000000000000000000000000000162761f1712814e474beb2289cc50519253d680699b530c2a6477f727ccc75a19681b82e490f441f91a3c611eeb0e9e2", + "Name": "matter_g1_add_8", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000002d1cdb93191d1f9f0308c2c55d0208a071f5520faca7c52ab0311dbc9ba563bd33b5dd6baa77bf45ac2c3269e945f4800000000000000000000000000000000072a52106e6d7b92c594c4dacd20ef5fab7141e45c231457cd7e71463b2254ee6e72689e516fa6a8f29f2a173ce0a1900000000000000000000000000000000006d92bcb599edca426ff4ceeb154ebf133c2dea210c7db0441f74bd37c8d239149c8b5056ace0bfefb1db04b42664f530000000000000000000000000000000008522fc155eef6d5746283808091f91b427f2a96ac248850f9e3d7aadd14848101c965663fd4a63aea1153d71918435a", + "Expected": "000000000000000000000000000000000cfaa8df9437c0b6f344a0c8dcbc7529a07aec0d7632ace89af6796b6b960b014f78dd10e987a993fb8a95cc909822ec0000000000000000000000000000000007475f115f6eb35f78ba9a2b71a44ccb6bbc1e980b8cd369c5c469565f3fb798bc907353cf47f524ba715deaedf379cb", + "Name": "matter_g1_add_9", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000000641642f6801d39a09a536f506056f72a619c50d043673d6d39aa4af11d8e3ded38b9c3bbc970dbc1bd55d68f94b50d0000000000000000000000000000000009ab050de356a24aea90007c6b319614ba2f2ed67223b972767117769e3c8e31ee4056494628fb2892d3d37afb6ac9430000000000000000000000000000000016380d03b7c5cc3301ffcb2cf7c28c9bde54fc22ba2b36ec293739d8eb674678c8e6461e34c1704747817c8f8341499a000000000000000000000000000000000ec6667aa5c6a769a64c180d277a341926376c39376480dc69fcad9a8d3b540238eb39d05aaa8e3ca15fc2c3ab696047", + "Expected": "0000000000000000000000000000000011541d798b4b5069e2541fa5410dad03fd02784332e72658c7b0fa96c586142a967addc11a7a82bfcee33bd5d07066b900000000000000000000000000000000195b3fcb94ab7beb908208283b4e5d19c0af90fca4c76268f3c703859dea7d038aca976927f48839ebc7310869c724aa", + "Name": "matter_g1_add_10", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000fd4893addbd58fb1bf30b8e62bef068da386edbab9541d198e8719b2de5beb9223d87387af82e8b55bd521ff3e47e2d000000000000000000000000000000000f3a923b76473d5b5a53501790cb02597bb778bdacb3805a9002b152d22241ad131d0f0d6a260739cbab2c2fe602870e00000000000000000000000000000000065eb0770ab40199658bf87db6c6b52cd8c6c843a3e40dd60433d4d79971ff31296c9e00a5d553df7c81ade533379f4b0000000000000000000000000000000017a6f6137ddd90c15cf5e415f040260e15287d8d2254c6bfee88938caec9e5a048ff34f10607d1345ba1f09f30441ef4", + "Expected": "0000000000000000000000000000000006b0853b3d41fc2d7b27da0bb2d6eb76be32530b59f8f537d227a6eb78364c7c0760447494a8bba69ef4b256dbef750200000000000000000000000000000000166e55ba2d20d94da474d4a085c14245147705e252e2a76ae696c7e37d75cde6a77fea738cef045182d5e628924dc0bb", + "Name": "matter_g1_add_11", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000002cb4b24c8aa799fd7cb1e4ab1aab1372113200343d8526ea7bc64dfaf926baf5d90756a40e35617854a2079cd07fba40000000000000000000000000000000003327ca22bd64ebd673cc6d5b02b2a8804d5353c9d251637c4273ad08d581cc0d58da9bea27c37a0b3f4961dbafd276b0000000000000000000000000000000006a3f7eb0e42567210cc1ba5e6f8c42d02f1eef325b6483fef49ba186f59ab69ca2284715b736086d2a0a1f0ea224b40000000000000000000000000000000000bc08427fda31a6cfbe657a8c71c73894a33700e93e411d42f1471160c403b939b535070b68d60a4dc50e47493da63dc", + "Expected": "000000000000000000000000000000000c35d4cd5d43e9cf52c15d46fef521666a1e1ab9f0b4a77b8e78882e9fab40f3f988597f202c5bd176c011a56a1887d4000000000000000000000000000000000ae2b5c24928a00c02daddf03fade45344f250dcf4c12eda06c39645b4d56147cb239d95b06fd719d4dc20fe332a6fce", + "Name": "matter_g1_add_12", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000024ad70f2b2105ca37112858e84c6f5e3ffd4a8b064522faae1ecba38fabd52a6274cb46b00075deb87472f11f2e67d90000000000000000000000000000000010a502c8b2a68aa30d2cb719273550b9a3c283c35b2e18a01b0b765344ffaaa5cb30a1e3e6ecd3a53ab67658a578768100000000000000000000000000000000068e79aea45b7199ec4b6f26e01e88ec76533743639ce76df66937fff9e7de3edf6700d227f10f43e073afcc63e2eddc00000000000000000000000000000000039c0b6d9e9681401aeb57a94cedc0709a0eff423ace9253eb00ae75e21cabeb626b52ef4368e6a4592aed9689c6fca4", + "Expected": "0000000000000000000000000000000013bad27dafa20f03863454c30bd5ae6b202c9c7310875da302d4693fc1c2b78cca502b1ff851b183c4b2564c5d3eb4dc0000000000000000000000000000000000552b322b3d672704382b5d8b214c225b4f7868f9c5ae0766b7cdb181f97ed90a4892235915ffbc0daf3e14ec98a606", + "Name": "matter_g1_add_13", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000000704cc57c8e0944326ddc7c747d9e7347a7f6918977132eea269f161461eb64066f773352f293a3ac458dc3ccd5026a000000000000000000000000000000001099d3c2bb2d082f2fdcbed013f7ac69e8624f4fcf6dfab3ee9dcf7fbbdb8c49ee79de40e887c0b6828d2496e3a6f7680000000000000000000000000000000000adac9bb98bb6f35a8f941dbff39dfd307b6a4d5756ccae103c814564e3d3993a8866ff91581ccdd7686c1dce0b19f700000000000000000000000000000000083d235e0579032ca47f65b6ae007ce8ffd2f1a890ce3bc45ebd0df6673ad530d2f42125d543cb0c51ba0c28345729d8", + "Expected": "000000000000000000000000000000000b5513e42f5217490f395a8cb3673a4fc35142575f770af75ecf7a4fcd97eee215c4298fc4feab51915137cbdb814839000000000000000000000000000000000e9d4db04b233b0b12a7ff620faefef906aeb2b15481ce1609dad50eb6a7d0c09a850375599c501296219fb7b288e305", + "Name": "matter_g1_add_14", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000130535a29392c77f045ac90e47f2e7b3cffff94494fe605aad345b41043f6663ada8e2e7ecd3d06f3b8854ef92212f42000000000000000000000000000000001699a3cc1f10cd2ed0dc68eb916b4402e4f12bf4746893bf70e26e209e605ea89e3d53e7ac52bd07713d3c8fc671931d000000000000000000000000000000000d5bb4fa8b494c0adf4b695477d4a05f0ce48f7f971ef53952f685e9fb69dc8db1603e4a58292ddab7129bb5911d6cea0000000000000000000000000000000004a568c556641f0e0a2f44124b77ba70e4e560d7e030f1a21eff41eeec0d3c437b43488c535cdabf19a70acc777bacca", + "Expected": "000000000000000000000000000000000c27ef4ebf37fd629370508f4cd062b74faa355b305d2ee60c7f4d67dd741363f18a7bbd368cdb17e848f372a5e33a6f0000000000000000000000000000000000ed833df28988944115502f554636e0b436cccf845341e21191e82d5b662482f32c24df492da4c605a0f9e0f8b00604", + "Name": "matter_g1_add_15", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001830f52d9bff64a623c6f5259e2cd2c2a08ea17a8797aaf83174ea1e8c3bd3955c2af1d39bfa474815bfe60714b7cd80000000000000000000000000000000000874389c02d4cf1c61bc54c4c24def11dfbe7880bc998a95e70063009451ee8226fec4b278aade3a7cea55659459f1d500000000000000000000000000000000091ee883cb9ea2c933f6645f0f4c535a826d95b6da6847b4fe2349342bd4bd496e0dd546df7a7a17a4b9fb8349e5064f000000000000000000000000000000000902d7e72242a5e6b068ca82d0cb71dc0f51335dbd302941045319f9a06777518b56a6e0b0b0c9fd8f1edf6b114ad331", + "Expected": "00000000000000000000000000000000122cce99f623944dfebffcdf6b0a0a3696162f35053e5952dddc2537421c60da9fe931579d1c4fc2e31082b6c25f96b500000000000000000000000000000000011366ffa91dc0b7da8b7c1839ea84d49299310f5c1ca244012eed0dd363dbcf4ad5813b8e3fb49361ef05ea8cb18ffe", + "Name": "matter_g1_add_16", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000043c4ff154778330b4d5457b7811b551dbbf9701b402230411c527282fb5d2ba12cb445709718d5999e79fdd74c0a67000000000000000000000000000000000013a80ede40df002b72f6b33b1f0e3862d505efbe0721dce495d18920d542c98cdd2daf5164dbd1a2fee917ba943debe0000000000000000000000000000000000d3d4f11bc79b8425b77d25698b7e151d360ebb22c3a6afdb227de72fe432dcd6f0276b4fd3f1fcc2da5b59865053930000000000000000000000000000000015ac432071dc23148765f198ed7ea2234662745a96032c215cd9d7cf0ad8dafb8d52f209983fe98aaa2243ecc2073f1b", + "Expected": "000000000000000000000000000000000113ccf11264ff04448f8c58b279a6a49acb386750c2051eab2c90fa8b8e03d7c5b9e87eccf36b4b3f79446b80be7b1d0000000000000000000000000000000004358a1fabfe803f4c787a671196b593981a837ee78587225fb21d5a883b98a15b912862763b94d18b971cb7e37dbcf0", + "Name": "matter_g1_add_17", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000009f9a78a70b9973c43182ba54bb6e363c6984d5f7920c1d347c5ff82e6093e73f4fb5e3cd985c9ddf9af936b16200e880000000000000000000000000000000008d7489c2d78f17b2b9b1d535f21588d8761b8fb323b08fa9af8a60f39b26e98af76aa883522f21e083c8a14c2e7edb600000000000000000000000000000000034f725766897ed76394145da2f02c92c66794a51fd5ae07bd7cc60c013d7a48ebf1b07faf669dfed74d82d07e48d1150000000000000000000000000000000018f4926a3d0f740988da25379199ecb849250239ad7efcfef7ffaa43bc1373166c0448cc30dcdbd75ceb71f76f883ea7", + "Expected": "00000000000000000000000000000000167336aeeb9e447348156936849d518faee314c291c84d732fa3c1bd3951559230d94230e37a08e28e689e9d1fef05770000000000000000000000000000000005366535f7a68996e066ab80c55bb372a15fb0ed6634585b88fe7cafbf818fbfebbf6f6ddd9ca0ff72137594a1e84b35", + "Name": "matter_g1_add_18", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000010fcfe8af8403a52400bf79e1bd0058f66b9cab583afe554aa1d82a3e794fffad5f0e19d385263b2dd9ef69d1154f10a000000000000000000000000000000000aba6a0b58b49f7c6c2802afd2a5ed1320bf062c7b93135f3c0ed7a1d7b1ee27b2b986cde732a60fa585ca6ab7cc154b00000000000000000000000000000000079e5a154cf84190b6c735bc8cd968559182166568649b813732e4fb4c5c428c8b38e8265d4ef04990c49aa1381f51c8000000000000000000000000000000000ae08e682ef92b4986a5ac5d4f094ad0919c826a97efe8d8120a96877766eae5828803804a0cae67df9822fd18622aae", + "Expected": "000000000000000000000000000000000a3d66cf87b1ce8c5683d71a6de4bf829d094041240f56d9071aa84ff189a06940e8e1935127e23a970c78ca73c28bf6000000000000000000000000000000000b2adda87740873c0c59e3ebde44d33834773f0fe69e2f5e7ede99c4f928978a5caaede7262e45fd22136a394b3f7858", + "Name": "matter_g1_add_19", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000013c5ebfb853f0c8741f12057b6b845c4cdbf72aecbeafc8f5b5978f186eead8685f2f3f125e536c465ade1a00f212b0900000000000000000000000000000000082543b58a13354d0cce5dc3fb1d91d1de6d5927290b2ff51e4e48f40cdf2d490730843b53a92865140153888d73d4af0000000000000000000000000000000008cefd0fd289d6964a962051c2c2ad98dab178612663548370dd5f007c5264fece368468d3ca8318a381b443c68c4cc7000000000000000000000000000000000708d118d44c1cb5609667fd51df9e58cacce8b65565ef20ad1649a3e1b9453e4fb37af67c95387de008d4c2114e5b95", + "Expected": "0000000000000000000000000000000004b2311897264fe08972d62872d3679225d9880a16f2f3d7dd59412226e5e3f4f2aa8a69d283a2dc5b93e022293f0ee1000000000000000000000000000000000f03e18cef3f9a86e6b842272f2c7ee48d0ad23bfc7f1d5a9a796d88e5d5ac31326db5fe90de8f0690c70ae6e0155039", + "Name": "matter_g1_add_20", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000053a12f6a1cb64272c34e042b7922fabe879275b837ba3b116adfe1eb2a6dc1c1fa6df40c779a7cdb8ed8689b8bc5ba800000000000000000000000000000000097ec91c728ae2d290489909bbee1a30048a7fa90bcfd96fe1d9297545867cbfee0939f20f1791329460a4fe1ac719290000000000000000000000000000000008e5afc16d909eb9d8bdaaf229ad291f34f7baf5247bbd4cc938278f1349adb4b0f0aacd14799c01d0ca2ed38c937d600000000000000000000000000000000006cf972c64e20403c82fee901c90eaa5547460d57cce2565fd091ff9bc55e24584595c9182298f148882d6949c36c9d5", + "Expected": "000000000000000000000000000000000caf46f480ae2ea8e700f7913c505d5150c4629c9137e917357d2a4ba8a7a1c63b8f6e2978293755952fbed7f0ad8d6d0000000000000000000000000000000002e62e715b72eebbc7c366a2390318f73e69203a9533e72340aab568f65105129ffc9889a8bc00a692494d93688c7ec0", + "Name": "matter_g1_add_21", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001354dd8a230fde7c983dcf06fa9ac075b3ab8f56cdd9f15bf870afce2ae6e7c65ba91a1df6255b6f640bb51d7fed302500000000000000000000000000000000130f139ca118869de846d1d938521647b7d27a95b127bbc53578c7b66d88d541adb525e7028a147bf332607bd760deac0000000000000000000000000000000013a6439e0ec0fabe93f6c772e102b96b1f692971d7181c386f7f8a360daca6e5f99772e1a736f1e72a17148d90b08efe0000000000000000000000000000000010f27477f3171dcf74498e940fc324596ef5ec6792be590028c2963385d84ef8c4bbb12c6eb3f06b1afb6809a2cb0358", + "Expected": "000000000000000000000000000000000dea57d1fc19f994e6bdda9478a400b0ada23aed167bfe7a16ef79b6aa020403a04d554303c0b2a9c5a38f85cf6f3800000000000000000000000000000000000b8d76ccd41ba81a835775185bbf1d6bf94b031d94d5c78b3b97beb24cf246b0c25c4c309e2c06ae9896ed800169eeee", + "Name": "matter_g1_add_22", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000003f76a6dc6da31a399b93f4431bfabb3e48d86745eaa4b24d6337305006e3c7fc7bfcc85c85e2f3514cd389fec4e70580000000000000000000000000000000010e4280374c532ed0df44ac0bac82572f839afcfb8b696eea617d5bd1261288dfa90a7190200687d470992fb4827ff320000000000000000000000000000000005728a219d128bc0a1f851f228e2bf604a72400c393cfb0d3484456b6b28a2c5061198656f0e106bbe257d849be159040000000000000000000000000000000011f6d08baa91fb2c8b36191d5b2318e355f8964cc8112838394ba1ded84b075de58d90452601dcfc9aa8a275cfec695d", + "Expected": "0000000000000000000000000000000012e6d6c518c15cfd3020181ff3f829e29140b3b507b99251cc7f31795128adec817750296bce413bac18b9a80f69ca5000000000000000000000000000000000131ee9b748f6f1eb790adeb9edd0e79d89a9908368f5a6bb82ee0c913061cdfffe75d9ba411a49aa3f9194ee6d4d08a9", + "Name": "matter_g1_add_23", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000009439f061c7d5fada6e5431c77fd093222285c98449951f6a6c4c8f225b316144875bc764be5ca51c7895773a9f1a640000000000000000000000000000000000ebdef273e2288c784c061bef6a45cd49b0306ac1e9faab263c6ff73dea4627189c8f10a823253d86a8752769cc4f8f200000000000000000000000000000000171696781ba195f330241584e42fb112adf9b8437b54ad17d410892b45c7d334e8734e25862604d1b679097590b8ab0a000000000000000000000000000000001879328fdf0d1fb79afd920e0b0a386828be5b8e0e6024dfeea800ffcb5c65f9044061af26d639d4dcc27bcb5ba1481a", + "Expected": "00000000000000000000000000000000111c416d5bd018a77f3317e3fbf4b03d8e19658f2b810dc9c17863310dfb09e1c4ffdbb7c98951d357f1c3d93c5d0745000000000000000000000000000000000af0a252bff336d5eb3a406778557ef67d91776a9c788be9a76cff7727f519a70fc7809f1a50a58d29185cb9722624fd", + "Name": "matter_g1_add_24", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001478ee0ffebf22708a6ab88855081daba5ee2f279b5a2ee5f5f8aec8f97649c8d5634fec3f8b28ad60981e6f29a091b10000000000000000000000000000000011efaeec0b1a4057b1e0053263afe40158790229c5bfb08062c90a252f59eca36085ab35e4cbc70483d29880c5c2f8c2000000000000000000000000000000000231b0d6189a4faad082ce4a69398c1734fcf35d222b7bce22b14571033a1066b049ae3cd3bd6c8cec5bec743955cdd600000000000000000000000000000000037375237fb71536564ea693ab316ae11722aadd7cab12b17b926c8a31bd13c4565619e8c894bffb960e632896856bbe", + "Expected": "000000000000000000000000000000000d2b9c677417f4e9b38af6393718f55a27dbd23c730796c50472bc476ebf52172559b10f6ceb81e644ec2d0a41b3bb01000000000000000000000000000000001697f241ff6eceb05d9ada4be7d7078ecbbffa64dd4fb43ead0692eef270cb7cc31513ee4bf38a1b1154fe008a8b836a", + "Name": "matter_g1_add_25", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000150d43c64cb1dbb7b981f455e90b740918e2d63453ca17d8eeecb68e662d2581f8aa1aea5b095cd8fc2a941d6e2728390000000000000000000000000000000006dc2ccb10213d3f6c3f10856888cb2bf6f1c7fcb2a17d6e63596c29281682cafd4c72696ecd6af3cce31c440144ebd10000000000000000000000000000000015653d1c5184736cdc78838be953390d12b307d268b394136b917b0462d5e31b8f1b9d96cce8f7a1203c2cae93db6a4000000000000000000000000000000000060efeece033ac711d500c1156e4b6dce3243156170c94bc948fd7beae7b28a31463a44872ca22ca49dc5d4d4dd27d1c", + "Expected": "0000000000000000000000000000000003996050756117eeab27a5e4fa9acdde2a1161d6fbfff2601a1c7329f900e93a29f55a8073f85be8f7c2a4d0323e95cc00000000000000000000000000000000010b195a132c1cba2f1a6a73f2507baa079e9b5cb8894ea78bebc16d4151ee56fe562b16e2741f3ab1e8640cdad83180", + "Name": "matter_g1_add_26", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000f46bb86e827aa9c0c570d93f4d7d6986668c0099e4853927571199e1ce9e756d9db951f5b0325acafb2bf6e8fec2a1b0000000000000000000000000000000006d38cc6cc1a950a18e92e16287f201af4c014aba1a17929dd407d0440924ce5f08fad8fe0c50f7f733b285bf282acfc0000000000000000000000000000000018adb42928304cbc310a229306a205e7c21cdb31b9e5daf0ff6bb9437acee80cd8cf02b35dab823155d60f8a83fde5cc0000000000000000000000000000000018b57460c81cab43235be79c8c90dcda40fafcaf69e4e767133aee56308a6df07eac71275597dd8ed6607ffb9151ed9a", + "Expected": "0000000000000000000000000000000003c7a7ee3d1b73cf1f0213404363bf3c0de4425ab97d679ed51448e877b7537400f148f14eba588ed241fea34e56d465000000000000000000000000000000000c581b5070e6bb8582b7ee2cd312dfeb5aaf0b0da95cf5a22a505ffba21fc204e26a5e17311d1f47113653ff13349f57", + "Name": "matter_g1_add_27", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000010cde0dbf4e18009c94ba648477624bbfb3732481d21663dd13cea914d6c54ec060557010ebe333d5e4b266e1563c631000000000000000000000000000000000fb24d3d4063fd054cd5b7288498f107114ff323226aca58d3336444fc79c010db15094ceda6eb99770c168d459f0da00000000000000000000000000000000001da65df8574a864ab454e5f2fa929405501bb73c3162a600979a1145586079361c89839cc0c5a07f1135c94bf059f9c0000000000000000000000000000000002560df402c0550662a2c4c463ad428ab6e60297fbc42a6484107e397ae016b58494d1c46ac4952027aa8c0896c50be3", + "Expected": "000000000000000000000000000000000d7a539b679e5858271a6f9cf20108410eb5d5d2b1a905e09a8aa20318efbe9175450385d78389f08f836f5634f7a2f0000000000000000000000000000000000fb624e5f6c4c814b7d73eb63b70237c5de7d90d19ac81cac776d86171a8d307d3cc8c56da14f444fe8cf329ab7e63dd", + "Name": "matter_g1_add_28", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000008c0a4c543b7506e9718658902982b4ab7926cd90d4986eceb17b149d8f5122334903300ad419b90c2cb56dc6d2fe976000000000000000000000000000000000824e1631f054b666893784b1e7edb44b9a53596f718a6e5ba606dc1020cb6e269e9edf828de1768df0dd8ab8440e0530000000000000000000000000000000005311c11f4d0bb8542f3b60247c1441656608e5ac5c363f4d62127cecb88800a771767cf23a0e7c45f698ffa5015061f0000000000000000000000000000000018f7f1d23c8b0566a6a1fcb58d3a5c6fd422573840eb04660c3c6ba65762ed1becc756ac6300e9ce4f5bfb962e963419", + "Expected": "0000000000000000000000000000000000849bbc7b0226b18abbcb4c9a9e78dca2f5f75a2cbb983bd95ff3a95b427b1a01fd909ce36384c49eb88ffb8ff77bb000000000000000000000000000000000087d8d28d92305b5313ca533a6b47f454ddce1c2d0fa3574b255128ef0b145fa4158beb07e4f0d50d6b7b90ea8a8ea8a", + "Name": "matter_g1_add_29", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000159d94fb0cf6f4e3e26bdeb536d1ee9c511a29d32944da43420e86c3b5818e0f482a7a8af72880d4825a50fee6bc8cd8000000000000000000000000000000000c2ffe6be05eccd9170b6c181966bb8c1c3ed10e763613112238cabb41370e2a5bb5fef967f4f8f2af944dbef09d265e000000000000000000000000000000000c8e293f730253128399e5c39ab18c3f040b6cd9df10d794a28d2a428a9256ea1a71cf53022bd1be11f501805e0ddda40000000000000000000000000000000003e60c2291be46900930f710969f79f27e76cf710efefc243236428db2fed93719edeeb64ada0edf6346a0411f2a4cb8", + "Expected": "00000000000000000000000000000000191084201608f706ea1f7c51dd5b593dda87b15d2c594b52829db66ce3beab6b30899d1d285bdb9590335949ceda5f050000000000000000000000000000000000d3460622c7f1d849658a20a7ae7b05e5afae1f01e871cad52ef632cc831b0529a3066f7b81248a7728d231e51fc4ad", + "Name": "matter_g1_add_30", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000019c822a4d44ac22f6fbaef356c37ceff93c1d6933e8c8f3b55784cfe62e5705930be48607c3f7a4a2ca146945cad6242000000000000000000000000000000000353d6521a17474856ad69582ce225f27d60f5a8319bea8cefded2c3f6b862d76fe633c77ed8ccdf99d2b10430253fc80000000000000000000000000000000013267db8fdf8f488a2806fead5cffdcbb7b1b4b7681a2b67d322cd7f5985c65d088c70cdc2638e679ed678cae3cc63c80000000000000000000000000000000007757233ad6d38d488c3d9d8252b41e4ab7ee54e4ef4bbf171402df57c14f9977dd3583c6c8f9b5171b368d61f082447", + "Expected": "000000000000000000000000000000000c06fef6639ab7dceb44dc648ca6a7d614739e40e6486ee9fc01ecc55af580d98abc026c630a95878da7b6d5701d755c0000000000000000000000000000000007c9a7f2bc7fa1f65c9e3a1e463eb4e3283e47bb5490938edb12abf6c8f5a9b56d8ce7a81a60df67db8c399a9a1df1d4", + "Name": "matter_g1_add_31", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000189bf269a72de2872706983835afcbd09f6f4dfcabe0241b4e9fe1965a250d230d6f793ab17ce7cac456af7be4376be6000000000000000000000000000000000d4441801d287ba8de0e2fb6b77f766dbff07b4027098ce463cab80e01eb31d9f5dbd7ac935703d68c7032fa5128ff17000000000000000000000000000000001975bc52669187f27a86096ae6bf2d60178706105d15bce8fe782759f14e449bc97cb1570e87eec5f12214a9ae0e0170000000000000000000000000000000000ca6106d6e6487a3b6f00fc2af769d21cb3b83b5dc03db19e4824fc28fd9b3d9f7a986e79f05c02b3a914ff26c7a78d6", + "Expected": "0000000000000000000000000000000002fbf4fba68ae416b42a99f3b26916dea464d662cebce55f4545481e5ab92d3c40f3e189504b54db4c9cd51ecdd60e8d0000000000000000000000000000000008e81e094c6d4ded718ef63c5edfacb2d258f48ccfa37562950c607299bb2dca18e680a620dff8c72dedc89b4e9d4759", + "Name": "matter_g1_add_32", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000003299542a0c40efbb55d169a92ad11b4d6d7a6ed949cb0d6477803fbedcf74e4bd74de854c4c8b7f200c85c8129292540000000000000000000000000000000013a3d49e58274c2b4a534b95b7071b6d2f42b17b887bf128627c0f8894c19d3d69c1a419373ca4bd1bb6d4efc78e1d3f00000000000000000000000000000000109f6168a719add6ea1a14f9dc95345e325d6b0e56da2f4ecff8408536446894069fa61e81bdaebfc96b13b402fad865000000000000000000000000000000001806aa27c576f4c4fa8a6db49d577cd8f257a8450e89b061cbc7773c0b5434f06bacf12b479abf6847f537c4cbefcb46", + "Expected": "0000000000000000000000000000000014e0bd4397b90a3f96240daf835d5fb05da28a64538f4bf42d9e7925a571f831c6e663910aa37dcc265ddd7938d83045000000000000000000000000000000001695d405d4f8ba385ebf4ad25fb3f34c65977217e90d6e5ed5085b3e5b0b143194f82e6c25766d28ad6c63114ca9dcdf", + "Name": "matter_g1_add_33", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000121b540a0465b39f2f093112c20a9822fc82497105778937c9d5cdcfe039d62998d47d4f41c76482c31f39a79352beda0000000000000000000000000000000014a461f829e0a76ba89f42eb57dffb4f5544df2008163bd0ea1af824f7ff910b27418a0e4f86cb8046dc1f3139cab9af0000000000000000000000000000000019d3623a7866933e2d73214ceb2e56097a1b047db5943c3ecb846890aa02250126e90fc76a729a952cef895bd154cc7d000000000000000000000000000000000e87c376bbd695a356ef72226ac7ef6a550d99e9693d8485770a686e568ae28c038ee201d3f2ea38362046236ade91cd", + "Expected": "000000000000000000000000000000000ffeab47985bd9b3e10ce27c6636bbda336dcf540cd37eccc3faec2adff2d97dd126633bd83a7d3c8c73c3623bdf0ba2000000000000000000000000000000001992eca4b1e924b360d57ca98b543ab496a8b55bd288d23f03bcc1b22f6bc76d95b12f47c3e305812097253c73b876dd", + "Name": "matter_g1_add_34", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001383bc4d6c748d5c76ab4ba04f8fcd4c0fed9a49ea080c548893440819833ad72a8249f77391d5fbff78329eb319d3830000000000000000000000000000000016404bd07b6c6480af2d23301940e61817ee2e61fc625c100b31e1b324c369a583b61048dd57ab97b80b1fe6cd64c5c300000000000000000000000000000000163aaecf83d6c77a5d7417e73f5cf9d71a6aedfd194b2f3b53c608d06a228190f4f79ac57b029d77504c72744df4ecc0000000000000000000000000000000000416e6f9ca188d16daa2c28acd6a594f8fcb990eaa26e60ca2a34dfcad7ad76c425b241acedf674d48d298d0df0f824d", + "Expected": "000000000000000000000000000000001812bcb26fa05e0ab5176e703699ab16f5ef8917a33a9626ae6ff20f2a6f4a9d5e2afe3a11f57061cbaa992e1f30477f000000000000000000000000000000000680acf0b632cb48017cb80baa93753d030aa4b49957178d8a10d1d1a27bbdc89ac6811a91868b2c181c5c0b9b6caf86", + "Name": "matter_g1_add_35", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000006bc68c6510c15a5d7bc6eebce04f7c5fce3bb02f9f89ea14ab0dfb43645b6346af7e25a8e044e842b7a3d06fe9b1a0300000000000000000000000000000000053ee41f6a51c49b069f12de32e3e6b0b355cd2c3ba87a149c7de86136a5d9c5b7b59f2d1237964e548d1b62ec36c8db000000000000000000000000000000000aba7362eee717d03ef2d4f0fef2763822115fcc8fb9e2e8243683b6c1cde799ebc78f23812e557de2cc38e2b4a2e56700000000000000000000000000000000170833db69b3f067cf5c4c4690857e6711c9e3fcad91ca7cd045e9d2f38c7b31236960e8718f5dd4c8bfb4de76c6c9b9", + "Expected": "00000000000000000000000000000000196ffe76a4b726fa8dd720cc1cd04c040724cb18ec10915e312eaa90d124100b08f0ce3a7fc888f46914319a3d7581f4000000000000000000000000000000000e2612357059ca6dbb64efb98ef19370560c9e83e2aad7ab2d9015e2444fe4d8c796b5577584aac9f63258beb5ae863c", + "Name": "matter_g1_add_36", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000024ca57c2dc2a7deec3082f2f2110b6788c57a8cdc43515044d275fe7d6f20540055bde823b7b091134fb811d23468ce0000000000000000000000000000000009cd91a281b96a881b20946fda164a987243c052378fcd8fee3926b75576dfa1d29a0aaca4b653da4e61da8257721808000000000000000000000000000000000a98ae36c690f2e3be8100f43678be5a1064390e210328dd23f61f5a496b87398db2798580edeabc6273fb9537fa12880000000000000000000000000000000009aedf77bb969592c6552ae0121a1c74de78ba222b6cd08623c7a34708a12763b5ff7969cf761ccd25adc1b65da0f02d", + "Expected": "00000000000000000000000000000000072334ec8349fc38b99d6dea0b4259c03cd96c1438c90ef0da6321df2495892de031a53c23838ca2b260774fa09b5461000000000000000000000000000000000e4535767c2477c4f87c087540c836eeffcd0c45960841f9c3561a8a5f8e61ab98b183b11192b8e7ea1c9c7717336243", + "Name": "matter_g1_add_37", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001305e1b9706c7fc132aea63f0926146557d4dd081b7a2913dae02bab75b0409a515d0f25ffa3eda81cf4764de15741f60000000000000000000000000000000011bf87b12734a6360d3dda4b452deede34470fba8e62a68f79153cc288a8e7fed98c74af862883b9861d2195a58262e00000000000000000000000000000000015c3c056ec904ce865d073f8f70ef2d4b5adb5b9238deaa5e167d32f45cad4901aa6d87efa2338c633e7853ce4c19185000000000000000000000000000000000a15f1aa6e662f21d7127351a1655821c943c4cf590e3c9e60c9ab968b4a835f87fb8d87eee6331ee4e194e5f1ea91f4", + "Expected": "000000000000000000000000000000000140fb6dcf872d0a3bff3e32a0cb4a7fb7e60ee4fb476bb120c4ce068e169d72e1c167d7fda321280d5855983d5a9af800000000000000000000000000000000108f54a4ec3ba26dd614f4d94c5c82652583906986158ad40ffea54c17703fa4b0bd7806633e1c0318d06e8dc7d41cde", + "Name": "matter_g1_add_38", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000012662b26f03fc8179f090f29894e86155cff4ec2def43393e054f417bbf375edd79f5032a5333ab4eba4418306ed0153000000000000000000000000000000000f26fdf1af1b8ad442ef4494627c815ca01ae84510944788b87f4aa2c8600ed310b9579318bc617a689b916bb7731dcb000000000000000000000000000000000307841cb33e0f188103a83334a828fa864cea09c264d5f4343246f64ab244add4610c9ccd64c001816e5074fe84013f000000000000000000000000000000000e15bbeb6fff7f1435097828f5d64c448bbc800f31a5b7428436dcffd68abc92682f2b01744d7c60540e0cd1b57ab5d4", + "Expected": "000000000000000000000000000000000a1b50660ed9120fff1e5c4abb401e4691a09f41780ca188cea4b1c2d77002f08ce28eb1caa41ee3fe73169e3651bb7f00000000000000000000000000000000125439ac3b45c698a98063ab911364bd3c6dd2a69435d00d6edf89fc5566b33038e960a125e5e52141abb605587942fe", + "Name": "matter_g1_add_39", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001837f0f18bed66841b4ff0b0411da3d5929e59b957a0872bce1c898a4ef0e13350bf4c7c8bcff4e61f24feca1acd5a370000000000000000000000000000000003d2c7fe67cada2213e842ac5ec0dec8ec205b762f2a9c05fa12fa120c80eba30676834f0560d11ce9939fe210ad6c6300000000000000000000000000000000013866438b089d39de5a3ca2a624d72c241a54cbdcf5b2a67ebdd2db8373b112a814e74662bd52e37748ffbfc21782a5000000000000000000000000000000000d55454a22d5c2ef82611ef9cb6533e2f08668577764afc5bb9b7dfe32abd5d333147774fb1001dd24889775de57d305", + "Expected": "000000000000000000000000000000000037b4e8846b423335711ac12f91e2419de772216509d6b9deb9c27fd1c1ee5851b3e032bf3bcac3dd8e93f3dce8a91b00000000000000000000000000000000113a1bf4be1103e858c3be282effafd5e2384f4d1073350f7073b0a415ecf9e7a3bfb55c951c0b2c25c6bab35454ecf0", + "Name": "matter_g1_add_40", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000181dc6fd3668d036a37d60b214d68f1a6ffe1949ec6b22f923e69fb373b9c70e8bcc5cdace068024c631c27f28d994e5000000000000000000000000000000000b02ca2b0e6e0989ea917719b89caf1aa84b959e45b6238813bf02f40db95fbb3bf43d3017c3f9c57eab1be617f180320000000000000000000000000000000017440fd557df23286da15f9a96bb88cfbc79589b1c157af13baf02c65227dc0a5bdec6f2f300083ff91dae395ed8cb75000000000000000000000000000000000ad09b4290842cc599d346110fdb39ededbb1d651568579564e274465f07b8f77eeaf00fece0c10db69c2125de8ab394", + "Expected": "0000000000000000000000000000000007c158b4e21566742f7e4e39a672bd383e27864505acef4ef8c26f8b0a9db418f9c088b555b8e9eb25acf9859b1207b40000000000000000000000000000000016e06a1ace89f992d582af0de7662ef91c0a98f574306f6f6d0d8d5e80166638d2deef70105cce2e9b20faa9d6315510", + "Name": "matter_g1_add_41", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001329a75975b714c861064d743092866d61c4467e0c0316b78142e6db7e74538a376a09487cb09ee89583d547c187229000000000000000000000000000000000096713619bf088bd9e12752cab83e9cdd58296ada8d338c86a749f00ba014087a3836ce10adaaf2e815f431235bff4f0000000000000000000000000000000000d7ccc3a4efdfe1a92a88e453933b8216016091f1b9d575faf18a5b3abf90daf077813167a3f4acce7359472dee544bb00000000000000000000000000000000128008c075ab176100e755cbb8de5b9ff0e9a78114f862d26ed030d9c1d1dea1c21ec8ae4d82a84d3ff5ae4c1cd6f339", + "Expected": "000000000000000000000000000000000b84f9de79c748e37797c629cb78b86b4b736b199f161b30147b5dacf6eabe0b54afce40d5dacfe9a8ee8da5ef5b49de0000000000000000000000000000000010277ad094bb9a3b96379b1366dd90125b51a21ebeb4f776a81d9d9c1f37ab58c32a884a26fa32c83783ed0eef42b820", + "Name": "matter_g1_add_42", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001195502bc48c44b37e3f8f4e6f40295c1156f58dbc00b04b3018d237b574a20512599d18af01c50192db37cb8eb2c8a90000000000000000000000000000000002b03f02b45aa15b39e030c4b88c89a285dff5c4bbfe16f643f3f87d91db774f8ab7019285fda0b236ff7eec16496e5e00000000000000000000000000000000008da4a93d5ffcdaa0adc736a59f0c187ae3bf11ecb5e9e6f6aedea976a47757739042200b4c4593c2dd5db555425531000000000000000000000000000000000a6fdb2d4160c6c35223daa6fa10d0b1073de07fe4f2eba28e65ed049ff8d8852ed0538b30759fe7a0d944009ddf9a6f", + "Expected": "000000000000000000000000000000000d740bd1effd8674250618af0358ad0b83bbc787f0264af9c2ada72fa5431be909e82155da1de0211f46fb307e9949f0000000000000000000000000000000000ddf62c91d587a14b64feef07da52c081b40fbbf9a0f2eae8b66022e0850fc94de6a467e7e4f580c7f2c806f6c6ed8cf", + "Name": "matter_g1_add_43", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000d7e1651f3e172dcca8774a7a0d58ab47178d3e759933289e1d3eb0da414160ff9e890a608bf8ccdf2820c4aea6e11cb00000000000000000000000000000000185e8671e2ddb8e36380e39fe4eafefbac9769935603c28caac7d3f7f0f3e8ad14e925024b55aeb67d68b219875c9d790000000000000000000000000000000003258d7931a1d72ab6344c7e96c0dbd435a7909fe68cc679c08ca9b62f7a6a04863082cbcfdbe9a736625d895e4f3bdb0000000000000000000000000000000009ee3e470e2b2cebc955ba3444b7e478f887138e36c13bd68490689122627269ea5e7ce22dd9c69792394a24187103d6", + "Expected": "000000000000000000000000000000000af674691f5d87655f0066188fac5013f31b4169a0181d3feb7ac3beae0d9a3429d4125f099ee344f644a2de8b941f9f00000000000000000000000000000000042a9603b8e4a6c37d59ede3a1398f5f80c5298da66de575a204ee28811d9f7c7c0dd40cef3769bd72a2156b9eb620c8", + "Name": "matter_g1_add_44", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001454d4a82163a155446467164904cefd7e1e3c67ae99bf65c581a75c72716fb011e2fd030eaf3d36977fbb0ff5156e2700000000000000000000000000000000123f973ab6bd3c2e5b0512a0c77ea0ac3003fd891e1262137f9444cd07b927b564e618205ba09220320ea1aa4564e820000000000000000000000000000000001833807f1ced52399305419450355499a63411837ee61ad681559d59561db18511eb1e8ad3161e7fe30016b560d18b8f00000000000000000000000000000000198b11b31586e17964a4a4ccdee85703163d2106481833e71f26327a589bafb43578d08d87f6cb19c7a04b4ca92392bf", + "Expected": "000000000000000000000000000000001081c3359a0fadfe7850ce878182859e3dd77028772da7bcac9f6451ac6455739c22627889673db626bbea70aa3648d50000000000000000000000000000000000f4e8766f976fa49a0b05ef3f06f56d92fe6452ff05c3fac455f9c16efadf1b81a44d2921bed73511dda81d6fc7478e", + "Name": "matter_g1_add_45", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000178e6828261ee6855b38234ed15c27551bb1648ac6ec9a9e70744643cd1f134b2309dd0c34b1e59ddfe3f831ab814c90000000000000000000000000000000002ec930fb58c898ede931384c5a5f9edd2f5c70b8c3794edb83a12f23be5400949f95e81c96c666c1a72dffb50b811580000000000000000000000000000000007dc719ae9e3f1e11d3ed4747a546a7b973ccb1967adb1b3066645a8bde9632bcfa3530e768f088ddbc022b169e67cbf000000000000000000000000000000000bbf9cf884b19c84045da1cead7dcd9fdbf39d764ff1ad60d83ed1e4fd0ce0554f0fb618203952cf02a7c4ba466c66b8", + "Expected": "000000000000000000000000000000000f60d66fd1ed5eb04f9619d6458c522cc49f5ace111aff2b61903b112559972f80ac615591463abf2b944c4f99d4c03e000000000000000000000000000000000001a1abfa869be2cda6bd7e05454a8735e1b638db7e1b3715708539c2d14ade53069c7e68b36d3b08cff80837028b7d", + "Name": "matter_g1_add_46", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000001ea88d0f329135df49893406b4f9aee0abfd74b62e7eb5576d3ddb329fc4b1649b7c228ec39c6577a069c0811c952f100000000000000000000000000000000033f481fc62ab0a249561d180da39ff641a540c9c109cde41946a0e85d18c9d60b41dbcdec370c5c9f22a9ee9de00ccd0000000000000000000000000000000014b78c66c4acecdd913ba73cc4ab573c64b404a9494d29d4a2ba02393d9b8fdaba47bb7e76d32586df3a00e03ae2896700000000000000000000000000000000025c371cd8b72592a45dc521336a891202c5f96954812b1095ba2ea6bb11aad7b6941a44d68fe9b44e4e5fd06bd541d4", + "Expected": "0000000000000000000000000000000015b164c854a2277658f5d08e04887d896a082c6c20895c8809ed4b349da8492d6fa0333ace6059a1f0d37e92ae9bad30000000000000000000000000000000001510d176ddba09ab60bb452188c2705ef154f449bed26abf0255897673a625637b5761355b17676748f67844a61d4e9f", + "Name": "matter_g1_add_47", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000008d8c4a16fb9d8800cce987c0eadbb6b3b005c213d44ecb5adeed713bae79d606041406df26169c35df63cf972c94be10000000000000000000000000000000011bc8afe71676e6730702a46ef817060249cd06cd82e6981085012ff6d013aa4470ba3a2c71e13ef653e1e223d1ccfe900000000000000000000000000000000104ee0990ba4194916f670f44e254200971b67a18ed45b25c17be49df66e4f9b934bac8c1552ecc25bdaa3af55952076000000000000000000000000000000000591094d9d89afe025ca1832d7f3e60444f83e72403a434b42216b6c4213980d29e4ef0c64ae497006de550c1faa9425", + "Expected": "0000000000000000000000000000000006db0cc24ffec8aa11aecc43e9b76a418daac51d51f3de437090c1bcaabace19f7f8b5ceb6277d6b32b7f3b239a90c4700000000000000000000000000000000069e01f60ca7468c6b9a247c79d18cf3d88bf5d1d62c76abf9237408edeba05dea744205ac5b501920f519bb847bb711", + "Name": "matter_g1_add_48", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000120ddc1cd9e3a7b298673b1036d162c31dbb35d6e83b39b2564b3be16e446a836c96907e8a6af1e677e906bf5ed73159000000000000000000000000000000000fa57c1436615442bbb049d08ac46e501c07736cd239298752bb94d1904bd38cc687759987cadd99bd3c4d45ba07193a0000000000000000000000000000000004840d028d0c0f056aeb37b7a8505325081e9822ef26046f2da72f2155c20987dd51f4b5577c5395e24288b71d2ce5140000000000000000000000000000000015f231a233e997633c1d6492e0df358fb658ae29d0f53928c8a0578484c899a699178ca3223772210063aa08991c3fff", + "Expected": "000000000000000000000000000000000fa72bf2d7d564cc4982b9f2cdca743d2ac14f0f1be4218dbafb8b93a9277e55273487a5d2857fd3f731ac4ee469a6a1000000000000000000000000000000000fce44f886453c6ca5ebde9af41d2be92d1126e9897d72978a179dd7eebeed6242b6e9718604ab0c9369529a0426a575", + "Name": "matter_g1_add_49", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000e3ccaa4fa358a5a885094cbb0b8baa106fbcca66edbe31511ac2f6f3d14edbd8701979d6e4690853555c625091392b600000000000000000000000000000000175bdd42583cbbf733242510c152380525aff7649273acef1ec20569804ffba7f029ca06878dbafde84540cece1738220000000000000000000000000000000004877b97faa1d05d61ab65001110bf190d442cabcd6d4d1b9c1f0e513309aebd278f84a80354dfdef875769d00ec2c7500000000000000000000000000000000187066cccb5008bc2ffd0bcd1b227a5a0fe0cd4984316ba3cfd5113c4632a04c56cbda8d48993bd0dd50e9b7ce2b7ee9", + "Expected": "0000000000000000000000000000000019ecd38afacc6b281b2515270157328e18039d51574bae0f7e0ef16c3f6da89f55ddee9e3bbb450ad51fe11edfd9f18d00000000000000000000000000000000088a5e292761bbf7a914a9f723de099035e91bd3c1fe9cd50728a4ceaa4fd3953683f30aa8e70ba0eb23919092aa9e22", + "Name": "matter_g1_add_50", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000001bc359baeac07a93aca770174ea6444aac9f04affdaa77c8a47b30c60ee2b527c061a4344139264e541d4134f42bfd0000000000000000000000000000000000cbf7a31e6fef4f4664bca4bc87ec7c0b12ced7224300aa4e1a6a7cbdedfcef07482b5d20fa607e3f03fdd6dd03fd10c000000000000000000000000000000001881f5aba0603b0a256e03e5dc507598dd63682ce80a29e0fa141b2afdadf6168e98221e4ee45d378cee0416baaadc49000000000000000000000000000000000070d255101319dd3a0f8ca3a0856188428c09de15475d6b70d70a405e45ab379a5b1f2e55f84bd7fe5dd12aeedce670", + "Expected": "0000000000000000000000000000000011ccd455d5e3eba94567a17bcd777559b4ff1afa66fd6f05f99c69937404290a2f1c83cfd6c2c25886ebff4934332c0e0000000000000000000000000000000010920aa3d5974df25530610ef466adce3d51fd6a508d4b1111739c586dfd7ba9040836e075fd812fe111d92f25b67f51", + "Name": "matter_g1_add_51", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000006b06ae8cb0981bf5167ad51e19d132db77548c4376697f855c8397b835743c42771096ed7b0a4b18af9494e42ee89aa0000000000000000000000000000000005aa892b0a056ff61706430f1daa3f0263dc01337eadabd8a7fd58152affd9aaa329e8c11ea98692134d9718cb4119bf000000000000000000000000000000000b53e5339f25bcd31afd091362874b5042c0b762ed7425341331630addbc4dccc299936e1acdf89823c36867d46c6f28000000000000000000000000000000000fc3c6b522268511dd52826dd1aee707413d925ee51aeb0e5d69c0e3eb697fabbc14783b5007e240cc0c53c299a40ada", + "Expected": "00000000000000000000000000000000060773b9b8f3babdba3db27089b7be3e6e287a635dbae19576039d34ae18a0e6413278bfa280570f6329ae05cdb693fd00000000000000000000000000000000075fb9527f99a8c8db41e67baaf1deafffd2c134badb1b3478a26b5501b31dca858fad6f0d52f412d5631ecfa72eece4", + "Name": "matter_g1_add_52", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000015dc9f87213e4781863ad43f6bbccd547967d9bcf6a35d95d530cbfbf0d7307981aee5bc4ccd41254841651717393a0300000000000000000000000000000000166ce33c0482b5957c6e746c16908ba579d6402b230bc977d3ff29ac2a4a800748d9c14608f2519e2ac4d1fe4daf29b2000000000000000000000000000000001693f4ebab3fed548784264196fb01cf55311399f47cdad74a9543bda5d1ca682a00ee04bb0b3954d5a0f00ceef97a750000000000000000000000000000000017f4019c23bd68e84d889857c417b17aa96c780fec3c1ed6ca75100cc70c97a8bb8272ad4c6de896d76dc2a1b09c7a61", + "Expected": "000000000000000000000000000000000a3ea8afdc83794f18f9a9427bcd60a355196925d38fdf74ab09d4a08279647b2da6f1fbe30948a785497d6c6dddc2a9000000000000000000000000000000001263c88f1ca3e574cafac21641432d45ee01e1b05eba95716565922abe28c7f0fb004c255afcbfa10cf7959bbe6b00d7", + "Name": "matter_g1_add_53", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000171fbc9cec717964c4324aa0d7dcf56a59b947c24a9092157f4f8c78ae43b8e4222fd1e8acdbf5989d0d17ea10f6046300000000000000000000000000000000148b5454f9b9868aefd2accc3318ddabfe618c5026e8c04f8a6bce76cd88e350bebcd779f2021fe7ceda3e8b4d438a0b0000000000000000000000000000000005d5602e05499a435effff3812744b582b0cd7c68f1c88faa3c268515c8b14f3c041b8ae322fe526b2406e7c25d84e61000000000000000000000000000000001038eaf49e74e19111e4456ebba01dc4d22c7e23a303d5dec821da832e90a1b07b1a6b8034137f1bfdcddeb58053a170", + "Expected": "0000000000000000000000000000000019258ea5023ce73343dcd201ec9be68ec1ee1cb4e5b9964309d801c2bc523343c8ebc4f8393a403c7881e5928f29db14000000000000000000000000000000001423bf52daefb432162ce2bd9ef78b256ff3b24d0a84766b87119489fd56ecf6156b2884c8a7e1220e493469723cd7f8", + "Name": "matter_g1_add_54", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000018724e2b9a2f383329207ee85577805f35d5c5bb9f6903e3c962e57ab7eb9d1639d1e9adbde53499863b299f576325a00000000000000000000000000000000016d2c22eabd4a06a5ae67b890a25fbede7d0e96c625b80329b19be6aa861f44b6e85778130d0bdf69f2abd491ee9751a0000000000000000000000000000000002626f28d421d9d1c28f5e1eb5a51ada9610dbdd62cd33c4078d2fdfc18dbd092e2847cf705ba5fcd8c1a60c1cc34a3b0000000000000000000000000000000001f7b8cfdb7e406c920f5fdecae45fb4be736f209480ccb455f972c6b1a1aebdd5ba116903c46ded72ce37cd8836e871", + "Expected": "00000000000000000000000000000000081d674f5b9c7c64673c39fe33f4f3d77271e826dcb4dfd2591062e47c931237e8539ef9c886c9e112eccc50da4f63fd00000000000000000000000000000000141b700695839110ed4ced5f8a3f4fd64a8086805358ab4a5abd2705592e616cd95ff01271212ca9014dcb68d8157ba0", + "Name": "matter_g1_add_55", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000010fcf5e5e478ac6442b218ce261878d8f61b405c0b9549512e23ead1f26a2240771993f8c039fbce4008a1707aeaaf25000000000000000000000000000000000f1afe9b199362f51cc84edb1d3cf2faf8e5bc0a734a646851ab83e213f73a3734114f255b611ec18db75694dcb0df91000000000000000000000000000000000259e307eacb1bc45a13811b02a7aeaaf4dc2bb405dcd88069bb6ec1c08a78905516169bd3440a36921764df0ef3a85b000000000000000000000000000000001263372b675124f6cc19ca16842ba069c5697dbf57730875fe72c864a81189d7d16fe126b5d24953a0524f96dbac5183", + "Expected": "000000000000000000000000000000001908aa3a640817e31a4213156fbd4fd39ab39eb931091670a0e06399def71a689e67286f90d38ce9f97cb85f6488d9c8000000000000000000000000000000000764e46b6b82aa2f8862d28e9d543a751a9de855645377b9633cc098c2110ec6ed4fd30f0044ea5868c93f950f6cfd24", + "Name": "matter_g1_add_56", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000f75bc9feb74110697c9f353686910c6246e587dd71d744aab99917f1aea7165b41deb333e6bd14843f28b2232f799830000000000000000000000000000000019275491a51599736722295659dd5589f4e3f558e3d45137a66b4c8066c7514ae66ec35c862cd00bce809db528040c04000000000000000000000000000000000a138203c916cb8425663db3bbff37f239a5745be885784b8e035a4f40c47954c48873f6d5aa06d579e213282fe789fa0000000000000000000000000000000016897b8adbc3a3a0dccd809f7311ba1f84f76e218c58af243c0aa29a1bb150ed719191d1ced802d4372e717c1c97570a", + "Expected": "0000000000000000000000000000000004ad79769fd10081ebaaed9e2131de5d8738d9ef143b6d0fa6e106bd82cfd53bbc9fab08c422aa03d03896a0fb2460d0000000000000000000000000000000000bb79356c2d477dfbcb1b0e417df7cb79affbe151c1f03fa60b1372d7d82fd53b2160afdd88be1bf0e9dc99596366055", + "Name": "matter_g1_add_57", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000a87d0ccfb9c01148703d48993de04059d22a4cc48c5dabd2571ad4f7e60d6abfbcc5fb3bf363fd311fec675486c2a20000000000000000000000000000000000a896c5a84cbd03e52ae77000eb0285f5704993664a744a89ff6b346efd2efec1a519b67229a3b87e1f80e6aa17e29460000000000000000000000000000000019f60f2cf585bdbc36947f760a15fa16c54cf46435cc5707def410202a3f4fa61b577ab2481e058b0345982d3e3d1666000000000000000000000000000000000a70b7bbc55e1f3e11e9eb7efd79d4e396742de48d911ddff8dd0a7cf10422423d5e68021948e1448e92c2e07c194776", + "Expected": "000000000000000000000000000000000a87e7e115ccdf3c2c1a2716491d449c3f8329e73d264088f4af444d43cf05f8be0410da273ce7eeb32969830195b7e70000000000000000000000000000000010a973d6e4bd85105bf311eb0dcfdc0a5d38dba1c099206b60f2e2df4791fd58846bf19d83769506e1561212920b4895", + "Name": "matter_g1_add_58", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000d35ffa284655a94c3050213f4f14e927c162818bbfd0480bad2e07000dd3081274056715c96408f243589d83365c9f20000000000000000000000000000000001450bddfa14033ed8cdb94386715013ed9b2c4f9d65944e9d32c0b3545a085113e173e5afcfccb78878414a464d318400000000000000000000000000000000109bd6e0636a7f96ffe2ce8e109171efaacfcd60189c7050259ddedd15dd257e11f2585bbd84e4a3f4d8fc5fbc0289cf0000000000000000000000000000000019b420d778da53aed81b48f2c9b9eb399e771edd5e124a41577452b409ca2503e2798cd25d791f489352fc7b7268ae23", + "Expected": "00000000000000000000000000000000162bd29f2de10002c1c446bd9583e89751fb91703ad564e7951d41673e28d214729aa9b4b9875c397989df197c912d5f0000000000000000000000000000000004d393181871c93714afab6c33c16f68ec391fbfcad606ac65cc1d070949c099e21f710e2fe0dd4e4f50f99ea2167a7e", + "Name": "matter_g1_add_59", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000344cafaca754db423544657de1b77025164ccc702f8d45697fb73602302a3cb4511c38f0a76a37415d683398f35556500000000000000000000000000000000120935947070451885bf0c328bd83def193831ab9353844a01130074f16a1ff4d20df8459b5ad6a57d5f1959d37aae920000000000000000000000000000000012bb529b45ad7875784b62a7281d025002f15e7f86cc33555e7472df60da2cb15d37c8bf628142818c0711ee9047fb4d000000000000000000000000000000000baa801623312d95e2b51ce86373fea516007e468f265d974c2327c1779830db180bed6dbe8a64f0959aad26eaafb8d9", + "Expected": "0000000000000000000000000000000010c4b328d264893099d89ba81b0765d0642bf36b0ac043be090c7b4f7987d21a906228c3c208c4ec5123d577efb0771f0000000000000000000000000000000016d08ce3bf755da7d4bae5f4b06b37845c17a717329c547e941be93325a04e9a5095d3f6e6c6f9ec3b1a740f59d88919", + "Name": "matter_g1_add_60", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000008797f704442e133d3b77a5f0020aa304d36ce326ea75ca47e041e4d8a721754e0579ce82b96a69142cb7185998d18ce00000000000000000000000000000000144f438d86d1d808d528ea60c5d343b427124af6e43d4d9652368ddc508daab32fd9c9425cba44fba72e3449e366b1700000000000000000000000000000000002c9e50f37ff0db2676637be8a6275fce7948ae700df1e9e6a0861a8af942b6032cca2c3be8b8d95d4b4b36171b4b0d400000000000000000000000000000000050f1a9b2416bbda35bac9c8fdd4a91c12e7ee8e035973f79bd35e418fd88fa603761e2b36736c13f1d7a582984bd15e", + "Expected": "000000000000000000000000000000000f798f8d5c21cbce7e9cfcbb708c3800bf5c22773ec5b44590cdbb6f720ccddf05a9f5d5e6a51f704f7c295c291df29f000000000000000000000000000000001483903fde5a968dba6924dfac3933cd39f757e2f89120f4ca9d03aaaf9e18252bdb5c5d3939471666b8a42aeb31b4ed", + "Name": "matter_g1_add_61", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000000707c711f77bb425cddc71ecf96a18b6eb0bed7f012c4f6cc9431003f2e1ac17f7c1f68c4965a4fcc273a3db93451d000000000000000000000000000000001211464c91c7e78b00fe156da874407e4eeb7f422dbd698effb9a83357bf226d3f189f2db541eb17db3ed555084e91ec000000000000000000000000000000000332cdc97c1611c043dac5fd0014cfeaee4879fee3f1ad36cddf43d76162108e2dc71f181407171da0ceec4165bcd9760000000000000000000000000000000015b96a13732a726bad5860446a8f7e3f40458e865229bd924181aa671d16b2df2171669a3faa3977f0ee27920a2c5270", + "Expected": "0000000000000000000000000000000001c762175f885a8d7cb0be11866bd370c97fb50d4277ab15b5531dacd08da0145e037d82be3a46a4ee4116305b807de6000000000000000000000000000000000bb6c4065723eaf84d432c9fde8ce05f80de7fe3baed26cf9d1662939baac9320da69c7fe956acdd085f725178fe1b97", + "Name": "matter_g1_add_62", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000004b3c0e8b240b79c55f02833c2c20fa158e35c941e9e8e48247b96cb1d4923641b97e766637a3ced9fbef275ca9bd1ea000000000000000000000000000000000b4e7355aea3488234552d3dddfa2d1ad3164056407770e6c54f764193c9dc044cb7f2b157a1c4153b2045867d6f99c50000000000000000000000000000000003ebca978ea429eedad3a2c782816929724fc7529fbf78ea5738f2ca049aab56c1773f625df2698433d55db7f5fc8ca2000000000000000000000000000000000d2477f57b21ed471a40566f99b7c2d84ce6b82eaf83a6c87a7c21f3242959c8423d4113b7fd8449277b363303bb17b0", + "Expected": "00000000000000000000000000000000071dc0f985703bd8335093779de651b524c02faca5fc967766abd3f6f59176d2046d7a14d18c0b757b8c9802e44ebcd300000000000000000000000000000000154e5cb66be8979ee276e8e0f240557e3f7dc074c497293af589256652da21d66a6e6b00ca5bfa6f89963fbd5bc6cf48", + "Name": "matter_g1_add_63", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001465358836eb5c6e173e425f675aa231f9c62e9b122584078f2ab9af7440a4ce4ac2cd21ce35a0017b01e4913b40f73d00000000000000000000000000000000170e2da3bca3d0a8659e31df4d8a3a73e681c22beb21577bea6bbc3de1cabff8a1db28b51fdd46ba906767b69db2f679000000000000000000000000000000001461afe277bf0e1754c12a8aabbe60262758941281f23496c2eeb714f8c01fd3793faf15139ae173be6c3ff5d534d2bc00000000000000000000000000000000148ad14901be55baa302fa166e5d81cc741d67a98a7052618d77294c12aea56e2d04b7e497662debc714096c433e844e", + "Expected": "0000000000000000000000000000000012c4dd169f55dfb5634bc4866f7cbd110648b5392ace6042b5f64aba3278f24085227521b7834864f00d01ec9998dd6800000000000000000000000000000000102d7a495850195424677853da01d70caeb6c0af5270bcfffbc2d4252c0f3680518cd8d2a0a6dbbbc7b52923a5b26562", + "Name": "matter_g1_add_64", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000ab6e2a649ed97be4574603b3b4a210f0748d8cddf132079e0543ec776ceb63902e48598b7698cf79fd5130cebaf0250000000000000000000000000000000000d55b3115d2bfcd1b93c631a71b2356c887b32452aae53ffd01a719121d58834be1e0fa4f22a01bbde0d40f55ad38f2c0000000000000000000000000000000002218b4498c91e0fe66417fe835e03c2896d858a10338e92a461c9d76bcecd66df209771ae02c7dcace119596018f83c000000000000000000000000000000001990233c0bae1c21ba9b0e18e09b03aeb3680539c2b2ef8c9a95a3e94cf6e7c344730bf7a499d0f9f1b77345926fef2d", + "Expected": "0000000000000000000000000000000010c50bd0f5169ebd65ee1f9cd2341fa18dd5254b33d2f7da0c644327677fe99b5d655dd5bfdb705b50d4df9cfce33d1400000000000000000000000000000000088e47ffbbc80c69ec3c5f2abe644a483f62df3e7c17aa2ff025553d1aaf3c884a44506eff069f4c41d622df84bbafa1", + "Name": "matter_g1_add_65", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001654e99ebd103ed5709ae412a6df1751add90d4d56025667a4640c1d51435e7cad5464ff2c8b08cca56e34517b05acf10000000000000000000000000000000004d8353f55fdfb2407e80e881a5e57672fbcf7712dcec4cb583dbd93cf3f1052511fdee20f338a387690da7d69f4f6f7000000000000000000000000000000000160e0f540d64a3cedba9cf1e97b727be716bbfa97fbf980686c86e086833dc7a3028758be237de7be488e1c1c368fe100000000000000000000000000000000108250b265bd78f5e52f14ef11515d80af71e4d201389693a5c3ef202cf9d974628421d73666ead30481547582f7abaf", + "Expected": "00000000000000000000000000000000168af33c85ae6e650375ed29b91218198edd9135683f6a1428211acdcbf16bdf86f0a95575e47ee0969587a10fa9f3c90000000000000000000000000000000012d9f5d692c870b3da951b6d07797c186a8ddc89b9f08a1c0b8f0f119f10ca0b155e8df5424cf48900ad3bf09ce6872a", + "Name": "matter_g1_add_66", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000001bb1e11a1ccc0b70ce46114caca7ac1aba2a607fea8c6a0e01785e17559b271a0e8b5afbfa8705ecb77420473e81c510000000000000000000000000000000018f2289ba50f703f87f0516d517e2f6309fe0dc7aca87cc534554c0e57c4bdc5cde0ca896033b7f3d96995d5cbd563d20000000000000000000000000000000002fa19b32a825608ab46b5c681c16ae23ebefd804bb06079059e3f2c7686fe1a74c9406f8581d29ff78f39221d995bfd000000000000000000000000000000000b41ea8a18c64de43301320eaf52d923a1f1d36812c92c6e8b34420eff031e05a037eed47b9fe701fd6a03eb045f2ca7", + "Expected": "000000000000000000000000000000000b99587f721a490b503a973591b2bb76152919269d80347aeba85d2912b864a3f67b868c34aee834ecc8cd82ac1373db0000000000000000000000000000000007767bb0ca3047eee40b83bf14d444e63d98e9fc6c4121bdf04ea7148bcfaf3819b70dcebd9a941134e5c649da8f8d80", + "Name": "matter_g1_add_67", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000012ecb4c2f259efb4416025e236108eff7862e54f796605cc7eb12f3e5275c80ef42aadd2acfbf84d5206f6884d8e3eab000000000000000000000000000000001554412fc407e6b6cf3cbcc0c240524d1a0bf9c1335926715ac1c5a5a79ecdf2fdd97c3d828881b3d2f8c0104c85531f0000000000000000000000000000000002a540b681a6113a54249c0bbb47faf7c79e8da746260f71fbf83e60f18c17e5d6c8a7474badafee646fe74217a86ca4000000000000000000000000000000000fe2db7736129b35dc4958ffd0de7115359857fb9480b03a751c4fceb9ae1b2b05855398badffc517ae52c67f6394e2a", + "Expected": "000000000000000000000000000000000bc719a8397a035fc3587d32d7ef4b4cfd63d4a5619ab78301d59659208f86df9e247e5d12650acc51a3bca3827063a900000000000000000000000000000000150d5519380a65b1909b0d84da374484675d99b00b254d03e423e634a012b286e3fe074e9b0a7bb24ff52d327249a01b", + "Name": "matter_g1_add_68", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000010dac3e5885cc55f3e53b3fdd5d28b2d78ceeea2b669757a187de0ce3f28b586e451b119cdb7dc8b97d603f2bb700e2000000000000000000000000000000000712a9656fa95abf8c8c5d0d18a599c4cae3a0ae4bda12c0759ea60fe9f3b698d3c357edebb9f461d95762b1a24e787900000000000000000000000000000000019d917eb431ce0c066f80742fe7b48f5e008cffa55ee5d02a2a585cc7a105a32bbf47bdff44f8a855ade38184a8279e0000000000000000000000000000000012ee762e29d91a4fc70bc7a2fb296a1dcdd05c90368286cca352b3d5fffc76e3b838e14ea005773c461075beddf414d8", + "Expected": "0000000000000000000000000000000008197403ab10f32d873974c937ef4c27fbdb0f505c4df8ac96504705d4851cf951fb0263335e477063884527b21edf160000000000000000000000000000000005396f1affa20ca8530b519a4d5d400969f0c8c8731ecc0944e8086388e89a7ff7c16d9a2a90780972c4762b88a0f0af", + "Name": "matter_g1_add_69", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001889ef0e20d5ddbeeb4380b97ed7d4be97ef0def051d232598b2459a72845d97fa5c1264802ab18d76b15d8fbd25e55900000000000000000000000000000000135519fb1c21b215b1f982009db41b30d7af69a3fada207e0c915d01c8b1a22df3bf0dc0ad10020c3e4b88a41609e12a000000000000000000000000000000000d280fe0b8297311751de20adf5e2d9e97f0c1bfe0cd430514cfddbafd5cdcb8c61bd8af4176cc3394f51f2de64b152400000000000000000000000000000000039f511e890187f28c7a0b2bd695ae665e89b0544c325a44b9109da52cc6908d81e1a27163a353ab275d683860c2e007", + "Expected": "0000000000000000000000000000000002baea63055f72646189bdd133153dd83026f95afad5ce2cffbee3f74c8d47d5480094b2b58b0936c78aa33cd9a8f72f0000000000000000000000000000000013e600456a2d76f5a760059e0ba987b881c6bc10d6161f388d7a9d8b2031921054edfec46afbd80b1364d8e8f6a5a7a2", + "Name": "matter_g1_add_70", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000008726a32d489a5ea1c1b314dc4d400d995d0eb8b49d47e65a6ac8fd0e6ec0cda1c637ee314c0c5d1ad72cd3588ebf925000000000000000000000000000000001849697df83d625fc5cdd722c76faf542a42506fc3479d8127eee7af57611c7d6f33a7f9dba5d3c420fab33ec19305f50000000000000000000000000000000015bad24d12b5d68558e961a17dbc3e1686e1b918e6192ebe6f3f71c925177e61d0162e018ac81126099effa0cadfa185000000000000000000000000000000000de73182569184b3d79dcfa8c27f46ec7a31fe8a3fd73fe26eec37a088461192bdbcf4d4b37b33b6177d6fde015d1631", + "Expected": "000000000000000000000000000000000ced641c930387432d512861eefbf2d6131017154f99a0d3d24da880dfd2aaae91c2d9634053fab8b85fc11a7884d30600000000000000000000000000000000122071c0e87fae5031c850dccc4777c3ec9d8463bbc4ed84364d4261bc9d38f696a4320d53eea926a75ed9fcc9789a07", + "Name": "matter_g1_add_71", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001688c63e325569855bc2e51d668cef112b2479efa33519fe7f45eab89e275e2c4652cf8c2814f179935ccf1d24d8bd0f0000000000000000000000000000000011ebf7d4984237ac0173807f31be64575e7cccb36ce94e666e8149b9c292ebdb68d30ed4ba68f8e00982ee7780b256730000000000000000000000000000000015cdf7dafedce64aba34e1f18c57b28f297629c07ee96b732029b545cf5ea6afdf926daa6a48d1250c67aa2a8b797d370000000000000000000000000000000004867352f86267dbe8e32806e4ed02f1487e036051068f8e06d02e8dea6d3773b422e065d2db27c89ea69246d0185351", + "Expected": "000000000000000000000000000000000e2c633351d627a075acd1e373bec96ba41b047f0307201f4b7c9978c1a72243d0b18113604cc421b8f66d76ec9b1360000000000000000000000000000000000844e258d602bf9aaa35ce46c4c91c80dd9337053d8ab22c1163a0571fcd1488a2ef57476e2b66dd9c26963b28284d11", + "Name": "matter_g1_add_72", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000bb6f731b345bb1319b9acab09c186449a51dad8b6526251bc58e958cfd933137067e6f778b019f131cc7b23e08a0706000000000000000000000000000000001979a4f3e444c5950d0e2d71f97e99578b3058a6e414dfca313b898c4e02787e6eed89a2d1b05f31cff4af1e12bbedc300000000000000000000000000000000077eb801bcde78e9dd73b58d2429a907ea0f5600a8005093d471be373bba23ea70bf828c766ccced6a46db84b440053f00000000000000000000000000000000101af9df2939089d72e42fe2dc3de3e32be8f4526a2263ebd872d0080ed4a152107bb3d2f56176bf72d5ae8bd0c30a3f", + "Expected": "0000000000000000000000000000000010205c6be10a5fc5390b0e5ae47a8a822c8e9a7a96f113d081cde477ec0de7bf0e8385e61780b2335e4297edb35bcc6d000000000000000000000000000000001796af180463ed70cf330791c8201ee3f0fe52993f64819291bda33017285fcc3a515669b3d48a411276c849fa021f6f", + "Name": "matter_g1_add_73", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000078cca0bfd6957f9aff9731b45fdbdbeca6691f6fe6bf0b7847859c77478037e14864b202b235953ac7da231367324c200000000000000000000000000000000096ddc8631aff282d14d1878ef6bc537159abe9dda5732d0b2fe3668e184049cc19e05fec4666a0df204182edb9b0b8a0000000000000000000000000000000019b09bb7dddd11c5d0e304dac120b920601dd3a3505e478c88850cc701c17eb02aa7bfb20e4017a62fc4fb544d4f9e8f00000000000000000000000000000000048ad536cf89576d4cce83ef065bc16c47f1a28ae27bd71d30d8f2177a9c6f8b2ed0cdf872ead71bc5a1252bccb4a7e0", + "Expected": "000000000000000000000000000000000fb047098a1996a625cd19021f81ea79895e038756878d8772aaee9b6bbb66930e474dcc04579ad58f4877b742a890900000000000000000000000000000000017da74a4caefc55794a36eda7938371f42265cc1f2d87d41883152db82873daeb59642e8e663afddd4f24536a1f52b3f", + "Name": "matter_g1_add_74", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000b3a1dfe2d1b62538ed49648cb2a8a1d66bdc4f7a492eee59942ab810a306876a7d49e5ac4c6bb1613866c158ded993e000000000000000000000000000000001300956110f47ca8e2aacb30c948dfd046bf33f69bf54007d76373c5a66019454da45e3cf14ce2b9d53a50c9b4366aa30000000000000000000000000000000005f84f9afa2a4a80ea1be03770cb26ac94bec65cf9cb3412a07683df41bb267c2b561b744b34779635218527484633e30000000000000000000000000000000013ce1d1764961d1b0dff236c1f64eabec2ce5a8526edf6b0bccb9ea412e5a91880db24510435cf297fcc1b774b318b65", + "Expected": "000000000000000000000000000000000f4ca788dc52b7c8c0cb3419ab62c26db9fb434321fc6830837333c2bb53b9f31138eecccc3c33461297f99a810e24ad0000000000000000000000000000000006785d4f9cdf42264c00fdc4452883b9050eb56e2f6e46c7b8fc8d937dfe4d3ad5072d969a47c4811b36d3887256d0b9", + "Name": "matter_g1_add_75", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000007c00b3e7e50a860e99cdc92235f45a555c343304a067a71b6aaade016ef99bc50e3b2c5e3335d4bdacb816d3c765630000000000000000000000000000000000f8a45100cd8afcbb7c05c2d62bfedbf250d68d0fde0a1593cd2ed2f5f4278e1baa9e24625c263764e4347ed78cce6c8000000000000000000000000000000000f0dd7a15dfc39dc2df47cf09761498b0b363157d8443356e768567f5a6d5913c2a67f12d93df2dcf50756bb686836b100000000000000000000000000000000055914dbda5b115222e738d94fbd430440c99bcc6d2c6cf7225c77756ffadf765b2d83447d395e876b5f6134563ed914", + "Expected": "000000000000000000000000000000000ac0f0f62202d09cede55ca77b7344b46fd831b41015eb357cac07f0fa49c2564c2e9d5c591630226677446a9100757c000000000000000000000000000000000ca21d0128ef933fc1a48c1b4967f56912513e63a416d86ad40c0a4590b2edf88e4e8a286338b8b176d8b341ea480277", + "Name": "matter_g1_add_76", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001517dd04b165c50d2b1ef2f470c821c080f604fe1a23f2fa5481f3a63e0f56e05c89c7403d4067a5f6e59d4a338d0b5c0000000000000000000000000000000007b6b1d032aadd51052f228d7e062e336bacda83bbce657678b5f9634174f0c3c4d0374e83b520a192783a8a5f3fb211000000000000000000000000000000000a6ff5f01a97c0f3c89ac0a460861dc9040f00693bfae22d81ea9a46b6c570436f0688ed0deef5cdcc5e2142f195b5c000000000000000000000000000000000193a17880edffe5b2ebedf0dc25e479cac3b136db9b6b24009ea0a9ca526d6dd9714d10d64c999d4334baa081b9f2fbe", + "Expected": "000000000000000000000000000000000b728d4ae4b45fae9a9e242524e95e44f175356726da50f46236f690eec17fdd5edce5df1253383378dc8f9c1fee98ae00000000000000000000000000000000131d28a5eab968c45ddc86b82f220dcdeab7c009c7c61986ee4e55045c024e1bcbe76a4e35000b5699ccec5858ba427e", + "Name": "matter_g1_add_77", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000475e66c9e4e434c4872b8537e0ab930165b39f41e04b208d74d3033e1d69dfb4b134ae3a9dc46347d30a6805508c0420000000000000000000000000000000019e585e1d9adf34a98a7cd38de35aa243d7853c19bc21747213c11240d5fa41ff3b21ae033dd664aaac8fa45354a470a000000000000000000000000000000000b35fcf625cde78fba1b70904acb97d7eb449d968e8013855d44292e9c3b0df3cfbcace6f292ec3c7717e25490bb4c67000000000000000000000000000000000af57abd87df55034c32dbe68bd1c0b47139fc2c3a8887b7c151e57b57c9002070337c8dcb2ce2687f9f007d48dd68c1", + "Expected": "00000000000000000000000000000000178a19966b5b0fa70c138be7f5ea51d5399c7b8dcc5171cbef82ecb1451aeccbd1ed29170a27f404ebf6daa2ec99bd69000000000000000000000000000000000b1b748494806175030f6b5e2977c58982bd6ec6662d69237f0521351653c772a40035f2504ac8949fb448a901379fd6", + "Name": "matter_g1_add_78", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000002291ff240598e2c129ea12292e4a2fc86e03da9bd9fbbb8bddd6f25797003a4688ba2ed3bafd8dfcf0ddd44c3288c1e000000000000000000000000000000000d7541c9c54a95f3789ca7637348378f8956fd451c3266c8f1a34906bf1cf8e7499fcf8ad1f1a73dafcf71b86833ff3b00000000000000000000000000000000177a51fcc81580ccb7a8873fa93eaf860ca8fedde13cdf3eb53f11e66a1c1e934b82ee9251f711c5c479f33a22770c47000000000000000000000000000000000a0edc9a58f4bb414aa0aeec7bfa6076fb62bdbaee987192c18855adf4e813e7103b943e1dddc24754acfa90600a5750", + "Expected": "0000000000000000000000000000000019195049a2d457709e284c84c72a211224efc4d7d46d25c9a537eea94149b06506df02a2a4e0a6428263e9605eaaacb500000000000000000000000000000000061139f9a70ce7cd87ed3a701163bde247382295f557b47a3a0a880d2780f015e8ac753eb3243f9ad138f92c3a2257c5", + "Name": "matter_g1_add_79", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000018d31bd5a7e94ceb18d803969a2001c6eb3bfbcf82c27e88ca60d4c46807d12f116ca71c67d27270c2332205a4ea11bb0000000000000000000000000000000010b6db11d4fc3a2b449b8fd189d2e4ed4591bf4258d7b92b3eb152048cb3a3eecb87782691e9b954377fd1f34b38cb0d000000000000000000000000000000001552982822e0b64a6204b27da0e192873bb5bd2997784ff0b6ed53801b402501a665c17f0a379fd946ab1adfae43c6af000000000000000000000000000000000938359655fe135dd2a390f83e27273feb68387ba94f2b6f7c15389f8272d64231ebe9c8271de90ff2358d935359ba85", + "Expected": "00000000000000000000000000000000168f958a40e85341d90012e134976d1a5839e807948410cc0c81a50961552c052bb784c50da4c734f6aa583777c22b28000000000000000000000000000000000d26998bac6ec11bc5fcf6fe7262c984d6500cd5b21af979048b940e20054f8d759f8a011f3e09d01d10f9cf8ab150e1", + "Name": "matter_g1_add_80", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000190f4dc14439eccc46d46c5c9b15eeba0bbf2dbca11af4183408afdb15c7bfa26f107cf5fda0c1e0236aab95728eac2e000000000000000000000000000000000c47feeb1a1d2891d986b1660810859c1bba427d43a69b4e5ddeaf77116418138bfc2b7b4aa4c0cc6df10bd116721d50000000000000000000000000000000000d94885dcc21b0b98821b6861a4d094e9eb5d5adcf7ca4275c5b759abbf9a9910f3b38073183d54a0569ecbbc1e9826400000000000000000000000000000000034a54b4bbb3f128608a866f5f5c554cf6ad7899f6650ca663a5bd5f1a3e4471e35a2440644c0e4e0a56080936b46d12", + "Expected": "000000000000000000000000000000000d4734ab1bbcf9e30cf142a7aa9e8cde1b3c88d92397b8d7d48c7a7402561feee58a810abf67776e1890489efe7f8ec20000000000000000000000000000000005be9e4af0c0c183c43601339f162345f7c013f5941167cd925057e91c4641e19091a20123a36f2e803142833c0bc1ef", + "Name": "matter_g1_add_81", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000021203675e0ae188ec782160e21492a6ee39fa97d922c1ef9bbfd79b82b3fad54fab11ba633fb8f02cf92249d85d9d8000000000000000000000000000000000062783335b87300c97b38e03e5b1318d15a499b29a473c187f930bf34bc1214b4d822725678cbde978c7b5ae6d4bad5100000000000000000000000000000000014f16cbb17e7f63284d8a75968a4c8fc8ee7f37233ed656d696477c507c23e7c7eaf54001f44c93deb14c298aa6f94c00000000000000000000000000000000169bde83e861889c50b2138c76531a5866235d515a6fee4da7aaf8e8b903f2848a9fe7bbd55eac7f1c58ce3a88e7249d", + "Expected": "000000000000000000000000000000001400f774b2d932c6b990da6e1b3493685e8f51d429e0c53e9af1b4a2d3876781b790bca4a1bc28ce0240ea21be24a2350000000000000000000000000000000004993fcf5723b7e02095d4ba73ff3194bbe36027bc9099b57084c91c7e7d50b76331bfb06d3c678d3e401bc3f7fcc577", + "Name": "matter_g1_add_82", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000e4979375cd880e26d00461de629bac880c12e24ede4a7c702f151c34a728a69a021e37b6a1af520a5f47d3a33f8c8a80000000000000000000000000000000013b5317e3ff7540048b19ceebd47c15538d7eb3bf402823b9c348c464afb1000ce0f7ea4c1cb668af5c8cbf77e6a92510000000000000000000000000000000009acc4b4678b4b645fde47d1b75a5dda8caf6696ad2bf312dd5c12d7f3ab50b95152f5fe59842650c8a1a785f345c3ab000000000000000000000000000000000b672989004fe54f4d645e40cd29a21418151134fd2b90a68185040ceff141ced7f7ece1fdd9137c32589fa04b105a0e", + "Expected": "000000000000000000000000000000000fcb0ab180a69b0a230d9dba98099fdce4969f82fc7e7ad93352a7c8dd448bb0ba9c7d62f53d5dc80506bc36190d9bc700000000000000000000000000000000047b7306f4a53c21d42993c50f2365486d02dac495f2dee4f8971a4af308396fce6c90f3cfde857bf7a2c6bf5d0d8aa7", + "Name": "matter_g1_add_83", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000017f16cffb737dadd52b3c5be258733dc47301474b7351c8dcb8ddb4c519018be08b64efea3336f2b6cfa78e0669dccf9000000000000000000000000000000000ae10eb4f791aa31e5bd7b6c4d68b04c6744262d8f5e9469b3987b101ff5a3066794e05694a9167b7050c3944b6d84f6000000000000000000000000000000000198e12ade128447a240e03e024183c401d605cab1ed81f0f5bb7bc4c7cc9c889a2a01f59c0e37a0767a927719e5a95d000000000000000000000000000000001946e39fee9b76ce552108b339b9b24d11e43d3275ac19d2d4bc745c409bdc3f7c473a60c4d3a4d2cc3b598ae0d66880", + "Expected": "00000000000000000000000000000000050b45f896fa40099cda8b1f20ab88644915c16f926589cd709e00149b12922347fa7122175424cd44e8875f217b9ad7000000000000000000000000000000001122b7e9b1509efe5616368b14085bdd36fb7adb85cd5a7f23e327548986f5298c045a602b6ee1265d53a4432a4a3c0e", + "Name": "matter_g1_add_84", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000062168f0bfd29c44074430158708a1e3b6808bae633ce9506b32eb9124db1a0668d83f2076adffb568ccf289a61685420000000000000000000000000000000016aead8bd8c4d5ddc444e15bc83e8f14d377d5e8d756a0255f1387506b9a9add69592241dbd9cab95474d55ac47388620000000000000000000000000000000009c48aa2681b3005b24075bb3a122ac100cbaca872f761f4398edaba9dd9da6d04d4a4925028297dfe5f77c2b0b5c821000000000000000000000000000000000ea95c646fb68aa458e69c267a6ca640a6a24d40bdca0161246e4521d13c46facfc1ac86dfc0a804cfa6665cebeec822", + "Expected": "0000000000000000000000000000000005325a499aec678ada9eb673d366fe0475e885d5188e2fb687a96949e8f782852fba962197976b868ec083c512bfb66b000000000000000000000000000000000c4d6fcacc8d82401882bee355b37930d83e3cea2e4a7bc133e65a3e0af919b25fc3f30c333873da9406845ce42dbb87", + "Name": "matter_g1_add_85", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000c60b948942652a8214d8776b77a6c559ca77eb3a537b0a9abadc3058eac8c1d7840f091acd6c0056d5a71468a2b1ceb0000000000000000000000000000000019049c394e547b9b714b5969adcf068b381def6af2b27d1d361d06e9576273a8febb5bf94b5061ccec7afdb5642c0ae80000000000000000000000000000000008e8799a6cc0339e94e861692c81eee53e8a7b326523d5344b416bfbce04290585ef56018834cfd93d234bfa2943369f000000000000000000000000000000000fa1b01aab0878adad693ec769fb68640931c355b3802c51d4a3772300be5b16ceecdc8328a229b3b9f3639170db96f8", + "Expected": "000000000000000000000000000000000685ec14da61c48bcb697966aca9e27601db43f0fb1f32e026fb33738eecfbb7012aa1ca3acf36a21fa846730245add70000000000000000000000000000000003fc52a1c3342b12271bbc178545bb20e96e8f1fde673e51f3d27ab5cb42e60aca49c6077e0f687be59b2d25cda9718e", + "Name": "matter_g1_add_86", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000013fe38343072af8ef1d8247c3d46b4fd190086ceddfeb767787031368da6a6a6ae849cfc26a24ead499338e37fa337e30000000000000000000000000000000009f7d7b21882455e9f1f24ea120f3eb69f739c1320c37eb2b17e0a271cb03ac6e2b0c55d3518548a005f28b5748b7f59000000000000000000000000000000000bb3a76287fb98fe668cb0a5de603c768340ee6b7f9f686a22da3a86926d8734d2c565c41f94f08fa3ef0e665f4ccb520000000000000000000000000000000016c02dbfb307c96d5b9c144672fe62f3e9cd78991844f246945ee484cbdef2a4c1b001a017cafb3acc57b35f7c08dc44", + "Expected": "00000000000000000000000000000000021796fd6ef624eed7049b8a5c50415cc86104b2367f2966eb3a9f5b7c4833b9470ef558457426f87756d526d94d8dfe000000000000000000000000000000000f492dca3f0a89102b503d7a7d5b197946348e195954d23b8ab9ab7704b3bccecaa2123b8386662f95cd4cfdbbb7a64d", + "Name": "matter_g1_add_87", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000018c6df81d810deaac0b143edf79956c92af7941f7b279db345f838bd583177912fc2eb367616ae165e261014a4d7b1b900000000000000000000000000000000146696840e8e988d0eab90ea935dd8b5f1272bbb81eb524e523c57d34ad7c5f0f3b721566f51dac4774826b84cc1c82f00000000000000000000000000000000127420ff97df415e336cf3e24c39c161fad630c45c7ccef80f1831c4f5ed54da12f2c49a161e72bc70285fa0498e46d00000000000000000000000000000000013e605c21014f72364f8bff392ce64a10078ea537237fa282d5dd252ba1677b84b8c15d7925e54a4ab36f1feb13d3064", + "Expected": "000000000000000000000000000000000ae916770455b0a63717e81802f5a7fcfbcc3e260b7adeca02a61a520c338d495eea29c4f070fd6efc1b8d23eb285e4c00000000000000000000000000000000134784e092744df573ba78f7d6f3cf1ed19491a0fc7ddfa02d3ca043bcf102fd40c33ac44b03a947308e3cc7af41c2df", + "Name": "matter_g1_add_88", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000c6b634d90c2664b9fa4ccbca35913d23696825350e21f0a6dd5e9abb17497a0a499e1b7b928a57ba8c730158f63b75d0000000000000000000000000000000009d569f05e69a38231d0f636e1ef040af059a00db4ff09bd2ad82b7e04cc041a33603c2eb9b148e3b1412bdef9740ab40000000000000000000000000000000016f41e8b098839944adc12481e5f965657a4faedd4f4cdea51a9597a6a0356989e791a686d3d2ee6232ab93683259c6b000000000000000000000000000000000d27b4a56b2cc2216e61eb41061f9a586a704652704906f7fe0eab869ba00d34205ea66f7a02d337d08b916598494e52", + "Expected": "0000000000000000000000000000000012842c9d7f4309f6e40124a071d317f5597de419db0d5a8e5324a517f7b61dfdeea2fb4503ad7cdd8deb8aaa5c412554000000000000000000000000000000000ace4d9f98ee6e8a4416ef14d64f26dc49e102e69eced46ef829a352e58e8c1a7e1f083e3f4fc07f24ccd1685dedf215", + "Name": "matter_g1_add_89", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000018129b2f00be24717c906d215beaaa136758aa1730bd0bbe9c0de9b3cbb3c0ea47911817fa322b907cc6fc720cabde05000000000000000000000000000000000e8b0f968ccb230517ef8980be559f410a2c4035a1101e6796d4f7a5ee5c93a19c111d38930bd5bca69405fc35fea7c20000000000000000000000000000000019e7c8d182e3b674dfa21539613f7de5d4872d4f4732307a5c6d95ada7e81a01bc25bda34e0b46634e0b0b32cd47e8ec0000000000000000000000000000000008149237de73ab46d5c20dfd85b07f593c0caf2e2e364335450e3ebb478a9f6b9ac0af89174dffd92eda2783a5271f01", + "Expected": "000000000000000000000000000000000875289fdaead079a283aafe4de7035c88662642b6bba389b17583f8e3b5801dada6e46bd897af961997665e6ed4a55700000000000000000000000000000000050a6b9c1db35865df0a042d27a042ff4b8d3bec2fba6a3a28a71c5a574620dc05cda0e70932ce9b8966e4592220c147", + "Name": "matter_g1_add_90", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001667fdc9b89d12fb0704fdec910cab1b51ac04219ef6e50f996688b2ceb26dca0e9e8594c5b81fca2e8fc2c8d8fa9a4700000000000000000000000000000000193118d1f237c68a8a0961fb220c0fd6a08853908a039dd57f8ed334063e5316bf83e8c3c3f44420734abbd7ddda31a6000000000000000000000000000000000c0f33f2d76366af661d6fa58a8b5aab207d35ce03899e495f7ddccedf201d9816f270468b207413a2ca70380c798fc60000000000000000000000000000000002a7dc7e2b163e65cadf93b5d682982288c8f36d08b1db8e0b1cb40cd3c7231f3f1672da42b4679f35db2076a8de5b42", + "Expected": "0000000000000000000000000000000019ea92820dcd442358db359146797aa82beff6154946b1ea14dccae05e8252b776b817dc044a20764e3514cd22799c0b000000000000000000000000000000000ed929fef2cb11e8b6b9b5d52bfde82080eda747f0c82f33b9cb87019476f0c128e6b918a4486172dee2884ba538ae5d", + "Name": "matter_g1_add_91", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000217a4c563d730ef545e452038813301933ccc6638321ee5e217dad0be2e3ddc855a14054d0d72b6bcc692a5fb1ac7300000000000000000000000000000000007025f1c4a5f85a9c1587d4d4a2e620d83d60568343940ffd85e6b1e4fb0f0f53bb08c4f48bf6f45a7dbc3722ecc951e00000000000000000000000000000000118fb45274a6b0ca9fe2654821e3b30caa46444f7c64b1921cf16dfd56a43916947d4fb6968d718a59a30ed38d65ce3000000000000000000000000000000000110e8e73e640bbea6927cd770baaf887c8e0e0c58260bca489c39b6dd7a24ab8c0c0a2495133d8ff8c7afb9790b37faa", + "Expected": "0000000000000000000000000000000009452bd0a167683e30c673ffd4e750c66a81edf309a8d2d6dd915c358b30b0ffc001c4165b1b17bf157a0f966bfd91d00000000000000000000000000000000015df0b1ee359dd3e35a7b2c33edbb8e92b18804ae3359a369c6a529f5561298e6be9a3498c9477f33353124af7e91968", + "Name": "matter_g1_add_92", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000009ec00ea2da59d937d3154d86dbed2957667253401bce9de80e0ffe6df32f36b06404b9e3af08e912a0b4ef091f93efb000000000000000000000000000000000dd8d1bd66f4accbc9d0c7dabef7af72f51c67a0d61384647533ad92bba44a312f0be0fa52163176f1aff4e64c00aefb0000000000000000000000000000000005dcb54cdf9635db275540c16307fc9f07b4ca5cd91e3977e4b95b58e8103e40ed9fa74752b2a43d95b6acb6f5fcbf440000000000000000000000000000000007ef8457752a47864ef2698176a53990e4822421ecf83b2716251e3ce69151ab2767d4a6611a0a6e0e40a57164ffb94e", + "Expected": "0000000000000000000000000000000011f1ac702a06699dd64b63ebdd8b5381578f63b603c63c3a47413fe764af239ab7024712320f3ea3daefa6bd3cd3dfe9000000000000000000000000000000000918bb83a22b4fc66247e007c17155c4c2ec6326131c10fe04a5f9b82ddeca3d21c7c397a70a3949fda4d766540c85ff", + "Name": "matter_g1_add_93", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000014153e01c9e495c5c01c82b3cad9eaf20cf78369ccbabf57fb160ded309cbd1caea3d3df38a7ea5490c67f168e9acec0000000000000000000000000000000001648030be79658c134e016a211d311841988065957b35e9bc1580fb6e05e291e747b7a960a50e26a2a3c0cd1634c35850000000000000000000000000000000006d3335e092616363e94436bb68be89667c706564ba687f4a3494fcf7da62fd9ad8ae68cb76524926c261983711a14ad000000000000000000000000000000000f085a3d013592c402a380e2e8d9019864a775e7b8e8b94603c8cc1eb1def1e91075fd5675f76534397e2a7d76c2331e", + "Expected": "000000000000000000000000000000000344951ccb5e60d1838f7793fcf8b765f5f252b69e1cfdb4bd3c20692c8ffa01afbda6950974a65f6ac74afb9da5942e0000000000000000000000000000000014f5f0e6b99a04d1c5c2adf96c53dd41f8c01aab8db4f0e6d7fc5eab27f6c03c429632db4e1c21467c09d8a54066a4d3", + "Name": "matter_g1_add_94", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001555535228eb9a24f460df9894d59aa06fc848a8bf8d6c3b51653b1d85734b3c5a2bece161309bd478d356fa198d579500000000000000000000000000000000144401f7eb69f6321eae8dad39dbe2cf4ae58e455474701dd9f1b62c85c7536813e84eb4f9def511eb62e5194288728b0000000000000000000000000000000019e2ed6e9757e2339d013078fac91c966045f7a1416a56135d75e603c2021a8bebf4acbf6c0d5ba911f66510e9a7ad1a0000000000000000000000000000000008b8585444ffb3bd4fb6ee23e8128142aa72fd574a506151a0eea8979cbd694e03897caba63771b0490d46063bc5bb57", + "Expected": "000000000000000000000000000000000a449fb0da911c544887b24860bc5fcaaf054041cc80f16bbb44c796520bee454d0d06f84fd5aa179a44fd4fac9f144a000000000000000000000000000000000fca81401349089caaef9156a86c64271c77235c9efd136dcfad9894450b076cb3dd1a05bfa1e62ef904435eee5d2250", + "Name": "matter_g1_add_95", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000b767f399e4ebea34fd6b6b7f32a77f4a36841a12fc79e68910a963175d28cb634eeb8dc6e0533c662223c36b728cce2000000000000000000000000000000000cb3827fd6ac2c84f24f64789adac53439b4eba89409e12fbca0917faa6b7109aa831d16ca03191a124738228095ed65000000000000000000000000000000000f4a256b4288386545957a3ba28278c0ce69a8a412febfed1f952ca13e673822bacb6b7751ea75893b680ea363aab66400000000000000000000000000000000152379d006e74798199f83b0c6c22a98440ef653d7f0a8c5e3026bcdabec8be59a3cc291ba05860bd0639c5c5f5bee26", + "Expected": "000000000000000000000000000000000c427721953e139d4f12ad2a3f8f91a4caa49875a87001b619c8a6e909a7da8ddd9dd026bf56d5f85d49fd17527106a800000000000000000000000000000000018add2816914ef51a289e707ba0224fcf0b7bcfa4001487e90dbdce53f1b596e1f5872de32fcee6f63bce4484ccbef7", + "Name": "matter_g1_add_96", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000150b75e9e9c03ada40b607f3d648bd6c40269aba3a1a992986dc005c9fde80bb1605266add0819641a0ca702d67bceed00000000000000000000000000000000083b43df032654f2dce90c8049ae4872a39f9cd860f08512930f43898e0f1e5625a5620818788797f3ca68134bc27d220000000000000000000000000000000012dae9aee13ed6ad52fe664bf7d2d0a1f134f0951d0d7ce5184e223bde164f6860967f9aaaa44fa6654d77d026c52d2a000000000000000000000000000000000f71889d64ec2f7da7319994883eb8bd1c753e6cdd3495036b630c35f07118a1bc10568c411ecbdf468a9cdaa9b4811b", + "Expected": "000000000000000000000000000000000275b8efb3a3e43e2a24d0cda238154520f0a2b265f168bfc502b9cd4a07b930756961ae7e4fe3f01a5473d36ce3356200000000000000000000000000000000113403d5a968f01ba127dd8ef6c8d7b783a10d039a6b69c617032eba7122e9297f3ce2360c829ae64fdc9794695bf173", + "Name": "matter_g1_add_97", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000cba419694214e95a3605a9b748854d16c8e6e1ee151c907487d8189acfac1361b790a5e78f43593152027295adf8df400000000000000000000000000000000110813ff6e0ddf3427e2a514d3f0bfbadcaf9dbf039e0f93fb9643d1e62bc2469fe84cd9ff0d585bdd1037255bbe54850000000000000000000000000000000004e9dd69012ab596b5d3f1f8e4593b448685fcec4ab3394008178b137b762ddf9150cbb8dbb74c8af45bd8baab9a6c4f000000000000000000000000000000001132b66a2127885774062732127951f051c9c3c9b5aba02406e3f3cd4ecfe2dbf6614ebaca3bfe9efbe4f6e5b15ba0f5", + "Expected": "000000000000000000000000000000000594c808954bb930bd038806500c9e3fd6460a83554e945baeeec2354a3805f046c76aea62c249080f16ae8e70f8fa6b00000000000000000000000000000000046924a32fb3f2df9a52615e45eeea2fa3ac0e2ccd38458194ada6b4d993ecdc0f441e41d0ea37599254a06aef68b9ae", + "Name": "matter_g1_add_98", + "Gas": 600, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000106df8eba767e90cce0eabdaacc24d8e226c6865012ef8cb1460de5a319d443fdc6b4f4e58fb668943e0528b1809da10000000000000000000000000000000019789f464c95c179af18704c0b67b881991880f75ee7b03b9feafa3eafcd0f7d30a17fdd9cf439ff7fe683adca2083b50000000000000000000000000000000017a81b957a12adf474a2913e8636f169ea9cd10be62c16b88f95f5caf661f158a032a9f7d249fdf2765caa1564bed0570000000000000000000000000000000017fbf2abc62dc2678b65d509e19c9c9c5d961c72565649a078da8dff98be6236ef314e9ff8022f639ff565353345c230", + "Expected": "00000000000000000000000000000000002c8bc5f39b2c9fea01372429e92a9c945fad152da67174f4e478fdead734d50f6e2da867c235f1f2f11bdfee67d2a7000000000000000000000000000000000c1dd27aad9f5d48c4824da3071daedf0c7a0e2a0b0ed39c50c9d25e61334a9c96765e049542ccaa00e0eccb316eec08", + "Name": "matter_g1_add_99", + "Gas": 600, + "NoBenchmark": false + } +] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/precompiles/blsG1Mul.json b/x/evm/core/vm/testdata/precompiles/blsG1Mul.json new file mode 100644 index 0000000000..0e166a29ca --- /dev/null +++ b/x/evm/core/vm/testdata/precompiles/blsG1Mul.json @@ -0,0 +1,730 @@ +[ + { + "Input": "0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e10000000000000000000000000000000000000000000000000000000000000000", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "Name": "bls_g1mul_(0*g1=inf)", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "Name": "bls_g1mul_(x*inf=inf)", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e10000000000000000000000000000000000000000000000000000000000000000", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "Name": "bls_g1mul_(1*g1=g1)", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e10000000000000000000000000000000000000000000000000000000000000011", + "Expected": "000000000000000000000000000000001098f178f84fc753a76bb63709e9be91eec3ff5f7f3a5f4836f34fe8a1a6d6c5578d8fd820573cef3a01e2bfef3eaf3a000000000000000000000000000000000ea923110b733b531006075f796cc9368f2477fe26020f465468efbb380ce1f8eebaf5c770f31d320f9bd378dc758436", + "Name": "bls_g1mul_(17*g1)", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000012196c5a43d69224d8713389285f26b98f86ee910ab3dd668e413738282003cc5b7357af9a7af54bb713d62255e80f560000000000000000000000000000000006ba8102bfbeea4416b710c73e8cce3032c31c6269c44906f8ac4f7874ce99fb17559992486528963884ce429a992feeb3c940fe79b6966489b527955de7599194a9ac69a6ff58b8d99e7b1084f0464e", + "Expected": "000000000000000000000000000000000f1f230329be03ac700ba718bc43c8ee59a4b2d1e20c7de95b22df14e7867eae4658ed2f2dfed4f775d4dcedb4235cf00000000000000000000000000000000012924104fdb82fb074cfc868bdd22012694b5bae2c0141851a5d6a97d8bc6f22ecb2f6ddec18cba6483f2e73faa5b942", + "Name": "matter_g1_mul_0", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000117dbe419018f67844f6a5e1b78a1e597283ad7b8ee7ac5e58846f5a5fd68d0da99ce235a91db3ec1cf340fe6b7afcdb0000000000000000000000000000000013316f23de032d25e912ae8dc9b54c8dba1be7cecdbb9d2228d7e8f652011d46be79089dd0a6080a73c82256ce5e4ed24d0e25bf3f6fc9f4da25d21fdc71773f1947b7a8a775b8177f7eca990b05b71d", + "Expected": "00000000000000000000000000000000195592b927f3f1783a0c7b5117702cb09fa4f95bb2d35aa2a70fe89ba84aa4f385bdb2bfd4e1aaffbb0bfa002ac0e51b000000000000000000000000000000000607f070f4ae567633d019a63d0411a07d767bd7b6fe258c3ba1e720279e94c31f23166b806eabdb830bb632b003ca8b", + "Name": "matter_g1_mul_1", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000008ab7b556c672db7883ec47efa6d98bb08cec7902ebb421aac1c31506b177ac444ffa2d9b400a6f1cbdc6240c607ee110000000000000000000000000000000016b7fa9adf4addc2192271ce7ad3c8d8f902d061c43b7d2e8e26922009b777855bffabe7ed1a09155819eabfa87f276f973f40c12c92b703d7b7848ef8b4466d40823aad3943a312b57432b91ff68be1", + "Expected": "0000000000000000000000000000000014f9bc24d65e3a2d046dbae935781596fb277359ba785808fd9ff7fd135ba8c1ddc27d97a16cc844427afbf4f8fc75a60000000000000000000000000000000017e3a485f84e2f2bdcf3255fe939945abe60dca5e0ae55eae9675dcc8d73e06d00b440a27ab4dc21c37f0bd492d70cf4", + "Name": "matter_g1_mul_2", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000015ff9a232d9b5a8020a85d5fe08a1dcfb73ece434258fe0e2fddf10ddef0906c42dcb5f5d62fc97f934ba900f17beb330000000000000000000000000000000009cfe4ee2241d9413c616462d7bac035a6766aeaab69c81e094d75b840df45d7e0dfac0265608b93efefb9a8728b98e44c51f97bcdda93904ae26991b471e9ea942e2b5b8ed26055da11c58bc7b5002a", + "Expected": "000000000000000000000000000000000827517654873d535010e589eaf22f646cf7626144ca04738286de1f1d345342d5ae0eab9cd37ced9a3db90e569301720000000000000000000000000000000002a474c2443d71b0231d2b2b874a6aeac0452dd75da88e6f27949edafc7d094cb1577a79f4e643db42edcaecc17d66da", + "Name": "matter_g1_mul_3", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000017a17b82e3bfadf3250210d8ef572c02c3610d65ab4d7366e0b748768a28ee6a1b51f77ed686a64f087f36f641e7dca900000000000000000000000000000000077ea73d233ccea51dc4d5acecf6d9332bf17ae51598f4b394a5f62fb387e9c9aa1d6823b64a074f5873422ca57545d38964d5867927bc3e35a0b4c457482373969bff5edff8a781d65573e07fd87b89", + "Expected": "000000000000000000000000000000000d7e5794c88c549970383454d98f9b7cebb7fdf8545256f1a5e42a61aa1d61193f02075dc6314b650da14f3776da6ead0000000000000000000000000000000002054faff236d38d2307aa6cbbc696d50f5b3ffead1be2df97a05ebbcbc9e02eaf153f311a1e141eb95d411c0ec6e981", + "Name": "matter_g1_mul_4", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000c1243478f4fbdc21ea9b241655947a28accd058d0cdb4f9f0576d32f09dddaf0850464550ff07cab5927b3e4c863ce90000000000000000000000000000000015fb54db10ffac0b6cd374eb7168a8cb3df0a7d5f872d8e98c1f623deb66df5dd08ff4c3658f2905ec8bd02598bd4f90787c38b944eadbd03fd3187f450571740f6cd00e5b2e560165846eb800e5c944", + "Expected": "000000000000000000000000000000000ff16ff83b45eae09d858f8fe443c3f0e0b7418a87ac27bb00f7eea343d20a4a7f5c0fcc56da9b792fe12bd38d0d43c600000000000000000000000000000000042a815a4a5dca00bd1791889491c882a21f0fe0a53809d83740407455cf9c980c5547961f9ebe61871a4896dace7fbd", + "Name": "matter_g1_mul_5", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000328f09584b6d6c98a709fc22e184123994613aca95a28ac53df8523b92273eb6f4e2d9b2a7dcebb474604d54a210719000000000000000000000000000000001220ebde579911fe2e707446aaad8d3789fae96ae2e23670a4fd856ed82daaab704779eb4224027c1ed9460f39951a1baaee7ae2a237e8e53560c79e7baa9adf9c00a0ea4d6f514e7a6832eb15cef1e1", + "Expected": "0000000000000000000000000000000009e425f5bdc7df5c2a72303918e5a3c7d2fdeeb071179c533f83cdcf38dbbdb1ec5f4ebc85f3ed80757641ee3f8a8637000000000000000000000000000000000819a3e81e9ac2baacdc778225129e16344107517157ab2a7bc5e3480938585c55fd2dd7185f52251f5ab191f162cf5d", + "Name": "matter_g1_mul_6", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000002ebfa98aa92c32a29ebe17fcb1819ba82e686abd9371fcee8ea793b4c72b6464085044f818f1f5902396df0122830cb00000000000000000000000000000000001184715b8432ed190b459113977289a890f68f6085ea111466af15103c9c02467da33e01d6bff87fd57db6ccba442adac6ed3ef45c1d7d3028f0f89e5458797996d3294b95bebe049b76c7d0db317c", + "Expected": "0000000000000000000000000000000015e6bea7ecf15d91bde67231f794397502c087960fab36d905137ce2608172b5a5def065cf7ee567ca7fb08a22adecf80000000000000000000000000000000001eed472d6138fbc56e10edb62563c086fdeb9acf6de957f2367db7f1c80d2c23197c09039ed55e65cb56de9fb9be64d", + "Name": "matter_g1_mul_7", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000009d6424e002439998e91cd509f85751ad25e574830c564e7568347d19e3f38add0cab067c0b4b0801785a78bcbeaf246000000000000000000000000000000000ef6d7db03ee654503b46ff0dbc3297536a422e963bda9871a8da8f4eeb98dedebd6071c4880b4636198f4c2375dc795bb30985756c3ca075114c92f231575d6befafe4084517f1166a47376867bd108", + "Expected": "000000000000000000000000000000000220a71ad70fcf7e47df60381fbd1aba33c03a3f8537ba2029ad8e99b63c8677e0183f0b5bb2a5e1b23bc56693adb45c0000000000000000000000000000000017f26ac6ffc79ded7c08e08673336402f47ab48ef9ee2e46e3265e5cbb790cfc86f41bd1b578c5891eb052d11197c850", + "Name": "matter_g1_mul_8", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000002d1cdb93191d1f9f0308c2c55d0208a071f5520faca7c52ab0311dbc9ba563bd33b5dd6baa77bf45ac2c3269e945f4800000000000000000000000000000000072a52106e6d7b92c594c4dacd20ef5fab7141e45c231457cd7e71463b2254ee6e72689e516fa6a8f29f2a173ce0a190fb730105809f64ea522983d6bbb62f7e2e8cbf702685e9be10e2ef71f8187672", + "Expected": "0000000000000000000000000000000006b27724c4898b4f71be9727b773709a7905997d06a41ee618b7dcf864d7457bb3241046f0139c1d678b6ba6226f090f000000000000000000000000000000000b20cabf58f9c29897e20e91a9b482f5f867bef45ce0941cb8850aaa2022182298a1a24655a4b905f436520cc42a30cd", + "Name": "matter_g1_mul_9", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000000641642f6801d39a09a536f506056f72a619c50d043673d6d39aa4af11d8e3ded38b9c3bbc970dbc1bd55d68f94b50d0000000000000000000000000000000009ab050de356a24aea90007c6b319614ba2f2ed67223b972767117769e3c8e31ee4056494628fb2892d3d37afb6ac943b6a9408625b0ca8fcbfb21d34eec2d8e24e9a30d2d3b32d7a37d110b13afbfea", + "Expected": "0000000000000000000000000000000004745f9877b3a0851df5bb770a54c69d5355cdadddc9d961e2bfdb3d0531d3d0f780f462335289be29ad4c62cb1250a00000000000000000000000000000000011034a094f59212c29e3f91c48df670e7a4021e4586645d250ee74a90f4b7b51510a5048dba3b555511c327ed211f81f", + "Name": "matter_g1_mul_10", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000fd4893addbd58fb1bf30b8e62bef068da386edbab9541d198e8719b2de5beb9223d87387af82e8b55bd521ff3e47e2d000000000000000000000000000000000f3a923b76473d5b5a53501790cb02597bb778bdacb3805a9002b152d22241ad131d0f0d6a260739cbab2c2fe602870e3b77283d0a7bb9e17a27e66851792fdd605cc0a339028b8985390fd024374c76", + "Expected": "000000000000000000000000000000000841c1538c1a3b54418c1c5557a5815c9ed74f6e1c8ed70e1ad424220dc522c530e2e48affe6cb3190abb25af84b91a300000000000000000000000000000000167490a2aa6c8796736cbd364a4d18007ecfee403bde5dc13c611a214610e85af314ddddbf05ea129e027e0ae8d89b36", + "Name": "matter_g1_mul_11", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000002cb4b24c8aa799fd7cb1e4ab1aab1372113200343d8526ea7bc64dfaf926baf5d90756a40e35617854a2079cd07fba40000000000000000000000000000000003327ca22bd64ebd673cc6d5b02b2a8804d5353c9d251637c4273ad08d581cc0d58da9bea27c37a0b3f4961dbafd276bdd994eae929aee7428fdda2e44f8cb12b10b91c83b22abc8bbb561310b62257c", + "Expected": "000000000000000000000000000000000ea1f952d65dbb9a40209aa89e367d9d75e1b4c3a70a609efda5fbe7f5c5483163671da425545d3f1afb817c6d8c59a0000000000000000000000000000000000cd537dc11cc63dd15c8ff74d15961390eaee59b2d5697b18c1ea6d534d71551f5e195e8a0793140d821dde97dc77623", + "Name": "matter_g1_mul_12", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000024ad70f2b2105ca37112858e84c6f5e3ffd4a8b064522faae1ecba38fabd52a6274cb46b00075deb87472f11f2e67d90000000000000000000000000000000010a502c8b2a68aa30d2cb719273550b9a3c283c35b2e18a01b0b765344ffaaa5cb30a1e3e6ecd3a53ab67658a57876817010b134989c8368c7f831f9dd9f9a890e2c1435681107414f2e8637153bbf6a", + "Expected": "0000000000000000000000000000000004c92b7cf9199f47008dd561e624c822a067c57fdea9d016f79e6c7956dda9df0e36b4e78715f3da1319af9f4f1fb160000000000000000000000000000000000d2851d68617567ad5308f69dc5dbbf37603c2ba48cb3759b70fc4301fdce3bdc9fca076e2ae09562396c1b8558ccdcc", + "Name": "matter_g1_mul_13", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000000704cc57c8e0944326ddc7c747d9e7347a7f6918977132eea269f161461eb64066f773352f293a3ac458dc3ccd5026a000000000000000000000000000000001099d3c2bb2d082f2fdcbed013f7ac69e8624f4fcf6dfab3ee9dcf7fbbdb8c49ee79de40e887c0b6828d2496e3a6f76894c68bc8d91ac8c489ee87dbfc4b94c93c8bbd5fc04c27db8b02303f3a659054", + "Expected": "0000000000000000000000000000000006ed98add25d64f7488ed270e0899ee3633c84b73de26557c552017e7cda4cba1228c15e87efb5a740284dddb8cc80de000000000000000000000000000000000b363e14b0285fbd24eaacfe80b992d8df1abfe83991cc55b0484076385374bc87d9c7860177f06143c600503ac54577", + "Name": "matter_g1_mul_14", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000130535a29392c77f045ac90e47f2e7b3cffff94494fe605aad345b41043f6663ada8e2e7ecd3d06f3b8854ef92212f42000000000000000000000000000000001699a3cc1f10cd2ed0dc68eb916b4402e4f12bf4746893bf70e26e209e605ea89e3d53e7ac52bd07713d3c8fc671931db3682accc3939283b870357cf83683350baf73aa0d3d68bda82a0f6ae7e51746", + "Expected": "00000000000000000000000000000000164671460621354cd352d93ca7de51828b3e6db0a37d2894a0ac475a5facdbc3ca5909d3bd7553271dadaa68b7474e2c00000000000000000000000000000000188827c6e2f4e9796c71703ba53ba2ded71bd6e8280e047fb6ea440b8dcafa7c4252d26bee1780ac67790e0d603c8ca7", + "Name": "matter_g1_mul_15", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001830f52d9bff64a623c6f5259e2cd2c2a08ea17a8797aaf83174ea1e8c3bd3955c2af1d39bfa474815bfe60714b7cd80000000000000000000000000000000000874389c02d4cf1c61bc54c4c24def11dfbe7880bc998a95e70063009451ee8226fec4b278aade3a7cea55659459f1d507f80a5e502f63375d672379584e11e41d58d2ed58f3e5c3f67d9ea1138493cf", + "Expected": "00000000000000000000000000000000023b2129ac67abc79966102ba223b982d40ca83e9b1ce33dff681c751b3f0c692f8bf19fa0394eae190767899829d1d10000000000000000000000000000000015449c6b5ee2c9f8b28e9732c9ebf6ffee5048263f7b5050a5ac9a76b034931a5c034f91d24b461636f5b116e37a26a5", + "Name": "matter_g1_mul_16", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000043c4ff154778330b4d5457b7811b551dbbf9701b402230411c527282fb5d2ba12cb445709718d5999e79fdd74c0a67000000000000000000000000000000000013a80ede40df002b72f6b33b1f0e3862d505efbe0721dce495d18920d542c98cdd2daf5164dbd1a2fee917ba943debebb169138f94093d5c1c6b253cc001ce8baf78858dae053173fa812d2d1c800da", + "Expected": "0000000000000000000000000000000004edac7b03b5861d178bb4aa34e795c776fd95e7c0980f19d111ef208ca4854f73a3ddc219bb6bca173dec67b0e863a00000000000000000000000000000000004dbff672368f86e048c3e33cbe90aba570484b4ca2221f7f6adaa1738c369f4c02c0a10118e84ea8e53cfbaa10fa48b", + "Name": "matter_g1_mul_17", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000009f9a78a70b9973c43182ba54bb6e363c6984d5f7920c1d347c5ff82e6093e73f4fb5e3cd985c9ddf9af936b16200e880000000000000000000000000000000008d7489c2d78f17b2b9b1d535f21588d8761b8fb323b08fa9af8a60f39b26e98af76aa883522f21e083c8a14c2e7edb6e40608bdaf3e7764358a64a920cbb33ab4d571c7b3092e1ae11d9697f82ed833", + "Expected": "00000000000000000000000000000000169d637c52c31e4c62c9563a508869f7bb5adc7defedb5f4ba9f3eabe517fa8c0be2e44d656e50903dcab67a6a44984d00000000000000000000000000000000192b39d5cddac36940d896a738e25c25217768e1d0ca712968718b8fd9ad492bae63063b3cb168368c3df196306b6a1e", + "Name": "matter_g1_mul_18", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000010fcfe8af8403a52400bf79e1bd0058f66b9cab583afe554aa1d82a3e794fffad5f0e19d385263b2dd9ef69d1154f10a000000000000000000000000000000000aba6a0b58b49f7c6c2802afd2a5ed1320bf062c7b93135f3c0ed7a1d7b1ee27b2b986cde732a60fa585ca6ab7cc154bd411519f2a33b07f65e7d721950e0f0d5161c71a402810e46817627a17c56c0f", + "Expected": "000000000000000000000000000000001608c3bfb131eae485545b7d19b8f42de18dcea6a0db3279eac2b7c008fbead54046bf13dd63835abe9c63110e12526c000000000000000000000000000000000abb41b2f17cfcc2292c5bf559b38af3b25db40121c6a5627997f65765eee1743c204f1161abe3f71ac1fe4de6aec1d7", + "Name": "matter_g1_mul_19", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000013c5ebfb853f0c8741f12057b6b845c4cdbf72aecbeafc8f5b5978f186eead8685f2f3f125e536c465ade1a00f212b0900000000000000000000000000000000082543b58a13354d0cce5dc3fb1d91d1de6d5927290b2ff51e4e48f40cdf2d490730843b53a92865140153888d73d4af6bb3f9e512311699f110a5e6ae57e0a7d2caaa8f94e41ca71e4af069a93d08cc", + "Expected": "0000000000000000000000000000000016e3125ae97a2b1184e2c6dfe5d9459ac567c686e65674f3b0513df6de5e80d1efbff3c254e509eec3f951b0835b5829000000000000000000000000000000001889481258d3e898ed4e4a43e74c0eda5ba26c0b7525973ca86b896969240ac5928ba58bc86ec17a47f2469d023682dc", + "Name": "matter_g1_mul_20", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000053a12f6a1cb64272c34e042b7922fabe879275b837ba3b116adfe1eb2a6dc1c1fa6df40c779a7cdb8ed8689b8bc5ba800000000000000000000000000000000097ec91c728ae2d290489909bbee1a30048a7fa90bcfd96fe1d9297545867cbfee0939f20f1791329460a4fe1ac719292a0c988d97e86dccaeb8bd4e27f9e30fad5d5742202cdde17d800642db633c52", + "Expected": "0000000000000000000000000000000017d8c0aa81ca6a1e4de8d0b8b3a13b1d6350f79ee8439da97a5d564d435f4d40bde99138b67284beffbb176daee92352000000000000000000000000000000000a04e0bee6b9681db56604a6dd5e41c072e84f8ee9cb4054410eb610472b96c09802a1d70e325c40c7ab7e248eb2e3e4", + "Name": "matter_g1_mul_21", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001354dd8a230fde7c983dcf06fa9ac075b3ab8f56cdd9f15bf870afce2ae6e7c65ba91a1df6255b6f640bb51d7fed302500000000000000000000000000000000130f139ca118869de846d1d938521647b7d27a95b127bbc53578c7b66d88d541adb525e7028a147bf332607bd760deac0b299c14892e0519b0accfa17e1a758c8aae54794fb61549f1396395c967e1b1", + "Expected": "00000000000000000000000000000000089ae9fc5cdba1a24ca87fe4f1207d1a36c494d842eed330069f988d3bc8554af1deee3a5c59b5e74729097acc1185fb00000000000000000000000000000000002fd95001da3011b48067d351ec8667c2b2390b23fa0948896725292311dbae71b51d6d5d57e173970bc992d11fdd11", + "Name": "matter_g1_mul_22", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000003f76a6dc6da31a399b93f4431bfabb3e48d86745eaa4b24d6337305006e3c7fc7bfcc85c85e2f3514cd389fec4e70580000000000000000000000000000000010e4280374c532ed0df44ac0bac82572f839afcfb8b696eea617d5bd1261288dfa90a7190200687d470992fb4827ff327064d43d6802ad4c3794705065f870263fef19b81604839c9dea8648388094e9", + "Expected": "000000000000000000000000000000000548e7564e09c2bad9859dd63dd1045878c9b257015558b18cf5911d1763325e411c1fb8af52e8766fa7adae83eea12700000000000000000000000000000000111235351d136905fd19fa726eb6626085875c33c98067a01fde9688a5b2c289cb8e3f5d6a85d0829200a355c82f423e", + "Name": "matter_g1_mul_23", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000009439f061c7d5fada6e5431c77fd093222285c98449951f6a6c4c8f225b316144875bc764be5ca51c7895773a9f1a640000000000000000000000000000000000ebdef273e2288c784c061bef6a45cd49b0306ac1e9faab263c6ff73dea4627189c8f10a823253d86a8752769cc4f8f2686285a0e22f177fe3adbfc435e9c1786752dcf3c11b723539789b0cdeb0647b", + "Expected": "00000000000000000000000000000000165504769c7ab0d28b39f38f3bd09cd47c63b74c57d39935d1c03e262f9da0e8b0b9264b0d8e2908423fe5c74288c208000000000000000000000000000000001680df1d577bbbb66ffa10258bca54b74cd90a7b3f3d50472e70e18ef54b7a4412e9eb93e39b9b312e3e8e00a52e4067", + "Name": "matter_g1_mul_24", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001478ee0ffebf22708a6ab88855081daba5ee2f279b5a2ee5f5f8aec8f97649c8d5634fec3f8b28ad60981e6f29a091b10000000000000000000000000000000011efaeec0b1a4057b1e0053263afe40158790229c5bfb08062c90a252f59eca36085ab35e4cbc70483d29880c5c2f8c23176b6724cf984632daf95c869d56838ab2baef94be3a4bd15df2dd8e49a90a6", + "Expected": "00000000000000000000000000000000087a52e8eadd5461e202a640024fa17e201a9f0a2984be3fecfdeef86abed72d059e8879d0be8789f2a6db0d2cf55d3400000000000000000000000000000000196fe307db05207661a5a5f8f7fb24d8fea18ef91941ea7febbc18819f49f73aef9dd1bdf4fd605e031dc04f16fa92e3", + "Name": "matter_g1_mul_25", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000150d43c64cb1dbb7b981f455e90b740918e2d63453ca17d8eeecb68e662d2581f8aa1aea5b095cd8fc2a941d6e2728390000000000000000000000000000000006dc2ccb10213d3f6c3f10856888cb2bf6f1c7fcb2a17d6e63596c29281682cafd4c72696ecd6af3cce31c440144ebd1d76db3dcb659eaf6c086be6b414a494dea4bd30aef8450ae639f473148c05b36", + "Expected": "000000000000000000000000000000000301caf675cd5359bcc274b6141bb6ac53ab6a86a38ad4f8c3233cc9c1a77723eb0de4a2014e556185947dc1ef6624e3000000000000000000000000000000000136d286e623637f12c8b86cd9fad2bed8479ace5189e064a4e12e6e641447dfb0399757026126ad2d169c05011f5031", + "Name": "matter_g1_mul_26", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000f46bb86e827aa9c0c570d93f4d7d6986668c0099e4853927571199e1ce9e756d9db951f5b0325acafb2bf6e8fec2a1b0000000000000000000000000000000006d38cc6cc1a950a18e92e16287f201af4c014aba1a17929dd407d0440924ce5f08fad8fe0c50f7f733b285bf282acfc9915646de2449b3cb78d142b6018f3da7a16769722ec2c7185aedafe2699a8bc", + "Expected": "0000000000000000000000000000000004ce73cde58c9af5d1f76e100849b0ba3d3cc6491e76b39cf4d7b681fed0686396440f6a721f73b31fb14b4c7624c176000000000000000000000000000000000e26b15c1051d7b049e82476a30545cfa4bf0a2075681d7028797c528712c7fba7a59145c9dd9ca9f5e9b1ac8a68b126", + "Name": "matter_g1_mul_27", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000010cde0dbf4e18009c94ba648477624bbfb3732481d21663dd13cea914d6c54ec060557010ebe333d5e4b266e1563c631000000000000000000000000000000000fb24d3d4063fd054cd5b7288498f107114ff323226aca58d3336444fc79c010db15094ceda6eb99770c168d459f0da05061073223f066e35242772385c67aaefb3f7ea7df244d73369db1ea0b208792", + "Expected": "00000000000000000000000000000000028a89c904f63eb8e68096bd2001458a4b9b32556c93fab5e52ab26ed73d62f0489d6bf1906a62c8148d50d30222a65f0000000000000000000000000000000007e54f21e2ac6d5287289ed9e2a15d457b5dac22ef36c19cb28a6cf9a0d11c981bf6549ddaf7ddc0a59b3d3a4698d975", + "Name": "matter_g1_mul_28", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000008c0a4c543b7506e9718658902982b4ab7926cd90d4986eceb17b149d8f5122334903300ad419b90c2cb56dc6d2fe976000000000000000000000000000000000824e1631f054b666893784b1e7edb44b9a53596f718a6e5ba606dc1020cb6e269e9edf828de1768df0dd8ab8440e053f396ee22209271ea0bda10fb5e2584e7536e8bb1d00a0dd7b852b0aa653cd86c", + "Expected": "0000000000000000000000000000000008c39ee7c8d86a56ad1a9dbe005b4f0d44849d6fea6bbeb0732de725ad561befd49d465a134bd1a63a39eadbb6e0bce1000000000000000000000000000000000d5c892c92817fa24afb0a0fb319ad21e309edfb6300397a215e34eb3aadf91cb41b4ab1c5273bfea6eaf33982c75eba", + "Name": "matter_g1_mul_29", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000159d94fb0cf6f4e3e26bdeb536d1ee9c511a29d32944da43420e86c3b5818e0f482a7a8af72880d4825a50fee6bc8cd8000000000000000000000000000000000c2ffe6be05eccd9170b6c181966bb8c1c3ed10e763613112238cabb41370e2a5bb5fef967f4f8f2af944dbef09d265ef0d3d4cf46265fc0f69e093181f8b02114e492485696c671b648450c4fcd97aa", + "Expected": "000000000000000000000000000000000ba1650840e24c0f99ddd10a6c3341661e5c96b2e95cb6bda3340e7a0167c906e2f0ccbac6f0be2d7dbb3f9370a5ec960000000000000000000000000000000011638a3d9a81c0fe2ebb547808db758c7cfa8648b4835fb8c4931fd622da3a001fbce9a21d61f98f35b1e907913ffd25", + "Name": "matter_g1_mul_30", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000019c822a4d44ac22f6fbaef356c37ceff93c1d6933e8c8f3b55784cfe62e5705930be48607c3f7a4a2ca146945cad6242000000000000000000000000000000000353d6521a17474856ad69582ce225f27d60f5a8319bea8cefded2c3f6b862d76fe633c77ed8ccdf99d2b10430253fc8915b717562844d59623bc582f1a95fc678cf0d39af32560c6c06e3a74023c89c", + "Expected": "0000000000000000000000000000000000eccc25cfd8c5a58b330a74b92af0c2b932772eacfe898ff3d391fad5dfba52a3940e8edfc9bef5c4de670207c8585100000000000000000000000000000000095ae48a94c92c332915b0c07511bb0d54c316ff3a0dd2509a18a21320b506bbefa76a459260efdf4c045404f02e114d", + "Name": "matter_g1_mul_31", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000189bf269a72de2872706983835afcbd09f6f4dfcabe0241b4e9fe1965a250d230d6f793ab17ce7cac456af7be4376be6000000000000000000000000000000000d4441801d287ba8de0e2fb6b77f766dbff07b4027098ce463cab80e01eb31d9f5dbd7ac935703d68c7032fa5128ff17d5c1c9fa11c36b86430cbb1f3ec10ebbe3787d0f5641d6d7fb96c810eda202dd", + "Expected": "0000000000000000000000000000000017a7f3b439a98885994a6832b6394b0ec9968f665b5810da58e3ece3d8e8694c482a15d3129732b43d4b7008660f19c000000000000000000000000000000000195299086d3b9448b26fe830522d520d132ed59744e677e6eb114ba7d7045019a0d0386cf817701ca3afad2a0487a689", + "Name": "matter_g1_mul_32", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000003299542a0c40efbb55d169a92ad11b4d6d7a6ed949cb0d6477803fbedcf74e4bd74de854c4c8b7f200c85c8129292540000000000000000000000000000000013a3d49e58274c2b4a534b95b7071b6d2f42b17b887bf128627c0f8894c19d3d69c1a419373ca4bd1bb6d4efc78e1d3fc00eb20fe7c292f3ad820a074d8b3d8d24506612752d8677c2d6ca24f556cc45", + "Expected": "00000000000000000000000000000000063c123a3cdb92469e7e57a18eaf3e7cab1d85d64cbcb52499d2e611e6ba71c717b0ebaf4cc9208b18c925a5ec167b78000000000000000000000000000000000fa5e78ae10ed8a4dee9440bfc7637d903404749681f85bcb62444d921c4fd809a646ffe3bb7c70dc906d07c62381415", + "Name": "matter_g1_mul_33", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000121b540a0465b39f2f093112c20a9822fc82497105778937c9d5cdcfe039d62998d47d4f41c76482c31f39a79352beda0000000000000000000000000000000014a461f829e0a76ba89f42eb57dffb4f5544df2008163bd0ea1af824f7ff910b27418a0e4f86cb8046dc1f3139cab9aff661d7b30fb11bef70e15b257d7073885468a380862202b2d705a84827644b5b", + "Expected": "00000000000000000000000000000000192b1497c71eb894a7509bbdaf308428e4d5899edb15f9e6e45a88340f55e1b76ee0901a830b66114deccda63a913a6b0000000000000000000000000000000017d58bd474a61ca0ceb23ec392dc08abe5697b8394fd60440cf787f15cddab36aa99c2ec2341bcc06dc1771b5f0fa139", + "Name": "matter_g1_mul_34", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001383bc4d6c748d5c76ab4ba04f8fcd4c0fed9a49ea080c548893440819833ad72a8249f77391d5fbff78329eb319d3830000000000000000000000000000000016404bd07b6c6480af2d23301940e61817ee2e61fc625c100b31e1b324c369a583b61048dd57ab97b80b1fe6cd64c5c3346ce87c847376c8967cc18297e6007dcfacb6424e1d273930f38bb0e88fc5ca", + "Expected": "0000000000000000000000000000000015f72ad769cbaa2bbce0aecef9559b825ba4ec17ec5be2d9f0dbc7184383eb3e201de5163e71f1e71655acd5ee1fb30000000000000000000000000000000000194d27d9045b9760e66b578af24b282d9aeb28eb51206d2e18dc04bcb6df90553a846736afd92b23aa004f8de90bbf9f", + "Name": "matter_g1_mul_35", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000006bc68c6510c15a5d7bc6eebce04f7c5fce3bb02f9f89ea14ab0dfb43645b6346af7e25a8e044e842b7a3d06fe9b1a0300000000000000000000000000000000053ee41f6a51c49b069f12de32e3e6b0b355cd2c3ba87a149c7de86136a5d9c5b7b59f2d1237964e548d1b62ec36c8db39a142c443a666499a880aa1cb9f523411bbc8e5554de099ab485b6c2c2e57cc", + "Expected": "00000000000000000000000000000000146f12001844bb0ec185e773175634f2e56bfa7190caa851ad16443b629b375ce3967b0c936d30dac2f126343722ce5e00000000000000000000000000000000080e8e90ed0d259ad803269711e511577769f7886b425f9b7857dc90ab36438cbd7435f6eecf2328f5fb6eb56f370163", + "Name": "matter_g1_mul_36", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000024ca57c2dc2a7deec3082f2f2110b6788c57a8cdc43515044d275fe7d6f20540055bde823b7b091134fb811d23468ce0000000000000000000000000000000009cd91a281b96a881b20946fda164a987243c052378fcd8fee3926b75576dfa1d29a0aaca4b653da4e61da82577218082c01b7795c2d16b5bbbb1e107be36cc91b25130888956b0cdd344de9b4659447", + "Expected": "000000000000000000000000000000001344d2c2bc5ef45dc69597e948ed6021d84f7bf2c36119869a3f84288f3bdd6fc3a0de2b9e2564a930c2207c1ee36a0e000000000000000000000000000000000dc4d15ae09642ffa17d77510fb1ad4bf9e06084e9d352f4e234ea35f33458df4f23a209e29da42c41fb9a3cec3e8242", + "Name": "matter_g1_mul_37", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001305e1b9706c7fc132aea63f0926146557d4dd081b7a2913dae02bab75b0409a515d0f25ffa3eda81cf4764de15741f60000000000000000000000000000000011bf87b12734a6360d3dda4b452deede34470fba8e62a68f79153cc288a8e7fed98c74af862883b9861d2195a58262e0c712943d8795a6104f024b9701c70b09cdee9494755bbab0576e2c7f7c9d4828", + "Expected": "00000000000000000000000000000000084f2ed8573d5d04e41909d5c8ed3feb88f572726fc86d17d466276342f01503f7c8552498f8a7e96c875c4928b808f2000000000000000000000000000000000b618ca81b6ee891690099459634e011b5f59fb5c96488b0205139a65c77f15af135b3528a5ca3b794e7b2991d2434d6", + "Name": "matter_g1_mul_38", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000012662b26f03fc8179f090f29894e86155cff4ec2def43393e054f417bbf375edd79f5032a5333ab4eba4418306ed0153000000000000000000000000000000000f26fdf1af1b8ad442ef4494627c815ca01ae84510944788b87f4aa2c8600ed310b9579318bc617a689b916bb7731dcbd4d77f6246c57d398c57848db8d3f986c475a41a23d424cd3cc2b362c1b99f2a", + "Expected": "0000000000000000000000000000000014733ee8425f42a30010366e4585cbbbdde6ed602a639bd299e63c113db3d797fa01075e24a042a060a043c9e1fa79f40000000000000000000000000000000013b44e1932681d238c52e959e1e3daa7a2e1ac67252ebea0cae90e8249f85b61812b9e09203d38d96f4916837b3693c8", + "Name": "matter_g1_mul_39", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001837f0f18bed66841b4ff0b0411da3d5929e59b957a0872bce1c898a4ef0e13350bf4c7c8bcff4e61f24feca1acd5a370000000000000000000000000000000003d2c7fe67cada2213e842ac5ec0dec8ec205b762f2a9c05fa12fa120c80eba30676834f0560d11ce9939fe210ad6c6341776ed9d1029918af4c5113a6110139b8bd7f938caa204373a28ddaa51430eb", + "Expected": "000000000000000000000000000000000ba15476a1346fbe9be2720721b592ce7c111b95f0b8738495e6c28487e12fcad60006314dfe68789e60f4df2db14eec000000000000000000000000000000000b44b9a9f695c94ad206717daa3128b672924d0db83ae0d47b62b3c79428f6fe151a65a39ae411e18b128d6796b67bbc", + "Name": "matter_g1_mul_40", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000181dc6fd3668d036a37d60b214d68f1a6ffe1949ec6b22f923e69fb373b9c70e8bcc5cdace068024c631c27f28d994e5000000000000000000000000000000000b02ca2b0e6e0989ea917719b89caf1aa84b959e45b6238813bf02f40db95fbb3bf43d3017c3f9c57eab1be617f18032fa64411438542922a7bac10806efaa633d31d37c0b223314a8b6221155b9c425", + "Expected": "00000000000000000000000000000000070dfc697f7068180a7a792604d7b8453dbd393c993be9829a263ad5864c3575d3fb235692ab12a4dfa4221bc6e0c6d600000000000000000000000000000000123a9d9b83e2ca7c95de9602116b1e14d48175073e1fe766458e3fd4b6676f120adfcc5c497febe2f7ff68b1e3508e3c", + "Name": "matter_g1_mul_41", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001329a75975b714c861064d743092866d61c4467e0c0316b78142e6db7e74538a376a09487cb09ee89583d547c187229000000000000000000000000000000000096713619bf088bd9e12752cab83e9cdd58296ada8d338c86a749f00ba014087a3836ce10adaaf2e815f431235bff4f0e7002f41c6acab677a0ad023bad2a61b11c1b7221d944018b5ce60bb61e87e96", + "Expected": "000000000000000000000000000000000dcad6e29cda2332dff09377460c7a2b9d908ee53ab13f648cd892bf68a44ffcc8cd5d501f8b068f506b506d01d3f4430000000000000000000000000000000003aa625a60932474ca3f914a3e0aa8384533723f824b12c686a64863a734d96ba13670c8b355b52b0c01b49fbffb6149", + "Name": "matter_g1_mul_42", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001195502bc48c44b37e3f8f4e6f40295c1156f58dbc00b04b3018d237b574a20512599d18af01c50192db37cb8eb2c8a90000000000000000000000000000000002b03f02b45aa15b39e030c4b88c89a285dff5c4bbfe16f643f3f87d91db774f8ab7019285fda0b236ff7eec16496e5ec26e55f09b787c0542878e4d720027d9ea465f829a4e0164cf618c5d9cde49bc", + "Expected": "00000000000000000000000000000000023909bac6048bff0373d27a06dbbb8aba8ddbada93f4fea65c983598307f3c3a8cbe163462484ebb88165c6b6da41590000000000000000000000000000000002162d8a498670158c23daebb724168b5379d9124b064de871674a3ecd15e6b546366287563928a1e279fb1eb2ea0ba4", + "Name": "matter_g1_mul_43", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000d7e1651f3e172dcca8774a7a0d58ab47178d3e759933289e1d3eb0da414160ff9e890a608bf8ccdf2820c4aea6e11cb00000000000000000000000000000000185e8671e2ddb8e36380e39fe4eafefbac9769935603c28caac7d3f7f0f3e8ad14e925024b55aeb67d68b219875c9d79bba67cc47e38a129ab1140fbcf0386ddba2feefc919aacdce6059a27a1e2efca", + "Expected": "000000000000000000000000000000000f79050036c4bb6c6b8e91abb300dc49a75b32faaaeb258661c905b4d936f4096d59de89b911de294603a0e3443fada5000000000000000000000000000000000985105497cd87d5ae2698479da55f6be9bc2cf5a2093b651d7305b67e36343debaf19c266ccb55c23f3de55bdae23a6", + "Name": "matter_g1_mul_44", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001454d4a82163a155446467164904cefd7e1e3c67ae99bf65c581a75c72716fb011e2fd030eaf3d36977fbb0ff5156e2700000000000000000000000000000000123f973ab6bd3c2e5b0512a0c77ea0ac3003fd891e1262137f9444cd07b927b564e618205ba09220320ea1aa4564e820705fb566367d9fc142c4194b0525c16672b843aac1160f9056ebb115e80d377a", + "Expected": "0000000000000000000000000000000017901e77745a98c09d6740597c40f27df841cca6dd95653a1da6d8eb1c57d5ebffa6a7b894369b6b419c61462697080b0000000000000000000000000000000001732540a1bfa4a1a851106209ce4807d7c0a33816d3742ad5e2729229f3403940e03b93121b79bb94c24f7e60539ece", + "Name": "matter_g1_mul_45", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000178e6828261ee6855b38234ed15c27551bb1648ac6ec9a9e70744643cd1f134b2309dd0c34b1e59ddfe3f831ab814c90000000000000000000000000000000002ec930fb58c898ede931384c5a5f9edd2f5c70b8c3794edb83a12f23be5400949f95e81c96c666c1a72dffb50b81158f7bfd990cc4dac62a0d730f56b4eb1c1ad77ca9cd58b089c23c2f6efa00b7fa4", + "Expected": "000000000000000000000000000000000f990d646495fff77d090f4a69b8af0e1762982b53ef8ae9bb955ad8b894942b85c7726587c9fd956ad58eb9e3ca25630000000000000000000000000000000007b7315e1f93cfba8076cf539aae01fd3bbe1cf92daa168a6fd6a2e7c969d35c51fe7eba04f1e0dd3e2020635f2c4f09", + "Name": "matter_g1_mul_46", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000001ea88d0f329135df49893406b4f9aee0abfd74b62e7eb5576d3ddb329fc4b1649b7c228ec39c6577a069c0811c952f100000000000000000000000000000000033f481fc62ab0a249561d180da39ff641a540c9c109cde41946a0e85d18c9d60b41dbcdec370c5c9f22a9ee9de00ccd807c5a41ae2baa1e10ebee15363d1d4569f731d77a418998108f5dfae0e90556", + "Expected": "000000000000000000000000000000000de9d7e58919ba6386f32af53ccf36cb0b834855ac8dcc19af3c3c9522c3db2985e51ba36067b61181cb0fe8b47d853a0000000000000000000000000000000010ff0800ed1b4067f8c920462f7abd7361dac2371716f7b8648d64a71cc7d53265db6d80b26b9efddd572a2273ab1b17", + "Name": "matter_g1_mul_47", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000008d8c4a16fb9d8800cce987c0eadbb6b3b005c213d44ecb5adeed713bae79d606041406df26169c35df63cf972c94be10000000000000000000000000000000011bc8afe71676e6730702a46ef817060249cd06cd82e6981085012ff6d013aa4470ba3a2c71e13ef653e1e223d1ccfe9a7e300bcb3c740fd1f693d4c8915c4c46dcb627f6de6e4847f123623cd23bac7", + "Expected": "0000000000000000000000000000000011a11cc098144fe9bd42ec8845be76b6cae4b3001a79f4bbbf9f20e8ac8bca5b37ef8006c958318c3894aac7d6bf77e8000000000000000000000000000000000d5c1e6b78c40a356a35bfabfd66a81924d2eae6d428b5caacf8f3992ab980640e857e756e649ca83f5aa4bda7cd00b7", + "Name": "matter_g1_mul_48", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000120ddc1cd9e3a7b298673b1036d162c31dbb35d6e83b39b2564b3be16e446a836c96907e8a6af1e677e906bf5ed73159000000000000000000000000000000000fa57c1436615442bbb049d08ac46e501c07736cd239298752bb94d1904bd38cc687759987cadd99bd3c4d45ba07193ab473df5e282565a0783d23e65e283a103ebbddb5c884183cceb62fc32d0e9602", + "Expected": "0000000000000000000000000000000002e72f4568780fb41858edc3f5796f7936a30ee9ddc7b5034d9341614d301c7906238bfde3bcb77f063fe652a43b88270000000000000000000000000000000006f971f4a8ac554df7ae7ecdfab724410f1948af994d760c5f5977961f891ba4f4e76b27c3f0e5a1471ad017e91a9af7", + "Name": "matter_g1_mul_49", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000e3ccaa4fa358a5a885094cbb0b8baa106fbcca66edbe31511ac2f6f3d14edbd8701979d6e4690853555c625091392b600000000000000000000000000000000175bdd42583cbbf733242510c152380525aff7649273acef1ec20569804ffba7f029ca06878dbafde84540cece173822a048ef7cf5d1f6f625ee3aba091147c389ebebc5b8f3d285e16ef4e8afe5c013", + "Expected": "0000000000000000000000000000000014b9ef8878af80f824748389d608bc9d0ffbca96230ed590d8e351586607a614f2658e348ac172f3184c1e5fde50f550000000000000000000000000000000000630f0556407c140d0a05b10ea65de48e4866e040455ebcd54fb6ed6996a6a3ac7a94a6818ba424936fa505c2c364124", + "Name": "matter_g1_mul_50", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000001bc359baeac07a93aca770174ea6444aac9f04affdaa77c8a47b30c60ee2b527c061a4344139264e541d4134f42bfd0000000000000000000000000000000000cbf7a31e6fef4f4664bca4bc87ec7c0b12ced7224300aa4e1a6a7cbdedfcef07482b5d20fa607e3f03fdd6dd03fd10ca9b63c6bf36997118d58600c1e429c105a379b9e8b0de934ab9f433a4fa63dc8", + "Expected": "000000000000000000000000000000000e66c8be115a941ef7adf4490faea39149a3d812c29d4afb36febe3f813c7390a715f838dda90cd73556f89abf3949120000000000000000000000000000000015d85c185cb86af3ca1c526ffa6e9459a9c699c5a4d57278f33b14691e980e0f86b9239e626fc4064890cb610f10e496", + "Name": "matter_g1_mul_51", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000006b06ae8cb0981bf5167ad51e19d132db77548c4376697f855c8397b835743c42771096ed7b0a4b18af9494e42ee89aa0000000000000000000000000000000005aa892b0a056ff61706430f1daa3f0263dc01337eadabd8a7fd58152affd9aaa329e8c11ea98692134d9718cb4119bff228da17f49667c113d2bc2a2c8a338f80be68496f5145b4be21a5786ca6d46b", + "Expected": "0000000000000000000000000000000009db6ac72cdcf1f69c6593bc183aaa2b3980ff78a4417e23243f81243987ec6f2636641c9e9c738c7af2a1e9f94149d0000000000000000000000000000000000ca7537c04c06607e42403e84e7d9e55b2a06c730ec342f16d03689bb684918e85f637e7a6279d95cb7774f106139d0f", + "Name": "matter_g1_mul_52", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000015dc9f87213e4781863ad43f6bbccd547967d9bcf6a35d95d530cbfbf0d7307981aee5bc4ccd41254841651717393a0300000000000000000000000000000000166ce33c0482b5957c6e746c16908ba579d6402b230bc977d3ff29ac2a4a800748d9c14608f2519e2ac4d1fe4daf29b29431e18a462fba704216b516e819fb3392e315b0c92a7411a329cdafeb511244", + "Expected": "000000000000000000000000000000000620b092ea8cb718ae9669da4ff2faf639fb5e657b7759fdf292e6d841b51545afbabf95a98601847f64fc7367f872ff000000000000000000000000000000000a14bfc0e328310d62f116652b1de3a18282b122e0e3965619a099466986a546b73696274e12bd395224018a48b3d80d", + "Name": "matter_g1_mul_53", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000171fbc9cec717964c4324aa0d7dcf56a59b947c24a9092157f4f8c78ae43b8e4222fd1e8acdbf5989d0d17ea10f6046300000000000000000000000000000000148b5454f9b9868aefd2accc3318ddabfe618c5026e8c04f8a6bce76cd88e350bebcd779f2021fe7ceda3e8b4d438a0b2051041bd2f12f6e6e29924139770fe209b7bbdbcd6c0bcabbf5021a7dff2d83", + "Expected": "000000000000000000000000000000000a633928be3f3bb4c94cf4d8d7a8169779f8bd4bad31ede895937e8e8b0ddea956d255776141541ef5791aa3a0bc6d360000000000000000000000000000000003dc3b703753a7b8ccf7676b04cac8021aa311233a99e8d5290655d2f84555dedff62f9f81322307b538c3f3458f6313", + "Name": "matter_g1_mul_54", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000018724e2b9a2f383329207ee85577805f35d5c5bb9f6903e3c962e57ab7eb9d1639d1e9adbde53499863b299f576325a00000000000000000000000000000000016d2c22eabd4a06a5ae67b890a25fbede7d0e96c625b80329b19be6aa861f44b6e85778130d0bdf69f2abd491ee9751ab96df57a600dc3b5aabff5b1034886d24f6fcf035bcacaaec738deb2cfb8f852", + "Expected": "0000000000000000000000000000000014911a8b41cb65cb7ccb940a472cfa58861f1a506a4f719888eb35d48ed9774ea0a0dc3ba38760253bedb4a1acd0963a00000000000000000000000000000000031388c90440f22cc63a1e9450256e5cfcf2f7448641ac66b43d542c4b77e9c590b957efdb1c6d75846b3faccf033276", + "Name": "matter_g1_mul_55", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000010fcf5e5e478ac6442b218ce261878d8f61b405c0b9549512e23ead1f26a2240771993f8c039fbce4008a1707aeaaf25000000000000000000000000000000000f1afe9b199362f51cc84edb1d3cf2faf8e5bc0a734a646851ab83e213f73a3734114f255b611ec18db75694dcb0df9178176412b07eb7f423f23ffeaa0ee642590e0b7016bc063f3fffa93e1e35484c", + "Expected": "000000000000000000000000000000001968070c01f0aeeb42ab71730f5b78ec122c10ca9dac1764ff5e916fc85a5eb5ed406c03263c57858fb03b15ac0035550000000000000000000000000000000012ecfee330e1cc8006c73e9d41ac1947b67f8704d12faf8c0c05c2519dca68be7bdf88a58eb4825b35a1d270554d6ce9", + "Name": "matter_g1_mul_56", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000f75bc9feb74110697c9f353686910c6246e587dd71d744aab99917f1aea7165b41deb333e6bd14843f28b2232f799830000000000000000000000000000000019275491a51599736722295659dd5589f4e3f558e3d45137a66b4c8066c7514ae66ec35c862cd00bce809db528040c049c4b5627d84e153f3a4ecc14ddd6baaf1d62253a0f88d3af51be18d991976da0", + "Expected": "000000000000000000000000000000001469e7ab4c3740701927da2b0e34508a73387aea671857b042dabbc65cb849f8c8ed0b7f8c8e37f80aeee98ba953f4e4000000000000000000000000000000000674212f9f8e1419608ccf1a0447533fbd6fda87a35cb9fb39c8a7daf5d12f450c12bfac9e9f872b2643b1f8f201439a", + "Name": "matter_g1_mul_57", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000a87d0ccfb9c01148703d48993de04059d22a4cc48c5dabd2571ad4f7e60d6abfbcc5fb3bf363fd311fec675486c2a20000000000000000000000000000000000a896c5a84cbd03e52ae77000eb0285f5704993664a744a89ff6b346efd2efec1a519b67229a3b87e1f80e6aa17e29462ed270764791aff081f1dc8051d22b8e18803a7e310393f21bb4a495a445cd45", + "Expected": "0000000000000000000000000000000009c756aec59a68832728b1133a69f0794f6a082e2f0f161e488078bec7420a0da19e812def625df9b12aa36d94d8a38600000000000000000000000000000000014aa28b18771ca07b7627446eb60d53bf4837541da661a0e5cadcfeaf58f5a650a39ac304f48e45d9b714cead9ba5d2", + "Name": "matter_g1_mul_58", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000d35ffa284655a94c3050213f4f14e927c162818bbfd0480bad2e07000dd3081274056715c96408f243589d83365c9f20000000000000000000000000000000001450bddfa14033ed8cdb94386715013ed9b2c4f9d65944e9d32c0b3545a085113e173e5afcfccb78878414a464d3184fbfb7606b64eef0460b8f33a0be54451fb655ce0b81db89eb7862f392450354f", + "Expected": "00000000000000000000000000000000153548fb1d7f1721c7fbdfeb167e1c060a90aab8f7b6572f4a2707de91b03a7b5e68f792a18d940167ae83d1380d6653000000000000000000000000000000000113bb747eab3987cd195e9eb755735698993332d517890f4e3285bf7274f8579ffcf84908a4758f0bb932021f2c76d6", + "Name": "matter_g1_mul_59", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000344cafaca754db423544657de1b77025164ccc702f8d45697fb73602302a3cb4511c38f0a76a37415d683398f35556500000000000000000000000000000000120935947070451885bf0c328bd83def193831ab9353844a01130074f16a1ff4d20df8459b5ad6a57d5f1959d37aae928a29fcc442d0c2446697e94dc47181dca7a314f9073c06aba6dc55aa79978d7d", + "Expected": "0000000000000000000000000000000014ca98181489c96227f8052a77730ab446615cb7b2b00a600cdd7defe8b3ee1cd53a6d98892ffccda5fd4916e0cf5886000000000000000000000000000000001567c3207cbd42c0445ea96b464dbd9099b85f5df1932d152436c936623d92fdeb009e69919368134501fa9363a0b1c4", + "Name": "matter_g1_mul_60", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000008797f704442e133d3b77a5f0020aa304d36ce326ea75ca47e041e4d8a721754e0579ce82b96a69142cb7185998d18ce00000000000000000000000000000000144f438d86d1d808d528ea60c5d343b427124af6e43d4d9652368ddc508daab32fd9c9425cba44fba72e3449e366b170d5b468797b4af1978983faebe59a28f34956dacf5b7f65d25548bcedb518f45a", + "Expected": "00000000000000000000000000000000139d093364c313d400603dba5a79479d566245a397f88aae748e110e09e7ab6dd271b8c37a90b86f6b48490ec1d0d8f3000000000000000000000000000000001099d4cb400f2d786dd2dd5d162580d2113c8405f51e8a619a6894d86a7f7ceb237289808acffa274069c24ee27c860c", + "Name": "matter_g1_mul_61", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000000707c711f77bb425cddc71ecf96a18b6eb0bed7f012c4f6cc9431003f2e1ac17f7c1f68c4965a4fcc273a3db93451d000000000000000000000000000000001211464c91c7e78b00fe156da874407e4eeb7f422dbd698effb9a83357bf226d3f189f2db541eb17db3ed555084e91ecdbc6afcdd409e5d50d7b655580f1144de77f3efe5d6268032eccab7deaaad997", + "Expected": "000000000000000000000000000000001247d4d3b1625ffccd350a9fc9759295637e91d9167d9bc72bbc1b60b1abb71dc29595b49ee1edc778f5219416bcd0cf000000000000000000000000000000000dfc69cdd0e4e126208b76a4e5fb8d032ae93031dde7da9bb1358507d4480881576c5d7cb7f0b3fa3032c0151650f2da", + "Name": "matter_g1_mul_62", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000004b3c0e8b240b79c55f02833c2c20fa158e35c941e9e8e48247b96cb1d4923641b97e766637a3ced9fbef275ca9bd1ea000000000000000000000000000000000b4e7355aea3488234552d3dddfa2d1ad3164056407770e6c54f764193c9dc044cb7f2b157a1c4153b2045867d6f99c5807347519f114e78f99617f6b147ca833bff7be962c9b1e1f32b5babe6067d7a", + "Expected": "000000000000000000000000000000000150849c60273de83f9ce2016238c273359ecf486adeacc4450e1d1a6cb79fc0d0fb38974489375d5763da8a5f4e743e00000000000000000000000000000000157ec6c2dd68dc5fb3cef4e935fedb74e1f0e856f1d75890bf995a08ed6b53b52e2e0d412ae190365b139101e7fe040f", + "Name": "matter_g1_mul_63", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001465358836eb5c6e173e425f675aa231f9c62e9b122584078f2ab9af7440a4ce4ac2cd21ce35a0017b01e4913b40f73d00000000000000000000000000000000170e2da3bca3d0a8659e31df4d8a3a73e681c22beb21577bea6bbc3de1cabff8a1db28b51fdd46ba906767b69db2f679830630695c8dabe9aded1b5365bf93770aab7e9ef4140a2bbde2f0a7b109724d", + "Expected": "00000000000000000000000000000000024b59fbec5240fbdf3fb4e565bbec20f26edbc2a1bf7ecaaeb5278ed9fe13d1e360fa298e2d3f9b2880b00aff827f620000000000000000000000000000000013ca56975d9fd667bab347ed67fb96a433d57836ca4069976e12459152e1369154bd095a15980880e21fd02b1d7e3156", + "Name": "matter_g1_mul_64", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000ab6e2a649ed97be4574603b3b4a210f0748d8cddf132079e0543ec776ceb63902e48598b7698cf79fd5130cebaf0250000000000000000000000000000000000d55b3115d2bfcd1b93c631a71b2356c887b32452aae53ffd01a719121d58834be1e0fa4f22a01bbde0d40f55ad38f2c184ef5eceadfd77b3a4092696ec34d0551c88e434567638623740b7d5f9e3616", + "Expected": "000000000000000000000000000000000aaff66eca5ddce81533afa27e2db1c25a2c6f0dc1dd7c2236d4c89cb9d2539e109cd1362dbfee86397156c3703d44e60000000000000000000000000000000013598d8ef4470998aec290e941576f5e94d696f7f0be40e3131b516a1679c5b0eba74dc9ae00ecb8f115e4613a50f3bb", + "Name": "matter_g1_mul_65", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001654e99ebd103ed5709ae412a6df1751add90d4d56025667a4640c1d51435e7cad5464ff2c8b08cca56e34517b05acf10000000000000000000000000000000004d8353f55fdfb2407e80e881a5e57672fbcf7712dcec4cb583dbd93cf3f1052511fdee20f338a387690da7d69f4f6f7a80d9efab033e920061cee8f8d7ea6023cc05f08340642613628b39e7b7fd0af", + "Expected": "00000000000000000000000000000000163cf5475fae000c38e59754cd29f1290ab2d6550552e9186555d1ce2960b7dca5834e0347699d2869b8c9bc42f6f717000000000000000000000000000000000b21bd3bfe50e0536135a910359527f80c130a08029c24f990c82f02727def21973a20a2021c95aaa3a7c8a980b44f33", + "Name": "matter_g1_mul_66", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000001bb1e11a1ccc0b70ce46114caca7ac1aba2a607fea8c6a0e01785e17559b271a0e8b5afbfa8705ecb77420473e81c510000000000000000000000000000000018f2289ba50f703f87f0516d517e2f6309fe0dc7aca87cc534554c0e57c4bdc5cde0ca896033b7f3d96995d5cbd563d245111c860f6f5725f99b225c53b9fe1a70150e7ce922bfe214900aaa2790d145", + "Expected": "000000000000000000000000000000000bc3667c38602e7e1c018cc62933c013a9e78c375b50ba06f0c3d34fead5ec8a9658702a0856625a712520ac99afde230000000000000000000000000000000015c6b5487a52b41ae1a4634c8675f7b847aa5d319ee9eec0c92fc06d8e92e1cacc90ee394f8c90ce3e2c00307f53dec6", + "Name": "matter_g1_mul_67", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000012ecb4c2f259efb4416025e236108eff7862e54f796605cc7eb12f3e5275c80ef42aadd2acfbf84d5206f6884d8e3eab000000000000000000000000000000001554412fc407e6b6cf3cbcc0c240524d1a0bf9c1335926715ac1c5a5a79ecdf2fdd97c3d828881b3d2f8c0104c85531fc07041840216d60ff445cf53b273a46016c8ecefefb53550f8bafc79966f863a", + "Expected": "000000000000000000000000000000001358e1724cb3ec4028a63e4252eff164defaa41b21042037ea9a1e06bc1a0a1e838afc1965ee665de3da0163d22682420000000000000000000000000000000019828e11831e3e4216d843ed3446345edb357b2082b7947fe71932dfd894543928ddddd8649d32b4f1349f63f60bf095", + "Name": "matter_g1_mul_68", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000010dac3e5885cc55f3e53b3fdd5d28b2d78ceeea2b669757a187de0ce3f28b586e451b119cdb7dc8b97d603f2bb700e2000000000000000000000000000000000712a9656fa95abf8c8c5d0d18a599c4cae3a0ae4bda12c0759ea60fe9f3b698d3c357edebb9f461d95762b1a24e787929b031b82dc8c9f4ea9524793b54207d4e13a548d73297f2aa6241aff57abfd0", + "Expected": "00000000000000000000000000000000130e09c096ce8ba86ae71a817426d929c7f9f8bfe00e76668b0041e935d1531d6f58e5eb743df3cf86fe88bdfda8c8a300000000000000000000000000000000187b25d8216fa3851bb6fbace998bf3f23dea80dd6e1cd94bb6a72d335702694804c6ef3d350519c5e781f941bb72f92", + "Name": "matter_g1_mul_69", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001889ef0e20d5ddbeeb4380b97ed7d4be97ef0def051d232598b2459a72845d97fa5c1264802ab18d76b15d8fbd25e55900000000000000000000000000000000135519fb1c21b215b1f982009db41b30d7af69a3fada207e0c915d01c8b1a22df3bf0dc0ad10020c3e4b88a41609e12a63d26ae92119c7b06d83d7e2922e06559b1740eae315c6623d3e543c9bf54258", + "Expected": "0000000000000000000000000000000011e61e5158d9a7c59a5007732a76e27d14602e15159e8f62bd13be8b44c96736af5a77495c3da55c8244af6e60eb4f2c0000000000000000000000000000000008deda8447009898c89c6766e8add105892992585724d520c38d0d4f8c833f88d8c331e11b291b6def6847bfa9629d2b", + "Name": "matter_g1_mul_70", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000008726a32d489a5ea1c1b314dc4d400d995d0eb8b49d47e65a6ac8fd0e6ec0cda1c637ee314c0c5d1ad72cd3588ebf925000000000000000000000000000000001849697df83d625fc5cdd722c76faf542a42506fc3479d8127eee7af57611c7d6f33a7f9dba5d3c420fab33ec19305f57a02c61a7a75342ee7f0745886c0ea2a73c21500aef8078d21d20b7216c2990e", + "Expected": "000000000000000000000000000000001182f2e45f06a729f82442ddb372f2eb8dbfccf12edd8df0764072c9f14cbe001893d932e89b948a643981ea8aa4fa41000000000000000000000000000000000910335dbdbef74b844a6f3b879d14c23c711ff2362213636ddab7eb1a44cd4b687659f8dd521c134b56bc4eed0ec5bc", + "Name": "matter_g1_mul_71", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001688c63e325569855bc2e51d668cef112b2479efa33519fe7f45eab89e275e2c4652cf8c2814f179935ccf1d24d8bd0f0000000000000000000000000000000011ebf7d4984237ac0173807f31be64575e7cccb36ce94e666e8149b9c292ebdb68d30ed4ba68f8e00982ee7780b2567381b0c87102055dc2901826875d5e85a794befd93fccca2b9c0a1f70ef5610d83", + "Expected": "0000000000000000000000000000000019576d68ce66218d4c9e2e6fa9985451eea46ce60b11a74cf5ea9dbb9d0e8741d11436dfd77b0a8b490f4882cc5b416b00000000000000000000000000000000088ba5153e91738f7524034a2609848652a7e416fc68537ab2c16b6699f69695c62e5724dfda2f3b4f90277f5005bfa7", + "Name": "matter_g1_mul_72", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000bb6f731b345bb1319b9acab09c186449a51dad8b6526251bc58e958cfd933137067e6f778b019f131cc7b23e08a0706000000000000000000000000000000001979a4f3e444c5950d0e2d71f97e99578b3058a6e414dfca313b898c4e02787e6eed89a2d1b05f31cff4af1e12bbedc3ebf66fce49c6beb12737fe05e3adc0a51ecfa9144ccf6253088dd1a7a483de07", + "Expected": "0000000000000000000000000000000005720fd4bff4da704edb7e317e3d41f1d1f45e3c1f22c1b98ee0b6875af414f6f58793e8ffd5c89bcec2af711973ca1600000000000000000000000000000000051441e34eed472766186a44b2028d86eebadd597cb7e3fa4f935d30aa043f11fb18670b31f0a3b8aa23bc8f05361064", + "Name": "matter_g1_mul_73", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000078cca0bfd6957f9aff9731b45fdbdbeca6691f6fe6bf0b7847859c77478037e14864b202b235953ac7da231367324c200000000000000000000000000000000096ddc8631aff282d14d1878ef6bc537159abe9dda5732d0b2fe3668e184049cc19e05fec4666a0df204182edb9b0b8a0305523dc79dc4b905e65587fbd095ed57aa42403d2df5dd489db8f50c99e9b6", + "Expected": "00000000000000000000000000000000141a0eb238edd1cdb670737d94f658fef728691620f9c6d98e34ed8bd166b38ae6912b5bd90ea21b091766ad27d689480000000000000000000000000000000002d0e7d2584586ab2f08cbd419df3defab53a287ca467b6b081e474711a23608831c1507bac4f328750731b99a06c6da", + "Name": "matter_g1_mul_74", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000b3a1dfe2d1b62538ed49648cb2a8a1d66bdc4f7a492eee59942ab810a306876a7d49e5ac4c6bb1613866c158ded993e000000000000000000000000000000001300956110f47ca8e2aacb30c948dfd046bf33f69bf54007d76373c5a66019454da45e3cf14ce2b9d53a50c9b4366aa3ac23d04ee3acc757aae6795532ce4c9f34534e506a4d843a26b052a040c79659", + "Expected": "000000000000000000000000000000001227b7021e9d3dc8bcbf5b346fc503f7f8576965769c5e22bb70056eef03c84b8c80290ae9ce20345770290c55549bce00000000000000000000000000000000188ddbbfb4ad2d34a8d3dc0ec92b70b63caa73ad7dea0cc9740bac2309b4bb11107912bd086379746e9a9bcd26d4db58", + "Name": "matter_g1_mul_75", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000007c00b3e7e50a860e99cdc92235f45a555c343304a067a71b6aaade016ef99bc50e3b2c5e3335d4bdacb816d3c765630000000000000000000000000000000000f8a45100cd8afcbb7c05c2d62bfedbf250d68d0fde0a1593cd2ed2f5f4278e1baa9e24625c263764e4347ed78cce6c88586d7ad8fc3e4fb42981a4415224c0d976ebe1c342e9bc1cd66d35168bae33d", + "Expected": "00000000000000000000000000000000187cb196679b6baf78a7908c37d7f31a9fcefa90b7cf165d0748a358e6dd86fc5c2d91ff1c4429a563b5962b821cbb01000000000000000000000000000000000d94711dc6efed34385579532f59964ab18b9debeac96044f3eec14cb36965f380d21d39c246e972aa2d5891ce417e9f", + "Name": "matter_g1_mul_76", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001517dd04b165c50d2b1ef2f470c821c080f604fe1a23f2fa5481f3a63e0f56e05c89c7403d4067a5f6e59d4a338d0b5c0000000000000000000000000000000007b6b1d032aadd51052f228d7e062e336bacda83bbce657678b5f9634174f0c3c4d0374e83b520a192783a8a5f3fb2116e7db0fbd2a7327c85054b4c0de9727dc0b051058f8bb4ecb1dcc7f825781712", + "Expected": "000000000000000000000000000000001405c27eb28f58e7f66988a300df376f3536723e2ba5934d843ae629669485015c90a8da60ef5c00c63c0b08a00203a70000000000000000000000000000000000a62dc83ce27987849070a6022ab6a06186e2527f39ae94d5a23d2e4d234a465d50e03b0d7d175ed7f53ced0c3bbc8f", + "Name": "matter_g1_mul_77", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000475e66c9e4e434c4872b8537e0ab930165b39f41e04b208d74d3033e1d69dfb4b134ae3a9dc46347d30a6805508c0420000000000000000000000000000000019e585e1d9adf34a98a7cd38de35aa243d7853c19bc21747213c11240d5fa41ff3b21ae033dd664aaac8fa45354a470a85cc8d88273d4aa822f44a447cc22f5a58c420bcfe757a459772825619669a72", + "Expected": "00000000000000000000000000000000142fa228919f71f75df073927d03d9204b36a5177b4ab7bc995b59ff312034f7ff916635e27abbe775379aafc24a35c30000000000000000000000000000000014429fb137cf912995ca785902877e6675105b252a64282412798f883063824fc31cd79b356ea4e4822363b948ec27d1", + "Name": "matter_g1_mul_78", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000002291ff240598e2c129ea12292e4a2fc86e03da9bd9fbbb8bddd6f25797003a4688ba2ed3bafd8dfcf0ddd44c3288c1e000000000000000000000000000000000d7541c9c54a95f3789ca7637348378f8956fd451c3266c8f1a34906bf1cf8e7499fcf8ad1f1a73dafcf71b86833ff3b5b6e462d809f8bf1a62f276dcb27e42d9aa0ce33fc4e149e87181aca70a4ccc6", + "Expected": "000000000000000000000000000000000cf0aa7969ec44cc21bc8cca97fc8a581aecb63054c4fa3b7b69d28e0e2e901fa51c42a629145d9126e63aefe7978c8b00000000000000000000000000000000199d565f26b9c6496a4115eefc75f1066480f498a50314b396685a3ade8e50ab03c7f56316be2bcc02dff8b11ad5e4d9", + "Name": "matter_g1_mul_79", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000018d31bd5a7e94ceb18d803969a2001c6eb3bfbcf82c27e88ca60d4c46807d12f116ca71c67d27270c2332205a4ea11bb0000000000000000000000000000000010b6db11d4fc3a2b449b8fd189d2e4ed4591bf4258d7b92b3eb152048cb3a3eecb87782691e9b954377fd1f34b38cb0d535b53ab5f1c596eb966f57867e021d0f3b099e17bf384479c959794b17d6a4b", + "Expected": "0000000000000000000000000000000000bf4256ce2a2a976e35a9eb266d11dc53d043f6fcafb47eee06e120457ea56decab47ef22b251c6cce17df9a7d91e3300000000000000000000000000000000152c438e11fe1d661eea7c631e04e02eb9204ebe52cbceca1ab6a9b4c889a1ebdda01d7505df29fe2204ef5787749a63", + "Name": "matter_g1_mul_80", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000190f4dc14439eccc46d46c5c9b15eeba0bbf2dbca11af4183408afdb15c7bfa26f107cf5fda0c1e0236aab95728eac2e000000000000000000000000000000000c47feeb1a1d2891d986b1660810859c1bba427d43a69b4e5ddeaf77116418138bfc2b7b4aa4c0cc6df10bd116721d506e0512ecbc5a1b02ab19bc9bee4d3d9c721278e07b7a6e389c4d6443232a4035", + "Expected": "0000000000000000000000000000000007754a49dcdde1354412d3fe2e108675fde8a1df069c86be54c4bec46338a0952aeed50842c2486ac652202c26a1861c00000000000000000000000000000000023fe3f5e6786e339002e14ac5c9fdaac3c012526b33da9ed314cdb145f9279a71e306f5d51243a0f0dcdf59bc5d55ed", + "Name": "matter_g1_mul_81", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000021203675e0ae188ec782160e21492a6ee39fa97d922c1ef9bbfd79b82b3fad54fab11ba633fb8f02cf92249d85d9d8000000000000000000000000000000000062783335b87300c97b38e03e5b1318d15a499b29a473c187f930bf34bc1214b4d822725678cbde978c7b5ae6d4bad51a79fd15e80b694122dddb01f836460b3eff99e61ea6309d6b395c94fb5a43dff", + "Expected": "00000000000000000000000000000000141464b4326b0353aa99674bbd98853b926aa580c1e03673297bcbe9094eb1d795331d16d883e0583ed0551f064d7a0f0000000000000000000000000000000002dbbfb86c4d313bdbc8ebd266c190e38645016aca22261665dc850b0d7db8b240aacebec8af097724e5291ff43e6f90", + "Name": "matter_g1_mul_82", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000e4979375cd880e26d00461de629bac880c12e24ede4a7c702f151c34a728a69a021e37b6a1af520a5f47d3a33f8c8a80000000000000000000000000000000013b5317e3ff7540048b19ceebd47c15538d7eb3bf402823b9c348c464afb1000ce0f7ea4c1cb668af5c8cbf77e6a9251bd012914a96253926fdaabec06944ffcdb4637a05e3e78a9bcf1b21b68b9dd9b", + "Expected": "00000000000000000000000000000000118ab56a65ca63becc8aea3f11b370c705f32418d51fb1b1ab64bdb8f0125de2a760cf21e7ffd4d99e9d7cde1368791c00000000000000000000000000000000047674c8f3627527dbb41f51fa52c0fe3a921d07466cb2b5484e4c8094556cae247347a0a1a98499510d1ce5067480ac", + "Name": "matter_g1_mul_83", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000017f16cffb737dadd52b3c5be258733dc47301474b7351c8dcb8ddb4c519018be08b64efea3336f2b6cfa78e0669dccf9000000000000000000000000000000000ae10eb4f791aa31e5bd7b6c4d68b04c6744262d8f5e9469b3987b101ff5a3066794e05694a9167b7050c3944b6d84f6a300c7e1041d94df0e0201e1135fa6eafc98bd33b2dfbe4c59b546a52538c07d", + "Expected": "0000000000000000000000000000000000d76cf9fa103355e6f5cd4baa3420e694f252249aa6171569b70cb43c906eae9b60bb79b41af8dc714bd917638bf538000000000000000000000000000000000b9272015e64f292d7b76867714a55d7223bb026f354b20109e81122fa13fd0426bb3aec705b477e7b9560c5a99c9d60", + "Name": "matter_g1_mul_84", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000062168f0bfd29c44074430158708a1e3b6808bae633ce9506b32eb9124db1a0668d83f2076adffb568ccf289a61685420000000000000000000000000000000016aead8bd8c4d5ddc444e15bc83e8f14d377d5e8d756a0255f1387506b9a9add69592241dbd9cab95474d55ac473886233e9cdb10fc117afb17803b61a2bca7de1d190a325639eb23743f51f28294b33", + "Expected": "0000000000000000000000000000000007c87e6d92bd41b7fa6a6ca890bf0b58304875a79af7959d9226a5be2f4ac2b4531fd09712eb6299c23d7c1c5ba3997f00000000000000000000000000000000164fb86eafac39e06c2403e315bff96faecc57474bfc964736b1850696ecfedbaa0795e537b8f541159d479ac5b52560", + "Name": "matter_g1_mul_85", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000c60b948942652a8214d8776b77a6c559ca77eb3a537b0a9abadc3058eac8c1d7840f091acd6c0056d5a71468a2b1ceb0000000000000000000000000000000019049c394e547b9b714b5969adcf068b381def6af2b27d1d361d06e9576273a8febb5bf94b5061ccec7afdb5642c0ae8c48b98edd9c229037751d02e58f3d4234d9a3b0ad9ae4947ae14beebb274746f", + "Expected": "000000000000000000000000000000000fb01ce0567f09dc44fd473009d2467c8c16da5ea7b39a1f1dba7b3656cadd6bdf2bf68f96a43252d92e428c1d2785490000000000000000000000000000000008b4fa645f3c56459a17c912c82ca36165e730807282cabeadd9c6c4a12c8a592cbac265021ef62c60eb60df3ff61061", + "Name": "matter_g1_mul_86", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000013fe38343072af8ef1d8247c3d46b4fd190086ceddfeb767787031368da6a6a6ae849cfc26a24ead499338e37fa337e30000000000000000000000000000000009f7d7b21882455e9f1f24ea120f3eb69f739c1320c37eb2b17e0a271cb03ac6e2b0c55d3518548a005f28b5748b7f594228758d2cf8105f2ef11d83018157a3119a44874dc34d5f0bddb533f50df52c", + "Expected": "000000000000000000000000000000000b9c328c8a18113e1d1f783432c857015eaefa724fa2c441d5ef76b158ee6fe0cd1775b0c6db7600754cbf25fea528fe0000000000000000000000000000000019d30c3557af1da2ca169e70625732d9a4396b51f3b4988a9aba1be62538fd51c167c83e921f4876224d361afc90eaf8", + "Name": "matter_g1_mul_87", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000018c6df81d810deaac0b143edf79956c92af7941f7b279db345f838bd583177912fc2eb367616ae165e261014a4d7b1b900000000000000000000000000000000146696840e8e988d0eab90ea935dd8b5f1272bbb81eb524e523c57d34ad7c5f0f3b721566f51dac4774826b84cc1c82fa417c96f0cf4355a78513c77cdc676a7b09125802c8045756da867e0025a36f1", + "Expected": "00000000000000000000000000000000041054430741e889d4cd8e7efa41547eb624bd775fd9fb64cf9e3dc2c6df27c95ffb8d76933ac4fa1952a5820ff88512000000000000000000000000000000000e8a28f5c622482b296a43ddb607e0f25635664fa849f3d6840ed7118892106a787bc07806dfd83935754d2057f2eff8", + "Name": "matter_g1_mul_88", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000c6b634d90c2664b9fa4ccbca35913d23696825350e21f0a6dd5e9abb17497a0a499e1b7b928a57ba8c730158f63b75d0000000000000000000000000000000009d569f05e69a38231d0f636e1ef040af059a00db4ff09bd2ad82b7e04cc041a33603c2eb9b148e3b1412bdef9740ab446561328b7689b0a89014823537cf9eeaca6ea5c56a3e58d2abfc2ee455dfccb", + "Expected": "000000000000000000000000000000000da2286b44e7e90e19d51c3c41bef375c54688b07afffbd7c528589dbf7f012e1fd248b9067a3faae9f1c6b626a5c90b000000000000000000000000000000000bfa0a482b0fc445f7b99c52a48116383bb70d5f2ebec5b7715796fbd0da744d0467584bfc1c8a42ace833d57c167a24", + "Name": "matter_g1_mul_89", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000018129b2f00be24717c906d215beaaa136758aa1730bd0bbe9c0de9b3cbb3c0ea47911817fa322b907cc6fc720cabde05000000000000000000000000000000000e8b0f968ccb230517ef8980be559f410a2c4035a1101e6796d4f7a5ee5c93a19c111d38930bd5bca69405fc35fea7c2cf6c3fcd4b9e6b72853934b306a078b1f2fb17879db4a0a93d484abbc2b746cf", + "Expected": "00000000000000000000000000000000148a7e9b0b4fde322f1177ced0bba34abec4a3e500afb86f9ae0a71bd75004e9c631d4cb26798bf963f7aa367f74630c00000000000000000000000000000000097f4c0893f9beadd66e4cfc6976dd277e527b1e31443e07554dacca52390066a4b37a7f0824cbaf51d3a555d696881b", + "Name": "matter_g1_mul_90", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001667fdc9b89d12fb0704fdec910cab1b51ac04219ef6e50f996688b2ceb26dca0e9e8594c5b81fca2e8fc2c8d8fa9a4700000000000000000000000000000000193118d1f237c68a8a0961fb220c0fd6a08853908a039dd57f8ed334063e5316bf83e8c3c3f44420734abbd7ddda31a6f6787b565e8d71be6fdb0c97c4659389c800a2047f668b366214adc716f402d5", + "Expected": "0000000000000000000000000000000003e1d921b5e0280f7370d55967e716bdacb7521547e22190e89862dbfcce02dfe7fa7927a70e7bc33448b9321de3d8ae000000000000000000000000000000001163f78de4af8494666c64d47d68a0feb0905c42ddfa024398401202d1fe0d6672bd1bd4222a8d106668ba4617683485", + "Name": "matter_g1_mul_91", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000217a4c563d730ef545e452038813301933ccc6638321ee5e217dad0be2e3ddc855a14054d0d72b6bcc692a5fb1ac7300000000000000000000000000000000007025f1c4a5f85a9c1587d4d4a2e620d83d60568343940ffd85e6b1e4fb0f0f53bb08c4f48bf6f45a7dbc3722ecc951e40ed91f6ceb2ccf87e4106a16227a3cd7b2821b4f3a6e629001f78ba1aa7346e", + "Expected": "000000000000000000000000000000000a94a186b96acbee87f9c1745dc301229ec750c6967262e629924227c6680b1d404e4b23d998611ad0e415610dc8edd900000000000000000000000000000000014da21c0f6930a79c8afbe42f73e048236b6d9f9ef8f270733fa1cb1012377eab37ddf2b9c742fea44020caeb95beb9", + "Name": "matter_g1_mul_92", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000009ec00ea2da59d937d3154d86dbed2957667253401bce9de80e0ffe6df32f36b06404b9e3af08e912a0b4ef091f93efb000000000000000000000000000000000dd8d1bd66f4accbc9d0c7dabef7af72f51c67a0d61384647533ad92bba44a312f0be0fa52163176f1aff4e64c00aefbae8ddfcdb4748981acb9b2037c017174a140f2457fb0148fe807fd194a9f7be5", + "Expected": "0000000000000000000000000000000015cc6c31dfa9482c6341f816786562481bc3a4db4a4a00807a9c7c676eb32b9dc7e002ed4971f26c1dddea00d78721b5000000000000000000000000000000001303660b6bcac611b2d41a4f7ac9ecf3f0b4292f83f2fdeba300a060131322ee3c2da3ca3539114114ec8a76dee6a5ac", + "Name": "matter_g1_mul_93", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000014153e01c9e495c5c01c82b3cad9eaf20cf78369ccbabf57fb160ded309cbd1caea3d3df38a7ea5490c67f168e9acec0000000000000000000000000000000001648030be79658c134e016a211d311841988065957b35e9bc1580fb6e05e291e747b7a960a50e26a2a3c0cd1634c35851268803aeb58a2d57fc797358fb456d5cf96afecb1ee0d2b90782aa0d652b8c0", + "Expected": "0000000000000000000000000000000009f1903e9a7d275487a503b9c968cd86823fe6667c09593b60ac2c88f306e20ccde32eebb5942a03fabde9195c5c500200000000000000000000000000000000179b41dbc2ede95ba7dad512329aeca9ca3bfd4da4b9620070d76d8fe8b49ad7fa92358070dd5098a2eaff490641edbb", + "Name": "matter_g1_mul_94", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001555535228eb9a24f460df9894d59aa06fc848a8bf8d6c3b51653b1d85734b3c5a2bece161309bd478d356fa198d579500000000000000000000000000000000144401f7eb69f6321eae8dad39dbe2cf4ae58e455474701dd9f1b62c85c7536813e84eb4f9def511eb62e5194288728bf9a8a4e5c65973b785c1e2637937de239bb0fde34b786dceea66f6bb12eb4169", + "Expected": "000000000000000000000000000000000f9736431073987708757d61927a45cfec471c8366776e140f62d805afd948fd132c4a5f4049de3a1474d0cb52c3c25e000000000000000000000000000000001515b057952696810a90dce1ee8464fd6370e8af5434a99333eacd1fb2884f6e8c568f887030a4957ff6d24ca02f4657", + "Name": "matter_g1_mul_95", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000b767f399e4ebea34fd6b6b7f32a77f4a36841a12fc79e68910a963175d28cb634eeb8dc6e0533c662223c36b728cce2000000000000000000000000000000000cb3827fd6ac2c84f24f64789adac53439b4eba89409e12fbca0917faa6b7109aa831d16ca03191a124738228095ed65070e7e2ae2751a1f71962726a31f77553c2da38f4fecda435b6e5459d5e833b4", + "Expected": "00000000000000000000000000000000195460b2d59df32f9f41eaef1139d45f0cb8f35a7982c38d356a8a8412f25e600580026d2d908b0493edba5dbea85f5c0000000000000000000000000000000004b339d62b3cd4cc966c6b4038adb302f997a16d8a6dfebd153295de08e57d1513cf0f16d82dc450e4d6f52621a42fb4", + "Name": "matter_g1_mul_96", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000150b75e9e9c03ada40b607f3d648bd6c40269aba3a1a992986dc005c9fde80bb1605266add0819641a0ca702d67bceed00000000000000000000000000000000083b43df032654f2dce90c8049ae4872a39f9cd860f08512930f43898e0f1e5625a5620818788797f3ca68134bc27d22d16aa883a20307f5436354bab32b4633e83178f33626af3edb14f82724b8e125", + "Expected": "0000000000000000000000000000000012cf2bcb79668067b7a265672ca614405868cf189ee9789b9e1e3186d231176dab5fea86cc5865392db8c75fc5d124c900000000000000000000000000000000121bf40feea00e151b718157b8c024f126762d84cff20aac08e7f2a027ab88b33e134a410c2af279a39618f7d21482a0", + "Name": "matter_g1_mul_97", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000cba419694214e95a3605a9b748854d16c8e6e1ee151c907487d8189acfac1361b790a5e78f43593152027295adf8df400000000000000000000000000000000110813ff6e0ddf3427e2a514d3f0bfbadcaf9dbf039e0f93fb9643d1e62bc2469fe84cd9ff0d585bdd1037255bbe5485041390a2209b80f7c64d14965cc2f515d5fbdf37953f75c4a0203bf0d9fb674b", + "Expected": "0000000000000000000000000000000013a530f94e7600820dbd8aabefde2acb8b3c74e833457102fbd297317eb532c0622636ef9e9376fac1637dc745fe895000000000000000000000000000000000139eb14d3b69be977413c832bfda234348186d46fe177154e34fe204f62ac79f4b0f59bbef39b0676d81ea42a0946fb3", + "Name": "matter_g1_mul_98", + "Gas": 12000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000106df8eba767e90cce0eabdaacc24d8e226c6865012ef8cb1460de5a319d443fdc6b4f4e58fb668943e0528b1809da10000000000000000000000000000000019789f464c95c179af18704c0b67b881991880f75ee7b03b9feafa3eafcd0f7d30a17fdd9cf439ff7fe683adca2083b57cf23dee8d95d94046678f3bdb4b0ea3d4e3a1a2f07f582e2a98ad6eb7562cbf", + "Expected": "000000000000000000000000000000000bf700422a382546a74376b0292f3a49ceff5597f0d2b726b1ff099bcda7ba92238a21db12eff5c314a29dd2387bec850000000000000000000000000000000005e22e3c772f3634b1ccf4e311241977eb20e7269540ef22d379de26ab80c58461dfa3b67848e0d584fb11de1917949a", + "Name": "matter_g1_mul_99", + "Gas": 12000, + "NoBenchmark": false + } +] diff --git a/x/evm/core/vm/testdata/precompiles/blsG1MultiExp.json b/x/evm/core/vm/testdata/precompiles/blsG1MultiExp.json new file mode 100644 index 0000000000..62b91f6f4d --- /dev/null +++ b/x/evm/core/vm/testdata/precompiles/blsG1MultiExp.json @@ -0,0 +1,723 @@ +[ + { + "Input": "0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e10000000000000000000000000000000000000000000000000000000000000011", + "Expected": "000000000000000000000000000000001098f178f84fc753a76bb63709e9be91eec3ff5f7f3a5f4836f34fe8a1a6d6c5578d8fd820573cef3a01e2bfef3eaf3a000000000000000000000000000000000ea923110b733b531006075f796cc9368f2477fe26020f465468efbb380ce1f8eebaf5c770f31d320f9bd378dc758436", + "Name": "bls_g1multiexp_single", + "Gas": 14400, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e10000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000e12039459c60491672b6a6282355d8765ba6272387fb91a3e9604fa2a81450cf16b870bb446fc3a3e0a187fff6f89450000000000000000000000000000000018b6c1ed9f45d3cbc0b01b9d038dcecacbd702eb26469a0eb3905bd421461712f67f782b4735849644c1772c93fe3d09000000000000000000000000000000000000000000000000000000000000003300000000000000000000000000000000147b327c8a15b39634a426af70c062b50632a744eddd41b5a4686414ef4cd9746bb11d0a53c6c2ff21bbcf331e07ac9200000000000000000000000000000000078c2e9782fa5d9ab4e728684382717aa2b8fad61b5f5e7cf3baa0bc9465f57342bb7c6d7b232e70eebcdbf70f903a450000000000000000000000000000000000000000000000000000000000000034", + "Expected": "000000000000000000000000000000001339b4f51923efe38905f590ba2031a2e7154f0adb34a498dfde8fb0f1ccf6862ae5e3070967056385055a666f1b6fc70000000000000000000000000000000009fb423f7e7850ef9c4c11a119bb7161fe1d11ac5527051b29fe8f73ad4262c84c37b0f1b9f0e163a9682c22c7f98c80", + "Name": "bls_g1multiexp_multiple", + "Gas": 27504, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e1000000000000000000000000000000000000000000000000000000000000005b000000000000000000000000000000000572cbea904d67468808c8eb50a9450c9721db309128012543902d0ac358a62ae28f75bb8f1c7c42c39a8c5529bf0f4e00000000000000000000000000000000166a9d8cabc673a322fda673779d8e3822ba3ecb8670e461f73bb9021d5fd76a4c56d9d4cd16bd1bba86881979749d2800000000000000000000000000000000000000000000000000000000000020590000000000000000000000000000000009ece308f9d1f0131765212deca99697b112d61f9be9a5f1f3780a51335b3ff981747a0b2ca2179b96d2c0c9024e522400000000000000000000000000000000032b80d3a6f5b09f8a84623389c5f80ca69a0cddabc3097f9d9c27310fd43be6e745256c634af45ca3473b0590ae30d100000000000000000000000000000000000000000000000000000000000b7fa3000000000000000000000000000000000c9b60d5afcbd5663a8a44b7c5a02f19e9a77ab0a35bd65809bb5c67ec582c897feb04decc694b13e08587f3ff9b5b6000000000000000000000000000000000143be6d078c2b79a7d4f1d1b21486a030ec93f56aa54e1de880db5a66dd833a652a95bee27c824084006cb5644cbd43f0000000000000000000000000000000000000000000000000000000004165ef10000000000000000000000000000000010e7791fb972fe014159aa33a98622da3cdc98ff707965e536d8636b5fcc5ac7a91a8c46e59a00dca575af0f18fb13dc0000000000000000000000000000000016ba437edcc6551e30c10512367494bfb6b01cc6681e8a4c3cd2501832ab5c4abc40b4578b85cbaffbf0bcd70d67c6e20000000000000000000000000000000000000000000000000000000173f3bfab0000000000000000000000000000000006e82f6da4520f85c5d27d8f329eccfa05944fd1096b20734c894966d12a9e2a9a9744529d7212d33883113a0cadb9090000000000000000000000000000000017d81038f7d60bee9110d9c0d6d1102fe2d998c957f28e31ec284cc04134df8e47e8f82ff3af2e60a6d9688a4563477c0000000000000000000000000000000000000000000000000000008437a521c9000000000000000000000000000000001928f3beb93519eecf0145da903b40a4c97dca00b21f12ac0df3be9116ef2ef27b2ae6bcd4c5bc2d54ef5a70627efcb700000000000000000000000000000000108dadbaa4b636445639d5ae3089b3c43a8a1d47818edd1839d7383959a41c10fdc66849cfa1b08c5a11ec7e28981a1c00000000000000000000000000000000000000000000000000002effc7b3027300000000000000000000000000000000085ae765588126f5e860d019c0e26235f567a9c0c0b2d8ff30f3e8d436b1082596e5e7462d20f5be3764fd473e57f9cf0000000000000000000000000000000019e7dfab8a794b6abb9f84e57739de172a63415273f460d1607fa6a74f0acd97d9671b801dd1fd4f18232dd1259359a10000000000000000000000000000000000000000000000000010b4ebfca1dee10000000000000000000000000000000019cdf3807146e68e041314ca93e1fee0991224ec2a74beb2866816fd0826ce7b6263ee31e953a86d1b72cc2215a577930000000000000000000000000000000007481b1f261aabacf45c6e4fc278055441bfaf99f604d1f835c0752ac9742b4522c9f5c77db40989e7da608505d4861600000000000000000000000000000000000000000000000005f04fe2cd8a39fb000000000000000000000000000000000f81da25ecf1c84b577fefbedd61077a81dc43b00304015b2b596ab67f00e41c86bb00ebd0f90d4b125eb0539891aeed0000000000000000000000000000000011af629591ec86916d6ce37877b743fe209a3af61147996c1df7fd1c47b03181cd806fd31c3071b739e4deb234bd9e190000000000000000000000000000000000000000000000021c6c659f10229c390000000000000000000000000000000000fd75ebcc0a21649e3177bcce15426da0e4f25d6828fbf4038d4d7ed3bd4421de3ef61d70f794687b12b2d571971a550000000000000000000000000000000004523f5a3915fc57ee889cdb057e3e76109112d125217546ccfe26810c99b130d1b27820595ad61c7527dc5bbb132a900000000000000000000000000000000000000000000000c01a881f8abc4d8843000000000000000000000000000000000345dd80ffef0eaec8920e39ebb7f5e9ae9c1d6179e9129b705923df7830c67f3690cbc48649d4079eadf5397339580c00000000000000000000000000000000083d3baf25e42f2845d8fa594dda2e0f40a4d670dda40f30da0aff0d81c87ac3d687fe84eca72f34c7c755a045668cf10000000000000000000000000000000000000000000044496e633650ef8f6fd100000000000000000000000000000000051f8a0b82a6d86202a61cbc3b0f3db7d19650b914587bde4715ccd372e1e40cab95517779d840416e1679c84a6db24e000000000000000000000000000000000b6a63ac48b7d7666ccfcf1e7de0097c5e6e1aacd03507d23fb975d8daec42857b3a471bf3fc471425b63864e045f4df00000000000000000000000000000000000000000018461a3d444ec527fcbf4b0000000000000000000000000000000019bef05aaba1ea467fcbc9c420f5e3153c9d2b5f9bf2c7e2e7f6946f854043627b45b008607b9a9108bb96f3c1c089d3000000000000000000000000000000000adb3250ba142db6a748a85e4e401fa0490dd10f27068d161bd47cb562cc189b3194ab53a998e48a48c65e071bb54117000000000000000000000000000000000000000008a0eb53c748001536d7ffa9000000000000000000000000000000000d9e19b3f4c7c233a6112e5397309f9812a4f61f754f11dd3dcb8b07d55a7b1dfea65f19a1488a14fef9a414950835820000000000000000000000000000000009d0d1f706f1a85a98f3efaf5c35a41c9182afc129285cf2db3212f6ea0da586ca539bc66181f2ccb228485dd8aff0a700000000000000000000000000000000000000031133a6c7d698078a7ec7e11300000000000000000000000000000000073eb991aa22cdb794da6fcde55a427f0a4df5a4a70de23a988b5e5fc8c4d844f66d990273267a54dd21579b7ba6a086000000000000000000000000000000001825bacd18f695351f843521ebeada20352c3c3965626f98bc4c68e6ff7c4eed38b48f328204bbb9cd461511d24ebfb300000000000000000000000000000000000001171d5c4909480aae3b110d01c1000000000000000000000000000000001098f178f84fc753a76bb63709e9be91eec3ff5f7f3a5f4836f34fe8a1a6d6c5578d8fd820573cef3a01e2bfef3eaf3a000000000000000000000000000000000ea923110b733b531006075f796cc9368f2477fe26020f465468efbb380ce1f8eebaf5c770f31d320f9bd378dc75843600000000000000000000000000000000000063376fcdf64c9bcbeeff0f9f9f9b000000000000000000000000000000001252a4ac3529f8b2b6e8189b95a60b8865f07f9a9b73f98d5df708511d3f68632c4c7d1e2b03e6b1d1e2c01839752ada0000000000000000000000000000000002a1bc189e36902d1a49b9965eca3cb818ab5c26dffca63ca9af032870f7bbc615ac65f21bed27bd77dd65f2e90f535800000000000000000000000000000000002344b4be368d3b617df4aa8dbdbc19000000000000000000000000000000001271205227c7aa27f45f20b3ba380dfea8b51efae91fd32e552774c99e2a1237aa59c0c43f52aad99bba3783ea2f36a4000000000000000000000000000000001407ffc2c1a2fe3b00d1f91e1f4febcda31004f7c301075c9031c55dd3dfa8104b156a6a3b7017fccd27f81c2af222ef000000000000000000000000000000000c896c3f9d64341ba7c5f8a06271dce3000000000000000000000000000000000272e9d1d50a4aea7d8f0583948090d0888be5777f2846800b8281139cd4aa9eee05f89b069857a3e77ccfaae1615f9c0000000000000000000000000000000016ab25d6a997bcac8999d481633caa41606894aae9770cdb54aac65ac0a454dd0346b3428fefd837b1e3f654f8217f4a0000000000000000000000000000000474d97a9cf29e85d4a35f6102fe7984b1000000000000000000000000000000001780e853f8ce7eda772c6691d25e220ca1d2ab0db51a7824b700620f7ac94c06639e91c98bb6abd78128f0ec845df8ef00000000000000000000000000000000095bc13d5a05c686e20d7b904db4931272d84d051a516fbb23acf7981d39bffa3943d08a9be01fc48e5241cd8b775ddd00000000000000000000000000000195894e95ca3e59929612e77c1075322aeb000000000000000000000000000000000b48aa2cc6f4a0bb63b5d67be54ac3aed10326dda304c5aeb9e942b40d6e7610478377680ab90e092ef1895e62786008000000000000000000000000000000000f6fc00c0697119a34363c0294acf608eca3c680d80183a59c89b45a66dc750f818a27e3a6e136d69e7580a8afca001b00000000000000000000000000009027ceef3ee429d71b58b84919d9a8d54189000000000000000000000000000000000c8b694b04d98a749a0763c72fc020ef61b2bb3f63ebb182cb2e568f6a8b9ca3ae013ae78317599e7e7ba2a528ec754a000000000000000000000000000000000951b70c206350e1edc2aefdfaa95318368c151e01e468b9fb1cf7c3c6575e4f06c135715cc5e51e1b492d19adf9bee000000000000000000000000000333e268f0b5b1adf76b88981fc305f03ce4bb3000000000000000000000000000000001717182463fbe215168e6762abcbb55c5c65290f2b5a2af616f8a6f50d625b46164178a11622d21913efdfa4b800648d0000000000000000000000000000000008531aa42aa092a91e0894d84ff0bcec0d37cede43dec85cca80ffad335d6f69da18335869ba1174f73bb37501404d6f000000000000000000000000123717b4d909628d6f3398e134a531c65a54e8a1000000000000000000000000000000000cb58c81ae0cae2e9d4d446b730922239923c345744eee58efaadb36e9a0925545b18a987acf0bad469035b291e37269000000000000000000000000000000001678cefdd942f60480b5f69738a6a4cea5e1a9239d1bd5f701ad96c2dd1fd252f0aeea219bddcda4bc8f83983a282aff00000000000000000000000679956d49265608468757580db6b8b1821c2eb13b", + "Expected": "0000000000000000000000000000000005548dad0613ef8804a347152e8267acdbbcab98a795fc0da2d9df5c8ec37e0eb32e82950fbe5f8ec330b8bffafe13e40000000000000000000000000000000014e94dbbf60d89b3f68a5a076fcbd7cc0b683eae228f5d5036ee61012996ae2d347cec19dbd4eab547fadecdb31c078a", + "Name": "bls_g1multiexp_larger", + "Gas": 89400, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000012196c5a43d69224d8713389285f26b98f86ee910ab3dd668e413738282003cc5b7357af9a7af54bb713d62255e80f560000000000000000000000000000000006ba8102bfbeea4416b710c73e8cce3032c31c6269c44906f8ac4f7874ce99fb17559992486528963884ce429a992feeb3c940fe79b6966489b527955de7599194a9ac69a6ff58b8d99e7b1084f0464e00000000000000000000000000000000117dbe419018f67844f6a5e1b78a1e597283ad7b8ee7ac5e58846f5a5fd68d0da99ce235a91db3ec1cf340fe6b7afcdb0000000000000000000000000000000013316f23de032d25e912ae8dc9b54c8dba1be7cecdbb9d2228d7e8f652011d46be79089dd0a6080a73c82256ce5e4ed24d0e25bf3f6fc9f4da25d21fdc71773f1947b7a8a775b8177f7eca990b05b71d0000000000000000000000000000000008ab7b556c672db7883ec47efa6d98bb08cec7902ebb421aac1c31506b177ac444ffa2d9b400a6f1cbdc6240c607ee110000000000000000000000000000000016b7fa9adf4addc2192271ce7ad3c8d8f902d061c43b7d2e8e26922009b777855bffabe7ed1a09155819eabfa87f276f973f40c12c92b703d7b7848ef8b4466d40823aad3943a312b57432b91ff68be10000000000000000000000000000000015ff9a232d9b5a8020a85d5fe08a1dcfb73ece434258fe0e2fddf10ddef0906c42dcb5f5d62fc97f934ba900f17beb330000000000000000000000000000000009cfe4ee2241d9413c616462d7bac035a6766aeaab69c81e094d75b840df45d7e0dfac0265608b93efefb9a8728b98e44c51f97bcdda93904ae26991b471e9ea942e2b5b8ed26055da11c58bc7b5002a0000000000000000000000000000000017a17b82e3bfadf3250210d8ef572c02c3610d65ab4d7366e0b748768a28ee6a1b51f77ed686a64f087f36f641e7dca900000000000000000000000000000000077ea73d233ccea51dc4d5acecf6d9332bf17ae51598f4b394a5f62fb387e9c9aa1d6823b64a074f5873422ca57545d38964d5867927bc3e35a0b4c457482373969bff5edff8a781d65573e07fd87b89000000000000000000000000000000000c1243478f4fbdc21ea9b241655947a28accd058d0cdb4f9f0576d32f09dddaf0850464550ff07cab5927b3e4c863ce90000000000000000000000000000000015fb54db10ffac0b6cd374eb7168a8cb3df0a7d5f872d8e98c1f623deb66df5dd08ff4c3658f2905ec8bd02598bd4f90787c38b944eadbd03fd3187f450571740f6cd00e5b2e560165846eb800e5c944000000000000000000000000000000000328f09584b6d6c98a709fc22e184123994613aca95a28ac53df8523b92273eb6f4e2d9b2a7dcebb474604d54a210719000000000000000000000000000000001220ebde579911fe2e707446aaad8d3789fae96ae2e23670a4fd856ed82daaab704779eb4224027c1ed9460f39951a1baaee7ae2a237e8e53560c79e7baa9adf9c00a0ea4d6f514e7a6832eb15cef1e10000000000000000000000000000000002ebfa98aa92c32a29ebe17fcb1819ba82e686abd9371fcee8ea793b4c72b6464085044f818f1f5902396df0122830cb00000000000000000000000000000000001184715b8432ed190b459113977289a890f68f6085ea111466af15103c9c02467da33e01d6bff87fd57db6ccba442adac6ed3ef45c1d7d3028f0f89e5458797996d3294b95bebe049b76c7d0db317c0000000000000000000000000000000009d6424e002439998e91cd509f85751ad25e574830c564e7568347d19e3f38add0cab067c0b4b0801785a78bcbeaf246000000000000000000000000000000000ef6d7db03ee654503b46ff0dbc3297536a422e963bda9871a8da8f4eeb98dedebd6071c4880b4636198f4c2375dc795bb30985756c3ca075114c92f231575d6befafe4084517f1166a47376867bd1080000000000000000000000000000000002d1cdb93191d1f9f0308c2c55d0208a071f5520faca7c52ab0311dbc9ba563bd33b5dd6baa77bf45ac2c3269e945f4800000000000000000000000000000000072a52106e6d7b92c594c4dacd20ef5fab7141e45c231457cd7e71463b2254ee6e72689e516fa6a8f29f2a173ce0a190fb730105809f64ea522983d6bbb62f7e2e8cbf702685e9be10e2ef71f81876720000000000000000000000000000000000641642f6801d39a09a536f506056f72a619c50d043673d6d39aa4af11d8e3ded38b9c3bbc970dbc1bd55d68f94b50d0000000000000000000000000000000009ab050de356a24aea90007c6b319614ba2f2ed67223b972767117769e3c8e31ee4056494628fb2892d3d37afb6ac943b6a9408625b0ca8fcbfb21d34eec2d8e24e9a30d2d3b32d7a37d110b13afbfea000000000000000000000000000000000fd4893addbd58fb1bf30b8e62bef068da386edbab9541d198e8719b2de5beb9223d87387af82e8b55bd521ff3e47e2d000000000000000000000000000000000f3a923b76473d5b5a53501790cb02597bb778bdacb3805a9002b152d22241ad131d0f0d6a260739cbab2c2fe602870e3b77283d0a7bb9e17a27e66851792fdd605cc0a339028b8985390fd024374c760000000000000000000000000000000002cb4b24c8aa799fd7cb1e4ab1aab1372113200343d8526ea7bc64dfaf926baf5d90756a40e35617854a2079cd07fba40000000000000000000000000000000003327ca22bd64ebd673cc6d5b02b2a8804d5353c9d251637c4273ad08d581cc0d58da9bea27c37a0b3f4961dbafd276bdd994eae929aee7428fdda2e44f8cb12b10b91c83b22abc8bbb561310b62257c00000000000000000000000000000000024ad70f2b2105ca37112858e84c6f5e3ffd4a8b064522faae1ecba38fabd52a6274cb46b00075deb87472f11f2e67d90000000000000000000000000000000010a502c8b2a68aa30d2cb719273550b9a3c283c35b2e18a01b0b765344ffaaa5cb30a1e3e6ecd3a53ab67658a57876817010b134989c8368c7f831f9dd9f9a890e2c1435681107414f2e8637153bbf6a0000000000000000000000000000000000704cc57c8e0944326ddc7c747d9e7347a7f6918977132eea269f161461eb64066f773352f293a3ac458dc3ccd5026a000000000000000000000000000000001099d3c2bb2d082f2fdcbed013f7ac69e8624f4fcf6dfab3ee9dcf7fbbdb8c49ee79de40e887c0b6828d2496e3a6f76894c68bc8d91ac8c489ee87dbfc4b94c93c8bbd5fc04c27db8b02303f3a65905400000000000000000000000000000000130535a29392c77f045ac90e47f2e7b3cffff94494fe605aad345b41043f6663ada8e2e7ecd3d06f3b8854ef92212f42000000000000000000000000000000001699a3cc1f10cd2ed0dc68eb916b4402e4f12bf4746893bf70e26e209e605ea89e3d53e7ac52bd07713d3c8fc671931db3682accc3939283b870357cf83683350baf73aa0d3d68bda82a0f6ae7e51746", + "Expected": "000000000000000000000000000000000b370fc4ca67fb0c3c270b1b4c4816ef953cd9f7cf6ad20e88099c40aace9c4bb3f4cd215e5796f65080c69c9f4d2a0f0000000000000000000000000000000007203220935ddc0190e2d7a99ec3f9231da550768373f9a5933dffd366f48146f8ea5fe5dee6539d925288083bb5a8f1", + "Name": "matter_g1_multiexp_0", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001830f52d9bff64a623c6f5259e2cd2c2a08ea17a8797aaf83174ea1e8c3bd3955c2af1d39bfa474815bfe60714b7cd80000000000000000000000000000000000874389c02d4cf1c61bc54c4c24def11dfbe7880bc998a95e70063009451ee8226fec4b278aade3a7cea55659459f1d507f80a5e502f63375d672379584e11e41d58d2ed58f3e5c3f67d9ea1138493cf00000000000000000000000000000000043c4ff154778330b4d5457b7811b551dbbf9701b402230411c527282fb5d2ba12cb445709718d5999e79fdd74c0a67000000000000000000000000000000000013a80ede40df002b72f6b33b1f0e3862d505efbe0721dce495d18920d542c98cdd2daf5164dbd1a2fee917ba943debebb169138f94093d5c1c6b253cc001ce8baf78858dae053173fa812d2d1c800da0000000000000000000000000000000009f9a78a70b9973c43182ba54bb6e363c6984d5f7920c1d347c5ff82e6093e73f4fb5e3cd985c9ddf9af936b16200e880000000000000000000000000000000008d7489c2d78f17b2b9b1d535f21588d8761b8fb323b08fa9af8a60f39b26e98af76aa883522f21e083c8a14c2e7edb6e40608bdaf3e7764358a64a920cbb33ab4d571c7b3092e1ae11d9697f82ed8330000000000000000000000000000000010fcfe8af8403a52400bf79e1bd0058f66b9cab583afe554aa1d82a3e794fffad5f0e19d385263b2dd9ef69d1154f10a000000000000000000000000000000000aba6a0b58b49f7c6c2802afd2a5ed1320bf062c7b93135f3c0ed7a1d7b1ee27b2b986cde732a60fa585ca6ab7cc154bd411519f2a33b07f65e7d721950e0f0d5161c71a402810e46817627a17c56c0f0000000000000000000000000000000013c5ebfb853f0c8741f12057b6b845c4cdbf72aecbeafc8f5b5978f186eead8685f2f3f125e536c465ade1a00f212b0900000000000000000000000000000000082543b58a13354d0cce5dc3fb1d91d1de6d5927290b2ff51e4e48f40cdf2d490730843b53a92865140153888d73d4af6bb3f9e512311699f110a5e6ae57e0a7d2caaa8f94e41ca71e4af069a93d08cc00000000000000000000000000000000053a12f6a1cb64272c34e042b7922fabe879275b837ba3b116adfe1eb2a6dc1c1fa6df40c779a7cdb8ed8689b8bc5ba800000000000000000000000000000000097ec91c728ae2d290489909bbee1a30048a7fa90bcfd96fe1d9297545867cbfee0939f20f1791329460a4fe1ac719292a0c988d97e86dccaeb8bd4e27f9e30fad5d5742202cdde17d800642db633c52000000000000000000000000000000001354dd8a230fde7c983dcf06fa9ac075b3ab8f56cdd9f15bf870afce2ae6e7c65ba91a1df6255b6f640bb51d7fed302500000000000000000000000000000000130f139ca118869de846d1d938521647b7d27a95b127bbc53578c7b66d88d541adb525e7028a147bf332607bd760deac0b299c14892e0519b0accfa17e1a758c8aae54794fb61549f1396395c967e1b10000000000000000000000000000000003f76a6dc6da31a399b93f4431bfabb3e48d86745eaa4b24d6337305006e3c7fc7bfcc85c85e2f3514cd389fec4e70580000000000000000000000000000000010e4280374c532ed0df44ac0bac82572f839afcfb8b696eea617d5bd1261288dfa90a7190200687d470992fb4827ff327064d43d6802ad4c3794705065f870263fef19b81604839c9dea8648388094e90000000000000000000000000000000009439f061c7d5fada6e5431c77fd093222285c98449951f6a6c4c8f225b316144875bc764be5ca51c7895773a9f1a640000000000000000000000000000000000ebdef273e2288c784c061bef6a45cd49b0306ac1e9faab263c6ff73dea4627189c8f10a823253d86a8752769cc4f8f2686285a0e22f177fe3adbfc435e9c1786752dcf3c11b723539789b0cdeb0647b000000000000000000000000000000001478ee0ffebf22708a6ab88855081daba5ee2f279b5a2ee5f5f8aec8f97649c8d5634fec3f8b28ad60981e6f29a091b10000000000000000000000000000000011efaeec0b1a4057b1e0053263afe40158790229c5bfb08062c90a252f59eca36085ab35e4cbc70483d29880c5c2f8c23176b6724cf984632daf95c869d56838ab2baef94be3a4bd15df2dd8e49a90a600000000000000000000000000000000150d43c64cb1dbb7b981f455e90b740918e2d63453ca17d8eeecb68e662d2581f8aa1aea5b095cd8fc2a941d6e2728390000000000000000000000000000000006dc2ccb10213d3f6c3f10856888cb2bf6f1c7fcb2a17d6e63596c29281682cafd4c72696ecd6af3cce31c440144ebd1d76db3dcb659eaf6c086be6b414a494dea4bd30aef8450ae639f473148c05b36000000000000000000000000000000000f46bb86e827aa9c0c570d93f4d7d6986668c0099e4853927571199e1ce9e756d9db951f5b0325acafb2bf6e8fec2a1b0000000000000000000000000000000006d38cc6cc1a950a18e92e16287f201af4c014aba1a17929dd407d0440924ce5f08fad8fe0c50f7f733b285bf282acfc9915646de2449b3cb78d142b6018f3da7a16769722ec2c7185aedafe2699a8bc0000000000000000000000000000000010cde0dbf4e18009c94ba648477624bbfb3732481d21663dd13cea914d6c54ec060557010ebe333d5e4b266e1563c631000000000000000000000000000000000fb24d3d4063fd054cd5b7288498f107114ff323226aca58d3336444fc79c010db15094ceda6eb99770c168d459f0da05061073223f066e35242772385c67aaefb3f7ea7df244d73369db1ea0b2087920000000000000000000000000000000008c0a4c543b7506e9718658902982b4ab7926cd90d4986eceb17b149d8f5122334903300ad419b90c2cb56dc6d2fe976000000000000000000000000000000000824e1631f054b666893784b1e7edb44b9a53596f718a6e5ba606dc1020cb6e269e9edf828de1768df0dd8ab8440e053f396ee22209271ea0bda10fb5e2584e7536e8bb1d00a0dd7b852b0aa653cd86c00000000000000000000000000000000159d94fb0cf6f4e3e26bdeb536d1ee9c511a29d32944da43420e86c3b5818e0f482a7a8af72880d4825a50fee6bc8cd8000000000000000000000000000000000c2ffe6be05eccd9170b6c181966bb8c1c3ed10e763613112238cabb41370e2a5bb5fef967f4f8f2af944dbef09d265ef0d3d4cf46265fc0f69e093181f8b02114e492485696c671b648450c4fcd97aa0000000000000000000000000000000019c822a4d44ac22f6fbaef356c37ceff93c1d6933e8c8f3b55784cfe62e5705930be48607c3f7a4a2ca146945cad6242000000000000000000000000000000000353d6521a17474856ad69582ce225f27d60f5a8319bea8cefded2c3f6b862d76fe633c77ed8ccdf99d2b10430253fc8915b717562844d59623bc582f1a95fc678cf0d39af32560c6c06e3a74023c89c", + "Expected": "0000000000000000000000000000000017479d99909c144a5a5fdfd71721f4a2ee90b2b9654e069a38b460945b9291fc74e6922a7dbab9bb12b4bff9e2d0175b0000000000000000000000000000000015cfff11afe08d76944c9f810017ecf78b8ed54096078195d65a5418f660cf9b2024646a8532e349eac5d32d59c829db", + "Name": "matter_g1_multiexp_1", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000189bf269a72de2872706983835afcbd09f6f4dfcabe0241b4e9fe1965a250d230d6f793ab17ce7cac456af7be4376be6000000000000000000000000000000000d4441801d287ba8de0e2fb6b77f766dbff07b4027098ce463cab80e01eb31d9f5dbd7ac935703d68c7032fa5128ff17d5c1c9fa11c36b86430cbb1f3ec10ebbe3787d0f5641d6d7fb96c810eda202dd0000000000000000000000000000000003299542a0c40efbb55d169a92ad11b4d6d7a6ed949cb0d6477803fbedcf74e4bd74de854c4c8b7f200c85c8129292540000000000000000000000000000000013a3d49e58274c2b4a534b95b7071b6d2f42b17b887bf128627c0f8894c19d3d69c1a419373ca4bd1bb6d4efc78e1d3fc00eb20fe7c292f3ad820a074d8b3d8d24506612752d8677c2d6ca24f556cc4500000000000000000000000000000000121b540a0465b39f2f093112c20a9822fc82497105778937c9d5cdcfe039d62998d47d4f41c76482c31f39a79352beda0000000000000000000000000000000014a461f829e0a76ba89f42eb57dffb4f5544df2008163bd0ea1af824f7ff910b27418a0e4f86cb8046dc1f3139cab9aff661d7b30fb11bef70e15b257d7073885468a380862202b2d705a84827644b5b000000000000000000000000000000001383bc4d6c748d5c76ab4ba04f8fcd4c0fed9a49ea080c548893440819833ad72a8249f77391d5fbff78329eb319d3830000000000000000000000000000000016404bd07b6c6480af2d23301940e61817ee2e61fc625c100b31e1b324c369a583b61048dd57ab97b80b1fe6cd64c5c3346ce87c847376c8967cc18297e6007dcfacb6424e1d273930f38bb0e88fc5ca0000000000000000000000000000000006bc68c6510c15a5d7bc6eebce04f7c5fce3bb02f9f89ea14ab0dfb43645b6346af7e25a8e044e842b7a3d06fe9b1a0300000000000000000000000000000000053ee41f6a51c49b069f12de32e3e6b0b355cd2c3ba87a149c7de86136a5d9c5b7b59f2d1237964e548d1b62ec36c8db39a142c443a666499a880aa1cb9f523411bbc8e5554de099ab485b6c2c2e57cc00000000000000000000000000000000024ca57c2dc2a7deec3082f2f2110b6788c57a8cdc43515044d275fe7d6f20540055bde823b7b091134fb811d23468ce0000000000000000000000000000000009cd91a281b96a881b20946fda164a987243c052378fcd8fee3926b75576dfa1d29a0aaca4b653da4e61da82577218082c01b7795c2d16b5bbbb1e107be36cc91b25130888956b0cdd344de9b4659447000000000000000000000000000000001305e1b9706c7fc132aea63f0926146557d4dd081b7a2913dae02bab75b0409a515d0f25ffa3eda81cf4764de15741f60000000000000000000000000000000011bf87b12734a6360d3dda4b452deede34470fba8e62a68f79153cc288a8e7fed98c74af862883b9861d2195a58262e0c712943d8795a6104f024b9701c70b09cdee9494755bbab0576e2c7f7c9d48280000000000000000000000000000000012662b26f03fc8179f090f29894e86155cff4ec2def43393e054f417bbf375edd79f5032a5333ab4eba4418306ed0153000000000000000000000000000000000f26fdf1af1b8ad442ef4494627c815ca01ae84510944788b87f4aa2c8600ed310b9579318bc617a689b916bb7731dcbd4d77f6246c57d398c57848db8d3f986c475a41a23d424cd3cc2b362c1b99f2a000000000000000000000000000000001837f0f18bed66841b4ff0b0411da3d5929e59b957a0872bce1c898a4ef0e13350bf4c7c8bcff4e61f24feca1acd5a370000000000000000000000000000000003d2c7fe67cada2213e842ac5ec0dec8ec205b762f2a9c05fa12fa120c80eba30676834f0560d11ce9939fe210ad6c6341776ed9d1029918af4c5113a6110139b8bd7f938caa204373a28ddaa51430eb00000000000000000000000000000000181dc6fd3668d036a37d60b214d68f1a6ffe1949ec6b22f923e69fb373b9c70e8bcc5cdace068024c631c27f28d994e5000000000000000000000000000000000b02ca2b0e6e0989ea917719b89caf1aa84b959e45b6238813bf02f40db95fbb3bf43d3017c3f9c57eab1be617f18032fa64411438542922a7bac10806efaa633d31d37c0b223314a8b6221155b9c425000000000000000000000000000000001329a75975b714c861064d743092866d61c4467e0c0316b78142e6db7e74538a376a09487cb09ee89583d547c187229000000000000000000000000000000000096713619bf088bd9e12752cab83e9cdd58296ada8d338c86a749f00ba014087a3836ce10adaaf2e815f431235bff4f0e7002f41c6acab677a0ad023bad2a61b11c1b7221d944018b5ce60bb61e87e96000000000000000000000000000000001195502bc48c44b37e3f8f4e6f40295c1156f58dbc00b04b3018d237b574a20512599d18af01c50192db37cb8eb2c8a90000000000000000000000000000000002b03f02b45aa15b39e030c4b88c89a285dff5c4bbfe16f643f3f87d91db774f8ab7019285fda0b236ff7eec16496e5ec26e55f09b787c0542878e4d720027d9ea465f829a4e0164cf618c5d9cde49bc000000000000000000000000000000000d7e1651f3e172dcca8774a7a0d58ab47178d3e759933289e1d3eb0da414160ff9e890a608bf8ccdf2820c4aea6e11cb00000000000000000000000000000000185e8671e2ddb8e36380e39fe4eafefbac9769935603c28caac7d3f7f0f3e8ad14e925024b55aeb67d68b219875c9d79bba67cc47e38a129ab1140fbcf0386ddba2feefc919aacdce6059a27a1e2efca000000000000000000000000000000001454d4a82163a155446467164904cefd7e1e3c67ae99bf65c581a75c72716fb011e2fd030eaf3d36977fbb0ff5156e2700000000000000000000000000000000123f973ab6bd3c2e5b0512a0c77ea0ac3003fd891e1262137f9444cd07b927b564e618205ba09220320ea1aa4564e820705fb566367d9fc142c4194b0525c16672b843aac1160f9056ebb115e80d377a000000000000000000000000000000000178e6828261ee6855b38234ed15c27551bb1648ac6ec9a9e70744643cd1f134b2309dd0c34b1e59ddfe3f831ab814c90000000000000000000000000000000002ec930fb58c898ede931384c5a5f9edd2f5c70b8c3794edb83a12f23be5400949f95e81c96c666c1a72dffb50b81158f7bfd990cc4dac62a0d730f56b4eb1c1ad77ca9cd58b089c23c2f6efa00b7fa40000000000000000000000000000000001ea88d0f329135df49893406b4f9aee0abfd74b62e7eb5576d3ddb329fc4b1649b7c228ec39c6577a069c0811c952f100000000000000000000000000000000033f481fc62ab0a249561d180da39ff641a540c9c109cde41946a0e85d18c9d60b41dbcdec370c5c9f22a9ee9de00ccd807c5a41ae2baa1e10ebee15363d1d4569f731d77a418998108f5dfae0e90556", + "Expected": "0000000000000000000000000000000001c143e5d7bba56a959b94955f8eaab82a92a2e2b355baac7da0b57281645c689486059fb590ef2576a7a03a7c57e85d00000000000000000000000000000000182b1e16004c7e6f55923dd0b1dfa7346d1243996070db78f45c4c0a2cef95e93c6373903b5e0dc63f171c8164c2fb5a", + "Name": "matter_g1_multiexp_2", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000008d8c4a16fb9d8800cce987c0eadbb6b3b005c213d44ecb5adeed713bae79d606041406df26169c35df63cf972c94be10000000000000000000000000000000011bc8afe71676e6730702a46ef817060249cd06cd82e6981085012ff6d013aa4470ba3a2c71e13ef653e1e223d1ccfe9a7e300bcb3c740fd1f693d4c8915c4c46dcb627f6de6e4847f123623cd23bac700000000000000000000000000000000120ddc1cd9e3a7b298673b1036d162c31dbb35d6e83b39b2564b3be16e446a836c96907e8a6af1e677e906bf5ed73159000000000000000000000000000000000fa57c1436615442bbb049d08ac46e501c07736cd239298752bb94d1904bd38cc687759987cadd99bd3c4d45ba07193ab473df5e282565a0783d23e65e283a103ebbddb5c884183cceb62fc32d0e9602000000000000000000000000000000000e3ccaa4fa358a5a885094cbb0b8baa106fbcca66edbe31511ac2f6f3d14edbd8701979d6e4690853555c625091392b600000000000000000000000000000000175bdd42583cbbf733242510c152380525aff7649273acef1ec20569804ffba7f029ca06878dbafde84540cece173822a048ef7cf5d1f6f625ee3aba091147c389ebebc5b8f3d285e16ef4e8afe5c0130000000000000000000000000000000001bc359baeac07a93aca770174ea6444aac9f04affdaa77c8a47b30c60ee2b527c061a4344139264e541d4134f42bfd0000000000000000000000000000000000cbf7a31e6fef4f4664bca4bc87ec7c0b12ced7224300aa4e1a6a7cbdedfcef07482b5d20fa607e3f03fdd6dd03fd10ca9b63c6bf36997118d58600c1e429c105a379b9e8b0de934ab9f433a4fa63dc80000000000000000000000000000000006b06ae8cb0981bf5167ad51e19d132db77548c4376697f855c8397b835743c42771096ed7b0a4b18af9494e42ee89aa0000000000000000000000000000000005aa892b0a056ff61706430f1daa3f0263dc01337eadabd8a7fd58152affd9aaa329e8c11ea98692134d9718cb4119bff228da17f49667c113d2bc2a2c8a338f80be68496f5145b4be21a5786ca6d46b0000000000000000000000000000000015dc9f87213e4781863ad43f6bbccd547967d9bcf6a35d95d530cbfbf0d7307981aee5bc4ccd41254841651717393a0300000000000000000000000000000000166ce33c0482b5957c6e746c16908ba579d6402b230bc977d3ff29ac2a4a800748d9c14608f2519e2ac4d1fe4daf29b29431e18a462fba704216b516e819fb3392e315b0c92a7411a329cdafeb51124400000000000000000000000000000000171fbc9cec717964c4324aa0d7dcf56a59b947c24a9092157f4f8c78ae43b8e4222fd1e8acdbf5989d0d17ea10f6046300000000000000000000000000000000148b5454f9b9868aefd2accc3318ddabfe618c5026e8c04f8a6bce76cd88e350bebcd779f2021fe7ceda3e8b4d438a0b2051041bd2f12f6e6e29924139770fe209b7bbdbcd6c0bcabbf5021a7dff2d830000000000000000000000000000000018724e2b9a2f383329207ee85577805f35d5c5bb9f6903e3c962e57ab7eb9d1639d1e9adbde53499863b299f576325a00000000000000000000000000000000016d2c22eabd4a06a5ae67b890a25fbede7d0e96c625b80329b19be6aa861f44b6e85778130d0bdf69f2abd491ee9751ab96df57a600dc3b5aabff5b1034886d24f6fcf035bcacaaec738deb2cfb8f8520000000000000000000000000000000010fcf5e5e478ac6442b218ce261878d8f61b405c0b9549512e23ead1f26a2240771993f8c039fbce4008a1707aeaaf25000000000000000000000000000000000f1afe9b199362f51cc84edb1d3cf2faf8e5bc0a734a646851ab83e213f73a3734114f255b611ec18db75694dcb0df9178176412b07eb7f423f23ffeaa0ee642590e0b7016bc063f3fffa93e1e35484c000000000000000000000000000000000f75bc9feb74110697c9f353686910c6246e587dd71d744aab99917f1aea7165b41deb333e6bd14843f28b2232f799830000000000000000000000000000000019275491a51599736722295659dd5589f4e3f558e3d45137a66b4c8066c7514ae66ec35c862cd00bce809db528040c049c4b5627d84e153f3a4ecc14ddd6baaf1d62253a0f88d3af51be18d991976da0000000000000000000000000000000000a87d0ccfb9c01148703d48993de04059d22a4cc48c5dabd2571ad4f7e60d6abfbcc5fb3bf363fd311fec675486c2a20000000000000000000000000000000000a896c5a84cbd03e52ae77000eb0285f5704993664a744a89ff6b346efd2efec1a519b67229a3b87e1f80e6aa17e29462ed270764791aff081f1dc8051d22b8e18803a7e310393f21bb4a495a445cd45000000000000000000000000000000000d35ffa284655a94c3050213f4f14e927c162818bbfd0480bad2e07000dd3081274056715c96408f243589d83365c9f20000000000000000000000000000000001450bddfa14033ed8cdb94386715013ed9b2c4f9d65944e9d32c0b3545a085113e173e5afcfccb78878414a464d3184fbfb7606b64eef0460b8f33a0be54451fb655ce0b81db89eb7862f392450354f000000000000000000000000000000000344cafaca754db423544657de1b77025164ccc702f8d45697fb73602302a3cb4511c38f0a76a37415d683398f35556500000000000000000000000000000000120935947070451885bf0c328bd83def193831ab9353844a01130074f16a1ff4d20df8459b5ad6a57d5f1959d37aae928a29fcc442d0c2446697e94dc47181dca7a314f9073c06aba6dc55aa79978d7d0000000000000000000000000000000008797f704442e133d3b77a5f0020aa304d36ce326ea75ca47e041e4d8a721754e0579ce82b96a69142cb7185998d18ce00000000000000000000000000000000144f438d86d1d808d528ea60c5d343b427124af6e43d4d9652368ddc508daab32fd9c9425cba44fba72e3449e366b170d5b468797b4af1978983faebe59a28f34956dacf5b7f65d25548bcedb518f45a00000000000000000000000000000000000707c711f77bb425cddc71ecf96a18b6eb0bed7f012c4f6cc9431003f2e1ac17f7c1f68c4965a4fcc273a3db93451d000000000000000000000000000000001211464c91c7e78b00fe156da874407e4eeb7f422dbd698effb9a83357bf226d3f189f2db541eb17db3ed555084e91ecdbc6afcdd409e5d50d7b655580f1144de77f3efe5d6268032eccab7deaaad9970000000000000000000000000000000004b3c0e8b240b79c55f02833c2c20fa158e35c941e9e8e48247b96cb1d4923641b97e766637a3ced9fbef275ca9bd1ea000000000000000000000000000000000b4e7355aea3488234552d3dddfa2d1ad3164056407770e6c54f764193c9dc044cb7f2b157a1c4153b2045867d6f99c5807347519f114e78f99617f6b147ca833bff7be962c9b1e1f32b5babe6067d7a", + "Expected": "000000000000000000000000000000000b2997ce4cb01abbb0ae6d28099d20e1f08c33351a6f0dce417a279789d6c581d4bc5a4a261e37e6df31a6928040d1f60000000000000000000000000000000003068e73dbbab6fddfd3c1e4fbf58bab58f15e1630c8c236faf3048be840abe316084aad7dd4ca6ee9d353ea8db536d6", + "Name": "matter_g1_multiexp_3", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001465358836eb5c6e173e425f675aa231f9c62e9b122584078f2ab9af7440a4ce4ac2cd21ce35a0017b01e4913b40f73d00000000000000000000000000000000170e2da3bca3d0a8659e31df4d8a3a73e681c22beb21577bea6bbc3de1cabff8a1db28b51fdd46ba906767b69db2f679830630695c8dabe9aded1b5365bf93770aab7e9ef4140a2bbde2f0a7b109724d000000000000000000000000000000000ab6e2a649ed97be4574603b3b4a210f0748d8cddf132079e0543ec776ceb63902e48598b7698cf79fd5130cebaf0250000000000000000000000000000000000d55b3115d2bfcd1b93c631a71b2356c887b32452aae53ffd01a719121d58834be1e0fa4f22a01bbde0d40f55ad38f2c184ef5eceadfd77b3a4092696ec34d0551c88e434567638623740b7d5f9e3616000000000000000000000000000000001654e99ebd103ed5709ae412a6df1751add90d4d56025667a4640c1d51435e7cad5464ff2c8b08cca56e34517b05acf10000000000000000000000000000000004d8353f55fdfb2407e80e881a5e57672fbcf7712dcec4cb583dbd93cf3f1052511fdee20f338a387690da7d69f4f6f7a80d9efab033e920061cee8f8d7ea6023cc05f08340642613628b39e7b7fd0af0000000000000000000000000000000001bb1e11a1ccc0b70ce46114caca7ac1aba2a607fea8c6a0e01785e17559b271a0e8b5afbfa8705ecb77420473e81c510000000000000000000000000000000018f2289ba50f703f87f0516d517e2f6309fe0dc7aca87cc534554c0e57c4bdc5cde0ca896033b7f3d96995d5cbd563d245111c860f6f5725f99b225c53b9fe1a70150e7ce922bfe214900aaa2790d1450000000000000000000000000000000012ecb4c2f259efb4416025e236108eff7862e54f796605cc7eb12f3e5275c80ef42aadd2acfbf84d5206f6884d8e3eab000000000000000000000000000000001554412fc407e6b6cf3cbcc0c240524d1a0bf9c1335926715ac1c5a5a79ecdf2fdd97c3d828881b3d2f8c0104c85531fc07041840216d60ff445cf53b273a46016c8ecefefb53550f8bafc79966f863a00000000000000000000000000000000010dac3e5885cc55f3e53b3fdd5d28b2d78ceeea2b669757a187de0ce3f28b586e451b119cdb7dc8b97d603f2bb700e2000000000000000000000000000000000712a9656fa95abf8c8c5d0d18a599c4cae3a0ae4bda12c0759ea60fe9f3b698d3c357edebb9f461d95762b1a24e787929b031b82dc8c9f4ea9524793b54207d4e13a548d73297f2aa6241aff57abfd0000000000000000000000000000000001889ef0e20d5ddbeeb4380b97ed7d4be97ef0def051d232598b2459a72845d97fa5c1264802ab18d76b15d8fbd25e55900000000000000000000000000000000135519fb1c21b215b1f982009db41b30d7af69a3fada207e0c915d01c8b1a22df3bf0dc0ad10020c3e4b88a41609e12a63d26ae92119c7b06d83d7e2922e06559b1740eae315c6623d3e543c9bf542580000000000000000000000000000000008726a32d489a5ea1c1b314dc4d400d995d0eb8b49d47e65a6ac8fd0e6ec0cda1c637ee314c0c5d1ad72cd3588ebf925000000000000000000000000000000001849697df83d625fc5cdd722c76faf542a42506fc3479d8127eee7af57611c7d6f33a7f9dba5d3c420fab33ec19305f57a02c61a7a75342ee7f0745886c0ea2a73c21500aef8078d21d20b7216c2990e000000000000000000000000000000001688c63e325569855bc2e51d668cef112b2479efa33519fe7f45eab89e275e2c4652cf8c2814f179935ccf1d24d8bd0f0000000000000000000000000000000011ebf7d4984237ac0173807f31be64575e7cccb36ce94e666e8149b9c292ebdb68d30ed4ba68f8e00982ee7780b2567381b0c87102055dc2901826875d5e85a794befd93fccca2b9c0a1f70ef5610d83000000000000000000000000000000000bb6f731b345bb1319b9acab09c186449a51dad8b6526251bc58e958cfd933137067e6f778b019f131cc7b23e08a0706000000000000000000000000000000001979a4f3e444c5950d0e2d71f97e99578b3058a6e414dfca313b898c4e02787e6eed89a2d1b05f31cff4af1e12bbedc3ebf66fce49c6beb12737fe05e3adc0a51ecfa9144ccf6253088dd1a7a483de0700000000000000000000000000000000078cca0bfd6957f9aff9731b45fdbdbeca6691f6fe6bf0b7847859c77478037e14864b202b235953ac7da231367324c200000000000000000000000000000000096ddc8631aff282d14d1878ef6bc537159abe9dda5732d0b2fe3668e184049cc19e05fec4666a0df204182edb9b0b8a0305523dc79dc4b905e65587fbd095ed57aa42403d2df5dd489db8f50c99e9b6000000000000000000000000000000000b3a1dfe2d1b62538ed49648cb2a8a1d66bdc4f7a492eee59942ab810a306876a7d49e5ac4c6bb1613866c158ded993e000000000000000000000000000000001300956110f47ca8e2aacb30c948dfd046bf33f69bf54007d76373c5a66019454da45e3cf14ce2b9d53a50c9b4366aa3ac23d04ee3acc757aae6795532ce4c9f34534e506a4d843a26b052a040c796590000000000000000000000000000000007c00b3e7e50a860e99cdc92235f45a555c343304a067a71b6aaade016ef99bc50e3b2c5e3335d4bdacb816d3c765630000000000000000000000000000000000f8a45100cd8afcbb7c05c2d62bfedbf250d68d0fde0a1593cd2ed2f5f4278e1baa9e24625c263764e4347ed78cce6c88586d7ad8fc3e4fb42981a4415224c0d976ebe1c342e9bc1cd66d35168bae33d000000000000000000000000000000001517dd04b165c50d2b1ef2f470c821c080f604fe1a23f2fa5481f3a63e0f56e05c89c7403d4067a5f6e59d4a338d0b5c0000000000000000000000000000000007b6b1d032aadd51052f228d7e062e336bacda83bbce657678b5f9634174f0c3c4d0374e83b520a192783a8a5f3fb2116e7db0fbd2a7327c85054b4c0de9727dc0b051058f8bb4ecb1dcc7f825781712000000000000000000000000000000000475e66c9e4e434c4872b8537e0ab930165b39f41e04b208d74d3033e1d69dfb4b134ae3a9dc46347d30a6805508c0420000000000000000000000000000000019e585e1d9adf34a98a7cd38de35aa243d7853c19bc21747213c11240d5fa41ff3b21ae033dd664aaac8fa45354a470a85cc8d88273d4aa822f44a447cc22f5a58c420bcfe757a459772825619669a720000000000000000000000000000000002291ff240598e2c129ea12292e4a2fc86e03da9bd9fbbb8bddd6f25797003a4688ba2ed3bafd8dfcf0ddd44c3288c1e000000000000000000000000000000000d7541c9c54a95f3789ca7637348378f8956fd451c3266c8f1a34906bf1cf8e7499fcf8ad1f1a73dafcf71b86833ff3b5b6e462d809f8bf1a62f276dcb27e42d9aa0ce33fc4e149e87181aca70a4ccc6", + "Expected": "000000000000000000000000000000000ed96265e66875001ebbe888571ded16799d0bf5a6bad0abaca75b94bebf3023487a29fbe26a68f1cc90485df379845d0000000000000000000000000000000001be40cb29d8b722f91515f7e18372f7a0f77bc3ef2852c59e7533aeb67cc4cc4aab0b8e87f9a4982806124462ae94ec", + "Name": "matter_g1_multiexp_4", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000018d31bd5a7e94ceb18d803969a2001c6eb3bfbcf82c27e88ca60d4c46807d12f116ca71c67d27270c2332205a4ea11bb0000000000000000000000000000000010b6db11d4fc3a2b449b8fd189d2e4ed4591bf4258d7b92b3eb152048cb3a3eecb87782691e9b954377fd1f34b38cb0d535b53ab5f1c596eb966f57867e021d0f3b099e17bf384479c959794b17d6a4b00000000000000000000000000000000190f4dc14439eccc46d46c5c9b15eeba0bbf2dbca11af4183408afdb15c7bfa26f107cf5fda0c1e0236aab95728eac2e000000000000000000000000000000000c47feeb1a1d2891d986b1660810859c1bba427d43a69b4e5ddeaf77116418138bfc2b7b4aa4c0cc6df10bd116721d506e0512ecbc5a1b02ab19bc9bee4d3d9c721278e07b7a6e389c4d6443232a403500000000000000000000000000000000021203675e0ae188ec782160e21492a6ee39fa97d922c1ef9bbfd79b82b3fad54fab11ba633fb8f02cf92249d85d9d8000000000000000000000000000000000062783335b87300c97b38e03e5b1318d15a499b29a473c187f930bf34bc1214b4d822725678cbde978c7b5ae6d4bad51a79fd15e80b694122dddb01f836460b3eff99e61ea6309d6b395c94fb5a43dff000000000000000000000000000000000e4979375cd880e26d00461de629bac880c12e24ede4a7c702f151c34a728a69a021e37b6a1af520a5f47d3a33f8c8a80000000000000000000000000000000013b5317e3ff7540048b19ceebd47c15538d7eb3bf402823b9c348c464afb1000ce0f7ea4c1cb668af5c8cbf77e6a9251bd012914a96253926fdaabec06944ffcdb4637a05e3e78a9bcf1b21b68b9dd9b0000000000000000000000000000000017f16cffb737dadd52b3c5be258733dc47301474b7351c8dcb8ddb4c519018be08b64efea3336f2b6cfa78e0669dccf9000000000000000000000000000000000ae10eb4f791aa31e5bd7b6c4d68b04c6744262d8f5e9469b3987b101ff5a3066794e05694a9167b7050c3944b6d84f6a300c7e1041d94df0e0201e1135fa6eafc98bd33b2dfbe4c59b546a52538c07d00000000000000000000000000000000062168f0bfd29c44074430158708a1e3b6808bae633ce9506b32eb9124db1a0668d83f2076adffb568ccf289a61685420000000000000000000000000000000016aead8bd8c4d5ddc444e15bc83e8f14d377d5e8d756a0255f1387506b9a9add69592241dbd9cab95474d55ac473886233e9cdb10fc117afb17803b61a2bca7de1d190a325639eb23743f51f28294b33000000000000000000000000000000000c60b948942652a8214d8776b77a6c559ca77eb3a537b0a9abadc3058eac8c1d7840f091acd6c0056d5a71468a2b1ceb0000000000000000000000000000000019049c394e547b9b714b5969adcf068b381def6af2b27d1d361d06e9576273a8febb5bf94b5061ccec7afdb5642c0ae8c48b98edd9c229037751d02e58f3d4234d9a3b0ad9ae4947ae14beebb274746f0000000000000000000000000000000013fe38343072af8ef1d8247c3d46b4fd190086ceddfeb767787031368da6a6a6ae849cfc26a24ead499338e37fa337e30000000000000000000000000000000009f7d7b21882455e9f1f24ea120f3eb69f739c1320c37eb2b17e0a271cb03ac6e2b0c55d3518548a005f28b5748b7f594228758d2cf8105f2ef11d83018157a3119a44874dc34d5f0bddb533f50df52c0000000000000000000000000000000018c6df81d810deaac0b143edf79956c92af7941f7b279db345f838bd583177912fc2eb367616ae165e261014a4d7b1b900000000000000000000000000000000146696840e8e988d0eab90ea935dd8b5f1272bbb81eb524e523c57d34ad7c5f0f3b721566f51dac4774826b84cc1c82fa417c96f0cf4355a78513c77cdc676a7b09125802c8045756da867e0025a36f1000000000000000000000000000000000c6b634d90c2664b9fa4ccbca35913d23696825350e21f0a6dd5e9abb17497a0a499e1b7b928a57ba8c730158f63b75d0000000000000000000000000000000009d569f05e69a38231d0f636e1ef040af059a00db4ff09bd2ad82b7e04cc041a33603c2eb9b148e3b1412bdef9740ab446561328b7689b0a89014823537cf9eeaca6ea5c56a3e58d2abfc2ee455dfccb0000000000000000000000000000000018129b2f00be24717c906d215beaaa136758aa1730bd0bbe9c0de9b3cbb3c0ea47911817fa322b907cc6fc720cabde05000000000000000000000000000000000e8b0f968ccb230517ef8980be559f410a2c4035a1101e6796d4f7a5ee5c93a19c111d38930bd5bca69405fc35fea7c2cf6c3fcd4b9e6b72853934b306a078b1f2fb17879db4a0a93d484abbc2b746cf000000000000000000000000000000001667fdc9b89d12fb0704fdec910cab1b51ac04219ef6e50f996688b2ceb26dca0e9e8594c5b81fca2e8fc2c8d8fa9a4700000000000000000000000000000000193118d1f237c68a8a0961fb220c0fd6a08853908a039dd57f8ed334063e5316bf83e8c3c3f44420734abbd7ddda31a6f6787b565e8d71be6fdb0c97c4659389c800a2047f668b366214adc716f402d5000000000000000000000000000000000217a4c563d730ef545e452038813301933ccc6638321ee5e217dad0be2e3ddc855a14054d0d72b6bcc692a5fb1ac7300000000000000000000000000000000007025f1c4a5f85a9c1587d4d4a2e620d83d60568343940ffd85e6b1e4fb0f0f53bb08c4f48bf6f45a7dbc3722ecc951e40ed91f6ceb2ccf87e4106a16227a3cd7b2821b4f3a6e629001f78ba1aa7346e0000000000000000000000000000000009ec00ea2da59d937d3154d86dbed2957667253401bce9de80e0ffe6df32f36b06404b9e3af08e912a0b4ef091f93efb000000000000000000000000000000000dd8d1bd66f4accbc9d0c7dabef7af72f51c67a0d61384647533ad92bba44a312f0be0fa52163176f1aff4e64c00aefbae8ddfcdb4748981acb9b2037c017174a140f2457fb0148fe807fd194a9f7be50000000000000000000000000000000014153e01c9e495c5c01c82b3cad9eaf20cf78369ccbabf57fb160ded309cbd1caea3d3df38a7ea5490c67f168e9acec0000000000000000000000000000000001648030be79658c134e016a211d311841988065957b35e9bc1580fb6e05e291e747b7a960a50e26a2a3c0cd1634c35851268803aeb58a2d57fc797358fb456d5cf96afecb1ee0d2b90782aa0d652b8c0000000000000000000000000000000001555535228eb9a24f460df9894d59aa06fc848a8bf8d6c3b51653b1d85734b3c5a2bece161309bd478d356fa198d579500000000000000000000000000000000144401f7eb69f6321eae8dad39dbe2cf4ae58e455474701dd9f1b62c85c7536813e84eb4f9def511eb62e5194288728bf9a8a4e5c65973b785c1e2637937de239bb0fde34b786dceea66f6bb12eb4169", + "Expected": "0000000000000000000000000000000008644b6d6adf9d5b6b50d4759363901ea94218881fac2006ea391c41fed2a94645eeb3359df803d740710f0f7842b985000000000000000000000000000000001168ff1897eb699e475b8ca2930ae9ccff139d534c7cc606c7bafec0ed23a6e55c6ddb1efbb1b5f75044d0a7e122d204", + "Name": "matter_g1_multiexp_5", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000b767f399e4ebea34fd6b6b7f32a77f4a36841a12fc79e68910a963175d28cb634eeb8dc6e0533c662223c36b728cce2000000000000000000000000000000000cb3827fd6ac2c84f24f64789adac53439b4eba89409e12fbca0917faa6b7109aa831d16ca03191a124738228095ed65070e7e2ae2751a1f71962726a31f77553c2da38f4fecda435b6e5459d5e833b400000000000000000000000000000000150b75e9e9c03ada40b607f3d648bd6c40269aba3a1a992986dc005c9fde80bb1605266add0819641a0ca702d67bceed00000000000000000000000000000000083b43df032654f2dce90c8049ae4872a39f9cd860f08512930f43898e0f1e5625a5620818788797f3ca68134bc27d22d16aa883a20307f5436354bab32b4633e83178f33626af3edb14f82724b8e125000000000000000000000000000000000cba419694214e95a3605a9b748854d16c8e6e1ee151c907487d8189acfac1361b790a5e78f43593152027295adf8df400000000000000000000000000000000110813ff6e0ddf3427e2a514d3f0bfbadcaf9dbf039e0f93fb9643d1e62bc2469fe84cd9ff0d585bdd1037255bbe5485041390a2209b80f7c64d14965cc2f515d5fbdf37953f75c4a0203bf0d9fb674b000000000000000000000000000000000106df8eba767e90cce0eabdaacc24d8e226c6865012ef8cb1460de5a319d443fdc6b4f4e58fb668943e0528b1809da10000000000000000000000000000000019789f464c95c179af18704c0b67b881991880f75ee7b03b9feafa3eafcd0f7d30a17fdd9cf439ff7fe683adca2083b57cf23dee8d95d94046678f3bdb4b0ea3d4e3a1a2f07f582e2a98ad6eb7562cbf00000000000000000000000000000000107e1fea76b5f2be2d12e11082fe690f01bfe6cefe22ce67de968e410ef51a6192b5b28a89f222db7e5b5fd5b8bc7c4000000000000000000000000000000000014028a700cbde8bce295c564dfbd73294f9bb65db3db9d38312cdc31410ceaf7151ff5d9420de2a5bc8f0d609893c0612adc8edb64db5bf0ed6724f3b54140ed6c81ca65ef9d1b38c8bca6a62bfd3c6000000000000000000000000000000000a57058bc228914bbb3e3e8f6a73842533432e0cf226cc02990b9b99a74b0acbad498036d8fb72a163590c75b6041d060000000000000000000000000000000016d275fe8c7e37058f287e1646c28ad1b4a675c0eef9671cf95dfa25617e2f2d515b2fbc04cfdffd5d487b255dfca245d1535bfcd68e8136808edf89967fbbf76b7f58d1a8ac95ebd4944b9e440f20b20000000000000000000000000000000016b6ecca57c78d6595e6b55b9360bd946b2f0061b98d931d82b03ed747998285e093c978015f0b775867ad0d8b4a1f82000000000000000000000000000000000b584f6f00bbcb2432b6cfbd4f6c88e228658887b5278e461ede804fc8a65dc6c997de30efc65b4f43e3d96717b938644c576996d90abde581afb58903cde4b9443eeb65e21b0d68c578e04c8f28f3d3000000000000000000000000000000000d1eac060ddc0a327396051c8c4dcccb77d11da05678d0720dec020d8aa29cb8ac959184417267cd7386feb1c81146a70000000000000000000000000000000003f8b5667ee4707958ecb93a1772849d5d8a4d42a2367ca058b160dbafa8ac0b98d5ea216fd18130237a1f17ce905feb3c558cc615b1c61c9a42b8b0ab4668ffcfc9e95bbe958e72e7a5500058e6b0bd00000000000000000000000000000000180152247144900b015c3db2d8b26d45a57930a5ca988c1fbf74b63b48afa149347a343f3fc6b1f31ddd6de079391efa000000000000000000000000000000000b6f3ae16d2a580ae06634455302db85fa94d71def14c84cbacc5ef98335d6d87faacff7a9bc14dea342a6a80d9bdfd661301b4957a468e2817db5914ff102bc96460a2c5c15e78bd42884b1223fa71a000000000000000000000000000000001918c4f95a0d0931ac3f254cd61c10cadce5cb9e1ef352edc8e5944c8aa8ecd90c403ed764ef42f646c7ec5e3126a140000000000000000000000000000000000ed644cd065411c63c7d054a57344e7a909e1d0a6b414bccbd356f15d16fc1b42c681cb6b36b143e91b31866387fa94395cd2686d24a5bdda0bcb118a2c0eb5ccfe411ec452e1beb3adbda7e93ea367c00000000000000000000000000000000070dfa1dda5ba02e94b29a63f8eb571ed7e8b0d037a0203af9a8350dacec092be1bfe33f4134b2afac77b9a36f95208000000000000000000000000000000000019e11a80ce3f9b3321cc6fd1ea2b314bf0c71d0dde80cd5b4de5f0d974597f57036613829dc777a6f6ecd6f9bef2f85fb81d555d1e2df92cdb487a888fbedad976dce54b5c46a39893edeac21a12d6e000000000000000000000000000000000584b7ea99ce0398473167289d34314c60ba913338b0bb690cfbb013496d24854863237a4d716437dc6ae33326240bd800000000000000000000000000000000065964a064e4da56471c9aed383e6eb38b58b9110a2cbf991d6dee869d2f1307cf7273d203d941ead90ed67c923dfcd5bfeed84bd95fb955d1b1045c059ffd051324dc8966e504164e54f76f02eb1b860000000000000000000000000000000007d6061bdf40745ef7573917e0e19f240b6e917f7cd4c47e01969b9afdc6af4e3c93e0f1dc2d15790bc2e6f182c01f680000000000000000000000000000000014625d3f2825121a907b570e9aeececcf81137f40ca6d0c00d709ba9931e403c0c2ed262a8f4c2b24305dcd3185b81b0e3b308b95f6d496e6d5b910b6aabef8d9f868471653e8254ab4d49d593180d2500000000000000000000000000000000087b5d6595554184fee36be472a0ddb9ac7f9beb20817647fa9978b2e0c3549ece4f061b58054e9191ff3f120c12077b00000000000000000000000000000000168d8d995c1fd032ca7b0aef2ad5c37ef7c7cef8b61ab8fcb5ea2d449455bc75b1b85631fd2ff8f5ca4e5880f36905ded4ea92e0e776be341c8444d4040ec121a2847256c5c9bc918adb28618548b048000000000000000000000000000000000f44cda026dc5e30eb06f12307bd582b271ee695fa68fbff48674c0499dcc875d617471830958e31bcd2c883e97a9e590000000000000000000000000000000002977682ca8ca450df2ac3c3880b1235e0ad8436a36364d319903fe2ca2664e05a70840aaf2d62531cd8c4ba4bfae9124c07f5188e4c6270a7e9e2f551683c4f9dc943ffc7ec279d15816a7f4910b8d300000000000000000000000000000000107dd39f779801f608cceb4784134894d2d9aee37cf328bb764d8afcb6d1e0f1387b36bf5b7b335099849278eac44e8200000000000000000000000000000000045c985714b519061a9c8d8c9665b582abdc4116a48a70e0d3c4a7709568aaf011aa8ecb893ca483878404b3f8b22e41a819a0438efd7ec0c1e3eea07ba201af6a832fecec818adbb781ad0c23e81dae", + "Expected": "0000000000000000000000000000000005605f40a1116742ed53aaf7092715355ba8e41d5d49909f79ec9580955c4a9e696fa30df37e4044de4d23fa1c4121530000000000000000000000000000000015acbfdf914883d16918f980aedc2dfddc428ef8e9897776443ec3cb091f6cbeea31634ef5ed061792710d5d2c87b8b1", + "Name": "matter_g1_multiexp_6", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001696e814de192623543f822a22344258c8ef9b92c178c4bf2404b38f39151828bf518a868cde3db5cffb745f1bf0023900000000000000000000000000000000125bd1df30f4799271a9db03842f98ccb5a5c3acbe813b8324fefd06e3c8ec4e2c0be8c2d24328a2d1169bf6ea0ce46fb15af019ea2de662bf187930caea19d0aa07a74b49fa7d1819a539e06e4c69ff00000000000000000000000000000000138dc5c034135105c8899eeb61ab54a84cf02919e5650f34518f941aea5bbb6f9df3ee6bb2056d0b9e060158140f990a000000000000000000000000000000000eec8442c8656ebc4696ee13273b12f3e362862acc3b8ec6f2b53f58f74ea23b33c79fbbd2058ad205f4932db2e87ae9064a6af51c1d499c4c28556ad1255af7467bc750bf2db2842d626647bdb334610000000000000000000000000000000008f7f45310b5638221cfc9dece18010034c00b3cf170535008d60dc7ed6ff90bfe87e03d94e9a38201699f0742d8973500000000000000000000000000000000185b62a19864e21e1bef19fbbc21863c75f558bcbfa1b948bf939876188f4fbff5d5f4f756e0ec5348e194bb4f70706ca3daea5a083af43711fcb09282b66882ae5b5b8e1714e9186f33ac0dfe48b7ca0000000000000000000000000000000019269dcdf3772ae4969b68a0b4f87c5097aa8bcc9e6155638c3de94fc22b4965386be28e059bcea69f993cc388ea9a79000000000000000000000000000000000b95f44ad9f14cb5e3b9a338d0e4345153c4ad0d42aa00a4c12df117b89d9cf8bb556041d49f94b8f63108f03c56a449bd682acd154f6e16a583ca4968d28471653375ef79df078b17b2cd9634258dc10000000000000000000000000000000011c86d420b6d8820af8a3ef511d79aed7c82ee08df993a5ba479b29ef2f968919444a7c48a24ec33522e1206bb9ab784000000000000000000000000000000000f4a47f3f14a25108c2c9262466d14e3a8d1f21bd2d3d6f28f03f35bf23a4b5b494a7cafe6ed5f39195e07b1692bb6da562223d3fae1d303a01ee4642fb4cc70f21937ba7fe377260fe82262a8455a7700000000000000000000000000000000091d9fb6493f4441c6e57a5a58210a6b78e86f1a9d204094ba6fecf2c146522cf842219c900d7cb95366cf7e411ff4a00000000000000000000000000000000015254260fb67e88d0067ba7006a49814c74a5369837dc5279c0fd19c8826813c922793c96e0f708092158ac297a368ddaf1d0fdab6185e1c3f9f621ddc169ba92584db0b40b6ace7ed563eee0090629f00000000000000000000000000000000027910712cefec94f0fd4de6aa70ccc408e64d5de6b473086009c525fb6d058ea03bc99f7ab49cdbad3a42bc8ec0999d000000000000000000000000000000000c0b0bedbad83ebf6af4f5757035b8292fadae4bfbef9f3bfcadd21dd796d7e3ecdf9685ca6d4d649b2f0702a3280d40e910487c91f3839d5961f02a67f3b357206e406ba207dde969498e40d4a26e88000000000000000000000000000000000b0ae8987464ea0b77201d468db7256b135a5cebea92dddb3aff10e451568e714f1c418b6d53903b89bc71109180b8c20000000000000000000000000000000003050becb4625f8e3ab2cf13dd1eb8f7eefc7e14c16934b87661adbf0139631108d241bcb1fb24c5b989f6d424cac883396d32c2c9ef685120995d2244756bd45591618597306193422f3b5df4b075d2000000000000000000000000000000000dba43568347a96f26f2633d9fc0fb4610428a8d4992c2734b20928bf974bf642a5122995884cf11b76126ba66522c8c000000000000000000000000000000000b9bb25b0db32149736b671ceed44df71f36a33c15ed821f591098ecd873355cfb8a39fc7c7378a19d84a5b232227ab92087e21d775fbc2c20dda715e46c9c4970394e40e991c78ecc13a2a5d0b0f30f0000000000000000000000000000000018d46d1a9ec91cc7983b29ac83fe9101c0ca36276d40743d2a6010d574fe1c16ebd9d7f0c83cad5ec2b2f652d3e6cfa500000000000000000000000000000000185f6367fcfa70e7a005c1739c0d0a19b5ec8de766037ec92840e66e2e9db18ba2356676899763183222f9957f48f300f44043002a94560d725da2ac44f30cc5f14f52dff5671c6689efebd803b1df7a0000000000000000000000000000000016677511c781b2b97456c3059c19b3e12a865cc21ad71cf06979bee1a3128682a4a86f3e07cdbc9ff7b5aa7a9899653600000000000000000000000000000000006307c89ac36a88c6921c020d32530fb69338afbb33929e231fa704f0454d642c47a3b8d320b4266283a8571944d0558624c83d846ad2e53f3f8ff5ffd3fca8723e6cd431e89ca29a4d662e82004b600000000000000000000000000000000015a9b215eaed682e4704cd3b1265962ae0e24555a16612ac762040e1fb9b412eacec5130a6f6a31eb670806be7ed775f000000000000000000000000000000000f60035910c438c177a27e6141d0ddae706d3e852d61e37cf8bb2f03550feeefa7213545e3af5ea614c91b51bc2fb378b2b2a8a42887ca6dff5b5364d88962068496bee79cbe74de0e8a06209feb3832000000000000000000000000000000000077b7a4c4644b21ac3ef56db1163f7b2e07a817cfd9d4c6830a97d0ae0b620e0b235376d590162c378899ba12eadb5900000000000000000000000000000000022beafe4b4ab44434c9dabae45a395b5b8da15da2fc2e723c1b30b5efc95e880846844f27eb47dfae8657fa27ab64ef88ecb5976f63a38d7f3d8c8ec441b705563c5e3d899870ab5d2ff84467fffefb000000000000000000000000000000000324928100db98f5a1af039a8e1b63099214982f1729ba633b51166da97e861426bb91283b386ed4b465d791e63928ce00000000000000000000000000000000178823756c0facbd4b1cab22f346ea7d1dce0ab687263265350c9939d52abcb5a5000b3395f8268a38027410675e8baf951f4960d6614b098249eb9420077ea5ad11e38d1694f4df33719d1127338f440000000000000000000000000000000008828eea92c3245eea4d60ee385734d3237e4e346e52c5de8b24c82325819be6984da4f0c1ecfc6ded5d0539a6f1f1490000000000000000000000000000000017169bab8970f47a303d2487e3af707eddaf7c4453e9d2d6bbaf953e74947b5fd40663173edd55c0d6aad7884f69a0967056c7d93d8453be369831dc0575df6438db488780d518a53d19b8f5d22d506a000000000000000000000000000000000787474664b2803e78489de6c5d5f1938e784e552bca4c32196cfe121380aad591c9fe4d9230dbe976b3ed3b3044b8630000000000000000000000000000000000c026547c94cea37793fee439c359cbeb2b985a33559ab25d1b55773c24faaf4fe511fbf7df085bf5c1715c79469cc28aa982de1583c25307e9e2c8cf2469a0b1076c6be2fbf12caa8584f34988221a", + "Expected": "000000000000000000000000000000000a7153c6173dc27b6a241c046a2a9bc25b85c4621667d0a10550cf7a090a8fb914725201876a5bd2af09d4fefdede3890000000000000000000000000000000007aeec94a64ac629673f3be3cf660f471e3e928de0884300ca8271d42c92b965c86bfe76df61d0645e955f40cbe3751e", + "Name": "matter_g1_multiexp_7", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000015fec2d82f5286d2067b07d83cd1c131d3fe18628101c3e45caab07f3c775c97e1533836830959cd7e434fc3fc392203000000000000000000000000000000001050e1396a5053c902441cb33003d9c54e6b631a80e3c132dfd37805bfe87cc2ddc495200268fba0376c5fa071fad230a18ca15f0d931619363f5ee56bd7657b2298f228cae8d185c9d062910193e9c4000000000000000000000000000000000fbcd07180f265688329d72ca68cde644a580cc9d698e40f69380065110ff5a61149e4aa9f67056e0e1603bfb9b5b3ce0000000000000000000000000000000006f363a9addd63a59035cad90cd52213665069f540b6c6cb41cfff5711376885e3242b596d051a59f681941bafeca53eb54274927eb29fea0cdc464271c918826d5249b2180a52a5020480d1020c9795000000000000000000000000000000001164abfa75cb4d711ad811c4df430ecbd6329968ab003fa680d235ab34a9565e5c08add76cf412f132b54812671da7a900000000000000000000000000000000141c9858dd17dbb027dde22dd65f6a7cd38a1999eb7977cde87ad762425e364e1395851b1cdb41094551e530d891b0d15849bffc842c21277be88dfae0040c54b072ff526731947cbec0cfe963f2d0dd000000000000000000000000000000000b95d221c628a77bb75ee5942c9df4b700268c90c4e6330ab5533d13d59826c81aeef7621ef6145f48bef9607d280ad2000000000000000000000000000000000b2ae1b6f916d77c31e4421f8d0241201bdab5339f95eae0e9491b4da5e226f8eb3f754d40be3b446ad6d18f28158b08aeff769da1b62fde321d46c66f8ee7f2129446d805ab7f7bd586268de8f57c4300000000000000000000000000000000128989e92641f3c3a914c13e986aea1bad2c87a8c28cf156bbc68bcbb134b25cd672832f2a988f60d2ecaaa1b83159e50000000000000000000000000000000000106dc95373dfcc85d9de6b5b609554b67e8683f90ea13156c8318aa8de0a2355a721b3bd77a6329264ae671c05af4a52c9e56cfe957b924c9c0294e1c1f12474331c662c8e86288c97e6a8b8b5b2020000000000000000000000000000000009fd9fc9ecc0d1521696bfe7624360d11111523a4ee0e30432a468dbaf1c101691fa527aac5ab531be822ae914b0afad0000000000000000000000000000000016b317ad68ec471b0ad67be2c489c9f5bb0d8bb6b5ef909ea975cb17f5964564d5f1a61d32d60c457923e4680a218b9bdecec569d223c724d162250ed1d074ed9f4080aaae3f44b77df05292be48ebd9000000000000000000000000000000000b982f33980dea4d89b577c9f849f8b8d9cb0c7efec7e17284d45c855638fe9ab2e5bdc52ba79d06a9133f66bf0ea2b5000000000000000000000000000000000c252a2e2769d3250479091050133808a1b0fd20af2b41cdeebe7cfcf7e3a92b9ab17cdf4d370f9fc391981db76de39c915ac9453b831c41becd3c1f412cdf5379e9cd5c80bc6df92ecfc5005356d2aa000000000000000000000000000000001769e8b5fda96ef205750826f34fdda3587efddc86f69d37001c62938a90efc23a3ae150d223ef4bf3766ab7d86d80df0000000000000000000000000000000009ee24ab483300764bccba33b55b8889b084288ffda23d157f650df34125fd803624d88f2bd0c3c3ca51bcb57b9f4dcb58fa60bc7cff4edde18301af2348faa69ed4f31d437decb7d4fe51142d179e6000000000000000000000000000000000146001b68cd902fbb4548c3e7cfae9cf3c8916e462f1becb9918c8de42483ef65f418d6e93200e8ec95528928916bdb10000000000000000000000000000000008bef4996b8120613292dc76dcc77b07b24d4498d6bd35f5dfb80ad241ad97bd161cb2c5c96fb250b70f8aec1aee5b56c29be0b271d4e22d39e9e06db9e50845515880f30c5bfac80bca39a2d8d61ea00000000000000000000000000000000019d02e168efb5769416132b0457ee1ca74bd5737f9364623bb270e8218c96e71dc49403584aa0a7e6c15bf6948ddb956000000000000000000000000000000000510c0917796c7ef2e100c7656591d04c3c5968d688b36b93dd690b0a8ea55694157fead964b85a5eef1815cd5932819dc8c2e971a3a4b9909dcc5cc6a0de50286294ee15f441521e0f1d2c3ad3a76e9000000000000000000000000000000000dd05e53ee40f051037c88fd28364aba276c793047007a20f893d13222c35b24e14f6c74004c3d8070405621380553af00000000000000000000000000000000191d7f1863ab7bc4ad1ebab359499f4df75b8c7a58fae8fe7cca530c7a56e5ee1617b343765960ca4bdc0245ff997a9221c9ae0132a4886820115e71e280d33378a04344f635c769fffe91e89fa7ea470000000000000000000000000000000013320367c29a4f1527e8c0f3047f776d7c892d08988c402c55e90e84b07ed7f0932c3b5fd19f8d133aa839ebd90f6428000000000000000000000000000000000f8396d819d7aabefda680c8ad51c7f907911dc4da7c5fbb7e599e7f3b758c5e7c9e9ab4de1700f72f109d7206c1be0ee1067c01d5565d0f387516d9721f7f4e5253d5af8353db4a55500e20a95f3c96000000000000000000000000000000001413f6a4ec8b21a459a4aa33ea9d92614857df629ec16990939fbb8ab11fcc919a25a10423ded219ca5b94f71377dc2c0000000000000000000000000000000014a3320275a64ede5e1221c78b421c1e4474bd499263aa21e97af103d7cb62335faf4b85b5983c5865599b709e95efc4a23bf766a1e1c068e6e8e4b60391583ac197ade53caf0f8a43c53d1bae9f13e500000000000000000000000000000000057c3c7e4cf799d716483f1e8bd4e6ec91ad9566379683c54204ce46a0e5635fd9852b0a83328386643b2017b9b551f90000000000000000000000000000000010e3d5725beabfa7e4843eeb5bcbf6e7a54b4b82fd1768a3c276bba8fb7dd25dcca7e20e74231e2f7cdf0ff50cb9cf7c2c505d4fd8287a897e01517ddbd7d7ea9d26ae4f58fbca172e5265e2b62858b60000000000000000000000000000000009d85ce8e918ddbcc47494c4b194649fdbc8de31f5f3299ea4bec7c68ff56c7f6ae916c85118553b6a6634ef9b8820f50000000000000000000000000000000000c9a680e6389d447a4884b4e134a3e025f8679edcba56bf8ea2061a00e34d38c325319a8a5efb556fc2536886e225912908006c06ceb9188651c59d434988cb5b51a5a75772ba71875444c65ddf0f4f000000000000000000000000000000000f34c8793a9ec6c34c704159d18e385dc9a127e0a9b5f95667f58e68f5ddaa272f68f5fb55e105010fb656954f25927c000000000000000000000000000000000fa1d9379fbd273b05aaa8ef5397eae24cc14f83118b2584085312986c192d2c5e3a0fd8fe5c2d82be2ee5b006413a2be8e8724c80f3527de5f0b2b98ecdf0b8d0471e63c0763a89da8a21a70dbf8399", + "Expected": "000000000000000000000000000000001223d94bca6cb3225511b4e28797ddbf1b1e2d059c6f7c5e852331f381c578016671b5390dff3898f9048e5868b253de00000000000000000000000000000000093eb1c50064251cf043e7c7af7518b883a8f760deac99f6e10c3dc941fed718f2293ec2cecaba6d58060374bce11a8f", + "Name": "matter_g1_multiexp_8", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001429e7011c17bff6df1b3237a06bae78d427720af641d2614f32cfef8c537d5ae9315c0b179af0a114a486e2eff7bc470000000000000000000000000000000003b9caa69b5495dd33139d14146919f9344efe2416b665dc262bd09ab91f3f07d1fb5eaa3c3a94606e74ee747114f347e14282bc687a00264b4e4678ff238d5205f6b6fcc10040d9b4393e93f76297a80000000000000000000000000000000012b481abfcf8ecfcaed39a4277492641c420acb65ec809a7d55892091c7f76f82c02e7baf2a648cdd5cdac45113b11e90000000000000000000000000000000015d32649850a5c99a787ceb894a66b58066c9257dafc4a6cfad2887e7a19f8af69f8d1fa69258289e417954d064e63eb5307650d6cfc681508fc7b8dcb5291837582eba6588132f46ab8fba674a1f5af0000000000000000000000000000000006038134150b97e785f33b0accd0d1991c7b97aee1acf9bf671188f61a846a9603f2d3f56d2edc0564d1ea7967e112460000000000000000000000000000000019434ad4fe571da11e2de03c891d19ea2729f4bb7b7863ae0bb8f18b53852ad4dbbbe682da2c8568fbe96c6c9a7236dc7d6a25511ba63f0b7ebd2189cfc4c551083ac92b144e30dd81d27e59dd86e2260000000000000000000000000000000013786032ab493b5026cf23fdcc468ecc486cc8179c9510d99a503031d1fe39f9caedb2d42dcdfa17173e693e2344bd05000000000000000000000000000000000f1deaaefeedfac7f708092bbe3005be7c4b56499bdeb8fc742b72be7ffe4d8ca90e605502f1863d89a41ed794e06586eac8e5cf13de6db37982390c8b6b0474795f479584960748b7ffed881285e2df000000000000000000000000000000000aff14b235c3569586e67cf5113ac0ab32d442a1c07cd9e249149d719dbd64f8ec1b07c4241af135d3869eae05ddc0a40000000000000000000000000000000013d960e93447cf6df8bb48db45532d567dd2b0756dd674625657e5364f81b4bb94bf436b54bfe9afe8eb5f4bd1be90732c134652c27da0a0272b0783551ae44db6bf592ff299b48c50c550367d470b5b000000000000000000000000000000000f85e9736fd9d3f9a839f701b6d8a6724af55ea74d28f101f97229f4b406016e50f54a0b3d2087117f352bcc28b53d5e000000000000000000000000000000000b2717e98f9fca574ad9202bd76ff6e53c74c342d1b6049fe66310040217563a4e5df460f264769418cfdc443dc31e008dca9ff432bb483ad726bd20cf96b07ab6f07170a1449f0f1b50ddc6e1a02538000000000000000000000000000000000ed8e6113d657b2d3283e50e9d054e612793fcdebfc31c53ef4f417e63c76234900c627b7e8c433addbeb6a79bcc5d380000000000000000000000000000000012f0a3095ae16b5535192a932f188c62c3cf01d2184f8e299794bcba86d4573e423a0eda4e17b4b512c5e06367e470f6146433a0738ab1b044e059f49a8af8d85546d0e34eaa0edf2b2a6ee466c0def80000000000000000000000000000000002fa5630b261e07326fb51aa2bd897ab49e0b960f769e3207906a530fd759a53db8ae17fa79c8e8c889a923fb38888770000000000000000000000000000000013d49d032b888aeba7e652b200c91042f409a6a824d1aaa04bc402f94233385254a2d1f8605d15d04013ab0de9e40a94de0399ce1ed861c0ebce1d4e811ea0a3d87e21a54ae34e6b5e1284cbb9497368000000000000000000000000000000001495234b14a93a24881f3b4425dfd82b49aa1828746b06822097c8338da57db37ddc836a9abc46f7a0cd17ec08d36fef0000000000000000000000000000000013b868cdd5ed7bf90018873ae2ec84e4bc71d002483831ab7a4a19bf18feabaa210a729ebae606ea18ce16458e997497c2b034594fa53a0951e2116db1b063345fa42dc8c870e1146f1b00f626dbcfdf000000000000000000000000000000000f223490fde3ae0d7b94412b3aa86030e5d9dca805f6ab5b025ce8e9648aa02067fd29ab9a1915c2df7b2186f35a2c74000000000000000000000000000000000aa747ff7e24cf6d1dd2c4fe9db8c031b78830e98cab27cf765fd874fe6b7731c13af69559748c81f3915f9f3a6c63bac1e6d9c5f8911014f0f540211af5184d96fdfd47c03bf2d7bbbb3bf1a330017b00000000000000000000000000000000134f8ec87b5572c062f6f3b43ee896c2e019356214ad397f703a839d39215bec954f02d3f81e3442586ba9762bb9690e000000000000000000000000000000000218735ec0b5bf9b59dee7cfc70ec4c6f21aa129d604fffe824b7ed6b6346dc242757abbe98c19c02d5235da448e331d6df5a133d3332e1f79f41201f8cb2c8c8d4d1ab0f640c4de6bd6e34884a77aa2000000000000000000000000000000001510f39616d7f576980055d0547c603d882dbe85dd0b634577fae134f210736007345d035d815306db660de4a07fc24300000000000000000000000000000000064d356ad7bd2edcd3622b1fc225fe319f86b5f7da875cd57fe5adc5bdb6443c5b09d676950e2d069bd4303b8f9206928e7219a9d431c597fe9700d43da8b545072f5a27a9f1af99053ac0494087dca10000000000000000000000000000000014d4184d69d34b8e509f3fc7e7033d76b10ba913d6109bdf842be4c49cc0c29576adae2f75e6fa054bd989e26bda58170000000000000000000000000000000019d0b70eb45a353166bfaabcb661b46eb1b7d8a59a903cbf9e43ceb6ece492e78d7f1765922e981903153072a08bde098efb8a7a5e48d5f4a011a4aa0dbab22ede62c903414d005d507ea3d77bd47a6c00000000000000000000000000000000087bc015b995ff8a840fbbf23db2cdaa8bb2dcbc38e12b588bdc4186a77409fa2a4cd74347f568c5b516879b70552df9000000000000000000000000000000000b15f04955dc27d19ad2a97a99e0890e6d3ad17d29f6b30f866f8cb3ee7789038abcc24c63d4525860e64593af02e39f47f53e2c06664e1daffd7d9b114e12d4190d5d0fa2244d61a13da915c39b8d530000000000000000000000000000000013eb2ed1d78059beb34c3fce731d42ba28c485dbc74916e373424917d60bc8c402e331e8aa2fdf70360049740e670da7000000000000000000000000000000000eaf5b5e47a2312410035d87aba7196f3f0b65abfaac28ac80accc9d87a1115b7f175e59ea2394198a2876568986fbebfb109d9a0a7b62c7c452bdf0a2853c4bf65e5439fdc83aedec8c0bf73a16b5580000000000000000000000000000000012d7a2e92adfff3d37ad21dd26299188e25b628a9e9d7b54d2eb8a886e80de812a32db9816964f2c0ad25d9f0aa6ae9e000000000000000000000000000000000c7084afff475bdc0a4ec265a3cb3f87d862270b6263a47d869786495abdd4316f6f154b997224d3a895010ce04151c34b0a931b894fbe61115fcf52be51d44afdcb96c94117c75adffcd8729b0a699a", + "Expected": "0000000000000000000000000000000019c9d9833332c6dd40c200d53b30e92f1595c22568b31882e24b8fb17be41f4d2f9692ca1e63106c59ba574f8b0764c9000000000000000000000000000000001414165b510abdf0d4a32236cdbe51fe2b5c9a31942710a07bb5664592a3f1b5c821edea44bd7fe185cb53b11d6407df", + "Name": "matter_g1_multiexp_9", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000038e60d2dae22dee4dad0d9e0658741c13d165d3718c763270292602852625ac83c5ebc1a6d86c181686cd01a1891b520000000000000000000000000000000007299913b59e2d245fa489d92873b7d2bc8921191a34a0d7f6c5774757ea4eb3d667ff8f3e9293f0d2354ef03cb6592b68ce22e379ddb8352d12eb597c179c7089c6388542909876c69ee377b14054e7000000000000000000000000000000000b07454ff91e3f9707880c1713c69f8a44d70040b44d96ac74d196853c62f264ccbe6d9c8945905092d9bef665e45bf9000000000000000000000000000000000405c965e2e8cb5e85ef9e18927c7e86e63e7aeb49f45b3428089010f34eef9ff37eb005e6b86e20236dc870661dd68c61529338195b665f1b80c4b95b7c3a26a7229884be1f4be9d49e1274a9ec3f81000000000000000000000000000000000557c7f55246759b901e4e8478aac7b80d37edd5d6be057e5aeafe3d8da008e48c96c17ab1093a6a4fb39cbe9364fdff00000000000000000000000000000000158908f112d7cdcf867f1a5b05062b92972c2947be213ede3a7fed7a477fd57e69e1de82164f7cbd53a3f4f4bad551d744d740a72e6c8b5632314408022093618321c8c0a8cf2fcd9ebacbe43505a01c0000000000000000000000000000000001701edcc472ffbbf157b1f239968924bb91825754bd4fda9f13450162e82932b8f5f39e54ec5975dbe7dc744d6d676a0000000000000000000000000000000017d13c1f6d64af2a808c3ba20792af9ee9c626235ceb9ced3c7acb4bc864ba47e55e0945a430da47da1e87f015dc024724872a78e340ccb077259aae65d6c448fe6bfb64daf4e2b6ecce2cc9525e35a700000000000000000000000000000000011231262d0fcf5a4b92cc1ed62aa66a55be739eab1316219ed2bb8d3e939e25b840b75f914cdd3f07b3f57bbc07c23e0000000000000000000000000000000001eabe4a5782244ceaa57ea0b58ed1334dcb94e449b7fb905805cefb786e83af66ded006cadc651a7b2cb07c3e3fceb401a1d84826bf78f493417a06a800d58dba688800026638316fcf9ae534436fc000000000000000000000000000000000045bb823151b691e26b0e706b8abb248ecd87107a88c728e7a627a962aca7f85d4c88df949b3c53e2d32ef18f60675350000000000000000000000000000000003342b2d1a75300ae9ffbae66326936b19c7e59fc6f597ff09f2e5d50c1942f161dcbcbba00e4a46d87ab51074320132c5a3268a8ab5a12214b266aaa4eb562aa05dd19575a7f3ba2d549a25f1900cb800000000000000000000000000000000043d72d26ee669ae8e47eaa74199feb37d51f5c99151a8f854362469e5acb2c5f6d2c208e7d674efa189fb90275b835e0000000000000000000000000000000019e6f1b3137bdb49c534902abbf42893fd576a211b93c831dee90723c7daeecdceccd3eb981537d4fe729d6e48d70d6ae62a7b00d2be967df04ef56121c95c8736efa95e1faa0196e1f4485da82b3c3c000000000000000000000000000000000837b6a981e486865dc4d6d0c123230ced707e2518277cbfd0be747a8c9c76be6aff8b06df76f7c801fa34d11141354900000000000000000000000000000000011d745300b20c5ff1e607ef3a42ac31cc55e8be979b091aac0396748e607f00f30ff579321f2e660e90e8e5f9efd4f77a883bf845d1ed04e0664d814cf0b49cf8c3e8b8594ae5d2834c753851ed7803000000000000000000000000000000000740837b02d2923815914ee9cfad663eb7246ec8c56e632cdc2dce25b6e475dbb6a75ed2ca6790f5f83fd1a274832e8d00000000000000000000000000000000188034daa9801ea182b712da519f7524cbb9f641146bc0fbf77e72ecd066bd577672c1ccf28a2c4d3cb9854cb2b9e7c80f474e8f4051c4e91124c14895fe9e2516b315d805b79013caf830524fce888000000000000000000000000000000000014ddfffbffd0317ba7e248f648cbc98fac2be9f0cc31d6476f41527c25fe8d078207965eb2382ee1e0f08a38fbff7c10000000000000000000000000000000003e492f3667da69d44b35899f425af2ba51130aa6341bcc0d4d9646cc96b090061acece81ed16c7e75fa452818748b119b3a5790750825ab75ab7422f833c671b95c6c58619189db66a6215ce907381c0000000000000000000000000000000005107fd2b5b483173992b0f2f51dc24bdba94b5174c063b52c33a8cf84ce3adefe0efe08e6bf4de3e68189e495b39c6d000000000000000000000000000000000605e8540f1c7f5790c306643a68606581a16a60d33607064dad5572947c93f3846f66afae10a66cd33621c6a2dae30c6607a48ba3fa5c033a1ef90260ada14ee50c95e5167bf801ddbd3acb77c3b3880000000000000000000000000000000012eb811b231a07e27e997900be274f73720afe3b0626104a9d5aed39a3931595f2ad57cf6e8f12d5110cf38fc8e7f244000000000000000000000000000000000abf1b8abe848b91333b4bb226b81a33aff5b8f7af70108538a3c706da182476a42e0e5c2fcdf694c8a12f62a996c86c030db724eadd2f487d31dd4354b5c0321a7983aead21759807bd893217c4d4050000000000000000000000000000000009d2b5044a8fe22a957b6d1eb20454db2cff51e7ebb6357b3c6b95387b1fd810b94eab4aef4f0a0aec4e6a693903dab60000000000000000000000000000000012ccb794eb1174735b5f7700ef95ccb67691cd3673d601dbf6b2e2469521f1b2ed283f2f98a9cd601867de4640c9517988e71d0be8fd050f6dbb8b2fb3ae2a9e593bef7a5163255aabeb07282e8793e30000000000000000000000000000000003eb6e7ab6dbf66614ff5b55ed36243e1d9baa317f01aacbd7f3a015bddfd818c6764c0802e97a42063a18edd9dd091d0000000000000000000000000000000018571d50a947e56f63b26a4377678c838de7b315e655104eeee48b7d5e6f5ee5d876b3ebdebcbde4080e022cc88c995326989184bb87a586b8752733f9ce9ea06422c6a898f0f402cbcf760a7a21c95c000000000000000000000000000000000906d5a1691dcb7dfd5d78f0688e95de2e2f06cdc70f8760e43a562365939d3fa23ddaaddfd1ddfbd3bc9777783a7ab600000000000000000000000000000000168422a6171f5ae44b645b6b6e73011494dc75e98793db2424bab311990eb7730a9a45234afb78aeff7778503cf4e5a03d1dd9cc44b30a4623a4d14861688cb678bbb8b2f8ae3ba140f60e64c05514b10000000000000000000000000000000011c20d0c6140e0e11d3ffb8c28c6bd80ec495d057775f6dc331c98b0b0aba17568e1ba773771c703068dcc6747187767000000000000000000000000000000000f88fde780460bd75f46f593cf6fd0aa25ad14cccc061d9ae2cd8c20398f24e76ef614008efc9ffe1d1884df1122111b5639d80f55e24e05e3d943340e324f6738a593a915a6bddb40f01bf12f73daef", + "Expected": "00000000000000000000000000000000018ed322f140a351069f18d039ebded8630fd019e8c6c401dc760ec5cc6536bc2f52a6cd5400dca0caae95e4b9282967000000000000000000000000000000000b9666fbbe91ec8bd670b2a64571a34d689eac44c5b63a43f60da08df51b003d85c03f0eab3e2042b1175af3501de8b5", + "Name": "matter_g1_multiexp_10", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000b42381a83d4472a3a7a18d2ba5266bcca254fade1170c6f55d442aa2a7674008fb35c58d5a638280e0ff7531617a768000000000000000000000000000000000eb5de05b5cdf9f95c5a3ad30ce068d5491006640be4c7f02b7498963b5769d516efb9a117c60c1c5fb71617d42c977142fe1e5b3c0245e5cfaa1ee8dd8ccc4ea8878ce2272d152fd8b24032297ac01800000000000000000000000000000000163ee62f1ea9219b921ae7ed0f121426fe9fb8fc0056916c81ea9e713f1a16e3f2bec6ed0e3e552a7173f8dffcde82bb000000000000000000000000000000000f5fa0e4980d3d2b92e98e76e5d67815ce55858852f03ec7b8809b02d4b1e9e1a6c8b06bd481d9d153acc68378e779fa253bdc5565b6ebc219a75ab74dc5ffd304c94e67160389f87111899ac07a71b7000000000000000000000000000000000cfbefb41304008b0e7341451f13d65681f0726544f14fd1c0d02433d3c34a4769f1456960cfdb11b6bcf016b906228d0000000000000000000000000000000001adf387f4feeb3845b12449fd5294802ed30ae211d0837eff1b22c3fedf538ec7119c1fe69ed7d595f7c0fdcd54f684acbf64f93f6f85805517ddf0358ecfea1fd58a3666b8dd9d3773a28590fb8a13000000000000000000000000000000000d736d3b8b586e09d6ecb1ee2d7eb28bd68aec60234e90611da8f1e1aedebd9c74718d41a89186a4a5dcc3f7cc81e99e00000000000000000000000000000000000ec0e89da57affa4686494e8e0f5517f11532f6e294215bd060c370fc64c26e34ee1e2d77cf341226daf84791f5e3cd9d3f97893eb4f14f21f68110f612a444815fbf2f76b8399ba6045c8a44270df0000000000000000000000000000000008fef795f8bfb6de5feee020a9363adb1c26fb521439e405570b4e997f55af5783968b24d2e95144bcb6b38e4ef9497c0000000000000000000000000000000004d4e31720644e8828faeaeff38985ffa4fa2f7bdaa476b5c4d7eee81c89491eedd3f4262effe118a4c204eb555abfbd05fb554531f53b8cef8d93566df80878baa96f92bb54aec19445980b1a1f6c3400000000000000000000000000000000195f8fc4b1ca0c7041810b02bbc38b8bcd0711dccfd80de2b2f357f4a732e65492d57f455e99fc810d6f86eeab0ac101000000000000000000000000000000000e3010ed298656b91b5aa342f6be7250cf5504fc3aa26a2c7f46f90e852fd7799d96a85b25e6066b7d24794648a81331d79ba2c485f0aa0e35212fd7fecf970258903bd2427c4c8b97c2c425ee11909900000000000000000000000000000000192cc18dff89d9a94e6f0498419ceb9f21d70e42a1b9b64bea093d67075d499184d7b2106f74d31ccd1863beeb7be0a9000000000000000000000000000000000b80e940dce71be82106640d99c121dd21e99ba459f0dc8b1f11cdffaa0d8ab295b9711c23de1f4bc35120a89948b91a44c7017258bb979cc9bb8acbd3a3e62eac7aa152db46cd7398ef07edd031e4f6000000000000000000000000000000000b53f55edb182dd08e2c9d0ee43aa3d734143b54686295410f80086d3aebf6fc681d1150e808d684f47b0eb23fcaf629000000000000000000000000000000000d73442636f4d5dd1374cfc7ab29b995420995bee9808aec29ef7d1aac08c0ee51a0390330a863295af6129b7e8171d82583e821328ae90a7db16b20525228e8d915bc8d46a642cb0a06dfb64168cf1c0000000000000000000000000000000002bd8316507e6eded2034cf268b2b4660211e6bea2e82b3e3a0902bcda0f9ae9980b401f36178f681691ee7c10dc4ecf000000000000000000000000000000000e9af98fdbd02ef62ae90f1e87c4e7a8eb2089204b1c58dc6e59fa32d001c97f22740d8a13ccab23b5a8842b693504a8506f22d323a740553d6107e651c192c1dc6e0a0161a82351f125f08c77e53fdb000000000000000000000000000000000aef5a5d5b46d340fccdfad359b0499a5c62ff4e5d9b9d6f7a5fd6a97e96820b7fd226e7a2aabaea392869a40cd38e1d000000000000000000000000000000000865d32d825149d26b60969ca567ca85af5e280b835cf541b20b0a4db83309dd2b5700f802ed9106af73b912dcf9630b7f1bc0e1ebff8f935330c35573f9fc3b900606da9cca9a36b425977af47c7ca600000000000000000000000000000000153310de30b7a485753dd8443f8638c12b21083f6133a1c093648bcb566b33f73631c6fc558f32abeb0d6df8430e61a900000000000000000000000000000000005be397e9f77556ad952dba0540f46cbc7db910d5203cb976e168a7be3a3b8557c5f08d51cca9379552694a291d67fb4429b85fae16200da6eb8f62e95e027c24aa6ee2a145f6ef225139f29aaca29c000000000000000000000000000000000cc75210c78f2e7903b7c33379a6ab412e92f35de51a152cfd2f4a5d122f9e558b617d8a09670990b7f056e95eb058ab0000000000000000000000000000000000aee8eda7c1bedd39f97efc60af110e64662b9990257beff15ef5e7856e5ea388df058ed8aa6dd93cf5a81ba48cb88854a852baf21df9f4ec8d711a48e6ffb36be8c09c8c60eaa090876236b2eae37a000000000000000000000000000000000f396976e55dc0c46fc4543a8dbf690b8da7b6010a03e04c9010f01abe1b3beab8870be0b6a2c6d6afdf85c6fd38d8b70000000000000000000000000000000006c60eeaa2d94b571df8a6291c2b12b2ce9f17f414264e4af2a006d6aef2d70436ef0978139751d4ccafce200f16f06113814a3c6386b19f7b93c2c4e0eb1568e8bd3f0012a1ae1357b127c33808aa04000000000000000000000000000000000543f8d9faa2b3cac2518f1462c297595ca10d8415143c8ff3feecfa58b648d0dd0c25156287b2f29f3b6f9a60f02701000000000000000000000000000000000be673141c496cdeab5ba8604e081ed3006828c7c877d8990efd29798c1ceae3093e052f1f928fac0c5cf84174283844aba0fb0440b2461ef64af6ec5f15db381714fce1da6e03ca962cfc94bba26d74000000000000000000000000000000001342f79c96ba0a29de9a77cc2e10314bf2e15a7d192a90af9c025e2f23ff30fe49cf239b180cfb6f8c35f95c115777390000000000000000000000000000000011f0bfb11be253b3680817af2b929de9ccf06dc574d17cf6680643b87e5fadd06b54224f155c1393c870c2dd01d6bb07c01749cac36dbbdba5662687fd1ea5391ef9d0bbd24e05bb5904a20fa6a1e11e00000000000000000000000000000000183eab3c2a127818862c6cb42bfbc9d59c51043dcc28c68d3fea08331323c9dd50cc34a4ef66a97f98684a5d9a982a1d000000000000000000000000000000000228f8f774bb68f966f3ffab5d0928a59707d6fb4f6ca84fed831a8212f71085cdc27b1d52909bdc005b3250f26cff3b9680fbd6e6c7b1b14b000d3d18bf93242c74662ef108d711d85d8d442e415ffd", + "Expected": "0000000000000000000000000000000017ddd94df17d52e842abacf3467f4461e345cbb680ae624f98c6885e40b17940bc240da17ed0a1a45f13f2ce4ab8dc100000000000000000000000000000000005ea5144aa5d5393b98db4d23477011638dba465a542dc28691ee2807ffc08413938ffb74e16c7afc507f85d76acbcd1", + "Name": "matter_g1_multiexp_11", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000023977b65312306b1a746b94bebbe79ccef0342ce833684a273d8baf74e0ee71104d6c453acf02d0c4f3909144b1a3b700000000000000000000000000000000050494df74705eddbf97da56a21bd673e2b0d3a9cc157168b8b413a89359c9c48f09e756f8e6ecc67811d4bd8043bba91ddff10527bb64de6ee2e3ab4959ebef9e7a6964b7482f9fae396b2b9b0cff9e0000000000000000000000000000000015862e2e3cb73ed2ba6b0b69dd9fc4c308c0a79e5cca2d2a42fe94e9b029b22b5b6aefe0503798d78d4599dd5c201cd0000000000000000000000000000000000c49723dfa37fb1592722b14e6c75110cf2252ad5170131bb72fa35bc359470bbda292fc2a459dab89900eb251e848e12943fa2957d267019309f4fe5b6725379d893dcc270ff7f35b3811ad1d8d12b1000000000000000000000000000000000af2d03791884033b8293fb636b0c569d9b008b075c6c71ddd7b0c3f5e139a17e1fbb18144d1ecf491d2fc40b7369c0d000000000000000000000000000000000d680b707e32626219fba862cbb18e39e03a8b9ac78f7bde619049748f7f0e49cc0223f1111dfc1f5c851229e62a9cdc1551a3c2d0391fd8dedade892e8e2171e652d2a9b52f2288451c55f77fac788a000000000000000000000000000000000b442117cecac25834a442ef457061634d863875c10e1809a3b9464eef6760f074e06c046a74bfb34f4d16255cd4f62a0000000000000000000000000000000000febea79eb8102b2632b6fe3151d9d972d5dded2893a117a6cd7e2bb662f042131cf06d04ca5c88c8535155910f9e008eb2fa94a5c97c28d95008dd1fe60137b34c2e763292d1b86993c02790b8c91f000000000000000000000000000000000d355c97dcf055181b8c523bbdf7eabbf064159c15532bef1e1be56146d72c08eb5d6994a3be7d6f4a4ef204f0e6d8dd000000000000000000000000000000000cd6d4e6df1ef7cd5fcd360e8aac511a3aea1f3e29536c193f4c3a2ff0f3ca16ebec620cecddfa8f27732eacbea75500f72ae1def6c988f9242bff0e683b8d2a5c1aecfd6ebb9442131ec5b5b825d0f600000000000000000000000000000000072ff95f5cd9416eac2cd83781acf856a0bfa567a079bd3cc909eeaf5a3fb31090e3e2ccc3acd44b6b04b47b5b8609a7000000000000000000000000000000000b7a39ab3ec7de26c86eee5d8737c7ae7e5969b03457b7b7b5720e3492ce254a63e031fc477361606a24821830d27271331451748146f0564ab0d91b09db87e8a6ba8b14f8329bc041911616195f9fc0000000000000000000000000000000000886babc1acee93b5f96e4a0700805982657d15170c77468c77000f21978f0cc154a265de2f766d6f7f8600f378b219c0000000000000000000000000000000013cc47f0a1e5f7315e6ddb9003dbf901824e419854d234676e4a8593bc5ad4c15e8c59ee6985d0b729e7d095e9b7642416d298bf591bd927aee24a37c5ba508c3bc121f5150fcd1a70c1f27a79da7d73000000000000000000000000000000000567f08c96b8431a133cb284144f6ec8f7c68722f18ec257b4def0a18a754507eb477f405b8c256adb797f45ed2755050000000000000000000000000000000004945b59bc84df7b793dc759bc2a3352b3eecc5cd59bea7a9560c06ef25828ad2e9ccdc6b3beab7a71a702b829208b8556be810c3fa86e35bc935fc2b27971c9c41d03c8ab7b6c8869db90b6e0986ef4000000000000000000000000000000000584ae62e22e0c2fd733cf2093f7a1f3c763453cc34a7a7a4548d8fd43c95f13be06da4e41f257f6d38e6e6921ad0f6e000000000000000000000000000000000dc803ba6a45298075a8cf45939a61760de44d22407da6ac0d63939918daa6f78e8d0b7cd794256f992cc89b8622e737aea4445926775a6baffb4dbeb249dfe3b3e0c29f2a579927f540d8f6451553ef00000000000000000000000000000000090848e332eec39e026eac0e6416d1ecd5aee8b4d82712b6c113da1e7d38901470743af43bae951d4141592f6057caec00000000000000000000000000000000140f8aa557213d49097ef315a18ae7e62924a97c71139555baf08c70674031934b629a457f75bd801af579f9fe9395579ee0e58d08779add74b68dd75e82df172b719cb5a772b0bbb34d3401b9f212ea000000000000000000000000000000000e29d6fd73f56b4546358967d7f0080e6cad97531e3d672a91a6dd121f35cdf0f452dfee1ad98b7c832c2878b495f3c100000000000000000000000000000000050fe9818b36baa8ccef166247bc673baa8424e19a19b199ea5e9d0baf56fd68cb339fdf5d041b31545e28bb2b8fe32c773d07cb9d20744a2c3ac88082a8d6606acdc892666753793a2b8bb81116cc6d000000000000000000000000000000000c13e5062ec580886d09c87c7cc72f7f19227eca99b0092a7e9759672ed1405d21fbdc8985847fa1b57129ac40bb036b0000000000000000000000000000000007d6407d32f846088759be5369c5ab66d2f512f00c93eefaca86a86bf7b1e3ef39ab85fb6c317c28c4e331a19b927650f6bb1445e9146b117bd0c95b009fba670a5391874dd314cefc884bdb0a4eba6800000000000000000000000000000000112839aa4daa7b0d614dc6a555731cd4b595a0495f2a2f0f1a3b3fa1b603c36348e265145583e8bdfa8a2a26c1f822f1000000000000000000000000000000000383bcca42f2513ce42342f4bab5377ec276bf0f1910718c7203d450f15c5b6a3648a82e4cd1222109171030eaf05292d4158de4e23d793ba77c24a70f0ad07314927fff34361b0d74b25e8922512d7a0000000000000000000000000000000010aa255df04dde054fc069473dbbcde9c68dbd71048b195df2b23e5471e5cd39eab5658ce689ca09db80c72e099907120000000000000000000000000000000013cfb46746c9bd13aa88a24ef3097b35ee2302e76b19ed001baee8cbe5b19c2620043efeaf81697ce48af0717a1066eec629ef41d5a2ce49fd81930406f19e760a47074e159ce372dd67e7ea46ad706b000000000000000000000000000000001888735aecb7125b08f2a840957887fb5be0517788a8931fdb8d280579776c5ad70e6454303ba23908bc6fb864a4ea290000000000000000000000000000000019479631b9c711f700ff2353aac97cd0ddbf14669cc046e686ef19ff0bea0aa74b4bf771882f7226de0d4fe356301912c718651715ab786b4855092ed21be41b499b7824d0bcf68ad31b31ee4cb730d50000000000000000000000000000000003233c1edded239fd465f7f7833251b98ffed6180b56676bcbe2ed361438d26db671c03a6454a4fda34111e358eb2cb10000000000000000000000000000000003cc9768ad0576a34550b913a895e2687481c6adb3371bad5cc8f9792c61aec555a52bcb267c337649fa00293c9b4af3c685a2872c4980518fe60c61e2276ef53c007166f7eceb355b4cd533f42c00b7", + "Expected": "00000000000000000000000000000000117879988edc3cc57fe19ab04eee6f9e94a30811b809afe922d63bc3d785a3a581b69512180beb89402410a4d8abf6620000000000000000000000000000000000beda376a5f1499882c560961f8b0cfc44c712d6691677ea24db18b138af8a21a5a4fcb9cf5814473b0ef7c00719700", + "Name": "matter_g1_multiexp_12", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000bc83829ec8e98081abac2fa8e0572e819b570b2499d4cd1e6748f48c350c392f5d52c672dd0bbcdf1469414d7ce929c00000000000000000000000000000000007d1574eb65b391475b49857766c808fa95ac2a78755d8d740d2df90bfa9aab3dd5c850d536c9794f6cfa2f004b4550c067ecd54e9ef59996493f846ecca63bbd7ec28da586f0b8d41bfdc6d97a35cb00000000000000000000000000000000022e4ed74f98d69a9bb1037a307eed57210d3ca92648ca9c54546c7b57102558ab12f5d2bb46502ba3c07529f64b72b30000000000000000000000000000000005ea660c44a9d36696a899ed1bbef1d951656f2eae553f4f124ac9cee3d7de13556a7884ffc07e20d5afb7bdb9c6f1638b5112baca5e0f2bfb885c5041189612918d203a117d886bcb3b27df7e64d17d000000000000000000000000000000000f6f9411caaf7bbed9b05368ed8bbc35a0439a5c1ae417215d10adaab203aa0a607642aa8b94f4846add8f5f8db755530000000000000000000000000000000012eba1de04ecff3405596452a4f5830bc6c8af2ab0e84115a8a04a2cf60400eb741e8eda78ef733338494fd4e7b16f812db7ad39ec8129e9e9206bd46cec6a8ad3362ade1beaa97befe148f6c67a9c2b0000000000000000000000000000000009898acf9cacee1f5750d54798a4c31796fc471a17c9d2ddbd00262f5a82e3ca968c3e02334c29aeae9b16d8916def1600000000000000000000000000000000017f5a3907bc14b6cf182af2778c88704fc6b02d2b47bbbd6e40a448a89ad1455f868dba330452112973ab69489534ece2400a11d9a67041824b97a96f0ea9da8848e7990373655d76e8bd4eb84df5dc000000000000000000000000000000000e782486684a6c3fd7f5977fa40038e8a9ac0a8611e79c18ea5328248be9ad4d95c63ba9ce41d3b4d85701283369063f000000000000000000000000000000000a98e9f649d2431991dbad1cc7f4ea0c89a58bd7e75e4a5bf7d9a728943363777c1cf84bdb1853a976e4e66a6d3fa8cbaa2d17c409ade92566ddb3913806723d41067540a36a9c283bdacb273c5b258a000000000000000000000000000000001171bd468b4d40e77b8264e082cf7a168d88ec3c21adb6c33f215e82f5ff3d0d2314e0fb12d7ec93aca92532debde74500000000000000000000000000000000099bc823a44c54fd379798eed2559d95275b324481c248d452a02755e1b5a48a7b0694b637dce4c21ad7d73a63cef2a3e5e3d21862b64e09a0893ece646de60cd66aa483662125ffabc46cc52f1cdefa00000000000000000000000000000000190f9d82f079757ad752b17b419c63ca09e3c8a23d0f56b1e738dc8ff4d588a4a2360687679e51bd75615c18c49103c400000000000000000000000000000000191b91de53dc0807b537540e81d9219daee48ad27de9e5ab2980dcc09062b80dad2a0a9024c5b0465e04e6ea2b225d0249510ab1b7850badf58cacad67fe47135f6524f0d160f3013e8ff1c881e469e4000000000000000000000000000000000c8f48d3dacefba0e1719f74867b539a65d640d2372ad38bcfc43548f7ad3d8a04337878529119b9175068b511efb04c0000000000000000000000000000000003c7b5c11985fd7ff7c75e2cdd8670f75de655aa81f6b99206ed8a344f86ae85d2fb14bce434a25a5ee25c903c238341713aa69664a8c721cefa7d6dd3fe9f92432b4d350621d5297805fcabb21ff8c600000000000000000000000000000000055e115a8a7edec3a443354b381f584ba13a5802520c54b51ade1bfc7c93c96c7cd66254738929aea2e88edf2895d82f0000000000000000000000000000000001bdf3f4b489cc22c6f57a1eba23d3348c5567d0dd1cc82924873813b92a0d0b2b90727589028b9844d351e13c6e3868c040d8bf0a787346560fa3b100b2dd9adb3f7ee716b8103abdd9609363345ae400000000000000000000000000000000041fd1625afa48a446454d6613c17cc6a65b3ec8b8f2125c0eb7b8e5d07968397d43969a6579226f496d9b24dbb71b820000000000000000000000000000000006131c506f243b5ac40354f826ac1838839eee9f61301aabd88e499d40e57df3122edc8b36f0a8b16b72f9ac783efd3e17b811aeac4fb7d91abc655f8a4392176f9060346073c957ef903e25d10935a000000000000000000000000000000000113a08cd0728cb3bab3886681d8cd4e5f14b3a4a7979f9929ed4d8dc77de6a65f7bbbf8a282818ea3f21e6ea59ab1f5100000000000000000000000000000000032e95b26193c9768cc9967c9710c7695f57fce8a4e089f290526842963504cc8c99981bed3cc7d827eedcf686c813c3bd1f096026159218836a46b9801a4f0c43189324d20220aca777b826eaf25752000000000000000000000000000000000ac19ea5cb7169ffa2741bbef922e0ba307e2bff5eb67fbd2c1545bcfebb79948489605f3c6c072444093e996594c95700000000000000000000000000000000111c277e16440fc3f0cfe16bb81b927cf76553fad040c1825210fa145240abb0bfc8a40a016db15844b8830d4d725da3f221dedfc21098ff9a9507e493d0fdb1efa6029fcdab23a016515078c76f7627000000000000000000000000000000000906df246466ac720b1db9445902aeba8ff5c747133b037f29b33880b3f511621a0241fcc46adb0532682feb4e8819bb00000000000000000000000000000000145b356e384183788358353a69c49332ca137e9faf30bbcd7a67434a980c27630c3f21781a36fe73e82459318b59331bba5b30d1397bf28100f108b84e05107ddd6cae2e82f1973ce187e8c3a7d02f3e0000000000000000000000000000000003f2f02b7ab2d2165836349ef8f53e42d223f4f6a892e7b72db93362de3929fcbda5edc4606766fe26ddfda9d09b283b000000000000000000000000000000000feb10a6ba91dddb0829cd6b95a78958fd55cdb120a7237a2842df1a2007530775848c3976804824698a4370fb022bdc19aadc83d1db9140af303c0492d2b9bb9e2b53ddb62cd2132bdf8ef62aaed683000000000000000000000000000000001433eeb265f1d57027a80189806d071edb1f5ccb97da0b5e00dc75eb88304ef2eed287f5d74264245684a1677a23b3f5000000000000000000000000000000000be2d2b5fd307192ef8a0b2b4dc9970c112a236a71ee899a0a5147012a206a0274d34901594f54bdaae26f2552da481b87eb6fc40b00246910626ab66bfbac96ea09242d1d70496466e4d681942050700000000000000000000000000000000011b50012e0d92c0f74e3b6e83d60bf77e710dc03baeedc949c1af218bcb87ca1528a745aa819a5b615ac355dec360eed0000000000000000000000000000000013cd46e3cbe008dcec36e64285173b7d545359c23fea32d3a1fa2918c5c5d671a87d90791b70a740564c0f731fbb32013bb5926f36808c0024ea7388998b4cc8c6c48d32917f6456b39d514143c6eded", + "Expected": "000000000000000000000000000000000cd7a2b89d286a421808305db523aca962c3f253f6defcfee9b74bd7f00b3ca8521b520376659d584b03fc5dd736d3f800000000000000000000000000000000117b8b8a8e299cb0fe3eee45651069a21988a2421b1d349529cbaf7362425349148fa043581e5fd275cc94a4fce44732", + "Name": "matter_g1_multiexp_13", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000016b98dda34f703f90438f5c2624c1ccc870b18cf8eb964800ec97179f67f82c521b1cccb1b81ebd3484da1349e4c0cc3000000000000000000000000000000000c743850f15041ed9023ce296570036f96db4a510903a0e7971592348651b44afc0091c8f0d6e86bbed8bd3f6b28072af44b0204792359895b448bfe6ffaedc14d54a6d72be7a49718c0a933807a399d0000000000000000000000000000000007df1648d65d140c775f729e7739a807a7f430de0711671807a7154a8e5723a2b9137175d47bc319ca659faca10af23d00000000000000000000000000000000199ebb99b555fa438587b9badcf5d7858029e905b97229f1de4ecc1940ccac59503e0e1a99c9571d50ba39ac3619699bde25977e7426cd5652559626ff8b195ab7ec679de987a6a22a6a0e366759dea0000000000000000000000000000000000027b64caa979063b420cff77cd259e54bf86498f87e7297651f9bbad6087a8b4b704b27746db53f8869d080a22363c90000000000000000000000000000000003239455ad4ab885727a25b0cae5115d87ac9ccfd93120ffded5130ac683b3b2485fb358e3aca3b6cac4bb3da5b4210d2e7ae497b44f531fe203a599622954804c06d5348dc17eb1537e750006584b210000000000000000000000000000000002f14454852a72159581b8a931d863c65170fa9280cb811c697fd067a505910d17fcb71b27963c2a6a02264aa0e1fa04000000000000000000000000000000000303f0857d990e90e19a076d2d331f5eb7fbcf102dbf8d4cb29f159fa2277eb413c0c10c3b501cefd9ca581ca62876c5e073adfb5ab96730c53015a4ab6210a35a37b2331ff5123e00798c33e040a91300000000000000000000000000000000192b3fcf7dd2534f226ad51f40e7256064eb788e7c91b1155908fb752ed4e854fda44af13f0c681fcb818eb4202eb64100000000000000000000000000000000125b51b4cf8e9427db9baeee0417b02c2d296ec4adfd437667238ffe5137b85b40fca4fa705f81d0b4b6d788a8456f1fe6e752d40d411f1ee6e67f48109c9a059226b446601047a2189ab815a3fe13c400000000000000000000000000000000130798c851758638c03f90f9181814eba97c5f93de85a71bbcc360bc53e4491e8fea38ff8c94061cd5008b0333ff26af0000000000000000000000000000000014758dbfcbbf0e1c78fb3ad4945bd300a74f2555338a009d807e2cf0e5fe582729556bd3ecb79db131ed9a72c3362c37e657fda33cf4ed1aa89dbc19d58fbe3043acb5795dfb8c0cb97620f16f8f243500000000000000000000000000000000093318a1c189c8957c9736a56a4b3e8da13bc8a303303bbc106148a0a7f319e30f5dcd11787dcd3424255c7a02cd3e760000000000000000000000000000000015f0767a3a1e3c448ecbd4ac8c4c70db6daec95a1e4b3a69cb5dc10fb43f8ad030e360832f7726cb166e0fe5fad0c860c73458e18d6f832f362dec7c49140e6523ead045131a1b719b0c836c1ef13a79000000000000000000000000000000000c7143093aea0143c58e2c459472f44b6b759a3f036aefced481eef6fb3a1b2af72ae4cc4de06af2a8a99e27cf9cae140000000000000000000000000000000019f44d1120d82e50f7da3c1e87a47d3433152b7141e9085eb54e04f30f5931d067f9ad559cf5d092dbaece723e6a724138cb0a2b191f538b30187dc730a8c665bbfce8186883500baaa6c3242a0d14740000000000000000000000000000000012a171d46d2bbfab83d02e023f5edb18e353ea82174d1a1653952bbba234c7de4fd5ed212c81f795e8c7a0b81e37087a0000000000000000000000000000000015dd85eecde306a845917187c404cee066038a764beaca9a58b859873b06652800291506b4c995581866a3c2bd7f19618a27de64d41d13ab67c1f7b1a7390ab4dbba7d219dfeb31255f9401d5b3c62f800000000000000000000000000000000176e512a4122ef10ca1fe6626cd2c839d4c573bede92092e5ca55b0bb936de9b62297b2a598a033e9a7e49ba9aabb9190000000000000000000000000000000013bf0f4c0dee3c9298192748497803a906e4192333b1ca61deff010a63eb8e4cbd63c7bd5b5546540e71bcac6000eb5380030798960729d63db70b8bc3c0030e80d9b8ae766e3330128557e6c34442f600000000000000000000000000000000066bb65bbc3f8ed9cdd5cfcdb121274427ab7dff904551a60be48f8197c84400d54ec27ed25c2a09687f1067c10edae5000000000000000000000000000000000afe1e97e1dcee30959a6411328f0d69134bb4c3a0d5ac53b87f254593f7cecf3070eaa9e19de76ebc6e1052a41ccca00d32b6969af54dd345f42320ea96def3c6f4dfd4e22a82686b7a3c57a0df5250000000000000000000000000000000001439b3031d7272f92c7072c6b44dd3a1c328251d34e1fcafc5f864b7072086168fa6f398d6334fe7fc56d6fc0e776eb600000000000000000000000000000000090885199f56df470628357ad224e19c29dc435ac54b8c17a7df5cdd24c3fdfb136952063dcb446ffe271ab5775bbc51969848f1b8b36bd28967b762168edb451322e2f0c4b99b7f9112c9a66093fb3f0000000000000000000000000000000011a0c8f7d76a36e605f193efdb5f7899d7db5b89ab0603dd6184e69a7e51f0d7e12f466fbc917cc5b6dd6d4a0bac16c30000000000000000000000000000000015dfa17cdd22984bec570d2ca24a5ac373f6f174b66aed70a15ec892caaf92c73ad3d7ef11b2f4a0104df8ec5397f5e9957ee08a513c5e22bbec04722575a9b4f3a1343db0ae5beef4e66fbbe1ac90440000000000000000000000000000000004bfe701f6645589925b34c1117cf62752b4e242e38bf056ef36515338a5c3698f561d65b237123677d926c1616618ec0000000000000000000000000000000011892535443daffffce0867dee36b7bc711006bc0963e6a061066b889adcde877a8dd3661250b6bc48064ed9dea304168e0cf0f590f77d13819001916d2c58a654d0b9d3c47c842f2d649cb2570dc0d50000000000000000000000000000000017666cd38f1e7139fd032a79776301e4eef7fc22c144900c711f1568634d9712b2e3566bcfdd152faeef20b47cf6cf7100000000000000000000000000000000150c30df0eb5945ab96603b0f36120a4f697b6958a9929f6dd8d1b8a34a1d1d3f1a34bddf9ff7f1e105ca23ac34b6f7671a8c2a479dec43d644ec4113142e666bcefd6d729d4faccbc147effa836ddab00000000000000000000000000000000107f9378f695524614ba000d6fd1b72c5eafc4ee60c5ba36ddb72814936403fded547f8d15083186f7f5f5d94c1ce18300000000000000000000000000000000140bc17d86038d4fed0580582f55d90259b460ddaeb37a70063d09d83f5fb6c803f8b467927758cb7cc52a2a6f8a84ba2d2d59a7f138327a20263d6338d2a92fa5a2f741daefe9aa81d06f20a6fe3641", + "Expected": "00000000000000000000000000000000179ba87e1596396fb5cf88f91f56e3fd6f01dda6f95363be3365bd42960ed620b7648863524c22663bad20d128d22f4c0000000000000000000000000000000001ad84c4e62b0494bab4f2ec2931d2331d88502674a1bf58b765eeb022f3d6fbe8f8546818d965a8be79a94be86292c8", + "Name": "matter_g1_multiexp_14", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000007eefedc0360b258ca2bc9add8e23b9d535f35332e7a35952fd832d7fe3d448aac08a01073876a21914a501dbca513850000000000000000000000000000000016188049abc44154b244c6af4e115caa14a977efcdd524ad78e5dce010f2f48259708d14454630eabf2318bb271315007740a826d524fdb7969776bede5ada468a0115229152907cb2b050760c18c8e20000000000000000000000000000000010a19a7cae27e432b77c77d26653c6f17507413a5037621bdb096fa4f33e68dd86d5aa3b52fa54655730fd88415c3eea00000000000000000000000000000000031925aae4540280dd6d08fc53478fbf05b0ec784d04abd04c3a8dadb04ad9adebe87101c6401ebb4a808104b3d7e88fd226f56bf3935ea95d976fde5790ba0584e5bbc78b37279aed8e50389899b9e9000000000000000000000000000000000447e249cb49d64494fb1f1b18c94a44791fd8d4957bac13df1f992480f72a14c3aec517184700d87200092e866d60ee0000000000000000000000000000000018a12284086bf2f64297a65f6c8b55b4ff3b791372b88aed9085152e24b1214655a74a182e131d7023f949c8cd9602dbc133e1989ac82e4d1c9852a6c7156a34b05784a58231d59e3cc875ac5834d5c8000000000000000000000000000000000780d3f5c10ab7932e3e3b45c942d1ee2a12f28070674d9c666016d084613f3ffbcccfb576fb7779feb2d0e614106c990000000000000000000000000000000000ea320730367c89cf162305c69ad594d8730d71a910f53143770f50024bdbc40b7d2486b1eec63b1ac7dbaeb51ef9640fdae1b53f6442c4378774a981c90d282d5f8793feb2334470c873491e41740f00000000000000000000000000000000049ff517593107482da6805fe4ab49cfe9cf71c9a95eba00091511719eb76db98f71f089a701c6c136b398a40dccfee700000000000000000000000000000000038d1566f1057bb2da7813c39374b79149e598e1651dc3541a445264693495dea35a6515dd2173f7de43964dd5e8257d70f1de7cc5e6a2cf7dd4b6e60ada67ca47e7b9417bb5f599048fb0c9b2abf33d00000000000000000000000000000000016baae36e71ce87a6dd7136f7572788c256ef88cb73e550641f14a557828e06ad64f001fe78d69465fed92b67e8dec3000000000000000000000000000000000613a6b87249bfdfd01016ce920aaf902de85c066c2d64c866ca0a93950a1a971cc561560a4122d9a766e38f9dca9239ca82cffdf59b742a736ae9a6d36f7840c46c20c126ec054f47ad52a22948d721000000000000000000000000000000001921d310700ff4e2868a28dd29ae6e0216bc27ee9463cc8dd2823a1b4670abe973859e86719142525ae5c76e2df0bae0000000000000000000000000000000000b4b4952e96be92ba6c78037e529c197c9404cfb67af04f39d24045c742b34a700057b2cedb3193dad70e64944642c01fad69492cab4ec7eb89ed37f1e7fe898ff49ffac4ef2aeb75d9c6b544109a08f0000000000000000000000000000000001dae69033cf21e6e1618efba143426df1501250c82f214ecc9ccbf957e685d9831533cf7f747fc22309227aca1d1a2200000000000000000000000000000000114abe65155656679b89a11c7961435ea9f77fe2f957833dfb61b8538695e2569e509f0ee2c0bfff75f83d9399a3d49b5af71c9baaf54967683f8553f72abf789da465041ee5a92c9ce1ad562c91c4d700000000000000000000000000000000128e019ff92e7171d3c791bd4cf75b0f47c2a9d8722b4a8279f1178db6dddf8a4c00083a935168518a1c26a56b23624f0000000000000000000000000000000008d0c5f3300e73682f4756e6ff1d6722dde576beb587301ded34427d6935e59e76cc8a8cb0ea5f659db9ad5435851e53c7effc9a7fe773a420ca430c58bb94e7baf26b9a97b618a15e7a18b31e5914f1000000000000000000000000000000001110168c2dc1c2f0df0dc645970c0feb03bd644fdbe1576d5e5a8090282bcb81ac9be738d18e72a31ceeb5ba826b40290000000000000000000000000000000013fccd2429da394be698812af6c3288e89a26f0244327cd38bc85d5c3bb934004bfe24449534b7d271add7a279bdc8512d5a3d0370f4a58c21016d208609f1d3e7cdf43abdb85199bfc67dd12f589b8a000000000000000000000000000000000199b9c9772a8c1bb0c015c467098bd38b5f73e5d0b3f627c8279b8dc853fa2952faad01e7be353a2762b8144cc1614c000000000000000000000000000000000f781597005df947eaccca59939253b936d1ae84805ec27dde0dc707a4583af408672addb2eea607a14faec9dabe61ae3549b86ed3fb880269be22b9cb8be6f24385bb5e24bba81bce9fd5b72ce2ab710000000000000000000000000000000014bd5d22e4bd2f7b8df4add90446650fd83d72d531395fb35dfcff72eca0886ded935e7a0e3fc99a7dd07efa1ed60c3f00000000000000000000000000000000122cfac9ae5c98dd162576c92e9acb4582b9eb67117bfbf4074654fc8bc473793a7139995666447a7663f3af1446dc35c8f6dd56906fa13144dc87c31b53186b0683cad220ab2de89d2fb515bb269cbc000000000000000000000000000000000f67ef1eff6875abb96378e5a7b1602b5dc553554987589b9953c4401fefdcc5cd7b196a1a65cb3daaa13f9fdd703835000000000000000000000000000000000f58ef60be74af52c23662e6b405f1d5c359b2ce9d15b5e139460e10da0e31161fb52f529c7b406e52c6f600d5670f3c9ec934eddc44729d05f193ac927fbcb022288ffb2bc7d4f46d1bfcc7efacef940000000000000000000000000000000000b7dc680fbfff55bf0cf276a864f448d5a9feef303d2416e7d87d6d669456b951a8769026bbba545685e1f92277b182000000000000000000000000000000000c36a14d5693b0d9d91d831c0581d1f4ee801f86e5c32f10cc400f66b58f247594c30f0059b4ea79995d6f9d90b0009ebd211ec887635ca841c4608fd00bdc0f5fd0f6365dcdfd7d6f4c36f4b25b5b1b0000000000000000000000000000000014dd947a01add8294f97a84850e6dd11ed4a513e7656daac5b725cff501446e95e3b966492e028ec23fe1238b53d99ea0000000000000000000000000000000003d9726342018f802df12fc867998b6016743739a2a4f47e1f6f50992e4fe23a6bacfea0e7ed5be570eb8242ec4101ec10bce61d4e35770e7737636c0f9a664eefa948662d3d22d1f1708fa48d3043de0000000000000000000000000000000014182228dbd223cb5b601521608bd7f87659f86a7a01233d4158484024730925e3d841e05e07f2a330b9495fb028db6d0000000000000000000000000000000002e0ad163d40a56215a774751434d19ea17341f41701d41e521983ff753ed76c435c6e2b543510e47060edaaa06d29f665c86930c1d142985bf85ce70bbad170947e850e5c6ac7803fc45980dd37a57d", + "Expected": "000000000000000000000000000000001364f0b671bbcf69b3a101dd758ce54434d59fd053591cb744841ba2061bbe2be91cc9f2cbe1ec058119ec8a5e909024000000000000000000000000000000000cf5be1c16fd10ff97a154826067ab7cfd7b78ca5ad0a2e2117155f1ee126286019f8a1049b86095887e79ba67216a33", + "Name": "matter_g1_multiexp_15", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000010040f531866c4e6fdc255e2a7ebcea89ffc36d44e265d5129f8be44b07f00646a7810662723546ed158b2cef146c7120000000000000000000000000000000016d6a5e46b2067c29e11d00b6b6ae9f0987afb4e9357c1d223fb2962589c3527f94d4e01f2ce6a7c57f971756163e48108e559e394a9c1ff07a45bb3e022f9c212eea4ee5b77db1c5b93ce72c0512b790000000000000000000000000000000002b6e3a234119f0f06a2b049d952230da40590a84d241ff76483169428e787093ae88c4040c64f2f1e3aa5be2c37db3b000000000000000000000000000000000732aea9a2ac5612ac350b474d9d267dd1ffa822cead992d3eb411efcb6992d196d66868a0e1f89dd47da584d075d4f55e55826db8d12169a31ca27beec80554954f522b56f7994c62bdb527c2438d5d0000000000000000000000000000000014c3187e04024d719560e36b5a63228a685f085aa080c82244a3a704aa2ed68b219d1c699e49dc1fd648e904ae638e3d000000000000000000000000000000001911df5a9f709b8434856c14fe4111935156a984a5e8cc27081059840167c3daf468a290461bf6cbd2ea4fa21255d7c11362e8e39ec661cb3c5af64e0001cc94701194344a7404f1ecf7df0d5633eff9000000000000000000000000000000000216ba7fa8afa06136b054c11bbd978209017dc4d8c8a2b05fa717a97f4d88abd9efc1e9879de709b87d7de65c859b65000000000000000000000000000000001797c34bdde358ba5533d5bb531915545e3ba359ea1fd66d9dc2ce06f7cdb64684bf11e5bc02097f3b957957c986de1074d3d66cde7c4c8a4499708a0c6f7c4da458eb970b6ca87e23601c702365b6de0000000000000000000000000000000013343f0b79485528b8a5ca5e0780e8925ea7277970843ce3699046673a41c977dd0cbbc97273ed47a1a105a0017853340000000000000000000000000000000010f3232b511b8d529f91f1ab613af1e2443947fb2e29c4f98d1dbab1aeb965079f64281d0b10e58e26a4bc0577943873389e0d43f2006449fe2de506dcdba4cd0e6077e2228f7d8b6ec9d8a4129c494f0000000000000000000000000000000005aa017b9381423c9d00982fffb93a7cf9bceceaaf31895a17ce3a9bc42bc5b6f5c69679ebc91c9e5cdaf7651cf78621000000000000000000000000000000000c77e86d84377ceab757a0da9bcea401b3db29e8e577da793da0d5338eb471315315171ec4bab4e9dab36f4ec6d907a85f8dc332cb31e43bc2e551356cb8d1533c6e567d34622667e7e4e3ddef352f03000000000000000000000000000000001971e5758027516443fb373a8ba8cb98b78fd5d16b42a83becd2a9b06e8ca7d255fd687cdf10de7dfc6bee5cfd199b1f0000000000000000000000000000000013465b45ed2469c2dc6ef4b4b8ac90b9b30c793425093898203d3b13d76cf4b8e0836c6fe57e637a6eb08bffa3bb55250dc7052044251fd360538fa6d5dec9fcee53faf2f07de5d8df212d04f968a0b6000000000000000000000000000000000c14833dd82daba173eeb40c29912c0edacff741bc3ab03ae4911c334cf91d5832a8847d7e175934f61089f523b77fdc0000000000000000000000000000000013820819e27a27009ee44a5cf02e995bb317ee49b6068d2e9f4c5f072d233a6808d0feb61958e047f70b2bb1a5426319c579dd4f361fed9084d9c66a3ec4c6af5293710ba5299df3abc4cbaf5802b53600000000000000000000000000000000105a1323577a38bc9495090b4d023a9dfed8b510a9a6d755f7ad6af72eedf1c92e6a5172cf68608d8dac34242d1e0eb200000000000000000000000000000000147d889d919a58de8aad3b4735359201c47d8961a1dbd321061a81c67b1a05c6732782975445d9c1f2aed12b0b7306f469f0f3c3f516ae34fbecf45f4636c22acffbee765952b332c0f3d8cadb9c93f1000000000000000000000000000000001335049a2ed3629ca83f041e4ccedede286445e4b79f3afe225bbee6273e0cc84b32b91c54991dd072c54ecf0d6c538e00000000000000000000000000000000098220fab5661a40cf34782efcd62ede159c82dba8c6e9f032f7216b888ad85fca1031c4622547a03f14185b3eb6d0d576618f1954730111e572937cf0c9f7b3298a11d18cd890cb419f732c766bc6210000000000000000000000000000000018799254b6fe847f53e2892343dc77efa3717bccb3589b776584fcc9e934deb3b8fa4c1ac0709ce505ca4d1504ed822c0000000000000000000000000000000017b98c35564c9d67b77bfec8ce23310c93167a5f75a4680420e8d71d8851f4061d897fd86b52d4a8cdde391c5b21a63afbb9f2400ed1dec7ea63d2b26bb3e9c2acf70117e3026626f6f88a0787617788000000000000000000000000000000000499468c8da336124bb89285a81eb76fb05e4ac2bde68d2f78f1de8926109631ee3e33eeebf686c7f6b7b4d68d13d2fc0000000000000000000000000000000001ac43e7c6d46e88d88a195180df6a3a91b3aabbe54f88c8b39168ead4b9847a031561828b0076b9b94c8fc7cc0c4636a0170d7b7604b8951a95d49b6697e2d0cd2a41c3671d8f96e936cca911dd516d0000000000000000000000000000000006690b59efd7c3e7f9477cc35fc5e13a5dc7f485100ecde7771e7bbd9f79f72719cd45cc9e0e791b7b5dee6f0252c53d0000000000000000000000000000000008b6f82c8514f7804a1d75f347f08334064b81ff95765355550c53098e19a4a5fe59c6a9611f4795981047754a6304792c2afc06f19e627e9ec0edf1083823d30ac569346040965e1c92e0c15011c90b0000000000000000000000000000000000ca51cd2fbe8d015a2e80bb4a24f52abfe6b99b1fbf1b656d4398f76e8e73e7a441dcacb43a4bd0a1dd45df2ed03a4e0000000000000000000000000000000006269d0e0f77f3ac5af8f70905ddb323362ec5de91a1eb90bf3773457a2bc2d018942e58c04013b83a7764b6639ea87c141d0ff346e46a20c2498a74f910e9bb2d5d8530afc7ba47c3525861c9e8c59200000000000000000000000000000000122f6c35f7b1456952b56a5f90ef9066a191a4164d4b2f81965bf7318d485c725141576e5a1164c3c17a8bc387c9262800000000000000000000000000000000086bcc20a2f0f0afd4ce845243061e1c12eb238f2d3fd711000f259c31d826c2bb56617479139cd611d35b6548a438101d688a1aca2a837e0a353039294a9988a7111ac134a6a8a68e4f881e7486025c00000000000000000000000000000000008ee124fb457671b65c0f9f550ce1ef196c3bf13a5403a3a21a801cb1a335012b43cbdab33a1ace7f84a998a4322ae20000000000000000000000000000000005b0067f853d9dec4dee3b2834679b9145bba170f22b7e1dbbb6ca3dd98abe4f41673b283f9c43f2cc7ee2305b874a0e1b59c33ff02791031e7a9424c781ff17a209d132af06f5b825df363fbd902cd4", + "Expected": "0000000000000000000000000000000016dbe06af92533e96177581a7a349811e0a3d3826241c4ca047411d5b24c76dcb6849df7f4ca050286b2d84afd71ec9f0000000000000000000000000000000012dc4fc05526d6dd6da27b117294da4e9473a34699871b7bc9f02937a8308c57b5387a6fde0dd09e8a01702a8b97c4cd", + "Name": "matter_g1_multiexp_16", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001394f8d94cccdaf982b1c6a8080be6bbb65c9352a961cd5daf2f817a17bd8d5e3e086c6f54f6068691f3edc4378215350000000000000000000000000000000013560d0482e6ef2fc19cf274f85bc3d14236273dd8af86107839882dc26dbe897a7de90ab5457ca440498265bb59e59358fef5bc887b7caf72f2a533fe1455ae523841bd49b4adf16cfe87edc6f573eb000000000000000000000000000000000bfc36885481f9ea9aa275c1b4a774fd01476c6f956fe75b5f6e73199928b1928108658e35dad50b298307598582443a00000000000000000000000000000000161f833b58de4db4de0af0fd17ddf81ba20e4b6ca21dd80852cb992afce9857e6cf99cc580664a970e9c6928d13dffba73b243b83d44158a66eb6d31e7c4ae1f4b3ddbba81b2cf9a654ca7c4ea2147ad00000000000000000000000000000000042489a05aecc0fc139c0ef0c703860ed36f8bdf50e4c772487c0d27b46b395f6417ae34ee98290a40b3b765d5a41d430000000000000000000000000000000018fdc2c8ac7aa01ae6dbf84412de8a47c3c504f2abed060c63190265babf779384dd6e3330e91198f5bce5a103bdcd701ea87af09f6e62111c48993c408efd3db9ebe218ac68f61a461ad9ec1306873d0000000000000000000000000000000005a44b3af7b95c7869d74c7084d0e556a67b39090b7a62fe51fa833cee316044a26d4e383695ecd3bb1715d0693f2f1a00000000000000000000000000000000112fafd6d6f1da250d12817711bc999217d16d7a6a923b5e11cb91a333898fb27f7b89885567d33b39923d7a664960eca691b9635e38a46e2469811405ef6325ae7ef88a67c1d1c5b05806da329f27e000000000000000000000000000000000197317f509ddb9d536845443d7966314eca15f20cfcbf3ff2f8701d94974e35cc0957855e0085b3f85c7da512ea882910000000000000000000000000000000018b1ddc196607122be575ebc923dee96823fb4f8ed05fd8639b1af06ddff25398e67709809b642d4d9c21dd8ab6e65470d9a35f474325d0f065442805cab3beae4a186b252ebae54a567dec6695588f1000000000000000000000000000000000c7ed49a60aa90f074af9f7fb19f6e27ec4a83ce2ed77a44c70c8e0bec02318bbe44a212c505efed3550ab6a1ea2c6d50000000000000000000000000000000013c0a772ce2c97522607b1b05cd9a89e930b6371202b69eddd108237f1495eb1c6ca65549c5ab030cc4f7e3ff4492fe9c20e998acda67d406a238f16bc2b3066a6d69d2436577b8900a180e6a71b0a01000000000000000000000000000000000fd64797f2bdd429e6f5217858cb14d78b7054b178b74696b8bc8ec9f9ede70bd03c36c824a3f775ee2f8cd6be7e2ca2000000000000000000000000000000000f675a8a43da599a09ae2367240870636ed385eb280cc199fb7c4ee575f5e3c5fe0b302566cde70b956f3c2b20fdf09c6fb773cde356e2edac3afd2bf703b59161162dc1e915873ecf606dfc0e6efec500000000000000000000000000000000065856fe1dcbef934cef47b177ecb7df76cc8796624400d5c0518aa9438bcadf397234808d099bed89ab674560ffbb1800000000000000000000000000000000071b2ff64379ed3e20cda000602c3504616dd673aebbe7690e797d6428ecfbdb29f11138169f3462dffd319cad68b96ebffc1a58dd06752a2a77abab835d089599b4781ae51ab998ff3c5b68329068bf00000000000000000000000000000000094d6e0bae02b4e7541a27111092737e7b27fe742fd0400672953d8fd787482195a2cb59a91e8584be002976c3c3e9b8000000000000000000000000000000000c2146b68ef535ed9efbed7fd02ea5cf6ba8cc20ad8bce17c06e5d595282f6e7453e2cd267181e477f511cd4fd56e8b157f35cfd74f62fa39f919400f4d692855a4b4e9f91920e4306ebb2e772a484f40000000000000000000000000000000003925e9f1e24531f9f26547108671a6a0fcf58aa6ef2bcf9f4f64b659782b93187bdf2988029de9f51e5d41cbbc4744d000000000000000000000000000000001975210e2c8bbd2431288a42f9cf5d6bd6c6afa2eb05caebe740c0a1f680b9cced0f32f8f84e368563183b97aeb6e7ef2d1f3709700634653374fba5a94d69163ef616a72a63d462afd9f01c9ddba8400000000000000000000000000000000004a2ac3d53c193265889f6c3802d7c68b938ebb6298dbfa14d1a9f515647482c84ebbb3855686b544d4299554473f1d60000000000000000000000000000000003283688bec2b8ff2e34565f8e254d579f57f9c0fe0e8521129088099a5005dfa9d565d52a75a2b26148205dae83aa6a614ed9a08dfd406df00719d5eeacfb0a96413b608974fd0aa1d4c6176b968dc00000000000000000000000000000000001b82af64f984294882fef7e5ba880ed8b0a36a90a5e9680ddfc5d86e65aafc3899a7d63e2a420113ba29412a025a0970000000000000000000000000000000012b11a5bf0f7895e329c2c6bb3d1737aeb5fe9f32a96262d8268c74687a460c47a89e252e607032576e7b67f5ad655b87c1dd2e5e5f630fb1d07e8934dd3ab029917e7775e401c0bcf7e1fd83aef72840000000000000000000000000000000003ad0dbf936f79659ccab765a61633ebb648503a774e92b24967aa8f8e45c5e26f03acbc7984a45e089ce68c5566664c0000000000000000000000000000000011686f58262dca9399d95cf2828b50b216e1df251b61c77f952c21374bcdacd99d26891fe5f335afb7ec76ce7d95b43f64e9d16cb61f2bcdef30cf544d97e078fccb999b96a1da0eeaa0bf232f01995f000000000000000000000000000000000ddfea60c169079c0fb4b9c3ca539e43b7f184f31cfa2eeb942acd2a84b472597c83fb52544479f326bd1207b4e872f000000000000000000000000000000000102108e827cf4473ba1382a2fa8f3b904f20a40657784d54e3a91fcf2703dc6fbcfb7f4b0e04c3a53a24a6e14b5735f435bca9082d66c06761f702dd439faa4957caa70ce0343268787f41a2f4bc0cbf000000000000000000000000000000001286a578ce3829f289cb98aa41cb6bd7274aecbe15b5087d8c16d575fd991878b06c88f17fd4bd905c4576494ca9f8fe0000000000000000000000000000000018e3cffb0746cf70aa79053ac579c1adbb09ed5b6a8b5e7b84951460e551e9bb62f2c1968e37ba34f7633e60a5f1f2a97980eac6c8db86ef83748d10b210835e53baf8cc9f607915df272b6e28ac6b28000000000000000000000000000000000ad648d5e0a45c8208fb9b6adcb3c47cf0e20ca906c4fdb31e5c2f0678fa3ddb6e27848a39e8035cfd9eb91aeea824200000000000000000000000000000000005ea40be38d82e2b256bd5e26e71dc642e06145d94c1ca4fcfd6e63e2bbbd7b7aa153b498793e94ed1d89691195b4aa3a256ebae4b204b3888d7bd244bbff26431ab5890098870f13800bb3be3e842ca", + "Expected": "0000000000000000000000000000000013a9e1e306a5cfd461a1df4f2097f0beb079a845a959ca3a6d3e229198c75d29daeb5e7b65603397353cf800e0a10d820000000000000000000000000000000016532afaf2b6d884a5b593cb8dbc38b4e2bbe522ac69b745fe9938834d66e2393653e31b052a803f3f901abdcb352eae", + "Name": "matter_g1_multiexp_17", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000a187eff5afd944ea8731afffb4aefde4046b812b47e7cd99687ce40a5af90d6a4a2c7e2c9ce515a229e6c99ce46933a000000000000000000000000000000000121183879453793d954c99cbb007ff428c721d0e0b9cef192dbb177696ab9d575d3ade2cd56964428adfbdfbafba7505805f2e8013007c4f6d8abf441728eda8d742ea2f1df545f85d092f50ca8275c00000000000000000000000000000000196b029b6a808602b09dd4597db611f19bb911b3acb5dce08bad8676cae9910865355cca0a109bb8d7b60359da6d0544000000000000000000000000000000000cf045d01c1a6d6ae397b39833243ad3cc310be9220f71a248032e9325c7186ce3ea40fbcdae5258410e1a513b69713e502d777b25f3112ba2264022e2f28dfb6e5d5239ba097e9d815928be44b6a62a0000000000000000000000000000000000c6578ed0ccdfea63fe924d0a30c4aa7d65d9f85ea832733013c0ac225f039bd6f94b4acf634a01ac67b7165a810db8000000000000000000000000000000000624981245bedf55b95217691d9dfbc16d0d83476f8c09a46f9541d77c29ff978ded7fb7fed7272701e385e016647463e7d64b471cca34ab0c91f61ff26719c7186dfcdef13895d37ead407873736a74000000000000000000000000000000000a406d8da1910d9ae8e52ac70f1fbb85954ff7590863ba9f6e00861160f83defd24e99be31ec63489a483fa77d84ffaf00000000000000000000000000000000170bac083f0f6f4ff5edbacc5cedbdfa314de364e86486cac0e656d27e6a4880ea3f76ebe0f69927299bbe4a734e0482e5723630020fdb48e44adda735943c91ad7d1e12f3c32d823833eacfcc8b02ba000000000000000000000000000000000b8a583c24eba7a27a05bcc606a10a306ec07401ddb8de8e9bf206250ab7cc720903bd81a2c17a9e075ecf0ef99ad65a0000000000000000000000000000000006d5c7e9faf830ebd0154dc1c366b84445a85f0ebfc13b5339294752f4d1dc352e0e4204d9d64abed83e8297325de2556e9e37bd811b76133c12268d325ebbd6656e7ed718cd777458867dc98b1b3bc500000000000000000000000000000000122735cbd1927c40688662c740db5cb78425942985ea69c729061a6ba749c78d4fc3d894d07c285aea9ee104f59581690000000000000000000000000000000007c18425af769864f403c39ce3df4f07d4b7319342457d0dee30ce4bab013b754e2ab7492f2dbcd5bac2ec1ca2e0220f7d46516db284a3938e672ad3c6bd40313d77c5d643ffcc59e3f55ad983cdc0ed00000000000000000000000000000000039c8c0453627d13ca0e174f5a27525f8a0054ced2b9e7d92c0ba7bcf06c78c1e1632db35abe2a81f72b986934ade66300000000000000000000000000000000134876b42096d986e6004364e176e23f81637f8ffd3dd86097f480d25aca9ce3a96c9dc73b651106b4de307c002dad95586cf63c5e52b44aaa79cdda6dd6fa92c6fce11d867b2ff5a04c9e44e0b3930000000000000000000000000000000000032e727809658a52f60a973d32bf47bff5fc45404e6652facc1801d52188dc7db79ac1bff415a6c3e49e417f205422c7000000000000000000000000000000000c83d3e5ed78c1304f42afcc0143f959ca24348510e241c3e79ed5eff8742a89b4ce131e63544b9497c2a1712999a18cefaac96bc5f686d6b952e7082236622b737fda0dd3900bec71654bdebc8ba2e4000000000000000000000000000000000c2bb8dd01510ffe473715d7714e47dc8fff0f24af49405e55a9537a617dbf425950ca3df681f1fb2a3721afdc5a4d730000000000000000000000000000000019fcf0bdc8cf0f14c4b8eff44ce2646feecb3ab0555f530f579cb2764badb6445166598824f7b0c46a857865ade1278239d6045573dafd09ab2a0d8ab6e97b0ade43bd79d820749ecf19cf7d99792ca80000000000000000000000000000000011a463b5221e4c3abd9652917379564ed2830907464235fb6f9038f1d3a4f0f8cf9f6ccbbf66c86e216975b2d372400d000000000000000000000000000000000f0e9d5050d539f9211ff7d3cf3f0e7108c5580b634b122810c78d8fe047ac709bbb06ab1501e08f0e58093ba8208e0d4c4a2ff4ce4b633ec8fe0bfea42ccc329b7d3fbce96c26989b3c7a391c9e806a0000000000000000000000000000000010b293dd411de6a5cc464e919d290d6bdb51952a7a68cc27aee3ec80808bf05a50763fd4c17f25e94e655997bc948860000000000000000000000000000000000f18c7ab95bd74d9095ea9ea66b2b14987157162b8b8a313a781ce58b05d2307db4e853733a45344923488ae9dce1a459af09ef1f27cb83189e4e13f3801c08d3a2adc8b5f88717954ee84499defc0c40000000000000000000000000000000013ca27fdf920f901634156567835601ac0b84efdc79d7d979c2156041bac04f3297c1799d3b0641df33da9647e604b87000000000000000000000000000000001527cf040f6c84496ceb57df9c9ebda89c394eef034e40f5e6b540e931775ab91a4aebbf6078922da479ff397cc5271ac72c1dc1efefb775a1bda754ff17389a6b6b6bb25e22697847d24a117eb8974b00000000000000000000000000000000197c0e4474e27fcaf203819563b86e725778409c7d6792fe41820c495e412382fefda97b7df560885082c70f9d522024000000000000000000000000000000000b14b9d40bf866d933a15e16f06ec16b502ea8e7084d68c74418414fd281a6da50bc443647fdba348b26b4a3490d0ac4b4a0c7c2e611a24c722975ae882dcb4b45e6f6b41cfc87e8c766beefd5b10bfd000000000000000000000000000000000a254b07ca0f2c9219fc0dfb49bdd7901999cc85161f741500a3ae8be566e64f8a5fb3e59985444206a2cd02ed4ee99d000000000000000000000000000000001726739e92da7bf5a6d2dfbf96fee6028fc7022cb1be2f838ec1b9bd08ef141f4b24e093fcbd99080721063f8b7c98dc986d48aa5b00fc16c36dcad061d10937b55ec4deee63cc2841b7ebab84f910d2000000000000000000000000000000001133389c12bf1d2e232cfef1a8303a733edb0dc4fa26acedbb288166fd232b79f67cbe76227ab2eb517f1c3126b929a30000000000000000000000000000000001ca6bf5c18255bb3c533ece833964320bee7c3da4af56d876058edd15f89b0ef147fba11e1d539d528e4bc452e17df8979d4df836daac0960fbbb8919d2f90c3457cc987153def711d6e8a12fb14363000000000000000000000000000000000d0caaa05d3a01c89d6efad96f5957f1f9338136119e8530853a58c0698583d834fb0f045e212e6889d8baaa49815c790000000000000000000000000000000009e7fd124160f6ba3afa752b2557f1c4b5f4010a6d4a3c8a8bfe350c6b6e198b9e3d11f2ec7dc6a02dad4c07bcd4bb1d25ae495ba75cdd0bfe200ee24d813e1aa93c100ce861c9ed7fa5537e11778990", + "Expected": "00000000000000000000000000000000138cea47ce2ea638f06c26d24ce87073f98b023b800245b6fc74fc2851d79a402b49c54e5df4e1aa98e33801d3fbb965000000000000000000000000000000001558e37121ec3710ff5e6c2a4e418c803a5b83cdeec98c8216b8dac7890ce17bff08a95ca2aacb40eccc761c8a31e8c0", + "Name": "matter_g1_multiexp_18", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001920ce210ffc78b2c053eb2106acf1e238ac5160b50187fe816010e8a95ec632a7fd29565aefa4bec90d87701c2610dd000000000000000000000000000000000322ce646a20e23a1a68361806cf072ae3d6310f4055f5289ace0036a90b5c7ada537e614780156f6a103ed726e15b4fbb2a329761a3d6a2e4d9d63d7bbf7fc6fd321ec0344cc4d7d1b6565c475ee967000000000000000000000000000000000a1ee4319282f43ab9cecccf2c7f5e08f35a6c7e7bdc8dd2f4d642e8968aff377791a5d1e2b2152c59a8f36d9bbe04ed0000000000000000000000000000000012e60ad9f99f55859f2529ce02b8b41f8565705455cdfeef3cb315903ffbf29fabffc2546359007a36ba579b6dd06c2043cbc3dd7ec63ac63618a9e5da1f9c3fb952c6fc6972dfec6caf1a415a0aa79e00000000000000000000000000000000000c2aa9516360c840b7f88ce0cfaa0ebec502bc9cb9304c1a4d895089a2344bdb6623638e730cf30c66d977e077423a000000000000000000000000000000001163f60b32213940c9cfdeb2c86d5ccf61c0a714436b3d0923ec338ce7bd35542726a87a1311c8072fd589499c26521d733a3a84eddaf3af8c5009646a899f6ae8cf233f535e360e29e2952088ebd7b600000000000000000000000000000000116aa02028755dd5195ce0b2d3234d31b07b557a52330fdb50064a18015ae630f427a4512dff06f93ae67c4fd0c1e10f00000000000000000000000000000000117d4a68064b3f11d88ce976ed43ceeb742ba6f473645995a2773121b2b8edb8fa2715f51c8be109f8d91c44e8943e7c5112b5912aa3cba657d8de3dc8138fec92b391d5f988b82e19f16fe52fafea7100000000000000000000000000000000166cbdb131fadd6c4e7a94af82ce4fc4805dc34aacb0d6cd89e69cef0b9071b112ea4a7d9d03e3dd961b5d833b84195c0000000000000000000000000000000010736a73e2283849595569db9a5b0b9cabf2182c3d8c40a39fa32abe52dd6038edfb8176f64ec12671e3411dd69397585683e0b33b5463bc71283f0625269b2b33ead69c1eb7b23a996c31c514d06937000000000000000000000000000000000ec2405173e541945011d09092cc3a71d9dd1ff54451127181bb2d5b50876a148e59f298ee30ec5473c520be0a53d61f000000000000000000000000000000001239198a5b1f6f57bce914583c3bac476a922e56d2bb30da4912acd31cbf307bc258f22fd9f6a0073ec48dfdaa4799bb5bcc597c5ed7f79173942a0250e618c93cd0917b37b5f354d63a2c02a576080c0000000000000000000000000000000000232940188006769a382a4958383aa6702b2cbfb9c2907a989938ac618f23e241767b021e8ae11c23617ab393d4f85a0000000000000000000000000000000016a672061fe76ed943e36b2d6fa4aadf579db96eba5e4c60cda2884ddcbb0f37668638a3167d8858cd296917eaeff8e0f2613a8e50fbc6683ecdd7c7fd38b4caa8e5dc9778909fc8680a58b16ebf40da00000000000000000000000000000000066fe1f7cb3d67c20a1ba29a52c0c86d6a2aca176630ff20d45632398a39404619e55b8ade69e0cb0b7a6f363c3b2d4d000000000000000000000000000000000aa25dbff2a8c1f1d0982a709fbe88563813e918c8f25f0da9c5d0dcf3abc257f7e32def4efbf74035aee1ee350cd4fa57a747bc919991ef9b7b10388bf3f301fd910f807ccd31e322be46580a71b7c60000000000000000000000000000000001e54b0e8f34cbfbc20c9feffc555036857c31f453a1bbcffe67bb71d0d6b2b278b2ec5d6ab6648b397c9255a1139993000000000000000000000000000000000bb6d6c1a41675b3394f5b9cf14ddfe73c188592916f24240edcf0940fdab1d1fc04a11bea4af90d0d9f6734a743b38086ba09829f4bbb383e2e131d554c42edf1065022975655c07df2b3445a3e6cbb00000000000000000000000000000000099f521ecae704ed5a37ac90dd4beb4fa21ac197d467185c8329ad7b87c02943a228285b109178bbc2606e89699403ce000000000000000000000000000000000a95a85f84e76ebace78bbedbd13c6b79a6339dba246596e0695aac18d2b14b370c033e62a01caf8484dced0ebe8a76a03fd5e91f590fbe171aa3f006617b20ad645626c970c2351e048b2ac377321360000000000000000000000000000000005b8ba4c7d3c83fbe9bcbcbf60b0b3ce42b52ca19a5a322fb18bc20f81c2fcac23e1f62b9fd6edde5ffa2e37f685e06a0000000000000000000000000000000008c03604012e4dff47923a2a43382edde86c76754a1073ba51fa3a2ec7011268ffcd1452d46786682ab2ee4848210cc635ee16785c004dd2a01920c52d3244e2160fec2d17a519974d4331527cc62791000000000000000000000000000000000869a2ec19afbe70ad0a15532f776f56da5d7a7dd5b75194d0c65d0304c69a6d0363c0ff3b549e8d15171fae18ea13f8000000000000000000000000000000000389d0e6c9d73bd98202191b5b213fbe77bcf527faf98f4d25c9dd3ea2cec8f3b1e8f261d9fc8baf7b1c21dfd102f99104a6d6e29336015d99e107cd312e300bd54f815c785f6008c47c99fa0084527000000000000000000000000000000000138a4f53b8fcaea11869a6208e7498238dd80be79cde96885e6e5226315deedc98a17f8d75df733ab6f15dc24efb5c5b000000000000000000000000000000000d25d69d6d5a9c597fbec8aa7fbbe579dd86c5fd3747378e984c20b34e018b83f889bef3069c693a91ff552fff1fb8a403f9cd3873dc6243748e16e4806f8eaa339edcfdbf4408a8e41a3df80c98162100000000000000000000000000000000192e8e186cc9159d2207b0af2dca495e9d0c82fb376041360ea80562e470168b52a3326553902fd6f5a43ead32eb968e000000000000000000000000000000000fcac12d18fdfb661a12d112fc3414839bd34aa244ce0cb40be79718ec37a014b43856e5e4b003f4816e04ce612e63ca34135a2e7853c74725bdaee1ceadead7b4c7d729650df6544bd525c05c942342000000000000000000000000000000000b860984aed11a63656e3390f5e94695d8cd9367ad7961c65d714637c68ad88a3602699ed3f627f0fbc5782ff18775af000000000000000000000000000000000ed00636e74e8163645c43b8b31f05228da7c42aa332ca250270e5f14b3660fbadb8e8957f52592d942b1cc1bd2eb0a50033fdcb731830951dc3c4b33f06310eca51762cb7279039b3d7d9ace93c5f2a000000000000000000000000000000000b162c0897755fa47053e45ee1b298404818ca282a7b5818364c292a6052703502656e536f2dfb470730e9bef0d7cbf6000000000000000000000000000000001924ea42eddcddda067126534e8b862f0e16dc0cc296ea892115a9ca9734fa03d019e90263be2c909528129a12a68d874c8112ebfe12bf44e84796e8b0cd03a93d2164d6edf1f06a5c520330a177da87", + "Expected": "00000000000000000000000000000000056604e75c1069b4a061ea72cae2cfcba90130f6db6d9c268649089ce4ae1cbd80120a086e3f066f2584f5b2233b468c0000000000000000000000000000000018c5e93590b89119ad7d44f80cce5ecd97d4a4d3010a19fd02a58342752b166a1b82dbbad30d6f3404b330dba6a57454", + "Name": "matter_g1_multiexp_19", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000015f9de55b3b45c16d59adda55d9f5059e765ddc06d22d6e68c099358d8df0229c6fe368384a0486af1cc9e532f78817a0000000000000000000000000000000018b992d73dd4c602afd82ad0845ee2c6662c860c5b7be197c62a8a20e91764004b5293ea40602574e91c313e8103e7a1dbb32a4fd8b9dc58a382a7e436e23f49a134915372553eee8c605436221acc8000000000000000000000000000000000157a9795cf9a45d2ea5e0312783829cddce176c63eb16195e7994b0688f9f30a4f2b2113e955bc66dcf05b5441521889000000000000000000000000000000000dd9365359ce805327b8f627f02ef5458cdc806bba246dbb21065c89e7ac6093004d214145cf3dec605195f14f1a49d357df9664d3e17d9d46a886efde4e37e38859893113558843bc019699eeed8ec0000000000000000000000000000000000066d9a54dbb5fe64835523e8ae05bb70b1934e389db0ee7547da60e4af965c7eee14a148f2e3269f01e8a545480db610000000000000000000000000000000017d6a22dffc3eac4366d0d35bfdd053d73d7b3392e7f52fe04e7e481783db3232f85687d2341358d2148fb3af7e9315de2b433b7a95c26e598002cc00b7904816d59baaba79bae7c6a7c26dcc48a487e0000000000000000000000000000000008be91d2752203afba19d8f3660118f83dbf851a6d2c54af389ef979121c55426d0761812de72a79d46c66dfcd00d5cb000000000000000000000000000000000269b050e36718ef4ebbc89bd88106a4043b267d974439855b6027f7fc3441518c39af6d3fee46e87d399d3ef03c63c82897583b53567bcfdbc63ae3e864a9cda24bb732694a6b27415c5212c7f45a94000000000000000000000000000000000dc976bbec5c5791688499da28c1d120e8a68eb5511ddf54525c047378016f68e8590b95f05cfeffba56c3daeb0729dd000000000000000000000000000000000af6e02afcbb707fd4d8bdcb5e73e1db56d7a2eb02258b91ec4a5c46c4627525220c11e6e379077677e1b733e2df60e02f7ff17e54d759eb9c51e16cf6f12d645bf2d091427416b4edbe1dd21947b4d900000000000000000000000000000000119b86eced2222d203b6428907269b950bcbc1519859c013349b1c7acf486d3da5c4b35319e6b1ba8ae815e4ea14a6900000000000000000000000000000000015c342be097ba679319b83a68164f6820e2ceece3a90d1ec296514f0ccab6e454a0fc444d599a812bb4d78e656e8897fce0a097efee666c22d1dd0ae8c8e11283aae781e1deadceb3ebbcbc5e5280a610000000000000000000000000000000002da8de95ee2ee1be2f3ba8afd8f52a4fd0e352c295e92aa8fe9a08a03b6170222f5d6cabc9b9d9bf2835128c6ece3e9000000000000000000000000000000000fddd2b5faaff49cec261eaa8d093b410e024e1620863b6b9bd882088b59afdd4445a4971f31738e2afeafb36900b2d47b2baa349884b54b542e3993210ef002f70c6467c7d512801f0003da789c00580000000000000000000000000000000012060c8cab190beadf40a2e3d927d7cff21c475dad04d64c718d02ead9e351a27be81a3c5a71c6c95aa7d7e287070356000000000000000000000000000000000233ee868716db87f46d546aa1a7e4d3e70b2592efa0104d9f4fab1680c627484a33346406f61499e3971157a6dfbf972b94d087c3ea101649ed57ff308dd3ae0d25a1ad8884763cea1b0b7c56a3834e000000000000000000000000000000000cb9c4b59eb8bbbfb8aa2e9ed72eab69735a0154645d68428f0bda762d3b061b0659b31a907f531a55c0906532c539e6000000000000000000000000000000001806c7e8a8d95a34403ec78b43dbfe0bb09014fbe0e019f8c3b6ffd91a75d5e361a6794996e975309fa716b6c6a933784f8c35b920a35b71dcf8d15a8a826e5a7c2a2c4f1ac2c2e3a6d100363e7f541800000000000000000000000000000000131a492451e5c0ff787a233f72766339d7dae09f2e17c6bec9faeb08e4e48d6407b12adf2dffa3911395d5f25980c9650000000000000000000000000000000001f14d5268c422f94657a20ca02be7d007ea88e1a352753b2fdcceca5275a7ac101c0ecfc075735eec82b8fa6bd61c980ae6101fac82c10267770e74a0ee16b5be6eae2d455d742303a3c624d52aa726000000000000000000000000000000000d988d419d559b1b487297cec19386f28659fbc5f121750b6bbe941794954e82e67c15a9a00334527d85e9be706bc2960000000000000000000000000000000004c222c037fedce38f42da2b08f06614ec9b166cc6428e3c4cad8ffa440af3d8fca7b9e4aff727eb0890effbc2b88060002fb31d0372e7730499b26d617b53ea04821c6eae922326d755a0df31b559ae000000000000000000000000000000000fc9786ef5291943cfd885238090be47632c10cc46df48f6bb5250a7a85690f1c90f5f5bae03a71d7c52634cd0deff340000000000000000000000000000000019b4ec13ad67e058906a3559cc683511715b25e52f39a591b22177e2dd235e042832f740269544de112d9100c1ae49d9aa846e68337f4e9c99dde506a3af792732342e3b836376d4816557fc1fc9b916000000000000000000000000000000000570b5e7b74c04db066d0aa751c9f763f59c6121e4e2ca4eec222277049143fb2e5fa39ac0fb41cd85310e4504f662ef000000000000000000000000000000000b522af535ca2b9db0cff08bf8ba19862e8f964b6210ee19f0cfccae8972150ae41ae1b8ddce4b1d2733c7dd47bc4c87df9035283f1afc294ee68b2668870aa45e483d208483d9e967b11990cb55d860000000000000000000000000000000000892cc60eeaa0ab6584ef2731538a84c6a1e8dcc2efa9591ef1321442684ca9fd953553268ac4ed44bf50004683793550000000000000000000000000000000010234542eb7231f4356c34e11e7b4f08b4cb405a31aa87f961d4eaddbdaf5ba6227b2764e7c7c9ba76bac7da3b19f6014005df80aa522e889e7720a9f2e44e6e7e19c3160ea282ec87a4b446d7b1c45f0000000000000000000000000000000005f3ff7ed08cfc6bfc8f5b55e2b368cd7e9f4a508ab46c7a383b2123b0346b81c39ba1304d628448c65d8c86bec682760000000000000000000000000000000001cbd3457f6925d5b8db7a785587d0dc6e2ad2ff5a6683dd11c8946e953dee72bd52760cc977987cd06a2679c74f9b64893c9daec43032946a9e892dce960e07d29b304000378145148b9a24afd15157000000000000000000000000000000000aa17bed794d72f8ac77989ce1b78550da54b4920ef6ac4ee0e83bb3cac5431cc7fb5c300c021045d4d391c67963feab000000000000000000000000000000001300e87daa3c36d87138628ad9aac5ec7d62e979c83c5ee4ce9a375fdabc745fc5874578945395ae128022eb98c6d8e4f685e6bb7713f8fe202c05dfd18003eff261456026a5185ee9e68aa821fe7c5b", + "Expected": "0000000000000000000000000000000010a773006edb1a84341f2971f9226841142b26bcc4af52bc8b000f165f6c59d094aa2eab1b83b3623c6c09145b5bf6120000000000000000000000000000000000130a0242c95fb2b858256de2fe27df7f5736765f880673300e3506a5e756b3b563e52b481c51a003bac76d04f56c5a", + "Name": "matter_g1_multiexp_20", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000090ef8b0781c66698848215b3aa84f7be47f86a9d95bf5a1ebe9c3dd6615d4fb4c6425f9e0029fa3d7b94052ef8bb252000000000000000000000000000000000cd1927ed1bfac35325d69fc924f4045c5af9fa5b0a18fbf6c658a3a6d405ac1159d1c82934aa116a98cceb382dde2ee94b3c88e51af5822177b85978526036a426c9ca1077d594618ebb8fac4cdfc89000000000000000000000000000000000dfb10a6b4e5980400bc275ba5cd8211b8a6bb6cce026546b9459805ba48f46a429ba683ad3f96ace4a4ffd6cfdecafd0000000000000000000000000000000001f643a6d83f235edd9dea19f0f2ecb98a82ba295d8ad45f75be5c0d5b1a1522c5d9f5ed812d47da6e5fe8d7924648fc6e456b39f4efe6581657f5c701c696fde8acb59e856943f15cdd639c1fa68ed7000000000000000000000000000000001824ddc80e263475b6ae3b73ef5613c7334b2f71c95d64cbb84dd489851580e767be29e7c7b47d53668a0ee3e6bcb03e00000000000000000000000000000000073f6ee13c3b05c466d35ac49c33e5ffebe5e8325f8f06b893042734bcaa4a1bc76da272602664c2aff48e731cea0304e5d306f46a31c14de7b2940104d0a4424ebaff805a81f1c4a910566057c81604000000000000000000000000000000000abe490a12162aa01307e814684261566302501f589c655b3cb840876259112a1924b1ee723e0c81d6cc6b19535d52f20000000000000000000000000000000006a2205d02f58dff40715070cfd635aa5e68553eea8718090e5f6a96dfb0a2f5a23e11ba92d38a7cee16ce67aaf5de194ff6d13bb0967945ff3b6fbbc104296805e4fedc3c25bb55b75cc997834de6b700000000000000000000000000000000180b5eb4201b4f10f605b4a7f5f5e25783bbd7c9e354238dacbd29563cdf119c832b4ca5c908329d5087d5c8c6786d68000000000000000000000000000000000ac5f56013acf364ce736c455a88a4b2615ca40fc67251039eb99df3cf6423fb85695cc035b6a9b47ef15db7406880bcde4fb2dea292b76d8130e6aa8aff5edf0097de935b252d42a777d4d9b8615ef1000000000000000000000000000000001963e29f92f6f72be2afa4635221b0d2f6afe9ada4582bd7ca4b77eb77fc4503578f38fb49aa1838751db8cf1ca0b0cd0000000000000000000000000000000009856a48f12966554afbcde1971499ee3ae40c9c5c3aef13bc415fddb97545ed84d5f50d2a26b9c16c4403a487dca614bac5c50a3a8a37111114c22839c88ce4072940c06f0d8b6d53fed155d0399ed70000000000000000000000000000000006cb805ab137fc56763f73867a7ee5635448a8a66bbeaa9ff07554db3d07aa38542884006744f6719f4cfab1392039820000000000000000000000000000000005e6f6f14f7aedc757cc458ba363fb5d97ee0dc092cf6866083722d4535e1b852c1d99d0c7c57e96a644de4b431c7f9bc3f37387bad1af3a896a7e66a80dfce2df1709fa252b6fbe4334d02bdced4329000000000000000000000000000000001045bd19d4fba8380467df25a777b1ed2850b7f5c5ff5501c048339c2f71278b2c97e4815973303e9eef283378cd8f470000000000000000000000000000000003278c7c8aa02c15275cbbdfc49f6286d6e7fb208a71a4da390c0c853684d7b4d8a6ab24953075a6a45f79fe0c9b910b70fbf5da3959a49fab7e97b3df3f2a38d16d714dd798a1f04ec2cbf84fce76910000000000000000000000000000000007af4aafeee0372e88786c6025a710fad46252a8df870b56bc1d8a39497c2422bc01aebfb567b5b68273ac59b5cc8d6f000000000000000000000000000000000dfe4a8471e42dceabb609b983b59dfd9869f29fdde01a168c07247252a9be6555a823a61487778597e0ae305da4205fe538bcefab5d8d0be5fc143e632e86fc065af3f2f621f293b914980abfd6a0c70000000000000000000000000000000005f847129487acc07fffe21e2d0aa6275a586f051c06e2575f3bf8549ad9f6c2678c541d0dc7bdf909b7cff683ecc5bc00000000000000000000000000000000163451ea5122e16ee62d58d6ccaf8cd981a29aa820d77967e69478127a76092e9bd0dc9f24a27ddca5b40b1fe8ce18b130b921d8cd2ca46aa6f3e0dc6ff08d77972fb0a248bd39e90a1e9f32be9e892a000000000000000000000000000000000faa1804b1f65a6ca75d032186b5dda63799a5fff3ffcf1f53eeb04bb5ce08be40fac13295937f34666e0f0be3bdfd9c0000000000000000000000000000000016a9086134daa2a1374fd8eb74ea65858ebe8b2990bb92972121ac68bd6bd77916203a1033ac4b163d863d9120bea0a33a5ccd9436b15d4d04a8ee9894c116190062c4e7cfabb047b585f3aa1eeb4605000000000000000000000000000000000a2ad31568d9778b306525e275bc4f525d86c04dbb98f48e72adae813ce9d02dc6d826a813ffa5b9f9d014e92de42c520000000000000000000000000000000014e928d48c4ca7640a5f5c55c8ae756fb6f03bc1a8e4e907ba89865ce610fbd919a024e86969c52a4216d84b37673cb5c7a5bf2cfedd7048be7ac7d2ff19d4f8bf0a94295ebdc5e792393e0e4bc27d5600000000000000000000000000000000041fc07f8759995530350fdb8712304083da882a5e4df8188cdad48a3df91a5f1bcc1b2a25fb3c9b59e2c935d579a9d1000000000000000000000000000000001925153fa12217d98007963237a665e56570cc666651c29729445adab3963d599a4eab996b192be1d49c7429d9f0cfe43563651d5f5729a0ffca6b383d884823aa3b0215fa057bffd8142199a16e4ffe00000000000000000000000000000000006c45218eaa27435aff594c2601276950bb99fb3c1756dbec76e609d163b2593933b5ecd5fd8544d4bd2d145821831c000000000000000000000000000000000a43ab2ea73a8e1131e184fbe9004aaea198a3dab575d3516b422c275f20c7a6e5d41bca0aa3dfe7ec761dca0ba6687d833323c3a668541ceba18375531c3781dd98525b49dafce4c4b3188c90f3f4b5000000000000000000000000000000000d17ec8ed30bbca5766def9fa375219503bf2f7322d2cc36a38fcc8471fd9d11d2a30ef004e39cac4d1ed2d33a66f7d200000000000000000000000000000000108e6c9ef3a5a41662fa16488243af3419e2d8e78c0311446186c96f20d9c15a60b5470eb95e0e58143a3c71a7565b05d422e21fbffa7d55270eca9c96bbefa29dd915aca266071673e970daa0ca9c050000000000000000000000000000000017f498e192905962fdaf41120027d49267523bee9de8e412161cec69c62d2586752d1da3d15e89446b5941a2f321beb60000000000000000000000000000000015e9e4eb30296ca3355ba9c5eee343fe7edcbf5bd110ca5be12f55191d0f07b563881f52e65588a8f4b3e03dfce6566e3ba7ea9ffda87131452b24a9efcdc91d1262d0d7550e5a6b787eace3577159b0", + "Expected": "0000000000000000000000000000000008b5f4f55def15b4590e978384fa0aa87e088916de20ff0fbd688ab3a13138f32d1e89cddc72acdf69fd86aaed6cbc4200000000000000000000000000000000022a02016f38156fcff83fceed881f96fe14e5d3410b4fc50e607d8a23ca986351ce48d6af970590f68aa2ad7181c9e8", + "Name": "matter_g1_multiexp_21", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001155a7d2cf81ee4f8d65c835ef422075a9453bb85b3566ec0545c1198b93749beffffbad14ededaa5bc6443736f77bb800000000000000000000000000000000073e4df0ea06345dba9fe772710ab71153e57152c74bd05d8cd4229c5ba1301f7e654f3fbb2a45526f1bc3b09c72366f16aa2cadacb129598aa459bb2e6b7fb26d1bcb7a49617b6ef8e57018c3db1f51000000000000000000000000000000001238e5a46f24e0f00d2b45bfad87f96140ce10d774f4a17c3df224b58693afa7cd0655e5ab202998f4f8b4b5e22cb82d0000000000000000000000000000000012628d85d982086640b09f046c5bf07b1cf718b5b4b20bd99d64382bbd8bd0112230609d78ecdc742cf1ebd24f1750ef8c02014d5392d30863a12102d1c9315839b5611dccfdb489207f918662513850000000000000000000000000000000001363b85a95432193800bdf353de1a5764cc2333b0369ca7dd539f230bffe81dce11288a289e0842f2db62a89e6f6af1a0000000000000000000000000000000003dc043b958167a900cbca116b097724e64d49897f8fb6a31df99e100be837e873328f5113a28c9fb510017d28d90d30d960ff678e1b46ada4f866adf354ba8c1514df10ebe7d88d2c8de117ef5ea24900000000000000000000000000000000175aef023d9375ae90e9f562f88e0a4affdd399c3755c1b22494445d4e7d96899aa4d5f77ab9392051de4cb7e400ca830000000000000000000000000000000018e3eab56eae429c09f9eed67492181279704d947cff0f1c9a4919dff5e6fe07fedcaf5dae854dba6719194f9fccde1704753af76295f72295645243ffc87ffc2110c9d8dfd20b464760ad965d7a97940000000000000000000000000000000018d7001b1d4a67d22399c5f9b3262183a47b6fc81786f8f7b78e80fdafb3c0c175756e602c92855e8ff9d99d4116e3a40000000000000000000000000000000018451928599da4a14442910a5bf125d97f0b67af4194797b3f54ecc9ef0be840a1e0ede13e1415391f57044d71fae2efd1b8760cc40d093912fb073c5012f910ae90f0a979cfe6d81c603adbb98289030000000000000000000000000000000013ca19bea2e93c748cd2adf682a123416823a2473148e59d87da33cabba8e0ff2516e5b2bc9a8fcea9dc4240b20133ad000000000000000000000000000000000433fa5475709a7b70044f88a5949064e32014f1d64826abbf60789380db6d5ccfa750a868d9902e4646bae766e241acab79d640b042664b23667d6c60ef9a5d59de72aee57a78d75752b350ce56d8da000000000000000000000000000000001236e6ebf0b704a18f85281b09a9552e8a478c66e59c9f5d53eb6ff1f606fd667a6f0bfe239970892c9c295a378fe389000000000000000000000000000000000cc5c1039850f3333981b1cd6457a466dde93e2355c2052cc325e18604f59cb22588b6d892685fd7843938fc1b5b8d8a1d1a2965e995bd4380d4ec52fe8e65e7fd99b1ca9f4f0c656adf7051c4b9a99a00000000000000000000000000000000003f86a5cabfe7792de25b9d8c58a283c5cef56e23dbf713851b42fc0d66481ce1946d1c632e38b9de1a55ffa0bd7f5a000000000000000000000000000000000f548b05782ebe160d487c622f8378786712cb5b68545ede95b34b08698f600e02e918fa2253a8be2c1b773cc74c41042cfbf2abd851d2c1f55c56d4f8b11b196c020c2584cb03764580d410d66784d40000000000000000000000000000000015a4bfb53e57dcf53483fca1b4dad7f788e48fedf8bbd7ac40b1707c35a57011a0c7f77ce6626821221e59d8185b9ca40000000000000000000000000000000005618adc16eb9771bfe731dea180e7e2b3b0c9537806349e653a586dea4633aaff7fa7e7ff165fa16ae0013c9672a783214edaf16742762baa58a3d22d5bb2305cb03a1326adc68adcd268428f82a1e000000000000000000000000000000000039895bd3ef87c094c9cb1ec77229d615e76dbf0f3bbd399948a70714d6835b570e54f46f94197657dc94d36c4a49093000000000000000000000000000000000f1c6f8b06ea4378234e99d16fcc439a64cad45a7f8ec567755febdeeeaea4f4b133af18a4c00b3778090c5857739b66c1f38916d6bdd5d379967dcd058ebce5887ef2bccd5fb7c2bcd758e374a195e20000000000000000000000000000000003007275e93f828b96d060e775f2b92d191d6da44b1441bd0aaeccc5abcfc7d2b5e9cfaf7b8497016ec992b13455af2c0000000000000000000000000000000015c1320efcddd0709a12a75049633dd871747e51f099e40908542a3e426d7a29b6633f5e69a4c0b5c32ad0269a969bbf1cb8c8303157f23987f8a2d206f3add697b9d0a303393008429e93cd35711f7400000000000000000000000000000000068dbddbfea897bc2b20b6f967aeafb0ef759082f55a180b3eda87174d0e036761f1be1c682d1a4c33f5113a6ff4e2240000000000000000000000000000000004ad9da407bd80ef365df2eb763ee35ae06074dae0eec7e2a36e57df4b3e5ac333e373cc60c1986543c0c23f3124253561ca9ab9c3df673b7ff8be098cdadd8354c17becdf82e7e99ce264174653007a0000000000000000000000000000000007f506a54adb1f763d55278419d4c18ca581b28ee369f33b848be495dbcce72c76533b809d70e26dda71316cfc3a1c73000000000000000000000000000000000a6c574799ba920ac58d6cea6d0f8ae249ef5310609904965bf86fbf88269530badbeededfcaa03892f1ad6b76818ec4681a0861df30946911d789a5da1f5b89c38fa1a8c0407b608122a18be05955da000000000000000000000000000000001424ab1e7a30035c4ee7d5bdcd8ef87a0aac284a36259742b68a5997e7dd3f2e5065e2238f2e29a23ac5ae9bce3bedc1000000000000000000000000000000001530257b63872851431a0bf5397dff45d6c201da58d7b779318beb70a5ee2a93142e4c5c43c3d65ddc65fe2df1af18906f0798b448ea0d10c84e2a8896f153b1ac3b84c5fed6a4ba6c932260bf01d34e000000000000000000000000000000000bdc58489ffec3668363be0a3e45ca2115bd5cd1745f86f1842ab82ae31b08a1f285e88dd4e0c7b94778f42d495b1f9c0000000000000000000000000000000006f4d2a07ebc588a8f9993ec6048092b6dad82c25275c922b2842253a8fe24e191cad4fab51621198147c6d1bfabeb0ba8b7de8f34053facf1338b54cfbe38dad73121a0429663f484277af9a230abe6000000000000000000000000000000000096e94b43a1dae483b49c1a616c010c25b660ec3566fb7d9c295d3b43c60ba4967b3f0abcc0634de5cf3fba14169fea00000000000000000000000000000000026146a58d55ba4cef1cfbc1db6efd46400b78f508ecc0b2eede8834eeb741b68ade43ef2300fdfae18c02b86e3386768823cdb73dd076ad95679a9d7b11145c12a81b825477f799300d1fd761417c2b", + "Expected": "00000000000000000000000000000000143fd63e2576a606ec59d017e6582711718a542dd0a4c84566fa4312b2d2bbb2d71c1e0ab8e4e214ef2376706a20e3130000000000000000000000000000000001e97699fd2e0badc3a97f6cc55bcf729142aaa13c51f9b155e5904382ed0d94fbe1d2553d602a71ac7ff39189848a52", + "Name": "matter_g1_multiexp_22", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000023a2a3e6e1c1cc57b2295c664ac26abd0f5bbecc0ed8e9850f90b04484c0cf048a76477ddde84e90cc452429e28b78e00000000000000000000000000000000194aa1d8332fd8120ed518f27fd827e3c955c2cbb2cae8d5e677f55963565dfdd232c83a38826621e8e66565f8e200b39f2e54f21b7f2116c30d6e444ca82fe800435cbbd72a98a6d22bac92039c540700000000000000000000000000000000124adb0352af8f18a631cb0078ec7daf00c2186e04d3ee47882d557b0e9e7fda0e0d258393ded20288789085583a97dd00000000000000000000000000000000053f94d0889a5122b6dfb1da2d7f13a836b9be039f127a011991c360c941e5dab8cb3c7ff3d7e128e52dfeb776aeedafc8cecea241dd6a924c9b9cc3d390fbf40ab897208ce9d3e4a148b2c30c25e7eb0000000000000000000000000000000009dee1a168c00632903b93fcf330b28ec7dcb8d6fba65f369237ef873ecaddd60a2d1af6e5b087f07a103f096aeb5e600000000000000000000000000000000006f90048b72dc28cf4cb40585925e62275d44df95fcbf1206e2bc762a455dea5fc6b830420d49b2415d259f8d5ed3ab7e428fab2c596f23bc3c9e9855b74295f52caf73cb7371c93c65370583f7fef4c000000000000000000000000000000001750fc7241cee9d71d95f0023dbc4b1f41ce794e9e7822a29a84c93b9374ccf0f11f931795fb824bb5c9fdb4f9e7bd9c000000000000000000000000000000000a0e6e6c76088200a345531f589ed883203e35c8ad8413575bf961b1e8d6716829f632e72fe90947dfa46745c9ffdefdf7d3d755410f77a0e4b2fad0f184fa9312b559785fb04c6020432465799ebe2200000000000000000000000000000000141d878adfaa6a3982cd0de93b4d64ba840a07c026ca443d6d4c2b6c36cf882e109d80df63b1626c112f9a89809788080000000000000000000000000000000005a5888d22a2f654a58d9a03c68d59cde9ab5e5356b2288033ba58fe2dbacf533e59344bdf30eed07698261d6269fc70557b05efdd02ac9d8e1453c82a321d798f3106bd18764140faede610ae01fa80000000000000000000000000000000000afb5e198ea80997e7cace2d5b271e3907525b6383e9d45d8a7717317655a79bec3a48800149d6bbb11a838b1338079200000000000000000000000000000000060dee81112b7e0bde192c9d382b1eb695f3a1b0b9ef7ae33b1c5ef8ad9134c23b4f473103df15a97bd6de007b828fe63313884abc4d430c06ae843d263f2efc1bba35f6cc270de05551e1f86096bb75000000000000000000000000000000000a9327207fa94bdffaac0a8741955968ee2278dc0fd17e99c6f4717e8b0db2ce7915b1b028c81d48380cdef05ecd5a7e0000000000000000000000000000000006c24bd6aa5f9c41bd4551afaa6baf5bab1729b7012951fd0ddaf2c6dd03ddc2030d49dc92073540503718a44260fb028faea236e782a8fbe27ab15f051ed007a61e25247f1f259b9300974f521f30c800000000000000000000000000000000195d0a7f5a351dff02a805fa08b2a793d9e0c74ae95fbf2f42bfefae8aeb0deccadeb9a2dbad7285c015ce14724879ba000000000000000000000000000000000e177a86f6aebee8bad62d77703d1d34a1b708e84216437c02e0694fe722414f2ef2577c1d39a45b4cfe6c73f411b1b413994f5645c6ce83741e48ae472674921bb2d9b8abb7d04ddbbb85a3f2f7f090000000000000000000000000000000000bc7fbda14f76ed98e78eb84033b65f286527ef76ba56dae43a094a23067e10798065674daa14f912ee13dece4f36b17000000000000000000000000000000000f69104995530de05660aa048993c4e08576488deaa177520676c9cd53034ef101fa3911e40933975aa958efbb1b931f81eda24db328588e8c670ab70431ddeebb0749b431bc1bfbd992c91f35d59b180000000000000000000000000000000001c3bfedaa15025440c6cd32115555fbbec439a9a2fbf706ef21e06a534af3f43baf46897158e211ea8821a5e32f932e000000000000000000000000000000000fe08cc9ff0fc601e5609ca139ae0ebe58faf8d2e2f4f3d0a1231382a15ebdc8f67271b556cc24fc5408daf3c7f74f875bf25b5070829e3d5a66ad24ba9930f3ad64767c51e432b51bdbe2fab470688d00000000000000000000000000000000032c376b26551a064cace577ef53077cde48c284af5633152c89ee109e880b511c0b90db1b30d6d9700037489f6984af00000000000000000000000000000000059c013cde62f10f39175335b76adc5cf7330ffa75d770d908ac7e0fba6faa7b9453e8d0215f0589af872b2e648ec1d0a9535c082e11b366cda0000d8ed0f92ee30fd2c4364c163a718518321c5e85d20000000000000000000000000000000009cb943167f21d9399b184f0bc0c2aca58dcf8e702614ffaf5407644ffa9eda85efa12dd23e756c5ccb5bbb25abe57e9000000000000000000000000000000000d4f59115321181962452c6f3c1e086cbfbc155f2c3019e51e73fd193e9b11ec891b2dfbd95198b318e4513c62cd51bc2c4cb49adce0292e259e92b229bf7965864a945de86eda3ce0bc9f1a6dc8b7b2000000000000000000000000000000000637e1dae04d31282c2278e087eac9ba8506d3c1349c6b98485cf32805bcad002e37d55667f1cc8e5e11f35b4d228cba000000000000000000000000000000000778c3a40e79d6288d3a93580c8f8bef7591acfac2c734018d61aea5dac020360ad4c69b4422f7320b87ff22e30d9a6a5e927f57aa85b2df54b4bddaa041d43766c8929c8b9146d723806ee0cf04227500000000000000000000000000000000069a54448ac1c9ee754fc28c9b671e84a67e884492f8e84e09e49cbcbcaf07fffed42820b1de61cdd0bf6314a2f4a1e20000000000000000000000000000000008f5512a1a70d3a61ee7fd6750813a29c47410b7ddd62db0426b3caf9cd7c31029638499c2e27e5922810cb9bb130723606ee8a5fdd9890b8017f6c432a45517d65328f13f3a2bb42d7115c02929db7a00000000000000000000000000000000078356cf80bc64c0e03da2198da5971b01341024a620ef4a455291b7a694ac3d91fe6f19299d725cdf7506e0485485da0000000000000000000000000000000015af5f875422c1e3ec6bfc5e57ed793f368799c2e068669656294be0de25eb772aebbc61358b410fa9ef79c72f309c84c1a77ccb4b32a762d60b37827ad6c3448c33af6af861c131adb5920ba3c2b8510000000000000000000000000000000019699fb3c6af71eae16b8ee123870888d646ac71dd31d0bb3ca365f728a6687540851c8539dee5c34f16871ca244ac6b000000000000000000000000000000000e68a278bee81ea53d4a52e84c8f534a0fb8c065bbcad9f3727917402746b4d1f611ba5064f0c3cea6f4d7fe84948dfd47cde609c38eabf457cdbd1e0c5366bf523dd5801d66a0282bc187d80417f455", + "Expected": "0000000000000000000000000000000009057b093eae9c7ab2455b447a681857d588819c94b1cdffc0e315987b095edba1ca727043667749c56591429f9173b900000000000000000000000000000000157bac2835d2f972fd1269039a7b6159b7a81a1bf4327cfbd3be8b7c779631e8beea634ffefd9771c910c612d6925384", + "Name": "matter_g1_multiexp_23", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000015b6687a34084292423eb600bacc585b4e686251892b16a52d0783b1490a82f68f4eba5eefd36d147c4ec442d2eddf8b00000000000000000000000000000000151f59108d7383351b426ba8bebcf2a04976550aa2d10d5f89d5ed7c3bbd3473ebfa29c1706560866c8596f7549085cc3c79fe6374bf8f91bf7851ff935a124b54fdb5db498d2d37939fcd43bb93d29a00000000000000000000000000000000064e3333f828b1e54d201c043bb0f327d8c9af2cb96fbf587dcfbd55547d76784de0981a0ac86b65f4b8e45b19abc66f00000000000000000000000000000000172b76a242fb2bd9070ad26497a5c190d08472d3fbffa83dafc53d2bf612bf805691bc8f850da8c230ca0b8bd4fab818a59fcd2baa47621ebd90c5cd12b89f2a533ae86d537fbb61a14b1a80982c9257000000000000000000000000000000000158e81d92b789696efcdbd6e3e7c16386d6e5259a247991118dfbb3674643fb97a82fe404832cdbcbb58156c9548e59000000000000000000000000000000000fa0d18e57d64db246ee52980218c3eda5fb7b1029e1c76c9894548df52f69725fb7ff090417ae05957a652029d0a37019ef9fdfc5f0c4ac41255eb172d485317c124211498a8b9a74c0bfda15b986c500000000000000000000000000000000027a07cd6b7cf0219b57110edf07d758ea40b1cca42270b341b2bc33c78fb9cf52acc31676811032d3f618898a0d13330000000000000000000000000000000000e1212938244e425860646cd0258b65556360e832d4f2262984f4e307023896714731a2db10004e5509a1dc25f49ab7b8ba028831f429d027319a92fc0f30def8b97a43da456ddc79443d9f8df72cc1000000000000000000000000000000000bd589682a8510471ab1be8c348ed0d242548f0a5b85ee9eaab5af164367be21684ce2329a64a6afdc6a30ecc5bbb51b0000000000000000000000000000000008c8af9dd0e06a08f2da0ab7cdfc20100b94c04c7e6773a0351bc0e0ea503a69e5f25f250f0bbc5c7685795b279ae151edf8a6d86471f58c69c1a5e7518c69c34165e72ce84fbe0b7f69d9c2717e5d4d0000000000000000000000000000000015865d51ca8131cd5d2b0cb11c2f06e39b7e167ddf504d5772d478d48463668c4f7dabed00cbaca414b6ba96224c95cc00000000000000000000000000000000042fee2fb44ab45d310ab00896170a638940edb2df9a0f06c077bd00d203966d49694c82cd59c378445ae0577471221c0dbaac3f5e25ca3d1d50ebb31258ec4450feca1e02c84672ef15c49b4de2cebd0000000000000000000000000000000017257c7d5c733cb6e9ea1bc93bda4f36b98375147a119c376996beb6f0bd030c997ac52b1556d01152991738dc640788000000000000000000000000000000001155b29f473d9abd15514a0ae1cbd0b6a4ef394aa65f4fadfd3e9551c1d8420fac28acd5337fc5d114c092bd45e9e30d109ccbb8fcd4d4651b84f4708799d84ad0a717aedaf5a76d2970a7b93bd23d370000000000000000000000000000000009802bef3feb5688df77c86c74214451e4613d0260fdc5ed6e763226d3eea8a583c7dcf29eaf4c0bf16c907ceda76db9000000000000000000000000000000001447b1f7ac05cf8dce7e81de516d7303b310316f49ed5ef3f40f03db17926ff5f6656d859367805c889e07919224a6436326fded2b8a3fbf7637bc25bd201d20e3d4d724806cfa678ee039a39c24e86a0000000000000000000000000000000000057b59f849f0237ad511a75b66a77e79ae062025e5019eb71b7b7ad94a96c2905e25afe4357506b2472f99bc71a8ca000000000000000000000000000000000f10b6ad9fdb4f346c5b4a499722e377c7649a800bb95306dd7e2ab7542e59455ea5541f2d75e7cfb1da5dd03bf037a1e005efa8ee75dec8a013029292976e107a507ec09e3c34fb4baf2979fb759f1d000000000000000000000000000000000e0725ff4149698aa757e794590ce446a1589d9a574587575ef64d6a3c935fbd78fb60c7c840d7ef42eee8d72a5ce341000000000000000000000000000000000f0478a776be354e29bf8bd2710a8529cd01da31853d04ea722225bde560f2d9da302ce4f2634c9385ffeae379324b743917f8baf17f71222166cb9b6c4beb2e57d0d054cba3f7fd3a28cd3dc4b409490000000000000000000000000000000003103b0553facf8f3cd18967a758b73111a4a9987b0ceca3a20d6657a7e365be3925f63bd09990e33e1162bbffb63278000000000000000000000000000000000998a34ba445dbefe6023e737f3e35cc6416289185a26611301721db3a24f80dd784b001a2f2a745ffc3d0da5a9e6204f0f73e1b62561f5b0fbc409e6534ad9e37d1c0724b35cdd3f94bf6489e500fbf00000000000000000000000000000000041e13fb55bc9ed069c6d625ee08122efb0212f525b319b88197450ed1a60fc7283f61083ff263e4df10499b689498670000000000000000000000000000000010d931f006adaf737afd1ed2d1a631f519e6d1e9e22166c24830e92e3571e9f138ba901f5ac2f03192c9701067e7906b3ea24fb6447f2493c78a267daa158eabb70c1b60af8175d0d4594c99122cb442000000000000000000000000000000000bc0d401197ce816b692c5ac3ea539cc9658de56e48b4c3ac78631f3c529d4fa2a656f66098a702b4307fc56e147f962000000000000000000000000000000000d89fa2bbf3ad409a9ee7b7097662113b94fab95c98bd47a70fc2707a6aff23bf39944aad5509aba34930d7343762f6e5ed307c01d9e29a0571de07c62d5fcfc80749f02b8dbaaee9f69dc9263e9918800000000000000000000000000000000103cc442deeb800c14c9b3071c13d354d8c36d187e580073d150f4936ff178817dce67ee276d1633e003e66985c038cd00000000000000000000000000000000188b34fb0a4fc2408d8c70eab6df4c6c42d92ac5e43827044db526d4208acad4561c1310115448bc00feb9ee7cfdc40a877f31ddcb55d961bf9bc09903bd927451390922d647d589302855141cf5cef500000000000000000000000000000000145220a2f8fc61b2973d219042580a0edfcbd73a6bb6feea3655dd33bde8a25e0fb841a3b038049e554315100e6724c50000000000000000000000000000000018bf41cf4ce164819a8b00e630401f0332f5caa08b03bda27c205e8fcc5ea7a3374b591a4adc581f492cb07445c8995f145c1442ab82241f56c27dec2cd4dbfa9fc3cf1ab72bc521ab32a82346f8f607000000000000000000000000000000001416a39ffccdb10f65e5f06c8d7af68fbe894a0778e7270ab167ae2a5e917fb0eef1ef1b9fd45c991a45dc92a223ceaa000000000000000000000000000000000755c58a0692f8ff860430c5f75fa35366391f7e5313936e04230a1fcf1142c81b01e68fb3c888effddc0a498f264da9de4d1470f6cbce027465b4dc2a3deaca14e34218910aa76cb45d47139b31df88", + "Expected": "000000000000000000000000000000000d73a7edcbb7163795dbb5a5b4daca733e07f6498d336a5dea1a61c9edee346f74676afe0d6d39c39caa1fa7660ab311000000000000000000000000000000000f3d573970077a17967ecc0fc5e2e7dd4b6ce910f1891f444e36761e2ee3a72fce399993405761de29f9563f74d8b1c7", + "Name": "matter_g1_multiexp_24", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000008c2f928feb8b65e521b7218b029a4f54022a28a18845614b3b2de93035228c282c73ce172997e6af93a402e35158ce3000000000000000000000000000000000ca2dd2c06221058a4a7a06438f035ddbd96f6b39fe80c0029f41246a2c8a4410961555e43d9b3d5d87dceb8d0be1ef42576b42e0728db912a78eec2b7b4c96575e341e86a7592a07a660c11e00448390000000000000000000000000000000010d919a48f588429918f1b2f05ba6e897c45b12d905615e045c1969ee8a7d9ae262551f546b7de764266d3ab656c3137000000000000000000000000000000000a40d6f247315e0440b0b8195fe5f7a7dfdb2e1be9e593f7933691fd22789ae94bcb6bfebf3b84afaef7cae9fd539b5379f9205ef0e3a85199c60ad9267349fdc7b6fba4cb765ab21750eb3dcfc48d8b0000000000000000000000000000000005eaa990ca9d57885e6ee3eee10b6e2dde6e1652a743c62ebce4871ebd2d3c8e4915418aea4f4285ba375ad1923b70a200000000000000000000000000000000159919c720eefd062ba8d72fd3befd953e1272695471315ff500830c9b5b60ce5f94bd6e966828d69f7f268bb423dfd7300679b7be7c71224247e8034f5d30a63f8707d92d843a703f0fa93160f65715000000000000000000000000000000000b7244995b7819857f716288dc59eee9ba5ac7bfe010937ea0b67ee71388a3792e5b7feb6890a436db4f1b26df18b38c0000000000000000000000000000000009a0b73360bc0ca3b632c0116f21ffdaecf37e4d6c904c98d6225a08d7caadf5024ad6b457cf31b924118ea147ff10fb0454b01910548432a0f706818a98151e38ff9e854f1faa95ad41a7239b5cc4910000000000000000000000000000000005c2bd45375084cbc4bfebf41709a87c2a8d52256a5e4bc162501bc119394186fd624c5d3d6749708be2811da2c84c15000000000000000000000000000000001626cfa6e87e41c2f0960d6d2b8e303ff8de00c78d1e788f32cdf548a5ca00db1f3a3c082f051b4bca93788243d9b0973685617371b27ba8898ce7f30776d817ff09ef68a9d6721d4a923ed244ae8206000000000000000000000000000000000f736c8cab0794e3751a9e13027a8e4ded1308c23be3d75b373780eb69f130654121435c53b62a929cad39c605637ce10000000000000000000000000000000015b1edb73501789811fc09fe0156344a7a4eab1f04d1fabc24f36e2ddef7c2ccf9643699cfc654b7169d8e371c14e8c660cb5aa2a0cd1e8c3fdc06a3a1f6f9b6d52a8cc2e98c85b8e258f72d03efc2540000000000000000000000000000000018dbc414f9e1c66af803b0c228a3fe77c94c29239e529cee652099d80795c460a507538eea6c94e99b78779fc0f3f33400000000000000000000000000000000151bf39a8e3e85b9361a9472e95cafc3ae11f7d0b952714d2836b903910a8c701e0c3832b8c88592bb8507694d9109b5addb1fe778c84242953db87d2307b40eeb776f17767c3a4311b5d2ffd738f151000000000000000000000000000000001241319f49e1bcc2d3f3eaca51d2e4c395241e2c5d8f32749a168e4af17570793fe086610432db1f93fcbbb95ced8b49000000000000000000000000000000000d90602dfcefc3860a78a8f51432a7608a7c483fcd86c0ee6a70f8ac723537825c14736240cbcf903c94d04e24e8ecc928416b4b4e965a5f024723fbad6ef2f65a1381e70201e26ccb40188dc3d0fae800000000000000000000000000000000024f26ba0c3295002418f7839b774cd305cecc3c2cfe20974343dafbfa6677c2fa6be5c546a1fe81458678c3548d8d6a000000000000000000000000000000000fc8ac2bf4585e8ac8454e3e424e858e1d67cb6b9a7181e26af803d8895717796f20abdfce0dfb390bbc0c7b16c70ffb78077a51f88236dba6d16d7fd681c631510106b0eb7448df456eb9ce758e74cb0000000000000000000000000000000005f24bd878cf5832ebcf008835f12f9dfbc78b2f6e46ee384b419928aae0e754d86809d360b0afc01bd8f2f8d79a685d0000000000000000000000000000000004aafc9a20f52d1c78a17e7824062a1e7165362ff265dddd4c3458c7810a8e59104d36035c93284988eb708ba196d6a2871716e790e1a0120fd26d169b8ffe3fcc0d03683dcdba7d2f953f05444076ce000000000000000000000000000000000375313e7ab999d174735b5290bf9ea333a62387996bf4df3dc33d9a5212ac0645789ef4153223d488aa2fbbcfe808f00000000000000000000000000000000014b792fb5bc39dbfe409356bd75b195d7023bf6f715a4102cf36ef05b52fb2284cc0739fe5ad628a760049c3624a3f2876ed0a27553db6ac6d3959ff4c9bc5807fb7d4f0a56095ed2bbe31dbfa41827700000000000000000000000000000000006ae2c85b2b267c86320c4cdc56b1a09e25f0f68dd208e898ac5b1c0645aca3dd8000eb544eb666f4256806123480800000000000000000000000000000000006670390bd47829d3c31cf2da8fdbbb64b92b47c78d3ab638727ea834ea6203e45a9a023060056c69c1fb567c35b671795ce72b30d989889c8779c4056e441bbcd93629efc2877d36d27f670711e21c40000000000000000000000000000000011c78f1b6d0ecc5523dc089852d95dee641222c743dfd09ff2e56d008ce523762bbd9c7bec6c18e9885b7022131ad30b00000000000000000000000000000000066a1aa8af751eac5dbaf2d3ae285e0cc7a975c1787178f550a42e8ba89fa74a1b18f27716eb7ccc4f21b7957cffd8e806d220f64de05bdd6e1140c1e409fdc13f43bd31cd94e633be38ecf22ebd77db000000000000000000000000000000000cbc0fe6b4956c0f7b9fdd36ea14a4d8284468c280605a31536636114759ece1339f06e050260bbf936b560586e7d12c000000000000000000000000000000001213bfe642bf78554d91820c362b73b7059cf20a0aefa5855f9e61a0490d165f6f61416e135473e2de54bf97cc14b8f6257da8ac7d23c5ed965d8bfc76a642a36ea6ec4c45baf6882021372e8643f0980000000000000000000000000000000007cac206b2d123cbe9375f5c913939b25886a51c857271a59cc2fae2e9d669af0ada833c72366f78be265ff9db049d0e0000000000000000000000000000000002db3f65b6fe7c6688f8d3741e448ac6ff322b8769277572f0198dd6ee8a99397aaeb9addd0892286a9ec6028bf9678863d017ba8c7ed138b1bc70141abc5cdc3afbccd8b1db5a6b5f775efa62b8dbc3000000000000000000000000000000000a60331f8e8b26e97366c0e4cfea158e78ac72d63f219e1abbb670675bea008609f7154752438d9c7758b2a2e076da7b000000000000000000000000000000000d40d90f498a2855ba35f1c4bb3c5409b87062d7857bd97dd37d6e5fa53c94c78319c6b16bdcbf2610ba379d50d131e47a16e23e37ecffd514d47199cff249415a6d366fdfaa82450f0744520258955c", + "Expected": "000000000000000000000000000000000ddd3c7964bf51207485b0575afb6430cf801bae388ff78a69b8173c27431e0593584f9e755b99a5b2ed3113b3fc0082000000000000000000000000000000001735fb40978d364be3521ada17c3ae74b2a738b412906fdf425bdf13ec09e5acdf29013b03fbabe889fa261302a7ca42", + "Name": "matter_g1_multiexp_25", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000c52993730e412fec923e33f3da42adadb5d87290ac4448d7df9b401e28b3c7fe7f49c7b7e4bad5412c815931416303e000000000000000000000000000000000db71c91975e41b3f12e303bd8ad15f7c9836b146073946129ba3815bc3217b6116a2a03137608cdab8807d5834eb12026a9bd0a71fd58edf81459152782733536e960d27e35f9f84d00da256bdc118c0000000000000000000000000000000009657686875d82eaf4f93f3e710c467ced1348b60aa47658992771195660c4b96798cfec584ace3bc64040666de71f8f000000000000000000000000000000001375f7e985d987df508321c3d0aa7e7a06cdb78117248e19c3344dc443da319f49c00ff605c057d1ecd942e8b04a5e4ef1e168ab93674bd7f2bf73318a48ef17ef4464fbefd39f77c17ebfdb24d679b6000000000000000000000000000000000da69e098b5e2c8be2ba699f20fa38cd27b9c78025e071ecb2d9fba3bc84b1e673eed79f1887fcad9bfd5b0516236a1f0000000000000000000000000000000016c4ca4d9f15716b7efe6f9e61aaad880423243b2d5ffc96804fc70f29b633dc16474f7194b5e3ca12ab5a1627da580f97fb0d947d71a1b032070a12588b85065c19affd0db53e466f194f04f58dba2e0000000000000000000000000000000005370f5c60fb3bc36ee208e8c185613390748452cf6191bfad06c9bcb52501873bff63892066e0afcb01a0204cbc951b0000000000000000000000000000000003c7a2a97cf7be433864541082bd04467bbb42b2ab708866c8520a6582cce5225af13acb887b6b6a8d627c90e43f6e7b640f850bad2f22049f2f8aaf3ee57564fb38a847e428e252f003eaac465f7d67000000000000000000000000000000001820666eb1abd6144df2f21f2d46096410274e346ba862aca0e62d293fc64a6fd213dca4ddc1a4e414796f59db4d6104000000000000000000000000000000000a2521c021f2fb7beb76a2ff4c7ce96cf1d05823ad8edd9b2021eb39c08e0c7caff505ea76bcff8f6afb6e8c2e81d2f68bf91051da5bce0a51bcba6f4e1b3c9063743646f4e75e3e5a8cbc84e8112af4000000000000000000000000000000000e756ad1ccf0404e110a778f66ade3d10464bf8902f646f7d7ff38d15ef890bbc6d61d48122ba6edb799630a62ae084a0000000000000000000000000000000005b322f44f07d3db292c43f9ddf9ac9e44e8d16c07537bf563c98e02c2705eefc1013e627567ac2a03698268707cd84e8da771e0e827a52a2f7e79e0e5d93ebae04c1ed78cab87d4353f24ffc52099b3000000000000000000000000000000000420b819a63b7ff7ce541661c5fa8cb107cf00ae678981b3fc1b568174ae3864a8241f1e9b656cadeeba232156e66feb00000000000000000000000000000000136fe878b886bc14fed061cd8ff1fa2d85f05bab922bf18a1f09b55c331e7cc9bf0f9860e9112c2f6242b6d1124851dbd6cff707bff10fd53ffeff8e9400966d8ffba6d4ad6a8e7e456df10f8f5ebed2000000000000000000000000000000000b73d3549a6b2f76741aa39ee9bc2bda8cd55759bbedaa9ecc5802310b054b01670dc803938aaea547389d7b0ceda469000000000000000000000000000000000227fc49bdf53bc4f916714ea9789b526aa53efa1eb032c4030519608c62434443847cac82a13e2dd2eb48f73473d8e1e00831cce307cb44e8dbd5edf24f1535b837277160d2cf6daa4e862e57fe73b100000000000000000000000000000000167cdb86301937bff18287eb0b00f5224e674953d70258065e5e8370016cac8194ec8c2f44330adaea44426aaefac7d70000000000000000000000000000000007e9128bb015f01aa725796d7b7851f9c2819a8a578bc7d3af02f7328c922c26335ae9f87756f52409c446852bc710ada8168d56385722f339a5b27fc25a88034d348e3d533ff4dc99d28536c1c09a770000000000000000000000000000000018bd46832b101d12f95b21332b7259719c1f94c056118d877324656d285f73a4fe2cf637cc62a45647db92ba9d6c7d18000000000000000000000000000000000fe58fe2c19ee903d82da6da8713863423f10edb954606b6c56326eb8eea6c66cab63b0c816479f8107612391072c634b929ae82ded73a4876c041d2e52fa811882fb8e22690a27cb4ad3ca05169bbf00000000000000000000000000000000012db7fda36505d19a2c6ba5072044154f444eaaf3e12cce81ea74f28e691e4b7a730095667a71308db5e8322e80fc66a000000000000000000000000000000000fd0f22b05bf82688ac72e9ede526bf806695ff430ff3c750c2946d58ef90c778e4c5693d152e39fb1837bb10cf5f3be36999c516d4acdfbcd488d39e3073db9db6cdd0c0fd1d29d58294ace6d2d199f00000000000000000000000000000000116ba7b6faedd465fd4d1e5f42ae80c133a1d158614894ba663f87137f6108ae03b8e80bf32852ccce78b776dc224c760000000000000000000000000000000004c3702ff7fd9c74169ea76c00efb7b475d45efb12e1b5b700d47a970ed9f95f46e4c0ac66cd12fe79d62898b24b54a0fd0bc405e3970dc2bbd7dfe0c54b7c64543fc241000adeef4f7aa2f1dd2506770000000000000000000000000000000016254d89b0e2a8315253434d5444000d9b56b8f43d3c20d17fd26da4c8e7432d6e463b71a5b2a1a7f559a908d73abf6a000000000000000000000000000000000170c490fe3962fbfaaea1707bd28ecdd46ba29b5d8a0a35baf7fea4eaa47694e680e47e8a9f07d25078274074e232dcc36afa3c8581df069292d53b8ce3e35ca136a0b3f95a894958105fde9c77e39d0000000000000000000000000000000007a7fd283d64efef7094fbd6162da2fd56399765b559674c18d1cf6df51036007ad6c9af62bee534388ea093d3cdc3c90000000000000000000000000000000012fcf920eeec2c1728f3e620fdab1f8a0b99c6219f44b0fd19d0f7f4a15d1636fce7b4701f9c3963cff9b030c3759fb20f0a2bd678c5858be2a49ca54de8716fdeec84e1935b8f44545c740417efa7e40000000000000000000000000000000009bcf0b2d49ce38914ea877832eaa3f1034cec429cd9fe0d06ef36691ac8ac6b69a712792e31afc700872d08c2e0fa48000000000000000000000000000000000f5fd9d2d4710d1cc6c13c88ae602f584a7b671df91cd544697070eff3342d80d750e15e09358125d15fbf8a1ae8df93c8e420db340ef2c1b5c6a71645e303eee95cd93228770b639287b14b6a5c59ba00000000000000000000000000000000053fc59a0b84028cbb3a97dc3124927d6a0eab1c58d4c6d143462bf73c0c847712bf22557a1181750146fe63e9c9668b000000000000000000000000000000000c1fa8c1539ae702bc9441085a89790a5dcac9b18925cdb1e21b95c9f7286795e8f36e7a8b4c3f4dcfa12454624911675398541eb5a03271e2ab5ec2aeb2da80e634f63a050c25de98ad13e9d63d09bc", + "Expected": "00000000000000000000000000000000085e4232f0daeddb9e1ec8731855cf855d7dbc05d4b82d10b77a53306ee7a38ebf45bdeef1981325a61ecd754944c84d00000000000000000000000000000000061e32056ac411c3917684356a6ab3c7068f55d30ebcf8cfe446c68267923e4fb98596aded9740dc7944847a2e617fea", + "Name": "matter_g1_multiexp_26", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000070bcf49d6d066afa9b008fa22fd52f63b68a648bfbb5cb3eefd6feae666f3fd0b9a8447f427d5a9db52ba49854db7cc000000000000000000000000000000000947d708a02cd0a18342bc04639e8d126fc4c97acb497aa507e1c4c3912b04bdca886b75b9b9e1c5ca745acd090433119f99387baca30b9cf63ad10c445daa142fcae1ab3c0a366a068bb5efc9abb3a9000000000000000000000000000000001023942a16150e6497289627dbb0205a7c34afc704232ef214a6609125e90260d68b7c60600cd6f4859ddcad46c015580000000000000000000000000000000002da96265b7460ea6a8d51122bbd2442c6784d4f5bcf6d8b0b6eee6ec82e4d03c9265887f88c106792795837c02ed76e4283a1773995bbc97a6df107082fed4ba40e2d30c5472a25a7643ca9e78b8b8b000000000000000000000000000000000d5be6f99bb9a2379d1e542ece048164fa5d14e0c6c459180717b3da46e8446e9def576635ac1124e1390196fe97f39e000000000000000000000000000000001482d8339b402e3bffe61aaa298c8bae4286f1fbfc877a66e21cfe239bbee383d701d95a6c2b8193d67df5a551bb7aba7f4202d670fc3b48eaa92e925f48821d2ae057d90c5f184edcce9ea900ab51a6000000000000000000000000000000001969dbab76e6a158506b9dd38c647d4a670a21458a9552d903ac686855fe021a7dcabc91e712aa252de369c9234fdb59000000000000000000000000000000000b60179a6fa6146aa6e57b097f20944c123916c6722fd7e606aa34b8da579f6c126dcbb251da7917076a83e2e4b02d32a76cd8d292a7053c449cb98f13cf768c6e37da9d702af28c16dceacfaf9cdef5000000000000000000000000000000000e5fa0feaca8dca2a6b4a42e4a291383ec867f12b85593360f8caec45d31109373dc16d985a4702e3b5684774699e6b5000000000000000000000000000000000ae96f4a4ac0d0a6fe6aabcf902eb0765aee9ac81ad09e7e097d649b0c0165de6ad7e5ffd4ae7d8a272034f28c85ad6f97b7bf8acdfbb148814afee1df79aea17261dad6f78772111a6dcb021d8c79d00000000000000000000000000000000006391a93eb14641ff145f690c626ca412af266d50b903f7465d9a9b678025a35a68bf1962bb5ffe76ea07989a7d807920000000000000000000000000000000001a90846cba7c708bf8b4bcdb3415e17e80ffc9b48820d3307362327b29eca0d1bb7fcac9c09d09fa309829679080b36efdbd5953bc33bfba09fe7b3ee22c46c3a86f557e4b5f272853e67fd95a0f9b0000000000000000000000000000000000c9cc9547fd49cb22986f7a1dc1da89b05f5e7c0d3cf2179f22002df9fa2c586bb3f1496c0c60f8ba36b631fe74c8fcf0000000000000000000000000000000014f8e4e8c5a12b61caf4325d1e4a8505409d722e4eb16d51be5f01f863e5dc1ca68df1b83f546d22fc116f1654a3b30e9a331bb218b99fd38451483a10e8add23c9641b975af3897670884efef90d45200000000000000000000000000000000123292cef01012c3723b4713a345ea7648bdd8b8edaf76f149f1afb993f196f57b3315d86a374fb78a34486ea10e0c26000000000000000000000000000000000ee2389f669431df6697d79ba16d3e4d9bb4264c9ac146a772de6a9a8ac94760cdde7f613a4ae6592509b04b1f8233cce9301dc826bfe2988cf93c29ca9f01421b75ba63c5ed2cee1599122012ada36e000000000000000000000000000000001284787a11e0164bb197f69702d0d746975bd96a3b9221841c7193676861e97e11077b74e69f744c521ddb40689f9685000000000000000000000000000000000eb6c4c25fa1322f7c829691d938f87ba6bcce850404bab57cc3be8c3d0abcf123be8922af9967b83789fe64e2cb35f40a1cb530e8b828542fa4114de6aa936bd2be5ef3a9b7a0e20e475022381d62d400000000000000000000000000000000069f8970964efa22facc786291d6ffe860929121595fa713f4a12f9e99d8508d7d20f7d19c51514538d1ce89d2adb78500000000000000000000000000000000122bc9405ccae4e409c1aa22b36db314a19ef6e67a572f7ea67c247085205302ad12ef7f83d3616279892ccd3c456980cf2f0c33bd044e8c4468b4b7e137ae294c178e7b6c9f19878331fb93220db2cb0000000000000000000000000000000017b92fbdb00429846fb30633a2c3f383d32d0bd433d5a46e27d3c7bd6880948f89bf70b3f1639a18d308ba80b7209df00000000000000000000000000000000012374e8e7c1fdaa4ad4a2d8607afb62ce939bed23ea42a51fbac995e2c3026c2daaa338be160dbec2602a0fdaa1e9897e5f460dacc592bb947ff6f1c15b8464824aa5c957a645a763138ac1581ac576800000000000000000000000000000000004850419631e3de2617bb6b51ef19bf14dcc9f4c7b24ae817cb239342081947f1799080cafaf51ed687b9dabb2f3581000000000000000000000000000000001108a0463d38d617d0a778bf9478ab44050ec290e442ac41e23b526089ab5aabd5819a8f08f903343e93177ce4042c82f26a9736f728e16d7b8ce0cc59e2ccc848c181459fff4321982c08e9cac57946000000000000000000000000000000000c9ef168fadf7a056e6cceef0430f65a57b0f2c3372a5d3c533871c91cf81c40d3459cfdb5f1f66f53b2d8d50124ed15000000000000000000000000000000000483ebcdc219c4c361735aa0ea96c00c4908b9db62ed8cb565d25a7fa664829bcacc37a5608a3c3ea3a42ecf74708ee9ccf0a9be4775d65bbfc894f8ca66fa6f69d4249ea7f6b076fe193f2805e64f94000000000000000000000000000000000f7232dfd8367af413dd078f9d5f47b8c76c38b3ccc4110fd59764265e6a368fd4609b52c21f8e6db2c73908d4ac0b3d0000000000000000000000000000000018433b00ede4de21cd6a1c78c5d280af98b814f0a60c625f0a8f355be43d8d99346282b6d9911c4d4074fe827b55d726fc6bfb37cbfb10a1ffdfcb91d9a52883cb9a606f4ffa8849a6e07386dc9bb3400000000000000000000000000000000015b0ef81908ae275b2d5c3cbc563b8424ee0be0e1f2fb77f67749a79b7730d33028a136d133825da14448b05bda1409d000000000000000000000000000000000461c575bf65c6c5754a214c2e72d6d24df2cc228ae1c9f99d75eebf9cf48f20945a6483185337aa7c0096543dc0a527d94959e16f6d780628694075ba5aa1a476d89d8fffcf4b4ab7e6343c011fee920000000000000000000000000000000006e7385d061bafef2c731ffedd01758f153e2635c7f2bc42ea2efe29931697a1c50e4a13ac420572afc523b7316190cf0000000000000000000000000000000018ad5dac1577c9cc1e9ed30ab277dd381a6babc17e86538570abac44573a8c2439d97cbc370cd2b5d2c6509a18dbc96f122f3a5e940ee7e5038421619daffb8a6f433605f37e78d863f814b51b2ec4e2", + "Expected": "00000000000000000000000000000000020da97236c2405d3f1bf4e937d8285014a190bbc59a17b7163a292a2b825f086db5d371776988d1aa2d7529a64d2a4e0000000000000000000000000000000016cf6d7b831a81d0c487bfc3380a1dc8a1bdada61426a457993f7d6c9c8fee9ee4959324bf7a2425b070aeace3cdaff6", + "Name": "matter_g1_multiexp_27", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000017df783852d1f1f9c6dcf1975ed2dfacf3dc0cf942cbd7243a0cea7907ddb289f378ae59b30661d06d0702792ea9e9e2000000000000000000000000000000001717bc4192402e587400b4e7243db7e79fead2f878079c3af998b3a683a0539aad5d6c1e5da6e0a00ffbd10a2d891ff2b3908c739d505a1d6fa85a6dfb7a155202710b45861f1a8a7ac7bb3274a180cb0000000000000000000000000000000018c9cc123fd18d50a7c878b31622a3727864fa61d784285b990fd116567c69dbc7ed872866db2166c7af1812157af9040000000000000000000000000000000000f38e55466a6d1cc2512c1282f74f5c0c19777365819e48606c0a86d2c6aab8938475d15a74f24db868802fe935f6107e0e27a8a416eb38c989a66b84f037a5a24ef3358e20cd553f037a0a2461d310000000000000000000000000000000000816580c761a2f54c386cf60b1417d51a310bb7569a50b475f8d45f13ed6c1f11640079b5d6119270d616e77a489069d000000000000000000000000000000000d9af7b25803b611351f00daa88464e49b277de8d8fe22284a9001a13ed63ff931937d27ee19ba4000ebc212fe03a0390a3cbab01c34856b892aacdabe63d0a0c241ebc137a88c83ad22cf38997b211b00000000000000000000000000000000032fbde9d988ef200df573dc99b087a8ffbec95349256989774194dabea55d970ba303657837bdcdce3b59eb54669c86000000000000000000000000000000000d65e89d8df2a189761e04d35c9f4d3a5292d1dc0d083bc9a982a131b07df6250cc969a3534808959b583923bf02125cb386bebe0e49b7f07b0ac61b15306c2515a1ad6fd76a1825dd29a60e845c0e4a000000000000000000000000000000000ed3f47ea234f8fdc16e97eec7f4521941c37acccdfc422fefc6df9c1127ed293998945fb1bdce89ea18b9ec2b6e5175000000000000000000000000000000000a066fb6f1d69b88495bcb0f0eeaad2a41d5c6764e2dcac2ddb4ac340cda72d7b51b7901c758df15ea16e4e46c7053298902a82d33993a10c56b2fa3333cabf1c5d47a9c78354d58f70ce4807cf20628000000000000000000000000000000000ca7faa768ce5ddb6d668436e2e1692893d07afdf7466c00bc8c963b80cf0d44f6eb9a2070a7bd889ef692a81f9d76d8000000000000000000000000000000000f86fb53e3f061cbe777c7aeb63402616c428216a0c65d5d5a13cce1dc31567a4051420d54b4fc93c6bf263601046712426a4e2317fee033a226a91a52a5830f9ac2cf5f329feb6bdb382438b8a39f2a0000000000000000000000000000000011113946d8ed7e5e545ecd0ef30de293206f3ac50e6010fa7a1cb0371f47aab2d8775c51172c4dbacb05414e65fdae10000000000000000000000000000000000022a7b8af616e4076f625f8151d748f4f49e6dbe439ec695b854544f8a498c7e261c366a4c81be5b9cad85a4eb07c36de0390c05fb0dc9b4a3f76b51cf952a11b909ce13f9abc9fed6a349b8efa98ad000000000000000000000000000000000d863702db9f9e43ea311fdd7e0d87495ed0bbbddaedd3333108704417521b3da4b8ff0bf904710b0200453ecb2948620000000000000000000000000000000016a520d1162c7070030fea7702420de2a6e0f255c28a89bbcaf663c0d6761d201f07d86adf5ea6589e27bf844abf85a57431db9e576643f93505b5b25836218759e736c0d650a5221a652338b0073eb6000000000000000000000000000000001357cc987a4ee7c7bc063ec8cbaecbea0ace4b80e3af01f74d23801d5d37326ab5732222f60ad864cdc8c5dfd3edb37f000000000000000000000000000000000094fbbc2936e1730a1abeb42e58818ffe6dd97bed27a1e4fc090388d943763b055301852222503a2d2a9dedf69b3da26745a32591e359efa41e9ea93a016d2eedf1da112cddbf31818e8d687b36af2e000000000000000000000000000000000672e9a4eb4e8be8efab0595bcb7a6fdf269db71dcb585c12f9d7c1a8414b6e11d91373959d47a4c64a8890766f68671000000000000000000000000000000000203f3804abe330bca60b7bf9925a626eeae79d58ce7c71658b2fceb8cc93da9d455b6d59bb58bdc23b58238d4f01948ed37a5f4bfca6b77ff9e4f7e03bfed52ecf02a8f84ed3da6da2787a4ee81ad9b000000000000000000000000000000000c4e95c27fd983c31fcacb578a688c2fe055516735b5f1ea1415c5cd29592e7720eb2f548071fa3ac642b70e339757dd00000000000000000000000000000000067ab19ad1c97a773164e812771aac69fd5d199e4f60eb28c7aa5f09dd9b3adea959ab4ad47683d27394714eab4a40d281633dd6e729bc17ddc596cb1f17dc6f0e50c052a0b8c5a4c83900d918a9eb560000000000000000000000000000000003da3fcadcafc5eff08a736e4cacb1d6617c3f0850ffe33ff1648f783a4467163d1ddda082ba0b54e678b171b1f79618000000000000000000000000000000000a273fbd5fe99df4f724fb20ae0fee994823d374979ec7ff23dbe148f6977145de9a1f20eda777cbfe0fa4cf8c2a8949c6b019d29219b57404baa955f66cf1b2ee6571ad5b80d471ff6db569e32a1a5000000000000000000000000000000000015b74087be4a98f4c5cb442e4e893d4d92602b1ad36d0f038f232ce25b53e19816f44122e8f5c821b40a0cb36897fef0000000000000000000000000000000017e50b1e84c7e767171edbddc397653c35b34141bd69ca7123792d6f20532f6daa5ed18615bb364b72744f96d4a730be6a76411ce02b4dfc84ddf62ed26508a2dfa5edb5a98a6a20dd69e8b8e7ad2f5900000000000000000000000000000000131517851372c44894bf433d5162d0da394b87a9554e9d4f6174d5712dbf69f756c5da1534eed80f8596f906f36799a100000000000000000000000000000000130a4583c7529129831ad621cd1e04a8fcfeed67ea96db4932809ac140a089e6252bcd101f17d4653555b1bdd9ea3a9b5906098e4ad7e4eb2e996075c7cd660fbc399bc942f9080404b9d0758c4ae14c0000000000000000000000000000000002b8d72148ed7076656128040e7dec82ecfc2d5ed05050b27361a85d0fae6d90de6dc32dbeaebac039187e3883ab238d0000000000000000000000000000000004021fbb748bdffca854bfc5de8f69a9bec478181477d3c6e41a7da2fab3100f7e2737ce958c046d6447370d47e373ad94ef8c281a9be3766fe784ae017d93f608dc2cb97cbb7dd3e3814b5ade845d370000000000000000000000000000000015d1c5bda34c6fafa52dd3801d94a04c53a3acbe43cdd128de3a346739df5afc6dba58d63c7cc09d18589c41d9679cff0000000000000000000000000000000014367ab7f03febf90be2279a87890527935725880ae3d418ec055004f312fa0c42c8f6fbc9c319117f6ce600d86910f16feced33019b3b66d335f2118cd22b2952cdf9757fb3a0cff55b7c4f245fb438", + "Expected": "00000000000000000000000000000000130db02ba2d24a3d70439503b089e6da4cde7b5c51b1d69774b38ae0f265aeb8996e50ef077ec12199ffa3d000adbf38000000000000000000000000000000000de25ad8eb2142051fb2c97175cb4cb2984ddcab65dcfacb76cfe60f6a47083a22dac4f6e06e357a194249b7363210be", + "Name": "matter_g1_multiexp_28", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000016785db77cadde48a4ed0d2f8aa9f91bed9387a4766c3566217afec80b180461c8e1017297888e9c5896e509a26137b000000000000000000000000000000000025b26ffb3fa42b1a9e974eb23ada4b9329d670e38970e7abc937463e522887d777934895be0cfbf13d213b3b737a5f6cb5e7df372d346fd13faa90b0d6961372ce2f32ec379e5e50e7ed8a13942cd9d000000000000000000000000000000000d90bd38049f2a8de869d8a748c9ff3120542f38fca6e8d5fbbff86baaabf0f19dbf449cf23c043dfea322d99837f7110000000000000000000000000000000000ede89c8bb8299726ec685765f10167c5b844e427d3c15da6ec2c1d97de174819d52caa96d5cc938e93dd09bbd1e0d813a5fa1674c20c97d08608d200f3f7611010e6a25a790853ed4ba0c5aacf111b0000000000000000000000000000000019e1e2706e878e60bf6fada47a4d4028750cb27749bcf8fff531ec75d1ff9b3a1b5e0bf19e2758899c3d8bc96a18a0540000000000000000000000000000000004b5f00109eb4832ffc9108740f0728ac059c613654a771beaaa028fef06b6cadb9dd182cc573d7ada1dcaf307a8bca4ace10870acf190b373c19ce615e20e5cb96d3c6be3ec155f2b29825f8476b77400000000000000000000000000000000013844937de287b98db2b9631d8e36bc36ded8bbb3ebb2005ea5ab39a4844fa354b62feb7433b8fd3e72aa89ac8e4ff50000000000000000000000000000000005603183a5fb09ffcf6faabcb5042328496f8b0f83e8fe9031f9dddfefef43ee4525d1afe859177d4b9f966599005bdb8d9e38d9383f09cf0f8a8077f1d1dba091ff0abdf7e77c3b65c2df48d6c6f5360000000000000000000000000000000008ad6b2bb88897a2e53d4fb9910b6244faaa045ef32a2fd223adbe6e0b1a5c1683dca69c0e9515dccf7e4589f1e69bff0000000000000000000000000000000013564245d53366d8468b51f88becc288b695879a70c3c753933092904b9fa5e64e39be30edf1f5e9de7eb29c4b3cdfebabeffecf9b404c6bb2e2d0c78fbb8609a38e3d3187587c3848e8f9781b7e9f440000000000000000000000000000000003b587bba9173011da620ff930befccb7b43093052636d6632fb6e9b59b8d127ffa0b7829b59873ae347eccf0e6c86c5000000000000000000000000000000000363be6dee6dd9a1271b24ff84c6557adc62738805b31714c9f7208c320aff220c02b222b96c62af96f1eb42b5299a63adfe53846c0038203d8b8df0cb636aec7d4ed7f78b0b0c1734be448bace08f340000000000000000000000000000000009b403c5fe094f6ec4e4b9b7d098c3ca6fcd838e46a885506ebe8cb3d8b29849a8f3d8f9550f6d33315e69f6c1a6654a000000000000000000000000000000000714a7aee8bd6d754b9bf0292be50836e13ae886f7952c61afb1b45a02a2c378d6d22eb3eb882206a3141e43658a068c06e9d4e41b628be51690b86aa8938db066c052f3adff774d35eee1e332312d3f00000000000000000000000000000000115f7928ee8b8e47af2739dd70bbccbbd8c4c4f9b92868b981e407887b448745514b67164df86126a7aa53af9ea7a0ab000000000000000000000000000000000772b21e2bdc688f0b883a2ec5accd48a13ff3917d1c5ca8896faffca7e4097021ae3c348bfc2e8174db93e079979967b3d349b1546a8c235d60c41408c969a0fd42425f8b5ddc1fa5102d2821bde2c60000000000000000000000000000000011bbf90f59d646617a6d074f5938f64232550e189c6d8105bcb67a3607e13b4668701f64933de602e5daf7b0f4f50c8300000000000000000000000000000000153ff6cb6a6dc6b6ec086e2ea8122d23e2c6abb8d59c7535fcbdfa721ba505d7e9113cfac69e1d81611c72e872071bdd29b83950e79750e9827ed92856e4d1e1b5f0b47c6bbf3611a1fef8f2fc47659c000000000000000000000000000000001897421ca9a740a1f03d67ed31b3922d7f6067287b4addef6689303571b49bae574c343e967dc0f270aa4f91381609520000000000000000000000000000000007ab14771a4e256ec4009aa03af8caedbec4b3ab21d6499041ec58afe17175a656a7600c4bdac42c92efc9d2d21b48bb6b5ac07fb4a184dfed685b93d2265cebd02a3296a3b0416cc6a115242079752e0000000000000000000000000000000005e4061b14fa76d4c02d77adc7e07881dbcb023dca9dbfd1301cb3252410d54db87816a6403d18c2ea8c18027674133600000000000000000000000000000000079d3ca06d0878a569a3984858cac6daf967bacb3fd540187e47dc2c0790d6cfffd1ae1f377c75910f0b9a17d2cde2bb3a7a25ad9f02bf51fd73550ccde12374d9b151f2f6fe535bfaa43efc391f7897000000000000000000000000000000000e2814ce8e1011c37f6f7c38ee9543c65d0d40282793dec81b195b2d4f4b55f2d2b68416eedc6aba6e31b2234c3f08b90000000000000000000000000000000006ddeccda49ae15e5574bce201589758d7ab8baaf1348c30111e997154b6ba413c03e939e288fd95d808017387f1882947944c8c814f143f746175ba0b2d75e2ae73730a265d869763f0e986c088bfcd000000000000000000000000000000000b78dc15a4f413ea9c8b347cd82c278cec530a28d239694d051812c4af08b5be888064f54d2fa2278ca4734549cdd41b000000000000000000000000000000000a8c5ecc1541fd79771037e247357599146fc46b852536529b841bf4b21978a85dd09c01baf8878bc2b6bd8e36bb93c030f33b187df3516866f259ff959d57fa9c53323d5c851fdabb96e5ea470518ac00000000000000000000000000000000172140620e46db480b2a9f1b7f9d0b374c0fa19145e3349906aba351686e0b75305db408fca3465fd263d06157ea471d000000000000000000000000000000000c20ddfb4502ad34e0934812913e222fd9aa201b9e10b4af688031d2202663e9c044cf3374ede037ef0c7aaa82428ccc4da8401050f30459e026a207ca631f0684a10813c64ee86dbdf06b7b29cd97860000000000000000000000000000000009d75caf6ffb593ff15d5635502abd9ef88675210aaf98a73bfea25888c90b63de14501459a038f07ca502b2b0eb98ea00000000000000000000000000000000091c4826870da1d2d7da43fabda1311384f24bc6d7693ab92f59cb76a06ea129911abdc22addd72181c3ecaa15dffc884d940555d48649f30026f70450b2caf2b8f7148b28bfd4349458ae89c323512e0000000000000000000000000000000011e977de99564d61c5e0d1654ceca0d0d63dc09a6dadf6baac980bbb97f38513459b391e40c09329d22be015fcdafa6700000000000000000000000000000000119164ddb3240c59428f11ef8c7e0469d219a591b926296f394048dd59a62a21ee2dbcca55f79df5cac6b784a2e06bc5e140e30424d2cccc91be1fd3a62d9ee49c9d64fa062d9350b3fa567ec21bb06b", + "Expected": "00000000000000000000000000000000073edf80ee80c7d1675d05f8bed28da759098f44730bcde3ca1a9a8e286ff1791fbf22bc36de06d88b20f7f1422dbe38000000000000000000000000000000000d52fe400f41b902f8801063c0f3e793bf643c027676e0a1ad3860e5455bdde58d988b929582823e5d7ee0af8987c551", + "Name": "matter_g1_multiexp_29", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000004663e332c105837eebfb9ecaf524a8f7f4d651f3eeae6909824eaaa6250c9f7fc212f98c6b3d4c08c5198477f240a8300000000000000000000000000000000057144a8578437c9a10a7801fb179e417e9bbe1b85e9dd8e2208943978cdd77a8345d682ba83950e174c6cd39c9eb936a57b2c351a7946a20cbae1fd789ecc5f77376b09e911749831e9b5680185b1530000000000000000000000000000000017c44ab586ecd185de616da02f99ee799487b32baf2470871865baa2b2e3ca20f61e6c82d741853b71c5578199d46afb000000000000000000000000000000000c77154ab5f0ba817b30672367bf1e19f9e53a95d7fcc4565f82f604a07d5eedba2182cf1bcca2371af4d1bd09146cb98fbff9f8ac4ad10718d46a857ba28f182263bf2d13c8b6a00902af737dea56160000000000000000000000000000000002df334ee40a5aa144d3727ec6c19d8dac476c01935e7ddbfc164112e35cca9180ffdae5e56f1fb31741c327b5733d6b0000000000000000000000000000000006c1721530a765ce427eacc4e5679c42591d5d1443f0a1bca8a87dd19d6a33b731db6561c50a35511735324c5f402858b061de16f4f609c6947733b58c6444fa9549721fd9a2459652e8e4b8c69b5d6100000000000000000000000000000000016682e225b46618ff794f2da02a82e40193289c9df4ed6985b4daca3e9ce9ac6e8ce84a3fd6776119ae1a2e84f62e73000000000000000000000000000000000e383f55e44fa8528e80fdf391f2804f7b7f3367e0db07b78647e9ceeba5fb151a5b867bafb2d9c07a6a572ee71c2714355ed5b57b28451ad98fbacd5ae87551b7304e4ef5cf7b7dc443a66432406f9a00000000000000000000000000000000176de8a3ee21e803ec6fd42f7f297daeaf1541c08c5c359e286ba65b78d7c31a0a630a2c73d2e886cfcb289783f30cf20000000000000000000000000000000010645db8d7d42e004c4f76bb2fe8b99a3177624ce0c1f465e67f3767bb57ca80ebadb12fba65bd021106e17adcd8553430b6eeb01874ff4b0fb07dc9f23d8e45455c1480eba7fb3033942214e85a77200000000000000000000000000000000006c151767d1066f9567ed86f7759a6f425a9a130a4530a2dec0913e4efe2485dd4b0105f453e90bf27cbeee5d0482af40000000000000000000000000000000019a081fb1fe2893f1919628cb8a3b332ef072971fe6ea7fbaf79d327440274a589045db5d3f06d6dc32d6bc7038c528b89a697a0e8d2cf512edd2a3c3df354eb30a3eaf697779dd9270234b367c2b5ff000000000000000000000000000000000d19d55d1fa04f886078bba50e09ece3a394f3413745785c16d17c5936941345e42e4ac50cba055d79f2d813c69e0b20000000000000000000000000000000000ba513864132f44be3056d3d3d1fe8d10b8be954e785e3d07f816875a3454fb6d44c1a6da8c9644648b46dc7d8a0b67120b72463d54ac1d8f1b3f56f0f98861768b05d5174cf1883dd8eb0410420d5620000000000000000000000000000000019cb4ac7844effff88b242db9908bd8773d91cbd8e076127493c548350bb9f8230d57a3e9c4e4b212e5686bee925d80a00000000000000000000000000000000021e94fbe9881b2f5ce2e8d777a33336fa21c24818cc1b6b699f0bf5cf1f22d7b9fe85be05d09509b88391f78eadf14e3de7997113708f9d092836c2b0b59abf710d8401baea6de73ee0689436f035fe000000000000000000000000000000000c6429ad7548acf43bd9e7fd9ccbb09b5b9b4474937bcca985a2d00c62cc8b72e07e725a5d447e2a92a6bb9fff0c50c100000000000000000000000000000000135ae562ac2225bdfcbed36817c8deadf892da1f8982f4bf53271320bb4e702022128dfbf9e48fc6623648878020c1a67fc3d0560432dbb721f8a0610f0db31dfdfea8cd5ebe8da3fe3b8ac5358dd4400000000000000000000000000000000004a813c60a1988f7983f6ac644a66369153319e3bceda90fcef6fdf3e53ceb04b2c5d240cc65aaeb2530e8931f1a962b00000000000000000000000000000000141411938210cef5576dacba6d521bc46b13ce9c1f2a9aa41a0e9b56639995b69b6198f2a406ca5e471cb0a48233985ff0b271f02031a126f8632e30d8b17cc5b57de7b8b873e0971ff392d4246a40f400000000000000000000000000000000041855bc5957b8649451b7d91ef58fe8e0770b113ea3009815e60cb36c9b7ab797b4448d3747fa9b64b7fb50af906b6d00000000000000000000000000000000048f78b763a88fb7122e117ea4946a631be83b5ae456f0c77a16f3f2b546802bea7117eb27e23a5db65d616966bf2630f8b5c136aa5e2d670edcfb5bee9ff6095d85a332ad55763fe1e5e8babd145c070000000000000000000000000000000003ca70d52cbfe2c097c17bd300f4baba1d03951c6dae613bfbbd53f68598a71d80a285af1a16365b5b82991599ae8fd0000000000000000000000000000000000ff454d717d8518415f23ced167ad7ad1ec76c437e29fef81b5604e8bc628b320fa39c192f32aa6201c2b5b4035cfddc285193e7c10646a4601787edfad3d76e19d5b013a0a954873d92bd5293d3258200000000000000000000000000000000098363ac967c6800b28c28afe92c1379574ec11e0585a0319273aaa6b92322563ad56144437569f3b9cd70ba9e7f9e030000000000000000000000000000000006e4aa226ef031c07150bb231046f36b8ced6b795b3e3f25f707435abc214f14e0c420c699f9c880e8d647ba85d467ef35bb2175fff61894ccbb69d90375df627e925f1ac430a349e75580dd39546e440000000000000000000000000000000001ced5366374fd923b3196d8f6e35900b80d01eeaa6ac41bf7d05d1fb7d47810eb8cd2d1ab793126edbe863be4c1224200000000000000000000000000000000010b27a94ae8413494e0560a10ac71554ff502be7e86cd9760b0d4ea7d1df926cf7ff1661b7902fb93ebcfd1542619caa25856e5fb9547c48d41783bf2cd13493a1fd71e56b9c7e62af84a1f6cdae1c800000000000000000000000000000000120ffc413256888669dce253043ace9a8c924f2996d73ef3a64d76d88dab415c870071a22b97da222361dc02d91cb25e000000000000000000000000000000000940f2259f4fadc3bfbed20ed2b80bdd86f30a846d6167661339e15548f6e57030fcd0be99496fa406a2d025077a4a4e1155c0b9c4185025310e8020eb52abb6f2f1780da15e4ba81f3c9a88ed1b4a640000000000000000000000000000000003ea26434b5bc703c242cc5e84e17be5c7777758f0b232feccef6d200db9a03f10df46cf0eead48064f8dbbccccc3369000000000000000000000000000000000649df5d665a64565079201123e954e78f07177739d082c2bd0aabddcc13f9fec6ef082a1348a369e446b82181e52aadc5610b2707ce84ce67e82d5c0e5f5cd2c90925aefc1e39468ca86475012df045", + "Expected": "00000000000000000000000000000000110fac33d46271daf3924995a4798b3f62c79562d3b44f736b91add9f2af779a614d4b12a9c0d7c60bcb1f104b35474c000000000000000000000000000000001592121fbb147085613d1b647cb0e4a7b895bfd4e5391b45bcb287975bbf0e5218078d3e88f8383a506550ae07c9d167", + "Name": "matter_g1_multiexp_30", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000033f3c31337bc48622d27a9a3224a2acdb5c538a59b497a4a85840c81cff667ed0a0e4e3f4bb23a9ae53c1e79ea54cbb000000000000000000000000000000000cf0dc22af4530260cde26aa0eedc83a0ec3ae87d024e6907f3d22070e1054b3d4f24d5ace7218ed44763af6ec3f25ee32fac970e52778cc90396a5ba92ab98e26499eb1ff17d4bc4c1f78b64887d3f1000000000000000000000000000000000935dce5baf85335575af5a6801b36647727c3e28f224cf25227bfaa52fd646d6fdf0f24466631a93506a58b5f2df9b70000000000000000000000000000000007e032c51e2d9aa53a3120e5777a14963af8a9fc65dadf5da779c5ade6aa043ff496cf4f33e2672dc5e10c4a06dad86a6583bac9672a77f2fe62bea4364aacf62d5e10eb3a757fa0595a81f76543e86300000000000000000000000000000000178e7b4d05c4b7762b474649b38a5ce999c67ea677fee77115ce7e55207d87a82b6d05516ab41c2bac294fc382c0e12400000000000000000000000000000000126e5aef1a9729c73278b805cf102934239d1f706bb3fc3a81f3726feb4b3d2fd8de69fff2f20d5e5217edabb645e8df5a8e1d77c9e42a187054c938a8a5b4bafa834021b727036ed3941b1c1deb9d030000000000000000000000000000000014760b82d3b4949c67d38c6d9172e12bacd52ed49f442d781aeccb7c0444407629e3b7d5d5e1be996940966785940e46000000000000000000000000000000000aa2d6391e40e50ab9ece25786a42e8dc657e9112683279b143be5665bca43746244c27352d3600dc62c2c1c7776924339c02150e4e89b25563985c7802c0c43d00c721d521b54e767c1f509f584bf2b0000000000000000000000000000000003f7c65aeca3fe6e67c91e1f284be35149276a9d9c0c1907010d8ce26d5c88f2a68b632530a31e41388cfc97529485f40000000000000000000000000000000012b9322902ed50ae50e3bb3e07eddec3245df27f193fa88a7685795990a5fecfa4be4b5bf8b0702897cfa369d614eb942196ec0e9d2f572856217521fcc5e2869f16d5ec5fe76f7d350698f55ff0c5650000000000000000000000000000000013995f89bc17b99384e389c9a768fa4bc37526606966a74a370c9f964cd9d3a7dff9d6be2319d2c8c9d5ac1b6f5140b20000000000000000000000000000000017b32d8800e21a4553a1a15ddbee029788f58023164e65b25086e0dbe2ee0c16e519dcc4753c322b50c24edc305cc26d8df5017c9c35604f061a7095d976d08bb3570ef8fb518cb606cd39a3060157ab0000000000000000000000000000000017601971d5328ca817108dc9899c9c3b88aeca2ac5c03f70662c9bf6bf3e06d25fa4b7150e0838c21c9b089c7102a17700000000000000000000000000000000198db85ed42c61e1137fa50c8b2a3ad2eca4e9dfde3553b8ff7ee3aa6389d73c80d500c883e52be5cb9fe8f828bba84f7b82e7e565f8a521d1a9d0ecafc029f76b70042e1ec36c20e3789b49c7e50ef0000000000000000000000000000000000c830262d029435b1b857e7e3cd118e8a6825e3e413f5a5f67b37da686f442577c0beca3e86c13ef6924472305ab54b10000000000000000000000000000000003d35dcd36ea7352d453041e821dea655422ae01a50731698af020234e3ddd38140c24ba2af296a964f4f5896bc0af8c8260c1b7a249ba215f0dc127a41876f858b20f4422140bb7695c8f98e4c474d00000000000000000000000000000000009830bb211c58fdb25fb97a4ba226ab03516911e7b7d98f25b94c827774592b5d5c56edfe3c3040454def1429f81c4fb0000000000000000000000000000000003f34873ad16852f435cec18f977db00f786b7860c580ae0dcff8f03a8a1edbb417f01e0dbeaf035b6f60b733f38a564cd68d2b074d038ee0d9887168dc16805ed55df26329a4c0e062c2124a6e50667000000000000000000000000000000001718cef19fe02a179385ba031f23d28e20e7f57ee82db31e632cc3530d17291e54e8a01564963835c724056c53f9853b0000000000000000000000000000000016c44ed6c85628341789e80e1d95a10399b6ac126319bba3c66bdfe6a40f2b06b721a0867c30be1356656cd36e6370aa2a40c2e796148ed1c539b0584b90cb386844fdcde5d3766cbfb1d1b58626fcd10000000000000000000000000000000011267a6e9adc4b547ea0f42ff6cc9b35a40c3cdfd7ea3c4169fe1efdf533341969cc591f26fe9a48a44e544c515339310000000000000000000000000000000013d878f761efaacf28677577c93d825336698772044266d469b934332412bde9ad5deeee4c1f534a9fd89e799584d3394a1e176fb26983e549aefff9aeb220f50e071222073422dc2c44abd85528ee280000000000000000000000000000000004ca71357762ac2e9bc1f53919ee2c19d071fbd3918f5948f32ecc78be1e65672d12afb4d4a8df41a038bd5448bb0a04000000000000000000000000000000000b80b54ce782afbdad1cfbd57a852f629c0452346d5b898062a8abf12c73bf79296564d3fdb867ddd81156697a00f03ba62e07bb97ca3805ba2d30f39f44e70a7b2917889c26b84bac8f9739bdf764090000000000000000000000000000000009cc641fda19b0e33065a35e74a7ac28ca1bd3bb8a7fd350244ad0cd5dc89d91e7b2865e78ba24e112589e298e6c5cb40000000000000000000000000000000009c3ce4324dacb1e2ca82f4ce6a7ed1292f204f4f7b2c5e0086843546c5c00d16be4e7bd9c979ecd3af590b40b0d70a4a14278fe7a08174660c08323de272b2110047a1d1d8bd0e3c7d76dde030e00a60000000000000000000000000000000016ed972bad2d24d80332c4aeb1dc012ae4fc30a11597df1ca73114945c20e337d1c424e636d403141c737103a4dc02470000000000000000000000000000000009ab2d22c0161247a3c4eee341027a97009ea95bfd45fd186e15feaaabcfc09fd39dfeddb2d3631b943958620555fed81f516ab5b36a59e6300a54d17363ffebba35fa0c64cadb21e541af5078545b40000000000000000000000000000000001721e0fe2ebc0be63df10f4b9db3faa5c5fc3ada0bfea176c4fcd1cbb696779c03602cbcc1da3917dfc09af72fa3cee200000000000000000000000000000000192e3e3b5b9b087aba72b852319c200451a4976a4e7cd817eec04c007c8a2f800fe0bf7834d22a21c1989ad8c6ef73973bcdb23f9568e409271b5f907fd64b0cd81939a52a6db38fd8d95de76213f7b5000000000000000000000000000000000159c5a01e76ee666e8e22aafc77e27705a633bd3d1dbaca92117e4b80f917a3bfe80b36d3fc7721ed2fb8434558c780000000000000000000000000000000000c8c356e19c759e1eaacab45b4fd2e0b42dadf6aa2ee8c051b8ef4de0c4e583fadfd86ff6bbfca1eed42a29afa470c8c1b716b02b3e94600867e019be166f4532d264e0aa65d723dc0e117aded59245d", + "Expected": "0000000000000000000000000000000010f2b9ae629ef12f213e6408c94601482c4c3cd0ee33e3418c86f0b8092d1a1ab7d2600140f6e1231297c3bee4a48a9400000000000000000000000000000000018446e6fc72ffb3c6c25d6aee2d9a8bfafec7b4f63dd3f98fde09c088876c7f4d30cc0ee31985526712228766ad91d9", + "Name": "matter_g1_multiexp_31", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000de77471af6d857548f26f2ccea9c33f50db361c59b097fa481887b5a5deb4fcbaa25ec1008b131fedd3711d4d3ba029000000000000000000000000000000001037ee7b2005032974767d672e14be86177621db0ad5d7df5faa966b0e7db6319ead334358142feb370f60cec698f3d1bcfdf0495e49dbb8a8f9a0dc517351f39a6d823dcd42715f329dc78400bd74fc0000000000000000000000000000000000ae57db1c0d1575c49f8b049667e1c8ba0ca863fa56ee58a34ac1ae780c92418ec50294b666a0f99e0efcb2686a4d27000000000000000000000000000000000aa08900fcc4f9b551229b7a8a59aa9b337100c68703ef60597f6acaaa7c1ce910e643549dd0c328a7fa17e44b68de1cf095238bcee61ec1317c0f98ad4f8f9b39c5940cf37a8a3a676787d9dda994380000000000000000000000000000000016cf186f3a0ee77c7e990ec0784d99510320114793fd7a672d5f739e9b0f1186faaa9d5914860d66173696c603173b3000000000000000000000000000000000124f5c20e988b460c261d274251841cadf5c99a12c9ae8b4b3baa7fea8b592192dac3506860b15289df704cdba1dfdbfe45a6d64cac817cd479a501c77b6720c6777c6026dbee471b490fee9f242a67000000000000000000000000000000000166434c1551befa708de9201c02cfe18020d18ed881ac4d154f5e560995f302b57b1694740f76232307ec0ff729b2709000000000000000000000000000000000a961fa3c19068590b4c252c0429414ef393ee071b02a4ef15f6a5c722a73d145c8e058ebe1997058b38ce7961860da954868215022673de608cb43a3cb74ef2073ffff34c54fbb43f19b22a02bcc2ad000000000000000000000000000000001618c78e4962162f253729c4cbe326e7ea7dfd6d5cdac1b17353135485d434fe7c4d857df673793e9d12ee65dcad4bb50000000000000000000000000000000016921790d30423d878255c44966b316f9c29dde6695d66a97139fbc6fba9c4df9e291c308effc424e5e2134680846fc37068c3ba82e52fce0223a9f28c1d42681c7863c94797d1786c1adbc3e6d10dbb00000000000000000000000000000000128a8a8584726a4aa2cab71853f843f49efa79071a8ed0a6ed2c7913fbb85e254184d457163fe647d0ad719d04e6857100000000000000000000000000000000158d36271e87ac2879fdd3f1fe8ff306126adb340ed93406951e372a7f7f3deb1c347ccf598f2e007d92f502038bd4960042b8005283c7b91ef4b3ff7e20a91349c8c3d1301c9b54b901e8348a7d186e00000000000000000000000000000000047e63ded02c49b7126a1023f1ed4a0af20c2d5e95718f474e4171c0fa888d7fb53b6a2bfcd47893aef6657f31071167000000000000000000000000000000001404e16f51ea45098d5bfa00ece3df841a3a6630bff2b02a8063ff9af5c3f149e504f04e1fc9d9bf35324569e8b2e1730a3eb64ce8fe140d94956b0685f91a5462dba1a90093e803dc617559a66d20da000000000000000000000000000000001866eb045ddc4e29fa612a31a34355ecaaa8482cd0885bbfbc5cc0b3870a86a2b4c3f15da23638dc03619cae6b721f1800000000000000000000000000000000086aeb6a413db889a86bb3fe036486b4e26dd614aabf575f8d63614a300df8a528c9f6d47d59daad59d840f591063b22ec88ed0eac8d0f2f618530e91cdb9ea36b8d56c1001a6792a09e11ff65fc02aa0000000000000000000000000000000001765c386f85f7282251b6054f03a3941d44f9a8ea2814a49f75519f9fc985133937e2c9e06b59441a6d9a95c806d6b10000000000000000000000000000000011db74b6bd144f9a0d48185a3e9f4adbc79131764b6e82f11823f1bec92245a55d82e6d949f3378ea6605ec84f0613285f03e53ff983fe4886a3dfc03a353fb77927d7a0d1998a1c55ca7421a4bdac6f000000000000000000000000000000000bc9a01aee9eb527491f7334959b0f4275492afa38044f0e6dd222a3704f440b5ae2120e8e2798179634c65f3d674413000000000000000000000000000000000ff19f94b6802a4788c4fd84f66b9be03fb1417544d56d0e473caae0f9b9124c622e6298624fa1d53886fb5ba8b470fdcc1b04dc356bd348211ccc4c50d12cb382660a4f9526539c2a0c52b021ed2165000000000000000000000000000000000df5ceaa6ca501d1869b51f035c19c0f3f9db39c739f882a380930cbde7737790b25a2c01e65ed477755c2beb16e97f300000000000000000000000000000000148458f4ff4fcf8559b9f8a2ee4e486febff21d91fe4bc3c77988007cf700186894f1c1fa18ee3c4595a462712750d3097b584ee05c27d45390aba36772ed49d571837567e95f1fd3ba3fc1ba591672700000000000000000000000000000000029b16c9578701febf6662da833091deee23e647a15f16895fc057a37c153fa738efb1742c4bfcf27eda953a07aa01c3000000000000000000000000000000000196d74cfb1e6472b7ab67a664a7c46ad0377c2b465e12d94b035b4b79c7e358475339e09690557e4b280cc84391eb84752542cd551cafc5d50852526ba0a23d274317e1e4a6e75c0d19319e5853b8b6000000000000000000000000000000000e005ebdde060ed0233d1b1d6344b8d21f8cc1ceb6d4fcca389303e1c44c5964a4521dac8ce225e2e4909c4b2a47f622000000000000000000000000000000000fb3185aca9683a81d41a17b3a6048e75549d589354d4652756a4663cb25b9fbca1bcb9158e2ed73765d03be4e2b570f2f76a0fa585828f79553fbf3baac6a2776b782de66dedd6b734f9342e734ee300000000000000000000000000000000004df18eeff223e3a255e6652c3d14a6dad17c76e0597b43a6679a85f78d4bbaac1e2fc0ccf6a89149dc18045169345860000000000000000000000000000000019d60ee8b23308fdcfbb26ed30fda1dda5c6841b46fcd902e6c34dd268fdb1426e215d21bf650a340b284d5c7516efd3f638e6a70917c89811851109296a7225f9c7c5b3d7fe6d6ba6c7d1ee77db44580000000000000000000000000000000006b084e91066f299e44a0c37cf65c30009006ddda34d4151b0c18a5545d67f2bc76df0bf9a78fd2b771795c8d041655d000000000000000000000000000000000262ba1d9dbb009f779e2a584ed313d78e4ac69a811e071c10e21027138234a32deceab16a33767fdc4a78062cd23ec71c4ac944341dc68fee586d221db2a8167e833f18f012afa7c3844def6dfb26bc0000000000000000000000000000000009aafc73979c000236c08e089828880f54645b5ff4c1dcfea0ff41ffe8e3fce8ba0dbcebf0d4205bb6616a737b6d3542000000000000000000000000000000001399a2072604d50f92ee186924ce32c4e887803dc258b7495aa2f3d2187571045db7f360d2614b198f83bc8024b06559b0eedaee9347b10ab7b346fbc16c10cc9db486f561f88b756c269ebbba23a7f4", + "Expected": "000000000000000000000000000000000365ffdbc48aabd8f0e786634b9a853cb8312bf295543bd280c1a0a9f7d0f8ba95b3aebe31987ffab1f69a504edeac2400000000000000000000000000000000150af5ab7e9b1bc60cda3ceeada36abf9bb43f1182659d8d72281c1f1cdba73fe7d6e52abaa7506b89ef43f092f25bba", + "Name": "matter_g1_multiexp_32", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000012a651f467e9a1c1cc99c82e16cab2cef53b77268d968dcc73c5008e103d2e4d19aef4cdffa24b9474fcb393a48d6a70000000000000000000000000000000005d202cf9bc8c0124c0f817465eee7d4b1219071cfde50ce2cf8951efcc21fa19c762a1a8630eb7b8dd90cd03b8bbb0484adc8cfd2e42abc2f0e0d7e9c4b378f73731905760bfeeef01c94f8d5c3cacd00000000000000000000000000000000060650b71c97950ce5cd6b6bfdad46d66df454c5aae1ea313a70e7fc841e06f64a31edaaced17d8de56f1ee75f5263540000000000000000000000000000000018a211f44acc52e92ab5eb1ce304d80532fd4dacce60370dc62d9ffdebbf749689620798429b5ad1d8293c1967a43c12bbd5d4a15998d733326ce23cced86ec5d5b410c29ee98a4de19f2662c3933dd10000000000000000000000000000000000f51ac340d512becf5d7a515111f63123e9bc940242ba42be9f464b89847a8cca9d93360851e3d047de4ee667a6baf0000000000000000000000000000000000dd7e71b516b3752c5be5ee5f3908c17e3e019b46422f24659596a42e569ba9e8711b1e8f8329cfbb990942f258cce103717aadf16301a9c8741d65c86ad7f849101e30b7b1a344643b100a8582a6ad10000000000000000000000000000000015d542246cc0b46bbf5571c3173abfcf10ba447e5ec962b5f712ea7de3974c2873df1979c9d6432bc88d02588a3730f00000000000000000000000000000000005e1611597c12a4c7aaa25bd9ab1b6d30c58bd1fce3d87d66a03f25d6ed110c84c3e902ff5475795b5159126debf6cb522788b3597da7b9b106203dd0ea97527aa8f5149754bbb0c10bb6eca8a46d9400000000000000000000000000000000018f565b38ce775e6b40581f757935efca255311b872fea3bfafa0662620ad5a02a7e8ce48c17daf45668c95ab0487c4e0000000000000000000000000000000010686971b402783c1e7d60126cf484fd01b871944179adc4b28de5d72e5b8823b48d382a8b69f6b4681c74961ca2a3843c21276fc1371060c226424eb9886de6897b15b075fc5a51aab4710e9dddd3840000000000000000000000000000000008d42e31cb4c514e450f56488208444481db0beb5807c6f1c2d82ee09c9413cd6726dccd72e0b8ab6f6ce6492921b14f0000000000000000000000000000000012143ca6dcc3bc9edb5b10c3a47a5130e393986dc5e83d1eb61d9b193ca28193101eadf00916a3cdcf7b6c1369b17038ccbce4e92cf377f67244995badc72db0b80fe37c9b7d443595156fa41abea17a00000000000000000000000000000000101eb8b48df43c3e01c1508aa9d3dbfe168e7458cef2ff61c15d5b4e8dd11be6b9a76966c01682fb07368f22362f355a0000000000000000000000000000000000babbb820a5a8e0bbbae1e2455d54b97f6771ff914fe33a007734d5072a993df31c6a2726c8b03a8c2dcf48a73959a8ff79345f31c107841ae388f6cf116d10bc696aec4933de56bb9affe7e20c649f0000000000000000000000000000000002fe8c461de25f5e6c5a082fbc4ecab5a37dbba9255ebaa0b5d245735edd27550968c2558ed24f7bee99092228e37c8a0000000000000000000000000000000012513b2fb62725aaf948403c13f11a6d7461c70cce3e4f912c8d2cc9f2a8676d9bb37face3770e7c0121bad6af6302d121cf773387d5351aeab99971eaa3b207fa6a318ad60f1c3e16b7f68251f9c91000000000000000000000000000000000175c93838001f4c67a3e0e5dd7eded26a8818b2e492eab2e0e6f8b421e3d3611561c8b933010a3c5ff96128631f4e88700000000000000000000000000000000136292092a366a73a5609cb1e7fa403c59825e99c8c91a37b289ed779c4a3db71370a4bda2cf8509cc9d4b4731b4f52d2d69cfed6bb2d33fedcbd215dd4e9632a3cf86a4b2716406305f6a85e6090a05000000000000000000000000000000000d03e1d6dc4bf59262fe3bc3e163565110b751c534e57c621b4be59bac28d6e8bb379cd4afa3740797dadf32194fde310000000000000000000000000000000014ee46a0cf13e795c8a46399ae63e1b812f237eea725539265e13d3ad1a663374dd566df450fc1191512ba978736e5b779cabae288f8a9a8cd54523c20825b8fb07886bbf0ba0c5c807956f268af4fa10000000000000000000000000000000003cefffd8fa01842c36dd9fe1c57efef3278eebe5d1020582c3d13ced75d24177127da37eb59e9b46b4a0a19421a5aef0000000000000000000000000000000016c258ffb2edb299fcc04ad309ee5d8a8f186db5f3af8011d42b22b23687c2e814e2a8d366f3cc61d7c89bd9619523b31973977d8e8c592f9063c5a14a658990f9c3405643089eb58324cd3f05b5b5e400000000000000000000000000000000097b6535843436f879ce659b6ac9563d81ac0262b9a861bbb367bf8244a35a5de51f3060d05cb2174cb41c8c3dbd8dfb0000000000000000000000000000000012dc9607e0ebf73e3577ba1ab39437b03215e366cf1ecffeae4ad4c7919a63f62e45103db65de4c9e3281d7604b07f24a610bfd375a7b8d0b034c17c8fa27d4366b06c681131fa7daaeeeb08e25c2ca60000000000000000000000000000000004479ec5d5ba2f1c661df8e4f85320d0e754372e0c463098b0ad7477f7373f309c674dfd31c7f08cccbbf4bbd17c23d7000000000000000000000000000000000470cabd9f5c4bb8b1a370888d8f0f486387a89efb92912072fb0907a1e64f3327e9beaddeaff44c502414632243d6fb99ffe1dc2d7526338462860501d75380a5ed9d53e675125342afb6652a97437b00000000000000000000000000000000038101da3c35dff20a878300bcf69e393b77873a971838581daa9d096b00bd6fec3dceca882a02d397a90c816fb415a4000000000000000000000000000000001184246344c03be6103acd745b3ed37d8f67ebf0caecb00cb2528e0da9aa3f352a4677dd6b832c042d6e1235da7521fbfdd97465982b58e69993711a6a64134bc4e76b88ba1948af91ba3339e9b9d3e90000000000000000000000000000000000cf99121ecf9b02cbd006348b16f9d80f64ae3c946c4802ec6bc056bf6e95e01b80cf3fd10ab1d30260a402b7c46f880000000000000000000000000000000015f35fe1ec8c258095394ab2b021d63ce54ed4bfe14cc5666f5ea4d5a0461d535b8bce3263913c1b4e6db6996cdc037d786a2a3974c84752b32f29707805c71992d5d473f4b7bc1f0757d126607a1c07000000000000000000000000000000000e83f4b1d3eb8d45ec0fd9a4ef001e5bfdcfb9c99a6d1dd4b4e8043b4d11f5c6fd65296a33c7fd26a4e30dbbe1869090000000000000000000000000000000001197b11d6747280b37769946549ad9d4a1ff1006ac726d7cd322cdb4e3cf86906c7ed371e770fd95ab4fbaa1b7b514d985d33a7fbe6ac6eb42eb932dfbbca2f771ffad5e80fde686e5df9d34e9f83ad6", + "Expected": "0000000000000000000000000000000012f496f031f5c1b594256e272520ab98f3733fc9c481e7ec8de8ba70f493065eb25b681a3959994d37aec979c22c6c3b00000000000000000000000000000000015dbaf471eeef9307d8dccceaee179d8c9072b052af66fbf049ad1d346e08bb555238a763e903541fc72d9edc30ec30", + "Name": "matter_g1_multiexp_33", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000b632afb8deb955e64fb4ff5aac396152e23b11a3f326df0d77b3ec078934cfd5e486244aebb44cbd1599f594991a26d000000000000000000000000000000000519f9de5a5b1623e4524be68b5ba0f997addb4da78adcc9c3d5910009a261fdf8b0efbb6e2a085e74112ac4e2106ef319582dfd9cb80d44c17c5f62360e62f6736d186194f0f8483e34d8d18d832d370000000000000000000000000000000005456d9312825dcfe5501b2c38aa610a767bd38f46cdc8acd92f0c8206a9c2f9b8f65c8baedffdec5e69f03fd3adc4c40000000000000000000000000000000009b2dab21ba4e4b4c284a623994b92ed5fff0fc198bd154fcfac9abe5f05b830066b44894ac6f92bb2f61bc88a7867a8ac0bd9b8746fd02aa70d8b8a2b5d3be46baecf9449d8cd3d620cf9efb3c615d10000000000000000000000000000000009f55a987011dcfc796df284c7bd758c3024d4f09edb3884dc087de26fc1df0f71067d44fde07fab9334971b4a0bace000000000000000000000000000000000003a4ee3e9ac2632cc81cbd4ba397d44f738ee390a4af6ecd65079f412bdd8c4a37d5413d0d9a7dbeda8a1267d6d843b069d889881d5bb87dd65a9a02a7fe239bdb55ee54a6310bc987e7c5772404d7d00000000000000000000000000000000173c7db310b54a4a720074dee01dc0e5f84b606c9c3ea0962bd4610b569f478d7a5221feaa944054cf7395e578d730d8000000000000000000000000000000001697f0e16c49b223dec9e0fa429e68dbaf96b004a561aa3e37158064ceb9232c1cd21156c053fb89ddb230deaa7f8336be658348e299bbf2438a0c013f86eeeb69a013b8004a4996189472f3372b326c000000000000000000000000000000000ab7f085b711171f999d0c4a46cc7c8cd8a429f6bd90d1b860c01066bd0d193f1c1441ae5aa97d690569807749ed69e1000000000000000000000000000000000824841eab90d56a1810c129b8f27d0068fbb7e3536d6e56cdfdd9eb553e283c5d0ab1c418869e886fafce53697520859b9d0ec92ae7df3f52a95747659f8fa3ca2cd01e8d7ef6de384111246886bafb000000000000000000000000000000000bbc8c5b5e4373e76457fa45acfd3f1151735457b0fae06e1d3e6e5dfeb35815aed44bbe6395039481ce02d2aa2c502900000000000000000000000000000000089ac22ebc582bb71a60c88638747e2243096e8d193fa1863089698fbf6805128f9e32636d6f954ff03bfb6c5bcb0060d2ffdf1237b4e03c219806f2dea745c94bf08924e1b9f11deeedf0db19da6f3f00000000000000000000000000000000001fea43c3029447965718c8e76100875acc8fb4da66f7a4f7fc5260de3844aa9e9a89ae4d9baa11c118b9f851fd63de000000000000000000000000000000000844aecf4a3ebfd8b711dfa9efaf1a57d635f46fb980903e362d4ad55d48c4289a3fb1f439e6b7d8f88cc51867d6b462cca0751c9534cee7f14d11b7c8ccbb2c537a799df59f850bb125c6362d72e9c4000000000000000000000000000000001384e33086ebe795cde3c951de9b48f3f0fa2f627524cf0c4e3691599b62d4611c6a84897298c287d162825c3f153a75000000000000000000000000000000000a04af7cc41c2d3663444c8aaabeaf70dd146dec114458b3d1dbc95cee99ba89a4c5a38f2974622292e3236fe2aede6d17f890a1120daca4a1bc1bc0fa7529f0a87b5fd6ec385f12b270bc0f1a5281b400000000000000000000000000000000158820954aaf8e6387cc0e8e528723e0875f5f719a46ae5cd9d967674815a2d9679aea9b5736f882d37e2dd26b7db17f00000000000000000000000000000000058cb933f8dbac61a22477cdb3f52c9e3de6f060dd51aada35b6f8480a53e8eec8f82800e89ccaa2d2eb1dfb4352f16561ca18257d9d989ec13d4f158b18ec17d59344f4558b6dae6c0aa0c2f37affb50000000000000000000000000000000000a7c9c1bf574503a884ecde5e921da80b299c4efe674a2d5c841e6036adaf7c1156393116c2c0b9827978d43f1e3e440000000000000000000000000000000005cf22e56bf4a46504ecedb072fe5e18096f9da550065612a1d00cf79c65384dea1bf59cb7c52de905a04f1886f36c8a0fc004ed8a135ad97cdd1bc4d0c3ccd15e65031ad7e3cc13ef2c260958bc43be0000000000000000000000000000000018e344838e2efd9363911898f27882f67454dc3b1bbc71f1d99e787bbd6a1ec9744876156ed8db2ccd826f2b4fa784050000000000000000000000000000000005528854a8568ec6491c79aae1df15d965cde683c9ea400b470105117f2bf3b41d2f958a8dea5f866a55e60fd06c1f07d8cfaa1037e2c81c6973b221dc7badf25ebe3fb4b42bbdef1124265df2c7ccc400000000000000000000000000000000047dfb6a6125ff02e12c4a9d88ebcdf8a4375367e1473f5a0d99152bf0a4055138aa9a83d98d7f74d9fb8888f643cac00000000000000000000000000000000019d0bf5162ca55d8113a97cc3255d090c6924362e6e05083fc323dafc3b12e898cd600d2730acf8cf5cdfd4420962881c25ecc5d37659ebb0c9e21ea2f8fddc518e3d8faa99627b21faf105445f69d7d000000000000000000000000000000000e132de353cb09b69ab369c616718b9cf492cdb9d3002593319a6e7b61c7d90f94808b75d8c7e3b9d7a811d01baa47a1000000000000000000000000000000000d636abffa063379e2084cfc09da5ee04d40d8e74ba0247a01be414cce820024766195520f1d2eaa90fe254e12a4d86026cbb32382902d9b1963779070d749cbc4df1e7605f840819f2c04aaf89c732f0000000000000000000000000000000013f2367ff71430cb541557f79c5ae8a0d9053d82341d83037c1f73a52585255b205706227de4e87d6ea2ca602483d2170000000000000000000000000000000011f3f4e882de30b40bc160e69fc2bf4f7c588cc83bb9dce3467accec7c47714e2b326be001a36c42ba39c7f56b72d6fc699aa549077a80ff8732b5fc9df148a90f405bccc14bf7305266836566b7a98b0000000000000000000000000000000014bcf3f26683234584d79b436cc608462f1e2c20b5ecc5019988d8e30137859a4b6d0e1135dd5bbea0781b8ed3f0653700000000000000000000000000000000090ef29bf63ca97ae8388588227e1d1a0653c43b16a35a63f2ab4f0b11fd8005d9a85d30a7406491d983f347e4dfb9f140e2de1a2901f1380a383a741d79fbb0a041da5d7bfb92edab74cd483edf9523000000000000000000000000000000001817fac61301ea6a43d7968b22616b836ecd1f20e5883e9b475c18353b066f93bd68a8274d0b6ea4480d8e314766dff7000000000000000000000000000000000c52fc676604061338bf0712fc1606dd09783a1f9a5250e3417056e3c39e59a28c7707d5225808414279ab61e49b6081062b323592118868d547e83b731d15ba2c7bdb1ee4fdf73600c2584f1db0b45d", + "Expected": "0000000000000000000000000000000018410462829b3a72024468ddcbc42d59a99a70296024654f99b591ce016304537c525513defb655417ba3c0f5e614aa8000000000000000000000000000000001416a19f73407c262f5e464021eeae1d1f10c3ae5e45f132a2f402a75cfbe409651d3795e482b15d29037e2f7105255b", + "Name": "matter_g1_multiexp_34", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000018e6f25220e4b4011a0291424b4062930f5df45eaf1581d9591560fd77e630411e0abd57f9973d4542741de5cf3132e7000000000000000000000000000000000b31f903e7fc36327e404973b90efe5a5d2249770170ea1e58839e19d8aee99743be012b6e8a3fa73efc6bdc08be372f764ab6f4c43630d5e79e8c474d76d8973a7b7bd1c7f1a985333cf1a6be5ccff20000000000000000000000000000000005dc07fa620d476d8f64358c920a401f8b08abf739befe1c266fb307b959f37542140e398c33b082d09f9f53cedf6f810000000000000000000000000000000019d8e51a28c936b5037424a7ffa8cae75496131eeb2b2d5034e4e882c1c91f6bbabc9ce4fb2fe4be3da4eba46326a3603280f1b1e78d2339f64b5b2f2bd77aa24623b79fe2c9debab4212f4ff564983b0000000000000000000000000000000006f5f80dcfe8be87d057e2162788f7599e55b69ee8c6bb6a47c505aa324ddb5ffddacfcff35cef3dee6264ef73d6a353000000000000000000000000000000001056081108195d4d27af7332215c0b444c9f63c7574eefa81046e1d064825492e2dfc5bf2ab5847a37e6b253d9dda9fdd4d27ff9d03ab9120ac2adfeb36b070015f0e90782255ddc9111704c5fb111770000000000000000000000000000000008db431907692896f9e6e254a6eac1a0ba5f9cb84563da69c3601aff1370b7a5a98edf5a5fbab06abfb4496c777bd83f0000000000000000000000000000000018a3bc407fc42236c4429f241fa760c6513614653e8b02835480dbe1152763bc6a1a7fe076e8bb44ddc04322cc906e1ac66d5291311c7cdd1f33e5365ec0689608b3569427a8f6a9cd0b94b671472e66000000000000000000000000000000000cf32da94af97001664607c7840631a8df02a008fe262c6dc649a3eff34a42dcb98884212bf3e979629c98cbe5fc457f0000000000000000000000000000000019b3b4d82326ec1aaa3de3b2f8e329ac0243d3f6bf9356886be4033aadd0398a5c58c68510de29f92a7ca910d851da244b718a5129659250640e333f4567043ca749063e63d87efd86a9995adfd3b845000000000000000000000000000000001504d90c52af16b5f88357c87d4be7c329855ccad6f6633af0fcf4341fae54aa4b1ddc1aa22fe1ac12e9d850a05a9ffa0000000000000000000000000000000012ea642b96304316451dcece5a6bb324d197e31f56ef3f1a17c973742322d08f443b7cd156787f8291b52c0a6f78b4b1708891f45d7bee38fe382820260061e212c6cb9a8572b4d1854f3ab09409b05a000000000000000000000000000000000fc61e9589a2dd7f6dfd613225d80a70ceb977bdb518b5a16e415f887eb73fe9fa5c9130d5fc6deb4ad153c5de0907d6000000000000000000000000000000000a0fd7de87139581e9b1ab707e25c186640db92875a7822d61d8c476c40ea07bff000cbfe6975076434d0b703695740685ac0f94f300b004c7f20aafcfd9129d6c2590749504a3f08c4cc708fa30100300000000000000000000000000000000188901f19a776ebd2ddad60209f4545ca9b0a038b0b3c67b6f5e35d61f8cc2a297d51450663c4af182079d3ab6b01d2000000000000000000000000000000000151b9eaaa281acd803abd71ee4098b4ff6535e5081a33cc68ecca54eb9f1a8f94f3b1b21440f33b8648ec456dc1cf7f3fdbb634bc0f99c5795f3c4d6a0efcda7f71427f1eaa1c5411caa6cb05ee314780000000000000000000000000000000008ce8bd24052a8e1472bb64cc215974e20bb16d502b3a8113cd6e3e9a2bb7c3fccd45ff711518e8430221f40859374ba000000000000000000000000000000000aac2e8db9123be3e82905a0fe780daf4a841f6f961428b9b431c3ba2ac31e8c06118402bfc7fd15fbe3ada0ec8bbb2af5e4695c01849259fb969183de385ef30c2403e081067c2d9b6b5522c73fcf2000000000000000000000000000000000017c580f501a1c4823483ae718371432a8a69e16e42dc0b15bb8e01729b6707ec20b898e3835bba40d7e8802d9438281000000000000000000000000000000000bcc167264fb9d6c27272c2280d8e89f9655ac7e6408694a3a4ca6fd0b46d1d7e3cf608bc2ac343806c5de42ae7a99e80ea6fd588db5efc5fb2248634cca683d39d610886b59eb3077fa9612c368d7690000000000000000000000000000000017ae89082d6f531bb7905068a9c00017ba8ac8867c6e467fcd3e88e9229ba5b21ff4d0a5ce937b75b3d5dfbbe35f2e7000000000000000000000000000000000005bda8d641b782ed51c416d0ebb1cc7c8f623d49b741a7cb93b3514e71d5b9102ba2e6c768661686c2af2acedf466e4dc2060a3421c5a8336c80983c9a160345901a496c3a74fc5248fca081d099539000000000000000000000000000000000150ed2c2b2d1b0b87badd0dda44325000a6fe98d335e03f0d4d147b20d4738e1e0f0ae0ddb2783bef283684e631ff45000000000000000000000000000000000ec1fa174f3f42cdb0fb67a520da161d9a9d1e53a5b0735738580fa3e80550c95cc3a1cf67fed67dc2eee1597e469fe0e27e4afc3e6d59d0f5871b35eb83b46cf15da6c326e88dd8edf84031f58e23f900000000000000000000000000000000111f184636052719c6df1541c100d5a21d573370fa7afd18f5ddd1d86842169eeb02c494b33f2bb2f54278530729bfbe0000000000000000000000000000000016be03c9764aa34c898dcaacabd1493610f55efd36ca0b35eb48e89c7968e7a720d545b18fdb95954e01596856d42975cc7efff04f143e2d038de153861da5e04016a7eb17fbe6365de13069d088b1a100000000000000000000000000000000114fa84ccbe9552a2ce2368f1778a1fd3c67303d8036fe4ba171ba9f2f6039aec1a59fea1b8efae88c01bb50e53950440000000000000000000000000000000017a51bf70c41571f36d003c0715238b6c8fd64185f616cd9076b730ad16caf364a75fe68de246249a42cfe013606874709a2c3dbb4ee4f485dc60dfbd94a358a7c62204c021f2d7b140187ee9ffdc4ce000000000000000000000000000000001450fe1500a6fa9d966a0c905167a414d59a3f8a064089f09db047241e9abc31d9e41ef73558eed741541414731f838a0000000000000000000000000000000017e61d4092537ec48683f86b72123637df25a5fd926e5703f993678a798dbe635ea29303f8b4d9ac76231a71cf515a70d9b15c065497392e4b477a556ad620d44e671137cfd570d53590b7528f8ff680000000000000000000000000000000000e72f0c855fce66335533c05ae30031cbde78ef07571eb1b645fa3ac5f3a7d76a4d60cf078145617c5a7ccb16266bbee0000000000000000000000000000000005b3981900432b193985f28a88a72ca9958b4628e5ff9d2cf8b0b23184e2bd433d495636de3d56711f207719fdd3fd2f9e2a72eff2ec29a65b417767e7090b73c2fb530de6c8f4e4ba30543946423b12", + "Expected": "00000000000000000000000000000000110feb31a1c40d570d7281ed9f0c0ac8418f4a7aeb6be3221b130945becc15bb353ea63623ec7dba2844d3f527c167e6000000000000000000000000000000000d76c7aed58945a7fe52f37eec3be7cbd4438645a649a04859a487e9e2d4c82bfc76f7ba990f825302861d82a748c8f2", + "Name": "matter_g1_multiexp_35", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000030c6580a3dc73be106748d070b24d9231c382df143fb4bb8ad45e4723b40f90724b7e54510da1b2bee523a29aeb58100000000000000000000000000000000010cb3562fa1b0a3778393412994e46028367ed52dd62a1d446fa02b50acd48a784ab49141778bee5036b7d3a95c9ec217b9aa7e0bfaf135ff24720773ccd1e0a46fab6d678d91a14de137061e145fb9d000000000000000000000000000000001972db503f6d70a0b247eeac7fef277098604e54465309967b68d24ec1cece802d8c4b699eabb72e03736902d41fd5b60000000000000000000000000000000007f30233f9043927a629b11e7da48f895fce86b31911ff5c511c7b50642c296d37a3078e2e12f1adfe668731d0e6810ec6733c9bb7bd195622b96c4181e8c8837d1912fbadf77d6029f7fc44d793b4800000000000000000000000000000000011ab9fd98e42539382c85bf76b563478fae8cca90ba1beb0be56b405da8326e6f1348b94eba61fa29c78645f8eb96f8b000000000000000000000000000000000f30617240632d129ceb69de1d69a23c9bdf950819608deac0600d1d1fd730a3a6d22dcfd635b25154b5ac7e22b20c70410bb66334c677397d04f59eade9630463065cd7da3c9d50580c7d66bbaf487d0000000000000000000000000000000007556b86cbfa9f186f38fb1a8adce4c08f93f874bcb36ba61df5750c7927cec8896bf831c0150c249067ddada2e914bf0000000000000000000000000000000016ecf045f13c78de8aa18c2ddd1714bfc532ba8ff5b7851b58240cfede20f032067e943486df628995b8f3845289eb02d97a16fc5b2c70829b15f73615286eba334de1f520b5f0f6a83d2578399cc0b30000000000000000000000000000000011379452e627dbed2ef1c74eb917b95b3933b8fad8295235cdbd6a4394d9b75cd3598c930d48c2d4abbf1558c65e97490000000000000000000000000000000005e7044829ae3f9b073e4a2237de96b0a1bbec3a30dc39c839573eff77321b1e0a49d555f0e31b8aa096f83f5945026bbdbac08202bbe5df1229e99c76c1727f7789e0f8c2002f0a2c195bdfc00acb360000000000000000000000000000000015f8f0f22c1553ca663ce7e9ac00514eb53443f6c4869f985dceb118ee60a88a4826e9dc7fdbf61e77cbc93768fbfde0000000000000000000000000000000001646ecc89754ac57d7d6fe9b871692d65057f23d397a410bcb07ef3df0a3c3fad9eca515f0d0dcf0610edbdaf4cdb5d743da827b812ec6ac23b00208cbad0f2e8b3a32434aa61dde029683c34c1ab1900000000000000000000000000000000003a18dcef4939e154aa790b0ce8265f27cfff48d5fec149d91307759eaddf601c788da6ed8124764bad940f117751b0e000000000000000000000000000000001813f4650490f3839fdc9f96ef744ea93a9fd86f8a43d767259c2e0abafe308fec2bc6b9d62c1dd7b5ab1aebc19586e93c7a8f7bf434ce5e63ac9365448da8663745f66689b4b04968f9b8b1b68058930000000000000000000000000000000006490f351e78a40c0cdb827aed3869db293c7d654b43d69ad1c9b3b536b1fbac67d50a835878171974669a30ae9ad1bd00000000000000000000000000000000041816bf846528e23eb129689a87c2325f1b8edf237c530eaf578a908fa0a2604baa19d6e0b4a5801280c27285896d5a51f2e2bcfa6ebf84d3ad83c57257b9032e5d62a8663ed5d77afce00f33382bc600000000000000000000000000000000064be79c5d382c6dab72bbf28defddf14cc7cdbb23eced6bd93abed078175668d4dd66d0b3abc6384165d26bd86680f9000000000000000000000000000000000fa4c8be5d20d16bee7bd5bacc0b0086875a14a119b4888bc408850c0a099603fe3f79d334e45bdc9130132ea15a180f6d8b15ec8908bfe008414757c0c7f79b3079f9db86d91ac3ec8f38ae2c94d48b000000000000000000000000000000000182f23242108b022ecc1d156a97f1a5fea2cc2e059dcc82273212f37c312ab77886c1adc370bdcc6ee05cfec957db970000000000000000000000000000000014ceefb3ca54bfde172e0455d34f1f462208df69328782b7961ade821ab91e7b3ed5426b4065fad10cc8fc88c90d8e87f4723e85076d48389c3fb5a5df16b6bc6f7a69ca701632b1159677bd8a6f7bb10000000000000000000000000000000009339b95b043903f2a3b5926a27e57cd0c45e7955946718e7dfebb01f18e9d7a2002c670769c4674773a835311f2e58e000000000000000000000000000000000ba94f6b625c507934f633d5420654056a939c68899c41e3f337f7b927fe82191d39905b349870ba0c41c8bfc97d64a9a632938a6df169fb64daa55d2f874ef7629d5be41dfa0d50827c082333f0fca00000000000000000000000000000000007604b5eb3218140b94732a601da577da3cfebe04dc7dcd94396c1a6704a0ef5a5bbd0c31c196f2876e1a4bb7490629700000000000000000000000000000000193098ff839d38c9bbda43944d7b0a3ec9d0d6732519d4cfbec506d29801780813b2faab46658c4383b2f26c477580af283a4da7f71bde54d4b7e28b2b23e2eb05d8b025e77e15810625d71faca6d6e500000000000000000000000000000000022ca1a16df42ba543a118212a75eca13707ee01eb3ce27d3659b1fedd99b9fae859f4eaa51e9be9107704276b578a0c00000000000000000000000000000000012d60cf33701caf11be6c9e3ebbddb9c7066dec3821a2e0f9e5b94e029dfea4063bebd4b2fe18c2442311c2bddc7c08d402b71c1fc5c3f3a4ed9edc73457a27ea427f83a784796e01b7a1451b3305b00000000000000000000000000000000011d4918642919c801fff0962062a387a4dffe693ec09cd3d0286a18e3a22c84fc09e8396ca82e6054d8535cd888179230000000000000000000000000000000016a1f0c7fec5647dcce688d3e4e526749bbf23c1fcd9e9168ace47399f9198c9b3a6b8aeca68febde1b7beeea0641aa2310bc47acb3aba7eaa490ec104ed9b2985f65c7347f69fdc67b76f6f43846a990000000000000000000000000000000017203c37b21375a524bcc906843a0045229c5531ca23177dc88026e83723db21d9a8b5e52cc0be1d232818ed9abd496800000000000000000000000000000000097b4d7fdfa442dcdb64e405965439ebe70e4e71cc8e13e299fcc0b5dd88c67d6d0dfd254ab9b545e66295e2f3df14dd91b88ce9888e5dcfef70d6f960a456dbabc792571f2a98746b7d833e7fab9850000000000000000000000000000000000fc4198a87e789015a1e44935321677e84356aa9e06592f9cdbd149d13ac312980f3048dcb9bd02779a3b10fd24ec98b0000000000000000000000000000000011425345ae1139647f93fc13eea0e920c491a49998430a339cd9d4260479a427515109753e70811be4cfb3b96db5c78b3e82cc1261ac3864266379b4d518e25c05bc492a8946b38b8a64acf47aeec4b8", + "Expected": "0000000000000000000000000000000011cd4c4507778871fd7b28aaf79274178df83f3e53c256dbe7a52df884d28df6a0d87d20238a15f489546a459195ace0000000000000000000000000000000000439a672492225fc09e46bb178a5d38956ae237d9f7d187d4cee14597facf2c06d7e70be5ce20e1f1389e4da6321e455", + "Name": "matter_g1_multiexp_36", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000003790fe37a3aa78cdeafa76bdbebfebb22ab5f1e09e4e488418568fa307a5db18f9d93126b0d3cdd6a28abe3a4648f6e00000000000000000000000000000000043244b9c78fa56c611bf72bd6a17148abe76fd0efbd25085d7b46c90318ed591c5975f79653b98440f5f7c04cae4d7ea2a1148f1ba719b2da92c418fd137efe21a44dd4cce013ab36e57d97dfed92990000000000000000000000000000000008e8fcaf6d2056c6e144295d437f7f1422f6af7a1b62e0b8073141b2992b6ba865822aa2d9fe439aa1d896b2a6d231c4000000000000000000000000000000000bc693fcd2021972914747e48c600c444bf69ca8e1386655bb5d987608d648965c754668ae0a72c2439ba0ed98e5e581fec5d6167d7777169348cf81ad3eab5153f8f2f18fb5935c5ee5e3a759f9b5af0000000000000000000000000000000004e877b9032e168650ec3502ba65118aa0a8013b995a647210c1c36a6e6c702a93caef674d03d82da1f7c5d7ddfa0d0200000000000000000000000000000000063dd22dcd667c8288ca5b172e34b4eb783403105523c0467139b814e048fa21245879a5e9188a1a87d26fba52a9f601da609e1c8fa42a993ff355a70d44dfeebc71a801daa36acd437daec5d7b645d10000000000000000000000000000000018cb2fffa3181bb665dedf1d60de6096e8c5ce43287cbd86c2df5a5d42d0129c73cd281c085fc562b7afdf52f0a680c80000000000000000000000000000000007f9884780460ea018351b4ccb5a120d44312056b96c5ba77cc38789627d20500d6b7e69dbf6ab49d6bee998a6aded67bc5f7f5d096247ababa51852724ce9ddcc6acc7ab6180beaa1cda97dba94b4ea000000000000000000000000000000000bccad9f23b4c1231eb07df139548b66714a064dbec4ac6ac43ce18671144f2bf7ed99f16442b9f6600e1122c58f52e50000000000000000000000000000000013646b3c310a4b3f279e17f45fc8104d2c9d00f698b869479a5a0e1c2131e3f3a9dce86115ccd539bbd4346261c5a75f3222b41a59f9551e91572ae00582e1e41989ff5f8e2cd1ee1a78f55c2b28ecb4000000000000000000000000000000000d02250115596126e858a63a7082a8c8f8ebe055653f5a60c855ddbbe3ed05792d08e5cc348094b8dfa4584037be597c000000000000000000000000000000000f68ec7da947cd0a57177fb91d12a820ef8574f4c524fe54b9420f9ba4944759c92d5919d6dc8030fc663c34519b64c37431e5c1fe5f8d38c759bc48e8207695a3cdf07d4c1fd02f1009088539085da1000000000000000000000000000000001960580ae965c37c2ec219dd0753749bd70ac2f0c4a3837418023c5142caf7b4dbf592554a6dd95872e018e912e3a20b000000000000000000000000000000001210b4093a07616543ac2034faa9c4a93b5f4cc3daffef2d8450b1a1770948de56c5bdbfdc9f1dc9af5e20778c1e8e6cd474e755f6ce9045baaed65c80f5a686547089e8cdf4ad2b7c2ce7c255cb5c73000000000000000000000000000000001955d93fc0f3ce0563ca4f4ffae0257297002001a3eb941cb9d3bf82b8d7f97657ad7168bd386636aaf45398745d5158000000000000000000000000000000000cc7a0babdf499322e060f2c83897fa7b6c3e7b4f56de3a18c823e0ffd87545a3dd68947df8cd8d3de5795ef7cb05391976c8775b0eaa1e4aa384d222efc476305c7ea2d625cf5c67ea4368d7a9fccd1000000000000000000000000000000000d451eb31b21eff2c18b52b882e1eac68a524e3db43f233a9d08139667cd0173e3c716f29085c599a09f19019fcf447f0000000000000000000000000000000015852c483c8545fbf0932c99b1944ac58b37228d15284c7be5f5259bb8002abd57b26c244846652a862d46016221eab19db274233c46caaa9c99690fd00fcbfa4eaaad7c41f8ae84313448c787165f6500000000000000000000000000000000044e70861dec38d2b5ac7fec042c6b931d4e0a072073333f03ec4382fe40919b29378cac920836b1641e5e2db053c5c2000000000000000000000000000000000c422a91c81a99caa32666511c0ae4decc67cd94e85260b49760ac9e97894b0eb434d39c3884aa4614360b79681403f94ac9f9ed46ae5aca33af9ba1c0fa5a2138d4ca02b962fd1d02b4636114ce1997000000000000000000000000000000000af002ec82c5ac0dc87e1ac27f4cd052eab67bda318557c70fcc2edbdc071ac4a3fcae90f73ee514cdf8a543ef59050d00000000000000000000000000000000109f720464ff2eb2978d66370041206abd9ef0c6ce79d51f7d233c49b72da520612e59c39f3a775e288ba2220fac1563ab300ee55e90ac046dbd772da788dacddf72c559d9378b39507987a9774301b0000000000000000000000000000000000f62e7d0aa954742a2018d42dd9cd76f041d9ac46ce659f4e192053a1d0c9b23fad78a06f61d2c90eb7b4d1bfe6d951a000000000000000000000000000000000ad5a5ce7b66928d8e6e3806a25425bbf2bc63f8ec87002a913c28ab702b83b6ba590b41a0691daa5b921a12375ef47b275b22db781d5e8fd07f36788bc1219c4b4a13554c28d92a381adae111b265730000000000000000000000000000000008b836a23836624b39e3b3388027093125749a5edd5df50ee0cadf1d485c9dac9c2569a82484269fe7af02334369a29b0000000000000000000000000000000015232caa0c064d8d1bb7fdcd23c0eba21685fc4671e9f04cd1dbaa0382aa4e9d87aea42a99cca22205367d7b2261defaec69b95dccdbf193d9ee4c51615c0b7be5ac6bed3f2559f0cb2755c634839ce7000000000000000000000000000000000875311ab0cde9a925383dc84e4ee8e1610b2f5af0e1f530aed4155cb8ef0b5050d907277f55d8dd542a89e4e0990bc30000000000000000000000000000000002c7a0d315bedb602f8ec558648ffa69831b9fdb6c14fdd44e636ff00777f2f8ae4aa23aca1b261460e6dfd87e7e501131e2bf1816a84c190eaa850ecfe1a9376123e0d0732d90ac3537668f8f18b9f7000000000000000000000000000000000f9531c4998aafabc26e1ab588a97a78c236a854c3fc92424320a37a236d5181d34f8e5533aaaab2a6ea3385acc85f6300000000000000000000000000000000130350be432fd7d68940fd5f54649820ff5b3d015448d48d1f4db3a05ab0405a73ccfc8eea1966abce35833b5d03bf79f4087feda4bd8205d96cd0bf6eee44c27a6669d7ae8e16c731849cfbb2324e1e0000000000000000000000000000000010fefde43b2cbdab52ba664e12c7a6ff29f647942e16ba5a0d41701754ec63bf199ac8e710ae8dc6a033abbcaed3e05c0000000000000000000000000000000002189172e607876a6e1664fddb990009dd5c7a8412d60f7dcb235ed1825c756598bc67f8d5d383c2570a880492d4ee1967b81583fcdc9afe5f35974dc9b6310ee8e1c92031a49c08b05555fc0d33517f", + "Expected": "000000000000000000000000000000000765877938c1a8170e2c2fda55241e3c64f7485bbca218f4a2026d00ef4708d014fe4194048da8e994cae1088694d1b4000000000000000000000000000000000b32833dc9a39e1e73578b21f75136be6c6aa2b4128b0e6ff4fe099f7b7a8ba8f2b769f68d32ab4d1f37793aca8ecfc9", + "Name": "matter_g1_multiexp_37", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000ab94114b3ecf9535261a0726a9bc0e0907385d56206b61b7a42f643d46296c4022bedae90d761d3c002dceaa9167fed0000000000000000000000000000000008e67942ab2b9aaf2f6f865b7e957a25dd7ab8d8a0cba02fb1648e4c7f15ce00f4f5d09199a583f38425bc62d32ddde69f3c65c2c25c6c37aa45b1104745cb8ec511a165ffdb7e304f5478aa3add4d7e000000000000000000000000000000000e53abd9ff27231fbb09155f794e5d126c490314016e31c0b12bd1d2af97a705bc267f92e20b64c91d9af1bbf5e45b92000000000000000000000000000000000ce7d0cc6656108aa7005a56d15a497009c90871f01eb38f1bdc82edcbe4945a2f2b67c9b812aee42cc9a9bf9ee84bc08fd50c46bade91a13d6dc5a06ee62e5e89e0ae7ee885e5516ca6c2dacc36f6f30000000000000000000000000000000018c2688f573d4849b6d19e711ef4d14659c2c580eb938434a3b2afb8c20c522423db4c7fffa42eee9ee907a6492b77ad0000000000000000000000000000000016a7e69d5539263fd6b7eb893d476a00efb8cf09f21a54e9ff0d1c11e9f3651eac8a5db31b40598af6c943f864ff60ba128db1a106328916ca5d63c0b5722642febed26f00a89430d52ec3eae25a019b0000000000000000000000000000000002380f3260c7289ab2005f7b1d7f572565ec938bd894bbb0047ced0b652fa2e74aef19c9fe6bc1fd469b2a4640245777000000000000000000000000000000000f32ca31e6bbb72a02f4b0da0e1627dab9cf1195fd7f48613c89b06c702e662478b24d8b3730321f803ae3a307fd498bd45665afb6a864893e389511a0f7b2df74c9e45a86fb69f6bd79854e3a88c2060000000000000000000000000000000001892b0d219ebabc3be00f45b00be55ae486eb79b1e41aa7dc8457aa0812e7276c21024c79646128fcb2b3c517aa41c3000000000000000000000000000000000793bed9530c814fa0d0ed1684614c1e6968dec931868a64372dc1b648b1f99ccce20fffec7d485a226033601b92a7f228f5fd09c2c1819adf8e6d0e0f4e4681babff46757edeff3839e9691888c132200000000000000000000000000000000173f49cbbe6304aa41513d3742b89c6b07a91be50264350d71bc03fb9efe4faac4a19e2591795ff4a7e67fef7a85ed430000000000000000000000000000000019bb5dcc59ddf055f099a1c3949bb50972c4cfd035d4d829dde4ae94ff9669983e9b1a7edccfc2436648dc942862676fe6e61390ef88f20591570ec1fe71c3ed769ee8e234c7cc7303a4cdc065717736000000000000000000000000000000000e3daf60e4929b4a237caeab203f86e6eed0ac630a8b955a03460a7e609398d076c660401f8d2bd9601e5bb5e315e1e400000000000000000000000000000000058b20160ca2232cb8b6cc63c5a8e11613afb9776e22d93f687e7ba005b099531f9693f65f153db01f20c8e9bdd7839ea83c5af2f9d10c06552ea7d1749cbfa7574b238433c1c0e4788efd0cafeffa57000000000000000000000000000000000c89f1ebd19fb920b6748b15192829d58820ee4995cab9035ad6bfd8dedadbc6352058806a7d45fecefce40133261f360000000000000000000000000000000019151260431a35d124fe44116d86ea99e3f3aa14e2eb09be8193dbaa8f26fb0ae2451ca1c70610233d3f0af9d2e33fca4bcc88d85a5a8a29dfad37ba97ab3a5defde4ec356146db8d10f33bfb36ddd3700000000000000000000000000000000162b48d56f439ff56197fad444dc460cc6432722b9b86c7abbbfa383ae1546e160716d94e442183196816084da90bf77000000000000000000000000000000001278d0796c26110f66930ea9248078c222a0590a031df30c62fe6beeefa70deb0c8287b0d204a911c147cb6344632bf329d5d818e62c9791c320e01a3164e142d9804e9caa7f96b4c3b76baff38ee2e6000000000000000000000000000000000f4fdfa45aa3b5d1838b4dc8a2dc6250c069806ec3c551ac961da5b44eb58d962d843a1c17ebf89bd653e9e44d16300200000000000000000000000000000000052ad9ce994c837596339dcfb73ee25bf8326657633fb5861039f197249d425e35c238dcebb287b77f41bfe7f4db5c9b971c8aad41e401ab6c49dccba28ef26acf4961978e94e633b72c581ac03621e400000000000000000000000000000000185c62a080df61ddc97ab56d2286ceec655172b6c863b509a1a92eeb0719060528ad3a3365ad5e7c0858167ac2c6d22100000000000000000000000000000000126b489e107dfdf4a4638069944d1b1297db734e5da1964086114f9f62081527d7d3f6032c2f29e75b4e1ccf5b3776d4659ff910eea5280dc5c24c542516053637a5dbea576a94a22acefc902e56568e000000000000000000000000000000000f884244e098975b837a58ae0218e7e2606821c95f51d114a483ed5d31a59c9b9cb3b1db029a0286eb95686e0457afd8000000000000000000000000000000000caab7f67feea4752d3822979a770a28c879f5e8f916b72dc71a3b14820ce170fd229fdb61596d9e89b4be8f515c470e12ff32d44eb442a711250875d86a401d0dccc95e5ee39bec71738fd812d487c600000000000000000000000000000000155d3e886cce6f257513529e40c21b5657ef1ff1f4e71bc32b968db3e05652b1ac780da573fe1a1b94b7fef86e7c260f000000000000000000000000000000001184cf09544ec2826d0101d2b79095da6e5f77d453203c52ea17b6476360ccf166ef092eccf86dbe3a260f7fd25a2794666b820fae2459b98f9bff20275a3c96ddcaf98a78f3f5fa4a2c0a26cea79352000000000000000000000000000000001523e919446b532593b8e70cff1206e8910444c01399c0dbad932b596cd0b9c2e40983ddb38eeff4fbd5e8d2b15bdc780000000000000000000000000000000004be8fdc3a3296e543701ce8c1184a983a2932f33913d6d733f5baa3a783382739b697fab4a3d6f9ac5b85ffbbc78a3540a9181633a146d7f307ca7606cd45b8e721c46b955a6989d421baafd8e401390000000000000000000000000000000018d20e7846239f472ef42c78454b6c335979ec563ecbbc3a93176a7be9dde603e6f21afbb68058035958ef7392dff3f20000000000000000000000000000000011ae4de8a7e1a958a1186bda4890d282773788f7d5fc5432393ac9deaba8bccb5db952547f6aae49b8a90c813c5a93a4662ac80797c633d8b9c8907acc2960ebdcb5bdad82d9fceb4411d5173b7411fd0000000000000000000000000000000010641c99a359d16dc3e3f68547288c944d44c7c3e6177fe94428ddcf3c86937a3fe1f41a31eeab551e11cffac012e1fc000000000000000000000000000000000f407b01737dca388d0793521b667757d70e626ea0ba3b051f522639e752280b5657b1b97beae3105489161ae95a470059401af15d9b83e2ad68cc8e2ad1508391516ba0b26fcc5ec6eda8b318a374b6", + "Expected": "0000000000000000000000000000000010084535f50807f287eabff2fdb83d34ca30454e4cd747cc3818a9dfd80c30fb3bf2f9f771d435b79a2d36105266f0c1000000000000000000000000000000001663a611323246a963856a92d52947e72dc123dfbeaeb9a3ede6147246814630e5304b50a6585894843790f5d4c818c3", + "Name": "matter_g1_multiexp_38", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000005315310b8412d62f5d63fd996e8c6b14aaad5a6c83eb3505a28fa6bbe469f7a7cfcf10b49382aad4d6764859ef4910e0000000000000000000000000000000012fbfd9ee8bc712354fa3b73e57fcbb07231aeac980e99d5843fdabc081a159bfc6507911212adafc162dfc21a5afb739c351c585d1920b8cfb89a5bcd72fe041b17f7bd091ba505b287778b0be4e87c0000000000000000000000000000000014e14689a5ef5b9ee89369c5c0de07fbb7980f37294a0e7570191b73f4406ec4bd9bf4ca2521f8d90157e9c3c7d4211900000000000000000000000000000000040d06da8127e64a71532afc8846bd7eb6fd5e845ca0f1d96effe0b12a2f8afb121d7fbe89f632262ba0e382e8204701ec42da11e95cebbeed0ebaecd31be24801fdec8b81f4046fea52f553c4e7910b000000000000000000000000000000000c5ece364affb6af365a4c7506389694b9a10f3ad6798c326852fe85a892014b6901d097aa8910256f47ca1d4667b5a20000000000000000000000000000000003f300682da34e22416f1ca2bc3430e3b153c95773c8c76660603a0ecddc20ba570545d9307a6b0910eb406aa14d196bdfdd8996780460757702e34ad98f5f64a8c1e0bc8851d6c97f02749b8f77cd03000000000000000000000000000000000ad0508c3b4fcc1cc608d002b66bc703cc16182a6e83794e4f3739238c3e02fbb6387ceb445791d54321ea52f779a35d0000000000000000000000000000000009a442ba572cdd9e658080fdf1753670c27e88fa894c307eaeded6ead17799365d1cefd1fd13f0dc321c0e881a4965d3f256ff23b38b3b986a62074c5a3e05e86ead9431fcdeb67512f6d502fcefe3c30000000000000000000000000000000018825670284d3dcaa90a678ff37f23e8ba36307f3c1146a8f6c782f7b43ce16f281dd346962904684c22c1980a772ffc000000000000000000000000000000000d65166eaa6b4ed79b5ddcd7b44f06ca1bf8b960211bcb17d5a26a8595a1ae1aecee9945a674b92384ad05f2f0f64fb6c01b3c8bb0acb17198bde9adce3b0f7ed4cd8615f837aee928524b0984c99d0e00000000000000000000000000000000098da5d9289f26b61486e3ea52b0145a47847ff2b9f1d2756e363e5ea0bab27a98fd01d633a46ab48aa1d2f1d2886f9100000000000000000000000000000000191412a43858276e4d7e69542f9e6ba4fa9bc0a8784df590aeb1e0d65ffb56cce0031916af640dc3e57662f5e5203436458f882b63c99ada33d8215111a6df21c8f7424eb2fe9f429256201d099413c10000000000000000000000000000000013a279c27bf2234542f4ac0e4c2676b41b3cdfa1b55d5c0eca1c686589c37ac63139a7f532910fefe275a08ce2d37fe50000000000000000000000000000000002f56719390112560fda45943509729fef3eed60215190ca1f90143a4d2ae6b41aeaff7edf027f27857d56bae1900ecc804d7a35e5731b111a6904e0998d90ce86cf612914152fe3d2fca0201a41166a0000000000000000000000000000000016489ce6e2b8298e2fe0836556875156502d36aaac621e45514ef03db87631cfcd308285fdcf8ca7ae8bf65bf53a37b3000000000000000000000000000000000b6c8fe0db4492a309148c54465ca06c59c7b71e4418d8fc1874cc338df40fc1355a523387187402b04f5d01b5e5b82b6f1629a801db6bb4066588ed79f75223120728c3a57f7129d88f7f877149223300000000000000000000000000000000065358f885a974a1f64ffd526e5ced18ae5ebab2ed6c9719c9f879adc940292ad124fe5b6c8278c82a33d1ab2a1916130000000000000000000000000000000010d019536f727f8ae098dd9ccb6344417042855fc6722443218d83127cd2b07a6816698dc1a48776d2cbbc937f83163dfe80ddbcaeb784e24975b9a42801c89bdfb842cbde5fbc0c3d70c0632cfcdab80000000000000000000000000000000004248c5eb514980da698bc5146fd3743f5b1a458dbb17edd38f65c294e48bbd55e0d9afb3b39df2e82085fbc03e5655c000000000000000000000000000000001830c1d21ff8cd1ad8467ae0a8d2a34367e7c44829f7530263ef3d7d5bd9eef76b756f475448c308f4c03453f54b43cc1aeff13de7bcc4bc2ac1b37e28ce466805757dda29c9c743eaea9da33f47f4fd000000000000000000000000000000000dbb72f9afde915110f2483c09291595c369f0b4ce2c91779da9266c9f74764da4976a221c4997cb940302ce0e59ac080000000000000000000000000000000012de4b2ca14004be2c64ada45e9a0ba7989ea0e22d0407088a092cad87b4e26b33d5d8f96fe6831e085c6fd27901af61c4984739882bd2f882e12660815b96d2af7812d7ae87f5be034b88e9e04fa289000000000000000000000000000000001387a1edcc34afa05541e15e2355d3cdefbfe22ab7481e1f194e461521894b97b2e18c9fbab1eb5d8e508a0bdae08b5a0000000000000000000000000000000016c4ed675f20aaf2c825de5bc4c11ce1e85a0b91b08577080108ab7b52bb674f78943a5f619f557b96a72206cc1bd447e7f33141d383a1a927b7645656ff7a5795901a997e27003c5672ae4fbab4aecf000000000000000000000000000000000498481301a55b2d1dc95f8115534b1baade13c2cc4d5bdce1fe8cb1734004600a2359e5dd1c61c7338275e2f4fdf455000000000000000000000000000000000a3d2ee413b7e6c0e32e51dcb7d124be92990b7e4307b9b459da1db20f85f4a35964b7987933634fb62a07f797b00b27fba4674313a9727aa4b733832a0e06666d3e38184836edf786317de9dd055cbf000000000000000000000000000000000a885ed8c3ab46b60a7d2e198b6e8d069ca8f7e0692f2b8ce99df2f44979b6045fc17991bfc27867be79e2055cc8aeac000000000000000000000000000000001728864f0fda8476fda4df08fb6aa9e40a01dbf19a4d22c4fa0c319d8496d405f0a5f9c79ffbdd5a4c1b617326f3d774dc0c4d0e34d8a16b3bfb51ffc9b3c353817e8e357c608b5075c173204963606e0000000000000000000000000000000016edd94f91c43f15818752660e4737071d44edcec5d5de426141966a9880bb894f3566e98a05232b9717bf85d66a57c6000000000000000000000000000000000a789ee6ecb80e2ab9c6e7a945ae4839c620f9a7bf430ce09b57a64479d5a10a1ec0a721678b5bece737f0dce97a3a56e4e31f5b6629463311b9d3c8333c33c5b2e79761ffff9863acd9d636e1a9586a0000000000000000000000000000000008affb2247059dd4bd1498c8e229dcba313b156e2f420fa55331e7eac93d44af55a6c02bf2101d90955b95ff6fcb411d0000000000000000000000000000000004759596f12f17d7bad24723ccd6f86c646a39beb2aad35ae5a219ef57e1ce6eb310b2098130489421709bc20b4a53d703f256e58f60307ac1888a1b0b14b56c7435213e271eecc79b4a6f88d102be4c", + "Expected": "000000000000000000000000000000000f841cf3d8897108b4a57a7802a3cf8a43ae31e711a6258991b6d5b3851e9e0d759fb90899e462828ff9cf996bbe9ec70000000000000000000000000000000016fa655a67f441e967d3137f6ea8f6cf636fc1a7bb662b1e22f87397e0c77f34e015e6bc124291647727102a12561dd8", + "Name": "matter_g1_multiexp_39", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000c98e02c9f7784d0dbcb4a49c97a9365cd069817d57cea3042cb4198180b95d141c5ba4d383de188f06faf8f845f78110000000000000000000000000000000014be6f602cd67fc2d147925cd6c90457dd253db766c4b8f737cfca02ae15b47d5798c621091c4be71fec75e0b8b1c00feb850f01feb55bb99e4accee0aea8fe6ed0bd29b2ca942ffe09456733aff10ea00000000000000000000000000000000077bb03ccd915742dcf3c2640ec61f05bbd70987d2dbe9641e0e34ebed3600703e8f9c382e77f99b70c47f54496bb6840000000000000000000000000000000015ad452396c23e820d1e8a8a9cd7557062ca9c627cc7439d43c528e0170e2760e7761c9cd872141543834c89c75537d72b373fd7e5806d227ca1f49ab0a7f8be2b5950906c8974de9f2cb4e13ed20a9a0000000000000000000000000000000008eeb6c2c00a9f95c5b238290b06a67c1cbe0e96da246537c29c0efa36b53230c3c5d91e3fa9d129743e5a9d87e81d0e000000000000000000000000000000000ede1011370a956f240419cdb8a0c8ae869c3d583d938ec32e29c5ece68ec8be0e69296ff0c97aacba59991d65a25563babde7f3fdf9fba868b5eac61337be0d73517ac3f06c39b4eaceeb27ab6311db00000000000000000000000000000000179776b08cf2da01a94bfe7be4b89b3308330cf797906f85889b63487115b386c68c8518158342747377fbda82a6d2240000000000000000000000000000000003e51d69bfdb73a2abb469b379e2b4825423d2a2cf2cec62e2313a76d260be1b0f2892bf82e5435e88205ecc9424275d5ba1635cf82b25b2d7e466717f5716c33f5f3e826bdedf19dbc1d95ff0c8052e000000000000000000000000000000000af478b121104742d0cd13473d1b7f647437d980999cbe7aa8d2246148d970136f6194df1785027ce944cf9ba00aa4f500000000000000000000000000000000170e9f798184188cc21b0950e0f3a570398a97405dc87a2e077af96799960a938f363d216474422d8f4762fe5893ece61a0a832e5bbdf897553c1aed35fab43aa3f4510c1782115e14e5d56229de2dff0000000000000000000000000000000005817e3812f73d3d236e45664af8a4abd2d4a44f741c3c1866588c2bdd88b11741b1c272b68e20800abf3adad7125a400000000000000000000000000000000008dc859c2323f0d2dcab76bd8454209c86685a971d531a32b00985eb822d33691c2524fe25d14ca386047a4976b9e7159b75e0582e9ad7aa4a02ed5ffa22e55570c9f20e6a24e2186e8a2a2f838fa453000000000000000000000000000000000ee06092a2ba4c33f5c9dc6062d50e3b133c7fde5c81056f74a2d869e8f92310f07629db9cc2b755f12016cb7894aac10000000000000000000000000000000011714a54e236d1e13f9b649a0aaa80cff9e093342c71a8dc9ff1e2d4e95b0f6b4219ed847ba6620d23feded7d95944183b7252f8f3cc6341d490c5c4464bb36e012f1b05057f405aa907ebb2c983f6460000000000000000000000000000000017f6061908e62edbb8fc5498eec23a51c861815bc1b437b7383dabf303e6a45d52e73f8363addac61974043afacb02ef000000000000000000000000000000000f3fc04d17d801741f3583e072110b327a3488135659fab2e8b1d2aecf4694f6d168bdd60624713a7c2c3314f8309079f10427f6e461e7b63b781e116a4d5136ddc79ff86b71fa754f00c797c035412b000000000000000000000000000000000db7d958b44ac5ff3bdb4991dbcdcbeab36bc6d21d9e0c8fbb1eb66601df227a6367ccc783a92c534a30b17be462b95d000000000000000000000000000000000424eb0d9da831c658ff048d3e9ee43a900bd1ac98bee97be073ea55be1dfd07d425e0906779f0e3459fc69d316599e56440c89f8b10ce15806938b7ad65ece194d2fa3cc8d7d5591bc1d52d010896af000000000000000000000000000000000c9cf785be01b7f4bfb0140004873d0db4c8b1387dac0fec42c6ae1a72123ea5cdd2b8c98c69b78d617b16c48ebfff2b0000000000000000000000000000000015c4856f183d26d13196739d9b9c971af111b4905b669f3e46bbc8d8c4281cad1be05e9ac28de0a98031923fcd1f5aae43f1bb26469b778edd10127e634fed4d749e25b41d8eba86eff2c068c33e714f0000000000000000000000000000000001802675ef47f9660d5969dbfce973c8bb3e6b2a2717fac9a509fb3c7ddb272db86f283992eb3167145f2e496002fb1f0000000000000000000000000000000014a5b5d966ff72e036c51686dc6a9f39a487ab8adab6fa4a906f28acc67d64576fbb3a00cefb7720f42ffcd62fc8adefa40251ec7a7e9f7cc29948b122010d9745752df3f4a9c67427a8b58122ad4e7e00000000000000000000000000000000076ed600ed860f16ec5dbae3f09471302bf85fde7702b3376b0d670f93560e77699bed969e7001570f44dc5e37aaa830000000000000000000000000000000000c993a8b08d2eb00bcee05e1c09e8a37834fac53643643402f60fbfe2cc7d795f5c68f3d6a32c8604c37211585830426e03e5eb477506c397bc1a5204b30872085a36b65b7a8df3e0e187f3022736329000000000000000000000000000000000eaeaec30bd8d8dd9ad4d38ff97e08706ffbe51388a93967cf16155b10d218e5b1213c29c8054cb778a0d3ad22d32eb200000000000000000000000000000000079e5f2bf405cf2dc79984ddb3f813a07225729d4cae8ddf7536e9240fbd0480f6b66321749a6a9286cb07758482e7f865cb04110bbfcdf00616c2826e253f61cf955756e94dffcbb6001f59ae4a93c10000000000000000000000000000000009a0933829c2a3f2c3e93f58551e7572ecf6eaa7857aa899a7ff0eeb15ccd601559b9ff844a177568632bc0ddd6e80a5000000000000000000000000000000000b69f23cc1556385897bb7457a706cdd8539a3ed3e7fa504ffbd95abba1e824dc77911efd1ad0a9c37e1a41a76ad38d13ce1bb7cf7d7a55f0624bf5c4c35327b178923d88be748a9b079720c27b500e6000000000000000000000000000000000d3c4cfdc03ef5fa066be3c26744032e5a2045746cd303b6df542a6133c671f4d25dfbd889840fd624125b63839a1aaf000000000000000000000000000000000102fd619ac946e99c765010a4ac392ab907c37b31f628d6d58c0ade093ef394a7547de36ca0630820f4b5d857dce449e2b4c64b363efef0c5525b0337bf407879755f060af451075f4345dea7e681a3000000000000000000000000000000001589cebd579c2cd31226245f1dd3e428a76c7d0012f8dfac4dd3428a716d05a0a79763f0061d3b5846dc29a8a006a37c000000000000000000000000000000000bdf3425e6cbe628f9223930cb74ace4358e12e5d367a3604edb05cf0f0cbde84346ef45597bd61592500583827524144c85e47ebe2c26e0aa25661d3353b5d88c632182aaecb35303d8d47f01308a0d", + "Expected": "000000000000000000000000000000000555fd5a7818bbaa7e786f11eaf6f8620b9686b76c6293fd91690a4d181c0b470295313294589daaac429607b0020c9d0000000000000000000000000000000009c3a53113a657a5f7e30ec28056455f700cc7c3d40cbe4219dac00980675023bfb7462e634c8a131493f12725a27d5a", + "Name": "matter_g1_multiexp_40", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000002d49464783e5ff91aa0dbf6827315dd308e778b3da5833cfca3b6431ae784193d915a566142ef347b6ca024b6f1695e00000000000000000000000000000000029051d39ea4369a837d4cc8cec1eb8f9e7f9c3a247dcf99dc75eeae43378b4b9c4175aaa5eb3f7abdb1afc15bc2076d5bc589e7d89994400c511789cbcaea19b077e0b02d625e549bc6f2673ce40128000000000000000000000000000000001363b8347ef6754f61520942fa8cdd07e6dc2b72cd40ae41a23622be239ee25834482533ea7edb9cfd5a4e21e4f33f020000000000000000000000000000000004495e8d41b145ca7f5268e66c03528c8d976cd650d815257906e46c1f9a0827e0e79f5a8c2906ec96718538e1da3b1d2c3d2a0cba111642a6354c117d494be805cad5b5c486bc47906a2d37a9cd9f850000000000000000000000000000000007735147af3bbef7cf0c4a7c8f1dea302a5e4edf01d42c1e484f7fb1f4b8fa23b8a7a16fbece9270d8786016836bc979000000000000000000000000000000000053406bb3d2a4cf37924643a186a56844a4e77ea4c9e9e2c707b5f947ef956369f400e448930aef7135449f8cc51ae1530ff74626657262fb49460b2c6981155871f2eb5562581a74f968233c3cbe3d00000000000000000000000000000000133b92eb9f9a3c6cba655d5f26f396dac467b6444657eb0a811dc6a58ba1898f24b336f4fe9b11c1e0795891b00b6c150000000000000000000000000000000018952f3a7f8aa78a8c5e5bd96ecd5d2b2f237916d8e2982c40cb7498423f12c6ddd3cf1afee75a3e2cd773bad7ac3bf6d182ac912b005e90ab81d4f2a906da8309a69576a8afaa160fad2540ec04991300000000000000000000000000000000051453a8b81b0b0a1566540b3026e40676ea48e3c5aff89ec4fe3b36c61aea27ebe01fe8a811fd3ff73eae0a67027cfc00000000000000000000000000000000090b399b1e5af056b428a4c270eb204df4999e53807d34ca750f30b292cd38030491c3d1b0e08600f40a16f707b4903242a002a460b51429e25f85ec4abaa580ac1a14315b1627bd52349b7b81a641d600000000000000000000000000000000142bcc3458437416506631c4dda54572b5d66093ff23f152957350a3aaa462000ab000cb8e9c9b23a17149b5d012adb0000000000000000000000000000000000734c0fe1df24449ef498fbb60558010093cbc8a14ae068aba2f70bd7718e30450411a81499a895e3d84079a9dbb19557a650dd3765032ac139d1b54ec7a5457c9e3caefa6af45d198433e5949d149ad0000000000000000000000000000000010a7a3380a6d8b2bbf212da72eefb57d2fc2305ce222e8d908bb572600bef7ff55b1df6a9af717e1345967cc18e779ac000000000000000000000000000000000c5a3aa84b489c879eddd3c20df6d510edb5e9ac5c1a2e42b770571ceec315d560235b27468299e2e60af3ac1283be12bbedc44d54349cff199befba9531dd4120a51e2b830a3e356e68cff31bbe365b000000000000000000000000000000000035471ee35c187e24cf0d113c0ca1ab6322528153d0687b15953c39290ec295c0dd4197b72448f2a692537064ede8fb0000000000000000000000000000000002717020e3369b288314a42fd8ab6c6ddf7007480ebc4fa094ff7c4c4b750f477917caf071d2f1897a826fe870c2b7dabef3956ac71bfe97029b8e3f85923c2fdf9cf1ea6582b68d5a4eabc6b044c80d000000000000000000000000000000000b501cef8ea57ae253de63d81998768e115d58b353ac1ed6e90d24f8c39a31bac1a5be1b535a1dfe05e72d80d1db8b0a000000000000000000000000000000000a3b62c001c4b725f7cc861fa042c31fde4e77b3b0610df63dcbb7e89d3fd746919c2bd8ee4d623838a05d42b6932383392f5b4291fbb18a93248e830b08fadbaad6434040c02b45cade73b77f22c2bc0000000000000000000000000000000011cda0c937d8fb2b21174ff3a5b88aa5e1c9a8ce6eaf26cac9fb3ee7f3ad20e74ebbe2d1bd9f4faa3acc43b6e6d0d70b00000000000000000000000000000000195257a442c8e39ee6b72cedaefab0034f48bb988a3355ad07b3e3e314800b2ce30267dad6ef3fd9dccd7d2318dbce0a20a96f963375d7a294b584f2da699a6a00eb5781f46830987346cf4fe922a2f6000000000000000000000000000000001630ea3c7f910ee8574f29d652e86fe3125c306218a894df0b4688ba582ea7d597d7e62cc2e7c78dc2db289f587f10ce000000000000000000000000000000000d2ecfe74480518ad4f5ded701afa68040246a08df1b8dcfe6fdffe77e33c6bbd37192c6c41c6ab5af506ba58d8b3fe4115cb4646c8996239f4fdda8c27a335361f0a19550d6eb0225c008408c4725880000000000000000000000000000000017a910c111d7a0f7e7a3d48b1cd358e2a1213edc077034b06d1e96beedef80473ec17d1c10bc2d33d4fd2a8c052d926900000000000000000000000000000000040167897293a68c980bc34b3f79802b95186200b40b4763fee9cdce8afc681ee916042d619cd51361e6e02688b4915ac8a8d98c93c392aefb64ce0c7ea455ba14c48bfbad0e3dc38d43abbc3276caab000000000000000000000000000000000dbca3203ee6c7fe8d6504ad2041aad2681b889996bbe28ff1282cd20da563dcd5c9fea5fd03072134019f579e4ef7af0000000000000000000000000000000001317a861403866494eef2bf59519f2d324586e93a0037d07312dd8df4ab844525afdf4b70f9e21a6e0230bcde35db4d8221622734dc6ccf6c7b84b387a3dfecafe187dab70ba373b4416ce3c505bef200000000000000000000000000000000069ea1da08dce1c1239d49411861d3e8ee7e6082d9bf8ff0aad1cbebdea6dbf82fb0d6332ae436327440b71ce6535ed500000000000000000000000000000000079904ab7b16de5812ea3eae39d790aad32db02c9cbf7b8a3a8d4222d3baf710ba1cc5bcdcf4fc9e2c4567992fa911edd3d1f427a25f5df025fa71244cb92dda9391d65b04756c41de0f67ea072c375d00000000000000000000000000000000173ca2615b65e574bd77c8cf55bb116462a7ab9ad4a3879f0eefe03f1a6c0d30feed076e0fb21fc60ee9f270af180cda00000000000000000000000000000000179351092d68e7e0d428811cd4503a57bab9a4072f1bd27b5e8445ec0058eb46af58c4752601b53714b816a4bd386048b55c943fd9b11f2fb8a89f6c08a6eabe9434062354d845f1ac740e6043443f8b0000000000000000000000000000000016c9d1fc1790a15985028a38e57c87cf010c87bdeb2a288a055b4b08497abd1d616fa8b28d6da8cc23047e9f8bbe6bec00000000000000000000000000000000089601933b759bb565d849c3837570feb39d442461d764a22f993a695fe1c55283b8c7db02694aa66032512d44dc88867b0c1d54e51b8572256aeb72bb032a5011a3e8ec5ad7e8b6e0397b9f6fc64c9f", + "Expected": "0000000000000000000000000000000018bda18912ce64106fd3d54ec2024a1d3e4a807d7bb8aaff7b515d75c9934d4729c14a4a72ca7654ca811a69f09d170b0000000000000000000000000000000011478fbc5c03470d9cfbf3decf9416e1dbea8a696636b94244c5c637e43f81eaed0210b1cbcdd291094e8581dba3548e", + "Name": "matter_g1_multiexp_41", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000446af4281a01e0a20b7428d06b63b89573912955971be4a5cddca514708419640f8a7f95b50ef8714a04e1fd81bec64000000000000000000000000000000000087b94d8493239047a5cef74dc20d7708d7e3365018df80624cc5511483c3a5d9b14ac3d4aa391da60980397e4fb1e96f082a5ffb8baa38ffd684a4a70114343a1e723bfcbfeb57d0a85ad5e592d74100000000000000000000000000000000033e5eb4bae80d55f512a48b44054d0efb8af1f9870fddd99df00f31dd437025381df3f4023ca217ba924a961864223e000000000000000000000000000000000f6d7a7371eddf7283890d59bea3c61fc3bff19eb7fa333ae713fb9a73c4971354474986ef5a9a81ca8c5b38bb67f58d5160286a6d23c30595809dab6ee6523d7d235114d1b295087e024b4f6ffc80e50000000000000000000000000000000013d4e9518d398fc0add8233fe58c198d65966844fe286fe657891245fba8f37665e2bc40e4e70886667c9e2c0a1c245300000000000000000000000000000000089562c10b287d4d66b2b694d29fbac936f700de78525e9be59a83543593b42c5c577910e7ba1b67d840d88e7a3e53fdbbca29b94b6583d46753473143d13a7aadb0b18d6d35d7423b8a004991fa1ce50000000000000000000000000000000005762727639503eb63854e5fd3de33bcdd80227e16de19cd7cfaa10b7863915e490087dbb980b6dae5114df7d56716d300000000000000000000000000000000104306b38970a94b5c8839ff282883b7c88c7ef45a7ed49a02b322a16521faf2b881e2dfe22da3f4472e2bea9fc40d7e607c80069dab2a16e39370de32df20534aca46565cf573159a93c64f1f0c4a1a00000000000000000000000000000000056e61b51113719c1829d4ae4361f79c543961de801b1a62ebbc3cff04b0722be241236d4e1b2dcf7c309ab9735334a700000000000000000000000000000000031ddb45e491ba2d719b1f72f54640c63e281dbf6ff84eba2eaa2b781d87e243e7bf84d7151f27556156970dc8a2407f41c1f256e866d218b3ec20c132446945177d518573ae3f0e739ebcc8821bfbc700000000000000000000000000000000029eff96206ff45ea9bd0be2b83cdb660d6bb2d236971517b962faa54535f01097327a00154bf35dbe47841eb36417020000000000000000000000000000000013734f1218c3c34d2780920806c5ad211128352d8a41c2a1035594f470ae347e372914827775094164a5db9d0b2a1ef7c72a47e2267010c532d676ee3c3ebfb2be2b7569f6f7a22f76733d7773ed383c000000000000000000000000000000000f3aa9f069b07cc935a974ad4eeb47e8b0083397928e8102651ee54f53005625c359d82fc8b5dbe1c76f650cdccc2ee2000000000000000000000000000000000e2bf6a8c4234d118676a29f12daf244ad9aa562faa970d2d63feb074946ca70da039e2de104f1524b1a8f3897f053f4c52f48e84a68d99124e678dabaf376c956dbe9603974283a9efc7c27e830e959000000000000000000000000000000000795a2b6b27209b48c00cc8d37864f14c6be66d6a41038122a28186d7bbcc4b02f531aaabd000fc93c685ceeb67bc3c500000000000000000000000000000000143926b42a6654e439fd01883f1ceb524cd8b5b1f2e3eed3e905f6e948736790cc1325d1b04e30247e4971b75939a766e4fe662495bffd8ace4c1ddb39e612b361bf90a0f1bdf6c7fde2bcf63df1bbd200000000000000000000000000000000074096150c9e04c082a1aea20c785b3a7396568e43707c42c512575a97db8127c8c1e0548d640dff8821d7d235f268340000000000000000000000000000000012dde2f1d15c04292bb5da4c467cd674ddb43e401799257524cf3097d0dda1f3c9f2f0637cfee914a4c66d737f9e3278651e67e96f64b80f4978fdc1cac90be538774e34c2f619f8b8e60cd2aa20f269000000000000000000000000000000000109196dc59d6ec06fc4c774f665612c11bc3e826ca4ba528a15c6290f733f3aa1fc441bd896021471e1e85943fc9ec2000000000000000000000000000000000aa0d17d44bf354e48275ee3e4f06291e242402469be6f4cd4a62ad3871d878c1d27a8d06974c5c1138281802368edb01a6ecd3db89a7f07344b5728efffd35a11f7380c740669f746fdf565905a1ca000000000000000000000000000000000067458ca402c19488e2515037abf9323ab8288e0e11f7cdee18b3da50cfa377435cfde1f63dcdc451ce65a05641cae370000000000000000000000000000000010ed9c895629bdafae66ea176388be4e4ce45cb13ecbe0869ce57f0f48852b6b8c47bcc4a14fc5327f1df372ad9f5d4a7db5ef4c1c174c2e5ffe5555f54f4e845c463bb5105381fb39eddc01103b1bf7000000000000000000000000000000000f393c5fc8e5f1cbc7b59742e5b6236c9d1d262d0b736c1bc188ebf58f954bf2835cc70617062a01459c139f328c912d0000000000000000000000000000000015501635aa7565045ef59067e0ae91a5ec4871485ba411425987d540bcd7b5782aa7164dd631e4c7896b3949cb115f9a14018f14c50d40d3324952ec22ed247c13c4cf10eacd32c3671757bd12b041e600000000000000000000000000000000174b0620cb49d8b1a5798c3746046c2888c8e96664dc7bda5b4e90336517448eef534469a40086703d9a835d2a94930500000000000000000000000000000000033db9968fd6322e7bbb9de572e8c92b5e3717a9496803e3f6ef8dd796dc6487909ff318ad6d4d91297ae6f2daf07bcbed4a28dc3acaf2220ba56d026b292a7d017bcbe358dedc57556cf638517bbb14000000000000000000000000000000000449ee22d2c23ec02fdf1751bb59feafef9291d6d56f7120612948875afdea56453e081c5c5086205ea83f0b8cd541ca0000000000000000000000000000000006114d6d8ef1e4c6d79b23a2b91e5577323107d90523001cf7d6d18a0ecf3b414d4fe1a3eb831a6d907fce9d22030bcc30fb17a38b7d0888eb02394eed26406bce9e92779251bdbcb432153a550c0850000000000000000000000000000000000c2082409ec14f6121de6ebdc06656a28dfc5e439a0278593dc6aa845e8091d8caaef45ea1ad05aa12e3c1533275a663000000000000000000000000000000000a2ad9980247640d44d3b37c7b7b2c1b57592ac12cfe9aabca4f88ba90c8b3221a2b9f5e4ce19ffcdbbaf99ffc584219980b5873a5d0f78c3b8582581349498fa997fe3c6b1abe0edaed594253359d8700000000000000000000000000000000108ea3fbf78237f0e90d4addb69f25eadb0f21c89d92774b4fdcbc97632f1622ab4ab408fee95e735281ea5da5c2c8130000000000000000000000000000000012338527c7932a737daab3f8de98b9f2aab59aa1b12e84d3674a8ddbc1f86a8a9e7eb0ba854e9564407aedd489b6016c619f5719c320320a3c45dcd6207575e0d8527c458c56d3decf1d12ead8a985a1", + "Expected": "000000000000000000000000000000000aaf02063d6b5b395b75faae4039cf2eebb69053f1f161242b47854cf07786788930f3be2598520c178301ae0bd13ab80000000000000000000000000000000019574e1de9161a11e804d8077973c5ca70ff7925c847d870cd2bc985a8724d41331fec6c1cb341f7509a37371db9e4be", + "Name": "matter_g1_multiexp_42", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000048708595ff4f08cfa2b1c101ec7b3538a2e6044157bf39a63255b5540211105f680464be5b03256f9153a90a4e62d44000000000000000000000000000000000f2fad0353cd8fbcf0ba75a403209094d88d8c8d068eb0c7077b8263fd9f7bff8d6234d75ac4da232667b5c566604706119d33d32affaadbf6c2b6243bb7b344a971270b488cf887334fcb15de2818cc000000000000000000000000000000000866fb774b231d82a4508ff9b017ab836936299954b2b404affea65f315b62da34c76019192f5c9a447dba8cc1b9075d0000000000000000000000000000000004e050fb7a17bc738a55f1ceba48920c62648a27cf438b770a66166522fb0929069fa6f2b2b742ed689f554e9023ec14f1d832b355d7e0ac3653431528ad0a8f6819daaa19292a00c910ff0ff39f46d5000000000000000000000000000000001710b342a52b0781d1ea18a9f07d54fb18e9c90e44815cc7509aca3a5c9ca3cca6bc32ff6ff726cfa353faca4f097e9f0000000000000000000000000000000017fd38b122a7ac39533af597b462224b86370f6e6814ca1ea71d961b9c7cf94b952fd75502031cde0851773b2c6b0108e6dcfa50f6129544835b5a4568954264ea68d9e2e5d4370ee31026997a3fbfe90000000000000000000000000000000001fd243a3c69dd5e7ef19cfbd9b7cecd475e88d7be85dd3a8f48eb46d5dca39d05aa4b43c0c700b6632ebc0b4cb3baeb0000000000000000000000000000000008ebf24e9d2de0fd82c69e0ddd1625da0367c2e9f975118dd2ba5606d77de377be10515d9eb921be5136ed25fa6b27abf7822767391d3b2331e8e1b81c659c6e0262f7355063decedabac9797a84f0f400000000000000000000000000000000021f919adb62791296db3a0b81f03b87c01d94ca312f55cd94364eaa654bc47684d7b0336a3afe813ef1aefc7dd0ced2000000000000000000000000000000000b40dd6bc2fbfa2ed277d88f77aded330c54c1c46a781ccd039b270ee9b799a70855ddb1201dae29a1b124dde1e6acaab1ba1cd6a4a6c433624dec63547119c0d492e3f38afb04e5153d82e400631aef00000000000000000000000000000000054f284874c53bc914040e6751ddd444604d34a38314d8057fa0f77978150fce0add250a6bd8693ede79c9f6b2e025de00000000000000000000000000000000045f6579793d166198d73ccd03da2e907efdb31b54b0b0fe3e2f1e02edd7d9cc0c08af089330d53aedb60aa7cafb0e0ca41e184bcaa0721caa4114d6393ae2251fed84aef57c7927a170145308bb136700000000000000000000000000000000189aa0df86ba479009d4bfb8608c31d3d49f52f1bf758e5c05ee9e5a673bfa15e1c6c37a978c4c431ea035cb7948297500000000000000000000000000000000120c90261fe77d6f41a42a170b28df1c9e6e0cc4bae247303f399d3be7c6ce8319a43e7d551fe554783ec5ccaeba3bb363cb451d8eb3565274793925a1869ca5a25fb19639449c71a761809f785568de0000000000000000000000000000000005e990869491ce375477b586b63641ec71adf226c631a14ebfae3514718ce546987c17c9ef41f9005c10eb04909a74ee00000000000000000000000000000000141b8edf812a2918dc9a2242301a7e7f6433a83298be9312cb48f0d3f0c819a4368ca961a0b6f09f9e077cca6111657e6a2f94d55f784ebfc6b6260327372217d6a5b9637ea5f9afc1a65f99c221c29f0000000000000000000000000000000010f3f93de5573e42ced8278a7a12b58086c04f8b862e11f256f26731560e606ab81d61a1090857eada5f8eb3afc363c400000000000000000000000000000000111915ab2711479677489dad7695cb02626a0525ae9ca51b5271d5fb6ff438d99730369654240b05b5d47fe00847c6327d889a3362f551b88e63463b7f0cc334fab3fdd302b630e419e362ec1eaaeec0000000000000000000000000000000000ca6c2f2191cf86c596b439de0e0df79b441de41c7661d4b80723f14337a379bed9b97958d225700f06f8be5401399e10000000000000000000000000000000015904391fc3cb879147c2b5192641c4ddde11ca8129c3a03b82f5f824b2ae60b3a33c925112d2de94ba3eee10761da528bdd400ad873cd6ec546bff698171942d536b94e69dfef4bbf316a471d4b45cd000000000000000000000000000000000fefa6dadbcd8edf2861c6ff4f5eb501a76507b1fdc1b8cc992226a7e5ee17ea343cff89426c409bc36c2aa3a8f5793600000000000000000000000000000000166706cd1ae090a41ea211d1333d360a1e34dde717979295a0d6a870932f31158e43ca041d1978815aadbf761275953163b496a64cfd15410192aee9912f869deea5a08eebd6b160667e12fdf23c44510000000000000000000000000000000008f02061fbfe82eacd770520b46ab49bc29bf358468adcf904854e39b30ec4e363e80f18eeec8064947bd8612c37493a00000000000000000000000000000000138888a1fd168e9c94959cf026605691b4100a828c3a75ce95f3dbeba2a21d8a44dfaaad834dbafe28c12154f41f652e70de38cb4627f53509eadb0918e562c6fa68a4cbdfa9f7578a8aaa8182f531500000000000000000000000000000000002a07974c00de6936c31202e2b0c76c30ad15b6c42393d5c5d2b1e0d5eaba8b5680d3837a8029283f572d43d2944e4b10000000000000000000000000000000013fa3f905a5618b7aa3ee5ed37055f0472fa361fbe07733f9c500657338c62bd4cc3b0b89e8223894f365a58100ee35416732c583e8049a5de38642cebab774d90d5f87601e3599ffc9af692ba532e620000000000000000000000000000000000775861019fd75c201b3a23141c8e962948ce38fb0f15cf9d08d56ce0dc574300e0a6ed90a7c50b8c71a1a9c466d16200000000000000000000000000000000066ea30b3a1bd410e3c70b1173b91d3eb9fd0be55b2d583c4be627c3aa9cab1b2a5fe13ccb37d781965b1b121079916c4a037e7562adfbad6b1ac48b8e4b6f277a788ea2f4416ed2900ed2791f09bc24000000000000000000000000000000000ec3ae37e6e5b0c623534f5c02d998bad139394daa28aced4b9f781a5ca671a02f1638cddd3bfb5124f9c5c830cdd9e20000000000000000000000000000000002688ab0be331d6f8246a54749c54fc111d2f7414ddcb1f3b42724e5bf14cb8ff3546a3b9be6115d91f62af8c3eed35efa878f6a2e18b88d6badc5b42775e92c17974f3a18817b7769d44ceecac46b890000000000000000000000000000000005d5e2230d538b05b690e878c03d793fc70c391e853b0ae3609f81a7f24aa6d5a67f3138308328783888645d1d84a15c000000000000000000000000000000000d625eed47e245ee74aeb91fbd72981c4f2afd53deff7ab478f32e2a8635431d9ab9848f7912dfa4bdf8ee7201ff418bc4f1a7d2b66e6202c957a649384cb277dbba769afd60708b457613f0f3372515", + "Expected": "0000000000000000000000000000000007cff832bedad3caa9c91ac59292828e79811f91c51c4799e2752ac0c12e2c47a2a07ad0521097af7e4a939f3fd230b70000000000000000000000000000000015037ed0ec4981737fa94f276aa9a4325a2267b90f34844f14a92d677060a23e23e3ff0b3df77e7e67e85c23b28cd44e", + "Name": "matter_g1_multiexp_43", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000006984b92b5b868004f39ebf04f41084d03704732363e65c823e5ad4a0a3fb4c983ff9375249bdcc2f46650921031bc1d0000000000000000000000000000000019b9d69589cd29a9909af5a303586aed5e33650331b9866a6d959b8580ca8312ad0e96c7214ad50db7502f50ecdcdafb0241da9d8505208b4d3ba2521a42f28df7d06fc212e9e84931cbd30ae3ba2e1500000000000000000000000000000000173433f7025400852ffdfec020a44b545b365158ba8f919f434fcd995c0d84509c77d8a05405c79953b8cb667047690e0000000000000000000000000000000017d73ee336ea56efa64038b31d5abb6650c4c6f7efe67add40d09faf93fdd9fae44732bb69dbfb0dc8267c4d01d8aaae6fecab1334668102e47f1e7139059c1d715a1851a026a1580f93c2daa3f08a2700000000000000000000000000000000184ef5b6e309fee5030e2cd8c6c3ec49b1cfb09cc9cfb349ed47e17409d9c478e8e54f285a3b3a4025464162b172d33f0000000000000000000000000000000009b78ea5d2fd2113a4bbcbbe6d0108bcf27b60ff435b5b587e91155eb0ac6ea35c27f276b7e11fe5fb59508454fd8bd24e2023c64a3b51cc3d82e262f83260ed4a5e9e3238b85077852fd501b52aceed000000000000000000000000000000000d0b8aca446806ab51b4a49049cede15587aae742ce7d80c2a05d255429c945d1337b4fa7ecb8f2c3b7c0b0299a41ad8000000000000000000000000000000000bce866df7061aa4319336ba1f876254a8e0faf3faf2f9ffdafd0ebd7d7d0c854c61b476583207818f484ccf7faf90fddc0a88f0aeb2b082dea6b50d591018330c2276830ed554840c10772403561ed70000000000000000000000000000000007018908a64fe5795ad178b8bb1c8540ccc5c78ddccf4e6cbae72bfb84e794d23172998d29e568b186cacfd025962a010000000000000000000000000000000004751f7d225407a8d68b4a196e32cb4c0bc6a9ed9f2093e4242b268d6c5df978b8595d8940f59be860b66310bf8a5460f68c9e76d9d8914f14007c968a31089041e67312c6a3e5d30e65efa55894ba74000000000000000000000000000000000f61d66b0539c7ce56da9308d0ccfa9245158541b2d1b14c381ba53471ae9944ef3ec9f4eaf52c95d5d0bda92d6b9a47000000000000000000000000000000000612e57aaddc6eedd9b8a08b991bebe6f5cdf7805c2cd4de5853856f11eaee94c4c2e0799254f98348cef63236cbae3980eb90c6cc25b3a48d93b94b698eff513da37210ba79d22d76a270aa97fd5107000000000000000000000000000000000b8a8cf0fa6ea9f3154eb35994cfe2f7af4252adb8f26d718163f2bbee3cf1bfca400f4d3582fd5fd407083e0bb48ccc000000000000000000000000000000000c3251d0d9e8520b3e7b43acdef58c75348786654103fc770c7ffef8593b169bba3eaa2686791f919fc70f40a171bda8067bfd893b12c79e13659ee9b5f22de71d806a85410c9a23dc43363915a606b10000000000000000000000000000000008138d173e3e8f5e63f6aef89cf2437690dd0c848435f6032f943ef6cbca87bd2a622f9aca825b7caefb497450dee4c200000000000000000000000000000000183379ed3c9a6a6904e169c68d627bb828a05a93e38ea3b7886db2fe6d1015319d3887136180ab7dbddaa26b1fb3335f34abb11f7ed6d73fb81ce2777acd6bbe8839112c527ef4ad88b094cabdb4742a00000000000000000000000000000000083f8fe152f7edcde2c81107eacee9c58ce22b5aeb10eac15e7df1657a813c98b182433655380c9e8ac18efff2188b5900000000000000000000000000000000100b06f6129bd9063d2841f4c244adf2dfead83e23f3b1586126623ec35674ecd6422efa0e86ed0502a83549551afebd8d6693acb1eb73f6ed1bb4f74f1062f720a7f2c0ecf2b5a944ff89feb2688e1900000000000000000000000000000000072c644635936a91dcaee40e3b4794e634c315a39a9cb5cb99ef6784b332fdcfaafdc80e228cd19d0104d5796f584c350000000000000000000000000000000002318bea9077484e9c1937dfa63774b5ecf6fc63ff06e5cb653553d5111a981c09c907069ffe11b5704ea60a9987328329ca1b157e6a2b5b88d7467e851282491ed30382ba217b82ea5cc9ca0c698693000000000000000000000000000000000aa7249112c7897c9b1f95a7d8299790a25d155dc9ef7b1ad6dd7b186bcddfacd4c77ee95e634b5f283c8caebc00b9c30000000000000000000000000000000012e31211b2bc88c568e08157da9c3e3220dcd563cebe44653ff4d62f8c306ee9136832704272317342f634e66e8e66a240bb53575662fa0b726469da01c39df389efde3936d2eee18d7035704130ad6d0000000000000000000000000000000003a5576b3663114b410276a8c537a93f790276754913df727ec6c0a684ab3c705ec04b8bac882bb9c5223702860885520000000000000000000000000000000002221eb21003c6512428cccf8a9c775df9b72ed8810dada5c92463e6cfa3d619f22a22e314b9b8882c9e2f609b73353a1574a30a575138c44881c1c126be214c6b68335d7338875b8a398196f27510d700000000000000000000000000000000111829f79d4ec1a80533f76f32503cae2842981e29ddf9a376d16ecd7037d3e0dd1f8cc84d512fbb39d58564c019a559000000000000000000000000000000001808e65ee7f31a1fc15d187eebd76c63a3158469099bd6acddb0cc96354072f636651137d060efd850fb599a6965044e6dd51553c4119255b31cb0aaad7391694f7dd29420420b513699747bee819a99000000000000000000000000000000001274417dae37cd33b2a3e086f327df292b6f997e5c93e71add346d6e5f6ded135c8d6047978c10c5c38752006b7f76910000000000000000000000000000000014f867c58d3be7b09891f087f47c1bcdf82c16f899ba960d8a0db4a5eb66efde12dbee75e77816cf9afd4877d9d08f32d88f049ab3ee2b01af449abce08ca14ea3b065f06a8665ae3510b4c04f423082000000000000000000000000000000000d98fa6b2371f65f6f0b62133d1a294a7faa9949c7df16818657a9757fbd8381222cbea98a72a951e4b2b69b216f705b0000000000000000000000000000000016331e8f0661228b1e5f4df59a09de5133d16e06e1628afaf8b2a1160961ed9738400078bd79cb5bada5f99748ba220b19d6e227185c538b122858ad5ae594720fa7f743f5805552152a213ebea64aeb0000000000000000000000000000000018f129d1799d9b46dcea6d239679eb64f144adbe1a9561044355cf66b4b1158513406ef4423468b5ae446c4128dc03d8000000000000000000000000000000001669ead3f97913fe5448bda1bb0be354fff223e51bda5eba9743526e964247211e9cccf75e6f99c6abb5b8912af94f5d3f53123f01c4d0d4c18dd72ea87ebb5fcb559df255773fa0165f1432c229deb6", + "Expected": "0000000000000000000000000000000013426d2d18267fa615975295d2029d2e5730fc845556d501c8c6ff8442cf0f3c7facfc329f6703043bb2d45acc1639130000000000000000000000000000000012fea8316f8eb7cd655aaf9cff8e395592360eb6d62bd42f6e1d1e27b9b54bfb7be5b56791d5ba55a798f073f9b5634d", + "Name": "matter_g1_multiexp_44", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000018eef275d602fb152cee956b04313bdbc8f0079da7bd8d6841fbff1f63a9626f17ea3f7a8332023fd9793ed2eff3990f000000000000000000000000000000000c41214c40c5c65e79f561b59d7ae103cf8c60f78c2b0a16d96a2e714eb30eeb0cf748044bdca077c4be5f4ed155ec50cdf2bbbad52a3f5c0b3959d46a8c42f6f5250a93c3dcc636712a4a2baed289c90000000000000000000000000000000001e5db25f5964e3a5030005152fbe9c00252e37dba6febdb7441046f734d4b86d60334d91960b09bd32d258b7ca2662b000000000000000000000000000000000949bfe49b0256a01da76f5c2270cd0b6ae70fdbeb55f932895d0e72d94eb6db236a8ea40d419ec6d9354c611b8010a918adf5d8fbdf81f8e4bf2f622e2d481fb2dea06a1aaa289ce4f6e783eb9a98dd00000000000000000000000000000000158addae39a79638dbd1a7cc280e0a24d18a4914ce4e290f8f79c147c4e817d95a01bf6b074ef8e819a124cf4e3bf088000000000000000000000000000000000bd2f13538d08742b3bc7b1cca9cb9e059b4bcff76b49a189f506b4bde56d8a58fe0bec2f8425ba5d574dcbc5efe0e93650e995b73b63d068fd54f596cd9669fc3061f0c1da77ae7d0f5bec012f9ba69000000000000000000000000000000000f8615d47e4327d862fa64ff4b9be14df2cad729b816ac7bdcddcb32500b6523af3303fe36c0e93b638992c671958d5c0000000000000000000000000000000011aa78c5d0073fb9b34235555bb2e3f27e55a1d576ad4e3f63974cfcb2646c6ebfd6e595d46613987c0c8e86846845dc3350d4f13e25052b1162dad3ace76e5cda71680fdc89460d8fa88c0d157df426000000000000000000000000000000000fe66db078653da2fcd1490a36db9371039f3630bfa4d574cb700b19697c7194e8e44453e16ae71db6c9001e18392a76000000000000000000000000000000000cc69605c26212c6a088b9a5c2cf6024e46f035e4c64da67383f294d6186bedc18922ac891f742165e3f09fb1720d476283f0256766690c88df6cf7c968b9a96121d26d19672ce9adc84b699476a32db000000000000000000000000000000000a280b29948ccda96a2a05ceb9fca703dd63c65ebe18a0002cf1c63b8f64282cf9d3d4d73ba3a13426f253d09f83ebbe00000000000000000000000000000000146f604d1e90c4a14aa6599ff5c6389e426232a2dff39334f3390006f021f83500300b7b0f1585ad591acb1e0baadcd7145cdeae7fd3f7455dfd2ea9a064c135f0a0a36990ea34929e292e4cdfa0f4720000000000000000000000000000000000be58255d1f227af95dc9a818204d687064d62166c16f1de052aca69a37ae98c2a73a9a9cc6cf187128e5b86969e2810000000000000000000000000000000003f1155d7e91220bf0b80943a16a9f41e4def1d5f8ce44d95dc2f9099019a1d5e770158338ec248eeda7c5af412890cdd9cdaa979ab08b454dcb961e3cc4bb18f706bed93a72a9c1e105cd69c0b691af00000000000000000000000000000000077c3ebd0169da81bf07ab1bfb8770732e4182a30504cbdc8fb1abc49f31d698c17f68de1a6d8bada62e98e09bcb22130000000000000000000000000000000000d677a33c1590cb55c9c78afa455fe2b349c465e90537a73906343aef577afbfacc8e157ea6f834ff959f3dea5941bcf262f9f7a26353193939bfbbdc50ee35614a3c099776f08b21e0c4c97521eb8e000000000000000000000000000000000aa0a3898520c5bc19d7f3a8e0710585dd08419b39d9bdcfe12f7baa6b4cecb50bc0d6e877ccc2518e4d0254934669ec000000000000000000000000000000001376af22bb714adbd16d8d41ab503066fbe78f799aa8c1d8958eda9e4c8c6fbe119e592f655e0c3f93455e8acd8a2bc14f0d2915e82c9a69f9e9af64a2c5cacf61ead492bf69912a35ad6a316f9914a80000000000000000000000000000000011b1300312d0ad0352ea153746f051816693008f2d0b980974bc354996ebb664e910350e28770192f59c053f3f2bf00500000000000000000000000000000000125d87c441a1dd88f489514b1d550387aaba857d5a6bef20acfdc0afdbba3e98c2e0aee0528cb78970395a9da853ffba25ed3f13198b69604c08b414562f67a67aa8dd4a7bd3c066874182d21ed9004d0000000000000000000000000000000006a05ac512adc0dccb74c7b4c2187763a6ba8db9e290cb0efd1325b7a463e0e14a3e7463b5cedd732527dbd131246c6a0000000000000000000000000000000001c1b41b6d5c823c05a5d6db55d7068409f5fec25986db6e2689dc6ec3e0d85749db6deb737445c5feacd69925c5dfc44ae188cc115e9d492be64abefa4bd4c93b61dd42a7d213e1100b8108611a616300000000000000000000000000000000143d22823412da99f7b87a794662bded7b7ebad9742e4d6fffd471b1bdc748c6f1b5bb395cd0a79c7291b9e8081825ba000000000000000000000000000000000f2b98d54e293befed0a97667791ae35494084229b2a25494fbd7295a04f03173a52efb8ff9033c4615ad1185d4e9032eede725a693277356ce71ffd7814a77fcc30eeb3a2b8863fb91ca03da1cbe37a00000000000000000000000000000000172919c33fd97de83b30740356c2bb2a9c97c3616d9f80a8d8266e07a1de21ad974ea796d3cf56660fc4e0df263a27c80000000000000000000000000000000019afdfd10bb736e8a6596db59f4f9a8244e585fa81ae315a768c8d91716de32d42fb75a57da238dc597885f083049a769d0618f898594b23ee3754fe390d6bdfa7d47fe749d6819e306935c1eab6b046000000000000000000000000000000000a944d2667a10dc5892760cd3e13289785f0a5a461068d70960e6546a0543474f92d68ecfa96efd19619d976af2ee491000000000000000000000000000000000a88a16dba3fa6cb5ef21015b18a14956ec9ec29650929fbd0308fa59ac4aa389aa2e306a3a68fc04e062367a72b3f861e1c9420cfa91026286d7f986b538c13e8c97893995485308c69f053927f96220000000000000000000000000000000014118a990f2649838954ab911e795c453ecd0d700077a5fffd1a4f303087074d595caf1b20399578ff1e23a2cada7e5200000000000000000000000000000000145bf8164b82ca5f8f93d89ca65a894c6d15e38da2cda296a94aa1a1efddc4d2663b8f09efc3b2d78510c4dceef8558fe5095ed9a9181aee392888e3194ebf9c4a6d87b503f4668bb6cc0d290880a44f0000000000000000000000000000000012db33b91d99f44cdc785470e67a781b4a72ae2dcfe4555efe5b7527b9a76de8e492c4dc7793ad948cb46070eb1cc5be000000000000000000000000000000000ecf06e454ea574dbb9ba6209577425a58267d01f29f8706d06018a9caac994d2dbc9c6ca9fe3ec01aed9aa2ab886c60dcece8ee33d3bf3188574e94a889794077035ee92473b7266d92a3c018771b4c", + "Expected": "00000000000000000000000000000000003747597e0f9bc39306319018fd08bc936c4d37cc6f84ef296df5a36cebf0aa46ed35ed215ba89a247174fd72fc7c1c00000000000000000000000000000000150f973b61f26aca79a3f7d1705999308a96136b08673322b4729f16b471e38f27e66996e2921cfad0cf889878c2ce27", + "Name": "matter_g1_multiexp_45", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000046e955a4631d1a490f92cd40ee0a31c096210ead2b307a7aac60e84efc04898da5d4d9767f1303ad5652a0e377f0738000000000000000000000000000000000afd054be493fb26c7826c9c1f62365ebb28ed853bd3a45d266f4c690a24e179b2eea5261adb0bc50dd184c165231d2eaddc845ad867f1e2664ef0e78bced8ff6904c5836e7c63ea3a9c858fd7b710b6000000000000000000000000000000000ec3c20a24a5f9fa7c5754007407d1aaddaeccf3f7956914ed3b06dbcff7f15c6d487a3b71fa9aeb61352698a93ed14f00000000000000000000000000000000086f3cdb1e21cf60a7a57e7ea7e00b4698a837916eb1f6ac1c6cf97ef2abd48292ecfa471ba7d9b8688b6f0dcfb6af62c78cfc6a30cea34d3d3505f4f897631f67ba77913734f6c2895d871fd6d5581c000000000000000000000000000000000769b870411b65a1a86dfdbbd7dbb65feb708f9f90ee73153e42f7141cc660c50f41835ee44f58c7ffa136b944e84dcf0000000000000000000000000000000005f0480b4a35dacd304d8feca77f8580f66396a6434af09b98d57fd4f9f781012f3900407a49f4e0aca8d3ebddd2a7bea1e40df9e1f7c84633cb3dc2223296887de7281ea66c5e1f2d5816334f7b280a000000000000000000000000000000000208f1b01599c969333ddf9accadb24f1c8239f82f5beca72d0d6d823b59a3b8c450e25a2da32b5a8cf8c0f47137e04000000000000000000000000000000000054051408658f025572a45c731e81f3fb88d741a632f1e2acadc48a1f257a69481c9c11e655c226d8e0623d34fc9fc158810b9ce0020904dc1903338089c30e616ed0be03741572ce46946883874f4ea0000000000000000000000000000000001738659b582e3667cee963fbea8cf695daa6b811dd808e724ae77db2060f248accf645db52f9838802c5322d993488e000000000000000000000000000000000a36fe571929153dd774fdcbaff2b924cd3f0ab4aced47d22a2662ac6f415b89372406c4ea5a0a466d4a4c5cfb02ad7d93e7702da2ff9f3f14586a9ae80c8713743d61b915a7c379c1faa1b151406a9a000000000000000000000000000000000c70dbc5f707fb949a2e0cd57e0ba6a5d28a2d85affcb55bdc9fd24a3fe395bd78b7431175a629475c0932b769b55d6e000000000000000000000000000000000a49fcd19bde4473bb98384bd63e96508b539fb80e1e0cd9fc9aedaacba0c36d705ad16a47f345c083401c6640675823eca54e365faa35d2c9be259b53a1157b180a373813382f47c9154af18a2d83270000000000000000000000000000000011236c10b9622f4e3d468d91ba9c6c072be74aea66f5bd77411193bf2358a03fd47d029dc7b50343ef72fe9bc08c7ea3000000000000000000000000000000000b923cf7f612e800c2c52b51203e12a72d6f106c0d047d1317711954cb33d44678f509da27f03dcfa1d4482a9cc2eceeabe2079ecb3618de3accdf291d9479bec32bca1f9fe87b00b64a12d735f5b9a5000000000000000000000000000000000883a868a58809bbe3ec9df32f8b963030d71a3ae97250ee9aa8446a8b1a4428324f22fddbe77b338ca58de26b1ad73f000000000000000000000000000000000a49fcca1f052e82fef8913b64268a33ef1d2ee213ce96e60a3a1842aa304c63cce711bba8f523302d9252e3def20e3fc541a44756ebda14aea95f1a1d05e7366dc0285305116b907fc89e777ce45f79000000000000000000000000000000000d1ed017ef4702bcd3bfbbcff36000af6a1d26ab363e68ea5629027e0b90352bf1d8e03c13a7955da6c15507cc1c9f47000000000000000000000000000000000e09830e54fe9eddd416479a1740f6f1b7693f2d153d322f27779b16bb6451d7657df85a55da75a4aee0a2e33b3a46e637d521d31de52681f1d9bbf64a12f9bc8fe0ac61aaef14d7e8d048ff09e6578b0000000000000000000000000000000001f902e2947de38842c207b9029743da51ad0dffb61615b22c73d88739d80c926c07f97507ca3bb830c66661b397dc1f000000000000000000000000000000000d8a1d29f87b3335287142baf613fceebe9d4765d29e46bbc9e459af5450256295538b49081d849f3253f07357451b6e4904a876d4ac1341e88fc4808508c89c19dd74aa8fb1dd7673cbc2d28e7d920e000000000000000000000000000000001846aeb64ead3a9b6da3b6f5de234fdc98442bbdc402af2d016c9dd25de8f9ca09269a3f01a812187ab7427b2bf31603000000000000000000000000000000001775e3fa3bd35f96faaaf9c3ce1d2391f89340f8d533e41a1d637fde7a2cd7ad997e50a6e9437468a1d5940e4004bc9068911b04d8155f90c7c5c0cb519ee6ff14c0ae27ece0374f30fa148235e8cb490000000000000000000000000000000008aff7ad8d3e83ecbf5c3fa2cc9a5328531b1dd6e30b2aa618aa087281202de8f4d356586d64082fb039db4c9ce6c3e40000000000000000000000000000000014196e8ec67e5f0093da2b1233331bf1e90a8fe1db52b2629c0d25e3c181d595c03bbab3b399c87236d2353f1ea6bfe9481e894ecd52a252cc76547513e2cf0a5cc6b20c3dc9c64c7f34f29a488258ef00000000000000000000000000000000018ad28e8d8c1d9dfd8f8cf4e60214446a988285005d92e38d46ba32f619e982cf96ab10b605b1e378d7b46b54282ff300000000000000000000000000000000029807f431a2101ac341241af021ee35c47e0ffa1975c982f75c10ebf3ab9081d294578288a5c308abb074b3e3c756c672780ab3c48c8a102469799ba2f70d2fd9d324cf558a8c8b49e2ecdb71ae1c9b0000000000000000000000000000000008cf05c3d3bbcc63ee761f7cab1494299a3e2274ebaebedcbae5b35ff33bca129d79f73ea77152f19cc67fc66ff774040000000000000000000000000000000009ab576dbf0e8cead9450eea0a506c83f12d09fd2267715a76eb46602756859146e96920174dde3a361636986a3d38e084ae1de8aaf498bd2d91bd828bc64e56482b225322b86529da703f47289c6567000000000000000000000000000000000006f62bad30339a1a912280ba5d982bdf0d3c04ad9051555eabc32eef501e80d996f183a990ebd17301ede13db85f6b000000000000000000000000000000000b0c4bb1a10f8a281b83384ee05be2d65d6dfcec36253b9101cec7f1193f8fe3d29333034de96dc62d18a97153ce1d153256548db55ee9de70ebf6fa347d81bc50494b937ab1c3079977234a34cbfcfd0000000000000000000000000000000010afb2bdbea9f6eb0c75ddb0a4404116498920557a5d416c6d855978e47aa90da70f29519ab244079762fbf965edcd070000000000000000000000000000000000b8b62a1e52eb3805056576810721cfcdb5b0d94759a11862cd7b0a88e3ddadc0efaeccfb89662860e187f8af2039f8575ae146524544307ee51e58a654d7324983a87e1b37d46cea1a4ec34114b44b", + "Expected": "000000000000000000000000000000001422eeff2bf06ecd67e0b310e7201773577a899fab8ee7c5b6ef5ce1021c9371e106c49a6b607cb3d58852f0e671000e0000000000000000000000000000000017ff4ceafb7c286f2036e6bf47a15e6695beacc7b988dc35f8521459203f69975d297160dc67fb88c4ed2fd7b61ccc0f", + "Name": "matter_g1_multiexp_46", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000008fae47827bf8786df7e9f8cb38a8e01354ed4417a05332e45a94f93a5ec61f11d517f5554d5444001ef2991f2e7eed60000000000000000000000000000000005cd17cc813442f45e7c2fc542a6359b16db4de7749677b1575f12ed694514b3569b722ab257f7678a230ca3ccb6e0ed1129275f3ab3125db33d43b36c7de0ad60a6e9cb4457aa03275caea9635f0b070000000000000000000000000000000005aaeaf87735d9e9895e8703177faf8b11bea34aaa045852c57e9b86f6283332ab633f3e6947b84784733f6f73b289580000000000000000000000000000000004957220d5264c0ff61dbeeb0d0d51278386227a9386756a042df89fff5ff9a4d3e3e52293cc94ed729d00ed3e70b1a32dbcfd8680258eee451db60f3f42f02f388f87440d00badb0a725964042515c900000000000000000000000000000000049bec519df011ae5f19c85afb3301f41f71119ea6cd9eaffa9a00f9cb901681eec5f3f694ef9b4fe768a25a55afec560000000000000000000000000000000011414953ff3fec28aabaf3d62236d6a972da12c42102911a3ee8e88e188970a11487df719a739201b31fcda4e52d7c515a6f194abeb6b7c1c561aa820bba658f0277870e2a32f972f9d18ca361929b010000000000000000000000000000000003e5345484f59b269fa25b659e9a43573d4191c3c02f5f94534bfcd63d9abd57b2f3ab92f9fc746a852b185a6ae2c778000000000000000000000000000000000b7d7648096606b0c3fb93627e484eca017b95b27a8098e5dd332bb45171793570c69fdc16caf5b16e65f68c817de3bb579450b7aa155a3ab61e47e337ddbcd17b197de2dbb76008cfaa09d3fc806be4000000000000000000000000000000000c6afd550c55cc41cea88e670443d97c6419a295918dfde1d5490718f18ccaf8fa0cb68c42fa2cf583284cc70bfb0a11000000000000000000000000000000000f88ec67e9ba0e169ebf93fffed1fb14dd1aa3e1a2fa614a140c1a2147fcf051457cba68043efdb1b851bace84078fd64be94f96ec4a3d4e028644c63b2577a9ef849b403acc55e42432c3063a918d1600000000000000000000000000000000143a1884ecb4121e2c1c0cf2998b690d7f01aa3deec1a2ae5542647a3721f7be47c21ca071f92d74d9c3d9027b56d9c300000000000000000000000000000000113b01f060d10d95776b35c2b294216f768a323aececb308d3de24299dc12e55fac82c3134519456660a3465abeeb5950983e6618e9e4208cfbaf647592e42b2d30de9e74e4943fb2bb49109a66302aa000000000000000000000000000000000019a5620f3241d03d63ccaffdfabf7e99e784399929cfc3218d6b828d7ce137c9c6cf3ae830630fcef3cfdff705490e000000000000000000000000000000000114347768e5c8109c1bd47623eb51764d4b3f63f333677bfc28b143fcc1142f4d9094b2355408cd8c412a37a4579e0706615e300a924ab962e0b7fd0b044cae9516d96de603ee80695718c27d7fba0c00000000000000000000000000000000043c0f4b09396d4b14deb7c5027ef6cd2d426fa4f93d4ba9c3647031d557a759e3426c113fa3949cadb8b98a64bd69880000000000000000000000000000000017efb6ab8b2eaa0768bb740cc8a4e5ecbad81087cec2a307e5f53b5f431d19e3467dee84df6c6453ad4566ffa2380c9ad77d3e9e64e00b9356cceb62209ad48fc89e69e2214aad2edeba18122727363900000000000000000000000000000000140f0efabdc88a109da948494a9fca5ff790ccd6c629a088cac62e043e00e38c4281e49173ea0e423152c5b944d80ac10000000000000000000000000000000006d3d01cd44e56a4cd62d88a22c701b42c116082e92abb629e64040f57a240d71718927aedbd8ddef910198e1bb09c6841f75c89ec973f65b11786e186f4d42ee2e85c40f29745d9f428af08a39d5681000000000000000000000000000000000f20ace44f4b981adbb3035e450a656ce3d8464fbe4c45b9f7035c00aef11e389cccef660dddc025786d4f9216ef60c1000000000000000000000000000000000d5fb0a9e9ab03893a9ec61675af29e88bb30f3b61e05d7c5a3d823159bf8e641ad894ebedba4bd681df789e0c3d2547c70cfb76a04d1a9e0d937292e5553ef371e20d5d3dd33611edc0da178e2e4a16000000000000000000000000000000000dd38f99872751b4571253940ca588424190bae80434a3126a7ab5ad1383c55ad769e09179d148d151506e5cf5007b3f00000000000000000000000000000000032b2b9a8b13acb6589fea9e8b8d2535285bb32ab0e519cf8c63ea3e25d58cea7f9fb27481adcb9475abadd6f1384f4f8db878b7f5fe817599add432ecf262f19d80ac834bb0a0f983728f6e2c189c88000000000000000000000000000000000c696064b7c9653cce986e119686b2e01216faf8098d494bdf6d302c4d176b24b05bfbd70b9ea3ecc16312f899f887180000000000000000000000000000000001b5b8d333dbf1d84feaab7737d3af13d3995d3ea976d9ea1cf1d005090a809fa6c210a6363495c2b22902442fc5080b70751fe88ad289c91dfcd3c3c61ce1e33f4146f03fc0dc77cde9b32b51c75fc000000000000000000000000000000000082bc6c7ff7924b88b4a6cda58295d050bbe8087670bc6036b5bad53247b803306ea596ee0689d805e7b4de65a634eeb0000000000000000000000000000000010a79825c716dce1572e6e8886f1c698d730327f195871db7a9b6690e9ba1dc38e8d92b34ee32b33705edc021f42349184bf139cc0b6ac94697b7dc278063a74e478d47528da3f84f55fb0adfd851d09000000000000000000000000000000000cbd4ac75eb0928f366d3b99e05799bf3d9dbf187e557f211af5ae514101961ba750e81ede07cb5a14c49884a9b55b980000000000000000000000000000000004fdb80f44f89e6cb44b950735703653152466f30a410109a24b555c4e6907b2c1d4f54c9c0d2b7954002a74f1b65e23d19d9496e7ebca44354d5c6e1f6b8211eb06ca23a6444c307f92f5bc6dcc2dbe0000000000000000000000000000000019a41f73feae98fd65e365912f5bc6c86142380b2633feaba440a6c635ce2bcf7f871f1f033f93f9f8668360da3898090000000000000000000000000000000005bd1afda6a52adb550fd9bb59826bcf492cdaae8e9600e517d77832a8f3ae8777756421fe7640aae0bf07518ff695a66940e3509e1fb090fa787fdf633a74380cd5de722678826224641e46a6e920df000000000000000000000000000000000ce2a96c1ac3e2cd01ee4a20258436b62dfc2efb96a7148cf887c25d635aded48d18d38da7347abeaf72d73d613fafcd000000000000000000000000000000001773ef3bc5044059bdb5100430d4936f328cf876a48bd30784c8d3767a119bdbd5f1f97d78d52afadc42ebc85f912f0f7b27d21c1d6e06d9fba7b61fb87d364a7a6252c70b8ace2d3679ed87ce0fcf7e", + "Expected": "0000000000000000000000000000000013fcc5da42975bad80f3447a1ba05d9c6a51383921164ea3e93e983e24055f6398fe773b0e7a50d98568d49de36e295c00000000000000000000000000000000188455bd9ca4a0d3174cc8f0794d8c35356f697e62265d9e3d8e72bb2d1450caf5bf79dc5ba78a363a23d2ad58891165", + "Name": "matter_g1_multiexp_47", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000000466047055d438bbdade1bbb00a7bca3ec0ce30b042e56afb9a25de1407d5937038e01e3c07595f46bd00cc8202d2200000000000000000000000000000000016bcc696716c21293b68d4f29d9cf675d447b726d579628417cc457043186d54f27c28b47d2e430041f9417ba323109dfacfcdf87c6ca0506b070abff83ce7812181c31729cc534497aa8dabe2433513000000000000000000000000000000000e8eb8fa4c0c2c86d0e571cd4708361e606c9fe789b60e099278d35d169424721bc789a6048774d739a5ceff56adc668000000000000000000000000000000000ddb7d2e6094f1940dc0f41509bd430163b220aeed1b8c0a2b90e37f791410a35d682b75223b32febc95500c7006f6626546fa692d9cd61895526282193c90148099e2afa54f7903a5431f932bd5fa06000000000000000000000000000000001080ce47aa1c38db9c71d1834c0b5d59676b0d938ba55a62daaf50911d23e286b3b813c7261bfc19e95f3bc8ea3b91fc000000000000000000000000000000000bebf539c3c03dd260d579aa853c28ae582b9c904ba2c56bb1239aebbfae10c05d9e33c8e1c2bf90553025d3279572fba9c1460c1cbb2a552e3452d5c5535868ee9c2952ec3fdb52dd826c16ae3d00bc000000000000000000000000000000000ba078b44f92e90fca4981c66e89c5490b34f92e4026d826c2076a995269e4d4fcab419a508b530793c465531a631ead0000000000000000000000000000000007c19bb972c27c00b5b1a8731ed7dc9af8270187cd26b1b9d65cbc96688fe2f0ae86ffe753a50b4500a46c01a75a93032c36204b6a005a64819b06804eb94c311d78977b557e7acfa82e147b4d6ec62f0000000000000000000000000000000009b70de2dbfe9af8ae771ad5bf0ff962c9f906a3637f992b08946c864b3d1dc996a2ff918ecb3c9648ef9188b15b624c00000000000000000000000000000000186a9f4c06ce9d5a969b959e4b17d4428393d02d0e7259fcbfab8898481bc97582ccd0e1d87d1735e28dde10a99b683e9160c5a553479a10996704c3eda8e57be88eaaf5d1efc8371e7e10d7d106e4810000000000000000000000000000000005b7dcbe86bb6e6b328325141c1da77f8af531bf1463bf3c8c94812784314fb13e457fa461c1c51aef0721c5d6ceb5e9000000000000000000000000000000000d9d1ac39a5ecd61670c1b0d061d93a198eca1d294d2e64c3f9e0a872e7c93212ce7835ae0a7fc2a42ab5c02192d70715e5a50e5dbabb7a56897935683f80a5b16dbef3c23461e241fbdfceea38e3ee2000000000000000000000000000000000741769993f2dcf5869b8153bbbff2e6e5d429fd2d862bdd590fc50a8f186bfb105f5d57f736b07d919bf0dff0cf4094000000000000000000000000000000001917c91f954f68c6406d6dc716dacf729a8c4a0de73e04cf0ce554eac40d750fd25b289127023af299c6f63372c01b7d4a95b293daa2761cc456b9667517f499c4d9eb9eb1d82237e7a7819b5d44f7a2000000000000000000000000000000000bb29ce10d6e571e62611364143e08a60eee5ccb13dcb77f17fde5829ae5fc025b309c98f892aec1fdedb7d1920e658c000000000000000000000000000000000ab6fe2dd5eb1b90f15a3632749c351ec871038f0550dc54cf1bf2575f80ecb8a3c0d3c1a333bdd803e22fb6bd3e64bc5e22ef32d111261dfcb5a2e8d23c8d920f013bd9602bbef45e6d4e0909abdef20000000000000000000000000000000004fe17772d4205d7b1d0cce0db3404119707893e20f6b27138918d2cb0e4de49cd5df1258103c1fac903c1a443cb62530000000000000000000000000000000014d8246911dc40ecea823f02c0e17e690a5f66848223218dd1735cadca1a0ae89d7afbdc727158257d2cb248323c55316e687c0ac8fab70de2416642afa1553bb38183d2914050602874491057f78786000000000000000000000000000000000784a1b282846404f71227064ff1a97766781900136d4b7ac73bab19cf8e03b449ddd35360fdb6dcdac80e335ac5cd1600000000000000000000000000000000074fc137d93decad1cbd4b753fe9ef3b8b3445c12e358450ff494a1fbd6e192ad7a4812358d85f6e3cefedea3aadaac6428f1a27ea15135f044643dc36a3f9c2b4446a3136bb11f696b0a430a7454b3f000000000000000000000000000000001661e6d386aa6516f08decbbac9c1c3411ae9cae62b05037dd626a2e2273eece64615c54a4d73e09814d497067f9e6e30000000000000000000000000000000007543030f8995237f65cec9b69b0356a29133d8be27b5f79aea580955042242c2bc1c6a01539b6b55ec9af96db60b394ae21ad8a6c9d75b51133e81ec34d66ca70a52529c5c3a2307b0e8d6f1c5e7d9700000000000000000000000000000000148597902b3ffe4ba8a5f9012e699a3cf189f58275557d98d132b72d3c34e5faa0953ec8cb10b0228a23803b70836e200000000000000000000000000000000008741bbe372a1e5a697e7059a9e80de8a012b0cc7b12c14bea098c16cfea154204d4e27753f1a8fae0e618223da14fdd88a23b118179ee2c34ad030993a2d2d70375311b95254c44254a32508abcb612000000000000000000000000000000000cfbbd4632e8998ba59721686310ec115b98ef470c3c4bbe427495d6d95d06ec6180e64b509c4c06e32862e17939a2cf00000000000000000000000000000000060042078794f4539a9b3e3127632c3c8b46322a669605d1774e995c5d82287d3d9be51690b4b5df6de8d55b20941dc630eac099ededf0087275d1af828bbf79ef7fb0e77179a068f2ebfe4c749a98c90000000000000000000000000000000007e67da2f320e1ef0d3afbd50634aff753a2e2104ddc03244a0c79eeb117ed1beb7316f7c5e116bbde47c53d47e725b3000000000000000000000000000000000b5399ef864331db729724870b431d8dcd8d3279cd00a59de2fdc15bbdff2035794025edafa21fce97836e93b41aae067e8dcbf708682225fe3f71b7a687da23de5ed188e40585be05533580121325770000000000000000000000000000000014bd7f0effe81cb626f92422ae7900bafa7f4c2d51d4ee6926eff68b60c7f41e667a57bb0506f7c36d3549cf154f6cf300000000000000000000000000000000050aecd688a63075feacfd29d1ab6430176dbc5ba6d406636a6650427a9e0b0d51df51d8dca27665b0b6c60e08d5b087532cd42a9b698a2c2d22b1a620a7ec60daa9d1eb8ac36894603be7bb9b5e37be0000000000000000000000000000000009252c5f7f7f3b36c5dd32991641c9f8244579960fd2d07a8641b82c5cb1768a36f4e5ad623319ef3f7d0c670fee58430000000000000000000000000000000018e432d33e506ce42bf3d873e36ed6ede0c9de44203cdd453cf91c42fc2ddaadaadd2e3870c5f5c171cfe76862ce44dc3ccd5e19892765e549a63238e664c732af781fddea558a117cb927bc4a1aceb5", + "Expected": "0000000000000000000000000000000008b38b298fe2dfaed042b35ce73c76ece7537fe5181ce647de756349a8dc48d3296e243fc7613abb10e254e2b0197d7a0000000000000000000000000000000018d59a69b976b1bacdffbea68d523da3fd0d2910db0a509760bce56bcba36a55fbfe11cdc14cad50e6951ffdabf97a64", + "Name": "matter_g1_multiexp_48", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000005d929298c9361736ef5f7c83b6a851c344d72b7bb92a8201d629bf9bc1e66e4db6dc9df64ffb41a11eeeba10be52ec40000000000000000000000000000000007962e1b1b823b770b44eab51b3b84fd7e0e57a2a3f7eb1ad9c3ab02677376cee08b0a2977552a0f9399584b576f17f148da17551b2369b723bf932173a9167663f8389d2461b763d6a061df78d7ff1c0000000000000000000000000000000013283d9b3cb5ca4c3a39517adf466d2b7fc90f4895a24effca7ebaee4df8735c69993c7cf2483c3480cd2df4be04366f000000000000000000000000000000000fc94dee82225161feb78f2a7c951c41f43ff3c1109a824b56c01854688feb86e240c9fa48534809354e74ca8360cda4def52379c8b9e7c24d971c3456b85b51a63ab03761ec66c8dfac1018833e05940000000000000000000000000000000000fb727cd02c5f69af676f9cfa68cc4363cbfe5343e304ff5180ed1f57e6928fb808539276feeb1e492ae2455f65de0b00000000000000000000000000000000082d09bb2e1f1585933e1b9076711803e71c2236ff78e83f5dae6ad492c1d723120ef64eb25c8e91486d102c2297c9e5b2225be6985b9c8fa59a2890da56427612a4334937761e24a33d37f0f951a794000000000000000000000000000000000882f34897651c59970934848ba13e815710b4952dc0ee1abd0e04ed82ab399ccfb16ec966d010eab51e5fe514af91ae0000000000000000000000000000000017a32754dbdae7a2541eddba29cb8ca85a0c6d189f9bbbfa24d477e9f1ec2ab8f7dd2a5aa7a596d3a2af916ecfbdb2c2a64ce8ad619276bc7a00cb49faf6cc84b917ae6b37654363f5719a727a220291000000000000000000000000000000000db9ec112ddb4a9c6e371440d0c79bf043c5a3c6c6bd613dc031ce9b81b49a32b006a165ef29a8e05f019b76b3cf520c0000000000000000000000000000000002485dbc3c3e2aeafcf18dfecd842ec48b2e79d3bf7936917df759a9ca2e25fc3f137eb88a701f5fee1ccbb06d5cb08c0b891d638d7e76e0dcb230b1f9a7c3b35b35193c43a6c86f345f5a5bc9c708f500000000000000000000000000000000100d1fb78f53423c8cd60de5d39a004ee1c99b2fdf6847a62c73c33bb3d317ec06afd6424359481f8ff2d0730cfc9095000000000000000000000000000000000211cda7659f1e848c931ba1f65ca9c6021067ca01cdc8e87f5c742006f6dae39645553b69a4ae00ab6eca16afd0bda7571175eb91888222085fc2dfe0f4401ed6a1fc5df86c0c6b8e44fba6454305bf00000000000000000000000000000000004b07c2cb575e2499e333140e48446fdaa00368a74b87e607e285781b42eec39d1578d2e34701ed28488f160e9e50680000000000000000000000000000000001c2d66d28031aa91f6aacfdd80d222b4a0bc699a9b58b7f5d68bb9ed0a297ffbec3a6ba968f225732879f2f9907ca3954c9e7f7ca14c66b8431e25e6eddb4f20507d03bf124eb607957ca2f43a0c17b000000000000000000000000000000000bfa7f8b7783780a2b0f5b9f1b10da77cb5904618b8c8a1d062fc94aedb0fce090d8c4e65515c0d05a471f2261d0063c000000000000000000000000000000000f45747e4b0bffddaa13c7e03b6930ec474735b6a0e779d3722330828ca26a07bb731a5d4884ed3eecc710356a00a897000579e1ad83015c8f02a9db5c38d0220368a80b309ee45bb952cac824817b6b000000000000000000000000000000001245cf167d097de0753d29ce6018b7777b1befe43b5709e8217b9f380d958e3e9298347673dce432e57338b313e84950000000000000000000000000000000000d697bf8ec405e252588e3ef6d979bfa60ba174da03266c3a2efdac176c1ec1341d737b16d53bda6ddf8be6e1f433ff6909a45c8b78350e3ca21697e9f56d5fc8fc2a01817b78a7f5daeda487768ed1e000000000000000000000000000000000152d7f1e704619bbac7e594be6e105120b76d9bbc711ea40beb1063c2996fad70bc8f77a915411f3601e75af2f2059b000000000000000000000000000000001622a6467c13c534ff1fabaee8b29452d689e7f9e118e050cb91328b8078ef97fc82321b80d28d0c02f2b0a7b66f04a36d4e2277da617f0ad530b6209df6264e1288122b1b4d92da04fe334be17bd8320000000000000000000000000000000001c118fddc8df59e2d4ef9865d69cc044fcf870f296b009a2a471b1f74692f99e392b455b8b03d079b1f39b09e5fb720000000000000000000000000000000000032c05dc9eef5b55857956919f7a51b5f5225a45ca12d80208231304e66c77b24707a934cb9814108b44427e658d143dcba6bed6b8c42240c01df5fa0ea81dd96168c6d98ee9d5d4653edfa5172eb280000000000000000000000000000000012da4a2c89951f85757c59a2630bde25c30af955448c972d256f1a6a259793c7b2bdc3f8734f4e312897cb6a3550800d00000000000000000000000000000000199939ffbde7b14b5f23eef23d4a660bf3f561aed38205e68d091ddef9679df9230a59e8cb03212df2e99788fa2595bc23d168e01657e5c2da89a27e513bcbc6620b8c6082bd39880619bfe2b3a7317d0000000000000000000000000000000017a61df7581a341f21da2d1768fb41bb89847c88b2a0d7b61aa3275e376a46672dcb919eebf20b242ce83493c83335680000000000000000000000000000000013edc932b7755115f530d1d044c4afe71807a6b9810f555432910b54b0fef441b4618652fc4bc2ac5b789a75d2d276aa2a76fafc5e8e33852bbeb7ab8229305be84f5474427e0c6d2ed35c7bfe99faa1000000000000000000000000000000000c73683f328a0aa252c10bc3fae9e786ccf183f1b606a4596094fbe10630d4418a527509c93d23e62dba263d86f88951000000000000000000000000000000000260c9dd70a1ddb422491a20293c18e4749427cbe9841aaa3370533b6e5d6fcf882f8bd68b7161434bcd5060716fdb97e3c7e4e95167faed1391e269785918a207490c6d186bf2537c02e52e414d564e000000000000000000000000000000000bad0e395f46f714ac9d40865d588c06adb54b12439bb408a9d546b0a8ba5b3098c242cf5c17d1e40dcf7b384e81b444000000000000000000000000000000000e595304cd73c8c2a0bd1dff70e89edfab22be69bafa16877ecf669ab1e1160c9719952bb6103f31f2ff028cae0f0ea45d335e3d96a9b25be7f3916e92fffd75abeef5b91a1ec577ced52a96f6a9b10c0000000000000000000000000000000011f0037c9bc2bf953a3eb7d8a0a3c8d991e6eaa5f13dc1978a31f0eddb550432c70aad096cc0b904ee540e5d2d1ee4730000000000000000000000000000000004f8616cc7476fd0b95f7bbb7fbcda389aab60a88ffba3c819868f7ed6cf08e7c0c7da0958bcd957e0429b9a7fe120bafa563a70780837ffcf9a84456f0b4f6eda0d60cce6a8538ba10960eaf17362fc", + "Expected": "000000000000000000000000000000000e87aa419d686c55b1ed8ebf6e48d8f218d7198edcbc7db0dc3bb9581bb8dbf891dc383f27717536dc5fb7265ce1ffd8000000000000000000000000000000000a00646bc197307a7416aa9e35db9ce7eb81d762a065cf8d2e07f6470e424d7d59021be049b36eba2e44750a902f3124", + "Name": "matter_g1_multiexp_49", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000005d5e69a8876b82b1de0b2d2a0d808c739b361d1cadf3ebc9c6096afbc19169f237774be6882caeffe47e86e3b8a33710000000000000000000000000000000017bf0fa8c247af0078d486e1961577d7977d0b4258ada3e158822d995188ee374d900c4d8b1ef4887fb03d8f6a4bf1776e2ee781da12b984e7a08730a60f50c41cdd7c7c8b3f1f30f721923ddc34fb79000000000000000000000000000000000e6ee0b0c7bb7c3f62284efda6bdbaf38bb5a72b4435b76928c5640fedbf9d4144358a20629403359fef5bcb99a795eb000000000000000000000000000000000e72324fb2decb0b0c7fa18061a41bddd6e2c55f901554de9be8ac7b2263631fee8bc77773318f6b13b2db7eb1ad0f3cd51e0b65be993ddd2892ab8f47eab78352b177be4b3fb68f47c65f5c59fa866000000000000000000000000000000000102df0d54108666e7aa611fec5c09b72d269c72e6fcee7787ece5f33153a3999ba5f22adfafa461aeda64e113b795dbc000000000000000000000000000000000b77ab3de0a2d91b8c24a47a27fbc5b2281cea40d87872010b94e895d9589880385f82ff53fad55af4f4e462df1c9ef6fed4dd284df98923bfc3c41496d6e64a10815a8c474275e0cdbc9ed26e92b0ae0000000000000000000000000000000018e8fa3c5bd83b51b1af197f0dee78e5c912c742df0cae1b59ac44fb2b903ad5ee1fe9750a034d18141f09a2b8298f850000000000000000000000000000000001526a80337eb938420cf2e825e5bcf3152e90e448ae3b40ee61929117d35f694eb5ce9133b2cc664c520fa9da8ed65a7c36ec97c1eafc8a20a772fb7887d75568047ea32458b9ce74ad9ca0581299490000000000000000000000000000000007f11b03e06ca74a35cf702f19fe29facac855d7f5adac59bbb8c058b1eff7d4748c886eb08600e0484aa976269e5d0c0000000000000000000000000000000010a5b0f723371690f6ccc5fb346874e58071167947d45e54f9d5edd035f2d68b4ef9e301f26ef671634121ae6145e44e41b2c0354d2f7d92b05043f193b718d78b457ae76e19069c8e1c2b77d7999d65000000000000000000000000000000000db2e2ef96ea61075e063629eb031235543e8f39f012fd006e143eb137524976c5a81eb26996a4ec3619a7fda051df6d0000000000000000000000000000000015d39e93da2b392dec64c58e73740376552e69caf87ce9162801466e75dd1e25b7d5762099112b21411e8d8bc18806fe5615370a76bb0a5f64d61b97bdb045b9669f6a0b7644b101d21a50483d8b04dc000000000000000000000000000000000e048ef3ee3bf3c41cc10b89b7d0f8b3f27c89fa0ab25542653155dfb7f8a7e8488a737bf2f6dab558910c9ae98aea33000000000000000000000000000000001357eb0945e2c4933b358970184a21b3369dd7a43a88841e94c3a388681f338770fdc3a32862c3a52eb251721b2979e9bcc38cfd3c6bdd32ed1d583f2bd14e175d61448c627f195559b751aab1ecf7cb000000000000000000000000000000000c6321bbc74b6b3a9f0c9470461c80b1713a5092871dc54dd022d3ade73845852315b3e85b53b74ce2b31d1780939d13000000000000000000000000000000000cdef7351c2923faedb211e79a44e0e02ebceb8103cec2ed7541a54bfafe3967791edbeb6d4b0da1ee37b9a5d77ac8f194c41471a2e4edf0f688c2f032036d41ef5f8a966871dd099dcdbced8b37e1c4000000000000000000000000000000000b925015af89d42f155eb1f5104db1128faa23101fb9bc1a9757266a2717d50e908c64c502a8d19bb1e8c01dad554e41000000000000000000000000000000000fc8c5cbacca685c24188e8f936637c7c8010f6126e9b9b49e7d38191af1246c2a3cf7ca45bce6f1e11c404919da61c3dd297b192f1c907914ef949fd27a5ea5659aab659b83239c4433f7a4e24529f20000000000000000000000000000000013fa1374d37396bc60386d07a441a7d21fb808e3b2ea0c39ca78a6dd70c473a8feb972e2981e50cab6288dd80c40c06a000000000000000000000000000000000f35c2a2897b35cd7417aac29ade18f86d56ba24848aed78a31513d5115bd964ac6711c5f71736490195bd97d2d5b507d30fdb174a3f5c06b78cbaee5b6e7a4c90551083d78c5164de6bb45ee5de23c1000000000000000000000000000000000799d71ab5145a8a4726cc5567d99b344971eb8bd6248e41aae02bacc358f967475f64169e1828a66905e4373cf5c9670000000000000000000000000000000017c680c55af98789584e073c3caf32373f58bea6ef7f839f1d5c39e512058360efe80a884ef5822bd5fee34869d028d5aafc42f7fe6854866cb954367fa65c8072bd1b60173a2d45077421d6e25f2bb3000000000000000000000000000000000b4be422e3d3e96f6a6821c55bd2a37ba57de1bb59c8f4855b1f4b6906259de6be1c1be40523d5370ccc426b89478a350000000000000000000000000000000019212f598150b576c17c32a8f374db52c19431d7a60b99379f570189b3fa15edc75b807adabbed712268087cd9b89a8a106da5f98d5e7cd9f4a1c8d6e50ea2236c2abdf1e08a0eca54555a59bcadbc6a0000000000000000000000000000000009df46395e64ce38bc79acee751484ce1bac53c5e5233d3545df2ec776440e3f5b04239d6de10bdb086aa3c462fc6e820000000000000000000000000000000009a5c816b2abdcca7a916b1eb015b3d1c01f766e01264b5139e5a34a82a874c1efa8ef097d23b9e9441916a2f5bb17b4c971deeba2f757970bcd4f5548a2767bd6c43e63f4c5fc4b157ef060a1f45aae000000000000000000000000000000000023537e0238470f4d513d56d4ef8e244e3d853b3b10a893928547675c6b2d409ef6bbfaa299a726eb472067c48f056c000000000000000000000000000000000b48f21e01e72bb6ec384a1e8ab35db6ca032e4476f37a3282214efe483b672c34989e6d5c99f69473eb19e472d984bea5262a021977dd79ab96606eb24a7c5ed650300dd68bc79f4b8378f58c6eed490000000000000000000000000000000013f1ad33a2016874de5265565049722929528a1c66b84c1876f4e4396f22fb2583d025c481d4d9aa2877e0062e842d7c0000000000000000000000000000000008a11522b3e6982a4b46ab6f1f6b07d33443780c914d4bcd50ef7ebcbec6ad944ab88b82640971e890a363dd92c71531083b3720c20044fa41712039b6e9e776197391ef393c0935a0e9990fbc1b7a460000000000000000000000000000000019dfc9ca394e105c6ad51b130aab8a043ee58f26a0d8efa5beee59eb1543c2c3d33abb5cf2b23b0882a409d32f845b1400000000000000000000000000000000143e219edb6fad7dbd64e6aa82fafd05ed92bb46e526468cc3bc0d60c89319d3fa2032b5a617691ca2f136c9f7904225d6f846581848f5dbb9e8d220b881d0327c4f3f5d4b79fb2c4dcbdb9bcf44b02d", + "Expected": "00000000000000000000000000000000027cfeeac9c1606a0942a95068faed1405a5cc9b5e631c25a0010ea14cae5b7a51b406fd0b8a9d9ea7be9a8c0f76c86c00000000000000000000000000000000106c07dd0d4e6f44fb1c3451942bf10060d16980f50b63005936e35b5add71e1352c48d1048e5d77cda79a09f86ff213", + "Name": "matter_g1_multiexp_50", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000065d5c6ad252823540ff4a4639cd42443a3cccd808d40d8bd71379ef939b47c3027ba5593167b4dae93b62b2bd498f910000000000000000000000000000000012623162c0f025b16dfc1c7e5fa02f8af7b7fb0f2d42d6fa0fb01af45621f00faa4ed6da6f33c609448bc027cd6a4fd367c44f7c8513472b51f96d526422bac628aad4c40c521cd7cf9e86eaf92838fd0000000000000000000000000000000008b3c274f83f49cada0a1bbf0f56f6fe0f8a0873cf13efa42ff65dd6fda913102c2034a31a1a92cd154210d27b0120450000000000000000000000000000000001521dda1b2c9b42d7dc9822c64bec62e71c629d61e796165d9a18f8ab44056914fe5c8809f21663bfc70e310ddf5d952d6f95d4b6216e4226f78e4fa5011c9becf98fe45a17dfd740fdd0ef36d8ba9400000000000000000000000000000000109f72caac5abd41a228bd82b6649fab639e4d22cb3a9a060ff7577de61f33d32217a73014f5cc2c2a76582a6b751ae200000000000000000000000000000000059d0e9e64b10cefe03daa146c00c5040381ce6ac63886b5fcf19a0555a22a395a0cbe8b49c510c9bb7a308813fb482958c25d36216b811ee42d0ba629ab7a0f9ce7edd7234620c28e37bb3df3f042e70000000000000000000000000000000001c5e132707520c525045a08626e014a84d8da23dc27b6320d5915e328c3bb0df3618cbd7ace26834920d4a8757368050000000000000000000000000000000008f5127405631bed295596639ec6091e97f16ce5a3062831102be951aec98c9ad34721489f65e731026029ae3eb13aaa50a5c6bb6b87fbe5ebfb0d182d425ee173973c6f2085c556b0fe60219b9f3c3200000000000000000000000000000000146124bfbb9a3d253670be419f80998382895ad6237138044c55764f0d6fc07da5b70cbe17af3ad0c4b0dbe33f869e490000000000000000000000000000000011cadf640e78298347115e6110d3ed63dcbd251c48d3e21cfba4bd6859b0310041e67d212b54e63be6d68d2e7fccd83b3b4bdeaf6643ed159f4a3e23c33ac486b33e1edbc5a097a47a6c2c753e5299d20000000000000000000000000000000012ab7e51b87512007e1baf2f3c3473cebb553bc2ea3d3146358688ea3167817a449ab9a7e0b090e00f47846da7f46340000000000000000000000000000000000702c1e0df68bee2666abb90bd593a17a6f9dad02a7d66102add9f3a525a1b4f1fefa3abe262852fd5ca357d2e1f02fd1d18596bc392dd0b71e1216bbb20a0e5e2559a46789c36a146cb78c5aa8e39210000000000000000000000000000000014635c8b9cacbe976733bcb1245eea410008082f240cc8d8246200abc0eeb6b7444f38da3ad93b1e029b06cbb12d42f7000000000000000000000000000000000d9aa00397e1799a82d73040122515b98be82052b784a4b385417f6e260e555c7c0c48a32ca1fb28224f75f887fa4bf86fb3669c0789ba6a5b00f14c14fe2edd15d37a742c9e36cae9ac010e632d75a40000000000000000000000000000000009a0efefb9daaaba4b2beabf6c381c27df7c32d4021a4d722118886405414837cde5c55933de23ff6769a0a42933bdd700000000000000000000000000000000101c9941d98dc8a146a75f2fa48a8650b25ae8f6d943323b1c10360cfdcbebe220494660f4d6f7921fea006942e122ac06c2988dd6b8e9aa116eea4e1f63dacf100019844d37d163c047567e8e118862000000000000000000000000000000000e5b403702a229f36c9b83bab9335cbb4e39fe8f5e9a5aa4bace70361dd05c87ae356a40720c4a8214765d028cd161ec0000000000000000000000000000000006e447c61bce31b4843530e504fa1324657eba731a272ddae680c202a7d017ffdf0ad0656dc0984a1fa297f5e32c2740fbf8322f706b1972f73fe4e22a3dad29c4ede09163561b2810cfc3eb2ffbc7ab00000000000000000000000000000000135fb22eca115779ad1295f8c7f149a6eb4fe046df664ddaee976a15e11a7a59db5e2c44b4a82c8ca1d17c0043f41ee0000000000000000000000000000000000fd9c1dceb20e85ef80bc9ee44e483cd0e2714882734a561ebbd0982d6d08e9c41484ee99790c20e83d051dad0a1b1e04a46618381ba6b991b2edfdeafa67aef1cfea066fbffdba24db25385963326bf00000000000000000000000000000000040f65cac81c01f04db3e331659d6bbaac8fa01581b1bbfa62891c1bc95a67182d254650019dfa3171e16ce37deef29a000000000000000000000000000000000afd5e22abd5d5cf78764262a91aadcb8b807b2aafecb2aa3d3ba5a187304208e212e5df46a4dc48d6150a733075bbaacd05fce871e4ff11e7a4e834061c65a0aab7bfa8a0128d460a493337c6e63ebf00000000000000000000000000000000051046cbe6862c5e37cd2f3c14dfc2825d5c32de69b40f29140fd31405615edf6c116d384bdf1552a33fb00c6c65cd97000000000000000000000000000000000a61a19fdfc994105f03aa3e1b907f5177409664b2e50243cf7e0e6e7e74c7bfce582929e5670a351b3d7b4034f101ffaba9e37ae0dbb733af820743d8e307fc02a3ce9b40032b16d0e9466903de9caa0000000000000000000000000000000013b76183fa2e01d10a3ecea5be65ffbcb04724ed30e4655e26a7ac94d5861f0f308b7d4577789d2f4892eb89202d84100000000000000000000000000000000012c3fbed77d9c37c47c838899aaea0fb6585eec54801c3ff2b486086e33040aca6baf6192c33af59f7db1d489ddf7d086ef151662cba4952416eaadebfe5e0fa0ca1d31380e1540c2d5e0181af9e317c00000000000000000000000000000000195c1bf8dc0114a472cb4daa31be44f22a162d22f2968b7909374fbc4d0883614d2911475cc3ba242844ef1c046885e70000000000000000000000000000000000d03e5bc3acdd01d174e1d2308e3f1ff3f103db8e2804210da44c47229bd983ac127295558dc5560c0fb2ea34def196f0a3851bd52ca52919dfd21efa6efc56f6dd5060ad969360b1a731e8f38f0f5d0000000000000000000000000000000001261cc24d5e69fe8a7747fce45086499ad54f7c138fe76fa665517c58e475683c5a219df303810745dc554fa3c096f300000000000000000000000000000000122fc4c068c079827635d29e944366516c1d7cdb1ff62968d847f4882da8a4919b59e57690f6e0f6aaf083af0a04b2ca32b41960417047a2258b6e9e228f3cc1130b296cafbb75f58731a81fcfe8c83a00000000000000000000000000000000050b5493fdadda15e15b2ad6104274da831753b1cd247f1dacffb6f896b9db7190bfae2ca202907d36b979b668540ea400000000000000000000000000000000141245d4556c7f1032d0ccd606e3a2d3338ad753fd7d0a3c1b8ab38e94d8618e85c22a269428537abe003f8de89f2c1171a6f7f091a6a21dbfffcec2eecaa22d05252b60bf91b56811a833dde3fcfde6", + "Expected": "0000000000000000000000000000000008bfa9c347d937e2ff2d77ce7127b1af4e7adad5f1aa6d71c6226b64c62c955fb0dd0e36a5e87472d6979b656c8a740e00000000000000000000000000000000032de435000391e441ecb7e777741fc72f4676f64cfaca6fadf030e12ea6374a7fa988c443a38595def0b434b185c75a", + "Name": "matter_g1_multiexp_51", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000d0296528c7b2516ea73cf14c5625a4296c311fc2e09722f3b381279da52ba9482e43d3fdc1694b96c3f62b7d98d6951000000000000000000000000000000000da2aaba37d0955c5fcf31152926f2fb345deba744241bf66511da5f4ad9fab8a1cffa270c4e838c39b34bc28fbc08b02e56b63fc6ba87cf021c2f92baec248756ddae0a4f070df840db281283a4c9b200000000000000000000000000000000175c976baf0205ee7326c84c49cbd2d7c3db91d1ec92d87cca896ea09a7cfe4ef8ca45873f86e28afc4b525356a68cba000000000000000000000000000000000c442d3edb8b614407e0d138417f8a6c028b29dc1beb5825c928dff3a08820c5a8ed5de643068bf4d239bbcc2dcd0b7612a50af55f47fdaf176d4885e4910c54428c8ef433ea0cb1d009ea7778355947000000000000000000000000000000000f45bf893109177d3c336915c5e28c338ea28468cbe215ee6fc6f6e3c9aa9e0b7120586e42c5c087b55fb5789a4a9eb2000000000000000000000000000000000b6ad0cffaf555f081ec7a6fb354d6b20950fb6fee059f2f571430f86a7cb9996b5f655bc7cddd14f3f8ed37c7fd278889a012158b3c18e19471fca6d5aba5fd004a337d49ddef5db177da187c8cf1c8000000000000000000000000000000001944f2fa08357307df2271f4bb57cd07a998df56425f7b8563902aaa0330070ce260b6d86fc38a5c6a284788d9cc0ed700000000000000000000000000000000165d8134931f7a4cbeb5114a10e44172aa6a0c250989dbd88282f92fc238a8e1e21221b04b239cfc597e2b74700c626d27dd109f6df1d9851dae28bcb9e552c6b1e1b2dfb331aa955d3d0b6c4862253d000000000000000000000000000000000c7a02cbcc758fa7b1ea5fd30b3b88cdda7c8661b3712ba5bf924b441e056fb9bea804bbfa1850c21cad891ee253ff7100000000000000000000000000000000012202a151fcb86875b4dd2dbeafe5ca484b63408ba01440007164fa2a2b7ebbe9d7f738f382a010508408d26a57c566ca96785c1ab66cc5c8e434f59cc1ddf76bd78b6fe660f7cf74cfb79d7f2c7f840000000000000000000000000000000017d02a3ec6d45e9b49ddc8d1bdee168f71c32ba26d4de8c1bdb328cb4c46286328387aac8785eb5a7c71d0ed59810f4e000000000000000000000000000000000d23ee9c9fc914404ff46d0f6ee86984862e97a777ab516c2b84f5b5a7c1807d64e93fe57db53c7b95257fe46a7a15495aabd1fba36142bd768339e091b15b7f5b4ea609b57947a7187c498bd9833c2900000000000000000000000000000000040ca6ea6cae1be17996106cacbc5d9f1962203fd25917dec2c053816f3200b9853b218a07db690d8261ae3cc85679bc00000000000000000000000000000000097e8f4b5a24b010382888ebd7ab7cb71f471bca00c1499486cfbf1bc5ba6af169ac27e1ed8cf31b5d9600361ad13663fbe608fefa5472c7d1611abfa402d2eddb1e54542f45d4012db8ac6d1e5016100000000000000000000000000000000016f95e3e24941c2745c009437c1b2f5ebf690c9c76e269f877bbf73ddc6b15c6132d424c26a3c7bdd9c5302dcbab171f000000000000000000000000000000000cfca2fd001c0da52f231a60288b22a134c7e16aac8745129c351dd96fa37b72a9ef3d93d5e8e45cb5fab9e73ff188e128d57066cce439d8d0385f647ed5e9b29e8fd0528c1ed8455f37dcd81f4b6224000000000000000000000000000000000e2bdbc906c10b04c5fc1e867af43bea7ca43cdbc43cc3574a47b2b0670716a92fd863d4f423f3392ec8849e74850eb9000000000000000000000000000000000ae76847a2524be3a04bf85e096a1ca4cd3674459698fe326db2d71799c8906022e15bcadfbc9ddcd43dbee3443842a81208d8d328014a6b2c8b2b9edc70589cdd63d38f4e70abb41cff1b7693bf9a2900000000000000000000000000000000035d66b8b8b64bb0d3d1ba6bc1bd34c326ce6abac3a97188f82be38d1756f14a63bfedd531d5e19813b668012f77763300000000000000000000000000000000060851234e4cfa8c168db199bea8cbc337e685b565a6faf67e07c463632a6a163a2d22acf9fc6bc6a1f7ead5d288fcccd3a2044ed4f938c17684413625bdd281f685abea2e375bece77c03d697c82cc20000000000000000000000000000000010e398f6c9ded2fef3cd95cbef681c5335a1e9d08c05dc05b6391f65941cb3a79df9e1cc4ebd3fce82d36cc628b7f65c0000000000000000000000000000000016dede30728c57650952e9425b6da1ec8ee5702e783c69936eaf6857f199bd9ffae569db3cbd61483d48188633fef7ed7fd81e27a577b5e79929614c069d6d52146a6183822d25cf1ef84d8afcc1f6b40000000000000000000000000000000005eb3a914a78b4bb3041a32397bdba3edf6943ed474ac8efbf9c84a6cdae5d65a8f55ce4ad141b846f1bcb5df1206417000000000000000000000000000000000c20828a5d8abc2c8f72809348e770649bdf4bc0991f45979501f31d9f31e028731a8ccf07f0cc51bf8b59632897c540c5d47ce35d4ede84a83c9860322f582ec00c872b4b035d5d340981fc29884f1300000000000000000000000000000000122cf863d9ddfdc627a0993dc7ca5810e84ab254ff8147a220d436043c0a695b0cceaa374842c335c14b6ebb273472d800000000000000000000000000000000150fc0b14e30ee797e3b9202533c681ca9e6b1b43347cfa11da59ceab439c9e5cbc038a50917cd9167a0fd591d8175e484ae256d47de2d49b1e755cb0e972f3b614f3e7ba779c65ce175ca3811021a7f0000000000000000000000000000000002ec5aa74588f6a7fd8076b9a846ff3542543dc7a3c798c423326eb06ef92edb8c35583785cfff21f903f08f692d6293000000000000000000000000000000000df140c1539cd3d94b5f9d0aafc38294d1738c5b3c1880d8864e83909b152de0a469742cd31e5e8f5838ad793ea32649a09d0136d4dbb3abfabcac55db48b1ce302067f413283fc1a21744f1c16ef7b5000000000000000000000000000000000a440f227be209dd1bb816a4dd8c1abbdbd03d97c243ac6e48c4efcabef4d7a4b5bf65ea7bea6f4a1da985bbb9fac626000000000000000000000000000000001431a99e1243e57054d2b43217286b35bbf37afff72b163ad40dd4ca92439f4b513284551b0fb137f968f9f59a540cac650a6fba1a5eace6b455ee780ff266c324f49801832640856a80098f0eed0b7b000000000000000000000000000000000b99ae325f1fcf4f3c83f251183871d1b6048a43d15da80650e0b5c1b671031cc9af63a478b5939210356c4c2dcc7aa1000000000000000000000000000000001382d6f0550aad61dccb47a66d004ab3801445d55dd320a6ccf03577b1c1c915022a955e7f3fccbbdd20e4175bd0ae38282cb1f8f6d6dd81e7c49176503a76837a96d7f2b084d29d11dd9c6548cf0a57", + "Expected": "000000000000000000000000000000000c62c70aac1893222d967bde4fdffc565cc65fe29387825224b8571367ae8fa857b63c32033faa564f6e12d409b5cc060000000000000000000000000000000015cb57fcbc876f5aeca01d90d55ea777aa1421547e8aff0de69fe5527c9a575f9cecd1235a37648c7509d9bebb4e6800", + "Name": "matter_g1_multiexp_52", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000123fa54665de1ad1eb74d400f93b70f8502bd9386a164ef9ac7549b3693525e3fd077b2b2d8b15ab0c6cd5da30f8317800000000000000000000000000000000185921a0fb38ec1eb6804002b3bcbd4d4bc759885e9c1fafe275d51840434382df783518ce768ae40e736ad2ca8fc8803d7f8fbaa4225f3008649eebf42315785ccda2b9ce922170e606876881825cb9000000000000000000000000000000000eb30c8da4c7eb16d797f24b5d8e210dfaa68684939cad598518298c84214ad769f6a2634fc290c2c267c8f3a2872f020000000000000000000000000000000006452f211931b8d7ccd8777b2407e5cb073097ae9b309f1e95633f39d1a5a7f5843a6e87473b4b9c1bbfc17971108e3de71e6cb3d4e19f4a70a4465df6eec6326f558ee1cb99aa540ad2a73c363a133900000000000000000000000000000000162c0325ae75a81c92a8885f14e2f7b9b8bfb249fb9a352d0007cd8bdfce2d8024f1e4674614cd0afbded99472d547000000000000000000000000000000000010d8497a5f31cda80af22bfa6695b4e2c8fb5557ee74581a33fbd0cf8cb2e0b4ca3ecc42487cf957ea81a5388d9871fcbdb2b3c3b8e91540dc2724537526fd8c0d4b85d2cc20323d71fa5a4f61b3f12a0000000000000000000000000000000013270ce7a1b4abe3026d245df9b93061a435ed00d0464d8de14675247c7f2f1cbb6e21c8282e71d2fa28eca1e3f5863c000000000000000000000000000000000b87656d14cfe98c2d3f34b03de0b9f08207b00aaf6c5a4a6b9b4989744581772a2d6d1923c3d07b784853f7b2d789b9ef0c8574167a3bd3b794f057ed01865ea69c38023dbddb0afdc55dd9523ebab700000000000000000000000000000000067296630285ec7da7cfdeedd387d52d905ec39e183b87479c8f0fba967e840f8394cb518dba4f4b7d4e2cdc00ca62c3000000000000000000000000000000000ed41fe0f04e0c63f3fd7ec7560d24974fd06a1566e8f129f580251227cb9b7e10ed6e60c2e7449721d5332709f465973ccc75501428d3be8bb469ed0f2df7dec10e1d205e11a907cc30c4a76eee3cc00000000000000000000000000000000006f7bbdc3c8fe2f7da9533a3f8a3c48c630d6cf567c75dcf89e13852f7a8691e2625ca24517ad3b59ed3513f7d3b4fb20000000000000000000000000000000000a2e63715ec49b06a78e014b98effbb03f99ce61b464c66108cf18ea49def3e1f035a8b88f37b453b31357d2a2a48f4e5e403f555fbc800f1342275f18a73dbb679bd31873ee87617090912a52d6a55000000000000000000000000000000000a9e51eaf24d2d0fcb7f1dc7ad985ecd4da3ecd19fb75591467edb0f7fc7bcef67c1c272f39c31ef36bbc73d7ea6034d000000000000000000000000000000000332dedca239f4d1272db77dc388e07005d90f44311aa889b42e931d08c2669c3f4aeecd9052d3f2585b2a4e41c8abbf97ea57a38598204c15bf65e7270a175460510848540ca4004286f3ca09eb5926000000000000000000000000000000000c6b189ddc86e2d6722ebabc445190cf94bb4c54135aae2601c957e062d351d0c9fff19cbeb45cfc5dd05eb3543a660000000000000000000000000000000000133794839bae14fa041004f173506fff511526313da5a8f4e32c895751a22ecf01cfba564006037326187b899aed596ac54dd8cbe68d5151e4428d35ec2d5b5cc7f5e455207c0788a695c2d7fff67352000000000000000000000000000000000a15343698b916965009f1894c8b74a790d59bc39b7f0de01095275ec002c97c66e7a6a970b4b9091cdc54abdff1cdb800000000000000000000000000000000045f084e0a7c0014e58c9988e72e1861bdb4f962ff9869d444d5ba4094178d52f9c2aa511feb6e8717098cc1f09d49eb47ee5651c127d7c8ef65ec68fcd97d1dc228bffb5bf1278aed3eef8115a5ae72000000000000000000000000000000001656928ad3ee67675951e2d2ddd6a7d9c629a3148face6d1269f79c3d0699f95350e83a6ec20aa3be78a2794c3f250160000000000000000000000000000000001b8c9e4c818774dbd2416193e795a429a22881abc94ebd9a8b42bc4d7069a9778e4bdf7270180784d914bc6be99b41c14ab6a1d0d3f87e7c9df0c14b6fd2f9d0cd755d5fce5f40bdc8174790901549b0000000000000000000000000000000013d779138ab03fafee1e4bfa2a290c4f20d2b57854a5133cf5ad7817bd32bbf2945a02b4fd5c8489e704e60ee937f962000000000000000000000000000000000aa058528a4f9bb583295ace843feac4dbce24a22ea6bf412be019f590c621bdfc7562e8dd49afcc337cab474d9abd0129b12cff5a72f27e15032844fae50e3cabbe31a69568bc4b5cfa884f62e7e2040000000000000000000000000000000014f30fdaf2f81f9d941af33d53e2d9e3162f62f47c60164e9b5ea3a5cf3a681a80b66ebfea391331c231abc4341cb94b000000000000000000000000000000001854addff23c2f53a21a6d39c72f91ef0e8d9a6d6468f319200466f78854c41be3e914bf7f966f00e185b44108af30f092c1b10d980826351c3d193a0f54a7dd78a3995efb02fe5b4525fca8791b1c4f00000000000000000000000000000000188a1934a28c7571ee94f1aa5c161be611939e52156bff158170d5e12a6480e3b9d1528082cc2e537ae1734b1847f8f8000000000000000000000000000000001728b57eca86cc8fcd9dfc65a8f5f055d51d300d8781839d744a1b81a0233221cd353f642b3507703880eb0a33afa05c8f715f35fc967837facb515ebff3df502223c29e7089fe6d2e9120bd3ecfcd120000000000000000000000000000000006c99e6c8b554d748a3526da79e8a867efde15ec50ff62e43f691748996dc087dbc538cf65820ca065f3adb5884e2f0c000000000000000000000000000000000c577c42243b95b4a613c485026306513685cce294333b72388d6968019d04214ed4bbbd5b64bce78fc380115a4b067ca9e49fcb12c0b1e9bcdbda52e9852ee0e98fa0d43f7476b3d65ef5370c9460a3000000000000000000000000000000000d7b48e69a9807c6fc867f59c894d5bbfeeeacff500a3ad4528ed4848f5ce501baf8959f822c259b712236529dff0b0a000000000000000000000000000000000e7d7932084a0416a4bafe237c923d1390dc6662e7842829ab6747024378f284af07ccde9cf80042bec56e7429ab3acd80b0d6316c5d62d41fb0399256c5c46ebe2a12eaad835d2c7177bb7325e21d3b000000000000000000000000000000000a1f74acb627d1814ef90b2d756bf76383075134c1b34dc126094238eadebd780c1ab8a3d1f4d9566dbef1c706d931920000000000000000000000000000000009bf8c2fc78b1f7af25941bf429059e9f86b34a36ff865b33e918c8435a766d897df83005c54871ad0d3e82308e368501b96434f34fa3e00ee0cfe548a2d2ca29a848cf1c52f940685caa9a227e32a61", + "Expected": "000000000000000000000000000000000a912d7d352bdd182a8b431672b496ecbf18276da61d6a8eb066c41783b7cf3df287796b34b165db186e815c8847b3ea0000000000000000000000000000000002881de241ed8109f544f3a6262eac1aae69de7a7e9953812eede9e63a970225646f5c441b7de80106d53cb6dbb43f10", + "Name": "matter_g1_multiexp_53", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000018896a4d84c1ec1a20e1b0e33f159de4d82b55b6d27d863ec7cbefc2d9c180beed2285aadb34d29ceea681689dab06ce0000000000000000000000000000000013398b5f6f2c0c9095af94796572d603de02d41c599e09d3e254b326fa1575e0c6a2b7263a196c5150440daffb0d60e810e0acc22c43080ab9cea11a60866feedd57664bbe6c3f0366beff177f6631850000000000000000000000000000000015b31d591dedde69dcfe9c23df11782c090c443e505d2edfa217121a1d51b6883d782917b2a082a41ce698ecd95ba95b00000000000000000000000000000000164b18eaf53165842e50112c4a8490b8246376b58bb6c188fc929160f49cb0b68ad2f13dbeac8466fca75e6f72a398b8cab0c230c354cbf1a3c13c23a36ae5f2d5d084d7aaeb427c580cb6b9bfd9df600000000000000000000000000000000012876e247618c76af5221a50780803ab64970fea8bdeefcdc1ef4c9a160718fbaed9dc6691502433295d54d4030ee157000000000000000000000000000000000cfd8dbbeecfd176cce05ca1663930be8cf3b300a287ed053e36f64618a14850a3e813582da1f54ac7e96ff61ae57c86290608899cce4b3d25f57519cc881eb748e9ee7e27f7b21d69f5d8ab3650c3e800000000000000000000000000000000085c5db53c4abe188f44f084bf17084d3ae409b753089636d3c528162c2816b9b9ef3c0c8c05e88189407d7ca95d40f9000000000000000000000000000000000015d9ab325a8ae365f173821829aa395db9211015903c08491375f82853d9084d8aa2e35c2634a296ba14b50e34c1feb71debbd9f3be5d6e65e837bd78605d5653fe63025c320cf49c035ae66d8ff570000000000000000000000000000000014bc3ba096662dc560e88ea6b7b4363c427d038fe85a49ab8d9d63524940f26106447ad6e3d7495ca562c98b64d445880000000000000000000000000000000018bf745fde497914d81d1e3ab96630f24f6ed27ebf1208f7a46ad9fb893a3f183982c0acfc001984de34f617841524f9250f62ee2c2972e751b36d95a578efd2fa5e0a2c1e29475a3cee48a28080cb0b0000000000000000000000000000000019b15da994067a017c3040830b5e5f7eb77ce0cf0674e96b209b80c54f1307cb04799624647fd1fb990c61092682ef730000000000000000000000000000000002248d31211c2a37df59a0a4ddb0cc7880dea316519ab7baf1c614b26e2673f03b00e387fd537aee442cfc94f734aad8ad08c3d2c36085212542427c1760c72f22838be5286402ef87403f816f4fec950000000000000000000000000000000003a499813ed2a3878ffc11d27dba4d55837d1114049a72444b6db0c8a7d23a53af765d66b5017695efa39bcf7d1c97ba00000000000000000000000000000000011fb1a989afe2b093fa2ae3c0405483bb1a52c21226acbdf2a52e2e5fd5f7404776551c2deee87f431ff39dfb031d716ffa16b6fc4cc9509a2b8d8434fa0f4f38b4cb4eb1bf7f545f9f43b9190cad890000000000000000000000000000000014540330ba54d2f16a9bdec93a0b7ccd58ecb44361c67f209d36d2a42b5d5a4f9b9dce0701ad0677d6d6ca83a256e8460000000000000000000000000000000001a64d5b128c07848ec579df1d26755e5d2f70cf123013ac249a4d188b0eb56cd74cb12f7de2db69b3a0f9f4ece2c4201271d29abc5f972809461a1afa5eb186dff5e28f20311a1d8416f8d54fc4b2d90000000000000000000000000000000017783e019baea183ee5d9e1f671a23108e403a22580f5c203dd6ff72dc0adaf802d031a236e72463e0fa2c5f7c6e68b300000000000000000000000000000000132d32bae3b92b7212dd7db16c87360274a409f46199f66e572bdb21c4af24af62758978e6d01af60f5fb87481d9f4f23ce55b3b32ad29dca1a0c99771fc8f7179851995d5eac804458edede9b8dbcd00000000000000000000000000000000000a625f252a8185bea7f1b73d1c7c9b1fc7f4ea5cdd017afbe9e56e7c12d58d893ddc387b7c2870f4a975b613bef0129000000000000000000000000000000000aff6dcf60f78bc908fc4c2466270065766792a05d8629fc7f5d2b61ce4882644947fcc3600d63bd5f49fea5574616bcc6fa7aeb016b3e3f599846af83f426b9ab85b6857f901c49554d03d27a390f5c0000000000000000000000000000000008ee6e9521f32feaa034b533c0b7c749f60d84adb53d6943d3974fb4b92ce3cb3f67fbf52fff27802c893cb97e587b930000000000000000000000000000000012000b50d1c9628f822c41d56b29e21f3f496f00bcf05edb234ffda56767bb33dfae736aa9fb9a84ccb6a0e21131c5887275a8d16c02389795d54ebdcb70a39fa885320d00cd4e5aa15967916e46c6150000000000000000000000000000000014d9d3051d073d24701f01631408b7dd1d37f0855baa64a13c493c15f7acf36da116595fb3d69dc386cc611c998f9ea9000000000000000000000000000000000b33438dc1f84da6ae50b1aa76fc52f5ba0e547fb15e8f655db9e0e26d6aed15c5cc4e48412d089d1ca6fb7a550f8eecdbec9767ed2dbde21fd8f315ed6292b5b0b1bb6daf2b62665c34daed00a679cb0000000000000000000000000000000008935c4cfe2a1620a0c895feecd91ea7fdcca3bb06fa514bafee38ea5819b7372e75a106904b9c9e8af268c9f5e5a45700000000000000000000000000000000114e9944fbfc05ee1ed75603bb9b79301a1f90d3b5209ea14989fdd16f5deeb01e3474da2b4692a3e0b9625d3bf9b4b2ff634fd89223733f407c242e52f034691036c7ca69f30e6cd444c561de9ebdaf00000000000000000000000000000000105268fff23696890182b5ec307b38ee1cf28336e1c3fa28b9b697998567035323ccc91e974f63c55c928f64fabc2ca0000000000000000000000000000000000ac2f8c91fa31e2d950385509b86d512c80f0d1c73d223f71b26040d58822e4269a85e82ae390441853f8169177943aa461d349e9711fa701b92b62dd3e3569d1203b6a35ac8600367a4df9a9484bdb0000000000000000000000000000000000d5a5c94375029e5511a6c6ca40108377db43e4e0b03cceaf9fb77fac7906f71019c1a85591719bfa5d9349f1089ba0d00000000000000000000000000000000163bdfc6d40c96bd24a3b83f89037ec9e4191b533e36dc699a32c854291b0823b3f071464654eed00f08a691aa68636bcc110fd7a6ae46ef78c0e26183e707eb5e0a2944e3afc09e435d56e91584b93d0000000000000000000000000000000011654611997b772db3111d2d4edf92b83689451b1e7594a7a4bd40d85820df6a1ab090f6a1959acb322323eef27fbd86000000000000000000000000000000000b905fec9e379cfba09fd502197305ae39b48facdb01f52afbcdf159c5674234ac9723643830ab8e2639e7a0d6bd979267de5b9bee26b26b28f81d96e880a3f07dd04eb56c15314f1a789436e01adcda", + "Expected": "0000000000000000000000000000000004de1528d78645a4055ea348ef2618b85f8214c1dbd21ee08ad164abc02cbb2927202302dcd142c65e12934dec409e18000000000000000000000000000000000de34a6fbb73c7152f1636e5c02c75dbbc5910c763bb790d78bb56e48cbc6380bcc2ca14cc11ae139fe009135c81b243", + "Name": "matter_g1_multiexp_54", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000184094ad33f83f5b229643d9808f5b3b7f3e50306788f8485472405c79e57e489549c0901c3d1694b5f61f74d87afe9600000000000000000000000000000000007ec616b56868e00563d8e8bdd36de3b5d1e314be0d81c4ee97fabab1641c89cc21e70153a4d3d4e788b04ffaf07bad624ab43047c02e30ba2ec671511d06f869bf736a9866192c5f2eea6c065acea40000000000000000000000000000000017e7c08cfedb74bf88c1a80762be0e0754a86e5482c27b41240f4ffa9d014e9e8560e172519031eecccd897b869c365f00000000000000000000000000000000115ff96d404829597f16b9b97f8ff71a8eaca1a76bbcb72d53803d35335d8a8c1cea58559136f9b254c28262aa907414edfdf850c0d3e3903404fe3e0f523cd230cabc45946c4fcb6d0e5e05e388c235000000000000000000000000000000000b5450038d49c91e4e5a40a31f1f75923c7e1599695b829d9975ba7d845ab20ed5a62a7238d6a6479b2c6f9249068aed0000000000000000000000000000000013066cb8ef171bdfa11e70ddf83eb2447c4169fe38e008be5787c38b1b8a946fc474e07795765ca17fd5bcf64150fb04feb34852ce0f3b5730962023418ad6cb860716dcb526dc53e8ab6a74a6a3910b000000000000000000000000000000000f19fc0ba8a0ec5a2cdb9844002601f580e0eb9b2265c86f6efc4b633079d43461d6bf241ccbf422eb9d7c00ecca88570000000000000000000000000000000012e744ae937ff9e8e4f611fbd1c9896bd31bb1ca36b948d9be89960fee6c0cbab3264aacb916ae3596f110cc1b26bfedcf25e64093bd92a8fb394511215a3fa674db86d7329ac5ea70ec77d24d4ac58e0000000000000000000000000000000006ca09ce8c07e89e9e51e208b5d32b5ab61f0de60484d9185a26911b56a728a7473b70313fd18c893ed3453719b074450000000000000000000000000000000003d372a5477fe7fd84a58f6f2eda8f5c61aa0c357c7fc1708f7616b8cdff249e7d2910d753c2e531a278f5853fc065970b40db4f9e5c27a3208899f4f536880b97f4c69e7d889c0726d87c3fa27e097500000000000000000000000000000000152ea2fd1934c32c3c8e27a6ffb278741b899c5e296549380d019307875629d57ae44580a944babeecef73753e30c92600000000000000000000000000000000161a77844c90a6e83ed2c40c937de21fbd714a5cde60015a71bd4c960e894d3cb54a8d1e4bb4cb0a1985d4469814a991730bc7f68d8d371d0bc51d95f8a5899249b8db5cba0d21fd88ba6f86d8691659000000000000000000000000000000000a959b12e3af03cd4629f5f6f412b7084eec6aa55369e2dd2f355c93ea984ea6f2a7a01e6a10146849503d230fb08f7300000000000000000000000000000000161340908a38e4ff5373df643e3cfdc459d872b5cfd41ab34fd3297b10c37dbf3088fc23fb71f2a1751a121bcf51ee36ef06360717cfcab15be966cba2836b97deeedd20a52f88c73e2a583b64c8e5f00000000000000000000000000000000013e31a4f0cc29a5ff7f4df39db999c95eac789656bc9c6b91d0209b8a5ec2dbab698048fefb75a3dfa48066ed5743215000000000000000000000000000000001851e72741707cf96f887d13e01981f1e3db5834185eedaafdea99eeb11dcd3e90a9985f40886b60ee2a779b141bb62082b7d8b8b9345bf13d0e113b662141f5ebfc5888a5ef8ea06f7d5d137324ebef000000000000000000000000000000001501f155cf6f053631ebac7d2c57cbb101a750f98b6e11df79dbb24ec8804535b1b24942022aa64713fc60adb2017bff0000000000000000000000000000000012a08f9b1ab90531a26221b70751efa598b4046a5482c01d72f506ffbb3430d35016848755674d01e16bb78a44f8b6882396fe15751bca2c4a651445cef236a865269849908df53551802dd378b892cc0000000000000000000000000000000008fe1ea18cd8e1d2c620356430ca43782f844a2efa6a285a7c9c086e972b12735faf6237447759bd93d98b6dc7c42344000000000000000000000000000000001731f36e811c640f44adce6bb68fd71065f440eeada278ebcabfb9bf0291e551ed302c592aa4ba7e3a502cf58e3eede69a5897c9596223ca4d6628ca1f793a000aa21a739a37faa28637692b754148f80000000000000000000000000000000018e3a4176b543f2152bd7f72ca358af6226f77b5e10f3f9006c8bbe4283776ac31e6d10e838e89e8090215a133e2cc510000000000000000000000000000000000f88c3eab9ab32fc165083ba1650736e04b4e8740591f6e3ffbf684fb359fc8d82513c25a9ecf4d46faaa14d9f13a3ff20a2973faf886556e5329363bd9b9c96424fcf2e953df90bfd011ec07bc66eb0000000000000000000000000000000016fb47b4497cdcc75c0547f4234ce94f45d160e7bbe199902b2af5a5896e7d46cdc866d0fd730f568449032fc3a2df4b0000000000000000000000000000000016c2da30ef51e6728c09c3b29a7abdbb104f1a4fcc8960248b9773d2ea7f1bd161bf17203a271edfb235e8b0be437957f4ddb773155a27badba330ae5d26096f350e9ca2811feb227c4eee09d2baf32f000000000000000000000000000000001992edcbf32707e92506e5cd12662e730bc96b5f33bb88c5569fe6b266aecf63548be20b03fefaa078231b17424ac98d000000000000000000000000000000000f6179cb8878214222c2353a60e0ee210c86e306e335e929050543f084ce7c7ef56ca8444eee59856f4107e0d8cf997b52e4030b5a4bfa767ae20cdea7f464dd2dba51c9c698556d24b8f3d4d1afc82e000000000000000000000000000000000d3ff341e9b3821ac23ff7a87cc9dec3fba38ab8f2bc0f58e4c0135a9d66c6d6731ad8bb97468ca44538ca7f26fdfeea00000000000000000000000000000000053240b8429fb290453de18000ac58df56b5bf3c279e35d9cae8b350b932b0545b6c19ec7ff186c2123731d971146df1d32e0429e7934faa526475c5c7fb977c3030ed74e145eba21af2d2cc8461580f0000000000000000000000000000000004b424dab429bb3d22d18b52c4f9412a65eb7e8ec40b5e308f65fe6c0da1a1ab55a629ef8ed57adf108d146b46e6261e00000000000000000000000000000000057b7d5285194693a7ec1ed9ee3dfbe8598d9acb670baf03bf77c7799227ea788052de690e229b0d28c0a6cd79d22b0c1f700d651c67ca5b8d95fad1a8e412befdf691b074956bb8092938bda2ad2694000000000000000000000000000000000ffc202d826607947dd8f63b227a06d8c6b04848dd102da57723fe20e9b06b7c125f0ab2d2f53e14cbe95f1031624f99000000000000000000000000000000000880400b425ffe1b63214509f9acb0255d089e9de8e4eb643fa3b0383aed760f4c00babadd32f48af724a2c80a8223b383052a3bd7a13bb1ccc22b9519c7ab12d2dec67924fd9f15f96069de22e7b692", + "Expected": "0000000000000000000000000000000013c0b89e259f71ae41cc73ffa3c900ccea45a8a655353db6eb17a87582b00bfb971ba91d48526d934b95e9bb6a0fb5a200000000000000000000000000000000042a78ec26bc1ac4165c36d84588ca132b7366a3fb548801810da041213ee84c7e6aaf5ba02ac051cc1c5be5dfce0ea5", + "Name": "matter_g1_multiexp_55", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000083ddce067e21b219535e477f77ba100fb86744b1b82b4ccd0c72aac69025038e719ed173e70805c025b19bf7ba5908a000000000000000000000000000000000a9eb816ed60bbe55d4833c0e91ee73669aad116ff793d941223c17c86fea3ea434172c3214a4620d4090915cfb15d11c40774f67a651ad70f17393b386e9ea9e81682ffd78db7fbc17cc5084f3c705200000000000000000000000000000000050bdd7d98b9df55ec0ab87e757de009c804880f06be3ce13c5e051c3080df45bedad4f074812a698f50d6774cd5921b000000000000000000000000000000000a8dde7b81feef753cf16f0818f29256391276847cb832bc2940bddb329b249af4970684e95fc02e702f09a84e7737dfccf1e36e063a5fdd4b735dc18bf07703b80c6b72f987c05641612d7ce73562c0000000000000000000000000000000000d989e383d1c6e48d14332a72a8efd89260fed65a47c4baabeb0c0cd8322e26ade95b8be9f532b4813153cc39e7a9402000000000000000000000000000000000f6f7ba41c95beccbf59ca1ebb1dd43348c51de617a09ab8a2d67d3f7065d3f4699b1fc31197275e5b895f92dd106d667ea75dd2f54fa6413ba77f10a11e12abea3a4b947116e1e7c9334a0a37c396310000000000000000000000000000000013f3c3eec6fd2d4c830458cf58d5e18f0367675c47d38fd5ddce1e8be3d6ab04f71d09852b987d2db64652b3255e874d0000000000000000000000000000000009c0000761e1fe517eb32bc3da4f7a933e77db6f960f5405b64d9088776b6ee8e23743cb4a1779e8d0d93787ca029d7c6855c61bb7d72b022c16290c6d3ca9c1255cede8e0b827b43e40fbf018403978000000000000000000000000000000000c7a5bc0249717c1e39a4eea37de1b423960b409f5e0b3877e90d5278cabee197948383936739ee3f25b4bbf7f32e18900000000000000000000000000000000113d6fdda1f4b2a20d98e1d458920658c762303ee69fd7273a8830728f79be00358b3f3000927bc4d26352e5b9e6652b7fa8503101f392a6c6c27300b6992af3fcc48d47f73db67615a44de883770d4f00000000000000000000000000000000108fb7a97ce429fc3ba1ca54ae841309e2ccce748dca953cb7dd9dee3ad9d919e3f8ab635b294b94b939cd80d3435b5e0000000000000000000000000000000003af838ba4ec485ec2a17e6f592fd832d05133952f273d1b472800b210c96cc503caadc17b38d3d1e978606786d9ffcddd947617bcb7ca1c8fda0d49e6d950a84d60230bc2411d42ac32e3651f48524b0000000000000000000000000000000004cef28329ccf221ad7ab2b851e869bd433116753e0d8bf38d22ca46fbdc71fd9d96aeb9c0df69c47905a99c96fef0aa0000000000000000000000000000000012ef5c40d8b6469d9f3921eaa99446fe494a55994551fd1996c453a4e5cb4a2cbabe20671ff51639710a5e45a57271aab4cbbc6d537ed2b69c2c32c84f3cea3d2db180b64861859368e98aca32bceea6000000000000000000000000000000000c81313e8b5689935fc01b5f999de2fbe9852bdccf484edd0771e8427f2a194e29d0af09db1152fcd91c8f7b665f6929000000000000000000000000000000000f37dc7f87b8de48441861ce0c88b1a24f22aef2c321ddbf385cedec7810c20c7fee3d2c5a04b5390a5fc24612e4b3e9457bcb8c44a2d9d1facb39ba7ec8ede5d5962b3256d9fc2e68a1ee5a733ccbd10000000000000000000000000000000004ebf9f75e92ec4fb7168bf71215c9ea8ec17dd9ab392c9810316a30a33b4ace8d93ab75356baaeb51a7f47b4370915d000000000000000000000000000000001307c68414b73db43bcd9062580f7c814c3c34545ad5d943685ed8df26acd457823ed628e4b215875a9008a406fadb5619f254dbf75f1c42046343b0060e71302bf6c94ca2fb8aec74fe7a47a3c9c3ff000000000000000000000000000000000cb5860f081e314d4fa3bf70a5eb18d6fb7f5257a708f1b1726b539115050754724ffd6a34d3b5c95359f40f41f2390e000000000000000000000000000000000c392d8603c2ef93d2765d98c695dbda8e4b64ed90c4771a4e69fa00a77d788981132336f870a3a93765902fd8fe8763f08cf27a47d89ae6e2ffb27870d613b9ae586857e4ea00670944a2883ba325af0000000000000000000000000000000011c802516f42e267c0f9db096fdfff77d676eb301ef1ad440b6c2129c5b5722c420f6e479443cbf43d48803f7e32d8470000000000000000000000000000000004a5ef232d3582724c3eda67cf2e69b26ce44bd927555359820efc3fc67912df560edfc4d119c5595e1ab1fd7e2a262f50aa333bb6b44086fe6211e89cb70b8467eccc228c09aaa1d589cfc24771a11b000000000000000000000000000000000eef1e6400dbda287910c117ba17eee1137377e262f7f5cf13710b521bd26eca2aa9731b0a1cf182a0d57a329369125400000000000000000000000000000000188e925365fe7cb96875e85f711d8ce233cadbcdd4c892eac52d9c77f98082662410db4cb6b24889b21f162eecd10f42d9f7f74a5ccbd01afd985d3259739023cd012cd67fba3a4ab5597e94d8fad434000000000000000000000000000000001307849ed4d685815c670477ac54826e94465aed0b70df9683d09ddc62597e7a0a7a4b2839fbec735eeba08bbd3e821c0000000000000000000000000000000005dd74ee1018ff2280c3dd8faec3c97bbd00bbb7cfbcb849bb003b590a999b6bb3a973ec96bd9d825206eb353086283485c00be7e66e318bed8e66cc41e7fd0593004bbca20f0dbc28efe4441acfc9ae000000000000000000000000000000000458181a1019a65c34835eeca4898b88b0351da7422bb5982616c90740e8773b5a03272646f26c3a5801c6c16be33ec900000000000000000000000000000000101c2091a08179eb0be41e20a545f5b53b8ee39365dc9b57f12d75b2beebdad488d63e857ba5187c8f92af447f72896ebacef63d90ad11bbdf0c5fa2db2838c238ad3049a3f47b7f67361825efbc6526000000000000000000000000000000000cb8c637a9b8f053d5104b582ca03ecba768425c639fef23c4b624f31523e0ac669183639991728135474ca19e0335160000000000000000000000000000000009e0798589417cff12eef14f00e415c51c30fc26461e92c4e3fb4a5ab1a653ae791f05f4cde0cfe2132c377175cec1c2473fa3d16e6431da14b8639d4fe316692db087a167a2c4f07307e770bb9e35ae0000000000000000000000000000000008400ba7dce60413ff085c0904066b8e9e9ae290781132e739a5a8c7bcbda322fe1c8d0fdb0e9b0abe44ff99d4ca22ee0000000000000000000000000000000008b54feb64f59541ba3b7c6f86d24b69fa30ba057db890cc6d958e3a7de8bd379257c90a413050f7789ded9ee7b28bbd2774741f87af1d6942dc4ed79b70b2d706f3db6b6d083eef0475334ef1e2410a", + "Expected": "0000000000000000000000000000000017377baed9953cc7fe1868baa9e2f6c87edfab1700bd1f60e2644bb97cbe2dd1fe031a986fde6555930d4c464399f1f6000000000000000000000000000000000ff69a282658b49c270e829b326502d83a82dade820de50764a7df957e94e7c0a1f0e3d9084b45d9a875134bedc4a0bf", + "Name": "matter_g1_multiexp_56", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000000d1de82c29aaa76b17079b2e1000005bf37df08de2c5ba7a0f9a14870e0ac327f46f59a116c72db57cf5110aeed6c76000000000000000000000000000000000a8ff0afd1cd7f541775567134a889d82727e893e4f57d1b5981fabd4bbff59dd3d3995a181efc9b5fc078eb3d4cd0e7d10ffdd3797ad13e65a1115cab6529d0f87b91eb41d6265e694eed8f026672140000000000000000000000000000000018120f0d0dc908dce4adbe50b24b66ce12e710fd35e5a8a8c357dd80c078d6854f20b12d40279b9d6a895460d8989cda00000000000000000000000000000000064f4e282ec5cac74e1a12f678391730663c83afcc0b415fd21475875762de2224e389d607cba84788a16d622d2ef5c13e5da5568a9427e0cbd7973a34c147ac2f3577d06f68280caecf8588ebf1591a000000000000000000000000000000000dae339b418871e2f31ed380824412acbe44e6c73ede9b4c52c054924297aaee1f7da749374d7ca44b138acb85dc182f00000000000000000000000000000000155cfb670ac94e7d5a095d2797cbbb5b8ad3e037fd246246f8e8c2278f5d4e53a773e6518ebc3ea5aeec6383d6fbb62c145b5f1f156f3c823cc129568e7602694107608c1f9545edaa897df58d27b18f000000000000000000000000000000000c1f7aeb05294c1b496de11f743c0c7aa4255211e1e36389bc93dc8d0e73fdb9af7bfbcef2c196a95d1d449b9983b2020000000000000000000000000000000011251668e9edb38ad147f22cbab7d280d436d11039d9fb823a19dffedf2c6a484f112560623cde7e5525c85b4f5d06accf6760be82cefac2843265be5fc0fd6d308c1ed06fc684c4693de25372f09ed0000000000000000000000000000000000ad488f5b9934adcdc834558c8db1d62574e1ffcd03da30eed865042abae4dc03d69010e7e591d9f0a8e421d22cab23a0000000000000000000000000000000002cb0a8e0713dd3c4833af74767ce46aca6c1efdfe75d09a50fce4df2eee3fbc031357691e23ceee810d30004d03f6b9d9fca4d166149ac9e6159ce95a06f790a96243662373637f0c6a59764b77b45e000000000000000000000000000000000465d95750a3c688f560ab9ca6fd1f77457592a0d5f54c17904a222010444d048df2be3dd402f046b1375d75de446d2500000000000000000000000000000000166289d948aa518167e72591a011b3f5ce209bd32ce091543bbdee1e8776269347ed711e1e9f1193f818e3045761a75141733039312347a0c9d760c1bb9a1209a34a02b359a9c52a57eddced157586700000000000000000000000000000000012abc4f1c56f9ac3760acec3d79b77e9ac71bbfe4d2a90cf43da3607c99035e550a4d0fda734bcfcb16ad08f773535d400000000000000000000000000000000030953a6099532f7ac352eff43569914c3f8d736b8aca89f778b4a67c754ada78e121dff664feb751532a41c8081380eb21b18d883ef62084ce4bd353d7434d7e220e9cf6bd0e8d0bed1ad0a4ad94c7e000000000000000000000000000000000138cb559d92b392e94cdd8666605cb5b05e585dccfc023bb6f1abe82fad35c108fca7a41afa49a801700dd8ef89eb3b0000000000000000000000000000000018cf89ad3e05492ac8699ba0723d5ce43e81b0166fc33653c967da921faef37f3ee2e8e3f71f983774966ca183e05f9eeafb6aa11296facbc13936bd2ba09a2cf9bbd9dab6ec8cc5f73d78c90b471a3000000000000000000000000000000000129c48a05e3d6bfab6e6f5200fbb90fbb743b045509b129e3622929712939c5d15126a09f1a650489c8afde7ace8baea000000000000000000000000000000000abff3803d605dbd63bb8453e304335a943bebd224d2d8067d76f5591cc6a2b954b9156a243b0c23d08424fb9edb52383d39a61323c07f9f4656a6c5e6ba139da8175ebfb8a641de50cfa2290884662900000000000000000000000000000000194e6f217b863339824d95c77253ddef4ab97d9744d10392d399b1f165170bb8c13ef1b7cbd995c1c1dc2a9d1b87f0da0000000000000000000000000000000019fbdffa8df167a5e891d09aa1e79049d377014e58523c0eb453f5f072a468809dca8ce0aa22b45bad4f8853d985be1df6374d0849a4471eca96c5e715b10505c4c49664f341d04705fc688c8479cda40000000000000000000000000000000006f0b72c2a934e430e4b773a61317007f1ef02c5f978b3565d623b6590b6cfec22f98b49f9d7f7efcc6913c139fb27a60000000000000000000000000000000018ea7df5f807d4c4981a9159d73d83ea84359d6aa00a5ef019b0dc307d096676c0d16c6b167fc55e14329a858c044c5c0b7cb52b99abe10d1367f8d3def38221c18657a1114ceaa1c0673ab13a6e108700000000000000000000000000000000130fae66f6b4e1a9b0b39906fac847f1285a7d37bdb0d3ddc2c2bfcc6320ccbad2ef1f119f2663e3a45dbff005a469a10000000000000000000000000000000019ba2ae0c371256e4c3dd6f9ae2568386d3a8bd90a57ff982294eae9194494add18958dd516ca9dda6a0b334391cc211f49b1fa80a321d4d100069b2c4b94cbda255d8e9f1a7f14ddf4762b76e4a386f000000000000000000000000000000001152651000a16809ec599f2fe9f330b0782685f6302254450884f0ee61ee2dc2cc9211f69d5d9dbcd7fe3345542a0159000000000000000000000000000000000b5c017e7ef71eb089188ed85331815b40c37abb6ff73d76f40fd8dcc6d2120c6a52df0da042b2b63dfd0da7db2bbca9ad3625b0839cc1ab8c9798b2e9706ba6d7aa623f3c0ce0985bccb2ee5c05a3130000000000000000000000000000000003a6f178d8c63765b2c8df834ebf7e96a4f451c6e05692f96b71c8be2a6e9af17a5cfd8b263eaa254592ea9a898488bf00000000000000000000000000000000185537df1a10c4c12fbcff08de45b349a90b0cc8cd17827df87abe160e84b661d58a1fd03c669015b991225ba08e171e150e53fb45ba8ce5ca917010f26451220be51141fe21cfc1cc06a5557e8e7afc00000000000000000000000000000000085475c2fd70cb7caaaa7c5c1fb17e2346903a962fa68536240d041f2f8cd3a7b83aa79a77f713bc31f7becd347d18d7000000000000000000000000000000000c98414bc318b350113186db9e965a238f1f181b00a2265638d914d263e4a71ff643907ed8dca814e5b8d5713baa8dc9d69ec73df67feb970f1c7a3880ee84d948eab4d8672a6c1481d61efc6cd7100200000000000000000000000000000000001064b94e868fa82c892dd244c6247063a276cc651e22d09695ac6e73d20bb801a189e8fcef8a711ed471fa3b2c7d19000000000000000000000000000000001561503962d7314fe41f7b2d34eadcc985fa748cc98479a06749692a00a46fb2fe5b5a68f7001a0f89f20f7f42f4463c38f8acba4782dfbc02a14d4b1d7b2b0a582f9bd75642169707a475b1a7d2d7e0", + "Expected": "0000000000000000000000000000000003e62892118f11065ebc66c58c86e2f0d3c79541aca8db33bd0e12f034f0e106a76f0aecd537539cf2d793cf823ebbbe000000000000000000000000000000000067e42ecf23e1b0590c30106b0720c806ca71fca0601b499025b58f137ff22aabdc6cc5eeef232fc9a20fb9c2bdee16", + "Name": "matter_g1_multiexp_57", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000184a661b34e18b637bca53ba60c891da69fe743d5336d92e811649094c15ecf2445736d0c1577bba4eb729aa7204b44f00000000000000000000000000000000129a348f7fa726585badc23f5dabf49ae095d300056b219bce0ce15f1f6a9fc5c8ebaae56362c3501af3f3de19515143cacfb05e5d10c41b06a487e9f8afa38759eeb55f0a5bc8640164bbb081c1fd2a000000000000000000000000000000000badd515b1e0959e77e0f00c7420b46bda5fcb6db59cbd431a1b0ca68c291c6dfe89ece299434f83a980613fe73ab7d3000000000000000000000000000000001266343ad330fcb2cc8242e30a8085cf6995ebd810780115ef881516d4227c6051564d7343e4a5d6bfd210e2e40b91069a0b88d946231cc484550a87a548719f0a543c0698411f230a966cf602dc4de300000000000000000000000000000000085e7c22d51db0a45d8db7d5365de9541eb87b81c237fc47cd25c297da4435b4c9b8212c76c929b7c8f32e8d9b11374c000000000000000000000000000000000a4b0f905b48145f1831e453d0372b7861f7be6e413182153cf77d737450a58f378652255cb4516a482d166233dc88c574e3b5ff944bbbbf808f1f469a3380ee7dc37ebecdd8fcdbbd2f2561e0dcd68e00000000000000000000000000000000086b97f87625356425a79db717f940debc7a7e932370ea315d1f94b1ead853e3ab6edea6302b6b5b0eb4e4bb3c7fd14e000000000000000000000000000000000fde70203ac7a82901250e9798ef1c671f8d5f878fa3bc83556437b9b98e77f7fe7d3a0f31b8cf05ff6332df0424136fc23064970a4ae4ae648a79edb193d98208418d3489e9b5b8517ebe99cc32b4d7000000000000000000000000000000000e629b2d9a57bf96cdc6871ee7dd7675257cf62dd10028201448d8e5b1c0abe777190a868fee83ff5d067252312e82dc0000000000000000000000000000000002102d461c9522542acc185349ea93810c3e2412ebb427f8556b947efe198d616fe00818bedc22765f697507d7678dad972fb60ccab83b6ce042c09ead82fea3d2cb891e21ddc5af7b5d8e334d5a32640000000000000000000000000000000015727f52d46099c0ba041be660ca312204afb0f927fdcf0f1afa4cd3448cf3e9fb76bce7ce0da8b4c0048f76f0e7b1410000000000000000000000000000000009dc4e213faf0a8216061b59dd35a135b364431e2be37e42d065a42fc8e42eb8669d32a5f5ecdfd9234487479543471bdb68c389b94c82f006fdc637696d8085b24897177d2992f504d4bcf5ff04d173000000000000000000000000000000000afb691289f877e1de6fbeb38cee0e36fabf3daf904256d5d6db6e96ce555a9304219bad41400ab6278727e5fe2faffa00000000000000000000000000000000165a54d6db7332b12224d59d8b677517190744c039d9bb401c2e3c4437dbf230b67308fa2d5ae2bf5de282c9ae38a3fa4510c100005f2306f4b474d3843b4a79d04f0171afc5c66df70f631b0481dd3300000000000000000000000000000000032dbd300fa383541e5c40c849addae3def5a4f5392c44b9e96981dbcedd02252f9bfe4100de9954ab34fae9b2ec21ce00000000000000000000000000000000185e62adc2a44462019c86028c617ddf59a6b1c16071624de5ca755f936e73c47cba00f552d2d79baf60a1796dee009edc682a2be4d67852d119795988c52230d8273648cc176ddc012a4b4da5a8636b0000000000000000000000000000000008a574ccaa24ef76112a25b990b5d3b462ff9c43589c9efbb617b45a87bc26eca6dfc6c9e58a12650c202a06d3c86fe60000000000000000000000000000000011f41e39dc0f0bdde1b9e1879741824b20d9237dd7b462272115e8ed44a1e6b7bf82e8ae481204dd8662418fadc63bbf8af6b200fc8e6a57a954226d9a0254c8bcbbc55fd6c3db5cf8532323d4c50b4b000000000000000000000000000000000efa7f183cdfcb25cc5516bdb45c409581b6f2a5bd8ce8092dbf9050a20b2ff57c6add39e96a6f1c8d2134a5a37778c7000000000000000000000000000000000a8213977e8512648b6aeafff2cefcd17a14a052791d20236a78e0b462dcac81db74f1625e787540d7dc279846983f647e2036f73e8cd5e42ad86914e192dd969465aed0c3b752986b84a0c2444c90b8000000000000000000000000000000000287e0add9dcf33f37a10a5ee89cef5240313af0bf0dc183d0c3d6b919c88b979c932c7f141ec5faf012a7f33fe56fa4000000000000000000000000000000001313f591d1da8f6baff044857d2c04f01935b493f5b951cd3538054756d33a52f71be92ef908f016c133aafeb9b9ad2470cd5c1545e76027c389645da1089fa88f675b5b6ef9217b584d7202b797f85200000000000000000000000000000000192d02ab0a323e85e9fa6f553eaafe0d8ca2de63f0fec8139e24805f0785cc85b39908756ab4eb39354ecd8d9440d5260000000000000000000000000000000013997cf706bc8d40b019c2dacf6a7d269e0ffdf8bbc1b4b39e75b48ca5e5e6eba0007b8c55b59530b34b7ebb4c657c57244041bcfc21ede8023ad80b6d4af4b2777c0204ca5f61854e6da34ff5e1145f000000000000000000000000000000000a61b3cc7913e45c132cfb06a26fdb1882bd700b32361572fc79a3d2c432644392f341cc70905b86cad2ce52c30e2ace0000000000000000000000000000000011bb3d958600993ec04d9f98ea3f29df0dacbfe6557b36bed865c564595a64132e4036b6240c97cdb38a60533d5a08baad7572da641373708bef008057aa5af1cc76ccb882bacc50a77b37d7047b1bf30000000000000000000000000000000003d2bc11fa699b284b37d1b45c8dd6b41436a7b2fa09cef316821516801afaa4e1282d717d4eb3d46e54c0208548dd9100000000000000000000000000000000123f8cdf2bcd7d6eab31975ddd610afa79c3c95fed2a6348fa6872b74a6e2816509c71f11d1f272dddb59bafc0f48fc454b51c78093cafcb57c4c1f172d08257c379a9caeb5b5478cacb4887119a08c6000000000000000000000000000000000982c1cbcc39867c7c8c4512392af1489a5e6aa01ecf56abf4cd9050a33536feeb1866421958b929096d2c3f6923891700000000000000000000000000000000104ba4defb74b35d15db80df1f4029650f00b306d702b5934c1705d226886d4bd22b6c88e71b862109f8dceacde3c6d2ae3bbf55186a89740af4da6c073d8c0e331542a2c972a49dd3bf65261dda6e490000000000000000000000000000000006e5fc17bdc786eef8cf2140bd8002ea859619d319126fcc5053be9c28526e14e0bc8eb924fa242305069226d766f71c0000000000000000000000000000000017ee60b0dc932806dfefdff2cdf00efc4d5c81a1e84ce48a25db1d49ca26232d4e4cc1f37b34c80375597587dc183b4259b43915b15c509ab8930979312dea2ec9cfa9f679b004ee526aa5dbb25759a4", + "Expected": "000000000000000000000000000000000c3dbdef90052dd5bdb70f15963091c8fccb5b8720a16140ec96dda18eb6cf003b6f5f7c244d25cf6da34f2a1703a9d800000000000000000000000000000000187456c5af42c3de3d5e08936e8a3f411fd6458d017ec508e48f2b634319155428733634e22883492d7612b2bc38158c", + "Name": "matter_g1_multiexp_58", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000005a912b6b2b00c2b2c90ab1aef8c9240831ea9ff2ac3a92753054f159f5ee4eadab8ef57eb5972e3169ff9649b886daa000000000000000000000000000000000981b901734dfb3b5f63bcff802536492664ac13dc695960ad89342ea865ac67d00da7130833126a33573d55a9baf128a53d5989b63ee5f157cc44c684ccc7cb4c74338b12fbfb534ea33db341fa6b46000000000000000000000000000000000b052881b3e27d232ec980dd99bd0ece4e861cecff2496472caffd741f2954718d605de98d9c27dd3ff473ff12b238400000000000000000000000000000000004de4bb9e5a4cef93662cee72259b88f7ccf8a495b733e868d76cc25e04c53a65a83c853c98a25f7a551641d54ecd9534d840680013af06920dd06bacc0ce95cf0cf79e8ccc0b10027f2d28c1d0049980000000000000000000000000000000016e4d257db25c08a68943e6e0065b375422fc817539d2874279e2b41428da449627e6e04087fd448f651a23fb01816ba000000000000000000000000000000000e80d041b65789b3289a94848ca4b1109028c9fb314e652486e650221945ef4224ca03a693e062b06036898eb664fc211b67d661ebc9008669bb4e5cffef81a32baabd71667a72f1d202ced823f09c74000000000000000000000000000000000542fcc8d668a827daf3726bd71d7ddeabc440a6fd0c08a4730803be6e76613cc0265252c41123146a5d7aeae93f485f00000000000000000000000000000000109a61920ccf34a0a71f51f4fe7c882b3d6fe449a8c67711dda64f9eb684b4a28cce6e8bfcd6f3cb599adbd0771a132dee495199ebdebda02179432d42d5d9c76eead4d4993cd09a93d46cac997716a50000000000000000000000000000000000a65c746a1206b1250598823b9b6fe5df3dfbee21cd31000e50140893875d1ad9fcd4fe12bce0758544ad8cb4cf5ba700000000000000000000000000000000038c25d3c35fb34151428d2f6bb8a459f834902334d195da214ee9fae4bc6099d225588a001f8fddacadeff0d3d215463e038e473d6f965751ebc5f69eea6f37be88cf001de0c4e4b700823d8326f17500000000000000000000000000000000158f2288a667f475c736dce9e404ed37b18d677f984b6d9dafb051b87901e6fc60289161bfcfa46a3fdbea7b4cc3f795000000000000000000000000000000000d7faf96c636ee38347b0046d333e72d601e20b018d554d50ed63e30c62db7fa20e29b3ea57b1f31e0d7544ad711c96aab2af2590309c9b9177e4f6f0fa06339fa720cf1c9fc7c001785d7145a3c9030000000000000000000000000000000001933815ab2d8b6cef8790f87dd9750bc2b7a75a9d6c425a3e84cd109f5f5ea866e171dfc212f6f8641252e9421fe3aaa000000000000000000000000000000000f8ba799ca5dd885046a4ffce1d26688d0bc6936f3a5a943dd54f89d991500908c81ec4f9b116e73f74d46b67731421bc9551f12084ad7d4ce346f841fef785d644821b5c2d3c8db3145fc26e65666bc000000000000000000000000000000000d4ba404254175cdf5c47c08ec158ad83b6ff5b8dd32b8cb9753fa157726271f343cc0cf5231e7e31583877d2591930000000000000000000000000000000000191f45fc4b8c94519d13ab28e5f84e22dae2f82550b44be737728a695865973ff5060a639e3f03904d74717963dcd764ef5823541696ecb88d0c71e00a15282c40d4826220a202be09c47fd6891b93ba0000000000000000000000000000000014d348b7dbace24bfcb258c853b19fcc1637d7ed9b0ec00d4124cdf6d608c6849e8d2f9858afa83ff356380afa1376fe0000000000000000000000000000000008c509beae3cc22f0da64bccd2e0387c05d7613460942d25182605b3eae6ce052540142d5975733cb6554e6da9f473b6e32d695dd02323d40ac1eb9452cc53376ef941237563b1ee380c9824a565008d000000000000000000000000000000000ef9aac66681015bdd9bf287caff9aee89225e30a7976e9f503a1712fa863c8d6d46a80952a1d94d96a5e0496f64ce5b0000000000000000000000000000000016c66018f43bf585195b256ca106f47077f977701d97f42564223817ade0a520aa3d7f06d868f1e91705232b1d2440d9f5e23ff8acf88d18e53bb31476f10fef288e20e818431f9f0d2ffe1265e8ea8200000000000000000000000000000000042d1d00a946085dc6329e852342573db7dda7385e6a50a2660a924ed6202968e787559fc58a162a775bcb115bf1fcf800000000000000000000000000000000162b52027b08b7d91fe0814c7be69414121cfd452f4d0407a2300bdfe9ba81a4561af74d8067e929b71a92947eac4fce71927817449ba5f053d0ed1e567b53b1179c6b62a554c8be6764d7ce203f74e4000000000000000000000000000000001598949030cc21d76a9c69305f023bad3cc761d5f857bbccec4de6b0f7557395efb2d126382731aca994a5020039acf5000000000000000000000000000000000dbea8852edc6bef41dd317e7d70eb2a5416d5087ec5207af3f5b3fec39a416dd9ccf4cfb5400cca152f173e66df05f75ce5d6f0e44a20d0a0e2f1cc523455b001dbeef772d84b2599daec66b285027f00000000000000000000000000000000081e898b02838558c1c9d7ef9f86fefe512e2e7364ad824506c886b4cbe947657c5480353e4f72e237da013d81e5eeb10000000000000000000000000000000005353bf2dafb1b9b4f2cf58e16645aa3fb759eef6eb8f516db068d2768851e7724fda5cb85241aee62b4404de2862dfbd37f7bca1a59f65982294755ddf8af7f1c953b6e482fee854e0d89e9b269e0e900000000000000000000000000000000028453aa48ad0302804f9cac568467668b1dc0dce2cbbaf280810ead2c0a94e156420f4fd2566ee7f629e57c3741b8960000000000000000000000000000000001cfc5ed80924f7088ce6a5414372d13fd8f6eb3dd83c66d8b8e4dd1d4db2bbbbbc6ffac00e3a880d8a8fb5dc07fb23f06d0535e3728b9e358d9ea82df4f1137db7a02f79c0cd0dd672e24092bf7f6b4000000000000000000000000000000000a236833fafc3da813b95f4562804361aaabcd8166780a4646734e4b65e3a1924c075d402404b52adda4902bac7a2cbe000000000000000000000000000000000def6beaad6a180998c4c70f9a8dd0d948a79524b31fa44874908058e9e58caec2e23d5a0787f1ca05a359ca276c840ff56d6810620e8da932c202628c2fa9f0a9f3fda3aa07c262924aa51685d2c9af00000000000000000000000000000000188bb3e69bdf0a5f31ad16751a12c767c86df80f53f6688ad74cb2fb32b81bbf9d60be1182ea1b6c0d6fd12ef73e253e00000000000000000000000000000000139ce5ffa569548f1bb877c3d573136a8eb12e7c69cd21a70526f8724bc67e0b37cf7149dac3f78377ae7d5bf4882a6771e7f672ad398f5c02c989b475d12ce86e6e242d36784308e56178f2a6a1517c", + "Expected": "0000000000000000000000000000000006e5af407ada013abf1451bc9d5c08e5ba9cddebff0cb77175b152fc19bbdc48e1498673ae4698dc74d039a671ecdcd9000000000000000000000000000000000c8783b3ce25445209b9f1d8bd3ba539c01d230c07c4fdff38ec902467d5f7e9e8e660d8997939684e119fdfcc963836", + "Name": "matter_g1_multiexp_59", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001731f73d2ef1f87fe1752c9d6428de241ba71506c76f31aa9697d1c436af51de363405f60110e8e69ab268280c20f92d0000000000000000000000000000000001ec6ede05f60685e39acc7e105f60602f0fa3c4a6da7342da755eb34aeaa5adbbac4c13197a2c93314ec79f5da8b90177f9a79850b2fd5a281b22f52de085f12bd34e56808496e1c1388804f534d2da00000000000000000000000000000000158d295d41540fb1a27d8200ddf51fbb9d31a70fcb639c42b7fafae4a95b90ab1ca777125092aefe20f856e3291e528d0000000000000000000000000000000019670ff04a77cfd367c5f0c14218b5d95ea2eae8577da10f27d96e58039b7dd7e9f7f75c32f99dae0920509733ff9c96630c1fdad9338fa5236f817bada168a737dd3685b327fb59d8a37329920af4cb00000000000000000000000000000000052f8e8098f9e83eaaec1c2638aad30b043c2359f2551a02b2b95816e1c55d37bbfa6e284f280f15dc174d5f03a7698400000000000000000000000000000000034bc698f07544952274c21f416d8f1281ccdcf6bf53ad352afb15a3412879a10b37e6b8b9fc5f46ad715f9ce7b46e3d0969599bed4899c3c47e1d4081027203c73233536cc6e45aaa78a4f1150a5162000000000000000000000000000000000c2e014d5068adce3049cc326d36ef92f294700ab64bfe170260727117f098727cef2e28dc10fe473a46c98867c618400000000000000000000000000000000005b3ea9c12179a47f7e69690f3303ccae614e06878189b40264f02e9bb26284dde846d704121340723bfd1fe5696410dddd438de35651328de7183dd38820ea2983488ba31d401094e59cacfcd1d031900000000000000000000000000000000119e9fe8723883d9ae8c61efdd3ae961795d79409750dd39aa6f0f8727ca2429856f977697c4f81894061da278a0f9a9000000000000000000000000000000001438a4dca0c786062aa9cb21e26b87e92f90dcc0bfa014f654b1734cf7cdb8a2e62fd3836a802a9917539dd068c6b4b1191f2b2cc76d848e456d07c84c0826a8861981dc84bdc671bc9b5882d387a41a00000000000000000000000000000000012872f4dca3a9f3fcb07d67c76836c23eba3f7957bb77950a4b43ad9c7ee54f53187a742b13e026f8234df9e91659c400000000000000000000000000000000078b9d597bd9b5ed2f7e0d5f8e4a518012591b855c5352fa1450704a33c3cbd5695a0f8da235411aa99aada88086f643aa76094782d0c06f2080d699b81aa04a60891046e0053d2fa757c7029df8f8480000000000000000000000000000000006c414c6611e00c6e98b370bacf2ffbd7ebeae890278a0e951d6aff7dd3e5fb90f82b4e65dd007a3289f97a9600786a9000000000000000000000000000000000cae4750f99ba13f03d3e0769cccc879a4832210d6a2f25b2696099c0cb184398b7d432e801d23200166a4c53a3e70f3049a751a406657dacceb3721461417571a0104e11c1e00805becf71ee77eadf100000000000000000000000000000000122f404ddd6b34938d8e57d9d6ee78c3fdc1b771dd7392944ae88c625f81df63915a87ac63dbb69adf8fdf856a92bffd00000000000000000000000000000000197c20bf1392d4d68efc6ac3bd5d8b53b360e305a501dcfc2e350e3738503ebd44a574e478757240236762db2f23d4310502d56084d1be7179fb735e233978a5a3c2756d780cc0ea6a8aa92b1d1f7c4f0000000000000000000000000000000019195a36dfc449c19b172ec061b4825e4de85fd5b9c633c953ba7a5617973e61abd0de3d59d441f49264a0dd2e781b20000000000000000000000000000000001430f743ee98a2b2f37d9ecf2a7d4dd4963707fd4cd6ccfdff55c3eb189aba2fb295877bc2d3db9032af26eff6485e459787a6720b8db1b4f0e1d535833ed20b519a0e4d2e9fef75022aafef52371375000000000000000000000000000000000be5d90e5fa172a2034667160f635ffc190fa495aa9af51b648125c29bcf9b4b31fea7a7e4b49d91b4a8d081c9aa2d3d000000000000000000000000000000001721ebb02265f698528ae1bdc5bd4500d7612bcab9ea939f552ffd8e9dec1d267dfd25ad4d3531676e2ecde3d2170c4810b47b662e8cc8dd005bdc81dc6d98d0eb98f86b46c0c8f24481af9120e84a820000000000000000000000000000000012b7607bd9f1701ed002b6f72b2e832dad7c9b2bb6eb6368fbe78c48bdfa17b2546574d7876425cca7986fa6839b6da2000000000000000000000000000000001975f41ed7cf252a658e80634872ac495e4b518349487930610906bd396f7fe4af3c97acd0ed3b3f265917560b13e6ef072460e3c5349c8fec9944dc99762625262e84c70f10d0a92077a351335127470000000000000000000000000000000014ddf2cedfda66e12e999d0b280883c546e00dddc0bd17817d6df90b7a614c472cb2840b133eabdc7be39b63e50cd9ae000000000000000000000000000000000b86e0559e27a6061aafc091f93b744a8273032f0e8b1c8b7071baf3ac7008a8173b71f51b27efccba27cb018b25257ff3177c4d865caebf1ef6565bc85e0b0bd51365a6f321e26b97cce887bc3f44d60000000000000000000000000000000010f691744e7094b801c180810b24f6a29c21a13514bcaa6303ae49067bdd001213f13c6f980c51b050a684b525c2dabe000000000000000000000000000000000e4e4cc3769cd3e0e458ded43b5c7c481c17efd3283972919212b877c21aa7abd31cf86ee2bdfd3cf0ef6d730c0907db393654ef7ad8687c8878c55a8240ae9df04805d3e2f194e960d5e498ae3ca177000000000000000000000000000000000b5e86c2be33255bf6f2f2aa8b17109467543168c0bb92a9ce19bb64c5f84188b2e9f93ac85d948c76989d9d4dc9eafc000000000000000000000000000000000c5244fe670dcb16d7994b7db8f933ff98744e5c6dc124e057c05d2697881115a99f983be480e30ae3e0ce75081b261edb9f942124a381b150f00a59e4579d0a2b7b728f62715633288fd03d01dd12dd000000000000000000000000000000000df7f56643536b20f65cae1ce4c67c6bb6def8c9b514d6edc92673ae743a2f4e4906aaf7e3b048f88f08a4f5c9f85c8000000000000000000000000000000000176cd183f547a3f38a86d604f8e76261755f72e7222f3734a456a3bf7029590848970e8836b3570e9a4f3500e54fa3008e6eb65778a328cf899f66581ac7a4a89e0e824c15573bc68c02cdaad89cdf240000000000000000000000000000000003737e58505d0f4c6890c7e03d5f252aa682c110f5bf5dfe8bcee9393104393f4a6a22c34c773e1dcb78881a31b33a71000000000000000000000000000000001988ab3430de7a463dcc2156db572c43b68e58ac2ee26f1ee1bf8e9889f6cd3250e5d7f9464a8eabb127306af39c13140940e3620c59504062e4e98b5d4c8cbccdb017c47a094d06253743c29465731c", + "Expected": "000000000000000000000000000000000d541103aa046ef53761e929d50c88796b90b3284668a2a75ecd461ade103f086fc443a3681b6440e6b8a8b9558870f20000000000000000000000000000000014120e26b160a37f8e18faf541bb863ebb425fbd0eb072268a12657b6e5ff62d4c0e504691b3d09b710741820f747b85", + "Name": "matter_g1_multiexp_60", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000015c91ab58aad72af3364a3d05e2893c756a273b2c731ef421c0552dffcb32fdc4296bb79afcae2d3c8aec6e0dcd27c17000000000000000000000000000000001901b4fec7a1324a34fe403dcc51656145fcbeb4eac94f955f4fcc5ad6a016eaa436878e85dcebd8992e1a177c5bdbf80f2f697ef6783390724e04b81d0e18dde6533eea9f72c1e10bc72c7b954659660000000000000000000000000000000016df7578f74b1ccdfd537a074d71f2dbdd581f1a2f78875a7d4e1c3cb772aad0d02bf4935f7b08aa5163e82e5a747bdb00000000000000000000000000000000053931dd0624377808705d3fc6e12c4894414c8f6a5662ffd71251bc7725e6d23b7781286b8be1e35eb615bb1efeee9c34680b934e67bd7518f0d6a3a809dc7faf845eb71d0247291d61053d5cbe0ba200000000000000000000000000000000056f0c5d78c5d4e97fcc7d6c3132dc4cd802eaa1bf18921d039274104b56e8a701c25de6ad33e57997b2e8491d7cedee000000000000000000000000000000000c87632eb73c464f53c15ec127cc5c72fe6a413e74313e80395b55e122108e2984eee6f53742ce4445f455108002398fefc024dbceb522c02b88810ada9a814bfd085fb63d570663a64bc0658e5ad02200000000000000000000000000000000040f1ed7a9f7c70a546088822088c476f8954681f3741cffb7e6614dcefe2963253599acbd263b988af3764331a273030000000000000000000000000000000007f9d150a4b34b9a6f872f9bbec4d2e0795d02c5411d6b3a844ab95ea87f9330662c8b0789e12a8f6dafa2f7cf2f13a12c136f00c97a515076f6a0b63faf7e378f2cf04f8a90ac942fd70e25e683cbe70000000000000000000000000000000002890e211b1969c72a15c0f24b21dbf672b2cd33ba9ab79790c07f0734709bf13bbef4f54bf17db9629cd7abfcf1fc2f000000000000000000000000000000000010f13eb17ab7ccaa0bf32b8d4d38760b72fa0fbbabe04017d9d8283f6dcc5500a336339400bdfca06749f7c1e08f748b033f2270ad2416d03dedd4bafb78ddc598810768fafd349a42438923ddfc93000000000000000000000000000000000f7e328026c07b116dcb8950273579e0c4af027bd3aa442a41d279b1b7d87d672154d2513669428e8f401db490404e6d0000000000000000000000000000000004208901e02756c5a2430200d562c0ddec0224446b3fca62cc98e9efcfb3508f50794301b026d47eb99aee210dd2f898202d0d506bbcd56c92bfc6fbab36bc96716de1af02aa166e7db2e2a0a4c19cd7000000000000000000000000000000001309e8c1cd6ca596ab2c9605ed0e356cfb97c4079518b0241d40a3e0e4769a8e58c0ec6a7bda173fc427aaedaa275ff7000000000000000000000000000000000143b1d1bb451cd56d800d71a747173e56b75cbd6fd28ff4abacbc1dd87653abcae715882af29c29a1631850694c5aff8329762dde1c4c91043a740a8b9639e83e809f749fc8c4853966cb2ea520620a0000000000000000000000000000000013bf8880a6c95a8791b8ec37c2188e4c0c2cf188e2fba01a9e7e4b81116b10da49415a0588385156e4bbd45b168467e3000000000000000000000000000000000be052be3f3278259b6e01d9d81afb4d4215b0b738378e56719403e2ed31bb6e15e47c9986aac19f79001a76f35e4162ea46572fdb37fe282203172c147715bf0a16e02a62bc79f33cbfe36703c95a730000000000000000000000000000000013b27128d2e8bde36f11503986c226a1613ba0779de9b25686284d12bd995c83e0db9eb0b2ea759ee81bce0ed2c0c2ad00000000000000000000000000000000128d6ea67c8cc9ce6eb93111780989b4b33afff45a5075691026ebcc607e61b7a48e2549ce8286cfe4a72b182073f373b9e49472b9b74cefe5a951febe595b0020c43fd54150445fcdc4292c5ffe65f600000000000000000000000000000000137033427de6a6d23e0a2fc17d396114f8f4ca3e56e42936c96029c5b829b3b8b7ea46fa47fa39f6e5dbcd804873d3ab000000000000000000000000000000001986563cad41be453d14ea3f166c2ef2d89ada32a345554ea7c7141f6b1306af815579d7399c73039d1696fb62edcf80b6bfa1ec877010aeab030b96e80d2e27b45a93c6a99e2aeb3ccef22527c6e472000000000000000000000000000000000f0878d6eda3d119eafa0e5cd0260cd5c9bed5fd3251f0eda5a6aab6b475ad8982b55a0c8c07b6921de77c4e23478f2f00000000000000000000000000000000181d4cc9e77cc1e21145457948923cee50db145dde59520e6ddc2da13c3380188856c220cbace98f7ac4bcd7dcbfb1812810705458845232e851b33fdbcaab01966b8ed53b455873a966c1d6b8936389000000000000000000000000000000001267b7c2a91132c46ec835a5c2ea1f1c1021449d4ab3c14355777f1b7771787ca8b72b61563dc7587db6318c2661551f000000000000000000000000000000000d9f7257977b3f207e889678b72b584b84bf736bc23081d1267145a886e2dd6b669bcfd8b58414def71c27cae868f39a175fa4954e56dabfd1808f93d2686e0b4fd285bcb78b80d15e10e63ea8c7b6460000000000000000000000000000000017c223749282ef77696136edd0b30041b7743e40c2cadf8b491c2dee0730554e39ecdce41e45d647340e73bfe77407d900000000000000000000000000000000025924e40885fe566166bd4c5de6e5bdb3ab993c154ce908afeded5614cbb0c00e6ddd648263f17ebb3d81bd6a4f79afe7dda7e5373d0e0afc3da1507416f47ea8b467a5b6c2fbde484aec8777ab7559000000000000000000000000000000000730c41758d12795c7e5540e4204e43c75a01dc6263833f8db435117429ddff6cf4fbffd6cc27f553b8524710aee9ab000000000000000000000000000000000154c3ac230c725594a3c985b7ad71d98c172de8764926e74f6932f5a5d40543b5060c5d604877e3a8df093927b0b171c6aa731f9393d2bb32adf04f19884dd1a5e7aa36e46408b847222a153da95aea50000000000000000000000000000000005c6852bd3eb4db383e9aa8c74f4c158888ada1c9ba07ab8c7b4abe9c05bca51f0065a29a814892303a42a6f2736043800000000000000000000000000000000086d733e758dd4f0f911df6cae3d678dee3500a53d8a364986d88c50576ca6bdcd10fd31f3cebc7a35f43de1d90ee4bc985f367919b0f3c667b1c1cacedeb0be1f9cb175c899992ef55f14e9b7aa6ad10000000000000000000000000000000008445e5c464c4e10fb0a10c97023c5a9b169d042971597eff4380821e44430e3790683c7c66afb89921f06199c72c87f0000000000000000000000000000000017e55467ed664833131b82a2875e22fc5b29a3808639e90741b731d4efc0420b4934fc75ebc2048e8196be55a600f9bca3041cc52c6f1bf62dee4c61b1c5e35b72ebff7e8e89b05353388b551eb10010", + "Expected": "0000000000000000000000000000000004f03dd7334a0dfbc7cd3b74a8e06ccf23fad0802e44c95712e920a2b227f09ac3d62429f40bef8241abe41575cc541c000000000000000000000000000000001092b20e8618beabaee18b4752a5b320307d22fea2125b3d23c6ad178f0cf2af7a1a1c0af3cfc669929087235e2f8960", + "Name": "matter_g1_multiexp_61", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000121d2cecb2c9892d69e6a15561688edb5020dc39fba96eac835c0577ef017191572f8bba780a608c41d53544d24a306100000000000000000000000000000000080c59704a5ef9251654458bebe25d949bd5c7793c438a50019a9a7cf26036f014fa3f024edb767d233dc09710d53daa709a2e80dd96eb12edc481e3d58893bd0d789a499d5289072d58c2ea80b036cb000000000000000000000000000000000012be549d6b4efbe6e8c17393390f3cf190abe4621a16e951203747dc7faf6d6ac831582fefaff20c952502fe43e2020000000000000000000000000000000003112e26ed614405376dc1af80b9f1984439c0b67863f5cee6d3c44f74f320e66574aa1501376cf8f924efd83655a72b9ff35bc510c86a9e72c3e9c6b49d2abca546f7a62330156ec09c6fe6847a400e0000000000000000000000000000000013b6249bc071ab2f9f048531e6bd27a1b8a45d34c66623268402bb37f6be2d71bb5127461221089ffead4a9f6c708f0200000000000000000000000000000000016a321e986c6301240b1e9258423bb8f38012ad533b42cb487384d9af63713d4b84c383ebd4512145b3e518e0c935b1391dd27628d0808d4a0773509737597230d7849418540e1fe4498fd70d39d16c00000000000000000000000000000000069ae7a90e9402d4f9f1b4a8a799fd5bec30002683692a700ac3a25f8f0a8ef9fa9e6f34844a6c320877f4b4883f36e7000000000000000000000000000000001214fee37b448c79b5c3097dfb65f8b181f16f0daf54861d4e5e7297db7981f2ea20622d12acfac04c066fcd23169f0294f11b10e4c45f15d811e3db4b947ee6414e262965d7b5c23a731b019e63d5130000000000000000000000000000000006e8cf07f48627571ab5fd1a6f988723465ea3f741b71b9aa9156c50e13d5481d66f7fe4006a54cb283c6d43eecb4ff9000000000000000000000000000000000ade4e4a949e6dcb45cfedf2eeb91abe406cccbbc7b4c7804b77d04fd7cbd91fd44f0053196bb344fb8ac1ffa37c83d470f7a0ee05cfc3f63d46a3151c20da53604628bac70d7b521b3be65d7b2abedf0000000000000000000000000000000006b130d66b74b99a2048127c24899ea6ccb0a53c4404f36371f30fc1ea99d02853d4555385a9fa022a552b85422daa71000000000000000000000000000000001824d4d0eebb0178947adf316258d297698ef4575d8ebc2bd300558df914fea04f0269fe67205db1e3dbbae74c0db22bbd991eb5e8ac8ad7cbf8fe64a5889b715a2409305f2366b278adcd2144d7be8c0000000000000000000000000000000012ba5b9c8a86cb99337a7c4955b1a1b459c8a1a7eb6ea908bf27d5f7e41d5f3423c1ff44b4615c689df14709c703e9ae0000000000000000000000000000000008627851a30e33fecf67dff807bfc5430a77d0a85f1e4f8b790b2b072fb7b86d5e81b934ce197fdac6aea60414a616541a9caeccc2a2058c2f5a271c09036d73320f9bcb31b7296a796ef94ca4599757000000000000000000000000000000001051ddad286eaf9c9ae5b3757c53e324acfcb6a1a7d5b490eb9479e337c9824bf619167bf8f2aa5c7f175da534e91a10000000000000000000000000000000000754b16cc6cc813c5c4d44eb4488b04abb659d89cf0dae5fd5f59f257cb396e139443a99b71079c5aa10f8f48465fc398ed4eec02c2af286ae19ad5f05642587cb9ad93196756d269c783a11f23393bd00000000000000000000000000000000035732a9fc03435f3dc3e31af693b1d1ae79110cd46d07541a35b956b928cb4a2de2a16cb8295aa8e8d0c74556b8189a000000000000000000000000000000000d4e762f40fcf43635151631fd6238ab3e1dcf578dcc84d462dbfadcdb621be918f1f0a7015377b5ff9c182494ae149c26f20eee9bd019f9e0f5c794e22e770128737198b5f5dbaf5b7d18040443a0bc0000000000000000000000000000000018f1eb31d3d4e915cd1e0cec33b4838da1401c6667d8ea25209e4c5683dce96b1d7adb4feae7fdb80144c30145d7f35c00000000000000000000000000000000050693e8b9c90d12af4ded25e05df86a3e233425e2f77c7ca9e99b0868eb8d9337186113b078f8083a4273c9411ac1dfc470a66cd3428a44a7d095ef410126257175597a333cd36ce6c9822d1ee9bb38000000000000000000000000000000000e1ca58d3eb507f977257ed8bdff474a05dee19a00818754e3a85f1cec882b8e3e0296d5c3788b101da669a716772936000000000000000000000000000000000532526ecf42eb00da76db02ab6236dc51a346f0a1271f1e9d721a40a4569d46fdb63e0211f7986b98475d81998dbf8be53fa8fb708204e619c221b8ecee14fdbcb1f94731ac2c858787ab33906c92690000000000000000000000000000000017bcd6bf54d51fa12356f3428f02ad8ca31131a77951459d32c554e2dc2487be1bb9f10450e5d1f38af3cc7de1096a9a000000000000000000000000000000000b7b5ffa4d08175916fcc542660c85063e8420987b2e16ed2ef9464adf928a4c0b8e6d5dc870b4f00de8bbec6f0dbae3abf8de43c54ed59b936e1d55032eab5c9d9e04e83e4696d969c24167b4239f6200000000000000000000000000000000151e2e32203b03a054459fe391ff4a4e962ba5e10ff93a1592043ad968c9f968a6e50b5943e50815268a4abe055a1a4a0000000000000000000000000000000004bd116c6857c2f4efa087272df160b765dfdbb842a342f9cd3e5cff006030f32e5a8b60acd8a376378096743000b2fe95f59041329b6c3e6aef01d3410836852f79cc436fcf23199e0985c56f65c4f0000000000000000000000000000000000ab6c3210ca0b70b2b3bb916f31e17b8632513b15a99c7cc61cd21181152bfc6ba6ebaf8e96a05d0d2d42a9dd3b61a53000000000000000000000000000000001308a33fccdd6cc8990c21fe7ed03bca42e3ae24bf07aebfe6878c2c8316a7a52477c929fc7c67a3a13ed811a2adda7b740e4a207ab5dd4a0621fd65697f5d30b8ee1440a5f5c5e74a0dbc6b6391c1b00000000000000000000000000000000010db7de8485e5504211088ada8924386b36b7dee37170f73469bc77212d56c3dce9802c7599c83c5cc5b18883cca5845000000000000000000000000000000000ae8d817daba71325b57f81301c17f401a6870a13506de2a443602ed44b6b0824e6cb763ef556908f9b3f30010f86394f49a3f82d25c6e0d69207e6dff010d56f0d99b28fd986c5711878dcb6665b1f50000000000000000000000000000000000fc19f1ad220ef5bd76cdd7d3ca08539a97514bb21429af5b1774d4c58a7e4ae137505fc240dd0ec01d1a9eb06a157c0000000000000000000000000000000017ce712d74d68568a945fbe2e0b21c180c58e9297f1f4dbfb0775a133832d4d8aa0688f031385190324f1e8ed65bd5378390fa1b452f887ef3afc7129ad8ceb9a8397f7625c2b249d7442566814ae0a9", + "Expected": "0000000000000000000000000000000016cd97de498b8809f4de87bcd5a66c41c231653fdec9bc1ebae0ab3b8c56258430bb13bf400f5f971a1ec558ee66ef02000000000000000000000000000000000cf57701a5038ec26e4027c3cc5a8cc298c2d86e9425ae027dacea92d4d475130487b2743c64459990e88768d8b7a4e0", + "Name": "matter_g1_multiexp_62", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000016fb67277c28b5665f1b7aaeb1bd70f679b507a6b30f956a1fdc0d522e430cb4a9c089093cfd14714f25cc9498f89b610000000000000000000000000000000018ddf06c643bd77c953a0bde77e80e77334410d76910dfb587922e6dff23e821ebbee2dd546e65591726f9743defaf9a414ca9894bc15e6bca798544138689b2471f8171a5dc48eccfa36c83af142b7d0000000000000000000000000000000011d630f01000c6e1279f330893a18b903b7246031d7d05d80d4172b08e1da182594cd42934de3d1418445a76bc9c8189000000000000000000000000000000000c3e335aba4402bd3c711569e466293c15d89f4893ba91d8690e4eaf4c7962da458471e8c7f22c417abec313c2fd223399eac8ce85a1bc70c725a2f04aea3749d75d22c0df7c0755a5e76ab4d82ef942000000000000000000000000000000000c38e3a1c95f0faa10980976f83d85954813faea27c120fc3102de51096f6c3ce89fc4155c6fc878fbd18ffb32092d7800000000000000000000000000000000178d0c64b3b7da5b6f57c69bccbf73e329b18e29e9187a7af31b9b8e480b210dd36589540d77b3041472d9612b05693a49b25140d7967b0438e49f59a6b04b75bc8745b84d7350605be548c6b4b3aeee00000000000000000000000000000000146c5b46bb4194ec04b5b63f09e8066f24e350cc62fce016b8a25ae57877614162f2733a5df8909eeed2df30374004ba000000000000000000000000000000000cbb312823ea25bdbfc4afd00cb65748401b47ab7dbd5a40905162c1ea676268745af11a2770509eb74aad45663f7f5b6e30a51d55a1ac94089d0f3217c3a2182da6b02ce70ce7dd8e2d4e938bfefa9d000000000000000000000000000000000ef489c4443175873e33111e9ebb3140ca0796f13ce8d34b30d8fcb7b9130ea0574754e800fa0ad15d71c35a3584e11e0000000000000000000000000000000018bd8ba66d5b67537a03030f5ae56c01e640021ec2524a2cb4b2005ba267e737d27916dde1e94d1f15b6d3e1d480ad82d3da3db6492ff36102747d9d663bc6e9cf8f75b1cf77044989c7af3f11d66ae700000000000000000000000000000000182acbf5e02a0b1344779f7ced01961f418fa8ce94f939025110823e5d5116d771328362498324e1067a3419062341aa00000000000000000000000000000000174d3a7754b18715722a07ecff5ee3b7f30606c3c573770c88703b6e0abd9ff4aa4bd2879c4c0512f879af95554f47316de8753f3df8be42b6d6ab578096426f852de4ff545d2e4ac12c3943b044b43800000000000000000000000000000000178c3a28f9333be85ff364329fe897660261092d9bddb36687cdbf5a7a450f27060a3aceaf45fb8acfd123116f195d8c0000000000000000000000000000000015e0a930af79ad263b115dc733560752cbc4453f111550fe3e9448b6818a75babbd0044b9b4f133bcbf16f8fb7586055a28f7ef4b12c5097a15fa6394a4dcc3ceed6cf3c6240ec2ac949bc21a9f6447f0000000000000000000000000000000007fbd9b191af6a797c68ca85df2100b898e3a4d9569c717e3d02c259eb4dff3a1ea948e56001f33a3ee1c74eb966b6260000000000000000000000000000000003b892510d5073bc3597f8f513908077814a7efda2df6051c08f7347433703496e522d70ad4093f76a3e5288044ba5dca3d0eff3368b10d00566f35391bf43c9d204a4444b7eb91017f1b2d8a762d90c0000000000000000000000000000000015d26d3ee6fc5f98584c206466d2c1a4323f597e0ad665b289e76184770e81856482c9f45ff8c891622d8de353b172e80000000000000000000000000000000017fe0582d363a30677bca1feb6d7f16be6b07d6e5d6b2a2080d07ca306d5cf733103f20403ceb486ec703277804e7971b90d76e660389e570bef756e9785e39b9748aecd7a34556bac8399aa5564d12d00000000000000000000000000000000108de390a69c6001124820072eb5d9ed9eb5b5a6199c33db1ab0239c447e009df4296f5324660e7ea1133df0c8e6a9de00000000000000000000000000000000040e7b3392a116c7289644f393bfb24d84b76d8378c042d86cb4af861af42374b709cb0ff5341e3ae9d21271c32c0a5914f18dae096e4de75de3da284a5755efe51e912e180020a20adf1f5de43cb5180000000000000000000000000000000001ed57bfdd0542efe8734b0af448c025eba4d60053b7b45baf682cd310f4c2ea07e708bccaed390c2b061c89c2855c9e000000000000000000000000000000001496190ccfc4bf428706ac344ed691fbcc7b9d6a456f2653f0da421a44653d4b1e9e967954b847a4e6014df15ef48719e32d4645ce0172000fd74f30937261de89753caa716dd03a8b3269747f2349a100000000000000000000000000000000147e5056444c7ea97a319bc71a3ee4188f68b517b92c64f556d22382389c5bab95110728cbb7d525499cc3b2d70541b1000000000000000000000000000000000f05b91c8d05b31ef6497595ecee6a6766f03a006b4c2da408f4d7b7601915cef64be69735c269007fa23e5f91fb07148c8722e3e929ba21f1ed6c51fe5ad4940fb13d63e0293893135d0da5e6e038930000000000000000000000000000000011b1b7c28754f3dc8b21dc823fe02d617374bdb9b96dbca572eaf8897f98ce9409ce8a63eafcf5308d8236bc3c18b4960000000000000000000000000000000012360ef03ee4dbf0bad68232b8454a26b666d827bebac03da314b2631a45cd365248316f72e991004d0158f89ba5811839bef6ccc893f6eed62e68f5f2a07812f2d3066b89653431e7e39e8596bc36520000000000000000000000000000000008b563f6f97fee7e2852b44d8e39ca314963b517116733924d2f57d9c4f202b47fb3fdb85fbca42ffedcee290050ef0f0000000000000000000000000000000016112f264c2b3c838b02b78822d27f6351860d10da3ccb763c1650420bf22755938cb45c7566a2df0e4aea4f0281262ac395ba8f2553e3eced8a42b221a710a5cd2a5ffe5834d3084dc260ae0f51698e000000000000000000000000000000000a8397b009cac789cfd496f4f1237e92ae570f67b4bfe7e8c80171bb9d9cb53201c2ce112473b74646a4948d7c10c338000000000000000000000000000000000092b7425031fc7c328e3be114916a06305b62ffec8e7e93a591fc5f4f9022333cc664057ff6983677cfb998defe249553ef5568a766b6c39854ba059f3130b75d7fd870bfac2b00b626e2d71c4968e1000000000000000000000000000000000df6739202d9f1f13145b697d5b78ccb84845710923a0f3bfd5a3f337e200b3ce5390aa185ddbbe8088462926a7f4b40000000000000000000000000000000000d00ec3648b2e5790ca7b05ff32c6bd3249296bd693f520f6d8385f15dbaa9f808d770f9ba28efdc4aa6bcf862c17c4abadefc3880ca8dcff10b8b763f7d15f88965c2261b72ba879e3540a90c59effa", + "Expected": "0000000000000000000000000000000002665808cfac4b9befb1f285c590d639132adf9d36a4fd460de0b3347303aa056a14780deaaa02072fbb08e1dea06b940000000000000000000000000000000001ef22acce32662085c53b2080df9354903f151089faffa43c5f6a1a306d2254fad240bb1ba3dba4927ea5640347bac4", + "Name": "matter_g1_multiexp_63", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000194b906ed067bab0e26b9ff4c0ecd909c6aa23b5cab3a90d1761840b784bd2af6e9f9ca570ba6643d4781885553f3e4b000000000000000000000000000000000e8a480cf75e20cceb6e1d9db5594d19849aee6d45bb3ca7c0311bfbff8263420e0278b7e814088abb69e73bab6368a92c1a5abbddc02f453519563d6b6e05959d8de5feb493f7c58ea5e548cfec2df60000000000000000000000000000000019ab570a48bf15ce6f007b528d7113cf423e1c04d9af9497dac47a69deaff52dc9fc4d202649fced07378b84fa1b0054000000000000000000000000000000000e3c2971aefe89a629600a243c7967ef001ee17f9ac452a8131ea44815ecb6596f4fca4f47a316f62234851dc485fc50b406eb0c097237556228f3a48b7e770c1707fd583b91b4b6b70f398b7dbb0d3c0000000000000000000000000000000001250315bb81e9ef7de73e709f18003018fc1c55f694c0e28152fdb244b07dd2d7812c3ecc4ba362fdda0707d02d697b00000000000000000000000000000000188a852c5850f471d4ed207d5782518f189cd08d63279c4cf19c76122df0e4663217f1cc8374c7a02d99bf6d59a80457ccc30cf1db4c6be6dbc5830ee37b5782c6dad215334163a9d9e4deb962186f80000000000000000000000000000000000df12b5c659c17c808d8e875a1b9c125396cdc3d8a2bd6f99def15d9fdd1fc7fcbb309333cce1b778612d6114bba63b500000000000000000000000000000000019f11577152bcb0229e168a8e97804e8e00a58fc236c8ae59c575c07d6a3c1864b7c8132f245aeec55d999d54745cab99461c0f12019b344a7f322900b64fe81e0d8a052c0ff5e977f58753b1b6edc60000000000000000000000000000000004b007a33b0ddefa5ca9379614f698dbdbbfc6bf8bedaa485dc360cc759ffa4ace304fc64071e8f228a8882d5bbdce22000000000000000000000000000000000927e9f018b8cbc2f21b72f0f19994705197d4b6ab3f03e231e51b9cb3d899fd8f8b71feadf3c9be61994936535c61e8338ef9fa825e47b46483ed8fd2df64bc7b56da8aecbae704b7eff2e7d426f27d0000000000000000000000000000000005decc41dadef7dc4ebd8911af09974686531907e41dfa16c857fc3a2451b96069d06ce1159d47e6f1c97cdd932486d4000000000000000000000000000000000151d369a147cae5d78eaf7ed99623675491f20aa2cec9700053f853551208fa21e085962342072c96d79233bacc7adc1dd6656a34f3b12e5568b9c348fbf4ecf50d65a89e63ec0936591f01e6cc7a4a000000000000000000000000000000000fd41ed8d5b7e5ca6a6feae98592217dbe676accaf6e73062d9de9eced8af59563f7f441a50ffbb591b8a987c47988f80000000000000000000000000000000001199e002504726f2ce429cdb3da304f9b54a933c1937e8dc39a3a416d068cf46f411b207d9c6862a50962516b2867ea5202f32528e795e0fbe6deb4ef6e45efc70019520b01fa1d71d5505e42faa69a0000000000000000000000000000000017cc9741662834dcee7af988d3e4de2c30d4f9e90f2b3f7ad07f756acc793c58acb2a04c2726129d0f0c959f1d3154650000000000000000000000000000000008052061afea4c307df56a72530effa73b34beea4d731b1562de1e985ef455d39b0d6c57008ec092241262dd611ec598a2b39f2b893be03ab4da77ed518ef35b2e24278d707a20b67ab4d1e5972f97220000000000000000000000000000000019adb959f4807d3bf7e0616a8a3c02e9babc94b8ee9f8898f2ddbc8fed7a5bd88e83c70c5a98afa823a0f46560e32198000000000000000000000000000000001189adca458e0ef67fc686b5a94986be37c414cffcea5b4fd44430c8d5902512d84200007a93104048160ca3f5bbb9a8892eb7c361f05e114a645caffce9437b7b43fa01dd66c1e75b30f3abd0209bcf0000000000000000000000000000000013d55a4b466ddafa04c5690628dc29deb0ae9115a4549767b2aa22b8aa02a13f1db82dc86fa3df85a6a15463fb0e7903000000000000000000000000000000001488a03340fadc9e8f7552273699870ad444ea513cc7bb91259ffa7cdd5e7377d8fb5510adc2502fb8124d7914af85d5fdafc3f57d6116163f1da9e70ea645243c5911cc4ad4a969a57c46c6b5c73acf000000000000000000000000000000000a847c98ccbccdec67192529c3da593f1d6de5d7dc0bf4452e4f09e93c2c406d6eaea30431ba95568c92938150a00a05000000000000000000000000000000001201397edaef2f9b89dba7f67b22088cb954f95b9db3d1c11bd77aa0dc94def6283af2866a64f0028fdd87b587669f31660a77b2be50eb72fd108644d913b9253209972fdec2d107213ba47357c96e9e00000000000000000000000000000000017f76412c8e679676eb464204348d591221ba17a1c90a22b2482991deee6b61edd7520ed10b0105426a15fa3282cbff000000000000000000000000000000000c65a821d170a9726e947868d861717e8cbcd2438e4d4b8ffcee38eaf033f8f3a57af68ab6314a52952a305db54ecb361ca575cca348dee9adfe68f8a78d39bb998205da2a5285c12141a77ee7af84090000000000000000000000000000000000b14fc1d34bd7d85fa96a4d12ee99a6d327347dc63608f94bd750e2096dcf11066e384ba3c68610c70dabae795e668c0000000000000000000000000000000004f3ac3e885cadfaa565b1ec15cb81e3fd4d561b2a8d92a9287bd0de893563676118d34a9ef3bb3112aa534605219feb2e1e4537f855eb478274992cba4e3f50fd9e944f6246cd52dd1517b55bd7f71f000000000000000000000000000000000979231339f20ffaa38ed21cfcef923fc9a4ff77f7d6fb4df212a530ff456a32f50a77d2e7f6d87c4a58270c006e68070000000000000000000000000000000011ff95871a91385ffeafd8a609a0c562bbeba71a110081e5db6c8035d8176067a528f4d1c6d7dad43b3bb8d090077e1357f9a729aa01c8bf0271052202a077913a9e0c87201a367845f9b271c130e95d000000000000000000000000000000000e2c7c67fd50bd2cc8ab18808a69d62bc2d3f110ef49a02259163f8fb152da6ca9cc771d1221d7719f9bc349e68594120000000000000000000000000000000008393769453eec7639d66525d6e875bbde7a4a28c434c82571468d496c4313e12414f929139c482569c003a6c0dccadf3017593cf311989ed8fedff72bb1f14f72cfe5bb7446ace5274d8ded54c1372f0000000000000000000000000000000012cfa8448935a292911ae6fc175f3049eae5e30d714b3439f55be9970ca959f218157097bf9837125bc8f772968b0d52000000000000000000000000000000001747193c5402daffffe4b1ba9034231321d01966befa174f526014d6c27fe3683eedefea8690b95c8f71fef1152929bd08bbe9e7a307e380c238ec1f8e2010a95fff8b03923ecd9b012f99e56c77a5cd", + "Expected": "000000000000000000000000000000000bedee9e836b3e046bba7fca7632d09a5a25fe1f0fd25cc6ae1d1e07d98ec52742a60bf346285488dc84b2360e0db58900000000000000000000000000000000071ef77988eea20a38fe33564689a39a7113b1715dddc1b212c6edab6bdea8de54089eb7b49b63296792bb2f4aa68733", + "Name": "matter_g1_multiexp_64", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000000b7db363585b0061a4707a2ee67d6d7220e9209b4eb9a59c02aa6e177c948057826780f292dbdd824d67ca9f78864cb000000000000000000000000000000000a31f49bfddb5c48730e1cd429f128a540ff44b6a5031e7975ec0c6661f9f3f2b79ccd2d13cc1b50d50ef9c7f658d412cc5e9d01f6ea67dc3f943d57d9d8b5791d823592f7fae6719804c1ca097e651d000000000000000000000000000000000d4fb266e9fb18590037394b18971cad5840bf89047dc11e52c90284642be7e27007c62a1e331a2f90ae67313efcbc0000000000000000000000000000000000047b518cd6a7d7c4d262d1f9f5f11480e30c626d45fee2d6caa274aa1353035a3c42ba96b5875de36442aa5d4b92d6d257b8fcb85e4dbc1969805d814e75b2b80f5cd1e5562bfc1e28becf731aadfc58000000000000000000000000000000000cdc9bca5cc807710948d5189dfadca2cdfa6fca5496234f13024efd84a37070a2fd51a609c4ed6aab54f8687ac9700200000000000000000000000000000000011bc450e4222090603ccfaf7c1dee67bbd59aadafc3810d3aaa8362fe43f48952320e25bebef482c5d21a541400df5a03edc53ced9ec5d7f302216fd30a81c3554a3fd04994f62b5e3da74c8b71bb870000000000000000000000000000000000015d20abf274edf0c9d45c2675e4af7987e98005b2a0d128ba7df6b16b88784a7134d37d0da2da02557f88d26de33f00000000000000000000000000000000190adb20cb0f5902f7e92f79dd6e7d214eb892834611ef222e9a80ade4c7cf96e0b5f9382b61715e1701c7e9cc4f4ba5976568ab779e335b8dc67a64f15b947e69cd3896ff393f51fbd3c3e3a157543f0000000000000000000000000000000017dcf175327086e058e4696d689f2e8a167aca5616f2317b7673850a2272fd5742b70eb362b37874d573cfefa25ce3ce000000000000000000000000000000000e5e1af08f6174641aaf4f1584ac40d53c393314dcb1c405263e8689558445196371e2858a4f44d605550fe0f15962223aa5eeded490a17b1cfa66d409811741643b7beacf312b9d6c8e7e7e63579c830000000000000000000000000000000008456d980ecc64b04a203d61bdb78bad67b4568b2dd9a123634cefbd7f7077cd9a4c038c0aa3654915c12242dc594b37000000000000000000000000000000000adbd582b0a8ac28ab21961476e163255089c2d362bfe9daa7007a2c9d8d261593eab22a6bdaa9740da81efaa24cc3d5f9f1f9313bf966ea3b8f09bbe9dcb66a7f9e3e94e2024c49a72ccbbe03fe4662000000000000000000000000000000000b02d326ecb5c04ccea4cc3d29f82117f3d97f788b8e70cbb346d43d27e674540c7a94d242d290e55d992eebac546c9b0000000000000000000000000000000013901f8dd68285d73093c30b37419ef8e4b28371474a040a2ea293f7274ec4d6ced0f32686405205324740884306e3a693be64fc3763d06111961bb208a2b858aa1ff181781dda630ca41f0d45ef2a9000000000000000000000000000000000181bf2fe4bc67a1d10335a0ca9427f603610646de485a7cf039f0706c0a0858ea694db3b3e5ca85317c98b5cd75865420000000000000000000000000000000014b1b652e2ec7d05956705f692860b83713c5cc98c6532b3df50259f27f92d485e8df846883a4af4e46020ae54038d955d2a2b6008a3b4a4cb3a8c28864214c7fbe154fedab1f9ff8c96eab6a5f28fd3000000000000000000000000000000001084f77ef23ac990b43363db38d652f0e6dc04a4bc395c8018083fae6fa6e42f463af7748d71f65b14f94632ca0eaaae0000000000000000000000000000000004ebfd75ecc9cea5e49082e1adacf6b50e4f14600d9343f6459900605c5f36ee51e95408a3005c0c1093e41794c282a0854e742ef7c76ad438cbf30c30103741f57ebbcdca4d6c4f14e554dd1ed81b2400000000000000000000000000000000062a062d2ccf5c131e1278a63e713ebcf8a221e429b52b3a7688f7e68a12558fd0f584e03835daa3988233d6a84010310000000000000000000000000000000013e9330d29635892fbe0742d1a8c96ef527b78ae389385a366b6dcc6a04b8cd1d5b8bbb79ea649179e78fc061d23cafd6f4f00b2494a32844e01d0827ca78b06f5eb40b6769f36a04f20eea229c305f9000000000000000000000000000000000b131e0623b7f30bad70145cc4964257053f2ead992d28aa5b24c04bc316d479d077af0ff409cd395a86b808bd3e4f02000000000000000000000000000000000380fe6e79e5e0a399365d73244f2962facda8b7b381c111508819309ec5b1d3d8783067245dca26641a966969dcd0ab191e47a0b0c72bd17319063abde7df51498cf0c980c46946bf80ae4c9864e2e20000000000000000000000000000000014971f46efae601309f3d16c15ab5c46ac48d2199431fd959cbf4efb768ebcc4f410fd66de04d3280659004a6b54e64700000000000000000000000000000000113e6438dd8088e73eed84d24ec286a45ca51f0fda88c7ae3f1e6a2195f6b11877e606773bb9a8db19dc92c3b0729754b7baf8816db56c0a602cfb4caa9089136ebde05722ad4838671e45ada5c716f20000000000000000000000000000000006fceb59d8baea4a10aa9f1e825631e28bdd379189eb464a3c6d2482319a09337a78173f9207a58ce15bb1c518b39328000000000000000000000000000000001609e1ff34ad2e4bea4cfc4a993d8d52a1a8676679c91544ded432adfd7fdb5c016f8d825af1c6b8207170d05c10e04a7d9ac1699117bb9b8b90e2fb709eff4ea0f7882bdf6acc6885c9458703cbfb3500000000000000000000000000000000069e48b113b822cdfc02f2f0efa02724193a5f032dea902b189290db91c6e4550fb33e2915eaa8e56ef329d6c61a0d95000000000000000000000000000000001426fa2fe7c160e8e32c3252383a7c7967b3515c3f76eeefaa5c76f02b3308d86ab95f9a3a0dfacfa6dc12eed2f3a5e8a22b6c1a24eff71f0fc64b6aee8d3d2dd0827756f5c959f68f1216c2dea58503000000000000000000000000000000000c173c6c949a7f21df4431025ce16c18b1008c75b8b1b23d03122c7c6ef714b5741804ec7aa5ac40f6b72a1a74ca5c340000000000000000000000000000000001b32d54f8f9839dc39e08bc6a5f0efc5db9bdf487a60004ee135c30efda577d187d9b9e68bdcdad558f2028d66e935cc0431e6877166686239f014008959332d9d009a801be6a1e68c2de52ee264bfc00000000000000000000000000000000037d1cbe4534b82ee79b2c957a6eb19d18dd3f3f6faf3313b0ce12a98953190aeb55f9d494bbac4f56ca6986c65f7668000000000000000000000000000000000734f505be94516149bcd6302a2c9f2f9b952c9e614c8e90b5466073a7e734ca203fcca242cb97abe1c532d7f59a783aaf833a784d22b99537236fb07ab7b59918783e35b89fc9692d7f76a03e024c94", + "Expected": "0000000000000000000000000000000012de1cacd791ab81eb49d2e259f36abfd90e8c7ed4f9f23a4c95cb48cc7bf9df233951291342d1266d016a7fcc6b9d53000000000000000000000000000000001938d574d02b8802a45ddf8488340f2397e93125678400cfbd8e64cc3805704bd5f85f8fb2f64a96ec1089b03d9d1c24", + "Name": "matter_g1_multiexp_65", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000017387ec261c6dea7bbcaf4537182de1620adaa5842cf52c8b5b6cd851ca3c27abafa584547db7366455281d82d3f83ea000000000000000000000000000000000246dc1cc9773db7151e05d131398146b28850e97f6b13694d696be374095fb153b206723afcafddd4b3b56bb15bf778b16c1bc60e1a9be9a82c93b7e0311e7516a57d687d8907599918df77b3b6caf3000000000000000000000000000000000a909dad5029834df0202c298a577f897a376b205812d79e0bb58b91ca11262a766dc396f69fd2b199dbfa52670515ea0000000000000000000000000000000003737873dec25f011b24543071a61590646e4319a2128eed87d40193a22c47b1a6c0f807ba3115a7e45823e5a4bb433dcf301dfca76a83c70552c9cbc9c80cb20f0d82a70a9d887b04b150fa0764ce2e0000000000000000000000000000000002b959df6a1badcd306209c1f3c4c496cbfe4f00995cb4403b04ffa6b9f2c8dd9875a2747354a653a74fbb605eea50b00000000000000000000000000000000004d6b15939c8e282a5995c8c0b67fcba3171b35ecc039fcf32d1e96671698d8a9fd2cbcaa7019cfd01e56d68cac64fe51cfb94c4e029a2126a9cf5561c677687f52059e4b7f8b7e7e73e5b1dd7f421290000000000000000000000000000000006be65e97560a40394d9295fac0029a0c889bf803f09926359a1ac40deb7777cea7dc5d2c4a9600328605fb994f87b5600000000000000000000000000000000128249d2137f7ab1c5622a8eb1c59ee8ed792fe6b09e4d868c9d9ba900a8d28bde5b783ca591f79e1d729c99e10d5cf6d8386fe6f4303959e58165b422e98c4813b1bad7808594473e4e66df09698cf00000000000000000000000000000000002244c1e55324a4aeaa07c414cd3f9872290e729c1cf1c05a5b1de3443e12b2335cd36f0e84f11f04b62af37005ce0ad00000000000000000000000000000000151684aed084d38aba7127434ea73e63219c4f5b4b92017142d19d0330417fb2806e31440e0bb7c9fca2bc8dec73072f02e1c432f3b55ae87ab815647f196be3e138b2f6e9fe7acb9459650246187eb90000000000000000000000000000000009f0c959d995af6cd0d45750cb35a28461d0f791e59b2975ba4edbd7db015858b41b3b7c5c2da0a4c6a5d7b4e855329d0000000000000000000000000000000012d495ae3096c2399149afd00f640f8840c3f8e5dda5835b62ef0dd8bb7303f522692efa72c37190bf6808ed3d4fe8e89b0cc0ac499dffd627f5d19b87817dcd67e87561d5244a4b5698265f8c5b767e000000000000000000000000000000000334cef31670360b5ac7550b55cb03b770660ee79816a2742c059b2ed6cd9d5c53c5ca54793a9912ddd7603d975c3f58000000000000000000000000000000000144f221db562b0daefb20238a527a10ff1ccc279eda86723668f8ada40b41a2825f82f5ee5d619fb193b9c2b4180d932f3875f81fd39c9b3ec74eb269903dba4173d8eb0e41a196d3131252207ffa0400000000000000000000000000000000037f14fb2d51b25cc04768d50fe26c1e156a3478b80e32da980f7e8d5692a4cf282f75e5d8be325ccb4223c7ec2c04af0000000000000000000000000000000004eaf2c069c96dcf18051a2c1d7ea876af67bf344070415894c07b3dd69330d8ca18e1313ff57d83b70e5cda3c9ea8582d8d4341822dba68c6fd58cfebd07b134c1d0c4e32ff63f7d59addff4df1ec3200000000000000000000000000000000104c1f5bdf874c91020d410d8fe74834cf15f341b86e66ac693003766484cffaef2c57fab5888f02f5ebfe1b9ef2fffd0000000000000000000000000000000014a2f6d185c2989ecbb766179c0b0d0713ea9714da2ac555bebf0522ff00766ea7e39c8237f8515224fd096d2b1ede34efa3dab1d7cdf949bd938ca6ac371f953b3bbef1aec7ae76bda37db4c940b3d80000000000000000000000000000000003ebae6a494d46ade2dc7d4630a420b519df7086b57a33da178616d4242fc20e4d02d38b5d00675d2cfdb51adc1921f6000000000000000000000000000000000edc56e6eb4aa8556225d928408702042d49cf3e1410e1c78d8ed5832ecae449d17c9d8f2a89ffbfaf01bfcc85ebc1669848d3c53632dc461619c8c522013b83550ef3dc7fda197ba37c9cfe4340f5a50000000000000000000000000000000000f96864832e7a9602196f0abba78f456300796d5afc18b0ff0c5c23b61865256fe5cfb960bcc8f73231c21b1084cf04000000000000000000000000000000000c59dcca2249b5b01c1b54be0e4114ae8228bc150e5ac7593bdf96136cd7cdd7562eb936ddc5c9e42bd93abe91bac5b0cbfd192e917f2e0c4d6253c4e4755f30812149d1ce1ee4ae5540faf1dbfbc13a000000000000000000000000000000000422c390e56fa27e3d7d5da1b2ef00a29d5340026becefc095d4cfe830208d3b94cbf5ae6f4506ae45d04764acc8044c000000000000000000000000000000000d1cc7c147cbedefa854fb9764352a9689fd157cb2540fe070ad7f6f3eaf761b4670ab9334de4002fa811aa7a01aaad479eaf11b3a30c7771ce63cec214416d798de20432670280d997b2f0631007d6300000000000000000000000000000000018000e31f0ca43417865a1cc128f33383106f5bea71015e9e77cc5320cc3e5704e437ae8d84d96f2c4530c41bfad29b0000000000000000000000000000000011a74c3779c8f351d39db6745210972f4f299009afff643e944f30dbc4367e17271c688e1858e6f79b6636787fa56e6b43077447b67f65e16a8aeb3564b2d13822e478dfb4a82a15a1c8fb7cc8170cc90000000000000000000000000000000002a6c7367526da989ae093350b7c1ee9013f977d6e75563f996e1f15cd4279932a3e4060a26262f27403966a7e0111f200000000000000000000000000000000038a85281b09e5e68d7e31bfc323c9c250b42248cbae47f9c018d72f3e69ec572779d7f8fc6ed3f027499741565274e5eb64479b496c17d0587f6f26c62752881b6a9228643e8c43f21c441eeb643107000000000000000000000000000000000b788a0d47da0daa1f0d802d340e68f9bdb5ddf91875732b4ae82f1a89ebb5787ec1c9f539b82e3c94c36a5df4ddb4ad0000000000000000000000000000000016f46ff55e9f1e19a332ba4ba43d66d2a11a2728a484a719ddfc9e223b54224db55af162e73a8f5c3355f0127a6b7cb652b42f75aebdad1bf433917c025800c4f4e985cc077db3ba36f7484f95764e89000000000000000000000000000000000379d868d91304b24e19694937402bb685f064ec5a89b49e243e2ab7eff5ca0a2023af9828c4ce9f768a1d6488c10e110000000000000000000000000000000011a9b9432ab253d47e8dff776c8b5810ecf7f7aae2ff36ce06b87436b4e20c22596c7713def3886549a36bb535a96fd1e83106e9ea63791eb192e7a035bee27bd049b3a37f080076146eeeea6a769384", + "Expected": "0000000000000000000000000000000001a50ddc4d4542aae264dce69f5f5e93353a9eba30b177b33c2f74ef61149a301599beecc4d0f78078dbb9638eea526200000000000000000000000000000000160a2fd67df885232b06d3dead7ffca93cf0434a3e9a5412ed3b4c342819b44aad5385bf5ab60bc2b7191722d1372183", + "Name": "matter_g1_multiexp_66", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000008788a699276abcc2d8e4a35a9d0ddcbd8006a809799374ffd56ee8afa1a89461602d92fae6eba7fdd4045ba34d917e5000000000000000000000000000000000c8e03ca0da00c6829e2d7c49360e67e46ce12e0c99cb3d957119bd9c8bcac8e03cf32ec71db2a18568157f4b44cd4dca4d710d2f632e3ed0ef69fa0219e16ba30d3efee99386f1a5c921f4548ebf64b0000000000000000000000000000000001373b4a0653f48c205b36bc50541a43abfcf35974a584953bbc40f5cabdc3ac2047bb86267cdad1e8f00766682d2e6f000000000000000000000000000000000faa8c977b4db7a3c9e65d9cd5af4ffd2d7d67fb038d92c1096124312a98d94e6dc3f3b8de73eeb057cdeec4bc0e0482bd9ae4597aaf582857b40096360ced0f044ea172551c6f9fe3a15e0ce290b56b0000000000000000000000000000000012dddf5b96d0dfd2fd619b634b086ba5d5f25a53e93938559a7adef7b988749ca27d14f2ddbf5a9e7e6c1914403a45b900000000000000000000000000000000044b5c8041fa805cf2ec5a243814308369e5af534729cc9608fd17583a48132809f507cdb5b76fd6597fcababa865ddaefbcb4bad99b419820eec388f6f62ac8d87866d7beae6d431dfa48d4243b4a4b0000000000000000000000000000000017c5807458fbb875593ebfe83c49ac2493ddaa15671a59032528e0464360c64bf564f9727959108940ccbdb8d01f329e00000000000000000000000000000000121dcb798111976daed483f4efc95f968f5212cdfaaf0497eab0419a1b55c7ee4e2ea26716d0c1a8aded4804228b8ad860d89acf5b49fd1f70fc54756c4bc1972cd8818e36efc37b422ba6a9318fa134000000000000000000000000000000000717296a20594f940a05ed3ce4bf2b7779c428b33a297087e08b2283b33228a7d4d5b9c49a71ce036d6f2a078d8344540000000000000000000000000000000000fc78f64a461fb66ca081ff4d67369058e57e5ae0e284562161fc3244bae0b9c70ea6abb2d0da6cea4942530c64ea0e386af376b9b393dde994da419d1f7aab60023546647f7b069ede939386bd6ee8000000000000000000000000000000000584bbc0c537e7f37ee64604a134d5fc21d838c51a89c608ff9e3684357ed7f931fbd4fa4a5a56d20304d6f6f072316600000000000000000000000000000000191ea3bf1016b6402dca2856845017dc49c74d06bc3c5f10de379e04302c469015f205cfc97fa142727ba7e2439c15575ffca78eea65c00e1128f8dcfc96b39af1c4472b461ba5262307003bc972023d000000000000000000000000000000000f1ff007860ac58bb04d992d639a5f882c3c647e76e2d6d96888a55648f81ad8b7edb3dc2b0e56b6f2dadca73db7cbda000000000000000000000000000000000fbb952eff64505e02e0ab34875d7a79c72ab724cea7cd8f28df2578b50f78601b9a9eb4170e1b7e8d94d9db252e23c592837b4314e63ef5a153ea2ec4bd373cc3cecfa3e892c3a12aaac8ddcaf5905c00000000000000000000000000000000011dad65f38b4c24527ce87f8893c8331a32a3d058cddcdec9f8708a3bd1e31871cbdcf944ec14d5f101b8d138b2a46c0000000000000000000000000000000012a6981c5100177e643dc421c5917896455107c5995b1e969bb18b4b2752700a18281f732530af9684db180290dcb138127ef2309c699a3602b0d86a070baef0eef90f539aac3cb6ff42cb19f284bd99000000000000000000000000000000000bb4dccab7abf3f5393a338a3a07fc20d337ba2ec3b33227e8c9a832900f347d582d88cab123dab489daf471191538b20000000000000000000000000000000008589985e2952db000968a793cc0fb5bd1764ab1ecdc6f278a11dd4a1de87823016e14e9fdd682e6c489192b154cb997ba0f9a93c2fe35877ddccee5da39ce5ae60a6a19e72481319e3b3fa2eac6148900000000000000000000000000000000056fd39f2a5356870a3ebfedf35769710c16b2f2eb4a061c936f6de4f9001990769795b1c756d7c67623ce3931ea1b5a000000000000000000000000000000000b7fcba295d34fc38739c4b36689653731fa46e6029bf8e38ccb6af5ae08ffc09c86abe0de62230844a66cbde876f52663da2f227d636f10e814e360c2156e686e26ce3401dfd15f47c4ed277d05353f000000000000000000000000000000000039b08e7110b0d17c41709378f75844379c662f7f3dc480bead6bd4996de2d8889f458aabca142d50ba0e34c0c327970000000000000000000000000000000013363b0da7c7dd343ffcf6cc5e9ddb5b51480b04a472c38f90ee08cc97507f5dd665e15a160860c6df4dfec154c1504bef79e3b6ce752d140c3dfb2007a08221d989038c921efff3bc4e150a6155a33e00000000000000000000000000000000034edf693e1b201be14c496860d508d12d9180b62cf3bd2407b8ff95b93da67dc0c4c43344614dfed516d7828ffda4b20000000000000000000000000000000015246f388664b1d817fd17831f85d84cdaf31212f093820835f201c3fe6ac99d67cdcfdda3c2d74d75d5114e32c65cd7bc08091af8b8c6ea5c26f1a7d795132521350d774042d3a8c0523e86fdd23a3f000000000000000000000000000000000982b8886abbfe18cfaf4c0e16c2e7045973f5efa27e5cdb56443a22f5434e2456cad041bba3e6deafb072e5fc40f10f0000000000000000000000000000000016a45f684caf0eec143cf8f31ed5111750d8c4f1092651a471cb88cf534e81df117e3b0e8238270d3b03aeedf04d7a9f70363101b87d685aa7314f6569fca0775bc6aaffabe136e6c336e8fa43dedb8a0000000000000000000000000000000016d13da2900e2b2ef8f6ae295bf16d100d451ac4709455c55323988c71ea6aef694de0fa5a33cdd7fa2512d3548e39a70000000000000000000000000000000005795677001cab950d1a7b802bb14f9203036f15fb335daa5f0b0ece4bcfcd3b31b581b439da46452e4e688f16685e37997ff3852cd97c3a65bce9083ff66197fd5c70894641195514d556102f091e88000000000000000000000000000000000b7d422ac85798cb5ef5548805bd6d3de20ada4994fc38355e92cbf0d0c9da356a5e9e1674a50a017643f652f71226e8000000000000000000000000000000001715616f53a501acbaaec470121caac29827b6b7bfd7e689d8e48822d2c464ae50158662e69c1c232ecd09f5ec946a7a5ff95dfa306f91196849d752569b35812e1db7946708cd06df9db9ee75447bc30000000000000000000000000000000010e7530ba600fa531878ad0f798a0ede2d025f149ca980bcdbb0e4316e8d2e7d2b248619369e36d21dfd766aba5918070000000000000000000000000000000000ecfa746f1cadbed34fc1ee3483307de400ded69af4a7dbb598802b7908495519b0cd4c1fa98c9cd8e82daf8b3e836e03c4308f0467520343825a91c0421f9c9c9d06957fa2fc051970f14085339e26", + "Expected": "0000000000000000000000000000000016bbc2dfb25ff6cb9cd03b0cc91f53c6ed9be933746d59e78c7251080856cf47c12bbecda442840675b03a812aaa5d98000000000000000000000000000000000555b0683640ef1795c918f5d10e8b3e07a09030fbf26eb34bebfbeac34e13c93ecf53d54dec5c8654cdedab2fd60570", + "Name": "matter_g1_multiexp_67", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000f08b9765910d97ac42bc31d4b4c8bad5f3db3fe5374f11ae1c08af41ee226bbb4b0869b039fa81a935025de11b1d1fe000000000000000000000000000000000ea29999ba91652e2e6dfdf77595b44da8e5cddf2e3ae6c782dbf1f972717833d03478bb8651bc0cc7946d813371aaba2849fab097a4f71bdfcfaf435994a0c6ac3671a4a9ed0402010be83ff95228fd000000000000000000000000000000000997b39892bfe0c67c296135573975801ddb99d06de02d96853f44336fdaa25dcfe253708583f415d882115ec68dbaed000000000000000000000000000000000a88e2f75817ce91c7dbe365d67aca52186b5e94c735e5893bef6aabc61f015f854f9bd110d3201be6f35147f9f9b8fce6558521e301eabf09e80a509b46cf8ec118ee8586f4e46a7313a96dc37ba6990000000000000000000000000000000012a730eaf214a874448e654a06604c4b9218f163b979bd3700b7a7fa3856b814c380532afce59b6253344da5bffd684600000000000000000000000000000000182fb293f9a63c705501aa0ec7ca72698d7d4d50af3a0f68ee849cd3f82ac24aca2e2ee813f68e708991a97e58f2d03d8f2f7c525fc0f353700fa823a5d32a93189699206c5ba5ed271a158ebb47674b0000000000000000000000000000000015bbe08935721cc6199f9255379589a4512c178bbedf69c82a0d9cba22b285730d4f27a3629d92574b2c24dbe09300de0000000000000000000000000000000007aba01238f2c4ef0192fea78fbccf2e669f802a2822baf067632daadbc1d07e70095c14bae959a0f706092b0be10335c7e8adc0f0a042a32c733b5c3356cf4a7d648be51c1d78534ca65dd43a0c13e40000000000000000000000000000000011727d6d6cff667f5bdec92a3b502f9d9fbcded2ef12ac058ac51ccb4064443b7a2671e9ffa2fefd9b121d89bb4ded1e000000000000000000000000000000000960f8ac1e52246529fcc6f8f7cbaf42677297c00022d312e0deb5fc45d3685bb33fd68c193758258439864ba4a073e5650081a6720845a20164ef7c06ce1e73286a32dd64efbe57fe46765008dc9dd50000000000000000000000000000000014b3a9296c87b54f8f51b935a8d9ec0af44d711e3109e75fe34f07d0705e9ebf0ba5e81dd8b7e3c4b4f862570637a7f80000000000000000000000000000000005b834857b8629cdbf514e5ac2e0e2a45e4374c287bab5e4c163d669e7b1a36c72cec1ab7d857e28f2633a6e5f298f55c067d18b95591f7f14261f95513e1990f5a4f6908f94a015a93fe379726d5120000000000000000000000000000000000ad8c626ba39823a33d17a4f06cf17d29e9e0ae3f28db0b369fa0bb4b7343115fb3ded39862381822c3b2d74ab7f70e800000000000000000000000000000000117230d8da035f40c181b50c12370f159748955f63ee1eb61e8242e476575e9aaf16bd43b7e79a35ab4e2da20f43fd92b448bb01a1963bf74e0fbf99329005af8e932074358d855ff43c213e02bf26bd00000000000000000000000000000000027764a17af5328811b305c21b0fecc54a3f225eaaedbf453ea4c0724fdbd481873d84b1a7ffbdc7f1cb07c2d1efaf5c000000000000000000000000000000001090ec8d750ceecf682de76d4794f9a8bbbf3a3f4ab591fe882613c1b6db0912696974a1f2ce349bd8c79acb4891719d441fc4cb1ea8f86af8839aa40c35c0706f3a159b4bc902347009f744b73cee350000000000000000000000000000000015e707430eae84b75946f21e1fb0b6ede203b843671911923efd9674421a92ff13cd900bee1b27d70b8e8cbeccb165930000000000000000000000000000000001263ed28f531d8197606a038d7d7c3e1d732690cd69f52533470f6fbef193be5e63d5af0dee3aa8a73a23253533f8223020a1ab853ef2018976e43cce2724105a2526b28d23b0226c49ff3d4a03d40c0000000000000000000000000000000007fe70102db7df6529f732b5cc2b1caef0fe03af9824a5097922dc0b07e5ff32bc195fbdfd7b5e4b2bbcd75b1badc6ef0000000000000000000000000000000011b40afd78bb5e835227e5a08f94f7c70b06dc010f5a710a025f589521543eaff27d789d4de10fd4020879b45bc0a9dc82702398b8c95c3a8cd163a8a3cb2a7a04030ef99404c325115e9a9312e8c1bf000000000000000000000000000000000e4df86963d375710c681c5b3910fe79446e73e00613bd554ee20f47fa9e2b0cfb6c14a29ed6dab0a56c49708fc624d80000000000000000000000000000000010029bbd62162cbca140c56354ea070ae3f1028e438c70dce31e7bc8691541e59e9168e9b689c19d177d4fd68f8b1081338468a325384a9367c90bd0450816a22849b845aadaf187c27b3f09800e791b00000000000000000000000000000000097f3f61b164193da313d88429a4f34b0ef2f864ad8fdf7183c3e1da02dcbf0ddeba9bc04a7594516e6255ed59527e110000000000000000000000000000000008133f297b8da5dac5e1ac3db3073587b92a5d821949968c125e5c9c79a19b5945ab47fb0ce5d6f4269231596b157826d29136cbc4764346e7ae1af92fe64560f453821f96f32a42a2006b6edee7502100000000000000000000000000000000028cacc78001b805c3e43e92fb8c4477778ce81fca9068240e0088e344cc8201ed5bba52e7ee09d5ea6f982f30d6ea2e0000000000000000000000000000000012c5db0995324657574a27c48313674d2ad3aa931cee78ade96408c5e04e6f5f8eae88018511ff156bcc787970ec40ab675a59418f1462247d3bddda5937553e96d854b5df64a68145a193b2b1a7eb25000000000000000000000000000000001768f68b0ec15fdd37c3ad9445e53a582ab5546f9eeec590b84e11f5a72585eada71129d1b93a72b334bec4df57ea4c40000000000000000000000000000000004d6e137e66243b56bbaaac98717061b36545c1c3e24801e6e054bdaaa6d28d641821a51233175f5e5823b7d2b7b42cc544a345719b40f973398a6fdaa2044037cacd7f6c361921c62053cd51f2e5ff70000000000000000000000000000000008caba9658e420fa17950c995efd00447bd5074af9b57122240d4e709229d382e371d7de867005745a35a2a7d68fee8200000000000000000000000000000000072e0c25435616f157284b48fc8da4a3fdaefc4f6d484e071cbe648fedf30b5da4457852d7715741615317e21110d4c2bb38b4cd72eb18c3ac87860aa58b4b439712562f742f112b5d769415e9c19d0a0000000000000000000000000000000016c418a3b3f054188d6891ddadb19c00ec629a3ae0f49cb1b6801a9db0afb1b5e473c75cc8e9f352adf7ce8ac738ae0100000000000000000000000000000000110b8099a39e40541dab01e10314a0cc10fd2277c8766c7c73d32d7d0c6edd3ed3984c8bce249de4776920dfa28ee86994a849f6fb5a53bd5957e53ade1baee05702185b4d0fbb7c1cc0f46cb75614fc", + "Expected": "0000000000000000000000000000000011104fff0cde20e65e73185321d26defcbce9c9d3c27923a2366730c1b560da80066734c61e0c42bac1da45787f39e2500000000000000000000000000000000066efa830182669715da4dbafc6434be27a2e95140cb39738fa75cfba2b5786d27fd727df4e9b0195b49be2dcb9c2c1c", + "Name": "matter_g1_multiexp_68", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000188c13fde41e3c7d84ef3b5d1fa869dff4bf02cc8448ae49c6b72cc005bd06916a5d0a74fd770bbdd3d2c58839840095000000000000000000000000000000001637ed432b4ac6b5021aac0c9d5f084e1f6c541c101a3d650861f7d860572795f04e986c4a890ea0ec049da7c6025fa3f5b9d270fe31c772e9a0bb409d9f08a07887f045f906f30e2653d293b6c2c27700000000000000000000000000000000063a1afe2f64f1d04f7a5aa727cbd0e9dd9b66234120118db1f8fc3b90ae50cf493c3c4a48949441cc1e46488972d39e00000000000000000000000000000000049261c42dea531a6e8fd82f77605ad0cc9addb23e429f03f1aaf2fb8d9dddaa89101bd5b5b169dce793de9bcafc3b5ddcbf4fe86140c50618598be9185830bc1da11429162afe0528f00eb6698ec0880000000000000000000000000000000012ecb0f3bb6fbb4802479611a25781ab09c81ff7175170805ebadbc5f25d2c40bcaca855ece57f481160d49af008d2b3000000000000000000000000000000000bc4bccd65e010b69676d3c226057528dbe08271d65f83a918b06969c1d5303cb7383645fc19548eadb83649ecc54a551d7fb7121ef0baa85046567014620e1adfb9e8b3bc95adccbf2e0b0ea8f37c67000000000000000000000000000000000e3dfb86c2eefe0b25f117484a9d693702496124fd0dda80830a4e917bc418a793519dc269fd4932236f73506ecc949300000000000000000000000000000000140faa4b38ace6e80e5d3fdd57079c215792672ce651563eb013a90e66665dccf6bfc9f9df145d34894e3972eb524f86310d3b0535e78d803b477e5dc26c71bb18acfe66bd5ba5892d924d265afd6a160000000000000000000000000000000016e70554f8580b8e9c5e421c6a6495df7df846ad67d5d4334e9aa89f7e3fae505a2d335d21624e66aa542dccf38081e0000000000000000000000000000000001090383d5f42c056c291a4c4c6127315849c647783a556aba3dc41c52545549d67560bdd697fd1f47dace750483ec9b72fc9417e65cb76aa0093a7deb3d38c111c68f461a4aac57d8f09189f94407ee8000000000000000000000000000000000e8ba15ec58e5de08935384a3674418942311beff3887d7b5b81da0d03348791e4b17a06397e33e988ac6719f4d6f5c300000000000000000000000000000000159841665c915844ed85abdec0c1e78f178df2511da4d3be989f27063a8e572fe746b20e3aff056a63f4832d82a7cc75aa0b2d714aff175a0be2ba9e675a2be8936c42f15e304a146622a95dd6b3e3ef00000000000000000000000000000000167848a43b68c8f4c205613e1440f940735d7d44eb1b046e63ce50fe8d7acc5b2c020fa936d6e07347a7858be57870e5000000000000000000000000000000000aed7f9b7108aa4e7445be41bba256667ce7587a867b9b8ca70d3c42155521ea3bebbfe01bab038969721364eb758be10227c3510ed6e4c7f84b11ddd2d6caa55e0e79ed59e1cc0cb325d55b5d145aa8000000000000000000000000000000000699a81c47bcab8342b11a207af072cededbadd374aa79f6b401e4bd5d429a0443234522a8955b3a62a21ef6697410270000000000000000000000000000000008ec25a0e0dc6a3c8906a1b3413f522440d56f67fb780545fa022026c6faae016108cb6eb23d6d6d519a4aa790327ae6ad930000a9f82e082d408999b396aca2b0e435a66faba1d95e10fa0abc0625cc0000000000000000000000000000000009c2158ea44c3b590df30e15f97ebda263670c1bba0d97ceda7ea674af0e61f0b5928fe0bdcd8f18efe5340525259b4c0000000000000000000000000000000019a5534906413fdacde78ffb03e6564d8beaa155f86e4f19be2188854a8709e82d2ade21621934c1aef8be723ea91a141a6799cab8964c7b79b80e76be237ef49c2bdef5c99a38ea873af6e9d49790ec000000000000000000000000000000000165b15830a84e786d563cc3c5117a3e7dbe9dda178bafd225503467ea4c9aa894294c4fda58734eba9864796974a016000000000000000000000000000000001285a2be50f38fa6a068b75386d468d8fc1c11405291e794d5aa5157cc81d7d66c1095f2fd9289f1306f74596e9b5c21b206dbfd70e4b24bcc09ad35ce7b3aa62d17f18347f2bc5f15730202909c93770000000000000000000000000000000019d5819c1c4f10c83ca6f1596e6cf9901611c1407d6d7abab989333b37a8c21cc3deb039722a51e2dec161c38f3ce74200000000000000000000000000000000136d05ff33253260cbbfea0390e78cf66845afb4ddd0b684b928da017fbdf6b0e840431064e6e6d5bc8e417a74c811ab3a607a7301bb7dc5b9c82d956ebb0bc54568d0654d725d4d5f13ceb6231e862e000000000000000000000000000000000593e66a323cf3efa13fe19cde7a3c254c90b23bc836e1f437f4a4b85790f325f0746147aeb1d0447022bb138178bff50000000000000000000000000000000011a4b1222d0b49a27e66cd34a12f252296ecd1aeda435035f06c059aa3e6ba69acd1ae6d7da394f32ab78538f4e50a351231e0fbbc2d98bfd1039a889acac471110d568b0a24ddf5eb3501adcbaac6fa000000000000000000000000000000000613bef17f6b6b39f9f6bde785a82d2e4c368ef231d8cb89940059ac2c16bdd707170b660c0faef9e927ff7a72f6712e000000000000000000000000000000000fc85913ebe30f0af146df556c6984ab442b286fa70ee00d39a802f4c76c3e41cee68802982ea42fb25d4bb04593c0b5393c5c10d4bc4cd1567bca6960051f818e5c53704ce44dc4582767fef1092a870000000000000000000000000000000003da5997b7b3677f6cb03fe969e328549b1c0b083a6df457a70f1276d10e01d65feaa5a36cfad19dbe41cad9eba2fe73000000000000000000000000000000000345176bf6a03a49ae0b6d89d07548ed47dd67dd620e5e29066d09a00a7e3bd4b7fcb79b114a046dcc0c705068f71b50d412195e347b680430c4528987859a1552ba8383cdc075c437ef19db6eff6e1a00000000000000000000000000000000105ed7acf8c7c116842dc159553499aac7b8beb36dfd7eb717c571ad4ee1f86b82b736b72c2936925afdc3c739e0ad56000000000000000000000000000000000618b8fbf8a2aa2d1030c6304655b1df3cf8e8260b7b2d97639bd857d58606d0eceff7ff0fc1a811396552719407daee5b6701bc11c1ef3c9389710e4dd090e3db481c5400ecb91655c20694207a71f1000000000000000000000000000000000eabffb8ece92d4b22ee47560984b3efc33913953dcdf5e22771bb8db2cd8eceea21a2b14d70b1d467d692371ff499a300000000000000000000000000000000143282a2cc502f477be295d5fb2ec847cc988e43f72be848464eb4c1dcd0b1ab66a6cc30dd4b465050f6c37e8b8e08a7ab45b07c059738ead9709bf36ab20b09fd3368f7aa12c6d9f3acf3f145c83fa5", + "Expected": "000000000000000000000000000000000378217eb65cf5ff48e40ebbfbf03c307aabb63955f755a93bfbea0c176e90dc986a8202c6ea4e9ecea176068cfc62440000000000000000000000000000000012ac5e1a0c75ac5b96af3959a65eed134dac6b35559cd923facd2062ee06cb3ae2018db7d27dad2927b3e9c2e3dada33", + "Name": "matter_g1_multiexp_69", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000d6ab2022d950cd2ad2f0087a079e435634a1e24008d12a349836cb7297defe857cadf3adf061e8b55ece662dd36ca280000000000000000000000000000000007682f1ced1ac2aca6ee9de682c7a6743fd32264eb0a087eb1df7c520c5748cd598be45213b398b073dccbb6bd67b44c3ca13f8540eaf45ffdab5182883d32a1d35e7cd956092221cc40232efde6cd1e000000000000000000000000000000000927b5590892a4b897ff2d6ef6d5abe32bec8233bc5f35ea9ace2ec516037a8f3d162b0161c91d4e06d80d73528a6ba400000000000000000000000000000000064d3d8340eea43bb2d54dd6f5d9d49fc2275ca1ae7212329a11ed9a94c70c80584cb6ccc1eb653f001a1c1c4306e702b3c8b045ef559b76005875bce09a66b36f295070a73ec8dc66c86bca51fa5d4d000000000000000000000000000000000322791d0e53364128288e40b621e6c47324dafcf86e9a8590a79eddc8d3e6c9d74cf9721115550e7e33868ced39cc4700000000000000000000000000000000112a246f82756d88f30e74b3f5df21e18ffc9cccd713e6509572338ccb4f52cbc0c3a6d5b5c112e304f90ffb9179238521953ea264f74bf64378a339461bff41c5193e17913c67be7e2a249c9737b8250000000000000000000000000000000010bdece8fbaa604439e942e2c78aa5904cc1a0532d5bbf624794d3f10f4b64df30838799e374982feaa7346c039c08ad000000000000000000000000000000001085372e79e1046c870b1d49a2a8ea83bcddd6bb8718c7cb340dd3032739319c54eb947d518c7e17d6e603dd3539f269505655d72f1128ac0204539f0d823f076cb3a57a7e74e896b5019c9161d6486a000000000000000000000000000000001551cb2abe299a01cfba81bb306457b662ad57858a30d55e0ae0c0f5851483123c388ba06ead8ec4fad0b1e4f69ddd6b00000000000000000000000000000000159e5ffc459d38a6b1e49b30647939f37c0d4fc02b83f9dbac123d64535752977005e0cb1232ebaa7cf0bfdc203ccaeac4c861cde3f445e3a78d1498d98b2b947056cf578652e19be88da4a786af196f0000000000000000000000000000000004111e81afa9fd09e39df891cbb99d9b62205777bebee33b2914e24570db46f75db5dbe2e9831c50f9717dc317f05ceb000000000000000000000000000000000a999eb350750cd505ea9de43945cfb0c9c4ea412cb0f0e769e62e47d08f8d50392d3a5e821f1e9c947990e6398b5ec699762c5189cf154e24238e4b157caa1d8759002f69b289cfbf3f24f5dabf20bb000000000000000000000000000000001496d3b0062e9e7166d777d90553545ee7dfdbdacb355fa7ecfecd65bcb96321aec0fd835b32c8bce462c87a2b52a58f000000000000000000000000000000000ef77e6ddce1e0eae50a1c663374c31a0c5846d6c2d777bb2f4831ecc806ac28591c3ab0222a6cc7821a45ddde1ce23e298b5f6b43074b8f0807086b03f5028709209310474c35c7ee232eec8579147c00000000000000000000000000000000194bd82f02047bc08871e431ebde41327a60e838d3a1ce6eb5470ba21a9b863025c8663f7d509a73847ed41515fdd3ac0000000000000000000000000000000006c9303814ddedc68b0047b5b2f0333cf226908dcb14ccc0aae4e14456a0c83eb4f498d559a649bb64bc78900a788a4b177bfb0218ecd8cdbc6dd9484e74e41be6971ec2911bacc8b53b9b4b8c70e573000000000000000000000000000000000736fc761eca44cd197ec6fc680de349f96e5294e42648825ce9262fef91766a8d7a084e5b598b5b47d947548e0c61860000000000000000000000000000000018eedf050da521b9af0ce2007cd664e2760320056e14ddb162db5cae78ed7ec859bad03fc60caa06081f0c24bb130ea4cac52219796226385aebf9e85f5f179362d4149c33582a97b7d2aeb05a8e6a990000000000000000000000000000000018a8e4887f0c08dfb7a741858580a1e0ba7e7ee1959284ad0955beb186e84a5d503ffe4000d5a8641575540b6b7a3885000000000000000000000000000000001946ae0b124fb60fb4dd32181783564dfb8ed0616a220d5650fcc1f6968ff70dc74535c71b0cf1019eb038c19cef0caae03afb2efea85fcd035cb4ba09977b2e1c84a0d98edf88e9f8d2c4f116d0f5030000000000000000000000000000000003cc2093935fcacc3fbe4429868c7b31fe8c8b12c1184e2181dc8da4d56b9b3ace85ad8d6b850deccd047eb002acc8fe0000000000000000000000000000000008cebb95902576d96a3a257ccfe76bc727174e08d70492dbc2132b9d5f534de3b6a7baac2d90338278064565aa67b22c804dec43760dab29c161b8f4bddc52379a17f3168f684267cfbbc3505e32d5f10000000000000000000000000000000003a03e6c183afe6aae9bee030f46086032e9d81fe337e7e1c77ac6c903fb33154bebdc15e81422f057ba1853c1f7cf110000000000000000000000000000000011f5e4fff35ad1d6e2d2d4e30ddeac28432eaf13fc7c35f5a90f7f8a17de0f61bee21529b3db3633c178006f5c5fc403ed2d3daf616df3f0061f58c925e9dfbbf6e9cbfd4b0b3896a596919fb3d243db000000000000000000000000000000001986f950d86f35d45dfeba6c3e484a6da296ccda2314d03adc37bdaaab374aa9011e07e6c8fe056e66b9204c5e16fc990000000000000000000000000000000003220ebcac8189b30f6efe6051a2be1001b85a7f94d9ce289bf6e04edfdf2ff17b17702a1ce116445d763ed1c0dee645e16797ed90581fd8c3cef1f30abaed10997f13461374ea649b29101959fd50640000000000000000000000000000000001000e0934c04c36c621d9b308565cc75ff58f6c1c778b8e0926b4d22d58025edf8a853139667ab3d3616c33d8a98afd0000000000000000000000000000000008776b843fa3b1449a0879616b3a37bd5eff5c809c077fb0274fccd67d645439a79a410fe2c2db44f52887ea7f20c6062f9f29432638c033ca84422b12ca80ac4ae85fa30ff56c913c5737aeb2c84d04000000000000000000000000000000000e7b037fccbb3fed299960355ff2c6a51562814ac797ed6b4b770ec565bae5ac998eeba19819cf2b3d4e91591e7f051f000000000000000000000000000000000143dd07288b59a279de228ea59aecfba3275a87fd8307252e6b5d567bde87088a8a8f52da57cba4c0fa0e2aed423241e6f1e5df7ff90c4a4fb9a071c0caf3a3997569538ab9837ed41d9d0a8d730537000000000000000000000000000000000b41b673bab477cdb21ae5f1c04922f2b8216d7a1423a6f6b86d4c33f0b4def9c553faca2798cba20a31ee7d71422b21000000000000000000000000000000000b64686b90964104f8e79bf9527f452d25c3c8e9d53e715d884e795d26e391dbf510d72fb2850fe66e35d31444814e650cf3283195707c30880e50ff5ef605b561c3c3c354fbe8108f93b36f212f9ef5", + "Expected": "000000000000000000000000000000001673148063c4f68c59d371410a8ef20cc4516c579523e2d7d2ba04b03fc5a481a30fdc6b9ebaee1138b28a9463011227000000000000000000000000000000000067e9b23610ac41d41e0bfcabc455342360d4ae4c75fa0303631e97f702b9cb660b84b5d422e8e9a74890b803c944ea", + "Name": "matter_g1_multiexp_70", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000014cf7c57711c1708096cd33a9efd4f907112a3d4e5bad1767ddc6fb408cb7ac3f866143000154d1270c07b4294480543000000000000000000000000000000000a20191e6786d94721067d6942731110df277047541383ef9847fed9e4b8599723fd7cd7e2ca2186d56986feb8dd24d72063b046a71c2674e35466657a85d8e02253b42517b033619e31a53665917212000000000000000000000000000000000cdb0c20ac2c22a458d2370662d665005cdd8c662e318bb8652a2123f2d65d21c8e150daf51d7874c69bc039bb6163710000000000000000000000000000000008480687d726eefe93d5484ca375557e109fc64f60666e1b8aaf440100aa15e76aab6f821fde170046d2714d8986a1fe92fa325cd07502c6576dfb93ee952fedb304022656597bf3bb03a2bbc471b32a0000000000000000000000000000000011f20086905f64c21bec021e5726c05158f892658cd69536945a3337a8075994caf4fa16fe66b85e3e0ec71ae5b4c09c0000000000000000000000000000000006d71057aeaf26fc685bfc0ca071126a81224692b3eb90e37a1941782b8f65d45b6a31567c6e3d2935d38e9e02ba08654484e688799c3f0a3bbe00cec7322fba6245570685cd7df0d744473b72f03df80000000000000000000000000000000005a186d0ceb2535037b22a6455c49b6227e54c6e6dcdd98f46d996f23301b208a87c4bcd0608972961b67c523f01c99100000000000000000000000000000000142367fb02fc6b2cf52a78e4cb1157d273e9fe13ca721e0fa725f2a6dd0b4897ffe7affa25925da47fe851362700c31bfae2ef61a024e4d8c4ae277f6b1d834193df655ffb315da67afa4ee4ddcb7fbd000000000000000000000000000000000a758981a1524501c48ffc9990b738d51ebe38a0ba07b2b049110c7aa439253bfb0491a66cc42eb241a47d5e963db75500000000000000000000000000000000082adfa66bb46b97f14dec70b970469478d73d30216201e7467a927ae4ab9d93747b07ea69c406dfef789226afc4240a3168a1007abd42bc398e317484149f2fa61174243fd1748deec6cc75e7c720a2000000000000000000000000000000000de8dddf04e0c2d9ef1887ea598030f2bf3bc7bd98b8b218d19f661ec4c9a47cb087639f72fbe97afe9617acb162bd1a00000000000000000000000000000000127e78f1f41df717e5f76692b9ecf21ec0fbaf9b1d56e51b37cea02143f3b91eb1f16a65046527339dc65d29435a2874f1525bba87baee35023d0976b4a2d87524ba74158f000e5501c6d06aed04adda0000000000000000000000000000000009c37c64ffe9bbf264c475076ccbe6638653574ea84b30f4eb2601f1990f73fb5708af6007f21e4dd52f23ef5041cb3600000000000000000000000000000000170177e891c421ac91eac0dfff8bb397d7fc531e0fbd275c17cb4d894d18278a40a6c3093b92fc537244798f24eea4e92d3d7c014416f33724acaa46412348d350f93d334588d39c77dc0b8ffcb4cb1d000000000000000000000000000000000178d45abe2415895e0a550005c76522962c0ef0193cc7475a52f4d9cec9d4789406b7afa2872485722ec034df4446d90000000000000000000000000000000005e4253dde4284944b2083e07b04940cc72cb24d9866c953564bc0e847b72da59888e7a08cde7aa7c0753cda94a6e97c53bfbb1670b7045b6df689871d5d012dc93e8be65faa4a98a51db8501a4b7677000000000000000000000000000000000e48f11dee27507acd407ce1b810cfa8d0ff4414380fe26aba6c608784ef756d605c8c3ba92592ce342baef8aa927bd90000000000000000000000000000000000e604525ab4ed10f3a9a688774c6b27e679fe456190e67689959da296b650dbfb75610dcf54b30ab891c40784a9b90ff944ee8d294d189226a6cff17456e2201d17d4dfcb78f58f8501870377a6e43100000000000000000000000000000000199b1367bc3aec710e82f98d3564debe9e01ef2beb878935df4ea98e3725391e873d2661e2a27d778bd29ce6f66a9b24000000000000000000000000000000000e77a3ca6bc4584cc1c3df35b18402b75936f68f0f70193708da21649b6def59f1baec4d6d1a2733c369cb5d9a6b39347de53613b7a31583ccb214726482b770029c0ed42f9528fa74da7d2d1dd915e10000000000000000000000000000000016ee4a1a3f99134ef55398e96b86a21708388c3ddbd86746745e24bafb062a6283c5bdd771f15eb501df6a19920162d4000000000000000000000000000000001001936f457d8241a4929aec1d3769bd1955433b340481936f9443c63a6c6ddb3be4f4e1ffbf62a5c4b154fa9f8acba3b0a9750cdfe0910c544668bc9b11ecdedf1b757ff69b61fcc838c502c2911bbc0000000000000000000000000000000019aad23ac037d496eeedaeac9248842b0dec15478f62ab61d000a402cbdcc240186248ed931fe3eaae5a1d7153d3e135000000000000000000000000000000000fc1c74c4d8488edd92b42ca7c27e22a4776761829b06efb0d1b2cfa37738efb276cc5121d926665b99497841afcbd394aadecb1111ff43894123648eea9e57685dcb7a25553233a374479c24f2f88990000000000000000000000000000000014c557c44a90fa9d958d2e701cb2aac1c0204246fae4ba7b060e74e5d4ff50630fdca918c47323f5d0eff118c7595a040000000000000000000000000000000015821312dfed1e0bc2cfb23536baceb7ceb45c6c5a5f15ce0d4d67ef261a30ab8154b873513e2c44f652b93989cb6f1badde66cf749daf69a30f41ca00d251f7f1e93b0e7f916a1ba6b994d946b12ca00000000000000000000000000000000001ce81da6511eae9d2e155efb4f999a5d75faa99eed8fe784c7a398bf4b0e135bd0e8be8d9dfa2aa8ce9c63e091cb44b000000000000000000000000000000000695ff4e598b9e469bc62dffa214418536a6f49fa5f05680e09783b2f29bbfec5d43d42c969ad3b62c25c6192e328419b2f9b44c73a1a6dfba6462e1202166b63727f45dc3b8b3b73b5d06459a1beec20000000000000000000000000000000002f155e83bcd838ee8840996a3d8b0bef77334b0e8e75c8e4278411ae1012bae06959e8394dc4d1fd4ed5f07804b41870000000000000000000000000000000004daf1423e319b18dc57753d39777bb127b651f5294fe03a15dc4974eef8cffe337704c7f867fcb4c2fbac382e444a2b0cdc89e668f7cbd53a2ef6597a48b93d7d9a78950d4f821f3935edf72649e00000000000000000000000000000000000162f530647fc6290626d74753efe315e64dca2d73571dbd4416dbb41b07e8ddba40b3dbe170922c64fabbd937c961b1400000000000000000000000000000000021ac62abe15b0f1318063428d89f22d2090050b913973de571871125a391affb1cd595f9c596c9dbeb6025fc8392e48e23b377ed80bc90a4645df09e825509eebf57f59d7a2aa1b9121ace80926ccf7", + "Expected": "00000000000000000000000000000000127c2a1365d966520de7aef12e66e55d807b1a3e2305ccd5a78547fad6e6112d60a206412bf56866ca1b0af1b422c7230000000000000000000000000000000003a613a2e2abca1f42d3ed594a3b99a6cc51207b249aee2b5829aafb1327cc7bbf99604473b4048c4b2033e1befbf14a", + "Name": "matter_g1_multiexp_71", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000fd31933662cde0814cea424436ddeb6a668e20b69259424a652bab722aac70b3582cb641d53bff963ead87ef5dfe1090000000000000000000000000000000007d17925b0309fd8c92e52c1ad67937efffa7ae3c783177a82f1133c8e3aee2b8fe71095b6b88b01576c5203d7dc8c3f75888762fd1de395fa80b6d8a751f280eca568de2947e953feac343fd6bd592d000000000000000000000000000000001782f625bc3b25168b1f5b388b7963b9d158c09abbc0bc4c0bf5332e1817fc083d3d55124532fee2665c536b6923fe3b00000000000000000000000000000000118650bcb2d32f4e83257cfebbe8209c2c9062ab0eb805ae2977f79ef48af6fd78e7512b331933edd087054273eab52c18ce7941da132adec1eee8d81facdb5012a15ddfe0cd6751ebbf66ce6c4950430000000000000000000000000000000014a69e56a173ed13a9e2568a8af49d74c74dd67609ca58744f96f9213197b45de6468d69ed084ed8b1b29104322ac517000000000000000000000000000000000739671cdbdf98251ed4bf13d23c675500cb66344731ea6aa66ffe401dd6daa8157676fc46b413378b8325ed4cfe804a24a0497c642dce3937d883ee25b0ea577c729366c7d67e2e5ff1ccde3b19a5dc0000000000000000000000000000000005c95d722f8e50603951c21421e8532eae710929e976d76f28c050fb2b093618489c5f892198ca822d3f287fea6eb83200000000000000000000000000000000077a07fe1348e4b6b2a46f444137eb86bf7c58e320afda3d75769a9839fefd9142cfcb75da1d1aa0e7ce84b880ff1b3fe4e0ad0d478ccf5381470a3fc9b882639dde4a0147c7c82e50bb93431b07a135000000000000000000000000000000000efd66388da0825c846b6437b13ce5014b94b20cd3a713bdbb41a80892820ea7b12b6f6720fc7aa6e6756d496ef5ffdc0000000000000000000000000000000000adeb6281219c324d14ab4dc29841d52f3f21b512ef0a784454a01358747684afe22b34d4ff1ed29ea013d47d9059c838573db9346a3c8de41af54048cc51a0edcb86f36372859d0d794f7560c8525b0000000000000000000000000000000010367597f1deb2ca9338b59ddcd8d02440ce8cc34c71a6ff93205375077c00f3f1c22e00ebc9fb60de7475400976e1860000000000000000000000000000000017d148179e9671959bf03fa1c95ab608fe2fb8b9b1a650f524a070d7857dbb8b14a67a813ba1b22e4b71df52e46c42c002257ed12262d00e78bde574a9ebd2664484a446c03fe8cbb855bf92e56bc163000000000000000000000000000000000797e0eff7ff579b0c5161c8ee06a2b99ab44e515045e83438952226046bbb4adf3c8d0538a0bcfe27a533444e2bfc9f000000000000000000000000000000000c556867cb0238505da3b55321df66611e6a018be4e181a1ec121dd55c509d501558af880a2bcc71fcc641edcffdb13076b9d21a3da0359a377c11a6d0a18bce7ea81d4128dc1e7618e6c35b9149d5c8000000000000000000000000000000001357812e6d93272645cacde880754514ee42aea3690d9d5d67e3bb5ee4444b7a3473ea2af0fc563d246b4c3e8ab5525200000000000000000000000000000000176c413594ca45019a174848f765f69e138e70dde1e184515c6f3012df4c5fa39a28a7e202c6c563db7681b0c4f8b3a9c9cd895d5d1ae0ae704e240c10d8ed4a01b319598d7885f7c3fffcd9b491f5fd000000000000000000000000000000000c5f9145b11f6af0895eca18ba6338408ce40ae1b25f8c04b40c0410a6c69b0144541e2ca1d4303c4c55fc407ca11b1a0000000000000000000000000000000010f2a09fd8b6cffae5a06bf50597a9c0d496bf5529c8925c1141cdb25ffd3afc6b51cb5d21d97c99a8d27281c657bd842467604875028997efdf5139180a8d530a1e9f18c62ddac7753cc370bf25254b0000000000000000000000000000000000c16911df03f532313d162bae1eb57c947059fb5d776ce3bfa661bad92ebacb51154697593e2321bbf85d43ae7ea567000000000000000000000000000000000564ac0f20388ca3bd483033994bf76b1ba135e229487e0c8aa10dfdec1887c62651f4cc0c05622de6356edbfd9abfef2f47637b64d28fb4facc31d5bed34b22e7b270431f54a689cd0fabd205e001ae0000000000000000000000000000000001f6de29a7cf8a89e3cb5befc926eeef59270b929edb68e9b0cd96feb5286e130f1f7c0e0d46cf2a411e499be21d47a00000000000000000000000000000000002b4c8ff1040a843a0e1d691adead4fe3d5306f89f83724a891abffec3c742a3416fe54c27c97bd131730ad364373ed0474c3ac61d4fbece967fbd0599c9a92c3fe0e53899861f044308b0ea8df137880000000000000000000000000000000005d07fdc2e2afd92d5f0f1ab6541313b5a58868d1707ff0cc9e4ccdea0c105cf9cf1f6e52d0dfd22c70aee1f7835ee90000000000000000000000000000000001229bfa1d5c5e4aa5ed0f6753dcb40952fc5446b0c5d0d90b22a7b2abc388cc18e8ef74bb2370b6ccf036f09040f62dceaf9da65e0e1752a982601e9a070a7cc77d5007eb641fffbb78d2a1b02dcffec0000000000000000000000000000000019f4a0cb264a617986898fbfb53d1bde9cd82c092ad86e608750ffa990d6926644c717f6a63279f8061b066f0c4e86fd00000000000000000000000000000000082f1b79a9ccf56b743e14caf0cf18b94f1978d164d9a95fbf87ce15c3a9b414b098fb09654c23ed2981249233e8baae5158bfe535fbc342e31f32ab4723c0d9fe95a2c64cc4e59bd41d13a08ac811780000000000000000000000000000000011c516cfd059a1b8ff75df3b9b6b135c2a52371f1a0dad631e96d8673f1b26daff9e776e9dfb225e9881635a28dd34c5000000000000000000000000000000000bb0dfd476dab29ccc80781a92f5a998b8ba2464d76df001440240957eb1237d9d210be62c9187d7f17891e837d52635d66f5a8f37a7c6a32088897abfaf5a98bd4722c411bf4b52f0f5b5648e89df29000000000000000000000000000000000928c4d78abffa6517742e617ff8efcf59b48efe0b55eaca1d93a434b84c42f29683952dd08546dc1b88bb63a35b49c7000000000000000000000000000000000d63b1f625ca9d33aaf51f8251a088642211a474deac9931c3ff8ad45f80782f62f71f014505606cc4a96f91c79a25709acdd24190589ae7823a42e8b59598eca12bf13b97aa9a0eec17f5f79a01e8df00000000000000000000000000000000131c7e90e794b09da6c4936747e6509f94a467f38ac7f4bfd0c5da88d1733d1b6871a9df498b265c65695ab3ca889f9e00000000000000000000000000000000190e566597ec19df03c473b8ff4ec0cf24168f47c89525b31b1f3592bc7f87540caa8f91e2eb2f415c05502f72673dbd0291be87a213b0a24c92df5ce42381ca378dc4b9aeb4cb9b6918263bea827bf8", + "Expected": "0000000000000000000000000000000015610fcdfe0bc92be1f3ea82eb0b0512ed5f448e0000951fdcb0e637ecca602f715674aab1b7555c8f8bdf886d3aa62b000000000000000000000000000000000103c3ceee1b45d9d8912887c40ca16dcaabab3dabf56b8f77cb3186b267a74a5193048ce4165c419cf727d6e9925ac3", + "Name": "matter_g1_multiexp_72", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000cda9f382fd65f5ab92cc560477f1e3b69d0efe355e40ad3bcaf258509b6ca5e179deed8348836b0e723d5f7ca4c43ea00000000000000000000000000000000037011fda0d188f8d17436d21b9bce522cc9f8e4f473965803b242694f403ecee29d2abccbf56ab0a1f2fe5831c14380b14c6a38cc998df3583228080ea10f215a6e6a4b02ddb6d43e8f459d494a1ec1000000000000000000000000000000000f591bf508a5076b26dd8ea3b0f7a92889131142b34cba3f35a9b861cc6deeca7378d5728c0af9503441144bfc82038b00000000000000000000000000000000156067cc00e82414150bc05ca2d0c0ce1c19e5276e00434754616c9021120bbf9d1c00df6a42b76c3ffeb6e32f8fc3eefee8614394c8109338432ec72f2d9babba06f1e7b826b0f2558c3247c923b2350000000000000000000000000000000002a8128978ebfb99e20ac99ff5b3088e8eb95a7b6b354d46e775dd1662a27d5adc9513467690f377d4a13766276bf87d0000000000000000000000000000000012ba903800e9641de498d8e286c7ee48b48f7d36255823b88a24cfb67f8d2b7b6411ba3304819f588fff0d730cf130e428728d06cd90050e44a827b44f14ea35e83c9b58ce4c3a7a45aed6f31c94fb96000000000000000000000000000000000b107e62453c7181b26a3accaa624a612b7498ccc50eaf0d47bbf350b3c8c54e940266cde786c608e42f59d793e45eb000000000000000000000000000000000194c2c3717a8284051a29586e540bd9e456c0169eab0412699865c12226521796a55d598f60280cdcf37b54a24c931040fda665c40d1da93b1f132070e0b7c8c2c0ea0e66993b5a3d7419a33d118d25f0000000000000000000000000000000013228e1a6346683320d8acad4a5cb1c23cfebdb9d9c451ab81335d27e8b82297b38e1fe2fd02651a8dce3838144cf650000000000000000000000000000000000c6d54add7bdaf9ff8158680f35be7f51dcd5c26a698750c7eab857140b6329157bb7aca8d7c68f107ed9f68b3a076aac14f014117a74f21e0b698a257ae8e3d6091ba76bff7912abb6bd94d41886d050000000000000000000000000000000006e1e7c15fd14ff3bab1e9b8f8b7d6244c707744708db629ef4146b8cefe68c505ea034c180fcff95a452f7e1e5433e1000000000000000000000000000000000735faa57e1c4349be51395bac55a331a04851b41d2ec98072c5ac38eb7bb03e00ed64bcf32c3eac8b34cc6e26769c3ad81a1239ad2c945f1c560fd1674ac7e87d49aa41a1f4a5bfffeab1147c0ef7c60000000000000000000000000000000018008132dcbd9455c3932155a0b0c58066bec4803eafb0a2cc30a93b0a335738b52e6cff60b379fb04b5aad342baf11800000000000000000000000000000000149ea542cf34141fface44046aee2f6c436218374d095bdd46638ebc804bb0c9a7e1e3b01c0470bb6efc7749b8f70eb73a02689cfd2c353fc1b4d3913f5a43745fffe6a87a7c223ec3b25b321584a75c0000000000000000000000000000000003f12b0eb97856f3ead3d46a8321481351471e558add0ac4e1f285e7ee8a1f2ca88ffedbc8ed21df31d599e80b8f0e94000000000000000000000000000000001315ca27c955f3826da43745809fb1759f0f5d5674e4d94118bf2f2ea0411c7d9cbc65f054c41ffbdf196ef24eb9afc55af95ab3fd062088ffbef6ed887fd39aa1d527fe7633b876187ae12e736fcf2f000000000000000000000000000000000cca2b061959fb70d383f7e247c131f51920e048dc136036cc301f1ae6ce13809551d0a8074cc05409d124e2df6536d0000000000000000000000000000000000a9692e0263b563cda35f8497d182fc05e78e7bf88267aaebea1f5f41bd1cadb39c61431bfcaef208adcc9118d4dfb546541c6cf8217c2a95792900e8fc39581b177a57ca00162c57131ea4fb80a4c600000000000000000000000000000000005bfb5a43e3643846f92310e9d5439deeb4fdd6b5dfd3de2ab3a40b9b8b3461136b03c5601add616dd87b9a72e81856a000000000000000000000000000000000212c6c42e24a3f11c30b7751f37c0101b8a071a3d56f2d10b6c9f4f84ae12079d8c4f2d216cdc7ee93abf8b9d6973394b7c3f3c4ed10bced85f36fd6dac2646c65d3c810e6d2d116c38aa5e10b29c2d0000000000000000000000000000000008adf951da1f0b64c17f84031985bd1f3561ab44c80c339c4c753a7c2080e0f57c41b79b6cccb75662e8642ae0a94451000000000000000000000000000000000d9082079fa53008a03f58b87fe0aceb121c6c004493f3da7ab37f3236942c8ac01fc28db26b87bd2546f93b12577ee57e33f394e96d17efa30d34f57eecc45d7b4ca150a31b8d0484578151d6e65c2b0000000000000000000000000000000000f352ce042cbbf1adcc42030ba8e0dfc76b4ca313e82a5c5105ec56266977dc83626c9a9b3b5c25ef459a6feb2722140000000000000000000000000000000009443440da963a7e64d90e4642861f3f5399835fc2fdefa7e87708c033848170eb02407a6a9edadad27cb02793055140fde92a31e571ec03e509ac8a70ed5788869854eef0bf578efe6c5e6468315553000000000000000000000000000000001699cd7355b0a0be2946f8f49648bb04a90c6bc8ee7fa258a357455864022db999793771a2e66adf3cea5a54ada82d6e000000000000000000000000000000000a3ebfef4ba72cbccab5e93155429a14fd61c106ed6d2c0db0694c4733b6f1730cc9f34a5e9598c60e189b8e4943efb56f7de01ad0f7b4dcaee1123bb80a71d3bc1e63ca577a12b14ae2a11d8c0fde46000000000000000000000000000000000be5ac701c69b81cd75fddb8da92066cfc9d0d2aa7f01495afd87e44076f9f022179b7d4b4781d0b5c6c52b498b63dd80000000000000000000000000000000006f2fd1ca9a34fb09d922a76943b43505f2aad16489a138668f08b9f388c67e46a4d5df7387a1c3aa23c76954913abfae2c69d21d40813ee40a718f0ead36b51f3a50e9e4e4b2de8acd33add62bfc1d20000000000000000000000000000000019489b41d8b1f2e8ac09cf3f0930e092afd74405e213454c458cfe44e5f393a88713b62715097a1aaf01a188e8ab07c00000000000000000000000000000000018471d616eb66f1dcfaf84b7d49f632e0a5306888e44c70710bb61d4afd440e5f692eefad842b5d37762cab649fbef34762d89025196aec4f87da2fcc5a9188b4dc7b1c014dd1d705223bf9fe1e7a7d1000000000000000000000000000000001088372334c452709f81b57f5e5c148e0f88dc29dc9a118abd6911c46ee83d0c6b58ec9b854c15f519d33d281ac9e21d000000000000000000000000000000000394a7e49f32e4f7d27f276892002ad034dccc8263591b5d941eb2a5e60097e757ea67dcdc5242b755fce30c3b3b64cdffb9f3e1d43aece3af1f59319a8228cd81e668b1e250d03350958dcac9e23843", + "Expected": "0000000000000000000000000000000009e68140307d9309c32763e4de857372a61733060ac582922e3822e46c28f67bea87a75bd98248466e8938abdc4ef54b00000000000000000000000000000000187dccf66e6d0593ac8caf6723033db545c43cb90a5f5486418325860b692ffdf8dcf23da9103dc65336d3cec2577a4d", + "Name": "matter_g1_multiexp_73", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000083dad213737f1789595316285a77c859c469b9bd0cf08c61884456e4fc5ef0947847186bd420af252d822419b1de3ef000000000000000000000000000000000795a6ced1d34d91bf5ddbe77fee452699a1b32daac270b4e8661259dcacbb9c8c3776043f2e149773427fe109818c87be285a119dc8cb32b1a0c5380af736114a32e9d1ca870abdf278dfa84444f70e0000000000000000000000000000000005db83053f9824116b9d14ce0173c2243a4a8506e161db7f97408dd6fa77b65d0e0a32e95062699f7aa85cc9be448dcb000000000000000000000000000000000f20953295dde557a078c981f0b988cd9da8c7469fb7fa3361f2386c7dd609bf80ccf91cefd797eb3a4f849b2cec4370bc0535bd504d7b9658e459c2e79b86bf4e718baa82b8d6e624fba0eb141c726000000000000000000000000000000000000bc3e40ec1b6e863f75e4adbcb8b504026d0634d1d3769f7795ed2956bd450e68aebb1a9d11a71fbe5b51bc79d97aa000000000000000000000000000000001703e1fde7f2c740ca3224c1994282e633292f86095be38dde3673b78729db84bca33ee820532aa92bfd32728d9756404f3fa09243c01748954d84f4deeb460f3ef78f9c34296c6a092952bc463d72840000000000000000000000000000000009622c13e8924441b0043770faaead6db793ab818532c7323d9ee9a8d118cfd2a578e1c13723c8bbdd049b1d8aaad9ed0000000000000000000000000000000009da68565c05aa28648c0d0a0e185335b4e58903982fd361fb57f544c1f253a55e8a233b341537d78c4f229ec5f935a85d84733ccc41f71a11d61852fa336df566109c5538c2c5f5cf2af961e93797fd0000000000000000000000000000000005818b813993d7c346cd70190e1e6410974e64e08fb0a70721a0ee430dcb0d92d302943836343e274b26c69030226c0d000000000000000000000000000000000ee84b6b251c9d4f7e7abf843c73f0456968e23e79c54d8742cd5967737b9cf9ae8c6030722134c376c7c9433b749563feeb95c32362014caedf2a9e066a775e2db0d1322edc86759faa99bd70c05b580000000000000000000000000000000006870d696789986991a222b988c3623ffb51ce96ee35140e817887ea37068ec77d8131a97579f2ea29a5b45ab55ec5d90000000000000000000000000000000016b203c189343e67e10928c2a45259593cedb1a016491e94435a0823522010469729bd69af9c3bd6f4e71e96c7d8ca72edee2ea28b93b2daf4ff927991769a9c69ba16490b5676074e64f5e91fa994a600000000000000000000000000000000191a7f7469739ef4da1fcfed877b875c4b0af45df7aa9055b7d5f0c1360e4c4b7b67958d03125fade281c663923670040000000000000000000000000000000014d5256c242839e0951390f00affb226ee6c906214d8d7dca7e4fba7eaa8b1944fe4f1f93bf6ebb21b4a8585e000a76b7a07e50c1fbf1b388e9264c762798c31fe76761508d070f06adc63130df07641000000000000000000000000000000001968eb742dc0e128c94c1f0dab2ff3b0d300966537293ea16856e5f3ce5e12164d9c52fa59e08481bce84f3f87dae8f100000000000000000000000000000000098ec0e7bc53314fc8729f4688b99c3d87e7e2770877a30898c37c68a5e0a4459851b8fa390cab18e7cf0d325d906ce4f0056903b4508cffb6334bb5f645cb553a8cc61ea6765283f933686f172f8360000000000000000000000000000000000064ef5e6fe9de3e86ccc7a8b809cbdd945eef98e8e6cfa82dc64ba94070cc107090427c13ddd3bf25d542696d5de44500000000000000000000000000000000116b4babfc4b1a7a36405f597d4afb478c024805495e1a412a3ad5e9ec5f01dc47411ee6e81a9477677b89291e91c2b68031f363c8b0062b34d48f4c2e5bdba884005e52f77ac04c2f29dc7ef10fac0c0000000000000000000000000000000014d07ad766b50a6150a50decabc56f04559d1b196b713be88b5543a673ee3f4499e42b58c532e38dca0101f639aaa9fe0000000000000000000000000000000001678e7e66f44cff05163ce249df65063c4ea2d2517a31f42dfe76f67041d7927ad4b0efa4b30c33156b14f5127af190cb146e27a9d36dc698e1982afc945af9500fc5aeba719d06d0c4e4eb245034c6000000000000000000000000000000000745f042a917dca8e35c8f0301612ce198f75144e145a3c3041f4ecf893360eb0b7fdfaeefe78733bb88010d6a7b9bb3000000000000000000000000000000000e8879142826593a2f1214eee206ba69b7962e9a10ba014af5daccc1e4a2d3c893fa47eb533cd0c0a9fc1c09d389db19d983f98fe5112a55c23591bf4e259d072f893944741d9941a00f907749e3c9990000000000000000000000000000000009da4fdf5b86facd674ffe6d91d03674ebfa3aeff5ca2a659777be20109946b1bbd759d4dc2d9e859d587ce50ec3bf01000000000000000000000000000000000924985f655b00fec0bdacfc6914eedab676a962e21ffedd83be646dc17f5cdcdd3f43a9ad7ff9d976e4828b4dd219b7a62f99ac46f986f2f29f0ad3da0310f061e691955c711850a2816ad7464614a700000000000000000000000000000000187414507425106691a2dac49fea1eaa14783b2a5b79a945fee44957619793be1a68aa110867ea405a076d30568ecf3800000000000000000000000000000000034e932247b81bda0a54568f2887824028d69767b9131c106a4d204c0b2bfb929b9ed7b3fce1e354e405aeca8a28d92e7ee01b0c9c6a6ca1fdac35d89c803bee3595f03d9d200affc5292d8a7c6720b800000000000000000000000000000000027361b6341bf8985d79b6dde029a9ee54ef441894f34d60a3324edb502bdc78ef60789e5ce342c240db0fa91bbbfd00000000000000000000000000000000000bea3c850bc9d0860241fc6de65c203d5a11e6425faa503c37641522fba6fcd31643209329e6ad75a3dc5e4a4790db4a297fc700698c56877be6764f48a836d210bb33e99b5735da9837882269af9b45000000000000000000000000000000000fc7095889f943697577c8867b411ac925ea7182e47a7cd19387dcdd48fad5e558de3d80e3036992ba5fb8dd7925774700000000000000000000000000000000160f1fbb346c48a6cab0105d343c55b3714899e931e7b4e0abe68c4fc7067189181afb9c040d41e4c1f7c4e2f1b8a63b1b7ac02db15cebb8af459290c35eb5a86cf98b86d8336764c6bdda6698b49b64000000000000000000000000000000000bf1740d01ece251c0f0ee4f798872eda7f5a4ad3152d86db12844ffa88ca52835799f0b2601ed1bae6d4850cc889940000000000000000000000000000000000557f274109f745af6cd965d6e706b9ea1fa3c295cbbdb203ebf049c1070595ab820efad6652b1f1ba4e2d331b5bc6da5d1a3f78a2c2ab7b85cee68ee670f50a176e988a341303afb7722917f442fab6", + "Expected": "000000000000000000000000000000000c57ca082c662618951201a98d88170a9aa076fd1fc48c8ababdcbb09b63c793725261acd370d03d28ea47c0ef176f1500000000000000000000000000000000110234e4c6a99c6d1ef8b43fa897990d605af9b469045dcd0ead52b03f9f90dc441f7fe5e624349788746802e4f74015", + "Name": "matter_g1_multiexp_74", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000ca64fb3ced1d15f94e9b234e6f6fe59d805eb0b50ae29c9b31514ea5c6e79542688e871de6ace893868fa0eafdf46890000000000000000000000000000000019c60ebb5ca4e605e3b0eabdec53f566c9b96a143631be93250260560e47a2ff6b073e432cb1f9104ff913616e7d81c834aaf86eb77ce03f1d8eacab84d5ff98a565fd33a9a2c40f2a19d7c041a7e2a60000000000000000000000000000000010c867a070e161939458694cd4015b76bc4c76eea884d9dd309d6642436a82bc76ab57b2c0e2d3ca61f34645db65f2460000000000000000000000000000000014d9df8b34369bb23fbeac29aa8c35b346992d847fc2b9e3b96345f4a2245fa8eed505daf17edb4090726052be75662308ab2065f1d2278caece0939cbbab4bcbe3eacdc80cfae6e4500a5195883de000000000000000000000000000000000017ffdfa10cc8e1a8b3751312e5bcd09772462618b8bbdca59a60701a96dab651fee0dc755969e1c3a1d2aa4c11e48d6d0000000000000000000000000000000005c2aadea5a4b11077a2a1641eef2d3bc40c2d8001e9853e44bcead87cd968ce41ca50644ea0fe1d0ec4c2d7eda9dcd058c69b55bac97a633f3ed7816e77e2a26cccc029f7e7429c86145ca4645eb4150000000000000000000000000000000012bb9b8a1537c2856d4b2bbcc6fdec6d69eb6196d795bb0f1f49d8a886076e7fb424f63400134622941b2b88ea61b8e30000000000000000000000000000000017206fbf293f1ca1f2a0971b920e702ea39996058111ac2c041c12f58f67037a3840955e1185b413859a6f845b333b58ae7faf23e841bd53683521cb3cf215577fa51f0f751714b6aafe5c740f66208c0000000000000000000000000000000005eadaee4c48dca28f9469e882ca8ccb71f82bf1f2cb5b7f50b2e63a05e78415b3c5d0767a27f19a0b1c88400116e5310000000000000000000000000000000017e95e480a145b5e897c7a1ecc1b21c5a000248f87e74bfecc21a3cf8a06c04fd075612a62145ac089f208e567e4e12072022cdd6d942158bad47a53a9b0c3be910a41036874975724a5cdd22c0128710000000000000000000000000000000007b834503ed3e1cb74738db29c91f415beeb3ac5b75bb2cbf11f4a9cd1608ea6080dd1bd50c195dbf5ab6808fe9d6594000000000000000000000000000000000eb32afb90ecf9923ec22a483ffeca3a15d358013e64e521aa42d3db1ed0397e07a85321492e0693f8f041f4f8346c6c800ae0b956e38bc34cce55bb7e88f1370a30fc8ed0e3f1126c68c30792a2cabc0000000000000000000000000000000018f208e26fd7c03313df686e27bb6ea09d9a998764e805fe6182ee221cb9ff1552e4db5feb91b3b2fa595bc32f81898e00000000000000000000000000000000137c06c3f9eb27f1c0546b3c7ce879218a309dc37c0590fc3e151d9f7fd5963f0fda201faab489dce0043c3180abf753a57c3322133d6ffac661c888995e7cb067ca1309f3e9178a266f1a410a79c0130000000000000000000000000000000016fa49bb488a35ecbfa9e714235790cf6e7c3ea46e6a9a424f59c63d018206740e9467b0575077e86091ad6e0f9f56b6000000000000000000000000000000000197185b7c82ab9e6dc8e2a71c94dde328c923eedc6e305d8f36f4b636e7662e501917b89b33877cb2094b523c969dfeebe67f3d067b0d011abb31588d1b2fa9fdf8a56bc46b1a0196e926d4ec7304050000000000000000000000000000000006b797e2bb8c0c2a5a6ef8d9f08241d42299efc8af049245c254a2e4bfd122a01954bc596750942bf7ee467b22bcc528000000000000000000000000000000000a655491c6381e81473c23565082544d9f223042c82e241b1cb8ba48e847d98a373fc68b762a600489cbbca612defc61fa1d6d0d1876a67337d66c596fbcd7eb22ee308e4a5f66cedff584f1441be6a7000000000000000000000000000000000d7b7ba451334d1391a51142c4b7cecf0032fa6d28fa7f36d2d43ba39c6418946244da3cedeb2bdfadd453eb4d54d05b00000000000000000000000000000000127655a7acb4e3271a188cfd287cc1af890756e340eb4648bf3ea3e469644e6d21f63e64f81ccb55b9b1e0a62ddf58b5f0c4ac919efdf3d0e649126da7f8ca3daa30b6ca6f3be6854c0f447a63cf211000000000000000000000000000000000129442dedea08bee8661b558bdf8c22dd391900a501f1841c77359b20c1a1ff8838829baafd2a6ab5eff31e3f9ee884c000000000000000000000000000000000ed7c27bfcfbf9b41c833fc0d8573d7b28a6d788ea3cff4d96900559cc63969ac1d5fd366fa705357626eacf402c2ec560d8bf380bc2223efc779a747c0a36f8c2b18c3e821e96163bae14b18f3739f90000000000000000000000000000000013a11df012f8a55c263c5c55df0fb682e685a5feef160d77d26db7125ed08e6605f3d67878ec78fd064487f30228f4cf0000000000000000000000000000000019292997c874c72ce7c432f20da1a338e9dc433f9257b7353f99b5b531a9997bc3a3405b0aba89ab5a2f1cda98dd8199006c3a7b5ae971e4b0ec34a1007a02cf8c55f067115ba00c5967f70a7dcef9d600000000000000000000000000000000006a56b816898a1fc9954495b711c493ace881e3989207b2f862dc41c5fe346fc2eee18adfbb9db67e774055561af00600000000000000000000000000000000013971cff1e9a6ce35a7ae40118a007518bbdc5df5939a90fb263a9c345a70f4eef2f94ec671ac6964390d0478cfbf728f29e330b48230de23e0393bf1614cd26685cafb899db5a164497955d3e98be40000000000000000000000000000000004962ef115a4288177df2f0e4665e5d1976fd027f7f87a24ccdd0584e265e2f5cf0a7490dc7824f5eb26c9569bde9d6e000000000000000000000000000000001544f43d961320d59c65563d5f04341a8ec3e6e64fc2dba7e953652232d615c90eef2c859525fed99ae6ede2c39f510a861ffae8f62572938925593f7271a56e0f559b56bf97c454c38547a2185e2ce70000000000000000000000000000000004b250ff8bea739fd73b3c3463617eaaf3b6bb9db11c2b915f7435996bb4cff3561fc268d2cf0db1705711de522382200000000000000000000000000000000001c428a889955fbb5fcba993f2defa5906ac7b6a3fee6c07f52de8d54b0665cbea84e89a0af3523213fd19f7d37944012dd907071c2d39fe710215d174452459cc31d36007a1b5570a27ca2e42c8be5500000000000000000000000000000000106fab277085c88a7d664587f67aac8de95aae908177dc513fa24c8115fa23db44eafa7075b036242306002ee6918da80000000000000000000000000000000009e832e0d01bb5e89460e2cab772c308da07414ff8b880288c7b55d6390360924b806c71c9f9762d84d8d3cb3c2f6a6199893c06db2dab559f2c374df4298707dc1815e55034dce920ae7b1df2ec8d23", + "Expected": "0000000000000000000000000000000010224cb0e43534025f8ba7a7c426355a2091473ab16a752a9819d8e5f3eb5b1b5c0891b1c0cc0017655dd8aa7102cea80000000000000000000000000000000004313278c1bbc33ae2c3010c50be0120bb3ec794d9ff77fe97154438606e5f6f04c1dbf8dc01b827643a31899342e1ed", + "Name": "matter_g1_multiexp_75", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001812b7bdac748d2c0f05f10edaccd351e35347a4a582671762c0567f55e411839ec0a776c18cd71cc6de0c3a3b8bba820000000000000000000000000000000011afad9a48c42d8c3bf74dde15d7b744c6c141ea57e133c9dde7fd762636115e0296a647fc3fbca8144048721902973fd8555388bcc6791802ddb6c0f4cde44f45ac0b5d7ecd918bc34fb9fdedb65b94000000000000000000000000000000000f4900ffdc92661bb33e7561d08ce7757ae71a2b5ebdf6427922454044c6c6695e249069e83f3053e8a8a0adb5d3d3d2000000000000000000000000000000000be84ebce32bce4d58557422c7a8c4020d1bc643a99b00231a4d4a06d5dcb56bba61ead26fbf07079e9457dd4364ab6d33e5999498978d14c9de06f7beb2fd870f6f16dc42125fa496606e65c7466c0f0000000000000000000000000000000017399488c58e24c6e1f5e9a04291930595389536480ee6dc493cafa7f0e85410bccbe5c5841a1a0e495830be7e32c0da000000000000000000000000000000001055ca833e53172ac1d2d3d7c6fd625dcc72556e8d49bb487a83e56deabee4fb672b6cf7787d1231c760c2b7e9d4e55e7894a51dcfe5a8fa4da1745a696c870b353fb03a31238b8744840a78084bde48000000000000000000000000000000000c57fc0c785d6b81d4831ba71bf27f9af318a730a9502917a68397678c7ba22f21335ca2fff5bd495676faa418fe21a9000000000000000000000000000000001012cef9cbc88b838492b6a0074e0e5d24635d36d669288acebfe446157a202443fbaa5241b288fe418e1fa50eb3e65cfb6a294589c816e18859cec34262df6490a2af6acc7daa3de861198c5bcf4b13000000000000000000000000000000000a2a4bd7c7a79c2336b05bd5e0558736697c435477d4d0dc790033366ffcdecac3bb9cf48d1341835f7a42e17af833c9000000000000000000000000000000000ba384bfc6aaa8402ff869d78973c68ccc36c20a839da8d570b6890614f692f3a3316f0eb45e4afee0cca078cded752e83c4a3460caa35fc0e7342dd2da5c7b6aae818eeaf5a2cbf4794387180b95dfa00000000000000000000000000000000143e594b8762b4f821a6cd294251a114e248974494bd16a66f27192d3c2dc56c19d886b6305d420f8b81b22a2ce4faf10000000000000000000000000000000012fff0d7edf98633e1b10ba09b3c70fa0ea8674120160933689115275da6f95a8cae1ec665f89ef3c5454dd91d291ba4d2b65c1580bb46e3a4cd9d9c4eb7dc998168c66982448abf3a4e08cd12f612b100000000000000000000000000000000159734584d9cceceb9a27808a5bbc1be9acc15c6d2edad81759312898be4efaf85420cbd004102f7b051c83b27bc3fba000000000000000000000000000000000eaaf5b8e35ea5d52bbba19087520a96348b418159e043d3b39c451fb77d5b98aeaa43cacacadf3e6ebb503f49c5ad4c120892aded230949b83bfb2dbac054b83a9dbb852bd0ad85dd1d7f715852306f000000000000000000000000000000000c62de2a514ba6a74f66312553218cfcf49828b6f01ed05561b54d5f2a87806694ada45b80429e60fb985d9cc39e9c4600000000000000000000000000000000146b134c46ef783488e0f2d6d9b7039971e8ab7f3c29fbb2635bed84b44013159f483df0e7f0afd038b64f9e5cd105726af9777a58539e5aa8b1fce0994e0e1cdb5877d93ed4db715c5aaf74d6a8bb1a00000000000000000000000000000000189f02eda06f2d39974098d874325e4711a3f4dddf78c1b9ffb025425c8abe6dbcf5a01de0ebc802816fd67b0a9882fb000000000000000000000000000000000b378df4be4566190679691561aabd7182e68dba4ba05cc67ae19cef483fae99f4cc54540b5a5180c3854f5a82b6fdd0f37e2ed8e96921a0f9bff8b43d432b382d7b59938e269c381351ea49b8c1ba2b0000000000000000000000000000000011c0ed482c1a1f030fff7395db725633a60875028e2a7763a1ac801f00a8f4aff5e19e556516df899cf5e798197f6880000000000000000000000000000000000fa7faf03f2f636ab340a9d27d9b5a66fb8daa9c083a32904a4407d408cd3a14c17734d7a14abe3655979230e1a93e4d23f4a77a2c34a370a9b59ab1cfad77212e433464d0195f0d2fd20c69141389f500000000000000000000000000000000101f93857688bc4e4da2c5407d8bc68b9304d27c89a44daf7cebeef81ab96d89c83ac34ccd0dcd87297929551810e47f000000000000000000000000000000000457eef8e4d47638f83aa2165c0f2581e6a0886595f03fc41319d6ba71da0193a4cf9f52c39c79327a69037b11a382f696c59b0bc6dbf66f42cfee34413cc4cbdae7a61e232757c75474818591764d6f00000000000000000000000000000000110957948a78ad9c04b7abea4d1caff1de20b5615909c2f5b8ab7a1dbd02b9cf2ebfaaf3b21908aeeae55e47b9a21b7500000000000000000000000000000000168f08d45ec66fd4c9a94d82d9533aeaa251186478851a421f097d00506fe6dc0392114115e3e66d8874e0aa4b15cca281c180924f1d982bf4b6a2bb1cac590cdfe84198fdecd87364e163dd988f9b1c0000000000000000000000000000000015fe358a596150d9eabe6f18e06d562f9e6c42e9df7ad9ef57be8c47c5764e408efbedf136059d0e04f81d4838713a83000000000000000000000000000000000ff7a343274892ba23daff40f5f8c56db9a4788483c16a4a0495a1f696d3304c6276ab5a6d7b3cbdce14e9711b033582e44748b9eb1f44b5fb143cc8deaad23047bc5ecb8059705e7905c37625d5e2d30000000000000000000000000000000010d66f27b2da2ffe49b7540da57c25f0d36de0c43d04da9b123c153ba3eb63f3d26d28d4cc4cfef2c0652010be2f9eb10000000000000000000000000000000004d4cf53935c01bca14c75d1be55e7473d17de6c5a2d69813df90c7612aa4815ca6ea982222793ce66bd1c69f6e456feae04d7723b7c9cb0574ba744bfed8f8a347ab740bdab99136aa71a6d635d0d980000000000000000000000000000000008ece81bc19694eb40ac3ed089d8fb0cbed88371c7e314ece92547151165a017b0a5db4eac06bb2679a8d82b296f522b0000000000000000000000000000000017732041d736996351f132c92fa7249483612bcd79532156694314834c04d3b99579d44628c52eda270ec7c3ca7c3e576a794685a342ff25dd706e4df725e3466889d8f08a27ed2f32523b117f01a84e00000000000000000000000000000000026b3730efe162d58adc8d4845706f9bfe8ff54116b518d6c3b2bc6418997a44e98071e83566a905973a2d512878cf1d000000000000000000000000000000001449b0e28d1c43ced7cd687a550ff7669df47e80d3f2ee621b791848f1f7d6cf6272e39c66e8a69c81aeb67b06c630b2ed3f23c51953e46d400802dde46c374178ef379d5c1b04d25449891f0d5623e5", + "Expected": "000000000000000000000000000000000154edd700b8cda3a0532b2d6e81cded6a9662547b7d638f229ac44975d3b4b2f19816eb664e6208f33bf6f8d070fa58000000000000000000000000000000000a41ce7605d7ec592ec3a030307391ac64be5df9a7f8ff9b7ba15f7f6931353fb824ae8aa76b31466b7e06cb89fbc1e6", + "Name": "matter_g1_multiexp_76", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001227a5d20faf2f8d9242e1a7bea89b5d7c41c3e0d8f2629b4004269f9babd2521a97cc23075e13a53f4c66a82970ee76000000000000000000000000000000001726ad8abed312a369001f53270b5e7ad8f3f2a031804ac055ed4ddb2f40eadf9142416efbc90e84f499e07a307994db8c8e071da1ae8f615631759cf33fdb876ab289a6bcfa6fba2693a58f8601dfd1000000000000000000000000000000000a07b5276098f9b3767908192f91473c554eaed23b810d3b464a3677089c45e2263600cc8d84766c7c67d9b5e6a057cb00000000000000000000000000000000175af857d5b53d195a17ae246208b55f35f4ff193545ea5a725a70f11fdd34ad2fe22431cec7835d4fe3c401c82a93fd8371fff9230243d2e6cb6bdc4cd97260a8cf0362d18b9ba8df512d2a6f5563dc000000000000000000000000000000000039e109e0c2ccb5e6cb4c5451125047bbb854488ddd74fc4360430fd80f16db3498a8be9514099d3ad50ed4376bb5e50000000000000000000000000000000003dec8af7f6805ff9df65c39262959c3c80f271d2f0e53e7e719fbb16080d7d90a1211a6b4d0513c771ddad7d3dc009063016c9a9cfbf336ebda090d3f2a1a1b265787e1917f0148f82a9c0b66b21dc10000000000000000000000000000000015a00f549c3a050a5ffa8427bd0c8b90a788c6f9150728b037232ce1148c02bce908f60ee367b70d0c9642114d6e657d0000000000000000000000000000000016831ffba7d7d0bc239563e9e62990af4f740e57ca56d0d8826a9738338e9a1d2e8dc2b8869d62090b06f5a3f68bbcd36c9f679167d5fbb29250834c9f65d3025606e2af20aedec309718f95ba01e90c00000000000000000000000000000000165e447cc890b383b46f251531cb6d29cee835fe2a0fbe14c65f0998b2911ba86337ba79decd2701a4db1916e01ff4bb00000000000000000000000000000000007bfb52f3d4a281238eb65565af329b3e043e412588ae00342144d168d903cdc9131775ddcb5217ff692b0f922504ddaaa3300f5a2fafab132f5f4662c1d288210e7502ca2472d060aeea6f2eab2d71000000000000000000000000000000000ef8ba702c88495b63ac012fd9ce54b4a7ed67b5f7d25bcbedf951455fcfa95a8c7775c5ccc875ca5bafb9bfa1af738e000000000000000000000000000000000e53e18a3e7d294b508ec4084cf57557dd1a96ece8eac9873d35e4f1ee812a1380bf56569e5e797ef54202b1ea69291df6608f7c036c8fdc335601ac55e869215eb4e626f52bae813d45b827df2afd4900000000000000000000000000000000021ef16de941ce6394ebd484f6b9de12787aef9e7921292106e6c1b18b8de5c640e448f53abd536953b07dc41db21ec0000000000000000000000000000000000a5d482a1c20571e03501b89d2bb4c6d3251bf0b015f23ecfec87dd7cfde705f946c311483ffc84381609c394c83513a0cd68c59b1371c7063dee5732182961be90b95247511a5b564d7eee8d2c7c6470000000000000000000000000000000019c277726fc9c53de1ef3aa2ae6e15b360a98b4a2b27f9057f91eae5b2a308b2f5d618d8e458839d1d60105e4888e7920000000000000000000000000000000012ea8dedac124f05ff58ac72fc967e325e00e83aeedf956adee447720f491ba1bcee564f52e4f0e53faa106ed8088d4cea52329555d9b79eb1fd6d186df80b25245ba9225553f402cfa6037592f0b10f0000000000000000000000000000000000483da14288400f7b27d712ad849fd7c068db47709f78b297c746ab3e15f17f20130b415c9a1b024bd5b24f74428f0e0000000000000000000000000000000006746bb7d3a38fd833187a16d5500d394303e2edf7d5341d787257a9f811411a5cd586b300b7b4398f9d266bcc27d9cecaf39f2a517d432d1653c37fd9a6c4a8a811107dae428f4b2af3b12e4b6acea3000000000000000000000000000000001700795ca26c2cf7dbdb64034e45362295b7e9c60753d728bf689239b0ad7073b29fb872aff047605509ecd10cbd4fd2000000000000000000000000000000000266a09604de2ccb74c5d97dfe4e9a74cf89d3612de9b2d2d39dfa3362b500be127b83566a61df49e639d548a0ecfea7ff0bad6dae80d5f47dd8c208fef0f3046cf1040112d18c596eeb934762977cdc00000000000000000000000000000000146b2b839ff63d376db418a51890c46b0e3df6848a5a39a26a02673e93ea8dec5079e89a333c85785eb0cd1d67b1e101000000000000000000000000000000000f57e8e4cdf2670dc35a12072923d334523e7ccaca66795e3a762bdda8efe5424f88ef7e4c48b0d6760234ddaad4d7370d0c40e5d422685c5c83716380eed82392ae1dc6074a7edb5759fa34a61db2d0000000000000000000000000000000001989144efb1979a42399f93fa80bdf256316f6365bd82b89e0e2371de79ce9de2435a6cfe9704ed710bdfcbc8cc2bcb000000000000000000000000000000000084230cca1eb5defbf2f2ee29fb2c47b417919f220c25bdd2a017b514840466a45b2c00047e9628852d48a057d6335ad7e93a16a443d5f981a02f0b6866536dadd276abc0998bedd76b168ebc8e31b8200000000000000000000000000000000128df806a651c43c7e0a3b2c5833bf158ea40953fb0efb02620cc4ecfc4c32a409a8bd9e98e82812b54d027b6346afc70000000000000000000000000000000005e28760f1e574aff9664e373622147c08538ed45cdad72a546e4b5840758f5ed442f8cf24cb0ba35902e64d084406f32a1d13a64c03585715908744481c79f340b5bdcdd88d685ab8b91722ee7ab719000000000000000000000000000000000289520e710e7ce4a8a671cb00a015dcf40ee2a69309cb89b514f6fb2c6e8fc92a49905893e3e0e9567956fcc86dd89c000000000000000000000000000000000d1329a4174f802680dfe8410fb45e23f96eef4649579ca8e29b3040de33cd6bc485d1339afac9593097c70a0312f5162bc6979fa2e386abec058683c6d74de31af3cac21283cd5e4244d7edd94da96000000000000000000000000000000000175f1ed2dcd584f9c59c9c747ea1841792bfd9a64747f84dfe32e256ab5a48eb2dcaa337990089c86b3dd589d276e2ce0000000000000000000000000000000014d8bb6e278ae9bd9df2609690286be593eeb668f5e2adfe880e1d34276ec3bf4ab5514c7898a6504da63e0ecfa49d020f1937936cc3766184e47f39acfe5af4497e8edf77ab34083135a9ced61d25ed0000000000000000000000000000000018adcc61d9162790bd8c19be058afcce08104a952b15efc276af8a8807a4d2edcf8557aa03a297ca01d6a3869160148b0000000000000000000000000000000004338e5f7a12f2ffdc8158a51b14dd36934f01d7fbfe45e18276f2432b1b8210ba6bc5f246a52646bdbf99ed91f2f48f639a8b60a1849c71688a11e612b315439161717f525b5deabbce75808470166e", + "Expected": "000000000000000000000000000000000c1f9b78641053cdbdd6545691d1a5238389614524365bcddb07f9b9c6c654e58a40047084532b8473c7d541ebb187ee00000000000000000000000000000000028eb1aeec5e4672c41eccb45b356529e5331bb5fb0ca8f9e10b20a2ef1ea911f03af896ecf7575613bce5eb8a0b0837", + "Name": "matter_g1_multiexp_77", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001242be79cbeb2176ecadb07d205d532bdaaaa26bf9103371f2c4d86ed1df72ba8b6d5c76b7aef25c743ec4f43e5237fa000000000000000000000000000000000d2de7792d0655ebcbdc123ed6093ba68948b8ea156a31b9f23d1abd948f4b2ef2f27a3cbf72b9e5b3e966576e9ffbd5f3efcda934ec9d2ab05f25d618e5a483e830d0452a88e980589fcd7cfc39e5d8000000000000000000000000000000000fa50f78e45b1b7b61f8508bb5842bf59d0f41f2a8192cccec6e56125ff94b402dc47d3bc7762f3196a163fb148105820000000000000000000000000000000002933cca4d82c6f89ff8db5f9239ef8fee2efdfdfa22e0b4d0fbe223910b08060a77eb4328a05ddd31d205861db090ae4507a696cc57c0bc49fb4d1686752c71c9c816d7d09bd66910b23810d475aa02000000000000000000000000000000000c15db9d1dcf646bb4c169490256050ad5e408d1f45221a9b4bf02f7651fe93ffb892c98d19d730bdf3971281c9e2e3e00000000000000000000000000000000150a6d1978ec63013ef3dd3b258ea3a716c1e564469d2aba343f3d15c30cf287b706b9eef8363351cccb79ecdf5aa189518c1259f23de4cecd5e3a40abef5662b497ebaf16240f40ecd651d2ba50af07000000000000000000000000000000000f7e810001b9e3a11a535f6744a0dd357cffa585baabf065f1e72c9bab5484829a94159c72ff2221406c8b15de465f8c0000000000000000000000000000000009d48808fbf21370420cad4df7a269e1eeac98d2aa5ad5890ff362d91cca5ab1b57fb079caaba3a135c15515e98c6b175561616c195ccc1345421d8a6efec48f0a4dc8e89ee89599839efaf95c38655100000000000000000000000000000000191dcaf13a62fd6de0bdd16151b3c27f54b40ad82da1299164da87d0cb7b4c769f941c39fb4b68a8915fa95a5ddc0e900000000000000000000000000000000008b0ad7fa07edefa61ad026d42df18273b6628b65a4e655a98b705f588494d06c37153ecdadff83d94739bc254d6d8f837c77734125181c72454bb2d37c3725cf1f9b6d6f42b721bca469fec154b3e260000000000000000000000000000000005e3001f37e840a9edba48b3b436dce520203b0b36c3871933464be1c41178f7a8af9b14000b713ee8fc0faf5cc1a870000000000000000000000000000000001732dba0dbadbe7db31ea6af17520d791feced0a7bca298b932f51f3dbcb355699db533cfc8b61d35d1a346ea5de8032981483aa66e04351f4340fd2b461165b9a9983e91c148da78d3c8e0c69e77de400000000000000000000000000000000072e4d38aa0e168255f1d69ef129642b4b1b57289e630455b147574b03d17e3cf0f32326afb7c45da468e0d8c2276da9000000000000000000000000000000000b60685ad05be8453d5d272c73365d645dab6c50c820c1fb7fb50d82eebf9b03ad3c8f711140ddaafb2bb128b7be2e6c9913da6f756005ca8ab900ab686484483af07df768209a16d807f8b88b9334d3000000000000000000000000000000001401e023aac71de3398f89893102efa8760cedf47938a655983d73ca8d394a239f37959e629cd908b4e4f5e55955b153000000000000000000000000000000001458e304efcf48594d7094d30a804742b08ec94ae479cf5d4e0575828ad92cfe8e11847d6078f5eeea4308a8f0644172188fb33fb359f21bc5bdfc85d39676c2ca0a1e619bf8a8e8de62da8818bd6cfe000000000000000000000000000000000d446202ebd7a7995a4e8aa7fcbaf6c4c4591c4bc40b374720752a150b452b461f59b775e3088733ca967854413a9f0a000000000000000000000000000000000d5fcb5510c0f7ee77c7584631149cd494a5fc496b325ba93ac5f801e34c815fe562be4758212f32ab0978930d142adf5525ab4c4468a2ec0beecdb7fb072f28260ebb3d9da1a4c274b2c11a087e814a0000000000000000000000000000000000e034e4027e846a8608680995860b2673854d8fdf0e61e2663d7e0d904b6725ff28bb4593e7bf5e2c252d9c9710e39c0000000000000000000000000000000010bbf60b95669468e5dbdfe912dfeae9945f44454df62ec116b097b867b14c402349af692490269797a30639177151945ab5a55a5cfc49cf6c36b5718e108f8d006bf7fa1ec3dc7a7f9c02a2d1e3fc5700000000000000000000000000000000095e1315b3568e8a069dee00c3676d5d6ad94a2164795ca5f1418cff4a25052e741530c0df6d50c5cbcdd55a084227f3000000000000000000000000000000001993b036a3225289827691296b51ea4e42735af0506b317932b6719a381a59c89871a2a394f4a9de0aba3bb9a2b881f86ce7aa7dcd01c1b7059ad3cc0ebf5d19ceaae633160a968c33aac5dc6adb94280000000000000000000000000000000010aad99bc8570d83847a2a2688fa61d5d0ecc978ae842715a084d99392db343f581290478bc1bfeb8bb692e0d6fd58ec0000000000000000000000000000000004f82c0527d3e9329a6b460f1d781f881073b87711771699e9cc8c4229d5112d91d4357380c12c120313d2c9eb7bb427854bce63dcdc0cf408b43690abbbbdacda5f3ebd9d9e462f89f9f50a9f7bd44b0000000000000000000000000000000008ec7244587110fd3fa0e1888427fbb3942d0885e002e4f846fb749bfc4a82bd7edd15cf81af454354006a2ea85234f6000000000000000000000000000000000fc7a19df5adfb5a154f32b9022e54b1560237f4319160c9c945b7bf4b55e45fc86616d3ec3cecc177c9f6bc54dd2cdb7603824b834a83c1c408243b51cd2c2d31e2ee763d69e2ad6d369bb6aa2396fd00000000000000000000000000000000037ab89247516909dceeb59abb90d6968ddc3ef3abffac93c68757f3c9309d145cf9350e4d8f85db810cc5f156f8f126000000000000000000000000000000000289168c6dfdc25ea10e1839e10ddffbb25522be7ff80ef321241c6cc887fc7a42586dd9c1686c6c5c2e4caff0278155923c86e91c48582f19409b962be361da5936db02b6862eefc288f9a32d5f5476000000000000000000000000000000000523020b4c34e867e75cdc668e541cfa25f2afc35573b2db083987fc585a487f1eafbac1c4267d2fdfdc5d2f94c51a84000000000000000000000000000000001581bf2744d78d680c9bb38a3f0fee76b6f0231f011b3f7ab3fd59c1ec6c99fac518857dafd410bce2e8610c6e5efbb1e1b3071b561a80aaaadb5cc24b348a2b6012340d3aebcca7e2f56983a8a13bf9000000000000000000000000000000000615745e737980a923e87c3ef72330f55e38434b3974c1cc997a9d1136527de9bc21dfa73ea0d33d27324a53f12bf6f9000000000000000000000000000000001164b6ac376ef24ce3cba8e2ae74eb58437bbbedf68b4d0b6e8b7e213a789c8c3b7f173bbe52150faed93fa83bce0a9db6863b755d3dee61328a60f585531c436663bbeab9afaffac49b6f0b57614eaa", + "Expected": "0000000000000000000000000000000016e6cb1f899ee8f3db4b934c1facb3928b08fabdce74f569a06ae6eeab201925f6acb1a47ffef3c608fed32c949786a7000000000000000000000000000000001796fe817d2e4a69b4e8c539f6f2179a802cb02caaeedcdb316b3ec6571c13c349e115a7a05b296d6b182c8a618ed918", + "Name": "matter_g1_multiexp_78", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000cd7cca90c8742e7f541981a13b177a4e639195af5f15cee2ce37b01d50fb8478a3f0d0abe4312a4d92a201b4dbb030e0000000000000000000000000000000018e2a69bd1cd9bb7ea75ceedf28ac9c9514e8d28223af69dc991e46a03d8d272d267842f30552583a1f08a07188058ce13ca0cfc742607bee58988df361d7cd5d809ba4fddb209c898cd555369fff5660000000000000000000000000000000011cbbf1ee7e9cf8deae286ba67ab0eeddabd2471d2ea15e86c77c4f2f23ce38e17ac3f3e3c2a40a1640bb3485be4e59600000000000000000000000000000000108e9f887f86f03dcbd515501f69a5983b4a6d707c26b69cb9ea7a387c5a914612ef645cbe81bf29ba91d209e839c72abcca8ab454fbc576a2b910f140b23c23b14301c19e1f47989d78eeecf279862a0000000000000000000000000000000015c1856c661396f8e3a477932e1eea7e124b2e9ae0dfb1df67c4b3928c462cfbb3220c4c2fbd755fb6435e144a2b937e0000000000000000000000000000000011b114659fa71c3ac2412d5c2cc1e184f05a45871e5ab08fbe5eff68ef9e457c4f3e2bb4f16d10e91f7ee2231bc3266359f82ceeb6160d3256228d7a41fb3caa6f305b23142ab979e728356a13309e27000000000000000000000000000000000b693c93d4f06be5bc8a84157c6f407c3db14175c56310e7d041118ec869f3992f75809b209f6dd01085991deaae2a96000000000000000000000000000000000ee21d90cc3825b401e6d452e27814672d849386eccec7be992581b1fb9f4ff4f3892d63e124bd669603e6269f099452995f7d2038ad02deddca34399e5b5653fa471d998c52bd52241840cdb9202b2c00000000000000000000000000000000013b40cfe91492dc53089325be73b5d404288e8056e30cfe4bf3feb6b854eb7d0efa3ac4afa822162ac16608555ccc92000000000000000000000000000000000576146711dfa2ee08bf08121c30fe63ef0ca4448b28076eaba9298ab925c615a56d497044be803f73e9586763aad52497b67e68bfe2d7fc256e6aa610dd91dc1b02c64186d24702ad8fa9f715b582a50000000000000000000000000000000009d66d52069b0d23faa33818a8c9bfc812ae6938dd02604e98a422f50c085a5641a46272dc9c8801a9c76cdfc2020a0c0000000000000000000000000000000004dba0f971336c813933bc6386e55044f5e3d3e5cf38ede5811b4e775fb41cd09d7f136d9de6fc36f2f435b8cdfdc26198115b9f84e3ed6947bd6f0e3c65361cf360a65bc059515da852a72ec5cd17810000000000000000000000000000000005ae8fd5c52fff0b80a2c5c4fca4bccad28f580c94edb7e28ca2ce2390cc2fe476a2b11f63c3c8759847e647d5fe5d1f000000000000000000000000000000000edbff5012f6efde3a9bcad65c805b1c4ac0899fbba5fd760513c673ce8ad18d3baf28acb3344f511fd4d9785afea33c27370e1037b709015e0bf178a41ac55774a813368e11ef7a764eb48abe75dbf50000000000000000000000000000000009d003d4213a46812ea1565bd9a6f0f3da1e69e289f026e619911354cd7444dfbfff1d842e3d9c61c305b2154851b29500000000000000000000000000000000070a1387dd16f9d8b4306ecfe0e9ba7aaa5959ec917e06da4ddf90c992fc569a56c61f6372bd26e21f5cbe7d720b68c66bf5fb297948e0ddc60ba26e49ef2892ca008e64a22ff2bb21ff70c56112f7100000000000000000000000000000000008fccb033a3e10a0015b11ffe2ed5f4c96ea2262d06ca4b0eabbc15c9b299a5220444345c65e7092501b56599980bd0d00000000000000000000000000000000127583566286e52f2f2c7809cea1170a49993f171c1c217b82c17983e02b7e69cb8c948725c7a613c41f96e80c3f1aa96b488b6b63cb8bf34efeedd9f95dff4d3d8c067c0d807bd1e20bd267748275d000000000000000000000000000000000084501b09915fa13908466d6bd50a7e0d8b39893bfcec9c6876b7ed8effd100b8f0a459d754efb6b110af2becd882cfd000000000000000000000000000000000373669b2a03d3da4e907da24c61f5e7928c5fcef4e6c9ad4303fc4cc2cb641212680f7c33605212de8914caa58732f44f661845e91de1c09f581c7612a25bfa0889f77c2add31b493b37d20bcce110700000000000000000000000000000000010608a9f87f46e528d782ef81493625f9a47134832eecca6471d2113060703750b679e64179e7a1c1c81311c38c493400000000000000000000000000000000032a0c82e42be6203415638e6cca4dc1621f87f030a9d742bc77862f4f10ceb44f1ecd377acec6587be0fdc33d8c17c98b3bf8d5e529912b1b6e445f592a6d151c6f5d01d3b021a31a2669df4ce02aa300000000000000000000000000000000126f62cc3033b7235be5778289fc568a1c474b70cba2d35a0b9fdab5cf239a2d4fb03f0bedfa84425b142c04284da058000000000000000000000000000000000dc1f91754d582f57b413fde9b837cbfe3430582b0964620b02bf854c6f666914157d44a165f16ca1d7204f35caa7b0630e1c8f222019b877e66df0b6201b5bfc5b6c10aae340c55e74410a536ffb9b20000000000000000000000000000000016d277ee7864b3af3102190cc99db1cff9fd1b1d6e7fc039040149c5944e7837895532ae41b4db50e29a5d6bad7ceb630000000000000000000000000000000016c3f6e29114782c84734cb927d1a89b7755c3a8fbc99076ce3ae17f7f1d088e5fb9757237773fd4e14c2855ec12b93723a258d66f2296fa1c71065cf23c994eb8c6c35d35120d16790fec791ad215fe000000000000000000000000000000000dc8f59e410ef7145d636d2c7d43fc4b1c903d6c8c0efc3ae162293c7c65c48182f9a25c4e5f111635881533cc558cf7000000000000000000000000000000000082dcb0872d815465131953c69e260e3a9ae44d16975f361b5effe13ab1d61c18f050108e73f50871221faf28fd79771ef4055b85f37b548dac2b64608d99ca293548bebe1e24355393520c34eda60a0000000000000000000000000000000002536653a945e03329279f382937d72bddd71ff8f19053e1fb19ef83d9751eaf101676249ac65fc61a0cbacbfca3cfac000000000000000000000000000000000806ebe4d62e62904ead05f814dfa6e8a392b887bab4aee61552c6f93ea5ffec6593e9078a33f4cefc96393a667c934c212529248c51c95b5b26961f27e6d44ef1c2b9233bb2ed32c3eee79ca6c6eb750000000000000000000000000000000018fe7f7093e0313737b8e0c6ba2fb0c93afe1e8241bc769f14cebbfdb4c73aa578fe3d37ce1221f21aca8af9ab99201c000000000000000000000000000000000ea0f2ff4c8ed0a51fc8fedaa056a369c5e97e347c6883b215d0f7e019960c0178a7962415c220766c16f4596d4b9d8ce9888dd839d9b8c236394c44d358f452a4588ae65d24ffe2bd345fc745de9d37", + "Expected": "00000000000000000000000000000000184197d1ebcdaa25c041e95424bb891fc9eb38160cb0d91e702ac283280c6df697ae85674eccbd0fb130b6f2e1c193b00000000000000000000000000000000015593ed27279ca601616dfcdc493b8c7bd68260f97f8a9f10c03cf871b17cf8f492518d2f8569d60056721723a0172dc", + "Name": "matter_g1_multiexp_79", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000018c31653abd67897b3bf8f046712b12d35ada1799d1c18071182fb61273b7bc506779ff2d774576a725f2f1035431c82000000000000000000000000000000000011b2fab972f183c75df3bfb7968dcdfeed0755f71ec118e56c61203e97064355200c5f016b9ed66040fc886062dc58f812322dc2a7d5faa9e4877638faf8492d84e0f4c4c65ca3aadcb7eafed2106400000000000000000000000000000000030d7e368c99113318a6657deb3c89424b9acbc5e3568e03dbf629333ed3a5cb45ce6988a3e5ef79e5ee91aa6b990b1d0000000000000000000000000000000002700af33eedebc8a4847d6772cf615413149e6d98ba3b36c96e43c8d97619cb01117570f263bb2f7579c7da67f40a25c1f6d538c5b4ae15c84581f8fd4c61160ed395816557fde197e1a013ba41ba0f0000000000000000000000000000000008cbea0d07e870d679cd20b4ad088bf3c5c23e83266b20e816f69bb918824c9bb4d0b3216f8da5a5cdc6f43359e02d06000000000000000000000000000000000d1c9949921e37e73f95b0e4c444e390bb71fef0d893d1b341b9338321bff4a23d1da4ffdd5d7148fa9fe9cc52ebbfa8f2f6a4713eb692f7667fba2a3dc35363c3ba163519d95757daddefae11a958530000000000000000000000000000000003111c080876670db10abfc439b17b32f9e96758b057d3344c7823af1b0320037906b1a9d8fc42cab9e9e0e8449aa997000000000000000000000000000000000e0c7d19a0362a173b70b6fee3d3feb541c7d2ccca71f1f01f8bd105a18024fab05e0a6d448153139f2777b189ba0fe41022e50c3fe7b2a65aab79de6d9e47c457d197e145592dd0611b1dc39941513b0000000000000000000000000000000018bcaa4869a5c6ae46e6f5fd5fcf835965d21d48871010245e722bead79d844e96e10558d71e425377f4adacb3f74074000000000000000000000000000000000414d616a4207e7cf79352dbf7f319bf554f043710cbeb48aa502235db7d30f4983b5381269f34ad6ad4fd5ff56d9586b80011c7a4aa905d4db6d4f6ae46eac9eb8bb18613d4ac5e5567990d7e8fdd96000000000000000000000000000000000c86dc8b8f38d1e4281269ca252adde9f0fe933d4cc051c7aad55f96252d1e6f9eb6f4f876e153c11b61714d985d318c0000000000000000000000000000000014113f8e2c3ac4919de334eb5c04c909b88df39998e58883a5393a4d760cb6d07c65eae053a7b2100ff3028a786782bff397789685a736375ead2312874174795586e12b230669a90d072fa636128c7d0000000000000000000000000000000009b4437230d9dae44852d88dba2655070162501702998ea5a035cd88eecb64ad7c9ccaf696545dff98d778cd7400943f000000000000000000000000000000000706b196155640680b257a537c836507d95e6d5cb7f163ca340dc0f8b80859721b7b2a2ba51dd4d72ccc4c3cb91030c928e325fea39d61269c576626984f85ea43cd683b08c3ce111aac0005adda39c50000000000000000000000000000000017bf848757da8e7ce5e5e69574a9b31d35eb628102897922d4c996443fbc970374ebd601b96b3ca9412c13f50943c7590000000000000000000000000000000014741c0b49e4f02630a6cc1a723cae1a6a9862158bdcf996b46a9614dd34527a859db0b5718788eaf2caa059671f3c683cfd9bc41303803a0b4edd121b818a126bece309dfee4133aa5314cb8a91d08d000000000000000000000000000000001269325967fc68b78cee64d0386e1fa6ecaca1f85d672f8b63831a1adfcbdbb40461a77ee0e59b1fcccb7c1d543f08a100000000000000000000000000000000053a22e8c4219e4d68a961c2127201a23443d8fddb02e3756cfdf74e616dd4abe73c4ac498ff5f6a68d730c0050b79e18e08fed30e422868f37c422d1efdcc93912d55b0a731479af863dca4705e0c500000000000000000000000000000000018248505148876ab5a5ec3be7e3a6cbac30798d52f437bea7e966921723e6a4a30a0e53518e109d1683f3a4b3432136e000000000000000000000000000000000120602fd461206973e62ec8a3f1cfedddc1e9f9e1769ac06e2a1024a9af19d402f40ffe30f9cf77b8704497d3cba4a3674ecdf795b48d62f0db0f9cce057fe570d15c78f2eb7a77b66e4895a45804880000000000000000000000000000000009cf2460e5121b15d177b8ad803c045529933d1abf62205d04726b67d64fee85e2008b5098ceddc42d5c8d95d39147600000000000000000000000000000000012749abe2d8b47bd9c899b6726ccc749bab2786e9568d32299f0e659664ba1efe764944c4087c549e2bb717c87c6b876288fc80d07393f629ef2732879332a253b49d26ca7b2bef7cc49ee40530b2b340000000000000000000000000000000008d764f80994fd37a21f6923d7fef255145ea875c892888d45efb7a37310182b04d2c16d4d91a2e7c41164706afdb617000000000000000000000000000000001156c016a289989510f1c8b39bd6a8c358a1c5611bd2286e9f15983f984e89e061e60717f1b700abaed57076e148a8a956e69f4ce8fbd8f86f546fd6d129f9760edce7c5e178dffaf987bf565e9bb7e9000000000000000000000000000000000734cd0d73ef7d79fa501b98b7211d551127abf68c473c1c72c591180b605c938ef71f66c422bf2a8bcf16c6c8946c050000000000000000000000000000000008ded96a9fce61040c1acc71d6496cf72590c63c3514c4f1f77d4582635af9eccdfab2e60749ed24fd3b6e30e3576c58ab40e86212189e6f5925df810141c132eab20c123166cd8d3c6f40f5dcf1b1cd000000000000000000000000000000000df9ecaab534bbe9c8531f813a95a7733df6a4c8785575c5ee89647941a6984cdb5a33d2eced340c683339c18f5da32b0000000000000000000000000000000003632b2377ab368bc9f735609452e0ec9fadd6f261cd5352e0a5ed6a37b25ff7a49fe57452e79e7330661b81d7d80a64b96a5b6129c58113bca713e6905c026c0bfdb6d679c203cbe2b256b0a49ecece0000000000000000000000000000000006bc4871c0271394c9d6099667ff68e1dbfa9980976075bf81fc18f1875fc91b50a0e3be622882c90b1594419da7dbcd00000000000000000000000000000000168e1dfde47d19280dc213bba9fbb61fdce41f81d4b25b2a7abae0404bbd7a413cdd89611966a7f9bc32617dca51f369d9d8147c4453cdeed971242d316e350abead3dd08e93ee54738a4a5aed23affb000000000000000000000000000000000132a2a6832653eac18e2fcb2c336292dc7990fa1a004404973029a227c9871181ffdd88a74adc3edc7a8308dee803fa000000000000000000000000000000000b230c171d5739fed98d32a3b27584bb0128434401e9e05ae09a4dcd7a017d1cefe7a46dad2db5addfb389feb9c846181ba8e52986d3bb0421eb53b18ca8c21b9f7e631f16b99ec56748baeb541b32e5", + "Expected": "000000000000000000000000000000000cc6517e655697449988bef516e60c8202fa48c3573967491ea2ff2db9fa0de3f542f656228a5b90d7fc1e5eaa8b06d7000000000000000000000000000000001191ca6ef2791726a31f77b0431ebe170d8fb595cf6e6b9b33b7fb0d4acbecf2d171884c392832d2a91832e982c5c0f4", + "Name": "matter_g1_multiexp_80", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000111de2b65f5f94851aee2861910898b74dacf013591772902239ff7f71a9cf84919bc4a84d6936f9552e97314eb52e7d000000000000000000000000000000000db96af045180bd4d88dc8c40f8cd918d2195c2f3651c176c1ee3ccb583a7363e2c2c900f2a54f26a881938cba98565f7d39b55aadd47afa3cd35cb85a89e729ca236ada965b99f64ab302a84952babd0000000000000000000000000000000000e48144181d956ebb37d72c38c062958f73de8944995c7e7568997b04ec19949b348fd80e810632462ce43c7c6571ae000000000000000000000000000000000b4a19556d8c21206c4198059adf5ac2b8a0e08c948a8a4d7465bd31c5ce5887a069df5f80b1df89ab868ca53e16c730c41ece17a6d8b4a22994227b37a9d73e17a88859683afd5d226e113246e70cb10000000000000000000000000000000010547f218e33dd9f9425c8e7be4136e65ee3dc23e0cdfd5f1caa8986162cc13b77d30259b6b9c359ab0faac9ba29bda00000000000000000000000000000000006729e532ba87a77d1e458663690110cf63eea96f8e41a5a338493ff71b68e78e78b9c929006c0410c3739b15ff2810069700dfa3b6e5fba735d1fec3b3adc90719ec301c406ac40673f4e5677da3227000000000000000000000000000000000d3630086b7e0c068c60192be8724ab4d18409fa6ddcbed02b52fa776e84e2115457c40cac7e903047fc435114150d5c000000000000000000000000000000001066ce26d2e940899e80e9c0e515ce9d5810a4048925a7ddfe0cbb24b3d8d654c6835c6872fff5a988f525c648661cbc19e8eed297661c06c92075629e163e80a08835254f7af8c0f179400be114ba7b000000000000000000000000000000000ae73f595bc9d22c8c959eedec4d1301a13c9b8c643f4335160bab4a99886694d112ed6fbfbf082629b76d1e2509ed280000000000000000000000000000000013dc07950689ba36736838714eeb28ff3be77ef8ba181718ea7b5229e01d4e036c98eb9ff7a867c017857c029f7f13e3199ca6fb7f6df8a2e72971c5738ad75d84935e922587acf3a6b6debf3c37bb5e0000000000000000000000000000000016e11b169dc405035037a10180fb368988498b6e209ad62260c7ef45e9bffedbb0587fe282d193bbf88311f3d2880cf500000000000000000000000000000000090a277517ea7a1a7cbd68598aa1e16977cc57c8d095f66a7cd3f67814c2b8f35e17e20d7a26fa67274dc5aecbe778648159c6b98bce6ed31c30957280d8f7820e9376093d1ec9ac68ce0777d02b084b0000000000000000000000000000000002ea8cba4bcbaeed7feaac63caf21645ddc97daf9250ae29994fd04e798f94dab33bac6e08eef8e6c20f122bc5f88996000000000000000000000000000000000f7a0f6ac02bc9821a883393c8265ba748f9d7c3ea763037bde3bb0178067e93aea4dc70d25e5bcda642d06f41a7f18bef1bc580e0b52b10b049f07d5115a60ba96d14a39e48ddee3c219f11c3b2a82a000000000000000000000000000000001618ee9c413dcf713699b7910989c20bffc5ba1ca03e973005f49084aba558797e7f9ec20cb86f308d737b97c08f42a6000000000000000000000000000000000db1daa5ed21250c696ca4da3e82f6623c54d643d773286811e21c09e9ef7c9ecb9d84d90b9c76ea9f65e04a29f82750d06f6ed682c56611fd060ed2b3b1dc48974769ed6dc504ca3e0b9f68b77e63c50000000000000000000000000000000012aece7d9e7384ae79e047ca4b4fe72fe541a825530d6c38b9a8fbbf8b801883ccbc3cae7c33e4d811198a7b7876c92d0000000000000000000000000000000013fb42fb1b4e7785c1b66364de150d1e38fd9fe3d8f209b7c168beacf4b26c35fe0fbb4a41f30adabe4314b20b16319561d7b314ae9d9e78f628ec5a207d12e2dcb690688d256fe46e0affdfcc9775ae00000000000000000000000000000000033fce20f9202b89411dbeea59a5b1c632435eaf29e2739163b0837ef9278ee3903ae569931e70f79a9af5a2abd29749000000000000000000000000000000000a50360c73c3f735f97d7d71b21b2831f7d7fb59c594e85b604dbb79ccc884349cba8eab9ce613ed60416994322916db03a0c47621401fc20d2c78f7e30814de9a6f838d4328a5b5be628b833c31a6fd0000000000000000000000000000000014d9a7dbc453effa7a76c774a289957b0ccd72994e568c0de345b482ed2b6db9a3a3e56e0fda159c25acb43b4a6765d5000000000000000000000000000000000b916f28e3fdc62d296e421b1684efd4e9a4b523f79dfaecc00872a1d17724e1e07e2386b4bc6d76b157ae94559d0bcde4ac6a5e740e073c5ef8af389e70c2cb8ee8c4c04c2ab4c48c579e83e181005b0000000000000000000000000000000012a4670c5c2847bb188464dafe41360f00621ceb3b5da0a3dcc16732f4baeb0491664ed8c2f95ff9b44e2b77e698eb3800000000000000000000000000000000077b561ed2fe5c91b30a12a2df71e76cc4ac882301d1975c3cb176e22874e28868655db9d0c91003442b0277eff52669c1e20d8003fec60f68c03942185fed934ebc197c2863174442d1a1c8d1424d31000000000000000000000000000000000570e1a0fe7f82c0d3cf38d90f77634f8dc2bf9b58ac473d9bcbe7242a4bb76d11f36083c90588a680004c077e957a9e00000000000000000000000000000000038ac2b58a16af0a3a0070faabe3969025440d9781e3ebc22ff873dab532d6ca1b0bbf21f32eb9728a322c158f5390fa7713ea72a2ee99442232472ab3dea9307a02fa1279129d994af5588af4fe7af40000000000000000000000000000000004a3a287fe4401c48d7dc804363941b5836cfad6490b00dcb0ee830e876fa05a42d6e2b036a4e213bbf5b6ae5a4e31ee000000000000000000000000000000001877a91254211b2af54ea910d9efdf4b4e829fda5bf6b0c2dc849903c357bfc6f55b45c7437ba538ab6cc795b71e95796f128420cf6ab4616a05b287191105f25c7212f2c39c3230fa56bc27cd06ebfd00000000000000000000000000000000159bf4b0dc89cfc9d1687d8552489b5c3e2ed059164197028bc67c51ad18b341d04e4b8be660880a76a44ef11e785ab5000000000000000000000000000000001643a41fe4104ab0bb96200472ca67064635bb728e6d909fc0026216a90083eb612f11bd5983cf4d7fe664f1c527b96a12bacb3419c34369dbfd1c968334f76bc50885028758a975cc812a04e6feabd60000000000000000000000000000000003dc904709f1da618b6a623888015a875b11e5baa5c10eb6d750354c09359b180858bf29d24bae18e7c78c81465659aa000000000000000000000000000000000c61dabb7085a1937782433ec46b0a063a34e102ae9a6b6bae7d82c94e93c3cd05afe19f0673f729761462bcd0d9ca5e5b00f26af6f59620c7130a6d12cf2091b5f52a6b638484fc1f242dc1773be256", + "Expected": "00000000000000000000000000000000109dbdd05f92274f3edb0232b827a4abbe115bd4d51f8a1e7b8ee609511125ecf35ca60991e75a0b7973c4085b7d4bca000000000000000000000000000000000e14a168decb6893e9c447b4366247d997701471a33bf8f762bde44473d516d857d1825255d8b4cee8d04736cb369758", + "Name": "matter_g1_multiexp_81", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000009b85ef81b184c6383ff4e2695a8c261ab252ebd81bdb518001f110b2ba72fbf5014214f816c9453319934d8a010aa0d0000000000000000000000000000000013ce486b15a77cede98a46f66ae51d17713bef6dafbb2ff34c8f441271d52f4fa27fb88c5695f4af6d43e32333e68130acc5a8ec806f2f273120457865582b08697904a2c6510bfe9ea21eaf682fa4fd0000000000000000000000000000000006a10f5973fd2aa312ce8f30ba5caad0ae6028bca5c186e4fd55ff4e3f5ce00220b94683e440b09a9fcee238af140699000000000000000000000000000000000ae8e9db6953ce2461bac3be78bebf6c4df8bc57bc7de375aa652d793bdb0899477464097514f0fe2d0badc9027baf3898c15a259b4dbb8c300a39f0af558a9827112f6b4c5eae3d43bbfe057eb113cf000000000000000000000000000000000c0c430ee1e9112d901b82e43a25ce4e5b61c81ed7ac7220d88bd10d44d28c1bd20fc8e1ad85f9b6eb43fc232594b4f1000000000000000000000000000000001233dee860032e2f9a67d7b3d61cea99f18b91620b76f8bd178295ac4fc3b8d0db4c4ff602085c7a897435a283e2a4eda0e68bdc97fd642581f7e62ecf134df2c05570713c96fa733d3db96ace88f0f000000000000000000000000000000000061e9d3a919bdbdc42500b7daec837506bf0841caf35aaac34a3670517a59bf52343b47b46e8212208cd6fdca6b7140c000000000000000000000000000000000b87f7efb446cdba6e619d5fc04ca8dce8e57f6a76faa4a773c03ddc0666ce2d83682f24d8463d9331ae58e8afcc5641e5512cac411cd103fcd7497fdf47d1221999bcecdba30467f06ec356483484fe000000000000000000000000000000001606311f79e836a03da5cacc4e1c3930695372f8f679c8f910627f86af15d1612d653c76d88b9d33f848f94bb63fa1ce000000000000000000000000000000000075b5d9626107a486079315a85991f3d77461b45e5c8aca6876287f624694c8ef1a4f5f0a5b65eefa8d6a4746fd2e5fa32f6861298bcfd4668653544b4551d7357d64f733365a5f08ebf297a09fd4ca0000000000000000000000000000000012bc152cb7df01fd9ca35142806664fdbacb881adcf443051abac7c979d09a1c887fcfb8cad281f376ea3f6693812914000000000000000000000000000000000e32d4d6aa1f5046382c1d5e6e2f97319e8c6887b850b3cee498c482e35319a4f062be80f7f48ff3d1160ea6b18cf67824301fc5c3ab842d7f6a278fcd32249f1daf86a31dd254ab9a21941fffca98a1000000000000000000000000000000001599c2c489535375270f0d1f370c6416c83c4043dbdb4999256f187e29c198b1f6c5bd1a52c997f01ebd3622c40feb63000000000000000000000000000000000b60ea3ee221eeac4a8a364eb52ee08579cf5a907aa5642971bd5523dee5dc6d6584ab993d33d9b8ad9de4a1a4f0cbb117a920aef58100de67c482ae1fabf7ec87cf3447bde1e19d9aaff82569570674000000000000000000000000000000000b85c776ed6c9c78001ec7bf3412be495f40b0978d0582ad4f86ed54464fe562f9e699f727f36b2fc753f4328f0b2c6b0000000000000000000000000000000006e11a826fb4a8f0ac32f5c52a531508ad1363bf9b09919ccdb61ef25baa7718a4829fdd10fb6b680321cb7ef12d0c01d76d5eebc3d099448ce4a8ea6dec047b0f062c6361ddb9e95ec898442423a3180000000000000000000000000000000013539f96257faa2ae642c15f9c04e8fa7b2d6d095f7ca285e0dd90f022ec4a8fd74cf48557afdb57bace088b017b8ec20000000000000000000000000000000006cbc3e4291f373ee280eaface275e0334e46e54f65efc4e18b4ebb8ed1e61941d9c859903b56ed0d4aa3f4f3152b5b4cd4cc1453dec7ae335db989886fc0964ee73e12bab69ce1f1458d1416471176a000000000000000000000000000000000675b4dab12db428a14afd8e696a64c0bb352bbcbecdcf2b064428b489194112f1cea4a383788e0bb0e97b7f88b817700000000000000000000000000000000013273075195b02abac630211c5870727a42e11bd96a2e2c6057d0c96bb60b73db72dec3135122865cd520c525588664a6d207c08e51d64a9a47f5353faac77fbb184e1123d38e39bbada85534cbcd3150000000000000000000000000000000000cb4629e659d5c2d91c5f909bbeb3381271ebde4f8486f76c1903e86efa78da06af752404ebddb3fc5d1a09ed28b3aa0000000000000000000000000000000019202a57e95d8d2623851973c324d1ed64b48b15388e052761493b1cdd6f3b54c6f47d2b312edec23e9da4c815f02e172e1910b704d39b6a64cc7a44e44ba3e8b7e64ddfa90dfa6b5ef571f9ff7d7f0b000000000000000000000000000000000a80bc4a39d62ca891044795e2b78f4eb82a3bf38c4ccb2e6d24ced4526db7c57ebf8b1951af0707af5ae5929f727c290000000000000000000000000000000001cbe991b082e840d8bd505a2eeeadf034f8f8c2bb530c742d7953089da1447e090d82399bc332127f14f1521c95f0042eda0eb154d5f9b0e25a828c6f77541701004cd0293c61ae4d36aa3038d0f18400000000000000000000000000000000112e7894d90a5cba2a8bdd0fa750d6e57c0a9938ca30526eb5289b4a59f92bddb33f59ca22a51d1bae03b850999180fa0000000000000000000000000000000016cf6b093a188ccbf1a000aa860fc794546ab0cf261784e7b7bc5750848f685d629ba55f71f2266edcf24d27667d2720caf6dcd51a851eb200c7f5fc3e106ac5ffc432f756b942b1b9a5dde31cb2a3760000000000000000000000000000000005e2b8ac9124e8ccb6665842d77a2e9398e5b3519fa4fddfc4b10acb5eefceceb1cd6cc733e300ff95ea80d09e3bbeba000000000000000000000000000000001273d1990fa922276859d3921bbd49a452c821a9746c747734692d12c6f7d45533c0a7692d1a2d95e2d2be6dbfb3f6ad106d4a893a68b7fcb8be96faedef65181c239dc2cd752c85ae7800ca84fc2dfd000000000000000000000000000000000dd2c7410b5f5ee63ad2a9ff3a96df2bad103caabe00a9892cc9b2ed2cc3bbbb53724b2ab63cabc44da7097b619f34c3000000000000000000000000000000000f695edd4b67f81f09fa89104c81717577cdd16db30901f4f04ac97e2e0749a80d34422bdfa85b5cdb65c042d90515742b9e1cfbf140f4a3b1d06be656ad6ee5169a9cfa7cbe6efbf8173843d406acd300000000000000000000000000000000113c8f77a2409e0c7ad34186119833605f924545821895a283ec83bb6cc38c549a356b205c24f65be66fa627a378eae30000000000000000000000000000000013038ad87e3b3eb6545a0b5f7eec060895deafaf509ff6687024ada75f700d466df86ae5f95463c05f19750c0ce6cf56dbc68f77d40330ad5b8cfcda42edf57899454571c6c6465c4107e662a269aeb5", + "Expected": "0000000000000000000000000000000015a7b2803cd9b078d457d3b7c62a2418f19c0cfa006739cf3878844c9e1ea115fa982a02fa6fa0cef74404bcf145952f0000000000000000000000000000000018ea40f019b9226cb0428356483f842ad73140a8da065889d81e35a564e99aacc5d5d833d35fd15713ec76c65f9d3307", + "Name": "matter_g1_multiexp_82", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000163b380ea90b97146aa11c64b34de710e41b2ad54036a1a98659046f0e051e5961f30ea5ad78d8052f4a5d2a8388c28d0000000000000000000000000000000012afed5aa2e8c75e437fd796067e0c610a8a4c2f3368752413e6f179bbd4db25b18d5b3f8502186259a6368dd4321148ebb3c942d3a1a15cee806fdb0fc3635483743a5b0ee9c40a48700bad5da53ae70000000000000000000000000000000001bd4abe425f0418c86716516075a3ad09812650908cf383ec1396cbb6929bbc791f5cf65dbd95b51690b58ae3cab3f20000000000000000000000000000000008264362c7fa8021dec396c8355197ce4ef70e7b8894fe23d881d34b9a1b883cba1eba0e54d928b4eaa27aabde0df9b3c193d751c4f24f4808621979f07f03b2eabba75f08bb49682b9df2da7a85a77300000000000000000000000000000000032112872b64559a03629b7ec8b32344b7d5f044670f6099d8e8b1a1d47223f9a42a072975c821d03b30d0994d782d830000000000000000000000000000000016042f6baa48d7c571e1f6c7cf3c7a0887bc4e2b2de51bae133d266dcad23c579e03d3284c09c83a54eff7f2151ce5b3dee4eef524f133183b4af95e4445f3ee5084b96c32e284ebebc5b87f3d76150b00000000000000000000000000000000028ea1499ad8761d908d863849ab4bbc155edeb03a7ef4bb93e96e25ab11c6dd0c21a6f06537a688189f08a00aa33171000000000000000000000000000000000ca3ee57dbe627ae681b12e0de4ed602bc3c09558444f38b0dee27320708549491a4482f7f101e8a722ef85e3fd742a5da514f21c8eab0edb2405e673297bb595edc21027890ad680f1663fd960ce4780000000000000000000000000000000018f397d7c84b8125844e874ea31d18b8705a75027d5324390e2eb7c9962d9de07add34a436db21a34fa7fc7898ef04aa000000000000000000000000000000001591f2cbc58c0841e5eeb8d9c75d8dfa0f2dc5e479d136905abb772a6170d131c0f2c9e8e55ffa215a4bd732c2fd85556aeac9a669c962817c01069cffbd948d9d8ce764e92859f31fdaf85f5aefab7700000000000000000000000000000000135452f0f8d4559ba041dbd2ac45f15416070b1674c9d8094556a289716814d2a4efe14857aaccb82c5ada5d6f0d15ca000000000000000000000000000000000f1c47592319db60db724c9d0649d0d713320be7dcc28e7318517ef80a3fda71fd1f4b722633ed7ab7df06218ee593e940273bda92c9b1b677edd905d76d75875e5b77841befb2bcaf1fca7674dffd5a00000000000000000000000000000000003c75767678539abf7a62dcad5f90a3b4a54354fa70206e789a1f9b5daeb5fb6d9aa222476c68cf9db8a0789d7ad43d00000000000000000000000000000000139bcede61bcead99ef0d9554ee1c19db1869fe041671c199246824a923f5fd94e1da04fa17ec921bf6e82b14f126702b77e16276f9464fa2063230d6c1a4152553536c610062f18565c030e80b5cb5400000000000000000000000000000000020aadb198678aab5a71cd6dc33bd64c47be6d080d24f2f1bab7239808c10867ddcec65e27977b9eabef64455cac25e800000000000000000000000000000000141e58a9f8c9bd92d2de58bf3bbe77a48fae9290815915d7980f4835d805486d678ceee9676ab4fdca51d0fff411ab1b0be15b654ce22ae4e32987babc4863ffe2bd8a459d0f01f68fe84a75326889900000000000000000000000000000000017abf5f132e8e466d2cae445d75978645c3b24284e1b7df7773c256ffc342d1484976ea1046aeb5307f735a69e2fd20a00000000000000000000000000000000087ce2fc44b9ed797f29c352393a8ea109281514490fbc7dc489acb55753fd5c577c4af0ca6c267c83408cd95b355e26c8f1fe94bce21966427380b6d357a3599e9db03a7694159335ffba26fe29e4650000000000000000000000000000000000b106b2b94858155849ec36741c7fef4d97ac704baa6752e8230e172da7208b7e9f187ef0a6cf054d00f2cac99235b8000000000000000000000000000000000d94c6e2349941a20884b9c2d702237c5b5ca2ed277bfc79e53452f1cd6f9f49360215d20fa06df238a7ad4ea253c93ec6d34471ed00035a484f97f4e8123d40ca23b017b94df65540a5551b905e57b30000000000000000000000000000000019b33665a81d0ceecd43f003eb34e1292945da1361adf118f36aa5acb71bd821a6732758a4aa6988e29d4cb70004df45000000000000000000000000000000000f3a244e578c66a9263f020e2f6ce49dd655c7e40a992c44cee40e1c874588e464f6254ba644e46adf348a26025d6d3ef3abd467168bf5e57f71017b5779bdd400dbf416f34f105fe747ea2f8cf4a2100000000000000000000000000000000015618db18e00670281adb20c975f4774aaf169a653d5f583ff6966113fa773075db78507847586fcae82d6a468302706000000000000000000000000000000000301b18d0fe7d0db7793c62b3da072f4cc2fc3425583537110306e31cf63b228cb8c285029044c7b9439c1227d4c7ace2809801eb18d38a61ef8a80f13086d6b1f85ba751cdb8d17fbb9ad5f8d0f835c00000000000000000000000000000000053001a82260b26e34e05a203c8233095da1da58c5f804da9cd6cffce07170e39044394f379173e1340da055066d320f000000000000000000000000000000000bfa2bc7fa0476eeffae4df98bd814db751eeac1dc67205c7629c9921928b55c70c2abe242728bc078bc2685690a38503521c9cf035b094d754db994fce3161842a9509ec8288699680c0ac7761eac680000000000000000000000000000000019a7f78102671f6d84ece4a5bdc54e59cbeab60a8c6c15a708e0169f42a52e98bbc1f8ff52f34959befc859d308fea250000000000000000000000000000000016b5d76caac944612d1dc687c6dbaf10ba60a12b491b17b6c1c876a5dff933c4bd9c6f923e2ca4cd1dab38fb06dfab6a9c8c2998d141b9cd3a82507b6dd97e8d32e9e759169c575eb484e9a1559427da0000000000000000000000000000000007741d8f72a5ddeea2fe82fbce4b3d0aae61e1ab9243ae6a3200711051ac74f30a4dadb597130fd8389353c230b6b7d3000000000000000000000000000000001809f1cc2fc23be0f05b3d12e6891a6aacea121e6db77400638031065d75c7b3fd9a02ded481eb3893b2449aadcf53d6dc83c1ea9e4f4fc12a7190e6c71c4f35d1a676d39e30fe688a05820dd98966400000000000000000000000000000000013d9fdf041ecc7f2c728fefbd6e9da3169d872406b6fa77a52e342fa8852358b02bb2ae7ac77f83e2b25f0120603d0e7000000000000000000000000000000000101ae8e945d31a98c4dc3ba0e01592285c0c92721372bee6b138d9148883970708ad5e585a1b81d82ab0656a3b03a2c00be1b9098f1873ce155a66899877c7b48ddda363ae1d2353cb3816f1ab15ef0", + "Expected": "00000000000000000000000000000000193115466c33711b07826d2a021792b7c238ae67e3bcba00b24026503d818f912c5635f85e85402e3a6b2a8152027afc00000000000000000000000000000000157fcd63d3a0e48e25ca0196b7ade453fcefea33f09123434f418cd1d65bba65a789e4c7d6ddc92d4fe8aaf6bffb1ef8", + "Name": "matter_g1_multiexp_83", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000019f625f232faeac09266c2c4881f92c980db551ea236dc1250189c1e71dbeb151cf74e43b4d5f465c6ad92d75457d10500000000000000000000000000000000175ceb7cef0f8144fd4dd82428bade99833023125d34fb296f198673f4848bbbee343f2f2137b55b5f8c5f74032c1ccaa9cbdaa0ddbf854861eac6621255b2102e5343666c735d0384049d5680d105d4000000000000000000000000000000001353a419548d05e568f36adf72d40ba8b30be9a78732660331a5196b0f81b52330ed70e5c635acfa9ffbf083e46c8ea40000000000000000000000000000000013ca17c0dba35a747bcd314d87d1c6558e9f569955aba3d958cc5736db78d16132c9dc8f93d5eaea749a0452c13139da92073d958260a55b70b580f3ee27c42553b5b858b66f6928fe74b4de91c34bda0000000000000000000000000000000019a1bdc1f5a43fe746df46a7559bfa0bc5292f574fc424b134fb8b2d971e191b3c5d222d39515dd145819d56d5379d12000000000000000000000000000000000a08d0b7c7f5d71222e984bf574cdb7de76a7b3c61ab5a3ec202b295c62366dd958ffd5bb5a5c6c84584342bc76199c62117f11d78dfead915a94f11fa7e904a96204ddf1835d3501639b83cd5f716f50000000000000000000000000000000000f2c85f34994643712207fc431219b925f4e701732fce95bfb387ac26ff95c9b10408d24aae5005e437bbae924816b2000000000000000000000000000000000d4377368df00dcde448d8399ceb7508a8fa1c17e9d9a5e09c4fd7c09c253529c07068e4484c7e7c6d3ed6fd3ca777fd9087caa1e89e48f05bad1d720477199410941a6105f911d589e1f94a851e0715000000000000000000000000000000000d1483ef230a2ce75a59e07f83091291d2524b5d043db8d5583914a6775ce2c80368d9441aa2dd53061a8d9121a025ac0000000000000000000000000000000019100e75a72e07391db9574b3fc4aa1c669436fa802a1a5d71146c5f4b7fe118a5ee71a9df50ff67633f161fd151b947255603b470c056b3dfb3acae0dd45bcb3d014765a5181760336deeabff3f00be0000000000000000000000000000000003a88ed50b36d92aa4411afd0a340497962c7740d629edabd505d6023ecb8f9daf0e5bd8ab9dca26ed2ae3ecdfd98b680000000000000000000000000000000013d9d64ab16ce9401988db4855b26b994da09481a339c2a2597401adb72c80718a4df242776f09ed208a8f34ef7f67e6e0eab0e2486316956291feb44de6389b20f8bafe9cc890d86d27a598bab0f3c40000000000000000000000000000000013b16751ff7f6af64c06f9ae6f59e1eb6c3ac76355e6192e6eb44bd1a9f866705eadf0d2907e2458462ad731523bd340000000000000000000000000000000000ae691a4fbf3d0fc72c0e14d4b31fc19c52ca07a81db0ba93949c56a9b75433257d784f7bf0611259dba8af77403f536fb9436456262e5149d02b33a1078e198bbb681699b3f485625784df444bfff670000000000000000000000000000000008ea61aba918d691a0d04582e1f48d671df39bc7de29a6ecc17b31a32d485fb1dbf499e01a9aae5ea21be5d6ff9808de000000000000000000000000000000000f7e8863a541be553b36b8424ba6ad057986a9f78454aea770449a23de70fea8eee6bf8aa30e96e90df9a373917452f70e2724d3501e3d79b85266fd83a2a6156eeb48e749a61676a1c92ab9bdd6b8990000000000000000000000000000000010d41968ddccbb34b3faee226750e99301ac068d8e6f13e72962b53fa2d019da108af82bdadb3cfeecfb85f53607400b000000000000000000000000000000000a90e50ac4e0c39f579a19d49e6f64de6bdd5d6a3f9a91ab654f5be01b258af8709ce1c5a994501177d1c70b25e474a9a49344fe6ea9274a103f323f3d9381e91ae48233dd579944e12afdeaf854000f000000000000000000000000000000000e85db21593e8d3d86df87ceeea7d7853758d69e15edd53fd7da52f0328805db785aa9aa5db25417d76d796200a37d1d0000000000000000000000000000000015d76c5317e1c8cc5a58a0cf0700ff73d92e7f60f4094030716bb8c657d5c75262825fc0683a88278018b4899a1c1ffeb44aeaf3ba8b03e7ef7201415de7365365b828f2c1a38d09153e51432d35b9a70000000000000000000000000000000014c9d6aa24bb34080b9a99d31e1bb431e911b2ccda3c8dae9c2c2114abca597b3849c5b3dca756d0f9ff97616c0b724600000000000000000000000000000000050224129c08fbb2f2d16596f83e2d09a09526851c4d52e8d5f0afdae7001af0006edce648efe7d94b6712d012817ff753961d33104649cbfccecc7eaf33b7a2a486c77dca363ffc9fbc9ce4e8c1adff000000000000000000000000000000000da4574f20849e04bafbc41bd361e8f4411815b9e7c2fdaa9a3ee70d4f608f89166dbe9e1cf4ff0fc9ae98f27e115c24000000000000000000000000000000001463727b23e6afc17101cca45de7d08b78358605c7b1ca089fc52f6a3c46f590210083103e51a122ed0768be2adeddefa04e97c20b42dc265271740f27f1a833bc5b324bcb843a8f9f8a68231c663d57000000000000000000000000000000001363808474ae9481f54d40fd35ed90c23d4349403d43af0dd603f1db6f5fd5ad8b77d21426977b78f1f5397df17f0bfd000000000000000000000000000000000118560d0cb0eb2fcd3b2d51fb2aa379112b3075e1d4c20757ec241a4877af271700d3412a8fd6f3f5a3dbdf4dc8cdc9b688426bbe9ae054acb6c1fdd4195f8a113727f5617642a5b3c0c65566e2252700000000000000000000000000000000040c13a6f53ca485a578c6f3f49d917b774f7b2d1b15ed3e748a47b0bc0be8a7809f0ccf509f09121fdebcf8af46023b0000000000000000000000000000000014fc7869df366473b2c4adc2c0b12acfffeffaf22b4856bed6ec6d15f0f080596b81f3aceab9360e99f35ee7c43f1e2fcf365a86a8d08db5cd95f239a2f3d22279556975ecc3baae0b774b0323dbb1b600000000000000000000000000000000177b54249c613f044b40a11047778c86f09b20ab387ecb8165c83b36a1af046936623fb00764740a90aa232b7f7ae6bc00000000000000000000000000000000040a52fc58007717d6e1dd8486cfccb1f75827c2feb2b7d59b927c4bd23e5ea80d120875f611bed4b7c12b8a5c929475528715199c9f47fd6337b6b0e807e230b1397885fded024431c70e453f55f365000000000000000000000000000000001918e41c557305934aa72aaa361d15843ca77c747ac16cb4c251a2f0d7c218b60a5588b0e5fb3573e8186a48d725e50f000000000000000000000000000000000cc4fa5302c177f9ef018445ab722e568347f4f970dd893e3227756dde9dc8cce3eb2bbbb4c3cd98af0ed4a45c022cf1c32e8643f38f8177b788b8c2bdc25b668308d914fce35c6f9023a769334a51d1", + "Expected": "0000000000000000000000000000000016da14ee1ec80ebf06c0622a500a8eb5a560dfa3439a8e53a19b51c6c4576c31a5486c4c49a8050cc1dc30287f33b5b40000000000000000000000000000000003b04355b2d78266675927706874bb7fa67d441886972a8190a45398942622f09ece67ea74d49bd97827fee82d4a7a37", + "Name": "matter_g1_multiexp_84", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000e0ae8df03e4d6e36e1c156a35425a3b8189b56e8ce90045d16cfebf7fdd973d207db6391dcd007c311af34f495cfe0c00000000000000000000000000000000198e58d5278b2a82606af16a9af3f023b7182b6b5b2d685fb667714e9fb5c7a3fd5c98dbcc84ee31fcbeaa8f832d7c854f8bfa3d47ed33a05fe3da738797f18ca5d5b8658055de5a9f85bafe6078f7fe0000000000000000000000000000000007a130c85d67f97fd0dc2159d35be8984bfbe94c28d9d96bca8bab844dffd9a6eb3052c619646a4e564c0d47864b31cb000000000000000000000000000000000e2b8362ef5fa5be398a3589413ea69e98b15cdccd203119b79d96405c2c9ae9ca8eecc7533512a25421e1748ec3a1b74b0d302be94d437b8055586aa77ec1fe616e30552b4d7d3471ea219c148be069000000000000000000000000000000000acec379756a1fe9fa72f03da4dfa18de1fad19281f262ff39fec77684f0798b6d8aa895db93dab58165b67a875572cf000000000000000000000000000000000a246df19a23260961ea578a68ab4ae8811f9f391f673eab2b6fdd56dae8ff3b059e5b69052c9216529603e7eaf4ff306765d7f1079b142e513e604d577e7caf82cacae59fb98c6f8990522372dc906f00000000000000000000000000000000001bf749b61d7081f1e6141380deb6a5517d64e8c290363306fa23d6ba3b4e72ef53933f15ae77060758287a5a5c2bd4000000000000000000000000000000001661c564a5bc4dd852f35660d1e7c8193d76a48d1f0f3dff25adf312e28ebe9ce8972366ab224a95a7c1f6146b9f22412eeee02d9309af8c74c78e21836f4e6a7a6df5406617e2b4e9d300e37d8a2bfa000000000000000000000000000000000462a37cc68530a1c45001cda667e1ec10283b826b52986adec03db59a266cafc18ff76a666c9de9fc2384c5e336404b0000000000000000000000000000000010736bad21840f49466d9db82f01a922f4d6ab71f8d8ae246765300531b2f806663da2a8c16c644cf871a877b210b9e3f8449caedd55f0a08825cc1a9e985201c8a7a54d1c4dd96f0ac54214743941810000000000000000000000000000000013ee85b0c8f999c9d0682bf3f18a553b64aed8addf87e4baba55c6ad88de9c9955b82155caa83b8b6b7961d88c16c7dd0000000000000000000000000000000011bbe00b5ddab0b579375e2014021e3bfb1e11b7ccfd774b8679896c0ee34d1d19890fe5cf10e33e3332283b3a3dceaa28ec5f9dc48931da70ba0cfa7251953e24c4c95cd019e00ac6fda095c1302a01000000000000000000000000000000000fc3750c957b3eb656ad552c3997755bf28a54fe4aefafde15619133ae04a47f7c65122c86ef36fedac0c8e0d93c3836000000000000000000000000000000000f7f21014b7a9f07c2212af1b85395ef3072b84ee5e59ae675f6fdb9cac858b6213a264a202e29b45a57c69be5259470dc6046b43e6982f11f39412cbdef14f8e330d37fbe6dfa9ddf3656b86f4f60e7000000000000000000000000000000000d1fdcb6768654b6bc1b4d885039f1649066db8037f212b2d699c02606257388000b0543d25aace7cd1426462ec25c6b000000000000000000000000000000001386eb9bb7d8be5cb9e74a37759458091c44eb814dc3afbdf017a891359831ffcaad85d00d8e100886cb5624562ea0390adf4625ec80149b7810767c985c2aa0187987b3649cab8c59a892404ff2aeb2000000000000000000000000000000000f4d6551f5587cdb4d92e13e3749f977f5bd35b5b71667edd79b5006d4b0943331a0b417f669c6125edc42099bea22be00000000000000000000000000000000041b8ec8547b710bf2c15ff41ea779f996db7996911a5b4ae9f23073e02b2c252592229af738f684e9cdf48aaba0512a345fd17367ecb06b29d764b22dc1e262ba1a339b6f0e0c77384245e3d41cda970000000000000000000000000000000000c4a3756f2affd338f688ee90501f4bf4be43a4549ad8ea6aea69e5a4be015c97ef088da1a39d1103f866f1675f401900000000000000000000000000000000023e5d0bc92794536d59425c4bdf18dc5a208841953e5d45ae91f25d3c61bf66e704a8ca62a574ffefaea854fd23b8d65ce5e62dd15958e6298cdf4a4e899e53644a48494d04fa6d1f73f2dbd645817c0000000000000000000000000000000010129a00ea1c30e98c40a6c86090327d0a9b6c25b488cb0e369bc5a0e0658ec9ac9305e5d1469dd43395f72ef8a0e7e80000000000000000000000000000000006d2f5d4f3f8169f722427dbdee62f45f9791e55988910fefe188d6535fa15e2aab8de5130e81183e6ca25a8009be66f853396021d32530351deec5c266a65519471dce2087485781f33a1423755ef3800000000000000000000000000000000005364313c0d2220ed57bf22cee05b77a53c24c97addae502c7b3275a19522b8ae8167194929770191b96b957b19e5550000000000000000000000000000000016ca50cc1aef3890dd338c8a89b906812ce26e0ef9035d1a026f686b0eecab718f6b0ba401556423ddc99d96dd812d566dfc62eb59bb84b3b6599bf3ce7af229096a8fd5925d4743a5ea386a26c9a6d00000000000000000000000000000000007dc52982caf2f5efa3e1a21e22cb8fc53cd0355f2777272806710a96a22f8e896d001bec053acac6241c7637df158a30000000000000000000000000000000017e9f4fb0adb96150095ad5f0d464549d1489d04c4556576865ed3045e0c477beea3115a6ce63910f797fef29f75bad521d35ee6d29ee4816b91d1664b5957767b4b8066775b37c3b3d08729c949d6e5000000000000000000000000000000000695feaefc8fa22f81bd48a41e6c85acf38fa542e96a7562b8d65834c2f64cf5770ab6731ca85b0c5a80a73622acb83a0000000000000000000000000000000003df65226205511218c263af6fe33a09fa3db22e636da54dd967741657e9da6367fefc5e33a370947f2003dc139765083d283067bac390f556891a531dfacfc4795358229bc9a651c0aa71d601bdd56d000000000000000000000000000000001588a4aaee74856a9d41305023b7eee367648085516c8135fca8c0a6c9cbdecdb2d7b44317286f3a06f92b9eee2470170000000000000000000000000000000005aa06c47bdbcaea82e910b8a2c43c13c23bdfe1897efb2a57d622f5251f0db6293ad21d988c3ee30e33f3a40865fadf873724ba35e4e8b731db36f5067aeafd33f2e966977bd0962fd57cd5ccbfe87b00000000000000000000000000000000140d9a251d355cc6a8ff9fdf2223df59747eed11ad140297b6189a8d49a711ec748447ddcc45733a3c36a48da8cd46880000000000000000000000000000000008ce7046871c0b7f781c667958ff22da6ef5447bd319b2df36c9fae9f5597c020c12c7fbc733cb75ca8f9d9dfd942954cc5934c02b63797010cc8474e90fa5dc88d73dbe5f9be605bf335057fba47ea3", + "Expected": "000000000000000000000000000000000f1abe4dabd68ac4443ff50c0ecc5425ad60973dfbd2b29462254ad618b303dda061d80b28117803159ba503214b9ccd000000000000000000000000000000000d3da8a424576cdfc147e18fab66de0d1f93c05c0dcb08d9d5b2a9f5dcda76600b771991bf2d67061ea5b96d20a45c14", + "Name": "matter_g1_multiexp_85", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000004d4ad5e9acfcabc0b93eb9ea59a778a37d7beca03e285382d10d97803ad63e11aa2e3cd1eabf72383d93528e309c28b000000000000000000000000000000000855cbcccda0476699ad3de8d58b4502f9e61bce8d7db37e9fd26ac4649a4cb831cbb74ecf044ae6014c21148382cca3864a1ee754f6b0a86923e5501d54e6f47d7ab9e1483294ce98be13b7db52937100000000000000000000000000000000156e86fc66a8b684327a4de77c31abaebbaf2ee5f0c4d5f9238c7d4683f08dc78d59fcdc25928d180a6f292bee23a523000000000000000000000000000000000f64634ec7de1fc93959639991df42e7dc621380f4433fd7efeff72ce75f6ac7738396a912f78ecfe70bfc4d0ac4239093064d187f7d21b8b0a7092943de13b96c2e1ac9b578637a6e64331e2d40f539000000000000000000000000000000000ae2c40a49f6539bb257fd759c2fcc9f7b09d00059c7a7fd41422ce39aa0792413894bc716d66dc79092223b63de6ad80000000000000000000000000000000017a82c6a853fe29f98129998708f0d4d2b09fb22b07474395050d87cfe4d3bbf94967e05861c20680dabf3f4367135a75e676b40c09f80be5d9398a9ec20cb811cf6819a130445203d792a4d34fc3e950000000000000000000000000000000013b950aa9b7675322d7b39e81b13b14f2480155f74bdc5793425a02f7de41dc1ebefe4f07accd3719feecfe366e93c440000000000000000000000000000000003378e83277e4b02c3b517d3a8cfbf2d2a6585d028c723b2a263e6ba17faf14bb9aea301cbfdfb73f84709e2af99867693f63a87972dd11f5239c35ce269e4b9239e3ae906ab117f1f045d3acfd16ca00000000000000000000000000000000004d87c87f8f05a0999c712756bcaa0572b70264166b16eea7fc4785a59cfca18d5b819f0e65e193dd7ec38d0756b84f20000000000000000000000000000000012f64e2dfa3f00ad8f7f68e08b24aae83a049390fbdbaf570a7973d8516dc90e9c5c9211130d5c6c09f5b29183e24201145e3456d5ca6aa5910430e5a19567c327b757377aef98c4f46fe9a1f52cdc5e000000000000000000000000000000000851a636dfc668d1c5d5467774deaa78283a6f56cc514420fb2b6c58ec831add57b5203e31377a57adcfd9097a1cde2e0000000000000000000000000000000008828c34d4e712bdd5133e220167f3424491b9f47dfd95406bc833b3b030037c0ac0d2c84b06b4a2891c8181359af350ce27de5d3a5ef941d058a458f3ad2a386f1d66945789e51fa330fd65da4cd5080000000000000000000000000000000011021119ccb1cedf88be6f72d3999df899efc4dc28f828831be911582b61894aa37302f84ae9269b97b03a2e30d66c93000000000000000000000000000000000c373df4c0cc1d8a75cf2b9a99b5889811d3ed42850f55480d891b2f44769a371fa4894cb5bf78b7e995b4912cf47dad87bf5c4624e86aaead712987f313e5db8f2fe6787fc33481ed6e5c4d3e96d5be0000000000000000000000000000000005bbd2831bb4eb8ace45ed719056b95dcf5bda8831bc1495f763ff5e82be9708a004a00ecd102d4fd084579d892e5da40000000000000000000000000000000004de171bf5fab4c89783ad1d0cc9fe697b827f023ea1660b0fa2cab108fbcdc80837d46f292b6062761dd865bd1f905f68cfa3fd0692c9ce56538bf70e77e2a47534d9472ac702c53f2dbe68217d53df0000000000000000000000000000000018b36452aa579eab36db9b0417c999fa334292bc7174bb88e4bb14025a20c86437d5cace5369b90640c81edbf2d60f2b0000000000000000000000000000000014278d1cc3fd07e947419a6a0d7f7bd5f9e13fbd63779ffadc150e3d5efdd1a3f6f6e5ba8516066b75e1925282d0e644a36b13ef742bfe88882a4e635b5fdbd9b079e1adf3423dd4962835c68c9617c5000000000000000000000000000000001365922301de7c81b839e970775854881955f35ef7f718643a97e54746b9d9867ced3fb7525caf5b5bd0d382de02fedd00000000000000000000000000000000000d37c4e106e51c4cb65fef8460846eab04fae7e5ae1d1dbaa1e0bfb2eab7f2e27a9cd5c3cc942e38b021ef71827a0224c54daa7de8446e5a26cdbd6741cc90bfd26c544fdf221d47d509c978723c3b0000000000000000000000000000000003b9de0464ac24606ae840185d2ca6cc78773b674688a028161341b88907213e275d7dbcb8d8bca15b483922a09297170000000000000000000000000000000012ee2a578c09b7563508d0d94ce6ed75d277ebd89a7f1d6095f8992c0794b4de12e33ee24547c271e17b7a045eb3bf5b17ff7a416011549f144a3a65238d62395f4f76afc09496902c064b27739c6d0a0000000000000000000000000000000005b7aa071b76f93c765f946b96a972c1d11a2c44244355e90cd77ff069b930b2e8171f7cb1ba29f7ca6e62d88cb83c1b0000000000000000000000000000000012cabb25e52f00f89f2758790f9a81d0e336ccd7bdff06a79552a346d1966f54a5157130e5aa8db175aa64a431e19e494615de9bd7aebf1acedd9d40fddda34e4a85bc253c5e92c20d984f6c4cec533c000000000000000000000000000000000dadebc30ac3e033f433d8d012ffc70adc146f4d9574e5431360fb4a8ff0891c8a9f38a8754984a385d704086c320ca90000000000000000000000000000000000238439bc4e8c7dabe260c7b40d317014463c4728d79f521e7e321346747e9aa65bc6b32ee5920969c34421bb99bee9d38f1a0417a5a366dd2d8f5ce229afb6f34c1b663ad6eb1d9ff12f38412f00f700000000000000000000000000000000029df69b4ad5cae9fd974da7f58e4c55e83c61eaf011b5f22e1308b56e2c31530c170b304d39eb3e8a3009b67b308c6700000000000000000000000000000000140451659b4d6eaf05db63be5a7b0341612747eea7536b958b0620bdfd7b9918e8bb76c05eb2a528bf4727e38605f99a364da9c6b07aada98107447afbb189626180c5eef31f7f2cf26d5d76ab0c745900000000000000000000000000000000062493361a1a862e63eb8f20b0610a78d30ac8595e4c6c3487cf3add7cc38613870c2ecd0cb5a869110a99b76fb9055b000000000000000000000000000000000d8918e018ac5490c91cf2574e6a6962b69c17883caf2caa473de172b14961780fb237236b56a236ce8c674dc9001547031aa8d860e3b598ad0c4e9f93f26d153f8a8d8d0dd614ba868ed055c517532f00000000000000000000000000000000016470ccd107b2afb9ca03a0efb958bbc165304871e683fd606d2e78f65e34885668c6ccb655d4fa98f5776280e63cb3000000000000000000000000000000000982eaaa34f9301fe0ba1915cc5632329715c506528860701f5e52d1d77b8fabc89706af2c4ab3b729251b9472cde96f290c467c4827c9252b82ff523633ba116c52d15df9cd4e3121ff0e9f754ced5f", + "Expected": "00000000000000000000000000000000112fdd661f948495ae2b9200d959ddc873c53c96ee4ec175f6748e62d76d61d6b15970d3a3a52ae9bda30a822ada25b8000000000000000000000000000000000f5b38208d69b5b842bc22ec9d91eb6b653acea5cb16569c61bfe0921f2d8ad613239e87d48c6a9b29ed6a5f43578987", + "Name": "matter_g1_multiexp_86", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000a9494f10e6187fa12d88e350ab84ab5bbf999554924e781d6470e700c3da78e411b8627459b3359d7363b088bbeb0da0000000000000000000000000000000017edbf1108591996f28ae17beadfd6b52340236c2741bf8474dd7471c19c1f62a0f28e8d8692cf3e700ddd86a931dcab4aaa57782608de34c6334ce5039c67767f6da7b315dcfc772f03aaf3dd1e67b900000000000000000000000000000000052f9c6ecc29239c614936bf9ecdfec677afe80de019230180d0fe529a2e82b9e15d6e081b02475e2bf812cea3ba6c640000000000000000000000000000000003dd0afc91516b50d9027c0b132453fab92b165c08428fd5c2cb994646b6b1cd5b82b7c3f7924e4a5cf8b45575e8dfdc22c1cde67b0e8ec7217c6ec72f36d8a1e73794297819de9ef6f1e52acbd3ec4a000000000000000000000000000000000da6e13230b2236b2bdf671bd5f3f8bb47bfc637d6e3f1796b555a95e51b86d04fd310f3d3198dee604baf48f69ce0950000000000000000000000000000000018d209b03f61056147d6734003daa776011b70a57e1ab17d3b92e2565b31a846d8fb7c3fc6fa1fff04552800b73affab895341f4363b688c4e9660fb0cd17f6c111a5c92e732205fab0d0da0175f683200000000000000000000000000000000116c72b5bd9d30182463c592adb8f73c16d22bb4a22832b8d47b683da5f4b8179d4c80d361ce69f92a393027ab29c18900000000000000000000000000000000026dab8d729338903d46a219004fada41eb666a9a90d8ba115f53da9e89a7bc5d824d7f4071c8859df52b3ede7b7dfaf4c5718fed7503c5e2a97fd6ab0294d6c42b1d35067e9d5ec1077176a4bd3126f0000000000000000000000000000000004e0627475a0d4da458475dbbebd6c36f4ce771bc2b2a8c6adfe9d372ffed05afbea207476af26974476c0cf51a9267900000000000000000000000000000000199ebe83e44a269752d92629810d0c5402f53a1bee03ccafe0b3299a9968ec45abdb5a74a6d90cb026cd9b28cfd2b89f6d055ad484f5054e8bd0d073cd556deba05418ef1235d08ecbf8717b550933fa000000000000000000000000000000000b4918f4bfad81349edcb45439e148af7af6664094412c9a51b887271cc3c46e34147c8a306a19f08922bda9c7146c61000000000000000000000000000000000afc3d1a7c4b6d899149801cb74a7e64a126631b3e758a73feda92a2867c53fd3efd9adf025ca6f6c762029c57706b0b4cccbb062c27a67ae2783ab65a47ce166330cfced1f11b85f87483e0250b1384000000000000000000000000000000000a093eeb354ddfc5ea3090b20312788923c5db9d78905dd31d5bf15cd83521f2f186fd284de0858270eea05d21801aae0000000000000000000000000000000011d047410dbf6df20f81971327b38996484e0862a9f71879ff63462e189471c1ba391496753456f0b5379a3b36380e1296111cb1181f048f51349aa2953bba2af50f7b7b5d2328d435bd63a7df5cfe5c0000000000000000000000000000000003d8e8e3a442f911e23b353e9efe396b746360254c14216c752fad17d96d440988d5a25f044afd37f12d74c89c8cb2d700000000000000000000000000000000179ba95a3d3b5ddd3d181e2312385f4ad7232d9af0c28f375e2036157e4603c1a01aa6c9c91496bb28508e5885bc2e599d7f0c0c7e927bed3fb930fe2d0109f58678969ac8e14fabdf4ccdd0823f706d000000000000000000000000000000000f56dfaafea0ce3152458b7252fac14ea64483e1d4a00a44f95bf3932eda2f2c51f0239e6a7a503cfdbbdd88aef2f4880000000000000000000000000000000010e02e9be7c1b795ebaa84f83bd27eba4f12dd49b146db0d788e37835338d352445e82060dd595f616b4f6d2d03cf4c911ce517fad2609f2ab8d44ae6263623a7903b2cbec683570949a96fad78fc6d300000000000000000000000000000000010ccd262b0cda9ad39177d31be0725b83e935c690fa8e07bc7f24e26f8b03122173f4ba43fe8ac933a7fed79f4496c8000000000000000000000000000000000318da543dfb04005a3cf6d93d6bc4058b4b93c4cd84ef978e6a30dd85d60e5e359b4f518842e73d182567ec4fb236b8b17d28cbcb9efde6d9cdc4c9cda385ce598ac8468d4fc94cc8e98ca3bfadf4400000000000000000000000000000000003dbf6c0676cec0202e328bf408a8fcc38758db1adba3e8184cb3904ed204b7e18db2183f5a1833737ad8eb089afcafc0000000000000000000000000000000014d9add10a0c739dec7fd09c57b3e959f3b7551eab8423ec5bcab4b14e63b7a27f128758d63f8e43a22eeec7bcaddd41a9516e93416bc7b0f3c5ef5da6112abb73fc285a14093ed19d8eddf2411691190000000000000000000000000000000014d0230f7d5c51e6fff6490c61972e2564bc31fea4a6d1f293424934f75629cb96f189c80ab32a79b2e988582d0283960000000000000000000000000000000011813cbbc0cae4cf6a8d5d58859f1c3b75ac53819129f92abe0ba9123a1a277b55231e1a24745d0d2ba6242ee758113c87fed462636eb57506f870ed1c8f66e211758327f4c19bf909a6419312c5894500000000000000000000000000000000006adb1e972755f04cc57170d19414e6930d0e6d42c09f587e490593a5c01ce6e827a6dd1e21570ba11c7e4277d532e0000000000000000000000000000000000ef599058025f40c9f77ef858aaf314faaf8d72277cd319a84a9d7038d81b76aa260df0516dd38633b22f9d3996e4761c373d64034c78482d6673c6906553151887c8aa28ab2930659671b8cb98a595700000000000000000000000000000000008190fa5e3d23c0186ba502a5892b76cf8faf2c15c91ee39d51b269b6bf4bd3e7ea395787d989c1a14ad88f3702cd6d00000000000000000000000000000000118d2d1b28f9180155277b80f1a7937dc7fe6be3b00cbf6a7ddfd08cf653ed11a4ddaa44576e70b27cacb7646a100d03f29c901f9769a42610958a8cd53eaacd9e5c4656106fab536052518b49899117000000000000000000000000000000000d28e7ef8433f8d5399ce3cb847f2633392bf44ae9fb2d402ed8e7e6a22de35c39e4f09ea0fe673ae3cb652f75ec80bb000000000000000000000000000000000ebf2ed9df06e2d5688d0ea812b7f9de78fe292584476b20bd62066977f5e221dbbd8f552547f06a3e821a53aeab83c1125c12599e84b7e648aab52cd68fcca7f1a5f56c854f3c36e0445ab7e2df2b740000000000000000000000000000000000e162f9ba960f452c269bd2f9f06e8bf1ffe737788d6364b1f75ea2788fda7e265dcaa907e45bc6ef7a31c4791b470e0000000000000000000000000000000008a778bcedb58f562c7b69ef3073c81866a395d6408829816be3172e1e825ca6b88f156ed2b2ac5a8784fac62b893896bb9a1d051e33a617c25e17b7ca8ae6b02f16c759cae0df7fbd403372eb2407f6", + "Expected": "0000000000000000000000000000000003f6acb4e1f7856413fe9317bc7cffa45f2053ae62e3b5e2b82ad57b48cbeb4110f53dfcace08bbb1955c21b50fc636f00000000000000000000000000000000172cf1d257572562f9fc390f96f2c39dc5809765b0b94240a554f8bbcc44e3658f22e81d1e6c43742ef24882934cbbed", + "Name": "matter_g1_multiexp_87", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000013d3d80910d9f43a707ba389b03bda49b65081f65096bdef3942f0bde2122ea575abf810f400d47ced92c45dc73837000000000000000000000000000000000755b4f5a055c718f268cf3a74533fe8e8ebf37aff3045b58927ee6ee7a862c8c1cd61f00dfdaf6cccabf981fff16c7908c35887835bf4497d673936f40ed44145c5d5009fae16eb0f3ee9168831abf7000000000000000000000000000000001530565bb621f7cd530c0eeb4cc41c2587ef8123c552aed339f80711c157e1595baa140434385d0977e9aed2629ea76b000000000000000000000000000000001806c5a90120fe65450e84ee0a56e0176e944a3fffdd2c83bf15d7dca875790d2f842eb31f640456a1221e44035ad33ca0154f7f8d52319c9e5cd59052e91b84640efe83ac814d95370e46aff4334cf400000000000000000000000000000000143723a10965da7b47bed0d0b5bdb6bfef5b748f6e185ff2efb73c5756d41d77b8c217a6d92245ae36e0add4d743e7e9000000000000000000000000000000001274e8842cc812435a576b2ac19edb84f72d08cffa129d7f4e44be5cc88b3449ecaa719b4d76aaecf08ddd30f7b184ddc252ac28ea29b5459cd2ae5bce4bf08a102280c093b9962cafb481016a212709000000000000000000000000000000000379e08cc1f47014f7eede433abbe881818c0c3a9cb02bad8cc86242aeb9f9542aedb67313f494fd19971a0a15d4ee1a0000000000000000000000000000000004e83a0e52981faf6a787d0600ccc457ddf3bb81c76117265c1bd011e5b4f3237383e97dad3b019623521b3c94d67df36d3bb5ee3410dfad575b0fbe71ac5df2048f74b52e777fe0955d6e244d434f3b0000000000000000000000000000000009ec14585b72733f621a58f35ab30580f131c93db491d4d704c8da2a7a0a1146e144575083bd963238434e2af48d3d57000000000000000000000000000000000ebd1a1c160ba7c8e3c20745bbde05f08d7f3189ecaa831d05c6a34562d6d3ccaa92472c67bdebeac8494658abf2c0405c30684c596976bf46384e6afb2bad6f821c4a62338d7a6eb204ed75070b197300000000000000000000000000000000084b7f967b141c94df69804a723169f69e05629c97a7a8c60b140787f3361ac87458372c91e04c08da2d01fa96056ef8000000000000000000000000000000000d731a1a900551ca569b8066af85176b934b94332679aa59924eb7d9a5fd776a55b4d7e5ef2413c53c244c848694b06411009058bb8e23b0a4294b5cae63aff10265e729d3601d85dd7f1e8063ce260a0000000000000000000000000000000001847861de1064a4226435ca43c1cfbc5d4660fcac177654cf5d497ba9aa5a6322f1156adafba852633e111576698bd00000000000000000000000000000000005ba738972bf139d91f0a426c96fcbb3b77a01af0f2316f2427a20882b5f355772fd6d6016ed77c31c13f88b26c628763e5489447bb9a5b661bcff2d9a4153a5aad975abdec380301b6d4ce019bf2cdf000000000000000000000000000000000148907d2335e046c50fe213b717fedac86eb3920099526a62b4466749d435f5ce11a45032b60bd5d7b26799adc63f830000000000000000000000000000000004bdc2bab60cf6df6dfd25c16f04edd96d5021b97ef38cad02cc1fc7f12494098eb793d99d15b327185718f81ec0ea620444d520ee01d87407747a4ac37abb7bd4e4c4f1735ca7458cc2e4dcb1d6297c00000000000000000000000000000000145ea0ffc3b24a623d74c27b84a390be062542795eb93a2f71f9358b44b76b93dfc0a2ae507f07a8a07edeed2410e5c10000000000000000000000000000000000d407c6c245316b5cc6b62efcd082829354d7e9e69ad739ae0ee55e6096ea08a48c59ded4595032093c32634576aa132035cab8f8120ea8e91389707a290db4ee69875d7429c6857e74e8bd40dc736000000000000000000000000000000000123f333f3554eac47c8daa1d4b362e42de1834ba9f55e4fee138eaf1a057036aa6ff9f50cddc78dabd3d5557b05b8bd1000000000000000000000000000000000116d786097bcac320327d7d56aa734d76d48a677e9c02ecc0bce550d75082c319f568d94b41e1c57c6075ee994e33304bec711286827f0941ffbb451a8eba871239341a60e3aaef23487175c9d2e826000000000000000000000000000000001012b1790e287a6328cbbcf80eaceb2c518a70e80cfe17143a41c4045e8c6c5317aafcb34f4f56494b401a8a9f21b5fa000000000000000000000000000000000613a88e513248538c1b767ba4d3667bca7aeee7974f691b7e4f012ea9b2b32603eddab0943229f53324c51838d18fe3369d91a4d575d4c142b98a53115a792ec50a290608ad316465487762e83f3a86000000000000000000000000000000000c31aa6f315a1102ea973d13e858d079221087edf178d98fb05701ed0a159309fed05942626b29ade066f8cef465535000000000000000000000000000000000177a3468b7de9612a93b9f2bb3f07acf505f56c63f798b4dfc38a25d0fc133c862e90ec8b40dc94004cfdcc9da197ee7ee472561535a7710db521976cef0c92a4ed89861ecb397cbcfafa477756e8e12000000000000000000000000000000000092095e7a431ff3a8e51e26c24dd4a5fed6d4a4a169b5ef79e8822611da8aca5d7c27139a911d5473442db9ee1529bd000000000000000000000000000000000c59f5a649682e864a792ad50fad57b7cd14cbb19d1feadc3536515f01053fab26950f56bb78d5a51f4368e73c19062f2cfdcb8240f183abec526344e8ceca6a007c35b757928803f854225d3a6ca3610000000000000000000000000000000003930511780f28217a125f524ddef656581a4ba2d461730f0837d1846d63258a02e659b25b882a3c3d077c880a64e3cd0000000000000000000000000000000019c682245c941c76605502785b1f79d37f65cf9ec61a4558092973bb2514de4e5852fc757c2fc7eac1b01d414248acdd60659743dc1977a698371cc302b7579b6d7d13632a31b47df369365fb02aff7900000000000000000000000000000000000edf518026cbf2dcca1d46340c24fa947261bcef36e3c8d026a09068a10a5afdb0964b54b70bb3b27e27c4d2e0bf9b0000000000000000000000000000000005cf718694ca47202be8c0afd56c88742e2b467d01e7b2330de778c434a57610fe7b8bd6071836a58f5d6b2876cff05a652a5d4fdf6d6703c857fc7b10a741b95fbce91fe823d827cc7203be3b3bce0a0000000000000000000000000000000013db13bf10b6d8b1ce5dccec98745dab635b8bc81d03601785185cccddfe2dfb3f3f9f6ed16d2c1a7a6bd63264b094d60000000000000000000000000000000001080522766b6cb5c90e6e0ae11ab4ded3db3ea3c7e69d00f29155283f7b25f762eb35bfeedf00caa83dcf04f22ee72976a30abda185e7d280804952fc0c074ad907fea2aa54da4c3190895270169b20", + "Expected": "000000000000000000000000000000001975e01d64d38cb8f852b4177104388aba62c167da2a8530bc59f510a990ed57be0c6ddfc92622234a121ca407853dbb000000000000000000000000000000000de737b9097065462dda93321d5881430f50631f6f3deabca4c41cd491f1e441139bf8ceb598393ab2a3424b0acf290e", + "Name": "matter_g1_multiexp_88", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001624f6ef9638cdc5f0b16b47ac8c5465cb479333a4ee4caaf6d2b656464d8f84387f01bc1811924312e6cc1e29a590c300000000000000000000000000000000012b3bcce18f60c4b2159df93a2d536bdcadd675439371acce011ac5b542fe1bcf89161fc3b3644679a395aed31dab569f4db766964c7855daea58d1205fe8da572aef06e0ca64912cec7c87bcb2f51f0000000000000000000000000000000005d49b4ea69c41ffa7727b98db08ab3fd3ca0c0261ef04b426ef29e724bd6158b3f3242cb915cf0992f2a631fd9b4421000000000000000000000000000000000f635c26698cf5dffbe25ff496f80c5de6b181f94a907204b79b548c1fee8c7dd426b49e9eb9eb0b17e34a26628c38e71deebc727d98bdec47b5a1fc48916dca1e42345ff5474a5fd6cab0ae99e9f1080000000000000000000000000000000003a80767130cd3c3fff0610f215337bc1b4a88886778fc0dcb6bd3cf7bee48f4c23c974c8883e2cf32fb01a84f9e148f00000000000000000000000000000000173f518f3349c1f704fd200747158940ecc395b04b4c476f406cc27836df182c3f1b707aa05767ff1bc75de42dba2a824b964d74259c216c1eccd7f2b52ffa5fcf151d47bd69bd2768e6466b32eb4fe50000000000000000000000000000000011874da4371ee8bddb34bc92fee6bf51226878e4550aa33313a434b75243c1f2296c1d62d9f31f6ffe2735f4f26a8082000000000000000000000000000000000f82551ba2b803e35c7118f4294626c151c7137eb4b97aa5265ce383f7ebc5ff5fe381776eee724aebb963d2bcb3d9f6124ceb1dbc8004a4b1f8b422d394b0480bca7c0f38aafd8f06ba090a98a1d3c60000000000000000000000000000000010501308d1a05e69700111431a0ca99aa41a991555b9a53df9c38413c67fa1b1836853bda93bbd8679e7724b3141a8d0000000000000000000000000000000000b033cfca384e480f73a4f8f79ceea706d7390e5b702305b79e30890e158ede03814d1a0dffcc3608fcb9926c5c65eb65a2bf15b2ed08b33056a0733c920741f86730dcda9c06aa0e3c135a844cef916000000000000000000000000000000000c7bf31a1f30f8e0de1a4a77b8b6c115d1a5d825b51875cba3db857a9cd2c589696ce2abe5a87acf8d6604c1f1f89ab70000000000000000000000000000000019ad7a6190a69fe1df07d55f8c792fc72cf2be11bbdd83c06325682bdfb5c31efef11fcb819d39f25bb1978570a250218c3c919f31d72ab414f91938089430bbbeaa53ad7a73224fd3f204b80fa1ab870000000000000000000000000000000012befada1cdf63d34ee2334ba2e42d7e69ffed71a39714e7ed89a86fd5cc1c65a01340c986abc37e7e3ac5a22a2bcc860000000000000000000000000000000006e5b16316867dc33a9770aa2283691f379581ff2b0b7986003174d4862d8b73bcc3f325c9a90097328f881b15f877c7f749063165c6db0eb038cb9f1a573de25bf377e1fee94f31df5987f7b2450aff0000000000000000000000000000000008e763f110c9415b63baf27236f1c0975e7bebc04bdaf47ea0d3a2709a455ea48ffefb7551a73c9d599bc5c9fbbca78f000000000000000000000000000000001492e70f2831c87222f7d7a9d00842870b77aa68e87b8cdc9d8ba61f86adce6ea514bf5b8f9d66937b1b640c43b02fac22d292cbcb836843acdd5a3fb404024174cd5c1cef632d1b9b6a73f2c5f705a3000000000000000000000000000000001685898af1ad3bfd350980872e6438048f6cb37398ceab33d7bae1d621b5b2859e6a07b4e4db891af37e29881cf573ad000000000000000000000000000000001084663fadcf81b9818c999c26a84c6f9a3a1f71a0a2982b5c6d01c56c2974656c08e4ba7833d1ef8bcf9af53d2f0732e816dd1bfe025685f2eff0856f9c162d73a58fdeae0dfbeb5ce076e9f9ec1a700000000000000000000000000000000013b077eb9130821bcecfe9b366c7a14f4487121095d325e74de44ea206078a6b1ac7d29a4e80f75c7714b6053cf2995a000000000000000000000000000000000b825b95b52382195416477f0bce73f06167db02bbcb91944e9e7534f804973bb363adca8b5ad80e77b70f4f1b9654d004f117d41a011d36f55d0cb53d4f98de3b1a6cb55dc8a76b29d393bc21826ea00000000000000000000000000000000014c48b3b2fb994920957b046643bfff19533dbe533df980dc60d9c852a3d07b8cf67454820a89ec9c7ea73a209f911ef0000000000000000000000000000000019b19e64d977d40b95050e4af365541b6c815534dc4abba7ea0af4b0a7e6bff0495fbb347250f5b5a48020ac20ea61cb6b6f5ee0549b28a1bb317cb020ae0e031dbc381075772ff582718fa49db486d20000000000000000000000000000000017fe39b732e6b815bde4078cba9f926e117349e3e49fcfb6308a0a09296fa27da4580d8fd18b0ecfd0ca68312cc0e5c10000000000000000000000000000000018a4eda1862c5c296de2eea0e720ba13f8a60defc65870f0112ab394e8160d6e1a0beff5db8c450d8770792b7efcccba05edf9812adf95c9844b2da06f75d96e742c0620d1cb0d47dfd9b68d0bb76128000000000000000000000000000000000e65750f3b9690f25b5bf80de0d76da21752a0daa8ce01b2bd8d172577f6c7d46c119ed20e73617ea163575705343c4c0000000000000000000000000000000019d0f934decb53a477b37d894d6e651a8a4f25b9375bac6b6d3483ee8d85f56b8374bacf74bb8550bd26b3d326962666f64a71e4e7652860038df67c99d97b1e5a063370e65217531253419bf2e6365b000000000000000000000000000000000907fe95f32e22ed75f94d96c191bcb19f88355bb84f91a8a535441da04dc211376435ccc60ad2089835b51e79f24b5900000000000000000000000000000000071e35d64ffa38024f4ccf7c4a713e22d8fb4b8450ba7b05ec5e759c2f8ea30e7d9e71ec2c90b8c667370131de785116059bebd962501b8381b67c22055ba01667d916932713d7ca427cd80d8f76b419000000000000000000000000000000000ccc90617f386ee2a76da43a745972066955c8e346d3de214834ea79423e7d95a008a6c119d640491d515b801034452f0000000000000000000000000000000002588711ccd23b65cf2f63b2d602b1d7dbf97cdbdb159e02e3bdf84fa65685e14d4832cde3662950a7fcfd11e68ad40a47b3448b9b404e184f7ff20466aef3dbd4e08375673ca31fdb303c88243fface0000000000000000000000000000000003b5acf5f4e39fcb32a267034c5e905eb3df32f2f6f7150d94cd17bf16e3a9fff9dfdf75a966040a6af5a623787a40170000000000000000000000000000000018e4b8d163e5176bc9a45da14fabbac696ae6870717bf5f6c00b5c73dadefbe329d86a761935b18e81d65ab6c48e241567d9d30b38b252a0661c12dc69127ac380f3f756144801633e99bc2ffa2f463c", + "Expected": "000000000000000000000000000000000905fd0b04e8db7657431b5f69f1d896e79ecee300cd67ea8fbedcf51b0389506da0669c28ac8158d5357a61fbc3976a0000000000000000000000000000000003235ff6d1acbceb35cd29c5fe524a452064a6e51d1480ce1e57c538b2ab6ec4f98c3bac676817e25e2d92e701ba881b", + "Name": "matter_g1_multiexp_89", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000688d6eaa2964e33cebae16623e228256937ce9a7721c4fbc85233ffb3edad5d6349d9c8a00c16faa0efd9c54827f46a0000000000000000000000000000000019fa249ce7be07208cdac9f9927163bb1b79b40b320623fc1a08a299d5500cacdc55386ce451173f683a9ce3f006c1e4aaea75e63204e177d404898aa51555767f813c3f3ed283405ed1ee829b04c85c00000000000000000000000000000000078eef7d7951f257b17c579fec05f3efe332534b2f56a953a701a8b92664b9a0b37959f7c3dbd77ac18a5e72d174b9f20000000000000000000000000000000017cb59169aee6caa1dbc3c47c29f977a44a81d33f1cd298d5df3e9469c8543d919b985e1b588a96a9268cef03876effbdb48a90ddcd791e6a9debfabcb1c71c88e7ad98f9e739ee752b381b28d7656f200000000000000000000000000000000025bae0252e5d83a3b76f2a861ebb1312bd344e3eaaed5e7169de248137a929ab94156be11e9b16ff312180d856d93900000000000000000000000000000000013c207c57a4876f6bd6e8e87eed0021d5e6b2aa3b2a323572fc2ad521e807c366fe31ec285c8412f89328cdf09dcbc99ad1795823d3834496b0a1c2c07431f9d76071db77834005fa1228393ad4ce3f4000000000000000000000000000000000ea93e5fe055ed1ce77de5d298fafdc4201418489b64d10c447de3973c1b98c184c0cae1d95831742f3d50613c5cd8c40000000000000000000000000000000004f2f3d0a5caac826632ee95dd1aafe181976552abdcc7db737f5693f3d08d3c4a85365e05e369365a37ef1b3df5cbca36d56e38fe63e573b02203be04ef9e1a044e1754eb2db50c6f9804abc4a40f460000000000000000000000000000000004c8b69c09f67ad17e8fb9fea4b7532c7c5bf3edb7669e26eea4f9c8f0bc10b0b1895acdee731da5999318d83095ef5900000000000000000000000000000000054f950a1ae65dfcd40eca15e5fbae984e7672a23ec030eea0cbc0424cc8073186b8442e0d71d6a4a77cee37c1108f941a6b36f4674ab19202037d59fd8e14369e5d3d71acc3c76985b813d81ca6e24a000000000000000000000000000000000b69b6b7b6cb1569ccbcea029dc71560d54b8bb88bd33af1c12a09d867fbeada2e58585385f1fe508a0dcdf8d2143f71000000000000000000000000000000000277561e6ac810ddf4c46288a065e5441ae0fe2d7ee79ebd6cea8712281a36f812c0bf49c21beb63a1f5cb670dd37d03ad85286877fa7e5a9a61dba9df5ce35083beca7c2f5ecad13d226fa32b9720e9000000000000000000000000000000000c0f4206d4cd564be1efcbdf57f99ce43b97d3e170017fe352ed3ec60862f87730d4d9d9d56ea0aac4f586d2f1786df900000000000000000000000000000000073202e8c73d14469d15a392589db79f3897b72bdb2b788da9012c7aaa167a157f85f3431161d35f45bdfe0f2255b6378fa5387c5712832b52c9c72e10c6f69e9c1c5b278aa379140e75e404c4f50a2c00000000000000000000000000000000191cae6012ca07ddf511ed586ef19e9f0d913d081cd752f033c9f74c334c6f5d075b4f6ec85467caea7836f51d0159af0000000000000000000000000000000016e65314e34e1c7ad577a36eff992abe6f26fc5349d12db12394bac648cbc1452cc366aff69e8cc4e2e5bc85db237a863023298162ebe7f4ae6aee45a8a6ba602c3942a8bd6b35636fc6b85596a582e0000000000000000000000000000000000bf583ae5e3a7827610d91c0d2433c8d358fbc12c016c59be8454c039197971f90191737993bfd08aa96d7838b7ce6dc00000000000000000000000000000000046fc386c5b456bafe03fc84b4f98939f9c736ac74cac507ea036d2443066090118138547766f637537425f64be9691b8ff2430d2f82c6d5e7424836ecea15af0ba2d0bd6498e65c65b6cd281a7b8f28000000000000000000000000000000000f08b3868ea056ff8e82fb7e22a6522985e92df1df9db77f787bcb3ed701bf8c90badcfd94e9d3e3b3b68ec497b9fcc700000000000000000000000000000000002e6f5e9eb44fcc7aa96a43856a707f5a82cb4c14c99b21df09e666d4802d15fb50d535184b63ae246d4ad77b6c4851415eea22058493dbf6ac248fd2ad8b4734ebe33761f2177089a3feda396001c000000000000000000000000000000000167e13cc54e9e9866bddff0c37e942ef8393a588ed3c2e90da12d0a8360edd6c3980bde808ff16588a57100d1a8898fd0000000000000000000000000000000014b21a7a106640b55cfeb19d3c23aabcf1c0be78fa554613e68404978b78e5d34b6b6378c2e87d0b8bf1cf3444d0db31ff79e3ef5d32a751b713180be37d44ae55c59c5a8121c132c5098ff972d8a9740000000000000000000000000000000002e8053215ae6894e8df09394353fe98b38fe4b17b9f20c7b48c4baad91519587f63b863e4de79be71672e1fb00d337a000000000000000000000000000000000c2ef9251a148f1ba8cd75a60ee18ba6328e1c3a6780c790cba3bc91a2145f44cb8bda5257c03890d5c5674e4d09296d039bc7274a3ab172285d853d368da0950203a48ef61b3c7564644762279c1ff3000000000000000000000000000000000aa7fdd550eabb1b734db00400304be9663c008d322d67fc771a85991bca6413ec07ab3adc3cb40d390fd41021434b97000000000000000000000000000000001994d9be11443f0a95a2ba4f7240a9dbaaffbc70256aebc0f10c322fc5b120feb2cd8492d02c60578f8becd7a8e589c92c47d0b1fd24c1c66a3cb0deb7d51ea19f0fc492f637ed5d4d03e102cbdd05550000000000000000000000000000000012b3574c35288c63930be8024afcc91194b30d2b486edae832dcb34778886af5816f7478df166f0a7e4752d8c12423e30000000000000000000000000000000012cd382d17ea10ad3fbfb40fdf4f3814a19384e302542a0f5731920443e4498a1f8f4d89086764beff079583a672b93bab4aca860ae4bc20d33808533c9a70108b153bc4b2256003ad4bbc11dc92898500000000000000000000000000000000117294ca9961249be6570ea760bb1e562cbd587f78be482263e4228171d9ee3d970b234455912299933689096f4afbd000000000000000000000000000000000029f88a99c750a388eca5dc6939082280ddefbf7d23997cca3653aaaa03a3ee4677fa8291641ad1f46fee0f8f1268140297500a2747f9a68b2d8d9ca5b0390369d919897c53d422cb76c5a283c38669e000000000000000000000000000000001006f64c279f074bf036897ded9deaf9b4ca380a9a7542490be675355c3979b2925be09ac4613fd6b7a4a8bb9e357f70000000000000000000000000000000001537e170e8dd88a92a6bfedcef69bb370f7bc1f32c36d203f5b6859be9b60fcb4d1e3948687ac7791d867e7c200967eea87ca4cf226c212c80f3db5e4e781ad7391fb73b1124d01cf893169d1c50ca99", + "Expected": "000000000000000000000000000000000603f6b2d8b806c5e399c686878eba299131204084e2c31c38640d757e8a6e5b318da785d54ec8335398610e9e3956280000000000000000000000000000000002abafc5839180e8aff2bbac4db043e8839ea25d8fcb7f6faba2a1c0a567863f256f820e846e49b3296a754650ca9b4e", + "Name": "matter_g1_multiexp_90", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000a2eba2e26da82458a494738fcc816405760f4991616d729415ee502d13951c319be796cf35d88a8e00e17fa3c58126900000000000000000000000000000000117f6b75a6e25a786e860df05505f8e107b23c6f4338b2f87ac8740554304046f7cbb43f2193da35350e5fb39077ff3f9abfe7e05e8a210604355a77f64386a01323407d9f25397769cc6dd141bc6643000000000000000000000000000000000f6e3064df312fc97c4f30d3cab398f7921453b933d428a4162a37af5ea27c79d5b21d1d305a9609c994e61e56db226a0000000000000000000000000000000011edcb47b9d5339d08f24be87e52eabbdf701ab15f7799a5ae26cfca9d49e0e9107d9d1f09c711039d096a5745b89c9164be08e7c2fd15ac0116ca941b85615c6deb38fe85e2c0fd22997e394b8a6769000000000000000000000000000000000d6bf9e905e907ed86f5d3a4cdf61c527ef43ea0befcf6bb7eb1bb790b3dbdb83e0b958836669827251da94db1d07c420000000000000000000000000000000007f85bbbc54af3eb9e1c7e4c4700b4c784b8d2e6b2ff6a981a534317766790942898b4eabbb8d6c893180a436faf88870c391dff1c0c303c77b2a1fff24f50250dc793338f7d7f8f1d54bf7d87ab37da000000000000000000000000000000000b17bd374136dc1717cff915f7c898e049e892ced4ba57a16752a6dd875cf1cf9a2005dec3e3bc6f87b7a257d5ce7ca6000000000000000000000000000000000874999db06d15bd4b2f60e9b61d195747d12f38b75b74f3089d5b47735e9dcf79ebce22505399e16492c4a6e0f83abba2d728e013e5fc3e1ca24c105a0c268cbb4f152a97e318f3aae33186ea6bc93a00000000000000000000000000000000179108aa8a7d8443f69b7c906f9a4869ff4c724aaac4fccb5f52cddec86e32180b3ab2f66ba76d57f69416b70334a0f80000000000000000000000000000000007f83a847f4c7e7b35fd091249120bc59719ede5b6db083b33f5ea6249f9e13457511db006f416e0fb9614b8d22d51e1e8da0c8da19dc441f53c54551579fec5d820ce2e3599824b24b7c5bf1847c589000000000000000000000000000000000154b40b3bcd0ef04a5e1a550215c238adf07f92757c227e4d32e42893ee8e7e4fa9d7169005220d89b11253cffbdbd10000000000000000000000000000000018daff3cf04f648e59d00df4b86d8ea5dc74adbbc6fe4f080ea7a84dc6443d8923517a11f264f700e209af9bc52f759c76e90965adfc2fe52e4341895e6b6154fd7a097e052b59e4935c8267a6f0e63800000000000000000000000000000000163cb54e83a9935be82161939360356f7f0cd0219f446fd243d05f6333c68a1aca8f5d2dfa2b54dbc07f81f756ed6bd7000000000000000000000000000000001667e7a040817e83896d62adfc4a9f3d329e87f7d598217c7d2195c5b0c3eb58047d4b9bb640e3959f7ad1242e10783f7f3f352c7b7a9e2eb6c87edfc99e2df3148966760168f6abb13ee482f223a01d000000000000000000000000000000000222ed79e925d64fb58bf0cf105a2087c538c9538070bd742f7acf5e00ab371766d286fbccb3e708bda2d227523a40cc00000000000000000000000000000000126a9569e9ba97e5c41cf11af3a601560d037f1594f2e352ac86c744542618e9d2b6def0c7d3bb6a3707b80cdcb60f15d35c4286f19a9fe8117e37132ce4ce76e28afee25ecca2f66de3cd5e1c83235f0000000000000000000000000000000003786245c244c9508ba94e994dd510a7485f4aed711c75a2f509cf01b784eb12ce2f3907156aa15675e36b4b2587e9770000000000000000000000000000000018de0e75256cfcfa2df959f1491d87dd5414a1b51b6ff02ed5034394ea636fd0bc5d3b3a3b84fa7156ca7f97aa65feea3c2b40b7968a39fe8e4f24acc25b6c727887c3c44cc89cf62eb14a78ae47e86800000000000000000000000000000000026828a6409635184cb929a5b3fbb881ef013e8342cc9b5123ac82e7ce24fe7aa6a507ec3c017bba10126ad9bab5e63800000000000000000000000000000000132cf4a23eac460fb1a3db9aa43b542ae55d19f6bb2f408c399a570c1e479c4dd0462f9573c95c953bee07a51c543c4e10325465403dbd4898beb740884cc325923ec3e1d7483540377d8bbd02c1138200000000000000000000000000000000035220c800af6a330df6b6b6cbde47abef2e5fafedbb7a0feb84a317ca3cdb79eed934847694e85e2873ef97b31b6ba10000000000000000000000000000000011edd4c17352914beccd8c062aa7b95b913f35892c7cc5dd8f736a31a33d33a98d8f9b4be97ffe608531eb7c9643f32109545b90dbe35b0d5764bc72d45717e0c3aca6aa77c73178fa8a3ee9fec9cdb30000000000000000000000000000000012148b58f805c38bb862dd9847f12aad21d1ed760a022d2f619a0a077a0bd79fbbd6c066f0f6c58517ee9e912c60a37d0000000000000000000000000000000018dd847881616f7410f29d4e68854ded4e97b31d5112fd46437739ed62e6d78fab89b078581d052266b7c2ce403d3a79eef0f8014102664a300ea9a30fdc7afeae3cc338fd45cd421a1bfea98e304c81000000000000000000000000000000000e36ce625adc496ac94b53552effd651a73ed0c69abedda36e88d408ca7bee73777fd87b4f55e2e8b567c2fddbcff3d50000000000000000000000000000000008a209510caa720f20cecdfc9b0bd71d3fd4015627d0227a027aeb9992ec8030056a5046feadaf149d2392fc98fd60bfc8f1e08cdd72ed200253211e3b9947cb2a5fa24079b6920b4a4d3f1fd78146e8000000000000000000000000000000001373edf053517ee79eccbf02cce4b4b67d6efc53917b7cd548379c3f78b447ae5dc331285a28bc2aa5863befe2d26f4b000000000000000000000000000000000fce7f982bb8e937802fef7b3fac517054e6c9b288b03ad6497734d78d4b9074e22b1acef45938a08440948dd8b88683a7e25b1a60b6c6080ccf1bfdc37aabbc2bf92079d9356844f7f12867b3e2b2800000000000000000000000000000000001ac8ab3b3918836a5ba14e3d7c44eb8a0d909dbfaa2772cb9d7f8f517963662b5d4209e9a5d44ca0ed897412792792800000000000000000000000000000000169f8127198935f06d26ad8e4ca3ae5b95ad967aac69f7958fe9fb9c5b1f0e98e596fb73a0d8bf90174ca21a02a3e2c2dcb456eaad2b7c71ca32277206c1a1dbfa7e0e84950cbf14aadd455fb58e398a000000000000000000000000000000000c1cfb4660400ad5d7ba2f394cefa878c6a8fc214823dab539c0aa6d08f36ff1bd706be273f25ec5f1abfb06bb57e8160000000000000000000000000000000012ff9bad1a1d71fc49e96950c74d388229d4e4c68f7fcfafa42329ae06d4dd3091b5b1c95f6498743393b6e3ee794e4ea6e7b19245341fdfc5927cdae57f59de5f3fc8c37f8653e5aaca87db682034ce", + "Expected": "000000000000000000000000000000000630b9d9da596e60b15251aa74de850ee74c7804414e3e4d7113cb3d5ad6b985e436aa67bed66c36f135050d66f91f75000000000000000000000000000000000ab084fa126c573ed007f983e01737453b3dcc99ead0a74cc0e8d7cdad89ce81489384b311b7ec4c34736e9520b37e1e", + "Name": "matter_g1_multiexp_91", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000015fec44912af2bcd34f1ad42ed24b6ce430f6d07b311d65ffd8b6d726ca23f5bc4b7437d158a36bd1790e806fd5ab448000000000000000000000000000000000c4a4de9940c7c26999773a396a8f9a6ff4b86f0525189426529d9cca037d504385dcbf1c89eefb5ae2cbbb394be42fc92898d9cbad829a5346c0925c15b585de18869adfe796e46cbd56828540571b7000000000000000000000000000000000fa1258cb0d8a37009e8c56228bbd11aa854a4695bfe96ce205efc1c9f32bff8afb64df0fb7863512ff8db6b091f146200000000000000000000000000000000188f128e662e8d28be612c8a17cfbf28b965340487df40bd3f0312187d027cd23b50e713e21f8595bc790ab8011919cfc193fe87634fb0bdaa1700466881b557c470a62464e8521be311a95dff65eca6000000000000000000000000000000000c7b39bc2477597e37910b1888ba0afe5ed03e809618bca0e543add93519909b6cdd6281e2afa65a9b45627dc1c6334a000000000000000000000000000000001335cbe866b3139dbe22266c4ed5f9fdbc15a1b338a290a590c03811b6448244027c12d118e6f829dcd352a419bdd8283dd9c99a5aea019436e3c91030d03ebefbf6ea6ac69222f1870fadae32f55ae600000000000000000000000000000000178ea2552d03f645fc3060a61b35af6e3e12095ec65b2e9972a5e346ac1019593298925a887e59a94af2adfac7a8361d0000000000000000000000000000000013996dc427ba51c4ec1f67b30c95659f35c8e71a225bf357f636fbfb428140f9b9e5602eda78bb38e87e3ab77495e505e74ab390c3f73c62eb1435226e9b4f9b921ea1918a61a614b9bdbe9eebd1cd790000000000000000000000000000000013555f26c2e10b79f8f2a4c397dfda0d8839a35a7cc15673ee5da34578f3fc4d38bd0331a5c42665bf40fb2cf693f31e000000000000000000000000000000000bb16b5b1dacac465a751a68b99def392a69a293377a22194fa4d4d6662b912d3ad804cbe51a4ec4792229de57923ea14dee3e2bfae3820f611c30df232c1d9c6bf58d40b3530858c79f840720d78d7200000000000000000000000000000000120183e73d23355da316783eb47ca687ecd34d85e800aa65d2c95aa5f8eb730a33d3273307cc05d81fdafcee5138a080000000000000000000000000000000000171f5e63fd3c71200720cba782ab863ace945cf405a2f961baf39ffab2d3283c26347ba297d16c3f2567814c6f9914e795fc8e20dd30622876a94afce1c1a76e3b689d6848903c21103cfce6a8a956800000000000000000000000000000000095ae1795306c8a8c48730987a842a05fcb263d1f9ea49d3f3c0ae70c7ff636fa4e7fa33a35637059c0b11b1b1adc6e000000000000000000000000000000000185e08447394763607d6efd8660118429469a1f6e7edd03a7a3e12ef99c2a15670d1f7ca664a8a14f52814db9810ea2b25b49f325e76733eb3c1a2cee5467157b2ee80987abae43d2c4b93e5157f08380000000000000000000000000000000012b0afa7f55ff9131a9399cdf0fbf2da69dae7cd504a0160665f0cd74a02163b8ad7ab05cebf3195495a1637134cee450000000000000000000000000000000002a130747763c25b9b6c0436390da91f02c9d5b24178318717024390a841baadae6a9f933e7f87f7965fc96bb498ade5df49b30dd6aff459f64906eb1a9c9b2067d4f1b75057874b2fee17923bcb906e0000000000000000000000000000000018911ed6adc5f48db7221656c622c6cb981b1ac1bffd64e30662035c0daf4bc5accbd53cdb1fe8eb60628262584de15a000000000000000000000000000000000b753d21d823d1050f109683c7c153514dd06663ed0ce118e388d18d36686e94588159e5afbeaa492d021a700caf2dfa959e0a33b1fa12e0ba960761b09921b81746b8df23e808a8de09e7f5cbe2bf41000000000000000000000000000000001107292ce4d57209e9c1e2c396688ccbe005699de4e77b1a221f9004585ae6cf8f901da6811ad85a88cd85cb819d040a0000000000000000000000000000000012cbe9c273a8a9c1404abe51af4a647f6c89e7e177efc04233586d70df6dad3aacc9ce2a9fbdcf2ee5c73396fe4e498d26ca68383528f6a871c237ae5214b49c18c4f3e2f3ef5dfba39e69eb181143d7000000000000000000000000000000000297e52ddc42a7da1025d43f46df11009ee035a9ac45e09a0902ba86fcfc5a4bb4c35ae8b0e0c9b86a8ed7e5ab751947000000000000000000000000000000000319c082c39ce4e59b952941dd7d14f3fec39a9eaccdf7bb41a2b935f876ebbb6778c90e1919c1e5804df91abd3bd9d5f1f95a9d1d4e8e7d0f17a954177253709d988c3a77c77d35b8bf70294bb358c2000000000000000000000000000000000ea5a9d96509cc5675e165e3a7c9f99a8c6b7be9c33fe5fba895a2d96a68e922271c90badf3c41b3ff52f359f5c6dae300000000000000000000000000000000106614bf5ae42409881f4889a82c6a3bc8000bcdec23b093ebf29b24cad128aaa7aa17566c4293f67af010e9b5950028b481f986998d863c98e55a7661136a8f19d7d4c57f6036cd642ae16c82cdcfb300000000000000000000000000000000145447f37207ac8d58c706af0b900dfc1f2638f840a0b44fa65245b5e671ffc6c008951ee17217e010ea6cd5e8477d4900000000000000000000000000000000187c607539f8d2b6afd15efa353e2fd1580cee48c469992785f02b3ea3396db5359e0d6743ff8d41648fd8680a4a8c2bad872848d72367467094675a819f9aa6107183aa0c8685d5d84c27b3aaab33c10000000000000000000000000000000012a022fc2dd9c201e9d86a0983fed4a71abd086068b8ab8c9586cf51230acafb084d559239d86a3713aef4b87a04c09b0000000000000000000000000000000017e02d69776c705bdeb9fe06d412a67601c6763a19c840f15f96de0fecf782e3a44118def54286cd52227361f0db3bf93c2c60541fe17fa8e71d58184a055fa8b1dd0bfd16ac2baa912b4472c6056122000000000000000000000000000000000e09d94291ce5e8310871aad89e0744e6b319b4fb1089048b0181cb9e885aec881fb7577fe0e80222793068deed473560000000000000000000000000000000017c8676e4b8216a98d9e9a05891ccb74e64d72a5ae76dba1b5ab2d1c4eb8291cdefe7753abc5fa59efc4a4834f815488ff07c19ad4f10ab47e73b6698f9febf3f28087614759e082e6e717588c1caff70000000000000000000000000000000008902b3f9b3ed6f0dba21e5d6bfc13fac8f003b3e11de4b883024c3eca0d2c4614604d598d31d9e328c7ee4a9d9be6100000000000000000000000000000000017a918bcd38986300bbc7a401e09b9ae20ccd382280b4e79294b6c8ae7bb1dbe2f72a582e0125381ef2b4fe24998e72f240c881fdbfc414d3e85ead1cdf166ed6929d0b2ccbc35f0811473757b6b41af", + "Expected": "0000000000000000000000000000000015e9fb1d1a586288f07f399b87c37a085df405bcf88505a7d2b0ae6609d4baef7ec358f70edf838d3bb7291c6e5a413c000000000000000000000000000000000cc7d7e2d372183766a842f5c14c1f2a528d502f1bc5dbf5dfc9d812c56503a0b7cf1e6f052e998aaf45cfe24a261551", + "Name": "matter_g1_multiexp_92", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000002cdb1466c13290ff0c55c38ca6afe33efdcd09ddbdf7461d6bdb3e36fb5d8be851458620a0bf54932c4ddc1778c97bd0000000000000000000000000000000012755c81c142c5051ec64de7c89719cb59d9003fd8785ed5b36993123418e49cd3afab18b599deb72c969936633a956114d5455ff1717bdd545f4daa37e145121e7bd9636d7a2b65633e5ca5a63f2d9800000000000000000000000000000000067b3a33aaf3fc4b885035e60ba7f3afc7ccfff469cde1a67f48fd8cdf4b15b7beb9e2fbb13daa9283598aaeaff5014d000000000000000000000000000000000bf43cb79d63db544b2db14ec18c11bb9114db93662e8e6e7858d3e4a99cc332890ce90775b6c190d5ed418571fb907d82cd8da62bd901355a60b37ca14ce65d427bcf9551203cae7c346a49b4fa86260000000000000000000000000000000019329a66132ba7ceaf5c030fb4ae9a599895aab7df2a27fd92b55e3a52b99ac51107e798175f2af83991eb63147901d30000000000000000000000000000000005c71bf6552c314dda4bf9f2b4fd8aa368c9e88c0cbf4b1c2bef9137d608738636f40579a360bcaee1a3f12274687063ea2c7fc2050e9c1ebd05d15f197b4b1be61c6820c8d27ade57d85109d7f9824900000000000000000000000000000000048a258134ed95f91070684d04b83634c2d4c16601ad259d41e7d27292897a4d4ac76eb73425583ab1718b91f151019e0000000000000000000000000000000013a0b600765fb760919bf273a7b88bba568350ef82fc382babafd40a7e006e6808a03160f3747878368d8f6b31c619b1e3bf7e661d54796c71437354d7d3182770f10ab450827512a423d3dc82d5b43d00000000000000000000000000000000069d94fe286a9d39b64756e79669add0f66db69ead7db5b5c2fa1a9e5338aaa9051457a3a744c3b08d3afec8b87d2e9b00000000000000000000000000000000105028835bbeff46cb7d9be4b21f07670dc5589603d0d695355591ef5f7ba28c04c8e6dc40f0bdda031bb54a5710b4c0d3a364e7b217dfd649d1e08f76393372d8768bb0fc85c79ef4652417ef1637fc0000000000000000000000000000000015e6aab154e33627f92560e3def26d936a8876c52490732c807749cc28e34cb98fe8f86addb30e129f8149c504d1dcaa0000000000000000000000000000000005f6040a129df2340f3c3fd0935c02cfe162fe1afb58dba7699e7e08851b3a3c3fba36745bbc769aaf01a4f9a401d038eef7b05d5c725ed31269ae9c56dc7ae35048af39ab114319680d4af69be7e7c3000000000000000000000000000000000db5640083674fc75c0b0d1b2d6eb2b03cafa2e63d7a65c894d9a76b196d92916ce85c708c6c451aad65e0b439033d9b000000000000000000000000000000000ac8d6b508ff6797668ded6ceba4680443516d601a155cff48a51297e321417bbffa6eee042255e9ec054d837bffe628acecaee3dd4dc11e341b3dd0073842d90f641d4dd467a6596f337a6147bd30a90000000000000000000000000000000011daaf23ab5fc0ad7abbe7d5f1dc26c8ce388491cc049f01f287eb9b133e52f33d40f8693921d330ae57853539ee30c20000000000000000000000000000000017594ae7ac7f6e4f02df862b6d4ff946ac1a47085b554ebaa720ad3291f576ba720dd455829600f930e3964a44e5c7f30cba585b847bec40515a257cb839c7e5d677d17b7313c258e83d630e65cfb5d200000000000000000000000000000000174b5b9d4ef01fc9d0f05a03612210690d7d57ccb772aa53175f11b9623388de8019ff2ae1d564e7b30ee06bafc37a84000000000000000000000000000000000e4c03b8dc45b0567e9ddaa0a085d169799d2a595c03f2ac679fd858cd59341393e6a0f62dfac0e53598af4758843673b8cd305c650d2e1cfa91ef0aca9dd0d785d7570d6fb67e61fb9b6817116a054400000000000000000000000000000000197f0ad6576bdddb48c58adb1c9b2115cd9b38368dacbea9220d6a86bb621dba93325b676071e38aed2338273c98c4100000000000000000000000000000000011514f08bb28c37f078a47b6a0d53b311d5975c8a3c8e2c24a25f34bfdcbea53bcfa14b7f23adeb20bf440c87a251a66825e5f9d81273f306a065fd064ae24bc2c5ce8dbff6b22128753663a218da8a3000000000000000000000000000000000aa5f3a29c47fed2e4a87bb4c2a46a5a17102535aba9426235d42f00007e35d1c902b43c1068af279cc9a1b689a0dadb00000000000000000000000000000000056d9729f8faa8e12027b993e8dc41a340d61c64e4388c3166482ddecbef8d04085d6ae3764f0d9cfe76288929749235307ff9660ad0c24cbb139486638a2556687f88fb93a290a1d174bf87d780b3fd00000000000000000000000000000000070e376dd57cc8e2146d49ff08c6c6ada6302c36c4eefc3003f0cc3d75040d73599c7e0c2fb9f7e24484c37262f0eb330000000000000000000000000000000016a272b79edcb7e7fa92400bd55fc937d6389f1f0d3d2168656815845d92ab1e7b555fd4ea311802a62cb6c94bdc5d58bfa8ee3b44c70ba2512c00a1aaecede2180b08ac3ac8c550d70407f0c12e027d000000000000000000000000000000000bba6375b28ead3d49197ec9d3662e34c70735ed0f987f05f439da164afcbe98f25d2ce7a5e1e32515eaa4cb7f5a1f98000000000000000000000000000000000b1ec74ff999ac5a7a3ff2c91e93e5f0edf5f296b063d80bca22fa64198a798fa6b6385d25cde65b789454bc2674231058aa85b50e5f4ffe375599cbb912f41d35acbb85a324880148f9b9003c4265bd0000000000000000000000000000000012fadbd9c50f2e8518dc15d95a59ccec0c9886488ed4601b3fddb2bddd77a4bc861f2862c9c4666622e42a5dda7138ad000000000000000000000000000000000b2aa31218a13b4ab0b00d1b76a9ac7bb3d7e6473a29f2f0d137ca63bf7f152954e52182d32d3de31df0e6ef0d102c9e6810c6cd59b14ef4f6a4c2702cc53c65b3dc84988372c1195980417c583fd7ff000000000000000000000000000000000076846443079520c5b1600d5faa5a6d500998ae355c84b9393c79f83f1a2485b1809058bc53cf5f8a1a46bde6cf2e300000000000000000000000000000000012027dd1a4fbf6078b70c507fc2cdc0fefc9a0166694c796eb26e9838195e68fc76297e66e2a0e9e069274d110efb095c5ebc09190ba3df49d8ea55cfd18370b9d443f9d9084cf84f2236ef4723d2d4700000000000000000000000000000000183c019c306c08401b4f2c1d852b29dc47b56bce8cddfdb66d4e3d5385e4bc75bb9806da1eab476ee02e25ca2b4d41c900000000000000000000000000000000066d56711b80dc8725e112e4e2af6c939977aa66c931c6febb21735d78f5afca4bbaddd77387e52dd5bc9c29cf26923613a56b176fc835b7e825c817d432b9ec6d51b0a66483dfbf12166ee979b664cc", + "Expected": "000000000000000000000000000000000f75ea9863e14f6151c452f7a4268b099f97d076b249d02d72caf5d52635bca3c686070d4a4bf997b753c283c82cec600000000000000000000000000000000014402b3e738bee3bda4e62c077e9d355ad8a71b0830ec0e67a4fe6dc59b1f3f7809ca7d07184f53c5afed32db327598d", + "Name": "matter_g1_multiexp_93", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000107072809eaa84dfeba5a95f94aecc2c985c9e5dbc49a741811fe4b2393ba7f6597ac99d8e80c0fbf715a164099e9d5100000000000000000000000000000000124d1694bad88200cde42f1e7721f3390df8dbe4745715a2f0b6f11cfc78996c6f342693acefe88b3d83736cac6e3e05dedf65658ec3cca48fd48e844337159af090c5d1f5e9d713ac6d0fe1e1f193d200000000000000000000000000000000188a853e19d512149800bb0aabcec450561e5ad08b5159e0879422cca1f957ee15bad2b881979d7c8551eb19693bddf3000000000000000000000000000000000dc097932535d21656842615f08e7016f55752556da3be69027d0dea621ef46cc65e335873e041a3dee6c7e5b7589dd5db65ad6bcd6f485eefebda0badfc64e9e7dfe7e911f3ccf4f4fb9528dfebdae6000000000000000000000000000000000d3a53b9865082b23226042f69ca71b99978fd6dc3c8553e33ddb12542d05b026345a23c2b24dbd934be2ba3cd585162000000000000000000000000000000000b0832950405431722c23cc78bf0b9f33c6e2dfecf10e6d503c8c96ca9732c7e7a29251fa5b5b161d14b7155a50846886e0fa09884a7ff4c801ea0722cf6bfa58a46fc3d36058e8c395ea8fe56d9fca40000000000000000000000000000000014e19a8a203bd2e9e9601cf6feeac5699a3b2d2129b6e756b9b5a7af0cd9228083de8c9a2a0ebacd636ab1b662c8c0c7000000000000000000000000000000000faf049bd6532cdad26403b269d7dbdcab6c147ce0ddd6285ad9ae0e8ddab4b6706bbf038fddd7f63e6dc9a766928ec327a3377d7b9ff3aee2ce1194a22d7115b09a9fd53fcfa5e7f76bd9fdd35559610000000000000000000000000000000007e2e69d6c96b1841340c48e8ab070c67054b574bd5778a8e38a9873241baf8b85deb73695873fdd9e3387fb1fec3b6b000000000000000000000000000000000fd151202c399636a360cc014c90caabaf3b01d5a6114e078eb2473bc2fff94f1c24597e39a3d2298a2e9210726bb48e446a62ef5760c995cb3cd0984d607c232c1eb0df5516a501ce448a189a3134d8000000000000000000000000000000000ad0e842dd19673bfb8534ee20591a9076268eb203940212f702131fc6a3e7b226a84324954eb4bcfa8a007669d2317a000000000000000000000000000000000693801615c5282a327ae034c3a1480de0e1c471a412f194178a59582509ac6fe8ea22c8ec8e98034348ac465527f4b35f0c1a7c2dd281f7d2f006497f99f65d6a1e22f1d9aacb08724b3576aa19e19f000000000000000000000000000000000ac9f4f22670b52e0e85a37bcdd729b40c45fcbd6e8aa78626752d736771ede9c570991e347134f95385bd77e404e4700000000000000000000000000000000005964a351f406083b14726ced542fc6d95dcb8bccbd41aa3ca9cf0395d8d29143b897c66c78e2fe56eedf17d4d6f6c1f94c1476ae0a62c502aa096a371e30ca885dc13fc417e3dc9bc00bcdf516764100000000000000000000000000000000018e270b6208be13c23cabf52e31a156209abcd7bab03694fcb7035b453bce8464fa1e090d59a1139fe451d8c699669c800000000000000000000000000000000158dcfe7736f4fc63071a70923d81db9f7d2a03512724dc41ca47a873132da66eb0eda58134312fdaa63ecba7ab529acb677bc9f1f7572f808e969aa50efc519192ab8653c71090e5cf8cdeb1a3544dd0000000000000000000000000000000000a614d7a53b7a06e71aea4014f9b951bc19747cd8822da50f7993c0821e05100dc5fc8d043b2cbe7cc4dcae9837679d0000000000000000000000000000000004e0495281282aeeea480fa47f53f8b521a7df4c5619d4e58f730fe346a6deb3d501ec8b55b581489f28b4d991ebd90cf5ca580a25a5c87015f57f7c23cc51a0beb5926c84d44659e45512da51aa0cf4000000000000000000000000000000000edd664ad8b77d86bda4ba772f677d34c9341ce2b4d2af4b2680383bce0fd4468e936841dd57753d06c50a3357a47eea00000000000000000000000000000000063eacafb540655984104f60569720625e4499f048ec7849577caf240634ffc42612ca7ca92c17e3e50aa627059cddf2fa1cc45c35e266a82899d8ea0c9c1f96f96140eace41a8758a87975b088f0231000000000000000000000000000000000a9d9bea7d8a058cf254d2b7e10f6d2e8244cf131c6f87c4e25b5febcac352d02b1b45ba347e0b891c8b08e7b5dec82d0000000000000000000000000000000001d256cedcde615d01e15cf526c4a8bc8b565055567aa1de1847b524fa49b4b9f654f5b66cda0a78f414848aab42b05c93d2908aa9266844eb265c2b1c17f8357a5ff039836ba83c837909f6a9d0bc03000000000000000000000000000000001519b05b59250c72c9db7f425954694b29b36af21d9293a36d7bcd1ffb53d0ec55a3ceb7980580ce6f9fb6a0faa7bf3f0000000000000000000000000000000009e7d045b69e2dccad22dac427f5938974a6394c9fef84633fb5f90a0d09d437219f1b7ef7e7bb03eed106948eeb560d3b94325aad8a2c80971a781bf6f6bebad63ee37405ab7e903fb7094beef14d060000000000000000000000000000000017cac7707469b98c6b4d24fecf6d818dce6c8b9eb44bb08d6e475e385c30fafc81551e74ee98cc854d38d77d15459e750000000000000000000000000000000019d5bea3e48fa7bd273233bd6325bbe38267e4950dca4fd9ad051f487e7933a366469107258d69f0603b2f9a8dea2e4f5143a8e734824840346078aec03d6760564870c5ee2b2dc13f8a39ac452be9f5000000000000000000000000000000000b993d9303ecc19122654d5cb10d488af5411c451b39b1e19e7a104477da50324472076c55c4557576a9e5d7755a381900000000000000000000000000000000172b34e576f0539e32c5025b3a8f25b5bf407f3f3dda863b194a9fd97d3a6facc00902c95fe076b91713bec162f61cbf0dbee37fea759c2a58cf360c654f85298e8ff44b3f900e8229c3f838345d053b00000000000000000000000000000000170d799ffc4c0abf6c582b41732308665d790900ef07a74183826e48c9f0fc500b09109b2b13b2b33cc17e6e639d2969000000000000000000000000000000001943fe62329fcb67a45b5155da7f950ee12fcfe0e8e9ee15868409ae44adaa5f03c330206d7d97fa733c9e93957755a0b92f9db82d0976f4c379622c4028002ede2ab17f647bca3bbfb159045cdb342b00000000000000000000000000000000078681739039a022499219b298799027a341be64204a34a97a8115e5e10486420c18664825b764fd7bb931343c2558a60000000000000000000000000000000003313d3482f952c6f9cd4ec2f2b61f28ecf7d8cc7e60f17e9aac8e63ab25dd6bf2da2d67805debce0dad8fe37a36625298df4ba50cd5cb5a02d5f50b3ba23e5f5b0172a46cc315a0a94fed05551a68af", + "Expected": "0000000000000000000000000000000010aaf24dce0b05179769031ab81db339cda85cf68963640b888d3aca310a6de690150166c0943d658e51524981a1f391000000000000000000000000000000000d1af37c2bdca5886d73567cb00d5a9859755267800d7239cf39c291ba83b1c67e6a3532a2d8e8590c1bf2d845001038", + "Name": "matter_g1_multiexp_94", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000019401d9118a5c2b0c6ae40507cae6180083258eb6c45cb8bf2fd5d2703c95fb07c031c82d0568a395e18015fe0a48a2b000000000000000000000000000000000511b992882f75fe98131fd35276b7a1de527b94718549bb4f5c9980917b6301a86e45fb7c7e3ea99e54158e49c7e60ee49662df81f6bd455ee554704ff0c7d5a589d91e017d7ab4c500d36378c17c89000000000000000000000000000000000d886eedf2a2b33a50dae5ca6f41237c9425b0a4daf08bf4789a3ea8c7f598d53257916d9c03df0d63f12a1a804fe0990000000000000000000000000000000012cb777812e76378f04fdaf2cea12456aa9e11b4c3ab0f12e63fe7ab11c716562b07b3864cb9dabb7970c81bc1da324c79eb26c79d78ab84c4d7e48e56889a601fda17901037a74fd79355e7536f39530000000000000000000000000000000009f09107ccfc5c4ac9b7e0058d6a0c4d7dc4309134d5fb972de3156a554211d4a2fbe639bb8a93d86091137671ab8447000000000000000000000000000000000b7f9955092221c8a2f09c6a9ffe6483ec0f8a0f6c555ec1772c260fb62c4ada6dc7beb92e29620afd15466b5f025cbed2918ddc2bfb7f7cb3d7e74b43b9a972c5b51ac20ea83f41d5b51034b5714c0b0000000000000000000000000000000009a22492a1b78342b919f7b5c8fcdddac408cdd3e8af4d6de5a4b1e510fa3b7e0e6887bcbe074fa839f2d0dc892db631000000000000000000000000000000000e5eac3a77c7a3e89e9324abcc0203046948f3d62e40156a5e1b1d9a274d408d6cb49e06b8cfcd21b596923f86c02c6be9a8159fd7915c15db69355514d9dd26c66fbd14af969ee576401b1b782fc6d30000000000000000000000000000000019914b405a24e72896b3d231582f0075fa7e59b0d0bc796d790754902238943ba634dce66131260efbb5dfc3925a1d54000000000000000000000000000000000352a5a986c500e41d2fa4f65e5a917061b3f9449c1e720caac187c6bfd4ce14f1b49ad414864a1510894530cfb4a768c818ce6e33e581595e83cf8d33a62edc26ed38c22f20c6949a94e2652bb954cc0000000000000000000000000000000019567f8de70c4cbbb25335e69154ce48d4106c8c9d0027e17c67777dedf758203b0a8fa3863d4e7812311f6cde36a6640000000000000000000000000000000009947f7401d03fa8b0801b130b43f729d6a71c04edfaf7b9d3265f82b039131fa09f20f9b4565d21939ab7dc7dd3477e9ab338e94b31d22947dbeb20fce3150127249d2db6107d95bdd032eb24c496450000000000000000000000000000000003c42ae9653d1d1f00d79f8b1a0c53d0f2d7f3ca52ca1960a621fc1bead7ab31cf6e5bf30c5cf7877c83b33b6b5b54d6000000000000000000000000000000001221117f45dea3fa1f832bb8280512841ad1798b76f1dd16dc320ea7c86473f6f8c98ce007ebc3ebc39e7a860be987fe96acb797236dbd0316fdd355f07b9b45c9bc626f73105e87c376af4d7dc075d30000000000000000000000000000000004340b7dbe7c27014add4ecbdf310de758ea5dd1100508a96501ae3caf9955c877113971a61f66e3691d09f0a259d4ac0000000000000000000000000000000001d5f83065f6d178b4dbbe0f00f0a88edf0a90021601bddc2cc27fb0ccccce7e48c6283a1e641408a20de15219b5553e60bc12a8b34e717b2c410d026660c14182250d7c66f8f88dd4cc94e550421caf0000000000000000000000000000000017679efa923688425fa9cff1f8e89ae681245371017f574f4a655aa780bd11009579d7daa47249f503592bf0ab79e67b0000000000000000000000000000000018f57a1ee533981c8df24895ad174228330ea361448ed63e522637df44cc1b888e969ee94d7b44bd532b655123f8f5d8537f0f732fee8b882d254a81704d2310c05dde186232f3cffc05401fa9830215000000000000000000000000000000000bf47631b34b2694ff7fc5d1e25de2195e606daafec34fc2c8ec86c0a325214d874002422810a81cff654eda187076eb000000000000000000000000000000000931c54d05eb43195c3ff6b396e324b5878c3fd507637c316c62b3b6e2d3d84cff9f33cd1046f1939187979330d3fc431a22bc0bec2501a505cc8e00a24792bb380ed451ab6f56fde07ace8b6c9348a200000000000000000000000000000000138adb70a3dce09176914deb0be17821cd0212c6ab554f7e200804dcade06c6cb5f7b084a1d6ac0ef8eeabc7cabe7717000000000000000000000000000000000a4422c569aced58938abb7bdbdefdb27cb06677c1066d17f98a59f847928d1bf2343acf8b5d1717aa38cf81959ac1acc7b10c801fb9d929432cbbe994b404d3baa5633628f396d20d047fe2c2ac2914000000000000000000000000000000000fd9ff095adf9e3f666d3141717ac4a96deb5b4f92dcee35be1d305031d06d51ecabf863a41cfd8dcda0fc94ecf79982000000000000000000000000000000000fb55855aab9e557046ed53421cd3627b519859e26338328d7da249fdfa6a07fa533f748eb5dd564f9922ad911121b2784f2f3f31d9869799ed8bfc2cb129dbbeeb096d771730ae2863c4ddece66158d000000000000000000000000000000001054ff028d2e2875330e3d0ffc52e2a83ee2ad2adf024ee294f695113d9d645f0be2a3d3c70f758f43f2deeb542aae810000000000000000000000000000000009a5e96cd08d3ee4e740e2f7b94a4e390ab5f6f572c4a1b2d927a7ef2365557ab9be65b8e2388fb571a3765892a96445c62206fadb762c23bf77f69f69bd492674bb92edb39248ad2a432f819304e6ea000000000000000000000000000000000bb1de70113edd86e5304248fa2f857f1620dc8a6bb28680f537e04029aee158e2ead4e0eaa373b812f6ca988dc40e7f0000000000000000000000000000000012118b670c9df77af087ad01e3b766d4a2b7c2b2a319cd733ed6c02ec36d9002036964fc442db992bf730c57a7d0a407a6f950de53d07fda75ab43f73982c2684edb06317568df15b8712dff2ef782830000000000000000000000000000000001968aed17e572c0d99e4e9262f239771976dcd9d7df19c20bfa94aefe1d4f3a3117bbfa4a6e329bc6b9552731446dd10000000000000000000000000000000004e64ce59b928e8cac2f744bef119018de8395b712013b0c69855fbf2bdc6a750a947b1a81c9df959c78367ed0e1575d95a373fab5176d124f783a36eb2346dddd5c4eba9e24e4c0cdc4f925e2e24cc9000000000000000000000000000000000148cd980512e0aa153adbdef262f098b1ece801ee4024b5561e261d39b495165851781d519d75f83dc5f298d40b4e9e0000000000000000000000000000000001dd43f37950976e50071226b6aa47c229085807ce9634e6583f5a2d47eb8547d4de0669b16a2771791c9ccdb4289cd9319d855218eee020f9cf8e4c0b6004902f0b16eedba8a1c911476af34f65dd40", + "Expected": "00000000000000000000000000000000059c7ca50efe2d0a64b55a560a08976b437c350860f9599fd30370d1cbbeacae147144c216cb3e63afb2ddcf34282a5f0000000000000000000000000000000018f42ef2fb8eb6cc8c31600a3be37ece06ee567ce0c8b8c7a54c910041b8c25b2d94a94722904de079737f06e817f380", + "Name": "matter_g1_multiexp_95", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000172bbfff135f33357b0dd0e8545da99c4ee74d6414724c2aa66ffc85f3a9d0e35ac80850436745a12ca6f1c4ae5c0ecb00000000000000000000000000000000152dac882023cce1a3e1fd4d8d5aedcdf6acb2ca9628a94ce92a4a551b1b7268589b52b2c90af6e4be9631eebc2ef8a62a397c2f19a8c4e66df0e062f179be2f45a0c5e104588222a1a78447512f299b000000000000000000000000000000000c40d04b3002c21b041ea8b8ce967056435fadb479fe1fe20c373b2e2c5b568b7a38d031424bc835bdbd85af8ed1d0380000000000000000000000000000000005e7357194364947c8dc32fd74757a3f3014e914dc25f42b2dd86230ca4f86981476e6f10b1559694bc17d014cd243d7f193d5a575c80a3e7599923bf5a8ba8a48e8f98322d1d8eb1da42e446d518c1b000000000000000000000000000000001474002c92db026ff5bce69eddf1d8ff8e6d2ab9427bb82377911597fafa4d60256836c094cd513a52a3a09797afbf5300000000000000000000000000000000176a7b311a333c2d4f6eec66e8c889ecd7becca75fb35a38bcccae52f10ff69630393fb7d87c3b6d97cd648be099c56507f2013742ddf2d35448feb80b6b7aaf2925d3975ce28ed2b1ac789886ae26e40000000000000000000000000000000009ecbdc4836c6c0cb4ccd014f9e582112bce0d0ab047115f38ed5dd51c54de5a43321e85c9b3e9af5fae0caaf2493fcf00000000000000000000000000000000034425e05f0adb1577f7b1bf9b9b50a76bc894f5ff0e9a8d190412eeeaf80d0bb96f21478fe8adea327f69c9137f57094e637a80a4eb1b2caba68b6828aa18f956c62baa7c5e9e591a15156c5abb6050000000000000000000000000000000000ec3d4fe1b5e1c26de1558d7dc51eba3b6c37ec037de184e8a6f481ae20b830c92221593e1bbe4ee76a85cb10b33e18b000000000000000000000000000000000e51f811e16f00626d934e69024b55dc29fa4ea363916cd8f44f928fda6e3ca4947eb15de24ce1952c39e9ac52d2739d27671631f9afd9d2e86f263f5c17c3c11c7f6e43efb6d75cb2cb8250094f2289000000000000000000000000000000001205dfd803ff3688c2023913aecb10c138be4d03756e2f05a63627973f511c2635571469d4f630758627f7977b418729000000000000000000000000000000001186b9c0d2b2073b495ef9c233c275922bdbf4691e8be085051c09e245242526b13b7051782a80726b381a72b5ef9d5ec2decb1f482f3eb48e7f52b89f6452b659812ef79bb42fb25f03aa9969faf9bc000000000000000000000000000000000413f6ee9bb25469af4298dde67f0a4a26d2f528848ac6646764703922c78d65e046204f891ac94b0b4c425110fe986e0000000000000000000000000000000011860881aa871fa3a6693b23fd7b1da0bcaaf044058ea0700b786f12f1074c615577e572e33faf8b3562bc285632696d911eb1de54fa8ccb746336b681504fd08f995c864a8dae2aa866862f81f0e7850000000000000000000000000000000000010e8fe8fd7863c2807a4bd717fc4646a0e4f99598b9c6c2cf0547d039d58290a367e4ad851c7a67e8dd546d5e328200000000000000000000000000000000063ea10e84e4f5824ad7b9b68398c9154ab25ddc4043a4990d80e09dd94a890dbabf9c3d93b13c4f40bd7b1ff32b14b2fd0a61dbcb0c657e824cbcf4670a31a95ecbd47a9b93812cd5124f3ac9450c1b0000000000000000000000000000000011cbc725705b809ad69c5ebb55ade0039989728e7103b684feb35c8142b100175235c2b395e37a20aa40845ebe2dabcf00000000000000000000000000000000057b5b5a5cf5f5bce985295f8a50252967aa54e934e87855097eb083a59863aba19ffcec4354a5a831b747175ba10e878118e9c70cc5def8e7d258e05273937c514131f39e0cc9fd2a3620dbffc7ce3c00000000000000000000000000000000041043cea626d6ab553b95c6e09de597454a3a3d1b8a75fc9ecb3afe15bdd8b5e73b8012ead8777df8957701fc9c9022000000000000000000000000000000000185da96dd1d54bb7ca5d7dc2fbe4cbd8ac95f06fe85a7a26e5e0e6353f6a6daf73b74117ee62be4f3fb268fb4c86275c445931b79e2b826aca02d1bfbb00c2dfb6d30ac2ef97a4ded18243b1afce773000000000000000000000000000000000a06b91559964aa8e8628946bfb720047915ddf08d24fa34f7b241e16bb163ef67f1e84fd205485d17725a8386a7016a000000000000000000000000000000000ec787cf5134bbd832d2a7dc1ed87b8c824552d92fdb30a790e1c73b22c753540a9747eecaf14dbf867d9667b7b852c7982ae6de98df906922e660d461009ba6c04cc6497f3645a66385c775b21b210b00000000000000000000000000000000053bfa3bd311c1780afa1862de6ae8a475b8eb9c61fcee2b63dbb6556022d703bc7eb204fb038056c654dfb940e7039400000000000000000000000000000000074ab5797d3c39804dfd5359b69a4bdd2b738670d13662eb2c112eefbc0f90da85dd1a4b6e0613785fc66b100d129202000674ac5d09c6c599173bbe9a43726c120c3a60a96d43954727a2f33ac4320d000000000000000000000000000000000cd50ddae4f053bf5b7b3237701bdee2f5167e09d824d260e89ea498fb3b593e5053b781c159302b0433ead35f072c850000000000000000000000000000000001abe8539a4215a3b7b78c79c306dcef7334c83f571f4d6836e1c1839a65c8cfa9a0811395e3c4bea26b22ac2175757e773f8e9637886d795b75e7ecaee512005c1780e7ab17b9f20ae9232595478bb20000000000000000000000000000000001e6e0709869922c36e073fdf1404a973e0467cab3a04a806361e743d67468f0d66de28f6c0c7b8cf92954330485db0500000000000000000000000000000000084e96298cca174344b7b86052426f9316a15b4031b9e42677253fd9355b1c99ed9ca3eb3949005078ba228d4167f8b0759d0bab12ac790cc3a16e88f1a108e670681f117d4fc7d01f8c5a2d6ca7fe8e0000000000000000000000000000000002c5e399eab947a52660807752ca662212cf3a201c1127dab3586cae88f8ab6dd23deb0312387178e0e9526bc8fc7b8d000000000000000000000000000000000ad86b21dbf58098fc4f758d7ec9204bb16cbbe680b58fa42821456d4fa508e42b53c8988dc0d9a4d6f6a782a5fb90b6cce865074a8a41f8a3f40228046c5be68bdb50ced10bb73ac8472f052530293800000000000000000000000000000000181f41dfee6effe70a28e4c53bb6cec52f232caee076f680fd63d73cae24b44709fc63ee3782a36278edcceeb7b32415000000000000000000000000000000000088d9011a9db9294bb4451e9981e84efa595462e26e5dbe14e9c84a8c5ddeca94f49857cf3b8a70e6a4047ad76d234585e2f9597c9b687150864e90ab042f4f012a54d92cf9d2ece09e4a081ec9773f", + "Expected": "000000000000000000000000000000001170d9938910ce68e56f9e84be6f6ad284a244adbf26daf8d42f6411c9794b707454ec9300442fcb7a0f08eb91edf86800000000000000000000000000000000043679c7a917148d141a785e65b0a067e35a016c24bf7639ba374e21a817819ad67d317ee70852bd13a1fc3a373a38d2", + "Name": "matter_g1_multiexp_96", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000008d9cb39df5b28781d33d996039da8c94cd810bb85aa5868008b4267ad2a8670924d4b3ad7898b33689aab2211bb9bdc00000000000000000000000000000000007a8a6f888722e4717acbfc42ef1907206db31603c403e0a8c1ac0af9b37e63124d4645a506265487e5f9eda09c8baf85431a1df7678e49ee049b75ea968ca255ef456dd58cce57b64edffac1ac223c000000000000000000000000000000000db6af04eccb3ceedc11378406a26613aebbbc2201a9ea2089848c7af3b34e46a3421d5704242c4b333f72180f6baa0200000000000000000000000000000000105f40c8b702f0989a9e20f72ff6a4f7310d81787e87638c33a61985f02116e106218d64976d50bcc61cf5bcbbff7c9eb6ccbc0b600f11f1b89061d94c6fbdc9b1d389244fb29a5d140dab8842d44eaa000000000000000000000000000000000a77e39abdc9d64d72ea4b321e3310a145feaa5d342bc1a5b16c0143dd01caeda4f18909acccb3cb5b43ad999a94f91b0000000000000000000000000000000016fc4a4f6b488fd1f45a158d941d7aeb5d431821589ee845c64eb198ff10931d586f8a0678237be2a394f5976d895bc854dfe31190469897c30ac3736ab166220dd3702df5bc897835347713d03a8d04000000000000000000000000000000000d0ddfc05bc9f89eed488752d64698bf00633c83cc37931d95a599d6be6e4c5d611a4151839133e86f74bb91aed1703b000000000000000000000000000000000be3dbea501c822730ab0176f64903931aa46b0179c59556ee7e1ba54605ed8da2eafed7eb2254a7ddc34e553a9b6d59eff1ceff9e5184dd9fea44da4f07529823dc9b100f776cef6f6881120f7de11a0000000000000000000000000000000004d6f288744016f15b21da736283af2ed1f45df12067a3a70391f66fff3ce3953a51169eba6288cabd84ffe7f597c9fc000000000000000000000000000000000f6556a63def531a940269b073ea98be79558d832123dd681bb4446d4c11e2fed59a2f97904797abb07ba53e0d48e923b273e4c6266c1f5cf022902fe1310d2191af91c47995486342bc61cd361eab850000000000000000000000000000000013e692a13e79c734f3758780fbdabff86fe5936bf6c60f2f155ec4d1c49cdefb97dc02c1f1e4280c5ebb055914d93f9d00000000000000000000000000000000060898a9365ae49697e5ac23e320261eda04d818c5f1153f647844b1910bb3430d3c06df9a64af8ff9dd25c18cbfa79d1342b5cd4ad3179f406941ef6ea15d0aecdf9f6d96dc334c39b7dca89d256d4f000000000000000000000000000000000a2a4d92ad63dade4d666ea949dd64d5886eaa3c7ce466677356ce9f65520591c1aab590b48e9fe1eaa0f0f3e306cefc0000000000000000000000000000000002a2bfc836409b33bbe078a5f89c5142411bde621e9117ddf9f81f37bd546c3e2ba94975ab4652fa0858d5a2361592715b36620f65ed84fc0bb344b4b73f4eba4b1680a47b28b47f6d10f9ee8239812500000000000000000000000000000000075d3ebb18437feb21f94ad5e2ce96cbaea2f6d68885483ed54ee67f2dbcf8cfa39f405afb46e45d08cb804a7aee3b8e000000000000000000000000000000000d42851366ed4694730b7c58450c3f9ebd365f15fa4dfa3fd226d180aaa921a0d897278506ede76b85decddc9580a365249ca9bcf879a770b0a054422a6ea97ae795118ae45532c1523c842696de6d17000000000000000000000000000000001722e05d33728260ebf5e4b48104cb2c89b4bc3073767e56fda373bc0e29261c9a5c53e5768b453b116494c1109cba2000000000000000000000000000000000030e4da8620007236b89103b215e54751ba2f2dce19b0304997f450791880ad34f3e43cc4e6852aa599fd65ef72dd9a5c014a0aa616e809b674390b4553bf2d9bf325e73d3a935eba94488dddee4e895000000000000000000000000000000000c4e7e44e8e0387bd99311343d2ff3a080ddad557c8639aad64c4f6e47d64f48b91f9de2e33b4b9c182a87efce5d4e0e000000000000000000000000000000000e7cb49fd7aca3daef3c0329c950c832e1d007f21a4f950f367eb37b5d7433f5d6f1ab1c206232b2ee32137b56b53967ab722a1c20f068b6955a44073914c418a082345796912ca634e79983a24ec4bb0000000000000000000000000000000014026b8dae20a1913ecb45359e9ceb317137244e16a036ac760b47363f2d389ef6cb12cd5f5fb9e8e31ccd39bf114f8b000000000000000000000000000000000f07f9e76789dd937b85e02a9c346f81e87637bd03bd5f98a9b18ad6d109100b540aaadf1fec048530bcfa35dbb5b8ae8b314f83cc3ad501caa44b4c3ca8cf68c70ff6920f445d3a7ada212b6a19ba3e000000000000000000000000000000000a0249c354052094cae5a3d77313360a8956839af614184696b5b7fbd2af6555c6ae14a150220f01d624484b9096eaa700000000000000000000000000000000043098df38ab37f42175cc9f9fa9ecbde75bb344776ed078632b3d8bbfbf04103adde27ef0d361177bb3814cbb8bc54994ffab83099c69845cc87727d459ae300a5725ec53176424ab0ec8bd3f80eaff0000000000000000000000000000000011e90effb7ae193b47afffe6fcaa0a28c358222cbb087ce479b7fe88d25386c5a9c9527899d7633eaaed9d982d3ed4e100000000000000000000000000000000174877f80e5e9daf2cc219545ce67b904319f75c0284e41552662512727c1e05b364364c4c8835c1c9c6fe028ae45895b1d80be637e2abd98d0433150e14b629d98fc0918c7dfc179204669ab465e90300000000000000000000000000000000170e754e54f64090c4c7520bfed82665b44728904092fe3a4fb2fd2d3667ccd4ecb796e5ed9fc4dafd315c0b6dc22b86000000000000000000000000000000001081e62ee7c502159f7a8e28c5ee45fb7fc5b301f3a081899bce10096c74d1bf7834d12cb7fb1301b986e9c6f7501d53e670a57ce4dcfa680e60ef33ba99c437e4fdb160ea1012de36f4b59613a6af85000000000000000000000000000000001434584d8d1cb34eb29fd1c95871f218f4dc46f8b2ddabafdc7049e88f54fa4b80c88960a76411e365aa65cbf77f01ce000000000000000000000000000000000e4e2e1318c5907a07a7ff154b07e959d681a69c066585ba046b8889d417d01c503b32a924500944d43e68d7da8da35d54a999fdf391d3944318c54680e69b58ce3778683b6f2c607d64450ed32c6d89000000000000000000000000000000000945a9d0603a3bd0278fce30f0cf97274319a760291fea5aee143c364cc0bc60e59dcd1093aca1a3ef64696ec47845e1000000000000000000000000000000000a77cc690d55763a94aa48c210610833427ed3176b6dca184598755f539359bc7302f8dc2cc941d447d9b5b68fa716b70563ae7b444cca7ebaba36b8d59aaa5c0e6c1454a4a2907866247e752e640a7d", + "Expected": "000000000000000000000000000000000ac708f97c9e9fef4482af7b95c59c2ce6b8826f6b046b5a29ee2224ad66648a8d1f9959ff434c77394199fbe75780db000000000000000000000000000000000983fb55837062305d7fbcfe8c76cce1c431067a97392923720a6c4f963839d7d2661e2a8dacad1f151f505748239798", + "Name": "matter_g1_multiexp_97", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000ae003001e3173dbd17f4d6598fcdaba9966f1e22a06ce747f7d2a06b2bd37579d093242a4940bd816ced07ec1917365000000000000000000000000000000000b27db470845f285c792da64e870b818a7598fb820313e075ec72e78f59f3903cb0860b749bfc67540a8bc80e844a8de5b59d128b5ac47106b4114cf225dceb621d177141ef5783943f40a54ad94e9900000000000000000000000000000000018a33b2c2f1ea187672612b51c8dfdd9e86674df58ff4f77ff3f71628e7aafbb80ad22f34ab4203c42bd39a4f73c3d6d0000000000000000000000000000000017c3a68d8782a479ba9aa829e3f261a3e1b832595fe3922d800349bdc2bf58e0c1b523eb0924bf0996e38aa83267f570a057c0405e24b7373f67197b2109b633a02589711b6a92ff49ca024f893d7ecc0000000000000000000000000000000015347adf6539116167ee71557b78d8fe13373512ca7d8d365179e25ae8ed2c6a65e1f643cb0ed677a2f44eab809d5b640000000000000000000000000000000002360dbbe0b7f8e97f6aec4b20a7e6525d83056975a4228901b4f19259c9ff2d2ee00da9bb9085232fdf843e5d305561677b05905180182427efeb848b2ba2eafbabc7519ab33db14de0746afb6071910000000000000000000000000000000005b62380515d49aa1427800077a11a8f01ff00fe7df53a13a9266910e4038167ab747bbd0705fc25ae2cb0e2451c893c0000000000000000000000000000000008de7bcad1c67d7f1fb5cfb9d20ac2134006618ce0d22f4120f5396bf8164c0effb0e3ebba7959e9dde757973080a9cc53e7f69582f4c106ee5bfccba1d5f557736c1b75b6e3777cfde47d552e6bdcac00000000000000000000000000000000185bee837e3212323dc40fd471ed9a1a58f2aebfcf7f07ab761d40bc1ed77b385a134c99385d07e75c5f8c51d6496482000000000000000000000000000000000d7d42e4e18040da671799f981d404085fed490182d397685498e80967cb9c080a766d5c8822152d78920fb388b979f534c87bfb629b817e7ab97def7400b0a83e47af8d628787ff814733fdf34ba8d50000000000000000000000000000000012961da3be1ecc774fc9df2dcd87c337ee50a99df7c4821fe08da7327276a24d754be95b6e916d5c63926b6e44b74310000000000000000000000000000000000e44d11949fe33bc3a0ddfcc74c5b0fa79cebfc0d4a00a574ad7659c7a5e72c728ae4ee031af57e9135a3eabd93686edbebb60069acf431e1671e3d00e4da0d70fa11ed4099b21d45a2b811f99dd9cca000000000000000000000000000000000f03c013d5554584c2030ea02cb451ae508fe6dcba72bf7c49cb47a25d3d65eabb2fe043b9ea90e03571aa7b64be8b11000000000000000000000000000000001479789662864eabf677d2a541e48e5ce70f35a2cd6c0a476d4179d02955a51123e75c650888e514aecc85d67781c8c18b1ee2765e762f1b8c2451270cd5a755758fd733d7922a537aa9f1fd7d0c959600000000000000000000000000000000139bf8fb623dd156a3fcc46eca51e61155cf58e2dfe8edfe717effdd4418c833db7fde2031ef27edb4a70f9d60d67440000000000000000000000000000000000c352a16159eeca4dc9a86601973c02e39f2a11c8a0955ad52236d7e46dbc405147258ea8558505bef0f09ba92527c76d5009fd559714d5692de5500ec8cae9c04ae1ab1c7c6e08c8738ef22da19ceca0000000000000000000000000000000005b8c4c2782a2a2a3abe4f99e60db6ff4179399aef4b9e305fe037e1a14a4c03ff59be1e91f55e5bf316356bbaf876af000000000000000000000000000000000eae605cef3beee4a176a0589f2676b3e212edcd7ac5834ece3066bbbb587bdb6bbe46663acfd9d8aba2251a238004106330c755ef708d8eb129475785f24be9e7836385ac918c60ad36e80e2f3281b8000000000000000000000000000000001038258f67b0097ec51adee244cc15d63c4d3bf1b3b3e64ef8ae6ac15a7c4195fe97bfe8c5a42981a2463ed1b39032de000000000000000000000000000000000a6f27fc1f2dca48f6e26456de5d9fb840e4ed3fd9ff12372e51130d7c439f4ceb4fa929da2dfa3ca271d34e9aa0985ec2431888d05cae840dde4c26911db1893659fdc345d5433556d9bf75e51fe374000000000000000000000000000000000373fbfebce5c599172ab017e8f4f9813b0e6aef3031faf61c336aa7d6b64c8986827a27605b476bfc1057a0388f864d00000000000000000000000000000000079ec2c41547d98277c60dc46a61ddda51c9df65a8ad2d0a64d483eb245986de36eea2509cf7949c5fb05a77f9cf3bacc9a72369cda74e5c86c6559cbc4f4db1b3ab24c5150c7decea862ede3c02c505000000000000000000000000000000000d50821953bbbdb494e48c59c940c5f2ac2b902f4c2ba2b2ad50960a51ed7eb1a9d592bb903a03b0b90d8817d10848ba000000000000000000000000000000000bf0898bd20e08205aa218e529db578d5118ae411159ed372eb8968cd773ebb1619f92107d2948020bb3c721ea63159dc2f50989b04fc29c4c4a0090fb11e860c15f89a66f3bb8281e4678ba63ff3f9a0000000000000000000000000000000006bab55b7648be3eaec947694311289f17258876d74a7d92f22b7807d007fe142a71210684593b1aabf74579eb1b1c17000000000000000000000000000000001016b28dadfe9b65d86a1f843f7ff4b774eab74431b68b079527c2387ee6cac69e95ca564346fc54237edd3d2d31f6ed9fc9abf1c76ff11ab538f46ce768ba597eb5f2f63073ec67e8de10aa1d666720000000000000000000000000000000000c0d5ae44a0863ef3d6d32f1d8f32f2c5b89112652e2e3d6ce620479882fafd73cd3627f9f11315020c8fc9341c7fb4800000000000000000000000000000000197067de9d61733dc0367d91f55a57ae268d5e7babe7882c1fbcf03cc38de7a2dc41acfa16bac0ae63418fc349b9471cd4167723682bc0e7476797b3be5e14b8de3e4e23b4ca33c50a2096cda8766dd7000000000000000000000000000000000c3964c79741fe8093ccf2f3d118b33897a18d920ca242ae153118bc17bf0102fd19a9e4000698b256930a2f415305180000000000000000000000000000000003ce4a6877879ee56299ed27f634571126d9f8ca8ccb1e67100064e7efb435cacb1ada74d7c7529b495957ce7a5dfe709644c3727f78dd12811092190d5d10adcd5b9fc581dd783c97d4e7b5130f309a0000000000000000000000000000000018e6260c0cd6cf806ee82a047c51a85e0d7023883cfb05993ee81220e0871b122c12e65bb99b20787322d93b82089e98000000000000000000000000000000000d5b66fc46b7fb60fe8efb6659bbe948c6776d7780633f007123c5c49f5fbe7e3defc0f3d896333d0ca01244f2b6effe0df9846c84354ab7f947caca7800e12e38d8e6651527e6831f4d8b1bd66c4f3d", + "Expected": "000000000000000000000000000000000c7aa8aaa848c068104b88d0757551612285327ba5fbe35ccb4eacb1bc96a341786e4548f5f86f6ded789b712a4be74b0000000000000000000000000000000015c9aefc358834f21ec85092cd69df37e0036ea6ddf23a3ca052a669446b183e5340ec7ce894ff6575f5e6531947c84a", + "Name": "matter_g1_multiexp_98", + "Gas": 64128, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000004acd4cb6bcfed3219c3aee9368feeb58d77a7ec81d19bea11402015f4bd0ee2d7afd86fa7ae9dd320910ca28eb6d98f0000000000000000000000000000000009fe1b0094c0c2ae80a3c5accfed5d212ce39f867aa2150b781c193a0053aecb04d06e005fbfa0a24595e5968d024be18a71abe11a893fce872f6b8a020b6d84241df03eb934b50cbf3571df4800a8330000000000000000000000000000000018cf9bf39549c35e94211b4e2d0a0157d73e1ce8a17cd724eb33c38281dac07e12eec61b27b440b220c4f21915a73a52000000000000000000000000000000000fca6d956989db84dcfe58b0310fc21b5bdc82a32838c8d9cae912d683dd9c67f68e15b3fbf9d7b430ba239c8904fdd2bbf28e5bca314391550d3a0fce50b1220965860e72c8c3865a2d4c599d31d3f1000000000000000000000000000000001897956bc232fd5a9b0ed1b533bebef8ddd9e97002513eec71d67ce1086ba8473f2c013af7d8ac548290453d9f71bd5a000000000000000000000000000000000796da5c8ac165d416c8fa36d84e11bcaa80c1bbfe18efde4b4b2c71d6d00fa24f3d51eac312cad9e854f094dcb6ec7458b208a6845aeb2bf31999042c59b7b130a7ce5297e88023953b1aef63616fe4000000000000000000000000000000000302240769257e92899da03fcc4abe1ad3944b74c3046e790e4e950f2958426b5fdc691401a1c8a531f42185d382fe5b000000000000000000000000000000000053750b58b6d2fbacae94e22b397261e541eb4abf4715b3f528dbfc3388122918b1b4b506f2fef89ea936efdef0105b3b53b6cf9e0ce1661c4960283be790abf956c2d6433529b8f3a32b92b227aebe000000000000000000000000000000000168a635a14f61734372f4bdd2fd564d77afa8588e1828d88c4c90bb50f57473b2c20585dc0e93726b84e73c61f29ef1000000000000000000000000000000000e6e92355e59304ad35b1dbfbb98db803d5fadabdef4fb1b2a54080ec9a33a7147ebb4d5219acabd949337bebbffa793b049228435ade4c4c565e65f39f13a84c747c312afcdaff352560b9fb3cfebcc000000000000000000000000000000001797bf2ac9b490cd43a346fdc64bfb22301a0a0e371bb4df8ec02342b4fcc99af43b4735665c6b1386fa04a3dc5406e3000000000000000000000000000000000fcc20f4aec04b7896ddfd86f58c2e1e9dc6f863ec3b477572c073c0f4fb07ee8dc0d5a843321446445b6e7846fbc5d556197f5ad17062d2ecbdc8887bcdd32e5ed4c48cefd9e14d622a0b800d9703300000000000000000000000000000000013ddb8ff149222a5a0a997c0b89aeee36a6ff2540de3cba8bfe6a2a64fb505f13ad956a3882082ab85bfbe72f3a3a6b600000000000000000000000000000000102c1a1085f60cd5326966a2dda0872290e1658002ff3ed95c47cc0345565076bdecdeab7082bcfb439cf7f3e445faaf721d9d7fe10104cafcad71307e785321ab87b2b69593535caecbf0e166cfda5b00000000000000000000000000000000189515e637d404ce6db58d24774609cf946074aa22066d808dc022824a26b381bf09148005c61156a976154b025d71c90000000000000000000000000000000009102e313c4517cdd3d07a66e0013eeafc996c21fbf5f0f3e7d232ad5adb781cce1657bd5750193cfc0357ff55bd012a461531ecb61365908019c1e8074a4c322df2b356eea3f3eea9aa1e0e1fc5525e0000000000000000000000000000000002e166e475ff083faad64667b683e546b2358f945b8656f9c2f3f6e87a40dc3fc087dd94874bec1c4bd5929b7c96024a00000000000000000000000000000000022bb4ba4be638d8c14a16c94522c41cd3b3ad917daa454f820b8fa35e5a48c676266feece6986e8fe920b2a5e43e4b3569c1c1ae2d18bbe36ed50db1bf30957802b09a982fbed49d4968815552e010d0000000000000000000000000000000004947bd8ea8cc3b116fb7320c573fff0f107913c18cfdba2e7e9a4c8715e334a431156f384548508df8950d681163aee0000000000000000000000000000000001e9e7494c295248184503344b8ac7bfcff41a4561de03d78691ac47980f14aa47c1eaa3cca80103f0f2ba14a2842aea2061d33b2f7e786effbd2e93101a56ba1bb62c1a773a08b72ca82f5183bea35b0000000000000000000000000000000004789b01538cfc54cad0e99538e874d13eaa7f07199af29d460927c3e622c74e0bb4185afa12c53446f56033348c332f00000000000000000000000000000000154291a8bdefbc91445ef1fe123f326b8aad652c8c54502920d4dfa912c2f42d784fbc5a16d08468d2d6ee56e7e8eaa24129b150752d2d5551a622231ab067931678454aaeb23f76168219406f0d50ee00000000000000000000000000000000029048f227fe8d1b7247a82cfd3e1b4b60cdce6b52de42c4b96641bf8fc5ba9b077e33bd4c4fce9a51b63a6a2451b427000000000000000000000000000000000c83518e1b7700d68966d592cb2e3295a2db5226eb6fef972c8a84721d1e49a30e4a8ee3494ed4bbcd2a6877e1ba597d366c32d5d3c132f32a6ac3cfe1dabb649c59ae224338f747ad98b193e83467290000000000000000000000000000000003e96431aae4330d3d204093b7af21343ace4f1960de951eeaebea51e778b1fee43ecddc46667d096edbc5ff4735586400000000000000000000000000000000183a282f4b0513be661b1b38eb5f02b51aadc591745e0bd5d2d4e5545739e26470a9ec20d78ec284268d9c54c8e4f7b6d997516cac28a3968ac6946b5bffaace0856a52e38fdcca11ddfa16cf5a568f5000000000000000000000000000000000904c85edd36dfa18ddb4e1809607708142f3c0861570f2bc8fff14c462675661f2111c10a01557fb21f7f38957bdd840000000000000000000000000000000012a3a37f34ebb23d4c9268ec9e1d53aed4747aaace497695e6ea8fdbdedd58031cb479003e8bec0d14aa1d062fa30f2ce881ec65fdc2f58e46d3ee45a06d0c5ac844ee5b62872c7ba21f6b48621a337100000000000000000000000000000000148532bffbbf8bb1688f6448854214b4273b9d5adf132aa9142c1605d1882879678b6cc70638713b9438532d427f447c0000000000000000000000000000000010971ee30d83719e10e91aad3f1f201fe35ba1a057531b1905bca3a8391a3786cd077ee0f104305eafb3c94f4546da9edcd9b95e49473277a665ca0f9a8309df9ed6ee4f25d803aa967fb8f688273e65000000000000000000000000000000000f73574aa5a06ea569de88e48fcb96e822039af296684933c1b417dde95e08d2ac9c6ad4d525b0734e24807ee99ba88a000000000000000000000000000000000523deae09e75121a6d89b45161f69f0733a9e43d88d8527a03cca8cc126aeb7a680cfaf291554403723e20440b79437334582482a9038ab906880e43a4a9d39e73b6c63604eba0c8f6399eb5c288638", + "Expected": "000000000000000000000000000000000db91871e4cd84b3b58216b6c2e77a9521f3080182e78d3f66fe33f313013f06aec2dc5a6d483f35fadebde873bff9490000000000000000000000000000000003b9685de062b09b9e277ad5cd664d28af59064448af2b1b2b2357df6fc88e3ee7e0ac837100e0b7593944e8db43ab0f", + "Name": "matter_g1_multiexp_99", + "Gas": 64128, + "NoBenchmark": false + } +] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/precompiles/blsG2Add.json b/x/evm/core/vm/testdata/precompiles/blsG2Add.json new file mode 100644 index 0000000000..64ca2006dc --- /dev/null +++ b/x/evm/core/vm/testdata/precompiles/blsG2Add.json @@ -0,0 +1,730 @@ +[ + { + "Input": "00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be", + "Expected": "000000000000000000000000000000001638533957d540a9d2370f17cc7ed5863bc0b995b8825e0ee1ea1e1e4d00dbae81f14b0bf3611b78c952aacab827a053000000000000000000000000000000000a4edef9c1ed7f729f520e47730a124fd70662a904ba1074728114d1031e1572c6c886f6b57ec72a6178288c47c33577000000000000000000000000000000000468fb440d82b0630aeb8dca2b5256789a66da69bf91009cbfe6bd221e47aa8ae88dece9764bf3bd999d95d71e4c9899000000000000000000000000000000000f6d4552fa65dd2638b361543f887136a43253d9c66c411697003f7a13c308f5422e1aa0a59c8967acdefd8b6e36ccf3", + "Name": "bls_g2add_(g2+g2=2*g2)", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001638533957d540a9d2370f17cc7ed5863bc0b995b8825e0ee1ea1e1e4d00dbae81f14b0bf3611b78c952aacab827a053000000000000000000000000000000000a4edef9c1ed7f729f520e47730a124fd70662a904ba1074728114d1031e1572c6c886f6b57ec72a6178288c47c33577000000000000000000000000000000000468fb440d82b0630aeb8dca2b5256789a66da69bf91009cbfe6bd221e47aa8ae88dece9764bf3bd999d95d71e4c9899000000000000000000000000000000000f6d4552fa65dd2638b361543f887136a43253d9c66c411697003f7a13c308f5422e1aa0a59c8967acdefd8b6e36ccf300000000000000000000000000000000122915c824a0857e2ee414a3dccb23ae691ae54329781315a0c75df1c04d6d7a50a030fc866f09d516020ef82324afae0000000000000000000000000000000009380275bbc8e5dcea7dc4dd7e0550ff2ac480905396eda55062650f8d251c96eb480673937cc6d9d6a44aaa56ca66dc000000000000000000000000000000000b21da7955969e61010c7a1abc1a6f0136961d1e3b20b1a7326ac738fef5c721479dfd948b52fdf2455e44813ecfd8920000000000000000000000000000000008f239ba329b3967fe48d718a36cfe5f62a7e42e0bf1c1ed714150a166bfbd6bcf6b3b58b975b9edea56d53f23a0e849", + "Expected": "000000000000000000000000000000000411a5de6730ffece671a9f21d65028cc0f1102378de124562cb1ff49db6f004fcd14d683024b0548eff3d1468df26880000000000000000000000000000000000fb837804dba8213329db46608b6c121d973363c1234a86dd183baff112709cf97096c5e9a1a770ee9d7dc641a894d60000000000000000000000000000000019b5e8f5d4a72f2b75811ac084a7f814317360bac52f6aab15eed416b4ef9938e0bdc4865cc2c4d0fd947e7c6925fd1400000000000000000000000000000000093567b4228be17ee62d11a254edd041ee4b953bffb8b8c7f925bd6662b4298bac2822b446f5b5de3b893e1be5aa4986", + "Name": "bls_g2add_(2*g2+3*g2=5*g2)", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "Expected": "00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be", + "Name": "bls_g2add_(inf+g2=g2)", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "Expected": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "Name": "bls_g2add_(inf+inf=inf)", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000039b10ccd664da6f273ea134bb55ee48f09ba585a7e2bb95b5aec610631ac49810d5d616f67ba0147e6d1be476ea220e0000000000000000000000000000000000fbcdff4e48e07d1f73ec42fe7eb026f5c30407cfd2f22bbbfe5b2a09e8a7bb4884178cb6afd1c95f80e646929d30040000000000000000000000000000000001ed3b0e71acb0adbf44643374edbf4405af87cfc0507db7e8978889c6c3afbe9754d1182e98ac3060d64994d31ef576000000000000000000000000000000001681a2bf65b83be5a2ca50430949b6e2a099977482e9405b593f34d2ed877a3f0d1bddc37d0cec4d59d7df74b2b8f2df0000000000000000000000000000000017c9fcf0504e62d3553b2f089b64574150aa5117bd3d2e89a8c1ed59bb7f70fb83215975ef31976e757abf60a75a1d9f0000000000000000000000000000000008f5a53d704298fe0cfc955e020442874fe87d5c729c7126abbdcbed355eef6c8f07277bee6d49d56c4ebaf334848624000000000000000000000000000000001302dcc50c6ce4c28086f8e1b43f9f65543cf598be440123816765ab6bc93f62bceda80045fbcad8598d4f32d03ee8fa000000000000000000000000000000000bbb4eb37628d60b035a3e0c45c0ea8c4abef5a6ddc5625e0560097ef9caab208221062e81cd77ef72162923a1906a40", + "Expected": "000000000000000000000000000000000a9b880c2c13da05bdeda62ea8f61e5fc2bf0b7aa5cc31eaf512bef7c5073d9e9927084b512e818dbf05eab697ba0661000000000000000000000000000000000b963b527aa3ec36813b108f2294115f732c878ac28551b5490615b436406773b5bb6a3f002be0e54db0bcebe40cb2e2000000000000000000000000000000000bd6e9060b42e36b57d88bc95b8b993da2d9d5acd95b73bad0509c2324212bcf7a94a46901932c0750535d00008a34f7000000000000000000000000000000000a374afd32bc3bb20c22a8864ce0dafe298bda17260b9d1d598a80830400c3fd4e8a8f677630eae5d4aa0a76a434e0ba", + "Name": "matter_g2_add_0", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000018c0ada6351b70661f053365deae56910798bd2ace6e2bf6ba4192d1a229967f6af6ca1c9a8a11ebc0a232344ee0f6d6000000000000000000000000000000000cc70a587f4652039d8117b6103858adcd9728f6aebe230578389a62da0042b7623b1c0436734f463cfdd187d20903240000000000000000000000000000000009f50bd7beedb23328818f9ffdafdb6da6a4dd80c5a9048ab8b154df3cad938ccede829f1156f769d9e149791e8e0cd900000000000000000000000000000000079ba50d2511631b20b6d6f3841e616e9d11b68ec3368cd60129d9d4787ab56c4e9145a38927e51c9cd6271d493d938800000000000000000000000000000000192fa5d8732ff9f38e0b1cf12eadfd2608f0c7a39aced7746837833ae253bb57ef9c0d98a4b69eeb2950901917e99d1e0000000000000000000000000000000009aeb10c372b5ef1010675c6a4762fda33636489c23b581c75220589afbc0cc46249f921eea02dd1b761e036ffdbae220000000000000000000000000000000002d225447600d49f932b9dd3ca1e6959697aa603e74d8666681a2dca8160c3857668ae074440366619eb8920256c4e4a00000000000000000000000000000000174882cdd3551e0ce6178861ff83e195fecbcffd53a67b6f10b4431e423e28a480327febe70276036f60bb9c99cf7633", + "Expected": "000000000000000000000000000000001963e94d1501b6038de347037236c18a0a0c8cec677e48fc514e9fc9753a7d8dcf0acc4b3b64572cb571aebbe0b696640000000000000000000000000000000000d9739acc3a60f6dffb26f9b5f1fd114a21f2983deea192663c53e012b9f8e1cabd4942ad039badbd4745ddc0a26a91000000000000000000000000000000000b4206dcdb80d62195febb6773acab25fa2c09a2e4be9416ca019faeb72f1fad1dfdc51e8cea39b371a045b18947d40a00000000000000000000000000000000100758b888fa27e9258ddd5d83409e8aeac576874bc399b33b8bc50d77fce5358cb091d42f9a1b1ed09be3f200959989", + "Name": "matter_g2_add_1", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000003632695b09dbf86163909d2bb25995b36ad1d137cf252860fd4bb6c95749e19eb0c1383e9d2f93f2791cb0cf6c8ed9d000000000000000000000000000000001688a855609b0bbff4452d146396558ff18777f329fd4f76a96859dabfc6a6f6977c2496280dbe3b1f8923990c1d6407000000000000000000000000000000000c8567fee05d05af279adc67179468a29d7520b067dbb348ee315a99504f70a206538b81a457cce855f4851ad48b7e80000000000000000000000000000000001238dcdfa80ea46e1500026ea5feadb421de4409f4992ffbf5ae59fa67fd82f38452642a50261b849e74b4a33eed70cc000000000000000000000000000000000a69d6d9f79e19b38e6bf5a245dc820bddbdfe038d50932f76d0e4629d759f8ca6d573fcfc39256305daedf452f9fdf40000000000000000000000000000000015f5949369e58487afcecf8018775d1b0a73e913bf77e13d2e5a843bbbeba7d1978ca27ae8bfc87d30f567dd396b980e00000000000000000000000000000000182198bb38a0353b8db25389e56ab0d8679a1bda008a65dad77e4c95bc6804f6311eb16c761e1a5e2a5f87cfada49fa4000000000000000000000000000000000eb5483959e98c30e71db52615f63521378b156f142d46f3bb285b94aef39d80feacec335b797c5a68dc17ba89d43e0f", + "Expected": "00000000000000000000000000000000079e4fc2190d3441fa76c2d925d23b81e353e09e9138fdde51234195e564a32c98aa0d240f051298bf966d17adc2d6fb000000000000000000000000000000000aa327776fa7e15000dd548fcdc3a1cc6f9d0ab33046dd4240a3002962131b738ffed579945a348c795cfcb33682cf3b00000000000000000000000000000000179232ec56602d1ff79861cbfa2edece34b296541483aa65fe0cb493f520b7722cfffbe04294dd054770a38bf75d927b000000000000000000000000000000001826b88a6b411330757bb304a380487a02f7cf421115b84b3f468d11a83dbf304ce7a5661f4f01299d3c7865305a0006", + "Name": "matter_g2_add_2", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000149704960cccf9d5ea414c73871e896b1d4cf0a946b0db72f5f2c5df98d2ec4f3adbbc14c78047961bc9620cb6cfb5900000000000000000000000000000000140c5d25e534fb1bfdc19ba4cecaabe619f6e0cd3d60b0f17dafd7bcd27b286d4f4477d00c5e1af22ee1a0c67fbf177c00000000000000000000000000000000029a1727041590b8459890de736df15c00d80ab007c3aee692ddcdf75790c9806d198e9f4502bec2f0a623491c3f877d0000000000000000000000000000000008a94c98baa9409151030d4fae2bd4a64c6f11ea3c99b9661fdaed226b9a7c2a7d609be34afda5d18b8911b6e015bf49000000000000000000000000000000000286f09f931c07507ba4aafb7d43befe0b1d25b27ecc9199b19a9dc20bc7ec0329479ef224e00dece67ec0d61f1ca5ae0000000000000000000000000000000014e6ed154b5552be5c463b730b2134f83e0071dcdadfaa68e6c7c7f6e17dabb7daf06e409177bc4b38cfdb8248157618000000000000000000000000000000000f145e998dc6eb0c2b2be87db62949c7bfa63e8b01c8634248010fd623cfaec5d6c6c193331440957d333bf0c988b7b10000000000000000000000000000000002a1ab3eea343cfdea5779f64b3bddbf0769aded60e54a7507338f044310ba239430663394f110e560594d6042a99f1c", + "Expected": "000000000000000000000000000000000f69e3616e7122bf78230461bb1f4b194988adc6149372691d8794d0086fba0870a2255a2c79cc3426e7ba4d032fc2ab00000000000000000000000000000000174752301e05dcd62f7a3ae3357344e64d1c94835b2b742ac24449ee2728d693a0df10c3beaeb45d1b4af4ac2bdbb8b200000000000000000000000000000000051a761a3ceb275ec28a2a269b5ded1d9fd11a617c958e73c07de3a92ac480aa82c7d2a1852d291804e734526277f5740000000000000000000000000000000009bec9045ea89d5d16588e3373cc977f6d975d0e2213b171403a9b2ca460b3b2e1106b474185516d4200655b17a179a1", + "Name": "matter_g2_add_3", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001156d478661337478ab0cbc877a99d9e4d9824a2b3f605d41404d6b557b3ffabbf42635b0bbcb854cf9ed8b8637561a8000000000000000000000000000000001147ed317d5642e699787a7b47e6795c9a8943a34a694007e44f8654ba96390cf19f010dcf695e22c21874022c6ce291000000000000000000000000000000000c6dccdf920fd5e7fae284115511952633744c6ad94120d9cae6acda8a7c23c48bd912cba6c38de5159587e1e6cad519000000000000000000000000000000001944227d462bc2e5dcc6f6db0f83dad411ba8895262836f975b2b91e06fd0e2138862162acc04e9e65050b34ccbd1a4e000000000000000000000000000000000d1007ca90451229d3780d66d3aed7c9d8fc82e9d45549e8586600e38eb6763f3c466e2f6ba6ba1dafd8f00cc452dda20000000000000000000000000000000001d017d920a262b6d6597bab532f83270f41526409510e80278d1c3595ceabb9ceba8ae32b1817297ff78ea7a0d252e8000000000000000000000000000000000935b7a59d2e51bbb2f9b54ccb06ebee9d189fa82f0e97d10c8020badb3de7fe15731b5895faed8cad92ae76e2e1b649000000000000000000000000000000000792dadd48a20040ad43facedc109747411895180813349d41d0e5b389176bfb15895d41665be8d1afa80835ef818eca", + "Expected": "000000000000000000000000000000000c079610e6f8770d65352f911863b6cb4fcb25cacc4a42f75e34e29e977c93244a6241cf3d5bd1040ce7d8987996f87e0000000000000000000000000000000010d08d8f6fa8ee7042c0891ea0c3b9b59a79da52cf3a91627c79d456212e3f6f39e1f69aa0053bbdb4076a3f7d05e5dc00000000000000000000000000000000069047218b0ac1e07650ac8f4a1b9235f68408f543517c4ae3c0ec47c79b468713c704ff3680edc8abd1bbed7a5fa75d00000000000000000000000000000000137737706162e02cfa75ce2154d57c9a3520818cc04626654824769ad92ff7977942f3881a28284ea47c14f353772d0b", + "Name": "matter_g2_add_4", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000019c31e3ab8cc9c920aa8f56371f133b6cb8d7b0b74b23c0c7201aca79e5ae69dc01f1f74d2492dcb081895b17d106b4e000000000000000000000000000000001789b0d371bd63077ccde3dbbebf3531368feb775bced187fb31cc6821481664600978e323ff21085b8c08e0f21daf72000000000000000000000000000000000009eacfe8f4a2a9bae6573424d07f42bd6af8a9d55f71476a7e3c7a4b2b898550c1e72ec13afd4eff22421a03af1d31000000000000000000000000000000000410bd4ea74dcfa33f2976aa1b571c67cbb596ab10f76a8aaf4548f1097e55b3373bff02683f806cb84e1e0e877819e200000000000000000000000000000000095353ad699b89ac82ca7ef631775b2b3a6e3ed8dd320440cdb929baa428e63cb902a83857cc0e2621470544c69e84aa000000000000000000000000000000000892559ade1060b0eef2cbc1c74de62a7ff076a3621e5f0f159672a549f1201f2ffb3ac12c8b12cb86ae3e386c33e219000000000000000000000000000000000750df4632a7126ddb08658a4001f949b9764d9cc43a9393cc55d8fdbb15d4a1186dd87a6433d111888a7804540ad9fc0000000000000000000000000000000017554bd444665df044b91b0b2614017bbfcd7acc7f8c5a16cea2861235578ce2b27dcced9fba234999fa478cd3f6e42d", + "Expected": "0000000000000000000000000000000004dd5dfe38fa70625216ecfec60ea8d38602552726f0fdfb8f392362ce845fe0fda76894d0e456796e08462bb941579f00000000000000000000000000000000195a85cd0685f4053ee539de7e04fccd2380819b291f89cbcd63d5a0015b3214500284a7c6568a71f52bbdbc38be410a00000000000000000000000000000000107c211bad49c7dd8555e30f2500c67e7175eb98a8494f3d5309c65a93cce89572b7b5489428eaf3f0a5c1be323c5352000000000000000000000000000000000c11f978150ac35722679cf79443b3706d288c968116ddedc1f1d0fca8cd746e3c92dc006330be14886c53c41feebbf9", + "Name": "matter_g2_add_5", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000147f09986691f2e57073378e8bfd58804241eed7934f6adfe6d0a6bac4da0b738495778a303e52113e1c80e698476d50000000000000000000000000000000000762348b84c92a8ca6de319cf1f8f11db296a71b90fe13e1e4bcd25903829c00a5d2ad4b1c8d98c37eaad7e042ab023d0000000000000000000000000000000011d1d94530d4a2daf0e902a5c3382cd135938557f94b04bccea5e16ea089c5e020e13524c854a316662bd68784fe31f300000000000000000000000000000000070828522bec75b6a492fd9bca7b54dac6fbbf4f0bc3179d312bb65c647439e3868e4d5b21af5a64c93aeee8a9b7e46e00000000000000000000000000000000175dadb6ee656ec6aebf8d0e5edaee3f119c74e0ea64e374be9e8ab9fd3d085fceeedf4ed8de676ebe9065d83b0542ad0000000000000000000000000000000005cd6a875329c23e4918976cf997e93e403957acfc999f8159a630d21ab6f1762925c063784237262bedc82402ad81bb0000000000000000000000000000000003274bcb8db35e50164d136c2a98b5a6d2fb5f9767d0ee11c1358bf7ca5ed96d9122f8c1051ba3c658cc89777d03dfa5000000000000000000000000000000000380a240443dff85b6542f75db28b87c39e278cdb8d9627efbbc63b229e6ce783f6fb0114c8e91c2fd6ea71c95bb99a4", + "Expected": "000000000000000000000000000000000fb33caed4de22cf341bb3e04d41c0198b064c1d371a24f5cf59595ab4a1edfd379916a40cc405d35f0603b2f8fb987400000000000000000000000000000000131ad6172c20b3a1cc2542db037de1324086fd9cd140ae97987980f260023d91b24504181af6fcbcfa242f48e99559320000000000000000000000000000000004a0404c00789459395f5344544041785d10f2fe74d4bf484966f5e9b6b4c4c8cb113a811a4fa82a1cdf8e3242bb418900000000000000000000000000000000086ba6a914f3f07bdc6750fcf6baf76124a17964bf9eb9a12982e8a28ca04360da3544b69436d5663e4e94bf7189529b", + "Name": "matter_g2_add_6", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000690a0869204c8dced5ba0ce13554b2703a3f18afb8fa8fa1c457d79c58fdc25471ae85bafad52e506fc1917fc3becff0000000000000000000000000000000010f7dbb16f8571ede1cec79e3f9ea03ae6468d7285984713f19607f5cab902b9a6b7cbcfd900be5c2e407cc093ea0e6700000000000000000000000000000000151caf87968433cb1f85fc1854c57049be22c26497a86bfbd66a2b3af121d894dba8004a17c6ff96a5843c2719fa32d10000000000000000000000000000000011f0270f2b039409f70392879bcc2c67c836c100cf9883d3dc48d7adbcd52037d270539e863a951acd47ecaa1ca4db12000000000000000000000000000000000834cf1b4149d100c41b1bca0495e455002eb6596bddcb94ae48d0c65957e8b313372f8e0d6e57504664b266f38293150000000000000000000000000000000000de2875fbd14760bac4c2cc7d3f239177efe9f7f61f767be420d44f24c9fb863efd60dcd732986db8c5b72470617ea60000000000000000000000000000000000bc9535ebf11c2dcc8c7d3bcd09d7d14035635fccb5fddb7df29ce8855e79f99809781d6ffbbcb33d1227314609abee00000000000000000000000000000000039bbfb4d969d702255e3be7f255a97529a19687ce38cb70637c37894d4102591feef428b0afe8c9ef50310ae3b83091", + "Expected": "0000000000000000000000000000000019c8a1a206c0006a3033377abba4c31c55710a094d8c9dcef7560818e90411861ce7d189e2763f8fe69bf75e719e4efe000000000000000000000000000000000cccc6bba8691c210aa0a67d26584a359fab94041d853160abd9669893c0d398c805cc37fa3c33bc5ee5ff915b985c45000000000000000000000000000000000e353c1993c36763acec2a75495560e743d099b565f3de195e011afcacff3d60502801f47695da7dd589af81e772eb7800000000000000000000000000000000100c6123cf08eab6c59d78b414fa504ed10c204851289b0598b40ac31971fa12cfda4ef7cd2d64f9797d4d2b193e0bd2", + "Name": "matter_g2_add_7", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000017fae043c8fd4c520a90d4a6bd95f5b0484acc279b899e7b1d8f7f7831cc6ba37cd5965c4dc674768f5805842d433af30000000000000000000000000000000008ddd7b41b8fa4d29fb931830f29b46f4015ec202d51cb969d7c832aafc0995c875cd45eff4a083e2d5ecb5ad185b64f0000000000000000000000000000000015d384ab7e52420b83a69827257cb52b00f0199ed2240a142812b46cf67e92b99942ac59fb9f9efd7dd822f5a36c799f00000000000000000000000000000000074b3a16a9cc4be9da0ac8e2e7003d9c1ec89244d2c33441b31af76716cce439f805843a9a44701203231efdca551d5b000000000000000000000000000000000fc09c241899fa6e8cc3b31830e9c9f2777d2bc6758260c9f6af5fce56c9dc1a8daedb5bcb7d7669005ccf6bfacf71050000000000000000000000000000000018e95921a76bc37308e2f10afb36a812b622afe19c8db84465ab8b3293c7d371948ee0578dbb025eed7ed60686109aa0000000000000000000000000000000001558cdfbac6ea2c4c1f4b9a2e809b19e9f4ba47b78d2b18185ed8c97c2f9c2990beadc78b85c123b4c3c08d5c5b3bbef000000000000000000000000000000000ea4dfdd12b9a4b9a3172671a6eafed7508af296813ec5700b697d9239ae484bcf7ab630e5b6830d6d95675be5174bb2", + "Expected": "0000000000000000000000000000000009fc3870f88288c680b43d63d3bb5305b99fe461e59c07be981b8819fbee0d1fdfae0c037e830fbbabc40cedac7919720000000000000000000000000000000018bdd4903da4d14fa28af4c2cddcb708238cf68673ce77a04a3926c4aaf17d39a831c5401e84dd042d6adf595a1763710000000000000000000000000000000002c398f0e8ad9752f4aded980bc5de2d91118db06818d815c11e818ead47e7065823737db8e304bae32969cab065d1ff00000000000000000000000000000000180642a633c3aa402e5c0b18fcb6fe8c115575b863abda59b5d91997ab01014faefc975d0aee994f98cf37ce79eb95aa", + "Name": "matter_g2_add_8", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000e25365988664e8b6ade2e5a40da49c11ff1e084cc0f8dca51f0d0578555d39e3617c8cadb2abc2633b28c5895ab0a9e00000000000000000000000000000000169f5fd768152169c403475dee475576fd2cc3788179453b0039ff3cb1b7a5a0fff8f82d03f56e65cad579218486c3b600000000000000000000000000000000087ccd7f92032febc1f75c7115111ede4acbb2e429cbccf3959524d0b79c449d431ff65485e1aecb442b53fec80ecb4000000000000000000000000000000000135d63f264360003b2eb28f126c6621a40088c6eb15acc4aea89d6068e9d5a47f842aa4b4300f5cda5cc5831edb815960000000000000000000000000000000000b36d8fb9bd156f618ab8049d41dfe0698218764c0abb10e12fae43c8810b8e2a5201364e2778f6f433b199bb8f9a6800000000000000000000000000000000000707eb15411b63722b4308c0ed4288320078d2463ae659ad4fb3f9ef8124f379df92d64e077403e50727388adb59ac00000000000000000000000000000000158e1249d5b91614924acb23899c6bae408697dec0982c10d0459746499f4e6739afb9d5129568106ed1a1caefeaa9640000000000000000000000000000000019e841562e4aa75321143f8ce1e5ec6158fa5cb8b98c839a486188260c18ee8a7600930f23aa39eac2eb520d6a0fba90", + "Expected": "00000000000000000000000000000000199600699a6108599c638df8f965d73b5de4ca74598df281ec95c539de2c7eff9767569692d8e0ad120fcbb3d9335b95000000000000000000000000000000000c42b11e2585ba93521b3c968e9dee07e4f5168c11087d8d750795555a105df70c969bfa79b1ab4e5fc8d81657235d08000000000000000000000000000000001370daa4699daa99e9940fe04f69150e6f752798cbc0e66c91c3bd46149d935c1815f32d7f14b510e16d475044eda9cc0000000000000000000000000000000016c7a00be10de5732795cc3ee2951e58cb9d42f9b05d02fbff1b83fab5d3ad830cb8178092b76172108d7a53afe8c539", + "Name": "matter_g2_add_9", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000159da74f15e4c614b418997f81a1b8a3d9eb8dd80d94b5bad664bff271bb0f2d8f3c4ceb947dc6300d5003a2f7d7a829000000000000000000000000000000000cdd4d1d4666f385dd54052cf5c1966328403251bebb29f0d553a9a96b5ade350c8493270e9b5282d8a06f9fa8d7b1d900000000000000000000000000000000189f8d3c94fdaa72cc67a7f93d35f91e22206ff9e97eed9601196c28d45b69c802ae92bcbf582754717b0355e08d37c000000000000000000000000000000000054b0a282610f108fc7f6736b8c22c8778d082bf4b0d0abca5a228198eba6a868910dd5c5c440036968e97795505419600000000000000000000000000000000186a9661d6fb539e8687ac214301b2d7623caedd76f4055089befba6ef2c96263d810921ad7783d229f82783c9def424000000000000000000000000000000000447f3e20caa1f99fbaccab7bde2bd37fe77cea691ebf2b9499f95bbbb77afe72b7039eb0c05970b61360fcf8ade73730000000000000000000000000000000005e11f828eda86c10a1d7929def547ac06885da278afae59c5d95453caf0a2d8ed186fa7c6d0a7ab6e9142cfa4b338190000000000000000000000000000000003d954e61b6ab71042b19e804efccd4956b56662f27f70a9255cec0c464b86c0e83721ad3785dec62dd4a9dd3d6d5d53", + "Expected": "000000000000000000000000000000000669cc8a3acae17f99f805afb9012a38851a9e8d4fd9895a9946c29fc859849c24d7ab7b6278c449cfbc5f1d7ea1fdbd0000000000000000000000000000000007a9095be808d0ebc99bce94e851d2a7cd3e1977b923064ab5bbed2347cf18f3343e60120fa051d12fe27da3146cb423000000000000000000000000000000000f1e7f75887651f67457f6dc064d7c11934035d15fe4dc40bab970160ed1b1aa230a3fb84dc1da08770d847c0216347a000000000000000000000000000000000efbc62ade1678cd70eb38c644038bf19e52b0859f65747068d9f3124762d951e4a6ff05f34b6d14919774f8409adff5", + "Name": "matter_g2_add_10", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000f29b0d2b6e3466668e1328048e8dbc782c1111ab8cbe718c85d58ded992d97ca8ba20b9d048feb6ed0aa1b4139d02d3000000000000000000000000000000000d1f0dae940b99fbfc6e4a58480cac8c4e6b2fe33ce6f39c7ac1671046ce94d9e16cba2bb62c6749ef73d45bea21501a000000000000000000000000000000001902ccece1c0c763fd06934a76d1f2f056563ae6d8592bafd589cfebd6f057726fd908614ccd6518a21c66ecc2f78b660000000000000000000000000000000017f6b113f8872c3187d20b0c765d73b850b54244a719cf461fb318796c0b8f310b5490959f9d9187f99c8ed3e25e42a90000000000000000000000000000000002b94534aa0ba923bda34cbe92b3cd7a3e263741b120240ff5bdb8b718f094d3867e3fcabeab4a7be39c8f8c4fdd10d900000000000000000000000000000000048711cf6a82534d64d072355cb8fe647808e7e8b2d9ac9ed52eb7fe121647a721dd1234c71ecd163d91701eb7331cac00000000000000000000000000000000141ef2e23a1ecc7ef2ed3ea915492e79cfffe60b5e0de8441e878bd0653843d79c724e3c5ebe2321361df99f8932ddc200000000000000000000000000000000085513b4009f29b3e00a91c2c4be418368560802ba4194cbd2f4fa3d72a55fcae547014434514a8b2a8fe3e0b28d2773", + "Expected": "000000000000000000000000000000000e25a38d0ce2aabd2538c95ed463f226e3f29ce7f10e1be27af2d3db741926d557178c4b125af8789b40480d8beec0890000000000000000000000000000000002a94b7c57fe2783d055a537004a3b67e41f5374da0813094f5944fbabf4d27eb576dc8b21ccc15f8339df14ff8785220000000000000000000000000000000008b9efd8abfa4fd71a8eafdba9df38360ef0b0a117c0052528d1c24df5032635eebc7b201439f5de858514666c68cd270000000000000000000000000000000012a2fde51f6f4a98435c325dc3b1ae846bc33a5ffb3b13fbe3fde2f74dec0aa815fa8e42392b3dbf798cf547fdb4db0d", + "Name": "matter_g2_add_11", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000576b8cf1e69efdc277465c344cadf7f8cceffacbeca83821f3ff81717308b97f4ac046f1926e7c2eb42677d7afc257c000000000000000000000000000000000cc1524531e96f3c00e4250dd351aedb5a4c3184aff52ec8c13d470068f5967f3674fe173ee239933e67501a9decc6680000000000000000000000000000000001610cfcaea414c241b44cf6f3cc319dcb51d6b8de29c8a6869ff7c1ebb7b747d881e922b42e8fab96bde7cf23e8e4cd0000000000000000000000000000000017d4444dc8b6893b681cf10dac8169054f9d2f61d3dd5fd785ae7afa49d18ebbde9ce8dde5641adc6b381731734598360000000000000000000000000000000009143507a24313ee33401955fc46562c9b20c9917df3b40ccbd7ed43b1349d4551cfd98a4976d6fec5fc289460c8d89900000000000000000000000000000000060566b79df5cc975e669da8ca3a7fa91bf3f5c9fb871c3d62f4a3e79dbc341b89d38b588e5414bc385d5e3cbf3ab9310000000000000000000000000000000016bf40b8cc4c01a87aafae0c4439b623a51ba9a383756a550b69d627d6f45209f0d87e4f9be9edff35c986f7b9c49e3f000000000000000000000000000000001842d9172bce51a164fbdbdb108d0faae07e4642f21c80e40ac31e737657472ae3dfe552b65349629c210a068c4afc0e", + "Expected": "00000000000000000000000000000000067265782d58b04a2ef3dd419cee506e076e49d1119e28db1df7f0e22cba9bbdabc560084cda50bc8db3915fa9c489a30000000000000000000000000000000012448a61fb2f6fd8e355111b671f0e888304284b72d5688091f2ed00edf7ccb7e5bd8a733a910d6964dde07d393798470000000000000000000000000000000005f687356ff6c634eb46613be8e98540107e706714434faff54510234d4aff42ef7752e154aed63fa8ff905ec0af628f00000000000000000000000000000000180dca84a37c964b30f5cd11a090e54acea102f1b884319f8d1252a37bda005512ffc39dec8e33af0dde0d37993f846f", + "Name": "matter_g2_add_12", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000ca8f961f86ee6c46fc88fbbf721ba760186f13cd4cce743f19dc60a89fd985cb3feee34dcc4656735a326f515a729e400000000000000000000000000000000174baf466b809b1155d524050f7ee58c7c5cf728c674e0ce549f5551047a4479ca15bdf69b403b03fa74eb1b26bbff6c0000000000000000000000000000000000e8c8b587c171b1b292779abfef57202ed29e7fe94ade9634ec5a2b3b4692a4f3c15468e3f6418b144674be70780d5b000000000000000000000000000000001865e99cf97d88bdf56dae32314eb32295c39a1e755cd7d1478bea8520b9ff21c39b683b92ae15568420c390c42b123b000000000000000000000000000000000ab19bbddd661e9db8fe4cb307ecebdc5e03efbb95c5b44716c7075bd60efcfc67de0bfd7c46ad989a613946c90a4c1000000000000000000000000000000000120800e7f344cda816299fa37f603ade06beb3b10907f5af896d6b4e42f7f865b756f14164db84411c56cb2ea81f60be000000000000000000000000000000000f688ddd257e66362af1437b6922d3397a7c3dd6dea6bca8ebd6375e75bf2de40bc287cbf3434388191e56b92949c83b0000000000000000000000000000000005252465784aff8c1c707da58b5808c69583bf852d68f96912bc53f8dae4536b09ccbbd25a49d9e744118992b92b6792", + "Expected": "0000000000000000000000000000000012a29d35c9af52f172787c90c5a3e77ed29d66feabf5d7bdd6bfc14dd9a05d402976b84d44647628c908d1816f4e7100000000000000000000000000000000000caf3c372e36de557ecd7eba02e6a79b1b4cff30343119df7a23662c8512095e051ae2dc27e577635c74a260be2b084c0000000000000000000000000000000002ceca293a58bc9beb4ee9a0679eab037f5cf7b326d65c0efeefdbf384ad8e4bc08a3a75a02e6b9cba8963e65d6e76ef0000000000000000000000000000000004631773a6590bc89b49a75bbbe2e732f9466ba259ef7a04ae69b6aa5d5a2621c1918eb213101f6f7eeee4656a7b1472", + "Name": "matter_g2_add_13", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000017eccd446f10018219a1bd111b8786cf9febd49f9e7e754e82dd155ead59b819f0f20e42f4635d5044ec5d550d847623000000000000000000000000000000000403969d2b8f914ff2ea3bf902782642e2c6157bd2a343acf60ff9125b48b558d990a74c6d4d6398e7a3cc2a16037346000000000000000000000000000000000bd45f61f142bd78619fb520715320eb5e6ebafa8b078ce796ba62fe1a549d5fb9df57e92d8d2795988eb6ae18cf9d9300000000000000000000000000000000097db1314e064b8e670ec286958f17065bce644cf240ab1b1b220504560d36a0b43fc18453ff3a2bb315e219965f5bd3000000000000000000000000000000000e3165efe00f69aee84ac56d2161f07c017abfaadeaad34f8c96799d68bae0e6f9b557bbf9137e7826f49f29c58d1ef9000000000000000000000000000000000de0dce7ea371ad60f21f2cb61cb582b5072408a7efc91edf05b36a1a3b58fd9e6cf808d75157eedccc8f1c93a8ae07d0000000000000000000000000000000016d911943d80427385ebac1d1b293914a9e4dd9db06c1d6a758192d63c8fc9368e02eae7fb0e3a7859408f215cfa76ca0000000000000000000000000000000007bfdc6afb8acec625e50ecbc08a5cdb7862b795866323679885ba5cba3fd51f181078e03fe35e96e6383c077eed1bf5", + "Expected": "0000000000000000000000000000000017f155ed9911ec56d71d63d57556de071ebe89be36e6bc9943ec068a70dd5a6f045dfb9fde5c1e29d52c9fc17579452e000000000000000000000000000000000a60d62ea549edf4b11f62f2321f39d41bf11f3c4f858dc7db85b1dab1b7644e27eeb1d022d6082f59c65155068d2c390000000000000000000000000000000009d309145fad15860e556ec4b4aecb415865954247c2034d5bc96026e4d6f7612af6e2db99f4e462acee2b303134b91b000000000000000000000000000000000114ed157e3d020c5397cba7e10cb864aabb47461f166a6724614e689274ae74c505fb6ebfe3e88da0d6c272a15a0527", + "Name": "matter_g2_add_14", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000018244ab39a716e252cbfb986c7958b371e29ea9190010d1f5e1cfdb6ce4822d4055c37cd411fc9a0c46d728f2c13ecf0000000000000000000000000000000001985d3c667c8d68c9adb92bdc7a8af959c17146544997d97116120a0f55366bd7ad7ffa28d93ee51222ff9222779675000000000000000000000000000000000c70fd4e3c8f2a451f83fb6c046431b38251b7bae44cf8d36df69a03e2d3ce6137498523fcf0bcf29b5d69e8f265e24d00000000000000000000000000000000047b9163a218f7654a72e0d7c651a2cf7fd95e9784a59e0bf119d081de6c0465d374a55fbc1eff9828c9fd29abf4c4bd000000000000000000000000000000000a68dccbe3452731f075580fe6102b8ee5265007ee19c56d95bcb096a3a6ac444f4145b980f41afcb0a865853b279bc600000000000000000000000000000000164767ea55a9038ac2dd254d8c8a4970dba93dacdf5416aecaa407914719cab165e7a32784b2c41652a86358737d831f000000000000000000000000000000000da9441fbc6578c85fdeca49082c9ebbf183de894d67c65158380ee56132d3cdb44b100d72b6d3b82688defb75d2aa390000000000000000000000000000000017d570e4f6e46550679d5d12c347414da207060f594620e2f8db66df8e0b06c912290b207a268e782d4b45db19a199db", + "Expected": "00000000000000000000000000000000118e0c81f9157395578f0fb83b179721de2af3326d13189cb8f43911d8c3268a11fd9702f09f14c115bbdc43d5fbc08b0000000000000000000000000000000016a548df8c87f432c31e4e32c3e5b4d48d6f29fbe391d1181174be9dddee450e7e96bffe8c9f23692ccc080116592944000000000000000000000000000000000eef72a5c698c58f1d2ae9415da256b54d7b1ac37a1d1b88727c0afcfd854a41973c6cb10ecbc3a90050fe3d8d3ce8780000000000000000000000000000000019b16ca8f955dfd21830a3f7fafcc97d7de977bafe1983892988aaedd430d22674d97897d24c1643e99bfa6256df4bf7", + "Name": "matter_g2_add_15", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000000eb3c91515d4a41209a73564741a8ccf901a624df9db22e195a5d02d24b7bc0a12756b15b8d006cb991a7e088eaef1000000000000000000000000000000000704ce8afc808b0161f6f61b22d990d713ae398779e6e74e9b5771daf006ce0bba3a8088edf75156f0e48b92ee8409b00000000000000000000000000000000018fe81e05aff0620f4bdbe4a715e015650497afab62921eba0ab86b649e5a2fd3d54041868928519f537e36448688a0d00000000000000000000000000000000162bd97161201ea3c26f8dd1204a9c6b61b762bdf573cb5d20b6b255f30208ca7d96aa47b46fb8c6bf0922075f1c1ca800000000000000000000000000000000197737f831d4dc7e708475f4ca7ca15284db2f3751fcaac0c17f517f1ddab35e1a37907d7b99b39d6c8d9001cd50e79e000000000000000000000000000000000af1a3f6396f0c983e7c2d42d489a3ae5a3ff0a553d93154f73ac770cd0af7467aa0cef79f10bbd34621b3ec9583a834000000000000000000000000000000001918cb6e448ed69fb906145de3f11455ee0359d030e90d673ce050a360d796de33ccd6a941c49a1414aca1c26f9e699e0000000000000000000000000000000019a915154a13249d784093facc44520e7f3a18410ab2a3093e0b12657788e9419eec25729944f7945e732104939e7a9e", + "Expected": "000000000000000000000000000000000f2bf3f69276d390c9fc2c15e9f5f5d0b3cf9a6eb028c44811b481f376ab60e17d33a04b78348e46eaa94332c5f16ff8000000000000000000000000000000000bedd0437fb3f4baef87e56f33c77fcdff6a5512571cf11fd9605697abd8763315f1fe4bccf04acc6e971d6aeefd9c1500000000000000000000000000000000067c3ff69733baae2fb4ab77cddb7563047c428b40a257a375f8cf8c9d230a6619f7932b86e0836fff0c1c60d2c4dfd900000000000000000000000000000000057526faed8d62aa10e89add5a338320c748ca1f96ba5ceb579efec69d17475571fc4ce6fce3a93398ea88340f0e969d", + "Name": "matter_g2_add_16", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000135aee0e30fbcad798738c10d4aebcdf50c89ce516325f655fe763dce54ffedf94dd74168611e5ae879b5bf5598d62dc000000000000000000000000000000000c728e672cd8b3bf9341bca929c34118b566cd3a80452d7015bee9d5cdc001b1f5c678d4b2cc4f7cac353e7bf326ca1e0000000000000000000000000000000014809aa22e2051e463fba6d49fbb060d0c7f599a0fc5409d34e71f34817e7beb1251810ae6eee1848c60796fb8647dea00000000000000000000000000000000145a4de777d86025d50e12f9a6615ecb9bdd41489992d1b643dd9aa549acbc63b04b0bdfd14b6e45c70f165e9a8c91be0000000000000000000000000000000001c2d8d353d5983f22a5313ddd58fdc0d9c994b2915dbc87a9b65b7b98ff00b62e140a27dc322d42b3ad190c1b3728dd0000000000000000000000000000000010412f3625947b38bb380a6ed059f1677b7a7afcb91517837c563dadd0e285b95740a200ddff6570d4d92bb636b625bb0000000000000000000000000000000015f4f9a480a57bd1b2388532ab045a1ba93d2f6589a3022c585fe06a1d611165c99d70be06251812405c9c37d6e9f7730000000000000000000000000000000001a78e6c5062a6634a56e9853ff5afacb2e7cf31fd0ea5f0d8c8ac6174c88133cf2f63450ec4590544c9a0e37daac1f9", + "Expected": "0000000000000000000000000000000004fc19f8fe47e6acd37567016704b07f906e8741fcb196f697e1fc24b0204292693ff424bf1c5e407f5bcba5a3b1ab85000000000000000000000000000000001816f992c3c461fa6d2014ced382a35b0d70e61927d72b4d661434efff3dafe2f4b6cc91bb1a5dbf809f10f3ed7f36de000000000000000000000000000000000dadf7f7223ccedbeffef31c97df7e01f99299da71b589c8828b65715012aa343d7e041dacc57b34a6b5f84523a7938100000000000000000000000000000000167f7e73e22df81bd2a7a6f14e940a401bf414e5d18b3aa610b2a82ca8f46aecb5721d0092b27f8968b2302c37957268", + "Name": "matter_g2_add_17", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000009a58b7116dbd6f550f8ca98071813130ecaa9ea86d5275eebc36860690fa048c9ebeb46600b2b63e847bff3e38ed0d00000000000000000000000000000000113ffc0932c041e0e34b2540c485eb74f5029b339cb60bc88a8a749310f33f330dea137e5f340044fd689264af66696d0000000000000000000000000000000002642da3c2c7b6688aba0b19ab29ac72e35caafa044863c364ea8833fca850289de52c0963bc33d7bba40cb5f568718a000000000000000000000000000000000552d35ca054da2f148c119454f6760607b351f2441921a2be17da2cc10902d71571c5554f132e60df79679428fa07e3000000000000000000000000000000000818e567aea83eaf3142984bb736b443743659626c407987b604a30c79756081fa6ae6beeb2e6c652dbfe9cf62d44e3900000000000000000000000000000000193f0317305fde1046acda2c9491e376aa67244f68ef6495845d049e1293082af91f880be935d9d8ad0e25ad918caae200000000000000000000000000000000109224b8178be58ea4e4a194ca66bef9d14f6fc2c625d25feaa4f32e0f4d72d91024d96839bc96e6a624c5ad6221bd94000000000000000000000000000000000e42decf8a987efaeb4ede37236b637e61249bf6245679be7fd4d633e2d814ed4748b73890ad3c4fcbcfb4960cb67ae7", + "Expected": "00000000000000000000000000000000041a5783c748247f05457d30d16f93431e9046a236d5025cc07a27b9f2abaaa556e2df65cf0f0015107253fe94d8b4dd000000000000000000000000000000000193638bf69c7508c4b12808a62e89883c34f97ded6e1b5dcc3f28191e5c7fd901a72a85ae386acccc9865f8144b1bd500000000000000000000000000000000180e8184ab583da58b77b8a4d108a366dff3e3b336ebc5c9153fa815188edc95e7067ef25f7d79526c295d634bc98f5100000000000000000000000000000000125b147100f6df0cede8e22151b3423b1dd364899fdee103c71a44388ff002a367627a2342e15833644bcde61f2ef6b6", + "Name": "matter_g2_add_18", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000018fbbcba3d4b1e548ceaec4a48db62a2420ff29a67af332ee7ea3f902f84e6c375fd33abc33d945c5bca25603979f9a400000000000000000000000000000000072ff416994364bdc6535f36c82212afa822cd94fade69f11eb38dbdcd37c7e22af55fe05e6a826dad822073656eaac10000000000000000000000000000000017bba179b847278a4878b6faeaab3b1f4bd7540d22817cd9aff95557497f8b9d286657b6162c0f89f7820becc637dd550000000000000000000000000000000018e2bfed71aa9b11fefca2f0db8bd9b8c69540267de50bec4fc90a6e9741891465c9761d19282e1100b3707eeb598b31000000000000000000000000000000000ca0d865f8c8ce0a476f7a6edb3ce4bd5e6c3a8d905d8fb5a10e66542f4325a9963c2f8d96f804f4d295f8993b5204df0000000000000000000000000000000005a966f6254f0ef4f93f082a97abe07db56f00c2ade047d2f0027edef6f00a0dfecaa24d50faa778fa29087302211f7e00000000000000000000000000000000121c51da366557c09af1bbd927521da88dfab3e2e9a95b6effb0a968795486f281f0c887e37f51837557b9e3808987130000000000000000000000000000000001a5524975400b1e88f3fff8dd34dadf5d75564cfc0026df31ee9c2c1d48b0f69a48e1e4a48cc4b7db61f023a7915780", + "Expected": "00000000000000000000000000000000095fda8adf3981f4468fb82aa0ccf80e55138c922c6422cd8e67f53ee63e7a390bc345469e9211a1f8d810cf4ba27d0a0000000000000000000000000000000015c19b6af21f75e8e53fcefbae1c8d7f97853a8aae5fa62e606cfc92ae71890702ef9dc5609d3ca8fefd415fbd820c04000000000000000000000000000000000007b7e908766d34c5d99cb7cc76d5d5ea83c29ae1d9b83b163741bc9962e293926b1e251b546ce0c1268def728da78100000000000000000000000000000000084fbd6253211f7d66d52b7f14360729d54b2f94c52f2b76e521dc3961c40b4f19944923f64c6425a44eb158a9727a4f", + "Name": "matter_g2_add_19", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000019efd37727dfaedf697fcda7a59847dbda8ca7cdc92f34e68691d682e20ae6545ac104d6660fdb8f64a051e69298eae8000000000000000000000000000000001225ace0fdce456dd888c9672503b68ef77b2d11caf1265a767a6ea14911e3ca03fc153f18dfe9d95e0cc68b7b8a3a8d0000000000000000000000000000000008a6b059c1c4da046cc0b1b5d7f33270aceffa607daf6d0d078c06f940604e1a0b4adf01a4091306e3c7eddcf3d95101000000000000000000000000000000000f79bae5260a2f114ffbb9273f3049d3ebb002500a57ee0a7d157d86957f43f87a2e026fb9892dacaadca5ee04fc8e170000000000000000000000000000000002b51851ef3b44481d13f42e5111fa4fec04be0bf6acc7e59dec3a8c8113e5bb7b604c6dbdc5e8eddc2a1ffb81bc2baf0000000000000000000000000000000018ddb483ae75402852b7f285277ff7308ff78a3364cca8b0e0e1fa9182de275fd55c1e8ec3dbde180379c4280787ba8000000000000000000000000000000000170539890c89a4f91acd59efd413b5d1059f0c8fd8718e8f722e865dd106a4eb02e6fb0cd71b34ebc4b94375b52e4dd60000000000000000000000000000000001c2e9392f5d4b75efc5ff10fe97f37e2671cad7e4710765866e92aec99b0130e6ff1314502d069fb7b5f86bfce4300e", + "Expected": "00000000000000000000000000000000121e7f2eb906d0b31b8ce5cc46638428b6ee57a1ee70e4ec3c2bc044230b9b86875abe0862145b442c0e34308efc690f00000000000000000000000000000000139120d0a10b82737561d0b3fda01b6df69d9beb7dbabf3ddda036f9b4c317f3ac1eaf400013fe5ad664bea44a73b336000000000000000000000000000000000a923184b381027d8cb3f82708802b204566b2b8bb6a72767aa396324d8a26b4e0f0cb92fd1914d77a4e9af2f1ec31e3000000000000000000000000000000000409732f2225cb5e5c002bef17512519eb1a18bf6c3d7f834d0c7ac8a38433c88b550b3f443d259313eb1133620ebf0c", + "Name": "matter_g2_add_20", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000016d2b73eeceee17d3bff3aacac9df9ac1c4248d9ea7d6a503a757f7bb22fa6970bb6f5cb5ec154785f7252e1508b382e00000000000000000000000000000000081edc68bbd8db7b10be06ee23d090bd54f9ca07ef24dfed7df7bb05f8cc26e6889dbd40ea203fd5cca5cb588199f9e40000000000000000000000000000000010d3478508619ea9493b4330e2fb9150024cd32dc1378f824788a884a4a30fbf39c630f465557bf0c6d69b4cbecf89f9000000000000000000000000000000000f20c9b134db5d8b7756800c031bf5962fc560ba95d4bd9157b16179f1a37ae08696a2be455ad8d018aead6adcc69b710000000000000000000000000000000011bbc566a10eadf16009c1d2655cfae6adfb0f56f5e55b31dc000414be1b4cee9a0b9f7d9eab4c6829037c327914d5640000000000000000000000000000000009b28329096d8644dfcba6e92477eafff29f7477da4581ce76d1493f03034d7f5d3acaadbe42c76a83ca51db79d456d10000000000000000000000000000000019f75a303fdede5d97f3e521b03ef6b9d7c008d770b59ce3ac38900b340895e008342701ad1b41830b9c010936f4ff1700000000000000000000000000000000161aa1853edbb56fa3bd685c9c6b88e466dfa3c4f194f6774b4d9b1f30b016993bd0d65e8e9d6dea6caa196ff735bd67", + "Expected": "0000000000000000000000000000000006a200642d5cece5eaacacb36000b4b897e8d8c661c8282f90495002aa515c7638183cf1e80a0b35e953adb92b6bb845000000000000000000000000000000000e88d4cda34e98df4d727fda79b67961b5b8efb1b125ef2a8eafc481a2cb2fa1530e59a091f31c25cc49d38f545491ff00000000000000000000000000000000082f38c1a1c35981f537547dc3b59331ab8c5e8dd261df58fe6f0c44ef1e65d0cdc1980e1a62f6248f38d0afe91e5627000000000000000000000000000000000eda1002e202e9ee4df5354cb87760d4df32eba1eafdad27cb0636879370a8f93be0bf2a30f15f2fbcd7e52c1bdf6b05", + "Name": "matter_g2_add_21", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000003dce67181d23af9729e9fb0653d7f79c890fba27de42fada93123e112c4a468fa889921192db8047d86e4db77c60266000000000000000000000000000000000869a1e39d42d9bb0cc0568fdad16abbdac3194af893ebd8dd8f8c2c3c855abefa5fc215412168acadc88e658e83f5570000000000000000000000000000000001ef139a75194f3c4b1378c2b66dd304d179460bac0a289405cd8faa3ff66a7b6e54eb7b8742a68150b1e098630135c40000000000000000000000000000000003892b5a645af916be2c6c7fc0bb08fb5f39341d3c68598940554e1be11e1be75af920db0c8710ed13c78edbf683f17d000000000000000000000000000000000ae7289aa9bf20c4a9c807f2b3ac32f0db24e9a0a360c92e5ce4f8253f0e3e7853f771597c8141d705062bef12d4fea80000000000000000000000000000000001d2f610d79110f93145faad2e34f3408316b1dc3a72852e811b324577d9037035e24af25002ddd100cd9283b70ddcad0000000000000000000000000000000012947315d5c0ec670619125eed0de3dd259a008baee4379b82accf2391e70a2bdad264cda04c3bc1b5394a62559fa0ef000000000000000000000000000000001239e687c4d3417c3c9b655035f8d8a649c255f9a8e6f03b785eed0d416a1cd6ef7c8b45563acb4616af24f64dbccac4", + "Expected": "000000000000000000000000000000001341cf3316152ae8d57ea2194224f04756690133d2e02d077dc271aa577278e346e0ff66e8a49ff8c983fd34546e1f6f0000000000000000000000000000000016c9093da650643f4b4061e1c6e55da6ebaf9f234bef8325aeecad3863a0a2f53e1cdb2d54aa8b075ce6e6632fb4cd660000000000000000000000000000000011eaf3dee010bf2a16c5fbb1f7aa559cd4d831f087d9dfad4e157a6d2b6495e370d9791cbaaae19339a65726ebfc3b910000000000000000000000000000000008476d793305204be414819fce2ca70754a532682876277bc0586514f2096ba9998ae848c722ead6722d5af9395ff77f", + "Name": "matter_g2_add_22", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000264dd4b477f5db65edad28c7153ed919a863c5c5661e0125c5429b323e055fd69c33142dfc6ed9c87082e2be4675e1f00000000000000000000000000000000046ea088a2ec94d3a1f1f97949f1ebc49690c453d316cc46534fa253b34b30323b6071d147d64bb94e02fb4db07bb0c400000000000000000000000000000000013692a33bb1348486eec40a9e93a4ea3810c7b4d3188cd07e235a2c898aa87ee0d17682fd24f4d978f9fb028fd26e2900000000000000000000000000000000115f8b64c00cd5cd344a7b5edc0ef0bb85a3e8f0f9dfb28f8ffe12db3e0d222c2d45dcdba0fbdc161c5d558bc71aa097000000000000000000000000000000001179ee329771b5913d07818e70f6ce5a58d74ea0b573eaa1bd3d97e45d3eeb27fcc7d37dba127af7a38354cb6ff48f7c000000000000000000000000000000000c898abe6eb76ef99f5143cfb8d840a918bcc9096ce25caa45d0bf5d20814cb01b024f1fd2cbecb6bef65d9456070dd90000000000000000000000000000000008e2a4fd746e86f90484f9b9b7b47b6afe5833762e515ccb276c554f00df88dd9aa0fb792c5f419dda0465cfed838e7c0000000000000000000000000000000012b5e6f7070c0045ade96f548ed6428c5030fa20c6f6f37a42fde9dbb5cd01def0fd8585bf8aeef913e7d42b9ef22efa", + "Expected": "0000000000000000000000000000000009792d98ab9b90c2467ad0d070ea44f382ec7ad5290a59d889313c5a55d7b8e837333ad7ecfd97221d405cd6c549dc8e0000000000000000000000000000000002b92dd07b61faec23f48b8a7893dae29509fefd688a978bc2e870d4cd6f963d708a0611b4aa65f5644fbc6ba4c5e66b0000000000000000000000000000000011e46a283946a8e033afbf7c14ce3162a05867809d7de94a090c8cc2cdca8bb79add21f6e2fa8d7f39ea6d26cd37ea850000000000000000000000000000000000fddb7cdf1f1126e7a6780e4892601121b289a386ebce0caf96cd392ddc57c47e3f9284889fd8a18fb330d6c40bdf67", + "Name": "matter_g2_add_23", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000014c83d58d90db4821a0411fab45f83fbc05f7d0d7a67ce75da3ae568978d15f4c1886c6fa6086675c0045efb30d818400000000000000000000000000000000001e68691123451f4c3df6dae62c6a63855ec3597aae33a8a10ee274e902e9aab1460cc9c79726312df0ee0ce90c8d3c00000000000000000000000000000000018a39eb3e3c6c7fb8ee304e55d15e209afe2fe278dda93552a7b9f51fbd778da1502eb6775cbc3f832f8320fa0686240000000000000000000000000000000017c15910fad1ca5749aa82a5a2fa98b0ebb37e92912547fb1741f18c34e0d5fc3a307b928636c25f0320d71cb9d31062000000000000000000000000000000000fe2e61bc8e9085d2b472a6791d4851762d6401fd3e7d3f3ba61620dc70b773f2102df1c9d6f1462144662fb2f15359700000000000000000000000000000000031f160cde626ca11f67613884a977fb5d3248d78ddbf23e50e52c3ba4090268c1f6cd8156fa41d848a482a0ca39eb04000000000000000000000000000000000eb61ba51124be7f3ee9be1488aa83cbd2333aa7e09ae67fef63c890534cb37ca7de3d16046b984e72db21e1f5c57a8a0000000000000000000000000000000006bf6f5d65aa7d19613141018ac8bf5d1e6fe494a9f30da215a2313a0241779006bce33a776aeedae5de5ea6ee5a9b9e", + "Expected": "00000000000000000000000000000000054dedc002c5f2da8c6e0a0146bfe5c83200b276b074e6d6f2c397e1208f152d3ea3e8f0da7da62cfd2a028d4c94fe5b0000000000000000000000000000000012ff307f86e266e7a212484a169d3e81df98217c6f715176913b0d383cbe4e790212da7feca0cea66df09d92544fae010000000000000000000000000000000009c211438dcf8ccb664b535e73eff304b92aa2f568aeaeb8e10ec142f92b211bb8147b250dad77d508cfe353667b6f150000000000000000000000000000000009d1734f4ecc88fd56f412f9243c387b9da659faa3fe7295580a6b7519b1980bd074339fa9b0bef44dcdd0cf0c4a629b", + "Name": "matter_g2_add_24", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000fa96d9fe01c18732e8d6454df9bb1f482c4b9add837ce9c354c72d49c2d44ec694674aaf0e6d6a095cab7ebb57ccd9a0000000000000000000000000000000001f8ffe3fb7e9e311e0f6949c07c26a0febb181e37b2268bb5e125fc3a100323740d1ebaa5e635dba3770fdc2ce4ee860000000000000000000000000000000012ac42095fdb677720ab3f14bf0afc55c95b43d28d922a5f8cb0bd841306b978751d24546e3a6474976961d0768f29e9000000000000000000000000000000000baf9804d99039c9fe966a696c64bdacc9673b0906b4deab108d34fbbaa3b0905d50892278570564017b96828c7e1ac900000000000000000000000000000000196044a5cdbc5300ee837dca745a44379070e9297697f5db28df4a37307cc740abed45cc778a3f4e3b8c9890ab6c3c70000000000000000000000000000000001176f5de6a3577ad67863bd3d9152ab9e8184964c6ac276e95946788f5a76394047580077c0971d874a40d510eb0443e00000000000000000000000000000000147dd55dff69213c5760e8d22b700dd7a9c7c33c434a3be95bd5281b97b464fb934a3dff7c23f3e59c5d8d26faa426bf0000000000000000000000000000000019efcf03ddb0934b0f0dba3569809d5b48b863d50d3be4973b504244414e1e1db56adff51d33265ce102b320c552781f", + "Expected": "000000000000000000000000000000000896a38ce734c550c178786092292e737d44fa5f503d6d3b66c75e6bb70b59d1db9e8baa1ea3e256e2dfd8a942311e75000000000000000000000000000000001231db96a35229a4c7507b0ec193491446a0b43115c27d18b3715fcd4aea14d4e5c99db5934e73bb0b86f1bb91ee96fa0000000000000000000000000000000000d6f95d5637b29ea889c028dacdcb484d8ccdb243da4d5ff49e5ad82f234d414dc1484e9ed6cba1b5940eaabd3066860000000000000000000000000000000007de052fbb76902e06e1783fa8afcbb54a5069b4c5e9cee78d43da2cf76f24843a740a9eec6fe9b8f9bc4ac9baea77a5", + "Name": "matter_g2_add_25", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000014ce6d88a7c5c782562aa101550f1af487296adebd9dae8252698ba04fbd58b92e2216de6ffd474d5992f97d9f22800d000000000000000000000000000000000ce92a04f5c8a99ca0e93992448222519fc454bda5d1d8638a7bfde968386e4ba0dcd1da59cd81d4c4dca3e584be0275000000000000000000000000000000000cb570796f5c8f7b8aa02e76cb8e870d3365fe4dce5df07ec286a0a821f922b4003d5b69c0f1588206d9544013e268c400000000000000000000000000000000098056a033d9cdae86aac02de3a444471854b909680719154b44d4f55f30087294e39e57643c692d6da725b8592390800000000000000000000000000000000005d8edbabf37a47a539d84393bb2747d0a35a52b80a7c99616c910479306e204e5db1f0fa3fe69f35af3164c7e5726b50000000000000000000000000000000005015082d6975649fbc172035da04f8aeb6d0dd88fdfac3fbd68ec925dc199413ed670488dc6588f9bd34c4ff527f149000000000000000000000000000000001312d53088ca58dfc325772b8dc0e1b20cebf7b2d5b6b4c560759987b44060bf4a59a68d1a5623bbb3cc5b0bc3986b810000000000000000000000000000000012110cd462c6fabf04f67d652639d19640c46f51aadd6c4f9a6dd7806cffb6192d95c198f4c8284151feaa2e2a0dbc1f", + "Expected": "00000000000000000000000000000000156914a9137e52abd4579599dea4c0f857eed0457ee1d80635d3a6ccf0c766ba8ab1b6f989711fbdf125c4ff06b597ea000000000000000000000000000000000c60184e8ab32019ce20d2d137130f657c8964406fe4abb26da232c9c5dbfab243837d700c88d6b9ea4b8f0a2f514281000000000000000000000000000000000dc3e6e3acb898552791431859943d0a83fb4ccd62e4ab2a971370a93a99a9dfcdbe4c42535aa063354e0f2cd48308c300000000000000000000000000000000025be02da875d4990d1f0be626ce634c4856ea91f88f636bc27e313e73897c9c13a1e3ae70c1227dfd4fba97f521d6af", + "Name": "matter_g2_add_26", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001214aacb0a5e6b7a40369a83c07fa8cf1786ce7cbde2b5a501d9c1292532df7822d4fde10a31fc0cecce3a7cfe3311850000000000000000000000000000000004f9669d8fe4f884ae93b2505710e6e45b19b7aa5df8cdd811f09e547efc27d21024cba05e2dc9d057055f30ec72d9df000000000000000000000000000000000a852b821b31cd27eca19712a636aa05ef2cd82c36ac1c2ca240edc7d0172b42a72c42d3cba583a5b5129ac1c9486e270000000000000000000000000000000007bd8419e791a5cea04993509e91a980d3ae4987a5b322400b6e4a4f2b636891a1c7ba4de96b53426dd556532403d5a300000000000000000000000000000000117fd5016ddb779a6979d2bffe18032d9a5cdc5a6c7feeaa412381983d49ab894cb067f671163ccbe6225c3d85219db6000000000000000000000000000000000dcf01077dcce35c283bea662f4e4d16f871717eb78e630d9f95a200cc104fe67b0d69d95f6704d9812b46c92b1bc9de00000000000000000000000000000000121f212cd7251697ef6a7e3aa93eb0d7d0157cf1247d4411430c36c7277bf8acfccc4ed8590b5e8d0f760e0e4ed7e95a0000000000000000000000000000000007d22d78b486f575e01e21e1239cbedc4628ba7e01ecf4a3459bd78a9716e2969f26ea3f2449685f60397e1ab2aa7352", + "Expected": "0000000000000000000000000000000010124c1c1c10868b570d2969ebc3bf5cd6bfab13ddc93f0fd2b8a1742eb8e04d31063bb81c52b92e253128d4cb4413a60000000000000000000000000000000013f89997cd2ddae00cbf24cb66a92146c553c6fae41cdfaef14d49078729f239ad2661937dd0d4d6ffd7076b03e0aa84000000000000000000000000000000000ba2ecf990cd846c95b35ab60d4f97f5814c8189190df9d521b3dae462f2d44db006a0daecf6b82c1459006bf82ef7c90000000000000000000000000000000016dc129b83cca5b3c699628d081306c5fa61faf9dda5e92894931714037628fb829c595bf64d4a7fa295f136ae244601", + "Name": "matter_g2_add_27", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000005ef88bf38b2f998dec7302cde829076e6cf69df23aa0bf6bbb39fc0d3d8b5eafba74efb928b1de0eeb3d86ec82612300000000000000000000000000000000011f47e9583997b19c36616e4bf78d6ddd6d67937f493986250ff02aef6e6e7ff074559af2f20a5bf1d67158e4a199cdb000000000000000000000000000000000007777c8eb259a836e6459b7bdb642f878d869fdcb31b105d01f280938ef5377f2775874c099dcd394abe70f17d595b000000000000000000000000000000001607379d1cd34e2d0ed765a339b21433e9aa489609b92414c6b5a05d796085269c288d739717def9db3502e055086016000000000000000000000000000000000224cbea61c5136987d8dbc8deafa78ae002255c031bb54335bcf99e56a57768aa127506fca1761e8b835e67e88bb4dd0000000000000000000000000000000018cbf072b544df760c051d394ff68ad2dd5a8c731377fa2a5f61e61481ad5b42645704a2d083c7d45ed4774e5448141e000000000000000000000000000000000740b8b7d7bce78a51809713656c94cf98de72887676050f65f74c57cbe574278dd3634c44e057ea95babcc3d230e3c40000000000000000000000000000000006696058a191c7012a4ee7c973c2005ac51af02a85cbb60e3164809a583b4431dda2b59e1c9ceeb652b3ac7021d116a6", + "Expected": "000000000000000000000000000000000a66f36f2437db57473bd8b7670994f1cfeb8b43c0ceae358e63a5e4e52b737fce6b3d24cc4de593bcd44c63f2c5935900000000000000000000000000000000070b7ad970f03a38c8a31452cf11422159cd3331d746031781a5861e26f54efbaba63dcb1db8bab997eada9c3dac39cc000000000000000000000000000000000ba4a9d7350adca1ae64e722df11baeea77c5fb75c5b52c8c46b9d863a70bfed1ec47888e907213f4ed4dcaedd37f20f0000000000000000000000000000000008a64244f1870a1dbcc4bd4d5c9eb5cd5225713dc73aa22bc46b1cea36c88a66f85251a8a9ba7279c88bd5dd37a06f7b", + "Name": "matter_g2_add_28", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000d6e3068c082b68312141aa68f1540ea1415e93e7f1762b6f06ff408a9995542da1c727a13355c19f8f418a44de1a95d000000000000000000000000000000000dcfcf2ab12b1a0e521ab402aaa4d32ff649a5a97892eb6ad98487c3c73c35601c313b8130ad12e9098d16eed3bcc2e00000000000000000000000000000000013777b1eefa4af03dc44e4e054eb7a3a980a9c55644900b80346be84b970e1754d1f4ab771adc9249e4accf88a23fb400000000000000000000000000000000002f53b231f1209c6f8b52f99a78bc2147c951ac89b341495f4a60a6572985ce2bc823625099ec214bc9ceedb2deea3ff000000000000000000000000000000001522e0a4ccd607f117fc6fc8f9abcd704e9850d96adb95d9bfaab210b76bfb2c5dc75163b922bd7a886541250bc1d8630000000000000000000000000000000018a6e4327d633108a292a51abed43e95230e951e4476dc385ceea9c72ed528bf3e06c42d10cefbd4aa75b134936e4747000000000000000000000000000000001198587188e793ad2ec2fa0fa1d0da9b61ed48444fe6722e523aeac270f17f73f56b1e726ab811bb54a6e42e506d70a20000000000000000000000000000000004bedd94182e0f16c71223ac3d68ab327d28ee0ccdcd2c2db07faf69e1babe3fbf3ba09c28b146eca7ab047b59294703", + "Expected": "00000000000000000000000000000000079f89f2defd1f97efe0ba1db28523abc88cdf66efd39918a600a07c5ed5b72ab9d3354a172735e7749b5f6814a48f4f0000000000000000000000000000000009e361b8609be8057e5b3c99eaa1727fdac17edc59239af17f55d72c8b8daa89726f4ae240c742ec4b02fbd89d45c46400000000000000000000000000000000121b475a2ab50357ce80fe01fc461195029de20f61474b0773d80434253adfc268a775e1a0e3b7df5e85d1ff8c5008960000000000000000000000000000000019a76aef4e04136b1ad0d03586a3d8608ac4573715f18d5fd6907d03e5fec7c5659e15c19fd87f242da972b651dff5fa", + "Name": "matter_g2_add_29", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000161c595d151a765c7dee03c9210414cdffab84b9078b4b98f9df09be5ec299b8f6322c692214f00ede97958f235c352b00000000000000000000000000000000106883e0937cb869e579b513bde8f61020fcf26be38f8b98eae3885cedec2e028970415fc653cf10e64727b7f6232e06000000000000000000000000000000000f351a82b733af31af453904874b7ca6252957a1ab51ec7f7b6fff85bbf3331f870a7e72a81594a9930859237e7a154d0000000000000000000000000000000012fcf20d1750901f2cfed64fd362f010ee64fafe9ddab406cc352b65829b929881a50514d53247d1cca7d6995d0bc9b200000000000000000000000000000000148b7dfc21521d79ff817c7a0305f1048851e283be13c07d5c04d28b571d48172838399ba539529e8d037ffd1f7295580000000000000000000000000000000003015abea326c15098f5205a8b2d3cd74d72dac59d60671ca6ef8c9c714ea61ffdacd46d1024b5b4f7e6b3b569fabaf20000000000000000000000000000000011f0c512fe7dc2dd8abdc1d22c2ecd2e7d1b84f8950ab90fc93bf54badf7bb9a9bad8c355d52a5efb110dca891e4cc3d0000000000000000000000000000000019774010814d1d94caf3ecda3ef4f5c5986e966eaf187c32a8a5a4a59452af0849690cf71338193f2d8435819160bcfb", + "Expected": "000000000000000000000000000000000383ab7a17cc57e239e874af3f1aaabba0e64625b848676712f05f56132dbbd1cadfabeb3fe1f461daba3f1720057ddd00000000000000000000000000000000096967e9b3747f1b8e344535eaa0c51e70bc77412bfaa2a7ce76f11f570c9febb8f4227316866a416a50436d098e6f9a000000000000000000000000000000001079452b7519a7b090d668d54c266335b1cdd1080ed867dd17a2476b11c2617da829bf740e51cb7dfd60d73ed02c0c6700000000000000000000000000000000015fc3a972e05cbd9014882cfe6f2f16d0291c403bf28b05056ac625e4f71dfb1295c85d73145ef554614e6eb2d5bf02", + "Name": "matter_g2_add_30", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000047f92d6306bed1cb840f58fd57b5b71a5df7f86dbfa55a36636cb495e08715cd57f2f3e7cd99a1efc28b1d684de1cb0000000000000000000000000000000000f4eb02d687a1a6105b4dbd740e2c7924689d558e6cbfee768dd303cc8dd0fd887f5eec24b54feccf00f473ca3f54ad000000000000000000000000000000000edad68c4d536912816cf6ef039c3dd0535dc52189583270b3b038e2c67b213d943bf384ce69c4a9dc526d7ef309f25a0000000000000000000000000000000006ff4a6b5129ef026d1d5704bf7fc0b474de92b5cf39722f165e73f4e7612d6d3bb40743e4b7b42d0dad5d5d6a2d4881000000000000000000000000000000000805892f21889cab3cfe62226eaff6a8d3586d4396692b379efc7e90b0eaad4c9afbdf0f56b30f0c07ae0bc4013343b30000000000000000000000000000000007853f0e75c8dee034c2444299da58c98f22de367a90550dbc635fb52c9a8f61ccc100f70f10208944e48d09507fdce100000000000000000000000000000000064afd6b3ef7ff7ec34f1fa330877b42958a46a7698c6d21adf73bfdfcab7793b312e21e5988652e655f2d42edb8a673000000000000000000000000000000000ea8a2217c3dbcc0f6e562de9cb2f334c896577d0b3a7108d96b1aba2d705dbf531e870d4023cec2c053345501324233", + "Expected": "0000000000000000000000000000000013f8cdab447ef9be450b87f941c96d4e93d5efd811d80c6a910965728f7dc496dec132f3fbeee5d1e84ed7c24ca9c2a8000000000000000000000000000000001537d5caa13ddfac93f0f86729c743d9a68175a78c730528b581fb54b1f4d020473b3b766e3882a485ce5d02ab381c33000000000000000000000000000000000b370903684ede24f3df80e3834ed414a765cdbad98f20c49bef8663a82a468d3911d6bbcdc021e22c252e83a857e55800000000000000000000000000000000100cc8d05f071904753776c6092a38db84c5de751bf93216131a0f9a50bf78a722344a14b3be2a9207568d1f669d208d", + "Name": "matter_g2_add_31", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000017b32e613cb38b41dcdf3c8bb9187d731546977fbffd79fa7f66e3d6aaf9e1af6eca2fcdc260c8f90818d7148ba2f4960000000000000000000000000000000007e4d26606a47c874c20e8480a9f5815e5b577bccd783b775d10309eeb3d2102c7a0abc3324679e44362f09e7a4ada67000000000000000000000000000000000cb6f12ac8b49cfa36b957591293c87b21af0a949c55a28a90ab0fce88fb5cb7645e20ab2edd284f0ad1377dd95ac10e0000000000000000000000000000000014c96b5dcbd3150eeaea5c2bc27750cf88b30a91933a3233a4d1d9b357a80cc20d135e43a344e718dff5c79045c31f860000000000000000000000000000000011798ea9c137acf6ef9483b489c0273d4f69296959922a352b079857953263372b8d339115f0576cfabedc185abf2086000000000000000000000000000000001498b1412f52b07a0e4f91cbf5e1852ea38fc111613523f1e61b97ebf1fd7fd2cdf36d7f73f1e33719c0b63d7bf66b8f0000000000000000000000000000000004c56d3ee9931f7582d7eebeb598d1be208e3b333ab976dc7bb271969fa1d6caf8f467eb7cbee4af5d30e5c66d00a4e2000000000000000000000000000000000de29857dae126c0acbe966da6f50342837ef5dd9994ad929d75814f6f33f77e5b33690945bf6e980031ddd90ebc76ce", + "Expected": "0000000000000000000000000000000003c5498b8c2d4765a270254dc927c6edf02acf0759540ddad951ea8c097bddb949ea0bf19942accd615bef21e8572dff0000000000000000000000000000000004c17bb648909bdddab4dd86560cb6b341e96f58c515ce471281f226181bded16b358b56d72e363f9ec491b8a9dcd92c000000000000000000000000000000001828973958204f8ab8cd13f5af5f3529f368a149bfe931a8002b61a61895457fbcb0cc6874631bb55799c884b998d8b9000000000000000000000000000000000f61460bf61bbf3ce38917850bfd3cece1e3955ce29d200c6f8aa89076c70919c02668678edc0bcf94efc9e9ff6a650e", + "Name": "matter_g2_add_32", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000001ca1141ba9542c56de8991b313c6ae42fcecb6751b0b81b8cb21ed70d5008f7ffe831766b89880a7fa6dfdb09a2cda3000000000000000000000000000000000e6766b17db165bba564ac63ab88d3f8f5eded07a40b48644e60d3223d30458e7dabe404cab8d6f9fe135712ef0b1a43000000000000000000000000000000000dda3e6c87382fa762510e5cac721fd2b654f002f5b9a3767a8c6d651ccc582e80e3f68d6913cda30f9f51ebcfc7c98600000000000000000000000000000000059a7dac5bb6b504f2bd603d486700fe22c14f25254537b2c9079c2b45d36c7ce56854c5699cc7649b533194f51a9045000000000000000000000000000000001755d8a095e087ca66f8a118e0d2c7d5e4d8427dda8fe3049080f4aff12a8746f8c2679c310f4be0d94c5bef0414a7a600000000000000000000000000000000069c84c6419ed5c0441975ee8410065a56c65f07a4b545ff596b657dc4620c7405fd4d092b281e272773d2281a6359a8000000000000000000000000000000000e751ccbd475fe7eda1c62df626c1d37e8ae6853cc9b2109beef3e8c6f26d41a5e4e0a91bbc3371c7ab6ba780b5db41600000000000000000000000000000000184097644c9b44d543ebc0934825610590cc9f8b17ed08e9c06592bf85591d2702b18cf48a70b378926057e541eb8ac5", + "Expected": "0000000000000000000000000000000002c6104b3494fdef86d53f87bea68d313188c0908b935fb3b9f636ccd401c6e9cbd33bfcdd437e1a0150d0e4b9c3a881000000000000000000000000000000000bdc88396f807d1ba8d4d6e284d008b5e40445ce32c23a0178824fdbb6db3c5aede7687eaa2f12249125cded57052ad2000000000000000000000000000000000c7004365c1d3027997b55bd258dfc61ae07a762666fba2a14aa2ca116673fc03a6f694c069f53cd915fef6d37513101000000000000000000000000000000000ec17688d8f53e2c92502091c859cef4fe9a57ae984cb1e72686bf1f0656b10246293cae4b96214a38dc76cf2709bd59", + "Name": "matter_g2_add_33", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000090f4b85961ce97cf7f99c342d3627105d790f611e19721a43d8a0febd67ae393d77a02b999108efb56f0397dac22703000000000000000000000000000000001112f23595d1613c47486eadc37f9b1ac3b3c3973b3fe964d3b67c3996fe2eacd9df5c287b0cea8e9475d146fabcf9e70000000000000000000000000000000018f46f7ba3c9af34c1025c2d460f0be966e68944928dbd55cc7fe00e5def598d80b0e3801e48a74963c974ab4727a52100000000000000000000000000000000096845338d5cd2ac44e097607d6a1a05c241eda1941991ae9edbba965d9029032c46da7218b5b2338e6c58898bc4a820000000000000000000000000000000000213e5d2d46523203ae07f36fdeb6c304fb86f552fb9adb566711c31262629efb0b1561585f85d2ac7be174682229bd8000000000000000000000000000000000b3336b5a4f7c0d16db9615e77bcdd55b7cb5b5c1591d835f34f5c1f1468e3cef954608667fb97a32e4595f43b845612000000000000000000000000000000001869606dde1688e5ae9f1c466c5897fce7794f3735234b5af1ad3617f0688529499bbdc9f0b911840a3d99fd9c49150d00000000000000000000000000000000001bfd33df4a6059608ada794e03d7456e78317145eb4d5677c00d482ac4cf470053d33583cf602feb67b6f972c99739", + "Expected": "000000000000000000000000000000000a44e6a48ea0a95667f607ee66290cb0094c964baed779bd6656941db28e30a7e9effe49a617be9ab376af4f535cc28f000000000000000000000000000000001933b87310bf5fa60b1abcd13bb7ac3f2ec0a278f6a0a70c953a2905ac1d3bc5a70cf1da885af45d1c7680bb4f7ff74c000000000000000000000000000000000597ce9f1bf7efacdcb0250427d0341e142226aaea060983175ea149912c5c4f3019fe87be6d87d186a8f562fc3059eb00000000000000000000000000000000198b5a891722a237a5e23e3004798c8d3f069af3267152508e283b4549fc5e8388330343f80e606eba30af51c99c7020", + "Name": "matter_g2_add_34", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000aafe45ea7cb8b450a51263eebc28c1ded662972bee512e24fddaf64f43b74b66032523b3b104a4e9f6b62394436c6710000000000000000000000000000000015cb27e1fedfba2d1679f78a388f90b22bbf3e7d090f0ba972fa8e72f6e31c446f628fff929953712ef6e425d16eba5c000000000000000000000000000000000df9931893cae713042bf722db6ce394b6f346587278a154c271d8511e690417eb6dc47efbcebb7c2fb9e77f1de9fde800000000000000000000000000000000106ffa395ef170c99bb5742428ae88fa4fd7a94476985c099e3b700b7403d083281fb71a19640c6bc2321e27bcb33fe20000000000000000000000000000000004ac6e6077d4eddd0e23f30cfd64b7aa1525c85424224e70c15d7535e02aea7a312ef24ba2dcf70b926acb851da2530c0000000000000000000000000000000006ad07d3e8f45cedfb4279913bf0a29e37604810463d6020b4fa8c8c4977d69cffaa33e1149706f04eb237194dcafa520000000000000000000000000000000002c536dd2f05f4a7eaa33fd884262b22a2ab2a88e7b63cb08ebb67fc0f143da7d6b18dd394c424161f7cf703acdc82f50000000000000000000000000000000002d1d9ff74e20ea9b03c478784f57e7a58a21ca2b1e552319f33305f367f5ae4daf8138505f953db4f86c0ec1d96d5f0", + "Expected": "00000000000000000000000000000000047c2ccda315b9c013e87bc9168b3b8dd6d463403f1cefd824fa9f93a99f4c4f98fac5f97e4237f76b1ec91042f99bd600000000000000000000000000000000036861fd0a69cbc851741475905441b51af12c5b2aaee6ce9a27a01a43db810be9c7d6fa401406e98e327703404b83a5000000000000000000000000000000000310cbdf53f6cf8d87e2d178869bee4359a8dd666986d869761a79963680a33ea3ecefd40a1e558acae5ded2ca04447300000000000000000000000000000000108bbb28c73ed7e76a51a78e4d15a2c88c25e05c7127ae89d4347cda00be231b5e70e0b0562caddd4a7083efa4516722", + "Name": "matter_g2_add_35", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000010b1f8b1c492a56936da905b8738affba6bd29ae5fffd40ba6b31325181d3b489a81b23dcb69f6e71bd29bfb388e5a8f00000000000000000000000000000000116a115303b4774da59844e457844232d088062d920db67b2a8450a194be7e5340ebd4d106454fd9a03c8f50dbb1e119000000000000000000000000000000000eb521edd61b38006cffc43ab72d395d669dec196846fa4d6d43521da6c2fc3bf0994ce7556a3cffec7751b3bc5703ff00000000000000000000000000000000073cea36eccaa1c78deefb6029903c2b6598301bdefa9759719c3b590fcc5a6a4d3d4d19f552b33f4a3126a6e6a84486000000000000000000000000000000001913ce14bcd1d7bbb47f8efd92d7ffd155ed1990a1dbf1ee7d5e6d592a92bcbec6e865199362950afd6c8fc49b3e10a400000000000000000000000000000000020df729079e76cf06f84e3355e683e093dafad38c2ba92cf7a9faa0515f2f44d814f971046ea20116cc4b0014d7ec350000000000000000000000000000000018db123e05404eea8707f9356f417c3966312b9e41765a6fd8449879ddc4c9850c38434481b235a5bc35db1b8ee86d43000000000000000000000000000000000b4162715717e9065a3849a9294cfe39b351e57ab5a6790f3e725ad9fbf0e4b9d6a3554e872af9c37df33bb896dada5c", + "Expected": "00000000000000000000000000000000137d23ed3fa0d7e5928af8d1f4bdfdef08e0b4c0f3bf6f51ed28960ce9805eb8fb254233bb18cbfecbadba95e112fdb80000000000000000000000000000000018615147d7a8cce1dfed6de25cf2fb52f54a243bed4913e20e66673f47ecddad9c5e4ff9653f522180de4b90ddb3ad17000000000000000000000000000000001521f12116b13f785b5211aaf438aa6668bbfa318cf0ed6d91aae963f6f00d32cc5f25d3a02bd902ccc25f847ee2db830000000000000000000000000000000014263b23396f4facdacf13c79864157823db724350bc640abf8fb6d62663cec1069eef9db56817660510e2417b51c616", + "Name": "matter_g2_add_36", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000e3925fa085db73c1e67b29ae90f8773f83be5ec684402e8e2360ffee8a8368911e584843e42b0d470de78591df6ea6300000000000000000000000000000000075c7efdeeb16609b4a47ea442af4d75238fb7534fd96cb236a7886809d6adc2b62c8ff72bdb041bc51c1a71b68219e300000000000000000000000000000000088b4eb0dd185e51b737d797334590e982b7b0a5f109fc7d0524b2465c2c0457964eba5a6d2d4d99fb628f21f15a776c000000000000000000000000000000000fc79f6b38f3356972669290eeadcd992a22bc1191606b663a1e148aa58db3938f0fc65e536bc5811c50d9c7f03d3e370000000000000000000000000000000008be924b49e05c45419e328340f1cbcdd3350bacf832a372417d8331c942df200493a3f7f2e46ad2cdaf3544cfd8cd8600000000000000000000000000000000028cd100457f4e930fc0f55996a6b588c5361816bb853d1f522806e5ec1c455eb200343476feeb07ca77e961fc2adc1f000000000000000000000000000000000f6adad0a3bab3610165be2fadb1b020f25488a0af3d418b7d7cf1165812e17aefcbc23308ebcd31d22ba4ca5773dd87000000000000000000000000000000001657ff792e3d89d5d35767bd0cc788411b0420665a5e0704f4d2399b9d9a5ad3c027ee030fdf495e5a6e2a4c69d05712", + "Expected": "000000000000000000000000000000000038f9df6c14f84b8ef8045010c8973e5c2f8d2e37268f6a674298de7b15cae82361ebbfaa00ea1cb2653c5d00886b45000000000000000000000000000000001376f7e2d5621aa9d6f7ce45ed11de7e0e1095ebeea976f78eb83189c6852ee199840c14059c233bc3d40efbeeb5eb36000000000000000000000000000000000c7b0e53adf4f0fc5172f903e3fc479539348241edc3e277f30ae6b4fc419aadcfb73a8f8a09a1ae1dd885a6250de0040000000000000000000000000000000007a00b57ecc8b056436ecacd7e0fd346b906b15042e9a700f54f8c3b1d251c566e0c55bd34f7a9e30f1566b7f2ab16dd", + "Name": "matter_g2_add_37", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000b87c47605fc060a8e3677e84ce9d14b9309360a13c80d040c625fbf0108f829300cc1fca409a0f9c96311cd4a9a21e60000000000000000000000000000000014c4088f1e7935cf6a1d2475b84497ce6a250ee2c0c991fe51a2f2836388a354824b02d9cf215328dfce3f546713e21100000000000000000000000000000000120e59be3ecf35674eac6cdc559599b273f13f28a529770fa156f8e519734c451eefb35023639f32049cd19ea0d945a3000000000000000000000000000000000f97755b62a8cb8f861ea02c77819f0b58181aecf612d92180ba9b475f0b4888b922c57f6a1c619dd5514620a1cfd9e2000000000000000000000000000000000a5048d860b997a9fb352e58284ebbc026622d9be73de79b2807a0c9b431f41f379c255a2db0dd67413c18217cb21b7200000000000000000000000000000000045a701a3f46ca801c02a5419c836b2ab3d74ebd6f4fd1e7dddb1965b49c9a278f6e89950e7c35ebc6724569d34e364c0000000000000000000000000000000004cb55008ccb5b2b8ece69fac7283f5a9ef9e622e2a0e42bed5bdd77faa550882643afc1759b1a327c4f2277e13a3d4f000000000000000000000000000000001690dee40c6c824dc2588fc47dbf93f68ac250b9357e1112db72ded905ed7b101b5f877bdc42d56afb5b6202403a91c4", + "Expected": "0000000000000000000000000000000012662e19e41bfacc0c792f5183596bc7f1986f9bea72c626e187d72111b6ef3f36f5afeeb640cfda99b7044c0d0b846900000000000000000000000000000000050ba08e1b9fe95dc67e6ee1ce60664b291c80fdb59729cdea75dfd18f22fb88f837b439fd119c46c996787d3008194b0000000000000000000000000000000004ea0f488fece967675abdd3c42f8fec25b547cfc45d42fba14bbc55ad7e1a75296a679113d0671cef0aec0c2165f4a0000000000000000000000000000000000f617f51800b09150a7560505079c785ab45cea4705992fc0325edaf4ceb30e1f0bec35a31898db5f810685e55634076", + "Name": "matter_g2_add_38", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000005860cfb6be6720118623d2d8ba05e686df22744b948421dd3cc1b1691e00d9b5d00d00195b4acf7a7b043f764f3f1c70000000000000000000000000000000012632a3313dd611e8d969bddd556c2d79ff387603462ac78ded3a842981697bdac34ee6f1f4744ed2ff16100874ac24000000000000000000000000000000000112b94c317586e343acadeca611c485c3ea172bc10dd39158c1e678007130062a921b53826d7be6286963ff822f1066c00000000000000000000000000000000040de8c0dadd2a6c2a7ea0fa43e1a5f2f5a6be3fcb0de6875d8cef1ee2daad87125d12f6869c4dd3d931b296f1df2fb300000000000000000000000000000000153cec9690a6420a10e5a5a8ca46fd9d9f90e2a139886a07b375eeecce9083a5f5418e6baf64ef0f34176e432bc5343a000000000000000000000000000000000d87c1f37f83ae78a51af9c420e2584a64337d2d2dd8dc3b64f252c521901924e5eec1d9899594db5e64c93c7a01ef020000000000000000000000000000000017078538092ace26cc88b94360871fc9a6bb9992172158ef3a16467919955083accf8d55d48c7ec462a743dbbca7b448000000000000000000000000000000000289b703157a02fc1d687a5aa595495be8bbb3eb0d70554728255a44b7820e0ee82d984d5493c800f1d9d8ca0c9381dc", + "Expected": "0000000000000000000000000000000019c774e968049bde2188e844c3413203bfe2c4355edc8cbc2cf6f977c34c0a42a206194e6eecba3c97b24558048f3aa700000000000000000000000000000000081ccf6f111575a946341759b9faa13f3608998fbf4ea3b547804737e30fc7e33495caaf2aa328b19bd48315c5c7f9e2000000000000000000000000000000000a4098536041cfb808176c7cd8e980eda613a2b390e8d63d607caaac26db02fccad6d87412b90cb4b3e186bf9ccd31be000000000000000000000000000000000d3c784c6587b9f786c06099a62aa639f40535b512ac2440912f04dfcd1cb5851b7378f381fcdf02d4e58312eb7e442f", + "Name": "matter_g2_add_39", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000006fcd2c4fe848e9462ba1112baad39031c210952adbdd06293a622ffe2d1c6e4fcc8773ec8913717018b97bcb9a554fd00000000000000000000000000000000130a97442f3273b7b35464545e7351faf71ead9b8996c63889a45945ed82bba29bff5014776c6185219a5234d8475c92000000000000000000000000000000000491d571bac5487b866022a0714be11b38bfb296233845cc434a50be1d35f516b8c6b046fe3d0a8f4f95ac20eddea01b0000000000000000000000000000000017e34b04e6fdf152c848f2432b7bd84b3dba3915f06eb77efb8035750aca9d89e92e1d1bc4871105c440d639e8d8b05500000000000000000000000000000000057f975064a29ba6ad20d6e6d97a15bd314d6cd419948d974a16923d52b38b9203f95937a0a0493a693099e4fa17ea540000000000000000000000000000000014396ce4abfc32945a6b2b0eb4896a6b19a041d4eae320ba18507ec3828964e56719fffaa47e57ea4a2e3bd1a149b6b600000000000000000000000000000000048b3e4ba3e2d1e0dbf5955101cf038dc22e87b0855a57b631ef119d1bd19d56c38a1d72376284c8598e866b6dba37530000000000000000000000000000000007c0b98cda33be53cf4ef29d0500ff5e7a3c2df6f83dfc1c36211d7f9c696b77dfa6571169cf7935d2fb5a6463cceac6", + "Expected": "0000000000000000000000000000000016fc7c743c5ba747640a6494fb3c30caad5a1e9719a1994d0ca73bd1645fec118a2887acc8876d105102241c10274cd300000000000000000000000000000000058a42a0095a7388fba7ce71dbef4ecfd2018c3fcdde14afd2be26588de4689d8de757e1e3ff22645fb8c17aa60265850000000000000000000000000000000010bb622f649e346834b95e82f93ae83c71c0a65df7842c4ba88df7f6eccb0217ca9377167a6d14777e0474c24821f8d70000000000000000000000000000000010c180c685ea3d0146eb82c007fec3efd129880f18f838f1cd2f80181f5a4884d6b5cc8247430fb0c1701a57f9d1d485", + "Name": "matter_g2_add_40", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000f1b8df4e8fdfe32eaf227f5af9f2befc85073468f10b81d32d0e126fe2b0cc8e8adb8afcac73213b6ed95e8e843b97c00000000000000000000000000000000004e3fb435ae0fb2d8bd091f250aefe5922b353a64e16abd75627737f3bc56639f8b40652cae69c73ff1969925b0afdf000000000000000000000000000000001003aed7cfb00efce49d6b1a8eba27df87479a4d37bd7fda6121549483b669a1a761204b0dd28262bf27e5c8e180540f00000000000000000000000000000000114fbca7caf782b3296d0b26b4c362bf50acaecb8bc5726b2c99f904ec3d092d5d40991d0d30c8e79fddaa45f04a75d3000000000000000000000000000000000b6069a2c375471d34029d2a776e56b86b0210c35d3eb530bf116205b70995e4929fc90349a7db057168dbe6c39857970000000000000000000000000000000014251a0a154731f73513b99d830f70b6fc4bcf05d11f52d2cbe9795ee8ffc5a5f717ad25770b8ecad6d0e9f8066e0cba000000000000000000000000000000001172684b21c4dfe02a55e13b57bbf105c954daec849d4c6df5276b02872c004fdf09d24f4eef366bc82eb72fe91bf70d000000000000000000000000000000001151aeb9441c5a8fabe80867b5c791420645241eae1400bbcc064d75bedd39de2ef585138fe9f65725efa1b1e5888d03", + "Expected": "0000000000000000000000000000000019419b635c3742cecffee02ee7e2b1f18ee9ff15e647ca0abc4398ddc421ae7e0444e3c1ec377def9e832d8e64fd40e2000000000000000000000000000000000d9b4abfdaf3b4c7bf00fa07579befa10a3418d8fa0f3a9c31e59ae48b0de50fc8e6d583aaa4d0fe6048bdd1a9c60eb60000000000000000000000000000000003c96d57034ec97c4abef1c2c81f4d4b0f4b6eb1e9dc5464bcab28572555b9b874df80325941501c3766fd7e06bfe7360000000000000000000000000000000002dbb3d72385b562ddcb9a80400ab3770f00d22b880cce2fce1641042b9da669b22b2fbc97617648c25ab644e661e2fe", + "Name": "matter_g2_add_41", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000017faf481fd4cb0c373d21d7caad40e93d9a86e62d26136892fbcc6f6e48205543aff00c45e82fdd1d3e0e733de91e7000000000000000000000000000000000012e14fcb9ad4d9d15347cf004745ed4bd92097eeeb41c4cbcb728a234616363589d8f5ad4cbb61d31a8aa27627723c7e000000000000000000000000000000001513dad1ff27e053902e779e35d04cab648939317830144ea775c435a4b55e13fa2fef03a1256abf5c187487c25a774f00000000000000000000000000000000139da29de8587c7d0ca9237c37a116387385e9cea453b9e2003a37ede7aa0a3f4c1df55255897f5975b662be33622dbc00000000000000000000000000000000161b70d0f384e589d8117938602f3d696f941c24e3c1ca5a9be090b670456c9df315d6fde52daed55c9d8335928a7a3c00000000000000000000000000000000186bb9e6f5ba70dd2c66a641d3b711844977939904c59946d4e9f49ac2d8c00890a43ccb20d4a62bfff63ce4a0a44e8e000000000000000000000000000000001995b9d697bded656236430e78726f0f6ef963db9a5a24d455c12db38aeab0f8629e5dc2d04920156f2a057d69613096000000000000000000000000000000001119b13caf82c18fadcb65c9c166914bfd822534bb9def3feae6c9e572c97c84e97fab3b345cf59358436a404075493d", + "Expected": "000000000000000000000000000000000d32b00154a5fe75c576c098419744ac36b911ee800f94bd598ff9b6adcaa39c836bc158c5d6af72c9e715a242d0fe710000000000000000000000000000000006e057c13885d6c05f5d92061fdc4d532f10d31d472c371e71367fef7c5fdd3741e665321d1119b895660fba3770431b000000000000000000000000000000000bfe695c3364e15479741e974f838649e789a76d073e552aaa60981fbc6d185eb7b297fd59e51535965214a02f5cd67e0000000000000000000000000000000014f0a27412248e3163e5f82fed02a25d953b336b0201692f08a3e8e9a9d223b736c70c1a39826a0888fb02a314e223fd", + "Name": "matter_g2_add_42", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000c118b147ee3489f30c6ecc0256a314ab674110588e8b69ca6d265fc270c3e5b767817f861140cca5d7c6be4012d1ffe0000000000000000000000000000000014800790654726959fd876b035bade0da744fb36ee5b304f228663a531345120267c55ac19fd66022752010e5bea7cb30000000000000000000000000000000000193ab7ac2f151750356b6e178557460c9c2672b1736d19a20e3fa28082479ca60021aa68edf2524f1aa826ee70b65a0000000000000000000000000000000015cee9ac55ab45abbc57d0ea6ec9ee49f6c59f6b94f99589dbc08ee877d3a261ad77f5473fedd72ed7206647eeafb6ea0000000000000000000000000000000017d1ffcad218efd8b09c68eba34dbbc30b0a62ae250368ee37e5f6fd40479b8580563416afdbd92c0622c341331e20a30000000000000000000000000000000009f0eb3805ed78aa3952a0a437966258ed38cb72912756253a7a2f9113f0dd9a4e187062b0423e0587d93e904d88f50d0000000000000000000000000000000001bca57e985906695e14882f2aaeef75de5009e8717eb59962e978aa11e9d0a4d9a9e203df774cb1e993b1c6ecd6048c000000000000000000000000000000000695b11cc32740c91546eb7d554ca8b1f3afc942ad977345031be8b94b78b57a87ab049ca2d3676e039efccbf24d0c47", + "Expected": "000000000000000000000000000000001566022247ce012b7de92c8495876b4de91c36448f4f7e00f6e154185d38a735e701dda989ae9e37d332a5e60af5d06b00000000000000000000000000000000065aa42560df7990df2098827a55ceaabf3ec592c53d2f20e5dddc1481ee64381accbc8e58601428d33589b3af78a4b70000000000000000000000000000000002d9b0cf8bfd1adf76bca80ca351a4340f02434090518807e07ed76440497042f13a0cd7a9c30086872d6f145808fb290000000000000000000000000000000015daaa131431e3e78a6221091640811fcf88c835ac975a041a7ab50bc1d06b80e6a3c9ae77d2390fd14cc9bb009b47cc", + "Name": "matter_g2_add_43", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000ef203fab794a0ef29eb2ebf00076134e5932e27c99d6d445695b9df2afe7563602e318caf5d44724a21790ca0ab0d180000000000000000000000000000000013b9b1b1d3e98b61b0f1a0ef3a1a4ceed57b6c01849a4ad66a86332b3d27022cfccadd3567e6709d2de5b23b23dba43f000000000000000000000000000000000c1fbace49684f4be32ef6178ac3a95ea3f50b11494340fb73dc5391d50bcacafb3bf0f2631fea9c4ec47327d644489500000000000000000000000000000000040f82812855aa3e3aaba826d5810c1049cf44e86e44e23cc6da437971b529d2f2676c73e1fb9da52640c981fbd710be000000000000000000000000000000000546a0cb9d9f1ef9ec4a1e576fa0047557a56c0217baed8691c4085b88c84a0e12d44043aab8671393d02c4a764407ee00000000000000000000000000000000131884c1386980a181353548da9602db70ab495a661e76235c4b0a32b54acb0dfd8846e17bebd731e8041c4aebb8776600000000000000000000000000000000135b3db43511dbd8b3bd5a91880d6da1a2bd1383000e0d6f0a521bf88a5836a3b5f7cb9c0c02aa861a1c2d339f3c11f20000000000000000000000000000000000e1337271bd3302a1cab762161ccfbf2a18b7800e6efe58cf897d4adbfe4cb3bf14f4b59307fffc548179bda70c18bf", + "Expected": "000000000000000000000000000000001290bff629c93d992ad2cc709317c48980b0e56a32fe239258c7aec75e4523e0bc0b81319e100d10568a44847869a8d000000000000000000000000000000000055d9098e08eabdf2b883df35efebec9f6afb16d651ebaca1067e2129146268664ec51c8a4f28f13a250f3e9883053780000000000000000000000000000000002424dab6f0d18ea8bdded2a72bcf87c13307d27d53e8ec35e91eeab97fcf3398135fd436c530c609fd47a3508472bad000000000000000000000000000000000b25d0db1e28b98d4f9d3c77c0b71489c51186105d93be7fc2cf8c72b8abd8959340114635e705e698b0f257855ea4bc", + "Name": "matter_g2_add_44", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000060d7a718dd02b147c265f71eb136d1f31781b12a41866b4f86d7374b93dd10058c192cc0fba928373b1526e1a5d7d7f000000000000000000000000000000000cf29275373c0573ef22bf87919faf5444847203c7dc6d2e18986152cc294be04a5b1a4b0536797158113a15276c4fc6000000000000000000000000000000001016d5b9d4d200d7b4b7cc3836b85d6697fe14db350badba9978c7b56983dd1a7e572640ee0372b0a4e2079ff4c1abf2000000000000000000000000000000000f2768d104d895473ddf8c6b3cd0e7c22458d0037eca6365c766879a07c95037ee0de00d32c974d767080935abbe0be100000000000000000000000000000000113dc3354146ca79eb103b31b61fe8bc6f33dcb9c59a7c39d989bd9411c1afce4239034f84e6b00a084be061c73e69c0000000000000000000000000000000000ae33bf68f24978c7ea9fc58d8d76047ec45d01fdbc880e6a5ba02a22a49a3a8253afe0678ecfa6013f4849da3401df70000000000000000000000000000000012c5b00376a1dd31378ec44f2dc8e321e17185d903cfc5c15345a01c33f2f151b21b938d31816550594a7a1e7216c5b00000000000000000000000000000000013d79f825c44775c68e90932d0496a5cae53f04a1edb19f8abeb5948a3dd325dfec4a8b6f58c7fbca9cf3c09b909d8b2", + "Expected": "000000000000000000000000000000000cb2998b4e634bc83b5585b0683b7b561f260eefb826719bdc3c95e8ae51f8f7b442d75d69e0f9228dacde2ce80ef4e60000000000000000000000000000000014d30d1c02122143868ea01b454a4f33432d875f8ba66e6bb1e02fc161bb5f9298e673339a9183a15759f8b94b519cad000000000000000000000000000000001068bf3c768e8c9e9058805050394ea820b5f60bea6d271f8e1fb665d3b7931ab0cc03dff4cbd24577b2c254a956e8200000000000000000000000000000000008b7f4148bd1f4926d2a84497b60a48701057ea08855bb9a2f838d2464e66360a59d058d9072f1416023cc72045af558", + "Name": "matter_g2_add_45", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000017b9ca4349fecaa43ce911c0b256680edb8a0906ef5460fc4d2004579336df1e19560fe960a7a7cd74bb6e8272e08960000000000000000000000000000000000d5b96dae738db59cc67a51c61bec6deaeefaaa51e3259243fa4b142ef59676231229ae386ce699fbe18c4c00bf9d49400000000000000000000000000000000111b79f4b68dad16550a13334d09dc38336a75a5da23a17b5064e2d591aa3dab4c2e982a9f730a7633070504663a24610000000000000000000000000000000018f6d3616a7eaf17c805a88c9710039644d01b61aefebf76717ddcda6f4bb34aa15702de1e92bdb27b27f3409638da900000000000000000000000000000000006ccaf6c08f831be9c99a97714f5257a985cc2a29b5f5c81bc8d794dd0d8d1a41eb5413bed654c0140dbacfd0dda9e1800000000000000000000000000000000144e9cf91580800dfaa47c98ff7d002a576be76d9e44ae1f8335a3f733e1162af0636372e143174d872c7ea89f4c743900000000000000000000000000000000101e143b838c8a3f5f80fb1412081091b875230f1e2f9cf374d4bcd595392f6daa9552dbb6d5834e27b1b3dafe061ed300000000000000000000000000000000072463400b3e875395a1cdd31d73d51396e34347cd86d9f6f43f42253b3cdb24b89ed7434b1522af95ba1ee2d29ed1bb", + "Expected": "000000000000000000000000000000000a7843a1d67360b8a6976aeda2e4e98f1ea229a4d84b947dcf5ed8215173d5cf783920a7714f5b048778df30f01a0bed00000000000000000000000000000000035663ceafda9e5bfe934cff725b36b258f12afe749f907a560a06da4abf8380853f8de31adf14d62cdb310d8740e29b000000000000000000000000000000000f210d576aa5d4cdf5aefd8e55be099c422debc217ddf0151b8801f7d16456c97d1e134b40e6d71d296ee2518e50af9d000000000000000000000000000000000219efb35c68540c6bb0ef224e68dae6f7d48425c2908440072f5f63eec3c8e750b559c73e33464d0b5cdabb50fc4d3d", + "Name": "matter_g2_add_46", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000aeb5c087644595d0912879f61959d2731ff55260c682ed2bc5fc55c13964ef7c1f70aeb55876d2264d558c31371ca69000000000000000000000000000000000e173848f4570525b03a2b2c86f4dcdb8b28dd6d18c1354cad31028eb1b8b44432c2346edaace093e3954c7fa6d338a4000000000000000000000000000000001949b0902506d111ef6318edcd7a58ca4d69f5804a028aee73c3786cb2db168c6a73b77194f7a021ae6ae43ac78ade340000000000000000000000000000000017c5e28ba6103d97e2f3d3611c0c78f06406e0da8a49ae29c7d460b52f75136920784cd500aa3593858b877697eb8424000000000000000000000000000000001354146aa546754e10ada6e0fe98f04f5f3a3f8a8350d0295e02b8e9c80735b04c3061412e08ddb13c80ac36e5638e540000000000000000000000000000000012ab26513534b4dc1b71eec46b73199c4157ba9369e66fbe4d2d8f62237fc7c6fad31854ebd878f989b8c5cf35c7cfe0000000000000000000000000000000000eb731bc99cdadf7f2280385c7e17d72d34bcbdbdc725d5bc94e841036115e8cb95df08084221696f9be479821fbdd7400000000000000000000000000000000143ba7d3f66445249d9a81a6949f24ff40e7c4d270fa044a8b80200a4369b07806c5497a0ef9e9dbb87b9e63694623ee", + "Expected": "000000000000000000000000000000000ce704e650605f747cbc0bc76e82de8569ba7b3d897eac2bf5f79aba17ef4c989731e959c0bc0b7988000a9b0aef39430000000000000000000000000000000003cd3f3d978d6c85d98812ea0e3d21149bf4151ad1bef966ced124ad62dc7cde55f16e8d08bb1ad54d3a23bb73795d8f0000000000000000000000000000000019d37a20fcf6244c2898b271535e3b8f279eaac5d8fb1ba142096da383488eba28a21d038d7a9d3f9e8a008d6d3ee1d20000000000000000000000000000000001ba9c1720a4ef07ec752efa1ddb629505b3586af415c916fb0ed2953cd8943d9343268f438db860f0bced3e690a66b0", + "Name": "matter_g2_add_47", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000d4f09acd5f362e0a516d4c13c5e2f504d9bd49fdfb6d8b7a7ab35a02c391c8112b03270d5d9eefe9b659dd27601d18f000000000000000000000000000000000fd489cb75945f3b5ebb1c0e326d59602934c8f78fe9294a8877e7aeb95de5addde0cb7ab53674df8b2cfbb036b30b9900000000000000000000000000000000055dbc4eca768714e098bbe9c71cf54b40f51c26e95808ee79225a87fb6fa1415178db47f02d856fea56a752d185f86b000000000000000000000000000000001239b7640f416eb6e921fe47f7501d504fadc190d9cf4e89ae2b717276739a2f4ee9f637c35e23c480df029fd8d247c70000000000000000000000000000000013a3de1d25380c44ca06321151e89ca22210926c1cd4e3c1a9c3aa6c709ab5fdd00f8df19243ce058bc753ccf03424ed000000000000000000000000000000001657dbebf712cbda6f15d1d387c87b3fb9b386d5d754135049728a2a856ba2944c741024131a93c78655fdb7bfe3c80300000000000000000000000000000000068edef3169c58920509ed4e7069229bd8038a45d2ce5773451cc18b396d2838c9539ecb52298a27eebd714afacb907c0000000000000000000000000000000004c5346765a62f2d2e700aadccf747acb3322c250435ce2cf358c08f1e286427cabace052327c4b30135c8482c5c0eb9", + "Expected": "00000000000000000000000000000000160d8b4bef36fc3d09af09dcc8357067c22e421f3811deea66faec42a2f00fa4aceca8725cf99062613126a9fd7bf7210000000000000000000000000000000004e8691a42c8f3ce0e7c0470446689e9d2b3cf57d55fad7387d624857f977cb9c6864c87bb4b6a2c17538478ac5fb5960000000000000000000000000000000015e20f6baef033efbd38081d5a10eeb3c67d89ebe5cd652110b778313c9e86cffb45231616d5b67e9ec8b7be15980aa9000000000000000000000000000000000af75dc221050256015fecc2bd8113b42afc9c624e5d28d7ff8312af499e34a603d66a4304f263729b440b6266538316", + "Name": "matter_g2_add_48", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000f20a07526a082e88630a0256d134a8a5e8ada07b1cead39ee838dcbb30904e9016107fcbdf1f8ba182308dbe0b043d20000000000000000000000000000000014fb7732f67abf60c03ac902577532d0acadb5f3db0d6397a42ba693526ad74f2c61a0195bdc9704aaaf12e65aa6d88b000000000000000000000000000000000018cec4fb81c85d304588d11f8b9c51f5a053df11463e5812a1b2e6c7144522ba36bb91adf219892d0007cee470032e000000000000000000000000000000000b8e52d958a12a9037e8be9bc0d5045cade2d6ea05c6e68462b3a30b5d4ea34e5fbad173761e4e216b2e6958c8983b28000000000000000000000000000000000dd75b4aebed3bd6bd020c3af671aaed67bf1582aceb6c8b5a476968c0c500753e4d0f3276341b79d87af38850893d92000000000000000000000000000000000e9b3be06afd6157eb6df52be4f2db2bcccd650f720661f8d6fcff3f71d69e152e17100ce60b7b90a7f798c4cdd02209000000000000000000000000000000000f6fdc4e5dceb555c9eb4c912fedbfb3cb1b842345f73ded02cfaf8d397c4378809721094aa4a4113a368e0787effeb500000000000000000000000000000000143ac06258c579c11c05569669a2a10babc63ecc86f85c91791d8ea48af700a2067c5f13d2700b8d5cf59bcca8fbf7c6", + "Expected": "0000000000000000000000000000000013edd8f016f6af49e9bc461ca14c438a32eaa3d1270a5acec99a666aba3f0a7e7eccea81720971cf4432bfa94cd18392000000000000000000000000000000000dbea5617e44c82da828844a5a4a1426d43422fd0158204a99f53cf9821f82f0bb0130a2123297a6941f695e172d9c5e0000000000000000000000000000000005f65a445e9f2d57dff2b210209f9faeb1c8b446454de4724d990aab20bd68362dd7ceb5b95de361c129855abba83f7e000000000000000000000000000000001219ecae79d62d3039e642369353993b1ece049331f06be256f06b01a1c3b0c617221c8d8f0bf4b6a0abe1191a3ee8e2", + "Name": "matter_g2_add_49", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001468cb35a60898ed129f30c261b8431df6a154c250ec16d85a22f8717593b2c21853d123da86d977a7938c5ed74ef23500000000000000000000000000000000011f4e28e31b5f9e6877192a5e632d8c1ed7ca0c42e6e9902ca68f1c2de0f648c6064436012c5c7b14bb8d1078e02f2c000000000000000000000000000000000b25114b2697ca7eb1e6effdd1054893a188fd382d387ec098f846c1137a9b9baad01653b963a0b0bf3cb50c3ce3563d000000000000000000000000000000000c1d241cb03e642c1752b1e1886472477c19a2801ec032dc220c3243952f882094119bb92b621b654b766bc900d2d4f7000000000000000000000000000000000057bbf62cdf3c56e146f60f8ce6b6bdebe7aae7d9410c6902c7a505b589ae26ce3ab67d9b8da047185f9d37ab27595e000000000000000000000000000000000843e55c07bba3573592d3f649938654a5c51f9ced0f92bcb3e4f431141fe91a1de3695324b21e31dd2ae0a328055cc500000000000000000000000000000000192f3e8ae2588f9223de77f5e872115f1edec96d6a0f403a47879410c2562e79853c9a706e423b83fbf3154234edb6f80000000000000000000000000000000015084258d58fd1a07bbdb2e90df5a56ae15a787037eff4fe55f660e45f04820c6fc8982303b5e82074cf0cdcbde61307", + "Expected": "00000000000000000000000000000000158da32df45fe3e9102010bfd7faf3fde936bb8e52f68262ef479ee825a0d7169ff753aa042883a5403103a9bdafd2be000000000000000000000000000000001800a5776a47f52d2af08144364a6cd7442a0e2fc214a2d8d285a29bb7bd3a0293e89f0a1856223a527100d0abf12899000000000000000000000000000000000a6079d18ff3367c47fa61a57a967b782f3529bee93f452ecebd4f5c404b3e1769c100da9b8aee4258b5191ae1dad9a90000000000000000000000000000000011d3188a927e8f13aecf7f8637be6ddbbce309393a94fef77923c286244f8531d3e137e031d8c1af829891425afd53a3", + "Name": "matter_g2_add_50", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000c80d4474390fa791ea5f2f16b41506d8ae13ee0993c8d31a07712687298ee7978a724999500c42400d2f788a5a36067000000000000000000000000000000000592705cc5a8875750a4e6ceb42aa3bef5593eda9e8212702a2e08ea70277a2a66526bc5237be33c8449301544da35e60000000000000000000000000000000000facabfbd15284c6433f17b0e6035d4fdd84d3ad2dd30a27d52809652ff6e7a684d7724697919100567ad0c3e1a26320000000000000000000000000000000006a0fc4e2af69ce15a356656f5d182a2cf213d76a6047a05a1a3375909d245f5316b91333d2141c0817438f0d87bb52d000000000000000000000000000000000bcec23e092111b38a2f7dc957cf455312ffd33528d084204314492440d29248cb5719346a4f7a490d17ba149e30de5200000000000000000000000000000000194605e5680cc80bd2685949efa3cce90d345b9151ba72f3adf226dd299c23464c4344a42b8834131a51a4156038585f000000000000000000000000000000000477b55bd7fff14e0d1807bfc21edb9481be01c12abb1460d78b1aafe42953730167e32e694c2ddfb0d442e8cea57d460000000000000000000000000000000004b884c6ea36f189dbc3c0e9cf88f08baf5d868579998f63b752e61fcce3cf2c901bb9b51959d3597c4ef53cff41fc26", + "Expected": "0000000000000000000000000000000019294d87be784f0f8fa29de80d45a697bcb694b32f3f6d7641d4b08d8a7ebdad0ef78ba5ccafd6b7f240e1cbde019c51000000000000000000000000000000000645f7851644e1e7e255d0b3dca769b987ec3ff2c9eda42cab65dc39be2f9858c31f307d59f6a2caf9dd932d873d2b08000000000000000000000000000000000e8e93f39ce05a11d40f3b52262980c79ecc52939dd02b94df3e5034a57061d040b0c8894189f4626f37bee485712dd00000000000000000000000000000000001e0b7c9c3d7456b2c0ad842083e9ce2a00da91cb1aaba371ff4b9370f0f2c08f4b53b8e5a3030c99b2957cbe5f9e967", + "Name": "matter_g2_add_51", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000003f629618e1fc3018bb836301ccdc59022f0a25cc9c5de6e4c31fa08feea525c83256235e4ec8364e77e5df478f5f62c000000000000000000000000000000001120d6af221ba6f4351bbee4c2c664a769adb17872646df2c408f70c99ea991ffced4eab50fa98be1bb9426915f125930000000000000000000000000000000015cd16b028ce3d58b10aeb84b783475d894ab3f0cfdf7104ebb4f3417a038107128f07518dce548271061cb8c97e88af0000000000000000000000000000000018379875b68bc26107f9a068e5034f29dc2ae7e8830f8e9ecddc53fe7991206646cda33d37b31a47a977b46be58d761800000000000000000000000000000000073341309b6fbabb18f3cf0842817905e9248db98b582dc0efb2b741a80cdbb13d0df4bce920f257996b95029891a36f0000000000000000000000000000000012d19e09dc254bd1e84afce75aa215c96dd38bcac3f6d4cf08d9e2e8d20345b7c534a0b14ffcdfd4fa3600730e2eeac800000000000000000000000000000000183b7b917aaaa94f0ea9959273ed4701102346be2a9d72531bd18fef908ecb0579a6ac10ed42a91f1147fc3a05b2e81900000000000000000000000000000000070983b1582a97d9797782e4f960a298aaa8ec509720495acdbf176d8ecb9ec9e041c2b5ed6b7dfb46fdeaae3fb34150", + "Expected": "00000000000000000000000000000000040f355021ba50c9a3b2b4267668ac8d76dd88991be984ab5bab9c96faed6dcc6e8eac78ed29cd6f7d687dd55cc5d5b70000000000000000000000000000000017853cf0a39332e3c7d75b08b2940d693ac7cfdac46719787c22b55a2ab1036d6f95b68075f1c585942843aa486f17bf0000000000000000000000000000000008696feb333417a7262e8976d1546b6d0a9d5970095485b18efcdee8993b16f42e6dbfdd08d30c45fe4af6a5e203de07000000000000000000000000000000000ec26926720243124ca505c0e04923f3cf5eeca2abfdaf4388960b87c6c1713fc54cdd1c825e2ea359cc67b3bebfa2f9", + "Name": "matter_g2_add_52", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000036570783711b381830e35878fbeb187b84884a9a0e88c38e84124515b470e6ac18157e1499026b27f4f731a961eaf330000000000000000000000000000000008382838c18d56c046a8db495babf8d14c915622d7917ebe10cf7da7ecb65f174cddb9e70d0262ada961b396c5511b410000000000000000000000000000000015f63ce982aa581dad5c71fc79251b7f6336c4e78a4a0f4cb6f87167cabd31cbec987d7af4f11dc6d693a0b0774864130000000000000000000000000000000015c001372fe0530a3f50fb8b30e75ff4b264d673e0448211d082c7a9018f583b4d01790019874596c59c68768cfa3e69000000000000000000000000000000000dca3b392f75583b5266a8def02bd66bf44f26b8a0a27aced57299756cffaf9e1af3538beb08b2a5939b745c8f016fee000000000000000000000000000000000d7feafc9ec0935d5b7be7cd5e2a3c57b667aba9fcc87fd5b8a585010be6958c4e7538a6d2a1f46c9641ff7b8598d74b0000000000000000000000000000000010f7bf9f6711ba723bb71a004a90109ee22be6643d56d410da18103ef44a1b3d50f10c4b94222c7f05fd3c28acbdc8ee00000000000000000000000000000000007af41f09e6d0adcb1935d6a93ea1f6156fa0157a63f265a3a7ceffe82f6635b8511e7e8f21e8f3be7a73513ff597b1", + "Expected": "000000000000000000000000000000000f3dd56c416db1c06fd27e18fb852c9e1662fed42005e253230a7a8f7c3e0b8ce637666e1d20952c219cd2068d6865f1000000000000000000000000000000000aff045afcbefcdcb5255805a86e8af3de881e5482188c487d15ad1b799cf551c1d48c7665028b05ceb2e82e15ea4ae5000000000000000000000000000000000e0e6ed04926aed1f8c6a4e13227bf2a99d9d6d349a9c86214373be693db702a0011b4423defdb7d842bcb6f722c70b100000000000000000000000000000000148b1af285c65b12eef498f1c9e57a673e7a3803088c56e32aaae13dad3977dda8d3e27809094f8d8ed607239610a1a6", + "Name": "matter_g2_add_53", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000074d78cdd35ea17a3013e2301fe9f80f2d20d270a25fdead37eed7697a52d152612543781763e6035fa5452ab12cce25000000000000000000000000000000000e572236e1c203a1c0f99e6ec978458c1a143a6a650eee27cfbe406bb2858fe5f30222f468d119703c2f442bc644ff3000000000000000000000000000000000125384343fe132e16a9fc15efe1b3a9e47289e0afc4b44d492e33a6216edbc96d66c1ca66944a8296e7695f27f414c5b00000000000000000000000000000000084c2cbf0d7c932c3098ded7c70d4411eed882feb0f79e0f7f1c31f5fccb6d53fb57de179c3ba5754bc5e532c3784df10000000000000000000000000000000019e05ccf064f7cdad9748d328170b3e4bcfa6787dbfa93011d16f6d031648faa10dbfb7cc4d7c884d75480c4c864bb75000000000000000000000000000000001999d5f54ee66b3c0dedf9f46450e0ed463fa9c6cd9e0db317a35ec6ce78efae9bea9b64e3b2aaf7f70fbcace71b075a0000000000000000000000000000000003a6cc74cc398f38d535b4341faa37c968daf2009c3f05ace1f938b33bbe4002d81d18d30c2c856b21afe7a22b83c37a000000000000000000000000000000000452d1b2da6392f9df1bfd35e4575c565333703b2f83f56e0a88a0c8195968c5321296b07f6750584e23597304a5472e", + "Expected": "000000000000000000000000000000001220b3da7e7d03823458bcdcee82db56957e5aec335e9b543ebb0f3cf4fe3cf6ecacb6198c886b9abbdaa42f528b4963000000000000000000000000000000000138233b166547e9e9ee9d11048e2d2579b2b111af5cab372d36159c4c45e28d836d733a1265e8833da64f461c0a32cd00000000000000000000000000000000005f860a0c72034f1a928501d9f549e5c2a9dc72670272fbf35a0b301025c0fc751d55ef6fc2c5bf7ff42df7693f3dca0000000000000000000000000000000012c73105adf97bc0dfec1f56153c57c6fdb9d68341f4397b72f5b6c667873ff7ed5cc841451b391e33290cec256395c7", + "Name": "matter_g2_add_54", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000004d46066439c3ac559cce863c58316883651023990180470d2efd06e443a7caf3a514b54f15ce6e850d32779215bcf4a0000000000000000000000000000000019ce904b6c9c3de59f7d5017f60f1978d60c564f94a0f1964c24c876d1139a7ffbeb6d0d4884bbfaf5f2f189af6904a50000000000000000000000000000000015f1989719e69be95f25dda9358fb98aae2819e0deb7e2d291e2c01e85ba26a9da421896c6b6e2ed20f609b533154694000000000000000000000000000000000b287cfcf1dd7c6d735c1358dff15393ddd6c82e7a33c5d8005c4234cdf823c76a4725fd74cad74b3ec51df67f09af0f0000000000000000000000000000000004506802747afd8777904c46ad9bf0b06859a1b395ca3474a93ca4151ca158d2fd41b3a21e0ce0bc950b3241256e10d800000000000000000000000000000000115f41d2c173c3c2c7ecdff1a4aaa3c2e67c803db7a588d6143fe913961eef743d8b1f9d32e3ef1fc0475f41572faf780000000000000000000000000000000007a9cf48dbe005c5c59b2c731cf4117e5fadc9cb2cd8f486f1ed58b2909092ee8f36d88b8f719db94715641b418ab4240000000000000000000000000000000004ba40d4766b91bf8da1cc2526f62791a1b5f6fc24ffc54b522dd30cde2d29a6a6f81e8429d518710843d43705f3b4e6", + "Expected": "00000000000000000000000000000000014933a0923416428b5fe5be7120bf399ab62ca091b07d03da3fd2ff080b9c411c3cda3bfef40c8450ae31c412dc5feb000000000000000000000000000000000214229a73780d4f260364649e9eb2ed751ad3f687a832a3738ca2cc81a3acf12757651e88c4bcd79239bc0b0c40e5a6000000000000000000000000000000000548f20fa375e578084e085ee71df5f8ddaec1db03a1415938d9521b5d9c914b5295835fc07263cdbf49d7802551156a00000000000000000000000000000000063ecd9efe55229a76fc848728e940183c23bf47363cb34c5a49837e6df8a5f0dc29d7108cd10ea08e82ccf017d246d1", + "Name": "matter_g2_add_55", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000006b37e2226957d639fcb0bcd6c20b3c7b8372e7347a14b970e01c67c1859fa97c754ce588d0f835ecc053549d963ab4000000000000000000000000000000000c6a5fae8be3a32e3f70a4202a1ab6d97183964b9f7b9a084c49922cd9e0e952b0bb66c5580f0e0c417e079493bcdb4e0000000000000000000000000000000017b6132f11adc0d5d693ae7f3a0f89f5779708083eba23e03b0c9265e4e60624e1fb6940e8ee49d31618fa6389b1b50b0000000000000000000000000000000000a45c5f6df71359648aecb6434bad1619c39f10e279a02b3cc9725d0256bcd126843fc9ed29cbe02a32cbbe79774a330000000000000000000000000000000019cc0ec24da141f27b38a53aef0b3d93c4c2b981c1b248014be277002d39d7bde66f6957a659a89adcd3477dfe4f897a000000000000000000000000000000000e4c01d7425e35be84e3cf806aa76a079cf4557732980f7e8f8ce9a879483e28f223694ed8dd45706e12272f4c7952820000000000000000000000000000000008ceb842a17953578013ceee519a28ef1b37f73e13564def5ffe08a64dc53aa680784e26138176c89269477ee003d16700000000000000000000000000000000159791b6f2c26ed611ca40bfbd2059c15cfec9d073a84254ad9b509ef786d62d17fdc67ab13092cf0b7b3482866f4c32", + "Expected": "0000000000000000000000000000000008a71a08d2c4e2ba3d8774dcb42d3e96c7f72d36fb3b880a4049b078d8257a7a9a51b0b34c093568baf4aa6de70e709d000000000000000000000000000000000daf83b5ad4b91b557982fc4b9b7dbed2998aa39fc4658ba671f5f27b3888dfec7602949cf626c9e6ef21171acb185600000000000000000000000000000000013a7ffca291d9ba8790ca0462c54c147aa22e03a2413b756f27583155932aee65060924e46db321b3fd6f22ff7f54041000000000000000000000000000000000289d7de10285285279aee024e52476fa6fca85550f7af183a161e395d72e1339b629c64127f96bc85858d80e73dcbe1", + "Name": "matter_g2_add_56", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000ffed009c78ba9af8cd33af7b7697ae4dff863bb92365055baedd2299b7f5b5e8abb84ed434f7223c3e309ca53c08aca0000000000000000000000000000000003b2370c837dd6291818efe7c9af62dd51295c418739ecc509d42c92e2c97d12a9fa582946e176e8153fc9a273140b2f0000000000000000000000000000000001e63438e8b4a0462cfdff64a281ab4a7f48d51b51325817139f8ee683484f8695f1defc0c3efcca81d5fbff06cf9c54000000000000000000000000000000000192fc391cdc1ed6ddbd317f2f366f2ce25ba27b8c0f09c733e7bc0c0697544399a3a4f1186d139a8f6399ffa88e89a6000000000000000000000000000000000040d03956c821010969a67c91a6546800c5aa7ac392b16a9895136c941f4ca9f378c55446161562feace3b5b65f3c4f000000000000000000000000000000000e4b299f9fb25caec655d21c390bdad3c1256ca29faa33466a13aaa6d86310106d95fc8d8a0409fbd228fd3be7965cdf000000000000000000000000000000001272c63693873e1dabe2c2739310f627d3d9b5bcaa615402c3849ffd8dfe72b40fea4a068064655f2c8f46f074e6518d0000000000000000000000000000000000161a8e5e1de10938e5bce241ae73d76173022127822d744b23e656095c28f2f8d142ceb48b72a1dbc36b6143f8af95", + "Expected": "000000000000000000000000000000000a4ed8d613cfe4f5dbda1d0c6812d0edee45ffc2667323c3828f8ce4ab55c119e92a82f2c3d06afe3adaa4aaccc18f8d000000000000000000000000000000000fe10c5e185f3f8ba81c93754132d76e05eb3543d8aaa8a2d0c98833ce5fa9e2b84420d6e3412e005cf89d11f5400a510000000000000000000000000000000004ac5f8cc614e3833b3b6dd9eee9ac29501002ba9054554314a4c516bfc8cec870995e811f7892811346574f3c58b2ec000000000000000000000000000000000a6bed54d8ed4ccb09211ae7773c604edc6ce51a05c9acc94e8167026906d387af681fb33a40e72e85cb076e072db7d9", + "Name": "matter_g2_add_57", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000002e105e0eaa418d58019a849b89accf665a94ffb0bdf308a11b99b521de7af8ddb150c0e3b2e9c54cf5456b6105bc81000000000000000000000000000000000691a3b3986fbe1c0ea22329364454f37f645d6abe9310e883b9191ce512347e074e18e28b88c2adcc76190a549b80b40000000000000000000000000000000003f3a37a763c8d0d99a3fe36923843a22cb0fa18ced48493b2510fc99afe5b7699bbaa6c2ecdad8aaf72969354f121a1000000000000000000000000000000000f4bbae00205f54eb10c83d928d908fbae342b76050e33c51b6e282e02b3c1f132a4728dee4ea95455c25fdfc112f254000000000000000000000000000000000b50dc0957eccf5ad941b148a3824e82464bb7345a05125a0aa64f6ba34e34e767d4f679e9916faaacf82b3c79c9bddc00000000000000000000000000000000087152b3cb0db88776a7144fbafc1b210d150b637ca7148e3df600989231bce613fcf8e310fcc53aa2dc934bcbf86a220000000000000000000000000000000018a236ea02b1971d6e193a6eb92e1298956679d86864042fb6a0c36dd91c0e385944d779dedd0149fa8a1b3d6a07949d00000000000000000000000000000000048eac7d116b5a7906bce070e2b51ee7c4c493f1415abdb6fd2d35676036d3b741d14b7135419645a6906018e9d3f150", + "Expected": "0000000000000000000000000000000004d145ad2575313a922667b897052063139eef8c61dd375eb055c4a5c52cfbed35391a85df915e1eea50d000b9b6bb5700000000000000000000000000000000071cc73c16a234e99faba9b04fafaca1a943f2bdbb68dcae0a1742acfca1f90c5f69464aba42be6c18be31f79ce30791000000000000000000000000000000000bf725a2f4d7d33c66fefeefce13fb5649a68a93fb7086c943a7bd5663b5788a5ceaad7fd2a219ade832dfb3c0022a5a000000000000000000000000000000000fef4a2610610afef43da2161b86b25a8f6e30ed90053d57f5ee0a10effcdd2af769d32ef6843804b2b6590f95eccb4c", + "Name": "matter_g2_add_58", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000009a3e98fe4a98582ce9f274965f376cb45e8583775dbadf626cb1327c1f8a25b293b97e7f8f31ff72ba7e8e769ff25ef0000000000000000000000000000000018e4785ccb76c4897087c8a4242ddc744c6a0a53a4a844254153c23d6f16d4ddb945252d13f93101613f4eb0b1e2b8320000000000000000000000000000000011b81d344eac04d3471b1edde5e51f31f97bea3396580839fa094db58cf6bee371bbdc045fb60c3ee5c6cd5d3f6d3c4700000000000000000000000000000000073476bc5b1d52ff4ca89c3afc099417f473543fab6e59cf9de8a19705dc4bf2a210b1e6de4dfbde035c312be0c70c5600000000000000000000000000000000094fdcc2119b4f674b5639653dfabcac59c2adb1ee2ec06c55c3f148c9361351ff0acb2519e4638cb2cde98efaec8f4400000000000000000000000000000000051d5edcbd6eadac808222f0423bada165fcb98f98a89f335c981262b0ca7ea1c536d41aa41b49b25f0c43f53c95384000000000000000000000000000000000003c96c6f20d7ac31ee7ca77d11e8d25ea78cdf13e5f4d317752320e059e19196f14c15b5a18ca712f3a7cc6f09be6d4000000000000000000000000000000000ebd71f61fcddf1652675f577bbaeec26b892dd954965b057ffb431d6e37cc5425a2a42a0059482c2bd75adb2a120b0b", + "Expected": "00000000000000000000000000000000151ec7c35a67b878420e198ee7bf359d0668ab61ba1a0bc2e5e57b1b7b18838a015464f9910b659fb7d1e10af2801d86000000000000000000000000000000000511536f34067fe931c6e829e22443eb838f0c938eeef6f839eb322d72e2011dd1c33c504dd044e3cd721065d7075b520000000000000000000000000000000010c486f846242024f9bf40d805c8e33ecf1b44cfaa04455d5584db7ebc32c0d29e8742c61886d4ebae93f22c518ea87300000000000000000000000000000000072e184c836a853fd1153eabb1b645bd35ef72eefde4a52db169acdf2d8d68499398599cb4002994c6f4936de1da75ef", + "Name": "matter_g2_add_59", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000c414b95b298b9c673001173ba7e5ee3e03926f28068481cfa0b469ab556f8fceba9fd0a815180ae0b82c265fd4c6b7e00000000000000000000000000000000054a242c1cc1a9c710bc23305d09c2d613ee8eb3840b37943bfe83f9c1db456ab4436ad319fcdd8684db129d76c95320000000000000000000000000000000001683711c0c7f02e67374f190eed1ce6559479d6d199f43fb5b0ce7df7774a5cb21c86b3b3498855d9b69c5763acd8c4300000000000000000000000000000000062f87085dfec847af518bd71c078f994b090c3b27c6eaad79772ab58afa43993db52fb08649a32629d61c3db12c87310000000000000000000000000000000014b0862ac988a169342a4abacfebc5e7e7e8f8ff1166c6ca8fa53613c5fc28fd8b02d9c8d5e7a264b2fa59cd33a0f33c000000000000000000000000000000000f0f79631e7790192c18187144388373d52653cf11dd076688877fa9b5cf58e65fe4332874c301563089b9b3fa2322e4000000000000000000000000000000000174ffb89d7715866562d9882acb81ce40758644ca3e0decd546c8f5c349b24fce88214956e7540fac36bcfc105cf34a0000000000000000000000000000000003e06c5f607ccf1e2991828034fcdf91106295e7174b4dca21926169451ee58e737d535af45073e2378206e03c81c421", + "Expected": "000000000000000000000000000000000642f215b772d17a3aa45ee3aee607321c02b4f7a7df3884259a25ce78c73e9536d46333fa388e506fdc79c708bfd9de00000000000000000000000000000000145864ce36521fdb641761be541a27bbd3f4797b923a870148bef1d5b4b0d463c0a7c8ef07954dad464510d836105e05000000000000000000000000000000000ca038e667fe68111b583dfaa95f88d3b9e46c0798abccd1476071435067e6c0e2fa81d25db6e1175e60efa1705538b9000000000000000000000000000000000cf1cb1b155e4ea47077c42a1a99c3f11f8b27516a808b5e73498ee12363652bb46eab7e55de93513cc2d6272f26a537", + "Name": "matter_g2_add_60", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000083eea9b5b2d5ac5f7ef51ca889a4317322d098a408a741827fb3419eb12a51c07c788c2798cb37635e224e99bbc894c000000000000000000000000000000001312ec00f4b3a4305700b44b3f215779a9a8bfcf5b5d3a7f237a33c5484099ec9bc5c8537fae768e2c0ec62168f383d6000000000000000000000000000000000cf1d5d05d11e1d07074dd34211d0f00eae1df4dc550c55bd2fdafaffa1ad36abd5da30c5d3a5aa2845b1d95a5cb571e0000000000000000000000000000000015223baa9f2ea4b04fdb05b05bf3a94dcabc5e64189aeee39c380de9a34fe6b4253f5795f70bbe51b80e1aec1eab71960000000000000000000000000000000006a3a773638c0b4a13e7ea399ac319f5ea55ed533aca32a933d69d8198ae997a66d1e32a02683e7fc5c1ec597106848f00000000000000000000000000000000155ef036f60a5b11697581265293cc4c6eebd3fdf500540529b6997c27a3be31212aee5cdfea6cd95d6d5bf83a8ce5aa000000000000000000000000000000000b15d92f2301075ab0e3215aa72cf9b130bc8e1bcd9fa36375c4b9d7da430ae3e2b24f417336d8729f44542ee7f561d300000000000000000000000000000000197d90090501e8cdea28eb7963231f1a7b5f716cc3a086acb6e7626600d6544132cac943e8d5cefb5daf0a2f8d400629", + "Expected": "00000000000000000000000000000000128c909854a20ccf9e8e396b617b36f233909a5f6c3524c93cc659d22afe0e7058a438a5ee4345bed914288c64802e29000000000000000000000000000000000239fc43718cd27855ee5450cc9be5be5d9bca8188c22601242a1bb4269ca0fe62ad5e12b2c65558cd3dfc89ea31205f000000000000000000000000000000000a0aec9527febbd35bf041a901b0b35e5e0d48a2d6d733bb557d0767798369a7ccf2f1c278710eb764f721821f9aeea300000000000000000000000000000000194931bad52daa16a648ccf1ba9a4768e5e2900fee4f9bf46ae07d1aa605aabbfe96684f5d2233c0b254cb4ad5517775", + "Name": "matter_g2_add_61", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000011a960cf1978aa2ce1731b857fd91d2f59d4b8d7c6871ef6f4f85aeff549a2f397949d11a4793926fe7be37f3a83d11c0000000000000000000000000000000001954f056834d6e3b16043ef1acd0a47a353300257446e9a1db7e58bd0d7c4bc9ceb3db51ae01cfed9de99621e96934c0000000000000000000000000000000002e2fe460e71b65595ed93a0010e5ccd1a2c16fc4e0d345e7226c947f29720d2f3f54282f79cec086d3fb1999b9629b300000000000000000000000000000000060dd8a7ccb613f1521168a8a322aef9f84d9708a893f704f4fc9a19e2493f25620a47e0fff1bc1e212e65e92873b4f20000000000000000000000000000000006a90568fa25b401756e3f86b5300c4d3b626dc6274f4685e8a9f56ec5ca2afce36a1fdc6d3414edc8780c4e650f10dc0000000000000000000000000000000012e41e8e0dd10b3ee31fa866753aa5d9db7669153b141114cdb2ef7fa6df5db27aef0cc70e76a741eae504b038ecf2300000000000000000000000000000000005c35f3372f1ec9845bd04ea722fbed2be1388abf59e622dd3dafb4b3af49bc5fba9e20235e7e58973fedf4b8b720691000000000000000000000000000000001111d18d621070509805d306a31c109701288fd55d4c0644349deb080c6591b6e852b4f7e009b80019513de7f2fce17d", + "Expected": "00000000000000000000000000000000189ee5ac642bfd0b612058f96e63acb1feb6b4dce125bf0ea1e56e846775af1a8b0864d4ece6bd96c3b5dbb04e2f6c33000000000000000000000000000000000073d57ab79314e38267ee8015de3156f2c1d5dfcb6655a150b9ab4a3bc9eeddf7b37b3681c49611e02abb012770b3f5000000000000000000000000000000000cfa1363275c7bc5bbb9bb7c03e7bb7f6d6d365e39fccbe62cfe0bb93280527c9ea99079fdf9871abed035b62079856b0000000000000000000000000000000010048e4e96f26710d254110650de36460be2a8302badfc2da8b26147da498e4620e79b4329033fc3f3a9c99b1e12aad4", + "Name": "matter_g2_add_62", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001472caba61c2f1fe4b1d0912b114c25de103ef4351668f22f3a158d7a347539a7b6656044bd490f036ca3e29dbdded370000000000000000000000000000000015f8cdf7786410b409f218164063c99e77d8f72f03882a6c9430ec725ae574547d3ea3cf30c3ad2c9c3febe6c30b1272000000000000000000000000000000000ccbbed85c2809433fbcf22d6490457dab800b21cb4de414c7dd1804a0bdeb7142f8ffbb2de921c2c9eabee6a6351026000000000000000000000000000000000a404f42c48e3ca408d3f92079b99805004da928f128206d8904ecd7fcb14121c7d9a9e7fb69accaff921315ef3d5372000000000000000000000000000000001310a8cebed1491bb6399abe3a08fb25ad6ca00feb5db62069bc5bd45a57c167aaf06a628a3f18aa990bb389173855b100000000000000000000000000000000134655489380a9ae9cfbc3f4c6a1aa5b6dbe0a994e681915602c1d197c54bf3da6fb2df54eec3634ea87bf3fa92a69740000000000000000000000000000000000e7e532ee4b892af39f8a3db7a05cc77a6eb0b3d977c17076bac4a52d5ba003a0ac1f902a4257791a45370eb88426a70000000000000000000000000000000016a556050e4905fa74b5061e3874f05cc7a6c5b049bd3bb7c34adef5a77c393239a600542a4401c3e61978ee6515a30e", + "Expected": "0000000000000000000000000000000005889133be5f447013d779f2b9b0033667c5af87e1c8a16d239ca3ed238920004d87e00119ded46658026c26988ee63a000000000000000000000000000000000d4ed8fd88f7e1394f2b5a65588bf1c461a292acafdb77703c2790ef249f2de695524293c826252c94967a3ea4a3a28500000000000000000000000000000000001b5ff0aa278c7e87a89d4748aef13b516c49b7dc9f7cd5e0448dc6fd860a7a8af7183a198eebe6c7dd549fef806db00000000000000000000000000000000003c9e40ed44427cc3cf886ca2db341ae31f015c542b857f6702d25cb5036e3e6abeb8d4bf9a0e203281ab85ad89ce0da", + "Name": "matter_g2_add_63", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000b52f05365c4df20a7290aee71a7e030615d1a2a971167884d835c24e756a0faf6ed0552341c561446c7fd3d5e887d830000000000000000000000000000000018718ef172c045cbf0bb132059754b62414097eef640a781db6ad521af5a24d78c622d9402033fa939f70aad0510a1ac0000000000000000000000000000000017e969e44b4910304b350b5d442bb6a0b71e1f226cb4603cc8b4dd48614622f3f4e1ddecb1894046649d40f261d94e030000000000000000000000000000000004dacaeb9e05b9d60ce56c17312a092cb988bff426b8a718cdff860186935507a06eddbc4a1a29e4ef88db83fc4b6e77000000000000000000000000000000001360612f80227a2fc50a2dbdb3a49db16bd9f0ae401e2fb69408d990284cec05a1c29696f98b16d83a3dab6eac8678310000000000000000000000000000000001223232338ce1ac91e28b4c00ef4e3561f21f34fc405e479599cced3a86b7c36f541370bfd0176f785326f741699d2900000000000000000000000000000000179c34ba9578d5ff90272a2c7f756794670a047f79a53215da69937152bad0f86576945b12176d3e13cac38d26335c51000000000000000000000000000000000dcc715907e4e17824e24c1f513c09597965941e3ed0aaad6d0c59029b54fb039d716a998c9c418110bd49c5e365507f", + "Expected": "00000000000000000000000000000000093b692a68536b16913ef38c3bba7b19ba94a6af1c36a2e54b8ac1754a29c29882107cde142deb95365af00f2d1f537e000000000000000000000000000000001035e70852f38f860a1a04f33081e84f3ed17d83ad894a6800e7b8b9259067b755fe7e08d4c1b297c6d53064ab8209590000000000000000000000000000000013d38db0d8575131865bd7acb6cbe994812bdd8bc7f51b810bc382a6eb379d442c47be20a2c8e751fb08ccce8fea68690000000000000000000000000000000000bd114951193e3bd58cd0025e0b0c807ea073b1c1f7bb04a2a00771b6442e70ea20e1124572ef5b74d2bd87c93c82f5", + "Name": "matter_g2_add_64", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000019829d5799eed5a081042e4646d46fb6bead6d3b9893a4240867b25ed6af6a3e154514f244466d80e3b9311e060bbd7100000000000000000000000000000000156157a654db2813cb9c1b4da0a3ee192fad076bb2767020fc5fc00e967c1a35a367ffa375703e1181b3705ace9dd28000000000000000000000000000000000093385a6a9dd0ab996df54b23f47f4a49b3f379e11bc8331016ecee6161fcddd22f6d49fbb21f098873f1e17424dedca000000000000000000000000000000000d5b5b0f2ce81e755b4030b33fe3a8bdee38c2c60ed3b4a88bffb9207cb762c0a5c699ff424c000ab080d763abc5438d0000000000000000000000000000000002fec3b2e25d9300b9757cbe77857d7220d91a53fc29f3b7a0da5c4e0815882d1cc51a40a60fa8e1ae01296c209eda0a00000000000000000000000000000000041ff1a77aca41f7aaeec13fb5238c24d038e2e566b611203c430d7ac6251d545ed4a60e9e0087d6baa36272c7b1c853000000000000000000000000000000001643567a0f22b90fefee96c8e2f5851623384c2c68bce9589cdf64c933d494a8d805edce2fd18a6db80f4819391dd1f9000000000000000000000000000000000e4e40ab1969bf9f00ee3b984947ae95bf7b9579bdaeeee926638f9566f8ab26debb4c8d4009535cb6422b2c2ab7282d", + "Expected": "0000000000000000000000000000000006db1eef1f614613ada8383e63d631484015224902ca38f58ee384a70af0a0575b0e7063675d2dd997ed8a140e2598470000000000000000000000000000000010d7b833f050f18ff4e3a8d0df227a9494dad9cbde88f68802b23e87387622a5333dfb7bcdcbfe2d4d137cb532ef4a150000000000000000000000000000000000c9c40ba972ee0be2823625a23345fe352d701cc8bf9a153d5a55c205ef1b7e5544d0a7f65aaa24bde8d77cb4c31ab3000000000000000000000000000000000402f170c4c3ebb9b1e7d64765b66ba9b8d45b2ea9fe9517626f38e00a11d180e1f8872bf80f6322bdf3a8dd90732ae9", + "Name": "matter_g2_add_65", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000003af8c25bdbd0dc1cc344d55366f15555709a74e1f0d8d7050cb6b487759db6200401b7868fca3c2ad26e6362a30e6250000000000000000000000000000000013f8b6ffe30f9a133fafe64461d305cc6b2cf5aededf68ba396d4e00df651531c750a3d94dd77bc5c6713b939b18fa19000000000000000000000000000000000dde97855d7728f409d873b83b6879b45ace5b73f317687fbf478e594a959ce21d4d751db646ceb20432e8311e67404f000000000000000000000000000000000fea997323cf29710cf0e3d44ce682e039d6cbda155e43c94dc8cefc5e94000de4b9525123b9615b5f1019a46ef37ad300000000000000000000000000000000123a19e1427bac55eabdaec2aeeefadfca6e2b7581a5726c393bede2efd78af04e6cb986aa8d8d5c845bbbc28d62e7a00000000000000000000000000000000018026687f43591dac03a16fce0c4b8020469ec309bdbf9f0f270cf75e262abf4ae55d46f0b4ff130b7bbe2430bd0c9f4000000000000000000000000000000000a27fe0a29c761ce29a731ead969b1db3ae9ef4c05493cc370a128d97ef956c55d9a500991b3e7bf9600383633778ebb000000000000000000000000000000000dbb997ef4970a472bfcf03e959acb90bb13671a3d27c91698975a407856505e93837f46afc965363f21c35a3d194ec0", + "Expected": "0000000000000000000000000000000002dccab673b26be02d2c645c82a2c73290f0eb053e07d4f81d4d315d9483e57c58b65cfabeb0172934b9fbb52ad519210000000000000000000000000000000011c34a27c850fe319fe89399e7680064caf6dcbad171c3a23c45b9883ee06ccc3482b2b81e5777759ff81b16bcc1b0f500000000000000000000000000000000119adca3e2b052c045124f021fceb03c979e6eec0a270c7f4ab13674e461839a4d3a10fd48da4e9ae750a238a2649ace000000000000000000000000000000000fb5210677e1096cb5448bcda16646d6dd29ff8a0765c5aa51d83fc952a5ab8063aa96e97f33abf701cb8688c989c363", + "Name": "matter_g2_add_66", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000cdf60e3bb018407eab162822468255bcffd54cad9127054bd1c30705a4ebf1afc7f539cca6ba4cd070b44410ec751150000000000000000000000000000000009a2e3e5993b6a7007dedbbd21737a8c0aef3ecd4607953c4a24bb3fed97ccae01ae1cec024443f300b570a66e9ac3bf0000000000000000000000000000000008a21fed19e9ec2a741ade7767b0c9f39b79c3fbe34aadc9eb3043583768d893bf927d26231759290c7dd9c4f158d5a10000000000000000000000000000000018eef4ff88d63149d2632c9db586a4af0606644b16c82fbb0a3b869f1ff924c59acc8efbfde7bc604497ff68939cdd0800000000000000000000000000000000000353798691ffba215b6458a47823d149e4e2e48c9e5f65df61d6b995889f3b0e2b34824e4ffa73296d03148c607c26000000000000000000000000000000001190ba585a928413dc3cef3d77b2cff99b053cadcb13b2529c74171a094d479a259678dd43a3ef2a2e597223eb7fd35c000000000000000000000000000000000eb3f5d24d1a4f520032534f6f81a6806c54df33cbd10c30203423aa4f33620b474cda321e924802b636daaeb34400470000000000000000000000000000000016f004f1dfbf140de042e4f57303928a576d9064f2da5b3ad392331f5c43327c7d2a6fd57456d5ef58b54a3e5ec27508", + "Expected": "00000000000000000000000000000000056489b2248ba672501069ab6742016cc8ab2af50a119239bbd3c0a4b9b56e014402b78bf62b2b37bf4645c3bd3d95b800000000000000000000000000000000046956432001feaba6d230da27a72e8db5c8eb3d52f00616f87b55c951217095f337a302562cda789e5714c4391ac27000000000000000000000000000000000172c2a583c9563fe02d43b2b767c4ee4e3990fbabe4ac536d64cfcf059f0e38672876289bc86915b6344eb398fbc4ddb0000000000000000000000000000000008915b0edade80caee9b386e4a560ff4b9dce33946ee992649466315786e139e3ce241ebbdfa7ee28fad7e6214e65666", + "Name": "matter_g2_add_67", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000f5d47911596c46c0c08cac5f5e7f6d0609874da4ac1bd4e0e59c393273a5fe31a756c7cfff2a01d19e79d209d7c6d3e000000000000000000000000000000001010f864eb6624132d4436d18db7f5b34727060dc426c109886be88031e3c155490cb3fb09e1fbccb7912875477c6d840000000000000000000000000000000005cfbf1c2ae1b80a8c7cfb2cefedd907b0552794f4fda101ca1a723b18de8cbce30eb54287e1847cee3f416cd8b45f2c00000000000000000000000000000000084fa63781f7eba9c7e911ae5866d485bc7e90603541c55d1ffad8b3cf7547fd57fb24b14002560e58410b828513e1090000000000000000000000000000000018b0cd0360c5d5bf8254725c19976345cd84d32d0d770286444fe29dfdbc495dd58407ee8d48ec1004971f249453b8460000000000000000000000000000000009a6ea13f5a5a279ec3bb86cc028a1685d84135ed5fe99cd6b6fb380a42c3af5497e3ba5ea558618487cf953172a376d0000000000000000000000000000000002a36d5efd3381c35ff4f361cd813a96c3e5185141c5985073b45d1319c5f392442b7aa6a253b7eb22d1b5052812be00000000000000000000000000000000000f745dd17966b6befa7f740ea360241162505d6269226ffda90546863d0fff124d8fea13c763cfb69c2f8f12b81d431f", + "Expected": "0000000000000000000000000000000005b81843ef3f98c6a6686f1fbd26f77248497ec3d41aff4be5968d13ba86f86309b0ec4792d74220ad8ef147bdee9aa90000000000000000000000000000000019825376b243f3e374b6e9e7e51e0c969bc72b39cde1dfa09187a3c7c5c2c752ee16fa5a4c8fcf94464287419b3a3845000000000000000000000000000000001308cc0c77219034a9fc3018f1d668a41e6959476aaaa5461ec73d7155c6a68fb08e1fdf8140e18270cd338c266a83f4000000000000000000000000000000000fee2a6e245e3bb570c3b605f7ad805bcd68e9a1f2bb2282f92e2a2e83b69e275b21b923f33a65defa8c4224934aa588", + "Name": "matter_g2_add_68", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000124870cfa469136c638e0cbf15802f2699aacb66d7e4c2965c6759dbca4b7e47941ad9ec37a84db1afeeeaa65a7418e4000000000000000000000000000000000d4503049a6a53536bdf41dd832a6ecf3f10554887da7e389cf940394e1d88db94369b7947436546eb6c6e82c48dfb9900000000000000000000000000000000053f9a6e1f05b67cf553073358009a172e2ab8b43572a974da1f3de85a29103b13d7e67b2a359297172d27dba5c61439000000000000000000000000000000000abc29f50ddc1c113c73700b9b9796890cbf48818ba981fdab2db27ef1c58f4c2e4595b99eae397d40990ce2f6c9317c000000000000000000000000000000001431c5161fc51024c5708496a1f9545c3d4c05ef9e2c91154e22ebfe251017fc61ba54c679ba2ad6b8314bfd8d6272c900000000000000000000000000000000098f2e8b6d3fcf9fb27e912af57b45d3d35a7c5471b9ea2c85262c0efb44c435cd949f23d7d40f14b6b6d4d92cb8412e000000000000000000000000000000000397dbdcc3edf976e8c507f5e70299da8c7765772115bf8edf7dc9024050c2ed98746c2bf7dd4400ab1fb89af991e43f00000000000000000000000000000000139bd5f917f59e2cb6c41c59024c12cdaf95285f3947b80267f36e3bd2701f9548b561c49003fc5ddeee3fe7bc8f5b5b", + "Expected": "00000000000000000000000000000000166414455bcd0e8e40397f4cafa9628d1a092beaef62d35211cf49779ba98df5c1d692f650c1fcf0893a9d4ae1926b1c0000000000000000000000000000000003dd898d0725ee899b913042da8566a1379aeb4dd5f0222ac784205b4e74f32858ae490f981801b166a01fb96266dbeb0000000000000000000000000000000019f0fe4f12b113b337361b977aff7cc7dce50bf37c2609b9f311ce340d30225de178999b73345ef49625518e52aa4d7800000000000000000000000000000000090bc07c6270901d706a8d28d512b07fd0e03013d94d4e43eafbee59677998bfb7c2a58aa93571fb49c35518b6331bca", + "Name": "matter_g2_add_69", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000007d2aae9794b7a7de97f7146c0ee8415e09e56fd42535bce6773cadd6f7ac09c4eafe2e926cb7014377e54c703eaa9dd00000000000000000000000000000000172a4a33ccf99eb0473b2c44d30bd53159afae0c7706ad128bccf6258974d5e5761f9be43e618cdbd96027aede7fd5860000000000000000000000000000000012601bce2171c6e4c2968a3efdf1491285f9e4ab37cf973ab5c8e224ad5b40e1b6459ac89090c73deb8fc79fec7fb8e200000000000000000000000000000000112a6443116e6f98ab348e57daa3971b5fa506e40515e1611fbed3e7dd64c5c1e991e0d2539a70eb93e3da0f573d6b22000000000000000000000000000000000caecf650a12bb629ebd3b978ef9c2d4486f8ce21d515451ecdf01d27740f41b719d5a952e737c83641953a8c8b3a1bb000000000000000000000000000000001641ca29ff6016af335499dfc7167b3d961a25b7f61008c27b3cb13d3cb28fb5096413b1c7f1ca18e5d3b5017d6fed1b00000000000000000000000000000000197ed996d62fc0628d8ea4adee487df31c794e05e7c327aaa140c6be0109031bb763c5f84bc35a0597dc61e93d23a9bf000000000000000000000000000000001056c1f3c6ae36be26430d142d34b0e807685c79935496414e004cb85900d85a18454bde9c0f2650f19db35eb3dd468d", + "Expected": "0000000000000000000000000000000019ce0f31d9ebaed0ea1d12d4e232bd3ad48373fa465af44f1c8015102b624d2f8330d1323fb2fec524e83de0f6699ad7000000000000000000000000000000000915d65fef96562ea3b76f3152aa1b8e445ef50fa66dc487ad0c04cfd7a33b5ee48aed919eb81fe83b1f4dca59b4990d000000000000000000000000000000000e4731ec887261f29475523f7dfc5d21cbbc1b883439701a33cd58bd24f5d447267707c2b60ea38b04510be7dd10d72b00000000000000000000000000000000146a679d7a81aac5952645b2635f24b96393529ab9571ecc1078c4c20a77e59acc4591b9f45df00428250c5e31b1a8e9", + "Name": "matter_g2_add_70", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000030372914b83644fa4db1958831e9335c72ab7a811fb337696221a3290e4c54bc10c2225f8fdc3a9f62632ba2f1594500000000000000000000000000000000114205926609470b6022d24046a1997c048e6d2cf6043397892c967692161c0ceedf409bf5e1199a64eabb1ff8de23640000000000000000000000000000000017cdecbe73779855b7b94920d4bc8ad057ce51c5481a5579650df8a5bbc421030d2ac44568217c4dbb13d7c639760236000000000000000000000000000000000f194fa814bfa7396697bd812d9449d06fc61b580d7a86429fdd1ad376e21ceca139356d7d13964c3c684563675711c60000000000000000000000000000000009c7164f8d40c7e9ca571c46f8edf1c4a961779e55f6b10ffc44d76da78adadb83195d757949be39631c6a53d2d67fae0000000000000000000000000000000012cd5149125e7cc21bb5349be7fe03d5854ee73ba515021b6dc87e81ce1e1fa3e386fcb0de80977b9329e72ad54f929f0000000000000000000000000000000008789ffe0a8676c6a56742a30a48e5e65b88aafd71859d704fb9f69e5e274ccb6942bc51ad36c5671406052aacf19df9000000000000000000000000000000000c7607f4fc69a25aff00a54369f213c4587404644358da4abf26d151dfa4905ba9731dcfb12e2a3f2c551cacd0f4e47f", + "Expected": "0000000000000000000000000000000016790155e57f7103d9e325a1f3a64c0b8a1875365eaa0c01c515538b64bd8265e8392e755a2f7314c37ec09026f13d290000000000000000000000000000000007bfe690fc4ab166b29de35e341e8faec4bc3c2d4ea2d42c9f4166c0d748b92b743ba646c86ff9e570612c75bcd522a9000000000000000000000000000000000c11b9ccf990162b772099fdb4266716b11dcf46c5abd12d03caf222c571e2a9e28cfb47e11db05162967ad4b430930e0000000000000000000000000000000000bafe02785607bae144d9ef5391fef02b9f2fd5dcd436e2506bd40866d8726eb83c223e09c00f3b8895181c6710912f", + "Name": "matter_g2_add_71", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000015d4ae1521acf897344c3a76261754ff99742585af4a0ee86dc473a88fd408091404df1da9d8bb291db68bc9c07d6b2b0000000000000000000000000000000008ce160213875c661163990f3f7ac219ea295db5e828354864517ea8689ec15d35c6df78ff14cb276e0c97ffd7fbc09a00000000000000000000000000000000038a3ee211e777d6d6b7ca6c7a0d2130f1a071c030eebec412c3a0f14c3584e7c5cf15de254a8f141a8210a90249ee5a0000000000000000000000000000000019f7ec6b2fcd8b3190ab37a6e843340d3f3fc092f5772a042edbd5bdc967b96e8a1dc9e435b8463496aa1301f87d0e5a00000000000000000000000000000000093c423917d10edc429acd927def56ab4f07254b3892762aa7056f24224528aa0f528fe8538ca996ca63506c84af73270000000000000000000000000000000003fd3ba68878485e25ccaa2539eed0a97743ae9f5b848e9d83c8ea60f7ad0f1cc6d94a59498f79dcab2bfcc2fdbacfed000000000000000000000000000000000b060965391bfd4afe3271c6ddb91eecb8c7a60451c469d63bb178b1361617000f589c33c35b5deda2f072c6edf2eb370000000000000000000000000000000011c8c988379cd2b82cb8ebd81c3e14d2c01c09dde5690b97623c0876c7554f52ccbaa33d17fb0f0cf331cc85749340cd", + "Expected": "000000000000000000000000000000000965966a8a463de1f3bc49d9873668e87f54d95612231458dc8b885681cee8e2835482b4bfc476153c41b206f427cbb400000000000000000000000000000000183639fa14dd74c33e8696496a3ee269160f88e5daca4fdc468724d9b6af8e7d0706867cdb1bcc608029b89b94c531a800000000000000000000000000000000026257fc32efaf241c7712b0a7e9f881763d8fa0711a452d9b71ea25e973bffd88433cba768f1e5b3ea15bdae9cb9428000000000000000000000000000000001527afbb6594dc0f472673606fb8f4797fc855bde4d308ac1acdaa26f19a70f80f2d2bbf3498b53b887b79fd6273231d", + "Name": "matter_g2_add_72", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000fa7f8fbfa1d4ef5f001a451c55ed261dee344025e599884b29d086e15665867932120d33bee579d5eb1b7e6c7299f310000000000000000000000000000000001f06356f793350b17b47a623059a068800ca1eab6089c7c146182990063e8e23bbf40d95a42bf6e976224b680b75bfd0000000000000000000000000000000008807f6606d2302450bfd8b38fd4147b851ff59762c1ff48f9442c4d7b77a32c5e023821eb47fca839a27fde60e5f61d000000000000000000000000000000000c5b92f1ca9c20d4b6b11d794a5853824cff20d9267a20a7aaa4bed8bfdc728c4d4d50feb8f0b569757b97f473138db100000000000000000000000000000000039d8e90425810a0b2fb5c915905863eb2da363ad4188e42cedce678bdd0f51eca0a96b78ab9e082d59dcd10e3c3c97a000000000000000000000000000000001973250dc31d16f658323d021dddc5439ef4396b6ed735f108cd7b27feb1b508daf863ab6431a77ec0b10cf7e001244f000000000000000000000000000000000f05a111b41a54e0ca78c3a1fff3b80bee7c1505a06b9a4faf36a73b87121d2952cc4f4c4e0dcb6633cad12b0caffc620000000000000000000000000000000018daa0f9a2bb347517eee63463b9d6a5e850446e8a94d0986f2921bf81a9f7541e8fee9d7bbb6d9181021af945fce3e3", + "Expected": "000000000000000000000000000000000018123e82a5572e6b6c62d5db07448838df9db7f7d15dac1adba1fd924892c8bb3c417354e838f706564a9ac282c2ac0000000000000000000000000000000016613fc38997d39b2761aed3485de4d7c273e8392e434185605e968ed942b9d4712cd0d538ed5ed1317870d0cafcae27000000000000000000000000000000000354365566b6e43f8b7f4b94a6343146f35ba3abf61a204e9c976b1ad1a90d4d493494c957def69ff270371c1c8d953100000000000000000000000000000000066adbadf1b69dd16cf19349c82e362be4a3768551599b81a4853ca524a24326e6c9dcc38b5a60ed6fdeb3cc4e7973bc", + "Name": "matter_g2_add_73", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000001191410ec6c5ff628bd25d35965f5e9fa7f3c3d8c0a9a1ee7ae37437a97c25e221110d892e2c7a0e9c8e386774eadb80000000000000000000000000000000003be30c25a18cdab139277232d8888f6d13112c9556895af8030f1893114d5845d895df9afe3c6f9ff7ffb1919adea9200000000000000000000000000000000197f6b4e38be0358a3f1722664c61e62587ecf5467f8aadc3a236b47682a75cb76bafb18a5c556b321d5da49cd4bfd4e0000000000000000000000000000000002e4ebf7f22d929b7421a600e67fa2e64a59edd87a2e2eb9dce1f06d3c793f1a812bcdd510e654d44fb4c1de8c64ba9f000000000000000000000000000000000eff44a5e3b9fc8ffe31771fbcabea6efbd68384c5931216a2b7465aaa2566ee116b7daeea632677f35379107f7334f0000000000000000000000000000000000c3c942373f69c2c9631cef1c6bbb1a4567d5b95500409d4f2c6bf4a66ee263e6f167e22790badea0eac4a541a9035050000000000000000000000000000000017d9e9e2008501981068cb0403e73c270d99defd468cc9dc2d5bbc57750a4a58236f8f7a8df4f8b607095b6a80e7de49000000000000000000000000000000000ebddf4fc74f25be3c358b72a20d1c093f980adfc943b898266592f691e11413c60151a0085d6c9aec8c2d329abbac0d", + "Expected": "0000000000000000000000000000000018ba8af47c5cfa552374cb1b25ada1ac785381f2da0501f86c9e7b11cd4417e64095a5c4bdc2480ee10d215ae2296063000000000000000000000000000000000a2e09eff98280f6a9863d8b8faf8871b44650496eac1aaf90fc2b256f88e937101407d722c95fa76846776d4e6bf0dd0000000000000000000000000000000003824f5bf25fa4aec5a9e044703e5564122bec11da155c01ba8ab8344265516c1063983235863d826f68bac455327c65000000000000000000000000000000000ea72f8c6768736800b141b477610e37477d926acaffaa1951a5bfebb042c94c065e984a8812430153d529dbf07ce2bc", + "Name": "matter_g2_add_74", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000011c6f1dbccde640f63ad7d40089779d01075e26269421b4ce12fa5341f58ee9110f17d08dc1052426f2d00da2dd70b4f000000000000000000000000000000000740b147bcdf06705971c113a5cc12fb37345dd59f2cbb5ff500ce2b347fc5a8199cb3007a871670d5093f28979cfade00000000000000000000000000000000046563ea98b5e85b3c42222d5e0d8481e6aefaf077a1b99f2b4eefb397ec846aa3659aacda569054c9c8b9b69750272b000000000000000000000000000000000812d887943506d68e3525ced9b979354539b7b14003a3169e0084c26326b92be67346920c9a99ef0f9638e8991296fe00000000000000000000000000000000081da74d812a6718e351c062e93f9edb24eff830be5c44c3f21cca606f5b1287de8ba65a60d42cbf9740c9522fcdc9eb000000000000000000000000000000000eb1d38fd394b7e78dfaeb3b3b97d3d928c16472ee74ae0be1ec3efa510b9bb64cec369793219ceab55a0ed0ece23de80000000000000000000000000000000001fdc4256cc997934a65c68ab9767b09c7aad14b5765dbeedb72ab2429231cb333ab9f9143414359376d76857e8972d9000000000000000000000000000000001362f417875259b47cfd9e4c5feda52b949dcbf5b8178318428fd3e70c384020e58f515b9a24af5597cfa037d42491c6", + "Expected": "0000000000000000000000000000000009f1339cff0b58b00a871add058929ffebdc58cd1bd8a9c2c965c63e1843945b28138008cca8bf7b7cc9afb69a11767100000000000000000000000000000000011f65b337710a4043e1fa58bb41d80d505e2aee434b6978129c80fa1b124db89e61617e89bc0e596507566f4a484e9f0000000000000000000000000000000017560f768496ed583b3522c4a013f8b96073197e5b53e9041db6dc935a266111e21d8c54fa33b7bda944a573f6e1f07d000000000000000000000000000000000168a0742af91f42058e6501e122b6fc50dc966c2f5981372704694544aaa68fba2b6483752fa2464526d5072f84d8dd", + "Name": "matter_g2_add_75", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000004c8078fe8567013e8d05a546934026cdeee7d485e30d739407db16fefaef53ed7bff0f9adaaf064aff014ac919d91c600000000000000000000000000000000107cc17f485af7f22e07cf14c5cad6368323f720511fc9dda677b360567f769e47a77f61274927ef9b7be48a77357ec40000000000000000000000000000000001487f0880a6cbdac33ca35b9b65e4ead9d8c2e9180c993bdb2052060325aff8c62668c643f0cd9b4bb1f06a3dc74285000000000000000000000000000000000d4b2d062e31fabe8d2a329dbd6417673a519f455739d140246f2b3e43e20f390088c08e545bf0419d796ac71aebb519000000000000000000000000000000000b8e764aa5afa4a6e8227d1bc720eeffd72d963458a4963a3bbe697d3da11186a30d90f7a4eda5630f6967095816913300000000000000000000000000000000085d05b570cd58def6ac2f7e80dc18658dc5d0e6a1f5a5cf4d18745e03494654eb1a6d5399ec2c5288890ade446317d00000000000000000000000000000000010fb029e35b3f6e156b8751415f180ee3960cd3bb6ba9b8e456715ec70b1ba1410b8bfb77998f744d3f462533b59e26c000000000000000000000000000000001472654d9aa210a41d74e3661e05a9eb6b292719b46aa65f94b6abd514bf05f679dae89d21008245d79a381b0d7f51be", + "Expected": "0000000000000000000000000000000005daf8338637bddeba63c788d78faa622e014efb84d3ac1d655d15af06317fe31d1782b2990354bd507632844cc87f2700000000000000000000000000000000185550250e2d9eec798e8b8c483dc37e2a917b304a6036e8ee518a0738d6bf946d99f6b7ee352b1a259aa894d53a8e1300000000000000000000000000000000105a4865d66ed4bc4f51dc52ffcf284615593d573b6beac490c3ee8e08ab83a529c8dd062d762d1d70b9b3290b6e8bd50000000000000000000000000000000014f598e5d0e40090f29aec1ecaccbebbf2a2d6889bbb9439798924db41b70c0cacdcf1e8ff6906f61943e9a8a1ae4fb5", + "Name": "matter_g2_add_76", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000811e9b0acfc10830c074c5a4d9f4d9382461eb523a61dda0b77f1c43b285fc5c1ef3a1fafd923addc9a6e904505a255000000000000000000000000000000001113102d015dbb509f0b8d0d0ebb4d3711c4f0e1e3d55fb0af247dd24be4fec9d6fe3ad73fbdcfe206891bcebefee4dd000000000000000000000000000000000085aae9e58fb97b96ca3c089acab7bdbd0c3adae141bf61075f5c13145b0d07113f1075dfb959bc7c2d3d3b3a06ab2a000000000000000000000000000000000bb5eac8125807c10270d94e5bcf278241d6fa82f68e41b5529b28aebc88870af55881db526f7bd221a8c4c0b29a1b7d00000000000000000000000000000000042280b112fdbbd94f647e5b1f4b51d864f85063a5b66e1f1fe5b1a8d280f9bf1db81ad3588f93f8801ff1a3f66b96330000000000000000000000000000000001e0887904228790d03d8b6d17bebdd8659deafa2ebd9b07069ce89fe228824a39966953d14dda1bd6ccce5faf16e4d7000000000000000000000000000000000520cfc8c536a1d4e685c4eacbc2000d70abd72e1bf8ce3839d79f5cfa069ed31aafb15542f23b8d1af678bab05a2d410000000000000000000000000000000017cfffda12d21c98b79ac31c5bb696783afb7d69c2bedf0fb070cf7714959db14957a4763564b65b7ed214d7b48d399c", + "Expected": "0000000000000000000000000000000006b63929ce97554659ae731d60d11abe858383e39a67007877f68233cba8179777c0dfe511fc730448da3f1c4347f85c0000000000000000000000000000000016d4df414c287b0871c69f9745a9ae68ea3a1ff41ecd17d87623338bb8750bf12be52caa81537bacee06cebb86f894890000000000000000000000000000000007ad72c98e2428b90bead3616f1b31b26e978cd3f9b6b759ad53056098c18932c48ba78d3da112d7a738d7a9ba21d84e0000000000000000000000000000000010dfcfc53d0458296686fd7e0555593e0378d2cb176d456abebfd8322012bc9b408bb180d4237679985457e689131705", + "Name": "matter_g2_add_77", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001335276775545fbb4c701beb57cb34312108c9f1d46b4aa4b09a16faf0e648b4e80848bf5e75ed8730715f0107afc9820000000000000000000000000000000006ffff8736bab41b4ee5681b741a81fc870e648001027161144254d04c678e4f954e9f191bd8b26201aec681cbf0654b00000000000000000000000000000000026ede90d14fa0885baad21f9631bae058573251cbef5757bb8cfad061f3bdc78834fa5862dea19a2236c014b0f1652e0000000000000000000000000000000009844d0cf7f6f3401145d8d720defa577ca46b49e04e39c4c139ec6811a574e7dd5ce3acd00d1ce9496f10dd15c6d94600000000000000000000000000000000137e91115129cbaa1ae2bbb79abe5505436bb51ddceeb011d56dc5c3c396b6b00067d6e6108bafca40fc717737487b27000000000000000000000000000000001592fec7d33bffa7f3eebf038e3194513736cc41a143471fb8c55a44c7521c07e4d8368e5c6ee21ed0478f949f3e224e0000000000000000000000000000000007f786ea1cc7cd69ae1061d6b914278dfc7ebe8a714aa8cd04323860314c3b4b36054169dd5c6c60e67bfa3902d216f50000000000000000000000000000000019675b09a4de34af3c6e79452b57b31b6d499200e996008a9e7d1c910ca0ad2a352dc39cb3fd7333182476095b7aeec3", + "Expected": "0000000000000000000000000000000009b166f124b5b85875834b5b0c088ab79a2dcf262240b284f57722e78b6eb56a192cd32544c1bb93ef492fe6d7a6216b00000000000000000000000000000000189b9792982b51b13cc3fc1691e0569b6c8d998168d3a3376e63ca60de4b30a84ce8d04fb265bdcf73f158d8e316bdda0000000000000000000000000000000005b99948b635750040b5b59568f0e8bacbfd512db2ae52c5032cd23eac18ad58d83b8f78cd26ae979ce2abeae8e1f3c3000000000000000000000000000000000d0b6561a49c358101b30f714563bfefc72e0febea857b1ce78cfeb9508b0108c2089c9b35cd694bc8c0ea8afc8d047e", + "Name": "matter_g2_add_78", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000010192b925fca096682acf138833b12d96bf97c9a2e69e4266eaaae1785b9008f36082e23e2d42341427edce24449935f000000000000000000000000000000000d5b24a94adadbf542aa663114096bc670e1b6c99f3b661f55de121922452534faed7f68d6b431fcf6f3e379d7acf6b6000000000000000000000000000000000acdbcae49206b749d8c0d21017a33e689ebe26804d1fe7c863a2ea4210c3559805dcf73685702bc56e644b4e02614a9000000000000000000000000000000000092309d684fcdf44bfa321d473060dc2d8a8c66c51419894a3fbadbf1b56179c31dff25403b970d543f1dd0e19e56cf0000000000000000000000000000000016aed55f56416b8f450283c4afea4c606100eed9bf7b8fea9ab4d04797a7bfe3bf0f10cf229f8ce3156869d75beabe6b0000000000000000000000000000000007e5c03e51a513c6f77179bcb5f7d147dcee32426b4365b1c95f434be7f83a5883d1ee5b0e01a636b3e5377542314b75000000000000000000000000000000000fbe421858e4109c51de57b77da4f9c4c1f950099532d9e30e2f7a8b8b4fb9f708cde1a497050d0944e089978b15321e0000000000000000000000000000000019f48a0bf0f27df65ba766a65e831a0801a4ebcd1995a6002a803f88aead1503b7c39fde8ef5c4672020307241958a88", + "Expected": "000000000000000000000000000000000bbb59d3e6b0b4d86ffc89bbfcf543a5b8ff922f1999a1e06c501a734b19dabd54632132c865c53e5287f69f06942a58000000000000000000000000000000000a3bb94431530879a7fb46b317d4f3d65b5a790739b396c78521a20e1cfad9c44248c9576be11c70970a49a1914ceffd00000000000000000000000000000000198df068ac5d3cfb9bd6896ab64495f4b9933a72872679ac3a46764478f043e9fddf17a7ef85fb72a8dc1a722804198400000000000000000000000000000000155c1a9db0c90634a6d214e996b13252bd4db3a4ab84ca7456ac3e7899e6fa096904a90f1150026307a1cac8de00c6df", + "Name": "matter_g2_add_79", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000014441b14765eee30e8131a7ef62c3b59370f2f6f0dda20fb2a3654fa09492bf695de1d1a8f250bfde3c7d2ed805ffaeb0000000000000000000000000000000019d813f8be2519e89d42a9fd3fef09d44a996d6a4713a9c224bee10f0ebb196370d6231fad810edf9cb4c875f08357890000000000000000000000000000000001a5abea13e909bbefdb51ddc699614366f271b2f6490ac8efcca7759833f3feae11057ab1b9ea32311e7b6ea6de110c0000000000000000000000000000000003ac2bf3c5486ca176e34ec5212165cbe04fc9e8c375e3e999a31fe014eb824ea3f2d06b9cf8b86ce3a76960cf2eb4d70000000000000000000000000000000016114be17b400ba35875d9009b4d8974023a57d32508c9f658a0d82a8efc6b379ce4a3dbf5ca7130c5581f5008806934000000000000000000000000000000000c68cd7b9d3c3d6c559fa3d52da48ebe68e40a44863c332bb90dd151d1281dd3faa34e6c7b07c277affbdbc1b0a43cfa000000000000000000000000000000001233421a38d77c59bbe1b83992a7a6c964ede5ef83c5a72bd1ba2c0a81b4205ce9a6925718cabcaf4a72ca3d216fbffc0000000000000000000000000000000016b8c22b35af7d925b5c68b6b7b63442e051fdc45542f233f2d97106c4b960eeb47f204c659d16a3a0d3b65ee38ff148", + "Expected": "0000000000000000000000000000000010684ea0303f0e76b60eb96c470e1f0466f1f2b073bbedc1a0c0df1d2f6c66d77cb90ef9bfa4fef6a6a9eff8f5c66f9b0000000000000000000000000000000010e7ced79bbf01ae9f65d26894c73a905514296f19561ab4d00c0cde31737d01e7b4e8b8e6050054a7a17e8acb74d49d00000000000000000000000000000000174f771a98e262825ff2db7571f5f5475007d2f73a2c265f24e2929671bd173596b8b163abd46b868a644dd464dcc7cc0000000000000000000000000000000001cbffc9bb3195672ea2d998b169f853d3d4b4e147379329b1bbe69ce76d08ad78f87fdd876af227a050c31884fda084", + "Name": "matter_g2_add_80", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000598e111dcfeaaae66d1522be2a21131350577253a3f33bdd74a04b0bfba2940e73b62fefa8f0c34c4aa91b633f6bdfd0000000000000000000000000000000017fefff7d94afbeceb33714e9b5480c3a2f3eabf9d7f6e8507ae54cb65f69b21cd7d04d23f24e3a272c589f572b91864000000000000000000000000000000001652e3f5a99ba8dfbcd1f90de955ef527947642054be603c1b84b24bebb579b78e2a0be426ec21d32783a0e55f0178dc000000000000000000000000000000000a6c9ec91e8bc86ab198416cbc76239f0ac0b903f40310ee1f2066b01b08191538ca913c2736f53f23ef37fea13d527500000000000000000000000000000000135b96feb4f1e712661ce0d13842de1198c589f335141ab1fd7ffc6b9d58de82c300e9fe6dacdefe8e68b6db9298da5100000000000000000000000000000000046a3563d167d8b0a9f74e0c6514fdabd795110cf48caa014947ca90a9eeda3d07dd7dce58d3f2b7b86fab1143946b560000000000000000000000000000000016c917abe637da21e60378ea7c2682306aded4ff17ccfea742e9ba63590be1b0fd5432ff0d3b72cdcb15943763cbb6bb00000000000000000000000000000000153bdddfe73f21c3593b128d3885f621935585ba1715e1d989e87cf7271897eea3917b81f0f342790f0f7a330ca0c68f", + "Expected": "000000000000000000000000000000000fa306f630d06c801e0203525c75fd6065bd12bcb3c4d45c7e02b597f85a53fae1e65a969feedca75068433547e4632d0000000000000000000000000000000004b1bdbc29f19f6484ea4648c70eaa47cf5bb07bbc255bb72dcf68a7b661de433dafb682d51321369cd3372288b2b9c400000000000000000000000000000000136671654b24e1ff2e8223ba747ded51f5c826b6e2c0f02e2865fc35d15045f41952835800406f60f966d1f241914726000000000000000000000000000000001007b5e8ed7f0d25091dd959d89732e9df02561a829ce013f5ad1adb8d6d828a8ce87b52d39fda1b5dc2b581ca420e22", + "Name": "matter_g2_add_81", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000072e022c168461905f798e87425f2eebb517e473cef98c255d0fe434863ef5811920af65bc946b29d489b5dee1066c56000000000000000000000000000000000e7a9872caa82d191f6014c845e1b3ee4ea1ee89852b546a2c85ddbfa3c1d4ce99002e3d7732ccb8cfbd57d550285ab400000000000000000000000000000000144be65db373f6401d76e0ee64e51076b861e8fca596dd6a7f3b5735c23b0cd13248404fa0969ecaa701663a1032f48a0000000000000000000000000000000014c9e9c5cffc4518889f7742440053678ff1d9fb1a1a103d0c1f762b10655bd5849ce98f4bc5eae80bdd9e767aae452300000000000000000000000000000000117821e6c87bb0e04882e95d36dce18ca33a2c8bd0efd5532b33d597804c08ff1799b2d64a95cc84bd31ba45c3b1e822000000000000000000000000000000000887c07c8a9ebe3154950746a4506ff192bb4a05dccb0f4a1a8ac2b8ca0da07190129ba44d9bc8e6c2666027c67d2ddc000000000000000000000000000000000a9e191c9775f57810a511c8bd3dca14b3328e20f0983ca72e42e561b5dd1693209b42a11f2faeecd6307dd34cc01d60000000000000000000000000000000000146061b13546754c74a705776656100a9577f1ff939a82ba990d6b885b27c450f824555829bbb19f9b1f636991799cf", + "Expected": "000000000000000000000000000000000fb74d9ad4de11df81c48d10b9a14fde8353ac47dc902b4420be4c086332be480552e26fc42b7c0f30e34f740bf9a4e6000000000000000000000000000000000612a7e23bbb525f91084b122dd4cfce4074c9e6eedaa7cddb58a14e0b1eccc2f08296baea3eb3e003e576fab7c557ea0000000000000000000000000000000016dea145df47a2c5262893c273c6158ee14d44c3740981c161624a6e9ebb982a52c1eab6160c3849f2bf3821d953f4c3000000000000000000000000000000000e920661772b8b737f1a663badead0e89aec4cbb86e6dece5d4db8a673e75b844bfe81662dff671658cb8386c16a7f3c", + "Name": "matter_g2_add_82", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000948d0f0c20715f8658e1f2b4f9d32d851e584287225a2f47735a1f4c241b07f8d7c5dd8c13bcdf84e97d49817d4d88a0000000000000000000000000000000013c064548cb756b48600dd535af8eb5b9138f984bac0391df2e90a204fcb6c36017df910031864d802a2ff719856b336000000000000000000000000000000000000b7eeb7c9a01be88e573f196c2a531635baecbc8cff9af385455af3757301436686596ec7fe3618af26953c49f7450000000000000000000000000000000001332f4dbd5461ab9e2c8b3c19c6ff407a071018c92d2c17c1d1d481c24565276c0f55eee8692016c1fd76d70f44627c0000000000000000000000000000000011f9a369401d2c376c77b4b414e345e6108b11594b26521b51afe6318648af232bf9f1455a99dc2f9b0207cc78339510000000000000000000000000000000000863492499f4791e71bd8d58dd2444a34e66dd3e3ca1cb3669f4182fafc9ef080a1d8111b3dd754f2405032350732b32000000000000000000000000000000000e96f685e6f87677cda23177f9fe7fd15726ab31e4d85a5725e93d558bdf61437dbc2c9ebcfc6a94705fa70de88a81bd00000000000000000000000000000000157ce060a46912c992587fde3db4c64a705ab7115717031778176f6ea311cb352f3a76f4839be4658470e4b0b9854f77", + "Expected": "0000000000000000000000000000000015930559743b21acaf390b557fb960d3021f3cde80630d8867a063d445f860c8a01037057de1929be16d879416b12a6c000000000000000000000000000000000c6074c54c83f717700f61c5b6bfc641502121b59b196a1f8c5f2945e5db1bca0d7a94fdae96bfeeb6204c8c3f4d048a000000000000000000000000000000000b3a78454479c0990e4c65e4f831606c7eeeaef0faa86596350c9e43e84ae959a0f32c8d03d1f631d9b2ecd046efcda6000000000000000000000000000000000aff797d7572f20b06bac75bcf8cef879df11599ba7f8b86eaa28692d1239cff22841b66e28662309e81a6a599e79ddb", + "Name": "matter_g2_add_83", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000d3ee70610b5029a28e586f0f3e65bb19a263db3438710fcb8073e1b25f83db50eb5bbb9d75cb20952a225023f747baa000000000000000000000000000000000682f7d5cf9d182b20ee88683f3915e8c9b03074a373e573aa57232de4e997bf155acf680e365aa0988989dfad102b2e00000000000000000000000000000000143962963e230a9154dc328f9583f5be6923a3b10ee7b1d0cd5f5cbff13913d8ff78ca315be7387900a50b94449884c0000000000000000000000000000000000f4f934b42452d41cc20d7b1ec547bcbcbcc10f215364ccf2b864db23a09d06e94c7a87165dcb691f4975323486757ad0000000000000000000000000000000000a8382a5f73a7d15c3ee35e5fcaf7142e6d91d71ef30ce7da9c8db2f80c95441dc93674bed244096b71aea40d43c318000000000000000000000000000000000733e9a022695ed6908caf6ec7e67211c6d5ac16ba3fb8e244227f5da787e69e7311fac1e8d102a2d84e6ba98903ff6e0000000000000000000000000000000016002a054bdf3cd916b5f8aca47d97feb170e8864da2eff8bbbf19a5b25ac857dbe6daab97dfe15a4e82455d154652e2000000000000000000000000000000000efc6f6c595368288f5687e710e2faebf12bd63a0ca34a527c05f1d925fcedd23c5e2b6708194069a36f858fa510ee41", + "Expected": "000000000000000000000000000000000351bad2f1fd9adc84280515c2d9e538b69dd63ac93514987ecace75d6bc4585199b742eae0d357d587924333721a1d90000000000000000000000000000000003e495b544aaf19a6415d5558170b8686968dc922367c5c8c212fa1f2785535fe0e71498b98b9a39c8b1f2384956170a000000000000000000000000000000000c7040f34872eea5f98ddc78737dd01fdafe75081cf66ad5c7c900674fa90257105b4f4fc59103dd5b92727a072ae462000000000000000000000000000000001312bdd27ef038d4a89b12c86281975bb34b435d42642fe0732709baf55e9a0ecc0ede8a4775a33e880aa2e1fa7b7ed3", + "Name": "matter_g2_add_84", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000005f0fd4080e26971ab16d33aeae04220ae23781da3179e38190082f1d167514bd73bc8ef976a2f333570e9f56a6c05e6000000000000000000000000000000000e159905d29b52ba61575c3a263093017783e1028b3701ccf060c165ba33a765b5265a9b1681c1759bfe2c9c401275e9000000000000000000000000000000000c5ac0bc29a49a7c37d772954da850e6b5e301e230552be9a94017d770ebe2cf4dcfaf104633623e024aef6db57892900000000000000000000000000000000002228e7f42a9409acab49cca82cacf306f6c6c29fd9f7e2ed12fef2d16383cdb7bb2b39ad598b301072c615232db1fa800000000000000000000000000000000050b449c2425926d961af37c4c88e671eac676a1f828def54b76dc04960d0222fb5832ed44c45d5fbb59549d9d24c236000000000000000000000000000000000c6e811987b30ed77c804e647f867186d425411e514e9bf31099cc0f695195729ae970766b2738a928e776511a44f8a1000000000000000000000000000000001408beb1c3951d79fa43477c5af6894ee3c2ea9605f8ae64a78b51ee7e16ae9641134a9a75735972dbd7b53dd4c9f3bf000000000000000000000000000000000e6c6c9405ff001faa8d8c06bcbd75ee91140f477ef8283d3c5eb3039f16543ca9e7e4162177a7499edb6f3fdb01643f", + "Expected": "000000000000000000000000000000000d521781f60198341d116fa5cd9e2b5c2fe51f91f6c8318f351df007c96086f6c3baa5cd2b9b4f442305695dd9b01ac70000000000000000000000000000000013454fc15b1d182bc98d75947547b3bbebef6d5e2d38ed7c67d76eee8da89ea2be19280af4760282fa7576412d5f2107000000000000000000000000000000000d866015c84de74c24dde252542d0d3823f435203c71cda140af235d88f3f4b736e9d75ec32c09ab73bf74083e76866e00000000000000000000000000000000147dfb5f53a9cc61b6788c911dd8649c09cfffbbba368c1872a31cfe3bd6d6427d7b00163d39f8e0b81fc4c40dc60b87", + "Name": "matter_g2_add_85", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000180569ce03e4a0155285e733adb18fbca71225507a7adf01cb8e8648891525305e92087f58378f4fd8455d5632ad660e0000000000000000000000000000000011ab84e42f10154e306a568d7cf7bc381000f0add0500cb508f695a3b283ea69d140aa0ad48fce2d2d6fcafe60761078000000000000000000000000000000001136c3016474d6f475609606e8d0269fcdab9fd3188a512681cbc41eedeadfa3b3d9355e5b4503e8b5c3665e49fdf3ab0000000000000000000000000000000003f56cba1b9cb4302099b16b09c2602dfab80d1151685ef78e5054cd454b319adf8b5998053a5b9fddcffa020595e3bf000000000000000000000000000000000a8679f08643ff1c4db54e58de15a4828fc80e3f9d80a932b26b49d5c13831b1dc5dc29af2e080eb08e71938e5010fc400000000000000000000000000000000110957f7e9f8e0806bb3d2a811b91c926feab046ef983495f3f768a6cc6e4a6d95bb92facb77d989e53ce5489aa64b3c0000000000000000000000000000000018a8b48aabc6c003a58593a40b55e54b122994f9ab58cc229d1a0e6a3670244cfe73854f07117dc77dd5c2c81314a17e00000000000000000000000000000000062f6a0a8b9dd56001f0f57f82bb7468d709fb8f33e6729369b015685995ef27abebff9dda55c38b0d9e88a1e0b9fc6c", + "Expected": "00000000000000000000000000000000059fffdf2d79b4a297f6912e3035cf0b07db9372f3485150e00d60bbe2e7d86f45b5c2ef062dd92c7e8b1e2be5e9bd140000000000000000000000000000000016acdc57e7231b020268373ddc8b8a7318ead02a8c7181165ab045208409373eaf57ace9a6db1fdedcaa477c7a0ff6f40000000000000000000000000000000012fe630f7de8ef5a129b99faff2de080849bf3b59aae1af042c29b1cc49c8825a4f28c4ccffedc6d568f306416b5bb90000000000000000000000000000000000d86ab3e49ffdc7c2485ecbd00256af83e7f3f064d212ea91245d86ca75e3c7f28b42fa9496a5ccc0514cffc60c9fb83", + "Name": "matter_g2_add_86", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000004d79dab9eef873f3415d66172bab7166ce0c71f322529bdeffa915c1b0d3fcd645c91dd3450ba61593ffecb95edb91e000000000000000000000000000000000d611a207d3222bba199fa083d0459675cb5fa00839fb4c9034ad868fc1e79d653c18651771431d6fb6b6b5ce8cf6f7a000000000000000000000000000000000ce802ecb106a4f0ca4efdcc058dd0e29deb6a5d30a2c15c8eda896bcdd3ac19053c10105328d239b26c5ddbdb3a95fc0000000000000000000000000000000001073e142621ecbeff6f81453660362545751f992ffeec3a83477fed3e6215a709ffe0d17b65d3369f8f3913bf000e84000000000000000000000000000000000ba48cbd776dd03a5b69aed3a31b7d151a8d98cd9adc3b9987cf2ac94644a364ebf3d30cf31742e2152aeba0eebc9ceb0000000000000000000000000000000008793a44c730949a9e50e9439d579ff0991dfc49a67a29b1701989ab065e6e937b14ac1bbca5a3dbf79a61837ad18394000000000000000000000000000000000d81a0809479694fde24e5a3ee7d32deacc25e77f241024666bc3372e80379a722863ea8105f345f1d09e462fc5a8c6c0000000000000000000000000000000001a5be923f1ca5ee876d660fbca5896f1634ef6a83ff8c64dca4ed76d1db2ba4875099fa5a39a09f839731278b307fb1", + "Expected": "0000000000000000000000000000000012ba9a8fcb69d15eff147f663a5d7927b6f3f79330eb9ee625e0100b146597554debfcf97a3afb51387a73554522ed0e000000000000000000000000000000000a63a990d6454d4db6d58642eb3489f79e517fbbcabc06f2eaa00c4b6f9a07aae97991f169d90af3461b7a62db276e00000000000000000000000000000000000a95203a1628a6ae2551df832f7ab94ffcdbf985e4c9744e244214c8e8b8079af05a9321d1e49b7240c2bdeeb7b783280000000000000000000000000000000001ec747203be73526d3f943e0af814dbede34020144bf247eef9a6ac2cfc83ef63f18a73d3baae18bfd8d5e83d0519de", + "Name": "matter_g2_add_87", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000bd84f04b3858b1138b1b429c7216d5d1b1e99c1e0fec26440d59b1ad79788c2d5583122c2ad769fcaa6d10d816a1f1e000000000000000000000000000000000387977ed1ce5da51dca230531bba53d17d3de5d593ec576cabfe6463d5164d7153025dbd4cb3525c4145c4f6b85fc76000000000000000000000000000000000a19c943a90fec6921367a2edc5bc38a5c59839cdb650766a2d2d068242463dd4460bd1d0e7a7fb0e3d2104704b8b3730000000000000000000000000000000011d99d44b200feebe00bd42809e3f67a23cce88a07165416cbfaf4db14420f99e54d62db4280d2c99ca0bc3dc41eddbe0000000000000000000000000000000008691df5b245399f24118badfbef3e01a4acd53dc9ab149e407c733df6122fa91f5cbe2f9d247cdbac18b266d3d8f18300000000000000000000000000000000053e6eef4ffdbe239c8bbade8cfc90461d54f281ee6180c271412bf2d64e005d3f0291d3401c324e41067f4dfcc4b2720000000000000000000000000000000000b76cdde0e1205c918e6e6d324ac3f35d42ebe9bb101f1cd8955acdfa8836f22f1497bced2c93495022b0c335bcaaae0000000000000000000000000000000018340c2a8b079b88595aa50e93251d12e3a5aead2d2add3b72ce82e03a26525aa45fe9b379504392edb0a2a26d7e99dc", + "Expected": "000000000000000000000000000000000eefda9046a950c232c6244a79c33e7135d0896bc57839a4f971030220e3ca8196cd0ad75269f3cb5586a384dcd17f9f00000000000000000000000000000000195ce623693996f5ce9e45b4e285adb969e6771e6b0701fb5c95715523c8cb93aa641583821a3b360ad6f4ea1aedcc9f000000000000000000000000000000001553a4d0f965d26fbaba56294591935bed63c84abfedbb9d5c61f3d43484ea71600935fe3c8b6b137d7a9074d907e86c000000000000000000000000000000001673c42c88e4acf8ca38680694b80458f988403a4bd667468506452303000d13649c4f610b738a94ff88b65053731c08", + "Name": "matter_g2_add_88", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000006a186aa584a466a860849c78e4922889c95a4ac6f39c99029fbb422c43d699a8baa51aa4ef51ff99557babeb3e9506800000000000000000000000000000000065fb15b5a0923bdb52dbefc7e9f1a898e32f17d610bac829235446fc5e1913fffc8176e0fbd33091505761f1d06d8920000000000000000000000000000000008bd358698fd073f660ed608462cfcef1da9a59b10905f1d98c4fe66958e56802814906430c10fc25a4d351d91f91cb0000000000000000000000000000000000a53638b1b6c6eeff468e099446300ca7c7bd899c6494682d14fdabfa9cead0bb37a0325d99e7d0ba6341cfa1d257ba800000000000000000000000000000000042120affcefe4735ae25e192d1cf34e40afdc6d2ebdacde2e23d30709fecfb71960bc9131e3702b27b6fcd5c7a98d170000000000000000000000000000000001998caf5163b0dccec7c8423c4c56a7d0f0b26d9034f707ed07f636f42dac590a2674c1667d70be385c4e626815c6640000000000000000000000000000000011d7aff6c4512f68031aeb94ce3733ac43659f9fc58fc94c05d99ae80a7656f66b3e3e86843387d1c10f51b4284755150000000000000000000000000000000012a9e7f3804c6b5b25410a82758cd5b6ea1eb150c696b0d67d92cf9eb1f8e17752184d94a4ad2645b1520d6aee1094ed", + "Expected": "0000000000000000000000000000000007145ce58cbe48405392edda6022ba8942df055ab582ac402e7c9a0a951cc6a38cd147903f042273e736f30849996cd10000000000000000000000000000000011b457ba464ce818a34a11afc3c0007908091fb528836691e6eccaa9a23ea90cdc746769c4b7ec73efb1f2878413c3b70000000000000000000000000000000019ca519fa6a91cb7e83704daa9b92da9bb70b003f9e9bfe9f323430bfec9b19b01005aa9fcd19d5b1ac59dbdab0c0d84000000000000000000000000000000000ae356f5e5de0d7662bab8d947662bf87d792a3438ed477cf6ed4b27c935b1dd76a5aac446d4dc36db544d4aea40b505", + "Name": "matter_g2_add_89", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001070b98c6348a67e996626ec2752f45e4c007e9c9668459a777c03fab633c10236a1c5be99f3fd950542d5648ef9e88400000000000000000000000000000000073a564401cb1a3a53334c0a55da261814d27b86ebf40b02a76b20973ba2db92e42c138ca7790261c2d70401c984bf470000000000000000000000000000000004212d8a9e4b01f5c6814a88561c2c6143eea61327b031a2e0e4bd056c12dd7098fdfe4d1511bb441ad42b55b584a7bc0000000000000000000000000000000005c5d23824b0fe05eb962194550681c57c1566b315efa8ebc90b3593d7d86ad18328baab8118c9f47eccc0757588591c0000000000000000000000000000000001462f8080d9b51235a8aa652445f509e3e13e3073769e9a047e8b2bfa5b227f4354bef017d18bf06f7ec98c169abf1e000000000000000000000000000000000070fdbc18112b49bd83f4347922797f2bbd68bf2592ad59041c97948ba7a091bdb3622c804803ad605604ba364dbdca0000000000000000000000000000000018bc90cd83e1271bf0e39b0c80989f0ddcffc960ae466c64ad340cc32607dbdc73eac5b9145e1339fa02a0c3fafcc1df00000000000000000000000000000000124c4bf66a5e015f142e9e4b26421414a60e54ed76c6d4acc0f20b24a25ddf5ec7ef1f561fac9d470a94bcfb2f2698c5", + "Expected": "00000000000000000000000000000000135c42c10ef97279e3d152b18cbb8dac11ca8c805dd1d80818851424f592e7522589ec7df6748b5c72d0808399e629cc00000000000000000000000000000000083ddf3843434937e05ba9e101096371fd8fb34f226bcd517716200003ab9855f7aea94980c57a6b933494cc57afc562000000000000000000000000000000000be9215d936a49538442189c9a0bd3be07d4b0b1d14aa45afcdebc1fde17d33b66f7dc36da1ea5411549577f5a1967ff00000000000000000000000000000000176a4a4962c4af75a712e5093ec2cd5cb5c0433aa0657809dffbc0bc02b1ce303ac084f39a5721d482d41412d391317c", + "Name": "matter_g2_add_90", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000b1b3053774ad5515a20bd4c556d2b3ba95fe74fd0c955069c7f933dfd718ede90ac295f5a675f1c29dcd9701978353700000000000000000000000000000000145746ce88686021a0635bf6f0aa2f77c48bdb364cf4ffa804a57f95bd69d24eead05fbee24021c1ef57e1c7c7b894b00000000000000000000000000000000010ec4795a0762b86f3b83de1198698af67fd1b1be3ddef48f35cf82bc96d886fbb4c75064f51a9cfc5f61630c95d0ad1000000000000000000000000000000001465e31f58892466b8ae4b76a239d9f8d1ecb1834886344013cd1df0be13591798868d224d38213a6d75b02a1fde0ff200000000000000000000000000000000156901359e5b399168e90ccad27a054d147aa9c4a731294180e395e8e2d458f5537fdac591cdc82fd8bffa4c9fa126ed00000000000000000000000000000000143872757c0a25d85e95a86c5e09175fdbeaf59bae3d1e8a367902d59c662cc3a293ae252443b3201671ad1dbaed8ca20000000000000000000000000000000017f93d49ec5c34cdc31931cbe2d5b3ad7a6dcd3ea864862aa7b41d5b2f4618c9c92da01e246ff8f34240bcf1de4c1c450000000000000000000000000000000002180a95dbe57c43171e2607593dd3b54344bdbf409dcd0c5706a9a72ad0e26ed60b9e4cb17ea4e7b460adc5a6f6d2de", + "Expected": "000000000000000000000000000000000bcd916c5888735aa593466e6ab908a05af528f34a7901fb60feb1f51737c73612436c192dfdecf927019724ab2a9b7900000000000000000000000000000000187d4ccf6c22381d0c40c9d7820ff8efe6298c6dad0caa25402412661737cb482dba2719c3a50ec08cd022230952dfc600000000000000000000000000000000164510d4f2cf1e14e039561f1baf82bea678d0065e378d5bb7443fa782e6ab2a3bf7e4ea125d6415a8277c60f5346468000000000000000000000000000000000281f2e28b73eca4db9966456b75de9ae3830c74ac928fc4c36b4aeaaffd47ee587d948f68056df2826ca2775415a53a", + "Name": "matter_g2_add_91", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000f39e731e6ddb7496448c912ae314e833d28208252c7f8e27bcf7eeaf1da6e2310538b4ef0d55401c6552e91fd70691600000000000000000000000000000000069d3612f924961f827497028737000513548ad8e104acee28f014e730d4752a583cb9a893e6169b71966a1c4a4ad2dc00000000000000000000000000000000090899907edcbd336bd4fdad0dd67c578ced4481a25b864b32aef920842689a2c23265277a6e1d4a1dc1b5047a9f79a000000000000000000000000000000000055ba64e2502baf68e46c759fca30247a080464eda2b32e7cfe539e545d6aac6dafb731c2c45749e50513979cecbeb5400000000000000000000000000000000162ea8f985c83d59361ee6beb49cf2a797d8c909e2eccfc61fdc5359d5ac9b10fbaeef2eebea1667b5b9bf8f5d603d6e0000000000000000000000000000000018344ca9d4913e817264ed8119fe4d136f2041b0a99d4b5fe7f2b7f268256eec9fceb27fa61c4225f47babd17759c01300000000000000000000000000000000034f7418d96bdbe4f1ed5996fc9e9e99233a5cb3aad717b3717e91ff94fecaa67250ba5b27dcf59c6e36aae08d22983a00000000000000000000000000000000100cd7ea3c342aa2c15e9c6121a1cfecf611235add08290cf9cb8ea54e8ff523e17a0b5dc41e6d07992e5927e3ff6157", + "Expected": "000000000000000000000000000000000cceccfefe04f94e0b67b29b5df8007930665006cb5a59504c3656b8c0bfb52324cdf50fa2722ce15b0ded0efa7fc85f000000000000000000000000000000000cdf34c330c0125f524f0711197639f8aca3e7c435f8c5ea30b78e9622c4bb72a7e584980cb4c3c6ecdd0689daf36b6a0000000000000000000000000000000004b1505d7fb65f6c06ef23aef85b16f3d991218187c5782fb635ba805da463cec9cfdd670c53d680c603adb827a4460a000000000000000000000000000000001104af6bef6482ae64b3b6b39664ec06c39bc18fa91b7b4e5bfcd444c827bab30ef548b28ef5487582d88fbc6d7983cd", + "Name": "matter_g2_add_92", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000042f1c8b9fe81cdcabea047d0998a1354ce09d62a14f1d0e9d188e2f35f2e1845c2b090c5e157595b33108c67e6c184c0000000000000000000000000000000018e69d3564d4ccc0306e1e6b227b0f961aa9afcad59d4ee1737f980dc876609c59a4c6a3506f987467beba0764b857000000000000000000000000000000000012ce5883156588cfe0f4838f819f985b09f1eab40a5ea8e30fc5d70d029a01a4537641248f4c21dd203909e0170737c80000000000000000000000000000000002888eb9778a4045feb5899dda258657b9f41345731ba630fbbf186b3be4b58ffc7f48abb65b693b573a73f85440a7a70000000000000000000000000000000001cdfae9234096578b9413f926ef8c6831f2c0f700e25d7553a746aef44238e493f8032e09f67f2fed9676c9611f60e70000000000000000000000000000000019c8bae08d3926997146f7827f00cde863684dd4050ea5da64f6798e7a930d3c1f34046bea0f44232594f5469db566280000000000000000000000000000000013574b997ee8988aa81db0e2ddb98be2e7005603076fac5cb246f65c869aa7bb3f148c8dde970e34e5e5efce023e633c000000000000000000000000000000000998bc9d41c5d527360fc4e68ba067d3778cf5cf00e5959b5ec52c1595aabe6e2e92d40cb34faa84513d150568c8cfc0", + "Expected": "000000000000000000000000000000000e1ef3003fe3181f690224cbc7008856e1251430ce3cff56a1965c89a892604398f5101d1bec7ff1590b0cc3d23b854600000000000000000000000000000000185b4d4b5fd8313c31542bd1bac034046ddc705b41a034a00570181503a6ea4c2d808bba0478900064270fadf3d655920000000000000000000000000000000005bed63ab9898b89f92027c04ba256569e6285c851753e12760129c98899bcbab34b62172906a1ea4cb056d4d0a5717c000000000000000000000000000000000961129a3e212c7412018d7407d7ad16412feba8c138f4f6ba69daa1a25c6b23f3466bfde6f5f0d09ab67248a2abdc68", + "Name": "matter_g2_add_93", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000051982b46a819c74105cb36da871fb2415328a1531d155856f6551bd043eca62ddb61f24af429edda830fda31e22cd340000000000000000000000000000000006449e5bcdb5619aac542f6633ee3e06a4fd56a3e1ce4034efc608131ff6ead70ca63e70f494f519d5c577ae7119c8c200000000000000000000000000000000153f4f5dddd5801fbf7f88a735b9170d24d5b63861d50cde9644579dcff277cdb0d5fbfc3b3b819a1172de05afb9135b0000000000000000000000000000000010fdea84983fe6c08cdc4b4ccd462bae2ba791ab5209363b10b3ef342c9a5e92184e9d8be1419e3d88402bc05bad5fa2000000000000000000000000000000000c78d84157dc0b102c3843e4c8e88f244cc1b2a27043e07b2fab694a58f93d47e4cf9ca1158a8e30e3d43f94a20d33b50000000000000000000000000000000004842fe0df312f735a9d8af0c2ff7c561ed9cf4add5e3e9402bcff1190f3f36ca91de8edc9472b3ebd27ee2d9afdf8770000000000000000000000000000000008c7a67b89960da4309888bc6ce31e7efe74867165a8aceda7c7290f8a92687100ccbcd39d4d5a67f21f4b63ecc638320000000000000000000000000000000001cd7978ce28629ed1a9c5433c555b1ebb584f80909599282467e7b2471f591bea1d73e7b0a247aed7de4f1fecc01204", + "Expected": "0000000000000000000000000000000001504c47ab0c410b32d5f1fe3d3996dbf1b21c5ef5aa3a2862a9d561b419f818f0b32b8e931c65fffc393ce7beec70ee000000000000000000000000000000000217e9fddd2551a171a13183ae3aba6bc5ce99e8f3587b92a7cffc738b478d8293b8c71989cabf9a55c5f5077249345d0000000000000000000000000000000003874de865d93650a95af4e153fe557c45bfdc4837bd6e209b8f05ad12b8fdee6432675cd92fd739b7e98e56e7ef16b60000000000000000000000000000000011303c0c7ec1f434cdf07c110da5f0bcd85935c3a0ce9fdf5546ca61edbc2d478562dbd9aa45a5f8d96e033feac2fdd6", + "Name": "matter_g2_add_94", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000009b011f793d9a939d916d058ffe91b58138820a646cc450389b3074ae3715d06ddec1075afecda71c65c7ca085210c740000000000000000000000000000000003d4d20f4b93c1e90a0a06bd534d8b4fd64e4c4aba77ae42cf4c5b2bd95f8b02ec4069ea246ff46404e6c9eac632fbac00000000000000000000000000000000051e88c3adfd4d6a02d3f03812362a6cfba3a6c69b9aeef75b51106cc7f1750293d61e31f0ea29b5d7aa56debb6d2aff00000000000000000000000000000000086d9c4ea6769cdf49ffbbf7351023b4aea640e8c90f9291222fd0b5984bca4d481bf7e10df921406a34804e6a09f99d000000000000000000000000000000000e619d79792ac685030311a31a21203e5172d2e5d20ecf69a1e64158e7fe903b3695fd15432d3ca35562b5a8bd9cbdc20000000000000000000000000000000012394a621a503d1d92df3306649a6c6979816cabeb8f8d27450ec883c4e75f6f7411f3bfd068dc8dee58cdb8ebbd91bd0000000000000000000000000000000001652a688dbfd63a1c89452335bdaf248c97c9c6e5a3ad5a126577a6b9ab57075b22987ea8697b459611a5ab164f328400000000000000000000000000000000058a37347c5637808632ae6e8f264e8bde14ebb0ae69828f962f51b728321fea57c5a97ab694f7db175efe7a17d36cb6", + "Expected": "00000000000000000000000000000000101ed22b16502de0d83303134a97db17ce956faedf47256a9ac86004bcd3ed112a71328a58f98a85977a7f22eb1352c3000000000000000000000000000000000e841a88d10493f301af54c5fe07a31ef90de106a6c87d5631b6967fd017f561a56176a5f3544dbb34b9f94040ebd2770000000000000000000000000000000001bde3c0076f26973651cedd3da97c7eda24451bda856026d1e22d3b65c66a3fcbfbf506b4b664b5fc06fca2d712d8a8000000000000000000000000000000000ce553ee3b7d5389798cdc5af8569aaf477b5b74ca1138454dc61badcf3ecf5e0ee8457e374b5735d0b8408b04fdbcdd", + "Name": "matter_g2_add_95", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000010d48bf523f3909cf90aa58a9517ef5421f1212accd5e8a0f830aeb15a587e215ca9c340bb846b1d0474e43840b2af79000000000000000000000000000000000cc1a3976caf97b9d59f448f6d9f413eef8904f360c0cf912fe942b38d7fcc637a17038973a133608ae769d3e389b18a00000000000000000000000000000000069a6122c6f0ec68834b7617c755a7eb33a80a25acf95859da5ff03316447182f122d20d993b04e79b6fe859b7adf5a8000000000000000000000000000000000058c6f8c297524319bae6722e0a957d1ba0f75ee3a8aaf06148641c67925d15780e419a38ed7e07410e82769da74f2d00000000000000000000000000000000030dfbb89bbe5c14a7a55e68edc4fc38eaee9fb539a6b2f941264c7dc295da5712b0af0f2bbcdb74f785dc9ba038b0aa00000000000000000000000000000000132b4e02fda605a69251a4a6289c47536f9735dd90908ed1fb619b3ab808b3a1f1ca3fcc8f4b35c9864ae311c15747f80000000000000000000000000000000005858ece0bb09e55e012450551025ad2a6d93a15d29619433742851a62d987e7f8bfa6c6faed76493a27060ef5f51805000000000000000000000000000000000dd6b393e6d1b8d546e3f5ce69bc1737399e6ababc628f25734030e10d82b5e9370edfb5da15566d80e23d2fbf8aad5f", + "Expected": "00000000000000000000000000000000182f90f5d3ce3f5ff2d91430376144583247def83b3e83524094d57c0f1be98b1c4946964deccc25fc303d6450edfbac000000000000000000000000000000001844806f711735c5ca18ca48e559a9e327b87b91d22a5ef161da7874668130e21a9499728fbc2c88366bdb59f8ced0cf000000000000000000000000000000000815e7cff14b4ceaf26d1cda5c267f432fad294b6baa239b65d886ffb039321f9e24330ae738a35298c6d1ec1ce1c95f000000000000000000000000000000001188a4a2f0920ddeccde1a47a0636aa7c404fd77fb9c828e4fdb5406df80ee6c258c2d4a89dae5e2a2b05210df9100d7", + "Name": "matter_g2_add_96", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000156ca5e80be8c8c03a5506ce9abd22a9d4958c372678c0caf6f1329898507dfcb1f06a9464cf080bc6881fa5b7df1ebe00000000000000000000000000000000088174d486b4086b931010da298a399e15b60a113e08f571e096d3a4e94b57b3a684711318796eeca9319119b201abb30000000000000000000000000000000000b96ff68505c088cc03a1c2dc363b05bc8544728a12b29569bed137780523123eb17e68f4632383c252d81bca0c5ca9000000000000000000000000000000000486fc6e5224c5fad56234c41856e60bee4a6c1046f673bf7d5c1bbb603b141fc91074da5f9d3d41b796a2ebcebd9e740000000000000000000000000000000017032b16be8656cf23bfe0abc8c9e6aade223fa9bea6fe25f95a025da79cea6adf38536eae3859b25ad1af1756b639cd0000000000000000000000000000000010975ed27cefbb43bafad0fd14c87ada8e84525e1d199fdf1e77caa0b718214b33e547a42a040ee3bfd51621a20d22fd00000000000000000000000000000000133d29aa41f92de37523d281eebfe91103f017e5fb390f6bad9a2a4419fa4702bfa04847edbca1da96eb1ad563a92c8a00000000000000000000000000000000014af850de7e800ebee4be1a33c7e3b30aa94106db7defa148568ca3c8d82edc97ab5769ac40162d3728687cdac201a5", + "Expected": "000000000000000000000000000000000cf42f2ccff2e0cdda7e5f1d7652680650b4afa523c8f9a554ec18b905c837a189fff73982cbccf903ea492ea902b87f000000000000000000000000000000000d38219770f669557cdb623f2476b5f3f7478422b016123bf86a17bf75848548d1a1ce96a292637b8d52481321d80fbe00000000000000000000000000000000170d8722b824e3291b570ba8e4f9279c1dccdefb95cb5b7a94d27ad8a93513737f12d18ef3153c4e12b530bc457af34100000000000000000000000000000000021aee9e5f578328caee3177a4e08303c3b5533e288dcb75f94992db3520a6da16f4201e60367240b29c48d175942cef", + "Name": "matter_g2_add_97", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000121fe97c62e068988ebff21d8129d52aa903afdbb62862c7fd99564d9ad72182ab1f3a1100223ae486cd76f6938e123f000000000000000000000000000000000968ddedb04f52140160061828b5f88dfd09aaf37df625ee6f66b9500d6608df31c7edf86296eccf8f9918b051a5e4df000000000000000000000000000000000b7491cb8f6252e3861d7160feb0afdd736d27886863ec0909a7cc711a9b71aace18b17a00a2999dd57ca1a74f148516000000000000000000000000000000000fdb280093ef45b12b694ca3390a865ee18e4c04b231e2c98cc28706d4cefaf4e654582ee03f34ecf1dfa9674489d55300000000000000000000000000000000185aefe71f24281e5b03dd41e6d6d45fbc8975beb175118de7568bff0a9ccf917e9df97dc26bca16e8da06b0e9a8e7bb000000000000000000000000000000000015b326d401b827fdf556e4a24a3dd6c8036b1c849751b5ae3c3728cad88f931b06e3a345523a723481193f7afeb67800000000000000000000000000000000054ca16b4c87293002c31e64ad303e8f040e11de8b45c5fb9aca9dbec59b29dfda8532a8ef5ae6a92ac8ea90ee4303e0000000000000000000000000000000000b65a233a7731366cf24c801724265215a8626b1290d86c60bf1e74b021b0b44d7d6552f936fac7b5e60cf1feaa1d82f", + "Expected": "0000000000000000000000000000000010d1b2f595166929347e06c1debefead06334f554dc31f320cb844abdb1810b5f7c4b933ff8072dc03d303f4a6d0d09b0000000000000000000000000000000013ab41dfca0a7cb0c58c2c19e02f675a94d9e73312cfe2999dbac34e6a80bff9472506b48690f24ad3171ad495f445420000000000000000000000000000000015bfd0db53fd4da538caa3aee7a90a669cb84460365696ee79b190d09a6d4c3f08965de7fff4efeae435db52b97d213b000000000000000000000000000000000182ffc4304b911b47b092ab678edd63ed5f5e8a9069daf9247f3bf9c0dd149cc9992728a13b0a236fc9b37714b35882", + "Name": "matter_g2_add_98", + "Gas": 4500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000010d001a09cf5dc3276482185f26ef3f75d28cd6d2667eb08a7fe06c03b99f3b6c4d82390739b6867a314291cc642a8b2000000000000000000000000000000000587846a460b1f37c2e7f491f9a097b4e86e1943d9cd0999313f65627b3907f09b5d5ac1be376a313a959dd136f7e9b3000000000000000000000000000000000af439695556e86b102926d3b40e3e54cc84464e120de3b4e3c5541a6a5bca44151fb0594009663764c1824518b13f020000000000000000000000000000000003bfd9418c1e57269e222152d321b83ae090f216cb422956dd1fcc464f68526cb4a05cdaefc7bbe6e81d4ffe27d64db400000000000000000000000000000000085dd8bfc00ba517dc8d7ddb49d711d35bd36f9fe3843689019e779624a032d2f023533b8184b73042d1a1953d2885e50000000000000000000000000000000009ba8d5d36e6efe02097a3206bbed68529f0cb9875ab81deafd886d9243bfec8b403d2abe713a2ec929b93305dd2da220000000000000000000000000000000007f8f90ebb2771136a92023901ca85e87fb7c8b1a40f88ae564a124bdd0ff0bc27ea98612a817e2c871fb4bcea3bb06600000000000000000000000000000000152de417d02f1d14e5899201db8fd5db8ecb40ea8d415dcdedce8ac70c28d851db68e9aef94506a50ec28145547a2d68", + "Expected": "0000000000000000000000000000000017555399f979745302f08210de5311a6401b6b181100b3bc6b6d450f0f62079d2f02d7badcb164f50dfc46a975cbd6720000000000000000000000000000000014aea86c06e4c1fbf0711a8cfced2544c7624abc7ae7906cd992bdf575a702540c45c2117e221446ba09960cbc9048ac0000000000000000000000000000000002fac56960c4989a84e02ce36e8970c2e847ee45579d31ca77f042bf96505af574af822da084ae64b22ff876610ba9a5000000000000000000000000000000000a481cfea2aef8975c80a297ce5a185dacd25649d41f8466d3c63d786e3c264a8e4ccab5ef6b80ab1260e86ab6d5b3f3", + "Name": "matter_g2_add_99", + "Gas": 4500, + "NoBenchmark": false + } +] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/precompiles/blsG2Mul.json b/x/evm/core/vm/testdata/precompiles/blsG2Mul.json new file mode 100644 index 0000000000..886b0c6adf --- /dev/null +++ b/x/evm/core/vm/testdata/precompiles/blsG2Mul.json @@ -0,0 +1,730 @@ +[ + { + "Input": "00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be0000000000000000000000000000000000000000000000000000000000000000", + "Expected": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "Name": "bls_g2mul_(0*g2=inf)", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011", + "Expected": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "Name": "bls_g2mul_(x*inf=inf)", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be0000000000000000000000000000000000000000000000000000000000000000", + "Expected": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "Name": "bls_g2mul_(1*g2=g2)", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be0000000000000000000000000000000000000000000000000000000000000011", + "Expected": "000000000000000000000000000000000ef786ebdcda12e142a32f091307f2fedf52f6c36beb278b0007a03ad81bf9fee3710a04928e43e541d02c9be44722e8000000000000000000000000000000000d05ceb0be53d2624a796a7a033aec59d9463c18d672c451ec4f2e679daef882cab7d8dd88789065156a1340ca9d426500000000000000000000000000000000118ed350274bc45e63eaaa4b8ddf119b3bf38418b5b9748597edfc456d9bc3e864ec7283426e840fd29fa84e7d89c934000000000000000000000000000000001594b866a28946b6d444bf0481558812769ea3222f5dfc961ca33e78e0ea62ee8ba63fd1ece9cc3e315abfa96d536944", + "Name": "bls_g2mul_(17*g2)", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000039b10ccd664da6f273ea134bb55ee48f09ba585a7e2bb95b5aec610631ac49810d5d616f67ba0147e6d1be476ea220e0000000000000000000000000000000000fbcdff4e48e07d1f73ec42fe7eb026f5c30407cfd2f22bbbfe5b2a09e8a7bb4884178cb6afd1c95f80e646929d30040000000000000000000000000000000001ed3b0e71acb0adbf44643374edbf4405af87cfc0507db7e8978889c6c3afbe9754d1182e98ac3060d64994d31ef576000000000000000000000000000000001681a2bf65b83be5a2ca50430949b6e2a099977482e9405b593f34d2ed877a3f0d1bddc37d0cec4d59d7df74b2b8f2dfb3c940fe79b6966489b527955de7599194a9ac69a6ff58b8d99e7b1084f0464e", + "Expected": "0000000000000000000000000000000006334ba1e361fd94bbd98f44b75ae9ec00ecb4d3467b5528870b1a1fa9a7d04449f12af90bd4c7a1e3f29e717d6d19d3000000000000000000000000000000000bf4cc1626393956915845ea7ca43d30a59c7196fbe309f2d5ee6de7e40c191d29821dd6aae46abecf634b904de8f7490000000000000000000000000000000014aeb09e252cc74610ab956057d4ac5af95cbea8a6baba9e5062643dc037d6841044cb38b22d7dfb978fe0b58f94cc3a0000000000000000000000000000000000fdcd73452fc1ced1c06e6271410a48dea05afbe889a692905e1baab8d72418c62531aab8b74842b51016f0a9cbb93d", + "Name": "matter_g2_mul_0", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000018c0ada6351b70661f053365deae56910798bd2ace6e2bf6ba4192d1a229967f6af6ca1c9a8a11ebc0a232344ee0f6d6000000000000000000000000000000000cc70a587f4652039d8117b6103858adcd9728f6aebe230578389a62da0042b7623b1c0436734f463cfdd187d20903240000000000000000000000000000000009f50bd7beedb23328818f9ffdafdb6da6a4dd80c5a9048ab8b154df3cad938ccede829f1156f769d9e149791e8e0cd900000000000000000000000000000000079ba50d2511631b20b6d6f3841e616e9d11b68ec3368cd60129d9d4787ab56c4e9145a38927e51c9cd6271d493d93884d0e25bf3f6fc9f4da25d21fdc71773f1947b7a8a775b8177f7eca990b05b71d", + "Expected": "0000000000000000000000000000000010e70bef8eb893377e7ff92168d7acef11c9efab990fbded728b173b94e1d99e471a8357f16625d353287086543551850000000000000000000000000000000014043c1f00221c439e5febd12724a9224bccf0389914461644daf329208e869b1bf149880dccebccd440b1748d15e944000000000000000000000000000000000f7dee1e7d122e410b29a9eb011ee700c2f230cf8f611e196ec66e153c1fc331175532a8f9b060b573bddaa705430c2e000000000000000000000000000000000e1f659470eab7c0741bc8777ac9fc8dcd11a6f1b30ffb4265e96b879e795a4dbf851d1149429dcab95464e89f334627", + "Name": "matter_g2_mul_1", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000003632695b09dbf86163909d2bb25995b36ad1d137cf252860fd4bb6c95749e19eb0c1383e9d2f93f2791cb0cf6c8ed9d000000000000000000000000000000001688a855609b0bbff4452d146396558ff18777f329fd4f76a96859dabfc6a6f6977c2496280dbe3b1f8923990c1d6407000000000000000000000000000000000c8567fee05d05af279adc67179468a29d7520b067dbb348ee315a99504f70a206538b81a457cce855f4851ad48b7e80000000000000000000000000000000001238dcdfa80ea46e1500026ea5feadb421de4409f4992ffbf5ae59fa67fd82f38452642a50261b849e74b4a33eed70cc973f40c12c92b703d7b7848ef8b4466d40823aad3943a312b57432b91ff68be1", + "Expected": "00000000000000000000000000000000119a5147fe9ddca7123f721b5662c1a44b0964c37a214cdf3a4fd34166e3b25210344e65220c38ec84d0e3b5ccc7e46d000000000000000000000000000000001642dad5dacf4295b871fe9b2787f0861f158807b2b6c01c2dce12ab053c9472bd3cb98de5dc33f40053ff45ce5c9af40000000000000000000000000000000005bb5761602b6639f2ecaf79f2d1f853fbdf75f4b3852b90808b858993a83f8a0da8a2ce7072aa91e3b6b3ffd0b3d1e20000000000000000000000000000000000a75143b9551d4ae41fb8bd71fdba7826b994c65904d9189a5ac5130a59cbb9d8dee0e016735565148fc49823d3969e", + "Name": "matter_g2_mul_2", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000149704960cccf9d5ea414c73871e896b1d4cf0a946b0db72f5f2c5df98d2ec4f3adbbc14c78047961bc9620cb6cfb5900000000000000000000000000000000140c5d25e534fb1bfdc19ba4cecaabe619f6e0cd3d60b0f17dafd7bcd27b286d4f4477d00c5e1af22ee1a0c67fbf177c00000000000000000000000000000000029a1727041590b8459890de736df15c00d80ab007c3aee692ddcdf75790c9806d198e9f4502bec2f0a623491c3f877d0000000000000000000000000000000008a94c98baa9409151030d4fae2bd4a64c6f11ea3c99b9661fdaed226b9a7c2a7d609be34afda5d18b8911b6e015bf494c51f97bcdda93904ae26991b471e9ea942e2b5b8ed26055da11c58bc7b5002a", + "Expected": "0000000000000000000000000000000017ebc9446f8c8e17dfeddab9188d0c808565da29c0bdbbc4138a44ca3196c4564853be28286b66660cda36832d6940010000000000000000000000000000000007f29a9583b4ae83d3913dcd72590a3f20f39eb5a6d36663c1ef433058e76550085b9c01bf797d98d0eef45cc22ff8c50000000000000000000000000000000016eeaeb123b12d1913ff1e50f974228c79f2b995609d2e3835c8e1d68773b0cd484df57b86111cdb75de1e19eaf062e500000000000000000000000000000000002f5688c1286aed42309896bd65d1826dc64dda615238fa9043669806968b8e0e1e3e77ef192b7df540aaf0ed282a9a", + "Name": "matter_g2_mul_3", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001156d478661337478ab0cbc877a99d9e4d9824a2b3f605d41404d6b557b3ffabbf42635b0bbcb854cf9ed8b8637561a8000000000000000000000000000000001147ed317d5642e699787a7b47e6795c9a8943a34a694007e44f8654ba96390cf19f010dcf695e22c21874022c6ce291000000000000000000000000000000000c6dccdf920fd5e7fae284115511952633744c6ad94120d9cae6acda8a7c23c48bd912cba6c38de5159587e1e6cad519000000000000000000000000000000001944227d462bc2e5dcc6f6db0f83dad411ba8895262836f975b2b91e06fd0e2138862162acc04e9e65050b34ccbd1a4e8964d5867927bc3e35a0b4c457482373969bff5edff8a781d65573e07fd87b89", + "Expected": "00000000000000000000000000000000042d0c1941ae0ed5e8787437ad5e2753bba02185317848e8ec2e425ac954e0efb1bca534725adfe87e8507851ee337af0000000000000000000000000000000002db55ae8126cbe86327aab880381a81205e33a351d172c883b9cc184799866a8db5a6b4321496e05d3ef62d00416d9a0000000000000000000000000000000012c45444403dd62d7be3e7658dd85909204751dd7d085f6edd38c0aa9185d3c32407d8c95bba371b380f788d0dc48e0900000000000000000000000000000000111421c6dd0db595ab731adfb4bc76c84a61197cb023b6f17e7176c443f20a4b6f8cd0a00cfa61e831ed20b3c6a84d98", + "Name": "matter_g2_mul_4", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000019c31e3ab8cc9c920aa8f56371f133b6cb8d7b0b74b23c0c7201aca79e5ae69dc01f1f74d2492dcb081895b17d106b4e000000000000000000000000000000001789b0d371bd63077ccde3dbbebf3531368feb775bced187fb31cc6821481664600978e323ff21085b8c08e0f21daf72000000000000000000000000000000000009eacfe8f4a2a9bae6573424d07f42bd6af8a9d55f71476a7e3c7a4b2b898550c1e72ec13afd4eff22421a03af1d31000000000000000000000000000000000410bd4ea74dcfa33f2976aa1b571c67cbb596ab10f76a8aaf4548f1097e55b3373bff02683f806cb84e1e0e877819e2787c38b944eadbd03fd3187f450571740f6cd00e5b2e560165846eb800e5c944", + "Expected": "000000000000000000000000000000000ccdb2a0b670f199a9b61198e6a2ce2117075733e6a1568c53ca493dc3674c6ae85be2491d2ed983f52e2c7040824afc0000000000000000000000000000000004f52450d7e041c561c00200d5b142b32f2df2e2156e4f6c15d6c00e185e135037a1ed6be15e2ed920daa00e2f9bc8da000000000000000000000000000000000f39c38c18f03ce6baf1d016cf32d7387269940280f2e8d21db4da33dbd2d24ebb93ae3dff9f79b015eee25813d677c700000000000000000000000000000000189df61f7f1025fa6fdd0a4708ff1d53db7d414019c4828de2520af3d36776062350061c2261e46e746a6475fdeccb2b", + "Name": "matter_g2_mul_5", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000147f09986691f2e57073378e8bfd58804241eed7934f6adfe6d0a6bac4da0b738495778a303e52113e1c80e698476d50000000000000000000000000000000000762348b84c92a8ca6de319cf1f8f11db296a71b90fe13e1e4bcd25903829c00a5d2ad4b1c8d98c37eaad7e042ab023d0000000000000000000000000000000011d1d94530d4a2daf0e902a5c3382cd135938557f94b04bccea5e16ea089c5e020e13524c854a316662bd68784fe31f300000000000000000000000000000000070828522bec75b6a492fd9bca7b54dac6fbbf4f0bc3179d312bb65c647439e3868e4d5b21af5a64c93aeee8a9b7e46eaaee7ae2a237e8e53560c79e7baa9adf9c00a0ea4d6f514e7a6832eb15cef1e1", + "Expected": "000000000000000000000000000000001388a59c57ec8ca5e68b99631abdafca1b71352ac35003a55bbc415b48b8171857adda31123ec86a6ed9e1060d56aa67000000000000000000000000000000001471913b1ab5bcf9336665d3d44232b4e58da70285b7b8eb1dfd7c54442afb28c339f56e6389f89b84db0879e1ee058300000000000000000000000000000000022101b4de40b7180ea17bb36bad0a668a8def3e7361a96fbfabcfc4cdbe6f607ee4ee80d0eb2418b848ad056520092900000000000000000000000000000000103cda694792af5a51e04b6422600a0ea6f50808ca54423cd4f59dfba633daa5afea49c85b900f52e182610efb62fe7d", + "Name": "matter_g2_mul_6", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000690a0869204c8dced5ba0ce13554b2703a3f18afb8fa8fa1c457d79c58fdc25471ae85bafad52e506fc1917fc3becff0000000000000000000000000000000010f7dbb16f8571ede1cec79e3f9ea03ae6468d7285984713f19607f5cab902b9a6b7cbcfd900be5c2e407cc093ea0e6700000000000000000000000000000000151caf87968433cb1f85fc1854c57049be22c26497a86bfbd66a2b3af121d894dba8004a17c6ff96a5843c2719fa32d10000000000000000000000000000000011f0270f2b039409f70392879bcc2c67c836c100cf9883d3dc48d7adbcd52037d270539e863a951acd47ecaa1ca4db12dac6ed3ef45c1d7d3028f0f89e5458797996d3294b95bebe049b76c7d0db317c", + "Expected": "000000000000000000000000000000000cf5cb957a752ce9187940f63b13080790348814debf84b91e74fd6e822c2735941d61d50d492439475bb3ea7aa849ec00000000000000000000000000000000012e546ff33dee9875510a68301f46d89e6175f5cd9a6e179fb8599a580e9478fb8d92038982551dd29041d8185c7474000000000000000000000000000000000d52fb57bf2996dbbacdbcb4088df38e77e25598b91bcd5e41eaa27b1398eac150586b142f068d5b498e0ce458d3e8950000000000000000000000000000000012295e1d1039abe7a5fea51a04a34e9e8d44a0f24b8c032680703c119d54274d3bc2e548854021ab027b693e43964314", + "Name": "matter_g2_mul_7", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000017fae043c8fd4c520a90d4a6bd95f5b0484acc279b899e7b1d8f7f7831cc6ba37cd5965c4dc674768f5805842d433af30000000000000000000000000000000008ddd7b41b8fa4d29fb931830f29b46f4015ec202d51cb969d7c832aafc0995c875cd45eff4a083e2d5ecb5ad185b64f0000000000000000000000000000000015d384ab7e52420b83a69827257cb52b00f0199ed2240a142812b46cf67e92b99942ac59fb9f9efd7dd822f5a36c799f00000000000000000000000000000000074b3a16a9cc4be9da0ac8e2e7003d9c1ec89244d2c33441b31af76716cce439f805843a9a44701203231efdca551d5bbb30985756c3ca075114c92f231575d6befafe4084517f1166a47376867bd108", + "Expected": "0000000000000000000000000000000008e4c57309339400ac9b6b5df16972c272d47cf69ba7baf89afa4f4e72703999c5885253cc35686f6c8d277399da2a390000000000000000000000000000000018ad4e1f105f16b0dbb4eb089c51e709c25e407e54b64346224b1abbe15d62fabb231e36a69eb05a9ba7860f772634200000000000000000000000000000000019994d20a7ecc0f234ccb6b1793fa7d1ece64b3e157c579fb05a8c6cfcdd6f5456ac1f4c1beadb69206988ab543bb8bb000000000000000000000000000000000d435e74bed382442ab83ec90dffb91336137932524bfcf9753fa5ddfe038d0b98a045c8ec9deb53172e5662d3fd67e6", + "Name": "matter_g2_mul_8", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000e25365988664e8b6ade2e5a40da49c11ff1e084cc0f8dca51f0d0578555d39e3617c8cadb2abc2633b28c5895ab0a9e00000000000000000000000000000000169f5fd768152169c403475dee475576fd2cc3788179453b0039ff3cb1b7a5a0fff8f82d03f56e65cad579218486c3b600000000000000000000000000000000087ccd7f92032febc1f75c7115111ede4acbb2e429cbccf3959524d0b79c449d431ff65485e1aecb442b53fec80ecb4000000000000000000000000000000000135d63f264360003b2eb28f126c6621a40088c6eb15acc4aea89d6068e9d5a47f842aa4b4300f5cda5cc5831edb81596fb730105809f64ea522983d6bbb62f7e2e8cbf702685e9be10e2ef71f8187672", + "Expected": "000000000000000000000000000000001425890b6c46c5a07a79127de4ddbb751227dca4481ab7c2f601bf22b8f6a149767c73bfbf57ee399c0f2d0b12852a0a0000000000000000000000000000000012cce15f53fdfffb5f71de3567b0c0adea65b9321c85677c574787f7048c1bb5e2dc985b65fbc48115aa129e6000fe4100000000000000000000000000000000041398497f975289fb9fc6ffe671a19fdcd3753c82ffd3b2084574107bf7fadc8de462507f4484c32df39967c3751a480000000000000000000000000000000007514a7f246006e714d4a8cbb4e89d81b951b5c41a05bcf35f61283e888074fb3686fb6ecc1a66e491ea1e1ce0738102", + "Name": "matter_g2_mul_9", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000159da74f15e4c614b418997f81a1b8a3d9eb8dd80d94b5bad664bff271bb0f2d8f3c4ceb947dc6300d5003a2f7d7a829000000000000000000000000000000000cdd4d1d4666f385dd54052cf5c1966328403251bebb29f0d553a9a96b5ade350c8493270e9b5282d8a06f9fa8d7b1d900000000000000000000000000000000189f8d3c94fdaa72cc67a7f93d35f91e22206ff9e97eed9601196c28d45b69c802ae92bcbf582754717b0355e08d37c000000000000000000000000000000000054b0a282610f108fc7f6736b8c22c8778d082bf4b0d0abca5a228198eba6a868910dd5c5c440036968e977955054196b6a9408625b0ca8fcbfb21d34eec2d8e24e9a30d2d3b32d7a37d110b13afbfea", + "Expected": "000000000000000000000000000000000b24adeb2ca184c9646cb39f45e0cf8711e10bf308ddae06519562b0af3b43be44c2fcb90622726f7446ed690551d30e00000000000000000000000000000000069467c3edc19416067f572c51740ba8e0e7380121ade98e38ce26d907a2bf3a4e82af2bd195b6c3b7c9b29218880531000000000000000000000000000000000eb8c90d0727511be53ffcb6f3b144c07983ed4b76d31ab003e45b37c7bc1066910f5e29f5adad5757af979dd0d8351d0000000000000000000000000000000004760f8d814189dcd893949797a3c4f56f2b60964bba3a4fc741e7ead05eb886787b2502fc64b20363eeba44e65d0ca0", + "Name": "matter_g2_mul_10", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000f29b0d2b6e3466668e1328048e8dbc782c1111ab8cbe718c85d58ded992d97ca8ba20b9d048feb6ed0aa1b4139d02d3000000000000000000000000000000000d1f0dae940b99fbfc6e4a58480cac8c4e6b2fe33ce6f39c7ac1671046ce94d9e16cba2bb62c6749ef73d45bea21501a000000000000000000000000000000001902ccece1c0c763fd06934a76d1f2f056563ae6d8592bafd589cfebd6f057726fd908614ccd6518a21c66ecc2f78b660000000000000000000000000000000017f6b113f8872c3187d20b0c765d73b850b54244a719cf461fb318796c0b8f310b5490959f9d9187f99c8ed3e25e42a93b77283d0a7bb9e17a27e66851792fdd605cc0a339028b8985390fd024374c76", + "Expected": "00000000000000000000000000000000048ea2c854a0df7b10a2147db6eabcb16eba340644f737fc99663d1ef26d8ed688c2baaa7d7699c5f540d7605eb48485000000000000000000000000000000000c959efb835d48d3e7a8ce643764f27c365f6248a88e39092e3a6498f04ed851c55b796dacd62ae73d7edf23aa45fefc00000000000000000000000000000000114337b8caa68cea6f22a25c0ce3b247cadae24c63fb02c6a98a728b54f97b12b1473c8e23f55338326b9575a637bb2e00000000000000000000000000000000033167b0668ec650581815cefab61d13661f4cbc6e01711af0aefb699e1979b551d0031c603ee5f6dd4f716ea7aa4a6e", + "Name": "matter_g2_mul_11", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000576b8cf1e69efdc277465c344cadf7f8cceffacbeca83821f3ff81717308b97f4ac046f1926e7c2eb42677d7afc257c000000000000000000000000000000000cc1524531e96f3c00e4250dd351aedb5a4c3184aff52ec8c13d470068f5967f3674fe173ee239933e67501a9decc6680000000000000000000000000000000001610cfcaea414c241b44cf6f3cc319dcb51d6b8de29c8a6869ff7c1ebb7b747d881e922b42e8fab96bde7cf23e8e4cd0000000000000000000000000000000017d4444dc8b6893b681cf10dac8169054f9d2f61d3dd5fd785ae7afa49d18ebbde9ce8dde5641adc6b38173173459836dd994eae929aee7428fdda2e44f8cb12b10b91c83b22abc8bbb561310b62257c", + "Expected": "00000000000000000000000000000000142f6b71471f3665ee6269cf598fc3587a62523f9753eec48a2461a2e313e376828cf6d1a9ffc9e64353c8a668718736000000000000000000000000000000000153647cc4a5aeb8ea52f845c415651e167ace9f331c1d73eccbbe20a4014f9e1158c281495206de4b841839438a595500000000000000000000000000000000151d07c3f83217e63b332a6c47e91ef2418e9c658353f8b644f23266f5fbc727562f0935b4d892db947cfbd0757ed61500000000000000000000000000000000035bce4bd2d8261e21476c325cb68e581f20513eb5e0e6a0ddbfd4ac4674bc323590b6f52d0cd50010c13642e7e03daa", + "Name": "matter_g2_mul_12", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000ca8f961f86ee6c46fc88fbbf721ba760186f13cd4cce743f19dc60a89fd985cb3feee34dcc4656735a326f515a729e400000000000000000000000000000000174baf466b809b1155d524050f7ee58c7c5cf728c674e0ce549f5551047a4479ca15bdf69b403b03fa74eb1b26bbff6c0000000000000000000000000000000000e8c8b587c171b1b292779abfef57202ed29e7fe94ade9634ec5a2b3b4692a4f3c15468e3f6418b144674be70780d5b000000000000000000000000000000001865e99cf97d88bdf56dae32314eb32295c39a1e755cd7d1478bea8520b9ff21c39b683b92ae15568420c390c42b123b7010b134989c8368c7f831f9dd9f9a890e2c1435681107414f2e8637153bbf6a", + "Expected": "0000000000000000000000000000000014e83f87e7f66d8ed880ca46a76a5d3bbbacf2dafe1ee055f04af568738f4c6ddf2a93e1810b616da6f64f25c35a7b5a0000000000000000000000000000000003d14447254b61168d36f92710f95f7100cc8f278b0bc9528da763a18a5386b3f5b83b96f4dc426e4b0fbe755bc986790000000000000000000000000000000017f1a79ed64abfe5e960fda02cf3330e6ef5612c1b8639386959f86c970adb797bf077a468273d37996a65685f75ac30000000000000000000000000000000000d973499a7bf7132541c0976bf2e9bb26a2b6cfa5bda720352fa7a180a6b8fe95befcc13de5a2efe58be934cf7d8e664", + "Name": "matter_g2_mul_13", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000017eccd446f10018219a1bd111b8786cf9febd49f9e7e754e82dd155ead59b819f0f20e42f4635d5044ec5d550d847623000000000000000000000000000000000403969d2b8f914ff2ea3bf902782642e2c6157bd2a343acf60ff9125b48b558d990a74c6d4d6398e7a3cc2a16037346000000000000000000000000000000000bd45f61f142bd78619fb520715320eb5e6ebafa8b078ce796ba62fe1a549d5fb9df57e92d8d2795988eb6ae18cf9d9300000000000000000000000000000000097db1314e064b8e670ec286958f17065bce644cf240ab1b1b220504560d36a0b43fc18453ff3a2bb315e219965f5bd394c68bc8d91ac8c489ee87dbfc4b94c93c8bbd5fc04c27db8b02303f3a659054", + "Expected": "0000000000000000000000000000000018bb69dd6db0beb468242265c382de5ac342d465b5f72d4e5a24c67a48272d9a1f3af28e0bd3712e16a854c5d91c616b00000000000000000000000000000000072fbcc86b7dee9c2dc177dbabdbbbddb630c98ac3bf3737fd22f99e2b2b690175d9c5aa4b577f78c545dc6a5d2d03c900000000000000000000000000000000161c4218143ab1f0387f19bccdcd08f9caeb2d1331ca890741799ff1b40533076b6a96a910714176c770b25d2c17715300000000000000000000000000000000063098cd9d1eeb899724b40a2d10ac951ba0277db09aad639957f58541dd391fffadc5d97833bb9666b054e12debfa92", + "Name": "matter_g2_mul_14", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000018244ab39a716e252cbfb986c7958b371e29ea9190010d1f5e1cfdb6ce4822d4055c37cd411fc9a0c46d728f2c13ecf0000000000000000000000000000000001985d3c667c8d68c9adb92bdc7a8af959c17146544997d97116120a0f55366bd7ad7ffa28d93ee51222ff9222779675000000000000000000000000000000000c70fd4e3c8f2a451f83fb6c046431b38251b7bae44cf8d36df69a03e2d3ce6137498523fcf0bcf29b5d69e8f265e24d00000000000000000000000000000000047b9163a218f7654a72e0d7c651a2cf7fd95e9784a59e0bf119d081de6c0465d374a55fbc1eff9828c9fd29abf4c4bdb3682accc3939283b870357cf83683350baf73aa0d3d68bda82a0f6ae7e51746", + "Expected": "000000000000000000000000000000000e43672f1bc25e7e0e64a3fd26cb246bdbd6fb5c9084afdc87c888634916e6a6cc9a351cc67a6ac77ab8e132ed6cbee3000000000000000000000000000000000dee9612527c8ee9c574a4c51f5d3504ccf1d5781b59c78ea15294332c6acfdcc7bc68853e70f1f72524c930e4c3d2eb0000000000000000000000000000000017eba629eb14a0636926275f1c2109318ce8818d8171c69fd371751b6de47bda5b00a0b0e3765d05bab7b8dea9add90900000000000000000000000000000000052f0a4cd9b91695e1e58ead1da1480fef08cecef63896aa51ab16da373b99b3b91767a374645ac5932d9c7fd21d4636", + "Name": "matter_g2_mul_15", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000000eb3c91515d4a41209a73564741a8ccf901a624df9db22e195a5d02d24b7bc0a12756b15b8d006cb991a7e088eaef1000000000000000000000000000000000704ce8afc808b0161f6f61b22d990d713ae398779e6e74e9b5771daf006ce0bba3a8088edf75156f0e48b92ee8409b00000000000000000000000000000000018fe81e05aff0620f4bdbe4a715e015650497afab62921eba0ab86b649e5a2fd3d54041868928519f537e36448688a0d00000000000000000000000000000000162bd97161201ea3c26f8dd1204a9c6b61b762bdf573cb5d20b6b255f30208ca7d96aa47b46fb8c6bf0922075f1c1ca807f80a5e502f63375d672379584e11e41d58d2ed58f3e5c3f67d9ea1138493cf", + "Expected": "0000000000000000000000000000000019b7ea673dad96c8352870136ea262c9ed105550cb403eb1e64ad598b2145fe1b95e5d61f1b5a6ebec47568c67b68086000000000000000000000000000000000f06ff9bcf2ba284e705b12ef2311f1a9b867ed742ee0737567b5c878547b18394b82c2bb97e16586515728245692cef0000000000000000000000000000000019dfd2d8fc4f2c989c7e1016e147f336174c84d380bab992bf1adbffe96d93d4d2d1d1dacdba3adfaf283b184478229800000000000000000000000000000000068d230422006004cd88ab0dd46a84af3905c7a1d329446cc23c1c5adb401a86a9fa76aaf577f77c2678cd8de8685ed4", + "Name": "matter_g2_mul_16", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000135aee0e30fbcad798738c10d4aebcdf50c89ce516325f655fe763dce54ffedf94dd74168611e5ae879b5bf5598d62dc000000000000000000000000000000000c728e672cd8b3bf9341bca929c34118b566cd3a80452d7015bee9d5cdc001b1f5c678d4b2cc4f7cac353e7bf326ca1e0000000000000000000000000000000014809aa22e2051e463fba6d49fbb060d0c7f599a0fc5409d34e71f34817e7beb1251810ae6eee1848c60796fb8647dea00000000000000000000000000000000145a4de777d86025d50e12f9a6615ecb9bdd41489992d1b643dd9aa549acbc63b04b0bdfd14b6e45c70f165e9a8c91bebb169138f94093d5c1c6b253cc001ce8baf78858dae053173fa812d2d1c800da", + "Expected": "0000000000000000000000000000000015ffdd83355978ebfc386e13987effac0137ec628fff1667ede29cfcbd05e31cf8323959dd0247c20cf28978dc242c790000000000000000000000000000000016b1f810da2ae3c2ffbb6b83c47ef03eb0f298ff4c304ab0dd7b97207949d62858458d789c86c0cd474c34fa720ad3b70000000000000000000000000000000002a2e1463d5e795e6a25998a848b079363efc7d0337c3803385f4f17f11726b04108adfd87a811d709cbb6750c969526000000000000000000000000000000000289a3f472799c06a84bb1f377a36bad910220e1017884545159fe1b2505e8e7473882fcf324ba0d9125495bcbbc7226", + "Name": "matter_g2_mul_17", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000009a58b7116dbd6f550f8ca98071813130ecaa9ea86d5275eebc36860690fa048c9ebeb46600b2b63e847bff3e38ed0d00000000000000000000000000000000113ffc0932c041e0e34b2540c485eb74f5029b339cb60bc88a8a749310f33f330dea137e5f340044fd689264af66696d0000000000000000000000000000000002642da3c2c7b6688aba0b19ab29ac72e35caafa044863c364ea8833fca850289de52c0963bc33d7bba40cb5f568718a000000000000000000000000000000000552d35ca054da2f148c119454f6760607b351f2441921a2be17da2cc10902d71571c5554f132e60df79679428fa07e3e40608bdaf3e7764358a64a920cbb33ab4d571c7b3092e1ae11d9697f82ed833", + "Expected": "000000000000000000000000000000000b02ddcfbf391a2d6953261c786945093b09377352473a86cfac6456a811233809434b566b9301eea3105eb86922efcc0000000000000000000000000000000015430deba91113b841303120f0738012d77207e9408474998df5e68d0d61f1a64afb947ff93116ae766ca5325046e263000000000000000000000000000000000ab7094055919f6f707b458cda552f25104d95e4ec8d020ea4c17ac1d7efef5c4c3a769120718f1d5171eb8630a3018200000000000000000000000000000000161e7209f8c98e511a698fbf01735798cb632ae1afe00870654ffa0ba93a549edf4b97d60f03974ab0964cd39298401f", + "Name": "matter_g2_mul_18", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000018fbbcba3d4b1e548ceaec4a48db62a2420ff29a67af332ee7ea3f902f84e6c375fd33abc33d945c5bca25603979f9a400000000000000000000000000000000072ff416994364bdc6535f36c82212afa822cd94fade69f11eb38dbdcd37c7e22af55fe05e6a826dad822073656eaac10000000000000000000000000000000017bba179b847278a4878b6faeaab3b1f4bd7540d22817cd9aff95557497f8b9d286657b6162c0f89f7820becc637dd550000000000000000000000000000000018e2bfed71aa9b11fefca2f0db8bd9b8c69540267de50bec4fc90a6e9741891465c9761d19282e1100b3707eeb598b31d411519f2a33b07f65e7d721950e0f0d5161c71a402810e46817627a17c56c0f", + "Expected": "0000000000000000000000000000000006cb218607a1f66ce361c89fd20edc3f00421611adc9aa52ec35d45e023174962c863f740ac36c984c2b466cfc4827a900000000000000000000000000000000152b22d46e9660da8b1be4c5b14da613731e750ff7eebaf879f7074bf3c33e1528a2c8479e0178707e3855b49f85f045000000000000000000000000000000000c928cf78cee2c8b9da8215d33d189c5636df1e8e9bdaf143aba7ed40f29490ca2328b4a20cfc56f62e4ce49d9e77f14000000000000000000000000000000001574b7a9c3931933160ad4eb17400b6297210db47bca034bc1b5d17a0cb8c41834636b9123e625e5eb0b01738cd6b9af", + "Name": "matter_g2_mul_19", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000019efd37727dfaedf697fcda7a59847dbda8ca7cdc92f34e68691d682e20ae6545ac104d6660fdb8f64a051e69298eae8000000000000000000000000000000001225ace0fdce456dd888c9672503b68ef77b2d11caf1265a767a6ea14911e3ca03fc153f18dfe9d95e0cc68b7b8a3a8d0000000000000000000000000000000008a6b059c1c4da046cc0b1b5d7f33270aceffa607daf6d0d078c06f940604e1a0b4adf01a4091306e3c7eddcf3d95101000000000000000000000000000000000f79bae5260a2f114ffbb9273f3049d3ebb002500a57ee0a7d157d86957f43f87a2e026fb9892dacaadca5ee04fc8e176bb3f9e512311699f110a5e6ae57e0a7d2caaa8f94e41ca71e4af069a93d08cc", + "Expected": "0000000000000000000000000000000003e17452a80996203fdc4037db072c452f9eb2dae689c77c88b299d7ba266d111ab2b9c4b24149968d72cd143a34fc4e0000000000000000000000000000000014a057d7a50c9b0f34712ff8008770080bfa671650fef43c82726257da180dfb9672b266d4c54d65fdc677d917e6c5b80000000000000000000000000000000013b452c980bfc4a484637b578be100753aee9dda9487d5ee5c017c689dda838fc673804369328192d780d60a9a3de0f700000000000000000000000000000000103aa86d1807de242a6d4fa4a49be6c91cd757df5808501acfca44940733c6a524b851ac962b99a9be41bfc8d6254478", + "Name": "matter_g2_mul_20", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000016d2b73eeceee17d3bff3aacac9df9ac1c4248d9ea7d6a503a757f7bb22fa6970bb6f5cb5ec154785f7252e1508b382e00000000000000000000000000000000081edc68bbd8db7b10be06ee23d090bd54f9ca07ef24dfed7df7bb05f8cc26e6889dbd40ea203fd5cca5cb588199f9e40000000000000000000000000000000010d3478508619ea9493b4330e2fb9150024cd32dc1378f824788a884a4a30fbf39c630f465557bf0c6d69b4cbecf89f9000000000000000000000000000000000f20c9b134db5d8b7756800c031bf5962fc560ba95d4bd9157b16179f1a37ae08696a2be455ad8d018aead6adcc69b712a0c988d97e86dccaeb8bd4e27f9e30fad5d5742202cdde17d800642db633c52", + "Expected": "0000000000000000000000000000000007c616472f9ac60f749979c6f870b587425d514395ed07558ed287fccabc77f0c90872f3885d0780bcdfffedd124eb3d0000000000000000000000000000000019531e9c25e84a2a968a85d9f1ab61a372ebc59ba5bb7a2bbb3c0d6e4c9d04061b28fdc719735e97ccd5f7243a58cdc70000000000000000000000000000000007772d3cff12bbee916a6569edce0c6dbc2bd8a794919a4dd7bc37024c8273245210511b8f6da551fe626b7b840833f300000000000000000000000000000000186a3e858a83a7ea1bfdaac65c2df1076059aaa193961559792373886c68acd2f9fca61b166a0ee55084a6ea122ec3e8", + "Name": "matter_g2_mul_21", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000003dce67181d23af9729e9fb0653d7f79c890fba27de42fada93123e112c4a468fa889921192db8047d86e4db77c60266000000000000000000000000000000000869a1e39d42d9bb0cc0568fdad16abbdac3194af893ebd8dd8f8c2c3c855abefa5fc215412168acadc88e658e83f5570000000000000000000000000000000001ef139a75194f3c4b1378c2b66dd304d179460bac0a289405cd8faa3ff66a7b6e54eb7b8742a68150b1e098630135c40000000000000000000000000000000003892b5a645af916be2c6c7fc0bb08fb5f39341d3c68598940554e1be11e1be75af920db0c8710ed13c78edbf683f17d0b299c14892e0519b0accfa17e1a758c8aae54794fb61549f1396395c967e1b1", + "Expected": "0000000000000000000000000000000008adebaa95d10b9fc0f1a1f0d52dd6741517d2ba23e3f9e7a9221039684ae226ea602dbb50df0efd44b2b5bf7495c0b50000000000000000000000000000000008e276e78ead2473602d37cb9f2f589f9c60514a1fc5c215acf487bf57c935467d29945d3d671b41a8e47c9495dbf5c9000000000000000000000000000000000fab06240cb8cbe9afcc4ebebde50c2881e4bc4d4f2ed09a1065e3620e6344fb3c5f3019250ca4edaeae4902abb7400d0000000000000000000000000000000003fa6c48ead374be1dd45c8417ca8234c15ddefc5039151e6cd7fb27f866e134cef2f59ac9b2ec1b26896eaec9213549", + "Name": "matter_g2_mul_22", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000264dd4b477f5db65edad28c7153ed919a863c5c5661e0125c5429b323e055fd69c33142dfc6ed9c87082e2be4675e1f00000000000000000000000000000000046ea088a2ec94d3a1f1f97949f1ebc49690c453d316cc46534fa253b34b30323b6071d147d64bb94e02fb4db07bb0c400000000000000000000000000000000013692a33bb1348486eec40a9e93a4ea3810c7b4d3188cd07e235a2c898aa87ee0d17682fd24f4d978f9fb028fd26e2900000000000000000000000000000000115f8b64c00cd5cd344a7b5edc0ef0bb85a3e8f0f9dfb28f8ffe12db3e0d222c2d45dcdba0fbdc161c5d558bc71aa0977064d43d6802ad4c3794705065f870263fef19b81604839c9dea8648388094e9", + "Expected": "000000000000000000000000000000001412bdb48546014adf3c4eac4dbe79ba700f90c8030b063828fb01be5977bd73107533a4e8030c8d9cbdde9bcf10649a00000000000000000000000000000000126d3e1006abfeddd810cb1e12c898cf5f543e414438e600ce4c94cd8dbd1e17c0f3b9831add397feda74362eeace6fb0000000000000000000000000000000005b3159638afa34f219513cbcbc51567b16fd5598b85e6ae0d232021133cec25a6269250df2ab7b5ace726e9e2fbf0b0000000000000000000000000000000000c35bfdd1c10e903da6d41e9afbe65b0cd66addd7893fde41dfda8e543a93938cdeab52cc9bbdbe61f93d651bd1c923d", + "Name": "matter_g2_mul_23", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000014c83d58d90db4821a0411fab45f83fbc05f7d0d7a67ce75da3ae568978d15f4c1886c6fa6086675c0045efb30d818400000000000000000000000000000000001e68691123451f4c3df6dae62c6a63855ec3597aae33a8a10ee274e902e9aab1460cc9c79726312df0ee0ce90c8d3c00000000000000000000000000000000018a39eb3e3c6c7fb8ee304e55d15e209afe2fe278dda93552a7b9f51fbd778da1502eb6775cbc3f832f8320fa0686240000000000000000000000000000000017c15910fad1ca5749aa82a5a2fa98b0ebb37e92912547fb1741f18c34e0d5fc3a307b928636c25f0320d71cb9d31062686285a0e22f177fe3adbfc435e9c1786752dcf3c11b723539789b0cdeb0647b", + "Expected": "000000000000000000000000000000000bcc781f144bc148687875789fd8c54dd820170984b6f8ae75855f7e45619c1d2ff85c330b7743e447b5fc831dce9277000000000000000000000000000000001409aaf3c94c9a6b5123c82a7f311af7c2f60e9b197d49fb5b010f84faff972151b383a83c106de43454f8097005f6c800000000000000000000000000000000064a91226da8b9cb587030f1f4afb0d422a51e4d55212f26c621abc06fc0c57a473a9be75518a5f4f9a7f8d4aaba69830000000000000000000000000000000002cf239343bb77865ceabfcc1fe34cc9be4a1ebc3a70f16f8b7cb84eed5843524f95673b01466d6cbb0d8d9dc00793e6", + "Name": "matter_g2_mul_24", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000fa96d9fe01c18732e8d6454df9bb1f482c4b9add837ce9c354c72d49c2d44ec694674aaf0e6d6a095cab7ebb57ccd9a0000000000000000000000000000000001f8ffe3fb7e9e311e0f6949c07c26a0febb181e37b2268bb5e125fc3a100323740d1ebaa5e635dba3770fdc2ce4ee860000000000000000000000000000000012ac42095fdb677720ab3f14bf0afc55c95b43d28d922a5f8cb0bd841306b978751d24546e3a6474976961d0768f29e9000000000000000000000000000000000baf9804d99039c9fe966a696c64bdacc9673b0906b4deab108d34fbbaa3b0905d50892278570564017b96828c7e1ac93176b6724cf984632daf95c869d56838ab2baef94be3a4bd15df2dd8e49a90a6", + "Expected": "0000000000000000000000000000000006bbdabfe104b62d22e78bc8f3446a86cd5f10c4c5a54501140768b55a7e6940b9952c9a90a14d8fdc7c04600195cd6500000000000000000000000000000000172e718c926cd393bf303984518432693c304a2758174dabba303ff4c0289b5bf5376b61e8821abab322d53e88f71d480000000000000000000000000000000000a2f84fbdb5b05107a0a340e81b56ddf6d03c23848448f841dc44f07cbf8a575289cf6d53986f581fddb0f2d07e38d70000000000000000000000000000000005cbc10f143a9a1fe23f670a4c47d385f5c7069d8c46580322d6939122b2d39d185d6a8c2e51e88a1d40fd2e82d08b8f", + "Name": "matter_g2_mul_25", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000014ce6d88a7c5c782562aa101550f1af487296adebd9dae8252698ba04fbd58b92e2216de6ffd474d5992f97d9f22800d000000000000000000000000000000000ce92a04f5c8a99ca0e93992448222519fc454bda5d1d8638a7bfde968386e4ba0dcd1da59cd81d4c4dca3e584be0275000000000000000000000000000000000cb570796f5c8f7b8aa02e76cb8e870d3365fe4dce5df07ec286a0a821f922b4003d5b69c0f1588206d9544013e268c400000000000000000000000000000000098056a033d9cdae86aac02de3a444471854b909680719154b44d4f55f30087294e39e57643c692d6da725b859239080d76db3dcb659eaf6c086be6b414a494dea4bd30aef8450ae639f473148c05b36", + "Expected": "0000000000000000000000000000000011769e191fe258ffd1922295a9fe877ad5a52fde6e343730f8f5ec6cdcd584f8ed1dbe0f55b5dd81f5f78b7437f02abd000000000000000000000000000000001253689089e9192d10a45342214425de36740c120e49f596d24658941ce2b2ecfb50e879be0125e3d159088f88e234f10000000000000000000000000000000017b642d1b5a953f47fff8f0649263f16f41a0ec0397d5a81571174aeb85431c352e2bf6bafa6894d2e6cdb5eafff16d40000000000000000000000000000000017b3438d0ddbd2ace1e63802013b5bac00d31889dcb2d9653a6f6412d157aad2fc45267322a62129087380bec65ec169", + "Name": "matter_g2_mul_26", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001214aacb0a5e6b7a40369a83c07fa8cf1786ce7cbde2b5a501d9c1292532df7822d4fde10a31fc0cecce3a7cfe3311850000000000000000000000000000000004f9669d8fe4f884ae93b2505710e6e45b19b7aa5df8cdd811f09e547efc27d21024cba05e2dc9d057055f30ec72d9df000000000000000000000000000000000a852b821b31cd27eca19712a636aa05ef2cd82c36ac1c2ca240edc7d0172b42a72c42d3cba583a5b5129ac1c9486e270000000000000000000000000000000007bd8419e791a5cea04993509e91a980d3ae4987a5b322400b6e4a4f2b636891a1c7ba4de96b53426dd556532403d5a39915646de2449b3cb78d142b6018f3da7a16769722ec2c7185aedafe2699a8bc", + "Expected": "00000000000000000000000000000000089a07bf63b8029e0506393828d8593b94b73c750815552f9a3c74ef7470b5810bc27212ba02ca6fdcd97e1e28a52a1e00000000000000000000000000000000051a93291d4b912f0a594d45c0264a9073663a9ec75e6ee81e13e79383d96e9330bab845fd1e5163e5b28c41c4a854c40000000000000000000000000000000016610bf2b2006207046e489294a132937edbdf95caf508f0df3bf8502e641aab9c44903cde75cff3c1f86873e06cc58c0000000000000000000000000000000005d33669fd8a6256dc55f513bb93cce8bae62a593eb8903cb7d7902a7727efb8fb4bb2e5058441c30b99f146ff5394c3", + "Name": "matter_g2_mul_27", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000005ef88bf38b2f998dec7302cde829076e6cf69df23aa0bf6bbb39fc0d3d8b5eafba74efb928b1de0eeb3d86ec82612300000000000000000000000000000000011f47e9583997b19c36616e4bf78d6ddd6d67937f493986250ff02aef6e6e7ff074559af2f20a5bf1d67158e4a199cdb000000000000000000000000000000000007777c8eb259a836e6459b7bdb642f878d869fdcb31b105d01f280938ef5377f2775874c099dcd394abe70f17d595b000000000000000000000000000000001607379d1cd34e2d0ed765a339b21433e9aa489609b92414c6b5a05d796085269c288d739717def9db3502e0550860165061073223f066e35242772385c67aaefb3f7ea7df244d73369db1ea0b208792", + "Expected": "0000000000000000000000000000000005aa23543088a9a833d773a71275e73fc3081e13c907b8a04a330df7d6c06618fe69e644e0ee55869e364d3561e40f300000000000000000000000000000000010eef9238d2c520f32243f07161f3e35b15fc949b9401baa1a9c5df7d50b2cb3bdd237747735b235862bb57322fd9d090000000000000000000000000000000012dcc16496c95e39ecfd8f0514b5ab2569d89826d957478cdecd4e827095034e974039b37e767a0f25bf057ed715aeb00000000000000000000000000000000000d0593865fd2172ebf1b94c7511ab7d433a276bf833515146adb6d79b6e09d7c18f4c7f4d3241c14d01a4ad0f31580f", + "Name": "matter_g2_mul_28", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000d6e3068c082b68312141aa68f1540ea1415e93e7f1762b6f06ff408a9995542da1c727a13355c19f8f418a44de1a95d000000000000000000000000000000000dcfcf2ab12b1a0e521ab402aaa4d32ff649a5a97892eb6ad98487c3c73c35601c313b8130ad12e9098d16eed3bcc2e00000000000000000000000000000000013777b1eefa4af03dc44e4e054eb7a3a980a9c55644900b80346be84b970e1754d1f4ab771adc9249e4accf88a23fb400000000000000000000000000000000002f53b231f1209c6f8b52f99a78bc2147c951ac89b341495f4a60a6572985ce2bc823625099ec214bc9ceedb2deea3fff396ee22209271ea0bda10fb5e2584e7536e8bb1d00a0dd7b852b0aa653cd86c", + "Expected": "0000000000000000000000000000000015785bae0c27680cca2097ab52306207a61ba9903723f574091ef5e57c2e871e076d7f46e6e39f65a01e183e7bd822f000000000000000000000000000000000071110a384248664db46f21d87b455a3ad3c43782c68304ce17f52cc8579fb2e3378995d6eb3b8c97665e5fb7de665fd0000000000000000000000000000000019153a01c2b3c5d481474a71e5c67f27fae3232a0c8f1655ddd4da6b4c79870bfb0b6beb4af8c54aaf7e9251ad41d639000000000000000000000000000000000c58375439a93e0763467c6a11dada3e579ec53a968c9b9c1a446cf3224ea0c89c9ec218a8b78de91fc12f087e722f94", + "Name": "matter_g2_mul_29", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000161c595d151a765c7dee03c9210414cdffab84b9078b4b98f9df09be5ec299b8f6322c692214f00ede97958f235c352b00000000000000000000000000000000106883e0937cb869e579b513bde8f61020fcf26be38f8b98eae3885cedec2e028970415fc653cf10e64727b7f6232e06000000000000000000000000000000000f351a82b733af31af453904874b7ca6252957a1ab51ec7f7b6fff85bbf3331f870a7e72a81594a9930859237e7a154d0000000000000000000000000000000012fcf20d1750901f2cfed64fd362f010ee64fafe9ddab406cc352b65829b929881a50514d53247d1cca7d6995d0bc9b2f0d3d4cf46265fc0f69e093181f8b02114e492485696c671b648450c4fcd97aa", + "Expected": "0000000000000000000000000000000004c7495c03fc3fb4d0fd4e0e660d6424de9e060eac72eee3608ba95bac294a3a62d246f42dcf3b575ee1cf8e20a9106100000000000000000000000000000000091140aee42a9dc875f87f3ba29beff95138790140f8bb522c6c15281b3545995f9c13b0b73ae691317e674295db6526000000000000000000000000000000000a945a215b2861427e0fbbfc6fea04e79edeaa1eb87df5db8e5e017cf98fde7b8d5a04a1b2129a4aadd2e3924ecc0bb2000000000000000000000000000000000a43f8d3d92a03b7bd4c8a34ce31729ea0b8e6b051c30241dca2db31a02b6e537071a914d8f0876f944dfdb613540c6d", + "Name": "matter_g2_mul_30", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000047f92d6306bed1cb840f58fd57b5b71a5df7f86dbfa55a36636cb495e08715cd57f2f3e7cd99a1efc28b1d684de1cb0000000000000000000000000000000000f4eb02d687a1a6105b4dbd740e2c7924689d558e6cbfee768dd303cc8dd0fd887f5eec24b54feccf00f473ca3f54ad000000000000000000000000000000000edad68c4d536912816cf6ef039c3dd0535dc52189583270b3b038e2c67b213d943bf384ce69c4a9dc526d7ef309f25a0000000000000000000000000000000006ff4a6b5129ef026d1d5704bf7fc0b474de92b5cf39722f165e73f4e7612d6d3bb40743e4b7b42d0dad5d5d6a2d4881915b717562844d59623bc582f1a95fc678cf0d39af32560c6c06e3a74023c89c", + "Expected": "000000000000000000000000000000001821e14e70e12c7caf2a1ab651eb81dd61c4e1eec9a02fe4124abb865a7029e066f03b62e6ecfcf0fbae5151272b524f00000000000000000000000000000000044ac4a7399d6a67e7ee8cde3f5fe20b0a745462c870926f0ce8554061eba5bd62a8a08c798d8bfe30fba5567d47c7ec00000000000000000000000000000000178b8f061ad9282b3b2057f20c115c91df994ac40aacd05b7669e934bc7d650a0cd88f9fe17d7b766e34bed587ead58200000000000000000000000000000000188311eea279ddcf75f8dd82643ca3efd560ddbe6c8f2696cf7da03e65cc90d97b9f9ce99e29269644d8b881e624cca6", + "Name": "matter_g2_mul_31", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000017b32e613cb38b41dcdf3c8bb9187d731546977fbffd79fa7f66e3d6aaf9e1af6eca2fcdc260c8f90818d7148ba2f4960000000000000000000000000000000007e4d26606a47c874c20e8480a9f5815e5b577bccd783b775d10309eeb3d2102c7a0abc3324679e44362f09e7a4ada67000000000000000000000000000000000cb6f12ac8b49cfa36b957591293c87b21af0a949c55a28a90ab0fce88fb5cb7645e20ab2edd284f0ad1377dd95ac10e0000000000000000000000000000000014c96b5dcbd3150eeaea5c2bc27750cf88b30a91933a3233a4d1d9b357a80cc20d135e43a344e718dff5c79045c31f86d5c1c9fa11c36b86430cbb1f3ec10ebbe3787d0f5641d6d7fb96c810eda202dd", + "Expected": "0000000000000000000000000000000012496dd3c1278b55bde81f6944c4bdb71869f5e5e21db7b1425ea32fa1dbc8c301e7f5e68cd7629c91650265d1361e690000000000000000000000000000000004a1251591efdbdbeda21eb89165ca61a2e090a73426451b6933d939161364c4064a67a90f859a7713fb6a9c5321d5a200000000000000000000000000000000163bcd07d030fd6ab8a8e0bf39b136dcb34f03925c3fdadf55e94a90bfde0ecde5c51d2f4d06954aa6a96c913f2ab4610000000000000000000000000000000016dc065a852ef9e038d93cc583b4a71db9b96a7e7a819dc530598f1ae256368438f52e4b709f15f56279b9c7f9db8785", + "Name": "matter_g2_mul_32", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000001ca1141ba9542c56de8991b313c6ae42fcecb6751b0b81b8cb21ed70d5008f7ffe831766b89880a7fa6dfdb09a2cda3000000000000000000000000000000000e6766b17db165bba564ac63ab88d3f8f5eded07a40b48644e60d3223d30458e7dabe404cab8d6f9fe135712ef0b1a43000000000000000000000000000000000dda3e6c87382fa762510e5cac721fd2b654f002f5b9a3767a8c6d651ccc582e80e3f68d6913cda30f9f51ebcfc7c98600000000000000000000000000000000059a7dac5bb6b504f2bd603d486700fe22c14f25254537b2c9079c2b45d36c7ce56854c5699cc7649b533194f51a9045c00eb20fe7c292f3ad820a074d8b3d8d24506612752d8677c2d6ca24f556cc45", + "Expected": "000000000000000000000000000000000a2397fb3a3891d1703eb2112357c5fb8acb070ba9f3a39050be6f05b49b8d2488e94adfbf849c8b4a42e287077e9fff000000000000000000000000000000000cf2c02a97addbc1584091e411f9a07135f1fcf989dfc8ae29155ac90b214ce20dc11a1fc75dfb697694891d934abf0f0000000000000000000000000000000018fd4af647bf0456aff9ef80969613829f8eb837205df552aadca46bc3bf9838e0ff2515d3fe869f80d78e2357091d8b0000000000000000000000000000000003c5671ea4723498359f29d49ebe974099da3dd59d21065a721f7a4f14dc7fb1de3a67a707bfa4bad7058312632c6113", + "Name": "matter_g2_mul_33", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000090f4b85961ce97cf7f99c342d3627105d790f611e19721a43d8a0febd67ae393d77a02b999108efb56f0397dac22703000000000000000000000000000000001112f23595d1613c47486eadc37f9b1ac3b3c3973b3fe964d3b67c3996fe2eacd9df5c287b0cea8e9475d146fabcf9e70000000000000000000000000000000018f46f7ba3c9af34c1025c2d460f0be966e68944928dbd55cc7fe00e5def598d80b0e3801e48a74963c974ab4727a52100000000000000000000000000000000096845338d5cd2ac44e097607d6a1a05c241eda1941991ae9edbba965d9029032c46da7218b5b2338e6c58898bc4a820f661d7b30fb11bef70e15b257d7073885468a380862202b2d705a84827644b5b", + "Expected": "0000000000000000000000000000000000676bd7ce63d8b58cc1e5399ced9b495baba4cef9503c44760f92d6d9e092d6d5308fa88144491eda6c571a8c308786000000000000000000000000000000000605cebb4c20bc9dff0258f75a825f55f23a32cd0804dce56bf3cf2f19a3504f0345e0f1b839d4d5920aab19b363ae19000000000000000000000000000000001512f95f60a6dc79dd9261c321328ab8e22ff314e7582d8de83aa3bf280805cba8ba6d359a620fa6f0564396a45ca9760000000000000000000000000000000005837474ba78e0700c77141d70af1d8fb95a97cbadc95996faa93c2e81b7c8877d08d5287f83219a24bc0080e630e39a", + "Name": "matter_g2_mul_34", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000aafe45ea7cb8b450a51263eebc28c1ded662972bee512e24fddaf64f43b74b66032523b3b104a4e9f6b62394436c6710000000000000000000000000000000015cb27e1fedfba2d1679f78a388f90b22bbf3e7d090f0ba972fa8e72f6e31c446f628fff929953712ef6e425d16eba5c000000000000000000000000000000000df9931893cae713042bf722db6ce394b6f346587278a154c271d8511e690417eb6dc47efbcebb7c2fb9e77f1de9fde800000000000000000000000000000000106ffa395ef170c99bb5742428ae88fa4fd7a94476985c099e3b700b7403d083281fb71a19640c6bc2321e27bcb33fe2346ce87c847376c8967cc18297e6007dcfacb6424e1d273930f38bb0e88fc5ca", + "Expected": "0000000000000000000000000000000010b2a9b32e431c11ceb474942bbbd6915a3cff64a74d67570fadeb7447c5abcf1bb35c822d4441565322ebf75e61f64c000000000000000000000000000000000b75a0212232af0a59440482a1f953cc29bcd35272ef407925eccd70c1dc4705dc1e97d2da604996d3c52155d05d77500000000000000000000000000000000018751bc59f5907cbd7f1d503bc5aa266f4109fd3133a1c4c2e58e4a17250a40053b4489da4825b4c368b0f4947baa6240000000000000000000000000000000019b41fa1af9488596b09c587fc33e044d51674eb6087c647d5a762d85e38a587eb5482687d9346a1a701bd3a8bd36a61", + "Name": "matter_g2_mul_35", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000010b1f8b1c492a56936da905b8738affba6bd29ae5fffd40ba6b31325181d3b489a81b23dcb69f6e71bd29bfb388e5a8f00000000000000000000000000000000116a115303b4774da59844e457844232d088062d920db67b2a8450a194be7e5340ebd4d106454fd9a03c8f50dbb1e119000000000000000000000000000000000eb521edd61b38006cffc43ab72d395d669dec196846fa4d6d43521da6c2fc3bf0994ce7556a3cffec7751b3bc5703ff00000000000000000000000000000000073cea36eccaa1c78deefb6029903c2b6598301bdefa9759719c3b590fcc5a6a4d3d4d19f552b33f4a3126a6e6a8448639a142c443a666499a880aa1cb9f523411bbc8e5554de099ab485b6c2c2e57cc", + "Expected": "00000000000000000000000000000000054836eb7ef9edbe914bc16d1498e0bc3c978bbed2518802c2f8e1c0b59fee482cce0ae8e805c33861d4cd595f6b8bf40000000000000000000000000000000007dda36d55aa7a890aeaecf2528a390c98d9ecfc8a5c78c2a6def30de55b90ae408ab770cf9a9a4663ba601c4f5765a00000000000000000000000000000000007ff7b24c8ed9fca572069e72b1e93978cea87a0fac7ba60f54aa573d881f21b73012b010e9c0fc9324aa7697bae0c4a0000000000000000000000000000000002d9773bf294efe64021e755e4dd2936a5060bbea5688b6369ffa3b94eadcc58cc3986c74ff365301be1e6c785939b69", + "Name": "matter_g2_mul_36", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000e3925fa085db73c1e67b29ae90f8773f83be5ec684402e8e2360ffee8a8368911e584843e42b0d470de78591df6ea6300000000000000000000000000000000075c7efdeeb16609b4a47ea442af4d75238fb7534fd96cb236a7886809d6adc2b62c8ff72bdb041bc51c1a71b68219e300000000000000000000000000000000088b4eb0dd185e51b737d797334590e982b7b0a5f109fc7d0524b2465c2c0457964eba5a6d2d4d99fb628f21f15a776c000000000000000000000000000000000fc79f6b38f3356972669290eeadcd992a22bc1191606b663a1e148aa58db3938f0fc65e536bc5811c50d9c7f03d3e372c01b7795c2d16b5bbbb1e107be36cc91b25130888956b0cdd344de9b4659447", + "Expected": "000000000000000000000000000000000902c1082ff09bf93b91c9ef5e447bd6832fec9297cdb065f11fc5ee626e6e8834cb5d74775c586609a0394e6114e8820000000000000000000000000000000018e414a40c27430b98246fef556e74dd3dd7adc601e3c05b79f8c29169780a173be9a725df3318d71b6e82abf97930bd000000000000000000000000000000000f924fa88f43c86ec98b34379b9a649c7564ef0dc596c95df19522fd50fb3a37cae031e891a7a7aa6a5e6a9062c3726a0000000000000000000000000000000006bd3340412f64d02d0cb3ac44d1f31cdb1906e56dbfb66d86b60a74cd26c1e241963fcd8bba4109c428db0bb083e81f", + "Name": "matter_g2_mul_37", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000b87c47605fc060a8e3677e84ce9d14b9309360a13c80d040c625fbf0108f829300cc1fca409a0f9c96311cd4a9a21e60000000000000000000000000000000014c4088f1e7935cf6a1d2475b84497ce6a250ee2c0c991fe51a2f2836388a354824b02d9cf215328dfce3f546713e21100000000000000000000000000000000120e59be3ecf35674eac6cdc559599b273f13f28a529770fa156f8e519734c451eefb35023639f32049cd19ea0d945a3000000000000000000000000000000000f97755b62a8cb8f861ea02c77819f0b58181aecf612d92180ba9b475f0b4888b922c57f6a1c619dd5514620a1cfd9e2c712943d8795a6104f024b9701c70b09cdee9494755bbab0576e2c7f7c9d4828", + "Expected": "0000000000000000000000000000000001415fbd8afeeb5796460a9095f14a8f3f6fe0374d4cc4160f030710a6d4d3a92febcf4dad770de3a3ba1a2efbd858210000000000000000000000000000000015792220c7e53262b56224d230a8a4b32019c77548704ec16da5ce167854305e6cdb9924c248f222d6fe95a8383af7890000000000000000000000000000000001694329d8e0f41256b703a8bb6548f1d9e0749a55c124c9b60361b4cb1daee24fcf272327ba598022a92815764fc8570000000000000000000000000000000003350658842c5b6fc5561a14df27d950a00c5bcc13d6d9d014bfd6dc95ec1a030594625f41d439b90b05275a0ffefdb1", + "Name": "matter_g2_mul_38", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000005860cfb6be6720118623d2d8ba05e686df22744b948421dd3cc1b1691e00d9b5d00d00195b4acf7a7b043f764f3f1c70000000000000000000000000000000012632a3313dd611e8d969bddd556c2d79ff387603462ac78ded3a842981697bdac34ee6f1f4744ed2ff16100874ac24000000000000000000000000000000000112b94c317586e343acadeca611c485c3ea172bc10dd39158c1e678007130062a921b53826d7be6286963ff822f1066c00000000000000000000000000000000040de8c0dadd2a6c2a7ea0fa43e1a5f2f5a6be3fcb0de6875d8cef1ee2daad87125d12f6869c4dd3d931b296f1df2fb3d4d77f6246c57d398c57848db8d3f986c475a41a23d424cd3cc2b362c1b99f2a", + "Expected": "00000000000000000000000000000000054c6cb26c8b0a9a4700e0b95348e6fb1190c577eba03a44e84fe7744c543321d02c4d8f55c03f984b44ffbd899ac53a000000000000000000000000000000000e7ab8da5d573cb88a78f6a6ad2b307bf867777f79a643b6ec89d9cb208711c85d7d2cf8f8ac69a8b322000fc7866024000000000000000000000000000000000fbc5926b9dcd9e4d1ca1a2b43dab5c98aa20b37aff0868c54441de44eb014e5283010642717fafaa95000f4313e14840000000000000000000000000000000003671ee05bc20bead72f2306203dad55cf20b13d3bb2cca079bf4391411b85ed4df55e1426645d73b6935889d4450c58", + "Name": "matter_g2_mul_39", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000006fcd2c4fe848e9462ba1112baad39031c210952adbdd06293a622ffe2d1c6e4fcc8773ec8913717018b97bcb9a554fd00000000000000000000000000000000130a97442f3273b7b35464545e7351faf71ead9b8996c63889a45945ed82bba29bff5014776c6185219a5234d8475c92000000000000000000000000000000000491d571bac5487b866022a0714be11b38bfb296233845cc434a50be1d35f516b8c6b046fe3d0a8f4f95ac20eddea01b0000000000000000000000000000000017e34b04e6fdf152c848f2432b7bd84b3dba3915f06eb77efb8035750aca9d89e92e1d1bc4871105c440d639e8d8b05541776ed9d1029918af4c5113a6110139b8bd7f938caa204373a28ddaa51430eb", + "Expected": "0000000000000000000000000000000013fdd394635f42a926a2324b8cb870b5995772ef4e25ebc1da41dc5bf724f747da8d95a28dd703b5ed65ada5555c8b5b00000000000000000000000000000000118fd550962d1de8f1e60c312643ec7cd306f0bbcc932739270595537c8d290ca7e20b962fcde570bd2ed7ea43009fe70000000000000000000000000000000018b25fef4b75fc7649a489d078311dfb6da9909f472de7bd9bee9c3ee353f345c83119269ab797fabdbede41e0fe6169000000000000000000000000000000000b7c2a73741f6944ef4ce8fa20b2900612645c224818b7faccf6597827fa07f7262295f42be5f34a751a6400495f7eaf", + "Name": "matter_g2_mul_40", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000f1b8df4e8fdfe32eaf227f5af9f2befc85073468f10b81d32d0e126fe2b0cc8e8adb8afcac73213b6ed95e8e843b97c00000000000000000000000000000000004e3fb435ae0fb2d8bd091f250aefe5922b353a64e16abd75627737f3bc56639f8b40652cae69c73ff1969925b0afdf000000000000000000000000000000001003aed7cfb00efce49d6b1a8eba27df87479a4d37bd7fda6121549483b669a1a761204b0dd28262bf27e5c8e180540f00000000000000000000000000000000114fbca7caf782b3296d0b26b4c362bf50acaecb8bc5726b2c99f904ec3d092d5d40991d0d30c8e79fddaa45f04a75d3fa64411438542922a7bac10806efaa633d31d37c0b223314a8b6221155b9c425", + "Expected": "00000000000000000000000000000000177d29de8a81db2e515d4241e5f7e3d35de22bbcf9aaa616b057cbf2dab57ab8d98213cdec82a2034964f3e1def8a4e3000000000000000000000000000000000a0cce8113eecb064a60ee2c470dfae8b3921f8da2c7ad8dc918b355ff44542b007add28a44848fa8d8f8671617431ff0000000000000000000000000000000010470fcc723286327e951e758fd0474de394778d0c1ec5fe6f263dea1957c60f05dc8f9d82b3c6a7d73b3e783f35ade500000000000000000000000000000000098a6ed331f03da7ccc9148f07b19b132152e15d9fdaee5cc092524b33795edf2b458b4e8383c5e29affd3f025094033", + "Name": "matter_g2_mul_41", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000017faf481fd4cb0c373d21d7caad40e93d9a86e62d26136892fbcc6f6e48205543aff00c45e82fdd1d3e0e733de91e7000000000000000000000000000000000012e14fcb9ad4d9d15347cf004745ed4bd92097eeeb41c4cbcb728a234616363589d8f5ad4cbb61d31a8aa27627723c7e000000000000000000000000000000001513dad1ff27e053902e779e35d04cab648939317830144ea775c435a4b55e13fa2fef03a1256abf5c187487c25a774f00000000000000000000000000000000139da29de8587c7d0ca9237c37a116387385e9cea453b9e2003a37ede7aa0a3f4c1df55255897f5975b662be33622dbce7002f41c6acab677a0ad023bad2a61b11c1b7221d944018b5ce60bb61e87e96", + "Expected": "0000000000000000000000000000000018a1f1a60172a65abc8f2d855ee7510c1e0af9bada084325027bd493ae86ea2c62c15ace7f63562a82cb80ee7095661b000000000000000000000000000000001736b977fb52eb1b466cec3d42df7e89047784f0e8362eb6425e37adb1e84d0438f5a6e82c7b31d59b0959a5f4aaf9310000000000000000000000000000000013ea0f849830f8e48161e840295637d8596b32eb576560289620b797b14bd395d835e8140b69039c904ef1d07a82127b000000000000000000000000000000000d7f58873701c138cb7e18ffc36cd0e47b07d70448ddd9fdc4b947003fb29cba0775916c752d531e527ab744c277e5da", + "Name": "matter_g2_mul_42", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000c118b147ee3489f30c6ecc0256a314ab674110588e8b69ca6d265fc270c3e5b767817f861140cca5d7c6be4012d1ffe0000000000000000000000000000000014800790654726959fd876b035bade0da744fb36ee5b304f228663a531345120267c55ac19fd66022752010e5bea7cb30000000000000000000000000000000000193ab7ac2f151750356b6e178557460c9c2672b1736d19a20e3fa28082479ca60021aa68edf2524f1aa826ee70b65a0000000000000000000000000000000015cee9ac55ab45abbc57d0ea6ec9ee49f6c59f6b94f99589dbc08ee877d3a261ad77f5473fedd72ed7206647eeafb6eac26e55f09b787c0542878e4d720027d9ea465f829a4e0164cf618c5d9cde49bc", + "Expected": "000000000000000000000000000000000290fb3f38937ce4439ceaa21cf3b31db8a22f9f5ad9db0fd7d38ca978192bc05d41152f8f86ca7b2ee0bb58e125f57f000000000000000000000000000000001775913fc24699bf08f25fb946fc6527178ebb821c654b7bc69f6f86b5168fc42057a5d3bfdc53b3d57fa1ac05f7a0930000000000000000000000000000000017b9043cde8dbf500ad90463250a49f56b35713f2fd9a35d8391fc36c78c083e39674592a98cb857194ef9e73a62a397000000000000000000000000000000000e5e62e39433d443e7d2d32754d2ca2556cf6deea45e5076ac040e3d6de14e9965c53f8c65bd98ae7d17ad3a26f3accb", + "Name": "matter_g2_mul_43", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000ef203fab794a0ef29eb2ebf00076134e5932e27c99d6d445695b9df2afe7563602e318caf5d44724a21790ca0ab0d180000000000000000000000000000000013b9b1b1d3e98b61b0f1a0ef3a1a4ceed57b6c01849a4ad66a86332b3d27022cfccadd3567e6709d2de5b23b23dba43f000000000000000000000000000000000c1fbace49684f4be32ef6178ac3a95ea3f50b11494340fb73dc5391d50bcacafb3bf0f2631fea9c4ec47327d644489500000000000000000000000000000000040f82812855aa3e3aaba826d5810c1049cf44e86e44e23cc6da437971b529d2f2676c73e1fb9da52640c981fbd710bebba67cc47e38a129ab1140fbcf0386ddba2feefc919aacdce6059a27a1e2efca", + "Expected": "000000000000000000000000000000000d9927347a9ac9b0290e68143fbc6a5f4476604c3fa5ae87e729a03ca055e4c6543f9245a4592e195180d88781e46ac900000000000000000000000000000000175e0ee8de4002b18f32f70f1bfa9e0be87288cddf1c436428c2969884112bef5db19e041cbaeb23596e25cabea3777300000000000000000000000000000000074ed9e981818102b9ba818d478ba27033eb38e3fa19cdeb9f5820e59a64dc451342a160359c54bc8ec7d866b62080ef000000000000000000000000000000000a853930020bf01e20816d3aed242e00792b0d0e78fb15403fc3cc255f0dbd99ea6ae1d59d5978e562be4862b3317324", + "Name": "matter_g2_mul_44", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000060d7a718dd02b147c265f71eb136d1f31781b12a41866b4f86d7374b93dd10058c192cc0fba928373b1526e1a5d7d7f000000000000000000000000000000000cf29275373c0573ef22bf87919faf5444847203c7dc6d2e18986152cc294be04a5b1a4b0536797158113a15276c4fc6000000000000000000000000000000001016d5b9d4d200d7b4b7cc3836b85d6697fe14db350badba9978c7b56983dd1a7e572640ee0372b0a4e2079ff4c1abf2000000000000000000000000000000000f2768d104d895473ddf8c6b3cd0e7c22458d0037eca6365c766879a07c95037ee0de00d32c974d767080935abbe0be1705fb566367d9fc142c4194b0525c16672b843aac1160f9056ebb115e80d377a", + "Expected": "000000000000000000000000000000000e9c290ba8a22f7bb3f7dfdcc9f5a221a5ce838d4fa85a00473a4dd830bacf583dd91a6a6f78d2ebb54a4c1bb217f793000000000000000000000000000000000dc51b0ae8bda6d28c51016764fc028258171d7c7646393228692aef7f1dda4a83e53553f63d6ba996d4c0a802bc967f0000000000000000000000000000000014ab155029dd35206811be9ca4efbf762a1673367e6b57528f79eb50008ce7c3b49a2d25da0ae68ac4030ab4bcc0daba0000000000000000000000000000000008cd743bb52e7908aa973c8518eaded75fc2858f4edb25fb7f2e09900f0abd3ac87e93cf1068bbe0c7d99619aa7a6b76", + "Name": "matter_g2_mul_45", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000017b9ca4349fecaa43ce911c0b256680edb8a0906ef5460fc4d2004579336df1e19560fe960a7a7cd74bb6e8272e08960000000000000000000000000000000000d5b96dae738db59cc67a51c61bec6deaeefaaa51e3259243fa4b142ef59676231229ae386ce699fbe18c4c00bf9d49400000000000000000000000000000000111b79f4b68dad16550a13334d09dc38336a75a5da23a17b5064e2d591aa3dab4c2e982a9f730a7633070504663a24610000000000000000000000000000000018f6d3616a7eaf17c805a88c9710039644d01b61aefebf76717ddcda6f4bb34aa15702de1e92bdb27b27f3409638da90f7bfd990cc4dac62a0d730f56b4eb1c1ad77ca9cd58b089c23c2f6efa00b7fa4", + "Expected": "000000000000000000000000000000001746a449993b0684740630f3f0e46eddfa135371e33e8de4dfe553c78845399e63bb3da48798b35df48d27e1f991954400000000000000000000000000000000057e0fb1113968858981c9803166d8b3eacc91bfad320ea0e610fbc5b276da1b46d74fcc54183ba61d1b2fe6743097c90000000000000000000000000000000000b3a178ae3b739cae3e80f3f44db42d8c465a5cfe4943b449d4c3b7f4ad153916c6cf4fdfece14a00b271222c72764300000000000000000000000000000000041c8b293ded0c647f2e4d6f9b35304179b723c3e6e421a5cb103e561d1655b92e74877ce22c99f22a3700c3aba9ebb9", + "Name": "matter_g2_mul_46", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000aeb5c087644595d0912879f61959d2731ff55260c682ed2bc5fc55c13964ef7c1f70aeb55876d2264d558c31371ca69000000000000000000000000000000000e173848f4570525b03a2b2c86f4dcdb8b28dd6d18c1354cad31028eb1b8b44432c2346edaace093e3954c7fa6d338a4000000000000000000000000000000001949b0902506d111ef6318edcd7a58ca4d69f5804a028aee73c3786cb2db168c6a73b77194f7a021ae6ae43ac78ade340000000000000000000000000000000017c5e28ba6103d97e2f3d3611c0c78f06406e0da8a49ae29c7d460b52f75136920784cd500aa3593858b877697eb8424807c5a41ae2baa1e10ebee15363d1d4569f731d77a418998108f5dfae0e90556", + "Expected": "000000000000000000000000000000001103cc395acf81772955bda38f951a81c5a6a476c0b5e1543616a5a7a7be22dd487ab2a8586524891300adec5225b4020000000000000000000000000000000003479a08e2811ae9aab0301d66ada470935984d7466201f3fb28c610c0b5f67e7305f5ad3514cec5f30b51d0aae775d40000000000000000000000000000000005ea37a6d20c1ad0978da68ded3a5bfcc5ad8fe81e39b525fe7d1f2b2b1ab0be7ada80173b1d0b7fe1e06ab6354e64b10000000000000000000000000000000008f2093151a285dac511df1755e99a652a1cad0af3a019650fbdead1421ba8e84afc9eb0a4fea651f365d72f031a0ca6", + "Name": "matter_g2_mul_47", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000d4f09acd5f362e0a516d4c13c5e2f504d9bd49fdfb6d8b7a7ab35a02c391c8112b03270d5d9eefe9b659dd27601d18f000000000000000000000000000000000fd489cb75945f3b5ebb1c0e326d59602934c8f78fe9294a8877e7aeb95de5addde0cb7ab53674df8b2cfbb036b30b9900000000000000000000000000000000055dbc4eca768714e098bbe9c71cf54b40f51c26e95808ee79225a87fb6fa1415178db47f02d856fea56a752d185f86b000000000000000000000000000000001239b7640f416eb6e921fe47f7501d504fadc190d9cf4e89ae2b717276739a2f4ee9f637c35e23c480df029fd8d247c7a7e300bcb3c740fd1f693d4c8915c4c46dcb627f6de6e4847f123623cd23bac7", + "Expected": "0000000000000000000000000000000019f79677ea0e011e5c9a892a407646798b05be05337c73135cb771abf101f450bbffd08e125f077f5ea989decc009b9f000000000000000000000000000000000ed15f35966024cf1de2926108151e976dcb0d51b2736b0877d79de81f6fccb9dd299d14855f4e257cae33ab7455b95100000000000000000000000000000000125e2fabb5cc95c0a7890e9ff2b70102a97a03f2d11d915cf4332dd049a467333e12ebb27955c0310ebdfe2afb3173ee0000000000000000000000000000000011718167000f9b749f1615610a30023db4b986364da5bbdc4506c726624a073548a94307b282590cd8a43b4900a1afb2", + "Name": "matter_g2_mul_48", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000f20a07526a082e88630a0256d134a8a5e8ada07b1cead39ee838dcbb30904e9016107fcbdf1f8ba182308dbe0b043d20000000000000000000000000000000014fb7732f67abf60c03ac902577532d0acadb5f3db0d6397a42ba693526ad74f2c61a0195bdc9704aaaf12e65aa6d88b000000000000000000000000000000000018cec4fb81c85d304588d11f8b9c51f5a053df11463e5812a1b2e6c7144522ba36bb91adf219892d0007cee470032e000000000000000000000000000000000b8e52d958a12a9037e8be9bc0d5045cade2d6ea05c6e68462b3a30b5d4ea34e5fbad173761e4e216b2e6958c8983b28b473df5e282565a0783d23e65e283a103ebbddb5c884183cceb62fc32d0e9602", + "Expected": "0000000000000000000000000000000005af8fd9e79568b46fc42b2c1bac62d115365834e509dab032f66425b7a571a4bd3bf702299d3c5f36c372750b3281f30000000000000000000000000000000018499089f306b3c9f7a645ca2f9aabc4e57c046992fff87e832e21e21875c6adaca050ea8bd7043afec3a36ecf8eafae0000000000000000000000000000000000827fa0f46134e2dff80088129841f0469ec7360fd8b9864e9ed99c5fd3458e6360661ab4c671846681d491b8b823d200000000000000000000000000000000120f829e8d0ffc360a14eabaf52bc653b1e90a36c0a8af806ca745fa306a9739e31435039a377e0748caf5e80c2b0b09", + "Name": "matter_g2_mul_49", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001468cb35a60898ed129f30c261b8431df6a154c250ec16d85a22f8717593b2c21853d123da86d977a7938c5ed74ef23500000000000000000000000000000000011f4e28e31b5f9e6877192a5e632d8c1ed7ca0c42e6e9902ca68f1c2de0f648c6064436012c5c7b14bb8d1078e02f2c000000000000000000000000000000000b25114b2697ca7eb1e6effdd1054893a188fd382d387ec098f846c1137a9b9baad01653b963a0b0bf3cb50c3ce3563d000000000000000000000000000000000c1d241cb03e642c1752b1e1886472477c19a2801ec032dc220c3243952f882094119bb92b621b654b766bc900d2d4f7a048ef7cf5d1f6f625ee3aba091147c389ebebc5b8f3d285e16ef4e8afe5c013", + "Expected": "000000000000000000000000000000001745500b00e5ebc6f71c779ba0b0f8d6601a065c550ca19de9562455423d2ccb507e659b0dce982faa841267fb1a27d90000000000000000000000000000000009c36b54f12d130868ff9b9b61b714fb1067dc91637c09614c51b5aafa2cbe3ca7dce0f3e366d4200cbf603ad4fd630000000000000000000000000000000000172e543708bb853712d81c000c9f9f2378e628b4d13b074317e95deeae98e11e7f917f91e02a0b18cfe9b25f1b83f16700000000000000000000000000000000189fc572ff6a8c6606ba0cea7da7040898d9ee85a58f12fade8c5a22031ff26c2f9cc612bc6e1b82a0999fa93c6fdfca", + "Name": "matter_g2_mul_50", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000c80d4474390fa791ea5f2f16b41506d8ae13ee0993c8d31a07712687298ee7978a724999500c42400d2f788a5a36067000000000000000000000000000000000592705cc5a8875750a4e6ceb42aa3bef5593eda9e8212702a2e08ea70277a2a66526bc5237be33c8449301544da35e60000000000000000000000000000000000facabfbd15284c6433f17b0e6035d4fdd84d3ad2dd30a27d52809652ff6e7a684d7724697919100567ad0c3e1a26320000000000000000000000000000000006a0fc4e2af69ce15a356656f5d182a2cf213d76a6047a05a1a3375909d245f5316b91333d2141c0817438f0d87bb52da9b63c6bf36997118d58600c1e429c105a379b9e8b0de934ab9f433a4fa63dc8", + "Expected": "00000000000000000000000000000000013c6f777df97ad3ddab9b7486d54d1bacb3b40ad3035b47a25a66c02e8866955e27a8ee52872c8222ff7466c1310bad0000000000000000000000000000000014a5eb510d7c743e824f4daab21c43db4d6de8ab2e825d13ae0e186aaba828d7b4a2343a11011a8ec4ea82f456e394a70000000000000000000000000000000017a55d3827b78a9c5ea792b705eba7777df74951930791b17ff5b861e98a4488f83007c073c3e904ed4ee328b6f6171c0000000000000000000000000000000019bae02f8d6f1e31dfa09f4feedd5217ade66f6e8248aa98b273574f72aef83d5048534ed38acab9e0eb4c64f4389af4", + "Name": "matter_g2_mul_51", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000003f629618e1fc3018bb836301ccdc59022f0a25cc9c5de6e4c31fa08feea525c83256235e4ec8364e77e5df478f5f62c000000000000000000000000000000001120d6af221ba6f4351bbee4c2c664a769adb17872646df2c408f70c99ea991ffced4eab50fa98be1bb9426915f125930000000000000000000000000000000015cd16b028ce3d58b10aeb84b783475d894ab3f0cfdf7104ebb4f3417a038107128f07518dce548271061cb8c97e88af0000000000000000000000000000000018379875b68bc26107f9a068e5034f29dc2ae7e8830f8e9ecddc53fe7991206646cda33d37b31a47a977b46be58d7618f228da17f49667c113d2bc2a2c8a338f80be68496f5145b4be21a5786ca6d46b", + "Expected": "0000000000000000000000000000000006490c327790b4c451f93197d7db24211a3b4b5f573a6df409206b4bbfc36bd10d2d0c989889efffd8f4daa4a68b211c00000000000000000000000000000000168f224738db3f07af77494f52ea5e957812a1acd62615f0eaa95c1d363cfceff29be9cf3be5329bb41175a0231ced4f000000000000000000000000000000000321f06b55f7dbfd4900b329c914f9ab9be2794e51e54498e18f83ece5bfd205131fbc254bfbf624d57ec2954b05f6f00000000000000000000000000000000018ec54f3e09bb2a6b112b575f9481bf1c85666133051e9c0ab53369d14eb90e27d2ed02dcda1250d5d539df0d0cda37c", + "Name": "matter_g2_mul_52", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000036570783711b381830e35878fbeb187b84884a9a0e88c38e84124515b470e6ac18157e1499026b27f4f731a961eaf330000000000000000000000000000000008382838c18d56c046a8db495babf8d14c915622d7917ebe10cf7da7ecb65f174cddb9e70d0262ada961b396c5511b410000000000000000000000000000000015f63ce982aa581dad5c71fc79251b7f6336c4e78a4a0f4cb6f87167cabd31cbec987d7af4f11dc6d693a0b0774864130000000000000000000000000000000015c001372fe0530a3f50fb8b30e75ff4b264d673e0448211d082c7a9018f583b4d01790019874596c59c68768cfa3e699431e18a462fba704216b516e819fb3392e315b0c92a7411a329cdafeb511244", + "Expected": "0000000000000000000000000000000001641b4ad10da5089164809d82ae47f74e27eaebffc2a2ca3c1b924fc69c1ea80ba3da78c78e86957f6a24e7f75dcada0000000000000000000000000000000014e781e4fe79ea1654460f4b0daddaffb29b287efd8168cb20d7ac6c729f684c5f2a7cfa87885accee3a797febc904c200000000000000000000000000000000001c9a44547f0c5b1f4df190285644c5a31df61e3de7da085835ebda917d5e4163f2deea9a83d641a4759fa3108567ad0000000000000000000000000000000014c3d2a79d80687fd6e6aa423257644fa5d0cf641aaf6a7c5675a810767904166fabd9a2ced0727e3badb932e46fd181", + "Name": "matter_g2_mul_53", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000074d78cdd35ea17a3013e2301fe9f80f2d20d270a25fdead37eed7697a52d152612543781763e6035fa5452ab12cce25000000000000000000000000000000000e572236e1c203a1c0f99e6ec978458c1a143a6a650eee27cfbe406bb2858fe5f30222f468d119703c2f442bc644ff3000000000000000000000000000000000125384343fe132e16a9fc15efe1b3a9e47289e0afc4b44d492e33a6216edbc96d66c1ca66944a8296e7695f27f414c5b00000000000000000000000000000000084c2cbf0d7c932c3098ded7c70d4411eed882feb0f79e0f7f1c31f5fccb6d53fb57de179c3ba5754bc5e532c3784df12051041bd2f12f6e6e29924139770fe209b7bbdbcd6c0bcabbf5021a7dff2d83", + "Expected": "00000000000000000000000000000000129554de7de9a2b73340d94d96f0356a2d1c0524cfb007d76a75f462872e831f45553de05f5b6a1f9eeae37af7f6b4c9000000000000000000000000000000000b1ea2a649ca13a3dc7882f2423036670f68aa05792a8fcd72524420e37381a9ca80dfea701fa5e6da57afa534059617000000000000000000000000000000000b7ff27aba408f9759b5109600cff66c03cdb4bfb3dff64a4838d0516fa46bfcf429fcf9d5cbf74a27f70fdccdb1238c0000000000000000000000000000000005a99aec88967fe775c691d443e2dbd45080eec97e686ee6d7b32e801efe6563315bfafd5c7622d0543519cae4417029", + "Name": "matter_g2_mul_54", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000004d46066439c3ac559cce863c58316883651023990180470d2efd06e443a7caf3a514b54f15ce6e850d32779215bcf4a0000000000000000000000000000000019ce904b6c9c3de59f7d5017f60f1978d60c564f94a0f1964c24c876d1139a7ffbeb6d0d4884bbfaf5f2f189af6904a50000000000000000000000000000000015f1989719e69be95f25dda9358fb98aae2819e0deb7e2d291e2c01e85ba26a9da421896c6b6e2ed20f609b533154694000000000000000000000000000000000b287cfcf1dd7c6d735c1358dff15393ddd6c82e7a33c5d8005c4234cdf823c76a4725fd74cad74b3ec51df67f09af0fb96df57a600dc3b5aabff5b1034886d24f6fcf035bcacaaec738deb2cfb8f852", + "Expected": "0000000000000000000000000000000007997a499b2194cab634750a189cca6783ff17d866d66f5998603f8639d2242e8039222c65b0d14001167a9b09afb58a0000000000000000000000000000000015050fe6b335884a225efcfea4acd025cfc05e8f5fe9a0e22a0c91b55664c118d79887de91f1ae6cbc081f6f55f0067000000000000000000000000000000000195b23c4c2c087082c30600ff00485d169dbd360643d163f1db363f270cd7d4f177c36b4c291d50da4101e67b229d0de000000000000000000000000000000000df596ba2350ff7d3e75b4cbe5f8d6b2cc0e14b3bd6dc021936e3371ba64031f6266fb1d2951801309f22bfb1c4b27e4", + "Name": "matter_g2_mul_55", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000006b37e2226957d639fcb0bcd6c20b3c7b8372e7347a14b970e01c67c1859fa97c754ce588d0f835ecc053549d963ab4000000000000000000000000000000000c6a5fae8be3a32e3f70a4202a1ab6d97183964b9f7b9a084c49922cd9e0e952b0bb66c5580f0e0c417e079493bcdb4e0000000000000000000000000000000017b6132f11adc0d5d693ae7f3a0f89f5779708083eba23e03b0c9265e4e60624e1fb6940e8ee49d31618fa6389b1b50b0000000000000000000000000000000000a45c5f6df71359648aecb6434bad1619c39f10e279a02b3cc9725d0256bcd126843fc9ed29cbe02a32cbbe79774a3378176412b07eb7f423f23ffeaa0ee642590e0b7016bc063f3fffa93e1e35484c", + "Expected": "0000000000000000000000000000000001fa243b548f8f5c2e5d7736ca6fa95b74dbfd31f95fd532b94f81a255c73e7c0e000e20f9ca6750cb0dfdcd2c1aea8a00000000000000000000000000000000132a893a2326bf61962e1855331a53667e6279ed7358bc84c4a7c218b6cff1d3f449954f56daea72bc2779c60f1113400000000000000000000000000000000000091dd23c75dd8266f556bf27ba54c95c3ccab06168e4e6d0747239722afb20f3db27454c6db3a88daab0ef10659a66000000000000000000000000000000000d3b2e3fd358aa3dae983e87b5d1fce6d5688e66ced6e3a2c96b8d48041557295d5932af6532c13965d4b383fb252518", + "Name": "matter_g2_mul_56", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000ffed009c78ba9af8cd33af7b7697ae4dff863bb92365055baedd2299b7f5b5e8abb84ed434f7223c3e309ca53c08aca0000000000000000000000000000000003b2370c837dd6291818efe7c9af62dd51295c418739ecc509d42c92e2c97d12a9fa582946e176e8153fc9a273140b2f0000000000000000000000000000000001e63438e8b4a0462cfdff64a281ab4a7f48d51b51325817139f8ee683484f8695f1defc0c3efcca81d5fbff06cf9c54000000000000000000000000000000000192fc391cdc1ed6ddbd317f2f366f2ce25ba27b8c0f09c733e7bc0c0697544399a3a4f1186d139a8f6399ffa88e89a69c4b5627d84e153f3a4ecc14ddd6baaf1d62253a0f88d3af51be18d991976da0", + "Expected": "0000000000000000000000000000000005095d1becff61df906815842112c6508d6cade4ef5f4b7418f5f01e8c5a383addc1c572237613dfbbb88bcff80e4a44000000000000000000000000000000000bd2561e7bfbda8a48ee038855e37b03fee805689452e9afaf0da4185e0c194e407ce7149b713c689d25f953da36dd1f0000000000000000000000000000000015ba3ae4d4238175425ac5dcbd9e6e9e055b8c1b7752931b524fb546f7bee8723ef2e69351450c6d1ba3c366a22355e20000000000000000000000000000000008c17d77dcfda00a1d75ea0087c58e74263ce5ce4066e979c66397de8e236708831c3a9ca6b35ade8038a28930655eb6", + "Name": "matter_g2_mul_57", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000002e105e0eaa418d58019a849b89accf665a94ffb0bdf308a11b99b521de7af8ddb150c0e3b2e9c54cf5456b6105bc81000000000000000000000000000000000691a3b3986fbe1c0ea22329364454f37f645d6abe9310e883b9191ce512347e074e18e28b88c2adcc76190a549b80b40000000000000000000000000000000003f3a37a763c8d0d99a3fe36923843a22cb0fa18ced48493b2510fc99afe5b7699bbaa6c2ecdad8aaf72969354f121a1000000000000000000000000000000000f4bbae00205f54eb10c83d928d908fbae342b76050e33c51b6e282e02b3c1f132a4728dee4ea95455c25fdfc112f2542ed270764791aff081f1dc8051d22b8e18803a7e310393f21bb4a495a445cd45", + "Expected": "0000000000000000000000000000000005cabaf39b93d7fe15ef6a7a3031df58219bce702a5a77162551a3d916c22e8ec9af2aa20659e7c4ce5f6382a5f82726000000000000000000000000000000000dcefe1a48d8c239164b54771118f7520ac11a7a6b72d8e17be1cd788cad2f26d3a0d9113e6536426800a744be9f0d4000000000000000000000000000000000199d95a44a4334c87aed273a0184be9602ba443d5b8d34f3495b04e927f4687fb88487f586395c7babb4f218fdbecf8c0000000000000000000000000000000010972032f9cb3e8f45447bdd06df82656fbd3ce38a9f7564c6e5d62ea3596c9b7e0a94046f1c65bf0452ca25b15a885c", + "Name": "matter_g2_mul_58", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000009a3e98fe4a98582ce9f274965f376cb45e8583775dbadf626cb1327c1f8a25b293b97e7f8f31ff72ba7e8e769ff25ef0000000000000000000000000000000018e4785ccb76c4897087c8a4242ddc744c6a0a53a4a844254153c23d6f16d4ddb945252d13f93101613f4eb0b1e2b8320000000000000000000000000000000011b81d344eac04d3471b1edde5e51f31f97bea3396580839fa094db58cf6bee371bbdc045fb60c3ee5c6cd5d3f6d3c4700000000000000000000000000000000073476bc5b1d52ff4ca89c3afc099417f473543fab6e59cf9de8a19705dc4bf2a210b1e6de4dfbde035c312be0c70c56fbfb7606b64eef0460b8f33a0be54451fb655ce0b81db89eb7862f392450354f", + "Expected": "000000000000000000000000000000000f250b5e47ef616be106a3334e2f516061eec8f7ac69f08f6dfaedecd76fb1c9685ecdac2c3ddd534e3947d007ab177000000000000000000000000000000000073819a6de38303725aa3a9e5a7a9122b4d1e60ee8deb3554b5e06ef5e60d71517c2279c5066af003b32cdf83b7fcdf200000000000000000000000000000000070721107ac6dac198f7ed1a7f84697cbbc3199a220d1aaf82e6f015963bad863f99190f18a482f730254cef753ba22d00000000000000000000000000000000169910eb30b8fe1ad8f84c4a132c6c74a6ff06ed6e792af3baa6619e3c8aa6cc3e6f687299467ec9554f9e91bee77aa8", + "Name": "matter_g2_mul_59", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000c414b95b298b9c673001173ba7e5ee3e03926f28068481cfa0b469ab556f8fceba9fd0a815180ae0b82c265fd4c6b7e00000000000000000000000000000000054a242c1cc1a9c710bc23305d09c2d613ee8eb3840b37943bfe83f9c1db456ab4436ad319fcdd8684db129d76c95320000000000000000000000000000000001683711c0c7f02e67374f190eed1ce6559479d6d199f43fb5b0ce7df7774a5cb21c86b3b3498855d9b69c5763acd8c4300000000000000000000000000000000062f87085dfec847af518bd71c078f994b090c3b27c6eaad79772ab58afa43993db52fb08649a32629d61c3db12c87318a29fcc442d0c2446697e94dc47181dca7a314f9073c06aba6dc55aa79978d7d", + "Expected": "00000000000000000000000000000000106e892e336b2155909946ab73b980ea761cfe8c48b13ae8a5302eacea08b9cef3e60d5b33c6ec4033218ae5761433dd0000000000000000000000000000000015daeaee59f3b4cc26d3da745661e74db8fe1ea115d50ba49ef5e6151a9ac2f3135f0232235cac7a53e1e8a70eaf0476000000000000000000000000000000000ff494d17c735b934c2c7fb8f413103188fdb116fa8f4d4e43262968ab0fa1bdec23b0d4d8b1c2defe624092de36610d0000000000000000000000000000000008f70b7e9f2d7083774fbce3bff58a1c73fbcbcd9cb049cba71c0c3f0c363517c8956240bcacdfb7934d4c67b1bfdd2b", + "Name": "matter_g2_mul_60", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000083eea9b5b2d5ac5f7ef51ca889a4317322d098a408a741827fb3419eb12a51c07c788c2798cb37635e224e99bbc894c000000000000000000000000000000001312ec00f4b3a4305700b44b3f215779a9a8bfcf5b5d3a7f237a33c5484099ec9bc5c8537fae768e2c0ec62168f383d6000000000000000000000000000000000cf1d5d05d11e1d07074dd34211d0f00eae1df4dc550c55bd2fdafaffa1ad36abd5da30c5d3a5aa2845b1d95a5cb571e0000000000000000000000000000000015223baa9f2ea4b04fdb05b05bf3a94dcabc5e64189aeee39c380de9a34fe6b4253f5795f70bbe51b80e1aec1eab7196d5b468797b4af1978983faebe59a28f34956dacf5b7f65d25548bcedb518f45a", + "Expected": "00000000000000000000000000000000098f32b35e3b7dc1862ca1ca3c76d009f016c6b91c227f2cebe8f1fe87567d936bf1c54103bec31b3552c077c0242fb40000000000000000000000000000000005380a66d48d348487624a15b63d2ecf6976b5b599901101ea8b1f57736649b4397f6679ecab0ae29573695a921ac475000000000000000000000000000000001710c368f70a2b9cc92ec65c4c2ca35fd63440eb350f488e7c6646f9c42bf680eb62a887d533a91e47988221b46c868200000000000000000000000000000000033c3327da938dbe4630dbe16838229d7d427f3adf18dee6fa26b1c8067838922c1bce78cce08d590ee1acf2baebc7df", + "Name": "matter_g2_mul_61", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000011a960cf1978aa2ce1731b857fd91d2f59d4b8d7c6871ef6f4f85aeff549a2f397949d11a4793926fe7be37f3a83d11c0000000000000000000000000000000001954f056834d6e3b16043ef1acd0a47a353300257446e9a1db7e58bd0d7c4bc9ceb3db51ae01cfed9de99621e96934c0000000000000000000000000000000002e2fe460e71b65595ed93a0010e5ccd1a2c16fc4e0d345e7226c947f29720d2f3f54282f79cec086d3fb1999b9629b300000000000000000000000000000000060dd8a7ccb613f1521168a8a322aef9f84d9708a893f704f4fc9a19e2493f25620a47e0fff1bc1e212e65e92873b4f2dbc6afcdd409e5d50d7b655580f1144de77f3efe5d6268032eccab7deaaad997", + "Expected": "000000000000000000000000000000000404587c60a4bbd8b5b929ca2ec2a9ff2ba4733f4f2877478a669b238d65ca130cba398899f2910d6de04615f8ffc99f000000000000000000000000000000000940659b3e6de7c3d8de9169a28e68dad433bda78de0991fe4a1d404e5f4babcba9d57c7f3d638aef264642f87c61fc8000000000000000000000000000000001676ce240e1ff70ab03f94f3ba3acd31725ec306ce1fd707e29ec22cf91746216dd998d03ba13a79dedf878fae38d68e00000000000000000000000000000000098a81422511f77191ee15d402614c86f9447ab78a89cc348414108f36857a1929f2b92ced78752ab3604f276861803e", + "Name": "matter_g2_mul_62", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001472caba61c2f1fe4b1d0912b114c25de103ef4351668f22f3a158d7a347539a7b6656044bd490f036ca3e29dbdded370000000000000000000000000000000015f8cdf7786410b409f218164063c99e77d8f72f03882a6c9430ec725ae574547d3ea3cf30c3ad2c9c3febe6c30b1272000000000000000000000000000000000ccbbed85c2809433fbcf22d6490457dab800b21cb4de414c7dd1804a0bdeb7142f8ffbb2de921c2c9eabee6a6351026000000000000000000000000000000000a404f42c48e3ca408d3f92079b99805004da928f128206d8904ecd7fcb14121c7d9a9e7fb69accaff921315ef3d5372807347519f114e78f99617f6b147ca833bff7be962c9b1e1f32b5babe6067d7a", + "Expected": "0000000000000000000000000000000010a4ba6952d22a51dbb6762a3f9bd09712c2be5a98bf0ef298d7a7e3a9735ab0d3bf39e40b334895c73a36c218ad24b50000000000000000000000000000000002860f38ef61b497bdaf4faeee7b406007981c17246cfa36cee906452ae85e1c1c6385898ebadc3b4ef8887fff25b8240000000000000000000000000000000002dbbca9034fb17c3f37727d44c027cdf47c36f3f628ea9385fc9fc371d23f22d983656caafbf1cd1f8bdeff4ad7669d000000000000000000000000000000000b7e71b65765c4113a7884771952268a9fe10576f745038912e6877c78372cd261220793b888c43accba1646e902fe14", + "Name": "matter_g2_mul_63", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000b52f05365c4df20a7290aee71a7e030615d1a2a971167884d835c24e756a0faf6ed0552341c561446c7fd3d5e887d830000000000000000000000000000000018718ef172c045cbf0bb132059754b62414097eef640a781db6ad521af5a24d78c622d9402033fa939f70aad0510a1ac0000000000000000000000000000000017e969e44b4910304b350b5d442bb6a0b71e1f226cb4603cc8b4dd48614622f3f4e1ddecb1894046649d40f261d94e030000000000000000000000000000000004dacaeb9e05b9d60ce56c17312a092cb988bff426b8a718cdff860186935507a06eddbc4a1a29e4ef88db83fc4b6e77830630695c8dabe9aded1b5365bf93770aab7e9ef4140a2bbde2f0a7b109724d", + "Expected": "000000000000000000000000000000000e9c1a6d591be4da37fd6dc283b8d899b625ccc96371dd3d7731aca66cd2a978810497171f2aeded64fa2b10e480de2100000000000000000000000000000000006d2ad7287847255002480627782d513eaf1f68a3d583d4762fc156b8eb40deae6969fa8a7d8f8aae923800091386a00000000000000000000000000000000003c7eae0eda08df9b9eee2605a44fbb486e3bf2e409aaa1c8f38c06f969ff1f74338004b01288dce99be26a837e45d3a00000000000000000000000000000000178174d2f569a9392eddd2715ceba8762c5bcc6325217db5e5f970d6fde069d0e48a824e5b6ca017891de175c92f6b29", + "Name": "matter_g2_mul_64", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000019829d5799eed5a081042e4646d46fb6bead6d3b9893a4240867b25ed6af6a3e154514f244466d80e3b9311e060bbd7100000000000000000000000000000000156157a654db2813cb9c1b4da0a3ee192fad076bb2767020fc5fc00e967c1a35a367ffa375703e1181b3705ace9dd28000000000000000000000000000000000093385a6a9dd0ab996df54b23f47f4a49b3f379e11bc8331016ecee6161fcddd22f6d49fbb21f098873f1e17424dedca000000000000000000000000000000000d5b5b0f2ce81e755b4030b33fe3a8bdee38c2c60ed3b4a88bffb9207cb762c0a5c699ff424c000ab080d763abc5438d184ef5eceadfd77b3a4092696ec34d0551c88e434567638623740b7d5f9e3616", + "Expected": "000000000000000000000000000000000ce12c9010b4c4afbddb459c1b46063a8488277948188b4ec0b739e1cebb5653681d0e43a0d2c6b3f842bfc609bbdee3000000000000000000000000000000001123f60cedddaf4385e63758d64d4facdc443854176ec199ca0df0a9c258517f2512594f2441a4b9a68aa9a2b4a1f4bb0000000000000000000000000000000007cc6f77d181d13bd9736ee23a33b25b0bd969760642ee19004e095ebb8e2b3c0e09321eb15a2f7961803c0fb10b6ffd00000000000000000000000000000000004d8dbf2f0c14b07ebed2b9cb4bc87df78ac8a34ef0b05cbc2c6fb8e8156415399fa52dfb968ef0e6ec697030fb003c", + "Name": "matter_g2_mul_65", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000003af8c25bdbd0dc1cc344d55366f15555709a74e1f0d8d7050cb6b487759db6200401b7868fca3c2ad26e6362a30e6250000000000000000000000000000000013f8b6ffe30f9a133fafe64461d305cc6b2cf5aededf68ba396d4e00df651531c750a3d94dd77bc5c6713b939b18fa19000000000000000000000000000000000dde97855d7728f409d873b83b6879b45ace5b73f317687fbf478e594a959ce21d4d751db646ceb20432e8311e67404f000000000000000000000000000000000fea997323cf29710cf0e3d44ce682e039d6cbda155e43c94dc8cefc5e94000de4b9525123b9615b5f1019a46ef37ad3a80d9efab033e920061cee8f8d7ea6023cc05f08340642613628b39e7b7fd0af", + "Expected": "00000000000000000000000000000000172805bc715a8cfb2e25c384214f4005aa6d3b809a0ad95322209851ef92151526a9d01a914c4d7f0c120b9bf3837010000000000000000000000000000000000473ceaa092a5ac12f38b4065477672deacc08e553d8e9e6391bac0d9ca50015934cdbc340deb05aca916cf50c7915b30000000000000000000000000000000012e85461fbd26c2d0235acf5c8665750656819bb939e8fae77a8d526ca23443aee395a985cdd4b1eb700311fb87e91a7000000000000000000000000000000000246d45fdd88448c93bedf4799becfc7c80e67abd483f2a0aa41e8bbb3f38cbc900314436364f1db6e1d88595544517a", + "Name": "matter_g2_mul_66", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000cdf60e3bb018407eab162822468255bcffd54cad9127054bd1c30705a4ebf1afc7f539cca6ba4cd070b44410ec751150000000000000000000000000000000009a2e3e5993b6a7007dedbbd21737a8c0aef3ecd4607953c4a24bb3fed97ccae01ae1cec024443f300b570a66e9ac3bf0000000000000000000000000000000008a21fed19e9ec2a741ade7767b0c9f39b79c3fbe34aadc9eb3043583768d893bf927d26231759290c7dd9c4f158d5a10000000000000000000000000000000018eef4ff88d63149d2632c9db586a4af0606644b16c82fbb0a3b869f1ff924c59acc8efbfde7bc604497ff68939cdd0845111c860f6f5725f99b225c53b9fe1a70150e7ce922bfe214900aaa2790d145", + "Expected": "00000000000000000000000000000000122e1f2081cbde0055fc34d2fe61307bc333b35a1e0772a0cd6fb25338c89824bcf2f066bc7b571b2fb314ca7f45106c00000000000000000000000000000000027ed81b54372d858a6ba2faa65fdc132efbca6ddcd56c3625bd9267cf0ae04f6d342209b995060f584be8d40020669500000000000000000000000000000000002a03427a093a3000a1bed9eba91a82dc2f2fcea1a16a1fb8af29c4988b589abe6a505ec87a82864b3c683beaa6420f00000000000000000000000000000000134bf64871d69a72e42766c2903fb4589b84d7772a62f7d2f8f8d02a914f4d3a278c680c626ef4d69de8aa88b57589a7", + "Name": "matter_g2_mul_67", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000f5d47911596c46c0c08cac5f5e7f6d0609874da4ac1bd4e0e59c393273a5fe31a756c7cfff2a01d19e79d209d7c6d3e000000000000000000000000000000001010f864eb6624132d4436d18db7f5b34727060dc426c109886be88031e3c155490cb3fb09e1fbccb7912875477c6d840000000000000000000000000000000005cfbf1c2ae1b80a8c7cfb2cefedd907b0552794f4fda101ca1a723b18de8cbce30eb54287e1847cee3f416cd8b45f2c00000000000000000000000000000000084fa63781f7eba9c7e911ae5866d485bc7e90603541c55d1ffad8b3cf7547fd57fb24b14002560e58410b828513e109c07041840216d60ff445cf53b273a46016c8ecefefb53550f8bafc79966f863a", + "Expected": "0000000000000000000000000000000018fa44efeabbd1cc47dd9b1a1195ca921c99c77ed43a44502aad27b6c663f5ce2623382c3ddf208f42e3eea741281f4300000000000000000000000000000000138d11e497e3c5656bc8fc0ae4322a0bfb6fc20e249a47a103b164aa3d9fdbf7df4b1e3b0842b4b12568a31992a151f000000000000000000000000000000000182490d6ae35c1208c0d608984df4988d057f3ce5a25073c77cd5b224a5892768badb1ad5cef8f41d1d2022573098c320000000000000000000000000000000002a6e0523781ccdebb75063dc7ad1a9526f9ff8ea1364bae487914f254c0eebcbb2cfc3715fecb9599bfc2f5feaa62d2", + "Name": "matter_g2_mul_68", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000124870cfa469136c638e0cbf15802f2699aacb66d7e4c2965c6759dbca4b7e47941ad9ec37a84db1afeeeaa65a7418e4000000000000000000000000000000000d4503049a6a53536bdf41dd832a6ecf3f10554887da7e389cf940394e1d88db94369b7947436546eb6c6e82c48dfb9900000000000000000000000000000000053f9a6e1f05b67cf553073358009a172e2ab8b43572a974da1f3de85a29103b13d7e67b2a359297172d27dba5c61439000000000000000000000000000000000abc29f50ddc1c113c73700b9b9796890cbf48818ba981fdab2db27ef1c58f4c2e4595b99eae397d40990ce2f6c9317c29b031b82dc8c9f4ea9524793b54207d4e13a548d73297f2aa6241aff57abfd0", + "Expected": "000000000000000000000000000000000dc7488491433d5b3924105c01ffed4f30b755d7253d867fda595e7d80197823e56e4d182d5ecc72d8ef1ba9bca15a310000000000000000000000000000000007bfeeadd6fc468ef6340a2b394c155bf50808cb11e89adb0de5499fbdde91760e9531c1deb23050286a15e5910f1d5a000000000000000000000000000000000f096db706b08485fd577f37b7bd232b5a10c3f80c25bcf82f7a3b666c6efaac8e856bfe5f7dafb7457e33eadcb4133d0000000000000000000000000000000004460d1f25159ce6df59efbd7c693355af4634dadeaee2ced68124b2a887698c10e9c4b40c4f4f9c8444acb881ceff65", + "Name": "matter_g2_mul_69", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000007d2aae9794b7a7de97f7146c0ee8415e09e56fd42535bce6773cadd6f7ac09c4eafe2e926cb7014377e54c703eaa9dd00000000000000000000000000000000172a4a33ccf99eb0473b2c44d30bd53159afae0c7706ad128bccf6258974d5e5761f9be43e618cdbd96027aede7fd5860000000000000000000000000000000012601bce2171c6e4c2968a3efdf1491285f9e4ab37cf973ab5c8e224ad5b40e1b6459ac89090c73deb8fc79fec7fb8e200000000000000000000000000000000112a6443116e6f98ab348e57daa3971b5fa506e40515e1611fbed3e7dd64c5c1e991e0d2539a70eb93e3da0f573d6b2263d26ae92119c7b06d83d7e2922e06559b1740eae315c6623d3e543c9bf54258", + "Expected": "000000000000000000000000000000000f1aa4a7a22c568c41270d24824138bf9ffc763a5356b7c0bc1d051a0a0db12616700d9214972b63eeb2a398d27dc83f00000000000000000000000000000000020d0c2ff8f93db6b415c2a01712034e46bdeb6e665a5177a3877db9f5401d3dccb99907ef843062e394c1428983725a00000000000000000000000000000000088abeb6fc3ead45d5b261b7d684f168ca8f5f163cf338863e6b102dc40e2cd0ede97c47460ad6f560c27e95c8b71ca8000000000000000000000000000000000ca2e5cec212d581c737928512118e2f51a0d74070f40a998b7b06d22b9fc754bb2fa5499308058be9ab81521d057414", + "Name": "matter_g2_mul_70", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000030372914b83644fa4db1958831e9335c72ab7a811fb337696221a3290e4c54bc10c2225f8fdc3a9f62632ba2f1594500000000000000000000000000000000114205926609470b6022d24046a1997c048e6d2cf6043397892c967692161c0ceedf409bf5e1199a64eabb1ff8de23640000000000000000000000000000000017cdecbe73779855b7b94920d4bc8ad057ce51c5481a5579650df8a5bbc421030d2ac44568217c4dbb13d7c639760236000000000000000000000000000000000f194fa814bfa7396697bd812d9449d06fc61b580d7a86429fdd1ad376e21ceca139356d7d13964c3c684563675711c67a02c61a7a75342ee7f0745886c0ea2a73c21500aef8078d21d20b7216c2990e", + "Expected": "000000000000000000000000000000000cfa23c46881893f6c50d238a83669deb520a7fffab4f912f77df7cca43f6827a1a0ae0b3f36c8f116ecefa33b8bf37a0000000000000000000000000000000014b7e5c18d2f9bfe15b0c1af3bc6e230039a341e135837d123e91cde9cbcda298c66b93f692232c912e5d7d3d6331c430000000000000000000000000000000009c8984999ecd3a4144ccb925d3e5cae5c1662dfbf8871013b1cb2946482fcb075c489c61b8d6261f2574b44da3fc1ce00000000000000000000000000000000196e7feab383211e4825cf98219c63bf9f45a72d66030219cb585d5d25237a01a97f00e122db6a51325022e69e7d8cdb", + "Name": "matter_g2_mul_71", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000015d4ae1521acf897344c3a76261754ff99742585af4a0ee86dc473a88fd408091404df1da9d8bb291db68bc9c07d6b2b0000000000000000000000000000000008ce160213875c661163990f3f7ac219ea295db5e828354864517ea8689ec15d35c6df78ff14cb276e0c97ffd7fbc09a00000000000000000000000000000000038a3ee211e777d6d6b7ca6c7a0d2130f1a071c030eebec412c3a0f14c3584e7c5cf15de254a8f141a8210a90249ee5a0000000000000000000000000000000019f7ec6b2fcd8b3190ab37a6e843340d3f3fc092f5772a042edbd5bdc967b96e8a1dc9e435b8463496aa1301f87d0e5a81b0c87102055dc2901826875d5e85a794befd93fccca2b9c0a1f70ef5610d83", + "Expected": "00000000000000000000000000000000005c0282830934ea09c9f51b52cb6dee75b874b155c63076dbac2cbbf220863d55557ff1b7d681fa185435df1522f49d000000000000000000000000000000000a1680ebbb185c8e7d8a197a523a7a5e618f97c46670622034d312b3eeef140150e03b00ae3dff8d9f1d872f3d3dca380000000000000000000000000000000019bd2eb4bc25f5aa6bce206f0683dbbbbb002098a118fcfb060c1353a310c2baa1063a782bafcf6ff6bb8edaf6f1597a00000000000000000000000000000000082edf49a0435e0b9f3dc7f207711d66004ae688b18f5b62fd1596899ee8edfaac7da38973d81f12200018fbe8151572", + "Name": "matter_g2_mul_72", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000fa7f8fbfa1d4ef5f001a451c55ed261dee344025e599884b29d086e15665867932120d33bee579d5eb1b7e6c7299f310000000000000000000000000000000001f06356f793350b17b47a623059a068800ca1eab6089c7c146182990063e8e23bbf40d95a42bf6e976224b680b75bfd0000000000000000000000000000000008807f6606d2302450bfd8b38fd4147b851ff59762c1ff48f9442c4d7b77a32c5e023821eb47fca839a27fde60e5f61d000000000000000000000000000000000c5b92f1ca9c20d4b6b11d794a5853824cff20d9267a20a7aaa4bed8bfdc728c4d4d50feb8f0b569757b97f473138db1ebf66fce49c6beb12737fe05e3adc0a51ecfa9144ccf6253088dd1a7a483de07", + "Expected": "000000000000000000000000000000000b8a715c1c2792a30f7ad752a808b621c34af1fb7f1e3392a36ca9481a019108a21e3ef338a1d05f2f23ac3e2cc42ed500000000000000000000000000000000101375c9de592031c55a7a62189fd3fa3c565abf7c64724796dca3b1c7a6e6834a16ef1c4e2afd6ce2e69487260f0028000000000000000000000000000000000cd385ec8245431d3b1aff88453db7f66a5d7888a5c1e0dd0abe9ac7db752933a343b8be53b7bfffb704768ef0a3dc5c0000000000000000000000000000000015d55c8cddb8715e25fa260d1e1fa672ff76eca7c80d19d00678fb9d08759b810cf266ef0a7e9dd749a576ce07240fa7", + "Name": "matter_g2_mul_73", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000001191410ec6c5ff628bd25d35965f5e9fa7f3c3d8c0a9a1ee7ae37437a97c25e221110d892e2c7a0e9c8e386774eadb80000000000000000000000000000000003be30c25a18cdab139277232d8888f6d13112c9556895af8030f1893114d5845d895df9afe3c6f9ff7ffb1919adea9200000000000000000000000000000000197f6b4e38be0358a3f1722664c61e62587ecf5467f8aadc3a236b47682a75cb76bafb18a5c556b321d5da49cd4bfd4e0000000000000000000000000000000002e4ebf7f22d929b7421a600e67fa2e64a59edd87a2e2eb9dce1f06d3c793f1a812bcdd510e654d44fb4c1de8c64ba9f0305523dc79dc4b905e65587fbd095ed57aa42403d2df5dd489db8f50c99e9b6", + "Expected": "000000000000000000000000000000001311de31229f1825d0bd2c9d726fd71e05828a20406a4705ea65f441537486338022bac4e552bf3c25e15717bee00ba400000000000000000000000000000000052e082cbe36c854a028a041981fed87d39fb218a88208aa1096e260a3932a1155db7f306c32d133070b0a5bb6d161760000000000000000000000000000000003269d4afd20002873f4305018a4432c1925eea28486d657cb458198ff2df9d304bdfc7455233243b1712d8663591d460000000000000000000000000000000013376fb98929cbe7f7d090d1c9d5c4f6332bbf25470aa03c35a70481931e4bc91c937029a5e11d2a3418eab698361227", + "Name": "matter_g2_mul_74", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000011c6f1dbccde640f63ad7d40089779d01075e26269421b4ce12fa5341f58ee9110f17d08dc1052426f2d00da2dd70b4f000000000000000000000000000000000740b147bcdf06705971c113a5cc12fb37345dd59f2cbb5ff500ce2b347fc5a8199cb3007a871670d5093f28979cfade00000000000000000000000000000000046563ea98b5e85b3c42222d5e0d8481e6aefaf077a1b99f2b4eefb397ec846aa3659aacda569054c9c8b9b69750272b000000000000000000000000000000000812d887943506d68e3525ced9b979354539b7b14003a3169e0084c26326b92be67346920c9a99ef0f9638e8991296feac23d04ee3acc757aae6795532ce4c9f34534e506a4d843a26b052a040c79659", + "Expected": "00000000000000000000000000000000021166263d1a443d5b2eee9aeca3678ae4c2b44d556a7cb9631d47e4fa3bb05ecb94d6582f4ca0cd787027fb5f2efab60000000000000000000000000000000015335d034d1a0ce78e1246a16e35e0075f73d4a392da1e05c11388084cf80bf31d499e57c48f4be6e72d3abc7b387ec6000000000000000000000000000000000deac4ae1900a4e1814624fb4b8c7a3149fa9cff2ca97f02e7d6765e034a1532a7b8475ef7aef5ebb851063cf4b9e79500000000000000000000000000000000161e3af03f226278a07ff3b08e5788f6c5029b2c8293e7a7e3ae11c4d78676b60dc0208cec6b82e1714d976007fbb389", + "Name": "matter_g2_mul_75", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000004c8078fe8567013e8d05a546934026cdeee7d485e30d739407db16fefaef53ed7bff0f9adaaf064aff014ac919d91c600000000000000000000000000000000107cc17f485af7f22e07cf14c5cad6368323f720511fc9dda677b360567f769e47a77f61274927ef9b7be48a77357ec40000000000000000000000000000000001487f0880a6cbdac33ca35b9b65e4ead9d8c2e9180c993bdb2052060325aff8c62668c643f0cd9b4bb1f06a3dc74285000000000000000000000000000000000d4b2d062e31fabe8d2a329dbd6417673a519f455739d140246f2b3e43e20f390088c08e545bf0419d796ac71aebb5198586d7ad8fc3e4fb42981a4415224c0d976ebe1c342e9bc1cd66d35168bae33d", + "Expected": "00000000000000000000000000000000120b4434babedbd8ff295a6e2ed5fc7af0548d7e60663110050be797584c0cb638988201ae7707cbedf0c8b3dc5ced85000000000000000000000000000000000d2de0a260bdd241a145e3f68a6de48da4c65107a500e02bfeae6ae7dc428026c7c3e9bdda9a3069d2744705df2eda9b0000000000000000000000000000000018a237906c0e277541c4f00c4c2feba7cb2c9b87709c18b62b7c36d78fc118cfd65c127765e01dc0ae5875b9552bb45300000000000000000000000000000000197485daf54e98e097b6bca24b0738682969256decbf3ebc05f6982e4608829f37e2877937b3f26b88efc3deeb4bfacb", + "Name": "matter_g2_mul_76", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000811e9b0acfc10830c074c5a4d9f4d9382461eb523a61dda0b77f1c43b285fc5c1ef3a1fafd923addc9a6e904505a255000000000000000000000000000000001113102d015dbb509f0b8d0d0ebb4d3711c4f0e1e3d55fb0af247dd24be4fec9d6fe3ad73fbdcfe206891bcebefee4dd000000000000000000000000000000000085aae9e58fb97b96ca3c089acab7bdbd0c3adae141bf61075f5c13145b0d07113f1075dfb959bc7c2d3d3b3a06ab2a000000000000000000000000000000000bb5eac8125807c10270d94e5bcf278241d6fa82f68e41b5529b28aebc88870af55881db526f7bd221a8c4c0b29a1b7d6e7db0fbd2a7327c85054b4c0de9727dc0b051058f8bb4ecb1dcc7f825781712", + "Expected": "0000000000000000000000000000000005de82540aa67c69b962d292133b09e6593961da8944ce02557141abd19ac471f766b4083db85c67a44b65dad2202488000000000000000000000000000000000cd999bf3cb004074fe9f355cd8dfaa7b9d3439d902fddd2fd0688419b5b7f8c4300ab26b658936a90c0b8e1488249d1000000000000000000000000000000000f97ae779429a5afaf7a3343586eea84a4e76f00a1852ce42a4940babd565bc8d61bf72fca9b123922f1ccfb1db8c06b000000000000000000000000000000000935960fa941c27e74234a07857ee680f53c31047235c6152d1669724bdef37ba642cf4e0dd355443ea470e6430def8d", + "Name": "matter_g2_mul_77", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001335276775545fbb4c701beb57cb34312108c9f1d46b4aa4b09a16faf0e648b4e80848bf5e75ed8730715f0107afc9820000000000000000000000000000000006ffff8736bab41b4ee5681b741a81fc870e648001027161144254d04c678e4f954e9f191bd8b26201aec681cbf0654b00000000000000000000000000000000026ede90d14fa0885baad21f9631bae058573251cbef5757bb8cfad061f3bdc78834fa5862dea19a2236c014b0f1652e0000000000000000000000000000000009844d0cf7f6f3401145d8d720defa577ca46b49e04e39c4c139ec6811a574e7dd5ce3acd00d1ce9496f10dd15c6d94685cc8d88273d4aa822f44a447cc22f5a58c420bcfe757a459772825619669a72", + "Expected": "0000000000000000000000000000000001b0aba02b0e907c03d2f4003083c824ce60f2f55f70dc6ec7c7f81f3d0ef4bf533b4c94833e36e8aa7aeec18b7255de0000000000000000000000000000000004fc227a6ae303f3006f75193cef7c653e6bddd28fdb843b41c7d39966a701ba8fcf611efa71abf059d7d98833480e69000000000000000000000000000000001077fddd0bf3d5c80eec653916f9095e900cf165315d74a872219285f62b5412536e43c4cdbc120ec5c7753318852dfe000000000000000000000000000000000ccd90e01c1d4a00f0d9e29a88e8134f2cf68162da66bd343645a998730190114a6921c9b048dda58b60b42a133287f2", + "Name": "matter_g2_mul_78", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000010192b925fca096682acf138833b12d96bf97c9a2e69e4266eaaae1785b9008f36082e23e2d42341427edce24449935f000000000000000000000000000000000d5b24a94adadbf542aa663114096bc670e1b6c99f3b661f55de121922452534faed7f68d6b431fcf6f3e379d7acf6b6000000000000000000000000000000000acdbcae49206b749d8c0d21017a33e689ebe26804d1fe7c863a2ea4210c3559805dcf73685702bc56e644b4e02614a9000000000000000000000000000000000092309d684fcdf44bfa321d473060dc2d8a8c66c51419894a3fbadbf1b56179c31dff25403b970d543f1dd0e19e56cf5b6e462d809f8bf1a62f276dcb27e42d9aa0ce33fc4e149e87181aca70a4ccc6", + "Expected": "00000000000000000000000000000000185520023714580a3f235e24316478b8260565ffabd39670811519066844e131e337bd62ed2069bc6d2305e6638e539700000000000000000000000000000000055fc74cc7cd3fc393d5b5ab2419414effb783ff4da2516e5465a4acc195339c7b5238be4e0744b3d7fdbce46ca7f5dd0000000000000000000000000000000005f584a0311c02d611c15163529130a2fb3dc853083e7225b791ce5ff32d5ef7039c80edfff317ce9ddeef84443b5a51000000000000000000000000000000000f9d5acb355f767cc6286cc09f6df232532f9a0e9e4ed1fe28788abecb200e22066c23f3ac6c49c47071cbb023e70183", + "Name": "matter_g2_mul_79", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000014441b14765eee30e8131a7ef62c3b59370f2f6f0dda20fb2a3654fa09492bf695de1d1a8f250bfde3c7d2ed805ffaeb0000000000000000000000000000000019d813f8be2519e89d42a9fd3fef09d44a996d6a4713a9c224bee10f0ebb196370d6231fad810edf9cb4c875f08357890000000000000000000000000000000001a5abea13e909bbefdb51ddc699614366f271b2f6490ac8efcca7759833f3feae11057ab1b9ea32311e7b6ea6de110c0000000000000000000000000000000003ac2bf3c5486ca176e34ec5212165cbe04fc9e8c375e3e999a31fe014eb824ea3f2d06b9cf8b86ce3a76960cf2eb4d7535b53ab5f1c596eb966f57867e021d0f3b099e17bf384479c959794b17d6a4b", + "Expected": "000000000000000000000000000000000ceb56d75f3aa1548c50d7780ea1e33c3d069b2f37e7f96be6a8ec03266fa8d0868822afb3b2e54750722266f6032a8000000000000000000000000000000000080f15b7f9f2c22f1afacf558267b5b84f3a6d199fd3349eefa2e46c4f332849c0955d19d4513151dc0f3b566c0058440000000000000000000000000000000013305f8ff6080f7da05c28155c0c2bc1c78d855cdcff0bb2c6b82cd5107d7a070d0830e6705f6832ed5baf75a659c8870000000000000000000000000000000018f4e136859b4ceb230450f9abde0325a4d59db98279d7fbab710305ff53250dae1c8789cccc27586c9b9df5c0c4722e", + "Name": "matter_g2_mul_80", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000598e111dcfeaaae66d1522be2a21131350577253a3f33bdd74a04b0bfba2940e73b62fefa8f0c34c4aa91b633f6bdfd0000000000000000000000000000000017fefff7d94afbeceb33714e9b5480c3a2f3eabf9d7f6e8507ae54cb65f69b21cd7d04d23f24e3a272c589f572b91864000000000000000000000000000000001652e3f5a99ba8dfbcd1f90de955ef527947642054be603c1b84b24bebb579b78e2a0be426ec21d32783a0e55f0178dc000000000000000000000000000000000a6c9ec91e8bc86ab198416cbc76239f0ac0b903f40310ee1f2066b01b08191538ca913c2736f53f23ef37fea13d52756e0512ecbc5a1b02ab19bc9bee4d3d9c721278e07b7a6e389c4d6443232a4035", + "Expected": "0000000000000000000000000000000002a0214be95f020c70221fb4fb6856af7ce3845a4b607340f85127b52f8a204efcd94a152835860a4ddeef84946671b1000000000000000000000000000000001767777740a9922a91c39a36e2cdfcd544df902b31812ffc88418dab7321f73406ab142055b5bb264c187f2d4f2d6f9d00000000000000000000000000000000026e6941364c74997506df0f9fbe6b2769839e8b7c7293f4e63d13bd7bee90ff779cf82adc2f23c569d1e13826cdb0e4000000000000000000000000000000001618ab2ffd4b823b9c9776baf849641240109b7a4c4e9269f3df69a06f85a777cb4463b456023b7001adac93243c26f5", + "Name": "matter_g2_mul_81", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000072e022c168461905f798e87425f2eebb517e473cef98c255d0fe434863ef5811920af65bc946b29d489b5dee1066c56000000000000000000000000000000000e7a9872caa82d191f6014c845e1b3ee4ea1ee89852b546a2c85ddbfa3c1d4ce99002e3d7732ccb8cfbd57d550285ab400000000000000000000000000000000144be65db373f6401d76e0ee64e51076b861e8fca596dd6a7f3b5735c23b0cd13248404fa0969ecaa701663a1032f48a0000000000000000000000000000000014c9e9c5cffc4518889f7742440053678ff1d9fb1a1a103d0c1f762b10655bd5849ce98f4bc5eae80bdd9e767aae4523a79fd15e80b694122dddb01f836460b3eff99e61ea6309d6b395c94fb5a43dff", + "Expected": "00000000000000000000000000000000054ce66b9b0b3cff6637d6cfdd788719d4e33516b98402d8fba54725309307711fb576299ba99104d4e7df0deac9ea2500000000000000000000000000000000055e06ff52cda9116a98ad3709f788d39db53844b7db58a57af52848ce1c59ec2a1f083efe79c5994b9291a2d1020fb900000000000000000000000000000000040c9ad63698ec78d06b41bdd6f5eed089b67f106348f9300f822a2d61ea1e5d2ddda0efd1025825c99cb0e243573f7700000000000000000000000000000000195dd00c48186f8d1337ca857aea02c4d199d638133e9cbd2dfc5f633502f656343746ec2a416465c3c0d4e9d53fd097", + "Name": "matter_g2_mul_82", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000948d0f0c20715f8658e1f2b4f9d32d851e584287225a2f47735a1f4c241b07f8d7c5dd8c13bcdf84e97d49817d4d88a0000000000000000000000000000000013c064548cb756b48600dd535af8eb5b9138f984bac0391df2e90a204fcb6c36017df910031864d802a2ff719856b336000000000000000000000000000000000000b7eeb7c9a01be88e573f196c2a531635baecbc8cff9af385455af3757301436686596ec7fe3618af26953c49f7450000000000000000000000000000000001332f4dbd5461ab9e2c8b3c19c6ff407a071018c92d2c17c1d1d481c24565276c0f55eee8692016c1fd76d70f44627cbd012914a96253926fdaabec06944ffcdb4637a05e3e78a9bcf1b21b68b9dd9b", + "Expected": "000000000000000000000000000000001141b59af8fe6cafdf2e247fcb0ee4642a9b4022b6d71163ec9b6ac2f7d10ee3c5c0173ac686b03cd6a7086b039ec786000000000000000000000000000000000f05ba6973c5d865ac5c037583b65eb4eac826b5a04a7ebed1e10bec6ec7dca93b1c2eba70ee0189fd552d5023f2a87c0000000000000000000000000000000002e54475940985ad2115223c5ea3a4c95890f3e9992e3e1a6df2170ab77143bcc5d29b9dcd1ed3bf16e545e9be21a8640000000000000000000000000000000019acc4705955761518cea482b83e3726dea8d1f66a5f19b06cd7ff95828e15d1b139077e0d274b0e6fb86c027844d97f", + "Name": "matter_g2_mul_83", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000d3ee70610b5029a28e586f0f3e65bb19a263db3438710fcb8073e1b25f83db50eb5bbb9d75cb20952a225023f747baa000000000000000000000000000000000682f7d5cf9d182b20ee88683f3915e8c9b03074a373e573aa57232de4e997bf155acf680e365aa0988989dfad102b2e00000000000000000000000000000000143962963e230a9154dc328f9583f5be6923a3b10ee7b1d0cd5f5cbff13913d8ff78ca315be7387900a50b94449884c0000000000000000000000000000000000f4f934b42452d41cc20d7b1ec547bcbcbcc10f215364ccf2b864db23a09d06e94c7a87165dcb691f4975323486757ada300c7e1041d94df0e0201e1135fa6eafc98bd33b2dfbe4c59b546a52538c07d", + "Expected": "0000000000000000000000000000000016fb5839fde95111742255b33f040c41dbd0f142d1daa8abc7c63008ba9f63f07381d9d6128240ae9b6cac5befad84e5000000000000000000000000000000000389a11727c356b8f3bdb6a73bc2f6d2d73d33d287365283359521dcac64f17810bd58c0ec5bef4db253bf630bdd9599000000000000000000000000000000000629a8af1bd0c1b1b6d7e447bb779663d7bae8e895e09418bc350e644d7022fa877496f30e2018f5dd1c9683b2715adf000000000000000000000000000000001950185d2574fe0c8277e3f93f59dc5628ec3487911ba9c3194a2f716116ff0bb9a39dde802dcfaa61633ad7657a578f", + "Name": "matter_g2_mul_84", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000005f0fd4080e26971ab16d33aeae04220ae23781da3179e38190082f1d167514bd73bc8ef976a2f333570e9f56a6c05e6000000000000000000000000000000000e159905d29b52ba61575c3a263093017783e1028b3701ccf060c165ba33a765b5265a9b1681c1759bfe2c9c401275e9000000000000000000000000000000000c5ac0bc29a49a7c37d772954da850e6b5e301e230552be9a94017d770ebe2cf4dcfaf104633623e024aef6db57892900000000000000000000000000000000002228e7f42a9409acab49cca82cacf306f6c6c29fd9f7e2ed12fef2d16383cdb7bb2b39ad598b301072c615232db1fa833e9cdb10fc117afb17803b61a2bca7de1d190a325639eb23743f51f28294b33", + "Expected": "000000000000000000000000000000000024c03edb9b54034eacca4b321d51397348c57f406b074b16a9d6215e03f842380f5358f5c095fcf5bf3cabcbabdc260000000000000000000000000000000014e62dc442135d729f65090475fb408ebae132cdf2c2932582af887ed54696f3cd15b163f11285b99e8d8f809aa2e65d000000000000000000000000000000000438a2c99df216c67d92b99d9ee8cbd0e9751e538074d146767bde9675ae3a05bdae051efcdc6bbddeb1b7a8288370ed0000000000000000000000000000000007c462a8f5720e442e1917bf75fc3c3dafab6c39c80d0b93d81d1db4080f6e199be092b4b025e7b02efce4f30d00299a", + "Name": "matter_g2_mul_85", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000180569ce03e4a0155285e733adb18fbca71225507a7adf01cb8e8648891525305e92087f58378f4fd8455d5632ad660e0000000000000000000000000000000011ab84e42f10154e306a568d7cf7bc381000f0add0500cb508f695a3b283ea69d140aa0ad48fce2d2d6fcafe60761078000000000000000000000000000000001136c3016474d6f475609606e8d0269fcdab9fd3188a512681cbc41eedeadfa3b3d9355e5b4503e8b5c3665e49fdf3ab0000000000000000000000000000000003f56cba1b9cb4302099b16b09c2602dfab80d1151685ef78e5054cd454b319adf8b5998053a5b9fddcffa020595e3bfc48b98edd9c229037751d02e58f3d4234d9a3b0ad9ae4947ae14beebb274746f", + "Expected": "000000000000000000000000000000000e8137c15436264b5960c27d0c22be7fc5d56a12f43b3832ad0d7f5abddbaaccefd140e2f7c476b99e6fd9b3a52743600000000000000000000000000000000019ee3caa56f0329a2e2acb8907b3edb21f4eee73e312352796b51282e097f9b10af61805d5c222332888737c7f8e227d0000000000000000000000000000000012cb9c610391940fed7882a5cba08eba4226c36eca8a2ed22fb5e752e0a1a5ec556673e47013258b499268f1de77bdf100000000000000000000000000000000031b769f606fa25b81a982db86a1cd442ed738019e7e64728ecf485cddcc17d9dc271146196178740b9f05f56627b061", + "Name": "matter_g2_mul_86", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000004d79dab9eef873f3415d66172bab7166ce0c71f322529bdeffa915c1b0d3fcd645c91dd3450ba61593ffecb95edb91e000000000000000000000000000000000d611a207d3222bba199fa083d0459675cb5fa00839fb4c9034ad868fc1e79d653c18651771431d6fb6b6b5ce8cf6f7a000000000000000000000000000000000ce802ecb106a4f0ca4efdcc058dd0e29deb6a5d30a2c15c8eda896bcdd3ac19053c10105328d239b26c5ddbdb3a95fc0000000000000000000000000000000001073e142621ecbeff6f81453660362545751f992ffeec3a83477fed3e6215a709ffe0d17b65d3369f8f3913bf000e844228758d2cf8105f2ef11d83018157a3119a44874dc34d5f0bddb533f50df52c", + "Expected": "00000000000000000000000000000000080807a0570b628549629d2eeee39de773badaccefb76e01efaecb0ef0356f535d32c3947f0613bc7d847ef8c8778f02000000000000000000000000000000000e8c091ea30465d204ace72015cbef29645206390fd92ba7c4aa0fecae4ecee53c0b06e1fece99511efd8c7e9cff1a8c000000000000000000000000000000000c881c678c94d80164bb3295acf4341fe6c726ca64a1a015c890450e719b85720f41f80369f99ad3e7e3169ede0113e00000000000000000000000000000000008a2fe01a7100afda40091eb0b2b14cd00b7a4d8bb5cf9d9a3847970a94f2035fec7f292c04c38d7e49890e612830aeb", + "Name": "matter_g2_mul_87", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000bd84f04b3858b1138b1b429c7216d5d1b1e99c1e0fec26440d59b1ad79788c2d5583122c2ad769fcaa6d10d816a1f1e000000000000000000000000000000000387977ed1ce5da51dca230531bba53d17d3de5d593ec576cabfe6463d5164d7153025dbd4cb3525c4145c4f6b85fc76000000000000000000000000000000000a19c943a90fec6921367a2edc5bc38a5c59839cdb650766a2d2d068242463dd4460bd1d0e7a7fb0e3d2104704b8b3730000000000000000000000000000000011d99d44b200feebe00bd42809e3f67a23cce88a07165416cbfaf4db14420f99e54d62db4280d2c99ca0bc3dc41eddbea417c96f0cf4355a78513c77cdc676a7b09125802c8045756da867e0025a36f1", + "Expected": "000000000000000000000000000000000d17f6d9460566d0543df2666d6ade685565e668521a87fabc58148343085415fee92c32907311c9d04713c34bf7690d00000000000000000000000000000000185da28f07b86885031ff5cda913a85b0e4d07673f456ecf2a9f0fd1b21d99e22442f9b705039252d57380b6a42912050000000000000000000000000000000014a4bde5973ef43691b61b3c0f6c2fdb4bcd6ea88e53e2787a7d93ad6e05ee2e69f2799712520f72b3c577ee278008ec000000000000000000000000000000000d92a565b3d8d0fded054a75198b31c521e3223650cdf762fbf7b851f7ac0fc66b8c86c20b905117585704c23b27e7db", + "Name": "matter_g2_mul_88", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000006a186aa584a466a860849c78e4922889c95a4ac6f39c99029fbb422c43d699a8baa51aa4ef51ff99557babeb3e9506800000000000000000000000000000000065fb15b5a0923bdb52dbefc7e9f1a898e32f17d610bac829235446fc5e1913fffc8176e0fbd33091505761f1d06d8920000000000000000000000000000000008bd358698fd073f660ed608462cfcef1da9a59b10905f1d98c4fe66958e56802814906430c10fc25a4d351d91f91cb0000000000000000000000000000000000a53638b1b6c6eeff468e099446300ca7c7bd899c6494682d14fdabfa9cead0bb37a0325d99e7d0ba6341cfa1d257ba846561328b7689b0a89014823537cf9eeaca6ea5c56a3e58d2abfc2ee455dfccb", + "Expected": "0000000000000000000000000000000008b1ebd753364a5a0a6296ab48b348f91668525c0d5f7edc4f2d29844592f34a209f9e77f94ebb38ba76bdb3f96063ec000000000000000000000000000000001062e0ff0a67372207052e2520d8b2823764a5075c94011afd6c60288e187ec77e08db01c95dfa195f2409b58c9dc4e5000000000000000000000000000000000cc2b87b613d97a716586f371c457fa869c2b8d1fa1cf4b9e8c34bae23e0544752b997df4711d0712ec11d3a9d96ac2600000000000000000000000000000000140eae891c87c2026f0b1293df2bd8ae2dcb0ab3f8de74676f37c905334ac1f53fe4b75511691dcf108fca51abcd524c", + "Name": "matter_g2_mul_89", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001070b98c6348a67e996626ec2752f45e4c007e9c9668459a777c03fab633c10236a1c5be99f3fd950542d5648ef9e88400000000000000000000000000000000073a564401cb1a3a53334c0a55da261814d27b86ebf40b02a76b20973ba2db92e42c138ca7790261c2d70401c984bf470000000000000000000000000000000004212d8a9e4b01f5c6814a88561c2c6143eea61327b031a2e0e4bd056c12dd7098fdfe4d1511bb441ad42b55b584a7bc0000000000000000000000000000000005c5d23824b0fe05eb962194550681c57c1566b315efa8ebc90b3593d7d86ad18328baab8118c9f47eccc0757588591ccf6c3fcd4b9e6b72853934b306a078b1f2fb17879db4a0a93d484abbc2b746cf", + "Expected": "000000000000000000000000000000000276a138edecfc9378be4e241d64cbb48bfa6fd4fb1788f8bda870d5ec8b2132fc9ec888ef84c43a50b7de0527def36800000000000000000000000000000000153e90d52c747859f88223555bc8bc4e8b6fc846fe7028de728a4dfa085c6e350f9f1d12b9dca4ca8e07377648544400000000000000000000000000000000000cef00e7217da6df0a6d85f40be69f154300c423e86e54e513b2491e65002e308445238082da69aa9e5e83b5f4fc17dd0000000000000000000000000000000008da1da2a0d1da9d2158b9408dd9b0eaf414d237b8219fa7661e40c1a88eac2f9735d0dd6ad67b85aab85952369e8287", + "Name": "matter_g2_mul_90", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000b1b3053774ad5515a20bd4c556d2b3ba95fe74fd0c955069c7f933dfd718ede90ac295f5a675f1c29dcd9701978353700000000000000000000000000000000145746ce88686021a0635bf6f0aa2f77c48bdb364cf4ffa804a57f95bd69d24eead05fbee24021c1ef57e1c7c7b894b00000000000000000000000000000000010ec4795a0762b86f3b83de1198698af67fd1b1be3ddef48f35cf82bc96d886fbb4c75064f51a9cfc5f61630c95d0ad1000000000000000000000000000000001465e31f58892466b8ae4b76a239d9f8d1ecb1834886344013cd1df0be13591798868d224d38213a6d75b02a1fde0ff2f6787b565e8d71be6fdb0c97c4659389c800a2047f668b366214adc716f402d5", + "Expected": "000000000000000000000000000000001484993096c210c7bebbc4c0bda24b44a70e982b2528215c0e8578ea55f1181472758caf935aa0a3d6820cdad753e2f90000000000000000000000000000000011802324a6e03c3174bbe7261ecf3812c1a97e1be27269214f232274a3bf82775d47c5fdd70fe1c57155068b296d394200000000000000000000000000000000050f43c874c1cfb5fda81059cb7b4808492632fa20369dcfb611e503ded81a49dacff253e31d7e27ee84bab79e3c5d53000000000000000000000000000000000ef945b6f210fb09bf0ad5bbd4b5a6630f43304ddcb396807c967eb5146741f7432bfdcbd7e5f3d29917781efb62e6ff", + "Name": "matter_g2_mul_91", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000f39e731e6ddb7496448c912ae314e833d28208252c7f8e27bcf7eeaf1da6e2310538b4ef0d55401c6552e91fd70691600000000000000000000000000000000069d3612f924961f827497028737000513548ad8e104acee28f014e730d4752a583cb9a893e6169b71966a1c4a4ad2dc00000000000000000000000000000000090899907edcbd336bd4fdad0dd67c578ced4481a25b864b32aef920842689a2c23265277a6e1d4a1dc1b5047a9f79a000000000000000000000000000000000055ba64e2502baf68e46c759fca30247a080464eda2b32e7cfe539e545d6aac6dafb731c2c45749e50513979cecbeb5440ed91f6ceb2ccf87e4106a16227a3cd7b2821b4f3a6e629001f78ba1aa7346e", + "Expected": "00000000000000000000000000000000028233bf12e8dbd8510f119be30ea1fc13b755c6ee3ca2a3637a3bf8f73776c9d1fe231b713396ffc579ef9320a05b150000000000000000000000000000000018e7c00b8047d64ca0c5df54486439c5fb3d1414c2f71cf8a3ed591b7c45bf18b37473daeeadcb625eda638885ddb9870000000000000000000000000000000018b89c9b6bf9ece36f1eac08fc35ffc9f7f964a0a9b19d495ae1361fb4bc98aef8770efb47d9961aff694b878d659818000000000000000000000000000000000eb2fda2c29c6761e35ca4c9772bb232ea0d297582af4f50ef76c0b74fefd414b535e356c069f54ef5224225e95be6e7", + "Name": "matter_g2_mul_92", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000042f1c8b9fe81cdcabea047d0998a1354ce09d62a14f1d0e9d188e2f35f2e1845c2b090c5e157595b33108c67e6c184c0000000000000000000000000000000018e69d3564d4ccc0306e1e6b227b0f961aa9afcad59d4ee1737f980dc876609c59a4c6a3506f987467beba0764b857000000000000000000000000000000000012ce5883156588cfe0f4838f819f985b09f1eab40a5ea8e30fc5d70d029a01a4537641248f4c21dd203909e0170737c80000000000000000000000000000000002888eb9778a4045feb5899dda258657b9f41345731ba630fbbf186b3be4b58ffc7f48abb65b693b573a73f85440a7a7ae8ddfcdb4748981acb9b2037c017174a140f2457fb0148fe807fd194a9f7be5", + "Expected": "000000000000000000000000000000001239935827fb2a269ab064a3ae2bff2555f89bb3a71a47ae815ef755fc1363a89d20326855cfdd0e13f6c85f727bbe120000000000000000000000000000000012fbba047478b5f5b07a582200271a0c331d6f76864f9b6c6ef8ae6b0965eda481eddaf72c7a887b21719164c633d39600000000000000000000000000000000017eb4353b413437244983554a639a9253d105395ff9652504df7700d879cd9a32d5f0824b1eaa532bcf2fea34f8f08800000000000000000000000000000000054ea45475c01ea0557fd143b21c7bdcab6d287bf6bf4f88b6fb06e02ac6fc5ba96f323bb1fda3a1c4d8f42d01d267b2", + "Name": "matter_g2_mul_93", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000051982b46a819c74105cb36da871fb2415328a1531d155856f6551bd043eca62ddb61f24af429edda830fda31e22cd340000000000000000000000000000000006449e5bcdb5619aac542f6633ee3e06a4fd56a3e1ce4034efc608131ff6ead70ca63e70f494f519d5c577ae7119c8c200000000000000000000000000000000153f4f5dddd5801fbf7f88a735b9170d24d5b63861d50cde9644579dcff277cdb0d5fbfc3b3b819a1172de05afb9135b0000000000000000000000000000000010fdea84983fe6c08cdc4b4ccd462bae2ba791ab5209363b10b3ef342c9a5e92184e9d8be1419e3d88402bc05bad5fa21268803aeb58a2d57fc797358fb456d5cf96afecb1ee0d2b90782aa0d652b8c0", + "Expected": "0000000000000000000000000000000015a145e379b7ecf4566a039b753f91e8ad75d9e9c9a20725ce34a900eb9a1bdf66cabee2100208d7792a963d1fb8c02f0000000000000000000000000000000007f0ca14fc4e34bbdf5008d632dd112c7368e037ce019b7c4ec412000ac02302c85ae64f9ab495361fa5b620e46420aa0000000000000000000000000000000017c00a08bba18426dda40e773d79733030b5b3b199a62436ed06b773fd1f10688e8af00e8a223cdf242bd1ebbedbf634000000000000000000000000000000000a17365cd9f7655793682b72e342227048da0cff88f6ace33ddab548ba126017e4b7f7439373a893e3b5803e662814b8", + "Name": "matter_g2_mul_94", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000009b011f793d9a939d916d058ffe91b58138820a646cc450389b3074ae3715d06ddec1075afecda71c65c7ca085210c740000000000000000000000000000000003d4d20f4b93c1e90a0a06bd534d8b4fd64e4c4aba77ae42cf4c5b2bd95f8b02ec4069ea246ff46404e6c9eac632fbac00000000000000000000000000000000051e88c3adfd4d6a02d3f03812362a6cfba3a6c69b9aeef75b51106cc7f1750293d61e31f0ea29b5d7aa56debb6d2aff00000000000000000000000000000000086d9c4ea6769cdf49ffbbf7351023b4aea640e8c90f9291222fd0b5984bca4d481bf7e10df921406a34804e6a09f99df9a8a4e5c65973b785c1e2637937de239bb0fde34b786dceea66f6bb12eb4169", + "Expected": "000000000000000000000000000000000081b4dc78b74250a82da9d803876add659411cfb467860b2ac6f0f68929d6377deb71d6acc9ea8fc8c1286b8f92056e0000000000000000000000000000000002c5fde71346a255ee9dc896f654eb2e0c66f4cb4c51541d2bbccf2463ecf0085a22b9d2bdc5bef39d80c4477824f116000000000000000000000000000000000ebda0cd8bf6ac7e86a1bdbe44ed1e15f8ffa1fff92afd67fb564306882f35037b61cf0d93f278f15149c04a2e83041f000000000000000000000000000000000fc38aa811f5ec015f10a99bf175f1479d4983c9d2180a5e3da88b4e9b62ef50560ff0a6c2fb7bda4c46c54551f8390e", + "Name": "matter_g2_mul_95", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000010d48bf523f3909cf90aa58a9517ef5421f1212accd5e8a0f830aeb15a587e215ca9c340bb846b1d0474e43840b2af79000000000000000000000000000000000cc1a3976caf97b9d59f448f6d9f413eef8904f360c0cf912fe942b38d7fcc637a17038973a133608ae769d3e389b18a00000000000000000000000000000000069a6122c6f0ec68834b7617c755a7eb33a80a25acf95859da5ff03316447182f122d20d993b04e79b6fe859b7adf5a8000000000000000000000000000000000058c6f8c297524319bae6722e0a957d1ba0f75ee3a8aaf06148641c67925d15780e419a38ed7e07410e82769da74f2d070e7e2ae2751a1f71962726a31f77553c2da38f4fecda435b6e5459d5e833b4", + "Expected": "0000000000000000000000000000000007b46fcfb2cd8efe32754306ff2f503d7434168c1c3cbd7c80470cc5a5c8bda10a80bfc0129da349724d2d6431c5ac90000000000000000000000000000000000e1078f4f4ca993d90accbfc036219507bd22d00930ffcfe1227780c00914fcff845698b2541510daf59cc83d8b947e7000000000000000000000000000000000b7c6d9951570e685d3a71b19a38f5485f974f85fe8cd4b4c196d33a18750b278b6d374483d81dc3e15c9b8b9b5dfdd6000000000000000000000000000000001003a239ea4a2f213f0f646bdb62cbe4f98cfaf7298d8b2e0eaa07bf3f939e779caab5ffa0033467c5b297166df657d7", + "Name": "matter_g2_mul_96", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000156ca5e80be8c8c03a5506ce9abd22a9d4958c372678c0caf6f1329898507dfcb1f06a9464cf080bc6881fa5b7df1ebe00000000000000000000000000000000088174d486b4086b931010da298a399e15b60a113e08f571e096d3a4e94b57b3a684711318796eeca9319119b201abb30000000000000000000000000000000000b96ff68505c088cc03a1c2dc363b05bc8544728a12b29569bed137780523123eb17e68f4632383c252d81bca0c5ca9000000000000000000000000000000000486fc6e5224c5fad56234c41856e60bee4a6c1046f673bf7d5c1bbb603b141fc91074da5f9d3d41b796a2ebcebd9e74d16aa883a20307f5436354bab32b4633e83178f33626af3edb14f82724b8e125", + "Expected": "0000000000000000000000000000000000ea29b1e059560fec21c3692d4e632a45c88a807c953fa23dbedb271b049d7fc717333b498ed12573a896f872e795dc000000000000000000000000000000000de0d10c47df92010a6635e3403dd6e91a1bf35bfcae82c1008998e86aa2d18a6cfd3f2f1207fde3bb39b723ec4d3ca60000000000000000000000000000000005e2aef9cd37430b15e5e76b2c7870630d255f630c12e865caefe308a39833e00319406746dbb2af3ed32135e91eed49000000000000000000000000000000000c229fad41b0d27ad7b5db33188fa70b97f22e323e429ef65fcf98f5339e908c31df8859b863356e0fc90538c5c49cf2", + "Name": "matter_g2_mul_97", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000121fe97c62e068988ebff21d8129d52aa903afdbb62862c7fd99564d9ad72182ab1f3a1100223ae486cd76f6938e123f000000000000000000000000000000000968ddedb04f52140160061828b5f88dfd09aaf37df625ee6f66b9500d6608df31c7edf86296eccf8f9918b051a5e4df000000000000000000000000000000000b7491cb8f6252e3861d7160feb0afdd736d27886863ec0909a7cc711a9b71aace18b17a00a2999dd57ca1a74f148516000000000000000000000000000000000fdb280093ef45b12b694ca3390a865ee18e4c04b231e2c98cc28706d4cefaf4e654582ee03f34ecf1dfa9674489d553041390a2209b80f7c64d14965cc2f515d5fbdf37953f75c4a0203bf0d9fb674b", + "Expected": "000000000000000000000000000000000444a00cfd258bd46f659b09eef17be9929008d3d1c65e46cdc762eeaa2f0b52abfd636e6094e21983fad8171194c71a00000000000000000000000000000000090833e68614be5bf298e04e44527480cb35128bbdecae15eb95d6931a718f66869ddb68352130b4dd8a921ab3f26d080000000000000000000000000000000000994015b1b55340c3839d48320d178b2ffaa0bbff038f7aa63d4dff41a217582fae9613bc537fdeac8d0670c0cf479a000000000000000000000000000000000fc486e2a1680c10ca28d4c3bb22dbccc9572036512645bf868e7693ae4591569c973f9ea26342a573e23a06c2fb4b70", + "Name": "matter_g2_mul_98", + "Gas": 55000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000010d001a09cf5dc3276482185f26ef3f75d28cd6d2667eb08a7fe06c03b99f3b6c4d82390739b6867a314291cc642a8b2000000000000000000000000000000000587846a460b1f37c2e7f491f9a097b4e86e1943d9cd0999313f65627b3907f09b5d5ac1be376a313a959dd136f7e9b3000000000000000000000000000000000af439695556e86b102926d3b40e3e54cc84464e120de3b4e3c5541a6a5bca44151fb0594009663764c1824518b13f020000000000000000000000000000000003bfd9418c1e57269e222152d321b83ae090f216cb422956dd1fcc464f68526cb4a05cdaefc7bbe6e81d4ffe27d64db47cf23dee8d95d94046678f3bdb4b0ea3d4e3a1a2f07f582e2a98ad6eb7562cbf", + "Expected": "000000000000000000000000000000001375bd5ee66c330796bd8381a26cefa3f40f8cc8de42d4d59a7adbcd3852e6d632422e6ad9a06a6e497b23b17b1df87500000000000000000000000000000000165d8e7be17ecae9bf51a773da705aea42536d0fa3a2206267da50451f5104ee241811dd0e6710a80c38df77b126c009000000000000000000000000000000001559572407aff34969f83c394d2b095a7ae9f53a8e6c923910f256bb87b6ec076fa6acb85465102fd24d34031f88f7510000000000000000000000000000000015ff9ba89b55ef75f63732dec1e64106d7a912a6657fcc970dd011a03b5364117cca46d6cbafbc0c5049db10fa83fe6d", + "Name": "matter_g2_mul_99", + "Gas": 55000, + "NoBenchmark": false + } +] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/precompiles/blsG2MultiExp.json b/x/evm/core/vm/testdata/precompiles/blsG2MultiExp.json new file mode 100644 index 0000000000..b5b63625ac --- /dev/null +++ b/x/evm/core/vm/testdata/precompiles/blsG2MultiExp.json @@ -0,0 +1,723 @@ +[ + { + "Input": "00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be0000000000000000000000000000000000000000000000000000000000000011", + "Expected": "000000000000000000000000000000000ef786ebdcda12e142a32f091307f2fedf52f6c36beb278b0007a03ad81bf9fee3710a04928e43e541d02c9be44722e8000000000000000000000000000000000d05ceb0be53d2624a796a7a033aec59d9463c18d672c451ec4f2e679daef882cab7d8dd88789065156a1340ca9d426500000000000000000000000000000000118ed350274bc45e63eaaa4b8ddf119b3bf38418b5b9748597edfc456d9bc3e864ec7283426e840fd29fa84e7d89c934000000000000000000000000000000001594b866a28946b6d444bf0481558812769ea3222f5dfc961ca33e78e0ea62ee8ba63fd1ece9cc3e315abfa96d536944", + "Name": "bls_g2multiexp_single", + "Gas": 66000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be00000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000019d5f05b4f134bb37d89a03e87c8b729e6bdc062f3ae0ddc5265b270e40a6a5691f51ff60b764ea760651caf395101840000000000000000000000000000000015532df6a12b7c160a0831ef8321b18feb6ce7997c0718b205873608085be3afeec5b5d5251a0f85f7f5b7271271e0660000000000000000000000000000000004623ac0df1e019d337dc9488c17ef9e214dc33c63f96a90fea288e836dbd85079cb3cec42ae693e9c16af3c3204d86e0000000000000000000000000000000011ba77f71923c1b6a711a48fa4085c4885290079448a4b597030cc84aa14647136513cec6d11c4453ca74e906bbca1e1000000000000000000000000000000000000000000000000000000000000003300000000000000000000000000000000176a7158b310c9ff1bfc21b81903de99c90440792ebe6d9637652ee34acf53b43c2f31738bbc96d71dcadbbf0e3190af000000000000000000000000000000000a592641967934a97e012f7d6412c4f6ff0f177a1b466b9b49c9deb7498decc80d0c809448aa9fa6fbbb6f537515703000000000000000000000000000000000031d84356ef619e688a10247f122e1aa0d3def3e35f94043f64c634198421487ca96af5f0160384bba92bd5494506c4d000000000000000000000000000000000db8fefe735779489c957785fa8e45d24e086ef0c2aba2e3adba888f0aeee51385a82898524c443f017ee40be635048c0000000000000000000000000000000000000000000000000000000000000034", + "Expected": "00000000000000000000000000000000158d8ef3d5cdc8a1b5ce170f6eeadec450ca05952ea7457a638b8ff8b687c047799eb3dd89c2e3c6ca6c29290b64f5ab000000000000000000000000000000000807d135b6b007a101e97f5875e233b41f12bd2ffd77fe1195418a73a4c061248118ea1049aeea44750cd5ec83bcc1ae000000000000000000000000000000000f04136354f45a85a53fb68527bc8fbc7e8c1a0056878012b548a97bfdabcbd3fb8eb3ff187fbe65e1ce233afd2825050000000000000000000000000000000007b15428114e2ea094ba1e64df4c244f80aa2f75bbbf21a407bc84e80bf2a5ad787d02ae8a90cc1c137f0d898edb1684", + "Name": "bls_g2multiexp_multiple", + "Gas": 126060, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be000000000000000000000000000000000000000000000000000000000000005b000000000000000000000000000000001638533957d540a9d2370f17cc7ed5863bc0b995b8825e0ee1ea1e1e4d00dbae81f14b0bf3611b78c952aacab827a053000000000000000000000000000000000a4edef9c1ed7f729f520e47730a124fd70662a904ba1074728114d1031e1572c6c886f6b57ec72a6178288c47c33577000000000000000000000000000000000468fb440d82b0630aeb8dca2b5256789a66da69bf91009cbfe6bd221e47aa8ae88dece9764bf3bd999d95d71e4c9899000000000000000000000000000000000f6d4552fa65dd2638b361543f887136a43253d9c66c411697003f7a13c308f5422e1aa0a59c8967acdefd8b6e36ccf3000000000000000000000000000000000000000000000000000000000000205900000000000000000000000000000000122915c824a0857e2ee414a3dccb23ae691ae54329781315a0c75df1c04d6d7a50a030fc866f09d516020ef82324afae0000000000000000000000000000000009380275bbc8e5dcea7dc4dd7e0550ff2ac480905396eda55062650f8d251c96eb480673937cc6d9d6a44aaa56ca66dc000000000000000000000000000000000b21da7955969e61010c7a1abc1a6f0136961d1e3b20b1a7326ac738fef5c721479dfd948b52fdf2455e44813ecfd8920000000000000000000000000000000008f239ba329b3967fe48d718a36cfe5f62a7e42e0bf1c1ed714150a166bfbd6bcf6b3b58b975b9edea56d53f23a0e84900000000000000000000000000000000000000000000000000000000000b7fa3000000000000000000000000000000000e7a30979a8853a077454eb63b8dcee75f106221b262886bb8e01b0abb043368da82f60899cc1412e33e4120195fc55700000000000000000000000000000000070227d3f13684fdb7ce31b8065ba3acb35f7bde6fe2ddfefa359f8b35d08a9ab9537b43e24f4ffb720b5a0bda2a82f2000000000000000000000000000000000701377cb7da22789d032737eabcea2b2eee6bb4634c4365864511a43c2caad50422993ccd3e99636eb8a5f189454b18000000000000000000000000000000000782c14e2c4ee61cbe7be6e462a66b2e3509f42d53ff333efc9bfe9a00307cd2f68b007606446d98a75fb808a405d8b90000000000000000000000000000000000000000000000000000000004165ef1000000000000000000000000000000000411a5de6730ffece671a9f21d65028cc0f1102378de124562cb1ff49db6f004fcd14d683024b0548eff3d1468df26880000000000000000000000000000000000fb837804dba8213329db46608b6c121d973363c1234a86dd183baff112709cf97096c5e9a1a770ee9d7dc641a894d60000000000000000000000000000000019b5e8f5d4a72f2b75811ac084a7f814317360bac52f6aab15eed416b4ef9938e0bdc4865cc2c4d0fd947e7c6925fd1400000000000000000000000000000000093567b4228be17ee62d11a254edd041ee4b953bffb8b8c7f925bd6662b4298bac2822b446f5b5de3b893e1be5aa49860000000000000000000000000000000000000000000000000000000173f3bfab0000000000000000000000000000000019e384121b7d70927c49e6d044fd8517c36bc6ed2813a8956dd64f049869e8a77f7e46930240e6984abe26fa6a89658f0000000000000000000000000000000003f4b4e761936d90fd5f55f99087138a07a69755ad4a46e4dd1c2cfe6d11371e1cc033111a0595e3bba98d0f538db4510000000000000000000000000000000017a31a4fccfb5f768a2157517c77a4f8aaf0dee8f260d96e02e1175a8754d09600923beae02a019afc327b65a2fdbbfc00000000000000000000000000000000088bb5832f4a4a452edda646ebaa2853a54205d56329960b44b2450070734724a74daaa401879bad142132316e9b34010000000000000000000000000000000000000000000000000000008437a521c900000000000000000000000000000000049cd1dbb2d2c3581e54c088135fef36505a6823d61b859437bfc79b617030dc8b40e32bad1fa85b9c0f368af6d38d3c000000000000000000000000000000000d0273f6bf31ed37c3b8d68083ec3d8e20b5f2cc170fa24b9b5be35b34ed013f9a921f1cad1644d4bdb14674247234c80000000000000000000000000000000008b7ae4dbf802c17a6648842922c9467e460a71c88d393ee7af356da123a2f3619e80c3bdcc8e2b1da52f8cd9913ccdd0000000000000000000000000000000005ecf93654b7a1885695aaeeb7caf41b0239dc45e1022be55d37111af2aecef87799638bec572de86a7437898efa702000000000000000000000000000000000000000000000000000002effc7b302730000000000000000000000000000000002142a58bae275564a6d63cb6bd6266ca66bef07a6ab8ca37b9d0ba2d4effbccfd89c169649f7d0e8a3eb006846579ad0000000000000000000000000000000012be651a5fa620340d418834526d37a8c932652345400b4cd9d43c8f41c080f41a6d9558118ebeab9d4268bb73e850e10000000000000000000000000000000015f4b235c209d89ce833f8f296e4cfb748e8abce6990ce1a5a914b9416c08e0d3a26db89625915c821a5f152b7fa592e0000000000000000000000000000000006fcacb3ee6650a1044852d61c9c20bedc8ee90aad97de8e24670a9ef57483e678db11dd95428915088d76e30cb01a370000000000000000000000000000000000000000000000000010b4ebfca1dee100000000000000000000000000000000018405e4b67f957b6465ead9f5afc47832d45643dc3aa03af7314c6cf980fa23dd3bb8db3358693ad06011f6a6b1a5ff000000000000000000000000000000000c48e0d4f9404ae0a7f10774c55a9e838bb09d3bae85b5eaa6b16b0f4dc2354368117f3799c37f3f7126d8b54d3f83930000000000000000000000000000000007e61f4ec5bc9e2cc8ca471ce4ed40e729b1790cd2c0d9c1cb50e615ec7f346636e77e1cf632c881c07c5385898607620000000000000000000000000000000011dfaf9281901dd356fc5dfece21898a93d9ad9e4e246dd6e18d3ee46d58ab7e77401a3e8d04057e5638ed74fb95688100000000000000000000000000000000000000000000000005f04fe2cd8a39fb000000000000000000000000000000001796abe0d9e4a703962be528e6a5cb65c60725886f925db0e2a89107ec248bb39fa332bc63bd91d28ae66e0dfce8f754000000000000000000000000000000000fb665f5a7559cb0fa1300048a0e6f1ab5547226e86f8e752dd13c28eda4168492e3d3bf2f8a6b230dd57f79b1afa9910000000000000000000000000000000003422dbbe4a06a4c6c9fdf35e54f74b4ab1528abb7249e99898e6fd7affebc7aef95bf82d328dc01d63c25f6a735c35d0000000000000000000000000000000010aa5504b469427eb3584a286191149f5c3c5a745f338278dd95337cd2336d3c4e7532d98eb189fa543824953e7c1c170000000000000000000000000000000000000000000000021c6c659f10229c390000000000000000000000000000000009303f04d568e289a35102b6df883d5ed620355c0eb5d02236718cdaf99fba6e19ef5cee2996268eb9a53ae1ee09bce3000000000000000000000000000000000190be857d602284393305bfe0a29e29a6982ed3f04ccaabafb7e59cdc7eda85c22bc3e8690355c7a0fb7590ae40f1b00000000000000000000000000000000016efd497a0c5c6b59a1fdf2b590eb67a7da8cbe72f49084e7050783ff12a783cad1859e1a0b0ec8ff784c703617670330000000000000000000000000000000017a957ea4d53f4fc8412cb015ae91b38445cdb3e7078d875c465c941e0d9a852c78d90b31b6b6010efe8bd5117e831630000000000000000000000000000000000000000000000c01a881f8abc4d8843000000000000000000000000000000000173ed58056bec9874464d3f23c3e7d3d429d6c8a167fc7f39368830eca839d0eb8260d64ca823f6c785c71f85893d8400000000000000000000000000000000123372d7d4c91a249df8f3e4f8e669087b252ab5d8cf2529a87e4ed3622e4158cf17dc44b473d5debd273261383e8a0f0000000000000000000000000000000000c500eb55ab86381a1725f339f686c7e38ce9113493736f57e999badc661b5b8494d220ded0711e841228a389abdb820000000000000000000000000000000010a4025d823c4262367c53f50e67cffa046e4a1e7c69ff30373772e49ecb310de3b313d83cc41f40a00205722f233e270000000000000000000000000000000000000000000044496e633650ef8f6fd100000000000000000000000000000000152110e866f1a6e8c5348f6e005dbd93de671b7d0fbfa04d6614bcdd27a3cb2a70f0deacb3608ba95226268481a0be7c000000000000000000000000000000000bf78a97086750eb166986ed8e428ca1d23ae3bbf8b2ee67451d7dd84445311e8bc8ab558b0bc008199f577195fc39b7000000000000000000000000000000000845be51ad0d708657bfb0da8eec64cd7779c50d90b59a3ac6a2045cad0561d654af9a84dd105cea5409d2adf286b561000000000000000000000000000000000a298f69fd652551e12219252baacab101768fc6651309450e49c7d3bb52b7547f218d12de64961aa7f059025b8e0cb500000000000000000000000000000000000000000018461a3d444ec527fcbf4b000000000000000000000000000000000027513925b419f6c581788578379995290ab9478e08ecd1999d5e1a05c58144d2f9f06fb8c7fd1586f3ef6a973a3ed7000000000000000000000000000000001292b2ce751f6f859ec7882e14083eac9841b035f9d5ed938a81579dbce07dec2c0202b7f6b25226831cd9c578e893d00000000000000000000000000000000017f36da49414d7706209d52840250eea6f33970fd7eac448ee122f24c62f6a6e09757aa29761160be0f65ba3ce7a153a00000000000000000000000000000000086d471f958f3ff679805751b183fb6310e871ba72bbdefd59c58e95ea62de0820d5affe601757e318abaa5a0c2715bd000000000000000000000000000000000000000008a0eb53c748001536d7ffa900000000000000000000000000000000090721a089bbbb130c21a529be0ede9271a91a2dde9cb2a8e091a19fd2c0a40c390ac2bda8304085c2d6e38e520eae44000000000000000000000000000000000cc64109c67b342b6dbcf86cb60fca7ad378ed6398d89076ed108685c57a07d26e40ed3d5c4b3560b21e519db5875d49000000000000000000000000000000000b0ddd488f5a6f61f087cdbf011b50209a4460c8aa8c5f48c0b30d9cf6cf24259f4e7badc42e1b7a33352949ae566fc100000000000000000000000000000000038430e8db04d205d81aa1632d23919c06f89260c7ac5850bd8b780f8388e53db3a3ddfe98cc55d1c686e582f85b0c8900000000000000000000000000000000000000031133a6c7d698078a7ec7e113000000000000000000000000000000001800ecc167bb714100f31e7610cd3fd010ca299b394c01b1a89afd11b051e92989f6336db5e6d3212f6b04673526d83900000000000000000000000000000000070401d9bba01c0445e0a682406b099f21d16d9c348cc97156769084055ca328a145c134b8c8b58f019d62882b2965de000000000000000000000000000000000287f071bda99b0318e386b27a492a6823a9664084b12acddeda34cb53f827a362ba97c0e652c37bd9d6023041d8c8d8000000000000000000000000000000000fa708ca7dd917541cd02281e525d3367b5ebf5e9353103e1f83f3b894d03d8be7e4d819c123492788855d1fdb63f2e000000000000000000000000000000000000001171d5c4909480aae3b110d01c1000000000000000000000000000000000ef786ebdcda12e142a32f091307f2fedf52f6c36beb278b0007a03ad81bf9fee3710a04928e43e541d02c9be44722e8000000000000000000000000000000000d05ceb0be53d2624a796a7a033aec59d9463c18d672c451ec4f2e679daef882cab7d8dd88789065156a1340ca9d426500000000000000000000000000000000118ed350274bc45e63eaaa4b8ddf119b3bf38418b5b9748597edfc456d9bc3e864ec7283426e840fd29fa84e7d89c934000000000000000000000000000000001594b866a28946b6d444bf0481558812769ea3222f5dfc961ca33e78e0ea62ee8ba63fd1ece9cc3e315abfa96d53694400000000000000000000000000000000000063376fcdf64c9bcbeeff0f9f9f9b0000000000000000000000000000000004b6570b4a6affe97649b0dd7a0ad0df160b37c332a8a7348dd3994cc6b1eb65623b4a9f0a3f320e7278844e261546530000000000000000000000000000000005f8fb4cf5e5313f403f15c59c79b9cebaec78291f2053c49d6427f40f2db2aa659d3a8fed7c7b07b7a5680c7b95ab5800000000000000000000000000000000045cba5ec3fa9acd1b11e1f28a01ebc028f89f96f814513453c553f58785baca8abd4150f334b405fabb925b71f4f4dd0000000000000000000000000000000013daf00b8f53af776c2e8c08d55d164aa15027611188e294230477dc1c926102088f0451222fd2eff9802db8b884ab9c00000000000000000000000000000000002344b4be368d3b617df4aa8dbdbc190000000000000000000000000000000002b29192945df0a74eed138e431962f1d39978202d247335ffbf29d8a02e982c69e96b58d7d92528baf5c422ed633f1f000000000000000000000000000000000d52c7a82fece99279de7a49439c0ff8463a637cc6003320275d69549442c95184fd75ee5e7122e5575af7432e5159290000000000000000000000000000000006ddbaad6cc16c9e62b0da9ab0196dffe92253fcfb2df9aa2076d3f16b3284997d6558cc4432d2aa1705452c4e951e6e00000000000000000000000000000000175f906a99c9d65c4647807879e5eb781532db184d28a326ef9691f8738af067b6a80147bd69327d219fad7c850a7545000000000000000000000000000000000c896c3f9d64341ba7c5f8a06271dce3000000000000000000000000000000000c86c92c9598dde7e6fc5e05d70a34c7a14cff5f400f33cf6cc26e6bf6d9a0bbc421c00f3360721f51974d76be43bd38000000000000000000000000000000001137d93502ef32471f47890a181d7823b3a86dbfcadcc930ae53952f528d617e742a52e4f243c615cc28163dc31bd80600000000000000000000000000000000088f7f8bcbc6dfcc8005b8308cd4780d574d8530e95e7831e52eb2c9a88b846852e111a8389e3d3a67accf78b08326d200000000000000000000000000000000149e43fc675dd3bde8b89cfeb29456f130bbf674cea0266bd1b2e7de23f9a7294096327b452728411ca58acc949777fa0000000000000000000000000000000474d97a9cf29e85d4a35f6102fe7984b100000000000000000000000000000000186a1da343cacf1815b9c8b6c807f536249dbfdb59d77bf4920ad2198a0d83ada21f7c39de6f06a5599f22571cab288d000000000000000000000000000000000ba1ec44f95121bd622932b84bbb4b3d279f69c494ee44db68e3165c86b627ba5e397ee197313fb5b775972798997332000000000000000000000000000000000783e7493e9fb106fa0d085e7c03eb816468d12c65d9b77643ed07c02583d491f4db5db44e565d50d8ccaa9ad8f7f8e80000000000000000000000000000000010a6a5fd90cd5f4fb6545814f5df065b001074bb3f29f649dd2612815df3a19a320f7754dd3d458e48e7fb1b4953978f00000000000000000000000000000195894e95ca3e59929612e77c1075322aeb00000000000000000000000000000000129c4945fe62538d2806fff056adac24f3bba8e17e42d82122affe6ad2123d68784348a79755f194fde3b3d448924032000000000000000000000000000000000528590e82f409ea8ce953f0c59d15080185dc6e3219b69fcaa3a2c8fc9d0b9e0bc1e75ec6c52638e6eaa4584005b5380000000000000000000000000000000018dc3e893f74729d27dd44f45a5a4f433dcd09a3b485e9d1c2bd0eb5e0e4c9024d928ddc426fdecae931e89885ee4db4000000000000000000000000000000000d6ee02e1fc7e52a8e1ef17e753065882c6fcc14da61da7ffe955fe84a9d2af9ba57562c69db3088652931bf124b0d5300000000000000000000000000009027ceef3ee429d71b58b84919d9a8d5418900000000000000000000000000000000131747485cce9a5c32837a964b8c0689ff70cb4702c6520f2220ab95192d73ae9508c5b998ffb0be40520926846ce3f100000000000000000000000000000000101e147f8bd7682b47b3a6cc0c552c26ce90b9ce0daef21f7f634b3360483afa14a11e6745e7de01a35c65b396a1a12700000000000000000000000000000000090ca61ed16c4c1e80acfef736eea2db0d7425d9110cb53e6c4a2aa3f8a59ee6c60bdce8df5825011066d44bef84d29600000000000000000000000000000000028207394adcbf30250ac21a8f1db6283580bc5e39159930552e5edb25e6215c66b6450296edc80dbc3a2acd125dab1600000000000000000000000000333e268f0b5b1adf76b88981fc305f03ce4bb30000000000000000000000000000000016cfabbe60d1e55723a0ff72cf802f2d1cf13ed131e17729adc88522a657f320a336078a9399c8e61a3bbde3d52fd3640000000000000000000000000000000009aa9a3c2a6d49d286aa593c6ff644f1786fa9ae471bdb3fe70b150a9ed7584eaa886ac057c30005c3642f65ad5581cc0000000000000000000000000000000001d417894c0cce924955a795b188b27951f8438a5485404b921a42fa79dea03c10e29d0390df2f34d7be13f360a7fada00000000000000000000000000000000189b0b3a04e6c613899d51231dbf0cba6a8a8f507ebed99d24fba7ebac6c97a8859ffde88e6d95c1a9d6b4f0a8f3c417000000000000000000000000123717b4d909628d6f3398e134a531c65a54e8a10000000000000000000000000000000016cad7807d761f2c0c6ff11e786a9ed296442de8acc50f72a87139b9f1eb7c168e1c2f0b2a1ad7f9579e1e922d0eb309000000000000000000000000000000000d3577c713fcbc0648ca8fbdda0a0bf83c726a6205ee04d2d34cacff92b58725ca3c9766206e22d0791cb232fa8a9bc3000000000000000000000000000000000f5ea1957be1b9ca8956ba5f6b1c37ea72e2529f80d7a1c61df01afcc2df6f99ced81ac0052bd0e1e83f09d76ad8d33b000000000000000000000000000000000aabced4e2b9e4a473e72bf2b1cc0ce7ab13de533107df2205ed9e2bb50fa0217e6a13abcd12fce1bda1ccf84dac237a00000000000000000000000679956d49265608468757580db6b8b1821c2eb13b", + "Expected": "000000000000000000000000000000000728c5e6e69b9103d82358cb6ba3a45a677df1c3eb3cdccf694fd71cee94f1e591b8021b0eef638cd9a1d878937b5b2d000000000000000000000000000000000ba9bcf9ccef956f2af8dc4c3fbf1cc8f3f284b04ae8710af6ef4fb36301254c777d4461858fb38fdeeb72c0d8589af5000000000000000000000000000000000224b80a57d30bce4c752664f3b5b5e3443aefa6d4e95dc334821f754b8b8d8fda4e73d03cbd4070d43b18324a686b500000000000000000000000000000000016909a02214c6c0f6682895aa99cf6cf0a22eab6f0b574437ef9c36e9df32ac3b8c5adb9f6b8827df0ccf51b16f824df", + "Name": "bls_g2multiexp_larger", + "Gas": 409750, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000039b10ccd664da6f273ea134bb55ee48f09ba585a7e2bb95b5aec610631ac49810d5d616f67ba0147e6d1be476ea220e0000000000000000000000000000000000fbcdff4e48e07d1f73ec42fe7eb026f5c30407cfd2f22bbbfe5b2a09e8a7bb4884178cb6afd1c95f80e646929d30040000000000000000000000000000000001ed3b0e71acb0adbf44643374edbf4405af87cfc0507db7e8978889c6c3afbe9754d1182e98ac3060d64994d31ef576000000000000000000000000000000001681a2bf65b83be5a2ca50430949b6e2a099977482e9405b593f34d2ed877a3f0d1bddc37d0cec4d59d7df74b2b8f2dfb3c940fe79b6966489b527955de7599194a9ac69a6ff58b8d99e7b1084f0464e0000000000000000000000000000000018c0ada6351b70661f053365deae56910798bd2ace6e2bf6ba4192d1a229967f6af6ca1c9a8a11ebc0a232344ee0f6d6000000000000000000000000000000000cc70a587f4652039d8117b6103858adcd9728f6aebe230578389a62da0042b7623b1c0436734f463cfdd187d20903240000000000000000000000000000000009f50bd7beedb23328818f9ffdafdb6da6a4dd80c5a9048ab8b154df3cad938ccede829f1156f769d9e149791e8e0cd900000000000000000000000000000000079ba50d2511631b20b6d6f3841e616e9d11b68ec3368cd60129d9d4787ab56c4e9145a38927e51c9cd6271d493d93884d0e25bf3f6fc9f4da25d21fdc71773f1947b7a8a775b8177f7eca990b05b71d0000000000000000000000000000000003632695b09dbf86163909d2bb25995b36ad1d137cf252860fd4bb6c95749e19eb0c1383e9d2f93f2791cb0cf6c8ed9d000000000000000000000000000000001688a855609b0bbff4452d146396558ff18777f329fd4f76a96859dabfc6a6f6977c2496280dbe3b1f8923990c1d6407000000000000000000000000000000000c8567fee05d05af279adc67179468a29d7520b067dbb348ee315a99504f70a206538b81a457cce855f4851ad48b7e80000000000000000000000000000000001238dcdfa80ea46e1500026ea5feadb421de4409f4992ffbf5ae59fa67fd82f38452642a50261b849e74b4a33eed70cc973f40c12c92b703d7b7848ef8b4466d40823aad3943a312b57432b91ff68be1000000000000000000000000000000000149704960cccf9d5ea414c73871e896b1d4cf0a946b0db72f5f2c5df98d2ec4f3adbbc14c78047961bc9620cb6cfb5900000000000000000000000000000000140c5d25e534fb1bfdc19ba4cecaabe619f6e0cd3d60b0f17dafd7bcd27b286d4f4477d00c5e1af22ee1a0c67fbf177c00000000000000000000000000000000029a1727041590b8459890de736df15c00d80ab007c3aee692ddcdf75790c9806d198e9f4502bec2f0a623491c3f877d0000000000000000000000000000000008a94c98baa9409151030d4fae2bd4a64c6f11ea3c99b9661fdaed226b9a7c2a7d609be34afda5d18b8911b6e015bf494c51f97bcdda93904ae26991b471e9ea942e2b5b8ed26055da11c58bc7b5002a000000000000000000000000000000001156d478661337478ab0cbc877a99d9e4d9824a2b3f605d41404d6b557b3ffabbf42635b0bbcb854cf9ed8b8637561a8000000000000000000000000000000001147ed317d5642e699787a7b47e6795c9a8943a34a694007e44f8654ba96390cf19f010dcf695e22c21874022c6ce291000000000000000000000000000000000c6dccdf920fd5e7fae284115511952633744c6ad94120d9cae6acda8a7c23c48bd912cba6c38de5159587e1e6cad519000000000000000000000000000000001944227d462bc2e5dcc6f6db0f83dad411ba8895262836f975b2b91e06fd0e2138862162acc04e9e65050b34ccbd1a4e8964d5867927bc3e35a0b4c457482373969bff5edff8a781d65573e07fd87b890000000000000000000000000000000019c31e3ab8cc9c920aa8f56371f133b6cb8d7b0b74b23c0c7201aca79e5ae69dc01f1f74d2492dcb081895b17d106b4e000000000000000000000000000000001789b0d371bd63077ccde3dbbebf3531368feb775bced187fb31cc6821481664600978e323ff21085b8c08e0f21daf72000000000000000000000000000000000009eacfe8f4a2a9bae6573424d07f42bd6af8a9d55f71476a7e3c7a4b2b898550c1e72ec13afd4eff22421a03af1d31000000000000000000000000000000000410bd4ea74dcfa33f2976aa1b571c67cbb596ab10f76a8aaf4548f1097e55b3373bff02683f806cb84e1e0e877819e2787c38b944eadbd03fd3187f450571740f6cd00e5b2e560165846eb800e5c94400000000000000000000000000000000147f09986691f2e57073378e8bfd58804241eed7934f6adfe6d0a6bac4da0b738495778a303e52113e1c80e698476d50000000000000000000000000000000000762348b84c92a8ca6de319cf1f8f11db296a71b90fe13e1e4bcd25903829c00a5d2ad4b1c8d98c37eaad7e042ab023d0000000000000000000000000000000011d1d94530d4a2daf0e902a5c3382cd135938557f94b04bccea5e16ea089c5e020e13524c854a316662bd68784fe31f300000000000000000000000000000000070828522bec75b6a492fd9bca7b54dac6fbbf4f0bc3179d312bb65c647439e3868e4d5b21af5a64c93aeee8a9b7e46eaaee7ae2a237e8e53560c79e7baa9adf9c00a0ea4d6f514e7a6832eb15cef1e1000000000000000000000000000000000690a0869204c8dced5ba0ce13554b2703a3f18afb8fa8fa1c457d79c58fdc25471ae85bafad52e506fc1917fc3becff0000000000000000000000000000000010f7dbb16f8571ede1cec79e3f9ea03ae6468d7285984713f19607f5cab902b9a6b7cbcfd900be5c2e407cc093ea0e6700000000000000000000000000000000151caf87968433cb1f85fc1854c57049be22c26497a86bfbd66a2b3af121d894dba8004a17c6ff96a5843c2719fa32d10000000000000000000000000000000011f0270f2b039409f70392879bcc2c67c836c100cf9883d3dc48d7adbcd52037d270539e863a951acd47ecaa1ca4db12dac6ed3ef45c1d7d3028f0f89e5458797996d3294b95bebe049b76c7d0db317c0000000000000000000000000000000017fae043c8fd4c520a90d4a6bd95f5b0484acc279b899e7b1d8f7f7831cc6ba37cd5965c4dc674768f5805842d433af30000000000000000000000000000000008ddd7b41b8fa4d29fb931830f29b46f4015ec202d51cb969d7c832aafc0995c875cd45eff4a083e2d5ecb5ad185b64f0000000000000000000000000000000015d384ab7e52420b83a69827257cb52b00f0199ed2240a142812b46cf67e92b99942ac59fb9f9efd7dd822f5a36c799f00000000000000000000000000000000074b3a16a9cc4be9da0ac8e2e7003d9c1ec89244d2c33441b31af76716cce439f805843a9a44701203231efdca551d5bbb30985756c3ca075114c92f231575d6befafe4084517f1166a47376867bd108000000000000000000000000000000000e25365988664e8b6ade2e5a40da49c11ff1e084cc0f8dca51f0d0578555d39e3617c8cadb2abc2633b28c5895ab0a9e00000000000000000000000000000000169f5fd768152169c403475dee475576fd2cc3788179453b0039ff3cb1b7a5a0fff8f82d03f56e65cad579218486c3b600000000000000000000000000000000087ccd7f92032febc1f75c7115111ede4acbb2e429cbccf3959524d0b79c449d431ff65485e1aecb442b53fec80ecb4000000000000000000000000000000000135d63f264360003b2eb28f126c6621a40088c6eb15acc4aea89d6068e9d5a47f842aa4b4300f5cda5cc5831edb81596fb730105809f64ea522983d6bbb62f7e2e8cbf702685e9be10e2ef71f818767200000000000000000000000000000000159da74f15e4c614b418997f81a1b8a3d9eb8dd80d94b5bad664bff271bb0f2d8f3c4ceb947dc6300d5003a2f7d7a829000000000000000000000000000000000cdd4d1d4666f385dd54052cf5c1966328403251bebb29f0d553a9a96b5ade350c8493270e9b5282d8a06f9fa8d7b1d900000000000000000000000000000000189f8d3c94fdaa72cc67a7f93d35f91e22206ff9e97eed9601196c28d45b69c802ae92bcbf582754717b0355e08d37c000000000000000000000000000000000054b0a282610f108fc7f6736b8c22c8778d082bf4b0d0abca5a228198eba6a868910dd5c5c440036968e977955054196b6a9408625b0ca8fcbfb21d34eec2d8e24e9a30d2d3b32d7a37d110b13afbfea000000000000000000000000000000000f29b0d2b6e3466668e1328048e8dbc782c1111ab8cbe718c85d58ded992d97ca8ba20b9d048feb6ed0aa1b4139d02d3000000000000000000000000000000000d1f0dae940b99fbfc6e4a58480cac8c4e6b2fe33ce6f39c7ac1671046ce94d9e16cba2bb62c6749ef73d45bea21501a000000000000000000000000000000001902ccece1c0c763fd06934a76d1f2f056563ae6d8592bafd589cfebd6f057726fd908614ccd6518a21c66ecc2f78b660000000000000000000000000000000017f6b113f8872c3187d20b0c765d73b850b54244a719cf461fb318796c0b8f310b5490959f9d9187f99c8ed3e25e42a93b77283d0a7bb9e17a27e66851792fdd605cc0a339028b8985390fd024374c76000000000000000000000000000000000576b8cf1e69efdc277465c344cadf7f8cceffacbeca83821f3ff81717308b97f4ac046f1926e7c2eb42677d7afc257c000000000000000000000000000000000cc1524531e96f3c00e4250dd351aedb5a4c3184aff52ec8c13d470068f5967f3674fe173ee239933e67501a9decc6680000000000000000000000000000000001610cfcaea414c241b44cf6f3cc319dcb51d6b8de29c8a6869ff7c1ebb7b747d881e922b42e8fab96bde7cf23e8e4cd0000000000000000000000000000000017d4444dc8b6893b681cf10dac8169054f9d2f61d3dd5fd785ae7afa49d18ebbde9ce8dde5641adc6b38173173459836dd994eae929aee7428fdda2e44f8cb12b10b91c83b22abc8bbb561310b62257c000000000000000000000000000000000ca8f961f86ee6c46fc88fbbf721ba760186f13cd4cce743f19dc60a89fd985cb3feee34dcc4656735a326f515a729e400000000000000000000000000000000174baf466b809b1155d524050f7ee58c7c5cf728c674e0ce549f5551047a4479ca15bdf69b403b03fa74eb1b26bbff6c0000000000000000000000000000000000e8c8b587c171b1b292779abfef57202ed29e7fe94ade9634ec5a2b3b4692a4f3c15468e3f6418b144674be70780d5b000000000000000000000000000000001865e99cf97d88bdf56dae32314eb32295c39a1e755cd7d1478bea8520b9ff21c39b683b92ae15568420c390c42b123b7010b134989c8368c7f831f9dd9f9a890e2c1435681107414f2e8637153bbf6a0000000000000000000000000000000017eccd446f10018219a1bd111b8786cf9febd49f9e7e754e82dd155ead59b819f0f20e42f4635d5044ec5d550d847623000000000000000000000000000000000403969d2b8f914ff2ea3bf902782642e2c6157bd2a343acf60ff9125b48b558d990a74c6d4d6398e7a3cc2a16037346000000000000000000000000000000000bd45f61f142bd78619fb520715320eb5e6ebafa8b078ce796ba62fe1a549d5fb9df57e92d8d2795988eb6ae18cf9d9300000000000000000000000000000000097db1314e064b8e670ec286958f17065bce644cf240ab1b1b220504560d36a0b43fc18453ff3a2bb315e219965f5bd394c68bc8d91ac8c489ee87dbfc4b94c93c8bbd5fc04c27db8b02303f3a65905400000000000000000000000000000000018244ab39a716e252cbfb986c7958b371e29ea9190010d1f5e1cfdb6ce4822d4055c37cd411fc9a0c46d728f2c13ecf0000000000000000000000000000000001985d3c667c8d68c9adb92bdc7a8af959c17146544997d97116120a0f55366bd7ad7ffa28d93ee51222ff9222779675000000000000000000000000000000000c70fd4e3c8f2a451f83fb6c046431b38251b7bae44cf8d36df69a03e2d3ce6137498523fcf0bcf29b5d69e8f265e24d00000000000000000000000000000000047b9163a218f7654a72e0d7c651a2cf7fd95e9784a59e0bf119d081de6c0465d374a55fbc1eff9828c9fd29abf4c4bdb3682accc3939283b870357cf83683350baf73aa0d3d68bda82a0f6ae7e51746", + "Expected": "00000000000000000000000000000000083ad744b34f6393bc983222b004657494232c5d9fbc978d76e2377a28a34c4528da5d91cbc0977dc953397a6d21eca20000000000000000000000000000000015aec6526e151cf5b8403353517dfb9a162087a698b71f32b266d3c5c936a83975d5567c25b3a5994042ec1379c8e526000000000000000000000000000000000e3647185d1a20efad19f975729908840dc33909a583600f7915025f906aef9c022fd34e618170b11178aaa824ae36b300000000000000000000000000000000159576d1d53f6cd12c39d651697e11798321f17cd287118d7ebeabf68281bc03109ee103ee8ef2ef93c71dd1dcbaf1e0", + "Name": "matter_g2_multiexp_0", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000000eb3c91515d4a41209a73564741a8ccf901a624df9db22e195a5d02d24b7bc0a12756b15b8d006cb991a7e088eaef1000000000000000000000000000000000704ce8afc808b0161f6f61b22d990d713ae398779e6e74e9b5771daf006ce0bba3a8088edf75156f0e48b92ee8409b00000000000000000000000000000000018fe81e05aff0620f4bdbe4a715e015650497afab62921eba0ab86b649e5a2fd3d54041868928519f537e36448688a0d00000000000000000000000000000000162bd97161201ea3c26f8dd1204a9c6b61b762bdf573cb5d20b6b255f30208ca7d96aa47b46fb8c6bf0922075f1c1ca807f80a5e502f63375d672379584e11e41d58d2ed58f3e5c3f67d9ea1138493cf00000000000000000000000000000000135aee0e30fbcad798738c10d4aebcdf50c89ce516325f655fe763dce54ffedf94dd74168611e5ae879b5bf5598d62dc000000000000000000000000000000000c728e672cd8b3bf9341bca929c34118b566cd3a80452d7015bee9d5cdc001b1f5c678d4b2cc4f7cac353e7bf326ca1e0000000000000000000000000000000014809aa22e2051e463fba6d49fbb060d0c7f599a0fc5409d34e71f34817e7beb1251810ae6eee1848c60796fb8647dea00000000000000000000000000000000145a4de777d86025d50e12f9a6615ecb9bdd41489992d1b643dd9aa549acbc63b04b0bdfd14b6e45c70f165e9a8c91bebb169138f94093d5c1c6b253cc001ce8baf78858dae053173fa812d2d1c800da00000000000000000000000000000000009a58b7116dbd6f550f8ca98071813130ecaa9ea86d5275eebc36860690fa048c9ebeb46600b2b63e847bff3e38ed0d00000000000000000000000000000000113ffc0932c041e0e34b2540c485eb74f5029b339cb60bc88a8a749310f33f330dea137e5f340044fd689264af66696d0000000000000000000000000000000002642da3c2c7b6688aba0b19ab29ac72e35caafa044863c364ea8833fca850289de52c0963bc33d7bba40cb5f568718a000000000000000000000000000000000552d35ca054da2f148c119454f6760607b351f2441921a2be17da2cc10902d71571c5554f132e60df79679428fa07e3e40608bdaf3e7764358a64a920cbb33ab4d571c7b3092e1ae11d9697f82ed8330000000000000000000000000000000018fbbcba3d4b1e548ceaec4a48db62a2420ff29a67af332ee7ea3f902f84e6c375fd33abc33d945c5bca25603979f9a400000000000000000000000000000000072ff416994364bdc6535f36c82212afa822cd94fade69f11eb38dbdcd37c7e22af55fe05e6a826dad822073656eaac10000000000000000000000000000000017bba179b847278a4878b6faeaab3b1f4bd7540d22817cd9aff95557497f8b9d286657b6162c0f89f7820becc637dd550000000000000000000000000000000018e2bfed71aa9b11fefca2f0db8bd9b8c69540267de50bec4fc90a6e9741891465c9761d19282e1100b3707eeb598b31d411519f2a33b07f65e7d721950e0f0d5161c71a402810e46817627a17c56c0f0000000000000000000000000000000019efd37727dfaedf697fcda7a59847dbda8ca7cdc92f34e68691d682e20ae6545ac104d6660fdb8f64a051e69298eae8000000000000000000000000000000001225ace0fdce456dd888c9672503b68ef77b2d11caf1265a767a6ea14911e3ca03fc153f18dfe9d95e0cc68b7b8a3a8d0000000000000000000000000000000008a6b059c1c4da046cc0b1b5d7f33270aceffa607daf6d0d078c06f940604e1a0b4adf01a4091306e3c7eddcf3d95101000000000000000000000000000000000f79bae5260a2f114ffbb9273f3049d3ebb002500a57ee0a7d157d86957f43f87a2e026fb9892dacaadca5ee04fc8e176bb3f9e512311699f110a5e6ae57e0a7d2caaa8f94e41ca71e4af069a93d08cc0000000000000000000000000000000016d2b73eeceee17d3bff3aacac9df9ac1c4248d9ea7d6a503a757f7bb22fa6970bb6f5cb5ec154785f7252e1508b382e00000000000000000000000000000000081edc68bbd8db7b10be06ee23d090bd54f9ca07ef24dfed7df7bb05f8cc26e6889dbd40ea203fd5cca5cb588199f9e40000000000000000000000000000000010d3478508619ea9493b4330e2fb9150024cd32dc1378f824788a884a4a30fbf39c630f465557bf0c6d69b4cbecf89f9000000000000000000000000000000000f20c9b134db5d8b7756800c031bf5962fc560ba95d4bd9157b16179f1a37ae08696a2be455ad8d018aead6adcc69b712a0c988d97e86dccaeb8bd4e27f9e30fad5d5742202cdde17d800642db633c520000000000000000000000000000000003dce67181d23af9729e9fb0653d7f79c890fba27de42fada93123e112c4a468fa889921192db8047d86e4db77c60266000000000000000000000000000000000869a1e39d42d9bb0cc0568fdad16abbdac3194af893ebd8dd8f8c2c3c855abefa5fc215412168acadc88e658e83f5570000000000000000000000000000000001ef139a75194f3c4b1378c2b66dd304d179460bac0a289405cd8faa3ff66a7b6e54eb7b8742a68150b1e098630135c40000000000000000000000000000000003892b5a645af916be2c6c7fc0bb08fb5f39341d3c68598940554e1be11e1be75af920db0c8710ed13c78edbf683f17d0b299c14892e0519b0accfa17e1a758c8aae54794fb61549f1396395c967e1b1000000000000000000000000000000000264dd4b477f5db65edad28c7153ed919a863c5c5661e0125c5429b323e055fd69c33142dfc6ed9c87082e2be4675e1f00000000000000000000000000000000046ea088a2ec94d3a1f1f97949f1ebc49690c453d316cc46534fa253b34b30323b6071d147d64bb94e02fb4db07bb0c400000000000000000000000000000000013692a33bb1348486eec40a9e93a4ea3810c7b4d3188cd07e235a2c898aa87ee0d17682fd24f4d978f9fb028fd26e2900000000000000000000000000000000115f8b64c00cd5cd344a7b5edc0ef0bb85a3e8f0f9dfb28f8ffe12db3e0d222c2d45dcdba0fbdc161c5d558bc71aa0977064d43d6802ad4c3794705065f870263fef19b81604839c9dea8648388094e900000000000000000000000000000000014c83d58d90db4821a0411fab45f83fbc05f7d0d7a67ce75da3ae568978d15f4c1886c6fa6086675c0045efb30d818400000000000000000000000000000000001e68691123451f4c3df6dae62c6a63855ec3597aae33a8a10ee274e902e9aab1460cc9c79726312df0ee0ce90c8d3c00000000000000000000000000000000018a39eb3e3c6c7fb8ee304e55d15e209afe2fe278dda93552a7b9f51fbd778da1502eb6775cbc3f832f8320fa0686240000000000000000000000000000000017c15910fad1ca5749aa82a5a2fa98b0ebb37e92912547fb1741f18c34e0d5fc3a307b928636c25f0320d71cb9d31062686285a0e22f177fe3adbfc435e9c1786752dcf3c11b723539789b0cdeb0647b000000000000000000000000000000000fa96d9fe01c18732e8d6454df9bb1f482c4b9add837ce9c354c72d49c2d44ec694674aaf0e6d6a095cab7ebb57ccd9a0000000000000000000000000000000001f8ffe3fb7e9e311e0f6949c07c26a0febb181e37b2268bb5e125fc3a100323740d1ebaa5e635dba3770fdc2ce4ee860000000000000000000000000000000012ac42095fdb677720ab3f14bf0afc55c95b43d28d922a5f8cb0bd841306b978751d24546e3a6474976961d0768f29e9000000000000000000000000000000000baf9804d99039c9fe966a696c64bdacc9673b0906b4deab108d34fbbaa3b0905d50892278570564017b96828c7e1ac93176b6724cf984632daf95c869d56838ab2baef94be3a4bd15df2dd8e49a90a60000000000000000000000000000000014ce6d88a7c5c782562aa101550f1af487296adebd9dae8252698ba04fbd58b92e2216de6ffd474d5992f97d9f22800d000000000000000000000000000000000ce92a04f5c8a99ca0e93992448222519fc454bda5d1d8638a7bfde968386e4ba0dcd1da59cd81d4c4dca3e584be0275000000000000000000000000000000000cb570796f5c8f7b8aa02e76cb8e870d3365fe4dce5df07ec286a0a821f922b4003d5b69c0f1588206d9544013e268c400000000000000000000000000000000098056a033d9cdae86aac02de3a444471854b909680719154b44d4f55f30087294e39e57643c692d6da725b859239080d76db3dcb659eaf6c086be6b414a494dea4bd30aef8450ae639f473148c05b36000000000000000000000000000000001214aacb0a5e6b7a40369a83c07fa8cf1786ce7cbde2b5a501d9c1292532df7822d4fde10a31fc0cecce3a7cfe3311850000000000000000000000000000000004f9669d8fe4f884ae93b2505710e6e45b19b7aa5df8cdd811f09e547efc27d21024cba05e2dc9d057055f30ec72d9df000000000000000000000000000000000a852b821b31cd27eca19712a636aa05ef2cd82c36ac1c2ca240edc7d0172b42a72c42d3cba583a5b5129ac1c9486e270000000000000000000000000000000007bd8419e791a5cea04993509e91a980d3ae4987a5b322400b6e4a4f2b636891a1c7ba4de96b53426dd556532403d5a39915646de2449b3cb78d142b6018f3da7a16769722ec2c7185aedafe2699a8bc0000000000000000000000000000000005ef88bf38b2f998dec7302cde829076e6cf69df23aa0bf6bbb39fc0d3d8b5eafba74efb928b1de0eeb3d86ec82612300000000000000000000000000000000011f47e9583997b19c36616e4bf78d6ddd6d67937f493986250ff02aef6e6e7ff074559af2f20a5bf1d67158e4a199cdb000000000000000000000000000000000007777c8eb259a836e6459b7bdb642f878d869fdcb31b105d01f280938ef5377f2775874c099dcd394abe70f17d595b000000000000000000000000000000001607379d1cd34e2d0ed765a339b21433e9aa489609b92414c6b5a05d796085269c288d739717def9db3502e0550860165061073223f066e35242772385c67aaefb3f7ea7df244d73369db1ea0b208792000000000000000000000000000000000d6e3068c082b68312141aa68f1540ea1415e93e7f1762b6f06ff408a9995542da1c727a13355c19f8f418a44de1a95d000000000000000000000000000000000dcfcf2ab12b1a0e521ab402aaa4d32ff649a5a97892eb6ad98487c3c73c35601c313b8130ad12e9098d16eed3bcc2e00000000000000000000000000000000013777b1eefa4af03dc44e4e054eb7a3a980a9c55644900b80346be84b970e1754d1f4ab771adc9249e4accf88a23fb400000000000000000000000000000000002f53b231f1209c6f8b52f99a78bc2147c951ac89b341495f4a60a6572985ce2bc823625099ec214bc9ceedb2deea3fff396ee22209271ea0bda10fb5e2584e7536e8bb1d00a0dd7b852b0aa653cd86c00000000000000000000000000000000161c595d151a765c7dee03c9210414cdffab84b9078b4b98f9df09be5ec299b8f6322c692214f00ede97958f235c352b00000000000000000000000000000000106883e0937cb869e579b513bde8f61020fcf26be38f8b98eae3885cedec2e028970415fc653cf10e64727b7f6232e06000000000000000000000000000000000f351a82b733af31af453904874b7ca6252957a1ab51ec7f7b6fff85bbf3331f870a7e72a81594a9930859237e7a154d0000000000000000000000000000000012fcf20d1750901f2cfed64fd362f010ee64fafe9ddab406cc352b65829b929881a50514d53247d1cca7d6995d0bc9b2f0d3d4cf46265fc0f69e093181f8b02114e492485696c671b648450c4fcd97aa000000000000000000000000000000000047f92d6306bed1cb840f58fd57b5b71a5df7f86dbfa55a36636cb495e08715cd57f2f3e7cd99a1efc28b1d684de1cb0000000000000000000000000000000000f4eb02d687a1a6105b4dbd740e2c7924689d558e6cbfee768dd303cc8dd0fd887f5eec24b54feccf00f473ca3f54ad000000000000000000000000000000000edad68c4d536912816cf6ef039c3dd0535dc52189583270b3b038e2c67b213d943bf384ce69c4a9dc526d7ef309f25a0000000000000000000000000000000006ff4a6b5129ef026d1d5704bf7fc0b474de92b5cf39722f165e73f4e7612d6d3bb40743e4b7b42d0dad5d5d6a2d4881915b717562844d59623bc582f1a95fc678cf0d39af32560c6c06e3a74023c89c", + "Expected": "000000000000000000000000000000000153da66acafe91b6f13cd739ed3342197310e4824e7aef2e3414654c2678b8d09b296c3f928f3cc489893420031ab800000000000000000000000000000000010f501a96b86343a7c8d8c1250577cc9be6ffec81b5175ed07bd14988c5bbf7f2f3e7111df7d941d0cd267ea191d6ac70000000000000000000000000000000015e0d88894f7f83aacb6710f6c03ae60db8844dd3beec160fdb1df746b1f38a5e23def0893a0b39bee47c97af6535fcb000000000000000000000000000000000bcc275115e87f2f88c4afe8bf4faed46e6ad0c0357884356a26120591ba283f06b464c4853217865b1d2301965f2bd4", + "Name": "matter_g2_multiexp_1", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000017b32e613cb38b41dcdf3c8bb9187d731546977fbffd79fa7f66e3d6aaf9e1af6eca2fcdc260c8f90818d7148ba2f4960000000000000000000000000000000007e4d26606a47c874c20e8480a9f5815e5b577bccd783b775d10309eeb3d2102c7a0abc3324679e44362f09e7a4ada67000000000000000000000000000000000cb6f12ac8b49cfa36b957591293c87b21af0a949c55a28a90ab0fce88fb5cb7645e20ab2edd284f0ad1377dd95ac10e0000000000000000000000000000000014c96b5dcbd3150eeaea5c2bc27750cf88b30a91933a3233a4d1d9b357a80cc20d135e43a344e718dff5c79045c31f86d5c1c9fa11c36b86430cbb1f3ec10ebbe3787d0f5641d6d7fb96c810eda202dd0000000000000000000000000000000001ca1141ba9542c56de8991b313c6ae42fcecb6751b0b81b8cb21ed70d5008f7ffe831766b89880a7fa6dfdb09a2cda3000000000000000000000000000000000e6766b17db165bba564ac63ab88d3f8f5eded07a40b48644e60d3223d30458e7dabe404cab8d6f9fe135712ef0b1a43000000000000000000000000000000000dda3e6c87382fa762510e5cac721fd2b654f002f5b9a3767a8c6d651ccc582e80e3f68d6913cda30f9f51ebcfc7c98600000000000000000000000000000000059a7dac5bb6b504f2bd603d486700fe22c14f25254537b2c9079c2b45d36c7ce56854c5699cc7649b533194f51a9045c00eb20fe7c292f3ad820a074d8b3d8d24506612752d8677c2d6ca24f556cc4500000000000000000000000000000000090f4b85961ce97cf7f99c342d3627105d790f611e19721a43d8a0febd67ae393d77a02b999108efb56f0397dac22703000000000000000000000000000000001112f23595d1613c47486eadc37f9b1ac3b3c3973b3fe964d3b67c3996fe2eacd9df5c287b0cea8e9475d146fabcf9e70000000000000000000000000000000018f46f7ba3c9af34c1025c2d460f0be966e68944928dbd55cc7fe00e5def598d80b0e3801e48a74963c974ab4727a52100000000000000000000000000000000096845338d5cd2ac44e097607d6a1a05c241eda1941991ae9edbba965d9029032c46da7218b5b2338e6c58898bc4a820f661d7b30fb11bef70e15b257d7073885468a380862202b2d705a84827644b5b000000000000000000000000000000000aafe45ea7cb8b450a51263eebc28c1ded662972bee512e24fddaf64f43b74b66032523b3b104a4e9f6b62394436c6710000000000000000000000000000000015cb27e1fedfba2d1679f78a388f90b22bbf3e7d090f0ba972fa8e72f6e31c446f628fff929953712ef6e425d16eba5c000000000000000000000000000000000df9931893cae713042bf722db6ce394b6f346587278a154c271d8511e690417eb6dc47efbcebb7c2fb9e77f1de9fde800000000000000000000000000000000106ffa395ef170c99bb5742428ae88fa4fd7a94476985c099e3b700b7403d083281fb71a19640c6bc2321e27bcb33fe2346ce87c847376c8967cc18297e6007dcfacb6424e1d273930f38bb0e88fc5ca0000000000000000000000000000000010b1f8b1c492a56936da905b8738affba6bd29ae5fffd40ba6b31325181d3b489a81b23dcb69f6e71bd29bfb388e5a8f00000000000000000000000000000000116a115303b4774da59844e457844232d088062d920db67b2a8450a194be7e5340ebd4d106454fd9a03c8f50dbb1e119000000000000000000000000000000000eb521edd61b38006cffc43ab72d395d669dec196846fa4d6d43521da6c2fc3bf0994ce7556a3cffec7751b3bc5703ff00000000000000000000000000000000073cea36eccaa1c78deefb6029903c2b6598301bdefa9759719c3b590fcc5a6a4d3d4d19f552b33f4a3126a6e6a8448639a142c443a666499a880aa1cb9f523411bbc8e5554de099ab485b6c2c2e57cc000000000000000000000000000000000e3925fa085db73c1e67b29ae90f8773f83be5ec684402e8e2360ffee8a8368911e584843e42b0d470de78591df6ea6300000000000000000000000000000000075c7efdeeb16609b4a47ea442af4d75238fb7534fd96cb236a7886809d6adc2b62c8ff72bdb041bc51c1a71b68219e300000000000000000000000000000000088b4eb0dd185e51b737d797334590e982b7b0a5f109fc7d0524b2465c2c0457964eba5a6d2d4d99fb628f21f15a776c000000000000000000000000000000000fc79f6b38f3356972669290eeadcd992a22bc1191606b663a1e148aa58db3938f0fc65e536bc5811c50d9c7f03d3e372c01b7795c2d16b5bbbb1e107be36cc91b25130888956b0cdd344de9b4659447000000000000000000000000000000000b87c47605fc060a8e3677e84ce9d14b9309360a13c80d040c625fbf0108f829300cc1fca409a0f9c96311cd4a9a21e60000000000000000000000000000000014c4088f1e7935cf6a1d2475b84497ce6a250ee2c0c991fe51a2f2836388a354824b02d9cf215328dfce3f546713e21100000000000000000000000000000000120e59be3ecf35674eac6cdc559599b273f13f28a529770fa156f8e519734c451eefb35023639f32049cd19ea0d945a3000000000000000000000000000000000f97755b62a8cb8f861ea02c77819f0b58181aecf612d92180ba9b475f0b4888b922c57f6a1c619dd5514620a1cfd9e2c712943d8795a6104f024b9701c70b09cdee9494755bbab0576e2c7f7c9d48280000000000000000000000000000000005860cfb6be6720118623d2d8ba05e686df22744b948421dd3cc1b1691e00d9b5d00d00195b4acf7a7b043f764f3f1c70000000000000000000000000000000012632a3313dd611e8d969bddd556c2d79ff387603462ac78ded3a842981697bdac34ee6f1f4744ed2ff16100874ac24000000000000000000000000000000000112b94c317586e343acadeca611c485c3ea172bc10dd39158c1e678007130062a921b53826d7be6286963ff822f1066c00000000000000000000000000000000040de8c0dadd2a6c2a7ea0fa43e1a5f2f5a6be3fcb0de6875d8cef1ee2daad87125d12f6869c4dd3d931b296f1df2fb3d4d77f6246c57d398c57848db8d3f986c475a41a23d424cd3cc2b362c1b99f2a0000000000000000000000000000000006fcd2c4fe848e9462ba1112baad39031c210952adbdd06293a622ffe2d1c6e4fcc8773ec8913717018b97bcb9a554fd00000000000000000000000000000000130a97442f3273b7b35464545e7351faf71ead9b8996c63889a45945ed82bba29bff5014776c6185219a5234d8475c92000000000000000000000000000000000491d571bac5487b866022a0714be11b38bfb296233845cc434a50be1d35f516b8c6b046fe3d0a8f4f95ac20eddea01b0000000000000000000000000000000017e34b04e6fdf152c848f2432b7bd84b3dba3915f06eb77efb8035750aca9d89e92e1d1bc4871105c440d639e8d8b05541776ed9d1029918af4c5113a6110139b8bd7f938caa204373a28ddaa51430eb000000000000000000000000000000000f1b8df4e8fdfe32eaf227f5af9f2befc85073468f10b81d32d0e126fe2b0cc8e8adb8afcac73213b6ed95e8e843b97c00000000000000000000000000000000004e3fb435ae0fb2d8bd091f250aefe5922b353a64e16abd75627737f3bc56639f8b40652cae69c73ff1969925b0afdf000000000000000000000000000000001003aed7cfb00efce49d6b1a8eba27df87479a4d37bd7fda6121549483b669a1a761204b0dd28262bf27e5c8e180540f00000000000000000000000000000000114fbca7caf782b3296d0b26b4c362bf50acaecb8bc5726b2c99f904ec3d092d5d40991d0d30c8e79fddaa45f04a75d3fa64411438542922a7bac10806efaa633d31d37c0b223314a8b6221155b9c4250000000000000000000000000000000017faf481fd4cb0c373d21d7caad40e93d9a86e62d26136892fbcc6f6e48205543aff00c45e82fdd1d3e0e733de91e7000000000000000000000000000000000012e14fcb9ad4d9d15347cf004745ed4bd92097eeeb41c4cbcb728a234616363589d8f5ad4cbb61d31a8aa27627723c7e000000000000000000000000000000001513dad1ff27e053902e779e35d04cab648939317830144ea775c435a4b55e13fa2fef03a1256abf5c187487c25a774f00000000000000000000000000000000139da29de8587c7d0ca9237c37a116387385e9cea453b9e2003a37ede7aa0a3f4c1df55255897f5975b662be33622dbce7002f41c6acab677a0ad023bad2a61b11c1b7221d944018b5ce60bb61e87e96000000000000000000000000000000000c118b147ee3489f30c6ecc0256a314ab674110588e8b69ca6d265fc270c3e5b767817f861140cca5d7c6be4012d1ffe0000000000000000000000000000000014800790654726959fd876b035bade0da744fb36ee5b304f228663a531345120267c55ac19fd66022752010e5bea7cb30000000000000000000000000000000000193ab7ac2f151750356b6e178557460c9c2672b1736d19a20e3fa28082479ca60021aa68edf2524f1aa826ee70b65a0000000000000000000000000000000015cee9ac55ab45abbc57d0ea6ec9ee49f6c59f6b94f99589dbc08ee877d3a261ad77f5473fedd72ed7206647eeafb6eac26e55f09b787c0542878e4d720027d9ea465f829a4e0164cf618c5d9cde49bc000000000000000000000000000000000ef203fab794a0ef29eb2ebf00076134e5932e27c99d6d445695b9df2afe7563602e318caf5d44724a21790ca0ab0d180000000000000000000000000000000013b9b1b1d3e98b61b0f1a0ef3a1a4ceed57b6c01849a4ad66a86332b3d27022cfccadd3567e6709d2de5b23b23dba43f000000000000000000000000000000000c1fbace49684f4be32ef6178ac3a95ea3f50b11494340fb73dc5391d50bcacafb3bf0f2631fea9c4ec47327d644489500000000000000000000000000000000040f82812855aa3e3aaba826d5810c1049cf44e86e44e23cc6da437971b529d2f2676c73e1fb9da52640c981fbd710bebba67cc47e38a129ab1140fbcf0386ddba2feefc919aacdce6059a27a1e2efca00000000000000000000000000000000060d7a718dd02b147c265f71eb136d1f31781b12a41866b4f86d7374b93dd10058c192cc0fba928373b1526e1a5d7d7f000000000000000000000000000000000cf29275373c0573ef22bf87919faf5444847203c7dc6d2e18986152cc294be04a5b1a4b0536797158113a15276c4fc6000000000000000000000000000000001016d5b9d4d200d7b4b7cc3836b85d6697fe14db350badba9978c7b56983dd1a7e572640ee0372b0a4e2079ff4c1abf2000000000000000000000000000000000f2768d104d895473ddf8c6b3cd0e7c22458d0037eca6365c766879a07c95037ee0de00d32c974d767080935abbe0be1705fb566367d9fc142c4194b0525c16672b843aac1160f9056ebb115e80d377a0000000000000000000000000000000017b9ca4349fecaa43ce911c0b256680edb8a0906ef5460fc4d2004579336df1e19560fe960a7a7cd74bb6e8272e08960000000000000000000000000000000000d5b96dae738db59cc67a51c61bec6deaeefaaa51e3259243fa4b142ef59676231229ae386ce699fbe18c4c00bf9d49400000000000000000000000000000000111b79f4b68dad16550a13334d09dc38336a75a5da23a17b5064e2d591aa3dab4c2e982a9f730a7633070504663a24610000000000000000000000000000000018f6d3616a7eaf17c805a88c9710039644d01b61aefebf76717ddcda6f4bb34aa15702de1e92bdb27b27f3409638da90f7bfd990cc4dac62a0d730f56b4eb1c1ad77ca9cd58b089c23c2f6efa00b7fa4000000000000000000000000000000000aeb5c087644595d0912879f61959d2731ff55260c682ed2bc5fc55c13964ef7c1f70aeb55876d2264d558c31371ca69000000000000000000000000000000000e173848f4570525b03a2b2c86f4dcdb8b28dd6d18c1354cad31028eb1b8b44432c2346edaace093e3954c7fa6d338a4000000000000000000000000000000001949b0902506d111ef6318edcd7a58ca4d69f5804a028aee73c3786cb2db168c6a73b77194f7a021ae6ae43ac78ade340000000000000000000000000000000017c5e28ba6103d97e2f3d3611c0c78f06406e0da8a49ae29c7d460b52f75136920784cd500aa3593858b877697eb8424807c5a41ae2baa1e10ebee15363d1d4569f731d77a418998108f5dfae0e90556", + "Expected": "0000000000000000000000000000000013b49054c3957d1e77ba2dc3ef75775bab9f0e9f76b33ff22e244e897b8ab80ee0749c81eceea259e99b5d2a72251e5f0000000000000000000000000000000012e017e4354ef86f73ec51921cbfdd01e3113cff044a049bdd34e36401712420790cf718bd28afa280ad12104c1851ed00000000000000000000000000000000097f28bee5d903e3c6de14e834d5beea5c847c3106742978e586ba7e913f8b631a69c473aa10e19df9795ebfa3ea6a98000000000000000000000000000000001953493daf65b974b549bb98e735da44b543d6fcfd97176fdc7f6f03617d90e6bb952a607fa8e5791df5dc1c9bba2286", + "Name": "matter_g2_multiexp_2", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000d4f09acd5f362e0a516d4c13c5e2f504d9bd49fdfb6d8b7a7ab35a02c391c8112b03270d5d9eefe9b659dd27601d18f000000000000000000000000000000000fd489cb75945f3b5ebb1c0e326d59602934c8f78fe9294a8877e7aeb95de5addde0cb7ab53674df8b2cfbb036b30b9900000000000000000000000000000000055dbc4eca768714e098bbe9c71cf54b40f51c26e95808ee79225a87fb6fa1415178db47f02d856fea56a752d185f86b000000000000000000000000000000001239b7640f416eb6e921fe47f7501d504fadc190d9cf4e89ae2b717276739a2f4ee9f637c35e23c480df029fd8d247c7a7e300bcb3c740fd1f693d4c8915c4c46dcb627f6de6e4847f123623cd23bac7000000000000000000000000000000000f20a07526a082e88630a0256d134a8a5e8ada07b1cead39ee838dcbb30904e9016107fcbdf1f8ba182308dbe0b043d20000000000000000000000000000000014fb7732f67abf60c03ac902577532d0acadb5f3db0d6397a42ba693526ad74f2c61a0195bdc9704aaaf12e65aa6d88b000000000000000000000000000000000018cec4fb81c85d304588d11f8b9c51f5a053df11463e5812a1b2e6c7144522ba36bb91adf219892d0007cee470032e000000000000000000000000000000000b8e52d958a12a9037e8be9bc0d5045cade2d6ea05c6e68462b3a30b5d4ea34e5fbad173761e4e216b2e6958c8983b28b473df5e282565a0783d23e65e283a103ebbddb5c884183cceb62fc32d0e9602000000000000000000000000000000001468cb35a60898ed129f30c261b8431df6a154c250ec16d85a22f8717593b2c21853d123da86d977a7938c5ed74ef23500000000000000000000000000000000011f4e28e31b5f9e6877192a5e632d8c1ed7ca0c42e6e9902ca68f1c2de0f648c6064436012c5c7b14bb8d1078e02f2c000000000000000000000000000000000b25114b2697ca7eb1e6effdd1054893a188fd382d387ec098f846c1137a9b9baad01653b963a0b0bf3cb50c3ce3563d000000000000000000000000000000000c1d241cb03e642c1752b1e1886472477c19a2801ec032dc220c3243952f882094119bb92b621b654b766bc900d2d4f7a048ef7cf5d1f6f625ee3aba091147c389ebebc5b8f3d285e16ef4e8afe5c013000000000000000000000000000000000c80d4474390fa791ea5f2f16b41506d8ae13ee0993c8d31a07712687298ee7978a724999500c42400d2f788a5a36067000000000000000000000000000000000592705cc5a8875750a4e6ceb42aa3bef5593eda9e8212702a2e08ea70277a2a66526bc5237be33c8449301544da35e60000000000000000000000000000000000facabfbd15284c6433f17b0e6035d4fdd84d3ad2dd30a27d52809652ff6e7a684d7724697919100567ad0c3e1a26320000000000000000000000000000000006a0fc4e2af69ce15a356656f5d182a2cf213d76a6047a05a1a3375909d245f5316b91333d2141c0817438f0d87bb52da9b63c6bf36997118d58600c1e429c105a379b9e8b0de934ab9f433a4fa63dc80000000000000000000000000000000003f629618e1fc3018bb836301ccdc59022f0a25cc9c5de6e4c31fa08feea525c83256235e4ec8364e77e5df478f5f62c000000000000000000000000000000001120d6af221ba6f4351bbee4c2c664a769adb17872646df2c408f70c99ea991ffced4eab50fa98be1bb9426915f125930000000000000000000000000000000015cd16b028ce3d58b10aeb84b783475d894ab3f0cfdf7104ebb4f3417a038107128f07518dce548271061cb8c97e88af0000000000000000000000000000000018379875b68bc26107f9a068e5034f29dc2ae7e8830f8e9ecddc53fe7991206646cda33d37b31a47a977b46be58d7618f228da17f49667c113d2bc2a2c8a338f80be68496f5145b4be21a5786ca6d46b00000000000000000000000000000000036570783711b381830e35878fbeb187b84884a9a0e88c38e84124515b470e6ac18157e1499026b27f4f731a961eaf330000000000000000000000000000000008382838c18d56c046a8db495babf8d14c915622d7917ebe10cf7da7ecb65f174cddb9e70d0262ada961b396c5511b410000000000000000000000000000000015f63ce982aa581dad5c71fc79251b7f6336c4e78a4a0f4cb6f87167cabd31cbec987d7af4f11dc6d693a0b0774864130000000000000000000000000000000015c001372fe0530a3f50fb8b30e75ff4b264d673e0448211d082c7a9018f583b4d01790019874596c59c68768cfa3e699431e18a462fba704216b516e819fb3392e315b0c92a7411a329cdafeb51124400000000000000000000000000000000074d78cdd35ea17a3013e2301fe9f80f2d20d270a25fdead37eed7697a52d152612543781763e6035fa5452ab12cce25000000000000000000000000000000000e572236e1c203a1c0f99e6ec978458c1a143a6a650eee27cfbe406bb2858fe5f30222f468d119703c2f442bc644ff3000000000000000000000000000000000125384343fe132e16a9fc15efe1b3a9e47289e0afc4b44d492e33a6216edbc96d66c1ca66944a8296e7695f27f414c5b00000000000000000000000000000000084c2cbf0d7c932c3098ded7c70d4411eed882feb0f79e0f7f1c31f5fccb6d53fb57de179c3ba5754bc5e532c3784df12051041bd2f12f6e6e29924139770fe209b7bbdbcd6c0bcabbf5021a7dff2d830000000000000000000000000000000004d46066439c3ac559cce863c58316883651023990180470d2efd06e443a7caf3a514b54f15ce6e850d32779215bcf4a0000000000000000000000000000000019ce904b6c9c3de59f7d5017f60f1978d60c564f94a0f1964c24c876d1139a7ffbeb6d0d4884bbfaf5f2f189af6904a50000000000000000000000000000000015f1989719e69be95f25dda9358fb98aae2819e0deb7e2d291e2c01e85ba26a9da421896c6b6e2ed20f609b533154694000000000000000000000000000000000b287cfcf1dd7c6d735c1358dff15393ddd6c82e7a33c5d8005c4234cdf823c76a4725fd74cad74b3ec51df67f09af0fb96df57a600dc3b5aabff5b1034886d24f6fcf035bcacaaec738deb2cfb8f85200000000000000000000000000000000006b37e2226957d639fcb0bcd6c20b3c7b8372e7347a14b970e01c67c1859fa97c754ce588d0f835ecc053549d963ab4000000000000000000000000000000000c6a5fae8be3a32e3f70a4202a1ab6d97183964b9f7b9a084c49922cd9e0e952b0bb66c5580f0e0c417e079493bcdb4e0000000000000000000000000000000017b6132f11adc0d5d693ae7f3a0f89f5779708083eba23e03b0c9265e4e60624e1fb6940e8ee49d31618fa6389b1b50b0000000000000000000000000000000000a45c5f6df71359648aecb6434bad1619c39f10e279a02b3cc9725d0256bcd126843fc9ed29cbe02a32cbbe79774a3378176412b07eb7f423f23ffeaa0ee642590e0b7016bc063f3fffa93e1e35484c000000000000000000000000000000000ffed009c78ba9af8cd33af7b7697ae4dff863bb92365055baedd2299b7f5b5e8abb84ed434f7223c3e309ca53c08aca0000000000000000000000000000000003b2370c837dd6291818efe7c9af62dd51295c418739ecc509d42c92e2c97d12a9fa582946e176e8153fc9a273140b2f0000000000000000000000000000000001e63438e8b4a0462cfdff64a281ab4a7f48d51b51325817139f8ee683484f8695f1defc0c3efcca81d5fbff06cf9c54000000000000000000000000000000000192fc391cdc1ed6ddbd317f2f366f2ce25ba27b8c0f09c733e7bc0c0697544399a3a4f1186d139a8f6399ffa88e89a69c4b5627d84e153f3a4ecc14ddd6baaf1d62253a0f88d3af51be18d991976da000000000000000000000000000000000002e105e0eaa418d58019a849b89accf665a94ffb0bdf308a11b99b521de7af8ddb150c0e3b2e9c54cf5456b6105bc81000000000000000000000000000000000691a3b3986fbe1c0ea22329364454f37f645d6abe9310e883b9191ce512347e074e18e28b88c2adcc76190a549b80b40000000000000000000000000000000003f3a37a763c8d0d99a3fe36923843a22cb0fa18ced48493b2510fc99afe5b7699bbaa6c2ecdad8aaf72969354f121a1000000000000000000000000000000000f4bbae00205f54eb10c83d928d908fbae342b76050e33c51b6e282e02b3c1f132a4728dee4ea95455c25fdfc112f2542ed270764791aff081f1dc8051d22b8e18803a7e310393f21bb4a495a445cd450000000000000000000000000000000009a3e98fe4a98582ce9f274965f376cb45e8583775dbadf626cb1327c1f8a25b293b97e7f8f31ff72ba7e8e769ff25ef0000000000000000000000000000000018e4785ccb76c4897087c8a4242ddc744c6a0a53a4a844254153c23d6f16d4ddb945252d13f93101613f4eb0b1e2b8320000000000000000000000000000000011b81d344eac04d3471b1edde5e51f31f97bea3396580839fa094db58cf6bee371bbdc045fb60c3ee5c6cd5d3f6d3c4700000000000000000000000000000000073476bc5b1d52ff4ca89c3afc099417f473543fab6e59cf9de8a19705dc4bf2a210b1e6de4dfbde035c312be0c70c56fbfb7606b64eef0460b8f33a0be54451fb655ce0b81db89eb7862f392450354f000000000000000000000000000000000c414b95b298b9c673001173ba7e5ee3e03926f28068481cfa0b469ab556f8fceba9fd0a815180ae0b82c265fd4c6b7e00000000000000000000000000000000054a242c1cc1a9c710bc23305d09c2d613ee8eb3840b37943bfe83f9c1db456ab4436ad319fcdd8684db129d76c95320000000000000000000000000000000001683711c0c7f02e67374f190eed1ce6559479d6d199f43fb5b0ce7df7774a5cb21c86b3b3498855d9b69c5763acd8c4300000000000000000000000000000000062f87085dfec847af518bd71c078f994b090c3b27c6eaad79772ab58afa43993db52fb08649a32629d61c3db12c87318a29fcc442d0c2446697e94dc47181dca7a314f9073c06aba6dc55aa79978d7d00000000000000000000000000000000083eea9b5b2d5ac5f7ef51ca889a4317322d098a408a741827fb3419eb12a51c07c788c2798cb37635e224e99bbc894c000000000000000000000000000000001312ec00f4b3a4305700b44b3f215779a9a8bfcf5b5d3a7f237a33c5484099ec9bc5c8537fae768e2c0ec62168f383d6000000000000000000000000000000000cf1d5d05d11e1d07074dd34211d0f00eae1df4dc550c55bd2fdafaffa1ad36abd5da30c5d3a5aa2845b1d95a5cb571e0000000000000000000000000000000015223baa9f2ea4b04fdb05b05bf3a94dcabc5e64189aeee39c380de9a34fe6b4253f5795f70bbe51b80e1aec1eab7196d5b468797b4af1978983faebe59a28f34956dacf5b7f65d25548bcedb518f45a0000000000000000000000000000000011a960cf1978aa2ce1731b857fd91d2f59d4b8d7c6871ef6f4f85aeff549a2f397949d11a4793926fe7be37f3a83d11c0000000000000000000000000000000001954f056834d6e3b16043ef1acd0a47a353300257446e9a1db7e58bd0d7c4bc9ceb3db51ae01cfed9de99621e96934c0000000000000000000000000000000002e2fe460e71b65595ed93a0010e5ccd1a2c16fc4e0d345e7226c947f29720d2f3f54282f79cec086d3fb1999b9629b300000000000000000000000000000000060dd8a7ccb613f1521168a8a322aef9f84d9708a893f704f4fc9a19e2493f25620a47e0fff1bc1e212e65e92873b4f2dbc6afcdd409e5d50d7b655580f1144de77f3efe5d6268032eccab7deaaad997000000000000000000000000000000001472caba61c2f1fe4b1d0912b114c25de103ef4351668f22f3a158d7a347539a7b6656044bd490f036ca3e29dbdded370000000000000000000000000000000015f8cdf7786410b409f218164063c99e77d8f72f03882a6c9430ec725ae574547d3ea3cf30c3ad2c9c3febe6c30b1272000000000000000000000000000000000ccbbed85c2809433fbcf22d6490457dab800b21cb4de414c7dd1804a0bdeb7142f8ffbb2de921c2c9eabee6a6351026000000000000000000000000000000000a404f42c48e3ca408d3f92079b99805004da928f128206d8904ecd7fcb14121c7d9a9e7fb69accaff921315ef3d5372807347519f114e78f99617f6b147ca833bff7be962c9b1e1f32b5babe6067d7a", + "Expected": "0000000000000000000000000000000000fada9f43b29abe15693d047adc277814cb94694cab3be56b92312ab7666649b8e9d92aad81f8e487be0f74b9ce8c250000000000000000000000000000000007f6891775811a325cd7f548011ad4c705ca0327ea0484d938ce061c913a7ee6978293c3258c4b865d5c2325816c39990000000000000000000000000000000016761f859beb90ea03aa35e954d112da02daa8e76de80297afde9c29cbfe8ef4d42dad535917685a99b2a91b1f952ae50000000000000000000000000000000012a4f24ab88341dfb8a60c19993b8abea96dbd7033d3686c40903728b4fd4da7d07961f2584b51e9e6c05976d555757e", + "Name": "matter_g2_multiexp_3", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000b52f05365c4df20a7290aee71a7e030615d1a2a971167884d835c24e756a0faf6ed0552341c561446c7fd3d5e887d830000000000000000000000000000000018718ef172c045cbf0bb132059754b62414097eef640a781db6ad521af5a24d78c622d9402033fa939f70aad0510a1ac0000000000000000000000000000000017e969e44b4910304b350b5d442bb6a0b71e1f226cb4603cc8b4dd48614622f3f4e1ddecb1894046649d40f261d94e030000000000000000000000000000000004dacaeb9e05b9d60ce56c17312a092cb988bff426b8a718cdff860186935507a06eddbc4a1a29e4ef88db83fc4b6e77830630695c8dabe9aded1b5365bf93770aab7e9ef4140a2bbde2f0a7b109724d0000000000000000000000000000000019829d5799eed5a081042e4646d46fb6bead6d3b9893a4240867b25ed6af6a3e154514f244466d80e3b9311e060bbd7100000000000000000000000000000000156157a654db2813cb9c1b4da0a3ee192fad076bb2767020fc5fc00e967c1a35a367ffa375703e1181b3705ace9dd28000000000000000000000000000000000093385a6a9dd0ab996df54b23f47f4a49b3f379e11bc8331016ecee6161fcddd22f6d49fbb21f098873f1e17424dedca000000000000000000000000000000000d5b5b0f2ce81e755b4030b33fe3a8bdee38c2c60ed3b4a88bffb9207cb762c0a5c699ff424c000ab080d763abc5438d184ef5eceadfd77b3a4092696ec34d0551c88e434567638623740b7d5f9e36160000000000000000000000000000000003af8c25bdbd0dc1cc344d55366f15555709a74e1f0d8d7050cb6b487759db6200401b7868fca3c2ad26e6362a30e6250000000000000000000000000000000013f8b6ffe30f9a133fafe64461d305cc6b2cf5aededf68ba396d4e00df651531c750a3d94dd77bc5c6713b939b18fa19000000000000000000000000000000000dde97855d7728f409d873b83b6879b45ace5b73f317687fbf478e594a959ce21d4d751db646ceb20432e8311e67404f000000000000000000000000000000000fea997323cf29710cf0e3d44ce682e039d6cbda155e43c94dc8cefc5e94000de4b9525123b9615b5f1019a46ef37ad3a80d9efab033e920061cee8f8d7ea6023cc05f08340642613628b39e7b7fd0af000000000000000000000000000000000cdf60e3bb018407eab162822468255bcffd54cad9127054bd1c30705a4ebf1afc7f539cca6ba4cd070b44410ec751150000000000000000000000000000000009a2e3e5993b6a7007dedbbd21737a8c0aef3ecd4607953c4a24bb3fed97ccae01ae1cec024443f300b570a66e9ac3bf0000000000000000000000000000000008a21fed19e9ec2a741ade7767b0c9f39b79c3fbe34aadc9eb3043583768d893bf927d26231759290c7dd9c4f158d5a10000000000000000000000000000000018eef4ff88d63149d2632c9db586a4af0606644b16c82fbb0a3b869f1ff924c59acc8efbfde7bc604497ff68939cdd0845111c860f6f5725f99b225c53b9fe1a70150e7ce922bfe214900aaa2790d145000000000000000000000000000000000f5d47911596c46c0c08cac5f5e7f6d0609874da4ac1bd4e0e59c393273a5fe31a756c7cfff2a01d19e79d209d7c6d3e000000000000000000000000000000001010f864eb6624132d4436d18db7f5b34727060dc426c109886be88031e3c155490cb3fb09e1fbccb7912875477c6d840000000000000000000000000000000005cfbf1c2ae1b80a8c7cfb2cefedd907b0552794f4fda101ca1a723b18de8cbce30eb54287e1847cee3f416cd8b45f2c00000000000000000000000000000000084fa63781f7eba9c7e911ae5866d485bc7e90603541c55d1ffad8b3cf7547fd57fb24b14002560e58410b828513e109c07041840216d60ff445cf53b273a46016c8ecefefb53550f8bafc79966f863a00000000000000000000000000000000124870cfa469136c638e0cbf15802f2699aacb66d7e4c2965c6759dbca4b7e47941ad9ec37a84db1afeeeaa65a7418e4000000000000000000000000000000000d4503049a6a53536bdf41dd832a6ecf3f10554887da7e389cf940394e1d88db94369b7947436546eb6c6e82c48dfb9900000000000000000000000000000000053f9a6e1f05b67cf553073358009a172e2ab8b43572a974da1f3de85a29103b13d7e67b2a359297172d27dba5c61439000000000000000000000000000000000abc29f50ddc1c113c73700b9b9796890cbf48818ba981fdab2db27ef1c58f4c2e4595b99eae397d40990ce2f6c9317c29b031b82dc8c9f4ea9524793b54207d4e13a548d73297f2aa6241aff57abfd00000000000000000000000000000000007d2aae9794b7a7de97f7146c0ee8415e09e56fd42535bce6773cadd6f7ac09c4eafe2e926cb7014377e54c703eaa9dd00000000000000000000000000000000172a4a33ccf99eb0473b2c44d30bd53159afae0c7706ad128bccf6258974d5e5761f9be43e618cdbd96027aede7fd5860000000000000000000000000000000012601bce2171c6e4c2968a3efdf1491285f9e4ab37cf973ab5c8e224ad5b40e1b6459ac89090c73deb8fc79fec7fb8e200000000000000000000000000000000112a6443116e6f98ab348e57daa3971b5fa506e40515e1611fbed3e7dd64c5c1e991e0d2539a70eb93e3da0f573d6b2263d26ae92119c7b06d83d7e2922e06559b1740eae315c6623d3e543c9bf54258000000000000000000000000000000000030372914b83644fa4db1958831e9335c72ab7a811fb337696221a3290e4c54bc10c2225f8fdc3a9f62632ba2f1594500000000000000000000000000000000114205926609470b6022d24046a1997c048e6d2cf6043397892c967692161c0ceedf409bf5e1199a64eabb1ff8de23640000000000000000000000000000000017cdecbe73779855b7b94920d4bc8ad057ce51c5481a5579650df8a5bbc421030d2ac44568217c4dbb13d7c639760236000000000000000000000000000000000f194fa814bfa7396697bd812d9449d06fc61b580d7a86429fdd1ad376e21ceca139356d7d13964c3c684563675711c67a02c61a7a75342ee7f0745886c0ea2a73c21500aef8078d21d20b7216c2990e0000000000000000000000000000000015d4ae1521acf897344c3a76261754ff99742585af4a0ee86dc473a88fd408091404df1da9d8bb291db68bc9c07d6b2b0000000000000000000000000000000008ce160213875c661163990f3f7ac219ea295db5e828354864517ea8689ec15d35c6df78ff14cb276e0c97ffd7fbc09a00000000000000000000000000000000038a3ee211e777d6d6b7ca6c7a0d2130f1a071c030eebec412c3a0f14c3584e7c5cf15de254a8f141a8210a90249ee5a0000000000000000000000000000000019f7ec6b2fcd8b3190ab37a6e843340d3f3fc092f5772a042edbd5bdc967b96e8a1dc9e435b8463496aa1301f87d0e5a81b0c87102055dc2901826875d5e85a794befd93fccca2b9c0a1f70ef5610d83000000000000000000000000000000000fa7f8fbfa1d4ef5f001a451c55ed261dee344025e599884b29d086e15665867932120d33bee579d5eb1b7e6c7299f310000000000000000000000000000000001f06356f793350b17b47a623059a068800ca1eab6089c7c146182990063e8e23bbf40d95a42bf6e976224b680b75bfd0000000000000000000000000000000008807f6606d2302450bfd8b38fd4147b851ff59762c1ff48f9442c4d7b77a32c5e023821eb47fca839a27fde60e5f61d000000000000000000000000000000000c5b92f1ca9c20d4b6b11d794a5853824cff20d9267a20a7aaa4bed8bfdc728c4d4d50feb8f0b569757b97f473138db1ebf66fce49c6beb12737fe05e3adc0a51ecfa9144ccf6253088dd1a7a483de070000000000000000000000000000000001191410ec6c5ff628bd25d35965f5e9fa7f3c3d8c0a9a1ee7ae37437a97c25e221110d892e2c7a0e9c8e386774eadb80000000000000000000000000000000003be30c25a18cdab139277232d8888f6d13112c9556895af8030f1893114d5845d895df9afe3c6f9ff7ffb1919adea9200000000000000000000000000000000197f6b4e38be0358a3f1722664c61e62587ecf5467f8aadc3a236b47682a75cb76bafb18a5c556b321d5da49cd4bfd4e0000000000000000000000000000000002e4ebf7f22d929b7421a600e67fa2e64a59edd87a2e2eb9dce1f06d3c793f1a812bcdd510e654d44fb4c1de8c64ba9f0305523dc79dc4b905e65587fbd095ed57aa42403d2df5dd489db8f50c99e9b60000000000000000000000000000000011c6f1dbccde640f63ad7d40089779d01075e26269421b4ce12fa5341f58ee9110f17d08dc1052426f2d00da2dd70b4f000000000000000000000000000000000740b147bcdf06705971c113a5cc12fb37345dd59f2cbb5ff500ce2b347fc5a8199cb3007a871670d5093f28979cfade00000000000000000000000000000000046563ea98b5e85b3c42222d5e0d8481e6aefaf077a1b99f2b4eefb397ec846aa3659aacda569054c9c8b9b69750272b000000000000000000000000000000000812d887943506d68e3525ced9b979354539b7b14003a3169e0084c26326b92be67346920c9a99ef0f9638e8991296feac23d04ee3acc757aae6795532ce4c9f34534e506a4d843a26b052a040c796590000000000000000000000000000000004c8078fe8567013e8d05a546934026cdeee7d485e30d739407db16fefaef53ed7bff0f9adaaf064aff014ac919d91c600000000000000000000000000000000107cc17f485af7f22e07cf14c5cad6368323f720511fc9dda677b360567f769e47a77f61274927ef9b7be48a77357ec40000000000000000000000000000000001487f0880a6cbdac33ca35b9b65e4ead9d8c2e9180c993bdb2052060325aff8c62668c643f0cd9b4bb1f06a3dc74285000000000000000000000000000000000d4b2d062e31fabe8d2a329dbd6417673a519f455739d140246f2b3e43e20f390088c08e545bf0419d796ac71aebb5198586d7ad8fc3e4fb42981a4415224c0d976ebe1c342e9bc1cd66d35168bae33d000000000000000000000000000000000811e9b0acfc10830c074c5a4d9f4d9382461eb523a61dda0b77f1c43b285fc5c1ef3a1fafd923addc9a6e904505a255000000000000000000000000000000001113102d015dbb509f0b8d0d0ebb4d3711c4f0e1e3d55fb0af247dd24be4fec9d6fe3ad73fbdcfe206891bcebefee4dd000000000000000000000000000000000085aae9e58fb97b96ca3c089acab7bdbd0c3adae141bf61075f5c13145b0d07113f1075dfb959bc7c2d3d3b3a06ab2a000000000000000000000000000000000bb5eac8125807c10270d94e5bcf278241d6fa82f68e41b5529b28aebc88870af55881db526f7bd221a8c4c0b29a1b7d6e7db0fbd2a7327c85054b4c0de9727dc0b051058f8bb4ecb1dcc7f825781712000000000000000000000000000000001335276775545fbb4c701beb57cb34312108c9f1d46b4aa4b09a16faf0e648b4e80848bf5e75ed8730715f0107afc9820000000000000000000000000000000006ffff8736bab41b4ee5681b741a81fc870e648001027161144254d04c678e4f954e9f191bd8b26201aec681cbf0654b00000000000000000000000000000000026ede90d14fa0885baad21f9631bae058573251cbef5757bb8cfad061f3bdc78834fa5862dea19a2236c014b0f1652e0000000000000000000000000000000009844d0cf7f6f3401145d8d720defa577ca46b49e04e39c4c139ec6811a574e7dd5ce3acd00d1ce9496f10dd15c6d94685cc8d88273d4aa822f44a447cc22f5a58c420bcfe757a459772825619669a720000000000000000000000000000000010192b925fca096682acf138833b12d96bf97c9a2e69e4266eaaae1785b9008f36082e23e2d42341427edce24449935f000000000000000000000000000000000d5b24a94adadbf542aa663114096bc670e1b6c99f3b661f55de121922452534faed7f68d6b431fcf6f3e379d7acf6b6000000000000000000000000000000000acdbcae49206b749d8c0d21017a33e689ebe26804d1fe7c863a2ea4210c3559805dcf73685702bc56e644b4e02614a9000000000000000000000000000000000092309d684fcdf44bfa321d473060dc2d8a8c66c51419894a3fbadbf1b56179c31dff25403b970d543f1dd0e19e56cf5b6e462d809f8bf1a62f276dcb27e42d9aa0ce33fc4e149e87181aca70a4ccc6", + "Expected": "000000000000000000000000000000000b219032a2461a5fd1e43361c46beeae92e30247acadcdd241692abe81691c295ba38a1f0a2a45ae76b1b95d7d0fdc460000000000000000000000000000000016905f64e581aafe928520adc27c24703e7adeb36dfbb416a159cdb9b9a26c9cef0821ccf52f5ea5253b7c9d78769e9d0000000000000000000000000000000015cfff195b2123aa140f963628c41deaf19dfff44d26a38de4547c3d15edef10fe9f65b1802dc374d7ba8fb62117c8880000000000000000000000000000000018dc725cc8d8919a7414b7866fdc54c4467b0f87cf99fc9b36cd65c0ec526e32649f9c57495657a93487f1f2f5769168", + "Name": "matter_g2_multiexp_4", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000014441b14765eee30e8131a7ef62c3b59370f2f6f0dda20fb2a3654fa09492bf695de1d1a8f250bfde3c7d2ed805ffaeb0000000000000000000000000000000019d813f8be2519e89d42a9fd3fef09d44a996d6a4713a9c224bee10f0ebb196370d6231fad810edf9cb4c875f08357890000000000000000000000000000000001a5abea13e909bbefdb51ddc699614366f271b2f6490ac8efcca7759833f3feae11057ab1b9ea32311e7b6ea6de110c0000000000000000000000000000000003ac2bf3c5486ca176e34ec5212165cbe04fc9e8c375e3e999a31fe014eb824ea3f2d06b9cf8b86ce3a76960cf2eb4d7535b53ab5f1c596eb966f57867e021d0f3b099e17bf384479c959794b17d6a4b000000000000000000000000000000000598e111dcfeaaae66d1522be2a21131350577253a3f33bdd74a04b0bfba2940e73b62fefa8f0c34c4aa91b633f6bdfd0000000000000000000000000000000017fefff7d94afbeceb33714e9b5480c3a2f3eabf9d7f6e8507ae54cb65f69b21cd7d04d23f24e3a272c589f572b91864000000000000000000000000000000001652e3f5a99ba8dfbcd1f90de955ef527947642054be603c1b84b24bebb579b78e2a0be426ec21d32783a0e55f0178dc000000000000000000000000000000000a6c9ec91e8bc86ab198416cbc76239f0ac0b903f40310ee1f2066b01b08191538ca913c2736f53f23ef37fea13d52756e0512ecbc5a1b02ab19bc9bee4d3d9c721278e07b7a6e389c4d6443232a403500000000000000000000000000000000072e022c168461905f798e87425f2eebb517e473cef98c255d0fe434863ef5811920af65bc946b29d489b5dee1066c56000000000000000000000000000000000e7a9872caa82d191f6014c845e1b3ee4ea1ee89852b546a2c85ddbfa3c1d4ce99002e3d7732ccb8cfbd57d550285ab400000000000000000000000000000000144be65db373f6401d76e0ee64e51076b861e8fca596dd6a7f3b5735c23b0cd13248404fa0969ecaa701663a1032f48a0000000000000000000000000000000014c9e9c5cffc4518889f7742440053678ff1d9fb1a1a103d0c1f762b10655bd5849ce98f4bc5eae80bdd9e767aae4523a79fd15e80b694122dddb01f836460b3eff99e61ea6309d6b395c94fb5a43dff000000000000000000000000000000000948d0f0c20715f8658e1f2b4f9d32d851e584287225a2f47735a1f4c241b07f8d7c5dd8c13bcdf84e97d49817d4d88a0000000000000000000000000000000013c064548cb756b48600dd535af8eb5b9138f984bac0391df2e90a204fcb6c36017df910031864d802a2ff719856b336000000000000000000000000000000000000b7eeb7c9a01be88e573f196c2a531635baecbc8cff9af385455af3757301436686596ec7fe3618af26953c49f7450000000000000000000000000000000001332f4dbd5461ab9e2c8b3c19c6ff407a071018c92d2c17c1d1d481c24565276c0f55eee8692016c1fd76d70f44627cbd012914a96253926fdaabec06944ffcdb4637a05e3e78a9bcf1b21b68b9dd9b000000000000000000000000000000000d3ee70610b5029a28e586f0f3e65bb19a263db3438710fcb8073e1b25f83db50eb5bbb9d75cb20952a225023f747baa000000000000000000000000000000000682f7d5cf9d182b20ee88683f3915e8c9b03074a373e573aa57232de4e997bf155acf680e365aa0988989dfad102b2e00000000000000000000000000000000143962963e230a9154dc328f9583f5be6923a3b10ee7b1d0cd5f5cbff13913d8ff78ca315be7387900a50b94449884c0000000000000000000000000000000000f4f934b42452d41cc20d7b1ec547bcbcbcc10f215364ccf2b864db23a09d06e94c7a87165dcb691f4975323486757ada300c7e1041d94df0e0201e1135fa6eafc98bd33b2dfbe4c59b546a52538c07d0000000000000000000000000000000005f0fd4080e26971ab16d33aeae04220ae23781da3179e38190082f1d167514bd73bc8ef976a2f333570e9f56a6c05e6000000000000000000000000000000000e159905d29b52ba61575c3a263093017783e1028b3701ccf060c165ba33a765b5265a9b1681c1759bfe2c9c401275e9000000000000000000000000000000000c5ac0bc29a49a7c37d772954da850e6b5e301e230552be9a94017d770ebe2cf4dcfaf104633623e024aef6db57892900000000000000000000000000000000002228e7f42a9409acab49cca82cacf306f6c6c29fd9f7e2ed12fef2d16383cdb7bb2b39ad598b301072c615232db1fa833e9cdb10fc117afb17803b61a2bca7de1d190a325639eb23743f51f28294b3300000000000000000000000000000000180569ce03e4a0155285e733adb18fbca71225507a7adf01cb8e8648891525305e92087f58378f4fd8455d5632ad660e0000000000000000000000000000000011ab84e42f10154e306a568d7cf7bc381000f0add0500cb508f695a3b283ea69d140aa0ad48fce2d2d6fcafe60761078000000000000000000000000000000001136c3016474d6f475609606e8d0269fcdab9fd3188a512681cbc41eedeadfa3b3d9355e5b4503e8b5c3665e49fdf3ab0000000000000000000000000000000003f56cba1b9cb4302099b16b09c2602dfab80d1151685ef78e5054cd454b319adf8b5998053a5b9fddcffa020595e3bfc48b98edd9c229037751d02e58f3d4234d9a3b0ad9ae4947ae14beebb274746f0000000000000000000000000000000004d79dab9eef873f3415d66172bab7166ce0c71f322529bdeffa915c1b0d3fcd645c91dd3450ba61593ffecb95edb91e000000000000000000000000000000000d611a207d3222bba199fa083d0459675cb5fa00839fb4c9034ad868fc1e79d653c18651771431d6fb6b6b5ce8cf6f7a000000000000000000000000000000000ce802ecb106a4f0ca4efdcc058dd0e29deb6a5d30a2c15c8eda896bcdd3ac19053c10105328d239b26c5ddbdb3a95fc0000000000000000000000000000000001073e142621ecbeff6f81453660362545751f992ffeec3a83477fed3e6215a709ffe0d17b65d3369f8f3913bf000e844228758d2cf8105f2ef11d83018157a3119a44874dc34d5f0bddb533f50df52c000000000000000000000000000000000bd84f04b3858b1138b1b429c7216d5d1b1e99c1e0fec26440d59b1ad79788c2d5583122c2ad769fcaa6d10d816a1f1e000000000000000000000000000000000387977ed1ce5da51dca230531bba53d17d3de5d593ec576cabfe6463d5164d7153025dbd4cb3525c4145c4f6b85fc76000000000000000000000000000000000a19c943a90fec6921367a2edc5bc38a5c59839cdb650766a2d2d068242463dd4460bd1d0e7a7fb0e3d2104704b8b3730000000000000000000000000000000011d99d44b200feebe00bd42809e3f67a23cce88a07165416cbfaf4db14420f99e54d62db4280d2c99ca0bc3dc41eddbea417c96f0cf4355a78513c77cdc676a7b09125802c8045756da867e0025a36f10000000000000000000000000000000006a186aa584a466a860849c78e4922889c95a4ac6f39c99029fbb422c43d699a8baa51aa4ef51ff99557babeb3e9506800000000000000000000000000000000065fb15b5a0923bdb52dbefc7e9f1a898e32f17d610bac829235446fc5e1913fffc8176e0fbd33091505761f1d06d8920000000000000000000000000000000008bd358698fd073f660ed608462cfcef1da9a59b10905f1d98c4fe66958e56802814906430c10fc25a4d351d91f91cb0000000000000000000000000000000000a53638b1b6c6eeff468e099446300ca7c7bd899c6494682d14fdabfa9cead0bb37a0325d99e7d0ba6341cfa1d257ba846561328b7689b0a89014823537cf9eeaca6ea5c56a3e58d2abfc2ee455dfccb000000000000000000000000000000001070b98c6348a67e996626ec2752f45e4c007e9c9668459a777c03fab633c10236a1c5be99f3fd950542d5648ef9e88400000000000000000000000000000000073a564401cb1a3a53334c0a55da261814d27b86ebf40b02a76b20973ba2db92e42c138ca7790261c2d70401c984bf470000000000000000000000000000000004212d8a9e4b01f5c6814a88561c2c6143eea61327b031a2e0e4bd056c12dd7098fdfe4d1511bb441ad42b55b584a7bc0000000000000000000000000000000005c5d23824b0fe05eb962194550681c57c1566b315efa8ebc90b3593d7d86ad18328baab8118c9f47eccc0757588591ccf6c3fcd4b9e6b72853934b306a078b1f2fb17879db4a0a93d484abbc2b746cf000000000000000000000000000000000b1b3053774ad5515a20bd4c556d2b3ba95fe74fd0c955069c7f933dfd718ede90ac295f5a675f1c29dcd9701978353700000000000000000000000000000000145746ce88686021a0635bf6f0aa2f77c48bdb364cf4ffa804a57f95bd69d24eead05fbee24021c1ef57e1c7c7b894b00000000000000000000000000000000010ec4795a0762b86f3b83de1198698af67fd1b1be3ddef48f35cf82bc96d886fbb4c75064f51a9cfc5f61630c95d0ad1000000000000000000000000000000001465e31f58892466b8ae4b76a239d9f8d1ecb1834886344013cd1df0be13591798868d224d38213a6d75b02a1fde0ff2f6787b565e8d71be6fdb0c97c4659389c800a2047f668b366214adc716f402d5000000000000000000000000000000000f39e731e6ddb7496448c912ae314e833d28208252c7f8e27bcf7eeaf1da6e2310538b4ef0d55401c6552e91fd70691600000000000000000000000000000000069d3612f924961f827497028737000513548ad8e104acee28f014e730d4752a583cb9a893e6169b71966a1c4a4ad2dc00000000000000000000000000000000090899907edcbd336bd4fdad0dd67c578ced4481a25b864b32aef920842689a2c23265277a6e1d4a1dc1b5047a9f79a000000000000000000000000000000000055ba64e2502baf68e46c759fca30247a080464eda2b32e7cfe539e545d6aac6dafb731c2c45749e50513979cecbeb5440ed91f6ceb2ccf87e4106a16227a3cd7b2821b4f3a6e629001f78ba1aa7346e00000000000000000000000000000000042f1c8b9fe81cdcabea047d0998a1354ce09d62a14f1d0e9d188e2f35f2e1845c2b090c5e157595b33108c67e6c184c0000000000000000000000000000000018e69d3564d4ccc0306e1e6b227b0f961aa9afcad59d4ee1737f980dc876609c59a4c6a3506f987467beba0764b857000000000000000000000000000000000012ce5883156588cfe0f4838f819f985b09f1eab40a5ea8e30fc5d70d029a01a4537641248f4c21dd203909e0170737c80000000000000000000000000000000002888eb9778a4045feb5899dda258657b9f41345731ba630fbbf186b3be4b58ffc7f48abb65b693b573a73f85440a7a7ae8ddfcdb4748981acb9b2037c017174a140f2457fb0148fe807fd194a9f7be500000000000000000000000000000000051982b46a819c74105cb36da871fb2415328a1531d155856f6551bd043eca62ddb61f24af429edda830fda31e22cd340000000000000000000000000000000006449e5bcdb5619aac542f6633ee3e06a4fd56a3e1ce4034efc608131ff6ead70ca63e70f494f519d5c577ae7119c8c200000000000000000000000000000000153f4f5dddd5801fbf7f88a735b9170d24d5b63861d50cde9644579dcff277cdb0d5fbfc3b3b819a1172de05afb9135b0000000000000000000000000000000010fdea84983fe6c08cdc4b4ccd462bae2ba791ab5209363b10b3ef342c9a5e92184e9d8be1419e3d88402bc05bad5fa21268803aeb58a2d57fc797358fb456d5cf96afecb1ee0d2b90782aa0d652b8c00000000000000000000000000000000009b011f793d9a939d916d058ffe91b58138820a646cc450389b3074ae3715d06ddec1075afecda71c65c7ca085210c740000000000000000000000000000000003d4d20f4b93c1e90a0a06bd534d8b4fd64e4c4aba77ae42cf4c5b2bd95f8b02ec4069ea246ff46404e6c9eac632fbac00000000000000000000000000000000051e88c3adfd4d6a02d3f03812362a6cfba3a6c69b9aeef75b51106cc7f1750293d61e31f0ea29b5d7aa56debb6d2aff00000000000000000000000000000000086d9c4ea6769cdf49ffbbf7351023b4aea640e8c90f9291222fd0b5984bca4d481bf7e10df921406a34804e6a09f99df9a8a4e5c65973b785c1e2637937de239bb0fde34b786dceea66f6bb12eb4169", + "Expected": "0000000000000000000000000000000007638fa4e8823dacb40ece440f8f1e57cc5c3851f94357a5325207db92380dd57a7c8709e4d00b670e8af1b77368285a0000000000000000000000000000000005b66a6e6b13ea0eb367a61ffe7c620d9edf5563cb4cc0cdfa68b99d9691cf9a40efd967c1e880238eec313eaf4c92ad0000000000000000000000000000000004f7156c69ea88a71a0af2922d1caca24055d40df058eef02bbf95d864156f62fb0e17d9fccd193840c36ad8449bb4f7000000000000000000000000000000000b8f46fd695c5d96d939d42c65c3b709d32f134710a67909dc4bb43d752521a8d4f0465d0590f30f06ce42bf5f8cac28", + "Name": "matter_g2_multiexp_5", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000010d48bf523f3909cf90aa58a9517ef5421f1212accd5e8a0f830aeb15a587e215ca9c340bb846b1d0474e43840b2af79000000000000000000000000000000000cc1a3976caf97b9d59f448f6d9f413eef8904f360c0cf912fe942b38d7fcc637a17038973a133608ae769d3e389b18a00000000000000000000000000000000069a6122c6f0ec68834b7617c755a7eb33a80a25acf95859da5ff03316447182f122d20d993b04e79b6fe859b7adf5a8000000000000000000000000000000000058c6f8c297524319bae6722e0a957d1ba0f75ee3a8aaf06148641c67925d15780e419a38ed7e07410e82769da74f2d070e7e2ae2751a1f71962726a31f77553c2da38f4fecda435b6e5459d5e833b400000000000000000000000000000000156ca5e80be8c8c03a5506ce9abd22a9d4958c372678c0caf6f1329898507dfcb1f06a9464cf080bc6881fa5b7df1ebe00000000000000000000000000000000088174d486b4086b931010da298a399e15b60a113e08f571e096d3a4e94b57b3a684711318796eeca9319119b201abb30000000000000000000000000000000000b96ff68505c088cc03a1c2dc363b05bc8544728a12b29569bed137780523123eb17e68f4632383c252d81bca0c5ca9000000000000000000000000000000000486fc6e5224c5fad56234c41856e60bee4a6c1046f673bf7d5c1bbb603b141fc91074da5f9d3d41b796a2ebcebd9e74d16aa883a20307f5436354bab32b4633e83178f33626af3edb14f82724b8e12500000000000000000000000000000000121fe97c62e068988ebff21d8129d52aa903afdbb62862c7fd99564d9ad72182ab1f3a1100223ae486cd76f6938e123f000000000000000000000000000000000968ddedb04f52140160061828b5f88dfd09aaf37df625ee6f66b9500d6608df31c7edf86296eccf8f9918b051a5e4df000000000000000000000000000000000b7491cb8f6252e3861d7160feb0afdd736d27886863ec0909a7cc711a9b71aace18b17a00a2999dd57ca1a74f148516000000000000000000000000000000000fdb280093ef45b12b694ca3390a865ee18e4c04b231e2c98cc28706d4cefaf4e654582ee03f34ecf1dfa9674489d553041390a2209b80f7c64d14965cc2f515d5fbdf37953f75c4a0203bf0d9fb674b0000000000000000000000000000000010d001a09cf5dc3276482185f26ef3f75d28cd6d2667eb08a7fe06c03b99f3b6c4d82390739b6867a314291cc642a8b2000000000000000000000000000000000587846a460b1f37c2e7f491f9a097b4e86e1943d9cd0999313f65627b3907f09b5d5ac1be376a313a959dd136f7e9b3000000000000000000000000000000000af439695556e86b102926d3b40e3e54cc84464e120de3b4e3c5541a6a5bca44151fb0594009663764c1824518b13f020000000000000000000000000000000003bfd9418c1e57269e222152d321b83ae090f216cb422956dd1fcc464f68526cb4a05cdaefc7bbe6e81d4ffe27d64db47cf23dee8d95d94046678f3bdb4b0ea3d4e3a1a2f07f582e2a98ad6eb7562cbf00000000000000000000000000000000196f78b64fcc342ba4f4edf34a3080ec950532a5de21a875dd061f09351def5ba3b85745a561e38117a14c20d33a14610000000000000000000000000000000003929c2bc55f323d57dc3529bcf6644e61c941b72b424d69969c1cde7a804d157045bbf6d5b79a3e6686509e11ecdac0000000000000000000000000000000000f6b659818510cde463c52cf00bd99da045c80af4d5cd0e55f9bdd81f34169fe869c519f37a98ff20c56db554469087600000000000000000000000000000000129709e97757724e765f6600c2b1928286efab55ec8d16876a2a3210bf9d31cc5425265d0576a2d5469cbd9a6c8c27c012adc8edb64db5bf0ed6724f3b54140ed6c81ca65ef9d1b38c8bca6a62bfd3c60000000000000000000000000000000009f5f167c9b61a0ef76415fcceff04f3fa57071c2d79f443ef8a7e6049cb1352f650ebd8f358904bb432d42772c29afd000000000000000000000000000000001524a875d73e03c53b92465bafca582479110611bac6a98fc7d76966e9781308a10cb202289c0776cf5c36515733ccf900000000000000000000000000000000002b1acace94a6fe196b217a9aff413fe0bcb55122ce9e344942843e5afba0d5f2cd0bba14c9c8cb9dd1c3e9024918fc0000000000000000000000000000000018e4f85c7663e596182603862adb559635fdf16ba35fbce7278680ea289f871bcf6755d85654b2a37ae77a37e77ba06ed1535bfcd68e8136808edf89967fbbf76b7f58d1a8ac95ebd4944b9e440f20b20000000000000000000000000000000018ee4b4855f866781f38a618c2fe4214c63034620ea5b72361079b0a5c2b2d6fb9ea73fa202db3a2678cf07219cde81100000000000000000000000000000000180870513afef93870ca64e2363fa1aa43a599db97f3b807ada1c25ae331c80b8ead5cd69b6f5a65a083606591de90ff0000000000000000000000000000000010afd546703baa35a9eabaeb45d301bd5be115557bbb4ff2a0e493668ee790e947eeafcaa923f62ca00b8e635994e39b000000000000000000000000000000001089996b218aacde4ccfca4d2f66d79fe161d962baaf2d6696e1a76ea40af4ae7195e8cf9f6417ffd054f20b65ddfb104c576996d90abde581afb58903cde4b9443eeb65e21b0d68c578e04c8f28f3d30000000000000000000000000000000011757ad74a3fb341c8eb6862978ab3fb5e8cfc8fdbda7d82756532a890d61919cce931872ff339843805e00d8c62ec4200000000000000000000000000000000060783a06e93e82cb08e5dc1aa31202ba11676511300e186ae8e45248b7fdec3b7d5b6849f8b79b8f78ad84f36218544000000000000000000000000000000000ecfd8ab18066fe3408fd20f2a4478156e9a19a09b58da76486c9f6a013d861960b6b99bf49cbecfa8c9d01d5615c1bc000000000000000000000000000000000b45709845d35d7b560745375df79fb95df15e85b96cc1b98cc832c74621339c609018d153bff93f2f5493a52b7326073c558cc615b1c61c9a42b8b0ab4668ffcfc9e95bbe958e72e7a5500058e6b0bd0000000000000000000000000000000003f9de90222619216852356052e9819d7c6e8ff91e0c6f1d8cec832770ed9001db4569fbf579ab16964d76ae7d1b89e900000000000000000000000000000000010b7cf8f0d283cc22942ed73c599115763dcfc1ddc98d87979fc3dce2f33ca3531cc2909d94f86736dda2a4e94a4f0c000000000000000000000000000000000b0aa4d947644cbc7df8d1927cdec66a68862e5a806e25554f27cc1a3701f429fc7097497ad0419e21cc403b472c8ea900000000000000000000000000000000146270ecb66e1763437b824f2ae122f72f20eb93fb30474691a0a192ceb932b1dee111fa44954075335ab360d31ee68d61301b4957a468e2817db5914ff102bc96460a2c5c15e78bd42884b1223fa71a000000000000000000000000000000000c977cb8de4b6e2e33d916f74eb4e42f089d22b54b59fac9aab0e4cafc8aa2b0f8c55d7251662b3499ea140e322dbbff00000000000000000000000000000000106944a9c2d2ecd08e109de29095f3460128bb751051a1f079acb58b6a60b0bb5f52e63d47b688f4a382a77c3b039eb5000000000000000000000000000000000d2f8be1c78995d54fbccab61f816b6ec52dd19aee6aeedc0e4bde2898b2d07c2925da0440a38c4c965a823fff10389f00000000000000000000000000000000183b5d15b243cc5d9584842ab1a0a1e01ad87268728d72aa8c0d7ec6e7069063a11fdd1525d2b30b35e4568da7c44c5495cd2686d24a5bdda0bcb118a2c0eb5ccfe411ec452e1beb3adbda7e93ea367c000000000000000000000000000000000f65ad4c21fddadcc49a8f7bc281d2b7901707f51a67122179fe97da46ea5e1bc6e70d68eb4eb6776307510a67e972620000000000000000000000000000000009003dc68cb0cdec4a502436718f066348f1957ae65ecca8d32c5fd776215cb9a098c0ffe56c92d79dd68d251f49f13e00000000000000000000000000000000038ecf0bb98ff2e84b388c58059ba0de0cff3d5881ecf01d668495ce81b76b00323c665ba88309af5552b7950cc8c08f000000000000000000000000000000001924aa0f460659f552458fb469467a2925fcb2420d4fa6249310456853be3d08bd5c37a3f0a9d6e94e434391d20cccedfb81d555d1e2df92cdb487a888fbedad976dce54b5c46a39893edeac21a12d6e00000000000000000000000000000000189c3ee691387fbbcffdb147c880218c3e5c0bf78c44461ac1bd3ecd5d4b85225e46cdb068049607fedfcca14882e289000000000000000000000000000000000260efc08531083db2839d1413c90968e87d79bc1a2c730f0020e40beb92e84b73ef43e80f7c61e1a30c0cee11b3cb370000000000000000000000000000000005c852ca0aae2c575c65ef18b624f50a32c007d299f24a3ec6cacbcef1d6e3bdba9650fd7d639bdc60a3e107ee9c013c000000000000000000000000000000000321c01a9de69d6b89db4ed88dd48261ee28facc5e26511fb2833fa45edfb58051c8c3ce9501e8b4c3cab9c456705889bfeed84bd95fb955d1b1045c059ffd051324dc8966e504164e54f76f02eb1b8600000000000000000000000000000000183d50635b22e4d620130e0d4008e3bfffae5dadd7e34f4496899ca54eb4d9e3e95c54ae1d9664609c58d02ee5eff65500000000000000000000000000000000029e3b4496a379464302b1476a4549db371f5d6721704b1d6bd35e2344d7679f8a61a0c3b12f287fd86fd247f9652cea0000000000000000000000000000000012c6a3793fd23e955708f5aeb4d6efb670d25a38a67813ecc72f899cd5f926ab7ef198bf6d591328383aaf54f756c66b000000000000000000000000000000001914d3e4b6ea96bb91333468fe8f3bb74636e9a4f2ed198e9ff01b49ba02791d5bd63224f6a38538aceb777168bef688e3b308b95f6d496e6d5b910b6aabef8d9f868471653e8254ab4d49d593180d250000000000000000000000000000000007457f2601621a99050d8993244f026b9a62ff7055b325e6f1edd1cf54065785f003cf7c8a4bb1f7bdf14e220e490ada000000000000000000000000000000000928eb76b428dde37546a27f3d77605c293738f448fbdd6d618747b0de04004aa4419cc5601600419c6e1d470c15982e0000000000000000000000000000000008074e9f5473492dd2e536f7b305be4e5c564cfc9218934d03dde6dc5118064ebaa5c26fdd1123a9c31336c37c1234900000000000000000000000000000000002bba1f9b7da6abd2b322c8f11c749b2a284552eab25a77d21b38b028da477a3ffec1901a015e81fe2893576a41e4c0bd4ea92e0e776be341c8444d4040ec121a2847256c5c9bc918adb28618548b0480000000000000000000000000000000003760958eac45397eca1a1d951a80265a728dc3c584f7dae111e7ce04248885321b69b334b00cdb0334a362676c2d32f000000000000000000000000000000001031e4a63129ec40da5fe9dacfe148a67662eaa00e1fd5c30336462371c167348a10e50f4dc18469a1a6b76485f77e12000000000000000000000000000000001412dbf993c557323426b486f18a91d16b4baa2c497b30fb332a710ac901c96d46a577d04ea87afb08258aa6d204a1c9000000000000000000000000000000000da015ca09ac0c3245c090f39852218f46fea62198fba35ebc4a7f14887943c3bd1bbbfbfa300611e45f419b33988e404c07f5188e4c6270a7e9e2f551683c4f9dc943ffc7ec279d15816a7f4910b8d30000000000000000000000000000000015c9121f72e2425cc8aa4c878907628dfe75a903b7f756b9e13728372cba598859d20a92a8297d95e1fbe25fd1cd968300000000000000000000000000000000025a3faebfa53918efa733949f914be08b791794bd4963f0c3fd78df48b14ad214374b08299327575c0731b54eafed76000000000000000000000000000000000771782ecd9980da521618af2f9eb55d91d67b20ba615c7b3cb1a48d483ca405fe99a1cdd17e4dc7aeffce586987d41900000000000000000000000000000000136000da90a76d538f336608ce877be943025b4c8bf15880ea9c1c001c20c954292d362dac9783b7bf66b8d51ddaf0f2a819a0438efd7ec0c1e3eea07ba201af6a832fecec818adbb781ad0c23e81dae", + "Expected": "0000000000000000000000000000000014cb24001bd933b1d5866cc3de9f4b8479fe23e4fc26dd210f9d06e7a05449b9f5ac4e2f48fb847599f625824336bf1e00000000000000000000000000000000033fdb2e899427f1cb9757022c5b614f08c64b53583486148b7431311a6f15aea3b968913fd5f3e9b624705351074be600000000000000000000000000000000035420be9c7ae3203d0dec61ecea70e22e62f50368be870e74f9a7349453647a7f61d2a42cec6522164cca0c7081d4de000000000000000000000000000000000fea43388e9f6e31d419c7f9fbb9839b4cec04163a7b401d8f7de73a4560fbfef4e272f1db9c9d5b37693378f139452a", + "Name": "matter_g2_multiexp_6", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000039dc2b60389f6c893c44072f4db23e7df4c2f299d6b70b70784d9370d9ff8e5413872c227074d429db999d30dc9499a000000000000000000000000000000001702273db356abe7a3f91a9fe4bf56584f13de4069a91daa6c0b552089bef60da98d32c615aa5610842dd8a507f9477c00000000000000000000000000000000095285e8c508ff12da79e16e0391dadbe9a823c586a049e729596864c3cae117305c05f009f9e8ac032abaec8a63f8de00000000000000000000000000000000078fc70e926decf7aa4c2e4b395e88f367757dc47a4cedcd5e632c456a4c160393837196af474948ce6ad53f830ce8aeb15af019ea2de662bf187930caea19d0aa07a74b49fa7d1819a539e06e4c69ff000000000000000000000000000000000cc3cb5e7b033cff3e5cb01ba29ce8e9f4a93e836ddea7d417f7b07ba8aa71a0efae2e1d7a8ec70bdff12d84d229245200000000000000000000000000000000019ce3c830505324b9bc7cda1fbb328150d71310f06a8424dba861d67a7bc0428beaaf697646d22cae9e00477cc8066f000000000000000000000000000000000f6ff67efefa5636b104a0351c90fd3e89a32b8a9beb0d123d3d6ae42eb5e8bbc19c7a972e27762daf852259c65fce6f0000000000000000000000000000000018d98c43fe5b13b701749f4a5dc25f0e713d241d573639fcc73429226bb131d448283338a909670066045c65789bf9e7064a6af51c1d499c4c28556ad1255af7467bc750bf2db2842d626647bdb3346100000000000000000000000000000000003cf82958d68429503265dcc7d88a3763cca32baefe3c8d32564cf30e8e6b8255d4a9f6a76bce1da473b50287deda74000000000000000000000000000000000bfa9cde6c06b2a2ff8f877ca90b3827d0aa0408c4ccbed23ad461433dad71017d4dd387f49c5febdeafa17d06ba784e000000000000000000000000000000001770fe70513533d91c83449ea52964cd8b449aa81f71e71995db5b19ceddef18e2919439c80e10086e670be669696e4f00000000000000000000000000000000194c20491c9d5ed827cd9d370b9bbec55e4a7b1c34ddd1d80201e7019d9487a747b4fa57b480dbdd09af73aa4f5fa0e9a3daea5a083af43711fcb09282b66882ae5b5b8e1714e9186f33ac0dfe48b7ca000000000000000000000000000000000a79d9e0ff43249ff54526c5e1cd55a9bce93adf272508871326c933d526602dc9dae5b6f129a0f1c38139ed1c39be5c000000000000000000000000000000001458b554e0387c1ddb9dee9f4e9fba9c81c15807f496442f4b7210267912b9439a19f95dc80a1e09a0e5cfe750f43c8800000000000000000000000000000000012c06b19ed4e8d5d1b9fed56bc5bdaa3bf0112db997e33aa14899d53e1bddd6aa91dce7e9d25473b66b8578d398981f0000000000000000000000000000000015369b2228e728894f2fd7c2d8c41ac3550da4f297de445cc0f0ef7134c478f526987643cb5408a0bbb79f5f983c085ebd682acd154f6e16a583ca4968d28471653375ef79df078b17b2cd9634258dc10000000000000000000000000000000016649a8231407074af5ffa93f9db5a2ddce8785be8ee77149602d6afa24ab30b26d2f74bdb5f7464333924a817e242e50000000000000000000000000000000001b990f5ed0b23e113042ff004236646c6eacacd99d1d73fe0c3d9351ce8d622327e827b2c0556802c5657f8f06062a4000000000000000000000000000000000f002a2a5ca90285f9b2fd429721c2daffcae5fe48c571ebacaf475606f96cc8350ce88a850ed75e5aae59d445249bf00000000000000000000000000000000015157fe1a767dabc185a8dc8fea3cb208fd995ecd9acab762638faa987f8367ff7c1a60b657be6e9461acc9df16381e5562223d3fae1d303a01ee4642fb4cc70f21937ba7fe377260fe82262a8455a7700000000000000000000000000000000073884ffbe6deff99cb4b0ae1c0e91e2f4a8c2c7296339b1d7e117d5d47ab055743d643155680740befb379a1dcab666000000000000000000000000000000001995bdc23991dd4cbd973e915a16691fb860490bb54011384c553dd14afc37fe673d13950c1e7eaa29c324fd9304624c0000000000000000000000000000000012197a19a498cd94ecbb3a409337b04e76e1a52715c40203add20eb80f7eac66f3386242d51bea34ea016d778248836f00000000000000000000000000000000101069ff0af2ac4dc7a5bf7bf7b56d82a310d67cebc41a9abf1e1af489e1acef3e726fe9571b4382777573712663e26caf1d0fdab6185e1c3f9f621ddc169ba92584db0b40b6ace7ed563eee0090629f000000000000000000000000000000000849b88e7ff52d8136a120f924b20b45ea9ae654a0fa037b62f3c275f0661091038a4c1d6ce7d50512e628b6b397c9f6000000000000000000000000000000000e50e82e9b368f2e316d41febab6b0f626d6588b7217b4e28eedbdf50a4abc9039be9e66c97790d12cdedc90873993e2000000000000000000000000000000000bc5d2bdf06fda1e1d1f5c5eaa7988dfdd790bf4d952f5d3a532bb59edf619dafcbc29274fd3661a35a3f15933b1849300000000000000000000000000000000162e5ce45499e620d0977fa26a291a8e75943c4b5a2a80be395ac9b89767ea5a06606d6b75ee4c8a286d2ea5a197baa5e910487c91f3839d5961f02a67f3b357206e406ba207dde969498e40d4a26e880000000000000000000000000000000005c11afc970544b96fc1a4cbb27259e19b5fd588d1be1c8f19eb4f111882292a463c951521388cb8cb743e5a4a1b57cb00000000000000000000000000000000013dc433dadc122376b75fedc923386a7ba5a363678fcf9edf165a50e160dadcc151b6f402648193d9ef960f5e401030000000000000000000000000000000001893af155aca343bc29989ec2b5a583d020a7558c7663accf6f3e40d0a8eb98ac548e933eb8e2d5fe3550927acc2ed4900000000000000000000000000000000043a79bcbaf07bffe6c6890d95c7e74d127446bdea51a0ba3adb164ea39684bb3ac552020ca28b86e34692c9b36f4384396d32c2c9ef685120995d2244756bd45591618597306193422f3b5df4b075d2000000000000000000000000000000000e6946ddc8a9d73e5b140af80cc91b31b9a226a945a9574f0629566f7ee7650730c5ed758cc30442770ed1602b84175c000000000000000000000000000000000da0abb9f5bfcad73b3f24903e9ef887c660447332e5457e4a5764f6628c04d6fe903679b8dc8bb3aaacde410812286a000000000000000000000000000000000656016c01d3405dce9f7d40e47976bc8a84abc370e7e42849dd0bd93ef1da0bc88e428efea43dfea37dd834cf246d69000000000000000000000000000000001939b2c92c8299d7ec1dbeb9f291c5e1c9481e10df10e6ba18ae695a780aec5a185ed4c7e82dc2bb5af87a74552c2ea32087e21d775fbc2c20dda715e46c9c4970394e40e991c78ecc13a2a5d0b0f30f0000000000000000000000000000000000942901572722e5005a9ef5f948c8cd6f557be8d114d2810d3cca29933a94de3c7658e7e28675c2a49f138d9c98c524000000000000000000000000000000001908e8b815e95ec07a90861ce53f545f0cd44aacc47df40c24d6cbc61e7b28fb91cfb1cb3c67b6c5b38c34fcb2ca35710000000000000000000000000000000017bad3616d8e510e325d9166790239c8c817c68ba7fb937fd5fb70a4219265edf6625b52ff26f0a34c0bf481c482b2c600000000000000000000000000000000023ff8a50a9c0e9ee829ec81972386ea012df5e8476d8c342df6b98fa1faa1382ae921c2f1018a918868672450355c44f44043002a94560d725da2ac44f30cc5f14f52dff5671c6689efebd803b1df7a0000000000000000000000000000000014675ab3efd44bffae321791e6fb35a24b9c07405d9985c685795df2db183ee9dadf18c76cf4095e1e0695dc2c08c4c4000000000000000000000000000000000835f2cf09647061ced2bdf4211bdaea408148100f864f47ff76c0c63a43e44e8ddd9e01709b6ad129bd574d71a1a63c000000000000000000000000000000001017eaeaa6eba76923ff27e5848e5f3b09e7b2b9d55b2cb7068f39defa8628d1c8cedcbb0e1cb5810febc4ccea712b7100000000000000000000000000000000054c873449c738383e9fc2f0f74a6334904171fdb704f5ac35a483ba19a8f661187d36fb35014af9ecf88225466c86e48624c83d846ad2e53f3f8ff5ffd3fca8723e6cd431e89ca29a4d662e82004b60000000000000000000000000000000000439ae88636244d5e09607960fb033e4217343899d044b21e61335425b94a5067c941e83e5a77f4b0690e1de037325090000000000000000000000000000000003a67653818cece3ff0390d097f1bfbea9ba954a85710f5c24d1de1893f25f2863991fb9f330e60cad725708e70384b4000000000000000000000000000000000243394c3459a3af236189ec6155418c1916b854a20b980ca1044b48e23b725dab7c60a48e89f642423c805c117e64870000000000000000000000000000000004c8c9fd9f278dfe9f5e24e0f5b42699bb9751b56520827afc2fae8393c690a63f10e92f77c4a10b0c161408da9bf505b2b2a8a42887ca6dff5b5364d88962068496bee79cbe74de0e8a06209feb38320000000000000000000000000000000011ba67024503301ec72bfad101a48708e3521c8a23c6bf2994078690041cf7eb75675cf5f20c8e82d11145e31751a2300000000000000000000000000000000008ace953ed2eaef19595cc7c9fb1806d26cbf1e888075e3985b28f8d93b9c0b4c820c8e8b50fd4e0b23923d428da3efa00000000000000000000000000000000054ee6f7247296e0748d0b52148a97b930e69991a242767d80bd6434d42b0865a64d3ce60953fd2631aef873d8b2acf3000000000000000000000000000000000077748b724301a8bc48efd1cd66086e727e9872e4efdaf55ba90ad1bed7e229a9cfb79013333b50efb46090ac0bdab488ecb5976f63a38d7f3d8c8ec441b705563c5e3d899870ab5d2ff84467fffefb0000000000000000000000000000000005008a1d62dad51132ad38a226e8abd7421392414acda61111c728713a2ece284b04d75c2bc58d355bb1d3061415010200000000000000000000000000000000189725b7fc48b8a648237021e9a2334247f1cf18ca50008b813978db01667ba08f00b23b3aa0e015f549ff2d5e5c535f0000000000000000000000000000000010483cf2310f64cf0baf556cb2f2828a1c15922547bec03cdb182a316aa86b5473f03373cf7e59a9a78f73193c1caf520000000000000000000000000000000007f635394301441bdc57dd1f4f97656f4218ebb139c13a17e12839091e2e81327f3353c56880c608de824a07a17b2bdd951f4960d6614b098249eb9420077ea5ad11e38d1694f4df33719d1127338f44000000000000000000000000000000000daf4090a229a1ce946064cda1c4b19c88100c8785c69f2eeec3aed12065787ab0abd797ceed07617d55a9c70ac3020c0000000000000000000000000000000011d77fc28355f61037cae3a8342bdf8d11e963495ba3b5d67055f790b1fd632b23565cad77a3d9968d364e4e2a553c9d000000000000000000000000000000001038d7e8fedea873c864b79d1cf8045485299a2bd4d26c5ab5c8d4a073e2c3fcb38cb230dc6ab7e8e228cabc6ed97da50000000000000000000000000000000009de9209ed14d62625ffbf770e8c528594aeddcaf1aaeedb4f3ca973e7b9f9f1a40370cc74b154f3bc641665d8e4d96b7056c7d93d8453be369831dc0575df6438db488780d518a53d19b8f5d22d506a000000000000000000000000000000000a6b0dc04591cbbb1b82a059e08b488fd66edca0f2d264c352f81cb6ec45e50f0af16917fa4727ee9888f84b6c888c60000000000000000000000000000000001369ae16bb0743f65cdfc8082dbe0d588cf8aa5406a095c3deefc27eb3ed462dda9dd4921cde6a1d878a805cd144515800000000000000000000000000000000124e08d4de6e831229005663df4e4bd5bb7af56dfb13244c50410e6d0aea420ba19208bf1a774207e0e0170ad3a9b4f60000000000000000000000000000000011b2973743034a2c362281b11a1ac1c89f59ace09f0a53afb0c2ceb061726c7aaefe274f6dc04e5d0dea2b687a00609a8aa982de1583c25307e9e2c8cf2469a0b1076c6be2fbf12caa8584f34988221a", + "Expected": "00000000000000000000000000000000136ff52e440da609b6b73aa838f2eb9791221291b7b14d902458aa7aa9e37114c573edbe8cef7a98dd07275a8c3fd650000000000000000000000000000000000ba625eb47be09ac8cd1e2ec9015640f416af0e3e0e79d39ccac600ea08bdae7a2bc9144f13168a8cec03ce66b9daadb00000000000000000000000000000000095c51e81b5881b009b28006286c704ce3b002e4ca50ac8ea8e574d1e9665a5b1efdd60568d4a4a656ca6a2d1750a39900000000000000000000000000000000143c0c4b3b720fcd0b044a6f420961e2b7eb5f9f1b0d200de56ca8b02709d819f47f0a6ea7d6b49c4f30520586a45616", + "Name": "matter_g2_multiexp_7", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000da4cf56fdbaa9004bf8ffa12d5cfb3f296ba5262dab079c91bdbadd6e41ee5f89912bffd5df1643146bce1f0e021b3d00000000000000000000000000000000150227356e48f29443a0ab4536e7a2f86f9e63840e23bbf1b091a59f52c27978bd6a15b29b105132298de45e51134da50000000000000000000000000000000017f5271c97d84f55f8b7ee0d73267bb69cdc7565c470a4b531f9dcd29596eaedf46e61bd79e71e5ade7d000c1c1d81bc000000000000000000000000000000001322812590e6c22bd90511ed72553c1cdb0ba83487b00e3adcb01a9abb438f365ca23fae9ee4a953544253696ddb0bf1a18ca15f0d931619363f5ee56bd7657b2298f228cae8d185c9d062910193e9c40000000000000000000000000000000007c59f94693320b01b56b36f8d1c39fc9e01bad289577738e648771d8940778276cdbfd59f07926e516fcebb70592de0000000000000000000000000000000000aa71d6dcb0b225526eb92b79891ef920634a007b87986fc0f776f85195ad7ec2d84b9bc684add947df8ff42c33b034d000000000000000000000000000000001362cbd6cca3d5c1ec68928be38aca5de1f224e7cd4f5c3ab1c2cd589bbd7c31022d4adc51720bedf2580d2acfa0f06400000000000000000000000000000000162bf0f38e19ddca9aaa370f988be9b35461d2a0f46143e8663f1fa549d0afa1596f029cf2f800b027b90d1eda6ae8a2b54274927eb29fea0cdc464271c918826d5249b2180a52a5020480d1020c9795000000000000000000000000000000000eb12a92fe65f79c646ba508fa615d09d86e582c3337ae16f66cd3bd74a9caa9dc17defb4b4e67ad62f0665c9ad1b6cf00000000000000000000000000000000058b6ce2582c46c0fc108a37e1d2713ff21ec8b1d8c18da0e69f0dfec7f2f327043e174e16d9d64f9ed4d3818a302bea00000000000000000000000000000000068192bd2ebc0a23092bb98c23f5792e179913c4ff1f23eb27296a77e83729803764b8db3b7ba4fe154ca467475eefb2000000000000000000000000000000000482b16e876aa90da6da35e0d7495a04d5b0a1d084c61821f23e1ad63cb1e66ef5975a3cef9ecdf2e696e9d9b50bf9b65849bffc842c21277be88dfae0040c54b072ff526731947cbec0cfe963f2d0dd000000000000000000000000000000000b712fffce3e63362bcc246da566a14139a3d12807ba83ab3520b0aa3aa20cecd5718e2b7e00f24e6fa705315bc2175800000000000000000000000000000000057a66fb12f27e4a5268e56805fe2b61b5ef019b31fcdd861e2b0beecdffe1a3a69e8d193815f97740324aaa40ce34a8000000000000000000000000000000001080a9e1133f37288dbc3835e45b6611fe84ec4790e23e5ff84a2f72bfa2837f55cae9177e5a3a918adde777b7298a9200000000000000000000000000000000142dcaefd73d7f6342e87fff8c6cd161389b6049fa077f35076eadd2b4aa66f3a1819bf8272cac1c28cc02bb6440dc42aeff769da1b62fde321d46c66f8ee7f2129446d805ab7f7bd586268de8f57c4300000000000000000000000000000000034c0f8249d6aefe4cdbf84d151ea9f84add42ade087048bbbf9de4a412cc805dd9b608fdcfa34fa224066b5f06d18630000000000000000000000000000000009e235ce5eb936bae00d3fecead8859e6d909da3d57bbe0a8aefaa5efdc94969a1cb2e12642c0099bca4e7bbf9833469000000000000000000000000000000000b6fbab498c2706f0efdb4effaf79218cf4b652a5205eabeb84f05a060da8cd18c8154a3d37594485ba50a8228f27f6800000000000000000000000000000000130ab70e17dc73f773df99cbe3f978bcd3fcb92a8226a1450239d209cc6969e2cecdc0bf3cbbe9a9c1de072bffbccaa952c9e56cfe957b924c9c0294e1c1f12474331c662c8e86288c97e6a8b8b5b20200000000000000000000000000000000031a2c10e95b841ecfcbddee4b458385e5650dec9a2d1e50216d9fc261a9829eb5fe894e47f171c8fd2f4d5d89771341000000000000000000000000000000001378471c7f770672ee82b70fc87af5ccacdf8995df9ce48aa9fc2f638105a2fdfa48b615970665ae4869f1e2dc7988e8000000000000000000000000000000001969517c503df5560628555a8780138e4c340d9d49d8fac4a8a11c894d283d49fd06aa81e9f0db8f015d9372762dad75000000000000000000000000000000000f5c2d9b7fc33167a6e9b5a5fb8c5d16ca009282edc05cbc8a048b835b16ba33515c226174d6ce5f9836581611ab403bdecec569d223c724d162250ed1d074ed9f4080aaae3f44b77df05292be48ebd90000000000000000000000000000000000a6a32f2006c4b7804e99011d934ac91b1b3fa6f5d02c574cecd6570bde1e998f135449dfc148aaa8fb8757d0a7299b00000000000000000000000000000000198beb461b59f57b85d858b730fcf853d967a1592e5e5787fd81c6a3d9d9b40c1cd7912cae21a47aaf78df5540604cb4000000000000000000000000000000000955701e84721866683b4eaba82c2df8a89bc906fb0a3cde565d314cd7278b0c56936205cc8ada10b03e69b93c48067b0000000000000000000000000000000004740253653a0d6cb15c76e145dc0b1f811bdc964f7d595b6027bb012b42409deaa8da83e6ddc3f0f7b4b237eb62b537915ac9453b831c41becd3c1f412cdf5379e9cd5c80bc6df92ecfc5005356d2aa000000000000000000000000000000000f88e1e30674934bf1062ac619f1834f35f804a958e82121255f8087ae08f10525e740ee53d7514e0ee7c49e324513c700000000000000000000000000000000019d554645696b7beae881ef62297283c5b68ad3fa9a84a47c29cb53449d33d6ee7a5a3cb83b6acb75cd41ac3f52fec40000000000000000000000000000000004b32776966e52e8a72c88a689d6c56833296d384e2059d8f615ccd3616972074987f839b4689d5610a88addcd836d930000000000000000000000000000000000fd4d21b00d81ec993d2350f1fe360576fa983754a7159c2e81024a00931d84e419e8b5231ba8cf8f05a0ee6ccea7e558fa60bc7cff4edde18301af2348faa69ed4f31d437decb7d4fe51142d179e6000000000000000000000000000000000177830cf34186191fa295b7f279bc819d8a53452e2114dbfe709971584ec7a2da7453aae3e64f4b14c261e22314027c3000000000000000000000000000000000ebf2aac35fe070403a4b7a5c2f102c67300bfd68af7863b45185b37ade1bc53d46772062189f348647e74c77caca4a600000000000000000000000000000000128dc7846b2dc5c453ba5fe4675d0c22f4d7089624ede05b0910c34ae623d4671979fd73455b35b61a57c51fe2895adf0000000000000000000000000000000008e33a3c3735be035b550613c712b220595a83c1953b24b3efd38c5913fc23df823e00ae5a1c2ea8a8eebbb93c5c721dc29be0b271d4e22d39e9e06db9e50845515880f30c5bfac80bca39a2d8d61ea0000000000000000000000000000000000a060a957a8da4384e3436110657110653685bb621c32810b6516c690a00c13e37f70185958beb0ed886aae5cdd611a7000000000000000000000000000000000b5afbc85e274049985eac230b2aede7b2df1485c9539a4a4eb6aea406d0f6515ad8bbece7155fb0dfb2123919fb8af9000000000000000000000000000000000afa722987390440a33d5103445dcef42cc4a3c461daa076d56fd38e0b220016ed2bb8e99b9a8da4af96b7da64ba90950000000000000000000000000000000013ea6b8d327191e53bc71fe43fda305a4a0584cad04048afc0480f179955cb27f2ac8791d847036470ffeb47aae36877dc8c2e971a3a4b9909dcc5cc6a0de50286294ee15f441521e0f1d2c3ad3a76e900000000000000000000000000000000032b490f795ac3242b8c7185c9e19f0440ecee3a65263dd4e4c9a431571deb7339bc6e2d73ec43750f6f027bcfd674c400000000000000000000000000000000076ab4ab3e8ed6ea3b882fde5cacb3bd094567288699e11f368c3f60f4283c5bcee7b4c5debeac541ead983f5936d9f80000000000000000000000000000000012aa2060e421f4f4249e83ca0ae1752dfa2b7ca958821841a18f05071a35fb9c1448619bd96f8a7adb2202d3ffda8eb30000000000000000000000000000000008b24f29ee7571f31ff86574e654a5d849acbe92653ae1a1d2baf4c9ca6e67da4937bfda51a70931a6e60d90162efb4f21c9ae0132a4886820115e71e280d33378a04344f635c769fffe91e89fa7ea47000000000000000000000000000000000c8b41e5c47babd6ea113c0ad9f45a75d1ef6bd313b768ac01e6f581ef6630ada623c1a27d4aadf543af4055de7f6b73000000000000000000000000000000000a0f73af06f8f0115bf17f7c5db0a6bdea77a8e3d8fd0b52b0d4e2c558f1331f655dc272c86d98bf166b532ec8e45285000000000000000000000000000000000499b55964186bcc6986e7744c52babf47e274e47a202abf6f816bc748baf846df2b5ced2a5f61fbb0aa2047bbaf82db000000000000000000000000000000000d6c2a9a3fa5d0524f772cca2c7e72a5f2da1a6a1b9550997e7a6cac5b6b6c37693a01d30bebe4b9c742b63bd31487a1e1067c01d5565d0f387516d9721f7f4e5253d5af8353db4a55500e20a95f3c9600000000000000000000000000000000143220e1cd08ffaa6db4795ed4aa35f3b12cce724fcad005367328972f2364f34096e32f1f1cb7a4287ab636d0030322000000000000000000000000000000000f2de47a37a55edbb75ff0bcc446611d690d7f9efdd09ca1ebb6f1d64a330bed420bcc85aed8b95316fcac3aa7d1f2230000000000000000000000000000000016afb044b8b8c64547e000f80b25576aa329a4319dcd4f1bbe15d12e6f3bbdddbb52140e6297c637311ef0c7a31cafab0000000000000000000000000000000019e6803c07fbaa075093f6a69f9dde05ba3d3f58e67389d7f096e56df49f8270008ed422b64fcdadf7cbbc8334037682a23bf766a1e1c068e6e8e4b60391583ac197ade53caf0f8a43c53d1bae9f13e500000000000000000000000000000000134125416c7908cb4454ce6aadb30df46042ef2a6b4b69b19fafcb9ebafe8b5579046725590266cfd10fa26e1b5ff3dc00000000000000000000000000000000073f4147cce24e13b9eefad7c69b457acf126bf278a58a26a7c7c6b482edea6dca9725d7e5e4138b4ec81bc2505ce2e60000000000000000000000000000000006125caac1061cd6c556f4cfc122df8e949622a46ca707b48ef088ee5623df058bada1bc0cce1399f0be1ee86225f13000000000000000000000000000000000146e398c161e29c90c8a4fc44bfd5b3dba6f9e80ead561fa3d91ca5f416e06318dddcfe5147ab5def858fb025a1562352c505d4fd8287a897e01517ddbd7d7ea9d26ae4f58fbca172e5265e2b62858b6000000000000000000000000000000000944942effc77ad02c5ddb052acf86f3a9dc4127dd032181450295464b49ac1dc0047790acb378221fbeebd4c92886820000000000000000000000000000000018e1d201b38d88665696ee6cef11fb19f7daa7f11c5a5ccc73e6b66ac7b89df8437c9f07132ec8b69e13f63424ad694c000000000000000000000000000000001463117fdcf17f28956a42677b3ff431cc17ccbde067b91ecd6fae51e1e24ba8d594ea368d041656022611ad3ed44a6e0000000000000000000000000000000009715cc5add17395b7ddbcb961269fc5d4739d799fe9554b3c9e9f59c895ca5df8ec75bda05cbef3e6a165f7987e78662908006c06ceb9188651c59d434988cb5b51a5a75772ba71875444c65ddf0f4f00000000000000000000000000000000007c07cf1ac9b8b28e3d2f1f4ce22b8ee46e99914ba20c7362c679559a1618a906c6ea65c475ebbeca4947019cb6fbec0000000000000000000000000000000008b29f72cda71e0bc2246ead57b2f758b741b9232d87be75331275a5cd63afc9aa98b0e42c1b82cc258e93c97e596a81000000000000000000000000000000001512548a4bbd537a4d5baf673fb76ea7e35b2977216e7b29a6375e1f92049d7b7d5fd5d8b4ae6191f5592b738e149a5f000000000000000000000000000000000cc9d646428135296919808c6ac10c142e769bf71bc1490196dfdd4e1fc7b84e58155bfdbe77a9e684622ffd83e97ad3e8e8724c80f3527de5f0b2b98ecdf0b8d0471e63c0763a89da8a21a70dbf8399", + "Expected": "000000000000000000000000000000000ae9da7d12d0a03cca3b41ad869f762784cacb988eac7ce904ec9ff47824e058e2e211e2285f9fe2aed0b4385949b4540000000000000000000000000000000005b0c873d20f7be1410d39885ce4f79884eb6ae2b2f27510d6f6874dacf2a66c64e56b7aacac61ec88261624936e695700000000000000000000000000000000076c6076175ad748dd68fee64431e5e4ad013797de4528287e7226c3df90233799ed5c8b36848c1a2e1c02591a013d270000000000000000000000000000000001f7f6972121d38ee2d10c621a38448ed12271f7e0e9e4567fe1b5fcb469c7906196fe92c66c37f8c5abc91160fea8ae", + "Name": "matter_g2_multiexp_8", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000139cbf360b10e59c20dd4155af2023d5dfe0681c62351dd541cbed41b6a328aa44b862d1985b132a4d4ca61c95b61ebf0000000000000000000000000000000004af6b5a0f7a02d5c93304be0d31959bb4b1a7a5838dc3f9cf50180c4eaf3d32e68c006263d75f9735c8f0b5f811d3cb000000000000000000000000000000001644937e5ff3b8d2005a2f3b0984917837d44412362a121be481526173a4c61e20d61076aa10b4072b79743c5f7f4c4f0000000000000000000000000000000009bd399b55a59550dd876f35e54a5803058228bd6ab6c9a66e438cae473c63816c96bdf378ad426a236b58b90e737831e14282bc687a00264b4e4678ff238d5205f6b6fcc10040d9b4393e93f76297a8000000000000000000000000000000000f343e5118d7dc3a38e9975a5f40084ee5f2305e45a8aed28ef105f76345d9f5646b4f3924b92978846b4e605b78fdf400000000000000000000000000000000017e61a2ecf9b3403b43f5a10a97cf5088b4f98e5a4513b0912ea7ecef44e6809f10dee60367cf2fe3e903dd68c2a97c00000000000000000000000000000000039f37f414338cab0e12f99b2aa1e3c02cbdee3406d1bd17c359ba899b7cdcff605f894530895aecb469f41628c3da120000000000000000000000000000000001b78bf69f1b7168d735fb4b7b135fe70db79f50e792eedea23f83cee9b48e092536c2ed146c7499cf047c5b4f0a08735307650d6cfc681508fc7b8dcb5291837582eba6588132f46ab8fba674a1f5af000000000000000000000000000000001342346f1b553e29e661c9f6c0a24d8f788db98262d6af86af55d313a37eeabed1183e367ee3d83faa3f284b260e786c000000000000000000000000000000000960c8af3f7e6587cf83baae447491e73cf41e637e1efd730e3acd9793717e57b85530584942e7a030bad3b91a76996300000000000000000000000000000000166daca4ee2cb9516b5178cefef0553115dec8157f6194d24d191cfe6340406071883c89246c0cd5f89bbd5d0f1ee15b00000000000000000000000000000000187f668086b9b6307899d301bdbfec915cf24ac0be10d6897b0677e4f1de6a241f3dfb19225644858be0941530e67d0f7d6a25511ba63f0b7ebd2189cfc4c551083ac92b144e30dd81d27e59dd86e22600000000000000000000000000000000032c3783e701bcb651aef40c91682eda03f9d90f252740612c85a5727f8bcc41a886b328d5ce787031c08ace235ff465000000000000000000000000000000000b0eca06f9fb69ebb46d0af56d3d934b333514d7f31208b4ee2fb92009e6041749028a78246a0adc324034a94503e80d0000000000000000000000000000000019eb24ed35f6c7ae53047814cab14d51ae6cf336d140a17e794d5cf18450b7fac3e6f990e12d340291459197bd353861000000000000000000000000000000001983a596485e657deaedf01614dcd5f4ec515c0050e8068ea02c9833d0b165c0f467107a50da0d8cd43bfcb59db6e710eac8e5cf13de6db37982390c8b6b0474795f479584960748b7ffed881285e2df0000000000000000000000000000000002f1c29ffdf7bf20fb8a13363393d5f1cca5dd9af82888f0102030fdda641abd5532ffaa2669c0c4159a989cef1c5bdb000000000000000000000000000000000bd548079899d49cd368bf5c246aa168fc8c777bb84a7930258502c8424a4b68e1ab20dc9ef39c307e52bcafadb0c8e100000000000000000000000000000000070c18918f037d5fa1aa005e2c80ce6a80b4b24d33ce72a2bd824f9a061af1db236f04d6041314310b31b805b8a674800000000000000000000000000000000014422b173840da655aac6ea4b7a04313d5d0675bcd565258c73039f879176e51ec0c8a9deba9c78c33179a5ba54492012c134652c27da0a0272b0783551ae44db6bf592ff299b48c50c550367d470b5b000000000000000000000000000000000a1be8e39a47dbe0bd19b8108a5bdac582e1d11ef7fe28df1f12da52924e734e1d591e8e33ec20c6d5af5bc8c1161fca000000000000000000000000000000000eaa7a7cec93b8d5eb933103b52a35b3d58214feb8e2de0bba3a0e57e7993a9df0dcf8089142f57f8e0d1d303588ce9d000000000000000000000000000000000089fbfb389ba448eb77722994178ee3cfd15a27be4ed6f4d4ab6ea1a4c10d6ee8424beb17d08190fb18ab8498d4a4fb000000000000000000000000000000000ab02df2eb474735e28c45b915299230ce159816419fe9c99a7da397b7210590705262ee14c2a244f4922c35bcb119338dca9ff432bb483ad726bd20cf96b07ab6f07170a1449f0f1b50ddc6e1a0253800000000000000000000000000000000006508fbef44d36cdc6fb37b6324810ab2a1d94e39abdf09d530df34714168105e23a7d6f7fd9caf31f263b658f16b76000000000000000000000000000000000b5bb1802813f9f8a16991d41275ae6d18532e3dcd2eae091da7256aaddd501855e775b779959fcef2822685725cd43b00000000000000000000000000000000052146ee63ae277911fe491420651a96994a30c7d1b19bab32eded008a125369baed2ec5a963bfd863a83c29bc1afb23000000000000000000000000000000000a180d79335347a8be350a92491760c6bf1fd56604d4d99a1c49bcbe50b2d04b7cdde55b4aea8ddda4bfeb8e79ab6ce4146433a0738ab1b044e059f49a8af8d85546d0e34eaa0edf2b2a6ee466c0def80000000000000000000000000000000015dcdc17a9afbf88b54af22ed2168329bc43ba50d374c0507c790f37f9669d0af167328d50d322a827d45f39724d2b2600000000000000000000000000000000169b83f2567e921a4319fc03b2a7eeefd2aed79914bf608d9e0a54aa71b9cb3e09f1cbfbadaa520c0f77f547fd407ea50000000000000000000000000000000009b7a8ff8388c85a0fe3860f26b09b81b5dc51e00a8961fdba96eb462e1334e9e28a2cdc4be49dd8b96c548c64921718000000000000000000000000000000000243782436fe7cb20a3242a3a21402a43a2c4fcbe77cc7182ee3cc04f4795c269d8a64ddd25e89ba4fc796747b608092de0399ce1ed861c0ebce1d4e811ea0a3d87e21a54ae34e6b5e1284cbb94973680000000000000000000000000000000013ce6856b6df48e4c9e3fc0be0aca5b139e1b874de6ddc148c1c23a846d61e7a531cc889bab99706668a3b69d32b9160000000000000000000000000000000000a459676071c7f3065a6dd7632edd5842db34aeda8fa0e7d7a8ea29f842ebcf2c5fdfa74ee7685caa51481c4f46952240000000000000000000000000000000010c1d9ebf7bed9195cf0bfefad6ba45f1bd19a9a7d340b7c630b9953923efe4907bd75a3da066fe3d49d656f3ed91d2800000000000000000000000000000000039189de73332d5b5a160c296a195cb9d8a736cca23a92948d513da7e4fc46e1ed9c207e86751b3cf1310d8a7284877ec2b034594fa53a0951e2116db1b063345fa42dc8c870e1146f1b00f626dbcfdf00000000000000000000000000000000129821e97c65ad3801c011792f4c099e19919d7d03bf9fcba30b3735586bb7ead7d4f9bd10bc5f0e5cf1dae82d5651ef00000000000000000000000000000000038cfbe45bbdc494988a2dc72dea6a7e36652f5e5a2ecad41b4aeceec05dc4a389e54cd3aab349adbe32e65206eb481b000000000000000000000000000000000bbab53f2be2c471d6e9cbad719a73c00b582d0983e25e1969c0be1faa56b1dfa5b7b55797b3340cf8c7eabc560fac71000000000000000000000000000000000b0db19410e552a2f7889c2204a93c5cfc71c360329e3be3171e88fc7aa1e993a5d089c28b1a8f8fc80d93ba194c63ccc1e6d9c5f8911014f0f540211af5184d96fdfd47c03bf2d7bbbb3bf1a330017b0000000000000000000000000000000019320bb8d29b7b5a7130b87a39e87e271b96656b5a2749f13208520634009c26f9829401d3e21cee5a757782c6bbf9ca0000000000000000000000000000000009b37068d72463e72f3a89b9093c1b09f01770e647b5ff7daa50e0679bb76404cf7729d5575a39f5b9b3b371893967df0000000000000000000000000000000019ff29e41db50c736e12f62d76a28f4ca4f6b0f4f61aee00cc0e9dd4e5a75c0ca965b82698f704c604bb309aa5b457f100000000000000000000000000000000062c352a554dc4bb96b459378c21ec6446e15b868221b2fb745d31dece854bc281bc22827d84ea3b0fecfe5d156712ce6df5a133d3332e1f79f41201f8cb2c8c8d4d1ab0f640c4de6bd6e34884a77aa200000000000000000000000000000000021c52e82b0012537b57fd92fc276e8de842a59355cc15d69a52effcfaa7cc43dbda0c34e1b9af44c2db8e9356b9c71e000000000000000000000000000000000371a6da5dd39092b6108f631a0f4c4401464a109ea1e5d14e262c8a9577e1421d41734d2c3ed73645cc13ef3988e9e90000000000000000000000000000000004054159263ee60f6b1882ad7c376c738c7ed87e6b34dfb4be2fd7aa29ede414c2c6c3ff098c53f22a1c1cd836a6b0600000000000000000000000000000000012d7af6b57c688e1ce90e9f2796b0e525e775fcb6be65f5d2fbe3d1ce1e5d948dcb098c98d495a6e3dd813527b4635258e7219a9d431c597fe9700d43da8b545072f5a27a9f1af99053ac0494087dca1000000000000000000000000000000000e53128fa5392dbae9e40ab1ff0149d5b577d9d30dcb85eb5e4fcdc17c7daf2ff1d6fafd4a1aba88d2e7aeb45a01afc60000000000000000000000000000000012972781f214511e9b78d276767b1b64bfe5b43215c7680c0063b6974f703b209b2929470dbae16f9767a7cba5311fec000000000000000000000000000000000cf6b37c5a60851d03752f68eaeaf37ac67c661f644cf507c5458cb5404d0ce903c92ef66a657b25ce07e5cf5d956929000000000000000000000000000000001835f202705c8b984a4c7a6cd219c718ab27a96671574cf7cb618235d19e9046a15212e0da6233f15f18bbe192df29c38efb8a7a5e48d5f4a011a4aa0dbab22ede62c903414d005d507ea3d77bd47a6c000000000000000000000000000000000d01c6e8e34e646911391b012680f0dd8f4b8d77c10192ac09ce57b6524f0eb8c7f83ff8f26d856e0945d7a909eb790000000000000000000000000000000000070fca42e34dacce0051f9e26c7c0dc328fe652110976df6df77af04202831dd095715af1714b60a99f2177e86a3443d000000000000000000000000000000000063ba43df0155373df59b009a8083b9f62004327b16ad455037487c5b8325e7eaf57a4d05c533e284004be6de79ad1e000000000000000000000000000000000870c2e5a7d26ba54bf0d45ddf0a4c3011152dd12a5e01a80e42bc4dcc784c7ffdb66f9d6d69ac445c1d9aa29586245147f53e2c06664e1daffd7d9b114e12d4190d5d0fa2244d61a13da915c39b8d53000000000000000000000000000000000d84ca02ffb6d3cf6eb27a143ece73d5bf006ff61569f0eab00c5a512c5b46e1fc21e8031d1a578010c9582d75e1faa8000000000000000000000000000000000a41249cf01ecd23d06f6a3bb8573186fe47e5165ec0d447df62bfc236f4c203b4feb8e2a4785648af86646cfb0c4e32000000000000000000000000000000000244fa6caa86fd27e044145557697ea89baf718746711c8dde334a2c5ae3c73d7a0e04fed6289ddfaf26e47a9d26b09e0000000000000000000000000000000017db897060c0a8e3e5d8eca9970407b46dc2c2ca0c004d50a171450852f585268bfa8a379acd01b6d4685e04c0b8c106fb109d9a0a7b62c7c452bdf0a2853c4bf65e5439fdc83aedec8c0bf73a16b55800000000000000000000000000000000071e13963e20eb1dfb671aa4a090973e4a4b7ad3578f8630db8a865847be46c796e6f9e095a9ce558b93d702f8f8572a000000000000000000000000000000000dfc4c89ceaad07e3b4c35d96e8534122ae48421cd4443de478ddf9a8867ffdab279ad745e55c87b731afa7700bbdb110000000000000000000000000000000015dd6b0c26f6821177d0cfebb7f1481a971e7601fb24ea365a0c3127a5b1042eab69446de05b61cb6ac0576752f87aa900000000000000000000000000000000156326c52bc78c82f5cb4aec5de35e3c128c5561dc80da2cb24d68a7e912b1f2dac2078508fdd4ec38769102c082f0f74b0a931b894fbe61115fcf52be51d44afdcb96c94117c75adffcd8729b0a699a", + "Expected": "000000000000000000000000000000000b537dc10a6f518122665f7d78326a4728a2889325e5be7da7e25e4752c680fd786cdaadfcc426343a9844efbbce8f2300000000000000000000000000000000085ba3a04aa8cea82b95dd994f5b3bdf0dcf63f13909aca2c2d61e4275a7ea22445c953b927ebc6b0987e98b553469d40000000000000000000000000000000019cec2e9fab640cc88073bd39e46cd571324904b1950fa8f626e2725936d80daacce2487f46ad23fa8af9c6ca0367fdb0000000000000000000000000000000007039a0e11cbb8bd940eaf4a192bb94ff8c6d6c79f775fa67821b5ba411641c09dfe9fac4cf45eb5fae52d2fc4beb6bf", + "Name": "matter_g2_multiexp_9", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000f73a297cd6444809aa11b0756167e71986ab31b52b57d3c0aac5637129b8702ff21ec649541e79644c27f0017c8ae3f0000000000000000000000000000000016f96d6ba02aab604dd918cc799cee61cda4c0164ed9f07d4932fc4ac3eeb92b1e6b40dd7b18cd8d26056b486e57ed290000000000000000000000000000000012156f3ca3aa1e79014dfd92fbb6c785cf0ee449a8920b89ad04355e0fb7c8ea804bbad082b4edc9abd3b24ab0df2b61000000000000000000000000000000000d51b5f62a6e70816d7671bcfc52f11bdac6221a23287286af78605b99ae8bd0c722e485bd0381b958a85f61e05de68368ce22e379ddb8352d12eb597c179c7089c6388542909876c69ee377b14054e7000000000000000000000000000000000acc52d0fca02c3228cd2e5202c4eda297b8227bf4e64308226bc487e5b64738efa4c07a3738397f90251ea9a1a9da29000000000000000000000000000000000b85b853826a28777a5767d5b1966ce12fa8999ceff5d6deab5c947fd19d19de9c103bb920bad615186d132ec22187320000000000000000000000000000000006b5a83827dc7b3580579ab7976a70ee160b712580919b6f5d4e180165e50f5a1698fa7cc63846eb1f5e6df955c3eefe0000000000000000000000000000000006c2957d8adc55931900145388583e5c2d5f6bd784e022702801c38534d2c92c6df9f95d022aa6d800e1e458eb7f313061529338195b665f1b80c4b95b7c3a26a7229884be1f4be9d49e1274a9ec3f810000000000000000000000000000000014e4c5991f9f2ee262019c1344a0843756157dc85aecb15718217a2fbe23fe0843992dcd3953ebe79acd85517acece0e00000000000000000000000000000000076a18fe710aca2875bc102f21782c9649f107684a4edcb0c4538f1a2890a2ae5b46a182d5470e620375327965b6d37700000000000000000000000000000000142a0fb19b28a034d326121458628356561e50cd3a471ee78bade0733597b8b90f647f5199d4b5b1ee6be4e1870bcd310000000000000000000000000000000018f8b5933848813cc2c1a0f079b095d565e7875ba6693eaa10967d496fb47257c9c674f301349dd8f2d22f8857f9d5ca44d740a72e6c8b5632314408022093618321c8c0a8cf2fcd9ebacbe43505a01c000000000000000000000000000000000db331d2b965dbc053b01a61e671d2ee6b04b072b6494e482f48f12221f23e3b1ccebf48046d92b4be2e4283c77f51380000000000000000000000000000000016704f3e1ce14f49df400592ce29627833ed1dbb91ae5f00779eef94fe9ab313c3e7c8da940085034e1a49158043599d000000000000000000000000000000001956d492f5764c6de0b8e9a716766c762620ebd3265a95b47a8ad2c0614c337692108800e22abbe321d77a6cc17f4b880000000000000000000000000000000017149865739d6aed0f2a4c3c71c2d02f8080d9339025b03f89a37a165fe6e5a4cbd489b5fc90bb2cc432e5baab213c8424872a78e340ccb077259aae65d6c448fe6bfb64daf4e2b6ecce2cc9525e35a700000000000000000000000000000000036804da102cce975f980ed5a69e0464241b5de87238f9892c77fc2b6e5ceb00d7a37a45b5520fce5f094f8b9510f49b00000000000000000000000000000000049da8b6c974f2d680a80d2007333f15702f1517d3dc11395662ca1db945c795bf64167840c4df0fda68a69e127b2d590000000000000000000000000000000000e94cc66f1ffb2112e37cbd5b4feb7d65032c2e57260504a42816aeac85648558f6997ef12028655103a8cb9de1297d000000000000000000000000000000000abf7703ddf6995d5c29124ba9a3f890854fe0622d547a4f24d6a60b036ec9e58f7ec2deca5a71e1fce2210cf810e2f901a1d84826bf78f493417a06a800d58dba688800026638316fcf9ae534436fc00000000000000000000000000000000008d22e456c643ce680f5ea14553a9c249a43d4f92d94135dfec85bc58967ec01135507bd8ac3954b5876c5bebcc1179800000000000000000000000000000000022029d4abec7fc9ab3bfddf2f462660bef7449c4093144d9b7d6f9e84f4f1c947855ca6e09bbb3bee4db096978ae0dd0000000000000000000000000000000014beddf6a3fbcd621e2a592e1c87952ed277163ebf390896f7c668944d6e0a026d3df74b0fc877ed560527a80b981d1e000000000000000000000000000000001414af918645ce0d4d1f670333fedf286b01213408019e327d3cb9321f06fae311b598c2f78bb578e85692e6cb787a52c5a3268a8ab5a12214b266aaa4eb562aa05dd19575a7f3ba2d549a25f1900cb800000000000000000000000000000000129f1e25d96b8c879710a81b727b31d27ce9887c245bf908a3768f3606870ca6bfa70dbf5135819d36582d55f230e94c000000000000000000000000000000000e91eaa33e7cacce4e1d6d0fe905c72221b534a72cd51e1de79a25ef0c06ab454a849a241c023b0f82aa07de28e35869000000000000000000000000000000001379e390f2f0f3636312465469b532d876529d58dda8b024b6b81d242af47b5720af4360d5a3172ad80fd9fd8a14ba2d000000000000000000000000000000000775992d5a8ae0640af845fae03dd0b2197699f413f90f6130d21db0dab042324094b36acda26ed86c65821d2d8a29d9e62a7b00d2be967df04ef56121c95c8736efa95e1faa0196e1f4485da82b3c3c000000000000000000000000000000000f5420156358ddbabf31fcc94678866f899e38747e79dba8ae280704c4b199a03eb423ceed18b5cba7e7ce84583c84a0000000000000000000000000000000001127669ef3ba3785a859aa4e942e8fc3181f2703b0ece6ddbee8830d7ffbfe498794f1ca2e67c3ad39ebd33e838dbc5300000000000000000000000000000000138113386846310db8e21fb8bfe40035cd89e51736b491d5f2d3cf5672e6836c25f62eab80f25ab49d16dbb83796aa5d000000000000000000000000000000001711d74ef4995b473239a574fb8ea6edc6eb7a88793a093df4652da240d069c5bf9249b58e9b1e11f7d6619cdc28a5787a883bf845d1ed04e0664d814cf0b49cf8c3e8b8594ae5d2834c753851ed7803000000000000000000000000000000000d32ccc6598af8156f1c5b35e69e7c7f57f9fe18748510605a2a81b4ee09882bf3fb26abf50206cd57c77924ebeda8010000000000000000000000000000000009043d364e0637c60223f9a5db8c50e983746fdf4c9f7986d27f5f4f3a6df487592ea42078f14efcb3eb1b7e81d058eb000000000000000000000000000000000233495c4961e71cffc2abcde4007c0d587687aea905f3ac5758d0f8d9020197adb6f9d7b86a542b8efffb05dce997130000000000000000000000000000000015b084e773e66ab1459825b6e6dba055a96e4dc1d94ac0b640e906e0a9f12d2124a58537c458e6e1b571311b93acc26c0f474e8f4051c4e91124c14895fe9e2516b315d805b79013caf830524fce8880000000000000000000000000000000000e4b859c679a90c03ea4d4b0b3d38211f685db053aede0f7f359f712e1ae808185758546877502d57200da2c2137f37100000000000000000000000000000000173b24ca19436b51aae22838674c41c752536eada3197de6efc98303eceb3e6e8e47ee6679e61e3cb5c8c734c96c98720000000000000000000000000000000005232b8c97a4860a23999d6ed6d173d300ed50b77c7b3ceb4e8407d9d6877a6004e2f76c553bf458b7cfd8d1e6fd364e0000000000000000000000000000000018a115201e3f4eb308c16656b3ca0635e6284169cee3f28101903ce1cab0659c3d83a449918df6e58e8af2e001036b8d9b3a5790750825ab75ab7422f833c671b95c6c58619189db66a6215ce907381c000000000000000000000000000000000131232788aa3038a6b8a055a896af4f8129e3dd3397dfd90ce86b3e09a775e5b5e19f4387f4c02200a36bc2a1e09d98000000000000000000000000000000000eb8cc0455cbaae97dfd05c1246d3d5ee58c286d263184ae342f5c0ef432355a574bb9fb8ec67634f999b6d1419f2b6900000000000000000000000000000000188b8a85a6b255408f074b3cab66b95e0e1a1b5b8965034246dcc196f2bb84aca3a78907409826370bd65cd4c4d0bcf30000000000000000000000000000000009603984f6d9876e9c235621fa817efe45727fd8c4f76abb7b0796ae721701161b39ff7cab4c57850014e7f1750954ab6607a48ba3fa5c033a1ef90260ada14ee50c95e5167bf801ddbd3acb77c3b3880000000000000000000000000000000009003b42c08b5c7d3ee9f6abb96e08e6f537da25cd0cf7eb85a49067746c03566e133b54153380286ef5725db5b41058000000000000000000000000000000000f09b7b754c255e0e3b8435ade64d6960285759495659dfdb9b117806397baf8d3c87e30bee02c9e1b22fa3efcc58f300000000000000000000000000000000003582c08a8de4bbd20ebfa833517a75682618fba2702b6c71a4785f70dbdede4e86ad8e04aae1f50a6bb75842ab74aea000000000000000000000000000000000ec013f22e64a4d4fb6f964e8319feb1ddbcfb71329186545d9b9d7f97d1f6a56c8aad03d20e9c30966ca932e1f2bc67030db724eadd2f487d31dd4354b5c0321a7983aead21759807bd893217c4d40500000000000000000000000000000000025809fb06c8a31f31ca5b4a5c795bc93355c78d9a2a4c1d707e32ff2a71d94cc1bf7b709cd5d6a183cb05fb6b5f360c00000000000000000000000000000000127bd8c9ee6388905ffe59bb0fec0e42b4aa44be74e5961dc2353e474baabfea86c41c6173db413ee28681a6bfd3ccbc00000000000000000000000000000000181f40dd8581b9adb2981dbcae27c7e906138569ff41a833ed3e6ee4fb0baccf2ccbe5b28ae2ff8e08c4f534116b58c40000000000000000000000000000000005cdd822cb47f35f31e0cbc26f6c957d51c6880369af94fd84daa1f1ca95e41e240b910f031585842fd2dfb170d618aa88e71d0be8fd050f6dbb8b2fb3ae2a9e593bef7a5163255aabeb07282e8793e30000000000000000000000000000000004a06984a3916820368076ab8cad6ffffded2cf1e67ac33f539ea8fc7a79580c1969e55b2a2fe3b31de912d6606c20780000000000000000000000000000000008a1152a581b6fad2a23aa8b0b51cbe523e701193207c896d08b99a672dc047498e565a568b79f8f9188767ba95212be0000000000000000000000000000000003539e82e5b88ef660b6593fdfd9591ec23e7109642f4aea0570f1f8f8e00822d2af277632ba74910459535b35ad47120000000000000000000000000000000015d3441f621c7e6922c489e474f80ebeefbef66cc59e4350b6f803e409034b7f498be2dedc97d902590fc1e296fe983c26989184bb87a586b8752733f9ce9ea06422c6a898f0f402cbcf760a7a21c95c000000000000000000000000000000000f775e13276c2e32dfde955009422557f332fb42dd9ccc3246d2b080e3ec44d910aa734478899698a9b04f6fb1a8f922000000000000000000000000000000000460ee4df6dd0184bcdae6d53cb66967c2213fa878a829c3196664f8d594ca6d60bb2a56f93bda3b0d2e6aac0a1a222d000000000000000000000000000000000fc9bf81d4cc80ba4e4df7307f976c2ec1ea2415df3c263cc970583824cd83703aa994daaa6e5c20450da2ba90a242830000000000000000000000000000000011f08ecbda9a192b232e8330ccbccb16a26bcf4791707f2cf52c2e11a8b3993221666563a772d82f4665804275b03b613d1dd9cc44b30a4623a4d14861688cb678bbb8b2f8ae3ba140f60e64c05514b100000000000000000000000000000000027fe7ca0fdf1cab9a52e304e55350195492abecce4289b0f1c02235412bb012803e7eb59e23c665ea86dd4f74c35c440000000000000000000000000000000011301ecfc78ada92885bcba8af75da6cbcb448e0c49511f3ea306f4ab944f5bc114e72f473cdadee2d0e84021905c5300000000000000000000000000000000010eea529fd3162ad7b49638a70f6f2c26a6844251b2c2f9f8ba54cd334914e84e5a1ba9c7b4e7a8b9cff1a909db78bc8000000000000000000000000000000000b8a6235a7310d52fc8050bcc484e6ecf299099e193f91bea9db31fae71fbd14978984a9e6de10939d0fbba96314b0a55639d80f55e24e05e3d943340e324f6738a593a915a6bddb40f01bf12f73daef", + "Expected": "000000000000000000000000000000000de312093622aabdc7523cd72f568060f4236c7287d61c3372bf81d9bfebfda2795c3182d508f0268d8f445f6ea0a5f3000000000000000000000000000000000b027f117583406916a8f139d47227bbea28502ed0df91cf0841345435376c944a587c3b4bd60f8ae0be7c7bad1c8199000000000000000000000000000000000e9a7b96136b26b0044b11288d35969c17146241aa529e581a8fcf000c33fcfff2dfe1e55c0fb63f6032d0b6b0cf81180000000000000000000000000000000002a442e740ee390d87ec657fc218b76adad7f6a766cbe8f34f4824ecd1587deb3706af77a95c1d5f8e79eab1dc482c45", + "Name": "matter_g2_multiexp_10", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000f54bcf1637d03854cc2b785e52bde25de7e45308048ed8ec0169069c2124871782bd9d26471014d039c9aa022e1a99d00000000000000000000000000000000106698139b096a5a79d43321ea64adb783011f04e5779625c9f77e5c390b46ef0d249387e978e64529bba2db8d7aef2f000000000000000000000000000000001668d5261a4ba37d79c76f44eae9ce2aa3e216c5fbf6cd2e90c6a73cebd8b59600303afce70de3e83a08c20de4609b100000000000000000000000000000000004b1b122cb55e688f8297913b84d466c6f3d99c09f4b039660238c8bcd0b7f6977851a6ea4b1deb01346db06d75180c142fe1e5b3c0245e5cfaa1ee8dd8ccc4ea8878ce2272d152fd8b24032297ac01800000000000000000000000000000000192a28dbc40d5ceee4d33b5c2778cacf8c3ed7d3227e7ea0d6fbaa7cd4a81134b63415f4f1960656b1fed15023ce3a4400000000000000000000000000000000138f296c45594a930b949756d0ae14dc9a720bb2bd9e93c7895268121a086a9d55c10135962a172c02da1eabfcb8caa20000000000000000000000000000000001605ef8182fa13a09a6b7661472296af2b0fdcfd7b051e7cf1d9e6d7c7f4ad9521d7732733399bfd5d09a088f25d215000000000000000000000000000000001928f2e5d47d7273e035114cbdeabaca724409a56056b4e95a4ca3b2222716b3a5368da3ed406d73f43e9571d1e04902253bdc5565b6ebc219a75ab74dc5ffd304c94e67160389f87111899ac07a71b70000000000000000000000000000000009b35f132a903579d82cae6a321c1ec7fb0281c3e82e9af05c3b2830ecb4a941da5b1637c1bf0fe9a39fcc9ceb0d09d8000000000000000000000000000000000eef9c0846064c866ae07b3709091b8bd48bb6b20f995b44fb49e030b5cb6d78b7f8201704b53697190a5e36e9a4541c000000000000000000000000000000000a98a5d0d5640d6399a3580036f0e5cd693a7cfaa26438a00767d5ffc0777b83c516316d9cd4597cf8601544038f4d9a000000000000000000000000000000000e59541068a62f105a0d26a5f79fa5fa8b41b2211f1fe674d84dd853663962d64a7f70e785b51ac3cc07267c73400fe6acbf64f93f6f85805517ddf0358ecfea1fd58a3666b8dd9d3773a28590fb8a13000000000000000000000000000000000157f58b1c7152a7f931bccd9a79073967ec28855a6d74fb8727f59c5e3728fbf07a5032dccb28eb8d8b24229f2dc1880000000000000000000000000000000019f41bbbb853edc1fe3ee82f901e613107dd4ba1d880284ee95a2c4cfb2220ec1408f8bff14defe59775136bc75b4a1f0000000000000000000000000000000015538789157505a0798aa36fdd171e0bb14bdac75339b35805807c18bf9175d877360748f97a8570754af0e28e89df660000000000000000000000000000000010500aaa99216aa979acd66c5b0cea2a6a973f1cd10c412e823c61cb897bce54d783a6c0acee22cf9052166a4bb5adb8d9d3f97893eb4f14f21f68110f612a444815fbf2f76b8399ba6045c8a44270df000000000000000000000000000000000439729e13e6a9b5baafdaac65783ce79a5972791610a333224e61104d15c746d7cf8350e619f0f72cb73635f6795c5f00000000000000000000000000000000092e3c976a4a5424b09e50e6513a9e1f427356ce161e742be31f0e589e9ff862460d41281f0bb2d27b1837a70a5938fc000000000000000000000000000000000e0e51e92ac3cabfd999cd72b67cfc488e150b11b18f9a31b1c2338fd4f2c58937521b5a107752c342e67666b99fc42500000000000000000000000000000000023d8884aa3f556e98e006960293230ac966ad18f3f715e6ab31a6bf0872c04e6f115fb1608cd87ffb369ff31012a11705fb554531f53b8cef8d93566df80878baa96f92bb54aec19445980b1a1f6c34000000000000000000000000000000000be33bc145611afdbadc636e9d7cb7e3a9c92c32f6944a2b7b5f44c248a0754c174e3286ad307fcdb2ea02a3578aa588000000000000000000000000000000000457de1fa8642d302065319b1d32009c64e7d941fb43d1b3cf455248664b1db516379df87aee05a651c132eab8aaccb5000000000000000000000000000000000a711f3bf1bda60ca49271e8a3143330cf924328d3ac6f7a802c15be1d7413e300f398274f338e6bfd0225cd8ba25fff000000000000000000000000000000000a786c5c7b4f1701e292aaad9b2e47bb883409aae0c44ae813ba48f401f4e2146ea0b1d85f2ce862b6ac9ad3015d4b14d79ba2c485f0aa0e35212fd7fecf970258903bd2427c4c8b97c2c425ee1190990000000000000000000000000000000007d03697e195a6b714fc9785b49e54e219694250cf5fe77553434eeced15422de3985f8c736996c1763d4b9248a7a7e00000000000000000000000000000000015841a70a168d2f356a8ad929e2d1433b782351f4833c51b50f3a1af48a85468c2ec02699550d21bd919203df73abeeb00000000000000000000000000000000170902520080c46faae2bf35de396d56921bd0279fc889f0187adbabb9ae52b849269d8097d5b3f331dd5a817f9b2ff40000000000000000000000000000000016846a000f037eaf5953b7c4b477e441ca4fa738895aa24dfb0ef01a4c8fc21a318d40a9424e151380084578ca413b3344c7017258bb979cc9bb8acbd3a3e62eac7aa152db46cd7398ef07edd031e4f60000000000000000000000000000000001a50509bfb12040c0271b231c566d13510e6ba84448e59685f5bfbf5b008fdc64cd5e9456beabd23ac011b071e3a5fc0000000000000000000000000000000014a964c9faf1752170ca40cff1b9b4fa17f8d2b56a4c4bd7ffabb65798771cd624ba61ee43160e70731fb9b07af8ecc2000000000000000000000000000000001822ceaae7bd0a734f57b67e4834cfb00a6b415459d81c7d380a2e5b5c795eb1b6d63ddffb1131cdfdf0d76852c75a70000000000000000000000000000000000c5a1575b30e5470151ba055f577a0ea49cff869614c50194829e53a3e1a95847fa387a0f45d537cabef3a5925e61c432583e821328ae90a7db16b20525228e8d915bc8d46a642cb0a06dfb64168cf1c0000000000000000000000000000000018cab86a0d70fa30b4df3e05a91eef57f6505cbe4bb7284de56d420ef3bf315be9249eedfae92561c643bac2c92301ee00000000000000000000000000000000098ca598ccdffa9bc9d464d51b46ed8a8f22a87ef408cfa45fa7f78ae2dcb9f861d9d6a571f6fa702a71e783ee3395cb000000000000000000000000000000000c073c0a323c3051c302c0558463a5c030539d74b440fdcb16b42ad5ec097e10c16bd9a651d149dd719fb1fb865420a9000000000000000000000000000000000164e622bfb8ecd5eaf691abad9db38ccc64ff0fa1784d26db8c8fbebc929bc6d4dd471321e01233d55fb4a9661780b5506f22d323a740553d6107e651c192c1dc6e0a0161a82351f125f08c77e53fdb000000000000000000000000000000000fa48147388181e8d0033004118848c50c6425f2e5f91945a17abcff4d11928d298c092d60184e75e67c7ddb9eaa8255000000000000000000000000000000000c535bc54df050c1ba8d858a346d3a644e03fe24873b7dc3e23518d44b06fcb3f52b4be6f11d3b66f0180a0a95dddf680000000000000000000000000000000015e279a2893c205dadc8e1cdebd9c85454cd4b5d7537f984c8f9d451f8316620279357e218fef87339f1728fa317fad5000000000000000000000000000000000316e343ba68c8a762f4c8f2a5c20f16abc4a7a8365556c1625df832219670619b6dc70727e9bd9a64ed491dc22cb9d57f1bc0e1ebff8f935330c35573f9fc3b900606da9cca9a36b425977af47c7ca60000000000000000000000000000000011dc72100cdf676e41f21015fa7c57897da8260609467ffd38c17868a4dcd2bd5d4d72e89cd0db2de83618222ea3b5cd0000000000000000000000000000000007e074f73287faf304f618478566b91c8e191b229ab40743081342e676be09c2523681cf7ca6f7a396f8589a4ae18a6d000000000000000000000000000000000ff753a16c16bf0dd1de9fa9316694214aea6f99b81f66b6bffd58837c00d7f5632ed5f8f4cdf32ec59c29241ed5e28b000000000000000000000000000000000851e26675814612bcfa639fe567633e1960578a0c8d2e6568418f633eebc109e6c8af97e77bb28ddd47c6bba8a7ba724429b85fae16200da6eb8f62e95e027c24aa6ee2a145f6ef225139f29aaca29c0000000000000000000000000000000009eb2f172db0fe9ac0332381d929fa200a97047f6e732570d23fe27f5ea3013fdc52fd0b5ee74a4387af44647b75f956000000000000000000000000000000001355f8e1cf45443855f2d62dba0fe45b2bfc4e0d06aa7aec7e4f7f9c4e25b33d9c46a01c224517bac9a1390a9806ed4f00000000000000000000000000000000179d47a62a5c847f47341b1ba58f2c3b073c5282f925f57efed1fc43db04185955075255e4e4f6c209757ddae59101dd000000000000000000000000000000000ef5f74d4b13754ceb3b468879f1a8befb8bbbdbb143eceabf2dc8e68fe6cc8e1ea4f3eca1b23a1175c9f5f5c4c20d3454a852baf21df9f4ec8d711a48e6ffb36be8c09c8c60eaa090876236b2eae37a0000000000000000000000000000000005b70a4d5b91b85971aef26b1521e12904b7ad224f25e31ec6ef59856cc702043a3eb975bf21dc8e4fc55171a3865bbd0000000000000000000000000000000007cf7c3e75a837545b53ca3e175a275dc6fe42fb88678aad45910d150ea9c6c94eba615429540348bb2ba8efacbb20e60000000000000000000000000000000002eacb469f5f8ee6c9f557a6ddcc854e955c5b9203b4ca5dd2e097d3e021479e13629863eb5ff17db46a17d3b0227f58000000000000000000000000000000000905e66f3a051b304b110a8682169fa749ba0de7763d3af7edc3e40f2d22ce7b6aa00cd06d2c82d74f3a9709d955f44e13814a3c6386b19f7b93c2c4e0eb1568e8bd3f0012a1ae1357b127c33808aa0400000000000000000000000000000000060ac9ce51426d360eff0d911d9f97a86494340bc5c5ba31ef146b55ad3633ec57a700f04b0cb9d4e91e13c2cc5e68a8000000000000000000000000000000000df205ed85e27c25ce27270384d7c3e58c4e0a9f214d74cddfbc7904eb3115e7bf204375df7558c3e65f7a81a942c5160000000000000000000000000000000007a220d42ca8906013479442d7204457b3ff37c9ee70d64f9f6858ba788b7fc13b71d33ad527c6fc673ad8940b0f01cc000000000000000000000000000000000ad481ef549de13b174d82fe88fa57b7e31ecd8999bcdb0c7a8735ab619a13b1e684b9473f0c59c734567cc08c76ecd6aba0fb0440b2461ef64af6ec5f15db381714fce1da6e03ca962cfc94bba26d74000000000000000000000000000000000366f604228e2dff2348a462c56e0043037d1b415ffaf155e72c559d185c6b0a0d125585d060f159a8cdad959af631f5000000000000000000000000000000000f69e829a0995914ac122299d4424b4e2e120fa4913939d2f18f9d1496e7255d00ff0829c20521ef47bb0dee06c28dab000000000000000000000000000000000a3efb4a376281a60f5246d8fc10bc23cbb9cb71037f8f57271a9b01f5e0340a562f9acf0e9a95b8c65ab7a5cd95520a0000000000000000000000000000000004a4ec86e2b04bcb35c7840d85cd1dfaa88e17ffb557ac591640ed8e563cac891793b92e349a7903c6c1f88d26a01c88c01749cac36dbbdba5662687fd1ea5391ef9d0bbd24e05bb5904a20fa6a1e11e000000000000000000000000000000000f5bcc27c243ef65dfbfc0de6d431706ab20d6cf6408ca989a2bc1c52b78ab63de6f58b70bfcaf6878a2746f249b6b160000000000000000000000000000000016a4c9e8ad0634e8afa8606a1a7bd1d8cc0815dfc6906b6e6446e0ceddba4a4a2df979d27cd07b8982a12550bc700fce00000000000000000000000000000000051f8d972362caf0a8a39045bb468112f2e73afa392079f8a4dc4c3a3cbb8dc224c21b6633a5ffbad08796ba2f8df44b000000000000000000000000000000001825aeffda04705ded9c702ba30d24b9fe8eb7cb106ee5d4e4ba029dcb57bc42c74e74e92ef8360cf130590b838645429680fbd6e6c7b1b14b000d3d18bf93242c74662ef108d711d85d8d442e415ffd", + "Expected": "000000000000000000000000000000000d0ab61b29ddea1aee0ca4e81b5369f37cf45be383f64ba0b1a5a74b790d7264016ee671959444c94b8e6291c5158ea90000000000000000000000000000000000152bf3709c56b3add8e3396d17abcfebbcfeb230529ea8144d6a120a0a6aa83cb284e40ffb9fd9a96f8a2f7244212400000000000000000000000000000000041f516a7cb2a7137746d028b0739c79ffd8f7535f20ba3728ede32504fe058baaf684cc7677967aa46777818b1fb6630000000000000000000000000000000009f1035729c55cf6ee090983a54d8c0574bf96342901f471a2e5380f11f235a075b0e157c38c456b6eeeaa10b87d3afe", + "Name": "matter_g2_multiexp_11", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000011ada4731ae7df493e405383603a8d79ef77f3fd14fe7b8bd9d2afe068998cb712e84927d5e6ea6e94d7f10270fd193b0000000000000000000000000000000008a14eddf88826dc3be792a0c1f7395efdf91454cec7e26c89f6beda37b194b706dbdde8745129e821b6f4b4ea6118490000000000000000000000000000000011c29513e8a826e6b3eefaa20ad841605d04b813cca282fe02dca0f588b9a579b2195b0b080cb6d12c1a7881008117f8000000000000000000000000000000000689c67d05ca379367fec99439e3806f827218ffaae995bf38dd8e2919fb2e751f426525cc2c6ead3b9aff2e377fc99e1ddff10527bb64de6ee2e3ab4959ebef9e7a6964b7482f9fae396b2b9b0cff9e000000000000000000000000000000000dd683a8e4ad54b1a95826a3000750c6e3cb250ab5d6add63c21b182d736b220d917d4e70044ec7101c3bf8ac620e1dd000000000000000000000000000000000f3e411cc6800b304fda1373ffa60c7718e20bf3e2e5f9784a81b47e398888b366e1f04f48f5aa070a661b5e2148d4fa000000000000000000000000000000000b0f8d0b695e000158ba80881a9256ed9dda5a7f53b550bf3b5c67ab160060fcbf5ce07fe38253ce037abedf4c6f08d1000000000000000000000000000000000bb92d407c457e9ea7b9851770d2743758e162dc9cdff2dd54b8271c046f642729cd2f10576013adac84a46d38623b932943fa2957d267019309f4fe5b6725379d893dcc270ff7f35b3811ad1d8d12b100000000000000000000000000000000023e880685aa69b3480bf2b7f2aed1181e094322da9e79c9263d50a49ba4fca713740bdb55886fc81c81a51045b35139000000000000000000000000000000001707049fb8b7ad278be2949b9eae2e28bde9de1d9eb964eae582541c2d7a8afc4c1489624a0919047a167028b8c77e3c00000000000000000000000000000000062dbb2bfce2f67c32b87ec2fa01ebf7deddfcbeda2fcf0ef094b1be77b7411f657e745350b6d2da16fc83a96f6f20e500000000000000000000000000000000062daeba038c7bc379f56ac371745b91fdfd5b4cbbe50d9619bf1d077f3cde966f81f9b851ebd206f2609a780b6dbd681551a3c2d0391fd8dedade892e8e2171e652d2a9b52f2288451c55f77fac788a000000000000000000000000000000000b553826dd9e2252c9da74c2bf1bf850df3f9c37439859f93df3fbceb7cca4fd949dcaa7fff31c9e06f41e51ae0b30bc00000000000000000000000000000000187810711ea5911a437a62e2ca483983bf2535ff9301a1cfe1b4d41902ef689f8d86f817a2a7c77128e4ce1ef6b037d60000000000000000000000000000000010170cf5f2ce08211cfc41bf54cfaa16584f833f7b97b2f6bc436eecc56ef44463690ea1f5c8c2a8f69d93a25206282b0000000000000000000000000000000001e627a68dbab6b0d05c85e49b966a769461ec38c38fd94992839bd0d46e06410fa7a48d418d65a8285f7852e8af4b318eb2fa94a5c97c28d95008dd1fe60137b34c2e763292d1b86993c02790b8c91f0000000000000000000000000000000011ebe2edc3de58a57aa9ab4d6626d7b93235ed24efc3d75c1ecae376c00beffc5e89ec509d243f693d327f7a4551921f00000000000000000000000000000000088ca2fe0651e4d8f3958454640a58ea1cdd804bfd2700bb1bb8e26ac50f2d7fc8c292f94b0bccef5735c4548025735400000000000000000000000000000000154936de8932279cd39ae803a5d814864953f647a5334bad958222de765250e4bc847e02979689dc9cfe1993486b5750000000000000000000000000000000000c7ce07c9746c6d72dae11e243acbe12dc23423f870f3130b244eef34524d547fe0b2c4b704ecb6b2e6c32f5675ce67ff72ae1def6c988f9242bff0e683b8d2a5c1aecfd6ebb9442131ec5b5b825d0f600000000000000000000000000000000031ea855125d75321a2a86a93e72fb3869dede7531dbcc1cb07ea2a352f3c6cd913275d0d43ccc370f4539f668f205f50000000000000000000000000000000006c4cadb11361f164f5899c6b57c0c6d8af365d902f4575c9d2d14dfd880501ce9ce218544b44bf07f0f04ed68e8f315000000000000000000000000000000000131332638026fd25b1a849c984f9dedd71e64fb52a61968666ba80238673077ac00b9e09817426ceac8c308f475303c000000000000000000000000000000000c7634af796e7aea4d4d83c9972fc822dad951d2473210ad82706ae0aa023ea85c1c467bdda68881094ad2a4f54cb33f331451748146f0564ab0d91b09db87e8a6ba8b14f8329bc041911616195f9fc0000000000000000000000000000000000fcdbf0083065e13deee2020bb6e47cb9e482df3768ce569f1f7c0e1c6083c97d9f08444e67857c2dce40e4a7b8d50cf00000000000000000000000000000000010f246e8ffccc2e752049f638617e122773a6f10220cdcc0603d24f1a94ca7c100f8ee2d9bc7c0a931fa0385eee456f000000000000000000000000000000000f8b68941df75cac3d4b6b3bee43fb357c8f4e56309d8509fdc62620a085d7ee58f52c7dff28525a449cabfd3b7ab3dc00000000000000000000000000000000019f934ef0c7c40786b073d38cb3e4623544cad59cb63440d4a6e76944d491f6b982e3a5e84124996634687d4618418316d298bf591bd927aee24a37c5ba508c3bc121f5150fcd1a70c1f27a79da7d73000000000000000000000000000000000c0208c1f3653fb3a5e2acbbb42f2598b22db1a714d616ee6bb501c3338e80db34d517c7086d43ddc77e0134dc5a4f290000000000000000000000000000000000a528245342e44e36f8e02e7259749e63ecfb38cb0609075e871701f2b3bb0765277b78d28cc3ecb7aa8c9e3b27eaf10000000000000000000000000000000010446583a905864064400f9ef168a122d179d46a058525c9be8a65a5d2ac5e967d51185d4964f81a5571123717210d050000000000000000000000000000000017da91a1d0358271b11a0aa524341ba1ee8c31bed15efc4c9183d60c6e1842ec4383070a09914fda991a63d55efa8f2156be810c3fa86e35bc935fc2b27971c9c41d03c8ab7b6c8869db90b6e0986ef400000000000000000000000000000000176c64efbfc9958b9c8e71b55e9fdf525d4e5a0265ff01ba95bcd5c6093bd063726f8e277d00b138fa4d8c8f80afc4e200000000000000000000000000000000183eaa6c3c605828852ab5e8a9432bcb87411dd18d574cc2491f1a280e7a267ff9ccc80b06c22e95107a72f22ba2fafc0000000000000000000000000000000013319d3a8564ffcd6fc7accdded740127ef205e8299b390d21e96b2609cbb463569c878f36191d43927868b06dcb912b0000000000000000000000000000000000fbde0ad8e89f5458007ef6ba0f01d0aba04217e06745a5571eedaf544443150f59117b56937f533b4974e5d57c41cbaea4445926775a6baffb4dbeb249dfe3b3e0c29f2a579927f540d8f6451553ef000000000000000000000000000000000c044a5116e175ca1d1ae59d400de24e4f47132251b4b3dccdf458623c36b4d3d83abc644a2247ac4d0e3f195d12e7b000000000000000000000000000000000048dff6bf65f158b19b992167ff8adb5c858a154bd68bf0c84e41351bf47a8f870cc735d1be5d9afc62bbcda2fcdb1c20000000000000000000000000000000008c5539746d2610eea22e79b3fe5b33a47fd3bf9991d34c6f9d824a46458480b735c0051d7b4e4909fdb1f2a1a4e4b3a000000000000000000000000000000001936558ac97acd903a29d07c4aea399227ea13fd6dea820813c5519412c157e1a477fcfbab60a787c6b3834eac4522889ee0e58d08779add74b68dd75e82df172b719cb5a772b0bbb34d3401b9f212ea0000000000000000000000000000000017d978d60fc89b0429c1a6424231fe9274cedad5d78d9c4ac5aa2dd5e70e8238a0bb1904bb4b6ee5de5cd1ac514c62a8000000000000000000000000000000000d4ce85a95dbc40f405f4e7ebf9121cdcd22766737c39618ad0fb3e10a6e53be1faceaa96073b2a877ab808483ec9b6f0000000000000000000000000000000016c61599ae4da787fa6db233fc28f5c56f7133d403901800ab5fa19d058fb27ecb34ca2e56ffa7628ed004c9e62092700000000000000000000000000000000001e64e4adfdafbb423b1b9f8973738c690713911f68f658d234e57dc35b9554e0f7ba345dd7920b429a12b9c74775222773d07cb9d20744a2c3ac88082a8d6606acdc892666753793a2b8bb81116cc6d000000000000000000000000000000000908ebe27a1bdf0b9e56325c00ea3814527005793ea97eafec541c01cf2d7c909d2521a5fd475589a31e297cecfd5e7000000000000000000000000000000000017e3c40c60cd369ce5a90f6c4aff14896cf73fe06432e71940bd8086e36c2353d6bf9dd414bcf92889887e2d49fbbf5000000000000000000000000000000000ded856e5b2b139487b3816351584f06582a933af2bd4573a89aab0a41af01ec1cb928a7d8035228302032d399bc7caa000000000000000000000000000000000833b77c5d5c98ad95a144c0f167fd3bd62b03f4ad721561ed1d84c7137dcb19521f781bdd3ddc22afdd52c75146e101f6bb1445e9146b117bd0c95b009fba670a5391874dd314cefc884bdb0a4eba680000000000000000000000000000000005c6f28c5ebd981fff3aacd70eb18f134bffdc8507d1a3aa153e5787b68fba7f4a94c43045d2676aaa992754783ae87800000000000000000000000000000000148ff39e8062bd488accfead42a684f781c4ee579af6204b5b8dabad9022b029139b1f3670fc270710ced9a53253850c000000000000000000000000000000000ff50eca1a92f123e2534b3289f37ffd5d4e05f7678017ac20e35c2deca054dbe376c5529cddb5e58973f5c60914f251000000000000000000000000000000000b58298ba9496fe32891f4c1cff25395ac5a447205cedaadda4dcb929260ee55781916ef5e4e39793fa2831142111226d4158de4e23d793ba77c24a70f0ad07314927fff34361b0d74b25e8922512d7a00000000000000000000000000000000184d156f881f7d10d2f196b7599db85ee826c9c95383978ed68918756f642a2ed1c951503251b0778dcc39598d79fc8a000000000000000000000000000000000952168761380e8fc90a4966e94b8d2b88a784f6e607c99d9af1aa902506f59d6879153339fdb7b8acda178b9bce4ef90000000000000000000000000000000009997621d4e17c76b7798ef2f99d3c0a7519cce278cf718789cd8227b2b1459af7fbbc93078aa0aa361167b1d1c9363600000000000000000000000000000000005369eb3a77d2e26f9907a2d930f39dbb87634346cf10525733aac8ea10eb918d4043d2a05ff8e80b9c69a670e17f15c629ef41d5a2ce49fd81930406f19e760a47074e159ce372dd67e7ea46ad706b0000000000000000000000000000000019bdb390c66f7d28cfaa91bcb34c5c55bf93a9f2345ea396f18ed33ff2221a39cf68c5514fe091f7882e82470efb1fee0000000000000000000000000000000002d0b48d2c0377b0dffca247b7625f9901f86e2161626b4154bc25d6c643a48e9addd260298bedaa80e42caa5b9fc5b10000000000000000000000000000000018a2b0a760652e546eeb42e857ca48f59741eed91822c17692e9c41358b213c82537c9c6898713a13a241cca627a7dc400000000000000000000000000000000079c02f41fca45a56d9d8e305141b4fe8f98d102197e7864065d342e6b07f65b62632e0c12660f37de4d698c0df3d0f3c718651715ab786b4855092ed21be41b499b7824d0bcf68ad31b31ee4cb730d5000000000000000000000000000000000c0448fd4ebe9b5615653336fe0a618fa281b0fd7d72a8f956a5fde84f7d356b6be853bf823436bc0b61a603636db9ef000000000000000000000000000000000dc4f2b4d810c4290e263098576cac393fce137cc901b3be23507cecbda7d86d18022cf8e1a7df4b1298520ae5c9314c000000000000000000000000000000000a39413967b558dd8a6b2bed972687d984fb9abd0662a266680f8c90f1897e2aca1ba37b41d7d3fd47406bc5fa3c5b7f0000000000000000000000000000000000550fcbe5bb75afdd8d5f387798a8e83a8dbb6da4918c24eb2e5d2d8acd3512f6649a4ac9c8d3e6794e6f4f8a87687bc685a2872c4980518fe60c61e2276ef53c007166f7eceb355b4cd533f42c00b7", + "Expected": "000000000000000000000000000000001654e242002aafa89c6fdb9e8fe2c197ad2f8aad11868568dd39d68ca35919f94308a80303655bc83fd130de6f9723a900000000000000000000000000000000062b5a064840a5a28b4991ae949f9508586447ad5e8c463593503c0e5857c5233b7ce7ac03e555c2675f2e320e8cee6a0000000000000000000000000000000017d65fbd7caa69629f66be8b201f53baee5ef2957a3c04fe384ae82959105342b52483eba6bcc1442763c677f515f6cf0000000000000000000000000000000002ef8f8ed1114cc9d299e59003c61d62edf8971d65b1b621779bd7b270c4123eb629f56dfa2e2723501588a0caf1847c", + "Name": "matter_g2_multiexp_12", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001392409b92282bccbdaa0268e1173e60911754eb3cdc28a52e93f4d82ec99026f314dfdc59b39a4f988100f9c30cbd1e0000000000000000000000000000000016b3c555d5c196551ba715c6c334a668bcae80f5a17f038038d35dce34843f79968a90e2102f0faa22a93d3240b58d490000000000000000000000000000000002daf83727fdf45dcc1a15adf47de3f8a1724cf4d34116f52106a9e6b22dc24a288e89b940cc57e5a6bb87ee70f680a5000000000000000000000000000000000446009fa3555e4a056a820efa7da52117c15eb105af57985d8e9b33b0b22fde6aef9bad30480c2b8c1246519795f61fc067ecd54e9ef59996493f846ecca63bbd7ec28da586f0b8d41bfdc6d97a35cb00000000000000000000000000000000000372ead514d53007690843484c966361661816e0d3949b868176d7a9bea42064f49113a74f2572a6dca7afa0642fa5000000000000000000000000000000001199d3ea66fad87074e62a0b77d3fb962db17dd948f30c38f5beb0e44e1cd11d9172b878128e9a64a08394f13cd786f60000000000000000000000000000000018b7db157bb326ee2f72d4df2b1e0ddf0a90401ccfca1d4ffd6379c62acf5d6e4176a23ded2f81653038d56d848b4fbb000000000000000000000000000000000a932cc9740812c8bde33b68d94220690e0f55618b7e51d3e3fc29d0cb9a8d42b8f8e1efbba5984c3c1007c9a80fae408b5112baca5e0f2bfb885c5041189612918d203a117d886bcb3b27df7e64d17d0000000000000000000000000000000015798d10386f6d24caed3859875be5fb1a43ac753f725f28da6b3583bd9c0e404d36265c2305d7d194e2ad84bfd2bafe000000000000000000000000000000000ef2ea5f3b6e03e3c9693d6db60019f2efa4ea586bdb7623f03bd035c603e8996ef2ea7cf745aa31f60679ca04f93875000000000000000000000000000000001792a66785a3087a80c4b8652c1e4db8f602cf75c1a6955f480a977f92ea262965dad84061f6045177c831dc4a3bf8400000000000000000000000000000000006ea3862318974d6347639ec0d70afe748f4edf32b9e437fd98f38eaf72168a153cac180c2d67bac8a358e3a4d57a2b32db7ad39ec8129e9e9206bd46cec6a8ad3362ade1beaa97befe148f6c67a9c2b00000000000000000000000000000000000974da7500df70d888d5876e7c61bfffcdf830b49bdd40edf65a2ff476e9add35eaf9451a2166e9781805192ffd7ac000000000000000000000000000000000cb2e7152b5b40758b18caea356dd8e095f400282881207c4b79d10d741756e526be261b98b726d5cefb668dcf73a0a00000000000000000000000000000000014aeebb995d464f4d77bbb72f15d9078936b5ab68eb8022bdd97d050576dbe46e6010eb72250c8ccf2a59138efb38f9d000000000000000000000000000000000cf7162768e8eb50e21d3c0a076c7bac4920c70f334336037fb40e57e0efa91eb025356ac3f0988a6b127408a02eb53fe2400a11d9a67041824b97a96f0ea9da8848e7990373655d76e8bd4eb84df5dc000000000000000000000000000000000b1d6214796b4775c2b50e634a549ed104e6ebc0e032967b17eece6cf88c93aac23059f263faf3c3f38463270320135c0000000000000000000000000000000013ffa3894a36226664ff53ba9256d39c6312303f5cbda6847b4f68c56134b7d731e74bd711014fe374f909a081a7d02a000000000000000000000000000000000ae4590cdcb1367392635d0f8dc6b9557abd16290fd1abca6da354646d8585a7c9432978dc616e5fc38cd71d55f139c200000000000000000000000000000000124a7b5574ef52359b4beabcc56d3286db8c8fe4ca4718f75da28d89a8a95efb878c18b48360dbcb6fb50a9f18f0d559aa2d17c409ade92566ddb3913806723d41067540a36a9c283bdacb273c5b258a00000000000000000000000000000000148ab0e847ecac963f0156da025dbc52e765cd8827fd55ba2969da6775649529226ab13ab8537ad0b89e8f1ebc8648ea000000000000000000000000000000001395b1adb6a56b91c3621a4ac5886a7b13ec00f1c74d5317eb74a766eae655e09e269ec48cdf740abc38f4d6fe52dd0f000000000000000000000000000000000f70f77f07ef2909033665bc05cfeea7df6ed55f2f0b1b87d9f247b6c07c7e22f516840efe68005c3953a2702573a9b400000000000000000000000000000000166a334a711416cab180cc498308487b281711f2d1b832c410ebb4c591af54b154fc8c8d7ac9a49a241f7a3840acbc75e5e3d21862b64e09a0893ece646de60cd66aa483662125ffabc46cc52f1cdefa0000000000000000000000000000000008c19bcbdc2ef26a30dd88f3e35dc7fbb3c81c0224cbcd6b12c90883f3973bd7089636f997e5f213fbdcb79514c551c600000000000000000000000000000000058620cba8ed5b738167e809cf71392aadfe8f384a4cf397d10f674cfa914e9e02bb1518e42f16806214fec52d880f6100000000000000000000000000000000048ac1120d26e4173bb33a58c0ce86329cdbe9df6a6f268c8d5ee4f1d6110f9d81cd50c46256198a2462d50be3e781270000000000000000000000000000000010af13ba791d554720f5075d46d03b55c0c1dccd679cef5a7d439ae868d3ff2780cc3ab151feb72b8b92905a205e630449510ab1b7850badf58cacad67fe47135f6524f0d160f3013e8ff1c881e469e40000000000000000000000000000000005c30a126c94b87c54270d0f23a486c3b36a8b491bbd805ae0d5f2bea818a87ff5aaed2d5e6317b786ab5a23f1cb48da000000000000000000000000000000000eb2d4663eca7f8433f10e84984781a57fffcb8f9535518721521ddfc7a4958778915ea3c57bef399a453b8ebc10befb00000000000000000000000000000000161947f57d97a858e5b3e918dbb22dbf28629e51e81335a9bf105d0fd660ef80087c8d69d8db9841cc69fbb5e7f81487000000000000000000000000000000000c52b6a559928fe4ad984a0569c081f3f71eed3d5b0d3c14d1a23afa45594e0fbd94143348390bee178720fc603145ab713aa69664a8c721cefa7d6dd3fe9f92432b4d350621d5297805fcabb21ff8c600000000000000000000000000000000071aa47d392e1a7787b37c52acedbb4632d5549fc11b79919bab7d22f1bbf1c3a239df622b8824b07f6e35e627283b8500000000000000000000000000000000198e72e05388021919dfc1b2a58ca72bf7655cc6c9b62abe3b45cc782ccfd4a2334780e451b8a6b7c311887036813fe4000000000000000000000000000000000e20cbedbafd96c42612e146debae48c7fab4846b20ad0848c4c42c6aa0603e72f94dfc938ed9e3a9886d221ccbdef70000000000000000000000000000000000c861d1878e63e313e672bebdadd3fdbb691cff5fecbc24da895febce2eef0a3c774a8a9d751498e4fc8e2b71daeb40dc040d8bf0a787346560fa3b100b2dd9adb3f7ee716b8103abdd9609363345ae40000000000000000000000000000000005f7cd2205fa2e17fb9896efe3fbe110e1fa59db1ae5f8d6b5f4510abb4da867933d4fe3caaadc4457dcbb35f1b9c62b00000000000000000000000000000000126f2ef6022a7211fa865c1dbdd5b84d96cddff424b06647acc462408f2d31f34ce898d76e1e124db7c39e08dab0bff6000000000000000000000000000000000987f916ad6f718695f3c40703c59ca93eba38931b45d7c33c64c9f75556f075b744dfff8a5f21489b3db6c3846ba09e0000000000000000000000000000000013011b8c72f3853738e22957f742b05ec428ab0da28901800f787b7c3678449acd0359fee93c40c69623aa4acfc0a81017b811aeac4fb7d91abc655f8a4392176f9060346073c957ef903e25d10935a00000000000000000000000000000000014b88c0586fa18333ab11a79acab8e12c6257f82a4ed16d929768a60a3a5d780a22101c32ea9b0099aa2816f18a0351a000000000000000000000000000000000de0fde69efd2cea7ae08d6d2443883002e0b4e11da253222429f6ecc67ba8d282eee84d7f46e0ad00b039a2c2ad226f000000000000000000000000000000000aedfa0a5a8b7577dcc1094469233f8b07e6fc32af26841894d498d70c6a9a046ad636086def948d21e39833c5b6c5a70000000000000000000000000000000010ec6aa0efba4995582585bb67f997f60741648156324696312d17656baf6aeb3e2db0d1a272912fab2fe81d139e971cbd1f096026159218836a46b9801a4f0c43189324d20220aca777b826eaf2575200000000000000000000000000000000004a847c06abc8ae7ce6e6ff0ab856889dd3e9697a75e3cd4d2af9e06d4c2fc48c0562289348ff52f4d9855ad03d83aa00000000000000000000000000000000075673bc79bafa9a64de6bb0e9dd9fa29cdc9c82e90a7348593eec673cbbf22b1eca436ecf767d45852ed888a3f23949000000000000000000000000000000000f3f8543d1e667404b4564dddba4d7c11d13881fcd8ad774c8eab8fc599f55147c353cd6e163cd7b9d5da55ebc13c2e800000000000000000000000000000000069edec7e7d26962d88a89dfad213daa36046bb2851e5d67adbaa227220f29f83ea67cd3747e6724f148dac28308604cf221dedfc21098ff9a9507e493d0fdb1efa6029fcdab23a016515078c76f7627000000000000000000000000000000000c945e83822896974116663d3e2769f3df5a70d55b8392c1f6966e330951f3cc5688742d4588648a6988b928b9fe00100000000000000000000000000000000003e94b7ff7c71d633ce69bb44d0ba1bfc7c27a5ee618e703aef81a45ad61771a2fa8e3dadddf7c8038f1f65ad7513801000000000000000000000000000000001727d768c1b51066d2af87a9da3e24ea2a75b0f75b8ece70727f9f54ab77d841e7ae01c9c0760f4186d02a28d6f8ddfb0000000000000000000000000000000000a273f9395cd49b646e90fd2526d5c93fd46c7366b715546529c9edf5cb3d274c9947c21a03add3e7b20612636a6745ba5b30d1397bf28100f108b84e05107ddd6cae2e82f1973ce187e8c3a7d02f3e000000000000000000000000000000000c996c16a16879bd3194ac366bbd11b5863123ce6fdabeafe56407600e5d49c92ba68ac1256e1515dc9256de14ac26de0000000000000000000000000000000018c584d8a4f14900b2fee70b50b700199ec2372b731dd1380f42ec7fd3d01f0c9a007554059b85946c1c4f4e2fc504ad00000000000000000000000000000000073d6c7d671762e5398e4c9d57f6b68c3d97dfe0d01783f124256fac236f03b774db58b79cb4d5558e1ebf18bb9e19680000000000000000000000000000000008eb2b95e17fdda916b08ff2819cecd2eb031f41c8299b308339b7d9836382ced75e8eb1514a70356882d3a43227a9bc19aadc83d1db9140af303c0492d2b9bb9e2b53ddb62cd2132bdf8ef62aaed683000000000000000000000000000000001029fc28cd502caf3ea3619f6fd04bf457e6a452b5cad680ec2d4f8222a5ac2daa92b880bda76016973494e605ab28c60000000000000000000000000000000002c672c7571b5d8e99de6e47e0a2eb71c6d9bd12baf2b083e6f88598b32c4644d1486aef582c5936e622058bb141db1700000000000000000000000000000000033cda383a77d5b3adbb0809e834993c56717f81f8c66ad2d97f2b298d5a46f7b29a74d35da09271b7053a05af096393000000000000000000000000000000000132da041c6e3e1d68bbd2223f8531eabde8e180b36b2cd0ed4fca248f255cf3eeccdc5f61e1c581ce54edcfb2b73e0787eb6fc40b00246910626ab66bfbac96ea09242d1d70496466e4d681942050700000000000000000000000000000000009721f22bc49f68d703a4dfccc3bae791caaf0d73892bafa6e9da465ddaf0fb1a069ffdd55306acff2407da64c1c5a0200000000000000000000000000000000056c0a4804a19aeaf1b4fe52064e43de8e5d41a8d77de054e2cfdff078eaf468d123d7317818d1bad1bf3469c0070b680000000000000000000000000000000007f1f318aed043d9ad7bdd53eb6a8c3167240fca75925b04795210700463c93a66ed64851195df1bafbbe4227d7db5ff0000000000000000000000000000000007b8945e258311e7672e842b91b540fec9ef4a79296956a5cba3749c0ad95ed83d7b0b48384ffb3188459e997b86695d3bb5926f36808c0024ea7388998b4cc8c6c48d32917f6456b39d514143c6eded", + "Expected": "00000000000000000000000000000000086a1ab4c19c27f70aa422e8292752c50b365d6fe3eba21e8f2ed51f283df0446020834ad27c18b5c7285d1156049bef0000000000000000000000000000000007288f40fde69bd350ce1f4d0f68e645f42de319cc032250b76fe4fa305341e244e5b2366751d5311105e3ccd30e701c0000000000000000000000000000000011d0c487c4eceaeac009b694931f8eafaf8eecd6028f14a4de33d2940bbb747025eecd509564721b50b7186910f81949000000000000000000000000000000000366f0c901fb859b4bae006fbcc9ec7e456eedc7366c899f68090fbd457c37b03ab99ae982872c7888b65c1a056c134c", + "Name": "matter_g2_multiexp_13", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000072f3f03bb09ca30239dd8302b05e0d9dc4e43ea33e865864a82578c35eafcf6868bf0cd9431b92b76f00990b780ffa400000000000000000000000000000000170b76cfb7944ea5ea055aeedaface3e8f0fa4d0ff657fb9d5311f3af6e736da84a5e2bef5188e20f76fb42591267fd9000000000000000000000000000000000d85300009165a8da9cb8e590f7f8d372e4264df150b1551185c80e49dbedaaf872ef69c5763fc3713d0c087c89f21050000000000000000000000000000000003ba59b682174ee61630df95c8e2b1c48ffc8f7f8508c21f3bbe8f7bb3266521fcc06c8f90fe5126d872707872db6d59f44b0204792359895b448bfe6ffaedc14d54a6d72be7a49718c0a933807a399d0000000000000000000000000000000004e8f16480c2f080a13b9f2b66e6480132d76c4ef76e8bac995a8e33280073ed5610865260e154b32f75f527d89620b3000000000000000000000000000000000f9ca48d732a8055d22fbebf3d2bc1e1c9c815c184f594ad2337731709317ea6a205478ba05ee9271d35a19dcad4db5b00000000000000000000000000000000078013b9290284e7ad528a1bb9a2a64b3ef43964c7226ddff8ca16ab17b4a2e8a2a7d921ba924a718587954f586a954800000000000000000000000000000000004aa76bb1122116cc0c04d65265d8652f08b411632a732a9e66d7932801b77c4ad398d582e446968f7f4966e9167894de25977e7426cd5652559626ff8b195ab7ec679de987a6a22a6a0e366759dea000000000000000000000000000000000145de5d101498bfc7c57830eea2931663ca1165ec85b77654c866b04ba6a28bfe710c1aac9876a68cc6ca119708eaf0500000000000000000000000000000000096f9df9d5723e8379f2d09c76a3fd059be47d2c2ed8905d333b2464f72153c5f50b6345980626358839ac691c26c967000000000000000000000000000000001788ffa765c19758da6eb6c38e793190c64d4a7b116576f6827fc090b0f65304988f6a95cf4397f82b7691fc43960ee8000000000000000000000000000000000746e040d7aafdb06a31ba3d7b590dd28f0678badc261a93dc7bd9a605047ec67ba86b2b6dd72637a449872674d6b5982e7ae497b44f531fe203a599622954804c06d5348dc17eb1537e750006584b21000000000000000000000000000000000d8f3cfe1cbd2629f3899313cff16ca3d8f964ec1cc0508341936a7b3b49240db1116b2c3de28f9bc45cdfacdb5fd98c000000000000000000000000000000000fa642ed31293e44211b34bb28bd5b389ae6d0510cdab46c89756f31795506fccbdacafdff21b0127e80557e5ba9afdd000000000000000000000000000000000715a8951cb358b0d8cc63377799a9a61ecc85dac795d726fe60e429d492c9ca843be2a2633c17f830f199335e5d7741000000000000000000000000000000000b88a23fdac7d35fc135b45d7565854bf010a75f072b32c57ca4d0979c111aadd84c71df6792dbdc8e975ecd46a15df2e073adfb5ab96730c53015a4ab6210a35a37b2331ff5123e00798c33e040a913000000000000000000000000000000001171be5820b5a19c045abea399f2b8ab9905d2aa367c6c8c0f84eac132d26150b759a9c029414f1c8f7e4880214446c200000000000000000000000000000000147f0877321f2709183f0b617a7c5ce898db508a3ced4148cc9f7af011fe8040e90885ce817aa956d9f5d19dd968f6220000000000000000000000000000000000acb005c11481b214a17e3cca02c2af266e4c8cd928e3c4e221d866e9f296a2e913bf34c4e051c7503a5e4e7cd7449900000000000000000000000000000000125f45d0af1c010cdf8438bff0f406007853e566fa646df40a581f65496197755eeebaf4f0f77e1e936f399dc4c6c020e6e752d40d411f1ee6e67f48109c9a059226b446601047a2189ab815a3fe13c40000000000000000000000000000000019cce3f872af5cc515ac4cd7825a5318ead5b464d50349909a70b415a8950206974ee0d4203f208d8e6d14690158f5720000000000000000000000000000000002e08e8accede11afe3e2d085f35c08d7d414c26a9caa992d5a090a43c9b0c0cc1471f3693f9d342a973da65189c888b0000000000000000000000000000000008a984ad2ca60c492cff2e95d541d71e33b269b10d3df107c0513dad5af511c51806068da6cc7226df1cf5e5a2fbe707000000000000000000000000000000000fcd3ad75bb0a5c046cf83be3d973bb3685bc717d7b8262fb8205935db6e632472496907f7c965fc6b52042ce69999f9e657fda33cf4ed1aa89dbc19d58fbe3043acb5795dfb8c0cb97620f16f8f24350000000000000000000000000000000014ccaf7594d8ff6157f9439ba63480d3d07f44e62a86caaea510d0ec456cd8c6c4b42cf9e38713213eb4942ed45df2ca0000000000000000000000000000000015c2061c532cda006addd2fd6ebbae458197d55fb336f75ca7decc05dc6d421a65495b71ed11874aaf24a0ec13a7c65000000000000000000000000000000000101f953aed7f23b5b6208032f05b818e0147079b7764aa3134dd9e4a316bbef0309ac378ca3cff3bdeab9ca56cb78e60000000000000000000000000000000000c76a2bc721a4d3ead95af79ec24be9b7624bc80d7debc07e388e52ec621082b9a69f48d157b168af4aa73629697f784c73458e18d6f832f362dec7c49140e6523ead045131a1b719b0c836c1ef13a79000000000000000000000000000000000761832bb5b530b80c668234ab5996bdc225c0c696ea07dcc61c330320404827ada9d58d658e230fcb39a96b339b830e0000000000000000000000000000000001198b85418421d96ebfbf436193b411a3a89c206d006291bd23254ed5fe12ccdad15725a34d962005c0ae60e202bb86000000000000000000000000000000000c1d7ab83b1d2ad57a407e248492773a357c06b83c16c6ce1490e84bc4a3cbae395f160181d2bcca3edc34b764754ab0000000000000000000000000000000000f1e9f0cf96d7671763739b6c37fd442f0e816c49d9c8e001d322397e9d6741dbf8769ef9eb83d08ab024294e279a02838cb0a2b191f538b30187dc730a8c665bbfce8186883500baaa6c3242a0d147400000000000000000000000000000000063049bc3282934e29f3bb3dee432bdad6193a5d2247270e88887cac565f4b986e1b3b2af5387cfca64f0d50bc0ee1640000000000000000000000000000000019f0f05fc7f8bf2f0b8ed375690b53b6dafd0a07c49fa55d36e040798334700a3aafc4995bb90de9c4dc0e077ee18b58000000000000000000000000000000000fbe702d148609dc8feb3ac11c5eac8e32a2f7221aa135cc33a585e9f4c97afa1658d8962fd96e26e0c4c1d5108229ef00000000000000000000000000000000061fe418d3b440e84728091a4996119b515118900f54a6f2da2ad5592f48ebc17bba50b59ecf435de3cb892a123ae9d18a27de64d41d13ab67c1f7b1a7390ab4dbba7d219dfeb31255f9401d5b3c62f80000000000000000000000000000000011e8ecf1e341f0146c59a79a8428bb01d2399d3f87d90d057f63e6cb9837432154d17975f70df175a016735caf85120a0000000000000000000000000000000002a5bd53e4f4c5b9682e1af1f7e09dd305e7342d1688f62885b5e59f173a9fc731cec481559ad693030004a5fbd90a9d000000000000000000000000000000000f9601f95e12bf05c35deb204558d44a60fd630c05f4060b7bd9ff943946e8eab507422afe00a3e7706b8ed013f712c20000000000000000000000000000000003bf6fecc0c7414a69c2b48e2c16e88d988ea8ae9d8b59017ecb89394732a20e4321cb5e4fb071aec7d2736220a4553780030798960729d63db70b8bc3c0030e80d9b8ae766e3330128557e6c34442f6000000000000000000000000000000000549f6464b657eac28f838c6a8bcfcb7a189d6b3b9712e19c1a23503ac209da5f2ad4df83acd505b0231f00eb88515c70000000000000000000000000000000001bf4a46dfdd70542e9d8cd6d6215174cba28f9adbff31c02482ca38205cb4afa2f7fd65ecf57b39e4ee5cee320e33800000000000000000000000000000000012d04a693d565f96566b7c313c47d272fef0ecc828493b0841d58f6bf690a77cb72824a656442e288460ecca7cf05504000000000000000000000000000000000b33eefd5df8b098e6505cbe655a483ab5c6e417a4ed55420beab95e8614c8538dca9296a7848d6aa0495a173df6d0b80d32b6969af54dd345f42320ea96def3c6f4dfd4e22a82686b7a3c57a0df5250000000000000000000000000000000000fdd9702ed88aa857254c3ba50b484bfc324e583659c57055e4b09eb1662af2f70b547a1eec139193a0d3c75b565d3b200000000000000000000000000000000193df0fbc5f24065008b5e98c4c4bf9f1e743a6ee60c3700ae4a9108639e540384eaf1f9d7a60b8b6a5d79e1f34949f50000000000000000000000000000000001022f8a254d17e448cadfad35b7a54dd2fb319c8f9ba219874bd8280a5077301ff4332d731a75646cd93bbf31331154000000000000000000000000000000000ca1eb350844ddd0a65a4ad56e1a96821de2c6633a4a45be976577c223e367853e2b1ecf2cc40b8595ba5591ae8e40f3969848f1b8b36bd28967b762168edb451322e2f0c4b99b7f9112c9a66093fb3f0000000000000000000000000000000001f9cda056a0f8803be581634562e975223b5311f4752b189cb6bd6df1ca5e3824bbd2889b9b93da59e4f08d482734240000000000000000000000000000000009f43c25de25c5d76ee1a03691aa434de6a063bb3a1133b045797a279346fc938dd2636abf0c4bbcb528c9c28d3105c40000000000000000000000000000000012afc29245da8bcd3c0d96c4ee61617cd9ecf42a47c2ee822003af26aeb4e4de8e432ffb6b2d8241090b814401a8676100000000000000000000000000000000053edfd98742dc70d510f1836fcffa6a3ba9ffd4904c7f5559b48e49dd21071401362d0b39bc0d786b7ee2e84a76af0d957ee08a513c5e22bbec04722575a9b4f3a1343db0ae5beef4e66fbbe1ac90440000000000000000000000000000000001dc3f016ea1a74ae50c21c1955ca1eb4a911026a1e72b316c7bbdc708caef63f0c1efecbecce8901d65bbfcaae429da0000000000000000000000000000000016ce9301888808323c9baf6402d7073fb85ebcd389334cc69d7947e345748ee44b2d6aab3ef818beb21b54a19ae4f5b5000000000000000000000000000000000c49817753eb6459cdb4bc737d3710b5f044bc544c8d92c8ef138ec9d83889664267e1a5691f4bc3fa235ecca2a973a500000000000000000000000000000000074a8450e35f1da18e6de05960e21b7059ece8972c36f000bba9e24488730a44ce3ce200c437e06703addb3b442a790a8e0cf0f590f77d13819001916d2c58a654d0b9d3c47c842f2d649cb2570dc0d5000000000000000000000000000000000bc1f2e9af093ae8235c93af098e692e697ea0ab4c8f53019a6e950f7072b56d5eef6b3237710f1dd1cd1970668d06d0000000000000000000000000000000000d9a63f7a13ff9755c6a3832e3c4c852919514523092367fab7886cac317e564d57fb4042ef40e696edce868e697c45700000000000000000000000000000000129a30657466460db13575dca367105c27d631eead330319b084adfac591f5b3b94988925d778e6d4645d1d2816baad00000000000000000000000000000000005ad64d6e761a9a301589547929f4952ccbfead278cbf6658255a075966340f185d5f356679fb02ff2197468ed7de19a71a8c2a479dec43d644ec4113142e666bcefd6d729d4faccbc147effa836ddab00000000000000000000000000000000077d1e5b35c224e2cdc849c02e800c0b80d1c19f3d74d9eec34c40f56bbdb9e2b5d2ef274991dca843755f91a50826fd0000000000000000000000000000000014f3b653e0df0c608b75dee3496a7af04a828e6fc5604f16ed49c39686ec757e96adb0a667853006a8331c3d63ae4ec2000000000000000000000000000000000aae011375b337940f2a53d9091d3581e8197e79251b19c7fba01de987721a9d6fa694b7978f0abf877f46ec26147c98000000000000000000000000000000000aaffbd468a2eb86a3cff59e2e9b7ab88286d2bdd19c2e789b1a68810f0cdc76171a2661ab54e81b17643ff0275eafd72d2d59a7f138327a20263d6338d2a92fa5a2f741daefe9aa81d06f20a6fe3641", + "Expected": "0000000000000000000000000000000010a2434fd3150f6b9b491d3a51226bdd457504077ef2ed5a11ceaa8284900d1b84039a34d5239a863809369bf20a704c0000000000000000000000000000000007934f34fd50a98225fe6578d3f34ae5e5ef5e104bb9cb398b2ca4f09048ec39cf52e7fdbac48d45212e9e4c1dcc6e120000000000000000000000000000000013ee70f1b52cb8b07ad957a7565b3e3c56306392cf7b5aa29047b23e5b41fb3239ac3611bcb16ba7c7ffc4213e3d9cc800000000000000000000000000000000035840f8ecf56359dc3239945720ad08702b4ea8d0fa9bea3bfb234431df4618e960a1eea87da72ba4d9443f14bb87a3", + "Name": "matter_g2_multiexp_14", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000d04bb9b75bc8078ccfa85e27d32e137ff5f05f9241b19ea835bba2fffc9255a4a3028c0caf9c32d3d27666e1394fe820000000000000000000000000000000013f59c3d8aaee34230cd7715a32e4a45487b9b16ce68d178f95461229a4d0fbe7d31edc7208a7338eed08e65847f8f29000000000000000000000000000000000d63ca2bafaa54e93ea54846b26f88b4c6749953f9cd00c670914cca279b794c1fb5e2664fce44b8c04f01c68698a8b9000000000000000000000000000000000b5188b4b7ef78d3662baa01b1813b4a0b0f855e11397584a460d56f594f11ff2e5d708a23a8e64d0ab337c7076872527740a826d524fdb7969776bede5ada468a0115229152907cb2b050760c18c8e20000000000000000000000000000000019bae57568c879cd743f7def43b6b994f29782c6a0c74734f35b97042a916da00daaea34f321481e6cc4749e23297c1c000000000000000000000000000000001853fd11d4688b027146a07edea647502e80750de4e5e2d105faad3f71ccc90badcc750f76f1b02db3bc0a1a635b2bbb000000000000000000000000000000000b1e45b90e6a7032179236f13f01ab664c32ee5728414ac0d6b9d79510e8c5bd0f5b62e6c59c1a3c88998bf45636cbab000000000000000000000000000000000ed16c2f88b5b8d29d7e01633e2876322caeb740251b034e5e898919f836ae73f0296c62253a0329ee8f71fdb5cac3a1d226f56bf3935ea95d976fde5790ba0584e5bbc78b37279aed8e50389899b9e9000000000000000000000000000000001455764f99e5eb0e0371e89f88bfee1c43224b9b5202746bd151f72336285556acc5ff36bd8ff87378249e82214cc5e500000000000000000000000000000000007fcee74e5335d96714e4d1a7c6f5c211b1a460efa283e0d0578c6c1f56dbd252198eebf0625362973c40d95fd890d3000000000000000000000000000000000ede26cf87e604507230ad996788e85799cc07245cf7191a6c3cecf0bfd5747b3a277cfbe41252808df6da19f005de9a000000000000000000000000000000001855991a4dd78dfc6088e6a43a64b56c8d86a0278b899bc8a1979a40a287979dee567217b006ca71374156a96b79c176c133e1989ac82e4d1c9852a6c7156a34b05784a58231d59e3cc875ac5834d5c8000000000000000000000000000000000cd032a7dfed029af020bfa249e6adccaaf5bcd2ccf33736281c4fce9c6e2b2e87fa828cc20301269d8e0579ffb866a1000000000000000000000000000000000765c4d6c4062cfbf7e24f9772dcd812f7e707f2b0ccf9043faf10018326834934df121924abb74d736b0da47554794a000000000000000000000000000000001540fa51e4580ff73e58def90a6f19557dec3c8306e2317ba0c25ece3eb4f8c39beb57741b3c4b9b8554fd2597743ce6000000000000000000000000000000000d875c822d0ce50dd638254cd4aad5dea1443813689a940d72cfa5db9309b171299ca3d69b137dfd37f0b7538a0852750fdae1b53f6442c4378774a981c90d282d5f8793feb2334470c873491e41740f0000000000000000000000000000000011c230689175cc672c25f3c56ef4eaf2bc5766ce424f6c596b40ab24fdbfa56a955205419c149058dffa4d86a48ad35d00000000000000000000000000000000078d493ce3a8038134541ae5f2a82b5e0590218a499dfd78c7a9c06b92307003fb62d6414d6c04b22f2877c3de0b65ca0000000000000000000000000000000001d53c22a622c5d91df934783f8c0cb7e370043ecaf99a0554987e6c5120a0e5f4ede023a9ad988d30d945a2132ba5770000000000000000000000000000000015b1f36a00fee95e13443c9f6e67935a840cedc7c3fb7833ece8e180991909922f59d4f4ecbbf23f16bf5ee7f0b5851b70f1de7cc5e6a2cf7dd4b6e60ada67ca47e7b9417bb5f599048fb0c9b2abf33d0000000000000000000000000000000014adff1607236910597a951ae169a7f56d6a3b4e0f44ac63a247716bbbf61feff7865d075f79e4108cda6c0731fdcfef000000000000000000000000000000000d740b13885c268da876898b77914bf4a002beef5bd2a3edefbf366e45ebcdf593ec6d9ab21e983fcae9a0832986182d0000000000000000000000000000000002a0827e812e983898351d9f03f660317d41669b0fa378e5c7667b73df299ddc4a32a529ca887a53245d7e1f946623b3000000000000000000000000000000000bf09a2de1a8ccf24a8a65dda72adcb96535ea7235de87f05d27341738b0b4ab16afbc5b37c97e255118dea9bf180ec2ca82cffdf59b742a736ae9a6d36f7840c46c20c126ec054f47ad52a22948d7210000000000000000000000000000000015fbbf7e8c26e2f41be32daee2c81390b9bc4413aabb053e3a88bc6117377bc16011e81ed167370b72f84f0e77c2b8680000000000000000000000000000000013d48a27d06ff00048b19879493a5f8ca52b7154be2fcb468b9de9edd1395750434b0e95ae6dd941e84fd6d8918455bc0000000000000000000000000000000012fd2bc91286dd46d68d87a3f8793db997ee684dec6b2de1c4202e5e7eb0e4a8a21222e3dcf80e1ae4a3a92474107d330000000000000000000000000000000004d8b71978c9025dabb3d1b1b3c7f4f13f166514b8b356fd064842269a36c6f1c07f150c03510af7d0913103afda4a68fad69492cab4ec7eb89ed37f1e7fe898ff49ffac4ef2aeb75d9c6b544109a08f0000000000000000000000000000000007d679ac21bd4634b415ef8e0e3670a8a1d673f6a4f7f3786b92d55458af980b035e4dab165a3b773ff3469fdd9d5135000000000000000000000000000000000fdb82db6e1096e73322050f828ba41b3012496a4fc4cb481f11fee338243aae20b205ee06887e28f6ba6dad00445f9d0000000000000000000000000000000017e6894b48f60b3d9b4184d58ab9554851e285a1d445b4d97cb1a7ed5a984ade8b0f62ab11ca75fdb280cc0e526108ca000000000000000000000000000000000c03b61690cdd9a4c6c83d03749db72c8946c21a944fb292866cf3a2dd1bf3dcd95743227709740ce8124319d0a540555af71c9baaf54967683f8553f72abf789da465041ee5a92c9ce1ad562c91c4d7000000000000000000000000000000000289f850c4834153f36bfc4855f89e9437a172c35a856117f8b841e5ad4ef973d3aa33fa73d8dbba4b9b2101708006bd000000000000000000000000000000000700025f22c0460613c05f8941f8a79a4319325c37c2b8f099cd910df5c0c27121a9de0e40adc7ba0fda61ea637b47d600000000000000000000000000000000069e17e00d4d726e8eaca8235c88967a7c093c70e5a46b1863ad097acbe233554048838a0a486a72cbed7001c83a27db00000000000000000000000000000000016ce4afb84c1a9e0216f23bcd2dda0bbada6a4acca78e1e0d765a5290f6f4929f6d0eeaf1306fed3c9766ca7c7268acc7effc9a7fe773a420ca430c58bb94e7baf26b9a97b618a15e7a18b31e5914f10000000000000000000000000000000018ca46a89dadcd3b54f60fdf9a7b97c95b9e0668ed9329bbe4121e588a1ba773c9d086dc35b699d65487f428c00ad8c30000000000000000000000000000000003ada6835a93310d0ada01bd7fd6778bd07e718d1ce05aee2b4990bf32322fa94ca898a531ec6e3b8cd7ae3bdc77e0b70000000000000000000000000000000004a8abd2b9f7449213e63ecdb435e5e13fe2aaa31a2c38673a6adb5e96f4dd383dacab391787f6c17579c78a1cefa5450000000000000000000000000000000002a8768d98ccda80149a767e9b5a3b0bbbc0ab4b5f696522c8f1c664f1d27f2f0a6690531672ba2070355c0e77095dc02d5a3d0370f4a58c21016d208609f1d3e7cdf43abdb85199bfc67dd12f589b8a00000000000000000000000000000000048fb58924bd5952d3bd7b1cd57a1dae6c1034df3a420c1151737f88760e4b0e78fa3f891a0dc32fcb50f89e67b0f08300000000000000000000000000000000073e9723c80eae7685db774d3e2bced53a52f24504fc3aff98e2becf8d59c6e83373ed024ec1ca50101d2d613abd286e0000000000000000000000000000000003b64c8e9a1341bc6a444a871843b3add7dbf04bd1810e1d6da7d31c7c2b7a264c362ac9a366dc8d93bcd9392c6056f000000000000000000000000000000000064462d424e54f50e9849a2bba1b0caae966a8618fda0f8965b1a841dd2173872a44a18ace1e2aecc8e3546a9558d7013549b86ed3fb880269be22b9cb8be6f24385bb5e24bba81bce9fd5b72ce2ab71000000000000000000000000000000000c40c8da9281a8b43478c28b2fe59a3cbad0a818e2077d40cfe44624dc2e46f72d4489cccf63eb8460d02f895e78edf5000000000000000000000000000000000735d768f6ac999a47c88bc2f3375f01052259dc69011480e468d8963ea8eda74726c4ef32c8feba52878eaf5c0147730000000000000000000000000000000010adb3ad214b17b963586a10701934727edf05fcbdc94d98255632647d73536decd0c91363840e1b55f29f7d32f650410000000000000000000000000000000019349045e6fd25960c03336888679cb53409027f35a1f211b40d24ebf724866c085a978ffa3a91d989da1a7902bca018c8f6dd56906fa13144dc87c31b53186b0683cad220ab2de89d2fb515bb269cbc000000000000000000000000000000000a5d2dcc05e218b0633e0a965b6d69a3c6c1c7837e1fff7ff75cc9ee93a112f8e34cbc95bd9dd8fe6ed22f2e9221aa110000000000000000000000000000000017d2e5d2c0578b1ec26b57c3305b209c979bba6925756892f031a7462ec44e8a4a2527e6aa2fc13bae91dcacb8c7a30f000000000000000000000000000000000d437edb45ace50700db548db68b9e8376b3039fa00cb98dd00cd197c14d0f92c8a3945127c43b10b34bef7894fa43410000000000000000000000000000000010d5a2e442a2eb35aa85fdaecf094c1e1f307dc9bcc540693d7206cc4e0d050ab900f17fbdd0754b59bd2aae705c60149ec934eddc44729d05f193ac927fbcb022288ffb2bc7d4f46d1bfcc7efacef940000000000000000000000000000000016c36464b426c3066aead1aaaf65ca637e93279e8ccc9d838b9b3ff1aa7b896f36de506efc2b0864763cb6ecca4926f30000000000000000000000000000000006d88d5764fc854ed7d7cf1c0e210496ce347bd887da2a149a09679469e98c453d85115afdd2fc4987b64a88c4a6f0a200000000000000000000000000000000053edcc0ca4c205423ee6a7031939379e552bd2d2657f8f25370c9f0ea0a947e77f18b5f218f98d12d720667844f3795000000000000000000000000000000001292909190854cee4499faa602af99dc49d1354a71278b439e983bd89e6c504fa5fcaaafb6ea26dbeba9850bcdfc1f69bd211ec887635ca841c4608fd00bdc0f5fd0f6365dcdfd7d6f4c36f4b25b5b1b000000000000000000000000000000000997e79a7549ada9ee0233b3bf9289df3ff797595f4b5eb2e7dda6977ca981c1c4a2b91b924812b95418f1b1d9d0cb830000000000000000000000000000000000256b830e80f238e8494387429d727a91cf5d323ea87f7dc143058c05e11858796adcdc677429d1db4dc2415cf23808000000000000000000000000000000000cab529c6b86beacc57c874f07108d1df7d98fbd59fce44c48afe9eb2dff823f4869b620bbafc121b4ead2cf244974de0000000000000000000000000000000002774906c1a0acd87de224a9450617db37f8f36a0a192f5daa2774eff0b73aa79b4804342999df761f8572974c697c6010bce61d4e35770e7737636c0f9a664eefa948662d3d22d1f1708fa48d3043de0000000000000000000000000000000012abd02540073017011e186586023adfca36fae454350b2015a796b7991eece65b63964fcdf581b4b51dbd7ddd506ec3000000000000000000000000000000000ccd3f2d9280908d4b30e924e4a862810a92e1a880cb56e842a94a2a5120956e8713f548ca279d66d06ab23e4976e54e0000000000000000000000000000000000c052ed00fde2cab515694d8c004de910e62d07c462345ffcfbd3904a0171b970bc58d99c5833059315283004f3390e00000000000000000000000000000000008fc4860366074ec0c7aed2c6ffae7c93ae0a81067edd8911b4c53393ebc0f23243823aa7aa2b2e987cb510f6e0a55a65c86930c1d142985bf85ce70bbad170947e850e5c6ac7803fc45980dd37a57d", + "Expected": "0000000000000000000000000000000006ced307065868b6d082bd205bfbaea3b0a8cfdccf831bf154563b5a942154622b0d7689819b337479480d19aedd85e4000000000000000000000000000000000c0f04fbb26cf85c2c22763f3e78fe255d8d1f45ea47232ab58f5b785ad9f2458b0b28f3cdc25c4dfcb47d59957ae10700000000000000000000000000000000120e38740eebbc3eeea9beea483e70d6a9c30a5abd61b86e5f94bf65ffb40fb92c8d246edbeca425ace175f79c9c8afd000000000000000000000000000000000d5a503a26e50f9be34c2e64e4a80402ca6e17f09db1b334a9c1f6318f3e7e63b3847a7ca38ae6aa7c96ff94bf5de842", + "Name": "matter_g2_multiexp_15", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000036480931a5a585ea54b6dbb01759eb1d86804e3f03326188c71f859613722e662c453096431171a49eecf8653f14d470000000000000000000000000000000015fcd6a30b9d59a90d8595ca1758eed7d6810d2916638dc2cb637aa09b16b5ba4920df7d21fc0b923453a6c7d32f056b0000000000000000000000000000000019aa4d8e98808c2fc1273d383e836876b087ad5a7d01743bded01314bc62ced94052d75d312a18839c1b33faa9e2e5160000000000000000000000000000000015747ce0f1171c0d0ff1fee9dbb2e5673b9db0b0c3618cc8bda474f378db58ea42184f907593f3d6fc2fa215cabb7b2308e559e394a9c1ff07a45bb3e022f9c212eea4ee5b77db1c5b93ce72c0512b79000000000000000000000000000000000222640c1d64948daac3ff93e86ecc96bcf9c93559266529a37ef1372a81952431673d69f1220e07b8aa0a4f3164c83b000000000000000000000000000000000db593156078821cd0ce0270e8a444d0d204dce0583774496620bd4752839f3451e505aeb3db568048739c7e71d279b40000000000000000000000000000000019932ad2c7e857c2dd51f7846534050b9243e388260cd47a91444fa050a9154eca88ab4d29a37def16d4a11d35683f2f0000000000000000000000000000000004d15ec653a72256ac6b616e9870b0acc7d46286893c0eec523dc27bbcf5fe596204cbf83ce71c2690af67b3616794225e55826db8d12169a31ca27beec80554954f522b56f7994c62bdb527c2438d5d00000000000000000000000000000000180622bfa9a1c452f343ed21a3e9c6fdf76589cebfb9a3f0a53782a3e7c9d066294e10699c386b5d0525003289f0ec580000000000000000000000000000000006615ff63c856302dba6d4e25d1070fe873e0c4950ee5ba8bbbd4b94ceeb181f1ee450acfd22f21010b88f0b88375777000000000000000000000000000000000cfd3940b5eeefa92d775792affa34371d13f3098ede3007e06510344ac8483debadd5a2baebafb5ddcb45a9449768b200000000000000000000000000000000145be0107a1e3acecc89a116668f9887579ed7a72abed3f4236930edd3f18974465c99ada86c4980c88768824216170f1362e8e39ec661cb3c5af64e0001cc94701194344a7404f1ecf7df0d5633eff9000000000000000000000000000000000820e74e6d0333b6b36590ebae78960d019065f1681ce68a2a01a2522496c840c668575a57f9fd0f50b87f928a41b0de000000000000000000000000000000000dee60d90e96019cf2bb552d016419e92dd358ff97039a61838b0a89ccbbd537f2b435cd11f7b6e75a4ec6675964e7fd0000000000000000000000000000000002ca767de9fbf8af7c73d41a07e1c0e38e3fc971472e11928b65393a27354b2d732012dc57f498f94c0b933565a7493200000000000000000000000000000000134fe97b24e153f0e9a27d3fe7b89999c6a19e353325e0746ead013198b8e00ca6472fcbd2a112aecb9ddf671aaedd9174d3d66cde7c4c8a4499708a0c6f7c4da458eb970b6ca87e23601c702365b6de00000000000000000000000000000000031a9c29323196ef31030ba73827d228e56fd5209eeef0803a189e0c0e5b186ca1f342483eeac99e1e1b12cf490856460000000000000000000000000000000010deea45a01370602bf57a1f81413e8d3b337d7a1a33f9525e4ff7003454d1da2cfb1a9b42c4a654320f91fe7d04b6200000000000000000000000000000000002bafb7b7452a173a3971c2ba1768061a043307d2c32767056f18c1bf8b066176937876a87055e54675876bc1b2d2fc3000000000000000000000000000000000b5c77dba3b4136a7efaa8c2e28f39e88afbf26a7313b52ad6e390da4d948209d96e39aa08eb52200dfb890d7e88b46a389e0d43f2006449fe2de506dcdba4cd0e6077e2228f7d8b6ec9d8a4129c494f0000000000000000000000000000000018bd1ea5ee8e39c43d442e9c6fd22706e582cd80051f18334c4db2ea91ab019f54bc0074c8f0e52e50367197a797e7520000000000000000000000000000000005c0bcd1b047fdbdff25b138248bf4da4c013beff7dd3030c348d6b2b8724a147cbc44d570db5c4b273c94d0b99bc2290000000000000000000000000000000018e033935c20be5940863f7e9e39fcbdc29ba031e58c10beea90cc48e9da9988fdbf108bcbd87948058f386928f81fa800000000000000000000000000000000107d179204db7b288315e8aed7b92ebfe53b7ad2366d5d7944b3df68d9d9faad023e477213f85214047645bc05fd4cde5f8dc332cb31e43bc2e551356cb8d1533c6e567d34622667e7e4e3ddef352f03000000000000000000000000000000000a7b364fbd3bac7e2f2e7ee501db2d248bd73a76c2a12a3e51718b56ca9a8ded14b83b8cf0b5bd46f0c26896a65fdb15000000000000000000000000000000000eafea7128fe20ddf740a6396bf18ff5f2652a0317ea9b6e934927c3ee95b59c7dcd51f7c895b3989d40ae5f78ca508f000000000000000000000000000000000bdce57be904236a8df532c2c0072165b5cbd4103e9061fcfc0a45a67e4b25d11b9f816f63fc0eac4d6d3e10d2764c4a0000000000000000000000000000000012419f94ddbd8275054f8f89fdc27a74afca2eef314393236fca65705354e5cc0a470818999c96b5087997813823e9be0dc7052044251fd360538fa6d5dec9fcee53faf2f07de5d8df212d04f968a0b60000000000000000000000000000000011e4010d0cd7855a92cd5d4954ad735363c0c2ab00053db5e078f34e772969d8c492892329cb95ea8893b4b7ff7aaa5e0000000000000000000000000000000013badc54d90a19b84d76b30fef8e3ad2cb268204fdaa50ae951b63e48aec9cc6d585751dd48e4a8d4659b835f38f8da8000000000000000000000000000000000460728f686b9b15cc19ef135af71312e174860284c3f0e7a84cf85a5c934e2bb6cadee8e482d88afe788a796605f79d0000000000000000000000000000000019a50c06ba307d83452a30fbd862270652cf5c7a09b150fcea858a8102ce3b1e9ec13b6abfb323d63d2c4edf209c7cafc579dd4f361fed9084d9c66a3ec4c6af5293710ba5299df3abc4cbaf5802b5360000000000000000000000000000000009faa74f66ec0384f0458893c0026f73688c764e8df9ce056a88a2ed0b84ed8f88d1b683443a3269a3db838f8aeb808a000000000000000000000000000000000949c4be2708c1aac86aff39290ab6a8e0f332e7a098bbd64227a175473d9dfe136e07548b282f69a94a15e2c32dada10000000000000000000000000000000014f2c7c7da781e2f50803e3a948381c3c439b127949f79824df1e5722c206efccd6c0ec5dd75ef63d8b1fa301c83356900000000000000000000000000000000176753460d241f38aff41bafdad51688ab0dc9a5fb3643977c7b9d282ad4532fcca1e725715227780ec28bf1c32bbc1d69f0f3c3f516ae34fbecf45f4636c22acffbee765952b332c0f3d8cadb9c93f10000000000000000000000000000000011982264c8c078518cd0adb05034761224e9063654904e06fb5e5a6eeb1f45e4ff3da661f1232693b79336215dcc0cc40000000000000000000000000000000010c96c872160d2de03a16e85f2828d0cf2dd16a3389effacce46b5b5eecfea1042a77de653da5a1c0380a84c435723fd000000000000000000000000000000000a4ad2d9956bd407c555b26c192c6bf59bf89e40d9c6f9c90780bba313a39db71a73e7633397d47a3f58f61c81edee77000000000000000000000000000000000a7f912530d27a7bf74e01d8e48890cc66f72d14950554991ed1edfc504062ff6bd3cb6941bb398df9fde3cefd33fc0676618f1954730111e572937cf0c9f7b3298a11d18cd890cb419f732c766bc6210000000000000000000000000000000015bc12aa9ecf417fa5bace8d9e5dc4a418555eeddde1da8b624bf7d6e1873ec4a257d5f6dfc058a8d9b02528e699abb70000000000000000000000000000000015b41567f8c780f83342449f27094bc20a839602ae482de14b92e40017e7acac8857db48a2d27f1f1a625883b6e5255e000000000000000000000000000000000cbe79ac0718555fd8fdc38b68eec8be83b32499d2654be44888e45a2d610b0e81ae12fd56550524ad85b5a632db32ce00000000000000000000000000000000069f46b5baf4357d8010869685b3828c0dbf6e2338598c9b42dfecf0b22d803f95fca716115f74c77778d414cbcbd881fbb9f2400ed1dec7ea63d2b26bb3e9c2acf70117e3026626f6f88a07876177880000000000000000000000000000000017ada4038189c544902167be958e43ee133730e5cd329e572dae2d853b694f5ff8032bd9ab41cddd11c51e8284970f810000000000000000000000000000000013eef75e6d28deec945ddff33128c199fa52565288d63677c824b8d56a6c29eb98d34c5834e84865be35d40c1c59a40c000000000000000000000000000000000e2fb4f9c7ba6bdac1d4ff5055be609abef7fecd7923a753a704da537c0ff41951552420bd78d14cf972dc84fa3f5dd9000000000000000000000000000000000805376b814b8a59435310d49a43081dd7ea36dc7dcb40d38068ae9085b3ea9a3b2249234234cacc76724d8ef84a2eaca0170d7b7604b8951a95d49b6697e2d0cd2a41c3671d8f96e936cca911dd516d0000000000000000000000000000000002288860f2d671c84c5239313b7f6b82e31c3976e6d310e15d3bfe1c566e2ab5d86ae6ed0df02530f9f7893ba419f1870000000000000000000000000000000017365bc096e260f8dd7b189fabe10eb66923783b41fff70a149251576b3b465c13230dd0af13cde562751dacd8298335000000000000000000000000000000000fa8eb9c818df27181b45a74b333ab481dc7212e417c4e12634816f9e177064f9e1101deff26156d26bc6574db9617080000000000000000000000000000000009379598bf02222e1ec37a721b9ea31a3adc33524c6a41bc58da06caa3da3bd730659f0a80f793a0fcb9c07b43ca929c2c2afc06f19e627e9ec0edf1083823d30ac569346040965e1c92e0c15011c90b00000000000000000000000000000000136870e08ff5fabf36410629ce5c23470eafbe73a7dceb633df5c1492e39445b86ce15c22bf4c421cfd0adc6518e78c30000000000000000000000000000000010aefa3cdf1225da09b796430d096807a83eb2fd5a58db3a4bfc5e500dcfcd472fea3077f0c059620f4ff708f37c95a90000000000000000000000000000000019ee2c62ff860338af623c535979ed31c42c0d0b2f82cd56c153e80e6d92bec9ce39bc8e8f285d1efd1c1e969521dbb50000000000000000000000000000000008ed69eb0a16c8a35d507bc3a50bfc97e18143fef611263715aacf5400cb1aa285b6d2ebf2ec219d2fec477360875a03141d0ff346e46a20c2498a74f910e9bb2d5d8530afc7ba47c3525861c9e8c5920000000000000000000000000000000014abc4eec64f2611197d0c1322c3248eadb725049379e64682f2b3d7f83f7bcea11358d88f52711b3020924b6ddd84790000000000000000000000000000000009fd78c5d1d2043d83be30a88f046f5b633c6dbb11bab25fa3037bd250b6b9d9394327aae25d1939f777fea9f3df46960000000000000000000000000000000010f413640aaa16a95afba98660f9e1b03a8f3e0a7a3d7f2b971f71b5e3d09016ac2b410f97d20471f48621d5a363e9e6000000000000000000000000000000000154b5df93298a5a14a6157819e38db33ae7f2d11dfd13f7f2a92b2fd9b053fbd25f10a8c45db3026f6f583bd56eee0f1d688a1aca2a837e0a353039294a9988a7111ac134a6a8a68e4f881e7486025c000000000000000000000000000000000f1893df99adeff5e4042c4c5e8557e53f7c34efcb2a7953d5347f81d2f4a75ca0273a3845f54e795ac1c1f8ae7240dc0000000000000000000000000000000004856b05d58898be6aba07fcffe487dd895144c7ac8fa8bb1a37c61e73bcd062ff541d510e24c5bf005c8351d3ddf61c00000000000000000000000000000000178b22c2c698dbc4929b119474a741ef44d6275fff5ba058d9debe9475e71398e464aa14a6712c5deeb5010d1c7758ba0000000000000000000000000000000005ad09389c35c45f349e6dcaf1cdb3b63648b3df427ea0c2a371f45634635f9253957ba6987df4aca6cba4cd472308a31b59c33ff02791031e7a9424c781ff17a209d132af06f5b825df363fbd902cd4", + "Expected": "000000000000000000000000000000001090d83d501373cf07c75effb1c85852019b39eb0d77226823aa3c1054d4e408e82fbf0f4420a30144c611fbb856748c00000000000000000000000000000000120a1e3795f6d5c4ed5b886256c611bdd209677f8324b7091cdd7cab11788b1c0f780e8b4c38b84d7c2ea528123d4783000000000000000000000000000000000d250df34d906ed421eec2a78c2ff4ed4eedb717358d7ca879d58ff5b4d2d72521082dba6ac5d10859125e32c2c8b490000000000000000000000000000000000476adaed9d80cb1545be505496222dba1f0ea85d38d5bece0663461e0e9d47abbefe95303c926db008d08b8aa162e27", + "Name": "matter_g2_multiexp_16", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000e1a9066289392b0b0b8f0986366c2975463c9cbe7a74f2eafcb3b8b6d4ee3226ea5886aaae374341bc76b53b165e22a000000000000000000000000000000001557cd01b61b5f2361f6b558a87c67f2778e11c21734b7ed25f72a88cc62cbed396d583de4c2190ae6bbfd096c33bf73000000000000000000000000000000000eab68305118d7e7076043719ac1e13ecda4497df2cf392d6aae4b7753f114d30aae3e8535742947636901feac4b620a0000000000000000000000000000000002cfe5014446556b82d60adf874cef25e58eabd035deb4717c93bf0361f37a4a67aab70b95627326bd97f111efeed57f58fef5bc887b7caf72f2a533fe1455ae523841bd49b4adf16cfe87edc6f573eb000000000000000000000000000000000c8fa30f6055357f6b697f2115203428b8005ad03286d2b3c805bf3d4dbb461c30e6ee8b0973ef41f884b91e857c53500000000000000000000000000000000005e1c785feb4c4fb7e960233d431d51a4fe471f10321251d018a950374d2a686d52ee8cdd855a29e770bdc1bc565f471000000000000000000000000000000001158d31faab483832d39f5431a5d8aeb952d6a63b82ec019f235b5b2e5580df8cd91b46cd53d4a90b9db354b38c5a1710000000000000000000000000000000004a389b09be6fb7ffd14d7f3359b17991e93d92a1c0b9a89faceaf71f5ce77a1875aaeb7a0ec3b2dfb363c47dfc9875273b243b83d44158a66eb6d31e7c4ae1f4b3ddbba81b2cf9a654ca7c4ea2147ad0000000000000000000000000000000010587118c5f90b545ee707466ea2c5f378e6795c260235cdf9876aed8bd753aac592ee05e23882ee77f4a13bff97f5940000000000000000000000000000000000a0344aed244b90c4fb9ac337edb01429e09f951062b06025a5212300f5471a95f28e09bbc715417a6d98423b518c3a00000000000000000000000000000000128457cf374e5b8864b8241f476da093f48553d609a5f30c0f0f235ecf7127231237b6c8802f2904a8304c7c237842620000000000000000000000000000000004d55ff04eb09b33ebfe90f2a0966a1b59cc224215c0359a4ff0c09e60f9fe7ad8342868184d8cfcaa1d8c28328864241ea87af09f6e62111c48993c408efd3db9ebe218ac68f61a461ad9ec1306873d0000000000000000000000000000000019e6992c3da47715bf379a668a15668508e7ad27bac647490be8e82759b9b79c996735aa1bfdc3cef217750e4ed36fce000000000000000000000000000000000828f782c5bd4f2de3570a4930db2c020f75f93adc98aa0e48449d29c7a3b0d5c349963d956bab7f985ba6ffe59c90ec00000000000000000000000000000000062c7a730d286e895c57b75907713ebf1d20650b5e621f270f1d22a2ca480d022346def4102a62eebe867210e4b6122e000000000000000000000000000000000d6c29462ad449ee6cd122e3dc00d56dd5caf17a2510e5305aecfe85626cf73adb401ec2192eb693158650893fa67412a691b9635e38a46e2469811405ef6325ae7ef88a67c1d1c5b05806da329f27e000000000000000000000000000000000098de9ab41c289a05ba5a774eafe27d91aa8272fe9f81fadefba9a0cc0e31de20f808ff454a8647c44f5aa632742af9e000000000000000000000000000000000c96019bd5cdd62df1642656f0832ac8ff6aab86f671e18c1c7023dc16b8ff54a8e3e446b19682a23b73ccb90da2fdf0000000000000000000000000000000000178e3b4366b2517d4c19fb40551be6979d46319d7040682241b046f10ab88d269dfc097ae02952d46e69cb1cf159da50000000000000000000000000000000008341bfe1e2fb999f0c3f4e79523c720edd332401f9dfdb8dddba8d1342c2c1fb20ae2fd9dda92c7bde5a0c95ad971f80d9a35f474325d0f065442805cab3beae4a186b252ebae54a567dec6695588f1000000000000000000000000000000001004d60af8c21f7c62fcba1c5c41b94fc77f64b89abcd23a218f0da8f47d2ae6879ddcde52f3e6feeae2dc7b2720577d000000000000000000000000000000000b8e8a7da87aa62ca852e2984b0f12b85052fdd03883f01f4496df0835d1cafa48818b5ff1e3cb0e9ecd66054540a0d40000000000000000000000000000000009c16854580ad8191e3e80a0afa8da759a8b2bfa7e0d556418b5c96d97e88a12fb75a91cd68c2f4336c3ed7ac99199fe00000000000000000000000000000000195ce9c562c460c7e715908991ea8b017b81561b45133427f63cdfbe8f65202bdc8e8958ab0977b3a244cfa32fb35f37c20e998acda67d406a238f16bc2b3066a6d69d2436577b8900a180e6a71b0a01000000000000000000000000000000000107292f77666064b7d80d73ea8f3b623170ef79ccc7c228b8366675a422a0cb8491586a2e4ab1a067c31396cd670a8900000000000000000000000000000000126f8136dd61d61b2a9c0f4af3ed44a3cec3ccdedc74821f341d200601a7bf0a17079c824de6cfe28467e843d0c74d2a000000000000000000000000000000000bcec8afcc7ee56b36d6d08b51f61454c8fb15ec5baee1117ed55af8fc85f68674250334f79b0fce632e75623dd173210000000000000000000000000000000016624d64660b63b70ed197f6a675911b02b0bc6f880348faa6ce4727af74127c509ce8535d8dc8db5ae2d71aa497e0756fb773cde356e2edac3afd2bf703b59161162dc1e915873ecf606dfc0e6efec5000000000000000000000000000000000f57747c20e1b3923c7e1d8bd7d877736cccc0e0829837a086d62d48cb54f323d90b57ca3339fe4b256df529bff11363000000000000000000000000000000001940327a1b319dc4212e7a553d3f49904660722c89636f6a38604d96771fa0fc71f57674b7aa710db4275822c2b89903000000000000000000000000000000001956b81bcf961d16e50c053ca07ae67cb8597138f34a9dad4d82e0e8d23a7e08b751682d588f229311bc63f9598ef448000000000000000000000000000000000208981064443e8c72987945e399b45b74e529a0bb75e99b7d6744728e5c182a6b0a10e449147bcb0b0cbe70edcdd845bffc1a58dd06752a2a77abab835d089599b4781ae51ab998ff3c5b68329068bf0000000000000000000000000000000018c35ca3a63053fec853e8fda5920b560f1be28431f2f4b08789c7a202336c8905a5ffffbf69ae4427f267b1e13288d60000000000000000000000000000000019de96be76bd93886cc486c2671b5b0d731b568638b1b830a52dd4c481b9a1fbe2b3cef14b46e25f1188ddb3c158da6e000000000000000000000000000000001813ab16a11c79eb3d3d47ae7d9a7c05401ee91eb1183266d23077ec4c0c8f3ac7188eece06876025dc3fe271d65d4ba0000000000000000000000000000000004d2a416dc874e956fd6d29a3fb96195019f4136561b4c127541ac171b5a6b229746af6d6e535a8017e64ce06709e52e57f35cfd74f62fa39f919400f4d692855a4b4e9f91920e4306ebb2e772a484f4000000000000000000000000000000000623b7a8a1c24dcc603f01589e6679c74c4ed3452894e536a4cea69e99047092acc877dd0bb395b0cb693cb1702a64a00000000000000000000000000000000013de9dc75e42f12e905d729a52f25bb1a4125f5edb435734649281bdfd41083716d0797b0a80d842c2503d09cc61162a0000000000000000000000000000000006453c06f56dbaabd4530160bcd5312b8a148dbe19fdf9f1e44b7b047a73ee9ef9d981116d00269942ef73537885eb7a00000000000000000000000000000000075376135ff3acaecc0eeea32f8dc15add57e8f0297d053ffaa0fb0a8fc4418c5b142f96b6b9ce9eee2f949c960aed682d1f3709700634653374fba5a94d69163ef616a72a63d462afd9f01c9ddba84000000000000000000000000000000000120d088fc12210c1f5f6cc3d1091563f9a37d4d0e0d2c305b479f4d7e893c4d5c8170eb164e34e4843a21c9eb193d11d00000000000000000000000000000000159de80db3b1f0ffc5fa8c93e1bd54cf8ae19cbc9018a5dfed86179cdbc976c1c312212080ab221806bbe142d496e7a7000000000000000000000000000000001103abb75a78220218cde4bc4c59ddb5fb647ff808754dda200bdf586ee9c47a09e03762bb726b085928ddcc998af3ee000000000000000000000000000000000bff4bea17eae0f2ff3e7f99bfa91e6ae8aea28f6f3fb6080eb644861defdefc26befbb7874f612edac0cecf70dfb275614ed9a08dfd406df00719d5eeacfb0a96413b608974fd0aa1d4c6176b968dc00000000000000000000000000000000012dde607a2d4452c6c060054c8adb6307743edea3ccb6ac34c275717f177f0e454d9e33d4391208198cae39d7eb6f6c00000000000000000000000000000000014cb4d8bc98060ee68a8ddbc44b83db5cb6d09f09b0d608357629251c35e44383e97058d0d68fe2df3bc47424a5dda03000000000000000000000000000000000c14fbb6c844fbf896fbd3cb3464a83aa4c6e9a7f0450ad96a07527df6f1eeeaf587f60a990bd6abe7aeaf5eb46f362d0000000000000000000000000000000001d9468774318ea711b79f16303ce86288cee312af296f1c9f607ef5f97c7d1cb48a7218775c8aef00c227ccb586286e7c1dd2e5e5f630fb1d07e8934dd3ab029917e7775e401c0bcf7e1fd83aef728400000000000000000000000000000000181e7f8d0ec7a4a7858bc96b61484c24dbb9dfeb3746fd3a231a8e442369e3e83516ee6043b1c06e7e2043dc86f6c75e00000000000000000000000000000000184c1d667c0ece59f18fd2eeafc66f1ed530b7d5f4560a6c886429caa13255c63dea01c3e357e3408af58a39420a8b28000000000000000000000000000000000a8475ea694cf607246a1c50064cf90cbe50ad5cf8006934a1fdf1621ba38d20e70860a2b5aecc05acc60943224cadb60000000000000000000000000000000008afa03c2df8e83fb64523c57d0daa7cfbb7af6a4bf2960ebc64515a61a659b2c37ee661050cd538fa00cb34746a371b64e9d16cb61f2bcdef30cf544d97e078fccb999b96a1da0eeaa0bf232f01995f0000000000000000000000000000000008b33a297c8f86f1e9d7166f9e905283c8e1581e582b879caf48585d0bca3608fe46d8d9f6e7c90855aee9d92283d7a40000000000000000000000000000000016962410d6b4b6f91437617e84bfaaba49de0369b8748d2e2dacb63b421e0d7de4514e7fd3e0dcbcfba8baa4915610d0000000000000000000000000000000000efdab72953b870d0e113efa7c183d99aefc100ce59791aabc72423aff70a5b74c577c06ca94bfd6a7722199b4bc22660000000000000000000000000000000013b18e31700987dfa4344384f9b41e72afe92c39bc961333cad3e7d0a5efd3842a5e849cff5655c4673f720fd0127dca35bca9082d66c06761f702dd439faa4957caa70ce0343268787f41a2f4bc0cbf0000000000000000000000000000000008b86f70c8d8b03b0e9a8975776d7fb0d08f95eded0a0124551d363c2df57124e0e89bd45ddd1cc75c258a4ae2f87916000000000000000000000000000000001120eef9eaff7c308b629deafb060d2c12b20b57562007fa810a2191d99fabe9c7d3c364caec1724665ef556de66b57e0000000000000000000000000000000007698bbef6dcea67a2c643342ab2a0f830c329fb6244d4a98512daa8a3c9d808cd2acc0cebbe3da920053ad73eb7cdc7000000000000000000000000000000001155b6beb28fd88d252c6b407bb9f55d22103257287ce77353bea580c90173b5c3d49080b319ea28817d67c52bead96f7980eac6c8db86ef83748d10b210835e53baf8cc9f607915df272b6e28ac6b2800000000000000000000000000000000142b28509d72f9e3be9ee916827fc1a8dfc4ef7ae2b72eebad5db605fdb2dfa4492b50cc3e472df1b52baa6e2b0eff5500000000000000000000000000000000134d6821088ce4a8b42383d5a43a32bb0cdc96c85f304a2601292670633d5e231b9dc479d199829a9ba9f39c162318d5000000000000000000000000000000000636da344fcb0fe50ff3e22f8591418f64cfc722b2860b4a5047f973f42e4cefb93c2f8eb8a14b4d150758ecbf3cf712000000000000000000000000000000000e6fd06d5dca702cc9f199f7583add86c82f7b530d4dfb9faec36dbb669cf7c1cd1260c7e4f3026824eeb5b979e9fdaea256ebae4b204b3888d7bd244bbff26431ab5890098870f13800bb3be3e842ca", + "Expected": "000000000000000000000000000000001684f447f8929ec0187811f66e985f0014eba46eaa87de2d4ac2347d10c0550e4044ec7792d9f315c50081dc2097ebdb000000000000000000000000000000000ee0c46efe930bc98f39dee8cc6a792744e84de4fadec035d25ee8ba82e1c53264d0885a1fb05b2b8dc9c6a1846c28320000000000000000000000000000000003a5ef98843099235a2ad9522c9cfce1908bef77b45794e7df9eb38a4854460031829e947a118e8160365fbec3725b85000000000000000000000000000000000dd205e195abef6a4cfa7da66f022a418235e1a1b2fefa6bd3ddf8a3851d8ca8c27652bf87ac644cd189ae55e3cc7808", + "Name": "matter_g2_multiexp_17", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000064698182f90c20ed6f6da7248cea32a291f901876a900d344ce4dc1b07822b480519cb8d891b5ee4f33b4efd90742cb000000000000000000000000000000000e7e9d2e79ec4b07015baf69a283f6a4abc8d7c1699f3356fdad6ea9b1c70e41e73bc14e500634d73749f9900eeb65f5000000000000000000000000000000000002ddbf40619ea5123c100e2d6553213e37883fb34f0f0f2124795dd971892d5c9051cd4aa78b9d20f196301ca9bb4d0000000000000000000000000000000017a07b32fbffdbf7a80f0437eac1ec5fff5a68f3b053482f034064992158b604bc34489dfd41a24ffba806ccb871fff15805f2e8013007c4f6d8abf441728eda8d742ea2f1df545f85d092f50ca8275c0000000000000000000000000000000018b4de9c04fde8b708408efb3aa7f24b5f7bcec14e7d06fd5a5b36bab528e5adc0bbb1e378a5ff6fcbc95aea530ffc6a0000000000000000000000000000000010da98267770a47e5ed14ffb3dbcf537dd14ae5eb79522c772a7a2833be214690db0b4e86621de1842d88018fc0f348400000000000000000000000000000000135548e2eec9ae7c3d23618d8286db13a5a628fee04fb6ec9da980f3a46838899cf965c1cc6f562e71d5b5c7428cabc8000000000000000000000000000000001669fcee7804df9b7bef32e2ffeaf285e8501842efe87c9e827fce872dffbf92255d3c3a2fb5c382ab7aec0bba1ae0e5502d777b25f3112ba2264022e2f28dfb6e5d5239ba097e9d815928be44b6a62a0000000000000000000000000000000010ed20c069bb300a27571adabd239e70b767af90b91c4d0e93d88278a6da47b7c12fcfaf62ac0a7b9966968cc9f3770b0000000000000000000000000000000017273eddc25cf41f2d7734a3866711e83d4f2823ee6a036942799f837d5ceff10dd6022ea25e3c1e28c7b14ed8f4e7c5000000000000000000000000000000000f201f314f66f6b2c6e1365c0fac7b187d31bc45b5edaef5243b5488e26581dee24de4a5fe493bee44165cc31d8d72ef0000000000000000000000000000000009dfbdd86633edfacad6b78d292141a1e653a1bfd8c48a96b2f6bf8271ed6033c0511628caf2ef258eb64cc8b63d8e5be7d64b471cca34ab0c91f61ff26719c7186dfcdef13895d37ead407873736a740000000000000000000000000000000005c4a4a5ffcb4a39c8809821ff275360ff937070cb97a791cc9ec45f429256a6d2d6127248b6ab0b6c71c30c4fe84ff20000000000000000000000000000000019fa60f481c5be953c9c7dc86903a89af0ca2b4205be3a00d793d6de7103852e147ebc7d983c6d6e8cd99e681241ad440000000000000000000000000000000015b3b2eeb0f81ff8a2624e2ff2396bc69feffeef62b1b6a1e73ca4b9e60506c2950fdd23a37cf56387b8794449d3237f0000000000000000000000000000000017021a69ceba3446dad9fcfd8cbe5b89b61372f57d43a8d2e2c8f4534bef6b91408409dfda9438f24526f7e6bf1f4240e5723630020fdb48e44adda735943c91ad7d1e12f3c32d823833eacfcc8b02ba0000000000000000000000000000000007c8f07f22a3412fb4638cb704751959cda4e42e4612edaf5b1f22c8f9ea314508353445114bab6c07ccbb4b0d0bfa6b00000000000000000000000000000000062d087155c8722d0102c8e5084f95f5f58ed626d48197297d21d2108ee05f70f16d595ef73e8e1207a3c0b013fe16710000000000000000000000000000000003b6652934f3acd4c91c6c521c2476bcd2594a939ff2e7ebcbb0f451fcf0a656a518dbd4f36f165f9b2f58054e9f778f000000000000000000000000000000000bbf21158227e0ad5461de9ad8bd580f9e65327dd4e23f1ad55618f6b0aec45aa6076fa88557953ad15d385a074bc7d96e9e37bd811b76133c12268d325ebbd6656e7ed718cd777458867dc98b1b3bc50000000000000000000000000000000019e336d4d342f110eeeba9773b8e351f26bb56361c77fbf12fd9fc218fd075ae38b95f4a8a5ef830fc2cd92558b1711e000000000000000000000000000000000a112725046ca3b6cc43207e6b36f38d96ff98dfe3444d67ee3f4b0208f3b8543768dc9989f936637d7819e7dc5740fd000000000000000000000000000000000527682076572d8cca15e47a2faf62b129baad29afed22d32ea47983a8d0b138653c1353bfc6fbf9fdbec2efe36700f90000000000000000000000000000000007e3c5aff373b5154ae66f978fcd66d09cbebc7e0c96b4a4cf23c4fa5f2fa655410c7f1ce597a3f5f155017720f7c50f7d46516db284a3938e672ad3c6bd40313d77c5d643ffcc59e3f55ad983cdc0ed000000000000000000000000000000001865c265ed4606ed16056c0b28f953119751d7272bb33b9865eed312ba23b32d01733ad5446cea5873c2bbe37fdfce7e0000000000000000000000000000000007018aca1e7ac211921cab1cc6bb18874d2f39f00d916b8f3d46a088a378f3c9b49ab8a296d0aa21608f11b144a0c687000000000000000000000000000000000210561c0bbe5a9f4b2237e5bdf88bcd73326d395277deb2a883526978df90792993e6ee520c9d5ec0a6f7ef5c6b3542000000000000000000000000000000000cdd344124b7b5da556f64ac5d651a6f9b74427fd712007310d720f3236724e2284aab812d739a87f3a1bfe8737dcee7586cf63c5e52b44aaa79cdda6dd6fa92c6fce11d867b2ff5a04c9e44e0b3930000000000000000000000000000000000024494aab30849df790185a4f939954b724c387c9a366fbe833b628577654174f705d05e7d7dbcd29b8873aecd55df0b000000000000000000000000000000000863054fe3e4838d2caec7103e3d0453e86a17fff0dfdb84dd819f31756032e9e97b7be89b636e5e0b642718f6da217b0000000000000000000000000000000015c8bb4fcb6d9cf941b722136d8d76d847fd6d5c643f4c0049c9746e76e49726fd463ce7899f4df66d04e5d48e523e6a000000000000000000000000000000000f101bea4e1bf610d2782ede91da95eb2b0be9ce60485465b9e94cbb9530b416c4394862f0ba7ee8067bb48e94c07c53efaac96bc5f686d6b952e7082236622b737fda0dd3900bec71654bdebc8ba2e40000000000000000000000000000000002dd11f4dacf3d9c46579182df1c1c45a364a8dc1eb7aa7d54d0141306f1c23bed85235783a22b8e6dc4adc35f9193ab0000000000000000000000000000000010d1c642fce533039e98712bdfcda86eaa62d2d69b861ec4fd835488732fcea414cfb6f3f8414152f9d5398c73a74fd2000000000000000000000000000000000c6759b75b1e3fe86c00fa124d09c5b7438ad61fd1bb71695743ed7793f39b7a0fc99b055201ac1e3aa07ccec61b24a80000000000000000000000000000000017580c9341789484fb31386eccc9c344539a09f1c4421dd124b1a0ce61f2d0528942f7fe8df67c6b2bbf782996def47b39d6045573dafd09ab2a0d8ab6e97b0ade43bd79d820749ecf19cf7d99792ca8000000000000000000000000000000000d9c48a111c8c74bce8cd78d127999531e46a411b2f0be3507226766bc8abd088638a237674ac62e0fb7dd4a86d09b79000000000000000000000000000000000073675bb81e2bfe6adb5cd929e0b7280f5d60b3dee7f797d65ffbefc2c2944a9c7207648bb096f13292ff4440c3f03f00000000000000000000000000000000024d2e0d5ba1a804520c72331fa23a2a326d461177fa527473240dda130f4ef893870e893e1dbf7c5dbb0178dcd29b3b0000000000000000000000000000000002a4c9487485ec33f8fb347d246ab0d41b883bec30d2a5e88cccafa676569f25ffd8341cdf6c09f68afae442a574f3334c4a2ff4ce4b633ec8fe0bfea42ccc329b7d3fbce96c26989b3c7a391c9e806a000000000000000000000000000000000c1965a745e42853b4d54739b2dc507d68d80b330360a4020e4412ba5422daaae313fb9597c98575c66ccf351e62a527000000000000000000000000000000000844439e6f08a411e61d37b5b2b07921049432e1833e839b00d6cc11227dfc8770ad9ca06037043668fe7ce3bf3ce84200000000000000000000000000000000152ad6fabde2e0310c978404a5244209a9363cab1f3ac9f71339cdad6d40c84f8e5a8a196283b581d0209ce90e1e3c6c0000000000000000000000000000000010eb6af62c7dba122b0e24e8326dc906370bcb4ba791c47630f05f657a228c20e010c065b93537ec84fa14a756b199789af09ef1f27cb83189e4e13f3801c08d3a2adc8b5f88717954ee84499defc0c40000000000000000000000000000000001febb2cf2d664e4a277cbf08fc1fbacd05db415a12329f7be551ed56d67f0b5dcc917d1b02951657bff3a26bd8c178d000000000000000000000000000000000018af160555292b2f7ce27112c1d60038b564f5427d62604387de97dcf48e4473107f91936b5e8008065a1537f7ca340000000000000000000000000000000016bbad2a7f5451098294a7cab2fe10d206741a99b128dde5eade581d02ca849bab3662fc3400fbe055dd93a418aecf0b000000000000000000000000000000000b1e9586cc1b357da6e58621ce09288e62a79517144f6c6b867359251baad6d40217578d49c1501f23206b125282bdf4c72c1dc1efefb775a1bda754ff17389a6b6b6bb25e22697847d24a117eb8974b000000000000000000000000000000000b88892250c848e7bc7bb7e42cfe1048a1f61dc546929211846f49501ad8c7c8817f5b5b99ed092d5a2236d59d9c8eaf0000000000000000000000000000000011680c6549f6b7d9d187a6409d40cc26554df654083f1e8a47dde826149d68da756adfb1b65bbd219f79a10d8454e881000000000000000000000000000000000f9596121dad98bf7acb3fd65fe7e0bdc8924e2390341c11d9cc9cbb0517f988ff79a5e1d60bd89449b5f042f0d0b0c30000000000000000000000000000000008982832ef53bafc23ea817be378532b95b5872217093e7c7c2f4512d03a9c9a6dbb7950563a520781c7ae213fc82897b4a0c7c2e611a24c722975ae882dcb4b45e6f6b41cfc87e8c766beefd5b10bfd000000000000000000000000000000000ea5bc2f8bc2b4088d1fed7090ba389577b11a3ee0775cb3f0657ab5b07a6709d3a18fa5fc33554dea235c60baae4bb100000000000000000000000000000000196b6259b06a4c91a0bb0adecea134c8609cf983c2c87158a69c9de3b6768510fc56543a84d1266dda78d90c3b0516ac000000000000000000000000000000000d0222d8ef278cd0d85dc8765fa7c4256394a5ef61f91301af6c7422b4cb17889224c75ccecd2df3ddc9bac98b493863000000000000000000000000000000000548809ce26cd498816ef1222d062b1ebb7313a07e99e3aad1431f984e9b8ecfd43357ea57da7e0c6c011c5d5400f7ba986d48aa5b00fc16c36dcad061d10937b55ec4deee63cc2841b7ebab84f910d2000000000000000000000000000000000b95455351fbce6f73de0345a195f91bf96abee361908cea6c4dcde72048a13a9a23991a75b9c988ba0afd9491d15696000000000000000000000000000000000305f29b05fed06ffab484cb065d4852eb323fda8c9b7c0a78843bd7143effa95cbe5e50c1a0c3a9675bb5381709b6550000000000000000000000000000000016ebcb25f1b8e8d7a8f7131455ed2be084bdcce40034e7ef24a47fc29e447f912c20c7c9910e025aab975cd2c8cf1a96000000000000000000000000000000000d84a5de7a5fd8592f6cc2bc7c3d93c06e26185787856c922d95eeee345ddfb7cbbb60b6d992c5ea4dfb33101f2ef1dc979d4df836daac0960fbbb8919d2f90c3457cc987153def711d6e8a12fb14363000000000000000000000000000000001377d654f80e933c4598aba1f637d1e37d66a96680c3a89a762f412e187817ec08f0ae897b08206a73f1a423b742261900000000000000000000000000000000014b71954b9bc22ac22cb2d7d7f373c3238c923205b223cce6c219175df2bb6d7258ae46d6cdb019311bd386275499fb000000000000000000000000000000000a08ef83b67bc972a67b9174d0e5b1536af882d505d03464c9a97f68061aa319d612de9db84e1e7b12fc3015fc2973b20000000000000000000000000000000005f716d0ffc30005e4a744092704a9e29f58fb06bf7d8d6fdbb95a4c0eeb5c39452cf662721ea3e0bcc67f25931a109425ae495ba75cdd0bfe200ee24d813e1aa93c100ce861c9ed7fa5537e11778990", + "Expected": "000000000000000000000000000000000c53f0ca8901f4751be4a478088b30dce70b9ecc382455049df9ce108eb0a8d2696bb325fe9ebfd7d967ab5b9b2c2bd800000000000000000000000000000000033460babd2984a5d8b7002409349972f518364e92648927e223d7a3b648e952482c06cc713bdc29ab83f2646e9398510000000000000000000000000000000007cb9dfe603dc070151cc477ec5bb5a2a949062e8442399597c5eff8f1decff538cd0aef1384256dec73746e63a6c66c0000000000000000000000000000000016b56ee9b21c533b9c464178d14ba5c92a90e6a54c3ed319f487c2082b1ce1d0ff81131a5fb3dd7d13e0fc1d9ad9e4a1", + "Name": "matter_g2_multiexp_18", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000104e0b91821c59290be48b97936458af89078b176b5585ca9a79070c7050309b01df4b0bcd84f137f58304d90599212f0000000000000000000000000000000013b00ece925fd17a8effc43e21d982553ab2764b13defaae5e5419cb9a23ca7436cfc44088c2aded63785e4f07b6e186000000000000000000000000000000000267cdd42febf0706675b60af8c0953582ced84dd5ae870815654cffa46eb14b747fb8fbb3b014e59c929da49c6908050000000000000000000000000000000011c5384d7c3e0f4fd66ba4b4c2ab60f6f78f9930e1fed233263dad25294814d9e2aaba6388ee9f924e2a323693b6e43bbb2a329761a3d6a2e4d9d63d7bbf7fc6fd321ec0344cc4d7d1b6565c475ee9670000000000000000000000000000000018158ad70994584e6f2443b8b96c1e4772a00fa0bf74865c76000eae470eb02cff627579126cc465046d4e088782557b000000000000000000000000000000000d72979d455733756a0849baa8afd79e18960f3f6dc9676c33d1663961617831f3266015cb998fff28b78300c87c2a73000000000000000000000000000000000056192c20cbcbde6099256a8f40c78a32d3fd212fe9c511951c7523a3559f60662e070f5b5e5f87b1686be0bf6cc890000000000000000000000000000000000c7b7e8ab7486012d95af5b2474ce15db612bfe1508852b8d99f4402d0e4f075ba056c19df3caa3a93bb4db89443096143cbc3dd7ec63ac63618a9e5da1f9c3fb952c6fc6972dfec6caf1a415a0aa79e00000000000000000000000000000000005a2741902dab47e8d38992180a9670faf56d1849dbeaa75b2b4ded93ee5494184c8658232e9131a8b08ac9b5460bd400000000000000000000000000000000189077d5130b3a4d7d4c3074633fb12739f95b8b6ccb082dfa61d845a389e6ca7aff835fa0f194dc349e1584b3141507000000000000000000000000000000000f226324f242cbc5f616c4a897f82bc5503ab1963ca38f30070c7c9916ef6bef5caa7e2e26b3f9fe68a1d59f19a9831d000000000000000000000000000000000a999bdfa10e4838ca69694272b0187f7d0198d6db0fd85eae688424fb09baa165c623dc6da567fe034d7cf9f9a0087e733a3a84eddaf3af8c5009646a899f6ae8cf233f535e360e29e2952088ebd7b6000000000000000000000000000000000fe85d976befdae8fd0ad33a4404415304afad1c5698b91bdc15abb4f268807c906410a6ca827320f5271c8fd4c8d6fe000000000000000000000000000000000cbff7963daa20c1d20717bcd47b872b3ecd5f38de1a467ef50936f13d6aebd978116a736cb6c5d676c6a9525bb0b7fc000000000000000000000000000000000c3d20ba17a21bbfe873d88e9221571f1bae7f02f35b8e677c9c42907673d765150c737f0011fdbaf4faa883b0dbf0280000000000000000000000000000000013482c68a5e1084faf12e8aec92cd9f0692b173556ac8ac3c7519beb4bd75f847f41ab9432421c631b14c885c001dce25112b5912aa3cba657d8de3dc8138fec92b391d5f988b82e19f16fe52fafea71000000000000000000000000000000000f9091a0df2c989e12a844c447287b704803d1532a3ecbcc890e6f6a885a54b969c53323c105b3d14d12f2cf766b8ac8000000000000000000000000000000000e54f3a9def8b3a9f972726e606195849584b7197ab70a28cf5644cde15e70bb6e3044042b649825adaf5e37c2d5e614000000000000000000000000000000000cae412d8a3ee3c5af38d7a65bdf2440d9cc2d6348dce0791f4a7e71ac483d7487b6c789be0a401777de3f57ec65de820000000000000000000000000000000014df09fd2ff406707004f6afa366d06bcf8bf18f5fc4b444b07c98b3f358247c6056a6337f5b53c35db45904797fb4455683e0b33b5463bc71283f0625269b2b33ead69c1eb7b23a996c31c514d06937000000000000000000000000000000000a8aa422e1d58fccc84615f9ca4a4743cf5efe3a1066c9819f05042100bb8784fcceffc8b3a739f549b42f34d62629e7000000000000000000000000000000000c737cf78b10e82fc0cc9823891f1a5f1e9229d61e8f369c589512d01e5180246db46e4f09e811464c6e1ad930226d390000000000000000000000000000000016017354434899e2285da6ff4b27fbaab633d962197d2ff4fa5f688c4a85e1817434cbef13a6b018df4e359d7b9ab7cf0000000000000000000000000000000001433c364428ac69ce4f5678aadfed4e6d076241519310686de01572da5cf78af4a98b3502519beb0dcf04b748d08cac5bcc597c5ed7f79173942a0250e618c93cd0917b37b5f354d63a2c02a576080c0000000000000000000000000000000001f8b803f3f76aee9825a9a960cd2f9e8aa931568b32be6169036683b4e6d8c4abba6bb73b137c7c6d6b6ea92f2023ab000000000000000000000000000000000fe9edeab60bb55990ad2c85c8fc9341e81de54324652c08c615a745813f08153bab3849dbeffcf4073f087f7c0cf0f6000000000000000000000000000000001955289b1210fa31542bd89f95188d60751b32e8d54f1d4d280975850e57db7b151b872bd431c528c22fb89c9b8784af00000000000000000000000000000000079c8a56c72adb9fc9baa503db394635abb10264dd43c60f2c82d041d43240321ac1028688d92c4696395d8840d52f15f2613a8e50fbc6683ecdd7c7fd38b4caa8e5dc9778909fc8680a58b16ebf40da0000000000000000000000000000000000b0fd79e62c6129fa115d821b8f2a58a4564f5ccbb14088f59d5e6a17a64e803f32bf8e5a415aac4d6491612d95ee8f00000000000000000000000000000000008d837b6c70468e1e10f6b979b7c0694d65942aac48b5baa829c191579186314ea35fe440e6d843fded02b95f9816890000000000000000000000000000000015a05bbc4607b113b37dc0b4b8add23736e0f1bb1e48aabc15500fa6941b17153918d256b6442687a432dd9ca9a198c70000000000000000000000000000000003546953d97306266bdd359d4daa939e05c0466691de59d2dbe3584e2ebfd9a9e1516cdc9cb643c5d31731835dfb07c657a747bc919991ef9b7b10388bf3f301fd910f807ccd31e322be46580a71b7c60000000000000000000000000000000009a4366299290c3c6651b22865fb22cc972a05ca5981f5682574851e41096d531e375e981c4e1b1cbfebbc70a41bb6ad00000000000000000000000000000000001e6fe2097fca2afb8385a3100dbd5ee1b7ae972e06ef9f5e34eb9fbdc65455e1c822299e06a9dd5a3f71a0c1efd44a0000000000000000000000000000000005ad2ffa8861848c46722a7924ece68580fe44e03157c982b7133361e974b59dab7b75358fe498fcde9f68b5b99f23e0000000000000000000000000000000000adac33e0b7e6740c980a4f297917fc4fc13f53a71909f2eecd0067656c6f82c3b371cc638509151bf937f8257aa415d86ba09829f4bbb383e2e131d554c42edf1065022975655c07df2b3445a3e6cbb000000000000000000000000000000001462d509503d2c33829c3fb5380199b79b970c2ae7f944e54a6d0f0deab3571976916cfc311ea6ce6128c467665fbbd10000000000000000000000000000000017f6fe356cb0dd5bddd489c26669f0f365260bb48a5f862e9bfb778a7ff5392938b905759718d050f7d93f107236cc75000000000000000000000000000000000d9b3ca93c5133cabf3d3daa565bc6b51e63b7e37f68f3bcc43b9b3ee7db15f8bb33052eb7e332ae3e9ffafb17cb77d60000000000000000000000000000000017d6b898d9799385990c9dcc3f72ed93333486b98349ef106a230a71d768b75cf56cd946f5952075bc41f26dca9c83c003fd5e91f590fbe171aa3f006617b20ad645626c970c2351e048b2ac3773213600000000000000000000000000000000158e5e008796c10f6050826c29523864d06e68977cdc95d281a8606924aeed0b475ab152bec5bfca8e0ec53691b307f50000000000000000000000000000000006fe8e75328c067546eaba93f4be2b15513bae4a3458112c3ffa457d15c23636816fb469f071889380f31870d713e949000000000000000000000000000000000b9b21cd58f8742ed094e9b770182f6f3f855204d869e53c02d0c242a133e957c53c9fabc827d6379b39541170be313000000000000000000000000000000000014eaae1f0789f0b1e8ad3b452b4ed3ff87bed49ffedd13c8c35c35668c33537b63050c06a5bf3d88d516cddac13b4c935ee16785c004dd2a01920c52d3244e2160fec2d17a519974d4331527cc627910000000000000000000000000000000019f976b3584ffc188424614fd287eb79f060c55e9b3dd2f3eb99760a7cb5b70e2b62a0895b05e7cce2e390853fed61b3000000000000000000000000000000001117181241fead3865eba4804ec2c14f571aef5351d5bce29399113d007cd4e9c262af1c77daf9183346153e562864b2000000000000000000000000000000000f823f71035a4870be2ef20bc94e97d74d18c0a1be9895fb27c54df1f663df6f9e6e45ea5fe4502143a84c05e517b02b00000000000000000000000000000000141250f392fabd4566e0cd3a472a4b2971a432a3a5e1d9c924866c7a9516322bfa691e9dccdd5ef14c561bca6dd70ba204a6d6e29336015d99e107cd312e300bd54f815c785f6008c47c99fa008452700000000000000000000000000000000014d6827b9bc782863491bc7c544263f58dc04c18e08a87ca2fbb5799c4aa70bc039416a85dbba67dd83bcc27b70748670000000000000000000000000000000016c2816e93ea9d4bd6e42a9720cb89d637d88e00074da3300c6409be98a03403e9ac15f83167cdeb13800ad174ac47f10000000000000000000000000000000002aebc0116a62f93a6e86c7fce86745618e08f4aa9cebca7b520e9176bcdf1521cb2bf7eca7f7af9487fdc82dce76bb50000000000000000000000000000000010684e3254207c4ccdd49e4775198df981afcf7d9f89b894e204c5dd84ef42b89fe3e2f6b9278470e6cde4d3f4abb3b003f9cd3873dc6243748e16e4806f8eaa339edcfdbf4408a8e41a3df80c9816210000000000000000000000000000000010ab1d5494509060c9784b4744a0572a9466d6c374524a6d338ea12ac5ad89519217c462c3487e398325439311bea86400000000000000000000000000000000197568cb53ce03f00aeb04278f355da862be757366dad14ca6d30b3a537df9855a1196010773768a91cb4bb664a34f0f0000000000000000000000000000000001fee249315794d30eaf929f44b99e07927194c6015ff34a4530698d7d68239240c9cc48530d52ea06218a826a655cce000000000000000000000000000000000645b5d701bf3422228576467120935f014c754dd68bb3555b50aff5ca04001a26298982c97a64469aeac3432784efca34135a2e7853c74725bdaee1ceadead7b4c7d729650df6544bd525c05c94234200000000000000000000000000000000113e17730f8dd7258157085c30cd9d1950a26c848b55e3a8a55865eb567edecfb09f32ba27fb3e2096ea00c30f31ced8000000000000000000000000000000000076db9ccf8df9530b64cd43ef7b496d1f432885062406028901bbfc5882fd12533f84eb12aa2ce8b7adf9dd980db0870000000000000000000000000000000015e487de49f1e494ce9907cf0ed31fb0a159c5290538ad969b2c8a504986dc9cccf7c74a61f622154e928aa2dd689c0800000000000000000000000000000000195e887083a98fe3f50a9ff4b342e004398cdfee55c4b02a4db0f65a77d3c0b142a45201674726c96d5f79f8604d61860033fdcb731830951dc3c4b33f06310eca51762cb7279039b3d7d9ace93c5f2a000000000000000000000000000000000d80c7e50973205585b20a068c64957cf4572eea40e32ffa8b759c38c6ad6f4468421f2fd6a6f5da1b0d008f625b3e6600000000000000000000000000000000009242dc1de055aea82b3b917f88b6232c550c3aff41241a7e54caab4c234d29b5d8138968846f7c754d73ab3b4e7913000000000000000000000000000000001188c31a9d8359d737576f4ce7a7900314aca0eb3b51baeccfdc9245bffec49143a11b3331f9126b01de0c307aa4e44400000000000000000000000000000000104ef4835124fa6b30dd551653aca25db5a544af6782cd0b1e7d26178253e0e33cda77428fc1dbcfe6114a758cab5c814c8112ebfe12bf44e84796e8b0cd03a93d2164d6edf1f06a5c520330a177da87", + "Expected": "000000000000000000000000000000000e79d18633c18ac818786bba87d09c9bb1571e179d8769f8fb82e2e2b7a6a8695c1f4f06deebcb84524e8facdcb49d0500000000000000000000000000000000149d0231fb030a1bec170decd307c10e72cf1cca55c8a1b67aa94ce61e4c7d2ddfd0b8e71598e1abb054355dbcac1528000000000000000000000000000000000090f5be784dbafb0a8aab1516c773720341de6176017e0fb43a275d60de54c1189144956d4876d989232b362b90851c0000000000000000000000000000000019dba28eaa6706361f285b3abebef68f764204c74ee93ea011db01c19591ddc6f98799fb3026c3c223effe4489a7c676", + "Name": "matter_g2_multiexp_19", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000018a6a982acce5693e632901f3136eded40071e8c7caa7887f302c32621c5bcf9478991ca519978b52f8f69415c0d070b0000000000000000000000000000000013420ab920c8ecad5b2f9aaf9b0074c2386b0b08c81923558770d4c4a6b206a865af8322e9755706cd5e595bf0ffe564000000000000000000000000000000000c0e5bf5465d564e3ce86d6b742ca687448e6952439b1ff44b86ee6461464e07f8039e8ae7a301c6caee7eb99e38fab10000000000000000000000000000000015eb8751b750af62f57971e88b436658758bd5712f98861fa07328d2b11e8725fb55a2a00252e0be06b0c73aac0f7b8cdbb32a4fd8b9dc58a382a7e436e23f49a134915372553eee8c605436221acc80000000000000000000000000000000001328927910ab502e573188271108706152f562b1d5f6ec074f8f9ec5eaecc6cd5e8284a060b65d26463d22c8290ea4ca0000000000000000000000000000000005a1fcc348122350981dd5090c865a2aeb851ba8b6e0443c32f48b157ba673ae5652a70390888b3458afe6fe975321700000000000000000000000000000000019edc749a9799c8d3df75d4024791943a8fa02ba0cac90b6819f0bc42687b044457bc7cc6073506e8fc19af37f224624000000000000000000000000000000000fff20fb2b554b63758963c1583b996ad450cfbd5ca9952e38f38a8994809096086ed86311f7d73a0a5898ac261ce09e57df9664d3e17d9d46a886efde4e37e38859893113558843bc019699eeed8ec00000000000000000000000000000000002a7005dd32bddf1031f27c2ab999604c048a37c39734db48a30baa86c61ef626cf82084651ae9ba8a265333060a408d000000000000000000000000000000000421bf913a25108b8f520b2becc6f8064029dc046d0d5effbef31f0af59eee71cfce83fec8dda7983d50c6d5cbc8329a0000000000000000000000000000000016c75708f1dbfbeae3b06e5e9a7fb676c27100b99deece14d979b32a9c3cde6e9e96c8560a00aafbe6e7decc84e7e2780000000000000000000000000000000000ce23c27b5128bcffa424fd1d181d21b06b77bd6549ca5eba9a28cf18bb9a979270f6a5807c640dde57a0cd4f3af8cbe2b433b7a95c26e598002cc00b7904816d59baaba79bae7c6a7c26dcc48a487e000000000000000000000000000000000690c7ab321c0c93b5ae4ed77843ff4030e4ffb504c685d28573e98836e8e56dc19d662ae9f496a346bf2a8be5396741000000000000000000000000000000000fbbe3861a8d202b10801cdd606b50db0ad6ec7b923b90ae81ff5443676c3399e249e9efeb47b72d2b0a54cb0594686500000000000000000000000000000000148a27016968f0258e5eafe0a8182c22091873a5a58b27aa2160674584e06d5b2f46fc57a00617af18d0688df75294cb000000000000000000000000000000000148449d00b3d1b5b43b08a0c6e909a2d9c66920b60224a2c6a2521f0bad35b99e3bff8be0effb2f7f34438662d7a4882897583b53567bcfdbc63ae3e864a9cda24bb732694a6b27415c5212c7f45a9400000000000000000000000000000000026b55509b81befaf6baa682a3e92a0ab423fdaa84d2897613fd31acd9e1590f81581ba0ba87d68af76b01c36093e183000000000000000000000000000000000c675e190570bc5173b8f508d5bd2768c83e7f56a08cddbc636792dd75386939942827617c4aff8628a74b74195adea20000000000000000000000000000000014f59f38ae9e77f3a76478ecd47f32200567bad11f191d303cf15d7801ae7b5a3286095fc8726acc9818914b27a776bb000000000000000000000000000000000da89fe9493b2d9d46596d80162f5831d4fd8cbb83b46e84e95d5d684eb927022ee62ebc3519442007fdc543701f97bd2f7ff17e54d759eb9c51e16cf6f12d645bf2d091427416b4edbe1dd21947b4d900000000000000000000000000000000170e52a240a7ccf2d57ae92ea8dabe62ca4b458a5da42319ae89cad22ebf13541b0daccafa1b1d3cfcffe81b500c4cf400000000000000000000000000000000174879425f3bfd40fb74a88e3dc578e45b0e0eaad94da009e4076dc42d234d78248ec3a035666dd6de235f87e1a47bcb0000000000000000000000000000000005aee47acc3260d11fe0ca16050a29f92763b3cf8ac78da52b3b2b3e26d8ce7b6ccc187fcd81695aa456e9b94a84269b0000000000000000000000000000000005eb297abf35b51d57474b4989dd8f793005bf8e82e49859c41b786ae39217b2321299829198bda4aaa261a2723d43d6ce0a097efee666c22d1dd0ae8c8e11283aae781e1deadceb3ebbcbc5e5280a61000000000000000000000000000000000e49e94cfa35d8ade2b76865cc8be04737d00b48b195078c8085cbe782232a544cdb548373bd8ad0282674ba5c96fe0700000000000000000000000000000000047d59661f095c41bcc27da5f260f13a3fce334bba216b45df548894bdebc691fe779ccd63d99a9872973ab165a90c01000000000000000000000000000000000772e9a9c22bc7352fdf74915bc464de99ecd96420ef1af6e8bd5a05d73fff89c78e28eb340d4967e906f28afe1320490000000000000000000000000000000018bccff27bf9d7cb2159b9f2d1faabbf8591b53ca8e67e661d9f44f6dba6296e3e46ac32c50128bb5fb076cb8f214e277b2baa349884b54b542e3993210ef002f70c6467c7d512801f0003da789c00580000000000000000000000000000000002d947e728a3b376de520bf78e56452930de42544241180906719a24d72df65f8250402ccaf14d69935b1ecbb0b4d34c000000000000000000000000000000000d5614ec77a9f31915dddb3e4bb533db001702891a45f0bbac49e73d9c19a235a00442b52d452d77018f883706a616f1000000000000000000000000000000000dfc6a73a8e36b7b2d0614b1c6f7bf1ae284ed740c768f08416c0c09a601fadf3e4d7b17a93601b1803d19a04ccd570b0000000000000000000000000000000010d6a8e4eca2e818d6dff13faf0fae44a7fb90be436a9ef3aab05515a35cebfbd53e9af866cde1745f0e2c3b045486dd2b94d087c3ea101649ed57ff308dd3ae0d25a1ad8884763cea1b0b7c56a3834e000000000000000000000000000000000d6c5a6fe9b4d4580f8e1d89f0510bf5dd04e113d6ae5db04af2553bc0eb3a32fb881300f638fb33f7c4bfaa10b063660000000000000000000000000000000013e001b08191707ad98e21b3e0830286c6f3bf587b971dd4ce39e55f06db427676626a5c31c4a67a996a5725ec8f402c0000000000000000000000000000000012f86ed85113ed1abe9dd3826423911e63df0dfb51ad3d1e0e0318ae95991a6a11150176cec77f9c83268a322cb7e934000000000000000000000000000000000dda719cd2cf1aa769f94c21af20ab076b8f024e0a4903e38ddaca21b6bcd6f00baf7e1ed23259f135eb8bcf9c3f97c44f8c35b920a35b71dcf8d15a8a826e5a7c2a2c4f1ac2c2e3a6d100363e7f541800000000000000000000000000000000195ccfb9038bf9e637b88c83c552ffbd562357792513b15f703bffbd373ebaed715a6772fa7e6e5678c2e6422811dae1000000000000000000000000000000000c5a110f31d71b12cc42974003ba39d99dfd91769c2e93393449083a9b84d31473e3a7dff7ca40164e6e7215b03f44ef0000000000000000000000000000000006233b2dcfed96559b565928a494f2a50c2c375b3d7c60ee6b286c538f4fd5ca6f8b2a61654fd04d679bb3e05b9bcb03000000000000000000000000000000000d42233b7b5ad809c735c89c455ba1e8fbd623e1602bc729c01d362368666e4f90e7b076e32468041f3f5665c6fddb0d0ae6101fac82c10267770e74a0ee16b5be6eae2d455d742303a3c624d52aa726000000000000000000000000000000000f6d53de4f8b20de19b2fcbe8a6b8b8ec4bb801bce7363f89b133532ca7ce4925312e23c618a0182d158037c0d0bf07e0000000000000000000000000000000006ce094e24eb14b9bb1b4a1838d8b6da5f53b5c5799ab8dc8934b488cbabf698b99abeb016259a4e1b0f626d27f2c950000000000000000000000000000000000874aec7c8ac360e3980a6e2cbf3f7468f1df7a8d9158f8bdbb0f387d19f3b05326a081129576251ec41a926f670e58f000000000000000000000000000000001711c9b2ed7e2f789b29073f180e46d0c373d6e75c587ece67b8aaca1e9d9b43a96d04dfdcd42f943eca48e240b72ba8002fb31d0372e7730499b26d617b53ea04821c6eae922326d755a0df31b559ae000000000000000000000000000000000e8ddf88269aebf190bf9bd7a8276de92ff6039e479e42a490fe4ef00f646b049eb8ec4b8e073caa000bfcd86ee8724a000000000000000000000000000000000a9623655c0121ea0575de714e53c9e304fa3309f00828ba0e786112781a38bd458cd67864ab17929448171b5937c1d900000000000000000000000000000000198fccc4a333322599697e904e9096240b9c54f89ee6db97475beead62ebf730da1a179409133698ef13abe1310689270000000000000000000000000000000017b059ac08a3fcebde5888bec4d7cc2c70b147b3b1483fd001330637ff1c036faebf292801204bf2ba49350795708dedaa846e68337f4e9c99dde506a3af792732342e3b836376d4816557fc1fc9b916000000000000000000000000000000000a36274f33b4dc09e03a5ad648af0913e5ee95af83df8b4f2a158456aedf0a0528f9b4832b11162dd67e4d22b26e9f940000000000000000000000000000000008ce96d8bc0aaf2dea732dea188870d398b1f3c266b9bf019e1046cca05002416c910e02e998a1604a17c333c65c99a0000000000000000000000000000000000c1a0e4a80bb0331a94ed14570053f941a0438794e6f19d976cc62b3806a565697720ea03c2531004f13453991bd99bf00000000000000000000000000000000184bdae93abbe4d931a6a51ec85bc330d6181da2d34f2cc530e56b6803515ba87f5719fd6fce6a1a8bf1ee5a968bbfbedf9035283f1afc294ee68b2668870aa45e483d208483d9e967b11990cb55d8600000000000000000000000000000000016c3782daa55312a7cfa02c3be73ed75f4b726df5592351fffae19121b5cba73f427d35d5a2df7c63e2a5c68bf57f3800000000000000000000000000000000018b608343616eff759d512c97257f2103cb0909afb4c24a1cc9d8204274b7c9ed51bc762a6280e223a6116a9b23d1f1e000000000000000000000000000000000c687c11a879ec285180cbae3d2e4219df4614e238d4cbdff148ce5a8d21647c489ade3bf6f738052f149fdbc76c8bf6000000000000000000000000000000000936b34fea3a2633b9aa32244329891e332745876d05f95e4efdef859b23ceab4869db562555e5c8edce87a6fd075ae54005df80aa522e889e7720a9f2e44e6e7e19c3160ea282ec87a4b446d7b1c45f0000000000000000000000000000000000d4636a5e13bb59878319af6bb7c98e5d247c2c9cc970b9cec98027de2d4a8ad12d50906fe302c3d055c499a3742ee30000000000000000000000000000000002b0214bb1ee887a7ff10d458fe35208573456f685ee2fb93bb470762c9e27595cb00f2eae7574c8467e417c63c2a960000000000000000000000000000000001710d130f91861230562cd7ab87984ef45916af8e1168fb17b9765183d9d3f9b2c81c649687842de495a757471e28067000000000000000000000000000000000dd15fe505b1364f134ee77e5e3c1a497a20849b6ec7e201813677a1569a9f5a9edbe3df4c36bdcf9ada139b20e048ec893c9daec43032946a9e892dce960e07d29b304000378145148b9a24afd151570000000000000000000000000000000009a48d7c55d24ba49f890791d0f6a8a5ae08a19177575dc0d734fa37b52c3adc45b31b5e485a5d4a5533470c3549f5f900000000000000000000000000000000090f680c6fc1f0588add04ee03bf821868b1ce588e3ebe384dae657ba7885ef74da0bdc98d9d9594a9b979d5b50b93df000000000000000000000000000000000314f6aae1e99dbe3ea9ef85db7e1693a30869f48e05cdb073bf8e14865a671e75abb875d1b41f13d4eb74fc802299c70000000000000000000000000000000013c698b76dd68d1b9ab41672c2b07cb9a63168497d1144b51509b602c5acd71ca6cd049616d949214d95ab7a906a8f8bf685e6bb7713f8fe202c05dfd18003eff261456026a5185ee9e68aa821fe7c5b", + "Expected": "000000000000000000000000000000001747f6d3154e0717435fa023754f115ce2a2b3241b62525cb2833473d84a8ccf4c95e3ea030f2b8b0ccc61124095ac86000000000000000000000000000000001827ed7d84a61c21268857036e91c732b304f609f285cdc4736c951fd8954b10267a8505f25d8be666792358632058b400000000000000000000000000000000121ac61f59051e6e89a7c1e2fb4df4b3a5b7773f46495a99e55348454e1d9d42254e5e11b841a1654ff9c80b157389c70000000000000000000000000000000001bc60cd06879980bc6ef2ca109d31f12cac28ebe4d2a934076d720b12f430e1bc4d4260f40045cc7a862726521a69dc", + "Name": "matter_g2_multiexp_20", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000012a6984f0f8967c5ae6b13569a62095b5fe61ec607daff1845961bdd827c00fd56ef864802673dd21d90560fef6cbea00000000000000000000000000000000085ececa080d0f4c996d46c80a1fbad2ac9cff8b3e324aabb67182d79f941927050f025b633fd5119f30bb29b8e4b6f2000000000000000000000000000000000987518a5edfd5ae2616fc60000e117a4f1dd1db68195c3fb68d8cc639e4200945b2864d41ad86fb3e11c504fc1f9766000000000000000000000000000000000310939c7e11b93e5773cfd36fa70020c85396e525840742f994110e20019769abcd339db6881291639c193b987b68ae94b3c88e51af5822177b85978526036a426c9ca1077d594618ebb8fac4cdfc89000000000000000000000000000000000ec6922dfc74009c3750ce2540558c7c1e05cb45a5d651b96427c615d8fc563219215a0ee431c0a4827e40b26c4f8d3900000000000000000000000000000000040a4189d002a0e1ec600e71303575e82414e6400f06b9abf57151a28835d454f56421a6dc4049902bfb94dc0e9967ee000000000000000000000000000000000dfefc7c163c34cc004e9d97d812b2717d4736d0d1c722b6bf1a29676a32c8b46878d05a2d137cb7fff5fed8c0f02474000000000000000000000000000000000e3f0c9cbc778693c8ba88af8306d45477493ed6be1bdd9c81c65341239eb510fc948142cc30b73f570819b38f13e20f6e456b39f4efe6581657f5c701c696fde8acb59e856943f15cdd639c1fa68ed70000000000000000000000000000000013705ca4ecca16559713df65b376c7c5825b4f63d001ebbfce9cd1b592af5f2ddb38ac7c5ce3c5f7af4f39f909887e8b00000000000000000000000000000000179efff38ea1044e91ccad467cd2b49438079ccb4d0fc692e79e0bc374abe064fb9979c4a1f4b92c15cd1b042b501d5f000000000000000000000000000000000b6fda2dbf6339af225515681184843f1a9bcd72f7b1389f186f8d0e048ac16e20967c28e087cf09d7bcac597a85398d000000000000000000000000000000001946fca8c816e1e11187aabc40dd2436533d537ce4639eb2d08630ed2ce402c1806b6c2b3e04a960408fd4d2049849bae5d306f46a31c14de7b2940104d0a4424ebaff805a81f1c4a910566057c81604000000000000000000000000000000001802064095d029d3897725eeb93ed6e3b090390769026120aab6977d0de264a262aa312c5777ba322c9eac29e5396fc6000000000000000000000000000000001410f17820941e6a67b1b4993496cdcf0d4fa2d4fda3d43ee985f2606b1408aa9c9ce412c80c90a0c876cb5ecb76878c000000000000000000000000000000001514e9b2c65ca86713447f2d5bb8395fe8552e059829afc68bc43ba9267ef41ec6d69d06e7407a731bcca77ed5d9716f00000000000000000000000000000000025b5bb18cad46179fab15b2ccef17858f9259a90ea4548852b8c6fca69f0ecdf0b175669bacff1625a7143e762514194ff6d13bb0967945ff3b6fbbc104296805e4fedc3c25bb55b75cc997834de6b700000000000000000000000000000000146eaf5da57b6ac788f8caeb4b2ebf7c8999e03dd839977046ca834fffa7e57cd949e3fd44999a007b5dcf3c8621ba2f000000000000000000000000000000000d859632d3424ffe4227ae14856e05c4e750545cf276c97aa9ec03ebde334144eea670dc68e92b61fc775e477a2154040000000000000000000000000000000010b44279c0c80886e52fde5e71726422da2f9457ff86b21426d80356fad95d5ff3a7491002364d9de5ca99c2500f344d000000000000000000000000000000000851b769a691f0ebb53ee3693833881fed8dc6d9e5f1dfeaf4ab1aa7ad54e2fcac246b70d81110451ed78044a98d1547de4fb2dea292b76d8130e6aa8aff5edf0097de935b252d42a777d4d9b8615ef100000000000000000000000000000000131c9a76109929fc977a0a6eda0a7c71cfc744f5f3654e2221ce84c70787598e24c5d8049f92a7c4d78fdb869cbdd1ed00000000000000000000000000000000049872d2c7d472e090d2975daa64fd96f33e7f934e739633b1d7fcd5e771673ed8820752a0d5c8b0c6933318293a4f27000000000000000000000000000000000dd68fbb592a3957ef893180dd758f75978042add36c91b7bf87c4493b0baa875e1854fbc09e6856688cc241b76ab5a20000000000000000000000000000000006143699816cad8ab7583a72b6064fadb6caeb51c8625ddbf7b2911426cf438534da1bdd13e22cd545495c486c9733f7bac5c50a3a8a37111114c22839c88ce4072940c06f0d8b6d53fed155d0399ed70000000000000000000000000000000006c14301984607d569ad1bd774135e7c9e328be1fe54c3b543276bd06bc0bfff11f299a5eb43b5218c3605011d0ea6d80000000000000000000000000000000012f0a848022f95f4884380a5b8e3637a41e3c399a8d2765aada85dcf4b7c2b559122f792850430681a58ca153be2768a0000000000000000000000000000000016b4cb233e1bd59b7b362c64620eaaa5029c173a05e2278774ad6ed746c70a2f6e76c237182f5d9d790966ae69da5d44000000000000000000000000000000000c277d54a7a72c8528188f6cf29d934cc66471607e5e30d493cd11be6b203bdf734aaf37b686cd7101e8599b69446991c3f37387bad1af3a896a7e66a80dfce2df1709fa252b6fbe4334d02bdced432900000000000000000000000000000000169a3928266375dd5793b7504727f939ef0ed52d69e569b1b75a0e094698b37bc70472578beaeebfd0c3df4bce6177810000000000000000000000000000000008936d470dbb86db1567bb2fe7c09971c6d12b07208d9b1b403c20fbdc05ef8984dd576457fc6989470e40ebfe4ceed30000000000000000000000000000000009cdec9d80f2bf3ebfa9a3316e4250741d0d089245df2fd3c9bba4bac1c2dadfe212682166a0962f78c4bf25b618da900000000000000000000000000000000016521411286cabf3fa2c8f72ca62ca311738fbe63717fd12916a4c9e6af9b05d1f5d65cf60e84d9fc5f7b7645fe9bad570fbf5da3959a49fab7e97b3df3f2a38d16d714dd798a1f04ec2cbf84fce76910000000000000000000000000000000006a827f6149a320a74d9d8c1ae8861c1cb963b3eff899710eda642dae6ed4dbc247a22131758d9f843c62710ce083208000000000000000000000000000000000c83a9fd96bcfd4adcfc6d5a47e84108bd763366e91bf06a7431c6c3a107cbe5647da99ee6c1e57c376d366b21a923df000000000000000000000000000000001604d5c0364afb5503b0e1d52226988d7f7f043ce95e7c0a09d7f96e24a58f089156f0e6d19022138170c1b4b7dd33560000000000000000000000000000000019a11c86f78ce462f46e0462052cc3d342596b329fb62a282a59bbd64c345bd266922b1540e40aac147681754643c2e3e538bcefab5d8d0be5fc143e632e86fc065af3f2f621f293b914980abfd6a0c70000000000000000000000000000000015635de295c16841bf44c73639f047f735175e8906301746837838d124bf0d2a1ebaee142393ce9a0d58107c7cb036e90000000000000000000000000000000004fbbd4252fb901d0737d1bf4da62010c06d690a9584c7631ef5d36f1d8c37486a83f2a1e2db21f05c993fd117c662e8000000000000000000000000000000000f4cfcec1545a08e0e0298753ebcef5f61bfdb7c1b9af71cb4c2f783e4fa3948945d357e8302d99aca96df0cb0fc01a3000000000000000000000000000000000f543dad6d4b797f6fe0b00215a5f70f6340ac6bf7cb0bdfc5bc7698dbf0647e4098413dd19ca7af01685edaaa190c6e30b921d8cd2ca46aa6f3e0dc6ff08d77972fb0a248bd39e90a1e9f32be9e892a000000000000000000000000000000000ed552e94021d0912a0e7563462570cb572b189569eb847bd12ebf976d22343b9ad04d400ae98fa184b10ff36720f12700000000000000000000000000000000178727c3e6ff33be9894ef26347b104023ea0bcf79c1a33afc26ac0ee9879344964fada757118829214cfcdbbc0c5a30000000000000000000000000000000000b0a6a575afe5b0c1e287815612fdd3838ab39e8ee7795855837588614715f6687910c42217ad52c1b8721a9e1c908dd0000000000000000000000000000000018cdbf244c78cae1993400ae164b42c09dab4d8e3707a69e25ffa8d0b96b8270c022c0375f933f16f45c9274132a0a633a5ccd9436b15d4d04a8ee9894c116190062c4e7cfabb047b585f3aa1eeb460500000000000000000000000000000000070636611f903f55cc9499481bc3415a6de62d5e6bf8bfa82a8ce665f85bcf01690118441961ff46ff701e361db208500000000000000000000000000000000013d22dff8f6f86f659ad17ef91d90a70c180538f03e10de20c445d22e637015d51a311a3daaed90712d04c9a3d992d12000000000000000000000000000000000db3535057db95fc262f8adfd7f08f3237fde5f0e2aab589d4ddcd9c23aadc437e13644dd3b3534dcb17936a7c610cf200000000000000000000000000000000044c177d4484c07fb04d1dd477b188a2c157973cf26075001d14d2b07ebb9dbf8e495dc23b32a2419621e1c129b08c5ac7a5bf2cfedd7048be7ac7d2ff19d4f8bf0a94295ebdc5e792393e0e4bc27d56000000000000000000000000000000000e10fd069f2f5fddaa0112e70ae89d1ecf034defb24e2923731a7c0068780177c186fde92a3c254a1cbdd255111a4b7c0000000000000000000000000000000018363e01e86e2e922ba435651ad892bf9288be14b54dda821c397ae6167f9478c8132e92b1c2cb0c4037a4e020f08291000000000000000000000000000000000301b5ad2d5c35ebdcc7e7cd1ebf0405cf204d6f5e30ae6f46d20534eb6d7013682c5ae1bba76d2811124ebded0d2a590000000000000000000000000000000015fb3a8afad778031d04e094cbde5f02dcc89ad7b7d452c6c8f41be336a4c8b26e75cfc685b8776cbe5a487f09c304083563651d5f5729a0ffca6b383d884823aa3b0215fa057bffd8142199a16e4ffe000000000000000000000000000000000a7880b00f6a3e959ff1bd207fa503eff6e7279e701e37b40735e2bc8bf49e355e92edcaf23aa3654bb26fbfb07b5fb100000000000000000000000000000000113d9b792f4e3dcd958664a8778dc4b177c430d8db9da7805595e40293ef2c0a40f7a843bfa70ec134ed89a453f9da50000000000000000000000000000000000d7f92148dca4a9c96c47a0eb284f1834cf3d141be7c0d9a7a060af6e28e45620d8255e465e9a0d8f78b2ffe17d6b04e0000000000000000000000000000000004e7917a8f3070c656d324c9a816236842fbd6147d326652667e7bca0666d214233ed136dd9464c4ac619d46c28e2393833323c3a668541ceba18375531c3781dd98525b49dafce4c4b3188c90f3f4b500000000000000000000000000000000160cb05390b54151f6b154b396bb400a91fa83d77fabdf31fba349d1bf3b5dfb6476ad4d714af2a2963e41b077bffcb90000000000000000000000000000000012885f7ec8e780cbaa90a465b5706cf07d45bda7755ae3477c79adbd7956b926e0ef5303fc13f0b97349ff8b754dab500000000000000000000000000000000009ad7509e9e7f5018ae3d1280e881ec12129cbf825cb6606459211ed7b358a97cbe430e94dd9f5e4f6b74fb7287f862e0000000000000000000000000000000014d5d2ac2dbc3d5a061f4e52dbfa68e1eb1d3c818ba26686a3171e310c63cfeb188030b83407070019dc5c42dd079413d422e21fbffa7d55270eca9c96bbefa29dd915aca266071673e970daa0ca9c050000000000000000000000000000000008ee93fc610712411634079be0bd96c3969b48955fe5478b7a31c3ba7639c18291034167eb62e6b15c16b0dd5145edf500000000000000000000000000000000158cb1731b71905d7b958c5407f090a2c8a9319017719da143a3f4f3fb3982abb83b8dfe14facb014321b4f5edb5e41d000000000000000000000000000000000a9f98f775f06055ac1f137cbc1f95f4afa0d1c4935f536ba2e0569d874d9d76b7b86f71afcea07e2e785c7a6ee1c84400000000000000000000000000000000072f8988dd1ab0fa8037d3620068b34848c65e20dfc90612d123b6f9dbcf9d9d699d5ea73739d31ad54c22116365ab983ba7ea9ffda87131452b24a9efcdc91d1262d0d7550e5a6b787eace3577159b0", + "Expected": "00000000000000000000000000000000161203d8db1381722644f87b04f47e4be2ea2bb105ea0e67678bc8d29f8a8a3247f8c05e057af8f98032faa93d896aaa000000000000000000000000000000000d3af4842627a095a2dca99b52d802b2ef8c8f3d09873ffe39d224333fceae84bf74780956904df6c1dcf5ba31be218d0000000000000000000000000000000001c79fae014e55e5d0239645d618593bfd5aef665b3e636dac5d191a8b88949d207cf0ae9822ce8e1997de302b386b8800000000000000000000000000000000136314cc68b372b06e7771d82b7ce7bfd0e9fd306787e07629f831c7aee853bed80172121949a940bc59c4a0b76f0819", + "Name": "matter_g2_multiexp_21", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000099434adf799099f2e6e2fda4c905e1543893462133ba216aace25836db37b3dd5bd80af1a8c31c7fee56b5ecf9a0acb0000000000000000000000000000000008a6890e5bcacc13e116e3fe2d772ff49839803e4f81d6b088ecb7835b1ed44f2bfa04de1d46dd352346cdee71774e37000000000000000000000000000000000e94fe40225e863b7bdfab4cdc0c1c8d1399554ebbfa3f2c95ddeda74b3dff03d5cc78e295accdc9f02f3f89b4953de3000000000000000000000000000000000b23f2912fdc7a5fd1de69c1f479228f8ffc9f97c40845808cf17a6fd8131ea60285640d32bcd64c9be71d419aae82fb16aa2cadacb129598aa459bb2e6b7fb26d1bcb7a49617b6ef8e57018c3db1f510000000000000000000000000000000004c6f5aaac90132b2d0c6a4e70354ed2e724df7c3e6298eb9ae4ea92e3c7981944c89140c52e893ef2edb2773ab36bcc00000000000000000000000000000000021e813378be9ec30395b917ded5a0424fc7eab0abfdcd2328f725bbd6a1dace0a5aadebe40e10470df0c09b3f4b68440000000000000000000000000000000014e3fee16a833f8c543860ca438d763f764f488463601741a2331fa90efce9f6d54ee0fb7978460a1ab838039d398918000000000000000000000000000000000dec8bb882fe6028a4155e6e2bf48ffd314b5519dc4560f8f7410209214c4a8e37b2b36facc53f4db11ee63ff11f9f228c02014d5392d30863a12102d1c9315839b5611dccfdb489207f9186625138500000000000000000000000000000000002d107029bea087a2d53b6b371aae06c695fa85631450f4ad92c8948b09ed568b28948f80f1455cd22e2ad44697290b00000000000000000000000000000000002fab10cdd8bf17a633c8b3ee8ed2ce783f64bf978c384fb7dbd7e4f0da50b65eb9530365d982bcc17ab91a29eabc065000000000000000000000000000000001369237fb3241ac291a868e6f4610a5103d93aa915e954f18bcf348ece1560a12451723b96ad5fe162a6107dabe1c986000000000000000000000000000000000cb70b7064a2f94efc86060431ba4dea38bc64822efa73c76f3a4500ad23c452c8f2e72713b066a45bfa49559d14a719d960ff678e1b46ada4f866adf354ba8c1514df10ebe7d88d2c8de117ef5ea2490000000000000000000000000000000005ebb9c8202cba234851cf5e060a4114c6fee0632f37e0c52aeb852637f362ce64403347d336c32617cc59f23cc7c93e000000000000000000000000000000001126827b6a0a8adb698854c0089276861e3cccfee420512f0966df78ea0d9c55e85a0536f14ad40e649b8fe4384c836c000000000000000000000000000000000998549680649b294d506c529ade746aeb087f75d62a246b7abfb69397ed67f0f2ccb4811219b35aa894b2f87e3fcddb000000000000000000000000000000001027b604f877ade32df8de6162251acf2751a9bd770c21f22dc819a4f5515bb276a246ad667fe7881965f0b083d1f76304753af76295f72295645243ffc87ffc2110c9d8dfd20b464760ad965d7a97940000000000000000000000000000000005d1484bad44069b16d1ef4e9ca1db70ec6cd82eca645c2fbd4029ab4ca33d79780ebc144d8774d82518c1fefaab38530000000000000000000000000000000019abc7063361ed64a5750b70bd59283e6a61d55d49d8c2ea2f1be8ea425f040d3865c399a66c253bf38355360f06cdd40000000000000000000000000000000010a97b13b3b579ab5f7fd9801d9e4fc40f3b2b2acb9f21bfcdc6b6a3168720fd0abc2f77ccad01be6a6e268fddf3759c0000000000000000000000000000000004126b5454050d761047e5da23c0b2f9370996589c04f255a1ce8ef37a3a7c8078788a0125e4aa86aafce8df33f322d3d1b8760cc40d093912fb073c5012f910ae90f0a979cfe6d81c603adbb98289030000000000000000000000000000000017aa7a3f1ebbdec6abe12abea12ef50a3daabbf96a5f2ebfb517885f0b7aba1e927c682b15521529cb9e1f87c59be99e0000000000000000000000000000000016e23f7effbb9dd34ec1f6974115e7f0d23cc4553d86e6d61a0c98f47d09510e06b3f987c5bcf4bc30e20ae9684da74e000000000000000000000000000000000f3905dd4f99cfcfa6152db53106b4d1f6e24518a822da9388d8ca1dd654a4b8315697328571691f105d1abe9aad3dae0000000000000000000000000000000006bfd10d33df9326a55b35aa6d2bc3e831d4c3b5959aaa35613156e5e19343b74e34ed2670c43ba1a45cd3d91f055c9aab79d640b042664b23667d6c60ef9a5d59de72aee57a78d75752b350ce56d8da0000000000000000000000000000000016ca071d741363e7c3297355e49cfbdcf03d419813ed7b329cb2b2a26fc6a46cc52149ca3e9ca3ccd7284cfed97b985d0000000000000000000000000000000018da360fdee88e806ea1a61c01e86687f8e5359730c36c876ad2acb0297bbc1ae13d790d1edaafdaed65db9dac02a74d0000000000000000000000000000000005a46e4572f667b46aee36b8d377c249de25e797b31b822474aa647ee68cc7d40b083fd0a1d938e2b8d85508004c73f40000000000000000000000000000000011701bf88d4287c98996ea561c1ab2f29a5da9138338c7c7539a5fc8355efab6f58e240df4b0e0cb7f01df74bc8010501d1a2965e995bd4380d4ec52fe8e65e7fd99b1ca9f4f0c656adf7051c4b9a99a000000000000000000000000000000000576e79e507d250eb4040197064b8898b0142b3a2551875935f91f22705bfec6da156c7858fbf77028d4a00957553bea0000000000000000000000000000000015d39a325181d6d1a809b1236f4a1ba66a9bfa6c448470425aa5c8ef9fd00b5481c51e8752088dad62e928b3180408df000000000000000000000000000000000aafabc2f68a4933c7d734660e422ba154e37dd90114272e948f79db4ca51d5ca75d504cf74f2dd0479871d69a08386f000000000000000000000000000000000b017c731f63bbaa8fd0b0d9c17140060429f515d2e85a938d10f6529deeae4818c29b9a628802d0ffbbff720339b7bf2cfbf2abd851d2c1f55c56d4f8b11b196c020c2584cb03764580d410d66784d400000000000000000000000000000000028c4dacba5f33ba66368c19491f4baa6aea4f309afafcc8f464f2886b1d05b6397142d02f0295fd50825819621673a1000000000000000000000000000000000849e1b630e8db8ef039f280f8d401957f807ca90479745b68c3db1b5ce3a02fe2c099ddf9c387d7ed76ba75d6a9be9700000000000000000000000000000000013b43fabc3d4df82058db215a69776ed5dfd4c773d7a013dba3b4ef5cf65e25f79d7f76a06ca99132d6fd1fdadb59d400000000000000000000000000000000072cde8eb3d3e1a7f7e4a9eedb8e56f5e103db6de6ccf833f818f02a0706b2043d4ba0d5473bbb6472e8aeb28364e1d8214edaf16742762baa58a3d22d5bb2305cb03a1326adc68adcd268428f82a1e00000000000000000000000000000000007a33b95f42cb1d1ddeff3a199ccfd9a5d47c9fcb89dc09b5b3f59dde2b47d24ff29931920b76ecf6deacd70e83576970000000000000000000000000000000014c0a63e0152f06cfc32e6034b7829f9d9d09aca0a6ef821dc61ae8d99b77d76c1b2fafb2a14938a82ec72c4041ebd9f000000000000000000000000000000001433135cd913b05b3f58b2e9c1a3bbb951d2cf6c92fddb21bd5e1d9c44e464d5fe98f0791044d56e50b81a83ef6cb271000000000000000000000000000000000be12ce3bc47bf69a13762343b5e39c2a2f285896e5d1b73c55203cae2f32cccbb4f7b8230b2026a0c8b2f63db5e5bedc1f38916d6bdd5d379967dcd058ebce5887ef2bccd5fb7c2bcd758e374a195e2000000000000000000000000000000001494984d478784b2ab3ba27464109f99172033fcd5780a48fbd5a2144354157f6fca2d70b15b0081dfd306ab4239cecc00000000000000000000000000000000078aebc22025af53c6542abe56cf72ce5eb11d3f19212a0f7442d0a0df907c8aabe0ec01d1245ca237a691e685011bb8000000000000000000000000000000000415a1804a46f4595014ef29b12d99b89600aab1d98352437ab8342abf479bb2215bc687532e75f140918b3d030ad4520000000000000000000000000000000015e7b0dae7e3e80eee3c7a9ed4c739288ac2192f7d80b2c8cf9934cea5719081803b207623c771051d7694e705744dbf1cb8c8303157f23987f8a2d206f3add697b9d0a303393008429e93cd35711f74000000000000000000000000000000001470f82372e197a21aaf46cb2bd3c0b77c3428bf2ba073311e75eb65471a8164753ff1d989560f1ce477952bb6555200000000000000000000000000000000001645b5e5b4bcb5f6d34ac841e3a80f09a86a5edcb7f2a7e7bf549b022c0073e01be82e4c9e5c8e8de76ba367595639af000000000000000000000000000000000b43f6572553154e2530fb448d5bf20c3a182cc190149d3b1d75b60e45baa048f44884500fd02c434f9f7eac01dbe4170000000000000000000000000000000014adef5a52d76a267f87d9a8b5e9f570e7775ca4f6a55a5afbf80baea311b1866fa0689271799a654eddcfe36a6bb64c61ca9ab9c3df673b7ff8be098cdadd8354c17becdf82e7e99ce264174653007a000000000000000000000000000000000345a2ffa21eb06fa1d76fd81b1239147688093c6a44a40cae37f2af26add812884bed3e8b4643675b1a45320c64f7a8000000000000000000000000000000000c58eeb5ffdf886d6319ead9e6e190300ceb91d58abfb79c0a322de3987eee73ab82092eea8e1249e83ab67e33b303e1000000000000000000000000000000000763a3fba513b6731fb501aab39a4697f3e4de89125c6884f9782bfb73e6e062f17d34555a04a8e2959ee4e1a2ee284100000000000000000000000000000000024180dde2d23cd88cd29c8142d32435d0db57b8ce8e309701fdb963533c1cdc2595e3bfc01d8c0d08d594e096afb34a681a0861df30946911d789a5da1f5b89c38fa1a8c0407b608122a18be05955da00000000000000000000000000000000022d2e7502c4d9587df7ecdbafcbb813b1812d76655cb7f9f57418d5ac83d4f60b84a0ab5b53a5eee3c3954aa9fc70cb00000000000000000000000000000000083212aa1316561a079cb8d027bc8f89161fc828d050c8837a24fca6f7f94b6dbf10d6032fed895a427f07827deaf3cb00000000000000000000000000000000021552b99dc02a051ea3af1b1bbd0a7ef64088c3aef4a58b18a29ca05e1f442f8ea2c8fdb3642ee94c5df501ff6898f40000000000000000000000000000000001015a7987d329cd1eb5f991c270643a05b8e1bc35467130e9f53c5d96fc3c8336a00c060dfa2d3165358b51b6a521e56f0798b448ea0d10c84e2a8896f153b1ac3b84c5fed6a4ba6c932260bf01d34e000000000000000000000000000000000c19c3b9d7c7f520968d8531966cccbe6f0c3fa0938480ca3591b7489febdabd56a70ae55cc309e04d7acb3de6f41a3d0000000000000000000000000000000002ddc64023f0de2730d3affb695927eaba50ecb91cdf1f369a511a8cc8dae8913ada2d8f27a65e75deb9b8b648e4e2e00000000000000000000000000000000000311ef260debf2310fc31fb8ecc802200e11400909eba24b14d9500ff47c1c36ec540eb970c9262dac947b0c2053d6200000000000000000000000000000000199c19645375dea7602b74301adcfd9af259e1c7c20f377fd10d56b719f7a6e0e57d780c976124e0675c2a54aae3e0f5a8b7de8f34053facf1338b54cfbe38dad73121a0429663f484277af9a230abe600000000000000000000000000000000123fce6b793de0ce2d31f2c7c4218fb20f9db68946a7d57914174ea773d6e6fe1fbb1de141c742e0a8154fa1d81a91f70000000000000000000000000000000019f75536e004a61c6d7f466bfa06ad0c9375a1028eb7746406e7c71e551dba249b5c6284f635fe26989aeea69075b3fa0000000000000000000000000000000013088eab16ec77c7ce7e84236337e395690169a4ed7e44e23d233d36d5d25e6afde794cca2bee88fe749851a71aabe24000000000000000000000000000000000e627130da43a6ede3bd6f2fcdf008c8f5c7b7b1fa56cd3b367d3096317948bda115d732346e73b731d1921a1da6aaa18823cdb73dd076ad95679a9d7b11145c12a81b825477f799300d1fd761417c2b", + "Expected": "000000000000000000000000000000000e3b85a3d6628e097a3d962f3c9aa37e3c5be43faf2a12cd9830ab33c4a904eda23027735bba563d38ae5ae8b302864b000000000000000000000000000000000c92be62cb091056d981ab8872292017cc22ae4eeb0cee03a60cb5d57d37b264fbed2d752ae9dfd76c0bdde1f1dd10500000000000000000000000000000000019e172b23249a17924b890cda6a65287039d0c32b2c0833409816cb21ceb73ac95928234ccf566287400a2ed7d9de771000000000000000000000000000000001276e206235392fdf65e4ea6210d22eb7afd7783caa0777ff0af719cc1822579d5b82fb4c30f07dffe7d68c649b9e2fd", + "Name": "matter_g2_multiexp_22", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000000a3d974770eda8c742e5d380482d36fabe18901b0217485141c3841003aeac4459ee28b280550e4643d0f50862bf2e2000000000000000000000000000000000369c2bf3beae4e8761f6c06d9bf5261bbedb177e609c81c9bd81ed0a17573b6e10e7f0512e06109cacc3d483918ed9400000000000000000000000000000000030253d0a050986f49c77ee20ea8e3e07de3ba72c39ffda877bcfe569eeb29598588f5a7cedd9e2e34491a059ac4e707000000000000000000000000000000000ce201f07353bf82ec894ec66c7012d17f3c7968b28b45e88f091510e1646380f902c1c5b036084f9497e9a91476dc2c9f2e54f21b7f2116c30d6e444ca82fe800435cbbd72a98a6d22bac92039c54070000000000000000000000000000000018f493dadbcd93df2c614af310e5aec4fac9e502843b8ca8c3de739315d9e9a380f826e2470c96bffa8789133f458d0a000000000000000000000000000000001768f8c3da107b9ac30a12b99f2f3a0f21483c0be334377733cee6024d85af91b03c7ea1c548b42e7a7869141816917a00000000000000000000000000000000076cfc99c16c270d2f6e34aff84832f9ee6493ab757b6361cc921823fe9c30f1c9b1664b650548dba767616bec0fd5d80000000000000000000000000000000006c5f580c9556ed31847b1a3527ac0b5b5f15b9c9197d3cff061c1cf72dc5c96cb5fe98535a4dca8c4e20c8c02158466c8cecea241dd6a924c9b9cc3d390fbf40ab897208ce9d3e4a148b2c30c25e7eb0000000000000000000000000000000010e2d7eb4e874a9c72a98e4c36701a9fa11051b683ac8ab9ac20d14929d72ff7b92a9048a11bde92dc2696467fcb48e6000000000000000000000000000000000eb29e621e9d0af8f661eb1ba90b307eb542dd84a486568f85e19055bf7b8f0a76d34acf276897a01349eff2c36e4b43000000000000000000000000000000000b5f890f22658b207dea2d721d90a8f5991ea2c5ca06b8d1b293f60959ed424dbd7052e010e594a5ee0feda1e93bcef4000000000000000000000000000000000082cdd4d8452078e8b853f196dd76505ece5e98df3e6a8bbb21f422755af23c5ab261accea48d8e4193d6c884773cf6e428fab2c596f23bc3c9e9855b74295f52caf73cb7371c93c65370583f7fef4c00000000000000000000000000000000077501a457d5f0946d25a4c5eede1b7fd80d90d502bca47d8cc40ab2f9a6d827d7323e7d4035f3d32b02401141f0a89d000000000000000000000000000000000985410246c1db01b42728ea46758906883586cba5618b66c21a3cf58cb98e7c6e0dfbabc5505d1d11ca9d047fb6d25f000000000000000000000000000000001775f4008f688882d02355b6eaa1ab108f239890f71238b36c76228cf2f575cd15f15293a62a72f6ad0ff17d7e8ae79f0000000000000000000000000000000004b6967a5ee180d8b92e95c5ef26baa56d8509e1acc710237083d19269c1c5a1f2d1680e85f0bf040747be1d301300b0f7d3d755410f77a0e4b2fad0f184fa9312b559785fb04c6020432465799ebe22000000000000000000000000000000000fee170589e8a3d3fdd93b536347af5002e59e8ef2ac8327a7e9f382560ee9bc36b3f636a3f99fba8be7b5ea3dfbcfc600000000000000000000000000000000032380cb6c043e3f9ef7169da12df1c6529d776b049c7061df660df841840933e514eb7ea3152ddac38daa2c52d66191000000000000000000000000000000000620ebccfd931eb70ec688110975ea24b7ee0f9937841aa1b7bf4f45af88b732b76a26299f0fe48259fdf08abefb4314000000000000000000000000000000000dee6bb8c198363fa4107996331aac07216b82208242c73736be31e14e4e04d97a56a1c22479dd94997acb0d32abd3b0557b05efdd02ac9d8e1453c82a321d798f3106bd18764140faede610ae01fa80000000000000000000000000000000000eb60e98d6cb4e4b3e58271d47261d05be892eebb9a37f6831ff19d0bf2fc235e655f0eb9b01494868bc082c58ed82d40000000000000000000000000000000007254a64a0d94340bcc2b0142faab2d73e8189dbaf52ad0c3a9206e802193168b8eb03cb18b0e4f1cc95b98b943910db0000000000000000000000000000000001e0051fafaf454072051d2aa9512ba2367778aa1617cecf6a7f989d69c7627c9070c349d363f56711f172d43f5730cf000000000000000000000000000000000f4141c8a45448fecce09908ddb42f7b5f6b5bb53b9e1ede0417bee327644af5c98470e8b5364642fc7435f84be1ab443313884abc4d430c06ae843d263f2efc1bba35f6cc270de05551e1f86096bb7500000000000000000000000000000000049c28e0bc677ccf54f4cb46e953a057ffad624752332fb9ee5295438fd5bd61abd2199a0bb729bb7678cf3077e32ec10000000000000000000000000000000007138a996356ca3f5d63bb5a36dfe901254459ed515e18ec8d91fa747a691b40a19878d9a6f1dc74e4f18374a399d38f000000000000000000000000000000000a621b36a3cf04e6a5cb699fe4ff7fb8b3361207186848e81972fdaecf667ceb35f413bd68772f7c1f77c1d3f43a3d610000000000000000000000000000000010becda5a06f3f077218d4387158e4a1ca5e0ef24d4ed304723ed5dd96da7cc9325f7e4ae16d9d6c348577697aa6017b8faea236e782a8fbe27ab15f051ed007a61e25247f1f259b9300974f521f30c800000000000000000000000000000000163ee307e0d0c3b61ade05a022ce2bf315d820ee8ece60f93d63a150e02be843a2eb2240a4882c29be2c7403932c348e0000000000000000000000000000000001fc8e9ca23e8dc8457df8f255db3b434f52cddaf05819dba7df1c5bfed438f756c8b57442197af18bf83fe9ee2b765200000000000000000000000000000000109cbe5279ccb592bd0b33b1a482df53459c48cd0913549739b784ba7ad32872377c2e3924c4d45064b0cc4764220513000000000000000000000000000000000d789795d556a37a375d83120a022f57e26da6e6f9aa3e40e1f32ed04b50fafc4d40d0b9b20a26e4d230dd789e20823013994f5645c6ce83741e48ae472674921bb2d9b8abb7d04ddbbb85a3f2f7f090000000000000000000000000000000000960654bd6e6a6b2f7d87c3c4d6e3fe6c684a50b62f7acf82a67075139a614c056a41cd49769960e229cf07468fc2dcb000000000000000000000000000000001727f2dbcc8d889127060de0079207eed1e094259b59a20fa42ab2783bfd176da00e61a65709dcd60402398fadf30710000000000000000000000000000000000c17805a01e64c320601e0ef521b6573e9c2eb354157cf0412e5c2b13f826759310907c4b77164f5899958cd30f78c030000000000000000000000000000000010fb286ce797c0429ad3385c709259b55cc962ae02c814e537e5261e897b7ee1b7c660273ec908110f997b166c14f5c181eda24db328588e8c670ab70431ddeebb0749b431bc1bfbd992c91f35d59b180000000000000000000000000000000015d96a0f988f4951206aeda63af85910db49ab817c83e218ec74cbbf5f34f81279d8a3f2fd1f3000f73b8c5550af3fd600000000000000000000000000000000186d2eca1cac226227d8981324859126864b84e8dac563b4d92357591c2416c93989cfd9e1ab6ad257dfeb168d829a09000000000000000000000000000000000a8a7247a3b09583cd2d4949721160573f1f88221e6eae833128914555a594f21a3fb2bfe3b1f01f3dee90f7772dc97d00000000000000000000000000000000132361ac1950756549c957c174cab9ef586eb2057a4eb22f49252cae032975f56eb0cb7ea70810afaf5716afde5b88015bf25b5070829e3d5a66ad24ba9930f3ad64767c51e432b51bdbe2fab470688d000000000000000000000000000000001328e22bb83331adb09dbed0a8c58040a3564fcae0ec85794f26c077de69cc0a7555f011e028879cb3aafac4dbecab33000000000000000000000000000000000a93db348adb3886802bab1e993f5d7275360a5b0466845055d5274e44716f3e1d03a6e1796ed4de4c157dc8a2d92c39000000000000000000000000000000000dc0879a8e9556b7d9b6d5dffce5e648f835f10acad3afca7a73b0fdd5d5babaa74a1ca80aa4f6880d9b015501e218a20000000000000000000000000000000003f7ae8207de4a179ae48cffc8c6e926455e46ef9e109c08be3ae7401bd36e0876642ae9ac4fd75a74c67ffb7790e265a9535c082e11b366cda0000d8ed0f92ee30fd2c4364c163a718518321c5e85d2000000000000000000000000000000001078f43093602a2dacf9b5dd7ec41d47bff02e0dd27a996b58c73febca06e3d977c2fbd73f63508243696ab5d8b97b980000000000000000000000000000000001841869086e850ad97b3122fa51c437113d2bca14deaef5715c354d3845f6829f6aebe668844352d5af3509c0d8da7800000000000000000000000000000000047c42e83194143b9e977fa1babf80d455fc86cf6cb491ef8306a1c32bbf8c868e11bb3308dd5f65fc2942b3e49ff5c50000000000000000000000000000000000872ce87ecd22b39b14c9036e971a562d51c5122bb10939cdfd1945dd1445ac9f5de06b70931aa5c86cd0fda51b89952c4cb49adce0292e259e92b229bf7965864a945de86eda3ce0bc9f1a6dc8b7b200000000000000000000000000000000157820de2a134081eb47b1800ec72630348583d77d512b4c6a8c8e581810471a2f57a8eb6b0af87a91960424009ff124000000000000000000000000000000000378cf11b0a2848b06412aa754ddbee5660730001db073724caf902d4b4894959f035a8838e28554b0efc2388f2b4f27000000000000000000000000000000001301d15f290dd11c3f8e53407195e02dbf8f13e4fe25fe38e84740753b5a0032f8dd07df3ce46ba424f6772b3aa66f4f000000000000000000000000000000000d166040d457187232f8f38f2beb1e0e0864105595764022c282867346166e46eb789786a7ec7c00b0446207e9ac1ec05e927f57aa85b2df54b4bddaa041d43766c8929c8b9146d723806ee0cf042275000000000000000000000000000000000793797c5bce4b1cc3bcd751c5ae1d293477af96a0e7c6bd392ab4410f806a53088cafeed51754ee7e60e61dc200ccb00000000000000000000000000000000019d595730af1f3039e37494b86a638a528d8bd24c429e3f8bc97076c7463e7f2618e23bd3f300bc7e7a4674f14f8295d0000000000000000000000000000000008e245c7590888fd8dd58f93332b81f48b6e3acd3cfcf5f3b28df654eae1172f52ef5a121707aa9cb111b0b402d1bfa6000000000000000000000000000000000a7c6403659e1a0c2dc7cc2e9b57a452bf553e96388676f4bf4a6e26b3ca2d3cb82006850d8340dacd65aaa0d20e6fba606ee8a5fdd9890b8017f6c432a45517d65328f13f3a2bb42d7115c02929db7a00000000000000000000000000000000054c37e8acadcec8a795619647d4cf1081a0592de02bef916f847936a1736e74cc3b7ee018717495def8b4ef1d098fc9000000000000000000000000000000000291d89d152b414fb5e7139d6d0bdc7b5b9de1fc44b49f895ae08718b631f7652bb4a895fa11149b9a9db30c344108ed00000000000000000000000000000000107b30992ced35e4ba874e436bed5d88aadf0a0c944ca3eb8319539017bdd652feb7483ab6c705aa17e845723b2cb46a000000000000000000000000000000000895dd8e04114fde4a4cf19925004a72f617f2ff146dd650a2cdbeb12977dd2b34ea7d655dee16ad9560b144b81212f5c1a77ccb4b32a762d60b37827ad6c3448c33af6af861c131adb5920ba3c2b85100000000000000000000000000000000005cea2e036a8ce057e4dbe2d9d786eb759c2a75934580480f78d2e228c3150a0a1d8c95ac5013aae3ab6e35f524d37b0000000000000000000000000000000000e18c18884209f9e4fb17431248a5f8d29c616a58af16e949f4317c2e117b80d531a39800dc70f6b161b98ba040a8af0000000000000000000000000000000007c42ce885d1bae906128589b72f2e6c18e4eeacb78c853e923e6eb785c073b6490b2f6b3dff2276916d96770ad5019800000000000000000000000000000000132d809c37c341eb0304ec933a6b11bf9ac0d2a13ead818ab6ee03ccc94160b405066381dcdb13b6ee3f5dca48ee10ef47cde609c38eabf457cdbd1e0c5366bf523dd5801d66a0282bc187d80417f455", + "Expected": "0000000000000000000000000000000009406918e2dd6f06f4782ed110e29516a911f47133ad8adc58f5780de916a8973ad60e05ba931d66de7545a92f388c20000000000000000000000000000000000041cbd52cad2a5f4c8353c7153b5711ec23fa8bfa2f34f5e1a16d8a14cfd47c237766880debb992a05ba9ed0353beea0000000000000000000000000000000017d4211c827379b310956371129011a92d62d11f0ee5b0cbad9eea2d3f2a95d364717713fd0c544747338725adf27248000000000000000000000000000000000a61903fb81064614c9c6894c7f3954aace7611cedf6bab8e751f0c203bcab827d296016947c071d7b6ccc742e28ee9f", + "Name": "matter_g2_multiexp_23", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000007f90813f8c3eabcef04dc1bc9bbafe1dafe220e2db24e4b714aab2b164d7ec9df3e6a3f903e8b7b96df2ad8297381d2000000000000000000000000000000000e34371e51c4c952a0f38c4aaa5fc2324971ade310af2f36ed511fc5fd7a602a551ef77775fcd0f1fccc718710239561000000000000000000000000000000000787edf7a6ed6b50afcd7c0d3876d8919273428bc49833e3503f650e48e788b15cd82eab2672f612025d796bb62d72bb0000000000000000000000000000000006b49e631ace4f72c959919df5d64c537537ccaa3d1890ea9a1d70f9eacbaaa2ec361edf2d4880c9810976c6073028bc3c79fe6374bf8f91bf7851ff935a124b54fdb5db498d2d37939fcd43bb93d29a000000000000000000000000000000000cb63d7eef2d6614d1f629756b3a619a221033207d1621e4ce4791db4248500649b91ff07cd2f1f06eae3a9be5b6af080000000000000000000000000000000019aafbe56da1569959019033e8cc785c9b98bba6b069603969e7ff1150f023706b461913ea7949306a44c3b7d199e86e0000000000000000000000000000000005cdc3a7004f7a7f79ffbf4c4ba7c5dc30ecc62f270a5c231406fa63d82fc64f45e94779cac851ff8443040fd3b2ea6200000000000000000000000000000000040f30dc98e8668194c9278b189e0c0f7b76a4c686ce26a4a96b93190938f07c5b813670e206eb6b5da29624a1b6314ba59fcd2baa47621ebd90c5cd12b89f2a533ae86d537fbb61a14b1a80982c9257000000000000000000000000000000000a5a1bc231f803ae272e497f812ebb663c2ce8b43a366717fc6349264823ca93e29e30762c1a366d8680f81838907f59000000000000000000000000000000000a88fd59ee380449d632d7e1b926210d984d5298fa807570a63a63828cfa55c6e2f01b7745848281795dae36e562181b00000000000000000000000000000000025ad34537909e07beaaff09f22e91e76d93c668d1b45cf6845ab8ba0129e417b758e85a7100a31a9037e307f454bd370000000000000000000000000000000013590106126231b1c616a5dd7aa7ed6946aacdacec963b507907950d6ea11cf1f5b59f819a43eeebaf51a1faa7daa8e719ef9fdfc5f0c4ac41255eb172d485317c124211498a8b9a74c0bfda15b986c5000000000000000000000000000000000938d43b9747c926c3e2dfaca2d6f1e6d61d5a621ae08c66a5baf33d9241771509689f9ea7d75af607d76b66faa8fbc2000000000000000000000000000000001889a48a74966b9748f4a6128dc3d75a69499db1ba1bc9aa3a9428f0efa898b5f78a9e2dae942d3794ab3d1157a1d305000000000000000000000000000000001129c9bf343f476541980b85229c5c25289ca62173e29b75de431b572c8f01f64ec1aa4625dff9e7df535194c7f4e6e7000000000000000000000000000000000fe95c71f703dcc71cf409b332f66fd69c330758d41832236a510ec4bd9a28c4732434d4c3f97445e6301e3070153dbbb8ba028831f429d027319a92fc0f30def8b97a43da456ddc79443d9f8df72cc10000000000000000000000000000000007649efeb3e0bee49b9adb13f8e5d7db1c06d7fde08a3f3082194153bf4b3615aff1450e47fae88ac93f55a389a319da0000000000000000000000000000000008334731582fb1b6125d7ee1da0124fe88f0c70a0a3f6188636976c31ba6a72beed927fe598386f328e4ae534729a57c0000000000000000000000000000000010b57d80fce5cdc90bc93b3bc7a1affadd19fb00aeec2ca9a6287bf4e40fb74616986a44f2f7d945f58501a965f37f3000000000000000000000000000000000180dcae46ee41bccd422b3cc2b34cad26f6816dd08ba51b2f12835e7439ae2d46933de28ac04bbcad68a188e7e90ee8dedf8a6d86471f58c69c1a5e7518c69c34165e72ce84fbe0b7f69d9c2717e5d4d000000000000000000000000000000000b419b675ccee2509daf66e5da4031b08792e1181140b30489ae21f7925305d8cdd8a104580ae5938586d6b8e74f750f0000000000000000000000000000000012e070ab7118991a20b27f1a87fba1f5815665d76269f0d3d460a6b701e57ffdb4fed2c53fa63a3121c74f67e770f31100000000000000000000000000000000124218ca85f235eac3471e0acdabf73f79afdd4bbc159c1e34c641b97f03735e4c3430264f2d94f640486488dd1067380000000000000000000000000000000011c24f4fa1862779f22a628edf9d3cebe0f7593964b642f889201ae85e8fa01e00e48355053f5a7c6d920dcf6a7ee1d60dbaac3f5e25ca3d1d50ebb31258ec4450feca1e02c84672ef15c49b4de2cebd000000000000000000000000000000000266bf0d9d5a4fc713dc0fcc6ea6edae0b326e22cd97bc49c48a7ba398fc87d7a0c7141ba24d80df454de66c2b5a55fb000000000000000000000000000000000aa8f95c7cd61733b0a260149d6608a73d6c1f989afa8cb2aa4098e1fb5a66b4ad5a5c1c4d901aa79812385fd507f02e000000000000000000000000000000000a6b4929df13e1fe7f0a0cf699a7fbfaa97d7527cc3ea1f728ba59def2e75fcf3490199bd42e93b7d47985a307add07c000000000000000000000000000000001719321981d2085ba31c9fb131d6b79c7df5d10d6ad0b5015454329697860121e781093fdde1f19e897dd6f2c272f87a109ccbb8fcd4d4651b84f4708799d84ad0a717aedaf5a76d2970a7b93bd23d37000000000000000000000000000000000431002c9926aa7d2b06412f544a868a7d48fb5f077dfd098febeeafc28b876c434daec809e5cbf50ff2395ae7e456560000000000000000000000000000000005a15f713b6eafb09495cfb1c89e9421515a07a99ca0f208883f11c430ffe6f2592dbc41bcee5db36385a26f67cd26bb0000000000000000000000000000000008dd30fdd7767486844967c5da0803b52282178287b8ef28e14f07b487132fea3a82d86d414b4d0a25b3dc538be11b500000000000000000000000000000000002dcee67e2d17b3106dcb9f4117456a037ae1996e8f7a09b179baab1ee8345c6d01eae554d3f40da86bd79a04702fbf76326fded2b8a3fbf7637bc25bd201d20e3d4d724806cfa678ee039a39c24e86a000000000000000000000000000000001629fcc374e99fa8303a715fb5077f266b13367bbc0098b5463d3298c0892f83127d6b7f751446575b88858bc742586c000000000000000000000000000000001100783c10618752d25c235e1e76dc64db94adce05651fb8df0a5ee7c299d35b1319f7009b857892ddf9e90c91f7d23b0000000000000000000000000000000000ab6996e4935131becd5df288dacfad1e69b41e200ca7dc841ecc180a81b9d2ca14fc8a76a4e7bd6f924bb9f473de62000000000000000000000000000000000ae9b22f8dff29e5e0a2ec5b5641f53fb5e1ca03130b49d0c26696ca4b439a9d998d9a364ac9cc5ec52df699318cffeae005efa8ee75dec8a013029292976e107a507ec09e3c34fb4baf2979fb759f1d0000000000000000000000000000000019c557ae1c12ff8a7c00b7c9e4bc3d65c92753549c193311a38a84bccfc090052a2219461a9691affe2d67ea4357cdeb000000000000000000000000000000000cd35c5dd126bd4b90dd671f29953c5a49a14b6b3fe946991416edf235c3eb3d574613d27b05cd879518fa7dda3ed39a000000000000000000000000000000000224392063b0825fd332bbede23588c1912e7670a013a99da5507f650dc4284431698a5b4e8c180269af8bb30e4fc8450000000000000000000000000000000002ab8d3250d4bb8ceecc8ca2003f91420d0ef8a7dbc2361e5e7fbfcb59471a4c525856bf796a2c2608d219d215cf83fe3917f8baf17f71222166cb9b6c4beb2e57d0d054cba3f7fd3a28cd3dc4b409490000000000000000000000000000000000911417908c2bfe4f63a388f699b31b47df1ea0ec289ee3f96ffd0c71f3deade00d1841aa56b4bebc2adcd3068adf920000000000000000000000000000000005467c7e58e82089fa285c28ea22c759c7806d86fbdcdcc8e09e847d6330922a61bc331ae3b5acce777b7809ca98213f0000000000000000000000000000000010f376fb47933b1f701dd81cebaebb2d8d8f5510a26fb3e9e156ac5ecf2b943c5fa2812d52da542e6c335abad8ecce3c000000000000000000000000000000000dcbf467432acfa4eb9ba11a7cdf02f9110f44ac371128ff8f1f98fc70e4554f057a4608180bfa54d99fd2da010594f6f0f73e1b62561f5b0fbc409e6534ad9e37d1c0724b35cdd3f94bf6489e500fbf00000000000000000000000000000000179aaa7119f6fb986714c03b6db16f25eca7172d24cbdd318bebb633bf08920f9e2a8136c94e3ec7c19e57ab51531b3f0000000000000000000000000000000005937c484213ab5b2ca8ed1c5c90e8d2a2f1bac044b88c04b301ff2fdbe67dc4ea42779d919ad510cabfa2ccd178cd9f00000000000000000000000000000000183cc23fd64514ead63f55d375a07af7cf2a56aca64a887dcc542f8a396468a6abc776170a5d4b4bbcd4dbac285e7ffe000000000000000000000000000000000ce12228dec2f84219904d9ac7923f122a99803a9b34749ca68ba385c178811685c19a492aca2e1123ee82a8a9cb90fc3ea24fb6447f2493c78a267daa158eabb70c1b60af8175d0d4594c99122cb4420000000000000000000000000000000009612bf9130e17110f8b15aa6f3317071daf3433bf6d008c383bd5c2fdc7ca03f25ff4cdb483de3c84c0ef9e579f38c6000000000000000000000000000000000c40172540a7e20eeedfe02c37aabac07165cbf04830f20fa76fe8b05c826e7762c9f7567a0fb972212bf736e627948a000000000000000000000000000000000f49e5b1929ad3ed5c07670c471710baa24e8478a50f72a5b7bbc23a66cff91d30a3d68961fbc2e6e8003d08196f325c0000000000000000000000000000000004ba098f915ba9e934384682648ed8d4e1cbaae60d596655fcd9c05f4b049ba0d278730dba5ce3fd4892531a3153bb955ed307c01d9e29a0571de07c62d5fcfc80749f02b8dbaaee9f69dc9263e99188000000000000000000000000000000000449b15ecec6d6fe5cd32437b54218f62527157aa6344c635fcec8f8305c8b6e44c93105984e0832536237606f07792e0000000000000000000000000000000011e40e8aaf75f5ff8e4040f725ac27693d7b24805a2539ff54b3a6e90c048875ea9609fb8fb3d8de63ca1118876c172400000000000000000000000000000000006ef2a24445f728b53cbf01e5b076acfa7761a84d8261cf1a1b99cc32f330f32fa5ded83d5cd51cc284207adb2451ee000000000000000000000000000000000977966380e772670447b15ad9917035273eb71a21c37607a761aaec808909fcfed50679769aee1573d73cd241de6624877f31ddcb55d961bf9bc09903bd927451390922d647d589302855141cf5cef500000000000000000000000000000000074e475c0ff1a51a24be3c964c45c41f767f890dec82712d92a965be504fee43fcc6c0684b2b17c5b294a3eb7ceff1cb000000000000000000000000000000000597b7dd287f3fb27e35a9e4e1718b6b1a4addf9e95e93aeaa25aa34023669368b794a08fdb178d9bcda2738534d1962000000000000000000000000000000000a492d648393bfa317165ccb552e045fefce5b3444d5ff770f43a08a68efefe7fce1216114ed1495cd00f832538198180000000000000000000000000000000003d85cea8063828ff025ba599bdf1efe0412ed5ce06ad5faa841c6400e4eeb6aea1470d48f4e66fc768d7e7bfebedb37145c1442ab82241f56c27dec2cd4dbfa9fc3cf1ab72bc521ab32a82346f8f6070000000000000000000000000000000008ecc3dd40da2a7a348b4817d9c84242f2f07c5d0ef810dc08311e9d4090d6d96d68b6c725ee6c24de076c71754bc4b50000000000000000000000000000000018fb3a1dc4e0dd9227fba310236a6db7953f0b716fa995b928a2a8de38edb97eca09fe2ab385037dfdcda2ee577e677900000000000000000000000000000000062fce7fe7810273a80760d9f4b3be9e7c821f38ed3e075210d3aac6aa7a763e3cda56465f88b34540b408ac850742080000000000000000000000000000000006fa94466cc47990a80ae6a310ea765590a0e646b5988925f03cc7e30f04fc0a8044b403212290b2fc46c77e84a9028dde4d1470f6cbce027465b4dc2a3deaca14e34218910aa76cb45d47139b31df88", + "Expected": "000000000000000000000000000000000f41bad0a932e28096e51482c646dbdf294aa7b91e0ec258670e7674864765c76989a936fb440bfbf4268a49f450d3230000000000000000000000000000000018282b76521db98f589b1c14e603b6f5d27af357553bca761189a38a944a11c66480f7ddd89d17e4aeddc8d78a2b3a0d00000000000000000000000000000000007efc4a90dd97f1312047ac78a3163dc014c42a44c7054daeefd5b72cd0488832cb6396e02ccff09e4171d790954fcd000000000000000000000000000000000e790fe8323fffc96705a42ca071532d5359641ff7cf8714789c9c578717a054c811cdb581df8b6a43729c6c3e3255ab", + "Name": "matter_g2_multiexp_24", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001304e0ce6a4baa6e0545fdb314523fc91f73eee157249b94f284ba7390b12b23b1c849c45a563ac82b62a2c48aec24e1000000000000000000000000000000000a2d0e9e222db70d49d1e85f587d35bdf5e8328aad14343d296f95b152a79c83a4858cafc350a5df1ad0194c49bb929400000000000000000000000000000000199efb09b34d0699eb4bc1c57fef9cc5d98453bf522c504fe7897e22bd0596a3a6c310eb351e15e3f6609b074b240f7d0000000000000000000000000000000016b69f12ce30ad1a65150094e29d4cd82fbce5dc343517ba9e5d89245ec083c44af9a3dad2169f713d3b01fdf70d20642576b42e0728db912a78eec2b7b4c96575e341e86a7592a07a660c11e0044839000000000000000000000000000000000b3ce4ac12861052c602e71906a7c9f3e2186bd2b6eaaf222d8e80b48baee537065ce78372ed936e6728b9642ba1fdb9000000000000000000000000000000000e8186561d23515bc58c77769c93db76dc9c62bb715b283cbfb71462451120a6ded736cd8a292a6799fbad7617d9aa84000000000000000000000000000000000368a6dbc7daaab0a786257c813b1a25c97468732c27cc759fb921cbc3c9a37a46d7dd0298771c447d36ef0a10579ff5000000000000000000000000000000001348d5e34cbe54e3a6b357c4e651acb82d2dc40ef9ed8bb89f0cdf0882ec6a737998f4e4dd61e296d101cbaabccdc3e779f9205ef0e3a85199c60ad9267349fdc7b6fba4cb765ab21750eb3dcfc48d8b0000000000000000000000000000000004ebb53c462239a78bf13f29856ddc4d78645c457a656f3cccec9d3c032ec19c26488f39e0f5bf0d38424f9e3a9bcc870000000000000000000000000000000002fe1949365831f7c38b1cd6cf2e22345c4ce40cd73def77889c214d1077d70e39578e8be4fe5998f59d47cca7917280000000000000000000000000000000001152f2df1512013a42ac056b75802bc35c1883efb345cefda8276c594b061a0b0f4a49d8bafa6fe251658ee76b2493cc00000000000000000000000000000000094f90cb386f7933b2ffcdba5e46e09cbd7d537c12bc223e76d3a88ce9063a7b3574d3306365d65dd4c6505f1dceea53300679b7be7c71224247e8034f5d30a63f8707d92d843a703f0fa93160f6571500000000000000000000000000000000169d9469c53e55768c9312680ee82ee581727e28cdb1d6fcdca25d0c03f3da2ad6572039f12c90b09cdb843bc506e07200000000000000000000000000000000174528257f6d3542f754ecbe97eeeea7d196ee4dd01852f6cbad87fbeb4dd7d3799588f17aad129a15549bb787468772000000000000000000000000000000000c9ab635bdaca1c488538c0830453ec6ab3b2b62447c03ff6ffd2712bf62e02a63c76c79d41644ea412e733128685c45000000000000000000000000000000000172ef0fda359bab149c8c04f583f4ace4d1b148426e993996d278f79ed2c6d3933d6cc5fb62ec4869aadc773d3084ca0454b01910548432a0f706818a98151e38ff9e854f1faa95ad41a7239b5cc4910000000000000000000000000000000017060fa73b58957d12b3996d67b7baa8b7f0943ad52e80e5c4f8830d33dc74c0a39e08594b647945b402299ca861f7b10000000000000000000000000000000001efdc7f783f9977392e2797a3e0bed222d5b661d056aa0c7e04a493bb9b18048bf72aded134941ece78d63df0a0868d0000000000000000000000000000000011355198320af05f2121939e6489f31e9e13b3cbb2cb30c9e675854cb8ec038f80aa2f4b6f995774b36f5f1b6a84298f00000000000000000000000000000000172e18c490d0cd5ba2449362c0ab296212dbe69ac25515d0f91941d300051320f067f946dcaf999554f55f1f616adc0f3685617371b27ba8898ce7f30776d817ff09ef68a9d6721d4a923ed244ae82060000000000000000000000000000000005854f4dba62d1dbbf3ae16f70792f1bb39f111309b454a6400d2916e619d4f70764ecfda7eae5c28cf1d178ad53fe6d000000000000000000000000000000000ed0bad1f5d69a0e621d137746a9ecc764931ab89f24ca827e0340ddc03571ed697f63e79cc58b946e8462099ce4b1d70000000000000000000000000000000011de76edd1cc2f9ba06b98593a24a7a011f2701b451ea3ccd04361ddb678e06d91a676e3f11b62c68cfc05242cb8a859000000000000000000000000000000000599726b5f5b93d414f9310383ed9414e4675d644f83ebaa63dceb2bddc7dcfcbc17c7aaaccd0ee32b0875952554b4e660cb5aa2a0cd1e8c3fdc06a3a1f6f9b6d52a8cc2e98c85b8e258f72d03efc25400000000000000000000000000000000031110347cbea2756b5fdd549d6c0b8f4036f5718d41dcd6c854a91c9df29bd464774be479d0efcb8a3f82cc7441a6c8000000000000000000000000000000000e24a52dccfdda3689c87395e45dbd46156676d9eb2cc09dab22ef7ff0acf5ea243ff117c82b147994d65aee8605b2fb000000000000000000000000000000000e0cd6ea0bffc591c13c48bca0782fecf8e128b0b842aecb06f803a223d32cc350db869b7a77f8e31b05f36bddd587ea00000000000000000000000000000000042ff4ab4596d610638ad23eea904a82701cdf61f9e2dc5832a70e11e717711a2d0e72f32f74706d385a9567426b4713addb1fe778c84242953db87d2307b40eeb776f17767c3a4311b5d2ffd738f151000000000000000000000000000000001517efd853800946aa37868b525e58fb488bb69755ccec806afca2d21bd3a30ba46c39cdf694ad0ca92841760437c3c1000000000000000000000000000000000e5591c339e88544660380d6362f4119c5596f910d4ceb96ccd4c4d9672efc50805b6fedffa0a48d126aae69b241d3640000000000000000000000000000000010ea5babb0de734641f63eed2eba6124377b5c55e429987917c0bd109d7904766a10b0d2dd123413816d0fbabe25050b0000000000000000000000000000000000efc89ee2ffa56193129062ca55a3350bf50e8fc7d586fae3636a70e3577987fb0f8674d383def4b41225e490d3d81528416b4b4e965a5f024723fbad6ef2f65a1381e70201e26ccb40188dc3d0fae8000000000000000000000000000000000dae4277d62e3f3dfffb80818a5ba5c371a48d73b92d69a168ebab897ae8be206fdf776e9f955136d7f7f7b2903040270000000000000000000000000000000010ca635ee2e49cd6c951d75ffddd11557432726d26564239c611b139329a28812afe21f094c0585675f4f233233743050000000000000000000000000000000012378b2ec31119e508fd9ae0ccc4c2603b6820283284a278fe16864e5a18cf7992d850c1d6ebd1253103c219bd95ca4c0000000000000000000000000000000018cac4f0660240045214034cfd8a7e40bf0aa12f97a23c4e27db0e05bb25f4d755276a91a4e882a0be63437a522943ab78077a51f88236dba6d16d7fd681c631510106b0eb7448df456eb9ce758e74cb0000000000000000000000000000000002fd5571c818322d207d58fe0a898a045a26c95c2490765dc9ac663a0de78ef5fbd05b20ea96dc5388d5b2ccf13a5e320000000000000000000000000000000006ff29ccb768da45061ba4e01c90459ededa5e79513917401e7e37151095ccd4656aeb9cb7c083cf27b69377295934cc000000000000000000000000000000000414d34eac47430495be735eb5c4b1a68372abeb43658f27613a9c8b78f17d9074174a8deeeebb1f9cda5d6198bdf89d0000000000000000000000000000000010b11bf63b8c39c1370e8fdbfdcd149fea88eaf1c0a94a51bdd061e4c41abc626a448030bf9ba880032e9f1642caabae871716e790e1a0120fd26d169b8ffe3fcc0d03683dcdba7d2f953f05444076ce00000000000000000000000000000000023eaa08a44eebae674434b013ae9992c75690a3d0de53e4b05d1c0dff249feb24a12432bcb5defe25ee4e44a56b27eb000000000000000000000000000000000f146ac27e685cca04afe8fc58fe853825f5b0009e8831eb0d0121decec23b25bf8521da2fab1508a3ad8254865fbee70000000000000000000000000000000004af1a525d3c33e0b1629cbdb90c56a88d70a28037c87db81c59bcbc811c8f0b98aa9dd574436c9f600c0e8e2d194c0400000000000000000000000000000000170efb5e0e69e46a21ec3b972265bc04b9d5ee926254f61c0e18fed013922e00f1897cf69889576bb5d54810486e7f2776ed0a27553db6ac6d3959ff4c9bc5807fb7d4f0a56095ed2bbe31dbfa41827700000000000000000000000000000000111c832a96329d6db203fc8b6bb5b7db01521529c91c74d9cd71dc78d067b36cb7eabf1af80129a7a3f44b719235927400000000000000000000000000000000097339c17816795238629d4ca6c243a14e9e227e9bfc30370dbb9e1475f6d03020dc35559675121792436bacdf9eac4a000000000000000000000000000000000805870a1efd1fc34c9b576b77418ee8c0d36aa9caf9994a051e1d55b49275f34cdb55edc74ffc267c5776c8d0e113ed0000000000000000000000000000000001513afdfc2f000e3b725fcd0428fe72ab2413ff2aa91b44458a5249c9a160ee27bca01d2fc2e230f4a80454769961af95ce72b30d989889c8779c4056e441bbcd93629efc2877d36d27f670711e21c4000000000000000000000000000000000485b3b1f812b4a28ac87d16f86d8d634e85d49d6dc460646e1224de662e906002c44a1a269c3bc011fd22afeb2d58df0000000000000000000000000000000013ba0752444a794cd00c99eceae51e61c382d0abb26e5e0e595d59321447400e8a8f7d97390bd217fb50bc22cef34b2300000000000000000000000000000000184515a36024d0bf71d9fa4cc5165363ff94ee9f8579bca653ebc0620a9d3146fba70a2f4a9f6bd3777101de0d32e327000000000000000000000000000000000e041422088c0343f7704e726d65ccc4216c4a1bde3668108983643663cf0249e992f9acde2dd8ff478dd26cd8d9434d06d220f64de05bdd6e1140c1e409fdc13f43bd31cd94e633be38ecf22ebd77db0000000000000000000000000000000005bbb0c55fdbc59992c83fc0ff03f677e58b6de6f8649141d88963ebfead9383d692015a7b765b727eacb6de250351ad00000000000000000000000000000000183057eca610b8e07fffb60d21bf2eb87981e6e881bba04ceff420ca38228fce2f94d40a993e2aef09e209f3990dd14a000000000000000000000000000000001231bc55242bea6b589cedd1d82621fb71c606ca9306b268379dbf83ddb1420dea228ffc05cd8b67c38206f3f006ef18000000000000000000000000000000000f2c943e7a8b0ee00fc4e4ba912b94f68f504d2783babb90a3781b666b31bd161af2f97a77813eab9ebba76040b04155257da8ac7d23c5ed965d8bfc76a642a36ea6ec4c45baf6882021372e8643f09800000000000000000000000000000000054bd97b9cc979006f734ec433e215a4e8afe468e69173384bc895e10ead3749d991ff8ff203abff30bf5cc0d2fc8c6c00000000000000000000000000000000066b73a98d5f5ae140a5784c5594892c849aa7f2db3b5798643f755743d401ca745d810fad5f4a33e5b3cf0fd7d96f7b00000000000000000000000000000000007caea93ff5cc6ffc033717220a215ac4ed7283945ae77e62320a0bde13f2153dc8dd401297cd124b4c67a4f3839dfc00000000000000000000000000000000094568035ffff439e3d3201466f3a1d43414e3f6455627c5479c8b7c55130ccaa5007ace7ef6a2b3e2e5a4c9543dad9163d017ba8c7ed138b1bc70141abc5cdc3afbccd8b1db5a6b5f775efa62b8dbc30000000000000000000000000000000015eeef8bcbfac04112931e186f6fd48b7a8ea891ab364ce8266c5fd15f072f08fb3655e324795df182a5ed1c917a5db000000000000000000000000000000000028916fcb3b30a7f95321a0998e544f9f4f578be7a9f866cf72d6b8baccd93f8935f105ed26aceebb3f9c96073a8be180000000000000000000000000000000012b11f356a7e32f3d9281a8999363aca0ae5c1a058724cefb51583e5f217257d47ca76d21e54ab62260796b95f9d3ad0000000000000000000000000000000000d83c75c36cc8dea4aab47823edd26b4492da39b93a15fa454aed4175f28a025ad2c576ef2d76a66e666bedae95cef1a7a16e23e37ecffd514d47199cff249415a6d366fdfaa82450f0744520258955c", + "Expected": "00000000000000000000000000000000059443f363ef0c65973d36469ac651eec6e52485a07a6d28112f4d0711802d182b7e6fc56d4f1aae51fe1c549247d885000000000000000000000000000000000d22118a6f1cd06ee14c63f0e005076bfb061bb85ed184b5444c08ed9dc35f77217b6daafeac89a973f2c73f00e0d3c800000000000000000000000000000000180430caa9917cbb40e3ada2de8d685b4daa99639669a643b8f5cf9a4a55d6162e9fd7f5d4989a1a6588feb0273669b90000000000000000000000000000000015d01fba1192f0f1acf8fb32fe790f0448c6563cf8ef5505d9378fa2fdd38bd99ba938077f71bb8eaa91a99e787e840b", + "Name": "matter_g2_multiexp_25", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000012d948b5268524659e29cd407dbbe8f529e608193ab9452f936b2f6fc0b81d3a63a0e929329e2d89b5475dc2d73ebd8a000000000000000000000000000000001219e20a081837f4d4e33bdffda08a946bb9cd876e42e2f561ebfd18ec439e0104b43de61f47b8b7a0c346c33e632be60000000000000000000000000000000000a135c72c45f254cc1c260af803e14cd0f89c2ac3029629a86b05acd3440465aafa4cf84e69551ae772bb55802a90ef00000000000000000000000000000000052750c3a99974f9044531dee9129110b99572cf283b61e6606f1137a87de7344bf01d2ac2f8a1db8d815b6d9e7511fa26a9bd0a71fd58edf81459152782733536e960d27e35f9f84d00da256bdc118c00000000000000000000000000000000136b2f21aba94bbc8e5235951b1b186fd4ad221e6ecbea5c7279cc8ee8b01edecedddf48cca47624ee9b155a4c167f140000000000000000000000000000000019852d2bc9c8abc92503f3e7eec9fb20df108c23643ba8a2fe16c2cf085bb4ac079d3f065a1241067daaf401b662288b00000000000000000000000000000000018bf1a4e74ac9507b97a990f3a41cbae3f32e263e9937a8a62679bee93296ee5cd25110833eb5d136425bae0e9dcb8100000000000000000000000000000000096ae4bfaaf4f18d3e987d9f287fdd3dc9b497cc84867e757da52bd5f58688403e1c9cb432a2eb87e239879d52990ab5f1e168ab93674bd7f2bf73318a48ef17ef4464fbefd39f77c17ebfdb24d679b60000000000000000000000000000000016ebc2ee18515354b7af5d924c895ffd5556ad088560f89c59a4ceec229279d4075f732b884a6ef2bb2eddc11d27572500000000000000000000000000000000110282084ab6f3e76eeb9e5e8c56749992913c2404b003df9c2d01d72751f879538d23f612c8faabbccff45185f4c6a40000000000000000000000000000000017476677ebf052d13f60ac0ec5e572c398f1a478d60ce92a3de88a74a28688d786d30b1ea8008409e45697db0adc628c000000000000000000000000000000000a5e4239d938bfc7c05f3b3a850ebd5f7784eee7aca48c861eb4bdb1ce6321fc9c6bba997e143aba13a42f69ea14937397fb0d947d71a1b032070a12588b85065c19affd0db53e466f194f04f58dba2e000000000000000000000000000000000b6e16f2a6cb821abc43c447da207cc3013f2f750c844f42f0fdf47160a38501bf502073bbeb565122bb3de61b3a5ab800000000000000000000000000000000040f5f3aab5d416e9a084fa298814f894ba599315fe10af20f836e624680582413b4a54623cda8ae2663ee094e4db775000000000000000000000000000000000d32ac715a094813c7b46ce2e932365bfd62ec5e584e047b0c56ed6eca3c58268ae01be31b833be7ba5c2588ebb9859d000000000000000000000000000000000850b9044f129e51658a02cfa49d40a2b09239823cba4d8fe423fa1b4815750811daf745e7e02b317a7318aad0734ddc640f850bad2f22049f2f8aaf3ee57564fb38a847e428e252f003eaac465f7d670000000000000000000000000000000010c703e31f2d488812a387596c797d8d414e406bd82f238cea50a459d842502e11220ad82fce5dd36635792ff5770bc50000000000000000000000000000000010c11caa640708850e1dddd48bae22961a45029971d823b53030979b7d8ef2eaf2ed055436105697c5b0b31b1a9d0a7a0000000000000000000000000000000006b98568b2b7f0aada97310f7e14084a14bffe580ec65bc8fe5d19c6213c45dc1b8e1da5c6c1b8555729f6c781575278000000000000000000000000000000000f2c506f3e41c28a748656d1dfd87e812b3ba21815637e497a30eca4fc5de18257846f12b67919dd2d739477cf5ed0ae8bf91051da5bce0a51bcba6f4e1b3c9063743646f4e75e3e5a8cbc84e8112af400000000000000000000000000000000102b6d561172adc9316b3ec11f05e66e7affb1bdc70a364faffa57aa5938c2ac08863be8fe79ce3f627558fcb2ab1230000000000000000000000000000000000c5e72c271a1ee186d443a96d53f0ba0ce226c76aff2a7c3215c2110f96cb3301bd586f509edc45cd20e662756897b78000000000000000000000000000000000d546fbf485bb283a04fa05aa962ae8d77ec4d26f749d83b208f77247778e32a9a2f1483bd84488806e27b13eabf41d30000000000000000000000000000000005a42c6ce8d43d122bbf984e9777f5d1c15057f27e70fef44b97c2c6e7e2e303fcbad643027b7ff3167916f21a723ea98da771e0e827a52a2f7e79e0e5d93ebae04c1ed78cab87d4353f24ffc52099b3000000000000000000000000000000001788323aafb95f8761f87f771fa05a8e49be71e397849daef5877a7f486af13fa651be7a93bdd9465df7be4ff65825fd0000000000000000000000000000000014b7a56f3f7c12e39be76b3872c1ee648f62f9cb6a1842d869e00a5dc2ac8cb4ecd96ec2483d5eade5b0f9113133bb050000000000000000000000000000000009a30623632b757ae8d03ced0c1fdd1877718f8d84f34ebb42426284f73bb7e8abc31a5e5ded57a02d08adaa90abfb2600000000000000000000000000000000020b47acafefce7f617081e22b2bfc566acec6d2cad5063a79cf33e02cc8931bb698b72184a11fab73e0bb0aaec76c61d6cff707bff10fd53ffeff8e9400966d8ffba6d4ad6a8e7e456df10f8f5ebed2000000000000000000000000000000000d1190466f0e8f03d2cac4a5e63a13d7c6d0cac9f2065295e2de818773199d731f8cb7b2be5f6ef0a246401b345a2d560000000000000000000000000000000007d9c5d187494df79c25b6292527b0d6d8c50b6467bf76a1a1316556e48159a3b5dbdbd9fb0bb901d857f61f423d15db0000000000000000000000000000000013e4401fe76e3f1ef73bd244189cdc81fcc152f71449c11aab24c4fa1d123c5aa8c68a2d10fe88c1c6631778dc0bcd420000000000000000000000000000000004ccffb4296883b8690b2f3fe17e4e9ab24390084ac917ed28fa1e04b9758373abd348290d24c915dfcaf0649ddf5a87e00831cce307cb44e8dbd5edf24f1535b837277160d2cf6daa4e862e57fe73b10000000000000000000000000000000000f4baa5e531ae462b95362292d5366daa89f2fb2707c58568c094c58578e84a8d253fe1de26b917b84635c0aac3a63300000000000000000000000000000000109057e5c5451eb9f85b95aa5ed2615d2faccd0539b1e4481923e04cbdbd2ea9290969022cfa508d3fd050549c74940d0000000000000000000000000000000001c3e147ad9c31927207f2344fedd541316f4010e3de194f924c4a1450a221285b76ff1894f8b1670731007f44965100000000000000000000000000000000000909cdf5c56dc177daa1f3fd7cc31d79a4f6dfcd462c07812cdf629426b75bdaa297b9d7e67aefdbb58175a21e29edada8168d56385722f339a5b27fc25a88034d348e3d533ff4dc99d28536c1c09a770000000000000000000000000000000009b4c6bd1c460d2e93febfe523c1d54d6bf6af50838e7a10b732c1be8748a0752a517e7103d0ffa4507b086626fbfa8a0000000000000000000000000000000015bf2c13891dfa8dba35b5da1235563d4ee1dac33e89006f5c9fcf06f2fef7b31ca845bcaa8ac608046e8b01c8a61fd2000000000000000000000000000000001898dfd6a0618df821474b90542f261c1febbf2e566978b0fafca44f6dadc57202f88366b19d2c955e4291ac21beab520000000000000000000000000000000019287e1ac6b3eaf412e58511b40d87558e7cbf90dc8af2f5d33825b40fd2f2425d0be3a05d0a49076f4114350dcc601eb929ae82ded73a4876c041d2e52fa811882fb8e22690a27cb4ad3ca05169bbf0000000000000000000000000000000000c0993401c024d32cecc0d86d4cc52c200e59acb34fee2ae052837f467905e736a1118260ee12a963ca2df6e1a6c9d0a000000000000000000000000000000000103f78f0e7c9a5628a66efa91f150a87e67623ded2560aef278a8caab017fdcf181981952b450c67e3b4d3f362822a80000000000000000000000000000000000df01ff335f23652f1c34480d23c62d705572321c0e7fe92556e033dd3cf5b78a3d554585403a7f3c71744c20d17579000000000000000000000000000000000a0e2c9e2e34e5cb36e96b29231f702abb127a011c7ea3e21d59e5c55f745a02039a68d59ce8e29afac0752d1939106936999c516d4acdfbcd488d39e3073db9db6cdd0c0fd1d29d58294ace6d2d199f000000000000000000000000000000000eabff0e6ed9dc358881796441c48e722ea171f26011ab898c5a06758f61a629ae21d5a2595a22dc9855fd2e516b30fe0000000000000000000000000000000002732155a7a2791078dedfedfd3381281554c389bf9b5baa47593153a2acfd22a08557d7a1d49be298e416051b9137dd00000000000000000000000000000000116faa2e2a261e6a3e4de6ad80d75ee05aebae47872e2eed9cd91aafb94a706de673a05f1b86c0b0131cf148a90b2b7900000000000000000000000000000000009a04c09c2a4fce22d237bbe930392dfbbe5c82d480abefbb3be876015e2f5889a0922df6d00d4e94be0e9fb8d2f4a1fd0bc405e3970dc2bbd7dfe0c54b7c64543fc241000adeef4f7aa2f1dd2506770000000000000000000000000000000002a6402848507062e5c5d63b1207a1a41d3b941d21792391f2feff95035f1b4625541770fa5e0f87585cfca670976533000000000000000000000000000000000904095ce640605c957715e378ed733ddf1f94d3beb63543a50c8922ab9f8092755fcc65e2a1ed9232c8cddcb5816371000000000000000000000000000000000ec62b911b08d3e8618880c3784685b2c6cbb07a4aa4e348ab72e4f918152622ddd7748bfcd79f35675cb956d11fcd650000000000000000000000000000000013f651e9104d48a081cef2ae0648816b2b4b5f644a791514e94a8e3dd3001099c27d1f9860337ced1b177b4ad7cd5866c36afa3c8581df069292d53b8ce3e35ca136a0b3f95a894958105fde9c77e39d0000000000000000000000000000000016334abef2a21b9c1926b2086075471bc2d2d2f66b963a41623af91fd2fd50f254c008fa3bad6b53658c2486edcc94aa000000000000000000000000000000001063002a5d17aab2bbb5da49e8bde63a1f3c4dcbc8800f9487f47c6d707109c86d3cf7f9171643418b195e50d7483af4000000000000000000000000000000001213004f31fdd0b0df5d8e3677c4f48624691e2534c02881c6cc6875b9abaee56ed5739c2acd66cb1b10553ba066ef1a000000000000000000000000000000000fb7659081cfcf8beaed9c1daf9e92702977c37a54376597d897082a25f9882f1ae14e7724c0aeb9e002dee708c6b4eb0f0a2bd678c5858be2a49ca54de8716fdeec84e1935b8f44545c740417efa7e400000000000000000000000000000000078f06bdfcbc7c0cc491fdc8069314c8a395983f9a2e5c2d1bec360f36e365da377885f897d8d711e33270e3ef9dc4d80000000000000000000000000000000007d43394d5175e020b3a5d768b60ec763d60cb1bb37c0343930fa82e92fb1becde0a178c4565df320824bdadd54ecabb0000000000000000000000000000000012f9fc96355721c35a6f5439065d89cfca5345622b3f38041b41c036b9bc6bcc980498ddc7bcf807e1b97831c099505300000000000000000000000000000000105307b482467b881a59eda1434e31dffdea531603fd3c460aa8d4f58d32668228bfa585bbba2dae7346141af59190e2c8e420db340ef2c1b5c6a71645e303eee95cd93228770b639287b14b6a5c59ba000000000000000000000000000000001576521fb3be8c3178549969e54bb17b0a3546ac4aacb470e935359e36bea4f43dacc06c151a527f441ab9616e07f7b90000000000000000000000000000000018dff940a21768ee9b9450fee7259663bb29af645bda2acb4d43f4e9d631e0127073f2db04293266e6fd6fd3d005e3f0000000000000000000000000000000000ca6a977016c1ebf52827a5ad52e5efcf7517ccc3ff40df8141f6335fb6c77c3fb8f6b0dcdba2596ded7c3838577e28000000000000000000000000000000000150cc33b55586fac30d316cad6580cee0a070900fe7d540167560b79f4cf9690a5e02cfce9946cf67a95dedc9a7d9aa35398541eb5a03271e2ab5ec2aeb2da80e634f63a050c25de98ad13e9d63d09bc", + "Expected": "000000000000000000000000000000000adf84ea7681c442731be8db9508a050d4689c42af8f7472491655356a86fd9a0afd91435bdbaee98db3b1d8f26203fe00000000000000000000000000000000090a7dadc0a14df481e44e2005c9ddc6e026ce2afaba7badd18492bd3a338dffc349b4a339f56221eb795314252d53640000000000000000000000000000000007390fbc06077cd167f53a16f347eaf50ce8c9d111afeabf3a672687441b80e66a66ba3fdb28e2ca8282f3ae3dc81be80000000000000000000000000000000001998f98e85285a428a2860c22a00d0b317854da4190dcb4dcd182ac249e13c51f5d5df5db6a0fd61d01232cbcacd5a1", + "Name": "matter_g2_multiexp_26", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000c868a2cce65692f83eedbfeef6f9823ae9382fa5ed23395ff2444807e72403d4f6ac861ecd3a51db841889fe22a033700000000000000000000000000000000111c9aa53da85a63ce1870b963415f0d5f812e061aa6bff57425038d1b65fff57a78bdb963bf2450001525a93011a28e0000000000000000000000000000000011770810c16367d075c695981dfa69b072b82b034f8ac371f26bb157f9f9d667aa555a5c6baca69d08f421cd569faec2000000000000000000000000000000000df6146b29bc8226dccfc95a325d791b30cba8ff2495434d75622b170a634ec7995c5b4c689c73582ca861dd21d8e1e49f99387baca30b9cf63ad10c445daa142fcae1ab3c0a366a068bb5efc9abb3a9000000000000000000000000000000000fb30aac6502ecdd3544f1879bf1b3f4c19fb897de6c3a7cbf08f36244aa8e9dea8aaf781f7509d3ece16ca144a601e40000000000000000000000000000000012304be931a1d7440d67740f50b1a281468b412e8b6c54c62b993ec609012c7056fc7e62405c7530e8f5136cacb5926f00000000000000000000000000000000182320f5d9211c08f3ba5d40ccca45cb0060a6d362b4422084617b9d8212e94a9b878294ac176b8f0e959bc124a753310000000000000000000000000000000010be6678910072ed9f932ab01a2d72f7374a2cc82bbd86a6006a495272aa89fd655e6719ab8b3a0643d002021f7b7ebb4283a1773995bbc97a6df107082fed4ba40e2d30c5472a25a7643ca9e78b8b8b000000000000000000000000000000000f1ffed9514ee81e9b3fef4162c8f4980fe0429e57bbc224a9c9976cef7d26ab61ea7b0cd42eda30da97e3f8f5ab5f0600000000000000000000000000000000035b9b349b531d85361a4618a172b510dbc924df671b3fa707b474d0d8b17d30dc8ed208d66be91dcb7632d2f05ce31d00000000000000000000000000000000010030dcf6695d44ad3236032e47f7aa25b9f55869f5207e7ac8641db8c01f5b59627dd3442a1834b8b1fc595e47cdcb000000000000000000000000000000000f91ad5c923572a75d32962567e7b1b0eb84a91d485c968b5aebf8b3a772c2f94e47bc1d5b333fe43574308a78e768ac7f4202d670fc3b48eaa92e925f48821d2ae057d90c5f184edcce9ea900ab51a6000000000000000000000000000000000ae11c60537bbcfa46a08cbc219122ed66fd0d42f90e68243c32010eb99942554c349c021f0e3635bb50f7ca3d106a3f0000000000000000000000000000000019a61254aaa5b51b4d354f444706ebb0bc3edb87ec2d83e830ffe0282bcaa3278e947d053d6678549a098129bace43da000000000000000000000000000000001100f48a07456f01e16bcc833ae0a2835c964e9b0aa850574dfd8b4a7f06d03059e9b4df8931740ce0621ec7eb31218400000000000000000000000000000000003072392a824c386859735e2d203c9d52c19796ccf8538bda3b1436b2f6815bc86d05287f29fd0bb0569a81a57f0c22a76cd8d292a7053c449cb98f13cf768c6e37da9d702af28c16dceacfaf9cdef5000000000000000000000000000000000392760f98883f9cf6c0f0a324b9a645cbae12b780896f6a3eee918c44a815daed156248d6afb25901521b323f6baa240000000000000000000000000000000006375c6629f30b7a36785269d691772afe1b95d6e1bfaaba9459c31086c2697e4ce77d148fe2ea166cc330373583f4730000000000000000000000000000000000aa8e338df7eac5a7b070a69d3ed1553a0c52fcd894c2bc8d1b8cf6ed38983c6c392a9a045ffe8ff40b39d18e7c87c9000000000000000000000000000000000cbc73b589cba1bd47161282642fe6f51f2b3edcdcad6020bdaef369d3f2c11ea9cafb9a7fdccfb89bbbe13560d42d1d97b7bf8acdfbb148814afee1df79aea17261dad6f78772111a6dcb021d8c79d0000000000000000000000000000000000e71692cc2342d1e93e0ce72be69013023d012dd2294249dfd69e1d610e2236ee2cdef22446f1996bd3309825989930700000000000000000000000000000000013a1bbd3237dcbe44e05234f7e41982f4fd951d3741a3e90345418af1c922d35edf776a27bfbeaf7a15658db67164bc000000000000000000000000000000001197a2ee5c2541e19b5368c97abf51fde3dd0b922c3d701d7d84552c9f47b38ca09a8aef8240abfdcb03292ade1ff04c0000000000000000000000000000000010ca3c22ff8a47b1c683a58086ed9d831a5c25b6ce5a1971989974b4760cc9e83a1bc8d819825989751405b242eba379efdbd5953bc33bfba09fe7b3ee22c46c3a86f557e4b5f272853e67fd95a0f9b0000000000000000000000000000000001306f8047ba1a3417e7993bba0dfee9077eabfc275af91d0b882a53199874e0777d8dfd29767186d922d49087fff38b20000000000000000000000000000000005371b760380a6d287e129b329e735413447969eb9048def44f5c5987a64323d2a5c81484c40b20206832b86a4af9c4d000000000000000000000000000000001552eeae620c42d0bc4593d7c8e2c8fb4d6dbfcdde68d57158a7dfe837a1870a73b45a97b02abdea174a475a7061331400000000000000000000000000000000033a6dec61540a5cd5773b76847dc5016b309c5a027639598f51ae5b1067b3f7a02f5ea11b0e1be77a3ac236cba15c929a331bb218b99fd38451483a10e8add23c9641b975af3897670884efef90d4520000000000000000000000000000000012ad5ff49459fd3a7940a69e2a78919876e9b3a4f0c142499e7b5dbcadb5c2b5d79c5dea972f0f0acdfd10ac53bcdd92000000000000000000000000000000000ec1be9cb379bf1e24bd5429a4a91857bc3ad45095d15bc5537c2ba39407e9f2edc5fbf711ef4287a73ea466d4f53c3800000000000000000000000000000000173605df66aaf51810793db1cf2021de6a7645ae84a5d439ee035b917d037d9f9ff072b5dfe8b9ac69feab60fe2d70bb000000000000000000000000000000000d0bd336825381ae1e18ca37bf6160ae32b653ec9f9dad159006e92c24b661f22b5629ba323e9e06ccc5887a962ec23fe9301dc826bfe2988cf93c29ca9f01421b75ba63c5ed2cee1599122012ada36e000000000000000000000000000000000f5e593c6588add92cac2c9467247fc6d900f20b4d3216c258f88f3334eecaccbf3eacda227e2da46cf520e5102a9cdd000000000000000000000000000000000458177ad6c190222e53e054546413c13216286d414e3509b7dc794dc0704afd26bae93ff630c6157d05d46d805a04470000000000000000000000000000000015df8a7720d389e6112707e37694afac2f97282676a89964deabefddbb3a0f1cbc885d4c875b945b8303c1ed2c0f46b8000000000000000000000000000000000e3c7f1af7cf5923dccfc1d25bd86088706a3a44f5fa7f97171228e8f2a2b18e9631b2a63bd5a75ee0bb83fcc91a45c30a1cb530e8b828542fa4114de6aa936bd2be5ef3a9b7a0e20e475022381d62d40000000000000000000000000000000017823fc8a56e6e5cb9924037ad6ad1b43237894a877572dfe3d3cdc1120fe83e01de112b55f7f334dcb5c6247c210613000000000000000000000000000000000daa01f90cd14d82d4fc40b60b463089fc6c0e567fa46bae69184d0e3cc5acdb1d759e3291e2781fe0b65c734ddde28700000000000000000000000000000000164e742b123c19e52e2d7a6727689181f323990a3f3238072f7cfd7fc0f55b7be4274c0df194d85060a81f3744d3978b0000000000000000000000000000000007c03a1678b6e91c1bfc66ce8fd419cea13c7cda3213856ad21823b06db94538153a15d43a9d4270edf77b9a5ed490e6cf2f0c33bd044e8c4468b4b7e137ae294c178e7b6c9f19878331fb93220db2cb000000000000000000000000000000001865bc91e645e2e24c3efa3afab8b0e278dcf16b29831f75b3eef0b342479e997b9c5f8ccf67c789c830609b3cc425400000000000000000000000000000000018dda7857f919a6a49f6bb465c27342c8fab6afe6350c43b98e91a3105276f3ac27268454e9a9c6dafeb2218ddc7d3cc000000000000000000000000000000000b098258ff8b185a5c59b46150954d52db5a5f68bc7975234491406131e4f1286ce79156dd1290aafe688f936ad34e31000000000000000000000000000000000b294e9ce904fb9e243d0790147b6070b10ff611a06e3f639aacb744154d02016ac08f6769732d4f6944ce9257680d49e5f460dacc592bb947ff6f1c15b8464824aa5c957a645a763138ac1581ac5768000000000000000000000000000000000e541a22a7a36adc06e445f42497596e1017a1d99de85bb945a195cb3cf0c14d39eb7a2aa994cf234eed77f6307cf6410000000000000000000000000000000002de753e41a16565e5ab1b61debdad54950e9930e04badc6e356f10711d7688befc6827040356c0f0a8ce4f8d7121b3a000000000000000000000000000000000f2202e34ca164f1a6c0afbe179b714b303d87ef14534fe3f4230180f709dc63af17f04487264b3dee6b24ec4d0a423f00000000000000000000000000000000004044d9e3b3a77d6a309780c870a65e05e1ac531c5420f6ed0056f5e728e2b83a968ca90d579db50c2dd395f7e40beaf26a9736f728e16d7b8ce0cc59e2ccc848c181459fff4321982c08e9cac5794600000000000000000000000000000000166d7692fd30dcd06b9f01ba2101870ed347840509b3242f7cecf91fbed91abc24b08b08cc39c508e6499a2f8bc3637700000000000000000000000000000000076ce6dcbc77812b4d5b44a50edba5a082cc36dc24a5cc348283a4ce1518198b56134c9807ef850edc9e36e9a282b9ff000000000000000000000000000000001261d9412245abd7ba3fc1597f34179e54766c49306725d42588545e14f4e450ee1c7af913ad7225275c57680c23aa6300000000000000000000000000000000096602b4eee053998555ce522c060d5e04c7961eeaab0145d38c9b13362624f54fcc8d0b77f2bbaf8c312a3279f06e4eccf0a9be4775d65bbfc894f8ca66fa6f69d4249ea7f6b076fe193f2805e64f940000000000000000000000000000000012be34c18145aac51a1494f4052edbeff14c2812ff494cb78198cd7d9db9e951aea80490c55c4ed926f6a96a2c337c880000000000000000000000000000000000536e46a63ec5ac0f2f4eaaad6df98322c6a981cf2fc8ef253269cef20a76ba1ad089c24cba4ad4680dc4192d66595d0000000000000000000000000000000005363b9acb66ee95713b63dad076529805c0dd8921c738e205e7b1d0410a3ecca0870aeb2e64cf45270d49b473371ddd0000000000000000000000000000000016749b2b09d889b883b6fdaf518345d4cf097a728b833e92c4d21b5c41c8d5cfc0758e895b60ad101a74bbb6be6ca0c5fc6bfb37cbfb10a1ffdfcb91d9a52883cb9a606f4ffa8849a6e07386dc9bb34000000000000000000000000000000000067a684b55fdeea39a29252b355700a4810f083909cf2c07a80b362ac1b4d58f5900c68d266f7ad81ea278c0931bc1ec0000000000000000000000000000000001b1f78d194d77cfb4a2116ce9e29438dbf38c52733b0295198159d7cadb2584d86a75c24aedeb36234a0becf9d38a870000000000000000000000000000000011fced2244cd959872a25c0c7bb4af6151d99e1aac079c606db4987b9ba111261d4a16e7d82362b865324824445a946f0000000000000000000000000000000002659e7016ad615ed80ea1ae020903431b470bc0341f8e0918de9b8d2e933dd9f2d9123e9e9d20bfb05d49f71c3c454cd94959e16f6d780628694075ba5aa1a476d89d8fffcf4b4ab7e6343c011fee920000000000000000000000000000000008f3c5de8c94a98dc5ad7846c53980384f997d1657f7349ad9b51376d41f4b21861d212fb6428bcf2347d8774f44156d00000000000000000000000000000000110b245b1e788da41dcbf60a3ac4987c1925696dfca85d450107f654fa1230adb9436d60c9e742dfb4e453ec4944c56c0000000000000000000000000000000011043b975e01df36a36307ba9234a18b97aadb9da509513b13e4f3c80432b0cc5e69a3bbb3cbab8df41bbcc92cdbf60200000000000000000000000000000000120aebda10c52a67d23842e2bd9a897cf38c58fcd11e4e8c5614db5e409a7c03111feebfe2f1212ae753497dc59d6ae9122f3a5e940ee7e5038421619daffb8a6f433605f37e78d863f814b51b2ec4e2", + "Expected": "00000000000000000000000000000000021067690e6e001e3d0d01449a7257348c4ef68e66dd47b9014d7687d44749be1f33e6be95df6a204169ab7103dc2d3c00000000000000000000000000000000062efa0c36462ab0734128dab5da8635705bd1e1b540817c5805ed9417f176723eea92425db539e8763b1c79b9923e9700000000000000000000000000000000176c9af1970f026bcfa87e6f85a20ed498c28c6982e21bc050cdc29c0f0af832ed4424082e4862d985b78519cfa75b820000000000000000000000000000000018718b0d0fbdf4783cd0b01524ab153b891fbf08cad60241a3f3163d2c3496c36afdc6de62ab3c9a037f88ee408ce5f6", + "Name": "matter_g2_multiexp_27", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000018adf92d8da050c76118a3a3b2ee43955ae8b14ddc8ed64f5672f40de475f7e0ba6ff60c4b6ca3e863d7914e6de2cc330000000000000000000000000000000013d1e19011a1ea90389480d14fa608985d895e05edd9c28fb34646f70fd7bdb7857fa785b1e3c8a2997da6c3b5337ccf0000000000000000000000000000000015764827d9838c2b011660230ef9805af388fd997cc229c939bc5f4213d517dd837328c45b0b8ee1d6508cb70629b7bb000000000000000000000000000000000d58fa30a2d095ee8d946e50a027ac4cfdd557b3fd9c82dbf1536ddc0f42491a176ecbdb026306e6ebf1bb182a4e8199b3908c739d505a1d6fa85a6dfb7a155202710b45861f1a8a7ac7bb3274a180cb000000000000000000000000000000000cacfc8d0bc6f9db737c8a316043a6b52fd5946937467afc09ddd14e509a89f2445065ac8a8c56454d529d67793edb0400000000000000000000000000000000148b1b941f159d93170fed949d5f53bdd2603d78a49443ac0e2353130ff914376e018c3db3d12b807d105f2d50eded8c000000000000000000000000000000001382a3e98cfd072807214479900a8602bd666cac7f19be0443ba1354bfc05666f40384e9ccac314b5d0a2bec1c90ef0c000000000000000000000000000000000c12c2222f67a5adba78f2c0be5be95ed743e835857f4204cf47b67fa2eac45cd5985fd82c7a3904944e7b84737374b17e0e27a8a416eb38c989a66b84f037a5a24ef3358e20cd553f037a0a2461d31000000000000000000000000000000000197ff997d6c5efa3d7de8e16f26082bf13a2401d6df5f5c33c6614c36105f347e40216c907bdad9c1df6ebbd44f41c3f000000000000000000000000000000000f27a0bf92329730d776a83583177993b2b354a212a9c004f9f8892a750c477b8d1e68c13127f03b1629bc8392d06f5b0000000000000000000000000000000011b239cc6914a321385d907527b85713a0d842f5be80752f4c5758586dc1de944b6e4578bbe324f16838115e9c866bca0000000000000000000000000000000000cf93c5b48cd9de51ccaa45124217cabf466d07d6fdf4a7bb810443339ec4af5b74931bd07eb9fd31c284c05f3f539e0a3cbab01c34856b892aacdabe63d0a0c241ebc137a88c83ad22cf38997b211b00000000000000000000000000000000137b12f731ec925dc51e20a9c90323d14e1497e16b3a4b5651135054ef0e58e9b18167da15220b9a4f7d81e9a7648fc20000000000000000000000000000000000b2d3ac534e1e5b2c9ff4092c2d8dc5efd99121de7df953e5426eb33934ef07e41b196eca50f5a04a936881a05f2b2a0000000000000000000000000000000004feae2377d950717695606844a4873ed7b5f6703d7a63dc8b960b99b68efbba710c2db0f1371acbee314875b97ca054000000000000000000000000000000000f49ce3061e7254dc1bc8af3636a05e098cb96d81fb31e25da97c6266adf3c41a74d46ff32f4fbdb4cb7e4a3f69e827bb386bebe0e49b7f07b0ac61b15306c2515a1ad6fd76a1825dd29a60e845c0e4a00000000000000000000000000000000064ae3fd67250f2c6332e1e149ec09946147e12e0d871403e559b49aab68190a1454b3ae924727b6dcf6e1ab327c9d7c000000000000000000000000000000001131f91c7a0e1854bba3958b36083c27904cfbdb8b8cb3fe68cf578bd1cb6f7c6eff91d98e4b99086926c5d4272cc1f200000000000000000000000000000000071c6a92a8d460ff72d172c204c8a69d6b6752b8c1f731ec63f7f394c0c3a2a1bc15e865172f693f523c11cd4ab1f88e000000000000000000000000000000001193876df7f4a1cc9b337a41c9faebac2f209b9070bd75294c2a88d3091a1e55b51fad482fd2aee8f90458eeb7e981fb8902a82d33993a10c56b2fa3333cabf1c5d47a9c78354d58f70ce4807cf2062800000000000000000000000000000000025c20ed5572dd1c9a098f241d2965d8739878ddc57c017632afcf6e54964894adbd6d30f62f316c9c3ec7a08268afc70000000000000000000000000000000013bc3e930f4fd5766db8f04e1ebfaab2b67f620119c39d687c68619b3564f3e8b74666c9f8bed6c1f080a9e23e9c0f22000000000000000000000000000000000973a3cf19312f90843f1f013b05484064032557807ca67b2ded4a27fdac12d6cd0e1416c8998cc8635ce10046adfbb900000000000000000000000000000000108903617c78fc608eaf007aa13861c970557f2693b24e8a278920897be9694570ae6e6c7749c3eab84d5fa3af5164b1426a4e2317fee033a226a91a52a5830f9ac2cf5f329feb6bdb382438b8a39f2a0000000000000000000000000000000005695975c140fa14998e5916268bde2135cda80a45414fa85193fd6e13c6b5a6486898f590d76175d8ec2629c923e33600000000000000000000000000000000033f58b1cf67e51e9ad817b31919530cfdb5db5ca4a537d9b006b63399da49b2a5077bf5c3b3b4fb10b2478f466542540000000000000000000000000000000015c532e40ec04d9143e308895b2e7e3d3daee093a5840e1e76ab528fcfa5be57d9796ffd58ad5ab7df6f88aaf34706f2000000000000000000000000000000000b55747d1e8b66e2b2fea67229f2b7b17d58ef547ca841bea8db5b53fafaa18390f11b8170c41a5dd29331917fa2e348de0390c05fb0dc9b4a3f76b51cf952a11b909ce13f9abc9fed6a349b8efa98ad00000000000000000000000000000000001ee5ebf73bb40a5c0822350853bb5aeead3262380dc274faba6b04e58e7fb9d5a4ace109ffa5011e73e3d89ee6fd77000000000000000000000000000000001427659e5ab1f8b47edddd27c613b578890d4c66c835c0cf8e8daf19d0ae842f0bba5bc83ed7248adcd75cea5d222a270000000000000000000000000000000001d4560185690ac05e56c2d629d599bceee3ed2919c29e3d1ac54e80ae99b5eb2f93bab865e8c1eef7206f96b2bf4eb20000000000000000000000000000000016ecd3589e3703e5b0ef53790130d5074d2bc0fd5839d9c6ff905746a77e393f73edf53b98b99d9c87a1fee1086aa8657431db9e576643f93505b5b25836218759e736c0d650a5221a652338b0073eb600000000000000000000000000000000163850016261f34de2b831a0a8dd3f224adaa3cc279cdb40e0ae976bbf736dec26c55a6c79cb1c623870b62ea216274b000000000000000000000000000000000a79af5c054cd08608d4be1705058ef7b4ec38a8727560d960f0325d0ef915c049a89e76956d0296bcb6c96333c3470c000000000000000000000000000000000ca89379e558c7308edd25bf06dc05db857204e9351299ab66bf050c8f051341a6c15a02864c679f07373038de3fe87c000000000000000000000000000000001929f42ee5d9dbfd1f6656f61e6243ebf0eb491762b7f3608db3f3e9abf565ab1524f770cd2ade334885d7479342c92c6745a32591e359efa41e9ea93a016d2eedf1da112cddbf31818e8d687b36af2e00000000000000000000000000000000193b6cf7300e47ecd21a05a71b13a8de45418d3f67931789ce6111b8633b9f44063ca13ba8c8a598ee0725caaa3f277a0000000000000000000000000000000016884d982e2ec0fa7e59fb34ae8708d0bf4abfc260837ef4432e8e04474e504b85450db8af8e6809413c90268801fb3b000000000000000000000000000000000fb48a8331f278845979beb8cd21060355566af215ba44029455a03d0c016daf0f6b7c5773d1a99e893e76b4411a53c70000000000000000000000000000000007056e30143058eaea89a3065e1de768d49860b170d4c364a28d38475f90711fba62c1787adda90dd2d347da72680f4eed37a5f4bfca6b77ff9e4f7e03bfed52ecf02a8f84ed3da6da2787a4ee81ad9b000000000000000000000000000000000501fa9af88e28d4f0c0590a2624239bf1724ac7174b0f1d5fd7527cff1de9971d6aaf28ba4005e88e181daffee6b20f0000000000000000000000000000000007af5e30b5aa9ad206645ace12cb2b36cc1c6068e604184ca8bfaac5a4ca327f7c43a74d43417918da7df84e3bffd282000000000000000000000000000000000bfc0538d52f277d54749ed0b69697b4c60ef0c5483d21dda76533e15efedc9e2b2ef07618457d64bae8ef922c0b41f600000000000000000000000000000000048935cd352e999bffa613e3be0a9f9a063d5b5eb46cb5056e41ba214e87f871f216ff41ee297aaaf2994a7b6433f58d81633dd6e729bc17ddc596cb1f17dc6f0e50c052a0b8c5a4c83900d918a9eb560000000000000000000000000000000016ab1e8b6f41891e0b65f14397c0887b27ff27e7463333e0938a7a1a181dec603056afbefdb23b41bbfb2c05807289b8000000000000000000000000000000000980d0ea9ad5c87bbe1aefb708061f85faae1e1e3b01c55bd577631e5bea2b5ffaf5e2478f5a8df89447fb8a73559729000000000000000000000000000000000784d0c5fa243bf0125cb2c83a4040715197e99d507d71a3bd9ca396074cfda652c1ad0dd95c3cfae369e68d3431ee7c000000000000000000000000000000000e533bb33e6d269dfdeedf7d17c3e0c19f694d151e8eef801c326cbcbc463a42558f58cbc330bdff0d8d91e2974eb4cfc6b019d29219b57404baa955f66cf1b2ee6571ad5b80d471ff6db569e32a1a5000000000000000000000000000000000050f005b00f371a7308b5d7d7f67f7c00bf15acc518942607f32686feab5eb503391f964eb7ca711aa6c7b4e494d7eba000000000000000000000000000000000e2ee5092170ea3da0b1397023b2386c65ec8b090484353f2e5d64694aaeb8d5410ae22c92662fcfa21566d70173ef36000000000000000000000000000000001549723160fc7b8f5ef9a84bd1803f18b76698aa7a663d9c107c9ff6c6d02894edc80fd00d436f3a942c05593c5464ad000000000000000000000000000000001032f49e3527cc1f1355c65edb21220c6afc88919ff67ba99c65645cd3b8ca6662dd0146f6a90d92558b3f54815a361d6a76411ce02b4dfc84ddf62ed26508a2dfa5edb5a98a6a20dd69e8b8e7ad2f5900000000000000000000000000000000170b317e49f1304570a3a3e6bef78fcf8537a451ebcfef5afe3eac4aa1aa87dbf95d0f870fd3372d37efc9e663621cf7000000000000000000000000000000000269ae0677d71b2537078e96d2593482e4d41b6d1d2cbec755f307735faaf79c01fa27f1103cdfae1a9bdcb665f592c9000000000000000000000000000000000b115d5a9fb9fd9361d0573a8d68c5193f02edc1cf3fecf004c6603f118f28ff394220f6a9e1051a5d9d4b417290b7f800000000000000000000000000000000107b45614b18c2513f8c42a0032cf0f3f300157b39d2969ef7b126f17a9b5e8e9ecc5a61a2ed4db92134b0797f6a0ea35906098e4ad7e4eb2e996075c7cd660fbc399bc942f9080404b9d0758c4ae14c0000000000000000000000000000000003de39b056f8f0248b138437db1536b7bfee29af00c37fcd14c25c88f0f051eaa07c763d94c8ce497696311736c0b7140000000000000000000000000000000002b52981e828f8dc1cd371e6821d001e1f96d57a865a3c0a255298c43d52741b18fc60903d1a5ef6227061dcb243096c0000000000000000000000000000000016b5335f0f9516f52f2ed45fe723ded427206ba96af0879958f1f22795485b2867e953de3d9b3a9eed2c37f26838e1540000000000000000000000000000000004c860058c7ea2e6e4eb2a65c1dfc20b3070f89ff58ab99bb51a4eb9e7f0642f7b32d1d9f27c668a36a9e053a8d585f394ef8c281a9be3766fe784ae017d93f608dc2cb97cbb7dd3e3814b5ade845d370000000000000000000000000000000019cbbc125ca1b89330c21ef5b42fe0dc1e795271ce4a9ecabff04eec9029f756f180520f0e7b84be2e9fa4af395536ab000000000000000000000000000000001630cf0c4f3282689a3e01b5c8f9be3803f60238bbe9fecbb0d9e8e49f4ec9f6123c44840acb8cf55f8f6bd15579e6830000000000000000000000000000000012afb848bc0ade8f0c25c6c342bb651a7481be065a48944bbedbc14c095af8a4a048fd1e776126e2128f904afbcb17ff000000000000000000000000000000000dbc984f9ff907ce5553bb11a458deaaee0efea49d6816ed7abf1dee7b70cb18cc669d4808e75678bb898359c7ebedbe6feced33019b3b66d335f2118cd22b2952cdf9757fb3a0cff55b7c4f245fb438", + "Expected": "000000000000000000000000000000000be6dee62b8c85e36a216d16c5477a7c58f03b992277af83d9b53b3b2169414b72bcb4a97e3667482e888738ff17c94900000000000000000000000000000000067337c69c37ef6f0ae59fddb84c46a2afe7fe047ddb57b3b80437609f1a21fa5a73420fa5b44704ca1cac6c7a99d9320000000000000000000000000000000017fe6f37d2410159e533374ff3812714dcd07610d75a53a5d502cf2f51e750c48858db1e109f6aaf724292c1402382f1000000000000000000000000000000000b8ecfe1f5f5d95777b0fe5d94fe81b82656e6e5a62b7591788baccd251d93e4bbc6857cc87cfe6b4ed470c33631ae22", + "Name": "matter_g2_multiexp_28", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000126d4a9ae3550e31185aac9011e3f086517cf79a279326c264f51bee6615dbcc730d78055489b5602e91b08f96d23882000000000000000000000000000000000aeff5fc04fd06c26af8b048fb2d0d493525ba5c2bde30664e7371812d529ec7dbd584c056b05fe02179b7eefbbc45fe0000000000000000000000000000000017c6538d2801947cbb646d4ec8b70b1e24453f7a984db7ba73e3a5dcf595bdbad9703f2d846ab02491e5e3a5bcee0762000000000000000000000000000000000badf551dbedcefbe7c303a5c8a52151b5460caa22004028893af4d8a3fac30cb1da1e986f9124acd5db7a634657dbd0cb5e7df372d346fd13faa90b0d6961372ce2f32ec379e5e50e7ed8a13942cd9d000000000000000000000000000000000bed71c7d878e7ecccd8233e3e604e564cba0b1ce75f726f846f3a6e2f3b4f5b12a28b8638be647f5c33226edc2bc7fe000000000000000000000000000000001914c20aabaf1f6f82063223053809622ad82a3a54668bd600db1aafba22aeee5c8a07584e263c91cb0fc5fb809da63d00000000000000000000000000000000056d9cd8f79a90d16b36bde77e546f8b3064ba7dd0fde78d6bc538bd6ce12a4f32860205d5d396bab3d70deaaaccf9450000000000000000000000000000000012f7e420708b66132157a80753678de292998cb6c4f00244d3c47a6077b3401132b73c7f52369aa2a6a90892f7be4ed913a5fa1674c20c97d08608d200f3f7611010e6a25a790853ed4ba0c5aacf111b000000000000000000000000000000000339aa1471eddee8cc0a4e4db5a29c3e4e92cfbabe023995a79624614aca522cd459dfacc0cab346b1cedac347e1df100000000000000000000000000000000016cc4ee8cb72fe09e65616fbe9bea1a0077114ca841ae335f1f9eb5a0b129a4bdc77cc6dae8727d74fe21f0d870a43f2000000000000000000000000000000000098a21da6e983228ebbed0ec3704c9d2521e935506c0567e3bbf9b9c379ce6d33c3d0dd8f5e013b431f740964db634b000000000000000000000000000000000a7a38abe8e282544ec6c8740dce8559fd264393d0a5c9af9813b2430bdb92b3150eacb6732b9cc278d0d0e622b263ecace10870acf190b373c19ce615e20e5cb96d3c6be3ec155f2b29825f8476b7740000000000000000000000000000000019ed305bfe8d8bfcc20794832b3c117715b6a658c0bfeb629e5989f265cbb456e857e53d168932589e4ed2806db7c4b4000000000000000000000000000000000e2ffda25fc316a38f556b35a7a3acb1a2bfbc1f9469a1b6427ed1f216e113a379932b0547f5370be1017a1fa0266cfa000000000000000000000000000000000ebc493c9a79b8ba58f48b90b9d287c74f505dcb484eabda79ada987d63a4df04d671d4c4ae4b32f8ad5db6a1b80f37f0000000000000000000000000000000019fc715d26c0c7a0c291ad8319e2e8f2920c63b4d4ed3f0e2f376aeddd4f7bd9269175ac8d0f421b001e2e48634f3f238d9e38d9383f09cf0f8a8077f1d1dba091ff0abdf7e77c3b65c2df48d6c6f536000000000000000000000000000000001285ff533da833a3daae7d815b1b86feb6f20b7592af8b0eb76240f390ea48b69a75547b040e7282b71779f450d3510c000000000000000000000000000000000813d38fa21c1f3c87b9c97ac03e6aeb8fa23e0340a0dff4e3892c774595648743d0b8980a7bd21648ce9b16a245ac3400000000000000000000000000000000020a69dbfb736c64e4cbc800aa415729b24ec05e901f2c7ba38e49a21c3851dc03bd4f7ec829d4326fe6c13867069a07000000000000000000000000000000000d518f3944053c8f74c0aea1d054d89106312880de4479b3dfb45b00945ff8bb58b12f9a489fa9fcd87194a71475d0a1abeffecf9b404c6bb2e2d0c78fbb8609a38e3d3187587c3848e8f9781b7e9f440000000000000000000000000000000018c82052cd483eee7aaa421c2b998ab0b4b32326dadba03c1d923726697d3940b40d5109ba34de09439e833ebc19daca000000000000000000000000000000000e4feddc3eeb3fd1eff8316d5b0cba554714713e8a605a55909889970ea2c8c58bb6c568024709def73b29a5a76563c100000000000000000000000000000000098da4cd0281a16e2e3e542ebb92269c8208a3d373394b0af92dc8a2676f9f0b6e85fda9161e32558e0569cfc7b1f3df000000000000000000000000000000000b7b54b51821fc037f02167d2e640f8dbfd1472407278b4bdf47b958da39f28c64569c3199846c293bf60e86aa45f205adfe53846c0038203d8b8df0cb636aec7d4ed7f78b0b0c1734be448bace08f340000000000000000000000000000000003058abd4e3d49c86ffac9c95b1f07b66a22c42654dc4a2e3b07b87c22024a8bb0ee084a558ac22cc9fa286861fd77ff000000000000000000000000000000000fc9a89ee26c323df22add487a6bb278ca3f4c9a91eba4e067d5abc9dd3afededb4f98263e10083cc7ea224f28d3bbe100000000000000000000000000000000058eb015f1e14da860215d59165e12feb8d1317f652eeb76b3f08b38ed943c94e632dbf8145233dc93755e44e027553e0000000000000000000000000000000010897d5c2b481f9937d830b333e7649931e801a6bbffb7d9a3ee28ab1e27889691a9f0b9616a8437c3cda942bf07282206e9d4e41b628be51690b86aa8938db066c052f3adff774d35eee1e332312d3f0000000000000000000000000000000013b88963296d8c8197cafe160846ee11365b7a991b35cf5613dc57714aa48307f4dd9c6ff9704b29905c18a41a48010e0000000000000000000000000000000016a97fff65fca5ff282a818deb8100104308b8d9dfacddcae32fc2b6082331b44fa70580018930fe1ab9d9c1b13a59a20000000000000000000000000000000019cd2038acd84c2db1f0fa1b7eccc5f7ae3da803cb72c4a1e8390d49e0adff1d88a85696d9daaebce9c6b8a2f861fb36000000000000000000000000000000001271338587f06847770c72dfb3d9a657d05f8c7a012bec77a7d40a98cb1637ae99281c82668486119608b01feb25e6dab3d349b1546a8c235d60c41408c969a0fd42425f8b5ddc1fa5102d2821bde2c600000000000000000000000000000000173ed7c70f4683102cc6a276d192a8f3b189197d5ea5dc813c7d0162a1649e906f76a1c9a1cb1ace6e4d937934b72338000000000000000000000000000000000936d260b789b1a2a9d04388caab364049395be61d320aef66ce50f052eb462faaa2017731518675bb0e4a2f050e4f7900000000000000000000000000000000070bd1254cf4b209ecb40afe248f2e53c390636625460439952ca2977be021d93fbec264c31ced2a810e8a5e54d750230000000000000000000000000000000016ddc3312f8ed359792bd213d086a0ff1540e3e5a2dedf6c450fb96a9b6d1edff9bde31fbc04de382cf44694a631178229b83950e79750e9827ed92856e4d1e1b5f0b47c6bbf3611a1fef8f2fc47659c000000000000000000000000000000000aa4bc6e1a3e6c3c45a29db74b27af27b61856e2cf385ce0e5094ad53db4d31c4af45b5b234c66a21bf15018c13ece8000000000000000000000000000000000188affc993bf6c99103029c1e406bb1a693e4f1dc650907809ba3de1471d41095dc1866578962c72538ca85d09fcd22d000000000000000000000000000000000e487a7151916694b980e62b64ba49ffc54aaccfa0b0fbc5c14fa4a50d1bfda55698df5cd8570c07030f145c49a4ba9000000000000000000000000000000000084a05dced107d29a0fd4cf817ab67017ca33018d5c7302167d08c64c45c5c455fb5c907f21c39b8a86d037a126df4e76b5ac07fb4a184dfed685b93d2265cebd02a3296a3b0416cc6a115242079752e000000000000000000000000000000000ea7060a07dacd84287007a05b494bf19a03e5a759b0ba67624c54cac3562c0ca3fa6e444206614d00d6d6684b86bcb5000000000000000000000000000000000eb2f332f4481276f931d2192c1a9f6d7585e85f248a8ac95aed398cb61bda05230bf8b9c041c6f78be3b34668a9c1a0000000000000000000000000000000000faa038219f844e379d8cce55cb8f0fe2b55548a0a0e1e37e25ba4f432e6b1a6451b8f081c171490bf055f81cbfe5f8600000000000000000000000000000000037c70d4e8befff257c4bc98a4726a961f3e2e68e7e02f9f2c94aa8f5fc67a1da44d41394dfe376a6c04240e4cd5825f3a7a25ad9f02bf51fd73550ccde12374d9b151f2f6fe535bfaa43efc391f789700000000000000000000000000000000100a24d21c0ddb20d76b6d9fe642da5ac1de28afd642ab5c08574206b8b64d1fd822d295476bbdf2ca7e9267138034dd0000000000000000000000000000000000aa7e4f2f77acfe8b4c8f3fabd56b17415ee9bb182bca1db15c399479ec60382f980067b9d4c4ef7556d621259ae9110000000000000000000000000000000012f7a7f91a988fa661c661013736f0ec92b40f571ac15a47067bb847b09ba128d1dcaf8049b941a51cacece5db4e1eb40000000000000000000000000000000007528b0ea66b6ab8d5d318f5e4d1c0e9a4f504057dbb0397b614a1adb160032127f2ac35a1a98da70f023cd343a35ffd47944c8c814f143f746175ba0b2d75e2ae73730a265d869763f0e986c088bfcd0000000000000000000000000000000015d72b8d4e71cc092c2875de80f3d12e003804d980a4b1dd13cff34e9336397c4533b6ae3a03beb2f09312a605947a270000000000000000000000000000000005976027a98f7b0caf4cc7d0d71440d3e4fffb1ff65fbf32dc890b275b646f2a32600a6215d6b2f999eaec8e58cb6d5c00000000000000000000000000000000111583b7734be53a7d4d090486070cd3d9622156c52871ec79c83ca024880684eada56a36b58cfc3490e65de41e10579000000000000000000000000000000000fb670b553c2ed4c81962b149efd4b0c77edf6ee70eba88300cf264dda98190e550540fb9fb95748599bca3abadd752030f33b187df3516866f259ff959d57fa9c53323d5c851fdabb96e5ea470518ac0000000000000000000000000000000003900e7cc0a8e891dc4dfc45f08d97e73ccbe2021a560a92c493aacd9c0614ad100294b5d7ebd634ffe4e5ea301a26170000000000000000000000000000000011ccc136127189728a7036e85d233fd150d5483963c48074f9d8ff83a0791c950da380e717f2bd0bff8fc115e9e886290000000000000000000000000000000007d3e76bd1f22679d228b4ee50a60cf1bd1fdaa171372cfa34bf4136a091abf7e5ef3c6b3446fd41d5de68b563fc7ff3000000000000000000000000000000001107f636d9187155357bea75c943dafcfba2394a9300054026b46d6f9db31eacc06d1f64c2b139af297dc4783026d98f4da8401050f30459e026a207ca631f0684a10813c64ee86dbdf06b7b29cd9786000000000000000000000000000000000e3a4101f6af3cf0d5d5aa5a0ebc26852dc69f91c06e96c5f1c7f8e4528c3dd92cb6f629620136ec356f0657fd9ebc6a0000000000000000000000000000000008d34dc3e1fa8bc22258e23b504d442a11938370325c101f1cfa52f313724e0894be722646195fd078c1a49720cde8c900000000000000000000000000000000163730996c79787e7ab89030de2c26e26188187762fa128ba4378a398ebd906dc56d99cf228591f394396248665c196600000000000000000000000000000000008f0a8b3d003b6727834228798950fb7a3cb6b931bced4540693445a007b474f7459ede17f87158e932e4c9c094ab904d940555d48649f30026f70450b2caf2b8f7148b28bfd4349458ae89c323512e000000000000000000000000000000000cc2d30f7d3869abfc34719f40b0ddaf00f52bcee7ec09a16de51785d55531fa7fe3ca1544d7103b9caf7105d60d9e930000000000000000000000000000000002ebd8af0bd3f82dc9dca585feaa83071534b2bc2b3d2aadbe0d01d759ade77ecec3b3f7b72f82087365a14dc205add80000000000000000000000000000000011aa3734a4b9168d3c46944cd726bcb203b94b25a97437a6aaace9c84da708bb073ee10585f28bc41e0601567863c193000000000000000000000000000000000ceb4ae5a8b506d31e77e2a43f3af8ba9459b887a927ca5287edbc2ba7c7cbba85a6e4d35c099b7ec7bf7eb2814cc38ae140e30424d2cccc91be1fd3a62d9ee49c9d64fa062d9350b3fa567ec21bb06b", + "Expected": "00000000000000000000000000000000192eb406b52075513584ae3c6093fb534270d716c79961d0a3c4bbc44096a2e8d28228363e2c8da54857945f1b983569000000000000000000000000000000000ee0d95748b13b531821ddd71a15fc529a2ce2c99a66f14e28f97478c3c2d524cb7c4cd7e71a1027030765554b8f50f7000000000000000000000000000000000610ab3e064532ce261aa2ba4f78721ac4f78661cc13fa09ccc279267e6f703f1bda17265a5eccb0061ce24d31e000ec000000000000000000000000000000001966a334b16e64e4dbd66119af97bd2b8d6afec0eb1b8207f437c00ab134ff369b3b3c1bf51b871a7fe8ad1ce93dca4e", + "Name": "matter_g2_multiexp_29", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000004c22bd94b82ed3b106532a58a0253daf51f579b9d746c624bbc6b58603942eb139c1b576241ca8fab5bf1c457112bd80000000000000000000000000000000010c6f7551d758d1128add57b110227296e060074e4cb934132368f079a794770ff406fc7717867df0f461f5c9fe56960000000000000000000000000000000000048f88afaf6eee5039b76c0c5b4b49671f6fd04f38bdee1b1c8f347a9dd4e6aef387b742c8f9a8aa387ab4d01fe4267000000000000000000000000000000000e7be987d0411dd7138e47ac00f9f07c4737d93aac501edd16362ea5a633c9071a6bf542d4db540d75edecdedc3a8f0ca57b2c351a7946a20cbae1fd789ecc5f77376b09e911749831e9b5680185b15300000000000000000000000000000000056a29b523b0cf85ab04b0a496e078dba5529cb9699e567ca42f9ee3e3f07b61ae29b0ce17cad23131375f624a366157000000000000000000000000000000000acb91d1f057c7aec1f7561614a95f8db2252cc879bbc2595a5f607d8b0ecd6e6e3ec19849eacfca62d870b049ce84910000000000000000000000000000000010d9459e07178af8e125c2f66de699cfafb5f87a63454e24d0ed88b6c804a9ff204f146ecf4d6db62234ace0a944acb20000000000000000000000000000000007256a68e23b43a3b6475b3cf209ec108bac13631ca448cc860672c65c1760a8299fe941ed5bcbbbcf63a683e86806ae8fbff9f8ac4ad10718d46a857ba28f182263bf2d13c8b6a00902af737dea56160000000000000000000000000000000003e33b840426a6bbe15b23fceba829bda9a5ab89d37e60133874f61bf1b10e05d460bb5d228cb178cfae2a5f41035d32000000000000000000000000000000000a9c5460c6443364d9f9440d101d92a0037343789ca0aab6dffcc2bf81e1aed312299a21556d16e55b1398334d9061f00000000000000000000000000000000015db251708253f7de13a5eeae5aa76fec415ecee1ffd88d882580da5da8d9f96c6ff90d920b329096a103dd71e7cfa580000000000000000000000000000000014c3a004cb6ab8465e05d965dc720b37084d98de424b160062f225dd0b67a8e62ae11a3c7bacaa129a568f3a243357ebb061de16f4f609c6947733b58c6444fa9549721fd9a2459652e8e4b8c69b5d61000000000000000000000000000000000c8fecac8bee21d916cc47b96a66b7a522ef4fea76fcc86ec490ff44b46fc01ac0446e3885e36ae7ab62a409ccffcca60000000000000000000000000000000011676ccef54bb27ab7db0b5ec025a9d1f29217030f3686e71564fa011d9fb598f44a8bed3da8fa7fcd10d01e3f66d86500000000000000000000000000000000093aecb91956215980854c6f19120777983a160e16026560c8076bdc4372f53065f9fee0f5830ea192aa5637590a745100000000000000000000000000000000035d773ef15d8d99b600a6a575eefd661aacb49d6540639223a454594570d0f00ba37340b63a2c8a0d4e53ee7dc2dd91355ed5b57b28451ad98fbacd5ae87551b7304e4ef5cf7b7dc443a66432406f9a0000000000000000000000000000000007b2891e9cea2a464742c7f962deb1566c9d4f9e4e7cbee1912a72c5b064211c39801bf42bd888bc239e6b4ba71d700300000000000000000000000000000000169cf5e706dff2945145d5ac14bd5fc8f7e7c3e5f7ce733c865e1882d236926c71853efbea26e13efe4eb0d0e7ed5db6000000000000000000000000000000000de9ee19c4bc2fac36debd4c91317e54f57e761866b134ba9a0e84a8d268b11674110ee8f91aa8a6b80eabee2e5e75ae0000000000000000000000000000000016d91408a670e4ee43ab8e21cc341596709113950d22bdf5073cd90f520667699e94f64f76290f1bebfecfd80a9e051430b6eeb01874ff4b0fb07dc9f23d8e45455c1480eba7fb3033942214e85a7720000000000000000000000000000000001982744a15e8163a6f2ee681bf27a68996682216037d67d91993fbbe040e16ea21a9cb600fc6a40e7289185393544c3f000000000000000000000000000000001131d7dd5a5b96ac1f4c4aa210afe7af8d371cc16d32289aad38c93afcc1d3be53716f82e9d14ce6b1c833f7f5871ad00000000000000000000000000000000009adedaf19fb8823ec55b803c9509ad98217730bfc6424c8b69a071e99d026492e7c8c4a06509491a3bbe5893988c357000000000000000000000000000000000cc60733a783c7df76541daddef2245e6d2b694b94649b13c21aaffdce124c1cec3fd8ed5a5d4d4eff3115ac933e5df989a697a0e8d2cf512edd2a3c3df354eb30a3eaf697779dd9270234b367c2b5ff000000000000000000000000000000000b366a80247a8e3797f1c711aebd60c99ec7caffda34514a3716154e900f2387c46f87f81af036a383e3f9234bd1b50e0000000000000000000000000000000004608b7cea13d08724a2cac691e61255ea7472537f7ff59894d511af7fd99ad72f0a7406271576300a7d1d56aea17bdb00000000000000000000000000000000141abedc914d3d1ed587162acbfddde60f7dbc1ee5e07fdb5f3515b87d1a29024c9e19f24e4c0e3979bd938aa4e798270000000000000000000000000000000010e72c6c0510495dd2c4ecaf13c1c6404654e1be369d1ca485c76d8c2304d60d69b90c2e171f18bf55668232e747825820b72463d54ac1d8f1b3f56f0f98861768b05d5174cf1883dd8eb0410420d56200000000000000000000000000000000081d5a229481fd297363e8e217bf1f94a00f54eb6e8a3f95f4de30081bb2b9edd82d53cf287e37b459afabcb73fea1d1000000000000000000000000000000000ab55f52ff7dc578ae8267fe3fa09bdb8174dc30bb835cab9851dbee7a1aeba82e83e07d5e79aafb34643d9fc9a0d1c100000000000000000000000000000000195245c7a762776bc1e81d7111e3b814088f1e0e7d686c3ee3e500cd0a7ad4015851563a1b8b592e491e00078187c66e000000000000000000000000000000001850c1e8edb0d6dab973a9975833cffee8b5243654bc4ebe64972e423799283707f9ad343bfa86548cd2acbe04ede5da3de7997113708f9d092836c2b0b59abf710d8401baea6de73ee0689436f035fe00000000000000000000000000000000000007e9191fa9057cd7df8fb83d497ad774735c242bce9bd34cfd21d3f8f2a8e37d1f38b592a61ac8a8d22a4287fc5b0000000000000000000000000000000010e36db1460fa65ea229402f558397c6fc57e9c8a4b0b9e85d9ba938196bfeffc951587353cb7c7d84479f60c087e3660000000000000000000000000000000004d86938bebb850fea82acd336c3900b241757dd937f831dd909ce548325955f103dd57611c0b75bf71412a6ac3d6ed30000000000000000000000000000000013990c82583007b693c1d6271c1e5820d7274c4a729da21a76eccbf7abab1f2bdd6c5d26e78d51476ecf154e4fecd1b87fc3d0560432dbb721f8a0610f0db31dfdfea8cd5ebe8da3fe3b8ac5358dd4400000000000000000000000000000000009104610d5887fb7cf6a866584cae30cfeb00e1241083b017ccb82ddc9d72fdc0d2b1d227c22ff6d8497495f44828efc0000000000000000000000000000000002235f959b071f21fd63282fdbb46b1dec27cc193f3e9988def691c73dddd789b6a1adb977a68e2661fb41d62280f229000000000000000000000000000000000ccd46984208f183f0b70c9152c01fdb8ac078ad1d85f41e3a24819da321d9dd9321a8d70103282abe6d8b981447f202000000000000000000000000000000001711057042a54ca76b0c3e7f36f2fd49e339b76cbd2e053d93ec2838848d359865fdbbeb9e75e408b4b316d60ce2741ef0b271f02031a126f8632e30d8b17cc5b57de7b8b873e0971ff392d4246a40f400000000000000000000000000000000001481684941fea0f66c78faa40aeb4b5254bf78c44df7e37b191c095ff12fc94248acf01d2aac5637e9536e73a82c9f0000000000000000000000000000000016b72eff2830f49b24b1e1317c95143cda8bc11b9dc4a91ff22a24e0bc1a244c7215ab1040fcfbc292ab236ac73cbd3d0000000000000000000000000000000013535421771fdad616171f7348cdf32bea7486bf4d836b8b95c69b71ea9915c099e256287aa119af53cf6320ad86664f0000000000000000000000000000000019ba0f36dc556fcf09f0a4a6cee53de485d03d846af7afb792d16220551fb5a42a4261f936b008babc096e6f8f68b63af8b5c136aa5e2d670edcfb5bee9ff6095d85a332ad55763fe1e5e8babd145c070000000000000000000000000000000014b2da0add872d6e61253d6022559f668bf192b4aafe0acfbbf341ada55b404d42b2b31182c1ad50c73673494ea5b7d40000000000000000000000000000000018b76b74e9e6cda8466a354ff66baeb935b5645cf9eca81f4b7342f7914c9bf35c57be402458c09781e66a89cba6e67e0000000000000000000000000000000019bc8c1f32ce934b7ccae6d8ca39a263939585d8f94414c3880fc7bb5a0a27d728708e7ebc42c5a935f769adcfc083f6000000000000000000000000000000001636b62bbbe34bec06253887b78ad5b3ccda1bc5d8baafe450f2d1a8e07334ca79a40c5c4a50b58aaed96408749e6f68285193e7c10646a4601787edfad3d76e19d5b013a0a954873d92bd5293d325820000000000000000000000000000000013c0fd7a8441b6eb2dabfe8c152aa480015f81139c46440741f3da1c50d18c17526c47e8b8c2fbcfaefabbad5f8a0b000000000000000000000000000000000009da839802e7c6759a87eeae5a05146e1d226dd828d4ef6d908b4a0431008f352539f3abcd3e4c532a3d8204e350a8510000000000000000000000000000000014709634973e4554d2379e439d099e9be8bc7ef031b6ea36a7a85d2ff5090b0e0de7cc1c6b6a004465edcf868ef5fd5b00000000000000000000000000000000146779393d82bde1eaa6205e69907a0536c782fa7fc6e11e5e62ad5468f4422b3688f2ff4da2af396741ca5e0f97de3835bb2175fff61894ccbb69d90375df627e925f1ac430a349e75580dd39546e44000000000000000000000000000000000ddb7d0380370830803a7eda2e9b694af71381990f182b5d1223992abb5afe9531bbef8b9dba239f411fc422210fdc930000000000000000000000000000000018b685009d012d72193043d09f8968f9a41ce2fed598a20536fe54cb26db1733214add38f73148e754e632f6d78f524d000000000000000000000000000000000b967a7b4ed1bcd9f3da16584b08e0c28d967cebe7a07069abfb3bbce94d26b6d95d8a807879b24fb1f5ea00091d6dc300000000000000000000000000000000039349785fdb7d38707d8136e9a8f650c4491c50d7425388b75fe30da56147992c3d662f22131ba7173b2550e613477fa25856e5fb9547c48d41783bf2cd13493a1fd71e56b9c7e62af84a1f6cdae1c8000000000000000000000000000000000455d7799cc1c2af1e219b23e8683113fec126bad1dd7a441c5d113b064b552ccb1e7314dfed1b11f42a18acace706e50000000000000000000000000000000014d2400aa3e2270714b656bd755c4bba55866d6e313f619e10f94de6d82b5343ae9a9483dc10c1a72a5a21e619a20a8b000000000000000000000000000000000a6caa6cf8609d23b7873c908e5321d064a9c107b5492d296d04f92c308ee705229dfecb1f908bca0024ca56bc125126000000000000000000000000000000000b31c384423c84316f65e03ba9e01a8f626236f76e4df4b8ce2fa053c1c1e6a9b8f0afbc253db8c9c5e2ce9f9dcf05c71155c0b9c4185025310e8020eb52abb6f2f1780da15e4ba81f3c9a88ed1b4a6400000000000000000000000000000000097938bb53db8d0aeca3f2bc180039a5dc5269748e9cf065cd88e59b30733d527e54cdfa224e9690581e8c7f0881241b0000000000000000000000000000000002d52d97d4dd415fb18348f4de78c65e2933fc45d5e5e1d8f0f0ca1cd52885704ab12609b91d6d2d1ce13eecc7fa0c2d0000000000000000000000000000000018b926a37a8e0ad836846d06c03a9b84db795fdfe5f15d1fd3e0f8fef1b2825b29ee3a503ffb2f75765cca49c2b3d4cd00000000000000000000000000000000073bac093e958a3a09543e060c81b35b6598521a8685629f77200cdc73b372588e66c247097e7c03492c0943bfac4d6bc5610b2707ce84ce67e82d5c0e5f5cd2c90925aefc1e39468ca86475012df045", + "Expected": "000000000000000000000000000000000f79110c74f0e983f3d3618869af1d9b96dadba61f1d596294ef8a9412f946fa26cf63483528a57299dae48f85ada81e000000000000000000000000000000000e1a9cea3af1debcf7d6ef6f7b8566b5bb52d5548d4caf85925109228d7c9b50d65a1b24f089631e75a694f8e8dcaf040000000000000000000000000000000010efc1081f079e841eaa5a65cd7c945d4f37acc92c4ace9ae6c69a9a95d8cf569d604376b1c7e63558d022da90d269fd0000000000000000000000000000000010b7f55ffac8d57c89b664c36c20b2988a493de32f5a956c91b16ff67cb806298a59adcde12ead42d598b6ca3e1b94da", + "Name": "matter_g2_multiexp_30", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000017b139e5dddd53433362c49403838b3e2ecdd850a8df12d4dfacc0bb98f79d40966d62dfd0da1e721e7c0f298457d590000000000000000000000000000000000fa35e9c2e37bee1020ed99516174408ba2cf443fed115fe3a964ed86b5e5369e40291dbfbab477e339003ac85eb7405000000000000000000000000000000000e8fb87794860237066ed1b7ae7c2a783c48c52c2267f3e7295d1f17598b96232954e1eb6d6e80e716628f1db8afe48600000000000000000000000000000000083521e3a6d6e3f99570b747498520db5c89092b0077519c8421f9f41772c7a6e177c9cdca52f89a26c6036cadfafa8b32fac970e52778cc90396a5ba92ab98e26499eb1ff17d4bc4c1f78b64887d3f1000000000000000000000000000000000b1415e1dc2d4c1f5619b40e616d258867493d8624857e41d007f82ba8dc53f7ebb36d06f8348b94eedb794899e97df80000000000000000000000000000000001c01656fa47d62b4372361b80ea61501cfda47da5534e3e2aaa27b1e3c4de0bee0aa322e60c476fd4345340e5c00e130000000000000000000000000000000010caa407d9d265721d55f01dcfca52bde851ebd918e8fc4c752a41875940709c64599f36fae5e3ac7f211e1f67890d1c000000000000000000000000000000000b54a86474dd5f410290e4b4ac738fbba5e88c6debec17e38a52090b17ef371dc8feb0573e76c4b61d7688547a89f6a36583bac9672a77f2fe62bea4364aacf62d5e10eb3a757fa0595a81f76543e8630000000000000000000000000000000001649c78147fefa91100738e50034424244d22d8e1bb6a2bf471e4c9b29694a5c9476f4b129912bb09fece53aa87deeb00000000000000000000000000000000117a3e040c1f54b96c2435891a45fb9dd95774b5a55cfb306c22517e4ea72172332d893047f7eaa665fcc58dd21781f400000000000000000000000000000000105e8d80d46e6bab2bb9ce0525cbfc82e8b3320ee4a8b9c0086e21cf2b5895cb35abffedd1b5a9eef21f62a0a1dc48e8000000000000000000000000000000001437ee33abadc8ef6bfeca16c3edcf05480c3dd97db06e396e10d5180472f50074f43f9a031a04dcd11d803462fefadc5a8e1d77c9e42a187054c938a8a5b4bafa834021b727036ed3941b1c1deb9d030000000000000000000000000000000003b51b10efb54dbc2973e001f0bb634e36f689264484eb128de2882d6600a43ad548bc7d1def4541f0ed88a1fb37f3270000000000000000000000000000000009dd80dbfe6663ab04656856f192002593df9ef7f792dfa81f6a51c658c4c9ce5586a5edaffefd507f51ccb7e8c8101500000000000000000000000000000000144160d5ca6b2ad626e6a3424ff5139adadd3319940afa9bff7dc409ac1fc3775d5413ef4612b27fd22c02c1fe57bb86000000000000000000000000000000000e375ff490a626dd1d933a5c751c88cbd61803986fa8dc089ccbdeaa0a922758afbcdc30d29268fe0a34b7b79d0f76c139c02150e4e89b25563985c7802c0c43d00c721d521b54e767c1f509f584bf2b000000000000000000000000000000000997ade20fe9c0d3eb79e61a66a5c272d02af668b0f3c8201a1ea071737f3d2ee3b0764f859480e95be75ab8845b407f0000000000000000000000000000000003215194b6a363d31ece09b18700479e6093fa3472a23ef0133e3dce60a3d56b6fa984b900162c4ad56a6899aacf35c3000000000000000000000000000000001647647bbc399f40124c43510469cf613732d0919e22b478b2603d7553927584cd4b3a407e3ec6387c4a93e9e5373178000000000000000000000000000000000bacc8afdd70e927e21521b3f62264ad4f22adbc872439ff851d3d169a1c79a0d02bca2aabaa0b9941ab1c71d092fac12196ec0e9d2f572856217521fcc5e2869f16d5ec5fe76f7d350698f55ff0c565000000000000000000000000000000000b0c5981bf6ef5b85bbc504fb0196ba442fe87302346688165aa7df8cf2642548760e11daf5b3fe2e37b43379afbfd4a000000000000000000000000000000001086828b9560aaee5e28bcb50db8153c40e632b18c61ed4105bb7f472b6a69ddd8a2836f6605102931ee66b2f07e441f000000000000000000000000000000000f4d7aa3d1a281af6f8afb3d886774f4e4a64490232f63dbe16e3b8c4f626e9d07f7c668d09cadab3c92d6fe852427af000000000000000000000000000000000d92ea3318779b532cd81c9be44b1abb179a8411319a6f8fbd7e3f158bc970917d3e0b25f3f3f6c8e0764011f9bab0398df5017c9c35604f061a7095d976d08bb3570ef8fb518cb606cd39a3060157ab0000000000000000000000000000000000dbd83910f304d0fb2b6d8619c3a308c719f6454a357d9ced03b2882a50692c06cda7f4331f54eb293ed5aa079121fb00000000000000000000000000000000019c33ec829367dfd2610ccef9842ffaa5e4f35809657c22134fb09b024e07949d8370ba8ba1e9149060e9bd3babc19c000000000000000000000000000000000ac468b42925d2daacb8574d40064d393caa643f08767d20e72ac0fad1447a64d8743523312f3a91a118d3e51e1f52d7000000000000000000000000000000000202d1971fef2938cfd10bef5900b91cc4811939f66f1f5578a8ae0eacb2538d2a51c1e025449e1637b5173ab7fa3b6f7b82e7e565f8a521d1a9d0ecafc029f76b70042e1ec36c20e3789b49c7e50ef00000000000000000000000000000000008b6709123b9bd501360fa463dd08076c59177dc0e8035c49fa2f541eef3831e4c584c5a9410c68999dddda6c86fd9d5000000000000000000000000000000000fb94eb34355c636dca909cfa71f52471217b9bc241cd3e98907d4a5c7eb67d5bc9cdb0c73c1369d7950a014fe6069fc0000000000000000000000000000000002e2ee515a5dc96a664bb1f862f21a8d3b7f903fb87f6dac41c3541f3d83633f351ba8dc4661607d24b912dd1ab097da0000000000000000000000000000000008bee545e00e3fc283185a85511e09fd0253e191f52d5c0b440b10228041800c013db3c9322a835e4927c0ae0b21bc1e8260c1b7a249ba215f0dc127a41876f858b20f4422140bb7695c8f98e4c474d00000000000000000000000000000000006ba635e74538748c29aa7c5690a0530f2b1970554598a432d4ea6d2713a4d26786b6e80f67b2f39e218b19323654ea200000000000000000000000000000000133ca9e5e0d4a8200d3522d8e87dec3c72edc1cf16b7305af4abd466aa7a0e30159388d34c36ea030450ef45b7940ec20000000000000000000000000000000004724239afc773688ea92296bae8845f20793c05807a18d6f35f03bef295da06f8ac9dff438b720dbea7ea93f3ea9c4500000000000000000000000000000000149c12922fd69e1960274a8b91384e929fb354936c020911495e6e3c49faf16899ec0c6e87713ee2f0149bf808ac8abfcd68d2b074d038ee0d9887168dc16805ed55df26329a4c0e062c2124a6e5066700000000000000000000000000000000148a4fe6ca67b6c785d5d8a784d5e68fcd2bd08294ca37f296b6426433b805507b554eb9f0fadfa9d293e8cdb8547d4c0000000000000000000000000000000003700600c2b7bfea54801ac95ff7a2c069bace31ceadab2947a0641462089fb43f0b9697acc005a23007a923ffe97360000000000000000000000000000000001705a769ce3c9a7a91283e4068c602d85808980d6fb457345a5f9b2499ff8fb3ec8383049b9b7cae96bd2ac6106a07fd00000000000000000000000000000000052b1f4e8a48a5eb2b2580614c656393819b4f0ffea874be899e4964c7e32d54757f2d48ca7b50e47e8bf6d6ab8ee7572a40c2e796148ed1c539b0584b90cb386844fdcde5d3766cbfb1d1b58626fcd10000000000000000000000000000000012ff8ba50d587765e68f95d276e364c8c40c00b55abc929f9ec240985269eb096dd3cef5826cf6269ecf54bc67773510000000000000000000000000000000000959492d74cb34c8c9ca4a21ddee97df99c8a6e627db3ef72200f39e0402d56f0a9709596189c80aa3aa50793e0f1a68000000000000000000000000000000000f7e5dbe884597054d6dc5e80bf4d0d333025bddebc1fdb1d61482cf15bcb4c8a95ea29cdd0925b5b816cc0bb307387200000000000000000000000000000000194e940c041d71f43ffaa51fbb31eb63c23559069b42dbf8777f35eddf14edbc3f7762c7b354174a584507ad714948234a1e176fb26983e549aefff9aeb220f50e071222073422dc2c44abd85528ee2800000000000000000000000000000000101a8e54d1fc2357df60b0ef8872b729295218f29ff63f7a7b6a70b3ecdbfc6809eaa8dc1f62a664b9987e8e86154c6c0000000000000000000000000000000015b5ddd012b42e1a600d738e05b551d91e7fcf3cb36018ceda9b689b92022224990c11a6fa0b421d5610b7e59b7463c30000000000000000000000000000000016130be17fceab55387d43179cd943c85ce1ff1881c07c937b2cc0645ec9ebaf0e10718ec7fe0d720f49bed2b8caf15b0000000000000000000000000000000017d73650680856bc11619e6acc139e137f0a06476f5f8979b5ba7fb8123d85916915da60d1f2e8c84197eef518b350c2a62e07bb97ca3805ba2d30f39f44e70a7b2917889c26b84bac8f9739bdf764090000000000000000000000000000000007d26bf37a97d532ec93a3eac00d9d39b064ecd172ebd5e18228b1601eb7a2c272aff9d88d63781b4a587c2c8582eec4000000000000000000000000000000000108000e850bfbfb02d7acef97592e15ca721334eb51197511b0eb2bd3bb647fc8f07713487b0a0bedbafb106992de4b000000000000000000000000000000001868c0b2ba732731f7536851f8005e8bae7b16545b39190251eb2bf93dedbf0803a42ec24cebd151998b690c38c0346c0000000000000000000000000000000016faafe909a1f926333b12f5463231a71058aec31d73893687d3169c4c3588436f6178447eed307b642490199c507d63a14278fe7a08174660c08323de272b2110047a1d1d8bd0e3c7d76dde030e00a6000000000000000000000000000000000331338cbaeb8e304fbb9257bb80aff5d3e043d07dbc476dec2795347e4c25248caad06ad14f56183d2b6276c49ff98700000000000000000000000000000000167e9578304a1162de73914b02791468e14faa2e0f161aa57818b8a169b5933dfcab787ec0f4b23737011163dcaa02750000000000000000000000000000000010aadfd5cc781e73c31f2fb64e7981b2e28614aa18dc7b2d96d2bb4ed8c2ee9089d6ebe0cf85479b272cb049e934739900000000000000000000000000000000128d7ea54f338064cd2f041f42a1a1e77d8b9be4ee55f568786a36f87f965d8142207e518798061eb3e32fe3b0f1541d1f516ab5b36a59e6300a54d17363ffebba35fa0c64cadb21e541af5078545b400000000000000000000000000000000004539f22654b3182d4fda5ab8d4bce6f1268d4e402b6c29a4cdff3b5abe0618d33db55ccd1ff12b27b2cb0196ac53e0600000000000000000000000000000000177e80ab6aa8512cc9e4d65b06b2bd76e33bef9038cdc1ab97fbb9d896ae2ad884ea16407490653dbe972b14e9c30c0b000000000000000000000000000000000c280a4431e41df6515979a694ce292f220278178f7f36e23c8a4cb2b8a7ebc520901ebe34c72a26b2c8a60aa1a155100000000000000000000000000000000006a0b80538a6c8093f3655905af1c59c235567d22192758c28dad1b715045189a412e4c1edc26e1d8ac95a584277709b3bcdb23f9568e409271b5f907fd64b0cd81939a52a6db38fd8d95de76213f7b5000000000000000000000000000000000eb091007672a212dc4937b314576963d7561657cf1103820ce9bc34e4d46c24f4891a4a4ada648f8cdd2c30f670b86200000000000000000000000000000000166389a37e6e3c02317d68d54f29cc98d1d1df5853940555161d71df791cd92c483eaad87dc0e765b12408d6ac344f31000000000000000000000000000000000affd0d5734cbc27b192c0c0e464db48d3d76799d2c6a493b172127ef2df6ea18a33898828effeeaceb7a203e35ca41800000000000000000000000000000000155708b9756752c9b44048c91d71970fd2cf2a4cae6b0baec00629c81387c8261150e78f856093d81e816be6403f1ee91b716b02b3e94600867e019be166f4532d264e0aa65d723dc0e117aded59245d", + "Expected": "0000000000000000000000000000000007ceeb14945414d96088a7900c1120ff182b2a93b09943c2fd1dc2b0b223f684b0d4c0b1b5803502582f2daf16d81d2d0000000000000000000000000000000008df450fb25534fdc456a8f41cc143a84729ccb082aaa2243c8f37e34a6670f5195750f8547444c49f7a898aa8567d980000000000000000000000000000000008c12d360078d5645b0e095c90d4fd37eb20f0ebbc6fa93fa5beda7e7c78eecc06e0d839268e2c303422ab1769402e0b0000000000000000000000000000000002bd594a21153d7c458b9f804050d05caf2d90bbf9d18def79eb8148b7f89e3a3ac21f84b87fd13c39df5b91cf73460d", + "Name": "matter_g2_multiexp_31", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000003e06e2dcfbd695e9bda0baee1276ceab637fd1fbe2d2d6458c923c35b00edc7edf4f9e797aea59ff8cfceada0615a02000000000000000000000000000000000a04a2ed5e42fac7f064b43d64151a6c517ecf22dbc7563a3e9f35f555a9992fe45cf6a728ba94607df7c96f7e0a334b00000000000000000000000000000000090fac97f9f524168bc930d26ea1627ceaf187398d6bfc5a019c8467d75cd31a41c7eb9fda35fc85bd92b4cfca92dbff000000000000000000000000000000000f37b91dc935c28668c27d38328a511148c1739b65f2816dc53e42a8f059c9b2be7417a6f97c9a2597b1a0f06b7afc65bcfdf0495e49dbb8a8f9a0dc517351f39a6d823dcd42715f329dc78400bd74fc00000000000000000000000000000000090b834a587521729426d5b134c6058bf7999f4d4bcc0812e8d8b3ebb050961321b5e93356e87171a6f12160749394ee000000000000000000000000000000000cd5148c7eeac4aaea4288b38a02b5a901a6e2805e2b1695ed98ed86cfa0d259d87b65bf3cc9d00b8548100a60a371d200000000000000000000000000000000026db1079b85411dea0b9fca383956af50b938a465f35347605c01f3b72b297630ee2fb5252da20ee0d8ba5071974ed70000000000000000000000000000000012ae26c193e02d7ae4a7a01181551085dec9fbcac811c45d5cef19abf736ca2514e1259811970af5913891abe22a75ecf095238bcee61ec1317c0f98ad4f8f9b39c5940cf37a8a3a676787d9dda99438000000000000000000000000000000000ed5d8a609aa4f3c65a89b8dbc9334bd3cec6c7763bff298acd6c260e4d3bec0088e15c5d82618571d13b74a2031eff1000000000000000000000000000000000c28f92f018e6f822912b6eccfab37432ab0ab9acab751f848401791bd2f16e32ac6d97948bd8a0bed2ddc1917f0db3b0000000000000000000000000000000014083be2539d914883172cdc70950512dfe7be8893b1ecf085d837c2e9ba7f03656c5a0e15373e04d300869620eb66d00000000000000000000000000000000002561b77cc2658c54d29f8d1988dd7448f59c80c02ee9256404d8ef5536ee50104cbc11b6ee1ab9ccbf0ca55e53c52aae45a6d64cac817cd479a501c77b6720c6777c6026dbee471b490fee9f242a6700000000000000000000000000000000000fff05aea33a9d1e8f7b227c80ae87c9e7589ba2804904b7d8386b24b0e5324e718f29531251969a972870a30c310630000000000000000000000000000000016ecb8f27a369df13e122c981e7ae37882b36d5492fccbc86d606aa1198f3e4ee7bb7ad0555e11949e6c1783d8f4cda100000000000000000000000000000000187f425b675cb12719a01ee3b78ea73d88f70805f72d6cabef6372ccb9d99008bdd7da54f155454c4c59f041deec86f800000000000000000000000000000000151c272d5cb67b3f801e103ee901deb4b3d3bef76ee4e1b2ce1b5e663ed292845ba012c732d38f9209f82e77f1f73cf354868215022673de608cb43a3cb74ef2073ffff34c54fbb43f19b22a02bcc2ad000000000000000000000000000000001791bd59815309f2aeb7b07df8afd89a288eb6f19c7e613f394353ac5398267e1388c97b17d83104446e57f94581a79c00000000000000000000000000000000154cc72ada5a9c99dea06ebec143a14271cf332b57c631725ab30e2d308d6b688ca08a79efb6fce632cb1216ac3d077e0000000000000000000000000000000012b4c6fe8c17274ef57539563a736c2f83c4cb473e9d075a976e18e193255057340f45de373c7d6e3fe5e08ad0dd97d20000000000000000000000000000000005aef16e11bd4e7787bd5ab4427276ecdf9c6c134b9fdb2ec39e87ae4a5b3b674b5ceee29bcdf804ebd7e83960d8d7ef7068c3ba82e52fce0223a9f28c1d42681c7863c94797d1786c1adbc3e6d10dbb0000000000000000000000000000000008e57f905fa202c7640500746b590791cf9d0f160a77e5eaa5a30280e513e8e801c4b6b04cc3f80d9403388571d180ba000000000000000000000000000000000da3c128ae234bc27824062832ac10aa9cd4978f37855a8b4cde3822f5b485fddb9a475a9805e795519d7f138a8199cf0000000000000000000000000000000000ec11b7e07710161fc557a56e04337f71aaa1a0f070cd84525965e53a1fe445c91ac07c618ec349997890ae893c165d000000000000000000000000000000000406b0eafbb8782d11f5dae2f6214282252af9ae9ebc5c17a81d4ddded40f05d0b534d14019bcb6cf4e49c4c182b90f00042b8005283c7b91ef4b3ff7e20a91349c8c3d1301c9b54b901e8348a7d186e000000000000000000000000000000000b1d456e66671dfa72ef3a56523eb939146226111fdbbeb697983928aebd5f50b0518db841a3d48912a7a780785c1f180000000000000000000000000000000007a15b2253496b78d270dd55b80bff90583a95283a89d40f6df71fadce56d103f0d365fe79256fa4f93b2d2bf4c06a2e0000000000000000000000000000000010829223166d38fd2c3041dd5643c9784da366a2ea8cbb3abdffb5fe43e975318c86de0ac9ec77c0126ee75bd209f7300000000000000000000000000000000004b124018e83e1e5e77bad42eb831798d450f8ff4a79c9b14f67f080047c491fbba45db79b2cf6015188f9fa6329e8be0a3eb64ce8fe140d94956b0685f91a5462dba1a90093e803dc617559a66d20da0000000000000000000000000000000011119be42b90c7857079a51695dd5be08e59374b0d1c7e12d0ffe870202e1f0c62bff84c9691679a82e610e788b7b5e1000000000000000000000000000000000c7a64524c5dd1bf10d16da7f15b39d05c9ee1620d4dcae79c60316a1f522b238e7934d1be897a441d0c8e621b67d44c0000000000000000000000000000000013045613a090d05d07310865d977c8e0bb1caa713b2249d6676e7cfd6f4e3ba8e667deabf9fdf7fd527685f7d251b178000000000000000000000000000000000dfee7f8259701b5726b6439a7ce77b92245499906502c7dfb384e29cafea61f3b1f21fcd7888231569ebf29d3035a61ec88ed0eac8d0f2f618530e91cdb9ea36b8d56c1001a6792a09e11ff65fc02aa0000000000000000000000000000000006d77669207bb2d064824cb56fc786c631936d30db630be3c08e18d7e95b1c26e2d4e7b2eddc2f946fba6e99acb2198a00000000000000000000000000000000168bd8f291f8bcdf8b5e9fa915f7f24856a62803bbbeb9bc38384149008d4e3129338035061631f1fbaceeccfaeef4a700000000000000000000000000000000146bf2dedc262557dec2b4545c94a37434e20e4900b1693e8fa9bda9a94dbd07e0a3bee5f3bedfa42148791f4951db7500000000000000000000000000000000138467700fd5088c76af2f77fea4b746f98701fc0578571997b0ac2fc343354ddc8b2dc57d5298dd4daf767573d8bd3d5f03e53ff983fe4886a3dfc03a353fb77927d7a0d1998a1c55ca7421a4bdac6f000000000000000000000000000000001536da0df7c91687339fc93608eb404c5f46adf4b9122b99b1e5cee0012e27ddf30934d8f669bd39091f8673aa3b3c490000000000000000000000000000000002deaa8f9349e7c551e39751b1454a00f8f7896d63110e8e42607e8023ae3070c4abc9885ed54ee37a82f6e5c68451e900000000000000000000000000000000079a62eb17f7b07d4117956d3dab5d16a7f90e98948d5c3caa124fcf755c73f060a90d002cf880f5246a87342717b4dd0000000000000000000000000000000001246f0f3ec2af7c0250ae14cc67b5a1d42309f06c6f47b89178ff7534c47e8413a26a43f27454c0f946c66634563d41cc1b04dc356bd348211ccc4c50d12cb382660a4f9526539c2a0c52b021ed216500000000000000000000000000000000046e4a08785de985c66c7417f9262d363b9acee07e250999a4a7124f101ec4d82e3e4b2b0d9736471329fd61d0cff13b0000000000000000000000000000000017bf1e20ac181780ced62a18c78b378fc0dad157cf30d6026680560b681f5755183bd30b4e454764c08edb93297590b5000000000000000000000000000000000a57cbe93254bb0796eafc0a57330e38bfca37f8b94c4d21ba656e5616239e1e18ba6d632c0129d30291736fe37a4ac90000000000000000000000000000000007f31df7dbe9abe15f4024d8f6bed93c92ff5bfbd7835e08e870eb1bc4a6f62b3809b922c6d5a7350e2e5a978c80a67397b584ee05c27d45390aba36772ed49d571837567e95f1fd3ba3fc1ba5916727000000000000000000000000000000001577abdf6e915c9c3b3fa50a4601709cd629397f2f91784528e4cdbb140065fc2a6ee3830983dcfd49a928e78cf530aa000000000000000000000000000000000d6f98df9e41009837cbb05bc3e3340d38e56a448fe396bd48acf03f061e7489d1402b36a84b3c56eb859437e9c406f1000000000000000000000000000000001912afae5361c3d8c6141755deeef26d1fadf6b0036b9d05b2e0c4d50f42328741f0423ac772fc66dbc922bd4a837ac40000000000000000000000000000000000616661f049b5c784ba05334b2931509e1e033bd203fe17f04cfe12e80e73eb7075beac9d379fc1c457bea1b6adf365752542cd551cafc5d50852526ba0a23d274317e1e4a6e75c0d19319e5853b8b6000000000000000000000000000000000f98fed7e4d67a513c746d2fb188597a605165d5d299072aad6d621e077845f93804d575a5796bfa726f529dbd90e014000000000000000000000000000000000adb2d0b6c02e4e8fcab11c7c8819e87f73aab673ff9dbc5c50fee751bc7a6a8d386c8f9fa830b5545f94a73ce6e1f1f000000000000000000000000000000000f08e05ac40655cf59ee3ea9f10fc900315c6f06ffd3b80853560559f580ecdd65aba5ba660c729e0bb9576eee3703710000000000000000000000000000000009da46469f4b8fcd8d2b016e96f6e6582fb01c75407c36c7f87b4a1cd8f08ad06e962a0ec2138ed6fabaa1cb0115f97e2f76a0fa585828f79553fbf3baac6a2776b782de66dedd6b734f9342e734ee3000000000000000000000000000000000047b45ad2ad4f7b5b72194f98b98b2150b5d73a9df2aeb2377beed9a1275a882fa2d849037ddb56af632489f892a48a7000000000000000000000000000000000e1b0d9b52c0c5324067857ba4701f5f20eec165be418871fc0f0adbc3a0bbdce5a33277a33b79013109b81e006c621400000000000000000000000000000000179c471e01e340d8e6fc0f737ec09f0180bd2dd2a86d0817f753d1e9a9f8cb18178e9de68c596dc6a824e6c3c151d8b80000000000000000000000000000000019405c1e571a9b200ff2949aa74647dae59d92a8669d4876ba23f1b4a12a1f9412412503c68acbd619cae3ff056bd346f638e6a70917c89811851109296a7225f9c7c5b3d7fe6d6ba6c7d1ee77db4458000000000000000000000000000000000ca8566b9bd088c471fd33fb7b1bf760ee12cc8b0cfa9ad92b45012cafef5c0772d9bd3bd9b266d6c3e3890c8f00057300000000000000000000000000000000055789839e786ecee7fb7d10f3876359fcc1bd6f2c5cf25c8337aff7fdeec9b43ffbe932cc4936bb708571a59e4339990000000000000000000000000000000013cf827bd57d8179d105f34c147665a072714ccbc114aa4e878d04ce66ca78bdabdc4867b3968c75dead147257197c6a0000000000000000000000000000000014a8dc5ac1858442ca627eaa194e1ba64091b5f9ace551338d770c92fb49ee12449dc200c8c35d70f9e0652b4d9b90da1c4ac944341dc68fee586d221db2a8167e833f18f012afa7c3844def6dfb26bc000000000000000000000000000000001124ea2b97a6d73c81387a51e814b9bdc951a773db2a32d50691be60f1d397cd4aadd9b06e4f49c32b12254e9f824fe80000000000000000000000000000000014cb365e9780feeeff3548f34a56548302ae0dc73402c40317fc819969ee9c4ea2a181381b94f82dd97a236671b456a000000000000000000000000000000000064b769c4b785d45472038aeeebd3ba9b28b3132d72023640ab2d7512cc6e31296c5330be5653ad6902e4e15e57e2c3e0000000000000000000000000000000014c7bfb1f142d69c17f73e23011aee0063a97a99d982d25ff72791a65c7a68941a80fc216cea8a49f3df2d0748b1f95db0eedaee9347b10ab7b346fbc16c10cc9db486f561f88b756c269ebbba23a7f4", + "Expected": "000000000000000000000000000000000fb1227806c750e0eec0b865daaaf51afb74a88589d1c035c60dc1913f05c8ab18de24903ea876fda27b97a5eaa2fd7c0000000000000000000000000000000019903e1341f0285658164f9273b5c958060bf836264502b9dc298f75d4104d7a43b8d5dc0bb934a506ce1273ba839d830000000000000000000000000000000006e791347b54057195189e8b9f10fd42d170f37d455c0af5e92cc6a12e2c23990253be6855f4be6c84a708852c19a6f90000000000000000000000000000000005b72c361dca430fb2414b9d5a326cef8b77cfe5310153d6994dc1f8b9e74e8fbb43079e21956f428ed8aa48d6897e32", + "Name": "matter_g2_multiexp_32", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000052acff88605f33a0cf1201e8101c95ca0befd443c087265821a7d954917a026d41ab24d29bdfd972bb52ff4ad6de14c000000000000000000000000000000000e134b2aac3f6270e43afd994302426796b1e362031638fe0263c0ec212b828a30d8321af34ef7bf260652150cf2293b000000000000000000000000000000000d6628f675008099e9a75e1294803e86417ab22670d36316798680289ae61a26821693f2f9efc8468721a1097c3bceb20000000000000000000000000000000006d66ffad1a2e0f39488fd3f6e0214c9407528c8bfb8d1ebe6d75596a3e3cc844d00fdf46ce7ff6cd6d67732874a24a484adc8cfd2e42abc2f0e0d7e9c4b378f73731905760bfeeef01c94f8d5c3cacd000000000000000000000000000000001160bf0f7f2915cfc64e12a5a91b7e2aac78d4c2ce362e7677dd0e9c0172b37fd1b52222a13c65819b87593ee32a9ba6000000000000000000000000000000000c8be2cbbd302b31b1ab6dcbeb57b4ad428447bca9159fdfd007f5375218d121673a010f2c7fdf83fb45883458fb068e000000000000000000000000000000000363d3d492e6e6901756bac13b5c32d55aabbedde878115aa41b57d27b49a0f017a61fc90b13a20e009989374b82f5dd0000000000000000000000000000000009302fc26e6d750ff9441d7471903cc296b320128de71f86c4eacc80ce0725e8eea6acd2af056abde2f61e0a349f9bb5bbd5d4a15998d733326ce23cced86ec5d5b410c29ee98a4de19f2662c3933dd1000000000000000000000000000000000b12aca17efc103cad500b3d773e43cb24df6be651963c0f30bca489f1dd7911ffc7204fcaa4511e161c6f75da4a5ff600000000000000000000000000000000179a36e9292d3f78a5fecbec1175f001bd4ac0ff3610f596aacdba29a12ea4844885a7c465e66d3883c7fc99d4a7e06a0000000000000000000000000000000016bfd0758b31f54f90eb8562bb693c45a92a297a3d302279c9e3cb8263efc0f31579a3af8e8f5a091d9a6a36776f445d00000000000000000000000000000000020f6c66fa554a5cb610ab05d194e7583e6798a113b8fff336c986f7358bb9fa6a7aab0b04be9b5c44a6fcfdd21999e83717aadf16301a9c8741d65c86ad7f849101e30b7b1a344643b100a8582a6ad10000000000000000000000000000000004bf40c1d2d3574ad7fe128ee376364591b6f647f939b0b556ac3fdb5a92873f17c007e926b8a39a97c814728f355bfa000000000000000000000000000000000b8669e10e0a538a421b717287455620b82574b96ed09f64db444ec73a67a3227503e1b4fd6869314214071399eeae0b0000000000000000000000000000000006ddea4adb703d7205b6d2af436b41b4bde3a8c5dbed9dd161c9b3b466ebf06beced64fca25c3bbb97f232315daa5565000000000000000000000000000000000d97248a25ddf0ebd0200c6abbcac9ecd9775cfc5ec8da91634e77488bb592e5ff277a9607fe721990f403dd73f746e622788b3597da7b9b106203dd0ea97527aa8f5149754bbb0c10bb6eca8a46d94000000000000000000000000000000000135bc4f28663a6d7d995f6b876ffb8e6ef1d2d0f232388aa5f390c57e8c48cb84d370ebc4bc267eae4466a019c9ed56e0000000000000000000000000000000008b6a9d13dd9d7014df6acb59f80b335a751fa2ba4dce63467aed18f68358f5cb743718112b3cb2d0b5add34bb6989000000000000000000000000000000000013a5389dba4da195f34fbe798b254403f0bc5632ed98bd6017ef24fff33640ae493c1bb7a77a0d3c97649230e455eb51000000000000000000000000000000000a69803a4cc237ddfebc51df2d90fa1ad03359f9635ac1646bc942546575d1558f5f2c3010f6e2207849ee697be41d093c21276fc1371060c226424eb9886de6897b15b075fc5a51aab4710e9dddd384000000000000000000000000000000001939c2431f8ac4ab19d2735f122c0424af2ef18c0028e155611237e86648bf1d74fcba3008f5c6aa30feb5d4a14a3f3f00000000000000000000000000000000174473eedb54aafc522973244ec2feb3f7e95e50a1e996d1100c8da4fa59428c280f76e9e7364906662c4d2802235aa5000000000000000000000000000000001021d15f8ae2f62dfd3862944bf3be88d86d8113f4be22544ae5e925d450044279c5bfa1bfca44cd5934b42a27096b510000000000000000000000000000000015e0f20efae92e1fe8dea2222ce808a7de9e9e861c333db139f8ac11d7c4fa9ae6e49f51095f6e16bc738dc6d094b4cfccbce4e92cf377f67244995badc72db0b80fe37c9b7d443595156fa41abea17a0000000000000000000000000000000012d70691721f5787ea2e2a652f9c65edaf763637f95c285a62d32dded18579b7257493e01eda19631d00ecdd4e27a9ff0000000000000000000000000000000014da9ef6076e646e7d5b52d1803d3a6d897664851c6de2a9b330e48695737e05f0369224c3eb357bf557625bb94e6ea2000000000000000000000000000000001554f68124a91be5b9f325394db23ed5db8f6c46eb46cb50e57947bae00819b151afbf4ab4949290ad41625499f42dc00000000000000000000000000000000009fc0d459e28cd1239d227e1d2f7d530b9d14ce5638cd308569300a791c997a51dd5a98aad703239a23cfe7cef7f47f6ff79345f31c107841ae388f6cf116d10bc696aec4933de56bb9affe7e20c649f000000000000000000000000000000000452580d6a37a07038ce3564a12c1c7391fdb002cf27a6df7e194b38f3c12a3026f2a8acfe5e634cf89140da256d0a420000000000000000000000000000000004b73c9a4f9d41b8b84e53de538e4b15198f50247e75c274c14f136d7d91dce4a62c5346bf11a105f035e29ccac3dbb70000000000000000000000000000000008a8a3b2705a82b551f8913853f682253e7f1f68c8e42f349337f4f1eaa5103f59430af0c4a124b6a739bf88298c5f6f0000000000000000000000000000000012f4220609899e8610809bb3a4da46e0688c285ba2e8750b4bf44a849cf15fbf5c016e8e8f9372239bb562e7f38916e921cf773387d5351aeab99971eaa3b207fa6a318ad60f1c3e16b7f68251f9c910000000000000000000000000000000001884558e709635c046bd6ea8872bda936ba4d5ebcf7a0208cd0a4ee08b69f36dd2e136ce655ddfd89a5b1cf8e48f5ef7000000000000000000000000000000001357e2dd9fb603e5190d7b7ee105668bca2ed23ec6a248aa71aa430c2b2755747b8dfa3b147eb51ea644bf0354a61ba000000000000000000000000000000000009b0b0a76c6980e62e4893157b85f59345e1ac81e1aad1e48acec44c4803e2a9080f0d193fb799e0277ae6f1058839e0000000000000000000000000000000014c984ae4ef5d9d319fc89895f34a7db02747f57b206b0b30e8c9757d4b47419e6c0c8378fdec5aba364936a3b1922ca2d69cfed6bb2d33fedcbd215dd4e9632a3cf86a4b2716406305f6a85e6090a050000000000000000000000000000000003e1bbb872db172a1fa615155f81aa75ee9760f8602e4135ef9f1640b7f9d54bda911a220d211dc4bb767bc2b5e6e23e0000000000000000000000000000000008464f23cf693b1d4545b6ce4aecdc8fd182cfb288c5ddb1f78ca578e9b16342c8178d886cbb6b8086c0fd1318c4ae09000000000000000000000000000000000af574c4d0fd86087e23daf6d9ce98765e1e445ef9152dbd68152fa4833ada0be440de4abfe7c07dbd4ee67f1a4aec9a000000000000000000000000000000000a8227b982f9286b03c4d49766687622206213d88cde007360df9b4ca5916c44ce44dbe6443577998b4b0d527d22593379cabae288f8a9a8cd54523c20825b8fb07886bbf0ba0c5c807956f268af4fa10000000000000000000000000000000012e31070a501a7df7be43dc23e23dafa32ebfbc10ffb4c53f5d36bab2af69db5a05ad64b9ed116560e40b71f9217189b0000000000000000000000000000000011cbcd38ec3c6a6d49df6a8d6e1029a0412b42bd3fe8b42ed625adeb5a2f631e97bfad302de82ae34f715962b5ba0289000000000000000000000000000000001019b1b619fde9fb885d3c5f03a4373358107af7509754ce1ab2deb67df536d05e07ca7d60d927c15b549502750054f90000000000000000000000000000000018f1768b7140484105cf3ad2daa7c565e18eaba834db3f6bdfc9ee37445f2d6f7dc2b4c986b7efd5373224d2c92aa5a81973977d8e8c592f9063c5a14a658990f9c3405643089eb58324cd3f05b5b5e4000000000000000000000000000000001847b14146cfa2e1700f368f414b6a66ccaa02ca2a90b40a8e2be2ee4eb66af77ba563d7507de63362fb18426b6149610000000000000000000000000000000005c028d2b344ccb6400b53134bd179028b8774000ace89369bc655bb9dcd1643aaeec830407ee941df5432ba27987e8f000000000000000000000000000000000c4a680e2157dbdb53ae761209d505b4cf6b18fef5aff1c5009ab41295e0ce2ca23bd7a4f983fb9d085e1d0dbc75ffe40000000000000000000000000000000013c0cc77a5d771f1df99d1530e65ba782604c1ecf67d08572609de9f18405b9b817c2643226cdc7c9ad35beebf87dab0a610bfd375a7b8d0b034c17c8fa27d4366b06c681131fa7daaeeeb08e25c2ca60000000000000000000000000000000009f32f2f83c21875963818872d243cc8c70b75234f53490eccffbf060cb3b9c53545c1c32025b271514f500b20b00ec10000000000000000000000000000000002491b571087a9e89dbdd039ccd2c37d5d8d25587495b2d7b0066e9dcca02d44b2c134b0128a9a1527396729f069df83000000000000000000000000000000000264e9c47f72b639597de8f26a42ca7d77324f8c0db705986fc3b40dfb46f47764b69c70037a68d76a5de49a278779a100000000000000000000000000000000090614b3bb302ed9fb78b8756524fb78d54a4390b27136087181342571f994b1a93faee28256d765a8ff4f448cc357c199ffe1dc2d7526338462860501d75380a5ed9d53e675125342afb6652a97437b0000000000000000000000000000000012c716ddf17fca0d974e8d6003d99aa90f06b201fd141c74d8fdf1167030d14dc732917d3c6f736c68fbde9df50c098a0000000000000000000000000000000000261ef2b47de8e1576aecc6e19ececf80ddc1f4e28b2ff27953a65199f65a6211db7326632cfe04d543895c727ef8b600000000000000000000000000000000044fd6b9b4a1bacb8b7d4c53c106b025ae78f17c3baebbccca4e18cfbdbcbf8b3ef88ed5bd9bb36d9aea9e24f4117e760000000000000000000000000000000007721612515fd075811ee804314acec9d389900c7ef883e866f71fba00c49d5c4dcc7a2b8e2366f5a93f4577926ed171fdd97465982b58e69993711a6a64134bc4e76b88ba1948af91ba3339e9b9d3e900000000000000000000000000000000122581659ab1712afc23c23c2986394de8e155bcf722e944ec05e7e42e05acc366d9a7abf2136b5dc68a8dcfd4a640bf000000000000000000000000000000000188842cf4ef54cf77c145acb685d3187cd9c842ba6705bfed846ace83dc4400c45120fc1d6a633ea879840d3d0c902f0000000000000000000000000000000005c8966862ed4458a753155ffe2c64655779860149641ee5511a46ec576798fdb5cd9521528df77bfebcdaae2f94b865000000000000000000000000000000000cc10d888d2b7a97666de99ac14a501b7e2171f074d30d947efd67d85226c312a7977cf923ddbc88c533f08a99f2045f786a2a3974c84752b32f29707805c71992d5d473f4b7bc1f0757d126607a1c07000000000000000000000000000000000e5af1420546c1a5a0e0c2bd9241bb7c7a26dd52f4f358fc868bea457a60bd4f6bc5b60b27069fb4f6760813a91ada740000000000000000000000000000000017426a65d239b1d9505bef2b476799c394fcc7bfdca36a1ee5a600351334dadc238b64cf8a667a25d4880a31b73c53a9000000000000000000000000000000000f151587944aad17429b51b1c16193c1e1c93cb412538d1475473666c997e012ce618eb841c4e9e064a08ab83d7fa60e0000000000000000000000000000000015c2e049c532db585807319c23ec077a51f288fcffb2cb6528d3697221e8542e3fc85d18b079ea1b217fae30858a36f285d33a7fbe6ac6eb42eb932dfbbca2f771ffad5e80fde686e5df9d34e9f83ad6", + "Expected": "000000000000000000000000000000000c9be91da9bd8774f18efa3ae9248e4b03d11c49b377c372613b7e745882b2b23c49d518672e58eabd4d9b510a25d8fa0000000000000000000000000000000019687b9eaf5d68b0e795cd57055a74e44efb3e997cb038b7f1cbf08ca70e80a1655cdb04402c542a92ae4e435c22d0b90000000000000000000000000000000010aa1514402ce348d1d61b8d38b53017cd3977a84dc14445db64799cfe822b56a0adbfc5332093ce7ea1f0f438bf15590000000000000000000000000000000019ade30ba0faffcaede95aa272be042aef090f89d9ca25cb825846c4bf9e4c1dc575f8968c88ada51fac71f26fb01517", + "Name": "matter_g2_multiexp_33", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000a1346771f8ba25fc44323d5290068e46b3f756de6d97aa934d511979a1486bc32173575639a7e54aea8eeb60f32a8c3000000000000000000000000000000001958ae7fce87db47a65a03402313b99f659ae02e8b62db3525d48dc9075aacc5e5abb50156e704701f3ceb18747e0431000000000000000000000000000000000f98778311e28b4081aa76a3f9546b94c29d86fe8e66b905265d74ee21928dc3ac463049f70d355d8caee5b59d65e07300000000000000000000000000000000185cc233ce72770ae26406476c1779858523e7c940d69adf2750695cb12440440686b6b918f4adb3b14aee9aceb6422119582dfd9cb80d44c17c5f62360e62f6736d186194f0f8483e34d8d18d832d37000000000000000000000000000000000ae2f565a44c8e07f2a136368798a44926cffd3c3a6d4c2fbf91763c20d2bd959271343b80eccec4d59a84394c7a3ce70000000000000000000000000000000009481a5fb276c938801133adf10dde3e7da2087d0bcecd3c9435b7de544271eb3b07a69efe7e168869e727868f24b0d90000000000000000000000000000000011774e0197866b1c8b3428d353d2c9f6326a77ab30d5595e2402a0486f03ca6ebb1e8dd335a60a772dfdd9a3dbdd3eeb0000000000000000000000000000000011ed2480d79f73a67a2adaa6da3ae4f1e1c28feaf0e4cb9aafac658901960129e40f6415ec80a31d72004899326f714bac0bd9b8746fd02aa70d8b8a2b5d3be46baecf9449d8cd3d620cf9efb3c615d1000000000000000000000000000000000a73b0d8c31af2deed481faec54095875639233bb09f31b1c7c745cb54778d1c8bd0a230e963ddd2ec8d178d31fc14740000000000000000000000000000000015a889b16be93d0b6dced01f5e2278ffde1cef0576d0b04b49996cc5252854f879e04b1ffeb90e222f4b9d5fa350767c000000000000000000000000000000000b53dc4d72e90330ffad17012bc7dd2e497cf8aa6ec73bf25c10427e23fd28137631249eabe9d0308c956dc7a9e92047000000000000000000000000000000000930cdc5d04ed2d1eb62937d9f72fdd733c07a5a0e392fd5216100216b1a2e3cde7053bf766f046cc470d92bebaf6290069d889881d5bb87dd65a9a02a7fe239bdb55ee54a6310bc987e7c5772404d7d00000000000000000000000000000000131c4e590400b69b3657f7c67272b1e3491983997993ee87c94043001d78e605965abf3c1a8c8c39cc08d5a5ef05520000000000000000000000000000000000124f71c136dbb032504da910958e8a7949f1dc5c061f21d50e439e01e67919891633b3bb84fa8a54c69b632f78560ca70000000000000000000000000000000014a4b1a05f1060853f4294e669a20b91f939793a6eada6dbc84fda8ab11509b256d8b785b252a3795f1d2b99a51df05d000000000000000000000000000000000be2489f1f91d7adff356236859679c46b6bf8c1b375e8bc8bd1e97830b5ac223ffbbda60ecda168bacc2c0b90ed25d3be658348e299bbf2438a0c013f86eeeb69a013b8004a4996189472f3372b326c00000000000000000000000000000000111ebb796e8770d5a69e724a8d3ca62ef1f13778baf4ba12bf462211d35e325ff8e455c85237a73a3046e531f2e2255e0000000000000000000000000000000004308b76b06067e0a07bda143341220809b481b40b78edb2e24e83aa0f003d209198825b5fa9bfd92597e27a4054d3ee000000000000000000000000000000000de74485713f5c95653e98b96aeefb79b59911a610c2a848a807653c19d50394fdb52178947c779134d24b6d396ca36800000000000000000000000000000000069f47a71ad765591f6335b962e7c2d87b556801e1e6c25b449edc83432612fefd405c952397a704e9aa5a924769ad4e9b9d0ec92ae7df3f52a95747659f8fa3ca2cd01e8d7ef6de384111246886bafb000000000000000000000000000000000a3f89408ee43c0ba6a7c9c479327ebab426d430e3ff212c65da6364b16195619d27eee83d701a2ec50bd4b7acfaa06300000000000000000000000000000000092715831af983f740ca2c673e7c9c47727d64165c59fce19dc3fbbdd0b6a7be66288ea1f033ebb5ae2b38b3762edaee00000000000000000000000000000000071ca6fa9e546d4bce965b2bd0f0fb97e6833f05cedcf66d43ec88aba411dc4d6db9f1591de22f493f49a1dab1a2701e0000000000000000000000000000000018f89932ec032fc28775d34d588169a1435bf4ad7e2ee11c9d6934dae31324ddb96b3ef88f95d1bb2e52c3c8d9c01516d2ffdf1237b4e03c219806f2dea745c94bf08924e1b9f11deeedf0db19da6f3f0000000000000000000000000000000011b5cc382164fc21c9a72cd85acf61c2a78d00a16a2dff938f0b36bfb3bb7075845a1616001ab53271a9a257a38312cc00000000000000000000000000000000139ba2f27e545d45027a0b11253532e28fa691170e08608472ce3b3f9a3e9398c5ee76953b1a1d01a5e79f194c32d1f5000000000000000000000000000000000d875f44829555cec695f3f4a28078b0a6f168bb0985793d003443b75a141936f3c7c633518890e0f7238416d46573cf000000000000000000000000000000000675420ed817ecd24bc5172d3e7df60ac4281b24ba91e8b5ca8bd6a8321f5c7312a6ba043fbcdc467c8a5c957590a692cca0751c9534cee7f14d11b7c8ccbb2c537a799df59f850bb125c6362d72e9c400000000000000000000000000000000107bde844286cd3958cc7a1314127322251699b51d8af8e6b57495497f21a84e05612b1569b54fc5639a75e9f9deef750000000000000000000000000000000002355b1a60e24e4879448437d2c1b12e58f02d7eba88583e96e9634f7e2c8c6886132ef0488918f665ae3f7b6977c7c4000000000000000000000000000000000fed531e437b70bc4a19ad63c61ccaab49afc50fad1f156b1c8ecba0e1b703f8aea61882c6327d4d8fdd072df9c4e73500000000000000000000000000000000182177409579ad53786539514753c696c8757b8c4d9b8360392f24b591e43ec20e84c0abe468061a9e5e879c5c81314217f890a1120daca4a1bc1bc0fa7529f0a87b5fd6ec385f12b270bc0f1a5281b40000000000000000000000000000000001fb25395089228772d6000025cb0356eb510c964bf7d0c12d47a6608fc18cc448e44880eb5ba8475cbe6418fc9d8fee000000000000000000000000000000000f3b9de9980e5afaebc59c56e02fd75fdad13013842ac035f8d5569a46cc67f0cee461a939aa5a3d8fec2966294207930000000000000000000000000000000009a223ac0edb164845eb8397e0cae4363fb2c8c996c3c5d722cb50be56cc3789c732763cfd4b61470886dc991be39f57000000000000000000000000000000001909f17b229eb351dfe8317a8273d846edf14ad5ee0ebe8cc2b595ebfed19b73983035e19ebaee3d05b1dea35968586961ca18257d9d989ec13d4f158b18ec17d59344f4558b6dae6c0aa0c2f37affb500000000000000000000000000000000081fa9eb8ca7d9db52380e4c408e6d5d668471bafbafd62ba9023fa08f6d300a45295b583677824c29ddc3254439cadc000000000000000000000000000000000e2e613043b1566674f791dca9d860a49a75dfa24dce3fe18f544a9b24ec5266a64e77386b672c93fc4d079eb8e76a01000000000000000000000000000000000f471b86ac5783d720e7d73e8871474c8665e8a109aba27c1172ca24217eefb0f66c53232df1672dc0af6ddf9640e10d0000000000000000000000000000000010667cb22a6a818fa7c729e40a7e70e1f31b0ecd568b54a4d352d5c9df8cf1072ebf2ef1e612efd96bddcbeedd8566430fc004ed8a135ad97cdd1bc4d0c3ccd15e65031ad7e3cc13ef2c260958bc43be000000000000000000000000000000000a0ed87b01f27f26380c6285e82bf2f12ef3016c7e7f3a13041d465825664573db47be6cf099cea615e21f6a5d759b6a0000000000000000000000000000000007afb2a1bd50fa0fd3174d70f1c8d5c229627a496bc9bb89d4f52d47b1862e14d704dddd80045e58d00336e898a996eb000000000000000000000000000000001698f30f824ee5cb71b3f2451953c371987433d2eda570f2a13262ff9e5e529e316b06ef6aadffc152803b076f22db9f0000000000000000000000000000000009eb1d5f3da7cfe9b40a70e1b3c3dae36436e8d068a79dcaa283905614676645c99a5a165630ad46b70bd6be8b1f21a8d8cfaa1037e2c81c6973b221dc7badf25ebe3fb4b42bbdef1124265df2c7ccc40000000000000000000000000000000005c4390b8f37cc3fb9f248470b505a5d9502d44e4a4459d1f56452cd9aec89d114f1402fa45935930fa00888a4860a9900000000000000000000000000000000163b0ca84b5cca4f124bfb5a13a4a3efa677a84dc89b6a61e69d0aad34fade528614e549a7b2326d1f6016bd0d35465a000000000000000000000000000000000bf450dc8af483a9f993a29cb47d5362c9f5ef38afc2fba8040e14514eb834fec6520a413fce5868aa9a2c7c3ff6617a000000000000000000000000000000001063619f384102949fa1f8353f0aaa5031234d736c54103df6ef6fcd0df02a19c3aef471f0413a1e19febed6395459a0c25ecc5d37659ebb0c9e21ea2f8fddc518e3d8faa99627b21faf105445f69d7d000000000000000000000000000000000e35db3017963d3a9d62b7e7fbfa13ce4f5fb46a90c1285ddc0fa481d9379b95a77e8cdd4aab5c33059bfcdcd82473fb0000000000000000000000000000000004fa27c663c8d21f041d15cb199d31cfcb96a56cd673b730dd111bf03cd954cc33799456674ed4d58e8e0dfa826a6b26000000000000000000000000000000000e0df4e7f943db5b5c27bafc7e1ce099b2caa64642bcd6336ef926352682fbe81a1945b266cba7eab52b16f4aa63eb8500000000000000000000000000000000020167756b8c68f535c4691b1249ca1ccf0a539f7274623ada824d0ba789ef44ebb20ec1ba51d46c0a42da78653d287e26cbb32382902d9b1963779070d749cbc4df1e7605f840819f2c04aaf89c732f00000000000000000000000000000000178037c6b5fd1c6c396d8aaadb712863557feb744d2cb9165ae5c36376d2c066f7b1648e083f81c2c96da6562e0b3c20000000000000000000000000000000000b805b4e1cd5d45d8b6ed9d4f604ac0b40f336b8123f7281df43a6e803f8688bd8087fc4d5fbae695d06efb0fa35e18400000000000000000000000000000000000a947562dde45f613ee1d15614940a2edfc770d733a60374f8e9188675d4cf973a5c1081c11fe5a1d93bbe85e6f47800000000000000000000000000000000059473d80c82c6ca06b4aa71d072f4751b3b053b53ffcfb4a84906ddfc36ec5918668a62f07054af1b241bdd4485edba699aa549077a80ff8732b5fc9df148a90f405bccc14bf7305266836566b7a98b0000000000000000000000000000000008b9d0916a9f5689b8fdac84bec3a49d0224dbadca6329ecc156da633e1332bcc6735ca3ecb228c22032dcb7b2f372d3000000000000000000000000000000000cac0c264add10bdc1217384a7379f65b93cf822418f7e4e2b48eeac45f068a61f805cedfb1665dda06e04cb726d245c000000000000000000000000000000001578e98a40a64da59154b1c3d757d8f1f8cdc500482c7b7d65b9997576f745442fbac654c19331977bd210df440372970000000000000000000000000000000015ef69f82e85c81d28893d94927068f14c6516eb7d09898d5d055cbb7a9b55c6d7f686f067ab164160e6d6a8f91ea19d40e2de1a2901f1380a383a741d79fbb0a041da5d7bfb92edab74cd483edf95230000000000000000000000000000000000a6a27b498285085139b8dd0c37b700997134337e696c84b5e0cf70ea3991cfb40ca3a3098a3b3a2fa31e91aac78eb2000000000000000000000000000000000bbd7ebf4301c5eabd4f448b89f1b227415cede3247a1c8dc56a02247efaa99dc78cf370f644ffc06cd2158fa25197dc0000000000000000000000000000000004535a402540474d53c084d4fb6d9e12dba6716ee13286ed758aedc1ef911b55c572640180a54cbc084ff57ceae8a4b4000000000000000000000000000000000759de2a9e0f3c04b4f629a682dbcadb2140e5b935845cb55bd267e230e08c6e8cc5426057473aa03ea2196203bbf6dc062b323592118868d547e83b731d15ba2c7bdb1ee4fdf73600c2584f1db0b45d", + "Expected": "00000000000000000000000000000000134c29cc5c33c10f04b6c09b5db71b10304028d06ad6acd4f4b39b16823288085a84a0380a1549f04b3dc692cb8216d3000000000000000000000000000000000a0a9379d63527ab9b5f9c00be4acd54e5fd683a0a2f37c85ba570171c705eaadfb0f4e4be1a8836c9de86dff46138300000000000000000000000000000000006ce78f135dda5af34a0e069d7ef13fd589cec5a6128512bdae7f45f28b09c6e4b3cf638628c9f4783097cc00082aeea00000000000000000000000000000000141e710ce7a979dd1772150d0cb2d5b269d5cda50d1bf7bd0cd827b24f9cd8c1e2775f495cfec0428519627b7fede464", + "Name": "matter_g2_multiexp_34", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000018aba8353cc470b287a163fdb9b8b4cc46071543ee8261f928a7b856287946637d9b36b728a54e1df5f185a47f1556060000000000000000000000000000000001129541b2e3b2e1a553995b603dc3eee44a5ea440e687739ee9e1339dd79bd96c67231ac753d483e0ca96b27054997b000000000000000000000000000000000e1cdf3591aadeb56dbd80890ff7d5639a64847cec771a19c769df7da732a6d3179d3a89ce0052bd7c982af0304408120000000000000000000000000000000000f5f5f0ebfd2b632e15381ccbabfa88eb774f2c61801381ca73e6970965ecd54f5f3a9af7c152186af8fb75ffb5bc25764ab6f4c43630d5e79e8c474d76d8973a7b7bd1c7f1a985333cf1a6be5ccff2000000000000000000000000000000000e527e40c311edc5dcdbb4d0b70497eaee14533aa8ec57dc7cbd7d839fe6c6ae62b1fd0be2346a038de687d5cf5394d60000000000000000000000000000000005f9fc63027dbee5e0d55cd6c57daf5df7af0d138393a2dcdc71ef9aeeb204ea347f7d574e71f2ffdd37d8f05dc7979f000000000000000000000000000000000f8788034c9f1c9c2018a52326c046cdba8997199732152963819b663c6e58e9d6a0065289e2e25a97ce5627505900f20000000000000000000000000000000002a747bb3bcccdc6ea0af1bf1d0ce55de3f41b93060361b30c76063346b606322a76ed7eb260219c83aea0806ac7d8583280f1b1e78d2339f64b5b2f2bd77aa24623b79fe2c9debab4212f4ff564983b0000000000000000000000000000000002148c043e065132e978e89f018a5b728d278c95c9cd1a6f276bd13f0cb708422a62fa22f7b377adf33055fcb09a6a8100000000000000000000000000000000024c4c721a0574e53118bdcc3fd41f73176bc8264d2ff39673210525166bb3513016b5c9af67a47a7032b74a62effcef000000000000000000000000000000000797dfa8cad94896916b7d55fbbb3eb0eeb74f70231205388d0dda69dd8abb436c22addd22c1e3689093739af957b65200000000000000000000000000000000010dd2ea2d45528de8bf1b5c5dc3267fe8951e48ff5987e67ec52d58635521cf1905f1688894e3e23a659764880b2301d4d27ff9d03ab9120ac2adfeb36b070015f0e90782255ddc9111704c5fb11177000000000000000000000000000000000eecc0a4edd3cc3f70d3e0e43ba56b04cfb3f1ac23c657048a94318e622217572b0f929c73f545d6f5f5613920c0580200000000000000000000000000000000137a098ea8d3aed32c197a2d244a2e18753045b55cfe16874f79c728c664b7f23b10476f20dfffb2f80417c26dff4f860000000000000000000000000000000004a7789b02d7d95a2ce0c7bac39d5b057509200393450a47fd9d087a353f866921aa11185550537b98f3073650d9a1370000000000000000000000000000000006ed63730bae06403baf705da0e30c6c00739799eea4a312d06b8d7dc35cb43a4f1e941a69e55ddd7ab8ce42d8629fdcc66d5291311c7cdd1f33e5365ec0689608b3569427a8f6a9cd0b94b671472e66000000000000000000000000000000000ee7ddbf43f17f722dae84d34d26add8c1d732918b8c75c6b295f2f584075cea0c655911410b32c06868c1acf36aeaaf0000000000000000000000000000000018775682555d9f5a576cf9462170910bcdd083671ae2e4c8c6fa99a702548f1ce9afe90e681b00d194322b1a2a3be7ef000000000000000000000000000000000f3935bbbf58b91fe8176f3e25ad3fdeffdd6b369ae70b704d4e54d4fe32fe5987e73aa5aa975e958497340274577cf3000000000000000000000000000000000c088bc439d638d86aba6bb1e6e9f7540ac2da3b96080aed455edd1fbabfc141e26f125cc3a9cf72070a24f298dcc3ef4b718a5129659250640e333f4567043ca749063e63d87efd86a9995adfd3b8450000000000000000000000000000000018d8a47d1a13b9b8fb5a1625f9616ba120d5c677bcc996f694b7e15d251fc4bc938b0a7cb5b70f22b8e9f5b416c513210000000000000000000000000000000003d0646458bbee7ccab27f858b8ab0af0cf583da12a40ca5a954d7eaf97c897d379129a63d8131036f29c30c6e644149000000000000000000000000000000000d5466b50975c5a2dad96e4e24339eafc8c85c2497a6f19e12d96603596498654cabea6995a92c91b8319ce06f18d56d00000000000000000000000000000000191a96d62139f8219b9e4369a783400d045d72ab2dd83fd229e08a4ca73de59a11a5add86c739cb3bab4adc5e9f79685708891f45d7bee38fe382820260061e212c6cb9a8572b4d1854f3ab09409b05a00000000000000000000000000000000032eb1f7846b563e98fca0cd44ede4909b6e16a893f5ef01eaccbd7d8aa11710606bbbd0ee6480f7cdbdc9ffe66c3a9c000000000000000000000000000000000c31bb6fb537cfcbffe815d86ebfae1f5053ceb756818ede8a58cd84cb34d0eacc70ab9095f9db1691e4fb4bb816d570000000000000000000000000000000000a8fa1dc2f28277a4bf8fd9665d4b5c3baf1352d89890d4af94a3657cdac7fd72558da1e65cbc5bfac142f0e817be74f0000000000000000000000000000000005ff65c22ff0abfb33518791823c5f2202ea5f7258c0a507ab84460335ffc2cc8d7c7f670752a7647d6a6487ca0c9adb85ac0f94f300b004c7f20aafcfd9129d6c2590749504a3f08c4cc708fa30100300000000000000000000000000000000190379b7629f74bfb88096dc9ffcdecebae0d653410f032a35a811a09022679c9be19f3790af95c3205a396819e068e1000000000000000000000000000000000b6f114fc277ae8f0b5374dd349985bf955dff7fcb0095e0e1e137fb539814be78c924074bbab54f29dfb42f3e7df24a0000000000000000000000000000000002d86b0507c147142d03d3461bfea4c3af7e57a6edbb372387de24a27cfe27c44ee4b9571325a1b3f5e83eef450f2fc6000000000000000000000000000000000ac3b226d5e13c36c3a8ef0c8896d9af55bcc0cb67ac1cee57a5c6519617ec77af9af60ed44e0a8284a2d59816ebf848fdbb634bc0f99c5795f3c4d6a0efcda7f71427f1eaa1c5411caa6cb05ee3147800000000000000000000000000000000079cd4511e953e4d1b3f4f3bbbc66a62772018e809779fa39aaeeffac737cda9a6116293848f967577f03017f33231d2000000000000000000000000000000000ce3cf48be423a2fc0188b94f2a22579872e9ba140798e560ad107f63ab2b8c601831f89d06a4bb8e7a758cf836ddfb3000000000000000000000000000000000a6a90f735f215a79216fc4e7daffbf74775f38824952af72ac38c38a77a277483e34bc95031679494d76f109c0aecc4000000000000000000000000000000000d55fbce780d885cf817cd2126e7acf115ae9c72843af23c376f3a5d4307d1eefaa0f4691e7c09b5da1707aeaa5b675af5e4695c01849259fb969183de385ef30c2403e081067c2d9b6b5522c73fcf200000000000000000000000000000000008924efbdb46b9324bfb79b922ba8b7d83f5e5e4b3b736105e5339805838171801bcf17208f3dfe5c7475d4e45b6ad970000000000000000000000000000000007bc0096fd23f0c93f0dde8a3974ea3105574e031202f6316d5940c85164c6d6bb5b86078a0c68dc822c0fd1b3dc8cc10000000000000000000000000000000017276b3208b347388a5657b10e3c8e4a187b376e42352f76ee3ee88873217b6b8185022c93097cc116abdecf3cc64467000000000000000000000000000000001915ff932acbdeb52f07b664bcc47c3a5b096c6cec32da4d7044326dfe84358e49539fe50782538a901b99428446b0f50ea6fd588db5efc5fb2248634cca683d39d610886b59eb3077fa9612c368d7690000000000000000000000000000000009e295d229b543a17db1cc85c846111b7097bd169d19b410de78f8da9684e664922eae77c64b0db430aeb422016cfe7d000000000000000000000000000000000e29aab30a1da56b8590e9df67171cc1b9c847696b51147cc57ed6c3b55819cfa0992c67e15e4ca6de2573c9e16231c10000000000000000000000000000000007cc9990c6722645e320dd16a4be8adaab41f958f769ba0d22e235549a7457778cb9b14aa6ea5caa9e0bd43f8d04cacc000000000000000000000000000000000b2dab5cf37ae8e76b71dd8748c86e8823142792445fa0b140de31957d35bb7267e3d94e0dc92f4342d9f8560c5d9d86dc2060a3421c5a8336c80983c9a160345901a496c3a74fc5248fca081d09953900000000000000000000000000000000128e2aa795f8479da3ea2a4efd12aa90a6fb019d4da89fd372e6848ff7ee17da689d766c9e49c88c962eb4f682c56fff0000000000000000000000000000000000fd68bb80d6b2200297aacae1174275f864669e962d85c9105032d7a352fea548e9fa0629a6749c789fa0827a40190700000000000000000000000000000000175bc3918dcc972fb728f1d8cc30ce9887efc6e0b254d8d22af87f95cd4182129d494c43d11b028c4b9849f5520a4fc00000000000000000000000000000000007c5363f507a01c0b6935fee0413345bceaf1336cdd20f69060bdba2e411521a61a549e6159b2e006ffa16e3bd77e998e27e4afc3e6d59d0f5871b35eb83b46cf15da6c326e88dd8edf84031f58e23f90000000000000000000000000000000000efcd782b89fee74ebc037160c6653ccc104260b5f8989545b40d51ead6ad6ce6252e1232281c813e3c883af86e68ca000000000000000000000000000000000b68ed21f76ce131c089dc454dc48ef948cc7c6d5fd87d647db954c9eeab2f7f76ccc51a1cff8612e89bceed16ca03ba000000000000000000000000000000000cd776670d5171610046fa294fecefb42f9bb4d71baed4af65a09018b09ad9341789abc23c9feb85adf96b4203b0c0a0000000000000000000000000000000000ec4ca0091a28b73c9adbe7120f2bf1a84a62ebba1e86b1948389b1a1966c1de4c632a5e245ba634b53cb932f5847f6ecc7efff04f143e2d038de153861da5e04016a7eb17fbe6365de13069d088b1a100000000000000000000000000000000022f319bb5167c2b945a69a438f712df8975a0e262438ea687e2b0d824e2d1d14bff1065f50fd6ae92494f6f3aa9472b00000000000000000000000000000000198ce9e4ddb6b423788dbea82d75513f43cb43ecf1b27c8788f041248f01808644f60fd823e5862cd7afb4f7e8b6b6a100000000000000000000000000000000119dc1be1bbb7e678319db73055ccb88ef7efcf6119f8a9c43c69247ff264879a627f653a10a950e0dbe69155ebca4f1000000000000000000000000000000000692a0ef5a75d42524e3fd52ae073b0f2ddf6378f18a5dcef05af4868a899b93c7f1d2691883e5c85f97052ef1f4177d09a2c3dbb4ee4f485dc60dfbd94a358a7c62204c021f2d7b140187ee9ffdc4ce00000000000000000000000000000000102c92272571b73a7df754728d7293fd8050d9dd2b8605c3f7722e6de541b7fc6a81b01c1cf15e5241ee4ee1f81ab39d000000000000000000000000000000000af1cd6f23bbd3e9ef75eed6d6d99a7cdd24574881b3609e45c4adbf82e08259d14701fcc5b6338ecf52166aecca003700000000000000000000000000000000026a1a4c3eb54de2ba4509dc806db9efc7e26247d501cb59c525b8dd15d03b91abafa9ba5816c22e1f8ca159cda34bd500000000000000000000000000000000170b510ec227fe8534a2cbb0f405756491c4f6832df552bd23980ab0946725371b3c24fa8b93a38bdcd47e1026e1d2a0d9b15c065497392e4b477a556ad620d44e671137cfd570d53590b7528f8ff680000000000000000000000000000000001423d1707e49d2215f639df75ee0e13bc724efc7d099259179260ba0f17157c4efc4276844bfdc46c61ac2185f64beca0000000000000000000000000000000019ad06d215d3c819311938f89609ea7cc63fadaa11bcc86cf5f26370a966eaed1aca312c18176674b5aaca3ed8ca876e0000000000000000000000000000000013bf3f13e87f3ce29f0524094e2ab8e39679566add32e779256006dc92ce09f60d5bb9cf0452b90ece71a5f6981d77f300000000000000000000000000000000112e4901efca14686c30a883ecdafdc389303f4cf46345e229885c76d900b0aa084a957076009ce22ee36d4e285d410c9e2a72eff2ec29a65b417767e7090b73c2fb530de6c8f4e4ba30543946423b12", + "Expected": "0000000000000000000000000000000016d1fce53fc4cf40acb0347c0983dda46383e4828c16985459ac89a2ce8d3c2a26cd9acfaa2ec899cc63b4c6bc351f560000000000000000000000000000000019c9626363b511a79f297dc79c5a3b7a2e5127fe49a2fac5bc43a4376f170404f044f9f84b82cd09a306012fc81e3bdb00000000000000000000000000000000062e324f3d7c5bd39808b762a5b009cb30bec14a9591477959339bf2de9ef27eb42a0eddb95aa5fdca9bb9d89b278cc20000000000000000000000000000000000f05225a4d3bf910b0ac0103594a90684ffc0c09e2c21744032e30470d5727be3c27621dc2377e9845ad78be67b856a", + "Name": "matter_g2_multiexp_35", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000c64577b78ff306186dc44131cf8bd946a68e65502c4af9613154a7e3ffea4fe4e59cac4a500894b470a74e66db1834e000000000000000000000000000000000b4311c295bd30174f17b9ab3544f1496b9655302a4b6026a113b1aca31b555ce7b2d812bf8fafb6b075f67cdc59b77f0000000000000000000000000000000012d7dc3db10ae6b4e3e99c655aadb71124a0bdcfa6e30ec13c7c977d39f83aba4979a1f45881813a3a68e149a40120a90000000000000000000000000000000001b958c47cfecd619c05a2c54315585d15fe377beff889602ecba6ea3b29d51f6480f09a0a8490e4c754045f0bfdc3eb7b9aa7e0bfaf135ff24720773ccd1e0a46fab6d678d91a14de137061e145fb9d00000000000000000000000000000000010db66653f2ca73e55d85254f62e8b558584d546913e4b8f530968088d90cd5c4bc164fdb77325fe0bb2fb1a5683896000000000000000000000000000000000a1af9bf84f0b351c8e8c082a79c7ccae768bd2ed40eede38666aab1901a6eab0cff258f440c8c8eb4854a824b9aab4b000000000000000000000000000000000444fa654afb57f1b01d10be08a330f23667af58e3a40c630a2e01c1809125b3ff8f76e8a39418688a023293ff1a45e90000000000000000000000000000000002ebb117ea107a3598b888dcbd5918dd0ca307b21d65843c6c28b3efab89d0e276e5d92283bbb345b674d4a300595425c6733c9bb7bd195622b96c4181e8c8837d1912fbadf77d6029f7fc44d793b48000000000000000000000000000000000105818a11efaeab4801d4fa7558b09bd56294be7f58e3e54fab1f4f7c243ceaf08c99a14c3128ccfd866b6f93caf989800000000000000000000000000000000091ca092e5f83a04e872e621e71d54dd6886d088718f60ed5b62d3e4c165d3ff2cea1e50fcb94fff251df0f5ee453cfc000000000000000000000000000000000b42051a1ef52f87536b9bca459fa7070ca17bf825950b13b3bbe9db183ef722f62af6c05c174c65d59b722e1d2f5b0e0000000000000000000000000000000002fdb4a5480418e43aea28e5041af6ad55a6c226e1eea1a0449a99b5a937375285feecabea95c2652da5113dc17d8ef4410bb66334c677397d04f59eade9630463065cd7da3c9d50580c7d66bbaf487d000000000000000000000000000000000d8f93b589678d4e93bdf8da7834bc8edab648ead731b7f5f0cc299488f07262877ee9bb1174ccc106204dcd3f1f416800000000000000000000000000000000160f740ffca48d3a10c43e591cf46c129507f10e65d76a031fded2930d6c2dca4c79d7813f63e4ff71aee09d672173680000000000000000000000000000000013c768a4889315faa3976c8e43b4d466ea594bd94773f270a198f2571ba9662d10435d1e541a492055c333eece9bb29a0000000000000000000000000000000003dcbcc9e6a0cd5741d77da88fbbc269202e8f944a5df5dc4f9145758654934d5e1eedd596325080382458961ed3d21ed97a16fc5b2c70829b15f73615286eba334de1f520b5f0f6a83d2578399cc0b3000000000000000000000000000000001344fb37c1d7dcab01a4bf6fa50c6bb7606f7db22b85a3888ffcc2e9f229f196881cd7c82160730727e49b9e6fea04320000000000000000000000000000000010c7b15a6355d3152eaada7a606031f28809f278a1d0e04d264b563185ac7d9e351295191a6a90ffc9c6dd33995265db0000000000000000000000000000000014438086226a061a1bd557dac24d9333e14cdfa3a7bb00ded4a450e8889a3028b174bf38ae1347e6aad19ebc1cf5ff7800000000000000000000000000000000105165703c4592cc4f1f489d78426a56434dc77327c13221b582dc25306f4c5bfe596f3e47abcb741ab553fa14cad374bdbac08202bbe5df1229e99c76c1727f7789e0f8c2002f0a2c195bdfc00acb36000000000000000000000000000000000ad8b55a198a5e788bb54c32112761ccba9863cba16d95ec9e30181376e7eccaa2741660f2c5f708300be058e566ae27000000000000000000000000000000000b9bbca7db413964d2ec113cdee2d7a7bcdb712d285655f6b2897dcac61456ba4d08e25e8c28627231824829bd7d13800000000000000000000000000000000001ae49c10675256651e3e038a2150d85993fa6f2a97b9bc02c693ed97ad52af34015176258b3b2546b81010a4381d85c000000000000000000000000000000000c8f9668a0a497420acff5207a07cf780e0b2ba78083eb0ed8eef76beea996210541bae2e64d825000f307d54cbe3b2b43da827b812ec6ac23b00208cbad0f2e8b3a32434aa61dde029683c34c1ab1900000000000000000000000000000000012990a66c132a31d60d182f729b52d9b57d9d1eb1988b6f0b4d9fa2847f26983078ef9bbfd0e888e14bf7d1f92d09e54000000000000000000000000000000000585215ffc2673a197bf9cc6c6424547886abc6ef5c6edfeab2ef0c42034a4a458fc7155c35c84a8e9e9d89fbd4aa25c00000000000000000000000000000000118fb4fe0d3498dd2b55e62272e95a1203f9fd22314921d3e044f1b162376aaa7e8154a4e2184b66451aba98729330c0000000000000000000000000000000000364b9032ab9cd9f599979c8a93acbdb831707f1f84fdc92844b58bc7e4d72472ca5b09c51b1b04271ed9f0e391552463c7a8f7bf434ce5e63ac9365448da8663745f66689b4b04968f9b8b1b6805893000000000000000000000000000000000ddf9e4e302169e195f4f88fed06e0c93fd1b542abbfeea5da5d47c662ad9a16b8f4aed7874354fb9008d073920e1e7e000000000000000000000000000000000043fd1a4b781f25e8747ecb3eec45ce90760e0d5dd701e8193a7e726684ccb8ff21f0219ba15e9e777d339a3d87a1ee000000000000000000000000000000001117d2ca429048056084e4847c7169b4c8ddaefe1d48079949f9f14e4d74f0e0b38a95d0f17389f61da7b2a6d8cabd1c0000000000000000000000000000000007adfc7d87b1c533b4439f6b30d38c694b65b3b321f3eec13cd7d923f1d5f117005be6c3ea901a9479d79fc553e34e6c51f2e2bcfa6ebf84d3ad83c57257b9032e5d62a8663ed5d77afce00f33382bc600000000000000000000000000000000115a81aebee0329b174c01458f8714b13ea3fb2dbfb051b27b29b940652f27e01a84e522626d12be80da7e1039e2baf6000000000000000000000000000000000d9e37d2e5e7160db30acf5593d1c282541a0d4ac0482f0759fef8704b9ec3ab1e3ed248e37c6be285e890ef1a520d0b000000000000000000000000000000000c198a22c2f590df2902c8dc2bb1ee427b33e9687767666140f9d3b51d73fef18a259d43d86fb3559b1ab0abacf547a70000000000000000000000000000000017e705af54ab76145a79e747167a4fec6ec3a16f3ceef86b1ddd1be144e616ea7d686bbccbd1c5c258e4546405be023d6d8b15ec8908bfe008414757c0c7f79b3079f9db86d91ac3ec8f38ae2c94d48b0000000000000000000000000000000007c4c31287ae0b3bb90475f84abdda36610f887aae311d8e97bf97bbdbdfb11d38c7de331cc9dd022926678e5180c0770000000000000000000000000000000017f4afe28adc4b24d16b9cd97aacd171c2104b13b079c643d664a7c924151a401c352832c4967c0e5cecec5f1d1dae290000000000000000000000000000000005a8aa8a3a91461e0ba256e44af56875f8d07e24628e738ffc057249d8380417884f40c84e76dc6ce5816ffc05c0d686000000000000000000000000000000000f84bb7385a6936b519e881a708541570a31a9d7897ab8b348a350adb0d30522567fb917c9b6db661b6f53f98b5e68aaf4723e85076d48389c3fb5a5df16b6bc6f7a69ca701632b1159677bd8a6f7bb1000000000000000000000000000000000a8726ea352582ed52ab4e440102963891f059cf5a3f4901615733ad560a99930efd8692f3c30256d58e5cfc4f0803bf0000000000000000000000000000000016a623dfeae872639d99e3b8209748642f20af796325630596b6ab6146783bd4f2247c7ae38d53ba9a3fc0cdd6f29087000000000000000000000000000000000e40709656e569e4fe90eb85d8761c6ce44a4272793ccb7635ce75d67d97464e8dcd8c32bd4ac9a36fcce706006915b20000000000000000000000000000000019e64802756896206a9600f2d888f3d307ebf958492b1b5153c06a11231e2d7d2f1786368447f380093a29117cc25da9a632938a6df169fb64daa55d2f874ef7629d5be41dfa0d50827c082333f0fca00000000000000000000000000000000019c7409cda6084edc6e559da9b361c96cf207f1e2cd63cabc9b86c5bcb07a59b43e9c6ae3e90a61c872f168ab89cb2c9000000000000000000000000000000001101bb63a452b766a085fb788937f6b751417dd8d905ee50ab5bf96cdbb9d7b68c1735460a71eaf9e9bf662734f495c20000000000000000000000000000000014a103871fe523cd01053a992eb9884ce83c6023bd6a8c2cd9ca60b8780118c88502c6980904f2d2bf9ccc9fb597d535000000000000000000000000000000001929f25d52ee6b9a44333237c732a63ce2abc80c5510bd67faad1d7adac96eac5449823f3a52ed18bb90b93d9640d0d1283a4da7f71bde54d4b7e28b2b23e2eb05d8b025e77e15810625d71faca6d6e50000000000000000000000000000000015b0a46692f57ccd2b7f53040dd75f30af0196aa3c5499049eb172b4d927f96a59c42a129117d6162a1bb31d2e8734a4000000000000000000000000000000001366dde2d9070a2c057744fffe78effdc328b122e356a6aadb10c3fd2e8badc0ff70bc6d18293b3c52428e2ba78766600000000000000000000000000000000016fd48b067b949ed75bae3e4db29b5785bf672bd01032a925d653f8a605998e1eff6c77ec39dcfccd417f1e0a9defa820000000000000000000000000000000004cf22bd706dbb1cf8b97187ed97636380871402b3ba9de58f174bf50a7a0b528749762c3f55f5f835a276e43b46e669d402b71c1fc5c3f3a4ed9edc73457a27ea427f83a784796e01b7a1451b3305b0000000000000000000000000000000000ff424ae9372af46de34210bb0bd670eb173bd49076df5caca4bc4293e742121267a20506f931a4ae77cc36fcbc8df4d0000000000000000000000000000000015a6815b47966fb84aad5de62e6d4280f9135e129f33fd01e667f4d6e1bf7204317fa7741f3cff3682e251437927131c000000000000000000000000000000000639dca43483b79ba8043130e508e91fe3f43bc362fd1dbb135a2eb8f3b94d5cc4af70f1101c790545a0eaf2408706e1000000000000000000000000000000000045f0a04a642bb6e4db34fbffc8adb19a24648554f36ca371fb1a851384a4516a57f1850f7d6be59ff67029ec4002de310bc47acb3aba7eaa490ec104ed9b2985f65c7347f69fdc67b76f6f43846a99000000000000000000000000000000000e796fd500cb1a25b834baf7335641f34ccf04ccf60f82367f0e5c8c7fce8e3030e7b916752bac8e3adc01cbf4b319ac00000000000000000000000000000000142e8bbac9cae69ba3dca48aec045e0c4d7028f73c254433f921b7240761c661cf8e774a21da249f7758234cf7607fbe00000000000000000000000000000000045a3d80767d116e89bab0e9de812ffe7ffdbc41b61f5f17ad16be5bdc9968e34f46b937c5f94f8197e21b358f44b5240000000000000000000000000000000006978b93018bfdbaef0d40f1278e831a1fc50b44fff39b7c93820a284d90b699981b1f422f751a33094ae7b5cedbbb2691b88ce9888e5dcfef70d6f960a456dbabc792571f2a98746b7d833e7fab98500000000000000000000000000000000003c3561f5d255cf1f83cb5f4df8e3b8d5655d965826d56867ae66da631f8e7d489f733f5824c36652ab00586d9c593be0000000000000000000000000000000010b3adb0017e2cea1b71680ca33aee368429880759660dce2d3cdf57b6cd7339bd8853e5efafb9a5aec3f7e22da676c2000000000000000000000000000000000cdf976e4c65edb79ff15178f6ec5bf0a77a30d97b799e433f216a2fe3eedb10bc6ecbee2974167128773cff43f1922c000000000000000000000000000000001599b60ee70d927849764880830b2e7355daf95eefef39ef61569a2b83b2bcced4dfb28047a1e5350cc87ef3cd5cf1d93e82cc1261ac3864266379b4d518e25c05bc492a8946b38b8a64acf47aeec4b8", + "Expected": "00000000000000000000000000000000123af49ac2981e14a490a4a6792f21343497b562266a47487cf6c650769c810852e357445bc68f3460e7822e8cd1e3f000000000000000000000000000000000143e79853e4bf6d031e1116dac2c6eca4991b8a1f822fac1d352d2cf1b88df239d82df886f0b24b3e7f305286cc1257e000000000000000000000000000000000b621056a9de2d83c946b1e2c7a07f9beb8e053202407323e412c0d8f60123cfd5818067f57034fe1b1b5a3d1bb285a50000000000000000000000000000000001642fdff2c52d58d38201cf44c31e00df47ea1439e9896b5ac5e9372482f4ffcc698be46c2d375d57a72fc677a9fc8f", + "Name": "matter_g2_multiexp_36", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000011f78204afa05c3717d3908dc7e4356ef96c426ef380b6abba3a5616d9ee01addeec3369967ed42e030c4b8ff9939c4e00000000000000000000000000000000175a19c86e7eff0f4e809a5105503ed223fe327ee4617f7f51257426fe408373899f39014821292a75e4cc4eb9f7f31e00000000000000000000000000000000052130dd3cd17840385db424802d869d7eac781365be25ba401b7b0e4025353c8dbf59e5997b5aac74c252192061299d000000000000000000000000000000000457f4fc7ac5d7d4fa07e8ed125df4c4e950e6ea926be9c04b6df3c3699a10e99af7ea8546b8ac70c3003468a75c821ca2a1148f1ba719b2da92c418fd137efe21a44dd4cce013ab36e57d97dfed92990000000000000000000000000000000005182a3af2b52102e09214d048a1a29d1e10b7ace6afbc4e6b1ebf16790be372dfb6d65cb8fe08c3dbbed8c5435a59a3000000000000000000000000000000000f2a1261463c09a88edac443ec3cea8aaa19659e8b7ec2e8a403dcffb1e50ebb3d07217a9ab057d8d097c075609c13900000000000000000000000000000000007d6525fea8fbb685fcf89bd772d48c406aff7377429fb199f27c3c3337f11f8e24c4d81c9026b469600d11e8cce51be0000000000000000000000000000000004b6d6102debaec16c34fecfeb444e7ba573b13b83ec375f14d2c541a0d1fa528ed6599a0eff4f8ca527c5baa579f762fec5d6167d7777169348cf81ad3eab5153f8f2f18fb5935c5ee5e3a759f9b5af000000000000000000000000000000000ba1f2b2c3f1c57afa0ab647d32af5d036ef18069a4abc9795dd9927ea274a718b67373230e337cb9374ef73b5e2303900000000000000000000000000000000016458ff2f5d600af9d2983f535c965a2a8aee48c0d95095bee642bb7bbab8bc87e3e7c3b52a787c53f0d1e00cb4ff32000000000000000000000000000000000d11324e812cd4fa65d20cf58f88a9bc9407657834d7a92f80bfd32c7085ffa2f9f78d7e18c1405a03de939bd0dbb06b00000000000000000000000000000000144a0f4d50bcb16942d22a12d28bf34d2b4c51512a3f11c130f1566aacbdb63ec3984df5569f41ef621f50d138883d0dda609e1c8fa42a993ff355a70d44dfeebc71a801daa36acd437daec5d7b645d10000000000000000000000000000000000d7b138fe445d7b7e130134db653022ebb389075ffb62ff9faa544cd0fdb9e78e313d0b1cb19bd812421d38d1e9996d00000000000000000000000000000000084411aa2719b729a1e299fe8a710f767009060f1b2becf2aaa92efdeea8c91239aa5d2504c6e7ad2e3f39d89ef00c1e00000000000000000000000000000000017e86dc0146c9bbfa5ea1e48f49918167dda13b31ba73311fd5cfdc12845b95b9e90972a9a4d36203be8c5920f8de5600000000000000000000000000000000150e4b6fa9cd9a609241d1de8a637c6ab25207bccf8e5eff4a97ed633b67826135172880b118037649407a3e1b1a0661bc5f7f5d096247ababa51852724ce9ddcc6acc7ab6180beaa1cda97dba94b4ea000000000000000000000000000000000ad7430b7778248d63a06e26119e5600ae97071fe8827b24440587e8bf6887b646f342741af69d20e243c9b45d7dcf24000000000000000000000000000000001230cba1a5a66197875240fe00c59b796ba1db5ea5653cc76bf43d6adce0db3a109168593beb39bb45688c1d124b9eb300000000000000000000000000000000144652474c58413cadf9b31715152052b7618e7093e931367a7ed0340e66d84c0471b6ec178e1730cf10e749e01815780000000000000000000000000000000009abdd0210f25d12146f2911a60035867f59cc341b35c73bbdf8f7a5a90d0bb6566c6ba0e868a3d62d3557436190f3f63222b41a59f9551e91572ae00582e1e41989ff5f8e2cd1ee1a78f55c2b28ecb40000000000000000000000000000000018ced3cd0c169693368fcf9c3dfc49fe248f0b9b5511e9407b8634d8ed7b54ae2dc4ac6ffde8b3dea70ca86ddc89449c0000000000000000000000000000000002f6b227e699dccf7ab1e0b1cba4cf9f05c4dcaf9fee6cd94bbb79f42bc9598fa23eb2c653a7654db73feb511b24829f0000000000000000000000000000000019785959766eb8b00ac2600d87240f2876e049725680f4504f59db6642ff8f82d4e1b856929643906c3be7807a2443180000000000000000000000000000000018285acdf25a475b37ee4da872debba4297fc8731eede6b22be3b0dff12117634de44b84a18042852ef419c3ae18a46b7431e5c1fe5f8d38c759bc48e8207695a3cdf07d4c1fd02f1009088539085da10000000000000000000000000000000019c7950b01e15669cc1f96fd94957535f32132ff6a5ae788f6f660024c332593942bd3e9603f862756edd4f3ab17b20b000000000000000000000000000000000bf3a6bbe10ad91d687a135f4863ba0332e9b04271d437a6a4770056e6b1ca34319dc895f9186482bbbc815aead03392000000000000000000000000000000000a3ef4d4f7a15da04a91ff079cc40040993a90e9ea21f53e31f7dede52dd513a97ece780374c5f3aa8c8b2e525ee31d10000000000000000000000000000000017749fc7761b06432632ac686d93484f08407504e58b04b3890cc2101f15d21f46ec0dc1e9028c8ef8df10f9ae929887d474e755f6ce9045baaed65c80f5a686547089e8cdf4ad2b7c2ce7c255cb5c730000000000000000000000000000000005a36af876edfdf26175c185c3ef005530e02474232ea659f5cf251c5de5721f1b44a25714967d283525632789331d2900000000000000000000000000000000130a6f5edf94736477143b1efc316f131b36d9658c484821be08e7f5b9c93f60cf34042858664db0ff0240addad8782f0000000000000000000000000000000004fedf49e6d49c074dcca96c01607da2105d8053861b4c677a69cff0f82e66a2a63f32f3d9fac8e6c844a1f77055bf31000000000000000000000000000000001528541de3a9d4a216c0e60c31d2b7c7cb91b839fc31307cc70f18e9b87b92bf5b9a9dc4eaacdec6e6bf7791e547d8a2976c8775b0eaa1e4aa384d222efc476305c7ea2d625cf5c67ea4368d7a9fccd10000000000000000000000000000000013faf7b2b8514f77021d8927a3b63bb7c57785e581f40ca82882341c13a9daf062a26b668844e58291366ea6ae2f179f0000000000000000000000000000000009060f9e1047f15f175fe95cb0914f4941bcaf071f24e856eae6f36263c812689a9217da277613c10c8e254a0933c80800000000000000000000000000000000154619e4ae3901789ed3ecdfc76069d8026a3e2cf142a144e8b58482233380690e378de6b81af0ed9b6536da1cc2a30b00000000000000000000000000000000040c1bce922503699e1fd5ac67725f11d7f9bb6903ff9204412f65355be69d73cd7330a3f7bfcacaa9b078ba6b9a9f839db274233c46caaa9c99690fd00fcbfa4eaaad7c41f8ae84313448c787165f6500000000000000000000000000000000103d91916d537379d6d8717b17ac5b7e9fedd98c24890b51c027cc086458259767d989b3ff9d6adad72bf977e4d378f400000000000000000000000000000000159c01ee371622378339518217dfc0570178aecc938b4a008dee1a6661ffa605c0f1472c107558ea791e0959d7dc1c70000000000000000000000000000000000ea3e10cbc3a55ef2dc7bde7a2e80666557e9e8fd9ce77e2e92c2c70777afe43c23072e263e1def56cae4b6d3772db96000000000000000000000000000000000cf1db638331c47f9080c04117ddab4ba79950563810d50e04af819f14ae0981f6e1e94a635fc90226c8d7beef0844354ac9f9ed46ae5aca33af9ba1c0fa5a2138d4ca02b962fd1d02b4636114ce19970000000000000000000000000000000000095c82c58182ae9a1ba14421c2966d687f7225ccd192b24097f997b471d13b46a048202712cb2d8b1be0ff40755dcc0000000000000000000000000000000017410aca05935a06942f673d1937a593423cbbd226f6707c5922306d28a60396baa08a941122dd4c583331c9481a734f0000000000000000000000000000000002c1d3a1262ce8aae42a6ed10d8020c31a468127e1a59d57d2d409ca9d14143d9fd21353b260edd8b387840580698846000000000000000000000000000000001512e29256b6b9f5a7ba4f79dde2c915b162e4881856258ac2050f02868842381518da4ed824243692b131710d7201f8ab300ee55e90ac046dbd772da788dacddf72c559d9378b39507987a9774301b0000000000000000000000000000000000ff83bf1d50fe35bb3d1bcb07b02d78a1b44d2e0c6bf82c600feec3897fae8b93c0ef05006c1322af0a732392dad86e8000000000000000000000000000000000d70c4957cb3615027cb950e4224d41849b9ff1b435ce936384fe17c4d7bc2883fdbba5123ca0c0c010651500557e1be0000000000000000000000000000000008b16fe9af45fa913aa7e5d01b5b58f946004eaaeeeb493759a5bc2b192d2dd71af24ecc5c6838b5e267ec2dfcf5c17d00000000000000000000000000000000038ca027c985af3cf60cda13e770fbe4919d3a5b413763c8ad155cb4903312822366eb986f2ec9e0804594ad4894e468275b22db781d5e8fd07f36788bc1219c4b4a13554c28d92a381adae111b265730000000000000000000000000000000003a313d6d41f1ebd6b98b2061a2d85943e52d89e4b8680611d41ea182385e154da24248faa1563e6ad79172f91a8763f00000000000000000000000000000000038d9388fe9169710e1a205ecfd03f674b47ba2275794469dbd5f193a55e00765c8eed026363b41afda417bdd8910ea60000000000000000000000000000000007a75f53d9b8e5eef19ef6f5fe8ce5d5308a1a7d02e0bf46f91a1e0cb22555752d82d8471c123269050fd8f35a272f600000000000000000000000000000000011f313127a036403652fb2f83c5122fd12c362ecba2251bd6c357a964dd758eb2a2c3053dc668b9a4bc071898d45cd46ec69b95dccdbf193d9ee4c51615c0b7be5ac6bed3f2559f0cb2755c634839ce7000000000000000000000000000000000a43335eb6ff3bf2daeeb1eaf44c2782eeb517e82e55203a247b7a396e26fdf85f93695753c52c68819b58c95f361820000000000000000000000000000000000c240b7896b3dd0c318dc9ffcaa001d20bff288def3ce42752d660fd705e1544e292a5a0aa3a9a80ae91cb47cb938989000000000000000000000000000000000e5195bcc4ee8b149a769322165b6a3157ee7d04546643390adc812b6296675dbd31168b268df869a6722a7c8f51c79d00000000000000000000000000000000004af7dc8a5c552f00d55b996d193a9571173ea829eba8fadfa7becc2f4149ee7c6c4d2c8c7b1970df33cc56e450657331e2bf1816a84c190eaa850ecfe1a9376123e0d0732d90ac3537668f8f18b9f70000000000000000000000000000000007860c3403607d4e13f738357e18bbcc4df10fad4aa25776f84d3c2758624a83aee0996146ba17a812384e1d67a7c54f0000000000000000000000000000000002169148d86b1f7a0ef75d9bd19b6d7cd66da4293fcf33fed9241544dc2564d980161a6bd959f3b43569312bff7a23cb0000000000000000000000000000000001897c121cbf5e82424cc50078ca7143a0c670f1217a9180cd2a4700e06aa895cf84c0af94b7c04bfce047a7d1f8443100000000000000000000000000000000040c1a0c4257f90bd83fece3c9372842a148132d2dffa956729e741ce996d229aacb04387d51a72630329230020b2235f4087feda4bd8205d96cd0bf6eee44c27a6669d7ae8e16c731849cfbb2324e1e00000000000000000000000000000000058c001ee1343c6cde55bbdc4c538f5d14b0e8c199fb822f080ad96ee764bd1908f92260ce60cd521919f223301ba1220000000000000000000000000000000000f8943c35e7fb8b58963719f1b9820153e0831cf81dd208176af7527781ceabcf6ed2e2276cbf374e0525952bace0c80000000000000000000000000000000003b43ea8c32a13c014b05326f7b4ad5b5fc1bb2367866a69373ba91402f4b45409c6d034898e8b0ec3b93c2878d59b72000000000000000000000000000000000101c371ab4d57ed2cf17dcb731117b1986bffc586529fc1edc630de1c6f4fdff1e10b0895907bb81d2ccd3eaa96c04a67b81583fcdc9afe5f35974dc9b6310ee8e1c92031a49c08b05555fc0d33517f", + "Expected": "0000000000000000000000000000000007152d538d0f750901466c1ea34a16e7b0e1296a2a3740568812587affa5c0c76ca2055804e24f3415a403f06a717c0e00000000000000000000000000000000119c0c282d22a01524d87eb850789c4816e7dafdb2782b57c32409b1016615beeee2067443835466283543773cc8b427000000000000000000000000000000000d68137c3df081a519747c044950c3231ef82295eea5b7040843668195d4549c8ece4a91447e0ec89530bc51277535fb0000000000000000000000000000000000d81a4fa2d32ada3e08a7bd4471d45a6afd2cfad5bbfa3d378b1df2e0749f9b05b465be61cc9d1a0f4abd56dce03dbc", + "Name": "matter_g2_multiexp_37", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000004b153d6554c9879359052717457179d8318f8127eb73edc1d6ac2efb1ea9643c4357cc813d1df49730b77f995d6d449000000000000000000000000000000001533a450737b4bf8edada15446cf21ebf82aa7bec7943025dccc4784e1070fbce430699cf3a37a36a3ece692ce87639c0000000000000000000000000000000017b8afc300bd70a3221120f6fbc37a8e6158c48b476f00992c6f41808036765071bd0a76f7c641443b97ba523153947e0000000000000000000000000000000012f686b4759a3d5db2325508f148bfd6217e027fe261d3ed7b8fd0526036044dfb563e1c4399ec266e140ca372120e289f3c65c2c25c6c37aa45b1104745cb8ec511a165ffdb7e304f5478aa3add4d7e00000000000000000000000000000000061c8288b7bf2856c075a176d1086fc49f0359ca3e7c1aaf5f151e6462916a4e1b69b6decb18823759b620f7593079c0000000000000000000000000000000000877af18cfa0d029e7c9a5833b346c7fdec06e54d9641d3953d3cae0e8912bac7c990f8864c2adb6e576442c634865b6000000000000000000000000000000000331490f42993de3ce7cdd53afb4b310f25881710a23f601ed95961bad4e9cbf57d3077803908a91b65fc32d1a84130c0000000000000000000000000000000005aec079da804fc572bb8eb867acb93a24ffb6611eba920d2ce799c4c80cd8e73b3cefe989885167ab685365529b4f2a8fd50c46bade91a13d6dc5a06ee62e5e89e0ae7ee885e5516ca6c2dacc36f6f3000000000000000000000000000000000ecc7abf4f6f9692cf3a118cd01abaab4754c90d1a59468d402bd699992800c2994f47b2094878604bf7825f125133e4000000000000000000000000000000000662396427cc596458e880bb8a43dbe046deb85601e3c64556990de36e8637e8ea3b142a8195762910a83609ca311c3a00000000000000000000000000000000198b9c52be68d073910f5b26bdeada9e9b308e4541561a8ffb21fd8e69ec9d93b01ec966fba65be27ee53d4857a43e120000000000000000000000000000000005201975985cac810248e333ca714cbcac0ede46bb915d8c857837c80c805898d0f9ca0940819878a26d269faa02cb86128db1a106328916ca5d63c0b5722642febed26f00a89430d52ec3eae25a019b0000000000000000000000000000000004e61ad4818ea3c98ed3c0d247798a1a6ca6bcb35a1cb60bda9394272ec092c385661ab93a42af439f1b55ee8b9c0cd4000000000000000000000000000000000ee0b71ebf39e4009bdb310fe3b555cdc860abd47a67bf481ab36b5ed0c00bdca8082abfb75691d45e10c2f2d777be19000000000000000000000000000000000e9582e3b5bd580f3ca7ca1f58e39379918f2d04b82b418a91e133117a9703f7df4aad30d48a47e29aeaccf5b8e33559000000000000000000000000000000000113b4c068fd040cd3300a2d1ef658955b014e571e7c77594edd31968037c1fff241da88e7a88669a569462564e28cd7d45665afb6a864893e389511a0f7b2df74c9e45a86fb69f6bd79854e3a88c206000000000000000000000000000000000d8b0bf633072f19db61ea263a1dbeddb326738396caf1196e31e2cbe99a68e8c70f8db13cfdfa4fc4494e54c1ef28210000000000000000000000000000000009ceaf2a0c63604afb8a903195933fd1ada0e5314255be3d74a95679c7a7845785e22d2c0c206f3afd62110ac9810c2e0000000000000000000000000000000003a135b405f46ae3f5cbdd63f4964cdc5014c9f3405c2062ba17423dcd22b8f2011638d520ce0ec7bb0cb5b03e8ec01700000000000000000000000000000000066eafafe1cea67aa6de267c767f49d4a3fd44c28d45a920fe9b3cebdeded883d8960f5e9fa4cc179246918942b1428d28f5fd09c2c1819adf8e6d0e0f4e4681babff46757edeff3839e9691888c13220000000000000000000000000000000017e37a2f1c892fdc58ac3f72cc5a5e2b7c0c87333afb06de89f7a84b1267695bcd452925fb2f15f8b7b20aaa85a6b5650000000000000000000000000000000015b2919343962337a41b54076d6735a093190e1965faa33eee800f5eaa43c35f349aaf93f19977b6fcd19360b27edd6d00000000000000000000000000000000161afb1494482f953007038557c847e2cbf84c57c5f5b806e3b0178e71e3238305f733943bea7ad6f2bc290778638e6a000000000000000000000000000000000c27a2170fa584863697292e626e2539aa15f3c8eee65cbf1f1b7ced6297248d059fdaeb9c955437a51cb016d1ee97c3e6e61390ef88f20591570ec1fe71c3ed769ee8e234c7cc7303a4cdc065717736000000000000000000000000000000000313a30edffaf864d0f1c6bdafd7d1e563cef434d45e71489e9f9e4cc6700e44991a99220f53f0cf5e7de5f6e4098bf20000000000000000000000000000000010429081ebd2ed6fa07de6ab0b7bd559a26a43df99fca0a2252411b4554dc69821ccf3df1b05114da84a616ccee0a9c800000000000000000000000000000000131a31442f80da4621f7691664e9f8b467988fa039bd086a2d64f9810878b557614c27745b2e821016f648ec36ee797d000000000000000000000000000000001160cef9f5e4d022baeacdf10b3bf9d7ed5e50627a99e29df1be3667cb872b2af333f803bf426314369b490c2eca642aa83c5af2f9d10c06552ea7d1749cbfa7574b238433c1c0e4788efd0cafeffa57000000000000000000000000000000000b20ec53bc643bdfda1e3947b3773d748cce1992e2ae27c6b7460d90d48e08eb9240879a5a7d3dc3189f486706438dbe000000000000000000000000000000001024bae4a7f71d3d2fb8246e82d95664c4ee8bca4a380c293ea084f749911f984aa4c6f266ecfff69c4f57e20c0660ca000000000000000000000000000000000b58472d81a9f16d2fe7af87170ca0c8c51dada62a4b2a713cae053a0066fd268283a785ccf269e05d8873cd686d2f4a0000000000000000000000000000000016b68177bce92fedfbd90cdb752bc332f46fde6673911c016fb9cff4912d79d3267bf629c33097cf8979f2b913c0936d4bcc88d85a5a8a29dfad37ba97ab3a5defde4ec356146db8d10f33bfb36ddd37000000000000000000000000000000001030d5791bd2a27469d242c62403883ca167303d907839e608acd827b4118b752840a4eca0acbe5df0b447d6651e517800000000000000000000000000000000106d65f922581237f779ba3e66608729dfddb2c487bc927f34e5e39707f2c8a82e8c96af68e3257c7a9876a05a1b01d800000000000000000000000000000000115bec40b8fa914305b1d5a85b65f0811517d36839494ba69c929fc2422f7e8b85d78df4e1687ab0087287eff29c65430000000000000000000000000000000018d78a75ec057cfcf179fa2ffa7dba79cabf6525dabd69ab95b23dc8f293aa077e46e562caf447dd0913ac9dd60ec76b29d5d818e62c9791c320e01a3164e142d9804e9caa7f96b4c3b76baff38ee2e600000000000000000000000000000000023f7736d6de94b08d9e9efb6f32f8c17cafb1e1b9b1f3db6e58df72a451c3225d11f4304eb0d702b07a7966f95a11fb0000000000000000000000000000000007b3204f258c873a6fcb48d0b36c98ed5f99b424cf4f92a028174e0e93db2af549648ea95fa8c7bbb42b2a10eeceaf8500000000000000000000000000000000165d6e769b7df91374dfb44e18d43e03ae12ee10d8a618a20f67332cf96492ff514eb7de06ea53096e823770c686c32700000000000000000000000000000000012e69ca1e106411165c06ca15988362de583c4a05425e2f4aba4c14cef6d8d04c52c87b4fb26b1557801f55b02ee8ba971c8aad41e401ab6c49dccba28ef26acf4961978e94e633b72c581ac03621e4000000000000000000000000000000000e8e6bf1c8837c31446959242285e9b85978a5349e1f0b3447e380a7bcd6bce758bc6192cb880f9c09d6ad4a0ee36eea00000000000000000000000000000000199b361ad0b435d7a66b46a43d06e5898376a6c260b68c965f7b186fc75d2f321bf883646e7551eaba03181907d3aad1000000000000000000000000000000000a76e3f399f31cddc4dd4bc22187a68fba31fe2371291ab515d22730d320ae4240911c755750f687c7d26aed09da4210000000000000000000000000000000000cbc8dbc004b9253ba91b2238c92bbf7883360c7ce39f6e15592a8668654950a3fc5a94cfa97f5ddc60add40c32a3630659ff910eea5280dc5c24c542516053637a5dbea576a94a22acefc902e56568e0000000000000000000000000000000005448b623604262a9cf1a9a292c36738960e132bcf0ec8e61a510008c2ae0b51b31da25f2bcf0d7c0d4ce15b1d7179fc000000000000000000000000000000000b61df56ef891bac07a873571f68fe43f79438a31038cf8ff97393ba44cc47408e5a6d64e9ebddf0195bf914f141e668000000000000000000000000000000000d196ced22ddf11132bbebf6c85bb3006a194cebca975d74992ecfcbac546f0f25a39ed5d6100768c1f1a791f3604d12000000000000000000000000000000000f727cb947849d2d7b046218f084283e5513e8582229085f9f98fca522879543429cb8ab435aa3dbf01b68ed258d82c112ff32d44eb442a711250875d86a401d0dccc95e5ee39bec71738fd812d487c6000000000000000000000000000000001044bcb16b3384a1f350cbd62bae568c96932a364c16b34d91ab9b1035ddee93a02920ab4dbde2c6f254031909dc3a450000000000000000000000000000000004a29aae48210289e5f588aede0756ddf60724b8ac54de5d9159ea834d5da98b7a9d09a6f37bcaeaabc559dbdde58b6800000000000000000000000000000000112ca953b5ba652c715fd20e3b85c5bdfeaa7d577aa49aa4656d142c9c2afa3d8aee151338f59a199f3c0c3f6a430d6a0000000000000000000000000000000001ebc7a17da7809f9e744cf7f13fc437de34d3472f022493f58bb979e2282368f989ca0982098a7c377498f1d8d32583666b820fae2459b98f9bff20275a3c96ddcaf98a78f3f5fa4a2c0a26cea79352000000000000000000000000000000000e7c3d6bef4b1723479ab6724cf7858c221993357b194e5055db96b8168f8d78f72aaa4a2046be17ae9a7eb00695ec510000000000000000000000000000000015e85e85cec08133b86738e1f7a738de455930ffd5073997a1f1692c28044ac00b634b90eb24938cab56e286ca0dfaa400000000000000000000000000000000164646a4767ed69f9280f96be9a7f988d17c187162554239797436a0bf4c4ffa7e4f8387c3d2406a7528c021f56081df00000000000000000000000000000000197b1080bf3ac3ef7bd6123a55f20f1002f366d4efea9e14ed92fd2ef147e2b5d9251a302a85172235438bb2d35943a740a9181633a146d7f307ca7606cd45b8e721c46b955a6989d421baafd8e40139000000000000000000000000000000000db7cfdfd58a6ce9dbbcd5d65cbf22b5e1a81acc70f1c85651ba962d61fbd7ad83e5524fb9aa019c6bd75dade96f7d4e0000000000000000000000000000000011e269a390fd15ab1d52d38de78ec97eb6202604fab02c4598ecebc7635ac91ee564e751275a485fb43b933678f11fd8000000000000000000000000000000000b8597a00d2401664405dd1fc7d69786353c86cd4699af981fe869f266f9087b00df22a46ac34883173bead870798f650000000000000000000000000000000009117a49b3f2a8a850a0179b558319bdd19a5f1f4a45af0ccad0890e63b222d028536e9bb612093cb3f1068d262af90d662ac80797c633d8b9c8907acc2960ebdcb5bdad82d9fceb4411d5173b7411fd0000000000000000000000000000000002e1311abb9df5e4d76959276b6f725f13728844f8c7dfe5e25469cb95c6937a822282b3baa38817e24a6219601132bb0000000000000000000000000000000012820e6ddc50e19a8f98c15013ecc38901a4ef8ec2b79b85c7f7913da24404afa1c79045f1318cdf271028126f9420a5000000000000000000000000000000001794e653c5673e51a3ace631c1a1265dba07fb74235506b2149d42b90eb16afc26ec0ddc54d03f7ba2dd6a2503971fee00000000000000000000000000000000112479bdabb9dd057b325563c666910c01ef66adf47aa32f5a41bc9cb8234750985c266fcc329ea3704e2b8d9b15bfeb59401af15d9b83e2ad68cc8e2ad1508391516ba0b26fcc5ec6eda8b318a374b6", + "Expected": "00000000000000000000000000000000168c90045dcccef35cfe8eb642924ec2629db886366fd9ebc082019690d103627865f0dc39ffdd2167111f68d8d03c89000000000000000000000000000000000b6f0928a32672983664ad15252b3f145afaa04f11d5f43a6169a2fbdc0b0a04902a183b25e38987c45579ac6d11011f00000000000000000000000000000000195c4d796989630f85df4594eb8353d44bcee76d82b73ff7a57069466337b49b875b3c1418d22d79716ffded7e704a6c00000000000000000000000000000000032db644ff8ca6a3b1ac7bc51ff783ce0cdb7bee8b2c21dcfd3adb56a3e210390756211f22feb3dd4f706e13e5cc163a", + "Name": "matter_g2_multiexp_38", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000c675cb5e90e45300619be91c752a5831ec47b4143c28330422cb57139882e776c1c5f000d6032cd87c16ab3b1c08ee0000000000000000000000000000000000aeb4e78724d46a55e5f101564bc05e0a1be1d80a781ce8a19607322e82c7ee59db9f53ec34c70bef0766a5b965f54b1000000000000000000000000000000000933e8d7c2420cc553afb1c88b5f64c7a39f78272b34b5611972dd5ced3f639ae2ed2aaba470abe829be6ca6d666ddaf000000000000000000000000000000000ac0a9b46323ccabf4b2024e3a5b4717cd8de9ed7de8a78e33a38037f802651a4b43380a746890d93289d547d94b61bb9c351c585d1920b8cfb89a5bcd72fe041b17f7bd091ba505b287778b0be4e87c000000000000000000000000000000000196597114fbaefb8108c185a85d0fff0f6bffecf056902b22d61cc70b49a747bb35638f5b663830a8d2ee15df9fd5a1000000000000000000000000000000000616ed44a5fe69da994e2ada03a1e09065964223333229f5f30ba7a452830848f599ee21810a95e3659cca495897bb710000000000000000000000000000000012d0631e524ee9d3c776c79137499f8c9fb752ca93e92497d89973033d60971da23f672f140c1a753b4d00d08a00babc00000000000000000000000000000000111159e95d131c8cbe8df75853fe9b3f24013daa083e57c5b716e77f6fd3872dcfe0156382c9d2778fe886621be19973ec42da11e95cebbeed0ebaecd31be24801fdec8b81f4046fea52f553c4e7910b000000000000000000000000000000000a7d253487591fbed97381b3a430404b87aac04073e5931ee0bfd9ea6e0d38a41090c6dc7f6a591336fc58a97a3bea8d000000000000000000000000000000000647c67f1816ae6fec39033c3169eb1ea89e5e20e755cfdea33572d6397e7e87635c7439eda4912361a32de313893206000000000000000000000000000000000e0cbd54634d070aa3c7a503df1171a5cc435d050def17395707bdf7a61cfd539348ee5a4c29c7845cbf0e5df0531f530000000000000000000000000000000007d006601dc1e092a616eb470be35b5d32742dc6a2a4d71cda8865f071dbba9d8a3a8cb10b486253b1633e4590e716dddfdd8996780460757702e34ad98f5f64a8c1e0bc8851d6c97f02749b8f77cd03000000000000000000000000000000000c502a19770a892b2fa1ba59900a36c0ed054a8bfa0c4e32bf471b90d0da9edca6c06b133c8f12e233b104262a81dbe00000000000000000000000000000000011801f159086d07833a691182595a42645513d316c084b2841445c4a63c6bbb402664a9a9a100e8d6436337ecbf398bb000000000000000000000000000000000f2b9bfd8ef6286bc41e9f47ffdd3efe437aad553c9da02b3c22ca04b5578d634c0543a07bea966bedf345562218c2190000000000000000000000000000000010be5ffe0cc9f580c74e027aad09c213189fa4b7aa92160ce813b8d398b2e2803294e1a730cf5c891cf1546c6bc91414f256ff23b38b3b986a62074c5a3e05e86ead9431fcdeb67512f6d502fcefe3c300000000000000000000000000000000132cd5220c125759a18c31313592eda774247f97b5134111b01ef28dad5c3ba4d3f13d1af9076d663f7e217258a6fdaf000000000000000000000000000000000f06a5b03daaf8f92f9a302f06413044ca0dcf2be81d9cf016120312fbd41b273650fbb542d419595fd2815a809c4b960000000000000000000000000000000001b11acf12cf46e40554a1d6a833566cec1b2750f3f72ef77496477831d5933f477d59463ba19c03dfbbbd02fcbb680b000000000000000000000000000000000b2aaf91827ba923c8a1c2fa1d6fb92384c9f48f8f77273056b94245114d1f3cf66fdcab330673ceb2e9dad6c1aed0d4c01b3c8bb0acb17198bde9adce3b0f7ed4cd8615f837aee928524b0984c99d0e00000000000000000000000000000000051858339be99d1271152bb390e9a2ec0c0760b7686804ba072c46db3cfc4472404a9f87d868a28f2aef16c9e989d6e90000000000000000000000000000000019a33f21d0bb8303f540bf26816f145360bd1e9a8229dbbe7981f1cb5b099e814f2691fadbeeed8e4c4b772bbd27e60600000000000000000000000000000000073eeb49aa7e601732dc0888ae6b0f5e8dde3d97b818155221f5ab8c599eda75b25c86f15ceecafdfb9ee4abe3419e10000000000000000000000000000000001507073b97d494de26e70f18bd1723d931cd2a88903ab6da2aac3b80fea78ce75caaa9b99375780d759fc4a1683950bd458f882b63c99ada33d8215111a6df21c8f7424eb2fe9f429256201d099413c10000000000000000000000000000000013b5422deb0e80bec71309d03fdba007eed33c3ce0fc6d4f9a0d063136b3b85a6fce90ee59956a9b91e1caa519f813e8000000000000000000000000000000000829a11eb50f3bb1a47b72cfeec9d1f63e02b9f7b2592174c481ea7b72a121645ecb36b3d1964b082bc6c7efb4483a180000000000000000000000000000000003d3aab53814f55fa97285af2dc6d32cfcf5a08032d2c15ac83ea036603e08a53e0d2b8d93a25dd969937c113e78064a000000000000000000000000000000000c938a68688138149cda64f168ac1466c401196eaaa44a464d9e345c422948767ad1e25d1ce4cc5996ac5d5dab61516b804d7a35e5731b111a6904e0998d90ce86cf612914152fe3d2fca0201a41166a0000000000000000000000000000000001ab96f0b60213855fe221fdbe2fb22da6bd6cad8bab8ecb747c9528d3511976236ffefb34afc462abfde13a99503cb900000000000000000000000000000000182fb121778cb002be3f90e2d6837a406edbb609bfae8fe59837aea6f5f6131a10791f92188958b57059b7b9a9d3a24500000000000000000000000000000000159cac269098d223ee6d145a4489f05875b6a546767c023dbea62b3cfba9f8518c9f4d2594d00ceac325f3d8ef551369000000000000000000000000000000000c0d2e4e7aaedec7e53bfebe8f7fe5115720e58768469b6673cee3473b08fb8cd1ebd0514689ef65d78d008889e3ed296f1629a801db6bb4066588ed79f75223120728c3a57f7129d88f7f877149223300000000000000000000000000000000079c40bd7fd2ce0f48806dd2e88850ba988e5adb0cc5120977da8110b07da264318fa034c0c213590a2616f0ebe40f21000000000000000000000000000000000905f41389be39361fbfe7641394d30870a079f230dacef89149fdcf81a4d1e0e10b9fa1c0c3ecadced9aaa19fa9dcc800000000000000000000000000000000192f50e08e497f902403df40a504a1b4b82f1957572a9ab7ef97f5ab93c6fb876d8b08f318244cba95ad5200fc2a6e34000000000000000000000000000000000be7ef45a14871dbb344a69c4036af4f994a22ef14540377d1144a92978a23c2d678cca47cbc18e8c036714112d11f7cfe80ddbcaeb784e24975b9a42801c89bdfb842cbde5fbc0c3d70c0632cfcdab80000000000000000000000000000000018d7410f0105ff03cc4ddd87a6e0b65ede4abd4609db5ae53720851c90255757e63c6482de4651eb1d3669b1e1a2f8d9000000000000000000000000000000000d4223be106693a672da890b64d2653135119983639f7052eb32051c34113022080ce2355a93a2f64a75d8e0578b2f95000000000000000000000000000000000764780391249d0c987270bd181a44f6260ef82eb00c06585db7ef09e8b069e46c4e0e659a081ab0fda491534b71b0ba000000000000000000000000000000000a8546031e6466ae43643462b7617703a63841d6d4cb0c09ce63b2fbe2c2ba7cc35367191d0313717b1daa665bcb54551aeff13de7bcc4bc2ac1b37e28ce466805757dda29c9c743eaea9da33f47f4fd000000000000000000000000000000001922491dee4e0f29a1dc090c9b48fe8e6d70c3441e532021985932005b22cedaeea7d9ce1796808d756b740ec63f8ca80000000000000000000000000000000005b34dae0e630be6a59ccae17b44eab4e7f10be2ee700bea15f9771a724f0979798617e129540901a8aa023630a446f800000000000000000000000000000000095bdf612289258b31cc79188566ceeef6fd66858b4dc060864d378cbbb69f951e9c6bfb3d1384014507ff29f9446f410000000000000000000000000000000019f06f11a833c06c1c9227255e3a1d74172e73b06675c547844065dbb909ad66bbc150ba396fa1ba22b7183c0fe80e96c4984739882bd2f882e12660815b96d2af7812d7ae87f5be034b88e9e04fa2890000000000000000000000000000000003de8082f828ec51e23c864a16147546ff60b5fa71897ff4c120556af5c6616bde96b6e53fa673cd1f8af503070bfacd00000000000000000000000000000000093013f75b6a19b5433b3b5ff044384ddfa258420c80fe81e0424e3102cbf9e550a946e56ba9746423ef745e33da51e7000000000000000000000000000000001227cfc3e9a8d6a71738c514c05766ed4f1f4605198f5a3ad8309c0a49499e4ecd34ba1ba7677d6d90203e54d7611807000000000000000000000000000000000a635221d514e58170ef299eb7f5b679050ee24c589cc7e348b2905a3cd1b7bcf2010cfe168f5aa60f4bfe15e59b4436e7f33141d383a1a927b7645656ff7a5795901a997e27003c5672ae4fbab4aecf0000000000000000000000000000000012ff0494d308d3e7321ad4c4000e9dcd19552d5e4bce8504760f066e2fb2509279b01f1568e3c3f6216bd5328cbf72db000000000000000000000000000000000038c6e8f0fab30b5c8e4323c1fd29527845c29e1a26c70b8e5284f7ca55fb55ad4ad5389b5280927b98907132f26b76000000000000000000000000000000000aef946b9b9e9fcabb36507c1cf441df2f5ccd71ef9281dafa5e25bf07d69556e4143ab402dfb38aa756bb6ee009a6890000000000000000000000000000000015f69bc7b0a6f2cb64fd0897b421e339fcc8637efced8bf33f5aed809a38b49a2e6376d18b1bff0ef70df1b7187ad048fba4674313a9727aa4b733832a0e06666d3e38184836edf786317de9dd055cbf0000000000000000000000000000000009e8450887137cf45b04184b3c6fedac6676cad416a7646e9980dc99a6d6b62164dbdfae7cc20edaacb84432627e6e550000000000000000000000000000000002acbd87ddca9dc775da01ae026f1c60f1cb5974ce40caef80cb0d2eb7839777c1f61eae0472c7568ec9d0ebb2ec7dd20000000000000000000000000000000017c295c458a9dd995d848e3ba585f8dcdec4185a953e4b8e3ca760eb3e815e39a8ff60416e1e6f974cf7e7b086ee4baf0000000000000000000000000000000003cd8725e1cadfbd80585bf5a19e086abd631d6787403edb4bbc785d1a81f6108f451ff642f4df17dfcf94dd6107352bdc0c4d0e34d8a16b3bfb51ffc9b3c353817e8e357c608b5075c173204963606e000000000000000000000000000000000b3cc99db523b3647937b694fc23281a74010079351b2c7d1ae4cc9167917f06c06e627c4ec44af6b09f2886ddf309b800000000000000000000000000000000001e2681dd123994627adc92e6ddd3ffb006521d8bb03040fe1989e4f709e4797d143cd0bb749de33c8109933c709e970000000000000000000000000000000017df13f532bc9894be932e72c609c0386d32390dee95dda45821bedbc1067043d46007b39b6ade871bd36d39a17dd04d00000000000000000000000000000000162db4d1e956fa5b5f9ef244dbc0c6d27718eca7dcc512d1d7b97bbfd2bd00cce7941d1b9a170da6341891773a729e9ae4e31f5b6629463311b9d3c8333c33c5b2e79761ffff9863acd9d636e1a9586a000000000000000000000000000000000f0e4b606ba0a175bf57d4478aa286640ce4b5507f9f9e354fd96c45443333f6889a93012d663d78956bbfa7c645bb9d000000000000000000000000000000000d85dc4d733f0498fcb10e1e814eb61245203d6c1a46181e5a388fda2680640a1271a68d645f8fb179c0dc3107fb788500000000000000000000000000000000185b02140f6314cb62bd7977042ffaaec41ba8788d356047488004d609ae680c2f0cdc94e59a3cf90b6651298b6a81d000000000000000000000000000000000038ce717d08d367a9f882f2241ae4cc0e8a31418498bf68d05805db2e162d053a10dcff85403dc473598089a78dec27e03f256e58f60307ac1888a1b0b14b56c7435213e271eecc79b4a6f88d102be4c", + "Expected": "0000000000000000000000000000000004cb919a72e67c31b3409c28dca1d57833a5066c240d2889f5bbdd5540ab2a49484c2462b25da197ec8d93dc8f26ea83000000000000000000000000000000000e1ac1dfcfe22ed7ac52c701a7221b542ce72bf59d62cc49f95f8ba64c05060671098d40c83947dd1952494833a19b55000000000000000000000000000000001331f6ed8ea5ec9b9e1a14997c2c9bc9af2ca305b313e2bc5c5bd35308b7b451a362f8ad61d636dbf77d1b2388702d8f00000000000000000000000000000000186b85e656e45cb5ac9a2a2009353e45749b53dcdcdad4f378431a0e4a317652301f834617e14dfac9836c3c11512aca", + "Name": "matter_g2_multiexp_39", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000e6292b4d3031fcdeabe62921f0c562606b1ec6139b9c43938971d7851da4945cf69f39652425396ed1b2e70e65b9f55000000000000000000000000000000000e94bc63f3b8944ea6bd7bab811c013fd61303aa7713619faab85a271308bb220e2a94b26f5c7e4136a3d2761dffea610000000000000000000000000000000012313ef65ba41f8e0a57e9b810c13d23241e8430c6ab967a1a9bf5bd6308e89c135e00e789a5610694d146840fbd877300000000000000000000000000000000165ce83af7edc9e701eb57b332597305fedf4b939f3a13a95a0bb3d119c2a9204a4991388f7fb344ec8f15d32cab0eb5eb850f01feb55bb99e4accee0aea8fe6ed0bd29b2ca942ffe09456733aff10ea0000000000000000000000000000000005a88477765bbc8290b7eb137e6de78e62bbd929ca511cf0aa701f926440f21d33bcc6ac8f2ca5de57ee8116c685ba38000000000000000000000000000000000738074a9365c707190f882780b27dbe96179224103392b86c628b601e33b092a03e24a89bb6d1d1024862a9df6fce8d00000000000000000000000000000000188c713945046771bf852155ba412b4222173b6dec8320ffd1c59e9b36943c2c18b0dd3bd551b7b1367dde3e8031201a0000000000000000000000000000000017222294bacd664ec37e9b214407e5325eebe9753b430589de2eea13360783be52a479e2b0e9c5dc4907dd5f06a7fa822b373fd7e5806d227ca1f49ab0a7f8be2b5950906c8974de9f2cb4e13ed20a9a000000000000000000000000000000000c97299d7e18f41e538b91b75e962c3ce4e068202271b40469c58cfc477d7820e90a0e91d647e8ef5fc0cb822daefd29000000000000000000000000000000000bd1e11a3646c499a240bad708f97a49acaeb653aa5bafdcaba41c1c9d32d32c516c94a3db8816e0a43d1b1eceac7243000000000000000000000000000000001223ecf82c4622653ce84460c39afe8a967cbd87a2d75cbee1609161837c15b522480c4731c9e6de9c5c392ef1db18e10000000000000000000000000000000016c5e98d3d17c723548427868e3e6d7ef4bca339e41acef19e0710459bd4732de4a556b22cbb49b823c4ee656fa354f1babde7f3fdf9fba868b5eac61337be0d73517ac3f06c39b4eaceeb27ab6311db000000000000000000000000000000001125735092842142cb5387f1ef8fb69a3535e1f0ccce59661183d3104ec1ef79dd87a7fb36159bc67bd73ad403b46c1500000000000000000000000000000000162caf579539574199d56f4e756f1532c66278a55b4f67f4f4090368260f46023543a8a18d49e8c5783cb65f93d750480000000000000000000000000000000003accbc87996a220a625e36d5cdf05d8c16fb353068ad819f94ba8223cdf6436f8d822719153bdba620a07c5dd955fe5000000000000000000000000000000000b53c8a4b62466c998327e0c5ad65818ea383650bf0977d98a8a94fa9653fba276f7781af9f5a4e99052ee3ae65c283d5ba1635cf82b25b2d7e466717f5716c33f5f3e826bdedf19dbc1d95ff0c8052e000000000000000000000000000000001264608a59c0ee9a26568cdcea8801cc8cf6616773bcb0971234b2d987563270c7b2291fa035c8f2069ac99e16c68fc0000000000000000000000000000000000e839d8d982d6663ca4552527f4fcab6ad5e0a444e7b5921055c774871601d342a151133ae15bc76c023b7ea643182ba0000000000000000000000000000000012ffd0696b7e29b305412fb840c596b66b77ac2eed936fdbe0562541e4de6b3166a9991dbdfa0f79b78b4b86f11291de000000000000000000000000000000001777ece357f82d7303aa816237a0dbd3a1398574f4061dd2fbf6b32af38a65abf5ec9bc53bb8ede932db9cfa0842d53a1a0a832e5bbdf897553c1aed35fab43aa3f4510c1782115e14e5d56229de2dff0000000000000000000000000000000002b41743325db9550c3a84af80bc20c54b8b0b685d7f84d05d14dcabed2f450b91675aa8c5c650eb81151bcfbf1603b4000000000000000000000000000000000f3d3e69d475fe1d4259f18f193cd84a90b91589a6502588106f0a577d1c1dc4b2feeec20a4fc30b3e403d6ca9e03894000000000000000000000000000000000c10e2bd1335363fe958eb50981b99bfbadfd1c414830857b5257bc8fa6e26b50989d9adb5b3a2fa610b3151f8754309000000000000000000000000000000000008c825371319f4ebd684f76b567c4e9a389dce96068c101568dc8cafcc10896e3c20202b591a344d9a1c1be02310be9b75e0582e9ad7aa4a02ed5ffa22e55570c9f20e6a24e2186e8a2a2f838fa45300000000000000000000000000000000101d3f92fe64af93468229608007f50e3406719572acf265fb8b2a7051525a9cb67cf2e46fc8e098cf081e73f3b20c770000000000000000000000000000000017b1422f8208c2521e3896820b22a65bb2a9b47d7fdcd2ce57196123c1ce43c1db6d00f236d7582795d00ef33ad6d585000000000000000000000000000000000e261500a9c64f5ae107d6ccb57fa9151f5321ef4e80f0e271515f1eaaa5e3714c59bf97b39acca41b15d90c0505ba9a000000000000000000000000000000000c08c955b6df18444ce3726711d29c2088721fa0aa6e317c52a05f73ec7171ef8bd61047174c74afa1dea804c68a28e33b7252f8f3cc6341d490c5c4464bb36e012f1b05057f405aa907ebb2c983f646000000000000000000000000000000000985cdfb3934e0484805a1965984028d6c459654a3eea6ef66e867dfc737e1bbcd92e31020d5a4ddb7f8091cae2371f8000000000000000000000000000000001998c5682209153a261bf981e16bf1f7a6f8e5e566c1b0f975253ea62439e5b36c5e5060751f21941edf0d348bafd18a000000000000000000000000000000000c8822c1d6412bc45fea05faef33c65d5a6dd13aacf1279b9cfda2a2ee34df3146d45e3434ce8e5f242e9cf7d3ac27180000000000000000000000000000000019191b51d6664a3047aeb5590df2939b2cbb115ded70fafc2de4c2e8c2a955a957375314081a8838bf89d5a140b7b915f10427f6e461e7b63b781e116a4d5136ddc79ff86b71fa754f00c797c035412b00000000000000000000000000000000156fcfffbf01ff3c8a97e7bd99e59327d38c6f7f1083d068ae158d1901808b3c9ac96f95c2bcbdf5f74b36dd8ce58d7d0000000000000000000000000000000014c64256d1cce124c01fa727482caf8ccf007e4ae00e5277d984f31a11ce584e7633565c61d47bc8accdf7c28bb266b200000000000000000000000000000000052dc9f7fce4859c852d3d9e1e77bb7887ffd35d4d550726632acab3d4303ecf8b3ec7f4114dbd590ac20d748570899f0000000000000000000000000000000017abd1e5dad7ee06116a8131c05c9b48defaa92efc636ee34a2970d701c02b6be0345a58cd8749e582ebd105c02f10a06440c89f8b10ce15806938b7ad65ece194d2fa3cc8d7d5591bc1d52d010896af0000000000000000000000000000000018ce0fb077dfefd57f7943d432e12dc9bf92dfaa30f8341397ff8906b1abdf0c02b599edf85ba1e5bb6287aadc72d7a50000000000000000000000000000000019e5e9e3b0632ec10a26b7c1ec40248a9a8b230806c38aa24e47489a8aee5abb5450f6e5679e3f13c6ec7a79560689050000000000000000000000000000000006e257a74f45142817ea8044f403e98c99db8355d626c59e1d11c6859eb0dd1dc8af389f07562259c1f85411be6cbfe2000000000000000000000000000000000f463e345b004b1364894c6e8ab5d35bfbdf6b7544a576ed6b5c5398ca2074f67e2d80af1ff5b721fc126d3afadff1ef43f1bb26469b778edd10127e634fed4d749e25b41d8eba86eff2c068c33e714f00000000000000000000000000000000174231581338fc8c461c981d4949d18f5b753d27184ffb41568f11e178a271bfc69f8c73f2daed0fdbe5bdc7fdf8ef56000000000000000000000000000000001532474399d6a73501801e5f3fbfc6f13bdaff7a3ea7634568fe82745752ee15af23b16809be18788d295e044e29c05a000000000000000000000000000000000912eaef94ab1f3b3257b26c5e8bbe3f99eaceb8c7ae8da577ef98e24f3308abe6e6005ff674a2af01b4242f8ff87108000000000000000000000000000000001925cd635d0ce770f4925a3117721e96c316dd96708b096901ee04ce02e7b357428e4364cd488eeedf76352a26cc1d10a40251ec7a7e9f7cc29948b122010d9745752df3f4a9c67427a8b58122ad4e7e0000000000000000000000000000000005c4a7f26ef0416f34750badcbbb3bce075606435ee7f69b3589e21e37491f0b4a7a98c825ec222848f5e29618828258000000000000000000000000000000000381c5f6511c9f06ea1a76ca84adab4a26a3cde13e0825b3d81899d6ad3191628894d0f57787f854aeb9e4c57fd15d32000000000000000000000000000000000bd706a5b5ef0d4ee1b679a0af90c217ddf9242b7c39523c39657962952dc14e5e07d02154e05693bad08bfb24a2b19a0000000000000000000000000000000009f28a84aa5bd39eeb09f13fc8770fa7e2e053b6f5d7e6021da77f48b9c3807ad917ac671de88b28dd343c2847c5e8eee03e5eb477506c397bc1a5204b30872085a36b65b7a8df3e0e187f3022736329000000000000000000000000000000000a8ff1b15ddcc3684b4d4ecfb53473497feb8a04660350ab84e5719fdb0618d61acbb555174b0900b32341154eb7bec9000000000000000000000000000000001464d21df798c0242ac6aaaf3c579eb66eb8cd53eb1e5ab2727298ca61ea8ca4c7cf815bf5c9f94c2b76bf659a4e2da50000000000000000000000000000000003a25752a4360c84e9353b7f1ce74d5106cbd637ec5ecb03dd0752660fe5c7622fe2d0475a4db98f785307c6961f14b000000000000000000000000000000000163601a86f02900d214ff8fbd041934189503438c557138b6ebaca8ce3c109af50ac28074223fc81d6476a3a99559ac565cb04110bbfcdf00616c2826e253f61cf955756e94dffcbb6001f59ae4a93c100000000000000000000000000000000189597e6d618a20ecf9a87cc70b3e0eee69ffa4dba75056ebae93cfc3c2ebb368532b17d9f6c06f09e44d9f101397b2d00000000000000000000000000000000086ba610e490588e9385c8b6944c2bad1eb03058e927fb2f9740dbefb779bdf669a51af88b45985e8345b8cb168c13ec000000000000000000000000000000000db8b9cdd4a9bcfc9f7de144da0b33981e4dd53744cd260c4bf045d643a4ef5f25aa19edab7be0c7f8f5ab74a4b7f1820000000000000000000000000000000010198384a646807b16e2ed9186aed99ca3197b05964dd0348086f446d3ebb847907624f4e02f71a1e866d17a125e07e93ce1bb7cf7d7a55f0624bf5c4c35327b178923d88be748a9b079720c27b500e6000000000000000000000000000000000a293f07dc3f0da0da4bee671951175a4480a719d44cad3d627878ad2f17596f0dfbd6f43acc7a1f9857c5d1f453e5d5000000000000000000000000000000000be6382cc7a00d590f2aada3b4b75f01f8538caad2ade90227ec71e5661ae353e68789807a13f28b23b17dc0dafc19b70000000000000000000000000000000015a9ad5a6f1a511ffe1891ce260ce442996fe4d8515ca593e3e869cab9b18af57956b1daa43aec98a0281143b0c319fb000000000000000000000000000000001807a4ddb73a9aee58b54bab2b878bea8429cdc91384c8fa533a8c9d15c966350e892bdfce16d37a4048a763cbf25d71e2b4c64b363efef0c5525b0337bf407879755f060af451075f4345dea7e681a30000000000000000000000000000000015aa6b865796f88ffe770bf25612ad27942213131c566a446dc149fcc70a018230f1cc8b20461ba2c55300fd27930bb0000000000000000000000000000000000c39c4f229b23c0f65ed720d655121eab50f695864959a2aa49771b848730494d14597eb85ba35743f64eda897f95917000000000000000000000000000000000ad44cafa754f06e45dfab801998c40e5a9f56e4add5c8add1d7ed9e05d12459f2efe3f3367cbcd161f524c714f7782b000000000000000000000000000000001437b1f1a1399ce2a860f7c6517b14a2db264b2602c1c57b8eb04e165205842b483497e98e6b6f8a62e25ab8b0e722f04c85e47ebe2c26e0aa25661d3353b5d88c632182aaecb35303d8d47f01308a0d", + "Expected": "00000000000000000000000000000000077b81fa5997de07738e1b34d8e17ef4a9bde516577a4290253cc759ceaae745e10a457204b9ed0069942e0b487d106e0000000000000000000000000000000015e79be67a752a46dd0605e9d07d738c5732b2b605457ce056deaa1f7093b0bdc91b4c81c4c5462a51bc713a7fbb86c3000000000000000000000000000000000cfd2e6043263bda2b97798e1a7dcb24c63aa7197f2749f92524329e97f93dcb56429d82c1d63c067d7ceb38e6c65b5a00000000000000000000000000000000026f352d2f93e6407c59d58742dbd91ced464a3746dc1ad9059e6bb9c146dc1e74235bd54b1d90bb3399865cd3102f3a", + "Name": "matter_g2_multiexp_40", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001387fb972f997ed0cb97a5ccdaa759dcc3c2c7f4f15e5cc4fe74685e42cba75e778772d795847b45f274d32cd4960de600000000000000000000000000000000150b1ad31a3d434c1cbef877fde2e105d4a047dc34e3889d21544c2143e7b41b8e0024443a774bd1e09438293860a43f00000000000000000000000000000000065033cee91f5c4d429a074be3d2a8b001892455a11dc708ea73c0082bedb1cb8e8b567a6ea68a1296ad2b80e4b5b08f0000000000000000000000000000000001991ff6fb57e8cbf9d228f1a99697f785261ebce9d3c1f592389fc860b8d7a069896dd48debb8cbe0c43175cd2ecfff5bc589e7d89994400c511789cbcaea19b077e0b02d625e549bc6f2673ce40128000000000000000000000000000000000a0fa2d39d868737b9a0526296335256ab4894cc58ffd80bc6334e80d1314bdf017c8226b41ea135f6adefd07650ca1c0000000000000000000000000000000004334f7985211061dedc794ee8931ded12acd39d7e6a6ef44a749118d19ce8204d07935fe62fb2a8ea4f68f99d7c5f5d0000000000000000000000000000000018850a3fc8c851a06781511faaded1ce0752e7ef66da82c2464eccdf78c32fae306da3cfedaf76dad371cfbe012f2bee000000000000000000000000000000001296ca0b0e368429b122537b096fac77d6367988956a7f6cf70c7193b7033ce42fa0cccb8b84b9c78b16a68fd5f4c14c2c3d2a0cba111642a6354c117d494be805cad5b5c486bc47906a2d37a9cd9f850000000000000000000000000000000019deb7de7fa5254fdf5ef34fa616651ec70548187fb0bfae9f512e0bfe1f662783f06a9a99e434ced84229deddab9d240000000000000000000000000000000009c199ef916e6f6fe0677ab07beeff221a5687fa8da3ed3ad99a950b7f27159f857d1b561006bfffab551d240b764fb300000000000000000000000000000000148a211fb58b38072cf7c417c70d3ef92e9cbe22b31b2b626198add01dbe1ccfec32d333abf42140b9316312ac48aaa2000000000000000000000000000000000b551b57045365d842133e46814d5d0084248904960f8d2fb28e9623660bcee658582928703f86261cd70e95cd20cf3a530ff74626657262fb49460b2c6981155871f2eb5562581a74f968233c3cbe3d00000000000000000000000000000000185959a297a8f434cb9529a1f7bf9009fc1af3d09efb0a9dce1b9e7d30699da64e4b1d32cdb05b068621db092c1eb59c00000000000000000000000000000000106ef21e9031d108364e93ae4b5d21b0d6d78c2e86e0f8a7af27ed3d38dba0192954e8c716665333e5dcf21387d3f2b1000000000000000000000000000000000185d21efd7d613c409b6ddaa66eed70c235440974b2a9154f3711e3969061461f8824b4547c65e9db09ce875512ca2b0000000000000000000000000000000001aa46b22451afb12962bec5c6309feeb4acefdf3c98c1ea14275409b7111aacf7c92a8e024d01d4dcbfb1c91fc445a1d182ac912b005e90ab81d4f2a906da8309a69576a8afaa160fad2540ec049913000000000000000000000000000000000557370d81bc3da4c50980106b8e65ca2edc757a475194cef201c9edc0f50363cbebcf2750acab0b67e1020daf5660e7000000000000000000000000000000000462f1c1379be9bfed97a1a83a00428de63eadb6360393ba162af3762a99d7eae8549d0cee218e469e4997ada7b35cc00000000000000000000000000000000008aa5ead309fc703f6de980dd43c294530cc2b38b94d5281e9cd9b0d09f82f747a7107b700f1437f3abe36c01bcfed1b0000000000000000000000000000000014110a19d574f26e11e2163a981c3388c04854c5693e9033a474f1020d5f980666d84c60370950734c46663e194bf0ec42a002a460b51429e25f85ec4abaa580ac1a14315b1627bd52349b7b81a641d60000000000000000000000000000000015beff8cb3c79098bc73dc1ea4b240a4e0d094b3dbbd51592df6adc9c9847beb436ec83df6c55666e296fa843298446a000000000000000000000000000000000943aca2a6e57e9897ec764ee2911d9ff0a59d9e903c70a8494340cef2143895e79d3e6c03af2d6461ca199dfbd0ca0d000000000000000000000000000000000b812ba87c4989af07af44f3dfa87de119fea28ad598cb8e52247cf41bb8bd384c0d8913fc82e4cc2878065e797cc581000000000000000000000000000000000410ed148d1e354653f9d9d17c50026957fb03fec64964f2bee5eeea966b430e77f7b3538d9f4700a673fa07d0daac6b7a650dd3765032ac139d1b54ec7a5457c9e3caefa6af45d198433e5949d149ad000000000000000000000000000000000de0a9bbd63c59767938b555c7f9284d0885ca23019818c213a7d4f1594b028965da871cc5818240d155c05c69e4e25400000000000000000000000000000000079dee5649cc67700e9338799a9810d352a5c68098d0676e42e00bac31f37513944dcf47408288cb7f1cba121506a10500000000000000000000000000000000101a650e84352aaf3817b400da0aff40907aae3d2fcf16739f8ee8d5bfc62c2a0dd518201701932728a41134ea3f6278000000000000000000000000000000000f1f9dcc0b55d0ed327f667cebc052c4b6116fde5e3076dd6e447c3214d4c8847885be9547f95f341c42e7c7fa7e2c71bbedc44d54349cff199befba9531dd4120a51e2b830a3e356e68cff31bbe365b00000000000000000000000000000000148f706b4c93e739324e5db40d42025535cd33a32bb3f211add618c0e2022068384a5612da67150746896a2813a664e80000000000000000000000000000000007204ebcef495ca8232078fbf1539a4b46e89506a09dc008da457dee2792acafb6baac4f6cef2de15cbeb48bfd12bfd6000000000000000000000000000000000bf8900e48a4a56b653b1e02c3b9a7d81c2045dbf6297f1ac2acd69d1bf9e06480ea917e3a616243c3a30235abbc426f0000000000000000000000000000000005ebe0ddf4cd1aee76d0b3d03eab754664c8b36fb20ab1060900909e0e0a4abdb45bf74a0b1d40fece9bf73360f580bcbef3956ac71bfe97029b8e3f85923c2fdf9cf1ea6582b68d5a4eabc6b044c80d0000000000000000000000000000000007824d1c48bb2cc0f406e356f6e52b66392f6203f49dca7ce03ae6302ce3e8055d071cd812f97481acc654b318d6cae2000000000000000000000000000000000ae89f9eb1abe452efb7ca48f8f939d835f9a79e05211ed9f4abee06b93e34b17d920ddbca3d8bf18b96c3705c1a064500000000000000000000000000000000119ac787a7f3e9b7ee34070aac1a769430eaa8cc838f1752b573ac7f3c02a9f490de9600c856a55448598b149f5392e300000000000000000000000000000000193a3655a80e6e0b1278730600fd4f645d54947d193484131176b890ac197702333ea847317568230ad8af1280864096392f5b4291fbb18a93248e830b08fadbaad6434040c02b45cade73b77f22c2bc0000000000000000000000000000000012f66629836f0f57bdfd9bdeb2c9b7d6d5dc55c586e15d76aaa04aef06722bc8ca156fd1295b3063d738a85b3e8746d900000000000000000000000000000000097825c5db7289b1b9e640d19ecaaa81ee59e5b9884713f6d312604d8ac367634a264c316d73a9cf63358c8fb15f8c5700000000000000000000000000000000181133d027b97d8e2bef308a93b7ea2a35824dc7d01a3ed2f404fbe12ba3b3e51d94ec86cadf3da7dc9ecbaa23b411cc000000000000000000000000000000000a28a609d0bb015e375e74c087ce426dd3c20fbd8b374d3817c626faa81469cfd11a2a4e418a44f4d7ca621d0564bc4920a96f963375d7a294b584f2da699a6a00eb5781f46830987346cf4fe922a2f6000000000000000000000000000000000feca6f7e3cb286090fa3df9c5ebd10c06192fe14af58d46b827acf48fbd462f3f76d9d20670803946028437410ea52800000000000000000000000000000000183dc7085483bd05c27691c25588e33296fb610bddaac253af5b2262db38091650c1c3185d71a69d1a63770f95f381d7000000000000000000000000000000000189f9b9ea528bc2377ca3354fccf440fee059f5732dfdac320fb58541e74e444dbdcdc008c7b47681c05502f0b302f5000000000000000000000000000000000906162085e0e299a07e41b9d62668d4810b97d4be317bf376da537de7adb06de011f5f40af834593761b774771a80e4115cb4646c8996239f4fdda8c27a335361f0a19550d6eb0225c008408c47258800000000000000000000000000000000030cc52d7901d0360d10f344cecc8325412788cc30a912d5de3fa9bdab18db44efea235c5d34bab526f3b8ecee2cbb8d000000000000000000000000000000000cda35f561c19ebd85a445ce8bb1618b446c7013c07606ce58e0b5627a5c9e7cb200e2b8ee12a0564730279e75b469b500000000000000000000000000000000055ad0655a96f6dab5a432e7d2fef57a6a11113070444089df23b4b911e0994b90aaaaa2c62d06756f4704fa218f7c350000000000000000000000000000000011d22438d7c162d34802a664c254abaae07659902e1f1bfc2bdffa6c17eb11bff5276474cc3cec9507e28685f1c21bb0c8a8d98c93c392aefb64ce0c7ea455ba14c48bfbad0e3dc38d43abbc3276caab0000000000000000000000000000000001d04065373ce5d1ce47e00476f07708bb028040edb9ae7e8e00e2c6c460e1ab8b730ff510a25a3c8114c1753b7bf1ca00000000000000000000000000000000001c87217f150694a84a4e5aba8d188ebf7224e76b078dcaba4a91de6b4ab317966ce1a9267a5a27ce556c3386b086620000000000000000000000000000000003c8422590826e0999e7ae3ecba84edaed20fd7f1eba02b9daf1c46c2aec74d5fe63319047d37f5115f243ae0ddd4ffb00000000000000000000000000000000136ae093c3bd55ddaffc2494f3ba8176947cdf2f1ae408e7e786b23b6a65ba8c4131c83cd890386ba531b8637b3b042c8221622734dc6ccf6c7b84b387a3dfecafe187dab70ba373b4416ce3c505bef2000000000000000000000000000000000d09b92a559b8efe5224184fb4f43779d0b8c8f23587f4f74e2fc6fb1f94e8d2e0d591eb0702cf51a9eb402e79b46a0a0000000000000000000000000000000014ec2e4702f1ee1074cd1ad29791cf4903357e62570d16ac80c5e8ff73b255ee03a5ba070091cb2f984b2139de06a97d000000000000000000000000000000000d22fceaa48193756ce7331952a2d9a8057b67bede729e07cf8422bfc79f9ed2aeb99a9227af256deee9f8a6f227faba0000000000000000000000000000000015d9322c3a5a7ca404259c4cc7cb93dc3d46dd8dd9475756d2ce6fea527642f9230c7e94a804ecb0b4adec7963fa9cdcd3d1f427a25f5df025fa71244cb92dda9391d65b04756c41de0f67ea072c375d000000000000000000000000000000000e16fee11affc6714c7fc8fc5e7cce44d8afe645861dd2f0b8e58aa93d4f0de9b7e73020a1537bfbb0e2c8327c4aae03000000000000000000000000000000000b7745a4aaa8ab4593daa61e375d55f9043fbc7385ff229889fca514562168a4e769c5eeef4d564b41cff28b4efdb7bf0000000000000000000000000000000017f6c5b1fb00746b50ee4c7c743ae57fae2742617e5565241d012a0ef6067d9ce59be749a99886ce9836b648525d2e92000000000000000000000000000000000a3be81720e80f6aa0570c89613c78efe95d87ccb374e7f77065800590bc71d23ae097516ae1e97b498cd233221cf717b55c943fd9b11f2fb8a89f6c08a6eabe9434062354d845f1ac740e6043443f8b0000000000000000000000000000000008080a7d91caaf2470f9632575b43990a9523219d75994f1944979ed5b650be1e3c93eceeafb0875f66a40651f4c6dfc0000000000000000000000000000000007a19c4a6340e39230a33b12fe63e47bb0d1378420ec9e439f216699e512e4d70571a1670eaa6b60a5c899ac63360a250000000000000000000000000000000016898d22b2c123003480e3a01965a72de94cdfa39b20898c49e451dcf6a4727a1ebd629172aa1a1aa6897916cea192b4000000000000000000000000000000001217a373c78de9d3005690023b9e56bbed3073f13ca2408a27a3480578d8013fb9d3ee5cda95c3cdd091a5cc68d928da7b0c1d54e51b8572256aeb72bb032a5011a3e8ec5ad7e8b6e0397b9f6fc64c9f", + "Expected": "0000000000000000000000000000000005829c932c80baa420602bf841ad9bb24fa25c61f33f5d88693207b81271c94eef54bb524aa830fdad8caf8c082bd4990000000000000000000000000000000000b8d184316c2471ec6875641ea83de4f9b7227041922415b38b07a0704d01f2585ec2701bb4ae0bf6a0c0522efc0c630000000000000000000000000000000001dd81e075620914254b38ca5a7287eb56f2f31f6f8fe02fa51488d45c7f4609bcf49972d0ae5ded76eed5a4c096939d0000000000000000000000000000000008067feba36999b58342ac54e48b0fe28245f8ac2498b60093082822d19854df5c3168dcd55ccb6b2cb397b77e712333", + "Name": "matter_g2_multiexp_41", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000016ed84856b9f41be9bc6c025a9b79e2968e2ee6bbc27608093256c541096e2c9eda1159e6dcdaefe783aa59d52f28ee90000000000000000000000000000000014aabafdfe8c7369f93d5472a9c6c4d426e4b02c943488be993d04ed24aef5477f6d455f82b4af78381b8bd16f42b56f000000000000000000000000000000000af34789c6c923103633e5b1b9fb447b671ab05265c16488ca7224e49db21973487a5d3de4de40b9d8a97ac9b1966619000000000000000000000000000000001123a6601c5351a586f27f8264d4227f5e1df868a03e0c3df5c148cb523cdd178f96fbe52464fdab210564dfc22b29536f082a5ffb8baa38ffd684a4a70114343a1e723bfcbfeb57d0a85ad5e592d7410000000000000000000000000000000011b82d78cd9b53b8e7e5c14a7371f34f08546896bd59d1e7d8be15d21742180aacdd01b0d08da2cb24873ce75e166bd500000000000000000000000000000000161ae0d724085a6e801edf73443cca87995c2d6b37e962db5719f4c480cb830e379fa778fd2f29e75173e1c31daccaee000000000000000000000000000000000a2c2b89d00b7d19f2b0530889905c30cecbd4ed0b56ca82208d666e7576c32a6e90cf867ad87f19e4fd367a10c449a2000000000000000000000000000000000b65c0226743b573dad7ff25bf1885e3dec686cfd5da2862ab300fde4fc8fa9b587d0f2d11ebe1f6a6770bcaf2588f8f5160286a6d23c30595809dab6ee6523d7d235114d1b295087e024b4f6ffc80e50000000000000000000000000000000012d4f299998aa897db9e3194244fdd1dfb95225e3271383b5cc296bbc51c4e1af52e849d8244f82421cd198158918d8900000000000000000000000000000000110638a2f7cdb7104de8fffe29be32610063bc656e13168921501e1614f282bdc9fccff4eb3c479a42b240a2c8014864000000000000000000000000000000000b0adbcbaedbedd376efd20a417bcce562b87b7449cac1e90d44eb05930e6f558b35ef755457305da012a231b5675bc2000000000000000000000000000000000db6fa926c7e02f633730569732fd9239bbacf2042599e79a4bee76619872901c6f4ec4d4fbf3f84143a0d17b167130ebbca29b94b6583d46753473143d13a7aadb0b18d6d35d7423b8a004991fa1ce500000000000000000000000000000000166578f3087772545c0f47fe0b3efe32874d26463e4f262be65a3bb6b0fad7d0f779808f69362f3fe63c72f24ed03d70000000000000000000000000000000000a8e61e8193228fa1825cf14e94f68a5eecece9afb48b44871c5ad62510ee1fc4e9c60d5f2529b8685e6aa13ec91979b0000000000000000000000000000000008d25d81bc4bc92508c8cade33c305c11d71a06bd46f184b05dc406f0939f0e0967b02f15b4f7f6984c9fba0644ca8e800000000000000000000000000000000113660a7d2152346500a1578641aad4dac2919ce63d01d8ffa6dad72f524c888fc2e9d2876859859e47d8e884f170f86607c80069dab2a16e39370de32df20534aca46565cf573159a93c64f1f0c4a1a00000000000000000000000000000000160529ff217934c85cbaa8b347151539e252dbb502c015e8e45c128df2b8a737866737d5cf0eca6f76e4a16790cd02a200000000000000000000000000000000127f7b0e4f9351836db9c204386a199293955471dbcd7b4ee9186f0434b46dcacd1edc02fb46b4c377c4e62cec10cd6700000000000000000000000000000000094abac17b11600d7447f7ad0f21d98c14e439c4a4a6572b00c90e14d9fc54e85045d0576f74b054d384179afc0a70c80000000000000000000000000000000017165c32410a498add8e1dd55ae43f94be234ba3859fc6b4816d7436746add313f42b1fb49e0cb6c4b7341f0acd09db841c1f256e866d218b3ec20c132446945177d518573ae3f0e739ebcc8821bfbc700000000000000000000000000000000060e503ee1c5d3eae4bc0eb30fd86303a5c48c10cc7b4736d17b8774c78a8c97ee05b40d366b2cc9bc7781b1e4a192f200000000000000000000000000000000034e7012414edfc6a8f7b2c6049236b6fb77eb94b05d55b218851fc1e553514e6ad388fac08a24c33bea63ddabdfd8720000000000000000000000000000000004c832477a90683d417a00a698b69c643d6dbf82f5afbb83eb3946f8098d80de6f2d457c0a06d0051315f06e93b5e13b00000000000000000000000000000000048c3339996948974f2bac14d8a6b8430897644ec8e9cff9eb369557003aa2827a4f3fc3444c4df73663ebc9325ff317c72a47e2267010c532d676ee3c3ebfb2be2b7569f6f7a22f76733d7773ed383c00000000000000000000000000000000082466944ee7c62788b6fa77816094ea623d03c7aa2af249cfbfbf78eed26a76cff8c23c2295aac7ee1ef8dc84630003000000000000000000000000000000000a8f88adecc3f50d8eb329492f2c031e722f36627cb3b21415781156ef44954c5b8529ceed5978a37ae1248909d38b5d000000000000000000000000000000000e08f628aa014152b50a85bb6eb947d53c596d82c0d03594ed3b64c486b8630c880adf43fb1575b02e4eb8174a04034c000000000000000000000000000000000776844f28958d3e12a5c163dbd039e50df44b1c6215429381790175a609a339621475a5b9a06c3276c9177d2dd2b576c52f48e84a68d99124e678dabaf376c956dbe9603974283a9efc7c27e830e9590000000000000000000000000000000004477f153c0510d8e50bfdc2db69182c05d5ae9b94bb1880de239733e380e03d50001378432312b24b5bf0952c38396c0000000000000000000000000000000016663990dbe529a5658f2b3044bbd390ad430adaeffbd5306f758d86bd5422391bfa1d21e88c63300faad55e6a2d1d3200000000000000000000000000000000188f701658558033ce2c41101a611f74ad6d3cd075c195476bd2cd59a1a9dcfe937020737250fe418b4de435f8b3a0380000000000000000000000000000000013f8d3625309767841603329f56686a99e196d697802cfcf31f8b48f9c76f77a321276a0158a22b94e91d6907f6ff451e4fe662495bffd8ace4c1ddb39e612b361bf90a0f1bdf6c7fde2bcf63df1bbd2000000000000000000000000000000000f184d22f3c0431b031ee0ee7ae9598ffb511a2a56f5c9f15c9a4b0c53af2a10d22a311805786e303e234239326dd74b000000000000000000000000000000001062725b8c576e79e314f6a56ef9c41f05a65d7d0d57d8414e2ae9cb1a520b16ede7e418d3a9413c9c1660dd7508d5860000000000000000000000000000000012ef02fbe96f9a191804b6c4a0b65b6024e3e2b1f8cff986f5a950cde9a32ad50d4f7a72804b2d18b93250a63a7ae97800000000000000000000000000000000000b3b0333d61fc46653a7172f5a813d13ff5a48056f9689c78c4b18b8aa3afaeb7cec305d98dd600786351338a2185a651e67e96f64b80f4978fdc1cac90be538774e34c2f619f8b8e60cd2aa20f2690000000000000000000000000000000010c91e1dda48dc528f618f01abbe01db1a7b6dcb0d47b83c7b7db3331f7156f7b2d0f081458241467b0078935a7b4a4c0000000000000000000000000000000006f87f782979d2adc02e65b56a4906e50430cb4e0913636e9aa0364535c9d7ecd3b9433358e00caa8e90e84b7705bdfe0000000000000000000000000000000004635089c7706cfdb5a22ef643d1a9a5021847646ef01ea559d1b655299b65cd76a73b04149adbac612e7aa756cf30060000000000000000000000000000000002d83d82bc9fd66c558e00547a8c25633899584c9b855195c00eb3c8742d22c601982f244a03f8e0c5c21caee24405481a6ecd3db89a7f07344b5728efffd35a11f7380c740669f746fdf565905a1ca0000000000000000000000000000000000848f10eeba8ef9c7fd0e679767f6b6a2392922092916da8f13573661f84ec97c65717e55c65526cedd59dc1e096f0840000000000000000000000000000000013781974518487de12661bedfca5fe72205c51cab461b5757ff14f319d081e7845cf8e099892ea85470039713e8e48cd0000000000000000000000000000000004cc1a27d1aa88484fed40ceef72e6bd201e5ee276b5ec27624286dee112ece767b37c6f1f7846d71cc0f4042f04dc170000000000000000000000000000000004f7335d6a1463976d9fd86e2baa45d08ec65059b14449ebe4aae99971c5666cdc6e40cf0510ae99dbce97ae8b4598067db5ef4c1c174c2e5ffe5555f54f4e845c463bb5105381fb39eddc01103b1bf70000000000000000000000000000000003c1b1e0848bbe37e62f1ebacef1a574400d5048f1e09d935af2052da29140dc4074175e4d6ceb7c2c071331b2f3d1d3000000000000000000000000000000000e1c84d6b20553ddc5ab09049ec488ea2839c5818e31455a7b231cd0455e2945aefcbdc6c1979821a80bb4f77d46e91e00000000000000000000000000000000199ebb31e8800395a9c2e103c9340444c97004186929b52de33cb8d9396e7ab8d5af3fe6035d4463701ea41e341f577300000000000000000000000000000000081b3882bfdf83e67d2dc42b211069a4e93c0f173263f9f20579128391e7f2de70335df949b9c0e9b834b6e574f2f8cc14018f14c50d40d3324952ec22ed247c13c4cf10eacd32c3671757bd12b041e60000000000000000000000000000000018aa45c6b3898a5fa618f87f9a08a7234c1b94fbe38e2297a1f9c7a2e9de0ed83023deebd56560b1928c012c14dd7a860000000000000000000000000000000009ab80da6c519aee8aa1fa68c35bd0fac78b55f88d861e8fcd445f629054325d63cc4241f61e5596dad0d54c94511e4c00000000000000000000000000000000105f8253f37f5538a2c25587fd33ea61fdc744a7cdf4ff23a55e2c66a39040d4de5eeacb7e11c0d2a483d59e7c3186aa000000000000000000000000000000000f6b10cd6522a1e34c87c702f58a07858cb753d67da9625155bd433020775351a9ec4ff879f91a43f63be1c969afe675ed4a28dc3acaf2220ba56d026b292a7d017bcbe358dedc57556cf638517bbb14000000000000000000000000000000001618dd5de43a6bcde91a6a03fcd88fe59d1c8c51d3d85cd44a1920dabd2608a0b17a987b76eb8f5b20c7f1dc0abb383e00000000000000000000000000000000198034b7ab8fb8ff267a52a9423da95bc587eef8684f18639df5db44e50bae7fdea5c5e5ef37ff14937f86cc948a34e500000000000000000000000000000000106d1f017da463176bdf55e3ada78ce70da4486be42dd0095e3a8a0f6e59ed503324565b717b45ee38d90dd3ad13c10600000000000000000000000000000000112d425765fa2fc28486b95e49db63346188fc5a6bd0b7dffa4430dc82703eb44d98d726edfa4a275aa5db5028d01ef530fb17a38b7d0888eb02394eed26406bce9e92779251bdbcb432153a550c0850000000000000000000000000000000001326581ac1a1a960db1ff2e8b89b1debaae46d1e2d0aa6ffc6c7398f207abb699ac59186ae7222b5cae3abe64cb61c93000000000000000000000000000000000218753594c63ebe5fe503aab4dbe1e944b24138948542c7c43d92ccfeba5854b7bf1bbcf8078d85fb0b8701b8b092fa000000000000000000000000000000000c3ce8c17f75e78a8c9980e9fe125290d377a32ac46411876ef011e169e86e1458ac5e71cb4a446f6c640cceb8d5617300000000000000000000000000000000176966eac1e20586ad2a03b4a1598b4db1d7c66be70b1b22833e4afe0e0b3783572f791ddcd4eb70a88f4acc28b6fc7a980b5873a5d0f78c3b8582581349498fa997fe3c6b1abe0edaed594253359d8700000000000000000000000000000000099ac8430fa411e74082cf3282f9a456d3826a7df4f91ecf621e645a1abc057e1bcfaf9ee73f149bc447cf4230f2f6c90000000000000000000000000000000004e93d7fedc9e2d7423c9e111b4674a2bd83de28dcbbcc54ce4b324c96318a11603fc9ea385f1c02364ab1f6b5458481000000000000000000000000000000000bbb29d70fba5b12fadb02a24bfe3f6a5362c71fe5f964dcd0e01442781d0462a873501029192858027d612a8572e9d30000000000000000000000000000000010daa9960005562ca2d18eaf4b4bf081f194fa824cc77515c81b2c836627f21b732448f367e2cc1830ad0fa4ceb928e1619f5719c320320a3c45dcd6207575e0d8527c458c56d3decf1d12ead8a985a1", + "Expected": "0000000000000000000000000000000002a61fead6801f41f2f27603cf34cfb4b917f2f85cba1f9c684995227653c9dde559e1e8497234fba9b2e4c119cbd9ec000000000000000000000000000000000085f73b8e835a10bcb9312931eb08d916d2b93a1da843fa2f4530cdb26e93b5dc95a555dbe8e50ca465b162661ce1d3000000000000000000000000000000001442fff9019b5476c217ff725ad95c92c17b42471ed7bcc121e8a0506755ec279d4e56d770a322d56f56bc6a6b0a41160000000000000000000000000000000017e7710c4639d51c4a79c5a2791101b52742df202b1827192872f168bd21020bd068160a587fc501782c1301c231a0d3", + "Name": "matter_g2_multiexp_42", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001213b5d5704c454845824994769c8b300676e75bafdeb95202001161aede276ab7967ea7362d38e97ca1484cf9c342fd0000000000000000000000000000000008c7c1fa04bebe5a1fb8678370563db63e7a10b30747c2ddeb4aabd4fc0ec93220d578b8110c6bfe8a3a6ea2820f0db8000000000000000000000000000000000c4061a295120a00de52300ee625ac46566464e6702489467316e8c182ca2168052c50b5962ff47285866c17d213fc8400000000000000000000000000000000086c153169a9ed1aba10a6cbebff4911b37907d6398c441ad47da17988d512d822ee36f5217355b93c9d6dd8dcbc8e0b119d33d32affaadbf6c2b6243bb7b344a971270b488cf887334fcb15de2818cc0000000000000000000000000000000017929edde8f9940826ed739bc9f59099ce76e85950698ab0140784647023f96afa064aa4a49b9728f496515a0a807e5900000000000000000000000000000000198d98f430384c1e7fa9e2403d9c3d2f81873fb7b204378cec95b97e674e10a1a43af97db0488209904469989ce80a0a000000000000000000000000000000000afc9b5138999bcef35613e38bff4f81cf532e00346f5205405470b2424622826c746ddf0369c7bdf77467dcea5cff290000000000000000000000000000000019ccc05724b3e9966bf918f01312c80e8422b697be89365b6ca00eb31b0bd08fae942e90a75bf9da1b3d264e416060f1f1d832b355d7e0ac3653431528ad0a8f6819daaa19292a00c910ff0ff39f46d5000000000000000000000000000000001568e52c2760d895874527d1ac8597730578176bdcfc67aaf69ccda253f6616230811dac59bc27cc1e57b94b5743cb3f000000000000000000000000000000000a4ddeb8b56f105ed5f47a538052f3d38a23c0ceaa2dea241554e6508f82f47d32415ffeeafe5ae5664c936b78e07648000000000000000000000000000000000b3b335a390aa0090bfd6467d6cd02eea1ced347cdce3c9ed85dd46e38e9f2ae9642392c2875a27618ba8f2c555d5b190000000000000000000000000000000012baa4b29d116eec749353b7658af70d4d216189133db707e56068c8483af43ba86583862e6b39df13b88058536861b9e6dcfa50f6129544835b5a4568954264ea68d9e2e5d4370ee31026997a3fbfe90000000000000000000000000000000001888b83ca28c244a6178377b4ee6844dc916e28c3f56312ecc0e29d08e6254dcda39a36ccdc317d1908303db3c028dd000000000000000000000000000000000f4b73d9316fee42d60f8de402a7d07765508b84d8f2c1be1f3f9e802ed7b0c6c5fece3db95d5287225026e73de98ea4000000000000000000000000000000000f1b48122191e1bc421881de831293a80566b9a7f2c9836f7718afb69592d59d2a714cfddf88945b94fac7a50b743eee000000000000000000000000000000000f1c6b052dbd03795433d7ad122473f109484d50245021c8727d252145e7db7dadc015265d1547f9c748409d74f5aa33f7822767391d3b2331e8e1b81c659c6e0262f7355063decedabac9797a84f0f400000000000000000000000000000000011e8613c3a771a177b4b85f0c6f97a53fd7900cc23566aecbf115058d2863189c21be36dd5dd736f6d0ffbe88182b400000000000000000000000000000000017b2c4e8d8aad0a12fd7130789188bb63a08f2b243c8f7700599dd33d7e176f70f2b1818e56540ab3fa507878d96a46e000000000000000000000000000000000e2b5ad5ed3578dfdffa414a4a2142846b1232cd2de468725283e3f92b536d8ede74bacc236993f6f68a16fc6a7828d3000000000000000000000000000000000fdbf06ae4cfedc462f5913bba9bba2b5c86ecd0e298bf27a21317fe74af6ab15014c62cbfb617356548cf808599caf4b1ba1cd6a4a6c433624dec63547119c0d492e3f38afb04e5153d82e400631aef000000000000000000000000000000000b48aebc6525620b99cd83979658a35afa233d17849bd0dcabffcf3b550f875a386b6c0b4ddacf18a23843629072c0150000000000000000000000000000000010432e5abf862d3be10ac5677b9f296ccdcedf1480e45de631b6bfec42f20edf62034f7205f659f11fe5a6aa9d882c7a00000000000000000000000000000000011702a3590e7aedd6948bb94bcc874e0b8d77a18126ed4ba3753dc98953ff941495486c14c6d801c71fca3564ded9910000000000000000000000000000000009faa427c0a7da26c92b451c61f5b5e8804fe032a4cfa014397e430882cbfcff81bb22f9c15a8747ef455773c1ef65b0a41e184bcaa0721caa4114d6393ae2251fed84aef57c7927a170145308bb136700000000000000000000000000000000061a1ee841251bad461f89c52196bebb1cb4463298e88abd62cccd21bbd325ddb33d1306ffedb2734be76c18d80c8dfe000000000000000000000000000000000d05a5ce6372ce34b0bf4b19d8e05aab74abc1cedcc35a2d1d4db38813d1e5c1375d63ca0e8bbf29c510a4319d2aec27000000000000000000000000000000000dfc57aa8de28745b8d28db3769ab5ea26b5115d3e59e51ff19af8ba37efacdccf763ce682cfdc77685705781c3924870000000000000000000000000000000018c17d87411c4f8e0ca51b3eb4c3765d3846e0d1b75574f8e511b2f3e8c5ff53bf7618959ce18dfd9e4c6285e88f094f63cb451d8eb3565274793925a1869ca5a25fb19639449c71a761809f785568de000000000000000000000000000000000a0642094b89dc9c6c7c11c1e57ed542982bd246112884969d424a3e091ec4fd73dd40a5ac116f6c68216fd1e733cdc7000000000000000000000000000000000788c7a63eecd1cbc26ee6b14b09d0a3b7a17a848fc0551d50cb7497bc98287da2d9b898260eb678a8a0f446eef5c6670000000000000000000000000000000017a1298f90022ddff3fbbcca180e3f4da8760218dba595a067287a2473a6e10b93dcd54154cb64b6c078b083b42cd09000000000000000000000000000000000116e999b808dcaea0566c0fbef1807e160612dce91756b2cbcf4883b04a90320a0759bba21b41e6f4d8449b52e52f9a96a2f94d55f784ebfc6b6260327372217d6a5b9637ea5f9afc1a65f99c221c29f00000000000000000000000000000000064c95bc9c0e2be48849a349f16713791c37310f71b5d0613cf0706febeea3a56a0f0f1ac6b504524eba801e8b759f2900000000000000000000000000000000007088d2f41fc7e1147b92a2ee7062b9bec194d3a47eb9985ac1ceeef57e1a006571e7247a13dc95afcf9905be57e2a7000000000000000000000000000000000e6a0770f4315acd9e410fe58395ab8b20a08240a6948b762dfbbad3414bfca0ced4ec9da982bc9b8798b60dde78a96c000000000000000000000000000000000a70b53a6d71c83971167afe329ffacdd417bd7b228766851c3b43701a439f253a8659312db7e83a398142fe19332b527d889a3362f551b88e63463b7f0cc334fab3fdd302b630e419e362ec1eaaeec000000000000000000000000000000000002486eaf9b743d3aa6a1f3e1174c5f213bbf3e3cc0558d63ce40e3c03e1c2f6e8508248bb649aae1bc92f3eb8118a2000000000000000000000000000000000042b03959b40eb0641d39117f7af50dc7ff048697a57b80723aaca164e2dbc647ffe78fea0a6a4c07671f7db6d5b2dfa000000000000000000000000000000000e141eab29f52b9bd0ee44861f154ec1bd30abd715935a7958a19007e789a41cdb0f4b9cf7b3fac0b0d4d77637b510d00000000000000000000000000000000002cc2eaf89cb7a04d425d878a30b5e2e9858ae0b2a2ab28fb28a6db0c7283ad861bb6a92067e969e5721b43466e857db8bdd400ad873cd6ec546bff698171942d536b94e69dfef4bbf316a471d4b45cd000000000000000000000000000000000e0f7595e4c136b4d8bbd1eeb021df7dd2bcf1d9f98e4fa293f7edab635e019af87c138275fefacd806213177af40eca0000000000000000000000000000000005dc209d6c86f1871637998c10490a70371f9e00a68d1363dfaeb62046473dfb4bbd3b18b943439f75c45a1ee7f264a90000000000000000000000000000000003d215567d1e8f504a72658d48fa51374ac77234552c17db4033af780133d8516bb0769678ecb50b8b9eb950c2dd73e80000000000000000000000000000000004d780849b731012e1e5732d5f6d32c659a95c3e1c8f5ef4841fe82afc6f0aa309b1e02dc2554a4a4ee781be2be2149f63b496a64cfd15410192aee9912f869deea5a08eebd6b160667e12fdf23c44510000000000000000000000000000000007ecfb753be501d9f9b7ae7ceaabaa4fcb7b690ee04fa1a711a15dcf67e4422adef64a0f8118f93e67f24a2d1a2bcb36000000000000000000000000000000000a459e403d85972f7132641c05bb842416a7135009ff46b617bf0918e65cbbf33f76b98c10d901936e589bdf5de31ea4000000000000000000000000000000000bc6ec31a3ff92b4fae07cb73ad7bfa8423044048337b0ab9add09bf10fdf190a5f7996d157483d29fb29a681ed585520000000000000000000000000000000004c622e2bc606fefc8bd83c4a32f7353123205a6d3716b581c2c71360e5200ab069f60c256dfcb04b466c53cd61fc94470de38cb4627f53509eadb0918e562c6fa68a4cbdfa9f7578a8aaa8182f5315000000000000000000000000000000000125688e44f593c5f585765f30e9fee5e4f15247cf33ac78ed1744453385f49ac61128e23b1569ea33d74b207a5e72e930000000000000000000000000000000009d77360ea37298fe971569230159967012c4991255fb5337ca6d58cecc3cd44a024a9a044ac98a894cc97dea161844e00000000000000000000000000000000056b2dd9569f0698c732367cfb217af90a3d6dc15e2555ce0aa845616e4067a7fefb304f6525b539555a0a685f0ec5f20000000000000000000000000000000009acb138abacac351e03f7589d4bf29cbd331e93bf538578ca9466b759ea070931c786d35f74fad42261e2df431fd00316732c583e8049a5de38642cebab774d90d5f87601e3599ffc9af692ba532e620000000000000000000000000000000013515b0022ea946a8e679b9c0eac6cd67dbc4efc820f0b3d8984f12b7d154c0632a8d7207747284d49c498c79b6bb5c60000000000000000000000000000000004d6765ec6aa8744225c1e652ccddccc91fff7fa8182931c8648b3d8bd33b2177a9af03b2906da02bf117bea59aed3040000000000000000000000000000000006f1d858c4b223552f0aee466cff35d14b3ac6da35b8f482417e8f597514b065be315aec6662ea5c7784d3a9e2184090000000000000000000000000000000000345eaf0d72b9c11fe72261a2fddea318a8dab92a67ccb9438c11e61fd298a333cc42084d4ca127e09792e346cfe0f004a037e7562adfbad6b1ac48b8e4b6f277a788ea2f4416ed2900ed2791f09bc2400000000000000000000000000000000029ad10ed6d6d5bb591771cbd597a3a0b841c2347c89027126bfd1efee2ac403933beb99d08721232ab9b7354fcf9aa800000000000000000000000000000000198400d4e026c2463a07ba5a3974c869ed8ceb1f029bfc7f41b23dd7076cf4a83b17c27ad6506c852cd2cf7c4987f93100000000000000000000000000000000152bbf74cefb77fae8e825443e4ce09b4e223242187f563a236695294d0a5f540f0b29d6f93a54cf0a77900e936e61e000000000000000000000000000000000079f4759eaf044a80417345a1b4029f8d4cfc7e00fc625e815cb7daba2243a97d21e42b42ec968dc8647158fbe467088fa878f6a2e18b88d6badc5b42775e92c17974f3a18817b7769d44ceecac46b89000000000000000000000000000000000cf3148d0c30774104a097562cc83456d5d18643d5f7ad58aedd9327bf8e9450feee50ee893442b1cde87acb02b62045000000000000000000000000000000000011d4037dcc15d0c50337d71816a2b77428b8ddd530bc3b3c8550606229f88286ae94ba03578cbb5bbaf118916dddc90000000000000000000000000000000016160c8ec4e2fb780748aac279bc248b2e2f1092262f86d368d2f06a78ebcd27e929930c8f2be124e9d92dff5c6c6f42000000000000000000000000000000001980375281735390f48ddac9d00d4c6ee7312ed0797333a26a1684e09c9575e57bcecfc4a31b8d9597a8ecc703835e22c4f1a7d2b66e6202c957a649384cb277dbba769afd60708b457613f0f3372515", + "Expected": "0000000000000000000000000000000019ff32d2901b7732df1a924eb3c099a9d36bf36cb32ab322f46a72d99d81c7942d0f2193a4aeb55cf079a2cc1707c7aa000000000000000000000000000000000193561d0433e1031fc51829504ca70e92e19bead2e0bad655aaffb6b41f5f75d18f04a162db7714f3f23da891ea91af000000000000000000000000000000000d010c36acbfb38d9dc2df6e6e21bd75deba5708fb1012eab23d06d78b1244d4daae38aa4f803d12441d91adfbaece7a000000000000000000000000000000001459ebfe65c3b2c9b2684042bd71201869db1a0248c740a54fbdafcf18fcdbcc7b677af43abe803362b462369237690c", + "Name": "matter_g2_multiexp_43", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000005b9860b565fc64146020647d1902e2a2d2fb2002b54bf5e21b6601124edf14d6e8836f938843fbd8c02ed8530953dac00000000000000000000000000000000104938181f16f16318d223febec3be3877bc57067fc23729d1f5552099125558cb21ee0eddc32ae0b0cc3555219eedba000000000000000000000000000000000211f809b624c4992a43e78a978ea32accf9e61fccef6bcd05155e52adbf4853340dfacebec9fa87e5417c045da25f9a0000000000000000000000000000000019bfe94a18da9ab4ea744389c17870ac96218d02178bf2ad502f166a3a1da8c14e3fc52038021503cd24042cde8f306d0241da9d8505208b4d3ba2521a42f28df7d06fc212e9e84931cbd30ae3ba2e150000000000000000000000000000000004fbb396eac2a1de9953febed9fb6e158a3b5a366f783d2105b562e8143031d7a1ef039e3fdcdb675b3d3aa4f4dcbe4f00000000000000000000000000000000155e23b5b70f1ce34fc229ad5c8bdfde7fb5dc0eca19596c658c1f8c38716a0a7b5ff59ff19a7a67e12760fa90eeafcd0000000000000000000000000000000002cc82cf87e7ac05be236104c1e668b5573674d9bd741f2d91d05c8a11af1f72aaa1dc20c73953fea38e6e069d2a43de000000000000000000000000000000000a7d1dcab00db0e7c0a239511d630526fb120defcd9453fbb57ee328f974a98721274144e48d22558edf25595b8ff4cc6fecab1334668102e47f1e7139059c1d715a1851a026a1580f93c2daa3f08a270000000000000000000000000000000010c9293b3c58d646a95c620a0e0a7a0a55cf43b4abaa0de1d5570fabca8d97c91afd67bd45aa234273715457da5a2894000000000000000000000000000000001454f8682f3736847cdb3f784a098f7c9e488629efc3820d49b36a2e928bbf736dcb3e1b30187c2c0090fff290dbf97f000000000000000000000000000000000a0fe3c635a81f20258db4f1031589afc8c7fd07f2fe1e5cfc8f3c40d08a958a3dbec537c51be2de99b849e006870b6c000000000000000000000000000000000728876e3fdc42273e8d71953de61dd5c03e7c31ab6ec56fc03cdf55c8f0aa4b4e5c8ed88c23c28568be0d864df026af4e2023c64a3b51cc3d82e262f83260ed4a5e9e3238b85077852fd501b52aceed000000000000000000000000000000000c9ba542189ec1828c397ace9639cf2ebbd1613356d8fb26d3c40dd00af1f43f5bbb25032561aeebba7b874bf39cb0d500000000000000000000000000000000175aa6e94a9e42cf809f48f51c48d60e74d61388dd217b55f3f63612c4565357581e5c39751a65afc3b7488caf5151720000000000000000000000000000000014c880d35d1d31793145803182584a8da003b0ee3c29c978b64bbfe4e1da82910a4539587ba350d393e1bf3169c5e4c70000000000000000000000000000000002a063b3fcd77180de632deca1ba89ec4ceeefefe9883ed9e7e06301a268bdf377c3a6e30859e5a39419e449dd27ebf5dc0a88f0aeb2b082dea6b50d591018330c2276830ed554840c10772403561ed700000000000000000000000000000000069edfb8a83760e09726f6d1c117d4bb3e499084b65e1e830ab30daf1625c37f851ac122f9f5c795912b5b6f7907ffe1000000000000000000000000000000000eb6e9b55869f65ecdf3ac46d0ee596d07c573f88724bcd802b4429392b9a56730a217a03286deb5103f70aba7a9bc46000000000000000000000000000000000e2803e1a646bd70c51806b676591b328cb20359aadc8e79d59e7c31e1ce2f1473b0b19f7a34f23aae09678b11b37432000000000000000000000000000000000b3c9fb5a39a6c40343259e12ff4fe5058f25619d145922e1d80c3f5d105a7495dd9a4da329a2e78afc31a87b2c5d5e2f68c9e76d9d8914f14007c968a31089041e67312c6a3e5d30e65efa55894ba740000000000000000000000000000000019da372143e30307a71c7b96ae0703301ed723814a35e270ef6a6b0c57144f494df1d3fa0ac369f59f3daf534070c9120000000000000000000000000000000006521d89d810c7542108de26bbc888482a3bcec8cb9b542db42d5d4af30d6c339a5b4e959da4f98dd6ef8075554f4017000000000000000000000000000000001387d9c684a0fbf615e7023c0f3ff47f4d2c5a9f748f0261656a09b23066c745420df0eb180c9716d6d0743aae7689a10000000000000000000000000000000014271b9d0b21cc69072333a6c03493321b9d9028149d24964a3773bcbe5045875c457aee11ab0682c2bdd44f098f363d80eb90c6cc25b3a48d93b94b698eff513da37210ba79d22d76a270aa97fd51070000000000000000000000000000000001dd881f3d2063adcc5638b4b3813a30e75fd308de3c9f42e5382fdbf097d5796ee9e03cb44752515b2459f131f58bb90000000000000000000000000000000010f491f4594dab938115343edb47b0087d1cd1bc12ef908e150ecbdb3a54d8dd51ab24a0e10c585f235ed99fbd3172270000000000000000000000000000000019d1665d452ce7fb6bb6da9782a55dcf12a1d9abdfd50435b8f2a1bc5b323c004fad35ff7e9aedfd414a9b68fb1eb1860000000000000000000000000000000013828087beeeb85e43e8540fbdf97af189878f5ddc1eb35c95aa06a26923330f3b8a2b43f835186865d6f5f6afdb2b9b067bfd893b12c79e13659ee9b5f22de71d806a85410c9a23dc43363915a606b100000000000000000000000000000000014964f3576b97c00a8c5f4372e2501944a1e4374a3c30e11376ea62e09d52d40d428887833bc2f06279b859c00c98a60000000000000000000000000000000019ed533a3bf469ce5b3e4e9035af177efe9e4f8b0a0e5dc9721dde49a7fc66fa31c8b1c8d5bcda1bf75a532bd2be356d00000000000000000000000000000000064ec4ed48d63ab62373adb7898bc904d246bf2b3790c3cd850524e50ec38e7fb4a364344a6a1dbd26f2ad2d0fccaa1600000000000000000000000000000000134aa3c6b72d39bedd8f9c619d206a295cbc05c611147d38aa7304e995089ce34ab1fa13c2d6c6807a88797dea20214b34abb11f7ed6d73fb81ce2777acd6bbe8839112c527ef4ad88b094cabdb4742a000000000000000000000000000000000a2a4c8b457d0d2554a2d439fd3b74b18843386aaa00d1b89a1c2d8ff7192cdd1d3a888994376bb7ddda4d16bfcaae3200000000000000000000000000000000155a7dc763caf6f0fe1ba9537c0f75d3e455c2d1c749dbb4aa7242b40a9740fe9e8e88af6017e8f743a9e4c5dc6ebc23000000000000000000000000000000000a693da3aee178e2f0489af77f671c734423032f30c0b7b48debd3b71e65dab7db12ab1e0e72d3ef686d6c1922aebbf700000000000000000000000000000000109c3476016884386d6206c94073c628375a02c8fcd3041e06b8b413508188a1d26ec5ddf84a77d059e9a039dc5470d08d6693acb1eb73f6ed1bb4f74f1062f720a7f2c0ecf2b5a944ff89feb2688e19000000000000000000000000000000000a07f457f5dee69e9ee746dd67f982914a2182b5cb2609d273d4122d57a32c195270c956361d78eb65449cf5e13907ba0000000000000000000000000000000011f149ce84c2a11ff818be3ff0f86c1b38a9555e169a8cf791c79828207b7aa89c84e8012a0c5d8cce4e89d758b90e22000000000000000000000000000000000d636e5b027e41809d7ec8bbbfd4bf641a56599a63a7678569404ec8d45c3b88c1d2969e6101528d4edf1ee9d8e793320000000000000000000000000000000011878eefa5ee49be83ea1f7a9cdcd4997ccc59a9669778b3f006429e1a22d3b2a051924f371a228856523e3a09bab59b29ca1b157e6a2b5b88d7467e851282491ed30382ba217b82ea5cc9ca0c6986930000000000000000000000000000000019e9a1950f663b258474b24c334bd256d3aedcd26dc971a745857bf1fe007da0aa00777db5c3e5d21294e99862bf8ea1000000000000000000000000000000000329a12fa0add36f259e401442bbe6e5f9139e4a46d5d091a2110d2561b5629211a1c1996f20d19327d1782340e7ce4200000000000000000000000000000000032782c94c6e45a88425438324f3a24ebf37f0be213424b1be52c878985633950a022f57f8d64af1470486aa3744f3f7000000000000000000000000000000000631556d52fdcee3529023cf20d46ea09ab3c642a7f4eca2878e4af88801d21b80b829c9aec9e73317252639c148676c40bb53575662fa0b726469da01c39df389efde3936d2eee18d7035704130ad6d0000000000000000000000000000000009eb122c61ec44afb56b64929040058a804311e0e97d3fa513a162748091304233480bbc883f6fb66080b563b308a24a0000000000000000000000000000000007d1d810fb8788b9f0cd04235771d7adbbdf8c6e67e8538b2c6f0f278755cc5e57ad720515ca558412ae1fe2cd40b74d000000000000000000000000000000000955496bdcbca8716245a130fe6eef44d13280b2d56f15bfc772f8ca66a52ca0a742e6bc273c28cfc858a3269f59beab0000000000000000000000000000000000b27aaa0d94633912c96f00ecc021773e5cf5e164e20c7a7222a58b0465e7baec4e67fb56ffe564c7a2904f36c265e61574a30a575138c44881c1c126be214c6b68335d7338875b8a398196f27510d70000000000000000000000000000000012e0572f5c84f6082dd05705a3fae738920ffff840c21e444f0ed002df16394afdc21c249b6f1837389c48719539f4c5000000000000000000000000000000000c26bb3ab52e3bddc219dc223daf472247547544e3a9ccc31123b82000b17ef325148935621edd36ced4e702ade1ee3e000000000000000000000000000000000c13a8f02dc3f209e9abf3d316fa843be9c4dd98ce1ca2edecf757bf2bb498750f6d96c28abd45d9c6cf5b8b6334b63600000000000000000000000000000000157a50d9034024dfc7b0f0db4ea0f45323d76c81bc844844ff9bdd0c13f2059066ec3060210aaba61bc074afd7ccaa286dd51553c4119255b31cb0aaad7391694f7dd29420420b513699747bee819a99000000000000000000000000000000001054edb092a7053eebc542f690e03139f2e25a0098c665741e8711c8a6b9582af47e467f74fff9aeea098b7732be72d400000000000000000000000000000000084f919e219de15e7f9ee122383c772415741e5b86be6ee7d2193a4f6be5c9cc9b2fe5e8beba26cd768bf2ea1b6ebffb0000000000000000000000000000000001822b4e8fae5bddbb36f5c226216471862af238be770d33c4fc1ec2777350db2f42e33a7ba468c317a128e8446ceff300000000000000000000000000000000130f704596ddb28ec6e335d9527707a75c97298407ff3fe17d3cba0cde4c21bfcfd1ae46272018c1db768c036f215182d88f049ab3ee2b01af449abce08ca14ea3b065f06a8665ae3510b4c04f42308200000000000000000000000000000000194dde06f8c54de9ab0ad72ba0de2241fef32fba30fd6f5e83fb7750bc120d51c461d75e495cee0d1e85f0f39aa9d3620000000000000000000000000000000010646496be02c658c82dc68eab86a4f784cf64494bd8441f884e8ff384cbb6ff3a4bf5126bbacaa556aafd652397a8a800000000000000000000000000000000109807bd4b6613acb3eb7d386e84166219e52e841c41185a269cc7cfc5f34e9ef5cd1fea29877749e0cef93a3b44eb1600000000000000000000000000000000020a388c668c9339e7aab15d03108317dea97720dd27a94cd3bb59b372b268d1a7d7d7409780bc4912c3f95acd42a57619d6e227185c538b122858ad5ae594720fa7f743f5805552152a213ebea64aeb00000000000000000000000000000000161506c4a2d57c852fe8c3dce63ec6673f05f99c1e032c8e591239616ef4469c4240482ce5985fdfd4a80f54dfa7024f000000000000000000000000000000000486c5b106393e544852c143c5ac4a882c79870363858b2c910ef4041d8803876cc55ef59cd6a41869bf5247f0db2c0a0000000000000000000000000000000000fe765ebf3c4edd3035c7bedd4aec918426898339d7aa004fd74bbf0e3236deeb7d2bbba56c31fd447816e301100a66000000000000000000000000000000001917c9cf16032e22cdd3f87f098a532a33c9fec560a88f9d4232f96cbe0fe945fbae6bcfdd2095cafe6e0b21071d6ec53f53123f01c4d0d4c18dd72ea87ebb5fcb559df255773fa0165f1432c229deb6", + "Expected": "0000000000000000000000000000000015a88bcfa39f444cd66d0d7e15c4040561154c59b832c5ca895f8f8077659487581681cc8f13be136a35b4a573551ad00000000000000000000000000000000009fb6b87eba1edb3d1d23e566977eac68e8f1a28386fdca9d484c7e341c1b210390787418e2f2dff7a228e1cf10962d6000000000000000000000000000000000978de870dcd8d094072897707313b9f1a18d525e60a7cba2b2a395ffcc9d0f97f84e0784df36247d6c98824aaf3ec82000000000000000000000000000000000fbc6832c324d40f104bf82c8cda941212105131c26f630af1d3f7040ef43c6eb4486766b75a81433e46966f79953647", + "Name": "matter_g2_multiexp_44", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000007517a941bec38d0e84d21508d8bdd6778a853d9fb4c5e953bcfe3c8fba3732ca0b7f6cb5c363f33d7718b1b1a68f8e800000000000000000000000000000000150c0d975481422ddec2a58a55b3d917b6b7c0510e75442c81ee856e267d7efa09641c6b79fb9e699c6b473cccde7f4d0000000000000000000000000000000009d37bf938ac30fae1cb3ffaa971ff3746ee4090d4bf8b11dff7710b3f2e4cc686813890e03643fd56fc99e847ae5e940000000000000000000000000000000010fabc4048e0fadad73d0481e290c81884f4578cfb66e0a83324739652ccf273b62204f126696a2fc6469ede39e00a9fcdf2bbbad52a3f5c0b3959d46a8c42f6f5250a93c3dcc636712a4a2baed289c900000000000000000000000000000000089b167ce7fa997ca0ad3f8bbbb358824cb41f525bf60352d5df99402af62cc6d768113d2c1ebc7fe8190c5f732fbfff0000000000000000000000000000000013dcd35865e27bf98f1f6508b32c7e9a989d528df0626228087bda0d8b456af3ea2f4be6732edf1bd8cfd0ab9576197a000000000000000000000000000000000333b0612d7068986d21e1cb67a1c7af423e98cb14aace2ce02f84d32a38f97bcdac465f2b22e5fafa6aaf0d40380e4a0000000000000000000000000000000010de7ba4f50b6654fdecc4fc6c41289bec50cff1be18be9d5c9d1f906ae843189bb43f144aad4d2a2cdebbc2697c974918adf5d8fbdf81f8e4bf2f622e2d481fb2dea06a1aaa289ce4f6e783eb9a98dd000000000000000000000000000000000fdddfceb29fd79c31b138ae8e41507f324abd5e3750da14f4f86176126a06380d53dd5f7efd00e7f94bc1370ac9816a000000000000000000000000000000000d8371c602e393a4be250583c299d069270a344953f7f07a5fe27f8617cbd3ebc91f423dc176b272339bb3bd8a9a348200000000000000000000000000000000193a260a417c9c46da0aaf139e3bbfbaa9f248943048396d95716b3be0b8a148a3f0ebcf7d6f9a318b16d2d850ec2f5c000000000000000000000000000000000be4d0f2bf6d746b930034eea8a19d73377617645c29153b6ae6d3ca6fb35a704b6a0bb658282cf93555c998f6fd054a650e995b73b63d068fd54f596cd9669fc3061f0c1da77ae7d0f5bec012f9ba69000000000000000000000000000000000731c0a5d076d6addb15c1e5d3143d41371f4835d77756418bee452d2f03b1e603230c59f87905fb67d5eccce65a45d20000000000000000000000000000000013bd198c023009190c65686468523eccb57c5fe7b159a1c5ba30c662a275fb24d69338ec9c023ee6a10a8ec9dc7968210000000000000000000000000000000018fb369923ee655839c7d996e264133c49f102978f18261faf2f8eef376eb0bdcb5af375ada2bc783e50df16737f78dc0000000000000000000000000000000009ab8e16e1d0b406adbb37e950bc3820ec13c882ec4483528ebac836726ba202bcf796e84abb3c16dbf6d1131b3854cc3350d4f13e25052b1162dad3ace76e5cda71680fdc89460d8fa88c0d157df426000000000000000000000000000000001401029d7cf8e7d2690a27c01b32008e273b5a33842dcf52d84f77dfa4b2a1fb290f56eb4ccddbb420b27e06a7a3a3b4000000000000000000000000000000000c464c6fdba702f2fbf4232b34d615e66dbb5bdf80233f695e9103272111a06a79f8972d1034176859d0e29400f5a9c10000000000000000000000000000000006cc97a29f4e694f0cdbb099278fa94140b40147f4f911de96a762f2bd28233598a892899a6329cc3cb854b56076787a000000000000000000000000000000000625811cad7c740758388f330c4a56ef30429ea4cdb9a00e2cd1b7f310184a2e6ba36ebdca57c87cebd5232f52c34d92283f0256766690c88df6cf7c968b9a96121d26d19672ce9adc84b699476a32db000000000000000000000000000000000d0a16b5d48eb062c71b91d74a0d25eca0d4bd7082de25199f33a9d3d598d137fbee2ac36e8f877c157be7438ebabd74000000000000000000000000000000000bf93533bf677050d9a77a5dbdbf7cf084b5d934d55318256712ec361693738d48ef27536476fdc93dd8e81f13d67a8e000000000000000000000000000000000696fbd8841e60300602aa5528391aa8b196d8c186d6124c842a0124a8d8dcbba637502f330c980b2f5a900be8e04d020000000000000000000000000000000017b0c51e699d2252f35619520af71775f9dd8c57c2ef146adeb72640bec2ca02a59680153e5c9f66bd513bd8559b9d66145cdeae7fd3f7455dfd2ea9a064c135f0a0a36990ea34929e292e4cdfa0f472000000000000000000000000000000000eee94b5148ccbb3642e582cf0a517b72e6ea019676a13b1484982de7f4be0346b7ed22979ba7303f6367294a3eb2716000000000000000000000000000000001502bb3964f6b3e862279e15fb105073e876c4e48c55c42f3737dc9efed82b10fe8e39438ccd39c933f5ac3c6768497e0000000000000000000000000000000016cd8c4b3be55474aef7081cb969b75ef5e7cca9bd0f9627928fe9931c6f869a9a49d0ae2cfb8346116eb3ced25d4a8e0000000000000000000000000000000012456eceaf32cbb6514e6211136475a750889caea18ff4f9d5ed7b378e6d1d265721a646715aee6b9f2098e954a88289d9cdaa979ab08b454dcb961e3cc4bb18f706bed93a72a9c1e105cd69c0b691af0000000000000000000000000000000007b5633f4a7dfe62f11065d44581f5060210f8e572d960eb85ffd0a903d8b989ce10449fc90b7e5646784a9f6df28699000000000000000000000000000000001710f252cb35d88f6bd151ed596f2d6455f050c5e25add394dbaf60fc036016ae07a5a8ed494b95875c02df3c523186a000000000000000000000000000000000bee19779dc6430ebee993f82a054fbd42e5b7265090017e5b2d2f1469bc96a5a188adf471d576a416f6a841081043df00000000000000000000000000000000038f9fb4159e4e6f596a17ddf45a00a9e4aede63b062af5eda045efacd3977e8dfd61c307834c08bb4c284638696e92ef262f9f7a26353193939bfbbdc50ee35614a3c099776f08b21e0c4c97521eb8e00000000000000000000000000000000197687895f22c4a639bcf2f494dd9e5a034610b0297528235f1d806cf032f5a86c5248a83ed6b12f0de27f5c6e6f49420000000000000000000000000000000011ccd5dd6d6ce553ade9b31503a9e6a6119ae329178706f051581e3cf0ee9d6fb527b340bab8c79fad1cd451c7edb4330000000000000000000000000000000011e9f051aacd69c8bfd2f0ecb566e6d38eabc43f276ba7a1b8e8ab093917dd1c672c61d6dac4651026823b9938d3601f000000000000000000000000000000001362c3b2e6fd9b3618df26ed28f96530c1915f0a4ecb647658d1ae4ccf4c000f3bd1797696c9ac5c5000dbe58dba8de44f0d2915e82c9a69f9e9af64a2c5cacf61ead492bf69912a35ad6a316f9914a8000000000000000000000000000000001819d13cf4522a9362bbeb0bbbb0a498c3f34da1c9e3b2c54d08f7c8acd9ee756983fe80405579effb79d673407390ef000000000000000000000000000000000f870e5978f4a6e3b655fb2a05541ac0673e7b10136adaf28be4dfc9022d4cc8a60e17d125dfe53fbe10c644ff37e02a0000000000000000000000000000000010207ef774cddd10db2bca0a051ceb12900c407ee265dea4615553c193d7475b5ba3198b7e0160740e4fd015dca33e1d0000000000000000000000000000000017937be546e06fd2eab4c969a029534c02fb770646d43edeb5e6c8bc0c2b5f35576c375bf860fd1087ce099d4377d24e25ed3f13198b69604c08b414562f67a67aa8dd4a7bd3c066874182d21ed9004d000000000000000000000000000000000db02fcda340fb27a3fd7da468c5cbed9c8dce8471843a8ddadae43dbec9957a0479aa52855d7a6dca99e7922432365c00000000000000000000000000000000163503d24f9af34058cb5afd8e9d5aaf29e141c8521eaac282f138466e834f0daa9ce14e0590b501680d5b47f866aa8c000000000000000000000000000000000fc9175e6d20afd9d194907f2eb311bf8134aeb96da72f6423610612f2ed20a074c113fe8bb632d9ad74b2f6e7e2417d000000000000000000000000000000000b4621f5e4465629648b62b7f2b77afe6470f9706f9bee5b3ccfa66c596842cbae26badc689f7f623360cb7fc1d416b84ae188cc115e9d492be64abefa4bd4c93b61dd42a7d213e1100b8108611a61630000000000000000000000000000000003c77c7efdab9a9e71283b034ef581a31faee417febfa99be3c18e8ab724c140be684ce719bc5a9ac5d3855ddbf3651a0000000000000000000000000000000011889b02b4a1150fc2b7191a95c5ee767f3c9b82a3a53591018242fa8685ee3b3542526dfdc00695a6cf046033b8eb760000000000000000000000000000000016d7463159c4e3cb635f24bfb944bc518369e894218bc49d7b7f0ea99240259f7ee2b4c26c6083dbc4559ffcfbd392bd0000000000000000000000000000000010a85df6294fd6406ca651f15494153e9802f0068bfa149e87fe4b1cc3071ba74940a21dfd55a8a77e7e2a193468a3d2eede725a693277356ce71ffd7814a77fcc30eeb3a2b8863fb91ca03da1cbe37a0000000000000000000000000000000016beec57d3049c382fc039ac96b890412c5e8075afcab599fb877f8639747a587e82241d9a8059a0bb45ad49959777d0000000000000000000000000000000000a70fba1b061dcf587f133035a3aaafcdace3b1e771d71887ae914919e5f52a99d9933307ec15b5f0a1623b9592824500000000000000000000000000000000005064161136c04f9f50e42a5cee5dce3fa0ce1dc0655b3785a852cb9741927f6c9b357ac1010d7212533d1593c83dba70000000000000000000000000000000000d50b992bc0eee37a15cfd32eda2c591fc4c4203ef84232d1a1e7a9888005bc00755d76b9d0345bb01ffa7525f2aa1e9d0618f898594b23ee3754fe390d6bdfa7d47fe749d6819e306935c1eab6b0460000000000000000000000000000000007617e60d8f67344ce6d2fb65cfd5b423a1fd091626da837dc8a51d6ffdeda9712864e8f30e45ae8df917e0e4625e59a00000000000000000000000000000000077c4aad14f870ba24703397ff0b33af2e50b026f3e0f13f3ec1aebc9ea3af98cc65ab56cce4045538ae6e5f410196f10000000000000000000000000000000004a31d0eff18afa87f9a53098cfd5d21e913c7519cb171f83d0b73abbf3e893a3ccd5aebb9f2bbdd3b0eb0326d37fd1b000000000000000000000000000000000393052e6dff65e01e79254af757f12eb1931e0b386f8cf0fa0782269f962ebc5d9bde46f5a4ad3806e88330aca59ff01e1c9420cfa91026286d7f986b538c13e8c97893995485308c69f053927f962200000000000000000000000000000000033aa108d252e9107f29cc7da79585d4525ff2a35d31479a099c7c011a9c4414d7bc5f8498f8a204134b2d14c5fcde5100000000000000000000000000000000121214465992bdefb970d420face6db75d531e67314a021d2877643ddf738fbe57625d286bde7f40efc1d329a2e85b6e0000000000000000000000000000000017e14f6cdd916b1fc949be8ba3ef9ae6cc16d64da4dd498b5458ea0c14eb7aab8f970f030aab26397110331da11a232d000000000000000000000000000000000c56ccda2a5cca61025253407e72967c767f0e7f2aa0b97d4e4a09420dcb882ff35039ae504a9c62b3f9e7bb0c2e7bbbe5095ed9a9181aee392888e3194ebf9c4a6d87b503f4668bb6cc0d290880a44f0000000000000000000000000000000010fb3396b0674b9285cc5d5a4e7a41ac002f2b43332c20a56f428d1e19e1d1bb6f886d3bf03f7b0fc509e52d75965e15000000000000000000000000000000001196b7c253c50da10815bdfd7930a69608187fc3ac5fbcfeb35b95754d3017a094afcdaea867c2f08346717dfce7bce8000000000000000000000000000000001021f178c53b7d7d2041a6419203d12ee162f27999dd8f79baa15c37a7401e7a6df6aa4192a310cc1a23bdb0b427d63c000000000000000000000000000000000953c75910165f11112583476574f3987495d33e5b1a5c650a2b30692592a442d9de36da49255b0c01a7bacaecc9b81adcece8ee33d3bf3188574e94a889794077035ee92473b7266d92a3c018771b4c", + "Expected": "0000000000000000000000000000000014da1d424c936453600a4acbd3666c6188493d4da8b34d6bc508aab07e59e3680a9e3488e69d42a724c9486d70ed4fd000000000000000000000000000000000048c637348fb9a4c631a82ded1fa08d693cfa2cdd6cdffb8bffee63d1bb2ee8676512a1a8d375e7ab942b6d6bdda45c80000000000000000000000000000000000443264e7dfca91f17251c33cf72c56b045902b4db2eb10d1fd856f79b4130afa6f29f3283af7d3b8b2a9d8dd63718a000000000000000000000000000000000fb386f875190ac7a49d4742edb387f72c1ae0366ca5c71d5b7e385c11442941ce0fb9fe2014fc624fe93ab86ebc7aff", + "Name": "matter_g2_multiexp_45", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000016a539a21320574fc25ffbc0ff10c821d6ad20674413eaeda6f4a31f9a028e21cbb3b224c225a2e3bc3dc221cec084cf00000000000000000000000000000000104e44989e2fba9ddce8e309f5d3fa3129f679d6456ed11137149b50adf8b22c1a148d47154450853e6797aba2b006850000000000000000000000000000000008b33b8cfc992efdf7d733803a6d08a4102e27fc4960ebe6ebdb7949c4ff5af76e55002d93a4f7204eff5f2dc4e37ef10000000000000000000000000000000017c35411c571c302c746a9b79cae892e988d50b4660564660de960ee09b3937b6f5b61fe37d09f1c02528f554210744aaddc845ad867f1e2664ef0e78bced8ff6904c5836e7c63ea3a9c858fd7b710b60000000000000000000000000000000009cd32594094d4744f59690cf8d7fd260b5ffb2a22945d938c035151861507ecaac9ea553e7b44fc4b3beb03b33783540000000000000000000000000000000006f4de33731b9b13b9cb395798769e54a0679d272c2d5175455e10c790debabae4ee02b6df08975efe806da9c4a208b20000000000000000000000000000000011859798a8383b7f994a1535bc0a96a114b90644d19921f0eec774ed58dbaa899dd3736cd1f4a4ff9bfacbc7370091d7000000000000000000000000000000000376c25b0f70427d4974c4fd1539d40996b6847fbb67822fa01cfd541cd3a3f8a9f3fe9f7ddcc3ce920a6ecb27dafca0c78cfc6a30cea34d3d3505f4f897631f67ba77913734f6c2895d871fd6d5581c0000000000000000000000000000000003a178f91a135d59dbd65eacebab293a3817d30e734c247f56a08812aa540a5c80e3f9908d86ad787bab27fbddd21517000000000000000000000000000000000672b3544dd2b91a626f37dbb389aff073777164e3e20dc572b18a2e5223bd323094e41bdbe2dec9bada227efb37dd22000000000000000000000000000000000f40f2d279c66f22bf0fedd129e02c96d8906f9f1ec19f5a5c1cbd5beb10942a066dd391b69920a0a697138f627a1b180000000000000000000000000000000016ef3caad858d323b752e5c437ee2043c8f691ca0f1862e80857f7cc478a689df97bde5b1d1350892c1adb03c5d2373ba1e40df9e1f7c84633cb3dc2223296887de7281ea66c5e1f2d5816334f7b280a000000000000000000000000000000001276e133fc5e708a3265646ef0a0122048ef95d7fb46f78b8dca57dabae0164ca986bdc74e581604ff31165f9f28dca50000000000000000000000000000000008a77611be0502d2ea7fbcf73774fbaec68eba36038e2f34f79caf07f2e4b7444efc49a4e85f88af585fd28a041f26c800000000000000000000000000000000181ab176e391190b1cae2e9b4105ca14cc82d15890b0ec127d8cdb46f30b704a089ac69e76f5b50575ed66176950e1120000000000000000000000000000000004031ce77fe9ee319b8db8f220ef4480c81568b3f6e4043c8710b559d25ad69dd38dda48b2e11d5aead18db0d1cc09b98810b9ce0020904dc1903338089c30e616ed0be03741572ce46946883874f4ea000000000000000000000000000000000f26e6d71e206c88dc81b8b8a5c05ee84a9f185e7b7f155253aa39104b5de5be7bb6cb6662df4f8e63b37fd1682721f20000000000000000000000000000000010058d13637c8da2e91c8cda7dc2cf1734a2f14b12b798e5c563ef9ef3624255a6e1c7550c37b547c35c55dc736a17ce0000000000000000000000000000000019ed470bd514f8bda8fdcd9c64f7626efdde0102907bd31551b1d1972aa14e1d361e1d58b17948909a669fa4d99cf3200000000000000000000000000000000013277afe1891807e269c22c9aa1598c12081809d888e0eb2513ca3f81308700893f74f176858ceed9c7955dcc0d8fc6893e7702da2ff9f3f14586a9ae80c8713743d61b915a7c379c1faa1b151406a9a00000000000000000000000000000000083664daa965c4173d6028e047794703a16e52ae459d3db0534d13c72d749d603edd668b9ce500677715e45216367c63000000000000000000000000000000000f4e87a65f4720cbfde7868eaadb34ec1916925ffd84e5407defbda0c39e1c7afcbc90855b275d528e7b63fd3707bd4a0000000000000000000000000000000004c9f689abe0d2dd3d927bad4b39ab44f6704014ef9a1dcd1966777129e1c72515b43c1b92ee60e9611245454683588b000000000000000000000000000000000ecc57b08b45037e62498135643cf077f01d216b5106551daab391446ce7bb37d40f41378c830081bb6a326f0105c2c4eca54e365faa35d2c9be259b53a1157b180a373813382f47c9154af18a2d83270000000000000000000000000000000012b84341bbad1eaf7fc8ebe56f67598821017365b6f3b4cc1f2355f868e8d55f9c0bed2943ada202a7d85cc884d8e6a20000000000000000000000000000000017693721988f73d77f7a41db108e428b0ba781ea88eab463693ec352cc13d394101b9a2792e0f30c77bebaa395a4776700000000000000000000000000000000093245e2919523cd57a0abd2e8a9c5cbe774bee957f26d3cb502b9c8c06483b850b031461dc2cb033d399651724f4fe4000000000000000000000000000000001530f7dbf6a0fbdc8b4f7a4d298b7824c15035428cb8df834907e25c64b8985186bb13f397b7b99ea7014ae65c428b12abe2079ecb3618de3accdf291d9479bec32bca1f9fe87b00b64a12d735f5b9a5000000000000000000000000000000000f323f01f2a63bc6eb1b565594ded14043c4ea5d1f0fbf20f39299052617c334e6126afd4273738aeb153c3561348b8a000000000000000000000000000000001525d1e1fa65f1b674feef74f6c81c82c3eeb709e597aedabbfc2b3262271b31d93818613ecdeb49c5d3a6a64f17a5d90000000000000000000000000000000010458c15bf46947a237dd1c61882b1561121f64890681bae5db6fbd24ef6c34b7fcb826eeee1fa328d9ef4d859faf238000000000000000000000000000000000e1f29275fe1805d02e069082d5e9a7acf69be17013e6c4c351277408d49383fe06f00137e777ba4aa49c29c25c6c0ddc541a44756ebda14aea95f1a1d05e7366dc0285305116b907fc89e777ce45f79000000000000000000000000000000000efb7373e11694b966d0182a9b01d1e52ec1e89cb18275921294e2d36333460b1e49fd420f1ab781b000d1491ccb0b11000000000000000000000000000000000cafcdc2c58fb3fad713ce1a38deadba8636c384243f9971e3930b961efaf303cac4eef1e8e4662636ff91eff1bf52a80000000000000000000000000000000007ea7441e1b2b0f1e42bd511c060b646c2d00bb3e6507beb5d17ab93ff68515b02f82c2dd43ce035ff660ddb0c104a77000000000000000000000000000000000bd04b88caf9dbd0ef5f89d12e72aa47d64212332b0ed871b7eb96b16295cf4810f6f20cc85fd4d1ce72119f80697c1b37d521d31de52681f1d9bbf64a12f9bc8fe0ac61aaef14d7e8d048ff09e6578b000000000000000000000000000000000c3d2d978e23a690e8422fd54f36fbee1f642611b6c3b2c2413844066159bdcd3703d1a392b030446af04b654f8f73b7000000000000000000000000000000000ae652fcdbd8e467ee9b447e61fcb811f8b6aa48840476c92daec3285785a06a81c1705fc2896c0843ab48eb92555b9300000000000000000000000000000000007088e6441cb85aeffcb4a9a0c81ebfc54a61f35c542be3870c2bb94d7081353322d4745747b0dfc3e5db07f9e48c560000000000000000000000000000000006c11f3e0941ea3bde0dd3a562dbbdad433f0b1e99ba34879e86f7951ddfb29b9e04ca62d54d7552a74e8cf1c3da3e704904a876d4ac1341e88fc4808508c89c19dd74aa8fb1dd7673cbc2d28e7d920e000000000000000000000000000000000c665f4417d0163820ac96c83cc2f09b1b3c000023d827e2690aad7357ff59e278832b992703f5f0016051ce0a4510cb0000000000000000000000000000000012f4b6688300b253fe868b3790f6d2f4fc16d81a49ff7a2edf821de16dc992d79482d66e443e0abb5da43df69f8d648d0000000000000000000000000000000009e033750a118d998b136cd671d0e760e3a617f1d6a994db8f6dfc391619f408720cc57fe550785306184b0c824705620000000000000000000000000000000018cbacd471e528535e22f714a841f110fb0484826e30f97842d65072b2790dadf0bd7b28df96bec531fbed1f3f93486b68911b04d8155f90c7c5c0cb519ee6ff14c0ae27ece0374f30fa148235e8cb49000000000000000000000000000000000c42b6fd52cc52034b04078a6565af2b43948695851393596e05f37f297dfaaea931a33f5b4c25980c093f8a742c0020000000000000000000000000000000000fdc7aa20e63743dd6ab32c82d2d6992b29779ec06eebd452c17d844159e90a7f3221f3e0e6b5805dc0f42dc3836d90f0000000000000000000000000000000003a2342a1bd528d701c2a6c72708a16df632f4e4b6cdb3ccc224b58b57af30b44556cc968ba3c0396a5e3f11568a73710000000000000000000000000000000019ccf76462668905c5687b7612a0bdfd4aac70f291d8b772e84fd5d4bcb591556317426471242fb5f44fd695c7d49279481e894ecd52a252cc76547513e2cf0a5cc6b20c3dc9c64c7f34f29a488258ef000000000000000000000000000000000c8fd4a171c5fbf584f567a1c10b20628e7e0d5d796eac4a9dd2376f8d488da25b9219c7c70709999b5553f8bba915ae0000000000000000000000000000000005d791c907984f2aaebf903a0ace52147745295f0c5e85964999a8fc74b64c8871dce358f26ed1b4af6c6f7f18e8f4c500000000000000000000000000000000110a453bbba72ac171876e0f6b4acd5b178816301e02586a143c2bcbfffcdbf593655408b9aaa4141b2a210599f452ed000000000000000000000000000000001025d5065f9801fcc1c1ebebdf67923b967ce985b5ca27ab5db8af7057fda23561a46b84fac5e793dd9af692c4d56cde72780ab3c48c8a102469799ba2f70d2fd9d324cf558a8c8b49e2ecdb71ae1c9b00000000000000000000000000000000023e5ea1909032676cdb79111a33da7ed788d2affbf4029b932eed843268f355dc92905db283d6617fbb530da3d704dd000000000000000000000000000000000b46f07de520aa17d597586cb0a6894a356757941ff9bdc2976f620e1bf1eec1dd9801d6baa2d7efbb3cc7073412ce8e0000000000000000000000000000000010022940611f418de9f9210b1be919d7506aca468fe5853675fe159d3e58685bcff6cbc2c1cb9e7d45a7bf305fca0eaf000000000000000000000000000000001888b5b0dd1648d9a27345f570a1278238957de1bd30c195d554750ea4b119e98b3989b912c4fad531de416c1533467f84ae1de8aaf498bd2d91bd828bc64e56482b225322b86529da703f47289c65670000000000000000000000000000000011dcc334a5037719256e514b2c3b0f36396d8cedcd77f33545842c686fa0f35558c397562a7e245f8cc412c776a2b3930000000000000000000000000000000006efd32c6afc56a07c813fe19e71f0248666c87e1df7e79b7afbd70178929e5660e85cea35d1c6f42b4c627a94ae0d150000000000000000000000000000000005a5fc2010798c793c1b407a577da0bf0e04b0478f19b7d0cfeff8e4e4fe2d581461831db165cfd17146c49a732c41460000000000000000000000000000000011dfe3b62eb87b039113152af74ae74137cba1762d4ae62d3cb0746272d1c42d3cb4a8fccd845a519fd0650a23a897a13256548db55ee9de70ebf6fa347d81bc50494b937ab1c3079977234a34cbfcfd00000000000000000000000000000000110e73e44734b7ab63f021727b75e735702f1acfa6669e0dc27111794ebee371734764bb165132af3a7e02f3605456480000000000000000000000000000000005fbcac7c7334cd0e6468feedebe077b80390833eaa4c28af80d29e75d692a10cf13058526fa5e5ab0fb635335ac8f220000000000000000000000000000000013f537ecc28685aba2cd60d0e3e787bc8104a3373177cb93107b63d39919c583ad3ad7a42e322249d7605ef035fe1af40000000000000000000000000000000014791f94aff42bfca13ab328a3e47b06f7da52e13436ad477cf55e53b54108d3aa531f0a5d73ae5ed7108d5cca1ecf7a575ae146524544307ee51e58a654d7324983a87e1b37d46cea1a4ec34114b44b", + "Expected": "000000000000000000000000000000000bab02defb32b7938372d656feaebfb5431de1484361542c02519d20c6a500f0b0b112c331fe6f4eac3ec7f6ae4167e50000000000000000000000000000000000796b38c67df1361115bbf3a4afad2651664ef55b1ed02d3172f024f90a003fc3631753d7142aafffc64c6f6f57bf7800000000000000000000000000000000080d91637a93a9025e8691a400254af37cfde67eff7d3037d428596a808a01d9bda8025b7246fb00785cd1068b2752d400000000000000000000000000000000182a97624249f0c6d24672f04e2c93eff63fbe76cc11ace0f7193facd0655cc1e1ccb2d89d9547bc352a395efeb95afb", + "Name": "matter_g2_multiexp_46", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000115b14c4eb9cc78eafedd2072be4555a3db9e61b5fe0139bf3e40a92cc37b4936c68576fee5692a80e4a9aef05a9b7a80000000000000000000000000000000019c828ea555a3c8d28cf0981e98609361b5bafa8b62e860d121c0f6d0f0dcef544784e8a5fa6a9f1d1a68b30e8e8a6f8000000000000000000000000000000000a2ef5146d2658609fd4eb98fcb5d42f6c6aac4fe53597128bbba3ba3539042ee5824f381c41dc76e2c6e4dbe0665657000000000000000000000000000000001807a12ae5f289ecde8ca0a913647d44209b13fae9dd6aa8fb4365a3beeb81652ec17cf92f6784c9ca5a077824ff6dc31129275f3ab3125db33d43b36c7de0ad60a6e9cb4457aa03275caea9635f0b0700000000000000000000000000000000186bfd109ea2369818ae2f466953eddfa763960caeee9d6f1ecbf6a3f854163342c26b56d3844bfedd8f227070f75546000000000000000000000000000000001877077daa2ea074b2868e86faf14efc6ed35a64161a77aec54624d9cb916c45de81b40acc3797c6e3338fcd7a42bb0d00000000000000000000000000000000054be1650d9bb6cae6a1ed08879668e4aa4cd139c8b07ce21d40fb1cf37f11de730ff13814a02d2d6d6df5eec4afe8470000000000000000000000000000000001612b5b7c613cb66d4134aa867d985682f6a544147e7865732887d4fbb191a9f5bdc27bfbefd397f38cb101a2d68b192dbcfd8680258eee451db60f3f42f02f388f87440d00badb0a725964042515c90000000000000000000000000000000015e2b23aa42f1e6a07b0a31dd4acc27e35ce1fb3333c3f330f2d88f112375cf24e6dd5afc4d245531e4e84f1f82230ea00000000000000000000000000000000193649f3b7efb346e0c1f7bc05b0910311270cd44b5803fa16e06655d6239f609363344bb7c16c2105e20709fb5ff0400000000000000000000000000000000002a6ee30841f471dd2ef13888ba03c9cb93c85cfd0f1d0a3927205e3f57fe291bba7eccbd2352f25cc4047097fbb63860000000000000000000000000000000005482d4a47d6e381f755c4756a761f0310d0d981523afcf288e47a1a643d6be62ac6410521e0f25828f469af6150f41e5a6f194abeb6b7c1c561aa820bba658f0277870e2a32f972f9d18ca361929b01000000000000000000000000000000000178ca460993d503e496633fe5230d895bfcdd0696d817a23ae94e529bb145a0861e4448d3bd48c55907be762192a8c4000000000000000000000000000000000015d2db77105a8ed6eadc05d3d1f26a54b3d1b812a58ab49a889f5b7fcf5ec08c2eea6ad09484fda29cc007037a1f6c000000000000000000000000000000000fd5628d61cd0835fe49fcbd2f17058f23d0ffaca4474923a2c0706d9333d9881125efa2fda56234a82158da3eddb5b70000000000000000000000000000000010ce4a0bcada5f92cc8898dbf5c108c0897322eb6a467662be569d9ed0f6e2c808e214b83969ebb86c84d38f67d20754579450b7aa155a3ab61e47e337ddbcd17b197de2dbb76008cfaa09d3fc806be4000000000000000000000000000000000fc4ed0ca43d5cb172deef02704579187a480cc977737070b8ed2dce48d3f3141619f37e985c220a2840ac01dc5667f900000000000000000000000000000000047a15e96760affa4e537a45aefaaab1e0e18052f63514a9f6544136c87b7cb4a5c8dfc0d9544518adc7932ce9cff5f1000000000000000000000000000000000c9be55c06f81e87de58a5c1df8d16174cf4115f81091937d98dad6c4780a9b8dae1081f8961fadc4f994ef62927664700000000000000000000000000000000165f9b1a8f23831a91be8077b18563c7648e54caf30895983cc26580241ca7c86b9b30408a9b27776286ed9f07bd8ecd4be94f96ec4a3d4e028644c63b2577a9ef849b403acc55e42432c3063a918d160000000000000000000000000000000006edc0d62ec31b14e87b2ccff3a21a7c8d38c3ba0ec48bbb8df27fb1acf58e1a87c4458dc2b770172460adfb9a9bd50b000000000000000000000000000000000ae80063df8d41d45fc43f3aa0881364ab5fcb9ac526ee22d3870f2edb0aa379e9d81780b0ab08a4cf308d819338deee000000000000000000000000000000000e0898453feebb51d9a1cd2bda36a307ff2eebf44dc8f4c694831218c42b51f723ffe521b356ad4e5f0dbbca9af9ab47000000000000000000000000000000000fd186dbc046dd02217cec3c7894972f71e5f00e00a40fb1521659a33e079b7a1f60b026d9055a50ae18aae5757ab8490983e6618e9e4208cfbaf647592e42b2d30de9e74e4943fb2bb49109a66302aa0000000000000000000000000000000012134b433877e0a7858e6c3b95b2a1dcfb0548b290b68c209642dadf550db1c636598ac43d101b13c2d8d5ed9602a73800000000000000000000000000000000102b5de123c449a078f6f06935c9537efc791ed8e5475ffc2d9e1d098c814abe56d4b7fc6501c315edf7e64a431c5183000000000000000000000000000000000bce703ba78f45a1c59c69429d3dda18243ba2413c5eab46d469f504da975c434eda451c85357738d6c7054755d5cec1000000000000000000000000000000000387724937bfd817a65c0e0411678cdc78df26ebd4a814d92b023710558701163349b56b80e6bb68a4401f2662a0525506615e300a924ab962e0b7fd0b044cae9516d96de603ee80695718c27d7fba0c0000000000000000000000000000000005abed9305bb79a0ef1cc70e7fc2eae35a8580cd3d1ffad73d3bdae541ad546b8f74b4ca76f8f374e31dbdaf1bd14be9000000000000000000000000000000000199b29da8d161ab3061a18debc8b7400415caf029ced47131e27d81a0f7f79b6ae5e570f34a4c74fb85fea1411bd6ea000000000000000000000000000000000b8a7c42f5289d20b1a55a42d53d49510d3871b6efbe560bb4d87029b85b930f787c3a42e225006ad62c68d5f96c2f8a000000000000000000000000000000000e74aad2b29a210cc316181863e71a1dce8866a088a072ad5972af57b813a2e968a5b16b294273acd6e81e9a5be2961dd77d3e9e64e00b9356cceb62209ad48fc89e69e2214aad2edeba1812272736390000000000000000000000000000000001587e32753adc85c98cf1322115772b0e282ef4e6a75944fc86091e81aad076508e3d727f4df0e30924fff6b67c312e000000000000000000000000000000000ae96d3a1b79985e56f80df8ac4d9792229ca580b156dbbe71a9db470447fa4dfa19fc8a8a2e2f0fae28a24b7d6153d100000000000000000000000000000000114101ad0d29ddfd2fc436d2a270711c444c8c257785f4b4c549e9c795f6dd9834d3744995d2188c0c968752a7f68892000000000000000000000000000000000d30d9cc1e2273af745dd47a596a2202ca4fb655f9f9beeb0a87631e2461f29206163fd921761fde69654cb02e23505c41f75c89ec973f65b11786e186f4d42ee2e85c40f29745d9f428af08a39d5681000000000000000000000000000000001611787ba658b64467b4a28e55ea24a3b230836af6c2a7072231045ee4ee38e02302a62688d6f988f76cb5e50eba40080000000000000000000000000000000008badcd59d6d30f26ca674753ae9257a853dbcf49a5641999634a9a35a97096b6096b7b058360bec2f9476a51eb0d781000000000000000000000000000000000d30154440d8bb5fa6538953a96ba404658817be8047fa7a3a86493f02399543220758e649948b804f2daf84fb86f7580000000000000000000000000000000014fbdd62f761fa675e4cbcb61083a910bcfbd1f8e37f1fb1915f60929b047c970b87be0730ddc20f9716ed8c9bea7f19c70cfb76a04d1a9e0d937292e5553ef371e20d5d3dd33611edc0da178e2e4a1600000000000000000000000000000000143d1f811644e3a51c735b708cb2f8a2a90311f9971c90b9ec8e45bdd6488638b6851dbc882205263887b4dd5dfb4e120000000000000000000000000000000015692a6b06e3bd3100e149c6be3cbf1566fb24531eb29036fc48f85d5da83316a38af4e714a17552024c1ca4a5e39d9d00000000000000000000000000000000172b9c88ed9a1fc2d5a7f147d034fa243d420b129343ff92b79bc4d836e380e5a7e388069e9af9026485e9d3f41a7aa300000000000000000000000000000000012e8453dc64f72653c4e9b3f6f43fdd01b896c642d21604f992dc5591f2cadf71de4099e1075a4ca4b7539f84dd5a908db878b7f5fe817599add432ecf262f19d80ac834bb0a0f983728f6e2c189c880000000000000000000000000000000003e9b6d23809781f50c0033e53d245dfebbba9e0c4d9f676ae61b80fb6e774509f62fad854fd9ea841d9905d48d943a30000000000000000000000000000000016a1ba62bc684bb1848b0ccba59597b19973b56fd9b1d9d06352de44aa79c6bf65409dafb54f859d4a7c32e188bbe19d000000000000000000000000000000000e782741a4b16c5838a8f6e542135221ab3c6ad180c85c08742992ddf0239388e273735eae76c656e61614da386ce2640000000000000000000000000000000001cf6752e88990c221af94e18744790c30aa6a158b10a1f6a56c2ee3c3f0fdb2fa7213f16764ac9e9f4f65e99e715ca170751fe88ad289c91dfcd3c3c61ce1e33f4146f03fc0dc77cde9b32b51c75fc0000000000000000000000000000000000810b0175d781256053c3c9188cee4f55620a6624bfbd2f4d2e70ee68a105bc7b60bafdb76794a048e9f25da976390d4000000000000000000000000000000000716095f8fd72d9350ca62ca3ec34d2228cb563d4e89b19b152787d42fbb750435aa6233d0a97196a9324319837be14f00000000000000000000000000000000178e939d87c37d4a2f49e1e5596945879f2f0f64419e3dfe2afa06bd58098e1ba57a9b60c32cd6527481ab3b325ca827000000000000000000000000000000000aed480a1da482e40ae610a9522f0a18399b0130202f9ca79e3573987f5f7ae30724feddb52fdd05817a96f7937aaf7984bf139cc0b6ac94697b7dc278063a74e478d47528da3f84f55fb0adfd851d09000000000000000000000000000000000133adb236d9eec3544fc91852278abe37a1da0f32a84477c0d93927d64af613b7452a5f64ddec7447779f42873cb157000000000000000000000000000000000f6bd940b51b7ec5a0d92ac77a55c296215e970e9a499793864dd69c3a8d583403e95c08b719b5d8eb0c37a8476d3b960000000000000000000000000000000007d4444062ae06e65b45c6105af53c487f6b275ecdb36f87ec7b71d5861a1bdd6d735e9a1fc5dfb476ab8c13a98b570a000000000000000000000000000000000e043cdc87c67157b5ea3e5ab1b243aef479b23861f8cd823bced140ee03dd1f8bc6cebb4bde4683ac3340823f4d55b8d19d9496e7ebca44354d5c6e1f6b8211eb06ca23a6444c307f92f5bc6dcc2dbe0000000000000000000000000000000018c35112c27caa6bfe9cf8ae55f51755ed349ee7e7141c99069dea07c21a6d8634778a91f4dc3d17da04966a9eaccab5000000000000000000000000000000001800c8a9b146dba27050ce63e78895bee2016255c59acc34fd5e6cb926c16a8fcd2e8a579fa02559b3c571cb08011bea0000000000000000000000000000000014afab23fd4ea54b1ef576a12a2a62d42b493612ef466483ee8c4e62908486c038598e72dbd9256166960db73259def8000000000000000000000000000000000899a99ae8b10da4bbffb6590d79aa33bb2adb2444a11627f05622c732b70f90cbd2779362349aede5b591e84b53a8a06940e3509e1fb090fa787fdf633a74380cd5de722678826224641e46a6e920df000000000000000000000000000000000567d6458d1a3e012c63adc8b9dcf32254c98c0b7021ec6a8d579dad47d501715d2e42a0837def225515d663e663c4f000000000000000000000000000000000178daae121366ce025c1dc2d3e72068fd40ba9d54b2b3724f7a2071a59d4f17d4766a82364540bc31a46398c66d0e7da00000000000000000000000000000000147b2851311913ea53662082acfba785d21915cf00cd154b1b495246e109ac37c3fb6c63aabc4fe71a0d37c81a40148d0000000000000000000000000000000000122b7b1a81888aee37fdd6c23d31c38e79f28945cd1798cee3f4d674e923fc68311eda8ce45a561abf9c5f0bfeb4297b27d21c1d6e06d9fba7b61fb87d364a7a6252c70b8ace2d3679ed87ce0fcf7e", + "Expected": "000000000000000000000000000000000f5b941cda417cce69a30c1ba4a82cca71cb4b953d06d8e545c1b792ae22738dc006627da02b4344bb8be93a5a0dcf07000000000000000000000000000000000eebf4ac30fe0ffb905f81577466889666f801d4d6efe0fb8a663fbf1cbe76b2167243edfc6cde3f49d97d3040a9507400000000000000000000000000000000007ae6a99b86dc7ea95801776589472547ffc7a623009a592403a9710ca365510d85bbf20fa4519ca0e0ca208bf86a670000000000000000000000000000000004b5abf778c72bcc5b887855c582c042a4cfff489b0548785e4c1b735b19159be8a3f4cecf34c769a34cdefa722ba783", + "Name": "matter_g2_multiexp_47", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000017b47384e6302b140118d0a9247aeae2091607ebb413ffa232223bb42d16753b2ae48e5ad0265e33616b25f0c4234be600000000000000000000000000000000167be566292b835a42ac7c099d80e8a0b5d4ff91d842d4ff6026876aa1570ef9641e9c0cbd44d8578f6a758717bad6f10000000000000000000000000000000014f692d195979abd9c55ac132d0def925d4e158fe946fa7b0a010c475d60171a0951d4b68ae3c463bf1136600a1ddaed000000000000000000000000000000000ddba1f4236c5200aa52f8cb7e15fac1f20cc66dc65ed180745a3eb8308f2c851ed6c1e27e1507d3f902ce672d6f8d24facfcdf87c6ca0506b070abff83ce7812181c31729cc534497aa8dabe243351300000000000000000000000000000000023d08e255b244cffe911e43b9b48408f9fb3562edc2c27f405bb657731c885a58392ebbde9fc80cccee2404cc8547ec00000000000000000000000000000000088ef289adaf206afd2b72c93049fca2cf9292bf6471133c64ac4f42015b97bb9a23f6c34653e0218fd0abdefa56bcc60000000000000000000000000000000015cb78c1440f74b17125c547fe7a37611f01b83b91a351664c696e0f647bd2db3ffead880b96a327780026d74c9abca30000000000000000000000000000000004d1a63607b9a5c9ec31168d85fbbee77cea0ae93e98c8c1dde14d0baa72f91042b2b7ca489958344916ce79bcf286456546fa692d9cd61895526282193c90148099e2afa54f7903a5431f932bd5fa06000000000000000000000000000000000ea6cb7ff6a7f4ec38ba11e9945eb406dbb8517585fef6cdd64edc970efba244b071fa162f7c8e184acbf71c5d1e12160000000000000000000000000000000001ab80c0dced33cac8a6a085efce71dcd7021f6255684bb631cf5c1716021bece57b900b819e6eb6f5b755b74c677b6c0000000000000000000000000000000005465fdd51352cbcd8b804cd509526c3b6232976b8278cec3b7db7da14b77f78898c6240c30943d1418462cb7a5abf8f0000000000000000000000000000000006b6caa6a0d5f2d671b10217c0ce5b3962b0c3edb4f2918497c316ebbdbe1a15c803d7fc3413907346f0e7d03920005aa9c1460c1cbb2a552e3452d5c5535868ee9c2952ec3fdb52dd826c16ae3d00bc00000000000000000000000000000000170db23154805a04013052a388e14b5da00e65b35b8ce2dd967213a74735dcbfd28782cef1ffe9d384be3ecadd101e9300000000000000000000000000000000082dea309092976408a379f1dbed9d8cf91f768e2921e49ece458859c80a1d9efd4d5e588470bd669c777d16f9d2e7de000000000000000000000000000000000adba8ef34e197689228e6c4e13be75b3d4732872c99b865ce7733b7a42034d6d4d7520ef7ab712f60f1ff87bc4d9d8d0000000000000000000000000000000005df0788ec39430fcd0625f8e030d917d8e7c251ee6e3b0e79fc6fa5f6fac2ad736c818bd833e58ec61cfdff52c9c6ee2c36204b6a005a64819b06804eb94c311d78977b557e7acfa82e147b4d6ec62f0000000000000000000000000000000000922d8b5db6e415aa3acbd0d6065db1b492c92313260019ef1bda0fa091c4bf091de95846af1edb34516b1abf7d278e0000000000000000000000000000000019af4ecc4f278315ed90d67cf4d22ed6fc9af5c0d0ca654f6a74a3c4bc98588bf5347b4536f36ca8b4750c18464f9b7b00000000000000000000000000000000021eaceb11638bda8b4293991983f11cc60c1daa2287f4b4a6066374bac82d117ac3ea4ec73afc4372d254bfc433b8c3000000000000000000000000000000001037fe26a10305cc5dc11a65edc705be5a0082656cad53e63038ee57a79e16075df54331233229a129483c34d6dd92ec9160c5a553479a10996704c3eda8e57be88eaaf5d1efc8371e7e10d7d106e4810000000000000000000000000000000011e63dc251a5a1e2ec83741682d90588b6b185365b33dba45458b1f56324a4900b04d61af155a0edb0bdc2971b7aaa210000000000000000000000000000000002dc1bd5448a2ebb9a02509af8777616ba9657bd3be65519233f0187df77c49fc931bbd3ec0ad5856b2ec0dfde476a870000000000000000000000000000000019f0cf8baf100451313711bbb0a0fa318c14224933897e74fb727b585cc8620b7d741c9ca2f0d3cbe14a8749aa48ef3e0000000000000000000000000000000018448fa9e05f87d4991ae1c248413edc9a8c3ee789c9c005e691bfc9003191ff469e26db9e42e5758fac79309a62942c5e5a50e5dbabb7a56897935683f80a5b16dbef3c23461e241fbdfceea38e3ee200000000000000000000000000000000109b71c19cd36ef3078bbae25ce6d0e8f7b58e129407fe68ab09aa747bfb3e90c04ab804fa6b7a223c172146fdb14683000000000000000000000000000000000d297750ba112da88beb84b8bbf74ed134b59fc9496da3045aa6dbcd97c68425fd68b75508de113733602a5565f4c8a600000000000000000000000000000000149b8ba6e05b66d07b353f46ace4e583bb61ed18fdbcea0e941b8d9805d3168040186d1c961add494f98e4e7fe68824d0000000000000000000000000000000013a6877bd46557d23b9aaf371ee5a101227d7938c64503b04b39cc6cb4e8ddedcf5cb6865439c9f8b1bfebb807ce52e24a95b293daa2761cc456b9667517f499c4d9eb9eb1d82237e7a7819b5d44f7a200000000000000000000000000000000073f440c2704fae6c86aca3cee34591ec03c362c2c5153a5e82c7bcdece2af0c58a3484b448c8bf4da851800ead959df00000000000000000000000000000000075a2c26372b482a2420bd3c9952fdbf9e5fea906dc8a4deb9691f8745372805bacd68a4838a3fefc381a2ce946ed1780000000000000000000000000000000017575b016435782cd09901afd2ea6773b11f5a983bdd19d14668d75362f95d055b76e5bf6966b1bd7bfdfbe9a939e4b60000000000000000000000000000000001569d74258298fac89d0d91a9945780f4c08d7af7b942d06255ae590db6e8509c908c16bd2c2bb634279debb72f489b5e22ef32d111261dfcb5a2e8d23c8d920f013bd9602bbef45e6d4e0909abdef20000000000000000000000000000000017180e36b925e2ce23c46813d96b919ca181481efb5d1666c4a4e9c8031abdd9521eb8228c4e3f16de0b33da4c73588e00000000000000000000000000000000138965bff7c573546d80ef7efb3d45e87ed20f59adb0cd7ae148d09a97da7feaf1b0ef2455ca19381762768a7d82f486000000000000000000000000000000000360bd29c3f07c5b560e2ac226112a628839da9db18b052991eb2d9c54541c1b5ade9b3c2d7f446ad50050531228120f0000000000000000000000000000000007105978bcf13bbe2bf5c8f7d165998c3ad99b6a2794c90f5b61fb7bf2472d307df8fc9f4afe7ae1e40e7f0eee8ef9466e687c0ac8fab70de2416642afa1553bb38183d2914050602874491057f78786000000000000000000000000000000000f4434c5180ad10cd45dca62b8da790cdb912c255c0f33950f7039e3885b38fa9e9297c7b0a875380545839d8c4d4ada000000000000000000000000000000000d0dd1429e512884ac209f788b5832d31649a78a8966d3348a93f841be23c8e4e42d6ff0d6c27e8f43daf495c9582935000000000000000000000000000000001307377f55dfed30ac1a406671af1895218a01d063b025d25bdbc53f5f9d535e4cd8053c09b2cebb25d3a08365ab8ccb0000000000000000000000000000000004f5c06f505ed15aa7661249b7edd71855bbf47237e049aa951e1ea3ff88f98591518bac975ac628e417892f8e9e5523428f1a27ea15135f044643dc36a3f9c2b4446a3136bb11f696b0a430a7454b3f00000000000000000000000000000000083336fa0b79691b4875ed27b2bbd2d2586992940356f6ae5ddd2021c5ddd87f07f0a5c1e8d8a2654b99182cc2233e84000000000000000000000000000000001880f3824f7cef95ae5743de2e17191848d8d30f0469f455461c6559ebc75a7afbc86dfa3ee17f5470f74018ec335edd0000000000000000000000000000000007c2b26353e86223e5dbd4ed6d59f1170b9cc9dc600fdfbc6c73b96f2c667a82128b1ae5af0542b11a7d1efae87c75610000000000000000000000000000000002427b7eeb497a20cf15c10513cadc9ea612f3ae94e2ae833d281734e7b5d1d50e240659ac01da7864a95b4cdcf88744ae21ad8a6c9d75b51133e81ec34d66ca70a52529c5c3a2307b0e8d6f1c5e7d97000000000000000000000000000000000e72845430ebfb84f8e3cd3dd418f6dc528bf521aca4f9dbd798ed903ef0ea3cf21dd1409aa3759351be32b21d8e8cbd000000000000000000000000000000001457ad87f0957006192dff7d99815c35adb3635815e5d157542b9f52f1e9f8c0143a21a3be4dc1aea3a895689f4a316f0000000000000000000000000000000007e8544b1037ece2e5a9ea387e0f43b72e895e9c2ca4d205f12bf6df0b35ae62a4d62756221d6fff65b928b7358f48b00000000000000000000000000000000012c5c3167f6ef118c4044c0aafc85a337d305437d694a7bd6fb406dabb7364d9e90d74a8b327aba971421a5b3dd5d06988a23b118179ee2c34ad030993a2d2d70375311b95254c44254a32508abcb612000000000000000000000000000000001995d7cb79da7b6c5a0c8ccc5ba075d8d6d8ed3cfca85e8ecdd2b589986fa58c4cd4f045983e9184d79173678d618f310000000000000000000000000000000000f9f7f6bcff0f6fd621f3f8fcfebac132b3f0d52a34af33bb9830bd714d2982f3cc6674ad6ca668131a5062e5589df90000000000000000000000000000000017699b298a46829020e0299ab89ab6411af0a602dffb0e149053ff40ccaec71a908da02c8e611723cd06c16a8e5c0f2d000000000000000000000000000000000523b287383c1e47a6f31d397359941fe0bb8167aa11604ff8569969eb5ccddf4c4f432d2b6fe6f39204020e850d4f2b30eac099ededf0087275d1af828bbf79ef7fb0e77179a068f2ebfe4c749a98c90000000000000000000000000000000004760120239593cae5bdec813735ccc99a88129c707686cf43efbd48fb08d8da3086879a6042bf118879fcccce0736bc00000000000000000000000000000000105b8191431f701b365c66680cb4eb267681ee4da17ba55d47cf26d21ba1c0c3eeeabcafcc79dd87b6457bcc91e9fec600000000000000000000000000000000126ab502f66e732aabe02fdb2f7a665a9a43f6b4ff21c22fa976e7e434b08b606e9cf0f02459fd85f5a80a332fb3a62e000000000000000000000000000000000b2ef01adea6c00250f2f14c98ec6d6083c45019f3d166419e3a137667324f80c34b6b72e991daf72e2eaf9985d0f9287e8dcbf708682225fe3f71b7a687da23de5ed188e40585be0553358012132577000000000000000000000000000000000ff22a0db4f1b1679bde5853a7c2932501f191f4a9f25eed968a796219cef028e26070851a9036a05a04abd73bd6bd4e00000000000000000000000000000000097e9310749f52a4b645190069f4d52315f0eb2ff9cbbcd31f1781a68b2664bbbf27166e6e74fc2be2e5b1eb3f3d77a00000000000000000000000000000000015ca218d7d128095bd4f4b4f7bcf7666e92b905e551dd22745bc743ad0783b6ac44b841f87d3deac44617a7c9a341c55000000000000000000000000000000000a1cb723a4c378e5db2775f4dde9a6887ee3313401a64130a78b90d65dda3a5d9c8bcbc1a0d78c310c869a7fc4889954532cd42a9b698a2c2d22b1a620a7ec60daa9d1eb8ac36894603be7bb9b5e37be0000000000000000000000000000000018b30cc461a4e1fbefe209a709a21ae201bc6094b2d15f0d6dee5a55dd84ef56b62ab1b6bd513b27c84c638291f4205a0000000000000000000000000000000008a6f2082d6d510b280a270c09044ad31fb18b851ad2b38859138c9c2e4870fba6b607f682a798bf21a13bff116014d200000000000000000000000000000000150ef352d494a97d0a7ffe44903aba1611c8d81fa2788c0f42a6db48a71101e12f07318da5ceb1f0af3aa10cd4c26341000000000000000000000000000000000ffdf3b133cc926684e4624531569bfa09b1658e29ad9c3efbd5e9d18353ffbbfbf23a2ad80ccee88f8fa597416d47173ccd5e19892765e549a63238e664c732af781fddea558a117cb927bc4a1aceb5", + "Expected": "00000000000000000000000000000000134f45e5409998e657923ca76ce92b7d2acc932308e0694bb22f121f8324d16bfce86f96c67111c8080289eada4b4fb40000000000000000000000000000000008d9063b7845ffc8400c0b7585e819043884f92e28f7e3ffa47a39e808cdbb034ef4230b6e19bebf083e939b6b686b0b000000000000000000000000000000000e95f8fcd6b5bcc9e00a580a99627d92fa7486ff5ea587df5dded24d1b0bb76d339f6765a5a2058a8e227f633ce36e91000000000000000000000000000000000393041eb33f2c63df3f40d8ea1e1a9eaa9eb0a46151294845e542054d503ef69b40b0b676b0e4f3e08f4d26c36a5d4b", + "Name": "matter_g2_multiexp_48", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000042a220276f12fb4e81c40ecef3a0d86634b4d1c0acfdc463df4e7501289f0be385e03808d44be053e6ac98f403a8a930000000000000000000000000000000004e3dc92e155aeebdfccaaa1d24f49efc8b02e4d9ba8500a5b953a96e0fdd58519bbf1c279750eb8b98616e6bb9a3f6d00000000000000000000000000000000086bc212a83b09c7361540349767896058d5567d4342c607ae9c07fe5f123d9aaac95ded6cdff0825edb5acbce3e2b6d00000000000000000000000000000000062598cd6d5680a155b6349cd51d636c1350746d17fe0fff5195f164ba2fa51cf52f8662f43d555f7be6bb8bcacca39448da17551b2369b723bf932173a9167663f8389d2461b763d6a061df78d7ff1c00000000000000000000000000000000193e2c749e5bbe87dd5c306d822740969cd69ad6e156c323d217c08b18bb3f97c85aad63aed1e3a455ffa1b6d2a670340000000000000000000000000000000012a3dce63a88ae32a746e3812833569959021e1dd9518621793308f8f11d04829b2c3d0e0ec39fc48dfb8285b6852746000000000000000000000000000000001235488d01c380e91872fc57cbf618c3531a6bbf6cba9dddb9f07168cd459c9e866e44e9e5336369cffd8cc3a36cddc00000000000000000000000000000000010d85f85d6242b63f8421e92f1c37f64d33fed67e0cd3dc4b2b2cb4a7fc7637f9e049fc959720eae6d1f452159d48b78def52379c8b9e7c24d971c3456b85b51a63ab03761ec66c8dfac1018833e05940000000000000000000000000000000010889825c752d0ae8445a1d0f3510135b9672c30a781788698f637c2f535e35788d76492edce8ea091223d016b5cc141000000000000000000000000000000000577175035c86c022e634ccc9a5beb96a36aa068cdc36e5a4fc2028d5dd099c5296d30a916d3b720f2e051e7d72e4d490000000000000000000000000000000017b46e49ba08a0abb9394479d693d8097a140094d0ef1d1ba7761fb601a686b0b2b4d49abc2e393a99c5cb760299992b000000000000000000000000000000000820f8e52c1b09986a70bff04909b044f671c3933de43a6bdfcbe3712310274ed880d7adc4947490c7de095ea651e578b2225be6985b9c8fa59a2890da56427612a4334937761e24a33d37f0f951a794000000000000000000000000000000001776b92f683069fdc006904fef8e91f716d9f6bc46306b042228088545f0e11a41b40b60722d4f0483250391febc0ed90000000000000000000000000000000010d5052ef2504115e9d9d4ca81c7080c0868cbed605dc7673f7f94f5959c793c96aa5334175e58499102ff76f974ced80000000000000000000000000000000011d1e719bb69d842df4fc23e8dc4393067d00f6fa8ee42d89b462a546414b91f68dda5378fa093b3ffa764b5fc63b1aa00000000000000000000000000000000099d0784a200e5d2d38773912cf1a49e813c871ede8c50da03abff58ec1943d2adefe66bd2feed1c57f5a80253e091d0a64ce8ad619276bc7a00cb49faf6cc84b917ae6b37654363f5719a727a220291000000000000000000000000000000000d7287adbe0bc3cbb35ab8bfe69064faa83e3e64d73a0c64d960949e10070081a99c35d1dacea5a3b9bf312745acd6e600000000000000000000000000000000034f1995eb8631e080378b22a51ace902ebc9da4589c89ab557b6aaf685fcc74ec1fcf95f6b9a31b7a45cfc5a1610c640000000000000000000000000000000009f56712a46c0fbc199c12d5eb7abd60e660e2c6d437007c34954c6234a0496ad0adf68cf759f8ea30980c9a78175e1a00000000000000000000000000000000073fae1cb78c776188190a4d7223f7cdce9a36488193dc06898919ef4d5136099c3185d352028760c753e9eebb52ac240b891d638d7e76e0dcb230b1f9a7c3b35b35193c43a6c86f345f5a5bc9c708f500000000000000000000000000000000019944fc459fb601bddf10a3a7eb55f34713d396c3208a10089b8f21f4bf0a5e87e95ccf73e0bd90474d3e043f37a72300000000000000000000000000000000158445bd2b6d396a390a0bd5e26256587f980eae84d7a592b2b4d788c452d312b854427185a770084e1b4c7898962e50000000000000000000000000000000000ba44a1b912645354da7d8d9c694b1d5a9ff2d642fad31975171deef3adb0f8d92b2d3a8bef6ecbe0b8e90470b3938d00000000000000000000000000000000012a040a72ab035684bfdf57bf473ff59cd1ee01ec949dcc6066e5c8afad775ed55123859cdd74c7016a092bade7f991b571175eb91888222085fc2dfe0f4401ed6a1fc5df86c0c6b8e44fba6454305bf000000000000000000000000000000000317ca8fdec8c7c56fa3812157f9ca8e9bbf91013dfc7052c0795a04a1b4649b2147d9cb1a61f2c114a705e5133729920000000000000000000000000000000012b893d50fe5ea2eb528d1a04bc8596b10d4714a0dc38bdd5f0a275c07c846970106c3f7b5686685f5c809e93c57e2ff0000000000000000000000000000000014f018a0d13c4c494f4a6b7e836f0f2f46c4b7975d91adb93616a0555910f53574add03b905000f8492465c9b5488c1300000000000000000000000000000000146eb4ef1103b525dfb5c31bcb98e550245732fa252a814824258093a2397d1489df8ca0228d4f5df0a00d473d1566c454c9e7f7ca14c66b8431e25e6eddb4f20507d03bf124eb607957ca2f43a0c17b0000000000000000000000000000000010e9962dc19aae8e92abf32fb9c8eac44d77f587159af4e3b3a080748322715a958d953d3c057999839a47dcc840076a000000000000000000000000000000000ccafa9761e654ba54a46afff51384f1c6331264082e23f94fffd6c31a1b1b568a391eac79417657f40ce2fc9a154a670000000000000000000000000000000007276b111c94130b2608827156021815faf2be29ae42c454f3e2f95de98d2f5b98cea3eb18335a8fa00e5464f8089cf300000000000000000000000000000000053550896e867e237086098f4493caa2520e8c97a05e14d0ab7012d37b7fbbd42a90accbf0fe2ac99e78ccf0be5c9c58000579e1ad83015c8f02a9db5c38d0220368a80b309ee45bb952cac824817b6b0000000000000000000000000000000016b5bca8537059362147911da9e69ad3ecd3b4a7c43ee7d6d809f46c74c16bc7d69bfb5d7c727b4d5d8a356a0458b59e0000000000000000000000000000000010f3a7eefeb3033a733af7d20c3c5caff4c409305de8d71e08cb9cefbdfacda41bb975c92c5e5f2952c3c1e2bc6ca8cc00000000000000000000000000000000148f5b2bd65b71184ba6974678f709c5f9e3f1a020e3d4bedfa5f5f66478adac47f06ca2626c4a759b5eae09756cfe49000000000000000000000000000000001301306d1259059b5567154ef6e4779fedf98c29ea967ce34b78147c5730f202e1c12d5b5094219bf85fa62834329b45909a45c8b78350e3ca21697e9f56d5fc8fc2a01817b78a7f5daeda487768ed1e000000000000000000000000000000001741f739459f5d462fc9ab55c68101a5a3f2741c05b4c3eec6959b2aa5e12493a19d1b33a9aa89337add642458089eb6000000000000000000000000000000000300d8b7988522706c0690da52d0a67ae41344e43cfa05d22feb91eb8635bdb970810e993e0ebf8fd63ab8fe3e048d660000000000000000000000000000000007c003cfba125692b88feba85e7288bf61bb25e04b1462f7a39b4198737010224ce4b73a320c81b1f70119af34d381d1000000000000000000000000000000000a4870c9de67517f4353de23af21fcfadcfce55365ced33a61a19e5de52f98721b17c6eb382970e7c4acd81b80a7bd2f6d4e2277da617f0ad530b6209df6264e1288122b1b4d92da04fe334be17bd8320000000000000000000000000000000002eef52fc72d5aa0456c13808ba548cb765e11cd0bfd0599544793f57c8a27ee90880e6577af1b76b3fe32c4e71f4104000000000000000000000000000000000ea99a4f6772f8114cfb3ae9dc20f11a34880a86088511e5b7fe521d50470148b43f866eb5bf4f67c523266bb55117050000000000000000000000000000000004bd802b889e6d18df7dbd65f39a908cf5889e14be51b5ebd423ccb63e4e5b35e429eb0d4f384b811b47975143ea2ef60000000000000000000000000000000018dded357c546d709beffff2da0c08e8059c720023234c7b53d0ae85750b3e166cde7faf340697b546b8dd7c13b1ce7bdcba6bed6b8c42240c01df5fa0ea81dd96168c6d98ee9d5d4653edfa5172eb28000000000000000000000000000000001405ef521bcc60c55f8551fb2e2aa7b10117b2f96c03e8535e5bff48ae197b7e5fe69a40eecd25a67f430ca02edcc9d2000000000000000000000000000000000477d85a7dfffcc5a2a1048205362ec42b268e5fbd27ee7c8d4ca77b5c9db84dba482bc4b164f92db2c15cc518b3d32800000000000000000000000000000000060988548ede00aad3682fe827d1e993ed1cf118bec7cbe6f69bc160f030bf87c299d40047a4fb5ee27dc2814649a4580000000000000000000000000000000006b9e0579f82fcb8bc149e40b1199f5897ea48ae5eb58abd2002c923efd0f5275d24a579bd904e49b7447c4a03e3fbe423d168e01657e5c2da89a27e513bcbc6620b8c6082bd39880619bfe2b3a7317d0000000000000000000000000000000003cde2bfc5a865cac624d9018c37c1b5746b5394597d79c171b25f84d5fdbc76bb90ba5cf9db14b3b8e62ff91cfd79520000000000000000000000000000000017596885262075e45db62ca68ee5b99d12223bd476e36ed4ddbf5cd56a0c6e9db5d79e7f95b96b1bc323d7c9fc5447d800000000000000000000000000000000018333858871dd41cddb7ad2f179f1f341b2ef20bfc7a1d3cb235e3a1a181e0da7251911886f0788e0f868e16520c5a200000000000000000000000000000000098ce44092980cb14e89faa7efc2906051c9a51cf7b2757dbffa49fafa3a9ba145f809f1212c27aa620bf062e839f83c2a76fafc5e8e33852bbeb7ab8229305be84f5474427e0c6d2ed35c7bfe99faa1000000000000000000000000000000001180d554fd523a51e0decb92e0134c6064a17dd3aa7b11d590b9b6022f76763b1e20562da21e836e65374efafd78b77e000000000000000000000000000000000488686f793dde899a3f4936f07f9eda7918450966ca85b4715d6fee978d9d091bae1b5d2d04943365c076a849b3359c0000000000000000000000000000000014661fb2d305ec9e63d63e9951d0f081aeba99972b094c922d2797a1100759cfe150812821411205f563e22f01ef29c50000000000000000000000000000000013dd681200608466853cd3bfd20f146a6383151931079654962684d6c6fc3bd6900bb049483c1ca6d2819da456f67e3be3c7e4e95167faed1391e269785918a207490c6d186bf2537c02e52e414d564e0000000000000000000000000000000016c8c7a2a1a76ec05770f2d6c8df35003104c034c76323fedd49663daa759caf2f4fefbe8d44b3abf1dadfec2a06cb45000000000000000000000000000000000837305004aba2e322ae29e8f0109f1c756a44b21c72733019e63ff9886a639464090770d12d35553f0002ad028332370000000000000000000000000000000005c8f82ca2d4f6785e2d76ca3a3d1ac67aedf78e9ac833c52cfda6289e6f5d7a83befbeaf753abce12376889caec312f0000000000000000000000000000000013595cdc9181ca70845c613663367ff774f073774688dc58edfd0c58de5ae12df5acd04a673b645371940d7f7e1601045d335e3d96a9b25be7f3916e92fffd75abeef5b91a1ec577ced52a96f6a9b10c0000000000000000000000000000000010f1b8b39ea8ffcb6a96bacd1c00b413c93d3f8da64dcf9257a7cf0264831be23ca63ab8d3d1cea21ed8d83ecaa3a0c70000000000000000000000000000000017a9030fbee573cb71330007900723f85e9e82530283f713f72e68c1d9a5ff9552d0da469a4f38b66e30df1514f922a40000000000000000000000000000000018b9020986a49213d4f3b4b052cf2fb65f82b9bc2051f20b399f2784b984ccfa2752ca576d352c7d65ab218bb8d5df870000000000000000000000000000000015a375a3711f5e9f85ad7266b2d307cac09ace9ea36e149dde5e0d5acdbac3f62e1cecba8be51d88f2143c3070eddaf0fa563a70780837ffcf9a84456f0b4f6eda0d60cce6a8538ba10960eaf17362fc", + "Expected": "000000000000000000000000000000000b668f602b9f56182b74be413d36b03d2266d7165386a7f1f0d25d336d06d2bc5659e80e54dc71f153883292df1cd8940000000000000000000000000000000013151d305bba39734538fe9a2717392bcd134ef1f8c1879740c8cce981a2d70c94b23f1a71a0596e7ead55a55eb186c80000000000000000000000000000000000e5e7c268f93d8a9d3ce45db2a95be906483aefa3831ed2ab2aa357eca0ca231927c0e5031daa200784cba33b96e51d0000000000000000000000000000000011d57d9a9123123f9fb56e990626346e5c76bbd1a4b3349c3f7bc44f05a899f9c4dddd67ce5a788f85b4fb172385faef", + "Name": "matter_g2_multiexp_49", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000006a7946b50749147573991c91f13cdef4e9558be37736e3d990c5750d31ba9711721b88eec529ea4b1dec1c935fafa9a00000000000000000000000000000000078d8a565b7f58b915c220882a73b6aaf100f2d54cce2524cc3a80d9b526c3058903668d17427a617ea045c3322ec502000000000000000000000000000000000733c6562cdcb28d740c64f50ee9d204af4ecc8de2c1719fb73c20f2580fcf01e1e494faf4386764e03920a4162049fb000000000000000000000000000000000421365fa828affe963d145d318065933d4d865f2a3d24469ab0db66dd09a574945f8a8b622d079a7ce1c6fb6c795a8f6e2ee781da12b984e7a08730a60f50c41cdd7c7c8b3f1f30f721923ddc34fb79000000000000000000000000000000000a4fdc68bda287bd819ebb0a296212ddd19cc76b042e134f1637c894ad64bcd8431392c9791f2eaaf94f6c8d189846760000000000000000000000000000000009d974fcb46fe81d81d62b24b805ab5108c9450e162454c3260ecd0d5356b7c263be5f78f6214cc7254e461166910d23000000000000000000000000000000001081fe3579cb4d8a7e7d43ca8cdda28e1f9ea8df83c6069f4162a2a0e68e0d5876b283193649018e754c5c8fef101f53000000000000000000000000000000000ca4faaddc4d14a6648e3515a8b9028190c17f771c7de086fe4624a3008d7e6e374c967f303d9511b9da1a95409e3cb3d51e0b65be993ddd2892ab8f47eab78352b177be4b3fb68f47c65f5c59fa866000000000000000000000000000000000117318e376f2c130e5bca89b3d700fe76e9603adb22a5ef353bb3b5a8f641c85deb4640fbaccf94e025a59fbf2a41370000000000000000000000000000000000433428497ed89a43ba07d816df224809a827194ca899924c3844650a3800952cda8db82f2f8e513994ed9893fac747400000000000000000000000000000000064889f1cb7d6ab216fcceef7c4abf89be14ef93be2d39bbba2b74d06999dec5ae1941b507709d093b28e030700cf866000000000000000000000000000000000957fcb8658497802e78b8250373f77acc4ec47fa2c87e78adbb2daef70240da640a7945895940f76bbb80bd36b4ba24fed4dd284df98923bfc3c41496d6e64a10815a8c474275e0cdbc9ed26e92b0ae0000000000000000000000000000000013f9771c105462fb6b975b0b2fd20d0accdd2d95d879c8019b08db394cd785ed9f151d0eb1adeaa63bbc2686d1172b0f0000000000000000000000000000000002062a5f2db0a01114a1c6e8c739f80f598f4e905952101a244853078298eb443be6839b59d4f0c7745b739cc89ad8220000000000000000000000000000000015b5485439f1b94fbb3a8f5ac6197f0dc0577863f39c44b34d4c5437b6a82a704dec17529654b3037a9ee1ebf14c8d8300000000000000000000000000000000154d750e2a660205812d428cfe79aef4e1059f4e231024a665889d112af37e6e17e04cd7c926b6240bf2f616a1f572dd7c36ec97c1eafc8a20a772fb7887d75568047ea32458b9ce74ad9ca058129949000000000000000000000000000000000231223930956bd2d36a89a0a0a47aa46b4763919455ad3a3581439d25a82c176569698fd5ca2b9429793ebb16c98e50000000000000000000000000000000000b5dd675af51c18d2dc76e3103da4409f6e8c1cc719a622d4a33aaae3f23e529c78b63c55b67fa999bdcc7095a4ece300000000000000000000000000000000010c971be55cd02e4c97031d3b25acfbf722e47e5179beb26eafaa72d4bd5f47cf280a99e0c3c4cdac05bf1572d01fcfc0000000000000000000000000000000002c1370919e6445994df1e25ff4a79c8cd8805f12e5d8c781e58f04dff68a97424b35d162d875ca2b3f805b4cd6d1fa641b2c0354d2f7d92b05043f193b718d78b457ae76e19069c8e1c2b77d7999d6500000000000000000000000000000000169938b4d3c859f97a0627bd1a83fde725eafb7ab77b22cae06d2a776569236d834702081e78d61386999c938c0259b900000000000000000000000000000000091e922f00828488e324f9fea652ce1edff83d9f479e843ed4bffee27805a5025e7a150719b354b5e61f381ebd24d4ea000000000000000000000000000000000334ba8044d7d47795b59eb089502808a7ab8f18e3d5e1cc49acdb5020b3973fd21d6d82557afd748dad88e45a7623730000000000000000000000000000000002299bf949ef249b5057c103ecd149444635b4f636a2fd0d073484404c1ff4ef71820260ea6529bee6f5b07f2ba94de35615370a76bb0a5f64d61b97bdb045b9669f6a0b7644b101d21a50483d8b04dc00000000000000000000000000000000076ab7838db87727fd653a3b561a2a5594518f296284bc24a7d215b1fbc0a6492d425078fd98f92a414dfcb3c92cc1d000000000000000000000000000000000022b71fb467dbd6d9b130763350bd06f52d20ff2cbd46cdea5e8b1525fd73bfd08f5ff171f9fa28050e9a3b296d3e9e00000000000000000000000000000000007e917cef0195fc589317d4a71c14022867dbc0db26c653052e2e382d0dbebe67a0f582bc0a27dd1dfb4703c545d0da30000000000000000000000000000000005b1d8651b86a403ad993c5cea4b6b82a0f8a9f8a59d4b94f10e68e9538a559efdde2007736aa9d04f585851a89af88fbcc38cfd3c6bdd32ed1d583f2bd14e175d61448c627f195559b751aab1ecf7cb000000000000000000000000000000000653c5f5b2d97239821d173036929dc716e78d835a80af55868dcc3e218bcebdc2a052d31f6a573572d13f3bbb14f241000000000000000000000000000000000cdbdc3cf52239a6d4bdadc273b00924de8730c03ea82bd20ec1f04375daa4497fff3a1726269a736706355e72be83870000000000000000000000000000000008e0285b177fcd768d3519062177fa1314c4370f872eaf10f3e0dc94e716dc6a67894d887f40104552336cbb5ed614f20000000000000000000000000000000000638db8269ea4c2fecd5b45955609ef6a1c2c6faf6ee5a8d777e0b38f16d1acab2da7fe7b6f6ebb315ccb345835a21d94c41471a2e4edf0f688c2f032036d41ef5f8a966871dd099dcdbced8b37e1c40000000000000000000000000000000005b4f74cd099eafa6ae59e7105873d4a46e8e5985faf2d26ca564125dca93b1c48187ed7afa02cde8b52df878e1aa618000000000000000000000000000000000cda7f9eeadda16ef757ee8a98be147d374d3a1d40790d20a1ae42c9ed38e4fe22be76ec4f807cf93fff5c6efdb50d1c00000000000000000000000000000000121219b0b0d236a89a857c02249cc04c22299d041d95296dd235b3639416337f5be4a2ebe92a50d192fb748d5d4dca0300000000000000000000000000000000112545a4677ca7d60645cb8bd98689c4aa85a68bb62dc68c0affca5a17ecf0a08fb9b91589d08712b5af4aadf31caad2dd297b192f1c907914ef949fd27a5ea5659aab659b83239c4433f7a4e24529f2000000000000000000000000000000001342460712b73ca0ef07d953c32d280a3441e108abdc2d133265160608986481df3563c5dca20f209ce078b13b49707e0000000000000000000000000000000003580a5b4a7f6d6e066ad9073f7105f6cc1ff35ef5e79a0aba7f48ff2b732c7aec72cc9c5f9233fc9c267d8aa37ac17c000000000000000000000000000000000bb7f32db8a4e341cd9f8dd3b5677dc650cef675f0923bf2e5c8b84c33d447daacbf68631c2388eac5698495e1ad5a3a0000000000000000000000000000000015bf9cd1aa585eda2910128f2b452569abc1c94bc8bd308ee92b6c7315a56fc92d6cba03334bc36c137c14eb1f198b07d30fdb174a3f5c06b78cbaee5b6e7a4c90551083d78c5164de6bb45ee5de23c100000000000000000000000000000000091bca266255d692cdfd10929802d79b474706d160033495decd11cb0758136ec3ae7fd4bb99081e44dd7f25224e009c0000000000000000000000000000000001fbba1ba796416ac22c92f3741e3b268d89fbf0307edf0f25c7c12b5cd230c41582ba69465686ffead9f8363dc0c297000000000000000000000000000000001139590315fc4d81e3e747a53e63ad856635050367ffc143c1422e324d5fe9e4fb90631ff8bba764a87b8077b571aa0a000000000000000000000000000000000dcbba28afd445a57db762d08338a26980b4efbd11668e4050d18234ce35a909d6b563a5d3e8e72892514431fabf0147aafc42f7fe6854866cb954367fa65c8072bd1b60173a2d45077421d6e25f2bb3000000000000000000000000000000001322b1f1388a9dd2853829bda1a5120250ed08f07c84fa398e59fa2577454f38f0a76a1e8db897bf15b4b50ff52a847c0000000000000000000000000000000017020d7de1dd424de53992c168d924c42f26231d184ea3cd9cfe64ad9c82ad067540b2d9ab18b0fd28477ac792a80c4a0000000000000000000000000000000000fabc0769b95e6feedc2165bd6d324b7d16247b79eebc1f09d849792255136538e628bd6ad9b86af7bcdfdd991fc31000000000000000000000000000000000144f39f792bf5585f4b49dcd3fcdbb61cc7ef471e08af4c15cfebb855f0ac8d5fd057c9486e53e8e1ee4f66bd5e943ad106da5f98d5e7cd9f4a1c8d6e50ea2236c2abdf1e08a0eca54555a59bcadbc6a000000000000000000000000000000000c27ac29db98fe3038fe5f537d5ca6faa240602abe11c6f530d9b18d763d6dda3fb25f9538d316e6527c114405ae54f00000000000000000000000000000000017ecc872183413d8065a99a2d1a73b70150e2c1fca2c13a731a39b52aebc6db79772e91f115a63f7b23e5fa231df697a0000000000000000000000000000000016b9715ce820b619274202b52d7e7bee9a17aaeb06c2ecab8bc77c670bd4c714789e4478178d94d2aad57e7bb0b7a4040000000000000000000000000000000002d0723a3386248d8597d2b63289300de6a16011a38985170a1652ff81ea70a78459b3ef252cc5ed26ff1ef1ecaf6a42c971deeba2f757970bcd4f5548a2767bd6c43e63f4c5fc4b157ef060a1f45aae000000000000000000000000000000000eb1ddb7306d8d2858fb57dac71f67473b813f37f02d73b17f375be86028176cc1dd84347f183cb7d427b861be34c3d70000000000000000000000000000000009a8811ec77eb21f2b33a591f2fe6d7b74b40c5045ceeee275912aeec664838f332bb49bedcd958ede0af0d0232e76ed00000000000000000000000000000000156e28ee3c40c6f18c6059e06ac8f7b39fa23e5962f640ef3afce13c169346a4c8e5c2bcdac8fa15921a4740cc5a0f2300000000000000000000000000000000084371522a6ebb1925c8fad3f20277c34e657aa71abf8ed7d323a10c14cbbb1a9e0e54bace32eb845e6709c1c58afc34a5262a021977dd79ab96606eb24a7c5ed650300dd68bc79f4b8378f58c6eed49000000000000000000000000000000000be2ef9ef38a5dcb42ad31b1415c8eceae625850db4306a26a0598d4a567936d75b701c81793fa7b42d158df2dcb0d5d000000000000000000000000000000000851b82b59fc15b89e33fb618c56d11a07116ea35850583a07066ed97b8a864f3766c0cf921d007a6cb43931ad4fcf8e000000000000000000000000000000000ea8bdfa3c5f000d7cb1b5cd69537e4104daa15ffcec06f40a91b972d8011e5fccfa911c55a07383cce6760c145c39e4000000000000000000000000000000000652a4165602978004ef702103ef18e8fe7decab1522a76486c742d29103e3bdf6dda2d3cd64ff1b5d5a76f4823bd363083b3720c20044fa41712039b6e9e776197391ef393c0935a0e9990fbc1b7a4600000000000000000000000000000000015ce5b43e1fd950b77e2baccae8c99b82f38bce09989fdc5d402420e7931a38b7fdac5a254b0cb9bd8fbb488d02493b00000000000000000000000000000000018c5b3ff46a04ed114bbf56399738e5d594ef8dd1d5e2e8dc23a0097893be3da4fa4662686a6dac04418fd2d344e36c000000000000000000000000000000000efa3e970a5cd0c7bdef6a2df3be9be18cce63c10c331a18d628bbeef30488ef73d866f3c8804acb3bd375542e99eae6000000000000000000000000000000000e966d9e2f2d47df5d661a89fafb6d4518fa1544ab7a56716df511cbcca99098f944a981c9da569cf95debb455842006d6f846581848f5dbb9e8d220b881d0327c4f3f5d4b79fb2c4dcbdb9bcf44b02d", + "Expected": "000000000000000000000000000000000ef06b515addb951b24e5d61f6e6eededf5f93f9f17455e1b563f187f73394457b3b7c1b90ed454218f8782d2bc848be00000000000000000000000000000000167398608a87490fd17506166bf54636aa4dd6d3e8c4d42995bcb0262268eaf2a6d828b295434f45e3e53703aa67cdcf000000000000000000000000000000001602ec6519e4987a052f97eb222f505e241d99602c08ea9c41bc95796675ebf6a819aa0bf87319f29dfe47f45f3c8c7a0000000000000000000000000000000002ad4291ece7ea0fcc9f4440e88eef693b8dd53060ec847bd27d74cf71218eb6210a71895ff1f1f4537a901090f14de5", + "Name": "matter_g2_multiexp_50", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000129cc9cf82aa30671e969148f058a0b8d275bcbb1c8da66e52998d9555dfaa075e2fcf39fc18f305940fbc972cc5c0c0000000000000000000000000000000001252482c1419ad72229a00d90f1c09d464e896f47db91e9680efe36822e99e1ca7a2b5ba8b17b5929fdbeff8993bb18e000000000000000000000000000000001287d5054bf5db038ec2f7b7a3b79848fcc8ca42f9e19d5e21d36d2256f97e0edc2608d19c17d3714024e1e9e86ae264000000000000000000000000000000000f6262669e30a5db67550cdce8a4611b9501d02cd4e950aeedd1c87c4f0f63c74f35c802dafcf91c988a154dd690103c67c44f7c8513472b51f96d526422bac628aad4c40c521cd7cf9e86eaf92838fd0000000000000000000000000000000019cccd010df3e668b1c3ec053e76c46e45d01a4fe02eb074e296df2a48e0e4eb647b06c40cf64a0048a8fcc2b0cfa6100000000000000000000000000000000018e07bc50657f3bbf736c38518933e91af29e3bafd776243296cca3a1d975116e8b428b050045a61069adb23baa22d3800000000000000000000000000000000154f51badda1b828346986264b01fb1be4c7e9b570ab63a5eb15cabe9412a2f9bbc6d5111c638ff5118a4f6d08ed055200000000000000000000000000000000064d4e607a8994c0bb65770a14a14ed1b68c766ac2aed45a44c0f7c7cd4c3ecdfa077206812cf9b24e35021060a3668d2d6f95d4b6216e4226f78e4fa5011c9becf98fe45a17dfd740fdd0ef36d8ba94000000000000000000000000000000000b9bae5f720d9bd3271a71d751e4c35c39ad30fa8a67846107ff769c455e42465b2a39dfa32861634d5e323878f56f4f000000000000000000000000000000000a1077046cf5c7a66452cec2193ee21c1ace50dfd79f707c9297737f13806dc05e9e1cc5d1fb4c87b250ebea5a4ca6c40000000000000000000000000000000013e1fbe1a9b5f2ccff51120590ac0cb00cab502726b43a6fc12459e27bad4aa41537d6f3cc94a81a170998768f6a0fc6000000000000000000000000000000000a02c551ecec1c7a415256caaec1b5485a42f9ca8d897cf26546ace1f2bc8c2d10a353b8b84495b8dab5e3c60881185a58c25d36216b811ee42d0ba629ab7a0f9ce7edd7234620c28e37bb3df3f042e700000000000000000000000000000000021b9ab3ad614816d7006efe688e1ae8cd99b0c4437d4363e557642a7cfda2000db6503b32db36b6d1ffe40d967c5efd000000000000000000000000000000000b7fb0ddd9eb2be9cdffaf8f8c593a9296c4c7deeb1c714c11863d71dab1e6fd309b75c41e25de3cb6089726b43427f0000000000000000000000000000000001277065ea9d208777d0fb7a6726e11c8330f0b3ed3c6716acd559aab19b2fdafceca8126c9facc43b9d80534c07035a20000000000000000000000000000000015e8c12065d601dd5ede75bcfceb7300bf6f9fbcdf68d2f093b7654d80d3e565135d64137dc401d691a45fe052f58a6850a5c6bb6b87fbe5ebfb0d182d425ee173973c6f2085c556b0fe60219b9f3c32000000000000000000000000000000000484c4f9652427d0649c33e93d666dcb15bc56669c00980c53357ecee874bcdbaa016236df65a4339dfbd44e4eb0823c0000000000000000000000000000000013836a7275c29c989891c94e756cee9d6c54a8f634fa570655ee44b7c1e34137edc33323dc0d1f3a0218039fd6f7013d0000000000000000000000000000000002e88c7d5fd87e97a0de1be95021821942a8004115fb4fdd9ad26b7e0fd171f9c7e6f962eb179bdb95ef960cf9396372000000000000000000000000000000001636e351a0ed1a260ffe0d1355e6da288792fc97a7310b040cb9fcd5c550d85d90572154d58a9847dd5a8a06456bb2e43b4bdeaf6643ed159f4a3e23c33ac486b33e1edbc5a097a47a6c2c753e5299d20000000000000000000000000000000007579785c14fa012cb5d6c116d34dcc15dfc908a29e90de3bbfb8c9b44e0b4258644440d7c78d751a007c10f98053bd10000000000000000000000000000000009f023538822ceba0883a0e3454121dafe8e5e61d4754b54e6417c989efa998334641d458591b3076b615937de065cfd00000000000000000000000000000000130fe7f2d5e0ffefa67ad3378690c53a6e68de5504f3691de0df3a24c309619bd3a345bc2bec4dcfb4b77255cbfe09980000000000000000000000000000000015bf85ed997eef4d97a81f1d75825bb4409cf86b8c8e5f4368cf1e4c803f9e1e23a2a96f7b0a08e5cff55a78761ebce21d18596bc392dd0b71e1216bbb20a0e5e2559a46789c36a146cb78c5aa8e3921000000000000000000000000000000000a95597e4402bbd17c20dda088f0134d42f14443bd519b3511b28fd8d395a0e50758386498388ea6ad0e7634587336c1000000000000000000000000000000000079f348d3de505875c5192f795cd77e2f7385ed447b06f2dbee18e85c832386b201cb3eeb21aac3f258d2c4b0434d48000000000000000000000000000000001895b1891a08ea42eb1f68698abc20394ffd66bf0c32979668950bfec5cfc8425314eec2ac17ba25f29133a8becc9f5e00000000000000000000000000000000146160336d881b24c6258a3a86c08d346900680324632b6d5d4582ee0865a7e5f2d01677e5e49c5a4179f8382e49d1566fb3669c0789ba6a5b00f14c14fe2edd15d37a742c9e36cae9ac010e632d75a40000000000000000000000000000000013cadc6c394efb2f93e00f3976dde34efe75adff34bfb6f5e1a150b79bb5baf6bf29fa149581fda48faa68653cb61e300000000000000000000000000000000005fd25362d87f9581a202b186d2786d2859faa9966a1ceae747dd7a48749abd424eb9813e44caada0e456ee8bd12e99c0000000000000000000000000000000018e6b279e2b545acf1da29dc0504caa5982522546f83d4d3389e1fd6cb5328d4a167926a00ccaca402b3a3cdc67d757400000000000000000000000000000000089a9992a36b476fee21abd50977dfee01d7c91b24b3e26d7c15b2301352069dad920f0ea93a3e477a48029eef35605f06c2988dd6b8e9aa116eea4e1f63dacf100019844d37d163c047567e8e1188620000000000000000000000000000000005200b78dba7e423bc23e87c5937b464e97405f6461d05bd9d1d0fbf8f3c8e64a39081f9e43b4ec416198dc44db897e7000000000000000000000000000000000bdba1ed07c4a570359863a1098a73830818b3fa5b222316a3e0692a4ec65e59ca6b4bf5f72f8c1384e73e807d272d6e00000000000000000000000000000000073fa3eef473707b6aff37fb6f829f0fdb7ae808e85ebba4d4924a185c3656eb2856896307b671080347cebc32e958bf00000000000000000000000000000000076b56330f07cfc0ab34e98e2fa0ce4702b296a00f6ffee07c3ab523fadc048a047ccea7a9003c090951e4ef698d14e5fbf8322f706b1972f73fe4e22a3dad29c4ede09163561b2810cfc3eb2ffbc7ab0000000000000000000000000000000007252747c8275f87b21bbac4071c1826d166d14e6205095e5299315d6b6a85aed995f9ba59a2163ce2c51a8e60eaaeeb000000000000000000000000000000000460a000fe29cca24dec469ba5fb729edf3e443bb032d488cc99102a614a5251915267db003dbf395132d815ba78f262000000000000000000000000000000000161c01cb4d0942faf2303c108604babbd4cabf5d3d30c13d7db9428a445c7f72d96a7405e22e4e451058a94e20068720000000000000000000000000000000010ccf8a8ec4e6515b20e07057fb8cbecc5defb87480f3e32a1bcd0cfe239e00daf6a390c4815ef6b85be1f07a4c4bfbc4a46618381ba6b991b2edfdeafa67aef1cfea066fbffdba24db25385963326bf000000000000000000000000000000000e6cf781162502d2a758d0f96946bab887591b7c9ec9f67a1b0b962e74ee514e84c14bf67ae3c0a9ea2a3e472b7ef59c0000000000000000000000000000000001542b4e97f1e8a64ffd51ca43137b0660f897f6b3d5c6fee598fc4dd03932c3658ea55e1e9e73376e51df278ddd3a3f0000000000000000000000000000000016dae882ba240343e752eac68122424320d1acb1fbc4bd26c3983dd91325f25e1b1f06213e0e06c142997a13fbeca597000000000000000000000000000000001138b71c95d4de320f02e68dae9bb0de3e5b317cb596532c5cc18ca588cc8566c21551d7d55d685591126b9d9e466455cd05fce871e4ff11e7a4e834061c65a0aab7bfa8a0128d460a493337c6e63ebf000000000000000000000000000000000904f6a09f3a5f5baac902c702b059835737c06f62c2ffe9101bac32f854e4d72f74031f5410a5941612b1aaacbb50920000000000000000000000000000000012f39e7022150b2be12cdd621ae23525581405021b21cb9e55972724a22b1aeb2e15b135ceade132d3310e050e607f65000000000000000000000000000000000a92b1daaf23524904d74c3f149fcd2c98e3a4c257113533e7cc59c4656b785aacbf0ba6b9df0dc17cf7c25f1ca698c5000000000000000000000000000000000a20a5d7c0aeb16ff498f46bf05e512784d120b9c3c8b2877411852d7da3abde9e83a6d00213bf69ed88bcbb051a486daba9e37ae0dbb733af820743d8e307fc02a3ce9b40032b16d0e9466903de9caa00000000000000000000000000000000153918807d7da07ec7014154f00a558ebe0d5fb48fba4c16488d61a826a1eec28e3828d6744300c04207e8ff1cb61211000000000000000000000000000000000a755480457896c5a3fde35658e73fae821151c43fb92e9ffedcb05fabad37cb68aa24e029fc33a2518398d723c4859100000000000000000000000000000000148798bdc5b14b90aefc38946db93be1754f15d78762f38971b1e64a53fda92b96b0a70ca2548baec882887ae7f636910000000000000000000000000000000012299fc413dbaa77cf8867e331bc0602c4fb32fe44a150217de9e6391374a9ed83781034e5775c4933e13cdfffd25a9e6ef151662cba4952416eaadebfe5e0fa0ca1d31380e1540c2d5e0181af9e317c000000000000000000000000000000000fdfcbcce1603198fa344487d2d4838b3ff23fc0a73a76222707d9f8623f0b87dfc816be8717b0b12667bee460ef40f70000000000000000000000000000000015036dff68139419db619912e2d19b7d2a2d637fbb8bffcd941aefe2eb4d24c1f7dc32f4f53d4cfce67785e7c328d6c4000000000000000000000000000000000fd575be9bf54128a9a1cbd366339c993ced315a840d60f8b77e035352bf705c01a9def713e8cae3001dc1062cc0723b0000000000000000000000000000000004015ed456125cf0f46fe0093b81ff9315d955d470ad756a9303f548819f339e137305c58e6f4d8db3c8bbfab90718d4f0a3851bd52ca52919dfd21efa6efc56f6dd5060ad969360b1a731e8f38f0f5d0000000000000000000000000000000016d31e68cfdc5823970c8c2ebc53c3d4517792c44e90c10f920a819e72e4a6966c59a691b905c8b0b612065c56d86ca40000000000000000000000000000000005096d516e416fdc0df552c2688c74f1c067a3e5e7fd782479bfa468096e6ee3e601bc23d2e38ae7500325765483250600000000000000000000000000000000092c994e9dae287bb6450607a4263bcf6267f0f66ba3e63436292af7f6bc8e4ba794a12792b6af49ef59b5fe50ff6d3400000000000000000000000000000000175a645988f33612e969e1d91b2c30e47ec655ad655d89cd8dac151c3bd194cd5a8c28b498b1cc2f2966b7fc37cfc8c532b41960417047a2258b6e9e228f3cc1130b296cafbb75f58731a81fcfe8c83a0000000000000000000000000000000008d09ee15c80facf7e32b15418fefbf7e80400acf37f2a1bc6ced88b1591bcb8f86b45b544646c5fafa71b5b103b927400000000000000000000000000000000060865ba68ed8fb3d0a05779c278352b22d4244edb7add23d985a2836d2772dbffc3c82c3134916e9b0900c9db6ead8f000000000000000000000000000000000dce53bf8aca1ed44bee47096dd988689c1e32e1e65a5f8dbabab7c4edba866132ee2c036aba5648d0dafa9a26405fe30000000000000000000000000000000003319995785be720860bbf48692d1507185d898187993865648ded74d3aaca45df939c6dd986db42a51bd13579a55b8f71a6f7f091a6a21dbfffcec2eecaa22d05252b60bf91b56811a833dde3fcfde6", + "Expected": "0000000000000000000000000000000010643af30c3cdefc30144c5d7cab17c9c54adccb3294ae79fe5c69376011c159be1e43940640bf5d9012ccdbc997e2090000000000000000000000000000000002a22b08904ea9ca99103a01caad745dc2afb7b6d23e666770e81a97031de921f9d4d1c04fa941c433b8cd9cafced3a10000000000000000000000000000000010808e5518eb6cd61eec8820b9f279dba2423b1a3677e21fe3a0ca2ad49fbab2995de1c5adc9ac867de79e3b40ffddf30000000000000000000000000000000003ce1270644d71e0055345c7463d72dc119495bfa04a818dd398d944ca46deb0aee8c7936557754fa18225522fb79564", + "Name": "matter_g2_multiexp_51", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000059234bb6d1b66985b79e6a2c6cd158d37fc50ccd6e50ad2fe3b6a02ae2ad35b8b2be92139265957ea698441e780532100000000000000000000000000000000066adc7083a7f3dd75a8e431a36632dfcecc2527f261e961335bbe8fc8329d992880736bb41fffe41484f68c38fda61a0000000000000000000000000000000006aa0794c27d3f60debbee292c28b430c159cb2874b9467312cb857a8777058580f8a2d3b9bf4b8b732edb185cca6ac10000000000000000000000000000000000d81f222ed6acdf29437adf26d2b785535cd6d61b329df98be04114c3ae68bc6854e275792fd48de3eedf6ba7f3849a2e56b63fc6ba87cf021c2f92baec248756ddae0a4f070df840db281283a4c9b20000000000000000000000000000000013dab8066757b8bcce2c9965e600c31b792463623cd5561f7f6d55c5a52c22efcbe48b8684fc2dca87e2945765bf565600000000000000000000000000000000198a0594b5e606b18201fe2706bddffe7bee6c583147513333230715d18295714055b984cd3ff8d1127f9420863e3a67000000000000000000000000000000000ef77ae1e991daea1fe8338cf236ba959b22df4b24f00c6c01483b6956c609b805ab89712f80892bc0160fa3775907890000000000000000000000000000000004d30f5a866a100dfe469d4d0c47872245c4cdcfb18d3ffa0de422691044b52d2b9335682dcbf67aafa9275712ae3f5512a50af55f47fdaf176d4885e4910c54428c8ef433ea0cb1d009ea77783559470000000000000000000000000000000008010bd5fb5e222618bf4f919c203dadf9a7b7597bf90e16772020614481a0963a8e8b1bd244661bd33e0d147be7663c0000000000000000000000000000000007e21f548efb869a28d6fe39b999ab7fedae9cd6cfa531fe608476ef30c8703951839476811838608dac1aaf9cd87eed0000000000000000000000000000000006cc674c464f80cacb2156fc1eb680938cb38cc166a99f72daa50f9d2c40f10ff07e447d7bd5e59b6b22f0dc407dd8df0000000000000000000000000000000010b160c58ea82bc3904302b1b4fe83d1883efe3c8f52c4e05a3d8681e604eabb1b7f533e61c51e9a172987383506e7b189a012158b3c18e19471fca6d5aba5fd004a337d49ddef5db177da187c8cf1c8000000000000000000000000000000000d4f8372d1138489913654a7567735be1eacf8c7fd497c2216bf77a94f483bd4a7daa2c8232581d6815af9898a7569b80000000000000000000000000000000013676a1f72cc2ed80fa24f70fe1c52aad9ac13ad6cad1f519649fda6ea3787d86ea164d9ac86de96436e9db4fb4aa44f0000000000000000000000000000000003f7644f7ddc9276ac36aea5c36451f3d5d6e4c508932b16d5677977108f04deace5e8cf0b3b3dee88c328b6030f3567000000000000000000000000000000001953cf03effb7de9e62937572850e9fdeecb74fb4aa655de1abdc6e065920e6d2e51ff28880f33341443b5e6652eff4827dd109f6df1d9851dae28bcb9e552c6b1e1b2dfb331aa955d3d0b6c4862253d000000000000000000000000000000000c76a5bcbd2a61172fdd53b351d143bd30d460e398c9d4b7094a604ab2c0d46d6112bd8a5483c9935f0bf6d84df04b9500000000000000000000000000000000116b15825b780c49fb24617dca620e939e2528e10c49f34971736c82cd35fd3965088595deb86eaca3d3239c6c78a84f000000000000000000000000000000000a0cdaa541dd96fefd46b303b88f1dd4d24257b910a596817f1d946873cfd60ae58a88aa687ba573832331e8fc158db50000000000000000000000000000000016259f7285de159a2c6d6d8687ed348ab97e8cf329ea5de49b6d708b6da5b806bd012ca3641c50f479d85921e20fbaefca96785c1ab66cc5c8e434f59cc1ddf76bd78b6fe660f7cf74cfb79d7f2c7f84000000000000000000000000000000000797e815a98d362e1d7e2ac1fdcb477ccdec8ecdf340d7bded36856ce30e92b661669b38ecbcfb0896b2fd75df9b734a0000000000000000000000000000000017916c559db6b4b28b798c2027e2c70ba1b940212df8a1649b9f6087120660d698bea81258e2007edd4aa7d0d535bccb00000000000000000000000000000000167170a76db0783a8c3228f8246502b15d342b019fb44a46b514f4ba2de3ac66e435941adc3d91874371561870ba87150000000000000000000000000000000010097a585eb9264ea96904d8534820be185d8d9e4b1616439a926c0ff8ceb6f2bc082e5712454690c9c05b8018a996235aabd1fba36142bd768339e091b15b7f5b4ea609b57947a7187c498bd9833c2900000000000000000000000000000000025eff57e1f37903056835d1b4133ce064c86947f35859817b2cccf1a5c3923ccca766b3e0affd20a4a6df62a45c31000000000000000000000000000000000011158fce4ade070629162b2b6cf1924696f1f7776f3d623cfa3d54c66fc17fa0299c6650b709a1472262fc0abe8d9557000000000000000000000000000000001828a65fb90dcebe25413566deacf0677a3993b39d68854b264fe7807097fbd3106ac618545d3a6a42e197c65f0d2a7100000000000000000000000000000000045eb8164b6ec874467286dc3626fad3c01be61f6a8a88e5f88797978463db648a9b8a1e1a2589364ef2879cb5f75423fbe608fefa5472c7d1611abfa402d2eddb1e54542f45d4012db8ac6d1e5016100000000000000000000000000000000011847bdf2f67b40aac3426716391da488a8f0462b68bd35a8c1c762591e2f426f48f979a646a094bce16bc99cef7fcfc00000000000000000000000000000000092d61e408120b1549fc8d2174572eb7ed3f679327cb89754f326fa72fbff79e98cf5ad9c94c14dd86135e9aacc98b98000000000000000000000000000000001440e2f4ee2ba254a780a31b02babca093a38e5a1ac09ff388080b6c60918ae5b26e1c0888ea0976527ba103b257d02d0000000000000000000000000000000019797e49808b756128866fae0d6aa7e755a1d6f07f7e6a877bee150fe9adf0cfe612350c5a0e31d68cbeed226fa56f2a28d57066cce439d8d0385f647ed5e9b29e8fd0528c1ed8455f37dcd81f4b62240000000000000000000000000000000016d723a64ee06a7a631509c6e64b1c8bbe199952da532dd92194147bce9942cb4a76f2358e6c7d263916fa36e2c0c09d0000000000000000000000000000000003d04ce655cad1d63748f6eaa9912d6474a34820986835f60c812aee9980d3ebc18d6fd856a6de9546be024b2e95126a000000000000000000000000000000000ea840bd7f76f8e944f95146cdc9692d97e6a2d7d16d4a7f054f81888472da4d60ae5faccb72d3a05781b399536ccb1e00000000000000000000000000000000155a1c43c39e9dfc6d96e01c981662900fadf1a46aa1c2fdb70bb34e94dcbe86c4f255e259c771ea8ede50b388ceb2f61208d8d328014a6b2c8b2b9edc70589cdd63d38f4e70abb41cff1b7693bf9a290000000000000000000000000000000008f189d97f7d82aad87fb71d090a5c99d94079c0b74beb3dc860d440c0f46727fc49104d671bdcbe5b9551552e18afc60000000000000000000000000000000010c4edfb64b8932a617c316820cd27d3f6ffa89b471949362762af8e10d25265b84ca2aafd3b14f33c39a4b533da60d60000000000000000000000000000000017ef3bb919b087fb6745bbf115e2929394fbc9c89f65e7d591f15da93ab785aa6828ebb6ced99d3506810647d28ed814000000000000000000000000000000001591d8213ab349017cc93f1fbe6aca6765dd33ac1f468621e2c79e30aa73bd7606a0e5ba1d97ff03e0029dbc8ab1c5f4d3a2044ed4f938c17684413625bdd281f685abea2e375bece77c03d697c82cc20000000000000000000000000000000019b3a2df3a9571b066eb451e34d8a38c0d90b6e365862bcd92ae76195956c21c59441f0cd03cc69abdf4ba069759b87f00000000000000000000000000000000082537ef7f4bba5f32db4443abc8eabceef643b0878ef83860d75ba508369a3b459cad96f1cfd872df99548f656b0f9b000000000000000000000000000000000b2fda5ba0c405c9481edd598181ed8a59a8a18462508af8c5d66988a7a58a5c9635d93b5e0ee310bd35e0091fcd4986000000000000000000000000000000000af7e15e0052576f82e36e7e2b614dd835a290e05f2ed9dad7f508b4c04e8d437e7e937a7f4c88b5e66b06e0beffc4df7fd81e27a577b5e79929614c069d6d52146a6183822d25cf1ef84d8afcc1f6b40000000000000000000000000000000017a1d5add5601010d138263b4793149a02e8f4f7cfaafb69fde7b843a51cf5f0634e26b6e5e3315420d44b0fd205230d0000000000000000000000000000000013ea863ebe1b1cfcf4164d78dbe8fc809d2b82ef3e5a2589ca1357e48dddf2696e910a90301ed910fae77a1e462a5b1000000000000000000000000000000000012b40d9f25dc5a61454ddf1fa9c38e87eee60e55938b411bff9cf2161ebd7d3fc930131a198e7e97dc90cc245164e7000000000000000000000000000000000054f19ed8e2682caeda10c252f11706e7f3b65c81e7ae0a617469babc5f3268fe5c0ce2e85d44fb6731e8ac132b97c3ac5d47ce35d4ede84a83c9860322f582ec00c872b4b035d5d340981fc29884f13000000000000000000000000000000000ef0378945ae4683666099be36de3e60b5bae9c3137b702e5e4e35afd5c1e81d033c3d6b1debf5bf36bdfc4e3af37759000000000000000000000000000000000c37074af84ff596ff2c7ff963d96968464d6c8d88b69af64ae883457d02ee9ec80720661f39019230a6531a0f2952bb000000000000000000000000000000000454e8aaa2830f07d86eac7aca1d7589fb06aed646146a1b90f4959b5caed73131ab231313b50c15213f89566ed87a3600000000000000000000000000000000143516cd7a1b8da41226cb828887a0b3314cf4f87c207d1d84e9c49f0f7e548ab99e635bd126d49fd2e4dcea98f3adf784ae256d47de2d49b1e755cb0e972f3b614f3e7ba779c65ce175ca3811021a7f0000000000000000000000000000000019384e15a8754c6d85bd298ed550a26b51b714745bf2980b4920d6e73f59e657d85d3e86baa9bcf7e971233daff99d02000000000000000000000000000000000229d233d605a1a9f060605ae366a263594d8fa2b7797358ffe4c62431b9718d155d24d80bf5af1c806f447b92fcfbab000000000000000000000000000000000bbfb66cc0c7bcf251141c540f712fe9a359d1ed36d228379a1f3791991cccb7dfe1a10d40667ca062cccd55c9e6b08d00000000000000000000000000000000150a4d7a003cb81423604c13d0c5175183ab5f459b96842939f5c4cfbb9196db4667bb4382d2d5c92b70800adf384569a09d0136d4dbb3abfabcac55db48b1ce302067f413283fc1a21744f1c16ef7b50000000000000000000000000000000016352fb8e2751f126fd0f889f2a62a85b95c50d6bda7704112e4487dc94417218b0daa1dd6b998662af2582c44b011c90000000000000000000000000000000016bf4c60eeaca103c90643fe0969c2c261e9697ddbc02279f0d5afb5c905a984ab2396db93555cc2dd5682a1525446d00000000000000000000000000000000014be742feb1215cbdcde21e974c74e23c7bbc2cbfaaace28cf1d4f2b5a77dde2f3910aea74bc200277e6fe0475208057000000000000000000000000000000000bf98dd3e3a8b13e487d8b1a35615b0c6b0f514f9b8da7d6402586f113974c8dc9561db797a96f4f8040c1765518d175650a6fba1a5eace6b455ee780ff266c324f49801832640856a80098f0eed0b7b000000000000000000000000000000000362935e552dd01b5fc5a15a76faae937d7ad086b0a67e9cd3558287274106623deb85b6410bb4e64c424d44335f3b1e00000000000000000000000000000000096f23a54cf57aa3306df0a0a4f45aecb9b09bfe83878d551a59c53e18efc5a9f177cb7fdaec1648f66cdfaebb15c61d00000000000000000000000000000000135271fbe0cc0987e82f3430eefa8e3cdcc1be4a441393bb3fac0b8e8f78dc47ba2b833d9dca4277bd60befdf33275cf000000000000000000000000000000000dc1b7512fa5f9d4ea3f4229d947f43d7dc46b7770aadbd7351b6d48d525d0144183f2c84293c63c68d5262851401ae0282cb1f8f6d6dd81e7c49176503a76837a96d7f2b084d29d11dd9c6548cf0a57", + "Expected": "0000000000000000000000000000000001c11610b63eeaf9e00552a230bfee290ea49bf9c93cfea1b6f684c9b5a07f341b718a0070534e0da9e6ab1239d800830000000000000000000000000000000017e8107113714ebb1743c34d83be3acde096bfb6cf140e943ecd0831ecfcd097f58d25a45005db61551a01d9da46de10000000000000000000000000000000000c2eff6c7c25885c514aadecb8f0465a0fb4385eadffa082e8d4f497b10df2395be5e7760a87bc26772dd78701146b730000000000000000000000000000000011ad4e20f5c1518c72f75d67a897f30100dbb83365ef7729c3501c6f266d6002edcab8c8bc1f449c30ec3624cda13809", + "Name": "matter_g2_multiexp_52", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000010a26eda028649789d9e01232884e4e5a6b8e0b17169b9d64393e2568b09ac4d3e61a5996108655c24e76abe9e3fb7380000000000000000000000000000000015e4e36bcad524f8aac7f909fbb884e879caa735f80fe9890d7874be919ee727beb2a074984c047dac1d02b8712afa3a0000000000000000000000000000000012458946f1e853a7a45861a92d4ce707e5aebbf69edfe69190c0bb130141a10869e2a73e06785b568248d5b1f647e63e0000000000000000000000000000000004d8061f25edb5a510a2db9e1df850518156138c78ace50f4c9ce47734a0b14352f5283083a232602a070c3ce94c7bd93d7f8fbaa4225f3008649eebf42315785ccda2b9ce922170e606876881825cb90000000000000000000000000000000000baa40ea518227b007b9714ae6eb5a4e92883dc75e6328caa780bb2ffee7573dcd7e9ac47821ac449187569986bd2980000000000000000000000000000000009d43d61f070ae308c5c285915600dd9c17b7de63cfeee6fe33c9ba857b3c72e057bcb4d4ac2b492797e7d785997c18800000000000000000000000000000000185215a7fefb96b3ff9229cc3239c3ce5202a97e275ea9b1541d7bc0a2931d7e3b01942febb45c6e96e66e3605744afa00000000000000000000000000000000103ae58b8066dd62c46c14c593c768fda91b90e4840b5560c974ce69b86bd6d2c13f689b72cf9619e57c9dc8e3d3fb15e71e6cb3d4e19f4a70a4465df6eec6326f558ee1cb99aa540ad2a73c363a133900000000000000000000000000000000075585f862c0e0e031efe12f31e159f2a8b89825ce80fdf65906474f0155f397fdc666292f6a7384cab790f071335c49000000000000000000000000000000000eba3d37a5cae738ab99ed9475c2c7fbb88ff54edb8490017162dbb16c8225102158a266fd4ba7570ee6d5ff6cf3f5d400000000000000000000000000000000135a0b0a38c036919f8389eb7bdc505a375fd75d513eecf0cac134645d60fb6030a437ac6a0fbbd167b7a77a927b3b0e000000000000000000000000000000001688fabd4ad751598ca036ec5ef6d7b314980dce7d8652163e89fad01b233af64defbcf352743ec478af42587f58177dbdb2b3c3b8e91540dc2724537526fd8c0d4b85d2cc20323d71fa5a4f61b3f12a00000000000000000000000000000000062a74a9ba0e2e8d95fca478be8d18fc716243b1faf7365a55387fd7188021f53bbe780e973e7d16c9db236faff176cc000000000000000000000000000000000f949be3fcf9b38995624570fcc9e7df9964d038eca189336ec39d9e0bd05148ff7df0b48436a2cf6e249e52248ee8a40000000000000000000000000000000007472e7c366419a0cab844522c46356acdf6a12cffae941fae3d3b78e7a83f0446c945bdf7b247abccaeeaafec49026c0000000000000000000000000000000006a564e6860b97feff368fc9a349282112e591a7a6987fd10a2d4de8ae4384ce229b9db9a93445f727eeec55a6fe5a9def0c8574167a3bd3b794f057ed01865ea69c38023dbddb0afdc55dd9523ebab7000000000000000000000000000000000c073d2885eb125d3e7db48127178bea2c5bb0f09eec7081f15bc6fe6cba156914fe1b1fea6cf14a21a328d831523ec300000000000000000000000000000000010d93564b2facde13d29dac198c5f5fa314a0398f30c6fb7fc9575bc83d4e97edcc1c1d34f78728729442777718f54600000000000000000000000000000000136a4ffaacf0b4a607c677ed343c1ad41a1eca49c7c48fe73ab2f74084a07cff18f07f54a7f8ea1bfb7fa3667863bdc8000000000000000000000000000000000fb0c007a907ecdff7bfe2242097caf0c5001124d112689a74544fe4fd85be9771632e7267a1cc7e9f66d7e4bb4c954c3ccc75501428d3be8bb469ed0f2df7dec10e1d205e11a907cc30c4a76eee3cc000000000000000000000000000000000032bb9f20fdb19f578fac3008396f5dd0a70860f77f8ae7771fc6253569d47b72751cd56bd373dbc5eadf55b99578861000000000000000000000000000000000c4a4bfb5ca6f9c1bd69d7377c6da405afc3128338dfddd9aea19aec5e1e0f547e3febd28445af5e27469c87c4ac15280000000000000000000000000000000003b551547af253d07625028db4b9a8da2a857bc925620c5d561bbcd3e063eb460d9407cd4d4813800551e5d0d23a2ea40000000000000000000000000000000006d5c69a251e9a042c66bd4ee92d4f3cd4e79704b1b215c15b319e09cae0d798eb201be24f407340dbcefcf2cb87da5ae5e403f555fbc800f1342275f18a73dbb679bd31873ee87617090912a52d6a55000000000000000000000000000000000a5802e388f7605bbacd0bb65ba96689e223379214fd7a92de9a313f55d66cc71ffc9ab3f9979b75edf55647ad3b6c94000000000000000000000000000000000f86f968b5c20a81f18074803e1ec55ebd73bc87451c48d5bb61604ebae46538dcc9d21cce062abc07b4b9e89c85bf60000000000000000000000000000000000f9fceddfa8fb5bd76fb7c8986372c32ab9fae3c26e9fedae892bb55178fa2f3432e6eab5043496dcebef46b20bf5824000000000000000000000000000000000dcf7a118881aea4e6a0e4e305910d4e4a5f3d0a8800f52659ac26f122bd63c8aa2c5583f1121275adc9af1800a007fc97ea57a38598204c15bf65e7270a175460510848540ca4004286f3ca09eb59260000000000000000000000000000000003ee0ba2b1de438abe66769124b97a951ce18aedc8d9ed005628aeebd90efd316e7a3c60cb5a103d6f72e7a40ed8f44000000000000000000000000000000000119597c99a7a16d8d35937ea15539089741363153ef898d6bb177d9a9b6c5bb4b79728155eacc5d82571f398ac6c32a200000000000000000000000000000000116184ac845a28c4f96641ec19a07e1f8326bd45e2106148f40277ae6fcf200d64e326915cf5c927222def8deccd4ff8000000000000000000000000000000000f890258e70b973c0d69492b2e7d10ccb3997798503c0943af4255c13b3856ca4007b18cb9d638d5d9cca71c368cdfccc54dd8cbe68d5151e4428d35ec2d5b5cc7f5e455207c0788a695c2d7fff6735200000000000000000000000000000000171035755bd519af04efdd477d407267c5a8108bd32dd6d3f1b9555f15f37ce7598c096fb5301873809f0c000457a4a2000000000000000000000000000000000bd35595246a8337a426c50c02299f297036f710b0979c7f981c6909e835c0d9556cf64e2676baf952a787e10d604f210000000000000000000000000000000006600ff240aaa026941290f49ae8968e72293ae7c2af0df1b4ebb9373199b95fc91feedd2782ce819440286aeb2388c50000000000000000000000000000000015b2bbffac097c27944143cfb22e38ff8e50e79f2336e64c8496b0b25892834efb18a765e26f1408df1d64f4b9b78fb947ee5651c127d7c8ef65ec68fcd97d1dc228bffb5bf1278aed3eef8115a5ae72000000000000000000000000000000001064bd04edf96a3c76d2ace669ff72ee5edd87d32592213cb5a6a4a482154c1723bc19c7c530d164c31626dbf758d43f00000000000000000000000000000000176ac06390e3629bdfa282bf825c0bca9bc4e0b8fd90fcf2d4ee456d5bcb3ac2882d8406d2fd59faf10c8327b1962124000000000000000000000000000000000b58fbe4e14ee0af03d9aac4131abfaaba43c7cd92d530802516cb67343b382a6d2af9399d93b43d6e05f7ec827d5ae20000000000000000000000000000000000bfd241e3180cd5ce9de831b24ca50db23685bea7e008be0c6ead11abee338618728968c25a8e5a916cef8aa516667214ab6a1d0d3f87e7c9df0c14b6fd2f9d0cd755d5fce5f40bdc8174790901549b00000000000000000000000000000000183ccf0ddeb8573923694decc02b8f02162037156a8f6523ed178c13113d094521c3d9257febcfbd8f15acfe3d5d5c27000000000000000000000000000000000cf716097aabb07979ee435cf57ae36a3034283eeec0771bea24c9a1a15ea106201af8606d3fc28ad8ffbea2cf274458000000000000000000000000000000000b962565763c4cc155b2d9ea104e754e5fb4745303240688fee7e2256fbda82dfb515a51096be5ba0b111637b1a25438000000000000000000000000000000000df04aea745b9df2df0e34153269958d3640c1596fdff3fba696801c96371420a3619c5ace9210af7e0de4f408b09a7729b12cff5a72f27e15032844fae50e3cabbe31a69568bc4b5cfa884f62e7e204000000000000000000000000000000000e6be3275371e533a676f8d075bb2ab8b0216642ecde13425bce4ffa8ac51cb1b4c5c789d82387f5355c27f18da556400000000000000000000000000000000009fa3a3df5195203f967322cee54a15d1e0096922b6b881bb3bce54587fdb82931c0b87de7a9dd1a21b4389a34d161ba0000000000000000000000000000000014dd5455deaa5ea4f9b5a6241c2e8b2230fabff9e1ac08b359f029f4c7838201cb88a92a5b696ed47819e4866512fff300000000000000000000000000000000181085d630d1e24ebf79bfafa134c08c0e75626dd400ce500392adf4462028bc714ca07b28b8b8f15c9cf2934a299c3092c1b10d980826351c3d193a0f54a7dd78a3995efb02fe5b4525fca8791b1c4f0000000000000000000000000000000013b60e3be9d7d43eb42f7cc2c0a7efc81c175b696e82b034c87d1238db2798d9ad6534b86992653d86755b4f00cf989d0000000000000000000000000000000009dbb325624e698c76b9d697e4f7f03e502ae1cd43b49a0957fc067858e20e8c7ede3577f336eeccee58cad53eb727560000000000000000000000000000000007f2f50be2c6fbc500ea347cd14ca195af08b835814ca515d14dd2f6078eb6def2b9475c2ce370780acf394065032d0400000000000000000000000000000000109803d612b9e27be5725f162d061b9428f363493c17eb39c097032039387d96d0939a06466470ab62ff507ff762fba78f715f35fc967837facb515ebff3df502223c29e7089fe6d2e9120bd3ecfcd120000000000000000000000000000000008a9fcb462412c1065dc7c3623ba5a980e6f86cc813b5d8eca6b1b8a302ee4176cebc233411f2c9ff171332c66a0d46e00000000000000000000000000000000058d2e7ee02bbd4896b5bcaac0f2b09c16d1664209710945c1f7f1a53e24496d7eace99488debb32afe10d7fea442cb800000000000000000000000000000000084d7600bcb68d5e375457078672fa07ba2c87c8ec5f9eb7b61a0232988b197aff052e7125b33c6657729ce8a1c668e2000000000000000000000000000000000a07c42468c7c65fcc984bbfc2f05bf452daf17d57e669ee5992ce67517e1c93b5f7f4c9434d40f3b9bbdb3446ddb982a9e49fcb12c0b1e9bcdbda52e9852ee0e98fa0d43f7476b3d65ef5370c9460a3000000000000000000000000000000000ec380d15e0efd71958978b1f9298ced4cc3322e472d03830ebbaf2a4601c8371e6bc1cad047b0e1e429ecf6fc628208000000000000000000000000000000000b278fcc53b7527545ae1340c24158ff662683919717c220e7d2838a853fcc84ce3915f105a932872ca7f64b7cf096ba000000000000000000000000000000001520798dcd146c0b39ee727e8276fd998de0157a68587c2fde56cd82a9779b6ffbf745ec151210d1e9143856f24f01d600000000000000000000000000000000175d53b992d750b34f9daa39aec918a0ebb2f539db8057eff1409492c90f79a00f14a4c53445c028bef5d6372c9f80c680b0d6316c5d62d41fb0399256c5c46ebe2a12eaad835d2c7177bb7325e21d3b000000000000000000000000000000000fb3863bc7b468f1a0ab0e4701ea392bd820ec5cc2d7d86b58949002f24c972f51f0f82400fadebef13b750884b35f9e0000000000000000000000000000000008fca1b30d4e01991811679f261d11723086753e816239c8c7ebb60ce9ac0ea207011a69cdc29e3336e8f589b71bdfde0000000000000000000000000000000010696ff9d78b48743abdc6c1f4b44b4c960aa516623a24da515206d95e65286e453a8f275d98aaa09fefea29e71b5643000000000000000000000000000000000fb4b5eb18b6f6f8ee7dc734e8bdb625a403dcac6d0cae363e5a7f3a834c8eed5f01fbc4dc752e228c41f3f9d992bbe01b96434f34fa3e00ee0cfe548a2d2ca29a848cf1c52f940685caa9a227e32a61", + "Expected": "00000000000000000000000000000000165baa8b143e3734169986e68a848739ca05330786012de260148cfd0810ffd5659210855f19ca92566ea0d6c48086ec000000000000000000000000000000001225672112e0476418288f381165292a9aabd009b0d9e44d9f8f00469b2c56698f5f985ab6292c9dbcf73bcf610080a20000000000000000000000000000000005418cba24a43fc7edaf2fe77422a0b2e8b38a45415e13654c6176c8f7cf6bb2b80401534154cd3b23e977af589eda9e00000000000000000000000000000000067126ad59105621cb0931ab8f386570b54977563ffd69c2231c56e7961f6df2c5d7b114e0b1ea176cbfc1d657127286", + "Name": "matter_g2_multiexp_53", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000139cfd67c3365c5b4422063d7901108c9f33e233bf6413ba2e5b2ad62d188cb50dbd3dac0f298aef7c1d621249d4b0c50000000000000000000000000000000012fcc0d5d09cb3d86895f76ac3d3e9fa9b2495110b0276e7a039d7d2fc2e48fee646fe331c1d8e6f019898ddb43dd09b00000000000000000000000000000000159356eb3ed0d4f146dc929aa6c77057be5ffbb064432d3fc35d346f19f6c1f8552c7079e27f3188bcf29941375e62c9000000000000000000000000000000000fbd4e9a57aaaec40ef9bce8b76b529bd2261d373f05fd69af58d1f23c089497473e44e937b2617a92942af1a99d031f10e0acc22c43080ab9cea11a60866feedd57664bbe6c3f0366beff177f66318500000000000000000000000000000000022ce2d2bee57f7567e9b52ae8e913c79e3b2dad381802ccad317b525be0b503bdfa92722eb0c21fdaa31fce2421ae300000000000000000000000000000000001177074350288dff9dd85dbee758fee1400cebc173793198a96c0be3bb810d352720e94b9bdcc6f5a8951b3a86b2a0e000000000000000000000000000000000179e21de58ff76427f5ed7c8ca3058d0e5e81e436280aecc75a3d989d1cf11d41734de22bda74cf0dff175ac789532b0000000000000000000000000000000016abe94a49f071fcd5e24b5f3a837fe3fe7c7dc53416f59d0469d71f144f71ade4569bac3aaa202a8479c794bd251645cab0c230c354cbf1a3c13c23a36ae5f2d5d084d7aaeb427c580cb6b9bfd9df600000000000000000000000000000000018dee638031a3c9b1198cd4a4f267cdd66849e2b80e3d670897d9e058bbe772936d827eaa4e78283d42ecd25eb4b22e200000000000000000000000000000000009c04ef31cfda7c086a31341434a1698c1132fb5916d359a523b98d05d57bb38a1e2e2bb779d4762f9d4ec24fbf2564000000000000000000000000000000000a788450652e0bfae66889c66b0dab8d1972a626facb690f8e4ebfefc7e1a7b2b58f6eed02c1f10a74b140a49b6c5de50000000000000000000000000000000009e48b52f2b0548dab1c0d260144ad2e66a22e0f1781f94071b5a3a08311d11dcad6963b4339fa63bd82b4ff0dabe685290608899cce4b3d25f57519cc881eb748e9ee7e27f7b21d69f5d8ab3650c3e8000000000000000000000000000000001319607058637d4b796020cca79d62af5862b1c186f32d99c0ff53a830888f297ac4389582f9fd010534d824522e6fe3000000000000000000000000000000000608ca0b4806f17b59a805a3f9f75e7a33ac0791e05050d4eb19f2d4c845fa4e4c738c3309e24a4524b6bfe716949ab5000000000000000000000000000000000a6a6201ec077e113995acb81d4d07d0c4a085d367ed740d26c4a0c04ddf28697c1cf5e648b25148888617ba77ced5e50000000000000000000000000000000003eaff54800dfc8eb3ce647ec4ae8c1aab6a87d4853a1ea061a5e6367d8ebc94243837d4752a1933f7eee0ec1ffe68c8b71debbd9f3be5d6e65e837bd78605d5653fe63025c320cf49c035ae66d8ff5700000000000000000000000000000000122822c91bfc4f761b65f4066a94c0eb1f53133a1355c019f04003e84edc5095523b2ce87ff24bb42425ce979743ce31000000000000000000000000000000001928bc315800ae9936e5b763bf29b19a9aeb71268cb47706494598e0ea057f9dbdda6733d9ea165acade87bd89b3ec12000000000000000000000000000000000a87c1ee17bcd7d348ed1a5022bbc7438bfad06172584dd8e3b51db4b3b09645290382ba991df37db0ce562c950c0e6600000000000000000000000000000000127c80da591c3ff8d300bbdbe27e0aa21b5edc1c1fd8a5da27f58a4dec3971b3c4f9631bde244a7072d9c19f1c0a46be250f62ee2c2972e751b36d95a578efd2fa5e0a2c1e29475a3cee48a28080cb0b0000000000000000000000000000000004bcd0a0321c3c7e6161cd53254353905c27d965f57c9783c3fa7cd5c55a5820116415ce45491d5d1ccef6017ea4608c0000000000000000000000000000000013a30e19c43a1f466c0c3ebb5cf1b57c44434892b18a7fde18a2a29b09a5b4d13d26cef871d689d9855a73a43d22119a00000000000000000000000000000000066d6b3c9a949049413300ec0398d605277911d7be327b1d816cf25543d1b2d7c31d912f426021e612b56ca288b462450000000000000000000000000000000008549f4dfdf018073cc4e32ac930397659ae7a59ef42ca4f864b26e4635c2b7669186a107e9e91c35f04674d2be46051ad08c3d2c36085212542427c1760c72f22838be5286402ef87403f816f4fec950000000000000000000000000000000015900fb486bd2c066cea98e51d30424681fc3347a1cfaeeab65989d1adba104a362837bee51b8b953ebb520feb49aa6c00000000000000000000000000000000198ccab1f94fa910f755936e357a92d358e00cf406894b46adcfc301918c4fd7cf7200a1ea515343d577d920680c83640000000000000000000000000000000018d9380a8568adb92f8f9f67c315f2a837d542b32aa82d9bbf5db6dfea27260738bd0a03683a9988c6c3370563e7bb8f000000000000000000000000000000000528ad42f23c4e21a687f2303f495e962b0a90713d6ef3abbdce38ed166ffea9c132e50c5b002b2ddbbd4933e9a1aedf6ffa16b6fc4cc9509a2b8d8434fa0f4f38b4cb4eb1bf7f545f9f43b9190cad890000000000000000000000000000000017eb2587aef34b03943a170d91d99aa16ceb2a36df3068663382ff4c135083c998743f9145a2fd5dd4ce3bb8b64cf3fe000000000000000000000000000000001256fb29c7482e5469d64183e3e848e5bf32f9c495cc495c3f8cd8e46f71c3f9880f875cfe429677615a6803f849952500000000000000000000000000000000146e2f329f86ddf5b0b17c37aa2905122f457c2c812782bdc15e132468af48c49b715e3080da504d59414ceb367596f100000000000000000000000000000000022a8e385972592430e76bd952a700df8d35b32deaf06c60173d0048d6ea22dad95cc62300bc1a60c6452c41b32b504a1271d29abc5f972809461a1afa5eb186dff5e28f20311a1d8416f8d54fc4b2d90000000000000000000000000000000009c80b3191783d235814fc86653bf2f9a32cb7938111408087b6ab5bafc480583e7a2a32c6bee0ee4aa867ad5dbbf77a000000000000000000000000000000000a09af60eed6c47a6c2615cbfe62025530b35727b42fd812032671ca1eece6694aaae259b05906faf7fbb54362ea890900000000000000000000000000000000055c5f0818f41e5d73e8cd5f70fa77cf477cad8dca2a88b8970a3a25c8f38382268e439642518f1974c5b470cbf29699000000000000000000000000000000000834e44669043aed8ad47cccaaa7476ad830e38fc1def66aa7e8207e889ac0fa1a931eb1e90aa6e1cd694bb95056c3e63ce55b3b32ad29dca1a0c99771fc8f7179851995d5eac804458edede9b8dbcd000000000000000000000000000000000190f8da34caaf472ea9b0f41851f808bba402b9be4baa5d02d1bcb2f66acc3172abe78a49a653cd24dea402dfb972f670000000000000000000000000000000019931343d0e59f0f0a060bcbbeea92fc4670db510c017fd94e0650ace68c2925c627f373d8e755813c199b79c70369f20000000000000000000000000000000013ee811cbc036d2786d8ec0339627d6134b10517c8858f6c6db19a9319636459ebaa217649825ffba32a224175267de90000000000000000000000000000000011039d587f3323ea9d3c50027c427fbcbbf7e097533d8a5f7a61520f3eb548c399e401df0f51884395ad6a338c0a3500c6fa7aeb016b3e3f599846af83f426b9ab85b6857f901c49554d03d27a390f5c0000000000000000000000000000000011d5791e9bc632eb63bff86aa433e6df463a84570b779c913f67e77fcfefb6af48f3df2174096a511ac35eff64e0e5f3000000000000000000000000000000000282716505907931bc93748ba1729777b959d65aec5a78c9f829ae6f2a94a022116715a8c2a653a832a62625473a0cd1000000000000000000000000000000000f694a16ce7a69f0261a0ae19478003dcb61bf93a2ff39f940fc4718a38b9f4b6ab13527c5b438d22499ba29c0b5461700000000000000000000000000000000031eab53440757e4065804896e9e811d459665598546796d67472054fa60e5da8685d8e847eae342e44730056757c6287275a8d16c02389795d54ebdcb70a39fa885320d00cd4e5aa15967916e46c61500000000000000000000000000000000138862ee422bc0f38ce3e27ed3c1b71f71a03d61cc474d989b0cc824efc512ef173ef17bbfb2090997eb9435f4d23e0d000000000000000000000000000000000fabf1fac2ffa25d9c8cbd49b3db5dfdbee52adb947ebc1a3423c9fa2f9d3d29329b60ce0c1c739c7fc6d5a5d3b9e96400000000000000000000000000000000090d92e8763d4df49b8121a50affcecfcd632923b5fede480a3ee79128781f3f49b592d8f65d30adfc75d8a1922c41b0000000000000000000000000000000000074456b341565b13ee3862bd87b72f9d01754c7715751738c5b33ee85e3d8a6f731d7292bb485b5fb59bbf3ddf9b0d0dbec9767ed2dbde21fd8f315ed6292b5b0b1bb6daf2b62665c34daed00a679cb0000000000000000000000000000000007b85110889fed72b3654a8632625835cc041ff0a827f3e1b86c090d816d98cb3b4be66b6e573b3dc05b1998f2772f0e00000000000000000000000000000000160524507679ee021f4307e5a9fdaf01459cbb9a3fb9dc8be5599431e2a8bef38bf8a05d601580085da503dfcf57aab7000000000000000000000000000000000f98e2e7ae9cef2b1d954b7f26fa1755258112c496605c3c77408786d4b210e51c76f10870f558296993e0ddcec3d76e00000000000000000000000000000000068841825f5f5d8f622c1d43bfe090d11c6996688589c3d644ff5da47b94c0638128878d51dcf6d43637781f0ab21a68ff634fd89223733f407c242e52f034691036c7ca69f30e6cd444c561de9ebdaf0000000000000000000000000000000013ec97016dc3d6a3cf41edcc18f88f58b1b88cb2616bc2a8f96af3e7774ec1aaefe86a86135a20ab7592c874a33a8e1b000000000000000000000000000000000021dc7e4be6462d64ba6c09c2d326ca0164305dbf5ca1981f265a1e50f1a646748ce66ae07297230325937faf60709e00000000000000000000000000000000121bda2855503ef11b043301cf331a0fda6e5914e5ca657890ffba2542d908f8fb02c2c93cb4ac4fe5bb92eea757ca7b000000000000000000000000000000000386fdda56c778a7552dce451a6ade55cd24bf9eaeb837ebef898e2e868d05eb5edfe97bfa8eff8ab7cbfaca3c918910461d349e9711fa701b92b62dd3e3569d1203b6a35ac8600367a4df9a9484bdb0000000000000000000000000000000000763746ba87e8bb547180b0bf18699ff74f11154a06cd77a76cc9c264db7c48286fc52e3ef2d30ca914cdcc5c4ed46ad0000000000000000000000000000000018037afcabd273413eb4a712f5d1888249dc987a6fdb8befb92c02660604bd11deb33f283b37f88880cf1be2b2e71f1c0000000000000000000000000000000008ecca3d1652be4764720ef13a6ed6164a3ae89d160cc8c2c8c37bcbaa52db0fc0de84fbe2a19b93b8100556fce0fc80000000000000000000000000000000000c5727babfbc5c36c1d57b9f69c5b41823882e0196e9e0a89d5f4380c4257818d90b1fa6d782e774f2424209bf2e6b5fcc110fd7a6ae46ef78c0e26183e707eb5e0a2944e3afc09e435d56e91584b93d00000000000000000000000000000000142d41630fb9db2f9630e4d5f9c13069242fbcaf1dd02f93224174567c3f944fa02b9791a409d9236d89df6ad785e8ed0000000000000000000000000000000002fb5fa0b3a7cef16e5638f217bb946085fba870836c618a7db9b4394da9144850572daccbff8208f14c8082aaf1ef6f000000000000000000000000000000000a6be9b4a6a9b96d2096eb3a95780f11be1e13bcb6e625517191822403935c52cd40481bce2e782c42b11321cff2cb7f0000000000000000000000000000000019e2d94e35d608a50b5c8b371044f6410dd6c1988ec7a677016d4b52cc3f21b82fbaa7db897f7107d81a177c31f8e52467de5b9bee26b26b28f81d96e880a3f07dd04eb56c15314f1a789436e01adcda", + "Expected": "000000000000000000000000000000000a6f3fcd812e3878cccc6967d49b104599fdaa80cb5dee7298c3fdc80477d277f2c68f1c941f6e03441eb176c222a448000000000000000000000000000000000a4007cc5586d677e7945dc8a5872b4839d5b256999166e7fe8efe4d56895f93be4659f43aaf68c6070babb6d3328168000000000000000000000000000000000cef5304a1077c8f31d72e6f1f91ef5a021d8ba64719b4527225b34e615af388d9b1391f65511eac209ff5e86244039f000000000000000000000000000000000c856e7847ea0b4a8334d124417b45a8689d5d9f113b99ebbe3af3f9aae1cefb236d751c40488a861a8f0e0326b42c4c", + "Name": "matter_g2_multiexp_54", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001805009a7fc3d1705936696191c163a07ea992cbb4bec66884a2d58ac3fc0e16b6e0d2292caccb3541f39b7fd6098100000000000000000000000000000000000f3bcfcb0c400d3d06184563204bdee465de167c7d17bea2e2150fe12eb9bc3285f5693b222fcd224181f8d193b7d95f00000000000000000000000000000000028d60b7fc3790aac7f6b3ec32c4be626a2c64c6348fb8a1f39e58ee56b81469e04886ed9be1388958550c02ca9a75b9000000000000000000000000000000000b60ed8052e43e99d3c10a4b97ac3197ee3cc04ad857c5cf4d8ea1df2671084d02fb683f28f5d499910351354d5e6288624ab43047c02e30ba2ec671511d06f869bf736a9866192c5f2eea6c065acea40000000000000000000000000000000002ddb1a9a88e3a0697540cb008bceb075e87e2331f6e9b68f8ffec48752d93cfda5fee121155ad2a142c0ec42808fbc200000000000000000000000000000000144b694018840835fa9c50fdf62c2e32261a8350d2ef074dcf7d016af982316a0c6f9e5d15d29d3a54d8d25aac5534940000000000000000000000000000000010a3765089ada75e9eb61328756ab9ca7b8362cf86cc82af3cf43f390a0745954f28da72a6ea4eb904a040596795639100000000000000000000000000000000056b51dbefab453012b35fb6e06af06ee92e4e84e92a9967b379af760fdca4a3f10f938684a646fd70a2188721c92e98edfdf850c0d3e3903404fe3e0f523cd230cabc45946c4fcb6d0e5e05e388c23500000000000000000000000000000000169effb324d60b71dc7ba975e3d5f18700b34cb9017f482f64be37c4df01fb66ee9eb5870e43649225c9a88a0d499b890000000000000000000000000000000016c7ad9c5f7b65a9423f642d87621a5192d7548e1099d774a99a34dd4ec9623aa1168b9adab092b3cf450f369bcb627600000000000000000000000000000000123b35bbcd791ce0d00148cdb3d35ba39054a7126ca5ad3351fef1437461379ef639896b271276a9561b46e270f7501400000000000000000000000000000000161fca2deb729fc55f1102fb75ff466319f18510fc66d6cf95a8256118fca618682f00318b0a5297be873a2f7af1915afeb34852ce0f3b5730962023418ad6cb860716dcb526dc53e8ab6a74a6a3910b00000000000000000000000000000000073ad8c2f713288313185c3b2455ade93d58e70d5df6b8dfaac8eccd990fca6843778fe42cc8aa6f34ee44aefb49397100000000000000000000000000000000012eb9cf288a366adc58d40c9ea5f2cb5dcc5b04108e3822266ff20eed71f56bd74f1a2727f20d55917adf20b6c4d6a1000000000000000000000000000000001463db177fe5c0dcb899797f89da963731dd4e9e8b2eb77b465b98415dc95f6d5569df51bd2b08a13838f4cca4b62fcc0000000000000000000000000000000009c0bbadad98361209f36eb23a9eeff98f6eafc7d5327fddb6bf43898a2be704520a005b84c5b45c6a68bb7c98d65d6dcf25e64093bd92a8fb394511215a3fa674db86d7329ac5ea70ec77d24d4ac58e0000000000000000000000000000000013c63973ce6549ca3dfe8ea8e3bcd6b0bd88f7c73730834d9ffe2076cd4345090d0364d161ae8998af1048d102f22e5d00000000000000000000000000000000060cd24eea4177c9a5c37038d4cb62aeb709218fa8e64b9084e002f53a0c4c411825812c20df282345bc4a6aabfff6a100000000000000000000000000000000106ea864dd52933be02c1a79cbaf6dc81ae9a2d619bb368c4abc36226104f3b74fadfab906e36d4852a6412315223bdd00000000000000000000000000000000192e45153e4942c88bcce76098fa51782a81b53abddb4c07bd79a2391be68858e2d278969b9fe75bc652d02fe4db1a130b40db4f9e5c27a3208899f4f536880b97f4c69e7d889c0726d87c3fa27e097500000000000000000000000000000000101ca1625e9d4a51e08f5eb81387b361f6445eb307d9bc92acd29d62735d4e5078b1a9b36b94e4ea0a314703a85ac4cd000000000000000000000000000000000f134c460c6d931396a0aa397558975ee973e642f1c4a32a3d397051fe250daf4215ff5ac4b2863d570c87f0e32c8cb800000000000000000000000000000000008eeb127a38104351298ad77481c32bf51bc5d3910b03da0cc34062dd2a8766adba6891cb9fc579672276666e1242730000000000000000000000000000000010c896ecd4bdc1ce010da81a51dac96409079853635e57e5c3a5733956a5f5a9c3ea6838849e286ce0405dd54d7e32d6730bc7f68d8d371d0bc51d95f8a5899249b8db5cba0d21fd88ba6f86d8691659000000000000000000000000000000000be489a1c71246adaa1c1dd6d2ddfae9523fd1d58d00d4f189f56d08632dccc694e63b371db6922a7f3faa05afbf487500000000000000000000000000000000174212b6840a797f0fe9e209b41f55aa5dbf169a2e2ecf05de48c44e608f6cd6d98ff5269e5412defb431caadc8a09c3000000000000000000000000000000000f4501715c0c511703f6236caa82479b3368de430f2c2d95b39193537be0b990fec1ed8e4d94634ee6233cfa359b043d000000000000000000000000000000000f3b4712f95005004d99fd739affc532d2c4c45970316c1a43f76fa9b57f6676c709e8791c276237b92750f5bdc94492ef06360717cfcab15be966cba2836b97deeedd20a52f88c73e2a583b64c8e5f00000000000000000000000000000000003abd36736fec3e8b89863670666365b169d8510090a89007c7ff3a82fc62ed371544013a1444fedc4358e92ceec62470000000000000000000000000000000008229855468fc63f4024938cd6f41c6e6a5653319cb83f38ab7efb9e9d281166261e7c854bfc08f55a0a9ca47e54dd42000000000000000000000000000000000463ccacb341fc5874f6ba2d44efb5cd24e9409b2ce7f43e9d39466288dc833a45988261f45d34332f416a68c5d10ce80000000000000000000000000000000002baa086177394203a04ce1b46415983399e60986531967b690b1a13cf8ae039b56f0a00bf9aff357d51ac57f8fac8b282b7d8b8b9345bf13d0e113b662141f5ebfc5888a5ef8ea06f7d5d137324ebef000000000000000000000000000000000b25a203268100df0510e4155c594a144dbdefbb0ac95e02bb4b3799aee4e738ef4c52f03c6937cdfa7275c28f130778000000000000000000000000000000000c432347a2534e86e90ca346a7b8b40f45075727847fa3ae2f2e297baa14aca88ac6e08342f0d248a92e2c272841fddf00000000000000000000000000000000057ec8099e1e30329762ccf0641b45e1a226f7b66b80644fd551d6fb1f2136afb8e8ab5c6905ffc7c24e67d7f21863e4000000000000000000000000000000000a9e472aa993bea05961affd6782efe8f50d746928efb8fbd328fb50a254db861c90db8df7faa7da8266ceb47fa1a13a2396fe15751bca2c4a651445cef236a865269849908df53551802dd378b892cc00000000000000000000000000000000025484652f18e2b32e2bbe79916c8bad42902db5528fc45993e04daeca008f3c2ff38fe4b48c292f70a7dc57654233400000000000000000000000000000000008e403f472b60a6046fd190544a1d6b249dc97cbd8641c62613f4de0e0fa9f5456d843ece4ac2b9f4ffa2c0278e61829000000000000000000000000000000000824e0b9b03198597fa54252b3df9690df678e9c6d82301848939dc55ab25a7751bcc2b99786cd31960ee7030bf68ac80000000000000000000000000000000018d1d8c7f2b20f0ba66db616322e48ac8f1d6f4205f228ee8ee6cd13d1f64be9af338c11f511859baabea3e15d165fc09a5897c9596223ca4d6628ca1f793a000aa21a739a37faa28637692b754148f80000000000000000000000000000000002845c4255819ec6e97abddf4c9db7d91658dd1d55328ab0565144b377e20ca0743d93fddf68acc985ceb7f7431e30b0000000000000000000000000000000001577a5691f2425e65ffd59071c2bb167ad05a8fe23c11c7f7464764442ebb2f7a75a8d02594d4426c1ff022f7a6e19360000000000000000000000000000000012c6ffefcd3964362f1373348404d04d1849e98ffbef7b5ed5704d74b9550869e30a4df26e74b5304b85c7503f7487f1000000000000000000000000000000000faf3dc42113f27ac27aae36725221d04fb1ab46b59e16277be0758b8fad706fa237c0c7627771d8e8d3ad610f63619bf20a2973faf886556e5329363bd9b9c96424fcf2e953df90bfd011ec07bc66eb00000000000000000000000000000000044de166200ec06bcb88720e57b84cd8f9534d1fe303a26aca08cc35104ffd7e81a6473c08b28037118dd8a61d090e910000000000000000000000000000000000f4325ebaafc67945de2418c81f5da92da4e67866ab5965eff0f392cc527fc34ba4e7e16b91c26aa370b27eb6a07f6b000000000000000000000000000000000e1d77ccc1c196cf1cdf0dabbee4829d56e937372e9f5613e261ca07e19b3fcf10f7a45c490b98b5a64b955eab5c4f2a0000000000000000000000000000000004ba2e81f901b0da1ead004c76d43278d372456c0c0a8c6752597823d44994177734ed3f355aaa22f325ea36b7c9eba1f4ddb773155a27badba330ae5d26096f350e9ca2811feb227c4eee09d2baf32f000000000000000000000000000000000c115e270ffd6f2cb9bbb2a62e04c3bf7be9d7db783d292bed272c297773b39e9e51c75e5c79a6606ff7d0bb9ddd040a000000000000000000000000000000000a57b637126b16b23bdaa6a7cf2346f33778cebdc0c9943eb2985ba5c4114674cd596ecdb6959791139c36c22148ab8300000000000000000000000000000000177c7ed16c29d99d3d98c6facca9cb5ffe72e6aa63959dbb51d9382f0fa49b02a1652a398eb223e093516ebf134448c4000000000000000000000000000000000d6bd518678828f582fbb3b1bef725e66f442c4d3e6325fa571e13db492300d03c0188399a2ef9d5687a76e647873c0f52e4030b5a4bfa767ae20cdea7f464dd2dba51c9c698556d24b8f3d4d1afc82e00000000000000000000000000000000085d4f90336987f99d250067c2331e7de8f09a80d71fef0570ecfd99e409c1f405058bd3461c9f8ac5ccda406db89bca0000000000000000000000000000000015f310660ca6a0c06b458d0b840a5c1c476d5175d9ff6dce6334466d363d319939572a2b00662247be1ed0f4e6676f8b0000000000000000000000000000000011e9352c0f81bd3857806db678bceb2150848f2224ddfc43fb0c733f0689ab4fffde50d5ce04d54055d27d7702e5d2d40000000000000000000000000000000005d835d04dcf4199130d6a16e86cb97f4ccff58c496594b83524dcd88f5570212f06b744379288f2a737c7a82e897cedd32e0429e7934faa526475c5c7fb977c3030ed74e145eba21af2d2cc8461580f000000000000000000000000000000000f7c4e621c37bd3068a972b9d4211abf9026e438ac7f8cb341516f7e6aa4d8bfb3536389e9155029ce9e8d5d376eec1c0000000000000000000000000000000012a46cab2624797513f2acaefa26fb22c4bf29188881690c350593fd1949cbc243c9d1d7d27d9d76aaccd347359a45660000000000000000000000000000000002dc383d4f9b75907f74bace1769bb5bb1b27a597c9548310f2b5f90098596fcce6b5fe0c72bc8be9037fbf31050d74e000000000000000000000000000000001900deff7ddc62ac302c941e1d2a28a4bd2351edd7700042ea4c4a48145ef91688666d8d7de503913ea259f0b58809f21f700d651c67ca5b8d95fad1a8e412befdf691b074956bb8092938bda2ad26940000000000000000000000000000000018ac8048d58f7b1a9407d3101824e3640eb20633f8ffdcc97d43d1b25329a2a1e91added42801c03635ec904e627eb690000000000000000000000000000000000b499fbdbe2ed41dfd6c454796e1ba57021f355a4de8f60964c78dc685e2ffe9c90f5a1f6c9677514ae4a9c95c8d6450000000000000000000000000000000009d10e5e2bb69ea6fd820778f75a2a60627802a49128c3f999d8c1cc2ba56ed18acef354a2e06fbbdfa7e7a4ade7529a00000000000000000000000000000000082839d66a18763656c2ef7196a1d83bd162e1f109b54c5a6095cc7c436e8a4888c4001696958270f54f61b81b00b32d83052a3bd7a13bb1ccc22b9519c7ab12d2dec67924fd9f15f96069de22e7b692", + "Expected": "000000000000000000000000000000001463ac5e269d286961036db48ae33fb868a28b0dd828c3a66592ff9dc115303bdf3ab78a8e1f5df68ed1f3b4c6c3f2440000000000000000000000000000000012c64ca0ac10ab616fc733f75fe6181814e9c204f9e4eb79487ba49e3a9746b9b7916a1d768f2ec573a4c4e226365f48000000000000000000000000000000000a06b5b745dd92adbe1f4cf30c79ce0c48428b3e3b05af1585c4ca12eb2e763ffff46b55a060913e1f77fc9b0b085c9f0000000000000000000000000000000006271931ce9c8b9cabdc932297f3c87128a5af25a9f77e71ea4e588f1e88686638e89a8e212c92f6472692be2e05fa5e", + "Name": "matter_g2_multiexp_55", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000001bf5b74c1ac89d4bab4663943e19128619731e315d2d7b39675f7c43493b338020190a72cc7a6edf0b8838886a7fe6000000000000000000000000000000000713f413bab7919cd57c2de3349394121d6bace3c10df0e41a0ab895433d225b05cdb1587deb93ae6e56ec26a29c39f4000000000000000000000000000000000dfb11c9c0bab7e4d1ee39941d5f6b932ab473567be2329c94bb0b146c46fc1c2cda25dbef8ff9b0066bd4ca3b6da67a0000000000000000000000000000000014e399169243bd619be7f2120b2cae5d19b2f04185aebc7d948007c4d3345a9f45249273b6290c2e86448648868ac552c40774f67a651ad70f17393b386e9ea9e81682ffd78db7fbc17cc5084f3c7052000000000000000000000000000000000a67bca1f8a0b386b2a67158e80262f025b225535a294394584118f9a701e31e91b2c7eb8fc7e28538966b967c139dc400000000000000000000000000000000185e8aaeec9b9abb9f0d6f34e2480e9abc30208eb1c6e023d4986d544b356a387c323c9edb5c52f5a2f0bd59cca7df98000000000000000000000000000000001877ce1ca6e8b30df86de688d950755f2708fd6f933c07ae45fad1b3e43337f1a8454ca5d2a80940e8fee98fffe953a700000000000000000000000000000000117a0ac9d27292f967ff5bff2ebed5d2ddd9f453d6aeadd9106eb52b53447974561b621fdc1d973c055f1cdf824c367bccf1e36e063a5fdd4b735dc18bf07703b80c6b72f987c05641612d7ce73562c00000000000000000000000000000000009fc4e9e816ff495dbfd4f745106fc90c023d95bc64b809801d02dc7cead905177ede5016f537243660e4b7f54a02ea200000000000000000000000000000000180aceb6e9851a11a1e34502897299e7db3e09f4970337612634fd9848d1de2bb3de8ede690ca051a75add5810ff777600000000000000000000000000000000199f3c43d429fe8f73e20f81ea00c4e78294eaaa29fd67563664381db3cee2186b387b880089cf96fb99c2e22c95449d00000000000000000000000000000000040b20ec4e685f104be188d0f15a79f27cf34dd01f813275f6019a9ffac56e234b6c967c80745294d9fa46e0083cdd907ea75dd2f54fa6413ba77f10a11e12abea3a4b947116e1e7c9334a0a37c3963100000000000000000000000000000000189fba635109ca215bf3a09c3e44ad65f7eaf653e0929aed39042e3b9c8b1132c5fe7cfafddfdd0646514aa1f9e7e1c0000000000000000000000000000000000c28f598c80ac262ec7a0e0d1c867e01ef26f182c5df9ea7f88fdf8bcf3a5d2f06128526b1ce72cead8ab4286a0b8d030000000000000000000000000000000008051be3328df43b79dc9040ef0a0263d474acc0edc023f300cdf7c13088d1bb21b5f37ed81b38dcf8718bf6441605f8000000000000000000000000000000000d2d474723c6c246dc59e683be147b1a6bd6e7d3cf12aff7b636802a99954e7a13c9ea429b19833a985ca5649b1a998f6855c61bb7d72b022c16290c6d3ca9c1255cede8e0b827b43e40fbf01840397800000000000000000000000000000000058bf424fd68aac77c42a046f78a55729e6b5b3fcaf436d0d98354b426a95904b55cdffdd9a8892c9f56f170ca8811a600000000000000000000000000000000142c1ded08928fd155b89bcfaf9c8194f4569b4cdeb3bc7286f4dd79e822f5db497768220533b71be8c71d121e557020000000000000000000000000000000000a9c753686534bfcc295eba0a617f86d7f9e78d3fe6d52f26cede97a5b1f107210a757a2d89361645856b7b20e89185a000000000000000000000000000000000f745541841cc4b5352f659c2b7cfa8d51b07f91b0cb8c787b4492bb4b94ea27117695416e2806e57c38d7e565b9eac67fa8503101f392a6c6c27300b6992af3fcc48d47f73db67615a44de883770d4f0000000000000000000000000000000004445d4464b51d6b12f164a49ee3b610f11738d60cfa6e02f8c33b168d9d5db90e6cc558cd12c56069571567d91183a30000000000000000000000000000000009e4b96c2b533a16803a36f8d1f179313b7adbe6c4b90716855474ffb2fbe087df3fc0b4ef14cda7d958efc5c92574ac00000000000000000000000000000000104dff7c859eec61a0ff8e0d831bf9667226d5bdbe298400b4f9e3159a64b1bbc7cb9f4ff9604e3ced40bb0de0455ce300000000000000000000000000000000134bc2461459ed6f0d96aca02b62e3110c2009e1ba7d3258656e9cf97c2a1685faf1f61733ce6ac3af7ef4d73d0b43b1dd947617bcb7ca1c8fda0d49e6d950a84d60230bc2411d42ac32e3651f48524b00000000000000000000000000000000104e5709f8edd71f50eac1770ff1c2b21f5ee8cf5a310fd1201109d1b73cab69913bcfa2d27a8ba16d974e9841586ebd0000000000000000000000000000000003a4bedc6277c61825f6ea1f438c058a1afd494c384689a8479195646888eecc7953b8b8aec849fb5f19a20071261336000000000000000000000000000000000856ee8eafb9b3d25fde7e38da4acec624d1444337b87b0b1a660bf497ff37929b1ef9aed8e1fb0ffc6cacd8f0d1a1a00000000000000000000000000000000011b52192c88264df56de3d7b14372443e25183bb816ea1c0346f15a1f324527ef8531e27aac3112e2a497a0eff0d5485b4cbbc6d537ed2b69c2c32c84f3cea3d2db180b64861859368e98aca32bceea6000000000000000000000000000000000a696c83010719161b6624aa7756e6e84980518416554ac045a93b63c2561a68ca2ff2fd5b6d2d667822ae4e3b3a2ba2000000000000000000000000000000000fb8fdab4f177b0dee52bb5ba615b1d548130deb87b14d05d427984ec148a7a94efc4674804b3660d0f7aae2b49f7b1e0000000000000000000000000000000004914c0359c8e23a7e431e517cb83e5735cb2876e8b53ad45abf1e9eda06e736378ce03ff75002374d47f1bd45b08e8900000000000000000000000000000000139abe340c2d773cc45cfc75c47ff31b2dcdce27ada3e6d6c0823f37e4e693ca30342fe41eb96dde464d14668eb72c5e457bcb8c44a2d9d1facb39ba7ec8ede5d5962b3256d9fc2e68a1ee5a733ccbd100000000000000000000000000000000180345fc01e3fa349c45b1a7fdccde5f9ee70d7d65510e8b4bce654f2541fae7641ad86f9bbc1f02e93e94422433f8b40000000000000000000000000000000006cfe7026cd423be189c5ade8de197aecbc9aefd4cdbbd2aeacda816247ad59ae06a5c49b0e29bf1140f400d46845191000000000000000000000000000000000cc4f240a317ae9ce75b44fae87c92fe9b6de10e1191cdebdcc37ac200957683849d8a957216676db1af51fa0a2a1136000000000000000000000000000000000ba84d595661e5d9bdf9d268a3cc575fbb6b0d469b58b3e43f80694c78f4e9e501c4a4f9c42ee4518ed7189a1c36ca0c19f254dbf75f1c42046343b0060e71302bf6c94ca2fb8aec74fe7a47a3c9c3ff000000000000000000000000000000000fdf7e2372b01b5d926a18ddd06b4573248c02d7debf944312dc06f76ba08a7be460c451d296b71e9e81cf0956b974b80000000000000000000000000000000018326d0e1bfb4a62ab6f772b47ed7188035a62141e6b2eccf53a299028902a172771e8e46c0b1ac4833ab12045922b3600000000000000000000000000000000072107574145c6afdfc7d618f2dba2b8bb01d92007dafd476e4ca62e6053e5e9f2e34243ec2dd16ffdbe3488b925a0f000000000000000000000000000000000070e8491a835ae96087013b0f8da267a7ca5b0a600d71b8c76fee35f41d8b5c1ad82c5170b0e8d1cacfc7b7b13938e96f08cf27a47d89ae6e2ffb27870d613b9ae586857e4ea00670944a2883ba325af0000000000000000000000000000000018f4da37ff63f66d68c875def8c758d9a5adcdc408f0c12b3a60ee4a285e6702b1d5b9326c61f443dc71ae83c7bd21e80000000000000000000000000000000013a665e430141cff62c25577798473a645d20321490bae7689de6ea223a434c7d3b16ad004b24a82e2c62879b2408cf90000000000000000000000000000000011b0108562f53bd47d9f8ada54166854bf758ef3769ca1c3b7b006fec8707107fef0b6c7e59feb727646b74c27ec699600000000000000000000000000000000028799b52107d8965066e2f629b30c0edb490a0f4d0b6cdfff89a9f7763afbe6217bd42c2059042397b6c0443465fdc050aa333bb6b44086fe6211e89cb70b8467eccc228c09aaa1d589cfc24771a11b000000000000000000000000000000000c42cb42e389f32926ef09584516249ae332641b573ed29bc0884feda08d35c1bdc6c3d4a69fa15105de95010c6cc24600000000000000000000000000000000006c57fbf93c7959c562e0f3ef59966c1640c706fd18a6b539dfd711b0ad79643642038954bc866d42d1c04be375b95a00000000000000000000000000000000039ca3ad23b71693e02af36a4abe6ccd0dd4f4aa709f74d900b9fd015a2eaed55bdc2bc0749c995783a7615971e8a1f50000000000000000000000000000000009a08596b29da34466c8a7f46b805f1b6f2e48bbba614d728562981d3d4884de9a3c1980d398eadcf69e90c851d48526d9f7f74a5ccbd01afd985d3259739023cd012cd67fba3a4ab5597e94d8fad43400000000000000000000000000000000123dde5bb9b7ca11da9e08a9489cf07d147492be8041a5ad0b70715147e21d6017a58af23c47d77885a7830cfbbe5e0d0000000000000000000000000000000001527cec3c393d03e74ee8a7b1d6a8b6398945cd284b59a93fade9839863f0af591c287e89b3b45e6048f2f9b518208e0000000000000000000000000000000017ac3a2d9458bbd5f38d584b0fe4b35f3a452e22161564a7582465d2068b3ba4dc5e1e24a996596b1fb553d641996a4e000000000000000000000000000000000ee5ed5610a78dee181750e35a8ab91c001446f04124930c2ed85de74c6167009af45a6cbc3c59c4915334d7853ee12f85c00be7e66e318bed8e66cc41e7fd0593004bbca20f0dbc28efe4441acfc9ae0000000000000000000000000000000014d60c1d436e4486f35ec85bf2655ba6b752a36c86fd9088c0ce46363e75abd636052f876986fa0f4a59152998c0e4a800000000000000000000000000000000083328e38373f1de1049deaba78f568db818b1dc38d981ae92b968134d369ccc399bc3bd55c841755beb484cbbd60f4b000000000000000000000000000000001788850a5508d81df9af1f087356bf8e63b3c8a4e209403c4de7b3adda07684a08f9de6f1f8fd8dd4b2bb9b75be329cf000000000000000000000000000000001506a37d222173f0098f56b7c443e04ffe08b376e1563344e7bf22b1c9df0a1292f70ba51cbe554843fb93a7f535a4aabacef63d90ad11bbdf0c5fa2db2838c238ad3049a3f47b7f67361825efbc6526000000000000000000000000000000000d5f153952defdea9309269bc996a7714deab12e7644f8f8344140fe53034de538aae6c3af7b06687684edcd2c5dd19e0000000000000000000000000000000002da67345153c87ca65012b8703acbe777900953abaedca4770fd893275948d150ca3d6694d58bbbc9e62904448a8d2c0000000000000000000000000000000006e8c95d22f01fd9d56178d754f0892f46166282a27e6b02826478cd39119636e811c03fd835c714a59bd2f7da5ce5e1000000000000000000000000000000000b5ab6233d8dff50648d89cd65793640c06ea784d00aff329e882ae04fb466506cce3fb6c381b4eacef8b5305953f7b6473fa3d16e6431da14b8639d4fe316692db087a167a2c4f07307e770bb9e35ae000000000000000000000000000000000595edc440a5c94506a79f3b3fee818256d7c4185be40c1953b46765b2f925ed16a476b07a267570c727592dfc4a0d8d00000000000000000000000000000000079ad05473fca57f26fd068ed659e4aa4919847dd96e683e7d4b3a731cc9ae0562a693abeea4fd550e644b43b553118500000000000000000000000000000000176a9751dbfe727a442797551254cf904862c4d590892e019a54b72f6a5a124d268777b82e19d557690ccfb81cbe949d00000000000000000000000000000000164ab74c150cd151b70fdd7d63d0404214fc9cdafba3bc642aa798b1c301c287ff6d05ee7b3a3ce997072b8189d54aa62774741f87af1d6942dc4ed79b70b2d706f3db6b6d083eef0475334ef1e2410a", + "Expected": "0000000000000000000000000000000017d73e29f1d555a10272043ac0900e80883c185ff7d087ee7f5a3b762213e658a42d1b4fdd435d1acb9d5587fa7e8243000000000000000000000000000000000ddc440795d0e4308577fe8439d43418641538711972c9744dfc8a4c206c193aa17958404bc387c7c2fa30bc678937f7000000000000000000000000000000000d7e43c0f99adcb02db99974e7615b4ca0de72117792ea515bb04c4bc8680a3fdb0afcf6a3bdfe16bf54c1d7336aa185000000000000000000000000000000000bcec1d7fc9f2210be80e90631810987801fdf60890ce197db041b6a62682fd7e181c6110956c5f5e9c196049e39100f", + "Name": "matter_g2_multiexp_56", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000015425cbb7075a97dfa9409d7b014127396056dee6d4bb63ea285309fd91280fb691f9cb9572b544b332324f6cb3b1276000000000000000000000000000000000c5b9634e6748d5819396051322d9b7e0377554613a7fd8dc0c71cfb7886dc0ac29add7265af84087a9df5ae3799ae30000000000000000000000000000000000534226ad7324ed5600b5438b659c7b1e96f27ee1d77163f2d3073418f7ded5c613ca4b1a686764ecc43ce3388e0c32600000000000000000000000000000000198267e2bd474dc0415f47f5c87a11fe0945a91cc0bfc37d504ac53f9b9b0d087cd5dbc9b03972be03d4b3f9d2123945d10ffdd3797ad13e65a1115cab6529d0f87b91eb41d6265e694eed8f02667214000000000000000000000000000000000389a084d95445af6e0afaef21d3676794e45986b9520035111ccdbac4ddc1b23974a686a900616f878f3a06eec90db500000000000000000000000000000000064c75d1129753b5f399c1a5166a0f6a8f427d65ec2fd84d0c7339218e0a396681797bab68b33653ffb9820a6005fa7500000000000000000000000000000000147e199e8c08b9af38cb457b623d0fff32242b11e695f2adc0f136c5596db313b03c2466fb58e37c94704152e5c8f9dd000000000000000000000000000000000e8fe5436baf3470a19891b85d15486d1269e1b13098d837b0a510e71b0e6260700ea85f0bc6476217cc73615370cf003e5da5568a9427e0cbd7973a34c147ac2f3577d06f68280caecf8588ebf1591a000000000000000000000000000000000a39a2032858a57ccbfb940741f4ae21b318a56d5567cc0088ed52dddf1e0d5de60bd2da9b675212a9a28ec17fca7c0600000000000000000000000000000000039e2a4bb1b417f8a94b02cad60a3e1c4c4bc5a86a23def7cfaecbfd97d89a5104e0cd13870c9fbd010dfec3ad9b1df9000000000000000000000000000000000bc29c5623f9f18ec2af5bc651a65d89554705a349923ee15a9bfb82c114246b404a1dc1c24d65c8749e7c9cf62d963a0000000000000000000000000000000001496d76f7b8583a64c1627151589af876a2f5e7677611ea15f14606538f6052c56e9fc3ed145c313acea69a51547fb6145b5f1f156f3c823cc129568e7602694107608c1f9545edaa897df58d27b18f0000000000000000000000000000000015f83b2f998691e504aa740b4db38f5b0236ece3bc1ca933b79999d55b737bfec51e590c2127d57625a9b7c2960c06280000000000000000000000000000000001b7b117f5d722e320b7e90307ac1423aec5e30c29602d314bac9e5272ad3990d31999bf3f516ac78b2be0e16c0375d8000000000000000000000000000000000fa7992cd7fb679eb5f9f9a9febe9c3cf41a717c8f6fffbab5748572098407174f09457e13468165f1c7275d52f6c84b000000000000000000000000000000000737e95f62aacd12f8aebc288c5cfe052f34c4d16e7b44df4497d9a713b77485fb0efc09aef11c7b86eec4d0cfd9b03ecf6760be82cefac2843265be5fc0fd6d308c1ed06fc684c4693de25372f09ed000000000000000000000000000000000004d48d72ad4e77954ec6a5a62299f0472bc52b556cf3857019f8efdd694758f13029f9d6832ed672cc210f32033da8d0000000000000000000000000000000009b2394755d0319741d131b012ba0ece7e2044def20ae73fe73bcc276af9d807ad75be79202963f9a5c512a6ca53197800000000000000000000000000000000128f856fc4790d9fa68cd2a3c152d675453dd81dd64f0ab084c6dabce456f78c2bab0e7f315439b34f86e8fa61a33ffd00000000000000000000000000000000173dbb908ed617ffffb6aeb212cfe6c03f7ee51c84134fde67de2ad9561a897e28a0efa66257ae0c21ebcee3fe4fa68cd9fca4d166149ac9e6159ce95a06f790a96243662373637f0c6a59764b77b45e000000000000000000000000000000000bb7b84476d4b17f4ada0b6f50d34dfaecd611356862895c8d2fee6707c4aedbf565560d4207e43c179c5cd33cbb739000000000000000000000000000000000112d8b10c775218d318090dfcef55a903953f7466c50417125ec0b2c20a24fb50bd172331c0377d4f47aec99bd87a3fc000000000000000000000000000000000cf4e4b3c600053f45f350c8860e47621f50f3849872a91ab115f71a2b04657991217e2f0844b296d3a6bc33ee66e6a80000000000000000000000000000000008f625da164bc9d96be3e78df63bd1633a2951dbea0b98e359c6317abe6ac5799c4bb00bbc2c5d02048539e753019a6241733039312347a0c9d760c1bb9a1209a34a02b359a9c52a57eddced1575867000000000000000000000000000000000028db057ab9421eefd1fd481c91153b5c1ceb0f2dacb0097298cac986f036572c6ab0c8709325b3bc25bd494bb46c55400000000000000000000000000000000024be09301c9be4f726fbf7796e8336c50897e8534614c25f65c37bcfc6e724d530c2782bf483668fd08e91ad09484af00000000000000000000000000000000037bfdaa11660111ce0a9c3e18b5da74c004cb44882b1aea4173e18d3a17f04fefa3b319afaf4af9dbf3d4b9ddb2c3a00000000000000000000000000000000008f2138bf621237a286229fe762968a224358b030f6c20db58043c13727b516097b42d47781bd0f0df2b155197ca3946b21b18d883ef62084ce4bd353d7434d7e220e9cf6bd0e8d0bed1ad0a4ad94c7e000000000000000000000000000000000b4e2b058d6e77cf95be093375233e5c9c8ee0cb2a3aa93172c08faea111df81b9721a506180b7b45bdde4b58b0b7368000000000000000000000000000000000f7025cc33424a7c11eef47baef888535d938d50c0f40eb83ae86791834770e5dd95b30aebdd2c13eda3447d5730ce3b00000000000000000000000000000000088270ef05480ef8aac5c284358d8e06c3482c26279734b8513000019924cefeb396ae79f5d9bd863bdd9b22e3ac3c54000000000000000000000000000000000df75afafb138fb06bfd905c87035bc5d18c45a29267c3965131083d7e0112e10556d7693d424172a53e8d3120f0cf2aeafb6aa11296facbc13936bd2ba09a2cf9bbd9dab6ec8cc5f73d78c90b471a3000000000000000000000000000000000122fdd3c83c01c7cbe71f54d783181860e7dcf8406e3966e910f4d0ccddae3a245d6b1f94b1182d1917fd63960cd75d400000000000000000000000000000000043592e5797cc1409d6d42dacad628448799b24320acbda83f6ea9d232968efd021058f540e3bd73a7f95761efbb5fc400000000000000000000000000000000025b5a8577ec1064b5c557415a50e84c2302df97eb65860f979e5b1e261f47c0f305461681beb07e521cf03f0e21fd030000000000000000000000000000000017e86f3ffe72bcb71d46661a1537918d52e886e362d78ed756140a6b5083a4eebb5280b9eeb8a25251dec43a5cf509b13d39a61323c07f9f4656a6c5e6ba139da8175ebfb8a641de50cfa2290884662900000000000000000000000000000000122f26b4561d1f79a70bd0e401f25d50891c0fa0320579ef21aeed7c191fe1c75403a09260c3872cf74b798eb1587ebe00000000000000000000000000000000039a261d9f48b9eab6e89046f333ac328cea287993166057e9b99fa8a7d7eb3e7c34ecbb353b7427b235084f47f45d1100000000000000000000000000000000015d5e297317684bd0169c795d9dcd209452d024ef9a450c41beb0f6c7e6dc5fa0f3ae24c7cf2d7eef97bdc51788188d000000000000000000000000000000001487564f0e9d3e0d2d30ec9930a00f10093e29f2f195344f567960be323ca21231efd8528108dbee4d5ae4de3930ddedf6374d0849a4471eca96c5e715b10505c4c49664f341d04705fc688c8479cda4000000000000000000000000000000001965ac3a520c1ac39b86832ecbe226ae0474b76659076ccbb550a0daf41c40d424ceda084dd991f22cc53779085828430000000000000000000000000000000002e970a4248823049bb4339d21583fdce9540ec103d6e9530b89e39ea875b1c333f7f5f859be39baad34b374055baa770000000000000000000000000000000003460eafb3e54ec03fd5cc1d460e1359b97f5543e6231d61614c1225ab7545fae079ac8e65668b83d022031a7a54746b000000000000000000000000000000000321394863e7c70df3934d874613b7c9d6c331e59a599be593c82edb7a26eff9bee8e4befbf122240d2deb2d527bd38c0b7cb52b99abe10d1367f8d3def38221c18657a1114ceaa1c0673ab13a6e10870000000000000000000000000000000001a5eebe200ec041476457f8585cb4ccdda936cca4977d7701c44e0d4fc5d9c206682a23348013a055117028c16914400000000000000000000000000000000003519bd1dea70245e521988336eb41870599a877380c0a9eb19301f9b2caf963eb559070e23eaeefa4de0173bb1fbd8a00000000000000000000000000000000125707f5a8e26b28968dab97ef4654c315b0a118c20935e38a5a526d9ac0a0e18355d8c9f3f58c082de98691957e2d5e0000000000000000000000000000000010b58dd683f73a16d8bd5557b35b7003a761bdf7d90ef576de8acd420bc74f5219fe7f9d35667feeb3ddf1d568b56bf1f49b1fa80a321d4d100069b2c4b94cbda255d8e9f1a7f14ddf4762b76e4a386f00000000000000000000000000000000018267d8b83ca59d4efce7ee3d73f7b984f09556ea4fa5cff5997a1eeeaeb8bdc9185176d77ad0f4d86f2e429f4015350000000000000000000000000000000014114344d6b7c976cdaf2418d7f72c120c2fddcc65c3ead067482e7073e2a3a239af19f862ad247e3181b13f5236d1040000000000000000000000000000000015db961a093b248e83deea0ceeebfc3dd57c7cf8b48cd627c5c566a4f9bea30ff0ef9cab9287a0f520a72b02d9092a0c0000000000000000000000000000000015159439fbfb91d1e24af611563aee3eb498fde666a1014a9f645037995d72dca0ed5569da7ecd084208b7c228e8a2b2ad3625b0839cc1ab8c9798b2e9706ba6d7aa623f3c0ce0985bccb2ee5c05a313000000000000000000000000000000000e1780b32a7b17464cf514efc4bdb02283af396ffcf6d1ae023e07fae02becdcc3c467f89f8edc9173a71aad27b200da000000000000000000000000000000000c3e7fd95dd823338bdf3d82fd46c265a3f794d4065d83873b1aca66da5f80c5962c9dcf537fc315d024d8cab7bed89d000000000000000000000000000000000e4eb722080e24f54fac7eed4b94e7b1eedb081c3edd7aaf5433d00829929d8bdef940aedbdd7dfb0376b3ad5544d9cf00000000000000000000000000000000158c1ff057f7ffe6492097e339cc4ce56bbefd39658ad55e08d5407619d1cbea7c83b977a1583ee48897a5e9c0d9ce3e150e53fb45ba8ce5ca917010f26451220be51141fe21cfc1cc06a5557e8e7afc00000000000000000000000000000000138e8bc8cfaecba9fd1322a3c1682c9fc1286d78e5b6718da00acc69f811fe9f94c9f0dc9d80e9002c0022c6dfcf156a00000000000000000000000000000000021da679a068b2f5f473ceed588f07adc7f485003f7d2286a18c07b09b835881f4ab94c7d4ec742c33a7cf01801116fe0000000000000000000000000000000018a62c2f4a02b73f5a91f503b53332304afc9cd8769f236259789277599a203b8b304b38993835a87d7cc970ad514d2400000000000000000000000000000000179396865f859386df7c1b8fa84c4ee71c14daf695fc0841c293618e6f8c87fb56b924f3f91a273b969e8635d7f90985d69ec73df67feb970f1c7a3880ee84d948eab4d8672a6c1481d61efc6cd710020000000000000000000000000000000004a8cb437297722c0c1a9471ff083ce60ec40c908af4ebb570c87133df705e725e3209152bcff26a0d6e4602030610d3000000000000000000000000000000001832e55a9e703d727156e4677ef4f82b86c6764123c3ed1dd94ae3b46d7eed459114993968eaf8e21cf24c59d042f41d000000000000000000000000000000000f606d5ee57b188636334ad60057cec4008ace88f14ea06324edaecb26da627670b44b6ac57b9fa2717d03096010785300000000000000000000000000000000145bf70f90a9d98f56ed38b3506556a48a1340ca6161806d055d7a1382eed54e294564de7fdbf525b0012de3d25ab5c838f8acba4782dfbc02a14d4b1d7b2b0a582f9bd75642169707a475b1a7d2d7e0", + "Expected": "0000000000000000000000000000000018ca453b9d832f029ac8c7c70df846be97b530e6e42de3ba6943a7d0dc00296942f88eba6a9cc3352900ff124efaf7d90000000000000000000000000000000002e4514102aa3f772f2659ae9f1e2a91c7fb749ea590a3cea2c1a2e0f7236f71e182374cf7ebd2fa086dd921c29013910000000000000000000000000000000007c025696cdbf403494c5fc7f9a10ad0c549f84d1e06c5c4bb22f7a039486909c540776224bcdaaeb3880ae9d745dbe5000000000000000000000000000000000b5b5b70fae8b3953ee6661a0f4a1be25596839482d78710e584d3bcd93dff2b0bf4c8b20974744667e25fd8353cec0a", + "Name": "matter_g2_multiexp_57", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001265e90c564693db716f17d1a8815a8449e43b5a2d5446ca65160d864718cdfd413d5aa024e7581421c7222c29eb452b00000000000000000000000000000000133a6558baa53a2b8d239198e1dcd81af1ee46d55137177be467a99edf282edcd47b7861a3c822f9bd0df2e86aeb5dc2000000000000000000000000000000000d8287564bcedb1e57c3d74b0d484a9b475ce3f5b0322bda0e980de8891e2e8663abda99744b58032b8d7d3adddbac9500000000000000000000000000000000013cc35410d7fe07eac96abd2b35ff656e17b6b1eba2bd1d75ce5c87c5e76755ef9c2cce70f05cdec15d1bc44bf902d4cacfb05e5d10c41b06a487e9f8afa38759eeb55f0a5bc8640164bbb081c1fd2a00000000000000000000000000000000193f0cd6b4051cfd89f358cf6643528f0f042ae30ba3627d297b4fa2c2936426a9c1b65145b8192f65dfaad1f2fbc358000000000000000000000000000000000a92ca8943e64a391aa39126f093f2b530f556c1e3ea1b55bef1c264909dc93d260eec6420fb7a4e4a45f932d57951500000000000000000000000000000000005c7dc5832f744089d5fe034bc93e0bcca042ddd1b221cdd5958be86214831906ddbf82508dd91dccee467fd1625dd740000000000000000000000000000000011b11b3d24f44bcafbcb9baf62cef3f18b56ded696b73577375dae8108dcfb663d437e4cd9e44b7e6bf49741e058f8cb9a0b88d946231cc484550a87a548719f0a543c0698411f230a966cf602dc4de300000000000000000000000000000000073872ce0d74ea368df132897617aa8f941b67cf3fb395ca6c2f5bb2c551f17d68b0c6ef11e742206d6559796f06426c00000000000000000000000000000000156cc28eece7bed943c8410a44af112edd8576807e25701093eac0c9726f93da68a19c1d7b294f3ae6c84e32e7c2d5ba00000000000000000000000000000000050fe5987d5fa678be3d34c50fa6c5296f883e65ac3201c333b97ec0de00dee6187d2790c357a3f8822a174a534539a900000000000000000000000000000000177fee6e2d3909c0536acdbbdfc716f6ca19b6bfee7920a78ac9725c85114c69cd13152467e72270e35006b3c6caee8c74e3b5ff944bbbbf808f1f469a3380ee7dc37ebecdd8fcdbbd2f2561e0dcd68e000000000000000000000000000000000dd147bec9e0d1727c9d7597dea4a5b6b15c0a603dd1b586835580468148a502289fcc38194b2fccdcd8fdf0d8ec1904000000000000000000000000000000000186501fa4f3a20e80bf297e8ef1885b7d157617701839a3b524d61f35b2eb843ff0af13e253bbdef653a83e07a5871e000000000000000000000000000000000023eda2ed9d34aa253c8bf2f3b66b3c0c2551cc0e74f43dde2e429d9dea113a62572d245b44708bed79d662d9cba487000000000000000000000000000000001041cdaeb244803556e9b20db95f2a66830cbe47a68aea262865da50ab15ba658116657625318fe46fef393eeb6f3e2ec23064970a4ae4ae648a79edb193d98208418d3489e9b5b8517ebe99cc32b4d7000000000000000000000000000000000c27b1feeeb38068ee52b0fa440af2e3bcfd16601c8af983d259f2d15316b513ac3e89069bc141f02b934f2e474253ba00000000000000000000000000000000183f966cdb28f344ccae4cfda63ba6a6f29d00ab942ae7db7572cc09305e4f80c11305527b8ba38c40aae5f23165cf9400000000000000000000000000000000049cf59bbd6c26ab3e25b3cb94878271c73c0b4436573d612311feceed0f1668f4d79aad92360c1c97d60b540239ae630000000000000000000000000000000015f35eb8e4c40cb1297f7128d99b109ca75944c1943abe9158813432145a4a2a5663b55dbabfa48bfd9dd01907e1e8d3972fb60ccab83b6ce042c09ead82fea3d2cb891e21ddc5af7b5d8e334d5a3264000000000000000000000000000000000e5d9a671862733804f517dc9cae2190ef0005f26394e3161fbe771b9a486368871f4b1f10f405e45048362f437238260000000000000000000000000000000008100c6f96ae7af5fc86d9d91fbbefcc1bf5873dacaba9c3adf1b2833dd529d87f303a55e5d4098153377effd0f8114500000000000000000000000000000000010e4863a9b037d4ae6dff827a34be04c7f1627670b40e5cafb1fbca2fbf56af9ea6b24548db58e3119db64553d18cf200000000000000000000000000000000036a298ad5e8b32041a18e3f6c5847eaef20a5b63ddece41bd7dc4c4a54deb9c6d7002e6621aa01d78d64ec9991f68fbdb68c389b94c82f006fdc637696d8085b24897177d2992f504d4bcf5ff04d173000000000000000000000000000000000f62c0bad83c41887bf1ebd2644cef0577d793c2f3d67cbe43974f460a4afaf2e412fbf9ec97404e5e882ca0b23bd1a400000000000000000000000000000000191562ec9ace63ad2aae1f7fa977b9e0606e1da9775a978b2caafada4f6b3d9104562f2055fe037cd06df6093123a08e00000000000000000000000000000000156702c3feef1baf5ba202a25b9dfd5c1fc620e837501b0c5bcb85ec8b6e3e92bad1fc842bd1a0dac363e4bdf0fac87c0000000000000000000000000000000013a4b7e869ed9bdbf9671a5d8ca9145a2e97b6885d2a93b33f378e649e0e576be65bfe849119381057337315363bab2f4510c100005f2306f4b474d3843b4a79d04f0171afc5c66df70f631b0481dd330000000000000000000000000000000000a4b273438168494f0db235f535bf31893bb70f4119dc4741aa3c5e63e93b9a8bc001faaca10e37f36e130ef53853900000000000000000000000000000000010936551b148e16249dd934fcc83dee55279495c2a70d46dfc45945a69549657c3dd7cce00d8136e28d64b0c800344cd00000000000000000000000000000000115c053ac0b68573c3abd5f047b8fcd897e3d514945c5fe6efebf1921563d0079eadf32f7428ecb703d9163bc7811ebf00000000000000000000000000000000162e86af01daf552589b62be849e6176d74fa5da9b214a5cf2285802dbc44f346eaee5cc3d93a085740f74cf7e1b17e1dc682a2be4d67852d119795988c52230d8273648cc176ddc012a4b4da5a8636b000000000000000000000000000000000d77cb5045f7d4578621c76bf5b3db076661c72174508279280de3e92f0aa57057ab50180f0f908561a87d412636d964000000000000000000000000000000001853f9cdccf5e6e4b87231b153ea5257f52ff10dcb24cbaaaa95426d0231dbb355f9c47475d125ec1079b9bf26b23b560000000000000000000000000000000000fab825e06c2329a19de853a05c4bc65f16fa047eadba8e79607bb31b84ed6541b00f7f14b15687d67cb4cae0ef9c600000000000000000000000000000000005deaebb5f31a62fc0bc1af13da63d0af3c716df8c9bf00f1e831af5882b88974c49e8d35db2545747c85ac35156bb668af6b200fc8e6a57a954226d9a0254c8bcbbc55fd6c3db5cf8532323d4c50b4b0000000000000000000000000000000016faa5e91048badedcb33e83684d2670051c82b7a1d0ead0e28f4dddccb141a8ed1fa7606e4b6a3a893c55344263eb4400000000000000000000000000000000019b2c8758abe5d339afade4ad0c1d44d651f185f8a0030b81b136d5972510b353d43cef616ce04827d56255419831a400000000000000000000000000000000124b1e87f343a890fd690e384cd156da57f4f0fc5b1ca99c73bb0571332ec4c12d3ebe955e3ae792efadc1d5c0c67a410000000000000000000000000000000014cef10e4a9a41bf117aacd2fca5f1364a46b0c4aa0723a369fc6ede09dc76dcd8cb67fdf87ac49bd4bd9981a2e589647e2036f73e8cd5e42ad86914e192dd969465aed0c3b752986b84a0c2444c90b80000000000000000000000000000000002862fd5f38154dd452f65de0d3c1d54403cdd2a397ef416fb92e570913c543d3368a95fa114fcf48c3bb4b68895ba33000000000000000000000000000000000e7185443e5dbb656fcb9ed100949f8f7052ee2cdcba4f5c687a65a1b45bf66ede5c60b0c04845b9a870e004f8af8450000000000000000000000000000000001817be6d13cf2a67225b2eaf073e9f1614f3bd32cf5572766ace4a91f6b6be56f498b989f1c3dd3dbc9a819c029431dc0000000000000000000000000000000001cf41fe428b088a17b8ea93a653677705d5c024db530b8300752c6b100f2abe4c46dfc24afdaa2b3d53cd8ce0df1b6a70cd5c1545e76027c389645da1089fa88f675b5b6ef9217b584d7202b797f8520000000000000000000000000000000002eed272430ca3176988272e6157a18df7151bbfed5b90979752a02619ef467af8083208dcc9c7d926490b1283baa21f000000000000000000000000000000000a644f6137bde232c3a909b742d30bba096ef88b711ef100144276d0944487f9ebe8331483978a47c07d3a42c441310900000000000000000000000000000000042c67cdc10efa8301ae95d6d4f21cf152f04b235bad2dc5a61724cba64083f690b3158676ee6ef10f52dcc7061f7c7d0000000000000000000000000000000007018d0aed5abb744cb998f84140331fb2cef8d9e09c76176def48a85370c6247c2ac6fc726eea891b2041ad5edca7f0244041bcfc21ede8023ad80b6d4af4b2777c0204ca5f61854e6da34ff5e1145f00000000000000000000000000000000141c0edc966b7c845d4e68272c6a71f8ffb7fd8d56b7cabcd556a98422f830d7a81d123d701ce1479e84047328ac1f3100000000000000000000000000000000105c1164d721b6dfb05b6b69955b2f25db0e9fdb58600a3229dd516076087aaec05b837ade68bd2a19917eee7b9a22bb000000000000000000000000000000000da3dd97e693948fd6955ae52d493b3a2d2896dd4ad00a0b549d4d392e81593472e4f9435a8b7977f3d58e324c5b9af800000000000000000000000000000000068c531ddb26a2299cc584b5bbfb0235fd774a2447134c06e7de8b94993804958bbf1ee80728cc6db647e8a244462372ad7572da641373708bef008057aa5af1cc76ccb882bacc50a77b37d7047b1bf3000000000000000000000000000000001881432f4742dbe41bf774930413c98d49a781a48d6c64ee1a18f3076bc6c0e1214f92d5bc84ac65ee1c586c437d697300000000000000000000000000000000067e0a95f3eb826f3efeedc1882ecfa30b8b96c92f626aa324f4044ee74531fbfd50a221b1b0e0182d759d149d51427d00000000000000000000000000000000173f5be7098b756ea84f030e374973feb4f8811118ea6673db1db75ec6909303e571ec5a1d55a6bddf32fc80480cf103000000000000000000000000000000000f28540976a6ddb277df5951fe58e7310861af837cf31fe31c24f7b979f72ef1549372e7ea1ced15b655d24293dade7854b51c78093cafcb57c4c1f172d08257c379a9caeb5b5478cacb4887119a08c600000000000000000000000000000000188f296e218719bb9cabefd4f33d5728a1d280bc59c3d826a0f3b5338f92e6544a4cf36f1a493458e0adb246c01a415a0000000000000000000000000000000007dc8e4222c7ba78190a8e72ec7e6980e2581f51a8d6c41669b6fc9e16d50a2bf4d422af73398e76b2f39705eaf8a6da000000000000000000000000000000000b25a44523323301cc01b50d58726768c2cf61e691203dd34a0ce8d58fe4f72c1c33abfb2a56e0425fa9b7e2fe48e870000000000000000000000000000000000c6f11ea269d9061d2f462ac37401def1b2b28c47b84344d04d1f026add3237d99a586e3fcbae347a4ecb5646c8c569fae3bbf55186a89740af4da6c073d8c0e331542a2c972a49dd3bf65261dda6e49000000000000000000000000000000000c41a02e937f8cacc0be5d9f2d9fff0d6d4302fd252f32145974206463854b3a7d09b3b147cdf2d7536e970dc13613ab0000000000000000000000000000000005f9367f4e31f7e4d6e21664ac13d55f501f5368c1ca77fc439db60e1846861e6c4c3c44909469f88e02cd973499992300000000000000000000000000000000131fe6df7fff97f132bfcba1d2599a862c1feb514a05b4b7b0bccf49e00aaad043edae9346bf726e2eee498dbadf2067000000000000000000000000000000000e59044f0950a741da3881282697f4a1a522b026e493f6009227da4c0a963de622d5e421c30e0023f4118c9a036274f859b43915b15c509ab8930979312dea2ec9cfa9f679b004ee526aa5dbb25759a4", + "Expected": "00000000000000000000000000000000144433ad3afca0a9581e7e87220a4944e26ef2eef6b887ce77d2a2559ced058e7349b36efa66c492cc75b014b3448ef9000000000000000000000000000000000267b90e45d7001edae01fb198d16dd37c43cadcd2ca87bd7cd1f0f65a95148144f5ddfe75d344eb4573c1376aa2728600000000000000000000000000000000050ade28b09b0394b08d128c089808021e4c65dac49d9fb45efb93792a4faf210230b650fc3ce810fb8d11947e9af5060000000000000000000000000000000003b1d7dd7c6d944d16724fd1bbfe0f53b6b50a70e133dc5998c82b51f817f489bfe1e0c361be36fa41f5af7c1577f2ea", + "Name": "matter_g2_multiexp_58", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000a081f037738b0d812da43a907e7c624e331108ffb72104d82725b9c14dec8449f5ba0e8c1a3f1379cad2c3e7aa99f70000000000000000000000000000000000937fb5d8b3c258b7b28555fb59620f114816f0fad46818a5f100bf7dc3332a03d285eda18e31e4047cb2606bc53b20c000000000000000000000000000000001574e355b7570043bf36ecd52f9c4d9ff556146d81a1e9d088444805db9b3b678fb55774865ad34d21022afea2c154590000000000000000000000000000000009f70a5cc658cdab280ed65e13aaa319049b9534a222217a08168047ee2491f25a9d2620c7343a6426bc54a0700bdb4fa53d5989b63ee5f157cc44c684ccc7cb4c74338b12fbfb534ea33db341fa6b460000000000000000000000000000000015a76e89c8938b8a27e4857aaae8c942371b6979605adf774827e9438ef739428fc53b65d32e4e152cbc6a4de42b8bf30000000000000000000000000000000019494030ae0507eeff20b69b4913596c1b9ea6927157945c8295e273707013ef1f2cd08c058f6b469a6c99ad73acc28700000000000000000000000000000000122ea7ac21a27ca7c4b00207538bf561f688429999332c45de7545046acbd6d9e96d31f5f6a00595eeb212918a28d2920000000000000000000000000000000018b023e7da67cb8d9159746bf700f9e151fa60ba8f5a28b3739de005822929cd28c49b9dbb4ca8a10729dd24771730ff4d840680013af06920dd06bacc0ce95cf0cf79e8ccc0b10027f2d28c1d0049980000000000000000000000000000000007811c759634904765029e955c3deca648fba6a9da6433b50a6d2086a59e65811d52d41ed8ff2e9bd63a4c0828bc702c00000000000000000000000000000000182c86cddf5e20697462c829f41c7b49e7976880311b01ed4d12d7174340799f19db0f295263a2617182bfd1b49e0d1b0000000000000000000000000000000011824bc20bd1b27876b4f48aa8fe3063f826b6b2c3dd777fb8999a25d9139f218f6f288955274884ce96ef2dc6d34d120000000000000000000000000000000000dd310d5e141e4eb13380db828caf74f62878959b6b2df998bebf9306965f723fcd4dae7c25bf2f79ece3e8e9b92de61b67d661ebc9008669bb4e5cffef81a32baabd71667a72f1d202ced823f09c740000000000000000000000000000000005667d8c4f8dc3f4aa0021d1026a1d0dd0bc3576c49339262e84d20198fffe33a389d28ab1d782e9d19af761a2f097b40000000000000000000000000000000002803d5ad6393d7072e149f1f2ebf70cd8961ba3bbefd648916a8ac5a5eb893b71bb6015e201dc241537ad5890024239000000000000000000000000000000000122e1d0e0859b04143f23c4d2d2ffec09ca2ce5eaa9429dd0c047032d180bcdb10c106071d9f9701c006e5eb8ef88130000000000000000000000000000000008347a7bdb3b4f381b58ed3a128134c09563b345380ec948943e738347de5b5737540b57c28d00b9d060c60942446617ee495199ebdebda02179432d42d5d9c76eead4d4993cd09a93d46cac997716a5000000000000000000000000000000000b26aaa46a279c482fb395ddb84d5b4c9c70102c336cd565ca9eecf62cb96f59f634adf46af748826590fe65beea752b0000000000000000000000000000000012cc63256a9f73f450e86ee38c54ea78baa5bf87d3bc01320f7fbd85bf11e19f75d787b9b12b8f2c7634368a9023de880000000000000000000000000000000006392fe611835f6fd50229725d71d435f704f78cabd1b5569e1c5a89d4b11f911f0e34ec034369f972a80eb407938b97000000000000000000000000000000000f4ff2d6a991fde9093000d7bd9cecb289383d259346d83bc9bf5389d4c39c82a0e1d7deb84b90ef370e0a19fce28d2b3e038e473d6f965751ebc5f69eea6f37be88cf001de0c4e4b700823d8326f17500000000000000000000000000000000193752c40fa0f466f7c8bd26658f133d0283d2ac3b02eadd27b3e9681329307f91a1512fbc53e537f9e1025a3d68a7ca000000000000000000000000000000001106d751c9e1637f00e51e0be856405e6b69421d81bb30b9b8718cbc9cfdc36c80d2848bab0d5246da84f10b478fe48e000000000000000000000000000000000827a83f28678c4e39c4963e95c2404a70691885788e5457e149c0c45d4e8c74eef55223ed15cd75fad9f7209a6ecaee00000000000000000000000000000000072667f02b781c8e0a75d0ed8f3d55e668ddcc8c61937c80653e240c3a744c961055c782ca41b15211c0f1e1ba800bf5ab2af2590309c9b9177e4f6f0fa06339fa720cf1c9fc7c001785d7145a3c9030000000000000000000000000000000001419629aaf0baf779feca264d0d9846b987506125b0049ebc8b307c4e3ffe00da1284a94a012bfd60456a4a937b2e0e000000000000000000000000000000000119a801bd0a5a1c1b25cebbbcccc7d2bed9baa4995483f4ae94121a8c6cd0c3f90a26234f51590d66cc38b8bef9020d3000000000000000000000000000000001125bd15fd9814ddd15be0997a6961b6f1c05ce7944514371f10c8e5bde271c4b936d6537d91ebed740fbefe6b281a0d000000000000000000000000000000000982a2904a524b1fafc50d540506b8fb07c3b4978310bf3cf53ce570b1b05e746981bcfc06d59a78d170573b09347f3fc9551f12084ad7d4ce346f841fef785d644821b5c2d3c8db3145fc26e65666bc000000000000000000000000000000000b1da333e508ec6b0329747fef35cb926d922091d4a45eab7cb5358f20496c66e17e46874ed9600cf4252432c29aeb07000000000000000000000000000000000c757daad8f3ed7dfd64782548eedfe904f7ef3bcc11eefc4781fb37159d07825a4c9f3fdf9cb3d8f3944277bf25f88c0000000000000000000000000000000011160e21503d6fd61a2ca0212a7d48317186f259a987a17cc3eb04a6d9251736e4a66b739a8f3095684b7d91ce6f79730000000000000000000000000000000007440ec0f9197352a3148f9bb3d3dba9b1d5add903e48b50ef3f6879859b22ea0e31b46ea4ce566930d8853520abdd14ef5823541696ecb88d0c71e00a15282c40d4826220a202be09c47fd6891b93ba00000000000000000000000000000000070ffa4d522df8b9f62aaf36132bb1b857e177280a7b6d3af6bfc79b73ad3848241df18ca7f8993ae3d67005ead9264d000000000000000000000000000000000e32b65bf035bcb11f86c60a334622d2367797d0226761b58a7db8c7324fc4bb498a558eec509c2326fbd0e7bb8d3d19000000000000000000000000000000000dd291a760393c6e962818986727e5ca5d46544dc47eb49dd828c6f74caf0599e88c4293881714c425b0697944faa861000000000000000000000000000000000f7ead0be081467f3371ab92c249cea73dedfefcb6aa16a162c06e30605e104844c3dd194b4a89ad5230f596bef64f19e32d695dd02323d40ac1eb9452cc53376ef941237563b1ee380c9824a565008d000000000000000000000000000000000ca545b53836899e507880329799e4c1a1acc17275f5d71d87b9e41ccd7a090da854f9936254448c988ec772a813bb6e0000000000000000000000000000000016c9b03fd01394560497d6a03add63c034f96744d96a13a4ec92d28719018d1eba1465e4332e53f37f2aec4d93d4ab7f0000000000000000000000000000000007019f5201dce326d5a6a1ebecf3fe50e22335593bc9d3e62256351c591f0a1a577d916055d79c0b4abe191b6b8011fe0000000000000000000000000000000017acbe72fe30c386e463f3e9b35a474b902f6712b30af88ef340e6fc6ec0fe2e606c7e26432c2a4de33a12e35ce41868f5e23ff8acf88d18e53bb31476f10fef288e20e818431f9f0d2ffe1265e8ea8200000000000000000000000000000000057f856ae648279f2b6dd17584e1388e4dfdc9e870db48ee6ef5f58389ccd4ba17e074b79ae12b728c59e2f91bac5709000000000000000000000000000000000e0f39f4beddbf05fd700458448067b52c11e963b22603f10d697d6b6286b1449b1663e032bf7bea48f2051d8ded923f000000000000000000000000000000000022cfadc1dc399ef5f12afe1349d9274cd595a9ab6ef7ffdd68f8bd2d170a4a783ce0a7303878d809a16bb8073d79860000000000000000000000000000000007e301565124eb66d59a70897f2ac356e7b0c1bfd4e3b57e508ba0cb5c9c881f9de86b91fd5133aa2977c8e81138d66971927817449ba5f053d0ed1e567b53b1179c6b62a554c8be6764d7ce203f74e4000000000000000000000000000000000edf3fdbfb03bc07871079aa4aade538a97e1619b54d0692a7f5f73d7fbc8abbf680ea3a99325e03c0501ef174deedd1000000000000000000000000000000000b8c1b5d3c926d7da6e0583f67d981af5286a04429e857b0aa4b1120604f9c8c93f04e763da169137416dc9ec4839a910000000000000000000000000000000006ca2aa4c7109f043da9cd90bc801404685db802eb8bc925d9d098e7af3d9f95ca490790b2b1c77995c050aaebb935db0000000000000000000000000000000001f40a2090b63f94f93e8b61b5ba1ac62a37548342ad81a9bd99ce8339435a7d7477c3b9cee9b531a1ecdc85a72041555ce5d6f0e44a20d0a0e2f1cc523455b001dbeef772d84b2599daec66b285027f00000000000000000000000000000000021464dded318cfa86db1e4329f302bbeca7095d910c4260799cd2a60ebb20e60152868e67a48b86f44000f267d11c33000000000000000000000000000000000ae45fa46fc8e043c3df99bc0d87ffc5867208fde0eaeda782230341a8624b101346f35fa24e1dd67ab200f5d6fbc8a7000000000000000000000000000000000795b9afedbb128a46c1eb25c52a71375903adf7d3520535372d9af5023dadb1dfefdcc0cb546e9d218890123252946d000000000000000000000000000000001852511855bb368cec51c54d95b430259f05dba6bae53b5c42d69f31371c30cb611037fbd81393a896cbdb6240114549d37f7bca1a59f65982294755ddf8af7f1c953b6e482fee854e0d89e9b269e0e900000000000000000000000000000000113b883c6bc41b0673145bfeccda414af45efe5710f436977712e7227f38911cbae851dbe03928f38e310033458eed72000000000000000000000000000000000853e32773ef1f95a3936aacbca50cdd5eed3d08dc467d7ee834487e445fbdaeddb0df394bd0c91fdb06d2883c4dadd60000000000000000000000000000000013a7f9cdebb2ec37fad172d31a717f4b538a8ee74432c5a5e6410460eaaa3b5f24d223b76bde4277097e93087b7136330000000000000000000000000000000003d6f141b56e1e2e400fe821524017cd972678a7d64f660c313e6a8910b72b5ac04328d45945077aa2946931c8dbd11706d0535e3728b9e358d9ea82df4f1137db7a02f79c0cd0dd672e24092bf7f6b40000000000000000000000000000000016adbeb3530f6b451d870b2d8292a01143986cd9890c79a64764383575771b8608ea61beb2de87bc034d3b8a085958be000000000000000000000000000000001125d7cf83239e4341c286fe0c8739e7013b234814b26a079ffbffa329ee4705da81fd12f34f49d821690a11b8f83c5e0000000000000000000000000000000005873dc5c0baf0f3297d884ac7b652c749abd0405b96ba60fe396efa179a79fa55be76924b0690c9a528c605ad4f9e120000000000000000000000000000000000fceec23f479c72e0fea0d10d3394d7121bf1673250cf1ebe72eca60af82f232fbee342e2c8705434394d4e519fbb40f56d6810620e8da932c202628c2fa9f0a9f3fda3aa07c262924aa51685d2c9af0000000000000000000000000000000005ec966cfa28e105f3496f977a2f046fb206a190fce1a6062df0fa1946f274cde9f6fa8a71089af8cc2fbc2b60746cf40000000000000000000000000000000013c77ab66fa92a2411391d366a331a40accd120db1c6a656bdd92858826fcbded296293c13ee189ea3f34635de56732c00000000000000000000000000000000162795b6feaf6a63e6ea2d34f2bff2a4985ad26463b8fac69f8525eb0a005bd377fe7ff4aae820d361592d2d88f98f5c00000000000000000000000000000000044c9d5d3bc0d99693f5a0605ed467cca8b5dc7c7093294d14015b59bfd8ac6bd479b73ed52fd30d8bd891ed971912c571e7f672ad398f5c02c989b475d12ce86e6e242d36784308e56178f2a6a1517c", + "Expected": "000000000000000000000000000000000c3bed2f51a60f9afa6655853ec2f0e9d46bdc1277bfedffc468d9f36cfc7ad9e70365fecc84a5a40d863dcaadabf22a0000000000000000000000000000000008c5894a4f93b02fa1deda8b556798fb7d71f53046ccc305588bfc00b68bdfc34b3f0bf154ce7cb50c9536ad45e65f300000000000000000000000000000000003699501ebb9698e98dc998fcdac54dff895457d2e4e0a0e2d65d275b5798dc016e921bf1f65fec0f284a563aee66ca70000000000000000000000000000000010389c73de7f6d860c972c1f09dd24137c898e92935c45c10565ef3da3406cf521647ef80688f6e799eef4879ca9a6e8", + "Name": "matter_g2_multiexp_59", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000114b9c33bd09899c684e81a5a4e620eefa4e620c01c391a4df5caa75be462ec7ab027a9ae2c31d6643c48e3d75b6ced6000000000000000000000000000000001925084d2a1f537329e23c77b8a820c385ec5e12e4a145888882ec611e99b05b789d79bcab48326db4424309c24d1688000000000000000000000000000000000a1dc78c25cd16211a38bd0c70d24c84da1b83adb219e1b9c06fe6a6669d6e0281a155b4cec32d32751fff653aeef1990000000000000000000000000000000001daa74f19cce1086a87232464ba903938465da5e3e1f9ddc05a4b4dc13f1026e1b07af7254d515d2ad6960ea62dca1f77f9a79850b2fd5a281b22f52de085f12bd34e56808496e1c1388804f534d2da0000000000000000000000000000000018810adf0cc793c21726e9a27b7c558aa16b81af73f22629c478d293208a107fbfed4511d9cbcc25fbc2826bf004e7dc000000000000000000000000000000000356b25cbc7cf65107438125c930dff24b7786cbd7eb744d7f27967619d5cc02799451ac8814782eaf9aa331e6f8dbe7000000000000000000000000000000001164ab32ddbeb11c2c8baf7f311ffb01bcc367395bc7ecbe5642d344a8e879c74a554b3f9e4b6ed7db4ea0f872cf96740000000000000000000000000000000017704b1dfb111807d1f5d90c370a5b2968008a5ee9fd72262b6543c93fa168285c04931198f5195f1abca648722ebdc5630c1fdad9338fa5236f817bada168a737dd3685b327fb59d8a37329920af4cb0000000000000000000000000000000000a336a04a8fd8e18dd9a582da897016983d9beb0fdbcea6c88b7c0640620be52bff32afbe700599e3c08669c457b760000000000000000000000000000000001765fe4faeeb13fc2c007682c031ea7ff2899090e16a9a11959c5c3ae7881a1dd2c6d2b7f5f708a92349a2b0de4b92d5000000000000000000000000000000000e7c57db660133ebeadc2cb2054ab4ed16355466932685d4d11038e1e1f47b0349b68bc4e918dd48ef8e1c5d7cc53f7800000000000000000000000000000000169b629ddd7add588b91d9866a750570dec58662e43409031a5e25f1b2913c5c5a7a7cf666953c99835431f091ab1b140969599bed4899c3c47e1d4081027203c73233536cc6e45aaa78a4f1150a51620000000000000000000000000000000017d03e9855f3bbee719a15208ae24324ebf1879972ac134b027c9e03444a5736863bc55604158e81b38c7fd78ba4bee7000000000000000000000000000000000468f7c5478cc0faab7098dbcc455bf18525b56272c2d02cc1febc1825579a613edc6b455764ffc71c903a0704224a4c00000000000000000000000000000000067104ba5366e7e11bd4d516565d9cdd93d4390f2af3c1ef2ea3b1e84ee8e5c0e0fd8ac11ec9d2553e4cc13b277d473e0000000000000000000000000000000012e10495ba15b29c669cb9683b2fc7a45fe7ddba743b4a39677fbf85aa738480eb9da967eee69b02ef14137e102e240eddd438de35651328de7183dd38820ea2983488ba31d401094e59cacfcd1d031900000000000000000000000000000000078f8c17427847ddaa1665d206866231a5f36d3a7b4e8fa13910161566163006b5aa5d9696f423d0c44195de65326f21000000000000000000000000000000001613c465b65940f43c61b5e3c93313ae49d92728518d9cdfc57b49d6924479b70e281e724e04fa5f165b5999f1c1ed3100000000000000000000000000000000031741b6830c16d730619457d42767a51037fb4118e00bfd6cfcd8baea35ae76a5159bf1f4639fc2951f0b57446110e70000000000000000000000000000000011a618ffbafe4bad0a435d04084233495e5f7fbeaeb66d0d49a8177f562329b52a5ed4fdc680b791f273a7b0d3d4b349191f2b2cc76d848e456d07c84c0826a8861981dc84bdc671bc9b5882d387a41a00000000000000000000000000000000043c09eea638e524661c60ae3704fd1c18c46443ae134a0ab7b9a98cd398377febd9026c28b3e1e50de98766aaf0083600000000000000000000000000000000105918aa1476cf52f91b9ddb7c23ac18af3bd5269dbafc369713687010720affed6b12af9414cecd521cf0c7f5416c350000000000000000000000000000000019ab4a3eca904a15782f560bbbc8819dc09275f1f6d7c3b8e98aa0a96ec33dcb528284636b0f42ad0d503489d17161ff000000000000000000000000000000000a2abada18e79c548d5829991a65491ebcfe0e1a2c89a1e05f06a0ecd197797c5ffea0ae90b61f54c6b3fc844e0eb3ddaa76094782d0c06f2080d699b81aa04a60891046e0053d2fa757c7029df8f848000000000000000000000000000000000d457cb2c77acc8ba4b19ade0c724a2b6b0966ecfbbec8cbea745439b9bb7f3dde2febf9fcd6c5e6139fd7175e57b1720000000000000000000000000000000003154466283addb0d0b5d86a9633f8300960cbe8bf6a1405a3a040472542e9da63fd4f79a43d641a47c2b69a31298d3c0000000000000000000000000000000006599794823797f8ccea9daf0459b9d26e0d207f5fb95383c6b61eba38516b272e8ae6ddff2a9fa791e69c0eb25f3e470000000000000000000000000000000018be316bbe0416ad7deced1486d4e31490f5dc7e379c17542b7d3e9dc77bbae9c992e657c884db320cd51c2141a4abd2049a751a406657dacceb3721461417571a0104e11c1e00805becf71ee77eadf10000000000000000000000000000000007ba1ec5293d169b88ca4d2d92eacd51f0b8cffdb403632ea8ffdebc37f3997baf736771231335d12717cb45b51be31a0000000000000000000000000000000013505cc24222fb2ba9e25f5f3497653462f5b10bdd0dc88f9b16d5643a99ddd4a7749dfa6b566f41cd2da7c2b1ae93d2000000000000000000000000000000001465fdced698ca76d5faaa7e4faf1260cd5c4fd2939b16d3593e3588c92de3d003540ec989be9632fdba4ecae889ef180000000000000000000000000000000013a20cecd5e8f161ac70e40b8e9ca4c23e2b267690a3abea941c293b03acbbe4fc68a1e7b6d35b79ac46f65edde73a3e0502d56084d1be7179fb735e233978a5a3c2756d780cc0ea6a8aa92b1d1f7c4f000000000000000000000000000000001936436783f02f3a5307bfc0bd8c0a00ed8013508a440d040ed4f45b37a4e89986102964a328e93fabde6d9dc7ca424900000000000000000000000000000000000f16408b869303181b4b4877b554353b26a7b4750b711f3c41cc4b6682b2113cc772cf9bfcd0cf60e59ef29a5d0814000000000000000000000000000000000d5880e2ef94663ead736687ee725f7ce98fdc594230c1ac9e8345d39754bd616e261076aa5362776a6026129bff105c0000000000000000000000000000000006865ce3cdb5081e86535beb990d95ec3d75f67c7e881306607e4876c42714d627f8d548849aece4382d1c8f2b693bdc9787a6720b8db1b4f0e1d535833ed20b519a0e4d2e9fef75022aafef523713750000000000000000000000000000000016d941b6a0dc023fa2699c836b74e16c31b4cd51538f73fbb271d163519d4de1cb0f6ec2f8efde22c74ffb532c576b16000000000000000000000000000000000d10a7bfe9541a7b22d455f1b68cfe2422a83a070d93476aa0844670f02aecb36e9f41b9d66e8e9d0d67c0ba85c99f44000000000000000000000000000000000d7873f96d45fa8c9ba9cb4913a7b01c8e38876b6bb2a05506d23df0491bcffb42983ef663db85bc3cf755f476291a79000000000000000000000000000000000c22fdb83f9991c85b3577d1ed5a171f28460d79dbc6167b0c30b200235c512f999066eb1fa449115aab55128f8f2dde10b47b662e8cc8dd005bdc81dc6d98d0eb98f86b46c0c8f24481af9120e84a820000000000000000000000000000000010faf9cb9d0fcb487c9e86a2d2123105baa8691d82ebae8f5bb7d5ae7b7d8154837120eea86dfcd35ea5482a7ebf7f8a0000000000000000000000000000000014e40640eb6e8e38651a2eac05165f6cf5e0178b3711f34828766ff9db951e1348f0cdc652a78840dc24ada8b1c835c600000000000000000000000000000000129db7482ec62873591018a8399a8c5e4bf00e8bd9dd78dfa3d0b4cd1d93ce5ec7531e56d58b7a1cb3e58f062f6895ee000000000000000000000000000000000d8db3b54b6e71497faed107b31f5e44f328780cf01c62cb5ca00f99f10385ebb22a367cc89505640d1106a9ceec98c4072460e3c5349c8fec9944dc99762625262e84c70f10d0a92077a351335127470000000000000000000000000000000011ae9bc3ce04df2add17e57f260a72f88f19a1e44b0b074cccb7fd547035038d19e5f2228db46843343a69823decda370000000000000000000000000000000015ea64b6147ef76212bb5223d6d5ab9ca866799365683720866d8ce1117f60bd552a8e9981c095894258ca3c1bb5150500000000000000000000000000000000173bd5cb455b80b78951b15180fa7f8fb4725c1a12e5c53df1b9b31b45a29083e66c7116741d9aa93448c81b5e6014610000000000000000000000000000000007eba059855ab058c2066c643ef5268c864d09ec9962537d65a1686322c374eb5ab8eba4c4260ad0919dc18b4289a694f3177c4d865caebf1ef6565bc85e0b0bd51365a6f321e26b97cce887bc3f44d6000000000000000000000000000000001598471460ae082c2e2568602c99923193c913b9e803cbb7a4503ceff369e8c4bb3a19ad245c08192e12a2e9b3e75c4e0000000000000000000000000000000013b289bec9d97c529382388f7037749c10a64f915746d23d8f37e15db9dcb173b3a6d00bf45e67b8c70959472148321d00000000000000000000000000000000094a99f9b031a51b7d54f7b8865621b204c85d23fd66fe8ce007f0b852f8b5b895010745b2fc469abb670e38fbc41e50000000000000000000000000000000000e36daddab2134f65696ede36c50f90f9a1c56165e09243cd56fd3d9902d3c78cd85e7028f6dd466f6a8655da62ecefd393654ef7ad8687c8878c55a8240ae9df04805d3e2f194e960d5e498ae3ca17700000000000000000000000000000000050a818ce247367e8b57673d205d6bff8c650bcab7bf794dd32494669eff865fd4e05d7b4d35eb579eb475a3a0320ff80000000000000000000000000000000017ae5d612bdd46e1351dd1367c08c16ceb002a29832eba75e48d4c82e364f17c58525ee653a0940955b874da6a5bcfcf000000000000000000000000000000000eb2075367b42a0b3dfa30799ce1ab327eb583316d15b8cae21b716e6c7fd8cab96c67bc39e353f5e842e74995356c070000000000000000000000000000000018ca4b533da1baab37f05afc3ae0afe976e4f4530401d2f97176f5c73de3eaa75b8a34e8c6c0543ca0a08aeed28e478bdb9f942124a381b150f00a59e4579d0a2b7b728f62715633288fd03d01dd12dd000000000000000000000000000000000b3f4bfec920018663bb39c5520491da5c538f82138f03390c768e088bbb2880287196af937f1f70e215edd49d1872ea000000000000000000000000000000000037e7607a60cf235d8e4ecbe69d378dc02f0a8e40b7f23745e15a73fdcfc971cc8707d55a8c5b91d9a5f42c2f49c455000000000000000000000000000000000467df75c2703ccff1a01fa5bdebde210b61b5f3fa33e76e55be5dc953f4758c3a2c499cbd42b256ff5a2005949d9bbf00000000000000000000000000000000010d574c69050ce9e909dc23a76e9a2106870e8d8ce2a0e30d42cbfeea56ce3167535a9af1d453d4d8e6a450eff870638e6eb65778a328cf899f66581ac7a4a89e0e824c15573bc68c02cdaad89cdf24000000000000000000000000000000000907fb825f247c85d93fca36dcede9c22a409fa82fcf540593e8247c17875a1385fe009f0ff43853c404f6c96e2809ce0000000000000000000000000000000012bff10bd4162207870f6363342f2541804adc6a4e3f7b8be51d361be34def7a85fb39357c85a4e8df670fe39233bed00000000000000000000000000000000014f7e61ccd52bbf6d050c9d506751e03c8771b320872179a9f0161ac5736edc13bc133bda6239abba1ae09bd6c16f0c3000000000000000000000000000000000ca78624563584f8929d72668da70218a2da12b42c4b894108e6b103201372554fdd6b3bbbf2d94a9d0cf4053eb07d460940e3620c59504062e4e98b5d4c8cbccdb017c47a094d06253743c29465731c", + "Expected": "000000000000000000000000000000000de8e87899b294575392d523ff6e153a7c2038302ac74574bfae7fb222558f2b4c9556be1bc2757b83ebc180ae710187000000000000000000000000000000001881c7688debe3ff795788c90397c3fe3d6d9f56da9221778d7b12f5a54d8c0a00e1a8d4bb9c0b1d578dff862516b5dc0000000000000000000000000000000014cdfdffbb956a20d8521ccdb214adab14975d22ffbac107b2c15f42e97bb823c6a3945a5b299d3226e2044e64f8d1ed000000000000000000000000000000000eb769b301cb7c0c976623badda4db8ccb18dc7322472b5fdb969393d5d82b3ce94bfa59dae06ece424bfcb88e24207a", + "Name": "matter_g2_multiexp_60", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000164227fbb787b2d47ceea93faf1cf7890f48107ffae3628192235aa57658d9a2861db13fec0e58c347571c2ab0cd11ea0000000000000000000000000000000015478417b6758826b1d6fe0c562d43451e289dd50de31ef365ec70faf961ebb65b510c4788b6c7da2dda9cf56d3c8a74000000000000000000000000000000000f9e50d802ca8cbf80caec6489fbb24a2761db1245d9f7e820e6747bdd0855902ff211c427c00157ed9b1bffdf39eea900000000000000000000000000000000128f69ef5dbea5f80dbb9558a25f133b9ad77492250e0654f8fa5b55266f2fd26826a5c373afcd74990ebf768d6d8fd20f2f697ef6783390724e04b81d0e18dde6533eea9f72c1e10bc72c7b954659660000000000000000000000000000000005f7cfb31492dacae51caf4036d99d917fa13b0d2353bbce4e6547ea744b3a49b162deac2f107149ebc2f79e74828f720000000000000000000000000000000015ed4627efa9b318cbb52f518b734327f5d1cfbb097adc6184c5034620504181a298ac7e52759586dae2e107f121a9b600000000000000000000000000000000023e832638849599d9d7854d3ae18648e67e8938ebf606a7c86c3a7ea21cab8d4dd5d9cda5c482e05d351ea3ccd854710000000000000000000000000000000001849665396bc36d0301f4c9adbce81fd2f2d0c7f89925487d91a25c6bd0730ce31678694a319666cf42162608ef15a834680b934e67bd7518f0d6a3a809dc7faf845eb71d0247291d61053d5cbe0ba20000000000000000000000000000000012c9b607e29e35f260f3c4617b4217d5dbc6953eaeffaaa903710195e080d593972e7794897eb176aae3539401a483b10000000000000000000000000000000019cdae8d1d9035d1fc4b4db09e7da3c20d3b8777523155d407cc6565a71a6c951eca609d328ddbb165c2b5a3e6b081da0000000000000000000000000000000009c4629b67c1c50e5fcf316136bc645e9e62ffadac8495c084f97e32b0a3990b3b1019261f78de576ff7ffc89e36e2af00000000000000000000000000000000070a49e8892c5b523f5914e2341dde63127b694eef556de6dcff603da109a53b342363d9a854dda3d2833e25afd5b57eefc024dbceb522c02b88810ada9a814bfd085fb63d570663a64bc0658e5ad0220000000000000000000000000000000018d3c9259f70312c803dd6bac6488541f92482f7eb61ead71fa42bd5e2cca9338218d62835051bd308799beeed3b422b0000000000000000000000000000000005e0da6859601b6ada82b1826a455a846f8b4e54d9f22c3c639835a8a89e17ea2d76e2f49fb151f519de3e9adb78f0590000000000000000000000000000000010113d2fdc1e8ce0027b651cee6f9f6832b531d843db3ef7bf209aa00018715c1c42c68a82c53247a267929ea3c9363f000000000000000000000000000000000e7d1152af6448aca78aa7983013395f0dfc298848d86def6f017780e9cb144bbb21540a14a4d47b61d7a9b8c62376fc2c136f00c97a515076f6a0b63faf7e378f2cf04f8a90ac942fd70e25e683cbe70000000000000000000000000000000014125c81d4d7a8ea18004d798311f0d80c41c8e3a08366f686145e867192bbb13244f9f77217559cae72a150faba12a6000000000000000000000000000000000fdcaaf79c0607ebe9c8ca309d29d32284f3567a18dbbd23da9d96bad7269395ec2445d153711df4c883e8e7f7b02ab2000000000000000000000000000000000d34dd6636ef18b14f011fbeb62d33ec4358166f96f38a54c36b8797b51c1bedafa43d9f51fa4afcc2acc0cdd991997f00000000000000000000000000000000017337fab49d545caba55b763c23ce9bb3d3cc475f5ca37a15322e94c37825fc800cc7ee67bdcac66f9b5c22b03bf6558b033f2270ad2416d03dedd4bafb78ddc598810768fafd349a42438923ddfc930000000000000000000000000000000013434d32deb96edafc9a0e855281970b7c748c92b3472b34cc758dc3c17c4e6fdcf3190c910fa54a0259ef8bec75a3b300000000000000000000000000000000137df92ec14dd2fc02c0ec15a4e63547492154b4d4809e25f3ebbf24fe84255babfd6949770ba61637cc67e8ff299a2b0000000000000000000000000000000012fb20ef106e8cf3c79173e15dcdddb216c25a4de6797e411fd11d5632aef1304b36f8135c915c8c38caa2d778788f060000000000000000000000000000000014ef5cbe5711a815b9ff845e9201745f4117149b54ea3c6d1606060a192d513aa8ffe73425e37a42537773796b6fac8f202d0d506bbcd56c92bfc6fbab36bc96716de1af02aa166e7db2e2a0a4c19cd7000000000000000000000000000000000b1581a5def94e95e565bfd402cb84f2f21c181639c047d8f91044da84bb7854f5cb4eb3a6cdeb66569d99410ca3ec6c000000000000000000000000000000000d8029828f4ca245cafa7f396c25592ef08f6768e1a5b806450be6ca5b548cfb212d8c4787c3f15fe922f466dbe518c0000000000000000000000000000000000f51e01a044b6da437e3850349476437e4ff8b94fa190387099b17e6462040918cb2eba3b10d6044ff2123242005bd6f000000000000000000000000000000000991201229a856f88348381e1f2e282f0487e7daf1e5a4ac3854e66fa3d1303e3c20eb9eca605859e7d46dcfdd7615cc8329762dde1c4c91043a740a8b9639e83e809f749fc8c4853966cb2ea520620a00000000000000000000000000000000011f1bff5df413ade311b0bc3b46c4ecb11e386b886b71226987f14bc1a3a4b986412c2bfe8a4618ad5d70afacf4a3b4000000000000000000000000000000001972f49fa8b36d11d9c9d4ed6197261506b892ce6dfa932b87e686cb197560dfb8718aa413c38ee1bb771a5618c17224000000000000000000000000000000000e563bd240f5e18b518a792750c00aa5dfbea1f79b80a71369238ef15df9885d341d6901fb9168a2e74249f036e9a688000000000000000000000000000000000670e59ebf6e30b458ea505075840ed5348563efd536c31003d8d0bafdacfec7ba1ed401c616a3bab431a0fa71bb6188ea46572fdb37fe282203172c147715bf0a16e02a62bc79f33cbfe36703c95a7300000000000000000000000000000000071319574a93739586eda876ffd3be5d982e6fa04f5667873dfabfab83ddf603513394e0dbb9f418e725b02d2dc7b876000000000000000000000000000000000c6a8e0261da2ab499bf9a639a6e261e8c479f3f2b2d12992b41a3267e034c25373d4da4645626e6343e867466bf3626000000000000000000000000000000000045a0312dd5fccdd19edb65e24d5ba50e44689a9748ed9ec208320bd9eddf8d606b9340cd34ebf983e69a65c242fed900000000000000000000000000000000090b3dbebc7dd49e9f764e99c43b5915b67bdebd00d22c80e36e08873e5c5186bcd082dbce94f4f230b237d60cab7107b9e49472b9b74cefe5a951febe595b0020c43fd54150445fcdc4292c5ffe65f60000000000000000000000000000000007b04063dc315025b8545cef11be6b601fb4ae02597d75979b4946f3872764ffdbfd309f5ab3b36fe47b810f8320c1b40000000000000000000000000000000009361927d02192433a8d3c3d7871d76c6d88361774913067d16b68625aaa60f5a4ca19b6fd4140a5a11f92dec57d783e0000000000000000000000000000000012501f19b73fc6ddb4d194895e5cc2b89ca84defb7ae94f3170f25417965102fc195f38dfb7a2d88aa4b24e4a2fcaa4300000000000000000000000000000000141d0a0be60c32247f6cb0e0114251ac68c90fd43651d58c3108c728601ad6efc27c27a331a2f086d55aed54b3585fd1b6bfa1ec877010aeab030b96e80d2e27b45a93c6a99e2aeb3ccef22527c6e47200000000000000000000000000000000043f74a82ebfbbcf4abf3fd02eaa4483108a3446c9cf041bc67f5078d1774308ddcb3f918d7999d1e2c0876177cab6790000000000000000000000000000000000da7d4fa72dabb314ad8f68b61fcfa38627d1d7719bc07767f596671c58cca16e005d36e42413d03da3c643eb46b1eb0000000000000000000000000000000019f3f8f1a4008f9db1b604373d3566ae7c14a9147f80597a31839b83f0f8dcdfd829f7fa933fef3499b671867c3121fc0000000000000000000000000000000018bba4bfcf7629fcfa47935e36462cef4fa3751c7affa2ee2cb2fe3e3532d46ca1d247393ea190fb3f48077270d6a8b22810705458845232e851b33fdbcaab01966b8ed53b455873a966c1d6b89363890000000000000000000000000000000005a1e0e3a023f67aa7ab0109814f130a05c8c739036b98c70c8a8ddc1828d2cc4e2fcd16de4ef038a7373d15c78e81f10000000000000000000000000000000019e2bb467409b3dfae0b06244b4140de7f75cb105ab897d1ffb999c6b53bf3b60a3d11354815621c5d9f07962a237ffe0000000000000000000000000000000012e745499d5ed626b4762b57923bbfae7f1209408e7ecb8813a545c4ece0ec7c48a4015e0e264b47fa08fa82c39d3a110000000000000000000000000000000008acfd3c2a2e17be41a70ebbd1ca2cff2eda8a359e0969a389ab0a6fa51db5601b386dd035b26232be08d704a02033a7175fa4954e56dabfd1808f93d2686e0b4fd285bcb78b80d15e10e63ea8c7b646000000000000000000000000000000000fb464af51161f9c2758acc09d16754d4d8ac52a37baf2fb6ccd3bca3058bd3cd204de6c8a0bfcce8822f16ecfcd0601000000000000000000000000000000001819075eaa6d9e3f0568ecc2e507370f938a65169cea1ecc40c9cb4d02c83d7964254602e3d041ba0f93c24369fdf3940000000000000000000000000000000016c179832739a8129d2ef184f4d1231d24bc8d4093670a63d73771983152ec322b6a8c954565d61c2af76c4f6ef5e8a2000000000000000000000000000000000f6623578a4fa45614f4b74768adf65a753a35dacc84af005fa4d7328d733a09f12f709a7bb7f89060f60d4fac85780ae7dda7e5373d0e0afc3da1507416f47ea8b467a5b6c2fbde484aec8777ab7559000000000000000000000000000000000189724a2a0723e7727d224ced126e4288f4743f6855b035722f2aa36cf2f0a6fc23f6835c25222b670c15248884451b0000000000000000000000000000000009a57d85140f31ca58e38b4a99c4ef103f0a4af0d5546d416134fa8adce6ecca6588c3c56ba06b2f59015acc1a081099000000000000000000000000000000000dfc67b7644851c3e928ea33aaa0f745a18983edb7488b148736e81ec0c62345c11e3f0dfce729d893dce27ea249860e000000000000000000000000000000001712009a81e06a85a225a46fac056b139c8da05e6b72074ee4079316e490a06f51c62241e380909b86239d867d631be16aa731f9393d2bb32adf04f19884dd1a5e7aa36e46408b847222a153da95aea5000000000000000000000000000000000976746ae4d9325d5e8300b57ce99650f28055b5e020700ee5f124fa76ef3bdb9923101c3a1f46b6985b8203b4e8c60600000000000000000000000000000000057310c3b6cff6c849938f533b401b0cbe10b6ff3736c79a968009b2c0b90708b6b9a98b8e594cce09c579a64ead846d000000000000000000000000000000000d39511e47f33e310332178b8a0210e76e4d4c7408ff5c2374f5e7bde8335525e03897cb3e2bdfe59bb76b21cc6411df0000000000000000000000000000000010c46a621b7fb2e7ceab8943b3371475d3d6f132fb658b8c6bf299888711f1b344ebd4a5793ffe6a7a7eec8c66c80303985f367919b0f3c667b1c1cacedeb0be1f9cb175c899992ef55f14e9b7aa6ad10000000000000000000000000000000011ffff38891ee56cb1fc062d02f6c9993100f991a556445b5ee1b1b0d56d8e64bc6eea4d7f69a6b6dc55ce7d8b4ba300000000000000000000000000000000000d6cdd95d1ab2a11ab424d7aa596cc7e5de025c57217da0da143887d7dccd6fda0addae7c2fd9e0996bdd0d23128e807000000000000000000000000000000000499b3e69214fdb4db7dbecd619ef9c6b5c8343c808e4953f593cc89adba02b5cbc56a5e7a3046c6023c5cf305e54e85000000000000000000000000000000000d267e21606c16479065e47da8e3c058cb59f55a1316a87117a73dbb067ec26f406eba6a40b30ecb00f506bfd3c32f4da3041cc52c6f1bf62dee4c61b1c5e35b72ebff7e8e89b05353388b551eb10010", + "Expected": "000000000000000000000000000000000650fe9f3cb3620e0bf1654a7f1dee503b79fe2218739bad608dba9f1e5330f325b4fb7c340f118eb10dd0776fbfe63c000000000000000000000000000000000bcbf1c6a684dea5ad6c1a540b3525cbc64c7c431f37213bc8b08c8d8915a331c07bc899d3a2ea72a9a4bb2c539cf56b0000000000000000000000000000000008fca1c364333f558c7284afa1be486e84bb035b049a2108b0df99395149de83549de153a784e4df2b0134317c85292b0000000000000000000000000000000002784cc1d11667bbd0759bca35a16a1baf49a21765c6c2c3bcdd4fc9697ef20f1274be5caa0f820d37e843bc38c68957", + "Name": "matter_g2_multiexp_61", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000051646993c3aba532988d7baa07eaabeb8366853436b8b19c0fe3e14ed45fdc65448d749adf745291ab5ee62d4e824880000000000000000000000000000000002cec01290d8e51ccf751183dcad20bac20b8231804a2b6f87f886aacb61d31b14f2335629e97af0ae0546a17a4cca49000000000000000000000000000000000762afa7b94ed580fd07d5141a8e1299c6ec439bbfc6c1a4d695d9aba4ab5d6dec93dc4de47096d72e5ad87d879eea190000000000000000000000000000000014769208ce8a9682c8e0340f68a0290a7782c2b04e3c13027f0b23966eada2ffb2156f6e20539738535fa0ef097f78d6709a2e80dd96eb12edc481e3d58893bd0d789a499d5289072d58c2ea80b036cb000000000000000000000000000000000acc4e3ccc3574285c19d2545839d1da9db6770b078aa399262b7c91a7c41fb4c83fe7dd0aad19f4e3eb2b56273f664f0000000000000000000000000000000017851c99881677b89956fcdf1b8c5ca5dd0997d810f3fb89f7378dbf7964926cfde315f8722531d6d715b4932179eeb40000000000000000000000000000000005e374a4c7118a76e59cdaadebb1c4e635b4dd18665010249f3bc78d559455d27d547856573e264c98ba39f6f3abea69000000000000000000000000000000000a532979cfd5263c774f629027f7624799dd0f9d6a77f675d790a85fccccad6e93c00ff2e5536b8e9a92443af14611e69ff35bc510c86a9e72c3e9c6b49d2abca546f7a62330156ec09c6fe6847a400e00000000000000000000000000000000056f109801b7a4a36fcadbee7219c06ac74e4a3f7b81616076c33ba2a71d7ca0776b596fb25d29992fa26d416272a4b4000000000000000000000000000000000c02d7e6ec50b778a7ff36fbe5751ba32beb1c2024b17bd99b46239e6dd5a708d2fc689e8e8924902e0d80287cdbd6e90000000000000000000000000000000016f18df97f48aba4d1b64e71eb894904d02ee7f6ba425e58f38a08542319e2498cb0dada8dbbb81bb398c9c924ae44270000000000000000000000000000000017dce98b335f536909ce01647aaabb918942ba2468d9a07c5516cfd347e1baa02029d39de1b2602932630e4819f2f00f391dd27628d0808d4a0773509737597230d7849418540e1fe4498fd70d39d16c00000000000000000000000000000000005b23d6f76b8bd4f334e91771383856794d1dc65b365fbc0c94f21fff049761d7379f0d512c42ce13f878e0661712d100000000000000000000000000000000009dcf70c16f524ff540f132b35074cec6ed7dcc1f319432a0dd09b3ded0778ec9ad0f05d67ecf3ebb7947951fc4b25d000000000000000000000000000000001075fb15240d532a9543dc59cb0098cbd03da77c3bf85a0ef8be1560958f8ab57d3777fab5836ba98d67c721a4a8cd460000000000000000000000000000000003511525fcf6fe224eb87b13999d2548b6b8bb8069fd354f298a025b04a33f48be72d8e82a99b9aa34ce5ccdc1f1a59c94f11b10e4c45f15d811e3db4b947ee6414e262965d7b5c23a731b019e63d5130000000000000000000000000000000019039c69d52a66330d2d8572a1308bd88159f0383c041ee7605d0aa86f1d0fe3e884d0a2ad9c72405149b5fd204ec3db000000000000000000000000000000000942163eca08672af3827dbd876b9c1adeefcd5ae74a2768fb55f1e8b342aefbf76bc6546853a2b33e26fa866e60a4e9000000000000000000000000000000000c60c6bd103ba5bb5323b5107373cd8d706038bf5ec2b367a43bab72411523bea35985b974c756184c346626ab2622d30000000000000000000000000000000016c4a2fc8a9b3c54f65cd150c80a3bf70ae8dbacdcd37128514b4a881239023e427f0b0c8984ce219207c458bb380da970f7a0ee05cfc3f63d46a3151c20da53604628bac70d7b521b3be65d7b2abedf0000000000000000000000000000000003e3df9a8ce220be05f15904a3321a6805ab68bbd539479be56b2a870c3d61234e9cda8190bdc89f48e7f0dd9374e1d800000000000000000000000000000000040446db3ec43e3e67dce62efd741a4157e8ea2597a143f7d6273b66c7045daf31f72397b4b9d374328520893157c1f1000000000000000000000000000000000c3a7dde5b02df5f7c1e750a9ee5314a580cc6ed53d326a9157b507ebd6c2da314c37a7f1837f7fcff7e8754ab603b7b0000000000000000000000000000000005e617ca4eced853f8f2e9fdefef810c97eb27d5c8bd06c5b4ea50c03761c01e8adddfe27d2d72eed8cb25ea7514a4aabd991eb5e8ac8ad7cbf8fe64a5889b715a2409305f2366b278adcd2144d7be8c00000000000000000000000000000000104ccaee210aa8196010a6478702a54cb7ba49c80a98ecbf5c0920408ff8b4a7568212bfbf3561b6a7790520bb73bd42000000000000000000000000000000000870ddd51dcc76c8a97ac4b4f23819df48dc8a8798df0450d7a45d273f830c908541dcaab7b066bcd668b289c846ea000000000000000000000000000000000012fdae32b020a346ad5edc3bab360fb5ba55004ef3dfe5f437e841b5dd7284ddb3880051956c8068e49a3fd165143ac50000000000000000000000000000000019081bf768dae314fbecec408d687df5b6ecb32ec24b41f9febd583c05693f80345e6b9d81322ddc72616c1cc39a86811a9caeccc2a2058c2f5a271c09036d73320f9bcb31b7296a796ef94ca4599757000000000000000000000000000000001316b5ce5bcc168d76d2c862230ce604d02cd3d242c51c250bc6b6fe5c380c9e83fe7041049f2272481ab38f44648f4700000000000000000000000000000000079acfc2b9629da9c9f3394874e64aa00527de21e726f02db180f86cc0b9a97138c2c567832e287635721ca40469e00c000000000000000000000000000000000e11807dcd4ac69fdcea71e3e6a93dafc27afedf12c2998dbbb2e4f33e37ea736df73af791eae69bff84f3bb212bab47000000000000000000000000000000000e834a34fb63d9df68d683a26d79ecf8ff67066586e5f760d4468ad196c66d4ebf8605ebfbb7bde201f47b35cfde3a5d8ed4eec02c2af286ae19ad5f05642587cb9ad93196756d269c783a11f23393bd000000000000000000000000000000000990f115519d2125d47b925b613edc3303110e9040fa705211e0d772edb2e0f7f88ce521d1738a5f65c9d158e9d360c2000000000000000000000000000000000bb951a16decf9be8381d0c88726b53d90bb32cd8aeff962d48e43863e4eab1839bd80d7434c7eb808bbc0e32e92a4290000000000000000000000000000000013dbd5bdb7caaecc42ffd81f14be0ff3d8fa228ff121ed4f2f3ad5961fbce617d7cbc8133fd49e03caa62f7d1567541b00000000000000000000000000000000195fd9b85e19d0e3e1c93bab0380cad6f6f3bdbdcbf5c6ec32b7de7972421d0065cf0b265f6250c02eada67e95284bce26f20eee9bd019f9e0f5c794e22e770128737198b5f5dbaf5b7d18040443a0bc0000000000000000000000000000000009ca977266277bdeb985750df47353a6b81c5f0c473eb3369d25a01df67610bebf66a6de5727a465131404025e90441a00000000000000000000000000000000054410a13287ecf4aa18f543916fcd65b15cd5d54617433217b0a2b91a79fea764b511b3b270de3e8985e8f6a2fd8c380000000000000000000000000000000009a9802a03a7c9fb63c1eb13972cd42ea2df614a0972b914c4015c2e8630af319d12fc8108b4c88db9508a9a77d9e57d00000000000000000000000000000000094d83483bca296b20b7bee124f538ae9c659a84541f5c9d9fd22e98251d2b48051ac55ebe07bcc9d2e9109f526d60a6c470a66cd3428a44a7d095ef410126257175597a333cd36ce6c9822d1ee9bb380000000000000000000000000000000003f2d93ddb6d5983fd5521c1d1726addf662af0945aee54788855037f47a013d2fe595231792a05e1259c5e5a8c553a900000000000000000000000000000000004f4f4e7df5dee975fb440b5a217c27d9d1eb83a5ae280a2b147896f6bb864abe04459c17ef56d784d3c4a0b7ad3f3900000000000000000000000000000000069da36057aaa89cda458af4ee27fd9ec969c8f7612cbb153da0e010d67bfdddadb2941cfbdba8c43019a9f1aaf9c296000000000000000000000000000000001545b8325a80176ea148a3d9301debd7046f33a1b419b4ed01916a3d0a072037fd617d96e0bad32b208983ac3be7dda4e53fa8fb708204e619c221b8ecee14fdbcb1f94731ac2c858787ab33906c9269000000000000000000000000000000001536a81b203df2640bbe7e695b5fde186021d21685f24c25966cf11dde554d49bcefca64f16697509a9ca86e58b75eff0000000000000000000000000000000014348a2bd4907cf081f2f7bc944a98d3fac671abde029995377df190f7f60319b8de1698b99be39c821328e32a449c760000000000000000000000000000000000e18d4da3823addb2a6cef8336c83f99f390e23d7129365d57035d4363aac7e9c4da9f8000f086f7d2206666f990dac000000000000000000000000000000000d6ba54e2af9afa57ff4536a35e9b61c8d8fb3d431b653a0c66a2a4b8f11d9b5c45389f894d64485233d4183895921f3abf8de43c54ed59b936e1d55032eab5c9d9e04e83e4696d969c24167b4239f62000000000000000000000000000000000d88d5719e07e2332c54ba41f330c7763d2b2b7c4140d19b8b0972fae6ef902415de5f2abcc2342fce24d3ed8ffe156300000000000000000000000000000000163aa2c768eca58194fb76822deffc37cefe04ceb70aba38a51f507be7cd64c0755abdc2e49e7db234cd5d68575c2d7a000000000000000000000000000000000e443d9953468b8cea4eca4f5968e214888e2b95bc20ece39483ac551d4e180c0b0a41c4668c8ddaf761a0ac03fbcad3000000000000000000000000000000000691930530ce86a1354d73cb21ee32d968e6d89b12e5a09a7991c7d27dec302348af7f49c3e0de91e1a1838aa11651e795f59041329b6c3e6aef01d3410836852f79cc436fcf23199e0985c56f65c4f0000000000000000000000000000000000d7c6f9d4aa794f34596bb9af4d62363462d9804898ebd7c7db7544be1f46b4bde488ec59004adaa0cbe40aef525ce3f000000000000000000000000000000001094629b1428c4c284b7a64d0623e10ca0c4d395bccbfaad89d1a737a3887c10b714541f2681c33e674c3b99a36b7a450000000000000000000000000000000000d6812fad9c5ea365a64ebd3150238349d88b76d041ccaa7e637fdfa6c715d9d6dc3d3315cb95fd6919fe419d028783000000000000000000000000000000000eee5cb772ce02fe2a4883008f17570aebb902ad7c40b4024a5b24ff75b3aaa2b54ace6fb4601b1c62837a20204194dd740e4a207ab5dd4a0621fd65697f5d30b8ee1440a5f5c5e74a0dbc6b6391c1b0000000000000000000000000000000001026d21e075fb8921dd849c98252a565d39ca9f5a62a825e7e3e77ab5be6620e76e45047e51350c48d9a4cf98a1222a9000000000000000000000000000000000f6459a8287bb2da77404a515dd7a35f46a4aa49ef72cd2cdefbc5e5242872df5f7b7aeae6848d59afa1dd142ae7caca0000000000000000000000000000000011e3545151d4e0b034b950cd2f1a3fc2d29e9d53250ade2482b7ea6075dacf7e8e777afa1e8e612b45028205235265970000000000000000000000000000000017a869d75144ece603c04d39cb56a487895cc882fec613f40f6a66601bdbbbb7748ec755553257d654d1558b1104a981f49a3f82d25c6e0d69207e6dff010d56f0d99b28fd986c5711878dcb6665b1f50000000000000000000000000000000011602a23c9b5cc091a700114e5d3557bd4857c4fc44cb8628ef327ddeeb728927347438f123e2011f9cfda9b6dfc42e4000000000000000000000000000000000c4fad264ca95827e9cbb9783e36cb0b683fcc33038d47bc7ab6b65998770325588e5b910e811cf7d61fce13c3378d6700000000000000000000000000000000009b4711aa67e84434cabc289a78fae48ea86641a162d48b79bbcbfd56237705dd2d1e9ba3a18d737eec29eb8e940e58000000000000000000000000000000001160fc9e2a488ad9385140bb62ab48ee613c2284208cf2f92912e1b973ff81a5d3de338d9aa6881cbe437907890258fc8390fa1b452f887ef3afc7129ad8ceb9a8397f7625c2b249d7442566814ae0a9", + "Expected": "000000000000000000000000000000000cd0d8c746ecc8d92fcf2232793282d7e0e17e0ec27ee851487eb7788f590db3487296061075f36c24f67cd4c4bbf36f0000000000000000000000000000000010c5e1d05070c27f19c228813051c6a830254542eb71469664c842695b219670dba8ddff858e2d147019847866f01084000000000000000000000000000000001799ca7d8f2637da761622b793a3ed3317d50b902a1cabefdfc776b0d0ef88b707b8a5c36786d5ede3d8a381de4e069d00000000000000000000000000000000129881a3b56e0014bf1dac4775f509f309c33406f2cf22df9a0ccd15c87ea48a868d4437303923127bf580b8d6ed0a8f", + "Name": "matter_g2_multiexp_62", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000000d087c1b98f8c67c1bbc4389f21d9dab02faf46ee4223c609e7b9eb399132ae168bc12847c580f58edbb9255dca3b000000000000000000000000000000000065ded24bda39d2b830639fa511bce8dc770eb95e349d6874ce63b3355d23c1da3ee9771ad44e57c6c661b7453076fe7000000000000000000000000000000000fa3b2ef40a7c3d41f0c3a5f86afec252c6ce89bd1bf1f2192026e22fa256365360589c788753033658b1ba151797feb00000000000000000000000000000000105040ff4dc2bc435c2a82e1174e2ee0b94043d69074f01e8ed013da8c431f33c94a438a93b06774411780cdb72abbc8414ca9894bc15e6bca798544138689b2471f8171a5dc48eccfa36c83af142b7d00000000000000000000000000000000129c8c1db08ccd0dadd59b04df67a91fb6547d97ce23e59aa57cd3d38458e6baaa67285800809856e7e264d812e584390000000000000000000000000000000004a0be934248b4e142fc51745233b6d0ab2c46f53a8f9d4c84981e5eacff146ee6227de289c713e4ce24a4341572c9d70000000000000000000000000000000005916d14a8592af57a40418b10376e8e20f70929d2ba568c1fb70e343a1dfcf3e63c791cb639bec49c50aebd2f816fdf0000000000000000000000000000000018682c66a461a69b11d7c32f7aca07749e05a23fc46547bac121752aef64e9bb98a274d15a14faa93af8f284790acb9b99eac8ce85a1bc70c725a2f04aea3749d75d22c0df7c0755a5e76ab4d82ef9420000000000000000000000000000000001552053742eb89ae3d0b95be919c84e53919c898ada92d3eaf05605a19ac910091fc08a65e9764f3108877c837d478c00000000000000000000000000000000118e5d22f6df0e6bc7447177ce06659f94315478385372046b649fa6d39fefeeb492e6623e0160bc47233f4d3143e326000000000000000000000000000000000dd02c30cfdea5abd3550a9f28b546d82d5b3043f012de622d892062945847748ba820555fb811fb3382791ec43ce1f700000000000000000000000000000000050373898b396d9a641e2f2ed832c7619515fd9070852b891b4ce0b5bb5ea8b5e24248297d53e9db7cb946e76c4433fa49b25140d7967b0438e49f59a6b04b75bc8745b84d7350605be548c6b4b3aeee0000000000000000000000000000000006b465f4b9d60a3a14e119c54a7c35172bd648c86a7cf331e80ba849fc87b9dcd48410e3c9a07b634e83fc7dd71e5b9f000000000000000000000000000000000283ad9c77f549042f79c47b8a69e72164f0ee77aee50c20519d2b89029c63ea86dde2744cd21eb5d37e896c3abbdf56000000000000000000000000000000001668b08a87787928afe92d941240e503da07b646a34cf82ed09d4c2f4d479aa24358c8475eebd9bcfaa6bae17c430cfd00000000000000000000000000000000150e5b28bd901f7a2a9af44bfd6b78cc84900dc05e334de306f9a45f1e67708adddf4dcede8150a39670054f97a643436e30a51d55a1ac94089d0f3217c3a2182da6b02ce70ce7dd8e2d4e938bfefa9d00000000000000000000000000000000060d75764a92e30e80e7c1a6df1482585f4de901bbc36dd9d8978a76c12c739f85a9ba16741d0b19ed480fe2dc331e5b000000000000000000000000000000000024fd15c9e5b8872d2e9dae9ae96102bfb0e31d15e92a24316818862dd8ca7a6fef271d499fed5e0db6dfebc4c72e0200000000000000000000000000000000058cda551e1fcd701c6a3880b276a2f7536a26aa366a6425a1c42cf31eec678551f489a27f23ed5dbc76f19b0fbfae43000000000000000000000000000000001152e2cfdb584295563af8120c523a9f4c01cf72da64fcbe0a90a284d693a3089f299bc760166be062cf9f8efb6a951ad3da3db6492ff36102747d9d663bc6e9cf8f75b1cf77044989c7af3f11d66ae700000000000000000000000000000000116fc24e980b2e7ad6bf17bcd7c4f06e654bbf766ea0238a66d738bf3c2d41c8c63bd52f81553cca5fea91f5f9b74a2c0000000000000000000000000000000001078f19ecf785a5e0d3e764b7d6ea47b2d077b5eb222f4e6a9451f134ff0d77a0b9a3b53caf599705d131e3b17b6ca9000000000000000000000000000000000e44c07f00a1f198583a8ffca43da45d8e54e1f2a85bee7afff6c1c733b5d0b5712961c4b6d344869a8e4de3b34218e000000000000000000000000000000000083c78b3568cdf808b75d9ee2b03b98cd516bb16ca8cc35757f53f12119747bf6b5b0605bdffb2f079cbc69e99ee0bad6de8753f3df8be42b6d6ab578096426f852de4ff545d2e4ac12c3943b044b43800000000000000000000000000000000087ded6945bd6fae7a0aebb1ea68d3cd34588035531a6cb00fcf1b83e06f7ec21cd3486580165c1364027b43e238e34d00000000000000000000000000000000005a2fe8a9871273bb60cc7ebef44a361300a1033f3f0230a731f5723fca124ec9d305cfde45802482a45942154398cd00000000000000000000000000000000121eb94a41f9e133adf082ef651272c178d780a1c31ba8797f60a208ad36b4c703c9b6c08be845f8844dd14d6406734d000000000000000000000000000000000e5e3da7c91ab4cca1c9286020aab9795e64e667d55a5a700241f9589aa3519639f168d040a0027ac057f334a9f740aba28f7ef4b12c5097a15fa6394a4dcc3ceed6cf3c6240ec2ac949bc21a9f6447f00000000000000000000000000000000041f9117b426938acb40c905bbcba443c043bb55cf9b876edfa2ca051b6354124f0fa54d6a88ea172c3f5c10c6d921b3000000000000000000000000000000001828dc0b9533274db6afc802b2fadaacf57f28126094b6b9038ed5f6bbae0112c873fe5eed15bc49b970461abc2f5c3200000000000000000000000000000000107df6da02f106ae47718959aeba7b4fb4a8f0e2651560e2f2266a62566e13a5af86430b8800543f5eb6b1e96be79c69000000000000000000000000000000001628fd4a598813133de75cd7c96ff3711b6bc826806b96d07e5a89cd549592f0f51c84aa9ee0642cffae5630ca1ebae1a3d0eff3368b10d00566f35391bf43c9d204a4444b7eb91017f1b2d8a762d90c000000000000000000000000000000000e8fff44163cd9c2a4e148eef3cbbee19ab8f648da1a8d438be27d2b0bcab393fb7d49e096d9a7abed3d8f82c11c4e03000000000000000000000000000000001274335d8bde3d14924f8d7ba18fea82bbc85427892f18fb741c8ecc5f2d6d7bee74c68058164c55db3cb8da8597bfe40000000000000000000000000000000010c7fc728c094e47569f0e75446c399d20a1239b511e34d8d6193dd32df607dfaa4377a1825b3892a9f74ff4efa0d9df00000000000000000000000000000000067d904122a6581b5d5a60acfe8156dcb6c10ed083840e506487b5dd9117927663e0ad883fb91b4914778ae082de0a7eb90d76e660389e570bef756e9785e39b9748aecd7a34556bac8399aa5564d12d000000000000000000000000000000000a909706e3ce45c86f2c30de5e820c8c9eefef207e530fd504511827f5e6422714d3f4224afa6bbba22ffca533d647390000000000000000000000000000000013ff61472ddc0d70207692648087c283763ede668ae380b0b9d6ae6593498b0adc9d4e4fcc73b5cce250e7563f7577de000000000000000000000000000000000a81db69eca785373c4dcbafd8635b23a9f41265e91152f309fb2945622937e65b5c17656abf8aff042a1fd1e5e50341000000000000000000000000000000000c66269c3ccd9e91766d1a640789bde6de752d08ffe3b2955df8dad3d2a0b6cea9013af235cbfbccee8271a7242e310614f18dae096e4de75de3da284a5755efe51e912e180020a20adf1f5de43cb51800000000000000000000000000000000181f3f4a16696980bd0eb9bd10ff1084ffe90bcb65f12f505b25f0a26dc1d4e16987d486b2c0b117fd6f2e356b83a5250000000000000000000000000000000010d7be6788da3ec56c87acee68ea8a03e7d467f816060207bb163dfcf8a4e7721651bf2bb23d5bc390d50fb1ee6625a900000000000000000000000000000000196c1ac817493f51d9ca891b55fa65ad5192df83cdb63eb1a634ad54e2d627f7feaa68780418f5354e6cc09cdf2f6c5800000000000000000000000000000000190f36690b8d36f2e295b9625f23afef9d9babe87c1ba0303f60c6d44ec952ba6bf8356469cff9d952f8e26bdb86ca06e32d4645ce0172000fd74f30937261de89753caa716dd03a8b3269747f2349a1000000000000000000000000000000000f77df606f0611856c449c58393f4ee7a6225a5bee667382a48f59dfc747736a895d598f90ab26002dd0ed3a5a8f5a200000000000000000000000000000000012aa50d0ec440884fc6c2f7a0e8db8a5e79160f0c482209ae1a1aca2b9dfedfec6d6ea09252a373ea57905130220a4820000000000000000000000000000000004773f46165cdb19cae49cc42663316df39586c62be5b827535f138e1fca8dcf62ba42ab60ac6dcec85e8496f32b9eda0000000000000000000000000000000010c91923c2c7b3eb2cd9aaf0455c0eb035e38e5352d218b07ea23f50040ea58fd548b373c1bee9113d3d44fcb25f6ba08c8722e3e929ba21f1ed6c51fe5ad4940fb13d63e0293893135d0da5e6e0389300000000000000000000000000000000044b95fd5f0e049abfdc2adc699646afa5b0f64464779efacce85a5279477697090615933069992bf30036c6ac70dfe50000000000000000000000000000000002778e7dacc5566354c24ea1144613a5ce8a38eb56d53d230ca145ce83d5ed88596afe243df22cba10f423e64a7c103a0000000000000000000000000000000017e87cd2752d8674c373c557ab2b922e02620a070aacf6f5b3d3d07ca35d89ed2666da7246b800717c0e4763dc35f5f6000000000000000000000000000000000a3ed312e5f309eafaed486629d953970cb73f839bf30f506c2f393df4c283f299d6c643ae6c229430d919e8aeae8bd839bef6ccc893f6eed62e68f5f2a07812f2d3066b89653431e7e39e8596bc3652000000000000000000000000000000001082a0edac6267151c8ef11fac7614b74cf58b39b72fb71e4d66467ed4fb3264b177c691e569230f2a13a64b4a48c6fc000000000000000000000000000000000073a8d5f96ee580741bee1f82cacb6139d962fec34c44c648c8fcd0322796429bbaef083a11b4c8fa376d4c00cd79c00000000000000000000000000000000008d41e51dc2822e0f14b992511de799fe4db3783a05ddc1026a53faa89af000075ba5aa830ceb7551e51f0fff144c1360000000000000000000000000000000006bc4bf0bdf350af417160d06e8aebf2dde02c9b50be39b0c4dcb3a045f9e04f1f041f6de10328e287df6121247dd4e9c395ba8f2553e3eced8a42b221a710a5cd2a5ffe5834d3084dc260ae0f51698e000000000000000000000000000000000802e7b71127a15a279a629e89f194b51d19c4f329efd8ecf9fe69d340dd06068c8467da6ab39be25c194077d3ce2428000000000000000000000000000000000250172c787afe866b428748be8359d8e0bad161832abc108c850362c5839237483fb38678d77c94696260508907726a000000000000000000000000000000000d46223c1666f314f9a1e32a94f83d8150755d71252e19af91a3b460ab0ade2db2364d8c6217cb422095f0d9a1ed648a0000000000000000000000000000000002fc2849014717d1c07935efe601325e1842ed333897222f6de322dac8b50bf4d9859eed8880a34676af0d0e3277639053ef5568a766b6c39854ba059f3130b75d7fd870bfac2b00b626e2d71c4968e10000000000000000000000000000000004151d78d65b0c9eb26822e20d90ace8fac209a1f08f62ce722ae3effd7fcc476f4c0179e71b09fc181db96fb2ea4eec0000000000000000000000000000000013d17ef429483be98411947ca0771ce671fc38e27bd0aa4abcfd5ddf1af9e138404d86f4c2ed74702f80a573638d92f500000000000000000000000000000000178f2a7eb43b9f88acfa892b5868d7f7c5787a399c1c566de39ecedbfe88357fd5256ec57e1ba12e9784382c14331756000000000000000000000000000000000253a391373974beef746c4397654a30a68992fe9163f9518ff0ed9b7be37b858ac60c95259ab894bb6acfd123333b7fbadefc3880ca8dcff10b8b763f7d15f88965c2261b72ba879e3540a90c59effa", + "Expected": "000000000000000000000000000000000710bfc39e92b0b9d15ee9bdb4959daa3a78f66aeae29eaeb50a0aa0460f3ff703c86eec8903011b4b61a0dea725ab08000000000000000000000000000000000856fe7a074d37786237cc14ff1bc53c735ee8133b231dd3fc63dfa0dbd1979304bcc7b55cd1bb66fd7529e15d15db5800000000000000000000000000000000014757f1fbfd4fa7935ebfe65e150519d6eb4f4831890df4b236dda98804b79862fb6699b587c3e568fd6de1e582409900000000000000000000000000000000000f7b54e4961dab9e94b1c4b897177dfa74be9937694a38207ddc9d6290dae1d5e122cfe4c8c31d853db3783999a7f0", + "Name": "matter_g2_multiexp_63", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000003bfd2535c6d8ffb44670bd02b5aa6f050f5cfae7266fc3225865bc3f34320820eaeaa952f80da51671f6d97b3df9d4f00000000000000000000000000000000026c1adc0ffc3fef9ccf018ff9a647ef5c69c5133fb4a6566cdcbd3180d9ee784f34d667edb1dd54ae292253b45576b4000000000000000000000000000000000ee90fb541becf96b4728f1859aee5ae74e30ba9193b90569b66b0e1d087eb81f30c21774298cb06e7dbee8f8aafb1930000000000000000000000000000000000a4361867bca952446f64c273735764e141eef43d156d6cbb6e68dbf3bc940e935f7bf3a77b57fca4bbc74bda2f26532c1a5abbddc02f453519563d6b6e05959d8de5feb493f7c58ea5e548cfec2df60000000000000000000000000000000004bdef85b0da28e0531734016e5953256c75c3620937736cf65de5f05b8beff294677668047a3b74f0f135b846a95bd6000000000000000000000000000000000b754df2aef855b4a0eb6f6aa03115ee8f38a31fc852381deef2b59bf23e2c885ae166030ccadd5673bacc35482f81e9000000000000000000000000000000000f1d760ac6dfb65b39c999211d4e4c3623c3fb8ea59cdcf926249a07285a8e4da1890327fed20ff07f12359f6d9035980000000000000000000000000000000009f2698239c8b452748126ffd83abec768edffb83dfa3dc7943fd499c8980e2d9aad76dc38b336a4a63eccf5c4150ce0b406eb0c097237556228f3a48b7e770c1707fd583b91b4b6b70f398b7dbb0d3c000000000000000000000000000000000cd724c51fd56528dfa688df46f71bbfc9144ff98958b559fca8fd05eda01c38c28630ee19579012b9913a393264cd90000000000000000000000000000000000aa1e55f2b6d9385ec6a9cbafcdbad157f7ebc06b2e30e2380ac54e71db5259cb919e17042d6ba6e045f1358aef276ea0000000000000000000000000000000010181ce9ffe235b6b271d570b3c2d6e1be60c53b4a98ef5e8d7d00b463e5bbc9d8d96dda881e58746090983d6f8edd35000000000000000000000000000000000333deb8b14f499319ad675f482fecd80f9a69ba369425decd441cd2ff5c3c77f11075f61bb1d90d0be850ff657d6b7cccc30cf1db4c6be6dbc5830ee37b5782c6dad215334163a9d9e4deb962186f80000000000000000000000000000000001581a5440fe892ee6eece5fc2227fe072dfbc440e0620a1e5fb505ff0b16d9e6033d83c83576b4b6ff87a807dc81b88400000000000000000000000000000000099b070a0d7497f33c1c478ac424d5564fa645d836a3d572d98782f08713d8e425b571433fee928475688db2b3a9a04c0000000000000000000000000000000011e1cbaa09a6361aff9e199e21bc52e98dfacc49ed83e732d4b4f2503b3bfdf85d029dead4412b6f3d7ea447e20d669b0000000000000000000000000000000005503e151d620e9a5a142e4f7940ed88375e7efc1109214141c191e9f38a32a40d3a92d6094584e763e0cf13cbb54bcc99461c0f12019b344a7f322900b64fe81e0d8a052c0ff5e977f58753b1b6edc60000000000000000000000000000000007c780f119bbccfd658f3f1b69ce9c56b1f5269bded713b6827d97d32b2a6deadcc02c410138d984d977527f3609cc2c00000000000000000000000000000000095aebacfa33928a916ca7b0ceac699c71620781b35cb2f3b254bdbd1544b728a2ec1fb35416ed7a8a3a630bc07ff8720000000000000000000000000000000012194abf7e411f4961b6f8a1e2ad052c27624ded863d7a9132d9c7ecd3b4074ef0060cd86adb73056323f4227ba5fa9e0000000000000000000000000000000002fde2be9ac1e8265f258a09eec85a70112ef1eadc3a91429c9206555933e2b89aaf7493fb833e33e5d61be28a12a1c2338ef9fa825e47b46483ed8fd2df64bc7b56da8aecbae704b7eff2e7d426f27d000000000000000000000000000000001586c65405e810e1d5b59304bb4555ca43c04a593671ec64d5ed2d2e626b1f8a89f48a4b21d38fb49909b8c614209a460000000000000000000000000000000014528cdf994e774b8fd54090cb45b68098c1ad9a351bc1f36a9393f3b4364f5beaf58fff6e5f8b21a85b67bc427c0e920000000000000000000000000000000000b48d8713aee51d80c79109fb8b4e0c6e32e25a7ca24dd3e7700f8f3195730375208b241b2c722af3c2295a1704cbb3000000000000000000000000000000001913cf6328429cf2966a48117dc74db0d45be7800f93cfbebf597fb48a8bdcae4fae2df7835f9536481f67261755da2a1dd6656a34f3b12e5568b9c348fbf4ecf50d65a89e63ec0936591f01e6cc7a4a0000000000000000000000000000000017e45a481449f167fd579accc896ac65aff6f1f7392df47d006b404de3cb7ebf6cb59d0913438f3a51e55a0ae3d446c9000000000000000000000000000000000cf4b7db343bea29af6e244a71880538b41b826bfd1d06a21512d00ce58f5d7500ab1ed77b446b1e3782df736bf3dbb6000000000000000000000000000000000525d08e134779ca7614784818876514e14b65e799b7832f61a63601fc491c8b9cb25430547f961cc1c22100170a2065000000000000000000000000000000000450cc2156c4716d0343f32aca82fd2d0712389b1aa984b31d51edc2aa0545c88ff52e470b15eb6b2c22e30f79864dc85202f32528e795e0fbe6deb4ef6e45efc70019520b01fa1d71d5505e42faa69a0000000000000000000000000000000004147c105ee8b4db68482b9d7f6a716ea1474b6c62efc41b9444ed1ef9e92e2b7010a1c1ecc59038ac37b385074a6bce0000000000000000000000000000000018a600a85c5c38be835d2e91a35cce4b59e5f5ac3b735fc007bf5498062beca9befc9c8ead58f9f21f6e08266b149d800000000000000000000000000000000012a476fcb81ab66e3101de2364cb609b17e06eabdff5246bf736eb9d5c87fddd404e8867578262f07a05731b04069164000000000000000000000000000000000c54a888678c28766ad17a18507e4bf5dc57dd394eb6e9b69abaf15e645cf4779bf6ccf4314d2756584647cf27af089ba2b39f2b893be03ab4da77ed518ef35b2e24278d707a20b67ab4d1e5972f9722000000000000000000000000000000000e809152c44cebdd8b40f0d22d57c3b31f29700e0cbc3e69f660bf7270e59093d84bf7ac358be7e45e799a75cf9c13df000000000000000000000000000000000c6c61f98bd4e3b7095fc7f1196baa98139087df00fae2a795e76544ca47e453f75929cab07c11cd3595de6ecbbbaff000000000000000000000000000000000171c70446c19fec3c152741925c8db28ab0d140720cb6a6c45e9bc66c012a421d12271889ea43fe1524944ff572fe6850000000000000000000000000000000006e4baa09b4660c69cace151e60320b771e56e7460b01442bfcf26823c17779034ac241b9365dbbfade770d2056eeecd892eb7c361f05e114a645caffce9437b7b43fa01dd66c1e75b30f3abd0209bcf000000000000000000000000000000001917a23350e94963e3a7488ac1dafefe9ab11856d405eff39d655e31ba808f02954b63e822613d3c6e5f358be04be4a4000000000000000000000000000000001620211b06288c16aa02f4404192e9f57a048e900f0ec5db9b478475f13b142f924c6de720031b3fc12cf869b422af470000000000000000000000000000000011e8ded9ad57e46713e7ac0044ee4edec12689cdfb98838a74adf1a35244e3d9a4a34c81323b089c10422abf26b044e70000000000000000000000000000000006f85c7478cec590fe3355a8d6e9557c5be084c161e090c72f1281be4ee56f36aa1e3c9c844eb45d9e295c15c4cd903efdafc3f57d6116163f1da9e70ea645243c5911cc4ad4a969a57c46c6b5c73acf000000000000000000000000000000000d555d9f23de97318dafb257cf444952bdd3e844e9ed5ce193c10b76f5179f0c6851f93af1553b128f34d3a7e75339f3000000000000000000000000000000000132704571a12a58f629dab48f1a3956392b40f801c2b3757c15f7be46ef1d9115d89920c460c0e2bb062b3cc1aaed7400000000000000000000000000000000152829eaef900fd2f19d6fdbb8f7eb3b02df35d218b494d075219b69016256e572eb7f555f6fbdbe17c59a666d190055000000000000000000000000000000000fe5c67c949b7c89a867301528f0ab24b04d31d6f18f575c475ab5a6098f7187eef20a9ed6e810684da9afd8de96ded6660a77b2be50eb72fd108644d913b9253209972fdec2d107213ba47357c96e9e00000000000000000000000000000000128bf3cbb5208d84dff719ced229921a889c9a4d02f5a508187662f03852531fb8be1f4c2aa9ef01de7720c352dbd19d00000000000000000000000000000000158d89a44b8fcf9ca8c96a8e516e130ae8af19ed71c2b8487ae300c3cdb546e248728bc58fd9cfef21107e0dabf44fc20000000000000000000000000000000012b70b42c8af4551267a94a795fe18e8d054291225438adaa33fe2edafa87742fc3709abcc7bada5d26e3a14649cb47f0000000000000000000000000000000015a853160b7666ea7d64aacd931314497ac7068a4b8bfe3a7deed85df2bb8dba277716a9d1ee50c56b2970016ada509d1ca575cca348dee9adfe68f8a78d39bb998205da2a5285c12141a77ee7af840900000000000000000000000000000000087c7bf08e085e19f0cb301d2e36478357e835620b1cde6e132c237ff6fc63e6fc16a8753550d50fb93a0a1741302cf9000000000000000000000000000000000615299ccefe4da879e5f4b01d6b6ef8358bb59ed8a2b365ec72003c16486d3266243db81f48855d81b6a25440bb861a0000000000000000000000000000000001498fd20640f39dbc03a474f4514e5e283256ac19468077af1c9ddaa40759dcf93afe256de1e49be6469fa106394193000000000000000000000000000000000cba50fc4919a29be2f4e74c261487dbf855db1856e8d5d008cc3f4ee5eb3babfdfaff878adae49b96db99d424bc4dab2e1e4537f855eb478274992cba4e3f50fd9e944f6246cd52dd1517b55bd7f71f000000000000000000000000000000001369dd82ed013474581ca1ab2d2133341d7c1d52065060d72b8317e899e79e9077bcefe6c76c3c7f67e54f76dd3c246c000000000000000000000000000000000405aa84d3ceb02bf8eae989a9cd65afa15451443af6f3cf5e70f5cd7bb8d413c57ac3893a7e8b888ae93a92dcfa2b20000000000000000000000000000000000378d003988f3c6c16d3b12ef47a4a49e2d3d2c7c67e384bcd510939581770aed92e06291ed3b7c742769f0d1ef740c100000000000000000000000000000000048bfa6550711a17d52f48377821baae6f3de6ad99ccfeb8302466047dfddee8005240cdc65b3ab11ed85b11f128624957f9a729aa01c8bf0271052202a077913a9e0c87201a367845f9b271c130e95d0000000000000000000000000000000013370ab697da0ff0a0efa8ebc7589b465374c983c13daee7b5451e8b299933eb5a4d255ffe4aa46782ae0916fd3990230000000000000000000000000000000002ee77be6e0b6fd260ad660a96100bf3259329faf2ff9796102928e70cd52c2bda8d0d1da1d484d7b023d3d59725d12b0000000000000000000000000000000014482fee88e02e61b847c08e61d7ae6fca2d993bbb69bf1653138150d5d7fed09cd5cd4097cb4b6368ea8023383477cf0000000000000000000000000000000009d0380d0d6fa39c9e242b9a67336d86445551658bc29fbd594239a76d7741ba388450caa244fb186afc36d35c8740e93017593cf311989ed8fedff72bb1f14f72cfe5bb7446ace5274d8ded54c1372f000000000000000000000000000000001537d4a47247af8f60f77d309666056c412ce089f3f011457e894f74fa4ad5168baafd36ed3294f5f61cc9cd8f87554500000000000000000000000000000000119e43382a846c8945e58dc7723a0f24b24d9cd487d436a156156a6da97795cf3f4ce382d21435695949b5137a2bf1d3000000000000000000000000000000000be5fd015998bd6043f124048c82e4d848e1b8c87442d0021390cba41c294de17648a47dacc06268606ba73cc95ae6e70000000000000000000000000000000000e05a3dbbf3da8320c40d51ac44c6380d56ecb460b0e7094819aa6af4d7c70d1541d4bc1fc5afd453b165f3d48d09a708bbe9e7a307e380c238ec1f8e2010a95fff8b03923ecd9b012f99e56c77a5cd", + "Expected": "000000000000000000000000000000000b00b5c14685ddd17ee99c74598e6bfae5bb1c103f8ebfaec3a620ba57312f3093f9ad5eac820d81096dfece90e72ef8000000000000000000000000000000000dd81552160d449cd787ac27c76685ea0dc993a9fcf8ab182f1ff5d8a484a47c14c1c1a785285b44336c7f6fc0732a0c0000000000000000000000000000000003008b6d97a12868554d294faa26e2ebe2920add650f841adfbf0ee89af72fc4da5dc23b45b7ff191a58c17971b50ae50000000000000000000000000000000013f438d927f35b04bee8fc55693d5c97229c8548ff9de39fae6e26c26f89623d3b0c810b9be8dcf0445910e8eac5c58b", + "Name": "matter_g2_multiexp_64", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000e1f825b71cd9edcb231c178e160e37bea70108b369afb248edc7c6a59114c22e843fb5541e0f26c77a2b589ea88fb3d000000000000000000000000000000000d65d777e91920b17400955a4afecf82f67cd13f3e7c5d9c2076c4a4d8f7f26383d22d9977dfd0987f219a625c8a621200000000000000000000000000000000045716092850318c343f0dc5337df1a72f8c74dd729831d12103b46127c9180fb50cece34986a94fee6119e72d16a55e00000000000000000000000000000000083fac698ce800786719d1f6063c87d9f728da03cea2545b4ad8831f6c24bfff73e80f2c2fff1532f6d1fea60e7d438ccc5e9d01f6ea67dc3f943d57d9d8b5791d823592f7fae6719804c1ca097e651d00000000000000000000000000000000171d60b76698d4d3f14b4eacbdce9fa66b8c3cc7ecfb989439330fbf0d051d95f3007c389113346e614f5ec8cd170a2100000000000000000000000000000000151a96beb250bdeca3cdad1b07322040bf1cf2105dfa854bb24fa76c8abc25ef4fb924ff995da641244f9daccff2ff970000000000000000000000000000000007e5818778a8331cdcd1432b46abf1efcdf7e4aa8907fd42d5e7d14b57dbfc48125246b57587755ee1571be8b52d2c57000000000000000000000000000000000693eb562e22fa8ca4a655b76e43b50fe487ca1d65cc3867eaf793e50496f0b4658bd92199104c2ab92e4ac53c44db6f57b8fcb85e4dbc1969805d814e75b2b80f5cd1e5562bfc1e28becf731aadfc58000000000000000000000000000000001059d23ec6e472937d80829256db506d2d2deb37d4b750a980568cd5b0db085358a4d610d59009b64db1a9225f9f6f5300000000000000000000000000000000053d9ffc47672f1058856aa08e51aebd469111dcd129ed542454d6401e7893323f8a9c63641f499cd8617c7389518f8e0000000000000000000000000000000002b9b30a5e37b18af4bb02ae8cdd56f6a87820716ea1522a174a0d99c3716295ad0ff2daf663697cb56bc6053c9dba610000000000000000000000000000000019d3230c0bdc228fa0cfd5e0d8bb88be959e70e59d931d9f9e3683d5e65d8ba0d121fcea329b23c5905b80dac34de33b03edc53ced9ec5d7f302216fd30a81c3554a3fd04994f62b5e3da74c8b71bb870000000000000000000000000000000015a619addc75f425596f9a51c6cf2259087cf32afe9b1f07e346a2f4e1f8caa001dc10098d1287b89837f426d073982d000000000000000000000000000000001660598fcd3ab6a55423138ee72a4ca7b57277f6ce140f9f992dd9934bcda78513516df0d309a0e8ea151b2742dceddd0000000000000000000000000000000004cce7d84e0763fbbb54376833ddd7408afe3f741bc2b7e42fef3789a005134cc5540981a15a9f256e0e541ac58ff3b10000000000000000000000000000000019c20a0064f89d37548e06d63d8ff4fbf3584d5bcc2fc2757339b7c89db6d5da76d43b31da7364259187ed602e79bf4f976568ab779e335b8dc67a64f15b947e69cd3896ff393f51fbd3c3e3a157543f000000000000000000000000000000000d7ec5a27ac44daeebab7658011624c441e45924cce97d5bda354f1daf9362f5bce2ddf57151fa07f78740a7db170e8300000000000000000000000000000000121ee325f4252ae5cdd3e3495f36492d68d9dbe13249039d1185760e6e48a789744b2a9946a3d6478a64b378f76b0de300000000000000000000000000000000014c6c5b98c1e214f78b82f1b3be4c32c5013934b1231fec942b5591d3f0440bf63b1505cfbb7a8fa78a85ba58fd4aa90000000000000000000000000000000016aaea3bd0ae91b9d18ff89a40ae27b68d74f3a227383138ed737d59c19ac578da03df83f04c8d962cb9d6f84a15302f3aa5eeded490a17b1cfa66d409811741643b7beacf312b9d6c8e7e7e63579c8300000000000000000000000000000000188e5aed425a768f89f5ce09b2cc909b28c6a0165787c8e3750fca8e8162128ecf62ef0ff853d206d23bc076335008e70000000000000000000000000000000001cfd330da0d1b5b92b6533cf5a8b6b70bd93daec4373f28d669f5e970a947fd813ab1d1272b61afbd2748922b87c8c300000000000000000000000000000000002aec750fd085c99c3b9c3af62b6deddd85e49eba0293e6e8160b26a3945af546a760b8f8f85120d6a51d22313cd33800000000000000000000000000000000162a109abce2edef753ca6351aaa9cecdeac20919681c672dbb183b5b26649e885ff081b9d3687f802dbe20fda43462af9f1f9313bf966ea3b8f09bbe9dcb66a7f9e3e94e2024c49a72ccbbe03fe4662000000000000000000000000000000000f7ad6a1dd9f8cf52bef02ae1e82b0d20dcacfaa5c169a485bf8becec8b51373fae851ca29e64385f0b7024eb0bcf9270000000000000000000000000000000010412a7a710f842fe836414e2729d0ff2e145709d8f7b5e3964af3e0ae267ac53dac3db1e6d2b7f7671ec34b18c844a10000000000000000000000000000000002d3b96fab0e3b8fe44e316fcc5e35f06dab83f2c531a777e162f7521cdd5767ad0b6f877f876f73d2ff663d9b71f462000000000000000000000000000000000c09a98bf623e82a4d2d4b63fb867fab5d3bb1f85a0669c4c11cebaeb357c0717a0f246a9ce4064b7351dcf1e77cdbd393be64fc3763d06111961bb208a2b858aa1ff181781dda630ca41f0d45ef2a9000000000000000000000000000000000114270d35ebff55c0341776086d893513595aca3b200ab98c8b586029b19a360a04f2e77e90d382174296443ab8531d10000000000000000000000000000000008b88849c3cda9a23d37ec9f4700904edb24be95fbbe6d9e20ced0d52208b597d44bb9269830a1ac5cda35d0c0a03c9e000000000000000000000000000000001144466b13427c10ad7679567067dc47c671107064fbb9bad287924c9bdee653c395dc2654caa5b3013ade932fddd5e50000000000000000000000000000000008e14e3cff3bb57f0d87680a0c09d745c7272bd3c216ff9fde7c03df2caffc27e0bfd9f99912855c156a787200752c125d2a2b6008a3b4a4cb3a8c28864214c7fbe154fedab1f9ff8c96eab6a5f28fd30000000000000000000000000000000015cda76d42de9fa86f900a5180ff016155f31b9276c617ef664202848d2efd2876d412402516c0c3d26d49f71d894acf000000000000000000000000000000001307fa2b963fc19583b7e4ef2e9dddbe93e2505e8f4f00ec52db26ab411002136c1f646b1cda71e19480c767906a6d03000000000000000000000000000000000ba87b08173c841a2bfbe424584d4685c39bdd0f83f278f9fbafa8111102aa3acfad5aabbe032c7123631fb8b454255b0000000000000000000000000000000016c525c1dc247fdf34344168b7cc245579585fdbdd6fd783cbe60b727cd11ee97b87a86647f78dda207c98e65c2ee7e6854e742ef7c76ad438cbf30c30103741f57ebbcdca4d6c4f14e554dd1ed81b24000000000000000000000000000000000403887fd4429f44f8da7f17ca072f867e88ac046922ebe3e1e6c4f9d8e174399e7648aca924a557dbf7b29c540db33f000000000000000000000000000000000522324700fb6b2c43eb5b39e0da94cb60e234369543f530ea47f4aa510ec0fd79cdf4dd3ae046e21d78b9c0e35107900000000000000000000000000000000015e946b90984257ffe3814dcc3ef065fed1504f0790f3564c8bfad4e97cffdb61c0d73bb0b1dbe78c4266c773abd56b500000000000000000000000000000000078f604630074ebedbd836c463f3879cd5d4a2c947da0e47740ec369112f4fedd787ae59bea69aab61b91f05d92061036f4f00b2494a32844e01d0827ca78b06f5eb40b6769f36a04f20eea229c305f9000000000000000000000000000000000f722bfebd55f75f3bbd0a55492499c3a3f637ead0e54270042fcc88853df5bc5f11a3677efa26d31c28368e00c8713700000000000000000000000000000000182618bc8a4b3f6556d79848f90efd6883df90806a8358cb6852bde465a27a70644ac5d5040d4f64ec355763f1a384990000000000000000000000000000000015f717739a1cbb2eab30e7b1bd9b25f57ad56f36016b59128ea1f2089f2d1dd0128b455b1b0e9e3b320f68a38a1bdfac000000000000000000000000000000000b855788d6b6a7748aa923dea3163fe525a7b43f4619c1eff3f9219ec3d98ceaf34b97bfd19aa6f91f7fcff728728978191e47a0b0c72bd17319063abde7df51498cf0c980c46946bf80ae4c9864e2e200000000000000000000000000000000120048ace47bc1ab3fdc07713b91a9223fe0fffdcbeaabc8a61351d756f936e18177f672c5a4db7b9dc29bad16bb7c4c00000000000000000000000000000000101275492a6e843306f2927b6ab540d7a5ee925bdab40103b4ddd885e444e6a6ec2d6e99c061284a1967797d8a2e9e700000000000000000000000000000000002c12f17a5dd2c56aed0d308367f37510f83c94a4482e5f632161dd0517dc2d4f46a90bbc13034c63dbd04fe4c616e320000000000000000000000000000000000e4b9089155ce2178f26b058f4bfef57b73aafb83b0b78138a01890a167709f79100a1e4d797c5849473eb3486cffa4b7baf8816db56c0a602cfb4caa9089136ebde05722ad4838671e45ada5c716f20000000000000000000000000000000018180eee7e72b6a4bc2e60555236da335fe05fcbe2b3cca4937e73a550aeae6274122ba84ace78eff84d323b4196f58400000000000000000000000000000000147659347e0fac7a16c92950ea5fd115416072f339d7de3cc0f00ef369f5122ff050d8515effacc825c807f7e19650e10000000000000000000000000000000017bdbcae7f63052af9a7d8bd71dc98b6eca7ecf5eee7632959fe56ed51278099690c534ec33be4ace4612b0f516794aa000000000000000000000000000000000d6fa233be4d6d783bf973cca3740cbaf0f719827d7f9310f38d1dd9d1c1f125cdfca6d12fbf6a8e8104f79bf30b00647d9ac1699117bb9b8b90e2fb709eff4ea0f7882bdf6acc6885c9458703cbfb3500000000000000000000000000000000082f3beaafa575e86be53b4fe7b93835b00759f921933402282e5bb0e643a812e0e4b676ad51ff2c6f5332d777641cc3000000000000000000000000000000001760b87bc4d2c13122fd7acc6d629c9f9db9bc9a2c49634aaf33e258ceb3106bc2755b227c6660a1df1d92c60067cf5a0000000000000000000000000000000016a819d7109c9a12199eb98537a730908a693767cdb35a69b4c7329761939afea766f0b91ae405e273227330761a53dc0000000000000000000000000000000009d14d7138440349e83f5ded46d18b886ef3cd63e0e5bfa0a8b50985142b21a4733813ec347e40cabe28e6ec1e068c24a22b6c1a24eff71f0fc64b6aee8d3d2dd0827756f5c959f68f1216c2dea58503000000000000000000000000000000001676d7f489219b56c198f8494e156fc0672ae28dab20021b7a6018436c7c0f107efd2493ddc2a1cfb3ad490ef146348300000000000000000000000000000000001106e89fc098ce7bd8bead5d7f6432bc54501370ae6544f34cfd996b3b610f9cfc7ad366751ae1211b848aad7d93d30000000000000000000000000000000011f8f0bd037365b5427e76d57b018c1c644034b28d06c8f68c59bff45eb4a2c4d761d066d96c13f7e73dfd80c81704a0000000000000000000000000000000000fc826b5957613f35bfa36d3ce088dfbbd06c8f2e88056a22a9f35db561e06fa0378ccff29ba8b81cc12c7a504f8c704c0431e6877166686239f014008959332d9d009a801be6a1e68c2de52ee264bfc0000000000000000000000000000000014f0f64acb0d9638a68278099abf5b5da3aa087792bef15192cfe3689b69b7ec1aefbfa14e659358b5410d98d2eedac50000000000000000000000000000000015ca79c92e98cf8314a2f6319520e1eb7d4656ca6e51278710cefd9c768a25691fc58e983aaf858d3c8d0ed73e2beec300000000000000000000000000000000007a5192f1dc906693568291f163e9632c53e1f418a87cd25656064adffbf31863680468f3ea451fbd22ac990dc870b3000000000000000000000000000000000131d2e3f6956da8941e8340259b8a15aee9fc6f23573f9a348ee9a51bbca1308dc54e7b4675357e3a9c5971be3a5c16af833a784d22b99537236fb07ab7b59918783e35b89fc9692d7f76a03e024c94", + "Expected": "00000000000000000000000000000000163da4bf7e159e05eec90318a8ddad4a59fb02d7ae2fe18795d38c3ccaf797188fa16577e6a421ccfb12ba1ed573c4e6000000000000000000000000000000001256654eef3352b09e0027277aec042519d99eb2567fce2cfa50a0c251c12d3593604739128171bfc13b3bfd1ce8f9e8000000000000000000000000000000000b8a46123bc863bed525f97166bcb77504eeeb66d2db207eb8342a3d18f7f5a99910fae3e6423c6e84e437a2c4b24363000000000000000000000000000000000b73cf08023c8572f48c132add67dda7a15def638a01b198361b9d21a4634ba76ceed9819b37c12e24f148d255483856", + "Name": "matter_g2_multiexp_65", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000003113ba8b216d933fe0c81f23f75942c0065d21d8f009d73b1f698281408874e33dd2750fd4298367b81827cf6fdad34000000000000000000000000000000000b8a921e840fc665a786d826f83ca5a9c8f00e7c802bce5473a7d1ebf63e8bb6cf5c4b426153508d874064d1f1dade09000000000000000000000000000000001492ab584088d23d3b0d1283904f9a8f29f9efe47950c6e9ffb9db2123f3f9820b906d672fc7f97f0bd38b8fc0ef44520000000000000000000000000000000010d321c2538f92aad4631af44ae39e63dc06becd2460f0cee0e526328d167fd6cfbcf4edfaafe32d13b5fe66c009533bb16c1bc60e1a9be9a82c93b7e0311e7516a57d687d8907599918df77b3b6caf3000000000000000000000000000000000ae75d01481a51294003041afc4802326ab878a3a75eafcda43cf873cc65e300d28aa986fb82a2d1d649e5be00f956820000000000000000000000000000000017640eeef8982250f88a4d187dcabfcc9adc3ee9194dbc3c04c741690fce5bc7cb07cd0b7c3497191d9ed8558fd0d24c0000000000000000000000000000000007527fd8dacb81b8d1abc746688db6a47211fa71556155d38361921c4bdb2a9e9921a3a540bcf55c6dd751b84c04a1040000000000000000000000000000000008de9109ba354d7426a5313d66cd747a54df347f0f86a3c0f99e9e4b68fc79641fcf98ab39fa23ef6f1a781c48f53f76cf301dfca76a83c70552c9cbc9c80cb20f0d82a70a9d887b04b150fa0764ce2e0000000000000000000000000000000017331b8367f07756e789f7edce4d22f6886656fed78ddacef6987a2751dd3d5d49011a050e7b2a3e11fc8d90266c9d710000000000000000000000000000000016959c303e11f23392f95c1402d1d1ad7f38343c711e96f18d03f832f76e3e81de789a6eaff797ae51079b13571334d40000000000000000000000000000000004266fd13db1ca80196a91263c79d1583b717fb61fd9ce5113e4cd94c59e605152b244e10e364b468c5a561c6fa9715800000000000000000000000000000000026f67cb263be83f3163856f091e9346651c29d4634e242da53b22eb6e66018d235b0f30f8833310dff9f3020e5bd3811cfb94c4e029a2126a9cf5561c677687f52059e4b7f8b7e7e73e5b1dd7f42129000000000000000000000000000000000114d8babd11c81ca2b8a7e193afbe0a8fce426b83996bae6f77201870e51c9355c319dd86b985272f73e0804c0f53700000000000000000000000000000000016f5ea7610891d0e72975816c08e6e25a75c7c42500655f26efdfb384241bbc825358a21caff347d00c8b2391501d15400000000000000000000000000000000199c8c74a79ee90c3606906bbb8cc163c214259e4d0127cee3283bcd9c1ebe4090ca7d7b180201910d3f6f51566d3bdc00000000000000000000000000000000032c785165ad4c1a2846e15318bd7cf5b42ce8b675cb18fcc4232e28701f225f1ea384b276e7a38b2c9e2e8b112f1911d8386fe6f4303959e58165b422e98c4813b1bad7808594473e4e66df09698cf0000000000000000000000000000000000842c65006caed9b53add048a2eea89e1b4584e1deb4365e3dcf8b9ecb02f337bccbe5d6929ef8c20461847f171fd4d600000000000000000000000000000000100dc23e6c1c6f6756419a9bad3133bba052f408a424c5239b8528ad4429a2bce64b72f1463625f7599ce43865581e9600000000000000000000000000000000125b4d71333274a16e52829ad5eaaecdda5c206063473dedec5a8ff4424def70e6f650926948dd2158b403f985a3421b0000000000000000000000000000000006a031e3c002702837e4ad28250b85cd94d42cf7b0d765b980fab95edded7636d13bdef1be63e66682c4e297d0cb2b0302e1c432f3b55ae87ab815647f196be3e138b2f6e9fe7acb9459650246187eb90000000000000000000000000000000003f7091a25da7d5afe6fa6b254604a1abe7a0c6ea11cc1a4167f5f648aa973d888383bc7e987b620d23e688868d318360000000000000000000000000000000016637f888efc3e057227cbefecb3037aebf8e330c3a794e51d691e3bc064237b98351beb746868aef977a83d1fe163ac00000000000000000000000000000000126d2884487984f851d1bd7d61bdb803321f263918e88e0677831563bacc9f5207358d1e9c76a5a25a66f0294f459e3900000000000000000000000000000000125c61b387a4462fa3bb2f06a4cfbd7df082d20cb23ee974aece2ec9a3b0c084d13a7ea83725a05d9f31b8033d2888ef9b0cc0ac499dffd627f5d19b87817dcd67e87561d5244a4b5698265f8c5b767e0000000000000000000000000000000006cf2bc7c691c4f8a64d0aa1ca3760d715b3188a2dd299ab09c723315acba8b0b4bbee819ba06cc564f0c875a63a415b000000000000000000000000000000000bded3d695e471f30f9d723f55826eda112eb0e3fbfb9a377cfa07d6233ed84108b92a79bb491a2971e9afdf83db8e9a0000000000000000000000000000000009b0e9928cb267508d4f9444c6ac3dc6f64f49a70c82c0bcaf4022e97854e5d9ec2612a2cd4d67642dc0451583bcb24d00000000000000000000000000000000009347dcfebe93a2f7674ad02ac48794e7cbffb04dd85b0c8c192fc85cfb9cef40fd11def6f63ae9a923960424eac6a02f3875f81fd39c9b3ec74eb269903dba4173d8eb0e41a196d3131252207ffa040000000000000000000000000000000013e8215c7bbdca445555c9fa0ae44e1905703334bade3294fc047ec262b9e4903880d52851967339eeadd666200b25ae0000000000000000000000000000000003b0bf4498103ac03601a8594b154b59a2a93d663f98ff8dbd2c85a1902e572a9456c629a12651aa87a1262102e1c770000000000000000000000000000000000e8bfd7d3fa0f773e6bcfd0d43a5c436862d1cb6a4ed715093c6782cd94699090c4bde597f65768e963fd0f8644e09b300000000000000000000000000000000064dab4d0d0c6b94c58b067337f2fac7d0d922cc822562b6bc941a794d96aac5ddb83d1d5844440d21d0a72a69303b8b2d8d4341822dba68c6fd58cfebd07b134c1d0c4e32ff63f7d59addff4df1ec3200000000000000000000000000000000098dd9a20f84fc26e78993a9de4d519aa2f8d343fbee501af945e5943e88425d29beb7ae54481b04175a07bf69b260a30000000000000000000000000000000007ef43e7a56e4e7d532420e152ce566d9055eadb4ef13d5698c49da905a4977fa8a7d3f51c8f5275582e1647984be61e0000000000000000000000000000000003755ee4432ea90f2197c7cc2e191dbbf7950c52a2c1b723f26d2aaf7a38c1b97efa29a312fed599f1199cf186400adc00000000000000000000000000000000150edc463f0a55fc70c2ffdd1f73a3abbdae459eb16adf79e96d18849ca638e6f41c6805b73755968be5cb110d81faa4efa3dab1d7cdf949bd938ca6ac371f953b3bbef1aec7ae76bda37db4c940b3d8000000000000000000000000000000000f7149602cbb3e5f2c5f8edfe59fc0fb8e1f03f89ea192bfe3990d87ccd28d4a80d7cd3003a8cfd669e1b6ff7e3cc5890000000000000000000000000000000006ffbc965bd06de07d8c0a9db8db5ab82d5f11afa1ad8eb92ed4453489f5899cc8c46ff02743956bed81229f64cf6efc00000000000000000000000000000000164cd3271ace4809eadeb1c0f769094272f3b66968690339bdb5da92e920cdc80c9d577ae4fa5b6426a5a6f46fba80bd00000000000000000000000000000000098f0a14a511ff424847d2b4d1b80a049b1f05ecd40af96b7a81def54486e4969011c122ca7dca3444029daeae2ecfc79848d3c53632dc461619c8c522013b83550ef3dc7fda197ba37c9cfe4340f5a50000000000000000000000000000000018409c0d0f37f4932cca87e24eb4d55e75dc98f938420ce036d43689fbdbbd839dc608b21d12a8af1d0a780aeac6617400000000000000000000000000000000109f2294669422a4946f926b1f106c2887893a042e3bf900559429c7fa484da4909216c8dcf826871534981021256741000000000000000000000000000000000a1ded19846e603b958d0bdcc9b554beca784b017d2a35ba117890fd0dbf729428bcd9823c7a378706220377c82a215c0000000000000000000000000000000000eafc89e30e4fc0544497e27674ec5b37ec0849fb382e608e09d0c1c94cb78bcb96ef4ea48e374aad1038881706fbcfcbfd192e917f2e0c4d6253c4e4755f30812149d1ce1ee4ae5540faf1dbfbc13a000000000000000000000000000000000e02cb3e099792ae7508321ce7afa323fd499de90c4006621ef5ce1054d0c934ae058a97ff8aeae0c88709c4d8ed0adf000000000000000000000000000000000e19318f5890320f17d5243adb4683a97e3e9763102c4fc93e3c3e3d24f4f61e0500be916c249dab00094b4ab048fe99000000000000000000000000000000000989faafcf6156472368b282313e076613cfe7ff135eb131b49e58932cbfafecf6585009d1f17ff8941d7f871be23e9e000000000000000000000000000000001167419d097ae8b96993b2e67da79b658adde1e12e43c71f27835845c7077f385612158d3e59fe2cb32b9418463e672679eaf11b3a30c7771ce63cec214416d798de20432670280d997b2f0631007d63000000000000000000000000000000001579b7d03d3d2c8a280e8ca113bcc98afa6a2705a5d228d92807a85cd5a1ee97510f632293a478c3fe0bd383f4b69cdd00000000000000000000000000000000107cc2e6bd02251bfd565b4b848adaa84babe9d4f083e827ceae6bacd9c9c221f0dbbef53278175bf27ebfe5949fcf8c00000000000000000000000000000000018d187c566690e4edd8d8abe5e0a448e352f622c96680378051228b6d081a4914aa51383326aedf45e351612ad6c5d000000000000000000000000000000000197427117a52f82aa6e931ecb0c5ffeec7f73ee8f44c5816935d26c06cc8285200ff9240d98cc244708e00669460f98b43077447b67f65e16a8aeb3564b2d13822e478dfb4a82a15a1c8fb7cc8170cc90000000000000000000000000000000019bd947df5a437a7f1ca2340bec628f2783cc1760dbc4a97ae10093aedd9f64e25ba79d9f4ce678f4fec91a3b1eef2d7000000000000000000000000000000000770e0c39988c9d8eca076464a3e10e274b06b1d2f6230e6dbd8dd59dd9c062f8958c6870c44ff196341bb9f65b8db38000000000000000000000000000000000a1833ef19e2b8e31577e5cd26e0a7fa46a5d25355d8b3dc0605f53714a60423556f3bcf17649745695f68f26570de0b000000000000000000000000000000000f449aed4120f3bef05506f2463f4546c7ea67b9e9110d3942dc256400d063dcc571305b1d4cd2bc3f18cf25319286e8eb64479b496c17d0587f6f26c62752881b6a9228643e8c43f21c441eeb643107000000000000000000000000000000000c1f9688ea64165f894e85b21761a9b2bfce891070103119ae71ff7acd164a57b0e054319631180c22f19eab8607f5b40000000000000000000000000000000005ba18dafcd3552af464acd469b133896e90c9ccd7e3bfc6e05db883f3c6aa1cc4610ec47f6354f6a7cff4385c56d2b3000000000000000000000000000000000fefbd9d78f48683b378d2d6311bf7ffaccaf7aa73a0bb4ce019a0c1d2e1673e52c724bf3a782729ec23d258043efff5000000000000000000000000000000000ea47ebbe3e858c5fcbf5b0cc9017d6ea23bda36e235d2aecbec827fdd2e4b042d1108d5f645b6dcdd786304e6bbf81b52b42f75aebdad1bf433917c025800c4f4e985cc077db3ba36f7484f95764e89000000000000000000000000000000000a313e1bf72d9a176bbad609631192c779e94c293463507edcd1c38bee8f33cfe6104d7169457ad5ffd9f045fce1cadf000000000000000000000000000000000af8db18938c51742b351fffddd74bf1137092ecb50a7e749391bacc9c1a19c7b9cf235b52ed577e7855d4ec1fadd940000000000000000000000000000000000febaa128de79274ef11d3e6378809d5b319796c653604723693c335eda175014b645604271429e3d449e756c85bcf6f0000000000000000000000000000000006adb29cc4ba053fea56d07225d2f7735651c0046f5cbe4a350dcc20431ed9457651d46a5d23d946959cadfc5500b7eae83106e9ea63791eb192e7a035bee27bd049b3a37f080076146eeeea6a769384", + "Expected": "0000000000000000000000000000000019a5b588aff8853adcfa959afc5135807d00196a75acb3536ad4fc9a9df3803d919a2de7cbe9ff762913225577ebdbf6000000000000000000000000000000000ac8bde939ba2f164795804d96dfa8d3a1c4d9e4eafb000cfccd956c24f4d594b30bbf961917f625c86270cbe164cc5b0000000000000000000000000000000002de09fdf52aec0b91bbe99fe2eb9043b19975c6fd503815264ce030dd5e5444f0f4275ac9a07a49de775335d52ea3c40000000000000000000000000000000012457bb55876c482e5b907c765b476dfe6ebfe8e588cb7f630e58f78942bfca57e6c0d5d7b0ce80e48960e297863d212", + "Name": "matter_g2_multiexp_66", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000008f3f1f04fb80a23d348e3e25dac1d732265fd4a71ab8dad3718d268e49c79578e8e1ad1720e70357439e57df0791d64000000000000000000000000000000000fa4c15c76e395fa706a55d1909ede2163274a68b3e7afb8d2e0bb176f60c06f5a921c9ace35bd311bd79ae86340ba5000000000000000000000000000000000173633369e00c8c5528bd5ccf95c6af8b012e5a31941c134ad4541099c7c33c5ffd29a5a31e18be720f7ae85132cd6cf000000000000000000000000000000000800f5eaf7c8b1dd2787305ecc637a0bba8eac807a7b449410e48aed3dae2b4645b8459fcdd477fd92fa5ac6291b800ea4d710d2f632e3ed0ef69fa0219e16ba30d3efee99386f1a5c921f4548ebf64b000000000000000000000000000000000ea8057b2d609ac2130b21e0b4a41f0aca20ee7751f55d816ea42cfa4612b67c3c556b01b0bb1c5912a74c50a420407f0000000000000000000000000000000007fbccf8ce8d1a92756fe80b15c7d9342af4e166d3c1c7e35ea2fac34851cfd983633270c877224749365720fbcea54a0000000000000000000000000000000000885e173b73118721d28fd26f3a9c562bfbb878ce71091d7ae4b37c1f2625777d67955a2b7458af71077db7557171f2000000000000000000000000000000001754edbfc3f2af94c92e6754d6bb096bbc4b39bb1128dc6bba8b4d4d9fac6649598be90b06b9d5db44c4e77c0cd1537cbd9ae4597aaf582857b40096360ced0f044ea172551c6f9fe3a15e0ce290b56b0000000000000000000000000000000008a1a751b5f9a08e2bf5b2a58f62f0af6b8773f88e50f658ed220c0134e83c7031a288eb50a8a35016d2362b431d809d000000000000000000000000000000000d7f04d4a6c36cb3d105dc3915cd5d57f56692132681b3abca4b00e078c700931848e34ea1b7ec663f3886ff766fef41000000000000000000000000000000000a06c3ac81d6d0466e1ef21115150d04c8bd6dc3e4078e46eab213203c3226bb0c6500ae4fda591d6b8a791de598edb90000000000000000000000000000000014d849ddba2fa79b6a7107efeb46e9b6231d65384c69ed183acfb922d55b790d4fc7546afadc190b76f7da00103ef565efbcb4bad99b419820eec388f6f62ac8d87866d7beae6d431dfa48d4243b4a4b0000000000000000000000000000000014dfcb5fdb38cf09c1ecb284dd4f2de0c3d70f90d7c167a442d84e9a29bf43be62cd319b2dafdb6ead2c6596443a00090000000000000000000000000000000006220fc05c53f48e7e4104422b0660ab67fd88a695a201366de570f0ac0ad30421d5e37a1575e6b5ba35f45b441b297200000000000000000000000000000000077cb8ec1cb83c4974f6452ce0de630afc82e283eeb55d3b7e9969bb44bcf0404deae617393f82ac228b836c3cb6f95a000000000000000000000000000000000e2bdf539eb45a125112836008effd104e881aca397457004fbda4a40d152817801bd259434481f0509ab1838cdd1fd060d89acf5b49fd1f70fc54756c4bc1972cd8818e36efc37b422ba6a9318fa134000000000000000000000000000000000a09843630131cc6feeeee8aa8214408235655e4733badd6fe20c5cf1e45f6a61a5216e0cde937799437962706d3bfe2000000000000000000000000000000000ff518501614ed4a199ca9e9aad4e8efb8e9cffa9b4fa683093a49cef4669198a7893db998d5777f2cc8f4bb130c84360000000000000000000000000000000010ea66fb5224f4508ec100cdb611be133c4895a8de1b4c475b097494ff0f1ecdc1bf8fe467c630233cac2ddc07935fcf0000000000000000000000000000000009d22c0a45c82b0a19beb94eda0b93cbbe1f2e5f2d61279e1e1c93ba073cb766f5637195e6964a4814e588e44bb03f03386af376b9b393dde994da419d1f7aab60023546647f7b069ede939386bd6ee80000000000000000000000000000000015ca795fc7f0d169ba8abdafb1dee80b67e7dc616e824959f84c61284d6b2e0e8b9f99b414f5bd96d0e59b66ee706fd800000000000000000000000000000000042f473d1fa228961aad526efd003461935954abaae347dd6c9bc7fcd68b5f5138e57ab2a160cb19d1983089b58b51ab00000000000000000000000000000000188eb160cb968b4b048ce14bb72be27c228df1a6c014fa7dbec09a30aed8c71e8da59d3d5f8073b6a7d70d94c0e59dda000000000000000000000000000000000d467e6b05f033f3923667a82d5b489a5c90c99c5f68078aec700fc67a83d9bb4c09f3f00b9fc2cfd62bb098f885fe295ffca78eea65c00e1128f8dcfc96b39af1c4472b461ba5262307003bc972023d0000000000000000000000000000000003bec45d94f3073b2ca54d6332d36fdb8f5c801d9f70ccf6e3666b66ee06c0fdfd741f74cde1997aa205fb0318c9c4760000000000000000000000000000000014009b777b660264eedb35ec2e13ea586aa9438c47b3fbfd095ea3d8688a89c85bb4052bbd3edd450c19acea6372d0070000000000000000000000000000000017f26d3cfcb40fd6b4f3f1acb6d47a9b54c232aee484c7a8992a3d1accea794dc384fccefb0418d43e1fa7b399bdacaa00000000000000000000000000000000153c6cafbff3c53114c96d8caeee2880dc063d7db5edf5f14157117387f368c76b739553542bf6a9bc4ace3694de885a92837b4314e63ef5a153ea2ec4bd373cc3cecfa3e892c3a12aaac8ddcaf5905c0000000000000000000000000000000005d2481438c03493efc9f1e8e9ae6ab05b7430f7fb82e108aada0e886b14d769969d54b17b31e5bbb63d40836748f541000000000000000000000000000000000971deac599b2161a4baf1178feb81fd4798ad5cb063b1a0cbee7cc33b8fcec6c3f43d1d46d9ed45555187db636af99e000000000000000000000000000000000222acaf8df647744859e04104a5fcd546949feff6244e192a9031fc838f368aa465a3799779c637ef0087183f30731d000000000000000000000000000000000b8e8f1889816f89401b070db687aae47f7264c9be192a8d6e485ee71a5a688070d57ad8928d09d9a4925f1050e2c69e127ef2309c699a3602b0d86a070baef0eef90f539aac3cb6ff42cb19f284bd99000000000000000000000000000000000b8a5b0dd422469a8d6d7603e9f3179f443ef3fab0016afd94e93e2ea9e84b332da4b59f23a5257b99460efdf7d2aca7000000000000000000000000000000000c28e7068769c3a79bb8d92c3b89eca5d6eb42e3e18c2a7154f43a671f8670f878c4b110990c2e2b163ba4d1155319fe0000000000000000000000000000000001804302246fd07d86f4bb23f610af38deba8e324cdedbe5e61cf0941281cda8fb5dc211fbc0ce6fddf30aefa9563a0500000000000000000000000000000000015813fe0d6bbcfdc8e7e40b6141db21e1b490d846ffe82eeb3edcd9a024315193259612155b0179a4971e205738af74ba0f9a93c2fe35877ddccee5da39ce5ae60a6a19e72481319e3b3fa2eac614890000000000000000000000000000000011ac1ea4dad0f650fe0844ac3ab9434ebac6eb70a5f77c8f9c892cb4cb06639a15c63a9b820ef8f7a720040ae5b9e49500000000000000000000000000000000117da7999552e7886a25a939ada0944cdb15b5c468e9d1c3bf5b6af920e470bd648d24f3cb7f91e670f57a52cd65f7b3000000000000000000000000000000000a24147ef5f2b8ad888899c1db8df0a601eca9d76f1b934b1627e7eef3efe542f51205b96b5c00916688579ece81336900000000000000000000000000000000151863d964b12287ae4278c905341124985410f1ad6a72bd5c62230b7d8b0cddbea0c62cb2a7147afb5bfb03348be53363da2f227d636f10e814e360c2156e686e26ce3401dfd15f47c4ed277d05353f0000000000000000000000000000000001d32ea5faa6303c530790146df7cd5cdee93c0933b4cbc1c2b8030bf0a8d2600dba1907df1756152625cfccf8cc7fa90000000000000000000000000000000017b05f549751d090f42ce8a3ac5d959cf988ecdc485f51734d52c40a3e22a097917345978209fa74a0a05be0a66e5c6d000000000000000000000000000000001481fab7750380626b174602d9fcbc97555c516f4410193d2849443cf25ec22840e4fd00b225f98d81b38619e8844ce90000000000000000000000000000000001d56434066551c5bfbaf8c9007874abe57a6f78de9355a297bc117f2bc5e6e3f44b248037f400f7caf83fece0c00ba0ef79e3b6ce752d140c3dfb2007a08221d989038c921efff3bc4e150a6155a33e000000000000000000000000000000001667f1400973598ad3f56c2e49dcb5b556cc38ee3e5801ac4943f3c4554205d8fa69831e582a084aae1ef584feb0a1880000000000000000000000000000000003f0bb26ea548e498f05a5bbda8b8e536613f10e7165607ab77565b193f794664c8ab0a5ae2368d7483b77bc1173d14500000000000000000000000000000000176d8d294b4d975629c6a89bd6d45f9c3924a621259ab43d33a3d5aa1f423b68e3cef96dc103494bbb9036436c170f5600000000000000000000000000000000002f8ed87c584e69de59cdde02b6de9816c31a6efbebafb6ad9cecaf266f5bb9c8880f062dbc9235c91c668bae5051f4bc08091af8b8c6ea5c26f1a7d795132521350d774042d3a8c0523e86fdd23a3f00000000000000000000000000000000085fee95b859c52e44fcb2900a9aa590b1a5c2f981a388d6ad7b81ffbfe033f648c4a84e2119cb0484e178ebd3e220d100000000000000000000000000000000171e6ca074aa97981d2c2ab000a8bd12cbd5f5d574cb83158a6ed734e8f9b7aa4b74aaa43b7aae31b3f4fd3d82fd30ea00000000000000000000000000000000004fe6099a52fb491a0624a8d787d95617f6c64d16d20d1b3769f60d4721f7af66d7e3e905b3e08b2946ef7bff4806ed0000000000000000000000000000000004d3d1a56af91377ae6b00e192ad64fce6dd43a37592fa8706c9344b3d96b1f930e03be85a5ead3007f9016255d2df7570363101b87d685aa7314f6569fca0775bc6aaffabe136e6c336e8fa43dedb8a00000000000000000000000000000000155830eff04ec2f4dfca4f73403e408a68830bc031555433fd38ab3ce1035b5f882bcd6032aba69ecc43625546b4a3a8000000000000000000000000000000000ed5b698b1ae23769cf5b6dc2e39f8500fd8a881eb43452d67c6b84ef9f0b3c7d81db1909b646e92412acc7365923a940000000000000000000000000000000009f28ec2f949cddee9bbe2fac12c2c029f4e472afa1ea56d0edfeacdeb9f43a4a43b79ccdfbe8957b4cc16bbcac1857d000000000000000000000000000000001474b435131301db9e232ddf54569ba99bc476200ceefc15e4aaaf1a574c1de8bd2d63c8280e23127a7a036acae223b1997ff3852cd97c3a65bce9083ff66197fd5c70894641195514d556102f091e8800000000000000000000000000000000168475854829d47356d9a8dc13a94e8d169771ea0070d9ef45e666d5378dd676d603c2eb57a3cda072c11e0926b02d650000000000000000000000000000000008b493a9f4c19831341782fe6285db2f7e8250d72952351ddcfcae6f22a2ec0935e29d396ba32f72dfa4067d0e7ce7cb000000000000000000000000000000000d9e72e22f2a1522babc5f2e8dc7857ee690f60f7843ffe15a080d56bf63db86f124cac039cbfa16fc8ace4d6268a1180000000000000000000000000000000008f3db1f6c0e5e7b3bb27abd34bd877cc3c373c681a3abc88eaa91636924ee477ba5032801dda091dbc51936a90c84685ff95dfa306f91196849d752569b35812e1db7946708cd06df9db9ee75447bc30000000000000000000000000000000004e34bff7e9e3ede02df950aa0e8c5f4c5f85cd3be89d211e957a7de95b8e321cc11400c3dd5b2ba0d1a3008462cebe7000000000000000000000000000000000fc1047097f01fd2079e6357ed379ba39107ec41ed6c6dc17fa6248d52be2b1cc2593c9735a6cb48e6d6e0434028f755000000000000000000000000000000001896fc5e990aeb416cf21ccc73f02c41d019d0a2679bd533d0811b7c16ad3ad3a6988170fb2db030b5fa7c3e4df5acf4000000000000000000000000000000000b70e14ce1b54d7913b9f3782b2b8ff249967a6b871dfac7f54f959954febb2783cf20e20d1710e5526ef8aeafecb3d603c4308f0467520343825a91c0421f9c9c9d06957fa2fc051970f14085339e26", + "Expected": "0000000000000000000000000000000008056d4dfcb593c10a877cc8a4accbf58f360256b76876ed2b33a07be3110f8e295ef459dd6fb10d12bd02a8276351f50000000000000000000000000000000005686da1a0da89074c6b13fe9913f5cd49e0ecfea46e06493510625f1393ba4cc2e13f023fbc7ec2e130bf9a4f7483ef0000000000000000000000000000000010cd660001f65876db5b2cb1a56d85171d4cbf037f3bfb0e01bf4430c479237cde5b6cce5839a4fb22b406846e757868000000000000000000000000000000000809d7711211d37df76cd1cf71001cbf02c76df67c83e4eccea3e05b11d196b5d52ad7c3d0a00d9f0ef5b018717fc3eb", + "Name": "matter_g2_multiexp_67", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000005d6cf50e3add0e5ac3016b394ec363d6145ed66ef56b07bcd33c90600e83b4277558695222062e02d1e2b0693858e73000000000000000000000000000000000de8caaa810d4ac39258e3d1656bf7f2fb7853a5963ecb989346abe90d5d35d3662f6e283cec7bc386a6a8638ac395ed000000000000000000000000000000001849ef86eec16b0612f214c5ed52c0d50a90bd65b623402879f2654fc578ab680d49af9afdeff546702304597a20f1fc00000000000000000000000000000000168707730c4e74eaa4e85e48e7239b9ba3e8cb74c24b7126a685da0fcc963b9f9180e252adf7d8c521deb1a2ce0099582849fab097a4f71bdfcfaf435994a0c6ac3671a4a9ed0402010be83ff95228fd0000000000000000000000000000000007d4fed2fbd9e9dd19e0af5c52637b2cd337e0bfbcef0384f182a56189a7e7304b9d2144266ffa79044be90cb7ede1b6000000000000000000000000000000000baabe8c23a10cfe85494c693d1b09fc8e43ef5f233052d5b6294dae14b4ff9e5ec240a1c00a16a9ddc27cf7b53bcc7c0000000000000000000000000000000001c595f193229da9acff04ef67ca444b0cec75db5b2c1921502e37eebdd2bb43ef47290fc6f1980abc75ef4c50034df00000000000000000000000000000000010fe7f3110ed3a240366ad7ba31d56ab993468dae2dc1b667a46c7759baa37b865d02834e14280a2ccc062af5bb2b7d6e6558521e301eabf09e80a509b46cf8ec118ee8586f4e46a7313a96dc37ba69900000000000000000000000000000000150350d8a771c79268606d6a5e1c147dc9d92e63fdc60b20be688bd52eac697aa5d90fe1b7b91321b2af87c47ac0d5060000000000000000000000000000000000fba8f4da448b8f2bbd99014bee2f9c581f2a974bb0b54f41a84a7fb359e9dbf88ba59a705504140284d486241e94e80000000000000000000000000000000003bb92d6a603bd93f8e987071a7385de68d10cfbde389eaf01ba6480caf1ad8aea03c84d1889b7d5b5c5f72e62a2d75a00000000000000000000000000000000193342a9f15109367030724946342e564507b26971caf75190e0b209e429a948d8b21ca16041a01010b68222db66a16b8f2f7c525fc0f353700fa823a5d32a93189699206c5ba5ed271a158ebb47674b000000000000000000000000000000000bc4a46eea57231cc64758560e3032a8ad8f1907b3cebd7a8faeb98c4216cb8a0c8fee09929ecefc4bee7955f4e799ba0000000000000000000000000000000009f9486257ae3f94a2ca48eb203e2ef44ecf866ddec7824e1a4bb3b89b320c38b3c46de8202480628c53c415433383a3000000000000000000000000000000000d8e2b5d0825b11344d16dbb2cc614c6b84eb1cb43f70d70e272123867b731775b429aacde611318b2700aa567a84c7a0000000000000000000000000000000007f720929287a70873e9f2f2031b66693eaa6e604668219aa5aff3f50e720b34c5fa3f5c66eced5c3e86e8b34a81b984c7e8adc0f0a042a32c733b5c3356cf4a7d648be51c1d78534ca65dd43a0c13e4000000000000000000000000000000001537ed68e203e56f31498efa314322694ebd74cd1dcc3145d534299fbdadd4256f20b9f74b895931a60753bde6ff9030000000000000000000000000000000000935c6ae847aa7f47bf427988665e5e18a32aa869e196cf9d5bac1349c650219a8d20e01bd8d49bc7e4bb8d464aee84300000000000000000000000000000000013e0661d7254428861cc3ed47c3fc9daae8b86db35d1c64f8ced3bc18a89202825f13163ff94ac0ebf046a0a99727e200000000000000000000000000000000039a6b0b2cb91e460d50eaf9600c29fd4f82a81c283ba4fbd9a7d103efdaeb1e82947f5cc1a7a1112ae6344c51119201650081a6720845a20164ef7c06ce1e73286a32dd64efbe57fe46765008dc9dd500000000000000000000000000000000071a6b0267806f2b9e0ba493960fe0e43f135c739a54c8daf5ef9ee348a281f19876f80c0dcea59dfe9457b49809c12a0000000000000000000000000000000009ac83690c30a4afd78f94b2493674668da4efc84007d2a08fc78bba271ed1f43e2a9e5909149bf0811c44dbe07c52f9000000000000000000000000000000000f5d523612fdb2e7dcf5da56720057dff6b0b80707cf5924d146c0c072edc0635c73fb04256e06c7c9355cfe77a7af0700000000000000000000000000000000168431fc569869ebba9b4a72371e3df232545b5fb95778baf3d9105930d9a89b4cb7eba430e9162a5589c7465e54ca3ac067d18b95591f7f14261f95513e1990f5a4f6908f94a015a93fe379726d5120000000000000000000000000000000000ce836522b983fe3ef6a502a0de4c599fad8a36a60d914218d5d2cc4d56d69eed8d27b2d50899639d1a0ea9dc7597f900000000000000000000000000000000014110ac048ac4c20e53f2214df8c06d77f0b3150077d027691cacd3715d4630a387d5819ef58eb1bce2e8669be330a3100000000000000000000000000000000178e5cb42f56df2f1b255a028a00df96c02eab0a79aa0ff3e9772fbe3eb62174728259b3a15e356e6d9666eb65fd6b7e00000000000000000000000000000000045197f136649b61d6e0e7b9a56674e769e2d26716ee7a63fd2b83b767a9ae96694e9cf81375d0377a1b27ea6dffaebbb448bb01a1963bf74e0fbf99329005af8e932074358d855ff43c213e02bf26bd0000000000000000000000000000000016a6a58301c243b0c59d6934bd926d6440b87b49f004f411ab0fdd924480175052f63f594c18007359055dc776e7f2d300000000000000000000000000000000176db4845cad46a13d9dd0f4077cd22b3458f64084c7325e9885f8ca341ce3ccd4f634f41efd6a70f16e1f0c9ae103a900000000000000000000000000000000068ba68f652c4f072a64d56618f93a1e148274b1b835433be878c06e11f65ff45b7cba0f67fbe80327abace68396da7e00000000000000000000000000000000047a699487964c98453207c98cc91c980c1ed37dc26e17748e6ee88e5f4c0ce424d87c82ca6db2264dc8aa9e437a5f25441fc4cb1ea8f86af8839aa40c35c0706f3a159b4bc902347009f744b73cee35000000000000000000000000000000000bf7e4a9751d4e3baa7ce9906f4378764e5384136944f6d3f3074dce66ed017759783c64fc381f0dd7512d6f6e55b4aa00000000000000000000000000000000006ae2a4fda156818cb5ea6120edf7ea39370eeecc3f306890f47a6dcfaffccbb69fd21f33fe491b7065838b277ad2b2000000000000000000000000000000000d3ce00c2f5febfeb232dbbb74fb0405bab86474d1d9c545c93b65c7892bdd58aa56225641074ec9b428efd9063085d00000000000000000000000000000000002552a8c1848fbefd6b039d6c4bd47c34dc34ab307163c4f6d337946f1d1b41aff2f7e37f5fd94012f0ebd21f97d18a83020a1ab853ef2018976e43cce2724105a2526b28d23b0226c49ff3d4a03d40c00000000000000000000000000000000105320cccd67b6ea78e96e66425a10a6911d2d348fac3231af583146273609fcd7fd27a19d4614fbdf05bcca0f92b927000000000000000000000000000000001204229ee1f66fb5a5dcc4ee978327e35d703ea310901be9c100af824e39d24a028ef8fce42370e5d734df02a26c145e000000000000000000000000000000000dd21f31f116681c1810bc36141cc18096cc113faee7db2c189abb7a746e398e272fa0cc61286aea0a5ec4008c8d03b60000000000000000000000000000000007911297718e98588844b9022c825bc4b37f2af30e1fc2d9cfb58b4500dffc8e9949afddd051e971fe78d4e1e7ad1b4a82702398b8c95c3a8cd163a8a3cb2a7a04030ef99404c325115e9a9312e8c1bf000000000000000000000000000000000760787190048e6ec8bc3bfc368f010e2f8aadd53164693a62b0d7207575bb2597bcec4bb382c57fe9053e90fe2f7159000000000000000000000000000000000ec525abbf13da64a8093c5d3fb800440f4c1fe798bcc71eb97bf2e0aa9e8be4b08afd2313f9143260058132d2607141000000000000000000000000000000000aa12c902084eb843daf7b351989bbab7a86acb62eb54eff0c7599bacaf44653c9fbf53f47f6ca72d22ea1671842eca800000000000000000000000000000000082f330d9a693f2bb9386fe5274aa79ac73a17688821f3c705120fb2aa76903627786a8614053f21a93e0aeb555de64e338468a325384a9367c90bd0450816a22849b845aadaf187c27b3f09800e791b0000000000000000000000000000000002ce7f08b8d5052d8bd07090744ca067700eaa1db61dad3e5086661850337bcab485c15fdd36c309a9e5169fd2a2b55e00000000000000000000000000000000073fa834cb4dc4ae120e738059749bfbd86b9e64fd71b1d372dcec8474f3341137ce8cb97a38955e9081f9bd5e07ab830000000000000000000000000000000001568df6806d8c3cfc9231802ebe5edc5d505198747a0adc24d0ac59f28d32b7b379d1f2c6b8352389057c7465692ded0000000000000000000000000000000004fb4b08a4fbfe197e924be3f7213a769a2bcd24109ae69a32a197b6212c5f50dbe8f46f5ab6044a4c779cd3e09d13bdd29136cbc4764346e7ae1af92fe64560f453821f96f32a42a2006b6edee75021000000000000000000000000000000000c07ff656904a47b0c7bf77540abc47cc6eee3e76b6ff0983151de9468ce3a860c427f3d5d489d096264159ab0567cd20000000000000000000000000000000008cce094ae1d9fff246a0e76cd67dbf9808c94554372fc4aed4879487ef240e45047dc201dd8bbccb613feb9c4623a0b0000000000000000000000000000000008a25297940a1bca1267fdce450b0cf43105eb4a21ab14562116039bc8379b1a3f58a7c117e9ba735bdec40f772465300000000000000000000000000000000000ae17a9b1fc3b0b7803ef48cb26643e8e78ef133f94bff5f87739182e662e2641e72383efab1f3ec58fa20fc816d56c675a59418f1462247d3bddda5937553e96d854b5df64a68145a193b2b1a7eb250000000000000000000000000000000002357e5a04b0dbd7f9a1709bce9b7afa12b10c7274b440b4dc3bf51a801d483804b1b4b9a096c3205a0e2aa7c0100c6e0000000000000000000000000000000002ff20af67f126c80293e44bb3c9ac74a94586a2de4146588c7ee8503530398eabc30f7e89322727739618087fa55de50000000000000000000000000000000013c6d06ce509fd557946479f2768f62474e6db04b2c92c5cfa86c023f79d05a387bd4c9aa618888476d4ecc93ba0995e00000000000000000000000000000000000fa477870c952f7506b879b17fb0a1c31771ee832ce0ab21a513fdd91b7a2a78a03d297c55558b834e255462b15520544a345719b40f973398a6fdaa2044037cacd7f6c361921c62053cd51f2e5ff700000000000000000000000000000000181336b8fdc03c02e23cd06ac975855caa2bbc1fe78a2fc7a9d0963c90a1f1f9330d50b88bf2526db6132d336ea5b8e6000000000000000000000000000000000f2d94d3fde2c0f67dae5a6ac12f713ccce2621303762e01961843eb9924d1d3c732b4c977d8cd0e5668adcd7dbf7dcc0000000000000000000000000000000005ac9ecab11c3368c75b0d396889dc34bd43ccf550d817c1dcdc7143c15d5c0e241add37328a7bd8556fde87d75d67fb000000000000000000000000000000000184704eeebead43f85b32d7f3efb9b9469f3ae10b73a2f034bd33e6e66da0bc36597d8e29ef5585443a655e24ffb68fbb38b4cd72eb18c3ac87860aa58b4b439712562f742f112b5d769415e9c19d0a00000000000000000000000000000000046751743f8f747e378738c265c1df3a368cd9570a2bd7636991045974c34039161fb0eddc6b813003e0908915b402170000000000000000000000000000000003341bea6cb81fc5e7baefd386a518d17a6f752c0e1ace5a9580a1b1649f5501c7b4639ba0cdbc33808d78b025a31f190000000000000000000000000000000016e3b9e8e189df73574a00a721440379589a7a6df09eca9a790e04c729400323b2110f63d547d83664c35227bd15b5760000000000000000000000000000000005ebd94e4640344e99e7e0f1619c6288665c985b90d99921ee61bbfce921265c4881a7e1034bcd840a665bae44467f5a94a849f6fb5a53bd5957e53ade1baee05702185b4d0fbb7c1cc0f46cb75614fc", + "Expected": "000000000000000000000000000000000d993522760839abc960e99d62dca1021b52ddc8147929c4a064ec72570ffb3793205598cefab8490446453fb6da231600000000000000000000000000000000105db1e83fdff735d06d34574f962e70d84e2c1ceef4d8a8f14c2673633d7dbc7b97ba6dce9013f06fcfb134ffa2ef98000000000000000000000000000000000363be663cb0d36b8eb076df283b075ab9e568e460be804f197c51cf7ef611d8783ced304407d4c2540f1a4a04c18467000000000000000000000000000000000ab2c00473a2267682ecb356422aeafc893fab96a3bd27ae58d9b0786624c8fde446cf68bf8a003d9449702e345b1ace", + "Name": "matter_g2_multiexp_68", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000000a575d896b06c5ebd7459a70b9321cd0de082dce7dc0ce7e39581751d01b7db810bca80f39f521df0bf70ef642bd66a000000000000000000000000000000000ab497a9590deef40f6fdc0d4db2ae7b6ad9ab59f112a5a0671b48581f1f2b6a71602c73784ca6c0effce66a0a9c6500000000000000000000000000000000000af3812439e44981c91633f73d1a92298ca1ed426c98cfbdb50643cee36affd5fd02886349aa608f4b8a27452a51a96500000000000000000000000000000000013126db8b642d33dd988b745b07084ef86a228767f7e8bd45aac830dbce4136ca5febca5fda9644d3292203e27439d9f5b9d270fe31c772e9a0bb409d9f08a07887f045f906f30e2653d293b6c2c277000000000000000000000000000000000cc12f75fe5e6d6f082f9977dcce64c7858f3b6378112e7e083caf0c4b33b5811d62a1130c595937983905fbde8db1fe000000000000000000000000000000000308b803bcaf4f63affaea0206aa9f4770c21b4d191890602bb4151b80fdb42af0cd9f8dd2b1a3adfe28d0e49712d2290000000000000000000000000000000019f83af5cbee858fcbc9bca0f499222849b9e80dde7ac79b7c46785a484fecf274e0d4326469eca647cb223068a183d8000000000000000000000000000000000d0a8334171571bc63054c032299824523bd2476b1150a67eb17b84bba01d8a65295624202c3874e0302159951734702dcbf4fe86140c50618598be9185830bc1da11429162afe0528f00eb6698ec088000000000000000000000000000000000141cc01094391887f46391bd49fdedbaaf524cfc94d741cc7c8cf081dd7c425d81ea3e407be48127550012e39d2b0580000000000000000000000000000000014db31972eb242d6c2912b418ddf416fd7911f13aede9194559b05d1c9e12056deaa1e56c155cdbc231b39f4f9aa91ea0000000000000000000000000000000007b361beb6c156b5c8b92b489e6d6c05e32a4376d20ac3e1a54c94e678c88480779bb789c3e1ff7a021aa6d872c98551000000000000000000000000000000000215d270f2d3c5c5b9fa99a873fdc337f4edad6889f7a55556d8ccb5ee86b592453b74a720ef6a907bc342710cfd9cf91d7fb7121ef0baa85046567014620e1adfb9e8b3bc95adccbf2e0b0ea8f37c670000000000000000000000000000000017f5d31987655f8eaf046d6ea4025444924befa51c319b2bcb02dcdfde4d80a1c48049514e0b580e4bb59dd2fe40bb22000000000000000000000000000000000141ab771c08ad7c592725630aca0b2564de1ed8759eb3afb10a4bf451eb21d25e8d917f49bd5f7a06894baafdebbe790000000000000000000000000000000012dd82703c939cc5e7dd5bc3b924d744f0ef1a95fd0b9e57617e822e3fdda05b2e5a9959ec48cba0da40079da2253cc7000000000000000000000000000000000c53ff34d875fec4c7095af324d15921cd775873a3ba67740b2c123d6d482263b1cf93585dc810d19c68965cdbd9e102310d3b0535e78d803b477e5dc26c71bb18acfe66bd5ba5892d924d265afd6a16000000000000000000000000000000000a6514331035d42f58abf98b805f159921d8c4c935f88bb5493c580a6ce14a65e243424b41b3a9188e26a7f0c912a378000000000000000000000000000000001351e48b2d3f619887f4e83823dcd9dc15afb2800169ab78a2cd5ebdf25dcb6310f1051894bd2b549e509c55f5286f600000000000000000000000000000000007900972b84b6a76b2e686fa5757e98b8395bfc99da86eca122ce209afb39e8f3b07603cad92623774ed54d637e350d30000000000000000000000000000000002c68c42b3924b89a67764990478e48fc17aad4b5543bd38bcfee34fa1cae7535671f3b885852aecac53a30f28b0d4aa2fc9417e65cb76aa0093a7deb3d38c111c68f461a4aac57d8f09189f94407ee8000000000000000000000000000000000152d2c0e798d85e4dbf35dab808dd29d724e9b6c7ca7f53ffddfe1aef5976f2d3079eb1d3099e91b37d9fad7f1af5750000000000000000000000000000000015059423ee4e7201aa65e39116a2a49ba715b15e4b9547d18a0efd355de6f5a0159bc9047508bd3649407758d62887f0000000000000000000000000000000000e5a823fdc69f3928b22c542388f982f8131a978b08dde80d44e51d9eaed2ac4a1d5fa7392be6c7edfa33e833da4832c00000000000000000000000000000000044285f4e4ce526f96f9f512c5be754e0b0953744dcc04807ec6f041ba5c6fb9d5d395e93317064d50e61aae26810df0aa0b2d714aff175a0be2ba9e675a2be8936c42f15e304a146622a95dd6b3e3ef0000000000000000000000000000000019c457e369dbfaa130ee79bd33ca70d00a3797b6cf62126baec0c5d7c3fdcf5ba7f41195276dc412b6862b71560aeb77000000000000000000000000000000001206f67dee6521ede85573bbd5784d675fea42da16010544857d4e2d81b720b6f85f646fa23540880b44a6cde9a39f5d00000000000000000000000000000000142018ecd7c7acd4f4ae288e1c6a66594f1c7f31bdb9bade2b4dc4c6455cdc685b716382c54d67373831a19100185e850000000000000000000000000000000013b0b57463a3e4cbe063c0d4f4e998cbeb132a41c2877106ee60e83d4ef7d339a5432d30a3c149a42dfb1da9d61f34030227c3510ed6e4c7f84b11ddd2d6caa55e0e79ed59e1cc0cb325d55b5d145aa80000000000000000000000000000000008a463003900194e45fc2610fb461fde538b17c4fd516919000d423f5a1b582342ab9ec20d8eb6fda8fffc6a898e46420000000000000000000000000000000010eef0f7bf73e35dd75fb924bd9759c09aded9cce46b05e5d3c5eb3e93e5d5032ecc459e2220aa529d2f773c4b8b8c180000000000000000000000000000000002a0247f82a25468ee74da555218cdbb6405871f7097c24e89db3f3eab59b91ce48ac06e8eab2c049346436c846226a3000000000000000000000000000000001895b58a50c025e46a2cd0c59d5437f6eee75fac949adb7ee12d455c96206a33ec9ac17d5088fb773618fec131981ab6ad930000a9f82e082d408999b396aca2b0e435a66faba1d95e10fa0abc0625cc000000000000000000000000000000000cb0f13b0680c2f7de522a59f4e46fe1d4af3a64cd3ab97a2523ad3c3dc42f5e6760e06cf48e4db22ee64c5ed8273dd90000000000000000000000000000000016517038ecd2799d787c5b6ee93079c93f78de4a96449bc82699ddd6eebcedaa1d02981ab47c529652cc21663f1a665100000000000000000000000000000000067ae1dc093d4aa2ddd8b7127dc60745ce9c462a066106b099a7a07525597c72e4920bf64c2ea8a3fef3de51c703de8b0000000000000000000000000000000016374f51023e2448eee7c64115d85794996fadf4f76fd4266c45093c266f35be09e861d07ff194f3d15e310385705f0e1a6799cab8964c7b79b80e76be237ef49c2bdef5c99a38ea873af6e9d49790ec0000000000000000000000000000000017479396aeac06bd624a47e75b066d6daf5a37dbe515650cdf3e16be21e7d3a1f52a695c1c06382589eb7fc869c7d9250000000000000000000000000000000015c31ff36ed4eaec4d3927e62c111d062236e19fe6514236e6e3f7ff05ee96e3e4c084fcafcd21049a81faa1f84b7e7c000000000000000000000000000000000341b440e6c6273515fa7940d2f77018169bf6362b70a7b0cd6d66cd332ccc30e3ac48f7581edf47ebd137253a9c1369000000000000000000000000000000000cf424de046252efea9320b32b79bdab58e0e04f2916b4e8ef475da7b8ab85d8d5fc793a45ec6e6c035b6331a895d3efb206dbfd70e4b24bcc09ad35ce7b3aa62d17f18347f2bc5f15730202909c93770000000000000000000000000000000007c9111a85a6acb851e9cbdadf182096b720913ba3fb357dc2cbf2b8e796e9a8044b6df3ccadb740c73a16c3780c640b00000000000000000000000000000000059543a955c84a197d23cac22e15d82363c881026e41c57ee924da2a8c044f3021b29918d1db7926ddc2fc7a662ee7ab000000000000000000000000000000001355d8bcbea65a50c9b6ab59881e48e8e5f5592cee6aa69d5d01b033a84057cb6e74d911769bd2ab5f9722328aa204640000000000000000000000000000000011232571c95d0cbadf8e70454c851974efa4b326370249238db159a1224cc6d34eaad690e1840ad887a875b667ac1f193a607a7301bb7dc5b9c82d956ebb0bc54568d0654d725d4d5f13ceb6231e862e00000000000000000000000000000000088b7cbecf91721e01e5e4a08ea3b261febb58cdae3056d9316c3840b3e5720a289739568bec7b899f4b1f4f5372013b00000000000000000000000000000000001f8835d4b0e3b957e46b718b6bcd81acdb50ab85f10bb70c6343a23970efbe72bef89dbcb24d66e6a6be3eb55665a200000000000000000000000000000000046500afd292a31bb5a4a9bd7b5bd0fe608bb1265351edea69162e61f1623cf58e34e8e1a8ec58ca166e8203c86f84c00000000000000000000000000000000005d6cc367ff9c88fc8b6c35383f147b4f9e3eb21268a5a7405794441d449b3e1b44c8f66e30783e5f6c3567adf0d80171231e0fbbc2d98bfd1039a889acac471110d568b0a24ddf5eb3501adcbaac6fa0000000000000000000000000000000015bab57412cc5c7ee0147b0d2511b7836a14a82df06b4eb2b1baab102840ed04cad81da6e920ee000751e0727091c1460000000000000000000000000000000002f725e61e82980e6164cae7a2e30a36dd7245402f4933697607640d53fab2d5db57698be33a0c9b5dda14aa846db7c90000000000000000000000000000000007fdc589448887f6986efd817c63954d350511401333cb0df89214317dec0a82b06259ae9263f260fc7f21f98ad2630f000000000000000000000000000000001324e3bb46a1c69fc550fa8f2ae2d0ea74bc2d7159bed03c13a9d232233449e271ad1c3922dac5d84aae52606f77dcc0393c5c10d4bc4cd1567bca6960051f818e5c53704ce44dc4582767fef1092a870000000000000000000000000000000010adc26d73007e3b1cc58684fbdd7d197550658b4c66c702e9cd0f4e481f23a26c94c6798cdd9763110eefdca3d802050000000000000000000000000000000009138258ad1bdf6f9cdfb943fa32b42c4f1d834be536ed365d00126227c78b0df2776610fe5cf66a937cca3e0b088861000000000000000000000000000000001991db3a35bd2cd72377cd459502a84315422bed92890af906fefcc0acc4515fe7cacee1e4f360ba24efb23292482b8f000000000000000000000000000000000d10dfb682ae7a78b23b37b081efba32ff2011fcdae7b0f8a794a6ec33d71f5d6055f93e3b68a37086ab190d7d9bd7aed412195e347b680430c4528987859a1552ba8383cdc075c437ef19db6eff6e1a00000000000000000000000000000000182795b905320ee69281de833f37e040a3295e23be05ea7ae4563bd49d8b1fb02e95782c5c19645244633951cc29c5c900000000000000000000000000000000053368ee1412723b5c6465ee5ebddcfc00812e0e12e940f8485f44bce475c8897b324eaf7e66c0351ce9a6c92758c337000000000000000000000000000000000279f26c1e76e5f5d0fe1240c0956cd6025f6520ec303feb383b69525ebb6b2f199808a578a91368c3881a4044f37be50000000000000000000000000000000000ba4012c24dfe1038ec4b4565e1b321bbfc174cb197f0b0914bf1c126bdac9f423845f6742129670b7f3dfeaaa62df45b6701bc11c1ef3c9389710e4dd090e3db481c5400ecb91655c20694207a71f10000000000000000000000000000000016c27a3a950fc4857fc775441947f7ac02af9b3df6422874507b11f7b005c61d7d6a4a115d3759fcbd64633a8ad95611000000000000000000000000000000000e92954034df4f15450c32be31d4e146c4b0014a2b81e2afe755df79aa962afb05ca4d03577f15980fc6d8a34f2cc50200000000000000000000000000000000032db3e3c3617c16ceb1c8fae83e806744ca40cffb56bf9b79997cf48c55e5fea89db43b368cd922cd7ce30dd3984d82000000000000000000000000000000000d153fadc3854be49b2376ffcf4e5a46b9dfb4f54e580986767db13127e2d4d10e465f1ca932d79ca90f1971ddc0993dab45b07c059738ead9709bf36ab20b09fd3368f7aa12c6d9f3acf3f145c83fa5", + "Expected": "000000000000000000000000000000000e1968e131e25d3f911284c369eb63aaf264ee82f4d9bd978b7d02470feab68ae82aed8509ffba875798a292f012c9180000000000000000000000000000000011488365570d9bff018ce6aa15e3d7e078368f09873ed5e0b827d1c25ef369d6571899c8df38a3df3135d0db814c87a700000000000000000000000000000000161973f4949bd72b9f010f017398778e0d7f0c8f77e12a87db1851af516b4540e3f4df314381f295c4d167fd9ac091a6000000000000000000000000000000000ae16f0a4a597159195aa47862585839485615095e538b745c1081ca73f202115a438d279dfa45bd3aef8d4043ec67c6", + "Name": "matter_g2_multiexp_69", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000046eea8e5af344dc8600ba7e506e923f6c356f7ecb3b78bb3805c4561e808c1f570e122c4fc5a1fbe433b48ce0c15d510000000000000000000000000000000006f1ab405a46c825e104bc963d2b2f573f0d345bd2b08a952d8793c0297dce267a754b802ded4db478399cfa88e7e255000000000000000000000000000000000a5fc4a09019ac9649c07b623d2cbcd9f0cbb89d28c01b170b62544d8da8ba3f236ca3172ac754175a3db85d9b846cfd000000000000000000000000000000000f7580110db2549742f69bbc2850e4ab35a6e415bcd1b06220b9b009c1f4c99152289eedbcba2aa653f38f6b8460386b3ca13f8540eaf45ffdab5182883d32a1d35e7cd956092221cc40232efde6cd1e00000000000000000000000000000000026907ccf4d501265cfe67bc1c0b06840e9dd94a614c873d676b5416457d98a1dd744322887f1f1f86176b11a27d2830000000000000000000000000000000000cb08e541a5b32fdf51acb28ec64d3ea542c7bd75179fa3f74e9588156815bda9d027dcf5597d714aa001b2dd8a9553c00000000000000000000000000000000103ac1c03c16706d5936f216a6445577c96acd3a00a3d8a9c2c66e6ce568dd84a4c4db187a5fbde24e6ce60e037f53a90000000000000000000000000000000001da5cedccc02d0f8d1dd7e4d81c3ec47d432e81e941ea1452b112eaf40748a6634957c90f32fb0385dc5d642bf65acdb3c8b045ef559b76005875bce09a66b36f295070a73ec8dc66c86bca51fa5d4d000000000000000000000000000000000a0b8dd68918b58ca6b113e938f8a00b2595351777aaf32dfbf703ef3884f02c798f1b5bb78cfac32f196c1fe88aecaa00000000000000000000000000000000121a4104e374566f8d582f75a3c9b70f09628f116b7ab22679ee13a1691b0b0bdb0d737833fb606c746fafee5859f1ee0000000000000000000000000000000000b8bc89d718572ebdd6e3100769f2571cabdd79ef5ca9a4b9bbaa432b1a4dd752f9af9d2a9b1f1f32d76d4ec2d1636500000000000000000000000000000000129f1d760a12eb1a75fec1d2ca438189c933e87095b9fbf9a0371d64eb205d8f0932fde9ee2ab9f36f8b6e5d4b5dd31021953ea264f74bf64378a339461bff41c5193e17913c67be7e2a249c9737b825000000000000000000000000000000001499e5481ceeefcd2ff672df24e8987fb60872ed106c496178d71c68e9078409a80016e1f9727ed0d5922c93e821dcc80000000000000000000000000000000007bfb606c005c7da6b4ce2d974f9fdb2e3710c8f51f18257ced7663cc341ff81fe2e46308a2b62b13408965949a6f08800000000000000000000000000000000003fbd951e860e3a4724b667427fd9916ca4ba511a0dcac7b1125b14d8a4f4da82ddc0b0edab8ea50e911b0fcb5c200a000000000000000000000000000000000b43195a5f0263307e85408ae4eb046e06ddb1295a490ac4e0e654324de53d0dd023b8cc159d86b861dfcfdf7ebeee4a505655d72f1128ac0204539f0d823f076cb3a57a7e74e896b5019c9161d6486a000000000000000000000000000000000743bed2c17bea1ebddf750da504fe120f457cd3b1754c9413757cc48f7aef07eb4fa0572cb853cb72d68427e875456000000000000000000000000000000000102ddfe3dee27186a9484f74b3cb3aa366a79f0d2e36063af6e484f6a459e9168d7a4a6969bb720ec694a52db7ab34b40000000000000000000000000000000009bdf5b86aba4845adf9187ccf9c74b1fcabaa05764e41fcce4b38356b4a0ace8e7b16abfc7f7b96b785ad47fbf8e90f000000000000000000000000000000001934fa903b71d234c4341b2f49f8177334142e7c401553dad38e66a2c157fcdf7637165058955b7798a59051846dfb8cc4c861cde3f445e3a78d1498d98b2b947056cf578652e19be88da4a786af196f000000000000000000000000000000000ddde953f59b8591a83b0cdfce780ec23d052037c26d60cef36522d0f984f907315d7b41c8be9a9632f2b88e0ce950ce000000000000000000000000000000000b8d7bdd94a994901a434e6ea5d03ea45dcdb859e560833d8ea0bd9d20c7db9c16b2427eac27d8f1eb640b7d28a530fe0000000000000000000000000000000017b5b3a3097a74d9c1f1b23783723235b6148023b6b060234dd9e2f6fd05e38668167136c999d91249963e224f9bbcbd00000000000000000000000000000000133da0c217c31ca052800315aa8a3b934fc1f179e6247801904bcea1e28dec0b65632ab2690bcca3606bb1461aeb147b99762c5189cf154e24238e4b157caa1d8759002f69b289cfbf3f24f5dabf20bb0000000000000000000000000000000012778a6fe79b1f2b768432df036543cade95504bb7735ff547969faaa8db84e3588046a074838c9a551a4fb48f4a66140000000000000000000000000000000013288a3413d7e7edebd118463d5eea9f9ae2e10f51965480f9b5c244b05775d04079a1dc75ba0885aaa9e2e4bae1ac750000000000000000000000000000000005b766ad112b8d69f1a28079688942ea146f8f31616611909f539a57c58ec5e857da9fce415d683c1c6dcb5e74da9d17000000000000000000000000000000000907e5c3c83d3f12a68d6bf812e310f5a04f1417094301fab7d4f41007b9d01fc1bfbf739dceddef756417367ed5b1d0298b5f6b43074b8f0807086b03f5028709209310474c35c7ee232eec8579147c00000000000000000000000000000000090be6ce5ed09e45a6fd9ea3a9223fe43a835141c1c29d6b386e085846869f9c5798b80c3bddec8bc15171906dd417dc0000000000000000000000000000000019bdf67eb16f2708ca55fd20af8deca66e2ae270b2f2f9736fcf49dbdf7cee034cc956f6fb799f0e87c12f283a11448e00000000000000000000000000000000124a69c723cbd366d52919a72dfceb7e4cd9ca5b5cef1784bfad3f125b11d810328ea1c849602536af500261aa684f5b000000000000000000000000000000000bbf05318ffd81495efa4f4c271c8b1c669041a6446501788f49b8739a934f09de9d976fe7300b0ae861be567d35c992177bfb0218ecd8cdbc6dd9484e74e41be6971ec2911bacc8b53b9b4b8c70e5730000000000000000000000000000000010833a3e7329ad40c1a8cef296b015f6ac6542c612038ce00f13a99f673783cb7eeb14796485c168d21cc169065d051c000000000000000000000000000000000d3b1416b23453b893c92a6c7850cdc0e4a395459140391b1dce11055da10fb68f318c5561e1c12d991a28f3f544a5230000000000000000000000000000000014721dc58eada80f2d0574fb4e2c1c94c45fbd90c2d2fd666fd618a96f4736a5ecf34cab34fcbdcb19b6cf7b44098922000000000000000000000000000000001905d34029bf84617a956d1edae090853dc1b622f560c5289251447ab6bcea5700bdd80d6ffb2dc12fdf3b0267e74543cac52219796226385aebf9e85f5f179362d4149c33582a97b7d2aeb05a8e6a99000000000000000000000000000000000b4d380f4f4eb976e6121b933be8418c536f85994491b0b93695d50473615e41547ead326bab795d4d59524a61d607cb00000000000000000000000000000000104b7f4058c9b355d38908d715c311a53169b42d2434de0876f1c4ffce1c39603c4876b33fe3076528be15fe42849d3e0000000000000000000000000000000017e2fd647e7739366ebb606e8a326daa5c03cd2b726cc4cec7747cb3468419f1907126d7cba98bbbc659478ce3afee7700000000000000000000000000000000183be0a976dbb3b5385b544c194e111729c7a8d5aa98eba3fe1c0a5b69b5fe6e5d0164e96398cbc61eba5b86d91b3c94e03afb2efea85fcd035cb4ba09977b2e1c84a0d98edf88e9f8d2c4f116d0f50300000000000000000000000000000000023bc7eab817fcb9982cdac242cb6cc0ee1779bcefaecf144dbe57d5ae2b2ebfe9088f39f416a56de4b4dc04d4bbce7a000000000000000000000000000000001318e728c271746905788dd8f5ab22a3a10edce3fa063438e54ebadba22c29e461b2ed78a95a8f26a65b47022291b8df0000000000000000000000000000000010aab000b9c5de56623f18861b343ffa80da5ed4ae0d7767b7ed791bf3dd507fe7286447b6a07ea0fa12c19f2e4d8e8d000000000000000000000000000000000770e2909b5795a08d98dc66389655b1718e70b93c5bc6d805c3945cb5fc0092a5b390e6497b550988c28c58b6e016a3804dec43760dab29c161b8f4bddc52379a17f3168f684267cfbbc3505e32d5f1000000000000000000000000000000001259a4e36f5bce7d5f97184948d57fccd458cf7f2ae0c9e174f537bece01d744fef544447959cb73a678fe2c378ce3c900000000000000000000000000000000131aa575b2b94232e06879fa1f6f145a0bf5dd12456b698f731a72bc587e6def5054b3b2afb6dbbfc34fa5249dc673860000000000000000000000000000000011d64b923596c316b097a0752043efad8b61fbe068c58bec7a6766d9bc90ed965b3419dde3b96679426f72184adb8931000000000000000000000000000000001653af784cbad5a804e3f72716bb51e0c733014d587952c47395f953828566cbd7da811a3da1d48681998d569db00a7bed2d3daf616df3f0061f58c925e9dfbbf6e9cbfd4b0b3896a596919fb3d243db00000000000000000000000000000000077a9ab830f7683b7fb46676df09f72d773b65286c5f5ea86623306e5de51e63851c18d192c4c3b20af582bb7f017ff70000000000000000000000000000000016dc185f4158e249939541d35ae8230fd749988b9174c40c40b8c932aec625a7e94beaef9a07f492445d4675a01b7453000000000000000000000000000000000c107a895bfb45d33136db6251c76dc0461a235fa5d1ba7a5d216bfebe15691261b46c9816315c146becc328acb6b8c7000000000000000000000000000000001151cba240678efe61e3a36e169e314b3610e9d4df6650507f53ccf635d8f1277a80d86baa85a2d4c7e2af73934a7299e16797ed90581fd8c3cef1f30abaed10997f13461374ea649b29101959fd506400000000000000000000000000000000090a1ee6c611980e0421b72a122cb39257dc38d1e74ee41b809ad76e440fe307cf45e79afddd8d40b94382d48cdd4c450000000000000000000000000000000010f2e6e610eec7b7c2b95c1510af1af342ac19fd3b01dddf81b8961ead2cc57a8eca36c2f5747238eded5914e484c52e000000000000000000000000000000000acce0789cfff975b09d687ef79535c536f3b799157d3ff731915ea5b323ddd9f6f4750dc8e00a879d4e516bce8cb3e40000000000000000000000000000000008d8203dd13aee7363f6b10a9e1ae9b713bbc8b8fb2c56f05fa71e8d69ea571384d150e8fd01e855b1b0054fe7967a052f9f29432638c033ca84422b12ca80ac4ae85fa30ff56c913c5737aeb2c84d04000000000000000000000000000000000b332430c518d7dcd120b346440e5b6b48900b5c3656d84840823a96e5bf002816d583a989898cad9e09ba978ebc58a40000000000000000000000000000000004197b43877b833de7f69cc1a43ad8d6d3544cd10d42336d4b19a187f31337a37b10cbf48e72b77e4d8e1a1da68e5e4c0000000000000000000000000000000008887d5dd08f45034584f40a2a68254baf2104f9d6a4c2637ef79c5ff2503c246f7adc36559758a0c07533b66c3637d40000000000000000000000000000000009343819dec1d4569683de4596621c19785d5ed14ba13e57d94b1b1a108aa62cc8c55c58dfa18c06883ce50cc1364b95e6f1e5df7ff90c4a4fb9a071c0caf3a3997569538ab9837ed41d9d0a8d7305370000000000000000000000000000000003fc7f9a0804e7f1664f8cd3ca67b70ba128529a611c24214fd09674072a6b8d652ccd37bf5d4611424688213a41cb3100000000000000000000000000000000137a869cd7bde696035bd9353662e0d37d2aa0731ae55357df3bc43536b9210f360324cbb3670362cf9ef607b1919bca00000000000000000000000000000000045d9d39c04e257fcd912c54e57c86d2d4304e6a7cb95a83d2bff07964d0a5dd8b4e42bdb91a8b245e512395e6749f1f00000000000000000000000000000000120e5e4b04b8a744757812fc331e7c98b35624faa1cbabfc1470e4c0804248bfb0c53a484107a677a7d3f0d2b533e7530cf3283195707c30880e50ff5ef605b561c3c3c354fbe8108f93b36f212f9ef5", + "Expected": "0000000000000000000000000000000002bed414afe9c7a630441e7b163280be10e502cf877e94b6521d14baca0087c5dcdfa39ff4a51c8376d99855e1e6f36a000000000000000000000000000000000dcd54727a7729408e682c6e213005687ed51fa7935c522312793fc58cdb273eec9c61cd8b056a26619fc8dc006b066800000000000000000000000000000000137286f4086763e6ccd5ee82d3bda712b26814a17c6a71006a3e6dbdd919e469bd0e744bcdb2074679e78a1e7d56ee7d0000000000000000000000000000000012d75de1310199c0e556d61d6c0395b406afba0f13bfb37486c05d66b446809e8b1a024e8fd2c55f1b82cf2aed99a5e1", + "Name": "matter_g2_multiexp_70", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000008b83142b22f6d6496cad0dea23c71355e7c5d98659580b5ee6e97eaccb9fbe523f7e3b925abbca3a38f67426f3fb35f00000000000000000000000000000000035f655a1b2d22ea21cf0081e78d7140bad08c4e66dd45230a113ff3b7a77e39f0f1a72991f85e2b00ff58b27d5cb54900000000000000000000000000000000105d04e38243ef1ad2f734a3c97e91506c5a7c5d95e9b8771b7fded8908f1be933a81a5769044b633d501c0df7b5d7fd000000000000000000000000000000000e670ae4af94d0df34a7f2d7cfbfcefa6eebcf2a6b2dc5b82068b023fe02ce8a279e1bb96d905ad4f2ffbd8214e47d702063b046a71c2674e35466657a85d8e02253b42517b033619e31a536659172120000000000000000000000000000000009051f1e636309016c5433cc7eb019c7dbb75b3a4a5b27f6927de08fdd9577e8eb9e12919157ed35bfd6607be7fc4de5000000000000000000000000000000001953b7a33695ede6d0792eba85567aa5052b8a58c1bdc94ee82b5001893c6b996d3e8f7af8b8effd6cf50656d8b85554000000000000000000000000000000000a2f769f00679b610bbe212c2f8045e7579a96dc6bff80899eb7715aabb1afe79421ad5000f2c7b85d4e0904e335ddfa000000000000000000000000000000000ec962a3d00fac14d05774adc49bbabaf46ae78325083c0020587fb85eb234387aaf6506f503fa988df8e9ecafb4a59992fa325cd07502c6576dfb93ee952fedb304022656597bf3bb03a2bbc471b32a0000000000000000000000000000000006823056a4da801cae430fb9e3a8663fc8f46bb6c180b743b7f9c7c7e3287f3feb1aad4be0e98409c74ff58004f8732e0000000000000000000000000000000015f7a3f692d55252fa5af5ec952f581b796d54089f13971fce2ef9062173664816dd9f37174294ed78681d8c8c5a9cd800000000000000000000000000000000154743c76f7de590a31cb96d46a0ec0fa88008b7d6684bd8f6fdaec70722afff7b6e88c1f0fb048714fb1072d30780e60000000000000000000000000000000006f3191946d0e7c1307a1a0d1ea9a26db195ec98ad88f9b8f08a03a3d48bbff1fa53ffc920f7db5ebd4c65911392bb834484e688799c3f0a3bbe00cec7322fba6245570685cd7df0d744473b72f03df8000000000000000000000000000000000355018079cd02dfcca15fbd2934a8e47c5ee89e679663488499ddd4abdaba7679fb1c9d2102317cf2798c47aff1ceec000000000000000000000000000000000c417d489a224fbba9999300eb65a23749194bf5302fdfaa33ff7daeb8d896e387e56600233038d5c5eb59f644a99b6a000000000000000000000000000000000f5a62e9d711293d4373bec1bc2637802938eb789c828939e6c42f10062ec171ac6110261165bd179206d649713f6fe3000000000000000000000000000000000b11f9fd0ef8dcac2e21ef09846ffe9f5a624ec246e31393b39082a47354fc9523dbd247f0059b6cc740d7a387b137f0fae2ef61a024e4d8c4ae277f6b1d834193df655ffb315da67afa4ee4ddcb7fbd000000000000000000000000000000000fbb5521cdb9c3a69d58e5c9cd7e4a50bf5469bda2603f5119f3209669eb3e374d700f851b0c7ac5ee3cc9de79e6a7ec00000000000000000000000000000000131ccc37581e64f6f9fdf675b9b63ceb67d9d5844bf512166f39b5bb09d8e031437c06b0ca01caae7ad6d8c9bbb9fd67000000000000000000000000000000000531cb0557fa18ef054dbff2e7e994f1af08aaea7557602a26fd6ff539ab3c0a73f1fe841177012dabed4a1223ffb5a7000000000000000000000000000000000a180e7a345d2b635be92888934608e8b6c17384c48c560f4cb9809ff995f8e70d83cd4cf0e96c458fc414e1275d2a993168a1007abd42bc398e317484149f2fa61174243fd1748deec6cc75e7c720a200000000000000000000000000000000125c83184f63dee35ffd2c0c7dad9010cd6a9735675099f24b465554ab3db727ee76b5b7ea603ead78795d33e37689a400000000000000000000000000000000141bdf7e270dcd356993327cdb5dabe38a5c5a9b53470d9a4aafc041c46fe8bc841089e337469bddab5d4f7fd3d6ccbd000000000000000000000000000000000f9613f6d05f38e3073f14d0c2557101a4864a7d6d0b5a2b931d0613f020adb99a1ab2037a39fea6e99fcfb47929827a00000000000000000000000000000000192d812e05a17d22c60b78c53fabcc55a0eef3656f8e84132faf16686ee18ab4d35767db9a384d42f392c40c7b0fe1c0f1525bba87baee35023d0976b4a2d87524ba74158f000e5501c6d06aed04adda000000000000000000000000000000000b6e1960e82586de19ffcf29a8c5f16cf2fcf5286bf42febef832767919abddc655a0d1bfa240cac8fdfaed5a1e8f389000000000000000000000000000000000fc1598454caf04414f1930f711d762f0d72f5cdc7a4053c92b916c742b00dd0f107aee111976c1b1218c4577deeb006000000000000000000000000000000000455d6e9e9bb848e0868c9d725edca1f50b279d0acef8c597927eda72763e3702f46b216919ac36b080b4865249fd961000000000000000000000000000000000174463cc7804796b4a6d8ff28d2e8cfd8361b2e38f368de30166cf3c20c474ea0a1e8d94749fc3e6468924a7d1369e62d3d7c014416f33724acaa46412348d350f93d334588d39c77dc0b8ffcb4cb1d00000000000000000000000000000000144e4b615ddb871bae85484c308423adceb5de387d0c7ffffdd2211b4ea28788eba9bfae96ffc46781e6d6343e2f501b000000000000000000000000000000000046e39cf43fd707ddc4b7ce9a8a22a2aa1e55aa63cae1eb23082f7b4b5dce49f32d2ff887b5108b40f98062c02d5613000000000000000000000000000000000b75b5460db2baca86528569b47209b5ac24930e2545cc6aa08c401a87ef2c4e233de537e5a857e533d0ba0981b24d7c000000000000000000000000000000000018f53b83072fe7daab226c831a89da63a0930ea86e301c97e639d0ee1609e298e2789d1a347bdb4afcd355fffd16d053bfbb1670b7045b6df689871d5d012dc93e8be65faa4a98a51db8501a4b7677000000000000000000000000000000000185b296e9c7209a9abcc3194b46be9a545666527ec9b0634a3e3be579447cb52330174c19e40e1667124552392a7a0c00000000000000000000000000000000158a053c788e5b914fcdcf1aebb4e21cc8bbfbcc20c4d692256b2ae48149f6644e1578f98d58b3e73d9768d0e7df643b000000000000000000000000000000001318ff4150bebd8fa612f4e84f89151d5c56c272969bc1f31a3c1fcbd8ded0e298914e98e1ca48248e9023cd12db0fd300000000000000000000000000000000076555254f382707fdb7419772a4978808a7409f59d1dbb8c9e648372e19c44573f5ce1888a2b570a83afc20e698ee44f944ee8d294d189226a6cff17456e2201d17d4dfcb78f58f8501870377a6e431000000000000000000000000000000000f4395e3f2e301ee3e18df3c23cdd142716c7fcfc23caed924f0561795948b0bfbed948a6f7c415ca615ee0ba4d5145c00000000000000000000000000000000176ad308c7fe8c3a1aa350fa82b8f8ec638f77bc703afe1042a6da22e5385cd8473ad789247f205214c9980532b12c7100000000000000000000000000000000092b0ec86c511992c66f320ad46c9d6d7c82df118a9ab2ce1f2c5611ff4e5cdc9193a39c3fc95f18ddf96e139688b00f000000000000000000000000000000000b4f671e334b7f22bd8d89d8c4eb8a52b04bbd4dd1259cc9caa1872093736680618930f3a469b3af4a00cb6e44b573f27de53613b7a31583ccb214726482b770029c0ed42f9528fa74da7d2d1dd915e100000000000000000000000000000000123b64561ebfe085238220eb1428b3a203acb01846d1e4428f3759db6cff4ed3c1b9d436706f28b77e3b92e2e39ecb41000000000000000000000000000000000ccdf1973693e4b43b6133563986f6c96e2b924895c813f8acdd0f39585e4ee95ef26c0d9d51d6ef88bb62305e51594d000000000000000000000000000000000f51693bd44b12188131ca84801bfee0ca853640c0a8d5b20123c97b369c98299ac04beeb27d75946cc6f45f8a07b5fd000000000000000000000000000000000804c6597810d2c75de94484873a67eae258fcc9577bafa778e13d4814ce099a5684b1cc94e0df5a59acc7b19328fb8bb0a9750cdfe0910c544668bc9b11ecdedf1b757ff69b61fcc838c502c2911bbc0000000000000000000000000000000009b02eea05c78a24adfb0187defb6810116e21894d8782605c1d590f8bdc10723bf71a1e5e5004b181504ac2deb142cb0000000000000000000000000000000015882389195128e20e50ec4f8d278e8b8791e362341be93c475064d640e1f8bb1c92a6c777d666f8644d471409bb9aa90000000000000000000000000000000000d89295f845f989e0fbc6e86e97400b08e39b2968fe6c9a141d1e92ec9c838a3d8e1ada5e44bb08189a5d514ebfc2f5000000000000000000000000000000000dea05d8e6ab50b8f8dd9632337948a60568724d5a03c7914e4a03e2af572dd8153effef1a7d5c2cb27765ef2c17bc5b4aadecb1111ff43894123648eea9e57685dcb7a25553233a374479c24f2f8899000000000000000000000000000000000bacd14447ede6af0e92e19b54c4f5b6ebfb94207efec3e9f385a4c84a7d670514ecbc28ab686b383e239ae7f9bd673d000000000000000000000000000000001698bc92d146049174b843dac8c5dadcee12d1d503b2d0e46ee68139dd43d3aa797fd5bd06e2b214cc9ae3647c98394a0000000000000000000000000000000018d20cf6c84446cadfa1a26192a04e16d2b2a053705a89abc51bfbfa35c2b03cd58021ad95a35364ae1e2da5d233208300000000000000000000000000000000113268e360006294fa0203ce58cbfd05d05fb625e1f9474c96c89c0ec1ea80fe834030592c2f1c182ef8a3d5c32caf71adde66cf749daf69a30f41ca00d251f7f1e93b0e7f916a1ba6b994d946b12ca0000000000000000000000000000000001727b6bfa9c601fe84a65c54f556887c4538cb5383a288156fec87420ae7f15da395886e1ac0e10b8fbbae8bf040f4ba0000000000000000000000000000000012127cdf02ada71f28ed036a417971b87fe443b8c65b7739795dc7067082cbc9f06f7bf10c709969281cd072490c06fb00000000000000000000000000000000134f1fa1d277d01e2811c118cf10e2de6324e2ba14efcf717a03c1a10dca0862ebde0f6328839da63d7d85f573e8501f000000000000000000000000000000000d20a036b715d18ac9e2dbe009dd0063a4b13b3ec6fd060a64c4ad2b98e05e069060179530410d154caa575d504c63b7b2f9b44c73a1a6dfba6462e1202166b63727f45dc3b8b3b73b5d06459a1beec20000000000000000000000000000000000bd5375e7f98d3972b93420a39fd6c31da86d0d9349ac3774bbef15c2240437cc0761b2f1245e805d2538cbca6f778600000000000000000000000000000000100232139641c8cd5bdaa75b77e1e1c8e33b3f9554e2ae00ec6315b82cc00a6a70d576d744e68938a299ee2b451558250000000000000000000000000000000004224691faacb007bde3e37db6c7486aa5d3b4259a24c8b7653238e7522604ef4ffc1eb3cecf719a1b7f52ff00c34399000000000000000000000000000000001156ceaccfe0396374c6dec5adb39f14b6f08a32b88ef7499756f5cc324a9f1553bf5dc106a97469f2c49be5d563e1100cdc89e668f7cbd53a2ef6597a48b93d7d9a78950d4f821f3935edf72649e0000000000000000000000000000000000010a549108e77f0ddeacdc795517ccdcb357f909264457cab22fac2b982d10064756d66d0e48af02a59f58eeb1e8ba14b000000000000000000000000000000000c68703ef1c1e93c78faebc5f7ccc69e39046fe8af92e12469e9fd6baee62a2e8cc06fbbb3def81ae5cc57f488fd9c9100000000000000000000000000000000064ffb6aeeed432629242c3843f8cbea5bf7fe78585763926c5c45dc3cb4d1c79b3715506d7cda18c531ef890b22a1f7000000000000000000000000000000000e0eeb69f28a552cc6563f5fdc9919423c4358a2b70ccd56b048c22111454f67107513cda2a5aa0efd2af25dc74a1c47e23b377ed80bc90a4645df09e825509eebf57f59d7a2aa1b9121ace80926ccf7", + "Expected": "000000000000000000000000000000000b1913c672760f98fc6d4e96ad1ef200f99add6f233b17291036e187ac6692ab0a29a4083dcf86a532dd06efb3d9b8c6000000000000000000000000000000000323b703abed59a9824f34d97851546a5e78441accea4e3a933b9270f92a9dd1aa056858ebd1739659018a0ca13b96e0000000000000000000000000000000001603cb3ed75c09ae5da6b94eea6017dac0c40b17d9aa8b65b78f2ba17de051bf3f21109d9afb214d260a09391f5526c10000000000000000000000000000000019f3bcdb8f16d9a2bd11e3f9491266780aa9110f447e19f12f7a2d62dc4f2c7b5fa18e13792007f5f361e20656c8ffdb", + "Name": "matter_g2_multiexp_71", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000b7d06c16c77a57b5ed74d829ad6acd665e73d20f1d9285ebba67b60c0d1571e1b02cabe5dea44499ce6d40a83288aac0000000000000000000000000000000007e6ae768ee3d149c7130022f9883ed51e4fcf68c91327ac1fe85aec8083aa61a37e9afc25d3352e144aaf888f264ab20000000000000000000000000000000016f2423478e0388e8495a898c23d63a0929a2ee7cf848034e4c1adad3460c7070caf47631eb930678d3c85aaba044dae000000000000000000000000000000001587e63cdf50d6e0b6b3d7652ad0a0a2497e70259d73432831781641d3a76db4ac7cff1bef165fd8ba29200d7320e43475888762fd1de395fa80b6d8a751f280eca568de2947e953feac343fd6bd592d000000000000000000000000000000001181bebe3256dd6ed754b8a1d77ac07e9a341789b3f4a4988599c7c60a36f1e95d3e3cec52c54c0f0abe312ac358c28700000000000000000000000000000000189d224b2904bd45cd1e8fa72570a1e35c94680d03d30292892462664f9d7aca3cc45ecc0773e66a10248df28ba9a9a1000000000000000000000000000000000f654f4c8b02a891e14fccbd5a96228afaaf79ed8306c7c1267715bc934e5f2568ea06de2bcdc2a55ef708689d90108c000000000000000000000000000000000c0a413f16e1aab8b91a87e7027f067ffe7de65097da37d67f604a184c7e7a7af6fe59ced8c03fa32ab036862868b35018ce7941da132adec1eee8d81facdb5012a15ddfe0cd6751ebbf66ce6c495043000000000000000000000000000000000dc972d55b7e68f97191d988ae7be5f5301bce5c654b323d4c17bf6e070f7227c0789ee38af3ccc07b04f0793090c6130000000000000000000000000000000016288c405bb42b4e71d12fd0a798cfccc7d33aba0500f939f5fedbd0e071166169d3072befcc5549cc6963b6dacbef4100000000000000000000000000000000171ea4f6607d6efc875cd9cff203bc62eb83bdc05c07f702143c23ab2770f50f42738f748e6bb3bb5d6f51f40fea1d910000000000000000000000000000000000fb729cc9716bf2e9e30a598ee7c4281163b287422ab66b414da85b0b960102991c24cd023791e4241bda5b0f6ddd3424a0497c642dce3937d883ee25b0ea577c729366c7d67e2e5ff1ccde3b19a5dc0000000000000000000000000000000005720bcbc598c4eda697406dbb390c2aaf4bc22c794b4b664e9b85b7c2079b90f7678e69496a4a5cd3b46580b90a7a30000000000000000000000000000000001159788c3edf619cc5e6f77c4aeb4860764d46afac4cdce54cade63155040c631eed65c2fa11b9cdff14847950cddc2e000000000000000000000000000000000d61bf02587e2c61544ae8a98b4c742c26a3d6ca49c6ae1b19a9d69c7f8eca43cefd555c973145566f8332902217cec3000000000000000000000000000000000cc0da96623432a2c170f07a3aad2844c1c2aab9d1bb5d2183928c818e681c66cb3767be372be4ae65fa40bf5483258ce4e0ad0d478ccf5381470a3fc9b882639dde4a0147c7c82e50bb93431b07a1350000000000000000000000000000000016efffb5d4ecbd01567c1e6099c0f06644d4312c599579b4cb780fccc8a425f3d1263a5f0c957dda4508202a354162f600000000000000000000000000000000115686a37624ffa8272ec7dedb7a632ac568245918ed91be6c9116e0fde290c26b5291e5f57ba6a779750685b0f126ba000000000000000000000000000000001852662b92fb49b2f0359255db8a7a2d20bd37705b7994cef1eb8e318aed70fc37bb7af9fc0c32ab3efa8c0afad640570000000000000000000000000000000017a691c08724ccf0e668f2f4eeda692e9ac21385fea243dc62c37ca73421eaf51c3a60771da3fb3e3cb578de37d2d45d38573db9346a3c8de41af54048cc51a0edcb86f36372859d0d794f7560c8525b0000000000000000000000000000000006fe4276e8f2e23127853eb929ee4e0c6ec4a190d46ac222dceb995c2e1d8fc9f822806a877e6cf87cf579cb2862c25c00000000000000000000000000000000044dc671bcd516cf03ad98ccc55266688856a4e4e5a59d6a6bb93e9ca77c596b5ecd2db6f3cc6377a0086c53ceed5487000000000000000000000000000000000c3ca83688d20519423b2b5547afcccbfaaa088a90523272c7cdc9a9b0397340350f2a5ced2a8153d69c81cd79732bce00000000000000000000000000000000069916c468f22bad174522d7fb94b4b7d2a664743b4689daa5423f470014152387a29425642b50f9e50fb679ddafdafa02257ed12262d00e78bde574a9ebd2664484a446c03fe8cbb855bf92e56bc1630000000000000000000000000000000001fd452b8685b0806545e09783947551bc5f6446c9d15d079a8968a448a6fd6f8b7e91974b71a4b2c50954be299c4885000000000000000000000000000000000f28bdab0b0fd3e05d08ee2c51f1bc0d30380e3a7aa18d6e04b47018d6a8d2b35a8f06df3866ccb95ffbd9c5333ca94c00000000000000000000000000000000035f3aa1cff72df0bb10f1a6f8414aa2ad0289cd15f56d84061a7cc70562f1f12304c402c388e48dd3f34082aaf79eef00000000000000000000000000000000034730e3ad7a3373b97279a00dc7a053aadd088557e0da61b9aa132c5b402fd9aef73cc45dc1cb7f2076cb2ff27ae2fc76b9d21a3da0359a377c11a6d0a18bce7ea81d4128dc1e7618e6c35b9149d5c80000000000000000000000000000000009c91d800cb1d52501520b3625dd4c20173684bad8742c7ac4b35c0ce028556b6529de5cb7541e3c146b13f58ccae57800000000000000000000000000000000124259d345bf2f8c16215be4b6b7922f4e2d6b32f91c4b1c4f1d4974918fa9e6fcf10e46f0c0b55e2a7210d1a5336eed00000000000000000000000000000000072e6231244ed14aa0f5de06e2f953371995a567684b00e459113380c1434a8faaab8b28a0280336ae35bf1f90f1d4d10000000000000000000000000000000010289a63e0e5f1f35b7af22137e117a85df27874ba15df39b7c26801c169667a3afe9a14663d7ac0c2956f4eb70cf11fc9cd895d5d1ae0ae704e240c10d8ed4a01b319598d7885f7c3fffcd9b491f5fd000000000000000000000000000000000d0f22a9bcda47ffcd034618c15daebad8160f9ab6b3148f1cacb32e713df2ef19f706f14131f8ab1181b7ef7598e3e4000000000000000000000000000000001680314cd79fec583c8bc0842e1750b1318f94aa7700c6662aabd4c592ca61ad51a6876b686ac3fe3f508cb40192c31c000000000000000000000000000000000a172bd8e49637fd9eb611b590c68bda707931e403db35cde1c10bb74c389ed725aab54dcd7048285352c56c8bc5fd920000000000000000000000000000000012589683ff3f85ecb006c5c435ca7bfd9d5a6fd06eb625bcbcb18577cdef610d912e783f3986c965710269b1ff79ba972467604875028997efdf5139180a8d530a1e9f18c62ddac7753cc370bf25254b0000000000000000000000000000000009720c2b3a0658a4aba8e76e196a558bd155ff550b3e41bb5b43e7c5946bad803b1de64e342956a11627e7f24f69fef7000000000000000000000000000000000decf2262e8369d6a2b1ce07fdd257abe1c7610084ae2f347640c0cdb98c7cfa732dc609c18b7b6a51b47ebe4b07a586000000000000000000000000000000000e8a0158702ff6d6c3a7ed9fbc774bc329681130840d86ca3f26cf6642cb49e5f14ad95fff1c94151457b1d5a142bb5900000000000000000000000000000000035ae66137629e95539e09ee99b001d5b9a6ede79727d7deedcbeb5acf081cd05ad469ab06c265a5224fd5236db160b62f47637b64d28fb4facc31d5bed34b22e7b270431f54a689cd0fabd205e001ae000000000000000000000000000000000413d82d0b02ca706f0266051445c04f3ac594ad82e2f1fb4e8e0cf23a6c1087c29383238ad3677f170e99259e2fe93e00000000000000000000000000000000070af21f84895c0193f0b8174cb20b11f45c845a8d782b1f58182b149362e1368ba076ba702185fc54b5da94c3172f5500000000000000000000000000000000182e124ca29d66f9f6c370f6065f60928b6a8f445a74800d59209219add6cab0d1b79702c31d60e61cf56874a4eb6717000000000000000000000000000000000b94b733f76067a102cce9659292f31f3df2cf2770e3a83c1524536e29d0a84ea5c4883cb4e849830384dc7e157d8715474c3ac61d4fbece967fbd0599c9a92c3fe0e53899861f044308b0ea8df137880000000000000000000000000000000004b2feedd5badbbdff6fd0f33a4bee17b38cc8967fc72206246c349e1017ed0407fe08e0cd9208fa9e4e21eca4cfbc2a000000000000000000000000000000000df0d74d5cc17ea94457c0ee26ef24071700a0fd6bfc762e3ec69b8f1c096887f679e312f07cce8340686eb2716c9a96000000000000000000000000000000001878edbfff2efc5af64aa9a23589a52d63749b7ab2970f256874fe0cc15091c4511050b0a243d421dc6536f19b5977cb0000000000000000000000000000000015951da3b20494a266e4d014d0ec70fef4586c8656baf536a0ea9a48dfa041624e8154989a2fb106189217ca979ddbe8eaf9da65e0e1752a982601e9a070a7cc77d5007eb641fffbb78d2a1b02dcffec000000000000000000000000000000000657fdf40c829719db134acd6c2a9ff904681b1869f28512cbe2a64d93e5b62114a73bdc5260ad9a1f24a3ff191b7a3e0000000000000000000000000000000004e77bf63eb9c4741028dffd0591b4f525d533b455d35e51cd86c7884d63419a162b145752bde188d2a622251c087f870000000000000000000000000000000016cf02af01fa6750b4d862f0cdd5a87a79da7c3fbedb0fa356ef2e7419e25b3a2bc8cbfa97463d463d0ab349efaa3f2b000000000000000000000000000000000ea4468fe6a85d36ae990d0ba959ae050756805c4c769c829de475a2990ef1c46de20d5b466543978faae0f6045023e85158bfe535fbc342e31f32ab4723c0d9fe95a2c64cc4e59bd41d13a08ac811780000000000000000000000000000000018d42a2df8ca475be6bdc468a82c313599239b974ec3d27e8b8c534aa4d6b85d4ee9aceb15c38b3bade2bb1706a2c2cc000000000000000000000000000000000124d5dc60527faf48f5e9574308f8a328b410de1cb49f2cc6f76b8a1f2707f2d1a94bcbca0a97bc38f24545a8013b250000000000000000000000000000000018b690b3d1e3b22946a91ace004e1d8f92eb5beb284eb05b52ac5ba003d7bc387540d33d088a02711522e3aef7f74f4300000000000000000000000000000000103080d8bb379d961da06bc4c148cb5b056ae115b3a0e33f0a8c99a7fb7b7ceda35d3902e0733156d354dd0240e4bcabd66f5a8f37a7c6a32088897abfaf5a98bd4722c411bf4b52f0f5b5648e89df29000000000000000000000000000000000f4d068354cb5b51e5a86163978386533f8f9b6e388c5e75f7d9ff5e1ab6d1637717d251f2b723b7d683e26a274d610c00000000000000000000000000000000001ec5a0d408c55f247d62ffef172ef26e45c41029f1d04e36f0dbb4fe8af414b0f7fe7ec0cfda66a2855b58592486fc0000000000000000000000000000000000cb1b68045076f457746621cd415d743701bf3ecae8d52dd5582c3e0bfb38e6cf2651a5ebdf521afb1ec5b8066444210000000000000000000000000000000010f5672f813470378fa806abdff90edeb0239b00d85ff23a3fc6798779f46d6b43071d66f7742897a4e53ebf6c7dae719acdd24190589ae7823a42e8b59598eca12bf13b97aa9a0eec17f5f79a01e8df000000000000000000000000000000001422fbaf1bc2908be5900968af61ffa7b3af46e7250e4663ff321f42e2db057bcfb2106c433a9eef8fe20f7138b71d280000000000000000000000000000000002176e68cdb0ada2d7baea437bec8754ea293d14afb85a811f7a5d740d645a53e511b5605445b110174ceb5e6720e736000000000000000000000000000000000a69e992b6f4f7eaad2682cf9ac2e58faee9b3341e852543c2aafbff390ae067a641b2b5693319618fde413fdc64d6c10000000000000000000000000000000009440317af8f5c753b5de4648b06212256a39b7fb03678f1913b0a3d402a50e74e2da5d29c211cdf0b292c132759c36d0291be87a213b0a24c92df5ce42381ca378dc4b9aeb4cb9b6918263bea827bf8", + "Expected": "000000000000000000000000000000000fa31d16d9625200c13a415fd61b7552646c62fb8db307e92c1ac3d2acc92336765a1db42407ab0f774ccf01291b9ee800000000000000000000000000000000156a77678873dcbe4832b9fc7f516eabc1a10f4a6576cfb15765cdf999a771a6a6d41021897dd783e9beb2db722a6fa2000000000000000000000000000000000ee4599a6ca9642cb4cf38f5f2af23271cc8c5bc6e2cf6bad572b618bff9f8677837104b93ca8942843fd5db5c30dcdf00000000000000000000000000000000138986714a4053618e66a85835d105f4aa2ef38ad18e34b2ee7ae30a4282f7e543c80c94bd12c244506e7fcba25f4c1b", + "Name": "matter_g2_multiexp_72", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000083c515ef8509b12ab85ad7d0a816d986bcdefc14778efcb3bf7c2ab61991849f279ae6a9f5342880837c0d0f4a4eba700000000000000000000000000000000020cf5196b5d567fc429cb9ced7b55e4925e18c914caae216a736886a8d886c4bdf6d704bbd0ceebdc1975ef530c665a000000000000000000000000000000000f3d0a217c224434604d63cef559eed3864d2da62ac00d49fab8c2c6e22c688496adc30c8d591e21bc0be404b62083c20000000000000000000000000000000003d0bf7f25bab0bf2c768b44e10a6022650f7d5b7d568d502b9d0b28209ee69b1d952ed848572d3e966e8771c20becc4b14c6a38cc998df3583228080ea10f215a6e6a4b02ddb6d43e8f459d494a1ec1000000000000000000000000000000000cc4c4b7eb7e358d4133b65e635fc13b8a92229706a6dc5867171a60a99a8e343045a794c368f1133ae6cd2788c3a7db0000000000000000000000000000000019508aa39fda9c3efced287d2571db97045f8b7b0c7a9c9d51796aa8017fc0e5abb8fc994700dd5c9f755edb518e096600000000000000000000000000000000049f68b0ac142715cfb385161ee70e453f0e24e2e93f3f96c3d69447f3a28b180fe76989427b2e392c7ff939011e04ab0000000000000000000000000000000004903c0f8e0757dfd3f5edb4f54a0e292df15ff70757df7b0b04c99f590a3dd13c6ce7bbabf3e14daf9f3ec60e2379aafee8614394c8109338432ec72f2d9babba06f1e7b826b0f2558c3247c923b23500000000000000000000000000000000041128064ac768664f076116247e0f8a00adaaa824cd6fff33bf524d0c76e61203408ac13b294aa41f5c462cd42d3cec0000000000000000000000000000000005e150c27979ff1cbe307511816be900648957624caed1f08d88347061cd783179c615258fcf3619bc4bfa53d2513c610000000000000000000000000000000009d2b3d97d29386b93d7af014ea8f1cfe2c1db5a9aa0c17e8430b0fcde974a4e7b8b42ef041e9a7b1a8aecb97cefb52e000000000000000000000000000000000d86096ebd88b2cdaf5cda1e9ca6b7f12ed5def629354b0570eb084bc7139cf20bb8ebe4438f87937b8b554e2201344c28728d06cd90050e44a827b44f14ea35e83c9b58ce4c3a7a45aed6f31c94fb960000000000000000000000000000000018d677cd67e96b10b671d2ed9234d7708042ddfe6fb804d2e9371a80ad167004f9d6b92d26b3d3af34ab7caa0e03964e000000000000000000000000000000000e34a6c85187d328eb33c2d5b2ca96b5210d47a779ab810dcc380dcb7e6b3c334ac8fccd7354aa9108136e4f6dd4ea0a0000000000000000000000000000000000ab8f7274ee3fce1511c58661625c766ffb0ac68bdb835a948b09b7510bb573d49000000e3d3cea772bd71d79681e1800000000000000000000000000000000135ca42f2103905748a1c416d82170f7d24b49ff3f859d6cb7493cf89bbae0217529a9edc835be1f9890ce105877af630fda665c40d1da93b1f132070e0b7c8c2c0ea0e66993b5a3d7419a33d118d25f0000000000000000000000000000000007884edaacca499491580c8c7194c0d60ac6eba95f7a81f63742451c8ed21a223ca545d5cc1e648b9d2dd05016b4fea20000000000000000000000000000000014c78d5d1a93760096bf6da73bb41631e94d6a1b251ed0be7bda93e4c50568420bd4d49e4a46e5be4bb204cdb6b0ad5000000000000000000000000000000000128a860c23a183c5bdd18b4a1853cb53475f1a893420bdf3271cc4a65a827eba6b92e1f9e8ac0d10c73edec5160c640b000000000000000000000000000000000ac14b2170042ee6561c34f77fca40e1bd2d40d01798417dd954905135ed9b7772e5689e6d4e543d44a4563da8c3ca40c14f014117a74f21e0b698a257ae8e3d6091ba76bff7912abb6bd94d41886d0500000000000000000000000000000000144df2e76821c19167f60630f50c939b66867a82c2a5f807e943676c876aeaa2aef2126bef7fc431f0c7b39e648542fe0000000000000000000000000000000005e463627bb2d22c25520c27c05cdc75e1f2ee3b91e8088399ee42ad13ca217284596e5404b4370995f71fdbf1c1c7860000000000000000000000000000000012323010d6aba1bc6b1d6e7f7e8c7bbc0838564b279d5ae6279f7f7d3cb5d96273e27e7096e9a8540463ad16deb3780e0000000000000000000000000000000019102ac6bb33bd1c5a158a584ce32308b6ee5679dd6d2acdcfa4b9c54674fecad7489d1e39c05b1ded88e4ea93620724d81a1239ad2c945f1c560fd1674ac7e87d49aa41a1f4a5bfffeab1147c0ef7c6000000000000000000000000000000000faf210330693663c8a1d1fef78e211ed2542f7ffeddca3e19be3ba77ef211da1b8bb5abcfc96b692d74f8c7df40b0ce00000000000000000000000000000000134153a252fd8ec5d9aec08ba09a94c4416f95ff6f4ccce59bd400474c836af5bfd941f03384ca4bd5c56fbe81d96ea2000000000000000000000000000000000b4532ff1ceab2a3a177cb83a75c16a833a2ff28df447def351134ec4fcd608b2b75b1f8035ba7d40a737087f3e8c1c100000000000000000000000000000000127e3ed13384b69819b34ef8705fe9a66dd01b275f1f74c2c724420546b39c70cb7a8295a6c1ec4075ead4e3312b8b603a02689cfd2c353fc1b4d3913f5a43745fffe6a87a7c223ec3b25b321584a75c000000000000000000000000000000001351d0d5d531a63a5f56aaf1d7906b7ad2bfb4e9d823e2659bed4e05e7edc9179a7bbf13405ab5cf410b25c7d476c342000000000000000000000000000000000f0ec96128e058e8bfb6e0df1331887245dee87c4f9721fc7f1d20c20a2feea7a7078a4946803ac093477707598d59b70000000000000000000000000000000009399034e4aed13cbf197d8c4753285effa72fc53493ca316db11b39d5527b009aec6350d579f9dee22cd6d4cabd88ad000000000000000000000000000000000002f41ed0dcfa2437cad7b12a94501266d670ed6956196c438241aeb90474d17214eec5d5217090d28892d95f4e40055af95ab3fd062088ffbef6ed887fd39aa1d527fe7633b876187ae12e736fcf2f000000000000000000000000000000000ae208978a751f8921c6067ebab4190ac8d3608dbdf50222eec59460095b8ab2abadd97616c240edd0a9c53dd006e38c000000000000000000000000000000000905224b317a1e64d8af075b6db9de46ca4481458ad6bceaf726ba0f63e81e2a0322e79e70a5a82034abf00d47fccc300000000000000000000000000000000007173c3359f0c2e315d11d646a76e6f500c0922401e4bf9f4ccf2f0801a567fa653f287fdbfb878ba0d9ee12e25396ef000000000000000000000000000000000161d4cc71621e5df13d121c77105af195c2adff5fc6b656b0fc1dd6eb2518f474444d8bc526ae16387f23a4ab3f342f6541c6cf8217c2a95792900e8fc39581b177a57ca00162c57131ea4fb80a4c60000000000000000000000000000000000266af9991c393d3b55f9e0f22b0967d47dbc5b0c97947125e220c4bf9f4bc58d32ebc7bfb02b2e329c933ce41d0d8c00000000000000000000000000000000004cf5748aae8dbc1e4778dc85da575de2b6d9d346f5dc5ccbfd82513166384111f5e5f2f1c2f7ae367a22146d1fac027000000000000000000000000000000000095dbe68521b2cf51283a8cfea1f20eb7ae37e6e945c5f879ba4834d20918b74981f9e0eff4543a79ff4eb36d84a9c60000000000000000000000000000000007953cad14379ffd4309cef1ed6a2dbb73a93db0bd3a256753402e525bb62b10aaf22b662bb2c704865690af995e7d284b7c3f3c4ed10bced85f36fd6dac2646c65d3c810e6d2d116c38aa5e10b29c2d0000000000000000000000000000000010e99f318111baeb1b4611847fdaea7cbd5e3ae532af667ad2498fb2e97b1eee0297e2811c7ae854b882f616da7733fd000000000000000000000000000000000e56cea75b4c4e4c669a492a6723fd60e351a66dc5c34c46469dc36cb04d2c23cfd4aeaa23d0e9e83d5b78a1b77696ed0000000000000000000000000000000018f838d6a582a52a508cbd6bbbb9cf515e091deb7a640e141dea4018af6593c001dc43a8fe4819a7877d9ecf53d5752000000000000000000000000000000000119aaa2ebcdb6379f7ae972cb709990a3e8254f1025cef308281bf7057295e3099d1f3127f76bd2f9ce0a03ae0de8e8d7e33f394e96d17efa30d34f57eecc45d7b4ca150a31b8d0484578151d6e65c2b0000000000000000000000000000000008f837c478e874b857f1c939a26a02e13061d50728c10939ffcf5e862cb177993e204590699a28cabc7593056617d433000000000000000000000000000000000432d9e66dc78bb58ab98771e7e8b5fe51835f286b488e2df6c1991fd36c3c537f2ce30abf24f9d4fb13941189972e39000000000000000000000000000000000b202de3708984f44f7d05ccd9e574a2a93a285d5ca262017346580be273c58f13165437dc90d1d4103d3b9eaac536ce000000000000000000000000000000001873e1251d9ae9448de8e7ccb7ca59a21bcc0d07a2819d140c06ec33cbba559ba90647494a7ecdec8b609b58cf7995cbfde92a31e571ec03e509ac8a70ed5788869854eef0bf578efe6c5e6468315553000000000000000000000000000000000084e07b6576c73aaf43c0ef9c5666dc988ed93d1a106b71e4882fc0cfb5e710b91e5d5eff57327f5678f662f4a451d50000000000000000000000000000000008a29751f1653236a48adb5fbc59059c7137d36139574c6af97314bfbcc22f77a4c5162092762a26b5da7887b94f2da6000000000000000000000000000000000a4fd84c4d58cb9e18aeee180fb05f07c3e1d7ed8d09940182e9b4738744fa6faf600b6f720441e0ad6391a4d502ac040000000000000000000000000000000018b356be2aebca82c54988ab2a2ec58751ce7a815f3dd58a2218a638753d4734d38b74ca0e00bbc8681768f5d1a02b646f7de01ad0f7b4dcaee1123bb80a71d3bc1e63ca577a12b14ae2a11d8c0fde46000000000000000000000000000000000de0f22cf05620a5d4bdcf50ae179f23a9c089fd6eaeb14eca937d9e2480f1782a1c67df76e06191a9b87514daa8bbce000000000000000000000000000000001981cd1f260e7d96e55533b8e29867f37af507b4a58abd69e0ad6af2a55228ab1c82fc2de52deb7b7b7deae2fe621e10000000000000000000000000000000000d22a7a567ec8826391ee711768e612c403e3c16e20947ca5861185c24728b6c7e7756debb333e7acb53d86032d5748900000000000000000000000000000000016fad52e1e86b9e092955cefdf93a10f30db896fb519fd2ca12571d8dc8aa352cf4f8092e0e973d0b0c66df78433251e2c69d21d40813ee40a718f0ead36b51f3a50e9e4e4b2de8acd33add62bfc1d20000000000000000000000000000000000484bb2452158bca93dfeeedb40745bc5d9a9ad49afa20e6c29fc9ed1a8fde33ce508cc252ddd05fc486f8ef78738ac0000000000000000000000000000000003c2d6ff6f292b0f0e505fdfdd2940e72bf8c2837da4ec9c74fb593fe3318a9b9a8592524bb5d40f6c38ad871ab7b6150000000000000000000000000000000015f888ae2722713e1b5b02803a5b48d53116c1a4bb1191c9da77ded8c6ab49f1620b0f7c7867957d84503cfd3dca1be7000000000000000000000000000000000fd96baa382cceadc252eaf000d47d8c1e2085e9f274dd9dbb571bf85bba612836e1da2453fd914135842e2750796b54762d89025196aec4f87da2fcc5a9188b4dc7b1c014dd1d705223bf9fe1e7a7d1000000000000000000000000000000001820de289f62058920ac3d4bc60da023ac29c431ee429a10066f305d2b1a333ffaa906404af977cfd3212b53e66726b500000000000000000000000000000000094e448db84421e25cd03be3867125cedc7f77f286f404524757f3c1a9cfa28ab6771293da490a4d75852f515dfe1a6700000000000000000000000000000000097dec124970bc63d8f62f9133157d412f5ad3fd5eebb444568cf0fe2825d6ef6577ad302842f35570c9977638c6a827000000000000000000000000000000000490bdaabf4db27dce906cfacf3160c0fe25959df4af89301cbe6eeb29f72e4c55bb467841ba7d0750a59a32fc8b03d0ffb9f3e1d43aece3af1f59319a8228cd81e668b1e250d03350958dcac9e23843", + "Expected": "00000000000000000000000000000000193358b283147ed5848559d4d1533734822b0248dd17b2effa80920a853b70e7fb683b08aad6ad4dbb91f964ad1b3bb6000000000000000000000000000000000649be60ba72734db4cc307a2fd8be57857f60660d0c496c0dad73794296552e17cb2eabb3537ce677edaac1c6997341000000000000000000000000000000000f91ce27345e86003c99d133eca50710c0722cb35af2ce442ebd74b46d659e0118be9bebf32111c258e4cb4ab795a2cf000000000000000000000000000000000d76ad65233522b1e079fcfef4dfa80f163682d7984d5062680a5dd4cbccd5044de4705013c6bce2140f7950032f90ec", + "Name": "matter_g2_multiexp_73", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000013fe4afb94d08ae311b7442de7291a11e733d8e555f2da6f72bf99da780a8f8d357cbf3d8959f6aeaca7bf3f5b5bd10500000000000000000000000000000000025af713b18cbdb5a960371c2dd0317f4bfd0182f4bfd6b88d588b56fadc1a0398412e7e0a786c326aca8779ae384243000000000000000000000000000000000581c277053c15df8eec05c34267f62e63faeefa2d124c2b4b84d2a739ce5484641ce955fbecb901d1e8ca816690189b0000000000000000000000000000000005355dd304b9b60498a3fb1f08e1ba0c98db327365ca9a0365a7f1e5cb56aec43b7fd2b4aa104eac7b1c30b6f53cd422be285a119dc8cb32b1a0c5380af736114a32e9d1ca870abdf278dfa84444f70e0000000000000000000000000000000016b5b3a6fdeffe5b9a0244a333ada4444a2e03771f94433832a4617be696e467b4e88ed80b174809dde4242bbb51248b0000000000000000000000000000000003dee846c5b84f89734016e547c63c02e4be07dbbecc86f811e2d8d3245f91205bfc055882565371db532240da1a845900000000000000000000000000000000194d53bbfa962def4da2a9bc7129fb6242a3922fe26cc4e603528ff31393a31d03dfc3463704250ea2ffa973ad175153000000000000000000000000000000000333768faee332d7468119b9e0469bbc7bc98a482562ff2fd9aeb6d9c67daac9c3da1db41c9e12224a2eff2feee51778bc0535bd504d7b9658e459c2e79b86bf4e718baa82b8d6e624fba0eb141c7260000000000000000000000000000000001910ded86d79f9b043bb79cc4049e0652c13d0fb8db2f070d695124d7a42cc3a2238282fc8a424fcd8d9ecdab4bb6fad000000000000000000000000000000000dc8d6caf97416928d2d58466219f054c6f28f49b2bc04d8a80cd46a308bc95aaca3a8df1914ab0c7da341862fdf47400000000000000000000000000000000004380ca7b1f7ef96295589f78a1683a51bce4b2afe50bd6076ccf5d07d35e6cb2ec7f74fa35097b2c0b9fff3f4797c1100000000000000000000000000000000054f492d7442b1c0d1293277d95efe822faa7d8881b9afde20db58d6267e049b90d0c8828a6c12540f4ba1e7c9ace6d84f3fa09243c01748954d84f4deeb460f3ef78f9c34296c6a092952bc463d7284000000000000000000000000000000000bba4761eda87a304a80180c2447a1d5a52f743015ea7c728e70d6a5defe3139c80696f842da3f06586be8d506ca4bc90000000000000000000000000000000019ea930d5733f4a1ace9fa0139d412d65b2886b659770e388894592de0694d38876fcd86d14580f9b92518d5496fd44c0000000000000000000000000000000002bf5d9a36d641d1259c1b30397aeb071b88844c4cf17e3de0984129d7b4d67865157ee2f682e7cf9d968fc07ce43618000000000000000000000000000000000f9a4f29868654abafc7ba935aa22d3d010023ef5112683a037a6c69b9e89374b256b8e1329eb5ad306d9f2063c22c335d84733ccc41f71a11d61852fa336df566109c5538c2c5f5cf2af961e93797fd00000000000000000000000000000000004f194f21373f09f8cb4984169890ad3855e814a4768c84e9fc97dfc181c60114aae534a27d3eb225b2125131c754ee000000000000000000000000000000000e6f88880e9645e35806d193f5d16799d63e2f9edd8ae28df54d19875c61857b0a34819a70ba3e9c31f00b5826b0cdc200000000000000000000000000000000193293c6cfae9ae4b24519fb23469e2f8dc4eda8524ee0b00c7141587b07c8a26a29841d41cafbd24bfbea2034a9c18e0000000000000000000000000000000017433efadfe9873dea9a68177af3d5dec4a13dcf4a710422d52020d4d145e2523ec0b48acc533a1ac7068c08ae6aa28bfeeb95c32362014caedf2a9e066a775e2db0d1322edc86759faa99bd70c05b580000000000000000000000000000000011dc003f7542f6822cb872117fa658638dee2a15429aaa9dd576a7e895bc0a2160bc120558a32aab9e646354233a1afd000000000000000000000000000000000fe9ed8ba572ef7d1176176a31fa92a5ff3dc38b0183ea1e22618e3b3214ee78c53074d4c60b5056901c6f046f8210070000000000000000000000000000000006ef1c20c3bd88bd6787598dcfca52da4e5e0e7c7643af983c709b916e71fd15475da30d763ddba0899b182cbc070ca20000000000000000000000000000000001a38a2e54a44ade572ecde076038f5244f266cd99532024a377829a64c20fb2cfe1633367c74b5990febb08e776bc34edee2ea28b93b2daf4ff927991769a9c69ba16490b5676074e64f5e91fa994a60000000000000000000000000000000011ce7b2cba037e5f3ff19b36371d34e287eec807178dad4118c6d43aba68623e182aedbf911a2ae5cf3d0e690ec3ba790000000000000000000000000000000017a617453f391e6e2437d56ee831ba895084f60d1a5f342e19a242b9661c703219d90a157e1b55f005f5059c15c179dd000000000000000000000000000000000746ab134c7f4bc19583a4ea4991c7cec3f651a60582b40c17b2d18cf6e252d93d2f3c2a1a3399be70512ec9eab251de000000000000000000000000000000000698daf214f2de44ebfaa36379862bd9ffb40987dfc8e632f14738c93c8e5c3fc7be9fa9100fb5f7440311cab34fe1897a07e50c1fbf1b388e9264c762798c31fe76761508d070f06adc63130df07641000000000000000000000000000000000e4ac65ce62180ac602ad68098ee31cb747886e95a183e4f819d54af99850d70496e6952076084dc7bc2d3f7a273383100000000000000000000000000000000182c718fc9e5cc961426258e82594a5cafc36270af0eb50646d161fcc192c30d40d06647e14a282421638b31f378de940000000000000000000000000000000002bf448ebd27cb6270e1b87087796ca6534ff51ba0962f3290ee1d06dc18ed39fb736ec95632b483f44d3a9d0e45d1d50000000000000000000000000000000018b956acc1300e60b22bb936b2b52e2ae82e256f15f1415263157965179855137715c321d3765c5227dacb63ba2d6225f0056903b4508cffb6334bb5f645cb553a8cc61ea6765283f933686f172f8360000000000000000000000000000000000f5372651ffb40bf853f6f8396a7c7483c401b89b67e098ea888fde8d19e7552a006a127af1f3311203434126ffad85800000000000000000000000000000000050d7e89b21c7484cc5831885422fe7aa8e898df85cf7a3a275370623eb9660611610cdb829d3935f0d0955e0ac97506000000000000000000000000000000000f83a3f79f1dd110bdb8521e18a64490d567210801d77fa3c0c6e5cbc7285840da325cab7ab08494c8d516511eb189dd000000000000000000000000000000000f72904131be66380c5a18af4857ada7c15e88572197e100de1cfcc9fdb4306e446f2f330fefcccb41b676f24e3e0bf88031f363c8b0062b34d48f4c2e5bdba884005e52f77ac04c2f29dc7ef10fac0c0000000000000000000000000000000009ba6bbf102d390638ceb9259205a1856def2b3a4b5209eb3e4e54074347f71b6c06b70764fe85c8dfc9074067b8d00d000000000000000000000000000000000339c30631229eabc1230240942bdbcfa6e18f23bfbf88b7b8a8fa92f18e35d2f7336f0b819e875ac643b43e6d931e68000000000000000000000000000000000600cfeda6033ff51c3bf9182d22abbfbeb6db46c0fbe15ba82e72fee483744ba5a57ab2eab6f35927b4ba6d2b150063000000000000000000000000000000001530bba4db8a60bb6b7a05f72dbcd23044011d75221d114b839aaa9535400874472f94c849597174322291b5cfec4974cb146e27a9d36dc698e1982afc945af9500fc5aeba719d06d0c4e4eb245034c6000000000000000000000000000000000c636ac98557e22897fd101dc6c54d87060f460b4cf2c5a88ea14641e2a8a9395492fc5a946eebbba36dbe38f6f5c0c60000000000000000000000000000000007fe3a557aa93f2e9aef4ffc55d39a9172475e6595fd57409df3a7fe3d11558c4d3dea3396ee62f61190add83b85813d0000000000000000000000000000000015b04e0daf4a10541623e7523ac5fbe57dfff9ac17afaf4293c493c1982f3395980ec63046cb1d424c6dec91899202c10000000000000000000000000000000019617b191e9e493751b0a02511a18757330bde56722a72a29a399ace983db7114f84795e2b70bc9d670cc0095220454ed983f98fe5112a55c23591bf4e259d072f893944741d9941a00f907749e3c9990000000000000000000000000000000017472b8c1cb3ec528400649fe7c39e3908b16ed69b42d967e4d225b694544e8bc7ce5bec87019db5539f1de39dc6807a0000000000000000000000000000000012b1c4884c37037a94f84c15061df5ca6c05c5a35ad9b37e3ab8e8297c9000e715fd2bdc3f2b485e86c415bf656392a10000000000000000000000000000000002c21af2933029f04b344be76e18ce499def4a0671a97dd9b6a108d0fb23852fcdc56f882be0319978952ef04a207a6a0000000000000000000000000000000015eb31e80fb162d5fa392fada8d43648ef54d4f9ebcb0e9652dd501f55a8875a16a148d42e283ea8bb2c5a38bfcc8843a62f99ac46f986f2f29f0ad3da0310f061e691955c711850a2816ad7464614a70000000000000000000000000000000015e68e011ed063a9fd9cc8a806d8e3561e4f449526ccb6e5ce983ebc4fc49d61d26dad7db64f56ad5ab0b54fbdb76e61000000000000000000000000000000001617d7387fedcdd772a34b267a44315212d21b798c0fe1e7a9ed3caafb678910d9c9c3bd1fff4a3c8e339d0c90a865b8000000000000000000000000000000000e2b3c9b9cc10f41c4c0129d34c62d526aea47c77ded91a5ca3afa0da1801bba81def3ca66a978ebb2d1f3227ea82a9700000000000000000000000000000000096b6caf7b6f29e91bea370f91c2576c188b08b95f9df6c7df995fc9879c11cdbe2af86809468d472fcac8a89716d1d87ee01b0c9c6a6ca1fdac35d89c803bee3595f03d9d200affc5292d8a7c6720b80000000000000000000000000000000016daa86ec04f57c72395d96b6ea5d6ba7cf2d9d4a50eb90f7121545f17c1ee16216f4086481d91e59fc5ed8542baeb7e0000000000000000000000000000000017a783d60be67206241e0bcad20e371d86d47d88ba1293b73f32999b0a1646967e5d031a5b28517f035168d7c7d7927800000000000000000000000000000000058f24fbe4e9befd8abe364c961f0ca4d9083260234a939bf6103a3e8f10a8381a9e3d74af7c13f159e5c7dcf456df00000000000000000000000000000000000485c9448fe3a069eb024ec43aaf563a98da09c02c294da2a94a98a95430e25b062e8ff886fb5fca240fba1abf7cee60297fc700698c56877be6764f48a836d210bb33e99b5735da9837882269af9b45000000000000000000000000000000001230577527a0fde2e8e66b8c4d17594bdab8be1339866819c8890c600b35889d1e3a749fe15fd8182001e30e6420ca6d000000000000000000000000000000000ce03cccfa87229fa8d560884d8c7963276d79ae9873a23d550b4555cc4bda35a242dd2e70cc730b70cdf898609b3d8400000000000000000000000000000000174aab1f142fbb7a45bcdffd64c2d38b99c8919baf9651aa430bcd39613d7565196c18f0f4ee6fe05f5c40ddbcd4a67a0000000000000000000000000000000011dd23f59ca2a033ee5dfa50afb0c7ddeaec6d4f50e1866cca3f061fa03594216f005bc65b2c97ed1109c305e16222671b7ac02db15cebb8af459290c35eb5a86cf98b86d8336764c6bdda6698b49b640000000000000000000000000000000014e1cdf4f10b11f47c15d0b6b7dfccb6081d05d116c8149989cce4f1c53dfcd2d0b7443677b03d037710eba813f6f597000000000000000000000000000000000c8415c7d5508010e0db1878ca663d359525b290b2f02c61436e945145a7a4e1b3ff4e27ea1b2c8d3adbe737d8291b14000000000000000000000000000000000e424ece68003cbfaf65a54dba51e7b0942cc53b2fa9794b4deb6aef1dc1ba1719cba285f9a1a59e71a881eebffe2eb9000000000000000000000000000000001404f9a3146b7201b09c5fd678fdbf2111c48130e82cc95012e5aec1df7e64a3b3c727afee4f603e620925686e126c0f5d1a3f78a2c2ab7b85cee68ee670f50a176e988a341303afb7722917f442fab6", + "Expected": "000000000000000000000000000000000e9f6bedba1f6e2a3ff33e0e4b18fbf8e77558bf42e89023df6338b03a648c591486c63c2ecc8ecbbce23b3ff9a7ae6e0000000000000000000000000000000013d2526d83b4495b5af645d5a1af7bd40bd0ebff125e0fa14f10d1c08511dc29643dcfbd25ca0bee5705a56b26c558730000000000000000000000000000000003fa442ab532094d47f1a9111c87deacb15d80ca6e76bfb5f9b9a209bfe196643351d778b0c6d6b274b4799f733abacf000000000000000000000000000000001278d51523d5d9aefc0d3783e745da54f74a88620f2161090a398defdebf82d13d5b5a21a5cd466352ab8685b034fa89", + "Name": "matter_g2_multiexp_74", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000a497e74635fde8caaa5c9dfe666b1b40732e58b93a72d39c8a60c1f4b262e1f18f62229a30fb8257bf895352ac4d249000000000000000000000000000000000c1b2fcbd7f78d85c73ae55f67110b575750bec353e55761de0ff09a9f8a2d916c336655d8f6a78dfbae13fded5a9c36000000000000000000000000000000000173893333d998dd32cc3e82fd7ad8ce77003192ad2bfa1b1d2b43f9466898313276b922f9fbd8e83e86b67acfd9ad780000000000000000000000000000000004ed01b702bbafc73dc1e6846bc944be297ff08d1dfef397603294c7fe11668cd0670d386a8fa0f0f02c52d47f54a11b34aaf86eb77ce03f1d8eacab84d5ff98a565fd33a9a2c40f2a19d7c041a7e2a6000000000000000000000000000000000b5ec74a2150dcf5ebe09f39234c4dfec623318889d92b0bc1f197a69650bc48d28a1112306be763176b691c6915dc7c00000000000000000000000000000000028db19af73ffdd0111dabf9c7d6879cc7389320a249f108b41be8b1d4c259d5889dbcbb48b30a288e26cd9926682d1900000000000000000000000000000000172fe526c62f9cae49e6d3284170e6339d5af256441590cae9507c61f987eb495d340500cb761896163cb8ec631434690000000000000000000000000000000013bbfcf9cd3167b47b48af5f5ed7e6d45a5fa38192756c9e140eb89a85c75602814f767c57108cfa2f726e71f31548f808ab2065f1d2278caece0939cbbab4bcbe3eacdc80cfae6e4500a5195883de0000000000000000000000000000000000052d7a0f93142b36489cfa21d76c0eb96904a3ddd946a53b8a6730036d88d30336fd8aae3ab29ebf62a48c6e849ca66200000000000000000000000000000000198350abe8cc91bd675f26516d771422c128d5dc0af844c6c1af07bf04a1d3ad9654cbddf2de5b7828d1446c45e7828b00000000000000000000000000000000198f35692d5face8dda4b464ff48d650145242852fe189748783b1a2e48806294368ae0a99481bfe739fb4962f3b86a4000000000000000000000000000000000e3cf2e018a7e0acfee25bc3a82cb282cb377bbd72ce3044dd20e109d948f68720c27aea3d4663ee45b2de6f178a00ac58c69b55bac97a633f3ed7816e77e2a26cccc029f7e7429c86145ca4645eb41500000000000000000000000000000000150e6b03a3052d043da6514bf4ee09baf1a35b2a909473db33ea0bd4c6af7d7aee9a8366c1d08d2adc5998635eb0dfb0000000000000000000000000000000001370c2976b0d36fcb955e797087e6ccffc851d2450cd63833d6cbf52e1fccbbbbf9dc695ee45c7df01c2828051bcd79700000000000000000000000000000000048b5fad2fe0af7ccdf675328d8ff5e63b564d8436d04c55b23b6ab7d2aedbd25d614d1780963fcd03d569bed2085bae00000000000000000000000000000000141f94b4e7ba542707d0c3cb69f8dd79e499602952be2374cead840dc669c5ac57089c5fd60c44291703b872098fa2daae7faf23e841bd53683521cb3cf215577fa51f0f751714b6aafe5c740f66208c000000000000000000000000000000000eec51e0ddb8cf9914304e7766a7418e2854ca71367c1d2b3875c12b7dc5c7cc2fbc136037bb7ff72458027104ed3f270000000000000000000000000000000009fe5e8d1918f9b5865a8b97c2c2cfc8bd750a0ccbe2942070827a09d8e41ca795a86b2262b10462795f833c73e788ec000000000000000000000000000000000b95c9146f3f560ad880ca905b5f297e48905680b4613e91f393f72ddb042f6a6201628fb5f75fc23f2298cde66a6df5000000000000000000000000000000000a29a8fba7644ac96d77ee73a93dae23b03d81a57f6cd8cb4594b23571cc1f658f163081ae50d72e09c6513d1cd2c8bf72022cdd6d942158bad47a53a9b0c3be910a41036874975724a5cdd22c012871000000000000000000000000000000001807dd8d2bb40a642fef693739b1df12fc787db0f031306f31970d0f59f0c97c0894afc34b9a9913726a20dcb7d5191200000000000000000000000000000000096fe8bb5e911c1ed9985ac08d864c7020367f4259a0d074973a26cc421a44e8034a7007f6d1639285cf8acb8b2d64a60000000000000000000000000000000014026d43eceb26b9ab5bdd4139d4f94349b273e43f27737f9ad26d23454cdb1d35ea793d21f057359d28328a82d5290b0000000000000000000000000000000003dda2a84bd1f92524a8ede9f5e81f0f64b41b24510f4e0b8146496a776d5b509968f188c12c2d66cf755e5000cddb3b800ae0b956e38bc34cce55bb7e88f1370a30fc8ed0e3f1126c68c30792a2cabc00000000000000000000000000000000011246ad07713d1916c662679ab757c053e33def437d7a976533f0ce80ff6ffc259489c26524ea96898c3747c4127539000000000000000000000000000000000acf66265811a57e47a4c98b40b12a37c6f439550b18215fcf856c167b7218397d7d559f852fb45077945a5074f460be0000000000000000000000000000000009badf2799f1c43a2e3859123aca91e894f86d6298a06a9127249100ba270f2bdc79cf511691bf2d7faa45ffa17490eb00000000000000000000000000000000069438b1d53efcc4277ea7b41cbd28a19f80b5380136f62121e766bd2845e13d5cb40b2f15d508414876ddde491a3830a57c3322133d6ffac661c888995e7cb067ca1309f3e9178a266f1a410a79c01300000000000000000000000000000000112c4cc34da9e83207b5ea8a9251ac5f004546596f2294b3fd51b77ad8d8e98239d53ec4f527c7280801233175500b1b0000000000000000000000000000000011dd8627748c9a2b08524f88e560cd3944bfd1fa17e1d6e2e9cd025b04f2e3ed35125197136afa2848d24fb5fd19508900000000000000000000000000000000093219f9ffbfdaa60c5965b45a5d5bd923eb5d3971542ac147de3f591a5fbe31b30704a0061a524e2ddd05a45dfcb6a10000000000000000000000000000000006407dffb5580790e250a72dfe68a488431f61f45ec9df279217b8800f0ac1ab585d84e486487d5688735fe5aae75bacebe67f3d067b0d011abb31588d1b2fa9fdf8a56bc46b1a0196e926d4ec73040500000000000000000000000000000000107ede23f8e4f273ac2647fc251008905966dde32339c023f1da3c4d35d483a55b54f4157a303e68e1dd7fa3f3b14c8d000000000000000000000000000000001739327f282812fbcbeccb12e40df049284562d8986b8d4559787e1d5247eb6c83d6b838d099f36d8d0e32da2a7999a10000000000000000000000000000000005e5b6b2baede3ceae776da5adf075c1d774e83d6129ccfe7e835862686bb4064b187cc0be0cbfed37e5cc039f3a3fb6000000000000000000000000000000000249554dcfa53f73ef8f08daabf20c55301f75c8ce095cd794061c55e195221602a54ba54260980bcdb35685e41d0f4ffa1d6d0d1876a67337d66c596fbcd7eb22ee308e4a5f66cedff584f1441be6a700000000000000000000000000000000048b7fc5a71787231f1c7ed2134be528fc8d8f77102bda806ccbadf4f9bed79ee94b43c0fd3e5b1d776fe73d786872d1000000000000000000000000000000000152a1f005a64e16949d7249c3b391d5c1e0ded4893d0ce926cc666f0f88b64e8dd6ec4f92ddda18127ec24cad7e40b40000000000000000000000000000000013a2e1e7958a53307adf3beb32a88b7c493df0e37e074c9105da3c09bbaa01fed092fce2b1800790c6e8af3d30ec5a81000000000000000000000000000000000e2d405806764c75122c1b5e410673b28759f26af7489cfa6f35c6c0dd16c508af045009853f3329cda4a67948232bcef0c4ac919efdf3d0e649126da7f8ca3daa30b6ca6f3be6854c0f447a63cf2110000000000000000000000000000000000a71d61dbb3ae37230a2dceb54061d5f8c1ce645e20ec39785c229cf79aefe238959b2745e3b50e4b3c20c7a8e2ae27f0000000000000000000000000000000010e82b8dd5faed6bbd5755c4e5a88edbb3511d3f4442d1e44b82cf72a6414bf6558d29e8907b07f71c00f537637605bb000000000000000000000000000000000d8c93f1984b742b5a02777b706970215c7d8eeeb7377cc26c3af9005648c2eaea7f7a3177b6e049b132ef6bb4b188da0000000000000000000000000000000000ff082a252082499d70eaeba6d5514fc8d641404b48b2ecb256eeb40d9c6b68ad5af58556c9dcfc5667621c549b8ee760d8bf380bc2223efc779a747c0a36f8c2b18c3e821e96163bae14b18f3739f9000000000000000000000000000000000f4cf354b8de6dd2231448bb235af3c84daac2db49abed345da6ded50eae93982a4f2c27b07ce725a062b07fdd9058fe00000000000000000000000000000000076cf19408f0f0379c7e65a6675b9856782990986f5c6d7002e9c9c74b95ab875924bd7ad5e4812844f6d1f530e58deb0000000000000000000000000000000007acffe32f96f5e56557965e3db8dce87eb7140d93608cc003bf4a43fb261bb7360c576da0b7c4dccdbdd9cc53b5c5f8000000000000000000000000000000000eba1c668fd9323d42d6a82d9f075cec2d278cc57122e25ccd72cf8b5a569552cc6b0e9f88d23b9b7af18f3bfa0cc820006c3a7b5ae971e4b0ec34a1007a02cf8c55f067115ba00c5967f70a7dcef9d60000000000000000000000000000000006157cb6e2dfa2733d4c489ec0334f0303ff1ad410f329cb59f99a5fa3ed2cf84eb7d2f231078ba5db0954badb58425f0000000000000000000000000000000003dfee394f4c140e2cad61e8675b26f91244880d9a0b6798d6111090dc9d080563db5c89b7293dcaadc74ea5849a08aa0000000000000000000000000000000001aa1e0683014d5b6f99f469a0b7beefaf05a7ac0298bd1a3e2da409f6cf856f70bc067610fd705a851cd70054df9562000000000000000000000000000000001571b129f69f3a6717272ff75351fa053f46294f68ba3f859208d6c91ba5eb9a0f2133a5e139d04e38c7f7aa303451768f29e330b48230de23e0393bf1614cd26685cafb899db5a164497955d3e98be4000000000000000000000000000000000c4e84b7c8e46daea67c8090b27dc28b7867b89b92f56232bfd8ecd9968b865a057957292e79c6dc08162f9e91e6a4b2000000000000000000000000000000000b8d1eadcf3f1de6ee608a4a0ebb7defeeaf4e251bf07717a6a8e50c07223ca32a2ef290f26d0de14b1942e02acba39a000000000000000000000000000000000e901b546a4d3c68e4432f376c97f42ecf0724777956c4ffb1e6ca4fda562e57be788ecfa45ba3afadb439c2ea546ff30000000000000000000000000000000007ffe01da4fbda9fe5d47c3bedb4b92fdd71ad73fa272b071a7a7d1cdce7743a535da7dfe05a43d03368eb97fff54b2d861ffae8f62572938925593f7271a56e0f559b56bf97c454c38547a2185e2ce70000000000000000000000000000000008da0fe413e31ca68f84032f23bdd5399e01eb3b5ae47033c6834a39645d7b5cc2ec937067b91ac6d83035a86fa841f9000000000000000000000000000000000b950b982323f747782d9065dddca5332940058a604829e31560a6bf9b03ec72b09cfb87a1cd244ec694c7cf192c37ac000000000000000000000000000000000f4afddd25eac15d2248c71d76c9aa27323f75141820efeef1ab4f5003141053f138d9a7d1a901961d0f2c210ade27ed000000000000000000000000000000000217b1800c53d53459b00b8e463df1882b2cbafe85043f08093a5414e58ea7fd4dd933c601acfd7c154d0e4ce187468a2dd907071c2d39fe710215d174452459cc31d36007a1b5570a27ca2e42c8be55000000000000000000000000000000000046aed1acd19201553bb6a88fd6a6c0525ed44822d2a4ed3bca48a0a2b75e76cfcdced8f342b81ce03ffa72e667b3bf0000000000000000000000000000000009a5adbac43cca3402db016a2138342fae89285ab1fa16d7acaa9c3ee2b4e3df2641f7392355996bef7b1578ce1ef119000000000000000000000000000000000c8ebbcbdf2ac3fbb553a2e589f4b7c259a1621b83b14fd1927f92d9f6cb27e82507d7943ff5930f0c14b9fc38c9857900000000000000000000000000000000105b729f678db31d04ceae0aa37f9cb0b0319c4da9a1a4702a11bfe3a5f2f1f2af09b9cbd5ded5a930e2e65f4279a31699893c06db2dab559f2c374df4298707dc1815e55034dce920ae7b1df2ec8d23", + "Expected": "000000000000000000000000000000000708e9b926f2536731b02b6b75305c549da58e312d9c53701a993624697af2f3469af34dd4634467f8c98a0f721cd9c00000000000000000000000000000000019185b84fc0511a048e3c39bc10334c91dc1052d323a31c8bf325479a2fa3e4228f8260c0e725c2b89d5a0319e6fbed70000000000000000000000000000000013c7c441d5cca81b48d43e908d6a3bf8b5057cf19e4884227cefa9b235103b46edbe01bada06bb9b620ebbd016d537630000000000000000000000000000000000431182c8a1eed66073956fe5798a894be396403c072e766cdc262b719d1779f960f4aebf61c1bcd4d005d3c7413e52", + "Name": "matter_g2_multiexp_75", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000199f555aa5c651183f52470e36cde438422f41c9b2d1947510665254b74ba0bb9cdc6e6a1283b0c8f58d8f009eec46900000000000000000000000000000000018f1d8f22f43b4649300aa23ac92a2e8f17e7e3853b912bbc8e90588125c371084cb224c2d54dcecb4946ff6db53cd02000000000000000000000000000000000efed0bcc83a52f0faf9e260815da8d4e5286396081268485aab052a96af8eea0112be6cce1486b10b60551ad6c810780000000000000000000000000000000013a3b1ca3b9b7d50083c10d36997f5f521d4426af8d2905aa5d074ff37e218a0c96c74387485c2dae24c0842b7a74cf0d8555388bcc6791802ddb6c0f4cde44f45ac0b5d7ecd918bc34fb9fdedb65b94000000000000000000000000000000000efc5a5c506e94ad2754e235e2da866d9c46342f14d518f12510c93f13a619f6bfefec50c146d6d6170f190497eff229000000000000000000000000000000000fb91f34356005f38c9804250549554cfe67ce195d5e218e4e1b1a4fb904257bdb68d6dfb013e8e85fb5a4cbdbf0f21a000000000000000000000000000000000f09903db4c41fe3f11c6f0cdb7c31a131033e30f52cb66ba10c2e7da1ed8a225ef280d313630121701f9a490e8a0f5c0000000000000000000000000000000003484f7e8f7d67ce40b4cccef110bc255d91f61a4e1968a9ad37e25058eeaf39e9f1ff89c9b2e515388a7c1b49a84a2c33e5999498978d14c9de06f7beb2fd870f6f16dc42125fa496606e65c7466c0f000000000000000000000000000000000444215c3d4a7d62201ea1b69890e2ab90b5f5c6ff56fdc9908634c7489e785521b8dcd7ed409cf09c585cae8414a3250000000000000000000000000000000002d70674251a0c9ba76b8bf3b70547da77cde5592da9204954abd6d8aec82799cc0fa4fcd42139357043fc867b3d0e0d0000000000000000000000000000000018c57fafbad2351a3da695f8b523443e8c763dd7ab875caaa6a494a498cc40b1c0d44488e2dc80d1f0bce00a2c90c67000000000000000000000000000000000125d5a87ee3f558b5e1e7664b0cb95c195bcebd5e43b930fb47d15eee4fd50b3fdd0a401c9bb011c326acc77645440137894a51dcfe5a8fa4da1745a696c870b353fb03a31238b8744840a78084bde480000000000000000000000000000000018790123ce8b3b72d626493a16936c47770a9b06ca45b17c6fa5c7759f088cf98de8ce7b3b5d6082e9e42b39acf76f79000000000000000000000000000000000fea86cad8b40f315d8378550f6d3d831149339a8e8dafa77295859ddd2417e8f5c0ae2baad25fcfe00de14f45a537170000000000000000000000000000000014ad78bb2bce966d52b1fe1a273bc07f2f24b354465edef6dbb1e0123c7c3d7550983b3793ff1c7db846e88eddbf33c4000000000000000000000000000000000c0daa6fba40ec59f6b34d413130df5d9137297d1b7b71b83114a6570fef8e7f83d6f5689527164782f92da4b1ea12e8fb6a294589c816e18859cec34262df6490a2af6acc7daa3de861198c5bcf4b13000000000000000000000000000000001186b7c78952e5c32a9393eab07ad4532471595bc2c5d8137c61dd7fe6b6ca3aaba82dc205a559bdc15421a001b7270d0000000000000000000000000000000012d56b6fcec3d6511d2d723601cb8c9faabdcdd12efdd0e2bfd7c9292f2c3bd7f39c6e9aa53e6955727f88ad69c5b4f10000000000000000000000000000000006a5e56e4a42b04c03619c78232104f1f1f39e755058a19354eb230f2f09bf486b2586817aa6b88f27b884957ea0226600000000000000000000000000000000118c8521dd4866df907ecb252d9ce7a489f17d0f240d054a5dbff6c35895ef20b205236aa6e5be6f0825f9df87878ab783c4a3460caa35fc0e7342dd2da5c7b6aae818eeaf5a2cbf4794387180b95dfa00000000000000000000000000000000092809d18926c20456857826491f55cec17803e9e7d43f22faf4da18ede3bda15e3319539017ab20ed1de2bff490a33f0000000000000000000000000000000018d736b967eca64234f4e0018e5d6c902608e265037d9b8ba42dcc923b84ac62599e153e1c7d00e552ecc5aac57d1a5d000000000000000000000000000000001804aee99219354d4a5c46328f0658a417c85c6bc89af6db29a4911c4b0cad5638fac5ca61cc997fef3450cfb4a6c666000000000000000000000000000000000bf99dc4a400adda5bc89762e9011dae8ada23b284e52e2d49f75f1c75247f6282c95a36f7a72f896ea308131215404bd2b65c1580bb46e3a4cd9d9c4eb7dc998168c66982448abf3a4e08cd12f612b1000000000000000000000000000000000604f8bde85c0b26894e0de155cf896c911bca47533362a0b59ccdad0dd64108d33af8262d3ca2ca399306723f2482a8000000000000000000000000000000000ec10d3777aa54cd0cfd84b4062092ca3ac840a24e8e8aaad5f4c275e4d45091f838ae522efb1b2a0fa42229157297d300000000000000000000000000000000132cc70638d02186116773b31ec0e571a55c1cd78ec055fc647ab09cf4d3c543e0552d559b3daa4e99cef031e583e61500000000000000000000000000000000194a6a32a269692906b64feef9e4e8cd204e560b98db8c66380758d2123babae871273b4c571a1570a317c13a51d0fe9120892aded230949b83bfb2dbac054b83a9dbb852bd0ad85dd1d7f715852306f0000000000000000000000000000000016d05912dfff44912bf34f242ac85eb55bbb8a21625d45496c76d057f518352528c6632d6e8adbbccdd5983d13c26953000000000000000000000000000000000b10aa1402c15fd601ce605ade8f25531ea8f95cf592bf4ed86c4a3aa847dc8aa2369655ce5348da30a897fa8d71ffd800000000000000000000000000000000183f5a2f40da0a0f4598c6b9ea7b99f8cda1d85cec0e6da5365d7eaad1e9a3167bd647e5e654985f395ea72257f61e5d0000000000000000000000000000000014e615e2d5072c1b536ffa607f3a826ce297800b0da329fff397b6327800ecdc879e91f1e3ebc26c18e188e1ca66bfd66af9777a58539e5aa8b1fce0994e0e1cdb5877d93ed4db715c5aaf74d6a8bb1a000000000000000000000000000000000f3cd275d72a637bcce855e2e20727c6e5a1f15bc8d799231d3a7f61311d4cd2f58cf38448675aee9910c1a3d0b576210000000000000000000000000000000019efca445312f568727948c803d06b8d4e2c5289015740f2626fedbc0047d344aead06ef521ff7e139312fa41d1c107200000000000000000000000000000000141384e1c9f79e38bbb0bc1025c079741b93f56e150df58cf9a61ec27c2877c4188866fa197242965e3feb47a78c68380000000000000000000000000000000010638286faa6c45cf028e8e3d200edcb348560e2e35902927391401b3155240b62a40784db88e02b874e128e3a2132b5f37e2ed8e96921a0f9bff8b43d432b382d7b59938e269c381351ea49b8c1ba2b000000000000000000000000000000000c7fc4216767ed298206bc142862c138d78726e2d39afa18fe5732616c73a965d95cd2032d4b2f5a4d562be48ba6885a000000000000000000000000000000000928bbbd76b87f58ecc850e1aa4a2be11b15a81786aa7ca8cf0f6cc342db87b66c435f009f88ad97b747400fbcc651e10000000000000000000000000000000019f5ae9f06f2bc27a39bafacc7f3745fcdf8c78c9ae8a3c066ffd704aa4117eba773691ae43387b93e86d2e2de3688700000000000000000000000000000000014360a7ed73c05ef5fe651321f7e839c920bbc1896636143b88357cbf76e15da839bc7e1f1e629768d447c9d313cec8e23f4a77a2c34a370a9b59ab1cfad77212e433464d0195f0d2fd20c69141389f50000000000000000000000000000000000b9d955f9d28f9485d0bc4a961f0acbf09ee5fef38ccd81a2c73cf87a461ff1bf28d4dd1e0db3ea522299af67bff93b000000000000000000000000000000000889061e71866001b0760f68e20c7c0c033d782e6e6752f11502a0e8b6b70277a985dd13dd83424d1e5cdb9eb96a01c0000000000000000000000000000000000e05a26686667f44de2bef53c36c82f1fdda13dd3f7f8fe1fb026273dc4dfad18241d732ccb757e2b46ed8317dc69fad00000000000000000000000000000000038b55685b02231905dd9a62a709c0f015cf5650b3fa469462b3e9d06e3af8092d998c8e08ee61db1fd5583b0809a38996c59b0bc6dbf66f42cfee34413cc4cbdae7a61e232757c75474818591764d6f0000000000000000000000000000000006649a8eabb25fb7793344a0b29325a88294343f6c69612ee9d9002154a49791f6cd7b37b2bec69fa8ce11722e9f8a03000000000000000000000000000000000e10f2f3de16fce9b9817085f0130e1839d9aae949170ec16834732a9b12f589a2b00f17d2fd3416ddd020b7421ca20500000000000000000000000000000000016b51112b3c7c42a8c2a0fa7f286ec05cd07b6cea5675bf1132de99cf42b450b3c2a8f02ec821529a14a2a0fac3a751000000000000000000000000000000000f471ec8b65bde22e003500d1d422dd0d163abb424dd261fac588333755cc5124acde328085d8df852c61e024155564781c180924f1d982bf4b6a2bb1cac590cdfe84198fdecd87364e163dd988f9b1c000000000000000000000000000000000ec162d22b6516c309efb6a4577c5631a5807bebddc5fd1be5446e4a64785d49eed80eba2e89cfefe484ecb8d50440a600000000000000000000000000000000070c252caf6c56018af6b281b829a4fb8dbab850ba0446d233dcd4d87bebac00e3e5070bd41898dd561526498b153199000000000000000000000000000000000a0d76d1205c1f520d82c85bac4473ea7cf5f68022d95b1f04d06062197973001234d86921e70a94e478eea85264f14a0000000000000000000000000000000014c6a07f0d568f2103ccf8f61278e916458820bcb61fd91479b0dee874fe36c063a34bcb14ee434b68681d297637b5bfe44748b9eb1f44b5fb143cc8deaad23047bc5ecb8059705e7905c37625d5e2d3000000000000000000000000000000000aabac129385d145243c3a1f357ccc963ff14867ad039827488128ac639dc62fba82ace66f889b47d8eac39802bc1af900000000000000000000000000000000062bbbe8c72cd6f8626484bac159b7e28c6c8c3261edc6a05a30c308cc9e56db17eb58f62ab755f04a5c87e58c04c7550000000000000000000000000000000011a4a439d18501142350229778f67bbe0c9b948229dcecf70a8b09d1df6c54801a111c603301da2377d4198d09dd51e70000000000000000000000000000000017de3d9bc6fc5f415d04ecec013a635fa200699c496f4d0bdb5cea7d446274dddd0a7f6b06058fde43fc4f1457361558ae04d7723b7c9cb0574ba744bfed8f8a347ab740bdab99136aa71a6d635d0d98000000000000000000000000000000000c86590a02fb5c9568af4e69611f09980cb5a7e040c94ecdbe64e40005783fd3305a5657a5c6bebca7d20ee123a872b4000000000000000000000000000000000bc873a9bc694171d2606f4efa409897e03198a61b1bb16ae90f0d12345d2650d93c46e0c22b717e2f0504b8983515990000000000000000000000000000000001df9160ac3bc54c0121a9c69e9065f4266202f755c961bcb8641d13720b82ebd73eb3804ba44769fb2d75144442f1c400000000000000000000000000000000045e9c8ed2fe1e5c9a2a5bda75dd60f6bb5dcd0a805f68c1f662a5960b025ff29c8e21857d2a61bcd65c747d2a2da8ef6a794685a342ff25dd706e4df725e3466889d8f08a27ed2f32523b117f01a84e000000000000000000000000000000000f94df8d267339bb4f51b21014ca6d685f7657d0f0bca189e53cf19e0e5e05bfad773c0553daafd80c86f302b1907ba5000000000000000000000000000000000d92905addc028a1dfdad50e909c77662e10e4689e7c8a4a0174a3e1c746b361665b65e17fce02b6c067a5b8d7a6a6f500000000000000000000000000000000183444f0665790c48bd3c07545115a11f82463a092774234e7b33aac1094761f213235895e5e61ac1b0a15603bffe2140000000000000000000000000000000003cc2cbbf181fb023a5f6088d8a9793b17984b3dddc8c3ef1a9f82f8f436002610df60b2d35be212da9945bc8108c0bced3f23c51953e46d400802dde46c374178ef379d5c1b04d25449891f0d5623e5", + "Expected": "0000000000000000000000000000000011f85691799cb76213068ef4f997af66c349bf707295b969d85fe637d4eabf54f3f29e739152aba5027c1b55317a27210000000000000000000000000000000019627f9570f07f44f326b5b3ee19bc477e92d813be2865e00da93135645e02e6fe5507ac4d50085b02149667794609fd0000000000000000000000000000000018fdc97bf0f88b2348b436d70ac4e28b5ee5ba21e21e94808b8b9e401c0c7d688974fe203ebda0b23abe38018876f4930000000000000000000000000000000019e28c9c936ea5a0b3b41871c3afaaabd53a93902e44a96dcb7651bce7e6143d81cb695fea8b94aa32c09ec030dd9ac4", + "Name": "matter_g2_multiexp_76", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000703481cf48efe78fe8dad34184edd1765a1d01846de74a45b43d4721bf1af116c229f969868b0e6e851f22bdfb0451300000000000000000000000000000000063d316d495b1e82380c5b73bd61ce7f2159e7714c50e374e8a91dd56731dbe03a3378bf8afeccaba5fda73b4c2dd166000000000000000000000000000000001012cb2f6578065c93aeb673f447ce95fb42927ef9d12e07968ec04b6a604d785944620043dee5de4de33d59e67d64f20000000000000000000000000000000018cc7cfc360801ecc420d77ee171fb3eac3be0cf26b3f36a6cfb7c6adae7bb74c18071daed8fc56b8fa639ea138267928c8e071da1ae8f615631759cf33fdb876ab289a6bcfa6fba2693a58f8601dfd10000000000000000000000000000000011e0dfc437a65c6fe37bb9e554b5138f68a3c52816807bdf7d98f13cfaf86b37e9669f4e0db1b7865d910a309f16cc200000000000000000000000000000000006f2323e01591a7db1d3c7fa1a2ce4540cbe0396cc55baa3a3e13650a6f6b926a7cde0eebb45d359edd52137152fe360000000000000000000000000000000000066bfec8df4ab5f5f5eb369b34e8e22fe32abfc00ac58b68f2d3841248fe5843d6d29ad012249fb9ee851e40b940dc2000000000000000000000000000000000f4ea977d9249bc05dafb682a863ed17f7fba0a06c4a13cdf5a836748664183272eed96bc4109bc5beff61c5469e221f8371fff9230243d2e6cb6bdc4cd97260a8cf0362d18b9ba8df512d2a6f5563dc000000000000000000000000000000000fa3e3e77112774fd6d6b560ff88cc92ef8d009675d0ed65705398ce727cfe786684da50bcdfaffae97d19bdaddd81c00000000000000000000000000000000019e98284b8b9f53faf3b73902cc322dd80fc330dcaff2a7fceb55db6a4b0f7f667297f5e4650c797ee337985dc6b54310000000000000000000000000000000004e30acf2ba66d842575c8679caec607fd090f0aa2350464f3b6eef22e2b9a1d9d5fabb0f3909f1c19f6b8f27c53b040000000000000000000000000000000000ad76b86e32f84ad74bac68909da0c271571606e071b13bd92e387a8a16a1c4002c5a5e94ecaa1e8d2d6e051e19a45c763016c9a9cfbf336ebda090d3f2a1a1b265787e1917f0148f82a9c0b66b21dc100000000000000000000000000000000019bd07479b234bba974ca2f39b317d5f4be33afef66c1d69e53c44cb5e44c679775ba141f82486424110d186561777f00000000000000000000000000000000130002de0d453abe9052a5f70a9d55de74939d1c8e6ad5871a669a867861b1359322eb98539f4a21597d806aeca62d18000000000000000000000000000000000b2f0c649fdb37216c10762f510c3bb4c789dbd29c4f9a8ff39f74ed1a96609c60473a50f5ce3f6535e4af0f2f0a150c000000000000000000000000000000000893b9af710787361a32fbd19c380161c9a214a1bcf3761563424b8546f6068ba650d9caff3e42be63ebf4b6afa2de516c9f679167d5fbb29250834c9f65d3025606e2af20aedec309718f95ba01e90c00000000000000000000000000000000019805c0de5e232632228e2772dc79712e3d863bd6fe56932b29ee99870d2ce5eaf90c73632d1dcddc093e9b6b5b0f1d000000000000000000000000000000000405d77f4b3c44f99a956ef375879e62df033aa408127e0fee013b74675a8c7d999c6abd30f459693086bfdb326d67af00000000000000000000000000000000110f2c231998aca3d76e40055a05feb37eba76cdd10106719f2300f57906424d7eb6d9f85115b78b7371ee60e26d02b5000000000000000000000000000000000593a4721a67caa7cbbe1566611a1d48532c68adcdbb67f362c9ec21e08aaddf6b5e09a9a96df9a89bc25f11665f3a36aaa3300f5a2fafab132f5f4662c1d288210e7502ca2472d060aeea6f2eab2d7100000000000000000000000000000000151758f1921743d116f1c4adfc09cb68b3ff911329e2f6d6bcd04beb9c109568c796f328e1f04381a995fe89aebbc49c000000000000000000000000000000001388c73b1db46bdbe70540c99db46b730e157a23afea97648d73f9d5f7e8b073ed665eed9e9e2500152c87715f1c4d4c000000000000000000000000000000000284ad228867ed14ade5a327ed951ca50c87f0a669e59b7a75d17feb54bc5d685245448a912590179db1e84f1eed1e5b0000000000000000000000000000000017d3da7c167733dd88f1c39315e47cc80c3310cc431989d4cc50ddb22e9fa481c5dc02d94dbf806c4c8da16ba5b24905f6608f7c036c8fdc335601ac55e869215eb4e626f52bae813d45b827df2afd490000000000000000000000000000000016064871cb68f748939a839800afbb018fd5836914a2b76c51818e764628a76817c7ea329e6b2f9de653c8162a2a2e0c00000000000000000000000000000000082fa03cda4c617a780caaecd7c859c5251b56b61f70fb3ea8c05b4c11c030adb8a96d715c1325ef3dce9b20e8065b6700000000000000000000000000000000174a245baedb7e1bf1368212620b850151be41ebb00c977d85da499223c207ab6f1a1d94a51aa9e90d07764ec3615b3a000000000000000000000000000000000df5b81cf4b008480775ff3d7644f546a60382e92a98b03deaa4a20f831e69e14a893ffa731c4ae9ee237d747149a9080cd68c59b1371c7063dee5732182961be90b95247511a5b564d7eee8d2c7c64700000000000000000000000000000000019d36b8dae5e1083e687743f7494b7f9dd0923024df81e2f83c78743e227ffce588a16630201b9909daa6c9207b5f430000000000000000000000000000000015659059cfee7850e1cf0e49abeef2fe5837cd128742e62de20dc734f1bba343aee1c9f1a59d920a0519995561891fdc00000000000000000000000000000000102b7221257c40d9adabd0db3ec9f6348487187ea1110773fcb2ac5ce210dfed167a4d15e605e9d9e666fd092147a1c7000000000000000000000000000000001402ff9770d27d2d82efa6abe4a181e3c1d944e97a06f670d9e46b24f9900fb4a838b32e17482f25be9b6f3240870c02ea52329555d9b79eb1fd6d186df80b25245ba9225553f402cfa6037592f0b10f0000000000000000000000000000000001745ea52686f87a39fa42ddb5b0f69368db3757394fa7a1a93eb20c398c26415c8a7edeec7334df5b15345d6174126b0000000000000000000000000000000012b580e6fd228f087c7584cd95826e56d1c074cf16c35286c45d2067a362529d241c1e24fd22cc9727d423551de1a1f700000000000000000000000000000000104b46c42a706c61610f8c0434894c7cb9ef878cd0234f8aec0825cbb8297bed3de349e7f6037dd19a159103ca7753390000000000000000000000000000000010b781b3cbe6f415af15e37be7c60dc6703e6e79618cb3d8d9a5ea3b17c00822aef1eddacad66a646c009dac887bb070caf39f2a517d432d1653c37fd9a6c4a8a811107dae428f4b2af3b12e4b6acea30000000000000000000000000000000004b172c360fca555e65860c7a294960f506b562e012ddebad5803bc3f4b93159c16cedb73f339def9cd1beaa0912c93c000000000000000000000000000000000242e37775a042ccf59e99da667c67fc49e80e54a1b438a74fe306d668059ab4dc7d9e457adb45e1f91b3e6bef0a130f00000000000000000000000000000000186eb83ce3abe66b8760dcc0d375eb783d175b0b2f36cc08793d8a86cf76b7618b826f50c6b02ed586394abe4efec2f1000000000000000000000000000000000bf780324df1cc5de325a796f1fde367eb52dac76c0632915dfcaf01f5acd6ae890dbfc2e505bafeba7fed8fd63018c2ff0bad6dae80d5f47dd8c208fef0f3046cf1040112d18c596eeb934762977cdc000000000000000000000000000000001231b52c8a081add6e5c250caeb9467335933c2ed66826e4ab44561eda9259acf926f22ad0df8e8756aa51279d12bc9600000000000000000000000000000000051c46bb04d3e035d324de681c772e4561cecc6a5bc4ef0a0cea56618e09b3f39f5085e208229e50164bcdcd4abdefd2000000000000000000000000000000000ad7ee610398935a02c3a7139185409d7fd4681ebb74a239e15d1c092ea913016d3f585d8224cb1d109ac111660a94aa000000000000000000000000000000000903bb16efb052b99e9c46f3478b4acf800a173b35b0079d7728fc25c9415c8b05ad520f31e6a3c867245f64355cbc080d0c40e5d422685c5c83716380eed82392ae1dc6074a7edb5759fa34a61db2d0000000000000000000000000000000001788efb21597aaac29b7bcb9ad6cecb89267c757cfcd8893c32fb13c0f3e1af7fcccb9573dcffe8d9220292b7861cac90000000000000000000000000000000015f85d3686148ad62d7fecb71920981117cb8759ab249d0ceb45f9e4687914536a1eb16ccd0e185d1352a8d2b4a8ee7a0000000000000000000000000000000015d8ed94c0415ee0f7c9854841bac5821253bb2ed4d86a61f494cbfbd61614983e4279fb17802ca68aba4a0302ec1d8a000000000000000000000000000000000f950a4c8aa18f4605e1252c367dba1e170ad00376a8560c2fccfa7d5487b0d1d5885cec16a0a17d81b5a584d473853f7e93a16a443d5f981a02f0b6866536dadd276abc0998bedd76b168ebc8e31b82000000000000000000000000000000000da25ed9154121205ab6843f603a38a6892887d2725f16ff87a5218586c6139188f46da5a42b5e05982468e8115713ce0000000000000000000000000000000013c13ffbed4a60bcb8659013b022012ef3a4400f506d65aff7ffb1bd5a9a5e030a298e417cc1ec8ee7ebc06455dbe61b00000000000000000000000000000000132d83bd141c434326d4772de7f8772c30a6456de7adee7de66a04bece4c0d20bae5526c8eca5af5ef2eebd72c90d54d00000000000000000000000000000000131355c5e359081dc86e0b15c8aedb4f2016b41e8428051f5132258eaf4392fdb63a91452dc56aca20b7ad3263ebc8c92a1d13a64c03585715908744481c79f340b5bdcdd88d685ab8b91722ee7ab7190000000000000000000000000000000012dbe1327162e4176b4988cec23df0c1b0075d0dc51ea8afbbf98f00891511d9023cf7538c5705d59b6d6ddcc90b101d00000000000000000000000000000000036c12c7f7627b6d6fcba9a303248c38d784a3d1d0ff02e550565efbab68c5116e9a88faaaf09bc72bcc3358e9dad0ee000000000000000000000000000000001578ffb68cf12dc9a5ae6fb5d822324cec9e3f576ce08d45e24fec9203d36a6461c5b8ea6ac50233e8893b07ea6e71e00000000000000000000000000000000015cdb43c82b20b8ab270b942b9e625ada9283962a7ce95eae156aa4355e1123ff87ddb1cc85b2a94bf36102ccbec33fb2bc6979fa2e386abec058683c6d74de31af3cac21283cd5e4244d7edd94da9600000000000000000000000000000000017041e16975850e6445c7b4896955eb5eab383ad3c3031aef04e8fdfb65a6d52c9e647330bfbb0f0eab630c9f9ef7a12000000000000000000000000000000000b62757ccfb913ac4264692053f766e142697f598a3fe26e998119b63a3abc7fee03db32a8af36aa21181fe9ea89d12c0000000000000000000000000000000006bbb842a889d7ff3c1eb5e0b16e3a921a11d28a251c488a8a17a29edd93672fd15974a7e972a34c47283c583cf2d29b000000000000000000000000000000000e94e685fb1751f8720b8af79aec7b245ae8daa195f11f485f2c0c5dd68cf39eef848a402ce2342a6b3398cc7879c6010f1937936cc3766184e47f39acfe5af4497e8edf77ab34083135a9ced61d25ed00000000000000000000000000000000100d3fee47ae6c8c7981c8cc615870924fbcb34c2ed817d6862e2e6d0b4612222a4c8332c7d51b58ec59df6832139e1d0000000000000000000000000000000017270fa71c34ec84043ef64c5dfd61614b5b3bd99204f9f70994d71498219818a5f16843c67c668b06aa5ad3a6ba8a0a00000000000000000000000000000000057948c0ebd14664bf33fb282e200fa0e641764a353e8347586465dab0c79ca2caffbdc2c6d60b2d7c8cb6b088bd16fc0000000000000000000000000000000012747eb070f2de18f517648395109bc08b4af3f04d98e23eb6b516199b4eefc5df7d57baec736987139c7b03b573941f639a8b60a1849c71688a11e612b315439161717f525b5deabbce75808470166e", + "Expected": "00000000000000000000000000000000128c6c0283ea35c10330502d6aa849a909df6b8dd927a24f08072135b8e21e40c495c42e742160363772569189d73ef40000000000000000000000000000000016d78dba1e0feeab46f8cd38681a9c2f6490ecc3a6e79b31caead256611d133090a4eaed9691a87b66dd1c2ee50d5f470000000000000000000000000000000016de93e176c950975abcbc692384996315a98065db6d6a6214472e5a338e291b36abbcdea1b8be6162fe578acd669abf000000000000000000000000000000000d7155e239e9b15ab64a538b0a0bd53936df4ebdc3ec9b0b1d494e4df780bd014425759e9743c9b262cf48cda01e945a", + "Name": "matter_g2_multiexp_77", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000a653e0c24eee1cdf8e3652809de0cd159f2c541981a4f43936e7d41c0f97ffe2f1e1e0d1032f0970023f1d27241a16a0000000000000000000000000000000012d1d8d2f96db0e5f97be096c961e3b90ef3d88492fb756894979d2e8104791a5b9a43888043ce9e543691f15d2fdb650000000000000000000000000000000006ffb94dc3c2d07830498260ebe4641b2cb64df61cebfffaf2d4ab5b6ba92cd75de209e8d7915ee744c4db5352ff239d0000000000000000000000000000000011f25722cf9db77ef8adb9caa250175e12412e6350b494395a86c31e1f5dee6c89cc6603f1dfd08a70344cdc44aa0c2df3efcda934ec9d2ab05f25d618e5a483e830d0452a88e980589fcd7cfc39e5d80000000000000000000000000000000006177a74e3551770e7d906222590108bae7b97a5dd3bdd2344fc12e7005f2c1a188ab9dffe68f5ffb0cc36294106f15800000000000000000000000000000000041b140c46868767119a6ebb58562570732198854c92bcc070f2a8d9be91282a70c5ab99e75cc9e5064ed628aa5c59de000000000000000000000000000000000f318ee33fccf455e46add44922bb6e99afd4354bbc79d7550f8d12d3de4f75e5ddf4e62624b116f91aaa80a148adaf9000000000000000000000000000000000fe012bf88e152eb62c0c906dccba469abe591687573a59d3debe747b7d895e4b0755f16e67fa9193a2fd338c04d243a4507a696cc57c0bc49fb4d1686752c71c9c816d7d09bd66910b23810d475aa02000000000000000000000000000000000b26c6e0106d4efbacf2dd0d15df17209b1306f388f493c096429c031bc4a6a535b64cb02b400433f948fd6004df2fa200000000000000000000000000000000061853cf1a32fdf4c370cd413754ea584d3722a08d58575075a7371e57a7bdef95386ed72f91c4893377f6b551dd6b1d000000000000000000000000000000000ebf17e60718c8563a1029ba035dbbba75e7191b4339d5d33f64bb35f34866081f26f4815e01b02e8330e7b7e9c428cd0000000000000000000000000000000008ce40f92efb5c5be48c814018fbbe45f1be45f5b607a6600cecd50d8f791de7d91939ab61204c2a1337c3f21b2c9d26518c1259f23de4cecd5e3a40abef5662b497ebaf16240f40ecd651d2ba50af0700000000000000000000000000000000123ef52cc44f36326b33234ab3348893bc722bac3674e43385b201f372fe4ea3569d69d4d561e26f8ea903e017d7376a0000000000000000000000000000000005b1707ef61ff9acb9e8b4dd6922daaaa2d8a7558cb55b1b9b96eb6d57c23f50a7955763c9b5ef04f52b09be8d55f4b50000000000000000000000000000000015b6e35d14da61e7a7fcbcb0dddaf0071d8d2d89f7179f44851947a2b9b0535d6fa86b5cae9713a73bbed909a4c6deaa0000000000000000000000000000000013463e135b1fd460cf042dcd0226e229d60cc2beccd8a1832df241e65a644159722a14297c0033eb499e5890f0caff1e5561616c195ccc1345421d8a6efec48f0a4dc8e89ee89599839efaf95c386551000000000000000000000000000000000fbdf4a533d355e232723fbc97352fc5d7d3d199934883a61a9ea116830bdf9e40d423256225d9a3458134332ef6e817000000000000000000000000000000001195f0ad227941c5e383c48f546be34762d158e6cee585650b6ee987f7b98e802f678abac6646832b30b6e12e90948cb000000000000000000000000000000001820d5fbb5a62140c6e8cd105a70fc2f1ed84e254c839deadae5eadbb75e1c33a07ad12ee92900f55478e91958a3147a0000000000000000000000000000000013849bdcae33fad27f16e91c6d46b9678a00491e3d70a8db905db4b1d2c6f02a29392b5b77c1472052d6f4d49f14a16737c77734125181c72454bb2d37c3725cf1f9b6d6f42b721bca469fec154b3e2600000000000000000000000000000000188fe1e394b567d71099fa13b5c8a5891636d83b6b8a08f410b080658a0663deaae4dca1afe8b9023b5e8e573c752c92000000000000000000000000000000000f66c65dab8e1b2912fd5285a4c87821888532f5107075cdfedacc4d7f75c6a74b4828d0b4c3a2c0ed94576654a7047d0000000000000000000000000000000016af44a6df79c8c9b6f1d8aeca24e024c454d7b94c9ed386858dd35c4158cddcad1207f9fc3ac9e3b748c2314f875dac000000000000000000000000000000000315e5e4f78e9fcb93aac78025e95b8bf82ce4c840cf565e0a868b0aac22950d62f7becbf8039a16ca3ea66a7498327d981483aa66e04351f4340fd2b461165b9a9983e91c148da78d3c8e0c69e77de4000000000000000000000000000000000f9a61dd1b3034b8cd7408b0a44c8d02f4fe0e87778d5d34f5e884ccc9e2d51eca6b6060b46b66843e8247b3c794e19d0000000000000000000000000000000005c47fa7799a0fffcafbbe4694dfe8d0f47b60f712d6319e9a56ac459a636460e700e2af80f9c688208978aec7c413af000000000000000000000000000000000ab1c55fe2207865ecf12e372a341c776d24c08dba10702fce1cd2c01eda314852d81d0ccf1c3423c2a12e8960677f060000000000000000000000000000000014f8a1964aa3240d788ea40bb51abc50fae2736a34120ca9585fb2d5bba4e5cfa201c83be1e00ecd1c46fcb2ebb4eb809913da6f756005ca8ab900ab686484483af07df768209a16d807f8b88b9334d30000000000000000000000000000000006441fcaf5e68b10e7e511a95e56b9613453ec6468bb126c5eb12f204c9681c69b5c296320f92a6fbb0b848f8ab5fcd1000000000000000000000000000000000141de16aeca0a2f991e9fca4b6ce8fbab3d66ee3ee4dffb0124384a7d4ba51864a53e005fd34516c92ecab33165944a0000000000000000000000000000000008543656b5495bdb726109cd98fa18e405648fa88cbe2e5fea5380b7d0ecb207f0343dc7888b9945e55156977336226b000000000000000000000000000000000b53d4e392f304225b1ef363a3528daca1d3a6ad64ee99d58491863ea432a29cde5edd4f390de45a567cf32112ca5929188fb33fb359f21bc5bdfc85d39676c2ca0a1e619bf8a8e8de62da8818bd6cfe0000000000000000000000000000000002e0c55a43078df575efb2c99b27c5632dd1c08bf28b6c0558081a78de58e4258d1b57d94ec6fa157add04aee06e7b6e0000000000000000000000000000000006d3f4f0791431a56fb386f4bb8e6744cd19b10bd0f2e65e927371ab488d3735e3b83400ddb25ef9d740a8620821b0ab0000000000000000000000000000000011e9cdfec8a8f8eba0de6809485911711149ca0ebd0cecc033e2e5ddfc195fa7de671a686edd2f56e5f7da7328dfbec000000000000000000000000000000000171f188afd5d9568cc5648aefb65cd715c0293344b9aceac1031f10b4a1e4b9fa2ab11114bd58f28aaa58c10ee0eeac65525ab4c4468a2ec0beecdb7fb072f28260ebb3d9da1a4c274b2c11a087e814a000000000000000000000000000000001651d9bddf61e5e54f86609c2479513ae84b000ad7defd840d9619a8361922dde81c999d0e95d8a3044c46fe0360c2030000000000000000000000000000000014a68c248808e826a3bb50f3c1c1438483cbb9da8dd67a0c9633a47f733e6aa7deb4a13aaebcd50de6e8e8f00000424a0000000000000000000000000000000010c8a94b9e0ec9965f6c8bd0c4279102ab682a14fc3c22e9640d68f240ccecfead9a2c6e69f7c8ed369cce7e2da50d5000000000000000000000000000000000181493e8137fcfae203e1b45189fb828dc9eb56887c89aaf9aad0380fffada423f0ab48ed068ba4e67a2b01a16abbfe55ab5a55a5cfc49cf6c36b5718e108f8d006bf7fa1ec3dc7a7f9c02a2d1e3fc57000000000000000000000000000000000e3e33fa4d85a35e8707419ca6d4fb6a61ee6b07ce152adfbaf6b5f1d7ccc253b59f91e4545848b3570bfaa804ad9767000000000000000000000000000000000c923a4de074dce3ccc94698bf6445af5847c0e6f22f225c589f744ec83ed0810913af2a6d04bd55200ffc738b31b01200000000000000000000000000000000186961ed1c6039476eb6f13bf1b5f6627b3b017ece57a4a5f33db8ef12347fd507398a421932d3d2a1d009f65d06e42c0000000000000000000000000000000011e10ae0139f95a2f1144810894fb98f6e5e86ce67877b949a2a7134c446dfe53c23dfbfd12919b24975f26eafa249216ce7aa7dcd01c1b7059ad3cc0ebf5d19ceaae633160a968c33aac5dc6adb942800000000000000000000000000000000029265ecf3c81aab289c98d9cdb917749ceef56e2e4d59de2d6c83907f394ddd1cce9d093a20206c2c1c215493c41c49000000000000000000000000000000000986ad139381e4dbabd6beba179600e1c782f436f84a7bd58cdd96a22269f1d937f88f25059214fe2a781ac519aa621d0000000000000000000000000000000019e296d5b17f78b3ffbdaa2ef5228fa9dd65abdf6b2c5b0f99a708c4721797b3b156b8df98a5a879f17f095548555da7000000000000000000000000000000000349677d4719445d5525cd65e2338463d232eb75721ca51c48fe52d0fbd299ddbd6cbc12546f056bf212d5700c3c4100854bce63dcdc0cf408b43690abbbbdacda5f3ebd9d9e462f89f9f50a9f7bd44b0000000000000000000000000000000016f5d5eb3fc3ff178843a7d21d3dd628bda120321ae44206d88f07ac001651428e0da95d3f0676e1bbb969a300406ce000000000000000000000000000000000029121c539ef1d7b9888497a362fda2f8402adf10a1bee11b53cf3dfcc6f99d5026bc386f86a2eecd0c276494878104f000000000000000000000000000000001320a402922f2a0bb287464854be6782046dd9dae4c0cd94efcb8ad8e0f37b7889bc97a3c8b4d3b3670a6924c8ee23ec00000000000000000000000000000000101fa8bb2c90b755bfba9cd7a98790b7bea2ede4c806fbd9f2006d10cf87c44172d4ba46ea40fb75afbbaa2abc3b6e9d7603824b834a83c1c408243b51cd2c2d31e2ee763d69e2ad6d369bb6aa2396fd0000000000000000000000000000000003285cb099b04b6acd333c7ac76c839b6c09388792d5fa1f2af0821e49dfbf40a06803c4cca92512bb76d073129a48a00000000000000000000000000000000005b2fdbb25381b3b67814bf6cc0a4cc17271416d16ee369b723b1711d968c355b755183f0bce519709723250515ba32a0000000000000000000000000000000002c7062ba4f642b95e028a364b0698b801f48af3c336fa09d13d83ec6cff10d210b55b23cad1d999889c83df7d1ab7e10000000000000000000000000000000012cdfdc10bf46097083294259754453e084010f7ee928cf540d44c80aa4f601247223a318700bc24114e7603922d15ae923c86e91c48582f19409b962be361da5936db02b6862eefc288f9a32d5f54760000000000000000000000000000000000669d760352e34a407aef8e141fcaa9468257b12ec08ec218f49f0769f3acd5068c6dc9d251a1b2af02a2d091f8ad0000000000000000000000000000000000064a7b4026ee3115cb730e56c4b9bf3e1527dd0f0ac6015f43d30a2f3d8d8c2659cf50247e70ca3c93d7e0a404d9faaa000000000000000000000000000000000979ca2e81663ed61486c1f841c19d83549388d798da72feda82283406d4964bc9991f876a6032382c35b605441ee7da0000000000000000000000000000000008d92cf77b44c516c243f3e6a8a8d3f9d3d7405820ab972338f700de1dd9a66d33b4a70540a30f630aa81fe1cb5bf057e1b3071b561a80aaaadb5cc24b348a2b6012340d3aebcca7e2f56983a8a13bf900000000000000000000000000000000198831a40fec54a210a63f5e00b132bb1eca6408335b85a75e28be6a111beea3b99d9f2fe5091ab0eba0f082c201c14d000000000000000000000000000000000fe457f8d215f390000efbb7fe7193ba02a2ef78e9bff6539995f01604fdca9fa3c010276afb90215890f5a5df3ae21500000000000000000000000000000000076771823180422495d89c301443a9d1fa141716e5e27205b8cb6b461a3ded7e6f196c3976cd6ad56b2e6ebb6b3a70860000000000000000000000000000000007f666efc677f6f767828e1291bde0ba0ca445ddb2d69d5d2fa090ca49e697ce4e00f55d2b706454be6d68f012d76efbb6863b755d3dee61328a60f585531c436663bbeab9afaffac49b6f0b57614eaa", + "Expected": "000000000000000000000000000000000e1268a5e2f654c4038647a910e6cb4bab1d6ca3562ad4a9ac18444c8b8a3fdfbd35acf37f9203041fd587a5175ce86d0000000000000000000000000000000005e701a8ddd15ecb0231b7625f7868c81467c140b2617e60440a9b348a192e5248b1b3c087545cfb6d173fafe48d32f600000000000000000000000000000000071327f52b1325bb664d32c513fb12afb96dd8da23dd91bc4c3e8ae5f97d6bf673a5d03bb8bdeb6da3144dedac200dbd000000000000000000000000000000001852b86d3ef45aaeb691f454a345ed61104cecf0f444e4d841f2bc0402ea1291ef056eddb3fc3929ef4623f31016c3b5", + "Name": "matter_g2_multiexp_78", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000fcd3f253d018ef09a7c6e8f36662ab4190867a197e0c42a0b425dfb5fe61d57596ada28dde0b093676ce15d03406d20000000000000000000000000000000000df00598337060d603607f3b8dd16f277ce1882a2e9ced48e1944662323efc29b33c807653f31583a5d2198426019ba70000000000000000000000000000000009876c81a76986435d34c6d44d51cf1016c19ceed2432ef1e68decd64da2e31e42372c1a41a514b0eac0ac103ab6f43800000000000000000000000000000000121cf298ff8f610c64ca4a887c52cbe940333506ef2afecffe266b5b585ff737395e2c64adc23b5bd232250e67c7a62613ca0cfc742607bee58988df361d7cd5d809ba4fddb209c898cd555369fff566000000000000000000000000000000001885d5cdc3e0e0c8cffa7519e6914e5d85962d07633970c4174ae4587853f13970a1f5d7ccba97458b9b5046847ad29800000000000000000000000000000000105b7c0ba96d5ce32d7447351ded3e3f491a0e741e921447b91f22a23b64c2d749055a0593e5b47f0ff7815e1a4c9943000000000000000000000000000000000cb88fc10c94642ae7e1d7275bbfd51a2d40e9b29f3d51a1ceda577beeb131eae4b17418f9f358d47b4b9c9ca4960a3b00000000000000000000000000000000131a3e080b1d4e936d97d255b07b09a6210b5fe6900da87b5cc595a72de2b6ddb01809e2dc63ad460a2926dd8d3b3b2ebcca8ab454fbc576a2b910f140b23c23b14301c19e1f47989d78eeecf279862a00000000000000000000000000000000066b31c0bc4b3b9fe420dc095d551903a2859556d86e210c96480f1d31d449d85ea292e2432babdb71c151c7b215cd6b0000000000000000000000000000000019d79a60793957745077f9233aee7a4f096515eefa7c49473f09bbc73fa0ee13a2a30a08bd7f3bc1d5c412d671fc37ff00000000000000000000000000000000006882160e4fa8ae2c2d48ae389d8f023e2775adb7a815edeba13728b8f6b343c45788c8e9116445e9989e01eb43e1500000000000000000000000000000000000ce53ab2d81ebaf4a85b3e12a6175ad7fb6cfbae207a69a0fe2195ab916fcb582b097f09d9fc565b837925f68855c4b59f82ceeb6160d3256228d7a41fb3caa6f305b23142ab979e728356a13309e27000000000000000000000000000000000a30d335c035afe459dc262fb1bd24dc0bafbc08fae0bed47e4e204280eb96595fada9c4332df1218748921bfb1274c7000000000000000000000000000000000e37eb189560211d6fe56faa3b6e710878a21907fdc1a9f8becabca290c24b8831e28ebb48d06bd822300fd09b4d103100000000000000000000000000000000104842b88b9df6a7b8243494eb11eb62c89d1ccbde9f55fe221c2366d6bc9149178f177628c6fe7c7661318640295e570000000000000000000000000000000011df8599d72b85ade11261076e02c036be5dfa3b6fab4ff72ed7413a879c0a0742be6c36a32d0829a4e3171b0341c6a3995f7d2038ad02deddca34399e5b5653fa471d998c52bd52241840cdb9202b2c0000000000000000000000000000000019f6634435be45b099cc739fe5c2dfa01f61fd2d466d5ea464053e2d5acf2e0e9448b1bb7770b5ad426f8a872c5764400000000000000000000000000000000002bbd52efecb10b3bb6f8bd04a5751042d8598cc34e2837184cea2b5953ec125dee871d1f2f57ebc84849e3a7ee5abe2000000000000000000000000000000001962b716342df9c13c21d89ab5b8c4c0ca191440fa709627e0f240a7ba518f4c95adfc5973b6ed0af591bb54bd00937f00000000000000000000000000000000089eec676276c52bfbb2593ef0362c12a5f3c1a0566d5aa862f5f5ba1580f4dadb36c15fdcf0c3910ee14487ff146c8997b67e68bfe2d7fc256e6aa610dd91dc1b02c64186d24702ad8fa9f715b582a5000000000000000000000000000000001556d081a489eba4fbb0c20e22b8cab432a9f6ff459ab9b0e7ceacbbd46c8e24a2ee70151b019a1b4bfe47d934afede30000000000000000000000000000000008fdd7391113e8d9865ef48b60acf921b17c50744e6ad62fa24abaae54836b3d59a7441371bdfdcdb251d252a43aed7b000000000000000000000000000000000cc66cdb1fe32beb91b05922f3920060e7a95467381d62f2f036e6268af4128c9516780ea53e873993744ce932b901f100000000000000000000000000000000151f94dec958859ecaeb810c4b1cc7a707d0e1671cd4a1e3c811910bc8b95c6c944167dd280c7fed22f92ce7650beef998115b9f84e3ed6947bd6f0e3c65361cf360a65bc059515da852a72ec5cd178100000000000000000000000000000000004f88568c7ede48d7476175f1d2e7ded4312c24934f0d47794705621f8aa8a5072b86cc41e187f4aeeb49bff17a4c9d000000000000000000000000000000000ca6c579e86a68b4041150fbbc36da744d359028993681c34e66c537eb8a0a0d55aeb9b8da7fecb844104dabeb507805000000000000000000000000000000000fec63c57d3d3ca98cd1735b2f59217e163ca53b07b4fabc4415b98377d87e75f0fcc9b51c99a57ff61ca8d0016a206d000000000000000000000000000000000940e9f93f3ccbe74c7be93236a2c440b213a014ed51cb57fa053495c3d6f6c8edc08ba8e10be26e5faa898162d67fe327370e1037b709015e0bf178a41ac55774a813368e11ef7a764eb48abe75dbf500000000000000000000000000000000055e4dd9da22201b5eb64e3b9eff2eab614c48450424491a85c18e05f50659b88e862490edd11ff980b06696b60c35b00000000000000000000000000000000018fab38f58d3d541666bc29b9e94cb3940f1794b2aa851d079b9aaa1cf742b07cd6dc7c985c7e4d7d3fe683bb15d618e000000000000000000000000000000000534de5e1c1181e951b437fd17993e995fd4aa2f6b28fc3612cd4db615de742e12d66c03b9ced538c1c7cde27752c190000000000000000000000000000000000aa8580f1da71f2ae9ec26f3b6466813a40ba5bd3f89ed0d42695d420032540194617fcc2f13e36219fc0cc3886a69c36bf5fb297948e0ddc60ba26e49ef2892ca008e64a22ff2bb21ff70c56112f710000000000000000000000000000000001804ed7677fa3842bdc3eba708bf4fb7f7d4eaf2f1a46193c861595f64196398622df4358b9526f33663138b24fef1310000000000000000000000000000000011fdd7e1d0c5adfbbbaa69ce63c7c54525091289e4dfdfb3de772a8d5a958581cc23933deadcb8856540e2d0dc564dbc0000000000000000000000000000000013fcf17235506fb194e3adaab881c7aba4b87e5aef739e0547b858410e3cdbff0dab1980b1b30a7d03d617179ae545c900000000000000000000000000000000004eed0ca479cc458231ff969ebdd4e33732953e9f5610d78d4753b99c5f8cf73c742387b8e71b9be074fcc67acd71cf6b488b6b63cb8bf34efeedd9f95dff4d3d8c067c0d807bd1e20bd267748275d0000000000000000000000000000000001082b7796d35e387df689bcdda6e0316d343dc907822d1a873adea050374962b164ed27cea0e1b834997f8274e4c5438000000000000000000000000000000000b1905979a90c7a61f4ee2cf3a9f4d6ed4c724c9e216981b8ec34fb9b528018d237771ad620020efc2c3cb104df667cd000000000000000000000000000000000752663e72390108288ef4de3c3ea409c74e7051505b12083c41a2e8937eaadbd8cd61f96f7991722226fdd02dd8d252000000000000000000000000000000000f8e4eb7a3c78b8040a115c42b5d2fc69405f8334e948b8553f444dfef29bf3920892da431cd8394cf61f24e356e95694f661845e91de1c09f581c7612a25bfa0889f77c2add31b493b37d20bcce11070000000000000000000000000000000010884516bb9916084709351ed8768c6105fa451e08d5acb233511254ddbf4e72baf9c43b56b4d7dd129a38f5b34ee5f0000000000000000000000000000000000228fc5fffef746419cc69abb17cdc63ded44892b8c5d02f0c72bc8506a61d15a74ec4ea0e1d78f555ddec07f418539500000000000000000000000000000000048a4192c204b7441e871076d91d4f610c347c2d71cf495ffcb2e2ab808a8c1a549eae96e657d756d9a3b94db2892a2f0000000000000000000000000000000017a94d2472df89104ed96e24d166f922bb852b5ad80f80188fce65b08d39cc3ecf94991c6bec5dc12f9337e7c087db2f8b3bf8d5e529912b1b6e445f592a6d151c6f5d01d3b021a31a2669df4ce02aa3000000000000000000000000000000000f6293fb0e19ec85f43a1a02df9f59ad4fb0e49b16a216ce097b8ec59e781fdf176360d8492e8b77674ae2c0ddb1da70000000000000000000000000000000000e354d09aad68fce6cde40c787ba1e4488999d5b9f3fec25c9994b56bcccaaa746c958bd16ba271485f461b0d4e983200000000000000000000000000000000014fca0851b0bfdf2c69fb346f23b46135d2b7914bb49e297a0c1304d8c2851ff6bd0a0bb364938dd44680fe86cfe12e300000000000000000000000000000000164e23a53103dfa332e5ae09c7c898b95773c20f019d8b794a6b49594040e2e090db6a8047c943885dca95188e89a63b30e1c8f222019b877e66df0b6201b5bfc5b6c10aae340c55e74410a536ffb9b200000000000000000000000000000000146d37241ce4f71017e4423dd0bf907a12c1364ae9fc6dfe535c25e5e99e03ce157cbba2675829b396a69f92668107280000000000000000000000000000000000d5a992f5357615f436d95fa516212812f6811dd1f1921ba4129e84e3d487b6c97520995d8a65f6771dbba9d150c7ab0000000000000000000000000000000007b01f86574a9cb7eb3b9a19b6040055a5c11b13e7071078d16b9ad71f714ed28ad25db9511964b156ee34db22385cdf00000000000000000000000000000000154c29c6e2b21a75b14159b183e625c98a04be1850b22d314225e94b313619f641ead73130c1d6feb85abd8c9e172f6323a258d66f2296fa1c71065cf23c994eb8c6c35d35120d16790fec791ad215fe00000000000000000000000000000000075be2703b8416fa07a7cb6ae8841dcab1e36b0ea24231dba617a2fed3bebf8d952d31f68c149dd17eed136fe37b01880000000000000000000000000000000001156563f1401b731cc23c4be59e69b0e6a0827df4889cd9ef9e11310f679c1603a0d9c9679c29b8dab75ae51f49bfe3000000000000000000000000000000000663faacfaa92fbc095a5dd6b1f2dd141e248f84eff1716ee71bdffd4d28ef1f4c88828e3457e8ebf0daba1416d2d6070000000000000000000000000000000018f2871f5897aad9ff6ac45a9c0e78be8f312f07af5f1dab2bc4705558070abf367f1782af896288a7754da82bf1a5141ef4055b85f37b548dac2b64608d99ca293548bebe1e24355393520c34eda60a0000000000000000000000000000000001618a284286899f501f46c4761c93b68bc8ab3157144e4013e242e1678cba20a2d978ab53b4b43145dd6062748df541000000000000000000000000000000000c25da737368775e41ddcd9c64cf99a824afacb1d404f1ef46ec7fe4ffd89673648c5207551914e6e0d12c57e7d7682c00000000000000000000000000000000097ff49c4872e2da1f6c24fd6dd4667f0bef4eb30fc197d13e8b66adc425e39841dea011d79e4d775106a19ea1978f4c00000000000000000000000000000000147426b7d9b0bdc2be051d8f6cc4249014e1bbc2369bc32eca94684483f50ced2c07be6a320effddcc1ed5cae455fc92212529248c51c95b5b26961f27e6d44ef1c2b9233bb2ed32c3eee79ca6c6eb750000000000000000000000000000000000cf68f7ab056c4689af95b361ee3e3b1c1c48f18b5aa655cce1a2be217010814b3f07dedf6f9a7b835cb13e2afd7136000000000000000000000000000000000dd6d0fb94048dab34410dba4e682f020ed54a655099fbb6f6e94a31511960f0447d7e94143eea88195291b225d11246000000000000000000000000000000001864c6ad3f2f794239a179647d68734e23b3520b79952bda20acf2f5afe1b76bc18e35b852d35a5cf3b02a3ce86f640700000000000000000000000000000000015ea24562d7bc59d813b77b2a4943f9e98842b5a41c0c7026077a02ddfd3d5fecf352d4399f507fb12ada4ac495ddece9888dd839d9b8c236394c44d358f452a4588ae65d24ffe2bd345fc745de9d37", + "Expected": "00000000000000000000000000000000080f0e50f90e001a442965ba7900997fcc89246742590b99add6d90428d3b61516664654bc8fb423f701e85a342a668100000000000000000000000000000000003fa9e84ddd754047649b7cfcf5bd78852abb298b3bbe6575c4c7dbc2e7595499a9f42f379a2463aa74f29e5c73a9040000000000000000000000000000000009e72d3c418726f6400b8cd8b9b649005f3b25ade40cd6f77a0c3cbdbef461e917d4453c9e07ded45301d21df4ec44db0000000000000000000000000000000015a06cac223217602ccfba4f4586cb184994bf08b324bf977dbb3884c394aed0622da7dcf5712970554d73b18e2733c5", + "Name": "matter_g2_multiexp_79", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000007340f432a5cd5aff1a1d98c6ea1c94be24de2d15a4e112925586c30979e23a5db93643308d3299e370b1f26bdd09eac00000000000000000000000000000000155027caae88381a60af71b2fa770e58efccfbb7642f5ef6b1591bf77e415eb117ab564aff8d9ebcd576f813b793ad2c000000000000000000000000000000000f604238d1b28f010ce8e45f2fe61d3ea20b902a4debbabcd54ce0ecd44a9540fe2bfe847178656fef0a5fd7e6d012b3000000000000000000000000000000000d7f503ede395dfa5682aadedc98bfe28d3fbfb52f42ecabc9eebc0e0a6616d3671604709f28255f50b62bee641d2711f812322dc2a7d5faa9e4877638faf8492d84e0f4c4c65ca3aadcb7eafed2106400000000000000000000000000000000176e1f9eac4dab0d253c0ff41b7600437b53a5ac5278d544a9620648e0bc4dc56aff0bda973fd1338f77fa174d8b13b90000000000000000000000000000000012919a18343cc166e2dfb92ff07bbf838779ef0479985bb85b3b82f9d0632b3f7a19d387f725a21729a77c58dd4d1d1d0000000000000000000000000000000017eb269ed75fe0403021ce70505bb60a711c91c551931605bb2a0773fafa07aeb47cdda382c0aa64f40f5e6e0e6bc77d000000000000000000000000000000000bed8ca999a4691646124a140fcc17dec02b74bd28b599c807abcaaff13bff65aff3892897652cd33b4ba5e4cc0198a9c1f6d538c5b4ae15c84581f8fd4c61160ed395816557fde197e1a013ba41ba0f000000000000000000000000000000001344d6902f5fdbb59a4c975847db0191beac284eb17cd92360e59f42cd7796cf2aa282bbd4cb074c4ee10b489ee3f2f60000000000000000000000000000000002158eb3429d0532792532fcceecc404e95a879be68b3685ae94016ca3762438b3320553ab6d5fbda3a0b615a04d996f00000000000000000000000000000000118f6fd8f60edf7088a0b4b49338bfcfc9c38be230460d7516f317b27c07600f504c8cc87acb0c95515c3acdc1b125ce0000000000000000000000000000000014eb422d44ec6931ac9860a6a017a907e8ed76de91bb7557e818dbacb19fb51457a1f45cca91f1d1d75a3567a3375b5cf2f6a4713eb692f7667fba2a3dc35363c3ba163519d95757daddefae11a95853000000000000000000000000000000000f2c72c53fdb1b0cd13a1f20407c64c46e4a0e461778b0e2d48c4f20be7c655c639b38f758fa9199b8395f706df10e7a0000000000000000000000000000000016e6c75cdfbc20c5dbc2dbd1caa66be92911264d407ce3c689ef3ae1dca44dffacb4c0d8a78ac959e47ac5c454f607bc0000000000000000000000000000000011c5d80d52e864b0a46fb48488f497fb85f51ac040c77b1d01336860b972858c0a6e59914112f6cd6c1612c604d26f56000000000000000000000000000000001136aa7eb63d6f85d665d0539975a9a51a9a3f5bd8731910c32130b1ec8b07c39eb42e4f61e7d22bed933d9fce1810581022e50c3fe7b2a65aab79de6d9e47c457d197e145592dd0611b1dc39941513b000000000000000000000000000000001306612f5119d33f177b8804443d14d04c8e059e28f63aa10ac6a1b25975327f378d5d24f0236e05849f07e99af93ae20000000000000000000000000000000017340f8887292264d498f84fce4af83573aa6cf1d57d99d364f2b84e1734fa4f9a1e07ddc81a2135ad5f5e0ed2989585000000000000000000000000000000000f65073250019ea69339379aacbeae7520c1ae10c8912ff827b702bdab2e15404cfc939389587364d811054b7d9f2b350000000000000000000000000000000019742f83ba0c9d36aa1d595fcedc3cdfa6c6f08579e66b8956fb32ac03530114ed4266738c57175e7a10313c8dd42deab80011c7a4aa905d4db6d4f6ae46eac9eb8bb18613d4ac5e5567990d7e8fdd96000000000000000000000000000000000b2513f906db531d052e8e6f1cb8d7d3c41c7ec3158b370268d1de204ed8fe7618b64ae35029d1718153b5bdb8439dd90000000000000000000000000000000001664c367a2d4170f463c90351cb321608e2a49fca6f3258bf10d32c39747084cf9d2c38d5241888aaad97985cb09a450000000000000000000000000000000014de15b86461cda9f1be69f43a9ceadfe7b7d1548a206f3237d93c7c01ee554c4245fb73827ed0ab72b99a62215faeae000000000000000000000000000000000b25e458522be9fbdde4554b1a0d9af157aeb7d3ec1f89185b193c0429125dafa554d7a531ef9502d443a26112b940b8f397789685a736375ead2312874174795586e12b230669a90d072fa636128c7d0000000000000000000000000000000006862c0b0e3d7bc4507bea1df82080745aff21b7549b372085776be2f88aedd4cff00ab8258aa21e63340963bd0d937b0000000000000000000000000000000017199c5ec3a2dbc1f1e8d74648cf8da247e35cb07df22629b3845274d29e473819a31bc344f2a2bd6c790530cfcc0126000000000000000000000000000000000e7fd1ff41d86a02014229c5085c886988dfaddcb60f5c7c81063e8289aba846337d61bdde57e276fe6c65bdfb48751f0000000000000000000000000000000010efa6aaf7650edb0c74d30125e36cb67cffd1c7f57932d92ab4aaf36f8d9245d7c75dc2b3bc8f3f328589b16e26230e28e325fea39d61269c576626984f85ea43cd683b08c3ce111aac0005adda39c5000000000000000000000000000000000935de4b16f5f9c0accee77b5820cf36c24aad9953d40a2409b7e6040f09f85da7d2252843f9f8005316146caae539800000000000000000000000000000000008a8c542111951b32bb0b50f7631f8938d22e298193edffefa3e0f5c861ac8205ea9b865f9420ad74cd22b37c5cb56200000000000000000000000000000000012ddd660879a1f52ae6284e14f2ae6ea381ff3f321458cb76bfa566b04ae19f3793468d0aab652a82671be74332a3b7a0000000000000000000000000000000005eb148c35732f7ababc73861b71fe4ea5e25bcdd675e975fadd0a9e0fc54e175b2e39dcf0323f4a9802a68baecd25df3cfd9bc41303803a0b4edd121b818a126bece309dfee4133aa5314cb8a91d08d000000000000000000000000000000000bc351eebfd3f3c332268055af1655c8729cea44eaae803607198cf747280adc0d3dedba137828834af3e7179ccff4c3000000000000000000000000000000000d8a6cca17e1c6ceace7c0ab1333ba76ed6c3b114bf99ff80127c6a17eb0585bf6fcce871deb7385e9a8896a21c065ba0000000000000000000000000000000013222db97e31e28946adecda10c9ccc9aa9fce33e0aca51d6483d2f0c5bc3f33994ad516215f8333e22167164ef5459500000000000000000000000000000000144d3707b1898d35c65ae2c89b1570971a9494e8bd23df835f565059554eb7b5cb66a6eec890058316aef43d6c6ff55c8e08fed30e422868f37c422d1efdcc93912d55b0a731479af863dca4705e0c5000000000000000000000000000000000138da93a9a4948d41a6fc6d057a217faf5efad863b45ae8eab311360c033362213edb0ff90bad6c95f60b8e1131336e6000000000000000000000000000000000f41766d9b57b3210d315a2b8f90aabe591c1de6037ec79c0d72a283f0ac3094436bb97b82b7ad12ff4f471a41227bb50000000000000000000000000000000009aa4f5b674782b7adce6bf75ad676480f96a58d68dd7ef8d1fa488cfab794f06e7754e9315430189eed265913db8b300000000000000000000000000000000004e2a4a48f02079c0ed50c1daa91b1216af481a982c7aa64d8ba90449ed886cdeddd0cc08f1f8764f7f8c5988fe677f5674ecdf795b48d62f0db0f9cce057fe570d15c78f2eb7a77b66e4895a45804880000000000000000000000000000000019c927bbffd96aeb9342666e1974d30f9dc215e8eca41c24244c63c106331ddad20d64c79faf8c5baa45cd30b561e167000000000000000000000000000000000523f063de96c9b77bfe5c5045a007e155b45dbe68c5f1162884f1d942bb385bd34c2a37e5e67e6dae4a23d600d75d1f000000000000000000000000000000000c221006f5bfc8baf43826258d0588d7c0fc345d68de1add1693bb897959c2cfdbb9c165e82c0c787529cd7be85afbc50000000000000000000000000000000004218e3d52b42a4504611929f94024326f38e78bba2aba105db3ffb4a51f8906b060ce2302e22ded60714d652a234c1f288fc80d07393f629ef2732879332a253b49d26ca7b2bef7cc49ee40530b2b3400000000000000000000000000000000189e5063a36b0edd736bcd9f997f4b08c62d33b27560e2e2b7b40039e7c63b75757f23746e70a330110d975ca683941300000000000000000000000000000000013393485ae494b1f1467cac9a8840c695d619aa1a78c40674038c053f264c1e20481f2005abc7f0545346f5a982d05e0000000000000000000000000000000003f2be501504f4d37e12acdc54b3280671ca0762a063fd3bc04473ed5a051cae3767044c002b7ed1abe88b2143af08750000000000000000000000000000000009d5952af88514996336e1ff19409e3e4eb3079f6dea22f9738f4a331ce842b151e0b842b68cddc10a711afa6d3242b256e69f4ce8fbd8f86f546fd6d129f9760edce7c5e178dffaf987bf565e9bb7e9000000000000000000000000000000000a79444c673e630f46bbc5a9e06e8c023978a78e3c58d72910a04c3733ad873c0d0de61448076b2fd3764cc17d86d94f00000000000000000000000000000000110cfd215d67d4a091578203855fa0e85feb4dfd0076fbfad20bd092fb91b528a4117850955f5fb6568fc5844e17bbfc0000000000000000000000000000000012ece0577512182c50dbb4a485256e705410108d9ba9c8d57780d49e2e25a0f89ed1fe917797b902aafcb8f7d98fe931000000000000000000000000000000000217cf1dffac7ae162181d43ef12e3e88da4840f1573d7ffa271f64d8d54861099be37b644e96e650dc613975d8a00a4ab40e86212189e6f5925df810141c132eab20c123166cd8d3c6f40f5dcf1b1cd0000000000000000000000000000000010bec428b2865aa7c077c168dc28dc549481c6f8367a5b84cbbad661b0225cf0fda3e840d96c4e4efc36c20d48f23d5d000000000000000000000000000000000ded3a1e9e2eded0a11211a217f9355070361f0a5887a7e19c74edc8768000311cb9dd8513977ecfb45416cda0908cca000000000000000000000000000000000b99ffddc79e825f0b73f2d0229d66e51624d854d00bdee5aa7a884dcafa1888963e2a2149db0f6e40ce3c67941a391000000000000000000000000000000000147618970c71965684bdf0d6cbe1de189bd23bddb2b861c9636efdcb7a96dff27bb1ac70485b562e78485a1e8e56531cb96a5b6129c58113bca713e6905c026c0bfdb6d679c203cbe2b256b0a49ecece0000000000000000000000000000000001a402aba8fb28dd37f1be11fca037baa99a6b57188ccab66208a50bb6967dcacd1943cca73e34f6b2e2f72407103a73000000000000000000000000000000000c0bd64d043fa4e3ea566cb84f9139091891231ff500b67e5fd451805f79003f6303352a4f0c236063d60d9088fae88c0000000000000000000000000000000002861fa7d0222711ffcadac86e7b9e7b494f5561c22544bd0876fb6e1b2e680d0f7074c2800312cb233de2412ccbbc8600000000000000000000000000000000015945f0c83e738a17cb1283d08d63ecf12a7272bc62812006ed78254bfc45ca7c42306cb79bb16ed17bea600a4d62b5d9d8147c4453cdeed971242d316e350abead3dd08e93ee54738a4a5aed23affb0000000000000000000000000000000002268793f6872f7715d802c0d96f3b3d850249d8e70aaa97f19793d2c92e7cef384aaac603eb51525c7ceccdd0211fc40000000000000000000000000000000002507d680a2db16746810e966d1ba5547ac98d08c8402aed0859203e6dae0cbd87a9ddcc05119c1ca08fca2fd733882200000000000000000000000000000000192426b6438b2abc7386599afbe09081ed4908fbeb807a65bcb7c6676aa76e5e0c2c87612cd109cb124c73b9c8e0591a0000000000000000000000000000000017f125a2ef5246e7a19e1b2741b31b9224511ffefe63ccfffaef1b7949e88af573e267d6c7617ea97bbaee6d50eef67e1ba8e52986d3bb0421eb53b18ca8c21b9f7e631f16b99ec56748baeb541b32e5", + "Expected": "0000000000000000000000000000000018c2f533f464f9768308a56209711cf9b6653e8d38591d782ae2374905f99f75c0d42c63af4b534056c28599a9da874400000000000000000000000000000000071d4d708f00875545f381e164f77183e14faab599e472b2857c15091254ddaf5c2e9df809875336f92ebcf5b7628da500000000000000000000000000000000099b207cf6ed022289c27393c32d0b83aed6c7b57323e746374c1a8e2ade071a5293168e72f7aab82f6c2e39b97b03830000000000000000000000000000000005dada01b4dfb6a52d998210a67ccedc11d6aca2405e0836280e2f7c8fd7c8dd271c815a2e9ea1dba6f1ab0d6e89d756", + "Name": "matter_g2_multiexp_80", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000195d3f440857011bf9b764ff270b8ba1d9d13daf48933e49c12ea20d335b58bcbef1353d9698a7e795b4370ee385f12b000000000000000000000000000000000716c151efc6e611b5b15c749eaf02816a86e267428750741b167404a21116f2025d0d07c447b9c7bee8edcc2c7b76d30000000000000000000000000000000012ba0bf62b35327111d09b402db2b75b2e835cbe581638af2fdd6d06034774533e6501be3de84e7075e4184e11fd81a8000000000000000000000000000000000329b14859d004c146047b03870371f53936e078ddc69294ff1fd6f42cf2a354a921e5f2e5c125c454e20af97dcf769e7d39b55aadd47afa3cd35cb85a89e729ca236ada965b99f64ab302a84952babd00000000000000000000000000000000042286dd205ac86fdec3fee779059e2ad59adb62505f7b78606c128244b031c53dc40ebc2f5afdba348892d5ef4c10e7000000000000000000000000000000000f960010d4818846b3a0291c6fe1aa53bf0eafbc0e0968e3ee82324452a7c1a8041c06b4db9cd36a07c119c9fd2f9038000000000000000000000000000000001876da0dca72869708b8ff9ea0b74ad6be25ba82ccc76660246413a04344f2b72e5a7f6fddb58e9dc0bfaa6b33a5fadf000000000000000000000000000000001538ad1673f117493d998941d9356fb9907f70c279bde8ae8813b9c7b371344456f8e67cf02bf3401ee06d55604cadf9c41ece17a6d8b4a22994227b37a9d73e17a88859683afd5d226e113246e70cb1000000000000000000000000000000000d91319b4a5e047ffc8a68e10c34b2b90e7f3f08f9e3ec53ed12bba5f66c168c20c6583ba2016f0137caed834845f7470000000000000000000000000000000018d5542919674d2fc32430175405d806ae4abe3e1236df2188bf4c9ddf66c0974036e28414890212ff8dad244d11e3c700000000000000000000000000000000160b128f1ffeb97edf0e62dff85e3f90fa48567ab777a7937a2c0e4659df180fae4565107c2236a5f2808e42a03a4ab40000000000000000000000000000000003ee74d214ec491331fb9db8243e75570daba9feb587671496cea4b480d80ee162c6294c082203534bee450c384f645e69700dfa3b6e5fba735d1fec3b3adc90719ec301c406ac40673f4e5677da3227000000000000000000000000000000001951afa33800a366944c43bb42b8c5c8beb9ea2e1cead8b84e0f94af51e4a156d9454c0f08d1b13c692c41cc480fdefb00000000000000000000000000000000077f4543fadad6f2f8ae8d5d98f64965bf9626971e7efef5221cb4d95d51b8764324cf4a11d0ff5330d58df70cb79d92000000000000000000000000000000000417251cd0c1b32505377e51bb30ac8a8a3c059644b9ddb5a058b3c6e1110e1c71ee19f549b15090144dcf4668d0d50100000000000000000000000000000000052133be345adc562238c4ecbaf76ca4159fc11ff563ab393317b03065ab668e7df401831baf7027f0577f5791b1ca3019e8eed297661c06c92075629e163e80a08835254f7af8c0f179400be114ba7b00000000000000000000000000000000067bd52b7a3193d31a4f1ffb76432c8d4108442616f17056d310fbfee2ffaade9437e2bdb8425cf83233f0c632efc1170000000000000000000000000000000011b045d6eebe1bc8218b696b5e81e78db78eadf1b5d987060c1bdd73aa65666f77e1d6bb6f3d939d64cb3e6bda08994c0000000000000000000000000000000016eb5ea5067413b72632f5300efbe0d01a284b2a59b68d0333c269da9302bf0f0cdc923acb27e51bbbbc1d4086e6b06a000000000000000000000000000000000ff37b8812963d9efaa1e6deb5cfd34eec70620fdb65808739295a819e03ebcc8f501b8194d0b3c72717fc922b785194199ca6fb7f6df8a2e72971c5738ad75d84935e922587acf3a6b6debf3c37bb5e00000000000000000000000000000000149b5e0df255281c1b518427094cc0903fe89eac9a6dcdc379b8ca30f3696d89824c201601fc4b0795a3c859a82893170000000000000000000000000000000016ee9e7d957f439d078f3c5da98d114a1b5bc4da9c17e117e1f540dcbf83a349bba94def4b87b63247f190e3b5813cb00000000000000000000000000000000005d4f56bea105be4bf1fcaf4f25df30f85968d59e60b1c438c28ea0f480851f5ab9c05a7ca6677e6f12c7dd3ed67c2e0000000000000000000000000000000000dc0e87ca5a8b339b485ff3da2b9854a07e9663c43344dfb5ecf3ea055eadf67405c43013e15367fbaa55f1bd8e222f98159c6b98bce6ed31c30957280d8f7820e9376093d1ec9ac68ce0777d02b084b000000000000000000000000000000000b0575fe2adc9ad66209cb2191efc2946672e4e81b96d50493d2125d9c83165f0c4d3f714539eecef9de0706cc20da9b000000000000000000000000000000001511649f0cb6b86111d2830812231ad37df5500d7ce1086241591dc3cf40b30f1c53dda3133b2f7fff253c94d5eb98720000000000000000000000000000000005b15e4e32f4f4e46c1560792a9973f6ad63f5176694734f379375f16a08c162a4a820385d3ea6c191bd87fea4f5c8cb00000000000000000000000000000000089218403fef08dcc6e679b49a74557dafed3278d41ff36a9801db091b91de0d46d779a40574fa4a3f2baaa1a14be098ef1bc580e0b52b10b049f07d5115a60ba96d14a39e48ddee3c219f11c3b2a82a0000000000000000000000000000000001c35a3fdea92b28c9ab4bd9ea592b998853a73be844b9dcb500ed6704bbf3ca4ed4216dc24b50254b6ca75c4ca3e7fc000000000000000000000000000000001815292d2a365dd7f41ecf3f9a89e040bab717241cefb3155a097eb9885d64fa55f5de7023f2ecfd33f483ff304666520000000000000000000000000000000013df522c72805b890aef97864ec6769f569504fca2d6a6beae97f80dc92643f8014daf3dafc0040dd7b985c0d9b2c462000000000000000000000000000000001155ad4373a8304fa6301cf48b4ace135d6a0c08cb06d624f42f88073e43612ced3cc37235422171b43af2b4ebbd5662d06f6ed682c56611fd060ed2b3b1dc48974769ed6dc504ca3e0b9f68b77e63c5000000000000000000000000000000000bb9afedf7417ca31beb96486b024af13c06007585d785efd1e78444daa9bc3c03e1d64b560e8d6a18ccf77a8c3c8d05000000000000000000000000000000001652d3adcf1612e487a9ca198801afb9ec30267148502684c2b91c05ebf6c48e2ce33f9c0a986daab81d5359ec1b503c000000000000000000000000000000000baf3d34bf4a78e3b9dfa637c6392c7f4d7ad0ec315d10748784b5b60221bd9da0f4b75c57c139ac2db329e270d559de0000000000000000000000000000000000c30e553fa2324d552bdbc7d2dc86531340c4894495ee9a38b64f5bb6f92314021a2a00c4bcd8837e55a0ae2676a9b761d7b314ae9d9e78f628ec5a207d12e2dcb690688d256fe46e0affdfcc9775ae00000000000000000000000000000000159a1e4e87c35aaaeacdf21efbf8ed99fd6a2ddd7e990c12407b1417edaf185b8f1df9bafbddfaf3d581b5d97d7718300000000000000000000000000000000012239ef7b1e1009c81098aa4aaad8ee9e003530db5afd49867aec47f46d5e29d44b5e62d80d9e832937a299633e863c80000000000000000000000000000000016af6f74392461a9294d9f848508651ca5c0cb50494ee7c6a334bd770580b924a17beb7824b489e7e101ccd50aa0d5cf000000000000000000000000000000001912a0f54ba4fbecaa55c150ae93455e1db6b238c032fa7992bc8456f183c09b6005dd6398a77ab91cf547919ce7485b03a0c47621401fc20d2c78f7e30814de9a6f838d4328a5b5be628b833c31a6fd000000000000000000000000000000000cf1cf7a09a12f51d10059425042ef8e140718ff11d2f17897a0156034f73ed29496d93b8695cdf609280d319c9bb742000000000000000000000000000000000b2c4d26fa1eb72eed1a24f27229d2675e0c6f91e3a4eba7d34b0fc1bf5a9b4eb49c3492d9586669abaf25a656e1f95d0000000000000000000000000000000012c5c83a03087b2449b71e9037591fa265d710ff6d869bfa18ac37cbdcc93024f673128db3dbad9e3517501af12f2540000000000000000000000000000000000ffe5824245e43953e3d0adcd5fdc1a97ffc87f8c5473fdb0fed57000fd126a9925ba7415c698248c51c1f3e12b270d5e4ac6a5e740e073c5ef8af389e70c2cb8ee8c4c04c2ab4c48c579e83e181005b00000000000000000000000000000000036aa888e40882b2d6ac71d66c88543e32b4a0a7c959eec560e3d26114d8aeca63fd87dcbb3171622c989a6c7a204ac60000000000000000000000000000000006a5e552e6d2dc95ab8636a8be16bc79572b47860bb88934bf04c195ec01fd71eb91e45f24c58bc2812ed5fa10c8dd7d0000000000000000000000000000000015fa3ffcbd4e562a4bc29975cf8c1eedf442e37374fc87128e6f68bcdf6e996f6f054e0b8c608e651753de96655b2c100000000000000000000000000000000019bba7c0b170dfc1f8fdbf7a2e09ca0c4027a6aa6930d15dc2772a0f20e5e56f0d11644094dc866595f801ba5552e6c4c1e20d8003fec60f68c03942185fed934ebc197c2863174442d1a1c8d1424d31000000000000000000000000000000000341f46ec06a8def4f044328bcdaa308798469c767d10e5db34b0ffb6f550421c67c6fab7b63cbc7504e55847cee419e0000000000000000000000000000000006952e5f791c37dfebcfe69cdef196dff66563b29e94927e3ab34365773b93e72251a63af4ff294af88d45fe0899a2c3000000000000000000000000000000000874dfe75b31450e99dea063c090e32d24fbff9b681b64a9dca5f967f82003005b003d17eb869bd3b37d4a412bcb28fb0000000000000000000000000000000014203b69e8af4e25232777f503d5e82d6121256fafdff1b037f65d5aaad0f09ce882151d6bb4705328400f00089dcc7a7713ea72a2ee99442232472ab3dea9307a02fa1279129d994af5588af4fe7af4000000000000000000000000000000001403fa3f418107e0bf7f3f4bfcf621812d32b1b744ab5a4c37b5cf946a5e5dabd675c2b70bd355590a9883436c5e32dd00000000000000000000000000000000069e006f168bed4439fb46db9ba4f279f72ed608c12a05eed172608693f42cb1f04aaa54191f4b0b35f967bf03d0e63b0000000000000000000000000000000003f9ce029f6fe605802de64701ccdf52bf4aa299400a6e1c36f5a1f9173bc11a38e7628f123fdcae01d2b260f77c577c0000000000000000000000000000000009c9732809f60635115cb479c80457c6cd8dad092111d663c0cda0da1fa71c9bd6795ad013d2efaa4599c8ac5c88e5f26f128420cf6ab4616a05b287191105f25c7212f2c39c3230fa56bc27cd06ebfd00000000000000000000000000000000115e08d8e4dff7adcfe46a416625be0ac26ea2d7900f5fed497809a6d46e7faa5b47c52ab3bbeb9fb16d82b549707ed6000000000000000000000000000000000dd1b31446e44f64ea5046dca5174ae854f6bb5d95886fb95aa136d432f1a8c03ef1a5f9320f89c82f764049a7f678a40000000000000000000000000000000014879783c07e6986cd393fa1e0ca8a7e23b2c9efa595229fc0b6a11b9c232ba33e92962a1087fe2ba0532d7b541827900000000000000000000000000000000013dc6e2bdb2801333e7f914b99f30b40125fa1ebd49b141d88a8c090b15ec3250a13812a19c3c0751a4e5ed100a6f0ba12bacb3419c34369dbfd1c968334f76bc50885028758a975cc812a04e6feabd6000000000000000000000000000000000a2cceef36ec78dc702b6731dbaf8cea1dc2b41fee1b235673c6941729bc5631e69ff37900479391a4d10b300fbf3eb40000000000000000000000000000000002f4881fd626f4ac434bc1e59716e5e5ee14dcb9adca4d639ebc9d86e323d274ad8ec0a4b1e6ff92e1fe7928d48924b000000000000000000000000000000000174cac80e7bc63989f58759e123513b611e9849b44d43a362f2eb84421ad008f3ae9e9f0f233e49fc8e10c1824ba948200000000000000000000000000000000143641099c8a6c8153dc8ce74debe795dd6c4487e8234f164f9f8dcdea6a53619c04a8fac215421f985557b5b956c20a5b00f26af6f59620c7130a6d12cf2091b5f52a6b638484fc1f242dc1773be256", + "Expected": "0000000000000000000000000000000009807ffe8fa881b235b1181d2d3f147dbe21042524fb0c0b4c90fb122d160c7b895034ab32e20324dfca564ca6e3183c0000000000000000000000000000000010f6da88525da3e86ee56cd5514a436e3ce4128e437a876be130a70c42444a05ac269326c84dca532ca2e546860027c00000000000000000000000000000000011396a7317918841ba171ea46bbddc9bb5a08db7c82b90008c6982b4b79a4dafc151081bbdb7b9fb79784e603e15eb9e00000000000000000000000000000000070b8580f303b83c643a484dd031b780ff4ca2ec805d8c538a0b0c791cc7f8163654f5e5a41776a8681500a6690e24a4", + "Name": "matter_g2_multiexp_81", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000f38906bd058e4d32403fc3d39fa57bf49c0da65ef42fb129332b91c184185de4f9f0bfe8908a44833ff4ac4d65b88180000000000000000000000000000000014ea6fffa6dc462463c15feace841697698bc521f608ed0d16be5097bf42aefcd1f73182f37b6279f989e9668a8076d1000000000000000000000000000000000f56d296323177ce53c6977fb60e445278e59ed1cf92e3f68c570eb7a9e5f8afbec5e2ef64674bbb54d7016c829f72750000000000000000000000000000000001b29012ff3460cbe4a07bdc65885718f217cf177866823a7cbeae18bda67f65913ea20bb69e0ffb31bd82f19862113dacc5a8ec806f2f273120457865582b08697904a2c6510bfe9ea21eaf682fa4fd000000000000000000000000000000000a4126bff91ada057ceb9a75d577120c7ac8c9ba62151602414364cf88a3e12dfac90b5590db3e40c16163177ad4e7520000000000000000000000000000000004a3768d326c4ebcd5ffed89341e8d04f89e674f3f2aded3205a7193e11c20115b3c4d595b959d6e39a03d76f6b5925b0000000000000000000000000000000006e0ae4a9c45bb69c3a1c65e26e4869f2eb18fefe584e4598ba99c0044e8d911145a5db3f57194ceb6201e7eab9a81b20000000000000000000000000000000005be2ba6b147f3f2052c4877c90ca364427c6721ab64dd35e89f14f3179564d8812b9013e3e3db22f69afd739229682b98c15a259b4dbb8c300a39f0af558a9827112f6b4c5eae3d43bbfe057eb113cf0000000000000000000000000000000004c36cf955fc81bdba4ea8d2ecf934adaa57fa4073199f77bd0428d3ef80a7d7102179d4a44ef0de887bcb3ae915408900000000000000000000000000000000138bd3ec7a1b6fb65d1df6bc1d2ada35aa52b06729c10b5d45b9bb7cbbdf41677942b99eb9c2d32e3e73da7d5f9cfed40000000000000000000000000000000000b0291ca10245e2f7a963fa07ec62b15f6bf9e7a5a7839840ebcbe538dfecaf2114c7864a16564a5b3c85c15d97fb7a000000000000000000000000000000000b436e912b8a71cf8050d10d59017eca6e494e5440f02d2816924ac9cc2034bedb1cce6eff5c42f3dc57a74cf1b51cc0a0e68bdc97fd642581f7e62ecf134df2c05570713c96fa733d3db96ace88f0f0000000000000000000000000000000000c105ac7475ed9517a0b07f25a030a5616952d817f3893181e352907c7cf4ec9f5f3006e37b1da97e9cae4a1213584e20000000000000000000000000000000002c112c18268934823d5946d2322d0faec497d8e18736da91d2af744d90f74136c49370a4b43952152c62820d25e52ee000000000000000000000000000000000fe2818a397d70543e752e7022f12bab10f1b1289cee61a0230d545296ec872e34d8df6edf7ce9980f3c153e6e51d96d000000000000000000000000000000000f479e6a52bfaab3a31aa9a461adbec8a390daa8eb6273f9e425eeed764a6dbad44d12778bb888aa5808df272edde401e5512cac411cd103fcd7497fdf47d1221999bcecdba30467f06ec356483484fe00000000000000000000000000000000016106cb42ffc41d5b23bc5b06001473bdfe556d375fac6a0cb0a12494e9c02ca2dd6133356846e1759a2c485faf5e890000000000000000000000000000000003cec25b0f5d1db0ead5319d6dd15517657d1fec442facda4335ae0bbeff606fa9caa6a4c00445001180aaeef895d7fd0000000000000000000000000000000016ce3573fbe27a8d23b3ebd22aec989d61fbd0e41a519c5e2f1d650f2ad73adcfc8c840fb12bce83b722a0cc69164e21000000000000000000000000000000001434d13d44fd8dcf776c2a045734dff7c09ded31c9e3a4b5e765cf26fbfea4cbb4ac15c06599012a7f2cd572bfafd78ba32f6861298bcfd4668653544b4551d7357d64f733365a5f08ebf297a09fd4ca0000000000000000000000000000000019923ffba0d08ebf1bd43393142d61022430356081c18e37804172082c7ace987ece2594f4852e84604a77235c7795e000000000000000000000000000000000123acf9e1a86846ae27d5fc0358afa34fe9d6b68232c9ebf2d47cc169779c4bd24f225ad30886fdf68166adfd9898abf000000000000000000000000000000000a6061d4cef29d1e3535d54a2e36373e2c16f91543f53e1aca94c4abdabc663049673f2327ea8bb574244d7f5c99e981000000000000000000000000000000000b1f3e1d43575a74584ec7a3280f8b7196f9b99b5e911ed33ba6bde1188c82d906f0f8e6fc2b285fefa0ce59116e449524301fc5c3ab842d7f6a278fcd32249f1daf86a31dd254ab9a21941fffca98a1000000000000000000000000000000000373d36dd0fac76a0fc46ba5da279ca3be5a1f8d799570004e429256787110d4fb746f65a8527d0ba681a81b9980bd5c00000000000000000000000000000000057933c2b3e482ae026159211c4742264f7e890efbaeb6e14f3bf66c80923289af095dc97b751a117e181ef917d049b000000000000000000000000000000000068816ad2369bb57b3430c657284858d3736c327284e7410b61ed444786bcb34a66db9c16aca583aa9722aa8d7975b440000000000000000000000000000000007fcd7dbc062d28f6ef906f6a455337e517e1d6e6c02c7c0b2b2685b79f56ca3436c1bfa0ab96e4a5eb0c2e2c321c0dc17a920aef58100de67c482ae1fabf7ec87cf3447bde1e19d9aaff825695706740000000000000000000000000000000007bb0ab060cc12002e043724c0fd0c8bad30e08b65ba9f2fe5d09d18cac4bb2d50e29ee14590ca7bfc505f3ee3d4f93d000000000000000000000000000000000e680653d29eb5d90f21802f543eac3102a1de6d2a5bc943a53dd9b80bdcaa6951ced2eae5e2a25448b40468f1923ebc000000000000000000000000000000000b7494b494019e3ef36d5c620ac56483fc6b1c8fe5c6f67537b19f56ef01db327812095fdf805d3dfe678a3ed8bb6226000000000000000000000000000000000291e5b98ecaf7aef0374647d28fb9f8785a64d9165de407d062403047da14d4ecd19fad8575070b278608e16b71d387d76d5eebc3d099448ce4a8ea6dec047b0f062c6361ddb9e95ec898442423a31800000000000000000000000000000000186536e3ae3edd9cc6bc24fda6589ed26e72e06121e97e1ead65b200fa0578c6e53d1154dc7b14e7eccc3a53237685060000000000000000000000000000000012fefaf6c76ae7197b99571e41a19b14846fc4499e8e964ff750e7c3ffef6ab3dc19eeb42c5f6ba44a573bca7a15166b000000000000000000000000000000000a135db813a44a21174cea3a0b34fb49f273877203ccb66bce44b2b58794818d8bc1df27544ecbf780823467e2e4ee6b0000000000000000000000000000000009b08f70cdf4e349e1a73935de9fb2ad9f4feb8cf5f835be78383fda2af94d81af253ebce08cef825764151d5713ae60cd4cc1453dec7ae335db989886fc0964ee73e12bab69ce1f1458d1416471176a0000000000000000000000000000000007976df2d47c14374e554401c4d3330bbf6f1e6b8fafcea1e1974af61e8ebf493dc0473d34b30b0b1cbee082550d85c200000000000000000000000000000000177cd64db8334dccb17fb207e467e5b09e891b05df7658d9b439e3cb72bf3e0a70e84f96fb5e448f33c003c279cb38d800000000000000000000000000000000094d739a02b8ea6ff8113019597f41df4728b270770edc5e68b1f5c32775f0c706e3f31c0a82059c1ee150b89097376a0000000000000000000000000000000006ed888aa4bdbee94ec67500e30d654071774fe22464dd5b900fdc17b445754293504b10d044aac8fa0c289f0b2d9dce6d207c08e51d64a9a47f5353faac77fbb184e1123d38e39bbada85534cbcd3150000000000000000000000000000000014a16b856b04ac4b687c79f2b4e1dd6d45db25b382e0ba6687afac648c9b6384cdcfa89812f1a726bb4d1c22ebaa6668000000000000000000000000000000000764088e337df6db30ce8aa23aefd91d9e35be911c9e89ac62a1e06c3d06e28efac256490400fac4490f595cd03c127e000000000000000000000000000000000894856fa1c8488fce182a9c7749f7953e6a73879b6e743fdb8c780275447122f512806fa83d5ad528f8f61598ed01d20000000000000000000000000000000002b33bfd09e0ff452c3336bde08df0102162488bc83c27052447a1e5d16c9c68bc529f96ee3787a26d2009f22a1246342e1910b704d39b6a64cc7a44e44ba3e8b7e64ddfa90dfa6b5ef571f9ff7d7f0b00000000000000000000000000000000133e2d092352d3ecef5b67a09c2be268fcd4fe1f7360a8ce3ef5f33bf689242961a140d9c8afcc1e2fab3ad4e3dba49d00000000000000000000000000000000101eb285f0c462a22406846d82ca6a278520b65132d2008b124f6647a642c221b0c3bbd4a0abe8af7417e7aefb81b5b20000000000000000000000000000000010958cbc317f1186aab69ac24be87647b8013b678b0eabc6270167bdc9c0cefbaf4d9a34dc41524b709f1b881e6bfa34000000000000000000000000000000000d92c47257fd0c4d6baa4c81efe65852840479b9bfda5cc06b253f167069ca7367924c0c67d6497a1e9abcce7d0ce9502eda0eb154d5f9b0e25a828c6f77541701004cd0293c61ae4d36aa3038d0f1840000000000000000000000000000000014ad0f935ba129b47ecaad63b9dda44e7ef7933f182a0f5226141c8f0ede026ca2f11db7f4924b5c582461688dad6359000000000000000000000000000000001453716381f13bf6ebf8fff2ed7bcb90f7beb44269008af5880a355dd03de5c84c14f5aaf69fda043b422aab0c694784000000000000000000000000000000000e983c9e9b799eccfdb56444d31948067d46adf275d7f39a70aaa8bfd0fe1b83632c23d87f4e993c8191901e9a607217000000000000000000000000000000000267c8b8c5e09b59277736caad12ec6986f206d1c1f48023356d8bc877a594c8bbd98981cec6382bf9bdb9a5fa38275ecaf6dcd51a851eb200c7f5fc3e106ac5ffc432f756b942b1b9a5dde31cb2a3760000000000000000000000000000000002e28c245e71a7f6206427ee512f3250612785ce29b369682fbf767d06ac08f91de8ac9f82951574cce46cee1aa757720000000000000000000000000000000019b0dc35eacd961e0ca7d54a0e37c4ace37eb0200d5489316f3371412717c57c8f17c1379721f4dd67b3fde24f50d4cd0000000000000000000000000000000013b9741f7a32e5e5b1ae5400e32dd6fcc1fd43b68df54ade57c934720b1289a51deae77b1726e1955b6430f37928e2bf000000000000000000000000000000000693980b347ed7ee6cd93f565c87efb36fb304d7e9ae24e2b9f902bfc962b6c7fbab93287147f5ac892db2a709c9ab42106d4a893a68b7fcb8be96faedef65181c239dc2cd752c85ae7800ca84fc2dfd000000000000000000000000000000000ad6b7cfc6cefa5783093b7d700360b354d0698d27ecefb7d5928ac5bd6c299e4001474d205cf3b85a32c600ddaf1a360000000000000000000000000000000017172c3d5acf59b70b340fc703e9b7801aeb4857ffbe7a9d5daa0f32ad80d1c0ef2f0b3b7d1fd83a757c076872425fc7000000000000000000000000000000001291f55fa7d14b14c578d57178cc707cabcdc4bfb444cecabda271cbfba2ab361947d045ed46d9edbd215fa4c8164e56000000000000000000000000000000000f64ed6c989eec5222239d888d08dfd638a0e35eff2266410dab0498941fcd1683654064107fb7e53b8c02fbe98a25622b9e1cfbf140f4a3b1d06be656ad6ee5169a9cfa7cbe6efbf8173843d406acd30000000000000000000000000000000001d25b5bfcedc6d7ff7e9fcf729f858759936235d23ad45b14dfd0229bf3e50fc68799d19ef019b36728285bf7ecd0b4000000000000000000000000000000000326e300ba07935e0233a03ac891f18dc7b5a9ad9a28264136228e9e23e8f2aa31b7f5e5f3cb3354984f57a868a5d00c000000000000000000000000000000000dc92060e3403df3a92b15ba3e437ef0c403fcfc9c3545e544a78874e5d9b5e63b9ba6060c29022fe2594c2e6fbb6a840000000000000000000000000000000006a01e85f59dc45b1501309a350137d71147c30fb70da6b7637a9b1dd884aeb7e554215474784ecd3bef18d15d2c0524dbc68f77d40330ad5b8cfcda42edf57899454571c6c6465c4107e662a269aeb5", + "Expected": "000000000000000000000000000000000b7fc0b44723ff0d1cb7c43e470d4d432fc4bbc7f9d98ddb3d91434a5574956fdf15f898e579236426ea44677998665d00000000000000000000000000000000176586b6f157e408138391e3767d0c1c8457857f4cfae571267ed64ac86ff8a4b61a28b406e1caecffaae6a399f4ec9c000000000000000000000000000000000a420992f850db20d4f7d2ddff33e4dc79bc0c39caee533920c5d03d1c2619d8ced769ac09f664c0921829bd7edb446b0000000000000000000000000000000017e4000f4d03a6707174c3adb74966896bcc0eaabf4ff83cce92a666fbd13b59efa2c767442062b6c8b1a3abd604f0ac", + "Name": "matter_g2_multiexp_82", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000016ac5146ffc26d1f0c33645931bddfb84756e1c7b03f4838467d1b6701ee9478ae03c910b6b4f5c14135487bd2c14bf8000000000000000000000000000000000e1d082f16e4d5c5f0b6fbe5178aef6f781a6fb165f775cf0cd4dd55f2b498a79edf373007113dcdf6b977a87e1fded2000000000000000000000000000000000bb94be280df1aed761651c0292f88037d172b675bae1933ec12323b947023b437d080aac9e196fe5e06e5c4137284d200000000000000000000000000000000064190f9725bfd5d56c31aef7fd1590c975e2ce549fa6d5c71b254851149e0a0dab0b9de3acfc2d64231c79bc0ebaa37ebb3c942d3a1a15cee806fdb0fc3635483743a5b0ee9c40a48700bad5da53ae70000000000000000000000000000000012199d02d3f1bd8c4005878c3302e6a731ea69d69accdd690b4667e847b079563d32e18eb7a440b8005ca936da5e73cf00000000000000000000000000000000125b0dbdb0058639513b007a84d3a3e6302f5d846f22f99a55181f097e200981d9013c00d688a11eb976120f1a5da64200000000000000000000000000000000081e723506635433528fe4a40fe4ecb8a9c3d8cd701c043c0418d149951651e21632cd85f03db33b89efadd69e009ebe000000000000000000000000000000000956af2e67f8ae676abc783c4ec9f85c50ea130410cee8216fe036cd0521b8ea38966288afe7d35c28b30f7ca5c6edc0c193d751c4f24f4808621979f07f03b2eabba75f08bb49682b9df2da7a85a7730000000000000000000000000000000003e11a4e9dfe82cb495e9e698b16c257ea3f4ecb24749751e7334e0f31fbd6677545e4bf9ff78a82853560f7e7ba2ae2000000000000000000000000000000000caea2c527cb3aeae427e92fc364365b1f55e7128a544009be2ff7a5236d1cf8ffd5a5cefc87820bff5bdf1c6bfa165d00000000000000000000000000000000064a3186774da8bb5d013debf46ccb0d894592c414f32de6f77da47f4d42b0c8a13a2ba4f14b9883d564fd8ff6a4c90200000000000000000000000000000000072f6c48b6a05039e3a4dfc6b73501d6d4ca7e840b119da9c074bd4cd2adf4f2c6e9e6325ebf6f97c3f0b00e6b9bfac6dee4eef524f133183b4af95e4445f3ee5084b96c32e284ebebc5b87f3d76150b0000000000000000000000000000000019ddf708ab31f6f6f725f0e4f65d11248d3a79af30927a6f2673901fef9819b189502cb952bd4742d2b8e84acebb5196000000000000000000000000000000000d928535c47eafa5da4ce4f91467fc31aff8b86b850e4582a597b334491b14da71763f9aedb15ed32856382069c094ce0000000000000000000000000000000004d6b3545d067aa0768cda9dc3cca0f58eb546345b96f7d6b9355d47770e00286d962a6b3a64ca2ce22fdb4834a4bb6e000000000000000000000000000000000f4ef9366d342b309076299816c1ed9b424b68886a5c69e21e785f97cb0f99ae3a99ff6b5244dab817094449048a7552da514f21c8eab0edb2405e673297bb595edc21027890ad680f1663fd960ce478000000000000000000000000000000000236c5b4c57ee4facec5d4ff37a478c505217af66e029c3382613442c58875c75cb423789f6703ff3c1c0d80991c9e3a0000000000000000000000000000000016c052de3336002f362d9b0cb386b800860527e0fe81a1a6df0ccde31f3265e6246191b3febd1ea48e9391c44593ab0700000000000000000000000000000000078dcb04ca93c676a9a924e59f924d9d3af872849bc30ca633d4025aecd981ba12e626337635ea77886a45f4da84104f00000000000000000000000000000000027df6394b195222bb8357bd684088e3e2a398f0fb0cb812ca5dcdcd1fa1279cfd03db62e0f8b2800d4b8b48238931656aeac9a669c962817c01069cffbd948d9d8ce764e92859f31fdaf85f5aefab77000000000000000000000000000000000485ce58b387083172102145fdb3e26c6ffca8b35af0e1d84ce9cbd89055be083bddd3da56443924049a056fdb2ef092000000000000000000000000000000000d998b234a69d584c78ed054b1322ceb33f73cafb5b23c1703a9fd609edcabd44f1a642802b9c0b6fde6a6828b50c1200000000000000000000000000000000019235ff13567bd007d77e4dfab139cd57dbb309a3cf6a6198a548c4e6915778094ddf2b05a91f5478169757bf5a56cb300000000000000000000000000000000110f6ea19a7f62bc3e78f4c5c1c6d3efdf1a7f563576e758218b2c363fff8ad8fab0e72431619e4ebc93d2d739fc786c40273bda92c9b1b677edd905d76d75875e5b77841befb2bcaf1fca7674dffd5a0000000000000000000000000000000001d45da76e3016c00fe65bb50f7067e4f06364ad8348184831c4932ea0e0f3a170ab5147e4670ee1b16924105b6fdb6f000000000000000000000000000000000b3468206db0613369b2b0750c98da65b660fc07c30cab4e459c311dab683b6b313b99ec0fbe92ba07f8aab43a12a2c9000000000000000000000000000000000f58a57c449a41105837d5e2419a34201cc921ec77408d6c0c7a2eb227be98ec1f6f6eb9fc088daa0d4c78928a1eacda000000000000000000000000000000000ba53b872dcb9fcabf35e673b467523ea77accfc1b38a5f92d7b9d269c28aa00d00b08d70eae6ed4d2e82bdb06008f9ab77e16276f9464fa2063230d6c1a4152553536c610062f18565c030e80b5cb540000000000000000000000000000000002b82e2b582b247271543117b939fd17ba8bdd617a223873296f7bd75de4790f0d5d8fe523792bc7fb4764d3739669d80000000000000000000000000000000006eb554347efc5f2ee79949bafc012e6d9964ce19459b3867865709d903fe3d11bc617f30f6279a9e62ea104565953600000000000000000000000000000000006a543fe5cfbae629fd3256575e3eb4e0b65864aad6c7f359e169038bf090ed9bd92fef32fe1ac20b2a8c90fbb6081690000000000000000000000000000000013ee42b0693b2f3b9b977fbae5c856e9e4c5e70120b5c29e0a9f898f6d04b7fe351e17b02716a44febcf0a00a9cdd9220be15b654ce22ae4e32987babc4863ffe2bd8a459d0f01f68fe84a75326889900000000000000000000000000000000001ae7368f84e354e5758554aa9c72ab4b00a644cfb9a4ecba38dc72227d297749bbc98c8f5d6149143b31442359d8013000000000000000000000000000000000abf087f77c79cb8c69e4289fae87b2ed483442daec3851a5ba32c43e342be29433b2deac6dbfa7a787547a7361ed0a00000000000000000000000000000000000fa01cff7aea64b649951a8d85fef0bd475f31e47c706b96ee2753df9987508b5e5456cc49e88ec3aad720a2535f6940000000000000000000000000000000018874d020e2eec0e286dce324b91f15b2a4f293d32956b27524f478983f0e0c5b43df802b60f4f001753f12d449cd821c8f1fe94bce21966427380b6d357a3599e9db03a7694159335ffba26fe29e4650000000000000000000000000000000018f7d19362e2cba91023455e115cd90f02aeafcb026349393ca4105e270ab1cf589621b40965fdc9795f66ea0f6a053100000000000000000000000000000000170ce0eb304e0e1047617b709c834b67a8989212e5bf1cbd5a33242be94bb141d5366e636c01a229943bead9a7baf43900000000000000000000000000000000077a17356b3b31faf90f709042938b9e901817f7379b7bd486d18e47d22b0430ba70fb3006e9afa67d7dac71ffaf152400000000000000000000000000000000064aca92c41561e195fa8239800c97d5242ff0f8ce76b0d119063e2ffa09c26e01d23d5728765a59bb9587e885450ad1c6d34471ed00035a484f97f4e8123d40ca23b017b94df65540a5551b905e57b3000000000000000000000000000000000876a57dc24ad58416f910ee3ce220630a1297e6bc691c908e6cc16f975b146872d71661bbb869361623c61670627eb0000000000000000000000000000000000760fc65097d215ab9aeb3d5a5153977e1e399e2cc0b0cb9befb0266d98ac13512a0eadaba4e051bf56794621c551ec60000000000000000000000000000000003c8e205e53075a96c14ec26345c75881a0d67c7ce0d62d73c83dc353cd7b555cde52ffc5659ab0db2179a899f0fd694000000000000000000000000000000000d7e8a7fe6b751f7f478698f4f0d30cd0a435a2295a958cabedf4668769819b4cbd4e8b7721eeb5ced3f913156abcaaff3abd467168bf5e57f71017b5779bdd400dbf416f34f105fe747ea2f8cf4a21000000000000000000000000000000000180546f697349adb2918129f4d0a979bb114d1b58e5baa6cc221a09d7083469bfaa61f80f1e3a6ccde0da54b24d59db70000000000000000000000000000000004074338380e3d7c0facbbc71d83e78b53191af9ba13ba0cba6015bf4f28e4b0b52ffb34c7867a335848f57b5ce5ef5200000000000000000000000000000000148a800ec38cfc2386497d9aacb4327d5953a6612cd4067ac13fb977046688e80032125d4b0e7cb49913e489796a50ea00000000000000000000000000000000132438d18d942e6dd3f69d117abf83c2fa18418e5145cc43b3cb8d18c873935e41279a9e13596f2863be7aeae9b73d172809801eb18d38a61ef8a80f13086d6b1f85ba751cdb8d17fbb9ad5f8d0f835c0000000000000000000000000000000018b3102ce91af86cd10162d3a43e488a0d7b7807dfb9624c3cae76f342e86f8ef1200444a57e2ed7f819828357a6dfe80000000000000000000000000000000017137b470f3c8d1a03e7252e18f4466c9ff809408cbb2043d6b226ae2746d890b267ce3255114b2e073eb66e93c55eb200000000000000000000000000000000054dc1c981c9166d0bd3a54064c33f15ab856b240770ed44adaf9f32d4429babcd0baf2c5b8a1ff80728e9c63e806cd3000000000000000000000000000000001897595f836342ab54bc2e1b72f433bfe3b5bc989727de48575abe89386aaad9b1549af3ca55f39feec14355b29dc9e33521c9cf035b094d754db994fce3161842a9509ec8288699680c0ac7761eac68000000000000000000000000000000000467f1a3093c72aba4c2d9e8171057cf88146eb32f38db0761a5ab2027f2213c89e12c67a338b4b342a73384109988d2000000000000000000000000000000000ab26c871d140c9c4e0512afe9fb576409ffdcb95417f8c6cdc0d964011dfb1e745045766bbbc08ff7dbd6935934bba300000000000000000000000000000000183488902b886200e63465098be87a905810b2e8ebe0364316da798e423dbb267743a0d2e3d93303623fb17df0e74ce30000000000000000000000000000000012c7e79f9ba36cc47762139d191e6625c850a03d5b6e0648032d1669575704c91e48a9ae432bb3553ec66e86e082de689c8c2998d141b9cd3a82507b6dd97e8d32e9e759169c575eb484e9a1559427da0000000000000000000000000000000012ef4988956e026a79e5e904ad3d7ca56793321d62cad46de3cbde8570be5f0ac86d386216152b37053741fe342de7c60000000000000000000000000000000014ff7804312754d23b251a42aea65207695d4df65cac4f87fc96cb920843c022f24cd27731224db751cfb621886249540000000000000000000000000000000006ea693105a1b2afc79dbf75504c256c519f927ea0d79ddd1997a49638a67151dc81b84473208e8078cf71d456f2de0c00000000000000000000000000000000122d367c147c91517679432d3c7b56f2d529d70040109f803b89a04fd8540a6c565354ae420e1bd4ad4ff61427332629dc83c1ea9e4f4fc12a7190e6c71c4f35d1a676d39e30fe688a05820dd989664000000000000000000000000000000000156e7f8f1412cec315eb76f10c92143157313b8eda0677a6c0236de5fd27e5660ec3eb7369f1604082c59e1aa5f94dd900000000000000000000000000000000018ca9f505a88ed2bf595fa9b55d2356748770af16b35bd5db448990b7d41c3aac53aa490791f7ac09d2f5a087f938f70000000000000000000000000000000017c76ca9ddfcc26b028928364ee35829c6e57fda40773a6bc0c259a1b3cdea715c664d7bd0340192aaf7dec7ad20a2ed00000000000000000000000000000000082a255966c4f9d0ad6bd3d88b136cb2cfca09ed6ae378c914c28ff3338a2cd466cafd839f3fff4a30b33ee56e684f4e00be1b9098f1873ce155a66899877c7b48ddda363ae1d2353cb3816f1ab15ef0", + "Expected": "00000000000000000000000000000000075c71e21ce327a97024c8ab5fcbef4fff76260a4f8c8489167166c4a85d25096c617cceef73097a4bb956be3eae8b780000000000000000000000000000000016270f3ac86c0ec43b9472499c4d845eab488a34ad9e2148c72cbb1db13623c5dbbc8327c47ce596521bd1f54f119a660000000000000000000000000000000007ad4914ceda9fbc161121c818bd05953836a581dcdc78bebcd82ef548671c899581681c908a337618a445f77c6b7cf400000000000000000000000000000000173f401cb78024e844adcc88fcf0e52d32de134f6300216ea0da7747752ae3ddf4d181b8d266b53d1b699921f9871425", + "Name": "matter_g2_multiexp_83", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000017f40eea638a3d4fec417701c936d61c5b233c9d6b3e94ba9addd0fa0b20adf9f8e07c6b629977445c7750acfd18001c0000000000000000000000000000000005f1ca1ca9cf67c33e3ff174a65adfde2db62e74edf30b5b0156d6b9dc86dd619ad8863c055096685d611ac015ba884f0000000000000000000000000000000001683dc67710880b8af76b464291c17fb0ee4eff3f648ac0772f4a777025c8cda0342d8f5aae3123da7fac57b965685900000000000000000000000000000000143d919ce2cf00838b10fc65374e770bec3db8ecb17d2db08b6a10ac38657bb109f54c1b3040b661c3914ded6f7eb80fa9cbdaa0ddbf854861eac6621255b2102e5343666c735d0384049d5680d105d4000000000000000000000000000000000616299341f2921adf083d1190c212a7941bc0d9fee50b05b265f2e8c339fc3dd9f94607631f485e394f5a7d71ae73d00000000000000000000000000000000006b2f12e22369e8aff45b6c05a2bb72a706dc46a5d1393aaa9e5a7931ccff33a5df2967189114c3fc5dbf69d080e39dc000000000000000000000000000000000981e1b119d04343e075a80dfc189000b4cfb4e321575817aece6009e6b3a6233d1409e8e584f0ac9caaed1f43e40d7d0000000000000000000000000000000001ce4693e8c14032c35497e0f9a586a4541d8a1a68ad014b0850753a04215be2bb60cd7c2fa9be4f4f09a562d7b29f3892073d958260a55b70b580f3ee27c42553b5b858b66f6928fe74b4de91c34bda0000000000000000000000000000000012d634764207dd7a0201703f855365f7750291c810ff292b3e8dee682d7d8eebd6d6f3b3dc8b0c9e25bd2860e031311b0000000000000000000000000000000000eb0859d79fcdef546026fcd380f5c936e64a5665d73f56d92c03dfb50c534a00c857c86ec43275ce69cccc0b53137f000000000000000000000000000000000131bf000fd117ef722b33a1cebd28899fb012e1113f767d0ed46fdad82a32e4327b883fbe29abba1bb7ba3ecc1cbab2000000000000000000000000000000000e24ef1e44029366ae1daf06524d8beacb2b99f60f419cc2ec1a49013b79fb7a4781dbd37785f32ec67c0a28d61a3cea2117f11d78dfead915a94f11fa7e904a96204ddf1835d3501639b83cd5f716f500000000000000000000000000000000067b6eda41cb8da47a424a02a142e2b98b9c69e7023cf616040993f41507798882194229cb6572806e82e9e5eb837b37000000000000000000000000000000000e38693cddf130d3645fd60ade780db84fa700e5bfb74ebea49cc95ab001bde442f363b4e4c61f683b3e67f1ec8c2af80000000000000000000000000000000006d593005cbccc55c5e336e19aded70da65a7fe42b6a85070e491a4ae54e18ac213556a91d5d62786b6d4d1305525a76000000000000000000000000000000000ff86216f5388114dc06deffa7b52a273b22fe0bc8d50804b491fac83e13915c2dd1b8c2779a46b5c313c4e1c05eb2979087caa1e89e48f05bad1d720477199410941a6105f911d589e1f94a851e0715000000000000000000000000000000000262cf4727703fb227bd7fce6cd3f25c1897011ab892e79fa47446711d6867ca82b9b95f129f7ca24dcb60ac75173d4700000000000000000000000000000000136b5a304807e029d0a77b2ed505ee5c920248242f0f95aa07e9bc2e13d35f6f67451d028dc19d26095b55cdc2fae4fc000000000000000000000000000000000b511b2e19da7bfeb183f0aec91bc7db3e7c913f1c282e12d5d2f422a49e7fa78a5f35656dc9c980324717a5ad386dc30000000000000000000000000000000012eae443aae59fdf907bcfe3ee4366e252bb57e268fd569d742456f348429f009f67bf92f9dadd401104ccd2549cecc8255603b470c056b3dfb3acae0dd45bcb3d014765a5181760336deeabff3f00be0000000000000000000000000000000016a827938d8b98e3446445ce23f48a7ba0d634de826dd1ee3c71467eb57bd4c24e0d1b4190f47bd841183baceaa2593e0000000000000000000000000000000011d360e0c18b45ace82eaee902475127d8f18aa4a2ec2081a453f1c85ffe3c59c0f7016f966574a7c51bc14f1935568400000000000000000000000000000000186b5d452c6dcc1ddb4f47b07e01b6d64644f6d01cba8498c3059cc494a68bd25eef35cae05885b9f2689683e65161410000000000000000000000000000000000ff826e5a62affbfd6d2062bd329fcb561f287046870b8be461767759cb0d5f1ac904ecd1f136c5ccd784bc11088233e0eab0e2486316956291feb44de6389b20f8bafe9cc890d86d27a598bab0f3c4000000000000000000000000000000001010e75c52ed0acebe30fc588961c849b7b6298bb8d859f9a9401737c467921c5e3cda101cd4e38e4318233d12b6c7b9000000000000000000000000000000001884db518fbe4d621403ce00521878c0d419d8cf476a1dfda59b7d3c7af2bd91058bbbf54ac0c5cf9a217beb78e3f98e0000000000000000000000000000000001272cf0ad917738bba052e88baf88347d60f63f5b875d604cf0531c1ba7d43e868bc70a682b7274067106f611f08ae60000000000000000000000000000000006e3236f6a66bd37af4be230d4edda6eaaed661f206ca4852d3004b5f358f184d80be6af81c62e5bc8c88e7a1072fe21fb9436456262e5149d02b33a1078e198bbb681699b3f485625784df444bfff670000000000000000000000000000000004fd1e2fd0d28db08224fa7e880abb8c48dfd0e488df4d2ae5f6649f448193acbe943baf22af4b12fd763e3e4ddaa08d0000000000000000000000000000000008df68f276f356ade28500eeae3b755c9af9b5acac5f5f60827b5b2044b2405129b00e5271baf9a80847d3b720026b3a0000000000000000000000000000000005e683d1556f513e6d093704405f312687c3b9e2de3b2840fff32e88186c89b18d1ac558d960b1196594730a9bc107480000000000000000000000000000000018161f8d23c394d10ba576fb0ceee530ebb95a670f2589d84c0646f693086ecb7ed80e556f3ed9434d7fa488430ccf430e2724d3501e3d79b85266fd83a2a6156eeb48e749a61676a1c92ab9bdd6b8990000000000000000000000000000000017860708943449c2227c0f50cf1274652dd32e999d5f9b1a8d672feedde15e9f1af484a7b9462a62dd745bb6d3c7295a00000000000000000000000000000000064f8cb707494f82ffb6374641817a466af65f5c7d83cc2964e6cb8efd021e0c40934a3ffbb0d91bf8a7a616dbe8d220000000000000000000000000000000000eb37cc9d56fa0dbf050b557aaeec76f9f6d0a6c448ea298af78004e41ecd8a1df8fe8640e77cb76b593ee17658326ff00000000000000000000000000000000092ab597967544fda640b145edcb3ae6c3f027c2111dbc282ebdd48eb93287ae4729cb30e45c1c8999b3a45b099dbf0ca49344fe6ea9274a103f323f3d9381e91ae48233dd579944e12afdeaf854000f00000000000000000000000000000000124fa4d48ffc5732fb21d465b559e995891fef98370a1eb73c9264988f75caa93fc134fde7f93c794582ba5cbf6bc685000000000000000000000000000000000b71d012abc1558e49831f053757518643ae04f79234fa92023db9c5483bbd872d24eb87a78960f12930094c4f8fb70e000000000000000000000000000000000651cf0016efea086d98e5bda8e1959e20e4947e302eeb021d196897cffde3e2c28f783521b2a28b8de1ad1a131f5e67000000000000000000000000000000000555ff8a930cc11d320afc3e0635a6f93da1487a5764d56636be4e5803d740a73d84666f6141ed5ee6b778a463823fbeb44aeaf3ba8b03e7ef7201415de7365365b828f2c1a38d09153e51432d35b9a7000000000000000000000000000000000974e769869719f0ee30895df837cff50d47382461c557abc4b8806b04776f401b76a5e630a6ccbd3484980d03ff58d300000000000000000000000000000000098157f0190e6bacbf34c20310f6471166750ea1b235e46a5fae313f90dddc799f21548088322910bb0fd7e41beb23450000000000000000000000000000000007f00d7d18719db9d91e2c32f51083b42c4fcb43c38087f86879ad6bc99600d4c395586187d26d041ff49dbbe517fca2000000000000000000000000000000000510cea4a7463bc5882d0cc25fa967a0b02072627bd57f9a5863fe5255953732846d4907fa301789bf02af9c1b25211c53961d33104649cbfccecc7eaf33b7a2a486c77dca363ffc9fbc9ce4e8c1adff000000000000000000000000000000000bf264c0b7bf68c595b89453ebbd7fe2e64f4ae2c7268ad51f4578c35d48040277f3dac9021997af02e492039348efaa00000000000000000000000000000000083a4fea41cb1e02e5002259f5f7b335c81e15cca93cbc884dc1b08ee981c55f2dd3c0db1a35ac9907435edd7f0ba625000000000000000000000000000000001468e508a02ed7b61f752ac38313345338d2b2d018f719f391c0f3fa1dd1602d9476f3d8829720d17021a459a2732e96000000000000000000000000000000000629edb2530c38ead8717b289c08036c12630cd8c9ae875111749ed893b8cbce40bcaeaf13df4044147bb665ecc2319ea04e97c20b42dc265271740f27f1a833bc5b324bcb843a8f9f8a68231c663d57000000000000000000000000000000001635830ebf227be126e13c634a84f3649d498e0999ad2dc73b9c7360db120dc2216addfe18c00676ed185efa1e789d8c000000000000000000000000000000000471e3cfca449bde0ba2b1e2a5b63d53badcb34da3251313190a35daf694d70ba385976d1f875242386fc74ae0173d18000000000000000000000000000000000986cf3f1eef587bcc70f66f25c60f353e6b15bd105fde9254487e9b522159658d0fc6b6a8a3ea38c27865f1ea4d76490000000000000000000000000000000015a2eccb9c10bc273cb712ee04bef01a11e486bc6a4d220a0f653582af6ba1bac0b5108250626ddf126f16f4015c9d2cb688426bbe9ae054acb6c1fdd4195f8a113727f5617642a5b3c0c65566e22527000000000000000000000000000000001213cbd035615f09189171b3e22630d72df2df93fa8c14427bb00c34f5b55bc8d1b1a59404bed6549b582537a397eaab00000000000000000000000000000000161072d8ebec2841f0f34cb38a3e1b2094a597640a34178ee951e5c993646ecfc3a4c0dd753e7e76f3a6da5a091f9f7100000000000000000000000000000000077e9c95b6c6f726902392c3a16b5cc71cd9d4cec58c00eadca6091e45bc095e53006ce8ac8827565e867531013821950000000000000000000000000000000018cdf909bd9f38e57ee24c0f51a5f9f703eb3d190dfbf75be00969e9e8f8fee331cf32d93c3a956d12f374f8752c2c79cf365a86a8d08db5cd95f239a2f3d22279556975ecc3baae0b774b0323dbb1b6000000000000000000000000000000000cbc27995eaeef2bef14919d48a008a0b0467856f8a6659d6e68e47a2d9d41d217c5913aa1d67911325dbd4fc38e36eb0000000000000000000000000000000010639740654bad5c4ec93f2496f4dc54a7642bc92ed03372ad4edc5fedcdfcf37158d3f02279d4e15078e9d5a7f8b5df000000000000000000000000000000000155ff4d6dfa031b0cc2f57df41c1e1b1c81bf5a5cc1e3aa93920e93c2e2e7a71b56ac410a87855400025badf6dae8e60000000000000000000000000000000018e637da048e7e84b9d1654113978fb148a54d86e1d011d7f5a86cd4f1e5bc15abc5b67d00129f53c0c021cf933f399c528715199c9f47fd6337b6b0e807e230b1397885fded024431c70e453f55f3650000000000000000000000000000000015d8f6e47b8f07b3e07ae0952a7c8f79519ce2828e3e26b284b8f2fae7432b337de17089b5c32f0081ec6c6916f2f53f0000000000000000000000000000000010ecfcdb02cff772db667266cb3f99f1dc28004ffcadca7a9c64b3b5853c09b7793ca0aadb155257bd64fa7bccb390450000000000000000000000000000000011096a52f3272955947304ba037e8b3fce6b2f07f2352c08d5932f4d2306ca511a74dc044d0f0e1e260ff40b0fac5e0e00000000000000000000000000000000130facbe0c1c6d077e9dcab647a44b049a1aba3df500bf27d1c268f71a59635e702c9ee1bdd68fbfcff7ae5b3e6bd83bc32e8643f38f8177b788b8c2bdc25b668308d914fce35c6f9023a769334a51d1", + "Expected": "000000000000000000000000000000000b47d58802579e662f34908a4060becd40434e4934ff58790df2a69a759223ca29f42e658ab475cb92bd9c46566811c7000000000000000000000000000000000091d3a4c58a669d3bf0377abfe28d1817168b2a86375928d95df3459c83334669a59aba95ab2b9957d5ded0bd8925910000000000000000000000000000000005aa9c3fe0067338675099ee32f93bc8a5e9ead94b120dfa391651da40cf1ef5ff79d193b0b14b5926f10660aca6c11500000000000000000000000000000000058200992b111461f4d737533301734a5c3731c9f2e7b55e18887ebff4d5b74dbbfd23773606f54cd6a930b85b89aabd", + "Name": "matter_g2_multiexp_84", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000bc3eba5594666cec699a47fa13ee74722a80b4e5a1b28553de37c3163f2fdb8b801e35a19f6d99cd207d1642c0d4ad400000000000000000000000000000000104b334afeab36961824611f0fb58bcac55c9d36604ba73e9c8809085c019bd967cae7147c766df6565ddfcc0cd5fc9700000000000000000000000000000000026c3a6a4ace8638bf8ba7434b59c3aebd4bb274cbdcb898ec6a547b215f32d10395f3bb85a9eaecff5ef6d5ef2b50e000000000000000000000000000000000065bc419f9496b5e81ce72a13fc1bdce4738c2e3faacd80676be31db65ba3e7941ea75e370b6d6c0e7b2cdcce80a2fa14f8bfa3d47ed33a05fe3da738797f18ca5d5b8658055de5a9f85bafe6078f7fe000000000000000000000000000000000e7f1f5ead0f212439b4c47599581982712d2e6ba056f36cb04033ff5eebd81b5b41b874a78aeaa98562899418ab04c900000000000000000000000000000000095e45da9a4b2578cedd13af71e289d0067ecca1f09c014a294e0b250d1e8243ff98a9761030ac855a9d897cfe9fafdd00000000000000000000000000000000030b44b150d1337a3ed6a77f7b6332d7c8103da1aef0d445ff7467b4863e4c830fb782a81d01a6bf97e8d52bf333e78d0000000000000000000000000000000013bb76800375a45b847a96ef6edff3fc3c30e3d45bb4afe04230107f6a1802794e1dc23431797bc5e79e0d5ac6357eee4b0d302be94d437b8055586aa77ec1fe616e30552b4d7d3471ea219c148be069000000000000000000000000000000000602e0bd3d34415ddd517a73acaed5750dcfd68b633d51003edf79a169ad7a3ca2541d7a131c317c957a9597a753b5080000000000000000000000000000000007a964539081fff51e0ec24bb71257f6a1c513fb0047aad84b80180b22133246a1f62958ead75e4b2a68f973d17f1230000000000000000000000000000000000f48fe0f5b5a95e48bde4d8be1b2f352d748c1201b064bc88309a709b285f81260d4535d3e1dc7f1d6ee23ead35abd9f00000000000000000000000000000000135b480fc8a72248f7a4898fffc6c18b7f2f5b1af5cc3846610c299c8da252fb71190d9f761e037c6b47595bab6a03e56765d7f1079b142e513e604d577e7caf82cacae59fb98c6f8990522372dc906f0000000000000000000000000000000004773cd2884e52c2551c1ea0abb78fa17caacfffe13f18b75588484b8bfe781e623075bdf827fc82c6ed7e1d4d62081d0000000000000000000000000000000007e6023fc0e409bfc7d0b7ca65fa0e8d88bf1b4c202a8d1f0e1c3479b0963a646d16795fc5a128a54e624357050fed4000000000000000000000000000000000039f6eaaf99bcc9f4d8fb994a040af0d29c37960e9015d4e48466a9e554da30975c5534e76a1f08a55ed8ce7375b70100000000000000000000000000000000003d2b097d4afdde83a01cf2b4f9d12f77c8e92a8cadc225d40f974ccf385ae65bed1972a365d55e24231d58abed4395a2eeee02d9309af8c74c78e21836f4e6a7a6df5406617e2b4e9d300e37d8a2bfa00000000000000000000000000000000047b8c550310ae246e43b513d39e507f1dace7bcb543a49ae0854a397f62c408ae3632c94d172669ef3e013781796ecf000000000000000000000000000000001592914e260afaca80c0a240426c2828239ad5e256a707530f49cd65e9da2e4bb14a7d6d5978f52c04130a0d434cf4ca0000000000000000000000000000000006c0b8448ad87350db130373778d414deb738d3be97fba25c816826f59e3e926f44956c2e2056b7d769278cf56cf6fe0000000000000000000000000000000000a42d716fd83071bfa014a9b7af6c164d494f0347aed953bd2c1c97ade087a8bbea9f53c507fc0b22d520f28cc5d480cf8449caedd55f0a08825cc1a9e985201c8a7a54d1c4dd96f0ac54214743941810000000000000000000000000000000018026c9f6c86219d0be88955ce0afc3cb637b1c3a531aa2722c56816d368688181ef2fedf1525daec6d9b1651b71f27c000000000000000000000000000000000b40b15bb0621209bf9e33ebc27a7502d90fd3af62a1bb8f54a874a14c105df34ae34a43fc3805c1e4817ba30c048ac7000000000000000000000000000000000465262367e30ccc24632d39bf3af9cb160e97049d855176f665a185c138d5c529d11e53e56c65506e3e30be7b48c6730000000000000000000000000000000009485991319a311052d883b45911be12cf7648b5ca104ffe77594472f7047c803b8e9fb753b98645e630b9913bbc947e28ec5f9dc48931da70ba0cfa7251953e24c4c95cd019e00ac6fda095c1302a01000000000000000000000000000000000fcc0aca0d873cb8733ff7e2ea02b3736b737821af2db06ee6508e161f6159f9d944372c513a03cc4c9e30a707dca0930000000000000000000000000000000015c3774f4e0b30c9532beaa2f7f9b777f8d46bfd3888d6835f4a5a046153a98062efb17f78807fa17b3a995ce720c0b900000000000000000000000000000000083d48e01d2fb58244861a74a1261063f7d20b412c8a44f9945fbe373cb4b9a7ffd4c4ba4054ece0abddb6c14c013ceb00000000000000000000000000000000133c4976454b7be427c4c2ed437bc2e882854d2ddce42d2f97cd3fab1fcf60c3272aaa123a0cbecce1a774946bb7a8a0dc6046b43e6982f11f39412cbdef14f8e330d37fbe6dfa9ddf3656b86f4f60e7000000000000000000000000000000000f6ae7de1dba3b3030b208f61d182013231c4666f134b007b52d36bceb6f3cd77577be7b11abc097cf9618d351d61e270000000000000000000000000000000005803904e3e640e51900805f930638ddd8b86cc1bd50cbd32a142e10d85044cc52ff769bf1b40dcfb7269c913d00b01e000000000000000000000000000000000e6997b1f8bb649c56de5c4bf9968d19712abd22fb7dabee19e0aebd1b13adcd3e8b202975b4edc917d93adf087fb539000000000000000000000000000000000a32384fe03280962c5f575b47192e5ef3111fbbb0a01bda2db1e9733471f11eac0a37df8ae1a891de311770c482c06b0adf4625ec80149b7810767c985c2aa0187987b3649cab8c59a892404ff2aeb2000000000000000000000000000000000531fad86551ac6dee15fbd62cb13f38d8d5c89d23a031b9977f110efcf16501534757bc5b93f0250ff02d6cfdf2009a000000000000000000000000000000000e6d78343049a68514271fc785de053ed7f50a7774b87f264c42e03e6f8f86285477f8cc57ae066ef0fde237c8d1ddb30000000000000000000000000000000013e313484da4d6b85634c5306444bdbe45d7db823616d72821eb64a2bb5f352a4f7e4273fb6557039fa563ce1b091bea0000000000000000000000000000000009a40a984be66c3442fc8946cc42eca722187dd819be9ab34a9c3b4b0de7de3d5f126c175fe84c51a6f09e18623214f9345fd17367ecb06b29d764b22dc1e262ba1a339b6f0e0c77384245e3d41cda970000000000000000000000000000000008a76db551280cd43d4608e9fc629a021675bfdf9bc5a021546b92f3734acff1e97928850716b94d15b7dbcc4a1e0aee0000000000000000000000000000000000b2262872c268782e8f27ee8fefe0827d45131555e755c0a65a7c8b4185269bd621412b653348d7c1111d681f38d946000000000000000000000000000000000dabcf0f847045e01ef70ceaa32455f4c962e4657b840f97a1cff7cf5073cbf4ca8ea75a4887076f155e27e8d7406c95000000000000000000000000000000000a9c0ed94170eddfc485d9f1a770a8b493d4a59bd7156d6cd4b95b55bffa1b597ae9d6fbe529dc0833634d75906a4aba5ce5e62dd15958e6298cdf4a4e899e53644a48494d04fa6d1f73f2dbd645817c00000000000000000000000000000000170ac69c2bf9b48715f445524cab902b18ce6dea7b258481cc59986ae61c8fcb6708b1457be299a6e2f6f34dfd936fdb00000000000000000000000000000000107e855593b6f3bd2982a65167ecead47039065c9ae6e1bf963f81d441f0ebb411eec4b3ed1cff73044f68a4c114806a00000000000000000000000000000000063b470d158ebb4828e875c3dd0ca29a4fd2cd2af356233885a871cb5b77402090f29709c6d6a78f612c8ca4df2f4119000000000000000000000000000000000db75a60fa0b425b8cd2c955e21846ce3c407cb3f96c472cb412498143cc60212de0dfd0bf4de53ae3b345232180b4ad853396021d32530351deec5c266a65519471dce2087485781f33a1423755ef38000000000000000000000000000000000389e79154f627463a7966252deab10b5e809b0c2a9e90989c56d4076b834e2081ddae1c02a9e01b71d96b772766fc680000000000000000000000000000000009109473c7aa614334fde410951a69ac45967f7550890e01b05279b6dff394775dac51d583ae0aa82edda18ecc5e66240000000000000000000000000000000019dd51ec6783c1618a7f12298e38cc75d4fa32fc31438f67eb15419a2f0e9d4b5f70ea59b69e531c868475cada519569000000000000000000000000000000001121c7a6cbbb54d5e30a11a73c158237dedac46385aa15d93592a30fb64fcd94a674cc77afd21a611f704734337905596dfc62eb59bb84b3b6599bf3ce7af229096a8fd5925d4743a5ea386a26c9a6d000000000000000000000000000000000178670fb06f5eb8a4f182913f46f66147deb3f9f634d620ed55da2ccc88895e75f76f55b979e1ba3c3db29710050c7bd0000000000000000000000000000000011adec68ef139716ee081db7122e911ec5a6e1fd7f681a96a713dddc2b742b6e7cf7485b8f45e7ebdec8b1174c02eaf100000000000000000000000000000000089dac9a47cbdfead8536d6cfe8b94d316123bd92ddf30091e16711ff4651c4e2d8dcaf6c72bc159d7de9fd832c6f5be000000000000000000000000000000000c40b871930f0c6826a943a229112f8bf9a3b7d7e07139e1a7d99f97601b6ca8cf3638e0265743dd732cee17fadf996721d35ee6d29ee4816b91d1664b5957767b4b8066775b37c3b3d08729c949d6e5000000000000000000000000000000001040c4cd3c28a752295b115fd80c8ef0e538e1a3906e0d326e46585d633140bd6b8231f50d50c8e7a9018a625c4bdc530000000000000000000000000000000008b966d9433bfc3bede4ddb005cd0c256a168437c31b8ecc83e6fefa6f4b1f2bfd057c78f82bb76279b74a2f7de493b5000000000000000000000000000000000c0f75db7a17e4b712666b16c31b10bb935e7127eb9a0e59e35ec54814a9de9012210ff1862aef5f765d4f7f673c4962000000000000000000000000000000001015e63589a8b56aa643a79c5a433dcd8f4933a10edc9921bcaa7098af435f7879a40868e25d1ca6f7852800df29c2eb3d283067bac390f556891a531dfacfc4795358229bc9a651c0aa71d601bdd56d000000000000000000000000000000000fab22ab380043b01d312004057488ffc958168f8fe4d9c86af622030121e14a46c4308d711d5fa9a414b9ef75d51ba300000000000000000000000000000000047c738fe5272e695f421ed463ce0d6308e05c23b6bd0973df9b55ca96d89c0771a45d53b4d17f30d8cf08edbf94490c0000000000000000000000000000000017bcb3ed735e5a302f76002ae82f4ac74889fa0e966f0fb611fa6a6a09440bc923f447eb6aebe47eef917753b7427efe000000000000000000000000000000000b189d5b64578eb53ad850c826082265e506ab620a9ab9684cc2a53718f26befc35e9431af012306a6190f144a9632bf873724ba35e4e8b731db36f5067aeafd33f2e966977bd0962fd57cd5ccbfe87b00000000000000000000000000000000049fff545ac239696c995eacc560580a0328af07376f5ec819902e30d5e7e40d5fe07295c4ccf54d5c06134370373c1b000000000000000000000000000000000bff448d5ab544a8cae0cacd216a6b6d48f0abe1b4bc946d95c1a8c4ae44bf049c3b572675a5e20c1b4188fa27a867a70000000000000000000000000000000011dbc52baa00712f66def2fa8fc77bcb07431d3285774e2517dcca65e611f07aac265856cdef0c1637def44c382230fe00000000000000000000000000000000090af0898dd578123c65d1f818c3f33866e4acea19aeafbb31bd8da029ed1daa2d7ab3b22147eb32a09021f7a78fdf2acc5934c02b63797010cc8474e90fa5dc88d73dbe5f9be605bf335057fba47ea3", + "Expected": "000000000000000000000000000000000d52fcbe9f1776477a9d2149ca55e0651fe9d098a67209ce2e7d772d4901ff2c70be432b53dc94886651865a81ba8c620000000000000000000000000000000006b54871379e2be969f86c72cda9acab9bc99f73de987f17ab8b25c63c55ffa2cff61b87e8c30d9f712afb62a2b9cfcb0000000000000000000000000000000005652612b19c38650d1babd4772722ae2c560e2914f2e246725cea86dbe1275a981a592eb55077ee4b7c6090e84d2ed3000000000000000000000000000000000ee37a6d42ce69aa67cdcacb19efc230c6c34969a2e081ac77e8f9d45128a6e8fff923c7647a0f168fee18342bc6d845", + "Name": "matter_g2_multiexp_85", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000f114e56d10dba7945d125fe1ab7871d9510771548d8388a2aec8a481de92572645b73631f9a60285c3eebcacb3bc0f5000000000000000000000000000000000667d3f31955df11e4e7896a1856fbd4e573f1cfc906b3953b5806a5d01dcdb96009d9f148156a3828e822435f722c5e000000000000000000000000000000000d7740ae776eb4766999f5671315c8965ccc84ff71757e361fbbb55babeefb96265c97df8892acdd6a9166641f656e62000000000000000000000000000000000166529d1a76ad784557384cb971728dba298baacc2f2a39ee36516bc7a761e9a7c29e385cf5784efb9f6e60e998b01e864a1ee754f6b0a86923e5501d54e6f47d7ab9e1483294ce98be13b7db52937100000000000000000000000000000000133e0b08430d9318d98bcf58b3d8f51c7b717fab56fe25f434bf521f830c7d4247d87d3df910490be2ad38adaa8eec26000000000000000000000000000000000e15afaee4f1ce6290ddfbc13cb887e540efc3fd8150dfbf3a5e7c759ccb8f334ba26953c7bbc43b5234b857159f6722000000000000000000000000000000000e4cc685524d42ea5e435afec7b3d7d025e93ea06407a28c246a39dee8ae77514a0bb2d5031f7367d658027299762bea0000000000000000000000000000000001b231237f7b0538d51adfa4ff92bf313507996cf5255f191875970ed4d946cffa8620b44045f4bcfd8f89baadd331fd93064d187f7d21b8b0a7092943de13b96c2e1ac9b578637a6e64331e2d40f53900000000000000000000000000000000084128f1848b2b244e4812eccba01287b9d07e85450459c8c42b01180bdd843058d9926f39e2fb5f610651a00233e31f000000000000000000000000000000000055ee70765f2cccac966dc08abd4bba0d004b379a2c6bf188f300f5d413f84e77ca1d462219bfb820d7f585b914a52f0000000000000000000000000000000002dd8f1d1cd85a5e6ac793f7e1e3cff887204aa4a5fed92f2088c06eae95842ab2c04d30d56f4b0fcfe61379e8e7c6940000000000000000000000000000000013e318f8b6f4165a8096c76ada440154901de42d69c38e66d9df4ffe5476666ecf7068e7163f29f04972682c43f3b0fd5e676b40c09f80be5d9398a9ec20cb811cf6819a130445203d792a4d34fc3e950000000000000000000000000000000003415c8bab713aa18d3f0d54e0101ba36793e6e9dd3471f8eed9a15e00d8312732a9ce88b5f0c30207aed92eb173ac680000000000000000000000000000000008a7e145e9576be8ba2fd980fb1735a2b73d1bf5f3e108878b721b6ed8378b5e0f03ecac179a6d148541096ba483b40200000000000000000000000000000000029e5554752db8bb87d58275268f24ccfcf3e0923744d57473d54a72e2cccb847eaa8f3bf638833a934c43930fbf30990000000000000000000000000000000000e0f2ead2697110a132c4ce1643b97fc652dd0660deadaa4e0c45e7ebfa64cb6a6fbbaac7c4e2b725beeadf6881ae5893f63a87972dd11f5239c35ce269e4b9239e3ae906ab117f1f045d3acfd16ca00000000000000000000000000000000014325fcc087aa108f152b42759cbc02cfa24e7e7cb995c78ccaa9a283ec2029c08cd747d599e0685d365ee99eeafca880000000000000000000000000000000011da603d3a1128329af19e596ebeaa4bad034c59581e9fa2e42a0260032f84654bf5ce22ee32c34eed7515d7fb0fade0000000000000000000000000000000000189cdb5b934cc1ec7ea0cf4b8158a1416712bb59c1650e6d244de33bebfffd3691b499b3ff8255b1b513deba709f7d3000000000000000000000000000000000e7ab2b279d0d5933df25d8fc4faeb8ca907e7bb8588e618b92737fcb6959380abc205118d2e3fc128b89a2ead5ca906145e3456d5ca6aa5910430e5a19567c327b757377aef98c4f46fe9a1f52cdc5e000000000000000000000000000000000895b6777e677732c74cfa82d5348c4c8ddd63ce10347836f5140b9a64dfe631804ea3be8e20bd4438f5e7fa14a121d80000000000000000000000000000000002422cc4781f007f732239ff9eedc126777d6ca0f0365dd90bab6b68c9e3d02ce726726a6d30d7d51a1f0b45aec1854100000000000000000000000000000000048af8a79663aefaff77a934f0af3a09ba02077c13a794ddb88e5c679ce348b3ab0fa217954ce1422f4e212d1383ebdc000000000000000000000000000000001190fec6c510b0b16e1505f737b25dc2401e9fc2c95bca92aa5d6e93b284b766bfed93a80b137e5fcb339983a86acd41ce27de5d3a5ef941d058a458f3ad2a386f1d66945789e51fa330fd65da4cd5080000000000000000000000000000000014fbf4d005f43563fb7408d1f20f672c8983120c66462ba9156b64a287e66960fecb41ca129b6b14466a5a0de91b81c50000000000000000000000000000000004fb283724950174d60f64af7bc8a7d059431332c8f17769df33f6607d72633aae3a8d595cb8d5af3f8909297844b3a0000000000000000000000000000000000e187476a19280ad9f33a55c50f37f765e343f92938e247ec9fe099c7f3df65e24af14885539bfcf3efe3bde9f2700ce000000000000000000000000000000000f086e6b9e845fe3b0c5100f82bc8aeaed166bed9fa4d34bc03ed86342a997101c508a4c096c4f67cb5791cc1a1fdb8187bf5c4624e86aaead712987f313e5db8f2fe6787fc33481ed6e5c4d3e96d5be0000000000000000000000000000000018dbe48c54347635d4b6bc17ff5ba390a73925f1b180d2c516eafc0936aa9bddaf7317cc0c211fb2a7f7bb096369a45d0000000000000000000000000000000015544c177a4b8018ed60c2639b43236957c2d995fb0f32523654584b0bf052e0930366a93406e1ec5c6d2edb955e811d000000000000000000000000000000000802d2cdbc5e15b25c77ded4bdba087f1d5760e6ebf9549a37f3314b1e88d3d6f58da9d8c6e9ef85028a271b83dd6242000000000000000000000000000000001577bfeaf213ca8b0983cb178e9634dd18f74baf02f6ca31b2e3b287d80a32d4cf11afc71df09ca5bb0bc8e60fc7ffa968cfa3fd0692c9ce56538bf70e77e2a47534d9472ac702c53f2dbe68217d53df0000000000000000000000000000000007c059044ce0c15bc527b19ce85cade8b1d5a9cc6dd304ce9a3c461e631e17c4feec52a0ab5cfab6a2270c75f73df86e00000000000000000000000000000000076344286cedc8c180e3bd762f12ac08f0ecc51293b9f9b8e7c0056ceba1bbb6fab4ee39cf559fdbd601db6c3d201199000000000000000000000000000000000bf6e708d0a4fd85c7566804e19f21f7a00bcc3bd7135f6639ad30aafef2ed1e72c84c8995b0e59738c2bf1e4040621b0000000000000000000000000000000018ff3d0ade15b690b6e306adaa5c10796b78ed7f8a984f637271cccfd39fd17c1e8288a11b051ca94de2a9bd04fa96d7a36b13ef742bfe88882a4e635b5fdbd9b079e1adf3423dd4962835c68c9617c500000000000000000000000000000000025cb808922f6deb0bed979b80a675d9324cf25c53de373534d771afd919a182af9aa1dc26a2d0284887121bf4d6b6470000000000000000000000000000000018970aa4f456c1b203817322df2e222516bce67ff9ace069599061c6229596e506c0286171f3551302e45b7d3b69a39f000000000000000000000000000000000a57d0da60f03fd4a5664546f9809c771ab6188aca5102c31f26b09950cadc26b0275417ddd9c4f4cf29794b739733cf0000000000000000000000000000000004ebf2bd93d7921d8bd97ee71cadf91145e064a33651da2604ed6fc8e08b1b8305005f12fd4e6b68b7b6a3b5cf123b1324c54daa7de8446e5a26cdbd6741cc90bfd26c544fdf221d47d509c978723c3b000000000000000000000000000000000c8ff29d0333e3f38fd8af91ecdca49e54ea5dced71b60d693b1bbade99ae668e4f994f7a5417a08a8ddafa410d437f300000000000000000000000000000000078ac1d0898a9e6cae29fe6b50e435e5f543d0ee233346728c46d659c4338295f27b42fc4b2851ad5035feab2bea8871000000000000000000000000000000000b3a566d2ef4467f21c27e4a3dec99a26c304b32ba1fcce8276a8518383a7de44de5b4011ba738dbb8761e67e36115560000000000000000000000000000000015a0aab8c3d51fc3fc8aa35dcd07f8a08188976883f9d3ccc87ee148525f2115ca46726a2e3c550167c169977b216d6217ff7a416011549f144a3a65238d62395f4f76afc09496902c064b27739c6d0a00000000000000000000000000000000115589e8e1440edcfe72c008f6e9cdf13fb7baaf70aee16166e7f32f4651db784f4c5cac15d91ee13001169fa777f0d00000000000000000000000000000000000f86710678b01c8f648bab2289e8f90648d9470cb13d5145ade526696d22508a4a59164290586c2c000dfc55b4a20350000000000000000000000000000000019b300961b40b0d9fe6e292e9357d04f0483ab3a8cc6f8f522153c51d22de8e96a812adf720d13ff7d05d1e68264638a000000000000000000000000000000000a80b61ab051ce413ec838167fce393f88c8a25f403bdf07cb60391fb15306a5271a7042d36f7c46b5978106a7b5293c4615de9bd7aebf1acedd9d40fddda34e4a85bc253c5e92c20d984f6c4cec533c000000000000000000000000000000000567c33d22805319418cb1ea7eca6205a6c44f1f881c03e37bf3c66a1baa5153473cc73b8c25d497b0b0057ceb0395960000000000000000000000000000000014d7a2bfeea6a746e709f6108eb32581ba38a617e4450b3567c77a992988d91f4da31b209286f8e9fd0d7b8628aa6c4e000000000000000000000000000000000ae6c9fbf0e06f2e38e91699cd21596ba90f92f6022a4f3c7c8a6557b7e1331283bd4d7a7d31d77d9d7cf70a2945ea1600000000000000000000000000000000066b8132c73e1da8ae7fec9169770a188b686f223fd0306441356040bc9070f34a47fe1bb8c94de9fd7606c18b1d2b1dd38f1a0417a5a366dd2d8f5ce229afb6f34c1b663ad6eb1d9ff12f38412f00f7000000000000000000000000000000001460040d0a19c37fb0736ebdac0324d8a38c94a73fc5f602b7ea5b7255be9d4b6ffc22fea5043d948420e9ae3476f56a000000000000000000000000000000000b37c0078ab8babcefa8874c6cd1c5184d713b976852d087ed84337073fab3054899859d0fac2f4351bb75ee0e534fa70000000000000000000000000000000004150f3b98e6166d9d6b0388342042dd8eff9b8e1239f479330b64c5b316f98fc7bb401b737efb87e1f6663ca4efa26700000000000000000000000000000000043e6131c1ff621fd6f8caf0939487a927550343e24425ada33cf622de757e6e75c9affff9f04373a954557181641617364da9c6b07aada98107447afbb189626180c5eef31f7f2cf26d5d76ab0c74590000000000000000000000000000000009fa1754bbc957d2a8317a2eed859457073571379cc7c6d65bc6a0b5829f8142db77654eb98a2bb0cfa5223a27d756cd000000000000000000000000000000000cfe8b8fbbff7507d3d74f4f550b4c85e19b8929d3728a462e12b4008c79014103153c69ed8dc6b743e1b6fb4720bad00000000000000000000000000000000017ca0c08c320c12502a1dbc841425694bde68b7806eddbb40702e58ed26c7e112f9a821a6c67afed174f51896ec2287300000000000000000000000000000000014d08df9cf825b07a387642ac9959e8cd15ea8e752231a3047fa30816acb1ecb79f1755484af9a98b993f50128c2bf5031aa8d860e3b598ad0c4e9f93f26d153f8a8d8d0dd614ba868ed055c517532f000000000000000000000000000000000273b64e867a9111e257c9b32484655e4d7e676ec50f174d9ebc9fc4262c037b176ada941dd8c1abf645e275dde04f4a0000000000000000000000000000000008a63b9604e96a5034d92e3790411f3112c2c7cdaa056f9f1bdfc0b164c37fc9f58dbb566337132cd1626f9ca2618f800000000000000000000000000000000006a661167c9fb6c26bfe0a3902f309fa683fd22729bfcb433756182e7e1a406bf44ae1d13ef0228534881daa339394e400000000000000000000000000000000193c6c5ec200d225c43c6e37cfd15e16e49b7d87e5515bb7b4c918903966f4f6ae0d42af6b98f6efdedc9b0301fa1c0f290c467c4827c9252b82ff523633ba116c52d15df9cd4e3121ff0e9f754ced5f", + "Expected": "000000000000000000000000000000001403c7e3059135ebcf5e752011fdfaf66e348135314f3f4239b066e1c6192ffcaf89bad4228fcc2be19a64f4f5386f5e000000000000000000000000000000000aadbd8d0e53d5b409f7fa508089337bcf36212a3f613b37a95757793dd6b0ca99d1b3578ad8020d46e29c9c4197ea070000000000000000000000000000000019e43bb32f92ed187fc32d9dbe24a486e38316a3cec0fd7f7c19b313af43a10fd63738b78e609e04a083de6761d53a90000000000000000000000000000000001490da7d36ff16304b27f6e57412975497e9f3a6d35cb162464bcf69fe141d34ae27a33afc75a2802eb120e90d4897bb", + "Name": "matter_g2_multiexp_86", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000038ee0c2c409d8832437ea450ed705589c82791b8319fd0ba6fb4d302d3c5b73ea0521a0253716e5810f03fca2e9dc720000000000000000000000000000000018c9d748aa685bf6e11e6e4b6ad2290ceff59c8837a088b41a08983fb2c5ef077adb0730b298c5df9aa02a820a19a4bd00000000000000000000000000000000015d248426e362ad2489c0c6a567d80b22d54d6a79e198198a771fae4c4e97eb317da9feba8eaafc9460ef45b1a5e5690000000000000000000000000000000005a2342412801cb37911a04d7ee3b1e5d3dce2a06e0658d59f2ddcaa9ba32804a1ddbe8f4d00f4436aad1346ed1ea5344aaa57782608de34c6334ce5039c67767f6da7b315dcfc772f03aaf3dd1e67b90000000000000000000000000000000019d49748f05458cb9b316e433b0d341e23bb5aaa724b824bd147596761c11efe8f4940eae09e302e563e14e96b814f4a0000000000000000000000000000000018011e7ee4988da168adbcf81cd14a9232edacc06bbfef0fc78dc0f96b5ac86ea67be8661442b5ef60e3889f3137182200000000000000000000000000000000175a2ae3bdade6551b23656c16884ba0fd4247df4ba7471cf81022d7e224b23490db153c8289f95467ddf9671f8b6cf90000000000000000000000000000000013c58c0f55c46bced98faf3865e3b6a836252f252e97b6d2a799b574dc569f09ce33082880a4d0c3b8a2c7c0d4c30eae22c1cde67b0e8ec7217c6ec72f36d8a1e73794297819de9ef6f1e52acbd3ec4a000000000000000000000000000000000ee45d5689a8ea6132d5ace000699a157c1cea3c0c98b38d504153d64fcaf1702ac7a1cb0889539d6b15489fef415aef000000000000000000000000000000000b320e0cdedbdc1fc5733488e6d2aece6386a030adc36b0a69dc3809827319947049f3861c2edc859797d30a3689322b00000000000000000000000000000000194096079b3a1d6ab1080dc71bf6d5734bc7b5e7f30bbb0f9b95c9495a6bc4adf76e198fc66accbbbaac215a8932d8c5000000000000000000000000000000000ec07be0cfa9b3d3a64c016471d9e6d25228b46dcaca6e197be00b9ca5087162c35f1d6326a3cf83f568cb06da8c5220895341f4363b688c4e9660fb0cd17f6c111a5c92e732205fab0d0da0175f6832000000000000000000000000000000000a7f3a3fcf2e7b0ada6d4fce179bdf229454002f1271a39d5e99daae72da549c6ccfc7c574f35bb9784100675c30b1120000000000000000000000000000000000fad14ab095fa09bea919ada313727e7aa5aa06a1cc7746d006e3eaf70f79c5e4001a8a8de03540b45e0598b22710e00000000000000000000000000000000015345ade62c5691690c181da09d8f39c1ead42046987b8c7c975d40690a286a816f8cca519731d0ca23349c54b30d8570000000000000000000000000000000019f0a32361bb6ecd8b1d87c2e15d31c0e0cf995eac9facd5eca123c0799c465f156b0142d98e0f315e9b3595974a7b824c5718fed7503c5e2a97fd6ab0294d6c42b1d35067e9d5ec1077176a4bd3126f0000000000000000000000000000000017af46e78904915e348734d2450fc6e1938bcf002989f855082e3b4ff3366d81ee8d28293609c3c3b11568668b1305f80000000000000000000000000000000018b0b3859763c2654fc00792a5193b7317fa5051bcfd15ea42be2fda0f43adf322219f34e54b2446ef73a4562151f9a70000000000000000000000000000000015c23509a1b324c649ff878d004ab5f253d041670ef172ec4dabec7a525d5ddb8f9f62f383e3f71b0e9c98532e247d560000000000000000000000000000000003a38564a55fdbe05b047281fa153f736edbf48c901749005473255333590f967171a6fc88751eaf57a5335bbfb6ebe86d055ad484f5054e8bd0d073cd556deba05418ef1235d08ecbf8717b550933fa00000000000000000000000000000000100322c4a92c136437714a6586c82a6842027ee218bf1fdfffaf95ce47c9c8b6c8f61115b092dff81ff2e645d0a7a4340000000000000000000000000000000013a91ed8629acb5e770683015c3c248255d673d4b2e6c96334d1c80326d1a8b4b655c81175e4a914a45fb37c1f178bd10000000000000000000000000000000019075c2eea3f64f42be82fdb8f83f2c68c08e858702a0225d869143c0b017b76a7a40d809116ffbdff6700b288f5ca3b000000000000000000000000000000000598ee9ba9d56400b59c7f5977aef1e179855a37179fbfe97b95f19137b6034568e5c7f616943b4aca804272955d42334cccbb062c27a67ae2783ab65a47ce166330cfced1f11b85f87483e0250b138400000000000000000000000000000000025a526b137aaab5ac1b5f8179a18b06feb7c905b4a843cd55e31b7464c2b6d432b569e9bfc3222511c18255102aba5b00000000000000000000000000000000090c20c9f78a242e52daa339d5cc1c3f35aff7ab802a3e4366597db8b6ca43d30fa0fe8d9484e49fa4fd0bf5509f19e6000000000000000000000000000000000e928b2173e32e5fc9c373a2a6f126e1a3a472c01a5e87677be0d29907022b9a7dbec3340cfc89e67377ce472c2d5d4c00000000000000000000000000000000147b4eaa2dcee39b918b7cdf24483b29466120677e5d42b51353a9b2fa207bd911d9b391142a13a212d0ab38adcbe10796111cb1181f048f51349aa2953bba2af50f7b7b5d2328d435bd63a7df5cfe5c00000000000000000000000000000000007790cde9ff8af2d7597d33909f00963eafa228817de1ebf4233ef0831202700b99641318186aec80ac913a1b1143eb0000000000000000000000000000000009d42ea1386d8b019dcd26068ab156f399c35b7d492722a20da0c915f7abe44ba688d9486f4bbb44268542c5a49168930000000000000000000000000000000010611f233bc1c4af0a14e1d1b945c91c077ec3dda592e2f852e2de41e09331664e1a92f9a0b7416c50327bc943a17b9e00000000000000000000000000000000048614243262dd070a754f40652b96a03326fc51273dddabed85df0654890ff38e0da7abb8190e4ebefdd6f78a5fec509d7f0c0c7e927bed3fb930fe2d0109f58678969ac8e14fabdf4ccdd0823f706d0000000000000000000000000000000008451d24fdc873c61db44e57372d43c35a2a8098255f9aad3a6b244913b86bff6444042e391685b1244f009c5ccde935000000000000000000000000000000001177c2da9972a2b96afaf866f97dc149482fbaaa93e194803c09c8334c2c7025e08cad4f7898959a57b07a545ecf76ad0000000000000000000000000000000016f40426cbd1f0f4ca5ae1dfa4c3960a6fbd51a1b5b24ff5d03fb9911e908406a0ecf4f20a78a280d24dc9bdd1c0799b00000000000000000000000000000000194a8c55f549da1842cc3173f3eb7bfd70df26b43a3059a3590992e34fb19b2caac4149f64d442965e166225b9013e2b11ce517fad2609f2ab8d44ae6263623a7903b2cbec683570949a96fad78fc6d3000000000000000000000000000000000a97664c1d7624cae0e969c728a84130fe260581305435ff8ec701cdc51a73977f58c891ecee637eb6b7c972069ebbb80000000000000000000000000000000003f4ed6a9e9f4229f0fb35394bbc10da9adbf4985d4453da64eb312ec88cb15bdc189a3b5df1af3107a36fc001ec92ad000000000000000000000000000000000ac552c5f6170a70563fcdca8e0c6a7c6135af2f9d5ae6f60a2c459d1be4cf76ebcdf9bcd891db8a1e2fc905a23a97b4000000000000000000000000000000001734a46c99e776d1ed4b807f5b313562e0989ad5c67dbcb961c134f8b7b7601c23308839569dc224bdf7c370c4498303b17d28cbcb9efde6d9cdc4c9cda385ce598ac8468d4fc94cc8e98ca3bfadf440000000000000000000000000000000000a523182c886671435ccc75cbc78293274802c6142465acb31a1809e43b1d656ed9c808068de167b1ab126ed0f73a4490000000000000000000000000000000007c4616080b5a002fea3589d54c7510884a3ece705d27dee315851746b1ee748e8a08d3516d8c6afe1c0482b960a9c62000000000000000000000000000000000dd1bd9b4b9c140aeb97887a0266bfb5696813fea034b78bb7d0cf1cca15b5bb0ed92a97841c8d8cc614f7721b8b7e040000000000000000000000000000000012a41a8941b6f0e4c87f8188718f9bc75305d41d6f4441eb9682473340fce0bbb463e1b922d3af8daea32b8a8ac9c3b4a9516e93416bc7b0f3c5ef5da6112abb73fc285a14093ed19d8eddf241169119000000000000000000000000000000001763ab2b361681955735ae00b69f26e06469391af993c8dc6f2e1dffb52ca01e49d58d6e2249e7433ccfb5ddaf8fead40000000000000000000000000000000003858f3bb01b2393aa4d4d7889bdeb0bb9bcde0dcb9b39c4ffe0fcd0b865baaff75b676c715be275929ff4303c416e0800000000000000000000000000000000086d64bd1302b0b3a620b87ac29cac3d9e606513ec8b47898cd852bf552c1364291aaa842616b92c8936e076e59451bd000000000000000000000000000000000967c9f59c15ed02c9b2da6e76fb0bf3d445ba849010afb7f9c994b1ef6a05ad577570d4adad043796eb90e51537ce5187fed462636eb57506f870ed1c8f66e211758327f4c19bf909a6419312c58945000000000000000000000000000000000e6b0da7b406bcac2dbb90fbf430fda6442cc2860ce633ab84404dfbb426949d55ecd72992da1a2e8e1ce229b599232c000000000000000000000000000000000fbe3a345ffc8fb85cedc4b8dedf9d952c41b4ff6f1c7ff4cf91b2276621969d905aa9aae5fc89bc516f96b9bd1bb3c10000000000000000000000000000000018c2a7fcc35099c41bb851ff66abb047e2af9cf4fa9fc45f030124ea2c7efd26e594abbfc7a7f258c8081a3a80d15105000000000000000000000000000000000a27cd33c2121c9c542e27b52a13275ef7e81dc0c6ece883b65e71d2bc3e7246f95aef7c6b41eace382a1400568cf298c373d64034c78482d6673c6906553151887c8aa28ab2930659671b8cb98a595700000000000000000000000000000000158bd8e6198d22b52efb7f3b945668666e1190a4a8e70307ba5c1b737316a8f8568092f219f683c0f53f56f25745d4e600000000000000000000000000000000097e64e4553371c81a9bf553ddd9719f59b329284eca0d76f023d603c29a034d123ab777cf173c5f2bbc66412d69d4ce000000000000000000000000000000001298cd5501e136a06ad4fcf87a75c0c7b96c73e844863b74bf6aa581a0ea98c2b1f608c668743a3e37ad5ca2074af9340000000000000000000000000000000017ff9f1336d7f2152f17daddde9d3e1679cab8120ed2c0288b0908d4e2099a08c9bc6f79425f004ea3ac4d684abff6dcf29c901f9769a42610958a8cd53eaacd9e5c4656106fab536052518b4989911700000000000000000000000000000000115baaab8f0331894da531ab557bb454e2003010ba1dc1d96e3d983d49b1312585c6d4c43d85dc074b23b2fb28c8a1d6000000000000000000000000000000000db1621b721c8a54ece26a355b190af5f3e1dc1b43e0827a1912ace651cbad4b980e77a4c3566aa809157229b234c808000000000000000000000000000000000c594e0ed3f7ee55886e251deef9732aea3de11f094ec53907a843b755add8fa5d00779a66621e615ba7772ee821c4030000000000000000000000000000000004e80aeff6c4b85188903b4d2dcac4f94f7cb4285a38f94b0becb556d83dce8735d1db5810b409d45a8dd1b9a6dde29c125c12599e84b7e648aab52cd68fcca7f1a5f56c854f3c36e0445ab7e2df2b740000000000000000000000000000000000371a74468ce2ad90e19b7fe3f57159dffb1b0422b32ad693b2fe6c45c5d371b97a90054095da887019d25c1ee8197800000000000000000000000000000000010575e1ec9a3e609ca086ef8bca679c4548482d9e0da2e51878158ac8e5b29d824c31ad7ff642041e748efc50c2514e000000000000000000000000000000000ef36130380f1e84b2f462b5f970abb8535431b79813015261015c6d7e74f038b47504de01794840d93fbbb4b386e17500000000000000000000000000000000018419e85fc2d75f007d1e0e02c1975332e03d42c3b41c50c3538c3625e702161cdcf8913babd2995aea7566ff15abf2bb9a1d051e33a617c25e17b7ca8ae6b02f16c759cae0df7fbd403372eb2407f6", + "Expected": "00000000000000000000000000000000125406a942ae0119575453beb4c093d2696d3bea7bc031d7a586439197f848e1d5a82b925b4e96138a3460eecf198ffa000000000000000000000000000000000befcee6bd1412c54674a3d519dd2813b87b18f2ab3375a731197e9f539f8f8fff634f15647e7fea3c65b93594343c2000000000000000000000000000000000011e4d432ee6babd502a9cbbb5cf4839dc6da6176b6bb0ba51d99a3587465f5f3f83f4d4cf2c7e6187de93b859ca61d800000000000000000000000000000000168509010b867aa198fc294a5879ce14a51503c1d0e8fbc02ec08cf62afbd357ceac24b633bd0fa99f83dda92e10724b", + "Name": "matter_g2_multiexp_87", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000070a0d060c6e9bad0d1bb15417578daaa8b7a5c984c4947dba10fd874d93fd1e3994337c87799d78a674087678d9168f00000000000000000000000000000000128985b69d5d6ea0ad0b19eba7c2b430f5242a7e89626c66fb83b58ca7cb65a479de4b2fca6886cf55b8cfb52394102a000000000000000000000000000000000bb0bced708571662af042d18956b5b7d797b61aba70823618682287deebe69bf1f9a94ca4059e0570e25a39e60b9a8b00000000000000000000000000000000193f0793324dc78c40f356dde030b632feeb1609a1bd75ce88f0d313a0864dbf1f5e92826870866ab9b3c98cd1c12aa508c35887835bf4497d673936f40ed44145c5d5009fae16eb0f3ee9168831abf7000000000000000000000000000000000a61a310f90a5ffde617b78f784b2e699cd77e7c3e7c483a2ccb768f94d68e59a2a4521410c22ef6f21ba589ec3abdcc000000000000000000000000000000000e6568c83e0f7e459b27a28e5bf954983c5dee478a009c244da16041e710ddc67479cdb3da6f47e7203fedb8f765b2490000000000000000000000000000000001c5cf6b948b85a1c426fe932cd87605f1fbf6c932756eb1bfb43beaf012bec4612d8dd0840efd4cba3f5394beb65112000000000000000000000000000000000e02d5bc20c40d7cc2165a21ab37c6e4eb71322c01a43f2085f93b5b02bcabcd668dab90323db0f9288737d757997631a0154f7f8d52319c9e5cd59052e91b84640efe83ac814d95370e46aff4334cf400000000000000000000000000000000165287d72eca1ecda5fe16a555245b0a34a04beaf9177466bfd88bbc675442d206e70f7a2063b6ed0e15e9406232f5ea0000000000000000000000000000000004c0608bd7e01e65a15716b0c505111a3abb0abac3efb846e05e8db59c063950dcee052f04d1c4e9e492bc6740fafe6d000000000000000000000000000000000de897f7ebaf9089f7e198ee41e1efd7d84fbec7327799b9293a489965cd36159442eb0dc1f79f6b1f122f592b013bb30000000000000000000000000000000009774586dc359e5d20486f00dcea6ff93948c5a8b74058645d1048fe46ae3330dd56d85204d328f43f15e674020f353ec252ac28ea29b5459cd2ae5bce4bf08a102280c093b9962cafb481016a212709000000000000000000000000000000000438ee51a560aa419ad6ae45e1014c38b7c43f1f6a512bccc2d4f10a35838369b71799fab4b6a754fd938c1a1b874fc0000000000000000000000000000000000c1491c85965c0b74d08f5866ca727fd30bf641a6ada0ab8363ff01916c37d10b1b7eccff79b396c587d9beca2c826c0000000000000000000000000000000001452f254ceae9626443265ba31a1a750a425f2a7789e69cde16b70eb319c744a6221e74a9e2881c6bafea161d29638df0000000000000000000000000000000011bd6a1bbded174e9cb95d74492f7b07a755339a6c40f2a1a76debccc0f3a32c7017ca4e6679fb2c038c751f19986f526d3bb5ee3410dfad575b0fbe71ac5df2048f74b52e777fe0955d6e244d434f3b00000000000000000000000000000000139157c34aaf70cbfaa82be655281b085e37d6406df4cf8e291b221394e91d9e3cf04d431f15436064d0bfc8cbe13701000000000000000000000000000000000353fcf6e587e71e59d8f05d4085961d37b1f62694dd5c7f40efb5875b90459dd66c4d2d6c01a40834307ae9e82c2e08000000000000000000000000000000000a4975c9872fd167d0ff4cc80a6ce179b1e6e1eb21c8de80321451b1deffe68d8a13db26218f14935b64af25d63644c10000000000000000000000000000000001e8a2824f21cda745a24844ac0336994fb18e30608ac61201a932c0a5a58f1acd56cbd9353bfab4944efcf2859ad5915c30684c596976bf46384e6afb2bad6f821c4a62338d7a6eb204ed75070b1973000000000000000000000000000000000537d7a9d7d9dc451cba4d50630caed32e182cbbd95212577b8c2855c327530e447a4f3d73c7d63fa3ad5111254c9ed90000000000000000000000000000000006984b32955fac4ad3c0d181c81b98534ebaddc316d51a40baa1028bacd6a93a20d4bd6cad6a0f8cf7ade96bcd4d68dd000000000000000000000000000000000720c392a663884ad4d8daeb7279ac41717ea602108c76519da13a45a77d2acafee842828f5ccfcd786bf7ea88afd01600000000000000000000000000000000081f1d3e37ebaacc11671bfe1670ed65ece2aee0e3b5d746a8d618b44bd4b7dea905eb8e958bc026a092b2bd5a7b87cb11009058bb8e23b0a4294b5cae63aff10265e729d3601d85dd7f1e8063ce260a00000000000000000000000000000000005af33731879a574f39dca99c5c1b9517eda13121221be77a0c1bac82fbf29b37889c15a9d32531a3f6bf9137ce82dc000000000000000000000000000000000c62939f00d70a07a85804cd97fd34b9764565bdba225cdd7549729ceb9735bf4d09a80ec3055c483e1e24b66c41e403000000000000000000000000000000000e415677988c9d4656e59f77c608926c83028f91bf4c0634120b5f774ba07180b98141ffdf727cf9d0fc7a4cb52f4393000000000000000000000000000000000c9c37eaca857151a0c4a49b079f2f061e6a8ebb77e11eb32b29227529562f8dc8e2646e25469491eec5a07b11943f203e5489447bb9a5b661bcff2d9a4153a5aad975abdec380301b6d4ce019bf2cdf00000000000000000000000000000000015113f8f9100cd18427ff48038e1070fd835fce6c0812b7bafa679ac733c80bef56492ec3ca08c1117bd0edf19cb26f000000000000000000000000000000000789cd90c0be1de5d0b359c030d4b9d8aef93951e26870e37c375b9e7879cf277971a05babd319a3a6ac53f00f3254e40000000000000000000000000000000019b1cb91c9a1b1ee49c3837339778806bf0c093f171c92c9931ad43e35fc61cc08dafaf55b7b9e0f49dac28a12bcf92d00000000000000000000000000000000066c7864631333226f191e313436453e59f48f91d42e68874fa4da45eeda1f6f7f6342204e64e124d5ecd861f02ef4f00444d520ee01d87407747a4ac37abb7bd4e4c4f1735ca7458cc2e4dcb1d6297c00000000000000000000000000000000129d887d694be0ef2f84c343a9aebd0a2aaf19a4e78586470351ffaf0b1309593363bd9c6e7fe39a6e59445d935414ef000000000000000000000000000000000596d7061c2399b6a9be7d4d495e58c0377b18db1e45cf3eb431d10cb8b15ae42548a86a26086d57b1a71cb5857d7917000000000000000000000000000000000cce7181fc87dfe1bb493043279a5d93cb2d980eed38dab2ace8c9fb335c2890447434d80df6e7c95729933ada7b9d8f000000000000000000000000000000000f0e1274ff70bc6d3f1d0d5b251ae528ed94aa3a1b9bbdb260892bfaa6213892071b8a6407abe26105b2f81df90569492035cab8f8120ea8e91389707a290db4ee69875d7429c6857e74e8bd40dc7360000000000000000000000000000000001192050735b114c19eb2bb9aa01f04d1fd9bed4df877113a14f7fbc9c31acc10db3ed0e0d15d8433e7408bc237c985b9000000000000000000000000000000000a8a66cda780790311b56836fe69479c7b94dbc6c82ed5886887dbb539a40390ebb2683c04078ed105e639a2ed8732a1000000000000000000000000000000001678ddff677b99011c73e0c9875b5b2ba063170f4d565d261b4c6d3263ccce0334b5bbb7ee08692568037fa96782e48b000000000000000000000000000000000ae15f79ad7f790f8ceaf7709f4b5da71642da0c1f7c442eeaeb165c7dacd8a4892fdfc8447a03a7c56e12513499e43c4bec711286827f0941ffbb451a8eba871239341a60e3aaef23487175c9d2e8260000000000000000000000000000000007fcb5ea5358074d06b64c5f46454e682dd9ac2127374c83f3ac5ad46bc5fd2fff7c5a80ffc669a1c159ee8c9a01bd37000000000000000000000000000000001010ada1bd493d6282ac2d3582480f50074a02fdf412c63e93c5857974626ff464150c20bdf23a87692bfe69a075eeb300000000000000000000000000000000086bb5664a8738f02af5517aec4c6db47653a6d76bd4b5e37ba4d8b27a7819e82e6a4c7ba4f8377e06a5878e7c0bffbc000000000000000000000000000000000be1463ab76e468e47e1711c158dc9bb10d1278f5cc676cff937f60ba457061bacdad7b8d3286f40219963b147cce4bd369d91a4d575d4c142b98a53115a792ec50a290608ad316465487762e83f3a86000000000000000000000000000000000c3329d1e1c76b0bcc7ca3766b2cc5ec8169690f45e0ea3e37b7173bfd6c884921c7523ff25391a85b47d5de395ca63b00000000000000000000000000000000081ff066c008d5a4c893a636d24e9752c6a06666dcbf80082167610e73a32d70aae3e58c88ffaa27f05260b86b11f72a000000000000000000000000000000001178e88c652d257888cda1c0b65ee2c0636184194fef9e6ae3791a85417c43a31fe75893773ff3e7b4d4cda9eafa8de40000000000000000000000000000000019657ec4604ab5e8812237a28e5ff320a0d728c60c541142ffd87fec2c703665638e5eebc33e308d5582cd043d08d788ee472561535a7710db521976cef0c92a4ed89861ecb397cbcfafa477756e8e120000000000000000000000000000000010789200f69d8acc70f108145804b62b521a30a04176c449f52bedff5975ad7b273aaf4a32f8461ced8e92b2229e2cef000000000000000000000000000000001178c36174cdb783b5b09d419ae4a154512bf9ce07368521d1576b2f1bf39f98be29bf533bad16ba9d96aae621612aa70000000000000000000000000000000002580f2115d1814667b6178b6bffca6a4d992eb66e9601c0d21e32a5f3b69e3f85e1205c877b2dc2696a0e872c5bbc6c0000000000000000000000000000000002c94d7ff016d57bd5f589971344c6499577bc2234e18e6c8dfd7d27a205442a4236ac54fe279d1bbca76467530140b42cfdcb8240f183abec526344e8ceca6a007c35b757928803f854225d3a6ca36100000000000000000000000000000000108b6fef7396ef71b46339d421726f83b08320599d66da18234011720d2b524d24075a255d2771f1ae904958c50a9046000000000000000000000000000000000723d5045b65c0887da1bb01d874714ac86d21441119a93a1d5758957215f399f5ef1cbc00558db01b295bf0cc988cab000000000000000000000000000000000994914a3df9d3094dab0c0c41a45315dce5968a99e6171fc609ac9e50bee5ccac771efaa04067467e95709bd924973f000000000000000000000000000000000ac746602f804f52e9a485c30412adf92eb9af3f6daa8f23b974339a0ffa6f5aa1b70a80a9f19cde2a69a4b7251ecf5d60659743dc1977a698371cc302b7579b6d7d13632a31b47df369365fb02aff790000000000000000000000000000000000a2ffeaff148dc5f70fcf53e7e8d7b6100cd6e7df5b3fa4aa33bced243f15b4f77f48d25f74366a693404b6ed7d3075000000000000000000000000000000000f3e1b34ac8fde4caedf3d8c3e24db02de3f91487db300f09c779e7e4e96ae55229288abd946abcc3a8adaf18a0c89e000000000000000000000000000000000166a68c5191dd7f9d44eade2ef1a9b522dc062bba9c55e2ff03aef400e5d2765a12816b4ba51e10bc21e06113c8ddc5100000000000000000000000000000000109c00de20f7e827375c1841348e684fdb248fad116e9643dbda8be2bd06b71db264e9f2c40dec2092e7d518540a6d82652a5d4fdf6d6703c857fc7b10a741b95fbce91fe823d827cc7203be3b3bce0a0000000000000000000000000000000014ddb61173359514226c150a3343576b04fb1b06fabd8fe2f921fb3b90baf5513447c107f6d2f96c8b03274bfe451dca0000000000000000000000000000000001d1064860f6c4d62a282147308e80ceb0c5dd62f39b3232a231b1b287e497df31cbc5a3905a7687eb2f24447e50a395000000000000000000000000000000000859611bb3962955f92bff861e03d07bab7fe1f69e90c6bc7928be8d1758c9194ff7a52b16472d04564607b742543eaf0000000000000000000000000000000008a3e8396901a205a071aad06ba9812207171f33775eb358de4232826a5f0ff50ec3e137b1344b583849e8a5b424b46676a30abda185e7d280804952fc0c074ad907fea2aa54da4c3190895270169b20", + "Expected": "0000000000000000000000000000000008c9db83241e7f3ae6c2eac8fdcff5f2d35318e24c3b4130e9bb7048a3b84a52fa3f222a8190121d2a5b8835bf911bb200000000000000000000000000000000002db79cbcbabf41bd8c715e024f4687bc0d058d76b8dbe58ffdb80918212ab6e9b35256fde583c0fe903c34a4c41ba70000000000000000000000000000000019f37d05f5c9e65c6f004e1aef03ff0e1899f0739c9cc4e9038e18f9d45678388454d144495b2cd993eb3691bf3e96f5000000000000000000000000000000000d8e0d7715ed71291729bf480f5fee7ae04264015732677488472bedc0dbacf8b35eef7adcce196e3bba9cac0991be81", + "Name": "matter_g2_multiexp_88", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000064a134260b753af73df3764ab662e3b1bd624c8f3248e9bcf7676d8fb0825ab85ea33387d4641c81fb8ba3757e0870a000000000000000000000000000000000d67eff1936a395cd3f808ed7fc89f8b6a227c4849a6941d4bf762af6e41ae41c8114aeccc2565ba01fd902df530df1e000000000000000000000000000000000110ca2339832e7a9468844b94b3ced0c9216654bef1c8a5cf66385a99d5d452f978bbb7fe15fb477f56753488fc909b00000000000000000000000000000000173210b548d1b98b926539049996713f53108cd2911105235c1d5258360d5620d330951db67219ffaa304a67fd6219f39f4db766964c7855daea58d1205fe8da572aef06e0ca64912cec7c87bcb2f51f000000000000000000000000000000000f7c3795ac3d511f93a3d85e65261e4c09cd316787f74ced6e472a3993b7b5b0ce5a7c91d99559a8e0791f712cb4e1700000000000000000000000000000000018eacb2c5fa9221881c6311256a69c7616748deb3235c61cc11412860450151a25e3d6a220bb23e0b3e3325044fba68300000000000000000000000000000000121827286873ad31f58cb3889fd01cb7d0f91ff1c241295f6ef2dd0e8aa8638b63a7e6061efc2e7ca1d3579b4868f0460000000000000000000000000000000003a57315175d70880b2b53c67d61831ab066b08d7ac68637364ab1c1f3efad96d42a3cf5189c45012c1f73a1b97bdb4c1deebc727d98bdec47b5a1fc48916dca1e42345ff5474a5fd6cab0ae99e9f10800000000000000000000000000000000180648e5d0bf727101417f515cb9578bdde3e9f6c4176d516454ea7c32c1712610cc8bbed303bd1afd48f580ec11b77c000000000000000000000000000000000d6ffa9b85d69b67abb77f5c8bd776eae82d1cb055d2dcdea31ac66b1825014ec7f7a2aea320ef9f6897c9aac8c0706900000000000000000000000000000000073214fedbade28cc60ecfa4e1fe2fbc05f3d71528aca315312d50214f680956bb9e0fc12783843b00b3f4f0f52efe2700000000000000000000000000000000128f87e7da7b53f28944aeb26ef0f6c99d84038af51a1d242501ec84b5a6a8593ef1a0f6b523478d9fa12e36c2fdbe694b964d74259c216c1eccd7f2b52ffa5fcf151d47bd69bd2768e6466b32eb4fe50000000000000000000000000000000001443980d7450af1e19949fb328776cb7238a9b26240cddc565aa9d52c5592083b1533e8103dc07eac80e4bd830f209f000000000000000000000000000000000afdbea7f1cec534c03d3269d50017372f7ccbcba9f096fdb2754af4d6b4956decbab2b0afb69f97a03beeb20b4ccc31000000000000000000000000000000000a83dfa3197dc65097601457a97d0df7710e001e90657b150e289515609f13997b454167a7589ef218893309460139f300000000000000000000000000000000029c362244510c342358130f877de947acad5a379295f3149d5c713274316e06a169501f889e4b9cbf86f10b9521c1bb124ceb1dbc8004a4b1f8b422d394b0480bca7c0f38aafd8f06ba090a98a1d3c60000000000000000000000000000000010a83f13a185c70ca3f724dd84efcfa3ec463d7c05360056f8b5304864b20025b0a82c9d542ba08b645e2334f176472d000000000000000000000000000000000848a6a18bcf64d083e118190805d68f7ffea8b5a66e0807b9cd3733d31ffa5cc25dbfa6ada604646dcd8dfa622e08a30000000000000000000000000000000009962205c0ba43e5101fc3d5353f429a57a97bcb84baa0942a7e7facdfb0d032b9307aed8bd2ac9094a2e5b1460db7140000000000000000000000000000000019b1012661a10d31a4a73d0cb31f7eec0e7be729a42baf560c1e90a9124fe8d5fe31ecbb6d4954dba7d943a7af773eaa5a2bf15b2ed08b33056a0733c920741f86730dcda9c06aa0e3c135a844cef916000000000000000000000000000000000e7f02c1d2ceae60f314f51374b338c329f2eaa82553c3fc1643c7f1910ca24e277f3d658f552a47f780d4d9e0ac5e030000000000000000000000000000000014b6b56afc4afed5199191ec13dbeedd797f14ed493c25658a9658f031ac8d43de12e6a8c4b1671c9e5ef78da1a55e2600000000000000000000000000000000194d8a50618ff55ba3fa5602d41cbbeadc01a348ad1484c5e9aee5fb7241fcd9018f436e3c6c6dc64beaa241513a6c8300000000000000000000000000000000052681eac4bd59e160b67ebb27582a6d3ad5286d652787a0e160026607acfbfc5b9f38b9b171375079d052cb242b87fe8c3c919f31d72ab414f91938089430bbbeaa53ad7a73224fd3f204b80fa1ab87000000000000000000000000000000000d96ce83d917204e674ad9f5e5728651f5f23df25236b0fe769be48adf482ed8c36ad9c9abb6efa3719bd35324bd700800000000000000000000000000000000107f55ab0e5b60dbcc0632c345a9e93818014d7657b264031709275744e1c6722ec63aa209e655878a57704ca6cb3bc10000000000000000000000000000000018d97fba324431fa28b8845d94f62fc9eacc0253134b923908f06889d375405b51610ac21a75bdfb27e3533dd4debc22000000000000000000000000000000001667856804a5471238ffd64bf3bf266ce3a2351ebc68265674bc86ce6faa8dd50a3dfa00c647fb4265951b3a9607ab99f749063165c6db0eb038cb9f1a573de25bf377e1fee94f31df5987f7b2450aff000000000000000000000000000000000fde2fd0349e7a47a9b6858014d551aea569ef9802629bd9520e303ef0487c9d2d399682ac16ce6fa03adb6f4b478fa5000000000000000000000000000000001858ae58920dd0abd8ad94d2f9f946c53e050fe89c61f62fccad37e17f8723a4fbecb6b1be1e3cb853f045d0dca8e53e00000000000000000000000000000000093615a7f9d12e92c90706a47abe9620c4db41e95e42e478949745d6b73e021422e40b969e9e34263778c8a4d4907445000000000000000000000000000000001006ae7963b1e1c4d8c2c85175aca958758fb380019825b09ca3f728b5356254ae4fc670aa29812320b921b48a069df622d292cbcb836843acdd5a3fb404024174cd5c1cef632d1b9b6a73f2c5f705a3000000000000000000000000000000000ac407b75ea77789748e7607b5d6edb1d891875aeef2802715ddc393818fc8cbe82cde9f96377e3ac60107ddcda7e6610000000000000000000000000000000006e63e49356c38b816736d1d7c360ceaaba875c53c98ec68cb825962531855dc6410a125b914b0ad99f6f4327f5450890000000000000000000000000000000018ffb4ac95b8ffde112c8bdbf07a1c97b1d30a42dd4a97c82617698617ceb169e8702437ff6082a2ae387b462cd86256000000000000000000000000000000000497c4b3788c4d6c9b4cd8b3d3569ac4b4332b2f76c5f03f112e089bb79d33152b2469f7ad3eadb8b954775aab73f47de816dd1bfe025685f2eff0856f9c162d73a58fdeae0dfbeb5ce076e9f9ec1a700000000000000000000000000000000003e16f2f5a2fe15fa02b6217aed7dc688dd2670c09c02791cafeccfceb7d99ce826bccf213f6a7c6064687519f9283de00000000000000000000000000000000095e6638ac74815dc451b3ec85a6a8cc18643b541e8be99052ff6dad39c971f2e8bee976ab2ed5e1cdacf92816249ded000000000000000000000000000000000f2703c08b1d707fb6de215de80b53ffbf2ac48f3dd059d2a952b1031189248fad27beec5c8591ac93625a08e3420f0200000000000000000000000000000000024ae36412ba6f2fdeb0777b892f1ed7bab0527879d93f7b71b62f437f5c1ad1f04a5a7380ae5990a455f11870c7208304f117d41a011d36f55d0cb53d4f98de3b1a6cb55dc8a76b29d393bc21826ea0000000000000000000000000000000000f7ab1908c6d4b152835f950b604b55fdda7eb55c6b90c05e98626ba7cd014683bd3e219fd0d5983e9dcfaaa5d389e560000000000000000000000000000000010b285c2884dbdd540d6dfeca704e00839337f12d2267f6a3fc731fa0f724cde19e268782b4b9c2e11ec3aef9a72a6ed0000000000000000000000000000000014a40cc55570e8f45369bd9dc622e05f03989bce6a98a0d87f4fa7add67eee3e2ad9a297615dde05e64203e86153ec230000000000000000000000000000000007f2b6a092adc595e4857e821579801301396321d4a20bccb3296a031d74a62bd79ea4ea094d2e545943138d2fc930fb6b6f5ee0549b28a1bb317cb020ae0e031dbc381075772ff582718fa49db486d200000000000000000000000000000000108834a685455dc0be10aaf54607a06100673140b012ef23a16d3df204a81dd8505d62ca3e0278a2581abc59e0fbc421000000000000000000000000000000000bca7130de9896e8d6858022f24308af7ca66fb4c91f38b30f717c5491996ef4cdb01f4d38a730f9ba9ca5af5ad1de7700000000000000000000000000000000007d60ded107a06114afaf741dc8826f9e14bac6014eba26089c4e31a73b0f30c4b6e22533ac0db7e73621cecf753590000000000000000000000000000000000b538213a703f7a0bbcffb4aa8ce25ba2a538bf599d3c0251f5e8acddfd596c9912d4cf9a1bd8d3ec070713328ca992205edf9812adf95c9844b2da06f75d96e742c0620d1cb0d47dfd9b68d0bb76128000000000000000000000000000000000cdf0b9bc829cd8537918d665e5bf344d309678d01ee80c71a6d6efb45ee8a7beca35bb5ee046e0a3fac76e1771520ff00000000000000000000000000000000014e5be9dca2f8ee4da18e5ec9c4caa891dd78acc47f553af584308c72988435b85ad21b14abf8421bdb9e25164d568f000000000000000000000000000000000accdde22a1c479e47a17b8da6f1d2b7f780ac278c68a68090e5402977d897bd734f5af8164118d613f480c1f65e5d8e00000000000000000000000000000000029614458afdf6b572bea02a0af987d178c43650ca1c80a297b1d31e259aabd3e2a2c8e4b2c044466924dd6e5e3483e6f64a71e4e7652860038df67c99d97b1e5a063370e65217531253419bf2e6365b0000000000000000000000000000000004e45cc43d4d10ed878e18df156062c799a687b8e6beedad9fa6f66ad855cd053af6918e234ff9a43561da7e67f3dee10000000000000000000000000000000009c9ae47a76c199c93c38e7213c8d6c030cfca709714c703839b9ae9b65207e83486f9c8c16373e2b37756f3fd4355fd0000000000000000000000000000000001594ce9c2e229491b22317452938115747515ce62a0d49f4dd12667f5b3e7b541b3775c9b1363cc185a539b9f7596330000000000000000000000000000000016bf68e05e32168c69ad67331d7bc88a6d130fe8aed3e42eddfeb1d92add266eb69487b246a3ca961ea6ac0a35f8da78059bebd962501b8381b67c22055ba01667d916932713d7ca427cd80d8f76b41900000000000000000000000000000000080d165c57354f87008eb97610d4a596f180e48ed3190779591a0f7e07278f8d2fa6cd21d1b10e6347f11bd9731fdfed0000000000000000000000000000000008d5a1e66ec76743ca366be80fd1cbd5efc9112dbcfa84ce6c44e8df03140ca5f07d4bafc6c6ce5f2f190ede55fe8718000000000000000000000000000000000d0e1d2e5ef384a4fb314fdce54ab7895f895b3bc669acffd48e92c6320024d4f371f42071fceea550c8cf68615b00960000000000000000000000000000000010beae4ffbb68cf6e5d0683dc0629411ee14563f84788d50b1c8755b0b06092cc0f0ef7b55a39d51945b5178e374f8e047b3448b9b404e184f7ff20466aef3dbd4e08375673ca31fdb303c88243fface00000000000000000000000000000000161486d422462460923bd98834f0cc270982087697747fe40eb9153a7923d48eda191e4e7a75964f18f1df9365901a360000000000000000000000000000000017ab168a4ec81c8db4a74d529670fe6332b3870004f696f3a143cd1a62abd747d94afac9485e5dc19b0f4262dd379c990000000000000000000000000000000001e9cc85f03039ea53253f0fa2420012171fe39ed8696ddfbed57b80b73476171e59631388d75fe43aafde52aa14a64100000000000000000000000000000000109a5d5449002f4bdca44c0bd141175d5ca1cee449302f0314fcb5f282f022a7a3cef77f4e9fb515107e797726ff51d767d9d30b38b252a0661c12dc69127ac380f3f756144801633e99bc2ffa2f463c", + "Expected": "000000000000000000000000000000000aaa5de171664fcb45439b17a024806ff7e07d02294e0592ca74752a5b66f3365d1b49d6893b3bac3b8b0d10d026e48d000000000000000000000000000000000418354ce1820ecf848321a07ce22117303e5a15169a9cbfd141fb4797de8871d84d577e86270a9cbfe31c088ceed0250000000000000000000000000000000016884caa03ea641e0660a790975d77c5bb03568f873800d0559b69e3e0afcc10ddf031bb5c25c46f136f0791bbd3cc8f0000000000000000000000000000000002bdf659df76cbaaec030448e8f4bbd6b424037a8dfd7c4b8ccaa2224b0852c168f49c6f45c04f23abc85b8df21953ce", + "Name": "matter_g2_multiexp_89", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000062bad6816308f1c8c6941980caf71929a4006083dd29827902ffc92ebd9b14f1ef662f3a0125b1e74dabd039f9106400000000000000000000000000000000118e4ae76e2c321a5b89eb19b58f58f44e80dcbc7bd6d619579da40e1156aab32fe81df8eeb1bd047f96d65aed8b3b6a000000000000000000000000000000000c8c93e1beeb4efe52a96e5d5612338721e3e487c13c18b02475f9ccd8fafc2c95101aed291951f2031bee5216dba26f0000000000000000000000000000000016fba44e9aa39a12ae27e3c36de1f14e3f37ffb0ceaf5fed2a0d9815eab02c5aae91b254812a8f3a2e3654cec01a341caaea75e63204e177d404898aa51555767f813c3f3ed283405ed1ee829b04c85c0000000000000000000000000000000013716488daf8586719c52fcec80d35f17d4c595b66c7f2138244f3c8cea69b819778bfb50e49ca1d092e57c51674fca00000000000000000000000000000000019cee25c4731bf48602ceab23b5fc4f764993443e3622107b4c33b29c23d1b5916380431b7ecd94a0ce99811fe6dadba000000000000000000000000000000000562b28b245b7c1ee531a320fa0f4e12d7c171c7e3932ffda6cfebb123fa7f5993e5ed5e7b7d295405e5031b339994bf00000000000000000000000000000000180c4a8158a26d34123c870bc694382352a8e4de712b650d3e45e6baa16d6950ec15d3a4e032c1d1ae8fea18faa6f3d8db48a90ddcd791e6a9debfabcb1c71c88e7ad98f9e739ee752b381b28d7656f20000000000000000000000000000000008472d40e0505d6b8b92500e8e9711112048611fcdcca2377481ae86a7f6da1571f179183301e2194a42dac3873a3ba5000000000000000000000000000000000e2c5b61c050a8a12298f76b5f15383e72b90b001fa26889b67a24bb374b63c1e00979b05450e44ed63e72042af6d46e000000000000000000000000000000000e8723eace9c7a72b3e6097afc9bcadde61462e2ee03fcd5ad1b1c0dcf39f437f80530c2a1c5e6ecdaac14e8715f02e30000000000000000000000000000000002e21e0f451d035a5257fb09e9ed17b27f0994e6d85ddaf8d33153628adb194c97db17656351c029be4d3125bd29dc22ad1795823d3834496b0a1c2c07431f9d76071db77834005fa1228393ad4ce3f40000000000000000000000000000000000dce49634595869d7858e95a301bcff8112eb73dca8a22042137456d6d4887998a541489ff09f8e006176e6beee4e300000000000000000000000000000000010835f7336dc49e62706da4ef21d8e3173629b16742c317c1b397d4f17ced40a56520ea63557d7ac7f251568f4eb3a220000000000000000000000000000000017446ebe659a4510a362ee3b406b636bea8f381503e51ac21031c7cc92acd23046d62c2f32cda01b680c0f107142ae7d0000000000000000000000000000000006ef82deabd8983ebe4255d8e06f4a1b3585c057b2a1ca3c3e1cf04b582b65792e9980e3a1735a8ad58b053b16ca03d036d56e38fe63e573b02203be04ef9e1a044e1754eb2db50c6f9804abc4a40f46000000000000000000000000000000000cd8e7422ee179a0499178c3848cc4fbc87fc25c8c882f036a03cd9d3f273f7f2bf71bd3c9cf5e30c42b1ee6e90b36fb0000000000000000000000000000000005005a471d77a35e922b6d6a45b13a90947c2b31d8e7a2e4b6388265b039ce23ed958495dbf904186bef60fd547b941c0000000000000000000000000000000006c337380065eb8a5f63cb20fc61a9eec4ccf0e23c4e0f231a5bc4d765271b9c5697bbde692b4828ae22ea12423ad932000000000000000000000000000000000f7a0080cbe72a6e6473f66ed729f58683a80815a1748e52f7b67a6bf2846b7df8e7dd8599f87fe63706e9823bfe00d21a6b36f4674ab19202037d59fd8e14369e5d3d71acc3c76985b813d81ca6e24a000000000000000000000000000000000c94834474ac91547546d7d179b2091e33c8812c1b582ff186e69b63011177283a74b549aa342a7f3882ee82ad8ecc03000000000000000000000000000000000d72c4308e9ae695acedb9413445bf6a40d59ca78bd4f74ddbc1bcd8508cfb521bfcca99c98dad8022d3d1ccdd98bca9000000000000000000000000000000001487d006830d00d84a567c5d031019035443fae4791a05253f91249b32a4b3e7b3ce7eae885b8caeaea411a90b3445e0000000000000000000000000000000000d94f17aa100503f605732a48e4f55c394a8df1421a3d7c78bc85f4cb7a53744eadcf76e1620fc54204b123d6071cd3bad85286877fa7e5a9a61dba9df5ce35083beca7c2f5ecad13d226fa32b9720e900000000000000000000000000000000101cfa8d9c7522277f2bb4bae6c09e8b93a876c749c91c61784feeb105be61c2479375abdaa81deafc2fe754ed6cd9da00000000000000000000000000000000089ebbdd489ff670a70218f5aaca78d4e7ade483c7f20de4a84d39217be8f560fbf7bbe36f3f8b8361ba16d17ce609d200000000000000000000000000000000094f094372b2315fabc219099200e7b9e2f3a2f6fef2ede6f83c82f44792da03aaad06b8cd06dc3f140746bee2a45706000000000000000000000000000000000cde6cf9a3a7018b2b1c0c26b5850820080c7e4b56e615d577a78565431c93de78348d2851d5ad9f120ddaa9ff3da31b8fa5387c5712832b52c9c72e10c6f69e9c1c5b278aa379140e75e404c4f50a2c00000000000000000000000000000000059bb8e5dc5f0cd31cf674ea78b80b67b8a8a753e51284a2ab37d3f29459250d904e70ed00481b73556970a7f5424e5900000000000000000000000000000000043c6a53c413bfa2f4bb14ef296afd97ce801a37fe63d11a842f8d66160794c1a651d70f4c836af2c73cb1bc58c706460000000000000000000000000000000003e7b67da1513656f7b08fc5a77682477349ac57e53687c82b6d98772b5f929a2b06b0c7e14481d522aa94fa3a6e1cde00000000000000000000000000000000109e07928216eaea36fbb20a38711e73fdc26e18a6967b54f308b10116a5c8af0c8411406ef6ab1050b61c23bb746b0a3023298162ebe7f4ae6aee45a8a6ba602c3942a8bd6b35636fc6b85596a582e000000000000000000000000000000000166f26d3d26cd48e498578900a8c830ce9b80f162c4b430749651b945d9f60ae6a26306ad7711a1f9d3428946074912d00000000000000000000000000000000165f1bc59c9c36d12754097ea83e9a63fb4ae5d1b93a1b9239a6f338cddf4a9b30415d58076852288c6a467ce9b6b9eb00000000000000000000000000000000198e73619cb93fa6a2bc700cd400519d11a7d3d6d945ffac9754a6faf37da8596b49b7a3a4f2cd899ec9c84f1e79b7ed000000000000000000000000000000000a4740820d60034d37bb85e3e622783852779d36d6e61f81a7eabcd094993dd7d81900277550bb4299d550d2805466aa8ff2430d2f82c6d5e7424836ecea15af0ba2d0bd6498e65c65b6cd281a7b8f28000000000000000000000000000000001714857b0ee07b94ea928ff57aae9fe003c0c85d8564456955d14fc8d4ae14a7c9bc303983af3e2999c6db2d000ea51d0000000000000000000000000000000016512cb60aa372cf5098ad514291d8168ed31bd755861dbd9ef020252c01379d343a9c058839cdec8d14f2fb9da0db80000000000000000000000000000000000af74d8ac711b6590e7041e80ca40dd4db659e42b950bdd68c56d676de654c1a47867bfe6483dfe1971eb7c1d1a70bd10000000000000000000000000000000019e56ca1ef3fffa9e131fc5bc93100577b062cf9b2acd234c79e5e54aa799a389f30002b4bd683edec5fb100f1800d66415eea22058493dbf6ac248fd2ad8b4734ebe33761f2177089a3feda396001c00000000000000000000000000000000019d1d1e1e2dd4ab86df81a8246c902a573d1fd1598050663342e411a1d1b3c8849473c689afcc8e0ce5e51a9dc9c3b6200000000000000000000000000000000190d7c923bdd6336fe3e0509563b2eb6067354d8807f66e6052e97d5997464b9f07f29f3022f78779a5c4ac155a703ce00000000000000000000000000000000128591bb699c18a7b9e6e4e894654853f6a68233dfe8c744b42e057711b8d0efb3a98bab6aaa40ae7675d9200a8427d600000000000000000000000000000000045e0560e0936b16d1e055d3d3f4e0fb42d129546abddebeb78e871d1442f4796d939929d354b0326b95e50fd5208fa9ff79e3ef5d32a751b713180be37d44ae55c59c5a8121c132c5098ff972d8a97400000000000000000000000000000000092373dfd7d4375d6bcffa415e5b36a31499e881a80be32400105a6d56b34d64f4fed09f12640a43289a710f034b71e6000000000000000000000000000000000fa75d6510b3b58a32635a7a6cb4b9255aa7af46905cafc893f29b7866e12565765bcde498dbe87df3d1dd53ab5628320000000000000000000000000000000010dfd3456cb6a8bc853b390380a13f045ab43abd289fd05e7f98839477dea1fb1fbe38ca4f5bdd6691446ac0219e453000000000000000000000000000000000112567397f3fda84db6042817a99aeccd0c46a11fd3ba44e2600deafaaab7014dba98cdcadf81b97272fb7f275ee8a4e039bc7274a3ab172285d853d368da0950203a48ef61b3c7564644762279c1ff30000000000000000000000000000000007b397f093e69874d2bd3592489d93c80d0191b157e71d08a6ebe73063f77e7c5e084a24b34da2aa6354b1815a694185000000000000000000000000000000000fcede3a39dd5f905d072dafdb6f56d85726f6f362f91f079fcd47a8c1d3bdcf199d64edf17e3db1dfc96a3e59f69bfe0000000000000000000000000000000010cfa13c84e750d8af8bbb88bd6d16adf3bc7b532447c2e6accb359a5576be08c1b25f336047fb8e01a4d7f9080d0392000000000000000000000000000000000ca0e88b5c2035bcd3a65e8bf1aa219cf428b6f80617040ae02a0ed41559804844df373ac61a85899bec83e5a6243ed42c47d0b1fd24c1c66a3cb0deb7d51ea19f0fc492f637ed5d4d03e102cbdd055500000000000000000000000000000000021f3b793680e0e3127fa53034e9fcf286f5279cd167ac1e8ba051c440aa265ec6d28fcc2f6d3bad126180efd4503fe900000000000000000000000000000000182b429f27996ee070ed27e7015bd70191b814bd02ca6558a9be81d6898161aa525197c1672ae75da92729f2fae9fa3c000000000000000000000000000000000a20b3922e07da4ef6696de85754eabf1f58f7f5d37accb6cde4f62066e789bc64bc8ad6ac827b8c955acc858b03d053000000000000000000000000000000000814faebd3b60fa1a8fb86b3cb57d36b9c85d4b28e97a2251e6bc1fed1ccb18f17664321f38f3723cf8b09a2161c6aeaab4aca860ae4bc20d33808533c9a70108b153bc4b2256003ad4bbc11dc92898500000000000000000000000000000000159f9d329f929a65e41c7a0d4c05e11db61ca7d6d82f8b92a780bac66568694656f4c845a730861fde9a313fa49bdf0e000000000000000000000000000000000d556bdc8dc959b00f74209dff27023c5521d387a40bf20ae2a98f3f55318eddd347bf1e9d856f43a4b5fcd26c3567ad0000000000000000000000000000000009b4b0cedf477ef1e0f99627bdd7a7afeb9e29afbac553a516fab479913b23a9be5e0b38994215a9e23849bb664201ee0000000000000000000000000000000010899f4dc55ac5d1f56a7b8d55ce7f6a5e0a8647bf1ef6e9050f00c5fcac9f679f138018b9aa611be73d3bdc0af2056e297500a2747f9a68b2d8d9ca5b0390369d919897c53d422cb76c5a283c38669e000000000000000000000000000000000226c8a6b27437972ce29c2ed7e5cca4b6691e3a5dbbe713b5d309ff2f4cbb95e8f1571314444d65ff5fbc3281f9354f000000000000000000000000000000000282a49d0c560d873676967700c1062013a2d4beee96a09af7e14436fda4e3d2a32ab8ee4e591decec39a811ddff130400000000000000000000000000000000167bfe499f1f4609e67134e12ad91aadc37bdabd0055ecf7f96162c39a02a86e62a7b3d39f514f63edd82d04beb1958a00000000000000000000000000000000191673ea5470e4704e361f5ead1c56371d6aee3035d92d9e1b96fd119c4f877cde6451411e441fb45aa9fcb90fe4c66ba87ca4cf226c212c80f3db5e4e781ad7391fb73b1124d01cf893169d1c50ca99", + "Expected": "000000000000000000000000000000001488532d83fddf0bfd69b32f965790b3fe4cd9f64e8d17e78189c346518c91e69db2f0b742cdd5804b3db3777dd931230000000000000000000000000000000016205c470c6371d73b012a14d519bf214ff10de458605097da1b798977bd938727c5be19a10f4f492f301d2ab6c38ed000000000000000000000000000000000142cc08f61d3c9bd4c7bfd0b7a0b8693af6120898fcaff49a7fb5abdaf1d15bf70eb033d6ff09a75995547e6856c595f00000000000000000000000000000000164b2807e19135ca3b66bac9aceb371165c930ae063f3cb5a06efb8985a1e0c39023d8f01df517713796083e8c2cceb7", + "Name": "matter_g2_multiexp_90", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000023bec14deefcc20a90e439bc16912e90191dc7142234b1870e4e8d70c56f695d5cd30a68930ff9b007bdcae8ca90d870000000000000000000000000000000000053a6e226f3bd82150e08ec3690f36616d5ab745b36a9990baac7ad3429a41bc60c7f7000ceda4cc9298b10043639e000000000000000000000000000000000b81b331589ac332093928faa60d6819d3b5559d32d37d2cc13c78aafa1cc34e32d317695c1c4b4979baa1865ced90150000000000000000000000000000000010dbac5e52f9a046ab88aa36b3c5f6952720e174bf8f1732e886e66e5803aab63642185aa24ea08c991edaf8375bcadd9abfe7e05e8a210604355a77f64386a01323407d9f25397769cc6dd141bc6643000000000000000000000000000000001875ef3f90df03d49ce6cede2c791b4d8503b75acff2dcb1c7c88026394dfe11481da72de4ff58ee9a98e75577b6398c000000000000000000000000000000000c8ee603d1404e64ea3ff08c70b3dbffd318736ae95f9a96ca07ddaa449818e6c5a17b2970f572f53c90be893e5c323b000000000000000000000000000000000f31af63c68481f527092b261d29d5c2daa95873b68899c28ac7753d95a64f455ebabedfe6e72246e494cc5fa2a9bd040000000000000000000000000000000009fd06bc51d4dc51de9fad6d1eb763809cdb5ccdba8e0427859d878904bdf295983b318f311856728078e7cbbecb0c5b64be08e7c2fd15ac0116ca941b85615c6deb38fe85e2c0fd22997e394b8a67690000000000000000000000000000000003ce75ecf6b605ce73f4e215b1aad4799f91e624daf0deae3a273968490bdbdbd0250686ee91a1c24c2e2f2b6024fa49000000000000000000000000000000000e4d9b65d71b7593310fb5145677d170663c0ca29636f7b7c50ec1988bd2d2f1c41d542d4cd8fa23fad94bd6a84aef5b000000000000000000000000000000000fa4accea53a6362651f6c6ad2a68d20b5f549f8eb961718e0c14cd05249a121e442a6a588eafc83d6a43d8baa66882400000000000000000000000000000000121e325406767852620ddc45677495fe3e0851fd3c70922896a3e92033347d2fe8d07f4db8f26b8127ec39d619d596030c391dff1c0c303c77b2a1fff24f50250dc793338f7d7f8f1d54bf7d87ab37da0000000000000000000000000000000003a0ac3ac37932b71672b9c48bdbd368d64c11f57ccb952f633bcd10ec19134c65fb2cbad655d773a90cbec2d9232b3b0000000000000000000000000000000007553c470bd8f38a48490dadea29df81ad901ecaaf1eab35b1f497bb58acce77b883e03e78702930dda72e2277139a2b00000000000000000000000000000000044973913824b3326b72e62ccbabd8c9f1b5dc81b423d0dca37b6f33972d993a681c326730717036bc6f0286da9177430000000000000000000000000000000017b0407d2864cfb39dbb0a5fa8deb4ed4a690a4042153e829f51c56bd0f2953a440d8305a318e6d6f67970d473753021a2d728e013e5fc3e1ca24c105a0c268cbb4f152a97e318f3aae33186ea6bc93a000000000000000000000000000000000b7478dda7053590ed013b7c23431a21626e748c3843e2332bde0bd3890ecea95b6104bac420a8be5f3dd9b075203616000000000000000000000000000000000e6dea641181cf796f62b196652f952ee2a26ba998cce1cfe9d65ae49198d10badffa561e2bd818eb2a7f350c122fa820000000000000000000000000000000003c79917ad5a9c7f046b34e5491ed015695aecb00760f3009dde4cfbf88ad1c03e44117fcb6cdbd5ecaa8df8760a3da100000000000000000000000000000000034e22ddbdeb9dea46c71ca2144ffcc8356c1a525c5ada69a6d5e5c1786aaaf0cf532e31a2f78371e04a72e8222ed4c7e8da0c8da19dc441f53c54551579fec5d820ce2e3599824b24b7c5bf1847c5890000000000000000000000000000000017964112272360a38d3bddf89da922ab50be076bf71a094fc8afde109d3817cc2db633e6408f5716b76d70e30ae00c0d0000000000000000000000000000000009bed28bbf43846ab97b92aab9ce094b077bbc59db648dbb469f21842058ef20318a1a8c18045b3de555bd8c76132ff0000000000000000000000000000000001297110789c7aecb0fec577f6f4a4de14608d9aa26a8de68289adea7f6b53b766b840d315152ea346f8c10b2d2729e730000000000000000000000000000000002b551c6a7846b96c6895e55ec435397af70eb435dc1c562ac71a44c36936c2c6d3e6a1e3545513516513391aedaf9ca76e90965adfc2fe52e4341895e6b6154fd7a097e052b59e4935c8267a6f0e63800000000000000000000000000000000003d463ee4d177d78849fdecba52b7e83ca90d54177ed39e82b4e80c17994a6a2bfd9c46edc0ddb256f8955428f30eca0000000000000000000000000000000011dd976dfeb8ecb7d7f5cd10c235131709fb16d8a827e83d7084266c2504cd1f5276ae3333bc7fbb4ebab48c0d97a9930000000000000000000000000000000005fd19477fffc246f5991603b48085d95256b273631bcfc16f19c6980a3ba01ac098061faa149b475bfce37d586464b800000000000000000000000000000000103ac3dd682aee109dd7fbf60b50c28cf7e37642f05b424773a06f6cfaf7e9fb01d5074ade97ef6cb0ace2e1fe07d54c7f3f352c7b7a9e2eb6c87edfc99e2df3148966760168f6abb13ee482f223a01d0000000000000000000000000000000003208ce7f51a96dee053cbaa66fbdb921c2c3b42ead78b39b4f1df7ab49f05cb88d0f4ac18de5839749416eba5535d4b0000000000000000000000000000000001ff7f9db52aaa0fddc8e96a67b99353b92d7032f59d200bf69da3b446d08435d2ddaeb93584d3b68a1934566187922b0000000000000000000000000000000005f05ccfa5704652cecfb42979c538823fb9d11a00222a963d00f1a4b9a040a0222dcf45baad40c6574d85e5617dbbea0000000000000000000000000000000018637b8c3ef111f6ad4538464c250d780e7f081802bdf720f4c925154f4667c5d50cdbc4dbb7d0b2747b97d2ba2280bfd35c4286f19a9fe8117e37132ce4ce76e28afee25ecca2f66de3cd5e1c83235f000000000000000000000000000000000eb400becfa5521b824a4288885fe46642c31576238e94f95e9b4bcbf62845ee9d9ee122f87d36fbe668f0e605fa2ce00000000000000000000000000000000003c8cbdeea0d09590e1719ddffa0a116723f0fe85585583f3f271ead66fbc2107873181915cc41eed3ec6e2c5669e9d3000000000000000000000000000000000e61c0768561517405952c6462f1c5df95be272251d8a7060624b62f9be310cef64436eb2c4c04e8352d7b75fea1756200000000000000000000000000000000036cd74a8efa8a1fce7587f07d5c2a6c4b7ef161b0faae037c9bbe63bd0c92b83e514c8c1bae4a5d9866c0889b1b914f3c2b40b7968a39fe8e4f24acc25b6c727887c3c44cc89cf62eb14a78ae47e8680000000000000000000000000000000013019d0fc8b93da2c79e473d713d94af33eaffda65a7a49d0cbae9f5259b8323e6f29b83da9608ba7d6ec004fb0710eb000000000000000000000000000000001505d30bf8f7c51994d896d91e8e2259782e2b49bda834015477f18c29e64da4d31f8b96edd080267b77a9539afca06a000000000000000000000000000000000eba929531615d9c0f59c4b33c1fc34b81e9c77cd8c6887099d850b3e39326d7caee1feeb101222f22bea1e9853d06ea0000000000000000000000000000000019d88f62cae047ddf2cefe497495f890d9ab8499e56f72488af65095e992427bf821f63555a67b0afb00d6fb441080a010325465403dbd4898beb740884cc325923ec3e1d7483540377d8bbd02c11382000000000000000000000000000000000b7c8f3d0c56b3b7d96c0a24fea3394551a186f87acbbbbce41d1313b23762945bae2e911725da4211614b456b508c0500000000000000000000000000000000125316f64bdd0c5bcd26a0e5bcfc3139045b3a44c8a8dd1cebbfaeb83b963c5a5abd4a5961465cff261c0e49189278d800000000000000000000000000000000095a327f488b901fe7dcc9f9ce6f4f25876bb09b053b64e9f4de9506a0fb95fc0cd443473c2cc5436750581d39b8e51f0000000000000000000000000000000015d406b31c791ae2d25ce462304c0bcf341686d7967c9dbb6734bc28b02123b1730d0a673fa8071dd90950d9411a2b3909545b90dbe35b0d5764bc72d45717e0c3aca6aa77c73178fa8a3ee9fec9cdb3000000000000000000000000000000000c7029af9422246d0a30784431d6bf9eca09481589438fe9a6d2fe1d5e526ec3d176a3d550204aadb85353d99bfe3ce50000000000000000000000000000000014a0dcb26c40693ad19a1edccda05055a27ca24544e933d01dfb964571071f94c94233f81e1ead0925d24e6d3df2c21500000000000000000000000000000000147a55ebd83c746128ba9c7ac57be125ca5c95f80f891e2c5893caa779484bdc1f9c3b3ccc4223b2343ba939251f7fdc00000000000000000000000000000000125622a040d8b157432ad81b8a83a9b1f0920b92680bbb65050b4862b89017b3bfaf81a3402ccb383265ba7200ce677feef0f8014102664a300ea9a30fdc7afeae3cc338fd45cd421a1bfea98e304c810000000000000000000000000000000013b394fd7a0f3d94e5fe4cf5cce3627d425ec848912395565b3e61ffe89e56be799c4779d3b9a0222ecc6538ca3346e40000000000000000000000000000000014ac1a87b333caed0f557fa5692d1138a8c1e92d1f9acdc9f357e2a46f27513dea42f367b046d389dc831610be4fbcf40000000000000000000000000000000011fa243a0aa8b0c01c7636387d60021afe6efc223b7deb69d030651c369643188b9dd5e08d6d031d71dd11eca1e825ac0000000000000000000000000000000015bf8fd7fe438407db7f1b0b586b2c285777c5b6dbef9e45b46cc0a50dc831f32a70e7d4316d4869bc769ff6de58ac30c8f1e08cdd72ed200253211e3b9947cb2a5fa24079b6920b4a4d3f1fd78146e80000000000000000000000000000000005ea57c269c9d43d3f17a83df04c95ea7e7bd85aad1dc2dd285ccdbd52bfe707a1d2476417e848ab119e62fea30520af000000000000000000000000000000000b99768ffbe95e315b244bf996cf34f8ac356664adda5aa7f4ff8d513b2eb5934b8ffe0fd9af94bc9b934e0a8bbd51ba0000000000000000000000000000000003b02c259df189370dd2700c5cccfc8b212a4b332a083adf9771503f5bd0c9ef040590320fe4a86c555a4ea87531268100000000000000000000000000000000003ebb1e610bd055d037a410cce3ae06aa654950aee0210ed0ee79f7a332be7342e308347d7b17a146a8b4c623029e08a7e25b1a60b6c6080ccf1bfdc37aabbc2bf92079d9356844f7f12867b3e2b2800000000000000000000000000000000015c4da691b5e6242af870e06b29bcde467b4644f01080eca60a28c7f941590192be30e6a4270a36dc8959b80235600aa00000000000000000000000000000000080f3d3d5c35ee24179f51ad854a37ac4ff867a2736a0e3e8f3312ac98c7016beea6ffe2bad1dd4842d6ec77995ff97600000000000000000000000000000000130c29dc633aaefc831b0bccb13fde1212fdce8cdd17beaaf1d06e74ef5b1b69bcc219c8d63f054690af1b6dc7c0d647000000000000000000000000000000000767290aaa1ed4c1dfa5603d976df0715b417599445ca577ded7d99e685118bbec71443fe1d9a65e0f23436353df152cdcb456eaad2b7c71ca32277206c1a1dbfa7e0e84950cbf14aadd455fb58e398a00000000000000000000000000000000133e997857f47f8d6278b8ad86f4692ba0dec9da336f2726704db593af368dda7aefc0b218ce1674f415e0d9e2dee5c60000000000000000000000000000000018db87da1272bd386f7d8b5245dc2de30e82739723b680dedd36f4ac4cf5042bcbada1e1bb307ba444431d73a4248f9c0000000000000000000000000000000006580be3e67c7a615408aaf9c95c0956678af0e2b1f536f1e69588193387f8a05b03d5e1060ca60c4fec9eaf3e72d39900000000000000000000000000000000050bd9879ef9eea147678f552cedacaee84562e6561b3b7338fa8f9d514099291c3f2a3723fdb22c88f1c9243d411ccba6e7b19245341fdfc5927cdae57f59de5f3fc8c37f8653e5aaca87db682034ce", + "Expected": "000000000000000000000000000000000d8f69d90c871c08ae09e7b3e62e36514fd056c41fb596fec2fc9ce8509ab4f6675d7e85aa6b4b3197f5ab781f6f2e490000000000000000000000000000000011c4bd3cd156c34065e408efcaa5e13ad23d114458b71c2a6345f4aaf82af76cd4362db7ba9ee7e1e92ce72e242f570a000000000000000000000000000000000712dbbf20e9b24d20511d01717a3783608386408a258c2261fcdad5fbcab36c6bd21473c3d93ef8518975256c65a945000000000000000000000000000000000d13747be82153aea8076fd7813ecd7f60a214c31e88e25b14dee5cdb9336599e40b136d9ae6deb85606d35406b2675d", + "Name": "matter_g2_multiexp_91", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000017da08f2faa32570d95b9efd2d2fe358faec1ffe304750dca1dc3a273be3427c70904d58864f76afa19b0fe33ab1535f0000000000000000000000000000000017de677b713202f23baecef2b0618da140af624e56b876f2d7a20cd437c3868ea00ff6cd9c8908c1ef323ad294edd9670000000000000000000000000000000011d50aad957c54868aed6d848b2e67094b129282cc2df56c41d6ffe976d02ee83a592c33370d3715588a074db503b3e8000000000000000000000000000000000b8aeb019d120959b21627c1dcfdfb67ade22a948fe433172994d4a34084ac9e1c11333a9c663c87acf50962e21c728e92898d9cbad829a5346c0925c15b585de18869adfe796e46cbd56828540571b70000000000000000000000000000000001312ebeee36fff8152324a3ed24c37eee50b3099619a33c7a6316470ae722548b4b9e0f0640453caf53f374dba504830000000000000000000000000000000005ea81d2e5d9edeb3ed6c200b75beb731c31ad666e6e37db72ffd0265378bffc2724047c7c0c6e3f1598345fd390e9270000000000000000000000000000000017617a836beb12e637c5bbadd4fbf1ca2f5cc3280814ff5cbb5890b31cf2d2faee9e3ea8134af97ad4feace50aa194140000000000000000000000000000000002606deb5d57dce5b3d2e5f7ccec3ad036992beae238673641ad6042479ec3cf83bcc0fd03b7dacb9b4bb6c181ea9cc8c193fe87634fb0bdaa1700466881b557c470a62464e8521be311a95dff65eca6000000000000000000000000000000001203ef36896bfad2a2841689a964328fe4ce3d83798671630d0c8876e67ceda03d99555aac46d984f1d3bc38ffc134c50000000000000000000000000000000013e7461c256c8ff9144b17f8cc2e270aa94b64be62588280baca2ae6b6efc4d32b3800eb84da62561e0e96d5f0387a3f0000000000000000000000000000000009454b6a810647350cf0b364eb1c2b719670af45bdba9d7d1a534e23d4e810c3ef4d9318532e46fd104a83bb10159a30000000000000000000000000000000001034546c4288f642daeccf5b56beed2ca2d946bb4391d056df9c6fd6771048903fa330ec16d59d05540cd715333c4bc73dd9c99a5aea019436e3c91030d03ebefbf6ea6ac69222f1870fadae32f55ae6000000000000000000000000000000000d7782404dc6721f52648fc6969db33a9aa209f8baf5faa9678437c76c9e1635fa6d22d94aedefc90112223bb81ce33f0000000000000000000000000000000001e442e548d3045d1589817d0b57dfcd66fc64ff978186f784bd576faf57607170d49364a72189328c9837c9a2d8b0a0000000000000000000000000000000000da2b207bb7720aeca2e6ea02b65076770b960d4b7a96ed941a7f409757b952031a472384298acc3948bdc485088501c00000000000000000000000000000000048f85bc05ed78c692138f27c3541ced11b6b0ec158b43d133c3450a905416682fbb8c83dea06a06d294c48289ddb829e74ab390c3f73c62eb1435226e9b4f9b921ea1918a61a614b9bdbe9eebd1cd790000000000000000000000000000000017134f787c920bc15cf2228a186dfa1d10194087f28b6dd8f03e1c86226928f0eb1c27020a5cc74d94b50c4b4e36b8020000000000000000000000000000000012fa1fdcbaa81c4cc1e37447cae51beb29e55bb19b91e2b575afa3754589ee0151cd9e83573edaaefd341f381d34f4f8000000000000000000000000000000000ecafd00cc87a773a13909512466ed11288c842716e1ca5c37a4d9a4cd7585136c86f32140fdf02e2997a6e19e3d76a200000000000000000000000000000000104cf007ea863dbd473d7dbab6f55e74062b18986e9bc09bcfdc9c23e4bff8683f73aa998a5cce59ded10499d18a0ecc4dee3e2bfae3820f611c30df232c1d9c6bf58d40b3530858c79f840720d78d72000000000000000000000000000000000ffffc98e55f4ba9a642c40678d625690464bea39d085dbc9c99b4c36ea8bff5154eae3c315e1dec29aa669840accf290000000000000000000000000000000000a3df9595167048c52b8170596d4127968194aef7fbaea4594a27c6af05c54bb772928a7749d74311038d1c115e91b2000000000000000000000000000000000b317a3abd808e94a7197e0d3b2515a147774f78d0cd7d36e1156da28a26e33bfa76d75c6e3ae346f9ace050c9911cc6000000000000000000000000000000000fb5fbcc2f74fc30ae7e32143f219db7dfe5db6ecb09cedad8f087b6df56bf9693c8b7d78aace064e7c31785f6869541795fc8e20dd30622876a94afce1c1a76e3b689d6848903c21103cfce6a8a95680000000000000000000000000000000011e4b907a72f34af899a6c4de211af5fbe0265e5bf24d406798de53ecea273d5df4f4953d13fd7c9dc3bb0f0c143e3e4000000000000000000000000000000001623de5e87b6e1ee920e1b7d979fb9c431c12abb47b93876f9ddfaf28a7b673c18be634f96b813f7e0574c55b628a8790000000000000000000000000000000018ba994b02dad759ee79301b42ea20d7545844c0ea4bff2f95dc9420194cc4196fff12cc09bc0cef03cb7ba868c273700000000000000000000000000000000004b3527c8d148bd9e6006bd298ff8d7fe320748dd3f6d23449e874fc0c2f58d933c1e038a74f60fb6032cce41a3dbf5725b49f325e76733eb3c1a2cee5467157b2ee80987abae43d2c4b93e5157f083800000000000000000000000000000000129641af11fa92056236ef135843b2189d46d870381261d5781a5fd6f2c5cc1861ebb2e801f19f3adf2216609a9e196f0000000000000000000000000000000007b4007c55e47f6bf3aa420ad75fd191ffe0fe824fd30c3f1961a8168922476fdb3869822704999b044feead470e3b8f00000000000000000000000000000000174209113e2d8c363b04f49487176dc6d9eb4ecc0b22daa7ecaa5548d038b3b7c23ebda4f1b6845425cee13493385302000000000000000000000000000000000a58c80a02b7f93db01d2f8e0005839625e6c4f121f3d69115f435526a7f7cb53177caab4db86273bc2d2f0474235f31df49b30dd6aff459f64906eb1a9c9b2067d4f1b75057874b2fee17923bcb906e000000000000000000000000000000001738a03b46a8ca3f3d1f4f4447497c59f114005400f06813b24ff462ebc6f27c1c3c788b5f83f65958cadb34fddd08f40000000000000000000000000000000004dcfff2bc9ca0282016f38df484655cce7b872b1ff047351ae6b903e05f457d7fefae93104f9dfb549980394dfad2760000000000000000000000000000000017cd89434225dba07be137a73892faf0258b3fb19e6c8cec412fcda912c0613f2a925ad50ae485187020a371ff2dbc59000000000000000000000000000000000f1f9f87d3401e7b3b59331a89d9535adc973f869b81bfd8892a37117d8597ebab2800c966e623469792f4ae2a8eb232959e0a33b1fa12e0ba960761b09921b81746b8df23e808a8de09e7f5cbe2bf41000000000000000000000000000000000bdcb1d2a782541ff7884dde4167ba060fbd4b117944ae69aa2ff685b9bd7d475f45adce0c9f92695b4f4ecdd48cb9b50000000000000000000000000000000012a55432678043888bb9e7e47efb17700b3e702e389d0f58dd454224a02da3f190b2fef4c9d3e2074c7bef813fb56fb0000000000000000000000000000000000efa51ba64f1e7a1a269dc083179a222afac916778a967098582f55a41394bff3747f8d024261959f6d399f44a40d0fe000000000000000000000000000000000845dd0974c5789a85c3cb09ea441f2c433f0606928ee1b177eb851530d6e6b620b4fdcaffb8f75623435dff99b3ad9526ca68383528f6a871c237ae5214b49c18c4f3e2f3ef5dfba39e69eb181143d700000000000000000000000000000000180beba92bdb95c7803fca0407e29929ee64e03d61cad96ea0e6c469c5a888cc5ca5eb20983b3418a8da6596a5f1b2ba000000000000000000000000000000001322f7356eb3069fe20063f4be22c44426162dc8fc117e4e382bc4e33bdf3d971ef662fffc1d58ce187c33a43a4c853e000000000000000000000000000000001601a0aadaba846f11ba5c9f48e13bda1007ffdc1b8bbc9e85e83e569e9ee17a1e9e780a50ce617e6c780b8155675f2100000000000000000000000000000000105b2c213aa43ead42d9cfdf1d6c0559c25b4b86af43d4493bd75b76986d0d4f1d9b3bf9e3922b5c08a37a1629cab7d8f1f95a9d1d4e8e7d0f17a954177253709d988c3a77c77d35b8bf70294bb358c20000000000000000000000000000000017bc70346765b7160a0a5e556805c7944304acbecde06cadba474c51f05f22445c3d943674cc8215f973cdf11b9ea2e9000000000000000000000000000000000bfdbe202619a1d95359941c249b25462d3ecf09fabb878943a8a37cb9eb94abd7e6399f8d82f90ffcf904f4466cc5b1000000000000000000000000000000000f048db8530a288fef10a5ef9bb3cdd9f3d3b0ef4824609efad96bdf52d7c3b10ef628fa04f8b6513485e55f653f4b990000000000000000000000000000000004ec35f59287eadb1738bb50b0e2ad9d280bedfdb0a201e72594bfc4322ade0b7ffd6b532ebc7796cfc71f88a194bef4b481f986998d863c98e55a7661136a8f19d7d4c57f6036cd642ae16c82cdcfb30000000000000000000000000000000014424c77af7ace8ebf66f556cf219919712d96d24438466ad620221ce1ae9b2cd75b9c526e25df7fbf3c9250583757f500000000000000000000000000000000198aa00723781714152b3494b76ea3ee043b363b3fa81806cdf7e440b4cea907f226a3c038fb95c932710dc9aad4c9dd000000000000000000000000000000001360e4c775f6fa5e987231dce25ec67f61429ca9fd8160c3074383c30a8c0d7ff068b1d1215b2c0cc87129d9c9aecbc9000000000000000000000000000000001280ee6160800c4b0f82d5c2775238b4b223d8a0ac9a8f8013f138d554ba31c9fedb30e0eb5c330da17f5785b2717422ad872848d72367467094675a819f9aa6107183aa0c8685d5d84c27b3aaab33c1000000000000000000000000000000000f1f84251204d9f9328f79a45d15b311984df0715579633a82b5a9f680f6645cbe748b0fa64b9ce1e696e20a5645d6d300000000000000000000000000000000156901506e502a09917f76d825614824dfbc34d019ed53c2ec5395b51512da512b27541bc53331444eac2f618ffd5357000000000000000000000000000000000ea8736a97a33112bea9d07b729e973e3a942422f1d2b24c30e96637b535ccfc10cb5930bb59ed90bef604453df8772100000000000000000000000000000000187378477f60e3eaa225e89d8532bd95babd4a5c51729cca800d364b61575704992639dc5035138664e8e074ed0820033c2c60541fe17fa8e71d58184a055fa8b1dd0bfd16ac2baa912b4472c6056122000000000000000000000000000000000e5281c1c9210269a7f5ccd02cd5a7d3648b56d9ca6a4ee50beadf151c2601e0291fe7f1b89b694500e6c636d4e445c4000000000000000000000000000000000d5d5399f49697e46013558dfff544383b25f3b60681ba5fa2c5e6edfd3924267d0992abe65cbd5109ba8a1c6eadc7e30000000000000000000000000000000012a2104aa92871dd8e41ae1ae6dc18ceb7d0f361a5a4fc67936454b8866b8aec1602dd596459cccf6d9e1319ec3299d4000000000000000000000000000000000268795f6f9892f5b476c3a534673538647300203a51a8ff60b530094608b5fdf16297f02ab7ba41d6fe556885f064a4ff07c19ad4f10ab47e73b6698f9febf3f28087614759e082e6e717588c1caff7000000000000000000000000000000000a5585961328c52e0fefff16e66e3367e34339dac1a20cbc5e89b78804b8bc265e6e3fec1da6a62cd8a46be2f08a6d960000000000000000000000000000000016fbbd698784beec5a636332c0b20fdcb68fd3015cc6d18b541346a5e6af76613e6fcb14c888a2b8133c0f4132fc079300000000000000000000000000000000041805e0adf2a32153b89d1131226cf0ebd77cde3116a168e792ae8b88ba2edcb1fe7275658a384251b805d282ee039c00000000000000000000000000000000024213e4a8504cbae4875617b9b78473e7842ff72415ceacfaaf2e8b415f9f7e411989bada8101be72f9295dfbddfa3f240c881fdbfc414d3e85ead1cdf166ed6929d0b2ccbc35f0811473757b6b41af", + "Expected": "0000000000000000000000000000000003c4f051d528166f256d9356aa9cb885db5680c51990d9474a948848888fb82a9b86daa7a2273725ac8ec564ebbf15db00000000000000000000000000000000010a6c4c7067f511ca8f1b66bf9ffcbb275c7575540909262f7c4332c3d75b2f6d2f3ad2848c0d455410afb1cd60c835000000000000000000000000000000000ee5e582554b3930c5670d4e3542bf32e8b871849d7859eafc077bb2b533e936d462f614057f9fc09c4010afab501c1f0000000000000000000000000000000017fdbcaa065d301adb94a60dd20dbae71512d369fc82c556ea0dff66843be768be942e060752591c6eb0718985d8e313", + "Name": "matter_g2_multiexp_92", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001353960aff58d45691c5378a0676a8e837260f5819cbbac9cd75c8cc4c6f1e17b9dc9843eabc0b1dfb27ff7631e4e52d000000000000000000000000000000000d6279a43d3526c035e88b0b640b04d42ea573ed07323aaac1d9d5570a8be64782682892415ba2be5cbb13f56e3a44db000000000000000000000000000000001250fd14fd003f88eb6e0e80e9f2ebe204475fc6c06cd10fa45608a17b7039afe0326474ff80c357f86c2825cdf7a16d00000000000000000000000000000000186cd91cfc8ae625e302946f2b393ea67e1107c0bfe938f5f36d28879fa0c0780c847aac77d0310d43211152c1d5f5d314d5455ff1717bdd545f4daa37e145121e7bd9636d7a2b65633e5ca5a63f2d98000000000000000000000000000000000e55a98e8b1e59600e86cabb5e8db8ee622009b1618ff0df3e93fb55b80985bf2a8ed060aeaba53773274d4186934f75000000000000000000000000000000000bb7215fc43f465f51fc8265477fc8c79493966f040e02f0eacc4ebcb3414b84fd94ded822bd24dd5ad5720f12bb8313000000000000000000000000000000000b23328e15cda8a576ea352b5dd7ce382ec781deca6c23f646e42f0cf63e28669539579ea51e3c0afebbb58e1e8e3243000000000000000000000000000000001716019236169bdb4af7bf7d7ce0aeee7900b74023acbb16f6965c2abcf28917bf88d0f9d5bc26a81710496f7821fd4682cd8da62bd901355a60b37ca14ce65d427bcf9551203cae7c346a49b4fa8626000000000000000000000000000000001718a4d6f5e78524d8df23d2c589abf04e3567d2176539a30b9f73c6251de573caa60c2881f3da99c48d48e9aacd7402000000000000000000000000000000000ce0e35721379077e6eb3b572f7f7718bbf775b116521c14acbd3ff19549c75d50bf70ce84326cbc3f9e5e53605d8ecd0000000000000000000000000000000007cb3305ef0d2cd7de4dceaf25d2eff44d4f437e065f6b244bf1b0611c891626eafc4b759d55b45d76e94b85852df1de0000000000000000000000000000000011cb56d2ed32a46bd951836f8e0f92d3824a4cddf011eecf1e2d92d81bff407a04abdfcffd60ccecda6e9443b328d51eea2c7fc2050e9c1ebd05d15f197b4b1be61c6820c8d27ade57d85109d7f982490000000000000000000000000000000011ba705da23100f853882dd166d81ee1d7621550d156b14f7c2123e2681887ec3724626061db68b2c63987325b27d6230000000000000000000000000000000014271414fe078a80587269398afd127ce34c8dc2a4851f76613b81dc99d766d75c703949c1093b04d66a301a79d89bc30000000000000000000000000000000011b7935ff284b0f812b5da5b28ed338dc4c21ebbc7fee04db834732b11fd76092db0e8d80368255b0f1205129081e9af00000000000000000000000000000000104ff0ad2e3db08d3b4890b2e54f29e456e627cefc3a4f07c1109b764dae4142480e3e5312ada43fec9ba96ce587e8a4e3bf7e661d54796c71437354d7d3182770f10ab450827512a423d3dc82d5b43d000000000000000000000000000000000c60749ef36d63960022f3127d0ab4e12acf05ba1e1a136dec89be388b9d7144c1d78c04df658727763dbaa9725bd8b90000000000000000000000000000000019932b1c205a765bc9de0cc136999deb153222a9dd9e9ec3660fb6daef56242d08791d440888e69ca0da2bbe0fcb7d79000000000000000000000000000000001764790d12f5ff79ee4f2c9fadd5dfb1cf47db70b9e86018bbdbffd1be18df193c7dfa71533afa381053a77e02719c6400000000000000000000000000000000044b2b0211cbb407281ab2abc4725c2cd791b313bab8779954a2461ce445cdae60d4a9efad9f90f80e66b1438514e0f0d3a364e7b217dfd649d1e08f76393372d8768bb0fc85c79ef4652417ef1637fc00000000000000000000000000000000175cf9e7eead650e7ae4fd657bc288b6b6392773bf1bbea48e17172a5019637fbb2bc0a3d0d1e3b8054564935c908db200000000000000000000000000000000136da2a625cf72403d0861b9cd947cdad12b1f1e6cdefc4aab6756536425285a7953a1b892df40ec12ac3430fec889cd000000000000000000000000000000000c2d10c6d71cff4e1deba1984bfd17166571e64659ac91b64c343cdf587c29d52a2266c00a57c01feddb1df6439d21d1000000000000000000000000000000000384a782fb31278f49c840bb8f0552ac2734ef36bb3d115be7df20333aa747c92db990f7e879399235d122fdba0eed76eef7b05d5c725ed31269ae9c56dc7ae35048af39ab114319680d4af69be7e7c3000000000000000000000000000000000a9a821cc63e7c9857b0f39f7444a1e00a422f7cd5d0575c26bc5c6b98313abfde51e3f6d5f4c817193bdf391344e5ba0000000000000000000000000000000010daa8c7194a75cea757b6ae4eee85006eda459ff2cf155b1b5f19c3ad341972f72e28b781c4878e8919c7e5abe9a1d5000000000000000000000000000000001154d5d5764aa2b8818a9dc5dce30ba2197a86d0bdc7dee3e600462e295cc3a69dfbf8db34acf138e7a1f16b62a45717000000000000000000000000000000000b4243a09b05a958d78ba8ae25fd3fa85d520b95e56f1dff44e556b221a075f8dd3370313886d9dbfc56a75697454d72acecaee3dd4dc11e341b3dd0073842d90f641d4dd467a6596f337a6147bd30a9000000000000000000000000000000001820f953fd22b71ce00bbe9e9b78fcf5fb28bcb925f6b5dbf5711e00470ed7fd2f38d7291d40514ab4258807f29150270000000000000000000000000000000007b737b56a2ba33f76bcf66c0b26fb44d5f79879273f6ab21ecbfe6a5744da289464ca2b46c55edaadfe3210b907f3f7000000000000000000000000000000001735d1b39c5369bbf886c5063a96dd12b85e56fd9d8ff9d84520918e1dfeccb62bbbe1c2ab440ccecd0fe66f6ec55853000000000000000000000000000000000e591b7709bf00bb2a87e9edb95720de19adc41a42378cf9ebb930c6d3f5993a1d7b6320040d5c69908685d978be8f980cba585b847bec40515a257cb839c7e5d677d17b7313c258e83d630e65cfb5d2000000000000000000000000000000001732ac410b2a7d10110bbf7709dc6fdc91ce742f8cb9b2c3ba37ba5f0934f8622c675753a26d04a176e24a630d090d81000000000000000000000000000000001111a52da6aca10cf40127fa8ab7683505305e0d474eed28a5e1735ee6877aa00c1bd598420876f2154b814660f3fe7600000000000000000000000000000000098c6d19c2ff42c2c57a4924693325de1a91135e3474ec699b70439d034469e72e844a5511e23dff3948a66cc2a2165300000000000000000000000000000000175fb79e5e54963cdbb133f38dccea2d1abc3cdf005c17e8f2de6dba9b9dbdeff7719983aa9ddb602f0cf966fdd430e0b8cd305c650d2e1cfa91ef0aca9dd0d785d7570d6fb67e61fb9b6817116a05440000000000000000000000000000000004e88468d35d72dba6b3e4b9ca216b75b5d20c447064a48bee6a6ddf994b1e22fd6ee8abd60c627622daffcda219645a0000000000000000000000000000000015eb2ae16e3310b4c4ff557f0615519c13f29109d9863418fdfbe6309b5bac4463456df8ebb0b6d9022e294cc16265ea000000000000000000000000000000001288ffe0ffdb96708558d914bc412758770d048c4d50523e2b134f8468d11a57da97e42bea303ab7137e2d26c0b3b8f30000000000000000000000000000000003ce563b63c50b09a80b71a1a82995238a9de31aaf189c6d29307924b6f0990854507b7dc1644f689c5abcf931dd5a3c825e5f9d81273f306a065fd064ae24bc2c5ce8dbff6b22128753663a218da8a30000000000000000000000000000000009e39ce653485caf699ae1d1d9cf2b8c5ea85b80ea042279e57f0beb81056159e49f73d67e7b1f9ece9f9ece7dcd2cf50000000000000000000000000000000008d6492cc335660c54e4a34b29b337b5800f1ef992d124524c799c04c852ccd3cfc01bf39515cb8b96151753147e8c49000000000000000000000000000000000ca779d87aaa3a6552f9f1a10b0d2e635be90022326db04e6072f326b919ee55d4124b9268f55751dc0f18172bd327ae00000000000000000000000000000000112eea543d6609d0acfaeb7be98be609f03304f50c3814ee8a010283146e6b5dbf170c7314598cac06efb9ced1ac2930307ff9660ad0c24cbb139486638a2556687f88fb93a290a1d174bf87d780b3fd0000000000000000000000000000000006624dd7f6eb043da41a36a15752f370eeb3cb2e6bd88b337b370fe0660c5ba8fe64f62e112f91d2524e9324f3a049fb000000000000000000000000000000000415b964484c9246385cf95461ab955ed0390e20209ed405d84fa8c8af9fa7ab39ce89049691a63c61b12bbf6aa2a4e80000000000000000000000000000000014411d7b2db7c9ee78ea14c6a315df3d90827b511db2e2423d660176384d8f8afd284879b22f5aeed73afb2eca4be52200000000000000000000000000000000105bfb471340e76f28901edbdbfe2ba246a8824b501ae2d4a73cffd2690181347c1e6530804614e88e2bb13a8edef8f4bfa8ee3b44c70ba2512c00a1aaecede2180b08ac3ac8c550d70407f0c12e027d0000000000000000000000000000000002b17f4b0b0231be229d87f075998435560ce9046a8b0e8f15e3a9f07cd52f3316f6d8c00d6a872362e7066715cf990e0000000000000000000000000000000003110eb232154f8a06834e2ddd33c0207ea552f439a6127b652bc261158209a00654e50341d333cd1b206a915fe0691d0000000000000000000000000000000007940e209c8934c185e4392f12fc0afe3d234dd1ef3f92df18d76be8fc42bdcdd6d1ea8d5bb6f07b3f3caecbeb5ef27f00000000000000000000000000000000012ec903a8442f68c03300ab02ddd08ec935d97bec9050d26a5e276584592df3ab87d596f90768d2c0918099b28963be58aa85b50e5f4ffe375599cbb912f41d35acbb85a324880148f9b9003c4265bd0000000000000000000000000000000010fdc16bff0fea02b325c672fe06297e0669094e2710d0baf3838f3e234c3f776bb3fd41b967c9ebbc72a6bc6eca70850000000000000000000000000000000009d64ce322e39d5b2d0872760a61a831877c450b1cfac6cacec52d4070b0f179dce90afbdefdaa8466f6a6e2e83ee8da000000000000000000000000000000000cddca46f3b24e05b76e61b4584bc716ca7036afdd914731a61347e453a26d07549e9808e553ee056bd47e53c75eac8f000000000000000000000000000000000451cccaebe1a188d3eaadd40090ca594f071c8b6d0e0d82f5b2d43fa784f8437e4226104c4cfdb24ece1ed75375aa616810c6cd59b14ef4f6a4c2702cc53c65b3dc84988372c1195980417c583fd7ff0000000000000000000000000000000005832ad778dca8dfcfbe741dcf311024d76341d5920b6830cb75893a112c9d86719583d1dfa7287281fb73fe21650c3500000000000000000000000000000000044feb86b4816e45ffb98e9a670fcb039fd9d8844a2c7ff9b7752f20e619195fe6ab1148f30afa393936d3605fa4c8da0000000000000000000000000000000018db9365370a8c703364ba6d9c48b3512da46cc603a43c3fb91c0a8ee59777d7cf9ac646c3e4274bd950d7de92ebce840000000000000000000000000000000017bd82310e251701cafbf8c4dc5b9e6c88085b0df287b6dde7887e1f64f2d9487a25b31abe07aec7d99a75baa5983195c5ebc09190ba3df49d8ea55cfd18370b9d443f9d9084cf84f2236ef4723d2d470000000000000000000000000000000002c1df194f01dcb503dcc8a283f059b82d141274c8f37cdb6441aa33f84f16dd288d566752a93ca23d26ef5834c0658c000000000000000000000000000000001700fa4459dd4e609453284f4f7dab479342675a87c1cb42b601908296557f39256f1597ed3b9ec38ad0a40a2c728f0d00000000000000000000000000000000135ed4f475eb99397cf204f971215a0303316a3ed8b62b303b4bf756ff753410b7fe263c4e97fd4c4b399c319ff3ad98000000000000000000000000000000000a487e179bf1b73627af9d7d2b43bc0e43127a8fbfeaea7ce958ddd53ecb27741eda187745e3917f1cbb60adf0286f5413a56b176fc835b7e825c817d432b9ec6d51b0a66483dfbf12166ee979b664cc", + "Expected": "000000000000000000000000000000001327c57e16f03fbf652bbacd16cf574113860eb87b8f2f6e498dc5dcc4f2fa63859d922d88ccd6683d503d0962db5336000000000000000000000000000000000cb06948c539cbf686f6936b6a1ebef2e148d98c531da36272e0334afca5c2b16a52da542a0fdbc3bf764eb877f5778a0000000000000000000000000000000003acddfb5bc4fd5579d3f592977365840be4d3cff96434e5ff4f01ea798e4401930a1f5d91f8de3ff98504dce398c2ef000000000000000000000000000000000a5a332805f704613eb085d6639f99667d0d9247cae34eabcfa399eed551f24c5d5cb05d6458530ae270b1be682e71f4", + "Name": "matter_g2_multiexp_93", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000b1b06a76e5bdcb6c1c2f1952b49e1820a9d8557229fbff8740269a0b819b91cfd0de20db0afd76a2cb0fbc5fac12ec5000000000000000000000000000000000347654df2084082efd32cba2b270f66b0ed30fa8713b27949fc9d270ee8eaa9b9a7896d7a52dfd8faa3e0cd112a24e0000000000000000000000000000000000bf5b7a2c0c8bc223ab334bd1df5d9fd4bc0c635379ed2b32da13f6178e07217bb88a4bc2eae0b975f2e566f657d23aa0000000000000000000000000000000017042f8585a07304995853270b1b03bb08484104f7498a12bc865f2a0e37e662fc4b0331b94ee5690efe74056567000bdedf65658ec3cca48fd48e844337159af090c5d1f5e9d713ac6d0fe1e1f193d2000000000000000000000000000000000fcbc73d0628537eae417f8efc67af0a4c9c375d82406086bdff669911fe1307576333c389f189f49677cbbfe2ee98730000000000000000000000000000000019d552b85b1445660ca49518d202afdc67b0eb5be02c8d3482dc1b12e5d40a4ff95a49ce47809e4d6644d04aeb67b3c2000000000000000000000000000000000ed536c0f19f592180291bbce59a72ce5e516199dcbd4fbba736cae2edbe3cfb860ead0325dcc8f8d9be1ac126dc6cda000000000000000000000000000000000f5d4f0c0ae3e76b1c41edbbebcf1ff17c7cefd41e7ef8f75dfc10170834d05820149d5f721a8c6460cd0181571fca97db65ad6bcd6f485eefebda0badfc64e9e7dfe7e911f3ccf4f4fb9528dfebdae6000000000000000000000000000000000d6207f6684f8d2f083c963551bbf0a674ba40e691a34ebe6164ff80ba9bab2cc23024a896d7b906fb74c95016a9adfb00000000000000000000000000000000145855e7d610b50cde39db8995b127145d68fc9bea3f075f65b7793acbb14bbb313a1a39bd96fbea6641baae02612b000000000000000000000000000000000005b533ee83cf72f0e4d9c9ddcc6b91f4364e50a106becf766987c490d559d0f733839ecc706bbc9c2c75b243814068a3000000000000000000000000000000000cd8fba13b9ba7557c7577da183bf50810fb14eec7380e3b3d4f2fed62bb36f2b5ff288736bed0578fb6f47fb6d22ac86e0fa09884a7ff4c801ea0722cf6bfa58a46fc3d36058e8c395ea8fe56d9fca4000000000000000000000000000000000fd6a466f2eb12f6337ae9f9b847ac1481820013142af1a474229c5f5f5e1c0bb2d9678c19c7a3a1aa22cfc7b5052e0e0000000000000000000000000000000002a0340f5a0caf5c66719f7d546972bb4b89147989280542787d281901ff036b7c69d41418c21c43127c0158593aa5cb000000000000000000000000000000000deeee37ef96f26a4907e1a8a8f3f030dc09102799bd0c6dbeb1d208a0c86a423d0da6313e0be03c026da5614a6a576b0000000000000000000000000000000007220475449add59b3cc6570701528dcbdedacb9a3d39674ad4aef4d94114f24d2bff32f40b25af97ba883905ea6838a27a3377d7b9ff3aee2ce1194a22d7115b09a9fd53fcfa5e7f76bd9fdd35559610000000000000000000000000000000009d7023ebb73df81455f74cb2708c14ccecacd49521a0cf67ecb6edc8756e286ede59eed54d89eee5f77f178ea8fdee900000000000000000000000000000000002ad48fc3192634e7b01604678473e286afb0efe67a4377bb885d38b59ea00202241fb28c93232ce7c9a3dabb136a53000000000000000000000000000000001934664f2bfffb254f0415d6769f4e2ac710ee88cd822bf5da5df3a2541f887e4155dbb7e8056efb2a0370d6f9173e3b0000000000000000000000000000000019df518e1ebafe95adf683279729a3298fc8d7eb39c9a3dfe4b6665153f970e243e50dfb16fb87b3be54192f69766659446a62ef5760c995cb3cd0984d607c232c1eb0df5516a501ce448a189a3134d8000000000000000000000000000000001870048d360f397877321904563d35bfd0817ce464e0078e9605a4744e2723f49f9cb21dd3d6f37f1f9aff5a6a99bc530000000000000000000000000000000000e29dd0da13ac451d013d4a38408827cb0e739772e1f250d31e4192ddc13d651ab576ed6b8f4ee44e928fa663244999000000000000000000000000000000001646183099579322e0115ab0b3bd6c814e216ae6b2b80206354925565b7bcd97bc12668b7f3530a95409456ac99bf01200000000000000000000000000000000092f6f594ad0d92c9c64f78c819c44320e6bb5dc1dc8fbe58acc7ce3c101e49a74ae6d50b1a668a3b7436dc445e3da345f0c1a7c2dd281f7d2f006497f99f65d6a1e22f1d9aacb08724b3576aa19e19f0000000000000000000000000000000000428ff447de18dcc11b2c5c679bc2efd125464f589013c6964ea6cab33d9b7cbcce3a5d6177bf43114ee256f23fefa10000000000000000000000000000000000d1ded695e88dae6dfa702375959831f4bda688fc0faa289dcfb90a07f3a7963f2c9070958561909a2051a852cc15e1000000000000000000000000000000000c39bf1d11fc5693167890246c81133faee93a8639f459429757965e0b62e372153ce53c61f2c539247dbe7747b27d1c000000000000000000000000000000000e84ecb6dd9cbd4133c22350f07a976ae13dcbe4c6ae09ccb023f2118fa2dec68c20ba2266f9b571bbe30dde97480e0a94c1476ae0a62c502aa096a371e30ca885dc13fc417e3dc9bc00bcdf516764100000000000000000000000000000000015e040fc8753f06ed1112cc06e2cb7142a4fc984834f01faae718c17cde782d5953547857ca9aeee1c4a7d91df060d330000000000000000000000000000000006789ac15d719a7159b650b757f7d3cf58fca02d3b8f3685478ad5e5b1dca0508dea7a8203ece97c7c6d32b2f194458d000000000000000000000000000000001824d75634043cac3fd17ff0bb141daf7010f70b5941d8f75f1ae076713afaa7e0a0a25fc71038baf1b1255d64c914c6000000000000000000000000000000000a2f71bf85af6392a8a070596e30225bec9e3dc12c70e8df7c545bd6bbcee56799db2c9a8d2504c4f90ecf6a5e18abc9b677bc9f1f7572f808e969aa50efc519192ab8653c71090e5cf8cdeb1a3544dd0000000000000000000000000000000008bd859ff1f22d682f86e1a0e3bdf3a332ae78d64814720687a3de44c9bdd7506d2696b4daf81a94d33f64983967fdc2000000000000000000000000000000000d7b4b958e0087f8edf18a4370ff98700764c126808d5c52afd3e71ee326c766c1e5712dfa351cf5b3c518e52133ce780000000000000000000000000000000013a145331bdd9c93e63edbabb9f6c541a7c4dccb1705f07eb353a0407074a76022a8e5f5f2535b41ecf6474649e257bf000000000000000000000000000000000a12e461b7439bff0dddb560dba21ec53ce88f71fd3dc10723f3d8742ed63a1ab725f7e9619ca1ccb729564dfbdb1be7f5ca580a25a5c87015f57f7c23cc51a0beb5926c84d44659e45512da51aa0cf4000000000000000000000000000000001430a8184c5055008a06ea22ca9c997d1a24ddce7e374937c32ed1e487c80537b238a589b5e50b86fa194666bd3410e80000000000000000000000000000000005c78c94f457bdda242deab79524bd2beac82bb1cb427dcb2872b56d1f46d11fc9d69ba132004958fabc5da7d6d103fc000000000000000000000000000000000e985e8ca038b5dadc9fcaf22699e75cad9d2effa47fe7d4c579ee056b1e34ccc540372111a665041062fc6c39e05d170000000000000000000000000000000018c865243534fbde740de0ffbdeab0d38ee878c20f5d84c0226d1f2b14ed3359f5b5b909808b6b3789bfcab3be75c4cdfa1cc45c35e266a82899d8ea0c9c1f96f96140eace41a8758a87975b088f0231000000000000000000000000000000000c5b10541ec34dc0a8b8e42d9d6fd6f4f71e1fe56b5afa323f4ade35c0170b5e224a66771326d9edbddf2bd38c6c68ce0000000000000000000000000000000019cf33c19936f7489a1bbc095d0f5c6ddc1f43bccf7e8d1b30fb8e8cd1ef747b483b9a8e9faf21cba7cb17fbee887ad70000000000000000000000000000000010e83916faa7bc9de9feb8a7f34ac6f2aced06a771b662cbce846107245edb9c07632782300e838957788a8d88c8253c00000000000000000000000000000000066127bed5ac9f2871500fdd68a03ade57c35449d4b4186b9fac7c89e91b4ebf2f2a02e94d0b578aaf60b32017f147a493d2908aa9266844eb265c2b1c17f8357a5ff039836ba83c837909f6a9d0bc03000000000000000000000000000000000cb5a734a28b44f04d39ffae049fe8b63b138411661ca6dba00c72cadd47b50ad4b71e858e817561682d6ca378ebbe870000000000000000000000000000000000baf4d689baa09aaf763ae7e142b801223c8ff58f2b541ee4c44ab2460fb8f6dfc1e9f61a8d73aeb92d7d08c281cf410000000000000000000000000000000008a0c736f19bd0005c9d25f88565b1355e53fa3403021577de536712ec986567184f4dd626127ee80dd03cdf9044b2ba00000000000000000000000000000000063ffb7a3b4e057a9ffe233296c11fb462136fc4b187be6f9e36f9e6d335a3d673ef8b9ae6f60c146a075a1789f389cf3b94325aad8a2c80971a781bf6f6bebad63ee37405ab7e903fb7094beef14d06000000000000000000000000000000000c33d89595d039722222b9b9ee7ff1a0dae896a8de97f202d3aca00bd81d0169f14676efc4b051bbd339dce862d8b60b000000000000000000000000000000001109a24dc6f70bea47e040b24df395bf561cf5f1ee79e90c9b0480fff0795677483a85e6f2e9ded4f36ca849ff39d6f60000000000000000000000000000000009c7878f3a4e4e3149b72149a7da91bf527c4d7c94b15ba80b02e0e50b02a2c482ecae9f458a881c87e669986514f6d70000000000000000000000000000000004284448e42187c128578b801f76d421fc508cfee9360a7203a91d6f9cc7ccb6ed3211fc5df9e15f14aea98bc298b2f95143a8e734824840346078aec03d6760564870c5ee2b2dc13f8a39ac452be9f5000000000000000000000000000000000271ec1a3f8e3364ba8e101b49c0bb17e2b7c7f27a4aa4d4db5c07203195050f30c1a05d33c524a84b1a2f0ce31a587200000000000000000000000000000000082ce9d1da5d7f192c537b2bd617b36b65f88b308fe1ff85e47c64b62dc62324458493d1cd1da9f5fe308d27545fb6510000000000000000000000000000000000b30356b59eb04258096d0c3f357fb04471583cfe6a060de5279bf2cff4413678c1716ba87d0b6de6b6e79a96ec26030000000000000000000000000000000003c02470a14211fef14d754f6f71efb33a06a76e099093a5b9512f907ff819e1e0e15f14995febe48852007bb5c380bd0dbee37fea759c2a58cf360c654f85298e8ff44b3f900e8229c3f838345d053b00000000000000000000000000000000172df3290c3c5044d590eea59980d02e02d4fc6fe7948168492362de8f0a85df0c3d09d8cd8b206cc4d1608311ef4c130000000000000000000000000000000010e4d14065315a0d9e48204e47955ee9652b08318251a7836f32e6fc015d4856444172de44b3b88efa1b54dad346e9b1000000000000000000000000000000001549b9c85cb2fc2c7495d7ef6aa1452e58937baf58717037069e6bc6d72ced3a163f800991cd26510e71aa64c44f66170000000000000000000000000000000007814c2f1734fcc8cbf9fcba06b936c86d0452a2370f8c9480b97105e42f9babfe0869cecda7e15500e9d8d868290201b92f9db82d0976f4c379622c4028002ede2ab17f647bca3bbfb159045cdb342b0000000000000000000000000000000014f849e9749a5ff6b7b10daac7f5934be5f783d49c8593367c4243664e01b1d3552e878802d7dfee823e0122e9fd46f90000000000000000000000000000000000d0b32d7904dbf08269ca3c6ae3fe582501f55e32337ae361fe4a58dada560db54205e56a399aed33bce8758a05ebcb000000000000000000000000000000000cb21440baba44c3cc6943c8cfa2fe544a652f06423d3de06c2ff734ebbb544da07ba8982b3009b6c4857b73ceca570100000000000000000000000000000000174ef591975fdaa0e3cb05bbb4140abcb38f685ce4de77c95e2cec1911985557b77d9229940b8c9157ccf9fb553e8e0d98df4ba50cd5cb5a02d5f50b3ba23e5f5b0172a46cc315a0a94fed05551a68af", + "Expected": "0000000000000000000000000000000006da1222c7ae02843ff289931fcfcb315f621972f45e4fb4160b8bf48cd8102d50fb53d2c699afd36892d91f5e608784000000000000000000000000000000000523048c5de2d0139965c976d8c3328666e99c249104712719e992334442245e955cd6b14a1e3d666220617d78edcc630000000000000000000000000000000009f669d4e7d89fa8d999d8d5a6323da9445583344276bd6a29494a91174aeeb29132926a893d5a0eeee9c3048ebc0dd200000000000000000000000000000000099ee1c33d6f09a8d063393d2a8debeaba93027e31f7b23c5170b6747f56bd6e6494de966dc280dd67a38d39ae35a336", + "Name": "matter_g2_multiexp_94", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000b46cd281a09b85d977e88cb2251cc61cf13181522cf1c344b114783c4fa22d08f2d008faea3dfee8ea7c56aa35ee39a0000000000000000000000000000000012b530bd34f5b31161355436c7dc444d41d634b0ac3292c0096558618005fe82d189e4b208a48240dfdb4d50ad44dc620000000000000000000000000000000014d334e7835d4bcee2698ca4f643f9692f28d8090ebb8ed8f67c60639c64eb116067e5e8a6d04a0c88c765c608d57ef1000000000000000000000000000000000578cb4e243b4b20c99afefcdc0e0a9e308ab4bec6d655a8c4981a711515c807067472a6fca30060d776213b8ed98d74e49662df81f6bd455ee554704ff0c7d5a589d91e017d7ab4c500d36378c17c8900000000000000000000000000000000046ad1212696acdbb686543d284d7cf2e1e8e8c10af76c6ba51d55f060c006dbab25d3a789c71c428f5bdde9aafbf6d5000000000000000000000000000000000a6a880d52fed6a45bdc61d9ee78d8fe472e76ccbe155bddd0e2a967f4d116bb9f2dd4c62cc6f7224b835c8060213ecd000000000000000000000000000000000786544589eda15edc433edcbaa46d4953da72473f04169ea64dc114b99f0a58181d41dce1fcaf7f3109f66aef02e53900000000000000000000000000000000030759c3bdeafc94fc8fc0b03ddcd96869459bf54ace74582aa06c179323ef076aef89c09ce8e7bf9109ab2e8c8fb0be79eb26c79d78ab84c4d7e48e56889a601fda17901037a74fd79355e7536f3953000000000000000000000000000000000e6addfe0db96a7377fcab1fb92183fd7d7f13ec003fdfe0740bcc8cf03d8cc602d5d808b4bc874f34944a65b249997a0000000000000000000000000000000014a4337107e716113d8ba0fc7f75e85edd1c132e2b3dadb3f9cdec1440f261513646525314b5c0de6fd372472aafe877000000000000000000000000000000000d472ee0484ed831f8ddf7ad86faef5443df8b943c6fd4c3f94c8d52d9eed6fbb53107170a60f25be52219ca4816788f00000000000000000000000000000000035d06ffc452c65a31f80c3f8a0c1e2d15e32d993ec06c50499bc0fb8f669acd3d2182ba23d942489ea922baf61dd49cd2918ddc2bfb7f7cb3d7e74b43b9a972c5b51ac20ea83f41d5b51034b5714c0b000000000000000000000000000000000ef1f5f6b3041939557368d613279043d1aceaf5fee3ed90b3b756ad409d700fb41e62b3758c8c2d325db7a37f339c610000000000000000000000000000000004d66040a8e055399bacb6a1e762b698afbfabf789caeb957fb7a3dccb01d7dff5414e90f5a14961c4e980b298f834ec0000000000000000000000000000000006efe9e66078000c26d375e87ffaca643aae9cd3f8337f5718e0e268b74f4b7838f7661dc0ce60f557e162a21ff467160000000000000000000000000000000014ab782a3b2c06af7e9c2f28f1604cbfa8a676a874853bf38195780751d306936cefd1cc38c2192cb756e28793d2abb3e9a8159fd7915c15db69355514d9dd26c66fbd14af969ee576401b1b782fc6d300000000000000000000000000000000057270788a199a894b37a526a26bc4d293780d365a6b66247e7417884d543dd752ef7c89f2f4b38f4b51e6f9d86b45ad0000000000000000000000000000000000b59fedd6798487ec09d226a7406b27f04f7983075b4659ca6a78c6bb8aa83828fafdc6488518e2cba6fa4193de938c000000000000000000000000000000001105c18d92b4192833302814ee9b176831e57fb64b703ab3c2d3f440ab302c8fdf7ddc81933d3b1adaad16038dd6dc1f00000000000000000000000000000000020509b08e6ed980df29da649051c7095edcd4eed4ce95cd797da430cd09062a110bae21b6f73daff2053fc0289041fac818ce6e33e581595e83cf8d33a62edc26ed38c22f20c6949a94e2652bb954cc0000000000000000000000000000000007be348ccf6a76827d3b9b33e7a89378c133c9b226e47dcb205ee061423ee6e1b838bc262a7befae7c15aa385ced00bf000000000000000000000000000000000689787c19192ad55b9c6c260a5ec3aa203ef71f0b746eebf10f82526c4fadaa8570936d7049c1a46e7f3cdc455a63a6000000000000000000000000000000000306965b09678d481aa4c754d56a0bb4565f16f7523cd0b404fbd39dfc3b6ed483f5239fa30f13aa3e87918ca039d5ee0000000000000000000000000000000000a2586143f9610a96eb0ef86593988770db5ed49663eab72f8c368b9388bdfbcd02fc6bee09f4fe055813d140ca0fa89ab338e94b31d22947dbeb20fce3150127249d2db6107d95bdd032eb24c49645000000000000000000000000000000000018f46dfdde786a88e582ff6addbecb4f58e12c2625e3d6440f2e5b5781beaa95cad6f63b7d132e84700e7bd344fe3200000000000000000000000000000000185a4fc339a95a50551d53c18bb0dc3b74e9c164729c2b0d919392f7aad2be3ebae3b8f676ab81ea05233b3039918ab50000000000000000000000000000000015395b020a9d0bb336066c1347dd91c557b6ae7b8817cd8a2cba9e5bb149ca3401d661227c26d52a9be234faea894c8a00000000000000000000000000000000103d9d7e33a0767554e13b57dc756981488a3c7dfcc026ea84b35b0af21193e301226cb5a4760962707d19a95841be9296acb797236dbd0316fdd355f07b9b45c9bc626f73105e87c376af4d7dc075d30000000000000000000000000000000018359aad8af59cdda484232b885d1b14956ec04b5584684b13a64d97b8310c283e5d66637dd75de405f5f4bc65a6879a000000000000000000000000000000000849fd55e4f3d4dfc643dfede6356826eef21290b84f7e8e226deabbc84273d95f7be5479e9656dc907ec367a7ebf8f60000000000000000000000000000000006ee01b54eb7834b4de53f821ad46f467cadffce6df09751b728d0952bfe615253d7ad173892a52c6181810a815bd90600000000000000000000000000000000161472d45b56dd9fd276fc607f2eef84c5c843ea05799e732d7eb6dce96c632335949e1b3a06815e410e919f4cdc3fb360bc12a8b34e717b2c410d026660c14182250d7c66f8f88dd4cc94e550421caf00000000000000000000000000000000107ef91cf3a3068c4e5644676f7bc7c5f9ecc361524bf3fe2ebfc606f22f8f83b38c0d4bae89f3cdff6119cc27fedf820000000000000000000000000000000006a7f7cad2fa9db8824e4e30da7158f7737d2536554b904ed835c37add0341c07c5220db0f9801da2587a456300c7b75000000000000000000000000000000000f6dc3adda42dbccb1d1e3fea8918f5572e8b26ba3011429e754edd28559b731853761d33777f4e767094f80e63d417700000000000000000000000000000000107d93537a79173ba9367732fa3a28113ec37e053cdf31ce6970dedfa8a9b4cd55238289be9a6f40319e3dfedd132f95537f0f732fee8b882d254a81704d2310c05dde186232f3cffc05401fa98302150000000000000000000000000000000019dc19a1663bb05ebfc0b7cc23ea9e07376de413f77e15a685a3f11fc19bf0ddf38d5671e2a5e6e31624cbcd47a19cf60000000000000000000000000000000019e78aae57f327fbe8ce794afc22bddde08ff9bc9ad3527601cb1fd5dc0b8ed8fdf3b210f86760954b48bf61d74162220000000000000000000000000000000013954a533bf871e99f4a7d81a8b9931c480ce7fc47260c3708c590ade42e6b7bb887d4d24aa18642d010a8170cf85d34000000000000000000000000000000000a561d3f64ba31a6d45ffcf1bcac95f8f665133a1e962e31351ec78e369042bd3afb0c43d12b3087168c1142107241f31a22bc0bec2501a505cc8e00a24792bb380ed451ab6f56fde07ace8b6c9348a20000000000000000000000000000000007149094366e29537b0ad7239ce04bf49f253e4b746b9fe440dbf9b425bfff21064fce66e286e08c87dd83e22a3b499b00000000000000000000000000000000045ead132e0d03c842656cfc82a45c8b4a3b0cee7a5d071c5f235791ff7b5ead071b2c529b446a15aa8837aafc11222d00000000000000000000000000000000013159458f2123698ad4e7d41da47ad7d5083b928839e346a32f2307ee69f643ca11335d50e47d328b0079f1873cc7e800000000000000000000000000000000167edcf807ee723ba70e352367705448047c6b5223fe703381af6bb103cbb24da739ed005b14fab5699fbae6574505a7c7b10c801fb9d929432cbbe994b404d3baa5633628f396d20d047fe2c2ac2914000000000000000000000000000000000feb6f6f85903b3c8e4d6ec2ff234775f12727fdf7c35eade09c9773b004270f659b00248338f0b749d6715778f1f4d90000000000000000000000000000000003300794df19b9e472e8b869a2762c07a9251cdb96b508dfecdbd62fc3c3843b37118d216a64519bc3bdb71e40f9bd700000000000000000000000000000000005fa144135a5d6cf1c73055750ab6582b4c6d368566172b75902b1fc7a6f5de2a251ca7efc7ac6cc6c0bded14df02b700000000000000000000000000000000004239a7bfdefbe78116a588810328024b1bcebaf8f28f09387dcab66dcf2b02c94002df09d12db369fef9dd960783c0b84f2f3f31d9869799ed8bfc2cb129dbbeeb096d771730ae2863c4ddece66158d00000000000000000000000000000000007c8a24005575a3098c12ffa65095bfe227ee59e5e978a7ccab7a9a72391fea61690648c102ce24af723945bbcafece0000000000000000000000000000000000323d57bec7dfbb4614c8c3b286860fbadbf71901fa006149053ea614dafd56b1f3d6a86fa55bf1cbdfe8af4ff08dec000000000000000000000000000000001180b2b0b9c4c12f6d06eec07bbf6f5a220722015fe5365d1c4ca9e58ac9c8f67964d8230152d7a2220575c756bdf8b0000000000000000000000000000000001969a364c447f07d0820586bade587ccc816e50696aa0c5ea4f1daf6cd577769a890b44caa013d93e7f21f5ea269aa85c62206fadb762c23bf77f69f69bd492674bb92edb39248ad2a432f819304e6ea0000000000000000000000000000000008a51c01c3bbed13d42a4da626a8b89e2811db1d83d7de3332b36881ad14a5c8668ece4f5ed2b71204810457aa3d75cb000000000000000000000000000000000658a56aaf627e3f776d3f03caa2c00425bf197c6fa20c92f563f48260109a8f935d0d1638f5039486ce0c0100834fcd00000000000000000000000000000000126d1964f2d964c290cd7364e175ca4a855149e5c4ba488829a436b09ee5e21f6c964e439739f15317873088726bd51f000000000000000000000000000000001803186f88833393bd853970ca4fe414a43b7a619ded1f9c830444b4d43a94e9146146e2284d690436b395bf1e3fad15a6f950de53d07fda75ab43f73982c2684edb06317568df15b8712dff2ef782830000000000000000000000000000000002dc3756c7f4bb47559cd720a3acf4159290d7413e0498877d1fe321cbcb7cdda90b6c8b4ef8e27b2642b82ab9b3174d000000000000000000000000000000000c7490f1ccfdd91aa37a3044d265cb0612bfd9c065c370adb813b2d96f02d44041e79921d1b8935dcdb8c83ea4460ef30000000000000000000000000000000007beb34bfb9ba9b6fb590c7e830400888095d1958b252d187c184de91f165e12599d66345341292fdcb662deadcded030000000000000000000000000000000001ce203d58bebe1eb5b7cbc6038f75b2f7534bce9f50e7e4c91d6cc5ac1bb68d9fd8ce99206c5ec92bcabb71672c6ac195a373fab5176d124f783a36eb2346dddd5c4eba9e24e4c0cdc4f925e2e24cc9000000000000000000000000000000000765acace3e238e51bdaa08c0f6d737c9de55b5ce9ac3523335f0d35bfab6f4e7e2944b8aa4ee031ae9d39d4db96e9ac000000000000000000000000000000000b0fd488a6f9e92c4bdb5e82b52a0035f9a0aed7f69ec65303632017669f34d11552f849326e4dd204d58f50f3ad124800000000000000000000000000000000033991f66588b5e39eb78c7cbf62a74bbde2fa1b7c96164cb58040f0887c485b372e0ef4def9d38da9c6f5c4df2d59a700000000000000000000000000000000187d41fa7905739078d2c2f8775394f830d20352a9d91e97568c6929412f356009239bc9e1da3a8c766e89d09893b5b5319d855218eee020f9cf8e4c0b6004902f0b16eedba8a1c911476af34f65dd40", + "Expected": "000000000000000000000000000000000dedf92894c567ee656051a7f02384edc7206152af6d3c5f662ca02559a3cc349c6b034c6fadceeccf652a396dbec6c900000000000000000000000000000000089deb173bda620678247a7218408594efff7ab0cebbf627b93ed37e553cf944e09232b92afe2f5f31d29bb9ae442c26000000000000000000000000000000000178bc39b2ca8b032d3cde53d2da3f8797026d78c76c51381b377c79992f027cf55ba4e182773c99c99ea6293a948e5c00000000000000000000000000000000195d9cb91537e77e7a4be4370b982b6d36190342ef6ebc2250a9cc8ef6ef45211736ce1f41da899178c1adcc4927a9ba", + "Name": "matter_g2_multiexp_95", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000004638ececd7f626a069b1bc3ad9d0f7cc71e5f0c1b11711fbfee1f81466b574f7a11de8161e55eb574ab367f56b9d6480000000000000000000000000000000013ef4f403f139771afe7e97815d3b3777818a3054d02125d3a25138e504c8c2c6696061572322aa19ace9ffd8e3ff308000000000000000000000000000000001910f776582f5acbaea626d2378e9da133b63afa087f25c2cfbcd1e7b34f6a237f2e9adccc303f9d5efe22496ee2ab75000000000000000000000000000000001963bd62098614c4ca2fc2a9e2d679c2b74bf9d322d34377cc63c3b8e7f8a4eb7d6d440d081e044606402fb3f51b0cee2a397c2f19a8c4e66df0e062f179be2f45a0c5e104588222a1a78447512f299b000000000000000000000000000000001935ecdf4f21cc6b510321b4ed2663e339954cd7399b9d67f1d9e2ea7fb9bfff8531f83ab59d3f0546393dc289ab2dd7000000000000000000000000000000000f390b86fb4cd4c1a072a83e1d1198a57a650fa6e94b69d983b693c592bc0c8fcd9a46c6883adacc4c7e2546dcd079fe00000000000000000000000000000000136beae11ea54ae26a8d69015ea7793675625b2013dbeb081a5ed877832849d67ac709b81fcc4fb322b262ec3776c0c00000000000000000000000000000000011f1df574f63f679b6464df463b58948fd337a4b3f159229ba0313cc040303345e75a3a2b0ed0dedfbefa89d8331d074f193d5a575c80a3e7599923bf5a8ba8a48e8f98322d1d8eb1da42e446d518c1b0000000000000000000000000000000001510378fdcde4027999edc99d49bfb46423ceb0d740829e310f8a381a7632fd0d6b6aa3533c2702a5ca76d386ac0145000000000000000000000000000000000bae237bfcc061552ca07eb14300cf557c974611885aa6894f7933f7dc7a0a1cc3b5587bbe1ea5fa604e3cee1db5f7c9000000000000000000000000000000001743207a1814990c798dc3de272a02b1b194a485bf09faea382dedd957861dc15cbf981f9906cda50cce2899785b9a6300000000000000000000000000000000106f902004c66c80437392e92cad73bed6b73010bdc7b6a75de4c01f0b6fbe5b8d1f47378279bfa42b3af05120854ced07f2013742ddf2d35448feb80b6b7aaf2925d3975ce28ed2b1ac789886ae26e400000000000000000000000000000000123362e41268f7821fcd2294b032c6a51c6d80506eb052ab6132267fa248a1a60c3e4eb2e75a1674bee1c9d46d82b9180000000000000000000000000000000006296670461ca67081cd76528446867e1a4905f88742d0ed8d1f7baf86e0a5e5ee86c8b0eeef07c14dd821dee0143bea00000000000000000000000000000000058bff9544e4e02c063158a52a68c93c7544e8157d37159dbb99b51b09e3d8f5b307bfe63a10fa409e20a35219ac244a000000000000000000000000000000000b135edfbf53187004d0977db94eeabf426ad7bea84ad76c6ac771fa186a073d430af76d717070e3c4057a7a2da095984e637a80a4eb1b2caba68b6828aa18f956c62baa7c5e9e591a15156c5abb605000000000000000000000000000000000133d3a223112dc5665e78fba8fc8d040d133858d984e66d2382d5e629f9369dd127e93c7a4da77fad98a0520ebedfeba000000000000000000000000000000000e88515db391bcdeeed2a9f64d27387af0391bf832164fba79100b560d8150debbd703c140dae3ba9b1ec35c1f45670600000000000000000000000000000000042583722c69a19f413392c6a2b75c8ca969be85eb951056d7e1d94e046dba49c346d5774009b8463a40b0576ccc1a6e000000000000000000000000000000000ee61a9eb6ad497c57405a44d798868e22b4fd5b8c480e9938cfdd3f1817eaaf331a9988368680158c59c2801add0a7a27671631f9afd9d2e86f263f5c17c3c11c7f6e43efb6d75cb2cb8250094f228900000000000000000000000000000000020352de9b4e8ea1acc8589bb22e23dfd0ae3a80de9e21bdb3f6391dd05a012e635de9e1f5f450bf4aab05728c054f8a000000000000000000000000000000001733593b94ec800bb59ed97dacbefda5ad882a8023346bdff8f471c5613c67247e27d72cb4ed8cdaa0f236018dd2128a0000000000000000000000000000000011f272a3b25bc519fc3e229211b846042031e22fbed22ecd0d1a4ef1d05feacf105772d71157e3d7293575aca257cd5f00000000000000000000000000000000153b4b4d7d65f7bd13d20fee4812f04706c96cd1a0d27b7e139c47299805e0ac86e8941aa38d90331c78a61c2dd56aa3c2decb1f482f3eb48e7f52b89f6452b659812ef79bb42fb25f03aa9969faf9bc00000000000000000000000000000000143e1f6dd9397f0e89a46c6ec995bf6c87ec8a72b309f050dc5b3134e00e2a16327767cb0573ca5ea9776215a5815df500000000000000000000000000000000186cb3af2cdb4562bf2d0c180079547cfb345cc3943fd7f9203fabbdc1547079cb9ed854f9b1a47f513e318cd409df83000000000000000000000000000000000c8c9197fa5a1e66b371a653c5d18c01fed8d17a8aa92d89b2cbd954b9fd2931fa61abb6676e4851dc9481732c6195610000000000000000000000000000000009026b259e840cb5264f6aad6ebbb09661f5b6d980389817309aef99e4e0cb228d3a7a06e6c25bdb1aeafe5acdc44441911eb1de54fa8ccb746336b681504fd08f995c864a8dae2aa866862f81f0e7850000000000000000000000000000000007bceb74ba86c07d0fca20e4febd3b12b1fe9f786c9a5da0531550244f40261d7ce728498fbfcfe16cc235db6ed42e11000000000000000000000000000000000883104ffcc0d040d70bda04dcf67c1197c39e200d4d9daf5f3c185638a13dffe3dcac94fce4175187dad867e8d2b78c000000000000000000000000000000001404e48e86f199486db7d40076cc8dc4e2aa2c1b6d4bed8f027512e2c71817905b26ff4f0551f9c08a2a7a27b2075b6c000000000000000000000000000000000b789a6addb98ea43c0f9e85831a75b8ee1977936c17929fb45d4c06b4f1ec33b9b41e32b52cde542c9e4b64d27c686cfd0a61dbcb0c657e824cbcf4670a31a95ecbd47a9b93812cd5124f3ac9450c1b000000000000000000000000000000000654e7f3985bf90dd1e3169382690fdc0f804eb6384ce407a060f539804fe6e0451094abaa0dad611c15d3ee52f31a92000000000000000000000000000000000deeec957d58a2246ff8f7b7448f5198647576c16c1717369ad155ae36d5a6bdb42c8d6a1f0a095891fb0890b6203f950000000000000000000000000000000013a01a6ca4c296f59cfa4a5f5399d28af76ffcb8b218c861d5e6dc603e140f730f632028c8da46c823d87bff5ca703280000000000000000000000000000000003698f659e86b96613ca74a480c81e749bce4b74324976c1d241a0911d078926fb2adfcc3f901a7a015a02f525ddbb808118e9c70cc5def8e7d258e05273937c514131f39e0cc9fd2a3620dbffc7ce3c0000000000000000000000000000000016ce72e1798ffd84b52ac664a184c6cf5ce1ca2aa263c9d056355cf610517e9c7bf7f057c342f6e3ae801b84c2082c0f0000000000000000000000000000000010992af1438eec10881b5e2e3fa3b1e91b6b5313ea58dcc0cd2159f8ba6ce5912d81b38956929620e04b3596f6835a6f0000000000000000000000000000000014315dbebd532d0c835e8e85a02c0814574cf040a20c18d06573718223c8ea15b7ea69f0cf342dd09037258398ba4bef00000000000000000000000000000000136d13a83e72525b2d4af54d14d5e21d8bd9bed18543836b02ae0a7e51d433c93aa1943e85f978a8a9ff4454d8c5d120c445931b79e2b826aca02d1bfbb00c2dfb6d30ac2ef97a4ded18243b1afce7730000000000000000000000000000000002c1bf7dc75006c2941b89a2de52fdcdd1b4fbda5b14fe3fc165915b90fd9d93cdb8105898ef59d5b374707f0afaccd600000000000000000000000000000000049a16efcf81de84e443666bf990f6aad2145f9c9c2c61a752e256e8f447dfb27b462e4553544971807f909a666af12f0000000000000000000000000000000000aa4702fb69d791ef958826753d3f74f61c7a591ab94bb6c1bd5d82d94c5877121ecfc1e769d0d16ebe491b775ad96e0000000000000000000000000000000008cd7f2562eca6c53a37382fcdb04be53998f45c2241bfebac3d1fb08d8e1d4df3182f2bd63861d0de72d58072356ccc982ae6de98df906922e660d461009ba6c04cc6497f3645a66385c775b21b210b000000000000000000000000000000000a6b30c4ddb692ae33c903693cdba00ba48efa48e90b9cec9dc747004e57a8d5a05b5522634fc0de306d38c28390dbf4000000000000000000000000000000000601341b3c4057767a910bf30dd16324ad7abcb55b7e98e73584f26d7f87d8a8d24ff2113c12ceb3077bf65e0912b2360000000000000000000000000000000019dc9c50f613470abdb5c763c0272e88e34ed38e617d6757f4e70d05b8ec9f67a023b4ec1363e7e60e38cff64e18f0510000000000000000000000000000000013fb1858f7efeec5fd03d9f7f4513e3e9103c340eee7bfe48ed3cd3dd073b96add9450a17f12e161f1d44669b1b2f813000674ac5d09c6c599173bbe9a43726c120c3a60a96d43954727a2f33ac4320d000000000000000000000000000000000d6c135bfe0fc7af93571a69b7c37ba691f051d69582cf159cbeb0bd59b48342172a82a3eec2e3d440805934e1574f2a0000000000000000000000000000000001b04e56cb3bb221caedd3582943f89a33b955f624f9e473941f1dd987f2898339142a654d11d87bf8bd2fd0fe0d4c1a000000000000000000000000000000000f185fd420b761a1e38d542558b0beffba916f369b37296fdd8878a7c3d2ac9d3ab1d8e45ad799f0d81bb439b5e5058100000000000000000000000000000000002d10ce460c414fa1094ef2b7de8f1ce024b6d086d10067be0fed4e45dc25c8e50bef361d39a2743be1e1ea4fb7e2ef773f8e9637886d795b75e7ecaee512005c1780e7ab17b9f20ae9232595478bb2000000000000000000000000000000001972ea36bae504d7047639ce6e0e6c3b16afe89fa3d6c6b33c910c8d4b70782d8165912e5bfbe8bd84f78f9f23f7f956000000000000000000000000000000000ae55c4fc1c01f1bbdb060191e8551a7ba5ebd3dbadd138202090d7dc6765fd1ef5fe8204ae76a8bcfa03ee5985a35280000000000000000000000000000000018ebed295805e0fc14f1c7b0e6ee12ca48cb7177c1d367a613e0d6cfaaac5128fefce0e8f38d4e2f11ae0d327be466a400000000000000000000000000000000157068d89fe48e77e0f62e3b5b0293423f35c5f4ffb9e0577f5aa49e91cea6bd312a0e65ec08af9c1f53de6499409c8d759d0bab12ac790cc3a16e88f1a108e670681f117d4fc7d01f8c5a2d6ca7fe8e00000000000000000000000000000000120e4a8935c08032dbfc19a43e2a770b12b05cf1dc229e12f683f0d7f604bc13666bf318fcc38038b618ef83c9448b870000000000000000000000000000000004e3f851be46bd85f37c8b1d84507f4ed63ea76bc305cc26a6f4cfa2135d5affcd3b319d9f57619e21c964c6246fc3f600000000000000000000000000000000138733f352029373b19e1c40d5958a04257e2b344770e1bbb8f377bcfb1c7225ae7a8b0b0e57795ec06a08e13c90d7de00000000000000000000000000000000093e85783c556a017829e28bc42b607b1035890fb9743bf0e279df4dd8a695c1dd07a76a213087c3a8a7e614b29b7a1ecce865074a8a41f8a3f40228046c5be68bdb50ced10bb73ac8472f0525302938000000000000000000000000000000000be1ae00f9ba0a2e57f94728508e0029b1bafd52c91ce718ba41790a3541117d1a9f846d68440978cdef016c3b9ae422000000000000000000000000000000001947683154204c9fc93e3aeac17b417453a24d01804e8acbf6f67947f5962dce875f49d05e6ae65384602828784f852c000000000000000000000000000000000859dc1c00b49cd1292cdc65c6aa4b11e27637b949c7db508930c557ee3ce00f98f9cd3dd0f6d73a646d176a91d75c070000000000000000000000000000000015a7a6984b5f42aadebba1e1f4682aaf1a2d01c9ce2afab7fed2269373467787bb1361b493dcdd862180e9159ec2ad5785e2f9597c9b687150864e90ab042f4f012a54d92cf9d2ece09e4a081ec9773f", + "Expected": "00000000000000000000000000000000047cc33d9decfd059724bbb014fb9cd95de187e2dd29cf4a9bf9ad06d415e2cacb5a4e49266c13e0c38f2563d1a21d6a0000000000000000000000000000000011c79d93fa870d541e79ad4037c20b85d3cec053587f9df60dc11e7dc2727d79059f75bef76474c09fe61ed10b317cad0000000000000000000000000000000003df3f0db20c5ffea4dc9f4d9333d76141447bba50da18e521e89aae1e63750c71b392570d79e597967dfc9952e903c60000000000000000000000000000000014e83ea645b1019ac2dfafe370f616af0c5baeabe217ac1f9ecf78877717475b25911b339557422526a8163434439923", + "Name": "matter_g2_multiexp_96", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000cd1d25f285c2073175ecad5bba4987cc52012eadc7b19dbaa20fa82d7a6cfb8a52f33469b6308d921eb4b3b23f7022d000000000000000000000000000000001707b67a23d9212d30c06f26f0040c38389b185057e80236d2c828a8d9ade4f72eee1d6eccd78e4f4d71e2c28ee9539e0000000000000000000000000000000008e5c04effd14d915b9afc2083afa2b6d4008cfa0e47144a41982d8b5a8e77922a2609384e2c5d18c871ae24a7d505b7000000000000000000000000000000000f414acb056fff2cd6d9b408adb6eb7f34c8f66a66ee93945a3381d46c2d181613047ca6d4067614c190da444223cab685431a1df7678e49ee049b75ea968ca255ef456dd58cce57b64edffac1ac223c0000000000000000000000000000000008ea841aced2d0b8dd688947648a8ff18d0f6f03f63ee1c331f126dd4fc0da3d386535156b80902bdc1f65add7769cd70000000000000000000000000000000017a32ad2763d99c38c954f62466e78c0332e48875e15afbbe9c78376f1bab12346c73a573738353e2162d3928091dede0000000000000000000000000000000010ea738884dbfe5bc35d031bde9aa4109b1fca529502e236aebb5ad0bf71dd2f3db250d924415b0bfca56519f8ca5d290000000000000000000000000000000013699e29cc1871f51a469898be8b3c732b5cf7860286e655e65bd8176832804d17b48d0ff85eb023360db78162581297b6ccbc0b600f11f1b89061d94c6fbdc9b1d389244fb29a5d140dab8842d44eaa00000000000000000000000000000000004d504e62b2825651381ae862fd33407309851d5291591cd0f541fd092800d709ede00a9134e65ee752eaceb0a344b50000000000000000000000000000000016481efba290c37aa4ecbf940c76ee5df199b0c1f90fddebd2db28120bb5a14dd9f4a067b6d4889aeb683cca0f6ab337000000000000000000000000000000001400c89942cc63417ca4cb05c9d81dda3251e5611c27fc7727c3e803170672f103bff26f7216a0b646533aac3171488d0000000000000000000000000000000019889641be9db08880543ff476b9d4c72167092548ba49a3f3ace4518d3874f4f7993ae7b8cec90f092f144ec9d66c1a54dfe31190469897c30ac3736ab166220dd3702df5bc897835347713d03a8d04000000000000000000000000000000001927fe80adc6dbb581349c603103ad8831e645d9275af8669939b83829182cc6e2a30df2fdeda6d3aa2e2a6126e00ba3000000000000000000000000000000000b6d7934d5ca1098a85a0c60acca075220105e221b802b1be97c2967820bffc2937fc3278ed0f26905c60d44d5fd8dc000000000000000000000000000000000057acc1379f23c0d1d37427d400eb1b0a89f3736c83d3ffd797ae279e01e2acddd84082f13f3c8b8f1bf7c275702a9c700000000000000000000000000000000038dbcd7e08d34c553850a52336991a7d48968e98057e930790d78b5c6368eb2fe01571b60c4aefb653ec04122953d56eff1ceff9e5184dd9fea44da4f07529823dc9b100f776cef6f6881120f7de11a00000000000000000000000000000000014052031b88af979b7edb06c99c2e46bd9df2c862c7e1b71321754841fad67fc3242b51141e49ad86b61344aec913f40000000000000000000000000000000014806a86d078ee9bdde99257b67f50dc2ddf9bbf01dde931742ee6f739aa986cfdca06cd32d23d86f2c14c3b09033d29000000000000000000000000000000000e0561e795d35ceb8bd9e3b276406ec1f697a38ada25d1dbe08715a28bdd3d6ce6e0aac01f7dfc7c2b403850ab213b4700000000000000000000000000000000146a65209b09487e00e356e3b29952280ebc6a06343c4ce14efa0c6281bc2482698bd02295bc35125275ff5f5bb867dfb273e4c6266c1f5cf022902fe1310d2191af91c47995486342bc61cd361eab8500000000000000000000000000000000021592cd7f4cf9cab3be53561c889c9ee865961aad51339f6393dd6a0b7dcc8a7c48b753c947b15cd3add01abd3d76d8000000000000000000000000000000000f9e1a80bad58055a8577700c177889c4d702de04343c1202eaed9485a76493158547b20bcb552b66c42a0c86df809ed0000000000000000000000000000000013908dcff1945cf06f038e3caac9a7fbb3a6466ca18627e93468a875759a2b5599a96834ff21fcd6bfbba82b79536b9a0000000000000000000000000000000001b6354665109c5a64613c3bd7d805b3a34098708f3d41c7b77db031ac6fa0b2d4e2f2f70c84ac78687b0c0f9bf334771342b5cd4ad3179f406941ef6ea15d0aecdf9f6d96dc334c39b7dca89d256d4f0000000000000000000000000000000019394063202186e141dcebce7b8f0f267ba6057a0f993bb1cbe22a5bc528323823bfd1597a87017d478186a18f09a47800000000000000000000000000000000148437bcc43d432d70b47dadac8e738616c97d38d0f84dc132599626612f7bba74988bb23ae47ac15e6f70c059d607ed00000000000000000000000000000000180851594710f4bb5be7ae0104a383081c50f59e4e048614660ab5a4e2661e171510f5b112d8cf97a6af27d56d137c860000000000000000000000000000000000599f3f82f29b493ffe9ee3a8363b9a599a5ef3c9c5c680d4e003f4ac5a7de0562cba8e2a4c6da7d07cbe86c3f7bfb85b36620f65ed84fc0bb344b4b73f4eba4b1680a47b28b47f6d10f9ee82398125000000000000000000000000000000000cfdce7997601afbe484901893a1b5fc0b83e8d238d41d2f889a58fd4d884df1c667a000b53b587df2c42ad46aa2c3e0000000000000000000000000000000000c50bf3e06400cb10494cd09bd89f3c96ff49c9f74dd5325f9489ed6be13b59bd7b0b2351411ac854d430405b8a2a3de0000000000000000000000000000000001db313a34ca4073e4fa2287e234ac32bc579742de22e5218f7873b922f5804894826e6054925a394f125fce850f33ef000000000000000000000000000000000e0627a66d286e8d4d3654b32fc5f552a7ca12f0bd47eb6dee0dde22ee48165247c067a0f4c3d422bf3562d38a3c0cf1249ca9bcf879a770b0a054422a6ea97ae795118ae45532c1523c842696de6d170000000000000000000000000000000005285ba39f5bd981fce2fdf853706d70992acab2dc6d4c4198144fab397392a60d631056b580d0d98f3f350414ce554e0000000000000000000000000000000013bddbc1180f155872376fcdfaff2fb12d3d9645b81bd1475a5323ea855cea820ed7eb693791caa9bd3fa5c66036439700000000000000000000000000000000125644d32df397def58dff875d7e3f14166e765ed49a3991f45b38d74db3985fc7f5052058d85594c8b97afcf850e11b000000000000000000000000000000000fca4662eb1b39f576ee820385fba88ddd2fc01fcfb9d9f874453ad725cd5defb357be028fae97ce71bc5ac26d11c1bac014a0aa616e809b674390b4553bf2d9bf325e73d3a935eba94488dddee4e8950000000000000000000000000000000015b97d7c74c8ec102083b41d7ce5490466e1c0e261b5ea5c756d3f9ae79dd2d8ec6eb5075cfb76dfcf7bfdd80442f7d10000000000000000000000000000000016812f845faf96b8b69ac7a6af3c8947aa25877199e3c12552527706a17b768bbea259ea61ea82c4624a96cbcdf4040d00000000000000000000000000000000123ad55e5cb5ac5bdd3ca0a5afa7c3f8e4b98ad91a205f073fb546fe799ffc57b3c1c3a6209547ffc6ef05fd24be6f5d00000000000000000000000000000000017719f31946aedabe0e9d88ef3f90eb6ceda884f5e3d2ece368373785b2d8bf0f9677731803b25accfcb6cb716e0aa4ab722a1c20f068b6955a44073914c418a082345796912ca634e79983a24ec4bb0000000000000000000000000000000000497e3480d58027c780f47cc35a121ee0cd76c4e84d9a2f9002c04a1c286be990167a0138049ad70467132818f48ec9000000000000000000000000000000000ec0ddf938553105400f70989140ca322d996f48ffb1b35641ca36a6ba9ac1daac1603c100822f80cf62ec3bfb442158000000000000000000000000000000000a0b6ebee28a792df46d2f727af812c15fc91a471e0d8e34b25b26048f3b9606d8375b5b268c40fb04ef8f098e1d03340000000000000000000000000000000017843dd19bfabbd0cfa41fb58e70a8900397d17ccea783087ece90962560f5cf090e8d9eaa873a6a6ebac45219ea97a68b314f83cc3ad501caa44b4c3ca8cf68c70ff6920f445d3a7ada212b6a19ba3e000000000000000000000000000000000b27c82d71f7e4aab9a68596669596df3f62071e921e131ba4d9e59d8d81d370e077e93a4a6a43e059661227f40b38c800000000000000000000000000000000093004917ceb2fb4a1b33960ff74943d520f86e83aa02b9a6c85e4b9a489e9331863cd30cb6ad6f099d03289b4ada5520000000000000000000000000000000016f04e35186c7deaf730708e1678089bf3e73c1164bca24bf8f70c4f6cccd5bbb34bbb5dc313ee428aec4ac9c638a01a00000000000000000000000000000000011052348cec9dc3e85e01abcca5a652461f08a9f5d72b3fc27140a6a571137f0065ed7ccf9ec8cebe314ad9a214d5ed94ffab83099c69845cc87727d459ae300a5725ec53176424ab0ec8bd3f80eaff0000000000000000000000000000000007083dfb0738d58ba8933a1f60283e5da8bf90af5aae4053ca573ee7223d3b80e4bdc30b4a831ce6af9f52f393e9742600000000000000000000000000000000130c627b7d3a527c94cfeba9f514e75eac047e1b6088c082229a8c95d0765a0898ce1e45694ca2c7935bb8e41e44e8b10000000000000000000000000000000009610645b074e652a08f2b89dbe594afa3009d795ef211f7c036a56274b1e1bd69a035c4f356b6b21f69b9cec2bf7c32000000000000000000000000000000001020f3cdef468af700269aa1e9d928e71b8c521f23586c9b0155314f0073da7de04ca41ececd5edcc052af72c05f0e4bb1d80be637e2abd98d0433150e14b629d98fc0918c7dfc179204669ab465e90300000000000000000000000000000000123540047f0768b0af841aa4aeceaf3dac31ea832daed86c8cbd1d33ed0282c6f697d5881f9022af032e90ff82efb6bc000000000000000000000000000000000113daffbe413075f5f4f6fb42f37b6e9d5e5822aa24d6f865792f63e6078584246bcf8b17117385db1d6233974f6ed9000000000000000000000000000000001067b46fd221b6995d25d4bf0adb088e0554d858d4e5d9d6b59e1ae2a7d57188d559b0208918a8944aedd62b1ebd4f4700000000000000000000000000000000087dae77e483d5c0baa37b9b96dad5ca92b5869fa253bffad24dd8747446f7ce60858b52438e58233210d86f470f765fe670a57ce4dcfa680e60ef33ba99c437e4fdb160ea1012de36f4b59613a6af8500000000000000000000000000000000039d09a094d655c139cb9714aa258d9548473162548048b0f07c9317a41a7e5dbaa5aca156992c8a509d4071d9ae4394000000000000000000000000000000000f0273a38b1b9d006efa43c15a53f026587a676912d0275968608519e97994ea9c6a147e377f68b1738ebeaa178f9c1000000000000000000000000000000000132cd92417578d2e46884f1c1a1080b1916c8c8404d2533a4de02bf8575c80ce7e8097c2ddd1f95737355521c0ec21ce0000000000000000000000000000000019adbf09a268a3ed8eff936d25fbe8af2874e44d2580c7941dc14fb89c5da963b468a7088c4a763eac89f4d15deaaf5e54a999fdf391d3944318c54680e69b58ce3778683b6f2c607d64450ed32c6d89000000000000000000000000000000000756dced467ea32c3c425590b7690a45e250e464ac6927ad3f5d2d8d2826961b8dd7572db609375c8d06cc3b9bc3a157000000000000000000000000000000000b79b4eecbaf1d0f8a89f9ef8fc144b3aff38148ae260da7c20e9dd3866d946585df7ed12c8b7005e7b0e1387c9db41d000000000000000000000000000000000afc403b008b70e19f17b1ef37c9c396577a585b6c34b23d09621b891efc00ef9460c3f4b5f3e851ef63620dc06c824300000000000000000000000000000000024e06f3f3b18c026a166c41f75d7bcf699480f5b6811463c27606c9ec1232fd249a46235b7f5b5a2ed3b53231b333150563ae7b444cca7ebaba36b8d59aaa5c0e6c1454a4a2907866247e752e640a7d", + "Expected": "0000000000000000000000000000000004f2480d0b7e84a996965b76055f6879aab5bab26656e4e5ca7220adc17f14b5946047484327bbc5952d9f2ffa5f92af0000000000000000000000000000000002f7260c55c500b54df4391a55eb4adefa7d19bcbec82a107fc0d222c898b97360a679a02ab3023ce2ebdcffd125ddf30000000000000000000000000000000002cddfa94c8f6b3f29c2fe018b1f8679d0e98c8c2656f86f327b9cbcba574cc52643ab423b458994a03347460deef6570000000000000000000000000000000014eb4c84f71ef5935e707a11a92ba34780677ac7eb198e160585ad92aa5c1ea21e3a77be940fe344e7e170680e2a8d53", + "Name": "matter_g2_multiexp_97", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000c2c4c039047d297049afd0e8f0375bd4294d628d3a22078d93b684b737e8c4b6ad3ee544ecbeaad6b3c75d8d217f3a20000000000000000000000000000000004c77a2c0943c6f997ce2e785461f8ec253c47273ded4e1af43ae882766ef8c168e66d831abc2b3b3a0849bbc210cbd40000000000000000000000000000000004456a6c267a5cc6b7d9a9f573270855186a1b621cfdc465fe71ddb4d614565d9d36b13985b31396587919226843c6230000000000000000000000000000000009487cdd8a0cf7f40e9087fd3121cb480730f4302339d25fa12128033239662ed65579a59b837bf1bc5fa87db15b15335b59d128b5ac47106b4114cf225dceb621d177141ef5783943f40a54ad94e990000000000000000000000000000000000ba43205e8392168824f77bac344d60c1a9a0b14ab55538c3bfea4a64984cf381a2f61c64f1ba1bcfd8a7973e43f6e80000000000000000000000000000000000e95e5ac415c3e3e7c9feb6e7a2af3e8189afca06ae1fe54bbeb31783810860921ab3c76a475fb227b3c8299e3f1caf00000000000000000000000000000000001e3cb2106a23e77a126013087751c4d2a419a51beedc3a33faa6c933bedb3d34ee9c6450c583642426edb352e04da98000000000000000000000000000000000ab5af4c98aca1fc3fa55355351d12f3bc639662bf8b5b772152988d676b00ef39f767237a2fa3be936e83d1dd77da86a057c0405e24b7373f67197b2109b633a02589711b6a92ff49ca024f893d7ecc0000000000000000000000000000000012f3d927316ba638bd6294f7dd2f3f166d20285ee1662ae4dc145835704a17127078343d26042a5c397bfef31754186200000000000000000000000000000000162893d6252361c340057bcac31986458b8b55a8a4283f5a06ce1730098f9838dad1bca264374e7261bb9d08c177c1820000000000000000000000000000000017264aead0ec41a079827296f3d32c12adfca7cb6c674070d54087438d57b6ccca4822b2337263e60075d469b4ce0ccc000000000000000000000000000000000480cae035bd3bf1b4a4a766bcd5f188833e9587e1aff0e1f10e36ebbf2f3ae76bc0946e7c336efc3ee00bf42e7efbb9677b05905180182427efeb848b2ba2eafbabc7519ab33db14de0746afb607191000000000000000000000000000000000d13375356b1518e37a13b43b7d192eb74bd69636f91c570c41a741a8763c03caf8d13c7364f57c867a4a3983e88060f000000000000000000000000000000000f6f78dffb404faab88ac7373e0c765209c0af80514d438e18393bfcfeb60d9a5e13158d399f43162033571ee4a75dbc0000000000000000000000000000000010c379860638ccf3b6cb8479aa38881b0004197e3e367a1d5ef7c7fcf075689d283b87022e2825b5c789ac6a448467320000000000000000000000000000000002dc392872cf2fcd8e196f10c1ded175300070e4e38aa58c89c81e1aa5faa08d770a5ad90a8295a890551f9329a13cee53e7f69582f4c106ee5bfccba1d5f557736c1b75b6e3777cfde47d552e6bdcac0000000000000000000000000000000010383a21acda7c8f3f3be980bff2d57fa0a5b2dc424164dd2ce53c0b20ca399d6227913b7b550462180b01c231e4813200000000000000000000000000000000078aec90354721f0a31e1377b3652bcb1f388ab36f1866c955f3ea8dfe6ac2c25bc4cea14f54aee71595c2c1bd2dc4910000000000000000000000000000000007dfeec77213d952c183452b98ad936e8854608d950c0c1451262cdc7d6de5aed0db07a8d74b3e8f674967cb4839c4d00000000000000000000000000000000015c09e4ed2ea76d10d196f7a733ccc272b94dc436d6bb5fafad2fae4a96372c2c6f1325d1554746814ae292d8e6b1e3634c87bfb629b817e7ab97def7400b0a83e47af8d628787ff814733fdf34ba8d500000000000000000000000000000000138656fa091cc6613b1fcff04a3efb4f9c393985b2c78fa838eecbbbb8b6dafd88d9c72441f9bc735649480b5187acac000000000000000000000000000000000a35cec4819ca3321917cea5aa589db8cf61882fd1135031dc41a8207a8e71d326312799291b160a646148c382ed086b0000000000000000000000000000000005b6e4c02c9c54630c96271073513cac3a42d47a7272f62a21c7ad4c85c19b60b70d04719626cf4273f6c5691719931700000000000000000000000000000000166a20da734a47d7e28cce8f0c2d679fa6c738a7a1ca9089dc67ba2b1c92a83b024b8991f131e7e8802a617153de4554bebb60069acf431e1671e3d00e4da0d70fa11ed4099b21d45a2b811f99dd9cca000000000000000000000000000000000a4432a544deda931b1f62759320ada2963062e722bc1b748c9bd0d026ffae10f228be36ea0ab076358924f4c06b6feb0000000000000000000000000000000000e955b1b1b28d2044b6be371c58bc85097c77145b239e913bb0729757518c465d9e69338066f7496aa6a2038ea604f900000000000000000000000000000000017ca2a7d52c3a82ab8abf9fc1bc187389b6e4904e161541008e5b3ba0981870e01060d1272a6d59bfcfb294c942403f000000000000000000000000000000001870649a50e0978185551f213eefd9305d33e92b3f8c39752b6ebe18ae86ad97f92acef05971dceee3b3729becea18168b1ee2765e762f1b8c2451270cd5a755758fd733d7922a537aa9f1fd7d0c95960000000000000000000000000000000013713effa20d5039ced751ebafe1516f062f11ee05ffad37281cfee9d7a49ab14c065709832f6674bfbf2c9f379bc9c9000000000000000000000000000000000295f7ef148430209b48c292b024474f05036edfdee082c56aea05a62f1fba3ee7a540955423f78614c8385da8ef60040000000000000000000000000000000007408c97321b6d7c27e5e442a9e35b054e743c34d845874aeb1ccf4e903ca7803ed7fb1288327865f9e0ff0a388e92b400000000000000000000000000000000081808d03722a2d48846a693059c2662dee614f181dc406825544d30a6adc0f9d84a712eff80bddd4a27a036e4bf7359d5009fd559714d5692de5500ec8cae9c04ae1ab1c7c6e08c8738ef22da19ceca000000000000000000000000000000000880b646a674723c15b240ff56d2031e5db724251b1402a68df8b26261ffc9fb60a81abf165c6832137dc7a7293142d200000000000000000000000000000000172354b62bfb8d388b5a984411414738302725a508e8abeacdcb46454371d5e9cf762028fb65921d5c3dd8c67d42a981000000000000000000000000000000000a1af459bc3122dcef78359e468f4094d609ae3da09ca5aa6efb71a7494dafa2373a3906bac1f324d98b3eaa982a27d500000000000000000000000000000000092ac3b47253c7f090df076914cdc08a715faf153e8e365392b4859fca1db14d3f7fb998c97de9ad99b7d0b357252f086330c755ef708d8eb129475785f24be9e7836385ac918c60ad36e80e2f3281b80000000000000000000000000000000003b23eff722c078a781771d8b75d519e7a062ca3e4252ecca877845920158fb20d79a9ce449d9087426b113da0091826000000000000000000000000000000000c9026e8d3fee6282492393db504a2c41db19d8fbb83260624b05ba4107d6cb2c90d645a3c16862b27cc3fcce9bf89840000000000000000000000000000000018b8648d0a42285d474f809519696df9e1ad5c35d8e848ad74fbee37425aee8844a8be8cb4d3331670ee294ddb9a290200000000000000000000000000000000068cad37ee8578f4b502ac2ef4371a10e5432e57fe20d0cb074dc427831872113d3514a0b199d813b796b8357fa2a3dbc2431888d05cae840dde4c26911db1893659fdc345d5433556d9bf75e51fe3740000000000000000000000000000000013200f0aea4c60937be47213b6149b0ae76767f3559e0519f774af4a5d9431e2dd7ea74b42cc3ceb28ccf0d2f01116f30000000000000000000000000000000001c5bff08fd16ecb68f21289a3e7b9a2ec5da1357d604710a18e78ab780f8ef0343d5d9ee7f7988a009329b17e498beb00000000000000000000000000000000125453772eb9d1335ce4dbcc8f2ab8426fe89a0e49fec51d4e96718a38570aa82dbef452368141be2df260fb131c50b2000000000000000000000000000000000432cdd445519775b9914a986a0941cc829b4a15cd361df9ae7129547b24f7a6a15cd8fe9393fa1551db2d761a208b8ec9a72369cda74e5c86c6559cbc4f4db1b3ab24c5150c7decea862ede3c02c505000000000000000000000000000000000396cb6d7b44f92b716ed02985d351b4e8cd1bbb95f239e4f29d7379428470be395e2faeb8e3a910007aaa490d3c336d0000000000000000000000000000000000ad0c0623fdf50c2b504777554dbab3cde1b9705e976561873d7c22b81f49c7654a7c76e558fad1518ed73a0d3c3570000000000000000000000000000000001241d5bed68e02a2ddeb3ccbe109a161abe81edd7affb72182c5163851211c4763e6aecf766053b61ce575de893985f800000000000000000000000000000000183696d2a48feef6088f4e9f75a5055e8c54b3813658b593958490ddd4245ac495a8ff966861b20f26047f07fa8609a0c2f50989b04fc29c4c4a0090fb11e860c15f89a66f3bb8281e4678ba63ff3f9a000000000000000000000000000000000fe0ce41aa9e7cb2bcb4e01721b7b1d99fca4e9b7c4df09bec00bd346fc57c25118ba70d5333b7f3eef2659c64520a470000000000000000000000000000000005c932e09c62b7ddaf3f5c420c60740befa7cdff5bb812e0f089c45098d71b57004b7a207f0cdd34daaa3282cf6e9f7e000000000000000000000000000000001874200ead9776c1ecd6a54a57e5d0f9577910a4b3afb9b051622f658fe3ef6cc5070af60e7ef910562720e9716158d6000000000000000000000000000000000c2c657e58e400a67e59deee8c28234ff4688e781a2f6f2f0d0b186a5e4012695a522dfa0770cfd543f55939a05e20b09fc9abf1c76ff11ab538f46ce768ba597eb5f2f63073ec67e8de10aa1d666720000000000000000000000000000000000f0b561e5860321249b9ff434c604d26c3275824fc4ab9c1ce5c5858605ddaafae83ae27e523bf6006932f6c7f33d0a7000000000000000000000000000000000b47aab85bbd909599aa85c5eda363b67790ac6729fd8b1f4f53f66dd796cf2fa3496407b1bfaea4dc8eae53519054e70000000000000000000000000000000000cab1ebd23bc05c53bc9e8481c469eac3ee1b140af545bebed10a8fe50698d2ed883219881929207c0addf2f687198d0000000000000000000000000000000007742de55b799950e6f786f4eef45d0fb67e0475272ad68a183135b70047abab6c2ed51ede16c39be7b986df334e9e75d4167723682bc0e7476797b3be5e14b8de3e4e23b4ca33c50a2096cda8766dd7000000000000000000000000000000000923861332988bc843a65ec5dd4637f9dca8a15e71b82c780fe60d768213d118d8948ab554e30bb9253e900a9b7d87f200000000000000000000000000000000132b1faef49e7966a05783ba526e71134bfb577b13116548352da37e91e617d7c72ed2645e672ebbc517e079247dfb0e00000000000000000000000000000000000a46a8893a194ebfe077afd05fb25d4680f1e4991a3ec29475fa5651d086d20b38136155a65a4c70af31de5a78af59000000000000000000000000000000001344eb957594028b4228cbdb8efb03cc7cf49ec43b2ca5481eae1df6f2df3d5be9a7c4e4e78f8c39be546e29a83c92f49644c3727f78dd12811092190d5d10adcd5b9fc581dd783c97d4e7b5130f309a0000000000000000000000000000000012d7111303563a6358e5ce9155d7a153b5781062c2f6b919efc67ddfb4c61ef03be8828ca6339397b84763a5f8a7e8330000000000000000000000000000000010a2a0ea9973728d3fb1b5906ee84b2635c687c11398ebf605cad30216df3b7b4e3ee1653d4b323a690e6ba614ebec30000000000000000000000000000000000b93d5de37b892d4de9407a820c73ecfd6cd9fa565db82e7e8c14c8406823f705ff0adf6bd6add5ddc5f72c91e52e840000000000000000000000000000000000dcb320ceba5436df8f099c5a77f34376c96d830f5e8ab80667d156d89f6bf8998c148ef9a53847ed395871ab86f6d280df9846c84354ab7f947caca7800e12e38d8e6651527e6831f4d8b1bd66c4f3d", + "Expected": "000000000000000000000000000000000ff3e299e6b9fc488d6db991cf9d226d330846e87c4a5cd3e5d4ac955bc2c3c2d1ee5ff230098b48f594d256495f489800000000000000000000000000000000097fdb8fc95d64c7070d8c71e0fd2a933d1e1ad3fefa230f079bc5743828317cd1b0c6d4253ba9c3c6ec6b12d53afa700000000000000000000000000000000002448bbb179d82eaa453cd5452752b9a083b52694cc65c5d9b47f72eff118d7aa06b0fba18eafe93d2937d7399c001af0000000000000000000000000000000009dec4c0aff2a46b07855c87e08832811633709ddfbbc30dbb7e78b3de43bd95e383baa6ff4c58188f0c7643e0ea5a40", + "Name": "matter_g2_multiexp_98", + "Gas": 293920, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000008afabec8a9985cbbc6246825785654c1d2eb7da5a01f76c4af4d0096b9baed3c33dbe492d14a6f9e762f06eb3d198f800000000000000000000000000000000027c592315dee4bcc892acc6f41a6eff5219c308253f7cd715d0e4a32c03c6d0d0e8568e146e9e799ac3025486c77fc30000000000000000000000000000000015b4ee27a3aa518a1ec1b447bb8f9128301c85b7176296d68dad3339b1dee78715b2f031a7fb6ba376145c97ceafeef60000000000000000000000000000000004b7e30ec7cc024ced863ce511cef3cabe954a4e5843dd636d776645a44225a36ed7e153ab5bf5d18f23c6444751875c8a71abe11a893fce872f6b8a020b6d84241df03eb934b50cbf3571df4800a83300000000000000000000000000000000119949d36d8d8e2bc1c26ded5f5fb01225a980a28b934ed3862480dc9297a3758e0f08ccaab3a09b5e5c0e4215e3246c0000000000000000000000000000000004a82dc22316ee6af39d937b662d1f1f2dc855c2ca8f33ec3274d833e87d594633fc7fab247911e0f46564397910d6ce00000000000000000000000000000000196900a09d8504ed960d41f4a8a2cde2e5dac61b008d3f6eb47e86d7b2ce6fcdc0f85157e3ab1571094d9fdaa75d0d500000000000000000000000000000000010c52ef9407eb4ec57844aebbcc3ea5000b1940d035dcc2a873327affaaabdd79e3560cbd29c63ce04f6279056d6eed1bbf28e5bca314391550d3a0fce50b1220965860e72c8c3865a2d4c599d31d3f1000000000000000000000000000000000e43655ae05dc6cfa93113dc26cea895d1c5bc73f20454c7b441dbc5ac80035b290514b13b31b41931ea5336d8d9a6a7000000000000000000000000000000001199a873958c63147e6b82625dfea15ce90dd41ceb4e315f67221eb874ef32c6a2953412e7e981659c72239a7a72bfe6000000000000000000000000000000001845af5936b4d7487ffe59137ba2f86daea3770cf37fd560969ee48243389941a1072205e049ddaa06c0ac56b7edc8930000000000000000000000000000000003cc831177f24614f93a118b896434105f05a277051a852fb9973a775fc54f779c2a1f3d64c457e5231dc22d6aef606b58b208a6845aeb2bf31999042c59b7b130a7ce5297e88023953b1aef63616fe400000000000000000000000000000000005e63584bc85ba58615985f6a466afe05268e545e0062cd7214e0b6fc8b87537c745b754cd9a1144948bc88b3c43acd000000000000000000000000000000000635b6a49090ccede3ed2ef203f0ed164783e3df4d9a7d93319515cb9230bd841b61a097f39e30175793b3e934d8e426000000000000000000000000000000001861e65f47a9da1584c45bc79a66045d86bc1709c2d1cf6cd2930a9fcc8c4efaa6536b5015be8d54789e8f574f93f9f70000000000000000000000000000000009290ce63d55eb436794acf11be9d896f03e7608a1bc8528f61ec9473f054bc9fbbda1072440e58e2f6ba080a01180173b53b6cf9e0ce1661c4960283be790abf956c2d6433529b8f3a32b92b227aebe0000000000000000000000000000000018feed9500bff884d2bb58554da2180c68267b6d3a45c2c7cee4c3f8524252d3faaa5eff971bf40123587e669fe66bbb000000000000000000000000000000001441bd3b58b4a4a87c2459f873c0692f5977b775af984bab46dd76cb9f775d2faebcb77b2854c9f1faa33f6c5de61c6a00000000000000000000000000000000123a890c3362c77e5b5cf9846d9c9e43fb3242d5a831e640ad080993fa0547854c8d11cc22f7f7b426528bf1154d2300000000000000000000000000000000000ff4a59ea98d13cfd353ae61e18d3c7018688f755561e6a1da5f09acc4277e8d49645087115acc64f992ea778a11f39bb049228435ade4c4c565e65f39f13a84c747c312afcdaff352560b9fb3cfebcc0000000000000000000000000000000006b019d005141e82393a2ca04469d1f6fd7b9456001ffef4c34eff6b2e91df58e99fd07944f52b108bd41ab6c4d6bbf200000000000000000000000000000000109ae87042029856befff0c916db5437e1e058a96f2970d8816b3becc93a1a50d6d336d5451303715f3e272147a36caa0000000000000000000000000000000000fc381b8dc9dc02d34db13e34732a10d0dfcf676c224a05a3bffd888b0af7c415b38af0b6afe6b464ffca42947c6ee5000000000000000000000000000000000087040d09c39ccd06c9ecc360fa02147a32e8036ad6e4b6bdf5b3883722a4e5a887dd022d53706d2585fe558696be6656197f5ad17062d2ecbdc8887bcdd32e5ed4c48cefd9e14d622a0b800d970330000000000000000000000000000000000e35c27b29df0fa9298bb9ab6a38b3450782223e2115d79152f9baa924d762d583b3ebe88e42f33028814ec78e5b319d00000000000000000000000000000000190c65667627a16f0af0ac7f23af0803bca810f3986b906b7b4f126d98473d52badf45e90e2e45bb390242fa8c40135100000000000000000000000000000000103f0283a5673c16bcc0f74f259c2eb077061947da04e467dfebf62aa005491e32b85cb73418b624a30dbaa01672921e000000000000000000000000000000000465466955c908607191faf15f0768dce42488c488eb4a065977f21ac7484766bc0abf23961ea2ba46dcc04956abf6c7721d9d7fe10104cafcad71307e785321ab87b2b69593535caecbf0e166cfda5b00000000000000000000000000000000082346e352e845a54cd4267f93b85b2c8623d4650e00c1c56082b73ee31f63588d2c117d3cdecc0378fbbf8956b082040000000000000000000000000000000001a7f43c2bb19cb32345c43c950536f8e85815b86364f278f6ec8169eca80917c2b8fc08d59b20cf55f25dc468e7bd7f00000000000000000000000000000000085a5cb020df10f9b4c7afc01b1d11700579dec1e85e766507def2e6cf5b714174f7be9cce3b18533a5ebfeec2b4e481000000000000000000000000000000001836d7506d1cc984fb777b8ee935d6f5b110644f59e96ff44d8329336d59a3e1d2b53a05d35e97f634baa4fdc11a6cd8461531ecb61365908019c1e8074a4c322df2b356eea3f3eea9aa1e0e1fc5525e000000000000000000000000000000000c1c59828ec6257a02679cff0bee0d665d449d2a158bc6d877e84cc0fe2161c297dde09b778d5e1249c515833e483004000000000000000000000000000000000f5e82589bfb7781e4110f1486752b00cbdf96cdf4191d75053c6d6d646e1c989add011361031a11559e156d64139fbf0000000000000000000000000000000015053afa7fb2b4e4b70f3c8a570fef8288fdc22dd951b6ba8a40b6087b9ab04ede21f0ddfa84d6d18914041bcf244c110000000000000000000000000000000003f399800cba51ab35624d866831ab6506392cb3acf549787153ffaf08cc451acea46c7a612821dd96c45f8b75133d88569c1c1ae2d18bbe36ed50db1bf30957802b09a982fbed49d4968815552e010d000000000000000000000000000000000e26242c8f73116079369ef4265f624abd4377e4e3485c28197663de9de9f5618c3b6ee602ff6bebd1c242aef7295b2200000000000000000000000000000000066ceb3ea6067220bd28fa1164237782859d27c1d3087a42b4d09bcc343611e4ed2be014a27f5b394c67643dc00f57cf00000000000000000000000000000000157f9d30de52110ea7a2a35ddfe67d9fad7223c5e3307e797dd0df3621520a421958a2835205e3c4777923f47d47e5310000000000000000000000000000000016ebb41beb85b9489a6d5482f8a3330a5c5c5e5718e8efb8b67362f9d8e9c313e9e563275ba38c207c5bf3d89c406ea62061d33b2f7e786effbd2e93101a56ba1bb62c1a773a08b72ca82f5183bea35b0000000000000000000000000000000005d1c9109b5b7409f94ae3f7dd9e8ae4908a9b378fea4ea284cbd33d1e59b605577b63892aaa8ec14d415f34e22fec520000000000000000000000000000000005afed05e62599f20f7eca019f41d770c630cf6359cb5601464be821691fba5205c16e7b580e6881047214f938e5104b00000000000000000000000000000000105637a2aa4725d8e080dec3b731a111ea4c94b79f898dfd51f645501ef0c8d68ea8e80fde28ff96e927e44306ebbb1d00000000000000000000000000000000080cfeea754474ceb37973234d5dc3269f8ca99bd862d4d2d1a602321fc709945a3209e5ff2cc962cfa6d03017c9a1354129b150752d2d5551a622231ab067931678454aaeb23f76168219406f0d50ee00000000000000000000000000000000137762ea5c80033aaf17570451b15a062feedde810f11ebdbe9a79a3275dc12613e0505835c122bd5f9afea7dba84203000000000000000000000000000000000d89c04e45e60769a63fcd73df2a138c457bb549195f2c4eebb3be1ea46149f286756795be8328b5b886f497d8167b34000000000000000000000000000000000be43d515083c8c10f467618685a43d4d5f6457204bacd278445943a9f44f7189b561a0e1bc59d2757fcfab2e3f93a4a0000000000000000000000000000000011a52583227c6dcdc1784d3633fd584612a9f3bbc1922477396dcd5af84413e5e9382a34a71b3a72491ea09fab2fc6bf366c32d5d3c132f32a6ac3cfe1dabb649c59ae224338f747ad98b193e8346729000000000000000000000000000000000073acefe33525dd2d5204cce72371ed82c7e4b58d1b4e7f4b4994f9c58b02d9d6206fefb3552446b6b355e860ace43c0000000000000000000000000000000007344eaeaae71e17930e769e02bcb4f44ddf3d040ffa0b081f25901cc125a37a58a6a5d13e7b0ba493802ccdaa054e29000000000000000000000000000000000a65fec6ad29ec3eee9ddc7ded2297f49d03ff18a255f1e6d29d2a67c20713f319d79d513af0c58ae3cddfd1f6240ff50000000000000000000000000000000019d5f00d9e2b271f4e9ac779a096386f08ae124f77fb8183405d48ea7f16e685805442dc67a392aefc643ea95b4f1fcfd997516cac28a3968ac6946b5bffaace0856a52e38fdcca11ddfa16cf5a568f50000000000000000000000000000000018230bf1a873aa04855af1426da30f1b3ef4b64eec613b9f660222e3827b325c318baea031b463c7e9f775165d22ec8f00000000000000000000000000000000017faafa1294fac53e1de8cae9601acc62d76a5f01a39ce49d65f3f5d2cd5cca33eb90bb4116b3ea36f912ae2b81b6cf000000000000000000000000000000000fc3ef5ea59849a87fcd45500989f1744cb5570ee88e34a952cec32cea2eb5900b64d8d0d04ef5c51e8fdcccd46412490000000000000000000000000000000001c53aa8aaae8422fa4fddc86cacdefa89c37592c8e67e472a23627514623a90901a619af79e93561a0dc65215837274e881ec65fdc2f58e46d3ee45a06d0c5ac844ee5b62872c7ba21f6b48621a3371000000000000000000000000000000000e3db6885c2db9244548e11b8c49b73f85e4104b413f54308497262fdff1957495859830114528a22c45d39a554ba82700000000000000000000000000000000181b1bfe2d9a1c563e73356d73f4ed3e7061a79c610bc97c911ab1a0213d123c9f83ed6706e862087a796ce14c5cf53d0000000000000000000000000000000013f5fdceddce771588869b945bd6025e5ce485fe78a362356720b474b83998f27e535cfd8d33ee51cfc68e5d514f915c0000000000000000000000000000000007e8fd7ba457a3cefd50c641847425cf2262deb1d6945a0bd740eadf38dcaa616edc48c3912508d663349f089b8b56fadcd9b95e49473277a665ca0f9a8309df9ed6ee4f25d803aa967fb8f688273e650000000000000000000000000000000004b20b0408da7b704694b47607928a655077015f2174fe01bac9a0b3a61dae087b0b593f58d2947d8d84f75bbfb327c900000000000000000000000000000000106d623b2007c5d7128e03e540325ba763e992a651e2e5c78936f82ee2ff72d89a1a914345486cd0a04440c75beb190b000000000000000000000000000000001847348e5ef429cfdf1ba4d265d8c5ebcbec3d5dd4611ba36e2754fbd3d327273bf2eb7b7ba4b3888d059dc87f034739000000000000000000000000000000000bcb0a9dfe5189bc965e9721407b4cb3ed4171510aa4d4e5d5f0823a1c2827643e1278f9c0ee960c54ef8f6c208eee7b334582482a9038ab906880e43a4a9d39e73b6c63604eba0c8f6399eb5c288638", + "Expected": "000000000000000000000000000000001205b70b29ee04212589f8a70a71e004f517d3354e714c1b4fe42cf93faf1a8ed40dbc1b5089ddb53bb052c9cb74c0e8000000000000000000000000000000000f619082734dd9de653b61cf2fb927199f228637db70797bd2a21fdd48b6ecd4c4f712097037534024880a436fdd63680000000000000000000000000000000000592eca560be6ae256abe1796f7ec394a8085c127437f6590c8d41501a482c61456392cb320b9e801044dcba7802df9000000000000000000000000000000000a6d20b8009708ca01a274aed6dece732c5eed5aae5e4c2f3793b5fa1f8cb8c95037ce387bda2e7476e9c493507c7fbc", + "Name": "matter_g2_multiexp_99", + "Gas": 293920, + "NoBenchmark": false + } +] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/precompiles/blsMapG1.json b/x/evm/core/vm/testdata/precompiles/blsMapG1.json new file mode 100644 index 0000000000..07903a3125 --- /dev/null +++ b/x/evm/core/vm/testdata/precompiles/blsMapG1.json @@ -0,0 +1,702 @@ +[ + { + "Input": "0000000000000000000000000000000014406e5bfb9209256a3820879a29ac2f62d6aca82324bf3ae2aa7d3c54792043bd8c791fccdb080c1a52dc68b8b69350", + "Expected": "000000000000000000000000000000000d7721bcdb7ce1047557776eb2659a444166dc6dd55c7ca6e240e21ae9aa18f529f04ac31d861b54faf3307692545db700000000000000000000000000000000108286acbdf4384f67659a8abe89e712a504cb3ce1cba07a716869025d60d499a00d1da8cdc92958918c222ea93d87f0", + "Name": "matter_fp_to_g1_0", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000e885bb33996e12f07da69073e2c0cc880bc8eff26d2a724299eb12d54f4bcf26f4748bb020e80a7e3794a7b0e47a641", + "Expected": "00000000000000000000000000000000191ba6e4c4dafa22c03d41b050fe8782629337641be21e0397dc2553eb8588318a21d30647182782dee7f62a22fd020c000000000000000000000000000000000a721510a67277eabed3f153bd91df0074e1cbd37ef65b85226b1ce4fb5346d943cf21c388f0c5edbc753888254c760a", + "Name": "matter_fp_to_g1_1", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000ba1b6d79150bdc368a14157ebfe8b5f691cf657a6bbe30e79b6654691136577d2ef1b36bfb232e3336e7e4c9352a8ed", + "Expected": "000000000000000000000000000000001658c31c0db44b5f029dba56786776358f184341458577b94d3a53c877af84ffbb1a13cc47d228a76abb4b67912991850000000000000000000000000000000018cf1f27eab0a1a66f28a227bd624b7d1286af8f85562c3f03950879dd3b8b4b72e74b034223c6fd93de7cd1ade367cb", + "Name": "matter_fp_to_g1_2", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000f12847f7787f439575031bcdb1f03cfb79f942f3a9709306e4bd5afc73d3f78fd1c1fef913f503c8cbab58453fb7df2", + "Expected": "000000000000000000000000000000001672a8831d3e8bf9441972969e56b338594c5c0ede7bdba5b4113ac31ccb848dc2a2c4e23c0b9ec88bfe7165f472b427000000000000000000000000000000000a86e65037cccb5281389512673068d6f91606923629905e895f630059cf87fb37e716494db288958316c6a50de65ca1", + "Name": "matter_fp_to_g1_3", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001632336631a3c666159b6e5e1fb62ffa21488e571cffb7bc3d75d55a837f242e789a75f0f583ce2b3a969c64c2b46de2", + "Expected": "0000000000000000000000000000000019adfbc918cb74abc6fa0664dfe60697b233f0663665d2cc133478db4d6c9a41309ff09f9af9240037a7332bc42ffe3a000000000000000000000000000000000d31ffd63837cdf1cf2a7b3fe23a9d86c08f3a7c44ac4fa52d21b8c235f0d45f85c036d80bab332034635845deb31467", + "Name": "matter_fp_to_g1_4", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000184f1db9ac0fdd6b5ac0307e203d0b4237a50554eb7af37bb1894d9769609c96c8437e9d6d3679ebd5f979eb04035799", + "Expected": "00000000000000000000000000000000192a005eb944f391251402ac3d31c30f0b2d77987ed9928d244f492f96c1a0a06a7cd0be4bb3dfe3c484ab8ac5279a09000000000000000000000000000000000b99b9e7f0b51a2e0d12272fd0d9ae65294dfd34d45f30fe446a25b225316ef467b02acc3b6a578e054e612434096d7c", + "Name": "matter_fp_to_g1_5", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000732f171d8f6e283dd40a0324dae42ef0209c4caa0bd8ce2b12b206b6a9704f2c6015c918c79f0625fa791051b05c55c", + "Expected": "0000000000000000000000000000000019dbf865a67157efe65fa7171279049864bf6c280d3c3462e93425bbf25f9cbad6c27885d7927b5cdca642df48ceccd2000000000000000000000000000000001606be1ef7aaf56349e5179b01b89e172e463bb3446792d5210452905fcde42522f9719b9e7ddeb8cc3f227eacd55947", + "Name": "matter_fp_to_g1_6", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001139e8d932fc0ab10d6d4f6874c757c545b15be27cdb88056ed7c690aa6d924226d83e66b3e2484b2fc3dcd14418ee60", + "Expected": "0000000000000000000000000000000017d476fdf0be6b09206dc83cce64c603a6b911f051e9191a2473a1bc6b1dd2c6e9bc4d262edc936f62911460f0b648a70000000000000000000000000000000016f824bb325ff7f485a8e9d116f4a56ea71ecd2c11b2a4d119c208cf323bc62bf1e9fc609230c571e7830a956e140e47", + "Name": "matter_fp_to_g1_7", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000019a9630cce5181fd0ad80677ed5ad8cd8bce3f284cd529175902b78ad4915f0df56f0d8b37c87c9ddb23d0342005f157", + "Expected": "00000000000000000000000000000000145726f8479d7390e7a21cd31dfee0e6203115e72d04c5a735feb2cb688ff74944bff2b1af1b6368b4d095143662a1300000000000000000000000000000000002fd68d51753faa242bee10148c0e473f4110fc7b67848dfbab7d7105090648534854ba75890e099cb738d1dce604ea4", + "Name": "matter_fp_to_g1_8", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000002cdd00b7662569c9f74553a7d0585312a776c8638e54ad016f8d9d25df98651789470b12ce2626fb3ad1373744387ac", + "Expected": "000000000000000000000000000000000671b0f33b0f1ea3386e6876452989416c7171e283c4b0c375e840ea05e7fda22aa03899b50e59e9ca5a87039b2e732800000000000000000000000000000000031bf8caad5ce6a0d94f14693da0d551dd4bfd2c2163c8e8d5a448956153f63ce2ab72f03b97b560d67933887e83be1b", + "Name": "matter_fp_to_g1_9", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000e63c4d12a38837354bbcdf4f844e5dfe727ebe292016748007d162e74c1f849787767f7e77fc57a42783fe0b06c24c8", + "Expected": "0000000000000000000000000000000007d67999ac2fe6ab93591646905f23aead0d37ca43573ab02dc16c2b199086f788a8a1de6b10aef4f4d772b2e12e72ad0000000000000000000000000000000003700b150ebf60cacbb2b7bcf969b70edb57b34b5c772cdf68d42dc9f1513631799b9b9041c5e94595ea848e195aa730", + "Name": "matter_fp_to_g1_10", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000008d879e4891a891f2e7d27eb95aef70d5b785b796620ec43dfbb6ae550b4effb9f24210dc20f401d54420445e21cfdd3", + "Expected": "0000000000000000000000000000000006cf4af50766ec08696c9bc0d9617c1f0fcb0ea1bcb576179cd4537d9d31b373bf8e3c5f5fde2c21e44917cf1f51ff0a00000000000000000000000000000000050a9f7d8490ba2b6e49762cf2bfce557e39edb51ef03128b64267fd3c6b996e95d73b26cf1965d427e3445b1ee4d133", + "Name": "matter_fp_to_g1_11", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000028d6de947a3958af5b53578b0ceacc7ef89d36526d8f3b6fbe787af69fed2c85cad3001643b81c575a741c4566e617e", + "Expected": "0000000000000000000000000000000009fbbc6ba7ec2315dc18aadda7b2e53180b904c5f1cbdca1b2f42ed9c6675da7beb4007ab6639520c4736bbf2ee3f04500000000000000000000000000000000113f0bc737b2f3a141121ef236cbaff2f34502aa13e121b857baf327f7be66be97867fc6f752555835fdd01610e30c77", + "Name": "matter_fp_to_g1_12", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000182b56202f0494bd8baf5c03969288a1288b8ed8e6c7f49ec9f7493ee3369eeb42fa8f5fb7b243fb2bcee6be244f02be", + "Expected": "00000000000000000000000000000000047dd479fe99840150e73e4a8fa6be74a9b7d743e21cf33e9d7a9fd8700feeccd5111fb037eb3b15b79d5737ec4c7f0c00000000000000000000000000000000000ba7f57ce062eb9c67d84eee64d64d250a18454bd63dc5a136f5341214079eb9269eea7c4e0d836dd8be63a8a45c04", + "Name": "matter_fp_to_g1_13", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000016adb5935f32bafcccb81cf4d177dd8826013d85e11a4aad66e3aa596e1183aeb9d68eb8cf5b716a8a9445ea81b40d7a", + "Expected": "000000000000000000000000000000000e8cf94e68b03d1f6a3d4eac7898f143324d08f7544aa9f952947e9008d2c14e46236667173266d82f5e41887c6f614200000000000000000000000000000000089a1ada37f30b1f6e3a6613705992e9708d0437611f1de72a9f696ea5efea6793f285bd5badbdc20af64df8ba95c79e", + "Name": "matter_fp_to_g1_14", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000018bee24b0c97af8aec210f15bbb6acbb76168dabe16e669d5558d8d32f00fdf5146471922fa98a28f238974d327996a3", + "Expected": "0000000000000000000000000000000011e4919deb9eefd13dd0ba5184003ce34ff6c2bd8920dc49b936917a7b6aaf1c7541780b5d0e380e6c808f093a877eaa000000000000000000000000000000000152dbb758aa5f60b8d0703eb30680857abee717114b8cc5f6466e70856f19c76a88ec6c536e7a679c177986bf636e6a", + "Name": "matter_fp_to_g1_15", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000114285411713eafd395ee43bf1728f52d17ac512b9d0cddd38c904a9a3a1b30283a3918cd2cc3da6a7d6b4ff923cbb6e", + "Expected": "000000000000000000000000000000000750f69c43c56df2c8524b4ead9f6cb3ec16d3a6ec913254e585b0d8518e53c18e0e93dd4594adb926c51820de6001c10000000000000000000000000000000011f5c985ed12f72b6ec7e222dc8d93da520ac65476c716e231e7142cd3aca49b25dbd716a8f587006e4a2af31c37956e", + "Name": "matter_fp_to_g1_16", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000018a067f91f94b2904c5bb6900f427ec4e93374b5079c84707feabeabde20b5e49801f1f3c7504dd27da94d5e754df4ad", + "Expected": "0000000000000000000000000000000012652effba341826ee7bc3108404f5fcac84776c6f5fef5d440454b59f04afc2cc87f243265248445c7c2bfc14493ece000000000000000000000000000000000c0fd215b7c012da4532c882d7d7f83ebf133d58acaf8b5123c1211aae5929c6726410631c7f9347456448df643c9ed8", + "Name": "matter_fp_to_g1_17", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000dafa9fa843879038fd1566c319c24119989090c5fd34f6514e57f633d3709f0aa9954dfb289843a6990588e337b63e6", + "Expected": "000000000000000000000000000000000c444b07e9ee5dc366c63ba30f1b17087bc4c548963caafacf223f4bf5b5bad1f9b51433bd1942978f3f5e5696d5056f000000000000000000000000000000000453941626954845d89821df34efc6f81660684b08f03fc42da54119d10f1f95357ba75a0962961f1487df45b0c534ac", + "Name": "matter_fp_to_g1_18", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001742a98dd7d3671c2c64aa71023a0040e936fd726c062d520626113bed471e53ff3e85737e5abf9ee8821bae53135f20", + "Expected": "0000000000000000000000000000000013d5fcd7e4a0b1d7d8c7b242b46968519521ff8bc4b990a56ece26053d4bf884afd24a00670911f943522e06fe4f87d1000000000000000000000000000000000aab46534de37b5c6d206959a1023ad4f20ed5966bc3fd1750c1758ed806f077444ac70e9943b4e8debaecf208817a5d", + "Name": "matter_fp_to_g1_19", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000019cda532e5d94f3b193b3f286a038637a736c2b87b804efd4779359db5bd95320e06d6d28da3c229ae48ffc02303fab1", + "Expected": "000000000000000000000000000000001440f44e3964de59be03a6c69affbb3b44ffcf4ec4976361ac49c31a23f9f154f91750533ff2425d5e8fcde0974a91d50000000000000000000000000000000002031eb89620736dea022880e5188145f080537b1aec183db70bf307029be21a167fb6456bd1a47a75626280f78442a2", + "Name": "matter_fp_to_g1_20", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000018df89e4a545bfb825bcce2f4c25f2416a72e32633b3dead5205c8b7d69c78f119d0e940e5bde9ae1cf91574e5d6c175", + "Expected": "000000000000000000000000000000000a2d7297376216582c3938c2aab0a26494da7d9df45e1af7b4f826f064467a939ad99134be4c9b804b5bf273e082c4c2000000000000000000000000000000000b0a4da7cc585be1be6c091006fe831edb6f6eadbe3ef611041efa3d14f442c9768feb2958efa161e0adf5c321d7d522", + "Name": "matter_fp_to_g1_21", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000008ad60829ff001404da40923806e496640a90c5c258a41ef5912f8a1a20eab84ce43b2b5aa4aa7dc4d8b281591d23502", + "Expected": "000000000000000000000000000000001314d7faac7b4d5003baa10cc432108d6bb7f80bb13991f6ac45fd7a772f31cd43345ea100b05f2ad73e3bf583e7e7b2000000000000000000000000000000000eefa97eaf2143a991343a8823d8b362f77d8370421bd13a9a6cc4988544feb0cafd3a797a28d27f4f8d361cb7f49ed4", + "Name": "matter_fp_to_g1_22", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000000f13dfef4b3b83aa7f9525eae9913e10502e77c03c55a7aa2de083dc5102c098b6f8e36cb5247b827e30fbcded9e2d3", + "Expected": "0000000000000000000000000000000003ee4f3d29cd9f29a2e559a86d8204a1d65598e7788d585b145022de2c19022b122c1f10423d3bec769545d656726f5e000000000000000000000000000000001803f26af468740849a2737a42e53098b48c0709415247023aedb111c96043e3b13de300213e5196cc3b678f8be0696f", + "Name": "matter_fp_to_g1_23", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000010468e5421a72ec85b63f7f3070a949223105763868111424fd151c8365eb0307dbc9cbc92e5dfb296d06ddfb58d9900", + "Expected": "000000000000000000000000000000001800b9766f3e621ad7a8d1870ce16c8cd054c87d7fb100120a38c3368cf1879859645874b23297957fef6cd8f9112bf800000000000000000000000000000000091a8b69a1f4eb883a25af2a3a0d1e384ef7a9ba4e8ff8811ad356781c79f631ea20fcd0590e94b9c1841e6add2b848b", + "Name": "matter_fp_to_g1_24", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000008149ce856d489050ea834452bc66f7f3478c2056969354dca8652f3d0a349e40fae0c4c57ff0f5e022aa93c61f8c844", + "Expected": "0000000000000000000000000000000005fe170feabac3805c3eaace41fdaab2c9ae7fe609ba609f4ebce2d24c0d704d847efd510acd8abe5aeff2eb24e781b80000000000000000000000000000000003262879ff5c9831ebdd0de9df478923fee72a8829378f40cfec310a41110ad22faa759276e3b9e015c86c94c3594e0a", + "Name": "matter_fp_to_g1_25", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000006295de7bfec61f06a56fe09afbb74be968329e88ba2e87afffe9ea9bf646ff5b4a03d6088e87644958ced95eceeea08", + "Expected": "000000000000000000000000000000000e4110b2efc984c4d7affcbcf5cbbf919c55f948ac7412dc120d30774924d6020a2292f27b8e716c2b5045a561f2b14300000000000000000000000000000000194649f6906daa0394fbc1d45355e17d62f6c22a9e772bd7fa5149e29ab2ac6060d83dc5d70fad75bf3f2c7917b641e1", + "Name": "matter_fp_to_g1_26", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001443e61dbf14b6c6ed99e1917ecfbe5a4a23ab9bdd3bb089fbba76d795d715d9d2e3c7d8db0b7a9434ad691b68bad3b2", + "Expected": "0000000000000000000000000000000013af2a5f26d1f51da0d80fe7c62369ebbec235faf4565e62ba475e6f58418183efc8b9906196ffda72539506243e0482000000000000000000000000000000000774f3096c99bb826792cfd9243d8cbb1bab54fccc3a6347daea74ff1c8aebafdd971b7bfbea5b9a0bce243372caad6a", + "Name": "matter_fp_to_g1_27", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000b14b12ecaa94f9656be54772be9b22a2495d4ff873b0bb971c27ab1d8b940c84cabcf921f6f75e93942c38cddeb8750", + "Expected": "00000000000000000000000000000000107c66e91d518789be416606058cfa8e9df478fa097241fc109d065005ae927d83563b72410e5b207d1556c2ee4dd67b00000000000000000000000000000000148c208e55e834c4e4fe20c02f517c21030f60c74b1a3bcf70bb2311cfb9b7548837b9187910bb7e8d1faa40ca8d6d92", + "Name": "matter_fp_to_g1_28", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000019eca0daafbfdcd3b56be863dceb21e624b22c0d376fb92ba606456ce3825981713b88e40b7fd801e915f97d5c29ba75", + "Expected": "000000000000000000000000000000000fa72de55fc2229c0176120fac3e0a64c4498bcc7b67ca40b92d47a76a9db87ba498b72f06345c61d59a3d37c51153a300000000000000000000000000000000001f0e176d0987b8ceb7ca0e5ebb491bab0be17282cace8e03d52c986483026180082f86196fe512ac6bac58ec4cd024", + "Name": "matter_fp_to_g1_29", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000104a452343a4098e9bf07380a8e52050259da95f5fc88f31511a08090bda85f0a08d49cef95bd26c7181aa3eb0be1222", + "Expected": "000000000000000000000000000000001655eedb905670d10d2f979962e864d68e9491aea41d073a6119e5bc0ae74216383501a48343d7099b93601f8b67c00c000000000000000000000000000000000842846147959f0f81efc6e8f515a9c59456637740bc15b2d335e0de45890cdd814ca7057c5d3e49e48e5a250c5dad25", + "Name": "matter_fp_to_g1_30", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000012400aaec3d2f4a1a8cf3f28fd396133c3999c074a565c110354472ae29479b9b62ab67128521c2c6ec4869811ba760", + "Expected": "000000000000000000000000000000001098de70e8748daba7bbad52ce344619d3b5374821c1f932a18666ea0a591b24ece05004546cd519ba4d78c9747c57cb0000000000000000000000000000000005f537b6a394458ad51c2e677b2d52974a714bcf6a7474e748ad7f1b28738b6b874b6f49bdf19479bce4ff6c6a47de1a", + "Name": "matter_fp_to_g1_31", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000093e04bfcbd77bc6bafeb77f02d0f794a20b155435ee3af1d667c025e7645d9387abe0ef281386339f461352da93fbe2", + "Expected": "000000000000000000000000000000000a27f7fde0c79210f4b6cf59c97ac773c9766fdab289225c97f6cf42179385cf18f47f14b7e481df7c19418c79dfaaba000000000000000000000000000000000874f21294205152df3a4fab2ced482d325274886d8105b61668074dc8fc90240a715c62b2a2864901ca7a30f12e76a3", + "Name": "matter_fp_to_g1_32", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000481ffec570d4e155ec10e0cc58effe7a5651795d604cfda6cdbf011676772fdce2c25227e7d5a1a26748d15b1668091", + "Expected": "000000000000000000000000000000000a6fd7355965c9514dc7237efd262fb9dfd8025ca2c56165e22675e615095887760ecfed4a2080cd5a2b8041ff26578e0000000000000000000000000000000019b1e02c9258fe62160d92eba8640ffd79b3bffb8ca4d602ca6c059239047c5563049758911d0e6034a25ec5094b1f33", + "Name": "matter_fp_to_g1_33", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000013a3c5dd40f7d7fbba7563331917fe19a093d5d25ae7993200c39460e0c46d839e3958b672b4ed195300f398137faa18", + "Expected": "00000000000000000000000000000000013e4cd06b8ba7b5efb70feaa03550bfa45c7c2c79033c92b819257b2ddce28d501cc836a5ec81bf210bed671bfa66f100000000000000000000000000000000165d806d235d41f21e961795ec3da4f1b0334ba6e71ce384445bfda9e5d89e448d00253ec9f8d49825a230b25ffb2848", + "Name": "matter_fp_to_g1_34", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000255bc4d313fbd61a270dce8c851f1fa09e6ac5dff9b9e8dfc8a236a1d44548cb079023ee9b8f0f5756b39e44489c3f1", + "Expected": "00000000000000000000000000000000067c19b7c3dcf8b43d6e83dbda7406f5f88b06cfa0d7d145201164a1f06cb5549545ab28fd1ea8c1d5a662cced00822a00000000000000000000000000000000013aab7ac4ebce4686ad8a05e4eb2f60ebdf03c4f4ca0111bb1cd3dd5fa7558f1cf0dec394d0b616cf557f3811bc2104", + "Name": "matter_fp_to_g1_35", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000ab7b4dec955de92224b234c2d8bb2e3881806c2d36a9a21036e9412f0a8d3946027cbb65b5dd9c975e01b3f235b883f", + "Expected": "000000000000000000000000000000001673e66a7e558d533be5b855df7c3bdc58f1fb0a3b268b84b4fc25a3a8a211c4c9c8d884fc62f00eccbadbc96dadd7230000000000000000000000000000000016265b691fd43045567ab4fc7e7efa63c8430c8130761b128f0ba7bf381a7cb81bf05aea2526b50ff6e48a87c8ee9cf6", + "Name": "matter_fp_to_g1_36", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000ffbb55002d9e926b3d8e7d963ece82c14afaca8b4d8415df8f964a39db606ac99f9e442ff69f7ddbbc4ae563b836192", + "Expected": "000000000000000000000000000000000b36ad42aeacfa47d77f045de527d5bd4fa5fcf25ca3caca99e3e7980e283278e013611d1bc7694bb0b1b86d8589730700000000000000000000000000000000136290ed913b8669f522e16103ff42733a57c1026f966facf4a2d385b0bd52668925d748760975ca5a132d00deddf675", + "Name": "matter_fp_to_g1_37", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000103469c08562f6f72152db58b48811b0098b68af8de00e652bd5a67246459664cc8c54e15705d702d51e3f1d8ff76a77", + "Expected": "00000000000000000000000000000000076fef7b61f4c687246991d6f735d6f89c953476ffc193bacc1f3cf9573ed47bfbf6dcfbb3da1ec1bb764a9cc9b1c26b0000000000000000000000000000000012b6bb88e8acd6cd0ef1929a79bf4d8b10ec3fd575fe460686921fe94aa3a472cbc7aea543ee6284c368f5ef2c33ebc0", + "Name": "matter_fp_to_g1_38", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000059b326dd567fb2f8a6ae87f41fb22b3edc25122138a5f6732edb48ed7fa1949eda6144297f54faf406d873a016a1510", + "Expected": "000000000000000000000000000000000bbc25f7788b0031f1487ef154e877c5ae277a80d56b3a24a39c3ee94eb7df81a47bbff233c1baaf700829919e5254690000000000000000000000000000000019fd9d1237b508d06d7b2ff807c15c3ab36e6eab7e5b9f145bb2c0f2ce8ec96ca3a24932076abfb74eca85744eee4044", + "Name": "matter_fp_to_g1_39", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000bd594d2f5e1472f85bfd550df3eb948085781459eb3037fab34186ad9a0204a0767c8fba571af858a054dc231931b80", + "Expected": "0000000000000000000000000000000015eca2e3d36d619601b0f40b01add7a708bbe59d04d5dfbf12d6e473e252505cec0cf7ea1c420000d49221d5e1ba6b91000000000000000000000000000000000cc6045184317aaf2bb8a904755bf48df9e6754e3a864037ebe0218eb3cd1c0a54e50b95f9e6d318799a72fac8d4e262", + "Name": "matter_fp_to_g1_40", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000087b8398406c1e707fe87a16118e2448d6a5f4fd1d6c9d7174c4d8a4314fc7b2c21f04178533480976dd20e28b278ad5", + "Expected": "000000000000000000000000000000000ef0a6307d4a3e92570cad673ca5212780902de416e81d15638ba654951f442e852b53255d7bc4d4e71098924d69f5a600000000000000000000000000000000156abf6f096326c75710300578f0cd946536e16bbf80034c6dbfe454565a501c268135118745989e5274ca2431ca5155", + "Name": "matter_fp_to_g1_41", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000673dface7041c3d7503ce4a50af946d344ad48327b515740b45276403d91bf1ef9deba79c8ffa0126be990b62bf3072", + "Expected": "000000000000000000000000000000000dc94ea6018ffc5838cb7cb00df9625c0c09701bbf19edddb735a3659b385bdd09e9a7d6e869720b727ec59ff3956d9b0000000000000000000000000000000000a20ea6360179bb6608bcbe4879df186916ee71b3ff7a1dd0fd137a0e9dfb135bfda2c66d1cf8d358d69934012a1a1e", + "Name": "matter_fp_to_g1_42", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000adb42b7eb0f6759a04da7b933bbc2b6aedde47da8571d6fa32268c606dbafcbc810844017eb6377493a12d76ca56c03", + "Expected": "000000000000000000000000000000000b4e11f70679333c064d06180df6b54dd1df20ea216415ecb9b704bf4b206141fd841770ab77de4ab2400a076cf9dd04000000000000000000000000000000000ad8c02345e141396401221bb36a2ca21096e89aa76fca4121066da74f2f54b3e2c4049483d9855b7f3159ef448c120c", + "Name": "matter_fp_to_g1_43", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000f554e52c4a6c5a94fd09c617f57e8f87af57e73ceaee8997fc62c8ddcb2f875ee805e6594a0fb72738abd3cd4748ddb", + "Expected": "00000000000000000000000000000000136cd8012cebf1639a396f331f73f0da6c114927559cc595f01bad1a18046ae8364858fa262ae04ae3f3b7d13db55a86000000000000000000000000000000000393a915629ccaa9ea06be749f3053dfd07061cfa24bc0aead12622c7d14c085e2994178bfec98b3f8867ac5b4b7a05e", + "Name": "matter_fp_to_g1_44", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001876dd03316ff007a2efb4c5f452d8418edacc2881b20e8340895f6fc768d14fd89bd9db3dcfb53fa98a1e96055fa83e", + "Expected": "0000000000000000000000000000000019008e485a0a9c2f73a79bfe31782a17952edebca308bbc9f90e2ae15525bd501268a1c38c669de0b4e4fcaf1194591b0000000000000000000000000000000009c35254702eb7e3213fcbab62946ba79b7375cc320ee1733d8bf5729d378d1a98fb27d870e27c13626c35cb00a6bcbc", + "Name": "matter_fp_to_g1_45", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000e8b2369fc2c584d78d52037b109aecc87dea0eefc2da46948b5535ad19c9abdb31aee66739f4852a2d3c51f2e7f74e9", + "Expected": "000000000000000000000000000000000059a3315f8b6e75c45e32843b4ff2401c41e1f6716a5909894cfdc71a49253d2cb04ec416d204bf0bdda051ace606260000000000000000000000000000000019cee852aa9fe28e1da49dfbfa7901220616f464ba447480c2421fd6d3a5a818c778510a04cb6557d27f7ef9a78f2fb8", + "Name": "matter_fp_to_g1_46", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000168b2d3e4b67390cb8ba5e48a7a823db08edee7d8eff41b88cd653cec1fc0df7a55303d3c91e92a2dc8ebdb327b225fe", + "Expected": "0000000000000000000000000000000001d157c963811725ad533539f17acd16ac3aa22917ecb2198d83a3ba396955f2c9654c02fd42e3d4ee6156cd148e9c270000000000000000000000000000000008fd299ddabfe525075f548a31ffc990a3626aba0369bd0accd0e1968204c8e1085c6b287b370808609178ec8ace2d0a", + "Name": "matter_fp_to_g1_47", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000016cf7b1a9ebafbd20c078948fc974bcca9b8069edc1ca5e8f364f8ca2a52e56e1a424ea6bcc4240f46dc7f262760bf48", + "Expected": "000000000000000000000000000000000ee6b51c5eb4dd9c27a61bc2f3480d799cc4fb88414630adb3961508c7067bb186682194af406f811296228c068e6415000000000000000000000000000000000b878c207bc4b61e827ee09a7825fb216a63ddbc4ef0522b8a944bcb673ca368996c31e6513504c5deb5325ef4df0459", + "Name": "matter_fp_to_g1_48", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000011a6a67d4501a8d9b3ab985be59ffc41e79c453bb5548299abff3b83ba9ff951025a68fe6a8ad3eef3c02d39fca8f909", + "Expected": "000000000000000000000000000000000658d61bbb2273e8969269dc16e16be93ef82be0668c3a164097a1c0816bb4aa94e5f70ed8d96bd15d9acb602d70f8ee0000000000000000000000000000000008f696d49a5c6f3dc971699a5837f7b3a20e222d9559d899eade367ce684b60153dfb75a9a8b81d7359a93069e2d7d7d", + "Name": "matter_fp_to_g1_49", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000010e53fe9fa94ca622cfa370129c1619b2426bd9d50f4b5eb8a3f681479128dbe92adde15477ad8a4463b08f1a02a62d5", + "Expected": "000000000000000000000000000000001313f4cc65865c367cb5c1c96cf30c7e993207e9ef4b2fce9db01181b1192520f01a0428668bb9d33eb857d9435939df0000000000000000000000000000000006b5e883fc24585de3b0a0b83cc1742050e578cb57e89b385e245da0dd2832852c3fa5f31ccf55e6744e9cae6c2f705f", + "Name": "matter_fp_to_g1_50", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000014d10a90709789b25369f0376f39b16860aee1ddc3a4340542abff0077a4af8da946cc29fb6afd9930b872ea98749be5", + "Expected": "000000000000000000000000000000000f3fdb57966f9ffd0e20b9ad3bfb4fcade56468aa598cacfe388cd3b647d5966350586daa4493de23703a1debc82e48900000000000000000000000000000000044ff5ce3b9bed637709f9105bec0d86b4f0ea2dd86c9c3b1324637cd4c0fe5a4a965021c51279fc03592414e7968d23", + "Name": "matter_fp_to_g1_51", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000194612afb777e39d0308a290bf823fe706487c3473412d1410dcb2c0016a70706e70e3a009c0bd61e755b1e4c65bcad0", + "Expected": "000000000000000000000000000000001288807e8f49323b39c5d592b97f19cf76f2f642dc4fa704004789d28452ce7a02a45f3f83a8d9875480d380e76df09400000000000000000000000000000000123b15dc7f166cb7c2c106cfd2f7c321a9bea9e3bdd118058c4745b6666a0df2a7c7fea16887a4c85faf860fe48a3787", + "Name": "matter_fp_to_g1_52", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000ade016d06179faa8d44a9ee2542058bb81724d6af2954c0c09a897703d364ec25e62a3a917c5cecce5c96a7cfba924a", + "Expected": "000000000000000000000000000000000adadcf2f074679ef3523c10674260b0e40106cca8d94b05f83e2b27d8da8c00dea4215a30275ea5e1a8fd0beb45dfb30000000000000000000000000000000003c2d436e545163abbb18ff7c8e6db1e55c733c75f9594c695c66656690e88995f9f266c2620e99075d3b78805e3ad41", + "Name": "matter_fp_to_g1_53", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000005aaeba19cb0baff9a8e46b901f15735a0c1f45116fe1f41c22fbe1aba22c0a7678bd4799db5cd9141f3112877e2c5f8", + "Expected": "0000000000000000000000000000000016cf855c1ea449c47236065ffe53a4c6afdadc08f1eaa26a8f79ea92a7a119b26dea1dfdab4db9b02b3dcad2c077338600000000000000000000000000000000071924c7d4e6aa5234dc921d288dcad3e49b44d2f455d207f3641f4b5b5c809b84c04945df08e785b3d99eda1807611c", + "Name": "matter_fp_to_g1_54", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000003f54664746a5bc6f64021e2f18d8c175d96b1c8ce895809c0e6fcfbe896b3e8c1ac7f7556b9ef953371bb143bfbdafa", + "Expected": "0000000000000000000000000000000016d80d4689e959233f05a3266628e233b747705bf6d6236771d5e697da03a0daa2dfa88aa5a3a5b97bc4517c467e94510000000000000000000000000000000003bc451286fec0e7a01d29ffae4986a2a3371d4aab875547cac05f759f5a52b8cbf84798b5b3d664a8692b212d4e974d", + "Name": "matter_fp_to_g1_55", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000010ca243fcabbdb219c5b30092d9d4595a4b8ad1cbed267229eb79a99aef9c5df03d8f24b71db77a5a76917c2fd960ffe", + "Expected": "0000000000000000000000000000000017297cdec2f6a54cb11c1fdac799f252c72dad52ead6c29de61d64e56ea0e0a1d3a60284029323e35d38a4a25f82fcd60000000000000000000000000000000009beaeaf3ce2c9bfbfe5e04ceaee87460d760c4c16caa7b37767e16b8e97cf08bdb6d30472b3027f66803dec1ce40eee", + "Name": "matter_fp_to_g1_56", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000135d8d92f075c219f8012ce6aebc8e48443b2f33382479a4ca8db0a4f92041d5b6b1e5818b7a3de77a5d30be0e461d13", + "Expected": "0000000000000000000000000000000015a163067e8039be1c365804887dfbb78a7a699f0308c8e26519bf1c86fbe6acffaa26f0e5a2a380d1c704fe84d3bba60000000000000000000000000000000013f94e107625aca9c4346102dd5f09d51e445fd44ea67f171048e8f9965ce3496e759610c078404d41add90a358af482", + "Name": "matter_fp_to_g1_57", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000013e042ccfe0cbb7fa3b045a1fa1a86f199ae91721aaed488b96cc4f6de1899402f81842da2ab55c5bfa63f5b19ddce73", + "Expected": "000000000000000000000000000000000b0667e2b7c0fa318c5c0e66425f8cbb8217bec845bfe56997cdb9d0d915131b81e82419a4533eb573ffe103077f35c90000000000000000000000000000000018074b6e0cf144fff9da02a4b5785d21762952d4ed23b1430d6165974f49521b73eaf98973f7967ffb35cee92a2b5269", + "Name": "matter_fp_to_g1_58", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000063cee89d1981f27a4f4d4f23c4d1229fd3333fc8f371ebd85c588e751307ccc75d71d151f7481ecba1ef0cffbfdea5b", + "Expected": "000000000000000000000000000000000b5e953227f4f5e2070482cde7fded231bb0d4649a626d356cab2bfcba6c1588ef38c62cb2c550719091206727715dec00000000000000000000000000000000095f29eab98321d334f22b4db0c30a0604c5c385fd222a71399763f5c815e04226d9d06b460b9e3b44d1ec127d20315d", + "Name": "matter_fp_to_g1_59", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000e07265d2762e8e398c83efe1c43452d91b90b7a4271c09ff693c83745a6c01b73561ffe3da9300c8e7e1602dbaab0bc", + "Expected": "0000000000000000000000000000000017946ce626cd11556f85d15b85044fdab0456e24b5e331886be860bf55411a03886738aed9b19d52e91a94ea5cc5f040000000000000000000000000000000000cbe613ecf3c8ca8a5f0617c64647a609ce6e8fd40ae42f69a928f4ba78f7038254689bac2dcde7a464a03d5e26e34ce", + "Name": "matter_fp_to_g1_60", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000375579c16a167fd9f9f61d5177705f157aa0df3451971029a9444432db119fb33b8c07de33fc822eab46ed4ae47cf82", + "Expected": "0000000000000000000000000000000003b425300fc1885f2e932a469a8137bbf9df9560279a5ba87a13e7d4a461489bd8005054f14fad881e06aa46e4333d920000000000000000000000000000000011dcec636ef785d348fcbf9c59a82080b8f2c02d7ab954bc17af1c163a5383a36dd3948ac9110c6afb363ccfde2b6682", + "Name": "matter_fp_to_g1_61", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000aaa37576af2101d090139f562edc2a6e7169b0150af831d053a3a87a3a5518889a51871e02deb3ec154ccbe9dda46df", + "Expected": "000000000000000000000000000000000e545a87fb19f7943e18c75f7a173d18ef8129b200222bf6a2ba5a93a92c47ba7accecc4f089c42d6c6bb2425bd1786e0000000000000000000000000000000008c005ef6e5b25e84a8251add6112db49637c2b955af8cd65d029f8e17abfc660794b474689a00b5d2784163a9a0c241", + "Name": "matter_fp_to_g1_62", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000158edaeb58b99d9442d608bc8e6024365e9a81e0aa23bbbd466c9ccc8d29415352a153e1f852666505ef097122592ecb", + "Expected": "0000000000000000000000000000000004cedd2deb72d9168ab5704e21d9a5d85b65ae1510a628515753e85425286d9825dac99922be4a19870700956a65ece9000000000000000000000000000000000f5b0efbb2b327e294246fe862ac01dcedc7e728b938edb9c4a6128740b7d192cf8ad877b869207fb6d1453d85db895a", + "Name": "matter_fp_to_g1_63", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000012bfaf34a8111a01d213f9a9fc90846335cda978b3df23de99cb7b764cf5db1a816f66adad1319aa7e25c0ab89e7de74", + "Expected": "00000000000000000000000000000000031841f58b82f7e44aa03f474f18360128aa5699e748e4e2fda1c29d3cf165dc3542b90f09e415e92d73a162af38ad52000000000000000000000000000000000028cbb3ff58cf28f6dc876c2c1cb147bd6af85f3baabe253e9a1dd69687b3a46d4604d2d92d08310ecd7c90723bc7c2", + "Name": "matter_fp_to_g1_64", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000000fed118654a128735fd39ffd3b381ad2d71479054b6bccc04dd58fbeed9b255ce2b925e2141a96a12edc3a19188d1f5", + "Expected": "000000000000000000000000000000000e378bf9d1d65cf3a39dc2b3cd2dca8954270006abe048cc29183c5e7c1cf464b21a548679fdf5af8a31e198b69ded53000000000000000000000000000000000865c90b45eba1979e433f71c93c7b3b8e90d3d12a3c2153ab7c420f507bbf91edb593d3beb3899e76d41674b5ca33d6", + "Name": "matter_fp_to_g1_65", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000b693fe53cbcd6f8d8c98900be1f9c85966cc644f0a900c70826c6573ee801ce7863a0b170ce0ef168fb1f0ea484b276", + "Expected": "000000000000000000000000000000000844679db6a74e2a1f7c342771616c446c5e240e40e1f994fcba49f8ab22a7fe06b6909f50ea3c49a8fbebaf2b22b0a000000000000000000000000000000000090afa19255f7b71630c466d6b180b2100f8ea6b7ee2085973e409af8027859b61e0c46b639120ef6f3ee1555aed2f94", + "Name": "matter_fp_to_g1_66", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000c6bd688fb883f3097f8b6fd6fd0bc5acef9341f21d62a0706fb3625a70459c45a5200ee36a3802d4bb4912030bfcfc7", + "Expected": "0000000000000000000000000000000009ffb2b0054536d714944c6c96f8c1ea902e7109d4917a54ec551d811ab15042f843e158a9e4decab9761cb10e7c3e24000000000000000000000000000000000a6c7a862b951aa9f8c2d1e8ba30af8b7909e9721a06479d186e46ffae3ba09f5f52561c7c4c34d121be1304650cfc6a", + "Name": "matter_fp_to_g1_67", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000ba7f82549ebfdc7f4959dc67cebde4720d76d5d4742af730d45d614133f0a7b0ae7b61ba5b914a997d9dde83b77b031", + "Expected": "0000000000000000000000000000000001f9035574fac4ddc3f114a79938105d95ad4947588028b60e2926a8e0fd78710434edb2ab6b761fec43e458e19f0e200000000000000000000000000000000001e86d391172978aadc652b1c5d28dbb26a5357d1deb522bc280a270cc63cc18284e5b05033cd7ce1a6eb962a5b7e268", + "Name": "matter_fp_to_g1_68", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000b4acd8c203ebd8e3ce12b10cc791b9a4183440309f24bbd60cb2991712c792ecac64d3f878cbe407fa8ca0d09548acb", + "Expected": "0000000000000000000000000000000002583631492e3e0bf080a5f67334f7a2907c707a678bf63d53badb3ed90305a6eae895f7842a5d44a2110585d412ed860000000000000000000000000000000018719d22fc604567689870d5a5b043ee7234927b1e878dce88be212a8b0981e64f3cf9e03dea94439f504c846c6e42f9", + "Name": "matter_fp_to_g1_69", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000145f6f774d943a1bb753d5d4876b1a88a4021cb6a6607c0efb07eef2f90ba2a90a6e9dc94586de35f6047332553ce7b5", + "Expected": "000000000000000000000000000000000fc1acd8490dee632c51e67356601295291b107087efc2483c1e1a41fedcff244114608c49f6911a4249a59a891264140000000000000000000000000000000019c402eaa9ddd6ff3c72a7d3bbc736cc867b437dbf56c9941ffdb2e0cd60bdb7ccbecef3d62aad22e97c1d96a328e8db", + "Name": "matter_fp_to_g1_70", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000b892f1c8d001c8aeddf845c3845c51f2e06c3c77e543e9721d797951b6211a869da97325b569e0de35cf3beda853ac2", + "Expected": "000000000000000000000000000000001785abb82ace5d8024c97b3480fa69a65f5ed48fd3f5416f068690f8f79295d13929d01922c562277f65293abf5d739a000000000000000000000000000000001076dbc521375a1431b24f7d03902491b80b1856cbfd3e759b520927fc559e705801460afaba6991b032d59739c25059", + "Name": "matter_fp_to_g1_71", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001878e791993186ab76f785b2c6b0fe08588b048007c66fc00c695b55bd17b37bdba71f34ddf75ac441a0c2687711b299", + "Expected": "000000000000000000000000000000000bf99b7aa1dd96f57974fd79d5823d1f379bc0e32ce416e6f89a499b82727081aa78529dcc76257d1d699b9979ee23f900000000000000000000000000000000067044e8b0cf455974850859bf76bca780f1908beb06a64a7ee8db2ed54703431c354cc3d7576fde0b45611a2f49f862", + "Name": "matter_fp_to_g1_72", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000016598f630f72a0e1f39678e1d0ec6530c4795d7565c5d026fea2389ec0ceb51b434b532466fbb1c92c1c958041283baf", + "Expected": "000000000000000000000000000000000d102c354adf7380053c8b0c11a5c15b046516a87b3e98d1f909bdaff06eebfd9b0c457ec3741833da262f77d411cc500000000000000000000000000000000012cfcd6910ac046ab8c0b448edca5847d0f8cc2a4633fe42edd223ea1b73ec451de8d75cc3d37dfb741ee35259b34449", + "Name": "matter_fp_to_g1_73", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000134725b4d43cb87d2e4d3c43ca98b8df257acfa612ccd61dc0aa1ca749f20bd42c38d933d39f8c3c1a14dd8fec433292", + "Expected": "0000000000000000000000000000000013c11f82052df6294da64b16551e689c439d2d27922bef2a067bc49eb4718a392693570f3b3e58158dc0f5bc3a5b8f73000000000000000000000000000000001517ee24f199913c184181561823d7c3506caa09d93d506c7773f9f615169df444c9f09b518e840735c259ec02488670", + "Name": "matter_fp_to_g1_74", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000070ad61a7f5ff9f0b4e7483f5d56b0f315b5f6545b194565ebcf8f0b8d78519ec113af6d70550888be4d661a8403a036", + "Expected": "000000000000000000000000000000000a546a1f4d65a37d7d60468c18f72152473feeed100119b4518f4c778a7a37a23e8c60ee04cc0b39d5a1eb8c908856870000000000000000000000000000000009c5766d9c88dca87768c0aff4160ff0fdc3aa67dde3eafcca030eb295a6736e95e415f3f5a443f2545c7fbd01f97964", + "Name": "matter_fp_to_g1_75", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000179bc843fecfe713f6e3ccdc8ca0f48759459b675c8b96f5403e1f6da92c2d60449638f564ce179373bce473669965d7", + "Expected": "000000000000000000000000000000000a197b81c0950b1b802128a01e3b620fb2134115a0d1aa2946a82fd22e91f172785d19017fca385863ee1643bcd332b80000000000000000000000000000000011fba5b82b0b2726bbe7a6157ec9103d0b5a480066ce5ab7120294930b81c04cf6d0fb8b979d17c3e262bd1268bdf1aa", + "Name": "matter_fp_to_g1_76", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000082bd89b49aa62c94ecd4244b3077421569c71efccc62aed3d4bd492bdfe57c0d2cced568df5992a196a7b71bcbe5e3e", + "Expected": "000000000000000000000000000000001644dd543ee92960effec90347ffe5f06d6b087f13c6bd73dca93c9e16818d25ffafe3610260cd43ce9909e2ac2e2884000000000000000000000000000000001893436c9dc44500be831076b375d0feccfad2a126110fbcfb77acfb95d6dd6c6615b4b795c007ece6ea0c31915b8e32", + "Name": "matter_fp_to_g1_77", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000fb118c86e974734fc434c3bcb783e4a7f9251d9fcfb9f4419529354c8a7a3d9f2215de2d1b9f0927b185c5b4db838b6", + "Expected": "0000000000000000000000000000000001aded655b8ba2739b820b894eefd7e60d11889d7321fdae5ddff5dce11551af24acea3f501044562237fe5df53305df0000000000000000000000000000000010f4f3f415891ba4dfb21307798329aac5baea98cdb44354d4263e1ee6436f613a3accf06802ce2c2782e8a15738bc63", + "Name": "matter_fp_to_g1_78", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000004da0ce78f3068bebd0a59bc2e41e7ade737375f07d6c9ce962be022856c569a33e8bd6ae60c4bb1b53b3ffc2dcc2aee", + "Expected": "000000000000000000000000000000000be0b580d0f12faa809d589ba59c5810c18f74b025e6dd4dc49c83b6a39423c5cf82b0dbb1d750e1801e37a5291692fa0000000000000000000000000000000010891c5bfece55dabcd223518167c5b0663f65c001ed051735635b417cbcf2484a057522e1c3417e43c82095b0cbb855", + "Name": "matter_fp_to_g1_79", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000001f43b86ec24ad40552dc4874a632b4ff4663eeefe1a8c613a19a798a0ebe321a3d543e2df28277944a941b4586ac770", + "Expected": "00000000000000000000000000000000152454ae7fed9c971cfd72ed054f44124d71542f9ada5a90f1601114289c93fb490a1c5d99b3e8c70fc44fd10322173f0000000000000000000000000000000017bf9499bdc15ae5091daf41812c74535ca31b56520e420edf9e5aa90795ce5db5fa42a06dfcbc7438e954db83f09b75", + "Name": "matter_fp_to_g1_80", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000baaca6bc34feac790807b5eb5fd173c86c12803b76b50be59b2707df765bd10eb467effe34f8dc3e1e79df8a54fde38", + "Expected": "000000000000000000000000000000001633516081b91621b786a09389e89b274c2d9ec616db5028b009ed5c0a1ab47695a0b95c53a45112144613a4af08e6ea0000000000000000000000000000000014b09586f75c939fd62c3d667ab6263367f8961ad4597f1b92d792e8ef79a469137dfba5ec0a6354d5bfe3a84130bc65", + "Name": "matter_fp_to_g1_81", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000005e4751707f3ea7bc7a74d80eff27a0d65cea0c3d2e793425e79cdb0c41e6ad0cfcdbb4de604637c41dbaf30a1e816e6", + "Expected": "0000000000000000000000000000000000f0474d596ed86a0d664885f9c981228fdc352755d52dd7e979a85fdb1b6dad106d8bc0a1eac04b510829b7da496686000000000000000000000000000000000a72f532897f912eeea707bfd6d183a73786c7b2e2c80a01f3abe7b959467d6ea63093c16d6465382a7808d5f0edd92f", + "Name": "matter_fp_to_g1_82", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000008f69021794d93826f8207b96d49214b46dfb1778603634a9f5194e92481465702a8be1bc49a7bb57527fe6f963ae04d", + "Expected": "00000000000000000000000000000000139ae959f9b0cc2d900e748220c4bfa7dbe22926d8ecb9a10e7d713fa0a6e147fa3463e06b791a5e604c66110b77f7530000000000000000000000000000000013f8d09915f77f4a18854dc2451cf39d7ff502a8184d3b4c59ad3317d62940e903d68836751172ec0b4a796db003b373", + "Name": "matter_fp_to_g1_83", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000116988a869cf552b2440e16569d8b6e30c6b15430855c4d6bbf80683c5497291bac7999c1f8f08f494fcb4a989451c3b", + "Expected": "0000000000000000000000000000000015d065191ab63df2175f821cf62a4b948a6b2389512c7e94e1fa3c99506af624810ee17de2c183ebd69b4dc485ae264b000000000000000000000000000000000fa8cfd94bbfa6d504497866c1e0d9e84717fbf0468a164e3b8ca46348789e2b7f08ac5e8aa2e7205062f3d5083dc5fa", + "Name": "matter_fp_to_g1_84", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000e26058d72875fd3d852aa4139f71d35e1edb58242a4939da7986645117d027d20baf85770fc909d537524244da59ce7", + "Expected": "0000000000000000000000000000000012978a0da7162aa1e8b32cb6ec0eebf2c2e62350cab4534358c6bf80299dda9281e16ee40313e7c52c804b2f4de7f1870000000000000000000000000000000009dfbafc8e40d71a789a52d5f8b80e7c8510c58bc0774cfa84211a9c1417d75d5c7b06d7aa9fe052ad9c1f30c922705e", + "Name": "matter_fp_to_g1_85", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000078c6cf89561533810b583a88149586b29da5228ced10a75257b2587904217f63499d8b9ad2d536617247e12f8d1657d", + "Expected": "000000000000000000000000000000000de98869442b759a382d0f6ca45eb60424eb9aee2efdac83086cb6dd374120941343eb314756113e084f943cb60d91470000000000000000000000000000000019dacc8180e6dd09ac4bb97114d2ecadb04bd2aef6e5f0993742c5270267e42d052d436c99ba61f6c0fd1fd2cd51d172", + "Name": "matter_fp_to_g1_86", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000005b016ede9d892fbd7aea4e8ed0f1eab70713557311481735a91308fabf76fe71e44a06dc23ea66ac5d831e982f401b1", + "Expected": "00000000000000000000000000000000123313e3cc006c4b95938f5eca903604ac9272c7a0c79cd932407b70635d7ca5de9297496c27406f180d5edebbb54c7e0000000000000000000000000000000002164460e59cc8788c96e235a6faa7fadb7e6ee9f6b0b95292992973ff54a92147dc7ae8e8f217515b6185875bd0bd7d", + "Name": "matter_fp_to_g1_87", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000007160f36f0e5c4ccbcc7900c6504cd86fd6fd700bfa79af69841e4a6127eaad467ccc93c66baf7d767c3fdb1f31c527a", + "Expected": "000000000000000000000000000000000393a1b2395447b2e2838c2f49493c185424c4848f888616f16a95552671ff28b5ef223bf34299005f22a8df6efd68290000000000000000000000000000000012b1fe46279922e92d356355752ae0c2f28fc55de39ebfbd317a6c1c507d973f88c6282468571a1efc20c10314ac72f3", + "Name": "matter_fp_to_g1_88", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000043fe62b0b9be76a375f3be0d6ec891d5bf5f2982cb2390125ff8d5db57b6b18c5616c526102e4f615963d601d13f122", + "Expected": "000000000000000000000000000000000739f563b42648cde5befaf44317468982eb9d2fceee7d2efff1755be973cfc2beda829268246d09cd29fc3aa91f0b8a0000000000000000000000000000000014fe0b03ac5e0e03acd7811270d65742a3345bed7a4790d5f40097dd34050d0043104b65fd4691c251f03e67525d41b5", + "Name": "matter_fp_to_g1_89", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000b9590b1d0d292d9967d759060a551f4e8e4c1c0066a9a3c0be515085847fa26b77462e3bae9e2621f28e01f897df0be", + "Expected": "00000000000000000000000000000000128e92c9c10fb9b065fe2c2dcfe365e98aa54eaeb3fae987306c7f0a227171ae0b3464d01a54a8d6b144ff60c45088a00000000000000000000000000000000001beaace4e23c9a31e1e9eb8596b3b05b9d72553f44c61627654757080171b05c900fe1b638193a69058e8d66cff1aa6", + "Name": "matter_fp_to_g1_90", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000006ee7c459bb4da96e87eb1d39bd7368de5f60104f85b7b4bcdd7761ce08d48babe1bf5e765282779803bfa972d0e668f", + "Expected": "000000000000000000000000000000000a6099ebb3a1101206bbd21149cf22af2371106bd34671c1cbd4f2e19311fd100bcb56a6d9d77bd834f972e55e0fb75e0000000000000000000000000000000001db77a2045e54b0ac4b3d61190684b4eec9c4ea415e5c820992b70d6ee2e086c02892228c4465c8494f939cc0b7b5ee", + "Name": "matter_fp_to_g1_91", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000044612b42a2baa9d3e1d187b2a4e048773b4851bbd7d4025e0f7f61abee703b5a563397da4515c7379397dcde698228a", + "Expected": "000000000000000000000000000000001101cd37b61247a9859bb09ccf9eb416643f86b7109bb45d6827fbf424956c9a16b2a19c5e198551c43aa1934ad8ed0e000000000000000000000000000000000da562fcb2e3cba853de6d245a1ea0cfc3ac120b316a5f4f7072cc35a6634027409ad08c5d591a6688b24cdc4562cddb", + "Name": "matter_fp_to_g1_92", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000014cbff1000bc0f9b394b18e81124dc81f80e291e841dae6e96e0c86a6f618b9f6aa6103e0e7582e5136319a4dac92fb", + "Expected": "000000000000000000000000000000000323c3aa4b20691af32696c449668fb6da6a0c2e8eb176fb8fcd8aeebc9b5a3bffc57b28dd35e374811d420419fb0fd30000000000000000000000000000000019516a092385d8c917b46a742f086c51e2648c7e9a709ebeb5a0f8bc29c9aabf99972aa3a218582f37d91f9758a5ddb2", + "Name": "matter_fp_to_g1_93", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000013da827dd718d3736cfcec53f034d34bce253bc91f7cfd6cd2666819bdebbfc43a9363f82bf4b580a7739b5dda9c9436", + "Expected": "000000000000000000000000000000000d0351d8557d21c2dd3b1be77bb01df804ebb9e2d7e80910264ff94861cdc0a4deedc1231c61b7503c5d653e31fe10850000000000000000000000000000000005858ee487860d1ba04cfdcedebda235616c2d271ed50f89d6cf2852ea7e10ac825dacd8b00071684858a12459d1705c", + "Name": "matter_fp_to_g1_94", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000010e94039f37d218ad393e88a226dd324a37e8d5352dedf6d84fa2ed2cab2f874ccc5ce94599950f91b8dd6d6c8b84aba", + "Expected": "00000000000000000000000000000000176c50c2fcf1bcbe03a1a1ed2eb120f94ad4fcea34a59607ea595bc2b37cb92f87641191b65d4b5d57f5491ce6576a670000000000000000000000000000000000e177361e09975c98849faf8e24086f75a48df0f257ea47b659cc2a142a57ad1f64416f6dee5cbc4e57f780dadd1cf2", + "Name": "matter_fp_to_g1_95", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000010416da7cfbed2768c77b80957053030d49d535b21a8a3297ab257dee0463c91b87a9e571b86bd874522149d9af0c29", + "Expected": "000000000000000000000000000000000dcce000aae744f8b3b6754af57a36786d887d7f9857654f93edbcb6c4416ccfea5e859acc82860b5f706087e87cdc07000000000000000000000000000000001847c32c839668a38669fdbabb512df15cde2b28ca336b0e158d1fd57f74638d86ba40ff68f0a50cead7021e86c5271d", + "Name": "matter_fp_to_g1_96", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000197ef97f6d02a51b80e6f5629e88a3c60399bcc4a358ab103dac3a55a5877482558abed922585a1ce3228ffb507679b4", + "Expected": "00000000000000000000000000000000062a58846d39dd1fdbd34a7117797f2200d814b2a8eac9479885762565a979e93b5313575bff5ada3211eeed0a3f4ddc000000000000000000000000000000000548a24e7af2b38c4d16d8dfc8fb2d7e7669051e2643c44aee113f20d31f4853cef84e2dec20095c273680cca278331c", + "Name": "matter_fp_to_g1_97", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000025f1ac90f5b0748d57d8f7a928be875c5712801f70af0d057546228c1bf83d3a207884c0d66d0b5dbcaa736bfe0aa1", + "Expected": "00000000000000000000000000000000107f01e4fb6430e34128e3335872cf40df2b498a63e048d46158190cb627e37833d2238dd72681037ce376384736b43e0000000000000000000000000000000000e1812299403efe0f8d111d97a4b7e7b8aa1f4ec58f9935b1367d81a847fb42cf756154448f9172118123679a41a280", + "Name": "matter_fp_to_g1_98", + "Gas": 5500, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000017f66b472b36717ee0902d685c808bb5f190bbcb2c51d067f1cbec64669f10199a5868d7181dcec0498fcc71f5acaf79", + "Expected": "00000000000000000000000000000000188dc9e5ddf48977f33aeb6e505518269bf67fb624fa86b79741d842e75a6fa1be0911c2caa9e55571b6e55a3c0c0b9e00000000000000000000000000000000193e8b7c7e78daf104a59d7b39401a65355fa874bd34e91688580941e99a863367efc68fe871e38e07423090e93919c9", + "Name": "matter_fp_to_g1_99", + "Gas": 5500, + "NoBenchmark": false + } +] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/precompiles/blsMapG2.json b/x/evm/core/vm/testdata/precompiles/blsMapG2.json new file mode 100644 index 0000000000..f30eef6564 --- /dev/null +++ b/x/evm/core/vm/testdata/precompiles/blsMapG2.json @@ -0,0 +1,702 @@ +[ + { + "Input": "0000000000000000000000000000000014406e5bfb9209256a3820879a29ac2f62d6aca82324bf3ae2aa7d3c54792043bd8c791fccdb080c1a52dc68b8b69350000000000000000000000000000000000e885bb33996e12f07da69073e2c0cc880bc8eff26d2a724299eb12d54f4bcf26f4748bb020e80a7e3794a7b0e47a641", + "Expected": "000000000000000000000000000000000d029393d3a13ff5b26fe52bd8953768946c5510f9441f1136f1e938957882db6adbd7504177ee49281ecccba596f2bf000000000000000000000000000000001993f668fb1ae603aefbb1323000033fcb3b65d8ed3bf09c84c61e27704b745f540299a1872cd697ae45a5afd780f1d600000000000000000000000000000000079cb41060ef7a128d286c9ef8638689a49ca19da8672ea5c47b6ba6dbde193ee835d3b87a76a689966037c07159c10d0000000000000000000000000000000017c688ae9a8b59a7069c27f2d58dd2196cb414f4fb89da8510518a1142ab19d158badd1c3bad03408fafb1669903cd6c", + "Name": "matter_fp2_to_g2_0", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000ba1b6d79150bdc368a14157ebfe8b5f691cf657a6bbe30e79b6654691136577d2ef1b36bfb232e3336e7e4c9352a8ed000000000000000000000000000000000f12847f7787f439575031bcdb1f03cfb79f942f3a9709306e4bd5afc73d3f78fd1c1fef913f503c8cbab58453fb7df2", + "Expected": "000000000000000000000000000000000a2bca68ca23f3f03c678140d87465b5b336dbd50926d1219fcc0def162280765fe1093c117d52483d3d8cdc7ab76529000000000000000000000000000000000fe83e3a958d6038569da6132bfa19f0e3dae3bee0d8a60e7cc33e4d7084a9e8c32fe31ec6e617277e2e450699eba1f80000000000000000000000000000000005602683f0ef231cc0b7c8c695765d7933f4efa7503ed9f2aa3c774284eabcdd32fd287b6a3539c9749f2e15b58f5cd50000000000000000000000000000000000b4f17de0db6e9d081723b613b23864c1eeae91b7cbda40ecd24823022aee7fc4068adc41947b97e17009fad9d0d4de", + "Name": "matter_fp2_to_g2_1", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001632336631a3c666159b6e5e1fb62ffa21488e571cffb7bc3d75d55a837f242e789a75f0f583ce2b3a969c64c2b46de200000000000000000000000000000000184f1db9ac0fdd6b5ac0307e203d0b4237a50554eb7af37bb1894d9769609c96c8437e9d6d3679ebd5f979eb04035799", + "Expected": "00000000000000000000000000000000184af3f8a359dd35dddd3dfcc6f5b55ed327907ed573378289209569244e3c9c02bdf278eb567186f8b64de380c115360000000000000000000000000000000012f5ba8e520c4730ac1fb75dabbfdc0181855e5ba2968a8c0ba36a47ab86ac45d19aa3d55f15a601e120be1f75eefe240000000000000000000000000000000004e313db704b103c2c1e3a58f8e95a470e7199081eb086e9524583131714c4a3db551fd51a3f2314a19a658e7b1765380000000000000000000000000000000004040eab7416a1703b0d103120506f1de2b26b0f48c7a0ea63dca4d9ad1c478ae03b5d7bfd51f4cd6f8cea26212c4edf", + "Name": "matter_fp2_to_g2_2", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000732f171d8f6e283dd40a0324dae42ef0209c4caa0bd8ce2b12b206b6a9704f2c6015c918c79f0625fa791051b05c55c000000000000000000000000000000001139e8d932fc0ab10d6d4f6874c757c545b15be27cdb88056ed7c690aa6d924226d83e66b3e2484b2fc3dcd14418ee60", + "Expected": "0000000000000000000000000000000017fc341e495bf4ef5da4c159a28320aca97ca28fe3a0441242cf506b0f89bb52f5b5d8c6e038d229ffe67d00151912f00000000000000000000000000000000007666300b7be3d904ae3d19019f7be5cf5ba6161b969c1a78aff639a24387d8fdcc4d0e3cd81ba6f063ebf2d859370f20000000000000000000000000000000007cc705dbfb5c0418beb1cfbd864fa0631bd60eccfdb16b5d55b6ef3558e2ec87dac3b45294dcf04a064d6d1eba5a6eb00000000000000000000000000000000052cb9c982e6b05c1d2ab4eed1d8082f96426b55615ebc6a53bdc320ccad0aad044395ed641b3176b554f19e62d46b73", + "Name": "matter_fp2_to_g2_3", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000019a9630cce5181fd0ad80677ed5ad8cd8bce3f284cd529175902b78ad4915f0df56f0d8b37c87c9ddb23d0342005f1570000000000000000000000000000000002cdd00b7662569c9f74553a7d0585312a776c8638e54ad016f8d9d25df98651789470b12ce2626fb3ad1373744387ac", + "Expected": "0000000000000000000000000000000015ad9155037e03898cb3b706f7105e39d413ff3a5abb65812b8d21d003cab8fbb607d3938ccd6a774bc8debfa30f42760000000000000000000000000000000019d6382bb2d78180a8998a0536d67412d00ec0ef65f4cbce01340b8d6e781c0ff790296f8cada28966b147c69e02f366000000000000000000000000000000001290c2c205b748069d0875a89ca74a3b05ad8218ed46a1570696932302983c090d96e17e0b828a666fdfc3b72cd348bc000000000000000000000000000000000114f2f7ffaa9f90b547e86c863a5d3585819a78b095848dfa39576a10874a905488687b73e613f3d426510f5d1d1ce1", + "Name": "matter_fp2_to_g2_4", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000e63c4d12a38837354bbcdf4f844e5dfe727ebe292016748007d162e74c1f849787767f7e77fc57a42783fe0b06c24c80000000000000000000000000000000008d879e4891a891f2e7d27eb95aef70d5b785b796620ec43dfbb6ae550b4effb9f24210dc20f401d54420445e21cfdd3", + "Expected": "0000000000000000000000000000000012084a53cde353a46af17cd2fb02c477e47b874d8ff58025b5015837759032ff98013dc5bf01253bb964f035183c9071000000000000000000000000000000001659272ab7e3a070a5c7b25a5d3402f7371ed67e58cac8438df41c39c1acd95ac5886b030384bf537d7c4bb8ddb2c538000000000000000000000000000000000852ddcc37a09a0a8f62dfbd1ba5064c1f6afacc9a279a4d998bed643eec5a0d96d6bad95701a04f52c83e8f87f48d5d00000000000000000000000000000000097a399370875398028d42bde8cf4e9641730af7a2971e2f59c95938120603a239c65030ded4323c955f7fd24bebf31b", + "Name": "matter_fp2_to_g2_5", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000028d6de947a3958af5b53578b0ceacc7ef89d36526d8f3b6fbe787af69fed2c85cad3001643b81c575a741c4566e617e00000000000000000000000000000000182b56202f0494bd8baf5c03969288a1288b8ed8e6c7f49ec9f7493ee3369eeb42fa8f5fb7b243fb2bcee6be244f02be", + "Expected": "0000000000000000000000000000000006f8191123f1e8f6a05e4e663fa763c8a0ade5de3c7cd38ec1c82e1c85f123ab51fffcebd677afec8e9adecd8d11263d0000000000000000000000000000000004fcd825bc55d044eb70e0bdd5ea2ac58ec1487e903b431c57a640c756265a382581b8450fb15dc649cf22a8539088220000000000000000000000000000000015259f83d76490bb868bb88c2a2c3e07a326bd3e97fc2f552adf85722a360a443d720c328076e35224328e09494746e0000000000000000000000000000000000f76b0b960a1343b4267f5aff44901fd6796a778b1a87666b95b773edd0e7ffb6656d4f0cc3b9b38bc6c0ed20cfce153", + "Name": "matter_fp2_to_g2_6", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000016adb5935f32bafcccb81cf4d177dd8826013d85e11a4aad66e3aa596e1183aeb9d68eb8cf5b716a8a9445ea81b40d7a0000000000000000000000000000000018bee24b0c97af8aec210f15bbb6acbb76168dabe16e669d5558d8d32f00fdf5146471922fa98a28f238974d327996a3", + "Expected": "0000000000000000000000000000000018bf5f93dbc2c37479b819f8edccd687c4d3c4dd04f8c73762fd89d0c003674e3b2ed749d23e775f925279b3112689f80000000000000000000000000000000008a033b197aa8ea2213dbd7ed478d98c25dc6e9f91b9924f3c14124da26a67bb196926e02da89b746f2a67b14ad226070000000000000000000000000000000006f7824bdc9c53212609512858278f79d9b094165ff178e3da8776e24311bebbd9deb29f366d4c7693a15c34df118403000000000000000000000000000000000edde25fc24b9ec58b3c317aa3ae48dd5fecdf6397ed9636ea042722d264db0b1a89a15a1e16e892755730ef52796527", + "Name": "matter_fp2_to_g2_7", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000114285411713eafd395ee43bf1728f52d17ac512b9d0cddd38c904a9a3a1b30283a3918cd2cc3da6a7d6b4ff923cbb6e0000000000000000000000000000000018a067f91f94b2904c5bb6900f427ec4e93374b5079c84707feabeabde20b5e49801f1f3c7504dd27da94d5e754df4ad", + "Expected": "0000000000000000000000000000000002d28025f4b798083aec3ca9a91a051ce27a374b115c944932026b4fe0dcf68b335d5e47212f800c241c2d42fd219635000000000000000000000000000000001742fb6ef8e9a5a7572b0d3fa4ae8ae56c9c6f4daa20d0b88212c40511c6f6b5ee98314a2d1cbe4bbbec907495a1ade8000000000000000000000000000000000d700a511a58c1b8f11153669cb21d88512dfdacbabe38e402431b4f7ba374b5f9a88614da2d56799d39324e9d19e27a000000000000000000000000000000000c6068bc7a43d614b8f1132b13e04f66d2fb5ac0c5bc8501b754a0bcf4f382db92b0994c4999e104c9d1111ef91d5edc", + "Name": "matter_fp2_to_g2_8", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000dafa9fa843879038fd1566c319c24119989090c5fd34f6514e57f633d3709f0aa9954dfb289843a6990588e337b63e6000000000000000000000000000000001742a98dd7d3671c2c64aa71023a0040e936fd726c062d520626113bed471e53ff3e85737e5abf9ee8821bae53135f20", + "Expected": "000000000000000000000000000000001350c68434a9b02392e60540a3985bae8daf9a170b30336ac73afae6f892c7ae8f5f1cadfb2780d6e5961ebf91cd69ee0000000000000000000000000000000000c20bd286fc1886b9b28dfa40d1a27395cf76a8b73946849ea0a7b5e12530de13c16acef8fe2a2c247ea65ca023eed70000000000000000000000000000000002d8ffd0235fb60fa573662034d46260e0c96396537b2a9d486dd03bdd13c5a1efd2d3cb9849ed11c4376b665f378226000000000000000000000000000000000d90ca1b73a6a9566832f9f19d8530a3b12f22bef853fc44088559b923ca108cebf4291e0d7de8f25c7429d455f5ae46", + "Name": "matter_fp2_to_g2_9", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000019cda532e5d94f3b193b3f286a038637a736c2b87b804efd4779359db5bd95320e06d6d28da3c229ae48ffc02303fab10000000000000000000000000000000018df89e4a545bfb825bcce2f4c25f2416a72e32633b3dead5205c8b7d69c78f119d0e940e5bde9ae1cf91574e5d6c175", + "Expected": "0000000000000000000000000000000013f223602e8d12c3bb51cd393f6f59beb5c55fe80c3fc8fb0bc90eca533d9b7981563a30ebd727ab6cf0111fa2d3099d000000000000000000000000000000000962b0585c681894cb701f17ec06c0c240899db574c02d82d85ed4dabd4b8654c29b84c71d2921986fc2abc542a3ed9f0000000000000000000000000000000000f0e79245e645a6e3fb88b9103ede3e6ecdd7e45d61b5755d7a8d100d80719746af58bb23d3068cee7389b2acf17f8b0000000000000000000000000000000017fa0aac84c58283f34b9bf713cde98c175b38e92503c08205350822d778f3dd5bed8051e185c495831a628aa89335c7", + "Name": "matter_fp2_to_g2_10", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000008ad60829ff001404da40923806e496640a90c5c258a41ef5912f8a1a20eab84ce43b2b5aa4aa7dc4d8b281591d235020000000000000000000000000000000000f13dfef4b3b83aa7f9525eae9913e10502e77c03c55a7aa2de083dc5102c098b6f8e36cb5247b827e30fbcded9e2d3", + "Expected": "000000000000000000000000000000001062c97c214b86518660c5e1c33a4e48923ae89ab7d8bc5c798e631de16fc1f104aa957d3e7915aee8551e24aaafc8e6000000000000000000000000000000000e42b785f17f25b87a0dc558a8d57b19d8f41767c3b4fd70c147e95443aff2d9a743003da41d578a2b56d7dc748cf59500000000000000000000000000000000111fd38cd2f5f681bb37f6239a5eea820ce3f01023c685f8e7e244fe9aa9dcbd18f0e50705faa5d8d66b28af9f371c630000000000000000000000000000000004726d3e452f6fcb180ce1d50bbee3a23f7949b635a058f12de1cf5abda19c042168feea53211dbed0bfca489a020930", + "Name": "matter_fp2_to_g2_11", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000010468e5421a72ec85b63f7f3070a949223105763868111424fd151c8365eb0307dbc9cbc92e5dfb296d06ddfb58d99000000000000000000000000000000000008149ce856d489050ea834452bc66f7f3478c2056969354dca8652f3d0a349e40fae0c4c57ff0f5e022aa93c61f8c844", + "Expected": "000000000000000000000000000000001211bb8d3bf65b60efc7237ffecddb4e7e2f0dd36e2a704dfc9f4972897addff1a57182f8e0a0ac08c9af2c98eaa4c560000000000000000000000000000000007e9877280aad45a3b1453b6771ab509e4f53937cc6da73d3add50aff94869b27f49218fb479fe19a6176b9aadd36e35000000000000000000000000000000000ff915801695a281f6642751be77155a813847ae0237d77d2edf836aebac02b659b98d49842d4d10e82d9d146e63a3da000000000000000000000000000000000fae1c8c01a2dd94f17c660353d158ff6f3eed4e6375f1e414ade9d6fd040a48e3ff0d558c882e92e74bd6ef4ab06168", + "Name": "matter_fp2_to_g2_12", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000006295de7bfec61f06a56fe09afbb74be968329e88ba2e87afffe9ea9bf646ff5b4a03d6088e87644958ced95eceeea08000000000000000000000000000000001443e61dbf14b6c6ed99e1917ecfbe5a4a23ab9bdd3bb089fbba76d795d715d9d2e3c7d8db0b7a9434ad691b68bad3b2", + "Expected": "000000000000000000000000000000000dd00d9f31cb5148048125668286c1790cb7294e740df978ac0bdaa6e1c4ba139a04f5770b194c9bcfb123d9b40b6acb00000000000000000000000000000000085d5f4cb831720fa13cef25464a1ba7af33abcc4079d2c5736a219ad9649ebb5dbb8687a2d3952390866587d7088f72000000000000000000000000000000000de377d773e40e1c76e218b969297d15f7819c525ce39aee5114e8405bd7361116682cf9d673574d415a7016b23b567d0000000000000000000000000000000018db26c2097f72b8788ef5aad2d7aa400627e224924afea1ac7c7a6b5cff4a55255e218572614519a536eaaf0f65533c", + "Name": "matter_fp2_to_g2_13", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000b14b12ecaa94f9656be54772be9b22a2495d4ff873b0bb971c27ab1d8b940c84cabcf921f6f75e93942c38cddeb87500000000000000000000000000000000019eca0daafbfdcd3b56be863dceb21e624b22c0d376fb92ba606456ce3825981713b88e40b7fd801e915f97d5c29ba75", + "Expected": "000000000000000000000000000000001853b4c4e6fcdbed29c5d3aa4a9f6d447adc512f66a32fdef06c6ad316c42eb3ca47ffe6f21318ad610d0a68673d7bc300000000000000000000000000000000123d15c37fa8b1a95229e28500c9a767e6286b780138dcff2714bf1f8242f39bebb7d86e2811551914719ca90fb5615f000000000000000000000000000000000537498c2ec64b2ba58aa0a858b69990cac544d5cac29abdf6a42ae9c04061f83580b79c2a6104ebc55939d9a2bc5ae2000000000000000000000000000000000b348c19aad3b67c690512f372d995555ee38bffcdaf33bb827160d6929d2ce598523880f6136f11e1d6482a654cb016", + "Name": "matter_fp2_to_g2_14", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000104a452343a4098e9bf07380a8e52050259da95f5fc88f31511a08090bda85f0a08d49cef95bd26c7181aa3eb0be122200000000000000000000000000000000012400aaec3d2f4a1a8cf3f28fd396133c3999c074a565c110354472ae29479b9b62ab67128521c2c6ec4869811ba760", + "Expected": "000000000000000000000000000000000994e7b6ccafc996f672c42ab491105ffe1482e65aeb456de2213b531889773ad4d5e6ea1687d6a1f13e74878766f11e000000000000000000000000000000000b89030486a1d622c97970ee7da6189ac341b9cafbb4081463f579ab8b4b049c6e6c8b63157455770a79108424a14f24000000000000000000000000000000000ded43800a991f8c37282d803a39941d3bfbfbdc56dbf7500ef3d16750b27dcb1ad93f89714395fd3dffe318c1771375000000000000000000000000000000001994144b032e1f8c4d688754eef82cdba0018ac47030fcb77e8fd920e0b0336255d2cc8376c03e1074f91269cd2519d1", + "Name": "matter_fp2_to_g2_15", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000093e04bfcbd77bc6bafeb77f02d0f794a20b155435ee3af1d667c025e7645d9387abe0ef281386339f461352da93fbe2000000000000000000000000000000000481ffec570d4e155ec10e0cc58effe7a5651795d604cfda6cdbf011676772fdce2c25227e7d5a1a26748d15b1668091", + "Expected": "00000000000000000000000000000000195d99406baadc7d8740962cbbf4bc1f22b08eafb52f3cb3c588b6cb3cd89d16cb7b8d388563289f5b5ea466128525c80000000000000000000000000000000004809f70463633595dd763d658354df4f9b409911e1a0328fdaf486d76ffb410d7c6cfcc2d48fd6757d5c2a4834f81fd000000000000000000000000000000000654f8475562098a2cb27ce224674a383283cde35173e1c16b141998b641ac9ee663d766f045451a7f6d600973f0ec520000000000000000000000000000000013bac451a44982c7b1aaac7522dab598cb79b9a3dab77f4d5a4c1c97c154451499979af1f86ced8ce2099bccd400420d", + "Name": "matter_fp2_to_g2_16", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000013a3c5dd40f7d7fbba7563331917fe19a093d5d25ae7993200c39460e0c46d839e3958b672b4ed195300f398137faa18000000000000000000000000000000000255bc4d313fbd61a270dce8c851f1fa09e6ac5dff9b9e8dfc8a236a1d44548cb079023ee9b8f0f5756b39e44489c3f1", + "Expected": "0000000000000000000000000000000016ea88d0bce32981f489438df1bc14e7ade7a45d449ee1ac1a041c1204460cf53ae5c0e111914d8af9e6b3b7fa394484000000000000000000000000000000000db571ca6a55bc8285421553a373048f7877ecb9683d52acf07d48e1026795993e4e7177490921bc6fe1e63d69c2de3c0000000000000000000000000000000011602919de1df6cc0dd36a59c84ebb8e209056534e336f5074c9ae5323f8a03b123dc6354cf85301d838b16518ab64390000000000000000000000000000000004407d30fbd632fd493055bd4d8cbed337767a2ac534411a3eabec570ba41d2ad28ef37512a7da3611ad60b6536b3f07", + "Name": "matter_fp2_to_g2_17", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000ab7b4dec955de92224b234c2d8bb2e3881806c2d36a9a21036e9412f0a8d3946027cbb65b5dd9c975e01b3f235b883f000000000000000000000000000000000ffbb55002d9e926b3d8e7d963ece82c14afaca8b4d8415df8f964a39db606ac99f9e442ff69f7ddbbc4ae563b836192", + "Expected": "000000000000000000000000000000000c1e7b188697aa9a053f14e2d907f2c61a59e0b0c72f9cce30faf81dc714a50113500ca9bc3af6657a5d214f52c90616000000000000000000000000000000001544c35d712eaf79d8dd5a22fbab72f8a6843728898412a7f305b205f8a50e03c6c462b87b3ac165e9e6428e0a44a74a00000000000000000000000000000000029ebafd90a1a887669fd0ace762a66bca2bf0a216333b0ac97dedb6bff3dda2bca1e3d0ed5fa9081c2887fe6a8e24cf000000000000000000000000000000000e1a01ca93ed268e0291a937483f7f8e252c91f9bd8bde55271b0c97fcbbb9219009514217dd8bd7e0267f44e9927a93", + "Name": "matter_fp2_to_g2_18", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000103469c08562f6f72152db58b48811b0098b68af8de00e652bd5a67246459664cc8c54e15705d702d51e3f1d8ff76a7700000000000000000000000000000000059b326dd567fb2f8a6ae87f41fb22b3edc25122138a5f6732edb48ed7fa1949eda6144297f54faf406d873a016a1510", + "Expected": "0000000000000000000000000000000004e8ad9838e7e269cddf0ae5c8f0f57e7467e0b6f2b9e37e7c4bcae965e9582dc46c9c50aa01f5dc761bf2f1ad311eec0000000000000000000000000000000011b1438ccc668900914578c3ec6e1334d0823861c892608817498fe2e538deec73e0034a6e8ba9790f63fdd95af3714a0000000000000000000000000000000005b4c88196425d3ecd22bfc0cb1a95488493f85bb74f50315f0ffcdd57ad2de23c137cd6d2f6f6dca8af2e3f7bb0539c0000000000000000000000000000000017066344a0f345ecf6a2ba66c37ccbce26a3f551524f74636d4c4812bf5adfabffb0645b898b10c332e94e5f2ae2d1c2", + "Name": "matter_fp2_to_g2_19", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000bd594d2f5e1472f85bfd550df3eb948085781459eb3037fab34186ad9a0204a0767c8fba571af858a054dc231931b8000000000000000000000000000000000087b8398406c1e707fe87a16118e2448d6a5f4fd1d6c9d7174c4d8a4314fc7b2c21f04178533480976dd20e28b278ad5", + "Expected": "0000000000000000000000000000000010d393bf893d589c578df58f4d0098ad3cd10d3a1d0f112f51b132a369e68c0284a6b70a5673383ae24a27a9043b16cf0000000000000000000000000000000003402afb77b187b45906d9cce348976ed88c758d75b9962a53352a6c3ee37751a9928097c0d68c6f8a315def4ca875200000000000000000000000000000000019b98631e53a3ffda3fb9165ef7236dad5c0c8d57c3315617cbd3ce77430bd89b9e1d88a019042cae0075594514a5e67000000000000000000000000000000001783bf1c9b0ec44c9191dab01ef5bda0cb2f533dbcd3aeac2b7c6720dbc8e3f770a215ec8ea2035129711ce4b448ba87", + "Name": "matter_fp2_to_g2_20", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000673dface7041c3d7503ce4a50af946d344ad48327b515740b45276403d91bf1ef9deba79c8ffa0126be990b62bf3072000000000000000000000000000000000adb42b7eb0f6759a04da7b933bbc2b6aedde47da8571d6fa32268c606dbafcbc810844017eb6377493a12d76ca56c03", + "Expected": "00000000000000000000000000000000086ac901098212acd091d9c4d42a1318c3b343480f1130d6e52128d61df9e19fb61ef1ff35de0ef60062cd99202910ff0000000000000000000000000000000019109b7292f1a420f09a56dce9694cb4944808a2ce9f1964cbb6ffd14a710c35abe81300090ffcd9e95f33e0de9f879a0000000000000000000000000000000012660c4e114a215390c6f6eabc4bd6e3d062ee28d0c87e24351c7d43195253cb7b5bcfed2b4abb2fdeb3ac04ee228997000000000000000000000000000000000e56d35a7e40a86ffd2088c81488265ecc4468d6cf02d563c91611cdf8b4333cf66ef50b993fe651b1792d2b242cff94", + "Name": "matter_fp2_to_g2_21", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000f554e52c4a6c5a94fd09c617f57e8f87af57e73ceaee8997fc62c8ddcb2f875ee805e6594a0fb72738abd3cd4748ddb000000000000000000000000000000001876dd03316ff007a2efb4c5f452d8418edacc2881b20e8340895f6fc768d14fd89bd9db3dcfb53fa98a1e96055fa83e", + "Expected": "00000000000000000000000000000000071d3e796fb15d63c2d5cf68f59f11792b0b580b85c8839a02fad96664f14735ede2edfd5ba5b64045b366904f54ab600000000000000000000000000000000013fd1ea38d32772458622731b9e2d9d749f2b747443f7e47ef5e041531b56f86d1775d42a548b2bb201228f49ec9f46800000000000000000000000000000000099c2bd996c8c5ee37de971e8b75a0bdd4f69299778ee3d216973c9dbba97c7a93e40b209d390024bc4b5e82560a1a83000000000000000000000000000000000c4922ed9af845467440b78efa3a53ba904f29adf66e8ac437c8bb6624b5e5ba0772a5639b45fe167b1fb9283747c50f", + "Name": "matter_fp2_to_g2_22", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000e8b2369fc2c584d78d52037b109aecc87dea0eefc2da46948b5535ad19c9abdb31aee66739f4852a2d3c51f2e7f74e900000000000000000000000000000000168b2d3e4b67390cb8ba5e48a7a823db08edee7d8eff41b88cd653cec1fc0df7a55303d3c91e92a2dc8ebdb327b225fe", + "Expected": "000000000000000000000000000000000e413d72fdc3db6fc79ef26ae8b37fe5c4356a80b3598513b5173b3406ffb54708b8794dae158060a1accbe956a39ff30000000000000000000000000000000019ba9dfa74fd241a55a3b47c9f37c6ebd1e8b51f46197881abb64b7f57c0e2d8f18edee35bb9da03702c0dc5cc8749f700000000000000000000000000000000183525156fbc80cc67d6cd15fd2ddf7fb0528656ec1d31b4c275ef101dbb635424abbff1154a3ee04346ac53148fb1f70000000000000000000000000000000011da0dcd666d01180902d8a7fd7d2fbb39f9c7587540451045956108a8579d7c116385a81627dad9d4cb8cfe68927b6d", + "Name": "matter_fp2_to_g2_23", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000016cf7b1a9ebafbd20c078948fc974bcca9b8069edc1ca5e8f364f8ca2a52e56e1a424ea6bcc4240f46dc7f262760bf480000000000000000000000000000000011a6a67d4501a8d9b3ab985be59ffc41e79c453bb5548299abff3b83ba9ff951025a68fe6a8ad3eef3c02d39fca8f909", + "Expected": "000000000000000000000000000000001932acb1fd0708edf13c293007a035991bdfbfe0089b61c261258e8c5c10d82a5318b2af221b372f0f3f43c391421582000000000000000000000000000000000973650743f0ec8e2acca33f2ef230ee7a05635d14099cdce913ad8678458ec0dde5c5a941097af2ee0c8ffb937d09fd000000000000000000000000000000000bdaf319044101ee9aa27b3accd36a5ecaf8b80deda4548377ddeb97283537be3f7199ad3c190ed23cdb44abb8786a080000000000000000000000000000000006c448827e3fe4f274bfa55a66bc76c5b01e29ac6a8dbebd801855ba4e93bcbd03292ccf804f07f21481260c135b827b", + "Name": "matter_fp2_to_g2_24", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000010e53fe9fa94ca622cfa370129c1619b2426bd9d50f4b5eb8a3f681479128dbe92adde15477ad8a4463b08f1a02a62d50000000000000000000000000000000014d10a90709789b25369f0376f39b16860aee1ddc3a4340542abff0077a4af8da946cc29fb6afd9930b872ea98749be5", + "Expected": "0000000000000000000000000000000004aee050b0ea07118d76f835218b77b39854f5ababc4e2a29d7c8cc7c18a69c30bb22437049a051d049c8a84f7868ad40000000000000000000000000000000003b1b809d5046054924c3814d26fd5fbdc59e03e5505813bab73bc212b0f5bc0d3fc34478311c5e1ac70fd16a01c52800000000000000000000000000000000002249a026af0b49f4659eca2c23dc790fb36a7b2996188828a17d5852003f1420f11699062932835cfe6543d454521e30000000000000000000000000000000008217aea2221f8748cd81cd37777605a95a63aba36a6ddad72c1e1ac57b24d79ff9d9c4ed71a6e3ac8a378129d5475ad", + "Name": "matter_fp2_to_g2_25", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000194612afb777e39d0308a290bf823fe706487c3473412d1410dcb2c0016a70706e70e3a009c0bd61e755b1e4c65bcad0000000000000000000000000000000000ade016d06179faa8d44a9ee2542058bb81724d6af2954c0c09a897703d364ec25e62a3a917c5cecce5c96a7cfba924a", + "Expected": "000000000000000000000000000000001274f676bcc05e54fa4b0cce234870ba97a0b1626543d6a9f09afebd5a752769000df404e4d434ebfd561f8335f36d0d0000000000000000000000000000000002877c9438fa319dd1a00f381834e8f3d3cdebf4e1f7690cb82559a2e978bedfd2455be020d0353aa56d435c0174b5b10000000000000000000000000000000009487cc9c7a09be901673cb1bd9a51f45e5d2ed30c90cbdd3e2b294c8f866f68da55533b78152e9ef6de30c345fde5b7000000000000000000000000000000000a3a8d4aabdb260203898655745cb695e6dc90c6e7bf0248784f8aa2340390fd5d8f1c6a98eb1990eb97c2a7f103e3fe", + "Name": "matter_fp2_to_g2_26", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000005aaeba19cb0baff9a8e46b901f15735a0c1f45116fe1f41c22fbe1aba22c0a7678bd4799db5cd9141f3112877e2c5f80000000000000000000000000000000003f54664746a5bc6f64021e2f18d8c175d96b1c8ce895809c0e6fcfbe896b3e8c1ac7f7556b9ef953371bb143bfbdafa", + "Expected": "000000000000000000000000000000000ef415dfc1e47f39e9632ed21c9c2bfcc1959299710dcd7935a757e3756a42c8f6c627c720fd62f9c486a8e88a64c76d00000000000000000000000000000000088079108fe7d9ac93590c045be0d41396f3204d83793c4e862c5360ddb3268a63f704a9d14323943fc85874cdadaff1000000000000000000000000000000000cce908e8dbb7ec35820f2db5ae1174e0f675b21ae416fc89a7f242df3ee98764022744842999f65132229156d2627370000000000000000000000000000000011e0e2f8513d0a71b48599139a9a29c8eca090c5b02292baba58e07b1d3898fe158cdeb3bbe8edb4a805e695e896984a", + "Name": "matter_fp2_to_g2_27", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000010ca243fcabbdb219c5b30092d9d4595a4b8ad1cbed267229eb79a99aef9c5df03d8f24b71db77a5a76917c2fd960ffe00000000000000000000000000000000135d8d92f075c219f8012ce6aebc8e48443b2f33382479a4ca8db0a4f92041d5b6b1e5818b7a3de77a5d30be0e461d13", + "Expected": "0000000000000000000000000000000007c6f133647745c312695439f1d8c251e941bad6e988cfe324ec7c959a9e0fb50618984429ff1841d4286922a26873170000000000000000000000000000000008edb220f77ed17fa1f4757a42ec66ad808c1acc25c4b9311be4c09703d547f648d9dd7c8109ffa89d01a35c69ec2685000000000000000000000000000000001595cc05b04f557ed569b19d64c09f4d82e6617437571fddd72a672d07ad94bfbaaed906b3a7e3db519159ec8d0a8c4400000000000000000000000000000000041157d4f40bfcef680af0143ccdd0c4bdd25e598a470dae844d887c398bc498edad715fd7383421fc78758cc9b00326", + "Name": "matter_fp2_to_g2_28", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000013e042ccfe0cbb7fa3b045a1fa1a86f199ae91721aaed488b96cc4f6de1899402f81842da2ab55c5bfa63f5b19ddce7300000000000000000000000000000000063cee89d1981f27a4f4d4f23c4d1229fd3333fc8f371ebd85c588e751307ccc75d71d151f7481ecba1ef0cffbfdea5b", + "Expected": "000000000000000000000000000000000f983607a6d8a5c3b8a577cbd5d81ad2ae936e714199e3f4095cf280b8fd6d3699acf4d2ef251a571dd1ef4ba6d838bc00000000000000000000000000000000048c12f8b95f9537e56479b1bc43a121e4edfb6477fcb090a5ea60c5f4d01071776dd0264b0250902448f62800f4d2ea000000000000000000000000000000001644ba272d7003d0077991ccb4569638de0dcc48fd2e8e9a41cee1d2200aee1a849f2d620f60beeb06b08c31cd4eeacc0000000000000000000000000000000018892d773f7e48247215484ca0c8d996833c43a5291b0380c97607c86f4ab2784e692673a1da012ac4fec2713d156a49", + "Name": "matter_fp2_to_g2_29", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000e07265d2762e8e398c83efe1c43452d91b90b7a4271c09ff693c83745a6c01b73561ffe3da9300c8e7e1602dbaab0bc000000000000000000000000000000000375579c16a167fd9f9f61d5177705f157aa0df3451971029a9444432db119fb33b8c07de33fc822eab46ed4ae47cf82", + "Expected": "000000000000000000000000000000000a06ea8e644d2d762520ad956d41ac2086a588450bc34f6d070b86fdfd73cd0734341a751d823935a009b7517770f86e00000000000000000000000000000000140ef0d6a0482537da7db8d775ac3c4a93b16c15fbe4602b5b1843ce757aada5f7776a74151d0bcf760f7284d4ffe56c000000000000000000000000000000000873c90f56a2b99da2f0a1528b8e376a5912f9cd81a159379ad70b7c10e6ebb7fea0a90d65543d968a34ebd539372e89000000000000000000000000000000000b05ff57079386e4e18e73cbff5f7b0efa329ef7355f083e8be258922203240dbb8926f7d11c22ab4c16d1df4bcbb600", + "Name": "matter_fp2_to_g2_30", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000aaa37576af2101d090139f562edc2a6e7169b0150af831d053a3a87a3a5518889a51871e02deb3ec154ccbe9dda46df00000000000000000000000000000000158edaeb58b99d9442d608bc8e6024365e9a81e0aa23bbbd466c9ccc8d29415352a153e1f852666505ef097122592ecb", + "Expected": "000000000000000000000000000000000e9d6f9e83a2584f2cdacc4711085bd251e060f8c87ff7538ce474d663c6f23361c88971c9da589586e754ed69699c820000000000000000000000000000000003fa90cc1dd81b815704e15c0448bd0e8e8d0cd7ad51237a25d4b8a0f78f532b18ec30a108930b7407b7486aad9824de0000000000000000000000000000000000cb97bce1f75b1df5a4b52745014eb632d2d2230e52a9767e3dfd76754e98252ca81ce274b92a2947f6a65fedbaa3e400000000000000000000000000000000090edabb37f411fae1764792083c8c7412fb470833a9f7399fb312c58687d4afbdc622ecf9d74cdfa3ea87382adcdd5f", + "Name": "matter_fp2_to_g2_31", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000012bfaf34a8111a01d213f9a9fc90846335cda978b3df23de99cb7b764cf5db1a816f66adad1319aa7e25c0ab89e7de740000000000000000000000000000000000fed118654a128735fd39ffd3b381ad2d71479054b6bccc04dd58fbeed9b255ce2b925e2141a96a12edc3a19188d1f5", + "Expected": "000000000000000000000000000000000cd234fcc729a4206233e46875a557027cb52c96322386b56d6e50d95dd9d23b6f8936ddc6f8475b1076a855c1ae23510000000000000000000000000000000010a774120f607bf9ad2d7bc498536cc9d35cefe384f88a2439a75f1a4f6a9e4b4253daff0d2c91b5915ee0e9a99b4582000000000000000000000000000000001496e7181495114abc0314f580c16038a04a8dab43b5564d518dba5f5e48112ce9daca4b16b6ad51c3af54ec9ce915d20000000000000000000000000000000002c61691a96a2120663c726d7fba3ed37524b58c92a024c15fccc659d1d2cdce077ba233a0d4419a6f237ee4e09abf52", + "Name": "matter_fp2_to_g2_32", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000b693fe53cbcd6f8d8c98900be1f9c85966cc644f0a900c70826c6573ee801ce7863a0b170ce0ef168fb1f0ea484b276000000000000000000000000000000000c6bd688fb883f3097f8b6fd6fd0bc5acef9341f21d62a0706fb3625a70459c45a5200ee36a3802d4bb4912030bfcfc7", + "Expected": "00000000000000000000000000000000011cd454f16209b0b7040c744291f2df465ebc786946ce3cde77fe4d4bcc4b60a51573c45b8bb2d209da69107613764b0000000000000000000000000000000018a026f29fc2f81e82015ef8610b4396f2e3514ab1a213356953804d585c5cd6a3c5cffbf70d63d9dfca50129021f0e60000000000000000000000000000000015bdcc8c139e636b05ba7376c1ced4a183eb465df53b1996f4ddc8cbf42cdff4ae2bbc2d24831a8ec8b1134cff4444ee0000000000000000000000000000000017671fc3995babcd2c0a1d2a71c417fea84e29df67fa1096fe6d3ec77c45b64fb8da6ed08a57726ab314fb860899961d", + "Name": "matter_fp2_to_g2_33", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000ba7f82549ebfdc7f4959dc67cebde4720d76d5d4742af730d45d614133f0a7b0ae7b61ba5b914a997d9dde83b77b031000000000000000000000000000000000b4acd8c203ebd8e3ce12b10cc791b9a4183440309f24bbd60cb2991712c792ecac64d3f878cbe407fa8ca0d09548acb", + "Expected": "00000000000000000000000000000000156d8823c37c81d8f03c0b2e61a2342aab6e6c9db36cadc9eb741e085de711e9fda08ca78f21753c4fdd8cec059b6c2800000000000000000000000000000000064d4fc2584c78f1e92f808d4457070b0470eb8de9d558885bba8b03efd8d8e195e4923d8e3382481a0ecee905371ae10000000000000000000000000000000008f1dc4d2ba12e7e3e1b0ef3855df4dbf29468bc99d5cb29fa3058a535af2ba038396bccaa238bba6d538498565c2809000000000000000000000000000000000fc9839b6ee876f7846b5086d487360b8faf133b6f5bd2dbc92a7fe2261b91b15aef8d90c227cd5f8ec05e32d807e022", + "Name": "matter_fp2_to_g2_34", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000145f6f774d943a1bb753d5d4876b1a88a4021cb6a6607c0efb07eef2f90ba2a90a6e9dc94586de35f6047332553ce7b5000000000000000000000000000000000b892f1c8d001c8aeddf845c3845c51f2e06c3c77e543e9721d797951b6211a869da97325b569e0de35cf3beda853ac2", + "Expected": "000000000000000000000000000000000d40f1c25dd57e36ed305276d4505cb250d2d9da0d5b954fe5e396b2c17a5399613243216586cedb19340e80f898873800000000000000000000000000000000063367c4a622fc925319fc6d119d8592f40f126ae05eed86ee5e4f6707b1d234c747e698c40f292dcb82ac5fe74ea80c00000000000000000000000000000000199ddbb5d4b6cd0fb9225a72c53f4596cf2597de63da56f4a9a18be8321a982de17367b0f3d794fa799657dd8ca10c5f000000000000000000000000000000000f1ed84e4fd958547d40cd2dbf16e2da4cb6d0d02763441067221890ae27ea1f689c26c900b695464ededf083667146d", + "Name": "matter_fp2_to_g2_35", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001878e791993186ab76f785b2c6b0fe08588b048007c66fc00c695b55bd17b37bdba71f34ddf75ac441a0c2687711b2990000000000000000000000000000000016598f630f72a0e1f39678e1d0ec6530c4795d7565c5d026fea2389ec0ceb51b434b532466fbb1c92c1c958041283baf", + "Expected": "000000000000000000000000000000000ee446310185ce76e31c13e4ca6c43166d971d9b9c539c7d0e8dd8ebbbdd9249922cb674bf6ad6840c203a5e208911fc00000000000000000000000000000000037344752896cff03bc39a9d09757a83c15fbd90f8bc1d8d58dca9b23bc00fa2b0f3f0bd7c9ed857d285825d40afde450000000000000000000000000000000003ef77f0220d1caa7538ecaef1ae2924ac1a180f11004034fc118aeac464fe1ce684b5fc90dae3370e3f79619889f3d7000000000000000000000000000000000fdfa434e7bedec071a1a333088d06299f55735f085a1e907a1c71c312bbb8d27ffa7de7ac69d421ebd675c4afd37594", + "Name": "matter_fp2_to_g2_36", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000134725b4d43cb87d2e4d3c43ca98b8df257acfa612ccd61dc0aa1ca749f20bd42c38d933d39f8c3c1a14dd8fec43329200000000000000000000000000000000070ad61a7f5ff9f0b4e7483f5d56b0f315b5f6545b194565ebcf8f0b8d78519ec113af6d70550888be4d661a8403a036", + "Expected": "0000000000000000000000000000000000ac465de3832452edcead434729be73be90785158617b5ec3ad53b12653e43721eda7de6742dc51d4d4bb58a291999f00000000000000000000000000000000147c39a5c162afa1f8eef400cfa1bdbe5436bc59d93973f50384022962f828ac934a4f88ab7c3d505b0bc3bb002f5efe00000000000000000000000000000000141bcdad53845a7eb2ec08189a55445059dad24ae5d39fedce869791aa28459f05a6cdf9575676cc6f3dd7d6faf077240000000000000000000000000000000010e9f539a9ced860661472f53147d0347927f065ec09bc32e00c5bc157b07f8b41b05aa4e0eedd1f73c7a287b2d0e5ab", + "Name": "matter_fp2_to_g2_37", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000179bc843fecfe713f6e3ccdc8ca0f48759459b675c8b96f5403e1f6da92c2d60449638f564ce179373bce473669965d700000000000000000000000000000000082bd89b49aa62c94ecd4244b3077421569c71efccc62aed3d4bd492bdfe57c0d2cced568df5992a196a7b71bcbe5e3e", + "Expected": "0000000000000000000000000000000016479eca30f48bfdaba4c8afca63ddbf59fe3367b2d3c17d15a5869dd2956fc67ebde964530926598cdcb62cfc993d32000000000000000000000000000000000650b4fd24ffbb953ccdb1b112799149d29e2377ee233b9ac97f4db432da63c98b8aad751f6060d04fe1f9262b75fca50000000000000000000000000000000004568dc0b9b430596f2fa59291ea6f923d552683ab9ab93000788145cd7c468c5576efd981c9ecee2ee0c16eca1ecdbe00000000000000000000000000000000154af1490463930d6b8261aa1d066eeda6d65b742cb53c65348e5cd766d86982a1489ad191d1b126233f193d24823b9c", + "Name": "matter_fp2_to_g2_38", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000fb118c86e974734fc434c3bcb783e4a7f9251d9fcfb9f4419529354c8a7a3d9f2215de2d1b9f0927b185c5b4db838b60000000000000000000000000000000004da0ce78f3068bebd0a59bc2e41e7ade737375f07d6c9ce962be022856c569a33e8bd6ae60c4bb1b53b3ffc2dcc2aee", + "Expected": "0000000000000000000000000000000000df692ca763a74877352af3609c8cdbc184eb71bd35fd86334cb88543637b40b3adbb5802dcd7b88f4d722b566aba7700000000000000000000000000000000181495e709d1617f2d912f43487ad3920ac5f8e47395ec4b58bcf0b2d986c674a0c7838830a039bfb5bb59cd2fee2f5c000000000000000000000000000000000d20b482dd8aad583bd5d08ba9c61b3e954f022d48f9f4f62ddc9f5015ac71dab7d206b1d8b885d5e605519bd33d93a20000000000000000000000000000000010d3deccb9364ee386eb35c7117bab373a76d024627b8a031f96465d5f75b029fa992e29ad4a170c4473cd1df585429b", + "Name": "matter_fp2_to_g2_39", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000001f43b86ec24ad40552dc4874a632b4ff4663eeefe1a8c613a19a798a0ebe321a3d543e2df28277944a941b4586ac770000000000000000000000000000000000baaca6bc34feac790807b5eb5fd173c86c12803b76b50be59b2707df765bd10eb467effe34f8dc3e1e79df8a54fde38", + "Expected": "000000000000000000000000000000000a007c914ed40c7f2719fc70def0d4752cbaa775cedae9365c5afb61a5e1a2854f9e1ce19af9fc85bfbfd2c33f5bf095000000000000000000000000000000000d85b0d173c25c2915fee429d2468a9eae01ba43c0f1a661f2ef83c1acd726865c00c40ccbc3aae306f93074e5e7858e000000000000000000000000000000000b3df302ec532c8100c121c9a3455392c713ec60de1f9572b040b0966f8ffb888e8cd768dcf6d63d4835a52d13a730c0000000000000000000000000000000001123c43dda8717d03fbc02fa53c4b1c9a931db6b274162cfb02ef5eec602bd8161dedc37c7f6217c8e82236f06e49e2e", + "Name": "matter_fp2_to_g2_40", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000005e4751707f3ea7bc7a74d80eff27a0d65cea0c3d2e793425e79cdb0c41e6ad0cfcdbb4de604637c41dbaf30a1e816e60000000000000000000000000000000008f69021794d93826f8207b96d49214b46dfb1778603634a9f5194e92481465702a8be1bc49a7bb57527fe6f963ae04d", + "Expected": "0000000000000000000000000000000016d8d9b1b59a22fd830f88b9850576488f75672a87ccb766e52da77f187a8e66071130c7e71f86675f8379b2a8802c4b000000000000000000000000000000000aa4ca84aa23f01ec536ffa25c4b7a6c822f588bc75a4a72ed9237c0588ab892c8474a0f23afc7ff0dbc3b08f8e35b60000000000000000000000000000000001425e759e2537d9e5f0f356ff1d38128eff3a771fa661a839f7a8d0f548347438574ef7d592cd4273ef9b7269c9c5d7f0000000000000000000000000000000012cf1c67d1ce244ae22eec0bf4a400a0f356b9dd075d87a6e61941933872d7c0e42c1d238b2c1704d2cdb2df75169f39", + "Name": "matter_fp2_to_g2_41", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000116988a869cf552b2440e16569d8b6e30c6b15430855c4d6bbf80683c5497291bac7999c1f8f08f494fcb4a989451c3b000000000000000000000000000000000e26058d72875fd3d852aa4139f71d35e1edb58242a4939da7986645117d027d20baf85770fc909d537524244da59ce7", + "Expected": "0000000000000000000000000000000017f6e2743cb30fb93816d0dc802c24509315363c3652b0244e1395cb9200efb4d7b9fa7642e8d165d28a00740f1a83be000000000000000000000000000000001483644fffd3989ac98cea71843e87b8e446a3d497630419afe99b3f1729a831fa6a49bf763b0c410cfc5390ac4ac1db0000000000000000000000000000000018ad20ae5012266d771b2c86f891f498c2e90a7df19561be240319edc1fbfb316948fb3f8a6b0e3720676b076eb372e10000000000000000000000000000000012f404211899d8fc1221ab5b82db9042ad37e63348871e5ac6cdbddacda0a564888f89d22712069b6096b58c5935edd2", + "Name": "matter_fp2_to_g2_42", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000078c6cf89561533810b583a88149586b29da5228ced10a75257b2587904217f63499d8b9ad2d536617247e12f8d1657d0000000000000000000000000000000005b016ede9d892fbd7aea4e8ed0f1eab70713557311481735a91308fabf76fe71e44a06dc23ea66ac5d831e982f401b1", + "Expected": "000000000000000000000000000000000d4d78f992f12aefb0e3a6b18fbe2411108327a9befe4a822618fecca4def3169972b4f1fb254cc4656a676529d554ad00000000000000000000000000000000145ef33250240a5c9434d4b2cf2404d9e7cc51b55e482ebc6a8aed85caa21ed00623b3cb2d76ce2d96b2f346d395dfc40000000000000000000000000000000011af2ee2514c58078da335c0273cd18b98d1ac6f0e67890677403f71b0e06863fc72611c0cfba39ac894ae500edbdbae00000000000000000000000000000000186863e7c24cbeb45f7a66b5dddc9b57c7e22c5139aa6bdb82e77cd8182bb8d2fb7bddd7d3516b5422f92e08d02606b5", + "Name": "matter_fp2_to_g2_43", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000007160f36f0e5c4ccbcc7900c6504cd86fd6fd700bfa79af69841e4a6127eaad467ccc93c66baf7d767c3fdb1f31c527a00000000000000000000000000000000043fe62b0b9be76a375f3be0d6ec891d5bf5f2982cb2390125ff8d5db57b6b18c5616c526102e4f615963d601d13f122", + "Expected": "0000000000000000000000000000000002af4a301e90c71eb375110e7fe23f8f05e2ede86b1a9b240e8d1d4d70e96f1dc3640fca7ebbcde9918deb91f3592de600000000000000000000000000000000058b5f36cfb6b0adb14b397dee4c3769c7446426eb5719aef4965cde2dcb70e6f2fa60101a5f03517c0040093453d092000000000000000000000000000000000f77b560469cd42c5cf3458ae13020c6678af3cddf9bc559372d12bc5d6b930795e1eb09f27cfdb8215f39fb2a11b30c0000000000000000000000000000000003308985946c742af7bd7d29abc2517ff1d225607b5f11fc66695cefabd8f25e294ebdb7339949d6bc4d98db19533966", + "Name": "matter_fp2_to_g2_44", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000b9590b1d0d292d9967d759060a551f4e8e4c1c0066a9a3c0be515085847fa26b77462e3bae9e2621f28e01f897df0be0000000000000000000000000000000006ee7c459bb4da96e87eb1d39bd7368de5f60104f85b7b4bcdd7761ce08d48babe1bf5e765282779803bfa972d0e668f", + "Expected": "00000000000000000000000000000000093c936d57135b25900bd5dd55cd579aa8b85b9c1b5e8dac6196c4450b624734d9bfc3fda499cedf2e877d79f2da650b000000000000000000000000000000001832306d3ac1c1c61bdaa73c9b6e9c2ccb484c3baa1de6a217a2884c72b72618e864f75fcc2dfaca358181ecbd3347980000000000000000000000000000000002b2e5ff1ee02657fa88c7d6f23cd4c0465152a9daad8479b4b68c97930acb22e4e2eb0011ec4062b8ec46991a7cc630000000000000000000000000000000000712543547e9d24cc78d1c2e3fbe0b51222185f4c6e513256d1ee066ba50beee20321bfd60462e2587c375a0e9395715", + "Name": "matter_fp2_to_g2_45", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000044612b42a2baa9d3e1d187b2a4e048773b4851bbd7d4025e0f7f61abee703b5a563397da4515c7379397dcde698228a00000000000000000000000000000000014cbff1000bc0f9b394b18e81124dc81f80e291e841dae6e96e0c86a6f618b9f6aa6103e0e7582e5136319a4dac92fb", + "Expected": "000000000000000000000000000000000f52e2f8dff9a93b2985d5c2b8b980e4869af53ce55aa48bc1c9295e557e3b5ff78896e5e6342c2d535d18b11950bf390000000000000000000000000000000013d36cf2805d350c5b748e639d20e592deb4c5bcde99a94fb539dc56d48a862151b925314f21dce4c9130b32e44f54060000000000000000000000000000000017728f485d881b861f626c9de8b3df7d807b266de6cf8dfcba262f40a6248fb5e6506d11e88f460f0b5f1a1907ae5f3e000000000000000000000000000000000c0ab998f63f861c82106dc3ed5ea11a16e98139e8686f8442047a1cf9ac48c3d34b5129263767830144e9a13d4a1f44", + "Name": "matter_fp2_to_g2_46", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000013da827dd718d3736cfcec53f034d34bce253bc91f7cfd6cd2666819bdebbfc43a9363f82bf4b580a7739b5dda9c94360000000000000000000000000000000010e94039f37d218ad393e88a226dd324a37e8d5352dedf6d84fa2ed2cab2f874ccc5ce94599950f91b8dd6d6c8b84aba", + "Expected": "0000000000000000000000000000000003463d887c4d0aaa21acaa308d77f2c7e13d10157efa9ec3fb1586a8db5ff1a9e807c91c86afc4df34c9fcf06e8561d700000000000000000000000000000000128a81efb9f30ed811ea3163c71b6a46ba2cbdbd3a9f93cb8d0f518747cc860431c6e93bdcdf36d00f83838965da4b50000000000000000000000000000000001777802b7c41111b38da3fd8092c280b4925827b2c1592f779a4ddca71f8268858855c413fd5c0057a652155261d75ba000000000000000000000000000000000c88b522d6dc2000cfbb7052e141ddfe15c6cd7fddc970edc4afc36fc59e7f8e31415706a8121e8e84348be0b50d0d88", + "Name": "matter_fp2_to_g2_47", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000010416da7cfbed2768c77b80957053030d49d535b21a8a3297ab257dee0463c91b87a9e571b86bd874522149d9af0c2900000000000000000000000000000000197ef97f6d02a51b80e6f5629e88a3c60399bcc4a358ab103dac3a55a5877482558abed922585a1ce3228ffb507679b4", + "Expected": "0000000000000000000000000000000014be96cfc0dbe09155ac8d8233b71ed584153e279b2b2be88471eb653aa4913fd2c33947547c61f7fd8bedbb552a8b1b00000000000000000000000000000000146b9a0011260e2646920894cf405bdebb101db12da7849b30868655fb5f972113cdf2fc322cc246d3dbd9f20b98fe2f00000000000000000000000000000000104bc20e104da5173dcff3e195f80960819a0d64e922bb484c2739c4b7c22535f7faeb1c85188aa853277740b389eac90000000000000000000000000000000019f5aec599f9ec286aefe48eedca3f929ac6c758c231182b92dc965d6ac1f3db53d93f57d733ca8425a5dde070b0dfa8", + "Name": "matter_fp2_to_g2_48", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000025f1ac90f5b0748d57d8f7a928be875c5712801f70af0d057546228c1bf83d3a207884c0d66d0b5dbcaa736bfe0aa10000000000000000000000000000000017f66b472b36717ee0902d685c808bb5f190bbcb2c51d067f1cbec64669f10199a5868d7181dcec0498fcc71f5acaf79", + "Expected": "0000000000000000000000000000000004ca0149527817b4df0f08acabd4e8c6329c0d1bd9f2e8211cbea25d69b84009ef158c770f948fd67e4609ccadc938680000000000000000000000000000000004101b351e2a9d34042291f38a289d8575872104bcf76f60bf888c60cca5101c34c247da30f7a8db4f0cf2f32abd302c00000000000000000000000000000000167e668de3207ddc60b8a5d5d246bf2f63ceae3bcbc4309e73eebf4d4234c2785bb13e4d5d8fff9c5f205e4fb942a2f6000000000000000000000000000000000491b965ed005065abdac53e3065781f2fd23f6159debc64f01c9f62073c651da33c05ed84617efcb5ffe08ce05e3b2c", + "Name": "matter_fp2_to_g2_49", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000003f2dd27e3f0ab503a8752c0802ee14c655271e8cfbc734905b4331fb4e70cdfe291ff71053fbaf91680b1dd108f458f000000000000000000000000000000000c62014b7694a3e81370761e0adcc32430547a1bbe33746637e7762dc24f8d04b4bb955f17ca901659482c622d777642", + "Expected": "000000000000000000000000000000001541320fb6f8a8c3c67278a7ad05ae7927d3555ad562bc8addb54c6693c51fb1c7355d2e74ff10f6bc3eb182d8f5b88b00000000000000000000000000000000172b65b110935b116ee683c8680ef0a660afdee43b9b8fce08ef3a70b352f8710c06b820348c338fb903a165cc5376da000000000000000000000000000000000df529b0e274e2e8993dd89ffef487aff23d31f502a19dd7d383de08fc77f1308a59ac5bf7cc899e81d377b2422187850000000000000000000000000000000010b40c9063d174b358637ab710d15c80d9230a1b3a056cfac4d583ad8c5b79c3d9bf22a1b0a4e0f629cd09ff7586f886", + "Name": "matter_fp2_to_g2_50", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000014d1491a45b4b0914a6cb2e4dc7de9d0962f5c175cd571057cae1e17d2c943954d119690ea14f5815f858d277a9ad828000000000000000000000000000000001650771e0f7b33d235f229b7d49a7a5a0f00f78e5f4abaa70f39ec452370198a8532b5873e41f17c449f9c565e6adea5", + "Expected": "000000000000000000000000000000000978ff68d94d33703488298658cf2c1b6034d3d8d21c175d71a0545bc2f99eaaf131f061f3e4f55622668e686e691f53000000000000000000000000000000001124804b252f8187178435761897d00c43cf67b588ca69f97c20b0ffad3ed94acc2c0f85f900713dd6ee9f38e5ca94490000000000000000000000000000000010ca2a8ce71b9a096c132c4a060a17365475b6556d4fc6284266ae787e217b3ceaa3a32bdf751375eaf6ab49800132fd000000000000000000000000000000000a43b435b116d9480497f6b2e1bb377550cb1a7ad59e4214bffacd517afc6b7bf91112fe57b17a02a86876ea07361bca", + "Name": "matter_fp2_to_g2_51", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000aeb244909654b3e1df7cbeccf297223be57c2f514474edf0740dff48dcd5898b6e49eb65c787aa56ef79778249f4e07000000000000000000000000000000001007c89a66dab07f54313db8682f9e829baea229b030b4514d9c93686747207939c50a198e83ac2cf50315e02642a24f", + "Expected": "000000000000000000000000000000000c3d87b1b78fab65cfc853304c682b39b6ec2b4ed005e9108f69daee5aecbd586c9818c37cdee865ba53eab9302320ce00000000000000000000000000000000062a7203cd2fd04a957cac8b6b6bb51e635ed7165c547ace10f93a32b7f37747a2e63d5767d966684409a6c748d4ee6c000000000000000000000000000000000526b44af8157dd68725aa8743684e020c1e385af7413c9dcebb320568663d18b6f29edea26f2628358852b794ffcc8e00000000000000000000000000000000098126f486ff55c21f64421e85b09a1b54f42d3499dc0e198db6f3bf7dd8476cad97c02b5b366e5ea20d8f83cc223f7c", + "Name": "matter_fp2_to_g2_52", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000398d86b5206bae4ceef0bcc6335b1f6bf5d17863ef3a5e8463aaa69d9f73f8227263964659d4b770d6d9813f9399b9d00000000000000000000000000000000096bd18be1176e16a0d80e60f7d7ec9d3b6162f683440e3cde70082a73605da3783c8a058bf76d7e25056f5cd95c31ed", + "Expected": "000000000000000000000000000000000f3e76e7d1cadfaad08d16457b02d89c40c157225eec7916d306faca8dbda008f41792888c647dff1acb4d4ba3b43c4900000000000000000000000000000000132bf730456e2afe745a58cdee689e37223292bf682d5b7dafa7df99e40d385559d0b3161bdda0bf5173c43ee46412dd00000000000000000000000000000000141b36ff6890e35db0054358bc0731b3aa0efac1a247a51daeff3515746456216975f44769174a4be41c109d35e4be33000000000000000000000000000000000ca401ee1addff8fe87b600e057ae34ba297886f92c5be8a8c00b360ada71831e31bc4ea1c309c7da31cb28d1011ecad", + "Name": "matter_fp2_to_g2_53", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000004ca5cb60c32edfa385baa911ccb7fd1f383824c22b945944b0f3f7011db8c123efd8fa70e4fe699d40c6716021f0151000000000000000000000000000000001339adb0dd8d83574c2008f0a7ed001b0808d2fb639b5e57e1d293884247d5c66c948ecc60caeea7bf440a3a44ed296d", + "Expected": "0000000000000000000000000000000009d0af77517b654ad97de3ee1dbf69ec1eee901facd0f8c39b4af393d0e63957292a7529b461f7fa58909acad32ba3a2000000000000000000000000000000000fda17cd878ec0f8c294daec1bd1d56c63e875b002a81c9c41146dbb564bab6e4eae2717c9fd718af1ba816a1526e8fa0000000000000000000000000000000017563b7ff22b50b6d9e24b1e0d89ca5c72e68d4d3cc24cce36856191111d087c3dfb392070462dc7850ef5a1422931c600000000000000000000000000000000020001fcff638504055ba35230b360e6d3cb5777b959c194d6f9b038b58d3ead0b82b28bb215378abd85d357b85ea260", + "Name": "matter_fp2_to_g2_54", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000089211892a61202b1ad3a85aab9f08f8d028f3e3deb16c1de4d62c1a403fa63c6dbbdf8cec37f0a9d6f346b1c7ee179d0000000000000000000000000000000012a9fc2070b326f4d7e64804b3a2e977f4bb36b6a4afcf27252af757d8535e8172a99dc909fad5a3ff8df23d6d6c5948", + "Expected": "0000000000000000000000000000000000d51c77c2443f00d965c0d7ec9b5a8a8003c2a77b0ffce3e47bcb55420e8690a9c2ba9235b62a4b351d79d216a3aad40000000000000000000000000000000013cd46e3ee6cbb3bfb771ee30b5f5faf0a64a9efa1f8fc57024c83ad07a9b25e513f211ea604cfdf319dc42bf4c067d300000000000000000000000000000000009fbe1fffc67220067c948e0c80de23795e045fbe8031c9010eaa69356ffd8e5741cfe12731ec13aa236630f1b1dab4000000000000000000000000000000000e5ecdf808d10d47f041e4b078e79b32520ce9623b50059a3bd8b59daebf9103c31425659ecbaebfb2384d1c2f1b400d", + "Name": "matter_fp2_to_g2_55", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000b37365748fdb21fcb46f94edf86c586f17d0e042c4683e68c6cb83e7c0ed2c30ed260c15af2c9dce77bb705debfa7590000000000000000000000000000000010d7c02c6c1ba3cf6ac09a05dfe043905e1a7eb32b67f2e8a5dfe82eaca66ef46cce43aaadeff58ca85345dd0d3bf3cb", + "Expected": "000000000000000000000000000000000f3e4d2559261829c0f4816f8b571170de1f74d75d74997cba56fdad42932db73504691f9e001f5b4604705a8c1a38e40000000000000000000000000000000018c72136bc7d3050ee693270668e706ebf70f990e447ecc6153a10625cccc9deaf5ae82d2a656b1376bf33b1c1fdc2c9000000000000000000000000000000001754f2725bfa76e92a74ad5b520ec2aa82a1f86e8623a054ebba489adfc9e71d1f14d4692ff9fdd8acc3d768b67e1b7000000000000000000000000000000000096f1373434a8822569cba0679dbd2abf619bd9a8c73e54e078688d4e2615d45431ac8cf3da5e15a83fe77d14b339e49", + "Name": "matter_fp2_to_g2_56", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000aeee59421c8ee65f8070b9d036e6bacb39dd2537d02960a3a57da4f0985cc7b27784d60fc1613f5a83c34d2250395c1000000000000000000000000000000001715ddcbaed0a05b38b1c820724405a713cc0215a4c497892f00746c0f9af28b440a3686178d9bfcd41944a224311306", + "Expected": "0000000000000000000000000000000018d515b8c99f541c7dd448c3564c1909b84517b662d6a2d1176d3bf5e70abc0a2995c73ae3f1614bfed2f64229e173e80000000000000000000000000000000012126ab671420933cc4fa9206311200cc5241ca3eec54f5d97a426a72642bdde32a65c79735446779cd1744d112d544100000000000000000000000000000000190d836312ffb0d6bf493f4c942263922659abec46ac4de639efc311753148b445509f808c2fd813729b1bd96e0e663f0000000000000000000000000000000006494f9a451460ac658ec17710bef79d59b6e0fca049804c0954c5fc472bbef520f75d34408ccc62cf2da3deeb79acc2", + "Name": "matter_fp2_to_g2_57", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000ca4b3e1a8351057ba4a2ffaf0cdf1c3c0717ccfe26433f6c40e2cc29e32ed884f63d25979580fb555a5a86c9147bcb00000000000000000000000000000000010c1db593af38aa14ca9dd588f54b219ff1fc9edd25b3d16c595662ffa7939879244326b14d978e0dfdd25e37776964c", + "Expected": "00000000000000000000000000000000173fa567aa952bfaa9a60b8232a185475cbb36761ebef49ea5fce900a06043d0e2c1b6024e40eadc9f4bf04b077201450000000000000000000000000000000010fdc32ff84f79fe39351cee1ed6b67dbcf2956020e2518d5bb5b367b61f86f1bce36f75516d9551d74cc3a567e6c2be0000000000000000000000000000000007abdff8a8967eccc4de6b4ce142173841c0e8399f5a67dcf0f7b5e5b4133391b44bf4d41d3ae3426839b19aa4c5d40c000000000000000000000000000000000c99f160062566418c09f10eb80f005f2c8c12825435f354f1d65bec0322e9b8ee968c009a84ba792a7ee7334b32bb3d", + "Name": "matter_fp2_to_g2_58", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000017cd94e7e672f0dba9a3c1db742d87cb18b9401e8311c4badc24f811a8f40c27942da6485807701c1a12da58076c756b0000000000000000000000000000000012f6de4ac9883e78f9d658cede4c70b44bac6b4c9734cbf24298ddf0df0cf54164aca245d8e313be4aca66ba3cab5d70", + "Expected": "0000000000000000000000000000000019dc92f1da66d0855ebc8e7a2ddec623a2f843a97c7385364a631671be7ee3387a0f98940b5a51c8d9e23eb27e3133b00000000000000000000000000000000008493903c5c68b2847869b8c3b0fa9b8ba15bf1f11a40a29e6e82942e2910901044254cc8e8c3c3bf56e1f1b6dab7e86000000000000000000000000000000000bd3c1e302a191094059a6493e59a11ab05a49faf333f36f7680ec9b1043e59dfd7f0fabe9f334b97cd638dbb8bb664b00000000000000000000000000000000141c9b07ff33b6ab55b320dda6be54320082f0057c446236cf3d3a51e674c26a5241f2c702d9989adbae9045942eeab6", + "Name": "matter_fp2_to_g2_59", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000001b2843d9852feae3145b242cd0999877c07785bc72cc2626f388dca32edfb112bb90f9aefd6953eb15a0babe748573d000000000000000000000000000000000a69bfe809a67ee853cb96b5a7a72798748cda56936e5664d509001544539730f57a7541ecd2396c9225818b9dbfa3c6", + "Expected": "000000000000000000000000000000000d0922466c358cfd756727e134b5e64d211244587e4eea036f0959e78570dce3ee264c703cc356cde20637c7560369340000000000000000000000000000000011a66d618f79fb662ac2b2d3b50750a5567e36d7092dfcc72d8f340c04df75ecc0ce4a01b410ea775dc548b8dc66c3d8000000000000000000000000000000000cc49cf4be5e2df6b43054092afa2d6acd66f5a43ef0667f6a2d660beb7fec70558ce02d7acbcd090df91fe833326718000000000000000000000000000000001270b0519db083f903a3dbe0b1b1bd5ce0b0059ea2c2c50335dd80b4bf154fc23a3de1ea753b0e279145254d8e5bd045", + "Name": "matter_fp2_to_g2_60", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000002479a989dbf27141bd9f467447218dfa6ef60781a7231f089d5f1f1d8dca2ce9606a75c09f63f37f9cc1ee61dceb32500000000000000000000000000000000037c2f1b96170f6847138232bac663e4940bca602717c877f58ff7f5259778246085d499ec6bbeaade18f738df333cc7", + "Expected": "0000000000000000000000000000000007826398b4ec35ab58ba9fda5c15ada2a41d3854677172ef6a4a54087b64d0f73fc875ad62236eb7fdcbd94f14c8895b0000000000000000000000000000000016b14fa92de5f6e43988829ea2f851746efd6680b0ea1283264f803c8ffbe85a343bdd42225caefd1b94b8b311d2f4950000000000000000000000000000000018797093ff82bc10e6db60b1da50b9a60da01d67673e9bee8c7af2bfa2d57f409f7b06f53944938e5c73b049c2d3c6500000000000000000000000000000000000c66dcc3d30f35c21b8a9369c8f6de28af404e8b30d3c9a7f09c461b0272ba6d5a29e716012536dbeac1d9672af8427", + "Name": "matter_fp2_to_g2_61", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000e6fcc48312831b910e52aebbf19869b3b32f05db8310b68905bb244ab784df5732db2e72183de5d231d803d92aacff9000000000000000000000000000000000f61f9e52fe3afc2a6bf12e420cebf83bc55a449d6a167779e5b6ba3281c51d790a045643aa75f2516eaf6ae2a816ac4", + "Expected": "00000000000000000000000000000000191aacce60a1a83f2c453fe196bbe5839a3a1178b147580435f7de8a2b0b4f65b3e280ac7a67570aba0fdbce6c11ad9700000000000000000000000000000000075ddd6b256f53a6ae6758a5158508540aa99b78ca069378f0ae3f5621ec24b9acff1f9b61d378334a63682a33fb0561000000000000000000000000000000000b06e11c9f858446fcc90c69d05cc26c33bafed0feda19adbd838c9c24bbf567b673110a1b248d0ee97fc682e561298e0000000000000000000000000000000018c75dc203493e12e1523af50f85ed648130ce5d3e9757f713850c867cc95c7acbb66c9733dc4f53d6a0e64bfaad5832", + "Name": "matter_fp2_to_g2_62", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000018efc6d366d79a09b7d56c81c17c2eec2ef7395fdb5991f41273329cdcf4537d342bddd83c3994a40d5c18f6afa054c600000000000000000000000000000000127021ce28627a9d6a492720f728acef3b38c12b951f70a932c7fc0ce3f5b6c80783351cec55d7d1bc4ab964bb4913b2", + "Expected": "0000000000000000000000000000000012931f51430bea6e96f8ec456ce6b3c9e058b0bd3bbfbfe8b6e84fd6110c3bbbe0001018064e8981797f9c93713a0e4400000000000000000000000000000000196b6093dd2276098853ef2bfac84f0cad06b67a12484e98915dcc756310b818d8136954de1b602eb825ab29a143cf4b0000000000000000000000000000000008284beaa877b25374571dccb218c401cd905b351dd96700853f01920e409d11c4e440e90dc175cdf0fa807cb9d1e93a00000000000000000000000000000000063c6c238485c291fbb60bd2824154a9e23dea374292966d271ae94875391b7ceeee813e3fb9504223bb86f0ea3b6cb4", + "Name": "matter_fp2_to_g2_63", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000a0277228ab4e880c12f957a6fcdfe49e2155083f3f93d3f00c68622415cd1f5bae183b7df9e08328a8139392772cdc6000000000000000000000000000000000de0ab426e56029790a5ff72f34da97e11c028dc5d31e448c49ede004102804d2bcc36d509640247a4c8bfdf5104a781", + "Expected": "0000000000000000000000000000000000f7bd0705cc4ea96ca38314cb85963044164b83a506ffeaea6e5eb8f7c4967cab1f1658f33b5435191427aaf9605bbb0000000000000000000000000000000007a93e2a5c118aff6ceaf2370ddad52a82854946ae595d384ee0b2b4935a574ba758736d84b0ae792f998ec6a707dfbe00000000000000000000000000000000090936add00fe5c7556610b28ecb4466ffc37b95b5cab43e072a585920b3cbe70faad01ef75d1dcb4f7d00d900bd99600000000000000000000000000000000006ae82539c68b7af3143e23229fe320924472c2b3e15a2e27e94cba674d30f083dce94706da094435c53285a43f89e56", + "Name": "matter_fp2_to_g2_64", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000170b243c5aa49a0134bf3d6494cc1e55a1c6ebefc6117eca3b343a48ef0a2b077c443ec5b9201b198df015a38e66b7910000000000000000000000000000000019a8ac8a3be1d45318801bb0a654963b312540d24aafec46bb7661cebeec27b0b345275fd53c041d02b1ebfa27fc3854", + "Expected": "00000000000000000000000000000000024c1b869fc13191b71d7159a07e869f1b13c11c73231b82e9bd0a7b4c32d7b376fb73d54f7231dd4974713179f235140000000000000000000000000000000012b9f95af661e8452aa5026302a7c28695307f75e9e4e32365caf378ed394fcecc831a3c47b443172188f4d18338fa75000000000000000000000000000000000f52675fb4d112d1d39ff953a253b22dfa0b73d972e756ea7fb673bf87aa992883c5baf32be6f50f880b03dcb740f06c0000000000000000000000000000000008b57726e17c873e12834dc291cff6bd95307f50e7b1d0caebd8c1eeb6eff4acc0520b135bc8e35a257133b7dc640db2", + "Name": "matter_fp2_to_g2_65", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000000fbbd5a10eeb2f358f2b167f1985d4084c4b12accb1520d780ef1c52f6fa80e97aaf190e7a7b241ef96fe8289fc0a9600000000000000000000000000000000155687114e7aa786ba27aeada830fc705aed069c4e3a07e88d7f33923319f416ff3caf6533cbb36e5bbb1b93a191bfd0", + "Expected": "00000000000000000000000000000000061938df3365bf910884ccbd74d3cea7c30416bddc1a9b65e7723c15d89aa657da36a45fe10ed50bfa0c2769bb98aa2b0000000000000000000000000000000007b3981054255715826cf8f247210521ac681305aad3928b69804117fc143c5101383eab7017127c8452a79003a857d60000000000000000000000000000000004c745113480fd87212ed3ff30ba43c8716b32e62c1f0091bde53bd4a8fa8fe6bbcf0904144f4791ed1bf12dffa1f17a000000000000000000000000000000001237ba297c7f69e5e240846a12d86c8276a9a6ceb4af977edadc7ebfba3ad3f4ecc0b875da0ea578c83fc3b91f9f31a5", + "Name": "matter_fp2_to_g2_66", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000115edef357ccc3432226d9bad796a42b1a278d9c8adfdddc5a0f8a36d32ea1787183877f8b7dfab71424cdd10b63441a0000000000000000000000000000000014b369ce61abe60d942346e049644b95a0fda96316446b2fe7ee427641af52fdd2a654bf125ff6c8c7f3dec98f6cbfb9", + "Expected": "000000000000000000000000000000000a0cc3e328b4cfd01afe53dbf971ad78fc74d951050d76210e4c84438109622f0531747e762e185e3d7ecb9faa7c3255000000000000000000000000000000000622ad6092caa727d069b8921f4124d5996f3019705a908ef95d23092c5bb148873a22c227aa25ebee361d4184cc38a10000000000000000000000000000000002938d2ff50cffaab8c056c2844c50013f5bcdbb4f91b3f823836edabb39ba17ed1b8b5862301efad04bd2f5d5bf599b00000000000000000000000000000000072e96136afebbf8c06a37cf9b20c85ef8cb3f7f99d5c71b05a187c193711e5b76f52863c7ef080a1b64b2120ab2ed84", + "Name": "matter_fp2_to_g2_67", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000d22b7b36ac66b10adb4570f8e7521ed76de2df2a7b94b2d0b9ee4514cdff6fa7c74854d16e7e70f054a91df93c7ebaf0000000000000000000000000000000016867c9cba66dd9f1d0332d31c4e46f8e393eeeeb19af7e6e01effb29ad999b3086b599ee4b371de557d4fafd5da3794", + "Expected": "00000000000000000000000000000000142ceeefa9fceb903b25d4dc68f6755833d7529752db0f125f7f65f2b7aeea8c90e599ac409576e82f7b9d6f83c43aa0000000000000000000000000000000001664acd89b482aed04ef40bd4d1ff9f39c80d7738771e2b3ca731af01aa230d865869cb05d83992e94ad99549fd0b8550000000000000000000000000000000013d6ace9b492c014d9a7504b5abe442e3bba13b1ada454aa53177990ec44f616e091f1382d36db87b7e794c11570a9bf00000000000000000000000000000000081b7a8a2906435f8a9242f573225ea62c5429e903bebda9fe9973a18ed2682185d72aaa6584b9848d1cc45ac907dd27", + "Name": "matter_fp2_to_g2_68", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000db9258e1257e659e60bf8569ea90c8247a53a1d1eb958481623447a38d0f1f1686c3e40c8f15bd06cf5be9c02485452000000000000000000000000000000000517c87f3df032ff08d960f524939e66f7fa69b4168b0f2507baf7d7231a70dc5690a02d317b26f219365ac3255bee78", + "Expected": "000000000000000000000000000000001182e4230f0c360c07913349f89f8436c01841c9615348a0d7057336c7483342024b0369ae52f39d4582f9885f552b5d000000000000000000000000000000000d15433ed130163a85f8ba87468c906aba88ef8610fcc1a8d6b3308cda29907acca351fd7fb19799184f1ad91c751b5e00000000000000000000000000000000111089005c4c5370863b0ea6b629197a865f978f71becb741f50f9b4e49b13162ca63c29aa26287faa9c923f57f4ad4c000000000000000000000000000000000dce405ed2a79ad433123105ad01a26ee85d1ba4e5f3b4e0339fea787058c06e9a6b10f5ec8f6eeb85b211e18b6ea076", + "Name": "matter_fp2_to_g2_69", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000000b6573c743989fc8613d4ea09c2e500ce965b50cf0c8975ff703116464082efff4b42828c8337809f6938d7cdd3f66e000000000000000000000000000000000896d316629c80ce6e5f240535863b9e064728665c0815f39b21675c236f6995e7dfff1e4aec9ad05861e2122469ea56", + "Expected": "000000000000000000000000000000001694cb615d2994a903a13645ad44a63395320f286503902b6009e7c795dc8f024260e0c45bedd864edc9fcb9d1ca6bc1000000000000000000000000000000000f20538af015bd6d213f90fb1a1ebde4d9e2ab2defaf80d791a1f70af2ca7ea1598d43e9eef1cc982f468cf15d223c9d00000000000000000000000000000000046c62bec4c6876a67f5fe68107d677db8fa4d59ac0cb7afe6e706864c6e94744bedac6b34a68e8ebf89c231307b86d3000000000000000000000000000000001839f3b8a6dd8fe8028247670fe5b491bb43ea8fda53116dca87f97da96573a5e701a703fb5fa7bca457ef88a827e061", + "Name": "matter_fp2_to_g2_70", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000011fd2ccf6883b78fe19cfe7beded503cdbe1cd5dc9ee452aa6b329d2237c2529df6774334b132cfeaa616f20335f88680000000000000000000000000000000009eacceef036ec500e7676f54af703016fac93d69ed19c8943b64ffed2db498b19cd255a0a3437b568eade0f497c7b17", + "Expected": "0000000000000000000000000000000009d8725eb8757828a94969ebf40545a62835686897d4504a66484a3078b2f15e39fe918d8dc01bc7560dcb005a7a0dbb000000000000000000000000000000000954a6cc9b2dedca1cf280f72fd0625184b8f83b78ee1ffcaf0f9178ce97900d759e4a74b914c3ddc32f84c3f4c3a8d60000000000000000000000000000000014121b83d2a06390ce7359e570e1593d5ff097cb0e44c38bc74171fbd8a8da0dfffcc2bcb95fb2d80a55933f696a86cb0000000000000000000000000000000016f71d24256de70618a02b0f016c6f31a21d2cc42855886ba30176584a028c2e12367be19b834bf41356cdab21223314", + "Name": "matter_fp2_to_g2_71", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000004a851380536054f6b69ef7581b57dfd753d1e6201069bd1218ae5766aada087b4b08f65d43b3ce0215640e8d34633310000000000000000000000000000000013579671b64f2d9a2c3ac2737cf95c2148acce3dcecb3db6d019730010c50d1c0504ba4ed42d93771ba296b0b07487d7", + "Expected": "000000000000000000000000000000000cd47f0982904ccaf4f3cdaa37091a08e67a5f04af09033b864631300bb6c2aacbad105eca6ddf68a643976fb555d3d80000000000000000000000000000000012332ddb0e91f0ef9e085f21634c6d69576e60d3d24732a0c91a560906791f60f79d09ac0ebf448bd39f047b1dd428450000000000000000000000000000000000a756a869b3cbc5624f0e08019170beda35fd2642a79108b284a503942f8267b75868636302e5a12b4f1505331b15f9000000000000000000000000000000000f60724f6c8200edff41f3299ca003e9ea03b97b01a3e8c63763bdf67b9f7677331a7144915312458c40d041be97b3c8", + "Name": "matter_fp2_to_g2_72", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000021dc1dedded9b0dd90afa9ab7fa8f9c33930fe4ae68185ea4cce9ed97ce4cc9ff93f96377b11f8d42b02e759a10b06200000000000000000000000000000000034c963fda3bb80043d6d7887661ad59b3c31c88c958b451a8e11684770c132205db6655ad7cbd604ecc3225b0c128b0", + "Expected": "00000000000000000000000000000000095cd509e53f10b1ee18b2120e2d18f0905a202a992a9c62480beb6588275fc8b5b151e6abf17a12b6d9cd03a8b37a59000000000000000000000000000000001723bf1a3d79935eb4b39f7feaa1e05cd8f3e7a32e2c406625053d8d8fde33eefec231ee00adb00b0acac16a83dc77fb0000000000000000000000000000000004af528e886dad3f9fa7232605936bc22a6a22622828367791920ec9d31cdb2f290e37f5fc79efaeaf96c86b3f6e39220000000000000000000000000000000015bada14a84fdb09b77397cd2e27836f9f88854924af0cafc6f9125d32be848c8325a3eee1a26de8be8eb80b601f1ad5", + "Name": "matter_fp2_to_g2_73", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000003e8d1be04f8dbe5c7e1c7553cde8355ae16d26c819dea92fb543cbd9fe9e726359e1e4be0483a7720343f34c6a3fb9200000000000000000000000000000000062bc5fdae812802bdea09e4130c3d9bf80c7518138b116a4b6a302c155b97226a6ccc8a3ace18744e7adece08781f72", + "Expected": "000000000000000000000000000000000d8f14042f36bb377655b63dbc37c50e0eb5775d4e4399972a6758cdfa9751cb4b733745ed1a47fe5f2cc434efc5af81000000000000000000000000000000001384016829d028f823e6d062898c042a461bca13ae4627c983d9b5c9e8b4ffff7eb25daa1c52b39e309b9c1e7e4f2e920000000000000000000000000000000004f7904d491a0c2018b1361a9cfec4fc829e607402859fd9b9ded60adcee51e9b522d302f9064130a4eed1327f49bb4f000000000000000000000000000000000ef4fe949fca569b31fc57ae7d0166ea53318c5712311076e052c2967144116f5490fdf56f26adf64aa01beb4f6cd214", + "Name": "matter_fp2_to_g2_74", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000014b922157b19ed9debd9ae95cd9435f7980b8d4ea33fd29f99d5e7fb1a96f6d99ae13f7f86239c4bc286c3927d3522a000000000000000000000000000000000f6d4badf78d9115d93783a59ec9576fcfd87a2c29e1c506b6f7e313e71723811a36d64b37650fb6f7b460105a7e13f1", + "Expected": "000000000000000000000000000000000f20b3a6505784681331208b573d3a241706692db71b5daf4e9c80adb1fa9bb87023d7ba7f9c65158653c735dee9dfdd000000000000000000000000000000000f7f357407ca6cc5c5fae4b84509d71b2f4de9af226cb4038b4820c0541d4999b7396608efd2f322a00a768129f9800400000000000000000000000000000000138dcc1b9d978adb5eee6356980cec5d18cfbfbf18cf6fd14f4119a563f473f5027af06342e84ea858223ed63d1a16af00000000000000000000000000000000012b63f0d2e8ea361d55aa617a99e066b5feef3af1930b83d2a48b527e0ef304ceadf7cba1415db80c54fdcbbcf66d14", + "Name": "matter_fp2_to_g2_75", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000005a54ee5e3dc05c38ade7a42c71baf5a1467938f97c0cdf0742441cd339f22542b1ca6cd215d385b3fd6ba74ec996a4d00000000000000000000000000000000051c6f0ce621e8e27e5017628690fb68f0fea27d67726a0a77b0caf9f524936e123ff096168ff2079b9990c07fa80354", + "Expected": "0000000000000000000000000000000015ff2aa94f802d8f9c60ddcb43aee598239cf3ab7f90f8289a487b673f6065f8d9bc92bd4cd28df4a7b0d3bb78fad243000000000000000000000000000000000884b5d4ca3c8abea737cfca05878528890b6cee9bbac0bf027df5d4e0add431829caddf4c1e001818581ce08686eeed0000000000000000000000000000000019b91a7738fde9760240b335457955e963030848e85717858f22dc33ba5a4721156cfdd7341aa86d10d268e2fc9a1d26000000000000000000000000000000000af85e60161795906f3cf705f5e8cb8c15083a90836eac78445c6bc27ffbfc8c2df3009b436989b46b271dd8d1dbc282", + "Name": "matter_fp2_to_g2_76", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000094e958d9b7dac39fa4f0143a333b2ccee09046cd23e6a1c0712470a3c2e61d2f8b85aeca37350f71d7ec75aea2b3b6b00000000000000000000000000000000080743cdb5e359e8b8ad3485d53ea286669ad66d841945296edf80dde77b20a158e2c1529dfc33a1fbecf177d75a0c69", + "Expected": "0000000000000000000000000000000001bd1fe6a6c373cfdc2bfd488b0c942492b77d55b2560824edef3a91c711ee336bc1366690be40949d04edd39ad48a7500000000000000000000000000000000161476946a5687113c74a34284f49b0658e323fae57aba88b039eae584d6ef28adca669fb083a2fe8f0ef664eb5b957d0000000000000000000000000000000007aead870ae09a04cf9c9fa49d0888f7010782cdc5a0ade4c1340ff15d99cb39b7412d66d4147b95601fcf5a39c39bca00000000000000000000000000000000095cce83dbfec12973e27627bfb2d93fa9a027a2c2af4259a0879d6bda055d74559fc93fb3b4f6b0088f702af29a7643", + "Name": "matter_fp2_to_g2_77", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000dec04526dbf7666d2c29db5de1ef0b3da85380a171d871a57ae3df364d2754fceabf9d4d2a3da1ecd94e377abc78430000000000000000000000000000000000d19875fe988ffbd0cf1e9bfefc7019579962ffa3a585ee232615e4a5fce0a07bce0537b203ea00010a90ec05d5b8de7", + "Expected": "00000000000000000000000000000000133cdf684c3ff1cdaf07ff787b57a66c215eef06acc2aec4d726a086480e7b2a5dead2cb357d99e298df32d4c6f5029b0000000000000000000000000000000019cd65b830fb17880f40e104ed63a7d49b0fbad8eead7502f18f1b9f85f3f6ba6c275b8a242effc61a7a5d770a4fdaa700000000000000000000000000000000039aeacd163862e476b17a22c76042d7896a04f158489ae71afdd35d27106a3ec276baf5c08e3eed4b3f0a79c3c458d200000000000000000000000000000000125a9bd770c1fea2155a581211bd71d55eb1966645cc892a05d32cf1e4e5b23278ea2fb1336bba7f2c887debe4a93b52", + "Name": "matter_fp2_to_g2_78", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000016dd03f0df71b183e42cc29c665f18d57637b65f05df85aed9a0f7b8aa37f7913f6606c10f24a7a8c570f485905583a00000000000000000000000000000000161e62d8be678a114fd4a99a6caeb9481f5eaef145571152fe8a6ed77a34c06a1b6ff66044102d19a94abcaaeb254e73", + "Expected": "0000000000000000000000000000000007843268081f61ad2b3f6653336a99086381bb4da4c23b7d59b9c7827f2d4c196d136508c8a1f3d2f939e8c9799b95e10000000000000000000000000000000000e2c57ad95f762115d8230320810a4ea9978e26ca17decd6af4c112789608967a92fafe3fb3e79539d75d1c0bae97740000000000000000000000000000000010951c9839db9dd6ca5ef95bd1b1b9cf60bfd97cf88129fca23b24f19c9d5c71486dffb762e92f23d2a9e9d462556f620000000000000000000000000000000013d35c17b3763fc5db46ac8c44aef996f3f876c49f5278b7c97e844f23ac49f2d50b3af080322d30ead873af7b4257e1", + "Name": "matter_fp2_to_g2_79", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000036efffcb0c6f42109bf9b8b7421e32fa3f855373345341e6000eccaca135ef3b2e1c0151bddbd46ae92185acb847d74000000000000000000000000000000000edbd7a40f3e688eaff5e29800159b8d799df07e81f65d59011e84329b4689a28a15ce11537fb560df705be26bf14b1e", + "Expected": "0000000000000000000000000000000001aa1919a50b5bad62b839d672d5a11ad345fcc61f75eccc42990e113deb8a486423d1b27e7c81536d8a5799986b9408000000000000000000000000000000001879295d2f7bb3923ec61c063ee4f96d7d7cf7786259e2f4cbc3ccffe7e114af264b3527a5e06dcfad50ec1e2a9c1ae0000000000000000000000000000000001042632662e406c95f3fd44a6d956e526907147e7e6d4219c1c4b28a31e479974d00d4ad6e683f6a834d3d4a20830f4b000000000000000000000000000000000a29ea98ec25e7827bcb349ccdb2a57926809f3cce44d5ff6cd636460278c8103b0db78fa580e9edd4ecd0bdb21018ff", + "Name": "matter_fp2_to_g2_80", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000974c7d17cbf91947ad435b30ad2b639671a43d67da6a4edc7f8bdc11fe817d4d42f687dd642a2be89c81bc36e8df592000000000000000000000000000000000efeeb85860877abdabae35672a77ca9d2cf0ed18ed209fb905b591a841c900ed06d2c32c56bed5f7efd469d369b05b8", + "Expected": "000000000000000000000000000000000c67498c6751cc27d871b8711c4739398c501a5bfb688d7e1a73dc7db5c47c3e28b633078cb83745bf5b0d5d2dde3ce2000000000000000000000000000000000c205c03305422bd44082715b90e0a0ec178003d6f5e14a0d13bb0f2c38f2270816b884b4870b75db44ab080f88a35e2000000000000000000000000000000000257f378935772d326710ec6efeb22f8c9b6b549c8a4c0205b75740047d750d73da4e71aaa8ff33b9bd8ab7621b08e62000000000000000000000000000000000c386a15f09c849be9f449a59e1332a1e7f16a9394c8de198c01399a05b0f963921c4c57d49916407ae0d202af8da32a", + "Name": "matter_fp2_to_g2_81", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000015333364f4d0d173ef35e447fc189b9d65ef71b9fc4ecba25fb6c8c1bfe8467f26bb9c55ef10bb34125d714b94aa1df1000000000000000000000000000000000cbba9d8ac191032f03c0746f13108962130c9e2c01d47f01174a4c4d3daa7631268f7dcc08dfda317bd249fb6e73e8a", + "Expected": "000000000000000000000000000000000864da537fd94a9ff1bdae733f01e145dc97a894733d0811cd67c2648ba61d0b187241f9ec69d8c011f514894a05a608000000000000000000000000000000000a53ea4ff9c0ff71541ee21127a33daff2b39e74301946a86e51dc7834717e7d8784cf92fa5845bc0613b6b869003f58000000000000000000000000000000000582f5a1fcef3067dfcdfabc6af33871114538abcb02fcad761cb496020c7b423fc52f0075916f160fbe03574df97ea4000000000000000000000000000000001244ede8ba0dc09aacdc5d9f886e59bf963a25885dbbe2c3d1f611bfae82debc556ec4c94f0606492c7b8c7bf976ec34", + "Name": "matter_fp2_to_g2_82", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000781e980c167c982c2fc8d0baa3907bc5499eafca675ae20a10b25063c9088fd06f6769df505e5900bcaf99e266c052c00000000000000000000000000000000183c12798438ea92db75d5bf76cf29d320fab3653e4131989205f2817aebcb1b13f161864c084fd13a11459d7d5ccd92", + "Expected": "0000000000000000000000000000000016c334aec0e19934665596f0ae37eb398f1d6f0d0c9f08189f1ccc219230395124a9da03858bdba13ec5366da54228af000000000000000000000000000000000b156ea34ae7b5c252dd90997f1c693773a463c26935a69bcc0599b95bde9e6aa31649c48b6ee4ec1f0a56b19273a5170000000000000000000000000000000014b2d69e02418844effcbc0d564b2721deae2872cd1f27f61d544fc0ebd5cadc77c6777ec944ef0500db181a5443618e0000000000000000000000000000000004f0d48a25c1eb81233f385af17ab6abf554e1285b669eeb5e884c64d5815fd5fa1350bb361997cf2e317f7c5e9cd19a", + "Name": "matter_fp2_to_g2_83", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000879133a3c0e50c90abf1a6ac75bbeca1121c865ef39e9224ddb160eb725e0850a34aaf9014e42174966773e40e4c99a0000000000000000000000000000000004c66f8f5bd462cb27e9f5e1d93e322bd97582b9e81d07b2877103420262e4cfe6d0e3bc07f9f160701fd754793eae33", + "Expected": "0000000000000000000000000000000003c0d6b721cee4e5fdc6a02095674a58075f81b1d28163f81d5b258c82634297009e6bfc8193969e23e196cf7a99ad6c0000000000000000000000000000000013229818411c8e55e50a63df6983150c1d5ead828711131d9c81841850ed76e4712954d3225eb6d7fffd3cb9924f7497000000000000000000000000000000000f42d6e4d5a28dbfda87c806cb0b1bbabb745e63e655c3c6be50411da4dcdc745ae50f71d56e88db8454d40375e325810000000000000000000000000000000000f663ab791b48f76d358e66e8cd8fa40848dff2bbec758ce1d7b3fe02d1f6b3f123cef644d4fd86d6a77b8155feae58", + "Name": "matter_fp2_to_g2_84", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000a7e855324ef471b8fefb31967cec84d57953407ba555b672fa59364b303030cb02b6c77933cc63fcd1b8c107b263554000000000000000000000000000000000b50c3f7cebdcf538820113acdb017fcd5d41a4fd679af8dfde7b0c330e3576ca79d09eedc724a93a3f5c90d141e7524", + "Expected": "00000000000000000000000000000000197865f685e78a8842fa79ddc728d507e9f31b31666d1952a46f6422c97c83fba3087be70e3bb588260556014523f74000000000000000000000000000000000131f5d85ad3beaabd129d5a5675d90ea911ebd02cddb5ddc7a8be28c33061430d684d123d5c516785d21ebf756c99195000000000000000000000000000000000c7a14948f3aa29f845e5ca9877db9f0477af376eaeb45324c21e6f99e738aeec96b89af4df942bffbabbf50172d8e5b000000000000000000000000000000000ed4aea3cb585b0d36972f9ad6943172ca7375b44d1d6e80e0bf97a0b25d74deca4d35ce865c8747f1c7a2771a37c667", + "Name": "matter_fp2_to_g2_85", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001706830efca18d3e75ea0f1ca8af23a816017ceeb045694cdbad6d3d9aa5a9ddb123f5097a226a217166de3a82038393000000000000000000000000000000000402132ac383a2fcb17fe73398273ef0c2f2d0d6edabc78f31080d3ecbf7c249ffeef28bb8b37a6ef2a7d726c070dc41", + "Expected": "000000000000000000000000000000000a795c2affaaecab6cd2cfd6c8fab6e35cdd646e9cfa7b5e02400ef4abf839a69924ea80152eca7810a5041d1bf58ee800000000000000000000000000000000121426bb945d6f6b385c98a5247b7dadaebd3375dd8b2bff7aa77fddfbe603de89e77baf0e8f36a924c707c53d29a1450000000000000000000000000000000007a6fcb486634186f001c8b99874f0a07a37f1ff4b30599d2f570f1bb4ff290b816547f6ce8b3c1ed33e57630a1d57ab000000000000000000000000000000000fa65924a8f17414eb7dcc54f2a4134568484e91533dd21fd33cbcc37a920f2804516a64f1986e9d887ca189179d07c8", + "Name": "matter_fp2_to_g2_86", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000024beda2b950efcee233435f0c748e33aa928f54ff29d3db217d7e32b1aac5f4ed11705da4fb8fd38481382486e4aef7000000000000000000000000000000000c85283ad6e35a72d07b74775df1a4660113d50b51426451f454a575adf9cbf9d7be3f521649f6c367c4f4c74b67ff6b", + "Expected": "00000000000000000000000000000000049d9ac43e31faa3d02f8255d207b82e4b27e8a9a61ba45fc4f9ad8048e5f89b58d25d98253aabe29334e0dc09d1cd6b000000000000000000000000000000001544f90a0baea38b48d89bcb337cf5a80faaa79334733b7e6126f55358a7e498aeb61419065b9434cab9d10fe8e7fd9f00000000000000000000000000000000139bdd668462a1b5d3ef1299d47aa91ed141ccbeba5b08a8ee31b023aa78c16514a97ba08abf5c8bb1abbd85b3fe87350000000000000000000000000000000005c7dbb8a22403a96aee634cfc67ee6f1069cd61a1e1831e8faa9d7e1aa5e4f7623f51f2e5b739f7fcf3b4ba77c82ff1", + "Name": "matter_fp2_to_g2_87", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000cb18f477abe58af92116101c3f52ad4f6074ed92a08c3adcc6660b555df9cff09dd8b34e032ed81e868a62bda50378d0000000000000000000000000000000013c4ab1558dc250c3b5d0f0fae3db62b8df969bb41e9ecc24c10e1e51cb399f1368bed7375a9b9ad9c7653c868eecfe3", + "Expected": "000000000000000000000000000000000b8b8bf2b25c2386e5f3be4bdb387d8005cf055e68ab9a5606f17dbedc4fbd7a11314fd646d08bbd6e394485d4f56f5f00000000000000000000000000000000173a45d766682f82ec2d69aed1d80ede2477c276ddaa8fb97f5f4d0515b2c2e370c615cd81c1e361f95db855c9b1b6e200000000000000000000000000000000115868a9187a0465a9309054e865ef224ec3c88a5eafbcc25f9a912ee3b19084757a90b72a4038ba71b10f59fe2f93100000000000000000000000000000000006c5476eb8aa1a471d289af52c7d1df55f6bb1ad53d7eaba6bdc2a97fcb24ec480f9d8e12079d366f2213194c861f016", + "Name": "matter_fp2_to_g2_88", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000188f650fdc51b970d16c0637ad5e97aade93c7f1398751439484ec6cc56613814908e51cfa7f68da9d980bb9dac47a400000000000000000000000000000000081834f86f1310135a2cb03265f37d9b7c9459bb149bc54b5a61319a7cde36c6a2a0fb49f8f1fb9d80f07b84f799119f", + "Expected": "0000000000000000000000000000000016e8fea4d09831146fc35bcad28e441f2c02e4d17838e04dc7cf909b2133297a13f07ee927722f3d78e36721d6848e3400000000000000000000000000000000114dee8b3a47269e9ada05ee015a874d1cbdfff4acdf5310642f829efd08f78dd6110e1c7a514e7d76aff52046f4ed140000000000000000000000000000000017b9d23f7a865a3ca61197d841fd9195805a9e883d79dc7d36e82f504e6689ade0e84c70a5c5c516fac3e3c643942e160000000000000000000000000000000001ab82b2a0986dec3211507b8adca351829b0a13f25e281f98f54d9e0e32280ea4c638dcb74280eb747a0d9af43b6b74", + "Name": "matter_fp2_to_g2_89", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000006f66eb49f95f51ec90df86254580f0ae57862bdd8b5f2759ace63c5f14f8c5a762207f744bb82a8962f8c4fa410dfdb0000000000000000000000000000000004e02a80628c30ce336eab890fa37a227f77357a60be72cb87cc2b7442d2163d395fdc59350624ca1322bfe8619a2efd", + "Expected": "0000000000000000000000000000000006bc2ae646a603a1f4524b445cdeb99914e4ed19cd0676d511764b828bfe126e81cad2cb566655f04de1a302c14d70bc00000000000000000000000000000000023bd509aabfa41385e90cd4b1cbbfa45d066c4defab56993aaa386dc5b7707b1a3a7d444b8bd295a30d0b8f4bdc572e0000000000000000000000000000000006f82e60e18cc958375cce6f465db461ff46ed9d15cfcc01a3aff455d54c77ebba5a654c2ec788b6ed8ac53c39defdd3000000000000000000000000000000000896fbe6492c4c297f8b6d60295a7f2565734d69eea67b2675211a203fec043f0d181b1348bea425a068b7bc12676ed0", + "Name": "matter_fp2_to_g2_90", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001451bcd19495cea3a19393b77760f688fbf17b107dc131c88cbb503eee2a804e2978d6e8a4720d144083d28be73371d70000000000000000000000000000000017db715e8680a0e82e18b513f2c9c7ea136cefe8add71aac6baba146e3e33a498d025c7e0808ced306c915eb02900c61", + "Expected": "0000000000000000000000000000000008604a06a198c3e11458de920176842221667d024f9c155892485a37ff56252be1dc629a6fd580fa41f5e598a23f3651000000000000000000000000000000000e008eed25eafeaa67f27e89e1f81b469724a4b00f08dc4ae672aa1587b19dc615330e3fce0fbd98d7526bc2c4afe69e0000000000000000000000000000000015bc1e4ea5ae2a7fde6d5e5c3e58f6ff5df5bcb125ab402f10edd09087bde39fa27dfcdce7d04fd18ce399729e155fae0000000000000000000000000000000006684e9be8bf9fa4badda842a1d8840f0820d9a797e482c64f4004a18cd63986f19abfc93f6bf068d38eb1e491cabbe6", + "Name": "matter_fp2_to_g2_91", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000013a6e129d4dd4aa93cff5489ee879763e2a2231939e609d2d72f07e630b37d09f3057a36fd5cdfc9c81675c996f8ba0f000000000000000000000000000000000e8d7ad082e8f9a718fc2ea712853ed9ab4e8b1a8ca9988f77c70fc759f1fe2d4bd73696e539f130be13b2862efbdf77", + "Expected": "000000000000000000000000000000000f15c3d0b40735babb2e38a2471773faa16b2fa307c3a573ef4cfa5a5559574b2d26cf88b19dee204b77f6e11a1b927c000000000000000000000000000000000d224445f3d31d381bb29c4fdc8130174f5bcb957f451c92f4a652cc3d2b5df985017133a944849b5228a88f99bec771000000000000000000000000000000001338b48bc1fa229f251bcd4828654baec9d149f090b19596ad3b444eacc7bc583f97d9cfc40d5611fdcf89cc9a88e33b000000000000000000000000000000000c30dd2aa51f6577d57175edb3ccc1b324717bc195eb0073c1dff4e5b0d77cf5e41ec233527b3936994e86303f91b172", + "Name": "matter_fp2_to_g2_92", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000003379bc10acda5ed1014e2bba1e30cf83b72fe69259eb35476a031b8a898e0183bc32ee853a85fb3d738424208fc880900000000000000000000000000000000175a2e5a44ed62744fbbab9581ea7283470bff12436dfc414ad80b4070f895de3786022cbaed55bdbbc4f68db7460548", + "Expected": "000000000000000000000000000000001735e1f2fe905839fd6534c95b95322f8cc86a4c482f1ad7691b9b9bb8f55015b4faaa1f243786aa33b5874817cd09c80000000000000000000000000000000013f1a27931ac513145f2601e009cf637ba4bdb18a7604f89534fa3ec8488f5b6eab9963c5d753fdd34cbe7d2f8eb8a5900000000000000000000000000000000092d8f800e7a4bf6f9a25ddd7f64fc403db53b1695ae59c15f229458f347a8e7c2ebc415af2d3849282b670c5cf6f8600000000000000000000000000000000019d22d694e559c55db63521e7b60a1a2342c3cce868d70951e5ed32ec0f5efaeab0e78b21359110f6e769776b745938a", + "Name": "matter_fp2_to_g2_93", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000b384a9db472c38a5d246da56059b7630f002b5f4663abce7c5f6e896222a1ca1ac02883a1ec95a4ef09bcfab7d0652a000000000000000000000000000000000de09ef45aafa56936e446e18ef9ff97ca8b81c295d35cf7b72416ebd80586d0fc479d86c23295ac54a23489af045ebc", + "Expected": "000000000000000000000000000000000d7dc499e5213120b3ccc173c83d3c15dde9e13ef57238cad84889243b35c8e69eea2ac7ef7560051dcd7402b46b733e00000000000000000000000000000000063ad31c17eb17d39cb4b33e45a0b0e951becc11b685b10cb45cff268b6dca40b780f7e1532be91903372c413a11b5be00000000000000000000000000000000140da959456cbd34e041409350d6106ff65ce6dd2ac3149f04959b16eb83dd0456ca11e5990daf4a1e5c23d3f30a6c4b00000000000000000000000000000000195d07ab127d49baf89fcf5eea1f5e4cffea1a577a5c864c0e637fbdfa10182adc1d5d4ebb871949300193e45ae0fbdd", + "Name": "matter_fp2_to_g2_94", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000014df33e7d3ef2c339b958fee667097ccf146556261f7db4b0b0a3c29897b73a0ca249866cff1461488012bc16df43b0d00000000000000000000000000000000099dda253a43b8cfac580306267d9dfeb2c129ac1818fee43c6df5e582f5fa726ba73e1a2ef6a9e011a387c393529678", + "Expected": "0000000000000000000000000000000013ec1ef25b303fe2f10a0bbe9bd77a4b2a055e176c2870c99e63b4baf2b313a835459263351dfbc25c22ea32946d8956000000000000000000000000000000000cb1c3292a2e0c9b1c1ff43cbf7595f39c00fd413b54782681fe75a6f5f231d13912f8d598dd8aaae8159de083dccd8e0000000000000000000000000000000005385f2d4bb6d94d67b2a3bacd3aae31da282707672252c0ab1a12fc85d8e9b9eb75454eb145937542099b860f9d6dce000000000000000000000000000000000e59506f7733a38a7e1da4ea5958de4755b52a9307ba2e5813131b33b86f0e401f97594d9674ff1667068a1ec3c9b145", + "Name": "matter_fp2_to_g2_95", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000011c89c8d7e83155a308b2e517a23f05a4a55353332292b44b0a891b6f730fd126bd0b97eb87f0fbdb6c82779791d022f000000000000000000000000000000000da6f02450955bf26e236ec63aaf80a018ac34fd8784bb24a22a1fc5e8bd686244a923009a10cb38b1422534d0997afd", + "Expected": "000000000000000000000000000000000f4392a41fb3e58dea97b97fd22e2fe6436c3f9bbcd944585a76a5f1a8f98ea4ee21639208d765b6c3a7d08f8cd3f3f00000000000000000000000000000000002c3d62794996dbb881b665eece98926f41a42c21539125fda6070d9f69e29e0557c886b42e4bcd97b14134d6e9d1d710000000000000000000000000000000004b93f315822aa1be8250c2e736727d390ae3a862c4c7dda452817f70f01c73e6f344df1b0f05f03bd574edecc70902e000000000000000000000000000000000731403981fd6243d00c23d0a42a759016f7907548847743f18421f51b1e72cea92f0c5580328babd4ae3e15bc9c56de", + "Name": "matter_fp2_to_g2_96", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000015bb227b5c9ccfb8390edcd158b04a69a88a3b99a10ae90e548182751a16448df25493061afde2c9790a0e75e6f409a20000000000000000000000000000000001d7b609155bf3939192eee9642032e6fb10f57d53916674c60211a37b4a7662759899a9569e2dc730febd23f747a7a3", + "Expected": "000000000000000000000000000000000b35c6294b70336217eb9334ff1f1bde9d892d109e947de7f4f5681b3830ed00ad1b89ccd7cbad88ce1586449140697d00000000000000000000000000000000032691e5f4597c06496e9e37907041ddcadd18ca8ce64a8b400b1e2e8d63acce5533231edb66b69807fa2dc026c1d2be000000000000000000000000000000000773ccd132cb215cd98aa17d7fc432e0577b08d8faaa35199000d46fdeeb954e8652566384fa0cc5bcd1724942f7075b00000000000000000000000000000000112e951db3694944fc82fb980547cd8b7f2e5ec6fd2051b6aff2573797bd6a28437848ea0627054af1960ad1de0981e5", + "Name": "matter_fp2_to_g2_97", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000017599d71686e817cf58b78dd7586d5b359999b32b0dec2d67e33fb6388411418ecfaa2670a2cc9dce3dadaed0fb3364000000000000000000000000000000001773995b540be9ffbfd276a92c0494e4eae296d094f9f7eca975cf4f73ae05e92bd64ea71ac47bba534044f4072a6591", + "Expected": "0000000000000000000000000000000018f2eace212eacabd44ff01d886543410ef72b4d27f8d25cb080dbe4b1d4b2b4e57e4dd40723d15789d9b5104b088d9b00000000000000000000000000000000098e9e9b302876ce85ba486609fd028f357314149ce8b530778e6de586ab057fe59648d8c8ae80fe619c4c605b90784a0000000000000000000000000000000016d20a8ca43d37518c8a0f47566ba61a7aade9ea2cdd4a0907ff0ed862c6b7c64815d50397eebec262a05c6010cfaa790000000000000000000000000000000005a70c2fce25acdc4a95fc2bdedb007d71f24b0b5714fa14910ef590215d25442e91a66b6bfea5f7777f0c6d202eff32", + "Name": "matter_fp2_to_g2_98", + "Gas": 110000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000f470603a402bc134db1b389fd187460f9eb2dd001a2e99f730af386508c62f0e911d831a2562da84bce11d39f2ff13f000000000000000000000000000000000d8c45f4ab20642d0cba9764126e0818b7d731a6ba29ed234d9d6309a5e8ddfbd85193f1fa8b7cfeed3d31b23b904ee9", + "Expected": "0000000000000000000000000000000012e74d5a0c005a86ca148e9eff8e34a00bfa8b6e6aadf633d65cd09bb29917e0ceb0d5c9d9650c162d7fe4aa274526850000000000000000000000000000000005f09101a2088712619f9c096403b66855a12f9016c55aef6047372fba933f02d9d59db1a86df7be57978021e245782100000000000000000000000000000000136975b37fe400d1d217a2b496c1552b39be4e9e71dd7ad482f5f0836d271d02959fdb698dda3d0530587fb86e0db1dd0000000000000000000000000000000000bad0aabd9309e92e2dd752f4dd73be07c0de2c5ddd57916b9ffa065d7440d03d44e7c042075cda694414a9fb639bb7", + "Name": "matter_fp2_to_g2_99", + "Gas": 110000, + "NoBenchmark": false + } +] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/precompiles/blsPairing.json b/x/evm/core/vm/testdata/precompiles/blsPairing.json new file mode 100644 index 0000000000..138b13944a --- /dev/null +++ b/x/evm/core/vm/testdata/precompiles/blsPairing.json @@ -0,0 +1,702 @@ +[ + { + "Input": "000000000000000000000000000000000572cbea904d67468808c8eb50a9450c9721db309128012543902d0ac358a62ae28f75bb8f1c7c42c39a8c5529bf0f4e00000000000000000000000000000000166a9d8cabc673a322fda673779d8e3822ba3ecb8670e461f73bb9021d5fd76a4c56d9d4cd16bd1bba86881979749d2800000000000000000000000000000000122915c824a0857e2ee414a3dccb23ae691ae54329781315a0c75df1c04d6d7a50a030fc866f09d516020ef82324afae0000000000000000000000000000000009380275bbc8e5dcea7dc4dd7e0550ff2ac480905396eda55062650f8d251c96eb480673937cc6d9d6a44aaa56ca66dc000000000000000000000000000000000b21da7955969e61010c7a1abc1a6f0136961d1e3b20b1a7326ac738fef5c721479dfd948b52fdf2455e44813ecfd8920000000000000000000000000000000008f239ba329b3967fe48d718a36cfe5f62a7e42e0bf1c1ed714150a166bfbd6bcf6b3b58b975b9edea56d53f23a0e8490000000000000000000000000000000006e82f6da4520f85c5d27d8f329eccfa05944fd1096b20734c894966d12a9e2a9a9744529d7212d33883113a0cadb9090000000000000000000000000000000017d81038f7d60bee9110d9c0d6d1102fe2d998c957f28e31ec284cc04134df8e47e8f82ff3af2e60a6d9688a4563477c00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000d1b3cc2c7027888be51d9ef691d77bcb679afda66c73f17f9ee3837a55024f78c71363275a75d75d86bab79f74782aa0000000000000000000000000000000013fa4d4a0ad8b1ce186ed5061789213d993923066dddaf1040bc3ff59f825c78df74f2d75467e25e0f55f8a00fa030ed", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "bls_pairing_e(2*G1,3*G2)=e(6*G1,G2)", + "Gas": 161000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000572cbea904d67468808c8eb50a9450c9721db309128012543902d0ac358a62ae28f75bb8f1c7c42c39a8c5529bf0f4e00000000000000000000000000000000166a9d8cabc673a322fda673779d8e3822ba3ecb8670e461f73bb9021d5fd76a4c56d9d4cd16bd1bba86881979749d2800000000000000000000000000000000122915c824a0857e2ee414a3dccb23ae691ae54329781315a0c75df1c04d6d7a50a030fc866f09d516020ef82324afae0000000000000000000000000000000009380275bbc8e5dcea7dc4dd7e0550ff2ac480905396eda55062650f8d251c96eb480673937cc6d9d6a44aaa56ca66dc000000000000000000000000000000000b21da7955969e61010c7a1abc1a6f0136961d1e3b20b1a7326ac738fef5c721479dfd948b52fdf2455e44813ecfd8920000000000000000000000000000000008f239ba329b3967fe48d718a36cfe5f62a7e42e0bf1c1ed714150a166bfbd6bcf6b3b58b975b9edea56d53f23a0e8490000000000000000000000000000000010e7791fb972fe014159aa33a98622da3cdc98ff707965e536d8636b5fcc5ac7a91a8c46e59a00dca575af0f18fb13dc0000000000000000000000000000000016ba437edcc6551e30c10512367494bfb6b01cc6681e8a4c3cd2501832ab5c4abc40b4578b85cbaffbf0bcd70d67c6e200000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000d1b3cc2c7027888be51d9ef691d77bcb679afda66c73f17f9ee3837a55024f78c71363275a75d75d86bab79f74782aa0000000000000000000000000000000013fa4d4a0ad8b1ce186ed5061789213d993923066dddaf1040bc3ff59f825c78df74f2d75467e25e0f55f8a00fa030ed", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "bls_pairing_e(2*G1,3*G2)=e(5*G1,G2)", + "Gas": 161000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000000fd75ebcc0a21649e3177bcce15426da0e4f25d6828fbf4038d4d7ed3bd4421de3ef61d70f794687b12b2d571971a550000000000000000000000000000000004523f5a3915fc57ee889cdb057e3e76109112d125217546ccfe26810c99b130d1b27820595ad61c7527dc5bbb132a9000000000000000000000000000000000186a1da343cacf1815b9c8b6c807f536249dbfdb59d77bf4920ad2198a0d83ada21f7c39de6f06a5599f22571cab288d000000000000000000000000000000000ba1ec44f95121bd622932b84bbb4b3d279f69c494ee44db68e3165c86b627ba5e397ee197313fb5b775972798997332000000000000000000000000000000000783e7493e9fb106fa0d085e7c03eb816468d12c65d9b77643ed07c02583d491f4db5db44e565d50d8ccaa9ad8f7f8e80000000000000000000000000000000010a6a5fd90cd5f4fb6545814f5df065b001074bb3f29f649dd2612815df3a19a320f7754dd3d458e48e7fb1b4953978f000000000000000000000000000000000345dd80ffef0eaec8920e39ebb7f5e9ae9c1d6179e9129b705923df7830c67f3690cbc48649d4079eadf5397339580c00000000000000000000000000000000083d3baf25e42f2845d8fa594dda2e0f40a4d670dda40f30da0aff0d81c87ac3d687fe84eca72f34c7c755a045668cf100000000000000000000000000000000129c4945fe62538d2806fff056adac24f3bba8e17e42d82122affe6ad2123d68784348a79755f194fde3b3d448924032000000000000000000000000000000000528590e82f409ea8ce953f0c59d15080185dc6e3219b69fcaa3a2c8fc9d0b9e0bc1e75ec6c52638e6eaa4584005b5380000000000000000000000000000000018dc3e893f74729d27dd44f45a5a4f433dcd09a3b485e9d1c2bd0eb5e0e4c9024d928ddc426fdecae931e89885ee4db4000000000000000000000000000000000d6ee02e1fc7e52a8e1ef17e753065882c6fcc14da61da7ffe955fe84a9d2af9ba57562c69db3088652931bf124b0d5300000000000000000000000000000000051f8a0b82a6d86202a61cbc3b0f3db7d19650b914587bde4715ccd372e1e40cab95517779d840416e1679c84a6db24e000000000000000000000000000000000b6a63ac48b7d7666ccfcf1e7de0097c5e6e1aacd03507d23fb975d8daec42857b3a471bf3fc471425b63864e045f4df00000000000000000000000000000000131747485cce9a5c32837a964b8c0689ff70cb4702c6520f2220ab95192d73ae9508c5b998ffb0be40520926846ce3f100000000000000000000000000000000101e147f8bd7682b47b3a6cc0c552c26ce90b9ce0daef21f7f634b3360483afa14a11e6745e7de01a35c65b396a1a12700000000000000000000000000000000090ca61ed16c4c1e80acfef736eea2db0d7425d9110cb53e6c4a2aa3f8a59ee6c60bdce8df5825011066d44bef84d29600000000000000000000000000000000028207394adcbf30250ac21a8f1db6283580bc5e39159930552e5edb25e6215c66b6450296edc80dbc3a2acd125dab160000000000000000000000000000000019bef05aaba1ea467fcbc9c420f5e3153c9d2b5f9bf2c7e2e7f6946f854043627b45b008607b9a9108bb96f3c1c089d3000000000000000000000000000000000adb3250ba142db6a748a85e4e401fa0490dd10f27068d161bd47cb562cc189b3194ab53a998e48a48c65e071bb541170000000000000000000000000000000016cfabbe60d1e55723a0ff72cf802f2d1cf13ed131e17729adc88522a657f320a336078a9399c8e61a3bbde3d52fd3640000000000000000000000000000000009aa9a3c2a6d49d286aa593c6ff644f1786fa9ae471bdb3fe70b150a9ed7584eaa886ac057c30005c3642f65ad5581cc0000000000000000000000000000000001d417894c0cce924955a795b188b27951f8438a5485404b921a42fa79dea03c10e29d0390df2f34d7be13f360a7fada00000000000000000000000000000000189b0b3a04e6c613899d51231dbf0cba6a8a8f507ebed99d24fba7ebac6c97a8859ffde88e6d95c1a9d6b4f0a8f3c417000000000000000000000000000000000d9e19b3f4c7c233a6112e5397309f9812a4f61f754f11dd3dcb8b07d55a7b1dfea65f19a1488a14fef9a414950835820000000000000000000000000000000009d0d1f706f1a85a98f3efaf5c35a41c9182afc129285cf2db3212f6ea0da586ca539bc66181f2ccb228485dd8aff0a70000000000000000000000000000000016cad7807d761f2c0c6ff11e786a9ed296442de8acc50f72a87139b9f1eb7c168e1c2f0b2a1ad7f9579e1e922d0eb309000000000000000000000000000000000d3577c713fcbc0648ca8fbdda0a0bf83c726a6205ee04d2d34cacff92b58725ca3c9766206e22d0791cb232fa8a9bc3000000000000000000000000000000000f5ea1957be1b9ca8956ba5f6b1c37ea72e2529f80d7a1c61df01afcc2df6f99ced81ac0052bd0e1e83f09d76ad8d33b000000000000000000000000000000000aabced4e2b9e4a473e72bf2b1cc0ce7ab13de533107df2205ed9e2bb50fa0217e6a13abcd12fce1bda1ccf84dac237a00000000000000000000000000000000073eb991aa22cdb794da6fcde55a427f0a4df5a4a70de23a988b5e5fc8c4d844f66d990273267a54dd21579b7ba6a086000000000000000000000000000000001825bacd18f695351f843521ebeada20352c3c3965626f98bc4c68e6ff7c4eed38b48f328204bbb9cd461511d24ebfb3000000000000000000000000000000000029ea93c2f1eb48b195815571ea0148198ff1b19462618cab08d037646b592ecab5a66b4bc660ffd02d1b996ca377da000000000000000000000000000000000bb319a4550c981ee89e3c7e6dcc434283454847792807940f72fd2dbf3625b092e0a0c03e581fd9bd9cf74f95ccef15000000000000000000000000000000000abb072b8d9011e81c9f5b23ba86fdb6399c878aa4eadee45fb2486afe594dffc53be643598a23e5428894a36f5ac3ce0000000000000000000000000000000005d04aa0b644faae17d4c76a14aa680c69fdfc6b59fee3ef45641f566165fced60cbbda4ca096e132bb6f58ab4516686000000000000000000000000000000001098f178f84fc753a76bb63709e9be91eec3ff5f7f3a5f4836f34fe8a1a6d6c5578d8fd820573cef3a01e2bfef3eaf3a000000000000000000000000000000000ea923110b733b531006075f796cc9368f2477fe26020f465468efbb380ce1f8eebaf5c770f31d320f9bd378dc758436000000000000000000000000000000001065f2a2d29a997343765f239c99a018490eced40ac42fc93217dfe20d8b43ee2215f65166aff483b3dc042c5a43b196000000000000000000000000000000000766e4c66f4a442ff1f61a7a4d197d2b47dd226d0e7822a9b065108cfc643cd3f3d5ae59ed2ce4cde13fd9260bb5b7cc0000000000000000000000000000000012251cc6abbabeb7bbe1fdd63eaee10832a748fff24f7e3fdccaea87facb6e99f2e0407a38f27f90450a471b873104620000000000000000000000000000000011181e08c8fba91271adfee9d31681f8412ab7a3f754f7ba4709024c0ad2287e32dd455d71a296b4838072a8ab9d96f2000000000000000000000000000000001252a4ac3529f8b2b6e8189b95a60b8865f07f9a9b73f98d5df708511d3f68632c4c7d1e2b03e6b1d1e2c01839752ada0000000000000000000000000000000002a1bc189e36902d1a49b9965eca3cb818ab5c26dffca63ca9af032870f7bbc615ac65f21bed27bd77dd65f2e90f53580000000000000000000000000000000005a7445f55add1ed5c143424ceef3d594280e316c9441a8e68c3ad97377141d015bf878bdfcf0df9fbcd0529f4e8100800000000000000000000000000000000192b52ba08ed509fc84d5775a7182498fd1ff80941d673c53470c9c9f1192f9c0057d68a1dfee0c68fe5df3625cc43bf000000000000000000000000000000000d3fcaf2f727e0eb32c65da9b910dc681b948dda874d0db6f6ed3f063430fbf073385a9a14c2dd78568726124e2b3ea8000000000000000000000000000000001943ce22cdb2387bd5796950dc95d1ace4012ab9bb4afb46223760230c1709e075f1ae76d6b3f2e947ba6b16d458ccd1000000000000000000000000000000001271205227c7aa27f45f20b3ba380dfea8b51efae91fd32e552774c99e2a1237aa59c0c43f52aad99bba3783ea2f36a4000000000000000000000000000000001407ffc2c1a2fe3b00d1f91e1f4febcda31004f7c301075c9031c55dd3dfa8104b156a6a3b7017fccd27f81c2af222ef000000000000000000000000000000000a29e38da2d42fd4712052800c7c8dd6e94fd9f506e946068aaac799d60b94c2d7515769ffdd32ea95d3910330ec47de000000000000000000000000000000000c60dae92451206390e30b5daa7151d63624dee496753c87dd54eadc92dc9602081fae02a1a53bac97e984a571923a5d00000000000000000000000000000000085f4fda4c72328895f20c683cb49603a37ff2c43d62f66602506dad5b8d1daebfbac7a7db3f50ccf4dfff277deb105c0000000000000000000000000000000005674d005457e0fe1f0fd978d63996c5f3d29f9149ee4eb04c464742dd329ccaef5e5f6b896d986ddfc9f1b2a3aec13100000000000000000000000000000000071bc66d6e2d244afc4a5ce4da1dce3d0c22c303ba61310fdf57843bbd97763ef496833dfa99d14be084bb1a039bb2da0000000000000000000000000000000012c22e047b0af8e2f4bf3bd3633ef0f8264004ca8ea5677a468857a1762f815235a479e53f4ad4741ffda3fb855021c900000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000d1b3cc2c7027888be51d9ef691d77bcb679afda66c73f17f9ee3837a55024f78c71363275a75d75d86bab79f74782aa0000000000000000000000000000000013fa4d4a0ad8b1ce186ed5061789213d993923066dddaf1040bc3ff59f825c78df74f2d75467e25e0f55f8a00fa030ed", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "bls_pairing_10paircheckstrue", + "Gas": 345000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000000fd75ebcc0a21649e3177bcce15426da0e4f25d6828fbf4038d4d7ed3bd4421de3ef61d70f794687b12b2d571971a550000000000000000000000000000000004523f5a3915fc57ee889cdb057e3e76109112d125217546ccfe26810c99b130d1b27820595ad61c7527dc5bbb132a9000000000000000000000000000000000186a1da343cacf1815b9c8b6c807f536249dbfdb59d77bf4920ad2198a0d83ada21f7c39de6f06a5599f22571cab288d000000000000000000000000000000000ba1ec44f95121bd622932b84bbb4b3d279f69c494ee44db68e3165c86b627ba5e397ee197313fb5b775972798997332000000000000000000000000000000000783e7493e9fb106fa0d085e7c03eb816468d12c65d9b77643ed07c02583d491f4db5db44e565d50d8ccaa9ad8f7f8e80000000000000000000000000000000010a6a5fd90cd5f4fb6545814f5df065b001074bb3f29f649dd2612815df3a19a320f7754dd3d458e48e7fb1b4953978f000000000000000000000000000000000345dd80ffef0eaec8920e39ebb7f5e9ae9c1d6179e9129b705923df7830c67f3690cbc48649d4079eadf5397339580c00000000000000000000000000000000083d3baf25e42f2845d8fa594dda2e0f40a4d670dda40f30da0aff0d81c87ac3d687fe84eca72f34c7c755a045668cf100000000000000000000000000000000129c4945fe62538d2806fff056adac24f3bba8e17e42d82122affe6ad2123d68784348a79755f194fde3b3d448924032000000000000000000000000000000000528590e82f409ea8ce953f0c59d15080185dc6e3219b69fcaa3a2c8fc9d0b9e0bc1e75ec6c52638e6eaa4584005b5380000000000000000000000000000000018dc3e893f74729d27dd44f45a5a4f433dcd09a3b485e9d1c2bd0eb5e0e4c9024d928ddc426fdecae931e89885ee4db4000000000000000000000000000000000d6ee02e1fc7e52a8e1ef17e753065882c6fcc14da61da7ffe955fe84a9d2af9ba57562c69db3088652931bf124b0d5300000000000000000000000000000000051f8a0b82a6d86202a61cbc3b0f3db7d19650b914587bde4715ccd372e1e40cab95517779d840416e1679c84a6db24e000000000000000000000000000000000b6a63ac48b7d7666ccfcf1e7de0097c5e6e1aacd03507d23fb975d8daec42857b3a471bf3fc471425b63864e045f4df00000000000000000000000000000000131747485cce9a5c32837a964b8c0689ff70cb4702c6520f2220ab95192d73ae9508c5b998ffb0be40520926846ce3f100000000000000000000000000000000101e147f8bd7682b47b3a6cc0c552c26ce90b9ce0daef21f7f634b3360483afa14a11e6745e7de01a35c65b396a1a12700000000000000000000000000000000090ca61ed16c4c1e80acfef736eea2db0d7425d9110cb53e6c4a2aa3f8a59ee6c60bdce8df5825011066d44bef84d29600000000000000000000000000000000028207394adcbf30250ac21a8f1db6283580bc5e39159930552e5edb25e6215c66b6450296edc80dbc3a2acd125dab160000000000000000000000000000000019bef05aaba1ea467fcbc9c420f5e3153c9d2b5f9bf2c7e2e7f6946f854043627b45b008607b9a9108bb96f3c1c089d3000000000000000000000000000000000adb3250ba142db6a748a85e4e401fa0490dd10f27068d161bd47cb562cc189b3194ab53a998e48a48c65e071bb541170000000000000000000000000000000016cfabbe60d1e55723a0ff72cf802f2d1cf13ed131e17729adc88522a657f320a336078a9399c8e61a3bbde3d52fd3640000000000000000000000000000000009aa9a3c2a6d49d286aa593c6ff644f1786fa9ae471bdb3fe70b150a9ed7584eaa886ac057c30005c3642f65ad5581cc0000000000000000000000000000000001d417894c0cce924955a795b188b27951f8438a5485404b921a42fa79dea03c10e29d0390df2f34d7be13f360a7fada00000000000000000000000000000000189b0b3a04e6c613899d51231dbf0cba6a8a8f507ebed99d24fba7ebac6c97a8859ffde88e6d95c1a9d6b4f0a8f3c417000000000000000000000000000000000d9e19b3f4c7c233a6112e5397309f9812a4f61f754f11dd3dcb8b07d55a7b1dfea65f19a1488a14fef9a414950835820000000000000000000000000000000009d0d1f706f1a85a98f3efaf5c35a41c9182afc129285cf2db3212f6ea0da586ca539bc66181f2ccb228485dd8aff0a70000000000000000000000000000000016cad7807d761f2c0c6ff11e786a9ed296442de8acc50f72a87139b9f1eb7c168e1c2f0b2a1ad7f9579e1e922d0eb309000000000000000000000000000000000d3577c713fcbc0648ca8fbdda0a0bf83c726a6205ee04d2d34cacff92b58725ca3c9766206e22d0791cb232fa8a9bc3000000000000000000000000000000000f5ea1957be1b9ca8956ba5f6b1c37ea72e2529f80d7a1c61df01afcc2df6f99ced81ac0052bd0e1e83f09d76ad8d33b000000000000000000000000000000000aabced4e2b9e4a473e72bf2b1cc0ce7ab13de533107df2205ed9e2bb50fa0217e6a13abcd12fce1bda1ccf84dac237a00000000000000000000000000000000073eb991aa22cdb794da6fcde55a427f0a4df5a4a70de23a988b5e5fc8c4d844f66d990273267a54dd21579b7ba6a086000000000000000000000000000000001825bacd18f695351f843521ebeada20352c3c3965626f98bc4c68e6ff7c4eed38b48f328204bbb9cd461511d24ebfb3000000000000000000000000000000000029ea93c2f1eb48b195815571ea0148198ff1b19462618cab08d037646b592ecab5a66b4bc660ffd02d1b996ca377da000000000000000000000000000000000bb319a4550c981ee89e3c7e6dcc434283454847792807940f72fd2dbf3625b092e0a0c03e581fd9bd9cf74f95ccef15000000000000000000000000000000000abb072b8d9011e81c9f5b23ba86fdb6399c878aa4eadee45fb2486afe594dffc53be643598a23e5428894a36f5ac3ce0000000000000000000000000000000005d04aa0b644faae17d4c76a14aa680c69fdfc6b59fee3ef45641f566165fced60cbbda4ca096e132bb6f58ab4516686000000000000000000000000000000001098f178f84fc753a76bb63709e9be91eec3ff5f7f3a5f4836f34fe8a1a6d6c5578d8fd820573cef3a01e2bfef3eaf3a000000000000000000000000000000000ea923110b733b531006075f796cc9368f2477fe26020f465468efbb380ce1f8eebaf5c770f31d320f9bd378dc758436000000000000000000000000000000001065f2a2d29a997343765f239c99a018490eced40ac42fc93217dfe20d8b43ee2215f65166aff483b3dc042c5a43b196000000000000000000000000000000000766e4c66f4a442ff1f61a7a4d197d2b47dd226d0e7822a9b065108cfc643cd3f3d5ae59ed2ce4cde13fd9260bb5b7cc0000000000000000000000000000000012251cc6abbabeb7bbe1fdd63eaee10832a748fff24f7e3fdccaea87facb6e99f2e0407a38f27f90450a471b873104620000000000000000000000000000000011181e08c8fba91271adfee9d31681f8412ab7a3f754f7ba4709024c0ad2287e32dd455d71a296b4838072a8ab9d96f2000000000000000000000000000000001252a4ac3529f8b2b6e8189b95a60b8865f07f9a9b73f98d5df708511d3f68632c4c7d1e2b03e6b1d1e2c01839752ada0000000000000000000000000000000002a1bc189e36902d1a49b9965eca3cb818ab5c26dffca63ca9af032870f7bbc615ac65f21bed27bd77dd65f2e90f53580000000000000000000000000000000005a7445f55add1ed5c143424ceef3d594280e316c9441a8e68c3ad97377141d015bf878bdfcf0df9fbcd0529f4e8100800000000000000000000000000000000192b52ba08ed509fc84d5775a7182498fd1ff80941d673c53470c9c9f1192f9c0057d68a1dfee0c68fe5df3625cc43bf000000000000000000000000000000000d3fcaf2f727e0eb32c65da9b910dc681b948dda874d0db6f6ed3f063430fbf073385a9a14c2dd78568726124e2b3ea8000000000000000000000000000000001943ce22cdb2387bd5796950dc95d1ace4012ab9bb4afb46223760230c1709e075f1ae76d6b3f2e947ba6b16d458ccd1000000000000000000000000000000001271205227c7aa27f45f20b3ba380dfea8b51efae91fd32e552774c99e2a1237aa59c0c43f52aad99bba3783ea2f36a4000000000000000000000000000000001407ffc2c1a2fe3b00d1f91e1f4febcda31004f7c301075c9031c55dd3dfa8104b156a6a3b7017fccd27f81c2af222ef000000000000000000000000000000000a29e38da2d42fd4712052800c7c8dd6e94fd9f506e946068aaac799d60b94c2d7515769ffdd32ea95d3910330ec47de000000000000000000000000000000000c60dae92451206390e30b5daa7151d63624dee496753c87dd54eadc92dc9602081fae02a1a53bac97e984a571923a5d00000000000000000000000000000000085f4fda4c72328895f20c683cb49603a37ff2c43d62f66602506dad5b8d1daebfbac7a7db3f50ccf4dfff277deb105c0000000000000000000000000000000005674d005457e0fe1f0fd978d63996c5f3d29f9149ee4eb04c464742dd329ccaef5e5f6b896d986ddfc9f1b2a3aec13100000000000000000000000000000000071bc66d6e2d244afc4a5ce4da1dce3d0c22c303ba61310fdf57843bbd97763ef496833dfa99d14be084bb1a039bb2da0000000000000000000000000000000012c22e047b0af8e2f4bf3bd3633ef0f8264004ca8ea5677a468857a1762f815235a479e53f4ad4741ffda3fb855021c900000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "bls_pairing_10pairchecksfalse", + "Gas": 345000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000012196c5a43d69224d8713389285f26b98f86ee910ab3dd668e413738282003cc5b7357af9a7af54bb713d62255e80f560000000000000000000000000000000006ba8102bfbeea4416b710c73e8cce3032c31c6269c44906f8ac4f7874ce99fb17559992486528963884ce429a992fee0000000000000000000000000000000017c9fcf0504e62d3553b2f089b64574150aa5117bd3d2e89a8c1ed59bb7f70fb83215975ef31976e757abf60a75a1d9f0000000000000000000000000000000008f5a53d704298fe0cfc955e020442874fe87d5c729c7126abbdcbed355eef6c8f07277bee6d49d56c4ebaf334848624000000000000000000000000000000001302dcc50c6ce4c28086f8e1b43f9f65543cf598be440123816765ab6bc93f62bceda80045fbcad8598d4f32d03ee8fa000000000000000000000000000000000bbb4eb37628d60b035a3e0c45c0ea8c4abef5a6ddc5625e0560097ef9caab208221062e81cd77ef72162923a1906a40", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_0", + "Gas": 138000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000117dbe419018f67844f6a5e1b78a1e597283ad7b8ee7ac5e58846f5a5fd68d0da99ce235a91db3ec1cf340fe6b7afcdb0000000000000000000000000000000013316f23de032d25e912ae8dc9b54c8dba1be7cecdbb9d2228d7e8f652011d46be79089dd0a6080a73c82256ce5e4ed200000000000000000000000000000000192fa5d8732ff9f38e0b1cf12eadfd2608f0c7a39aced7746837833ae253bb57ef9c0d98a4b69eeb2950901917e99d1e0000000000000000000000000000000009aeb10c372b5ef1010675c6a4762fda33636489c23b581c75220589afbc0cc46249f921eea02dd1b761e036ffdbae220000000000000000000000000000000002d225447600d49f932b9dd3ca1e6959697aa603e74d8666681a2dca8160c3857668ae074440366619eb8920256c4e4a00000000000000000000000000000000174882cdd3551e0ce6178861ff83e195fecbcffd53a67b6f10b4431e423e28a480327febe70276036f60bb9c99cf7633", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_1", + "Gas": 138000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000008ab7b556c672db7883ec47efa6d98bb08cec7902ebb421aac1c31506b177ac444ffa2d9b400a6f1cbdc6240c607ee110000000000000000000000000000000016b7fa9adf4addc2192271ce7ad3c8d8f902d061c43b7d2e8e26922009b777855bffabe7ed1a09155819eabfa87f276f000000000000000000000000000000000a69d6d9f79e19b38e6bf5a245dc820bddbdfe038d50932f76d0e4629d759f8ca6d573fcfc39256305daedf452f9fdf40000000000000000000000000000000015f5949369e58487afcecf8018775d1b0a73e913bf77e13d2e5a843bbbeba7d1978ca27ae8bfc87d30f567dd396b980e00000000000000000000000000000000182198bb38a0353b8db25389e56ab0d8679a1bda008a65dad77e4c95bc6804f6311eb16c761e1a5e2a5f87cfada49fa4000000000000000000000000000000000eb5483959e98c30e71db52615f63521378b156f142d46f3bb285b94aef39d80feacec335b797c5a68dc17ba89d43e0f", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_2", + "Gas": 138000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000015ff9a232d9b5a8020a85d5fe08a1dcfb73ece434258fe0e2fddf10ddef0906c42dcb5f5d62fc97f934ba900f17beb330000000000000000000000000000000009cfe4ee2241d9413c616462d7bac035a6766aeaab69c81e094d75b840df45d7e0dfac0265608b93efefb9a8728b98e4000000000000000000000000000000000286f09f931c07507ba4aafb7d43befe0b1d25b27ecc9199b19a9dc20bc7ec0329479ef224e00dece67ec0d61f1ca5ae0000000000000000000000000000000014e6ed154b5552be5c463b730b2134f83e0071dcdadfaa68e6c7c7f6e17dabb7daf06e409177bc4b38cfdb8248157618000000000000000000000000000000000f145e998dc6eb0c2b2be87db62949c7bfa63e8b01c8634248010fd623cfaec5d6c6c193331440957d333bf0c988b7b10000000000000000000000000000000002a1ab3eea343cfdea5779f64b3bddbf0769aded60e54a7507338f044310ba239430663394f110e560594d6042a99f1c", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_3", + "Gas": 138000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000017a17b82e3bfadf3250210d8ef572c02c3610d65ab4d7366e0b748768a28ee6a1b51f77ed686a64f087f36f641e7dca900000000000000000000000000000000077ea73d233ccea51dc4d5acecf6d9332bf17ae51598f4b394a5f62fb387e9c9aa1d6823b64a074f5873422ca57545d3000000000000000000000000000000000d1007ca90451229d3780d66d3aed7c9d8fc82e9d45549e8586600e38eb6763f3c466e2f6ba6ba1dafd8f00cc452dda20000000000000000000000000000000001d017d920a262b6d6597bab532f83270f41526409510e80278d1c3595ceabb9ceba8ae32b1817297ff78ea7a0d252e8000000000000000000000000000000000935b7a59d2e51bbb2f9b54ccb06ebee9d189fa82f0e97d10c8020badb3de7fe15731b5895faed8cad92ae76e2e1b649000000000000000000000000000000000792dadd48a20040ad43facedc109747411895180813349d41d0e5b389176bfb15895d41665be8d1afa80835ef818eca", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_4", + "Gas": 138000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000c1243478f4fbdc21ea9b241655947a28accd058d0cdb4f9f0576d32f09dddaf0850464550ff07cab5927b3e4c863ce90000000000000000000000000000000015fb54db10ffac0b6cd374eb7168a8cb3df0a7d5f872d8e98c1f623deb66df5dd08ff4c3658f2905ec8bd02598bd4f9000000000000000000000000000000000095353ad699b89ac82ca7ef631775b2b3a6e3ed8dd320440cdb929baa428e63cb902a83857cc0e2621470544c69e84aa000000000000000000000000000000000892559ade1060b0eef2cbc1c74de62a7ff076a3621e5f0f159672a549f1201f2ffb3ac12c8b12cb86ae3e386c33e219000000000000000000000000000000000750df4632a7126ddb08658a4001f949b9764d9cc43a9393cc55d8fdbb15d4a1186dd87a6433d111888a7804540ad9fc0000000000000000000000000000000017554bd444665df044b91b0b2614017bbfcd7acc7f8c5a16cea2861235578ce2b27dcced9fba234999fa478cd3f6e42d", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_5", + "Gas": 138000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000328f09584b6d6c98a709fc22e184123994613aca95a28ac53df8523b92273eb6f4e2d9b2a7dcebb474604d54a210719000000000000000000000000000000001220ebde579911fe2e707446aaad8d3789fae96ae2e23670a4fd856ed82daaab704779eb4224027c1ed9460f39951a1b00000000000000000000000000000000175dadb6ee656ec6aebf8d0e5edaee3f119c74e0ea64e374be9e8ab9fd3d085fceeedf4ed8de676ebe9065d83b0542ad0000000000000000000000000000000005cd6a875329c23e4918976cf997e93e403957acfc999f8159a630d21ab6f1762925c063784237262bedc82402ad81bb0000000000000000000000000000000003274bcb8db35e50164d136c2a98b5a6d2fb5f9767d0ee11c1358bf7ca5ed96d9122f8c1051ba3c658cc89777d03dfa5000000000000000000000000000000000380a240443dff85b6542f75db28b87c39e278cdb8d9627efbbc63b229e6ce783f6fb0114c8e91c2fd6ea71c95bb99a4", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_6", + "Gas": 138000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000002ebfa98aa92c32a29ebe17fcb1819ba82e686abd9371fcee8ea793b4c72b6464085044f818f1f5902396df0122830cb00000000000000000000000000000000001184715b8432ed190b459113977289a890f68f6085ea111466af15103c9c02467da33e01d6bff87fd57db6ccba442a000000000000000000000000000000000834cf1b4149d100c41b1bca0495e455002eb6596bddcb94ae48d0c65957e8b313372f8e0d6e57504664b266f38293150000000000000000000000000000000000de2875fbd14760bac4c2cc7d3f239177efe9f7f61f767be420d44f24c9fb863efd60dcd732986db8c5b72470617ea60000000000000000000000000000000000bc9535ebf11c2dcc8c7d3bcd09d7d14035635fccb5fddb7df29ce8855e79f99809781d6ffbbcb33d1227314609abee00000000000000000000000000000000039bbfb4d969d702255e3be7f255a97529a19687ce38cb70637c37894d4102591feef428b0afe8c9ef50310ae3b83091", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_7", + "Gas": 138000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000009d6424e002439998e91cd509f85751ad25e574830c564e7568347d19e3f38add0cab067c0b4b0801785a78bcbeaf246000000000000000000000000000000000ef6d7db03ee654503b46ff0dbc3297536a422e963bda9871a8da8f4eeb98dedebd6071c4880b4636198f4c2375dc795000000000000000000000000000000000fc09c241899fa6e8cc3b31830e9c9f2777d2bc6758260c9f6af5fce56c9dc1a8daedb5bcb7d7669005ccf6bfacf71050000000000000000000000000000000018e95921a76bc37308e2f10afb36a812b622afe19c8db84465ab8b3293c7d371948ee0578dbb025eed7ed60686109aa0000000000000000000000000000000001558cdfbac6ea2c4c1f4b9a2e809b19e9f4ba47b78d2b18185ed8c97c2f9c2990beadc78b85c123b4c3c08d5c5b3bbef000000000000000000000000000000000ea4dfdd12b9a4b9a3172671a6eafed7508af296813ec5700b697d9239ae484bcf7ab630e5b6830d6d95675be5174bb2", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_8", + "Gas": 138000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000002d1cdb93191d1f9f0308c2c55d0208a071f5520faca7c52ab0311dbc9ba563bd33b5dd6baa77bf45ac2c3269e945f4800000000000000000000000000000000072a52106e6d7b92c594c4dacd20ef5fab7141e45c231457cd7e71463b2254ee6e72689e516fa6a8f29f2a173ce0a1900000000000000000000000000000000000b36d8fb9bd156f618ab8049d41dfe0698218764c0abb10e12fae43c8810b8e2a5201364e2778f6f433b199bb8f9a6800000000000000000000000000000000000707eb15411b63722b4308c0ed4288320078d2463ae659ad4fb3f9ef8124f379df92d64e077403e50727388adb59ac00000000000000000000000000000000158e1249d5b91614924acb23899c6bae408697dec0982c10d0459746499f4e6739afb9d5129568106ed1a1caefeaa9640000000000000000000000000000000019e841562e4aa75321143f8ce1e5ec6158fa5cb8b98c839a486188260c18ee8a7600930f23aa39eac2eb520d6a0fba90", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_9", + "Gas": 138000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000000641642f6801d39a09a536f506056f72a619c50d043673d6d39aa4af11d8e3ded38b9c3bbc970dbc1bd55d68f94b50d0000000000000000000000000000000009ab050de356a24aea90007c6b319614ba2f2ed67223b972767117769e3c8e31ee4056494628fb2892d3d37afb6ac94300000000000000000000000000000000186a9661d6fb539e8687ac214301b2d7623caedd76f4055089befba6ef2c96263d810921ad7783d229f82783c9def424000000000000000000000000000000000447f3e20caa1f99fbaccab7bde2bd37fe77cea691ebf2b9499f95bbbb77afe72b7039eb0c05970b61360fcf8ade73730000000000000000000000000000000005e11f828eda86c10a1d7929def547ac06885da278afae59c5d95453caf0a2d8ed186fa7c6d0a7ab6e9142cfa4b338190000000000000000000000000000000003d954e61b6ab71042b19e804efccd4956b56662f27f70a9255cec0c464b86c0e83721ad3785dec62dd4a9dd3d6d5d53", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_10", + "Gas": 138000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000fd4893addbd58fb1bf30b8e62bef068da386edbab9541d198e8719b2de5beb9223d87387af82e8b55bd521ff3e47e2d000000000000000000000000000000000f3a923b76473d5b5a53501790cb02597bb778bdacb3805a9002b152d22241ad131d0f0d6a260739cbab2c2fe602870e0000000000000000000000000000000002b94534aa0ba923bda34cbe92b3cd7a3e263741b120240ff5bdb8b718f094d3867e3fcabeab4a7be39c8f8c4fdd10d900000000000000000000000000000000048711cf6a82534d64d072355cb8fe647808e7e8b2d9ac9ed52eb7fe121647a721dd1234c71ecd163d91701eb7331cac00000000000000000000000000000000141ef2e23a1ecc7ef2ed3ea915492e79cfffe60b5e0de8441e878bd0653843d79c724e3c5ebe2321361df99f8932ddc200000000000000000000000000000000085513b4009f29b3e00a91c2c4be418368560802ba4194cbd2f4fa3d72a55fcae547014434514a8b2a8fe3e0b28d2773", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_11", + "Gas": 138000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000002cb4b24c8aa799fd7cb1e4ab1aab1372113200343d8526ea7bc64dfaf926baf5d90756a40e35617854a2079cd07fba40000000000000000000000000000000003327ca22bd64ebd673cc6d5b02b2a8804d5353c9d251637c4273ad08d581cc0d58da9bea27c37a0b3f4961dbafd276b0000000000000000000000000000000009143507a24313ee33401955fc46562c9b20c9917df3b40ccbd7ed43b1349d4551cfd98a4976d6fec5fc289460c8d89900000000000000000000000000000000060566b79df5cc975e669da8ca3a7fa91bf3f5c9fb871c3d62f4a3e79dbc341b89d38b588e5414bc385d5e3cbf3ab9310000000000000000000000000000000016bf40b8cc4c01a87aafae0c4439b623a51ba9a383756a550b69d627d6f45209f0d87e4f9be9edff35c986f7b9c49e3f000000000000000000000000000000001842d9172bce51a164fbdbdb108d0faae07e4642f21c80e40ac31e737657472ae3dfe552b65349629c210a068c4afc0e", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_12", + "Gas": 138000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000024ad70f2b2105ca37112858e84c6f5e3ffd4a8b064522faae1ecba38fabd52a6274cb46b00075deb87472f11f2e67d90000000000000000000000000000000010a502c8b2a68aa30d2cb719273550b9a3c283c35b2e18a01b0b765344ffaaa5cb30a1e3e6ecd3a53ab67658a5787681000000000000000000000000000000000ab19bbddd661e9db8fe4cb307ecebdc5e03efbb95c5b44716c7075bd60efcfc67de0bfd7c46ad989a613946c90a4c1000000000000000000000000000000000120800e7f344cda816299fa37f603ade06beb3b10907f5af896d6b4e42f7f865b756f14164db84411c56cb2ea81f60be000000000000000000000000000000000f688ddd257e66362af1437b6922d3397a7c3dd6dea6bca8ebd6375e75bf2de40bc287cbf3434388191e56b92949c83b0000000000000000000000000000000005252465784aff8c1c707da58b5808c69583bf852d68f96912bc53f8dae4536b09ccbbd25a49d9e744118992b92b6792", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_13", + "Gas": 138000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000000704cc57c8e0944326ddc7c747d9e7347a7f6918977132eea269f161461eb64066f773352f293a3ac458dc3ccd5026a000000000000000000000000000000001099d3c2bb2d082f2fdcbed013f7ac69e8624f4fcf6dfab3ee9dcf7fbbdb8c49ee79de40e887c0b6828d2496e3a6f768000000000000000000000000000000000e3165efe00f69aee84ac56d2161f07c017abfaadeaad34f8c96799d68bae0e6f9b557bbf9137e7826f49f29c58d1ef9000000000000000000000000000000000de0dce7ea371ad60f21f2cb61cb582b5072408a7efc91edf05b36a1a3b58fd9e6cf808d75157eedccc8f1c93a8ae07d0000000000000000000000000000000016d911943d80427385ebac1d1b293914a9e4dd9db06c1d6a758192d63c8fc9368e02eae7fb0e3a7859408f215cfa76ca0000000000000000000000000000000007bfdc6afb8acec625e50ecbc08a5cdb7862b795866323679885ba5cba3fd51f181078e03fe35e96e6383c077eed1bf5", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_14", + "Gas": 138000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000130535a29392c77f045ac90e47f2e7b3cffff94494fe605aad345b41043f6663ada8e2e7ecd3d06f3b8854ef92212f42000000000000000000000000000000001699a3cc1f10cd2ed0dc68eb916b4402e4f12bf4746893bf70e26e209e605ea89e3d53e7ac52bd07713d3c8fc671931d000000000000000000000000000000000a68dccbe3452731f075580fe6102b8ee5265007ee19c56d95bcb096a3a6ac444f4145b980f41afcb0a865853b279bc600000000000000000000000000000000164767ea55a9038ac2dd254d8c8a4970dba93dacdf5416aecaa407914719cab165e7a32784b2c41652a86358737d831f000000000000000000000000000000000da9441fbc6578c85fdeca49082c9ebbf183de894d67c65158380ee56132d3cdb44b100d72b6d3b82688defb75d2aa390000000000000000000000000000000017d570e4f6e46550679d5d12c347414da207060f594620e2f8db66df8e0b06c912290b207a268e782d4b45db19a199db", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_15", + "Gas": 138000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001830f52d9bff64a623c6f5259e2cd2c2a08ea17a8797aaf83174ea1e8c3bd3955c2af1d39bfa474815bfe60714b7cd80000000000000000000000000000000000874389c02d4cf1c61bc54c4c24def11dfbe7880bc998a95e70063009451ee8226fec4b278aade3a7cea55659459f1d500000000000000000000000000000000197737f831d4dc7e708475f4ca7ca15284db2f3751fcaac0c17f517f1ddab35e1a37907d7b99b39d6c8d9001cd50e79e000000000000000000000000000000000af1a3f6396f0c983e7c2d42d489a3ae5a3ff0a553d93154f73ac770cd0af7467aa0cef79f10bbd34621b3ec9583a834000000000000000000000000000000001918cb6e448ed69fb906145de3f11455ee0359d030e90d673ce050a360d796de33ccd6a941c49a1414aca1c26f9e699e0000000000000000000000000000000019a915154a13249d784093facc44520e7f3a18410ab2a3093e0b12657788e9419eec25729944f7945e732104939e7a9e000000000000000000000000000000001830f52d9bff64a623c6f5259e2cd2c2a08ea17a8797aaf83174ea1e8c3bd3955c2af1d39bfa474815bfe60714b7cd8000000000000000000000000000000000118cd94e36ab177de95f52f180fdbdc584b8d30436eb882980306fa0625f07a1f7ad3b4c38a921c53d14aa9a6ba5b8d600000000000000000000000000000000197737f831d4dc7e708475f4ca7ca15284db2f3751fcaac0c17f517f1ddab35e1a37907d7b99b39d6c8d9001cd50e79e000000000000000000000000000000000af1a3f6396f0c983e7c2d42d489a3ae5a3ff0a553d93154f73ac770cd0af7467aa0cef79f10bbd34621b3ec9583a834000000000000000000000000000000001918cb6e448ed69fb906145de3f11455ee0359d030e90d673ce050a360d796de33ccd6a941c49a1414aca1c26f9e699e0000000000000000000000000000000019a915154a13249d784093facc44520e7f3a18410ab2a3093e0b12657788e9419eec25729944f7945e732104939e7a9e", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_16", + "Gas": 161000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000043c4ff154778330b4d5457b7811b551dbbf9701b402230411c527282fb5d2ba12cb445709718d5999e79fdd74c0a67000000000000000000000000000000000013a80ede40df002b72f6b33b1f0e3862d505efbe0721dce495d18920d542c98cdd2daf5164dbd1a2fee917ba943debe0000000000000000000000000000000001c2d8d353d5983f22a5313ddd58fdc0d9c994b2915dbc87a9b65b7b98ff00b62e140a27dc322d42b3ad190c1b3728dd0000000000000000000000000000000010412f3625947b38bb380a6ed059f1677b7a7afcb91517837c563dadd0e285b95740a200ddff6570d4d92bb636b625bb0000000000000000000000000000000015f4f9a480a57bd1b2388532ab045a1ba93d2f6589a3022c585fe06a1d611165c99d70be06251812405c9c37d6e9f7730000000000000000000000000000000001a78e6c5062a6634a56e9853ff5afacb2e7cf31fd0ea5f0d8c8ac6174c88133cf2f63450ec4590544c9a0e37daac1f900000000000000000000000000000000043c4ff154778330b4d5457b7811b551dbbf9701b402230411c527282fb5d2ba12cb445709718d5999e79fdd74c0a6700000000000000000000000000000000018c690fc5571f69793ec3c82915ac9513726ec891312f4f11dd3ba0ee95cc98b50d925099b0642e58a106e8456bbcbed0000000000000000000000000000000001c2d8d353d5983f22a5313ddd58fdc0d9c994b2915dbc87a9b65b7b98ff00b62e140a27dc322d42b3ad190c1b3728dd0000000000000000000000000000000010412f3625947b38bb380a6ed059f1677b7a7afcb91517837c563dadd0e285b95740a200ddff6570d4d92bb636b625bb0000000000000000000000000000000015f4f9a480a57bd1b2388532ab045a1ba93d2f6589a3022c585fe06a1d611165c99d70be06251812405c9c37d6e9f7730000000000000000000000000000000001a78e6c5062a6634a56e9853ff5afacb2e7cf31fd0ea5f0d8c8ac6174c88133cf2f63450ec4590544c9a0e37daac1f9", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_17", + "Gas": 161000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000009f9a78a70b9973c43182ba54bb6e363c6984d5f7920c1d347c5ff82e6093e73f4fb5e3cd985c9ddf9af936b16200e880000000000000000000000000000000008d7489c2d78f17b2b9b1d535f21588d8761b8fb323b08fa9af8a60f39b26e98af76aa883522f21e083c8a14c2e7edb6000000000000000000000000000000000818e567aea83eaf3142984bb736b443743659626c407987b604a30c79756081fa6ae6beeb2e6c652dbfe9cf62d44e3900000000000000000000000000000000193f0317305fde1046acda2c9491e376aa67244f68ef6495845d049e1293082af91f880be935d9d8ad0e25ad918caae200000000000000000000000000000000109224b8178be58ea4e4a194ca66bef9d14f6fc2c625d25feaa4f32e0f4d72d91024d96839bc96e6a624c5ad6221bd94000000000000000000000000000000000e42decf8a987efaeb4ede37236b637e61249bf6245679be7fd4d633e2d814ed4748b73890ad3c4fcbcfb4960cb67ae70000000000000000000000000000000009f9a78a70b9973c43182ba54bb6e363c6984d5f7920c1d347c5ff82e6093e73f4fb5e3cd985c9ddf9af936b16200e88000000000000000000000000000000001129c94e0c06f51f1f808a62e42a5449dd159289c14a09c4cc382c91bcfe878b6f3555767c310de1b1c275eb3d17bcf5000000000000000000000000000000000818e567aea83eaf3142984bb736b443743659626c407987b604a30c79756081fa6ae6beeb2e6c652dbfe9cf62d44e3900000000000000000000000000000000193f0317305fde1046acda2c9491e376aa67244f68ef6495845d049e1293082af91f880be935d9d8ad0e25ad918caae200000000000000000000000000000000109224b8178be58ea4e4a194ca66bef9d14f6fc2c625d25feaa4f32e0f4d72d91024d96839bc96e6a624c5ad6221bd94000000000000000000000000000000000e42decf8a987efaeb4ede37236b637e61249bf6245679be7fd4d633e2d814ed4748b73890ad3c4fcbcfb4960cb67ae7", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_18", + "Gas": 161000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000010fcfe8af8403a52400bf79e1bd0058f66b9cab583afe554aa1d82a3e794fffad5f0e19d385263b2dd9ef69d1154f10a000000000000000000000000000000000aba6a0b58b49f7c6c2802afd2a5ed1320bf062c7b93135f3c0ed7a1d7b1ee27b2b986cde732a60fa585ca6ab7cc154b000000000000000000000000000000000ca0d865f8c8ce0a476f7a6edb3ce4bd5e6c3a8d905d8fb5a10e66542f4325a9963c2f8d96f804f4d295f8993b5204df0000000000000000000000000000000005a966f6254f0ef4f93f082a97abe07db56f00c2ade047d2f0027edef6f00a0dfecaa24d50faa778fa29087302211f7e00000000000000000000000000000000121c51da366557c09af1bbd927521da88dfab3e2e9a95b6effb0a968795486f281f0c887e37f51837557b9e3808987130000000000000000000000000000000001a5524975400b1e88f3fff8dd34dadf5d75564cfc0026df31ee9c2c1d48b0f69a48e1e4a48cc4b7db61f023a79157800000000000000000000000000000000010fcfe8af8403a52400bf79e1bd0058f66b9cab583afe554aa1d82a3e794fffad5f0e19d385263b2dd9ef69d1154f10a000000000000000000000000000000000f46a7dee0cb471ddef3a50670a5bfc443b8455877f1ff602b21faff1eff07fc6bf27930ca2159f01479359548339560000000000000000000000000000000000ca0d865f8c8ce0a476f7a6edb3ce4bd5e6c3a8d905d8fb5a10e66542f4325a9963c2f8d96f804f4d295f8993b5204df0000000000000000000000000000000005a966f6254f0ef4f93f082a97abe07db56f00c2ade047d2f0027edef6f00a0dfecaa24d50faa778fa29087302211f7e00000000000000000000000000000000121c51da366557c09af1bbd927521da88dfab3e2e9a95b6effb0a968795486f281f0c887e37f51837557b9e3808987130000000000000000000000000000000001a5524975400b1e88f3fff8dd34dadf5d75564cfc0026df31ee9c2c1d48b0f69a48e1e4a48cc4b7db61f023a7915780", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_19", + "Gas": 161000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000013c5ebfb853f0c8741f12057b6b845c4cdbf72aecbeafc8f5b5978f186eead8685f2f3f125e536c465ade1a00f212b0900000000000000000000000000000000082543b58a13354d0cce5dc3fb1d91d1de6d5927290b2ff51e4e48f40cdf2d490730843b53a92865140153888d73d4af0000000000000000000000000000000002b51851ef3b44481d13f42e5111fa4fec04be0bf6acc7e59dec3a8c8113e5bb7b604c6dbdc5e8eddc2a1ffb81bc2baf0000000000000000000000000000000018ddb483ae75402852b7f285277ff7308ff78a3364cca8b0e0e1fa9182de275fd55c1e8ec3dbde180379c4280787ba8000000000000000000000000000000000170539890c89a4f91acd59efd413b5d1059f0c8fd8718e8f722e865dd106a4eb02e6fb0cd71b34ebc4b94375b52e4dd60000000000000000000000000000000001c2e9392f5d4b75efc5ff10fe97f37e2671cad7e4710765866e92aec99b0130e6ff1314502d069fb7b5f86bfce4300e0000000000000000000000000000000013c5ebfb853f0c8741f12057b6b845c4cdbf72aecbeafc8f5b5978f186eead8685f2f3f125e536c465ade1a00f212b090000000000000000000000000000000011dbce34af6cb14d3e4d49f2482e1b058609f25dca79e2ca48e289ace9d1c8db177b7bc35daad79aa5fdac77728bd5fc0000000000000000000000000000000002b51851ef3b44481d13f42e5111fa4fec04be0bf6acc7e59dec3a8c8113e5bb7b604c6dbdc5e8eddc2a1ffb81bc2baf0000000000000000000000000000000018ddb483ae75402852b7f285277ff7308ff78a3364cca8b0e0e1fa9182de275fd55c1e8ec3dbde180379c4280787ba8000000000000000000000000000000000170539890c89a4f91acd59efd413b5d1059f0c8fd8718e8f722e865dd106a4eb02e6fb0cd71b34ebc4b94375b52e4dd60000000000000000000000000000000001c2e9392f5d4b75efc5ff10fe97f37e2671cad7e4710765866e92aec99b0130e6ff1314502d069fb7b5f86bfce4300e", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_20", + "Gas": 161000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000053a12f6a1cb64272c34e042b7922fabe879275b837ba3b116adfe1eb2a6dc1c1fa6df40c779a7cdb8ed8689b8bc5ba800000000000000000000000000000000097ec91c728ae2d290489909bbee1a30048a7fa90bcfd96fe1d9297545867cbfee0939f20f1791329460a4fe1ac719290000000000000000000000000000000011bbc566a10eadf16009c1d2655cfae6adfb0f56f5e55b31dc000414be1b4cee9a0b9f7d9eab4c6829037c327914d5640000000000000000000000000000000009b28329096d8644dfcba6e92477eafff29f7477da4581ce76d1493f03034d7f5d3acaadbe42c76a83ca51db79d456d10000000000000000000000000000000019f75a303fdede5d97f3e521b03ef6b9d7c008d770b59ce3ac38900b340895e008342701ad1b41830b9c010936f4ff1700000000000000000000000000000000161aa1853edbb56fa3bd685c9c6b88e466dfa3c4f194f6774b4d9b1f30b016993bd0d65e8e9d6dea6caa196ff735bd6700000000000000000000000000000000053a12f6a1cb64272c34e042b7922fabe879275b837ba3b116adfe1eb2a6dc1c1fa6df40c779a7cdb8ed8689b8bc5ba800000000000000000000000000000000108248cdc6f503c7bad30eac875d92a75feccbdbe7b5394f8557a92bb12a796430a2c60ca23c6ecd259e5b01e53891820000000000000000000000000000000011bbc566a10eadf16009c1d2655cfae6adfb0f56f5e55b31dc000414be1b4cee9a0b9f7d9eab4c6829037c327914d5640000000000000000000000000000000009b28329096d8644dfcba6e92477eafff29f7477da4581ce76d1493f03034d7f5d3acaadbe42c76a83ca51db79d456d10000000000000000000000000000000019f75a303fdede5d97f3e521b03ef6b9d7c008d770b59ce3ac38900b340895e008342701ad1b41830b9c010936f4ff1700000000000000000000000000000000161aa1853edbb56fa3bd685c9c6b88e466dfa3c4f194f6774b4d9b1f30b016993bd0d65e8e9d6dea6caa196ff735bd67", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_21", + "Gas": 161000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001354dd8a230fde7c983dcf06fa9ac075b3ab8f56cdd9f15bf870afce2ae6e7c65ba91a1df6255b6f640bb51d7fed302500000000000000000000000000000000130f139ca118869de846d1d938521647b7d27a95b127bbc53578c7b66d88d541adb525e7028a147bf332607bd760deac000000000000000000000000000000000ae7289aa9bf20c4a9c807f2b3ac32f0db24e9a0a360c92e5ce4f8253f0e3e7853f771597c8141d705062bef12d4fea80000000000000000000000000000000001d2f610d79110f93145faad2e34f3408316b1dc3a72852e811b324577d9037035e24af25002ddd100cd9283b70ddcad0000000000000000000000000000000012947315d5c0ec670619125eed0de3dd259a008baee4379b82accf2391e70a2bdad264cda04c3bc1b5394a62559fa0ef000000000000000000000000000000001239e687c4d3417c3c9b655035f8d8a649c255f9a8e6f03b785eed0d416a1cd6ef7c8b45563acb4616af24f64dbccac4000000000000000000000000000000001354dd8a230fde7c983dcf06fa9ac075b3ab8f56cdd9f15bf870afce2ae6e7c65ba91a1df6255b6f640bb51d7fed30250000000000000000000000000000000006f1fe4d98675ffc62d4d5dd0af9968faca4d0ef425d56fa31b80aea892820e270f6da17aec9eb83c6cc9f84289ecbff000000000000000000000000000000000ae7289aa9bf20c4a9c807f2b3ac32f0db24e9a0a360c92e5ce4f8253f0e3e7853f771597c8141d705062bef12d4fea80000000000000000000000000000000001d2f610d79110f93145faad2e34f3408316b1dc3a72852e811b324577d9037035e24af25002ddd100cd9283b70ddcad0000000000000000000000000000000012947315d5c0ec670619125eed0de3dd259a008baee4379b82accf2391e70a2bdad264cda04c3bc1b5394a62559fa0ef000000000000000000000000000000001239e687c4d3417c3c9b655035f8d8a649c255f9a8e6f03b785eed0d416a1cd6ef7c8b45563acb4616af24f64dbccac4", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_22", + "Gas": 161000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000003f76a6dc6da31a399b93f4431bfabb3e48d86745eaa4b24d6337305006e3c7fc7bfcc85c85e2f3514cd389fec4e70580000000000000000000000000000000010e4280374c532ed0df44ac0bac82572f839afcfb8b696eea617d5bd1261288dfa90a7190200687d470992fb4827ff32000000000000000000000000000000001179ee329771b5913d07818e70f6ce5a58d74ea0b573eaa1bd3d97e45d3eeb27fcc7d37dba127af7a38354cb6ff48f7c000000000000000000000000000000000c898abe6eb76ef99f5143cfb8d840a918bcc9096ce25caa45d0bf5d20814cb01b024f1fd2cbecb6bef65d9456070dd90000000000000000000000000000000008e2a4fd746e86f90484f9b9b7b47b6afe5833762e515ccb276c554f00df88dd9aa0fb792c5f419dda0465cfed838e7c0000000000000000000000000000000012b5e6f7070c0045ade96f548ed6428c5030fa20c6f6f37a42fde9dbb5cd01def0fd8585bf8aeef913e7d42b9ef22efa0000000000000000000000000000000003f76a6dc6da31a399b93f4431bfabb3e48d86745eaa4b24d6337305006e3c7fc7bfcc85c85e2f3514cd389fec4e705800000000000000000000000000000000091ce9e6c4bab3ad3d275cf5888387646c3d9bb53ace7bd0c118fce3e44fcd96241b58e5af53978272f56d04b7d7ab79000000000000000000000000000000001179ee329771b5913d07818e70f6ce5a58d74ea0b573eaa1bd3d97e45d3eeb27fcc7d37dba127af7a38354cb6ff48f7c000000000000000000000000000000000c898abe6eb76ef99f5143cfb8d840a918bcc9096ce25caa45d0bf5d20814cb01b024f1fd2cbecb6bef65d9456070dd90000000000000000000000000000000008e2a4fd746e86f90484f9b9b7b47b6afe5833762e515ccb276c554f00df88dd9aa0fb792c5f419dda0465cfed838e7c0000000000000000000000000000000012b5e6f7070c0045ade96f548ed6428c5030fa20c6f6f37a42fde9dbb5cd01def0fd8585bf8aeef913e7d42b9ef22efa", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_23", + "Gas": 161000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000009439f061c7d5fada6e5431c77fd093222285c98449951f6a6c4c8f225b316144875bc764be5ca51c7895773a9f1a640000000000000000000000000000000000ebdef273e2288c784c061bef6a45cd49b0306ac1e9faab263c6ff73dea4627189c8f10a823253d86a8752769cc4f8f2000000000000000000000000000000000fe2e61bc8e9085d2b472a6791d4851762d6401fd3e7d3f3ba61620dc70b773f2102df1c9d6f1462144662fb2f15359700000000000000000000000000000000031f160cde626ca11f67613884a977fb5d3248d78ddbf23e50e52c3ba4090268c1f6cd8156fa41d848a482a0ca39eb04000000000000000000000000000000000eb61ba51124be7f3ee9be1488aa83cbd2333aa7e09ae67fef63c890534cb37ca7de3d16046b984e72db21e1f5c57a8a0000000000000000000000000000000006bf6f5d65aa7d19613141018ac8bf5d1e6fe494a9f30da215a2313a0241779006bce33a776aeedae5de5ea6ee5a9b9e0000000000000000000000000000000009439f061c7d5fada6e5431c77fd093222285c98449951f6a6c4c8f225b316144875bc764be5ca51c7895773a9f1a640000000000000000000000000000000000b4322c2fb5d5dd2c65b45f74ca75002c97444d8d4e5680d0369d32d180c93b294e30ef42f21ac274f77ad89633ab1b9000000000000000000000000000000000fe2e61bc8e9085d2b472a6791d4851762d6401fd3e7d3f3ba61620dc70b773f2102df1c9d6f1462144662fb2f15359700000000000000000000000000000000031f160cde626ca11f67613884a977fb5d3248d78ddbf23e50e52c3ba4090268c1f6cd8156fa41d848a482a0ca39eb04000000000000000000000000000000000eb61ba51124be7f3ee9be1488aa83cbd2333aa7e09ae67fef63c890534cb37ca7de3d16046b984e72db21e1f5c57a8a0000000000000000000000000000000006bf6f5d65aa7d19613141018ac8bf5d1e6fe494a9f30da215a2313a0241779006bce33a776aeedae5de5ea6ee5a9b9e", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_24", + "Gas": 161000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001478ee0ffebf22708a6ab88855081daba5ee2f279b5a2ee5f5f8aec8f97649c8d5634fec3f8b28ad60981e6f29a091b10000000000000000000000000000000011efaeec0b1a4057b1e0053263afe40158790229c5bfb08062c90a252f59eca36085ab35e4cbc70483d29880c5c2f8c200000000000000000000000000000000196044a5cdbc5300ee837dca745a44379070e9297697f5db28df4a37307cc740abed45cc778a3f4e3b8c9890ab6c3c70000000000000000000000000000000001176f5de6a3577ad67863bd3d9152ab9e8184964c6ac276e95946788f5a76394047580077c0971d874a40d510eb0443e00000000000000000000000000000000147dd55dff69213c5760e8d22b700dd7a9c7c33c434a3be95bd5281b97b464fb934a3dff7c23f3e59c5d8d26faa426bf0000000000000000000000000000000019efcf03ddb0934b0f0dba3569809d5b48b863d50d3be4973b504244414e1e1db56adff51d33265ce102b320c552781f000000000000000000000000000000001478ee0ffebf22708a6ab88855081daba5ee2f279b5a2ee5f5f8aec8f97649c8d5634fec3f8b28ad60981e6f29a091b100000000000000000000000000000000081162fe2e65a642993ba283df9bc8d60bfe495b2dc5623f0467c87bc7570980be2654c8cc8838fb362c677f3a3cb1e900000000000000000000000000000000196044a5cdbc5300ee837dca745a44379070e9297697f5db28df4a37307cc740abed45cc778a3f4e3b8c9890ab6c3c70000000000000000000000000000000001176f5de6a3577ad67863bd3d9152ab9e8184964c6ac276e95946788f5a76394047580077c0971d874a40d510eb0443e00000000000000000000000000000000147dd55dff69213c5760e8d22b700dd7a9c7c33c434a3be95bd5281b97b464fb934a3dff7c23f3e59c5d8d26faa426bf0000000000000000000000000000000019efcf03ddb0934b0f0dba3569809d5b48b863d50d3be4973b504244414e1e1db56adff51d33265ce102b320c552781f", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_25", + "Gas": 161000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000150d43c64cb1dbb7b981f455e90b740918e2d63453ca17d8eeecb68e662d2581f8aa1aea5b095cd8fc2a941d6e2728390000000000000000000000000000000006dc2ccb10213d3f6c3f10856888cb2bf6f1c7fcb2a17d6e63596c29281682cafd4c72696ecd6af3cce31c440144ebd10000000000000000000000000000000005d8edbabf37a47a539d84393bb2747d0a35a52b80a7c99616c910479306e204e5db1f0fa3fe69f35af3164c7e5726b50000000000000000000000000000000005015082d6975649fbc172035da04f8aeb6d0dd88fdfac3fbd68ec925dc199413ed670488dc6588f9bd34c4ff527f149000000000000000000000000000000001312d53088ca58dfc325772b8dc0e1b20cebf7b2d5b6b4c560759987b44060bf4a59a68d1a5623bbb3cc5b0bc3986b810000000000000000000000000000000012110cd462c6fabf04f67d652639d19640c46f51aadd6c4f9a6dd7806cffb6192d95c198f4c8284151feaa2e2a0dbc1f00000000000000000000000000000000150d43c64cb1dbb7b981f455e90b740918e2d63453ca17d8eeecb68e662d2581f8aa1aea5b095cd8fc2a941d6e272839000000000000000000000000000000001324e51f295ea95adedc9730dac2e1ab6d85838840e3955103d76677ce9a7359215f8d954286950bed1be3bbfebabeda0000000000000000000000000000000005d8edbabf37a47a539d84393bb2747d0a35a52b80a7c99616c910479306e204e5db1f0fa3fe69f35af3164c7e5726b50000000000000000000000000000000005015082d6975649fbc172035da04f8aeb6d0dd88fdfac3fbd68ec925dc199413ed670488dc6588f9bd34c4ff527f149000000000000000000000000000000001312d53088ca58dfc325772b8dc0e1b20cebf7b2d5b6b4c560759987b44060bf4a59a68d1a5623bbb3cc5b0bc3986b810000000000000000000000000000000012110cd462c6fabf04f67d652639d19640c46f51aadd6c4f9a6dd7806cffb6192d95c198f4c8284151feaa2e2a0dbc1f", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_26", + "Gas": 161000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000f46bb86e827aa9c0c570d93f4d7d6986668c0099e4853927571199e1ce9e756d9db951f5b0325acafb2bf6e8fec2a1b0000000000000000000000000000000006d38cc6cc1a950a18e92e16287f201af4c014aba1a17929dd407d0440924ce5f08fad8fe0c50f7f733b285bf282acfc00000000000000000000000000000000117fd5016ddb779a6979d2bffe18032d9a5cdc5a6c7feeaa412381983d49ab894cb067f671163ccbe6225c3d85219db6000000000000000000000000000000000dcf01077dcce35c283bea662f4e4d16f871717eb78e630d9f95a200cc104fe67b0d69d95f6704d9812b46c92b1bc9de00000000000000000000000000000000121f212cd7251697ef6a7e3aa93eb0d7d0157cf1247d4411430c36c7277bf8acfccc4ed8590b5e8d0f760e0e4ed7e95a0000000000000000000000000000000007d22d78b486f575e01e21e1239cbedc4628ba7e01ecf4a3459bd78a9716e2969f26ea3f2449685f60397e1ab2aa7352000000000000000000000000000000000f46bb86e827aa9c0c570d93f4d7d6986668c0099e4853927571199e1ce9e756d9db951f5b0325acafb2bf6e8fec2a1b00000000000000000000000000000000132d85236d655190323279a01acc8cbc6fb736d951e3999589f0559cb61ea93e2e1c526ed08ef08046c3d7a40d7cfdaf00000000000000000000000000000000117fd5016ddb779a6979d2bffe18032d9a5cdc5a6c7feeaa412381983d49ab894cb067f671163ccbe6225c3d85219db6000000000000000000000000000000000dcf01077dcce35c283bea662f4e4d16f871717eb78e630d9f95a200cc104fe67b0d69d95f6704d9812b46c92b1bc9de00000000000000000000000000000000121f212cd7251697ef6a7e3aa93eb0d7d0157cf1247d4411430c36c7277bf8acfccc4ed8590b5e8d0f760e0e4ed7e95a0000000000000000000000000000000007d22d78b486f575e01e21e1239cbedc4628ba7e01ecf4a3459bd78a9716e2969f26ea3f2449685f60397e1ab2aa7352", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_27", + "Gas": 161000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000010cde0dbf4e18009c94ba648477624bbfb3732481d21663dd13cea914d6c54ec060557010ebe333d5e4b266e1563c631000000000000000000000000000000000fb24d3d4063fd054cd5b7288498f107114ff323226aca58d3336444fc79c010db15094ceda6eb99770c168d459f0da0000000000000000000000000000000000224cbea61c5136987d8dbc8deafa78ae002255c031bb54335bcf99e56a57768aa127506fca1761e8b835e67e88bb4dd0000000000000000000000000000000018cbf072b544df760c051d394ff68ad2dd5a8c731377fa2a5f61e61481ad5b42645704a2d083c7d45ed4774e5448141e000000000000000000000000000000000740b8b7d7bce78a51809713656c94cf98de72887676050f65f74c57cbe574278dd3634c44e057ea95babcc3d230e3c40000000000000000000000000000000006696058a191c7012a4ee7c973c2005ac51af02a85cbb60e3164809a583b4431dda2b59e1c9ceeb652b3ac7021d116a60000000000000000000000000000000010cde0dbf4e18009c94ba648477624bbfb3732481d21663dd13cea914d6c54ec060557010ebe333d5e4b266e1563c631000000000000000000000000000000000a4ec4acf91be994fe45f08dbeb2bbd053275861d11a486693fd6e5bfa3736134396f6b1c3ad146642f2e972ba609d0b000000000000000000000000000000000224cbea61c5136987d8dbc8deafa78ae002255c031bb54335bcf99e56a57768aa127506fca1761e8b835e67e88bb4dd0000000000000000000000000000000018cbf072b544df760c051d394ff68ad2dd5a8c731377fa2a5f61e61481ad5b42645704a2d083c7d45ed4774e5448141e000000000000000000000000000000000740b8b7d7bce78a51809713656c94cf98de72887676050f65f74c57cbe574278dd3634c44e057ea95babcc3d230e3c40000000000000000000000000000000006696058a191c7012a4ee7c973c2005ac51af02a85cbb60e3164809a583b4431dda2b59e1c9ceeb652b3ac7021d116a6", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_28", + "Gas": 161000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000008c0a4c543b7506e9718658902982b4ab7926cd90d4986eceb17b149d8f5122334903300ad419b90c2cb56dc6d2fe976000000000000000000000000000000000824e1631f054b666893784b1e7edb44b9a53596f718a6e5ba606dc1020cb6e269e9edf828de1768df0dd8ab8440e053000000000000000000000000000000001522e0a4ccd607f117fc6fc8f9abcd704e9850d96adb95d9bfaab210b76bfb2c5dc75163b922bd7a886541250bc1d8630000000000000000000000000000000018a6e4327d633108a292a51abed43e95230e951e4476dc385ceea9c72ed528bf3e06c42d10cefbd4aa75b134936e4747000000000000000000000000000000001198587188e793ad2ec2fa0fa1d0da9b61ed48444fe6722e523aeac270f17f73f56b1e726ab811bb54a6e42e506d70a20000000000000000000000000000000004bedd94182e0f16c71223ac3d68ab327d28ee0ccdcd2c2db07faf69e1babe3fbf3ba09c28b146eca7ab047b592947030000000000000000000000000000000008c0a4c543b7506e9718658902982b4ab7926cd90d4986eceb17b149d8f5122334903300ad419b90c2cb56dc6d2fe9760000000000000000000000000000000011dc30871a7a9b33e2882f6b24ccd192aad215edfc6c6bd9acd064dff4a43f41b4c212068875e896daf127547bbeca58000000000000000000000000000000001522e0a4ccd607f117fc6fc8f9abcd704e9850d96adb95d9bfaab210b76bfb2c5dc75163b922bd7a886541250bc1d8630000000000000000000000000000000018a6e4327d633108a292a51abed43e95230e951e4476dc385ceea9c72ed528bf3e06c42d10cefbd4aa75b134936e4747000000000000000000000000000000001198587188e793ad2ec2fa0fa1d0da9b61ed48444fe6722e523aeac270f17f73f56b1e726ab811bb54a6e42e506d70a20000000000000000000000000000000004bedd94182e0f16c71223ac3d68ab327d28ee0ccdcd2c2db07faf69e1babe3fbf3ba09c28b146eca7ab047b59294703", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_29", + "Gas": 161000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000159d94fb0cf6f4e3e26bdeb536d1ee9c511a29d32944da43420e86c3b5818e0f482a7a8af72880d4825a50fee6bc8cd8000000000000000000000000000000000c2ffe6be05eccd9170b6c181966bb8c1c3ed10e763613112238cabb41370e2a5bb5fef967f4f8f2af944dbef09d265e00000000000000000000000000000000148b7dfc21521d79ff817c7a0305f1048851e283be13c07d5c04d28b571d48172838399ba539529e8d037ffd1f7295580000000000000000000000000000000003015abea326c15098f5205a8b2d3cd74d72dac59d60671ca6ef8c9c714ea61ffdacd46d1024b5b4f7e6b3b569fabaf20000000000000000000000000000000011f0c512fe7dc2dd8abdc1d22c2ecd2e7d1b84f8950ab90fc93bf54badf7bb9a9bad8c355d52a5efb110dca891e4cc3d0000000000000000000000000000000019774010814d1d94caf3ecda3ef4f5c5986e966eaf187c32a8a5a4a59452af0849690cf71338193f2d8435819160bcfb00000000000000000000000000000000159d94fb0cf6f4e3e26bdeb536d1ee9c511a29d32944da43420e86c3b5818e0f482a7a8af72880d4825a50fee6bc8cd8000000000000000000000000000000000dd1137e592119c134103b9e29e4f14b48387a767d4effae44f807e5b579e7f9c2f60105495f070d0a6ab2410f62844d00000000000000000000000000000000148b7dfc21521d79ff817c7a0305f1048851e283be13c07d5c04d28b571d48172838399ba539529e8d037ffd1f7295580000000000000000000000000000000003015abea326c15098f5205a8b2d3cd74d72dac59d60671ca6ef8c9c714ea61ffdacd46d1024b5b4f7e6b3b569fabaf20000000000000000000000000000000011f0c512fe7dc2dd8abdc1d22c2ecd2e7d1b84f8950ab90fc93bf54badf7bb9a9bad8c355d52a5efb110dca891e4cc3d0000000000000000000000000000000019774010814d1d94caf3ecda3ef4f5c5986e966eaf187c32a8a5a4a59452af0849690cf71338193f2d8435819160bcfb", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_30", + "Gas": 161000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000019c822a4d44ac22f6fbaef356c37ceff93c1d6933e8c8f3b55784cfe62e5705930be48607c3f7a4a2ca146945cad6242000000000000000000000000000000000353d6521a17474856ad69582ce225f27d60f5a8319bea8cefded2c3f6b862d76fe633c77ed8ccdf99d2b10430253fc8000000000000000000000000000000000805892f21889cab3cfe62226eaff6a8d3586d4396692b379efc7e90b0eaad4c9afbdf0f56b30f0c07ae0bc4013343b30000000000000000000000000000000007853f0e75c8dee034c2444299da58c98f22de367a90550dbc635fb52c9a8f61ccc100f70f10208944e48d09507fdce100000000000000000000000000000000064afd6b3ef7ff7ec34f1fa330877b42958a46a7698c6d21adf73bfdfcab7793b312e21e5988652e655f2d42edb8a673000000000000000000000000000000000ea8a2217c3dbcc0f6e562de9cb2f334c896577d0b3a7108d96b1aba2d705dbf531e870d4023cec2c0533455013242330000000000000000000000000000000019c822a4d44ac22f6fbaef356c37ceff93c1d6933e8c8f3b55784cfe62e5705930be48607c3f7a4a2ca146945cad62420000000000000000000000000000000016ad3b981f689f51f46e3e5e166986e4e71655dcc1e928327751ffdcfff8934caec5cc37327b3320202c4efbcfda6ae3000000000000000000000000000000000805892f21889cab3cfe62226eaff6a8d3586d4396692b379efc7e90b0eaad4c9afbdf0f56b30f0c07ae0bc4013343b30000000000000000000000000000000007853f0e75c8dee034c2444299da58c98f22de367a90550dbc635fb52c9a8f61ccc100f70f10208944e48d09507fdce100000000000000000000000000000000064afd6b3ef7ff7ec34f1fa330877b42958a46a7698c6d21adf73bfdfcab7793b312e21e5988652e655f2d42edb8a673000000000000000000000000000000000ea8a2217c3dbcc0f6e562de9cb2f334c896577d0b3a7108d96b1aba2d705dbf531e870d4023cec2c053345501324233", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_31", + "Gas": 161000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000189bf269a72de2872706983835afcbd09f6f4dfcabe0241b4e9fe1965a250d230d6f793ab17ce7cac456af7be4376be6000000000000000000000000000000000d4441801d287ba8de0e2fb6b77f766dbff07b4027098ce463cab80e01eb31d9f5dbd7ac935703d68c7032fa5128ff170000000000000000000000000000000011798ea9c137acf6ef9483b489c0273d4f69296959922a352b079857953263372b8d339115f0576cfabedc185abf2086000000000000000000000000000000001498b1412f52b07a0e4f91cbf5e1852ea38fc111613523f1e61b97ebf1fd7fd2cdf36d7f73f1e33719c0b63d7bf66b8f0000000000000000000000000000000004c56d3ee9931f7582d7eebeb598d1be208e3b333ab976dc7bb271969fa1d6caf8f467eb7cbee4af5d30e5c66d00a4e2000000000000000000000000000000000de29857dae126c0acbe966da6f50342837ef5dd9994ad929d75814f6f33f77e5b33690945bf6e980031ddd90ebc76ce00000000000000000000000000000000189bf269a72de2872706983835afcbd09f6f4dfcabe0241b4e9fe1965a250d230d6f793ab17ce7cac456af7be4376be6000000000000000000000000000000000cbcd06a1c576af16d0d77ff8bcc3669a486d044cc7b85db03661a92f4c5c44a28d028521dfcfc292d8ecd05aed6ab940000000000000000000000000000000011798ea9c137acf6ef9483b489c0273d4f69296959922a352b079857953263372b8d339115f0576cfabedc185abf2086000000000000000000000000000000001498b1412f52b07a0e4f91cbf5e1852ea38fc111613523f1e61b97ebf1fd7fd2cdf36d7f73f1e33719c0b63d7bf66b8f0000000000000000000000000000000004c56d3ee9931f7582d7eebeb598d1be208e3b333ab976dc7bb271969fa1d6caf8f467eb7cbee4af5d30e5c66d00a4e2000000000000000000000000000000000de29857dae126c0acbe966da6f50342837ef5dd9994ad929d75814f6f33f77e5b33690945bf6e980031ddd90ebc76ce00000000000000000000000000000000189bf269a72de2872706983835afcbd09f6f4dfcabe0241b4e9fe1965a250d230d6f793ab17ce7cac456af7be4376be6000000000000000000000000000000000d4441801d287ba8de0e2fb6b77f766dbff07b4027098ce463cab80e01eb31d9f5dbd7ac935703d68c7032fa5128ff170000000000000000000000000000000011798ea9c137acf6ef9483b489c0273d4f69296959922a352b079857953263372b8d339115f0576cfabedc185abf2086000000000000000000000000000000001498b1412f52b07a0e4f91cbf5e1852ea38fc111613523f1e61b97ebf1fd7fd2cdf36d7f73f1e33719c0b63d7bf66b8f00000000000000000000000000000000153ba4ab4fecc724c843b8f78db2db1943e91051b8cb9be2eb7e610a570f1f5925b7981334951b505cce1a3992ff05c9000000000000000000000000000000000c1e79925e9ebfd99e5d11489c56a994e0f855a759f0652cc9bb5151877cfea5c37896f56b949167b9cd2226f14333dd", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_32", + "Gas": 184000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000003299542a0c40efbb55d169a92ad11b4d6d7a6ed949cb0d6477803fbedcf74e4bd74de854c4c8b7f200c85c8129292540000000000000000000000000000000013a3d49e58274c2b4a534b95b7071b6d2f42b17b887bf128627c0f8894c19d3d69c1a419373ca4bd1bb6d4efc78e1d3f000000000000000000000000000000001755d8a095e087ca66f8a118e0d2c7d5e4d8427dda8fe3049080f4aff12a8746f8c2679c310f4be0d94c5bef0414a7a600000000000000000000000000000000069c84c6419ed5c0441975ee8410065a56c65f07a4b545ff596b657dc4620c7405fd4d092b281e272773d2281a6359a8000000000000000000000000000000000e751ccbd475fe7eda1c62df626c1d37e8ae6853cc9b2109beef3e8c6f26d41a5e4e0a91bbc3371c7ab6ba780b5db41600000000000000000000000000000000184097644c9b44d543ebc0934825610590cc9f8b17ed08e9c06592bf85591d2702b18cf48a70b378926057e541eb8ac50000000000000000000000000000000003299542a0c40efbb55d169a92ad11b4d6d7a6ed949cb0d6477803fbedcf74e4bd74de854c4c8b7f200c85c81292925400000000000000000000000000000000065d3d4be1589a6f00c85c208c44916a35349a096b09219704b4c31861ef58e6b4ea5be57a175b429e482b1038718d6c000000000000000000000000000000001755d8a095e087ca66f8a118e0d2c7d5e4d8427dda8fe3049080f4aff12a8746f8c2679c310f4be0d94c5bef0414a7a600000000000000000000000000000000069c84c6419ed5c0441975ee8410065a56c65f07a4b545ff596b657dc4620c7405fd4d092b281e272773d2281a6359a8000000000000000000000000000000000e751ccbd475fe7eda1c62df626c1d37e8ae6853cc9b2109beef3e8c6f26d41a5e4e0a91bbc3371c7ab6ba780b5db41600000000000000000000000000000000184097644c9b44d543ebc0934825610590cc9f8b17ed08e9c06592bf85591d2702b18cf48a70b378926057e541eb8ac50000000000000000000000000000000003299542a0c40efbb55d169a92ad11b4d6d7a6ed949cb0d6477803fbedcf74e4bd74de854c4c8b7f200c85c8129292540000000000000000000000000000000013a3d49e58274c2b4a534b95b7071b6d2f42b17b887bf128627c0f8894c19d3d69c1a419373ca4bd1bb6d4efc78e1d3f000000000000000000000000000000001755d8a095e087ca66f8a118e0d2c7d5e4d8427dda8fe3049080f4aff12a8746f8c2679c310f4be0d94c5bef0414a7a600000000000000000000000000000000069c84c6419ed5c0441975ee8410065a56c65f07a4b545ff596b657dc4620c7405fd4d092b281e272773d2281a6359a8000000000000000000000000000000000b8bf51e6509e81b70ff44d6e0df8f9f7bc8e33126e9f1b5a8419414878a2209c05df56cf590c8e33f484587f4a1f6950000000000000000000000000000000001c07a85ece4a1c5072fe722fb264bd1d3aaabf9db9809d5a6cb3fe17157d8fd1bfa730a26e34c87279ea81abe141fe6", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_33", + "Gas": 184000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000121b540a0465b39f2f093112c20a9822fc82497105778937c9d5cdcfe039d62998d47d4f41c76482c31f39a79352beda0000000000000000000000000000000014a461f829e0a76ba89f42eb57dffb4f5544df2008163bd0ea1af824f7ff910b27418a0e4f86cb8046dc1f3139cab9af000000000000000000000000000000000213e5d2d46523203ae07f36fdeb6c304fb86f552fb9adb566711c31262629efb0b1561585f85d2ac7be174682229bd8000000000000000000000000000000000b3336b5a4f7c0d16db9615e77bcdd55b7cb5b5c1591d835f34f5c1f1468e3cef954608667fb97a32e4595f43b845612000000000000000000000000000000001869606dde1688e5ae9f1c466c5897fce7794f3735234b5af1ad3617f0688529499bbdc9f0b911840a3d99fd9c49150d00000000000000000000000000000000001bfd33df4a6059608ada794e03d7456e78317145eb4d5677c00d482ac4cf470053d33583cf602feb67b6f972c9973900000000000000000000000000000000121b540a0465b39f2f093112c20a9822fc82497105778937c9d5cdcfe039d62998d47d4f41c76482c31f39a79352beda00000000000000000000000000000000055caff20f9f3f2ea27c64caeb6bb1880f326c64eb6ed6ee7d15da7bfeb16518f76a75f061cd347f7322e0cec634f0fc000000000000000000000000000000000213e5d2d46523203ae07f36fdeb6c304fb86f552fb9adb566711c31262629efb0b1561585f85d2ac7be174682229bd8000000000000000000000000000000000b3336b5a4f7c0d16db9615e77bcdd55b7cb5b5c1591d835f34f5c1f1468e3cef954608667fb97a32e4595f43b845612000000000000000000000000000000001869606dde1688e5ae9f1c466c5897fce7794f3735234b5af1ad3617f0688529499bbdc9f0b911840a3d99fd9c49150d00000000000000000000000000000000001bfd33df4a6059608ada794e03d7456e78317145eb4d5677c00d482ac4cf470053d33583cf602feb67b6f972c9973900000000000000000000000000000000121b540a0465b39f2f093112c20a9822fc82497105778937c9d5cdcfe039d62998d47d4f41c76482c31f39a79352beda0000000000000000000000000000000014a461f829e0a76ba89f42eb57dffb4f5544df2008163bd0ea1af824f7ff910b27418a0e4f86cb8046dc1f3139cab9af000000000000000000000000000000000213e5d2d46523203ae07f36fdeb6c304fb86f552fb9adb566711c31262629efb0b1561585f85d2ac7be174682229bd8000000000000000000000000000000000b3336b5a4f7c0d16db9615e77bcdd55b7cb5b5c1591d835f34f5c1f1468e3cef954608667fb97a32e4595f43b845612000000000000000000000000000000000197b17c5b695db49c7c8b6fd6f314da7cfdfc4dbe61c76475839c89064870fad5104234c09aee7bafc1660263b6959e0000000000000000000000000000000019e514b65a358640ea90cd3cf547d591f5ff1a13ad99c568ef70c558cbec26dd1e582cc92d849fcfce9749068d361372", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_34", + "Gas": 184000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001383bc4d6c748d5c76ab4ba04f8fcd4c0fed9a49ea080c548893440819833ad72a8249f77391d5fbff78329eb319d3830000000000000000000000000000000016404bd07b6c6480af2d23301940e61817ee2e61fc625c100b31e1b324c369a583b61048dd57ab97b80b1fe6cd64c5c30000000000000000000000000000000004ac6e6077d4eddd0e23f30cfd64b7aa1525c85424224e70c15d7535e02aea7a312ef24ba2dcf70b926acb851da2530c0000000000000000000000000000000006ad07d3e8f45cedfb4279913bf0a29e37604810463d6020b4fa8c8c4977d69cffaa33e1149706f04eb237194dcafa520000000000000000000000000000000002c536dd2f05f4a7eaa33fd884262b22a2ab2a88e7b63cb08ebb67fc0f143da7d6b18dd394c424161f7cf703acdc82f50000000000000000000000000000000002d1d9ff74e20ea9b03c478784f57e7a58a21ca2b1e552319f33305f367f5ae4daf8138505f953db4f86c0ec1d96d5f0000000000000000000000000000000001383bc4d6c748d5c76ab4ba04f8fcd4c0fed9a49ea080c548893440819833ad72a8249f77391d5fbff78329eb319d3830000000000000000000000000000000003c0c619be1382199bee84862a0ac6bf4c891d22f722b6af5bfef0edd1ed8c7e9af5efb5d3fc546801f3e019329ae4e80000000000000000000000000000000004ac6e6077d4eddd0e23f30cfd64b7aa1525c85424224e70c15d7535e02aea7a312ef24ba2dcf70b926acb851da2530c0000000000000000000000000000000006ad07d3e8f45cedfb4279913bf0a29e37604810463d6020b4fa8c8c4977d69cffaa33e1149706f04eb237194dcafa520000000000000000000000000000000002c536dd2f05f4a7eaa33fd884262b22a2ab2a88e7b63cb08ebb67fc0f143da7d6b18dd394c424161f7cf703acdc82f50000000000000000000000000000000002d1d9ff74e20ea9b03c478784f57e7a58a21ca2b1e552319f33305f367f5ae4daf8138505f953db4f86c0ec1d96d5f0000000000000000000000000000000001383bc4d6c748d5c76ab4ba04f8fcd4c0fed9a49ea080c548893440819833ad72a8249f77391d5fbff78329eb319d3830000000000000000000000000000000016404bd07b6c6480af2d23301940e61817ee2e61fc625c100b31e1b324c369a583b61048dd57ab97b80b1fe6cd64c5c30000000000000000000000000000000004ac6e6077d4eddd0e23f30cfd64b7aa1525c85424224e70c15d7535e02aea7a312ef24ba2dcf70b926acb851da2530c0000000000000000000000000000000006ad07d3e8f45cedfb4279913bf0a29e37604810463d6020b4fa8c8c4977d69cffaa33e1149706f04eb237194dcafa5200000000000000000000000000000000173bdb0d0a79f1f2607867ddbf2581b4c1cc20fc0bced60ed8756aa4e79cb87c47fa722b1c8fdbe99a8208fc532327b600000000000000000000000000000000172f37eac49dd7f09adf602ebe562e5d0bd52ee2419fc08dc7fda241c0319b3f43b3ec79ab5aac246a783f13e268d4bb", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_35", + "Gas": 184000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000006bc68c6510c15a5d7bc6eebce04f7c5fce3bb02f9f89ea14ab0dfb43645b6346af7e25a8e044e842b7a3d06fe9b1a0300000000000000000000000000000000053ee41f6a51c49b069f12de32e3e6b0b355cd2c3ba87a149c7de86136a5d9c5b7b59f2d1237964e548d1b62ec36c8db000000000000000000000000000000001913ce14bcd1d7bbb47f8efd92d7ffd155ed1990a1dbf1ee7d5e6d592a92bcbec6e865199362950afd6c8fc49b3e10a400000000000000000000000000000000020df729079e76cf06f84e3355e683e093dafad38c2ba92cf7a9faa0515f2f44d814f971046ea20116cc4b0014d7ec350000000000000000000000000000000018db123e05404eea8707f9356f417c3966312b9e41765a6fd8449879ddc4c9850c38434481b235a5bc35db1b8ee86d43000000000000000000000000000000000b4162715717e9065a3849a9294cfe39b351e57ab5a6790f3e725ad9fbf0e4b9d6a3554e872af9c37df33bb896dada5c0000000000000000000000000000000006bc68c6510c15a5d7bc6eebce04f7c5fce3bb02f9f89ea14ab0dfb43645b6346af7e25a8e044e842b7a3d06fe9b1a030000000000000000000000000000000014c22dcacf2e21ff447c94d81067c626b1217e58b7dc98aacab2ea3fc00b1c5e66f660d19f1c69b16571e49d13c8e1d0000000000000000000000000000000001913ce14bcd1d7bbb47f8efd92d7ffd155ed1990a1dbf1ee7d5e6d592a92bcbec6e865199362950afd6c8fc49b3e10a400000000000000000000000000000000020df729079e76cf06f84e3355e683e093dafad38c2ba92cf7a9faa0515f2f44d814f971046ea20116cc4b0014d7ec350000000000000000000000000000000018db123e05404eea8707f9356f417c3966312b9e41765a6fd8449879ddc4c9850c38434481b235a5bc35db1b8ee86d43000000000000000000000000000000000b4162715717e9065a3849a9294cfe39b351e57ab5a6790f3e725ad9fbf0e4b9d6a3554e872af9c37df33bb896dada5c0000000000000000000000000000000006bc68c6510c15a5d7bc6eebce04f7c5fce3bb02f9f89ea14ab0dfb43645b6346af7e25a8e044e842b7a3d06fe9b1a0300000000000000000000000000000000053ee41f6a51c49b069f12de32e3e6b0b355cd2c3ba87a149c7de86136a5d9c5b7b59f2d1237964e548d1b62ec36c8db000000000000000000000000000000001913ce14bcd1d7bbb47f8efd92d7ffd155ed1990a1dbf1ee7d5e6d592a92bcbec6e865199362950afd6c8fc49b3e10a400000000000000000000000000000000020df729079e76cf06f84e3355e683e093dafad38c2ba92cf7a9faa0515f2f44d814f971046ea20116cc4b0014d7ec35000000000000000000000000000000000125ffac343f97afc413ae80d40a309dfe461fe6b20eb84f8eec3a2718ec2c9f1273bcba2fa1ca59fdc924e471173d68000000000000000000000000000000000ebfaf78e267fd93f0e35e0d19feae9db125660a3dde99b028be77c6fac0116a4808aab02a29063c3c0bc4476924d04f", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_36", + "Gas": 184000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000024ca57c2dc2a7deec3082f2f2110b6788c57a8cdc43515044d275fe7d6f20540055bde823b7b091134fb811d23468ce0000000000000000000000000000000009cd91a281b96a881b20946fda164a987243c052378fcd8fee3926b75576dfa1d29a0aaca4b653da4e61da82577218080000000000000000000000000000000008be924b49e05c45419e328340f1cbcdd3350bacf832a372417d8331c942df200493a3f7f2e46ad2cdaf3544cfd8cd8600000000000000000000000000000000028cd100457f4e930fc0f55996a6b588c5361816bb853d1f522806e5ec1c455eb200343476feeb07ca77e961fc2adc1f000000000000000000000000000000000f6adad0a3bab3610165be2fadb1b020f25488a0af3d418b7d7cf1165812e17aefcbc23308ebcd31d22ba4ca5773dd87000000000000000000000000000000001657ff792e3d89d5d35767bd0cc788411b0420665a5e0704f4d2399b9d9a5ad3c027ee030fdf495e5a6e2a4c69d0571200000000000000000000000000000000024ca57c2dc2a7deec3082f2f2110b6788c57a8cdc43515044d275fe7d6f20540055bde823b7b091134fb811d23468ce0000000000000000000000000000000010338047b7c67c122ffb13466935623ef2338b32bbf5452f78f7abe9a13a16824c11f5520c9dac256b9d257da88d92a30000000000000000000000000000000008be924b49e05c45419e328340f1cbcdd3350bacf832a372417d8331c942df200493a3f7f2e46ad2cdaf3544cfd8cd8600000000000000000000000000000000028cd100457f4e930fc0f55996a6b588c5361816bb853d1f522806e5ec1c455eb200343476feeb07ca77e961fc2adc1f000000000000000000000000000000000f6adad0a3bab3610165be2fadb1b020f25488a0af3d418b7d7cf1165812e17aefcbc23308ebcd31d22ba4ca5773dd87000000000000000000000000000000001657ff792e3d89d5d35767bd0cc788411b0420665a5e0704f4d2399b9d9a5ad3c027ee030fdf495e5a6e2a4c69d0571200000000000000000000000000000000024ca57c2dc2a7deec3082f2f2110b6788c57a8cdc43515044d275fe7d6f20540055bde823b7b091134fb811d23468ce0000000000000000000000000000000009cd91a281b96a881b20946fda164a987243c052378fcd8fee3926b75576dfa1d29a0aaca4b653da4e61da82577218080000000000000000000000000000000008be924b49e05c45419e328340f1cbcdd3350bacf832a372417d8331c942df200493a3f7f2e46ad2cdaf3544cfd8cd8600000000000000000000000000000000028cd100457f4e930fc0f55996a6b588c5361816bb853d1f522806e5ec1c455eb200343476feeb07ca77e961fc2adc1f000000000000000000000000000000000a96371995c5333949b5e9869599fcb67222c2e44447d133e9b3e18a9e9e14a92ee03dcba86832cde7d35b35a88bcd240000000000000000000000000000000003a912710b425cc477c43ff93684249649732b1e99270bba725e990559169b505e8411fba174b6a15f90d5b3962f5399", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_37", + "Gas": 184000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001305e1b9706c7fc132aea63f0926146557d4dd081b7a2913dae02bab75b0409a515d0f25ffa3eda81cf4764de15741f60000000000000000000000000000000011bf87b12734a6360d3dda4b452deede34470fba8e62a68f79153cc288a8e7fed98c74af862883b9861d2195a58262e0000000000000000000000000000000000a5048d860b997a9fb352e58284ebbc026622d9be73de79b2807a0c9b431f41f379c255a2db0dd67413c18217cb21b7200000000000000000000000000000000045a701a3f46ca801c02a5419c836b2ab3d74ebd6f4fd1e7dddb1965b49c9a278f6e89950e7c35ebc6724569d34e364c0000000000000000000000000000000004cb55008ccb5b2b8ece69fac7283f5a9ef9e622e2a0e42bed5bdd77faa550882643afc1759b1a327c4f2277e13a3d4f000000000000000000000000000000001690dee40c6c824dc2588fc47dbf93f68ac250b9357e1112db72ded905ed7b101b5f877bdc42d56afb5b6202403a91c4000000000000000000000000000000001305e1b9706c7fc132aea63f0926146557d4dd081b7a2913dae02bab75b0409a515d0f25ffa3eda81cf4764de15741f60000000000000000000000000000000008418a39124b40643dddcd6afe1dbdf930303bca65226c2fee1b95de6e080e25451f8b4f2b2b7c4633e1de6a5a7d47cb000000000000000000000000000000000a5048d860b997a9fb352e58284ebbc026622d9be73de79b2807a0c9b431f41f379c255a2db0dd67413c18217cb21b7200000000000000000000000000000000045a701a3f46ca801c02a5419c836b2ab3d74ebd6f4fd1e7dddb1965b49c9a278f6e89950e7c35ebc6724569d34e364c0000000000000000000000000000000004cb55008ccb5b2b8ece69fac7283f5a9ef9e622e2a0e42bed5bdd77faa550882643afc1759b1a327c4f2277e13a3d4f000000000000000000000000000000001690dee40c6c824dc2588fc47dbf93f68ac250b9357e1112db72ded905ed7b101b5f877bdc42d56afb5b6202403a91c4000000000000000000000000000000001305e1b9706c7fc132aea63f0926146557d4dd081b7a2913dae02bab75b0409a515d0f25ffa3eda81cf4764de15741f60000000000000000000000000000000011bf87b12734a6360d3dda4b452deede34470fba8e62a68f79153cc288a8e7fed98c74af862883b9861d2195a58262e0000000000000000000000000000000000a5048d860b997a9fb352e58284ebbc026622d9be73de79b2807a0c9b431f41f379c255a2db0dd67413c18217cb21b7200000000000000000000000000000000045a701a3f46ca801c02a5419c836b2ab3d74ebd6f4fd1e7dddb1965b49c9a278f6e89950e7c35ebc6724569d34e364c000000000000000000000000000000001535bce9acb48b6ebc4d3dbb7c236d7cc57d656210e42e9379d4f528fc0ba59bf868503d3bb8e5cd3dafdd881ec56d5c00000000000000000000000000000000037033062d13644c88c317f1c58c18e0d9b4facbbe0701ac8bbdf3c7f0c37b14034c7882d5112a94bea39dfdbfc518e7", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_38", + "Gas": 184000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000012662b26f03fc8179f090f29894e86155cff4ec2def43393e054f417bbf375edd79f5032a5333ab4eba4418306ed0153000000000000000000000000000000000f26fdf1af1b8ad442ef4494627c815ca01ae84510944788b87f4aa2c8600ed310b9579318bc617a689b916bb7731dcb00000000000000000000000000000000153cec9690a6420a10e5a5a8ca46fd9d9f90e2a139886a07b375eeecce9083a5f5418e6baf64ef0f34176e432bc5343a000000000000000000000000000000000d87c1f37f83ae78a51af9c420e2584a64337d2d2dd8dc3b64f252c521901924e5eec1d9899594db5e64c93c7a01ef020000000000000000000000000000000017078538092ace26cc88b94360871fc9a6bb9992172158ef3a16467919955083accf8d55d48c7ec462a743dbbca7b448000000000000000000000000000000000289b703157a02fc1d687a5aa595495be8bbb3eb0d70554728255a44b7820e0ee82d984d5493c800f1d9d8ca0c9381dc0000000000000000000000000000000012662b26f03fc8179f090f29894e86155cff4ec2def43393e054f417bbf375edd79f5032a5333ab4eba4418306ed0153000000000000000000000000000000000ada13f88a645bc6082c6321e0cf2b7ac45c633fe2f0cb36aeb187fe2e50e7510df2a86b98979e8551636e94488c8ce000000000000000000000000000000000153cec9690a6420a10e5a5a8ca46fd9d9f90e2a139886a07b375eeecce9083a5f5418e6baf64ef0f34176e432bc5343a000000000000000000000000000000000d87c1f37f83ae78a51af9c420e2584a64337d2d2dd8dc3b64f252c521901924e5eec1d9899594db5e64c93c7a01ef020000000000000000000000000000000017078538092ace26cc88b94360871fc9a6bb9992172158ef3a16467919955083accf8d55d48c7ec462a743dbbca7b448000000000000000000000000000000000289b703157a02fc1d687a5aa595495be8bbb3eb0d70554728255a44b7820e0ee82d984d5493c800f1d9d8ca0c9381dc0000000000000000000000000000000012662b26f03fc8179f090f29894e86155cff4ec2def43393e054f417bbf375edd79f5032a5333ab4eba4418306ed0153000000000000000000000000000000000f26fdf1af1b8ad442ef4494627c815ca01ae84510944788b87f4aa2c8600ed310b9579318bc617a689b916bb7731dcb00000000000000000000000000000000153cec9690a6420a10e5a5a8ca46fd9d9f90e2a139886a07b375eeecce9083a5f5418e6baf64ef0f34176e432bc5343a000000000000000000000000000000000d87c1f37f83ae78a51af9c420e2584a64337d2d2dd8dc3b64f252c521901924e5eec1d9899594db5e64c93c7a01ef020000000000000000000000000000000002f98cb2305518737e92ee72e2c48d0dbdbbb1f2dc63b9d02d1a8c27dd1ba5a071dc72a8dcc7813b5757bc244357f6630000000000000000000000000000000017775ae72405e39e2db32d5b9db6637b7bbb9799e614bd783f0b785c3f2ee815367e67b15cc037fec8252735f36c28cf", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_39", + "Gas": 184000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001837f0f18bed66841b4ff0b0411da3d5929e59b957a0872bce1c898a4ef0e13350bf4c7c8bcff4e61f24feca1acd5a370000000000000000000000000000000003d2c7fe67cada2213e842ac5ec0dec8ec205b762f2a9c05fa12fa120c80eba30676834f0560d11ce9939fe210ad6c6300000000000000000000000000000000057f975064a29ba6ad20d6e6d97a15bd314d6cd419948d974a16923d52b38b9203f95937a0a0493a693099e4fa17ea540000000000000000000000000000000014396ce4abfc32945a6b2b0eb4896a6b19a041d4eae320ba18507ec3828964e56719fffaa47e57ea4a2e3bd1a149b6b600000000000000000000000000000000048b3e4ba3e2d1e0dbf5955101cf038dc22e87b0855a57b631ef119d1bd19d56c38a1d72376284c8598e866b6dba37530000000000000000000000000000000007c0b98cda33be53cf4ef29d0500ff5e7a3c2df6f83dfc1c36211d7f9c696b77dfa6571169cf7935d2fb5a6463cceac6000000000000000000000000000000001837f0f18bed66841b4ff0b0411da3d5929e59b957a0872bce1c898a4ef0e13350bf4c7c8bcff4e61f24feca1acd5a3700000000000000000000000000000000162e49ebd1b50c7837336509e48ace0e7856f00ec45a76b96d1dd88eea300a8118357cafabf32ee2d06b601def523e4800000000000000000000000000000000057f975064a29ba6ad20d6e6d97a15bd314d6cd419948d974a16923d52b38b9203f95937a0a0493a693099e4fa17ea540000000000000000000000000000000014396ce4abfc32945a6b2b0eb4896a6b19a041d4eae320ba18507ec3828964e56719fffaa47e57ea4a2e3bd1a149b6b600000000000000000000000000000000048b3e4ba3e2d1e0dbf5955101cf038dc22e87b0855a57b631ef119d1bd19d56c38a1d72376284c8598e866b6dba37530000000000000000000000000000000007c0b98cda33be53cf4ef29d0500ff5e7a3c2df6f83dfc1c36211d7f9c696b77dfa6571169cf7935d2fb5a6463cceac6000000000000000000000000000000001837f0f18bed66841b4ff0b0411da3d5929e59b957a0872bce1c898a4ef0e13350bf4c7c8bcff4e61f24feca1acd5a370000000000000000000000000000000003d2c7fe67cada2213e842ac5ec0dec8ec205b762f2a9c05fa12fa120c80eba30676834f0560d11ce9939fe210ad6c6300000000000000000000000000000000057f975064a29ba6ad20d6e6d97a15bd314d6cd419948d974a16923d52b38b9203f95937a0a0493a693099e4fa17ea540000000000000000000000000000000014396ce4abfc32945a6b2b0eb4896a6b19a041d4eae320ba18507ec3828964e56719fffaa47e57ea4a2e3bd1a149b6b6000000000000000000000000000000001575d39e959d14b96f261265417ca949a248c3d46e2abb093541c103dadf58cd5b21e28c79f17b376070799492457358000000000000000000000000000000001240585d5f4c28467bccb5193e4aad78ea3b1d8dfb4716a3310fb5215a478aac3f05a8ed478486c9e703a59b9c32bfe5", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_40", + "Gas": 184000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000181dc6fd3668d036a37d60b214d68f1a6ffe1949ec6b22f923e69fb373b9c70e8bcc5cdace068024c631c27f28d994e5000000000000000000000000000000000b02ca2b0e6e0989ea917719b89caf1aa84b959e45b6238813bf02f40db95fbb3bf43d3017c3f9c57eab1be617f18032000000000000000000000000000000000b6069a2c375471d34029d2a776e56b86b0210c35d3eb530bf116205b70995e4929fc90349a7db057168dbe6c39857970000000000000000000000000000000014251a0a154731f73513b99d830f70b6fc4bcf05d11f52d2cbe9795ee8ffc5a5f717ad25770b8ecad6d0e9f8066e0cba000000000000000000000000000000001172684b21c4dfe02a55e13b57bbf105c954daec849d4c6df5276b02872c004fdf09d24f4eef366bc82eb72fe91bf70d000000000000000000000000000000001151aeb9441c5a8fabe80867b5c791420645241eae1400bbcc064d75bedd39de2ef585138fe9f65725efa1b1e5888d0300000000000000000000000000000000181dc6fd3668d036a37d60b214d68f1a6ffe1949ec6b22f923e69fb373b9c70e8bcc5cdace068024c631c27f28d994e5000000000000000000000000000000000efe47bf2b11dd10608a309c8aaefdbcbc2bb5e6adceef375371cface8f79668e2b7c2ce9990063a3b53e419e80e2a79000000000000000000000000000000000b6069a2c375471d34029d2a776e56b86b0210c35d3eb530bf116205b70995e4929fc90349a7db057168dbe6c39857970000000000000000000000000000000014251a0a154731f73513b99d830f70b6fc4bcf05d11f52d2cbe9795ee8ffc5a5f717ad25770b8ecad6d0e9f8066e0cba000000000000000000000000000000001172684b21c4dfe02a55e13b57bbf105c954daec849d4c6df5276b02872c004fdf09d24f4eef366bc82eb72fe91bf70d000000000000000000000000000000001151aeb9441c5a8fabe80867b5c791420645241eae1400bbcc064d75bedd39de2ef585138fe9f65725efa1b1e5888d0300000000000000000000000000000000181dc6fd3668d036a37d60b214d68f1a6ffe1949ec6b22f923e69fb373b9c70e8bcc5cdace068024c631c27f28d994e5000000000000000000000000000000000b02ca2b0e6e0989ea917719b89caf1aa84b959e45b6238813bf02f40db95fbb3bf43d3017c3f9c57eab1be617f18032000000000000000000000000000000000b6069a2c375471d34029d2a776e56b86b0210c35d3eb530bf116205b70995e4929fc90349a7db057168dbe6c39857970000000000000000000000000000000014251a0a154731f73513b99d830f70b6fc4bcf05d11f52d2cbe9795ee8ffc5a5f717ad25770b8ecad6d0e9f8066e0cba00000000000000000000000000000000088ea99f17bb06ba20c5c67aeb8fbbd19b2270986ee7c6517209679e6f84f5d43fa22daf6264c993f1d048d016e3b39e0000000000000000000000000000000008af6330f5638c0a9f339f4e8d841b955e322766457112039b2a852b37d3bc45efb67aeb216a09a8940f5e4e1a771da8", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_41", + "Gas": 184000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001329a75975b714c861064d743092866d61c4467e0c0316b78142e6db7e74538a376a09487cb09ee89583d547c187229000000000000000000000000000000000096713619bf088bd9e12752cab83e9cdd58296ada8d338c86a749f00ba014087a3836ce10adaaf2e815f431235bff4f000000000000000000000000000000000161b70d0f384e589d8117938602f3d696f941c24e3c1ca5a9be090b670456c9df315d6fde52daed55c9d8335928a7a3c00000000000000000000000000000000186bb9e6f5ba70dd2c66a641d3b711844977939904c59946d4e9f49ac2d8c00890a43ccb20d4a62bfff63ce4a0a44e8e000000000000000000000000000000001995b9d697bded656236430e78726f0f6ef963db9a5a24d455c12db38aeab0f8629e5dc2d04920156f2a057d69613096000000000000000000000000000000001119b13caf82c18fadcb65c9c166914bfd822534bb9def3feae6c9e572c97c84e97fab3b345cf59358436a404075493d000000000000000000000000000000001329a75975b714c861064d743092866d61c4467e0c0316b78142e6db7e74538a376a09487cb09ee89583d547c1872290000000000000000000000000000000001099fe889d8f5ddcad09328997c7c3098ef4b4d74ab1d9f6fcbc33a03cafb59c7b28931da67950d1389fbcedca3fb5bb00000000000000000000000000000000161b70d0f384e589d8117938602f3d696f941c24e3c1ca5a9be090b670456c9df315d6fde52daed55c9d8335928a7a3c00000000000000000000000000000000186bb9e6f5ba70dd2c66a641d3b711844977939904c59946d4e9f49ac2d8c00890a43ccb20d4a62bfff63ce4a0a44e8e000000000000000000000000000000001995b9d697bded656236430e78726f0f6ef963db9a5a24d455c12db38aeab0f8629e5dc2d04920156f2a057d69613096000000000000000000000000000000001119b13caf82c18fadcb65c9c166914bfd822534bb9def3feae6c9e572c97c84e97fab3b345cf59358436a404075493d000000000000000000000000000000001329a75975b714c861064d743092866d61c4467e0c0316b78142e6db7e74538a376a09487cb09ee89583d547c187229000000000000000000000000000000000096713619bf088bd9e12752cab83e9cdd58296ada8d338c86a749f00ba014087a3836ce10adaaf2e815f431235bff4f000000000000000000000000000000000161b70d0f384e589d8117938602f3d696f941c24e3c1ca5a9be090b670456c9df315d6fde52daed55c9d8335928a7a3c00000000000000000000000000000000186bb9e6f5ba70dd2c66a641d3b711844977939904c59946d4e9f49ac2d8c00890a43ccb20d4a62bfff63ce4a0a44e8e00000000000000000000000000000000006b5813a1c1f934e8e564a7cad93dc7f57de7a9592aedeb116fa4ed6bc6452bbc0da23be10adfea4ad4fa82969e7a150000000000000000000000000000000008e760ad89fd250a9d5041ec81e51b8b66f5265037e7237f7c4a08bb83e7799f352c54c37cf70a6c61bb95bfbf8a616e", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_42", + "Gas": 184000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001195502bc48c44b37e3f8f4e6f40295c1156f58dbc00b04b3018d237b574a20512599d18af01c50192db37cb8eb2c8a90000000000000000000000000000000002b03f02b45aa15b39e030c4b88c89a285dff5c4bbfe16f643f3f87d91db774f8ab7019285fda0b236ff7eec16496e5e0000000000000000000000000000000017d1ffcad218efd8b09c68eba34dbbc30b0a62ae250368ee37e5f6fd40479b8580563416afdbd92c0622c341331e20a30000000000000000000000000000000009f0eb3805ed78aa3952a0a437966258ed38cb72912756253a7a2f9113f0dd9a4e187062b0423e0587d93e904d88f50d0000000000000000000000000000000001bca57e985906695e14882f2aaeef75de5009e8717eb59962e978aa11e9d0a4d9a9e203df774cb1e993b1c6ecd6048c000000000000000000000000000000000695b11cc32740c91546eb7d554ca8b1f3afc942ad977345031be8b94b78b57a87ab049ca2d3676e039efccbf24d0c47000000000000000000000000000000001195502bc48c44b37e3f8f4e6f40295c1156f58dbc00b04b3018d237b574a20512599d18af01c50192db37cb8eb2c8a9000000000000000000000000000000001750d2e78525453f113b76f18abf2334de9755c03786fbc9233cda2364d57ed493f4fe6c2b565f4d82ff8113e9b63c4d0000000000000000000000000000000017d1ffcad218efd8b09c68eba34dbbc30b0a62ae250368ee37e5f6fd40479b8580563416afdbd92c0622c341331e20a30000000000000000000000000000000009f0eb3805ed78aa3952a0a437966258ed38cb72912756253a7a2f9113f0dd9a4e187062b0423e0587d93e904d88f50d0000000000000000000000000000000001bca57e985906695e14882f2aaeef75de5009e8717eb59962e978aa11e9d0a4d9a9e203df774cb1e993b1c6ecd6048c000000000000000000000000000000000695b11cc32740c91546eb7d554ca8b1f3afc942ad977345031be8b94b78b57a87ab049ca2d3676e039efccbf24d0c47000000000000000000000000000000001195502bc48c44b37e3f8f4e6f40295c1156f58dbc00b04b3018d237b574a20512599d18af01c50192db37cb8eb2c8a90000000000000000000000000000000002b03f02b45aa15b39e030c4b88c89a285dff5c4bbfe16f643f3f87d91db774f8ab7019285fda0b236ff7eec16496e5e0000000000000000000000000000000017d1ffcad218efd8b09c68eba34dbbc30b0a62ae250368ee37e5f6fd40479b8580563416afdbd92c0622c341331e20a30000000000000000000000000000000009f0eb3805ed78aa3952a0a437966258ed38cb72912756253a7a2f9113f0dd9a4e187062b0423e0587d93e904d88f50d0000000000000000000000000000000018446c6ba126e030ed071f87189cbd618627419c82065d26044759f6e4c7257f45021dfad1dcb34dd06b4e391329a61f00000000000000000000000000000000136b60cd7658a5d135d4bc38edff042570c7824245ed9f7a6414e9e7ab3840a99700fb620e809891b66003340db29e64", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_43", + "Gas": 184000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000d7e1651f3e172dcca8774a7a0d58ab47178d3e759933289e1d3eb0da414160ff9e890a608bf8ccdf2820c4aea6e11cb00000000000000000000000000000000185e8671e2ddb8e36380e39fe4eafefbac9769935603c28caac7d3f7f0f3e8ad14e925024b55aeb67d68b219875c9d79000000000000000000000000000000000546a0cb9d9f1ef9ec4a1e576fa0047557a56c0217baed8691c4085b88c84a0e12d44043aab8671393d02c4a764407ee00000000000000000000000000000000131884c1386980a181353548da9602db70ab495a661e76235c4b0a32b54acb0dfd8846e17bebd731e8041c4aebb8776600000000000000000000000000000000135b3db43511dbd8b3bd5a91880d6da1a2bd1383000e0d6f0a521bf88a5836a3b5f7cb9c0c02aa861a1c2d339f3c11f20000000000000000000000000000000000e1337271bd3302a1cab762161ccfbf2a18b7800e6efe58cf897d4adbfe4cb3bf14f4b59307fffc548179bda70c18bf000000000000000000000000000000000d7e1651f3e172dcca8774a7a0d58ab47178d3e759933289e1d3eb0da414160ff9e890a608bf8ccdf2820c4aea6e11cb0000000000000000000000000000000001a28b7856a22db6e79ac4165e60addbb7dfe1f19d815032bc68fea905bd0d7709c2dafc65fe51493c964de678a30d32000000000000000000000000000000000546a0cb9d9f1ef9ec4a1e576fa0047557a56c0217baed8691c4085b88c84a0e12d44043aab8671393d02c4a764407ee00000000000000000000000000000000131884c1386980a181353548da9602db70ab495a661e76235c4b0a32b54acb0dfd8846e17bebd731e8041c4aebb8776600000000000000000000000000000000135b3db43511dbd8b3bd5a91880d6da1a2bd1383000e0d6f0a521bf88a5836a3b5f7cb9c0c02aa861a1c2d339f3c11f20000000000000000000000000000000000e1337271bd3302a1cab762161ccfbf2a18b7800e6efe58cf897d4adbfe4cb3bf14f4b59307fffc548179bda70c18bf000000000000000000000000000000000d7e1651f3e172dcca8774a7a0d58ab47178d3e759933289e1d3eb0da414160ff9e890a608bf8ccdf2820c4aea6e11cb00000000000000000000000000000000185e8671e2ddb8e36380e39fe4eafefbac9769935603c28caac7d3f7f0f3e8ad14e925024b55aeb67d68b219875c9d79000000000000000000000000000000000546a0cb9d9f1ef9ec4a1e576fa0047557a56c0217baed8691c4085b88c84a0e12d44043aab8671393d02c4a764407ee00000000000000000000000000000000131884c1386980a181353548da9602db70ab495a661e76235c4b0a32b54acb0dfd8846e17bebd731e8041c4aebb877660000000000000000000000000000000006a5d436046e0ac1975e4d24bb3e3f35c1ba3801f37705505cdeb6a86c58bf8068b43462a55155799fe2d2cc60c398b900000000000000000000000000000000191fde77c7c2b397a950f0542d2edd183a5e9404e516146697a755561ab2a9705f970b491e4c0003657d864258f391ec", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_44", + "Gas": 184000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001454d4a82163a155446467164904cefd7e1e3c67ae99bf65c581a75c72716fb011e2fd030eaf3d36977fbb0ff5156e2700000000000000000000000000000000123f973ab6bd3c2e5b0512a0c77ea0ac3003fd891e1262137f9444cd07b927b564e618205ba09220320ea1aa4564e82000000000000000000000000000000000113dc3354146ca79eb103b31b61fe8bc6f33dcb9c59a7c39d989bd9411c1afce4239034f84e6b00a084be061c73e69c0000000000000000000000000000000000ae33bf68f24978c7ea9fc58d8d76047ec45d01fdbc880e6a5ba02a22a49a3a8253afe0678ecfa6013f4849da3401df70000000000000000000000000000000012c5b00376a1dd31378ec44f2dc8e321e17185d903cfc5c15345a01c33f2f151b21b938d31816550594a7a1e7216c5b00000000000000000000000000000000013d79f825c44775c68e90932d0496a5cae53f04a1edb19f8abeb5948a3dd325dfec4a8b6f58c7fbca9cf3c09b909d8b2000000000000000000000000000000001454d4a82163a155446467164904cefd7e1e3c67ae99bf65c581a75c72716fb011e2fd030eaf3d36977fbb0ff5156e270000000000000000000000000000000007c17aaf82c2aa6bf01695157bcd0c2b34734dfbd572b0abe79c8dd3eef7ce6eb9c5e7de55b36ddf87f05e55ba9ac28b00000000000000000000000000000000113dc3354146ca79eb103b31b61fe8bc6f33dcb9c59a7c39d989bd9411c1afce4239034f84e6b00a084be061c73e69c0000000000000000000000000000000000ae33bf68f24978c7ea9fc58d8d76047ec45d01fdbc880e6a5ba02a22a49a3a8253afe0678ecfa6013f4849da3401df70000000000000000000000000000000012c5b00376a1dd31378ec44f2dc8e321e17185d903cfc5c15345a01c33f2f151b21b938d31816550594a7a1e7216c5b00000000000000000000000000000000013d79f825c44775c68e90932d0496a5cae53f04a1edb19f8abeb5948a3dd325dfec4a8b6f58c7fbca9cf3c09b909d8b2000000000000000000000000000000001454d4a82163a155446467164904cefd7e1e3c67ae99bf65c581a75c72716fb011e2fd030eaf3d36977fbb0ff5156e2700000000000000000000000000000000123f973ab6bd3c2e5b0512a0c77ea0ac3003fd891e1262137f9444cd07b927b564e618205ba09220320ea1aa4564e82000000000000000000000000000000000113dc3354146ca79eb103b31b61fe8bc6f33dcb9c59a7c39d989bd9411c1afce4239034f84e6b00a084be061c73e69c0000000000000000000000000000000000ae33bf68f24978c7ea9fc58d8d76047ec45d01fdbc880e6a5ba02a22a49a3a8253afe0678ecfa6013f4849da3401df700000000000000000000000000000000073b61e6c2de0969138ce3671582c9b58305c5abefb54cfe13eb3284c2be04d26c906c717fd29aaf60b485e18de8e4fb0000000000000000000000000000000006297267dd3b6f3de2329e837302427ab6235b3ad4a9f8c6bb45795852d3c3c61fe75747bbc78043102fc3f646f5d1f9", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_45", + "Gas": 184000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000178e6828261ee6855b38234ed15c27551bb1648ac6ec9a9e70744643cd1f134b2309dd0c34b1e59ddfe3f831ab814c90000000000000000000000000000000002ec930fb58c898ede931384c5a5f9edd2f5c70b8c3794edb83a12f23be5400949f95e81c96c666c1a72dffb50b811580000000000000000000000000000000006ccaf6c08f831be9c99a97714f5257a985cc2a29b5f5c81bc8d794dd0d8d1a41eb5413bed654c0140dbacfd0dda9e1800000000000000000000000000000000144e9cf91580800dfaa47c98ff7d002a576be76d9e44ae1f8335a3f733e1162af0636372e143174d872c7ea89f4c743900000000000000000000000000000000101e143b838c8a3f5f80fb1412081091b875230f1e2f9cf374d4bcd595392f6daa9552dbb6d5834e27b1b3dafe061ed300000000000000000000000000000000072463400b3e875395a1cdd31d73d51396e34347cd86d9f6f43f42253b3cdb24b89ed7434b1522af95ba1ee2d29ed1bb000000000000000000000000000000000178e6828261ee6855b38234ed15c27551bb1648ac6ec9a9e70744643cd1f134b2309dd0c34b1e59ddfe3f831ab814c90000000000000000000000000000000017147eda83f35d0b6c8894317da5b2e991818479674d7dd1aef6bfaebacbb61ad4b2a17ce7e799939f8c2004af4799530000000000000000000000000000000006ccaf6c08f831be9c99a97714f5257a985cc2a29b5f5c81bc8d794dd0d8d1a41eb5413bed654c0140dbacfd0dda9e1800000000000000000000000000000000144e9cf91580800dfaa47c98ff7d002a576be76d9e44ae1f8335a3f733e1162af0636372e143174d872c7ea89f4c743900000000000000000000000000000000101e143b838c8a3f5f80fb1412081091b875230f1e2f9cf374d4bcd595392f6daa9552dbb6d5834e27b1b3dafe061ed300000000000000000000000000000000072463400b3e875395a1cdd31d73d51396e34347cd86d9f6f43f42253b3cdb24b89ed7434b1522af95ba1ee2d29ed1bb000000000000000000000000000000000178e6828261ee6855b38234ed15c27551bb1648ac6ec9a9e70744643cd1f134b2309dd0c34b1e59ddfe3f831ab814c90000000000000000000000000000000002ec930fb58c898ede931384c5a5f9edd2f5c70b8c3794edb83a12f23be5400949f95e81c96c666c1a72dffb50b811580000000000000000000000000000000006ccaf6c08f831be9c99a97714f5257a985cc2a29b5f5c81bc8d794dd0d8d1a41eb5413bed654c0140dbacfd0dda9e1800000000000000000000000000000000144e9cf91580800dfaa47c98ff7d002a576be76d9e44ae1f8335a3f733e1162af0636372e143174d872c7ea89f4c74390000000000000000000000000000000009e2fdaeb5f35c5aeb9aaca231439c45ac022875d55575cbf25c15cb6177c6b67416ad22fa7e7cb1924d4c2501f98bd80000000000000000000000000000000012dcaeaa2e415f46b579d9e325d7d7c3cd94083d25fe38c872f1907bbb741aff660d28bb663edd502444e11d2d60d8f0", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_46", + "Gas": 184000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000001ea88d0f329135df49893406b4f9aee0abfd74b62e7eb5576d3ddb329fc4b1649b7c228ec39c6577a069c0811c952f100000000000000000000000000000000033f481fc62ab0a249561d180da39ff641a540c9c109cde41946a0e85d18c9d60b41dbcdec370c5c9f22a9ee9de00ccd000000000000000000000000000000001354146aa546754e10ada6e0fe98f04f5f3a3f8a8350d0295e02b8e9c80735b04c3061412e08ddb13c80ac36e5638e540000000000000000000000000000000012ab26513534b4dc1b71eec46b73199c4157ba9369e66fbe4d2d8f62237fc7c6fad31854ebd878f989b8c5cf35c7cfe0000000000000000000000000000000000eb731bc99cdadf7f2280385c7e17d72d34bcbdbdc725d5bc94e841036115e8cb95df08084221696f9be479821fbdd7400000000000000000000000000000000143ba7d3f66445249d9a81a6949f24ff40e7c4d270fa044a8b80200a4369b07806c5497a0ef9e9dbb87b9e63694623ee0000000000000000000000000000000001ea88d0f329135df49893406b4f9aee0abfd74b62e7eb5576d3ddb329fc4b1649b7c228ec39c6577a069c0811c952f10000000000000000000000000000000016c1c9ca735535f801c58a9e35a80ce122d20abb327b44db4dea31b899982c4e136a2430c51cf3a31adc5611621f9dde000000000000000000000000000000001354146aa546754e10ada6e0fe98f04f5f3a3f8a8350d0295e02b8e9c80735b04c3061412e08ddb13c80ac36e5638e540000000000000000000000000000000012ab26513534b4dc1b71eec46b73199c4157ba9369e66fbe4d2d8f62237fc7c6fad31854ebd878f989b8c5cf35c7cfe0000000000000000000000000000000000eb731bc99cdadf7f2280385c7e17d72d34bcbdbdc725d5bc94e841036115e8cb95df08084221696f9be479821fbdd7400000000000000000000000000000000143ba7d3f66445249d9a81a6949f24ff40e7c4d270fa044a8b80200a4369b07806c5497a0ef9e9dbb87b9e63694623ee0000000000000000000000000000000001ea88d0f329135df49893406b4f9aee0abfd74b62e7eb5576d3ddb329fc4b1649b7c228ec39c6577a069c0811c952f100000000000000000000000000000000033f481fc62ab0a249561d180da39ff641a540c9c109cde41946a0e85d18c9d60b41dbcdec370c5c9f22a9ee9de00ccd000000000000000000000000000000001354146aa546754e10ada6e0fe98f04f5f3a3f8a8350d0295e02b8e9c80735b04c3061412e08ddb13c80ac36e5638e540000000000000000000000000000000012ab26513534b4dc1b71eec46b73199c4157ba9369e66fbe4d2d8f62237fc7c6fad31854ebd878f989b8c5cf35c7cfe0000000000000000000000000000000000b49e02d9fb238a258f3a4307b6a2f64912b7fa91712b5639de24e90c09f9797654e0f7e2d31e968c040b867de03cd370000000000000000000000000000000005c56a16431ba175ad81260faeac87d8238f86b2828b0e74dbb0b296b34745ac17e6b684a25a16240183619c96b986bd", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_47", + "Gas": 184000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000008d8c4a16fb9d8800cce987c0eadbb6b3b005c213d44ecb5adeed713bae79d606041406df26169c35df63cf972c94be10000000000000000000000000000000011bc8afe71676e6730702a46ef817060249cd06cd82e6981085012ff6d013aa4470ba3a2c71e13ef653e1e223d1ccfe90000000000000000000000000000000013a3de1d25380c44ca06321151e89ca22210926c1cd4e3c1a9c3aa6c709ab5fdd00f8df19243ce058bc753ccf03424ed000000000000000000000000000000001657dbebf712cbda6f15d1d387c87b3fb9b386d5d754135049728a2a856ba2944c741024131a93c78655fdb7bfe3c80300000000000000000000000000000000068edef3169c58920509ed4e7069229bd8038a45d2ce5773451cc18b396d2838c9539ecb52298a27eebd714afacb907c0000000000000000000000000000000004c5346765a62f2d2e700aadccf747acb3322c250435ce2cf358c08f1e286427cabace052327c4b30135c8482c5c0eb90000000000000000000000000000000008d8c4a16fb9d8800cce987c0eadbb6b3b005c213d44ecb5adeed713bae79d606041406df26169c35df63cf972c94be100000000000000000000000000000000084486ebc81878331aab7d6f53ca3c773fda7b181b56a93e5ee0bfa189afbb7fd7a05c5bea35ec1054c0e1ddc2e2dac20000000000000000000000000000000013a3de1d25380c44ca06321151e89ca22210926c1cd4e3c1a9c3aa6c709ab5fdd00f8df19243ce058bc753ccf03424ed000000000000000000000000000000001657dbebf712cbda6f15d1d387c87b3fb9b386d5d754135049728a2a856ba2944c741024131a93c78655fdb7bfe3c80300000000000000000000000000000000068edef3169c58920509ed4e7069229bd8038a45d2ce5773451cc18b396d2838c9539ecb52298a27eebd714afacb907c0000000000000000000000000000000004c5346765a62f2d2e700aadccf747acb3322c250435ce2cf358c08f1e286427cabace052327c4b30135c8482c5c0eb90000000000000000000000000000000008d8c4a16fb9d8800cce987c0eadbb6b3b005c213d44ecb5adeed713bae79d606041406df26169c35df63cf972c94be10000000000000000000000000000000011bc8afe71676e6730702a46ef817060249cd06cd82e6981085012ff6d013aa4470ba3a2c71e13ef653e1e223d1ccfe90000000000000000000000000000000013a3de1d25380c44ca06321151e89ca22210926c1cd4e3c1a9c3aa6c709ab5fdd00f8df19243ce058bc753ccf03424ed000000000000000000000000000000001657dbebf712cbda6f15d1d387c87b3fb9b386d5d754135049728a2a856ba2944c741024131a93c78655fdb7bfe3c80300000000000000000000000000000000137232f722e38e084611ba67d2e28a3b8c73c13f20b6bb4c22141115bd43cdeb555861335f2a75d7cb418eb505341a2f00000000000000000000000000000000153bdd82d3d9b76d1cab9d087654652ab1451f5fef4f449273d81211d88891fc53f131f98e2c3b4cb8c937b7d3a39bf20000000000000000000000000000000008d8c4a16fb9d8800cce987c0eadbb6b3b005c213d44ecb5adeed713bae79d606041406df26169c35df63cf972c94be100000000000000000000000000000000084486ebc81878331aab7d6f53ca3c773fda7b181b56a93e5ee0bfa189afbb7fd7a05c5bea35ec1054c0e1ddc2e2dac20000000000000000000000000000000013a3de1d25380c44ca06321151e89ca22210926c1cd4e3c1a9c3aa6c709ab5fdd00f8df19243ce058bc753ccf03424ed000000000000000000000000000000001657dbebf712cbda6f15d1d387c87b3fb9b386d5d754135049728a2a856ba2944c741024131a93c78655fdb7bfe3c80300000000000000000000000000000000137232f722e38e084611ba67d2e28a3b8c73c13f20b6bb4c22141115bd43cdeb555861335f2a75d7cb418eb505341a2f00000000000000000000000000000000153bdd82d3d9b76d1cab9d087654652ab1451f5fef4f449273d81211d88891fc53f131f98e2c3b4cb8c937b7d3a39bf2", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_48", + "Gas": 207000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000120ddc1cd9e3a7b298673b1036d162c31dbb35d6e83b39b2564b3be16e446a836c96907e8a6af1e677e906bf5ed73159000000000000000000000000000000000fa57c1436615442bbb049d08ac46e501c07736cd239298752bb94d1904bd38cc687759987cadd99bd3c4d45ba07193a000000000000000000000000000000000dd75b4aebed3bd6bd020c3af671aaed67bf1582aceb6c8b5a476968c0c500753e4d0f3276341b79d87af38850893d92000000000000000000000000000000000e9b3be06afd6157eb6df52be4f2db2bcccd650f720661f8d6fcff3f71d69e152e17100ce60b7b90a7f798c4cdd02209000000000000000000000000000000000f6fdc4e5dceb555c9eb4c912fedbfb3cb1b842345f73ded02cfaf8d397c4378809721094aa4a4113a368e0787effeb500000000000000000000000000000000143ac06258c579c11c05569669a2a10babc63ecc86f85c91791d8ea48af700a2067c5f13d2700b8d5cf59bcca8fbf7c600000000000000000000000000000000120ddc1cd9e3a7b298673b1036d162c31dbb35d6e83b39b2564b3be16e446a836c96907e8a6af1e677e906bf5ed73159000000000000000000000000000000000a5b95d6031e92578f6b5de5b8873e87486fd818214be93814753dcf6665229758248a6529892265fcc2b2ba45f89171000000000000000000000000000000000dd75b4aebed3bd6bd020c3af671aaed67bf1582aceb6c8b5a476968c0c500753e4d0f3276341b79d87af38850893d92000000000000000000000000000000000e9b3be06afd6157eb6df52be4f2db2bcccd650f720661f8d6fcff3f71d69e152e17100ce60b7b90a7f798c4cdd02209000000000000000000000000000000000f6fdc4e5dceb555c9eb4c912fedbfb3cb1b842345f73ded02cfaf8d397c4378809721094aa4a4113a368e0787effeb500000000000000000000000000000000143ac06258c579c11c05569669a2a10babc63ecc86f85c91791d8ea48af700a2067c5f13d2700b8d5cf59bcca8fbf7c600000000000000000000000000000000120ddc1cd9e3a7b298673b1036d162c31dbb35d6e83b39b2564b3be16e446a836c96907e8a6af1e677e906bf5ed73159000000000000000000000000000000000fa57c1436615442bbb049d08ac46e501c07736cd239298752bb94d1904bd38cc687759987cadd99bd3c4d45ba07193a000000000000000000000000000000000dd75b4aebed3bd6bd020c3af671aaed67bf1582aceb6c8b5a476968c0c500753e4d0f3276341b79d87af38850893d92000000000000000000000000000000000e9b3be06afd6157eb6df52be4f2db2bcccd650f720661f8d6fcff3f71d69e152e17100ce60b7b90a7f798c4cdd02209000000000000000000000000000000000a91359bdbb1314481305b25135ded23995bc761ad8dd4d264612313bd34b2ab9e14def566af5bee7fc871f8780fabf60000000000000000000000000000000005c65187e0ba6cd92f16511fd9a90bcbb8b10cb86c8cb62dee1343fc6bb9f582182fa0eadee3f4725d0964335703b2e500000000000000000000000000000000120ddc1cd9e3a7b298673b1036d162c31dbb35d6e83b39b2564b3be16e446a836c96907e8a6af1e677e906bf5ed73159000000000000000000000000000000000a5b95d6031e92578f6b5de5b8873e87486fd818214be93814753dcf6665229758248a6529892265fcc2b2ba45f89171000000000000000000000000000000000dd75b4aebed3bd6bd020c3af671aaed67bf1582aceb6c8b5a476968c0c500753e4d0f3276341b79d87af38850893d92000000000000000000000000000000000e9b3be06afd6157eb6df52be4f2db2bcccd650f720661f8d6fcff3f71d69e152e17100ce60b7b90a7f798c4cdd02209000000000000000000000000000000000a91359bdbb1314481305b25135ded23995bc761ad8dd4d264612313bd34b2ab9e14def566af5bee7fc871f8780fabf60000000000000000000000000000000005c65187e0ba6cd92f16511fd9a90bcbb8b10cb86c8cb62dee1343fc6bb9f582182fa0eadee3f4725d0964335703b2e5", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_49", + "Gas": 207000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000e3ccaa4fa358a5a885094cbb0b8baa106fbcca66edbe31511ac2f6f3d14edbd8701979d6e4690853555c625091392b600000000000000000000000000000000175bdd42583cbbf733242510c152380525aff7649273acef1ec20569804ffba7f029ca06878dbafde84540cece173822000000000000000000000000000000000057bbf62cdf3c56e146f60f8ce6b6bdebe7aae7d9410c6902c7a505b589ae26ce3ab67d9b8da047185f9d37ab27595e000000000000000000000000000000000843e55c07bba3573592d3f649938654a5c51f9ced0f92bcb3e4f431141fe91a1de3695324b21e31dd2ae0a328055cc500000000000000000000000000000000192f3e8ae2588f9223de77f5e872115f1edec96d6a0f403a47879410c2562e79853c9a706e423b83fbf3154234edb6f80000000000000000000000000000000015084258d58fd1a07bbdb2e90df5a56ae15a787037eff4fe55f660e45f04820c6fc8982303b5e82074cf0cdcbde61307000000000000000000000000000000000e3ccaa4fa358a5a885094cbb0b8baa106fbcca66edbe31511ac2f6f3d14edbd8701979d6e4690853555c625091392b60000000000000000000000000000000002a534a7e1432aa317f782a581f974d23ec75420611165d0486ecd377660fa7c2e8235f829c64501d1b9bf3131e87289000000000000000000000000000000000057bbf62cdf3c56e146f60f8ce6b6bdebe7aae7d9410c6902c7a505b589ae26ce3ab67d9b8da047185f9d37ab27595e000000000000000000000000000000000843e55c07bba3573592d3f649938654a5c51f9ced0f92bcb3e4f431141fe91a1de3695324b21e31dd2ae0a328055cc500000000000000000000000000000000192f3e8ae2588f9223de77f5e872115f1edec96d6a0f403a47879410c2562e79853c9a706e423b83fbf3154234edb6f80000000000000000000000000000000015084258d58fd1a07bbdb2e90df5a56ae15a787037eff4fe55f660e45f04820c6fc8982303b5e82074cf0cdcbde61307000000000000000000000000000000000e3ccaa4fa358a5a885094cbb0b8baa106fbcca66edbe31511ac2f6f3d14edbd8701979d6e4690853555c625091392b600000000000000000000000000000000175bdd42583cbbf733242510c152380525aff7649273acef1ec20569804ffba7f029ca06878dbafde84540cece173822000000000000000000000000000000000057bbf62cdf3c56e146f60f8ce6b6bdebe7aae7d9410c6902c7a505b589ae26ce3ab67d9b8da047185f9d37ab27595e000000000000000000000000000000000843e55c07bba3573592d3f649938654a5c51f9ced0f92bcb3e4f431141fe91a1de3695324b21e31dd2ae0a328055cc50000000000000000000000000000000000d1d35f57275708273d2fc05ad99b78459882178975d2851fa93e90345ac7aa996f658e4311c47bbe0beabdcb11f3b30000000000000000000000000000000004f8cf9163f014f9cf5df4cd3556076c831cd314bb951dc1113a71bc97ac7417aee367dbad9e17df452ff323421997a4000000000000000000000000000000000e3ccaa4fa358a5a885094cbb0b8baa106fbcca66edbe31511ac2f6f3d14edbd8701979d6e4690853555c625091392b60000000000000000000000000000000002a534a7e1432aa317f782a581f974d23ec75420611165d0486ecd377660fa7c2e8235f829c64501d1b9bf3131e87289000000000000000000000000000000000057bbf62cdf3c56e146f60f8ce6b6bdebe7aae7d9410c6902c7a505b589ae26ce3ab67d9b8da047185f9d37ab27595e000000000000000000000000000000000843e55c07bba3573592d3f649938654a5c51f9ced0f92bcb3e4f431141fe91a1de3695324b21e31dd2ae0a328055cc50000000000000000000000000000000000d1d35f57275708273d2fc05ad99b78459882178975d2851fa93e90345ac7aa996f658e4311c47bbe0beabdcb11f3b30000000000000000000000000000000004f8cf9163f014f9cf5df4cd3556076c831cd314bb951dc1113a71bc97ac7417aee367dbad9e17df452ff323421997a4", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_50", + "Gas": 207000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000001bc359baeac07a93aca770174ea6444aac9f04affdaa77c8a47b30c60ee2b527c061a4344139264e541d4134f42bfd0000000000000000000000000000000000cbf7a31e6fef4f4664bca4bc87ec7c0b12ced7224300aa4e1a6a7cbdedfcef07482b5d20fa607e3f03fdd6dd03fd10c000000000000000000000000000000000bcec23e092111b38a2f7dc957cf455312ffd33528d084204314492440d29248cb5719346a4f7a490d17ba149e30de5200000000000000000000000000000000194605e5680cc80bd2685949efa3cce90d345b9151ba72f3adf226dd299c23464c4344a42b8834131a51a4156038585f000000000000000000000000000000000477b55bd7fff14e0d1807bfc21edb9481be01c12abb1460d78b1aafe42953730167e32e694c2ddfb0d442e8cea57d460000000000000000000000000000000004b884c6ea36f189dbc3c0e9cf88f08baf5d868579998f63b752e61fcce3cf2c901bb9b51959d3597c4ef53cff41fc260000000000000000000000000000000001bc359baeac07a93aca770174ea6444aac9f04affdaa77c8a47b30c60ee2b527c061a4344139264e541d4134f42bfd0000000000000000000000000000000000d4197b85280f1a5e4cfdd6a7acce516b34a5e12cf55081a858a2ad517d12733aa294a2ca1adf81bc9bf22922fbfd99f000000000000000000000000000000000bcec23e092111b38a2f7dc957cf455312ffd33528d084204314492440d29248cb5719346a4f7a490d17ba149e30de5200000000000000000000000000000000194605e5680cc80bd2685949efa3cce90d345b9151ba72f3adf226dd299c23464c4344a42b8834131a51a4156038585f000000000000000000000000000000000477b55bd7fff14e0d1807bfc21edb9481be01c12abb1460d78b1aafe42953730167e32e694c2ddfb0d442e8cea57d460000000000000000000000000000000004b884c6ea36f189dbc3c0e9cf88f08baf5d868579998f63b752e61fcce3cf2c901bb9b51959d3597c4ef53cff41fc260000000000000000000000000000000001bc359baeac07a93aca770174ea6444aac9f04affdaa77c8a47b30c60ee2b527c061a4344139264e541d4134f42bfd0000000000000000000000000000000000cbf7a31e6fef4f4664bca4bc87ec7c0b12ced7224300aa4e1a6a7cbdedfcef07482b5d20fa607e3f03fdd6dd03fd10c000000000000000000000000000000000bcec23e092111b38a2f7dc957cf455312ffd33528d084204314492440d29248cb5719346a4f7a490d17ba149e30de5200000000000000000000000000000000194605e5680cc80bd2685949efa3cce90d345b9151ba72f3adf226dd299c23464c4344a42b8834131a51a4156038585f0000000000000000000000000000000015895c8e617ff54c3e039ff6812cd142e2b949c3c8c9fe5e8fa5b7f11287a2b11d441cd04807d220092abd17315a2d650000000000000000000000000000000015488d234f48f5106f57e6cc73c2bc4bb519c4ff79eb835bafddec8129cd26f78e90464997fa2ca63db00ac300bdae850000000000000000000000000000000001bc359baeac07a93aca770174ea6444aac9f04affdaa77c8a47b30c60ee2b527c061a4344139264e541d4134f42bfd0000000000000000000000000000000000d4197b85280f1a5e4cfdd6a7acce516b34a5e12cf55081a858a2ad517d12733aa294a2ca1adf81bc9bf22922fbfd99f000000000000000000000000000000000bcec23e092111b38a2f7dc957cf455312ffd33528d084204314492440d29248cb5719346a4f7a490d17ba149e30de5200000000000000000000000000000000194605e5680cc80bd2685949efa3cce90d345b9151ba72f3adf226dd299c23464c4344a42b8834131a51a4156038585f0000000000000000000000000000000015895c8e617ff54c3e039ff6812cd142e2b949c3c8c9fe5e8fa5b7f11287a2b11d441cd04807d220092abd17315a2d650000000000000000000000000000000015488d234f48f5106f57e6cc73c2bc4bb519c4ff79eb835bafddec8129cd26f78e90464997fa2ca63db00ac300bdae85", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_51", + "Gas": 207000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000006b06ae8cb0981bf5167ad51e19d132db77548c4376697f855c8397b835743c42771096ed7b0a4b18af9494e42ee89aa0000000000000000000000000000000005aa892b0a056ff61706430f1daa3f0263dc01337eadabd8a7fd58152affd9aaa329e8c11ea98692134d9718cb4119bf00000000000000000000000000000000073341309b6fbabb18f3cf0842817905e9248db98b582dc0efb2b741a80cdbb13d0df4bce920f257996b95029891a36f0000000000000000000000000000000012d19e09dc254bd1e84afce75aa215c96dd38bcac3f6d4cf08d9e2e8d20345b7c534a0b14ffcdfd4fa3600730e2eeac800000000000000000000000000000000183b7b917aaaa94f0ea9959273ed4701102346be2a9d72531bd18fef908ecb0579a6ac10ed42a91f1147fc3a05b2e81900000000000000000000000000000000070983b1582a97d9797782e4f960a298aaa8ec509720495acdbf176d8ecb9ec9e041c2b5ed6b7dfb46fdeaae3fb341500000000000000000000000000000000006b06ae8cb0981bf5167ad51e19d132db77548c4376697f855c8397b835743c42771096ed7b0a4b18af9494e42ee89aa00000000000000000000000000000000145688bf2f7a76a4341564a725a16dd5009b4a5174d766e6bf337a8bcbb11c797b82173d92aa796da6b168e734be90ec00000000000000000000000000000000073341309b6fbabb18f3cf0842817905e9248db98b582dc0efb2b741a80cdbb13d0df4bce920f257996b95029891a36f0000000000000000000000000000000012d19e09dc254bd1e84afce75aa215c96dd38bcac3f6d4cf08d9e2e8d20345b7c534a0b14ffcdfd4fa3600730e2eeac800000000000000000000000000000000183b7b917aaaa94f0ea9959273ed4701102346be2a9d72531bd18fef908ecb0579a6ac10ed42a91f1147fc3a05b2e81900000000000000000000000000000000070983b1582a97d9797782e4f960a298aaa8ec509720495acdbf176d8ecb9ec9e041c2b5ed6b7dfb46fdeaae3fb341500000000000000000000000000000000006b06ae8cb0981bf5167ad51e19d132db77548c4376697f855c8397b835743c42771096ed7b0a4b18af9494e42ee89aa0000000000000000000000000000000005aa892b0a056ff61706430f1daa3f0263dc01337eadabd8a7fd58152affd9aaa329e8c11ea98692134d9718cb4119bf00000000000000000000000000000000073341309b6fbabb18f3cf0842817905e9248db98b582dc0efb2b741a80cdbb13d0df4bce920f257996b95029891a36f0000000000000000000000000000000012d19e09dc254bd1e84afce75aa215c96dd38bcac3f6d4cf08d9e2e8d20345b7c534a0b14ffcdfd4fa3600730e2eeac80000000000000000000000000000000001c59658bed53d4b3c721223cf5e65d6545404c6c8e7a06c4b5f42b166222b1ea50553edc41156e0a8b703c5fa4cc2920000000000000000000000000000000012f78e38e1554ec0d1a424d149eb0a3eb9ce5f345c64c9649971bb3367e5575a3e6a3d48c3e8820473011551c04c695b0000000000000000000000000000000006b06ae8cb0981bf5167ad51e19d132db77548c4376697f855c8397b835743c42771096ed7b0a4b18af9494e42ee89aa00000000000000000000000000000000145688bf2f7a76a4341564a725a16dd5009b4a5174d766e6bf337a8bcbb11c797b82173d92aa796da6b168e734be90ec00000000000000000000000000000000073341309b6fbabb18f3cf0842817905e9248db98b582dc0efb2b741a80cdbb13d0df4bce920f257996b95029891a36f0000000000000000000000000000000012d19e09dc254bd1e84afce75aa215c96dd38bcac3f6d4cf08d9e2e8d20345b7c534a0b14ffcdfd4fa3600730e2eeac80000000000000000000000000000000001c59658bed53d4b3c721223cf5e65d6545404c6c8e7a06c4b5f42b166222b1ea50553edc41156e0a8b703c5fa4cc2920000000000000000000000000000000012f78e38e1554ec0d1a424d149eb0a3eb9ce5f345c64c9649971bb3367e5575a3e6a3d48c3e8820473011551c04c695b", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_52", + "Gas": 207000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000015dc9f87213e4781863ad43f6bbccd547967d9bcf6a35d95d530cbfbf0d7307981aee5bc4ccd41254841651717393a0300000000000000000000000000000000166ce33c0482b5957c6e746c16908ba579d6402b230bc977d3ff29ac2a4a800748d9c14608f2519e2ac4d1fe4daf29b2000000000000000000000000000000000dca3b392f75583b5266a8def02bd66bf44f26b8a0a27aced57299756cffaf9e1af3538beb08b2a5939b745c8f016fee000000000000000000000000000000000d7feafc9ec0935d5b7be7cd5e2a3c57b667aba9fcc87fd5b8a585010be6958c4e7538a6d2a1f46c9641ff7b8598d74b0000000000000000000000000000000010f7bf9f6711ba723bb71a004a90109ee22be6643d56d410da18103ef44a1b3d50f10c4b94222c7f05fd3c28acbdc8ee00000000000000000000000000000000007af41f09e6d0adcb1935d6a93ea1f6156fa0157a63f265a3a7ceffe82f6635b8511e7e8f21e8f3be7a73513ff597b10000000000000000000000000000000015dc9f87213e4781863ad43f6bbccd547967d9bcf6a35d95d530cbfbf0d7307981aee5bc4ccd41254841651717393a030000000000000000000000000000000003942eae34fd3104cead334a2cbb2131eaa10b59d07949479331a8f4cc66761cd5d23eb8a861ae618f3a2e01b25080f9000000000000000000000000000000000dca3b392f75583b5266a8def02bd66bf44f26b8a0a27aced57299756cffaf9e1af3538beb08b2a5939b745c8f016fee000000000000000000000000000000000d7feafc9ec0935d5b7be7cd5e2a3c57b667aba9fcc87fd5b8a585010be6958c4e7538a6d2a1f46c9641ff7b8598d74b0000000000000000000000000000000010f7bf9f6711ba723bb71a004a90109ee22be6643d56d410da18103ef44a1b3d50f10c4b94222c7f05fd3c28acbdc8ee00000000000000000000000000000000007af41f09e6d0adcb1935d6a93ea1f6156fa0157a63f265a3a7ceffe82f6635b8511e7e8f21e8f3be7a73513ff597b10000000000000000000000000000000015dc9f87213e4781863ad43f6bbccd547967d9bcf6a35d95d530cbfbf0d7307981aee5bc4ccd41254841651717393a0300000000000000000000000000000000166ce33c0482b5957c6e746c16908ba579d6402b230bc977d3ff29ac2a4a800748d9c14608f2519e2ac4d1fe4daf29b2000000000000000000000000000000000dca3b392f75583b5266a8def02bd66bf44f26b8a0a27aced57299756cffaf9e1af3538beb08b2a5939b745c8f016fee000000000000000000000000000000000d7feafc9ec0935d5b7be7cd5e2a3c57b667aba9fcc87fd5b8a585010be6958c4e7538a6d2a1f46c9641ff7b8598d74b000000000000000000000000000000000909524ad26e2c280f648db5f8bb9c38824b6520b62e3eae8d18c2620266dae6cdbaf3b31d31d380b401c3d75341e1bd0000000000000000000000000000000019861dcb2f9915ec800271df9a0d0ae14f07ab6f79212059c38903a10e818fee665ae1802232170bfb848caec00a12fa0000000000000000000000000000000015dc9f87213e4781863ad43f6bbccd547967d9bcf6a35d95d530cbfbf0d7307981aee5bc4ccd41254841651717393a030000000000000000000000000000000003942eae34fd3104cead334a2cbb2131eaa10b59d07949479331a8f4cc66761cd5d23eb8a861ae618f3a2e01b25080f9000000000000000000000000000000000dca3b392f75583b5266a8def02bd66bf44f26b8a0a27aced57299756cffaf9e1af3538beb08b2a5939b745c8f016fee000000000000000000000000000000000d7feafc9ec0935d5b7be7cd5e2a3c57b667aba9fcc87fd5b8a585010be6958c4e7538a6d2a1f46c9641ff7b8598d74b000000000000000000000000000000000909524ad26e2c280f648db5f8bb9c38824b6520b62e3eae8d18c2620266dae6cdbaf3b31d31d380b401c3d75341e1bd0000000000000000000000000000000019861dcb2f9915ec800271df9a0d0ae14f07ab6f79212059c38903a10e818fee665ae1802232170bfb848caec00a12fa", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_53", + "Gas": 207000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000171fbc9cec717964c4324aa0d7dcf56a59b947c24a9092157f4f8c78ae43b8e4222fd1e8acdbf5989d0d17ea10f6046300000000000000000000000000000000148b5454f9b9868aefd2accc3318ddabfe618c5026e8c04f8a6bce76cd88e350bebcd779f2021fe7ceda3e8b4d438a0b0000000000000000000000000000000019e05ccf064f7cdad9748d328170b3e4bcfa6787dbfa93011d16f6d031648faa10dbfb7cc4d7c884d75480c4c864bb75000000000000000000000000000000001999d5f54ee66b3c0dedf9f46450e0ed463fa9c6cd9e0db317a35ec6ce78efae9bea9b64e3b2aaf7f70fbcace71b075a0000000000000000000000000000000003a6cc74cc398f38d535b4341faa37c968daf2009c3f05ace1f938b33bbe4002d81d18d30c2c856b21afe7a22b83c37a000000000000000000000000000000000452d1b2da6392f9df1bfd35e4575c565333703b2f83f56e0a88a0c8195968c5321296b07f6750584e23597304a5472e00000000000000000000000000000000171fbc9cec717964c4324aa0d7dcf56a59b947c24a9092157f4f8c78ae43b8e4222fd1e8acdbf5989d0d17ea10f60463000000000000000000000000000000000575bd953fc6600f5b48faea1032cf2b6615bf34cc9c526fdcc5042a292812d35fef2884bf51e017eb24c174b2bc20a00000000000000000000000000000000019e05ccf064f7cdad9748d328170b3e4bcfa6787dbfa93011d16f6d031648faa10dbfb7cc4d7c884d75480c4c864bb75000000000000000000000000000000001999d5f54ee66b3c0dedf9f46450e0ed463fa9c6cd9e0db317a35ec6ce78efae9bea9b64e3b2aaf7f70fbcace71b075a0000000000000000000000000000000003a6cc74cc398f38d535b4341faa37c968daf2009c3f05ace1f938b33bbe4002d81d18d30c2c856b21afe7a22b83c37a000000000000000000000000000000000452d1b2da6392f9df1bfd35e4575c565333703b2f83f56e0a88a0c8195968c5321296b07f6750584e23597304a5472e00000000000000000000000000000000171fbc9cec717964c4324aa0d7dcf56a59b947c24a9092157f4f8c78ae43b8e4222fd1e8acdbf5989d0d17ea10f6046300000000000000000000000000000000148b5454f9b9868aefd2accc3318ddabfe618c5026e8c04f8a6bce76cd88e350bebcd779f2021fe7ceda3e8b4d438a0b0000000000000000000000000000000019e05ccf064f7cdad9748d328170b3e4bcfa6787dbfa93011d16f6d031648faa10dbfb7cc4d7c884d75480c4c864bb75000000000000000000000000000000001999d5f54ee66b3c0dedf9f46450e0ed463fa9c6cd9e0db317a35ec6ce78efae9bea9b64e3b2aaf7f70fbcace71b075a00000000000000000000000000000000165a45756d46576175e5f38223a1750dfb9c598457460d12853799edbaf2b621468ee72ba5277a94984f185dd47be7310000000000000000000000000000000015ae40375f1c53a06bffaa805ef450811143db49c4011d515ca831d8dd578d5eec99694e31ecafa76bdba68cfb5a637d00000000000000000000000000000000171fbc9cec717964c4324aa0d7dcf56a59b947c24a9092157f4f8c78ae43b8e4222fd1e8acdbf5989d0d17ea10f60463000000000000000000000000000000000575bd953fc6600f5b48faea1032cf2b6615bf34cc9c526fdcc5042a292812d35fef2884bf51e017eb24c174b2bc20a00000000000000000000000000000000019e05ccf064f7cdad9748d328170b3e4bcfa6787dbfa93011d16f6d031648faa10dbfb7cc4d7c884d75480c4c864bb75000000000000000000000000000000001999d5f54ee66b3c0dedf9f46450e0ed463fa9c6cd9e0db317a35ec6ce78efae9bea9b64e3b2aaf7f70fbcace71b075a00000000000000000000000000000000165a45756d46576175e5f38223a1750dfb9c598457460d12853799edbaf2b621468ee72ba5277a94984f185dd47be7310000000000000000000000000000000015ae40375f1c53a06bffaa805ef450811143db49c4011d515ca831d8dd578d5eec99694e31ecafa76bdba68cfb5a637d", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_54", + "Gas": 207000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000018724e2b9a2f383329207ee85577805f35d5c5bb9f6903e3c962e57ab7eb9d1639d1e9adbde53499863b299f576325a00000000000000000000000000000000016d2c22eabd4a06a5ae67b890a25fbede7d0e96c625b80329b19be6aa861f44b6e85778130d0bdf69f2abd491ee9751a0000000000000000000000000000000004506802747afd8777904c46ad9bf0b06859a1b395ca3474a93ca4151ca158d2fd41b3a21e0ce0bc950b3241256e10d800000000000000000000000000000000115f41d2c173c3c2c7ecdff1a4aaa3c2e67c803db7a588d6143fe913961eef743d8b1f9d32e3ef1fc0475f41572faf780000000000000000000000000000000007a9cf48dbe005c5c59b2c731cf4117e5fadc9cb2cd8f486f1ed58b2909092ee8f36d88b8f719db94715641b418ab4240000000000000000000000000000000004ba40d4766b91bf8da1cc2526f62791a1b5f6fc24ffc54b522dd30cde2d29a6a6f81e8429d518710843d43705f3b4e60000000000000000000000000000000018724e2b9a2f383329207ee85577805f35d5c5bb9f6903e3c962e57ab7eb9d1639d1e9adbde53499863b299f576325a000000000000000000000000000000000032e4fbb8dab462ff0352c2d3925b0e97ca662189129928ccc1714364e4f01d8b026887d808342091ad442b6e11635910000000000000000000000000000000004506802747afd8777904c46ad9bf0b06859a1b395ca3474a93ca4151ca158d2fd41b3a21e0ce0bc950b3241256e10d800000000000000000000000000000000115f41d2c173c3c2c7ecdff1a4aaa3c2e67c803db7a588d6143fe913961eef743d8b1f9d32e3ef1fc0475f41572faf780000000000000000000000000000000007a9cf48dbe005c5c59b2c731cf4117e5fadc9cb2cd8f486f1ed58b2909092ee8f36d88b8f719db94715641b418ab4240000000000000000000000000000000004ba40d4766b91bf8da1cc2526f62791a1b5f6fc24ffc54b522dd30cde2d29a6a6f81e8429d518710843d43705f3b4e60000000000000000000000000000000018724e2b9a2f383329207ee85577805f35d5c5bb9f6903e3c962e57ab7eb9d1639d1e9adbde53499863b299f576325a00000000000000000000000000000000016d2c22eabd4a06a5ae67b890a25fbede7d0e96c625b80329b19be6aa861f44b6e85778130d0bdf69f2abd491ee9751a0000000000000000000000000000000004506802747afd8777904c46ad9bf0b06859a1b395ca3474a93ca4151ca158d2fd41b3a21e0ce0bc950b3241256e10d800000000000000000000000000000000115f41d2c173c3c2c7ecdff1a4aaa3c2e67c803db7a588d6143fe913961eef743d8b1f9d32e3ef1fc0475f41572faf7800000000000000000000000000000000125742a15d9fe0d485807b4326579b5904c981b9c6ac1e38754379ee662063358f75277321e2624672e99be4be74f687000000000000000000000000000000001546d115c31454dabd79db911c558545c2c15488ce854d741502ff941883cc7d77b3e17a877ee78eb1bb2bc8fa0bf5c50000000000000000000000000000000018724e2b9a2f383329207ee85577805f35d5c5bb9f6903e3c962e57ab7eb9d1639d1e9adbde53499863b299f576325a000000000000000000000000000000000032e4fbb8dab462ff0352c2d3925b0e97ca662189129928ccc1714364e4f01d8b026887d808342091ad442b6e11635910000000000000000000000000000000004506802747afd8777904c46ad9bf0b06859a1b395ca3474a93ca4151ca158d2fd41b3a21e0ce0bc950b3241256e10d800000000000000000000000000000000115f41d2c173c3c2c7ecdff1a4aaa3c2e67c803db7a588d6143fe913961eef743d8b1f9d32e3ef1fc0475f41572faf7800000000000000000000000000000000125742a15d9fe0d485807b4326579b5904c981b9c6ac1e38754379ee662063358f75277321e2624672e99be4be74f687000000000000000000000000000000001546d115c31454dabd79db911c558545c2c15488ce854d741502ff941883cc7d77b3e17a877ee78eb1bb2bc8fa0bf5c5", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_55", + "Gas": 207000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000010fcf5e5e478ac6442b218ce261878d8f61b405c0b9549512e23ead1f26a2240771993f8c039fbce4008a1707aeaaf25000000000000000000000000000000000f1afe9b199362f51cc84edb1d3cf2faf8e5bc0a734a646851ab83e213f73a3734114f255b611ec18db75694dcb0df910000000000000000000000000000000019cc0ec24da141f27b38a53aef0b3d93c4c2b981c1b248014be277002d39d7bde66f6957a659a89adcd3477dfe4f897a000000000000000000000000000000000e4c01d7425e35be84e3cf806aa76a079cf4557732980f7e8f8ce9a879483e28f223694ed8dd45706e12272f4c7952820000000000000000000000000000000008ceb842a17953578013ceee519a28ef1b37f73e13564def5ffe08a64dc53aa680784e26138176c89269477ee003d16700000000000000000000000000000000159791b6f2c26ed611ca40bfbd2059c15cfec9d073a84254ad9b509ef786d62d17fdc67ab13092cf0b7b3482866f4c320000000000000000000000000000000010fcf5e5e478ac6442b218ce261878d8f61b405c0b9549512e23ead1f26a2240771993f8c039fbce4008a1707aeaaf25000000000000000000000000000000000ae6134f1fec83a52e5358db260eb9dc6b918f7a803aae5715854ebee2b9bbecea9ab0d955f2e13e2c47a96b234ecb1a0000000000000000000000000000000019cc0ec24da141f27b38a53aef0b3d93c4c2b981c1b248014be277002d39d7bde66f6957a659a89adcd3477dfe4f897a000000000000000000000000000000000e4c01d7425e35be84e3cf806aa76a079cf4557732980f7e8f8ce9a879483e28f223694ed8dd45706e12272f4c7952820000000000000000000000000000000008ceb842a17953578013ceee519a28ef1b37f73e13564def5ffe08a64dc53aa680784e26138176c89269477ee003d16700000000000000000000000000000000159791b6f2c26ed611ca40bfbd2059c15cfec9d073a84254ad9b509ef786d62d17fdc67ab13092cf0b7b3482866f4c320000000000000000000000000000000010fcf5e5e478ac6442b218ce261878d8f61b405c0b9549512e23ead1f26a2240771993f8c039fbce4008a1707aeaaf25000000000000000000000000000000000f1afe9b199362f51cc84edb1d3cf2faf8e5bc0a734a646851ab83e213f73a3734114f255b611ec18db75694dcb0df910000000000000000000000000000000019cc0ec24da141f27b38a53aef0b3d93c4c2b981c1b248014be277002d39d7bde66f6957a659a89adcd3477dfe4f897a000000000000000000000000000000000e4c01d7425e35be84e3cf806aa76a079cf4557732980f7e8f8ce9a879483e28f223694ed8dd45706e12272f4c79528200000000000000000000000000000000113259a798069342cb07d8c7f1b183e8493f5446e02ec4d00732c9faa8ebbb7d9e33b1d89dd289372795b8811ffbd944000000000000000000000000000000000469803346bd77c4395166f6862b5316077881b47fdcd06ab9958201ff2a1ff706ae398400236d30ae83cb7d79905e790000000000000000000000000000000010fcf5e5e478ac6442b218ce261878d8f61b405c0b9549512e23ead1f26a2240771993f8c039fbce4008a1707aeaaf25000000000000000000000000000000000ae6134f1fec83a52e5358db260eb9dc6b918f7a803aae5715854ebee2b9bbecea9ab0d955f2e13e2c47a96b234ecb1a0000000000000000000000000000000019cc0ec24da141f27b38a53aef0b3d93c4c2b981c1b248014be277002d39d7bde66f6957a659a89adcd3477dfe4f897a000000000000000000000000000000000e4c01d7425e35be84e3cf806aa76a079cf4557732980f7e8f8ce9a879483e28f223694ed8dd45706e12272f4c79528200000000000000000000000000000000113259a798069342cb07d8c7f1b183e8493f5446e02ec4d00732c9faa8ebbb7d9e33b1d89dd289372795b8811ffbd944000000000000000000000000000000000469803346bd77c4395166f6862b5316077881b47fdcd06ab9958201ff2a1ff706ae398400236d30ae83cb7d79905e79", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_56", + "Gas": 207000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000f75bc9feb74110697c9f353686910c6246e587dd71d744aab99917f1aea7165b41deb333e6bd14843f28b2232f799830000000000000000000000000000000019275491a51599736722295659dd5589f4e3f558e3d45137a66b4c8066c7514ae66ec35c862cd00bce809db528040c04000000000000000000000000000000000040d03956c821010969a67c91a6546800c5aa7ac392b16a9895136c941f4ca9f378c55446161562feace3b5b65f3c4f000000000000000000000000000000000e4b299f9fb25caec655d21c390bdad3c1256ca29faa33466a13aaa6d86310106d95fc8d8a0409fbd228fd3be7965cdf000000000000000000000000000000001272c63693873e1dabe2c2739310f627d3d9b5bcaa615402c3849ffd8dfe72b40fea4a068064655f2c8f46f074e6518d0000000000000000000000000000000000161a8e5e1de10938e5bce241ae73d76173022127822d744b23e656095c28f2f8d142ceb48b72a1dbc36b6143f8af95000000000000000000000000000000000f75bc9feb74110697c9f353686910c6246e587dd71d744aab99917f1aea7165b41deb333e6bd14843f28b2232f799830000000000000000000000000000000000d9bd58946a4d26e3f97e5fe96e574d6f93562c0fb0c187c0c586208fe9a4d9383d3ca22b272ff3eb7e624ad7fb9ea7000000000000000000000000000000000040d03956c821010969a67c91a6546800c5aa7ac392b16a9895136c941f4ca9f378c55446161562feace3b5b65f3c4f000000000000000000000000000000000e4b299f9fb25caec655d21c390bdad3c1256ca29faa33466a13aaa6d86310106d95fc8d8a0409fbd228fd3be7965cdf000000000000000000000000000000001272c63693873e1dabe2c2739310f627d3d9b5bcaa615402c3849ffd8dfe72b40fea4a068064655f2c8f46f074e6518d0000000000000000000000000000000000161a8e5e1de10938e5bce241ae73d76173022127822d744b23e656095c28f2f8d142ceb48b72a1dbc36b6143f8af95000000000000000000000000000000000f75bc9feb74110697c9f353686910c6246e587dd71d744aab99917f1aea7165b41deb333e6bd14843f28b2232f799830000000000000000000000000000000019275491a51599736722295659dd5589f4e3f558e3d45137a66b4c8066c7514ae66ec35c862cd00bce809db528040c04000000000000000000000000000000000040d03956c821010969a67c91a6546800c5aa7ac392b16a9895136c941f4ca9f378c55446161562feace3b5b65f3c4f000000000000000000000000000000000e4b299f9fb25caec655d21c390bdad3c1256ca29faa33466a13aaa6d86310106d95fc8d8a0409fbd228fd3be7965cdf00000000000000000000000000000000078e4bb3a5f8a87c9f38e542b03ab6af909d95c84923bebca3ac32a368b283700ec1b5f830ef9aa08d6fb90f8b19591e0000000000000000000000000000000019eaf75bdb6205911235ead4019d390003044963cc02e54b1c0cec4aed54cd3125dabd2ffcc88d5dde3b949ebc06fb16000000000000000000000000000000000f75bc9feb74110697c9f353686910c6246e587dd71d744aab99917f1aea7165b41deb333e6bd14843f28b2232f799830000000000000000000000000000000000d9bd58946a4d26e3f97e5fe96e574d6f93562c0fb0c187c0c586208fe9a4d9383d3ca22b272ff3eb7e624ad7fb9ea7000000000000000000000000000000000040d03956c821010969a67c91a6546800c5aa7ac392b16a9895136c941f4ca9f378c55446161562feace3b5b65f3c4f000000000000000000000000000000000e4b299f9fb25caec655d21c390bdad3c1256ca29faa33466a13aaa6d86310106d95fc8d8a0409fbd228fd3be7965cdf00000000000000000000000000000000078e4bb3a5f8a87c9f38e542b03ab6af909d95c84923bebca3ac32a368b283700ec1b5f830ef9aa08d6fb90f8b19591e0000000000000000000000000000000019eaf75bdb6205911235ead4019d390003044963cc02e54b1c0cec4aed54cd3125dabd2ffcc88d5dde3b949ebc06fb16", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_57", + "Gas": 207000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000a87d0ccfb9c01148703d48993de04059d22a4cc48c5dabd2571ad4f7e60d6abfbcc5fb3bf363fd311fec675486c2a20000000000000000000000000000000000a896c5a84cbd03e52ae77000eb0285f5704993664a744a89ff6b346efd2efec1a519b67229a3b87e1f80e6aa17e2946000000000000000000000000000000000b50dc0957eccf5ad941b148a3824e82464bb7345a05125a0aa64f6ba34e34e767d4f679e9916faaacf82b3c79c9bddc00000000000000000000000000000000087152b3cb0db88776a7144fbafc1b210d150b637ca7148e3df600989231bce613fcf8e310fcc53aa2dc934bcbf86a220000000000000000000000000000000018a236ea02b1971d6e193a6eb92e1298956679d86864042fb6a0c36dd91c0e385944d779dedd0149fa8a1b3d6a07949d00000000000000000000000000000000048eac7d116b5a7906bce070e2b51ee7c4c493f1415abdb6fd2d35676036d3b741d14b7135419645a6906018e9d3f150000000000000000000000000000000000a87d0ccfb9c01148703d48993de04059d22a4cc48c5dabd2571ad4f7e60d6abfbcc5fb3bf363fd311fec675486c2a20000000000000000000000000000000000f77a58fb4b4165bf86d30b6349b84780d72b24e8eddce16c73a1f5a06de0638045a64978eb9c477d806f1955e818165000000000000000000000000000000000b50dc0957eccf5ad941b148a3824e82464bb7345a05125a0aa64f6ba34e34e767d4f679e9916faaacf82b3c79c9bddc00000000000000000000000000000000087152b3cb0db88776a7144fbafc1b210d150b637ca7148e3df600989231bce613fcf8e310fcc53aa2dc934bcbf86a220000000000000000000000000000000018a236ea02b1971d6e193a6eb92e1298956679d86864042fb6a0c36dd91c0e385944d779dedd0149fa8a1b3d6a07949d00000000000000000000000000000000048eac7d116b5a7906bce070e2b51ee7c4c493f1415abdb6fd2d35676036d3b741d14b7135419645a6906018e9d3f150000000000000000000000000000000000a87d0ccfb9c01148703d48993de04059d22a4cc48c5dabd2571ad4f7e60d6abfbcc5fb3bf363fd311fec675486c2a20000000000000000000000000000000000a896c5a84cbd03e52ae77000eb0285f5704993664a744a89ff6b346efd2efec1a519b67229a3b87e1f80e6aa17e2946000000000000000000000000000000000b50dc0957eccf5ad941b148a3824e82464bb7345a05125a0aa64f6ba34e34e767d4f679e9916faaacf82b3c79c9bddc00000000000000000000000000000000087152b3cb0db88776a7144fbafc1b210d150b637ca7148e3df600989231bce613fcf8e310fcc53aa2dc934bcbf86a2200000000000000000000000000000000015edb0036ce4f7cdd026d478a1d9a3ecf10d1ac8b210e8fb0900f331d94e7ebc5672884d276feb5bf74e4c295f8160e000000000000000000000000000000001572656d28148c21445ec74560968def9fb2b793b22a55086a039d39967a226cdcdab48d7c1269ba136e9fe7162bb95b000000000000000000000000000000000a87d0ccfb9c01148703d48993de04059d22a4cc48c5dabd2571ad4f7e60d6abfbcc5fb3bf363fd311fec675486c2a20000000000000000000000000000000000f77a58fb4b4165bf86d30b6349b84780d72b24e8eddce16c73a1f5a06de0638045a64978eb9c477d806f1955e818165000000000000000000000000000000000b50dc0957eccf5ad941b148a3824e82464bb7345a05125a0aa64f6ba34e34e767d4f679e9916faaacf82b3c79c9bddc00000000000000000000000000000000087152b3cb0db88776a7144fbafc1b210d150b637ca7148e3df600989231bce613fcf8e310fcc53aa2dc934bcbf86a2200000000000000000000000000000000015edb0036ce4f7cdd026d478a1d9a3ecf10d1ac8b210e8fb0900f331d94e7ebc5672884d276feb5bf74e4c295f8160e000000000000000000000000000000001572656d28148c21445ec74560968def9fb2b793b22a55086a039d39967a226cdcdab48d7c1269ba136e9fe7162bb95b", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_58", + "Gas": 207000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000d35ffa284655a94c3050213f4f14e927c162818bbfd0480bad2e07000dd3081274056715c96408f243589d83365c9f20000000000000000000000000000000001450bddfa14033ed8cdb94386715013ed9b2c4f9d65944e9d32c0b3545a085113e173e5afcfccb78878414a464d318400000000000000000000000000000000094fdcc2119b4f674b5639653dfabcac59c2adb1ee2ec06c55c3f148c9361351ff0acb2519e4638cb2cde98efaec8f4400000000000000000000000000000000051d5edcbd6eadac808222f0423bada165fcb98f98a89f335c981262b0ca7ea1c536d41aa41b49b25f0c43f53c95384000000000000000000000000000000000003c96c6f20d7ac31ee7ca77d11e8d25ea78cdf13e5f4d317752320e059e19196f14c15b5a18ca712f3a7cc6f09be6d4000000000000000000000000000000000ebd71f61fcddf1652675f577bbaeec26b892dd954965b057ffb431d6e37cc5425a2a42a0059482c2bd75adb2a120b0b000000000000000000000000000000000d35ffa284655a94c3050213f4f14e927c162818bbfd0480bad2e07000dd3081274056715c96408f243589d83365c9f20000000000000000000000000000000018bc060c3f6be35b724dee72bcda5cc376dc1f35561f7e70c9fe11eda256edd30aca8c19018433483186beb5b9b2792700000000000000000000000000000000094fdcc2119b4f674b5639653dfabcac59c2adb1ee2ec06c55c3f148c9361351ff0acb2519e4638cb2cde98efaec8f4400000000000000000000000000000000051d5edcbd6eadac808222f0423bada165fcb98f98a89f335c981262b0ca7ea1c536d41aa41b49b25f0c43f53c95384000000000000000000000000000000000003c96c6f20d7ac31ee7ca77d11e8d25ea78cdf13e5f4d317752320e059e19196f14c15b5a18ca712f3a7cc6f09be6d4000000000000000000000000000000000ebd71f61fcddf1652675f577bbaeec26b892dd954965b057ffb431d6e37cc5425a2a42a0059482c2bd75adb2a120b0b000000000000000000000000000000000d35ffa284655a94c3050213f4f14e927c162818bbfd0480bad2e07000dd3081274056715c96408f243589d83365c9f20000000000000000000000000000000001450bddfa14033ed8cdb94386715013ed9b2c4f9d65944e9d32c0b3545a085113e173e5afcfccb78878414a464d318400000000000000000000000000000000094fdcc2119b4f674b5639653dfabcac59c2adb1ee2ec06c55c3f148c9361351ff0acb2519e4638cb2cde98efaec8f4400000000000000000000000000000000051d5edcbd6eadac808222f0423bada165fcb98f98a89f335c981262b0ca7ea1c536d41aa41b49b25f0c43f53c9538400000000000000000000000000000000019c47b2347726bd72c33dd3e722d1fb179fe7d93b525c58defdea092f112dd0aaf973ea3573b358e8ac483390f63c3d7000000000000000000000000000000000b439ff419b20783f8b4485ec790be14f8ee1dab9eeeb7b9e7358f83887929cff9095bd4b0fab7d38e27a524d5ed9fa0000000000000000000000000000000000d35ffa284655a94c3050213f4f14e927c162818bbfd0480bad2e07000dd3081274056715c96408f243589d83365c9f20000000000000000000000000000000018bc060c3f6be35b724dee72bcda5cc376dc1f35561f7e70c9fe11eda256edd30aca8c19018433483186beb5b9b2792700000000000000000000000000000000094fdcc2119b4f674b5639653dfabcac59c2adb1ee2ec06c55c3f148c9361351ff0acb2519e4638cb2cde98efaec8f4400000000000000000000000000000000051d5edcbd6eadac808222f0423bada165fcb98f98a89f335c981262b0ca7ea1c536d41aa41b49b25f0c43f53c9538400000000000000000000000000000000019c47b2347726bd72c33dd3e722d1fb179fe7d93b525c58defdea092f112dd0aaf973ea3573b358e8ac483390f63c3d7000000000000000000000000000000000b439ff419b20783f8b4485ec790be14f8ee1dab9eeeb7b9e7358f83887929cff9095bd4b0fab7d38e27a524d5ed9fa0", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_59", + "Gas": 207000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000344cafaca754db423544657de1b77025164ccc702f8d45697fb73602302a3cb4511c38f0a76a37415d683398f35556500000000000000000000000000000000120935947070451885bf0c328bd83def193831ab9353844a01130074f16a1ff4d20df8459b5ad6a57d5f1959d37aae920000000000000000000000000000000014b0862ac988a169342a4abacfebc5e7e7e8f8ff1166c6ca8fa53613c5fc28fd8b02d9c8d5e7a264b2fa59cd33a0f33c000000000000000000000000000000000f0f79631e7790192c18187144388373d52653cf11dd076688877fa9b5cf58e65fe4332874c301563089b9b3fa2322e4000000000000000000000000000000000174ffb89d7715866562d9882acb81ce40758644ca3e0decd546c8f5c349b24fce88214956e7540fac36bcfc105cf34a0000000000000000000000000000000003e06c5f607ccf1e2991828034fcdf91106295e7174b4dca21926169451ee58e737d535af45073e2378206e03c81c421000000000000000000000000000000000344cafaca754db423544657de1b77025164ccc702f8d45697fb73602302a3cb4511c38f0a76a37415d683398f3555650000000000000000000000000000000007f7dc55c90fa181c55c9b83b7736ee84b3f19d960318e75661dd22c0546d62f4c9e07b915f9295a3c9fe6a62c84fc190000000000000000000000000000000014b0862ac988a169342a4abacfebc5e7e7e8f8ff1166c6ca8fa53613c5fc28fd8b02d9c8d5e7a264b2fa59cd33a0f33c000000000000000000000000000000000f0f79631e7790192c18187144388373d52653cf11dd076688877fa9b5cf58e65fe4332874c301563089b9b3fa2322e4000000000000000000000000000000000174ffb89d7715866562d9882acb81ce40758644ca3e0decd546c8f5c349b24fce88214956e7540fac36bcfc105cf34a0000000000000000000000000000000003e06c5f607ccf1e2991828034fcdf91106295e7174b4dca21926169451ee58e737d535af45073e2378206e03c81c421000000000000000000000000000000000344cafaca754db423544657de1b77025164ccc702f8d45697fb73602302a3cb4511c38f0a76a37415d683398f35556500000000000000000000000000000000120935947070451885bf0c328bd83def193831ab9353844a01130074f16a1ff4d20df8459b5ad6a57d5f1959d37aae920000000000000000000000000000000014b0862ac988a169342a4abacfebc5e7e7e8f8ff1166c6ca8fa53613c5fc28fd8b02d9c8d5e7a264b2fa59cd33a0f33c000000000000000000000000000000000f0f79631e7790192c18187144388373d52653cf11dd076688877fa9b5cf58e65fe4332874c301563089b9b3fa2322e400000000000000000000000000000000188c12319c08d113e5b8ce2e18802b092401c540294704d291ea09ab336743d45023deb55a6cabf00dc84303efa2b761000000000000000000000000000000001620a58ad903177c218a25360e4ecd465414b59ddc39c4f5459e7137b1921095ab2eaca3bd038c1d827cf91fc37de68a000000000000000000000000000000000344cafaca754db423544657de1b77025164ccc702f8d45697fb73602302a3cb4511c38f0a76a37415d683398f3555650000000000000000000000000000000007f7dc55c90fa181c55c9b83b7736ee84b3f19d960318e75661dd22c0546d62f4c9e07b915f9295a3c9fe6a62c84fc190000000000000000000000000000000014b0862ac988a169342a4abacfebc5e7e7e8f8ff1166c6ca8fa53613c5fc28fd8b02d9c8d5e7a264b2fa59cd33a0f33c000000000000000000000000000000000f0f79631e7790192c18187144388373d52653cf11dd076688877fa9b5cf58e65fe4332874c301563089b9b3fa2322e400000000000000000000000000000000188c12319c08d113e5b8ce2e18802b092401c540294704d291ea09ab336743d45023deb55a6cabf00dc84303efa2b761000000000000000000000000000000001620a58ad903177c218a25360e4ecd465414b59ddc39c4f5459e7137b1921095ab2eaca3bd038c1d827cf91fc37de68a", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_60", + "Gas": 207000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000008797f704442e133d3b77a5f0020aa304d36ce326ea75ca47e041e4d8a721754e0579ce82b96a69142cb7185998d18ce00000000000000000000000000000000144f438d86d1d808d528ea60c5d343b427124af6e43d4d9652368ddc508daab32fd9c9425cba44fba72e3449e366b1700000000000000000000000000000000006a3a773638c0b4a13e7ea399ac319f5ea55ed533aca32a933d69d8198ae997a66d1e32a02683e7fc5c1ec597106848f00000000000000000000000000000000155ef036f60a5b11697581265293cc4c6eebd3fdf500540529b6997c27a3be31212aee5cdfea6cd95d6d5bf83a8ce5aa000000000000000000000000000000000b15d92f2301075ab0e3215aa72cf9b130bc8e1bcd9fa36375c4b9d7da430ae3e2b24f417336d8729f44542ee7f561d300000000000000000000000000000000197d90090501e8cdea28eb7963231f1a7b5f716cc3a086acb6e7626600d6544132cac943e8d5cefb5daf0a2f8d4006290000000000000000000000000000000008797f704442e133d3b77a5f0020aa304d36ce326ea75ca47e041e4d8a721754e0579ce82b96a69142cb7185998d18ce0000000000000000000000000000000005b1ce5cb2ae0e9175f2bd557d7869233d65008e0f47c52914fa44c4a6234b70eed236bc5499bb0412d0cbb61c98f93b0000000000000000000000000000000006a3a773638c0b4a13e7ea399ac319f5ea55ed533aca32a933d69d8198ae997a66d1e32a02683e7fc5c1ec597106848f00000000000000000000000000000000155ef036f60a5b11697581265293cc4c6eebd3fdf500540529b6997c27a3be31212aee5cdfea6cd95d6d5bf83a8ce5aa000000000000000000000000000000000b15d92f2301075ab0e3215aa72cf9b130bc8e1bcd9fa36375c4b9d7da430ae3e2b24f417336d8729f44542ee7f561d300000000000000000000000000000000197d90090501e8cdea28eb7963231f1a7b5f716cc3a086acb6e7626600d6544132cac943e8d5cefb5daf0a2f8d4006290000000000000000000000000000000008797f704442e133d3b77a5f0020aa304d36ce326ea75ca47e041e4d8a721754e0579ce82b96a69142cb7185998d18ce00000000000000000000000000000000144f438d86d1d808d528ea60c5d343b427124af6e43d4d9652368ddc508daab32fd9c9425cba44fba72e3449e366b1700000000000000000000000000000000006a3a773638c0b4a13e7ea399ac319f5ea55ed533aca32a933d69d8198ae997a66d1e32a02683e7fc5c1ec597106848f00000000000000000000000000000000155ef036f60a5b11697581265293cc4c6eebd3fdf500540529b6997c27a3be31212aee5cdfea6cd95d6d5bf83a8ce5aa000000000000000000000000000000000eeb38bb167edf3f9a38865b9c1eb32633babd6925e56f5bf16c18c91c6deb403bf9b0bd3e1d278d1abaabd1180a48d800000000000000000000000000000000008381e1347dfdcc60f2bc3ce0288dbce917da182fe48c12b049703af5daa1e2ebe136bac87e31045c4ff5d072bfa4820000000000000000000000000000000008797f704442e133d3b77a5f0020aa304d36ce326ea75ca47e041e4d8a721754e0579ce82b96a69142cb7185998d18ce0000000000000000000000000000000005b1ce5cb2ae0e9175f2bd557d7869233d65008e0f47c52914fa44c4a6234b70eed236bc5499bb0412d0cbb61c98f93b0000000000000000000000000000000006a3a773638c0b4a13e7ea399ac319f5ea55ed533aca32a933d69d8198ae997a66d1e32a02683e7fc5c1ec597106848f00000000000000000000000000000000155ef036f60a5b11697581265293cc4c6eebd3fdf500540529b6997c27a3be31212aee5cdfea6cd95d6d5bf83a8ce5aa000000000000000000000000000000000eeb38bb167edf3f9a38865b9c1eb32633babd6925e56f5bf16c18c91c6deb403bf9b0bd3e1d278d1abaabd1180a48d800000000000000000000000000000000008381e1347dfdcc60f2bc3ce0288dbce917da182fe48c12b049703af5daa1e2ebe136bac87e31045c4ff5d072bfa482", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_61", + "Gas": 207000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000000707c711f77bb425cddc71ecf96a18b6eb0bed7f012c4f6cc9431003f2e1ac17f7c1f68c4965a4fcc273a3db93451d000000000000000000000000000000001211464c91c7e78b00fe156da874407e4eeb7f422dbd698effb9a83357bf226d3f189f2db541eb17db3ed555084e91ec0000000000000000000000000000000006a90568fa25b401756e3f86b5300c4d3b626dc6274f4685e8a9f56ec5ca2afce36a1fdc6d3414edc8780c4e650f10dc0000000000000000000000000000000012e41e8e0dd10b3ee31fa866753aa5d9db7669153b141114cdb2ef7fa6df5db27aef0cc70e76a741eae504b038ecf2300000000000000000000000000000000005c35f3372f1ec9845bd04ea722fbed2be1388abf59e622dd3dafb4b3af49bc5fba9e20235e7e58973fedf4b8b720691000000000000000000000000000000001111d18d621070509805d306a31c109701288fd55d4c0644349deb080c6591b6e852b4f7e009b80019513de7f2fce17d00000000000000000000000000000000000707c711f77bb425cddc71ecf96a18b6eb0bed7f012c4f6cc9431003f2e1ac17f7c1f68c4965a4fcc273a3db93451d0000000000000000000000000000000007efcb9da7b7ff0f4a1d92489ad76c59158bcc42c5c7a93067772a6d9ef1d3b6df9360d0fc1214e7dec02aaaf7b118bf0000000000000000000000000000000006a90568fa25b401756e3f86b5300c4d3b626dc6274f4685e8a9f56ec5ca2afce36a1fdc6d3414edc8780c4e650f10dc0000000000000000000000000000000012e41e8e0dd10b3ee31fa866753aa5d9db7669153b141114cdb2ef7fa6df5db27aef0cc70e76a741eae504b038ecf2300000000000000000000000000000000005c35f3372f1ec9845bd04ea722fbed2be1388abf59e622dd3dafb4b3af49bc5fba9e20235e7e58973fedf4b8b720691000000000000000000000000000000001111d18d621070509805d306a31c109701288fd55d4c0644349deb080c6591b6e852b4f7e009b80019513de7f2fce17d00000000000000000000000000000000000707c711f77bb425cddc71ecf96a18b6eb0bed7f012c4f6cc9431003f2e1ac17f7c1f68c4965a4fcc273a3db93451d000000000000000000000000000000001211464c91c7e78b00fe156da874407e4eeb7f422dbd698effb9a83357bf226d3f189f2db541eb17db3ed555084e91ec0000000000000000000000000000000006a90568fa25b401756e3f86b5300c4d3b626dc6274f4685e8a9f56ec5ca2afce36a1fdc6d3414edc8780c4e650f10dc0000000000000000000000000000000012e41e8e0dd10b3ee31fa866753aa5d9db7669153b141114cdb2ef7fa6df5db27aef0cc70e76a741eae504b038ecf23000000000000000000000000000000000143db2b6c68dfa02055ea2cbd11bee04a663c2d8fde6b0919355d755bbbc5a5e23021dfc7b6c1a76460020b4748da41a0000000000000000000000000000000008ef405cd76f7649b315d4afa02f9c40634ebbaf96390c7b3292e798ea4b646d36594b06d14a47ffa0adc2180d02c92e00000000000000000000000000000000000707c711f77bb425cddc71ecf96a18b6eb0bed7f012c4f6cc9431003f2e1ac17f7c1f68c4965a4fcc273a3db93451d0000000000000000000000000000000007efcb9da7b7ff0f4a1d92489ad76c59158bcc42c5c7a93067772a6d9ef1d3b6df9360d0fc1214e7dec02aaaf7b118bf0000000000000000000000000000000006a90568fa25b401756e3f86b5300c4d3b626dc6274f4685e8a9f56ec5ca2afce36a1fdc6d3414edc8780c4e650f10dc0000000000000000000000000000000012e41e8e0dd10b3ee31fa866753aa5d9db7669153b141114cdb2ef7fa6df5db27aef0cc70e76a741eae504b038ecf23000000000000000000000000000000000143db2b6c68dfa02055ea2cbd11bee04a663c2d8fde6b0919355d755bbbc5a5e23021dfc7b6c1a76460020b4748da41a0000000000000000000000000000000008ef405cd76f7649b315d4afa02f9c40634ebbaf96390c7b3292e798ea4b646d36594b06d14a47ffa0adc2180d02c92e", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_62", + "Gas": 207000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000004b3c0e8b240b79c55f02833c2c20fa158e35c941e9e8e48247b96cb1d4923641b97e766637a3ced9fbef275ca9bd1ea000000000000000000000000000000000b4e7355aea3488234552d3dddfa2d1ad3164056407770e6c54f764193c9dc044cb7f2b157a1c4153b2045867d6f99c5000000000000000000000000000000001310a8cebed1491bb6399abe3a08fb25ad6ca00feb5db62069bc5bd45a57c167aaf06a628a3f18aa990bb389173855b100000000000000000000000000000000134655489380a9ae9cfbc3f4c6a1aa5b6dbe0a994e681915602c1d197c54bf3da6fb2df54eec3634ea87bf3fa92a69740000000000000000000000000000000000e7e532ee4b892af39f8a3db7a05cc77a6eb0b3d977c17076bac4a52d5ba003a0ac1f902a4257791a45370eb88426a70000000000000000000000000000000016a556050e4905fa74b5061e3874f05cc7a6c5b049bd3bb7c34adef5a77c393239a600542a4401c3e61978ee6515a30e0000000000000000000000000000000004b3c0e8b240b79c55f02833c2c20fa158e35c941e9e8e48247b96cb1d4923641b97e766637a3ced9fbef275ca9bd1ea000000000000000000000000000000000eb29e948adc9e1816c67a7865517fbc91610b2eb30da1d8a1e15c5f62e71a1fd1f40d4d59b23bea7edeba79829010e6000000000000000000000000000000001310a8cebed1491bb6399abe3a08fb25ad6ca00feb5db62069bc5bd45a57c167aaf06a628a3f18aa990bb389173855b100000000000000000000000000000000134655489380a9ae9cfbc3f4c6a1aa5b6dbe0a994e681915602c1d197c54bf3da6fb2df54eec3634ea87bf3fa92a69740000000000000000000000000000000000e7e532ee4b892af39f8a3db7a05cc77a6eb0b3d977c17076bac4a52d5ba003a0ac1f902a4257791a45370eb88426a70000000000000000000000000000000016a556050e4905fa74b5061e3874f05cc7a6c5b049bd3bb7c34adef5a77c393239a600542a4401c3e61978ee6515a30e0000000000000000000000000000000004b3c0e8b240b79c55f02833c2c20fa158e35c941e9e8e48247b96cb1d4923641b97e766637a3ced9fbef275ca9bd1ea000000000000000000000000000000000b4e7355aea3488234552d3dddfa2d1ad3164056407770e6c54f764193c9dc044cb7f2b157a1c4153b2045867d6f99c5000000000000000000000000000000001310a8cebed1491bb6399abe3a08fb25ad6ca00feb5db62069bc5bd45a57c167aaf06a628a3f18aa990bb389173855b100000000000000000000000000000000134655489380a9ae9cfbc3f4c6a1aa5b6dbe0a994e681915602c1d197c54bf3da6fb2df54eec3634ea87bf3fa92a69740000000000000000000000000000000019192cb74b345d6f577c1d788bab500fea089ad11a0d514ef0760dfbc95556207dffe06e8711a8869fb9c8f1477b840400000000000000000000000000000000035bbbe52b36e09fd666a1980ad6bc7a9cd085d4a9c7d707a3e5f3ab4f34bcf1e505ffaa870ffe3bd3e587119aea079d0000000000000000000000000000000004b3c0e8b240b79c55f02833c2c20fa158e35c941e9e8e48247b96cb1d4923641b97e766637a3ced9fbef275ca9bd1ea000000000000000000000000000000000eb29e948adc9e1816c67a7865517fbc91610b2eb30da1d8a1e15c5f62e71a1fd1f40d4d59b23bea7edeba79829010e6000000000000000000000000000000001310a8cebed1491bb6399abe3a08fb25ad6ca00feb5db62069bc5bd45a57c167aaf06a628a3f18aa990bb389173855b100000000000000000000000000000000134655489380a9ae9cfbc3f4c6a1aa5b6dbe0a994e681915602c1d197c54bf3da6fb2df54eec3634ea87bf3fa92a69740000000000000000000000000000000019192cb74b345d6f577c1d788bab500fea089ad11a0d514ef0760dfbc95556207dffe06e8711a8869fb9c8f1477b840400000000000000000000000000000000035bbbe52b36e09fd666a1980ad6bc7a9cd085d4a9c7d707a3e5f3ab4f34bcf1e505ffaa870ffe3bd3e587119aea079d", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_63", + "Gas": 207000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001465358836eb5c6e173e425f675aa231f9c62e9b122584078f2ab9af7440a4ce4ac2cd21ce35a0017b01e4913b40f73d00000000000000000000000000000000170e2da3bca3d0a8659e31df4d8a3a73e681c22beb21577bea6bbc3de1cabff8a1db28b51fdd46ba906767b69db2f679000000000000000000000000000000001360612f80227a2fc50a2dbdb3a49db16bd9f0ae401e2fb69408d990284cec05a1c29696f98b16d83a3dab6eac8678310000000000000000000000000000000001223232338ce1ac91e28b4c00ef4e3561f21f34fc405e479599cced3a86b7c36f541370bfd0176f785326f741699d2900000000000000000000000000000000179c34ba9578d5ff90272a2c7f756794670a047f79a53215da69937152bad0f86576945b12176d3e13cac38d26335c51000000000000000000000000000000000dcc715907e4e17824e24c1f513c09597965941e3ed0aaad6d0c59029b54fb039d716a998c9c418110bd49c5e365507f000000000000000000000000000000001465358836eb5c6e173e425f675aa231f9c62e9b122584078f2ab9af7440a4ce4ac2cd21ce35a0017b01e4913b40f73d0000000000000000000000000000000002f2e4467cdc15f1e57d75d6f5c172637df589590863bb437cc5166314e6362b7cd0d7499176b94529979849624cb432000000000000000000000000000000001360612f80227a2fc50a2dbdb3a49db16bd9f0ae401e2fb69408d990284cec05a1c29696f98b16d83a3dab6eac8678310000000000000000000000000000000001223232338ce1ac91e28b4c00ef4e3561f21f34fc405e479599cced3a86b7c36f541370bfd0176f785326f741699d2900000000000000000000000000000000179c34ba9578d5ff90272a2c7f756794670a047f79a53215da69937152bad0f86576945b12176d3e13cac38d26335c51000000000000000000000000000000000dcc715907e4e17824e24c1f513c09597965941e3ed0aaad6d0c59029b54fb039d716a998c9c418110bd49c5e365507f000000000000000000000000000000001465358836eb5c6e173e425f675aa231f9c62e9b122584078f2ab9af7440a4ce4ac2cd21ce35a0017b01e4913b40f73d00000000000000000000000000000000170e2da3bca3d0a8659e31df4d8a3a73e681c22beb21577bea6bbc3de1cabff8a1db28b51fdd46ba906767b69db2f679000000000000000000000000000000001360612f80227a2fc50a2dbdb3a49db16bd9f0ae401e2fb69408d990284cec05a1c29696f98b16d83a3dab6eac8678310000000000000000000000000000000001223232338ce1ac91e28b4c00ef4e3561f21f34fc405e479599cced3a86b7c36f541370bfd0176f785326f741699d29000000000000000000000000000000000264dd2fa407109abaf47d89c3d64542fd6d470579dfe0a98cc73f2fa3f6252bb9356ba39f3c92c1a6343c72d9cc4e5a000000000000000000000000000000000c34a091319b052226395b96f20fa37deb11b766b4b46811fa24799e5b5bfb20813a956524b7be7ea941b63a1c9a5a2c000000000000000000000000000000001465358836eb5c6e173e425f675aa231f9c62e9b122584078f2ab9af7440a4ce4ac2cd21ce35a0017b01e4913b40f73d0000000000000000000000000000000002f2e4467cdc15f1e57d75d6f5c172637df589590863bb437cc5166314e6362b7cd0d7499176b94529979849624cb432000000000000000000000000000000001360612f80227a2fc50a2dbdb3a49db16bd9f0ae401e2fb69408d990284cec05a1c29696f98b16d83a3dab6eac8678310000000000000000000000000000000001223232338ce1ac91e28b4c00ef4e3561f21f34fc405e479599cced3a86b7c36f541370bfd0176f785326f741699d29000000000000000000000000000000000264dd2fa407109abaf47d89c3d64542fd6d470579dfe0a98cc73f2fa3f6252bb9356ba39f3c92c1a6343c72d9cc4e5a000000000000000000000000000000000c34a091319b052226395b96f20fa37deb11b766b4b46811fa24799e5b5bfb20813a956524b7be7ea941b63a1c9a5a2c000000000000000000000000000000001465358836eb5c6e173e425f675aa231f9c62e9b122584078f2ab9af7440a4ce4ac2cd21ce35a0017b01e4913b40f73d00000000000000000000000000000000170e2da3bca3d0a8659e31df4d8a3a73e681c22beb21577bea6bbc3de1cabff8a1db28b51fdd46ba906767b69db2f679000000000000000000000000000000001360612f80227a2fc50a2dbdb3a49db16bd9f0ae401e2fb69408d990284cec05a1c29696f98b16d83a3dab6eac8678310000000000000000000000000000000001223232338ce1ac91e28b4c00ef4e3561f21f34fc405e479599cced3a86b7c36f541370bfd0176f785326f741699d2900000000000000000000000000000000179c34ba9578d5ff90272a2c7f756794670a047f79a53215da69937152bad0f86576945b12176d3e13cac38d26335c51000000000000000000000000000000000dcc715907e4e17824e24c1f513c09597965941e3ed0aaad6d0c59029b54fb039d716a998c9c418110bd49c5e365507f", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_64", + "Gas": 230000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000ab6e2a649ed97be4574603b3b4a210f0748d8cddf132079e0543ec776ceb63902e48598b7698cf79fd5130cebaf0250000000000000000000000000000000000d55b3115d2bfcd1b93c631a71b2356c887b32452aae53ffd01a719121d58834be1e0fa4f22a01bbde0d40f55ad38f2c0000000000000000000000000000000002fec3b2e25d9300b9757cbe77857d7220d91a53fc29f3b7a0da5c4e0815882d1cc51a40a60fa8e1ae01296c209eda0a00000000000000000000000000000000041ff1a77aca41f7aaeec13fb5238c24d038e2e566b611203c430d7ac6251d545ed4a60e9e0087d6baa36272c7b1c853000000000000000000000000000000001643567a0f22b90fefee96c8e2f5851623384c2c68bce9589cdf64c933d494a8d805edce2fd18a6db80f4819391dd1f9000000000000000000000000000000000e4e40ab1969bf9f00ee3b984947ae95bf7b9579bdaeeee926638f9566f8ab26debb4c8d4009535cb6422b2c2ab7282d000000000000000000000000000000000ab6e2a649ed97be4574603b3b4a210f0748d8cddf132079e0543ec776ceb63902e48598b7698cf79fd5130cebaf0250000000000000000000000000000000000cab5ed8dc53e9c891df449bd199776adbfc193fc8d6bebf9716610fd4db6def608df059bf29fe43dbf1bf0aa52c1b7f0000000000000000000000000000000002fec3b2e25d9300b9757cbe77857d7220d91a53fc29f3b7a0da5c4e0815882d1cc51a40a60fa8e1ae01296c209eda0a00000000000000000000000000000000041ff1a77aca41f7aaeec13fb5238c24d038e2e566b611203c430d7ac6251d545ed4a60e9e0087d6baa36272c7b1c853000000000000000000000000000000001643567a0f22b90fefee96c8e2f5851623384c2c68bce9589cdf64c933d494a8d805edce2fd18a6db80f4819391dd1f9000000000000000000000000000000000e4e40ab1969bf9f00ee3b984947ae95bf7b9579bdaeeee926638f9566f8ab26debb4c8d4009535cb6422b2c2ab7282d000000000000000000000000000000000ab6e2a649ed97be4574603b3b4a210f0748d8cddf132079e0543ec776ceb63902e48598b7698cf79fd5130cebaf0250000000000000000000000000000000000d55b3115d2bfcd1b93c631a71b2356c887b32452aae53ffd01a719121d58834be1e0fa4f22a01bbde0d40f55ad38f2c0000000000000000000000000000000002fec3b2e25d9300b9757cbe77857d7220d91a53fc29f3b7a0da5c4e0815882d1cc51a40a60fa8e1ae01296c209eda0a00000000000000000000000000000000041ff1a77aca41f7aaeec13fb5238c24d038e2e566b611203c430d7ac6251d545ed4a60e9e0087d6baa36272c7b1c8530000000000000000000000000000000003bdbb702a5d2d8a5b2d10ed605627c1413eff588ac82966ca516dd7c2dc617b46a612308182759201efb7e6c6e1d8b2000000000000000000000000000000000bb2d13f201626fb4a2d6c1dfa03fe41a4fbb60b35d623d640cd430b8fb84afd3ff0b371714aaca303bcd4d3d548827e000000000000000000000000000000000ab6e2a649ed97be4574603b3b4a210f0748d8cddf132079e0543ec776ceb63902e48598b7698cf79fd5130cebaf0250000000000000000000000000000000000cab5ed8dc53e9c891df449bd199776adbfc193fc8d6bebf9716610fd4db6def608df059bf29fe43dbf1bf0aa52c1b7f0000000000000000000000000000000002fec3b2e25d9300b9757cbe77857d7220d91a53fc29f3b7a0da5c4e0815882d1cc51a40a60fa8e1ae01296c209eda0a00000000000000000000000000000000041ff1a77aca41f7aaeec13fb5238c24d038e2e566b611203c430d7ac6251d545ed4a60e9e0087d6baa36272c7b1c8530000000000000000000000000000000003bdbb702a5d2d8a5b2d10ed605627c1413eff588ac82966ca516dd7c2dc617b46a612308182759201efb7e6c6e1d8b2000000000000000000000000000000000bb2d13f201626fb4a2d6c1dfa03fe41a4fbb60b35d623d640cd430b8fb84afd3ff0b371714aaca303bcd4d3d548827e000000000000000000000000000000000ab6e2a649ed97be4574603b3b4a210f0748d8cddf132079e0543ec776ceb63902e48598b7698cf79fd5130cebaf0250000000000000000000000000000000000d55b3115d2bfcd1b93c631a71b2356c887b32452aae53ffd01a719121d58834be1e0fa4f22a01bbde0d40f55ad38f2c0000000000000000000000000000000002fec3b2e25d9300b9757cbe77857d7220d91a53fc29f3b7a0da5c4e0815882d1cc51a40a60fa8e1ae01296c209eda0a00000000000000000000000000000000041ff1a77aca41f7aaeec13fb5238c24d038e2e566b611203c430d7ac6251d545ed4a60e9e0087d6baa36272c7b1c853000000000000000000000000000000001643567a0f22b90fefee96c8e2f5851623384c2c68bce9589cdf64c933d494a8d805edce2fd18a6db80f4819391dd1f9000000000000000000000000000000000e4e40ab1969bf9f00ee3b984947ae95bf7b9579bdaeeee926638f9566f8ab26debb4c8d4009535cb6422b2c2ab7282d", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_65", + "Gas": 230000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001654e99ebd103ed5709ae412a6df1751add90d4d56025667a4640c1d51435e7cad5464ff2c8b08cca56e34517b05acf10000000000000000000000000000000004d8353f55fdfb2407e80e881a5e57672fbcf7712dcec4cb583dbd93cf3f1052511fdee20f338a387690da7d69f4f6f700000000000000000000000000000000123a19e1427bac55eabdaec2aeeefadfca6e2b7581a5726c393bede2efd78af04e6cb986aa8d8d5c845bbbc28d62e7a00000000000000000000000000000000018026687f43591dac03a16fce0c4b8020469ec309bdbf9f0f270cf75e262abf4ae55d46f0b4ff130b7bbe2430bd0c9f4000000000000000000000000000000000a27fe0a29c761ce29a731ead969b1db3ae9ef4c05493cc370a128d97ef956c55d9a500991b3e7bf9600383633778ebb000000000000000000000000000000000dbb997ef4970a472bfcf03e959acb90bb13671a3d27c91698975a407856505e93837f46afc965363f21c35a3d194ec0000000000000000000000000000000001654e99ebd103ed5709ae412a6df1751add90d4d56025667a4640c1d51435e7cad5464ff2c8b08cca56e34517b05acf1000000000000000000000000000000001528dcaae381eb764333992e28ed557034ba5413c5b64df40ef3150d2771e5d1cd8c211ca22075c7436e2582960ab3b400000000000000000000000000000000123a19e1427bac55eabdaec2aeeefadfca6e2b7581a5726c393bede2efd78af04e6cb986aa8d8d5c845bbbc28d62e7a00000000000000000000000000000000018026687f43591dac03a16fce0c4b8020469ec309bdbf9f0f270cf75e262abf4ae55d46f0b4ff130b7bbe2430bd0c9f4000000000000000000000000000000000a27fe0a29c761ce29a731ead969b1db3ae9ef4c05493cc370a128d97ef956c55d9a500991b3e7bf9600383633778ebb000000000000000000000000000000000dbb997ef4970a472bfcf03e959acb90bb13671a3d27c91698975a407856505e93837f46afc965363f21c35a3d194ec0000000000000000000000000000000001654e99ebd103ed5709ae412a6df1751add90d4d56025667a4640c1d51435e7cad5464ff2c8b08cca56e34517b05acf10000000000000000000000000000000004d8353f55fdfb2407e80e881a5e57672fbcf7712dcec4cb583dbd93cf3f1052511fdee20f338a387690da7d69f4f6f700000000000000000000000000000000123a19e1427bac55eabdaec2aeeefadfca6e2b7581a5726c393bede2efd78af04e6cb986aa8d8d5c845bbbc28d62e7a00000000000000000000000000000000018026687f43591dac03a16fce0c4b8020469ec309bdbf9f0f270cf75e262abf4ae55d46f0b4ff130b7bbe2430bd0c9f4000000000000000000000000000000000fd913e00fb884cc217475cb69e1fafc298d5c38ee3bd5fbf68fa9c777b79f5ec111aff51fa0184023fec7c9cc881bf0000000000000000000000000000000000c45786b44e8dc531f1eb777adb0e146a963e46ab65d49a8ce9978607e5aa5c58b2880b8018a9ac97add3ca5c2e65beb000000000000000000000000000000001654e99ebd103ed5709ae412a6df1751add90d4d56025667a4640c1d51435e7cad5464ff2c8b08cca56e34517b05acf1000000000000000000000000000000001528dcaae381eb764333992e28ed557034ba5413c5b64df40ef3150d2771e5d1cd8c211ca22075c7436e2582960ab3b400000000000000000000000000000000123a19e1427bac55eabdaec2aeeefadfca6e2b7581a5726c393bede2efd78af04e6cb986aa8d8d5c845bbbc28d62e7a00000000000000000000000000000000018026687f43591dac03a16fce0c4b8020469ec309bdbf9f0f270cf75e262abf4ae55d46f0b4ff130b7bbe2430bd0c9f4000000000000000000000000000000000fd913e00fb884cc217475cb69e1fafc298d5c38ee3bd5fbf68fa9c777b79f5ec111aff51fa0184023fec7c9cc881bf0000000000000000000000000000000000c45786b44e8dc531f1eb777adb0e146a963e46ab65d49a8ce9978607e5aa5c58b2880b8018a9ac97add3ca5c2e65beb000000000000000000000000000000001654e99ebd103ed5709ae412a6df1751add90d4d56025667a4640c1d51435e7cad5464ff2c8b08cca56e34517b05acf10000000000000000000000000000000004d8353f55fdfb2407e80e881a5e57672fbcf7712dcec4cb583dbd93cf3f1052511fdee20f338a387690da7d69f4f6f700000000000000000000000000000000123a19e1427bac55eabdaec2aeeefadfca6e2b7581a5726c393bede2efd78af04e6cb986aa8d8d5c845bbbc28d62e7a00000000000000000000000000000000018026687f43591dac03a16fce0c4b8020469ec309bdbf9f0f270cf75e262abf4ae55d46f0b4ff130b7bbe2430bd0c9f4000000000000000000000000000000000a27fe0a29c761ce29a731ead969b1db3ae9ef4c05493cc370a128d97ef956c55d9a500991b3e7bf9600383633778ebb000000000000000000000000000000000dbb997ef4970a472bfcf03e959acb90bb13671a3d27c91698975a407856505e93837f46afc965363f21c35a3d194ec0", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_66", + "Gas": 230000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000001bb1e11a1ccc0b70ce46114caca7ac1aba2a607fea8c6a0e01785e17559b271a0e8b5afbfa8705ecb77420473e81c510000000000000000000000000000000018f2289ba50f703f87f0516d517e2f6309fe0dc7aca87cc534554c0e57c4bdc5cde0ca896033b7f3d96995d5cbd563d200000000000000000000000000000000000353798691ffba215b6458a47823d149e4e2e48c9e5f65df61d6b995889f3b0e2b34824e4ffa73296d03148c607c26000000000000000000000000000000001190ba585a928413dc3cef3d77b2cff99b053cadcb13b2529c74171a094d479a259678dd43a3ef2a2e597223eb7fd35c000000000000000000000000000000000eb3f5d24d1a4f520032534f6f81a6806c54df33cbd10c30203423aa4f33620b474cda321e924802b636daaeb34400470000000000000000000000000000000016f004f1dfbf140de042e4f57303928a576d9064f2da5b3ad392331f5c43327c7d2a6fd57456d5ef58b54a3e5ec275080000000000000000000000000000000001bb1e11a1ccc0b70ce46114caca7ac1aba2a607fea8c6a0e01785e17559b271a0e8b5afbfa8705ecb77420473e81c5100000000000000000000000000000000010ee94e9470765ac32b5648f1cd7d745a793dbd46dc95fa32db86929eec385e50cb35755120480be0956a2a342a46d900000000000000000000000000000000000353798691ffba215b6458a47823d149e4e2e48c9e5f65df61d6b995889f3b0e2b34824e4ffa73296d03148c607c26000000000000000000000000000000001190ba585a928413dc3cef3d77b2cff99b053cadcb13b2529c74171a094d479a259678dd43a3ef2a2e597223eb7fd35c000000000000000000000000000000000eb3f5d24d1a4f520032534f6f81a6806c54df33cbd10c30203423aa4f33620b474cda321e924802b636daaeb34400470000000000000000000000000000000016f004f1dfbf140de042e4f57303928a576d9064f2da5b3ad392331f5c43327c7d2a6fd57456d5ef58b54a3e5ec275080000000000000000000000000000000001bb1e11a1ccc0b70ce46114caca7ac1aba2a607fea8c6a0e01785e17559b271a0e8b5afbfa8705ecb77420473e81c510000000000000000000000000000000018f2289ba50f703f87f0516d517e2f6309fe0dc7aca87cc534554c0e57c4bdc5cde0ca896033b7f3d96995d5cbd563d200000000000000000000000000000000000353798691ffba215b6458a47823d149e4e2e48c9e5f65df61d6b995889f3b0e2b34824e4ffa73296d03148c607c26000000000000000000000000000000001190ba585a928413dc3cef3d77b2cff99b053cadcb13b2529c74171a094d479a259678dd43a3ef2a2e597223eb7fd35c000000000000000000000000000000000b4d1c17ec6597484ae95466d3ca0656f8226c5127b4068f46fcaef6a77d9418d75f25cc92c1b7fd03c825514cbbaa640000000000000000000000000000000003110cf859c0d28c6ad8c2c0d0481a4d0d09bb2000aab784939e9f819a6dc3a7a18190293cfd2a106149b5c1a13d35a30000000000000000000000000000000001bb1e11a1ccc0b70ce46114caca7ac1aba2a607fea8c6a0e01785e17559b271a0e8b5afbfa8705ecb77420473e81c5100000000000000000000000000000000010ee94e9470765ac32b5648f1cd7d745a793dbd46dc95fa32db86929eec385e50cb35755120480be0956a2a342a46d900000000000000000000000000000000000353798691ffba215b6458a47823d149e4e2e48c9e5f65df61d6b995889f3b0e2b34824e4ffa73296d03148c607c26000000000000000000000000000000001190ba585a928413dc3cef3d77b2cff99b053cadcb13b2529c74171a094d479a259678dd43a3ef2a2e597223eb7fd35c000000000000000000000000000000000b4d1c17ec6597484ae95466d3ca0656f8226c5127b4068f46fcaef6a77d9418d75f25cc92c1b7fd03c825514cbbaa640000000000000000000000000000000003110cf859c0d28c6ad8c2c0d0481a4d0d09bb2000aab784939e9f819a6dc3a7a18190293cfd2a106149b5c1a13d35a30000000000000000000000000000000001bb1e11a1ccc0b70ce46114caca7ac1aba2a607fea8c6a0e01785e17559b271a0e8b5afbfa8705ecb77420473e81c510000000000000000000000000000000018f2289ba50f703f87f0516d517e2f6309fe0dc7aca87cc534554c0e57c4bdc5cde0ca896033b7f3d96995d5cbd563d200000000000000000000000000000000000353798691ffba215b6458a47823d149e4e2e48c9e5f65df61d6b995889f3b0e2b34824e4ffa73296d03148c607c26000000000000000000000000000000001190ba585a928413dc3cef3d77b2cff99b053cadcb13b2529c74171a094d479a259678dd43a3ef2a2e597223eb7fd35c000000000000000000000000000000000eb3f5d24d1a4f520032534f6f81a6806c54df33cbd10c30203423aa4f33620b474cda321e924802b636daaeb34400470000000000000000000000000000000016f004f1dfbf140de042e4f57303928a576d9064f2da5b3ad392331f5c43327c7d2a6fd57456d5ef58b54a3e5ec27508", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_67", + "Gas": 230000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000012ecb4c2f259efb4416025e236108eff7862e54f796605cc7eb12f3e5275c80ef42aadd2acfbf84d5206f6884d8e3eab000000000000000000000000000000001554412fc407e6b6cf3cbcc0c240524d1a0bf9c1335926715ac1c5a5a79ecdf2fdd97c3d828881b3d2f8c0104c85531f0000000000000000000000000000000018b0cd0360c5d5bf8254725c19976345cd84d32d0d770286444fe29dfdbc495dd58407ee8d48ec1004971f249453b8460000000000000000000000000000000009a6ea13f5a5a279ec3bb86cc028a1685d84135ed5fe99cd6b6fb380a42c3af5497e3ba5ea558618487cf953172a376d0000000000000000000000000000000002a36d5efd3381c35ff4f361cd813a96c3e5185141c5985073b45d1319c5f392442b7aa6a253b7eb22d1b5052812be00000000000000000000000000000000000f745dd17966b6befa7f740ea360241162505d6269226ffda90546863d0fff124d8fea13c763cfb69c2f8f12b81d431f0000000000000000000000000000000012ecb4c2f259efb4416025e236108eff7862e54f796605cc7eb12f3e5275c80ef42aadd2acfbf84d5206f6884d8e3eab0000000000000000000000000000000004acd0ba7577ffe37bdeeaf5810b5a8a4a6b51c3c02bec4e0c6f0cfb4f12283120d283c12ecb7e4be7063fefb37a578c0000000000000000000000000000000018b0cd0360c5d5bf8254725c19976345cd84d32d0d770286444fe29dfdbc495dd58407ee8d48ec1004971f249453b8460000000000000000000000000000000009a6ea13f5a5a279ec3bb86cc028a1685d84135ed5fe99cd6b6fb380a42c3af5497e3ba5ea558618487cf953172a376d0000000000000000000000000000000002a36d5efd3381c35ff4f361cd813a96c3e5185141c5985073b45d1319c5f392442b7aa6a253b7eb22d1b5052812be00000000000000000000000000000000000f745dd17966b6befa7f740ea360241162505d6269226ffda90546863d0fff124d8fea13c763cfb69c2f8f12b81d431f0000000000000000000000000000000012ecb4c2f259efb4416025e236108eff7862e54f796605cc7eb12f3e5275c80ef42aadd2acfbf84d5206f6884d8e3eab000000000000000000000000000000001554412fc407e6b6cf3cbcc0c240524d1a0bf9c1335926715ac1c5a5a79ecdf2fdd97c3d828881b3d2f8c0104c85531f0000000000000000000000000000000018b0cd0360c5d5bf8254725c19976345cd84d32d0d770286444fe29dfdbc495dd58407ee8d48ec1004971f249453b8460000000000000000000000000000000009a6ea13f5a5a279ec3bb86cc028a1685d84135ed5fe99cd6b6fb380a42c3af5497e3ba5ea558618487cf953172a376d00000000000000000000000000000000175da48b3c4c64d6eb26b45475ca7240a0923333b1bf7a6ef37c758ddceb0291da8085580f004814972d4afad7ececab000000000000000000000000000000000a8cb418c0192fdb509c33a79feb88c60226ee228a62a2c1be2b8c1ab9a0f711d11c15eae9f030491dcf70ed47e2678c0000000000000000000000000000000012ecb4c2f259efb4416025e236108eff7862e54f796605cc7eb12f3e5275c80ef42aadd2acfbf84d5206f6884d8e3eab0000000000000000000000000000000004acd0ba7577ffe37bdeeaf5810b5a8a4a6b51c3c02bec4e0c6f0cfb4f12283120d283c12ecb7e4be7063fefb37a578c0000000000000000000000000000000018b0cd0360c5d5bf8254725c19976345cd84d32d0d770286444fe29dfdbc495dd58407ee8d48ec1004971f249453b8460000000000000000000000000000000009a6ea13f5a5a279ec3bb86cc028a1685d84135ed5fe99cd6b6fb380a42c3af5497e3ba5ea558618487cf953172a376d00000000000000000000000000000000175da48b3c4c64d6eb26b45475ca7240a0923333b1bf7a6ef37c758ddceb0291da8085580f004814972d4afad7ececab000000000000000000000000000000000a8cb418c0192fdb509c33a79feb88c60226ee228a62a2c1be2b8c1ab9a0f711d11c15eae9f030491dcf70ed47e2678c0000000000000000000000000000000012ecb4c2f259efb4416025e236108eff7862e54f796605cc7eb12f3e5275c80ef42aadd2acfbf84d5206f6884d8e3eab000000000000000000000000000000001554412fc407e6b6cf3cbcc0c240524d1a0bf9c1335926715ac1c5a5a79ecdf2fdd97c3d828881b3d2f8c0104c85531f0000000000000000000000000000000018b0cd0360c5d5bf8254725c19976345cd84d32d0d770286444fe29dfdbc495dd58407ee8d48ec1004971f249453b8460000000000000000000000000000000009a6ea13f5a5a279ec3bb86cc028a1685d84135ed5fe99cd6b6fb380a42c3af5497e3ba5ea558618487cf953172a376d0000000000000000000000000000000002a36d5efd3381c35ff4f361cd813a96c3e5185141c5985073b45d1319c5f392442b7aa6a253b7eb22d1b5052812be00000000000000000000000000000000000f745dd17966b6befa7f740ea360241162505d6269226ffda90546863d0fff124d8fea13c763cfb69c2f8f12b81d431f", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_68", + "Gas": 230000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000010dac3e5885cc55f3e53b3fdd5d28b2d78ceeea2b669757a187de0ce3f28b586e451b119cdb7dc8b97d603f2bb700e2000000000000000000000000000000000712a9656fa95abf8c8c5d0d18a599c4cae3a0ae4bda12c0759ea60fe9f3b698d3c357edebb9f461d95762b1a24e7879000000000000000000000000000000001431c5161fc51024c5708496a1f9545c3d4c05ef9e2c91154e22ebfe251017fc61ba54c679ba2ad6b8314bfd8d6272c900000000000000000000000000000000098f2e8b6d3fcf9fb27e912af57b45d3d35a7c5471b9ea2c85262c0efb44c435cd949f23d7d40f14b6b6d4d92cb8412e000000000000000000000000000000000397dbdcc3edf976e8c507f5e70299da8c7765772115bf8edf7dc9024050c2ed98746c2bf7dd4400ab1fb89af991e43f00000000000000000000000000000000139bd5f917f59e2cb6c41c59024c12cdaf95285f3947b80267f36e3bd2701f9548b561c49003fc5ddeee3fe7bc8f5b5b00000000000000000000000000000000010dac3e5885cc55f3e53b3fdd5d28b2d78ceeea2b669757a187de0ce3f28b586e451b119cdb7dc8b97d603f2bb700e20000000000000000000000000000000012ee6884c9d68bdabe8f4aa92aa613129993aad6a7aafffef1922c910cbd3f8b4ae8a810c59a0b9de0a79d4e5db13232000000000000000000000000000000001431c5161fc51024c5708496a1f9545c3d4c05ef9e2c91154e22ebfe251017fc61ba54c679ba2ad6b8314bfd8d6272c900000000000000000000000000000000098f2e8b6d3fcf9fb27e912af57b45d3d35a7c5471b9ea2c85262c0efb44c435cd949f23d7d40f14b6b6d4d92cb8412e000000000000000000000000000000000397dbdcc3edf976e8c507f5e70299da8c7765772115bf8edf7dc9024050c2ed98746c2bf7dd4400ab1fb89af991e43f00000000000000000000000000000000139bd5f917f59e2cb6c41c59024c12cdaf95285f3947b80267f36e3bd2701f9548b561c49003fc5ddeee3fe7bc8f5b5b00000000000000000000000000000000010dac3e5885cc55f3e53b3fdd5d28b2d78ceeea2b669757a187de0ce3f28b586e451b119cdb7dc8b97d603f2bb700e2000000000000000000000000000000000712a9656fa95abf8c8c5d0d18a599c4cae3a0ae4bda12c0759ea60fe9f3b698d3c357edebb9f461d95762b1a24e7879000000000000000000000000000000001431c5161fc51024c5708496a1f9545c3d4c05ef9e2c91154e22ebfe251017fc61ba54c679ba2ad6b8314bfd8d6272c900000000000000000000000000000000098f2e8b6d3fcf9fb27e912af57b45d3d35a7c5471b9ea2c85262c0efb44c435cd949f23d7d40f14b6b6d4d92cb8412e000000000000000000000000000000001669360d7591ed2362569fc05c4912fcd7ffe60dd26f533087b3099eb6603336863793d2b976bbff0edf4765066dc66c0000000000000000000000000000000006653bf1218a486d94578b5d40ff9a09b4e22325ba3d5abcff3d64652440d68ed5f69e3a215003a1db10c01843704f5000000000000000000000000000000000010dac3e5885cc55f3e53b3fdd5d28b2d78ceeea2b669757a187de0ce3f28b586e451b119cdb7dc8b97d603f2bb700e20000000000000000000000000000000012ee6884c9d68bdabe8f4aa92aa613129993aad6a7aafffef1922c910cbd3f8b4ae8a810c59a0b9de0a79d4e5db13232000000000000000000000000000000001431c5161fc51024c5708496a1f9545c3d4c05ef9e2c91154e22ebfe251017fc61ba54c679ba2ad6b8314bfd8d6272c900000000000000000000000000000000098f2e8b6d3fcf9fb27e912af57b45d3d35a7c5471b9ea2c85262c0efb44c435cd949f23d7d40f14b6b6d4d92cb8412e000000000000000000000000000000001669360d7591ed2362569fc05c4912fcd7ffe60dd26f533087b3099eb6603336863793d2b976bbff0edf4765066dc66c0000000000000000000000000000000006653bf1218a486d94578b5d40ff9a09b4e22325ba3d5abcff3d64652440d68ed5f69e3a215003a1db10c01843704f5000000000000000000000000000000000010dac3e5885cc55f3e53b3fdd5d28b2d78ceeea2b669757a187de0ce3f28b586e451b119cdb7dc8b97d603f2bb700e2000000000000000000000000000000000712a9656fa95abf8c8c5d0d18a599c4cae3a0ae4bda12c0759ea60fe9f3b698d3c357edebb9f461d95762b1a24e7879000000000000000000000000000000001431c5161fc51024c5708496a1f9545c3d4c05ef9e2c91154e22ebfe251017fc61ba54c679ba2ad6b8314bfd8d6272c900000000000000000000000000000000098f2e8b6d3fcf9fb27e912af57b45d3d35a7c5471b9ea2c85262c0efb44c435cd949f23d7d40f14b6b6d4d92cb8412e000000000000000000000000000000000397dbdcc3edf976e8c507f5e70299da8c7765772115bf8edf7dc9024050c2ed98746c2bf7dd4400ab1fb89af991e43f00000000000000000000000000000000139bd5f917f59e2cb6c41c59024c12cdaf95285f3947b80267f36e3bd2701f9548b561c49003fc5ddeee3fe7bc8f5b5b", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_69", + "Gas": 230000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001889ef0e20d5ddbeeb4380b97ed7d4be97ef0def051d232598b2459a72845d97fa5c1264802ab18d76b15d8fbd25e55900000000000000000000000000000000135519fb1c21b215b1f982009db41b30d7af69a3fada207e0c915d01c8b1a22df3bf0dc0ad10020c3e4b88a41609e12a000000000000000000000000000000000caecf650a12bb629ebd3b978ef9c2d4486f8ce21d515451ecdf01d27740f41b719d5a952e737c83641953a8c8b3a1bb000000000000000000000000000000001641ca29ff6016af335499dfc7167b3d961a25b7f61008c27b3cb13d3cb28fb5096413b1c7f1ca18e5d3b5017d6fed1b00000000000000000000000000000000197ed996d62fc0628d8ea4adee487df31c794e05e7c327aaa140c6be0109031bb763c5f84bc35a0597dc61e93d23a9bf000000000000000000000000000000001056c1f3c6ae36be26430d142d34b0e807685c79935496414e004cb85900d85a18454bde9c0f2650f19db35eb3dd468d000000000000000000000000000000001889ef0e20d5ddbeeb4380b97ed7d4be97ef0def051d232598b2459a72845d97fa5c1264802ab18d76b15d8fbd25e5590000000000000000000000000000000006abf7ef1d5e3484992225b5a59791a68cc7e1e0f8aaf2415a9f759f2dff53f62aecf23e0443fdf37bb3775be9f5c981000000000000000000000000000000000caecf650a12bb629ebd3b978ef9c2d4486f8ce21d515451ecdf01d27740f41b719d5a952e737c83641953a8c8b3a1bb000000000000000000000000000000001641ca29ff6016af335499dfc7167b3d961a25b7f61008c27b3cb13d3cb28fb5096413b1c7f1ca18e5d3b5017d6fed1b00000000000000000000000000000000197ed996d62fc0628d8ea4adee487df31c794e05e7c327aaa140c6be0109031bb763c5f84bc35a0597dc61e93d23a9bf000000000000000000000000000000001056c1f3c6ae36be26430d142d34b0e807685c79935496414e004cb85900d85a18454bde9c0f2650f19db35eb3dd468d000000000000000000000000000000001889ef0e20d5ddbeeb4380b97ed7d4be97ef0def051d232598b2459a72845d97fa5c1264802ab18d76b15d8fbd25e55900000000000000000000000000000000135519fb1c21b215b1f982009db41b30d7af69a3fada207e0c915d01c8b1a22df3bf0dc0ad10020c3e4b88a41609e12a000000000000000000000000000000000caecf650a12bb629ebd3b978ef9c2d4486f8ce21d515451ecdf01d27740f41b719d5a952e737c83641953a8c8b3a1bb000000000000000000000000000000001641ca29ff6016af335499dfc7167b3d961a25b7f61008c27b3cb13d3cb28fb5096413b1c7f1ca18e5d3b5017d6fed1b000000000000000000000000000000000082385363502637bd8d030855032ee447fdfd7f0bc1eb14c5f00be2f5a7f30867483a066590a5fa22229e16c2dc00ec0000000000000000000000000000000009aa4ff672d1afdc24d89aa21616fbef5d0eef0b60307c7e193085e89db01dca0666b4201544d9aec8614ca14c22641e000000000000000000000000000000001889ef0e20d5ddbeeb4380b97ed7d4be97ef0def051d232598b2459a72845d97fa5c1264802ab18d76b15d8fbd25e5590000000000000000000000000000000006abf7ef1d5e3484992225b5a59791a68cc7e1e0f8aaf2415a9f759f2dff53f62aecf23e0443fdf37bb3775be9f5c981000000000000000000000000000000000caecf650a12bb629ebd3b978ef9c2d4486f8ce21d515451ecdf01d27740f41b719d5a952e737c83641953a8c8b3a1bb000000000000000000000000000000001641ca29ff6016af335499dfc7167b3d961a25b7f61008c27b3cb13d3cb28fb5096413b1c7f1ca18e5d3b5017d6fed1b000000000000000000000000000000000082385363502637bd8d030855032ee447fdfd7f0bc1eb14c5f00be2f5a7f30867483a066590a5fa22229e16c2dc00ec0000000000000000000000000000000009aa4ff672d1afdc24d89aa21616fbef5d0eef0b60307c7e193085e89db01dca0666b4201544d9aec8614ca14c22641e000000000000000000000000000000001889ef0e20d5ddbeeb4380b97ed7d4be97ef0def051d232598b2459a72845d97fa5c1264802ab18d76b15d8fbd25e55900000000000000000000000000000000135519fb1c21b215b1f982009db41b30d7af69a3fada207e0c915d01c8b1a22df3bf0dc0ad10020c3e4b88a41609e12a000000000000000000000000000000000caecf650a12bb629ebd3b978ef9c2d4486f8ce21d515451ecdf01d27740f41b719d5a952e737c83641953a8c8b3a1bb000000000000000000000000000000001641ca29ff6016af335499dfc7167b3d961a25b7f61008c27b3cb13d3cb28fb5096413b1c7f1ca18e5d3b5017d6fed1b00000000000000000000000000000000197ed996d62fc0628d8ea4adee487df31c794e05e7c327aaa140c6be0109031bb763c5f84bc35a0597dc61e93d23a9bf000000000000000000000000000000001056c1f3c6ae36be26430d142d34b0e807685c79935496414e004cb85900d85a18454bde9c0f2650f19db35eb3dd468d", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_70", + "Gas": 230000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000008726a32d489a5ea1c1b314dc4d400d995d0eb8b49d47e65a6ac8fd0e6ec0cda1c637ee314c0c5d1ad72cd3588ebf925000000000000000000000000000000001849697df83d625fc5cdd722c76faf542a42506fc3479d8127eee7af57611c7d6f33a7f9dba5d3c420fab33ec19305f50000000000000000000000000000000009c7164f8d40c7e9ca571c46f8edf1c4a961779e55f6b10ffc44d76da78adadb83195d757949be39631c6a53d2d67fae0000000000000000000000000000000012cd5149125e7cc21bb5349be7fe03d5854ee73ba515021b6dc87e81ce1e1fa3e386fcb0de80977b9329e72ad54f929f0000000000000000000000000000000008789ffe0a8676c6a56742a30a48e5e65b88aafd71859d704fb9f69e5e274ccb6942bc51ad36c5671406052aacf19df9000000000000000000000000000000000c7607f4fc69a25aff00a54369f213c4587404644358da4abf26d151dfa4905ba9731dcfb12e2a3f2c551cacd0f4e47f0000000000000000000000000000000008726a32d489a5ea1c1b314dc4d400d995d0eb8b49d47e65a6ac8fd0e6ec0cda1c637ee314c0c5d1ad72cd3588ebf9250000000000000000000000000000000001b7a86c4142843a854dd0937bdbfd833a34fb15303d753e3f41eaf19f4fd9a6af785804d5ae2c3b99044cc13e6ca4b60000000000000000000000000000000009c7164f8d40c7e9ca571c46f8edf1c4a961779e55f6b10ffc44d76da78adadb83195d757949be39631c6a53d2d67fae0000000000000000000000000000000012cd5149125e7cc21bb5349be7fe03d5854ee73ba515021b6dc87e81ce1e1fa3e386fcb0de80977b9329e72ad54f929f0000000000000000000000000000000008789ffe0a8676c6a56742a30a48e5e65b88aafd71859d704fb9f69e5e274ccb6942bc51ad36c5671406052aacf19df9000000000000000000000000000000000c7607f4fc69a25aff00a54369f213c4587404644358da4abf26d151dfa4905ba9731dcfb12e2a3f2c551cacd0f4e47f0000000000000000000000000000000008726a32d489a5ea1c1b314dc4d400d995d0eb8b49d47e65a6ac8fd0e6ec0cda1c637ee314c0c5d1ad72cd3588ebf925000000000000000000000000000000001849697df83d625fc5cdd722c76faf542a42506fc3479d8127eee7af57611c7d6f33a7f9dba5d3c420fab33ec19305f50000000000000000000000000000000009c7164f8d40c7e9ca571c46f8edf1c4a961779e55f6b10ffc44d76da78adadb83195d757949be39631c6a53d2d67fae0000000000000000000000000000000012cd5149125e7cc21bb5349be7fe03d5854ee73ba515021b6dc87e81ce1e1fa3e386fcb0de80977b9329e72ad54f929f00000000000000000000000000000000118871ec2ef96fd3a5b465133902c6f108eea08781ff754f1776dc029889a958b56943ad041d3a98a5f8fad5530e0cb2000000000000000000000000000000000d8b09f53d16443f4c1b0272d95999130c034720b02c3874a80a014f170c65c87538e22f0025d5c08da9e3532f0ac62c0000000000000000000000000000000008726a32d489a5ea1c1b314dc4d400d995d0eb8b49d47e65a6ac8fd0e6ec0cda1c637ee314c0c5d1ad72cd3588ebf9250000000000000000000000000000000001b7a86c4142843a854dd0937bdbfd833a34fb15303d753e3f41eaf19f4fd9a6af785804d5ae2c3b99044cc13e6ca4b60000000000000000000000000000000009c7164f8d40c7e9ca571c46f8edf1c4a961779e55f6b10ffc44d76da78adadb83195d757949be39631c6a53d2d67fae0000000000000000000000000000000012cd5149125e7cc21bb5349be7fe03d5854ee73ba515021b6dc87e81ce1e1fa3e386fcb0de80977b9329e72ad54f929f00000000000000000000000000000000118871ec2ef96fd3a5b465133902c6f108eea08781ff754f1776dc029889a958b56943ad041d3a98a5f8fad5530e0cb2000000000000000000000000000000000d8b09f53d16443f4c1b0272d95999130c034720b02c3874a80a014f170c65c87538e22f0025d5c08da9e3532f0ac62c0000000000000000000000000000000008726a32d489a5ea1c1b314dc4d400d995d0eb8b49d47e65a6ac8fd0e6ec0cda1c637ee314c0c5d1ad72cd3588ebf925000000000000000000000000000000001849697df83d625fc5cdd722c76faf542a42506fc3479d8127eee7af57611c7d6f33a7f9dba5d3c420fab33ec19305f50000000000000000000000000000000009c7164f8d40c7e9ca571c46f8edf1c4a961779e55f6b10ffc44d76da78adadb83195d757949be39631c6a53d2d67fae0000000000000000000000000000000012cd5149125e7cc21bb5349be7fe03d5854ee73ba515021b6dc87e81ce1e1fa3e386fcb0de80977b9329e72ad54f929f0000000000000000000000000000000008789ffe0a8676c6a56742a30a48e5e65b88aafd71859d704fb9f69e5e274ccb6942bc51ad36c5671406052aacf19df9000000000000000000000000000000000c7607f4fc69a25aff00a54369f213c4587404644358da4abf26d151dfa4905ba9731dcfb12e2a3f2c551cacd0f4e47f", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_71", + "Gas": 230000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001688c63e325569855bc2e51d668cef112b2479efa33519fe7f45eab89e275e2c4652cf8c2814f179935ccf1d24d8bd0f0000000000000000000000000000000011ebf7d4984237ac0173807f31be64575e7cccb36ce94e666e8149b9c292ebdb68d30ed4ba68f8e00982ee7780b2567300000000000000000000000000000000093c423917d10edc429acd927def56ab4f07254b3892762aa7056f24224528aa0f528fe8538ca996ca63506c84af73270000000000000000000000000000000003fd3ba68878485e25ccaa2539eed0a97743ae9f5b848e9d83c8ea60f7ad0f1cc6d94a59498f79dcab2bfcc2fdbacfed000000000000000000000000000000000b060965391bfd4afe3271c6ddb91eecb8c7a60451c469d63bb178b1361617000f589c33c35b5deda2f072c6edf2eb370000000000000000000000000000000011c8c988379cd2b82cb8ebd81c3e14d2c01c09dde5690b97623c0876c7554f52ccbaa33d17fb0f0cf331cc85749340cd000000000000000000000000000000001688c63e325569855bc2e51d668cef112b2479efa33519fe7f45eab89e275e2c4652cf8c2814f179935ccf1d24d8bd0f0000000000000000000000000000000008151a15a13daeee49a82737118d488005fa7ed1869bc458f8af88e7341e0a48b5d8f129f6eb071fb07c11887f4d543800000000000000000000000000000000093c423917d10edc429acd927def56ab4f07254b3892762aa7056f24224528aa0f528fe8538ca996ca63506c84af73270000000000000000000000000000000003fd3ba68878485e25ccaa2539eed0a97743ae9f5b848e9d83c8ea60f7ad0f1cc6d94a59498f79dcab2bfcc2fdbacfed000000000000000000000000000000000b060965391bfd4afe3271c6ddb91eecb8c7a60451c469d63bb178b1361617000f589c33c35b5deda2f072c6edf2eb370000000000000000000000000000000011c8c988379cd2b82cb8ebd81c3e14d2c01c09dde5690b97623c0876c7554f52ccbaa33d17fb0f0cf331cc85749340cd000000000000000000000000000000001688c63e325569855bc2e51d668cef112b2479efa33519fe7f45eab89e275e2c4652cf8c2814f179935ccf1d24d8bd0f0000000000000000000000000000000011ebf7d4984237ac0173807f31be64575e7cccb36ce94e666e8149b9c292ebdb68d30ed4ba68f8e00982ee7780b2567300000000000000000000000000000000093c423917d10edc429acd927def56ab4f07254b3892762aa7056f24224528aa0f528fe8538ca996ca63506c84af73270000000000000000000000000000000003fd3ba68878485e25ccaa2539eed0a97743ae9f5b848e9d83c8ea60f7ad0f1cc6d94a59498f79dcab2bfcc2fdbacfed000000000000000000000000000000000efb08850063e94f4ce935ef65928deaabafa580a1c0a8e92b7f59efc09adf240f5363caedf8a212170e8d39120cbf74000000000000000000000000000000000838486201e313e21e62bbde270d9804a45b41a70e1c072804f4ca2a2f5ba6d151f15cc19958f0f2c6cd337a8b6c69de000000000000000000000000000000001688c63e325569855bc2e51d668cef112b2479efa33519fe7f45eab89e275e2c4652cf8c2814f179935ccf1d24d8bd0f0000000000000000000000000000000008151a15a13daeee49a82737118d488005fa7ed1869bc458f8af88e7341e0a48b5d8f129f6eb071fb07c11887f4d543800000000000000000000000000000000093c423917d10edc429acd927def56ab4f07254b3892762aa7056f24224528aa0f528fe8538ca996ca63506c84af73270000000000000000000000000000000003fd3ba68878485e25ccaa2539eed0a97743ae9f5b848e9d83c8ea60f7ad0f1cc6d94a59498f79dcab2bfcc2fdbacfed000000000000000000000000000000000efb08850063e94f4ce935ef65928deaabafa580a1c0a8e92b7f59efc09adf240f5363caedf8a212170e8d39120cbf74000000000000000000000000000000000838486201e313e21e62bbde270d9804a45b41a70e1c072804f4ca2a2f5ba6d151f15cc19958f0f2c6cd337a8b6c69de000000000000000000000000000000001688c63e325569855bc2e51d668cef112b2479efa33519fe7f45eab89e275e2c4652cf8c2814f179935ccf1d24d8bd0f0000000000000000000000000000000011ebf7d4984237ac0173807f31be64575e7cccb36ce94e666e8149b9c292ebdb68d30ed4ba68f8e00982ee7780b2567300000000000000000000000000000000093c423917d10edc429acd927def56ab4f07254b3892762aa7056f24224528aa0f528fe8538ca996ca63506c84af73270000000000000000000000000000000003fd3ba68878485e25ccaa2539eed0a97743ae9f5b848e9d83c8ea60f7ad0f1cc6d94a59498f79dcab2bfcc2fdbacfed000000000000000000000000000000000b060965391bfd4afe3271c6ddb91eecb8c7a60451c469d63bb178b1361617000f589c33c35b5deda2f072c6edf2eb370000000000000000000000000000000011c8c988379cd2b82cb8ebd81c3e14d2c01c09dde5690b97623c0876c7554f52ccbaa33d17fb0f0cf331cc85749340cd", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_72", + "Gas": 230000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000bb6f731b345bb1319b9acab09c186449a51dad8b6526251bc58e958cfd933137067e6f778b019f131cc7b23e08a0706000000000000000000000000000000001979a4f3e444c5950d0e2d71f97e99578b3058a6e414dfca313b898c4e02787e6eed89a2d1b05f31cff4af1e12bbedc300000000000000000000000000000000039d8e90425810a0b2fb5c915905863eb2da363ad4188e42cedce678bdd0f51eca0a96b78ab9e082d59dcd10e3c3c97a000000000000000000000000000000001973250dc31d16f658323d021dddc5439ef4396b6ed735f108cd7b27feb1b508daf863ab6431a77ec0b10cf7e001244f000000000000000000000000000000000f05a111b41a54e0ca78c3a1fff3b80bee7c1505a06b9a4faf36a73b87121d2952cc4f4c4e0dcb6633cad12b0caffc620000000000000000000000000000000018daa0f9a2bb347517eee63463b9d6a5e850446e8a94d0986f2921bf81a9f7541e8fee9d7bbb6d9181021af945fce3e3000000000000000000000000000000000bb6f731b345bb1319b9acab09c186449a51dad8b6526251bc58e958cfd933137067e6f778b019f131cc7b23e08a07060000000000000000000000000000000000876cf6553b21053e0d7a4449cd137fd946f2de0f7032f535f54914a8ae7da5afbe765bdfa3a0cdea0a50e1ed43bce800000000000000000000000000000000039d8e90425810a0b2fb5c915905863eb2da363ad4188e42cedce678bdd0f51eca0a96b78ab9e082d59dcd10e3c3c97a000000000000000000000000000000001973250dc31d16f658323d021dddc5439ef4396b6ed735f108cd7b27feb1b508daf863ab6431a77ec0b10cf7e001244f000000000000000000000000000000000f05a111b41a54e0ca78c3a1fff3b80bee7c1505a06b9a4faf36a73b87121d2952cc4f4c4e0dcb6633cad12b0caffc620000000000000000000000000000000018daa0f9a2bb347517eee63463b9d6a5e850446e8a94d0986f2921bf81a9f7541e8fee9d7bbb6d9181021af945fce3e3000000000000000000000000000000000bb6f731b345bb1319b9acab09c186449a51dad8b6526251bc58e958cfd933137067e6f778b019f131cc7b23e08a0706000000000000000000000000000000001979a4f3e444c5950d0e2d71f97e99578b3058a6e414dfca313b898c4e02787e6eed89a2d1b05f31cff4af1e12bbedc300000000000000000000000000000000039d8e90425810a0b2fb5c915905863eb2da363ad4188e42cedce678bdd0f51eca0a96b78ab9e082d59dcd10e3c3c97a000000000000000000000000000000001973250dc31d16f658323d021dddc5439ef4396b6ed735f108cd7b27feb1b508daf863ab6431a77ec0b10cf7e001244f000000000000000000000000000000000afb70d8856591b980a2e4144357f4cb75fb367f5319786fb7fa2b656f9ed8facbdfb0b26346349986342ed4f34fae4900000000000000000000000000000000012670f096c4b225332cc181df91d6317c27071668f04226f807b0e17506fed0001c11613598926e38fce506ba02c6c8000000000000000000000000000000000bb6f731b345bb1319b9acab09c186449a51dad8b6526251bc58e958cfd933137067e6f778b019f131cc7b23e08a07060000000000000000000000000000000000876cf6553b21053e0d7a4449cd137fd946f2de0f7032f535f54914a8ae7da5afbe765bdfa3a0cdea0a50e1ed43bce800000000000000000000000000000000039d8e90425810a0b2fb5c915905863eb2da363ad4188e42cedce678bdd0f51eca0a96b78ab9e082d59dcd10e3c3c97a000000000000000000000000000000001973250dc31d16f658323d021dddc5439ef4396b6ed735f108cd7b27feb1b508daf863ab6431a77ec0b10cf7e001244f000000000000000000000000000000000afb70d8856591b980a2e4144357f4cb75fb367f5319786fb7fa2b656f9ed8facbdfb0b26346349986342ed4f34fae4900000000000000000000000000000000012670f096c4b225332cc181df91d6317c27071668f04226f807b0e17506fed0001c11613598926e38fce506ba02c6c8000000000000000000000000000000000bb6f731b345bb1319b9acab09c186449a51dad8b6526251bc58e958cfd933137067e6f778b019f131cc7b23e08a0706000000000000000000000000000000001979a4f3e444c5950d0e2d71f97e99578b3058a6e414dfca313b898c4e02787e6eed89a2d1b05f31cff4af1e12bbedc300000000000000000000000000000000039d8e90425810a0b2fb5c915905863eb2da363ad4188e42cedce678bdd0f51eca0a96b78ab9e082d59dcd10e3c3c97a000000000000000000000000000000001973250dc31d16f658323d021dddc5439ef4396b6ed735f108cd7b27feb1b508daf863ab6431a77ec0b10cf7e001244f000000000000000000000000000000000f05a111b41a54e0ca78c3a1fff3b80bee7c1505a06b9a4faf36a73b87121d2952cc4f4c4e0dcb6633cad12b0caffc620000000000000000000000000000000018daa0f9a2bb347517eee63463b9d6a5e850446e8a94d0986f2921bf81a9f7541e8fee9d7bbb6d9181021af945fce3e3", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_73", + "Gas": 230000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000078cca0bfd6957f9aff9731b45fdbdbeca6691f6fe6bf0b7847859c77478037e14864b202b235953ac7da231367324c200000000000000000000000000000000096ddc8631aff282d14d1878ef6bc537159abe9dda5732d0b2fe3668e184049cc19e05fec4666a0df204182edb9b0b8a000000000000000000000000000000000eff44a5e3b9fc8ffe31771fbcabea6efbd68384c5931216a2b7465aaa2566ee116b7daeea632677f35379107f7334f0000000000000000000000000000000000c3c942373f69c2c9631cef1c6bbb1a4567d5b95500409d4f2c6bf4a66ee263e6f167e22790badea0eac4a541a9035050000000000000000000000000000000017d9e9e2008501981068cb0403e73c270d99defd468cc9dc2d5bbc57750a4a58236f8f7a8df4f8b607095b6a80e7de49000000000000000000000000000000000ebddf4fc74f25be3c358b72a20d1c093f980adfc943b898266592f691e11413c60151a0085d6c9aec8c2d329abbac0d00000000000000000000000000000000078cca0bfd6957f9aff9731b45fdbdbeca6691f6fe6bf0b7847859c77478037e14864b202b235953ac7da231367324c2000000000000000000000000000000001093356407cff41779ce8f3d53dfe7a04edc8ce7192ddfeeb4329c38152cf1875d0df9ffeced95f1c7fae7d124649f21000000000000000000000000000000000eff44a5e3b9fc8ffe31771fbcabea6efbd68384c5931216a2b7465aaa2566ee116b7daeea632677f35379107f7334f0000000000000000000000000000000000c3c942373f69c2c9631cef1c6bbb1a4567d5b95500409d4f2c6bf4a66ee263e6f167e22790badea0eac4a541a9035050000000000000000000000000000000017d9e9e2008501981068cb0403e73c270d99defd468cc9dc2d5bbc57750a4a58236f8f7a8df4f8b607095b6a80e7de49000000000000000000000000000000000ebddf4fc74f25be3c358b72a20d1c093f980adfc943b898266592f691e11413c60151a0085d6c9aec8c2d329abbac0d00000000000000000000000000000000078cca0bfd6957f9aff9731b45fdbdbeca6691f6fe6bf0b7847859c77478037e14864b202b235953ac7da231367324c200000000000000000000000000000000096ddc8631aff282d14d1878ef6bc537159abe9dda5732d0b2fe3668e184049cc19e05fec4666a0df204182edb9b0b8a000000000000000000000000000000000eff44a5e3b9fc8ffe31771fbcabea6efbd68384c5931216a2b7465aaa2566ee116b7daeea632677f35379107f7334f0000000000000000000000000000000000c3c942373f69c2c9631cef1c6bbb1a4567d5b95500409d4f2c6bf4a66ee263e6f167e22790badea0eac4a541a903505000000000000000000000000000000000227280838fae5023ab2dcb23f6470b056dd6c87acf848e339d5164981a6abcbfb3c7084235f0749b2f5a4957f17cc62000000000000000000000000000000000b43329a7230c0dc0ee61c43a13e90ce24df40a52a415a2740cb3faa64cfe21058aaae5ea8f69364cd72d2cd6543fe9e00000000000000000000000000000000078cca0bfd6957f9aff9731b45fdbdbeca6691f6fe6bf0b7847859c77478037e14864b202b235953ac7da231367324c2000000000000000000000000000000001093356407cff41779ce8f3d53dfe7a04edc8ce7192ddfeeb4329c38152cf1875d0df9ffeced95f1c7fae7d124649f21000000000000000000000000000000000eff44a5e3b9fc8ffe31771fbcabea6efbd68384c5931216a2b7465aaa2566ee116b7daeea632677f35379107f7334f0000000000000000000000000000000000c3c942373f69c2c9631cef1c6bbb1a4567d5b95500409d4f2c6bf4a66ee263e6f167e22790badea0eac4a541a903505000000000000000000000000000000000227280838fae5023ab2dcb23f6470b056dd6c87acf848e339d5164981a6abcbfb3c7084235f0749b2f5a4957f17cc62000000000000000000000000000000000b43329a7230c0dc0ee61c43a13e90ce24df40a52a415a2740cb3faa64cfe21058aaae5ea8f69364cd72d2cd6543fe9e00000000000000000000000000000000078cca0bfd6957f9aff9731b45fdbdbeca6691f6fe6bf0b7847859c77478037e14864b202b235953ac7da231367324c200000000000000000000000000000000096ddc8631aff282d14d1878ef6bc537159abe9dda5732d0b2fe3668e184049cc19e05fec4666a0df204182edb9b0b8a000000000000000000000000000000000eff44a5e3b9fc8ffe31771fbcabea6efbd68384c5931216a2b7465aaa2566ee116b7daeea632677f35379107f7334f0000000000000000000000000000000000c3c942373f69c2c9631cef1c6bbb1a4567d5b95500409d4f2c6bf4a66ee263e6f167e22790badea0eac4a541a9035050000000000000000000000000000000017d9e9e2008501981068cb0403e73c270d99defd468cc9dc2d5bbc57750a4a58236f8f7a8df4f8b607095b6a80e7de49000000000000000000000000000000000ebddf4fc74f25be3c358b72a20d1c093f980adfc943b898266592f691e11413c60151a0085d6c9aec8c2d329abbac0d", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_74", + "Gas": 230000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000b3a1dfe2d1b62538ed49648cb2a8a1d66bdc4f7a492eee59942ab810a306876a7d49e5ac4c6bb1613866c158ded993e000000000000000000000000000000001300956110f47ca8e2aacb30c948dfd046bf33f69bf54007d76373c5a66019454da45e3cf14ce2b9d53a50c9b4366aa300000000000000000000000000000000081da74d812a6718e351c062e93f9edb24eff830be5c44c3f21cca606f5b1287de8ba65a60d42cbf9740c9522fcdc9eb000000000000000000000000000000000eb1d38fd394b7e78dfaeb3b3b97d3d928c16472ee74ae0be1ec3efa510b9bb64cec369793219ceab55a0ed0ece23de80000000000000000000000000000000001fdc4256cc997934a65c68ab9767b09c7aad14b5765dbeedb72ab2429231cb333ab9f9143414359376d76857e8972d9000000000000000000000000000000001362f417875259b47cfd9e4c5feda52b949dcbf5b8178318428fd3e70c384020e58f515b9a24af5597cfa037d42491c6000000000000000000000000000000000b3a1dfe2d1b62538ed49648cb2a8a1d66bdc4f7a492eee59942ab810a306876a7d49e5ac4c6bb1613866c158ded993e0000000000000000000000000000000007007c89288b69f16870dc857a02cd071db8178e578fd2b78fcd5edb5050dcded107a1c1c0071d45e4c4af364bc9400800000000000000000000000000000000081da74d812a6718e351c062e93f9edb24eff830be5c44c3f21cca606f5b1287de8ba65a60d42cbf9740c9522fcdc9eb000000000000000000000000000000000eb1d38fd394b7e78dfaeb3b3b97d3d928c16472ee74ae0be1ec3efa510b9bb64cec369793219ceab55a0ed0ece23de80000000000000000000000000000000001fdc4256cc997934a65c68ab9767b09c7aad14b5765dbeedb72ab2429231cb333ab9f9143414359376d76857e8972d9000000000000000000000000000000001362f417875259b47cfd9e4c5feda52b949dcbf5b8178318428fd3e70c384020e58f515b9a24af5597cfa037d42491c6000000000000000000000000000000000b3a1dfe2d1b62538ed49648cb2a8a1d66bdc4f7a492eee59942ab810a306876a7d49e5ac4c6bb1613866c158ded993e000000000000000000000000000000001300956110f47ca8e2aacb30c948dfd046bf33f69bf54007d76373c5a66019454da45e3cf14ce2b9d53a50c9b4366aa300000000000000000000000000000000081da74d812a6718e351c062e93f9edb24eff830be5c44c3f21cca606f5b1287de8ba65a60d42cbf9740c9522fcdc9eb000000000000000000000000000000000eb1d38fd394b7e78dfaeb3b3b97d3d928c16472ee74ae0be1ec3efa510b9bb64cec369793219ceab55a0ed0ece23de80000000000000000000000000000000018034dc4ccb64f0700b5e12b89d531cd9ccc7a399c1f36d08bbe277ccd8dd970eb00606d6e12bca68291897a817637d200000000000000000000000000000000069e1dd2b22d8ce5ce1e0969e35e07abcfd97f8f3b6d8fa724a0feb9ea78b603391caea3172f50aa222f5fc82bdb18e5000000000000000000000000000000000b3a1dfe2d1b62538ed49648cb2a8a1d66bdc4f7a492eee59942ab810a306876a7d49e5ac4c6bb1613866c158ded993e0000000000000000000000000000000007007c89288b69f16870dc857a02cd071db8178e578fd2b78fcd5edb5050dcded107a1c1c0071d45e4c4af364bc9400800000000000000000000000000000000081da74d812a6718e351c062e93f9edb24eff830be5c44c3f21cca606f5b1287de8ba65a60d42cbf9740c9522fcdc9eb000000000000000000000000000000000eb1d38fd394b7e78dfaeb3b3b97d3d928c16472ee74ae0be1ec3efa510b9bb64cec369793219ceab55a0ed0ece23de80000000000000000000000000000000018034dc4ccb64f0700b5e12b89d531cd9ccc7a399c1f36d08bbe277ccd8dd970eb00606d6e12bca68291897a817637d200000000000000000000000000000000069e1dd2b22d8ce5ce1e0969e35e07abcfd97f8f3b6d8fa724a0feb9ea78b603391caea3172f50aa222f5fc82bdb18e5000000000000000000000000000000000b3a1dfe2d1b62538ed49648cb2a8a1d66bdc4f7a492eee59942ab810a306876a7d49e5ac4c6bb1613866c158ded993e000000000000000000000000000000001300956110f47ca8e2aacb30c948dfd046bf33f69bf54007d76373c5a66019454da45e3cf14ce2b9d53a50c9b4366aa300000000000000000000000000000000081da74d812a6718e351c062e93f9edb24eff830be5c44c3f21cca606f5b1287de8ba65a60d42cbf9740c9522fcdc9eb000000000000000000000000000000000eb1d38fd394b7e78dfaeb3b3b97d3d928c16472ee74ae0be1ec3efa510b9bb64cec369793219ceab55a0ed0ece23de80000000000000000000000000000000001fdc4256cc997934a65c68ab9767b09c7aad14b5765dbeedb72ab2429231cb333ab9f9143414359376d76857e8972d9000000000000000000000000000000001362f417875259b47cfd9e4c5feda52b949dcbf5b8178318428fd3e70c384020e58f515b9a24af5597cfa037d42491c6", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_75", + "Gas": 230000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000007c00b3e7e50a860e99cdc92235f45a555c343304a067a71b6aaade016ef99bc50e3b2c5e3335d4bdacb816d3c765630000000000000000000000000000000000f8a45100cd8afcbb7c05c2d62bfedbf250d68d0fde0a1593cd2ed2f5f4278e1baa9e24625c263764e4347ed78cce6c8000000000000000000000000000000000b8e764aa5afa4a6e8227d1bc720eeffd72d963458a4963a3bbe697d3da11186a30d90f7a4eda5630f6967095816913300000000000000000000000000000000085d05b570cd58def6ac2f7e80dc18658dc5d0e6a1f5a5cf4d18745e03494654eb1a6d5399ec2c5288890ade446317d00000000000000000000000000000000010fb029e35b3f6e156b8751415f180ee3960cd3bb6ba9b8e456715ec70b1ba1410b8bfb77998f744d3f462533b59e26c000000000000000000000000000000001472654d9aa210a41d74e3661e05a9eb6b292719b46aa65f94b6abd514bf05f679dae89d21008245d79a381b0d7f51be0000000000000000000000000000000007c00b3e7e50a860e99cdc92235f45a555c343304a067a71b6aaade016ef99bc50e3b2c5e3335d4bdacb816d3c765630000000000000000000000000000000000a76ccda2ca736ce935b4b88e08bbf183f69e2b3f5a471662a5de571976e7d4264021db88b919c896bbbb8128732c3e3000000000000000000000000000000000b8e764aa5afa4a6e8227d1bc720eeffd72d963458a4963a3bbe697d3da11186a30d90f7a4eda5630f6967095816913300000000000000000000000000000000085d05b570cd58def6ac2f7e80dc18658dc5d0e6a1f5a5cf4d18745e03494654eb1a6d5399ec2c5288890ade446317d00000000000000000000000000000000010fb029e35b3f6e156b8751415f180ee3960cd3bb6ba9b8e456715ec70b1ba1410b8bfb77998f744d3f462533b59e26c000000000000000000000000000000001472654d9aa210a41d74e3661e05a9eb6b292719b46aa65f94b6abd514bf05f679dae89d21008245d79a381b0d7f51be0000000000000000000000000000000007c00b3e7e50a860e99cdc92235f45a555c343304a067a71b6aaade016ef99bc50e3b2c5e3335d4bdacb816d3c765630000000000000000000000000000000000f8a45100cd8afcbb7c05c2d62bfedbf250d68d0fde0a1593cd2ed2f5f4278e1baa9e24625c263764e4347ed78cce6c8000000000000000000000000000000000b8e764aa5afa4a6e8227d1bc720eeffd72d963458a4963a3bbe697d3da11186a30d90f7a4eda5630f6967095816913300000000000000000000000000000000085d05b570cd58def6ac2f7e80dc18658dc5d0e6a1f5a5cf4d18745e03494654eb1a6d5399ec2c5288890ade446317d00000000000000000000000000000000009060f4c03cbefb8f46332a22d5a2be92b167e493cca773121c9bcb485ff3c100df3404737bb08bae60a9dacc4a5c83f00000000000000000000000000000000058eac9c9eddd5f62da6c450254602ebf94e246b3f1a6c5fd27a26cbe1f1f02da4d1176190537db9e264c7e4f28058ed0000000000000000000000000000000007c00b3e7e50a860e99cdc92235f45a555c343304a067a71b6aaade016ef99bc50e3b2c5e3335d4bdacb816d3c765630000000000000000000000000000000000a76ccda2ca736ce935b4b88e08bbf183f69e2b3f5a471662a5de571976e7d4264021db88b919c896bbbb8128732c3e3000000000000000000000000000000000b8e764aa5afa4a6e8227d1bc720eeffd72d963458a4963a3bbe697d3da11186a30d90f7a4eda5630f6967095816913300000000000000000000000000000000085d05b570cd58def6ac2f7e80dc18658dc5d0e6a1f5a5cf4d18745e03494654eb1a6d5399ec2c5288890ade446317d00000000000000000000000000000000009060f4c03cbefb8f46332a22d5a2be92b167e493cca773121c9bcb485ff3c100df3404737bb08bae60a9dacc4a5c83f00000000000000000000000000000000058eac9c9eddd5f62da6c450254602ebf94e246b3f1a6c5fd27a26cbe1f1f02da4d1176190537db9e264c7e4f28058ed0000000000000000000000000000000007c00b3e7e50a860e99cdc92235f45a555c343304a067a71b6aaade016ef99bc50e3b2c5e3335d4bdacb816d3c765630000000000000000000000000000000000f8a45100cd8afcbb7c05c2d62bfedbf250d68d0fde0a1593cd2ed2f5f4278e1baa9e24625c263764e4347ed78cce6c8000000000000000000000000000000000b8e764aa5afa4a6e8227d1bc720eeffd72d963458a4963a3bbe697d3da11186a30d90f7a4eda5630f6967095816913300000000000000000000000000000000085d05b570cd58def6ac2f7e80dc18658dc5d0e6a1f5a5cf4d18745e03494654eb1a6d5399ec2c5288890ade446317d00000000000000000000000000000000010fb029e35b3f6e156b8751415f180ee3960cd3bb6ba9b8e456715ec70b1ba1410b8bfb77998f744d3f462533b59e26c000000000000000000000000000000001472654d9aa210a41d74e3661e05a9eb6b292719b46aa65f94b6abd514bf05f679dae89d21008245d79a381b0d7f51be", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_76", + "Gas": 230000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001517dd04b165c50d2b1ef2f470c821c080f604fe1a23f2fa5481f3a63e0f56e05c89c7403d4067a5f6e59d4a338d0b5c0000000000000000000000000000000007b6b1d032aadd51052f228d7e062e336bacda83bbce657678b5f9634174f0c3c4d0374e83b520a192783a8a5f3fb21100000000000000000000000000000000042280b112fdbbd94f647e5b1f4b51d864f85063a5b66e1f1fe5b1a8d280f9bf1db81ad3588f93f8801ff1a3f66b96330000000000000000000000000000000001e0887904228790d03d8b6d17bebdd8659deafa2ebd9b07069ce89fe228824a39966953d14dda1bd6ccce5faf16e4d7000000000000000000000000000000000520cfc8c536a1d4e685c4eacbc2000d70abd72e1bf8ce3839d79f5cfa069ed31aafb15542f23b8d1af678bab05a2d410000000000000000000000000000000017cfffda12d21c98b79ac31c5bb696783afb7d69c2bedf0fb070cf7714959db14957a4763564b65b7ed214d7b48d399c000000000000000000000000000000001517dd04b165c50d2b1ef2f470c821c080f604fe1a23f2fa5481f3a63e0f56e05c89c7403d4067a5f6e59d4a338d0b5c00000000000000000000000000000000124a601a06d5094945ec8528c5457ea3f8ca710137b6ad48ee7ad93db53c056059dbc8b02d9edf5e2786c575a0bff89a00000000000000000000000000000000042280b112fdbbd94f647e5b1f4b51d864f85063a5b66e1f1fe5b1a8d280f9bf1db81ad3588f93f8801ff1a3f66b96330000000000000000000000000000000001e0887904228790d03d8b6d17bebdd8659deafa2ebd9b07069ce89fe228824a39966953d14dda1bd6ccce5faf16e4d7000000000000000000000000000000000520cfc8c536a1d4e685c4eacbc2000d70abd72e1bf8ce3839d79f5cfa069ed31aafb15542f23b8d1af678bab05a2d410000000000000000000000000000000017cfffda12d21c98b79ac31c5bb696783afb7d69c2bedf0fb070cf7714959db14957a4763564b65b7ed214d7b48d399c000000000000000000000000000000001517dd04b165c50d2b1ef2f470c821c080f604fe1a23f2fa5481f3a63e0f56e05c89c7403d4067a5f6e59d4a338d0b5c0000000000000000000000000000000007b6b1d032aadd51052f228d7e062e336bacda83bbce657678b5f9634174f0c3c4d0374e83b520a192783a8a5f3fb21100000000000000000000000000000000042280b112fdbbd94f647e5b1f4b51d864f85063a5b66e1f1fe5b1a8d280f9bf1db81ad3588f93f8801ff1a3f66b96330000000000000000000000000000000001e0887904228790d03d8b6d17bebdd8659deafa2ebd9b07069ce89fe228824a39966953d14dda1bd6ccce5faf16e4d70000000000000000000000000000000014e04221744944c56495e2cb7789acc9f3cb7456d78c44872d593343fcaa575103fc4ea96e61c4729f0887454fa57d6a000000000000000000000000000000000231121026adca019380e499e795165f297bce1b30c633afb6c00329e21b5872d5545b887bef49a43b2ceb284b72710f000000000000000000000000000000001517dd04b165c50d2b1ef2f470c821c080f604fe1a23f2fa5481f3a63e0f56e05c89c7403d4067a5f6e59d4a338d0b5c00000000000000000000000000000000124a601a06d5094945ec8528c5457ea3f8ca710137b6ad48ee7ad93db53c056059dbc8b02d9edf5e2786c575a0bff89a00000000000000000000000000000000042280b112fdbbd94f647e5b1f4b51d864f85063a5b66e1f1fe5b1a8d280f9bf1db81ad3588f93f8801ff1a3f66b96330000000000000000000000000000000001e0887904228790d03d8b6d17bebdd8659deafa2ebd9b07069ce89fe228824a39966953d14dda1bd6ccce5faf16e4d70000000000000000000000000000000014e04221744944c56495e2cb7789acc9f3cb7456d78c44872d593343fcaa575103fc4ea96e61c4729f0887454fa57d6a000000000000000000000000000000000231121026adca019380e499e795165f297bce1b30c633afb6c00329e21b5872d5545b887bef49a43b2ceb284b72710f000000000000000000000000000000001517dd04b165c50d2b1ef2f470c821c080f604fe1a23f2fa5481f3a63e0f56e05c89c7403d4067a5f6e59d4a338d0b5c0000000000000000000000000000000007b6b1d032aadd51052f228d7e062e336bacda83bbce657678b5f9634174f0c3c4d0374e83b520a192783a8a5f3fb21100000000000000000000000000000000042280b112fdbbd94f647e5b1f4b51d864f85063a5b66e1f1fe5b1a8d280f9bf1db81ad3588f93f8801ff1a3f66b96330000000000000000000000000000000001e0887904228790d03d8b6d17bebdd8659deafa2ebd9b07069ce89fe228824a39966953d14dda1bd6ccce5faf16e4d7000000000000000000000000000000000520cfc8c536a1d4e685c4eacbc2000d70abd72e1bf8ce3839d79f5cfa069ed31aafb15542f23b8d1af678bab05a2d410000000000000000000000000000000017cfffda12d21c98b79ac31c5bb696783afb7d69c2bedf0fb070cf7714959db14957a4763564b65b7ed214d7b48d399c", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_77", + "Gas": 230000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000475e66c9e4e434c4872b8537e0ab930165b39f41e04b208d74d3033e1d69dfb4b134ae3a9dc46347d30a6805508c0420000000000000000000000000000000019e585e1d9adf34a98a7cd38de35aa243d7853c19bc21747213c11240d5fa41ff3b21ae033dd664aaac8fa45354a470a00000000000000000000000000000000137e91115129cbaa1ae2bbb79abe5505436bb51ddceeb011d56dc5c3c396b6b00067d6e6108bafca40fc717737487b27000000000000000000000000000000001592fec7d33bffa7f3eebf038e3194513736cc41a143471fb8c55a44c7521c07e4d8368e5c6ee21ed0478f949f3e224e0000000000000000000000000000000007f786ea1cc7cd69ae1061d6b914278dfc7ebe8a714aa8cd04323860314c3b4b36054169dd5c6c60e67bfa3902d216f50000000000000000000000000000000019675b09a4de34af3c6e79452b57b31b6d499200e996008a9e7d1c910ca0ad2a352dc39cb3fd7333182476095b7aeec3000000000000000000000000000000000475e66c9e4e434c4872b8537e0ab930165b39f41e04b208d74d3033e1d69dfb4b134ae3a9dc46347d30a6805508c04200000000000000000000000000000000001b8c085fd1f34fb273da7d651602b326fef7c357c2fb7845f4c17ce95152042af9e51e7d7699b50f3605bacab563a100000000000000000000000000000000137e91115129cbaa1ae2bbb79abe5505436bb51ddceeb011d56dc5c3c396b6b00067d6e6108bafca40fc717737487b27000000000000000000000000000000001592fec7d33bffa7f3eebf038e3194513736cc41a143471fb8c55a44c7521c07e4d8368e5c6ee21ed0478f949f3e224e0000000000000000000000000000000007f786ea1cc7cd69ae1061d6b914278dfc7ebe8a714aa8cd04323860314c3b4b36054169dd5c6c60e67bfa3902d216f50000000000000000000000000000000019675b09a4de34af3c6e79452b57b31b6d499200e996008a9e7d1c910ca0ad2a352dc39cb3fd7333182476095b7aeec3000000000000000000000000000000000475e66c9e4e434c4872b8537e0ab930165b39f41e04b208d74d3033e1d69dfb4b134ae3a9dc46347d30a6805508c0420000000000000000000000000000000019e585e1d9adf34a98a7cd38de35aa243d7853c19bc21747213c11240d5fa41ff3b21ae033dd664aaac8fa45354a470a00000000000000000000000000000000137e91115129cbaa1ae2bbb79abe5505436bb51ddceeb011d56dc5c3c396b6b00067d6e6108bafca40fc717737487b27000000000000000000000000000000001592fec7d33bffa7f3eebf038e3194513736cc41a143471fb8c55a44c7521c07e4d8368e5c6ee21ed0478f949f3e224e0000000000000000000000000000000012098b001cb819309d0b45df8a37854967f88cfa823a69f262fe9a40c564bad8e8a6be94d3f7939ed38305c6fd2d93b6000000000000000000000000000000000099b6e094a1b1eb0ead2e7117f3f9bbf72db98409ef1234c8b3b60fea1048f9e97e3c61fd568ccca1da89f6a484bbe8000000000000000000000000000000000475e66c9e4e434c4872b8537e0ab930165b39f41e04b208d74d3033e1d69dfb4b134ae3a9dc46347d30a6805508c04200000000000000000000000000000000001b8c085fd1f34fb273da7d651602b326fef7c357c2fb7845f4c17ce95152042af9e51e7d7699b50f3605bacab563a100000000000000000000000000000000137e91115129cbaa1ae2bbb79abe5505436bb51ddceeb011d56dc5c3c396b6b00067d6e6108bafca40fc717737487b27000000000000000000000000000000001592fec7d33bffa7f3eebf038e3194513736cc41a143471fb8c55a44c7521c07e4d8368e5c6ee21ed0478f949f3e224e0000000000000000000000000000000012098b001cb819309d0b45df8a37854967f88cfa823a69f262fe9a40c564bad8e8a6be94d3f7939ed38305c6fd2d93b6000000000000000000000000000000000099b6e094a1b1eb0ead2e7117f3f9bbf72db98409ef1234c8b3b60fea1048f9e97e3c61fd568ccca1da89f6a484bbe8000000000000000000000000000000000475e66c9e4e434c4872b8537e0ab930165b39f41e04b208d74d3033e1d69dfb4b134ae3a9dc46347d30a6805508c0420000000000000000000000000000000019e585e1d9adf34a98a7cd38de35aa243d7853c19bc21747213c11240d5fa41ff3b21ae033dd664aaac8fa45354a470a00000000000000000000000000000000137e91115129cbaa1ae2bbb79abe5505436bb51ddceeb011d56dc5c3c396b6b00067d6e6108bafca40fc717737487b27000000000000000000000000000000001592fec7d33bffa7f3eebf038e3194513736cc41a143471fb8c55a44c7521c07e4d8368e5c6ee21ed0478f949f3e224e0000000000000000000000000000000007f786ea1cc7cd69ae1061d6b914278dfc7ebe8a714aa8cd04323860314c3b4b36054169dd5c6c60e67bfa3902d216f50000000000000000000000000000000019675b09a4de34af3c6e79452b57b31b6d499200e996008a9e7d1c910ca0ad2a352dc39cb3fd7333182476095b7aeec3", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_78", + "Gas": 230000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000002291ff240598e2c129ea12292e4a2fc86e03da9bd9fbbb8bddd6f25797003a4688ba2ed3bafd8dfcf0ddd44c3288c1e000000000000000000000000000000000d7541c9c54a95f3789ca7637348378f8956fd451c3266c8f1a34906bf1cf8e7499fcf8ad1f1a73dafcf71b86833ff3b0000000000000000000000000000000016aed55f56416b8f450283c4afea4c606100eed9bf7b8fea9ab4d04797a7bfe3bf0f10cf229f8ce3156869d75beabe6b0000000000000000000000000000000007e5c03e51a513c6f77179bcb5f7d147dcee32426b4365b1c95f434be7f83a5883d1ee5b0e01a636b3e5377542314b75000000000000000000000000000000000fbe421858e4109c51de57b77da4f9c4c1f950099532d9e30e2f7a8b8b4fb9f708cde1a497050d0944e089978b15321e0000000000000000000000000000000019f48a0bf0f27df65ba766a65e831a0801a4ebcd1995a6002a803f88aead1503b7c39fde8ef5c4672020307241958a880000000000000000000000000000000002291ff240598e2c129ea12292e4a2fc86e03da9bd9fbbb8bddd6f25797003a4688ba2ed3bafd8dfcf0ddd44c3288c1e000000000000000000000000000000000c8bd020743550a6d27f0052d0037547db204e3fd752abf6758d899a3793fd3cd50c3073df6258c20a2f8e4797cbab700000000000000000000000000000000016aed55f56416b8f450283c4afea4c606100eed9bf7b8fea9ab4d04797a7bfe3bf0f10cf229f8ce3156869d75beabe6b0000000000000000000000000000000007e5c03e51a513c6f77179bcb5f7d147dcee32426b4365b1c95f434be7f83a5883d1ee5b0e01a636b3e5377542314b75000000000000000000000000000000000fbe421858e4109c51de57b77da4f9c4c1f950099532d9e30e2f7a8b8b4fb9f708cde1a497050d0944e089978b15321e0000000000000000000000000000000019f48a0bf0f27df65ba766a65e831a0801a4ebcd1995a6002a803f88aead1503b7c39fde8ef5c4672020307241958a880000000000000000000000000000000002291ff240598e2c129ea12292e4a2fc86e03da9bd9fbbb8bddd6f25797003a4688ba2ed3bafd8dfcf0ddd44c3288c1e000000000000000000000000000000000d7541c9c54a95f3789ca7637348378f8956fd451c3266c8f1a34906bf1cf8e7499fcf8ad1f1a73dafcf71b86833ff3b0000000000000000000000000000000016aed55f56416b8f450283c4afea4c606100eed9bf7b8fea9ab4d04797a7bfe3bf0f10cf229f8ce3156869d75beabe6b0000000000000000000000000000000007e5c03e51a513c6f77179bcb5f7d147dcee32426b4365b1c95f434be7f83a5883d1ee5b0e01a636b3e5377542314b75000000000000000000000000000000000a42cfd1e09bd5fdf93d4ffec5a6b312a27dfb7b5e5238dc590158156b613c2d15de1e5a1a4ef2f6751e766874ea788d00000000000000000000000000000000000c87de488d68a3ef74410fe4c892cf62d25fb7d9ef6cbf3cb093184803e12066e86020225e3b9899decf8dbe6a20230000000000000000000000000000000002291ff240598e2c129ea12292e4a2fc86e03da9bd9fbbb8bddd6f25797003a4688ba2ed3bafd8dfcf0ddd44c3288c1e000000000000000000000000000000000c8bd020743550a6d27f0052d0037547db204e3fd752abf6758d899a3793fd3cd50c3073df6258c20a2f8e4797cbab700000000000000000000000000000000016aed55f56416b8f450283c4afea4c606100eed9bf7b8fea9ab4d04797a7bfe3bf0f10cf229f8ce3156869d75beabe6b0000000000000000000000000000000007e5c03e51a513c6f77179bcb5f7d147dcee32426b4365b1c95f434be7f83a5883d1ee5b0e01a636b3e5377542314b75000000000000000000000000000000000a42cfd1e09bd5fdf93d4ffec5a6b312a27dfb7b5e5238dc590158156b613c2d15de1e5a1a4ef2f6751e766874ea788d00000000000000000000000000000000000c87de488d68a3ef74410fe4c892cf62d25fb7d9ef6cbf3cb093184803e12066e86020225e3b9899decf8dbe6a20230000000000000000000000000000000002291ff240598e2c129ea12292e4a2fc86e03da9bd9fbbb8bddd6f25797003a4688ba2ed3bafd8dfcf0ddd44c3288c1e000000000000000000000000000000000d7541c9c54a95f3789ca7637348378f8956fd451c3266c8f1a34906bf1cf8e7499fcf8ad1f1a73dafcf71b86833ff3b0000000000000000000000000000000016aed55f56416b8f450283c4afea4c606100eed9bf7b8fea9ab4d04797a7bfe3bf0f10cf229f8ce3156869d75beabe6b0000000000000000000000000000000007e5c03e51a513c6f77179bcb5f7d147dcee32426b4365b1c95f434be7f83a5883d1ee5b0e01a636b3e5377542314b75000000000000000000000000000000000fbe421858e4109c51de57b77da4f9c4c1f950099532d9e30e2f7a8b8b4fb9f708cde1a497050d0944e089978b15321e0000000000000000000000000000000019f48a0bf0f27df65ba766a65e831a0801a4ebcd1995a6002a803f88aead1503b7c39fde8ef5c4672020307241958a88", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "matter_pairing_79", + "Gas": 230000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000018d31bd5a7e94ceb18d803969a2001c6eb3bfbcf82c27e88ca60d4c46807d12f116ca71c67d27270c2332205a4ea11bb0000000000000000000000000000000010b6db11d4fc3a2b449b8fd189d2e4ed4591bf4258d7b92b3eb152048cb3a3eecb87782691e9b954377fd1f34b38cb0d0000000000000000000000000000000016114be17b400ba35875d9009b4d8974023a57d32508c9f658a0d82a8efc6b379ce4a3dbf5ca7130c5581f5008806934000000000000000000000000000000000c68cd7b9d3c3d6c559fa3d52da48ebe68e40a44863c332bb90dd151d1281dd3faa34e6c7b07c277affbdbc1b0a43cfa000000000000000000000000000000001233421a38d77c59bbe1b83992a7a6c964ede5ef83c5a72bd1ba2c0a81b4205ce9a6925718cabcaf4a72ca3d216fbffc0000000000000000000000000000000016b8c22b35af7d925b5c68b6b7b63442e051fdc45542f233f2d97106c4b960eeb47f204c659d16a3a0d3b65ee38ff1480000000000000000000000000000000018d31bd5a7e94ceb18d803969a2001c6eb3bfbcf82c27e88ca60d4c46807d12f116ca71c67d27270c2332205a4ea11bb00000000000000000000000000000000094a36d86483ac6f068017e4b978c7ea1ee58c429aad5994287f809c69fd5235532487d81f6a46ab827f2e0cb4c6df9e0000000000000000000000000000000016114be17b400ba35875d9009b4d8974023a57d32508c9f658a0d82a8efc6b379ce4a3dbf5ca7130c5581f5008806934000000000000000000000000000000000c68cd7b9d3c3d6c559fa3d52da48ebe68e40a44863c332bb90dd151d1281dd3faa34e6c7b07c277affbdbc1b0a43cfa000000000000000000000000000000001233421a38d77c59bbe1b83992a7a6c964ede5ef83c5a72bd1ba2c0a81b4205ce9a6925718cabcaf4a72ca3d216fbffc0000000000000000000000000000000016b8c22b35af7d925b5c68b6b7b63442e051fdc45542f233f2d97106c4b960eeb47f204c659d16a3a0d3b65ee38ff1480000000000000000000000000000000018d31bd5a7e94ceb18d803969a2001c6eb3bfbcf82c27e88ca60d4c46807d12f116ca71c67d27270c2332205a4ea11bb0000000000000000000000000000000010b6db11d4fc3a2b449b8fd189d2e4ed4591bf4258d7b92b3eb152048cb3a3eecb87782691e9b954377fd1f34b38cb0d0000000000000000000000000000000016114be17b400ba35875d9009b4d8974023a57d32508c9f658a0d82a8efc6b379ce4a3dbf5ca7130c5581f5008806934000000000000000000000000000000000c68cd7b9d3c3d6c559fa3d52da48ebe68e40a44863c332bb90dd151d1281dd3faa34e6c7b07c277affbdbc1b0a43cfa0000000000000000000000000000000007cdcfd000a86a408f39ef7cb0a4060dff8965956fbf6b939576a69674fcd5c735056da7988943506f8c35c2de8feaaf0000000000000000000000000000000003484fbf03d06907efbf3eff8b95789484254dc09e42208b7457619a31f795356a2cdfb24bb6e95c192b49a11c6fb9630000000000000000000000000000000018d31bd5a7e94ceb18d803969a2001c6eb3bfbcf82c27e88ca60d4c46807d12f116ca71c67d27270c2332205a4ea11bb00000000000000000000000000000000094a36d86483ac6f068017e4b978c7ea1ee58c429aad5994287f809c69fd5235532487d81f6a46ab827f2e0cb4c6df9e0000000000000000000000000000000016114be17b400ba35875d9009b4d8974023a57d32508c9f658a0d82a8efc6b379ce4a3dbf5ca7130c5581f5008806934000000000000000000000000000000000c68cd7b9d3c3d6c559fa3d52da48ebe68e40a44863c332bb90dd151d1281dd3faa34e6c7b07c277affbdbc1b0a43cfa0000000000000000000000000000000007cdcfd000a86a408f39ef7cb0a4060dff8965956fbf6b939576a69674fcd5c735056da7988943506f8c35c2de8feaaf0000000000000000000000000000000003484fbf03d06907efbf3eff8b95789484254dc09e42208b7457619a31f795356a2cdfb24bb6e95c192b49a11c6fb9630000000000000000000000000000000018d31bd5a7e94ceb18d803969a2001c6eb3bfbcf82c27e88ca60d4c46807d12f116ca71c67d27270c2332205a4ea11bb0000000000000000000000000000000010b6db11d4fc3a2b449b8fd189d2e4ed4591bf4258d7b92b3eb152048cb3a3eecb87782691e9b954377fd1f34b38cb0d0000000000000000000000000000000016114be17b400ba35875d9009b4d8974023a57d32508c9f658a0d82a8efc6b379ce4a3dbf5ca7130c5581f5008806934000000000000000000000000000000000c68cd7b9d3c3d6c559fa3d52da48ebe68e40a44863c332bb90dd151d1281dd3faa34e6c7b07c277affbdbc1b0a43cfa000000000000000000000000000000001233421a38d77c59bbe1b83992a7a6c964ede5ef83c5a72bd1ba2c0a81b4205ce9a6925718cabcaf4a72ca3d216fbffc0000000000000000000000000000000016b8c22b35af7d925b5c68b6b7b63442e051fdc45542f233f2d97106c4b960eeb47f204c659d16a3a0d3b65ee38ff1480000000000000000000000000000000018d31bd5a7e94ceb18d803969a2001c6eb3bfbcf82c27e88ca60d4c46807d12f116ca71c67d27270c2332205a4ea11bb00000000000000000000000000000000094a36d86483ac6f068017e4b978c7ea1ee58c429aad5994287f809c69fd5235532487d81f6a46ab827f2e0cb4c6df9e0000000000000000000000000000000016114be17b400ba35875d9009b4d8974023a57d32508c9f658a0d82a8efc6b379ce4a3dbf5ca7130c5581f5008806934000000000000000000000000000000000c68cd7b9d3c3d6c559fa3d52da48ebe68e40a44863c332bb90dd151d1281dd3faa34e6c7b07c277affbdbc1b0a43cfa000000000000000000000000000000001233421a38d77c59bbe1b83992a7a6c964ede5ef83c5a72bd1ba2c0a81b4205ce9a6925718cabcaf4a72ca3d216fbffc0000000000000000000000000000000016b8c22b35af7d925b5c68b6b7b63442e051fdc45542f233f2d97106c4b960eeb47f204c659d16a3a0d3b65ee38ff1480000000000000000000000000000000018d31bd5a7e94ceb18d803969a2001c6eb3bfbcf82c27e88ca60d4c46807d12f116ca71c67d27270c2332205a4ea11bb0000000000000000000000000000000010b6db11d4fc3a2b449b8fd189d2e4ed4591bf4258d7b92b3eb152048cb3a3eecb87782691e9b954377fd1f34b38cb0d0000000000000000000000000000000016114be17b400ba35875d9009b4d8974023a57d32508c9f658a0d82a8efc6b379ce4a3dbf5ca7130c5581f5008806934000000000000000000000000000000000c68cd7b9d3c3d6c559fa3d52da48ebe68e40a44863c332bb90dd151d1281dd3faa34e6c7b07c277affbdbc1b0a43cfa0000000000000000000000000000000007cdcfd000a86a408f39ef7cb0a4060dff8965956fbf6b939576a69674fcd5c735056da7988943506f8c35c2de8feaaf0000000000000000000000000000000003484fbf03d06907efbf3eff8b95789484254dc09e42208b7457619a31f795356a2cdfb24bb6e95c192b49a11c6fb9630000000000000000000000000000000018d31bd5a7e94ceb18d803969a2001c6eb3bfbcf82c27e88ca60d4c46807d12f116ca71c67d27270c2332205a4ea11bb00000000000000000000000000000000094a36d86483ac6f068017e4b978c7ea1ee58c429aad5994287f809c69fd5235532487d81f6a46ab827f2e0cb4c6df9e0000000000000000000000000000000016114be17b400ba35875d9009b4d8974023a57d32508c9f658a0d82a8efc6b379ce4a3dbf5ca7130c5581f5008806934000000000000000000000000000000000c68cd7b9d3c3d6c559fa3d52da48ebe68e40a44863c332bb90dd151d1281dd3faa34e6c7b07c277affbdbc1b0a43cfa0000000000000000000000000000000007cdcfd000a86a408f39ef7cb0a4060dff8965956fbf6b939576a69674fcd5c735056da7988943506f8c35c2de8feaaf0000000000000000000000000000000003484fbf03d06907efbf3eff8b95789484254dc09e42208b7457619a31f795356a2cdfb24bb6e95c192b49a11c6fb963", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_80", + "Gas": 299000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000190f4dc14439eccc46d46c5c9b15eeba0bbf2dbca11af4183408afdb15c7bfa26f107cf5fda0c1e0236aab95728eac2e000000000000000000000000000000000c47feeb1a1d2891d986b1660810859c1bba427d43a69b4e5ddeaf77116418138bfc2b7b4aa4c0cc6df10bd116721d5000000000000000000000000000000000135b96feb4f1e712661ce0d13842de1198c589f335141ab1fd7ffc6b9d58de82c300e9fe6dacdefe8e68b6db9298da5100000000000000000000000000000000046a3563d167d8b0a9f74e0c6514fdabd795110cf48caa014947ca90a9eeda3d07dd7dce58d3f2b7b86fab1143946b560000000000000000000000000000000016c917abe637da21e60378ea7c2682306aded4ff17ccfea742e9ba63590be1b0fd5432ff0d3b72cdcb15943763cbb6bb00000000000000000000000000000000153bdddfe73f21c3593b128d3885f621935585ba1715e1d989e87cf7271897eea3917b81f0f342790f0f7a330ca0c68f00000000000000000000000000000000190f4dc14439eccc46d46c5c9b15eeba0bbf2dbca11af4183408afdb15c7bfa26f107cf5fda0c1e0236aab95728eac2e000000000000000000000000000000000db912ff1f62be087194f6503b3b273b48bd0907afde777109522329e54cde1092afd48366af3f334c0df42ee98d8d5b00000000000000000000000000000000135b96feb4f1e712661ce0d13842de1198c589f335141ab1fd7ffc6b9d58de82c300e9fe6dacdefe8e68b6db9298da5100000000000000000000000000000000046a3563d167d8b0a9f74e0c6514fdabd795110cf48caa014947ca90a9eeda3d07dd7dce58d3f2b7b86fab1143946b560000000000000000000000000000000016c917abe637da21e60378ea7c2682306aded4ff17ccfea742e9ba63590be1b0fd5432ff0d3b72cdcb15943763cbb6bb00000000000000000000000000000000153bdddfe73f21c3593b128d3885f621935585ba1715e1d989e87cf7271897eea3917b81f0f342790f0f7a330ca0c68f00000000000000000000000000000000190f4dc14439eccc46d46c5c9b15eeba0bbf2dbca11af4183408afdb15c7bfa26f107cf5fda0c1e0236aab95728eac2e000000000000000000000000000000000c47feeb1a1d2891d986b1660810859c1bba427d43a69b4e5ddeaf77116418138bfc2b7b4aa4c0cc6df10bd116721d5000000000000000000000000000000000135b96feb4f1e712661ce0d13842de1198c589f335141ab1fd7ffc6b9d58de82c300e9fe6dacdefe8e68b6db9298da5100000000000000000000000000000000046a3563d167d8b0a9f74e0c6514fdabd795110cf48caa014947ca90a9eeda3d07dd7dce58d3f2b7b86fab1143946b56000000000000000000000000000000000337fa3e53480c7865182ecbc7252aa6f9987685dbb814182447183d9da514732157ccffa4188d31eee96bc89c33f3f00000000000000000000000000000000004c5340a5240c4d6f1e095290ac5b6b5d121c5cadc6f30e5dd4855a9cf985e357b1a847cc060bd86aaef85ccf35ee41c00000000000000000000000000000000190f4dc14439eccc46d46c5c9b15eeba0bbf2dbca11af4183408afdb15c7bfa26f107cf5fda0c1e0236aab95728eac2e000000000000000000000000000000000db912ff1f62be087194f6503b3b273b48bd0907afde777109522329e54cde1092afd48366af3f334c0df42ee98d8d5b00000000000000000000000000000000135b96feb4f1e712661ce0d13842de1198c589f335141ab1fd7ffc6b9d58de82c300e9fe6dacdefe8e68b6db9298da5100000000000000000000000000000000046a3563d167d8b0a9f74e0c6514fdabd795110cf48caa014947ca90a9eeda3d07dd7dce58d3f2b7b86fab1143946b56000000000000000000000000000000000337fa3e53480c7865182ecbc7252aa6f9987685dbb814182447183d9da514732157ccffa4188d31eee96bc89c33f3f00000000000000000000000000000000004c5340a5240c4d6f1e095290ac5b6b5d121c5cadc6f30e5dd4855a9cf985e357b1a847cc060bd86aaef85ccf35ee41c00000000000000000000000000000000190f4dc14439eccc46d46c5c9b15eeba0bbf2dbca11af4183408afdb15c7bfa26f107cf5fda0c1e0236aab95728eac2e000000000000000000000000000000000c47feeb1a1d2891d986b1660810859c1bba427d43a69b4e5ddeaf77116418138bfc2b7b4aa4c0cc6df10bd116721d5000000000000000000000000000000000135b96feb4f1e712661ce0d13842de1198c589f335141ab1fd7ffc6b9d58de82c300e9fe6dacdefe8e68b6db9298da5100000000000000000000000000000000046a3563d167d8b0a9f74e0c6514fdabd795110cf48caa014947ca90a9eeda3d07dd7dce58d3f2b7b86fab1143946b560000000000000000000000000000000016c917abe637da21e60378ea7c2682306aded4ff17ccfea742e9ba63590be1b0fd5432ff0d3b72cdcb15943763cbb6bb00000000000000000000000000000000153bdddfe73f21c3593b128d3885f621935585ba1715e1d989e87cf7271897eea3917b81f0f342790f0f7a330ca0c68f00000000000000000000000000000000190f4dc14439eccc46d46c5c9b15eeba0bbf2dbca11af4183408afdb15c7bfa26f107cf5fda0c1e0236aab95728eac2e000000000000000000000000000000000db912ff1f62be087194f6503b3b273b48bd0907afde777109522329e54cde1092afd48366af3f334c0df42ee98d8d5b00000000000000000000000000000000135b96feb4f1e712661ce0d13842de1198c589f335141ab1fd7ffc6b9d58de82c300e9fe6dacdefe8e68b6db9298da5100000000000000000000000000000000046a3563d167d8b0a9f74e0c6514fdabd795110cf48caa014947ca90a9eeda3d07dd7dce58d3f2b7b86fab1143946b560000000000000000000000000000000016c917abe637da21e60378ea7c2682306aded4ff17ccfea742e9ba63590be1b0fd5432ff0d3b72cdcb15943763cbb6bb00000000000000000000000000000000153bdddfe73f21c3593b128d3885f621935585ba1715e1d989e87cf7271897eea3917b81f0f342790f0f7a330ca0c68f00000000000000000000000000000000190f4dc14439eccc46d46c5c9b15eeba0bbf2dbca11af4183408afdb15c7bfa26f107cf5fda0c1e0236aab95728eac2e000000000000000000000000000000000c47feeb1a1d2891d986b1660810859c1bba427d43a69b4e5ddeaf77116418138bfc2b7b4aa4c0cc6df10bd116721d5000000000000000000000000000000000135b96feb4f1e712661ce0d13842de1198c589f335141ab1fd7ffc6b9d58de82c300e9fe6dacdefe8e68b6db9298da5100000000000000000000000000000000046a3563d167d8b0a9f74e0c6514fdabd795110cf48caa014947ca90a9eeda3d07dd7dce58d3f2b7b86fab1143946b56000000000000000000000000000000000337fa3e53480c7865182ecbc7252aa6f9987685dbb814182447183d9da514732157ccffa4188d31eee96bc89c33f3f00000000000000000000000000000000004c5340a5240c4d6f1e095290ac5b6b5d121c5cadc6f30e5dd4855a9cf985e357b1a847cc060bd86aaef85ccf35ee41c00000000000000000000000000000000190f4dc14439eccc46d46c5c9b15eeba0bbf2dbca11af4183408afdb15c7bfa26f107cf5fda0c1e0236aab95728eac2e000000000000000000000000000000000db912ff1f62be087194f6503b3b273b48bd0907afde777109522329e54cde1092afd48366af3f334c0df42ee98d8d5b00000000000000000000000000000000135b96feb4f1e712661ce0d13842de1198c589f335141ab1fd7ffc6b9d58de82c300e9fe6dacdefe8e68b6db9298da5100000000000000000000000000000000046a3563d167d8b0a9f74e0c6514fdabd795110cf48caa014947ca90a9eeda3d07dd7dce58d3f2b7b86fab1143946b56000000000000000000000000000000000337fa3e53480c7865182ecbc7252aa6f9987685dbb814182447183d9da514732157ccffa4188d31eee96bc89c33f3f00000000000000000000000000000000004c5340a5240c4d6f1e095290ac5b6b5d121c5cadc6f30e5dd4855a9cf985e357b1a847cc060bd86aaef85ccf35ee41c", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_81", + "Gas": 299000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000021203675e0ae188ec782160e21492a6ee39fa97d922c1ef9bbfd79b82b3fad54fab11ba633fb8f02cf92249d85d9d8000000000000000000000000000000000062783335b87300c97b38e03e5b1318d15a499b29a473c187f930bf34bc1214b4d822725678cbde978c7b5ae6d4bad5100000000000000000000000000000000117821e6c87bb0e04882e95d36dce18ca33a2c8bd0efd5532b33d597804c08ff1799b2d64a95cc84bd31ba45c3b1e822000000000000000000000000000000000887c07c8a9ebe3154950746a4506ff192bb4a05dccb0f4a1a8ac2b8ca0da07190129ba44d9bc8e6c2666027c67d2ddc000000000000000000000000000000000a9e191c9775f57810a511c8bd3dca14b3328e20f0983ca72e42e561b5dd1693209b42a11f2faeecd6307dd34cc01d60000000000000000000000000000000000146061b13546754c74a705776656100a9577f1ff939a82ba990d6b885b27c450f824555829bbb19f9b1f636991799cf00000000000000000000000000000000021203675e0ae188ec782160e21492a6ee39fa97d922c1ef9bbfd79b82b3fad54fab11ba633fb8f02cf92249d85d9d800000000000000000000000000000000013d98eb6ddf8b68db36819b25d9a7b4a4ed2b1d2593dd6a6e79dc6adaaefd4d8d129d8d949c7421641374a5192b3fd5a00000000000000000000000000000000117821e6c87bb0e04882e95d36dce18ca33a2c8bd0efd5532b33d597804c08ff1799b2d64a95cc84bd31ba45c3b1e822000000000000000000000000000000000887c07c8a9ebe3154950746a4506ff192bb4a05dccb0f4a1a8ac2b8ca0da07190129ba44d9bc8e6c2666027c67d2ddc000000000000000000000000000000000a9e191c9775f57810a511c8bd3dca14b3328e20f0983ca72e42e561b5dd1693209b42a11f2faeecd6307dd34cc01d60000000000000000000000000000000000146061b13546754c74a705776656100a9577f1ff939a82ba990d6b885b27c450f824555829bbb19f9b1f636991799cf00000000000000000000000000000000021203675e0ae188ec782160e21492a6ee39fa97d922c1ef9bbfd79b82b3fad54fab11ba633fb8f02cf92249d85d9d8000000000000000000000000000000000062783335b87300c97b38e03e5b1318d15a499b29a473c187f930bf34bc1214b4d822725678cbde978c7b5ae6d4bad5100000000000000000000000000000000117821e6c87bb0e04882e95d36dce18ca33a2c8bd0efd5532b33d597804c08ff1799b2d64a95cc84bd31ba45c3b1e822000000000000000000000000000000000887c07c8a9ebe3154950746a4506ff192bb4a05dccb0f4a1a8ac2b8ca0da07190129ba44d9bc8e6c2666027c67d2ddc000000000000000000000000000000000f62f8cda209f1223a7695ed860de2c2b144bd6402ecd61838eded3f40d3df90fe10bd5d92245112e3ce822cb33f8d4b0000000000000000000000000000000018bb0bcf262b7f4583d1375ecce64bd6bb1fcc64fa4b6a93bd9ffbe870fe79df0f29baa92eb844e5c04d09c966e810dc00000000000000000000000000000000021203675e0ae188ec782160e21492a6ee39fa97d922c1ef9bbfd79b82b3fad54fab11ba633fb8f02cf92249d85d9d800000000000000000000000000000000013d98eb6ddf8b68db36819b25d9a7b4a4ed2b1d2593dd6a6e79dc6adaaefd4d8d129d8d949c7421641374a5192b3fd5a00000000000000000000000000000000117821e6c87bb0e04882e95d36dce18ca33a2c8bd0efd5532b33d597804c08ff1799b2d64a95cc84bd31ba45c3b1e822000000000000000000000000000000000887c07c8a9ebe3154950746a4506ff192bb4a05dccb0f4a1a8ac2b8ca0da07190129ba44d9bc8e6c2666027c67d2ddc000000000000000000000000000000000f62f8cda209f1223a7695ed860de2c2b144bd6402ecd61838eded3f40d3df90fe10bd5d92245112e3ce822cb33f8d4b0000000000000000000000000000000018bb0bcf262b7f4583d1375ecce64bd6bb1fcc64fa4b6a93bd9ffbe870fe79df0f29baa92eb844e5c04d09c966e810dc00000000000000000000000000000000021203675e0ae188ec782160e21492a6ee39fa97d922c1ef9bbfd79b82b3fad54fab11ba633fb8f02cf92249d85d9d8000000000000000000000000000000000062783335b87300c97b38e03e5b1318d15a499b29a473c187f930bf34bc1214b4d822725678cbde978c7b5ae6d4bad5100000000000000000000000000000000117821e6c87bb0e04882e95d36dce18ca33a2c8bd0efd5532b33d597804c08ff1799b2d64a95cc84bd31ba45c3b1e822000000000000000000000000000000000887c07c8a9ebe3154950746a4506ff192bb4a05dccb0f4a1a8ac2b8ca0da07190129ba44d9bc8e6c2666027c67d2ddc000000000000000000000000000000000a9e191c9775f57810a511c8bd3dca14b3328e20f0983ca72e42e561b5dd1693209b42a11f2faeecd6307dd34cc01d60000000000000000000000000000000000146061b13546754c74a705776656100a9577f1ff939a82ba990d6b885b27c450f824555829bbb19f9b1f636991799cf00000000000000000000000000000000021203675e0ae188ec782160e21492a6ee39fa97d922c1ef9bbfd79b82b3fad54fab11ba633fb8f02cf92249d85d9d800000000000000000000000000000000013d98eb6ddf8b68db36819b25d9a7b4a4ed2b1d2593dd6a6e79dc6adaaefd4d8d129d8d949c7421641374a5192b3fd5a00000000000000000000000000000000117821e6c87bb0e04882e95d36dce18ca33a2c8bd0efd5532b33d597804c08ff1799b2d64a95cc84bd31ba45c3b1e822000000000000000000000000000000000887c07c8a9ebe3154950746a4506ff192bb4a05dccb0f4a1a8ac2b8ca0da07190129ba44d9bc8e6c2666027c67d2ddc000000000000000000000000000000000a9e191c9775f57810a511c8bd3dca14b3328e20f0983ca72e42e561b5dd1693209b42a11f2faeecd6307dd34cc01d60000000000000000000000000000000000146061b13546754c74a705776656100a9577f1ff939a82ba990d6b885b27c450f824555829bbb19f9b1f636991799cf00000000000000000000000000000000021203675e0ae188ec782160e21492a6ee39fa97d922c1ef9bbfd79b82b3fad54fab11ba633fb8f02cf92249d85d9d8000000000000000000000000000000000062783335b87300c97b38e03e5b1318d15a499b29a473c187f930bf34bc1214b4d822725678cbde978c7b5ae6d4bad5100000000000000000000000000000000117821e6c87bb0e04882e95d36dce18ca33a2c8bd0efd5532b33d597804c08ff1799b2d64a95cc84bd31ba45c3b1e822000000000000000000000000000000000887c07c8a9ebe3154950746a4506ff192bb4a05dccb0f4a1a8ac2b8ca0da07190129ba44d9bc8e6c2666027c67d2ddc000000000000000000000000000000000f62f8cda209f1223a7695ed860de2c2b144bd6402ecd61838eded3f40d3df90fe10bd5d92245112e3ce822cb33f8d4b0000000000000000000000000000000018bb0bcf262b7f4583d1375ecce64bd6bb1fcc64fa4b6a93bd9ffbe870fe79df0f29baa92eb844e5c04d09c966e810dc00000000000000000000000000000000021203675e0ae188ec782160e21492a6ee39fa97d922c1ef9bbfd79b82b3fad54fab11ba633fb8f02cf92249d85d9d800000000000000000000000000000000013d98eb6ddf8b68db36819b25d9a7b4a4ed2b1d2593dd6a6e79dc6adaaefd4d8d129d8d949c7421641374a5192b3fd5a00000000000000000000000000000000117821e6c87bb0e04882e95d36dce18ca33a2c8bd0efd5532b33d597804c08ff1799b2d64a95cc84bd31ba45c3b1e822000000000000000000000000000000000887c07c8a9ebe3154950746a4506ff192bb4a05dccb0f4a1a8ac2b8ca0da07190129ba44d9bc8e6c2666027c67d2ddc000000000000000000000000000000000f62f8cda209f1223a7695ed860de2c2b144bd6402ecd61838eded3f40d3df90fe10bd5d92245112e3ce822cb33f8d4b0000000000000000000000000000000018bb0bcf262b7f4583d1375ecce64bd6bb1fcc64fa4b6a93bd9ffbe870fe79df0f29baa92eb844e5c04d09c966e810dc", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_82", + "Gas": 299000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000e4979375cd880e26d00461de629bac880c12e24ede4a7c702f151c34a728a69a021e37b6a1af520a5f47d3a33f8c8a80000000000000000000000000000000013b5317e3ff7540048b19ceebd47c15538d7eb3bf402823b9c348c464afb1000ce0f7ea4c1cb668af5c8cbf77e6a92510000000000000000000000000000000011f9a369401d2c376c77b4b414e345e6108b11594b26521b51afe6318648af232bf9f1455a99dc2f9b0207cc78339510000000000000000000000000000000000863492499f4791e71bd8d58dd2444a34e66dd3e3ca1cb3669f4182fafc9ef080a1d8111b3dd754f2405032350732b32000000000000000000000000000000000e96f685e6f87677cda23177f9fe7fd15726ab31e4d85a5725e93d558bdf61437dbc2c9ebcfc6a94705fa70de88a81bd00000000000000000000000000000000157ce060a46912c992587fde3db4c64a705ab7115717031778176f6ea311cb352f3a76f4839be4658470e4b0b9854f77000000000000000000000000000000000e4979375cd880e26d00461de629bac880c12e24ede4a7c702f151c34a728a69a021e37b6a1af520a5f47d3a33f8c8a800000000000000000000000000000000064be06bf988929a026a0ac78603eb822b9f6048ff829083cafc465aabb5e623509c8159ef889974c43634088195185a0000000000000000000000000000000011f9a369401d2c376c77b4b414e345e6108b11594b26521b51afe6318648af232bf9f1455a99dc2f9b0207cc78339510000000000000000000000000000000000863492499f4791e71bd8d58dd2444a34e66dd3e3ca1cb3669f4182fafc9ef080a1d8111b3dd754f2405032350732b32000000000000000000000000000000000e96f685e6f87677cda23177f9fe7fd15726ab31e4d85a5725e93d558bdf61437dbc2c9ebcfc6a94705fa70de88a81bd00000000000000000000000000000000157ce060a46912c992587fde3db4c64a705ab7115717031778176f6ea311cb352f3a76f4839be4658470e4b0b9854f77000000000000000000000000000000000e4979375cd880e26d00461de629bac880c12e24ede4a7c702f151c34a728a69a021e37b6a1af520a5f47d3a33f8c8a80000000000000000000000000000000013b5317e3ff7540048b19ceebd47c15538d7eb3bf402823b9c348c464afb1000ce0f7ea4c1cb668af5c8cbf77e6a92510000000000000000000000000000000011f9a369401d2c376c77b4b414e345e6108b11594b26521b51afe6318648af232bf9f1455a99dc2f9b0207cc78339510000000000000000000000000000000000863492499f4791e71bd8d58dd2444a34e66dd3e3ca1cb3669f4182fafc9ef080a1d8111b3dd754f2405032350732b32000000000000000000000000000000000b6a1b64528770227d79763e494d2d060d50a0530eacb8684147954b6ad194e0a0efd35ff457956b499f58f2177528ee00000000000000000000000000000000048431899516d3d0b8c327d80596e68cf41c94739c6e0fa7ef196332539f2aeeef71890a2db81b9a358e1b4f467a5b34000000000000000000000000000000000e4979375cd880e26d00461de629bac880c12e24ede4a7c702f151c34a728a69a021e37b6a1af520a5f47d3a33f8c8a800000000000000000000000000000000064be06bf988929a026a0ac78603eb822b9f6048ff829083cafc465aabb5e623509c8159ef889974c43634088195185a0000000000000000000000000000000011f9a369401d2c376c77b4b414e345e6108b11594b26521b51afe6318648af232bf9f1455a99dc2f9b0207cc78339510000000000000000000000000000000000863492499f4791e71bd8d58dd2444a34e66dd3e3ca1cb3669f4182fafc9ef080a1d8111b3dd754f2405032350732b32000000000000000000000000000000000b6a1b64528770227d79763e494d2d060d50a0530eacb8684147954b6ad194e0a0efd35ff457956b499f58f2177528ee00000000000000000000000000000000048431899516d3d0b8c327d80596e68cf41c94739c6e0fa7ef196332539f2aeeef71890a2db81b9a358e1b4f467a5b34000000000000000000000000000000000e4979375cd880e26d00461de629bac880c12e24ede4a7c702f151c34a728a69a021e37b6a1af520a5f47d3a33f8c8a80000000000000000000000000000000013b5317e3ff7540048b19ceebd47c15538d7eb3bf402823b9c348c464afb1000ce0f7ea4c1cb668af5c8cbf77e6a92510000000000000000000000000000000011f9a369401d2c376c77b4b414e345e6108b11594b26521b51afe6318648af232bf9f1455a99dc2f9b0207cc78339510000000000000000000000000000000000863492499f4791e71bd8d58dd2444a34e66dd3e3ca1cb3669f4182fafc9ef080a1d8111b3dd754f2405032350732b32000000000000000000000000000000000e96f685e6f87677cda23177f9fe7fd15726ab31e4d85a5725e93d558bdf61437dbc2c9ebcfc6a94705fa70de88a81bd00000000000000000000000000000000157ce060a46912c992587fde3db4c64a705ab7115717031778176f6ea311cb352f3a76f4839be4658470e4b0b9854f77000000000000000000000000000000000e4979375cd880e26d00461de629bac880c12e24ede4a7c702f151c34a728a69a021e37b6a1af520a5f47d3a33f8c8a800000000000000000000000000000000064be06bf988929a026a0ac78603eb822b9f6048ff829083cafc465aabb5e623509c8159ef889974c43634088195185a0000000000000000000000000000000011f9a369401d2c376c77b4b414e345e6108b11594b26521b51afe6318648af232bf9f1455a99dc2f9b0207cc78339510000000000000000000000000000000000863492499f4791e71bd8d58dd2444a34e66dd3e3ca1cb3669f4182fafc9ef080a1d8111b3dd754f2405032350732b32000000000000000000000000000000000e96f685e6f87677cda23177f9fe7fd15726ab31e4d85a5725e93d558bdf61437dbc2c9ebcfc6a94705fa70de88a81bd00000000000000000000000000000000157ce060a46912c992587fde3db4c64a705ab7115717031778176f6ea311cb352f3a76f4839be4658470e4b0b9854f77000000000000000000000000000000000e4979375cd880e26d00461de629bac880c12e24ede4a7c702f151c34a728a69a021e37b6a1af520a5f47d3a33f8c8a80000000000000000000000000000000013b5317e3ff7540048b19ceebd47c15538d7eb3bf402823b9c348c464afb1000ce0f7ea4c1cb668af5c8cbf77e6a92510000000000000000000000000000000011f9a369401d2c376c77b4b414e345e6108b11594b26521b51afe6318648af232bf9f1455a99dc2f9b0207cc78339510000000000000000000000000000000000863492499f4791e71bd8d58dd2444a34e66dd3e3ca1cb3669f4182fafc9ef080a1d8111b3dd754f2405032350732b32000000000000000000000000000000000b6a1b64528770227d79763e494d2d060d50a0530eacb8684147954b6ad194e0a0efd35ff457956b499f58f2177528ee00000000000000000000000000000000048431899516d3d0b8c327d80596e68cf41c94739c6e0fa7ef196332539f2aeeef71890a2db81b9a358e1b4f467a5b34000000000000000000000000000000000e4979375cd880e26d00461de629bac880c12e24ede4a7c702f151c34a728a69a021e37b6a1af520a5f47d3a33f8c8a800000000000000000000000000000000064be06bf988929a026a0ac78603eb822b9f6048ff829083cafc465aabb5e623509c8159ef889974c43634088195185a0000000000000000000000000000000011f9a369401d2c376c77b4b414e345e6108b11594b26521b51afe6318648af232bf9f1455a99dc2f9b0207cc78339510000000000000000000000000000000000863492499f4791e71bd8d58dd2444a34e66dd3e3ca1cb3669f4182fafc9ef080a1d8111b3dd754f2405032350732b32000000000000000000000000000000000b6a1b64528770227d79763e494d2d060d50a0530eacb8684147954b6ad194e0a0efd35ff457956b499f58f2177528ee00000000000000000000000000000000048431899516d3d0b8c327d80596e68cf41c94739c6e0fa7ef196332539f2aeeef71890a2db81b9a358e1b4f467a5b34", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_83", + "Gas": 299000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000017f16cffb737dadd52b3c5be258733dc47301474b7351c8dcb8ddb4c519018be08b64efea3336f2b6cfa78e0669dccf9000000000000000000000000000000000ae10eb4f791aa31e5bd7b6c4d68b04c6744262d8f5e9469b3987b101ff5a3066794e05694a9167b7050c3944b6d84f60000000000000000000000000000000000a8382a5f73a7d15c3ee35e5fcaf7142e6d91d71ef30ce7da9c8db2f80c95441dc93674bed244096b71aea40d43c318000000000000000000000000000000000733e9a022695ed6908caf6ec7e67211c6d5ac16ba3fb8e244227f5da787e69e7311fac1e8d102a2d84e6ba98903ff6e0000000000000000000000000000000016002a054bdf3cd916b5f8aca47d97feb170e8864da2eff8bbbf19a5b25ac857dbe6daab97dfe15a4e82455d154652e2000000000000000000000000000000000efc6f6c595368288f5687e710e2faebf12bd63a0ca34a527c05f1d925fcedd23c5e2b6708194069a36f858fa510ee410000000000000000000000000000000017f16cffb737dadd52b3c5be258733dc47301474b7351c8dcb8ddb4c519018be08b64efea3336f2b6cfa78e0669dccf9000000000000000000000000000000000f20033541ee3c68655e2c49f5e2fc8afd33255764267e55b3985790d6bb531db7171fa81caae98449ae3c6bb49225b50000000000000000000000000000000000a8382a5f73a7d15c3ee35e5fcaf7142e6d91d71ef30ce7da9c8db2f80c95441dc93674bed244096b71aea40d43c318000000000000000000000000000000000733e9a022695ed6908caf6ec7e67211c6d5ac16ba3fb8e244227f5da787e69e7311fac1e8d102a2d84e6ba98903ff6e0000000000000000000000000000000016002a054bdf3cd916b5f8aca47d97feb170e8864da2eff8bbbf19a5b25ac857dbe6daab97dfe15a4e82455d154652e2000000000000000000000000000000000efc6f6c595368288f5687e710e2faebf12bd63a0ca34a527c05f1d925fcedd23c5e2b6708194069a36f858fa510ee410000000000000000000000000000000017f16cffb737dadd52b3c5be258733dc47301474b7351c8dcb8ddb4c519018be08b64efea3336f2b6cfa78e0669dccf9000000000000000000000000000000000ae10eb4f791aa31e5bd7b6c4d68b04c6744262d8f5e9469b3987b101ff5a3066794e05694a9167b7050c3944b6d84f60000000000000000000000000000000000a8382a5f73a7d15c3ee35e5fcaf7142e6d91d71ef30ce7da9c8db2f80c95441dc93674bed244096b71aea40d43c318000000000000000000000000000000000733e9a022695ed6908caf6ec7e67211c6d5ac16ba3fb8e244227f5da787e69e7311fac1e8d102a2d84e6ba98903ff6e000000000000000000000000000000000400e7e4eda0a9c13465af099ece14d8b30662fea5e222c6ab71b8fb44562dcc42c5255319741ea56b7cbaa2eab957c9000000000000000000000000000000000b04a27de02c7e71bbc51fcf3268b1eb734b754ae6e1c86ceb2ae0c7d0b40851e24dd497a93abf96168f7a705aeebc6a0000000000000000000000000000000017f16cffb737dadd52b3c5be258733dc47301474b7351c8dcb8ddb4c519018be08b64efea3336f2b6cfa78e0669dccf9000000000000000000000000000000000f20033541ee3c68655e2c49f5e2fc8afd33255764267e55b3985790d6bb531db7171fa81caae98449ae3c6bb49225b50000000000000000000000000000000000a8382a5f73a7d15c3ee35e5fcaf7142e6d91d71ef30ce7da9c8db2f80c95441dc93674bed244096b71aea40d43c318000000000000000000000000000000000733e9a022695ed6908caf6ec7e67211c6d5ac16ba3fb8e244227f5da787e69e7311fac1e8d102a2d84e6ba98903ff6e000000000000000000000000000000000400e7e4eda0a9c13465af099ece14d8b30662fea5e222c6ab71b8fb44562dcc42c5255319741ea56b7cbaa2eab957c9000000000000000000000000000000000b04a27de02c7e71bbc51fcf3268b1eb734b754ae6e1c86ceb2ae0c7d0b40851e24dd497a93abf96168f7a705aeebc6a0000000000000000000000000000000017f16cffb737dadd52b3c5be258733dc47301474b7351c8dcb8ddb4c519018be08b64efea3336f2b6cfa78e0669dccf9000000000000000000000000000000000ae10eb4f791aa31e5bd7b6c4d68b04c6744262d8f5e9469b3987b101ff5a3066794e05694a9167b7050c3944b6d84f60000000000000000000000000000000000a8382a5f73a7d15c3ee35e5fcaf7142e6d91d71ef30ce7da9c8db2f80c95441dc93674bed244096b71aea40d43c318000000000000000000000000000000000733e9a022695ed6908caf6ec7e67211c6d5ac16ba3fb8e244227f5da787e69e7311fac1e8d102a2d84e6ba98903ff6e0000000000000000000000000000000016002a054bdf3cd916b5f8aca47d97feb170e8864da2eff8bbbf19a5b25ac857dbe6daab97dfe15a4e82455d154652e2000000000000000000000000000000000efc6f6c595368288f5687e710e2faebf12bd63a0ca34a527c05f1d925fcedd23c5e2b6708194069a36f858fa510ee410000000000000000000000000000000017f16cffb737dadd52b3c5be258733dc47301474b7351c8dcb8ddb4c519018be08b64efea3336f2b6cfa78e0669dccf9000000000000000000000000000000000f20033541ee3c68655e2c49f5e2fc8afd33255764267e55b3985790d6bb531db7171fa81caae98449ae3c6bb49225b50000000000000000000000000000000000a8382a5f73a7d15c3ee35e5fcaf7142e6d91d71ef30ce7da9c8db2f80c95441dc93674bed244096b71aea40d43c318000000000000000000000000000000000733e9a022695ed6908caf6ec7e67211c6d5ac16ba3fb8e244227f5da787e69e7311fac1e8d102a2d84e6ba98903ff6e0000000000000000000000000000000016002a054bdf3cd916b5f8aca47d97feb170e8864da2eff8bbbf19a5b25ac857dbe6daab97dfe15a4e82455d154652e2000000000000000000000000000000000efc6f6c595368288f5687e710e2faebf12bd63a0ca34a527c05f1d925fcedd23c5e2b6708194069a36f858fa510ee410000000000000000000000000000000017f16cffb737dadd52b3c5be258733dc47301474b7351c8dcb8ddb4c519018be08b64efea3336f2b6cfa78e0669dccf9000000000000000000000000000000000ae10eb4f791aa31e5bd7b6c4d68b04c6744262d8f5e9469b3987b101ff5a3066794e05694a9167b7050c3944b6d84f60000000000000000000000000000000000a8382a5f73a7d15c3ee35e5fcaf7142e6d91d71ef30ce7da9c8db2f80c95441dc93674bed244096b71aea40d43c318000000000000000000000000000000000733e9a022695ed6908caf6ec7e67211c6d5ac16ba3fb8e244227f5da787e69e7311fac1e8d102a2d84e6ba98903ff6e000000000000000000000000000000000400e7e4eda0a9c13465af099ece14d8b30662fea5e222c6ab71b8fb44562dcc42c5255319741ea56b7cbaa2eab957c9000000000000000000000000000000000b04a27de02c7e71bbc51fcf3268b1eb734b754ae6e1c86ceb2ae0c7d0b40851e24dd497a93abf96168f7a705aeebc6a0000000000000000000000000000000017f16cffb737dadd52b3c5be258733dc47301474b7351c8dcb8ddb4c519018be08b64efea3336f2b6cfa78e0669dccf9000000000000000000000000000000000f20033541ee3c68655e2c49f5e2fc8afd33255764267e55b3985790d6bb531db7171fa81caae98449ae3c6bb49225b50000000000000000000000000000000000a8382a5f73a7d15c3ee35e5fcaf7142e6d91d71ef30ce7da9c8db2f80c95441dc93674bed244096b71aea40d43c318000000000000000000000000000000000733e9a022695ed6908caf6ec7e67211c6d5ac16ba3fb8e244227f5da787e69e7311fac1e8d102a2d84e6ba98903ff6e000000000000000000000000000000000400e7e4eda0a9c13465af099ece14d8b30662fea5e222c6ab71b8fb44562dcc42c5255319741ea56b7cbaa2eab957c9000000000000000000000000000000000b04a27de02c7e71bbc51fcf3268b1eb734b754ae6e1c86ceb2ae0c7d0b40851e24dd497a93abf96168f7a705aeebc6a", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_84", + "Gas": 299000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000062168f0bfd29c44074430158708a1e3b6808bae633ce9506b32eb9124db1a0668d83f2076adffb568ccf289a61685420000000000000000000000000000000016aead8bd8c4d5ddc444e15bc83e8f14d377d5e8d756a0255f1387506b9a9add69592241dbd9cab95474d55ac473886200000000000000000000000000000000050b449c2425926d961af37c4c88e671eac676a1f828def54b76dc04960d0222fb5832ed44c45d5fbb59549d9d24c236000000000000000000000000000000000c6e811987b30ed77c804e647f867186d425411e514e9bf31099cc0f695195729ae970766b2738a928e776511a44f8a1000000000000000000000000000000001408beb1c3951d79fa43477c5af6894ee3c2ea9605f8ae64a78b51ee7e16ae9641134a9a75735972dbd7b53dd4c9f3bf000000000000000000000000000000000e6c6c9405ff001faa8d8c06bcbd75ee91140f477ef8283d3c5eb3039f16543ca9e7e4162177a7499edb6f3fdb01643f00000000000000000000000000000000062168f0bfd29c44074430158708a1e3b6808bae633ce9506b32eb9124db1a0668d83f2076adffb568ccf289a6168542000000000000000000000000000000000352645e60bb10bc86d6c65a7b0d1dc290ff759c1c2e729a081d4b508b165b46b552ddbcd57a3546658a2aa53b8c224900000000000000000000000000000000050b449c2425926d961af37c4c88e671eac676a1f828def54b76dc04960d0222fb5832ed44c45d5fbb59549d9d24c236000000000000000000000000000000000c6e811987b30ed77c804e647f867186d425411e514e9bf31099cc0f695195729ae970766b2738a928e776511a44f8a1000000000000000000000000000000001408beb1c3951d79fa43477c5af6894ee3c2ea9605f8ae64a78b51ee7e16ae9641134a9a75735972dbd7b53dd4c9f3bf000000000000000000000000000000000e6c6c9405ff001faa8d8c06bcbd75ee91140f477ef8283d3c5eb3039f16543ca9e7e4162177a7499edb6f3fdb01643f00000000000000000000000000000000062168f0bfd29c44074430158708a1e3b6808bae633ce9506b32eb9124db1a0668d83f2076adffb568ccf289a61685420000000000000000000000000000000016aead8bd8c4d5ddc444e15bc83e8f14d377d5e8d756a0255f1387506b9a9add69592241dbd9cab95474d55ac473886200000000000000000000000000000000050b449c2425926d961af37c4c88e671eac676a1f828def54b76dc04960d0222fb5832ed44c45d5fbb59549d9d24c236000000000000000000000000000000000c6e811987b30ed77c804e647f867186d425411e514e9bf31099cc0f695195729ae970766b2738a928e776511a44f8a10000000000000000000000000000000005f8533875eac92050d86039e855238880b460eeed8c645abfa580b2789a478ddd98b5643be0a68cde274ac22b35b6ec000000000000000000000000000000000b94a5563380e67aa08e1baf868e36e8d3633c3d748cea822ad21f9d579aa1e774c41be88fdc58b61b2390c024fe466c00000000000000000000000000000000062168f0bfd29c44074430158708a1e3b6808bae633ce9506b32eb9124db1a0668d83f2076adffb568ccf289a6168542000000000000000000000000000000000352645e60bb10bc86d6c65a7b0d1dc290ff759c1c2e729a081d4b508b165b46b552ddbcd57a3546658a2aa53b8c224900000000000000000000000000000000050b449c2425926d961af37c4c88e671eac676a1f828def54b76dc04960d0222fb5832ed44c45d5fbb59549d9d24c236000000000000000000000000000000000c6e811987b30ed77c804e647f867186d425411e514e9bf31099cc0f695195729ae970766b2738a928e776511a44f8a10000000000000000000000000000000005f8533875eac92050d86039e855238880b460eeed8c645abfa580b2789a478ddd98b5643be0a68cde274ac22b35b6ec000000000000000000000000000000000b94a5563380e67aa08e1baf868e36e8d3633c3d748cea822ad21f9d579aa1e774c41be88fdc58b61b2390c024fe466c00000000000000000000000000000000062168f0bfd29c44074430158708a1e3b6808bae633ce9506b32eb9124db1a0668d83f2076adffb568ccf289a61685420000000000000000000000000000000016aead8bd8c4d5ddc444e15bc83e8f14d377d5e8d756a0255f1387506b9a9add69592241dbd9cab95474d55ac473886200000000000000000000000000000000050b449c2425926d961af37c4c88e671eac676a1f828def54b76dc04960d0222fb5832ed44c45d5fbb59549d9d24c236000000000000000000000000000000000c6e811987b30ed77c804e647f867186d425411e514e9bf31099cc0f695195729ae970766b2738a928e776511a44f8a1000000000000000000000000000000001408beb1c3951d79fa43477c5af6894ee3c2ea9605f8ae64a78b51ee7e16ae9641134a9a75735972dbd7b53dd4c9f3bf000000000000000000000000000000000e6c6c9405ff001faa8d8c06bcbd75ee91140f477ef8283d3c5eb3039f16543ca9e7e4162177a7499edb6f3fdb01643f00000000000000000000000000000000062168f0bfd29c44074430158708a1e3b6808bae633ce9506b32eb9124db1a0668d83f2076adffb568ccf289a6168542000000000000000000000000000000000352645e60bb10bc86d6c65a7b0d1dc290ff759c1c2e729a081d4b508b165b46b552ddbcd57a3546658a2aa53b8c224900000000000000000000000000000000050b449c2425926d961af37c4c88e671eac676a1f828def54b76dc04960d0222fb5832ed44c45d5fbb59549d9d24c236000000000000000000000000000000000c6e811987b30ed77c804e647f867186d425411e514e9bf31099cc0f695195729ae970766b2738a928e776511a44f8a1000000000000000000000000000000001408beb1c3951d79fa43477c5af6894ee3c2ea9605f8ae64a78b51ee7e16ae9641134a9a75735972dbd7b53dd4c9f3bf000000000000000000000000000000000e6c6c9405ff001faa8d8c06bcbd75ee91140f477ef8283d3c5eb3039f16543ca9e7e4162177a7499edb6f3fdb01643f00000000000000000000000000000000062168f0bfd29c44074430158708a1e3b6808bae633ce9506b32eb9124db1a0668d83f2076adffb568ccf289a61685420000000000000000000000000000000016aead8bd8c4d5ddc444e15bc83e8f14d377d5e8d756a0255f1387506b9a9add69592241dbd9cab95474d55ac473886200000000000000000000000000000000050b449c2425926d961af37c4c88e671eac676a1f828def54b76dc04960d0222fb5832ed44c45d5fbb59549d9d24c236000000000000000000000000000000000c6e811987b30ed77c804e647f867186d425411e514e9bf31099cc0f695195729ae970766b2738a928e776511a44f8a10000000000000000000000000000000005f8533875eac92050d86039e855238880b460eeed8c645abfa580b2789a478ddd98b5643be0a68cde274ac22b35b6ec000000000000000000000000000000000b94a5563380e67aa08e1baf868e36e8d3633c3d748cea822ad21f9d579aa1e774c41be88fdc58b61b2390c024fe466c00000000000000000000000000000000062168f0bfd29c44074430158708a1e3b6808bae633ce9506b32eb9124db1a0668d83f2076adffb568ccf289a6168542000000000000000000000000000000000352645e60bb10bc86d6c65a7b0d1dc290ff759c1c2e729a081d4b508b165b46b552ddbcd57a3546658a2aa53b8c224900000000000000000000000000000000050b449c2425926d961af37c4c88e671eac676a1f828def54b76dc04960d0222fb5832ed44c45d5fbb59549d9d24c236000000000000000000000000000000000c6e811987b30ed77c804e647f867186d425411e514e9bf31099cc0f695195729ae970766b2738a928e776511a44f8a10000000000000000000000000000000005f8533875eac92050d86039e855238880b460eeed8c645abfa580b2789a478ddd98b5643be0a68cde274ac22b35b6ec000000000000000000000000000000000b94a5563380e67aa08e1baf868e36e8d3633c3d748cea822ad21f9d579aa1e774c41be88fdc58b61b2390c024fe466c", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_85", + "Gas": 299000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000c60b948942652a8214d8776b77a6c559ca77eb3a537b0a9abadc3058eac8c1d7840f091acd6c0056d5a71468a2b1ceb0000000000000000000000000000000019049c394e547b9b714b5969adcf068b381def6af2b27d1d361d06e9576273a8febb5bf94b5061ccec7afdb5642c0ae8000000000000000000000000000000000a8679f08643ff1c4db54e58de15a4828fc80e3f9d80a932b26b49d5c13831b1dc5dc29af2e080eb08e71938e5010fc400000000000000000000000000000000110957f7e9f8e0806bb3d2a811b91c926feab046ef983495f3f768a6cc6e4a6d95bb92facb77d989e53ce5489aa64b3c0000000000000000000000000000000018a8b48aabc6c003a58593a40b55e54b122994f9ab58cc229d1a0e6a3670244cfe73854f07117dc77dd5c2c81314a17e00000000000000000000000000000000062f6a0a8b9dd56001f0f57f82bb7468d709fb8f33e6729369b015685995ef27abebff9dda55c38b0d9e88a1e0b9fc6c000000000000000000000000000000000c60b948942652a8214d8776b77a6c559ca77eb3a537b0a9abadc3058eac8c1d7840f091acd6c0056d5a71468a2b1ceb0000000000000000000000000000000000fc75b0eb2b6afed9d04e4c957ca64c2c595c1a00d295a23113cbb79f4e827b1ff0a40566039e32cd84024a9bd39fc3000000000000000000000000000000000a8679f08643ff1c4db54e58de15a4828fc80e3f9d80a932b26b49d5c13831b1dc5dc29af2e080eb08e71938e5010fc400000000000000000000000000000000110957f7e9f8e0806bb3d2a811b91c926feab046ef983495f3f768a6cc6e4a6d95bb92facb77d989e53ce5489aa64b3c0000000000000000000000000000000018a8b48aabc6c003a58593a40b55e54b122994f9ab58cc229d1a0e6a3670244cfe73854f07117dc77dd5c2c81314a17e00000000000000000000000000000000062f6a0a8b9dd56001f0f57f82bb7468d709fb8f33e6729369b015685995ef27abebff9dda55c38b0d9e88a1e0b9fc6c000000000000000000000000000000000c60b948942652a8214d8776b77a6c559ca77eb3a537b0a9abadc3058eac8c1d7840f091acd6c0056d5a71468a2b1ceb0000000000000000000000000000000019049c394e547b9b714b5969adcf068b381def6af2b27d1d361d06e9576273a8febb5bf94b5061ccec7afdb5642c0ae8000000000000000000000000000000000a8679f08643ff1c4db54e58de15a4828fc80e3f9d80a932b26b49d5c13831b1dc5dc29af2e080eb08e71938e5010fc400000000000000000000000000000000110957f7e9f8e0806bb3d2a811b91c926feab046ef983495f3f768a6cc6e4a6d95bb92facb77d989e53ce5489aa64b3c0000000000000000000000000000000001585d5f8db92696a596141237f5c78c524db68b482c469cca16c436c040d1d720387aafaa4282383c293d37eceb092d0000000000000000000000000000000013d1a7dfade2113a492ab236c090386e8d6d4ff5bf9ea02bfd80bd389d1b06fc72c00060d6fe3c74ac60775e1f45ae3f000000000000000000000000000000000c60b948942652a8214d8776b77a6c559ca77eb3a537b0a9abadc3058eac8c1d7840f091acd6c0056d5a71468a2b1ceb0000000000000000000000000000000000fc75b0eb2b6afed9d04e4c957ca64c2c595c1a00d295a23113cbb79f4e827b1ff0a40566039e32cd84024a9bd39fc3000000000000000000000000000000000a8679f08643ff1c4db54e58de15a4828fc80e3f9d80a932b26b49d5c13831b1dc5dc29af2e080eb08e71938e5010fc400000000000000000000000000000000110957f7e9f8e0806bb3d2a811b91c926feab046ef983495f3f768a6cc6e4a6d95bb92facb77d989e53ce5489aa64b3c0000000000000000000000000000000001585d5f8db92696a596141237f5c78c524db68b482c469cca16c436c040d1d720387aafaa4282383c293d37eceb092d0000000000000000000000000000000013d1a7dfade2113a492ab236c090386e8d6d4ff5bf9ea02bfd80bd389d1b06fc72c00060d6fe3c74ac60775e1f45ae3f000000000000000000000000000000000c60b948942652a8214d8776b77a6c559ca77eb3a537b0a9abadc3058eac8c1d7840f091acd6c0056d5a71468a2b1ceb0000000000000000000000000000000019049c394e547b9b714b5969adcf068b381def6af2b27d1d361d06e9576273a8febb5bf94b5061ccec7afdb5642c0ae8000000000000000000000000000000000a8679f08643ff1c4db54e58de15a4828fc80e3f9d80a932b26b49d5c13831b1dc5dc29af2e080eb08e71938e5010fc400000000000000000000000000000000110957f7e9f8e0806bb3d2a811b91c926feab046ef983495f3f768a6cc6e4a6d95bb92facb77d989e53ce5489aa64b3c0000000000000000000000000000000018a8b48aabc6c003a58593a40b55e54b122994f9ab58cc229d1a0e6a3670244cfe73854f07117dc77dd5c2c81314a17e00000000000000000000000000000000062f6a0a8b9dd56001f0f57f82bb7468d709fb8f33e6729369b015685995ef27abebff9dda55c38b0d9e88a1e0b9fc6c000000000000000000000000000000000c60b948942652a8214d8776b77a6c559ca77eb3a537b0a9abadc3058eac8c1d7840f091acd6c0056d5a71468a2b1ceb0000000000000000000000000000000000fc75b0eb2b6afed9d04e4c957ca64c2c595c1a00d295a23113cbb79f4e827b1ff0a40566039e32cd84024a9bd39fc3000000000000000000000000000000000a8679f08643ff1c4db54e58de15a4828fc80e3f9d80a932b26b49d5c13831b1dc5dc29af2e080eb08e71938e5010fc400000000000000000000000000000000110957f7e9f8e0806bb3d2a811b91c926feab046ef983495f3f768a6cc6e4a6d95bb92facb77d989e53ce5489aa64b3c0000000000000000000000000000000018a8b48aabc6c003a58593a40b55e54b122994f9ab58cc229d1a0e6a3670244cfe73854f07117dc77dd5c2c81314a17e00000000000000000000000000000000062f6a0a8b9dd56001f0f57f82bb7468d709fb8f33e6729369b015685995ef27abebff9dda55c38b0d9e88a1e0b9fc6c000000000000000000000000000000000c60b948942652a8214d8776b77a6c559ca77eb3a537b0a9abadc3058eac8c1d7840f091acd6c0056d5a71468a2b1ceb0000000000000000000000000000000019049c394e547b9b714b5969adcf068b381def6af2b27d1d361d06e9576273a8febb5bf94b5061ccec7afdb5642c0ae8000000000000000000000000000000000a8679f08643ff1c4db54e58de15a4828fc80e3f9d80a932b26b49d5c13831b1dc5dc29af2e080eb08e71938e5010fc400000000000000000000000000000000110957f7e9f8e0806bb3d2a811b91c926feab046ef983495f3f768a6cc6e4a6d95bb92facb77d989e53ce5489aa64b3c0000000000000000000000000000000001585d5f8db92696a596141237f5c78c524db68b482c469cca16c436c040d1d720387aafaa4282383c293d37eceb092d0000000000000000000000000000000013d1a7dfade2113a492ab236c090386e8d6d4ff5bf9ea02bfd80bd389d1b06fc72c00060d6fe3c74ac60775e1f45ae3f000000000000000000000000000000000c60b948942652a8214d8776b77a6c559ca77eb3a537b0a9abadc3058eac8c1d7840f091acd6c0056d5a71468a2b1ceb0000000000000000000000000000000000fc75b0eb2b6afed9d04e4c957ca64c2c595c1a00d295a23113cbb79f4e827b1ff0a40566039e32cd84024a9bd39fc3000000000000000000000000000000000a8679f08643ff1c4db54e58de15a4828fc80e3f9d80a932b26b49d5c13831b1dc5dc29af2e080eb08e71938e5010fc400000000000000000000000000000000110957f7e9f8e0806bb3d2a811b91c926feab046ef983495f3f768a6cc6e4a6d95bb92facb77d989e53ce5489aa64b3c0000000000000000000000000000000001585d5f8db92696a596141237f5c78c524db68b482c469cca16c436c040d1d720387aafaa4282383c293d37eceb092d0000000000000000000000000000000013d1a7dfade2113a492ab236c090386e8d6d4ff5bf9ea02bfd80bd389d1b06fc72c00060d6fe3c74ac60775e1f45ae3f", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_86", + "Gas": 299000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000013fe38343072af8ef1d8247c3d46b4fd190086ceddfeb767787031368da6a6a6ae849cfc26a24ead499338e37fa337e30000000000000000000000000000000009f7d7b21882455e9f1f24ea120f3eb69f739c1320c37eb2b17e0a271cb03ac6e2b0c55d3518548a005f28b5748b7f59000000000000000000000000000000000ba48cbd776dd03a5b69aed3a31b7d151a8d98cd9adc3b9987cf2ac94644a364ebf3d30cf31742e2152aeba0eebc9ceb0000000000000000000000000000000008793a44c730949a9e50e9439d579ff0991dfc49a67a29b1701989ab065e6e937b14ac1bbca5a3dbf79a61837ad18394000000000000000000000000000000000d81a0809479694fde24e5a3ee7d32deacc25e77f241024666bc3372e80379a722863ea8105f345f1d09e462fc5a8c6c0000000000000000000000000000000001a5be923f1ca5ee876d660fbca5896f1634ef6a83ff8c64dca4ed76d1db2ba4875099fa5a39a09f839731278b307fb10000000000000000000000000000000013fe38343072af8ef1d8247c3d46b4fd190086ceddfeb767787031368da6a6a6ae849cfc26a24ead499338e37fa337e30000000000000000000000000000000010093a3820fda13babfc82cc313c6e20c503af71d2c1940cb5b2c879da00bb5d3bfb3aa17c3bab75b99fd74a8b742b52000000000000000000000000000000000ba48cbd776dd03a5b69aed3a31b7d151a8d98cd9adc3b9987cf2ac94644a364ebf3d30cf31742e2152aeba0eebc9ceb0000000000000000000000000000000008793a44c730949a9e50e9439d579ff0991dfc49a67a29b1701989ab065e6e937b14ac1bbca5a3dbf79a61837ad18394000000000000000000000000000000000d81a0809479694fde24e5a3ee7d32deacc25e77f241024666bc3372e80379a722863ea8105f345f1d09e462fc5a8c6c0000000000000000000000000000000001a5be923f1ca5ee876d660fbca5896f1634ef6a83ff8c64dca4ed76d1db2ba4875099fa5a39a09f839731278b307fb10000000000000000000000000000000013fe38343072af8ef1d8247c3d46b4fd190086ceddfeb767787031368da6a6a6ae849cfc26a24ead499338e37fa337e30000000000000000000000000000000009f7d7b21882455e9f1f24ea120f3eb69f739c1320c37eb2b17e0a271cb03ac6e2b0c55d3518548a005f28b5748b7f59000000000000000000000000000000000ba48cbd776dd03a5b69aed3a31b7d151a8d98cd9adc3b9987cf2ac94644a364ebf3d30cf31742e2152aeba0eebc9ceb0000000000000000000000000000000008793a44c730949a9e50e9439d579ff0991dfc49a67a29b1701989ab065e6e937b14ac1bbca5a3dbf79a61837ad18394000000000000000000000000000000000c7f7169a5067d4a6cf6c21254ce79f8b7b4ed0d0144107900749f2e0ead7c7cfc25c156a0f4cba09cf51b9d03a51e3f00000000000000000000000000000000185b5357fa6340abc3ae41a686a623684e425c1a6f85865a8a8be52a24d5ca7f975b6604571a5f603667ced874cf2afa0000000000000000000000000000000013fe38343072af8ef1d8247c3d46b4fd190086ceddfeb767787031368da6a6a6ae849cfc26a24ead499338e37fa337e30000000000000000000000000000000010093a3820fda13babfc82cc313c6e20c503af71d2c1940cb5b2c879da00bb5d3bfb3aa17c3bab75b99fd74a8b742b52000000000000000000000000000000000ba48cbd776dd03a5b69aed3a31b7d151a8d98cd9adc3b9987cf2ac94644a364ebf3d30cf31742e2152aeba0eebc9ceb0000000000000000000000000000000008793a44c730949a9e50e9439d579ff0991dfc49a67a29b1701989ab065e6e937b14ac1bbca5a3dbf79a61837ad18394000000000000000000000000000000000c7f7169a5067d4a6cf6c21254ce79f8b7b4ed0d0144107900749f2e0ead7c7cfc25c156a0f4cba09cf51b9d03a51e3f00000000000000000000000000000000185b5357fa6340abc3ae41a686a623684e425c1a6f85865a8a8be52a24d5ca7f975b6604571a5f603667ced874cf2afa0000000000000000000000000000000013fe38343072af8ef1d8247c3d46b4fd190086ceddfeb767787031368da6a6a6ae849cfc26a24ead499338e37fa337e30000000000000000000000000000000009f7d7b21882455e9f1f24ea120f3eb69f739c1320c37eb2b17e0a271cb03ac6e2b0c55d3518548a005f28b5748b7f59000000000000000000000000000000000ba48cbd776dd03a5b69aed3a31b7d151a8d98cd9adc3b9987cf2ac94644a364ebf3d30cf31742e2152aeba0eebc9ceb0000000000000000000000000000000008793a44c730949a9e50e9439d579ff0991dfc49a67a29b1701989ab065e6e937b14ac1bbca5a3dbf79a61837ad18394000000000000000000000000000000000d81a0809479694fde24e5a3ee7d32deacc25e77f241024666bc3372e80379a722863ea8105f345f1d09e462fc5a8c6c0000000000000000000000000000000001a5be923f1ca5ee876d660fbca5896f1634ef6a83ff8c64dca4ed76d1db2ba4875099fa5a39a09f839731278b307fb10000000000000000000000000000000013fe38343072af8ef1d8247c3d46b4fd190086ceddfeb767787031368da6a6a6ae849cfc26a24ead499338e37fa337e30000000000000000000000000000000010093a3820fda13babfc82cc313c6e20c503af71d2c1940cb5b2c879da00bb5d3bfb3aa17c3bab75b99fd74a8b742b52000000000000000000000000000000000ba48cbd776dd03a5b69aed3a31b7d151a8d98cd9adc3b9987cf2ac94644a364ebf3d30cf31742e2152aeba0eebc9ceb0000000000000000000000000000000008793a44c730949a9e50e9439d579ff0991dfc49a67a29b1701989ab065e6e937b14ac1bbca5a3dbf79a61837ad18394000000000000000000000000000000000d81a0809479694fde24e5a3ee7d32deacc25e77f241024666bc3372e80379a722863ea8105f345f1d09e462fc5a8c6c0000000000000000000000000000000001a5be923f1ca5ee876d660fbca5896f1634ef6a83ff8c64dca4ed76d1db2ba4875099fa5a39a09f839731278b307fb10000000000000000000000000000000013fe38343072af8ef1d8247c3d46b4fd190086ceddfeb767787031368da6a6a6ae849cfc26a24ead499338e37fa337e30000000000000000000000000000000009f7d7b21882455e9f1f24ea120f3eb69f739c1320c37eb2b17e0a271cb03ac6e2b0c55d3518548a005f28b5748b7f59000000000000000000000000000000000ba48cbd776dd03a5b69aed3a31b7d151a8d98cd9adc3b9987cf2ac94644a364ebf3d30cf31742e2152aeba0eebc9ceb0000000000000000000000000000000008793a44c730949a9e50e9439d579ff0991dfc49a67a29b1701989ab065e6e937b14ac1bbca5a3dbf79a61837ad18394000000000000000000000000000000000c7f7169a5067d4a6cf6c21254ce79f8b7b4ed0d0144107900749f2e0ead7c7cfc25c156a0f4cba09cf51b9d03a51e3f00000000000000000000000000000000185b5357fa6340abc3ae41a686a623684e425c1a6f85865a8a8be52a24d5ca7f975b6604571a5f603667ced874cf2afa0000000000000000000000000000000013fe38343072af8ef1d8247c3d46b4fd190086ceddfeb767787031368da6a6a6ae849cfc26a24ead499338e37fa337e30000000000000000000000000000000010093a3820fda13babfc82cc313c6e20c503af71d2c1940cb5b2c879da00bb5d3bfb3aa17c3bab75b99fd74a8b742b52000000000000000000000000000000000ba48cbd776dd03a5b69aed3a31b7d151a8d98cd9adc3b9987cf2ac94644a364ebf3d30cf31742e2152aeba0eebc9ceb0000000000000000000000000000000008793a44c730949a9e50e9439d579ff0991dfc49a67a29b1701989ab065e6e937b14ac1bbca5a3dbf79a61837ad18394000000000000000000000000000000000c7f7169a5067d4a6cf6c21254ce79f8b7b4ed0d0144107900749f2e0ead7c7cfc25c156a0f4cba09cf51b9d03a51e3f00000000000000000000000000000000185b5357fa6340abc3ae41a686a623684e425c1a6f85865a8a8be52a24d5ca7f975b6604571a5f603667ced874cf2afa", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_87", + "Gas": 299000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000018c6df81d810deaac0b143edf79956c92af7941f7b279db345f838bd583177912fc2eb367616ae165e261014a4d7b1b900000000000000000000000000000000146696840e8e988d0eab90ea935dd8b5f1272bbb81eb524e523c57d34ad7c5f0f3b721566f51dac4774826b84cc1c82f0000000000000000000000000000000008691df5b245399f24118badfbef3e01a4acd53dc9ab149e407c733df6122fa91f5cbe2f9d247cdbac18b266d3d8f18300000000000000000000000000000000053e6eef4ffdbe239c8bbade8cfc90461d54f281ee6180c271412bf2d64e005d3f0291d3401c324e41067f4dfcc4b2720000000000000000000000000000000000b76cdde0e1205c918e6e6d324ac3f35d42ebe9bb101f1cd8955acdfa8836f22f1497bced2c93495022b0c335bcaaae0000000000000000000000000000000018340c2a8b079b88595aa50e93251d12e3a5aead2d2add3b72ce82e03a26525aa45fe9b379504392edb0a2a26d7e99dc0000000000000000000000000000000018c6df81d810deaac0b143edf79956c92af7941f7b279db345f838bd583177912fc2eb367616ae165e261014a4d7b1b900000000000000000000000000000000059a7b662af14e0d3c7016cbafedd42173501fc97199c07114f47acdabd930332af4dea84202253b42b6d947b33de27c0000000000000000000000000000000008691df5b245399f24118badfbef3e01a4acd53dc9ab149e407c733df6122fa91f5cbe2f9d247cdbac18b266d3d8f18300000000000000000000000000000000053e6eef4ffdbe239c8bbade8cfc90461d54f281ee6180c271412bf2d64e005d3f0291d3401c324e41067f4dfcc4b2720000000000000000000000000000000000b76cdde0e1205c918e6e6d324ac3f35d42ebe9bb101f1cd8955acdfa8836f22f1497bced2c93495022b0c335bcaaae0000000000000000000000000000000018340c2a8b079b88595aa50e93251d12e3a5aead2d2add3b72ce82e03a26525aa45fe9b379504392edb0a2a26d7e99dc0000000000000000000000000000000018c6df81d810deaac0b143edf79956c92af7941f7b279db345f838bd583177912fc2eb367616ae165e261014a4d7b1b900000000000000000000000000000000146696840e8e988d0eab90ea935dd8b5f1272bbb81eb524e523c57d34ad7c5f0f3b721566f51dac4774826b84cc1c82f0000000000000000000000000000000008691df5b245399f24118badfbef3e01a4acd53dc9ab149e407c733df6122fa91f5cbe2f9d247cdbac18b266d3d8f18300000000000000000000000000000000053e6eef4ffdbe239c8bbade8cfc90461d54f281ee6180c271412bf2d64e005d3f0291d3401c324e41067f4dfcc4b272000000000000000000000000000000001949a50c589ec63db98d39491100e8e407345f9b3874f3a28e9b77d2fc28bf31ef976841c4276cb669dc4f3cca42fffd0000000000000000000000000000000001cd05bfae784b11f1c102a7b0268fc480d19cd7c65a3583f4624fc0bc8aa3c97a4c164b3803bc6ccc4e5d5d928110cf0000000000000000000000000000000018c6df81d810deaac0b143edf79956c92af7941f7b279db345f838bd583177912fc2eb367616ae165e261014a4d7b1b900000000000000000000000000000000059a7b662af14e0d3c7016cbafedd42173501fc97199c07114f47acdabd930332af4dea84202253b42b6d947b33de27c0000000000000000000000000000000008691df5b245399f24118badfbef3e01a4acd53dc9ab149e407c733df6122fa91f5cbe2f9d247cdbac18b266d3d8f18300000000000000000000000000000000053e6eef4ffdbe239c8bbade8cfc90461d54f281ee6180c271412bf2d64e005d3f0291d3401c324e41067f4dfcc4b272000000000000000000000000000000001949a50c589ec63db98d39491100e8e407345f9b3874f3a28e9b77d2fc28bf31ef976841c4276cb669dc4f3cca42fffd0000000000000000000000000000000001cd05bfae784b11f1c102a7b0268fc480d19cd7c65a3583f4624fc0bc8aa3c97a4c164b3803bc6ccc4e5d5d928110cf0000000000000000000000000000000018c6df81d810deaac0b143edf79956c92af7941f7b279db345f838bd583177912fc2eb367616ae165e261014a4d7b1b900000000000000000000000000000000146696840e8e988d0eab90ea935dd8b5f1272bbb81eb524e523c57d34ad7c5f0f3b721566f51dac4774826b84cc1c82f0000000000000000000000000000000008691df5b245399f24118badfbef3e01a4acd53dc9ab149e407c733df6122fa91f5cbe2f9d247cdbac18b266d3d8f18300000000000000000000000000000000053e6eef4ffdbe239c8bbade8cfc90461d54f281ee6180c271412bf2d64e005d3f0291d3401c324e41067f4dfcc4b2720000000000000000000000000000000000b76cdde0e1205c918e6e6d324ac3f35d42ebe9bb101f1cd8955acdfa8836f22f1497bced2c93495022b0c335bcaaae0000000000000000000000000000000018340c2a8b079b88595aa50e93251d12e3a5aead2d2add3b72ce82e03a26525aa45fe9b379504392edb0a2a26d7e99dc0000000000000000000000000000000018c6df81d810deaac0b143edf79956c92af7941f7b279db345f838bd583177912fc2eb367616ae165e261014a4d7b1b900000000000000000000000000000000059a7b662af14e0d3c7016cbafedd42173501fc97199c07114f47acdabd930332af4dea84202253b42b6d947b33de27c0000000000000000000000000000000008691df5b245399f24118badfbef3e01a4acd53dc9ab149e407c733df6122fa91f5cbe2f9d247cdbac18b266d3d8f18300000000000000000000000000000000053e6eef4ffdbe239c8bbade8cfc90461d54f281ee6180c271412bf2d64e005d3f0291d3401c324e41067f4dfcc4b2720000000000000000000000000000000000b76cdde0e1205c918e6e6d324ac3f35d42ebe9bb101f1cd8955acdfa8836f22f1497bced2c93495022b0c335bcaaae0000000000000000000000000000000018340c2a8b079b88595aa50e93251d12e3a5aead2d2add3b72ce82e03a26525aa45fe9b379504392edb0a2a26d7e99dc0000000000000000000000000000000018c6df81d810deaac0b143edf79956c92af7941f7b279db345f838bd583177912fc2eb367616ae165e261014a4d7b1b900000000000000000000000000000000146696840e8e988d0eab90ea935dd8b5f1272bbb81eb524e523c57d34ad7c5f0f3b721566f51dac4774826b84cc1c82f0000000000000000000000000000000008691df5b245399f24118badfbef3e01a4acd53dc9ab149e407c733df6122fa91f5cbe2f9d247cdbac18b266d3d8f18300000000000000000000000000000000053e6eef4ffdbe239c8bbade8cfc90461d54f281ee6180c271412bf2d64e005d3f0291d3401c324e41067f4dfcc4b272000000000000000000000000000000001949a50c589ec63db98d39491100e8e407345f9b3874f3a28e9b77d2fc28bf31ef976841c4276cb669dc4f3cca42fffd0000000000000000000000000000000001cd05bfae784b11f1c102a7b0268fc480d19cd7c65a3583f4624fc0bc8aa3c97a4c164b3803bc6ccc4e5d5d928110cf0000000000000000000000000000000018c6df81d810deaac0b143edf79956c92af7941f7b279db345f838bd583177912fc2eb367616ae165e261014a4d7b1b900000000000000000000000000000000059a7b662af14e0d3c7016cbafedd42173501fc97199c07114f47acdabd930332af4dea84202253b42b6d947b33de27c0000000000000000000000000000000008691df5b245399f24118badfbef3e01a4acd53dc9ab149e407c733df6122fa91f5cbe2f9d247cdbac18b266d3d8f18300000000000000000000000000000000053e6eef4ffdbe239c8bbade8cfc90461d54f281ee6180c271412bf2d64e005d3f0291d3401c324e41067f4dfcc4b272000000000000000000000000000000001949a50c589ec63db98d39491100e8e407345f9b3874f3a28e9b77d2fc28bf31ef976841c4276cb669dc4f3cca42fffd0000000000000000000000000000000001cd05bfae784b11f1c102a7b0268fc480d19cd7c65a3583f4624fc0bc8aa3c97a4c164b3803bc6ccc4e5d5d928110cf", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_88", + "Gas": 299000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000c6b634d90c2664b9fa4ccbca35913d23696825350e21f0a6dd5e9abb17497a0a499e1b7b928a57ba8c730158f63b75d0000000000000000000000000000000009d569f05e69a38231d0f636e1ef040af059a00db4ff09bd2ad82b7e04cc041a33603c2eb9b148e3b1412bdef9740ab400000000000000000000000000000000042120affcefe4735ae25e192d1cf34e40afdc6d2ebdacde2e23d30709fecfb71960bc9131e3702b27b6fcd5c7a98d170000000000000000000000000000000001998caf5163b0dccec7c8423c4c56a7d0f0b26d9034f707ed07f636f42dac590a2674c1667d70be385c4e626815c6640000000000000000000000000000000011d7aff6c4512f68031aeb94ce3733ac43659f9fc58fc94c05d99ae80a7656f66b3e3e86843387d1c10f51b4284755150000000000000000000000000000000012a9e7f3804c6b5b25410a82758cd5b6ea1eb150c696b0d67d92cf9eb1f8e17752184d94a4ad2645b1520d6aee1094ed000000000000000000000000000000000c6b634d90c2664b9fa4ccbca35913d23696825350e21f0a6dd5e9abb17497a0a499e1b7b928a57ba8c730158f63b75d00000000000000000000000000000000102ba7f9db164318194ab17f615ca8cc741dab773e8609023c58a722f1e4f209eb4bc3cff7a2b71c08bdd421068b9ff700000000000000000000000000000000042120affcefe4735ae25e192d1cf34e40afdc6d2ebdacde2e23d30709fecfb71960bc9131e3702b27b6fcd5c7a98d170000000000000000000000000000000001998caf5163b0dccec7c8423c4c56a7d0f0b26d9034f707ed07f636f42dac590a2674c1667d70be385c4e626815c6640000000000000000000000000000000011d7aff6c4512f68031aeb94ce3733ac43659f9fc58fc94c05d99ae80a7656f66b3e3e86843387d1c10f51b4284755150000000000000000000000000000000012a9e7f3804c6b5b25410a82758cd5b6ea1eb150c696b0d67d92cf9eb1f8e17752184d94a4ad2645b1520d6aee1094ed000000000000000000000000000000000c6b634d90c2664b9fa4ccbca35913d23696825350e21f0a6dd5e9abb17497a0a499e1b7b928a57ba8c730158f63b75d0000000000000000000000000000000009d569f05e69a38231d0f636e1ef040af059a00db4ff09bd2ad82b7e04cc041a33603c2eb9b148e3b1412bdef9740ab400000000000000000000000000000000042120affcefe4735ae25e192d1cf34e40afdc6d2ebdacde2e23d30709fecfb71960bc9131e3702b27b6fcd5c7a98d170000000000000000000000000000000001998caf5163b0dccec7c8423c4c56a7d0f0b26d9034f707ed07f636f42dac590a2674c1667d70be385c4e626815c66400000000000000000000000000000000082961f3752eb7324800bc217514792b2111abe52df54973615737b8ec3a9f2db36dc1782d20782df8efae4bd7b8559600000000000000000000000000000000075729f6b9337b3f25da9d33cdbed7207a589a342cee61e8e99e030244b814accc93b26a0ca6d9ba08acf29511ef15be000000000000000000000000000000000c6b634d90c2664b9fa4ccbca35913d23696825350e21f0a6dd5e9abb17497a0a499e1b7b928a57ba8c730158f63b75d00000000000000000000000000000000102ba7f9db164318194ab17f615ca8cc741dab773e8609023c58a722f1e4f209eb4bc3cff7a2b71c08bdd421068b9ff700000000000000000000000000000000042120affcefe4735ae25e192d1cf34e40afdc6d2ebdacde2e23d30709fecfb71960bc9131e3702b27b6fcd5c7a98d170000000000000000000000000000000001998caf5163b0dccec7c8423c4c56a7d0f0b26d9034f707ed07f636f42dac590a2674c1667d70be385c4e626815c66400000000000000000000000000000000082961f3752eb7324800bc217514792b2111abe52df54973615737b8ec3a9f2db36dc1782d20782df8efae4bd7b8559600000000000000000000000000000000075729f6b9337b3f25da9d33cdbed7207a589a342cee61e8e99e030244b814accc93b26a0ca6d9ba08acf29511ef15be000000000000000000000000000000000c6b634d90c2664b9fa4ccbca35913d23696825350e21f0a6dd5e9abb17497a0a499e1b7b928a57ba8c730158f63b75d0000000000000000000000000000000009d569f05e69a38231d0f636e1ef040af059a00db4ff09bd2ad82b7e04cc041a33603c2eb9b148e3b1412bdef9740ab400000000000000000000000000000000042120affcefe4735ae25e192d1cf34e40afdc6d2ebdacde2e23d30709fecfb71960bc9131e3702b27b6fcd5c7a98d170000000000000000000000000000000001998caf5163b0dccec7c8423c4c56a7d0f0b26d9034f707ed07f636f42dac590a2674c1667d70be385c4e626815c6640000000000000000000000000000000011d7aff6c4512f68031aeb94ce3733ac43659f9fc58fc94c05d99ae80a7656f66b3e3e86843387d1c10f51b4284755150000000000000000000000000000000012a9e7f3804c6b5b25410a82758cd5b6ea1eb150c696b0d67d92cf9eb1f8e17752184d94a4ad2645b1520d6aee1094ed000000000000000000000000000000000c6b634d90c2664b9fa4ccbca35913d23696825350e21f0a6dd5e9abb17497a0a499e1b7b928a57ba8c730158f63b75d00000000000000000000000000000000102ba7f9db164318194ab17f615ca8cc741dab773e8609023c58a722f1e4f209eb4bc3cff7a2b71c08bdd421068b9ff700000000000000000000000000000000042120affcefe4735ae25e192d1cf34e40afdc6d2ebdacde2e23d30709fecfb71960bc9131e3702b27b6fcd5c7a98d170000000000000000000000000000000001998caf5163b0dccec7c8423c4c56a7d0f0b26d9034f707ed07f636f42dac590a2674c1667d70be385c4e626815c6640000000000000000000000000000000011d7aff6c4512f68031aeb94ce3733ac43659f9fc58fc94c05d99ae80a7656f66b3e3e86843387d1c10f51b4284755150000000000000000000000000000000012a9e7f3804c6b5b25410a82758cd5b6ea1eb150c696b0d67d92cf9eb1f8e17752184d94a4ad2645b1520d6aee1094ed000000000000000000000000000000000c6b634d90c2664b9fa4ccbca35913d23696825350e21f0a6dd5e9abb17497a0a499e1b7b928a57ba8c730158f63b75d0000000000000000000000000000000009d569f05e69a38231d0f636e1ef040af059a00db4ff09bd2ad82b7e04cc041a33603c2eb9b148e3b1412bdef9740ab400000000000000000000000000000000042120affcefe4735ae25e192d1cf34e40afdc6d2ebdacde2e23d30709fecfb71960bc9131e3702b27b6fcd5c7a98d170000000000000000000000000000000001998caf5163b0dccec7c8423c4c56a7d0f0b26d9034f707ed07f636f42dac590a2674c1667d70be385c4e626815c66400000000000000000000000000000000082961f3752eb7324800bc217514792b2111abe52df54973615737b8ec3a9f2db36dc1782d20782df8efae4bd7b8559600000000000000000000000000000000075729f6b9337b3f25da9d33cdbed7207a589a342cee61e8e99e030244b814accc93b26a0ca6d9ba08acf29511ef15be000000000000000000000000000000000c6b634d90c2664b9fa4ccbca35913d23696825350e21f0a6dd5e9abb17497a0a499e1b7b928a57ba8c730158f63b75d00000000000000000000000000000000102ba7f9db164318194ab17f615ca8cc741dab773e8609023c58a722f1e4f209eb4bc3cff7a2b71c08bdd421068b9ff700000000000000000000000000000000042120affcefe4735ae25e192d1cf34e40afdc6d2ebdacde2e23d30709fecfb71960bc9131e3702b27b6fcd5c7a98d170000000000000000000000000000000001998caf5163b0dccec7c8423c4c56a7d0f0b26d9034f707ed07f636f42dac590a2674c1667d70be385c4e626815c66400000000000000000000000000000000082961f3752eb7324800bc217514792b2111abe52df54973615737b8ec3a9f2db36dc1782d20782df8efae4bd7b8559600000000000000000000000000000000075729f6b9337b3f25da9d33cdbed7207a589a342cee61e8e99e030244b814accc93b26a0ca6d9ba08acf29511ef15be", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_89", + "Gas": 299000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000018129b2f00be24717c906d215beaaa136758aa1730bd0bbe9c0de9b3cbb3c0ea47911817fa322b907cc6fc720cabde05000000000000000000000000000000000e8b0f968ccb230517ef8980be559f410a2c4035a1101e6796d4f7a5ee5c93a19c111d38930bd5bca69405fc35fea7c20000000000000000000000000000000001462f8080d9b51235a8aa652445f509e3e13e3073769e9a047e8b2bfa5b227f4354bef017d18bf06f7ec98c169abf1e000000000000000000000000000000000070fdbc18112b49bd83f4347922797f2bbd68bf2592ad59041c97948ba7a091bdb3622c804803ad605604ba364dbdca0000000000000000000000000000000018bc90cd83e1271bf0e39b0c80989f0ddcffc960ae466c64ad340cc32607dbdc73eac5b9145e1339fa02a0c3fafcc1df00000000000000000000000000000000124c4bf66a5e015f142e9e4b26421414a60e54ed76c6d4acc0f20b24a25ddf5ec7ef1f561fac9d470a94bcfb2f2698c50000000000000000000000000000000018129b2f00be24717c906d215beaaa136758aa1730bd0bbe9c0de9b3cbb3c0ea47911817fa322b907cc6fc720cabde05000000000000000000000000000000000b760253acb4c395332c1e3584f60d965a4b0b4f5274f457d05bdafb08546282829ae2c61e482a43136afa03ca0102e90000000000000000000000000000000001462f8080d9b51235a8aa652445f509e3e13e3073769e9a047e8b2bfa5b227f4354bef017d18bf06f7ec98c169abf1e000000000000000000000000000000000070fdbc18112b49bd83f4347922797f2bbd68bf2592ad59041c97948ba7a091bdb3622c804803ad605604ba364dbdca0000000000000000000000000000000018bc90cd83e1271bf0e39b0c80989f0ddcffc960ae466c64ad340cc32607dbdc73eac5b9145e1339fa02a0c3fafcc1df00000000000000000000000000000000124c4bf66a5e015f142e9e4b26421414a60e54ed76c6d4acc0f20b24a25ddf5ec7ef1f561fac9d470a94bcfb2f2698c50000000000000000000000000000000018129b2f00be24717c906d215beaaa136758aa1730bd0bbe9c0de9b3cbb3c0ea47911817fa322b907cc6fc720cabde05000000000000000000000000000000000e8b0f968ccb230517ef8980be559f410a2c4035a1101e6796d4f7a5ee5c93a19c111d38930bd5bca69405fc35fea7c20000000000000000000000000000000001462f8080d9b51235a8aa652445f509e3e13e3073769e9a047e8b2bfa5b227f4354bef017d18bf06f7ec98c169abf1e000000000000000000000000000000000070fdbc18112b49bd83f4347922797f2bbd68bf2592ad59041c97948ba7a091bdb3622c804803ad605604ba364dbdca000000000000000000000000000000000144811cb59ebf7e5a380ca9c2b30dc987778224453ea65ab9fcc5ddd0a91a47aac13a459cf5ecc5bffc5f3c0502e8cc0000000000000000000000000000000007b4c5f3cf21e53b36ed096b1d0998c2be68f6977cbe3e12a63ec77c545316c556bce0a891a762b8af6a4304d0d911e60000000000000000000000000000000018129b2f00be24717c906d215beaaa136758aa1730bd0bbe9c0de9b3cbb3c0ea47911817fa322b907cc6fc720cabde05000000000000000000000000000000000b760253acb4c395332c1e3584f60d965a4b0b4f5274f457d05bdafb08546282829ae2c61e482a43136afa03ca0102e90000000000000000000000000000000001462f8080d9b51235a8aa652445f509e3e13e3073769e9a047e8b2bfa5b227f4354bef017d18bf06f7ec98c169abf1e000000000000000000000000000000000070fdbc18112b49bd83f4347922797f2bbd68bf2592ad59041c97948ba7a091bdb3622c804803ad605604ba364dbdca000000000000000000000000000000000144811cb59ebf7e5a380ca9c2b30dc987778224453ea65ab9fcc5ddd0a91a47aac13a459cf5ecc5bffc5f3c0502e8cc0000000000000000000000000000000007b4c5f3cf21e53b36ed096b1d0998c2be68f6977cbe3e12a63ec77c545316c556bce0a891a762b8af6a4304d0d911e60000000000000000000000000000000018129b2f00be24717c906d215beaaa136758aa1730bd0bbe9c0de9b3cbb3c0ea47911817fa322b907cc6fc720cabde05000000000000000000000000000000000e8b0f968ccb230517ef8980be559f410a2c4035a1101e6796d4f7a5ee5c93a19c111d38930bd5bca69405fc35fea7c20000000000000000000000000000000001462f8080d9b51235a8aa652445f509e3e13e3073769e9a047e8b2bfa5b227f4354bef017d18bf06f7ec98c169abf1e000000000000000000000000000000000070fdbc18112b49bd83f4347922797f2bbd68bf2592ad59041c97948ba7a091bdb3622c804803ad605604ba364dbdca0000000000000000000000000000000018bc90cd83e1271bf0e39b0c80989f0ddcffc960ae466c64ad340cc32607dbdc73eac5b9145e1339fa02a0c3fafcc1df00000000000000000000000000000000124c4bf66a5e015f142e9e4b26421414a60e54ed76c6d4acc0f20b24a25ddf5ec7ef1f561fac9d470a94bcfb2f2698c50000000000000000000000000000000018129b2f00be24717c906d215beaaa136758aa1730bd0bbe9c0de9b3cbb3c0ea47911817fa322b907cc6fc720cabde05000000000000000000000000000000000b760253acb4c395332c1e3584f60d965a4b0b4f5274f457d05bdafb08546282829ae2c61e482a43136afa03ca0102e90000000000000000000000000000000001462f8080d9b51235a8aa652445f509e3e13e3073769e9a047e8b2bfa5b227f4354bef017d18bf06f7ec98c169abf1e000000000000000000000000000000000070fdbc18112b49bd83f4347922797f2bbd68bf2592ad59041c97948ba7a091bdb3622c804803ad605604ba364dbdca0000000000000000000000000000000018bc90cd83e1271bf0e39b0c80989f0ddcffc960ae466c64ad340cc32607dbdc73eac5b9145e1339fa02a0c3fafcc1df00000000000000000000000000000000124c4bf66a5e015f142e9e4b26421414a60e54ed76c6d4acc0f20b24a25ddf5ec7ef1f561fac9d470a94bcfb2f2698c50000000000000000000000000000000018129b2f00be24717c906d215beaaa136758aa1730bd0bbe9c0de9b3cbb3c0ea47911817fa322b907cc6fc720cabde05000000000000000000000000000000000e8b0f968ccb230517ef8980be559f410a2c4035a1101e6796d4f7a5ee5c93a19c111d38930bd5bca69405fc35fea7c20000000000000000000000000000000001462f8080d9b51235a8aa652445f509e3e13e3073769e9a047e8b2bfa5b227f4354bef017d18bf06f7ec98c169abf1e000000000000000000000000000000000070fdbc18112b49bd83f4347922797f2bbd68bf2592ad59041c97948ba7a091bdb3622c804803ad605604ba364dbdca000000000000000000000000000000000144811cb59ebf7e5a380ca9c2b30dc987778224453ea65ab9fcc5ddd0a91a47aac13a459cf5ecc5bffc5f3c0502e8cc0000000000000000000000000000000007b4c5f3cf21e53b36ed096b1d0998c2be68f6977cbe3e12a63ec77c545316c556bce0a891a762b8af6a4304d0d911e60000000000000000000000000000000018129b2f00be24717c906d215beaaa136758aa1730bd0bbe9c0de9b3cbb3c0ea47911817fa322b907cc6fc720cabde05000000000000000000000000000000000b760253acb4c395332c1e3584f60d965a4b0b4f5274f457d05bdafb08546282829ae2c61e482a43136afa03ca0102e90000000000000000000000000000000001462f8080d9b51235a8aa652445f509e3e13e3073769e9a047e8b2bfa5b227f4354bef017d18bf06f7ec98c169abf1e000000000000000000000000000000000070fdbc18112b49bd83f4347922797f2bbd68bf2592ad59041c97948ba7a091bdb3622c804803ad605604ba364dbdca000000000000000000000000000000000144811cb59ebf7e5a380ca9c2b30dc987778224453ea65ab9fcc5ddd0a91a47aac13a459cf5ecc5bffc5f3c0502e8cc0000000000000000000000000000000007b4c5f3cf21e53b36ed096b1d0998c2be68f6977cbe3e12a63ec77c545316c556bce0a891a762b8af6a4304d0d911e6", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_90", + "Gas": 299000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001667fdc9b89d12fb0704fdec910cab1b51ac04219ef6e50f996688b2ceb26dca0e9e8594c5b81fca2e8fc2c8d8fa9a4700000000000000000000000000000000193118d1f237c68a8a0961fb220c0fd6a08853908a039dd57f8ed334063e5316bf83e8c3c3f44420734abbd7ddda31a600000000000000000000000000000000156901359e5b399168e90ccad27a054d147aa9c4a731294180e395e8e2d458f5537fdac591cdc82fd8bffa4c9fa126ed00000000000000000000000000000000143872757c0a25d85e95a86c5e09175fdbeaf59bae3d1e8a367902d59c662cc3a293ae252443b3201671ad1dbaed8ca20000000000000000000000000000000017f93d49ec5c34cdc31931cbe2d5b3ad7a6dcd3ea864862aa7b41d5b2f4618c9c92da01e246ff8f34240bcf1de4c1c450000000000000000000000000000000002180a95dbe57c43171e2607593dd3b54344bdbf409dcd0c5706a9a72ad0e26ed60b9e4cb17ea4e7b460adc5a6f6d2de000000000000000000000000000000001667fdc9b89d12fb0704fdec910cab1b51ac04219ef6e50f996688b2ceb26dca0e9e8594c5b81fca2e8fc2c8d8fa9a470000000000000000000000000000000000cff9184748200fc11245bb213f9d00c3eef7f4698174e9e7a1ff6cf072a30d5f28173aed5fbbdf46b444282225790500000000000000000000000000000000156901359e5b399168e90ccad27a054d147aa9c4a731294180e395e8e2d458f5537fdac591cdc82fd8bffa4c9fa126ed00000000000000000000000000000000143872757c0a25d85e95a86c5e09175fdbeaf59bae3d1e8a367902d59c662cc3a293ae252443b3201671ad1dbaed8ca20000000000000000000000000000000017f93d49ec5c34cdc31931cbe2d5b3ad7a6dcd3ea864862aa7b41d5b2f4618c9c92da01e246ff8f34240bcf1de4c1c450000000000000000000000000000000002180a95dbe57c43171e2607593dd3b54344bdbf409dcd0c5706a9a72ad0e26ed60b9e4cb17ea4e7b460adc5a6f6d2de000000000000000000000000000000001667fdc9b89d12fb0704fdec910cab1b51ac04219ef6e50f996688b2ceb26dca0e9e8594c5b81fca2e8fc2c8d8fa9a4700000000000000000000000000000000193118d1f237c68a8a0961fb220c0fd6a08853908a039dd57f8ed334063e5316bf83e8c3c3f44420734abbd7ddda31a600000000000000000000000000000000156901359e5b399168e90ccad27a054d147aa9c4a731294180e395e8e2d458f5537fdac591cdc82fd8bffa4c9fa126ed00000000000000000000000000000000143872757c0a25d85e95a86c5e09175fdbeaf59bae3d1e8a367902d59c662cc3a293ae252443b3201671ad1dbaed8ca2000000000000000000000000000000000207d4a04d23b1cc880275ea6075f929ea097e464b208c94bf7cb545c76add5a557e5fe08ce4070c77be430e21b38e660000000000000000000000000000000017e907545d9a6a5733fd81aeea0dd92221328dc5b2e745b3102a28f9cbe013b548a061b1ffd55b18059e523a5908d7cd000000000000000000000000000000001667fdc9b89d12fb0704fdec910cab1b51ac04219ef6e50f996688b2ceb26dca0e9e8594c5b81fca2e8fc2c8d8fa9a470000000000000000000000000000000000cff9184748200fc11245bb213f9d00c3eef7f4698174e9e7a1ff6cf072a30d5f28173aed5fbbdf46b444282225790500000000000000000000000000000000156901359e5b399168e90ccad27a054d147aa9c4a731294180e395e8e2d458f5537fdac591cdc82fd8bffa4c9fa126ed00000000000000000000000000000000143872757c0a25d85e95a86c5e09175fdbeaf59bae3d1e8a367902d59c662cc3a293ae252443b3201671ad1dbaed8ca2000000000000000000000000000000000207d4a04d23b1cc880275ea6075f929ea097e464b208c94bf7cb545c76add5a557e5fe08ce4070c77be430e21b38e660000000000000000000000000000000017e907545d9a6a5733fd81aeea0dd92221328dc5b2e745b3102a28f9cbe013b548a061b1ffd55b18059e523a5908d7cd000000000000000000000000000000001667fdc9b89d12fb0704fdec910cab1b51ac04219ef6e50f996688b2ceb26dca0e9e8594c5b81fca2e8fc2c8d8fa9a4700000000000000000000000000000000193118d1f237c68a8a0961fb220c0fd6a08853908a039dd57f8ed334063e5316bf83e8c3c3f44420734abbd7ddda31a600000000000000000000000000000000156901359e5b399168e90ccad27a054d147aa9c4a731294180e395e8e2d458f5537fdac591cdc82fd8bffa4c9fa126ed00000000000000000000000000000000143872757c0a25d85e95a86c5e09175fdbeaf59bae3d1e8a367902d59c662cc3a293ae252443b3201671ad1dbaed8ca20000000000000000000000000000000017f93d49ec5c34cdc31931cbe2d5b3ad7a6dcd3ea864862aa7b41d5b2f4618c9c92da01e246ff8f34240bcf1de4c1c450000000000000000000000000000000002180a95dbe57c43171e2607593dd3b54344bdbf409dcd0c5706a9a72ad0e26ed60b9e4cb17ea4e7b460adc5a6f6d2de000000000000000000000000000000001667fdc9b89d12fb0704fdec910cab1b51ac04219ef6e50f996688b2ceb26dca0e9e8594c5b81fca2e8fc2c8d8fa9a470000000000000000000000000000000000cff9184748200fc11245bb213f9d00c3eef7f4698174e9e7a1ff6cf072a30d5f28173aed5fbbdf46b444282225790500000000000000000000000000000000156901359e5b399168e90ccad27a054d147aa9c4a731294180e395e8e2d458f5537fdac591cdc82fd8bffa4c9fa126ed00000000000000000000000000000000143872757c0a25d85e95a86c5e09175fdbeaf59bae3d1e8a367902d59c662cc3a293ae252443b3201671ad1dbaed8ca20000000000000000000000000000000017f93d49ec5c34cdc31931cbe2d5b3ad7a6dcd3ea864862aa7b41d5b2f4618c9c92da01e246ff8f34240bcf1de4c1c450000000000000000000000000000000002180a95dbe57c43171e2607593dd3b54344bdbf409dcd0c5706a9a72ad0e26ed60b9e4cb17ea4e7b460adc5a6f6d2de000000000000000000000000000000001667fdc9b89d12fb0704fdec910cab1b51ac04219ef6e50f996688b2ceb26dca0e9e8594c5b81fca2e8fc2c8d8fa9a4700000000000000000000000000000000193118d1f237c68a8a0961fb220c0fd6a08853908a039dd57f8ed334063e5316bf83e8c3c3f44420734abbd7ddda31a600000000000000000000000000000000156901359e5b399168e90ccad27a054d147aa9c4a731294180e395e8e2d458f5537fdac591cdc82fd8bffa4c9fa126ed00000000000000000000000000000000143872757c0a25d85e95a86c5e09175fdbeaf59bae3d1e8a367902d59c662cc3a293ae252443b3201671ad1dbaed8ca2000000000000000000000000000000000207d4a04d23b1cc880275ea6075f929ea097e464b208c94bf7cb545c76add5a557e5fe08ce4070c77be430e21b38e660000000000000000000000000000000017e907545d9a6a5733fd81aeea0dd92221328dc5b2e745b3102a28f9cbe013b548a061b1ffd55b18059e523a5908d7cd000000000000000000000000000000001667fdc9b89d12fb0704fdec910cab1b51ac04219ef6e50f996688b2ceb26dca0e9e8594c5b81fca2e8fc2c8d8fa9a470000000000000000000000000000000000cff9184748200fc11245bb213f9d00c3eef7f4698174e9e7a1ff6cf072a30d5f28173aed5fbbdf46b444282225790500000000000000000000000000000000156901359e5b399168e90ccad27a054d147aa9c4a731294180e395e8e2d458f5537fdac591cdc82fd8bffa4c9fa126ed00000000000000000000000000000000143872757c0a25d85e95a86c5e09175fdbeaf59bae3d1e8a367902d59c662cc3a293ae252443b3201671ad1dbaed8ca2000000000000000000000000000000000207d4a04d23b1cc880275ea6075f929ea097e464b208c94bf7cb545c76add5a557e5fe08ce4070c77be430e21b38e660000000000000000000000000000000017e907545d9a6a5733fd81aeea0dd92221328dc5b2e745b3102a28f9cbe013b548a061b1ffd55b18059e523a5908d7cd", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_91", + "Gas": 299000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000217a4c563d730ef545e452038813301933ccc6638321ee5e217dad0be2e3ddc855a14054d0d72b6bcc692a5fb1ac7300000000000000000000000000000000007025f1c4a5f85a9c1587d4d4a2e620d83d60568343940ffd85e6b1e4fb0f0f53bb08c4f48bf6f45a7dbc3722ecc951e00000000000000000000000000000000162ea8f985c83d59361ee6beb49cf2a797d8c909e2eccfc61fdc5359d5ac9b10fbaeef2eebea1667b5b9bf8f5d603d6e0000000000000000000000000000000018344ca9d4913e817264ed8119fe4d136f2041b0a99d4b5fe7f2b7f268256eec9fceb27fa61c4225f47babd17759c01300000000000000000000000000000000034f7418d96bdbe4f1ed5996fc9e9e99233a5cb3aad717b3717e91ff94fecaa67250ba5b27dcf59c6e36aae08d22983a00000000000000000000000000000000100cd7ea3c342aa2c15e9c6121a1cfecf611235add08290cf9cb8ea54e8ff523e17a0b5dc41e6d07992e5927e3ff6157000000000000000000000000000000000217a4c563d730ef545e452038813301933ccc6638321ee5e217dad0be2e3ddc855a14054d0d72b6bcc692a5fb1ac7300000000000000000000000000000000012feb2cdef2060f089c32a68f91d4ac9e0a1461cbf4bd1bf8ed26782a700052ee2fb73af689490ba12233c8dd133158d00000000000000000000000000000000162ea8f985c83d59361ee6beb49cf2a797d8c909e2eccfc61fdc5359d5ac9b10fbaeef2eebea1667b5b9bf8f5d603d6e0000000000000000000000000000000018344ca9d4913e817264ed8119fe4d136f2041b0a99d4b5fe7f2b7f268256eec9fceb27fa61c4225f47babd17759c01300000000000000000000000000000000034f7418d96bdbe4f1ed5996fc9e9e99233a5cb3aad717b3717e91ff94fecaa67250ba5b27dcf59c6e36aae08d22983a00000000000000000000000000000000100cd7ea3c342aa2c15e9c6121a1cfecf611235add08290cf9cb8ea54e8ff523e17a0b5dc41e6d07992e5927e3ff6157000000000000000000000000000000000217a4c563d730ef545e452038813301933ccc6638321ee5e217dad0be2e3ddc855a14054d0d72b6bcc692a5fb1ac7300000000000000000000000000000000007025f1c4a5f85a9c1587d4d4a2e620d83d60568343940ffd85e6b1e4fb0f0f53bb08c4f48bf6f45a7dbc3722ecc951e00000000000000000000000000000000162ea8f985c83d59361ee6beb49cf2a797d8c909e2eccfc61fdc5359d5ac9b10fbaeef2eebea1667b5b9bf8f5d603d6e0000000000000000000000000000000018344ca9d4913e817264ed8119fe4d136f2041b0a99d4b5fe7f2b7f268256eec9fceb27fa61c4225f47babd17759c0130000000000000000000000000000000016b19dd160140ab5592e4e1f46ad0e3e413ceed148adfb0bf5b240a161b22b7dac5b45a389770a634bc8551f72dd12710000000000000000000000000000000009f439fffd4bbbf789bd0b5521a9dcea6e66282a167ce9b26d6543fba82101003d31f4a0ed3592f820d0a6d81c004954000000000000000000000000000000000217a4c563d730ef545e452038813301933ccc6638321ee5e217dad0be2e3ddc855a14054d0d72b6bcc692a5fb1ac7300000000000000000000000000000000012feb2cdef2060f089c32a68f91d4ac9e0a1461cbf4bd1bf8ed26782a700052ee2fb73af689490ba12233c8dd133158d00000000000000000000000000000000162ea8f985c83d59361ee6beb49cf2a797d8c909e2eccfc61fdc5359d5ac9b10fbaeef2eebea1667b5b9bf8f5d603d6e0000000000000000000000000000000018344ca9d4913e817264ed8119fe4d136f2041b0a99d4b5fe7f2b7f268256eec9fceb27fa61c4225f47babd17759c0130000000000000000000000000000000016b19dd160140ab5592e4e1f46ad0e3e413ceed148adfb0bf5b240a161b22b7dac5b45a389770a634bc8551f72dd12710000000000000000000000000000000009f439fffd4bbbf789bd0b5521a9dcea6e66282a167ce9b26d6543fba82101003d31f4a0ed3592f820d0a6d81c004954000000000000000000000000000000000217a4c563d730ef545e452038813301933ccc6638321ee5e217dad0be2e3ddc855a14054d0d72b6bcc692a5fb1ac7300000000000000000000000000000000007025f1c4a5f85a9c1587d4d4a2e620d83d60568343940ffd85e6b1e4fb0f0f53bb08c4f48bf6f45a7dbc3722ecc951e00000000000000000000000000000000162ea8f985c83d59361ee6beb49cf2a797d8c909e2eccfc61fdc5359d5ac9b10fbaeef2eebea1667b5b9bf8f5d603d6e0000000000000000000000000000000018344ca9d4913e817264ed8119fe4d136f2041b0a99d4b5fe7f2b7f268256eec9fceb27fa61c4225f47babd17759c01300000000000000000000000000000000034f7418d96bdbe4f1ed5996fc9e9e99233a5cb3aad717b3717e91ff94fecaa67250ba5b27dcf59c6e36aae08d22983a00000000000000000000000000000000100cd7ea3c342aa2c15e9c6121a1cfecf611235add08290cf9cb8ea54e8ff523e17a0b5dc41e6d07992e5927e3ff6157000000000000000000000000000000000217a4c563d730ef545e452038813301933ccc6638321ee5e217dad0be2e3ddc855a14054d0d72b6bcc692a5fb1ac7300000000000000000000000000000000012feb2cdef2060f089c32a68f91d4ac9e0a1461cbf4bd1bf8ed26782a700052ee2fb73af689490ba12233c8dd133158d00000000000000000000000000000000162ea8f985c83d59361ee6beb49cf2a797d8c909e2eccfc61fdc5359d5ac9b10fbaeef2eebea1667b5b9bf8f5d603d6e0000000000000000000000000000000018344ca9d4913e817264ed8119fe4d136f2041b0a99d4b5fe7f2b7f268256eec9fceb27fa61c4225f47babd17759c01300000000000000000000000000000000034f7418d96bdbe4f1ed5996fc9e9e99233a5cb3aad717b3717e91ff94fecaa67250ba5b27dcf59c6e36aae08d22983a00000000000000000000000000000000100cd7ea3c342aa2c15e9c6121a1cfecf611235add08290cf9cb8ea54e8ff523e17a0b5dc41e6d07992e5927e3ff6157000000000000000000000000000000000217a4c563d730ef545e452038813301933ccc6638321ee5e217dad0be2e3ddc855a14054d0d72b6bcc692a5fb1ac7300000000000000000000000000000000007025f1c4a5f85a9c1587d4d4a2e620d83d60568343940ffd85e6b1e4fb0f0f53bb08c4f48bf6f45a7dbc3722ecc951e00000000000000000000000000000000162ea8f985c83d59361ee6beb49cf2a797d8c909e2eccfc61fdc5359d5ac9b10fbaeef2eebea1667b5b9bf8f5d603d6e0000000000000000000000000000000018344ca9d4913e817264ed8119fe4d136f2041b0a99d4b5fe7f2b7f268256eec9fceb27fa61c4225f47babd17759c0130000000000000000000000000000000016b19dd160140ab5592e4e1f46ad0e3e413ceed148adfb0bf5b240a161b22b7dac5b45a389770a634bc8551f72dd12710000000000000000000000000000000009f439fffd4bbbf789bd0b5521a9dcea6e66282a167ce9b26d6543fba82101003d31f4a0ed3592f820d0a6d81c004954000000000000000000000000000000000217a4c563d730ef545e452038813301933ccc6638321ee5e217dad0be2e3ddc855a14054d0d72b6bcc692a5fb1ac7300000000000000000000000000000000012feb2cdef2060f089c32a68f91d4ac9e0a1461cbf4bd1bf8ed26782a700052ee2fb73af689490ba12233c8dd133158d00000000000000000000000000000000162ea8f985c83d59361ee6beb49cf2a797d8c909e2eccfc61fdc5359d5ac9b10fbaeef2eebea1667b5b9bf8f5d603d6e0000000000000000000000000000000018344ca9d4913e817264ed8119fe4d136f2041b0a99d4b5fe7f2b7f268256eec9fceb27fa61c4225f47babd17759c0130000000000000000000000000000000016b19dd160140ab5592e4e1f46ad0e3e413ceed148adfb0bf5b240a161b22b7dac5b45a389770a634bc8551f72dd12710000000000000000000000000000000009f439fffd4bbbf789bd0b5521a9dcea6e66282a167ce9b26d6543fba82101003d31f4a0ed3592f820d0a6d81c004954", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_92", + "Gas": 299000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000009ec00ea2da59d937d3154d86dbed2957667253401bce9de80e0ffe6df32f36b06404b9e3af08e912a0b4ef091f93efb000000000000000000000000000000000dd8d1bd66f4accbc9d0c7dabef7af72f51c67a0d61384647533ad92bba44a312f0be0fa52163176f1aff4e64c00aefb0000000000000000000000000000000001cdfae9234096578b9413f926ef8c6831f2c0f700e25d7553a746aef44238e493f8032e09f67f2fed9676c9611f60e70000000000000000000000000000000019c8bae08d3926997146f7827f00cde863684dd4050ea5da64f6798e7a930d3c1f34046bea0f44232594f5469db566280000000000000000000000000000000013574b997ee8988aa81db0e2ddb98be2e7005603076fac5cb246f65c869aa7bb3f148c8dde970e34e5e5efce023e633c000000000000000000000000000000000998bc9d41c5d527360fc4e68ba067d3778cf5cf00e5959b5ec52c1595aabe6e2e92d40cb34faa84513d150568c8cfc00000000000000000000000000000000009ec00ea2da59d937d3154d86dbed2957667253401bce9de80e0ffe6df32f36b06404b9e3af08e912a0b4ef091f93efb000000000000000000000000000000000c28402cd28b39ce814adfdb8453fd646f5ae3e41d718e5af1fd250e3b0cabf2efa01f045f3dce88c84f0b19b3fefbb00000000000000000000000000000000001cdfae9234096578b9413f926ef8c6831f2c0f700e25d7553a746aef44238e493f8032e09f67f2fed9676c9611f60e70000000000000000000000000000000019c8bae08d3926997146f7827f00cde863684dd4050ea5da64f6798e7a930d3c1f34046bea0f44232594f5469db566280000000000000000000000000000000013574b997ee8988aa81db0e2ddb98be2e7005603076fac5cb246f65c869aa7bb3f148c8dde970e34e5e5efce023e633c000000000000000000000000000000000998bc9d41c5d527360fc4e68ba067d3778cf5cf00e5959b5ec52c1595aabe6e2e92d40cb34faa84513d150568c8cfc00000000000000000000000000000000009ec00ea2da59d937d3154d86dbed2957667253401bce9de80e0ffe6df32f36b06404b9e3af08e912a0b4ef091f93efb000000000000000000000000000000000dd8d1bd66f4accbc9d0c7dabef7af72f51c67a0d61384647533ad92bba44a312f0be0fa52163176f1aff4e64c00aefb0000000000000000000000000000000001cdfae9234096578b9413f926ef8c6831f2c0f700e25d7553a746aef44238e493f8032e09f67f2fed9676c9611f60e70000000000000000000000000000000019c8bae08d3926997146f7827f00cde863684dd4050ea5da64f6798e7a930d3c1f34046bea0f44232594f5469db566280000000000000000000000000000000006a9c650ba974e0fa2fdf6d3659220f47d76f581ec156662b4e9dc4470164e68df977370d2bcf1cad4191031fdc1476f000000000000000000000000000000001068554cf7ba1173150be2cfb7ab4503ecea55b5f29f7d24086ba68b610637b5f0192bf1fe04557b68c1eafa9736daeb0000000000000000000000000000000009ec00ea2da59d937d3154d86dbed2957667253401bce9de80e0ffe6df32f36b06404b9e3af08e912a0b4ef091f93efb000000000000000000000000000000000c28402cd28b39ce814adfdb8453fd646f5ae3e41d718e5af1fd250e3b0cabf2efa01f045f3dce88c84f0b19b3fefbb00000000000000000000000000000000001cdfae9234096578b9413f926ef8c6831f2c0f700e25d7553a746aef44238e493f8032e09f67f2fed9676c9611f60e70000000000000000000000000000000019c8bae08d3926997146f7827f00cde863684dd4050ea5da64f6798e7a930d3c1f34046bea0f44232594f5469db566280000000000000000000000000000000006a9c650ba974e0fa2fdf6d3659220f47d76f581ec156662b4e9dc4470164e68df977370d2bcf1cad4191031fdc1476f000000000000000000000000000000001068554cf7ba1173150be2cfb7ab4503ecea55b5f29f7d24086ba68b610637b5f0192bf1fe04557b68c1eafa9736daeb0000000000000000000000000000000009ec00ea2da59d937d3154d86dbed2957667253401bce9de80e0ffe6df32f36b06404b9e3af08e912a0b4ef091f93efb000000000000000000000000000000000dd8d1bd66f4accbc9d0c7dabef7af72f51c67a0d61384647533ad92bba44a312f0be0fa52163176f1aff4e64c00aefb0000000000000000000000000000000001cdfae9234096578b9413f926ef8c6831f2c0f700e25d7553a746aef44238e493f8032e09f67f2fed9676c9611f60e70000000000000000000000000000000019c8bae08d3926997146f7827f00cde863684dd4050ea5da64f6798e7a930d3c1f34046bea0f44232594f5469db566280000000000000000000000000000000013574b997ee8988aa81db0e2ddb98be2e7005603076fac5cb246f65c869aa7bb3f148c8dde970e34e5e5efce023e633c000000000000000000000000000000000998bc9d41c5d527360fc4e68ba067d3778cf5cf00e5959b5ec52c1595aabe6e2e92d40cb34faa84513d150568c8cfc00000000000000000000000000000000009ec00ea2da59d937d3154d86dbed2957667253401bce9de80e0ffe6df32f36b06404b9e3af08e912a0b4ef091f93efb000000000000000000000000000000000c28402cd28b39ce814adfdb8453fd646f5ae3e41d718e5af1fd250e3b0cabf2efa01f045f3dce88c84f0b19b3fefbb00000000000000000000000000000000001cdfae9234096578b9413f926ef8c6831f2c0f700e25d7553a746aef44238e493f8032e09f67f2fed9676c9611f60e70000000000000000000000000000000019c8bae08d3926997146f7827f00cde863684dd4050ea5da64f6798e7a930d3c1f34046bea0f44232594f5469db566280000000000000000000000000000000013574b997ee8988aa81db0e2ddb98be2e7005603076fac5cb246f65c869aa7bb3f148c8dde970e34e5e5efce023e633c000000000000000000000000000000000998bc9d41c5d527360fc4e68ba067d3778cf5cf00e5959b5ec52c1595aabe6e2e92d40cb34faa84513d150568c8cfc00000000000000000000000000000000009ec00ea2da59d937d3154d86dbed2957667253401bce9de80e0ffe6df32f36b06404b9e3af08e912a0b4ef091f93efb000000000000000000000000000000000dd8d1bd66f4accbc9d0c7dabef7af72f51c67a0d61384647533ad92bba44a312f0be0fa52163176f1aff4e64c00aefb0000000000000000000000000000000001cdfae9234096578b9413f926ef8c6831f2c0f700e25d7553a746aef44238e493f8032e09f67f2fed9676c9611f60e70000000000000000000000000000000019c8bae08d3926997146f7827f00cde863684dd4050ea5da64f6798e7a930d3c1f34046bea0f44232594f5469db566280000000000000000000000000000000006a9c650ba974e0fa2fdf6d3659220f47d76f581ec156662b4e9dc4470164e68df977370d2bcf1cad4191031fdc1476f000000000000000000000000000000001068554cf7ba1173150be2cfb7ab4503ecea55b5f29f7d24086ba68b610637b5f0192bf1fe04557b68c1eafa9736daeb0000000000000000000000000000000009ec00ea2da59d937d3154d86dbed2957667253401bce9de80e0ffe6df32f36b06404b9e3af08e912a0b4ef091f93efb000000000000000000000000000000000c28402cd28b39ce814adfdb8453fd646f5ae3e41d718e5af1fd250e3b0cabf2efa01f045f3dce88c84f0b19b3fefbb00000000000000000000000000000000001cdfae9234096578b9413f926ef8c6831f2c0f700e25d7553a746aef44238e493f8032e09f67f2fed9676c9611f60e70000000000000000000000000000000019c8bae08d3926997146f7827f00cde863684dd4050ea5da64f6798e7a930d3c1f34046bea0f44232594f5469db566280000000000000000000000000000000006a9c650ba974e0fa2fdf6d3659220f47d76f581ec156662b4e9dc4470164e68df977370d2bcf1cad4191031fdc1476f000000000000000000000000000000001068554cf7ba1173150be2cfb7ab4503ecea55b5f29f7d24086ba68b610637b5f0192bf1fe04557b68c1eafa9736daeb", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_93", + "Gas": 299000, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000014153e01c9e495c5c01c82b3cad9eaf20cf78369ccbabf57fb160ded309cbd1caea3d3df38a7ea5490c67f168e9acec0000000000000000000000000000000001648030be79658c134e016a211d311841988065957b35e9bc1580fb6e05e291e747b7a960a50e26a2a3c0cd1634c3585000000000000000000000000000000000c78d84157dc0b102c3843e4c8e88f244cc1b2a27043e07b2fab694a58f93d47e4cf9ca1158a8e30e3d43f94a20d33b50000000000000000000000000000000004842fe0df312f735a9d8af0c2ff7c561ed9cf4add5e3e9402bcff1190f3f36ca91de8edc9472b3ebd27ee2d9afdf8770000000000000000000000000000000008c7a67b89960da4309888bc6ce31e7efe74867165a8aceda7c7290f8a92687100ccbcd39d4d5a67f21f4b63ecc638320000000000000000000000000000000001cd7978ce28629ed1a9c5433c555b1ebb584f80909599282467e7b2471f591bea1d73e7b0a247aed7de4f1fecc012040000000000000000000000000000000014153e01c9e495c5c01c82b3cad9eaf20cf78369ccbabf57fb160ded309cbd1caea3d3df38a7ea5490c67f168e9acec00000000000000000000000000000000003b90ede51e98dd9163b911431789b534aef452b9bd1b423a5d8c2ea1652cd05aa308568a7031d958fc2f32e9cb37526000000000000000000000000000000000c78d84157dc0b102c3843e4c8e88f244cc1b2a27043e07b2fab694a58f93d47e4cf9ca1158a8e30e3d43f94a20d33b50000000000000000000000000000000004842fe0df312f735a9d8af0c2ff7c561ed9cf4add5e3e9402bcff1190f3f36ca91de8edc9472b3ebd27ee2d9afdf8770000000000000000000000000000000008c7a67b89960da4309888bc6ce31e7efe74867165a8aceda7c7290f8a92687100ccbcd39d4d5a67f21f4b63ecc638320000000000000000000000000000000001cd7978ce28629ed1a9c5433c555b1ebb584f80909599282467e7b2471f591bea1d73e7b0a247aed7de4f1fecc012040000000000000000000000000000000014153e01c9e495c5c01c82b3cad9eaf20cf78369ccbabf57fb160ded309cbd1caea3d3df38a7ea5490c67f168e9acec0000000000000000000000000000000001648030be79658c134e016a211d311841988065957b35e9bc1580fb6e05e291e747b7a960a50e26a2a3c0cd1634c3585000000000000000000000000000000000c78d84157dc0b102c3843e4c8e88f244cc1b2a27043e07b2fab694a58f93d47e4cf9ca1158a8e30e3d43f94a20d33b50000000000000000000000000000000004842fe0df312f735a9d8af0c2ff7c561ed9cf4add5e3e9402bcff1190f3f36ca91de8edc9472b3ebd27ee2d9afdf8770000000000000000000000000000000011396b6eafe9d8f61a831ef9d6688e586602c5138ddc65d1bf69a9916c1e8db31ddf432b1406a597c7dfb49c1339727900000000000000000000000000000000183398716b5783fb7971e27306f651b8a91efc0462ef799742c8eaeeaf919d08348e8c1700b1b850e220b0e0133f98a70000000000000000000000000000000014153e01c9e495c5c01c82b3cad9eaf20cf78369ccbabf57fb160ded309cbd1caea3d3df38a7ea5490c67f168e9acec00000000000000000000000000000000003b90ede51e98dd9163b911431789b534aef452b9bd1b423a5d8c2ea1652cd05aa308568a7031d958fc2f32e9cb37526000000000000000000000000000000000c78d84157dc0b102c3843e4c8e88f244cc1b2a27043e07b2fab694a58f93d47e4cf9ca1158a8e30e3d43f94a20d33b50000000000000000000000000000000004842fe0df312f735a9d8af0c2ff7c561ed9cf4add5e3e9402bcff1190f3f36ca91de8edc9472b3ebd27ee2d9afdf8770000000000000000000000000000000011396b6eafe9d8f61a831ef9d6688e586602c5138ddc65d1bf69a9916c1e8db31ddf432b1406a597c7dfb49c1339727900000000000000000000000000000000183398716b5783fb7971e27306f651b8a91efc0462ef799742c8eaeeaf919d08348e8c1700b1b850e220b0e0133f98a70000000000000000000000000000000014153e01c9e495c5c01c82b3cad9eaf20cf78369ccbabf57fb160ded309cbd1caea3d3df38a7ea5490c67f168e9acec0000000000000000000000000000000001648030be79658c134e016a211d311841988065957b35e9bc1580fb6e05e291e747b7a960a50e26a2a3c0cd1634c3585000000000000000000000000000000000c78d84157dc0b102c3843e4c8e88f244cc1b2a27043e07b2fab694a58f93d47e4cf9ca1158a8e30e3d43f94a20d33b50000000000000000000000000000000004842fe0df312f735a9d8af0c2ff7c561ed9cf4add5e3e9402bcff1190f3f36ca91de8edc9472b3ebd27ee2d9afdf8770000000000000000000000000000000008c7a67b89960da4309888bc6ce31e7efe74867165a8aceda7c7290f8a92687100ccbcd39d4d5a67f21f4b63ecc638320000000000000000000000000000000001cd7978ce28629ed1a9c5433c555b1ebb584f80909599282467e7b2471f591bea1d73e7b0a247aed7de4f1fecc012040000000000000000000000000000000014153e01c9e495c5c01c82b3cad9eaf20cf78369ccbabf57fb160ded309cbd1caea3d3df38a7ea5490c67f168e9acec00000000000000000000000000000000003b90ede51e98dd9163b911431789b534aef452b9bd1b423a5d8c2ea1652cd05aa308568a7031d958fc2f32e9cb37526000000000000000000000000000000000c78d84157dc0b102c3843e4c8e88f244cc1b2a27043e07b2fab694a58f93d47e4cf9ca1158a8e30e3d43f94a20d33b50000000000000000000000000000000004842fe0df312f735a9d8af0c2ff7c561ed9cf4add5e3e9402bcff1190f3f36ca91de8edc9472b3ebd27ee2d9afdf8770000000000000000000000000000000008c7a67b89960da4309888bc6ce31e7efe74867165a8aceda7c7290f8a92687100ccbcd39d4d5a67f21f4b63ecc638320000000000000000000000000000000001cd7978ce28629ed1a9c5433c555b1ebb584f80909599282467e7b2471f591bea1d73e7b0a247aed7de4f1fecc012040000000000000000000000000000000014153e01c9e495c5c01c82b3cad9eaf20cf78369ccbabf57fb160ded309cbd1caea3d3df38a7ea5490c67f168e9acec0000000000000000000000000000000001648030be79658c134e016a211d311841988065957b35e9bc1580fb6e05e291e747b7a960a50e26a2a3c0cd1634c3585000000000000000000000000000000000c78d84157dc0b102c3843e4c8e88f244cc1b2a27043e07b2fab694a58f93d47e4cf9ca1158a8e30e3d43f94a20d33b50000000000000000000000000000000004842fe0df312f735a9d8af0c2ff7c561ed9cf4add5e3e9402bcff1190f3f36ca91de8edc9472b3ebd27ee2d9afdf8770000000000000000000000000000000011396b6eafe9d8f61a831ef9d6688e586602c5138ddc65d1bf69a9916c1e8db31ddf432b1406a597c7dfb49c1339727900000000000000000000000000000000183398716b5783fb7971e27306f651b8a91efc0462ef799742c8eaeeaf919d08348e8c1700b1b850e220b0e0133f98a70000000000000000000000000000000014153e01c9e495c5c01c82b3cad9eaf20cf78369ccbabf57fb160ded309cbd1caea3d3df38a7ea5490c67f168e9acec00000000000000000000000000000000003b90ede51e98dd9163b911431789b534aef452b9bd1b423a5d8c2ea1652cd05aa308568a7031d958fc2f32e9cb37526000000000000000000000000000000000c78d84157dc0b102c3843e4c8e88f244cc1b2a27043e07b2fab694a58f93d47e4cf9ca1158a8e30e3d43f94a20d33b50000000000000000000000000000000004842fe0df312f735a9d8af0c2ff7c561ed9cf4add5e3e9402bcff1190f3f36ca91de8edc9472b3ebd27ee2d9afdf8770000000000000000000000000000000011396b6eafe9d8f61a831ef9d6688e586602c5138ddc65d1bf69a9916c1e8db31ddf432b1406a597c7dfb49c1339727900000000000000000000000000000000183398716b5783fb7971e27306f651b8a91efc0462ef799742c8eaeeaf919d08348e8c1700b1b850e220b0e0133f98a7", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_94", + "Gas": 299000, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000001555535228eb9a24f460df9894d59aa06fc848a8bf8d6c3b51653b1d85734b3c5a2bece161309bd478d356fa198d579500000000000000000000000000000000144401f7eb69f6321eae8dad39dbe2cf4ae58e455474701dd9f1b62c85c7536813e84eb4f9def511eb62e5194288728b000000000000000000000000000000000e619d79792ac685030311a31a21203e5172d2e5d20ecf69a1e64158e7fe903b3695fd15432d3ca35562b5a8bd9cbdc20000000000000000000000000000000012394a621a503d1d92df3306649a6c6979816cabeb8f8d27450ec883c4e75f6f7411f3bfd068dc8dee58cdb8ebbd91bd0000000000000000000000000000000001652a688dbfd63a1c89452335bdaf248c97c9c6e5a3ad5a126577a6b9ab57075b22987ea8697b459611a5ab164f328400000000000000000000000000000000058a37347c5637808632ae6e8f264e8bde14ebb0ae69828f962f51b728321fea57c5a97ab694f7db175efe7a17d36cb6000000000000000000000000000000001555535228eb9a24f460df9894d59aa06fc848a8bf8d6c3b51653b1d85734b3c5a2bece161309bd478d356fa198d57950000000000000000000000000000000005bd0ff24e15f0682c6d1a09096fca081991bd3f9f10a2a18d3f1c7470e9a2bc0ac3b149b7750aedce9c1ae6bd773820000000000000000000000000000000000e619d79792ac685030311a31a21203e5172d2e5d20ecf69a1e64158e7fe903b3695fd15432d3ca35562b5a8bd9cbdc20000000000000000000000000000000012394a621a503d1d92df3306649a6c6979816cabeb8f8d27450ec883c4e75f6f7411f3bfd068dc8dee58cdb8ebbd91bd0000000000000000000000000000000001652a688dbfd63a1c89452335bdaf248c97c9c6e5a3ad5a126577a6b9ab57075b22987ea8697b459611a5ab164f328400000000000000000000000000000000058a37347c5637808632ae6e8f264e8bde14ebb0ae69828f962f51b728321fea57c5a97ab694f7db175efe7a17d36cb6000000000000000000000000000000001555535228eb9a24f460df9894d59aa06fc848a8bf8d6c3b51653b1d85734b3c5a2bece161309bd478d356fa198d579500000000000000000000000000000000144401f7eb69f6321eae8dad39dbe2cf4ae58e455474701dd9f1b62c85c7536813e84eb4f9def511eb62e5194288728b000000000000000000000000000000000e619d79792ac685030311a31a21203e5172d2e5d20ecf69a1e64158e7fe903b3695fd15432d3ca35562b5a8bd9cbdc20000000000000000000000000000000012394a621a503d1d92df3306649a6c6979816cabeb8f8d27450ec883c4e75f6f7411f3bfd068dc8dee58cdb8ebbd91bd00000000000000000000000000000000189be781abc010602e9262930d8dfdb2d7df81be0de1656554cb5afa3d059f1cc389678008ea84ba23ed5a54e9b07827000000000000000000000000000000001476dab5bd29af19c4e8f947b4255e4b86625fd4451b902fd10180e9ce7ed639c6e65683fabf0824a2a00185e82c3df5000000000000000000000000000000001555535228eb9a24f460df9894d59aa06fc848a8bf8d6c3b51653b1d85734b3c5a2bece161309bd478d356fa198d57950000000000000000000000000000000005bd0ff24e15f0682c6d1a09096fca081991bd3f9f10a2a18d3f1c7470e9a2bc0ac3b149b7750aedce9c1ae6bd773820000000000000000000000000000000000e619d79792ac685030311a31a21203e5172d2e5d20ecf69a1e64158e7fe903b3695fd15432d3ca35562b5a8bd9cbdc20000000000000000000000000000000012394a621a503d1d92df3306649a6c6979816cabeb8f8d27450ec883c4e75f6f7411f3bfd068dc8dee58cdb8ebbd91bd00000000000000000000000000000000189be781abc010602e9262930d8dfdb2d7df81be0de1656554cb5afa3d059f1cc389678008ea84ba23ed5a54e9b07827000000000000000000000000000000001476dab5bd29af19c4e8f947b4255e4b86625fd4451b902fd10180e9ce7ed639c6e65683fabf0824a2a00185e82c3df5000000000000000000000000000000001555535228eb9a24f460df9894d59aa06fc848a8bf8d6c3b51653b1d85734b3c5a2bece161309bd478d356fa198d579500000000000000000000000000000000144401f7eb69f6321eae8dad39dbe2cf4ae58e455474701dd9f1b62c85c7536813e84eb4f9def511eb62e5194288728b000000000000000000000000000000000e619d79792ac685030311a31a21203e5172d2e5d20ecf69a1e64158e7fe903b3695fd15432d3ca35562b5a8bd9cbdc20000000000000000000000000000000012394a621a503d1d92df3306649a6c6979816cabeb8f8d27450ec883c4e75f6f7411f3bfd068dc8dee58cdb8ebbd91bd0000000000000000000000000000000001652a688dbfd63a1c89452335bdaf248c97c9c6e5a3ad5a126577a6b9ab57075b22987ea8697b459611a5ab164f328400000000000000000000000000000000058a37347c5637808632ae6e8f264e8bde14ebb0ae69828f962f51b728321fea57c5a97ab694f7db175efe7a17d36cb6000000000000000000000000000000001555535228eb9a24f460df9894d59aa06fc848a8bf8d6c3b51653b1d85734b3c5a2bece161309bd478d356fa198d57950000000000000000000000000000000005bd0ff24e15f0682c6d1a09096fca081991bd3f9f10a2a18d3f1c7470e9a2bc0ac3b149b7750aedce9c1ae6bd773820000000000000000000000000000000000e619d79792ac685030311a31a21203e5172d2e5d20ecf69a1e64158e7fe903b3695fd15432d3ca35562b5a8bd9cbdc20000000000000000000000000000000012394a621a503d1d92df3306649a6c6979816cabeb8f8d27450ec883c4e75f6f7411f3bfd068dc8dee58cdb8ebbd91bd0000000000000000000000000000000001652a688dbfd63a1c89452335bdaf248c97c9c6e5a3ad5a126577a6b9ab57075b22987ea8697b459611a5ab164f328400000000000000000000000000000000058a37347c5637808632ae6e8f264e8bde14ebb0ae69828f962f51b728321fea57c5a97ab694f7db175efe7a17d36cb6000000000000000000000000000000001555535228eb9a24f460df9894d59aa06fc848a8bf8d6c3b51653b1d85734b3c5a2bece161309bd478d356fa198d579500000000000000000000000000000000144401f7eb69f6321eae8dad39dbe2cf4ae58e455474701dd9f1b62c85c7536813e84eb4f9def511eb62e5194288728b000000000000000000000000000000000e619d79792ac685030311a31a21203e5172d2e5d20ecf69a1e64158e7fe903b3695fd15432d3ca35562b5a8bd9cbdc20000000000000000000000000000000012394a621a503d1d92df3306649a6c6979816cabeb8f8d27450ec883c4e75f6f7411f3bfd068dc8dee58cdb8ebbd91bd00000000000000000000000000000000189be781abc010602e9262930d8dfdb2d7df81be0de1656554cb5afa3d059f1cc389678008ea84ba23ed5a54e9b07827000000000000000000000000000000001476dab5bd29af19c4e8f947b4255e4b86625fd4451b902fd10180e9ce7ed639c6e65683fabf0824a2a00185e82c3df5000000000000000000000000000000001555535228eb9a24f460df9894d59aa06fc848a8bf8d6c3b51653b1d85734b3c5a2bece161309bd478d356fa198d57950000000000000000000000000000000005bd0ff24e15f0682c6d1a09096fca081991bd3f9f10a2a18d3f1c7470e9a2bc0ac3b149b7750aedce9c1ae6bd773820000000000000000000000000000000000e619d79792ac685030311a31a21203e5172d2e5d20ecf69a1e64158e7fe903b3695fd15432d3ca35562b5a8bd9cbdc20000000000000000000000000000000012394a621a503d1d92df3306649a6c6979816cabeb8f8d27450ec883c4e75f6f7411f3bfd068dc8dee58cdb8ebbd91bd00000000000000000000000000000000189be781abc010602e9262930d8dfdb2d7df81be0de1656554cb5afa3d059f1cc389678008ea84ba23ed5a54e9b07827000000000000000000000000000000001476dab5bd29af19c4e8f947b4255e4b86625fd4451b902fd10180e9ce7ed639c6e65683fabf0824a2a00185e82c3df5", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "matter_pairing_95", + "Gas": 299000, + "NoBenchmark": false + } +] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/precompiles/bn256Add.json b/x/evm/core/vm/testdata/precompiles/bn256Add.json new file mode 100644 index 0000000000..b6fcd550e3 --- /dev/null +++ b/x/evm/core/vm/testdata/precompiles/bn256Add.json @@ -0,0 +1,114 @@ +[ + { + "Input": "18b18acfb4c2c30276db5411368e7185b311dd124691610c5d3b74034e093dc9063c909c4720840cb5134cb9f59fa749755796819658d32efc0d288198f3726607c2b7f58a84bd6145f00c9c2bc0bb1a187f20ff2c92963a88019e7c6a014eed06614e20c147e940f2d70da3f74c9a17df361706a4485c742bd6788478fa17d7", + "Expected": "2243525c5efd4b9c3d3c45ac0ca3fe4dd85e830a4ce6b65fa1eeaee202839703301d1d33be6da8e509df21cc35964723180eed7532537db9ae5e7d48f195c915", + "Name": "chfast1", + "Gas": 150, + "NoBenchmark": false + }, + { + "Input": "2243525c5efd4b9c3d3c45ac0ca3fe4dd85e830a4ce6b65fa1eeaee202839703301d1d33be6da8e509df21cc35964723180eed7532537db9ae5e7d48f195c91518b18acfb4c2c30276db5411368e7185b311dd124691610c5d3b74034e093dc9063c909c4720840cb5134cb9f59fa749755796819658d32efc0d288198f37266", + "Expected": "2bd3e6d0f3b142924f5ca7b49ce5b9d54c4703d7ae5648e61d02268b1a0a9fb721611ce0a6af85915e2f1d70300909ce2e49dfad4a4619c8390cae66cefdb204", + "Name": "chfast2", + "Gas": 150, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "Expected": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "Name": "cdetrio1", + "Gas": 150, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "Expected": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "Name": "cdetrio2", + "Gas": 150, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "Expected": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "Name": "cdetrio3", + "Gas": 150, + "NoBenchmark": false + }, + { + "Input": "", + "Expected": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "Name": "cdetrio4", + "Gas": 150, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "Expected": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "Name": "cdetrio5", + "Gas": 150, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + "Expected": "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + "Name": "cdetrio6", + "Gas": 150, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "Expected": "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + "Name": "cdetrio7", + "Gas": 150, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + "Expected": "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + "Name": "cdetrio8", + "Gas": 150, + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "Expected": "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + "Gas": 150, + "Name": "cdetrio9", + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "Expected": "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + "Gas": 150, + "Name": "cdetrio10", + "NoBenchmark": false + }, + { + "Input": "0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + "Expected": "030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd315ed738c0e0a7c92e7845f96b2ae9c0a68a6a449e3538fc7ff3ebf7a5a18a2c4", + "Name": "cdetrio11", + "Gas": 150, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "Expected": "030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd315ed738c0e0a7c92e7845f96b2ae9c0a68a6a449e3538fc7ff3ebf7a5a18a2c4", + "Name": "cdetrio12", + "Gas": 150, + "NoBenchmark": false + }, + { + "Input": "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7c039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d98", + "Expected": "15bf2bb17880144b5d1cd2b1f46eff9d617bffd1ca57c37fb5a49bd84e53cf66049c797f9ce0d17083deb32b5e36f2ea2a212ee036598dd7624c168993d1355f", + "Name": "cdetrio13", + "Gas": 150, + "NoBenchmark": false + }, + { + "Input": "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7c17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa92e83f8d734803fc370eba25ed1f6b8768bd6d83887b87165fc2434fe11a830cb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "Expected": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "Name": "cdetrio14", + "Gas": 150, + "NoBenchmark": false + } +] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/precompiles/bn256Pairing.json b/x/evm/core/vm/testdata/precompiles/bn256Pairing.json new file mode 100644 index 0000000000..3fbed6b87c --- /dev/null +++ b/x/evm/core/vm/testdata/precompiles/bn256Pairing.json @@ -0,0 +1,100 @@ +[ + { + "Input": "1c76476f4def4bb94541d57ebba1193381ffa7aa76ada664dd31c16024c43f593034dd2920f673e204fee2811c678745fc819b55d3e9d294e45c9b03a76aef41209dd15ebff5d46c4bd888e51a93cf99a7329636c63514396b4a452003a35bf704bf11ca01483bfa8b34b43561848d28905960114c8ac04049af4b6315a416782bb8324af6cfc93537a2ad1a445cfd0ca2a71acd7ac41fadbf933c2a51be344d120a2a4cf30c1bf9845f20c6fe39e07ea2cce61f0c9bb048165fe5e4de877550111e129f1cf1097710d41c4ac70fcdfa5ba2023c6ff1cbeac322de49d1b6df7c2032c61a830e3c17286de9462bf242fca2883585b93870a73853face6a6bf411198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "jeff1", + "Gas": 113000, + "NoBenchmark": false + }, + { + "Input": "2eca0c7238bf16e83e7a1e6c5d49540685ff51380f309842a98561558019fc0203d3260361bb8451de5ff5ecd17f010ff22f5c31cdf184e9020b06fa5997db841213d2149b006137fcfb23036606f848d638d576a120ca981b5b1a5f9300b3ee2276cf730cf493cd95d64677bbb75fc42db72513a4c1e387b476d056f80aa75f21ee6226d31426322afcda621464d0611d226783262e21bb3bc86b537e986237096df1f82dff337dd5972e32a8ad43e28a78a96a823ef1cd4debe12b6552ea5f06967a1237ebfeca9aaae0d6d0bab8e28c198c5a339ef8a2407e31cdac516db922160fa257a5fd5b280642ff47b65eca77e626cb685c84fa6d3b6882a283ddd1198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "jeff2", + "Gas": 113000, + "NoBenchmark": false + }, + { + "Input": "0f25929bcb43d5a57391564615c9e70a992b10eafa4db109709649cf48c50dd216da2f5cb6be7a0aa72c440c53c9bbdfec6c36c7d515536431b3a865468acbba2e89718ad33c8bed92e210e81d1853435399a271913a6520736a4729cf0d51eb01a9e2ffa2e92599b68e44de5bcf354fa2642bd4f26b259daa6f7ce3ed57aeb314a9a87b789a58af499b314e13c3d65bede56c07ea2d418d6874857b70763713178fb49a2d6cd347dc58973ff49613a20757d0fcc22079f9abd10c3baee245901b9e027bd5cfc2cb5db82d4dc9677ac795ec500ecd47deee3b5da006d6d049b811d7511c78158de484232fc68daf8a45cf217d1c2fae693ff5871e8752d73b21198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "jeff3", + "Gas": 113000, + "NoBenchmark": false + }, + { + "Input": "2f2ea0b3da1e8ef11914acf8b2e1b32d99df51f5f4f206fc6b947eae860eddb6068134ddb33dc888ef446b648d72338684d678d2eb2371c61a50734d78da4b7225f83c8b6ab9de74e7da488ef02645c5a16a6652c3c71a15dc37fe3a5dcb7cb122acdedd6308e3bb230d226d16a105295f523a8a02bfc5e8bd2da135ac4c245d065bbad92e7c4e31bf3757f1fe7362a63fbfee50e7dc68da116e67d600d9bf6806d302580dc0661002994e7cd3a7f224e7ddc27802777486bf80f40e4ca3cfdb186bac5188a98c45e6016873d107f5cd131f3a3e339d0375e58bd6219347b008122ae2b09e539e152ec5364e7e2204b03d11d3caa038bfc7cd499f8176aacbee1f39e4e4afc4bc74790a4a028aff2c3d2538731fb755edefd8cb48d6ea589b5e283f150794b6736f670d6a1033f9b46c6f5204f50813eb85c8dc4b59db1c5d39140d97ee4d2b36d99bc49974d18ecca3e7ad51011956051b464d9e27d46cc25e0764bb98575bd466d32db7b15f582b2d5c452b36aa394b789366e5e3ca5aabd415794ab061441e51d01e94640b7e3084a07e02c78cf3103c542bc5b298669f211b88da1679b0b64a63b7e0e7bfe52aae524f73a55be7fe70c7e9bfc94b4cf0da1213d2149b006137fcfb23036606f848d638d576a120ca981b5b1a5f9300b3ee2276cf730cf493cd95d64677bbb75fc42db72513a4c1e387b476d056f80aa75f21ee6226d31426322afcda621464d0611d226783262e21bb3bc86b537e986237096df1f82dff337dd5972e32a8ad43e28a78a96a823ef1cd4debe12b6552ea5f", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "jeff4", + "Gas": 147000, + "NoBenchmark": false + }, + { + "Input": "20a754d2071d4d53903e3b31a7e98ad6882d58aec240ef981fdf0a9d22c5926a29c853fcea789887315916bbeb89ca37edb355b4f980c9a12a94f30deeed30211213d2149b006137fcfb23036606f848d638d576a120ca981b5b1a5f9300b3ee2276cf730cf493cd95d64677bbb75fc42db72513a4c1e387b476d056f80aa75f21ee6226d31426322afcda621464d0611d226783262e21bb3bc86b537e986237096df1f82dff337dd5972e32a8ad43e28a78a96a823ef1cd4debe12b6552ea5f1abb4a25eb9379ae96c84fff9f0540abcfc0a0d11aeda02d4f37e4baf74cb0c11073b3ff2cdbb38755f8691ea59e9606696b3ff278acfc098fa8226470d03869217cee0a9ad79a4493b5253e2e4e3a39fc2df38419f230d341f60cb064a0ac290a3d76f140db8418ba512272381446eb73958670f00cf46f1d9e64cba057b53c26f64a8ec70387a13e41430ed3ee4a7db2059cc5fc13c067194bcc0cb49a98552fd72bd9edb657346127da132e5b82ab908f5816c826acb499e22f2412d1a2d70f25929bcb43d5a57391564615c9e70a992b10eafa4db109709649cf48c50dd2198a1f162a73261f112401aa2db79c7dab1533c9935c77290a6ce3b191f2318d198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "jeff5", + "Gas": 147000, + "NoBenchmark": false + }, + { + "Input": "1c76476f4def4bb94541d57ebba1193381ffa7aa76ada664dd31c16024c43f593034dd2920f673e204fee2811c678745fc819b55d3e9d294e45c9b03a76aef41209dd15ebff5d46c4bd888e51a93cf99a7329636c63514396b4a452003a35bf704bf11ca01483bfa8b34b43561848d28905960114c8ac04049af4b6315a416782bb8324af6cfc93537a2ad1a445cfd0ca2a71acd7ac41fadbf933c2a51be344d120a2a4cf30c1bf9845f20c6fe39e07ea2cce61f0c9bb048165fe5e4de877550111e129f1cf1097710d41c4ac70fcdfa5ba2023c6ff1cbeac322de49d1b6df7c103188585e2364128fe25c70558f1560f4f9350baf3959e603cc91486e110936198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "jeff6", + "Gas": 113000, + "NoBenchmark": false + }, + { + "Input": "", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "empty_data", + "Gas": 45000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "one_point", + "Gas": 79000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "two_point_match_2", + "Gas": 113000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002203e205db4f19b37b60121b83a7333706db86431c6d835849957ed8c3928ad7927dc7234fd11d3e8c36c59277c3e6f149d5cd3cfa9a62aee49f8130962b4b3b9195e8aa5b7827463722b8c153931579d3505566b4edf48d498e185f0509de15204bb53b8977e5f92a0bc372742c4830944a59b4fe6b1c0466e2a6dad122b5d2e030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd31a76dae6d3272396d0cbe61fced2bc532edac647851e3ac53ce1cc9c7e645a83198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "two_point_match_3", + "Gas": 113000, + "NoBenchmark": false + }, + { + "Input": "105456a333e6d636854f987ea7bb713dfd0ae8371a72aea313ae0c32c0bf10160cf031d41b41557f3e7e3ba0c51bebe5da8e6ecd855ec50fc87efcdeac168bcc0476be093a6d2b4bbf907172049874af11e1b6267606e00804d3ff0037ec57fd3010c68cb50161b7d1d96bb71edfec9880171954e56871abf3d93cc94d745fa114c059d74e5b6c4ec14ae5864ebe23a71781d86c29fb8fb6cce94f70d3de7a2101b33461f39d9e887dbb100f170a2345dde3c07e256d1dfa2b657ba5cd030427000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000021a2c3013d2ea92e13c800cde68ef56a294b883f6ac35d25f587c09b1b3c635f7290158a80cd3d66530f74dc94c94adb88f5cdb481acca997b6e60071f08a115f2f997f3dbd66a7afe07fe7862ce239edba9e05c5afff7f8a1259c9733b2dfbb929d1691530ca701b4a106054688728c9972c8512e9789e9567aae23e302ccd75", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "two_point_match_4", + "Gas": 113000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "ten_point_match_1", + "Gas": 385000, + "NoBenchmark": false + }, + { + "Input": "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002203e205db4f19b37b60121b83a7333706db86431c6d835849957ed8c3928ad7927dc7234fd11d3e8c36c59277c3e6f149d5cd3cfa9a62aee49f8130962b4b3b9195e8aa5b7827463722b8c153931579d3505566b4edf48d498e185f0509de15204bb53b8977e5f92a0bc372742c4830944a59b4fe6b1c0466e2a6dad122b5d2e030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd31a76dae6d3272396d0cbe61fced2bc532edac647851e3ac53ce1cc9c7e645a83198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002203e205db4f19b37b60121b83a7333706db86431c6d835849957ed8c3928ad7927dc7234fd11d3e8c36c59277c3e6f149d5cd3cfa9a62aee49f8130962b4b3b9195e8aa5b7827463722b8c153931579d3505566b4edf48d498e185f0509de15204bb53b8977e5f92a0bc372742c4830944a59b4fe6b1c0466e2a6dad122b5d2e030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd31a76dae6d3272396d0cbe61fced2bc532edac647851e3ac53ce1cc9c7e645a83198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002203e205db4f19b37b60121b83a7333706db86431c6d835849957ed8c3928ad7927dc7234fd11d3e8c36c59277c3e6f149d5cd3cfa9a62aee49f8130962b4b3b9195e8aa5b7827463722b8c153931579d3505566b4edf48d498e185f0509de15204bb53b8977e5f92a0bc372742c4830944a59b4fe6b1c0466e2a6dad122b5d2e030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd31a76dae6d3272396d0cbe61fced2bc532edac647851e3ac53ce1cc9c7e645a83198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002203e205db4f19b37b60121b83a7333706db86431c6d835849957ed8c3928ad7927dc7234fd11d3e8c36c59277c3e6f149d5cd3cfa9a62aee49f8130962b4b3b9195e8aa5b7827463722b8c153931579d3505566b4edf48d498e185f0509de15204bb53b8977e5f92a0bc372742c4830944a59b4fe6b1c0466e2a6dad122b5d2e030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd31a76dae6d3272396d0cbe61fced2bc532edac647851e3ac53ce1cc9c7e645a83198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002203e205db4f19b37b60121b83a7333706db86431c6d835849957ed8c3928ad7927dc7234fd11d3e8c36c59277c3e6f149d5cd3cfa9a62aee49f8130962b4b3b9195e8aa5b7827463722b8c153931579d3505566b4edf48d498e185f0509de15204bb53b8977e5f92a0bc372742c4830944a59b4fe6b1c0466e2a6dad122b5d2e030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd31a76dae6d3272396d0cbe61fced2bc532edac647851e3ac53ce1cc9c7e645a83198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "ten_point_match_2", + "Gas": 385000, + "NoBenchmark": false + }, + { + "Input": "105456a333e6d636854f987ea7bb713dfd0ae8371a72aea313ae0c32c0bf10160cf031d41b41557f3e7e3ba0c51bebe5da8e6ecd855ec50fc87efcdeac168bcc0476be093a6d2b4bbf907172049874af11e1b6267606e00804d3ff0037ec57fd3010c68cb50161b7d1d96bb71edfec9880171954e56871abf3d93cc94d745fa114c059d74e5b6c4ec14ae5864ebe23a71781d86c29fb8fb6cce94f70d3de7a2101b33461f39d9e887dbb100f170a2345dde3c07e256d1dfa2b657ba5cd030427000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000021a2c3013d2ea92e13c800cde68ef56a294b883f6ac35d25f587c09b1b3c635f7290158a80cd3d66530f74dc94c94adb88f5cdb481acca997b6e60071f08a115f2f997f3dbd66a7afe07fe7862ce239edba9e05c5afff7f8a1259c9733b2dfbb929d1691530ca701b4a106054688728c9972c8512e9789e9567aae23e302ccd75", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "ten_point_match_3", + "Gas": 113000, + "NoBenchmark": false + } +] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/precompiles/bn256ScalarMul.json b/x/evm/core/vm/testdata/precompiles/bn256ScalarMul.json new file mode 100644 index 0000000000..2a28f6304b --- /dev/null +++ b/x/evm/core/vm/testdata/precompiles/bn256ScalarMul.json @@ -0,0 +1,128 @@ +[ + { + "Input": "2bd3e6d0f3b142924f5ca7b49ce5b9d54c4703d7ae5648e61d02268b1a0a9fb721611ce0a6af85915e2f1d70300909ce2e49dfad4a4619c8390cae66cefdb20400000000000000000000000000000000000000000000000011138ce750fa15c2", + "Expected": "070a8d6a982153cae4be29d434e8faef8a47b274a053f5a4ee2a6c9c13c31e5c031b8ce914eba3a9ffb989f9cdd5b0f01943074bf4f0f315690ec3cec6981afc", + "Name": "chfast1", + "Gas": 6000, + "NoBenchmark": false + }, + { + "Input": "070a8d6a982153cae4be29d434e8faef8a47b274a053f5a4ee2a6c9c13c31e5c031b8ce914eba3a9ffb989f9cdd5b0f01943074bf4f0f315690ec3cec6981afc30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd46", + "Expected": "025a6f4181d2b4ea8b724290ffb40156eb0adb514c688556eb79cdea0752c2bb2eff3f31dea215f1eb86023a133a996eb6300b44da664d64251d05381bb8a02e", + "Name": "chfast2", + "Gas": 6000, + "NoBenchmark": false + }, + { + "Input": "025a6f4181d2b4ea8b724290ffb40156eb0adb514c688556eb79cdea0752c2bb2eff3f31dea215f1eb86023a133a996eb6300b44da664d64251d05381bb8a02e183227397098d014dc2822db40c0ac2ecbc0b548b438e5469e10460b6c3e7ea3", + "Expected": "14789d0d4a730b354403b5fac948113739e276c23e0258d8596ee72f9cd9d3230af18a63153e0ec25ff9f2951dd3fa90ed0197bfef6e2a1a62b5095b9d2b4a27", + "Name": "chfast3", + "Gas": 6000, + "NoBenchmark": false + }, + { + "Input": "1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "Expected": "2cde5879ba6f13c0b5aa4ef627f159a3347df9722efce88a9afbb20b763b4c411aa7e43076f6aee272755a7f9b84832e71559ba0d2e0b17d5f9f01755e5b0d11", + "Name": "cdetrio1", + "Gas": 6000, + "NoBenchmark": false + }, + { + "Input": "1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f630644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000", + "Expected": "1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe3163511ddc1c3f25d396745388200081287b3fd1472d8339d5fecb2eae0830451", + "Name": "cdetrio2", + "Gas": 6000, + "NoBenchmark": true + }, + { + "Input": "1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000100000000000000000000000000000000", + "Expected": "1051acb0700ec6d42a88215852d582efbaef31529b6fcbc3277b5c1b300f5cf0135b2394bb45ab04b8bd7611bd2dfe1de6a4e6e2ccea1ea1955f577cd66af85b", + "Name": "cdetrio3", + "Gas": 6000, + "NoBenchmark": true + }, + { + "Input": "1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000000000000000000000000000000000009", + "Expected": "1dbad7d39dbc56379f78fac1bca147dc8e66de1b9d183c7b167351bfe0aeab742cd757d51289cd8dbd0acf9e673ad67d0f0a89f912af47ed1be53664f5692575", + "Name": "cdetrio4", + "Gas": 6000, + "NoBenchmark": true + }, + { + "Input": "1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000000000000000000000000000000000001", + "Expected": "1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f6", + "Name": "cdetrio5", + "Gas": 6000, + "NoBenchmark": true + }, + { + "Input": "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "Expected": "29e587aadd7c06722aabba753017c093f70ba7eb1f1c0104ec0564e7e3e21f6022b1143f6a41008e7755c71c3d00b6b915d386de21783ef590486d8afa8453b1", + "Name": "cdetrio6", + "Gas": 6000, + "NoBenchmark": false + }, + { + "Input": "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7c30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000", + "Expected": "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa92e83f8d734803fc370eba25ed1f6b8768bd6d83887b87165fc2434fe11a830cb", + "Name": "cdetrio7", + "Gas": 6000, + "NoBenchmark": true + }, + { + "Input": "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7c0000000000000000000000000000000100000000000000000000000000000000", + "Expected": "221a3577763877920d0d14a91cd59b9479f83b87a653bb41f82a3f6f120cea7c2752c7f64cdd7f0e494bff7b60419f242210f2026ed2ec70f89f78a4c56a1f15", + "Name": "cdetrio8", + "Gas": 6000, + "NoBenchmark": true + }, + { + "Input": "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7c0000000000000000000000000000000000000000000000000000000000000009", + "Expected": "228e687a379ba154554040f8821f4e41ee2be287c201aa9c3bc02c9dd12f1e691e0fd6ee672d04cfd924ed8fdc7ba5f2d06c53c1edc30f65f2af5a5b97f0a76a", + "Name": "cdetrio9", + "Gas": 6000, + "NoBenchmark": true + }, + { + "Input": "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7c0000000000000000000000000000000000000000000000000000000000000001", + "Expected": "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7c", + "Name": "cdetrio10", + "Gas": 6000, + "NoBenchmark": true + }, + { + "Input": "039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d98ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "Expected": "00a1a234d08efaa2616607e31eca1980128b00b415c845ff25bba3afcb81dc00242077290ed33906aeb8e42fd98c41bcb9057ba03421af3f2d08cfc441186024", + "Name": "cdetrio11", + "Gas": 6000, + "NoBenchmark": false + }, + { + "Input": "039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d9830644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000", + "Expected": "039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b8692929ee761a352600f54921df9bf472e66217e7bb0cee9032e00acc86b3c8bfaf", + "Name": "cdetrio12", + "Gas": 6000, + "NoBenchmark": true + }, + { + "Input": "039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d980000000000000000000000000000000100000000000000000000000000000000", + "Expected": "1071b63011e8c222c5a771dfa03c2e11aac9666dd097f2c620852c3951a4376a2f46fe2f73e1cf310a168d56baa5575a8319389d7bfa6b29ee2d908305791434", + "Name": "cdetrio13", + "Gas": 6000, + "NoBenchmark": true + }, + { + "Input": "039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d980000000000000000000000000000000000000000000000000000000000000009", + "Expected": "19f75b9dd68c080a688774a6213f131e3052bd353a304a189d7a2ee367e3c2582612f545fb9fc89fde80fd81c68fc7dcb27fea5fc124eeda69433cf5c46d2d7f", + "Name": "cdetrio14", + "Gas": 6000, + "NoBenchmark": true + }, + { + "Input": "039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d980000000000000000000000000000000000000000000000000000000000000001", + "Expected": "039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d98", + "Name": "cdetrio15", + "Gas": 6000, + "NoBenchmark": true + } +] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/precompiles/ecRecover.json b/x/evm/core/vm/testdata/precompiles/ecRecover.json new file mode 100644 index 0000000000..4911d6157e --- /dev/null +++ b/x/evm/core/vm/testdata/precompiles/ecRecover.json @@ -0,0 +1,37 @@ +[ + { + "Input": "a8b53bdf3306a35a7103ab5504a0c9b492295564b6202b1942a84ef300107281000000000000000000000000000000000000000000000000000000000000001b307835653165303366353363653138623737326363623030393366663731663366353366356337356237346463623331613835616138623838393262346538621122334455667788991011121314151617181920212223242526272829303132", + "Expected": "", + "Gas": 3000, + "Name": "CallEcrecoverUnrecoverableKey", + "NoBenchmark": false + }, + { + "Input": "18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c000000000000000000000000000000000000000000000000000000000000001c73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549", + "Expected": "000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "Gas": 3000, + "Name": "ValidKey", + "NoBenchmark": false + }, + { + "Input": "18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c100000000000000000000000000000000000000000000000000000000000001c73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549", + "Expected": "", + "Gas": 3000, + "Name": "InvalidHighV-bits-1", + "NoBenchmark": false + }, + { + "Input": "18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c000000000000000000000000000000000000001000000000000000000000001c73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549", + "Expected": "", + "Gas": 3000, + "Name": "InvalidHighV-bits-2", + "NoBenchmark": false + }, + { + "Input": "18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c000000000000000000000000000000000000001000000000000000000000011c73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549", + "Expected": "", + "Gas": 3000, + "Name": "InvalidHighV-bits-3", + "NoBenchmark": false + } +] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/precompiles/fail-blake2f.json b/x/evm/core/vm/testdata/precompiles/fail-blake2f.json new file mode 100644 index 0000000000..70835aa5b0 --- /dev/null +++ b/x/evm/core/vm/testdata/precompiles/fail-blake2f.json @@ -0,0 +1,22 @@ +[ + { + "Input": "", + "ExpectedError": "invalid input length", + "Name": "vector 0: empty input" + }, + { + "Input": "00000c48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001", + "ExpectedError": "invalid input length", + "Name": "vector 1: less than 213 bytes input" + }, + { + "Input": "000000000c48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001", + "ExpectedError": "invalid input length", + "Name": "vector 2: more than 213 bytes input" + }, + { + "Input": "0000000c48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000002", + "ExpectedError": "invalid final flag", + "Name": "vector 3: malformed final block indicator flag" + } +] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/precompiles/fail-blsG1Add.json b/x/evm/core/vm/testdata/precompiles/fail-blsG1Add.json new file mode 100644 index 0000000000..e58ec0e90e --- /dev/null +++ b/x/evm/core/vm/testdata/precompiles/fail-blsG1Add.json @@ -0,0 +1,32 @@ +[ + { + "Input": "", + "ExpectedError": "invalid input length", + "Name": "bls_g1add_empty_input" + }, + { + "Input": "0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb00000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e10000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e1", + "ExpectedError": "invalid input length", + "Name": "bls_g1add_short_input" + }, + { + "Input": "0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb000000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e10000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e1", + "ExpectedError": "invalid input length", + "Name": "bls_g1add_large_input" + }, + { + "Input": "0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000108b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e10000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e1", + "ExpectedError": "invalid field element top bytes", + "Name": "bls_g1add_violate_top_bytes" + }, + { + "Input": "0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb000000000000000000000000000000001a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaac0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e1", + "ExpectedError": "must be less than modulus", + "Name": "bls_g1add_invalid_field_element" + }, + { + "Input": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e1", + "ExpectedError": "point is not on curve", + "Name": "bls_g1add_point_not_on_curve" + } +] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/precompiles/fail-blsG1Mul.json b/x/evm/core/vm/testdata/precompiles/fail-blsG1Mul.json new file mode 100644 index 0000000000..acb8228aaa --- /dev/null +++ b/x/evm/core/vm/testdata/precompiles/fail-blsG1Mul.json @@ -0,0 +1,32 @@ +[ + { + "Input": "", + "ExpectedError": "invalid input length", + "Name": "bls_g1mul_empty_input" + }, + { + "Input": "0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb00000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e10000000000000000000000000000000000000000000000000000000000000007", + "ExpectedError": "invalid input length", + "Name": "bls_g1mul_short_input" + }, + { + "Input": "0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb000000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e10000000000000000000000000000000000000000000000000000000000000007", + "ExpectedError": "invalid input length", + "Name": "bls_g1mul_large_input" + }, + { + "Input": "0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000108b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e10000000000000000000000000000000000000000000000000000000000000007", + "ExpectedError": "invalid field element top bytes", + "Name": "bls_g1mul_violate_top_bytes" + }, + { + "Input": "0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb000000000000000000000000000000001a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaac0000000000000000000000000000000000000000000000000000000000000007", + "ExpectedError": "must be less than modulus", + "Name": "bls_g1mul_invalid_field_element" + }, + { + "Input": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", + "ExpectedError": "point is not on curve", + "Name": "bls_g1mul_point_not_on_curve" + } +] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/precompiles/fail-blsG1MultiExp.json b/x/evm/core/vm/testdata/precompiles/fail-blsG1MultiExp.json new file mode 100644 index 0000000000..2cd28bd3b5 --- /dev/null +++ b/x/evm/core/vm/testdata/precompiles/fail-blsG1MultiExp.json @@ -0,0 +1,32 @@ +[ + { + "Input": "", + "ExpectedError": "invalid input length", + "Name": "bls_g1multiexp_empty_input" + }, + { + "Input": "0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb00000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e10000000000000000000000000000000000000000000000000000000000000007", + "ExpectedError": "invalid input length", + "Name": "bls_g1multiexp_short_input" + }, + { + "Input": "0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb000000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e10000000000000000000000000000000000000000000000000000000000000007", + "ExpectedError": "invalid input length", + "Name": "bls_g1multiexp_large_input" + }, + { + "Input": "0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb000000000000000000000000000000001a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaac0000000000000000000000000000000000000000000000000000000000000007", + "ExpectedError": "must be less than modulus", + "Name": "bls_g1multiexp_invalid_field_element" + }, + { + "Input": "0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000108b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e10000000000000000000000000000000000000000000000000000000000000007", + "ExpectedError": "invalid field element top bytes", + "Name": "bls_g1multiexp_violate_top_bytes" + }, + { + "Input": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", + "ExpectedError": "point is not on curve", + "Name": "bls_g1multiexp_point_not_on_curve" + } +] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/precompiles/fail-blsG2Add.json b/x/evm/core/vm/testdata/precompiles/fail-blsG2Add.json new file mode 100644 index 0000000000..b1fe9d5b8d --- /dev/null +++ b/x/evm/core/vm/testdata/precompiles/fail-blsG2Add.json @@ -0,0 +1,32 @@ +[ + { + "Input": "", + "ExpectedError": "invalid input length", + "Name": "bls_g2add_empty_input" + }, + { + "Input": "00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b828010000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be", + "ExpectedError": "invalid input length", + "Name": "bls_g2add_short_input" + }, + { + "Input": "00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b8280100000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be", + "ExpectedError": "invalid input length", + "Name": "bls_g2add_large_input" + }, + { + "Input": "00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000010606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be", + "ExpectedError": "invalid field element top bytes", + "Name": "bls_g2add_violate_top_bytes" + }, + { + "Input": "00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000001a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaac00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be", + "ExpectedError": "must be less than modulus", + "Name": "bls_g2add_invalid_field_element" + }, + { + "Input": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be", + "ExpectedError": "point is not on curve", + "Name": "bls_g2add_point_not_on_curve" + } +] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/precompiles/fail-blsG2Mul.json b/x/evm/core/vm/testdata/precompiles/fail-blsG2Mul.json new file mode 100644 index 0000000000..c2f0b89c8a --- /dev/null +++ b/x/evm/core/vm/testdata/precompiles/fail-blsG2Mul.json @@ -0,0 +1,32 @@ +[ + { + "Input": "", + "ExpectedError": "invalid input length", + "Name": "bls_g2mul_empty_input" + }, + { + "Input": "00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b828010000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be0000000000000000000000000000000000000000000000000000000000000007", + "ExpectedError": "invalid input length", + "Name": "bls_g2mul_short_input" + }, + { + "Input": "00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b8280100000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be0000000000000000000000000000000000000000000000000000000000000007", + "ExpectedError": "invalid input length", + "Name": "bls_g2mul_large_input" + }, + { + "Input": "00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000010606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be0000000000000000000000000000000000000000000000000000000000000007", + "ExpectedError": "invalid field element top bytes", + "Name": "bls_g2mul_violate_top_bytes" + }, + { + "Input": "00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000001a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaac0000000000000000000000000000000000000000000000000000000000000007", + "ExpectedError": "must be less than modulus", + "Name": "bls_g2mul_invalid_field_element" + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", + "ExpectedError": "point is not on curve", + "Name": "bls_g2mul_point_not_on_curve" + } +] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/precompiles/fail-blsG2MultiExp.json b/x/evm/core/vm/testdata/precompiles/fail-blsG2MultiExp.json new file mode 100644 index 0000000000..437f8dfca5 --- /dev/null +++ b/x/evm/core/vm/testdata/precompiles/fail-blsG2MultiExp.json @@ -0,0 +1,32 @@ +[ + { + "Input": "", + "ExpectedError": "invalid input length", + "Name": "bls_g2multiexp_empty_input" + }, + { + "Input": "00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b828010000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be0000000000000000000000000000000000000000000000000000000000000007", + "ExpectedError": "invalid input length", + "Name": "bls_g2multiexp_short_input" + }, + { + "Input": "00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b8280100000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be0000000000000000000000000000000000000000000000000000000000000007", + "ExpectedError": "invalid input length", + "Name": "bls_g2multiexp_large_input" + }, + { + "Input": "00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000010606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be0000000000000000000000000000000000000000000000000000000000000007", + "ExpectedError": "invalid field element top bytes", + "Name": "bls_g2multiexp_violate_top_bytes" + }, + { + "Input": "00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000001a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaac0000000000000000000000000000000000000000000000000000000000000007", + "ExpectedError": "must be less than modulus", + "Name": "bls_g2multiexp_invalid_field_element" + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", + "ExpectedError": "point is not on curve", + "Name": "bls_g2multiexp_point_not_on_curve" + } +] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/precompiles/fail-blsMapG1.json b/x/evm/core/vm/testdata/precompiles/fail-blsMapG1.json new file mode 100644 index 0000000000..8550269f12 --- /dev/null +++ b/x/evm/core/vm/testdata/precompiles/fail-blsMapG1.json @@ -0,0 +1,22 @@ +[ + { + "Input": "", + "ExpectedError": "invalid input length", + "Name": "bls_mapg1_empty_input" + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "ExpectedError": "invalid input length", + "Name": "bls_mapg1_short_input" + }, + { + "Input": "00000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "ExpectedError": "invalid field element top bytes", + "Name": "bls_mapg1_top_bytes" + }, + { + "Input": "000000000000000000000000000000001a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaac", + "ExpectedError": "must be less than modulus", + "Name": "bls_mapg1_invalid_fq_element" + } +] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/precompiles/fail-blsMapG2.json b/x/evm/core/vm/testdata/precompiles/fail-blsMapG2.json new file mode 100644 index 0000000000..397a608b0a --- /dev/null +++ b/x/evm/core/vm/testdata/precompiles/fail-blsMapG2.json @@ -0,0 +1,22 @@ +[ + { + "Input": "", + "ExpectedError": "invalid input length", + "Name": "bls_mapg2_empty_input" + }, + { + "Input": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "ExpectedError": "invalid input length", + "Name": "bls_mapg2_short_input" + }, + { + "Input": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "ExpectedError": "invalid field element top bytes", + "Name": "bls_mapg2_top_bytes" + }, + { + "Input": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaac", + "ExpectedError": "must be less than modulus", + "Name": "bls_mapg2_invalid_fq_element" + } +] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/precompiles/fail-blsPairing.json b/x/evm/core/vm/testdata/precompiles/fail-blsPairing.json new file mode 100644 index 0000000000..084e55635c --- /dev/null +++ b/x/evm/core/vm/testdata/precompiles/fail-blsPairing.json @@ -0,0 +1,42 @@ +[ + { + "Input": "", + "ExpectedError": "invalid input length", + "Name": "bls_pairing_empty_input" + }, + { + "Input": "0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e100000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e100000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b8280100000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be", + "ExpectedError": "invalid input length", + "Name": "bls_pairing_extra_data" + }, + { + "Input": "0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e100000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e100000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000001a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaac", + "ExpectedError": "must be less than modulus", + "Name": "bls_pairing_invalid_field_element" + }, + { + "Input": "0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e100000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e100000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000010606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be", + "ExpectedError": "invalid field element top bytes", + "Name": "bls_pairing_top_bytes" + }, + { + "Input": "0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e100000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be", + "ExpectedError": "point is not on curve", + "Name": "bls_pairing_g1_not_on_curve" + }, + { + "Input": "0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e100000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", + "ExpectedError": "point is not on curve", + "Name": "bls_pairing_g2_not_on_curve" + }, + { + "Input": "0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e100000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000a989badd40d6212b33cffc3f3763e9bc760f988c9926b26da9dd85e928483446346b8ed00e1de5d5ea93e354abe706c00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be", + "ExpectedError": "g1 point is not on correct subgroup", + "Name": "bls_pairing_g1_not_in_correct_subgroup" + }, + { + "Input": "0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e100000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013a59858b6809fca4d9a3b6539246a70051a3c88899964a42bc9a69cf9acdd9dd387cfa9086b894185b9a46a402be730000000000000000000000000000000002d27e0ec3356299a346a09ad7dc4ef68a483c3aed53f9139d2f929a3eecebf72082e5e58c6da24ee32e03040c406d4f", + "ExpectedError": "g2 point is not on correct subgroup", + "Name": "bls_pairing_g2_not_in_correct_subgroup" + } +] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/precompiles/modexp.json b/x/evm/core/vm/testdata/precompiles/modexp.json new file mode 100644 index 0000000000..4550eb9138 --- /dev/null +++ b/x/evm/core/vm/testdata/precompiles/modexp.json @@ -0,0 +1,121 @@ +[ + { + "Input": "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002003fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2efffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "eip_example1", + "Gas": 13056, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2efffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "eip_example2", + "Gas": 13056, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040e09ad9675465c53a109fac66a445c91b292d2bb2c5268addb30cd82f80fcb0033ff97c80a5fc6f39193ae969c6ede6710a6b7ac27078a06d90ef1c72e5c85fb502fc9e1f6beb81516545975218075ec2af118cd8798df6e08a147c60fd6095ac2bb02c2908cf4dd7c81f11c289e4bce98f3553768f392a80ce22bf5c4f4a248c6b", + "Expected": "60008f1614cc01dcfb6bfb09c625cf90b47d4468db81b5f8b7a39d42f332eab9b2da8f2d95311648a8f243f4bb13cfb3d8f7f2a3c014122ebb3ed41b02783adc", + "Name": "nagydani-1-square", + "Gas": 204, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040e09ad9675465c53a109fac66a445c91b292d2bb2c5268addb30cd82f80fcb0033ff97c80a5fc6f39193ae969c6ede6710a6b7ac27078a06d90ef1c72e5c85fb503fc9e1f6beb81516545975218075ec2af118cd8798df6e08a147c60fd6095ac2bb02c2908cf4dd7c81f11c289e4bce98f3553768f392a80ce22bf5c4f4a248c6b", + "Expected": "4834a46ba565db27903b1c720c9d593e84e4cbd6ad2e64b31885d944f68cd801f92225a8961c952ddf2797fa4701b330c85c4b363798100b921a1a22a46a7fec", + "Name": "nagydani-1-qube", + "Gas": 204, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000040e09ad9675465c53a109fac66a445c91b292d2bb2c5268addb30cd82f80fcb0033ff97c80a5fc6f39193ae969c6ede6710a6b7ac27078a06d90ef1c72e5c85fb5010001fc9e1f6beb81516545975218075ec2af118cd8798df6e08a147c60fd6095ac2bb02c2908cf4dd7c81f11c289e4bce98f3553768f392a80ce22bf5c4f4a248c6b", + "Expected": "c36d804180c35d4426b57b50c5bfcca5c01856d104564cd513b461d3c8b8409128a5573e416d0ebe38f5f736766d9dc27143e4da981dfa4d67f7dc474cbee6d2", + "Name": "nagydani-1-pow0x10001", + "Gas": 3276, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080cad7d991a00047dd54d3399b6b0b937c718abddef7917c75b6681f40cc15e2be0003657d8d4c34167b2f0bbbca0ccaa407c2a6a07d50f1517a8f22979ce12a81dcaf707cc0cebfc0ce2ee84ee7f77c38b9281b9822a8d3de62784c089c9b18dcb9a2a5eecbede90ea788a862a9ddd9d609c2c52972d63e289e28f6a590ffbf5102e6d893b80aeed5e6e9ce9afa8a5d5675c93a32ac05554cb20e9951b2c140e3ef4e433068cf0fb73bc9f33af1853f64aa27a0028cbf570d7ac9048eae5dc7b28c87c31e5810f1e7fa2cda6adf9f1076dbc1ec1238560071e7efc4e9565c49be9e7656951985860a558a754594115830bcdb421f741408346dd5997bb01c287087", + "Expected": "981dd99c3b113fae3e3eaa9435c0dc96779a23c12a53d1084b4f67b0b053a27560f627b873e3f16ad78f28c94f14b6392def26e4d8896c5e3c984e50fa0b3aa44f1da78b913187c6128baa9340b1e9c9a0fd02cb78885e72576da4a8f7e5a113e173a7a2889fde9d407bd9f06eb05bc8fc7b4229377a32941a02bf4edcc06d70", + "Name": "nagydani-2-square", + "Gas": 665, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080cad7d991a00047dd54d3399b6b0b937c718abddef7917c75b6681f40cc15e2be0003657d8d4c34167b2f0bbbca0ccaa407c2a6a07d50f1517a8f22979ce12a81dcaf707cc0cebfc0ce2ee84ee7f77c38b9281b9822a8d3de62784c089c9b18dcb9a2a5eecbede90ea788a862a9ddd9d609c2c52972d63e289e28f6a590ffbf5103e6d893b80aeed5e6e9ce9afa8a5d5675c93a32ac05554cb20e9951b2c140e3ef4e433068cf0fb73bc9f33af1853f64aa27a0028cbf570d7ac9048eae5dc7b28c87c31e5810f1e7fa2cda6adf9f1076dbc1ec1238560071e7efc4e9565c49be9e7656951985860a558a754594115830bcdb421f741408346dd5997bb01c287087", + "Expected": "d89ceb68c32da4f6364978d62aaa40d7b09b59ec61eb3c0159c87ec3a91037f7dc6967594e530a69d049b64adfa39c8fa208ea970cfe4b7bcd359d345744405afe1cbf761647e32b3184c7fbe87cee8c6c7ff3b378faba6c68b83b6889cb40f1603ee68c56b4c03d48c595c826c041112dc941878f8c5be828154afd4a16311f", + "Name": "nagydani-2-qube", + "Gas": 665, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000080cad7d991a00047dd54d3399b6b0b937c718abddef7917c75b6681f40cc15e2be0003657d8d4c34167b2f0bbbca0ccaa407c2a6a07d50f1517a8f22979ce12a81dcaf707cc0cebfc0ce2ee84ee7f77c38b9281b9822a8d3de62784c089c9b18dcb9a2a5eecbede90ea788a862a9ddd9d609c2c52972d63e289e28f6a590ffbf51010001e6d893b80aeed5e6e9ce9afa8a5d5675c93a32ac05554cb20e9951b2c140e3ef4e433068cf0fb73bc9f33af1853f64aa27a0028cbf570d7ac9048eae5dc7b28c87c31e5810f1e7fa2cda6adf9f1076dbc1ec1238560071e7efc4e9565c49be9e7656951985860a558a754594115830bcdb421f741408346dd5997bb01c287087", + "Expected": "ad85e8ef13fd1dd46eae44af8b91ad1ccae5b7a1c92944f92a19f21b0b658139e0cabe9c1f679507c2de354bf2c91ebd965d1e633978a830d517d2f6f8dd5fd58065d58559de7e2334a878f8ec6992d9b9e77430d4764e863d77c0f87beede8f2f7f2ab2e7222f85cc9d98b8467f4bb72e87ef2882423ebdb6daf02dddac6db2", + "Name": "nagydani-2-pow0x10001", + "Gas": 10649, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000100c9130579f243e12451760976261416413742bd7c91d39ae087f46794062b8c239f2a74abf3918605a0e046a7890e049475ba7fbb78f5de6490bd22a710cc04d30088179a919d86c2da62cf37f59d8f258d2310d94c24891be2d7eeafaa32a8cb4b0cfe5f475ed778f45907dc8916a73f03635f233f7a77a00a3ec9ca6761a5bbd558a2318ecd0caa1c5016691523e7e1fa267dd35e70c66e84380bdcf7c0582f540174e572c41f81e93da0b757dff0b0fe23eb03aa19af0bdec3afb474216febaacb8d0381e631802683182b0fe72c28392539850650b70509f54980241dc175191a35d967288b532a7a8223ce2440d010615f70df269501944d4ec16fe4a3cb02d7a85909174757835187cb52e71934e6c07ef43b4c46fc30bbcd0bc72913068267c54a4aabebb493922492820babdeb7dc9b1558fcf7bd82c37c82d3147e455b623ab0efa752fe0b3a67ca6e4d126639e645a0bf417568adbb2a6a4eef62fa1fa29b2a5a43bebea1f82193a7dd98eb483d09bb595af1fa9c97c7f41f5649d976aee3e5e59e2329b43b13bea228d4a93f16ba139ccb511de521ffe747aa2eca664f7c9e33da59075cc335afcd2bf3ae09765f01ab5a7c3e3938ec168b74724b5074247d200d9970382f683d6059b94dbc336603d1dfee714e4b447ac2fa1d99ecb4961da2854e03795ed758220312d101e1e3d87d5313a6d052aebde75110363d", + "Expected": "affc7507ea6d84751ec6b3f0d7b99dbcc263f33330e450d1b3ff0bc3d0874320bf4edd57debd587306988157958cb3cfd369cc0c9c198706f635c9e0f15d047df5cb44d03e2727f26b083c4ad8485080e1293f171c1ed52aef5993a5815c35108e848c951cf1e334490b4a539a139e57b68f44fee583306f5b85ffa57206b3ee5660458858534e5386b9584af3c7f67806e84c189d695e5eb96e1272d06ec2df5dc5fabc6e94b793718c60c36be0a4d031fc84cd658aa72294b2e16fc240aef70cb9e591248e38bd49c5a554d1afa01f38dab72733092f7555334bbef6c8c430119840492380aa95fa025dcf699f0a39669d812b0c6946b6091e6e235337b6f8", + "Name": "nagydani-3-square", + "Gas": 1894, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000100c9130579f243e12451760976261416413742bd7c91d39ae087f46794062b8c239f2a74abf3918605a0e046a7890e049475ba7fbb78f5de6490bd22a710cc04d30088179a919d86c2da62cf37f59d8f258d2310d94c24891be2d7eeafaa32a8cb4b0cfe5f475ed778f45907dc8916a73f03635f233f7a77a00a3ec9ca6761a5bbd558a2318ecd0caa1c5016691523e7e1fa267dd35e70c66e84380bdcf7c0582f540174e572c41f81e93da0b757dff0b0fe23eb03aa19af0bdec3afb474216febaacb8d0381e631802683182b0fe72c28392539850650b70509f54980241dc175191a35d967288b532a7a8223ce2440d010615f70df269501944d4ec16fe4a3cb03d7a85909174757835187cb52e71934e6c07ef43b4c46fc30bbcd0bc72913068267c54a4aabebb493922492820babdeb7dc9b1558fcf7bd82c37c82d3147e455b623ab0efa752fe0b3a67ca6e4d126639e645a0bf417568adbb2a6a4eef62fa1fa29b2a5a43bebea1f82193a7dd98eb483d09bb595af1fa9c97c7f41f5649d976aee3e5e59e2329b43b13bea228d4a93f16ba139ccb511de521ffe747aa2eca664f7c9e33da59075cc335afcd2bf3ae09765f01ab5a7c3e3938ec168b74724b5074247d200d9970382f683d6059b94dbc336603d1dfee714e4b447ac2fa1d99ecb4961da2854e03795ed758220312d101e1e3d87d5313a6d052aebde75110363d", + "Expected": "1b280ecd6a6bf906b806d527c2a831e23b238f89da48449003a88ac3ac7150d6a5e9e6b3be4054c7da11dd1e470ec29a606f5115801b5bf53bc1900271d7c3ff3cd5ed790d1c219a9800437a689f2388ba1a11d68f6a8e5b74e9a3b1fac6ee85fc6afbac599f93c391f5dc82a759e3c6c0ab45ce3f5d25d9b0c1bf94cf701ea6466fc9a478dacc5754e593172b5111eeba88557048bceae401337cd4c1182ad9f700852bc8c99933a193f0b94cf1aedbefc48be3bc93ef5cb276d7c2d5462ac8bb0c8fe8923a1db2afe1c6b90d59c534994a6a633f0ead1d638fdc293486bb634ff2c8ec9e7297c04241a61c37e3ae95b11d53343d4ba2b4cc33d2cfa7eb705e", + "Name": "nagydani-3-qube", + "Gas": 1894, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000100c9130579f243e12451760976261416413742bd7c91d39ae087f46794062b8c239f2a74abf3918605a0e046a7890e049475ba7fbb78f5de6490bd22a710cc04d30088179a919d86c2da62cf37f59d8f258d2310d94c24891be2d7eeafaa32a8cb4b0cfe5f475ed778f45907dc8916a73f03635f233f7a77a00a3ec9ca6761a5bbd558a2318ecd0caa1c5016691523e7e1fa267dd35e70c66e84380bdcf7c0582f540174e572c41f81e93da0b757dff0b0fe23eb03aa19af0bdec3afb474216febaacb8d0381e631802683182b0fe72c28392539850650b70509f54980241dc175191a35d967288b532a7a8223ce2440d010615f70df269501944d4ec16fe4a3cb010001d7a85909174757835187cb52e71934e6c07ef43b4c46fc30bbcd0bc72913068267c54a4aabebb493922492820babdeb7dc9b1558fcf7bd82c37c82d3147e455b623ab0efa752fe0b3a67ca6e4d126639e645a0bf417568adbb2a6a4eef62fa1fa29b2a5a43bebea1f82193a7dd98eb483d09bb595af1fa9c97c7f41f5649d976aee3e5e59e2329b43b13bea228d4a93f16ba139ccb511de521ffe747aa2eca664f7c9e33da59075cc335afcd2bf3ae09765f01ab5a7c3e3938ec168b74724b5074247d200d9970382f683d6059b94dbc336603d1dfee714e4b447ac2fa1d99ecb4961da2854e03795ed758220312d101e1e3d87d5313a6d052aebde75110363d", + "Expected": "37843d7c67920b5f177372fa56e2a09117df585f81df8b300fba245b1175f488c99476019857198ed459ed8d9799c377330e49f4180c4bf8e8f66240c64f65ede93d601f957b95b83efdee1e1bfde74169ff77002eaf078c71815a9220c80b2e3b3ff22c2f358111d816ebf83c2999026b6de50bfc711ff68705d2f40b753424aefc9f70f08d908b5a20276ad613b4ab4309a3ea72f0c17ea9df6b3367d44fb3acab11c333909e02e81ea2ed404a712d3ea96bba87461720e2d98723e7acd0520ac1a5212dbedcd8dc0c1abf61d4719e319ff4758a774790b8d463cdfe131d1b2dcfee52d002694e98e720cb6ae7ccea353bc503269ba35f0f63bf8d7b672a76", + "Name": "nagydani-3-pow0x10001", + "Gas": 30310, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000200db34d0e438249c0ed685c949cc28776a05094e1c48691dc3f2dca5fc3356d2a0663bd376e4712839917eb9a19c670407e2c377a2de385a3ff3b52104f7f1f4e0c7bf7717fb913896693dc5edbb65b760ef1b00e42e9d8f9af17352385e1cd742c9b006c0f669995cb0bb21d28c0aced2892267637b6470d8cee0ab27fc5d42658f6e88240c31d6774aa60a7ebd25cd48b56d0da11209f1928e61005c6eb709f3e8e0aaf8d9b10f7d7e296d772264dc76897ccdddadc91efa91c1903b7232a9e4c3b941917b99a3bc0c26497dedc897c25750af60237aa67934a26a2bc491db3dcc677491944bc1f51d3e5d76b8d846a62db03dedd61ff508f91a56d71028125035c3a44cbb041497c83bf3e4ae2a9613a401cc721c547a2afa3b16a2969933d3626ed6d8a7428648f74122fd3f2a02a20758f7f693892c8fd798b39abac01d18506c45e71432639e9f9505719ee822f62ccbf47f6850f096ff77b5afaf4be7d772025791717dbe5abf9b3f40cff7d7aab6f67e38f62faf510747276e20a42127e7500c444f9ed92baf65ade9e836845e39c4316d9dce5f8e2c8083e2c0acbb95296e05e51aab13b6b8f53f06c9c4276e12b0671133218cc3ea907da3bd9a367096d9202128d14846cc2e20d56fc8473ecb07cecbfb8086919f3971926e7045b853d85a69d026195c70f9f7a823536e2a8f4b3e12e94d9b53a934353451094b8102df3143a0057457d75e8c708b6337a6f5a4fd1a06727acf9fb93e2993c62f3378b37d56c85e7b1e00f0145ebf8e4095bd723166293c60b6ac1252291ef65823c9e040ddad14969b3b340a4ef714db093a587c37766d68b8d6b5016e741587e7e6bf7e763b44f0247e64bae30f994d248bfd20541a333e5b225ef6a61199e301738b1e688f70ec1d7fb892c183c95dc543c3e12adf8a5e8b9ca9d04f9445cced3ab256f29e998e69efaa633a7b60e1db5a867924ccab0a171d9d6e1098dfa15acde9553de599eaa56490c8f411e4985111f3d40bddfc5e301edb01547b01a886550a61158f7e2033c59707789bf7c854181d0c2e2a42a93cf09209747d7082e147eb8544de25c3eb14f2e35559ea0c0f5877f2f3fc92132c0ae9da4e45b2f6c866a224ea6d1f28c05320e287750fbc647368d41116e528014cc1852e5531d53e4af938374daba6cee4baa821ed07117253bb3601ddd00d59a3d7fb2ef1f5a2fbba7c429f0cf9a5b3462410fd833a69118f8be9c559b1000cc608fd877fb43f8e65c2d1302622b944462579056874b387208d90623fcdaf93920ca7a9e4ba64ea208758222ad868501cc2c345e2d3a5ea2a17e5069248138c8a79c0251185d29ee73e5afab5354769142d2bf0cb6712727aa6bf84a6245fcdae66e4938d84d1b9dd09a884818622080ff5f98942fb20acd7e0c916c2d5ea7ce6f7e173315384518f", + "Expected": "8a5aea5f50dcc03dc7a7a272b5aeebc040554dbc1ffe36753c4fc75f7ed5f6c2cc0de3a922bf96c78bf0643a73025ad21f45a4a5cadd717612c511ab2bff1190fe5f1ae05ba9f8fe3624de1de2a817da6072ddcdb933b50216811dbe6a9ca79d3a3c6b3a476b079fd0d05f04fb154e2dd3e5cb83b148a006f2bcbf0042efb2ae7b916ea81b27aac25c3bf9a8b6d35440062ad8eae34a83f3ffa2cc7b40346b62174a4422584f72f95316f6b2bee9ff232ba9739301c97c99a9ded26c45d72676eb856ad6ecc81d36a6de36d7f9dafafee11baa43a4b0d5e4ecffa7b9b7dcefd58c397dd373e6db4acd2b2c02717712e6289bed7c813b670c4a0c6735aa7f3b0f1ce556eae9fcc94b501b2c8781ba50a8c6220e8246371c3c7359fe4ef9da786ca7d98256754ca4e496be0a9174bedbecb384bdf470779186d6a833f068d2838a88d90ef3ad48ff963b67c39cc5a3ee123baf7bf3125f64e77af7f30e105d72c4b9b5b237ed251e4c122c6d8c1405e736299c3afd6db16a28c6a9cfa68241e53de4cd388271fe534a6a9b0dbea6171d170db1b89858468885d08fecbd54c8e471c3e25d48e97ba450b96d0d87e00ac732aaa0d3ce4309c1064bd8a4c0808a97e0143e43a24cfa847635125cd41c13e0574487963e9d725c01375db99c31da67b4cf65eff555f0c0ac416c727ff8d438ad7c42030551d68c2e7adda0abb1ca7c10", + "Name": "nagydani-4-square", + "Gas": 5580, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000200db34d0e438249c0ed685c949cc28776a05094e1c48691dc3f2dca5fc3356d2a0663bd376e4712839917eb9a19c670407e2c377a2de385a3ff3b52104f7f1f4e0c7bf7717fb913896693dc5edbb65b760ef1b00e42e9d8f9af17352385e1cd742c9b006c0f669995cb0bb21d28c0aced2892267637b6470d8cee0ab27fc5d42658f6e88240c31d6774aa60a7ebd25cd48b56d0da11209f1928e61005c6eb709f3e8e0aaf8d9b10f7d7e296d772264dc76897ccdddadc91efa91c1903b7232a9e4c3b941917b99a3bc0c26497dedc897c25750af60237aa67934a26a2bc491db3dcc677491944bc1f51d3e5d76b8d846a62db03dedd61ff508f91a56d71028125035c3a44cbb041497c83bf3e4ae2a9613a401cc721c547a2afa3b16a2969933d3626ed6d8a7428648f74122fd3f2a02a20758f7f693892c8fd798b39abac01d18506c45e71432639e9f9505719ee822f62ccbf47f6850f096ff77b5afaf4be7d772025791717dbe5abf9b3f40cff7d7aab6f67e38f62faf510747276e20a42127e7500c444f9ed92baf65ade9e836845e39c4316d9dce5f8e2c8083e2c0acbb95296e05e51aab13b6b8f53f06c9c4276e12b0671133218cc3ea907da3bd9a367096d9202128d14846cc2e20d56fc8473ecb07cecbfb8086919f3971926e7045b853d85a69d026195c70f9f7a823536e2a8f4b3e12e94d9b53a934353451094b8103df3143a0057457d75e8c708b6337a6f5a4fd1a06727acf9fb93e2993c62f3378b37d56c85e7b1e00f0145ebf8e4095bd723166293c60b6ac1252291ef65823c9e040ddad14969b3b340a4ef714db093a587c37766d68b8d6b5016e741587e7e6bf7e763b44f0247e64bae30f994d248bfd20541a333e5b225ef6a61199e301738b1e688f70ec1d7fb892c183c95dc543c3e12adf8a5e8b9ca9d04f9445cced3ab256f29e998e69efaa633a7b60e1db5a867924ccab0a171d9d6e1098dfa15acde9553de599eaa56490c8f411e4985111f3d40bddfc5e301edb01547b01a886550a61158f7e2033c59707789bf7c854181d0c2e2a42a93cf09209747d7082e147eb8544de25c3eb14f2e35559ea0c0f5877f2f3fc92132c0ae9da4e45b2f6c866a224ea6d1f28c05320e287750fbc647368d41116e528014cc1852e5531d53e4af938374daba6cee4baa821ed07117253bb3601ddd00d59a3d7fb2ef1f5a2fbba7c429f0cf9a5b3462410fd833a69118f8be9c559b1000cc608fd877fb43f8e65c2d1302622b944462579056874b387208d90623fcdaf93920ca7a9e4ba64ea208758222ad868501cc2c345e2d3a5ea2a17e5069248138c8a79c0251185d29ee73e5afab5354769142d2bf0cb6712727aa6bf84a6245fcdae66e4938d84d1b9dd09a884818622080ff5f98942fb20acd7e0c916c2d5ea7ce6f7e173315384518f", + "Expected": "5a2664252aba2d6e19d9600da582cdd1f09d7a890ac48e6b8da15ae7c6ff1856fc67a841ac2314d283ffa3ca81a0ecf7c27d89ef91a5a893297928f5da0245c99645676b481b7e20a566ee6a4f2481942bee191deec5544600bb2441fd0fb19e2ee7d801ad8911c6b7750affec367a4b29a22942c0f5f4744a4e77a8b654da2a82571037099e9c6d930794efe5cdca73c7b6c0844e386bdca8ea01b3d7807146bb81365e2cdc6475f8c23e0ff84463126189dc9789f72bbce2e3d2d114d728a272f1345122de23df54c922ec7a16e5c2a8f84da8871482bd258c20a7c09bbcd64c7a96a51029bbfe848736a6ba7bf9d931a9b7de0bcaf3635034d4958b20ae9ab3a95a147b0421dd5f7ebff46c971010ebfc4adbbe0ad94d5498c853e7142c450d8c71de4b2f84edbf8acd2e16d00c8115b150b1c30e553dbb82635e781379fe2a56360420ff7e9f70cc64c00aba7e26ed13c7c19622865ae07248daced36416080f35f8cc157a857ed70ea4f347f17d1bee80fa038abd6e39b1ba06b97264388b21364f7c56e192d4b62d9b161405f32ab1e2594e86243e56fcf2cb30d21adef15b9940f91af681da24328c883d892670c6aa47940867a81830a82b82716895db810df1b834640abefb7db2092dd92912cb9a735175bc447be40a503cf22dfe565b4ed7a3293ca0dfd63a507430b323ee248ec82e843b673c97ad730728cebc", + "Name": "nagydani-4-qube", + "Gas": 5580, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000200db34d0e438249c0ed685c949cc28776a05094e1c48691dc3f2dca5fc3356d2a0663bd376e4712839917eb9a19c670407e2c377a2de385a3ff3b52104f7f1f4e0c7bf7717fb913896693dc5edbb65b760ef1b00e42e9d8f9af17352385e1cd742c9b006c0f669995cb0bb21d28c0aced2892267637b6470d8cee0ab27fc5d42658f6e88240c31d6774aa60a7ebd25cd48b56d0da11209f1928e61005c6eb709f3e8e0aaf8d9b10f7d7e296d772264dc76897ccdddadc91efa91c1903b7232a9e4c3b941917b99a3bc0c26497dedc897c25750af60237aa67934a26a2bc491db3dcc677491944bc1f51d3e5d76b8d846a62db03dedd61ff508f91a56d71028125035c3a44cbb041497c83bf3e4ae2a9613a401cc721c547a2afa3b16a2969933d3626ed6d8a7428648f74122fd3f2a02a20758f7f693892c8fd798b39abac01d18506c45e71432639e9f9505719ee822f62ccbf47f6850f096ff77b5afaf4be7d772025791717dbe5abf9b3f40cff7d7aab6f67e38f62faf510747276e20a42127e7500c444f9ed92baf65ade9e836845e39c4316d9dce5f8e2c8083e2c0acbb95296e05e51aab13b6b8f53f06c9c4276e12b0671133218cc3ea907da3bd9a367096d9202128d14846cc2e20d56fc8473ecb07cecbfb8086919f3971926e7045b853d85a69d026195c70f9f7a823536e2a8f4b3e12e94d9b53a934353451094b81010001df3143a0057457d75e8c708b6337a6f5a4fd1a06727acf9fb93e2993c62f3378b37d56c85e7b1e00f0145ebf8e4095bd723166293c60b6ac1252291ef65823c9e040ddad14969b3b340a4ef714db093a587c37766d68b8d6b5016e741587e7e6bf7e763b44f0247e64bae30f994d248bfd20541a333e5b225ef6a61199e301738b1e688f70ec1d7fb892c183c95dc543c3e12adf8a5e8b9ca9d04f9445cced3ab256f29e998e69efaa633a7b60e1db5a867924ccab0a171d9d6e1098dfa15acde9553de599eaa56490c8f411e4985111f3d40bddfc5e301edb01547b01a886550a61158f7e2033c59707789bf7c854181d0c2e2a42a93cf09209747d7082e147eb8544de25c3eb14f2e35559ea0c0f5877f2f3fc92132c0ae9da4e45b2f6c866a224ea6d1f28c05320e287750fbc647368d41116e528014cc1852e5531d53e4af938374daba6cee4baa821ed07117253bb3601ddd00d59a3d7fb2ef1f5a2fbba7c429f0cf9a5b3462410fd833a69118f8be9c559b1000cc608fd877fb43f8e65c2d1302622b944462579056874b387208d90623fcdaf93920ca7a9e4ba64ea208758222ad868501cc2c345e2d3a5ea2a17e5069248138c8a79c0251185d29ee73e5afab5354769142d2bf0cb6712727aa6bf84a6245fcdae66e4938d84d1b9dd09a884818622080ff5f98942fb20acd7e0c916c2d5ea7ce6f7e173315384518f", + "Expected": "bed8b970c4a34849fc6926b08e40e20b21c15ed68d18f228904878d4370b56322d0da5789da0318768a374758e6375bfe4641fca5285ec7171828922160f48f5ca7efbfee4d5148612c38ad683ae4e3c3a053d2b7c098cf2b34f2cb19146eadd53c86b2d7ccf3d83b2c370bfb840913ee3879b1057a6b4e07e110b6bcd5e958bc71a14798c91d518cc70abee264b0d25a4110962a764b364ac0b0dd1ee8abc8426d775ec0f22b7e47b32576afaf1b5a48f64573ed1c5c29f50ab412188d9685307323d990802b81dacc06c6e05a1e901830ba9fcc67688dc29c5e27bde0a6e845ca925f5454b6fb3747edfaa2a5820838fb759eadf57f7cb5cec57fc213ddd8a4298fa079c3c0f472b07fb15aa6a7f0a3780bd296ff6a62e58ef443870b02260bd4fd2bbc98255674b8e1f1f9f8d33c7170b0ebbea4523b695911abbf26e41885344823bd0587115fdd83b721a4e8457a31c9a84b3d3520a07e0e35df7f48e5a9d534d0ec7feef1ff74de6a11e7f93eab95175b6ce22c68d78a642ad642837897ec11349205d8593ac19300207572c38d29ca5dfa03bc14cdbc32153c80e5cc3e739403d34c75915e49beb43094cc6dcafb3665b305ddec9286934ae66ec6b777ca528728c851318eb0f207b39f1caaf96db6eeead6b55ed08f451939314577d42bcc9f97c0b52d0234f88fd07e4c1d7780fdebc025cfffcb572cb27a8c33963", + "Name": "nagydani-4-pow0x10001", + "Gas": 89292, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000400c5a1611f8be90071a43db23cc2fe01871cc4c0e8ab5743f6378e4fef77f7f6db0095c0727e20225beb665645403453e325ad5f9aeb9ba99bf3c148f63f9c07cf4fe8847ad5242d6b7d4499f93bd47056ddab8f7dee878fc2314f344dbee2a7c41a5d3db91eff372c730c2fdd3a141a4b61999e36d549b9870cf2f4e632c4d5df5f024f81c028000073a0ed8847cfb0593d36a47142f578f05ccbe28c0c06aeb1b1da027794c48db880278f79ba78ae64eedfea3c07d10e0562668d839749dc95f40467d15cf65b9cfc52c7c4bcef1cda3596dd52631aac942f146c7cebd46065131699ce8385b0db1874336747ee020a5698a3d1a1082665721e769567f579830f9d259cec1a836845109c21cf6b25da572512bf3c42fd4b96e43895589042ab60dd41f497db96aec102087fe784165bb45f942859268fd2ff6c012d9d00c02ba83eace047cc5f7b2c392c2955c58a49f0338d6fc58749c9db2155522ac17914ec216ad87f12e0ee95574613942fa615898c4d9e8a3be68cd6afa4e7a003dedbdf8edfee31162b174f965b20ae752ad89c967b3068b6f722c16b354456ba8e280f987c08e0a52d40a2e8f3a59b94d590aeef01879eb7a90b3ee7d772c839c85519cbeaddc0c193ec4874a463b53fcaea3271d80ebfb39b33489365fc039ae549a17a9ff898eea2f4cb27b8dbee4c17b998438575b2b8d107e4a0d66ba7fca85b41a58a8d51f191a35c856dfbe8aef2b00048a694bbccff832d23c8ca7a7ff0b6c0b3011d00b97c86c0628444d267c951d9e4fb8f83e154b8f74fb51aa16535e498235c5597dac9606ed0be3173a3836baa4e7d756ffe1e2879b415d3846bccd538c05b847785699aefde3e305decb600cd8fb0e7d8de5efc26971a6ad4e6d7a2d91474f1023a0ac4b78dc937da0ce607a45974d2cac1c33a2631ff7fe6144a3b2e5cf98b531a9627dea92c1dc82204d09db0439b6a11dd64b484e1263aa45fd9539b6020b55e3baece3986a8bffc1003406348f5c61265099ed43a766ee4f93f5f9c5abbc32a0fd3ac2b35b87f9ec26037d88275bd7dd0a54474995ee34ed3727f3f97c48db544b1980193a4b76a8a3ddab3591ce527f16d91882e67f0103b5cda53f7da54d489fc4ac08b6ab358a5a04aa9daa16219d50bd672a7cb804ed769d218807544e5993f1c27427104b349906a0b654df0bf69328afd3013fbe430155339c39f236df5557bf92f1ded7ff609a8502f49064ec3d1dbfb6c15d3a4c11a4f8acd12278cbf68acd5709463d12e3338a6eddb8c112f199645e23154a8e60879d2a654e3ed9296aa28f134168619691cd2c6b9e2eba4438381676173fc63c2588a3c5910dc149cf3760f0aa9fa9c3f5faa9162b0bf1aac9dd32b706a60ef53cbdb394b6b40222b5bc80eea82ba8958386672564cae3794f977871ab62337cf02e30049201ec12937e7ce79d0f55d9c810e20acf52212aca1d3888949e0e4830aad88d804161230eb89d4d329cc83570fe257217d2119134048dd2ed167646975fc7d77136919a049ea74cf08ddd2b896890bb24a0ba18094a22baa351bf29ad96c66bbb1a598f2ca391749620e62d61c3561a7d3653ccc8892c7b99baaf76bf836e2991cb06d6bc0514568ff0d1ec8bb4b3d6984f5eaefb17d3ea2893722375d3ddb8e389a8eef7d7d198f8e687d6a513983df906099f9a2d23f4f9dec6f8ef2f11fc0a21fac45353b94e00486f5e17d386af42502d09db33cf0cf28310e049c07e88682aeeb00cb833c5174266e62407a57583f1f88b304b7c6e0c84bbe1c0fd423072d37a5bd0aacf764229e5c7cd02473460ba3645cd8e8ae144065bf02d0dd238593d8e230354f67e0b2f23012c23274f80e3ee31e35e2606a4a3f31d94ab755e6d163cff52cbb36b6d0cc67ffc512aeed1dce4d7a0d70ce82f2baba12e8d514dc92a056f994adfb17b5b9712bd5186f27a2fda1f7039c5df2c8587fdc62f5627580c13234b55be4df3056050e2d1ef3218f0dd66cb05265fe1acfb0989d8213f2c19d1735a7cf3fa65d88dad5af52dc2bba22b7abf46c3bc77b5091baab9e8f0ddc4d5e581037de91a9f8dcbc69309be29cc815cf19a20a7585b8b3073edf51fc9baeb3e509b97fa4ecfd621e0fd57bd61cac1b895c03248ff12bdbc57509250df3517e8a3fe1d776836b34ab352b973d932ef708b14f7418f9eceb1d87667e61e3e758649cb083f01b133d37ab2f5afa96d6c84bcacf4efc3851ad308c1e7d9113624fce29fab460ab9d2a48d92cdb281103a5250ad44cb2ff6e67ac670c02fdafb3e0f1353953d6d7d5646ca1568dea55275a050ec501b7c6250444f7219f1ba7521ba3b93d089727ca5f3bbe0d6c1300b423377004954c5628fdb65770b18ced5c9b23a4a5a6d6ef25fe01b4ce278de0bcc4ed86e28a0a68818ffa40970128cf2c38740e80037984428c1bd5113f40ff47512ee6f4e4d8f9b8e8e1b3040d2928d003bd1c1329dc885302fbce9fa81c23b4dc49c7c82d29b52957847898676c89aa5d32b5b0e1c0d5a2b79a19d67562f407f19425687971a957375879d90c5f57c857136c17106c9ab1b99d80e69c8c954ed386493368884b55c939b8d64d26f643e800c56f90c01079d7c534e3b2b7ae352cefd3016da55f6a85eb803b85e2304915fd2001f77c74e28746293c46e4f5f0fd49cf988aafd0026b8e7a3bab2da5cdce1ea26c2e29ec03f4807fac432662b2d6c060be1c7be0e5489de69d0a6e03a4b9117f9244b34a0f1ecba89884f781c6320412413a00c4980287409a2a78c2cd7e65cecebbe4ec1c28cac4dd95f6998e78fc6f1392384331c9436aa10e10e2bf8ad2c4eafbcf276aa7bae64b74428911b3269c749338b0fc5075ad", + "Expected": "d61fe4e3f32ac260915b5b03b78a86d11bfc41d973fce5b0cc59035cf8289a8a2e3878ea15fa46565b0d806e2f85b53873ea20ed653869b688adf83f3ef444535bf91598ff7e80f334fb782539b92f39f55310cc4b35349ab7b278346eda9bc37c0d8acd3557fae38197f412f8d9e57ce6a76b7205c23564cab06e5615be7c6f05c3d05ec690cba91da5e89d55b152ff8dd2157dc5458190025cf94b1ad98f7cbe64e9482faba95e6b33844afc640892872b44a9932096508f4a782a4805323808f23e54b6ff9b841dbfa87db3505ae4f687972c18ea0f0d0af89d36c1c2a5b14560c153c3fee406f5cf15cfd1c0bb45d767426d465f2f14c158495069d0c5955a00150707862ecaae30624ebacdd8ac33e4e6aab3ff90b6ba445a84689386b9e945d01823a65874444316e83767290fcff630d2477f49d5d8ffdd200e08ee1274270f86ed14c687895f6caf5ce528bd970c20d2408a9ba66216324c6a011ac4999098362dbd98a038129a2d40c8da6ab88318aa3046cb660327cc44236d9e5d2163bd0959062195c51ed93d0088b6f92051fc99050ece2538749165976233697ab4b610385366e5ce0b02ad6b61c168ecfbedcdf74278a38de340fd7a5fead8e588e294795f9b011e2e60377a89e25c90e145397cdeabc60fd32444a6b7642a611a83c464d8b8976666351b4865c37b02e6dc21dbcdf5f930341707b618cc0f03c3122646b3385c9df9f2ec730eec9d49e7dfc9153b6e6289da8c4f0ebea9ccc1b751948e3bb7171c9e4d57423b0eeeb79095c030cb52677b3f7e0b45c30f645391f3f9c957afa549c4e0b2465b03c67993cd200b1af01035962edbc4c9e89b31c82ac121987d6529dafdeef67a132dc04b6dc68e77f22862040b75e2ceb9ff16da0fca534e6db7bd12fa7b7f51b6c08c1e23dfcdb7acbd2da0b51c87ffbced065a612e9b1c8bba9b7e2d8d7a2f04fcc4aaf355b60d764879a76b5e16762d5f2f55d585d0c8e82df6940960cddfb72c91dfa71f6b4e1c6ca25dfc39a878e998a663c04fe29d5e83b9586d047b4d7ff70a9f0d44f127e7d741685ca75f11629128d916a0ffef4be586a30c4b70389cc746e84ebf177c01ee8a4511cfbb9d1ecf7f7b33c7dd8177896e10bbc82f838dcd6db7ac67de62bf46b6a640fb580c5d1d2708f3862e3d2b645d0d18e49ef088053e3a220adc0e033c2afcfe61c90e32151152eb3caaf746c5e377d541cafc6cbb0cc0fa48b5caf1728f2e1957f5addfc234f1a9d89e40d49356c9172d0561a695fce6dab1d412321bbf407f63766ffd7b6b3d79bcfa07991c5a9709849c1008689e3b47c50d613980bec239fb64185249d055b30375ccb4354d71fe4d05648fbf6c80634dfc3575f2f24abb714c1e4c95e8896763bf4316e954c7ad19e5780ab7a040ca6fb9271f90a8b22ae738daf6cb", + "Name": "nagydani-5-square", + "Gas": 17868, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000400c5a1611f8be90071a43db23cc2fe01871cc4c0e8ab5743f6378e4fef77f7f6db0095c0727e20225beb665645403453e325ad5f9aeb9ba99bf3c148f63f9c07cf4fe8847ad5242d6b7d4499f93bd47056ddab8f7dee878fc2314f344dbee2a7c41a5d3db91eff372c730c2fdd3a141a4b61999e36d549b9870cf2f4e632c4d5df5f024f81c028000073a0ed8847cfb0593d36a47142f578f05ccbe28c0c06aeb1b1da027794c48db880278f79ba78ae64eedfea3c07d10e0562668d839749dc95f40467d15cf65b9cfc52c7c4bcef1cda3596dd52631aac942f146c7cebd46065131699ce8385b0db1874336747ee020a5698a3d1a1082665721e769567f579830f9d259cec1a836845109c21cf6b25da572512bf3c42fd4b96e43895589042ab60dd41f497db96aec102087fe784165bb45f942859268fd2ff6c012d9d00c02ba83eace047cc5f7b2c392c2955c58a49f0338d6fc58749c9db2155522ac17914ec216ad87f12e0ee95574613942fa615898c4d9e8a3be68cd6afa4e7a003dedbdf8edfee31162b174f965b20ae752ad89c967b3068b6f722c16b354456ba8e280f987c08e0a52d40a2e8f3a59b94d590aeef01879eb7a90b3ee7d772c839c85519cbeaddc0c193ec4874a463b53fcaea3271d80ebfb39b33489365fc039ae549a17a9ff898eea2f4cb27b8dbee4c17b998438575b2b8d107e4a0d66ba7fca85b41a58a8d51f191a35c856dfbe8aef2b00048a694bbccff832d23c8ca7a7ff0b6c0b3011d00b97c86c0628444d267c951d9e4fb8f83e154b8f74fb51aa16535e498235c5597dac9606ed0be3173a3836baa4e7d756ffe1e2879b415d3846bccd538c05b847785699aefde3e305decb600cd8fb0e7d8de5efc26971a6ad4e6d7a2d91474f1023a0ac4b78dc937da0ce607a45974d2cac1c33a2631ff7fe6144a3b2e5cf98b531a9627dea92c1dc82204d09db0439b6a11dd64b484e1263aa45fd9539b6020b55e3baece3986a8bffc1003406348f5c61265099ed43a766ee4f93f5f9c5abbc32a0fd3ac2b35b87f9ec26037d88275bd7dd0a54474995ee34ed3727f3f97c48db544b1980193a4b76a8a3ddab3591ce527f16d91882e67f0103b5cda53f7da54d489fc4ac08b6ab358a5a04aa9daa16219d50bd672a7cb804ed769d218807544e5993f1c27427104b349906a0b654df0bf69328afd3013fbe430155339c39f236df5557bf92f1ded7ff609a8502f49064ec3d1dbfb6c15d3a4c11a4f8acd12278cbf68acd5709463d12e3338a6eddb8c112f199645e23154a8e60879d2a654e3ed9296aa28f134168619691cd2c6b9e2eba4438381676173fc63c2588a3c5910dc149cf3760f0aa9fa9c3f5faa9162b0bf1aac9dd32b706a60ef53cbdb394b6b40222b5bc80eea82ba8958386672564cae3794f977871ab62337cf03e30049201ec12937e7ce79d0f55d9c810e20acf52212aca1d3888949e0e4830aad88d804161230eb89d4d329cc83570fe257217d2119134048dd2ed167646975fc7d77136919a049ea74cf08ddd2b896890bb24a0ba18094a22baa351bf29ad96c66bbb1a598f2ca391749620e62d61c3561a7d3653ccc8892c7b99baaf76bf836e2991cb06d6bc0514568ff0d1ec8bb4b3d6984f5eaefb17d3ea2893722375d3ddb8e389a8eef7d7d198f8e687d6a513983df906099f9a2d23f4f9dec6f8ef2f11fc0a21fac45353b94e00486f5e17d386af42502d09db33cf0cf28310e049c07e88682aeeb00cb833c5174266e62407a57583f1f88b304b7c6e0c84bbe1c0fd423072d37a5bd0aacf764229e5c7cd02473460ba3645cd8e8ae144065bf02d0dd238593d8e230354f67e0b2f23012c23274f80e3ee31e35e2606a4a3f31d94ab755e6d163cff52cbb36b6d0cc67ffc512aeed1dce4d7a0d70ce82f2baba12e8d514dc92a056f994adfb17b5b9712bd5186f27a2fda1f7039c5df2c8587fdc62f5627580c13234b55be4df3056050e2d1ef3218f0dd66cb05265fe1acfb0989d8213f2c19d1735a7cf3fa65d88dad5af52dc2bba22b7abf46c3bc77b5091baab9e8f0ddc4d5e581037de91a9f8dcbc69309be29cc815cf19a20a7585b8b3073edf51fc9baeb3e509b97fa4ecfd621e0fd57bd61cac1b895c03248ff12bdbc57509250df3517e8a3fe1d776836b34ab352b973d932ef708b14f7418f9eceb1d87667e61e3e758649cb083f01b133d37ab2f5afa96d6c84bcacf4efc3851ad308c1e7d9113624fce29fab460ab9d2a48d92cdb281103a5250ad44cb2ff6e67ac670c02fdafb3e0f1353953d6d7d5646ca1568dea55275a050ec501b7c6250444f7219f1ba7521ba3b93d089727ca5f3bbe0d6c1300b423377004954c5628fdb65770b18ced5c9b23a4a5a6d6ef25fe01b4ce278de0bcc4ed86e28a0a68818ffa40970128cf2c38740e80037984428c1bd5113f40ff47512ee6f4e4d8f9b8e8e1b3040d2928d003bd1c1329dc885302fbce9fa81c23b4dc49c7c82d29b52957847898676c89aa5d32b5b0e1c0d5a2b79a19d67562f407f19425687971a957375879d90c5f57c857136c17106c9ab1b99d80e69c8c954ed386493368884b55c939b8d64d26f643e800c56f90c01079d7c534e3b2b7ae352cefd3016da55f6a85eb803b85e2304915fd2001f77c74e28746293c46e4f5f0fd49cf988aafd0026b8e7a3bab2da5cdce1ea26c2e29ec03f4807fac432662b2d6c060be1c7be0e5489de69d0a6e03a4b9117f9244b34a0f1ecba89884f781c6320412413a00c4980287409a2a78c2cd7e65cecebbe4ec1c28cac4dd95f6998e78fc6f1392384331c9436aa10e10e2bf8ad2c4eafbcf276aa7bae64b74428911b3269c749338b0fc5075ad", + "Expected": "5f9c70ec884926a89461056ad20ac4c30155e817f807e4d3f5bb743d789c83386762435c3627773fa77da5144451f2a8aad8adba88e0b669f5377c5e9bad70e45c86fe952b613f015a9953b8a5de5eaee4566acf98d41e327d93a35bd5cef4607d025e58951167957df4ff9b1627649d3943805472e5e293d3efb687cfd1e503faafeb2840a3e3b3f85d016051a58e1c9498aab72e63b748d834b31eb05d85dcde65e27834e266b85c75cc4ec0135135e0601cb93eeeb6e0010c8ceb65c4c319623c5e573a2c8c9fbbf7df68a930beb412d3f4dfd146175484f45d7afaa0d2e60684af9b34730f7c8438465ad3e1d0c3237336722f2aa51095bd5759f4b8ab4dda111b684aa3dac62a761722e7ae43495b7709933512c81c4e3c9133a51f7ce9f2b51fcec064f65779666960b4e45df3900f54311f5613e8012dd1b8efd359eda31a778264c72aa8bb419d862734d769076bce2810011989a45374e5c5d8729fec21427f0bf397eacbb4220f603cf463a4b0c94efd858ffd9768cd60d6ce68d755e0fbad007ce5c2223d70c7018345a102e4ab3c60a13a9e7794303156d4c2063e919f2153c13961fb324c80b240742f47773a7a8e25b3e3fb19b00ce839346c6eb3c732fbc6b888df0b1fe0a3d07b053a2e9402c267b2d62f794d8a2840526e3ade15ce2264496ccd7519571dfde47f7a4bb16292241c20b2be59f3f8fb4f6383f232d838c5a22d8c95b6834d9d2ca493f5a505ebe8899503b0e8f9b19e6e2dd81c1628b80016d02097e0134de51054c4e7674824d4d758760fc52377d2cad145e259aa2ffaf54139e1a66b1e0c1c191e32ac59474c6b526f5b3ba07d3e5ec286eddf531fcd5292869be58c9f22ef91026159f7cf9d05ef66b4299f4da48cc1635bf2243051d342d378a22c83390553e873713c0454ce5f3234397111ac3fe3207b86f0ed9fc025c81903e1748103692074f83824fda6341be4f95ff00b0a9a208c267e12fa01825054cc0513629bf3dbb56dc5b90d4316f87654a8be18227978ea0a8a522760cad620d0d14fd38920fb7321314062914275a5f99f677145a6979b156bd82ecd36f23f8e1273cc2759ecc0b2c69d94dad5211d1bed939dd87ed9e07b91d49713a6e16ade0a98aea789f04994e318e4ff2c8a188cd8d43aeb52c6daa3bc29b4af50ea82a247c5cd67b573b34cbadcc0a376d3bbd530d50367b42705d870f2e27a8197ef46070528bfe408360faa2ebb8bf76e9f388572842bcb119f4d84ee34ae31f5cc594f23705a49197b181fb78ed1ec99499c690f843a4d0cf2e226d118e9372271054fbabdcc5c92ae9fefaef0589cd0e722eaf30c1703ec4289c7fd81beaa8a455ccee5298e31e2080c10c366a6fcf56f7d13582ad0bcad037c612b710fc595b70fbefaaca23623b60c6c39b11beb8e5843b6b3dac60f", + "Name": "nagydani-5-qube", + "Gas": 17868, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000400c5a1611f8be90071a43db23cc2fe01871cc4c0e8ab5743f6378e4fef77f7f6db0095c0727e20225beb665645403453e325ad5f9aeb9ba99bf3c148f63f9c07cf4fe8847ad5242d6b7d4499f93bd47056ddab8f7dee878fc2314f344dbee2a7c41a5d3db91eff372c730c2fdd3a141a4b61999e36d549b9870cf2f4e632c4d5df5f024f81c028000073a0ed8847cfb0593d36a47142f578f05ccbe28c0c06aeb1b1da027794c48db880278f79ba78ae64eedfea3c07d10e0562668d839749dc95f40467d15cf65b9cfc52c7c4bcef1cda3596dd52631aac942f146c7cebd46065131699ce8385b0db1874336747ee020a5698a3d1a1082665721e769567f579830f9d259cec1a836845109c21cf6b25da572512bf3c42fd4b96e43895589042ab60dd41f497db96aec102087fe784165bb45f942859268fd2ff6c012d9d00c02ba83eace047cc5f7b2c392c2955c58a49f0338d6fc58749c9db2155522ac17914ec216ad87f12e0ee95574613942fa615898c4d9e8a3be68cd6afa4e7a003dedbdf8edfee31162b174f965b20ae752ad89c967b3068b6f722c16b354456ba8e280f987c08e0a52d40a2e8f3a59b94d590aeef01879eb7a90b3ee7d772c839c85519cbeaddc0c193ec4874a463b53fcaea3271d80ebfb39b33489365fc039ae549a17a9ff898eea2f4cb27b8dbee4c17b998438575b2b8d107e4a0d66ba7fca85b41a58a8d51f191a35c856dfbe8aef2b00048a694bbccff832d23c8ca7a7ff0b6c0b3011d00b97c86c0628444d267c951d9e4fb8f83e154b8f74fb51aa16535e498235c5597dac9606ed0be3173a3836baa4e7d756ffe1e2879b415d3846bccd538c05b847785699aefde3e305decb600cd8fb0e7d8de5efc26971a6ad4e6d7a2d91474f1023a0ac4b78dc937da0ce607a45974d2cac1c33a2631ff7fe6144a3b2e5cf98b531a9627dea92c1dc82204d09db0439b6a11dd64b484e1263aa45fd9539b6020b55e3baece3986a8bffc1003406348f5c61265099ed43a766ee4f93f5f9c5abbc32a0fd3ac2b35b87f9ec26037d88275bd7dd0a54474995ee34ed3727f3f97c48db544b1980193a4b76a8a3ddab3591ce527f16d91882e67f0103b5cda53f7da54d489fc4ac08b6ab358a5a04aa9daa16219d50bd672a7cb804ed769d218807544e5993f1c27427104b349906a0b654df0bf69328afd3013fbe430155339c39f236df5557bf92f1ded7ff609a8502f49064ec3d1dbfb6c15d3a4c11a4f8acd12278cbf68acd5709463d12e3338a6eddb8c112f199645e23154a8e60879d2a654e3ed9296aa28f134168619691cd2c6b9e2eba4438381676173fc63c2588a3c5910dc149cf3760f0aa9fa9c3f5faa9162b0bf1aac9dd32b706a60ef53cbdb394b6b40222b5bc80eea82ba8958386672564cae3794f977871ab62337cf010001e30049201ec12937e7ce79d0f55d9c810e20acf52212aca1d3888949e0e4830aad88d804161230eb89d4d329cc83570fe257217d2119134048dd2ed167646975fc7d77136919a049ea74cf08ddd2b896890bb24a0ba18094a22baa351bf29ad96c66bbb1a598f2ca391749620e62d61c3561a7d3653ccc8892c7b99baaf76bf836e2991cb06d6bc0514568ff0d1ec8bb4b3d6984f5eaefb17d3ea2893722375d3ddb8e389a8eef7d7d198f8e687d6a513983df906099f9a2d23f4f9dec6f8ef2f11fc0a21fac45353b94e00486f5e17d386af42502d09db33cf0cf28310e049c07e88682aeeb00cb833c5174266e62407a57583f1f88b304b7c6e0c84bbe1c0fd423072d37a5bd0aacf764229e5c7cd02473460ba3645cd8e8ae144065bf02d0dd238593d8e230354f67e0b2f23012c23274f80e3ee31e35e2606a4a3f31d94ab755e6d163cff52cbb36b6d0cc67ffc512aeed1dce4d7a0d70ce82f2baba12e8d514dc92a056f994adfb17b5b9712bd5186f27a2fda1f7039c5df2c8587fdc62f5627580c13234b55be4df3056050e2d1ef3218f0dd66cb05265fe1acfb0989d8213f2c19d1735a7cf3fa65d88dad5af52dc2bba22b7abf46c3bc77b5091baab9e8f0ddc4d5e581037de91a9f8dcbc69309be29cc815cf19a20a7585b8b3073edf51fc9baeb3e509b97fa4ecfd621e0fd57bd61cac1b895c03248ff12bdbc57509250df3517e8a3fe1d776836b34ab352b973d932ef708b14f7418f9eceb1d87667e61e3e758649cb083f01b133d37ab2f5afa96d6c84bcacf4efc3851ad308c1e7d9113624fce29fab460ab9d2a48d92cdb281103a5250ad44cb2ff6e67ac670c02fdafb3e0f1353953d6d7d5646ca1568dea55275a050ec501b7c6250444f7219f1ba7521ba3b93d089727ca5f3bbe0d6c1300b423377004954c5628fdb65770b18ced5c9b23a4a5a6d6ef25fe01b4ce278de0bcc4ed86e28a0a68818ffa40970128cf2c38740e80037984428c1bd5113f40ff47512ee6f4e4d8f9b8e8e1b3040d2928d003bd1c1329dc885302fbce9fa81c23b4dc49c7c82d29b52957847898676c89aa5d32b5b0e1c0d5a2b79a19d67562f407f19425687971a957375879d90c5f57c857136c17106c9ab1b99d80e69c8c954ed386493368884b55c939b8d64d26f643e800c56f90c01079d7c534e3b2b7ae352cefd3016da55f6a85eb803b85e2304915fd2001f77c74e28746293c46e4f5f0fd49cf988aafd0026b8e7a3bab2da5cdce1ea26c2e29ec03f4807fac432662b2d6c060be1c7be0e5489de69d0a6e03a4b9117f9244b34a0f1ecba89884f781c6320412413a00c4980287409a2a78c2cd7e65cecebbe4ec1c28cac4dd95f6998e78fc6f1392384331c9436aa10e10e2bf8ad2c4eafbcf276aa7bae64b74428911b3269c749338b0fc5075ad", + "Expected": "5a0eb2bdf0ac1cae8e586689fa16cd4b07dfdedaec8a110ea1fdb059dd5253231b6132987598dfc6e11f86780428982d50cf68f67ae452622c3b336b537ef3298ca645e8f89ee39a26758206a5a3f6409afc709582f95274b57b71fae5c6b74619ae6f089a5393c5b79235d9caf699d23d88fb873f78379690ad8405e34c19f5257d596580c7a6a7206a3712825afe630c76b31cdb4a23e7f0632e10f14f4e282c81a66451a26f8df2a352b5b9f607a7198449d1b926e27036810368e691a74b91c61afa73d9d3b99453e7c8b50fd4f09c039a2f2feb5c419206694c31b92df1d9586140cb3417b38d0c503c7b508cc2ed12e813a1c795e9829eb39ee78eeaf360a169b491a1d4e419574e712402de9d48d54c1ae5e03739b7156615e8267e1fb0a897f067afd11fb33f6e24182d7aaaaa18fe5bc1982f20d6b871e5a398f0f6f718181d31ec225cfa9a0a70124ed9a70031bdf0c1c7829f708b6e17d50419ef361cf77d99c85f44607186c8d683106b8bd38a49b5d0fb503b397a83388c5678dcfcc737499d84512690701ed621a6f0172aecf037184ddf0f2453e4053024018e5ab2e30d6d5363b56e8b41509317c99042f517247474ab3abc848e00a07f69c254f46f2a05cf6ed84e5cc906a518fdcfdf2c61ce731f24c5264f1a25fc04934dc28aec112134dd523f70115074ca34e3807aa4cb925147f3a0ce152d323bd8c675ace446d0fd1ae30c4b57f0eb2c23884bc18f0964c0114796c5b6d080c3d89175665fbf63a6381a6a9da39ad070b645c8bb1779506da14439a9f5b5d481954764ea114fac688930bc68534d403cff4210673b6a6ff7ae416b7cd41404c3d3f282fcd193b86d0f54d0006c2a503b40d5c3930da980565b8f9630e9493a79d1c03e74e5f93ac8e4dc1a901ec5e3b3e57049124c7b72ea345aa359e782285d9e6a5c144a378111dd02c40855ff9c2be9b48425cb0b2fd62dc8678fd151121cf26a65e917d65d8e0dacfae108eb5508b601fb8ffa370be1f9a8b749a2d12eeab81f41079de87e2d777994fa4d28188c579ad327f9957fb7bdecec5c680844dd43cb57cf87aeb763c003e65011f73f8c63442df39a92b946a6bd968a1c1e4d5fa7d88476a68bd8e20e5b70a99259c7d3f85fb1b65cd2e93972e6264e74ebf289b8b6979b9b68a85cd5b360c1987f87235c3c845d62489e33acf85d53fa3561fe3a3aee18924588d9c6eba4edb7a4d106b31173e42929f6f0c48c80ce6a72d54eca7c0fe870068b7a7c89c63cdda593f5b32d3cb4ea8a32c39f00ab449155757172d66763ed9527019d6de6c9f2416aa6203f4d11c9ebee1e1d3845099e55504446448027212616167eb36035726daa7698b075286f5379cd3e93cb3e0cf4f9cb8d017facbb5550ed32d5ec5400ae57e47e2bf78d1eaeff9480cc765ceff39db500", + "Name": "nagydani-5-pow0x10001", + "Gas": 285900, + "NoBenchmark": false + } +] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/precompiles/modexp_eip2565.json b/x/evm/core/vm/testdata/precompiles/modexp_eip2565.json new file mode 100644 index 0000000000..c55441439e --- /dev/null +++ b/x/evm/core/vm/testdata/precompiles/modexp_eip2565.json @@ -0,0 +1,121 @@ +[ + { + "Input": "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002003fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2efffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + "Expected": "0000000000000000000000000000000000000000000000000000000000000001", + "Name": "eip_example1", + "Gas": 1360, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2efffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + "Expected": "0000000000000000000000000000000000000000000000000000000000000000", + "Name": "eip_example2", + "Gas": 1360, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040e09ad9675465c53a109fac66a445c91b292d2bb2c5268addb30cd82f80fcb0033ff97c80a5fc6f39193ae969c6ede6710a6b7ac27078a06d90ef1c72e5c85fb502fc9e1f6beb81516545975218075ec2af118cd8798df6e08a147c60fd6095ac2bb02c2908cf4dd7c81f11c289e4bce98f3553768f392a80ce22bf5c4f4a248c6b", + "Expected": "60008f1614cc01dcfb6bfb09c625cf90b47d4468db81b5f8b7a39d42f332eab9b2da8f2d95311648a8f243f4bb13cfb3d8f7f2a3c014122ebb3ed41b02783adc", + "Name": "nagydani-1-square", + "Gas": 200, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040e09ad9675465c53a109fac66a445c91b292d2bb2c5268addb30cd82f80fcb0033ff97c80a5fc6f39193ae969c6ede6710a6b7ac27078a06d90ef1c72e5c85fb503fc9e1f6beb81516545975218075ec2af118cd8798df6e08a147c60fd6095ac2bb02c2908cf4dd7c81f11c289e4bce98f3553768f392a80ce22bf5c4f4a248c6b", + "Expected": "4834a46ba565db27903b1c720c9d593e84e4cbd6ad2e64b31885d944f68cd801f92225a8961c952ddf2797fa4701b330c85c4b363798100b921a1a22a46a7fec", + "Name": "nagydani-1-qube", + "Gas": 200, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000040e09ad9675465c53a109fac66a445c91b292d2bb2c5268addb30cd82f80fcb0033ff97c80a5fc6f39193ae969c6ede6710a6b7ac27078a06d90ef1c72e5c85fb5010001fc9e1f6beb81516545975218075ec2af118cd8798df6e08a147c60fd6095ac2bb02c2908cf4dd7c81f11c289e4bce98f3553768f392a80ce22bf5c4f4a248c6b", + "Expected": "c36d804180c35d4426b57b50c5bfcca5c01856d104564cd513b461d3c8b8409128a5573e416d0ebe38f5f736766d9dc27143e4da981dfa4d67f7dc474cbee6d2", + "Name": "nagydani-1-pow0x10001", + "Gas": 341, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080cad7d991a00047dd54d3399b6b0b937c718abddef7917c75b6681f40cc15e2be0003657d8d4c34167b2f0bbbca0ccaa407c2a6a07d50f1517a8f22979ce12a81dcaf707cc0cebfc0ce2ee84ee7f77c38b9281b9822a8d3de62784c089c9b18dcb9a2a5eecbede90ea788a862a9ddd9d609c2c52972d63e289e28f6a590ffbf5102e6d893b80aeed5e6e9ce9afa8a5d5675c93a32ac05554cb20e9951b2c140e3ef4e433068cf0fb73bc9f33af1853f64aa27a0028cbf570d7ac9048eae5dc7b28c87c31e5810f1e7fa2cda6adf9f1076dbc1ec1238560071e7efc4e9565c49be9e7656951985860a558a754594115830bcdb421f741408346dd5997bb01c287087", + "Expected": "981dd99c3b113fae3e3eaa9435c0dc96779a23c12a53d1084b4f67b0b053a27560f627b873e3f16ad78f28c94f14b6392def26e4d8896c5e3c984e50fa0b3aa44f1da78b913187c6128baa9340b1e9c9a0fd02cb78885e72576da4a8f7e5a113e173a7a2889fde9d407bd9f06eb05bc8fc7b4229377a32941a02bf4edcc06d70", + "Name": "nagydani-2-square", + "Gas": 200, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080cad7d991a00047dd54d3399b6b0b937c718abddef7917c75b6681f40cc15e2be0003657d8d4c34167b2f0bbbca0ccaa407c2a6a07d50f1517a8f22979ce12a81dcaf707cc0cebfc0ce2ee84ee7f77c38b9281b9822a8d3de62784c089c9b18dcb9a2a5eecbede90ea788a862a9ddd9d609c2c52972d63e289e28f6a590ffbf5103e6d893b80aeed5e6e9ce9afa8a5d5675c93a32ac05554cb20e9951b2c140e3ef4e433068cf0fb73bc9f33af1853f64aa27a0028cbf570d7ac9048eae5dc7b28c87c31e5810f1e7fa2cda6adf9f1076dbc1ec1238560071e7efc4e9565c49be9e7656951985860a558a754594115830bcdb421f741408346dd5997bb01c287087", + "Expected": "d89ceb68c32da4f6364978d62aaa40d7b09b59ec61eb3c0159c87ec3a91037f7dc6967594e530a69d049b64adfa39c8fa208ea970cfe4b7bcd359d345744405afe1cbf761647e32b3184c7fbe87cee8c6c7ff3b378faba6c68b83b6889cb40f1603ee68c56b4c03d48c595c826c041112dc941878f8c5be828154afd4a16311f", + "Name": "nagydani-2-qube", + "Gas": 200, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000080cad7d991a00047dd54d3399b6b0b937c718abddef7917c75b6681f40cc15e2be0003657d8d4c34167b2f0bbbca0ccaa407c2a6a07d50f1517a8f22979ce12a81dcaf707cc0cebfc0ce2ee84ee7f77c38b9281b9822a8d3de62784c089c9b18dcb9a2a5eecbede90ea788a862a9ddd9d609c2c52972d63e289e28f6a590ffbf51010001e6d893b80aeed5e6e9ce9afa8a5d5675c93a32ac05554cb20e9951b2c140e3ef4e433068cf0fb73bc9f33af1853f64aa27a0028cbf570d7ac9048eae5dc7b28c87c31e5810f1e7fa2cda6adf9f1076dbc1ec1238560071e7efc4e9565c49be9e7656951985860a558a754594115830bcdb421f741408346dd5997bb01c287087", + "Expected": "ad85e8ef13fd1dd46eae44af8b91ad1ccae5b7a1c92944f92a19f21b0b658139e0cabe9c1f679507c2de354bf2c91ebd965d1e633978a830d517d2f6f8dd5fd58065d58559de7e2334a878f8ec6992d9b9e77430d4764e863d77c0f87beede8f2f7f2ab2e7222f85cc9d98b8467f4bb72e87ef2882423ebdb6daf02dddac6db2", + "Name": "nagydani-2-pow0x10001", + "Gas": 1365, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000100c9130579f243e12451760976261416413742bd7c91d39ae087f46794062b8c239f2a74abf3918605a0e046a7890e049475ba7fbb78f5de6490bd22a710cc04d30088179a919d86c2da62cf37f59d8f258d2310d94c24891be2d7eeafaa32a8cb4b0cfe5f475ed778f45907dc8916a73f03635f233f7a77a00a3ec9ca6761a5bbd558a2318ecd0caa1c5016691523e7e1fa267dd35e70c66e84380bdcf7c0582f540174e572c41f81e93da0b757dff0b0fe23eb03aa19af0bdec3afb474216febaacb8d0381e631802683182b0fe72c28392539850650b70509f54980241dc175191a35d967288b532a7a8223ce2440d010615f70df269501944d4ec16fe4a3cb02d7a85909174757835187cb52e71934e6c07ef43b4c46fc30bbcd0bc72913068267c54a4aabebb493922492820babdeb7dc9b1558fcf7bd82c37c82d3147e455b623ab0efa752fe0b3a67ca6e4d126639e645a0bf417568adbb2a6a4eef62fa1fa29b2a5a43bebea1f82193a7dd98eb483d09bb595af1fa9c97c7f41f5649d976aee3e5e59e2329b43b13bea228d4a93f16ba139ccb511de521ffe747aa2eca664f7c9e33da59075cc335afcd2bf3ae09765f01ab5a7c3e3938ec168b74724b5074247d200d9970382f683d6059b94dbc336603d1dfee714e4b447ac2fa1d99ecb4961da2854e03795ed758220312d101e1e3d87d5313a6d052aebde75110363d", + "Expected": "affc7507ea6d84751ec6b3f0d7b99dbcc263f33330e450d1b3ff0bc3d0874320bf4edd57debd587306988157958cb3cfd369cc0c9c198706f635c9e0f15d047df5cb44d03e2727f26b083c4ad8485080e1293f171c1ed52aef5993a5815c35108e848c951cf1e334490b4a539a139e57b68f44fee583306f5b85ffa57206b3ee5660458858534e5386b9584af3c7f67806e84c189d695e5eb96e1272d06ec2df5dc5fabc6e94b793718c60c36be0a4d031fc84cd658aa72294b2e16fc240aef70cb9e591248e38bd49c5a554d1afa01f38dab72733092f7555334bbef6c8c430119840492380aa95fa025dcf699f0a39669d812b0c6946b6091e6e235337b6f8", + "Name": "nagydani-3-square", + "Gas": 341, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000100c9130579f243e12451760976261416413742bd7c91d39ae087f46794062b8c239f2a74abf3918605a0e046a7890e049475ba7fbb78f5de6490bd22a710cc04d30088179a919d86c2da62cf37f59d8f258d2310d94c24891be2d7eeafaa32a8cb4b0cfe5f475ed778f45907dc8916a73f03635f233f7a77a00a3ec9ca6761a5bbd558a2318ecd0caa1c5016691523e7e1fa267dd35e70c66e84380bdcf7c0582f540174e572c41f81e93da0b757dff0b0fe23eb03aa19af0bdec3afb474216febaacb8d0381e631802683182b0fe72c28392539850650b70509f54980241dc175191a35d967288b532a7a8223ce2440d010615f70df269501944d4ec16fe4a3cb03d7a85909174757835187cb52e71934e6c07ef43b4c46fc30bbcd0bc72913068267c54a4aabebb493922492820babdeb7dc9b1558fcf7bd82c37c82d3147e455b623ab0efa752fe0b3a67ca6e4d126639e645a0bf417568adbb2a6a4eef62fa1fa29b2a5a43bebea1f82193a7dd98eb483d09bb595af1fa9c97c7f41f5649d976aee3e5e59e2329b43b13bea228d4a93f16ba139ccb511de521ffe747aa2eca664f7c9e33da59075cc335afcd2bf3ae09765f01ab5a7c3e3938ec168b74724b5074247d200d9970382f683d6059b94dbc336603d1dfee714e4b447ac2fa1d99ecb4961da2854e03795ed758220312d101e1e3d87d5313a6d052aebde75110363d", + "Expected": "1b280ecd6a6bf906b806d527c2a831e23b238f89da48449003a88ac3ac7150d6a5e9e6b3be4054c7da11dd1e470ec29a606f5115801b5bf53bc1900271d7c3ff3cd5ed790d1c219a9800437a689f2388ba1a11d68f6a8e5b74e9a3b1fac6ee85fc6afbac599f93c391f5dc82a759e3c6c0ab45ce3f5d25d9b0c1bf94cf701ea6466fc9a478dacc5754e593172b5111eeba88557048bceae401337cd4c1182ad9f700852bc8c99933a193f0b94cf1aedbefc48be3bc93ef5cb276d7c2d5462ac8bb0c8fe8923a1db2afe1c6b90d59c534994a6a633f0ead1d638fdc293486bb634ff2c8ec9e7297c04241a61c37e3ae95b11d53343d4ba2b4cc33d2cfa7eb705e", + "Name": "nagydani-3-qube", + "Gas": 341, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000100c9130579f243e12451760976261416413742bd7c91d39ae087f46794062b8c239f2a74abf3918605a0e046a7890e049475ba7fbb78f5de6490bd22a710cc04d30088179a919d86c2da62cf37f59d8f258d2310d94c24891be2d7eeafaa32a8cb4b0cfe5f475ed778f45907dc8916a73f03635f233f7a77a00a3ec9ca6761a5bbd558a2318ecd0caa1c5016691523e7e1fa267dd35e70c66e84380bdcf7c0582f540174e572c41f81e93da0b757dff0b0fe23eb03aa19af0bdec3afb474216febaacb8d0381e631802683182b0fe72c28392539850650b70509f54980241dc175191a35d967288b532a7a8223ce2440d010615f70df269501944d4ec16fe4a3cb010001d7a85909174757835187cb52e71934e6c07ef43b4c46fc30bbcd0bc72913068267c54a4aabebb493922492820babdeb7dc9b1558fcf7bd82c37c82d3147e455b623ab0efa752fe0b3a67ca6e4d126639e645a0bf417568adbb2a6a4eef62fa1fa29b2a5a43bebea1f82193a7dd98eb483d09bb595af1fa9c97c7f41f5649d976aee3e5e59e2329b43b13bea228d4a93f16ba139ccb511de521ffe747aa2eca664f7c9e33da59075cc335afcd2bf3ae09765f01ab5a7c3e3938ec168b74724b5074247d200d9970382f683d6059b94dbc336603d1dfee714e4b447ac2fa1d99ecb4961da2854e03795ed758220312d101e1e3d87d5313a6d052aebde75110363d", + "Expected": "37843d7c67920b5f177372fa56e2a09117df585f81df8b300fba245b1175f488c99476019857198ed459ed8d9799c377330e49f4180c4bf8e8f66240c64f65ede93d601f957b95b83efdee1e1bfde74169ff77002eaf078c71815a9220c80b2e3b3ff22c2f358111d816ebf83c2999026b6de50bfc711ff68705d2f40b753424aefc9f70f08d908b5a20276ad613b4ab4309a3ea72f0c17ea9df6b3367d44fb3acab11c333909e02e81ea2ed404a712d3ea96bba87461720e2d98723e7acd0520ac1a5212dbedcd8dc0c1abf61d4719e319ff4758a774790b8d463cdfe131d1b2dcfee52d002694e98e720cb6ae7ccea353bc503269ba35f0f63bf8d7b672a76", + "Name": "nagydani-3-pow0x10001", + "Gas": 5461, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000200db34d0e438249c0ed685c949cc28776a05094e1c48691dc3f2dca5fc3356d2a0663bd376e4712839917eb9a19c670407e2c377a2de385a3ff3b52104f7f1f4e0c7bf7717fb913896693dc5edbb65b760ef1b00e42e9d8f9af17352385e1cd742c9b006c0f669995cb0bb21d28c0aced2892267637b6470d8cee0ab27fc5d42658f6e88240c31d6774aa60a7ebd25cd48b56d0da11209f1928e61005c6eb709f3e8e0aaf8d9b10f7d7e296d772264dc76897ccdddadc91efa91c1903b7232a9e4c3b941917b99a3bc0c26497dedc897c25750af60237aa67934a26a2bc491db3dcc677491944bc1f51d3e5d76b8d846a62db03dedd61ff508f91a56d71028125035c3a44cbb041497c83bf3e4ae2a9613a401cc721c547a2afa3b16a2969933d3626ed6d8a7428648f74122fd3f2a02a20758f7f693892c8fd798b39abac01d18506c45e71432639e9f9505719ee822f62ccbf47f6850f096ff77b5afaf4be7d772025791717dbe5abf9b3f40cff7d7aab6f67e38f62faf510747276e20a42127e7500c444f9ed92baf65ade9e836845e39c4316d9dce5f8e2c8083e2c0acbb95296e05e51aab13b6b8f53f06c9c4276e12b0671133218cc3ea907da3bd9a367096d9202128d14846cc2e20d56fc8473ecb07cecbfb8086919f3971926e7045b853d85a69d026195c70f9f7a823536e2a8f4b3e12e94d9b53a934353451094b8102df3143a0057457d75e8c708b6337a6f5a4fd1a06727acf9fb93e2993c62f3378b37d56c85e7b1e00f0145ebf8e4095bd723166293c60b6ac1252291ef65823c9e040ddad14969b3b340a4ef714db093a587c37766d68b8d6b5016e741587e7e6bf7e763b44f0247e64bae30f994d248bfd20541a333e5b225ef6a61199e301738b1e688f70ec1d7fb892c183c95dc543c3e12adf8a5e8b9ca9d04f9445cced3ab256f29e998e69efaa633a7b60e1db5a867924ccab0a171d9d6e1098dfa15acde9553de599eaa56490c8f411e4985111f3d40bddfc5e301edb01547b01a886550a61158f7e2033c59707789bf7c854181d0c2e2a42a93cf09209747d7082e147eb8544de25c3eb14f2e35559ea0c0f5877f2f3fc92132c0ae9da4e45b2f6c866a224ea6d1f28c05320e287750fbc647368d41116e528014cc1852e5531d53e4af938374daba6cee4baa821ed07117253bb3601ddd00d59a3d7fb2ef1f5a2fbba7c429f0cf9a5b3462410fd833a69118f8be9c559b1000cc608fd877fb43f8e65c2d1302622b944462579056874b387208d90623fcdaf93920ca7a9e4ba64ea208758222ad868501cc2c345e2d3a5ea2a17e5069248138c8a79c0251185d29ee73e5afab5354769142d2bf0cb6712727aa6bf84a6245fcdae66e4938d84d1b9dd09a884818622080ff5f98942fb20acd7e0c916c2d5ea7ce6f7e173315384518f", + "Expected": "8a5aea5f50dcc03dc7a7a272b5aeebc040554dbc1ffe36753c4fc75f7ed5f6c2cc0de3a922bf96c78bf0643a73025ad21f45a4a5cadd717612c511ab2bff1190fe5f1ae05ba9f8fe3624de1de2a817da6072ddcdb933b50216811dbe6a9ca79d3a3c6b3a476b079fd0d05f04fb154e2dd3e5cb83b148a006f2bcbf0042efb2ae7b916ea81b27aac25c3bf9a8b6d35440062ad8eae34a83f3ffa2cc7b40346b62174a4422584f72f95316f6b2bee9ff232ba9739301c97c99a9ded26c45d72676eb856ad6ecc81d36a6de36d7f9dafafee11baa43a4b0d5e4ecffa7b9b7dcefd58c397dd373e6db4acd2b2c02717712e6289bed7c813b670c4a0c6735aa7f3b0f1ce556eae9fcc94b501b2c8781ba50a8c6220e8246371c3c7359fe4ef9da786ca7d98256754ca4e496be0a9174bedbecb384bdf470779186d6a833f068d2838a88d90ef3ad48ff963b67c39cc5a3ee123baf7bf3125f64e77af7f30e105d72c4b9b5b237ed251e4c122c6d8c1405e736299c3afd6db16a28c6a9cfa68241e53de4cd388271fe534a6a9b0dbea6171d170db1b89858468885d08fecbd54c8e471c3e25d48e97ba450b96d0d87e00ac732aaa0d3ce4309c1064bd8a4c0808a97e0143e43a24cfa847635125cd41c13e0574487963e9d725c01375db99c31da67b4cf65eff555f0c0ac416c727ff8d438ad7c42030551d68c2e7adda0abb1ca7c10", + "Name": "nagydani-4-square", + "Gas": 1365, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000200db34d0e438249c0ed685c949cc28776a05094e1c48691dc3f2dca5fc3356d2a0663bd376e4712839917eb9a19c670407e2c377a2de385a3ff3b52104f7f1f4e0c7bf7717fb913896693dc5edbb65b760ef1b00e42e9d8f9af17352385e1cd742c9b006c0f669995cb0bb21d28c0aced2892267637b6470d8cee0ab27fc5d42658f6e88240c31d6774aa60a7ebd25cd48b56d0da11209f1928e61005c6eb709f3e8e0aaf8d9b10f7d7e296d772264dc76897ccdddadc91efa91c1903b7232a9e4c3b941917b99a3bc0c26497dedc897c25750af60237aa67934a26a2bc491db3dcc677491944bc1f51d3e5d76b8d846a62db03dedd61ff508f91a56d71028125035c3a44cbb041497c83bf3e4ae2a9613a401cc721c547a2afa3b16a2969933d3626ed6d8a7428648f74122fd3f2a02a20758f7f693892c8fd798b39abac01d18506c45e71432639e9f9505719ee822f62ccbf47f6850f096ff77b5afaf4be7d772025791717dbe5abf9b3f40cff7d7aab6f67e38f62faf510747276e20a42127e7500c444f9ed92baf65ade9e836845e39c4316d9dce5f8e2c8083e2c0acbb95296e05e51aab13b6b8f53f06c9c4276e12b0671133218cc3ea907da3bd9a367096d9202128d14846cc2e20d56fc8473ecb07cecbfb8086919f3971926e7045b853d85a69d026195c70f9f7a823536e2a8f4b3e12e94d9b53a934353451094b8103df3143a0057457d75e8c708b6337a6f5a4fd1a06727acf9fb93e2993c62f3378b37d56c85e7b1e00f0145ebf8e4095bd723166293c60b6ac1252291ef65823c9e040ddad14969b3b340a4ef714db093a587c37766d68b8d6b5016e741587e7e6bf7e763b44f0247e64bae30f994d248bfd20541a333e5b225ef6a61199e301738b1e688f70ec1d7fb892c183c95dc543c3e12adf8a5e8b9ca9d04f9445cced3ab256f29e998e69efaa633a7b60e1db5a867924ccab0a171d9d6e1098dfa15acde9553de599eaa56490c8f411e4985111f3d40bddfc5e301edb01547b01a886550a61158f7e2033c59707789bf7c854181d0c2e2a42a93cf09209747d7082e147eb8544de25c3eb14f2e35559ea0c0f5877f2f3fc92132c0ae9da4e45b2f6c866a224ea6d1f28c05320e287750fbc647368d41116e528014cc1852e5531d53e4af938374daba6cee4baa821ed07117253bb3601ddd00d59a3d7fb2ef1f5a2fbba7c429f0cf9a5b3462410fd833a69118f8be9c559b1000cc608fd877fb43f8e65c2d1302622b944462579056874b387208d90623fcdaf93920ca7a9e4ba64ea208758222ad868501cc2c345e2d3a5ea2a17e5069248138c8a79c0251185d29ee73e5afab5354769142d2bf0cb6712727aa6bf84a6245fcdae66e4938d84d1b9dd09a884818622080ff5f98942fb20acd7e0c916c2d5ea7ce6f7e173315384518f", + "Expected": "5a2664252aba2d6e19d9600da582cdd1f09d7a890ac48e6b8da15ae7c6ff1856fc67a841ac2314d283ffa3ca81a0ecf7c27d89ef91a5a893297928f5da0245c99645676b481b7e20a566ee6a4f2481942bee191deec5544600bb2441fd0fb19e2ee7d801ad8911c6b7750affec367a4b29a22942c0f5f4744a4e77a8b654da2a82571037099e9c6d930794efe5cdca73c7b6c0844e386bdca8ea01b3d7807146bb81365e2cdc6475f8c23e0ff84463126189dc9789f72bbce2e3d2d114d728a272f1345122de23df54c922ec7a16e5c2a8f84da8871482bd258c20a7c09bbcd64c7a96a51029bbfe848736a6ba7bf9d931a9b7de0bcaf3635034d4958b20ae9ab3a95a147b0421dd5f7ebff46c971010ebfc4adbbe0ad94d5498c853e7142c450d8c71de4b2f84edbf8acd2e16d00c8115b150b1c30e553dbb82635e781379fe2a56360420ff7e9f70cc64c00aba7e26ed13c7c19622865ae07248daced36416080f35f8cc157a857ed70ea4f347f17d1bee80fa038abd6e39b1ba06b97264388b21364f7c56e192d4b62d9b161405f32ab1e2594e86243e56fcf2cb30d21adef15b9940f91af681da24328c883d892670c6aa47940867a81830a82b82716895db810df1b834640abefb7db2092dd92912cb9a735175bc447be40a503cf22dfe565b4ed7a3293ca0dfd63a507430b323ee248ec82e843b673c97ad730728cebc", + "Name": "nagydani-4-qube", + "Gas": 1365, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000200db34d0e438249c0ed685c949cc28776a05094e1c48691dc3f2dca5fc3356d2a0663bd376e4712839917eb9a19c670407e2c377a2de385a3ff3b52104f7f1f4e0c7bf7717fb913896693dc5edbb65b760ef1b00e42e9d8f9af17352385e1cd742c9b006c0f669995cb0bb21d28c0aced2892267637b6470d8cee0ab27fc5d42658f6e88240c31d6774aa60a7ebd25cd48b56d0da11209f1928e61005c6eb709f3e8e0aaf8d9b10f7d7e296d772264dc76897ccdddadc91efa91c1903b7232a9e4c3b941917b99a3bc0c26497dedc897c25750af60237aa67934a26a2bc491db3dcc677491944bc1f51d3e5d76b8d846a62db03dedd61ff508f91a56d71028125035c3a44cbb041497c83bf3e4ae2a9613a401cc721c547a2afa3b16a2969933d3626ed6d8a7428648f74122fd3f2a02a20758f7f693892c8fd798b39abac01d18506c45e71432639e9f9505719ee822f62ccbf47f6850f096ff77b5afaf4be7d772025791717dbe5abf9b3f40cff7d7aab6f67e38f62faf510747276e20a42127e7500c444f9ed92baf65ade9e836845e39c4316d9dce5f8e2c8083e2c0acbb95296e05e51aab13b6b8f53f06c9c4276e12b0671133218cc3ea907da3bd9a367096d9202128d14846cc2e20d56fc8473ecb07cecbfb8086919f3971926e7045b853d85a69d026195c70f9f7a823536e2a8f4b3e12e94d9b53a934353451094b81010001df3143a0057457d75e8c708b6337a6f5a4fd1a06727acf9fb93e2993c62f3378b37d56c85e7b1e00f0145ebf8e4095bd723166293c60b6ac1252291ef65823c9e040ddad14969b3b340a4ef714db093a587c37766d68b8d6b5016e741587e7e6bf7e763b44f0247e64bae30f994d248bfd20541a333e5b225ef6a61199e301738b1e688f70ec1d7fb892c183c95dc543c3e12adf8a5e8b9ca9d04f9445cced3ab256f29e998e69efaa633a7b60e1db5a867924ccab0a171d9d6e1098dfa15acde9553de599eaa56490c8f411e4985111f3d40bddfc5e301edb01547b01a886550a61158f7e2033c59707789bf7c854181d0c2e2a42a93cf09209747d7082e147eb8544de25c3eb14f2e35559ea0c0f5877f2f3fc92132c0ae9da4e45b2f6c866a224ea6d1f28c05320e287750fbc647368d41116e528014cc1852e5531d53e4af938374daba6cee4baa821ed07117253bb3601ddd00d59a3d7fb2ef1f5a2fbba7c429f0cf9a5b3462410fd833a69118f8be9c559b1000cc608fd877fb43f8e65c2d1302622b944462579056874b387208d90623fcdaf93920ca7a9e4ba64ea208758222ad868501cc2c345e2d3a5ea2a17e5069248138c8a79c0251185d29ee73e5afab5354769142d2bf0cb6712727aa6bf84a6245fcdae66e4938d84d1b9dd09a884818622080ff5f98942fb20acd7e0c916c2d5ea7ce6f7e173315384518f", + "Expected": "bed8b970c4a34849fc6926b08e40e20b21c15ed68d18f228904878d4370b56322d0da5789da0318768a374758e6375bfe4641fca5285ec7171828922160f48f5ca7efbfee4d5148612c38ad683ae4e3c3a053d2b7c098cf2b34f2cb19146eadd53c86b2d7ccf3d83b2c370bfb840913ee3879b1057a6b4e07e110b6bcd5e958bc71a14798c91d518cc70abee264b0d25a4110962a764b364ac0b0dd1ee8abc8426d775ec0f22b7e47b32576afaf1b5a48f64573ed1c5c29f50ab412188d9685307323d990802b81dacc06c6e05a1e901830ba9fcc67688dc29c5e27bde0a6e845ca925f5454b6fb3747edfaa2a5820838fb759eadf57f7cb5cec57fc213ddd8a4298fa079c3c0f472b07fb15aa6a7f0a3780bd296ff6a62e58ef443870b02260bd4fd2bbc98255674b8e1f1f9f8d33c7170b0ebbea4523b695911abbf26e41885344823bd0587115fdd83b721a4e8457a31c9a84b3d3520a07e0e35df7f48e5a9d534d0ec7feef1ff74de6a11e7f93eab95175b6ce22c68d78a642ad642837897ec11349205d8593ac19300207572c38d29ca5dfa03bc14cdbc32153c80e5cc3e739403d34c75915e49beb43094cc6dcafb3665b305ddec9286934ae66ec6b777ca528728c851318eb0f207b39f1caaf96db6eeead6b55ed08f451939314577d42bcc9f97c0b52d0234f88fd07e4c1d7780fdebc025cfffcb572cb27a8c33963", + "Name": "nagydani-4-pow0x10001", + "Gas": 21845, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000400c5a1611f8be90071a43db23cc2fe01871cc4c0e8ab5743f6378e4fef77f7f6db0095c0727e20225beb665645403453e325ad5f9aeb9ba99bf3c148f63f9c07cf4fe8847ad5242d6b7d4499f93bd47056ddab8f7dee878fc2314f344dbee2a7c41a5d3db91eff372c730c2fdd3a141a4b61999e36d549b9870cf2f4e632c4d5df5f024f81c028000073a0ed8847cfb0593d36a47142f578f05ccbe28c0c06aeb1b1da027794c48db880278f79ba78ae64eedfea3c07d10e0562668d839749dc95f40467d15cf65b9cfc52c7c4bcef1cda3596dd52631aac942f146c7cebd46065131699ce8385b0db1874336747ee020a5698a3d1a1082665721e769567f579830f9d259cec1a836845109c21cf6b25da572512bf3c42fd4b96e43895589042ab60dd41f497db96aec102087fe784165bb45f942859268fd2ff6c012d9d00c02ba83eace047cc5f7b2c392c2955c58a49f0338d6fc58749c9db2155522ac17914ec216ad87f12e0ee95574613942fa615898c4d9e8a3be68cd6afa4e7a003dedbdf8edfee31162b174f965b20ae752ad89c967b3068b6f722c16b354456ba8e280f987c08e0a52d40a2e8f3a59b94d590aeef01879eb7a90b3ee7d772c839c85519cbeaddc0c193ec4874a463b53fcaea3271d80ebfb39b33489365fc039ae549a17a9ff898eea2f4cb27b8dbee4c17b998438575b2b8d107e4a0d66ba7fca85b41a58a8d51f191a35c856dfbe8aef2b00048a694bbccff832d23c8ca7a7ff0b6c0b3011d00b97c86c0628444d267c951d9e4fb8f83e154b8f74fb51aa16535e498235c5597dac9606ed0be3173a3836baa4e7d756ffe1e2879b415d3846bccd538c05b847785699aefde3e305decb600cd8fb0e7d8de5efc26971a6ad4e6d7a2d91474f1023a0ac4b78dc937da0ce607a45974d2cac1c33a2631ff7fe6144a3b2e5cf98b531a9627dea92c1dc82204d09db0439b6a11dd64b484e1263aa45fd9539b6020b55e3baece3986a8bffc1003406348f5c61265099ed43a766ee4f93f5f9c5abbc32a0fd3ac2b35b87f9ec26037d88275bd7dd0a54474995ee34ed3727f3f97c48db544b1980193a4b76a8a3ddab3591ce527f16d91882e67f0103b5cda53f7da54d489fc4ac08b6ab358a5a04aa9daa16219d50bd672a7cb804ed769d218807544e5993f1c27427104b349906a0b654df0bf69328afd3013fbe430155339c39f236df5557bf92f1ded7ff609a8502f49064ec3d1dbfb6c15d3a4c11a4f8acd12278cbf68acd5709463d12e3338a6eddb8c112f199645e23154a8e60879d2a654e3ed9296aa28f134168619691cd2c6b9e2eba4438381676173fc63c2588a3c5910dc149cf3760f0aa9fa9c3f5faa9162b0bf1aac9dd32b706a60ef53cbdb394b6b40222b5bc80eea82ba8958386672564cae3794f977871ab62337cf02e30049201ec12937e7ce79d0f55d9c810e20acf52212aca1d3888949e0e4830aad88d804161230eb89d4d329cc83570fe257217d2119134048dd2ed167646975fc7d77136919a049ea74cf08ddd2b896890bb24a0ba18094a22baa351bf29ad96c66bbb1a598f2ca391749620e62d61c3561a7d3653ccc8892c7b99baaf76bf836e2991cb06d6bc0514568ff0d1ec8bb4b3d6984f5eaefb17d3ea2893722375d3ddb8e389a8eef7d7d198f8e687d6a513983df906099f9a2d23f4f9dec6f8ef2f11fc0a21fac45353b94e00486f5e17d386af42502d09db33cf0cf28310e049c07e88682aeeb00cb833c5174266e62407a57583f1f88b304b7c6e0c84bbe1c0fd423072d37a5bd0aacf764229e5c7cd02473460ba3645cd8e8ae144065bf02d0dd238593d8e230354f67e0b2f23012c23274f80e3ee31e35e2606a4a3f31d94ab755e6d163cff52cbb36b6d0cc67ffc512aeed1dce4d7a0d70ce82f2baba12e8d514dc92a056f994adfb17b5b9712bd5186f27a2fda1f7039c5df2c8587fdc62f5627580c13234b55be4df3056050e2d1ef3218f0dd66cb05265fe1acfb0989d8213f2c19d1735a7cf3fa65d88dad5af52dc2bba22b7abf46c3bc77b5091baab9e8f0ddc4d5e581037de91a9f8dcbc69309be29cc815cf19a20a7585b8b3073edf51fc9baeb3e509b97fa4ecfd621e0fd57bd61cac1b895c03248ff12bdbc57509250df3517e8a3fe1d776836b34ab352b973d932ef708b14f7418f9eceb1d87667e61e3e758649cb083f01b133d37ab2f5afa96d6c84bcacf4efc3851ad308c1e7d9113624fce29fab460ab9d2a48d92cdb281103a5250ad44cb2ff6e67ac670c02fdafb3e0f1353953d6d7d5646ca1568dea55275a050ec501b7c6250444f7219f1ba7521ba3b93d089727ca5f3bbe0d6c1300b423377004954c5628fdb65770b18ced5c9b23a4a5a6d6ef25fe01b4ce278de0bcc4ed86e28a0a68818ffa40970128cf2c38740e80037984428c1bd5113f40ff47512ee6f4e4d8f9b8e8e1b3040d2928d003bd1c1329dc885302fbce9fa81c23b4dc49c7c82d29b52957847898676c89aa5d32b5b0e1c0d5a2b79a19d67562f407f19425687971a957375879d90c5f57c857136c17106c9ab1b99d80e69c8c954ed386493368884b55c939b8d64d26f643e800c56f90c01079d7c534e3b2b7ae352cefd3016da55f6a85eb803b85e2304915fd2001f77c74e28746293c46e4f5f0fd49cf988aafd0026b8e7a3bab2da5cdce1ea26c2e29ec03f4807fac432662b2d6c060be1c7be0e5489de69d0a6e03a4b9117f9244b34a0f1ecba89884f781c6320412413a00c4980287409a2a78c2cd7e65cecebbe4ec1c28cac4dd95f6998e78fc6f1392384331c9436aa10e10e2bf8ad2c4eafbcf276aa7bae64b74428911b3269c749338b0fc5075ad", + "Expected": "d61fe4e3f32ac260915b5b03b78a86d11bfc41d973fce5b0cc59035cf8289a8a2e3878ea15fa46565b0d806e2f85b53873ea20ed653869b688adf83f3ef444535bf91598ff7e80f334fb782539b92f39f55310cc4b35349ab7b278346eda9bc37c0d8acd3557fae38197f412f8d9e57ce6a76b7205c23564cab06e5615be7c6f05c3d05ec690cba91da5e89d55b152ff8dd2157dc5458190025cf94b1ad98f7cbe64e9482faba95e6b33844afc640892872b44a9932096508f4a782a4805323808f23e54b6ff9b841dbfa87db3505ae4f687972c18ea0f0d0af89d36c1c2a5b14560c153c3fee406f5cf15cfd1c0bb45d767426d465f2f14c158495069d0c5955a00150707862ecaae30624ebacdd8ac33e4e6aab3ff90b6ba445a84689386b9e945d01823a65874444316e83767290fcff630d2477f49d5d8ffdd200e08ee1274270f86ed14c687895f6caf5ce528bd970c20d2408a9ba66216324c6a011ac4999098362dbd98a038129a2d40c8da6ab88318aa3046cb660327cc44236d9e5d2163bd0959062195c51ed93d0088b6f92051fc99050ece2538749165976233697ab4b610385366e5ce0b02ad6b61c168ecfbedcdf74278a38de340fd7a5fead8e588e294795f9b011e2e60377a89e25c90e145397cdeabc60fd32444a6b7642a611a83c464d8b8976666351b4865c37b02e6dc21dbcdf5f930341707b618cc0f03c3122646b3385c9df9f2ec730eec9d49e7dfc9153b6e6289da8c4f0ebea9ccc1b751948e3bb7171c9e4d57423b0eeeb79095c030cb52677b3f7e0b45c30f645391f3f9c957afa549c4e0b2465b03c67993cd200b1af01035962edbc4c9e89b31c82ac121987d6529dafdeef67a132dc04b6dc68e77f22862040b75e2ceb9ff16da0fca534e6db7bd12fa7b7f51b6c08c1e23dfcdb7acbd2da0b51c87ffbced065a612e9b1c8bba9b7e2d8d7a2f04fcc4aaf355b60d764879a76b5e16762d5f2f55d585d0c8e82df6940960cddfb72c91dfa71f6b4e1c6ca25dfc39a878e998a663c04fe29d5e83b9586d047b4d7ff70a9f0d44f127e7d741685ca75f11629128d916a0ffef4be586a30c4b70389cc746e84ebf177c01ee8a4511cfbb9d1ecf7f7b33c7dd8177896e10bbc82f838dcd6db7ac67de62bf46b6a640fb580c5d1d2708f3862e3d2b645d0d18e49ef088053e3a220adc0e033c2afcfe61c90e32151152eb3caaf746c5e377d541cafc6cbb0cc0fa48b5caf1728f2e1957f5addfc234f1a9d89e40d49356c9172d0561a695fce6dab1d412321bbf407f63766ffd7b6b3d79bcfa07991c5a9709849c1008689e3b47c50d613980bec239fb64185249d055b30375ccb4354d71fe4d05648fbf6c80634dfc3575f2f24abb714c1e4c95e8896763bf4316e954c7ad19e5780ab7a040ca6fb9271f90a8b22ae738daf6cb", + "Name": "nagydani-5-square", + "Gas": 5461, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000400c5a1611f8be90071a43db23cc2fe01871cc4c0e8ab5743f6378e4fef77f7f6db0095c0727e20225beb665645403453e325ad5f9aeb9ba99bf3c148f63f9c07cf4fe8847ad5242d6b7d4499f93bd47056ddab8f7dee878fc2314f344dbee2a7c41a5d3db91eff372c730c2fdd3a141a4b61999e36d549b9870cf2f4e632c4d5df5f024f81c028000073a0ed8847cfb0593d36a47142f578f05ccbe28c0c06aeb1b1da027794c48db880278f79ba78ae64eedfea3c07d10e0562668d839749dc95f40467d15cf65b9cfc52c7c4bcef1cda3596dd52631aac942f146c7cebd46065131699ce8385b0db1874336747ee020a5698a3d1a1082665721e769567f579830f9d259cec1a836845109c21cf6b25da572512bf3c42fd4b96e43895589042ab60dd41f497db96aec102087fe784165bb45f942859268fd2ff6c012d9d00c02ba83eace047cc5f7b2c392c2955c58a49f0338d6fc58749c9db2155522ac17914ec216ad87f12e0ee95574613942fa615898c4d9e8a3be68cd6afa4e7a003dedbdf8edfee31162b174f965b20ae752ad89c967b3068b6f722c16b354456ba8e280f987c08e0a52d40a2e8f3a59b94d590aeef01879eb7a90b3ee7d772c839c85519cbeaddc0c193ec4874a463b53fcaea3271d80ebfb39b33489365fc039ae549a17a9ff898eea2f4cb27b8dbee4c17b998438575b2b8d107e4a0d66ba7fca85b41a58a8d51f191a35c856dfbe8aef2b00048a694bbccff832d23c8ca7a7ff0b6c0b3011d00b97c86c0628444d267c951d9e4fb8f83e154b8f74fb51aa16535e498235c5597dac9606ed0be3173a3836baa4e7d756ffe1e2879b415d3846bccd538c05b847785699aefde3e305decb600cd8fb0e7d8de5efc26971a6ad4e6d7a2d91474f1023a0ac4b78dc937da0ce607a45974d2cac1c33a2631ff7fe6144a3b2e5cf98b531a9627dea92c1dc82204d09db0439b6a11dd64b484e1263aa45fd9539b6020b55e3baece3986a8bffc1003406348f5c61265099ed43a766ee4f93f5f9c5abbc32a0fd3ac2b35b87f9ec26037d88275bd7dd0a54474995ee34ed3727f3f97c48db544b1980193a4b76a8a3ddab3591ce527f16d91882e67f0103b5cda53f7da54d489fc4ac08b6ab358a5a04aa9daa16219d50bd672a7cb804ed769d218807544e5993f1c27427104b349906a0b654df0bf69328afd3013fbe430155339c39f236df5557bf92f1ded7ff609a8502f49064ec3d1dbfb6c15d3a4c11a4f8acd12278cbf68acd5709463d12e3338a6eddb8c112f199645e23154a8e60879d2a654e3ed9296aa28f134168619691cd2c6b9e2eba4438381676173fc63c2588a3c5910dc149cf3760f0aa9fa9c3f5faa9162b0bf1aac9dd32b706a60ef53cbdb394b6b40222b5bc80eea82ba8958386672564cae3794f977871ab62337cf03e30049201ec12937e7ce79d0f55d9c810e20acf52212aca1d3888949e0e4830aad88d804161230eb89d4d329cc83570fe257217d2119134048dd2ed167646975fc7d77136919a049ea74cf08ddd2b896890bb24a0ba18094a22baa351bf29ad96c66bbb1a598f2ca391749620e62d61c3561a7d3653ccc8892c7b99baaf76bf836e2991cb06d6bc0514568ff0d1ec8bb4b3d6984f5eaefb17d3ea2893722375d3ddb8e389a8eef7d7d198f8e687d6a513983df906099f9a2d23f4f9dec6f8ef2f11fc0a21fac45353b94e00486f5e17d386af42502d09db33cf0cf28310e049c07e88682aeeb00cb833c5174266e62407a57583f1f88b304b7c6e0c84bbe1c0fd423072d37a5bd0aacf764229e5c7cd02473460ba3645cd8e8ae144065bf02d0dd238593d8e230354f67e0b2f23012c23274f80e3ee31e35e2606a4a3f31d94ab755e6d163cff52cbb36b6d0cc67ffc512aeed1dce4d7a0d70ce82f2baba12e8d514dc92a056f994adfb17b5b9712bd5186f27a2fda1f7039c5df2c8587fdc62f5627580c13234b55be4df3056050e2d1ef3218f0dd66cb05265fe1acfb0989d8213f2c19d1735a7cf3fa65d88dad5af52dc2bba22b7abf46c3bc77b5091baab9e8f0ddc4d5e581037de91a9f8dcbc69309be29cc815cf19a20a7585b8b3073edf51fc9baeb3e509b97fa4ecfd621e0fd57bd61cac1b895c03248ff12bdbc57509250df3517e8a3fe1d776836b34ab352b973d932ef708b14f7418f9eceb1d87667e61e3e758649cb083f01b133d37ab2f5afa96d6c84bcacf4efc3851ad308c1e7d9113624fce29fab460ab9d2a48d92cdb281103a5250ad44cb2ff6e67ac670c02fdafb3e0f1353953d6d7d5646ca1568dea55275a050ec501b7c6250444f7219f1ba7521ba3b93d089727ca5f3bbe0d6c1300b423377004954c5628fdb65770b18ced5c9b23a4a5a6d6ef25fe01b4ce278de0bcc4ed86e28a0a68818ffa40970128cf2c38740e80037984428c1bd5113f40ff47512ee6f4e4d8f9b8e8e1b3040d2928d003bd1c1329dc885302fbce9fa81c23b4dc49c7c82d29b52957847898676c89aa5d32b5b0e1c0d5a2b79a19d67562f407f19425687971a957375879d90c5f57c857136c17106c9ab1b99d80e69c8c954ed386493368884b55c939b8d64d26f643e800c56f90c01079d7c534e3b2b7ae352cefd3016da55f6a85eb803b85e2304915fd2001f77c74e28746293c46e4f5f0fd49cf988aafd0026b8e7a3bab2da5cdce1ea26c2e29ec03f4807fac432662b2d6c060be1c7be0e5489de69d0a6e03a4b9117f9244b34a0f1ecba89884f781c6320412413a00c4980287409a2a78c2cd7e65cecebbe4ec1c28cac4dd95f6998e78fc6f1392384331c9436aa10e10e2bf8ad2c4eafbcf276aa7bae64b74428911b3269c749338b0fc5075ad", + "Expected": "5f9c70ec884926a89461056ad20ac4c30155e817f807e4d3f5bb743d789c83386762435c3627773fa77da5144451f2a8aad8adba88e0b669f5377c5e9bad70e45c86fe952b613f015a9953b8a5de5eaee4566acf98d41e327d93a35bd5cef4607d025e58951167957df4ff9b1627649d3943805472e5e293d3efb687cfd1e503faafeb2840a3e3b3f85d016051a58e1c9498aab72e63b748d834b31eb05d85dcde65e27834e266b85c75cc4ec0135135e0601cb93eeeb6e0010c8ceb65c4c319623c5e573a2c8c9fbbf7df68a930beb412d3f4dfd146175484f45d7afaa0d2e60684af9b34730f7c8438465ad3e1d0c3237336722f2aa51095bd5759f4b8ab4dda111b684aa3dac62a761722e7ae43495b7709933512c81c4e3c9133a51f7ce9f2b51fcec064f65779666960b4e45df3900f54311f5613e8012dd1b8efd359eda31a778264c72aa8bb419d862734d769076bce2810011989a45374e5c5d8729fec21427f0bf397eacbb4220f603cf463a4b0c94efd858ffd9768cd60d6ce68d755e0fbad007ce5c2223d70c7018345a102e4ab3c60a13a9e7794303156d4c2063e919f2153c13961fb324c80b240742f47773a7a8e25b3e3fb19b00ce839346c6eb3c732fbc6b888df0b1fe0a3d07b053a2e9402c267b2d62f794d8a2840526e3ade15ce2264496ccd7519571dfde47f7a4bb16292241c20b2be59f3f8fb4f6383f232d838c5a22d8c95b6834d9d2ca493f5a505ebe8899503b0e8f9b19e6e2dd81c1628b80016d02097e0134de51054c4e7674824d4d758760fc52377d2cad145e259aa2ffaf54139e1a66b1e0c1c191e32ac59474c6b526f5b3ba07d3e5ec286eddf531fcd5292869be58c9f22ef91026159f7cf9d05ef66b4299f4da48cc1635bf2243051d342d378a22c83390553e873713c0454ce5f3234397111ac3fe3207b86f0ed9fc025c81903e1748103692074f83824fda6341be4f95ff00b0a9a208c267e12fa01825054cc0513629bf3dbb56dc5b90d4316f87654a8be18227978ea0a8a522760cad620d0d14fd38920fb7321314062914275a5f99f677145a6979b156bd82ecd36f23f8e1273cc2759ecc0b2c69d94dad5211d1bed939dd87ed9e07b91d49713a6e16ade0a98aea789f04994e318e4ff2c8a188cd8d43aeb52c6daa3bc29b4af50ea82a247c5cd67b573b34cbadcc0a376d3bbd530d50367b42705d870f2e27a8197ef46070528bfe408360faa2ebb8bf76e9f388572842bcb119f4d84ee34ae31f5cc594f23705a49197b181fb78ed1ec99499c690f843a4d0cf2e226d118e9372271054fbabdcc5c92ae9fefaef0589cd0e722eaf30c1703ec4289c7fd81beaa8a455ccee5298e31e2080c10c366a6fcf56f7d13582ad0bcad037c612b710fc595b70fbefaaca23623b60c6c39b11beb8e5843b6b3dac60f", + "Name": "nagydani-5-qube", + "Gas": 5461, + "NoBenchmark": false + }, + { + "Input": "000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000400c5a1611f8be90071a43db23cc2fe01871cc4c0e8ab5743f6378e4fef77f7f6db0095c0727e20225beb665645403453e325ad5f9aeb9ba99bf3c148f63f9c07cf4fe8847ad5242d6b7d4499f93bd47056ddab8f7dee878fc2314f344dbee2a7c41a5d3db91eff372c730c2fdd3a141a4b61999e36d549b9870cf2f4e632c4d5df5f024f81c028000073a0ed8847cfb0593d36a47142f578f05ccbe28c0c06aeb1b1da027794c48db880278f79ba78ae64eedfea3c07d10e0562668d839749dc95f40467d15cf65b9cfc52c7c4bcef1cda3596dd52631aac942f146c7cebd46065131699ce8385b0db1874336747ee020a5698a3d1a1082665721e769567f579830f9d259cec1a836845109c21cf6b25da572512bf3c42fd4b96e43895589042ab60dd41f497db96aec102087fe784165bb45f942859268fd2ff6c012d9d00c02ba83eace047cc5f7b2c392c2955c58a49f0338d6fc58749c9db2155522ac17914ec216ad87f12e0ee95574613942fa615898c4d9e8a3be68cd6afa4e7a003dedbdf8edfee31162b174f965b20ae752ad89c967b3068b6f722c16b354456ba8e280f987c08e0a52d40a2e8f3a59b94d590aeef01879eb7a90b3ee7d772c839c85519cbeaddc0c193ec4874a463b53fcaea3271d80ebfb39b33489365fc039ae549a17a9ff898eea2f4cb27b8dbee4c17b998438575b2b8d107e4a0d66ba7fca85b41a58a8d51f191a35c856dfbe8aef2b00048a694bbccff832d23c8ca7a7ff0b6c0b3011d00b97c86c0628444d267c951d9e4fb8f83e154b8f74fb51aa16535e498235c5597dac9606ed0be3173a3836baa4e7d756ffe1e2879b415d3846bccd538c05b847785699aefde3e305decb600cd8fb0e7d8de5efc26971a6ad4e6d7a2d91474f1023a0ac4b78dc937da0ce607a45974d2cac1c33a2631ff7fe6144a3b2e5cf98b531a9627dea92c1dc82204d09db0439b6a11dd64b484e1263aa45fd9539b6020b55e3baece3986a8bffc1003406348f5c61265099ed43a766ee4f93f5f9c5abbc32a0fd3ac2b35b87f9ec26037d88275bd7dd0a54474995ee34ed3727f3f97c48db544b1980193a4b76a8a3ddab3591ce527f16d91882e67f0103b5cda53f7da54d489fc4ac08b6ab358a5a04aa9daa16219d50bd672a7cb804ed769d218807544e5993f1c27427104b349906a0b654df0bf69328afd3013fbe430155339c39f236df5557bf92f1ded7ff609a8502f49064ec3d1dbfb6c15d3a4c11a4f8acd12278cbf68acd5709463d12e3338a6eddb8c112f199645e23154a8e60879d2a654e3ed9296aa28f134168619691cd2c6b9e2eba4438381676173fc63c2588a3c5910dc149cf3760f0aa9fa9c3f5faa9162b0bf1aac9dd32b706a60ef53cbdb394b6b40222b5bc80eea82ba8958386672564cae3794f977871ab62337cf010001e30049201ec12937e7ce79d0f55d9c810e20acf52212aca1d3888949e0e4830aad88d804161230eb89d4d329cc83570fe257217d2119134048dd2ed167646975fc7d77136919a049ea74cf08ddd2b896890bb24a0ba18094a22baa351bf29ad96c66bbb1a598f2ca391749620e62d61c3561a7d3653ccc8892c7b99baaf76bf836e2991cb06d6bc0514568ff0d1ec8bb4b3d6984f5eaefb17d3ea2893722375d3ddb8e389a8eef7d7d198f8e687d6a513983df906099f9a2d23f4f9dec6f8ef2f11fc0a21fac45353b94e00486f5e17d386af42502d09db33cf0cf28310e049c07e88682aeeb00cb833c5174266e62407a57583f1f88b304b7c6e0c84bbe1c0fd423072d37a5bd0aacf764229e5c7cd02473460ba3645cd8e8ae144065bf02d0dd238593d8e230354f67e0b2f23012c23274f80e3ee31e35e2606a4a3f31d94ab755e6d163cff52cbb36b6d0cc67ffc512aeed1dce4d7a0d70ce82f2baba12e8d514dc92a056f994adfb17b5b9712bd5186f27a2fda1f7039c5df2c8587fdc62f5627580c13234b55be4df3056050e2d1ef3218f0dd66cb05265fe1acfb0989d8213f2c19d1735a7cf3fa65d88dad5af52dc2bba22b7abf46c3bc77b5091baab9e8f0ddc4d5e581037de91a9f8dcbc69309be29cc815cf19a20a7585b8b3073edf51fc9baeb3e509b97fa4ecfd621e0fd57bd61cac1b895c03248ff12bdbc57509250df3517e8a3fe1d776836b34ab352b973d932ef708b14f7418f9eceb1d87667e61e3e758649cb083f01b133d37ab2f5afa96d6c84bcacf4efc3851ad308c1e7d9113624fce29fab460ab9d2a48d92cdb281103a5250ad44cb2ff6e67ac670c02fdafb3e0f1353953d6d7d5646ca1568dea55275a050ec501b7c6250444f7219f1ba7521ba3b93d089727ca5f3bbe0d6c1300b423377004954c5628fdb65770b18ced5c9b23a4a5a6d6ef25fe01b4ce278de0bcc4ed86e28a0a68818ffa40970128cf2c38740e80037984428c1bd5113f40ff47512ee6f4e4d8f9b8e8e1b3040d2928d003bd1c1329dc885302fbce9fa81c23b4dc49c7c82d29b52957847898676c89aa5d32b5b0e1c0d5a2b79a19d67562f407f19425687971a957375879d90c5f57c857136c17106c9ab1b99d80e69c8c954ed386493368884b55c939b8d64d26f643e800c56f90c01079d7c534e3b2b7ae352cefd3016da55f6a85eb803b85e2304915fd2001f77c74e28746293c46e4f5f0fd49cf988aafd0026b8e7a3bab2da5cdce1ea26c2e29ec03f4807fac432662b2d6c060be1c7be0e5489de69d0a6e03a4b9117f9244b34a0f1ecba89884f781c6320412413a00c4980287409a2a78c2cd7e65cecebbe4ec1c28cac4dd95f6998e78fc6f1392384331c9436aa10e10e2bf8ad2c4eafbcf276aa7bae64b74428911b3269c749338b0fc5075ad", + "Expected": "5a0eb2bdf0ac1cae8e586689fa16cd4b07dfdedaec8a110ea1fdb059dd5253231b6132987598dfc6e11f86780428982d50cf68f67ae452622c3b336b537ef3298ca645e8f89ee39a26758206a5a3f6409afc709582f95274b57b71fae5c6b74619ae6f089a5393c5b79235d9caf699d23d88fb873f78379690ad8405e34c19f5257d596580c7a6a7206a3712825afe630c76b31cdb4a23e7f0632e10f14f4e282c81a66451a26f8df2a352b5b9f607a7198449d1b926e27036810368e691a74b91c61afa73d9d3b99453e7c8b50fd4f09c039a2f2feb5c419206694c31b92df1d9586140cb3417b38d0c503c7b508cc2ed12e813a1c795e9829eb39ee78eeaf360a169b491a1d4e419574e712402de9d48d54c1ae5e03739b7156615e8267e1fb0a897f067afd11fb33f6e24182d7aaaaa18fe5bc1982f20d6b871e5a398f0f6f718181d31ec225cfa9a0a70124ed9a70031bdf0c1c7829f708b6e17d50419ef361cf77d99c85f44607186c8d683106b8bd38a49b5d0fb503b397a83388c5678dcfcc737499d84512690701ed621a6f0172aecf037184ddf0f2453e4053024018e5ab2e30d6d5363b56e8b41509317c99042f517247474ab3abc848e00a07f69c254f46f2a05cf6ed84e5cc906a518fdcfdf2c61ce731f24c5264f1a25fc04934dc28aec112134dd523f70115074ca34e3807aa4cb925147f3a0ce152d323bd8c675ace446d0fd1ae30c4b57f0eb2c23884bc18f0964c0114796c5b6d080c3d89175665fbf63a6381a6a9da39ad070b645c8bb1779506da14439a9f5b5d481954764ea114fac688930bc68534d403cff4210673b6a6ff7ae416b7cd41404c3d3f282fcd193b86d0f54d0006c2a503b40d5c3930da980565b8f9630e9493a79d1c03e74e5f93ac8e4dc1a901ec5e3b3e57049124c7b72ea345aa359e782285d9e6a5c144a378111dd02c40855ff9c2be9b48425cb0b2fd62dc8678fd151121cf26a65e917d65d8e0dacfae108eb5508b601fb8ffa370be1f9a8b749a2d12eeab81f41079de87e2d777994fa4d28188c579ad327f9957fb7bdecec5c680844dd43cb57cf87aeb763c003e65011f73f8c63442df39a92b946a6bd968a1c1e4d5fa7d88476a68bd8e20e5b70a99259c7d3f85fb1b65cd2e93972e6264e74ebf289b8b6979b9b68a85cd5b360c1987f87235c3c845d62489e33acf85d53fa3561fe3a3aee18924588d9c6eba4edb7a4d106b31173e42929f6f0c48c80ce6a72d54eca7c0fe870068b7a7c89c63cdda593f5b32d3cb4ea8a32c39f00ab449155757172d66763ed9527019d6de6c9f2416aa6203f4d11c9ebee1e1d3845099e55504446448027212616167eb36035726daa7698b075286f5379cd3e93cb3e0cf4f9cb8d017facbb5550ed32d5ec5400ae57e47e2bf78d1eaeff9480cc765ceff39db500", + "Name": "nagydani-5-pow0x10001", + "Gas": 87381, + "NoBenchmark": false + } +] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/testcases_add.json b/x/evm/core/vm/testdata/testcases_add.json new file mode 100644 index 0000000000..c03ae96ada --- /dev/null +++ b/x/evm/core/vm/testdata/testcases_add.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000006"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000002"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000006"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"000000000000000000000000000000000000000000000000000000000000000a"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"8000000000000000000000000000000000000000000000000000000000000003"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000004"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000006"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000004"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000003"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000004"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000002"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000006"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000004"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"}] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/testcases_and.json b/x/evm/core/vm/testdata/testcases_and.json new file mode 100644 index 0000000000..aba5f2463c --- /dev/null +++ b/x/evm/core/vm/testdata/testcases_and.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000004"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000004"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/testcases_byte.json b/x/evm/core/vm/testdata/testcases_byte.json new file mode 100644 index 0000000000..88d7c7d807 --- /dev/null +++ b/x/evm/core/vm/testdata/testcases_byte.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"000000000000000000000000000000000000000000000000000000000000007f"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"00000000000000000000000000000000000000000000000000000000000000ff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"00000000000000000000000000000000000000000000000000000000000000ff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"000000000000000000000000000000000000000000000000000000000000007f"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"00000000000000000000000000000000000000000000000000000000000000ff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"00000000000000000000000000000000000000000000000000000000000000ff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000080"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000080"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"00000000000000000000000000000000000000000000000000000000000000ff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"00000000000000000000000000000000000000000000000000000000000000ff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"00000000000000000000000000000000000000000000000000000000000000ff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"00000000000000000000000000000000000000000000000000000000000000ff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"00000000000000000000000000000000000000000000000000000000000000ff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"00000000000000000000000000000000000000000000000000000000000000ff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"}] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/testcases_div.json b/x/evm/core/vm/testdata/testcases_div.json new file mode 100644 index 0000000000..b1f9c7fbac --- /dev/null +++ b/x/evm/core/vm/testdata/testcases_div.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"1999999999999999999999999999999999999999999999999999999999999999"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"1999999999999999999999999999999999999999999999999999999999999999"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"1999999999999999999999999999999999999999999999999999999999999999"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"1999999999999999999999999999999999999999999999999999999999999999"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"3333333333333333333333333333333333333333333333333333333333333332"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"3333333333333333333333333333333333333333333333333333333333333333"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"}] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/testcases_eq.json b/x/evm/core/vm/testdata/testcases_eq.json new file mode 100644 index 0000000000..937eadb024 --- /dev/null +++ b/x/evm/core/vm/testdata/testcases_eq.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"}] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/testcases_exp.json b/x/evm/core/vm/testdata/testcases_exp.json new file mode 100644 index 0000000000..61818357f8 --- /dev/null +++ b/x/evm/core/vm/testdata/testcases_exp.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000c35"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3cb"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c29"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c29"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"3333333333333333333333333333333333333333333333333333333333333333"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"58cd20afa2f05a708ede54b48d3ae685db76b3bb83cf2cf95d4e8fb00bcbe61d"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"a732df505d0fa58f7121ab4b72c5197a24894c447c30d306a2b1704ff43419e3"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"3333333333333333333333333333333333333333333333333333333333333333"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/testcases_gt.json b/x/evm/core/vm/testdata/testcases_gt.json new file mode 100644 index 0000000000..637bd3f6e6 --- /dev/null +++ b/x/evm/core/vm/testdata/testcases_gt.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"}] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/testcases_lt.json b/x/evm/core/vm/testdata/testcases_lt.json new file mode 100644 index 0000000000..55252a4de2 --- /dev/null +++ b/x/evm/core/vm/testdata/testcases_lt.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"}] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/testcases_mod.json b/x/evm/core/vm/testdata/testcases_mod.json new file mode 100644 index 0000000000..192503f26f --- /dev/null +++ b/x/evm/core/vm/testdata/testcases_mod.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000003"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000004"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000003"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000003"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000004"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"}] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/testcases_mul.json b/x/evm/core/vm/testdata/testcases_mul.json new file mode 100644 index 0000000000..dc44c253f6 --- /dev/null +++ b/x/evm/core/vm/testdata/testcases_mul.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000019"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000004"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000002"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"800000000000000000000000000000000000000000000000000000000000000a"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000002"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"8000000000000000000000000000000000000000000000000000000000000002"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"800000000000000000000000000000000000000000000000000000000000000a"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000019"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"8000000000000000000000000000000000000000000000000000000000000002"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"}] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/testcases_or.json b/x/evm/core/vm/testdata/testcases_or.json new file mode 100644 index 0000000000..bfa561b585 --- /dev/null +++ b/x/evm/core/vm/testdata/testcases_or.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/testcases_sar.json b/x/evm/core/vm/testdata/testcases_sar.json new file mode 100644 index 0000000000..c93abbd654 --- /dev/null +++ b/x/evm/core/vm/testdata/testcases_sar.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"c000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"fc00000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"c000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"fc00000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/testcases_sdiv.json b/x/evm/core/vm/testdata/testcases_sdiv.json new file mode 100644 index 0000000000..18cb666ab5 --- /dev/null +++ b/x/evm/core/vm/testdata/testcases_sdiv.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"1999999999999999999999999999999999999999999999999999999999999999"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"1999999999999999999999999999999999999999999999999999999999999999"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"e666666666666666666666666666666666666666666666666666666666666667"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"e666666666666666666666666666666666666666666666666666666666666667"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"e666666666666666666666666666666666666666666666666666666666666667"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"e666666666666666666666666666666666666666666666666666666666666667"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"1999999999999999999999999999999999999999999999999999999999999999"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"1999999999999999999999999999999999999999999999999999999999999999"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"8000000000000000000000000000000000000000000000000000000000000002"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"}] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/testcases_sgt.json b/x/evm/core/vm/testdata/testcases_sgt.json new file mode 100644 index 0000000000..aa581a6549 --- /dev/null +++ b/x/evm/core/vm/testdata/testcases_sgt.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"}] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/testcases_shl.json b/x/evm/core/vm/testdata/testcases_shl.json new file mode 100644 index 0000000000..65e9c07b77 --- /dev/null +++ b/x/evm/core/vm/testdata/testcases_shl.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000020"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"000000000000000000000000000000000000000000000000000000000000000a"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"00000000000000000000000000000000000000000000000000000000000000a0"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000020"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"}] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/testcases_shr.json b/x/evm/core/vm/testdata/testcases_shr.json new file mode 100644 index 0000000000..a38491350d --- /dev/null +++ b/x/evm/core/vm/testdata/testcases_shr.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"4000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0400000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"4000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0400000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"}] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/testcases_signext.json b/x/evm/core/vm/testdata/testcases_signext.json new file mode 100644 index 0000000000..bdadd400e7 --- /dev/null +++ b/x/evm/core/vm/testdata/testcases_signext.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/testcases_slt.json b/x/evm/core/vm/testdata/testcases_slt.json new file mode 100644 index 0000000000..4369b96fd8 --- /dev/null +++ b/x/evm/core/vm/testdata/testcases_slt.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"}] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/testcases_smod.json b/x/evm/core/vm/testdata/testcases_smod.json new file mode 100644 index 0000000000..980e0341a7 --- /dev/null +++ b/x/evm/core/vm/testdata/testcases_smod.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"}] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/testcases_sub.json b/x/evm/core/vm/testdata/testcases_sub.json new file mode 100644 index 0000000000..b3881a5ab6 --- /dev/null +++ b/x/evm/core/vm/testdata/testcases_sub.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000004"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000002"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000003"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000007"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000003"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000002"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000006"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000004"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000006"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"000000000000000000000000000000000000000000000000000000000000000a"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"8000000000000000000000000000000000000000000000000000000000000003"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000004"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000006"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000004"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000006"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000002"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"}] \ No newline at end of file diff --git a/x/evm/core/vm/testdata/testcases_xor.json b/x/evm/core/vm/testdata/testcases_xor.json new file mode 100644 index 0000000000..4cc2dddd7d --- /dev/null +++ b/x/evm/core/vm/testdata/testcases_xor.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000004"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000004"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000004"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"8000000000000000000000000000000000000000000000000000000000000004"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000004"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000004"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000004"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000004"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"}] \ No newline at end of file diff --git a/x/evm/keeper/config.go b/x/evm/keeper/config.go index 3cc18ed6e0..b7a059e35e 100644 --- a/x/evm/keeper/config.go +++ b/x/evm/keeper/config.go @@ -9,7 +9,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/vm" + "github.com/evmos/evmos/v18/x/evm/core/vm" "github.com/evmos/evmos/v18/x/evm/statedb" "github.com/evmos/evmos/v18/x/evm/types" ) diff --git a/x/evm/keeper/grpc_query.go b/x/evm/keeper/grpc_query.go index 4508c27f98..fdafd5988f 100644 --- a/x/evm/keeper/grpc_query.go +++ b/x/evm/keeper/grpc_query.go @@ -10,8 +10,8 @@ import ( "math/big" "time" - "github.com/ethereum/go-ethereum/eth/tracers" - "github.com/ethereum/go-ethereum/eth/tracers/logger" + "github.com/evmos/evmos/v18/x/evm/core/logger" + "github.com/evmos/evmos/v18/x/evm/core/tracers" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -24,8 +24,8 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" ethparams "github.com/ethereum/go-ethereum/params" + "github.com/evmos/evmos/v18/x/evm/core/vm" evmostypes "github.com/evmos/evmos/v18/types" evmante "github.com/evmos/evmos/v18/x/evm/ante" diff --git a/x/evm/keeper/grpc_query_test.go b/x/evm/keeper/grpc_query_test.go index fadd6cc7ef..4ccfb25de6 100644 --- a/x/evm/keeper/grpc_query_test.go +++ b/x/evm/keeper/grpc_query_test.go @@ -12,10 +12,10 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" - ethlogger "github.com/ethereum/go-ethereum/eth/tracers/logger" ethparams "github.com/ethereum/go-ethereum/params" + ethlogger "github.com/evmos/evmos/v18/x/evm/core/logger" + "github.com/evmos/evmos/v18/x/evm/core/vm" "github.com/evmos/evmos/v18/server/config" utiltx "github.com/evmos/evmos/v18/testutil/tx" diff --git a/x/evm/keeper/keeper.go b/x/evm/keeper/keeper.go index 77f2dd78b1..713d9469ce 100644 --- a/x/evm/keeper/keeper.go +++ b/x/evm/keeper/keeper.go @@ -16,8 +16,8 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/params" + "github.com/evmos/evmos/v18/x/evm/core/vm" evmostypes "github.com/evmos/evmos/v18/types" "github.com/evmos/evmos/v18/x/evm/statedb" diff --git a/x/evm/keeper/precompiles.go b/x/evm/keeper/precompiles.go index e96ffba1c5..b6897b90fe 100644 --- a/x/evm/keeper/precompiles.go +++ b/x/evm/keeper/precompiles.go @@ -12,7 +12,7 @@ import ( "github.com/evmos/evmos/v18/precompiles/bech32" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" + "github.com/evmos/evmos/v18/x/evm/core/vm" sdk "github.com/cosmos/cosmos-sdk/types" authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" diff --git a/x/evm/keeper/precompiles_test.go b/x/evm/keeper/precompiles_test.go index f70fbf7d45..3e5414cddb 100644 --- a/x/evm/keeper/precompiles_test.go +++ b/x/evm/keeper/precompiles_test.go @@ -5,8 +5,8 @@ package keeper_test import ( "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" stakingprecompile "github.com/evmos/evmos/v18/precompiles/staking" + "github.com/evmos/evmos/v18/x/evm/core/vm" "github.com/evmos/evmos/v18/x/evm/types" ) diff --git a/x/evm/keeper/state_transition.go b/x/evm/keeper/state_transition.go index 5f8db539e9..414d184aa2 100644 --- a/x/evm/keeper/state_transition.go +++ b/x/evm/keeper/state_transition.go @@ -19,8 +19,9 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/params" + evmoscore "github.com/evmos/evmos/v18/x/evm/core/core" + "github.com/evmos/evmos/v18/x/evm/core/vm" ) // NewEVM generates a go-ethereum VM from the provided Message fields and the chain parameters @@ -40,8 +41,8 @@ func (k *Keeper) NewEVM( stateDB vm.StateDB, ) *vm.EVM { blockCtx := vm.BlockContext{ - CanTransfer: core.CanTransfer, - Transfer: core.Transfer, + CanTransfer: evmoscore.CanTransfer, + Transfer: evmoscore.Transfer, GetHash: k.GetHashFn(ctx), Coinbase: cfg.CoinBase, GasLimit: evmostypes.BlockGasLimit(ctx), @@ -52,7 +53,7 @@ func (k *Keeper) NewEVM( Random: nil, // not supported } - txCtx := core.NewEVMTxContext(msg) + txCtx := evmoscore.NewEVMTxContext(msg) if tracer == nil { tracer = k.Tracer(ctx, msg, cfg.ChainConfig) } diff --git a/x/evm/keeper/statedb_test.go b/x/evm/keeper/statedb_test.go index a3e0a42470..4df6be9ef7 100644 --- a/x/evm/keeper/statedb_test.go +++ b/x/evm/keeper/statedb_test.go @@ -15,7 +15,6 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" "github.com/evmos/evmos/v18/contracts" testfactory "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" @@ -23,6 +22,7 @@ import ( testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" testnetwork "github.com/evmos/evmos/v18/testutil/integration/evmos/network" utiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/x/evm/core/vm" "github.com/evmos/evmos/v18/x/evm/statedb" "github.com/evmos/evmos/v18/x/evm/types" "github.com/stretchr/testify/require" diff --git a/x/evm/statedb/interfaces.go b/x/evm/statedb/interfaces.go index 633591b42c..1f54a1de9b 100644 --- a/x/evm/statedb/interfaces.go +++ b/x/evm/statedb/interfaces.go @@ -5,7 +5,7 @@ package statedb import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" + "github.com/evmos/evmos/v18/x/evm/core/vm" ) // ExtStateDB defines an extension to the interface provided by the go-ethereum diff --git a/x/evm/statedb/statedb.go b/x/evm/statedb/statedb.go index a5a9fd0792..83d0d2b79c 100644 --- a/x/evm/statedb/statedb.go +++ b/x/evm/statedb/statedb.go @@ -12,8 +12,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" + "github.com/evmos/evmos/v18/x/evm/core/vm" "github.com/evmos/evmos/v18/x/evm/types" ) diff --git a/x/evm/statedb/statedb_test.go b/x/evm/statedb/statedb_test.go index 5fa5abac63..2c02caf30d 100644 --- a/x/evm/statedb/statedb_test.go +++ b/x/evm/statedb/statedb_test.go @@ -7,8 +7,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" + "github.com/evmos/evmos/v18/x/evm/core/vm" "github.com/evmos/evmos/v18/x/evm/statedb" "github.com/stretchr/testify/suite" ) diff --git a/x/evm/types/opcodes_hooks.go b/x/evm/types/opcodes_hooks.go index 3f89a5ef0c..98a3df8d76 100644 --- a/x/evm/types/opcodes_hooks.go +++ b/x/evm/types/opcodes_hooks.go @@ -5,7 +5,7 @@ package types import ( "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" + "github.com/evmos/evmos/v18/x/evm/core/vm" ) // OpCodeHooks extends the geth OpCodeHooks interface to add custom hooks for EVM operations. diff --git a/x/evm/types/params.go b/x/evm/types/params.go index e406e8f7b9..ed13533a99 100644 --- a/x/evm/types/params.go +++ b/x/evm/types/params.go @@ -15,11 +15,11 @@ import ( host "github.com/cosmos/ibc-go/v7/modules/core/24-host" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/params" "github.com/evmos/evmos/v18/precompiles/p256" "github.com/evmos/evmos/v18/types" "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v18/x/evm/core/vm" ) var ( @@ -290,7 +290,7 @@ func validateEIPs(i interface{}) error { uniqueEIPs := make(map[int64]struct{}) for _, eip := range eips { - if !vm.ValidEip(int(eip)) { + if !vm.ExistsEipActivator(int(eip)) { return fmt.Errorf("EIP %d is not activateable, valid EIPs are: %s", eip, vm.ActivateableEips()) } diff --git a/x/evm/types/params_test.go b/x/evm/types/params_test.go index 67b6edbc16..ff3431b0a0 100644 --- a/x/evm/types/params_test.go +++ b/x/evm/types/params_test.go @@ -44,9 +44,9 @@ func TestParamsValidate(t *testing.T) { name: "invalid eip", params: Params{ EvmDenom: DefaultEVMDenom, - ExtraEIPs: []int64{1}, + ExtraEIPs: []int64{10000}, }, - errContains: "EIP 1 is not activateable, valid EIPs are", + errContains: "EIP 10000 is not activateable, valid EIPs are", }, { name: "unsorted precompiles", diff --git a/x/evm/types/permissions.go b/x/evm/types/permissions.go index d51e209591..76c3b9accf 100644 --- a/x/evm/types/permissions.go +++ b/x/evm/types/permissions.go @@ -8,7 +8,7 @@ import ( "slices" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" + "github.com/evmos/evmos/v18/x/evm/core/vm" ) // PermissionPolicy is the interface that defines the permission policy for contract creation and calls. diff --git a/x/evm/types/query.pb.gw.go b/x/evm/types/query.pb.gw.go index a7ba3846af..c93ebed7ed 100644 --- a/x/evm/types/query.pb.gw.go +++ b/x/evm/types/query.pb.gw.go @@ -25,13 +25,15 @@ import ( ) // Suppress "imported and not used" errors -var _ codes.Code -var _ io.Reader -var _ status.Status -var _ = runtime.String -var _ = utilities.NewDoubleArray -var _ = descriptor.ForMessage -var _ = metadata.Join +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = runtime.String + _ = utilities.NewDoubleArray + _ = descriptor.ForMessage + _ = metadata.Join +) func request_Query_Account_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryAccountRequest @@ -50,14 +52,12 @@ func request_Query_Account_0(ctx context.Context, marshaler runtime.Marshaler, c } protoReq.Address, err = runtime.String(val) - if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) } msg, err := client.Account(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Query_Account_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -77,14 +77,12 @@ func local_request_Query_Account_0(ctx context.Context, marshaler runtime.Marsha } protoReq.Address, err = runtime.String(val) - if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) } msg, err := server.Account(ctx, &protoReq) return msg, metadata, err - } func request_Query_CosmosAccount_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -104,14 +102,12 @@ func request_Query_CosmosAccount_0(ctx context.Context, marshaler runtime.Marsha } protoReq.Address, err = runtime.String(val) - if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) } msg, err := client.CosmosAccount(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Query_CosmosAccount_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -131,14 +127,12 @@ func local_request_Query_CosmosAccount_0(ctx context.Context, marshaler runtime. } protoReq.Address, err = runtime.String(val) - if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) } msg, err := server.CosmosAccount(ctx, &protoReq) return msg, metadata, err - } func request_Query_ValidatorAccount_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -158,14 +152,12 @@ func request_Query_ValidatorAccount_0(ctx context.Context, marshaler runtime.Mar } protoReq.ConsAddress, err = runtime.String(val) - if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "cons_address", err) } msg, err := client.ValidatorAccount(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Query_ValidatorAccount_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -185,14 +177,12 @@ func local_request_Query_ValidatorAccount_0(ctx context.Context, marshaler runti } protoReq.ConsAddress, err = runtime.String(val) - if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "cons_address", err) } msg, err := server.ValidatorAccount(ctx, &protoReq) return msg, metadata, err - } func request_Query_Balance_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -212,14 +202,12 @@ func request_Query_Balance_0(ctx context.Context, marshaler runtime.Marshaler, c } protoReq.Address, err = runtime.String(val) - if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) } msg, err := client.Balance(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Query_Balance_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -239,14 +227,12 @@ func local_request_Query_Balance_0(ctx context.Context, marshaler runtime.Marsha } protoReq.Address, err = runtime.String(val) - if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) } msg, err := server.Balance(ctx, &protoReq) return msg, metadata, err - } func request_Query_Storage_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -266,7 +252,6 @@ func request_Query_Storage_0(ctx context.Context, marshaler runtime.Marshaler, c } protoReq.Address, err = runtime.String(val) - if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) } @@ -277,14 +262,12 @@ func request_Query_Storage_0(ctx context.Context, marshaler runtime.Marshaler, c } protoReq.Key, err = runtime.String(val) - if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "key", err) } msg, err := client.Storage(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Query_Storage_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -304,7 +287,6 @@ func local_request_Query_Storage_0(ctx context.Context, marshaler runtime.Marsha } protoReq.Address, err = runtime.String(val) - if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) } @@ -315,14 +297,12 @@ func local_request_Query_Storage_0(ctx context.Context, marshaler runtime.Marsha } protoReq.Key, err = runtime.String(val) - if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "key", err) } msg, err := server.Storage(ctx, &protoReq) return msg, metadata, err - } func request_Query_Code_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -342,14 +322,12 @@ func request_Query_Code_0(ctx context.Context, marshaler runtime.Marshaler, clie } protoReq.Address, err = runtime.String(val) - if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) } msg, err := client.Code(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Query_Code_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -369,14 +347,12 @@ func local_request_Query_Code_0(ctx context.Context, marshaler runtime.Marshaler } protoReq.Address, err = runtime.String(val) - if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) } msg, err := server.Code(ctx, &protoReq) return msg, metadata, err - } func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -385,7 +361,6 @@ func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, cl msg, err := client.Params(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -394,12 +369,9 @@ func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshal msg, err := server.Params(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Query_EthCall_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_Query_EthCall_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_Query_EthCall_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq EthCallRequest @@ -414,7 +386,6 @@ func request_Query_EthCall_0(ctx context.Context, marshaler runtime.Marshaler, c msg, err := client.EthCall(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Query_EthCall_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -430,12 +401,9 @@ func local_request_Query_EthCall_0(ctx context.Context, marshaler runtime.Marsha msg, err := server.EthCall(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Query_EstimateGas_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_Query_EstimateGas_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_Query_EstimateGas_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq EthCallRequest @@ -450,7 +418,6 @@ func request_Query_EstimateGas_0(ctx context.Context, marshaler runtime.Marshale msg, err := client.EstimateGas(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Query_EstimateGas_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -466,12 +433,9 @@ func local_request_Query_EstimateGas_0(ctx context.Context, marshaler runtime.Ma msg, err := server.EstimateGas(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Query_TraceTx_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_Query_TraceTx_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_Query_TraceTx_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryTraceTxRequest @@ -486,7 +450,6 @@ func request_Query_TraceTx_0(ctx context.Context, marshaler runtime.Marshaler, c msg, err := client.TraceTx(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Query_TraceTx_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -502,12 +465,9 @@ func local_request_Query_TraceTx_0(ctx context.Context, marshaler runtime.Marsha msg, err := server.TraceTx(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Query_TraceBlock_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_Query_TraceBlock_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_Query_TraceBlock_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryTraceBlockRequest @@ -522,7 +482,6 @@ func request_Query_TraceBlock_0(ctx context.Context, marshaler runtime.Marshaler msg, err := client.TraceBlock(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Query_TraceBlock_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -538,7 +497,6 @@ func local_request_Query_TraceBlock_0(ctx context.Context, marshaler runtime.Mar msg, err := server.TraceBlock(ctx, &protoReq) return msg, metadata, err - } func request_Query_BaseFee_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -547,7 +505,6 @@ func request_Query_BaseFee_0(ctx context.Context, marshaler runtime.Marshaler, c msg, err := client.BaseFee(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Query_BaseFee_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -556,7 +513,6 @@ func local_request_Query_BaseFee_0(ctx context.Context, marshaler runtime.Marsha msg, err := server.BaseFee(ctx, &protoReq) return msg, metadata, err - } // RegisterQueryHandlerServer registers the http handlers for service Query to "mux". @@ -564,7 +520,6 @@ func local_request_Query_BaseFee_0(ctx context.Context, marshaler runtime.Marsha // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { - mux.Handle("GET", pattern_Query_Account_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -585,7 +540,6 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv } forward_Query_Account_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) mux.Handle("GET", pattern_Query_CosmosAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -608,7 +562,6 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv } forward_Query_CosmosAccount_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) mux.Handle("GET", pattern_Query_ValidatorAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -631,7 +584,6 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv } forward_Query_ValidatorAccount_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) mux.Handle("GET", pattern_Query_Balance_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -654,7 +606,6 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv } forward_Query_Balance_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) mux.Handle("GET", pattern_Query_Storage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -677,7 +628,6 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv } forward_Query_Storage_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) mux.Handle("GET", pattern_Query_Code_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -700,7 +650,6 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv } forward_Query_Code_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -723,7 +672,6 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv } forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) mux.Handle("GET", pattern_Query_EthCall_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -746,7 +694,6 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv } forward_Query_EthCall_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) mux.Handle("GET", pattern_Query_EstimateGas_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -769,7 +716,6 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv } forward_Query_EstimateGas_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) mux.Handle("GET", pattern_Query_TraceTx_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -792,7 +738,6 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv } forward_Query_TraceTx_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) mux.Handle("GET", pattern_Query_TraceBlock_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -815,7 +760,6 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv } forward_Query_TraceBlock_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) mux.Handle("GET", pattern_Query_BaseFee_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -838,7 +782,6 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv } forward_Query_BaseFee_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) return nil @@ -881,7 +824,6 @@ func RegisterQueryHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc // doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in // "QueryClient" to call the correct interceptors. func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, client QueryClient) error { - mux.Handle("GET", pattern_Query_Account_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -899,7 +841,6 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } forward_Query_Account_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) mux.Handle("GET", pattern_Query_CosmosAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -919,7 +860,6 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } forward_Query_CosmosAccount_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) mux.Handle("GET", pattern_Query_ValidatorAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -939,7 +879,6 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } forward_Query_ValidatorAccount_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) mux.Handle("GET", pattern_Query_Balance_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -959,7 +898,6 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } forward_Query_Balance_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) mux.Handle("GET", pattern_Query_Storage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -979,7 +917,6 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } forward_Query_Storage_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) mux.Handle("GET", pattern_Query_Code_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -999,7 +936,6 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } forward_Query_Code_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -1019,7 +955,6 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) mux.Handle("GET", pattern_Query_EthCall_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -1039,7 +974,6 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } forward_Query_EthCall_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) mux.Handle("GET", pattern_Query_EstimateGas_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -1059,7 +993,6 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } forward_Query_EstimateGas_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) mux.Handle("GET", pattern_Query_TraceTx_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -1079,7 +1012,6 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } forward_Query_TraceTx_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) mux.Handle("GET", pattern_Query_TraceBlock_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -1099,7 +1031,6 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } forward_Query_TraceBlock_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) mux.Handle("GET", pattern_Query_BaseFee_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -1119,7 +1050,6 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } forward_Query_BaseFee_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) return nil diff --git a/x/evm/types/tracer.go b/x/evm/types/tracer.go index 06ba137563..e2a10d0193 100644 --- a/x/evm/types/tracer.go +++ b/x/evm/types/tracer.go @@ -9,9 +9,9 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/eth/tracers/logger" "github.com/ethereum/go-ethereum/params" + "github.com/evmos/evmos/v18/x/evm/core/logger" + "github.com/evmos/evmos/v18/x/evm/core/vm" ) const ( diff --git a/x/evm/types/tx.go b/x/evm/types/tx.go index df1a1e39b3..6043a63bbf 100644 --- a/x/evm/types/tx.go +++ b/x/evm/types/tx.go @@ -9,7 +9,7 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" + "github.com/evmos/evmos/v18/x/evm/core/vm" ) // EvmTxArgs encapsulates all possible params to create all EVM txs types. From c12a07759ea7f7730245d2c29a2312d4cfba6269 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Jul 2024 16:23:52 +0000 Subject: [PATCH 321/345] build(deps): bump golang.org/x/net from 0.26.0 to 0.27.0 (#2660) * build(deps): bump golang.org/x/net from 0.26.0 to 0.27.0 Bumps [golang.org/x/net](https://github.com/golang/net) from 0.26.0 to 0.27.0. - [Commits](https://github.com/golang/net/compare/v0.26.0...v0.27.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * update gomod2nix.toml file --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] Co-authored-by: Vladislav Varadinov --- go.mod | 8 ++++---- go.sum | 16 ++++++++-------- gomod2nix.toml | 16 ++++++++-------- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/go.mod b/go.mod index 358be5113d..b09e803157 100644 --- a/go.mod +++ b/go.mod @@ -45,8 +45,8 @@ require ( github.com/tyler-smith/go-bip39 v1.1.0 github.com/zondax/hid v0.9.2 go.opencensus.io v0.24.0 - golang.org/x/crypto v0.24.0 - golang.org/x/net v0.26.0 + golang.org/x/crypto v0.25.0 + golang.org/x/net v0.27.0 golang.org/x/text v0.16.0 google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 google.golang.org/grpc v1.65.0 @@ -238,8 +238,8 @@ require ( golang.org/x/mod v0.17.0 // indirect golang.org/x/oauth2 v0.20.0 // indirect golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.21.0 // indirect - golang.org/x/term v0.21.0 // indirect + golang.org/x/sys v0.22.0 // indirect + golang.org/x/term v0.22.0 // indirect golang.org/x/time v0.5.0 // indirect golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect google.golang.org/api v0.169.0 // indirect diff --git a/go.sum b/go.sum index 2074974612..3fabc4ce33 100644 --- a/go.sum +++ b/go.sum @@ -1219,8 +1219,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= -golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= +golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30= +golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb h1:xIApU0ow1zwMa2uL1VDNeQlNVFTWMQxZUZCMDy0Q4Us= golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1311,8 +1311,8 @@ golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= -golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= +golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= +golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1456,16 +1456,16 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= -golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= +golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= -golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= +golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk= +golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/gomod2nix.toml b/gomod2nix.toml index 3be00e7966..d1b41f445d 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -670,8 +670,8 @@ schema = 3 version = "v1.10.0" hash = "sha256-GepuppwpqpOGSNKi6GtGoO01TFxUQWfKZmE0B3M/HQA=" [mod."golang.org/x/crypto"] - version = "v0.24.0" - hash = "sha256-wpxJApwSmmn9meVdpFdOU0gzeJbIXcKuFfYUUVogSss=" + version = "v0.25.0" + hash = "sha256-traLAylqoBwGIh0Z1fuEhNjbGgQBItgVjtZYdYr0zzQ=" [mod."golang.org/x/exp"] version = "v0.0.0-20230711153332-06a737ee72cb" hash = "sha256-Cbw10ZJ+jATPV232G47xZrn6ExO1FDtiT6nlMRCH7EI=" @@ -680,8 +680,8 @@ schema = 3 version = "v0.17.0" hash = "sha256-CLaPeF6uTFuRDv4oHwOQE6MCMvrzkUjWN3NuyywZjKU=" [mod."golang.org/x/net"] - version = "v0.26.0" - hash = "sha256-WfY33QERNbcIiDkH3+p2XGrAVqvWBQfc8neUt6TH6dQ=" + version = "v0.27.0" + hash = "sha256-GrlN5isYeEVrPZVAHK0MDQatttbnyfSPoWJHj0xqhjk=" [mod."golang.org/x/oauth2"] version = "v0.20.0" hash = "sha256-A/xfMmGvwqE94IZliqnzi76rAH2UwnMWcSlHQK6VnuE=" @@ -689,11 +689,11 @@ schema = 3 version = "v0.7.0" hash = "sha256-2ETllEu2GDWoOd/yMkOkLC2hWBpKzbVZ8LhjLu0d2A8=" [mod."golang.org/x/sys"] - version = "v0.21.0" - hash = "sha256-gapzPWuEqY36V6W2YhIDYR49sEvjJRd7bSuf9K1f4JY=" + version = "v0.22.0" + hash = "sha256-RbG0XaXGGlErCsl2agvUxMnrkRwdbJLmriYT1H24FwA=" [mod."golang.org/x/term"] - version = "v0.21.0" - hash = "sha256-zRm7uPBM1+TJkODYHkk/BtN3la5QAaSgslE2hSTm27Y=" + version = "v0.22.0" + hash = "sha256-tRx/y4ZIZzGAlDJ/8JW3AycC9bRXlNuRqO4V48sAEEc=" [mod."golang.org/x/text"] version = "v0.16.0" hash = "sha256-hMTO45upjEuA4sJzGplJT+La2n3oAfHccfYWZuHcH+8=" From c1a1b5a3b87a26fa2104815f4e97e1cc99aed70a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Jul 2024 10:16:37 -0300 Subject: [PATCH 322/345] build(deps): bump github.com/cometbft/cometbft from 0.37.8 to 0.37.9 (#2671) * build(deps): bump github.com/cometbft/cometbft from 0.37.8 to 0.38.10 Bumps [github.com/cometbft/cometbft](https://github.com/cometbft/cometbft) from 0.37.8 to 0.38.10. - [Release notes](https://github.com/cometbft/cometbft/releases) - [Changelog](https://github.com/cometbft/cometbft/blob/v0.38.10/CHANGELOG.md) - [Commits](https://github.com/cometbft/cometbft/compare/v0.37.8...v0.38.10) --- updated-dependencies: - dependency-name: github.com/cometbft/cometbft dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * update gomod2nix.toml file * build(deps): bump github.com/cometbft/cometbft from 0.37.8 to 0.37.9 --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] Co-authored-by: tom --- go.mod | 12 ++++-------- go.sum | 7 ++----- gomod2nix.toml | 16 ++-------------- 3 files changed, 8 insertions(+), 27 deletions(-) diff --git a/go.mod b/go.mod index b09e803157..699f7bd3f5 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/armon/go-metrics v0.4.1 github.com/btcsuite/btcd v0.24.2 github.com/btcsuite/btcd/btcutil v1.1.5 - github.com/cometbft/cometbft v0.37.8 + github.com/cometbft/cometbft v0.37.9 github.com/cometbft/cometbft-db v0.12.0 github.com/cosmos/cosmos-proto v1.0.0-beta.5 github.com/cosmos/cosmos-sdk v0.47.12 @@ -22,12 +22,14 @@ require ( github.com/crypto-org-chain/cronos/store v0.0.5-0.20240129013154-12efd9b7643f github.com/crypto-org-chain/cronos/versiondb v0.0.0-20240129013154-12efd9b7643f github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc + github.com/dop251/goja v0.0.0-20220405120441-9037c2b61cbf github.com/ethereum/go-ethereum v1.11.5 github.com/golang/protobuf v1.5.4 github.com/gorilla/mux v1.8.1 github.com/gorilla/websocket v1.5.3 github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/hashicorp/go-version v1.7.0 + github.com/holiman/uint256 v1.2.1 github.com/improbable-eng/grpc-web v0.15.0 github.com/linxGnu/grocksdb v1.9.2 github.com/onsi/ginkgo/v2 v2.19.0 @@ -46,6 +48,7 @@ require ( github.com/zondax/hid v0.9.2 go.opencensus.io v0.24.0 golang.org/x/crypto v0.25.0 + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 golang.org/x/net v0.27.0 golang.org/x/text v0.16.0 google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 @@ -109,13 +112,11 @@ require ( github.com/docker/docker v24.0.9+incompatible // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect - github.com/dop251/goja v0.0.0-20220405120441-9037c2b61cbf // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/dvsekhvalnov/jose2go v1.6.0 // indirect github.com/edsrzf/mmap-go v1.1.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff // indirect github.com/getsentry/sentry-go v0.23.0 // indirect github.com/gin-gonic/gin v1.9.1 // indirect github.com/go-kit/kit v0.12.0 // indirect @@ -158,12 +159,9 @@ require ( github.com/hashicorp/hcl v1.0.0 // indirect github.com/hdevalence/ed25519consensus v0.1.0 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect - github.com/holiman/uint256 v1.2.1 // indirect github.com/huandu/skiplist v1.2.0 // indirect - github.com/huin/goupnp v1.0.3 // indirect github.com/imdario/mergo v0.3.13 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/jackpal/go-nat-pmp v1.0.2 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/jmhodges/levigo v1.0.0 // indirect github.com/klauspost/compress v1.17.0 // indirect @@ -171,7 +169,6 @@ require ( github.com/kr/text v0.2.0 // indirect github.com/ledgerwatch/erigon-lib v0.0.0-20230210071639-db0e7ed11263 // indirect github.com/lib/pq v1.10.7 // indirect - github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/manifoldco/promptui v0.9.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect @@ -234,7 +231,6 @@ require ( go.opentelemetry.io/otel/metric v1.24.0 // indirect go.opentelemetry.io/otel/trace v1.24.0 // indirect go.uber.org/multierr v1.10.0 // indirect - golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/mod v0.17.0 // indirect golang.org/x/oauth2 v0.20.0 // indirect golang.org/x/sync v0.7.0 // indirect diff --git a/go.sum b/go.sum index 3fabc4ce33..3b571a7084 100644 --- a/go.sum +++ b/go.sum @@ -350,8 +350,8 @@ github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1: github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/coinbase/rosetta-sdk-go/types v1.0.0 h1:jpVIwLcPoOeCR6o1tU+Xv7r5bMONNbHU7MuEHboiFuA= github.com/coinbase/rosetta-sdk-go/types v1.0.0/go.mod h1:eq7W2TMRH22GTW0N0beDnN931DW0/WOI1R2sdHNHG4c= -github.com/cometbft/cometbft v0.37.8 h1:/LLlJd+XilMSGjBGWBGQ1EvLVU//9C5SADWEwvV8cRM= -github.com/cometbft/cometbft v0.37.8/go.mod h1:gFGCFXNGDci6tMLemANPGTfU+j4+oH63PjeLe0iIjJk= +github.com/cometbft/cometbft v0.37.9 h1:zsW0wfjcnV9L+D4y3FkVQFSFPSbNWJneS9p3gCsWx8o= +github.com/cometbft/cometbft v0.37.9/go.mod h1:j0Q3RqrCd+cztWCugs3obbzC4NyHGBPZZjtm/fWV00I= github.com/cometbft/cometbft-db v0.12.0 h1:v77/z0VyfSU7k682IzZeZPFZrQAKiQwkqGN0QzAjMi0= github.com/cometbft/cometbft-db v0.12.0/go.mod h1:aX2NbCrjNVd2ZajYxt1BsiFf/Z+TQ2MN0VxdicheYuw= github.com/confio/ics23/go v0.9.0 h1:cWs+wdbS2KRPZezoaaj+qBleXgUk5WOQFMP3CQFGTr4= @@ -768,7 +768,6 @@ github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXM github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/huin/goupnp v1.0.3 h1:N8No57ls+MnjlB+JPiCVSOyy/ot7MJTqlo7rn+NYSqQ= github.com/huin/goupnp v1.0.3/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= -github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= @@ -837,8 +836,6 @@ github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= -github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/linxGnu/grocksdb v1.9.2 h1:O3mzvO0wuzQ9mtlHbDrShixyVjVbmuqTjFrzlf43wZ8= diff --git a/gomod2nix.toml b/gomod2nix.toml index d1b41f445d..7855c78bba 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -129,8 +129,8 @@ schema = 3 version = "v1.0.0" hash = "sha256-z/0E0NiEGo7zxM7d94ImgUf8P0/KG6hbP9T4Vuym4p0=" [mod."github.com/cometbft/cometbft"] - version = "v0.37.8" - hash = "sha256-JSYuVQzZnhGcATyc/W7fs7pMzb/tGhu01m6dnQGzFE4=" + version = "v0.37.9" + hash = "sha256-ObClwxeLbAIeN2e8l6RatRFD5M/6lamMQeQSjTQ6Ph0=" [mod."github.com/cometbft/cometbft-db"] version = "v0.12.0" hash = "sha256-mfeUD8+V+xUzEhSOLgQQP0GFDWt7ch/TeBw9gnTJuHk=" @@ -244,9 +244,6 @@ schema = 3 [mod."github.com/fsnotify/fsnotify"] version = "v1.7.0" hash = "sha256-MdT2rQyQHspPJcx6n9ozkLbsktIOJutOqDuKpNAtoZY=" - [mod."github.com/gballet/go-libpcsclite"] - version = "v0.0.0-20190607065134-2772fd86a8ff" - hash = "sha256-Nr5ocU9s1F2Lhx/Zq6/nIo+KkKEqMjDYOEs3yWRC48g=" [mod."github.com/getsentry/sentry-go"] version = "v0.23.0" hash = "sha256-VR6IL+yIc+BV5xBGfPJ7ixsAVzJ/hzuvXmkkAn1cTk4=" @@ -395,9 +392,6 @@ schema = 3 [mod."github.com/huandu/skiplist"] version = "v1.2.0" hash = "sha256-/r4QP1SldMlhpkr1ZQFHImSYaeMZEtqBW7R53yN+JtQ=" - [mod."github.com/huin/goupnp"] - version = "v1.0.3" - hash = "sha256-EMGmTdoQhP2bVbCPX37hes5krqXn6NFexfnKr9E5u8I=" [mod."github.com/imdario/mergo"] version = "v0.3.13" hash = "sha256-03LKAZXgR5YUMeK5IRh2ds2GyV6uSbdq5QCPbAzlTus=" @@ -407,9 +401,6 @@ schema = 3 [mod."github.com/inconshreveable/mousetrap"] version = "v1.1.0" hash = "sha256-XWlYH0c8IcxAwQTnIi6WYqq44nOKUylSWxWO/vi+8pE=" - [mod."github.com/jackpal/go-nat-pmp"] - version = "v1.0.2" - hash = "sha256-L1D4Yoxnzihs795GZ+Q3AZsFP5c4iqyjTeyrudzPXtw=" [mod."github.com/jmespath/go-jmespath"] version = "v0.4.0" hash = "sha256-xpT9g2qIXmPq7eeHUXHiDqJeQoHCudh44G/KCSFbcuo=" @@ -431,9 +422,6 @@ schema = 3 [mod."github.com/lib/pq"] version = "v1.10.7" hash = "sha256-YPUv1VBZNFVUjFxQKdYd0Djje6KYYE99Hz6FnTfrmMw=" - [mod."github.com/libp2p/go-buffer-pool"] - version = "v0.1.0" - hash = "sha256-wQqGTtRWsfR9n0O/SXHVgECebbnNmHddxJIbG63OJBQ=" [mod."github.com/linxGnu/grocksdb"] version = "v1.9.2" hash = "sha256-ThXtaXx6LvRIFW4xLHsMrVWdsN2qobLPA0InLmlADOM=" From a570ffe036c2b9c8ae26b781aea6885bba6fa049 Mon Sep 17 00:00:00 2001 From: Freddy Caceres Date: Tue, 16 Jul 2024 13:11:23 -0400 Subject: [PATCH 323/345] feat(str): Single Token Representation V2 (#2607) * working version * opcode changes * run make format * tests compiling * fix lint * run make format * fix erc20 precompiles tests * fix genesis state * fix some tests * fix lint * update erc20 contracts * delete registercoin method. Delete proposal register. fix some tests * add native token check on ibc transfer. fix tests. * fix linter * fix tests * run make format * add nix tests * fix nix tests * fix protos * feat(str): migration code (#2632) * minor changes * missing tests * run make format * update docstring + lint * remove redundant check * move duplicate util to utils package * move number to constant * small opt + remove unused * Update app/app.go Signed-off-by: stepit <48993133+0xstepit@users.noreply.github.com> * Update ibc/utils.go Signed-off-by: stepit <48993133+0xstepit@users.noreply.github.com> * Update x/evm/types/params.go Signed-off-by: stepit <48993133+0xstepit@users.noreply.github.com> * Update x/erc20/module.go Signed-off-by: stepit <48993133+0xstepit@users.noreply.github.com> * Update x/erc20/module.go Signed-off-by: stepit <48993133+0xstepit@users.noreply.github.com> * fix merge * minor changes * add check on errors * add error check * fix token factory * run migration * feat(str): revert test for erc20 precompile (#2670) * wip: reverter test * run transfer * transfer and send tests and fix * check sender balance * run make format * test with try * lint * lint * lint * add licenses --------- Signed-off-by: Ramiro Carlucho Co-authored-by: ramacarlucho * fix comments. Add changelog --------- Signed-off-by: stepit <48993133+0xstepit@users.noreply.github.com> Signed-off-by: Ramiro Carlucho Co-authored-by: facs95 Co-authored-by: Ramiro Carlucho Co-authored-by: ramacarlucho Co-authored-by: stepit Co-authored-by: stepit <48993133+0xstepit@users.noreply.github.com> --- .github/workflows/e2e-test.yml | 2 + CHANGELOG.md | 1 + app/app.go | 14 +- app/app_test.go | 6 +- app/upgrades/v16/upgrades.go | 2 +- app/upgrades/v19/convert.go | 223 + app/upgrades/v19/fixes/missingWallets.go | 8373 +++++++++++++++++ app/upgrades/v19/upgrades.go | 130 +- app/upgrades/v19/utils.go | 64 + ibc/utils.go | 24 +- ibc/utils_test.go | 36 + precompiles/bank/integration_test.go | 42 +- precompiles/bank/setup_test.go | 46 +- precompiles/distribution/distribution_test.go | 11 +- precompiles/erc20/IERC20MetadataAllowance.sol | 2 +- precompiles/erc20/erc20.go | 2 +- precompiles/erc20/errors.go | 2 + precompiles/erc20/integration_test.go | 233 + .../erc20/testdata/ERC20TestCaller.json | 149 + .../erc20/testdata/ERC20TestCaller.sol | 89 + .../testdata/erc20_test_caller.go} | 4 +- precompiles/erc20/tx.go | 14 +- precompiles/erc20/utils_test.go | 7 +- precompiles/p256/integration_test.go | 7 +- precompiles/staking/integration_test.go | 33 +- precompiles/staking/staking_test.go | 10 +- precompiles/testutil/contracts/contracts.go | 4 +- precompiles/werc20/IWERC20.sol | 40 - precompiles/werc20/abi.json | 347 - precompiles/werc20/integration_test.go | 579 -- precompiles/werc20/setup_test.go | 59 - precompiles/werc20/testdata/WEVMOS.json | 4 - precompiles/werc20/testdata/WEVMOS.sol | 762 -- precompiles/werc20/tx.go | 27 - precompiles/werc20/utils_test.go | 161 - precompiles/werc20/werc20.go | 149 - proto/ethermint/evm/v1/evm.proto | 8 +- proto/evmos/erc20/v1/genesis.proto | 13 +- proto/evmos/erc20/v1/tx.proto | 35 +- .../configs/str-v2-token-factory.jsonnet | 166 + tests/nix_tests/configs/str-v2.jsonnet | 259 + tests/nix_tests/cosmoscli.py | 78 + tests/nix_tests/ibc_utils.py | 9 +- tests/nix_tests/test_str_v2.py | 176 + tests/nix_tests/test_str_v2_token_factory.py | 85 + tests/nix_tests/utils.py | 11 +- testutil/abci.go | 4 +- testutil/integration/evmos/network/setup.go | 19 +- testutil/integration/evmos/utils/genesis.go | 71 + testutil/integration/evmos/utils/unit.go | 4 +- utils/utils.go | 11 +- utils/utils_test.go | 47 + x/erc20/client/cli/tx.go | 48 - x/erc20/genesis.go | 5 +- x/erc20/genesis_test.go | 18 +- x/erc20/keeper/dynamic_precompiles.go | 74 + x/erc20/keeper/evm.go | 8 +- x/erc20/keeper/evm_test.go | 253 +- x/erc20/keeper/grpc_query_test.go | 20 +- x/erc20/keeper/ibc_callbacks.go | 170 +- .../keeper/ibc_callbacks_integration_test.go | 769 +- x/erc20/keeper/ibc_callbacks_test.go | 185 +- x/erc20/keeper/integration_test.go | 139 +- x/erc20/keeper/migrations.go | 5 + x/erc20/keeper/msg_server.go | 339 +- x/erc20/keeper/msg_server_test.go | 1387 +-- x/erc20/keeper/params.go | 67 +- x/erc20/keeper/params_test.go | 26 + x/erc20/keeper/precompiles.go | 82 +- x/erc20/keeper/precompiles_test.go | 178 +- x/erc20/keeper/proposals.go | 63 +- x/erc20/keeper/proposals_test.go | 15 +- x/erc20/keeper/setup_test.go | 12 +- x/erc20/keeper/token_pairs.go | 21 +- x/erc20/keeper/token_pairs_test.go | 10 +- x/erc20/keeper/utils_test.go | 9 - x/erc20/migrations/v3/migration_test.go | 2 +- x/erc20/migrations/v4/migration.go | 42 + x/erc20/migrations/v4/migration_test.go | 75 + x/erc20/module.go | 8 +- x/erc20/types/codec.go | 4 - x/erc20/types/erc20.pb.go | 54 +- x/erc20/types/errors.go | 24 +- x/erc20/types/events.go | 20 +- x/erc20/types/genesis.go | 53 +- x/erc20/types/genesis.pb.go | 156 +- x/erc20/types/genesis_test.go | 44 +- x/erc20/types/interfaces.go | 22 +- x/erc20/types/mocks/AccountKeeper.go | 79 + x/erc20/types/mocks/EVMKeeper.go | 37 +- x/erc20/types/mocks/MsgClient.go | 107 + x/erc20/types/mocks/MsgServer.go | 90 + x/erc20/types/mocks/QueryClient.go | 144 + x/erc20/types/mocks/QueryServer.go | 120 + x/erc20/types/mocks/StakingKeeper.go | 46 + x/erc20/types/mocks/Subspace.go | 53 + x/erc20/types/msg.go | 50 - x/erc20/types/msg_test.go | 119 - x/erc20/types/params.go | 89 +- x/erc20/types/params_test.go | 104 +- x/erc20/types/token_pair.go | 22 +- x/erc20/types/token_pair_test.go | 40 + x/erc20/types/tx.pb.go | 492 +- x/erc20/types/tx.pb.gw.go | 83 - x/evm/keeper/call_evm_test.go | 161 + x/evm/keeper/keeper.go | 5 + x/evm/keeper/params.go | 43 +- x/evm/keeper/params_test.go | 4 +- x/evm/keeper/precompiles.go | 213 +- x/evm/keeper/precompiles_test.go | 154 - x/evm/keeper/setup_test.go | 3 + x/evm/keeper/state_transition.go | 29 +- x/evm/keeper/statedb.go | 9 +- x/evm/keeper/static_precompiles.go | 137 + x/evm/migrations/v6/migrate.go | 2 +- x/evm/migrations/v6/migrate_test.go | 2 +- x/evm/migrations/v7/migrate.go | 2 +- x/evm/migrations/v7/migrate_test.go | 4 +- x/evm/types/evm.pb.go | 329 +- x/evm/types/interfaces.go | 7 + x/evm/types/params.go | 99 +- x/evm/types/params_test.go | 43 +- x/ibc/transfer/keeper/msg_server.go | 15 +- x/ibc/transfer/keeper/msg_server_test.go | 17 +- 124 files changed, 13250 insertions(+), 6764 deletions(-) create mode 100644 app/upgrades/v19/convert.go create mode 100644 app/upgrades/v19/fixes/missingWallets.go create mode 100644 app/upgrades/v19/utils.go create mode 100644 precompiles/erc20/testdata/ERC20TestCaller.json create mode 100644 precompiles/erc20/testdata/ERC20TestCaller.sol rename precompiles/{werc20/testdata/wevmos.go => erc20/testdata/erc20_test_caller.go} (66%) delete mode 100644 precompiles/werc20/IWERC20.sol delete mode 100644 precompiles/werc20/abi.json delete mode 100644 precompiles/werc20/integration_test.go delete mode 100644 precompiles/werc20/setup_test.go delete mode 100644 precompiles/werc20/testdata/WEVMOS.json delete mode 100644 precompiles/werc20/testdata/WEVMOS.sol delete mode 100644 precompiles/werc20/tx.go delete mode 100644 precompiles/werc20/utils_test.go delete mode 100644 precompiles/werc20/werc20.go create mode 100644 tests/nix_tests/configs/str-v2-token-factory.jsonnet create mode 100644 tests/nix_tests/configs/str-v2.jsonnet create mode 100644 tests/nix_tests/test_str_v2.py create mode 100644 tests/nix_tests/test_str_v2_token_factory.py create mode 100644 testutil/integration/evmos/utils/genesis.go create mode 100644 x/erc20/keeper/dynamic_precompiles.go create mode 100644 x/erc20/migrations/v4/migration.go create mode 100644 x/erc20/migrations/v4/migration_test.go create mode 100644 x/erc20/types/mocks/AccountKeeper.go create mode 100644 x/erc20/types/mocks/MsgClient.go create mode 100644 x/erc20/types/mocks/MsgServer.go create mode 100644 x/erc20/types/mocks/QueryClient.go create mode 100644 x/erc20/types/mocks/QueryServer.go create mode 100644 x/erc20/types/mocks/StakingKeeper.go create mode 100644 x/erc20/types/mocks/Subspace.go create mode 100644 x/evm/keeper/call_evm_test.go delete mode 100644 x/evm/keeper/precompiles_test.go create mode 100644 x/evm/keeper/static_precompiles.go diff --git a/.github/workflows/e2e-test.yml b/.github/workflows/e2e-test.yml index 0be51fe97f..a647c160ea 100644 --- a/.github/workflows/e2e-test.yml +++ b/.github/workflows/e2e-test.yml @@ -54,6 +54,8 @@ jobs: "test_ics20_precompile.py" "test_no_abci_resp.py" "test_precompiles.py" + "test_str_v2.py" + "test_str_v2_token_factory.py" "test_priority.py" "test_pruned_node.py" "test_rollback.py" diff --git a/CHANGELOG.md b/CHANGELOG.md index c1b5893889..1a1a12aa9b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -63,6 +63,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (evm) [#2633](https://github.com/evmos/evmos/pull/2633) Remove `EthAccount` type and use `BaseAccount` instead. - (precompiles) [GHSA-68fc-7mhg-6f6c](https://github.com/evmos/evmos/commit/bb2d504eec9078d6eff6981fc0cb214e8a3ca496) Refactor precompiles to use journal entries. - (vesting-precompile) [GHSA-q6hg-6m9x-5g9c](https://github.com/evmos/evmos/commit/0a620e176617a835ac697eea494afea09185dfaf) Update vesting precompile authorization checks. +- (str) [#2607](https://github.com/evmos/evmos/pull/2607) Introduce changes necessary for strv2. ### Bug Fixes diff --git a/app/app.go b/app/app.go index 992f83d176..f682644c5e 100644 --- a/app/app.go +++ b/app/app.go @@ -441,9 +441,11 @@ func NewEvmos( evmKeeper := evmkeeper.NewKeeper( appCodec, keys[evmtypes.StoreKey], tkeys[evmtypes.TransientKey], authtypes.NewModuleAddress(govtypes.ModuleName), app.AccountKeeper, app.BankKeeper, stakingKeeper, app.FeeMarketKeeper, + // FIX: Temporary solution to solve keeper interdependency while new precompile module + // is being developed. + &app.Erc20Keeper, tracer, app.GetSubspace(evmtypes.ModuleName), ) - app.EvmKeeper = evmKeeper // Create IBC Keeper @@ -507,9 +509,10 @@ func NewEvmos( app.AccountKeeper, app.BankKeeper, scopedTransferKeeper, app.Erc20Keeper, // Add ERC20 Keeper for ERC20 transfers ) + // We call this after setting the hooks to ensure that the hooks are set on the keeper - evmKeeper.WithPrecompiles( - evmkeeper.AvailablePrecompiles( + evmKeeper.WithStaticPrecompiles( + evmkeeper.NewAvailableStaticPrecompiles( *stakingKeeper, app.DistrKeeper, app.BankKeeper, @@ -1127,7 +1130,7 @@ func initParamsKeeper( paramsKeeper.Subspace(ibcexported.ModuleName) paramsKeeper.Subspace(icahosttypes.SubModuleName) // ethermint subspaces - paramsKeeper.Subspace(evmtypes.ModuleName).WithKeyTable(evmtypes.ParamKeyTable()) //nolint:staticcheck + paramsKeeper.Subspace(evmtypes.ModuleName).WithKeyTable(evmtypes.ParamKeyTable()) //nolint: staticcheck paramsKeeper.Subspace(feemarkettypes.ModuleName).WithKeyTable(feemarkettypes.ParamKeyTable()) // evmos subspaces paramsKeeper.Subspace(inflationtypes.ModuleName) @@ -1158,6 +1161,9 @@ func (app *Evmos) setupUpgradeHandlers() { v19.CreateUpgradeHandler( app.mm, app.configurator, app.AccountKeeper, + app.BankKeeper, + app.StakingKeeper, + app.Erc20Keeper, app.EvmKeeper, ), ) diff --git a/app/app_test.go b/app/app_test.go index 76701934ae..ebc0222f53 100644 --- a/app/app_test.go +++ b/app/app_test.go @@ -108,7 +108,11 @@ func TestPrecompilesAreBlockedAddrs(t *testing.T) { // For now there are no exceptions, so this slice is empty. var precompilesAbleToReceiveFunds []ethcommon.Address - availablePrecompiles := network.App.EvmKeeper.GetAvailablePrecompileAddrs() + hexAvailablePrecompiles := network.App.EvmKeeper.GetParams(network.GetContext()).ActiveStaticPrecompiles + availablePrecompiles := make([]ethcommon.Address, len(hexAvailablePrecompiles)) + for i, precompile := range hexAvailablePrecompiles { + availablePrecompiles[i] = ethcommon.HexToAddress(precompile) + } for _, precompileAddr := range availablePrecompiles { t.Run(fmt.Sprintf("Cosmos Tx to %s\n", precompileAddr), func(t *testing.T) { _, err := factory.ExecuteCosmosTx(signer.Priv, commontestfactory.CosmosTxArgs{ diff --git a/app/upgrades/v16/upgrades.go b/app/upgrades/v16/upgrades.go index eef23fcfcc..cfffba7467 100644 --- a/app/upgrades/v16/upgrades.go +++ b/app/upgrades/v16/upgrades.go @@ -33,7 +33,7 @@ func CreateUpgradeHandler( if utils.IsTestnet(ctx.ChainID()) { p256Address := p256.Precompile{}.Address() bech32Address := bech32.Precompile{}.Address() - if err := ek.EnablePrecompiles(ctx, p256Address, bech32Address); err != nil { + if err := ek.EnableStaticPrecompiles(ctx, p256Address, bech32Address); err != nil { logger.Error("failed to enable precompiles", "error", err.Error()) } } diff --git a/app/upgrades/v19/convert.go b/app/upgrades/v19/convert.go new file mode 100644 index 0000000000..60ce560c0c --- /dev/null +++ b/app/upgrades/v19/convert.go @@ -0,0 +1,223 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package v19 + +import ( + "fmt" + "math/big" + "time" + + "github.com/cometbft/cometbft/libs/log" + sdk "github.com/cosmos/cosmos-sdk/types" + authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + fixes "github.com/evmos/evmos/v18/app/upgrades/v19/fixes" + evmostypes "github.com/evmos/evmos/v18/types" + erc20keeper "github.com/evmos/evmos/v18/x/erc20/keeper" + erc20types "github.com/evmos/evmos/v18/x/erc20/types" + evmkeeper "github.com/evmos/evmos/v18/x/evm/keeper" +) + +// storeKey contains the slot in which the balance is stored in the evm. +var ( + storeKey = []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2} + storeKeyWevmos = []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3} +) + +// BalanceResult contains the data needed to perform the balance conversion +type BalanceResult struct { + address sdk.AccAddress + balanceBytes []byte + id int +} + +func GetMissingWalletsFromAuthModule(ctx sdk.Context, + accountKeeper authkeeper.AccountKeeper, +) (addresses []sdk.AccAddress) { + xenAccounts := 0 + missingAccounts := 0 + wallets := fixes.GetAllMissingWallets() + + filter := generateFilter(accountKeeper, ctx) + + for _, wallet := range wallets { + ethAddr := common.HexToAddress(wallet) + addr := sdk.AccAddress(ethAddr.Bytes()) + + if accountKeeper.HasAccount(ctx, addr) { + account := accountKeeper.GetAccount(ctx, addr) + ethAccount, ok := account.(*evmostypes.EthAccount) + if !ok { + continue + } + + if isAccountValid(ethAccount.EthAddress().Hex(), ethAccount.GetCodeHash(), filter) { + continue + } + xenAccounts++ + } else { + missingAccounts++ + } + + addresses = append(addresses, addr) + } + return addresses +} + +// executeConversion receives the whole set of address with erc20 balances +// it sends the equivalent coin from the escrow address into the holder address +// it doesnt need to burn the erc20 balance, because the evm storage will be deleted later +func executeConversion( + ctx sdk.Context, + results []BalanceResult, + bankKeeper bankkeeper.Keeper, + wrappedEvmosAddr common.Address, + nativeTokenPairs []erc20types.TokenPair, +) error { + wevmosAccount := sdk.AccAddress(wrappedEvmosAddr.Bytes()) + // Go trough every address with an erc20 balance + for _, result := range results { + tokenPair := nativeTokenPairs[result.id] + + // The conversion is different for Evmos/WEVMOS and IBC-coins + // Convert balance Bytes into Big Int + balance := new(big.Int).SetBytes(result.balanceBytes) + if balance.Sign() <= 0 { + continue + } + // Create the coin + coins := sdk.Coins{sdk.Coin{Denom: tokenPair.Denom, Amount: sdk.NewIntFromBigInt(balance)}} + + // If its Wevmos + if tokenPair.Erc20Address == wrappedEvmosAddr.Hex() { + // Withdraw the balance from the contract + // Unescrow coins and send to holder account + err := bankKeeper.SendCoinsFromAccountToModule(ctx, wevmosAccount, erc20types.ModuleName, coins) + if err != nil { + return err + } + } + + err := bankKeeper.SendCoinsFromModuleToAccount(ctx, erc20types.ModuleName, result.address, coins) + if err != nil { + return err + } + } + return nil +} + +// ConvertERC20Coins iterates trough all the authmodule accounts and all missing accounts from the auth module +// recovers the balance from erc20 contracts for the registered token pairs +// and for each entry it sends the balance from escrow into the account. +func ConvertERC20Coins( + ctx sdk.Context, + logger log.Logger, + accountKeeper authkeeper.AccountKeeper, + bankKeeper bankkeeper.Keeper, + evmKeeper evmkeeper.Keeper, + wrappedAddr common.Address, + nativeTokenPairs []erc20types.TokenPair, +) error { + timeBegin := time.Now() // control the time of the execution + var finalizedResults []BalanceResult + + missingAccounts := GetMissingWalletsFromAuthModule(ctx, accountKeeper) + filter := generateFilter(accountKeeper, ctx) + + for _, account := range missingAccounts { + addBalances(ctx, account, evmKeeper, wrappedAddr.Hex(), nativeTokenPairs, &finalizedResults) + } + + i := 0 + // should ignore the xen token accounts + accountKeeper.IterateAccounts(ctx, func(account authtypes.AccountI) (stop bool) { + i++ + if i%100_000 == 0 { + logger.Info(fmt.Sprintf("Processing account: %d", i)) + } + + ethAccount, ok := account.(*evmostypes.EthAccount) + if ok { + if !isAccountValid(ethAccount.EthAddress().Hex(), ethAccount.GetCodeHash(), filter) { + return false + } + } + + addBalances(ctx, account.GetAddress(), evmKeeper, wrappedAddr.Hex(), nativeTokenPairs, &finalizedResults) + return false + }) + + logger.Info(fmt.Sprint("Finalized results: ", len(finalizedResults))) + + // execute the actual conversion. + err := executeConversion(ctx, finalizedResults, bankKeeper, wrappedAddr, nativeTokenPairs) + if err != nil { + // panic(err) + return err + } + + // NOTE: if there are tokens left in the ERC-20 module account + // we return an error because this implies that the migration of native + // coins to ERC-20 tokens was not fully completed. + erc20ModuleAccountAddress := authtypes.NewModuleAddress(erc20types.ModuleName) + balances := bankKeeper.GetAllBalances(ctx, erc20ModuleAccountAddress) + if !balances.IsZero() { + logger.Info(fmt.Sprintf("there are still tokens in the erc-20 module account: %s", balances.String())) + // we dont return an error here. Since we want the migration to pass + // if any balance is left on escrow, we can recover it later. + } + duration := time.Since(timeBegin) + logger.Info(fmt.Sprintf("Migration length %s", duration.String())) + return nil +} + +func addBalances( + ctx sdk.Context, + account sdk.AccAddress, + evmKeeper evmkeeper.Keeper, + wrappedAddr string, + nativeTokenPairs []erc20types.TokenPair, + balances *[]BalanceResult, +) { + concatBytes := append(common.LeftPadBytes(account.Bytes(), 32), storeKey...) + key := crypto.Keccak256Hash(concatBytes) + + concatBytesWevmos := append(common.LeftPadBytes(account.Bytes(), 32), storeKeyWevmos...) + keyWevmos := crypto.Keccak256Hash(concatBytesWevmos) + var value []byte + for tokenID, tokenPair := range nativeTokenPairs { + if tokenPair.Erc20Address == wrappedAddr { + value = evmKeeper.GetFastState(ctx, tokenPair.GetERC20Contract(), keyWevmos) + } else { + value = evmKeeper.GetFastState(ctx, tokenPair.GetERC20Contract(), key) + } + if len(value) == 0 { + continue + } + *balances = append(*balances, BalanceResult{address: account, balanceBytes: value, id: tokenID}) + } +} + +// getNativeTokenPairs returns the token pairs that are registered for native Cosmos coins. +func getNativeTokenPairs( + ctx sdk.Context, + erc20Keeper erc20keeper.Keeper, +) []erc20types.TokenPair { + var nativeTokenPairs []erc20types.TokenPair + + erc20Keeper.IterateTokenPairs(ctx, func(tokenPair erc20types.TokenPair) bool { + // NOTE: here we check if the token pair contains an IBC coin. For now, we only want to convert those. + if !tokenPair.IsNativeCoin() { + return false + } + + nativeTokenPairs = append(nativeTokenPairs, tokenPair) + return false + }) + + return nativeTokenPairs +} diff --git a/app/upgrades/v19/fixes/missingWallets.go b/app/upgrades/v19/fixes/missingWallets.go new file mode 100644 index 0000000000..55466ee4b6 --- /dev/null +++ b/app/upgrades/v19/fixes/missingWallets.go @@ -0,0 +1,8373 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package fixes + +func GetAllMissingWallets() []string { + return []string{ + "0xce9ebc509f14cef1a37baaaa0e37da62568fd335", + "0x6d5a1bfb13861c8da5732cdd4f3c512e7ac85a95", + "0x01f5b36bc7260ac11dfe192c2efc60bdeb5c8b63", + "0xe2a36ceea3c16349ed991a52bcf5fa74f041c132", + "0xb804224f45da11fdc2aed1b136b6aab24e3a416c", + "0x1d5b33c83e284b7894c073fed950d95f8384dd05", + "0x8303b802a00f998b21a8bcb48c195121e26b6e6b", + "0xeeacc00244feff0d68a4773547d05c1e24edee7e", + "0xae49a8b0189521b3c6d0cd7fa62ec2f9036b2d74", + "0x3edcdf87403200b14ad117b24b9de6777751d3a4", + "0xaec7342c2cf450f5538e91125566f2a77a851595", + "0x6433a9e9834e004cf129a73992e2ca70625162f2", + "0xdee2a06e21336152d089ced6699efb0d7bdc0dc3", + "0x4c42bd1f74b3e93873c54d8116571ec33184704b", + "0x34b5eba8cfc392634ec292886121c23c2cc420fe", + "0x440a1ef3c8e25475f4f3d546172ecaca0ddf62bc", + "0xf3c623b226331ee73b14e7b2b2025bd8be85db92", + "0x4cb68e1ffab6398d3764010e55bbb04f67180547", + "0x06375e37a6f6ca148b06b1c6c1d56f5e58a3941b", + "0x1e55fe10c6b5fe13c5fecddcf4c9e2d5e9c96c6b", + "0x6af5b50f0e3fcae0cc2b0b5f3bb0769f9e689b70", + "0xc73ab455311cd7cc616736759a6edb36bfc6e88d", + "0xdf32878d9bff0cb2026518999b3076fc3b5373fe", + "0x2fc617e933a52713247ce25730f6695920b3befe", + "0x510212a1eabae4bddf920faa6344d5dcd3287b03", + "0xbdba36fb58da934f4855823f920e0f741e56a8de", + "0x962396715b093b10882f6dd7cc990b382ad6b3c2", + "0xed25470932ceee681db1077902ef4c74b792a7ad", + "0x85b9a589270e0daf233de7147b0871f0a5107eff", + "0xa81b96a4e323f6faa38783c183cad4a4f211aaa9", + "0x24a6c77da4754c38ef38eb4044f447eba61ec388", + "0x31307ef22c77cc89cd7e61246608f15b82d09fed", + "0xbfcd157a07cee3e85facfece0b98ffaf3e765926", + "0x3b69be4932bb76255672c7b07f33b5b4aa35a3be", + "0xc76409365ae97e909391e2dd459faa6801c71d47", + "0x27a435d56ec400dabf56d0572e9123eb92c432e7", + "0xc90b4d703928dbdf528b9f56d4de40da4367038a", + "0x990e793d2980b641140aacf26663f94a69b73142", + "0xd791a2f5a89f7f30966c9c717c1e0a570cebb52d", + "0xdbaf6bbe03197de119eedd9c116cde61f7294ac4", + "0xfe6c635340835bbe4b26f6ed2c382fd327739f27", + "0xa8378f5a9bf915695851b34edc0a922271b375eb", + "0xb970d1dbbcdd44eb3b128b545faae6e1e955079e", + "0x8198d433e462113a242a6788d0c1b2a215066fed", + "0x7cfd597a83de9c4b23d2ce19b07023bb76d66997", + "0x0a0c93d0f0553ebf7b7bea31be6fc65e38cc9b6e", + "0xa789e3d2bd521dce3e0ffd68ad274a53d6517cd5", + "0x7808293694ac36c99311ba8b39dbe5ac7865fd50", + "0xa378b5632de0793abc332d69f04a634b8b139636", + "0xa7ede43a887d221187da8a2fb5157eee11b42184", + "0x4450e3362289813b9db295a7859f8ef7b8885c81", + "0x655ab4b2c31eaffdde8ab6baf3f247e4245dac11", + "0x0a6ffde8418f3290300461e110d0460cb5a497cf", + "0x790a625282fd5b32d8fe92b007fba54f515d0a93", + "0x8cb4e81949afb93c93292cb2f689ec789c716a33", + "0xf5b15fa7dd85674232d10323bc149d0a728fd76b", + "0xd6c2ca9250bb228d7cf676127213f89ed6a147b0", + "0x9acd14328badd3645b3a1b83e52200f28cdd133f", + "0x0a380fac4fd2ceed9cdaa7af1f99299e698b65b1", + "0xe4286256cfc49394343bc99ea49b999df2733b3f", + "0xe9a9f0206241417d9f581c30b2537d130bf8e9d4", + "0xdd274b5010cbdcf83f9cefad0c3fab094147bad7", + "0x165264a3563ed9d74f60fa805fbb55a84f9eb684", + "0x35bf604084fbe407996c394d3558e58c90281000", + "0xc0ad5d21ff19a4e85b016bfd53ced8842995c151", + "0xdc8137be07957766119b27eccab0a3e44ba7d6ff", + "0xa1aea1b69536f5d1bd4582932efbaf4301b5e905", + "0xe13f7ab8ed8f980bae8e223f7432a8e92258c10e", + "0xe3bf29840db12d0b1de30df18daa68877e616787", + "0x0c810be21bbdb2939089de04cfb85e8b50d81c1c", + "0x35b4b2223dfe70defa23838e5116c02f382c0ad3", + "0xe15d39990c5a1e78df1ca9adb7b49ced15585c0b", + "0x1798329acc2f9bb475da89840d999e6d4bb7efcb", + "0x7a665c8ecc6ad69d57cfde45d38c962bbded17c3", + "0x7ce1a5c8543d8826451f3af4a8ef9d4853d7b901", + "0x2b1479fb519b9bc6b04be14537439475b844edf7", + "0xa680820b3f0bbc830d23859be54a42927c0e699d", + "0xafacbb29f6ce9b02d0acd94ad22a819aadd04e72", + "0xbb660c2750b49214401c1b32bcdbb94e0b397596", + "0x37e229da51d1c1e1bdf05e2c0d3e9493bfd33d6c", + "0x7e4c3f2751a1df8e2526cff72133abc0cf6a06e8", + "0x9487d61b7457a3bbe462c896e98de9977c9a01fd", + "0xed53c087b05d1360e78f8a3e4dc59f8d342296f9", + "0xd8210b56558c489134632401695b0e2d9e77f832", + "0xfe10287fafdaf98df32e7ec137067ef03b3be862", + "0x709acb2224bc4dc768f9ff10402851a697ee0ba4", + "0xd2a52be3431aa29940634e924df34bc3432c39a0", + "0x7386ea1559b11640420e0ec9cc5124ae683b0611", + "0x52a38c46a89274cf15bbcac593942f263a314db0", + "0x581366984221cb599ef1877bd787a9d05bf33ead", + "0xd2a94c6e3b8a5b479aed45fd7d2726890de325e5", + "0x1a11bac01b245efbc94fc7926edf926701785e03", + "0xfa48b10509a524a55fe315e72279b4fd4ecb6b58", + "0xe962706286c63a0c643e7b87662a46d0962dd9b7", + "0x55d6b6edfa7017b7fa647f5bef08063d67399c4f", + "0x89a32048ee147f81136bf074e6158e12793b7f92", + "0xa94534ead2d7c277d20c071b4ec7626f81645c65", + "0x2932066decb21a148dfdc14dce32259d5fc0d5cd", + "0x3b01bb77ece239e3139faacb2aa0a73f1dc457fc", + "0x2d787260ef9b758ab3aeb325ee975b1383c74c62", + "0xd97756a681e1b43bd86dfb80b60cfcf45378096b", + "0xce422b05cff99f753d81723e393b2e2b41fcad52", + "0x6e24e97c3b727d60ec72f190d516fa80464c00c4", + "0x66bb0506bdc0c1b1f3e3a229a1ccd08b38a52822", + "0x3cb7e258de4cf86f8e286ae3becd69b28d934c6d", + "0x2b1ca570b71906d7b16384ece52c67dbda5d839e", + "0x1db5a7ab4ef7bad6b0153d334f69aca563cd0bd6", + "0x6cc87c563694ce0c9ecc525d9acab7e4e279903c", + "0x6f3c4bbbb694644f6eec653b91824e457a27722b", + "0x5a766c3f23437dd8b02f72897c20850e4e2eec85", + "0xa1e223a5ed88e272e7b652ae898701cea20993d7", + "0x178efc6c02f368ad3eb27e85054866e2144c71b7", + "0x2a8bfa325566cb0dc65493d89ae4349aedeeb680", + "0x6544df975cf58a0b2c9a361a8db2e00d338e10c1", + "0xefdad6b9efd535db97fdd0e4f7b80ca220743a6c", + "0x748d0d539c5e127e54c7ef8b7bf60b8d6f6f5b1e", + "0x6b0db1deb22682c936f3fcf270f82757b9757122", + "0xec8b371c2e20096af6e7b9d62e1eabc4a0852d98", + "0x9fd634393707ad07739d63c81011ba067681a19a", + "0x0bf5f13833cb7d1c6c1399ea6c4ec8aaab4b5639", + "0x735cad6e573a1963ac381d86bc06a8976bf8f8a6", + "0xcec49457be1db16287a45a4b19c4b52ca203e034", + "0x68d78cbab080a6d6c20437fd7f83c41c2c41a16a", + "0xfcd77d8902cbce2ac0cabb0ed734ccfd21235e43", + "0xe47fd677ba6d3738cec98aa18bb6fa015b6f7bda", + "0x560d72125686d2180f02b9e53dbb1f79f193c85f", + "0x90c0bf8d71369d21f8addf0da33d21dcb0b1c384", + "0x3d58413b9836bb93c8f54b31995a9d1163130789", + "0xab73d686716339ed1f96829e59a5960fa34ecd7a", + "0xf125c50b31e538964821c42214afa4724f195928", + "0xace13f04231222a585573312ccf811e9e61ed958", + "0x8585ebe9fe7045a1f61e72984dd925305ee1cf7b", + "0xa18b60b0463c67b5202799d0c1c93a383f7fcccd", + "0x68541f794a58ce79a21f843745cc73a1d281ee87", + "0xc838b08d14d1259b5c5742496ea3fcac7f4e7ce8", + "0x9729ad169baabbe3dbb1b149fa51d408a85956ec", + "0x66e652bceed17ac157e6947bb77702d97199d6e1", + "0x9fb209b10b78b27e8361e7f61500652e6a344752", + "0x513e9e47572863e70266f39562b209f06b335a79", + "0xdb8b47c692ae462968c58717e7cff8e661a56b80", + "0xa60e8ea9d55def9339303c62a4c91b5cc3a4a738", + "0xbc7e333071f5999efc0639041e4ff9b756b22be4", + "0xe597a9b3c90402279c44e8c4631198acd7f75c49", + "0x981cc27bd476fc300a28270555c7bebf09efbcff", + "0xd02269b612f3bd17cdb3c7dda75ec07aeab868ed", + "0xbdc70cb1ef1e879405fcd42e39a79080a6ffd91d", + "0xc7d7afc62e707d99017ae59ab6a6f43c81b52a25", + "0x75074101857c340a11be02c4495bb7db26e2ef15", + "0xa7690203043053c17904c52df5afd668370b5ede", + "0x691b8956df03191393f23a752bdec58bb2b535a2", + "0x93fdaecb81d3015b70ec814557c3f6a55aa6a221", + "0xf128771ab602ea9fd5f172a6733975327fbb20bb", + "0x3e078e57ce8650c1f31e02e1733d69bac0477918", + "0x58d7ab0d5ec5ca1bc17834e0761c5789a4c73077", + "0x7ca5f05bea3bebeefadafd0e55684bcc62abaae4", + "0xe2abb449f192bc55593c26993d354be81b086087", + "0xee1c15ed537270fe11cfc4491f687d9a64d52ce7", + "0x74706985fbcd44fd7abc75fdf5e92c7fe2cec3b9", + "0x224a259e475a56d4b36123f48dd8a79213a91928", + "0xfa7e74ba6a409d48a6186bf7116fc1a4156a7e10", + "0xd7b7d2bc98c12b2c0e687319b79f289e462c7578", + "0xa8e7da5f38667a40e12fb817e7e0a2b760b7a723", + "0x9ef30decfe8bc070c1716155a98a64148dd8f294", + "0xc40d553dd69ff9a8c63ec1b8052c245d5c89c29c", + "0xe189a18ef11e39331f2ebac40f788e9654bbd915", + "0x77b087715e8c6c84b4bc84ed91cbb0fcbf0cf687", + "0xc35a0b554701573de0186315a928e6a7082eac66", + "0xcb150cf4e948d70e72cf6c62a68380a47acdfff3", + "0x94d007a88d72566574454f3baf14fb98e644aa89", + "0x8d8dc7e30407778532052330dbac3d3186411e0d", + "0x9c5c7872ecc89ea93ebd415cba40ce33e6664c7e", + "0xecbde5878a4127b8def2af355dc7e2be5311f904", + "0xc90f52d276345bb6db9e03b3fde66d47fea6a746", + "0x9d0591fcec26c86e188db6a2d6a0737be5f44419", + "0x9d8320c0d6f0130434fb945072d6fff879576697", + "0x992ebc9b1994628a191f7cde3a4a61aff5c217b5", + "0x6aceee462756cd6b46023685a93a844e13d1607f", + "0xf8dead4d72d458b22b76c8b536c3e7b22e91c0d8", + "0xf6e167a0dc136b6c7617c0da97c05d8aa41cca4f", + "0xe369ce12b2d3ec1b65a5e47f9f10e08467468c35", + "0x7cc833dffab435980abc36164ea7640664c36268", + "0xba3041d2959144f8351f6b3033996885a3844bee", + "0x968ac26694c08e3890d7e06e88fb4358e5284ede", + "0xb52d21c4542ed7ef9e67626b455d15365f8ae9e6", + "0xa706ed4676204e1b9b3aa005cf8ab5c92d30a830", + "0xa46d5b44699d01399d726e097e0041609d10c87b", + "0xa1c1eb4b2847b62cacce13f0847d0c3af3c7cfe2", + "0x1890d767fcf3d1cd5e057a5d8b5d972bb2a1b06d", + "0x241514e4bbacf47d89acfe31e849ddd19d35d00a", + "0x65b6fe7b2851c1a8848de6e93ce6c4d775521f84", + "0xed48eadd5d48e59a45803c1e7a11502a294c8997", + "0xaa42418cb7c5ea407597b85fdf8fdb5c0d597e53", + "0xcd2e03e3c64657555506eb625eb8f40a19e718e4", + "0x9acd405081144dbda8e52e300f45fc0e005eeffa", + "0x3eceeee79e575a8487ebca23c2f9aeb0c5b97d38", + "0xac84cc023f8524cbfc648baf26a6e36994f389b0", + "0x9bcd1c8e4bddb3a44221e48d24471bb141bdd2c9", + "0xb47eeaeeaac81e315005ad1e03488e9181dc2007", + "0x24e26cf8f21f809766dffea65089cf12607ea98a", + "0x4c5cffbf9da9d515f8f47458de4b61a64ddfb154", + "0x2022ff51c824b592c7b7d6ea81c97e51eac768d0", + "0x84acee946118abacc23d7dcfa3b4dc5f6bd17a81", + "0x027c6373f08d9336190792debb1a22d320fd2e16", + "0xc63b026cba1494fdd022def9430a4398f7aa6b9a", + "0xf1ac56a6a75bcbd915d48bd23605f24e472398a2", + "0x889b8d848a34ef22149a516671ba47ccd6df8632", + "0x6e73ca7019de719b6625ac5dbbb6e1d3e523d2c9", + "0x579f28b115345d15d8f88afda2b020492f265aef", + "0x054d67a3d574859e5982933e1b5abc573c4d4497", + "0x1b658411b71a22f03947d134104a3a890cdc4e7d", + "0x39815946238a308581153b8a416e522b6ad8de09", + "0x1905fb6c2b3cd16b9d380facaba817952328702a", + "0x658a419a412160497be87f1244701d81b636052b", + "0x695a1d5ab962111d63f48320f853085166764aa8", + "0x62ba720ff4b4d0cc44fe944917663315a97b3322", + "0xfa9aa86eb586e8e84362543d4d239a780b46be90", + "0x3ee56c027f6ef9c9135029a301b779b814c250c0", + "0x70a0ea08030900b3f955e30e48a20f22c06f4024", + "0x5bd2a89024e9bc73c6a6406cde4e28595ed66b52", + "0xbb34647b8b4374894f43ba8b9abf48cdd24b3f57", + "0xbf0a3212a5c9d6f47cc8f5a0c31ba4f6450e9730", + "0x661efde17ba96f0b4f430162f88f18d6949f03ed", + "0xc66bed0035bd4964dad80794f7d0bfea21a58759", + "0xbe4c57880ffa9712540468e2d6040d0b9e582201", + "0xf556fda8a3aef67dcc43b97d2ef308c6afd9e2d8", + "0x5e745aace240dffa2358c2b47f3eff4a3a85e12b", + "0xa7eb0c297d3fb451ed80cb0f410cd34473fd5437", + "0x48632bbf15c80bd87ca2075a513940e5016789bd", + "0x62a1811ad441be0f014f337ba2ad14ec3d9ba439", + "0xfd5a06b0ee791833c9ae945fe2a97ebf9b9b010b", + "0x07d7d3badcb55dcb5f5d4c77b0513b9ec73507f8", + "0x9222ae32f5eeec408dd413f081d91a4105f3b138", + "0xeb234c9cda2dae802ba7a5071e8d22b58db7b1f9", + "0xb0ea5ec77ee743974e75a5a2110e3d93c0be1f0e", + "0xd314339b5ed965c02e1a4d62d0288e2902118760", + "0x80e151f1074c0d1cdca8546bee30934a4e6d1af8", + "0xa8d69cf20fff4a5b3b51e0bb6454b921148065e7", + "0x2cee83a5ff3e5d9d6f3ca7c012a8e9e2f864f018", + "0x5a168ccbc4754fbaf66a2f1d5d3e28acf45a542b", + "0x8818f8234ee7e762abd1d4703ed6880ed3371dce", + "0xc93ad085c68a6a5f086d661ed9f148c9ff6cf9c0", + "0xe42d15539d9f0a5adab3869369992439ccde39cc", + "0x69ba5e36c6185de3f6bd0c9df2bbe10244cc545c", + "0x3847a206f3b5d75bd740592e354d4056de73b19e", + "0xa1421d86cb0acc0244b5c7952856c833e5de3047", + "0x2f561176d9d04d943ba8b293affe6af51c78b55c", + "0x140a0c93677606f8f47904fc9dbd34547b66b39d", + "0xc55b0e926e20eb0b9373c7f5e4b2032ac34d5164", + "0x98076110c0d195b468d5776ad89004c5864ffc6d", + "0xab9786a5e330b50e44579132b8a3cf7c1c3a9517", + "0x44345f4c361fc330252449601e2c657c20c8b67f", + "0x9856b227b644718bd4a9f51522120fde65204991", + "0x10297f5ec58ec2b32f8553e6add7c63466d100eb", + "0x226bfb21519a6d853799aabfc75ec8f06209d766", + "0x2c91d2cb8190cb8d10ad74b73f488ef97a9093de", + "0x3186a5601c4f51ff1f81c91cdd3ea7fd731a0c42", + "0x667a08dd74181ddaa7ab881119f675a475fb8fc1", + "0x750be51214830cd0f5a13ccfdb24f462a4956c75", + "0x2d2171d8e81451e3e0a1e69058b8259ac2c15919", + "0x64e85244a7f7d6b9446558ffe26f3239bba467c2", + "0xf85a5849a1b0c4ba599136d7b0fc8d4a0122cb8e", + "0xb5f9de8ffaa8373b9744bdff7d9de02446863ed8", + "0x66b7f75082448a5ffbc6b8a4b1d0dcc5bb73219b", + "0xfede1d2ac9f78771e2816b75f584f0cacf1d6d37", + "0xaa3cf0f6f96b9118be1d213a68ab44d742ba3b9d", + "0x682c4184286415344a35a0ff6699bb8edabddc17", + "0x0bc0334c056749708d601331b49b51c2a830c599", + "0x05f1826fafbb25f3df935569579ec5d5b36a7b7f", + "0xe5489a6c50f73da9d2cd4d94f048b62a2b64479c", + "0xd17bc6d43c053cf50b3b053bbfb851652c245fc8", + "0x67d259bf908638d5b7200559722bb31990049953", + "0xa7d84057f829248062582a33b69acdb6e01c9a52", + "0x6112e0d8524292cc11988835275d7bef1b42ee14", + "0xd85477d6a9773b277f8c377e00907a12afe686f4", + "0x2c06397b344b15123eb81d4c7219711256248dd8", + "0xe0468cf1344d7b00397604487e4a4cd0344728ca", + "0x5e0ca30a574c20ef586a8b6b1fa2b9e11345dc2b", + "0xc652765672a0301808ab6fa1ce67cf38fdf9e307", + "0x045e7896ae30b0d898b30a4024a34da4c0acadb7", + "0xa64d568f331f2774d5cff492f2299505abc0186a", + "0x341103de40137eed96edd054607e231883adb169", + "0xe171806a64f6e54a0a0d9de52abc90e79b56656c", + "0x0d983c98fa9ea9339744ca0e4a690859f743d269", + "0x9243fed0055c8aeaa31baf425c3e96c19de9cd43", + "0x51a5b5a6da4c99bfce4f52a7402a7b08ceb5ba58", + "0x5679c5d74f6cd2e5210bb2f6fa118f81946800c6", + "0x34737d904e18637fc40034d8dd4955b3180c6889", + "0xb9525063d4d1f1cdbec06fa27d7a12b98a16a25d", + "0x7ea388ffb329dde28664921c86690fb46c80dc54", + "0x1f633e9e8330aee58e6bea18e5344f36a327eb8e", + "0x885480673fad32b895f5525947f816bddf15e49f", + "0xf1e223d569bdc9f6c887be0f3c303cbfb6c715be", + "0xdcb5e05a4dc87eaf0c28d7ff700f3e0ec31c534b", + "0x6c65eb8edd5a7b63c26dc9539b98aa1ca5f79169", + "0xbb0181088e2fe65694dd683c37c7a1a6b14d162e", + "0x1b8a43990175e177e4232514d6b014398f4012ed", + "0xc37971ca030ba41bf0218671eb919bf505987b9b", + "0x7ddcf7586c5ff06775b576c637f197b715a38ed7", + "0x889db8f8706035345c3ad119e8de221d392882a6", + "0x072bf85ef4dddfc068367ef17ed3b6092668fc66", + "0x408b638241c3a2a8a3fbd8be5be674aca3129515", + "0x7d480d5fa0e8ab1232c02daf9aba33fd812987fa", + "0x50b24fedd9af538bdf8cca3621da6f8baa6f3344", + "0x990c6e0aa309d553744348b3752f444d26761a15", + "0xf7192dc73423880f3b57e8eddb184b8418e41786", + "0x1c6e12c6f73f16f050b9a7bb23880ab855f76dad", + "0x5ffa66e18333077b513f290cca7f26e751998f0d", + "0x3d51847413663696741ccc5081c1e9744b01c3e7", + "0x658191594cda88744d8158813029420dcf137a32", + "0xacd65b8e9d50128780a114a16d8e9870e19c82c3", + "0xfa21f5bd73528011169d267b87cb33f63798d163", + "0xf79f876f4d86bbab7ae52eeab6b52d1f07b54222", + "0x77f779ab2bdcd641eda87c66f6bb6dde44d449f1", + "0x9c3eac718c94baf18dc2440b5238727d7bcaa6a8", + "0x16dedf3b47569b1bcb577b523377824e552e7ba7", + "0xd86e01af42864a38d0b5a205af211a242bc5fd4e", + "0x5a2be5d7a3ecc2969331d86a3ecc8d64569e1dd9", + "0x6c5b17acaa591d3a8bd313c3ad877fbc578b11f3", + "0x9bc94e4df692814e7caecb5aeb5f4cb4ee1e9ea5", + "0x8cadb20a4811f363dadb863a190708bed26245f8", + "0x898a83bd2c83635f985ea19c94712a6076d21f78", + "0x964b4a9bcbd12128c89d490fd8605672d0e024f2", + "0x74c5d4cbd9fb92b9bf16967db1f881882a969bed", + "0x10ea740f5526d7e262beae81a4ec8d944824ef1a", + "0xe05a3908058efc24c52d0cf17abcd044d6dadf44", + "0x5b9e8bdd8b6ea310fd16230ebc6c093e6a0fb562", + "0xd3c21283380a37461069edede4a47926c19d0f1c", + "0x00635cab48a24a784e9c68f2888b393dd036f1d7", + "0xcd74db82134f94fe9ebfbf5ee8b4c09ae364104e", + "0x4906e4f95ad546ce865916f65c825e00630bffa8", + "0xf52bd269116448745a7e13c3d2f299973cf671ab", + "0x912b5b8e5cc5590e05e772cb0fe12a5ff914e2c1", + "0x65587237b2da6dd70787acd27b277eeabbfcfde2", + "0xffd540f1765ee63d09feb532019cbadef3abd9a2", + "0xaea12f0b3b609811a0dc28dc02716c60d534f972", + "0x15c3eb3b621d1bff62cba1c9536b7c1ae9149b57", + "0x964cf3e0447241038907a85b46fbd0318bf80008", + "0x74477c2fdbc59eac66489be9fe4ba164dea2475b", + "0x3dd54285c649135127404e30a335c6667cd5709b", + "0x22b776849cae6cc65b2307948749bb8623d92b08", + "0xedc846e8d83f3b6f068b10a8436df21a62ba4981", + "0x0798b4acf7a79290715ee237ba6aeedc2ab10adb", + "0x0a472767d714cf5893ff5f65c4b16fe4f0610939", + "0x62896ad278db158fb6e17f367f8f3b277bcc3465", + "0x1ffc0b83ad37dc81a50ea4dc206cf402559600e8", + "0x79b816d7039f936d5a5986e5f5e07b88328757ee", + "0x4e64b508320bf97330ae086051156baa224306db", + "0x1e8d9f46f1526d8f5640000c83a81b92578bb380", + "0x6170fa6891b60b7e5c95a10c974a1efc6434ff9b", + "0x3d4b215ed1d62a25444f14c972acb83697d7a377", + "0x74aae58ecfab8b2d1da26dc248ffa9b3eef98c9a", + "0x6a2f4e5c657223b48f960e36c299f3a210975c78", + "0x6ebd8620c1476b0b6dd29d523681e1cccf8e7ddf", + "0x616c806241e12a42759f5d2b0cf3ac540fa0e06b", + "0x6a7e0209afaf36119f856c32e873c6e223dac523", + "0x68b53aa18d1b8437b7cd9524040c776e2261e06d", + "0xcf7e20d25b3624ad7e6e2feb248fc058b77a5272", + "0x88477997cf6ef5056c1b25ea6b8985cff7ba7a8c", + "0x043cf91b4ec1c8ab0df17f8f61355c2181c91aed", + "0xa2c573abc3e3c3a66c6d5530b7a1bcd185a9ade0", + "0x48207215b932f2fd7faf6082d7db52d2c5bf7bbe", + "0xe0b616e58e086429311d3fc6cc67fa0d8f7a73bf", + "0x1abedd35d082a77b43bb39c2140446e0aa068f2b", + "0x8c36dc228540656197ea94d5aaef33177d6def3a", + "0x3a31d9d9120013a2f1f55ce45068ed9ce4795e9f", + "0xc10bb2a66b989c019befd0d31046668eb7ff6e5f", + "0xaecbb4295038162ab6fd916815b1be7ccded7312", + "0x36ed990bebb642bbc6140c88ad691af016dba33d", + "0x8971af2987594f79869c3cdee82b782d9d6b4745", + "0xec86045688f912415b327272e13febebd9f89801", + "0xe958db62b7ecd202c0880bd5248cdda3ce0255c4", + "0x97f71f70dff89ede72cd5e4906baf06a243a68ba", + "0x36c1b17e8f7eb5d3179265a6d5dd75d2d53438a7", + "0x9563747b305ae6e8dd7a55aeec3551051c616f59", + "0xc92787ffe3ac443ae77d32468529e5fd7ab1e112", + "0x11d48b9abd5196a44e0f340d63af47ba7ea8338b", + "0x839375339b030c4a8a2f8bcedd85c308d898307a", + "0xf503c790f0298f047902942aaf54100e19f5739c", + "0x2c640ac98e293daa246f98d2828e328a06fa6936", + "0x4afdbcabcc441b61ac0b036e30722c7d763f3cc2", + "0x31c798ac8159568d44c7f0c8678bf6fdc4caf57c", + "0x47acb3d474553f30fd36b1a8eefe8c13389378ae", + "0x7bfebdfbff6ad1ecc4a740ab8d76f37c5000b8db", + "0x971d8b5413b4cc76784836e2644b89abca1656a2", + "0xb31a07ec941239e3167bb146e8b251738aa26bd8", + "0x55760b731d66fb4fffe34ab3372268844944c436", + "0x0934f933a2d33f98371d9a2a2f9dda3ca7da654f", + "0xa6ff7fd5b13acefb6a717a07c5ba93d6dbd993c3", + "0xf2a96a08c10dcbd65692a57a2832c6a265845741", + "0xe0f1a6494ee81864a2bb84e31d7f252342b90476", + "0xa79bdfab72aaaf0b8ac368b7b9495a671ac54f3a", + "0x0d0a0958b406cfe5ba8b2716334295416de387f1", + "0x5da5c2a98e26fd28914b91212b1232d58eb9bbab", + "0x892e38ed5a7654012453fd7e474d9a993787baca", + "0x2cc6069accecd95084c4fba2e7a593c7ebd6deb2", + "0x984ef49ab6d93840eba5220d5c01b3f826b09876", + "0x32567db854dafb3fb843a272f0b3624459856a5b", + "0xe4f0d12f9b8c43799d249e357f302ea8fe43a34b", + "0x39e3c6b7a22d46231f43f18d203ce888c1c825b0", + "0xfec3ce0aefa287465b7e1760a78aecaa45ce27c7", + "0x343080b62baaff0249f92346431f385db920f485", + "0xb72958dc333d53551b8172e098d41f3c0c0d52b2", + "0xd25daf42033d4383dce7ec963f304f62ee86d13e", + "0x4bab1fd419dfcaf1b72fddcd996a37b4c25e93da", + "0x9144abf52ab1ccfcce630e8cd604ede52fa5f550", + "0xa1613732256d8da2fb08b56eeb2094abe795edb8", + "0x0eb1b5a81d3e2d6ac95c7894cd8b66243803c257", + "0xb973ec775912d1d875e0fa57e65179090e1e85af", + "0xe8b6b1e37f1f6f441871eb6194ebaa041c36ab4c", + "0x6a426d531e28c954e6e44a20b61cea9bad15de41", + "0xd5f8a98c373cb4b18b27e5ee20bff03b0693388e", + "0x86c5b31d0e6989de1ac1d6b147c02f46d611924a", + "0xf6d6cc1fe91eac72a54f68399ce329d1add27aee", + "0x33d2dbf6aefc436ca2c5ecd43a1801277e0838f6", + "0x16178c05962513a75778543ea1fa69ed00696922", + "0xe25630567364fa4face579f3fb2ddc00b66d7d71", + "0xc71b06c337d1ab6fcfdd28df281cd2f401803ba2", + "0x5ead9c10e4c0cd7d362775c179e1e3f0861706f2", + "0xe682b3b225541605758eb3140206ce510ae8b6d1", + "0xae6f5db28bc5eb08c21c82aec60851ffbfd8aad4", + "0x0798d0948578608a70bc2e91e12a1f3d3f7f878f", + "0x1f13f224dc3b427a8a83de2d8b8320c6a88e236e", + "0xe663b4f26abad6862d424b192df796f8f589b84e", + "0xd313b8f28e7ecc466916742f6b16fcc1e03c5c2b", + "0xc58762809d8d7261e25f04fc328449ef24d8bb6c", + "0x2e0702258ffc326ae66adad990b3860c0e1d81ab", + "0xdb5d8eb2a606f3169432c08da0ac947649c71e9c", + "0x9f7f741a27258ea3ac4dcc201cb9cb4edac0b3c3", + "0x8454f57d3d20617430c689f399e402241d286f96", + "0x67d2304710760381a879eaf99528acd1368966e3", + "0xbda4e422abfdd137db7f579653bdd68622e99492", + "0x92d9942f6e6d7ebe0cecefa010df6b56bb5ae72b", + "0x3f9764d604660a4d5e7d074e2555e472bb1e9f7a", + "0x10f3d354e4ea2d115b03e71616e5eb5d057a6d16", + "0x15601904886ab1951ecec63910e717157a44c5b9", + "0x156ac784bae328f6afb6403460145ba8b029d3b5", + "0xfaf7e310ed2e74b2217208821cc0a9cfe6f821a1", + "0x97dc31404f5087f0acc76db7c85d6e9a7bf429e6", + "0xa296f5bb4df8741a64a07ad5f4aa119e462faafa", + "0xe5d8a38750cb7854dddc769f8ac95cddaf211be1", + "0xefc470ad7667535e6041fe76e632632b3720697f", + "0xa2b5f0114e7935efcbd7c038d789bfa71f2bfe5d", + "0x082ee1ac94b157fc84758435a0a4a3f31abaf7e5", + "0x0d734ad7591e5b3388555639653dd82edf80b5d2", + "0x194752f86d86d4acc937fbdf0a5f6f67af679a67", + "0xaf3219826cb708463b3aa3b73c6640a21497ae49", + "0xe0fe8f0432e358a3cc7589f76993a4821202a173", + "0xa8d87759fc80e08d40c6ee7857652f38e5c39aa8", + "0xfb43dbf9e9f6e732092ceb9b6d18b4ac91515cae", + "0xc4242308f3d50e7c2e619d6db80a4f70ced124e7", + "0x9f68e7fd71f2a24b635543fb5837454e97577d61", + "0x8973b1a90adf0ced3dbe26deadd5a176ecb548f4", + "0x45a7e007b8867fbdb27a7aeb550ede728c5f015c", + "0xb13bb3d642ee9ba796b9d7d908743cc6314ca2eb", + "0xc2c1eb1865107cb8afef556cb38d84ae64a79cbb", + "0x69fde17f3c2fdc7b65837ebac6a35aa288584909", + "0x32e125fd975362567f1e9d15822d0aabaf86db51", + "0x665bfabfc5ac696e870f84de0ef9c87259305a6f", + "0x0ece7c1bfc9543b2cbea8f5577d02e5f59a9f176", + "0x08c39ae7c9a767db6e7a412bb409d2349c89a971", + "0x2e1af63cd595a6d715e5e2d92151801f0d406a6b", + "0x795d2f6f30ec6741235ad9706f3a6842e120ec33", + "0xa7b11111e9720f4cb50f7cf1b9fd9bd8cea88740", + "0x793eeb21ce18f1c9853f563abe0a7090e7b7355f", + "0xe3e56da9addc2e29532669140fb94fa7f21f6e4f", + "0xfcef9d2530fc7849d657e03e47276607a07bdf08", + "0x9d156bc7c8768294510a4a41883d5a4eb15b15e3", + "0x45708f3f4399c320073bb457af93e76de84418a4", + "0x41d1c93f26bf09261c350095306d532d50e22c77", + "0x89c7cb095752784900f099f73c3d7268be5d76f0", + "0x68ac22bae4ec49712bf515a70e8eab00e0ef3697", + "0x4f4af89312708b5fa1efbe7f617bdf544f2d26e6", + "0x3ec63486caa8a442ef6d43995e9f79b99ad12ca8", + "0xee890386f8d856079dbf5eff8ae20e351555b86e", + "0xf0e4975d42cb26d3a3853b9898240c79361cb71f", + "0xd0c501c2378fd72436392fc8e8d81d37a54b552c", + "0xc5de997a4809c15b64560b04e1141416b1a2a71e", + "0xf6c99befa131de14a7d87f67b93e0a4566359640", + "0x94dd17f50137905697e753830de406be6bcff791", + "0x66877f01fcd04398cbd52031da8063bdb43c0095", + "0x1897cdf2dfbd8b161cff8803cd50f7d78b03da12", + "0x36026d25fddd7c00b77d6e82e11fad55bac80ea0", + "0xfa6a845667bc3d2616bb3df6e99614aec1b75867", + "0x17cef1e15e45d5e629c78a6fcead5d4e03a36be5", + "0x480610cb9762362b28de7ffb3a9eb427e423ecb8", + "0xd8e2f6373603612736c8b49c086488cd7baf1a2d", + "0xc632fb79e5e58603e2eeb717bf13ad877e5bb85b", + "0xaee593125326668a36ddf34c313ba956e2b479ea", + "0x14a7146190ee888630be0611afac446b0041e325", + "0x7439f7dfb929266b3ba1350d18ad8907c8bb83e9", + "0x3e8313858a62fe324e2c3cfee7986074b05db078", + "0x14903764d8699da79e185348aafb8889a91759ae", + "0x9e2b33c77ced9bd83f7a79e658724156c4158c1b", + "0x98bc031ebb1f9bc710f0155254c82fc0742c3a62", + "0x67c43025e72985f3cc19ac9f85361a3f370c54ca", + "0xd47deb9a3ce009c7946ce57579f6f56492669afa", + "0xe4055ad66e9e17afd1f4e4e44e8c6c4878187c7c", + "0x49d9589156178a11409afa132ca2e84e03df2a49", + "0xca01a1d0993565291051daff390892518acfad3a", + "0xe2a249ca60314b3159e2f9ee23a178ba4dc1bbe5", + "0xd4839a77fa90db31c52e468456a54819250bf920", + "0x840d366ec3cc9d725b4bcd270f559b9f39a5ab3f", + "0x7d27ad72a9a8e4680acf6512419ad6f4d639e31e", + "0x54881e63f225a8653c2da91fc3d9769e35b81b1f", + "0x2efeefc09b38b77e9979dca5f1b2c6a806d7afc3", + "0xdc281a66a8a051bc54bd50552911b09bedcb4c2f", + "0xd56f2c9937d014ee98eb0cf23018a52855b3da3c", + "0x8c9026b18becb80c8706cb94a184a19b4214742e", + "0xe9c23dadeb5b1ee751838246c0a7d5c7e6572f6a", + "0x0babab11525eefa3f805d41f0da08f16f1672aaf", + "0x5a5cb1d415afda1470084a76d63c4bbdc2d75657", + "0x5e648f910e1c5494cf5a7293312f6c8e78a191cc", + "0xd7f10f80ca8d78747fec028b465f94698c3438e4", + "0xbf72589113f7deac88d4a761820b65d26abd3b9e", + "0x75f657924be74a3932f3218fc99091ce183ae59d", + "0x906728c3639708e8b520fdd8fc6af2cd70eb45d1", + "0x27969ceeaedbfbaf93e6e951682c8d6f54789a32", + "0x77a691f211b83eb3d4655bb87a9a2ce153d25eb5", + "0x0393931783b1d0ead3b8b0e0f44c1f23ec3c4af5", + "0xb3dfcddcca5adfecf11571bab1e34a47db6e77dd", + "0x520c5345a8001126b876f8161e3792a43ee186d4", + "0xc0b365985d82761eb881152906cd2b143aa35c7f", + "0xcc2522373109ccbd41d11262533b910914e9d196", + "0xd3a0fcb5b3b5494681ba12f3eeb5a82efec91a83", + "0xbe06834f3bc4ae52c3b2a354e0617157257e16e8", + "0x1e008bcd9333f3e85c751f7fb6ce82e7aa626f69", + "0xb58d54c7250941d43577168e3acaffa8f36e9877", + "0x7d846e90657a6675d3451cb5d9e02a9b9a89f9e8", + "0x82360080dd25f7e5829819d2485abc1455891a02", + "0xc37b84ea13791d57cdf3b363d27d499f549a6e33", + "0x661e015d7d3dcb9c59b766743ce682dc2e1abf76", + "0x4fb1176157fb678d8fa616468b7c4f19c87f352d", + "0xb48d81969ebb4b312ef13f8663058f8dae9b1b2c", + "0x368d80ff534cb67c1585b7bd8a88dafb8fb77a76", + "0x54847338b0456b770ee3ed6daf003c4134bc3973", + "0x5263377127d1072f7158c302e257960626b669f8", + "0xb5611a2ffc654d3f3410341a325dd126e7f803b7", + "0xb0d88ce658c672717d85c7585dd94e2679aaa8ff", + "0x16d68c3b1043c6212449143089304f83ccad2617", + "0x80c8dd03b9f9f075ed3d4a14acf50302ec159e48", + "0x406510733654ba7eda0cc92fddf8e80a9933ba6b", + "0xdf3f11a76557dfdff57f1d1808af6ab05db5b219", + "0x7664298a1875fe7590f3f75e6ea111ca9a2de478", + "0xa00903c64af2126db0211bc9e5bb19f1eaf1b477", + "0x8357b940750a40023300313dc48e2db6faf283d9", + "0x14f446a9ac7a7ee9b8240f1abde4feebe04fb485", + "0x4c1ed62ab4e161ea6e61cd302bb6a106cdd70b22", + "0xec739209daee551cbb0e9fa0688dd433dc21ce26", + "0x6f3f7d558e939be8a4f54c1d705fdfc2353606ac", + "0x9d23c3864cf3ed02b76a0beea9939ca2b9eb189a", + "0xe777d8bc38c7cf2be6c4d7b73e13ead8bf6ae360", + "0x9ba42fe24e4dc589f19656f97df3006e7b3e7d8e", + "0x67fdcb7163e3de7fe9289fa1dcb70fda0fe581c4", + "0x8cb71cec028ccb62a88a89364884d1df5c0c5273", + "0xcd84d4cead641d029bea9258955ecea542469b77", + "0x22ccfb4382881c92c015b10eef433d2d7b5da2aa", + "0x7559e6d568a2d3b96f2cd1280bc05c856486d3ee", + "0x11205f366039cebe62c489f0b58debc4540b814e", + "0x48249f321cb8edfd41e52a30577b0e285b6ac0a1", + "0xac57f6db9eaeeba18724cd74621466b1a36bf89f", + "0xdc3c1a9ab3fedc0c94bb9a85208ebaff4f9b5aed", + "0x004907948cbb26c25f47ce21c9a7aa187b20418f", + "0x18dc86291cc8f1646975daa6ccd0190201eb545d", + "0xdbebc7429dd941da74502db72e3a4e0f88bc8bd1", + "0x8b55ffda9f403bdd657fcbf23130a1408e76fccf", + "0x9f735989432e0c0d6ebe4c03d2bc7706b544214e", + "0xbbd495dc3175ba9f1a4c219c4847c0f716916b5f", + "0x648645e45fbf73ae81da2bc6a082da5296fd92df", + "0x0682490e98e08a6e111e8ef0cf9c10bcc5610a40", + "0x2f9a23dac928a1e02101aaa54ecbecc3b5129c80", + "0x334eb3ef3f8ff784d60ddcd13cb2ed8c0db8b853", + "0xe55f769c5cbf61bb478361c758c4df7f1b6d103b", + "0x4d651353cf99ca4746f9595eafaa3dd11e13cbd3", + "0xdc9330c14563a354967e3d0a88d990eb8d114f53", + "0xe2e3ee956bce1bc9d6f6132db9d48ac6651c0d8e", + "0x9d8e923656e918faaaa46f7fa96418b8974ff497", + "0x05538f4fe6d78110f316d11bc19239a926c9c419", + "0x286d6cb1adc746cb25dada49ab7fc2f40af045cc", + "0xb53744816c65c0aa9d6db3a35b9fdc67f06adaec", + "0x9a2b83030d0fe639160168dd96b5ce6e655b0724", + "0x909e3afa5a3fff395dfb57ac9a88c909bc880da5", + "0x194327000edd622f0edb5dc532db6f58c99b1e0e", + "0xd187776b6b46138ed8543fd4be32893a9547a3ff", + "0x0f972e1d43c3bbcf6e0c67bc50084f69b57dae1f", + "0x4d687c49f708ab897cb6532b0690e17da2917a72", + "0xf091528f78af9616482e57cb0ac76b305271028a", + "0x93cd2606cd6adf5839e9a2cc6e6747a6cde172c3", + "0x4317c9d3fdc7df6040a3894d30e2c5325791fd0c", + "0xcf53d964cdb5f3124af971ffa51dd31887d2f08f", + "0x60b7eca6856ca27d409a375fe0b9d7e212975cd9", + "0x7bd48e2e5bb9b666d16858ae77137d8d32670ed5", + "0xabf6c264907445bc0763c9f17ac83b93be760e88", + "0x865fce6e7d9eabb132c945a8d101575f6d904304", + "0x6c40871c4f65d5e9de24f988b254a3b8962feb5a", + "0xc184f7b46fc7b47d563ea0d1e09059f49a401de4", + "0xaf5c69d89b68d4eb0ff3711329169228dc0c3e28", + "0xfa310c80b5a3564972b82163bd660283fd140fbe", + "0x0d1b0aeb322831120a065fa37039edb79f6e2c62", + "0x2ee42b40c43bc7942146f6f9eaaa44ddfc5ed1b8", + "0x8569b265c99779667fa0e3d5b075e948900c1658", + "0x125e32ee673fb979e0e792f5e658bde4afb3104a", + "0x9629bcecb30c846752fb59ef34462f38bf1a6553", + "0x04af9e43d1793ea53c769edfcf5277f4e9fc4082", + "0x0d5c767d6f617a82f2915ead62a4943e020e632d", + "0xe3ba5e216ed8156d3de3524ffec7bb14056d6c84", + "0x9452e75da1cf49132d3feb075b6b09ef3fe60d25", + "0x18bbec784f4183c8268213aa21e3db0138b2310a", + "0xd7bd783b57cd6201cc0a9d736c866223b57e02ea", + "0x496a797bad4d72d1d8fddaba11442c4f85ad67bd", + "0xc81b21a7a87c6a19864277f28d0dd49be2c2d59e", + "0x16a5612a2619c722ffeb394eab14292c71869469", + "0x49efee36a95f783165a240e7205ff01d9577f79e", + "0xa5e28185f214c8426416352df2f3889fd3b95875", + "0xb637ea5d6d2efbb4bb546242cf39ad6371683def", + "0xd970241e91beb293f40b6ab2f571f47175e75863", + "0xbd5eebedcd8cb5a47b579946a42c1b4616e25095", + "0x20943d7d739525d1ffb779d8751adad45eed3264", + "0xd6d6daa2935e64b154c66361721e1b57df1792c8", + "0x7968756ad92957a19b5feab3359d600fdd590ae5", + "0x0c6cd764cd34fcce3feb279b5f2bc49065c12871", + "0xfdf3b3b1cfe5f4967daba1719693d589ba790c1c", + "0xa89bef9aac006ee846fd7fd3aa8ee5cb0f502dc6", + "0x8390d7eee8ea19e8ae1675f9921e323808a6c3d5", + "0xb9d4de386b2a2ff3cefe8c474df30c4170408a3d", + "0x06bc192510d598e3fd0879ae9ae25c67e4f6cd82", + "0x8938346ef272386663303bf5eed81ff164c37186", + "0xf1a7ecce1f30546a7dd3b9007ef6e0964fec1a86", + "0xcbe4dc720f42998d3ab934d7ada7260683b55c90", + "0x0286ffc971136854ccccb6bbb4b5ad023c43bf48", + "0x504a16725207bddf5a4fbf5e603e2f639d3ad466", + "0xef4d9e1f4e9e2dd9e747b53f4be3d04bfa935f2d", + "0x1d5039acbb1a26ca7c9bc9bf9b3cea07fbb5723b", + "0x67de9961038f9ff441ed87d713af70e7d40ceab4", + "0xb8f3ce5fc8ba617e7681fa2501f12fbcfc63da76", + "0x62cba9117d1d5339695b437194b3129db6ab875b", + "0x2b325bb3d8be1cfd317c991541b7615a7062d17c", + "0x75319dcf2f347b4f7c6f9040a50b4253f7e46681", + "0xc00067105f57e495831938adf3f83bfdae9c85bd", + "0xad513c25ee344e7a52444ec0395106ecd34d37d4", + "0xac0ad5e5ef1688a1c419f8b8ca5f790c37d620db", + "0xb82e730693eebbfb800cb1b9cb6d8b1808032398", + "0x5952f70fef1cbc26856d149646d4a8f97e923ee7", + "0x95d1692098b8261459ae596638f410e9c2af2e59", + "0x7d58271a93820c06f9da75dd1fe57609b9b14c0f", + "0xa149adaca5c9dcb03fd4ba50a20da55be3308b57", + "0x14a63e6c69810d9ae58ecfa2d06fb92e9a1bceae", + "0x51e2492c1215b7a920040528377d3e12cd15a513", + "0xa54c60bd2294a6c1c86e57787981afacf9ef86e7", + "0x3674c0571de1c308580d800897dc6b8093bec991", + "0xa404e152914d5b9a792dbcbc11019f1dccf3e560", + "0x3f388c0b13f3162a486cbc6ca9595387a4582700", + "0xcf90242288344df55b22bbc1addfe0a31bce91b7", + "0xad5ce75730fe59ed81c0b215d5a1434cb35684c4", + "0xe8725a5beda5fd89b80b1743380d816e261705bf", + "0x9b2178676479ecafa2ef8f9acfb310d166704199", + "0xef7c7b0bece19354e59be99cd2a6208e858d378f", + "0x5483cfb391fb40e5c06818ff9cd46f5ee7009299", + "0xc06d159f88295be50593050f1da26bc70ee029b2", + "0x36de75c543a0d5a808aaa8d6c1b913b5094bbbac", + "0x4a88704599a39ddf76877f175064fe99e54e1fb1", + "0x50062ba8c951e9002d0993cae69fcaa047f8125e", + "0xe8b94ac20d691ddb848ab332bd83bd3701794371", + "0xa0a64c9959207b41fab5429c0e790591bf242656", + "0xa158a2e424f42a67235f0de3624210b240b2a1b8", + "0xddb4c7896cdce52a208067e94e32d4546cfc4f31", + "0x818bd7084a9c0b4bb0f2822cd388cc8e24ced314", + "0x95bbdf1a17022d6b5b86841f410e974c3ab09ad3", + "0xbd02e13aa7d03aab1b16232132e5f47b6310d15c", + "0xf839aeb24ac2c2a9b6bec3ceaf5e6f47d00c5f39", + "0x64fb2e3fd64943d6019d448c0eb5ef09eb161ac0", + "0x27d44cc359ec1b0d355478035e811358354b7c74", + "0xa2e8d656fd32dfc26a6d20a8132e2d2a2c2d28bc", + "0x456571249b053d75dfede3dfb9600f58c6d5f8db", + "0x323cb5d11378cb460a5e0c3351f5df310c0907c6", + "0xeff20aa070d2f1bb1578a72bb46abcb5fc7bee71", + "0x4eb46ed918ab2a037086f9073d068ef3e9496c21", + "0x8bced7152912a939d773e9e934f9c87a7fbc6963", + "0xfff302710b343b58c5671e72696557719977155b", + "0x18b43d67ddd24f135d7f48ef2d0d9116ec6bddfb", + "0x12abe44ca3698a5d94d83645c8424052aec19471", + "0x144eb6a74be3a1002f1484a232a8fceb99e7ebba", + "0x8c9a636f1b97f92ec5bf2825669d5a84d0197072", + "0x7e73ff12a9883ea094162f6d15bd2592988ce070", + "0x4a97e2305028b93f8097199c7dcf164bd0860447", + "0x977ff8e52103d7c6ac27f98725d2846ab6c8ffaf", + "0x9cfbc981d66e285bcf9a63e45a5b75429f0d546c", + "0xd4cff5248da8727f408967351642fce6fd520f4c", + "0xee22ee448a3a2b6b8f01a45da1476e2d01e24f3a", + "0x7ae0fa5d8f8ff14f86d9db10d63dc3dfb614af23", + "0x80337d2fbf7697a148bb46484197af0915e3805e", + "0x3e92fe9123526d5d91485ec6d79e1c0dd6289383", + "0x1e6950fe92e48f01207ca954b39162191f6a76a1", + "0xd9cb1e83354f0c719b348d5b8ab7fefdd320c2d8", + "0x8f003955507e17565e5087fcca94f4ffc07d16b3", + "0xf9367879604369fbd118ed9d17d716cab4ae62e6", + "0xfd30a1b0fb46749a5ca926351e2efc36e01a34c2", + "0x894746f14ed494a9040a86de7b9a29162017db9f", + "0x90962ea0bd1b0f42b0770da2a990fd98343b15d1", + "0x68a69d8c952eaed033b89382269886972c79ab87", + "0x7f3a4e7e692492db85478ab11a64dd36c0281d6e", + "0xb830bcdd213202126844aa4ccad65d32ef49d336", + "0x34c889fe8043bff05b2b6b71e9e70630261d215d", + "0x4fcc7191c06a231439419a2ebbc3043d772081da", + "0x4d3877abc39d131a39ce21dd0675ad3c1e3f3f32", + "0x84af32d5e321e139da422c5d7e0813e902f2b6a4", + "0x9dc6871f1c1f76d96b1d81ff4ddc381861033b89", + "0xa3347ebf96d49084519f510401e679fabf90931b", + "0xf2707a850d60507e04dc5c65d3d91b45b4bc3136", + "0x6a32651f7d6131a0cab2c649190f3b256f1a959d", + "0x45d436987d56789d3abe37bfe0214cf75998d0d8", + "0xa3ab606ce7fc263fd3c40991de22311a0f87efea", + "0x9884686e45f0b6c2e2d73b03d7a6f3a4e37da034", + "0x9797301e3eaee5ecaaab0c7844f53397c318b9c5", + "0xa9093b1d29b7d94ec3fdff0b696d37a4cee797e8", + "0xb332ed5617e89d1a41810cb1e78b180b8fb19663", + "0xd113a6a043c7c284de9a570171859d12c43a4f83", + "0xc342c61eb2af812cd78bfb142ede1dbdd94727b2", + "0x899c83464e014661b6a2666f60b03e394c6eb3c3", + "0xc35539ff16b60ebc6bdcb376316f638288ccdd24", + "0x3fd91ae5b5c22803f23838a9831cfd4ff7a3fc1a", + "0x9e7d1de1de734b46c6c58177cdcd83ffaf06eb7f", + "0xb0062957f5565090490ac34fe1ee4076621df6a8", + "0x12252ea9cc41b54cea19d61c5e0d472dcb867ea0", + "0x82c16e63be6cd8df11dd1ee946b464dd0dc5782d", + "0xd5f22046c716b87b6c2e97f1aee786c2d3492102", + "0xa28ca23901ba52303e4c37ba1dca7af67da9f8bb", + "0x01657048536e08f7b4fc7f23343c9ef2aab77e5d", + "0x3d3497e07db8979fa062831073ed834fea55e078", + "0xca9d6b05e7a2a20890a2765fc4c4932853e2abda", + "0x368524c20bdd88a5e90e85e5bda52f9fabdc64c5", + "0xea8a73e4e0b7b6c59160505ea5f77722bd1e7c87", + "0x9ea5d5e6ddd7106e912e65c53b1ce208935c89f3", + "0x2ad8d421cc5d185ebbf508185b20183ae665d056", + "0x8924308d083783fdfd3679ac33aedefb969cb1b5", + "0x0ccba1cd50b818cabcba73512c6dbb2e706038c6", + "0x013573fa9faf879db49855addf10653f46903419", + "0xa735e16df1862421117d403bac9f5f2a24e0bd07", + "0xdb82b9e837e55967e7ca373e42b1f49b3eddaa27", + "0x4a452424c0414380ef2476d1f5f8c49bbeab36ce", + "0x0679f54b44c0dc037b996bff72c6862554c595ff", + "0xc40f5a00eb6a298709b6334dcd646a13c8a1fc7f", + "0x2bbd34fb9d1ee34def9667ca34e223740dfa91ac", + "0x0ef27afa98c02ae78249383dd8e216dcebbb6b6c", + "0xce3f71c4671602d20ca766c2805dd85ab21b8ba4", + "0x748ace46d5926cb0c44a7a4456759e0d16263584", + "0x63565663169428048a4c69f278129d1214603b54", + "0xb473b019ee0aad02e213f5f910cda9e2384632fd", + "0x982a7a1ba727315580c9155784825bce235f58e6", + "0xc320e2067b62b94775e246c7c8221947072b8140", + "0xac2f05d8157d17b1807602318816ffc7f542a63f", + "0xe4c20ab8603b0aa41b0e3748406713c5c07ab91d", + "0xcb9f09dfc2a199322061a9e5015de7d78e14e74d", + "0x89fff645fab9e57e1469b8dee7be453f6857b4ef", + "0x8c302250f1f5f4a933b7a62b52e998b0a40c3917", + "0xcb04a666d82f16b589c9ef0807747ca4b71274da", + "0x71407082405e42f5b98573a3c115a00693bf3e65", + "0xe49b6a216bc60ba54c82df285cc7f4071446efec", + "0x32a98f9b6779ad658274bb21796d069918a1e617", + "0x7e19855fc17c96a3515fca9d73bdd00e67a9d4f9", + "0xeaeb4d8b782a8d507c056dfdb3d430ae122ffbd6", + "0x342cc2887490164ff126fc0bac180a26909c6bda", + "0x812d0e44b09e08c5cdc00ad9b1fa124400b1e7c2", + "0xa54d138848ce024a1398d66f2c89ffc742107526", + "0x297353933bbae098e19e453d6ff3852e4e3086b5", + "0xa76c7f20740300505ff26280e4b10873556cf4d0", + "0xdf8af3349c5b36b5c611a138d112505e63e8207c", + "0x99349957ea9c3c4120751018ab074e79c34e0611", + "0x48663e3c3c042d105d9eacb14d6842db2f778508", + "0x985f8c84655cadf4d245e2d075daa4ce8c0c4a93", + "0x5a9072f7393af78fe89a4e12025026f7056f4ab5", + "0xdd1c34dcd4acf9b659ceaf77f433e2fd9cb4db1b", + "0x05baf19c5fadad20da6bec86cc08d7de1563e88b", + "0x51a0c4f21e846423f6c42d4a14648f7fbd056af1", + "0x84d2f3266fc09972215866d5b5618afa5a25ef25", + "0xa0f2487bb789fee0e0b8305b03c30d4002cae65c", + "0xdda4a0608818347168e33f71aea71ba3709924cc", + "0xead9d731ef1da3dff80d1c35cdc2bc45b09f9a96", + "0x68e35a3af2d19af746303109e12cb02254378f06", + "0x00d3bc1d64c219dac04610d69adde6c68f1c4e5e", + "0x4732448a05283ee30c4be4791f1c1bf0db7036fa", + "0xf77b38ecf43ccc2bd1e2b0d626f2167162b008fc", + "0x27a7241d3e41a92b4b194b36588b7237f67396f8", + "0xc79f29702855ba81840687efa6ad9416409b1493", + "0xff12a8c809159ab645a99b40c0a0a123735715d8", + "0xaf2177b3ca4003ff93f59ba82c2623751e16dd36", + "0x859bb79038c20f09a7ad5726e036028f301d5de6", + "0x614d92729e9385dc04d57ffc1ac458056831e0ea", + "0xa8300f68176d727ba1ce2e30a62dc94dbbe360b2", + "0xfaf70f01b141320281c511ef76b6b519816c06ee", + "0x42c22d603a5f90db9afa24b96dd8c3cc758ac19a", + "0xcfcd3f70fa3966260e936929f325dbcd61c7aa73", + "0x4b4996682ac567cecb58df240c485f8348b0b3de", + "0x3a953cf4f882fa475650465755bdda0365298e9d", + "0x856dc4a12f08afa49f42b52f81769a96505f312c", + "0x5f15853d243fbd69035824520fc8fbd6eee26bd4", + "0x68e0ab68eb265f24bf7070da133d9d8588fb5fd2", + "0xfc04f9e8f7410198639135f8e02660e55bf50d19", + "0xcc6052347377630ba1042fe618f848ee8b52db09", + "0xee457716dc2fc83ec4e92f808fbd8afe24294934", + "0xba7ac1952db308b0a245bdb14440ca321afbb14a", + "0x813d9d8964ec16e3137641bc8c7b52440fbb20ee", + "0xbaaeef4aaa00aca2b0f641eaa87ad89188d3b9ed", + "0xc89a97fc60008141b630ff5272d6bdd3375b5b5d", + "0x622fffe61d52ca3cd9df1416c553e511e48eaeca", + "0xf5da0ca1a0aa91b3b8ebe7780ab45f233a81b9fa", + "0x0f05eef21eef04b52ae9eae56c69f168f12464b8", + "0xdb291f03d7da2a3bd6b8ff80172c9dd7b2098779", + "0xd6d5237c836b31a3e41b34404a60a742e5052839", + "0x921b06fde92fe9dba110427b59e176b5ac85d13c", + "0xc727042d5c6ef6b01bd79e68e4076027c94a6731", + "0x0ba7d98e7e9ad7106f8965b7f13bcf156c61eaf6", + "0x850802b92def07b86588daf209cb55ad5b3eed86", + "0x53d6e4df3edb29229af0b846d687ac2ed62ae822", + "0x7d2f6fa4e4e631ae4cb2b894a8acc22183adaf83", + "0xdeb65d87630e975d191ca1f707923e8c8b478c27", + "0x1ea871dbb59ba444e0da8bc0f177a86df20e043b", + "0x1cb3c6b77fde279cf7403a5c0ae2d5fc9d356a55", + "0xdcb037e370416a3390126a1b04c11212db3b24da", + "0x96eb02e3ff85a8809a51090914b5ff6421621381", + "0xc36dd22310b57a928eb0870368ba8c7c74ee6cfd", + "0xedacc938459209a7199fc7c872c357d6830f44ab", + "0x3cbcbbd6b5176b08500a9b0a5d76bd242b195658", + "0xb153c4d519cc6357c91c72d5c2e8bb3ae964d44e", + "0x4cb38b75320aced251365fc55ac29c830450b588", + "0xc4a3d1fef637eecc391411652594433529b41ff1", + "0x40444804dc3902c55eb36a32c4064d103d51ed75", + "0xd085e63a5d19a1cc6048557f967550ac1eb7eed6", + "0x894672cf71d18910e372c7233e5b15851c2f8229", + "0x3f1c99873bad90f997be760f28d56088f497d037", + "0x3361404784905d38e869c693d0c68d4e9183f3ac", + "0xf9b02d106265c54399c52fc581b39a1feb4ba33d", + "0xa79c94b16cdeb98bfb023d76f34208e02962dbfe", + "0x50db96ca88988fadfc8c1f0fb947a739ca04b627", + "0x5b3273050bc61760dcafb8854a9443475d9fea3a", + "0x8d1702606252668f12dbb5167382945783726f72", + "0x878ee9bbe1e54c3fc561e05ef73d189d0e7f0dd7", + "0x17cf117fa891bb5af5542c6002e7bb1646014b36", + "0x3781487cbdbe1e1ab43705e8dd246d97feaee104", + "0x6da5b6d8261d554545c879135f53c5f91d545385", + "0xa5a48b7c9d79dc639a022707be8fd4e77811705c", + "0x9664fad4784981e936bec86739501deccf3f100b", + "0xe4db76df91b61933417e6eb4d73c7d5917950481", + "0x10a09c104057704ff1a65eb69cc0145505a2d40b", + "0x92e3c56ee8244a5905ce896533677b45fa01d74b", + "0xdf777ad077914c37fcb97bd591dc25337cf6a462", + "0x76870e49f749fa9a3f03e0c3a1029019584f456d", + "0xc1bcbb94065e16f243687470b4ecb4c19b58709e", + "0xf073ddc7699d7519ef89426fab000df78589fac0", + "0xddbc04a173686badc3b09f5df56638c51b45ca11", + "0xf62999efd3ba33340044df1fd4747ea2d9d4be8c", + "0x3cd061109d62c4f5e99cb682034724fe86b42847", + "0x640ecf638b885051c4ab59592d30b50aa9ae592e", + "0x8f48dd72a50d6785898f7bc456ed07d7ddddb68e", + "0xdb2318ab7709fbc8e2b384bee7fc687435c11f29", + "0x8ca9f414d832c357ddbcd61f5a6d08e05b2cdf89", + "0xd418306a02da29ca02865bda7ecdcde8b01068bf", + "0x37d6fdb730502d059b174b5dbb46263d7121a217", + "0xb414ae3a06f94e14fdab1175543939a833bd7a4f", + "0x709090a0a58f09498fb83997110c0667caf07206", + "0xfe67d1249e2555a051069ce6cd46021b7fd63f82", + "0x3cf420992ec0e4f5c083eb4dcbc2f55620723fd1", + "0x6095577a3504f6622cc6aab8d550f86d3f348140", + "0xb560058c5542311fda18ac596eb9ebf6450437e7", + "0xa0c8dd6e9365ecfe1de1c01e141bce7794feb166", + "0x6a9c052285dd154317bbb5e0ca183107a7045ac7", + "0x4f78c0b2bf85b0820bdc2657cc8b4e96b1c0100e", + "0x84ba37f7206f25a99cc358f5208310b715a22e46", + "0x7406321f7c8b6b14937bfdeb5544dc1297cf5efb", + "0xb32ba2e2434a3150e1f43cee3b7fdf08b6dcc6bc", + "0x16e6b7b3dc7019accd66c7efef8dbae9559285ce", + "0xc2f3a03c7514d169282ba61ea07e3bd6e46d5752", + "0x959c277194061d866b5ac71040a7ff614c675c58", + "0x858d4673dc4ac79e606d1168a789a3f472660da9", + "0xe72989d927e2f751fd51699c42a2a5917a1b9ab1", + "0xb753d019361ee1d8fbe778127711185305f538f7", + "0xff8462c71c954e01661375fecc2721d38997929d", + "0x81dbc4afadf5213d1629b3b40df367fa1cb2b712", + "0xa9e73395e80664c9eff88191c7fb586647416e1d", + "0xb2e2ac8a02b0f0f68f3afc000d0e5be30e0c4830", + "0x19009fa5e6e54f5761413ae586a81f4e8f893452", + "0x9d4b0bd2e043a4d9683cb31dd9e825cb787897e7", + "0x78c0627905333931af38cf9e16dc7b9754453328", + "0x9845bfddb7418448f291e05554a75be52b5f0db4", + "0x4a373b5702963000c520d52579508139ec676a25", + "0xaec80b4fbe227198720b1d1b82a12968baa0b144", + "0xdefff637771de564fc5c4c095f429a9f653a6a09", + "0x961d03060d07784af06b5affd2e9e32f18e7474a", + "0x956c4c1926cc756a97633b6aaaff9ebab2b141a2", + "0xa670ebdaaa258311a7c33a5bf795f07b97c83430", + "0x72a33cfe54bf5539be29dae80a671dfcea04202c", + "0xdcc7f4d0ee930f6cb8c29c0fe9e9ecb00fddd2f1", + "0xd229e3c872418ecf232808906f9d76d2bab0f86f", + "0xc36be110a7d50bdd3521ded408c3414a2ddd263c", + "0xeb413e059f891e003c19333889f3a8480ac9dbd1", + "0x7b9462c038d48effef99eac261861ce04fc1e8ed", + "0x94a96d42922b4210239bfa98c5dfc17f053b00aa", + "0x89392df30483ae40ce7061221b95edf367647857", + "0x0b97599acb8b98f22d63ac608a0a7f916abbebc3", + "0xed9b052de4180d9b6ccf3d3bd2e94670e4cf7f7c", + "0x3235a291200e3c34bc1fac0a9707ab65e4e7e5f4", + "0x6c3c202a5a0a2ade2b99ac493f27a0611cc77062", + "0x8a666be48ee621557da08ce9cf21ed4decb1e27f", + "0x877d0526b8600a64bd4161bbbae5aa07ad8e2bfd", + "0x24c773e943acc0fcbf9d63cbcb6adca10cb2d8f2", + "0x9603008c578b790598aab865f3fce9f697315644", + "0x6a92a91df9e6e1af31a5376e19a97caf5419bee3", + "0xc5250939ab0e1aaf6680d54a2b2154e59a43871e", + "0xaf290f8b31a927c25bdd851b07a1e44a455cba17", + "0xf1fc6c26e32cba53239877bb3c4ded85cb6f3866", + "0xafcccad490a30e302bbf0b4b90c54ad8c19a6fd6", + "0xabf2dfcd3bac2069cbb1eedf25437dd55e3a72f4", + "0x7a01a7ab5ebd874d0b19d66b5da4cfbbf20c091d", + "0xbe6f6ff1e0142e6e3098b819e8fa81f78716b054", + "0x1a3f5313ebab838c68564bad0f4f52707c48da82", + "0x0239d36aa8bf2390a9e824dba5d34793af8fe437", + "0x8114fecbf5c4ccda1d5001a4283d02eb9ec05995", + "0xff2812f674ce23b68378e58e46a50fa62976107c", + "0xc6e59a2f3aad0aa65779812225830d31c28b8e6e", + "0x7a0531e0eb465ec8dfab983e3b3805a4e294ebbe", + "0x7c06f62ebe95e50cf1e52904527ba79f54e60797", + "0x61256d8baa58620d81bbd08ff26415e835b95ef4", + "0x61bda4153c6fda1c1903a707e09412b55981f25f", + "0x987c2927e78f8c0eb18faa6a9146cb7568f8b208", + "0xc1dc8c6c0dcd24226c721a7e109e4a7c20f7bf0f", + "0xbf495b03b6a5ca2605e3ac49a9a1011f115e6140", + "0x2d1e28d237ad38471a24551bc51fe45eb26bbfbd", + "0xf9a453c734fe350907056b4455e6ed108190aede", + "0xce0d21c47f8498e9aa08222e92f429f57faf1988", + "0xed3278a385b33080776887f8506d44774e97031a", + "0x1597a6106251ca0d4f0a60b3378a29038508b357", + "0xefbe650341207e2e33c27100eea337d359804e40", + "0x6b93fd74725eb032c06665e1a1722057e5fcf56c", + "0x512bcf5cc145cab54f2dc5405f06b9acaa83885c", + "0xbb02a1abb2455efc343ad29c12218e05af546806", + "0x13adb88d0ce40651625b43b597019f9ce3d60bcc", + "0xd4aaf10434a92b0c0990a046a8fdf43ddbd87689", + "0x37e42fcea530553dd722a9a722ba3a8b00a9cace", + "0x146572d75264616e3c07f1070a1ee028860691dd", + "0x320b05e4bb3ce29c81081d086deacf1f85e8c912", + "0x8676deb61f9f890e2acb6b2aa8d15a482614a331", + "0xda31160a4afc898c01a44f2f3b1b880b6356940d", + "0x873aef1f0403b5256a04fd021fbebc307913d914", + "0x4299afaa2c7c630801836aaff371cf0f830caaa6", + "0x71cf30ee4ffea27f8239c09497f4f33786e674f1", + "0x84bd8d49fad8d9c0b0b62250fb8d4da01eee7e99", + "0xd70b8440b50e58ded8367f78a224c2c5f299f9d5", + "0x0c24b2c05b679dab9861f889d84dae07656ede2f", + "0x6e448cd43ce19004eaf0c8af6eeea51652328365", + "0xf537bfcf2ce7d563f235c685f9d4705596ea4412", + "0x730ed2a6ef16d6e2223c0ecec963b13f783d8b5a", + "0x296ec13b8099b732bc41663246f5cfdd579032f2", + "0x79102ceae41ee42d60e83aaa4b18bf8d293bf121", + "0xef4fd55584434903aa6fc9baa61eacdde5355da0", + "0x502a9b1c80e03cc18610eec6a2dd28d862a904a5", + "0x352855b093c3f9e0faa85f512058585c3101edbb", + "0x1090ef088c4832cdc2f5983b64ab5fa303e4c076", + "0x16c5d5ef8e8d41ad626ecb0d2f7b8179f4ae856e", + "0x06df7f31323b58740695b3e3049d233a74a8588c", + "0x3c6e75206c1103f53004b5ae39b9f5648a37be3e", + "0xb8a1c2d932a0ba0c395c60d971c7623a787c7a57", + "0x6a8a8a47cccfd92c9be9d174bed3fc49735ab58c", + "0xa04b6e284416b93e90ac08b21bfa0115b78acd50", + "0xd06db259000e4823ce122a652ad741417ffa783e", + "0x4122903bba5931774279854e0cc441b402805b17", + "0x09b4e49aeeba35d880f416404042f4ae9b3f1423", + "0x7b84d23a6798060bc857da4db38839a005181df5", + "0x10628daf387054557687fae7a178c4009450f7e6", + "0xd2d0b4a6ffdca569eefe045eaf99e53b2efe6634", + "0xd82382cc258bf5b0d2d78e0678ff0854318cb374", + "0x84fb839802f9504ae0ffb786799c33994b02f892", + "0x896e1106a6225bee472a1b5a9e34d404a85c48b2", + "0x4e766c7617b603433b719627d7d8b3e68df8a58a", + "0x8cfcc0273d2bb62183b5ab3eb5cbe2e4ddf928df", + "0xd93bc0404a71112c27a0a118acbddb78901aca10", + "0xa79311089134cd276548b5503c70ba02214908fa", + "0x4a17a58ded709e831086219e91d4cd71433fb4fe", + "0x0faf2a5056b01ce361cc546578a1dbab8488c5a4", + "0xf3618876c224153bf258c94c577c7dbb5a8f0003", + "0x193db18a5ef9a0320b7374c1fe8af976235f3211", + "0x6c7822e2a816d7f8cdc820953e617a217e6e795d", + "0x930fb93d51f93e07d58e7946748f5496890b15e3", + "0x3109c15332f60dc25892111322e052eb8f17e2e9", + "0xb6022dceb5f08361ef6e96a64259cf664e7ee3d4", + "0x34c131566ed45352ba74873ad890e734e17ec020", + "0xbe50f05da6ae516eac31958c2f63bc189d77dbdc", + "0xbf9c0baf3c9156792f1e404410a7dfd6adfd0852", + "0xf1d97e43553a64bf75e801163f59ddb1012f4b99", + "0x332727456108dc3612b59799add3db28a42a021b", + "0xb8442b161447c4ad71c976495363014bee364102", + "0xfb1d7535587f62f4f767583b25332f6c2b370d90", + "0xc2708bd3424a383f4a91b17ab8d9c2321e6a7f8b", + "0x13ae9a8e8295fd62bc8863a7fad1fba82c6b45bd", + "0x0b99363648efea66689d58a553bb015957083c57", + "0x20313bf6f3071fae1f44e23f1aed6950030bd1db", + "0xd39043ac5f169b1aa6d6023ff03eb12c4df9e42b", + "0xfc783a39a7d188dc77449469c19d44a69e5d8c45", + "0x6cb6a8faea1de1a5e3e22e41e4a3173c01289aaf", + "0x50b85ca0557e6ee09b798620aeceafa1848f4fbe", + "0xe4fcb8153ba25ee0c69b0506b54fecf535c04785", + "0xb58e8c38904820a4996f6f81d347e2aedf968c63", + "0x26b40c6e817016bf017de265ef4fb20af2d5de1f", + "0x6b6cd1f7def42a634fbb268dc5541d89d293be4d", + "0x1e29e82b0a95aeabd70ef28f2d24923362a3b4c6", + "0xd9d62967d4c2d68bc050166a71e3c662c081c642", + "0x6c141e97d0919dd114403df4d970bf17f722d1b2", + "0xd0e35782c287620ef9b72459f6504bf8ace006a0", + "0xa1d7be00caefdc15a38bda652e674bc2364e2634", + "0x47b4f2709a9690796037f2234b9200fb568b89b0", + "0x47efc97e84f142a24941caf66dfadbae14a1f9a2", + "0xcf2b3077a87602b9a1721012ed9d9c49d91685f1", + "0xe769e5a130589fbaaf54855070d10a5f1b967b2a", + "0x39e828281391c0ae25b6c57cf0ae78648ad6a6bf", + "0x368e7304bcfee0ca0798a8324ba4db0fa89ef5a5", + "0xf6a48f4ea7c11cfd0100f2cbf7461cfca3f0e849", + "0x77ee032a4c0dca739512191e2f2a4fbd54738853", + "0x9e7c1a53a23aaf2f55b802f44a317f229576334b", + "0x8b854b9f90b64c955224fa9af92826a6ba44b3ff", + "0x065ee8656f3f3268bc8ef4be3333b74c44fc3d6c", + "0xca78b199576811b5078f8d38b4966a7114c1c98f", + "0xcbf3a7f39e3322b968da7e9ef2986e8a4d1a9b4b", + "0x3b8b2047951f6fc568b3b2251e7528e43ac5df14", + "0xa12ae3ebf9a3ebbeb0fa77d56848209ced868f60", + "0x37c1ceb0a9713a0b71279a7c2d2860919f5c4b26", + "0x41896bda9c4a703c7b600852b48f06e6c1bd204f", + "0x70ea12a4e1208fadeb0b4722852325bb9bc119c6", + "0xf28787c76a28b6b32532557a99ccec08f5a2e2c8", + "0xcd88431107b72b1a1aa13de27ab894e27c7d1a61", + "0xb55ef1bcd32462fcf34ed03c7a0f024251731722", + "0x411610cb9f4dd345645068cfac22722631dd7329", + "0x0c57ddfa0e17cf7b48aafb525224843f34f09a6b", + "0xc1d7ede5d84101db0a37c23b14226752badcad5f", + "0x6a2101ae72b11353e4d1c2f14aee7665f8a14a62", + "0xa2f17baac9e5bbeb653d13674302acaa82e3eed6", + "0xe51578e12fad868941c67e258ebf7f122d32c28e", + "0xedb40869ccf069f99defc3520300c28c0efbe88d", + "0xc41d502c314e6b85380a9c719e5adea98f25d3e9", + "0xe9f3b9e68ead6179dedbbbc781e3ccca4f7409ad", + "0x33467a43c92727f2b493e959680f9ae45eb909a7", + "0xb4ec60de5ee53988e98f596655ef0b7110bb8d95", + "0x23c9ea56422606b2e2e7654c2e834e9e6d964281", + "0xd0d142ab2b493af05cc77d94f89e016e5488be8d", + "0xf77f0691ea9106c45f3353c7d78a06d7268e8f91", + "0x8ed5493cc39066006914590afa2bd9f1ef40acff", + "0xb9fa5ed1c45cf822e139f4283de74bad7d77a9c0", + "0xd96cf0add6817d4288567c298e9b7fffdd94d851", + "0xf7524591bd6ab521793adf20655e3e5b75ddc2c3", + "0xc7a7ee964f25ec007aadd1d66890b8d7c15d8a9f", + "0xc528c209de884708355c478aa0db4ad4b83be8e6", + "0xdc7841cd459b0a9bdd7e96f5c3c3d2fb704a2933", + "0x2390127306cb64340414cfa4de3a4d4e4e640fe8", + "0x1628cdbb24fa10195669e227f0c4323a73ca0361", + "0x77274034fdc4c4da58e9c1b4755718b0297fdbdf", + "0x1026df41a10bb5057d4f08261d907893f2d5f78b", + "0x2d55e8b8aa45e302ec346e2e86a87497e8fe563f", + "0xa5ca777d38515cb40e38eb1c7f288db5d1ef4db3", + "0xfb5103f5a1419eff439f3c15f10a0f7aa753540c", + "0xef5225409baa31c9e1aa1cd4a4564c59c08bb0ce", + "0xe495cbe303dbf603c9d58fd876fa89083b9bf520", + "0x4f8e06c8060150001bfefb44fb99884492e201f3", + "0x25ecea54591af44b22af1ccfeec13e57fe489ca4", + "0x6a17fa743e896b00b76f7d28815310d1e23143f1", + "0x140c7d9581cd4b6e29c7c5057262074f15778805", + "0x07f06bab980314fd155aab9d1642ec5aa7872a20", + "0x90e0d37f59b4d3202880d2fb17f3e50b7056f762", + "0xc50e4f63de1cc99e506a765219c951161abca075", + "0x6fec44b6f4e41f675ac0ba8c1d66722811654e24", + "0x21c2a93650ac1016eb462af466877169e197ba63", + "0x9b35a18161fcd4baacee3e9929dc7766c1590177", + "0x86ca99df5937fd4c2d9414eca07391a5eab6dd99", + "0xfcf20cd6c0fde6a047c7adefc7dcb62deb44d705", + "0x15a9731dbc5ecf0b2ede812409aef5af1a95d319", + "0xdd1d84c0b5a43a744cf064395033de23b06dd96f", + "0x62096dc14d63c01d2bc889bfe5b809bc098b6cfc", + "0x4fcf8935586f99983835a2d654f953e0a3016397", + "0xb0af01a1085d9dae4c37898ccf2fc5f558aebcb4", + "0x4bab1f1809ec1236eb5617990078627a2fd7042e", + "0x61acef12e911acc5533b75cc081f16311e4b67a3", + "0x16ad14d08a7826d6fa61ee85b51178dc043239a4", + "0x1b0e84f7261a8911f73f985ed9029ab9f7235714", + "0x71fd4850e1742cf8d781a5b8b3d4079d272a0c29", + "0xc53ca86ce09f5dc2d10c1c8b3fc39dc68fbc6868", + "0x00695660517b2d54785acc9900d1b398f403ccc1", + "0x54c0cb5fd51effb6e415efd908bd8d919c18ba2f", + "0x0a7b367ee82e8a77fb2273f37848d4b8ad77bb57", + "0x6f8b3e110995daf3c3b48b10e106a7860f3ecaca", + "0x64d0cd7f4291ad52381bf34ee9e3e7c748ef5a38", + "0x649ab38877e03ea2cbd6a107451ce4171acb39e5", + "0xb87a6b7ed42a331cc4ba85df42063668cdfe405f", + "0x835bd6a92a6ef4484d307f9c7c2708dc2074def0", + "0x933f01eac4ec65f4f35af6fd9f5e8bd64757ad68", + "0x06277b1f008af8323a2797284144e7b6381a9385", + "0x80370b3aaf16b859fbfefd6fd8bece475cebc79c", + "0x12e95a92b85b2a29fa8e5c8387dd3df34ccc48b7", + "0x8f0fb29c533c535ba687205c2a72536515049d31", + "0x980c94d6610815e236b01740d099a6630f53c7a7", + "0x432074e120ff63066021ad3674f55d8056db1c44", + "0x9a74aa88bbe4409435050d519faeabbd19ba85d4", + "0x6dba9923f7db933335de181b478591e327c9f1f4", + "0xdb414e0d262f9f0fda3ed96bf68e02c9fcea09cc", + "0xc1a0a60b77e89e8c656fb43571600a7ff77fa435", + "0xd0be6274e8a6be25a3e1982cf957595fcb67a4ef", + "0x975a596f34a1b6e29c72db1b4251ae72283754b5", + "0x2db763ec6df5ca04c2560281ceea6b9b4fa0110b", + "0xdf1aafbdf9394e15dbcdbca0068abdabb6da3359", + "0x0d3423a5ac4200b1f46462c1aed807ad13ad4623", + "0x385daab495c0e6671eae371e64b54d845b6a99f1", + "0x8d89c1d507fce1862353d0d0744140ee35e4b2b5", + "0x3db37898b3b68c8392ecd25be05ff8d0c4a1dd56", + "0xa7d6386313355a2a5ea0994a95c4b33b82c33014", + "0x8a4ed21e990f9a7ec4b3404b323bd64f2c881de0", + "0xe7e37da9e8e3f783849b80796b5c811d2213f6a9", + "0x85b84235ab9ac2a0cd45d6cc1d72ba204952ae7d", + "0x838e042bdc5779d0c27fa5d5942fae18b69516d9", + "0xace7c2c094f2e82af0e958106e99f98507937165", + "0x4ce268f49ef0726d602a8b0f22fcc543aa23bb51", + "0xaf626f5ad7127bc384892146002ee24890894417", + "0x47f186d4a7567df0fac30369270f131892d5efa3", + "0xcbef5ea942d5a221c4f066a631c34c0ccb65ec11", + "0x800036c5898dc2fc41876ba6d7903b3108ff6166", + "0x3dcc94073e048cb279bbfc05f2eb01b2d77624da", + "0x59e57aedef1b8ccd4e17ebccaf007e376e4ce288", + "0x59d885c87cf50b93c1f9eb5e961035b1e184ec0d", + "0x2e2050103f91cc190d52050157e6bb5a8500733f", + "0x4a230fbe0fbd3612d67c21642989f27929242be4", + "0x70d082fe0d50ee64c9cce8b25a9066609ceb1a36", + "0x67c2136f0ca4b6696a5027342c7db5d8fb59045e", + "0xcaa96cf16cfbeee6a30cc02e6602e2493215a385", + "0x3e6ede293257a12c8e4e423cef133af26d742b53", + "0x6e284b37a89450f6dd734fdb5c7eb1c18696f5fd", + "0xab8fd4c773f79eb6fce87c0612b0473b2a408e70", + "0xd998171b51dede5bb420228f8ca6e349daf0fd62", + "0x41524104624547f38c54074a31ed2bfad8201406", + "0x8581ac6c23796a83a897414a0c8de11d967bb493", + "0x6fe797a05359c9d91b1f85d418e2ed4ea6c65a8f", + "0xa0fae4df6e6f89842d1b10acf55ea17e57055220", + "0xedb1c0e24bb162e276dac73dd4f7e58b80f5dc7d", + "0xa0ffc53dee7999612ad1475da928c936b07de017", + "0x41ea7e9113bc00d3f7ce54130eb2f6d152bf91fd", + "0xc86dc4cf6f1c59f7b02883b49bd09a09cda04d06", + "0x1a9177cecb89825ff9af7de4c87528ee7aa06767", + "0x90cc11da18b204885a5c15a3b2aaf16e8516ad35", + "0x6ca5584a814471680d823a787eeeb58c1e03e1e0", + "0x50c72800c865fb047538f183852d940fe3fece6f", + "0x08d7c67ae36fa2cbcc0122184011f2dff3467a02", + "0xf13ce4d2f506641cab43edc51257588730d70139", + "0x4f034ff6eb7a7ec6a1048c316459ffa393086cc2", + "0xca9891da05b43eb48e41bf6e5e01d90a938bf4b4", + "0x64588a28fb200acc34ddaaca801d18b83337d62e", + "0x8a765a88683d05c9c1fc9402120fb454dbbd7f3d", + "0x87efd81c0fae64e98b296f58dc4b7c7add2d4e7e", + "0x8a2f19022b96e00dc1430c3116db58840a53f7d3", + "0x5179991b0be532329d0794a7ad9f7a436c295aa5", + "0x248b480924b94441fc53a1d79b9b75a24aef4c75", + "0x9354878efaa0d6d821b7264b22672423e89f0cc1", + "0x838240d027ccef407ddd66ebd335c7d8e83ee61b", + "0x311a818c28ccf7e6949fdf9b48c2731b04680365", + "0x616ed30ac805dae72bd47840bde6f9e8f82ba66c", + "0xfac344e9c979171b4c2918d265e7d36f4ead356b", + "0x38a24a087d4662eabc69cb8d7c69b658c5ac6964", + "0x38a0a1ebf2d36cbd4b10e7afa543cf5d37e5759e", + "0xc36f9ef8ed27d5ccf810fd392485ede434161af3", + "0x5eee923b3d32a369b936e176fb8345464d0ffb3d", + "0xc2568f8894eb66edaddbc023aacedb2e316010a7", + "0x3c5c54a1df6b65950f048a816715b718b6f92689", + "0x2b83da50c013c6e5753c76e5b6aea4252ecea9f7", + "0xb43904a96e12361f8d04be5f210cecf95c0a770a", + "0x1f452f2beea8c1105cd5363b18a0995367a87d97", + "0xc9a9aa6eb8070e01bea2664ae5fb308579589745", + "0xfc1efa3dc8e6bd7127938aabb7df6630c7f153e6", + "0x32e76ce68901e81f6f4f3d0753215ec386c80dc5", + "0xf1560292176a90052d9c77e180726a04ce5cf14e", + "0x73a70cd7e13245cc9387e07a8a059d2e705e0630", + "0xc62751a9f2325f3ccc8cc47814d9ac70a7a26b75", + "0x53a19d24cc5c1c85dba1e9b398fcd4f9a467d58b", + "0xa5d006c9bd0a7689d45cd8c5b1ccaa1b0c9346e7", + "0xb5d561430b51231910d3bab6d60c3c7fd9344a91", + "0x7bc6f4b4e66ab1150de34452b893c0e641706c8c", + "0xc1d34a50d4341c4e9839ee70a772ee68ed03b846", + "0xf2d11b31904370fca59b7243002933d61e21a013", + "0x4157fe6ad673ac3d996fd2effd4b81bbcf061691", + "0x9b7ad9cb6207707cc70838c459d3185ddb4f6d00", + "0x25eef8fcc7450a4f68b95fc4b3e6b1a367e7cfd9", + "0x0346562bcf427797cce8e3a2ba12808240c6d644", + "0x7890dd320e1a0f6182b2659c6de814f8b5712e67", + "0x1c0adf1f864339d8a5055472f0693cc3ac04a5b3", + "0x035dd9460f0d804f5e927883174553d874082801", + "0xf4dca1c0d441b3bdfb64c3d6171444a857aef0ca", + "0x1119c4ce8f56d96a51b5a38260fede037c7126f5", + "0x4e88d716a3138aee4a54bd023992ad24288d9f2c", + "0xa3889ff157ac5344108aa0933fda92f24d0fbb12", + "0x4ba3c0abbd7892f13bb0cdf2f81820b073af5f43", + "0x37818e06fa4805010b3fc0b72c7c2d4cd333567f", + "0x72c5cd18a51d53db34072546a7a38a4f73600d92", + "0xce7dd930262c1c569c6ad8ff23a332be6da2fb88", + "0x0a03862201201ac4080a1b5b3415e51da7d22cd8", + "0x3b138fc7ec06b2a44565994cfde5134a75915995", + "0x31d12b38a8de02ed4ec116488369e966078d190d", + "0xe5cf4fb4add47645a6ad2dc9b463d8bcfcabd02c", + "0x0eca4f254fc1c71995bc9d54ff1a3038b05620ab", + "0xd4381a4429e68d58332424172671d94da92056fd", + "0xfc0591893b0bdb4322d25bdd43904aa9ab137140", + "0x364705913b668b17f7595fba78b4e8888f5927f2", + "0xd2e3be873ad2266b726e8947393b39324a6464f5", + "0xf73456181ab9f25d2ad7a10d1b26f9002407d05c", + "0xdcd135e958ae64092a709dfffa35e49f2370a09b", + "0x2de6cad2e8c9c7144b71fb7dcb558743fb86a2f4", + "0x4a42c58c839b7192c66720eb1bf17a0f2b1753cd", + "0x16f04722feeb47799749b711ed9dd6bdf6f46328", + "0x8c798fc8c713f300ca5b9aaa2b296664336a495c", + "0xf1ca8cbeedb0c5c27907f28fce0d4746b4b11bc7", + "0x4f086192e68bfb54bfeb9fe71cb5d47be0d4f046", + "0xf60844102d69bc7ffdefe9537a524c4bbd3aa768", + "0xafda8e3e2c947394ffcc0db93a6765b6ec83b692", + "0x520768717f317893e749b363399f51bc8a092cfc", + "0x6a1d8d604fca88262b1f7e19b19bb2cd588ecc4e", + "0xb002aa3dcb5bc92e5eadbe02810a2fc76b49659f", + "0x8944e283bdec8b59ec77634f92b772b363dc9ab0", + "0x695c89518637c583e5776a75d6738c241318f64a", + "0x0c881cd49d7ed845b48f345695f3c153071b646e", + "0x8e824d3ba967dee0cb2f31c93a832325a32d47e6", + "0x2579022e3aca708b90c89ac18979a2533fc9bbe9", + "0x8dfb9ffc17876c4147c1e15ff48f9e1ce3c9df18", + "0x55a2f4ee76f9e34f683ff73827f924866f472a84", + "0xfebc300c1a955a30870282e1b1aa3eaca7196c98", + "0xcaf6f13a5a7ad10c57e6c4e234f03924da477263", + "0xb0e1b094b3d7a02ac16f38bbf38a8becd72ecd3d", + "0xf6bb5a9a2d4e19c88a960c8e24b8be5f386b08e7", + "0xcc181ffd7b1a2fb2932c3a416887c07ee69746b1", + "0x06c07aa4029a20f68391695275bcfa9d4c0f1035", + "0x7f695e8177939bebd28467e9d1050a6abe46c8a0", + "0x16d5901e0d22847bc73ea9901e0ce7277ad59cc4", + "0x02e9c76e53f5ba7dd64df582e87b7bcbbd359fdb", + "0x675666e7d3fe5f1eb3e93b233693a39b1a76fdf1", + "0xc1e638f89d5115f9072f50ac8c434cc1279fd652", + "0xf27ff8be2646cb04bb8c4841eeb4fdebaafdaed1", + "0x57734769c21b8d8215e9ffe3b6483d9e6c0e4e7a", + "0x14cfd6b71163360b2a176ea167c2800b2deb8296", + "0x2c83dce48094378164dac267221dda47cb7d4722", + "0xbb439ee88c448b6d051d23e849067c87aeca04d9", + "0x4d079d9495517d4c0b1852606d73854047fb7702", + "0xa090f8c2a2565c2b2fb6e9d99545919836bc2596", + "0x39e99d18634e63df7867287e3059f39b6c6f428d", + "0x6762e837e583d3b80fd59080d151b59ef3dffe09", + "0xdd217b0c5a34bc3f3e95dcc1e4bcf09cc25a0b94", + "0xa2ab20e4aa2cfc44231161c005cbf6fd68bf56a9", + "0xe0278fd380acb1c5e3992838563d2e4b6ca25ee3", + "0xc3a6f32c13d1400ff5cdc5bffd07a29268b7ba3b", + "0x6d39dbfe15aefd0e697b892371be9b23d38bcc19", + "0x6905030bab047b4a65b28db078e8d844b83d6fbf", + "0x689f7dfc8f4c20a47ebcebfba3e1deeae06824ed", + "0xc6f33d25851fe12e22ec84f9ad76040de81f9851", + "0xdb959d63212ab72240d7ba85e98744e14ed70474", + "0xff8460992dd936d1c42646ea26c9ad2fa831de70", + "0xc5044708336f70b2ca286e2d0072ab05dbf7ba16", + "0xe8a63b086cc7fb2f2c4b48ee03de68fc6b517bc9", + "0x80e46246e765f301fcb6940906eb86760e25e079", + "0x3ea1dfe35ea2ae89231b138b0af79d21ac197b8b", + "0xffea74339e1863a958ee14b4478e48785bb23c5e", + "0x6fa05262bf63d4eb63bc4c2a3cb158f1773284c8", + "0x0000ce08fa224696a819877070bf378e8b131acf", + "0x5a7debed4d192486844ebb68226eb84bb97fec84", + "0x5929b404b43e49a2ebbd6afde45294598d4fdd29", + "0x7ca9c28163b7cee21410ca1ae0c00023b2c409da", + "0xebd594bebf68a71bdcf37e5323c779abffc23457", + "0x422872193e79a3054a04385d5479d720613752dc", + "0xb3ab08e50adaf5d17b4ed045e660a5094a83bc01", + "0x056f6bbe01f206ed36bcc5adb2e6c62fb2c51fe8", + "0xdabcfba58b85cf2d3be62ffbb1c9a36876e904e7", + "0xb282057670ceb3ce45bf03e8826a5cd119bf9ecd", + "0xa6c1caa00f60102f3f43a61845085f2a7886e039", + "0x39858bf4b981c4b0c1e5acc79c00d190b20a4411", + "0x7c54aac91b404485ff6f1dea6064182b5ede4ade", + "0xd99323742240c92175b31013c4687c549e1b7971", + "0x78089d6a5749092c7a6075c21fc4d10e1ddbb972", + "0xae70028ef9d5fb26d8d6cd64ffd39e4f03d262cb", + "0x1a7f752a7b5f9b244bc2640eae4ec9402118a029", + "0xa042844a55914dfce9e7b7703539c60da36c4e02", + "0xbb4121ce1ebcaeb4c8b38fc8ddd693603f7ce948", + "0x2b4a694dc834b8ffbdc0bf082854de2ed662bf17", + "0xb22761dcd3e4afb035747dff3ccc131f11109bd9", + "0xf28292392ecbc4bf8b22d0238a6a8e2365b28f85", + "0xf1a1602c90d8e510bc583eabb53667e3afae4b52", + "0x4f9ebc78810951317625736c9783635c343d2f82", + "0xeba17919cb43e0f5ceb4ea2e0368d2fbe440b6b8", + "0x40cd07120ed5972760ffe864d3ed7829977d3eb3", + "0x8e95d467ba7e38cad3f5dad3118abd3237969504", + "0xd1c9ff4da178024dbea13d3a23cb1988a2b96058", + "0x6aff3c32fe19d0e286587de07310acc72270b584", + "0xbf59d21fe5fce507fa45611f2560de7ffdf7416c", + "0xf37955134dda37eac7380f5eb42bce10796bd224", + "0x47a1e586ff610162ecc1b5ae3bd17737883c3011", + "0x15c548d23cfd084a526b905e21a2556294cf1d5b", + "0xfc93276363fc6ccdcf3543a80280e5be562fcf29", + "0xa21c165fcbc96dc9c4ec3cd6077f28c802e2bf49", + "0x6ef2abd2a07afa8326ff276831a46102ab2fae42", + "0xf4e7e6b600286ffba8154f5125420a0f78db835d", + "0xf9bd6c764ebdd21dfb5c275a92c7d7b7a91e0fd9", + "0x8720e0c1649780a332d81dc87039a7383805cd50", + "0x34ccb3c7461b62644ecc9002a69b9dce7a7b40b9", + "0x1a59ff6ad0ba633076236073015cbfe70bbbd801", + "0xddff05414d45b1500a85f74d00c2a7c8916715f9", + "0x5ffb004c2a93d6e46c09f75d1565350f92f65c89", + "0x35b35d9ce134ac3856314c04c9bb017e17dff9f7", + "0xab4b3e2d1c42f5ff6702200c928f53fade6b052f", + "0x6a821389c03a874a1c800a140bc7e2c17baae1c3", + "0x4936f33b7b060c7336fd0e4c61316ea248da6827", + "0xf8c44d33a1ffc845706e4cb434ad44715379341b", + "0xb79b013bc7c5b11cd3164236ad33c2bc66964da2", + "0x076151f6f08f3bf697f9fae626560a71b7666231", + "0x0bad412e72ec0ead80bd5441f33561ba59918e04", + "0x05de7185d0a89c40ef6a4b684296debfd2e7bd0d", + "0x8e40d8e1df6f02841a8047e9c281780ca6b5a976", + "0x086fdf7811c3ddbef2c31677d90dbeb5debdf64c", + "0x5b5beebed201470d3864b835db6f96bbe84bb1ec", + "0x77fe5e8e2be8d93a73ed097a70e1c915292b840f", + "0x076e070656c80831e2eb63818758d6684e9cb7e6", + "0x01811a9e3b5efe59224e170f3c81352c767155c5", + "0xdcbcfcc16745fed13d33fde76d6114ba2cd90da5", + "0x59c37e94da9747052d4c051d1832bab10d4af2b5", + "0xc3f17fb37166f7e718961c3a40d8e34862ceece4", + "0xeae82f73272c63ad1632db08024483c074007616", + "0x8d94da499b912e0187b89a1f72e12ae0f6a2b0dc", + "0x19f1434d6ad61fc5fb34dfd97be8a0fe61fadbf1", + "0x589a3e993f6cdd43c6c6804acc6f54017eca1ef6", + "0x0edc2c64d952e75241590ac5fb10077395f93df6", + "0x09ea73c09cd51ca439c0a6e6f36ca35449ce7049", + "0x0b2bd7a36bab75d62a5d9204af6cc79fe63b8699", + "0xfef3ae0ae107a4aa55f5cbd3389e5410de486df9", + "0xa8e105bdd3ccee13018f68d6cd8a92ca02a6af01", + "0x64faed7ca1a2b08b7e9bcf4132a36059b88831e7", + "0x51196eb52e024e70aa7abeb406fe7993988116af", + "0x494e1393f64b30b79060cec0dfe119ac879007aa", + "0xf329d15e72a6abed9f9290f1065312819f43727a", + "0x34500f59a6256def14d5cdcf1e8847edb8d4ce3f", + "0xa43792fe3bee6e67ed1808ff48b2e669b010ce52", + "0xe85e076f1409e23765d5c98591749976ebb799fd", + "0x5ddd29734a35d23cf50ec0f68106022a38d9917f", + "0x21bade5d0df83097539037ef3f0bdfc41885abbe", + "0x6597f9f67ca7dcc9137b5edfa828e214726b041a", + "0x0aa67010ee17f2437ef8c9549f9955997dcc17fd", + "0x12e0fd90921a1c25efae112ed008b779fd1177e0", + "0x3813b7b833e793c4a66b4490e6be6447f6799177", + "0xfa561e5da14d2ab344e1042796656ee8914bdc4b", + "0x9ab18f2a557e0929f4ac19c1c00021051d686db5", + "0x010cd99435d1b5fed3001435bb37b98195efc339", + "0xeb7dff2aefa350c2b96509053f3376bc1e4eb887", + "0x46bc9b0050ba40b70d896d6c9b2a65f9fa856915", + "0xf626e9a2fddbf55b0b1a87c56128a7ba6723a85a", + "0x4371fbce7d00d1e5762cd73da4923fb2e9701f4f", + "0x7d1d6c252ce9afd4fe1a2f886f5010c0191a4c76", + "0x8085a742a5097ff1d2a834eba04ceb844eac5c26", + "0xc8e822af686559472d7105bed6e779e798e1fda8", + "0x8c797a89291b00452d0d83872e52105733a7fd89", + "0x4b5b279a38d682b1fb64c7675074728aecf417bf", + "0xe46e667bb4929451ff2fa000fc566dbdf8f1e928", + "0x84b030d96f9464055a3eec6041acf678056ee9c0", + "0xa736612552d8a56c4b6524b36f2985f46c6b4847", + "0x702e124a72ed4345343d8f4577136d957be2e819", + "0x2f45724d7e384b38d5c97206e78470544304887f", + "0x29fe102042248ffe7658f87cd77203941de6b083", + "0x6989428b35ad50fa44c0cd95027c452a8bc22ca6", + "0x49c2a145d448d0fb0f8d7562f8563384bf9d6d2d", + "0x604a6661b19bd3e97b403225be8760522e901dd3", + "0x7ea5031f74230f3ef674a9f8207e2cbf0cca61a3", + "0xb136d7643a612447eb603c051c193fdead1e0e37", + "0x4b2c88573f8f2baee29d5a1b68651afc868475a0", + "0x90ceeaffb3da888d32b02cf359f9e6a44ac8fa29", + "0xafb006c06c82898c4445557586b28a67b43c45cf", + "0x9eb01b53c4d1eede2686f15a543c52fee207afd6", + "0x24fb26df76e505a1c21a603ee91b11814b4d1037", + "0x4c227f134dd0bcfb004555887ed402837f22dfba", + "0x162c7dcd3851db79265f00b52143ecf8e770aee1", + "0x177e412822dd23bd0edf85b21865c5792a3ae098", + "0xc836373d902c13ee97bdce257e1f9a721f684389", + "0xb4e385afba84411e87611dbe8d6a1de4a49c61cf", + "0x5daf640e0b5fb63750f528efa3113e4d2615b2db", + "0x82a6e4de8d398e8779ed965c437958f8420bde4a", + "0x27756334f9dd3c3c0820e2f714a487158d2d4340", + "0x7ace575b2c198cd9edc2b46f8960369810f73db5", + "0x98d3596469dae762894c1c3b3c02e556d296685f", + "0x9fc58d3e0d4a37b3174801856c3208072be829cb", + "0x2463226242f79fd356319d7f431a4d5696d58308", + "0xe50322e148259806ce349e274d6d4594c3dc9762", + "0x9a3bb2c85b3a173fb760971447934e3c1b7dfd10", + "0x83d0e6caf3c310d3e8bad6dc8f978aa30c3f844e", + "0x480817f6e0451683b52ebfe0814cb1be48233b50", + "0x98bfb4d8d6f266a792f1aa7d2b1ed045db7ae113", + "0x01b630e4c8c64c9abfd843c2c7ec3b0fcd1cf609", + "0xf8bb93597d1d4748e4fddb0bb8e7b6011bc3c689", + "0x64fbe1f7e11f55f525922f0283f3e01993b9d574", + "0x1faaf2d0c1c0997a6f2d52931d2561c55b5cc6b8", + "0xa3fc59accfcea83c45de3dd5511552f089fa9148", + "0x8746cd54fd7e558b552df4249e5fc89fdc894e5f", + "0xddf403807c103624d3ccee729a88103f3fb55cb2", + "0xc531ee6b5cc1976e63fdeabf2b65466d81932ed5", + "0x408c84c59fd8f6d5e93e0041f69e7a2c89636e6e", + "0x313d3a6b5be58bedb05daaef051dde7dfc1589cd", + "0x72cde48df4ec2e2b21e4e7ff39bb99f31abb1501", + "0x9b54ede44b624e057aa948308e0c10d91bfd59e6", + "0x29222be8c0174c3da646480e1603dad96e73cc0b", + "0xaf75a6806495060cb4ce03b04ab0a3a4668f2867", + "0x55c5c4aafccc958c56d10106441c354895702e88", + "0x8a42d2745d354bc6ece9699eaad5185555666440", + "0x98dee2f43682a89f1c8405adeaadd47ba2de20cf", + "0x8d44460a87cfed2620e9fdfc8826072c1b82f2a4", + "0xf4e01cbf18b7d2cab7a3305e7ef325321a15d70a", + "0x67468fc7f9f9656ce40156516f5839a2f8e67697", + "0x8366782726afac41b1b38761094f2d93cbb8e2d4", + "0x3f2b1e712a9d02557ff3af283609e46ef75f814c", + "0xfb505aa37508b641ce4d8f066867db3b3f66185d", + "0xabe525a35efba09970f6f9ee5f6c4cc09d8001ce", + "0x852f40ec199e66e0984fe364e10f09e5c0b4c78f", + "0xec370ea22470c0df56ac258e44380a5766ca83b4", + "0xfd6f96764828ad37e0c47b6833df43644b1f1809", + "0x6a915c4c09a1bc640838b383f606730f9303e8a2", + "0x34751582f079853ab2df4685ed4e3a66b907a6e9", + "0xcf3e45b271ba78923af1e287159b6667a1867a3a", + "0xfbb67d7a1f28a08e8da5c0c196c783f9849b5d33", + "0xa408990221602edcf1189fa465e3d1d5a1d7ee16", + "0x152ba8c64a8d4543e10eaded325d8cc9e0bdb360", + "0xd9ef9aafcfe77edba15dc99fa3ebfad4819a4e35", + "0xeced3ab184722abe1c8fd143b780adef29b60666", + "0x3db5858fd4563bb40205efcc472a15424d05eb0c", + "0xcffd40bbbfc1628258050cc41c1ce93190868937", + "0x11788d5956655c7b65dd0d0684635ebe4c318843", + "0x016d13e3e6e5704cfd472266f790c6d534c28dd8", + "0x2e1bfb63fb937b0d8b5d48983c640677c5cd7eac", + "0xd3f4129336be7e26180c7c0093602fae3b9c88ca", + "0xf20cd8b807426a9a3a8f08c5db10fd61dd213458", + "0xe61f250260720613972757c9e6b09ba286f686bb", + "0xe573b11e8125ae342270ec94c3ecc3f7fe10bc4e", + "0x50d8a7d11dd71a0e8a0112522a76ec191a04c4a3", + "0xc91da052bf462f225878eaf42928ec0c5662ab2b", + "0xf324adc872005197a6f7dae214d3b63aa0c3625f", + "0xd3112764a7b6cd1345eb10f7fe953e8fb878ac32", + "0x77b4c9590c486b0b8d32d526a7deb7c6364bd9bb", + "0x76d7b3bdd07dc617fe87a203493eb21464f01013", + "0x76a8d26b61495a4a8f60e08be83912194a820a5c", + "0x13783f40743729a5180a200a07dd8c6c0ea14bb6", + "0xf3a1b94ec1d4dd8bab32e39c435ded305cb85d72", + "0x841f7a1b93a3d8ab0bd053d1c37aea17ecad0e11", + "0x5fc1ea951402add65613e0437ce59d8b23442e2a", + "0xe4b36f14293a9bae0088f043a8bbaafe3bc5fa52", + "0x2cd84d7b6b94061683573c480a4ac3d61d3e0327", + "0x802dbd9af9055c0c8c92c610106618289d31eff9", + "0xe1ca2e40c24a5433517269700eb8fe5e18deb6ae", + "0xfa2abe5898a38833fd65b94c113bae2e01a38732", + "0x3fd30f448e3e57142c62a6ab50bde9aaee37ea83", + "0x765ab5de8a34b6edd66406cad7ac9215ae8402fa", + "0xe6ade6b98be379c8723a5fcd62010b053a4941a6", + "0x09cc15dda77789d42c0133c909e88fb6e3af793a", + "0xcdd639916a5b679666ade96003123089cbfddd82", + "0xdc50f28826c6ff27239e244a1b6289fe90c42672", + "0xfb596a0b549de79c96102dff4e25a95996743c15", + "0xb295d0d7561b1f6e02b80dfce3e591df355d0592", + "0xb3e52d6495918f7d9883646330736ea1f3b9293c", + "0x34444df0237a38dd4a72bfdbf81fad6c420bcb7d", + "0x2dd187696da9813c6cb72c1f4fa6661a4d5b7700", + "0xe4f4f3884aad998bcd833267fea997e5122bfa59", + "0x2e099cbd558a1c54b3a448cd42f531f31d1384fe", + "0x7833175e5aca23ddc9268ec43148a68e3389b00a", + "0x77e8703415692c6aaf9debad0752b6f72cc8670b", + "0xbfa441a2248be42ee1976a8418b37215713063e5", + "0xe90330f513c6f82eeb7780452004bf5030a697b4", + "0x8a2c7a7e9c8fd7134ecbd11513c4903bfacaf678", + "0x10f6b90802e79d3789f89c1408f69ea94e7fcc34", + "0x98d66c7fd6414208188d1c05515d89bd804cdd3d", + "0x69067eb22ed3b600b8d90697b17185ffad201987", + "0x5291664b3e588ef3bb3e47137a582fd69eb94283", + "0x42e9ec71d4abf12a0ff4b64abdeafd0f54d4e872", + "0xade62b4cb00d520407b416a139d075f24a8e17c8", + "0x5a7abe3d3ae23647c0418057419dcc9a04689430", + "0x8f05cb7b83bc9af46a9c29fea57a1abe78802747", + "0xf7281ebf16feb173a91c70161f8681b5c8ef8288", + "0x2eff2ea5c9eaf324bf3bc3290e805dd73fd751f2", + "0x5f96b4b755f089e66cb08fb5c40964559a14a11b", + "0x1ddc53ef58a7b6760bfe03e07cc77b624ddec1d0", + "0x75ab498536b0324b374feb02b21a4c7f2e4d59e8", + "0x3596e86aefd4c534494e87c1528aae8d125680fb", + "0x37cc236ba1ef276caaaedc3ff07f0c25d68ab7e0", + "0xbec0b51068dea59f93d36e4db68a2af949b745d1", + "0x484afdd6ddabaa5393b766b80e1d10002e400a04", + "0x52aea9154f3f74b3cfecd7d4bc8f27414b6bef73", + "0xf6ae6a97ae4d6c0f9bb14ae78dcbdd9015571803", + "0xa65797b15300423823a9eda713d41752d0caa970", + "0x7cc427162fd0c489ec11469565865eef7c032f9d", + "0x72e8691456875b835fcaed87c446b227f374d0b9", + "0xf333b550ef99ec1f104fb163d26c0905859bde35", + "0xa0efd27acc781549d5b78e89e561aa0903932d56", + "0x15691e4db66dd8feeba5f32d0dce39e341359578", + "0x9c709c02b87072c8599c5416617fd259d334eef2", + "0x14c5fbcb7511780102ba955b1cc4f49ae1d39bf4", + "0x6ad4d2f2b610864702da43122ccb108b6d8003e6", + "0x803b643789bc897aeb44260f25127c9d0bf1a628", + "0x080635eac6dea6d82766f313599b853e9ef6a892", + "0xf644f17a9085b4c9c61ec89d12dac113bb755bbe", + "0xffa8f63a697fe6548a91fe1585e14e5de1b9a05e", + "0x7d30db5b2edab43f7a98645e9a6a0e4806d29ae4", + "0x4532280a66a0c1c709f7e0c40b14b4dea83253c1", + "0x4c59e1b80ca11215c2a53b39651825663048a7ed", + "0x092e3f73c34b68557b819dee465f7b67815d2ac7", + "0xfcf1105be8268eb849aad46cbe1ca68005d48e4c", + "0x93ace1f7d3db2211f9fe4adde48e0fba0404989e", + "0x169c36ab6ca542085392b85c44a12f088f6c5446", + "0x48f88a8d8e4a9dff33c0a4d857a81a189c2d6e07", + "0xd7879d623f1ebe7decaf3be510234f361bdaf06b", + "0x5eb5b575c191b1fb27dc87954af6f718b48cb1df", + "0x7cfa807bffadebe5aba8bdecc4d1f52228ced5e9", + "0xec9868f781df3a1ada59ff65de8306b3380726bc", + "0xc92c4df3dd076d3ef60f2c6c533ee16616f4d8a5", + "0xc2e1a46f1f349156fd2d53d90e786acecd9c80ec", + "0x2be1a753b1c0562c4cf35a24f6f62619961ceb53", + "0x9bd6566ebaeb6a18ba5394b8f8729c1d11133b3c", + "0xfda75454e115fdd101cc6e8292c9f4991145cc99", + "0x086d1c19ebdaed8ecc37d4c35e9636407fcdd0dc", + "0x2080a7b3837218d0f04813bb187e617e0018eeed", + "0x81521bfc9bccba5553a9936b704e2dc28b2edaee", + "0xd09d4532bdc6896aab56f0788938ce46e64fb66b", + "0x8cb1f920e437791a97443cc81b62476120d30e40", + "0xcbbd8f4e703cac68bc3ed9f9e9f489684dbedcab", + "0x49b0a78e22e0b55f91185e4dd38bc65791edfb0e", + "0x7fbd935c9972b6a4c0b6f7c6f650996677bf6e0a", + "0xe0703833798cef035ebb65896d6f69db8d805722", + "0xe1299f1cfba847259aa834294864b0ad13480203", + "0xf594b0a876ce969a653ef065507643c49c040320", + "0x210028afce3da801d781c4f6d616cf3b30c85fa7", + "0x72c619dc0f1591d21a77ab95f7ac2f768726b758", + "0x26395bd8a930879f05efbd2ec49a9e804dfe1822", + "0xae69116e4aa49645f78c1fc9f28f677aede0d153", + "0x7314f48b229909b088f6c73353a5ab1dbb00385f", + "0x946ef598032d63368e131e43ef57b805cf60d977", + "0xad0fc281ac377794fa417e76d68788a56e3040f0", + "0xab2319713337b443b4294b25659e5a165c772b46", + "0xcdb16885d225c8e955fcbd2b2135160b3e47601e", + "0x2941de336786e81a2e527d7745757cde4be82d18", + "0xbeb9af1371749c95332c513f09949f3d03ef185c", + "0x9ab773a84e0acbf2f793b1ec267465293208dfb7", + "0x72f24ef0da728aaa3c0bce3c0f9c08e4e3ec68a4", + "0xd7166a2e3d1e0b3dd8a00aa82781b89f917d4edf", + "0xae90a9bfed8649916f9071a9fa4143cf61529756", + "0xccc600f1abd8b39291e00451f3c2457120563fde", + "0xadcc8e4661e282705710492efce1da107c7fe8cf", + "0xa345ece26b2ed3a6bc40a98968e31dbb8662a7d0", + "0x4d8a6e06a081205404bbeac1a0ef9bdcb29e4858", + "0x2d10984365d759af1d5695f0ac58a22b4e966853", + "0xa103a6602b5d24391c26f512f5845313633c0e8e", + "0xb5dc5bf5b0a20f5a89afa5b5bded05ccd780a0a1", + "0x934731a8209ffe44795d70264d2cccea08f5c934", + "0x1d5ccdeb94c2fb8d62e09d8ffee575332ddf75ae", + "0x55c2f0da86ed3fb34ab7d7af4dff521cdceafacc", + "0x0f560d3b9a4000736d41943968181fec774322b3", + "0x9238dcfb75ce314338e8884a438f69f2cb1e12f7", + "0x7e61153ef9515e322a89650f5d532face9909ef2", + "0x032d2325a2c7d954f1186a6892acb8518bd54cb8", + "0x509ec750cab3c6ae4989d93e1a14cbcbbf8972c9", + "0xc40ebdc95e9fae4ada1a2c5093d0599afe0256bd", + "0xb741435689cb5f7b437aa8befbd7994c9e54cb7a", + "0xc6cbcb335ffc1b1f8e29b3e28e85678410ef0c1a", + "0x7d5efd9ace64019411e51c4ef2eaf3a0f5a680f3", + "0xfe73f99a4565bfe71c5031ff26b5f65990cf1666", + "0xd6a89047dd0d47cf30c99fc36265d2266d0614d7", + "0xcf1f1d8732bfb6be3a593b1f38edb124a9a91d50", + "0xf3cebf303d9e35e8d981e40cc22896a7873147b4", + "0x48e3b6a1fcbceaf45092545e9077a3e2c0e4bb14", + "0x3b6a66017b75f04e55c73664dd6a9cf2c8027e0e", + "0x4959e850942979e9d850cd45d0fd4028e54caf18", + "0xc49f2f72d1e59e5f52d13e1c86f563d85b3db1fd", + "0x6991e33844399ead44182159279884193c889462", + "0x5d0ba4e2c55da1748b73c523bd056985c22496e1", + "0xbbd3ddd01486ec8974cfe28336453bb35976a5f0", + "0xe4e8301296bd883515d539490105b1c797c52fec", + "0x6dd95fc28d5eca89e8170e609e46414a829b0457", + "0x88f19a53dc2bdf5a8e48193050d1da84ffc5fb2e", + "0xb2af7425893285dfa3f536b2fe125f8e86b36f0e", + "0xf0dec3e7c4e941e75b0eb92f5dad4f4eb680c29e", + "0xe3c7cac808638e401cd7e77194c5356110b919f6", + "0x088302305324d242d16f26bb0bfb0fda7632f46b", + "0xebe3c0b0802fefe106b3cd23dde1e4b0349db490", + "0x0778260333e641b1f05fd0ba91d697966c6ad211", + "0x899d6fdf6d0893c286369a2b7539dad388a6398d", + "0x86b3ef448b52ef00a148a16a78c766c3e9079dac", + "0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae", + "0xb48cf81d8e1e2251c9211d786fb3aa08b2d9a9f3", + "0x01f3727257e3afe6e3723f6b9cba795ef6815a44", + "0x5f241d03e5870d3c4b680176d3833b497da59559", + "0x43b318b1abea2edc2aa2ef3ecf15b07835bfd008", + "0xa3d492b7efda4553dad969a73af447a181f5c840", + "0xd9719f96034516b6f26ef27b6fb41570e6231a77", + "0xcedd842cdd37a2b274d6717f4233661d3ad635a4", + "0xd91b9fd499513e79a4e96d9cab0b3f8059652143", + "0x02e6c1d540d17bcd8a47596390e9f1d3d25041d1", + "0x2c73e3e39e897c234ad2cfdf5fb8cef307b9ced8", + "0x912c6534b6527afddfa7026e06546a429b0ab8d4", + "0x5c3b6880f6e8fc5e63233ff8d197164bab8712d5", + "0xf51e7e7654e227ae8fe3a274f805c87b274ee589", + "0x3148aebfe57f2790da889949f9adcedd7b929d40", + "0x161723652e852b874ae2e472bdfa94497cb817e8", + "0xca26f58a0a6d0bc06354305f46c4225fce7aa550", + "0x30452f6b44ea87a1a9dd518feb4f5e292bd91e1f", + "0x3c2e4df2325d13e4ed5a434f3ae1614ac091759b", + "0x44b465323f4fcaa88c2fa46df1f6b737b3bc3a0f", + "0x216a1f39d4ec2436e1d5e4244432fd291e06de2d", + "0x41e5bc18733edd55bf05b432db983df3939aebeb", + "0xca4dea87dd8f973d0ee8f0686dbe22b322b8ecc3", + "0xd32b4833802882907ed42e3ce1fe327eae4b179a", + "0x1e55d42ef853b84db656530067dd896f5b50876e", + "0xe441bf0f2231e5b95d80d3a4fc9695e1c1a880e9", + "0x69747b994fc8876bc4917a45e19e96f595668ae7", + "0x0821fbb5e87d3351542602364398c6531e9744f6", + "0x4ffd0a59a26cb2aa76d403215e4cc2845c053994", + "0xef60654ab2fa6a8eb26829574c9e63c4f29838a8", + "0x2fc9896cb056cd3f28716ada06e509a1c8fed40f", + "0x529f4c989f0298467b96d7f7c013e929ed24d5ad", + "0x0861df2e9a325d084409e433c5f7ce874def0111", + "0x975c0297184edb399bef3b04a02352826552ed11", + "0x4c4b46abe88f996d1b3b4a8fa41876535675ef1e", + "0xaa20d4c39c16bf1091ed532a508f8a254d3e33fa", + "0x5c4178ae5ad87ca39db177ecfa1ac09811df8560", + "0xcfa01848d1fcffc648badfbd0781890e1ddc42fb", + "0xc2af741efc6642d437af47e59887b56a3d2ea2f6", + "0xdba2d73de6290e925945965f20fddd587993c21c", + "0x81d03b3d6b33bdf879b21c15e8d017b7c0568c47", + "0x4f53cd16131aafc625f013ceaab31f4fd5f0a73c", + "0xfc125d1c5141b324cc2603211f452457483c7c5f", + "0xf4030cd3b27e279d011c88e6073ee6b903b83d36", + "0xeb70e5e3a463198a46d409b7ffcb218ae9cd1fb3", + "0xa1ef3a92666fe057c545f3ec852448bba3ade82a", + "0xcd160ba6398fc08bc416fa5dc0d73f2485950260", + "0xc08fb49c038625158ef4321a6885206b6026e1f9", + "0x5942bd85db9808c68f99b06342057576cc8e4d8e", + "0x7bcdc4b45d9c186d31b958d07c913168759386ac", + "0xc4c64c832652f0a326e67e604f2cf6e6ffdfd928", + "0x8e2f0c42d02481481903e32f8b511a22f308c07c", + "0xe7d5c7c89421529b2db74f84dc51560a5ecf648c", + "0x055cc85e9864f755e1e15f5ffd8d6c501f7ffc84", + "0xf638fdacd17b13494ed38014765c575111fcfd75", + "0xc3b03edc32588a9399e3d51bfbf3c1d73959ccc5", + "0xc8ac9db49739667a8f7668cc232035ffbf4f228f", + "0x89d150a9cd83cc2a764adb64637cd9e6851f1f95", + "0x29675757a2ce3c7b8785417372bca1047d19bd5b", + "0x238b8466cc6e82de2dd22e1538b30851731e0b10", + "0x6e8b1dc1a600a0091c9cf9ca5738a3d47f84a936", + "0x2bb55cc19fbde019725f6860b40099c30986ca32", + "0xc92898b9139ac76c651e2b3736385ddd35e634f1", + "0x4f112657ca25b7025f913005333a0b3544b4a440", + "0x5246925920b2d3e9e06de0b9c9e618e5b5f4b15b", + "0xaf3d75ac07863a715de23954aeb26f1ab1a6cac1", + "0x4d81ae731e44fef03290fe91e3fa02aad2d35ab3", + "0x9ca4efc46bcef7b8884530f936ffe0f24e3bd57b", + "0x4829a274fa3a6bbb32cd99d41beed68ba8dee728", + "0xf90457665e5737738ba15b538d77dad72684b897", + "0x9822b1267b474b245cd340c4f3a547bd7c5f89f1", + "0x2557a052e8a9cbad8b47b4d4d4b98a95b00ba45f", + "0xa7baa7501408d941157f0c1dbc6fb9f363d20a0e", + "0x2272b6749f5fed8b43df1f8ed62919abb445ad2e", + "0x7883a21a47ed33b7331aaa34364f68f90df56cba", + "0xe3120c4be2ecccb073faf5b6b5a917cdda70e7b0", + "0x000666f5f68b57c6f9272fd1342a4d55b33b4841", + "0x965ef37cf5bdc377e0039b05f6fd179cb922d0b7", + "0x89b7e599630f11fef1a03d5b99500e0c42c617ca", + "0x864bd34e738fd323c39587060c2445732368d572", + "0x6cfbe7dde034b29fc4ed076e44ecf892d6182ed8", + "0x4e2eba544775f31539601bb772ce42ba14882621", + "0xedd7d270a3ae80a80f180340bc1978eb884003d0", + "0xcf8b1406cfc9749518b908b19d81c45607ccf162", + "0x592fd5d5709baddba2986bfcd62995f45e0ed957", + "0x39bee30c950bc834a96582bcb6ff6753d10cf118", + "0x23e817b3982ba0e033dab4fa1b47088418ad6b2a", + "0x6102ab47d91ee94d5a3566241acecafbf8934f5d", + "0xdba98af6143c8a4a0f8332004a3c824e16724af4", + "0xeaceac3fe9b210724d19f151ffdba42c072333f6", + "0xf193c00a7eecb19c132a38193d6c559463d0feb0", + "0xfef6785427c36d2a5e122797afe4af22c97d188b", + "0xbcb013cc879efc4a04178812304b69f456900cd1", + "0x51e7b8564f50ec4ad91877e39274bda7e6eb880a", + "0x9d597dd868e272dc57dad552bef74158891f9c17", + "0xba45a50f4c44a1fde2e0e61032f1efaa90dc50d5", + "0x8b8f96a32b475b99d427af77507f3ce0188e8771", + "0xa077b54582e5d05de3873b080ca9ed4b59acf015", + "0xd54e3489fe781b1a02e777b882cc20ca2d9bbd95", + "0xc6dc5409a9d87ce19c563bf6ec005ac2bfc33b89", + "0xfbdf7e9796e40cbd16dfeb0db13c9763ede16e9a", + "0x76fc178033b36166e66b9808f8c0b170a780a76d", + "0x2f186d06707105ccade930adc55ec7d35a189c98", + "0x7bff6fc88f9d621cf79c00f04525ee5aeb9b40c5", + "0x4833e07b264d9a4ac66e03fa932dd242b508d73c", + "0x48e3b8397dc989109bd8482cb650e6991d437b5b", + "0xfd8efb8dd164ce0fe4a3727bb6fe7bfe68ed4f2e", + "0xeae356af102a59ac0b287fda223bc0f1fc18131a", + "0xb4b9e9114821dab1471fe8d7b8f0e2103cd15142", + "0x74ad339e9b1ca5ccf08c632ae8d28e93122f57ac", + "0xa84822e62fb1ed2404ddc1ec838f74cb60a00fdf", + "0x3ac031406f85eba336a345538f817ee0225d203e", + "0xf08006e55393c5123d6f11347ce0f8e6c6f9f021", + "0xcd99522843c57364be6b8a15082521361552d303", + "0xacd3af6b3c9cea661c4e7532c988a1c3477e64c4", + "0x83098c0d1bece9aab5d7c495a52574b32de3340e", + "0x2ae031092631f9aa4c1bff82648374437bd6fac0", + "0x48aa556147c6cb7f6eee0a021c1f747a21787c9c", + "0xf13e302377659bc1c765c27649e8e650456833bd", + "0xfe0cd8cc00b29fa3ac8c81b45e58fb9afa868e18", + "0x46a3b7dc60b4c5e8aaa5e33b4e4829881cfbb084", + "0xfd11584de1b26ce18b561648e3be9f0bdf952bd3", + "0x49d67261f8d117ce9d933e7f3e3c2390e9cafb98", + "0xff2b49ded1655bb2bde369cc56437793b6baa8e8", + "0x772d17a64548937d741c0671b5149e2a13f7ff51", + "0xc49d080c950b22dac2666d6c3b1e9cbf6ce3865a", + "0x14d33583e9e51a15bdea10429cc2aa24ef7ede77", + "0xa0cba090c6d5d93277b0ab641a66d119e5f1c2aa", + "0xc42ef38d0c69247932812d6ea8ecd9d851b57017", + "0x393c570a234ed0987bb3f2fedb3bc734a8b991dd", + "0x95b44c1661dde9654ed4868e648cb41560c64e20", + "0x5362fd4056bffea276abf67fbdeb99e64873c715", + "0x5ad155f38d36b9f60960afe75ef1b58312c53014", + "0xa3a741f0ab2d22090f17110cf9c2291ae2c85f8f", + "0xf8da7e77bfce5a1bfce9e97742657b3a99048a20", + "0xf4dca32cc8140334a8a0a99c8e4d96ce3a7b60c3", + "0x6cc47e23db1047c1e9f2a2c7f5083ea3b469ceb9", + "0xb7ef723386959f4e6e97c3b6383479197a516513", + "0x102c3041839d6f0b648e6d348329b8251fb9903a", + "0x791df79d5ad94271e78c6fe695c5ac42983f47fb", + "0xa26633793f598fa345aa8ffe0f6fbffd5d27891b", + "0xc9d92f4bac8b38cd82a49e962e6443132bf9f24c", + "0x91aa8b108278d313b96c662aab5bc67d9049a521", + "0x80c6e17022a42f0d03a63e3facadb32585e2915e", + "0xe38d95a48daea3feba4114202b4bb976e4234104", + "0x34141afc4366697ac1abbaf2a46d2b951beb07a3", + "0xaf128c3f3aa25208671701e2ea9b691cd8b967ea", + "0x80f1fbade342357cee5b4eef6dd60383b14643e1", + "0x61b78e1edf08b3e1dd1c528d805ef3fe7f6ddd9f", + "0xe4f6b63bac4663f9fbd79fb34755ee839e0b4057", + "0x3f6e473d9457452952026c6a77ea79a469d8bdd3", + "0xec247f4a8c5b19cc7ffd2014a8d3f64149fba47e", + "0xf7652b0ea2963fdc7446b7399aa52912514c0fa1", + "0xa54a490772f4368cfc36e318abbf0e819a0ee425", + "0xcba215a22dcd6f59a30d78e43416660d13ed8608", + "0xdaab06a2611095939d61300030701908af24590b", + "0xd05115f56a15db424a6acabe53b4fc2949d5e001", + "0xb4ff5331cc6f3bbd1743234ef9be4b61b2b0aa77", + "0xde4bf76eeccf8e5950dca25b142c87d9e635e6b1", + "0xccdcaedaf109bc9f87df5528057f4bd54a4504e1", + "0x9015cfe99fee5a2f5a01c2c6b89393bb166d6dbb", + "0xfdc430512b925cf19b4f4c3214570ea0ee0c875e", + "0x39443803828619a8a10d67fd21d1ad5a6e21748a", + "0x868eb7ec3c5dd6b84075391ad02815ddf691ec33", + "0xfcc1d38e9e2cf7b4f2010ee04008d8561673ba6a", + "0x7dc7b25043983bbf7c30d45ffaf132c0c5f100a8", + "0xd6b051993297bd3d1cbd3835a9a53647ef3d6725", + "0x76201f812485d2c3dbeb0b61db7846fb435ad484", + "0x7377035f9e178e2d3e16679a28cb77ee71b816ff", + "0xc8d0752ac96da66b99985cb72d77ba9c3f463e71", + "0x694acf4dfb7601f92a0d2a41cdec5bf7726c7294", + "0x8c4655246e5881e3762b71c11fc72dd04d89c0d1", + "0xff9f0df5ee7aa25e08a34963f0fcf36b5a888888", + "0xcdfb2604a29bf2a40606a04c1aba4277522bf29b", + "0x104d04f57800b49cb86ea10ad031e76c12ae0a66", + "0xa857e8321f8b94c616a14592fd69cad7fdc9786d", + "0xb5e1ff390c4171dfb4a6e5c71c6e0b4ba803a0fc", + "0x4a8646c76d404fad04ee39eb213ae6174636c51b", + "0xe1690f5153ad0bbc683964aa81645c49b3cf6567", + "0x79f843701982acadfe219a6974b694c4783e6fc2", + "0x20a7cbf46b9629f7bc8cb442db29118ad85ba808", + "0x30a40961a176e74ff72386fbce5434e755eeaaaf", + "0x94f375825110e689911a4b7e308da1c8c024c0b8", + "0xb7f990dd926a9f0d0ade69aa1c8c53911a9d8287", + "0x5b4a08e006917f68c35d450379d91c430d479296", + "0x32e03e8fb5277d5e16b14ec173257afaaa0534e0", + "0x890b4f1abf47ab9d3e05ed7ccd6ad937b69af258", + "0x0087fb5367d680170916c350d1b5bba973f60397", + "0x894740526d04071b5bc4227a174a9230e4d7f44b", + "0x1700c01ffed97d65eca22222cd845757e279be68", + "0x7caef04972e21f52d9ce5964959cc9aafda0100a", + "0x3d9ab8e4b65fd3c9273bd48742db8bfefea2ff9d", + "0xcae852fd926ec70c2aa70eab55f8d318d21ba9e7", + "0xaa531e8a3a40ba30b9fc80209be81c66532e36dc", + "0xadcc4b1424baa396393e55b1b5c5549eb4a75a6a", + "0x8f862ce117a3feebc1dc364e02db35ae125d7f40", + "0x1a7d7f29eee6704af08e9e51bfac5e358cd3f56a", + "0x9924de8296b6784fe130c8e3a9f6dc0fb37a8f66", + "0x7cd514afedc5a9ecd9e61eca1fdf02f0067646aa", + "0x044da36e39b954546e4b728dc33f96617a40c4a2", + "0x18b6f13318f483e2b51793eff74e96252b24fea9", + "0xb2da047d786d3bd29423b6150a56e2e914c9261e", + "0xc8f55351b07405b63fe867e5b9eff6e31a7cef81", + "0xa6cde2c2521a33935b2adf881ecbbed39df3d809", + "0xbcc4c8d016ab360680a123bcc115f070efc7430a", + "0xc8bda00e1ac88648e2442aa10e723ec6ae438618", + "0x8e7b6e8c3bfdf24edcb480279b829bd4200936e0", + "0xf08793c6e14d4d7f8baece3af748094aa2876858", + "0x8c5dd93efe4dd6ccde3ff972c153010b69ef804b", + "0xcbf1259511dbcfaf57f953acf5724a7683e84fe8", + "0xcce83987023eb13e1132b1891b53110484f2b70c", + "0xf2c653419f5f9e8952d6e79fed2bd0602ae389ab", + "0x363085d9ebc20715fc61c3337f293b7940529e1f", + "0xa0f3d4b207045fa6e15fa750fe73590e899fb00d", + "0xd2edb850b1d4f17ce0878233f18e5d3d02c6b0ae", + "0x423f7e311867ffa7faa03a1d8f8801642f11a57d", + "0x04c49c077772c330d6688fb7200c9a0be8c0641f", + "0x8767c96e95e8ea8a3190aa4d835720df5ee6df11", + "0xcbe8f870eb0994557e063f7c827aa07c5641b5d3", + "0xc832c6f6fc0982e7b6d48168c7f5a5363dadd865", + "0x65bdf0660670aa2ef9b375013d12c650cb833dc3", + "0x3579254f5805d166b68a58732070444820fa4bf1", + "0x56691e542106f71aaa5a5ecb6ad4fb762d39b8bf", + "0x805e97a24002f95b599dd13124d88500cd49edda", + "0x526479afe288b7b17d77e421d82ff807d70f1264", + "0x321ec5e17f0de3baa3263ab88c106aa5f810296c", + "0x5b27dadecf9f8e1050ce0f16c82476af92851db9", + "0x16f925968f99194b5088566480c4ab4897b81363", + "0xc8011b2ca410cec2919f1d65c848575e630c6c6d", + "0xe0e480e422ebef484ea10548ac7c02939bc3f8c3", + "0x1efe2673db38268d7218d3bc16495aeb2cc4f5ff", + "0xb5ab3adc18c17f52df4b9cc7e9b48332cfbfb154", + "0x2ecc650e73d984db98c2d239108d2931bdab7028", + "0x6d0d0c22f65e0261769d81c63636473ea45c8e65", + "0xbea4f8fb1b59107661466ed65c919625530f5f5a", + "0xe534ae8b56c2734356fc38ec14a2a4abdc26beb2", + "0x7899a0b4f713365a189f485a9a6946ed0446401a", + "0xbc4dd3d9c585e4ed80aaa94320bfe1bc2b3ca667", + "0xbf4ebea7279de8517f60bd5fdbe9aebe03de90ed", + "0x34d472ba5befb89763b4bcd5abbdfe3d7b6104c7", + "0x6ca7e9827e28548c42e3f2bd80c2dd9fad04b8a3", + "0x05d548cd9be2e4c13e293dbb8b7831df276ee569", + "0x6e5ed339180d64fc0b46592cae833b29f6295187", + "0x5caf11880cc35ec13c5a50d891a97a672dccc0a5", + "0x687f0f2ff9e80d0c85221a71dc0529b562cf57dd", + "0x728592f2cdefe99bc19c35bd22da7c57b46456c8", + "0x44e9e1673ef357ab122329ee68a0e531327e9536", + "0x3e878b600218535c15efbc49f60b385f4c9c849d", + "0xa4529495548ece87a9f93b5d9f0a2f7dd32ffcc1", + "0x87c6565688d08d8a8eaf6ddc4798e3d3c3af8d67", + "0xcee7d7effdf20a73df01578b86165ae2bff7fb23", + "0x6bcfe7307663bb2b0c1c70294c8af1ea01fef0de", + "0x6e5f7bd9b940287f6c9ae8a2ecfb93224a09cba5", + "0x440162ee5799c4246445d87205c008aeb5a0fbb5", + "0x176dd14ef06bd602bd7e613e75714ed1dd2356d3", + "0xa95261d06cde28a8e491acaaa7687673bf08ff0b", + "0xcfc579300d3e8016c70147a37c48cc6467daee98", + "0x08706e7e417d50fb875a4697da0b9aca601ccb1f", + "0xf7981b47439aa8bbeaa0dd2362ca2511fa654474", + "0xa0d254a39ea8645ffc79a9353c32f02504c5f3e7", + "0x677db55f8df7b73712741d53260e59b176480286", + "0x30f5660723c169c1fe99264f3efe8a7e4c68288d", + "0x2bd14671c1d1efa2d3f98770823727f016190ba0", + "0x82021c21c963c8d7b62dfda32e0e5a1bd7b55067", + "0xbae3bad311a211dbc19c14a5d2995a9a4741abc7", + "0xa60b80ba173423200433556fe454f9ab9a29ba8f", + "0xe9f00488302019fccf7acc1a478ece666909e8c4", + "0x9897844ca4ad50318017a7147ffc9f02a235d15f", + "0x3ac51118a30f4187747fcebbaad1a804d0b9b775", + "0xafa60aa871b16987ac303a29f19d086f00935bf3", + "0x992dcf8fc093b1e91867cce12033c289664c09fc", + "0xba6e83fd59f13393720d4de07d5cb0b731ff8700", + "0xefb73e47099485c72b7678cb59fb0da7dacf173f", + "0xe26edca05417a65819295c49fc67272ab247d791", + "0xf3df77f5955d3eafcb7ee1a3eae394f0bda75f67", + "0x4391522a1cb89b3d9829697bf2167a1f73b93ef7", + "0x53bfab7b063e6695b2ad6fffc49dd3c73d3d1bdf", + "0x462120b0e848d5199ad6b50515f2349cdb0aca3d", + "0x7bbcd348b8c5df9cef2e142196d65adaf7e13895", + "0x586d78dc0d65f39cf61a824b84a89cb6d0350c50", + "0xecf6bde65fbe11af3cec1f907077c0a75ab526bb", + "0xf55b92b635bb745f65be9f9e84a5509905298aaf", + "0x9742194dd9e5d66884f35ea1d21345031501b36b", + "0x1b8f6050f54189b37491675354b3beca4955e772", + "0x5c1751b8501be90acd4e93a71c27c98935c4b922", + "0x255370c96a68c7958977f4da508990bf39d523b3", + "0x67f284f5923a94d12dfd053eb9843e54f4b8eb68", + "0x6521794350eeec219a64945523f1711f9a49a5fe", + "0x67ed35ed9d3bbb0b82596f4e0e07499a87aac518", + "0xbdaceb4f3b4042c833acd72ed185b17ff73c5f25", + "0xbe409013d5d45a763b6bf2b529f2a9f325c3eced", + "0x354e3e4a33930629e2c491bbaa896128be12640d", + "0x2d6a6b777a257ba8cdf444857c5c84d32e62075a", + "0x8a4306c2134e50b1d0f2669248ca87a398760116", + "0xf51fcfd4af9808f51cdf7bfb660909b9d23f29b8", + "0x9915a95c82ae274764fa9e527d7b5dc0c191ec6d", + "0xf3881e1a018ccc24f1c78aed70a4b84db04c05e4", + "0x602277121bcf97316cda6d0f79975496c721bc29", + "0x456f445e031ad6cf6dd157f7183669ac6adb1c87", + "0xa3728cf788487a253da0b79c3680ee85895c04f3", + "0x10154bd05a5cd6673f0c0cfe323f8e5c8290395b", + "0x94f9d46ff684b1a3bb854e94246a21945f02c45d", + "0x7f186e5e6d8374a4a753a4e908c03c393a54601f", + "0xbaba55af21e34f5209a83086c5c0156532a8d168", + "0xb690ae827843448edafe0ec8c8d918daeb521760", + "0xaf33bdbda6d4929a5112e8b3fbc8be4757c4dbe8", + "0x74f238e236a8dd86a28e9bdf8ee8e1b8c56c1166", + "0x617e49fd8f1f9d77f87801dc540ceb6deb8979ec", + "0x3b0903f8465b364d9514a62ae996c58fee17c4e5", + "0xe952e20d4fd334027f566094570deee7af2e671d", + "0xe23c4d24b8a3fd20e0f5802ec4166a8931fd3b7e", + "0xd1c6e5e21d800934c92e1045abce644db4a29a0f", + "0xf19d7e1cc2677ea288b9a448941adf40f191573f", + "0xa1de41fc1cdc91301bc58b343e944cf7fd3418a8", + "0x6519bafc9a636fe13bc02f62505bb2986ab1e23d", + "0xd2ed6fa57d891342f90080c86daf8aa1401363e0", + "0xd89d8c4247931dc0ae095cd1a223420d68da7247", + "0x48e9a0f4834a5be2e4167c80b8dce51807c6cd17", + "0xdbbbe9454e2aa061aa26e9b4369662f901a4fd44", + "0x87cdced7862eb5a10d285160d7e15f1176c9bd8f", + "0x1f8cdb732363fe11c0316a8661f225d9e1c04292", + "0x31a197e71b636c8657373ec4e9c8c388cc71c522", + "0xbb6e99fb152c114a7ae49d41658ddc79f2d5d7eb", + "0xc13061ec4f4f3392f83dd2ea5620bd2ca1a066c5", + "0x6326880b7b16ba98791c86cf82d4e7d6995cc358", + "0x0b3bfe556e31f3c44e2004d79de4af01f3f362fe", + "0x2bb72e1ef132cd652caf175ced70ce9c9b0ba05e", + "0xd3a82936c0f2aab2896a3e7a7724e9ff065c4c93", + "0xc09e0ab38a809921f47e5b4d4eb3e98c0149a7d2", + "0x33aabf90534bd241269164673475437a25113e9c", + "0xf221b99f7e6d09b1be2c407ddc761ae71791efc5", + "0xf04aedde3c1b4415ec84ebf4d1c18e0268438e27", + "0x3d82e338e7804ef09fb73f34134352c27afd422a", + "0xec4cd25a4589b34194f324e2d0a5bd3cca2ca134", + "0xfddca27616f199d8845702dca9e194dd187c82b6", + "0xa5cda8aa1fe6d910730f5ff8f5bdbc9924f6a372", + "0x8fa7f5018055dc3b66fd024ca4af713c1006fa90", + "0xe6287494913c5c8f96eb1b8b5f1b7d3d593e2d53", + "0x95e463adf75abfbd29bd296319ac63ca273d3573", + "0x99e5ff5126c68294108df8f92f9321a0d7a69d4e", + "0xcd0587be0c6fefe104ce3509dbdf236791a7f144", + "0xeb4c551b7812ad35ead94c8ff82442a1f4f26174", + "0x3d80b522e1d195143cb535b38d0cd1d5dad4b9c8", + "0xf7d82b2969109610d82a8de39b3e8826113f0a7e", + "0xe7d06819025ca609dc596d100c065dc7833207ec", + "0x614ee992a7db0dd1eea121f32f1cc8387ddc7fd5", + "0x2650eef979bd33862f5c717492f78ef79c3556d8", + "0x6ffc086864e3e9a6ed5a946e571ff72b4f76aeb9", + "0x99b9b86b71c32e215cb81e33999208941d308c04", + "0x22ed49e3e5ef21f9c369a8d2f22f3e0c57f303e2", + "0x3c43ccb2b761d98b1fd09d4eb02e9f8115f79e48", + "0xf24e73e8eb653be0c8c7491d714ba2f9b475b8e4", + "0x06bebb84c73a63ef819b897177f1ddc51a381ce7", + "0xec39e27bed0d40c5bfdd8203665c0e85f18e11fb", + "0xc2b35534e47cdf3d787e01630129631d8270abfb", + "0x3668b2ed97cb7ce01286907026a66032c57f119a", + "0x05b95d2c274cb9e9604f495231b3e9e79226f1d6", + "0x709e2274548de7fb9d3a0a0a87236335f65874e0", + "0x4c4898afb852a6df536abee9a787351b72578075", + "0x731744b7a913d4161fb05e21043e36e9cccd7dee", + "0x6df734ed3d786cfd240e9c7ca1d9148b1571bd94", + "0x664784b2a4019b85aa095488efa86fce4e85d8a6", + "0x78b155d7bc284a887f09e028a360a36cc4c4d4c8", + "0x3208e03ce4bbe4229a8e33c5be5c0738291dcbf0", + "0x20b70b2162b7be899878aaa5358b3de5c84793b5", + "0x09c6b8b2df1ccfd2538bf3602649993c8bba1151", + "0x0f8534769c4d77f5517b94082ab46283e3c097a3", + "0x08e37bcfe8c0aa89836cddea36b6c0ee72f60a44", + "0x2195893e5703ce8930a529168044995eec1f64a4", + "0x75fa7da6f7899d6cd950fff7f0fc2d94025067c2", + "0xcd247e021f6ef24e75779fb8c4313120d86357e2", + "0xe6f0d9f34034d1f6b4951921818fce5eaaf7299c", + "0x6d2d36ed3acc2e00f044c94bece05e29c0fc9bf5", + "0xec7acad0e09d1ccbc19b35c5f3b854b6c1eb8f7e", + "0x74d08675cbe9b663301190e2dc4df82df0284894", + "0xf694d9aeb3905f0d07d1848242183c316432b397", + "0x3206b8983525227802d25240157f518c0e4d7f35", + "0x4c6707f16e11940e5b55674e7457a5b3cf2faa5d", + "0x062bcf5e546b235953576763658936f9e9f38327", + "0xc438a1bb27b676caa26be52f168532d0566a7219", + "0x6af17696cd58a956725d5516c88fe69b30c94bad", + "0x6570005c0285ba1c82e09ded45e905bc25fe57ed", + "0xd8d462958fe3194cabb95d502f1ad7ddcf7e0558", + "0x08e1fbf18698e21ee5ec52dfc2a0360051c96935", + "0x3917fbadbc6015cf6ebb39efcdf3a8ccf3a231e3", + "0x99e011894390611d7c2b271f77977848257c4115", + "0x9f615e3a0b6944b7e550d84d6309f959c86a34f6", + "0x061203811b004362db0bbf9506bafb65ee705bcf", + "0x6ac3527bd51a65cdf4106627e47473d9f098e948", + "0xc59bf6db4d95ea3ea8848bd26c9b47ee33291278", + "0x4893ad97a058fdfd715084a4631daf0c5feab7f4", + "0xafed2f9768a678a70c65542ee42fa5717b1c76fb", + "0x11c7f3d6bd055c3660ad2ef83c70dc8d6cb44cab", + "0xc47456378bdba2b64517af199f07bbca45138760", + "0xbe026ae67432efa9ad85b897a70e0bab0dcb1cea", + "0xac526860401d5b6ec375c153b44a095033ad81e0", + "0x0fae96f5db64436d48ce27128d823af903ba8ca2", + "0x24b34ad9f550581d032dc1eba319f221f84a1b5a", + "0x214680af61db9e4f6164d0f58a331b20d09dafeb", + "0xbb030a0408edc41f3c61ba3f132c06e93eda68f4", + "0x3217cd03862e4369e84d35fa32ef4b645a99ec72", + "0x429e57dcba53e62f35f6c232fb446c1d38322178", + "0xd92ea94b493824b63991ff5c4ffb8063bd04d54c", + "0x8ed6d97efe4e87b59316129a9213db1d73343f1e", + "0x85c206cc64d042ba9ba0717a3d3ea9c28abcedc6", + "0x907156d38e181f65d4d4f48099ce15bb8d2ff067", + "0x30d885208c19b8bcd440cffe7117673469244745", + "0x9e0f73ddbe1dac7f66f54f0e864679dc80b741e0", + "0xfb21b30d3f290c1d5780b12e67ae958b2e8c262e", + "0x08ee8c9642690d0609643e7ec97e42ff403e692b", + "0x58386b752d88d5edc9c9fa48aeb81c710e87c5f1", + "0x909462ee41ab000bc700d2068d1242d09c77dd22", + "0xc6571c2fb66825f13b7751b1c334810d397618eb", + "0xaff561e8f736b78036c083a82b3ef131730effce", + "0xcf735bdc725452711b4bfc0d9136d2d56c882e9e", + "0x44dd7a31111f21f92ce60d2490ea722fb603937b", + "0xca2df21270a22fc3097a3d728dc31c6634ae9e0b", + "0xf1cdeef23ed057c0f56bbb922d67389611d6e55e", + "0x647ec5dc10a0fd703c3cfb11d8406f1e8d90a24c", + "0x1ffdad3de4d0541ed5561ddf6590df17f205c733", + "0x1a560d6828e032416350e81bc37b653d9c58e480", + "0x6a9b86e5a09eb214557825c89cd2aabdd832b830", + "0xdd005e7a32e8c7c9c9122bfc2d31257811e19db3", + "0xc935b59c7f810cec91e46b45f03a4ac4cc0e915e", + "0x09bac567d73e8bc701a900d14c90c06644ea0156", + "0xdf036b0b15b43754ee545ca08f9af2d36ca6cff1", + "0xff18311ccdbe86e54d266f07eaec2668bee9f9f3", + "0x322b3773e566790864b951abb99d40de83f24d01", + "0xe0871d792e2d4efcf29adcdec515d4a453763728", + "0x6ffcac1f85a2a0d4ec02a53b5927e63deaa88d33", + "0xfdd2aad276a38c377db5d44ce01b9d052b3f71e6", + "0x98b2e9bb3fea78b6f2bbb2e289dd11012be79c54", + "0xfc4a6f7af2ea8a27be847f2d4a3fd4edc34cd19c", + "0xdc50504c3304e2a050ef083ed947aafcc75cb579", + "0xe2b8f10b6a1a5c6014d9cfdc9f13f0d152f04347", + "0xd2aeb4a9fcae61a98214c03e8b45ffdf62463325", + "0x3d90e02218ce4f5d7aa65f502506d0a983819f2c", + "0x80e8bd1619606c82b281d5380509562fcd3821d1", + "0x8335459a89a17ed8ed128aa98f9af86802dacf30", + "0x01d5b7a0289b4eb7860dad91dacc108737d06d16", + "0x081da37359eda4f3d14afe0c399ddef974aa9dcf", + "0xb7618d9126322908ba0aa4a8cf6b92818a7a5030", + "0x2ed5711d0d722a5a60342985e4e1471f37d9ec84", + "0x9bb2fac54f168bce6986c3856fcb42d5c365b689", + "0x3529eafe787deb1970126afd6eda5c44d0eb0f2f", + "0x7aafe81b79208e618345b27e9e6c8f85f882b171", + "0x8f2910ab7fd0c38a60eae6b1b1d4f71fd51c9b66", + "0x8ed16e19f2ae9142abf9221c08a384a568dfc710", + "0xb8554553ad330f15aa005ae1a9b5eed3563188d4", + "0x0a8e1cfc96f4561897ae0f295956c658501aa3b0", + "0x5b8acd8ebcdc7c4ac849a60600103975421054a4", + "0x953c0028b103cc2a748e7f7ec54d21869470a5ec", + "0x44d2913213a76e42c756c1d1184724d8f6ba4751", + "0x47b6cba2ca9e97060558236b6dd6394b32759f75", + "0x3a070d228001313407c9fb39bfef540f20210b65", + "0xb07e4840ec9d4ec4440ca3d71677210157aaed29", + "0x104d39c07f2c2b29b2104ea39c15730146a70d4c", + "0x68594e053f9d04028bae834b2c8e16688ad24ae2", + "0x530e81d8e4c72eb2446b92cbe371d7014276954a", + "0x74bde32849dff223793c54c63197ee1c57016d03", + "0x8da12ed4c3611ea80db038c6072d8bc00ccc021a", + "0x0e3e522d6c1c9fa7db8c4ee02bfe6c9d9ffbd62b", + "0x9b3b5eb870466e14bcd29cf9702e6671d381d7e2", + "0xcaa713508ed800c75808ad51f035881fb422a9e1", + "0xa0887a574d2a1eb5438199f85640242ff8a97bbe", + "0xb2ab92049645d0395d17b1d0b8152de9a7032945", + "0xa0c7aed88c45bd407e00aee2414141ff62d75762", + "0x7b18ec8acf6bcb1f725d625fcc844d39fe7beba7", + "0x29c80c2690f91a47803445c5922e76597d1dd2b6", + "0xf4c5c637417116e8ad1a0f5a9e8be1acbe5d64af", + "0x92cd1ea081cb12dd624a37cb84e713861c9f95c3", + "0xc7d521606fd73225d70d932b5799ddf3305bcd0d", + "0x0589c7decedae61b46f40e959f830601209ee20c", + "0x415e35be0a67c5e1089f9ed3ba5d45a474af963c", + "0x6f24723f2f7baae52e30889ba3bfb86d614270e9", + "0x423078d269ae463a92c460a3a25336cd602b2c0d", + "0x21bf87754021e155f4f39e884f750e83538485f5", + "0xf218637c9680b9b56b08f44b71c3ed1cc2780922", + "0xe0b9cc07fdccb3babbb30ca6d22c833576cb49a6", + "0x4f95ee90a5017fa8f9c972f9b3a839ca63f72a91", + "0xb8de49270d7d1a454ac76c6fa8398cc313cb1ccd", + "0x56286290dcaea872c083dd7aac15a724c6c7574e", + "0x95568f1d44163c13afc98e6e9925ebaa0a0dbcdc", + "0x6b23b984b80e5955360080feb91296796d8b505c", + "0xe6396941cedcf378094efb26a85dd551a22e01eb", + "0x21c051e7bf79cc1bc7f816a27c09baf14d4ea4af", + "0x594018a44860094dc5e6d1e7f4dcd58d46da57fc", + "0xcfe8ce9eece778b1f71555b56f7fcd68b17226a4", + "0xadb19139c79bbbaab7e5141a1f65fac623c04a17", + "0xef2ede4d22389a3b6c8cb4503922362b691e5228", + "0xf9d3ecdc01adc08bd00b3ac4fd13c92fcacac953", + "0xef709da1fc97f07839527a2d890710b234ce89f6", + "0x2c9927e885e93eb7e43eddd89e6f59af3935f3f9", + "0x2c966e4772df3074b6f3b3e2012036c9c6506b9d", + "0x6fde902c06ddc386e6b570dfb934c1be4e9f474a", + "0x070dd7b81dee74e311ad5510a73baf8eb229b508", + "0xef60e04aae7e0f06208777da42f054ed680a9b77", + "0x6b7075ee3cedc7f15de15fe0ec66e123ba1a3fbb", + "0xfd8aede201d2df258a9783ed3440e6929e9efe10", + "0xc77c3efb55bd7b0e44c13eb27eb33c98597f0a68", + "0xb9d07332d56bc6314840d1d9bab0748673628080", + "0x00dd72466c9bc28c9765b406ea147c1e15dbc7ab", + "0x3d937616d68450bf56fdf60aa32be5151d9bf25e", + "0xc5e2a4f0f6ea929d5710961c4d90b0926ef7cfb5", + "0xe09f62a9f38ba4dcf67efd347b994c265711e3c9", + "0x78d9a7c0aa22cb9baa437743ca7cc3d4fbda14b1", + "0x897d4ba25ed4cbf587cb840ea135e59b9200f66b", + "0xf8f92e8afc166c8b71a1f66f086b9767ac5ffa39", + "0xd1c9936feaa63c51dac0d5602d19716ab3b0a1f5", + "0x16e141aafee8f745abb1104552f3b7a899adefec", + "0x77e7ac87108c2cc460f27e5c49bff3202b072bed", + "0xe491cacfd33a52a5eb7ff452944a305090d98cc1", + "0x4066d9506e44c660a4b118599d65ec8117c58215", + "0xbe7668d783f5ae066d32e7d8a1903d17e963e560", + "0x2b6dea17f10bcfcfe07fc071c599fb13110966a9", + "0x8cd2de92a354350f778e926fe5458a5b352e4385", + "0xa9c7e3f34ba387f0f01a8df9a505a878f9de45eb", + "0xc2b565722a5b8f60b72872183836450e3d7c4771", + "0x7fea093f5b879f1ce2fb8fbddec9721c4b89e77c", + "0x3b770064c42bb26010addb5a3ee566734af53907", + "0x360380dfb3da03073e0580972300c96aa9ebc986", + "0xf2bfe672d4152aa2cd122bbc3a10305229e85b9b", + "0x30e1f8416c709222b9d1b4cb480eb85f7bb523fb", + "0xc36315c5c42bbc57ef6d9b1fefa800c689fb75de", + "0x96e957eaa0048ef57578997205fb856f1c2ac780", + "0x2018953727de8748c78ea0bfc384e713a67791f9", + "0x8e1017fc70b6fac9e00c6e445e5a09296653e561", + "0x3bed33f5e08b502db692f9ca665e710abdd3f69e", + "0xeae10420054b70314e5ab5065d1fe8657fc840d3", + "0x6cd0f68d7abcf19861177b1c2529d2fdc9099df5", + "0x5f4325b3bd86afeeff8d5a6851241481f9a21672", + "0xa465252ed894ce012d07699b115eaa407dd81d40", + "0x004e2ca34fe2113b13b07e8ed45ae47be574d58b", + "0x602db8e43b3f81a08d2c767b30d07e792b2714b5", + "0x4a716d0579318ce6aa6a118ff9c9900ba062957a", + "0x181a00a6381746ae2aea1c6bfa2c49ab8f326210", + "0x5e8394c08bf0f4133ee1f2010e731148c1ae8049", + "0x931e76877118c84f1d904295971ce383ecfed5f4", + "0x7a6a59588b8106045303e1923227a2cefbec2b66", + "0x75a69f2b24eb256581190d7504b441bcc30fc2c5", + "0x5525e6fbfb80fa70932c130ee1550d364fee264f", + "0x24afadc523f6ee0bad26bc18b3d1515f7919c23e", + "0xb7b5186a8546a1e6555974aedb72be9697e7306e", + "0x8fe0314641d49e24c05983ff6f0cd94bddbbfdd5", + "0xb4c35811b466cbff47a6ffa720ca72fec0445eca", + "0x9b96bb5b3b26fc9f108149963ac9881258a718d9", + "0xe90aab0c14e6f9bb6b4aa0b2bcfdebe88a549911", + "0x5c282faf872029b77463b1869d62237621566e78", + "0x22f32be67d7cb297300528e202e26a9ca9f6d519", + "0xaf65cc3fa13d3aa1516380321abe7b34d3dab20f", + "0xbf4eec8adf76f844aa6b0786243ab346f94e1270", + "0x674c871791dd9f3c904913f85be2cf12c4e203d8", + "0x86e8a4657fc7e1cefa6ce4e21869193f7dc0b78c", + "0x6692a5d1f0c6551a34c8d98b73bd71e1b315b3f6", + "0x87de0e365f0439e968257b2c0fbde88a7b91b79d", + "0x5defa769980a5d4b47e3b38e09cfab26d148a7f5", + "0xe2632d93557b959ea246842a73f87443e65e4489", + "0x4336eb76e1ada43b02d933ac40499c584f1d60c9", + "0x4d9cdc2992019698cd96a5dd67cd00519223ec1e", + "0x598c5e19a132a5c433a80c908f05d87bfdaac4ae", + "0x72761e75387421ea4668b3b5da8f1050e930730b", + "0x6c4448f77c5cc9b1ca040bc5d0b843e50f5038ff", + "0xd2033db9c5370ac76abd80823b5c5adc097e2fbf", + "0xca25b8da026540e2fc62965094a4b5ecaf42e3aa", + "0xdc670100700396f8e62d19e3e43eb8a0d70e2ba9", + "0x6fec9e2c9cacbd76961523484cfb5292a8768232", + "0xe8e6c1f3036af97e778b47ca5a531d37b2416937", + "0x2a545ec28e3f4caf325ac1e20e78c2958bd703d7", + "0xbc74da2e10c06c4b16e152682ef51a923bd4ce5a", + "0x12a900eb8e261cdb5bce439ba97ba40743490de3", + "0x4e01b8f5245d334680ee67e5810297d7db46c6ab", + "0xccace004d16f8c04238bafcaa0ec5b295a34eaea", + "0xb9f1b32dbbe9289c73299d94259cfd6282ac243c", + "0x23c0e7f5a051bef6dc31611c2911b2bb6cc36f6f", + "0xc8728ae130381eb77fc9a8b715564b00e83e19df", + "0x032537eb8dbd59042497f6d190d492ffd3056c00", + "0x19c5327ef25e0044d265bad6bcf821139dc9299c", + "0x6732347bb491857e3b1e6302ccf01c6a187730d6", + "0xfc4b4898a1678ded3046b64ea9c7dca81aee0b51", + "0xb6a56415120ea43862383a901b0e0aa4513e051d", + "0x75bea3974c7bfd773ec0fb599440a9b4dd50499d", + "0x83c4b0e522e824f1dbd725ec7505adf90ba3fdf8", + "0x6bf72d183894de3bd5ebaf7b5983d7c778c82299", + "0xdec117b6169e54a1eb981f04b2c9d04644e80f0c", + "0x67a1c7c4bd425473fb8e1fb2569cd69d4932c023", + "0x655f6ec52a0f4f098bfb654dade821421bcd34a7", + "0xa2a048426dd38b4925283230bfa9ebce2ab4c037", + "0x53314910f91d0fd597c0db4fd8737de7ba963ed5", + "0x0fc5b9c6079c3f4bcdb406d161ab3c847c1107d5", + "0x6516b9aad2c6caab0ae7db3d07727c3b35ef6b92", + "0xd1fc4d61af7c06babd24d36558808651d7c3104b", + "0x43bf879785422c1ef3587c639b7ce2f7e5ebdb2b", + "0xff916a74d7e1540a4fd91d302568692c07cff6a3", + "0xefcf2eba7f6c34536b065a06aff54edfb171aa30", + "0x7a8f027333024b9663fbe544e2e81f48ffc9c43b", + "0xd542fb243fad1fb30209d0706fac71a9a5066333", + "0x0692a54762dbf7f84a742aad1f10bc7e4d47e050", + "0x63737afcce230c99e9bc61f1a03c3a83feaa3c5c", + "0x4d320c7d75d44c17ba8c5f63b3ecde44cae9c379", + "0x682f53dd42d72523b3639a545cd5e3ce08eb0260", + "0x84017332676bd76e3d7a8bd363157c7a67c01d55", + "0x811142aa3f44c5f35789625bea080370baecc907", + "0x9343a234a34bed3ff2df786c6270a7ae3f200adb", + "0xc201fd31f7d3a54bcf06b1e6d32f361a3a1ccd74", + "0xe292f1d6a24ec3b291c31010017c233a7962e3b2", + "0x196a37946c3d93e9a5309f539ae28b774a32411f", + "0xde0b6fd47e8f341a30a686e750da71abb9eb0bc3", + "0x9c9a3328b789ec3581faaa230054072dc4d27c57", + "0x256cb5153a855ae42fc148d2a688330ace075a5a", + "0x6cd87b511ddb20d3e9cdde8f65abf5b3870d19d3", + "0x380992a24f81ecf3d98cd4077636234d85ad6541", + "0xf00369f36f47ff7170cbbe68aac320947a34d644", + "0xd82609aee7500ce9066a6d2a6fbb9b7721c38721", + "0xb38a90f14b24ae81ec0b8f1373694f5b59811d8a", + "0x942114d2222af79422d11ddb0a96ddf2997fecb9", + "0xfb0ffe493c4c6a684a810e246aa90b7a0de0b0a5", + "0x655552b438d13027bd46dee323f301b37ab56c36", + "0xcb284f3bf78737c4fe5a9db1e3633130c10fa7b1", + "0xbded7c8a2efa4cf2ee6c953e6447a246f3ac4e12", + "0x05fe7057c614437dd8d90767a304d350f9192222", + "0x7bedfb9ae170826148c602783e3e1b3763b62863", + "0xdfd7247e74391b073f78cd6157454964bd4961d1", + "0xb255270e12b58042044eaf7ba2bccd60d738dd4b", + "0x2771ad0733b5ab1bf2d36dd1ae4775d44e2099f9", + "0x53b9d5caaf08d370fa450bdd6b726d0ad73951e4", + "0x1284752d333c3e263561ae864f18c406b3dc3c52", + "0xdb1b3f61d44febf9475e683ce6f0c3e8741b1849", + "0x2c470bbd52db78b7091f5eaa21c7aec25aa069c3", + "0x91c1f7940e35efb7eb11840772a831f0cd7d8859", + "0xffd12246c7dd6ba2176e86d5679b85ad176a5251", + "0x35a53e05cf0aa7a44d6a4175dab16f3d0f10f043", + "0x7525b1f4a8843593b96c589bc794131a95bb84e4", + "0x2dd2b83539629401983c4c61b403d2122ee6f783", + "0x43ea3262a6a208470aa686254be9673f97cbced9", + "0xafc86dd630a8814f9650cd2312217eb4617fb9b7", + "0xfad72582ead34adb914c55b1ea89a16f89f5197d", + "0x1f37196cd2000f71062be312cb4da7cae0f4f301", + "0x20bf57aa2c7905d211ea1691edec64d29efe2131", + "0xbc4357ad49f4f678bf29012699dbd3dda0f33531", + "0x6325e73b4ae6a376d7f322b8363006b1d2f98819", + "0x18233f548849786d7e467ca0fe7f9863e61bdfc4", + "0x1e7e36c9a216c1269df5953e73cbc7edfdd47161", + "0xac1c2783d64c29cdb79608f5b66a37fd1ea35dd6", + "0xad0f6338aa1b374f0a435d57421721ec0ce62e1b", + "0x65200803cd832c8c9fa9e8a70a9a9c99cbb50568", + "0x6a1d542fe756394fb27b724d22dc1b288ad241c6", + "0x76fb1a0ebd7da4e1db53d147c7dfe8eb0c9164f6", + "0x9c656a8838759523939b28d49670737db92a238d", + "0x23fe013cf61ea6e83b2d2680082a45201db33cb6", + "0x47dd352c25aba2314d8817ed40159a2d8fb6a771", + "0x79d6b65b48651d4d03cbe42ca0b55c567593e67f", + "0x3840b037a03590b0b431057ed728f40942059c1e", + "0x1d904c5ff057c8ca8cd88ebf55e4d8d53b423fdf", + "0xade65b2bc5e486d2c228b7e3e9ab34888546355a", + "0xef0e5397469233bb52178ddac48e4637bb5002cb", + "0xafd7f0e8871e517daf1242574b65e147c254fbd3", + "0xe0713e3dd20ccc430e7ed62bd16d3e99c187074b", + "0xa74018b76bcdb6befdf06da18572c391a26c5bab", + "0x039b47af68b01e01d5ace9deb1595bd1c9c900e9", + "0xf27c8765365e00feb2d7f49418b74d448cf7de4f", + "0x7c5cd584fc92992caeed3771a26c518e0e7f4edc", + "0xe22180745ee74b190d9ac750866a1b435368f13c", + "0xd70d5704a4e76e13efe80627389504fc839d4f53", + "0x60c750e77b17613fa2d80035c894fb05d6f7de66", + "0x6168cbacc2931eeaa56c77cc42b1763872cae55a", + "0x77f5fef8c8a18ac49e12330f2a3316fe3964ee24", + "0xda844e1ec97b0bab57f6d33f59b225ba57f0f0c9", + "0x9379b6de5e537346d2e5a9935adc774dfb3ffe99", + "0x601d1976fef45565655b48d4edf9351ad601f1ad", + "0x1137ed3afd54e1c0a274fe5a1de98d71e77b9dda", + "0x1e3c382f6bf183244abb21020de45ac736d15d57", + "0xa11ad7066e4dee6ab6d36faaee577ed94e7af32d", + "0xefe4d9a822c083d8df17f169f17b5077b811c2a5", + "0x28b2d304ef768fe2582ed5c315a31523b7c3233d", + "0x69525b3c0e1c14d1f05216b1ea43d5ca070c1670", + "0x2b6091da312a3591df6a94b24dd3c34d2b01ca22", + "0x5d4be3e4598475892bbeb5e11cbf2ea5cae19964", + "0x34c6fc6ae69655bf949a220a5522fe85bb15b1e0", + "0x594e581cfd4584362fc2df4820301c3be6c75c02", + "0x8861399ee37626fcc020c49e5184d9b839ed854a", + "0xc573c9f6ee2a15d9905c3261ae9bcee4c769944b", + "0x93b662104a6dcbcb52f6598ff760eac6576601d5", + "0xc332feab3751db34420f00b107f762b458e1423d", + "0x819e98cdecc1ac4a3927bb6a6f16aedefdf098f7", + "0x42e0014ab0ffa6d33065c0647df2ed920bb86808", + "0x555f0f365306f1f6c4d0cddf8059473294264ad6", + "0xf80b73338d1ba811501b8317219688c810c70e8c", + "0x4150f5311599c280508bff9ad0b0876a6f7ae398", + "0x9d956f6288d97823f7f0f0462df6d3f125b9d2bf", + "0x95a9b9d0487b2fa2f7dc54c410680a1a508083da", + "0x61e2b331e0be039671062e3d47a324984d73f0f8", + "0x1431ba2d4e5c5ed4bf6e8da41880a7e3b43da32d", + "0x76b60dcf71da2294f8aa034432d925d1eed8cf68", + "0xd18c886fe8f361828726189ec0b3004618c0f558", + "0x56014397d705ac5bea3de1061a9e5e9612739a20", + "0x15b6d0fad93fb2a609d6b0ce61bca8c0887b425a", + "0xc910cb5af2e92b8fc361946ae427c5b37367b81c", + "0x33d15d015b303332f2c82d7614e43616a6646365", + "0x1dc41529be1bee188f26c84b67556486f1dbfe52", + "0xb31bccfeeb745d6b04242d01b04ae1b0361b847f", + "0xe169c17394fae6ecf3c03758c2f3f94cf81ef5be", + "0xe25e53e6de6f744ff6aa4e89fb99cb90439e5db0", + "0x68a5e858a6ae1171f220ecd129eae2b25fed77a5", + "0xc4c6e038c1a126c57f540a4c5d57f8b02d05fda0", + "0xfcc92f0d50f43a3798041afd7e2c918cfb8b28ad", + "0x3f6ecf56abca9002d636782a5c8b28077bbd3736", + "0xa0f7f9f79f619bd86849747be69fb7a257ff01c0", + "0x6289325ae4fc1e531fe014e2e692af72908dbb1c", + "0x0f1ae9a33bdc367f98e9f6f00498e29e8672f411", + "0x74e142df816c376bd35d7ae02914fc8168fcd45f", + "0x09d4bd5bab17d8aa1f8b095f273c4a5fab96366a", + "0x726ca0ca1b4f59e3de69a8d69d97262a10af525a", + "0x28f84ae3f59b34cd47828697afe592d323506cfc", + "0xcc7186a5ddd5c57319323188c74d465428518908", + "0x13c385a2aa976b637d2a701dec0e2479cdae3bb7", + "0xf13aa2835f02e8bad0cab802ea2db98ddab4323f", + "0xee61312a331ca9c3b7ad7f325d331e3f6bf09a03", + "0x2bb43c9be0631abc1da2cb18f3daa3aa22851a42", + "0x9356a902066798e02eee5808074c4719dde2c67a", + "0x343d4073d75c12c348e79b14534ecd7496d74471", + "0xc26db682fe2346a2118caef21e388f4087395191", + "0xa304816c9c78505714f24fc13222fe07ce0cc711", + "0xd7e1ebdd984d68100d2d22b16db477f1256d7ec8", + "0x2cc3a227e184afc5386c08a68f4e2947a2068437", + "0x79c90c670aff8f035420e30eaa32c8ca698d2dbf", + "0x0543d87e082fd30b5ead2470e1015af48e65b599", + "0xe31aaa265b4f776c947d4efce222c934ab0c31c6", + "0xabe8578a138f2d927d18ee273f68ffa00426beaf", + "0x9ecf8141e956f0fac7a971973038b314ad257fe6", + "0x8e70e8e2ddd5404b12fda47c49ca4b9b5e4af04e", + "0x14050ecd612907b38372396fd7d368137906dec4", + "0x862cc29be13821131ddfbfd3633136639c13ddc8", + "0xfcd2ce20ef8ed3d43ab4f8c2da13bbf1c6d9512f", + "0x76076b0a34e2daaced0aa99c58e8b5ae73a3097b", + "0x4590ef0b1649a0ceb8923e137e886c248f9c69ff", + "0xb19bcdf5b89c9f7acbc5865080a7adc6823feef8", + "0xc6fe5d33615a1c52c08018c47e8bc53646a0e101", + "0x0bd54e59ff6b564cdd2c8a816d1d6ea0d99a132c", + "0x36cf3381817cd6912ae2e975701b597cf6c44fa3", + "0x017252042524df387a7ed994d41d7bde44f4670a", + "0x1dde1b4dbf44ff1b3cd0a97ba830b211178fcd2b", + "0xf1c581e0a5ee5edda67a9cba9ffe3e4f6cb3d2a9", + "0x2406690c1513b0e9f6fb5084d8c956b0d9fc6d08", + "0xe04401452106e0847ae57dece41989de28460051", + "0xe7620cc86a0cae46905e2853eb7f3c5f58aed1fe", + "0xf884281db9e62ee2ce79d64438e8f3e32a5287bb", + "0x1d5d81903a5a05af159e16b09baaa5220ab24447", + "0x2e23e9a0cb139582e5012d2f07250e9a78208b9e", + "0x46b70f26bb08c20e137eb8795c16bcc4c5e90303", + "0x65bfaad32aa100b152a08b8e86a5ba25b12d6c10", + "0xa0b9af2ba6d0eba3cb07cecfacc05cc6eebdac57", + "0xf815ed6d10c0f0f8680c22b6e5f7920542a72ac9", + "0x06933143320f466a4036fb8d7d260683baed1dab", + "0x44a7767a70e1fffea98bbe7513f54a9844b4fd33", + "0xf62fd027d99d4942488254dd3a62eafbf6b93cda", + "0x2e5d207a4c0f7e7c52f6622dcc6eb44bc0fe1a13", + "0xfdf5c79fa2d3292fa0507e7b809e7cd198da0f84", + "0xb4eac20123665ff2931af6396ab08008be737159", + "0xe6893f946dac3563c4a6505ef6d1d1b5a7d2c17a", + "0xc2eb1e67ae9b043b1262fc5b57bbb081144c01a0", + "0x628c8dec593934cd87d6ca08c3aa3b396a9fa4bd", + "0xf37f6953ca270348f9ce4b4d8940c16f9d003ea2", + "0xfe96719aa7ba8fab02e9d3123c0c40c23945557c", + "0xaa60e555a5ec7e4fbffb742b9b67d0f4677e8f28", + "0x143e1c74e7b4afc4077adc738790e6f4fe142fba", + "0x46b866971ad04c4d363d91d7ab0a8d010d011bce", + "0xc875d7578b6cf02e3a2f56d48462f4b8c5dd07cb", + "0x2636b598df3392ab0cbcb33dbb04e03ee08702b9", + "0xcdccf3d43cb151df296c5a999f09bc49d0d2f0c3", + "0x367ee5d52728a629cb5f6c8bac51c135c272e28c", + "0x8cf1be5ee52e9b17185bda6563d4b83aa1450138", + "0xff935e24d108e316484d07bbd9d7d6469677c23e", + "0x1bbdc35158e32624d270efb1d81b2db1b58f202d", + "0x168fef2fd1af371625b2593468620185cea904ff", + "0x6d9d49cd1a8cade49325394577565f4c3433b151", + "0xc48e118198a00066d937e3768df8319540803b18", + "0xdd3d5cd95a162874003b342cdba0ab0d49c0729e", + "0x20ae752e931413259f1a7ce97f36bb01d58614ae", + "0xc862a35e91f053d25d7c82646c6252a28cda0227", + "0x1ec5d7a34d4a31555df604408f0b769286b93c8a", + "0x3e58dd42d7908d8924a599e5e28e15f4f58c4075", + "0x3ea6602db2141a3e41a49151a299d39d81371a1c", + "0x11aa06650a2b0e07d093edfd48a8e8cd3ee03cd3", + "0x91f9c49dc549e6365e99bcc1ac1de70d6a17e2d0", + "0xc188b02c714cf2dd7fb7083d7b2b80b205b5c375", + "0xa18da9784ab2b48e64f85933d54b1a7d8863299b", + "0xe389ed09007ea61d3956730738dc59766334d0b9", + "0xc9cda37793043238e18a31c9963de43084716af7", + "0x98cfe9af1b4ff34d7d78ff2a4b8e2d74844e3418", + "0x3d6ade4bda8185020c9388b084a526beba73c6e8", + "0xc80aaa96befaaa1c1c9e135fa7da347a586a778e", + "0x00dee61c9f593b8d258c8f3b0d69a26b8eb5244e", + "0xbaf0b40f9a0bb38ea9e6ff3a9bed805a783d648f", + "0x4a7448db3c3d710d3ea3a5ca1c3ccbff420fb493", + "0xc94ac2aa4b06dd29a1b796fe655bb5e267ab17b6", + "0x09203a58b4eb8ed9989459f9d53d467c733c7f6c", + "0x57333c1ade2f53c6aea19883f966db5d1978e5d8", + "0x72ca83da36c692d6e74d87fee4e313b2faefa437", + "0xe668c94e7d1434396295a7e7372749b2b15b80eb", + "0x7cf517921a2dc9cc83726bf992151a2c8afcc442", + "0xf77db5aeb9353392b072aeb10b4698f3baceb354", + "0x0bd8ba708384d8fc1d7f4c980e082df4f9b2fa0c", + "0x612d8508e986b1d36360cffb3d97ba8a746cee71", + "0x1a21d7690d0bc3d061e205a771e808823855fc4c", + "0x354def09fbb2bca0e03e6ecffcf1fba2a5e57933", + "0x07cf8f5f965bc13187e728d29731acb49c8f917f", + "0xc23cb962dc02d4ecb10efe0a8233efe488474457", + "0x241bac7e941eaa2b664474b1d670ed6abbabb804", + "0x835df1fe0f4f2003ea8cc70720a706d1c65d0d3a", + "0xae6a3ea20a820e5fe1c9091f4773e1f1714c995c", + "0x46bb3857ef4b01428815cc6689c2bf0a4346dadd", + "0x74230b62042bfa69684261486995f093cdc72eac", + "0xc8e1351cbd65ef454077d46af97fa69114178e91", + "0xa15fd353540c0d39bb0fdc472c70deafd2d8bdae", + "0x05a7eb929209f5c1f2f08dd087b64bb1beba99fe", + "0xe08a11ab1531d6fa2f70d7415ab96bf77612e3f8", + "0x382ecd991f4a7e7d5224867235b7ae321d3932b1", + "0xe5802736aaf57ce11e78c7c26f1208ea4539c112", + "0x05325ef5a6e146b475289c3a8ffe0a3713265a3f", + "0xbb951023d53f165445d2e935e7c96afcb28c575c", + "0xaece161ef08b1cd48ad639ad9dd436286483f7cf", + "0xc937912edefe2ea01dcc4ca305c37a0fe72fd215", + "0x33b7816e80dc5394ba8ed8bcaa4c83364d41c040", + "0xa213c47b832886fd25f9c503854dfe3c94f7e8b4", + "0xd6840fbdba342de27423a2b00eff11fe8e77caa5", + "0x0148dc569965ea1a79351e7e9d0637d9cce9a67d", + "0x97d96b32511d5167a357af38a36ef59741926e2d", + "0xe346f2ab4c68301ff765d13ab43bf2d5fcb8b207", + "0xe2dbddfc63aff32ecc5ba94a7da4559ddb9a6f31", + "0xfc08b97730da2dc010a0c2b374029bdaca77f093", + "0xdc3e3e582288b4c6be77dc277d5ebddc5e347774", + "0xe620e4bd92992e34361188930d7b62703bee6d49", + "0x7272b3ea01fa354b1544c222069e5cae6006126d", + "0xb592c92124c496a63fa321c72f469d40b4de627d", + "0x69698e222e04aa1db2a70c6e3479276fa200c36f", + "0x4480ec05b221abc88581073183a1484b4dd699f9", + "0x9170ee2f5efb8e9fb776c265ee7bf5ea5d30d29e", + "0xbebeef2e5af3a0b15699e4f6c2333f3d81fd4644", + "0xe91313cd336f941cf8666738f34ee59d9194915a", + "0xfa9fd4801c8b47418db00ec388c16c5e8039fb65", + "0x458b688840e71342193a66012b617297fc79727a", + "0xf68e18d93497f8f0bbd26e4243ea42593c47acef", + "0xf0c9ea0d9e4e7cffceaa6ccbeeb7edb0e1c0dfbc", + "0xff717621429e10fa08c4125b8f7346f5f9ce15a2", + "0x2acdb4ee44ba33cba2588b3e810941f0bf00a813", + "0x8b79fe4f1b0fcb8a0d3636ad83ac517910952860", + "0x9d69e84217e5bffac77d6737cae5a17e25e6b4ca", + "0x1ed8203e7d9869a3934a66b4b08715423c4ffd4c", + "0x7a323128adc1e3a0fb9543f1c0021fdff4fdee56", + "0x21b5518611f69a0d087b18d5f2a014e1f94cc355", + "0x0f3eb4b76a2aa41c72caa115cd1d77d982e82095", + "0x22cac9038d4f2507bbbd685a3ea232e003aeca8e", + "0x192c10dc08cb291c1eb964fa296b47acf55894cb", + "0x3f3efd96ad9bac9a2febe0ceb00ded791af7a5a3", + "0xe3e04cca5442df09499409a8b43c1d55d33e68c4", + "0x0d8e3b881ba969148ef135db9e29b5b49cedb64a", + "0x27ae26abf4a252d6f9ef47033209aa7fe59ff685", + "0x2d9ee4ab528e35f9b548a8bb3f5c609a3682e0de", + "0xf1f55c5142ac402a2b6573fb051a307f455be9be", + "0xa53ebf0e39b04e6aa3b80f77ba887e3be15105eb", + "0x5fdc285baff1b11a2a905b97d381d36c57b46f95", + "0xa18ee1e97ba53dc01e180bf4ae0acbed044f410f", + "0x08fadb0b153efb4e22fb285511e361e475d435d7", + "0x82210162f0803da5fb6ca73de8b3bbfa7e846e96", + "0xd840a45fb93997888d1a6adfd02d25c98d5197f6", + "0x97bdf39670e6b983e3f59ecd75e88a8014643556", + "0xb2e4dd009af450042824258db5262fa9db76a7f2", + "0x532bc05dcda24650516e8396326ab6e42022af64", + "0x23d64ad1869dc7fef15eecf2e385262e9bab6feb", + "0xc5ad80e8533d797529f5c5f8b37254eece67af7f", + "0x3582fe976ab314d006f36b863c315db52c66ae21", + "0xdd065e6219730941818b2cbffe01d73b9c601333", + "0xaebad92ac83b27e7510c6d3a786c6b9cdc7b24dd", + "0xf19acbd4607d85808e766437a409eca1fb14673c", + "0x9aac7031b8b15d1dabce881f678c3416ddf39fc6", + "0xe1c15a7e0a3612b75b1efbf69dfa81a080d769c3", + "0x6200a42c3f53947599e1e0932d618c5150a7ce09", + "0x0d6910b8ccdc4ebfd397f9788efe59f71cafe6f8", + "0x1a319b74037210185f24702553269c820a7f43b1", + "0x75c5c3ac21381ae99318342a415d397466f26d6f", + "0x600f231fb44ba2981a304a9d07e3c030325cc03b", + "0xf486b6ddc8d06ab6cead28d878eda16e7bb28438", + "0x1d5718baf829f1ac2c625dcd68e04e32ab9440e0", + "0xafd4025b7235665350ffdab17d857a9db0f70af7", + "0x3dbfc1bbf7b44375c469361d06e3439d5b5620e5", + "0x19955d3b57ca3fd98b90982b9e9956a5f1371988", + "0x06099d7de2076e3fe5f18286b569204e96f2858d", + "0x21801105464342a13467cdc09bc10c3c7c8f7ce1", + "0xe5990f86e613c8e1398506a5b894f70935339c80", + "0x33bed4f0c00709766e0dfd6209809440a2c59284", + "0x8a017336a37276205e93c3106bdf0323b92414d4", + "0x2f817184c0c2c9988d5a6f6293609d144105c733", + "0x9c5d7f7a9eb604f05c4bde5fbc5d3cfda0dfdea9", + "0xae7bf165fc854712adbae9712c1beb6dabc51302", + "0xabd71ff09c7b1aa3d58ddf366d3a02ea257a05ac", + "0xca73ad9176e799bff2c7e805c23039550ff3972d", + "0x262fefff9ca4bcf2963095d80c52810ca3c190a4", + "0x386a70aafffba854552eb105203f41ce96f3f46c", + "0x2a3613dbe9ae0ba32a2491871703bb9d5078c474", + "0xa93e5894fc47c6afdefc83c205095b347d957dbb", + "0x029cdab42aa8ac150f9bc20a7bcd5c2e16271979", + "0x59572898ee1e7b58ec4a5d7b287f1d8e9425c7c7", + "0x3a52ed9ad310c066767ba47a8bbf2b05ea581e39", + "0x7a1192a6c8da0dced84c6db570714ec72089dd0a", + "0x31af52540aaf41de1c18bfaad696c1ca2232d013", + "0x92ea8ab4774fece080cf4e698ae2d4244e452ae9", + "0x12514f46d78e90b8fe058fc6523304b261a3c954", + "0x14f75f8e4ca9af48191df310a9c20282e55133b4", + "0x191acdfd0658bc9f9ac16885ec7294af1102de04", + "0x821761ee15388439ad51065cf6daba639cc99714", + "0xd11a608fd2431d05ec73fcf66cc6b9248bb79378", + "0xb6f04927f46e18b59a3d885d1748aa19cbdcfcc8", + "0x8e499a2f9df8a01a65ea61948bb5407b489c50c5", + "0x42ebafa799475bb8eacbebf4b798f70532d8623d", + "0x567f119635f986e794806a2864223c2d1d08134a", + "0x0ba909e1a9e2b304cff7ca49fc6ec30f2b001c56", + "0xdd184693c1089f16eaf8cb316f01f617fd1bfdf1", + "0x8295a3d668f82115aa99c5cf41eaa6e3b78096ed", + "0x17213f39dc9e923092bd8b3e25b78d4d73f69950", + "0xc4f1c40b7fbd5bbdf0d53b6abcd9e304ca2eb10b", + "0xf4b38249d162ebcd91f38ed32d1afaa69337aa3d", + "0x9617a9a84ea3f8889bc8c4851ee0018dd3131029", + "0x25e32b7c9b59c19b07dd07593fcd0a34bd8dd71c", + "0xdba08fbea0f9d21be17ba92debc277c08b192b4e", + "0x24c060c3663434e179aaba38e0b2af16a5a24ac1", + "0x047a2942946e8fe37e310790b4b1e7f2b1c58555", + "0xb20e7f7af89ce37100132dd86ee75170b41fefd0", + "0x10ce6ff9ca759a20d4e5134015cf6d124fd02457", + "0xffb248ee34a9a09f32551a49e85bb3ffce679669", + "0x9d74c551d6ad0d504a9f9ccd2ff9c66531a241c4", + "0x9dab4ee011fd1ac427eed60641c5e8c97f4e6e95", + "0xc81536636e05240cd5fddbd66395cb61e6b64b03", + "0x6484f4b4514117bb44d847a3474b69874223f3e1", + "0x229fa542fb7884f7bf1978f7a20eba3adafaa0e3", + "0xc063fb6df479c9cb282bd5dc097ca99af3905d30", + "0xda09c02591e4c9bd3d92afbca21e148894222206", + "0xbf7124f00028e5aa169e31fba8dc0ef9252f8a1e", + "0xa2b402ed4146a4e12e990d2a4841f742fb120177", + "0xff51e2987ae070d0e53f01309a60af358ed8cf75", + "0x794ea46e8935e36ce1e20e8f1caa42e1ebc86b9a", + "0x6d3a0dcb28317f8905fc44865b532b566bf17084", + "0x5e5bc05dab0209c541e19b7c115b7b0851da4947", + "0x99deeeb8be4cb66c1d38f77d836009b2d15a123a", + "0x2b112a1e3c126d1f8ee47b271bb3ed8e77a8722c", + "0x0a99510fbe18e285fbc5741289a8ea3696893947", + "0x7d1812356cd246667b189cc0c42d7f1cb909f852", + "0x9521c99438158ca0e18d8b140d0e04979dc32264", + "0xc66633091b0ab56e4f9dbfafaac34ed168664d59", + "0x9257fb657d9399424034bac9b5f0d54e9e336288", + "0xdc0f300ea6a87a1e46da051a771a7c47932ee604", + "0x2d38c08605ea805394198a2332240b44598f656c", + "0xf2991a25e82f79efa1b4095f4dfa2918bf777878", + "0x40ef1c2a98a77013ae2cd3ad3a3ccfd7afbbc000", + "0xe5c6d790b55b338b8d309a0dc53933c56eb06300", + "0xf5fbc15999521faf1865d6778ad6662d1fa4f1f1", + "0x08fa4d8b2f32ae666865a90258f0b2bc5089c213", + "0x53c3aae76dad49e266fad1b6fa46ade8c2ac1bee", + "0xfe0d67d415c6d7d4c5590905e00ff81fba126ea3", + "0x0eb25bfc9982e04a251b2f1a8bc5384a3e1d7158", + "0x5259e797d71fd288c32082266fd50c50e7313ad3", + "0x4d2907583f6abc6124dab05bc256adac123e78cc", + "0x78185f5273a59272d4bc21d43ed0a84a14839056", + "0xd7c0c19d42df09a2b72a44aba3e86b71b5da950e", + "0x3504dcc3df7e8f7cd3669d46e5719ea4411d08b0", + "0xd66edbf4eadea8993e2f1cc773f9dc2e89ba2537", + "0x7871010b5406c06a8d9cb040bb9893331cb305b0", + "0x0ac9b1ab30be65025ab43a6728f32bb75c27e860", + "0x10b7f09f9f8dd7b22a629074a077e4114380428b", + "0xbff18e130366ea9148e8736b97ae3e651518a00f", + "0x30530d8c6f6aa5416609992bbe08aac518d8525a", + "0xcff36b8015bd2a03203f5431d4be1a9871c53f8c", + "0xd5e7f1bd89c3fc7f7ba3f67f8cb4bb922de1ed04", + "0xf4f93724b5bbe878c4a4c2f1478c3b70f5d343d4", + "0x59f6e54f4da3798a2f0081836ca5a7bf3bfdc05b", + "0x8eb80d95b4fdf2591a29037fbaf42b3d8aa57d9e", + "0x6bf36042fc00d0c9ad9490e0a85696687fbd5328", + "0x4b5904aa5c6bc1a8d775fa61b7fbed99ab3e83d8", + "0xb35cf1a64ebce8c5217120780c032fda1ebecbe2", + "0x8fc6adfdf47cbf7bc62477df91a98a2c6b7202a7", + "0x4e17690771dc57b8cf750e12676c87a4dc3b2e46", + "0xf6be3816ca29e641bd532aa089672a0d306e3012", + "0x473bbc06d7fdb7713d1ed334f8d8096cad6ec3f3", + "0x1fd495cdb490a021b034c8b35745ac065c4b91e5", + "0x5a725d5dd0ecbbcc400739d2d4c3f8c6ee4ae351", + "0x413b5af2b0bfec9abc0044652cd4bba87e88bc96", + "0xfe5f3c9dd84df88f070e826e8590a1dc50e58b2e", + "0x0966345d33c1e0fe0f90f9ad5a1992a16a9d2ae3", + "0x98c736a1f48f0236eb76b1e6d54b3ccd6fdb53df", + "0x0a9dafaed64f012ce737c5b807c653293397b117", + "0x07d4f49cd7a64e599d6630acf254edac617e2e81", + "0x12e31af4b11ff8f223adc48f45d7bd5c5214f04c", + "0x6cacf42e0bfa6588d82e322d3cec7b4b4a1f789b", + "0xf07e1bb857c67e926f077ed9ef19d0c57fb2222e", + "0x85d8186d3ba0f8606b3c38de6eec002339d3fdfa", + "0xe2ccf43052f7a01c79e0e1c44c8e0c1252b6131e", + "0x730d48aad8eea0f2b938c38ab567d78d32b7ba76", + "0x27098a53a5f259d5127590cefbc9bd51d7fecb7f", + "0x5baf11dfbb8786a77161e65a75836c59d305fef8", + "0x0552d569de26a3701c7cdeaea1bb86aade341564", + "0xc6807ba1d89e6a0ba7e3c4b07bf763d9a9dcdf75", + "0x341a20d0c1b07e4658b50f92b3545cc68df249c0", + "0xcc7ecf8338af0c0b7801dcabfbfd2076828ac389", + "0x10d03b44534e20bafdafa2fa787cc58851add6c7", + "0x04f004eb2431e8f79fe0c671c807ecb2f5cc71ff", + "0x4056b114d93599db8451e7ebd147fcf2a8f63eca", + "0xa32369a38a872d0f4da54301fcda5f3172b7eaa7", + "0x350db560517568910034820fedf7eb73c7fafad3", + "0x52067c93006d6b91aac8009a8639a2bac90e6618", + "0x2bc3ca92d876b1e9c728113f5b5828e80e4d53cd", + "0xaa5f86757dd6cd1df5fc385304e40a867b55dac6", + "0xb3c85256e90c2fcf60ac30098e911a817c02d0e6", + "0x64b7be4919a69c44b40d9077d5e97dde5c31876e", + "0x1e84d0756da7c55f06a5439e07dd6bf8c44a6a5a", + "0x6139ec29e4d3508e63c2f8edd58611e79421a47e", + "0x6e4211efa2c0f07b58e4f3bde264994e4fe03cdc", + "0xbfffc77762b84846b54bb3dd4be9e1e90b7aad79", + "0x86269a372c30a3c5e861025e2de3ec5d7f544ff4", + "0x65768858cb3ce606a549154e8f2e27c7a2bd4c70", + "0x091b76f437a4de41457b4d89545ea34c16cabeb8", + "0x2dfacc58b508ca9221a4d634f8848b4febca3350", + "0x47747a4d4ad3f979f59fb087e6d7e86b4ec80217", + "0x19c85aad30c8fa01bb803ba66886a0dd33b0bf9a", + "0x64eaccb62a35eb791cf79a2bec40e902dd99902c", + "0x166cfbcc6bb5a2c47655c793c6d83be78944d0fc", + "0xfcca8fc3a7f8ff3b5607b805428bdb2aec9a0bbf", + "0xbcf5d9deb9522cd7a464e513e1842c9a9b76a806", + "0xd5102725cc00421854dd616a2d8769ce36017315", + "0xab0cacb66009f466cb6b6704d3e55669626a1f08", + "0x333516422696390279919064fcc1f07f48044c61", + "0x0030b9f1925408d79be83c7cecfffdbacb638e9b", + "0x4e5b3d4c8fd4d35c493b7d64af0f04d1d2ed2122", + "0xd99ada49b09d2a36476794b78aeadb2f5058a9dc", + "0x800e4e4b21d17757158e587d352296095f39d174", + "0xceb3de183f566a0a296f0c6542c8ef65591ca04f", + "0xa964113dab2bfdff8b4080e29a2bb8ab52f71f38", + "0x131fc78c38ead042b85058e259a779319df69b9f", + "0x64db1b03e8fb46a51388a058f3b5b9320bf66e62", + "0x81e34d5724717bb39fa8b27572f97e21d798c45e", + "0x0a380e4b794b4f40fac2d5ef739aa5813a7d67f2", + "0xb8551f8577e93172d1f95cbb967c1042147b3a4d", + "0x541aa1c1eef7ca719926865e0f89336f7ffc0e05", + "0xdd891ab564c23d4bccc63cb72fdfd97306ed5692", + "0xcb9d6d4deea6d92714c62c54e59d5896229527c1", + "0x1b20ab2008bc098de721731289d4fe85c3848aae", + "0x3b74fe3551d9421d7d1de755fa74aaadb3e4ec87", + "0x35cbd328f0fb2b45132b76e13ea12dd591952d60", + "0x22cbe6caf10f40bc143a7762e2b4c007c95f6c16", + "0xd55e3625fb90a934e795a6e13adbbeba7d4f223c", + "0x2b8cd75d3e679531918feebb9f095a17c982baca", + "0xd97cb79933f1ac305547902efd11139b00b62390", + "0xeb9455d58af03281a9f9db1c6afc205c20e62d3a", + "0xafd861dba1634a86083025d944608630b85cbc00", + "0x5ca2fa7f8ddd8d5069e44b57513cd130a9e0861b", + "0x21832bbb658e589e9d40e43df6725dd1b613b3d1", + "0x13e072b9ea46e06e9c1c4278d259ba3cd3e2821b", + "0x6efd484105644ca611ece3969938a05e0743c96f", + "0x866a59da3d27eaa2c435e5a0054383fd2b784400", + "0xa9ce4ffda9bfa672f54b20cb6cd046883a556fdf", + "0x5e95128f86908f9308dc79c7f5a27ed4e77ab137", + "0x62dd58a4787b1316208b8ac5273beb330748ee7a", + "0xd051b8fd12b9c6cdcf58218104341306d831a8f0", + "0xf9743d4fb85e891bc246a69297c6522483f0290b", + "0xf2e1248fa46af0d3c8b1094b953802e27f6d196c", + "0xe7d6b71f216584c065157998619debb2ac552b1d", + "0x891c7486f0cbcff74cc2a957ca3cc89fe57fe343", + "0x3c6dd7b4d57c93adc77b1495a31fd9220b80fa17", + "0xa713abf7c78f33eb6539e8bf1b439a0c5ead3209", + "0x440b3b63e5bb93f76236cffa3e84ccf947529ebc", + "0x49db225844d165535dfeb60286f29f54d7a7199a", + "0x5f957a727c741d216a574e1f5e59b1b43afff11e", + "0x57986d8afb22abf090f3bcd448bb6a1460b8cbc6", + "0x639eb2aa5746808a77d7114a6f66623a86494eab", + "0xb37cbc66f53f1eb58dd2e84d365fb79b8e215634", + "0x9b4861e73bd3b4bfb1b26fc288a41e7d5271d8a1", + "0xd8c1f8da497e7a09c692d950b6e0afd15cf89fb3", + "0xb9b2ef56fb3c9ecc0b511c20a4bcfb020fe68ff8", + "0xcfea51cd995c369ad5e2ba6e3037be9a50c682fb", + "0x0d17eeee23f4f99213fa31e381081126449adcb5", + "0x913adc9c72b6996b18fe057e22fbaee33897c3a5", + "0xc11c249cde879cbdd00802b82dcc0e0e4939700e", + "0xdb172d3a7516c2276f1c0e5088250dd1f8927ee8", + "0xed20b9fe9060d4a11b63f4a5da9150b0ead15b5e", + "0xdc247af10a4f12cdbe60b2c4e848b75bfa1fdae8", + "0x27adfbdb9a913ffdf886b4f76eca80ab8f189bef", + "0x0f21739424cb483c8fcdbe2360321d994dc3a871", + "0xc9a34d4fad2d4a6e7d073a587657534a6825c04c", + "0x38bd91321c4e251245cbcd20ca8b32654f699418", + "0x41f4d4de4b347d45e560bc8815549affdcf1089c", + "0x3a491981afa5f6e3df64d095e63568e24e0ad83d", + "0x96a3ba33255a96634e98d108cc111ddc87376d7a", + "0xbb3b4f59dc38831857d64f5eb597f768e49faf0f", + "0xe5392c67435f43fc66599eb07acfc46a6bad1440", + "0x4c070236ca7a4a4ef29e7004d52d745ec665340f", + "0x1d5648056319856d656be25ef82ed0a939abf40b", + "0xafb7accb2b8628282232525e8310ba8473ae7658", + "0x177ee2c7fc75bd3b569e33e3823aef7d507a4f1d", + "0xa3f389c8808b8a70a773cf2f067aca02770f93be", + "0x8237eba1329db5f3c35eaddabc066b9c04ef8c91", + "0xbf169b81cd703aeaa73092cf96d9a508727b67fc", + "0xf15584bab910f127ac4c64d178da770508eb495a", + "0x9d5d35ccdcfc88750b361edb694129a4c3932b58", + "0x42356ec7865231307cda66035a4b11b2621d7b86", + "0xe17c403ed3448cb0c3ca8120eae427df79aba557", + "0xd3d357f7cf03f5f7b0cfb593ffda2ccba8857b43", + "0xdeb763173700e7897ab66c9faee42870f5b4ca66", + "0x090234a5e6c4af26d56df122a95ed446f65c2096", + "0x02d9d71050f22f1ffcfc08544c098e1970ddc53a", + "0x2c87ada076442f55296e9175a66cc89d99c0152a", + "0x6bcbe678a9772d28f38d974ca63256483dddaabb", + "0x3404156e2ab8d095a5c8a0db1aeee54b66024001", + "0xf6415fb4cadb5fa8d7e04167596ead1f4bc20dfd", + "0xa4e794785c8c363041d7ae7e15e04314ea6a4c22", + "0x6e2d241c2d136004d6e192cdcea066251f886349", + "0x38b89a6824afb32e32c70ce2324eacb7c469dc18", + "0x81d9768aee58f4484f3c3f81187c0a018a1593a9", + "0x6a60e2ed8ada25b5d1e5724f006e65561c4b3c54", + "0x991ad2dc6b51cef3dd9f964c61d014cfebf9dad7", + "0xb042edabe4129d4af070fdda753184369492f5d7", + "0x2194162a5a8de84d78f0ef93475096286f015e5c", + "0xbb783bb6e36633b7f844475f1bdf2ebb65da8aaa", + "0xcb54cb441a0b4187bbe7513e5256348b66adfe6a", + "0x58a2a90a6aea676e8d59b50ece2337c99fe45627", + "0x0343aaa701dd011dfc711970d055841771e03066", + "0xf7a5812ab61720380faa9f7efcbc096dddbc4d1d", + "0x3be741c5c80fa2732400bc5f2a5856e5c229bd88", + "0x433946f5c05f872b3b382486034f0537a272760b", + "0x89ce106ce4f2ab0cf2ecce048c82fafe5a4b7fdf", + "0xbf97c2f9f756ad8823d8000ea76e3096d2f9f8d9", + "0x9f8bbf27a2f6d4ee00a8240a9d68b8dd9022cff1", + "0xdb350a40eeba7437daa865a4d38c97695a49ac79", + "0x98fdff96e7cfd20e525a1e96cbb8164016ba0b93", + "0xf1195254626ff03bf7cb225ba33d9c8c26c9f8b8", + "0x8e4bdd156e4dd802dd919f4fd2645681ce99a538", + "0x0c17ee21760db085159148c93c1c9badc662cdc6", + "0x7873dc24ea59646ee7332ae36e40decdbd199dcd", + "0xa49d3097c9a74ce6bb0fe662b9124334c063320a", + "0x2e45e4f2a5aef2e75313cfada5ecb7f420efdf0e", + "0xfdca610f6fbfa4dc032cbaa973a701076e236306", + "0x3b3908edd878ac42f1ed3e53cc3af02577d072c3", + "0x3d063c72b5a5b5457cb02076d134c806eca63cff", + "0xd2129be59b211e1e9047f50d3af37bb6e519de82", + "0xe9d6ee3900624d3fda4a5d7d49a9b7a145668fa1", + "0xe259c461a775c3937f535aef50f0b668452f566a", + "0xbcd12c1ce63c55ef51696bd2adf860fc71bf6573", + "0x9e7befeeb98d707122962df965bcc6a7a811ded7", + "0x06b6b1bf616816a8b87dab6e26363deb0de179ea", + "0xd8cedc40d030f69f0ad1da005895d1eee9d93ade", + "0x662c838ca8ce777754197fde52129e9b22e86aff", + "0x7c3527e0ee18f54102690c377ea5070357bc1050", + "0xaccb457dd2f693899fc5361d6ee4feed0473def2", + "0x8c28b19116b7ac3a54aa8d4b852effd2604b2579", + "0xa2fb8aff4b76456d9661464bbf8f393e4d3ea426", + "0xc33643e57d22dec3c69c5bf984cd914bc8638502", + "0xfff86e069e2b41442268c8e38f0e2e5ffd996a77", + "0xf04099b30d233af32fb6a906024eafd21cf4d697", + "0x6746e2ffd5a3fa71de77f5f4eb4c4ecc606c4d63", + "0x8c828ddd706f1246127805453b199288aee3aa22", + "0xea7dc440678801f77410c86154110f4e555869d8", + "0xab9ff3b61c1fbc40d1ac6610b3b1093805165fb9", + "0xd9fecd23f2159543a59d22ee1a2cc203771f844c", + "0x1362ceed25935c7e184253eab6dfd00fc1961241", + "0x5eb0fa7ef05f68ee232a86c9dd1963b55ac4e551", + "0x73765a21ff0a9640d5879aecc0ba7be10802311d", + "0xb10f272aa1de50b67aeeff63025eb755f2020a16", + "0xac8b4fb381337a7e095e1e4bf5cefe16ad30b3ce", + "0x3e7a177d1d1ed96ccf1398c9c5abf59726154542", + "0xa23b4bc39070fdb30779f3e587b720fefef328ec", + "0x5ee51bf257aed95af682b12f44fc63451211353f", + "0x41c247e7148a68b2853ad4cad9fc05f0e0d7e9ef", + "0xa15c7e971d93cfd44fec4a2e0fa856e79edecbe0", + "0x3efc834724891f9af2c4b2ea39a1f9c5974cf13c", + "0xfe65a9d596c006b8f33b00baa815043319b054e6", + "0x6359ef876d6f82f669709950bb2c8e19b8e82481", + "0x7bf8101c9f1e9c0fb7d56e471d78cd091dad1bb4", + "0x923383f8218d66207eab697b2a417512de0b320b", + "0x753254182d25902f56c9909426d388db0c21db21", + "0x2f658abd02c0293d91b5d68130998bdce8a462be", + "0xd638c27939124fa00194bddcf6a715ce9e36045f", + "0x603efd9a1fdf07e10c42527382ff6227611c2505", + "0xaefd7e37c75eeff121d2f3d7afa574ae644da9a8", + "0xb6dcbf84ece9370f9421e4bd7b55598e7b555e7c", + "0xe6c8c6ea1fb3ccc5be99b9a84f927176e2b44ac2", + "0xfc87b6b9347e56b36a90e00115b3efe629f182ca", + "0xdbad2b44bb4d1a4f3df88080121af7369ea71936", + "0x54b0ccadcd15570de77a0d802dd2b1903f32685b", + "0x357007e56c369655a38aaf67a0f107a9b99a226a", + "0x3dd5821d74a3dcabacf61d1989a31656d1e7b18b", + "0xa45211cdac82480e9027f0f9fb827ea247798089", + "0xe4e836baada118a60923e98e5cf874153527f1ec", + "0x187618b146efa66b666793ae82fd5c9c4927adfc", + "0xdc88fd3dca0427a7cb6e4e97cf27305cbf25a82f", + "0x2424d63358ddb29a52c9baef12cd39c71bf556b3", + "0xdd8ad4e4d68d37710fc36672f52d6829ecf9f4bb", + "0x75b5bc501c23903342b331b4fcfc97ad732916f7", + "0x3c8b9a528a09d7420c3a0fea19751f18bf838c29", + "0x6dc6f34e4b4e9b5de449a3c4127bc99b035e09df", + "0xa2a6117bda69d57dbb98fee113dad91fd503337e", + "0x1acd043d55312f1d491fb5600d67f560aede7617", + "0x874d1b96e009ccaa25bb258d8ce102f2e6be29e3", + "0x5913ab6179430a1660ffba7e2228f5cbf00a57c8", + "0x4a38a93cb14439fb09cb3e0fea7c8f1638377af2", + "0x81d1e68d3e2ee18805a7d16ad9a5482b30a62d84", + "0xdef7e90ae75a811e1a70a9c5dcf1c3b031dbaaf9", + "0x019614e4495ae9f35e4a8b8056581ce7121be9ae", + "0x541df52dc6fb31d4a4598b3e1e5e7026931fa78b", + "0xc3782928fac37b518c1bb63914d3069c9c107813", + "0x8ddc0b615163be69a632b7a5f85841bcfd228399", + "0x6aa7b6bdcddc20fdea4b88f0d8cd21ae6c5aeebd", + "0x1bbeb3e380a8139708d51cf3974cdb195ded21c3", + "0x53cd32299eaabb8e8b55e0974401d4d8ae249dbf", + "0x729c880f98401132ad23cb547b5dd66797720b66", + "0x7f1bd969d07a1c094a5fc07b6c4f7076b40d42bd", + "0x2afce3ecb7af412233c558412d4a1d38a3d89438", + "0x5d7f2b2dadedd238fe98c65b67aaf2602e5e54d7", + "0x95bee3f630f71c98dfdd78ea0d4454791f21c453", + "0x851a88571af500482399cc2cc69d9edd48332638", + "0x4237f3268b61beec539c90279e4acc843ecfd152", + "0x364617ceba10fefb13a845116d1fffae01de800f", + "0x70a00d23eccfb5d2052eabff999db7ee4d787ff2", + "0x5a257da2dcd4f3fbac63c324efe3914ee1d3daaa", + "0x09e3546ea295127b528e94b4b16dbef508b4dbb7", + "0xd7be06fed116c75c4b0e2d766f5b69ee741e15e2", + "0xe20e4722f01b6e78c1a7d9d1b9de7576e4e2d11a", + "0xc162e85f1ff90da7531437857cde6b1b2839f06d", + "0xe389cb820900a46c2035fdc0020378c66f22f97c", + "0x3a6de3d2eea38c6d806ca7a0924d80c85994ce16", + "0x38d03fc253c924796672eff896eca7fb05382c06", + "0x447dc392472e6319aa14264a2af2cb6ab6ca42ee", + "0x8f149ef4650c846b49bf168ba74d6a138f8814f3", + "0x5ce66f35b519d7c0510e58595640735384829244", + "0xd8b62078a5b6219532a9a5f68cdb7cffaad07e9f", + "0x090d7e8fb6b37007866de7f74ad1cdffbe0cbf45", + "0xa1cccbc666f3458b79a7ba57268a9e26b4741ffb", + "0x58879e7ab3045e48317990f95e05b99868fd6e3c", + "0x79a57800bca23907f671fca9826e15416c6a2aea", + "0x114335b1aba5c6ca56845859ddf26bcc0494c417", + "0xa1c42435de383c633d88fd2b2a7e0fe90a2499f3", + "0x0860950e0b91807d3abbad88ac7321dcf19e5c90", + "0x2c8db089fea64c31437cd1f75a65e49ecbb2f7b6", + "0x727540700f83f08495fe062b2cced0545023246d", + "0x8d1cdd26bab908eb966400e96039b0a6ba75eb35", + "0x60939988f4f9a05c4845b4153531b0be0c3570ce", + "0x89d568b136f50305b476a0478a69947f546c7911", + "0x0b2deca5809cac27dc151a6e85371120b153dc4c", + "0xfe0427ed8d5a454c2dd16b467dab2fa8e7632d5c", + "0x0295cb6cd98aa3f2a8ae832a1b9c6f2b8a7160df", + "0xebb1187706a1a2b419983755a8187aac66e4c316", + "0xf477612e30f186a05e42e33486b56031bde53775", + "0xb54fbca1964d4b383f0166c8a240ea000f10fdcf", + "0x25820c11d4a5084d23ddd906c07f7dfbab64c361", + "0x7dfa8bb13fc2079e59c81fca18450fd300c94e1d", + "0xfda9f071d3b3e311f5f91aa8e0562a491e2b1e1a", + "0xd73e4ad79e0e0f59393abbd4aac67fcab1ab48e2", + "0xaada3f5086f659dfba21ae2d0952619666d6c9b1", + "0xc711753bc98d5f4001eaec4a16aa6feea6433bda", + "0x916421ed84d8ccb631786683c50ecf4bbf5ef002", + "0x9e7fed902c2569438b8d8c2e81bb482ea5a9d20c", + "0x11219be74018e03f6f7b69d91447a8ed17ecdff1", + "0xcd2a9794f82f05af125aefaeec3ccd6b4945de4e", + "0x6b889e9733c9e4d10aa06f4257f021c4d2bdcea0", + "0x12bda72406de5a6a303a6dfb70a9232ec358428f", + "0x69dc0fad58ad71644b743929b1154c6dd8c812fc", + "0xf537735d62ce038a2027d5efc5917f12feb26ce6", + "0x6dac885f520dcfe7449d5c7b9a951f7e9f3ed911", + "0xfc279ca134fca9635fb0fa74cfc42419d58cb8c3", + "0xd6936a206a2a03455589e8ff3da51d1c4598f939", + "0x58b95256ea2aae380987fd29ed7be76adfbc0716", + "0x5fb9defc0a4a34ea09f3514ad9a5b8998217bf57", + "0xdb3407a6ec31e526bb46c3c6896bb0770fcdbe90", + "0x5c0667ccb05e0356569491f0ec57e6d743bd0d1a", + "0x7c2d723bb029aeadb309ed4f35869b35a34d8008", + "0x33e98d30af53dc65c810b895040c95ebdfb06e12", + "0x99ab2b0e9eacffc7d17e23ce862e637e068df501", + "0x385cdc7a7f35aaf8be94d52020329fb0d6db44f4", + "0x2cd25bf08d62705da59355151fe0781ba93b66b4", + "0x31ba58d6153e79f7ed0205c7bdc553ab8b10ace0", + "0xc6966631acf2533a247ddfb67c85493aa4e7e336", + "0x1639315b0b45d56fdceafeda36cebd97f62b72c3", + "0x3e26fb313bca65c3e70a2eb8b1b2bd39e1ab294c", + "0xc6f81e432cc27c4a7a51e7a428ad0220804df1ee", + "0xc17c9fc31dcc43f896991a9279122a0b93dfc73f", + "0x93222d8cd2adbfb16158810de56d848fcbf3b25c", + "0x00ff21c847f4e6ea9d10422ab35e1a8614af6e77", + "0x00e16218379acadfe42e109fe01638bb4a28df86", + "0x0b25d9d4d3a894949de781e98287499358a7ed7b", + "0xce7ce61413a1d7be3ea83af7fbc59662edb6aefe", + "0x6542b21cc2abd882f845ab222d6e7f0196128774", + "0x9bad817e7cbe27efbc4b87ad36ac2f6f56c455a3", + "0x6f09cfd180568eb6237953631a4b4e9d9b52cd52", + "0x6b6d248f5a076df3e0d2be6cbceec9388e7cbe89", + "0xd77abf285251b34a62fd4dc21aae833af6c00575", + "0x624fc4ab973bbcdfb47f089fabce68bf0fecde90", + "0x95ba6cd902c5ccef17877961b3799e3b50e54294", + "0x293c55aa6934079c08671f9aba1798ba5ae2e3de", + "0xf3202d5c04a30b4a941b87abf4813ea0f86e75de", + "0x68bcaa9f0c1ca1aa7cebd158bf476020b71cbfdc", + "0x199c719c83d8246559700c00fff8cde14182e192", + "0xbc86d00f39eca60f277f4a70889daeb08373aa79", + "0x32b95e8e371052f5076594b2edd699f7bb4a5341", + "0xb5c9e7697eb82d0d3cc279ec7550dc872c71e6d9", + "0x51cb369a6f6ac42ce5a352a279410fe3d53c4c23", + "0x94ba54db0a63f36fb40484e04a8ba48e658aeccf", + "0xa2866bf21897f3c87a678322521e7d69932fed93", + "0xd425c3ea47d65a19d6239c88b029bdb20848fe5e", + "0x7d78c5974724a088aa54bd7593774bb7feb4666d", + "0xe6c878482ad012e9d2876a96891ae44dbfc4ac15", + "0x809c133ecac4f49c1294f6cfad520cf1a5dee07e", + "0xb84b9f5f606929f18c6181d7f580936e602efc8e", + "0xea1b0d6659b19f6f5c17d3279a7e19397f24ca0d", + "0x1b2d4b548870d57d169df323de58d5b6698be8fd", + "0x3d6f6268b62c401a0e417a853098d097cac78f2e", + "0x84b741b96a244d405dc61c6f4dc5cc1d2f564f31", + "0xdca5e72a943e168b68afe61fb16cbdf897cb1314", + "0xea090e8348a80d07b5b4e82cb142c59b3f2d5e75", + "0xeb7705f9d18a32cda9f55b7390e8e4d7dcd63d95", + "0xe99b71b9a035102432e30f47843746e646737b79", + "0xa085dd44bd5501bc0167b054ada3868a291a4386", + "0xf746c5be7ff26b85126befd39e867edf2833ea4a", + "0x8cb7d33cf2a2c0893e110f6a0f8d5eed3dc7a236", + "0xd467aceff66b6c4bbcf6e92493f2c388b2d45045", + "0x1a580140d181d597a67ae357c95f11d2bb1269d6", + "0x907f02d870af5b2e7b5e2c941f2a905312d3c80e", + "0x53272646fe2b59946f274716598d56ffd3441b85", + "0xb11c8ff272b84b3fda888f4f088356b636fbe57d", + "0x7c021bd631cbcc41ddac5c406e3dc185be915591", + "0x7ee0375a10acc7d0e3cdf1c21c9409be7a9dff7b", + "0xb69ae34233b5891dae2ae4570200da69d738aad7", + "0xc20d8c46b2ed87688aa3021e94a8803be234a333", + "0x2f49bd9268f518d83f00c79414ba0f041e9a2184", + "0x20cd7cf4b72b999d6ef609b3d02398ff336a32b5", + "0x4b9b99552864a740255206547860c37b829a0bcc", + "0x0cb8a62cb4be34b6dae3d5e5700985b70834e850", + "0xec6cd25ffdcb21934faaa1f38167a126a9ba8f9e", + "0xc553acac773b2ec504e578c7eb4d8f1261e32e21", + "0x5294eb1736e928cad0b261067354280d07a1417a", + "0x93d56e918e3b195d9a9ac01b4e09a5ce977ef91d", + "0x272de55e14d970d9fa9884b8dc095e4b7929ebce", + "0x484df169ef44f7e696df341881f54c6e53be30e4", + "0xdd0206010ca82ff22303b58863b3a6f3006c86c4", + "0x757e2b7b5573865a583a779db695bb00fb98cc65", + "0x792dec10a77bdccf6c706f860157d8be691f4947", + "0xf6ec3022c9d9348de8b5f7785bb63b53a70af81d", + "0x2d927996c268fed6068aa145fb06d89b12ee2f25", + "0xf7c946789f8996b68bbbd118357d3fd0c680c2cf", + "0x4a54291f4df0f95c60087a758480e0d2f7bfecf1", + "0x62df8a809f52486151763ef090937d940493355f", + "0xf3e42e881b0b71b7aa05211b130051e796ee922b", + "0xcc14cc9f84ca9f992d9743305aaf7b762fc80eb9", + "0x10a42e52287e0042574f68a87e96dc90fe726174", + "0xf2d4bd38d61f2e4910f8fc1ae10b08e7e6aa1911", + "0x38914e65b4ff1c605084dcd391be911674270bdf", + "0x8ff121fda97c30244dd33f3f0690deaff485fb0d", + "0x4d5dcffc7914fe741fe42a075eeee264378a697e", + "0x239716c174cad8542116b47cf419195851d08305", + "0x3a9420000eb734ac5f829d495d26faa75aa08092", + "0x9530f43922d1f68a80ba3bd3e0d8d27819348332", + "0x0e1812d40f3f7e4fedea3257d5af6078a4a8c7d2", + "0xb173ca87c13e074573319d36b274946bef813055", + "0x19fbc7414c8c18030476b656a2bc04cfe5240910", + "0xe3cd1244d59191a81370486aa1f1faf1410f29cf", + "0xcc9737cd106de5a44bbb0ffd1153b1edde51ff53", + "0x39c658c82a06fa263fe7d10679a5eb1bcc1e9224", + "0x098eea8586b9fe3b87549f03df237e89f296f460", + "0x6c6db850c2d3849f2a8b66886ec4a754fba5bee5", + "0x124639c261f78b7517aa89fce244505b326c6624", + "0x9fac8fbecf8b4b5b0b87d61f857bca320407dfdd", + "0x93c5635e84da69c008f9f263142f5c31df1207cc", + "0xd242a88f202b793a80a353264f1c51d292bc951b", + "0x87d5d7e49f454c2e9dd0eb03cf474cc6c43229fa", + "0xfed257209796eec486f2a1c0af1b330857e463c4", + "0x33dab1946597c61f1deeebcaed8aa7594a234074", + "0x2a88453297f437382c62724df31bef938d0299d9", + "0xe01c79dc7549d21b2c447bb13797cd0ebaf90c48", + "0xbd6a19baa7fe66918e4eaea529777641e8dea93b", + "0x06f325145e03534bf40d959ccdd843ba8b1fd422", + "0x4972a4ba7ae1fe1e32ff4eaf02d7915860aaca45", + "0x8a0f36cfd08b1da097f9f6701628d8f83fc4fe04", + "0x063260c473966a4094b034adfa3bb1a1fb87cfb4", + "0xda2eafe7f4b5f754ca47a2fd4b7eda124a706b39", + "0x298bfc202a0dced5c9d9daadef0045db01e798bc", + "0xf36c153fd174259a338c037420feba0a71e4d707", + "0x79b0bc84bdc46826d1b22dd1c5e733f2d66766d1", + "0x27f8fa8941aab7debe686b121e73ac2f91a0653b", + "0x622efaf07bebc7615d54b34632458822f0546dac", + "0xe8285bb385d2e4b4b0f7b7f64de7fedbabf3548a", + "0x9a94e0eb556158d9717c719c36a54a1d90617150", + "0x12ab4a57e0868e80e0e9de4c306f5188881cdb5b", + "0xbe57dd3c106e40c4c40e85f150b7f5a90b739f76", + "0xd8f995a376ebbebdf59000d5c30a696a9a07c981", + "0x811a5ffbb0433d8d541bd0fa1847b24dde3604ca", + "0x92cdc0174e4968e8976a140543cdb638f0ab290c", + "0xd7ae4bae11c646ec4610d182f6432f63187d2b9c", + "0x2620045bdaa52f63f142d69642352f080388e9c8", + "0x03c34c3bc706043e2cc149ce1a5bea72dedcda9c", + "0xc373e15cc3ba5a1b340f98c0ba6c4fbb05fc209b", + "0x5fe073101f41f55d0001f293ebbad04881ca6e46", + "0xe58c5d72e66d816cc6585c80ef06b4efa34ea835", + "0xfb6d1c7a694b4ba4e7fb6dd757d07a16375f2b36", + "0x7207ec3d3547625286f5eb252b48b193d3333ef7", + "0xed684dcf4e26c619e4615f32fa588b988a3334b3", + "0xbdd95abe8a7694ccd77143376b0fbea183e6a740", + "0x99439347505be4bc96a79739f6894d67b5346a89", + "0x4d301ed01880ce82de94ed1fe82c5f7db9fdb016", + "0x2413967e85612d18f1bdd664203eccb4cde83f54", + "0xbeb61830035ffcfa721b147dbdbcdbd8ef63bf8c", + "0x4bd8708f3f364f6ae1645ddf43239e6ea063a877", + "0x52bc68738b818decbf39bb13e77512e119897a79", + "0x302bc0978260c57d9d7ab280ebdac746667ee21e", + "0xe77ba86944735a9f39d05ea300288287bf7c70d5", + "0xddf61e2600be13212d6a5d22dc7bac06c42cc198", + "0x306de5cbd7f627ced16a2e0b687e5add5074a283", + "0x75d989f40e78788a9ee64f794efdadd244a835a4", + "0x5283ae595760e2fd0c4c8b7b26124b4c3e1abfe0", + "0x3e07f5cc882b46569dcd1711226fe63d9cd282c2", + "0x5df911d5313180a117a6e4fe5da7a5cdfbce995a", + "0x179ca1f9b093533735a5956fb75154933352c8d0", + "0x18d1af638a06ae77e7f8b421bc1455e9455b2b27", + "0x3297b1e563a8e8dac1ffc58a7c7b68ec468250ae", + "0x9898784e8ec583903431dbc4e6a1abc314d493ad", + "0x0ae95c89715da032b342c8da3415fde7b2b8fb37", + "0xd79f5209017a144f67f0e23eebc74136c07fe38a", + "0x8af60a0da25b33e75e543ff5423e12dd31c8f8bc", + "0x2df806dc60d6e16003d43e6de9cd74dc3aabd96a", + "0x67966a0858fd8a650e80cba5c2610bff2ada28d6", + "0xc2f99e9cd3a24859f39e8deddba84026bb43d9e7", + "0x29e19824f5cbcba5d386a7ce4e0b783acd674bc6", + "0xa006d3a499568dce578e04b590aeb4aa2b528010", + "0x5dcae053ee195b347c9c263a817cfbc4814b0ed1", + "0x4e29688712d55fefa59841588d4d98b4b90dedb7", + "0xadc0c3af9287873be3a303bb124d8ada513cff42", + "0x1070f9f4b4cd93ed7127474825baf164a6458084", + "0x4334b245f9e19f907f27139af3614e410c83d7e5", + "0x5e90b91b87d44614c442be52abb191d535b164dc", + "0xe83820ff6c1122b92712a24486fb40377705400f", + "0xc6f6d620c1b1cfe6f2d65988e648373ead8896d8", + "0x88489c37cb2d61b841b36575fb7a4c9a571bfb79", + "0x7d731a5165edc8e96dfbb9141dee4864bbc13f49", + "0x79500566a7ebcb4234ad03c160b7c9dd930085a4", + "0xa2fb3c84e088ff5451c84ad06d450b5a27e75577", + "0xfedc99228c34c17ff96c00b127460afabfd25068", + "0xdbec9d089e86b1f5bf4a801ae75fa7e637795f41", + "0xbeedd5888d7418c2189d41f075c4f13c61ae88d9", + "0x6cadabac73692fdabe077ee6b7759601c1c794bb", + "0xce270062dd9f9263c58cfd4802699815010fe68b", + "0x0b1c2fb59b8b18588374047bc8d3d34f04132cd9", + "0xe940eb82e2412b30c10c4b60b2cce71d9811ebdd", + "0x6b5d823b962f39d842ed2b9a1f3190fc023aa63d", + "0x0d18f23f02d14bc76042454a1d7cb6f5d3550d39", + "0x4bcebf15415024fe641680b0d7f4a26e19a22fcd", + "0x4ff97458ab821cd179095f9017171ab0551c1995", + "0x17d4aec96384a245072f9b7ed573ab849a181e94", + "0xcf6bc2dd9e6f69e3d30a67247674a87abfcbc20f", + "0x8e2bf55d082be7dc9ace4452a80f7455e3b88e16", + "0xc8eb39fbc2e590d2b431e01553a53da81bf7a0e9", + "0xa7eef759cb2428e8aee78d585bd43f0ddcce724c", + "0xc14d6eae964566dfaf2297292086ff76469df17b", + "0x8108878687132ac0354d7b43613ae1b6fd60c5e7", + "0x1ac51bffe375b1f31ab352dc42b8036d0609576e", + "0xb841a76bde4aca2b90108fe7a87da8617cf09f81", + "0x5620a089277bc192817c20d0f4d1eb576fc093e9", + "0x28d95e6d2322831fee588b6633bf781aa6dcb72e", + "0x81d2b7956d2a330306d27ca5f1422af1d63e9e00", + "0xd605602f52898a1036c73f74bdb1d35974927f50", + "0xcfc7385424f49bb411b7303a6387c6ead662bc6d", + "0xb9da02bc4f1e5d87f4c21da2fec045bfea4b55d1", + "0x8701e592fdf18d540f66d38919a7148e6779f862", + "0x999af5c13f59a1e48ec965e467a4bd9add0f5889", + "0x5a8b9761ea1bec439a5140e721acf69304763aed", + "0x3e02c0ba36293c6d159192095a24076e027a6485", + "0x968cd825522c50a9e1d393a546e560e49940d8e2", + "0x6d5257d5702d876f9944b6fe032b29165a645478", + "0x49f8eac3af958b27ea79426c7bdec1b98eafb276", + "0xa450d46967ef2faf13ce1266a1532d0d5190152c", + "0x06dd1cc626b5556eb49564d39b5b6a53c4500a95", + "0x72ef9a53b09842478901fb1395f688dedad22087", + "0x1fba9fa98bb6b074889533139cfda0da799afc82", + "0x40b552c4fc6ebf41c52ffa0d12a676f8e158f5f2", + "0x3a8ab02444abb34e300bf450c082e94a2b531ee4", + "0x581c09374c79154d413300cb1339649b86c3c4cf", + "0xa0b3d53b8b6d6986ed68a9986c50c1b8e296bb88", + "0x5d2dfb62aef0ee191e7f557f591dcd57d305bd6f", + "0x061bb18fe110d4d8eee02e899a78a2ef50da9e73", + "0xf06969d883ba6df9054f3450c281c1d94b56b3ed", + "0x2c140b0b82a1a6c9faeeb2fd045e1edeed7666bf", + "0x3008eeae73575c8570782b8b118bfe7182d9e4f6", + "0xae010533b75f4fbc163238bc015df25b1b271751", + "0x261267037b0ce5d0cb217674e5b43143fef3abd2", + "0x23694d15e974c4047fb6f1b4c4408c09de4f783a", + "0xd92c7426fd8e6c089e162986c34c0640a8189921", + "0x1c3d7e985e309bbc2c31e0e0f2a1da02e2656f3a", + "0x1b97bd7113c8dc9acc25a0b763528ce926124075", + "0x10889acfe0757cbe8a0c94dbdd2e7e4a9bbe7b03", + "0x3fbcbb9ff7dddaf6435fa03a64840fe112245f1f", + "0x65eac1dc00de819efe86b42f050e2d9db67a4958", + "0x07a14ee7f70b130588468240d6833ffb9782d093", + "0x31e2fa67f34198639c1ac21f9784e34f4aaa6cce", + "0xee7df9dd4b2ad5b4b9381d5ea06466c16754c02a", + "0x80cec9399dd9c85a31e8cf65b3979e0a74f622d5", + "0x03f1e311d5c6cf66df2b494a9f69f12ee8ff773e", + "0x4005f1bbd8db02cea29210a8c1261ba924c2adce", + "0x7ffe7cdef9d5822bfae6feefba9757715dd88f94", + "0xe6e21622c3b1c4bbd3c68449bba32f72509268cb", + "0x2fed3dbb75089e99fb4134f5ec617c539de3982b", + "0x765f6425cfa40c783236f0d72eff6bdc2c5c5cf6", + "0x9933e9b5e8ff88b102d6ea48e60b4b4c8ebe3080", + "0x3088127f7a9a217b27879ca8ec77756f83dfb489", + "0x4afeb14baae969c9275ef04ca6c98aff5865f504", + "0xeef0565c8862d9f823fef3fb96b0a006bf78a04a", + "0xd38be33448984827ef7a06e6cacda22768a703ee", + "0x5b8c6a85a388b82f4bfacdd345e7a1bdc58fede3", + "0xb3825c28ca0b31775a889251fc4fc07d719c532b", + "0xaa312eb19552f924dfc47bfefe47f35a902fc595", + "0x8ef311dbce5adeedfa77db4250735b8a09444e2c", + "0x131b7516f9ac0a5be376c4eee134e4c8c2d8e3bb", + "0x62c884e1f59abcc7953a5dcd3944e5a5c0493717", + "0xe67201f4bd148e300d74acf6376a1fef2b79ba42", + "0xf740b78c43be28db6384de2bdffb2a88bfc8476f", + "0xbb5e8735d8a916a50e4276b1155b67daaee987fd", + "0xc0adefef84aea2ca08a125abea147d109d1d21c9", + "0xf958ac0eb2a04031080cb8f81f229af542854fa7", + "0x65b2b3a32cb39b5576d611336ca79635b3ffd5f3", + "0x081cc7e73410816fef9f180552a473cc1957f5ac", + "0xdaa20a378ba03f298dd1aa5400e91ce794e4b516", + "0xff8d292ad24c17297fc98aa790987f17939bbf07", + "0xc03479b72d41a3a6492e29d4b03ded2bdcaa26b4", + "0xb6e5372110ec78074b739885875c6457ac920307", + "0x3ce9f59e2391bc388a1adfc04ee146b3680dc3ce", + "0xb86ede13e8e0b6cba825f6914b4f7de7211e61ad", + "0xb75e34c02bdeeb29fd9826e8e6b887cddc4cab8e", + "0x4c4436d22c1a001a10749ff8e0a0563a4ea234d6", + "0xdec7441f45c5248253c9bfbbd3acb145faf63478", + "0xc6daf5e04399e08022b5d5fe6838cae244be6a3c", + "0x9431d1615fa755faa25a74da7f34c8bd6963bd0a", + "0xe01847c65f528b7ec6e78ddaadba33d385eca48a", + "0x6d87f74fb42df10a0d128792160377b61689a6b1", + "0xbaea1306aa8d2abd3ebeafcc419a467e7a4f3954", + "0xa5ed544a73a4b6a5e15168507bd7a57afafa2176", + "0xabb7c0cdcbf941ef67f435cca5dda8148f1de407", + "0xcdf4ad3bc25c77c0cf46720cfea3e0f5eebac1c0", + "0x99c531a770fda06dbf4e657fbf1514408951323b", + "0x1c538a49d5bf13d53a663ea7ac101fa77995982d", + "0x7982152f8320d0b2109e91f3731211ca6d827a78", + "0x61db79955abf3870cc5a7bbe4a1c1bc89917f312", + "0x0c10ec8b34d2be8834eb0acb4fe35d220ae44271", + "0x502971c1163afd1acf29f2f229850017a2fed51d", + "0x9b139d48ced583a58604d589d5bc96cc17f680a5", + "0xd96f342392dc3da1ef160a19d3562611219cb56d", + "0x71b73c2460d070b05e53317b1a191582941abe4e", + "0xcd7ab6a534136693dfbcbe9f77283ebca5fa8486", + "0x11d8427121cf8f7f266094bc83b80903e73ff65f", + "0x9ea0de5ae7a2cc108e5c6e835b9b07634ab25418", + "0x3d9e76be6640803045a7d135bd45d14c2c2d1779", + "0xca05b5e9c95d4ce4053392a2e495d5aacdb51bf7", + "0xae5fc7bad2a4fe37c6d42a17fd76948280710aa4", + "0x6ae65a7033a84bb36778fea6607a25a0d6c8ee50", + "0xcd44aa80d4ed8ff6f98ce0256ea056965752d61f", + "0x7e05382a7463bffd77fd09b44ed261dd72d74aa1", + "0xfc24946df55ee239aa80378208b18ee6f90e3192", + "0x8a3ac87a9f8a07486e2fa6a13be22d9a75b53008", + "0xc7061bdd87ccb1495cbaaba1f2a25729399ee333", + "0x6d56e05bc3a448089f6d0c9e75e6e73aceb597dd", + "0x49792649e34eac3e220142ff0b536a759b7f609e", + "0xfc7134ed7a54f7ed4173dce5362d43f9c5cc43b0", + "0xef67a95da5a529cf6ec27d513627fbf31469b5a9", + "0x3aa253b6b2fdab817ba58a782dd236325acf4865", + "0x988933ba44d0dd3e1a792ad4514847d3ab302083", + "0x75422d65ac6a23f66a1765626e7145ecd01a8bc4", + "0xa72f82122985005dd516016c2d117cf2805d7dd1", + "0x607e1ed6d15400fa25dab6d6f0f1a6d1005a3c13", + "0x4bac21f578beeb06ccc6d2bf0cef56c0cd62f714", + "0x58bf06f4a60a6a8799bf264e48aa1b298c907e85", + "0x2d84a7364d4e8d96bb4e403a0875ba26c455f04f", + "0x3711e969346a952962639957f6521f32aeea6296", + "0xc82f6502f2de82a757fb3bb305a839f19c5e5bfe", + "0x03ac3cedbeff52d5e9f0b54898a6ea3ef0a813a7", + "0xd9a612727f82eea86ad9dc17cc6068e9a08bea77", + "0xf0c5912c3ab5b10f39e359070a91170559a72159", + "0xaa4b6b4c7417248df49dc484d5eb9a4377a4c7e1", + "0x493b173a1d6567f7d0a7fb145466087f4c286d90", + "0x6a52001a442a98f5dbab196794427486c11e3768", + "0xa62540868f86ad8f87e79e96b3d8568a6c5ba3ab", + "0xc03556e452cad5b6d7cd0701fff15cad5f060a6d", + "0xee20892e88e12e9866fff140fa78f83142197ce1", + "0xfbcb80129c7ab5951fb909258035dd66f3c77d08", + "0x2bc1871fab38a934c405a1670c06723988db5448", + "0x2813fca6621e9e5c8d005e1b9c930334945b8afe", + "0xccc39bde08114c6961b6b141302c7f1c0ae9db0c", + "0xf3b4cced084477507416391c44b3b3e962826f32", + "0xa11930cd107d363acc44223f03ddf899ac1c864c", + "0xfb2b1ff4a80af6d4f2798e34426e7766626d8f88", + "0x36dec9d67a42b660b2cd3c703d8e2133934a1c34", + "0xc92239c733075027526b0db6f4e37e599f656d09", + "0xd9d4c4e4e35343e04e616eb60abebee909bb7e4f", + "0x5050ea5e75b3c25b01c7501881e6a87cf5aff24e", + "0x07f594209254485afdc6135972bd65c90cbca785", + "0xe715db8ffe482abb39a4594294d1632f35db77e8", + "0x46cda463c4bddbcba879fe72c33b7d7cb228910f", + "0xb2e4942e54c6a307c101aaedb76d160a21f89335", + "0x45c6cdb282a9f65062877bd7157b0dca80934c9c", + "0xea718df698a8622187a2920be599396c93f76667", + "0xfc1a2f3e2aa701e519fb3824acfd014222c86d74", + "0xed168a2afd3df10de7875ef1bf0e2ceaaba1b72d", + "0xf9597df3396412150f5cda3484d6ea3d9ed4c93f", + "0x42e10dbd7b5c04d7e819705b98eb7d8df59f6f3a", + "0x72478dcaaa7fc87718505daf7cb530ae9612e53a", + "0x6506657132e78d7d7695a879e9a49335b41b2582", + "0xb338841382d83463b013f327d5bb5c6a092b9f96", + "0xbd72f963b2f67ae16d05e63c4c73abd0f5f539e5", + "0xa509e20ec30c0ecf3aefcc0eb67bcf6ed238dc26", + "0x8dc71fa1052bd46719e5025d991fe51710ef82e1", + "0xa73de27289905dc8b2b48223da2158cb02ca5e51", + "0xdb8803703d4d2abf4328011b551a27adc0cc5dde", + "0x9d4b90ab0f8b36f3f785ec1af59d147021d363f5", + "0x526b698ecfaec297619b0748a4a937870eeb2020", + "0x4159f5df51fab9b89335990fffaf1eb66008a4b1", + "0x8019067c09ea6587383f728bdc708f41590a12ce", + "0xce9a8a7778aba7a84aef802faf6206553a2467da", + "0x3768fa8efd90c51c960e98661f19c120991e5511", + "0xfe3f3ceab7266b5de5ae8738727b6cf82f7be76c", + "0x639a5866ec87c7cecb95b45fc91b17a0d66199b3", + "0xbe4fa91d49fad2dd30b6f29c8f1ed9acfec0cd9b", + "0x2a6217fdf44279bf82ba6afd451d2013b776abb9", + "0xfac22bba3500f36c5226f0b0380dbd525d51e57a", + "0x2bcdff83443727339023681b2f24cf6233a1e083", + "0xcfbd89df8cf6aee1cb506387b97b173126596076", + "0x479538c603c4a3100ea8ae89ec37f82a91251740", + "0x3a5d9e242b7ef824c60f24ac23daa68859964543", + "0xb27b86dc5e4d235c4d97fce0f87fe208dc572957", + "0xcd79cfe18d5e1aed7181c2405e8f7045c5c0c3a0", + "0x6a439840ecca8e9394cc692f660dc88973df0fa5", + "0xc365807eaf34f844aca5a4e504745155e8f8b1c7", + "0xe47a6a78645f703d76038b93c0dc39dd33aa3435", + "0x60403ca1d0b07afff6ec7284cd6eedae372813a8", + "0x3efd4f0938c1d516235d491ffd87314112bbf365", + "0xcbd1cb6377f079fe79d7aa4e6f5f0859735bf281", + "0x01cf15d50e91ea8731572a07afbf782233339ad7", + "0xb03a8ede596411a09fbbc288e856309eca344058", + "0x752df1bb3d2eba8f3cf44d393cdb99bb7de8b4fd", + "0x69a13a6e45ebba1e5309fb9cb15894c77b7413e1", + "0xe69cce4c2b8e48fcbe9fe1125966aa160ec86e0e", + "0xd625796b565bf094a65ca329cb3e8ba56199204b", + "0xa8a01aa8de16292b4662890babca601b0ce6fa0e", + "0xe0a8fb6a4779047b90e012a139a9366ca49991c9", + "0xb5c8e144328436e56b66d34d787e853d0cfd5338", + "0xb3ecf7dadd14a157975c2bd445306cfe428dd668", + "0xa3ffc3e19b3884cca341f955e70d624974cd54d1", + "0xc214eeed511ab010d4323e7621a3b7500e6fce57", + "0xc27ab522c2319bb9c5d3f93b351ea86a79949a22", + "0xd1d645a20f8a6cde202aed2b19e29da160524548", + "0xcaddd200346f16bb221ee8a8ea1adfd0eb6cab57", + "0x6b0c045c241438dfcc5b8b08fafb15dc7a1dd1e5", + "0x8aef8c29db9009fe048b0172b6b396f282d939bb", + "0xb4b1e0c6f2e728c17612751f75f62278790fda3d", + "0x03da4af92cdfe051f70897ad41bb80a24f08eb7e", + "0x8e58afd54b06cbf43b0998ba852a2d257c4e7cbd", + "0xcb91a522ac09bdd3868cfea4c9cfa4292cea912a", + "0xe368437cf2745cbe375ba4ae31e235345509dc9c", + "0x66e6fb2ec424d48211f905441d934a7eb1f19e35", + "0x84cc8581c6d3ff16b8acc7e8b67982784cfbc618", + "0xcad9d820b5385d20607383db6e555a96a34c8e9a", + "0x308fdf177e6c626b8e531356ebe356bcb730bf42", + "0x6da3471c674fbafd2fc8c0fda8895219ceb3bb77", + "0xb86740be3aba9c6bc40f35b3c72d33a4f1bdd391", + "0x1b5476dd4437546ce0acd6a41df656d95bbee839", + "0x7d0ceff25911287d235c9738420dfd6a52c2a705", + "0x0b0bdd478d90e388c5f4a9cef7c5a4c93da30762", + "0xcee0c3f4995fc16219e6a56d72b5b24d0a258829", + "0x83c171b7350e10289068e2d3de94733c5a7abc46", + "0xd73bb6598ffe80bd055ba8f23c0a2a96c225c861", + "0xbdf1c3a071517045000268eedbd5055e4d30416f", + "0x526f292347a1d88038db43581fb6f7acfd153dc4", + "0xf76c2cd1d2d1028125ca675013e22a74d51ba468", + "0x026f5122fde2ae7348ac8d20ff1c04088d21b91f", + "0x2b122cce32e6993a6aeba786fd03b79e646df0c6", + "0xd53a9b5b4e5a94bfc950c8c09bb4736f5f6b1dbb", + "0x4b617be05076a2e304abf665d02d980e1cd493e9", + "0xe93f06e54dc11da6490b3a3816e3df4e16f17a2b", + "0x09bee453dddf3ecf48bf439c4260698773f2d234", + "0x1e0bff5792f91d458d12b63b425821c68413ae15", + "0xa6ac195370497432e89e567e1a93dd6d094fa2aa", + "0x024378d9b05b38f086f25ec30e9468f6c1f6623f", + "0x6c70e5fc4e4926cd836a6f8b0645aa1a077fa605", + "0xe132ef5a9bec1847347e671d6a83794c2f9b4b41", + "0x0168459886bd2aa322c18ed0b209887095afcacb", + "0x6c48b7f07665e7b7adafb0a93330f3599f5c0b82", + "0xa7d41ddd28b95066e605f020ed9ab310acd6c90e", + "0x1b4e796254faa25d254a714d29c7c2275e3b0270", + "0x3e9d12c54c93b6498395abe9de081b3d06be4f46", + "0x6eaec4c8c2319e050de7ae77c8346ac768c564f6", + "0x82891814425763e76cdd217b5003efe9ee7548a8", + "0xb7b1b5cdf931f80b65d2433da5cee7d9110f3984", + "0x2d116a96b457fd71407a193c41052a01123ccfd3", + "0x832db9dfb6369ed3d4dc28e6b18db6e945253673", + "0xfc94f299eaa4f8d785749e744779d68ab90b200b", + "0xce9a22febb8da27f3ffa136affee0d930aab0444", + "0x87ddbe7abcf3b51fdf5c15abbf4a1fbf980ceb01", + "0x39052f3b01813dba53782d996f5b2358d304a318", + "0x80b3e8c29f671dfdf91894cec2818ee0a0cf38d0", + "0xbc5d05b3373485e684568e3f754bc423b0336f16", + "0x88909b50f3a2287a5b377b8a679a2265a013aa16", + "0x9510b41a45d81d7585cd9d71a34047d17eb9a209", + "0x127c989c95a9da7da8cacd285d6f427357b6f556", + "0x49ea2c096f562cd4f772bbaa2ddb758e91ba1493", + "0xc2871545088781378c6f3c27a732733c8b30b1da", + "0x43cae00031825acc9498883596fdddf080175082", + "0xf5b590c69dbce283a999aedae89058e71d189ee0", + "0xddb499a7c3c432a09ad80727db31808c8ffac229", + "0x2fbc45b6575767b4900d24cb18523ffd2a3f6152", + "0xce8fa998cb47b0771d78500d6f65c1dfd2c2f075", + "0x4aa14bf460e6a146936ee3995746d6808f313ed3", + "0x4f38b57fe8de7a9ceeac027f639217d4f8aee2c4", + "0x794309c17ab0f81e2a6fc7546e44c613335b82ce", + "0xff66be0dabc6da935aba2be40e7e69a170f7f961", + "0x12ba829f00bf9d676aa15531f848a42e3838e357", + "0x133170ce1df05f98941f2257eb5ead5ffb5e9049", + "0x350cd26adb972eea0d651257f9b7971f4b78e65e", + "0xaabaef842d88356acb2018f4dfff718bdf574932", + "0x4eebf2104c39639fee65c5bd95dc585be039cc9e", + "0xd478c86e9c142889fc0e71d441c94e3224d843c9", + "0xa4a436bc988e893cf5135f18cb4b186600433d53", + "0xfa52f1ba21564e77471541981baffbab023600bc", + "0x7255dc3b1f4ddb6f09b9cfd1a9d39e778ea0906f", + "0x93bb65769569909194c46bf4e345394832f6a5b5", + "0xf884ffa89893f3b0d9ed21701fb801889b0b2844", + "0x7c7792b38e7804e9f81efefbb29d5256ab1b457e", + "0xa76953483c18dfc9e185701d0306d9cc2beeb9b7", + "0xf58248e8ff4707e8500a86aaa773588c6a4d19b3", + "0xcd5fe241e18e7d8a1e471e5dc16ed1b5bcb91e94", + "0x700ed42a6b0b8c9646767ce8a0596a6d620ab279", + "0x4f43308a0932dca9c9be8c46c7bf1a7290beeb44", + "0x4acd83fdee93be3cd84748595624855f85be5145", + "0x231d04d32ddc9573b775b1738b51f8108639017c", + "0x5dcc13a59227a1099f8f350567391a193ef9ed91", + "0xb2d97697c113fa40d89d121825a33d67315b3006", + "0x4706501efaaaa4ccd2ad5f157af19a9bff221492", + "0xf4479888db3393382b145e636c721c2bb4586db5", + "0x006908667a82a5d80eb04a98dbaa609c3b931186", + "0xe878ddd1e687c211ce3cde90021cf8d0dddbffdd", + "0xf62b86cd2c029e04f0c731397b1450be3c8f55dd", + "0x28675ebf67469bbd3ae4fb4c3e01dd880b31c183", + "0x292b842b376e906c0c5a40c40750df2bae134f89", + "0xf2199f2e6dd36c4b0cd2406b17acebd17781dd97", + "0xfcb407ddbcaebe3dcba4a7b5b4761db98ab0ea1c", + "0x78062c20fc0b939647bb8004265a09c85afc76e7", + "0xbaac287637c77ee488fcb936b4a561f99ca4afd8", + "0x21e7d22a3f7a9d473d257dee5928af974cece31d", + "0x49ee0d6da2ce9d021b50241b1c22af71b3b0f3ce", + "0xfc5a28d45637dc3d85844753e1dd304e5a65e06c", + "0x1bb13d85224dbc5e72e98343e071dfddaf679ece", + "0x36a36cbf4d14d820385b1e6c160633319dacb546", + "0x1b34c7b0ce14f1020fcf55899e494e0170ba5bd3", + "0x47d0dfe9888b9745ea2c4b3b9077a80cfa5f43b4", + "0x440674c693dc915dda25f1b7c7b3d1c06b1d80d3", + "0xace56c5552a91a81c27e45d6c4dd5e456eefb395", + "0x6421c05b6010ed6819f712c00b269efbaeec9aed", + "0xcfbcfee8de0d5c1b68976bf62bf58e8d92eca5d7", + "0xc8d9c05961e6c90b0838c0b4e22bf31537b38d55", + "0x491981a10b99b125f4bcc91d1f8d74af1b3a6fce", + "0x587da14083e88e32e0b0206533d90dff01a32a8f", + "0xceef686464c585367964b669185e36fd9f50aa49", + "0xff31bbf2872d5c9afd1b5ed7c3924290136e28b4", + "0x3e1b2eefc65c03307896aa32e9472ffa184f8b12", + "0xf6b087d269408007d351654986174d1bb22ef32c", + "0x72009d5cedfb1173cf459d03eabea86cbf0e8e6e", + "0x97a34e85b313729b309432070ef7e4610d25474e", + "0x2e4b85d41338ae15710194c72852d2123953aec4", + "0x7a3ccd90eee44c46a8caa6535b2b5bb95f85c418", + "0xc92cfc5ff2a75db7d86ec4f41effcb57cde8364f", + "0x0494f503912c101bfd76b88e4f5d8a33de284d1a", + "0xb91f2fd0a96e80be6f05faab8d820a0965f0c59c", + "0xcdb0cb1d4b3cc7da8cb7692f68e68438bb986fff", + "0x9dd2bae4eb9dc32860307a20ec33985f76f8d170", + "0x7fdd64d8f45a57ef206de1d850656c2ad911da54", + "0xacf5d3d25baf30b97d8824746a988b9fbc4cf6bb", + "0x1db6a0bfb16ed5d7e88074b61122067c39d1861b", + "0x84666e5b2f77ec6089e951d1fd1edd22e3d1f838", + "0xeae92599dd9874bc7d378b43544f1ac3f71e779e", + "0xa5dfd4b19c1c83920a5be1d3d63bc220f52abefc", + "0xb273a9c431ffc1eb811191ed4318454275954fe5", + "0x6d46d30c0c04c11484926251f3a217ee4b176cb0", + "0x3e8dbed1dbb21ab3f537ea30e57dcbd4729a1289", + "0x7c24d0e9d2a5e3f122b3321051d71e710c23b84a", + "0x6c5a1c8fae7a46c3cc143d5a67919b776d390f09", + "0x19e0a2f8ac2997961e541a5f1ae78cb42e332446", + "0xfe2575c6402e56fa977651ea30bbfa0d3b4ae578", + "0xdaf6d1853b44ef096f9daa5c4edfe888877ff650", + "0xe69906f3e68157f82d3886792f6501f9b6b30ae3", + "0x64205628607a1139927520791687876cb9cbb33c", + "0x7a30f1f83d27182bf91a4cbe5260ba74db93de4e", + "0x33c99175c8eaa6f9f4a2ba6c30d5d59b956c977f", + "0x379f29c017ec33e145d1fe721971cc1b50a31253", + "0xa3721b6f4ba306edb103ae8ca70d86ad0d4e6584", + "0x7e18ea7a25aac7bb759738e948a0af0bcf24d50e", + "0xeb1098f3f701663896dfbc9df8aca0270121f4ff", + "0x81c44962d3d779b7830222503988299270771464", + "0x4a02f0fa58634269d5a12c98fd6b13213105f78e", + "0x36b0291bd4db4cb418e7ee091a118c33d5e26f41", + "0xdf2a5d6c72836a5808a7177329a3dde991118c64", + "0xa3f55666baf2206f3e758f96cc90252ee513a4ec", + "0xfa54c02bd5246c1f039771cf36daede8c7c4703d", + "0xfa8b2e996959c1fe306fac50e3186a289801e11d", + "0xa38f53feac95fde65f2418a6d76744e026d25692", + "0x8b661ce8d955a50bd5ff64fddf885941b1299d73", + "0x7f4af6936e2054b300e88c3560ed920e2476c75e", + "0x63a32287b220b7a9aa3627b1f120ff9f53ffe27c", + "0x67de296f35f851748bbb229a54f6a8de74c05ca5", + "0x80540f72009fc95cda5cfc7847a8b28ce13b57a7", + "0xea2b18cc98d42427e240ab02cc277fef58ad4c29", + "0x981febfdf96e34bd22b06357508f10fe771cbda8", + "0x0971eb29401f632da3a8bbec239caacc7ccfb22b", + "0xeaf53226c4521fcb713a906d731a8f3eaf090e8e", + "0x181c198b67e4074bc9504ae012785a61e2b168cb", + "0xa599ceb21b5aa7a5bec702308666f70e4d507559", + "0xf3e79b3036bfbdc340610450f990b286f3073c3c", + "0x543854c5fc72e68e87151ee9b165defead873f26", + "0x5b09a569ce6ee5f8fa4bffa3b93470fc37493d5c", + "0xa109fbb3814878d46bbc51b9890e88ed87edb5b2", + "0xa9727f5e537ae9f7de91be9fce2de6ea47662a60", + "0xa45d74bf3747c0f7ba82f3b0fda5563b8eca6df5", + "0x58e045862244772d0d11845173bbd25511beb292", + "0x6dcb2e6bc534ed8dc716c10d262f2f5633770d94", + "0xb70ff2b5cc14a3437772fd4a8ae321961262d466", + "0xe727f3b7637a51e511af061dbb097ae6802960dd", + "0x30d0c5d74e122bdf295f7a00802d7d675a3b0579", + "0x0ff19ab720b544174db5b97fc6da849b5dba5baf", + "0x6ee69f93734278bc53dfe7aa76b1696cc6635abf", + "0xc4836e634aa0da9cd359e2ea84112e2369071e34", + "0x20de118961bd6bef82018834710a28466b445cad", + "0x4de89c2ae04a31cc2dba3e2da11a38ddc43682b9", + "0xae235426e75b0a3cfc675d25b7532abf4a78ee24", + "0x27734e7f4e8503df1c05a8d6dd289ede2bca4d35", + "0xf2f823eeea24fd8984d3926478704bebc5e293c5", + "0x10eb4e9657c1502a2f6c593f0ca6910f4c585bc8", + "0xe7508fe5e47958d6985fc3e4638b48029b9b5c0a", + "0x16b351e397a438ed065f8a67e59e56c1f99d7a27", + "0x8ae9c2ccc755ebe1984ccd7f7ffb6ecbe8202f13", + "0x34eb1e51bd983fa725e3f1ccf0851d254562e0d0", + "0xf531e3858d1bc886a46b43b3dbe79aa7c354dbbb", + "0x144616fbf8eed40d403d2a0a5b2ecec74afc31bc", + "0xbc68073255e330204469e2bd7264c77fc8091ad3", + "0x803275308b9aeee08b9f1aaec026a8099a44d2ed", + "0x0b79566caf2cd93a284df4638ecbe85b26c02aff", + "0x102547bd0075f7228f351452f762be6047356814", + "0x05c7ffa9d53691306b02e771a476586055c97208", + "0xa097ab329509bff14b7b2af5c9288c012dd9c172", + "0xed11ee0e53adab8c9be44161c2e67754e719ead0", + "0x1cf626a37cccea5eafddbd923518d988e4fbd1f8", + "0x1eea5979fb6527c64b9e1a836c83e5fd0b8e6807", + "0xc90f6798871870e49937059373fa00a41d2c5401", + "0x3d8fcce251008ad0c8e0c3b9baf7f0fa3b290528", + "0xa98a54165fb966d7bb9458015b049c2c1a0172d2", + "0x3df83ec9d2b62bb9bb83eba1218a202564bb67da", + "0x54c84ea2fc484a2e6074cfc237261adbc1709064", + "0x7d9bd7327d91f339d9a3356074b44102dc381b5c", + "0x467958706760cf7fe2c6bc5ec1bb55892fc0649c", + "0xa5f37c044ad26db520bd877550f5b941d36fcd13", + "0x86b2d62eb9cca5b37a76aeff44c8f7409b96eb6e", + "0x8a9a5d67eb7f392f756f08f0504ddfc75a060466", + "0x0535f81ababa0d831b5e471edb5767cb3ac723f2", + "0x1e9b7d451965714b381fb31d76aac93c9f42216c", + "0xee5011ca33f3a48453fe331a554b8c27f43e162a", + "0x7f562ca612854eb91ec9ba34fff08048b0e95945", + "0xe69852aa882700d3e91ff170a16f2aed8ee676a9", + "0x3dcb8273c23296654a4f372e8f8184ab2fc60fb0", + "0x6f402ae9184a1737a2e0189831fa4914ac3e87d4", + "0x22ddae881a33deca1dd6d2da43a4fe3acd6c65e8", + "0x8ad8d4a16058ffe475e96eeb62d3197e2bc11075", + "0x02b09be60afe054c14b9cfd748720b68f1c28bd8", + "0xd65ef211e7c963a8086804bf90adce0e53387e2e", + "0x72d72b49b11acfc82e1f6833252b647fb2eca494", + "0x61bbc4dc4fb9bc40fcc344c9c3fab914e8f614e3", + "0xe7ac4eac15d7dce3c95d1bd1cc8ca8b97a952845", + "0xa57fcf7849a36314010dfe2559b7c0783fd5ea01", + "0x3078b135422e6048a3e46ccf849361ffd80dd6b0", + "0x226fa898550ef48313d359d90f69914018a89f73", + "0x946e363d70864a9c58a1d6c0fc99898edc70aa99", + "0x12b10f14aa6a14bffe929caf753b9e0296cdc22a", + "0xa6dfcd15c51b53cd44754062e1c42f994c427830", + "0x598e90cf12fcbdde4e4159b5f831b83eadf8c7e1", + "0x76d0ba8e5ba5140b050592b5b2c40749f38c1b37", + "0x305e00c5d9c5502b0a08f81e044fa0dd2b52ad0c", + "0x62c8b514689c853b77b00238d3a8bb0076ad171f", + "0x3d7de0bcb2ac6b96df0366043ecf3cf0fe316930", + "0x1e2a22de89d3bd94ebbb9fc8a5d9fa7cd763c415", + "0x7c8d776a34ef7b0dff97a24f170be0f3b32129fa", + "0x3b43b82bbd4b8f47b2908486d3fa81ce8b5896b1", + "0xaa216752776647da1eaf0469a2882dba701825fa", + "0x5245f5c5ede8b73d48bf41aa8d29b56920853122", + "0x4f7257b9b0467bf57feb399222d123e33d8ac295", + "0x08af2be6e1e92d6f612106dffff474bb1b482e79", + "0xabb1091cdbfaef47be34dcc6de9f8e8fc9810997", + "0x1f2c16b9a897b10f0374ed3c010e369962456d97", + "0xe306dfc41c4a394068347b7d156316910555b096", + "0x059aac43bfcb1a4f844bde9916ee12e70db43e5d", + "0xd225eda233800495e83931a159b0d2bb8cb0e9ab", + "0xc8a8cd6279d5b8ae3f4423c8af6c521531c13fbb", + "0xc2f3fe8f00c4fc2cd0cb2764c73e8bad12ce188a", + "0x29af246dbb138cceade723b0142e9cb785ba36cb", + "0x67b501d65d927dc43f382eb8912bef9b9a3b1a53", + "0x4612f6997ffd8a81e0e4cfc8cdb62796d86cb082", + "0x8dfe02f2a4ac178d1259b8e3686a71cd65410635", + "0xc7a4b2f0fcb8d374740975306a0fe4743dfcdaaf", + "0xdda6ee62fd4f7f38f6e62da1cda241c3749b4af6", + "0x14e84771dc6c2df55d11ce7616950300785ebefd", + "0xc71012d53af72e9319089d0917d68d5651772254", + "0x954b6fb44d99e3473e6113a8e47d9977b3a090f2", + "0xe766bd05fedf411d0df6488e8c892023abdbbe2e", + "0xe3c6096538a823e192a67b5d83e9ed1e355b9c85", + "0xcf1739c23c9638384ce4e88835384ce40c8b2837", + "0xa470498b58ce50bab42ec58e8fdc8ceeab914a02", + "0x6a6df3c4d49de1ab052b9837faa370c6edb29452", + "0x1c6c31052e541235c1fa87000a06ee45254a1549", + "0xff51248c0fe44432793cffaf0200253c466eaad5", + "0xfc4e1bf775f829d664795b62b933962b5421326e", + "0xe7268434bfd95cb2b0e9b8374a1b3b7b0c25d54b", + "0xce527fe383877bca020719c3d791f62a1b6e819e", + "0xba43b469ca63fce3facce32265d9f111a722ff97", + "0xfc3c6a609518116be8aa89b2e9e9dedfd0555c62", + "0xbd9ee204274b036202914c576047abe5ded78492", + "0xafd348dc5645fed01c2dfbf6c2eecc3d9097dab4", + "0x70f7f37a0a3f5e7f7d38f49575cd8c39063ddeb5", + "0xb23ebea4ee540672491d67f05f9d908c0b31178e", + "0xd1ecaebbed3e68f7a4919ac60e6d146eb0a80f5e", + "0xe3cdda9181bdf2b0e92d279b1bc25901b060213b", + "0x005963b334f88faefeb9da02ae188d35aed833ed", + "0xf22fbda40ab41c4ae7f64643f7b8aa55259f2f89", + "0x3e2fa570a2017cad0fbb22a3b1cb7b519b7c0247", + "0x4dc79d09f7523624559113a41f263011f90b23ef", + "0x21aac61a13ab2214ced045d14f8e5b35e9881da1", + "0xc3be6f7d30ddb1eb5369153438cc7566cea1e17e", + "0xa2dd06fa23544f0760eac3e2ccb55e4a1f7a50f8", + "0xa8522439de2ba657ae8add807d0447850ab9fcde", + "0x76160e98e8545058e40a1c82408cd18f6c5f434a", + "0xde5a83fdcd07800e5f165486c34edb1525d40e44", + "0xc54aaaeb3fd9454b59b291d5518634671ab78dbf", + "0x26ac700724d1eabffa050b6de5e2e6ac7ce078a8", + "0xc4effb48ea02f061d6ca9595b644cd1745a9935d", + "0x0d9c3fd8781d0802d7aa34b2a1b4b62406a2c6ed", + "0x4291965922593e385d2a6dc224160443f5310793", + "0xf0139c78e11cd010668d167d1b2c99dd8ebc5ae6", + "0x12474f272cdde3232dda79e9da8d845d54e5d905", + "0x3d27d60a9c2ea9ebb7b00e155395b5937d62a5f4", + "0x0a5fb8fe3e08bfd43c67581433850271dc2648d0", + "0x9516dfea7bcf5dc1bad2e2e2c84f5094408a92a9", + "0x91d7579946b7a0458bf76b3f2922e9b22ce1fc57", + "0xce5d6921f6441d5a4146d0572e4a7c9f33ccdc5d", + "0xadd7a7b71ead0f4f18bfe7f641c5d6940ecb8bb9", + "0x668fb3990c0874766be3bd07a786b7fcfdb337a1", + "0x67cbf7eaf7721838b39ce9788236a01b2c0c167b", + "0x2d11359013b61551e588bee0f4077939bd89e54d", + "0x8a8d1a5a4c6c059efe6b6b3ba56895bd6243d85d", + "0x8ebfd27e0508dcffc9865deecf2139eabf7fc38f", + "0xcbd343d80ebde20012a1fb8f5df945a42d27633d", + "0xd69c957aa14286fda986a12a40b4cb54eaaf76ea", + "0x791604d26a286404337caa7ba9977b0eb0eedbaf", + "0xcbcda62ad56791f9a3f8ab16e0a45ca376cf5c9c", + "0xe823a03d6d5071213d5806a2ad9c324e8539832f", + "0x11349d70c513e3b338395af72df20b60f9f5bd8c", + "0x36f16c0c796e10f3470456e9c135a27be6484c05", + "0x0ac635d504c6795f508106f528d608d917a69022", + "0x6c765a05f8804571f3ace37befba857d02ca3662", + "0x8966d8acbb4b0d5830fca4b0dd3b134e41049b19", + "0xa4734f9a87ae4de82f3df01eb5b8cfca1304315f", + "0x451d001e3cf403d42e6c9ed5d2b7818a618a1119", + "0xe748eee3deb6558e012b11593b4543a89d472c9e", + "0x67a566e487119a7974af8f9374e713132183538f", + "0x985c62734db8f1a9d83094280b8bf68a34769d43", + "0xa996b5c2a0cc8f5f6ace92d129f7a6fa96c14ec8", + "0xa6b7e27de0abad4e4604cb18ac989b7a1639ce42", + "0x6ca93cb1a9d017065283ad913933b46ba6e756e9", + "0xb16297985776adff6f4c1fd03c93e2409f335c55", + "0x461876eb78efe041ce44de13398f47422f417d21", + "0xdf840443869ff9501586ded4f78dcb0dccd205f8", + "0x12ba2db263aecf36bf4dbe024942b497b5c374b5", + "0xfc53532d7375941993f2992522f1d7fbd6ad3729", + "0x74610d70bfbb7ee9fd5d5c53139cd3e006ae09c2", + "0xeb88207a3a0dd71ba1d2b2295471f6017d2fe6d7", + "0x4aaed3e82c0373d1166439e650cbe4f8971f8576", + "0x82672b135f980d4d1ed2c782753cb4dfa292c3f4", + "0x3207e6cadb0795dc8e3ac80d937715b50d49161d", + "0xb4740ddbec2e97b4c978aaf21612a611cbf98257", + "0x76d5934171c13936c0f414f48ffc0e8373085509", + "0x3667b06a29eb5c08c6d60940c580cc6a313c7f1d", + "0x923014dfc95d087762f5f4fb0e38d445b684db83", + "0x35aa53211191804dd73e5c47c263406dfbc92a81", + "0x4200ff0ca8aec0f443315f382118481445487863", + "0x33b65d7d86250c6c3acb8f5d6ead614cca886a32", + "0x5f3b76336d6536b2ab3a22f95e80c6c910f507a0", + "0xbc0bab5733cf18adbbae4e1883f904d317d05201", + "0x7f05d26871a240b87b082fa9d6d4776c16f0d7dd", + "0x70e4b21f061a41f8dfbb9786b70ff0aa0834c2be", + "0xd208c05cb627fb2a96e9093924eebc62b0ee58e9", + "0x2932664aa513f185969fac987fc43654433ecc00", + "0xa4d8abef48b0ec44abe263667350007e71cac268", + "0xea141a0053d41406f9aa8f711dfffaaa7032873a", + "0x16b00db74167b7469dda63b674ca9a3b1b70c439", + "0x43f29bc790dc90a6d4e98f31459d0628d8dbecc9", + "0xf2494ee66bcb084c60956f91e330981c5e7f5f55", + "0x9c4d592042f959254485d443bbc337d29572264f", + "0x3443eee20b0dc2a6bb4ca450ba1d2567c86100b6", + "0xb313a4a768cc0fb3baf75ac1794dbd1592dc67a3", + "0xd011da68601fcda8b95999d0bb8dc9e4d6bb3cf0", + "0x81dcb223c034c257393d0fbb97ee54e080e8d6df", + "0x87d96c94f438b2790b40fa30bdb64b4962a328eb", + "0xc6a1987b73ca06d4ba0c13ff3b7b3f146618eb8d", + "0xadb1607df5faa186ece9fa8b0876846083cc3511", + "0x3c908edbf44e9d29f596777c7b3f4bbc8114a4f7", + "0x2f65c18d357837e0fde7621cd545b9b986a9c925", + "0x622cbe555c364beb70b10f1ba3952f29944381f0", + "0x546f39125f836a36f7a3395c492b2df41e7cecd0", + "0xfd75d1f6bfda1312919a293ea61d390bad35778e", + "0x5de3338eb3e5532a29381bbc6968f32dad2265c0", + "0x1456eedec9074c17ae8aad8b176060acc3c2895b", + "0xd55f189478e546cb368394d5048231a6ba26c099", + "0xfefb9ed533cc6ba9589230337f8faa3d0e0f9ad9", + "0x0e34637f92ee09649365e85337abb95b2724a531", + "0x3e46c3c0bd863429bf108de329f6d56e857a6b5d", + "0x52d4216ba86a64fe8e072a145382c2d6b7813c78", + "0x4e264ee6080bfc6ec89bca450938b42f89e2ff98", + "0xb2cce45044506a854f0415dfb174f8812a39dfb0", + "0x6908ba1ea6528705d66073bb6a3a7b49adce42db", + "0xf18ecb0aad55913407c641828eac6a84f8b55a81", + "0x8ef9d58830a2745b55fdd6789975316d257f2260", + "0x159a389519ee2d5d1c7850ab019c32d1bd1d9aa7", + "0x0cb77fad733bf16b0396ad49b0f4923a6c62e68a", + "0x4135166be458f819241479c82db816add5e7657d", + "0x8cbc223df02067476b7f3577eb6b0ac16f8e371d", + "0x5cc93f643609f6b099061a79747bf587a15b6a07", + "0xf5453275415063ff70c07212b0ea7d88a4c19b34", + "0x0cd605825e3fdb3af91c3d32b8fd18e33fdaa0a0", + "0xb7502e5add8107e8564ecf09f6f40fbbb8ec429e", + "0xfaad2e4b83a6bbed6b2f8398c4449ff731b7a2ba", + "0xa84ca69a74ca94af3fac20e914eb8758ccc86d28", + "0x47c5dcfd55b83fbd0a39ac62db9558624723d29f", + "0x944b130f1397ab878f38346eb05411613a1d2fc2", + "0x463870a4246ca08dc2893696a60363092720c6f0", + "0xf9fbc068f49d253b8af727e2ed83c2e53ed6966e", + "0x692a7bb72a2e1a4faa9a3616de77df6785cbb6db", + "0x991c032421e29308493c334a29b39b109b67e877", + "0x6d74af94c8e72805ba3f7ce357a5b12ecb3ad71a", + "0x09321dc2ba94ba6c6148e1610d2f8f7d27bd889a", + "0x1d7f824506f0f5a99fc655732f4a21ace7e35126", + "0xeb10a955cfd0c9b9f192b0d0d820158dec8ffd7f", + "0x03b056c3882455137a05fae19e939108a5d1ea16", + "0xb61758da13d5f930a5649374ee115db2416c0562", + "0x9a13d8784a04869107e6eeb45fde0be1fb0de076", + "0xe58c140284021e51024ed4196c1593628567bb6b", + "0x55c01b58a253692a2efea285a9133e59c62806f8", + "0x0d4308ba399ddbd3dfa98dcff5b396eda29ee04c", + "0xf01caa9d996785416b82dcca1aa40d561e3a0d00", + "0x6c609e0913b2b7b906895f1d130a6ec67dca58bd", + "0x4fc20ef5d3031a467a57e0bd9d8a57eafbc862c6", + "0xaa584178c3f55cdf812f7f69b31192b7fb7faf52", + "0x62549482d1170e2b3ff4561ea0a111a7239c44f5", + "0xcd67cbe9918e379dc889ce5b9101aaef792c6cb1", + "0x8808ad056e5e2ebc58e0e017ca1693623ca02472", + "0x3ec64a07abf1e30d6c4485fc5b93a92427ed1361", + "0x2d64c615ce8de2f64070e62b6727303ef690fb9d", + "0x323ba3d0159ba71b1f03d33c1888592bd5a9dd53", + "0xb5a2e20c689d483d3b352ef534732f49f315c17a", + "0x1d29c0819a6bc066c859f6cdb05a0c7a4e00b9dd", + "0x17e6a7c7fac36bf00360412f52b43d0b81351c80", + "0x8d2876ad4d2a994c529f19d846ca541015dc3f05", + "0xc591b10bebadeb13f48df94bfe75282d32a52389", + "0xf4fa97d54c75abc68df8588fa76f94faf18f0c7d", + "0xc04cd534739dfc54cb3e7cf3a3da699bd195e355", + "0xa6b827c6b73c099c45f629228172259c07cf0e97", + "0x16842c91bacda06829e868e27337d224e8cf318c", + "0xb8ddbb09bd7d48502969c42041c9c088f3662116", + "0x80f5e2c17b3a12fd994964566a3d1b345a67bcbb", + "0x1f5db7f0987e6398260426bc0a39bc815947703c", + "0xc08d8192da03aafc8c516e35cc4b0cfd2c139f96", + "0x5a448a55efa5b966740324e63051a0af5cab66c7", + "0xcb905ba0abfdc498f084b28afc8caab36c60d3c6", + "0x3b574035d3c7e4f886f6f52b28cc3d71ba64e688", + "0xc0a5476808817c8b6a04a6869f54c5c50c9595ae", + "0x6b4797463b1d86dde3f91edd0435dd95d638aab6", + "0xf56c3977d86ef6942c9958dd5bc256b98ec6605e", + "0xc0f316e58dbb0a203b5b5808adc51a8d39abcda0", + "0xc1e54db7d6562e683f45981954ba1bfefd85a5b2", + "0xff22ca7a69f1bf15d74ae5b18f34bc3c252ffc39", + "0x4512cebb6a19d0008c2d4486610d6ffb103328de", + "0xe3241c0d38f9517655b140400bb7d2f08d9bf29d", + "0xe2d22780d92a42437629c49169613b3df2effb9c", + "0x813aef302ebad333eddef619c6f8ed7fef51ba7c", + "0xf556a555817a106ce3930c61f65bcdacc5f37b9b", + "0xe55fc744243851bf75b43ce5572fab28a8121f6d", + "0x91714ded75c144f50c641f66c5f4a34fcceb6a70", + "0x79176131ee0bfb211789679cc9c7c9f4fc6efef0", + "0x113ac6997f99821813b15ea86d5e4d524eed663d", + "0xc0f52c5934b9a6664bb244ad98a8bfc41134fc21", + "0x343e9d2f00090115c9f67bcc54a316811a330b9f", + "0x9956ab8da399465a7bc20d88b0050b779458adf9", + "0x3bd49cbd1cbee8bc8495233ba57aed3066a0955c", + "0x3dc36e8244e9a9aef85129475015db6f4abaa3b8", + "0xd5a0b1259cc3c3679a1bbe96f9b694f9999163cf", + "0xc1a0edc5d256d3db73d9bb5ea74828903dd705fe", + "0xb1dd42255be6163cabbb9b15ce92e1a235502966", + "0x7dbe5fd6c515c217fc613470ecb41fc34dbaa77c", + "0xcbefae6ca940683ae7b7c7fc52aa963bf05c87c9", + "0x9d199f09b52a6b6447865ef22428ba7c9eb1bbbe", + "0x21ea6153f55a7753023ce53beca6618beed8ed08", + "0xcf000cbd34c0678a2d4f6af3b6937a995695fd50", + "0x6db4c992627e94bc199e08a3389baddf450021c6", + "0x9ec5befadeb9285c4338ff46163ef6b84d58c692", + "0x707644c23330dc0b63446d2e89f7b5199bad9b71", + "0x7cebc4d96cbfcb174e6438f91db362ea3a732f8b", + "0xde845b18f83a3d41be953ef3316465a9cce09892", + "0x057561523e7819d19d7690eca2ff05a138fc3b4f", + "0xe9aa9970135547a5d86ab26c6f6835bae21dacf4", + "0x9637889c4f5a26aa400703afce4d3be870941ed6", + "0xf1cae85f432650a927647941d8f88a7670925ce4", + "0x36ed0e2f6bdc118286855d0537cbbec2908cbfe6", + "0xbdc2b2698d0f49339a71ff488b2d9ad48e6db883", + "0xcd2d8965a1d3cb529b2e4c3af6c558676e362739", + "0x07eb853d271816ff9d1e015a070b71b9a5dc4afd", + "0x4d8ed67e65ccb9459ed98ed6f3a335adf4d1ba1c", + "0xb58850fc82cd76a784167a36390b30c2718fa635", + "0xaf75ab61cfc8858e97d53faeac7a4b3ecd9fa582", + "0x443557ce92e31c147edf3e2e434f33d51d9a1151", + "0xf3833ec4546c18c488ec90877c953f8dd3fba178", + "0xb92d7e036d5098c94c580ce32cecd62f0b13c390", + "0xa8369950dc05020a52e888fd6a87089a88bbe772", + "0xbcc02dec9b4241a10d88c39d1e2f2ea73f2b5cf9", + "0xc6874aaea0a77c8bfb70545637f0241b2c7e91de", + "0xd0697a3b0e668c49348f38cbe116013f497ceeb1", + "0x18d1ff79567876ac7fa79c6e18b4534770c9f4a5", + "0x66046266e73e9aa7b91eff66c61c931fc69f9ce8", + "0x1fe6b8ec07a4aac4d47fdc1fbd50a9cb59b7a008", + "0x478b6023e8b4a5c14a380facb361a4f6ec2ab10a", + "0xf30b12d8966c0f229d11653acfa43f82d7127d2d", + "0xa0d7df142833c28dca19e38c1a1680ffa8fe988d", + "0xeef11c04cb5c4403e382cde5da6d9e61a6a07d0f", + "0xb46c81e4cb26e8d422e465cadc57bf0f4fb7361f", + "0x853a217dcbad301698f62a979d15dc68558e53ab", + "0x1e9a17efbd122b9bd0cee95b67535cc93f0f090e", + "0x2a7c04cb7289d741cc563dd71e17890a4e2effb5", + "0x00000068da4595a04c2d67c97ecafed716bb0fc3", + "0x9647474b2e2fb64971c65956693a4add7c8a08ab", + "0x991f2418a7786775d4c488a953772a96b67d9a44", + "0x96b1c17d49760cce38b6e489d463d8312884acc2", + "0x1255bf290aea406d5ec8d24fbada732073bf29c1", + "0x156a504266e835f69a41d85d73b3caef53444beb", + "0x379f5d3230fe372707d80459022cdfaeb4bca5fe", + "0x1f6578e0d890f800f3b4d30b9c042b997aab434c", + "0xbd1a54c7170d8374fc994aadc058530e2dfd54bd", + "0x938b1906add0e7dbcdad831046b019b6beac646e", + "0xfd57d879ad736cf2be11b8567cd83e18170508a8", + "0xfc7e3b0a9be8a4506e561893650c514d3531ba53", + "0x67308de0a9d2e7c51b60010c952f509e5b750c11", + "0x86ecb2a10a0ea81732be749b8cdc21375c1c091f", + "0xd7c52f9f641de1f3f7be73a2aa993f1f24d7bed3", + "0xfdfb3cfba09dd468292d070e3fe41881f403fc75", + "0x869e512e18de67c4a621480291925149569b6f31", + "0xa1858f9159b096d69b5ae43c58d30465d58acc69", + "0xc6d1c9b8e605c0777ffd7a7528a5e8b98900ebe1", + "0x775712e9d159672be99a1b39a49e2ebd5ac35ec4", + "0xbda0251f51b2cdcfc3cca41cdb9ed252bc0d89d7", + "0x9583ca25ec7770b1d575d0c4c76b79ce257e6645", + "0x8aec81d55d5a676f7884f8d2d2d80a64373b1c10", + "0x4a668e12206f8a2d52d4f7ad2a1cd7eb5f455f41", + "0x0ca6cadb6a8ca4199788b9a060c3285fe7b897fd", + "0xe2e4e7677154e9c4d09df74a4b281ebb848449ca", + "0xe68ab03eea7f7f1cbe50858c4f4026255ac5ed83", + "0x50069c99f39c25ac8bb576c040e34a8fae6634fd", + "0x5c29d86dec977d482884a41c0a08f56e56c2acec", + "0xb55eed7dc09bc09cf6bbcc5f5a20a7e81c78c70c", + "0xc3d3a223f9ebde9dff9367541852168953db4685", + "0xd4a46e61b9afb4d6241e85d97d517173ca0d2562", + "0x14b4448d608b0622558a42a660d46cdcadecce71", + "0xf811de455b2fda454e148cb9a56e9faba07430d4", + "0x83da5204bea66b14f98d336006f830391a88c5f6", + "0xaaaf14375cda3f5b54243b2970904452473ed090", + "0xb96bf331307af648bf1bb4e35c257269b9c3b691", + "0x8295f106d56a177824501bb6bf1bf3e337b8c392", + "0x8d8bfa8cdf72076df6d7df34d7b0758b47f3ed19", + "0x4e5331d39eec6d6a9839edbb9a9b55c89f181f58", + "0x41b29b76cae97f896f2a2c9f4a4d60b08330af7a", + "0xf37854e3668a3d69ee078182ce13eb6adfd17128", + "0x2e78a0d97479ccb3238a4cd5f373654ba09fef2e", + "0xcc04d33f56c85b7f4c4b9ebc44c2495585116ce9", + "0x1977fad1ff54f5e96d383d067e34811ff5fb8324", + "0x95d30549f608c59a745c3d838fc54a23d7ce3ae7", + "0xb4269145a19d47db50a82166862341255194d143", + "0x827b2a40a0bdbfa9856b13fb9daa1de6b3691763", + "0xc89a761d1a596e41d8fffe2a79cda93cf6dce028", + "0xb52575eca4dcde187d707893978ffc43cd441861", + "0x5f7796684f8780de68132c6157d10ddd38c04fb8", + "0xe25c0e141b98a5a449fbd70cfda45f6088486c74", + "0x5360a8a7d4c02c058a98b32f6e1b0f88f0874807", + "0x2e6243d27e323ff457513cd61d071d79b7dfa537", + "0xbe1f6de301bd5668e24201645bd82c070d9f3933", + "0x66920e2e809ad055b6bb378d039686d5568589d4", + "0x6624d76f5c1f98d414d5e402a7b02c7e7c30a7eb", + "0x6d0b2b6ee994bc8cdfb14cf494393aadaeb134ba", + "0x6620338b2d4c72ad3446176e15223c3d38562b5c", + "0x394fcb2121b182df16c6b296288cae6b3f57eb0e", + "0xc44827f4e5a533be19140137afd20c476613ed68", + "0x9a52783bab22bafca30c5ca331cff087da642f5f", + "0x05c2b2fc02f8f0704d1e5d9d68996199878a9953", + "0x651c34c3989a4150efb0c726b048b4d542a81bb6", + "0xe46dcd1645ddfb853d3175a4562f8293eb9397b6", + "0x7cb76f2a1a63b4b929bdca838d8ff0eb644cd8cb", + "0x16dd0ec5dacffac09180b847745b174d98c1466b", + "0xec2d267be98ec99b1e80cffc6fd52d654a3adb4a", + "0x11ef20cfeb033a3513d75164175a2e2d68f9c396", + "0xf55ce117cbc8b8580710af677648eb4e87cc7abb", + "0xe52028f55e59f6c689c768a6088bd3338c273d97", + "0xcaae1b51d903c33f19a4b87d911dcc6b6cb7ce2c", + "0x148b55bdf6007d02e6b82e43792f2fb7c2896f9f", + "0xb332f8e75500e0daa6eff9b9c7a161fad657feee", + "0x969eb97576368911c7a21aea230b4b0ebf13dea2", + "0x54dcd9f156db9ee94e2de3efde15dfc4846b1669", + "0xbaf9b19e595ddae6c915b6da045e81bc0c6a639a", + "0xf241654a5880dfe06c3c8244ed2139b8aeab1eca", + "0xa80ece3d4c8cc2c98cd65f9797d166d0fbfa4466", + "0x51a795f29cab4e757d0d017c44b260ef9160b1d7", + "0xec2c7d4f3e819a429d457139eac44907cdf63c67", + "0xbaa16b8634670107625219989589c676e54005fd", + "0xee7de345d4d808e525a8874af82e08f29ac1b05c", + "0x538bd025c666c58958e2229efb7fe07957eaff59", + "0x71aea6ddc5bb1abbdca9a8c97439e6b1df01624c", + "0x23540ac8f576dc2c5b994a93bb29d36356532ab0", + "0x966aceda1a0653856dd91322d108f66ee90c4875", + "0x308fd73e90cba653f072d2982cf618138ced197e", + "0x897faf9c43bdc4e8022f7d4e5bd457b38a964c99", + "0x6c80b50c9a52ffee36866e8a25a5e4eb7ae3ad20", + "0x5fb56612bd54da76fcd95f0618c314116b9e7b72", + "0x2c1408154bbeb89652a118b3fcee5df990d72326", + "0xb84fe6e46690be7af1a3a47dc6b10ad643df13bf", + "0x1405024026afe1d8982521f0e86010bede50a63a", + "0x56cfc0b3ad8d926420f129320337efc71151d281", + "0x2d3cc8acda483408c48a0cbfea1e802177290519", + "0xcb12406c0a6ddc367449e225713d8fe6e684139d", + "0x0d4abf5b3933016963b498bd1f3fbf787b24f17b", + "0x32455750b01899720b52cee6904e43aaa9e579fd", + "0x8703893e573661780a417ab8a8fb95be561008b9", + "0x21fbcde968d472ca8ffedef3ef4bafd61e1eb19c", + "0xa1b1524f91ae234662eac6e148d3611a740ab7b5", + "0x609e1de29d5e543a6eba15b73d9ed335e90004b3", + "0x42873c4aa0937e8792f66d392a289ddb6361dec8", + "0xcdb75046f3cd3bf47f01851509c01760d489d7f6", + "0xb6e2be59dff3b394ad77508527f375a257a4738e", + "0xfc1e1b33047db671960100c8694cdb0055fae0e7", + "0xb6fe8443e7e4f4fd83719448cc23bc82a5167e03", + "0x79735a282b5d08769c82ba74b31d3e6acea90de3", + "0x0f43a4fb52f597b6ef678328b4ed313710967f47", + "0x6d9807d18374f33213de86917937544a7095e39e", + "0x4292aa3e417d62b7472505e0543e10878302223c", + "0x29c56465a68153ef0f87789b1468b16dc2cd4e8e", + "0x2d7ead9c51662192ddcc45640555b6b264da7c8d", + "0x1eb8f930f61fe9f72f7cc6b2ce069e3dea43589a", + "0x58457f37f6bb8d0433f8759ff30408645e8173bb", + "0x6ab3fb815a38e06782b060699f7ffab72ea3f574", + "0x76719a5ad390be31d83edcf5d895d11807177f8e", + "0x4acd64e43615bb823de3373f6160279e84c21233", + "0x769249dce2065e677699a94b9c0bb46f079a90ac", + "0x214dbc8af641d28405e3523f22c4c8ba0310945c", + "0x354038a77f7df627e3f5b6915bda4ee48320c619", + "0xd745edf2ca1a324b2da974e42aca34519e2a2c24", + "0xe58983f42ee5df22289c1768fd2511375915ac14", + "0x21cdf4115ecdb0f41c7586f3846b94ad349188b5", + "0x0afe98c8bf3c1e1aec75bb42767526ab8dae60d6", + "0xf05f4c07dd2f41ca507a0ddec59f15577cc77945", + "0xc1983fc88b16cc8794c09c2a4f95464c318217d9", + "0xc3ef6458b92a6ebfade52b74e451c861cce73b9c", + "0x7c7f3837d43d9af9a2a3b5ac082178173bd4d708", + "0x24bf5955eed3622b7779e07487da7a24efd6e2de", + "0x6770290cebd7bc1ed3673246e48ad83a49dd09f6", + "0x82b5d7b29777d2f1cab74b26b1cbd6629b8efe95", + "0x018ea91f6924b4aad21e359a6dbec35b4f7f7c0a", + "0x9a49575d906cf471a72a26bacc5ecd550bdf8c4a", + "0xe54c585055b59926817a919e595c830f8f7a1f31", + "0x7d996bbfb26b86642bf87a5fe4dea3ee28122f13", + "0x9286f05c159dd9fd989bd1bbb5fd7d5f38551012", + "0x1afd31627170607657224ed4ae701470209c4b2e", + "0x3e93b985c0ac65c00b176213066904f3ca47cacf", + "0xf30aa4f9adecb8bb209f764d300cbf78341d5e55", + "0x634fa394a2acf674ae53c77c63598b0445fb5ba9", + "0x15dffa44f628c22f60a74a1342298b0abca8c293", + "0xc880c799256295ac597df6c92ade83cc9886b623", + "0xb3c364d4d12ad36eacf41bd37ee445fc6681ebd9", + "0x02899e083dcb403ba1a1e325c95551c5fe0da817", + "0xc3da629c518404860c8893a66ce3bb2e16bea6ec", + "0x7b44ea4b983d2ed2aa665a6493fbc2b7887cb7d1", + "0x1598c1f14d4563d0f2a27d9c125e43e73bac3e55", + "0x02381f433de35fb09b519575f019c753388f1cbe", + "0x7fa313902db88332e291e604601277928ed53875", + "0x803153f3d0790cbbfc2cf0202823af1fb2504327", + "0x384a5e6ef124f5cd60306ebcd1ae5bb953cbe72e", + "0x5a4b09693ccaa2c3218592d0bafa7788a01f4600", + "0xd9a95b37b041b09f083a144c3a4126b0bf0dee99", + "0xfb953d5c69bb04461b74e13655072eae8fb384da", + "0xe2f415b7930335d8866347d8dfb75f3b34817001", + "0xb1a09a8cea80904a7392eb98f8c09e9f2dfb944c", + "0x5e947b9f4fb5039d7253cd0637e839ae2f81157b", + "0x7f82ab731e6257fa84d8f6e9abb55364e5fc4799", + "0x046b1928ef19b9beceaf5c7cdb2b6d71adfb156a", + "0xbdd974c9081b38392fc2ea125f933666f0cb25b7", + "0xdfa07a903072f3f120322ee4dac1e794048f22b7", + "0xe1eac46b579a3428798893e214ea3d1bee1ada6b", + "0x8368b04abbfc237b0ec40f6d7ffe0863ff19c54e", + "0x20c65e7af6f0555c1992e76e21a3bba6d3e96bff", + "0x6d3a821794de3d217deae4192a91f4163f1ec2c2", + "0xcf05d1176c31233bfd3edfa4b1362a6d24e3184f", + "0x881c5b47bcd78cd0cbe0e94606ae25359b5c4ea9", + "0xa802018ffed21221586abd98b563dcf72c2fd32a", + "0x615eb70d8f7da8f8f48d7409f9def90fae7be293", + "0x6cef488b6a2917004be3313d84a1360c5d6aaa8e", + "0xe7d9c9c0b27210916082e2888e71163750a11953", + "0x101b5dc072c0aa45380959853fbde92a6d53aabf", + "0xd3ce8c5ef43afebab7e35bcca6b7f363ba14a10b", + "0x74e43efac26d058ca30f8d8e2bf2cb0210e43703", + "0xe9da6dbdb7441e360d441c331851ef1de35ed195", + "0x7d86e2354d3128219005e45e6e9e9bff5bf489a9", + "0x8656eacc5ba829549f005da59d8040f1d73d2df9", + "0x3d3d8cada4ae176801222fb6693520a5329fa9d1", + "0xcf7cb71164aee5095970d91b68344cd60bc25cb5", + "0x6e0367bfa8941170b4ae965b370fa27817cbe138", + "0x55ca862898a1effeb206a30205b689fd861650b5", + "0xc69a9fd457b6151b3264d0e7a01906273acf407f", + "0x141dbafa8337f1f26577ce03ed0eb2c4bf3c4456", + "0xacaffe8fe498e4847a441d55718743d3c32131e1", + "0x2babd590494c2ac0297e41ab3459870b336595bb", + "0xbb3772f8fea6001d480a37a4168f52118e89c0be", + "0xecf76e6901832b280502aa051b60536d0368dd39", + "0xac895dc2deaab8c5c40af5b13e28e83410cfd751", + "0xdcca012efa72e6952cae336d039bc516a94d6159", + "0x3865d31bfea81ce36f19293980d3ce45d8aeb3c8", + "0x0f35b6dc84c65878adb6767d7470f29aa2301006", + "0x7777b54227e24a1eb8a6d49bdc6182bdf0dc8faa", + "0x81d2abadd1470fbd6ea03b28902aa1926247546e", + "0xbbcc28f4cda2221fe5a8a19d4a5f2b46dd93cf06", + "0xec85b265c130abbc0d7342fbc3585d5e0611b7e3", + "0x1aab41249b131d636d2a2540b6e3596b9e978418", + "0x6990fc51042818dda85c1d066a5e2cf130af398b", + "0xbd0530fe3e93aa09cf522d178b7fd08cbb1d97d4", + "0x7a2dc55dc69ba424d4b8d27186ca97963513d1de", + "0x0d8ea095e5f33533c41a88d1010c67d7a663e3e1", + "0xc539fcea4d8f0494870526ff8b927bb781908773", + "0xe446b49f67fae3fdacfd0357781454f2ae747683", + "0xe7016b1f363c62b31c00fa9091ec1dab05ff195f", + "0x23fedc495e91ef24ab7923beccea3f0ba3437e7d", + "0xb0d14b2863debee1673937fbfbdd59b251fc617a", + "0x4c9f4cb5f421435a04f7562b5758b9bd12f34680", + "0xafbc6194a950274bb96a36293a24ee11aa26130f", + "0x2d75700fb8fd59b48a1b1f9a3759731e8d86daba", + "0xa81571e4f8dea958c1ec51bd842fab5772241a0e", + "0xc4b772b47ebb8b32c45153b80593bd90727ca906", + "0xc58092048b0dc2105415848d4266d45617819afa", + "0x0cbcb8f1e57d790b97fa9ab1cf1abdc91caf6e25", + "0x1571eb601ee506079a2031adb5cb10722a3a866f", + "0xe516de7e9e72d6e654850a4f0ae7fec3fcae2f1e", + "0x932c2b87702efc424eef7d9c1ab0e415e7f90961", + "0xe3347f8e662583d6eeee6c3117a7dddace070984", + "0x0ce8fdea3cc838b70272e80b94bb421353cfe4ca", + "0x6fba1aac65478fa7f269c668b82977612ea9cb95", + "0xe53929ca46b677e3b2fe347a339cd21ce0f70a09", + "0x349789bd0acd8f9720bc380e92c8d78bbf92f4da", + "0x51006580de21d31db289be8dc7c9f69355dd3a8e", + "0x459f9c4fe60c6100e65ecd639ba2b3f5b611418a", + "0x190236c3840f258a95fe11e8c45e623dd8174e1e", + "0x664c556f541066791cd50bfe290d70947bd33989", + "0x5c4e3de7c408f9a45592efaa2829d04dd88a3f72", + "0xc19741fbf7a2e6af72e9a54c2506d76943e72199", + "0x3f1be0f47af3fb8e684a06688e87a88b5151946f", + "0x5da778993b9bb588ff5d6f5eb2f3a7f7abd1709c", + "0x5442c0929c5f3a2b57753b73a6282ba9b5d012fa", + "0x7f902cdb00cd1664cbf8590b08fad76fe03e5d46", + "0x48909739001fa130ea554d45508714824c2467b5", + "0xa0a026d9f665568f6e02fa15a7601b89c0dfc2a5", + "0x3af3f391309d3a8f04c3a13438beb182dd383bce", + "0xc5ddab68ab753a74839f936c59101cb42f962e10", + "0xeaf9bc3e4cb69d10df777fcc44e24070b82d7eaf", + "0x61fb76719b015889ff95fc438ea0d78ffc7cc9b9", + "0x446ccd4633512f321b400cf89c1877f8307f6c26", + "0xd62e87d940f5be694b5c8a60433f80056dddd42d", + "0x3df7d14a06611fb70773e9e7020ae336b4c91416", + "0x699aa76c1f365392606b4417564595770174df09", + "0x2c4977c854536d3c5797f2b4faee0b67e457db19", + "0xa7e79f59610b195614771476faf17ff94db3355d", + "0x4f2a66d795cda5ebe2c86052790cb8fae804f1a5", + "0xde8965b7689aa2d2f8b2905fe6d1189c60f69766", + "0x3b312a1496322f0c3633241d85a59ae0889b8150", + "0x13bc55aba4dccf23e2194a9dd023f24c4bc561ad", + "0x5f227ead31615e119bee7381e184befd22d31f3c", + "0xbee5644e80983d2524f04cb1ad206496b0ab5629", + "0x9b272dc6689eb6d56d6602c382d9d6f265eac3ec", + "0xe4013c254f7d063def4e2bf94a4d380d9c8fdfac", + "0x15fdd8b5f12c3784aedfe1dbe47d207666fdf87e", + "0x7bafe54726c93576f8624335feb8337a618575ab", + "0x632294808f70eae6d669b6a1e2969b7289c38553", + "0x54338f484d75cd9b00ad0ebd1b1a80cce5e4e2a8", + "0x9f189f89bbf9f606b95db2ae9dfc1b7373f11365", + "0xb1d66f970c14bf3014ee3102b419f93066aaf146", + "0xdf4e14b4a66ee4fed2fc12ef2a62cd49b376e752", + "0x89bf502f46205172413061f0deea1c0424a18f56", + "0x0b40e1b8da7fc4868f949aed05bf8ef35ae05090", + "0x29777d4e9499d3cb8d96773fd9901b632bdca621", + "0x690ebb72ea7f5c37efe9c325e430129d6674d5ef", + "0xa2025c136089fc08854bdcdd4fd8fde4277a9027", + "0x0e7fbd3034062edaa3b74c735eb887688a65f50f", + "0x01bbd40a56c8c89cdf659f1742113852f7d3538e", + "0x10b32040a1a1f349f55f7cc1d145293213a1db13", + "0x675ddaa6b7cfb944daa28a99f0b6f4559dcb2bb0", + "0x777cb43346b6c700c7fda003afb91409f659b272", + "0x0a4cc7c2edfe9ff2d450fbf8c578e3a6aa1befc7", + "0xf256fce8ef58f6417cd2f66c5138fd4071b911c3", + "0x0759383fa4cf149d9fd1dbfca11e01c4504a4f7e", + "0x96567cb212df07542a6d47c1143a1df6b1519a9e", + "0xdc349725267767c891ac61559ae9947905d05c3d", + "0xae16439a9d2ac7041b18a7a48a6589f4bb1e91fa", + "0x47940f3aa17f1163f7a5ea70452ff624ac800630", + "0x6126ae52a2b74dbb1b1552074afac99a0b04e45e", + "0x1373ea80edec70c8dbbbe1c280ae05373e4633b0", + "0x38faa3d4ef840fa11fa3b909c74bb48818dde32b", + "0x7d13166cf615044bacaebc9283a06713d12cceda", + "0x62c5069358614ca7f4bcfe6711365ee633581916", + "0x4135b106246b461ca929b6391bc1b9736bbf1837", + "0x9a304f57f5d9bfb042a62159c499f0be6ecf499e", + "0x241a3ebfe4cc3c4275f16302d1729c11be3b5867", + "0x85d3c6be944f7ff76968c79fa7ce409f0a3734b6", + "0xe4e1ab7fa44a41f33f63372678390b9674b50e46", + "0xc18a0a81b3a8d9a76a73585e1e3c0ef296cc8a0e", + "0xd42ae21a238cca4c1e283934f3a7c166747a4f0b", + "0x80caef0f56a34ce2be505e4168738275d730777e", + "0x6e5ba0c5bff668b0891d9c3f6c6adc25e5f51f04", + "0xa171e0f40f24ddac6430495c64c130f537d3adf8", + "0x6c6913ac36a8411e60f3ec9ec9ab87435a6752b4", + "0x2dfaf288542dd5a25dcb0d087b0dd0b13c0c470f", + "0x364fe3e134b584f201fa15fa57aff2fe028a9a57", + "0x35b688cab0fcb2db572ad30f022e49b2d1202f76", + "0x319c3437f6305c1674b3b1b5016d7b608b363616", + "0x6435daf76aa674bd4fb09c547228b7fedcf1f59f", + "0xc7f5a6bea85c843a5533d181680b087d595d5774", + "0xe93346bdacdb735a529ca0ef10aa1e1da4b54d75", + "0x1fca9d9f6d61529de324765ce092457fd1859e6e", + "0xaab49d377152da55b0a26a0c1b067094685a82a9", + "0xa936863fe4e1df1220ef46813d68cde223ee7ad7", + "0x04333b1fb8485ae9a5a2fafc82a6da3dd764dda0", + "0x9633d229b711dcbf06cdd8739238765e0f3135b0", + "0xfacdf77a32aa725901487f0c967eae8956e801cf", + "0xc62377c9d8fc4427180bc405bf79e3e2f0d54f9f", + "0x642458957c6f027fc1fea5b99928df23fe46272e", + "0x21adedce8d63078e31a2aa01a0b6e665b52adea4", + "0xcc740ff3b1ec83292495d1905180ee2219b58996", + "0x5122b4d90185958faa110a3a02b647c755b977fd", + "0x870b486122facc5aba88a6667218be5f8f24db06", + "0x1a6e417728b4a41cde61f113293f695956a486d4", + "0xf6b181addaaba4a6b164a1ad9e0cdb2ed58766cc", + "0xb0354be8edd26d154dcf10be3c47c88ee6150ddb", + "0xedbae069a2e6ba71882b629b9494de0ad3e57edb", + "0x26c77c10d17f57c70aba2efb923313320f308f41", + "0x4bee5a4b17e18b20ceb3f51017290bffb6a59f08", + "0xe8181894b04752bcd395de777aa86bd2cf2edeab", + "0xff0c464747ae490ce744a5fad0eeb560c0521c7c", + "0xea6afe7d62e7639a42a666c661b8498538e5c448", + "0xcd6cd24407cc9320e5eb81ea142141d63f0eb324", + "0xf85cc669f0a09d14df93e442ab0ef03f94ad444f", + "0xaba597e67de73850f413939dbe7a4d448c532413", + "0x78b50cfcc80592fed75853042de8418350be913a", + "0x500285c71be0ea4961e7c00922b4bb9db7a36066", + "0xbdaf0c12611c8284962690cf81e42bc44399752a", + "0x1e9eac619067f5df13090155e4785a61cbe1f132", + "0x8adace41ec579423f149d7402f282301fcfaff36", + "0x50066a96b81305eaa34f9c52a5c021edbfe88591", + "0x56a3385d474a1ec37951fa78a96cccf0fccba5a3", + "0x532ba55c6286384e8c6454ae00b6588f5f1f3f30", + "0x9ff8997e9f0b37d0406289a63bfcf3abfe6136c9", + "0x63f91ad15e10921a43575b7211d681f2c552eed6", + "0x41f363e1866e3e861b048e91defe50c59d8ab295", + "0x30a7c82fbf34cf55c1f64060b2b8ba2727c4e4f2", + "0x3b65cc4a2c65aefe07e59a614cc7aadcffd43777", + "0x7f1b3c3da51f23e0e0412d3e4d6c6da8cf96a7cc", + "0x30eacafee74c1200d133d48521bff3ab9b9422fa", + "0x71bf788bd015b66367690884be81446f9b4aa353", + "0x15ffea3aa915789642f37c4427f27283fc91ec7b", + "0x039e0d1174d402a22564b3ee7cbfc9bf4cf2dda3", + "0x64a4835a660031ee4e94ffb83247affa2aaf9e91", + "0xac35c588b4f0dea87dd1afdb297ee0239fcac445", + "0x710afef4052c2820059d13eb7ddc14700931cfe1", + "0x16cdcd466ea084c9419e71782394a4efb598fe96", + "0x32c264b126d3633e70c449f5c0cdc81a1ab9ba3c", + "0xeeb98a0885e00ba920218faea7c6308af4981d46", + "0x76df767ba7576eca390b80804e2d3fedece7c3a9", + "0xc9817e2bb1d818d753ff49b4cba71f87dda7e1c5", + "0xd05c9e39bc2b842e02cd0f308fa608da1f7cfa30", + "0xd5ac08f6f04d2ea98bd7e5635e5f628e53af894b", + "0xee5d1ef7373c14cda1461585ca9d05a2dc73ba29", + "0xaea742c9748ed2652a9558979ded145085c5e2e5", + "0x766bab5accfea3c9f00f2d456579bb4f0b547405", + "0x604c83c9af74ea6ef58cca046abd02bd6fa4f9ea", + "0x840b6c76c295f21544a8a41fb41df9d582f16095", + "0x1ed8cfa507e9dbc22f2d773e25c702b0b652303f", + "0x613160eb6c74f8b579eb333121312e7647e147ee", + "0xd7895d43f26b48f64f11b555d4e4ee05aef79558", + "0xa7e999cffe7e5c43eb1c20bac7c42b529f4f0031", + "0xe0c5cfed6b22862b98a0f68b4e01adb96387c41b", + "0xefa63a4081a77a0a3d378576dc64f3b7c0dd0205", + "0x04f18c3b892e562bf7d43068cb635974ff70c8d0", + "0x28451a38e251f05a5c6c616d1bb637c431fcc21d", + "0x07bd25459547dec153d24deb1787ff90c46b1d20", + "0x8bd63b729f236bee124d02bc9783caf92660f6df", + "0xb794e997115117c4500708b8a9c821607b6f5a11", + "0xec0c6dd6146d1bb42abb269bc147583b5929bba7", + "0xb17a97eefcc3519783efc8fc503222d55262a5f2", + "0x5f148fa6a7fe1f282341c8fc54b781e42b09a518", + "0xc4d3430b38bec366381f964844e979361cdbc8cf", + "0x34eb130c9b29ac1e2b264e6e9893089831d4579e", + "0x8ac41b4283966639adffafa12cb84dda5a45caf3", + "0x3ac900714d83eb514bf86a2e0a76c49ee6db8703", + "0x34ad53757d9489fbc43d3030325817646f1e1c38", + "0x2ad21922ec1897f3fe7259782256d20eb0d8c49c", + "0x2000b16f747cfa211a6c44d197d9badd87032be6", + "0xe3141f59d3220975ff1f95303daaa3c778ccf095", + "0x7e627cfce10b0ce8d4e0f0534f5e599f2571dd85", + "0x71b2c1dc3132ab854a109efe3973335f87167722", + "0x1a2a3501fc237eade4b169a8e996adde72bc624d", + "0x3b9f82e23354c15721aee27a2d13c3acca85f1ef", + "0xd55b34edce7dca5532a4c6786075d003e30358bc", + "0x69d0cd62143fd6e0e23acd7f33acb9b2ea8fbd9f", + "0x017863ad743de87defd05d9db101c48a0ad74f86", + "0x0603b5a43f89ea08b9573cec6faade78f42da07f", + "0xf1d271bc259349f9b47eedf7066decd72424bd19", + "0x3aadb17d2a1ec1ffa92165857307290d5fa26f73", + "0x6036d04b416b1c784672d3c849ef7db50d37942d", + "0x3596b1251897fdfc96de54dbf74dee1f38abbdaf", + "0xdcbc0420319736f4de871914bcb6d106177fca7d", + "0x8488498a84e483e0f2291b1370f99d856017bc85", + "0x4613b558fec524e4fc0fe2ccfc57bdefc8b340c9", + "0x49e53fb3d5bf1532febad88a1979e33a94844d1d", + "0x7aa5d64453a9ddc9e68fe2a8b928ddd14c2351e3", + "0x6de7f8171176ea382e900e108182d59dba60a7f8", + "0xe896a99eb490beac31c9bcdcc9d577ef6c4ff75c", + "0x6e8a1cb16a36f390f1285c0baa0933239188cf49", + "0x9ab5eb709e9048f3ded631d786521744970e3b76", + "0x38ec1d1bdc5e757a489d7bc73fafc7b18641c9ef", + "0xa9391b3daa23366b61f7a0d6a4e721ae91304cd1", + "0x388ee9d17a024d08e38276951cf6726963d38769", + "0x50d122e089edd99523e34231c32b4ef9ae129f18", + "0x6eaca1b7cbceae1464af068a488fe9e862118f9c", + "0xbd076e704ec292d396ce663b085eb2809d397a37", + "0x144d20a1ac0fbcf2907e76ead47cfa843346da7f", + "0x59efd86b59c36c314ad526f0678cef134b299594", + "0xc7785ac9e6ae63f934a100590d148472492c38c6", + "0x3203d088071a75f9fd75893bc989759798b7509f", + "0xc84ef45813d5ef4846c5ed000a21fc1fd8c3b464", + "0xd4379bed582ed91c26880ee10535b52c070e4349", + "0x7e53c90eb06ddedec19fe8c3b50dceab684fbb45", + "0xeebfb0f124636aef01b8fae3b2b109a973082d0d", + "0xe3aa21fb00182a01f180b8c9fd7f2b725198a3d2", + "0xff8cc3f4d6eb532008124d35f5f6f42870a6663f", + "0xa58a950cc6083863d8179171d8a18a3537f46c5c", + "0xf5e1a4cc236273d4edf391c731a3bd9c1c322d90", + "0x97e38109c972e2007eda1e84e8bb55b9e0947a61", + "0xf4a8150da010a889d01e59605f68b58ff6b9d318", + "0x23e0a1bdc43a19a9cc06f19bc7f433bdfdd1516e", + "0x680af0907fa719961f27616611fd7db79081974f", + "0x4e66e44e57e74c10c8fac39dbe8ffb4e96b6c48d", + "0xb25528d419a3fed81e8d27c426a2a8f55b1d5b37", + "0x6b4e7f1eaf6cc055a12d945dc01519e3859d582f", + "0x31c2b0a398148c5f8d6bebac4af5e5dbea79ff07", + "0xb4e5b0bbf6771280cd49691001954cd559a73f96", + "0x10d172f41ea8a9e60a97ddaf86d0924ac57629ed", + "0x01c13e3750e137e35dd0ea68fef94b017731c8fa", + "0xbde78e0ba8b2bceaacf26131b58a1af9dd612351", + "0x72e89acc8395b9eedb5e00bfbf76c6702ce58e57", + "0x9db712a9fbf7ae7e3fe0cd887b340dc025cf74b7", + "0x3498c24df6509af0ab0e8da8d25028ee775e22cb", + "0xf020fb6b15bda3621e31563a884ac1d9f2d07093", + "0x3f446541a736b2d57c2a15328514135c8182bc6f", + "0xa9ec08edd196b91bc9177420137804be1d6efda0", + "0x7733305ca2768ae7249cea555452fdc5ee01cc0b", + "0x9feda8bde70e5da9a3709b735ae1de7d39c7bb75", + "0x566c9ef8ea3c61d178e36d3cbe2a39eb67dc04e6", + "0xf43bfedb81aeefe0b09dd6c0ec2dd14c8781a3dd", + "0x84a80b13279376ff206f9820b262622c054b549c", + "0x081ab2fa7f8f4d9e89f017ca1195b0cc75245aee", + "0xf7930e1879680b21d3cad01821b44e09362e911a", + "0x898e7ba5997edf98ac95e19a2d8dc417fbe80621", + "0x72b8d7370fb50aecf0ac2098426208df1b8afd53", + "0x268ac13082df3e1045c5ec2ad4d8dc471a68d200", + "0x2009bfc850bc73ea9b6c3e62e30bd0bdf57a076b", + "0x0985471c81254db4e96dd17fc3eed71a791c34a8", + "0x24feb1c880b8b4154a58c6d2461a646b22e18b28", + "0xa709f05606a95d75af8d8a3e36dedc0ae74f598b", + "0x318af745c29c5c6740b7b47b3560aae5075ce8b0", + "0xe85ec9fe0830ce3eca591d64dbd4f695870de882", + "0x56d0139ec69b1debc1ae062b118fde073a965396", + "0x47a5c1117e70fdd91719beaef249badd16f08d55", + "0x89d9aa65678ef914d84a8151d88cae19a221d4d2", + "0x06ab45760149dc158cf3d3b12bee0e73229bbeaf", + "0xa546b0e1bea3a85c49fd6313b85a8ca3bbd53661", + "0x33372fb9ebd6e6aee0a29fc674a2babac707df53", + "0x317bc91d980eb406f4e0d1b42c232259718b998e", + "0xf0bd153f3089b1652edba95daf6da668d65b77b8", + "0xa1a1d87ed4d94ff41f2f615b23667cd6cbd9eb33", + "0xc1a08dbac13965f5ffcad1d82ed41131a4092ee1", + "0x8d919debd2bdb9a96dca88d8c2dbd38d0208c25f", + "0xaf63eda17bc254a9c5aaed7e53310bd117edda98", + "0x4ac3ccb6fc580a928bb3d8871cbd53196c39dc7b", + "0x4939c26c681706f0e780204c7414ae998758a12f", + "0x368aa4516ddec947827d3edb556f81c00e0b748a", + "0x54340ce2c244b5bfc4029f2cd7598fcbc3cadf44", + "0x8833107626356aa0a28bb67b137f598d51ba4f75", + "0xa62f2004ca66500d0cf75b1cf3830af7a8ead9ae", + "0x1b3e1eedc7c8967eaf1a43067c17c7ea4f83018a", + "0xf3fbbd953de933f39faa589c364fabbb1e49b9a3", + "0xb52fcff3045b7e9a241b0894c835da8842a19787", + "0x13389316c576c3e7c9288c1c8f4929c470fa772c", + "0x598f3abd1af60e4b353bfc3c94da7b2d65cdf710", + "0xb15a5473b24530d651d8a76d6ad26a06e90ce613", + "0xf42bffedf7a8b41ae457f88e95a76b3e61ec30ed", + "0x50f461f471e7dce973e27f0e319ebe868135d764", + "0x81d32e5c08252c58ddd6c385b70c5a53fe66080d", + "0x3ea43f6d608ae0c914a245b09f67c4049ba2cc20", + "0x1c7586d70fea269e230d566207a481df36a964bc", + "0xcbefeedf5beef15261067513b8511d968270a7d9", + "0x30eaab2d1c94fb63d9f87ffe5e1831601f6a6e31", + "0xe6d94624d468971f35ff484ef9e044e3a4500db7", + "0xba21dfc530c5c5b125758f7e2a008a54246237ec", + "0x695367f75dd00a51cfc7b5d21ee6795244aa171e", + "0x849c8841ac930fbb13f1041b3db24e7bf5b54903", + "0x920cc6b309bca198e07f15337dca755654a7161f", + "0x208046f7b29a0da0aa443c239c02cf7ee35af1f1", + "0xa9e77d54dff7276a61fbaf9bcbd6901590c5d5a8", + "0x31f6e8b71c0ea179978d4652acf3b18f7f32b488", + "0x2c7b641919fcfcdded49450ba59b3c4ff99abcae", + "0x24710809b3cfa3252b26fd5f5826ea286260d62f", + "0x99f7244c14312334d8f3fbf6aff388b45712b125", + "0xbae38bf54f2aa0e6159f3d9b656300f61dbd2ed3", + "0x8e018006046fbc5e30bedfd3098987b0c6580b4a", + "0x39be6bb37a6f52b5bfc07a034b7fc28f9963f083", + "0x67a0c496e961da0abbfb579f8a41068e57f0e9e0", + "0x7c386cbe99dace4404b45c292b4a90f9c83bda8f", + "0x0fb267a11d0a4ee611a3a8dc41147a5729276161", + "0x790288de014997375da2ba157893448f3ee15a69", + "0x92451ccf65d681ecb2294114795873e63a4a6883", + "0x0593e74e1408aa6c852d726e26a293b1f1fe1f92", + "0xea3268ab574fdb6157d82c11c8d7cf0e050a67b6", + "0x40c05def63190ffc6e0e610c943c6ab95b3ef600", + "0xcfd8c50145c35838d72f1e86e2c274479fe2f8e3", + "0xc6a0d3c3d306cbb0915013cb6a7c45b89f804703", + "0x0859c85f89b2834cfbc1111327993d04a6c739bb", + "0x8a3bc494b30a49d85f2b9da4a0f9f47e61780a92", + "0x4d2971d4c82765d6b60f892a6ebfc295de4317ad", + "0xdf4868f3387fe0efa63e99aef55b38edd28e5c2d", + "0x3933ad5fb9305d504457ab57c5f7c3b96417e788", + "0x442368cad3abc26dfef71aedd9279877d1d840e2", + "0x952c23f8f067a5e7e165ff0e42491f51d87dbc95", + "0x3d12a2194c45de98530bad4817ba5c9a92aad9ef", + "0x7413b8c9d816198f82854fb5aa58c6203cc87684", + "0x924f60124543cbecf77d06cd0c33151d6b43e1a4", + "0x8e5fa9ae967d6b140227cfac73bdf45fe332cbc1", + "0x63a02a14e18dc11747f51c0a8800c34f004a401d", + "0xb5f9b8d456d55cb735e5d865169edfd39778d37f", + "0x030287cc41fdc1793a8ac1a15b6b8480b7ce0303", + "0xcda5f64d3245ab72756552bc6e2fa1797a5ddad7", + "0x007eab1f37aecd3c235abd613bb3f592b2d9b1c7", + "0x617e24fcdf3e283cf374e950918ecb960253ffb2", + "0xd02bae47fd93325fd0cc3d660b73d8f93c4d7b5e", + "0x9b94591df0147b55edb551698383c4573c66f87c", + "0x20fd57217c6380783501b29a2fe935d3549f58a0", + "0x75cc76d9a4f2fdb542afd640ccfcc5b373ff1bb0", + "0xde4de46034869cc35a607c91be752637ebdc1785", + "0xbbfc8cd211a516967493e686c6d51a5538b342a6", + "0x48706176617eabb33e504240d473820de62fb06d", + "0x14338086f9da088cf2d67cc2d6ab689723b555bd", + "0x2b18a6054cf0da65dc2cda52d9a399270b9b0184", + "0x2738982f991a5248f6434feaf6ee313f80bdac59", + "0x477f92371778c5b324e70957c26cd026cf8a5bef", + "0xb967e1396c53d17f89275356774a2add91f0d8a0", + "0x2dcf3613f8b28c8ac645f58bd1d8ee1c539306a0", + "0x3ca0b0624e9211d45ccb7ed97194be7326a00e99", + "0xa93acaf3c5e7a9dc967d268a34e4046d30f60529", + "0x7c9a7ffc91fda70b02756555084ee52f3ca1b7b2", + "0xe729e82c62ba98ee226dbf680803cfb4189dbe30", + "0xb9b2917db093610cfd798f3d91c43af0d092b520", + "0x46a20e5e0ceb64ed58f5d29233479d8337408bd3", + "0xe82358aa1de286b8ca5be204aa480258dd835c83", + "0x56cc483797e7d158016f9b817ac2ed31b0af6332", + "0x85d5d1bd2ea078a2df882f0eb6b1a31721b3b1d0", + "0xdb4bd7f010a8828102dd9aeb81f12855830e1cd4", + "0x162220a86467070d55f25b1b1ba54b28cbf37b47", + "0x479efee8b2fb7d225a1fd455beee196ef6aa4e9c", + "0xbe7abe5083ae893f05321c17bfb5a42fff7f3888", + "0xa4824082188afb7e581b390733dccc04518a17e6", + "0xab0a56ac95b019d45fbc2ff6b2e748e357ad1dc2", + "0x792a1ff2afc018a2769bf3cfbf4ea14038ed0dd3", + "0x986ab37cc494a48735810b0b244eb3165a765dfe", + "0xca306d70fd3a285ce744be88a1e9cac177789d2e", + "0xa73e81efdb5946e43a6c2bccc8cf1a122b9e5623", + "0xf6dea73f45882ee0746774d2b1838fee839c0fe6", + "0xc2f7b89706a6fda2c1d4a06efbc3fcbafb7af020", + "0xa5b5fddeaab0193fc3d123030cc752ca2642f7f7", + "0x324e2aef77bfb6620f955029105484dfc51b67a5", + "0xb87658c692fab063c4e7d14c29af8213e508c985", + "0x3a5218b385761d4dfc4472a7a08dcc006e92a434", + "0x85d148d259583edfe6ef3775a036d372360dad78", + "0x649f701ec7b12491093886eaeaa0fd9cd3021827", + "0xac3c3f64f2cd8b00305c5616ffbeb24281323941", + "0xe940696f4e326b75b4ce93b0e94137b4c5e0b273", + "0x633ae6cbc7c68f70ef713abdf540b11db90ea62b", + "0x8920657bb672f5a9c662a9ec16501520e3bcd9f6", + "0x8380b5f8d317a73370c8fe3fee4ae7b1300a2706", + "0xfd6f2d803c5b337de0bf13e95c7f82b80d66d32d", + "0xe77a729af6b9ba5ce5f5431c7b143d08206e81fd", + "0x3aabbc56ff9f55938afbaa0de83af007a4f13862", + "0x96f24a3f9bcb218ea7d9a01ac97bd0810325bc98", + "0x94c68e59a32bea82a911e055aec2802e07b7d831", + "0x29aee7816d7957a192a2b3894583959eb8abf2d9", + "0xcb34c3acc062caefb7f866c361431b4a038da3de", + "0xe14265a80fc53953da5ca1a92fe8c9bd5770847e", + "0x14042d1f44990ee3c21feb089abd45385fd774b0", + "0xa37e918c33cfa02d59fb34ddb1348a2075e208ee", + "0xa792b8e98228e1e0ee87a63d6c25d3b0e0ac405e", + "0xfa5156f436754387e56c77800aab9ee9b95e8661", + "0x97b5b1a5745f5d876ac2d8fcdc711f00ebaa4b29", + "0x1f21774dd1b1e9463b155e8e5b2f6ac137bb3e5f", + "0x96fdb030f04726d3c8abf1ef3de105de7797c18b", + "0xaa53e3d18dafa7b50ac3e25642d65d75e823006e", + "0x4790a9ccd6c6a384963a7a606ffef80b14f27e4b", + "0xda9e1d69c51d4b7eb4e09fecb7d9a28805b3b471", + "0x1cc65474f1bc0cbca6f6ed92af999e74db6844c7", + "0x02b32ea3ee66454839702babdacaf00bf5ca874c", + "0x71b6788d6945d0ec6c41ea4f1fbcfd0f794b6d18", + "0x4a3ee54f4c7daf0d83ded5d46ee33294f9cd0d59", + "0x391173e15c3d199dee3da498a8f256eebfa97c0a", + "0xdcd9f3942e2b9bdb5c35d24abe760e3c0582342b", + "0xd691d781fb5fef277866179fecd752d4db74ee26", + "0xb23f6c1f98bd4fd48b5a088238236e5c3f7d2950", + "0x52f9ccff8ec424d40db5de62b4f8d7d16b8e5eb7", + "0xee2a7e825f825e3d7c5e939a7c3e8b4c6592a9e1", + "0xffba73ac19d58383b20f196c679f8ace7073827d", + "0x4b7875320fa150f298cf6524121a2c0787eca4b6", + "0x3169a9ff2019e70f1966a70875979394c15768f8", + "0xf53676060ad520a03b71a2b05909fa94deafa994", + "0xfc58f4dec2dfbb61f633ae4b7676028a626b443c", + "0x95dbf6d1648cf3a40639cc2c87656d7c45822f9b", + "0x73fa37fc09d7f58e2cc61fef90827892dd567297", + "0x7dd1460ad682168c1728c405ce7fb9451e9b99b5", + "0x628ec53729d1b30ceb85c6d20d7c6032601d0d4e", + "0xeb7e49438f17337e2c7980e810eaedcfc8a1ec76", + "0x85c6decac6e1804bf48633f82fbd38acf7e5f26f", + "0x998ebd5f670e4dc849332d7b92859070121dbf7e", + "0xcbb6dfe3777eecdc7fdcbe3ad3701930208a0a25", + "0x5900b9bdc51ed10f34a981e401f587276f3ff524", + "0xa94c72fa630a3783bb9a8bb53d06edfad8242a94", + "0x3d0c27ac1cdd007bab696f13c75c353025e04759", + "0xe3ff1b46d566c25811c6f4067f0c63af23ed43bd", + "0x3bf05aa30dba0e42b7945bc3eb7b931bb25ba029", + "0x1a95919fd2c537445752d4538df9d5776c4c9a3f", + "0x2052875fd5f8010fc179b18d9c1822697bfe2ac4", + "0x42dac4c72eee97baee3bbacc7102790a7a1800ee", + "0xcefe56bc64019bbcf82f25fc87d63719649543f9", + "0x30fe6dcfbc6094253505a579b10c8d2274720d00", + "0xa32489dfa05849062ef98379ad54e4c1f090b56f", + "0xfea673549d6a90f3b16457536a2d49e67092543c", + "0x31ab0aac5e2d3a15f7d3506e6fbe94fc0870c459", + "0x12458267c077e77a6c89402cff487898cae89f06", + "0xb6ccb8daddd2c280ef98279bd87f54123f9becda", + "0xe76e7d53ae5baf8be44450f33763641d7f2a7d99", + "0x56d5bd8cc4b02bb8b6b061a017128b90e48f316d", + "0x3feb335f3459579516fc031b6383d9b2d27fece4", + "0x056880d97f4b23dd044b83e2ba238f452ea656a6", + "0x2406053b715e1e05f956df57ee0358bd38e6a3d4", + "0x7a5d7e550c9d443423c22607bf3d9bf72bba4641", + "0x1214672ec404d3978b59014d5094ac4d8bb96023", + "0x83050d8a20dbbf320d0c0d9b74cea97a567715f1", + "0x3bc8af9aa9dda6bef8a25a37a9e91f3cdb2f977e", + "0xad5ce501b502830204abe71d6ba81e5762619c3f", + "0x3f38aa8fa188c01348d7162602e76dadfc281876", + "0x204fd0fab4f8fa1c73917c4f5670df8c1328d74a", + "0x3a98c10c4e25af60bc43402a393d2b4f6341e0d0", + "0x7cfde4994d1b9dff099975a7304f529a40770706", + "0x2d9af424498a3f5b5566ef17f2f2c4dbfff179e0", + "0x6b6cf8b758ef325531d97448827f76ca6ff8c48b", + "0x948dbbfe2ddf3b991e705015fb9a22a64bf03d6c", + "0x76a470a0c96c22ca95b951b94f177f11a3439d4d", + "0xb2e69830d041abde1ce88ff259ae0f68e4f1cc82", + "0x652ef88f60aeb0bf5b56c249400d8e909eff1a07", + "0x448062c78cfa4499927cf909e14bd540acbfa21c", + "0xda83ed9fb042988f7c90052b6397d94d5b32bc2d", + "0xd096af8221e0a3cbab166b72ac91e763e7d2926c", + "0xe7788ce0bdb4a13136142a1eab9aeb5c20a53861", + "0xc3d99f4e6fdfdeb3ee11fffe2013ae4ea516eb6b", + "0xb6f91afffe4137d3aad3f03083eddeb36951efe1", + "0x67f11b22cf727a58260bff29f9f6cb0abff6fb94", + "0xe0b8fc20ec9d361d94b1162ceba0319e2e1898d5", + "0xd386a5c7c8efa078eb5c6431c2aef6a0b5a8fe68", + "0x7708b79e2bc3b7ab816e66af33a8c9385f0fca4b", + "0x1e43f962d66d87565cc9d367503e9a9f131e4ae5", + "0xec253b4f01cec41d14523d72911337b79f937bd4", + "0xd49d1f9bb694b76e1e5d6998b8e3133422bb92aa", + "0xfd4cd2515c7446bfec13dae4d03c72abe1e849fd", + "0x01a344a54030b5590612dc27f4e8d9dcf4f5fc11", + "0xe4f100b9d50a2fcd41bd475b8a33198779fe5dd7", + "0x63f11d2060d147e75c2bfb83dbebe155b4d06b66", + "0xad8dcda3df80a524db2824422caa99e4c0a7dd4e", + "0xa96437876586239f80f968dd3c23317205a9fca8", + "0x4ca3ed3b32e2ce2a5d28d0ac89c305d6c8546792", + "0x38b3f7b760db341018eac326b3d3b0d53365557b", + "0xc3ebee7121aa7e34be61c7de0a8233c36e61d826", + "0x08d7832db90f3575b633e113b55cb6475ef82007", + "0x589e2115f8644d69523c9399c2a7c6f9e359e29b", + "0xd46c1867526d30a94e07f9c5a32a5a42e3a861a2", + "0xbda4bf113a29075356604061bc2b2d32d68b7ef7", + "0xfb0216b9f697f9bacb5e4a01cbc4418feaf2afe1", + "0x800c83bf486f3995c9e7fcaf9765b248e3467e0f", + "0xe7225876304074f732a964c796a5a4de4115efeb", + "0xdf823f05ec88a26d4a200ee519a1c66b631c4877", + "0xd21fc59e197d725b41962b1fcb7e958a7d077221", + "0x8c405c58bc10ab8b8812f29f21eaf91108b58d68", + "0x7c84e769d02b649e5c3301f26b893ae6df12a70e", + "0x9aa300c5ee29a9a61d8565874c68fc4e0843833c", + "0x3d71b3e8a069a5273668648b9865daf1b179214d", + "0x0a7c64a630740457d0ec92628722bb214f249aef", + "0x998c5f702d2e61ff7585573cdd8560fef98051b2", + "0x133c3f56a5d0de02b2702757d30b94f02aa856ef", + "0xd3fb28778630b99d76e4e4a68be58b50c38792a0", + "0x2faea2937ce13f366f48ba8827f09fa9a479454b", + "0x15f6b73ead7f659e0d028a65dc90b891cebb4265", + "0xaf76c6e548a1d897892902e77f8d444f8eb92465", + "0x1d4005064af18c8ecf1db7311894fb0b1d685105", + "0x35b9575b807f33ff2056f491bebd987edc251608", + "0x5b2d1cf3959cd42841f9a484f2085a43a7cf682d", + "0xce9162606c2d4c0c32c2f3ade6a8fdddd914f070", + "0xd0f853b3c9c621c64b5b8c2067317b2afc008d03", + "0x98fe8c82d511dca52e1553fccfe9563c0c0b0712", + "0x9dc60723db4ae107f1aa673aed3456a508d9807c", + "0xc97a4bdcebfcd1e3b0495691fc7a2e91d53e249d", + "0x7065a7ae7ad2c349c4b2aaeceb14c3813a8939b5", + "0x1810bb2face5711d20f0c5da104415b96adad122", + "0x054c8e30ba8ab475b9ab0e74aafc6c6e9256d655", + "0x8489aac931c5e80f5927e22ca8f71d499bf92fb6", + "0x99579e75271e3167e6748791649264834ebd40ca", + "0x11b43670c35ff1cfe99b8e935faef8d1f7227f3d", + "0x8f64644d890a65186f5ee1d3390b9cd07904e756", + "0x9c96a7fd23774cdcd1f0f94484c64092ef8c47f7", + "0x34be06b32150cf2a07d2ca5fb89a40402a7c2e7d", + "0xae7c1a355062c1da38e44b5caa446a778486d434", + "0xfa3c22c069b9556a4b2f7ece1ee3b467909f4864", + "0xfb3c7a5229b85ce78dc1ea8ea22f92d4152497f4", + "0x7b3d6e9756fe4fbded6881065882323a8c6d9b1a", + "0x2fe8991fa1b70e8744f6d99102ae42f147345f8e", + "0x232cf974f443796e96b806840660a1e2276f0355", + "0x378b2a39c98b6ae23dad0ac339c03a300822aae3", + "0x174a21bd910d9795c8b516198a5bce8521d1b7e8", + "0x7f3b1f3bfed40819ba89b92841aa92c726857d42", + "0x5f785d4d54db3655571b0b544a88d9b57838849a", + "0x38ea84e917dc3434041bcaa517f88cb89264d8c2", + "0xac9cebb0c561857a28ff50281f1c5fbca532db5c", + "0xc79aa1013ce8918383948e307b18b2538d519615", + "0x5fe91b8bb81e03ef9e2ba0e43bbd461323274b54", + "0x65e6427836bd06783eaa8c35de3a13766168cbd3", + "0xb2a0e8ffc16729a0ab621b2de55e1406991b407e", + "0x1b5b05dd9bdda566c4162f3a91b2bacb2e72c01c", + "0x7e24fcfd0f28bbf8691fb69b1b11da24d6838187", + "0x217b6437dd56f7fed2a3a3a76ea043a1a018a079", + "0x4225657c630515e7c3f84379e572c3912b531837", + "0xc8ff32d96649556d4b6b519382f87c9245eb8c7f", + "0xe38e1a43eeb0517a802b36a746648a0cce1e534f", + "0xa65f75d5249399ed1d85d48102223ee910f49f64", + "0x27fe69b7f18eb1ad02ad512353b49db3e4bdae19", + "0xb7c926f1752720a8a6f5ac75e4eebf78814b2171", + "0xc04ef1324479a7488a7dfde692a210ce581b117f", + "0xa7c23d69b2f506f8ecfe0f03ebdfe6bac570dfbd", + "0x735ff4ae13ba2c12df730a0880220273a6e72ef6", + "0xb99396fc83c7fad5fe10128760e4459db0512fcf", + "0x19dee9c6906255c6e773b9b19783782b1f936718", + "0x7c213742dfe0b90c57712553e1dad4ba6ed3967a", + "0xf25adc4e225f3563ffeca67e2665c3910af5b442", + "0xcf50d45f7542e69364ef69c7522c9ce7bfc99568", + "0x84b1cdfad2b50f28d7d641a491b6764131a8074b", + "0xb06f7f9c16675370128c9228b6d10f1cc158b64f", + "0x1dd19cfc54ee4d330060e2c7e8418c7c1b834e84", + "0xfe4a36ed2a706c8dd86c7cf1a055119fd40cd47c", + "0x6718e2357f46cb0532bee06764a6ffabe18c5565", + "0x818bbdaf1134de2f91b9dbfee2bdd1eb9d8251aa", + "0x8ee6e2c37824f2ded68fa6c95de2340247e5d1f0", + "0x271a32205fd897f87de3c056967956cf1057648c", + "0x7fc78442cd684464c03f5f6459841c853f38b2ca", + "0x094d5ff2924579a06ff6271f20984ddaf29e8074", + "0x6615e12e654ca3675ff8f23ca8f1fc28f795f5a1", + "0x1d842f69bf0a3715a4f542401351cd2f69a784e3", + "0xff82deb514a516acd51a90bd8a5118ef8e5235c6", + "0x3b38f6b6f1b8b65f807d5e347f190f8d85f900b5", + "0x6bb3db95079d12f1161d82b8c4bc1cbaf9005d53", + "0x739737639a81e0321c5bbf97ecfe09ed7d9dc860", + "0xebd5c6a83dea8faca0f0020f6913a9bd82e9bbd3", + "0x08e3d4fa3252daa514fc5db2b5f16888bf8bf20a", + "0x0c8c794583de671b99053546c2749d940b0c62a5", + "0x8373185d20508303b8ad473bf9fc06942588b073", + "0x7e3f0affda0862108588e6e99a4f1577571d910a", + "0x39676ad3b3108148d9c292bc3bcab1d0cd7a07ea", + "0x46ad1c1e144f47230d5a3725348f8e967d71ade6", + "0xf9d94ea04bd0d09d9131699c37c6ff4210d9d191", + "0xcf124ca5b7d76e614a7ec02112ac37da0b4a7fca", + "0x807ae27c1c045f00330496a1b02e811a3a82b32d", + "0x0ac58b8a4f8322c9f8601fc13cf0c255ca01e49e", + "0x49e1a35e25030a462609a21a9612ad1f37334ba2", + "0x25f2e144799bdf43522cec2830ad9f6f680f3ba4", + "0x9a4d5f24130071d181cbf02754d9fffe29e632f1", + "0x31e85d37c65a357d55cfb9f9408025733685a7cc", + "0x3df1ab85caa98ed58dd3102a24b86e41eb7170b8", + "0xd9d22b6522d559592c37b5b306c0d19fd7cfddcb", + "0x6c92493c0e3de39e664db0c8fb5fb64dbf929238", + "0x0314b2b04093b3f49363508d07eb69b31b7b0d0f", + "0x139f2916cf105a494efa59645bdc0598a5d4c256", + "0x254b3b0d9ae06a3cf4403a4fe53e5db422f25c5b", + "0x122e98e10869bf6be9f2782a44899b74b4346b1f", + "0xb475cc284cef2000078c70e269f43269f790a334", + "0x8e243e14a14c6357791bad86dd2b826bfbc6bdea", + "0x51c47a2f7d38cc175b53c8cccb64ad526d057eed", + "0x7161c65c40acfd06ea4c72cec75982efd2d94981", + "0xc9380f2245f6328d5e9738640ab1659c101eb62c", + "0x55991854bf872327e2c169753acbc43d4b273e25", + "0xd62a9e3953ab95ba89c816c90af914fed54bc0fc", + "0x8006a01b71e0cafbdeb7381b20e474d8cb9da7ad", + "0xfa537b50f80ec4303cccd53c65f0e886dadae98c", + "0x5c24891bdd7f781e598d5f8a6d1086850c721caf", + "0xca7a55f99deeab570720162db36002430dec7314", + "0xf984c73c433810f00529610d3f2647d690af4f16", + "0xf4ed87a5bda4ddac51fa66445a5c52d1cc80ec0c", + "0x2505651272e2dbb28e55dc8dc4db8e8a15db8048", + "0xb2eb3bfe04f29d655bd1d285fcdd27d8392d8989", + "0x13eea90006a8541dcb83670f53e4ab00661c709c", + "0x15853d264372ccea234a02be51ec2b726c23d4e6", + "0xe52347ed3ac34a4a91708506d51a65d3250a8c3a", + "0x0b1d4a2a6295e1969360f6b13dd5ea7e3df96fd4", + "0xbbbb64343ca39fbf66a79d787746a03ffd19fc4f", + "0xd3ad72af19df2633e25f1370036a501b21232ed7", + "0x585ef3de13418aab1db48b0a3957aede4c9ce9ca", + "0x7d00e22ec9fd2860835f2a69b437651cfc138059", + "0xfb70ea3634fd6d95d7966c5bde4bde401fe7f5ce", + "0xd271477b80725f228debd2b6220f93535126e8b0", + "0x14959da0baa1f2edf11bb840389036754133a094", + "0x6de4de587117b83c0a762e5d03bf1ecddd68ebb1", + "0xef21f43e3b43d76af2e18caef39ae0212b0d8799", + "0xf815191daff184663d844907faa4c50ccada0f6e", + "0xaa05fbd7b22861a5b5e2eda24aed9eacb9bac9f8", + "0x82c454676053a9928a4dc136df954104d36bd53e", + "0x254509bd7996931ab4ca14ae5fb37c358e1b7c7d", + "0xfccaf1270cece3d700597d44a94a36891f50f059", + "0x00af0411d031ec0926b5939d15b04ff0f60564f4", + "0x276c64f8526eda69990b49e37ed700c6cab28cc4", + "0x15618af8ebceb15c929d31d88051189c29b7e71a", + "0x146ee431400a57059392046c97020447986940cd", + "0xfbf4c7799c2ba00bf5eb84b6fbf03479ca3c63fd", + "0x5c7491705589a19731fbcb42ebd01e1dded96641", + "0xaad28d1c5a578abdafe51f289602275900f09b2b", + "0xed3419cef3052b8ffdc7c2c0b61b0aa81ab0d1a5", + "0x0e00390edf42b0d69d9c375794c637ecf428ae6a", + "0x39bac900e9f9f95caef9fca49bc6e9eee32e9d3d", + "0x2b2a41dc759da5710597899813a280cb8c773f8b", + "0xdebaee1b3c25b1b0ced43e50ebc2623127b776e3", + "0x842bc9045ebdffa8d34898e2261913e409cc2b59", + "0xd5ed26d93129a8b51ac54b40477327f6511824b6", + "0x15e0f7d1d0051b0a6c308cf4fd584ac664bae3fb", + "0x9c9e0a9fe3d3233e29278a3759897280176eb40b", + "0xd8a4a60e096ab3c99ee6f5a83554c965317ad141", + "0x49ea1313db9b90001a0b46a907427f8bc8e2a558", + "0xa29b6b7bf215c8bc87a6745ce7eaa24b15195cec", + "0x7a3190dcf1797630df096bc0c3c2cc1d264e21bb", + "0x926872dff36fa23a96872c20cdfc09e4606c77ce", + "0xc8a2e8452fda9feb37d817cfc4563a3cf438a9c7", + "0xa55704fddb6ce990d51ba569419e1395479f493c", + "0x0609a21f7f448350f6750417281c6a43acf5a068", + "0x36b5bfa8e83b669d60c4abe9c49fd21b4524c434", + "0x7463a9a700a2582f6380c5e332dff938d7dee45f", + "0xe3b4cc230ee89ed895e3f07c5518ea027dff7a5b", + "0x2eccffd5c709830f440912ca911e37e6043fefe0", + "0x3073e21e72c5a22548cee74aa756b841ce22fb0a", + "0x31b62bd705e071c671a8d02499393e8108ebbdaf", + "0x14ce3e82f0b4278c2661de9ec6f81e8d8810f65e", + "0xc1c231cfda1f65097e62ddd6a9ccc72fdb4f57c7", + "0x03ff2d7a5c2f5642a31a7e6e7a2b88af3e910901", + "0xecf3515a589979e98fc8cb8473f631b5f287c002", + "0x1feab1e62770e0dc4b5989d0945c2f5196ec699e", + "0x86d00beaaf6f2fc9703066b6a8ff39d179d4c86b", + "0xad0605173def2b38c4110a6a72e9c5f0b1faece9", + "0xfcb69960b5358b86ceeb68e58fdc87aaf72c81e7", + "0xc2312bed9ae28ec9fdbff92decdbf4f14d4f2789", + "0xff586ee6ae358793e229f9ea3976e597834ac340", + "0x80d285c301b1bde6d772c1e4bfa8170f7c85e6dd", + "0xe9862a88962f56223ef343295fa743f555e81d14", + "0x5e0a16986066fccfa5e25fe5e4038c77a099896d", + "0x80c187530320261d690c597887d152d513f99045", + "0x0b8cdbac45e7bf88f91047c4a629ae10a3297871", + "0x834376ded728af1bef8eaabba2ea92308c090519", + "0xcaf9dc4201c0bbf37e0e1b660b3cb9bc71ee98b2", + "0x8fcd79f03524699412899308b0e49c0ea6f82cff", + "0x55b1a17f28d83eed980134afe96d53a93b6094bf", + "0x5ac012970b5fd551c195059def842c836f6bb505", + "0x68cdcee27963a994a02e240537b4df93de47df6c", + "0xfedb2e9105ccb66bc22fec6a509bd5e5ca2040a3", + "0x92692d78f4857b02066aa9e1e9f99a4820fbcdc3", + "0x7eaafda443d0efe328c780865f1ff55eea463068", + "0xf7b0eb60c490cbcbad7143b1c097ac524ed575e1", + "0x242f0fa4b0214ca26beccaeb01887cbf90a64b86", + "0x4235ff89080311cf161ae0f3e695baa0db9ece1f", + "0x73faf1344618831b5e16ad8d6ac2c5406695ab91", + "0xabe24aa725d1eb044be9e7be811ce71d587830c5", + "0x206e38689a2df7f5537a57f54d2a38def3d46b55", + "0x6ebd8698be45fa30f4ec83eaa43b47831c54b43d", + "0x628252b868ebff1406fd2b8f349b58ed27d69a49", + "0xb2cfc9688f2d7e4ce84a249cb29e8a82ec292885", + "0x5c414c2fd2e132e3b0b5c0988cc7027b4b800542", + "0x8d04b6f1ad76a3d8f70c9644b86049d49537e73b", + "0x1700e031cefda5ac676eb9772f92039d888cd67a", + "0x1ad9f5ddafc60d108375459c97a8d358c29250d4", + "0x921a20719e59375925cfe20b485638cc110f995d", + "0x7c35143cd743a76d06fde4b7f72890a3bf8d8af1", + "0xeb2865c3324c0839ef657fc080128fcf440b9a91", + "0xfcf7174841d19af02e59b89e6d2eedc3b4007243", + "0x068cd36905e1b27c1e988dbe45a886491a589793", + "0xab368cc17b7de9071907428a6fe3c2ed8347abc5", + "0x26849c34fccb6313198b6a87832f229e69b65239", + "0x70f815368be4ab2b0f01293e03fe7ef545d474b7", + "0x86fc5be53fdb53ea2b8adbd24cbb9df3dfb97ae8", + "0x26e86cc7a60007fc81efac7107771de6155feaa9", + "0xad0c42a7173aefd16c8e29a9b28eee9b0c28647f", + "0x4f031130957c1312443e5e2b03326b5ac1e2980d", + "0x4da3c2c688ea03b9e41f7647bbbeef018af91d7b", + "0x1e8a4051e70f9d3d5223c1052a9c9573bd3c6e39", + "0x8e118008146dd9ac5f4b61921a0f716f0da36204", + "0xfc13b0ac2e4e3f9ee9af3768a6a8317ae102e44c", + "0x5bbbcbcc6c4c8d426e501b6e1b645c3bca4140bb", + "0xab28b487e412b08c7e800096776a74123fc8a003", + "0x0150b83ada86671a299697b472e07694f4fa4ab9", + "0x933e56e897fb7a42d3e6bba80269ba836e0c8c12", + "0x601799e719d853316700cdde68102a3a4a8024c0", + "0xed2e4cb36fcc762674cef96fe73e19dc85031f05", + "0x1fdaf150c4f0842895d02655551eb37e669f3082", + "0xd4da23278532d33c77a43fa58d8c12fd3d77ca76", + "0x1547c9d755b9fbf3d89daa95ed395e42014e48ec", + "0x3784f83db9dc3263bcc0cf80c5dc22e494786bc0", + "0xf13faac187b559cd56a1a191ba8c27ad8b19896e", + "0x0a36a8ee1b7c6c12b15a3f9c2e721ee2a863e803", + "0x81a826c721e8e9197b1bc62b1f8c214633bef8e8", + "0x4029664c1e4c53fae91289827856cad028775793", + "0x7416519acac13416df56e7a584d10dc0f978f889", + "0x7538d2c0477005349968d212243cee58d1713037", + "0x20b376e37aea6f38ededb62532cee6cc46849bb4", + "0x30ad24943a655a4c9c50e69a730356170dd7bcc8", + "0x221bf224f212f53fe3c4b40844c7193d751c1ba8", + "0xe816c943e987e094e09a23bf7b528e773615a4ca", + "0xcde06f8408ebb33651ea918761741dc61efcc2dc", + "0x8a8112e50a262771289b094edf97b38a11218319", + "0x6c7e964be80b83bc2ad23e9409e18622ac69a0f1", + "0xfb843566fa69c691745b0b4bac3f84b613ebe689", + "0x2de15c7c4b80951fd26becd35eb3d2d686849151", + "0x7e810b7bb8fe7642f191f1c2179f3d0591aa4cc7", + "0xe122bd6f568a7f27cb1651cc3c26c165ffe4eac4", + "0x7c3019dcb7d7680a4dac19e3d536fb5de22befe4", + "0x53076527cd1fe25660e5944414901dd70516e174", + "0x6965da1c3e71954616e3e9cee7ba294468cf59ab", + "0x65c877794b51b1fe0e90a72c653e86abc687fc11", + "0xece33d960b298d7f489a6515189b7ee88bfedd5e", + "0xc885f6042372ac3f835db3a4438f6d2b1e40ffe5", + "0xb58820565b350c2fde765afafef0d93510fcbb22", + "0x98ceaff956906e523ad7ea5c250e6c3314980091", + "0xe98521c5ba1aa06a3754ac35c27a224060525ae7", + "0x7a7acf2241c2b388b6b7eb8bba78f615f6f773b2", + "0x214763e383d7d78cd0b76aee0defc8867f511697", + "0xd6c92207d9f9f9205683dd03df29ea36727e8c48", + "0x0509db5e118665b2f0120217296c5e1ee181e283", + "0xd422104e6310367abe12456fc6017513601e5732", + "0x133e75ac0897be7f565ea91eaba99c2ea6938f07", + "0xad5395627309774916b08b721c228f18d9973530", + "0xf1196bf726ed9227507f5a8b7c87ae177124db2b", + "0x83f556bb54dbd9a7aad86645053a83f2cd37fe49", + "0x442712132199d7f80f61d52989f4eb9dda099ffb", + "0xceb13bd5295db2d40e5772ea2c1dca8a0799fdc2", + "0x5c94d4daa0dfa13da7ce47def754c962088c2139", + "0xb98add9f09af3ab5c1f5316b24707b75b5664d1d", + "0x411d4c926df28625a51ece47d6abfd9064de1276", + "0xdaa87a847d9c9c8979809fb259e54a5fe94167d2", + "0xe6f270664a028728af2e72da0306193470ec482d", + "0x116b769ae95c0d5e7af2d50f788934f77015d2a5", + "0x781e73df8b09a6e7cc8cc2293a59ba2dfd2b5380", + "0xe4fb057c253cc5dd67d713118e0691590476bbc2", + "0x3e0cf03f718520f30300266dcf4db50ba12d3331", + "0xa2d130d837e17e5f58e8fa891df8f52724f06977", + "0xe97d385f5192d4e22027edc9a40b6cc6fe91a8d7", + "0xd568de9a88d3acc721a69c416579e1bea693c009", + "0x76c25c4b8e8e6ba558d8ee521edb8aca10888888", + "0x0bd8af8e6b309113a5c5f7a41e023abb93d17449", + "0x121e8699900e4657005eda39498b846532ed40e3", + "0x631d53461cb3ad21ba4924b8ba6f53f5bdca78d7", + "0x8a18a9dcbe1abf8cedd4781c10fb90fc5c28e4a5", + "0x0c8104e6f11bb81cbaf322e8ecb76c2da12ac713", + "0xfa704f04e29fbcf606d0afdb8523fd7675bf017f", + "0x2909f36085711790a87dfd75c31a84c3e04fbc31", + "0xdd2dcd221affabc34939603f6aac836991714431", + "0x43b670f3ad7b1ccd1ad98ae443c1bebf920adec0", + "0xc7e54131cecb6faa664bfd49c1e03c8e4d81b342", + "0x7f5cdc47949d5bdd0849dbd0d587bda283c54607", + "0x8d4a4d9fcf8580f7e1c442b6ed7d5b1bff2490fe", + "0x6c489eec64e0d1f6e16cee7b61efc7299ac4a01b", + "0xb93b1460f366eb4094a3d081298e8611abe73e07", + "0x9ded0d2fbb511e7c496f417a95fb5817dd1d1801", + "0x4fc8995fb298799419564a8c6e5ecd7595bbe358", + "0x3612dbdfcefa0e4ecdeee3f94288443b297d2f2a", + "0xee5a82516dc71ba3cb0cc2056095e41fb894ae2d", + "0x9fabd7323f6f55ce7689e2866dbf1f8eddffdca5", + "0x60b73717cf711f312a621f19bd76ac138da5af76", + "0x22a5aa213b79349b18d7236994bafe2e3af4da2c", + "0xfee6be6b5cc8cb4ee8189850a69973e774e7614e", + "0xd9492fef56e98f06894fe1238a2cbc4cb6acfbdf", + "0x22ba985441fe4ad6c57cce3e5c4618f71c36f142", + "0x93ced055d816587ab57268038953301926fb1ffe", + "0xc78e7731da04aa6e6ce730cca7aae517523f49df", + "0x41ad9f2c4486d816cb7e87bda747a17d0287f67d", + "0x130e6d1a52b4577b3779f7cf50295d3b28e6a593", + "0x1d9573ff3e095c23b02645e3da72982a5e614a96", + "0xb11343a3eac84158da755b7d176539c975de7a5f", + "0x57a3acb7c91ddfc3398a5ed45008ec8bd397c6c0", + "0x5da576e53f85735d7b15d4b9544d4791fab63b66", + "0x75a2c0bc6ccdf1756f919c81e9389fabcddc3785", + "0x79b487b1a88a42913007a02940086cc2f0066dba", + "0x7e39335d91fdfaf9d85073d8f8b91ac5fae87bb7", + "0xd3dcd6062a9b8723cc0c6918899eac01f6c69dac", + "0x312dba807eae77f01ef3dd21e885052f8f617c5b", + "0x2452ad7b3267a16714736b97c580b0eaf08e704e", + "0x1f8a579a3e16cfe04197b6fdbd3be2af82631645", + "0x760fae759703d0839966b99fef4fa41d5918bdc1", + "0xec11d7988659c7b58a8b11851a21b1eb8ab2d8e6", + "0x03840eb0e9e11777ff1cba8b58d0c245ecc43cc6", + "0x66ac1521d49ee47a8a55e2534ebdd5a9991a9808", + "0xa1d1d3085aa43560840dfbeaa9de7ba76d88d447", + "0xfbd2ac59b033fd299b048f300a1a297696b98d12", + "0x12adaa6f09b70241705b8b82ce1dd37be631628f", + "0xb8b5a0b292bb11c0d7da944a22e646f2c32a981e", + "0x28573ac2d6435aaa6f2bc2a930dd59e354a5093e", + "0x316720a5d402110978851fcb02cf216eda73b2fa", + "0xdef06fff8cbe6d876f9268fec68e1495fa359a1b", + "0x071a563f71c9df832bc53b79e10dea1839672f94", + "0x7f8374961620a370c47eedb599076320d5c82c9b", + "0xca2934b782c642a02dfbb840f7b32d905af22f2c", + "0xe81f4d3c0f3bd9f60a025fc05cc0c9a3c13d00e4", + "0x1097bbccb0a2d332cebd38e1c8bf991fd6b9c914", + "0xcb27e328212b60c5c27d051562a5dc1cbc7e9bf6", + "0xdb0adae3431e21006a36beeba6f0b420c0f3e4bc", + "0x1d7289cd06071bcf4e06eeb84460889c7528bd9e", + "0x42659a4a4b147c184dfaf35a467a7745b9cf20bf", + "0x20fe295b112fac42b1b0ff40dcd972acdfc2fdf8", + "0xf446ee3b8eeca8c43758f52d23381f431e54e50d", + "0xedc30ff81df734b40f084c7b1ff8b03ef6d503f0", + "0x4cfe7f148779cff9f6c760bf590c5b29c953f11c", + "0xb6fe334307e7e5b07d6990783ccc8965bd07de75", + "0xa2cd97f4e04fa88cf972304f420114de5577af3f", + "0x846e29daaefd94953748a786aefe8f8d8ae4f9a6", + "0xd7a9b931e2e2534ec6d6079e6f57912e909d3e50", + "0xc09fbb2180a4712095c6d673784fff2569389501", + "0x8b6e8f5bd0127fad7ae023828cfa0a0a2d14fc81", + "0xe61cd2d16a4e5c92a13ce9a188ce5122a98492ca", + "0x9cdf2f40854abb8ed636f82e3d7db727ebebd0bb", + "0x2ae52f6e93872a9eb38be09c80b78db3bb128d73", + "0x4104d9dce3b5f9897241b2563919207abd5ac1ca", + "0xbfdb7518d080cc62dddd616dad624159ac5ff66e", + "0x72fa8554c2388f6510a65ed1878e93eb23271a94", + "0x5571821a8242b997fecfbf6c982dc3c46e8a4475", + "0xae3bbffec01179af99403718d74bfb8c3d0e403c", + "0xbe1a501375252683483ea591cf7165229d9d8f02", + "0x5939236d7658be17280df143e011d6d436ea4f98", + "0x9707223a2bed68b72e470ed02ef92c15d553688d", + "0x024713784f675dd28b5ce07db91a4d47213c2394", + "0x55be98e4097bb40a40535879057be89613a52df1", + "0xa02dc98b76fa5f6c53ad168361e1863be2a6cb55", + "0x3b02ef2f57b7d8ee9ccbb2ef2bd9073a1e081d50", + "0x995a5f8eddac88ee4ce89f4a319e800814938039", + "0x37fc04512eef3efa817cc33c09ad9a8708a198b8", + "0x40e87b64d29777bc7c4c7b0572cba7d24fd5b95c", + "0x332bba7c004fc27bad1a31c37b1eb97c02eaa75e", + "0x871ebdea1828711543318afd863bd2ac741b8699", + "0x70189663d9d82ce5db28b4fdc41ba0b8d3788bd3", + "0x4792b46552ff43695c7b52fa111d293523521d8c", + "0x7540ca8906357dcaf518d0e78b6f354268a0c736", + "0xe17e3a75901df9e5e15312e179912db7d0ac5e1a", + "0xca7be663424e6b8c9a72734da7826e89089270d9", + "0x046889b3f132b160928fad7ff524a3896f8fa741", + "0x48e3626232fdf39c9b3e08b5deac2a17326feb05", + "0xfaf3c2965475c42de10e76c1b428f3dcbdc2c4b8", + "0xcc5055f08b8f832d77c4124fa2451e6da6f0dba6", + "0x878b63a236a4c11dc468ee4f80e0b73984926fc7", + "0xa51b0d114792e0120a32db0bd9a9837dd389e6cd", + "0x5146e8a27fb68c5ece6971632b1f41a5173f3bf9", + "0xe24f8451461a17aacfbfdd1521cc47f432c8d349", + "0xc3e6827cbb90db9e3b28fd06f801a921c18c1ed4", + "0x7b139072177961304a7baddd9e61f0323e129c3a", + "0x92d9dd53c79fd3a426ab489012a19696ac7b25fe", + "0x6db4e9bdcb20b0c5ac28d8211775f091f0457fa5", + "0x657697890632ab1813737917bae1220a2e29888b", + "0x422c332ef79b023373871d4dcba77ea825f439f3", + "0xfb23ebb8ccd611fb6278c10f59085c38c745a063", + "0x9ba9f796af8adeeaf2f2f6aa799bdcd77b67e96a", + "0xf7228486f494056217e99ddf77e9c4fb7d77c01a", + "0x2ae8c900f2f869c24641ae78a9bb70d728467913", + "0x5c9c1ae06c908361890eeb3a46491c922c2740e3", + "0x718af19cbdb32ca89b81b88c68342d10ae28a0e2", + "0x2a755c7527add532541b0bb02ae7a73391477b71", + "0x38dc7b0f5a7a2790855a8bbe0602ef2f943a5f6a", + "0x921d4ab245f58d36156bfb4bc880c128336bf34f", + "0x948c0a047072ae9c74699cc75cfb16113cc2127a", + "0xf3556ed7ff9ad1091a3403c4c4d6a9b99cfa5782", + "0xe1d694b21407327a5df7f40ca689d02a7a36aad0", + "0xe0a052bb5979d8f8bb6a8189582eba14e24f0ee2", + "0x7601a873a53e367e2a0462c4a0e30e59374f5db8", + "0x410aaec8be48a0d065e40adf74f74d34e5987e48", + "0xcd7e0f04935f576c427181904ec1652e36e24053", + "0xdadfb5cafe3a82167ea473502c23529430c4e583", + "0xcf3444a9d2fd68005aa0248bc2e47c278edb79c8", + "0x79079b85804a9a74aea14f1cd966e4a584039a93", + "0xba35efff48dc6bc6164832e24521c12c89a18b16", + "0xac5f96687d2f2f2fcee2f93ba9b52f52d62cd6f4", + "0x39beb60bc4c1b8b0ebeedc515c7a56e7dfb3a5a9", + "0xbf3bd5581f03bd27e57623698e01afd366bf377c", + "0x78bf75834f0f145c7105559f040d95f62bc9177d", + "0xd63a97cd42640bd8d6184e898a4a2273b0746b77", + "0x81a6c03f6a6d36fb58d48a17f527371fcea77e21", + "0x1e1923cab95349fe782e00f7d653433cd6770a2d", + "0x2520dfa2a6b4ac42db6a94eac5dd0e6076d64ac4", + "0x7047b2a4fdf0847c213223e43bbf03d2e1348f21", + "0x049d93543944904569b7b38db268cf241436afab", + "0xb4951f18d71379026620a1b0c74365cd09dd5f8f", + "0xaf05c2b70d075cf4ce665cacfe10aac446c8f73a", + "0xe25afc9e860a83786043eca625bce9ad352b6a0d", + "0xe66ac47eb0028c7886e2006ecb2e0d6e743e42ae", + "0x452b99670184ca00db1239f081edc81700dc8b80", + "0xceeb665c101660ea2dfe0b0f2704c96d698099ce", + "0xd533b0793b60b37c813cf7ef5ce1ac3a925f3373", + "0x06ef46dff00eb64e7fdd2496ac1c6c5ec42e2c40", + "0x05e6cdc0b727eee3dd2fabc3ee4c6f7b4fc8fce4", + "0x8dfe60c4b2e90145b7cf69a0a0b51aebe6c5909d", + "0xbe6788200af132455215048e77c36d60a2d3d734", + "0x99cfc551dc076ee63fb38c042e563577efc6e5cc", + "0xf0db3cb24c688ff96ec437f3e8964df14956ed23", + "0x5da80aba9290dc32ce1476ee5d3f322021dd95e3", + "0x08cbbb73186a5f614f6804471217cf7731ea24e4", + "0xd8aabd88b324deedc4a9cd39b3057b66894dbf96", + "0x8c8d359e16ed6bdb8e0b201ee00516b802a7882c", + "0x1db95b1cf4bfd4e1d256ce8cd1b46175184baba6", + "0x3a71ee75d63c85f92a25d2001666fba48343423f", + "0xdddd5af8b69a75bfc0d62b412e97b0fceb58cd2d", + "0xd15f13e33184348a0118b561bd779de76e467020", + "0x00aae21e3b89cde691d75b050a39b2b06949d6be", + "0xbb25cf93d65f9bf3908ad6d75bef4c56b5f1ee91", + "0xdce2794e62e854082a4e0ae9292e3596c4c43d79", + "0x796f8f25784ba62dbbec7fd2fb86299957900ac5", + "0xf2ebee970672ea12e7504bfb192608e80bbeaad9", + "0xd2eed0a319837ecddb34fcbc05da920c804bd22f", + "0x90b85e24230f31a2dddd4c75c6cc64ac7ff3f1fb", + "0x138308323652edd886a1418a80ee5e74a1bc1503", + "0xef87de361b6e460e4e4af35e52e1ffeaa7713582", + "0xedf96cb38eb0cb28771d84abfff8ce663ef8def1", + "0x592cbc0cd23129e5bb91c2404064009e62972938", + "0x8d2ae74898d7c068dd9e1a73929dd77b75d819b7", + "0xa6eebedc0191e77214942761f326222586fb39fe", + "0x87d141cb176d3f05663d66c8c611d504b451d96f", + "0xba35a84f3e2ae238702668d28267f646fed5546b", + "0x03ca9674af146dcc1bc4306aedbc8fd1ac5b0657", + "0x04568c5fc7dd4517396298ddf137472b629bb446", + "0xe03995bd0033dac9f6d8943bca4e34a40d148a42", + "0xf5bd8bea3a4f750e8a1788e38e626b05ab914c95", + "0x4987551d78fa18b5b453f5dfb926c297744b4320", + "0xd5df3675028a90a6d7226bdbf06649b5ddca4198", + "0xbe9ccff1b47c13f32ea5eeee38bbf44675f89920", + "0x2d99b6b6b7cc515b2cf7cd94417692b0ea5b97f6", + "0xe173d9999a40d7f42ac3f0e55593e1aec8e7cfa2", + "0x36e78fedf63964d8a6281c33537a37486f5bfc7d", + "0x9cb96d7d6748d8f21e14f1b8a57a6e65eae8eeb8", + "0x4ff3b4a2a7ffedefb6fdc8a200dc7fe6b7d6c5f1", + "0x636766467457f136ef2960e732cbdf5ca2da61c7", + "0xc2d7cf95645d33006175b78989035c7c9061d3f9", + "0x77de29246f48825bca5d08101cf7e35fdfe62624", + "0xfa0c002beb7db80a8d0c64d616ffd2602f24b0c1", + "0xa301e5a063098bd039acf9ce9ad960ff619ac585", + "0xb212283ac038790859c2f4ba511493d260833fbd", + "0xf092344b15be1c9d7483be44e6e86d5955268099", + "0xc5182eefe35fa9cc3a53e3bd01a166e897b47dd8", + "0xb53caa663c40f8ef7cd2c17e1d8cc76d9e79a384", + "0x512ca7395288173b63afc105f1c9f046a814cad2", + "0x577147d0dfb52b3a839d4691eb5a5f706fad5ab3", + "0x9f7d28e31fa805910b038136e1d83c7704402f67", + "0x3337613c7a83ec2b4287aa0999cf801f8f683846", + "0x32b43363375dd364f938bcf3996776f4c4f22197", + "0x755f84044c857aeccbd330676f0428110f40efcb", + "0x9d14cd6e9ddafca6169161cf9f46ef665c5bb83b", + "0x58d7a0bfea89fc678674936fe94154bf375078b4", + "0xd442f0ff0842ade97ccdfba64e28b9e3e96f5e21", + "0xe5e51bbf48db9c69aef414e9475083c696f03d3e", + "0x27928d8ec31cb06860af7799d0f64c984da34eb2", + "0xd15e1f7fe0a6635ad55e2f615439223cfe9870ce", + "0x62e94415ccac2d0aa45173ddf1d89f26fb1951b1", + "0xed93c284e076d892fb0114d26dfe3a19d1f04d7e", + "0x140bd240f1367aa5c5612b8dfac7042f0f035256", + "0x0e6d1fa90cd2fcd5101d1ef71449442fa864d978", + "0x000d57ac4711db1dc7453d51bffe4faf4ca0eda0", + "0x6ee6b88b64579733c340455575ccc9337d9dbd8c", + "0x550f9009ad2121dc2dde8ba71ec445c016784941", + "0x98acd10f39cd0263db0a0ed35ba6e9e5149a3ff8", + "0x08cef6b1a350b369384061d2728baea3215d0a20", + "0x3c34d46fd8e7b88fda2481117052a414b342183c", + "0x156cd34f8f6cbf9bf76175af7915c4de441062c4", + "0xc235bd806ec9580c516ffbfe80bf5d5ab2b6d7bc", + "0xe868ae109454bfa3843ab3cf73eb8219be132486", + "0x310d09d98e2a1d4016d9c9a565134b765fc55407", + "0x79e644f122600201bea8b97b99ea6087a1513375", + "0x0d8fda8dace32ae7cf09a60d975bb21a26bbd29c", + "0xb331066290c2540b3057af8d4468a858aeb5e091", + "0x0c0bd6ed78bd0a88f481a40da5f2c0ca778acd07", + "0x234415043b1fff486e8315a14f4bcd4af1e7513c", + "0x8116c486cb6358189fb26e228093bc893bd34f75", + "0x318e901bbf31bdc3b64d44327eaae9230a37070f", + "0x62102d85b55adc67c81b72bd5ed7715b4ab4e28b", + "0x24d093220b96332524fd90a9fe38a72d4209d9b6", + "0x74ca7ff6fd48e6bad2ae42859a81d58104027fff", + "0xfd5d949503baa1d3e788a84523c82f9c166b88f0", + "0xf14cbe2e3e9a938d1fcfc293ec8206367875f477", + "0x7dbaf8c7ba618ef8dfd76d769cc7e7b11eb33b00", + "0xbce1ede8ff4447df8f163fd70052db7696ebda53", + "0xf80775c1816fb60a8f965cec2077aaae3919d88a", + "0xee6b88b799884c7a013a7a6bb6451a98cfe82bfc", + "0x24840a0fea77451054ba076db3ca708a3a5b7b77", + "0x1a3c6fc480e11a67774e0c674f514370271f29f4", + "0x1711905a73f750e430069f96d787e57cfae82332", + "0x050377866a802acd21b26d83bd7fd7fe8ff1ab4d", + "0xf9a169c18d0d3d0241ae57589e1d518aedc6a038", + "0x9e0330e6932d687559989d69eab6e6fd5368be03", + "0x29492a238aafe77223646824e8a289415bff2ae0", + "0x0d8e1de686b7491f6083c2dec497386a7c058748", + "0xd6e9efd40f7008599d609a54eaa216e4c9b0ae2c", + "0x5fc78a71b3129696d06214552eaff62e98ddbc69", + "0xd12dd8aeb8f96d0bff6aa9c74bdf92009741d3aa", + "0xe83b248f783425a1bc3639fd7ccffd698d38cd05", + "0x65225b36a039cff6b32f2b16ba0b0d82f2db7354", + "0xdd177c003aaa107ac4603ff88bfdac39cea11412", + "0x4bce8d45dcce58e704c1c58dbc094750f5119118", + "0x6f3572d6ca9685005c7be0ae43663026beb2d24a", + "0x19badd4cba10e4228631bdc2f230511354aac896", + "0x27ecdf0f8e6e42d0cd8eedf7547591a07fd3be49", + "0x64c3b10636babb3ef46a7e2e5248b0de43198fcb", + "0x3eee1f931f12630dcf55b1a693eddc4523e8cdfc", + "0xd6d5c16c95e8d749f43eda57c1ab31389f8c27a1", + "0x1c85091a09cff4e620931ba952475b5d6e61867f", + "0x223f380df7386b239d56da852eca15fbf1b11447", + "0x407894fb9fefbb377a3f3fb8493ff1929f66321f", + "0x75fdd0fa36d02c3082005e53b301b883ab21ba8d", + "0x8ffc5d71fa012ac62d0a05ceca84d82346b4a69f", + "0x3508b55e04eed689990996130790c41d0f2ceb06", + "0xaf30683cda3e738bcfd790b5ed0c24a51fa9a018", + "0x237151f5c1adb2b91ee4f2808a703dbeb63f9804", + "0x5908df4c5b673d4c0c3666c529f79104700a582e", + "0xbaf510072e2d944ace2cb3aec9376cd0e1a0f6cf", + "0xa693858bcacbc1a64b169fb33a697a2bd540cf0e", + "0xdf2cc168414cdb008232625082f40e6ec1f77b38", + "0x3138a9b0599e69b5412e048a8d0d2044b8337612", + "0xb8f0a1e59c633ffe257c0ad56430691c6cc2f7bb", + "0x01b733a9eaee72cc2266cf53303560de8d23b42d", + "0x0aa2c1ad33e52fe03af63b9fe07da2ba0893dfb2", + "0x42814cfb08b3a1f9fedd618d35e4e2a156b4488b", + "0x6878647bfa4456843f29621e715095b3b004e49f", + "0x55c167261d1ee24e1fdf651232aaa286d20cbc8f", + "0x5c1309af479e557f6f14b9dd223fcdd3fdd50005", + "0x9bc7f7aa4b4395391089da8588ffb0842b5483a6", + "0x37663af4849b61c69560e1e7475a454296016965", + "0xa5e3404a173a02d8d868932c79c8bc82c054d432", + "0x7a9a4c920a69b4418101964ebc57e84236f613bd", + "0x977dfd4a014ccacc41fc583771abe9d04d279c20", + "0x37ed312f1458c0dfd0b3bdbad7194bd4d8b3cc82", + "0xb381a2b980b2b9ff2c79dff9be13e066c865d61d", + "0x483575f491f96f40324cb500a0004f1e65b26fe4", + "0x2f1bdb3eb6f40a5b5376cab148d2e75b342f2faf", + "0xf145577ad9173d2a2df11a88dfd9bf1c2d52eee9", + "0x5d3c265b006987c792574ac2810e62d553c74c6c", + "0x138045c50b9fed5d9db7fbff3d80b017cc35f37c", + "0x7013ff20dd0f475b6a1b45aa332c4d1df0d282ad", + "0xfc54d4d53e993a0808b32414a3665a82b0e53cdb", + "0x44b574aafb84dd0fda60d380fad0f0f7027dcf1d", + "0xa02306eb1de5e47e763d2065d53d55e386d0239c", + "0x881530f530aee4337451121c2bab288a74f547e6", + "0xd0a3a8ae09b4d5701ff06cc371cf371a0b16f0af", + "0x66c44144d030e7b23c4b5f2b177f473746ad1e74", + "0xd9807fc6611be8f3c24df6fc06a202d80a521c86", + "0x8d1509e0240eba23cccd58941fa2b5d7ff1fc70f", + "0xc856837ce657dc00ab70f2f8142a8a20b29f2856", + "0xfb69f5966564416235ee699743f5656190fb7f29", + "0xc2552747697ad2eea67dd75e10f7933a62ceb64c", + "0x3418d7d519442a8890b7ce75d6d206be62a564af", + "0x08d2c744fd60f2dca8c1885d3aa03ff6d3fa5d11", + "0xa047f8dabd83dad34e26d5b8c5599b65fdf0dbf3", + "0x5925fae4fc9fc087ce117aae58a1cac732371a25", + "0xa4f6b087d1b1e1b5e6052a19499cc62418509152", + "0xacc491029917e2f89e31419d44246a764af945c7", + "0xb701e21382a34ff112d0afbf32bb1316c018cfc9", + "0xd95cd7542980bec61840ec945fb0148ffe7c5ab8", + "0x6d6b34b1d3e7073420e9f33e20eeaed7990533fa", + "0x0606778fca425f716242a237a99c5517b95784cf", + "0x1a8651950342b9204d632572300a38cdde8f6145", + "0xde6a3cdda488a9840e306a66659440c6846b1623", + "0x3b7647e9b16a3d8f82eaa9360ccaa30c4794f68d", + "0x3337137166a76d2bddefa54adfed7b44fc2c812e", + "0x7d11a1dce951de5c6b2292bad583244df8028f8d", + "0x4a1dff8f8a84461da17554a0135829a24e7972c5", + "0x583efa869e4c14cf972e84daa724bf9dc7f9c440", + "0xa5637e34858d7fdbbe47cf95e2019a2067ca0801", + "0x99113537601b087788bf89a70787aae25636c344", + "0x902d842b4fe45db9d8ed0abbde7053e7ee142232", + "0xb4a37162249b8bb2099dcda2b73160a0d5000650", + "0x7aae86ef246a1a93ae5f1455fae8eae4830f6aa8", + "0x057d74ff27e8e59eb1817a56c106d50fc7c2b79e", + "0x641ec6083c68fab5f67408205c77b13f3ac9575e", + "0xf90a01af91468f5418cda5ed6b19c51550eb5352", + "0x5440afc3ef2b0af19c358f9d519657a6cc5909e5", + "0x9037f3d4b0e22247f16de615dae2487656552b8f", + "0x98e6269f33d3191b6e6dedd01e93c51cc14257d3", + "0xb9248d897239aee554ac509acc73760375ddd33d", + "0x38a08fcd1d06dfcc53672a1abfed1e99b3856712", + "0x0969eb4b80cf3920cc9d0069ff9af8ac5f301712", + "0x64dbbcd5d654847ed1aaa631d4fff3d9ab431d8b", + "0x3e7634f08f3cdbbe464d007f9756c4ccc6342736", + "0x22f726908e50bd10f32fe270b7d11130196f0111", + "0x479b22cf9c00f796b775df351523d6c649f8e45a", + "0xd987c8fbce90f127ba6c251c10659fe729bd868e", + "0xac40b43838a8b5ca91a1d7e3e000526207aef935", + "0x574ce96ba60887d81c715bbec108983999cc4ee9", + "0x45df6a48d823fce185ffb11067e8f6733731e8ca", + "0x0e4a8a3c96c96a12016b0b3fb68de3f5002a0b81", + "0x986bede8b64a38f6f5f55a48757f52fe7abcdf79", + "0xe2843199dbc6a9ebcc2d04fc51834100a035917a", + "0x4849bb5bb9e3892b4a93035c43705054352d45f9", + "0xf470afb25c10b0a638954d1ff7db20861511bf37", + "0xdc300ddff0ef04e8c9bffa629f63fb9383c6206e", + "0xc09af3cba2ec914648bda724785d3638bd6b917e", + "0x144aae52e64866927b4ae57bc8ba1560d788ea73", + "0x458ee879e7e551cc46ce39b09fb3661063d9a5c9", + "0xe822f2fc8a9890bc3705b06486a9343f2970d335", + "0x0e024cdba8377acf2d83e23090e27f5f8f490497", + "0x9f914156f4ef42ae375e77270dc452e9b364db4b", + "0xc42f6b4d448a3d0b41d4125aa3de003b61d67c80", + "0x07c797092c9a6baff2536f3834d6ad10e34f0ec0", + "0x2af98fed86c717ec283ba9dc4cc8a9b3b227efe5", + "0x8fb560121a8ddaeeca7ff898b602b147be6ad15b", + "0x24dd800d5a1bfa93851689de82a5ecd3289756c2", + "0xfea6a4607be00476727f755405ab5f2ef0907041", + "0x2251224bbc6387bf57ef69f9b4039230afab290b", + "0xbf0a6a6457c8a38f0a627c5b17cd966bf31e70bf", + "0xcc635184a72f3a4fc06ba7de7140b73b73eb8796", + "0x1812a86ac8e255be408eaf3a8faea701b663091c", + "0x0d126dc10c22cabc2a5220bd1113eda7e4a38fbd", + "0xf7dce38b0a9b831269a73073f386d70aba9051e5", + "0x04bdd823a64cbbaec574e149b131b63b98a89f20", + "0x94f4c409dc5514624b9c83f6f5f1c5cb00f9e273", + "0xa1e5f97b5bd410487b96f7aa9b78b9ceb9fd23f9", + "0x1702d1fc5ef328fe370b2f817487902e35f2f8e9", + "0x050087c12c537c88f13cf041a9065a74e624d704", + "0x788d245051645438e4fed7f7b6b63e3c9e070948", + "0x8eda5b6280b62cdd0f8e61558af4d2cf9cf6ce19", + "0xec302185ecdd556e9a5290e702d69b7c76390a56", + "0x38cfc869ac6067f1951440231478f6b8f2b3242c", + "0x0a12c9ba0d92d8e67762a06998aaa4fb6eac67cb", + "0x081ad9b41357ec4d79ea245fc582ae3dc74148bb", + "0x5c693d2e48deabeb1920902446115fededd0fa65", + "0x886c9f5b3b3efacf68d8c5c78ba13905bf113458", + "0xfc7e27616bc469c1938a879ef1973f2b2c55fd03", + "0xd3114fcee8050c7a7bb1fde0274f2b94aa325c4a", + "0xa20a92163f3984c9ba94260b1551e1e6dbde9b3e", + "0x3f006475fd1097b20c443f8f3cefa8d8424016b7", + "0x1db24abc4f18ba725f957a689d894edd5b4e02ea", + "0x1cce2bb4ef35c8f3b8ae07b266d1ea2ce2eba079", + "0x9b47a5962065186ef211e9e392e69961ede88d9a", + "0x6b4a7390597515f044cc3216f628536607baf5ed", + "0x7edaf229400f118e777893d5362d1f3bde5bfd8c", + "0xab837b6013a33ecf166e13f5d8c5b5480692a249", + "0x75227fc09bd876a3ec51662c172f4eeccf053ae0", + "0xa8f6af28bfab672859acf31eca54c81a9cbbeb66", + "0xaa57c4932a93cc50a68653396544a72a5c43d050", + "0x816f92e24b293eddf6e0a48a5c03690079e76065", + "0xf581acca33aeedfe25b34851b8d297c3b54991b9", + "0x252cf42f45161985bf7543e80b092e915b752927", + "0xd66685b74c277ec6544c58f7635724085171b5f7", + "0x61587de6e9f16df9f7b56ee070976f98ee943182", + "0xa0ea44b026dfa75dacd0da98e41e0de1ed4ef83e", + "0xf23b567de98e37552761067e2f6793842784c647", + "0x5bc3053c3af87587f316cb7527a3fc0601a01639", + "0xfbb21bf1da2414ad78a857aae0b9961ce15657d6", + "0xa78e366a8df7cd324c8ab74948f9b2064855a6b3", + "0x52c666afec69ac2abcc2aecc9b415976b5a61632", + "0x478eea1237161d18b7afbbacf9cd7685af03277e", + "0x1add4d42646fe5b504dd9505802642df54000b46", + "0xe786b38f7a1f3a6e4d849b96149b9a0f0813f503", + "0x504eef81f364c75aac6e655c7f65df24bc40c71e", + "0x1766c529c257513ec43fc2ee4258ee18b15c5f5f", + "0x0695a70d3a19b06df3cf1c9a29a47543cd165d02", + "0x9e9a7468ac81a1c190710230520abaa498adb59c", + "0x2a09d7a407f0c663f4f00378f3e1fd1714d64090", + "0x10c05206a5bc4c3df18ab311b77f87544a55efa2", + "0xa5f5d53cf9d07745db54ae20e1ebcab30e4e21cb", + "0x789253eff75b60e36f8a6a3c5486468c13be010f", + "0xd2664919d9a0de51daa8c1474873b59b1c810c6a", + "0x2e944e78f2ac3931ad1f6f9babf8c906ffbfce1a", + "0xb7918af4473402f1721972272f63be38266e3391", + "0xc5c7720eb1afd7d7e31aac1e758b6dcc40ee7818", + "0x55e00c8dd4ffca463b099ad3429ac3205552a9ee", + "0xf1e39f31c62ab0f782515eb50bff16c68290d290", + "0x1bfd231beb0bd7bd03f7833795d61729f2208ee5", + "0xbd53f56c5396ddba30cfced7f4c4999147c0a700", + "0x38d4c36597d93a914e00a4b71b17b8752e7c45f3", + "0x9080e8e39f1ac9b48ebc3d198838629eb04f5255", + "0xcc910517a6d1e0680c69f00b7c4f675f9b5f4877", + "0x04a63bbe946d8d47ce1ffb1fde4ef435726dfca7", + "0x5d77a467b1322d886264787fcc6aeadfed815a58", + "0x0256ed8f6652c62a105720d1a4855b0782b2f7c2", + "0x116c3d085b41d8ddc6cc003adedf9666aa77eb31", + "0xec7fec45b9963414ced7e9d7afdb7902ec452d09", + "0x94428ce627d373075f7a96eb2e0a340c309c8ae5", + "0x42c96413f9e022f03da41946c8ffd8356cd19e69", + "0xc99a747458c3ed477a40488b1fbc1af2ebebc150", + "0x1fe8de2172f79e1a622dc41e47d67e81b2087eb6", + "0x73c1ef8839f8c1fbfc7b33eaf510249e589f3782", + "0xb506bcd27da08140b0d1e90acfca21ab328e77d5", + "0x3a1458bb5c6737f3e164494f1c2b88fc8fc08eef", + "0x2a928043ff9a8c8cd9d06599db57e61729785a51", + "0x722919cba757d5a372da226599ca17fc96971185", + "0x740520df9e4f9afb5a94b1769837320f0dd53fe8", + "0x5215c7e400a94249d831b16b4c0c32140aa69b2d", + "0x34f17ab664553fb8174265e4ca7328a32ce3ec25", + "0xdbcfd333629f6b02f150d36e087d48b67bdf43de", + "0xaea88fe4eb2d77ae769f9e37abe36b721dc9847a", + "0xc5fbc6a76a4b462911787529f144561cbcde165a", + "0x3b1bb3f96811c6b007ae01d68219788ee30a1f3e", + "0xdce6de9c47aebbdd288f953f378e14a6a50fa5f3", + "0xe5af23e08ac446598db51f9b43616d5f1ddde13d", + "0xcf8cf9c04af037e96ced63a6ca0e5cd84fd1db50", + "0x3d1660d74e8fe3ad65f1373d1baa9901fce27084", + "0x54ea7fcfb389e71682255473f02c40a7a55e0820", + "0x0dd5ab51d017a098a993e7fe805718e1af3fef6b", + "0x28fce3a4aa63abb62e20a76f36041e21fa142a14", + "0x9e82ece89219e2f4ce63d3afc7ad04fff748399b", + "0xf7ad4abdb7c4eb194dc949aa229429440fb832fc", + "0xafed0aa32ef414060858d9824a5ed9a847b09fe5", + "0xf33e2b396c171aa528e83c65f83f0b1322bed218", + "0xe4311c4fcad4b92be85525991677696567b6591c", + "0x1e6999a5466bc1102e2fdfde7edce4eb7fa56ab5", + "0x10a78ba329d754ba5af48c744cfadc0f8b777d0d", + "0x7d464bb9f0152e6bb153afcf3c8af29a07bfd244", + "0x2ba359c23d3badc54292c5ed77a35141c4169ec4", + "0xae1460e17a9bf921b762ff04be0169151273e7ba", + "0x35534d70a061d9b8a4555aa605383314b896b198", + "0x7c310a8bad0469102c87fb6bc843e26e9778c45a", + "0x3d0865b1455813d027672a42af80944fef52564b", + "0x0b79a8b8eeb975cf726fc874661b6c01c8d6b176", + "0x32946bef75823f74179eff1a7669c6375797ee44", + "0x399b1a7420260caa4d7c7ad3e0f85785f2965d93", + "0x3b88e816db9d525a1bcae60c7b86289d88909593", + "0x053a511e3f45d0f471b7ceb6e465468637bfa3c1", + "0x0710aa9cba135c9e8962a29a70b0dbec73a214cb", + "0x2b10f686a2e2efd8317ba98b99d3aad679234d39", + "0x1a3fa40fe2de36a7695f7d2ac0a119dfd034a99b", + "0x2c7e73ac8f11fdb296d9da020f3da1843142e934", + "0x126e56119c144f21373d128d074b25184a965774", + "0x5b96c1744bc739c106106965dd2a0c472f67e866", + "0xd664397849b6ae6795648b5f02e7eed51291ca77", + "0x576265a85cb0189c6b44576b52b0b7636b945919", + "0x600b30ad27231e05d16bf1d2747f56bb4ec690c0", + "0xf42691a69e76a6a9aa13ed1cd2f9a8c6daad0143", + "0x910379d8f28462b6e57c99477c330672e1b5c80a", + "0xec28826d1fe9195d3f23db306045bbf10663bfd6", + "0x5cb2e77a0fc66fb928f179a627c088f1aaae42ce", + "0x463a4fcbb308ad7c0733ecee84ad4c89b066a4f9", + "0x6d9b744c81b7c5734dada854395e2c29eba09df5", + "0x6490dfc11edbf157739915f9a78c4f41d95567b0", + "0x2a63377098a3980dd05045cd53d825ca5b770b26", + "0x14dbf9253defe0cd2b318f2e3e916ac592b6c9f3", + "0x64b422c5855f2ddca968e67cf714b5541d7af72c", + "0x1e1a433899b1b14af5368a965361d2624b6289a6", + "0x357ff4cf0f1fecab0c2025f07490bfab03f539da", + "0xa61eba914db4a643571f50be773ddf5338e04302", + "0x2161f394249cbd2311f26764bfb69b470eb0ee42", + "0xb96f876c5ea96f9037464636e80eb33a96681aaa", + "0xc47bca726471967b06105873f03c9e1261321664", + "0x3c7519e33dd2a659a2e8544ac3e57e00d7a93fd3", + "0x383763f619f1d37650c0b6f87352c10c6d930255", + "0x854897e9cc857ba10248f67cceac9bd7cf259e41", + "0x8a67b0e4d9a5d4f10932f20b3659c2f78de363f5", + "0x069e1e1e350fe6dfcfe770a97d24958dbdd6b5b9", + "0x07240fa32d462602cb5bb7aeedde23a55173319a", + "0x040710852db6aeea03a879e09931bba9cc631a5f", + "0xf53d6b192deb1e6c7079f1d0e3bc8d3fb77a7d81", + "0x4e8e5285e66f49978dba8e9e2794e588a876c9db", + "0x54ee6fdafb7766f6e41c619cfefbb65ec3df94cf", + "0x2ec50424f296d2c65b7a24440ac0083b73f90d31", + "0x50cdaa35b2207c7473477a2386b1b5dceec28368", + "0x1147c6953e1a27a15ebe824ddd95922696cff214", + "0x6272f3946ed0ef6dc12f4100720b7664bb66a37a", + "0xc12b6c8959cb28f1ac3b83faff107dc08cb087f6", + "0x26124e94fe64de733cc42c244010c6b57a1aa6db", + "0xa756112f38ea4dc81ac1c582e457961ab1bddad1", + "0xde4df4cff287cf05ac6b258db81976b524a17e7a", + "0x92669ea4ba6a825c194269b87d5547f9515ca6cd", + "0x51599031f50798f5aae6ccc00514dbf14499b3c7", + "0xeeb0aacab640ac025da8d732034ed86407cb6559", + "0x241542afcc7a8a51f8d8f063e5ea395ebfeb2788", + "0x5413e04d15176e0a6487e2a0af74636e4528d9ab", + "0xb8964fe9055af230d3067681206eb37c2e65dcb4", + "0x0ff103e96d0013427982878e6ab11b9b3aa7f8f2", + "0xb1210e36c45314ac5702401c983b62556023187f", + "0xf32e29d259597034f6296aa38be8d15b2ec227de", + "0x7575e1b236f6fdb51ab95f09af7b58ac40d2b286", + "0x6cc19b9cf75312f728dba0ef7563ba6e50b4000c", + "0x4e82e61b551728197ef70f526ea5f7fc35964eef", + "0x281bac88a8815e9802253a9e1ada458e9ebc893d", + "0x648064dfdbe1fb10293c8b353720e19a8e9cc32a", + "0x42002be21f2c021ef3a24581252a87700e4315aa", + "0xf6e28e1a9e75a82025ec1c76dab702b47ee499e0", + "0xfac597072546fd466c4dda3f12e7f42bcc741ed9", + "0x6cb7cf6c6d3a6e811e9c795e15364e045d5bfb2d", + "0xf6132ae1e3785721c752eda4c1caf415ebd46694", + "0xb46bf51a99aec046bc17c0df08715bec7b25868f", + "0xbdf69dac2a9629e955b855c3d024cb874c5f0570", + "0x6ba2a2955f10a292b807e68136b975e350b8806f", + "0xa7989ed5e4945fa41e67a83ab8ee610acc373f75", + "0xce8060d4b10e53d2b092fc5e2c6b3d43223056ff", + "0xf3ddb3072454b4b92aa1cf30f95a10a9a27ba9b0", + "0xbb32729f716c2b1c8ba32a47cb93ffa934a20362", + "0x435b4f7f61d03199f1ef8ed63d74ad448f185c9e", + "0x443dad04c5abda9280639deb646f6ae7023d0aea", + "0x1318873057567715531df42c8419c5946d64522e", + "0x8458f0405f1970ed9eb7c0aaccd0e9ffb6c2a6e8", + "0xb06e84a8d27d650412cb87b541c87b3e5e7ff42e", + "0x0f680ca3ffe44ef8f37bc294d84516ac5e4b78bd", + "0xba32cf2b9142327c103c3dabb6970491d9f232b7", + "0x3b774f061f3c4fd0bcf2ca19e73c306be3223389", + "0xf46e0c2dd8edff86a43fc9b052efe00603595de1", + "0x0ea2efdbe653856889d56d7a9134ec3400860998", + "0xd29022e6f402e898689b3aa7ea7cc5f856512cc6", + "0x6b36d584db811f11e300dc0d4312bc97c3d829a3", + "0x70401d9b8dc09d5b9c7fc3f3606c104bfb272a50", + "0x74bcf0e1358062301c1e972e0f5295dc3bd97740", + "0x308f10c01e2d2834bf9cbc5e3abc415451a5f170", + "0xeaa9f18fcde4ab8d3e7c8adadb2d1e13fdd1392c", + "0x1ba67dbc43b96f5b60ed6047abd74c52839c0a25", + "0x74d8ea4e76f5fe2477829b21915cc3a4908eb657", + "0x3394caf8e5ccaffb936e6407599543af46525e0b", + "0xa3962b204c018fc3f4cfd7196abc776beb3f72f7", + "0xc2b1e8104488fc4af533a694e8e6ebe83802eb48", + "0xe4e10f3edf42057461c42961b0ea0d43957f1b9b", + "0x4faceb890d05e6a5e3ee1522472496a96edcea02", + "0x71fc9f2bd2585b2517c9d32ca57e84b4b4da263b", + "0x5794d36de0c21211a7906688981371132bd7c6f0", + "0x996345e15e3142b825baa363096e9f40927e3300", + "0x390cd4bb64419af1a87d9b97ea7b9e68368ef8bb", + "0x1fa925d38eabe85350ab894efeaa3a7a3c7df9e1", + "0x131d366fb820032ace0e5ad3309b8ca7785b3a93", + "0xe30b3cfcbb86bc53969f669bb5219a80e2a3ed51", + "0x1ba0a65ccdf3216b53b117f3df521f261d014934", + "0xcceddfbe7cffe6790aa57bbf13a9ca51aee36930", + "0x0a04fe911785d5c52b9cbae0cb47a71da5a402b1", + "0xad85f75b4cb491b86910d617073b8f7fe2028009", + "0xe2d47118afe2119a8104db483ead64a39bfce303", + "0x6d061ff8669b36d4b66241e1f06ca38f633db023", + "0xfaf990e665a200f3e224d13d1e28e6eac7b8417d", + "0x16e1ca0613b17782f39c0bb6d1b2e3a3119508fd", + "0xe20479d972042ac14232ab9859f4d6d2eab26732", + "0x70f836b7aa3dd6ede9fd7f2dc1f1ad4a6975dc4b", + "0x28673cf0eb8409790b94c69b11a12c7a068b9d06", + "0x963e21910a11b33490bb741e48dc453a27854f55", + "0xa5ba7caf7bf0c5c1c4cb1fc7e75ba2310dbf013d", + "0x57b9ef51cbccca79f0909252d2d7f1548bddfa2a", + "0xd9191c28fc410a9fae54b2eff1f44cc75c110ff7", + "0xfbce1f9a93b65168a702d839bd4a17195738b545", + "0xeb52a6f73496ec3f5bf0bdcd85bb507a981eb43a", + "0x029782cbae3a9114693d98a6a8c79e22f3e74073", + "0xd61b79b7c2b1e8375f5f5f8bee1473ffbe4b4eb8", + "0x16c5d7862f5e42b578c5b86bdf1f3887fdc0f412", + "0xb9c5747e56277def127678def8cf2308badb948b", + "0x73c72251ece02581195224599edb9bc0d356a875", + "0x9278ef1057157bc06f304aa8c1ab430670bb14da", + "0x01f9d7b596beec17f328e288394098b79cd77336", + "0x7b4290acdbd17eb541038f3294deb45a303ad65f", + "0xdc23c95b6de98fcee20840804e4ba353fd632472", + "0x98d575107665728872090d209e4565578da998f0", + "0x620bbc8c677a74808436e9493c637bf45e941466", + "0x99bfcd84618c69382aae25a6f84d3549d1993631", + "0x558fd7b3e4a90bf30c8ee73c33676fda418c5710", + "0x6adf750c6d636a3d806eb7c5f0652c49d5b580d5", + "0x208671488506aae0227a7e1212bab5a9133b3dd7", + "0xbd07c5a0c16fed711326174a2e6331d15ea65d24", + "0x390ea4de1d93551d4341c27b926a0edab6150796", + "0xbfa15bdb6522b8600ea6a04816376497463fa122", + "0x3d7199a0e4a4fcf72f28def17ca7b5e1270843ea", + "0x70439651423ba5044beed36db9232c8c08de0dd1", + "0x5deba22a22d9b86ace328d3058d37bd139a96562", + "0xabb596c50e3b1dc3717a96ac09a2aaba86834cec", + "0xf33b88b33c150930c3c71df9d05759dcb067bbe6", + "0x56aa4fb42f77faa81b5ca0d2b3cab33f80899648", + "0xd1619af5d8c55fb425d332f5678e5640985d948f", + "0x9767549c8941f7ee6dc85ee03f114a071e392774", + "0x5b92e3a13f52dd97ed8d5d1e0383ba537f6ab50d", + "0x6e712bc1e45630b347e1598699bc736c774b5b45", + "0xa13d2da02ac6aa2361cb5a5e56608aaa36a5cc5f", + "0x7d13f61fa98ab057c58afe602830c72beb5a128c", + "0x4abcb969c55e63a5b6d12f6b468da6d35a2eec31", + "0x5e4302d2cf411e7d6de17e47439fa1b79122d20d", + "0xea343ff3c072542733f9a2c749ea06aeca3317e9", + "0xb3ef9ec8b38c024cce63dc90c0dc49f020682f7e", + "0xd99a4f96bca46dc34c51700192e78f8532103a8d", + "0xc700694ed60d5f9d20d3d6b5a1da0ef92ec2a64a", + "0xb441158577d256ae79e8a56085572fd9ed8d8d71", + "0x8e5291f30ca5e45a9877aa76dec3f4469309a087", + "0xa8413b6debe69e2b15eedda879a4acf535a1ec70", + "0x6fbb7ac34ee8cbe6f3651f411081dd4e25acf939", + "0xd26cba91cfe85545902e54d313f699aaf1d9cf2b", + "0xa9efdc366ec338a2c1e4e1014bbd5fa0ab5c4131", + "0xe8231771ff6ab5fafa24b30a8163da69c2d259e1", + "0x73e65b0106060066788ca95760c727e48621ff68", + "0x4496cf90bfcff428598e5b3e8a32ee0f0b82bbae", + "0xfedae7f7652543da467188e67d95c881197f9db7", + "0xfc2b89d22195045161e6419bdf3e5d2744fbbae7", + "0x7502fe68315f7efeb1084419e02103730f0b5262", + "0x229fd64c932e5689a8b1927cfb194bfdac7a5979", + "0x6f7e02049b13f0f0ef041d8589c607f441790c57", + "0x43aa6b8a502ecec9d707bf405b0875d7a422cfc6", + "0x6b5e9cebf8bd16168f34532d0bd21667ea2e889a", + "0xdc8f405daf7decc6e4ac59449f72e1666bc4ea05", + "0x6e48428d22f9e7c9de30eaba9dc8ab415c27b5c5", + "0xcfdd66ffa8d8e0aceb02d0719f4319baac0c9ee4", + "0xd22ddb29a1abae5a5dd4d3cdf7ddb4016c248f5a", + "0xff02326f11517be59eccc12a969cdd886ca6aafc", + "0x6ce3f087f60595abff0ee6f6122f03882a978800", + "0xcfd806f3afc385ba9a3c41365c9f573376e60886", + "0x220c95b191ecb4652824865e6c12f4957c8d2083", + "0x0a33f60b4c62ea86aecae388319f57dc161a9f8e", + "0x613c5cd67120bc1637616495f8e54487d4a25085", + "0xb6170ab86a11b9a49dab3e4cf5a5310e28ba61ef", + "0xd08f92039a05fb1b43c49c4f248aa524ce0676a3", + "0x96cf76e475d2234c1360b8eaf6bd88cebdffd672", + "0x3e3e88e34deb2b6273c9f939b3e0e3a9890f8d60", + "0x795cf26b0f176a2b7f67d247a44108af419b6148", + "0x35c5bacbdb311f9ab80fa08b4bf7fbf7b5a9142d", + "0x67b8beadc6b5a7b05aca502ac22e4dfc8f5ea9ac", + "0xfdb07ba9ec1861163763848d8528587ec2fbe31c", + "0x6c511cfa7b5373442957fdf82c15640631bc83ee", + "0xc7cfd7838e593e1bd2aea39062961cc43b717774", + "0xb641f6ea49fd6eb51cc4082b06ce4f6b95cdc946", + "0xfed8c4cbfe2312e2308386be1fc57e7beceae821", + "0xe8016b9dd356b7f24da71592e2c2b40bd393c728", + "0xaef9fc4f400a6804de8f2601489d1c6f65843cf1", + "0xc52670c4d0efc17e81f84e7cd1787d212af47fac", + "0xd954a8efff9fb88ef13321c32b1b89245c173996", + "0x67e2ffb662368647533270e26dbe3d9cf56792c7", + "0xe945bbce84c1962d5de68a68fc114b6e1998c68d", + "0x0cd6bad89280f32aa96ff7b25720fd860c08b419", + "0xdd8b5bdf603da498af17afadc56aadc4cd7152fd", + "0x37863b7a235e0d7d07568e603ce5b0cb90b003ee", + "0x83af626f2ad579e1d2de6709e3a73b5e614a36c1", + "0x926784b1e8facd2dbb564b00cefe3e53643adfc2", + "0xd395c5e4dc62d54f699dce186f2dd89bc540be85", + "0x5fda464a15df52b2a947aa4807036f3b331c81ac", + "0x122cc9202228c561fc04cd0450bbd89fa5ad7514", + "0xd22849e0d85070028dcda43858ff911783467a3a", + "0xa179a0be4db9454ea18df50d26014b9da6e98674", + "0xb0fb2631c2f41e79b967530e5b8975ac825d6c63", + "0xde0734aa6a66f7c5d25ee07fccde0b35ea4ccc4b", + "0x9fc5f551e8513bcc6bf151e1612531babcc71fb2", + "0xe0fe97dc5f72a89e7c759fe1065cd17e585eeeab", + "0xfa1ae9a0b1c9b6d4cad91a3d00f5b6f9562c294c", + "0xc21bec5125c63a523272d506ca43a58762b41b4b", + "0xd4ac1f50ca3808c6d85dc123631fbe7d50140252", + "0xadb59a7507c0c2887f295cbb3b96999e9b8a7cf8", + "0xc71b5c60e6855a531282457427b38865ba3d30a6", + "0xa5a625aa7c0d2ac7c5b94bb1d4e901127ae927a8", + "0xec6275175c2dd7bfd9d629cc7f26c636e921adf6", + "0xfa38f38faadb43f23612155bed51bf99fe1a0f61", + "0x3b22da20442156aa693c7e39b139583dad0f51a7", + "0xe5d0eac34d4d972c10c46a910890d28eabd3adff", + "0x269f50b7639ae38f729b06d967fe4fe765c7c62f", + "0xc2c735899a45b3946e3a3649c8febf4eafc69a9d", + "0x3cc5ff41b0e3920ceed1bc846aeab09bc70bc03f", + "0xcbd1fd614a7dc5e894f77688a9674ce1cf00d30f", + "0x9819686b54cb0ccc8161e84e22db7ae1ec54960c", + "0x1daad627ad95026bfdb4d767f428321778d01c8a", + "0xdbd0d56895408a9ec391bf07df2562fe9842f86c", + "0x7dc197557e2bc8f9f2f966817801877bd66ed327", + "0xefc3b8403288afa63ace52b1af149c5101ca2d28", + "0xb74cf5637521c9c3681597c7d09d76d3c2f0c84f", + "0x2d409b74db75be650cc36e53192fdf7aaec35002", + "0x23786fa33d919088814ff5a88aefc3eb66e026b1", + "0x9509aa432400b50ea05e455a5d35cb76bd9de9e2", + "0x184906f076acb00e9d14fe10607f3a187347f18f", + "0xf00efba6bd90458698586f0ac4d2daae520916fe", + "0x619237ce38b8be2c6f81c6bd6f8b24018906643c", + "0xd238177f1edfe3ed0d2bfeb462e966a3f7cbed84", + "0x1dab8da475acce5ef82dc6a0ab21cf758f18a8b8", + "0x29c13925972ad9229e281d6287175408b2788b79", + "0x9412e51d2fe482f31e0b2f96786302976855239a", + "0x7ee3809b581f0b7b4098bc70f9c4fccc8c98a32a", + "0x04355c5cc76f6162360bbb0369cedc1e8c0cedf5", + "0x3e9efce2fc299f3a6d1608aaa0c4436235eabb78", + "0x3b48b700ba76c931158c5e9f028553f28f2f8b2e", + "0x19a3de16ba962e85c8526ed43f483db8fd581127", + "0x4d864b0ddec2a861506c8baa676e2d99a4c30a84", + "0x0ab4dcd5e3c1b918f34a13b475fe20af1147e8cf", + "0xb201bdc7c877926e5e2d85533f38c79e2d3451e6", + "0x003cb5d17c5b7d5312644f5d7fc2eaa6c623d52f", + "0x8a4635c43eabaef34253510eb7ff9133a28d996d", + "0xa0170b6935fef8ff2c514703fcb2c597a9bc2076", + "0x0d844a1a567d09f33af5780bb6a16b95cc17ee18", + "0x003f01b1b008ffe4d12c150039b73bed314206e6", + "0xef49cf9f043461a05f885090c262718ca4a3ec6f", + "0x6f380e11f45ce6940b72fced69ae4965d1f63985", + "0xea96d625ee9a41507327d4c2d2fb80f72eed51cd", + "0x3ffde426ff01c6df24927056db85466f3592efbd", + "0xdacbda1005bf162fd76504b40c01685ab1a1ce3a", + "0xbe51437cab7360182ac04f64189ce28f6d69f355", + "0xb4dc1b3cc42f8b0555aad30fd8dc27f28a57d2d3", + "0x0bcc4fd506632c478a6a3d4681111e34838db15f", + "0x6f0a7775892ba5ba123fea65289faa5808d19b70", + "0xb41c951a417e6d9a34e25cb8a6dab2dfdfdb4709", + "0xd57c59706837b9f7e909f48cb2d6a1c03bc593b0", + "0xfcf38ca59f0cd77ee413d50ef9733381008654a6", + "0x3fc94fbd012e4058e53dbe0ca8904dcce1dde528", + "0x9112e9461660e18b3f5878a5c70907df5777c09b", + "0xdfcc7e1bafbbce3ec58ef2198f8e6b98a43f1a35", + "0x184bfeb5926f89fc392db2273b91fdd903c4e580", + "0xa80cd6a24f4a5a8f9426d29bcc0ec6ae72638af6", + "0xdc029087892cda8ac4b4811fa73f0f003ca379a4", + "0x65ba9745e49a41e6ec05c8aef60b17f9b5bd36ec", + "0x523f1ab93c6c31496dae3f24b50d6d46ff72c450", + "0xeccfdcf93c1c754123e181a559b2568f3eadffc2", + "0x0aeb17c467e6f752d29b56cd16260927fea7127c", + "0x9a5c4cb695761467e0eec52f24f6e76150210d11", + "0x999999ec10300ad1ce680ee9758df02070284e82", + "0x5cb4f0d30a0a502cccc59c2b2b99df0d3efbdbd2", + "0x8041a6e3c7fb1f9680b841a19b6cc4eacefac852", + "0x5f008eadd872a10196b3ce2beeacaf5c79999987", + "0x0cbcc0f2022e6abeba3fc5862721b9c5e111146b", + "0x3fad75c22f9375bb7375dc5d788e5f96b4507197", + "0x52647a7957193e4bbfaeaf3e75bdfb0439bdb5b2", + "0x97de953cde13fd813ac6bf8e3ad8735cc18a74b7", + "0xcf686dd7d98c16238775e738d6529f19d74503e0", + "0x4c2309971051cf2ebd9b09ed2ee2f60706cf328f", + "0xcd3be1fee264798e0fa7535ea708aa540dabb196", + "0xc2e0e99dab1edeea6041189d6398047691314f8b", + "0xa24d0092e32dcd6438fcf26aec7019e41307eb10", + "0x97b3633f221c94c81deae4dcc1a2b1b15c2b73a8", + "0x4fed0c0239d910f5e9165008045be9a13d4afc7e", + "0x8de3f0732d14af96c4fe806ba862f97e9a8f2c3e", + "0x2a2aaff28425ddb0ed915a505378934b63d99907", + "0x4cc40712fa41d7605135b4acf5e90c7d066c2bd2", + "0x6980cc2137603f1f592a8c5dc2ab41d9baa78b4c", + "0x6fd63b061e9431798a07bd0390593c786ce65185", + "0x1131cb418bba54dd35564eea3ca72ae7318640ff", + "0xd4cc5773c1432180a9877d875f1f774881500c2d", + "0x902c174345387d941c2b429148d489fe0f40ba2c", + "0xf357c9f248f84dbc466def5a7c4e1601c7dfeaa5", + "0xbea79c8a15688020d08d4eaba7761e1633e277df", + "0x90b1808848036eb92a4796f0f2ec856c9116de34", + "0xe246d73152e8f89e86a72b969a5276cb84486abc", + "0x8c98b3632aa00e9b10494d3f59f39bc25f14dcb9", + "0x8938520343606fd41d3bf8f8b8b299ae050889f3", + "0xe4a7e953486d01d4fdc76986a0c88fa4f87b30e5", + "0xd3bc0c24b31d9c48f10838cbfbecf98e3d178b0c", + "0xcf683625196558adbd94c06c3ef87ff64be07a7f", + "0xd3f1f20f3bf96319600df28b5f9f63f2553df27d", + "0x2a567f5537ce156c1ec3b3c04ee27e866d26c892", + "0xd690304a9ccffe6aa042bda8e6c0e45751b9afb9", + "0x4e9fdedaeaaf542dc82e612985d24576d5f17e23", + "0xcb34eb8127ab095cb4b86e96ff2ddfbe6e68a230", + "0x3d052d1af00d664c0170b785bfd73ee4249ff52b", + "0x74cce10d747714a79ff09b04d3cf4d7a6e430589", + "0x94bb64f974b5cc1aeeafaf66ac43c6195d6e7bb2", + "0x7ee610ddc8cc6b5748c4a11166d51899fbd63e48", + "0x2a99f928b6c33b2f405cb73edb34239702816ea6", + "0x6652f17e4687b0f1166b67541b8d75a6bc23e96f", + "0x622835cf49e84e980f1f9590cf59b90533518046", + "0x072d78b5e0fc078f5dfdc79e33b0d1dcb120d7c9", + "0x2e6ddcd02bbb9e29a0b4cc4b54c7f9d78b4277d2", + "0xb74f3b8b4aedfe431824aadfaa95e722e7a5fd02", + "0x4f130a5c442ab4ce957ce43e9cae2ecf6284d27a", + "0xc9b8e6d430a240b1f592cb61c6d221a92647dadb", + "0x63cb856459a5e1c7962260a1018e9203473528ad", + "0x000000000a38444e0a6e37d3b630d7e855a7cb13", + "0x08fdf6b04ac8c366a75f4909342f1e48f698cde2", + "0x5c7a47a9575d33ac1fc2b854ec25e84b647ef989", + "0x7a27bedf4e44d8651396d56dc0bf3c0bf05bedea", + "0x9a1b530ba2fd4d896715575f0d70079565521adc", + "0x9387f71f3928ebe9ce8b3d8cf37a8fb52739ae7d", + "0xd13397383d0b65531f4b1f545e20cba18f063ee3", + "0xf7bb67da535add8e84cd9d22c21e3fcb1ba09542", + "0x837f26f4d473c2f898f29c1bac37ceea9a5926bd", + "0x661cad15d35c64b4394381bac14ca142b1507381", + "0xf5047e836a513fcba4ac19dbb30241f1b5e1b7f7", + "0xc4a3f1b1be9212bdf738932e6d8b59bb055c1ee4", + "0x8e41aac4ca92681e37acb4a9a511880dea1526e3", + "0x72a2f0ad40ab76fa9d3252c2778d5fd2537f7a0d", + "0xff40baa58c2efb56efecd69bcc4491264ca45814", + "0x10e9b019a061a62f377d743cb770d179c355816f", + "0x4c88e9bf852afffd13a72b1a04589b2ae041e768", + "0x4de4ace849a0b23243e232a98eefd63d7d179c70", + "0x13154b52ae46326d013e6c33e3b0c2242ccf754a", + "0xb1f24f8f7e44adc2f8ffae0fa8625b40d3e9cd3d", + "0x1b216dda7fb4e57045434f385ade1b4d29f794d9", + "0x903d60bd5e1b0bed328848e8093aa11b0afd8db6", + "0xe4a6f3db5b3ff6ca74e484d40ed49ab96df30c51", + "0x2cd2c9a012e1938ad2542487d5e3dbece577463c", + "0xd81cd0166efef7216b218bc709b713fac2e96ef9", + "0xc94c50149bf027f002cf1ad18642a0f13eb4274f", + "0x0e9fed33f6a202146a615de0fa1985adfb461467", + "0xc71d063114c17c64d4a2dc67c9c11b8112fc5795", + "0xb6085dac49d19b46fdd2154157eeeb138137dd3a", + "0xa7ff0c2b127d5f26379fe665f2337cdb30ab4ead", + "0x992fb4f41663388cc611e8ef25e714a1541e456f", + "0x6c1cde903b3f64a1cb4c9f633bca5c6b945e164f", + "0x4f7dc1e9538a186952c712065e03a13eca03f6a8", + "0x254069cb5d76f7ab86a13153c6c64ba3795350bc", + "0xd166cfc5b597ae210df68538ee746ea568d2c6a2", + "0xfef491147e34a61af6eeae0c317b6ec8807a6536", + "0x76a9a9ce74fff497d7638e373515b7c941c5f9d0", + "0xad1ac908244ea5c9d0c3f2ed548f96fd23056a5c", + "0xe54b3362cd0442a7a2850d936095ea2d3315d070", + "0x6eef444f61fc47f1343b78e55d55813ecbc650b3", + "0xd6b2095e913695dd10c071cc2f20247e921efb8e", + "0x58f11889f3130f7d91d7f947e49ef205c21e975d", + "0xaf3b6c2fa0016bb24caea7e230c5de7d8d145494", + "0xee19771eb99b33b42881eb4bbaf6a29f4a43a4a0", + "0x037ac478992e23340fbd4114f218943037916300", + "0x3049513ae3ee0ebc36105f897af995218223b462", + "0x1b2215a57ceec84a87508953a646d5bb700d8161", + "0xf622d51b69bb13715f23ec777edb2d561f48a79d", + "0x929ba262e7e956ba67666eebceee4bf599f8f9dd", + "0xbaa35be389c89bafda9ac5cfc5e897ddb8dae46a", + "0x2a8f26ed5e885883e6dcbd9dd607bfa6b0bba9c1", + "0x07aa3206a77e386c39eb663fcac40d4b65374405", + "0x21a8a126c330954f9a9485b1cec35c2f1f29e559", + "0xfb92a366e130d65feb89cfa414c21447fd933edf", + "0x3383f5b36c826506f042b35e50acba721f0381f5", + "0x150025d2240f0e04a70384e8350e519838469f74", + "0x97424388a67dc0d4dfd51e90e1b507d85da3bd52", + "0xcc16e731603785a71da1ecdd99acb29ae1cf85d3", + "0x9b3c4d0c2530531d5c780af3d1a8e478256157ff", + "0xb2461444cab703b0f8b45e60cd898c45dec73927", + "0xd80e8715626e1bf9ae2227b0cfef29dce9451b13", + "0xa01edc6e48724459694d40ac0970e0f91fc0f426", + "0x7391974bada79d41fbccc722fef8cb4086bbf85e", + "0xe5a350d82e4f2ab31ed9b8318e92c9aba268ac6a", + "0x1c578c29ec4c9267156112df394312a4e00cf79b", + "0x41060f6d86791cf635b9af3bd19616d6b6c4faa5", + "0x01301f0746210905938b66cc9ac5c008dc4bea88", + "0x0141a5668669f24dfad012de47e9fc82b46f86d5", + "0x1809ba2c45575a499df945c008a854e5c388dc46", + "0x3466454bbf7800e022886327422cc2e119923f4f", + "0x7259423bac7ceefec3a3e7b4eeaabb08c7f29c22", + "0xa8f66a468eaecf2a9b8a0bdcdb8cc0e4c75046f6", + "0xc08a6d83825a21692200ea4b67b5f14a2e13a1fb", + "0x7bafd7c8458086e51803252cbdf6872dd442167f", + "0x6d27e8f21edec1e5092016d039649ef2ee12907e", + "0xe7bc3af0226767687ba57e5ab6328183e3ddda55", + "0x86e751c2ad5f45804c62f0d9ab2a5d048e240456", + "0x01acb9d2ad37e2e452db62d80f472b6d39e2cd6d", + "0x6e52a3f199b9e2da6f9bce4a395cb015a0c737d9", + "0x9b278aaef429cc4728e594f8fa0fbfe78e72cc26", + "0x6a155a05980532077d10dcb6639ae64dc5e1480d", + "0x39347c99a81de4a3c31f31a64d56c57068ca0ccb", + "0x2ae19a00bc6ea4415ec45ec4cbe078696d2bcc70", + "0x5abdc389384066b5fab17a1267f6b1895d43cf47", + "0x8887eeea16eae40bc7e5be88df0cd1474c4ecf18", + "0x54dd78871d6301baad8a86145116a1cd393e768a", + "0x5f7fd7cb84a90a1799c61deefe194b4fc778fff5", + "0x7a9147fe98b3a96503821ace49e90b4a62d55b34", + "0x193b41917f2a0f5d2aec6423ae151359431a6899", + "0x6306a2d99fdeebf725e7d60d73e0eb4a8ff39584", + "0xa2fe4a914eb180cc88d7411181845431115eed1f", + "0xf29c965a5c27bcfcf6d2e8c9189988a66c6c0341", + "0x42b0a676617490466877b9f9239d8ff35bfaa9d1", + "0xc76cd240dee8cc138a93d01f5cbaaecb450e74a9", + "0x7e3b5f38ecffd4421a5d7fbae76e6a2a0a7b7233", + "0x3dffdb9ba07a17c5598688b880f8a24652b4e0c2", + "0x266f33e370c1ac53d57b299ccffc64b6e224c2a9", + "0x3ece07de5c8cf6f79157dc3ec99421094633de60", + "0xecae679dfa967e7670f5ec130a16f437e9ab5c7b", + "0xae804a9ad3e58480bb89be1b8929454627d706f3", + "0x2fe50c88f228dacfc24100de0c5167aa7a539dc6", + "0x68689142ef6b0f38336de09e55d84cb3077c2ee9", + "0x4f0ed8a9308941e7c39458946c76e6324855cc82", + "0x0026914210262825ceac1227963d4d903d4ddbe0", + "0x5515290c6bab1e1f18183371d959e26617e09b0d", + "0xa82f26a0241cee162b868ef282f3592d4da9d559", + "0x047db99976d1080cc7639923cd1fe1d422a5ff49", + "0xe71dd0655ac3f4fcbc632fea344787b9a74a05b2", + "0xe000802f5005ed958793e7f0520a766f583b70ab", + "0x29c3e6edc2385c4f85248b8b7e43cce8dcd6bd78", + "0xf6ac460c70157db4a78a1c203768b9d61fb94b99", + "0xc926d433bd6b51e1accd7c1f1e7ce3101c03d3a0", + "0x7383173dadf422ad2dbd754698706cc1397671d1", + "0x9b0c19000a8631c1f555bb365bde308384e4f2ff", + "0x8f969962eb4413d073a9ff6825f50a31c01777ff", + "0x58348c5cc68a415c59d6306c7f176195fd042af0", + "0x4a2e3806fb3803fe6b2a5d9a884ccef6b0fdd37a", + "0x8be09c5ab2544214f373938f279886297dffe52d", + "0xb30aab5e29be4486ca86057a478b1a28c5c0eb70", + "0xd49200617ed89a939949f6fc1ac235bc02e2884d", + "0x9ddd726d797c6bd9374bfd443890a1fe263538dd", + "0x5559ffe9211fe85d2de147444afca8f9e9b77d91", + "0x93f3333c366c44bcb52b3c6c8cbfb9431b718bf8", + "0x8d7ee47b5576a30d340be597ff90bf8fccfd8c1e", + "0xc4545634ef8bfcfc1f7e396ede6d16ca3512ca75", + "0xf3c0bd6156672f7165776a7be5eab7e2a500a14b", + "0x9562ef91f565b1d4baa96476a6fcf8e49f3495a0", + "0xb80c51ca1127f59f7fe5f7c7209156f7d41595f3", + "0x381ed019a5ee2edd5596e2579cc9ef9ea99940f8", + "0xbad6e04c2c0681a96f88a02212632bc00538bc0e", + "0xba64f56d9cd04edf17e4030858db60ac79bfa258", + "0x200af46fb870dcc249f142812606b5bb71fe7fd6", + "0xc15fc417a1bb9850d0d7c9b8c98d87c009597e08", + "0xaf79312eb821871208ac76a80c8e282f8796964e", + "0x35ac1239027860d8db0e0e90aeac9048f0705e5c", + "0xeb4573cb7bb46871459319adc5474dcf1b8d48fe", + "0x993b1e14838e632d619e63abc73938a18acabe3e", + "0xb9b33dd36e0c339b703cd6cc313e52a06218da33", + "0x1eec60f7bf9894ca9973f26c27e0f544b8f4729a", + "0x36bc3b87ba6b4636a96aef8b0058856d05cf5e68", + "0xd990518ffd8f4cf7d2e9e5919105159269e36dc1", + "0x6858a4d8d7d0297c138b403b6a34cb3b424b7f4a", + "0x624b54d7007aa7dc90fdbf9e7ca424710a23b2d5", + "0x14841c54a251ea619802e2f964bf3a6145548c32", + "0xe5c0b2b671928900c1d2bd523a5e380c23a7e884", + "0x288099ce7bd0a255bbf88b3c7ce1b2fcbe96d740", + "0x6c45ef773ea8813df67661d74d126d622bdc46f9", + "0x20afbf05888cecbb547afb4ec25056444c59f9ad", + "0x6429c733fd2d1f2209c46ee5061eb908735eabc9", + "0x5d50f8e5ec40c3a6d7e124ac0a42cb4faff0cae6", + "0x354321eaa60588c148195ae26de875b82710e2e3", + "0x30e78c2bf984170b5851dd1ce5980cb078f04b29", + "0x7a791fda775b399f4a78f68a0b66498e6bcd3492", + "0x4b96253600146c37652f999da4f57c578c988647", + "0x3eae3e67839eb68e7fd2e9f3f7b7cf5e05b1eee8", + "0x4ac4ff89b9d4b3daf54942e3df63751a4a54c735", + "0xd1450a3b6dfc28ba406a42089f29c3a134542aaa", + "0x0624f1ba9175d983bb3896600115b87d69f5df6f", + "0xf469ef77d8c1b4634bc5bee1406cf4f5c6fa6d9a", + "0x5870121ab7c0335ca48362e360472dbf9b38e956", + "0xd37615aeea97f5355264e30a6a7554c303361499", + "0x05489d77f2e07c4ed6a3315ababa3beeec2e183d", + "0xf46b0357a6cd11935a8b5e17c329f24544ef316f", + "0x74d2f5da308d0b44437f17be7ef86041325c8133", + "0x910c60c049d833a7fd2f5bda310bbea1c5fa3598", + "0x104502b808e2929b14443d61c5a668fe3afaf02d", + "0x413a2ef6db50c72c2ed254b786fd1d3372683ae6", + "0x009c48f35d53f5cc254ed34d64c9b801ea15f69d", + "0x2eaa47d2f0df41751c01c1f81ce8bbc334d36334", + "0x17b11c2a868f2f71fee34199bec80938bad2c8ea", + "0x1664cc403908ba2e07ff55ee15d57ec1ab2bbd1b", + "0xec13489d022102dde8234d8c22b25b0bed2e7b54", + "0xe442debc93c5bdd029d1bebfa10daf151a697c95", + "0xfb4716a30e64f10eb937bc012d44cdd7208fb2a7", + "0x78b4733fef7ee3a5e233d9d7840ac7af174ca2ad", + "0x30f8efaa915e79378e4166a19e39e4deeceabd59", + "0x21f179c79a159359d20a94f68b99ad88db44afca", + "0x3d1d397acd3b0989d9e633d6dbf7e6f8f5c03a2d", + "0x927af42c31a576365e091bacdd1e7062af5c3a1c", + "0x62494bd8fc21e4ffbf9315ee8a5c76052580226c", + "0x60ec82fe8eef341af9170395714d8f118105a6a6", + "0x6aadf450490f15f84548e8c562e6aef342531b54", + "0xed20bc9f8be737572d7e40237023c7a8fea3449e", + "0x4616de0b899d995fd452f202e3646429ff878bc1", + "0x510786f789c14f3f897ee66af60972f5a47bc108", + "0xe315d1d10391d6444746333dd66b5084a00842da", + "0xbe09de9f8caee25c422459c1e13d6caed78683fd", + "0x3238618267bfb270f219911af9574a0962ad52e3", + "0x908a99852d6139d89c89e1cd1e6b5aca76b99bb4", + "0x62e0b529ca53057658f0604d9c805f2f30727b0b", + "0x2836545d6e07e9e96a9b622a2e5f4787ec9cc2ae", + "0x3a7249b510add84a2196fb0fad9d8b745d807286", + "0x0e85b07e1f0c4ff661d11d5081d13bc64e145a85", + "0xcb584da54660fb2a93d38a3ef68d9db82b62e389", + "0x7f29b17cac3bc3507bee3de080ff1345a3f603b6", + "0x01df6e7ee017c1db74879ad911154c86b0b85412", + "0xd42b97f92b1f7156152a9b87546c2be504de112a", + "0x889bbff32fd00e8dfbbb45756e8f75bb729be2fb", + "0xa7cf9b6a8071bdd78e2b51bb3ef863af974c4b40", + "0x532459cafadf17ef3f4515b2c8c2130dbbf1dd1a", + "0x22d41971a9b2adb4dd33ce45e46f82812edc9df9", + "0x3c20ab24c85a3277e52fe8faecfb2ea4d657a85e", + "0x29cd9d37f2115f6b5e0b8b74b6b24644c983414e", + "0xe3e6ff268ab0bb00d102ca38eebf6a779cbcf3bb", + "0x5a79800702ebd391d036b488bff0f9287571296c", + "0xc96dede7868f8c190208a22812fd3539e9e2caf6", + "0xab990f1dad604d9b30ffa72c8827f2f4d5b6be50", + "0x21a7d124f105f77b27ed97ee022c809f3f170c03", + "0xafb994b5916ca7affed8a51fb3d9990d343b3162", + "0xc76ff8810a098d37b9339e92c3722ca66273f11c", + "0xc668d4e0776501f2d464aa6e568ff61033514a49", + "0x72eba299088937ceaab3d7bde6234aee81a8bf76", + "0xe091f0534fc5ac1dae597240f65ecc0c15318926", + "0x041119fbe4566cf5ca365a2c4a11d887163b2e86", + "0xfa5b8f59074f1d908d0a4a0f88aa4cd0b6f120c6", + "0x8d0aec383ac9cfa23966b5c6244227badc3e8db2", + "0x4718e39351c975cfe59ec3d8bd9f3ebf6526d696", + "0xf8540110bbdd77e9a056a784b424ac1ef6dea66c", + "0x59a7478e2099442cefe758eb5140a45b39ee249c", + "0x6a5e18f4e64efb1b7d8083cb9e5adbeb6fb03ad8", + "0xb1656d4f3852f65877367138332d8482597f3411", + "0x1e4dcc62543e19738ac28600ec8286bdb6ba391d", + "0x16609a7da1fb457c3b7222e579d906db0da97f21", + "0x697cde59ac9916a6891560d4bd16a83808f4ef8e", + "0x57e15754dfd25fa5b59e41d7a2d16176bf8b06f0", + "0x686566a155550b3941d13e66f4084897216d70f6", + "0x53b118a3d686a9d6a95224adac11db43ceb80ca9", + "0x7bf33e52e9ead7d53aa7fdc1dd9be713018eac22", + "0xf2ff2bc69fb16674d0cc58bcdd7f674db576bc77", + "0xcaa71165307b66ef3215b4555a6f34e31aad58ef", + "0x29f0175b31d69aa0042f2b21e64c17256573696b", + "0x161d9b5d6e3ed8d9c1d36a7caf971901c60b9222", + "0x463947131943c526fa70b01640be6facffc4b83d", + "0xfd02d17e216faf9d9e7c844f7c4a111d2b0e0881", + "0x3c58d9b53ea00db51f31a70f103f6f4f59acf3b9", + "0xe4528a15bb80cb9e26c403b3963160b5eadadfe0", + "0x6bacc94a11571960543a7861ceb8ebb7b075947e", + "0x7a1d4bd38d08069402cf2f3ad7881cdc6baeb5c9", + "0x0fe5e11bc1e29302a7346e615a319b9645e3cc3c", + "0x2373e53e97eb33895d505c14ac0cda8a66696df5", + "0x5b325cb24169afc63aa6f8694b947df1e56fc250", + "0x7eddf20d746745da602c390c2811a9a39544a317", + "0xe813dd3321cffa4f27e8f31ecbba3595c70faef8", + "0x326235c42ecc751a47fe857a5861d1110da27824", + "0x0bd40aaf24d7c365338d23c252fe47b35d1e4bb9", + "0x8eea4e9cf99d1f84ad4524d89ea205f4d4192526", + "0x8710111499932c00afad4e1f11e4fb227f5e973a", + "0x5dee84f41ba7f33a70746b2e17643eb3159e14c7", + "0xdaf399baaf8abfa2f307c73bf498437c4da1109e", + "0xa4496bf327473878ad6758b02333d780b4708a1f", + "0x20deaefaf28697d0b38fc728ccc9e4f49e85859a", + "0xbc7eb9089fcbbdf5b5675114fa9c9fc6410962e7", + "0x62d63b2df6f372ef823d941b089b524609795548", + "0xf9b8303df5df417b2bf69dcab5f9bfff435ed788", + "0x14f3137b6c53939aa15910c5dedd0c5959be16b7", + "0x855526219d06bba49846ddd75b8a040087deee73", + "0xf718dc400ef3657c4b264e3cf407e38e968c5ada", + "0x4f7211f0f31fefdf9172c5c564e57ad16c291346", + "0xe8c8f65ccc27cb087d950c67bee75f827f9979fe", + "0xde8d78b323e1ba04ed9628ae9e2ce386333f3e8e", + "0x4c8b9f904bba6c872c7710a11f41e61c37a56370", + "0x1cb7aabbec26e658aa6d84a6587ae68955279513", + "0xbb13b7e8f91ca94a93f8a4fd70d0ebf5b421cbea", + "0x2d4f3efe587e0efb415bd7b5c554141d97b0fa98", + "0x21aaa8b0345dbdc9b797943894867d9f1d97f2b7", + "0x6a2d0251284683bd35174b029779c114df47f7aa", + "0x6a0762326d4eb2d589d1f9999c129ea8738081a2", + "0xba5e2a0a6e1426d3ed5b5dd182edc746f72b255f", + "0x38217e938df61518c31af3e7c4628eab87e80b26", + "0x948473025ba6ad1287d918aaca72c7e57e61de29", + "0x5a0c711cfc9622428d0a9ae84a14b81d9218802c", + "0x32515491a6994ef5cf42d062d79f65452448efb0", + "0x8654ce7e1f04291f66f05108f0525df9cef6b0c8", + "0x0ecc13fcb5797ccda3a408cc7a7622c4e5e3d664", + "0xc52f68db2ff9edbbade1bf44ce494c4748e54d21", + "0xc25df84fcc138599e90e41cb1a01f6c3bc1f87e5", + "0xb0ef88ad40510c3aa2caf333a6bf1ae4f901d7a4", + "0x2c9b656ab47ab8160668e2beae31bf9b36b7e687", + "0x5491d6563768d3ed07c6f40338243974d06e4963", + "0xb1513a28af526f7dd428ddb8fbbabebd0ab5fda9", + "0x5def0b86de6b0582a7a89f6c3858e9c42deb41fb", + "0x9c829e404829a62906899c400f677c6bdc16e8c6", + "0x81c083987867396db5b176e67924f110f80fd709", + "0x3a88b3f4495cb7d4e3b87bfa6cdc8dfb2103a173", + "0x6bdc201eb5005a59a7fca79bf0bdcaeb14745990", + "0xda96f7ec9c8c93b804d400608ad1fabb4e14e8a8", + "0x899a1bcbb0009d26ff0715375ff25a9cda9b4cec", + "0x65339977394adb5332be11ee1fa3d9bd99743ffc", + "0x7ac23f31d26cd8cbd2be108a2482b2d4c3e7b747", + "0x8c4f3355862452e8e90c12094be1d25f84d91f16", + "0x6f92a092af0692a6bc5ded28654214b40bee0815", + "0x555555ddb0a1f6039d782aaff1278e59f8370796", + "0x4ad3d5233da34ac79e5469a24c1c0ca304ad7067", + "0x51b68f1d12bad761e45342ce038fb8be49a0cbdc", + "0xcef90fcce5015bc5880ef34ca02fe5a929da1f1e", + "0x6517029b15127e44e44be1779b0e27584f3ae411", + "0xb4d44beba47e16f825ebd1d544769b29a343cf38", + "0x31b1ddcc6814c9161fb5489258d4d7eb0611a2ec", + "0xb3389cd9cc90b185c046648c7f5c3666f0766958", + "0x9f9afad1c7aecc9d80e2208bb5a8292160f3cf17", + "0xa3ec5e6b35d73749c04d67ad9c5948e4a87f4c71", + "0x5668cc8944001f3a4e1617d5f83703a85b532d4b", + "0xadfb7128405f0fb411eb0f67f5a95beac11f9326", + "0x754bfabd5d7da9aff2a84eb4e741336f2a4d83d8", + "0x5a352b05acfbe3024ac8f4b07b5bcf1d1278246c", + "0xa95ad2926b8456de952de3ce43f3408b8c73f428", + "0x6178f90d8f3d34aaa36d5acfb2eb6fc57c398219", + "0x56feea4525a1fe9a8ebedfd0429016d1e7cecf03", + "0x80f849a5e7cb6cf07f1146135bc9c6bff3f004f8", + "0x0eaec66fe4d0d77a6c38345591322294c5a5ecb1", + "0x33ee8bfbb7210b7bea3e09e300a16bb46bd0f68c", + "0xa783d1dc0b3697b742fee4d8ddb3eeb5c64a3ea8", + "0xe965062a5e41f943637ab239fc3ad9ceaa48b278", + "0xb6a9ddcfa659668e40c418e4cd5615d2d68c3d05", + "0xaaeaa9aa934b8c5a8c69734974a9e43f652a7fc2", + "0x29903817a4102d5bd4bf0f9e1079a2a1e23d6460", + "0x261e24907f66fea18594bdd144ad81908fec005a", + "0x8888b90fe01be9bc872713d777a3cb8eff77de2f", + "0xa0624a8c050c73d2a763311da5dc229251f27b6b", + "0x83633b047e9d8f5b044da76427219bf92c6c583c", + "0xf5bf6743d0882a1bac982eeb6deb5a5147f95064", + "0x4a11521c9e81f4258851af7cd09fd4598c81f296", + "0x8a317caf119749826a896b4cab95e197dcd8dcd1", + "0x55c7e3ddce330b0779412360d896f7599a29e9b8", + "0xe2f5d180626d29e753b9b1ce6e833be01deb36e2", + "0x7f9a1aa7f5dfaa39ff7fad626094bb893f00dbba", + "0x1dce5ce041796b196a5960ef052cc12cc7e68a9b", + "0x7ef890bb009cce76f8b798b49c2f51e01e81a3ae", + "0x93bbd2151a299e3c34de5bfcae865eeca3b0d1b3", + "0x16e868c6d41a1a9d4f4d48a1961130c1538524e4", + "0x8135fbf4bf6ed57bc543cac22ea37fc7ef418c8e", + "0xb58ccf2814f70330d54a819c4fa6529b34032ee5", + "0xe4a9b34921ce86bdde9cc2c4fd39ea4fa9d02856", + "0xccda3d0b08e66383cf052580cebe3cc3b76ef42c", + "0xf6f9a0cde4e34d9090ea3dee1fb14e348d175ca5", + "0x4af36ce12660d9f34d9656bc11c73c293c4bfcac", + "0x23c14e77e980e8d90851c72678ec5f4255af7874", + "0x74c06d1f055103b97c813373793483cc5518736f", + "0xece1de596bc8efcc2a085639086c79abe5d2b940", + "0xe78838661cc8172dfb2b1385b7c1d7d115217872", + "0x349819a014f429ad6f97e08500f63e0f0198c9e0", + "0xfb32e33947e12af3f6d7b17f05260070dd08117e", + "0x71ed87cd7a8cf470be149c03d5bd2082dd5d6fcd", + "0x01071a87f4a0b0c0fc1cb12423c44117edbb0722", + "0x999bfb511cc9251ec430abcab59c89faf3aa9a14", + "0x22aa8f731afe255998d38d7592540104773803c0", + "0xa06c0746cc6111120d103259fddd5bd99d3f771d", + "0xb34a1afd6174048de7be4afa55b0ece91f5a1171", + "0x06b85de7a876b0d120f2ee79f365acff30ef3c95", + "0x642ec0c700300d10a86ee5c731fc9a5113a5df1b", + "0x6f47219b15c1b077247097e42607ed24cb11cd70", + "0xdcdc5cc2caa1a8f1e8dd2afd4ee7e8b6e745f0e7", + "0x9b9e21131e57a6704728ba7abbc6f579c74116d6", + "0x345e0c333ec6883e1663bd7c899cfca8338866e5", + "0x93076903f4ee211d19080d6d6e8d66ded5fc09f7", + "0xd468844c12f2013264e3dfecf63c9cb64de5ab76", + "0x03683bd743e7382588d17512f4e9a4f42a5090ff", + "0xe191d0e2c122db91383e1145769219b214212219", + "0x01d5c5012310a1591e30f188b166436dc032f99b", + "0xecee19847712b531e2af983ae2cd96d2c66b6c06", + "0xbdfa674c5a9272d145d7d902cdfca7c3366d8838", + "0x1d005547f9b7e8246e4404418a39ccad060e1aac", + "0xd7491e7c3279a3f9408cfb9c2b0a46ba70d894c5", + "0x3e28594022e738b6115e5f1731cefb7c834f7040", + "0x6f978f6ecd316c1073fa985453caf0cb5e25be61", + "0xdb70b4b5d5f7df37352e78d2598b19e2ead48e5d", + "0xd4a5d88d0c47344b272a9ab61d0a2c09156ff06e", + "0xdc8b0642952d1e60d0c4581b464ad76e8558b8a0", + "0x9db8b4596575546284d1257f92f24e805ba8f524", + "0x9219e2778e0fac0e59010157386f9c930cb25ab6", + "0xb1dc09c81f59c47b6d16a0c6589625b38c7b83e9", + "0xb5db6eec5dfb8dfeda824390d242a1c62c2e3401", + "0xd4181f981563b3015747b80411cb0c033d165e75", + "0xb823f84eaf4709c65e71131dd5e8b038568ed18c", + "0x2b44ccd194ca14f1a2dc7717a1ac365def284402", + "0xfc892a102cc97f338d062210fa3635c46bcde1f8", + "0x983df754c79e49a176aca127e7326d9cad929109", + "0x19839b81dee6c256517ab14867cdb39768b33e77", + "0x8c409724e2fc573557af34582a2924b7e33d3014", + "0x276e21c3776d88c1433bc86d41f78007d72baf04", + "0x72eb412c8adb950e91734ccd58bfa1825748138f", + "0xbfc9ce21bee62f488575de8a5a159c1140bfeb56", + "0x2dd9d2c9b44a5a0630601447b9c47993e842e985", + "0x8ffdc7e5c9ee86664b3fff297d8eec98a38a5a18", + "0x3d6f06ef35143eb3ee23fee5fa41c971c2e51a53", + "0xd98b527ccdc0bc4e78569fca995c2722c7650c57", + "0xe212302d78db0a6bd75ee26078afbc63518b9379", + "0x6c4efaca0b4204fe3054c616e7b0c002d86812e3", + "0x8953941b2609bb4fb5abecf571ac0e14f4101989", + "0x72c4756c99b09fc7d9630564306baf120b1fcd28", + "0x46243fbe92c30a3c3b83f162586a063fa29d77a8", + "0x84d0b249e1ae7349cd9af6e2f8ca52710bf6f172", + "0xfa582080d2c22363555385cc57423dfc96f10c90", + "0x9554319807c8a56b5b698eab752d1c8544178f2d", + "0x4ec8556db16a9f080567c48717e4cfcf1d5e9603", + "0x752d8870c8434dcf0096cc86bf0c0f89b7a66462", + "0x7d6434eb9b54854c72e58a1cf9d137b403b5924d", + "0x4fbee457d350c441c18156848c0e0a1b2f9ef0b5", + "0x65ad4ba670955f41faa01ed0c9776ba6c83d5757", + "0x351aa663ffb8f9cb0d974500410d86c185589257", + "0xa028a5f35d168076f22061ead58334665afa1a02", + "0xc701ec900f01e35886e5c98c8d6f8888c23d630b", + "0x20c486a2d90dfb34fe040e73a04c8ea14240cfcb", + "0x30670399d04af0aaceb618d0feae6f7e0973e9d6", + "0xa6676f86359f074c5c87ca3ee2a4287d643b7131", + "0xb548a66c15ecc1e2ca67b58fb7c121699fdc7263", + "0xc3cb3180ba3802201efd8e6684de1609c48c88b3", + "0xbe6f405c8a8ca396839f1a5747959d70775b3ed6", + "0x7384284c0778f08925534da6d4dcc7cf507a0cf8", + "0x4f774b2c1dad9412d9b97505ecb66cd55ca7917d", + "0x6457e7879a96eb0a8f9db4d39a09dc45cd15ed8c", + "0x2ea25b8536ebc9216b809e0fc47fa6649b2583c7", + "0xaf362a533cf8c09e1913037d081d5e4427883a15", + "0x27e73f26e817f1bc934d12fe7fca1e76783e65ad", + "0xabd416cee7bc8eca4bfa3c3bffdee79416a7cb6b", + "0xa354301c24a58b33c7250b08a38b3ae2b064e5f9", + "0x5c3a40dd15b68f47a8b5c6c09aab337ed88be5f0", + "0xd1dc38fa278864a56262e72db2f48522baf3be67", + "0xbbc3c1adb33f8ef0eea85d3b78327d5c6610d428", + "0x7d4254cf2b0719bf73b83f10139936225225cbe3", + "0xa37189eab04eb4eacefd7a12080ac514e316c6fd", + "0xf28372c07d4a4891b12271b13af658f82f7cdd32", + "0x60cb5cabc41e463e14d6f62f1458c1cd8cc45230", + "0xaa322296e70c05eac2e8165152a640ba0eb0ab87", + "0xd750cc3dc9cb50a667f356a643ed371ad7a3cdb8", + "0x1860b88c97627b0ac34cb2514d7ee5159edccd29", + "0xa9b62c48774e5aaddce25323e0d6786bb53b9dc1", + "0xa9368c81d9e2e8fcf159fc2543050b0f268a2461", + "0xe4317bee6a2ce48772186fdefac9da2c0db31ff4", + "0x46ba99539f007fac7fef854ced74c7b4f6d4825a", + "0x39311af484050116e898286541d16095008c6da5", + "0xf67e61367a0283d82aa05ac6fbf35959da0df9af", + "0x1db562aac3177c5430f6878a8d6b7ace10ac6e6d", + "0x61c2146fd339a32ad09f0cd1e4e4632d531edea2", + "0x7cee17f361f55d799cb2ee9de1e6c367913d150d", + "0x93feb4c00ac9de5432daef07bca8c4cc2e322645", + "0x67db7f4f3fd777fbd047dab062c11a51f768bc9a", + "0x8d0188a93e4cf02b51ccad8e503707b8b7580f54", + "0x0cb05498f56b6d3b2714c7610a41c06e0587cbe0", + "0x12a5a5324dcbd3ce343cc3eeb086178d09953f00", + "0xb89570666d45a185dbfffaad0488827c680e3507", + "0xa5b3a059a2d4e69df82f98466f66ded811a679ab", + "0x703cb56d2ec46f278ba0a69a2aa1752833bad247", + "0xc75d0f0f524395e532e4adbecf344324ff43aaf5", + "0x25d4a1929a34e9b26649e74ce96e7acac44645d3", + "0x3fa6ccf679125b4ce540d8faa1433ecba8e50197", + "0x5fdca3a447538b2ffc9fa53735d2dbd04e99f910", + "0xe71273af9e573d68323adf96cccb90a47c68d3c7", + "0x8dbd3d7d13fb2f542c7d2c5f208abf5a8b9c08bd", + "0x123a10f7b603f4616ade9757607d3ec772013914", + "0xaf900c14b79b799c8ea86ed6948e12423eb6701a", + "0x9b4bfaad905e1c51f13bc09a2bf9908906ec340a", + "0x0870ee957617f1ae55bc2a1c92ed2a98348b2ab5", + "0x2ed7cc0236ba832d7dfb190e9bced27de1a034f2", + "0xed9490eb47478b11e0c6352446fa70542a093ef5", + "0xcb4bab4cf1a15f09df565b3fb377c88170faf007", + "0x9dd711b0cb4430f429231e5cb9940dbd1952a36f", + "0xad9156bc5f3f53084e7ef69ae632d5dd958bf23d", + "0x82d09e0f426c8bf74e370648abdc1a6ee09a4d72", + "0xf53109bb46b37d030b8cd7dbb09972d078553647", + "0xe8c3238a5f2712733fdbd9cb5d69d329f9469257", + "0x38038596cc3c0b0ee781f6578a62b13c9bb5246c", + "0x5d364fb160a1675461637c9d4f217165503c6a59", + "0x99344b575b83360410a0e4dce75189edecacc824", + "0x64676dda8319522d3cbde8988d1bafb405fa2c77", + "0x92ee18538c392361f1923794aa62bd3a6550c8b1", + "0x5f38f15a80880652fffa3f17fa3191b302490e13", + "0xd26a0a35321c6793e47eb602f1676c915caf111c", + "0x2b18233fb4306a705471a7271c018ce0ff7dd754", + "0x9d0c1283736e90a086c30dd7d5954fabf5cd7e24", + "0x28ac0de8846615d147d276bf6c98b12922373d6e", + "0x2020d25530cf90f48f176da7cd3d3c1cd282d400", + "0x0414d0a3b55042ed7de07fd503a0f1a935aae45e", + "0xf88d367dcfeda5c91a1b8c012dd92603b8d58467", + "0xd3bf53bd8c9aeead2692a6a649aa1eb393dd90f1", + "0x55abdcab172aab430d9112b356ccb6be952359d0", + "0x39f6a11648e7def40f4960cd69b61a796d9812ac", + "0xee213190e742a7c88e414304a23825543704197a", + "0x5c83e5927c4e925d013283b4809b0d4a7bbd3f99", + "0xe815443c879aab2f4b6aacaef34464d719351548", + "0x72656cdf1c5bc08f7d95919e1b31ca8a88de62c6", + "0x1a89a049ce15e18f97fee3aaed6b3a0acb2cbc53", + "0xd57181dc0fbfa302166f36bdcb76dc90e339157d", + "0x635139d0914af98d41fefb6e2d69c18a3655a038", + "0xfe2a97bcc965c9dd0514e48bf8e299a8a029a139", + "0x4be70f47a39eac265a5ccb6080c01b0ba82434c7", + "0xd8b629e53c417773826041a0cd75db8168aa02a5", + "0x84714dc99e6a2c51916f9151b53123b82a594cf9", + "0x6451e5d5d6b1e1bda1eef49ebd6301a94175836e", + "0x1ad185a21a61f786b46388dfd1e4769d6bfcec08", + "0xa2d36f11e2225d1b89146f443350e825f15b8b68", + "0xf8e6ea3593c17738151ec0ed760dc160fe765b95", + "0xedbf72f88e72133b10cddded385d2b0f7b27f588", + "0x3c40b7180c5168f584ba14d890c1e1f865f9ea1e", + "0x8c9897c494deaa0e0b642f33770072ef5bcbf73d", + "0xe66953f1be87c972e0116f2795b561df9e6fbeff", + "0x6917d0d4404722137e6e1e29f153f088a925bd50", + "0xa4a2136ea670959ec2d5d150926f9587c82d59eb", + "0x6aa6e5504ff2e56d3705bdc0c5e02c7ee8baaaa8", + "0xda44c059f0aacbcd611b0389e49534d849d329c7", + "0x2827e053fc0ccd353b100e5420e59ab7c23919f3", + "0xd03e030240a11248193bf59cc871035ce8805d73", + "0x05f4ccfe7747aa083954f54c6c67e93882c6428c", + "0x2b1bbf7a8f80e0a51edb6c4b127a67c22c010376", + "0xe7a0bc70d0c41a8d2cfbdcabdea6abb3a2bedf05", + "0xe29999070368edebcb170647d6bfde11b32767a8", + "0x0a8711c648b8011ec6eeba15c79f507d86bc68b0", + "0x47e1186b7d75037a3a9438124a3dcb777fe30a6c", + "0xc7aaeb48b609d05df491e9e4959c67892dc8a134", + "0xc9619e2af362b7c4a163c332dd92619892bb9202", + "0x2b185c762f6fb49a07116ec06b238b58fe2bec53", + "0x1dec5f50cb1467f505bb3ddfd408805114406b10", + "0x8a3b527284c95e62b455693d4e62832f71c6bf29", + "0x395e9113023e472aeece506dbdae5d7d39eed353", + "0x32067d7d163936926d53e67c3796f87b87dfde11", + "0x54c844fe577bb1e69ff10f4c5cdd765b22e743c8", + "0xdefee2a491e2ef3b6a5047d42b76c94977cdac4c", + "0x3d9dd495d80e6f8d19dd6b06c7c9bdbb51db932d", + "0x1de4b95e50d38cceabb9d613f59eacf092efde47", + "0x9cb5f448cabaa86b1b6e7065c903eddc0dbe101c", + "0x0aac6fe840d4da1261f275562ae33d67ba6869ee", + "0xcf3d9fd1633b81e4a550df0e027e8c45aad36a4d", + "0x9730299b10a30bdbaf81815c99b4657c685314ab", + "0xb45808de1cfd621d6cdf7225ee50d8aba3c4d631", + "0x8a5708bf631ad2a7ffbfcbde3a4605ac2ca12454", + "0x791ddb04d6f45b8ce73ec30f84d294fedc1b1348", + "0x2604bf8fa6922d67db3ec6761bbaf66c98c21ebd", + "0x8dff636efb8f6889af1d0d588cd4a05994d478ee", + "0x56d5550e1cc2dc4ca61b53621b70acebef6b51d0", + "0xffe885e77fd52cc2821ad2b7eef0051c53f4930e", + "0x9aa1cc62684462234fa653ca657f7a34cdc1b864", + "0x16aad8a37974363d7b8ae54829818f8b8009e501", + "0x7a69fdd2c6143831f1f7f9679037b323f8e7fe3b", + "0x40f4d9161441e8c11ad94aa9e5083e4fda0d1edf", + "0x3969a0d3a14c875b10bc15bcce6785ac2106e714", + "0x85fae604bbe3c5d5b441d39ae95e4708fab902f0", + "0xac78fd3ea4e3dc760b87c3b6d9f24f3caece5456", + "0x1f49b6b864007067e8feac72f4ae655a26efa208", + "0x4cee70f0e2347e986a04730561f8bfb315df9ddf", + "0x916925a77dff36b03627df2e3329864acf94396e", + "0xdb69c856f1b833177268307693144c68ed3e6164", + "0xd06ad843d7b450e10bd77b2fe0a1d0e3223cf6d7", + "0x273cc9074a4d2be617a00f51d3493ee988e44014", + "0x84346a71dc3e3990e17b12cbb69f660fa5eb9f45", + "0x0e9490ba19019adf09b2885754f4eeb663184daf", + "0x0c08d8247a728aa496475c4dfae092765bb57ccf", + "0xe9c04ae6877d6d5e74b2e1cf9caf412ba0e83130", + "0xd3326ae6821b19be3457f6d9b695f15c9065575e", + "0x3e06e3d058f480c3dca13d6dcce1c1724cd28745", + "0xe4770cc516422b225fcb61c16255de54ebce615b", + "0xd2b2d4145f67996b9951588dfabac22710568768", + "0x8ea9078a44498c58952b4c09de7e7d75e97bc27c", + "0xda82fb65913d2c0651a0501b93e5aa5c8242d87d", + "0xd86f2699fee848823b85a4203dbbad5745af1a56", + "0x682a31919987ed2521c76c5c82e231efbe255b11", + "0xfb607892134618a6ef1ebaee21e0109f93bd771c", + "0xfcee7c01cd9e25339236da143eedb20c3fad2278", + "0x15054eea7715ceec8d3e51f7f1396d6e31a8d1af", + "0x09700d103f4c4a13dba21275a422d93f8271193f", + "0x3e4a46a72cd7f9d66837b8b6baeaac4b9ab2b8a5", + "0xc185c66aa18bcd56de54d47ea312bd76021392e9", + "0x89425a801dbbacd4562638161198b6d3b85a314c", + "0x26868ef70a0032d9ad208ca4ab4ad44c4c917ed9", + "0xcf07367b47f8bb7193aa2ef4166c7c8895d5406c", + "0x05904248dabd5e74654d8e187c23091950480d34", + "0xeeb25c0da926047d612483d4d53c6f1040d8f95c", + "0x054e195fb76e5beadb8d11b835714f51b19a732e", + "0x06fb5fe84410c0c2dd7c0b1b1103d9ec36174d1e", + "0x2deb3e94b4088af1e227e54b67d6a29456935d44", + "0x702169815fa8aa10dac1173002d60b03f91b5e30", + "0xe9d5dbb2904ce92dbc63db67e677760c7ef62a01", + "0xdf3d6c561b85ac53a106778071cbb35f5a94e866", + "0xd2658af2501f0f33c95c82b32e5d11d1df633242", + "0x575ee3cd35316ce4396f451bd1ae2fa9332c0c07", + "0xa14ed054c0e225d615f55fca605cc013c75dc985", + "0x908e8e8084d660f8f9054aa8ad1b31380d04b08f", + "0x4d7839f543eb6fd24bb212ed2fa8d64b73c7e059", + "0xf93703f0e94744c906f92e58a81363e0e993fa6b", + "0xb85c58314e4cfbe364ea187b94fdf924128d3ed9", + "0x7d13d988999adbd23807f36db19a047e5519ad19", + "0xb9bc4504281f8488eea5559a65b462689699d10f", + "0x2338fcd3002b85d677b753eab7b62d1d5796a87a", + "0xe2b051d9f97aecf1f6d5002b91ab3c4e299c1289", + "0x2438510636fb9d75146d6b12211803de2d66142f", + "0xadfe74a7afc47ce529e7da40ffcbc7d22412fb80", + "0x592e8dbaf2e7875419b4259594722239bb29e0bb", + "0xe25b601e2b7d2bce0ab19b587ab2a619e5043a7e", + "0x780581648bad49a89774eb92d5b954ccc49253f7", + "0x8f40496973fc78d389571812c0d43620369102c6", + "0xa59c52b97c2cdcbbe9d5fcb3240233e3868314c1", + "0x8491ff3ce336616dab451c720de84ae386f3900c", + "0xd9864004c7c2057c7d5ecd92e4538f4ef291eeb9", + "0x27f11dfd09b6f5617d5a43a13281e321ac956e4d", + "0x7dc877aa625e7fb13a9822e9e45603d9cba32100", + "0x471a02528929c9869e86501a6770e8f8ef77ec63", + "0xbaec199a26ce55bf7e6478abbcd7ba3340280ab9", + "0xeeef2aa134abefc7406c50ccf9cf562740c6ce15", + "0x6f4465db0339a565c6f088d39ee5aefbd8292f11", + "0xd009c361196fc8993ce2bd5adefc0d7f073d467e", + "0x449467fe533213ee557354c62bafa7a44afc0cfb", + "0x9fa78070e66c11a2cdc11753654a8c7b5709d96c", + "0xa2b007a7d2e4b0b8bf84a9ceec7cad01ce62391d", + "0x6f2be2b9938b18a141dc6c6f696c16cc6ab0e9e6", + "0x24e219ebf46093dc5c5a748cb20b8c83e86bf09d", + "0x5ebffcdfc5ef2839690eb80841b4b86f0dae16b2", + "0x3560580bbe7411a963b859f5017320790901a4fb", + "0x68510f0053b84ab47ea33740fbff3f15e9f72f1f", + "0x789e0f7ca4d5d618927702bfd0d9026b2f5bccc2", + "0xaf329a2986d7f78991ab5aedad6c7c3a2bc760a5", + "0x78b401d521fdfcedbdb62a57bafa29ddf62e7de8", + "0xd6b75eaa9ea208fbfc774f2c6ccbd49e422eeb88", + "0xc8bb0237f5f978113ad2400d17d4daae52d8fec7", + "0xadc031616771ecb503c65e607c13dde152d459df", + "0x0bfe2fc6f358088b6ab19946e62d5cd44abd542f", + "0xf680540198f15cd7a052c23a855b96379081c50d", + "0x4b2cb9162aaec62863ceca53b1324630787fda13", + "0xd73d9f40a65c512df139f9fee7d6d5554661d80d", + "0x70697c81f433ea608d2aabcca3657e09c2158ddc", + "0x540651814e11058af8967c3c98ea9a06e0130f90", + "0x873996466554a5aeff896ebb8c2b5827bf96fb9d", + "0xaace084fa283632ad4471b9e2c84d2f4d376d0ae", + "0xa615bf54172a072e0e9371beab0e1955e1e6d87a", + "0x0f2bbd85df7c82977cc19d9a12f9c234c61475e2", + "0xca553015ed31b03441831b91cc89a368a44bbe7a", + "0x8c0c7b01789bc7549947d7c195c62f091b018b4f", + "0xd0745a6a61e9e1939e2c350cde89cda2d4b2fd42", + "0x8b21744b161685a01e9cd1364a067c87ac7e0d3a", + "0x50e7e5e836820fcd81280a74975c2ac5241fee9c", + "0xbbe846cc3dbf30233d0e73def42eb3cd1620fc8b", + "0x7dda24402e119fe48b373a73d072c1df25546428", + "0x3ac99a21e8113d82bd16e61bda753b0ca2776295", + "0x4f942151474fbc3e2f05c078af594f5046756177", + "0x82d587a505791b576e54567f8ff07784a2f89dbb", + "0x3d6184223dd0d5239947793746faec00b63ae990", + "0xe65a09d2b66176d9906d35b49dd32c6b2948f9ec", + "0xa0e569d64ff6338a833706095a494aa1f3f2c04a", + "0x5fbc9aa6cfb5dfcd7744e1defb22099ef73b5866", + "0x5d0fd5d2fb1fde3072240dde7474b30f15e9d1ee", + "0x2d65fbd707d2f03d95fe83c5f6d4e1ded89b17b9", + "0xe431610b57aa6d8b4d959d86ae8410ae2a970b14", + "0x5dcc77cd65e8973deab96ca68cd46ca7ae1f2eb9", + "0x9cad1d806d0716ef04833282a7d6212bb9d98e9b", + "0xa4af8ab8d4b63481a9994e6ac694a4abf0bd42ba", + "0x0066aefdddd2d5c8a1de16b16e2d55e74bdc685e", + "0x0630717c9c6baeabd2b0852e09df08febaccd227", + "0xbe1c5c1f07f029b715da0822612db2d8bd25407a", + "0x7c7932f137d00fe22748e22eda2c8f6ee8622c6f", + "0xf20815951969dd06fba0fd50e059dad4f9427111", + "0x69d4733e29623554855c403766129a6e22971b30", + "0xb65f961f72ea591d269c62073fcf991b8e2448eb", + "0xfbeab8e5522f2c64d4086edec2ba5504699070c1", + "0x3547ecb573a48dda628eea2ebde9342ff1d91e06", + "0x71a69285ebc6c13b9d4cde13351451eb84c90710", + "0xa5a5139489c3729e0dbdceb6ccd580aad931b5ed", + "0xe0b78c22ed5a718cdbac0688aaab2112ffcfcafc", + "0xd8b38d74f7e13232be92084f4a8b75384f3edb13", + "0x66c0d9152209b51977047b9dc3b0b5bf2339b67c", + "0x0a9c647144f471bf16636b4e55558492d2cbe123", + "0x1283b2a118d49f690f9b159c3896e9fd1748c7a5", + "0x086baac117d563270ec8ecbd465d6efb10f9f9f4", + "0x443c4ceffebbd742daac8b14ac90eeba6520fe6f", + "0xfaa090def3c7490ae2cc74a99795421db76b282d", + "0x2a845bc52d0fbdffab5641e58e02c80b35f6d50c", + "0x0232851731512636e423cd9c6318c3eee224c9ba", + "0x381e0bd1fe2e90707fa0e72880d8756f73e11084", + "0x7bfee91193d9df2ac0bfe90191d40f23c773c060", + "0x9c423adaf37786cc5e9d43fd5ffcd953c4462174", + "0xedae7ecaddbf0a7d3ed2d02f13d35be790865d60", + "0x7805f833c7132c3547380c90257936e051a26d02", + "0x4d141a1a597e3019354a414ed7cbf28fd9bd05a7", + "0xd58ccafc31ce8e2e503f5dfc32ff54172bde7e78", + "0xfc512280af88a7eded223eca758c8c50967f2e22", + "0x0d2e023945d75520f0e24ba725d242f70d774a2a", + "0x15c749334e87fec89e8792abe7b8fb9692d8132b", + "0xb00a0de1f255c5b2870f8c657f1a8584aa101ec2", + "0xe1b85b56b275345c8b4f15b9306868515e5a21bb", + "0x0c358ac0610eee1298ad312a7b87e04e7e5f7fc0", + "0x515debda7fe8ce1f3d7e04b9f95e2e8f3ac90b89", + "0xb0c58949d4426b657d7ace5f00da17f85b5b2141", + "0x31ba62e6304ec49e837a38bc12410f6e9bf604c4", + "0x1e43b0b37d86f24eec2f498b5f254ec8bc8d0cd6", + "0x7e5cd538c2eef6d4158bd0df705698f7ecc12314", + "0x416a097528814075db98decd6fe60fe8c6b358a5", + "0x8ff83bbd6577963de722e9fdaef226121a9b316e", + "0xe87bfff3c69f58c8bf30f1b29bf11e60605780e1", + "0x3f03409918d8a54feacf3adc09a7af8e62a41400", + "0x5ce5c394a0f8a4be282c8659e405524a089a9843", + "0x7eb0f53dae47bf574ceee163aa527ebcda91b4a6", + "0x2e13b59483ec1f03171a3ad27c6d772841629b15", + "0x2e18606c4e8825f6ef2e74e9e0fd6f8b681024c1", + "0x0b154fbd9ecbfd1ddafd117ccdfaaa3bc5fa6ee2", + "0x8d543f1a3c4c38075499083c2e9a6de0110c53ab", + "0x3e790b73f6cc91db295115081cf7f5a8c77b609a", + "0x1cd17c0529a8627851947b1722fc02d04b0fe8bc", + "0xf0724a3b204e82f0c02dea5376233cc6116eb877", + "0x5dcca9440feb8931c3fe95325cc3ce9a76160d38", + "0x85270caa309690d27a92531a5d898cb9be1c2379", + "0x5eaf2a35f3bba9828eaaa8ea1d8e4b6efed42488", + "0x390f7aad6784b292dc2f5c261b968a6576e32d66", + "0x69803354db1b6aa6ab15d55c202ebf0e2e0f0279", + "0x515b99a0cd94597ca2b4b1c48965978e2b3a4fe7", + "0xd0e7b818b7f18798218cdf9c0ac4552ec37427e9", + "0xab3564457c5a9e2a9a37c8a6c772b88f3acbdce1", + "0x2cbb9d7f856061cf986e144ea8562c08b850d219", + "0x9630782f65fe965e4fbbd1b6dda2a1d5db4b6e6c", + "0x60230ed06b60257ae9c4e1555088fcf61437c71f", + "0xe615973d67df55127d5cdb1b52c10478b11d03d0", + "0x1b787b7f57304c26ff4651e7d32c1f60b8e8dc21", + "0x8e0b293c18169046e1e2215e9478cb1d64961356", + "0x0fa8f5a53f53732fe86fc42a7489dc470247bf86", + "0x3c04d0ca4195a8cb49b2394156c2148367eb3208", + "0x19f0438ed340f0800a39ce6357ae0ec9b0c84686", + "0x80b5cb6f3eac113b845f7103c8bda6afd59f1b01", + "0xc51819e67a712ee0229bb1ff1a00aa72e5540b1f", + "0xd52c4d08f461991a02309832b983d1d2774e93e7", + "0x6113d2339741a7d2c733294b40e21ff753811c34", + "0xc4ee71e16f153884baba436f4d7eb128edb6fc25", + "0x665487c71e9b5bb1de778763da6edea940642abe", + "0xb9fb1c87d81944263633f981b3e13222afc0a2ca", + "0x583429a5e9054db987b958ae90b4b6e5852403f4", + "0xf65dbb55aabef162f12ece1a95f4515511f0d6b3", + "0x9b799ab8b30a3420ef2870b76d42ad4e4236bcc1", + "0x601d38b35db5db5823451eaafe7e2344bd7196c8", + "0xeb9e3fbf81b3d3ac8b60fec64636cde5554822ad", + "0x30c51d64351571b8bc661614e5c1c29591942890", + "0xcad4b9939980992a3bab63f7a9a5fbef10be5993", + "0x0290db763c9fb316e8af19a317907459bca523dd", + "0xf5eafce404570cfaca04350524a808db262d4bcf", + "0x322c86249200217c3678d209646aa07984ed42a0", + "0x23dcfe87c0920951357f84b9253d2588a47e2d3f", + "0xf687788d24e143edeeccb0db2e301f183fc5de1b", + "0xbe260088214693f17626ac49b2151d2ca467bf29", + "0xc4e98ceedf45bb008c9e2ef4190899de8c817172", + "0x564828ac250efffe3168b8bb6784a952edd4ae85", + "0xea107127262f337567eec0e8a858e9434f67bc50", + "0x41aac8fd5926dcec3cf5e0ea0f7f0e54aaa332c7", + "0xe142ebbe8b559ace67be821b11a8f654c76d825f", + "0x54cf35e8ed41f9efa77939f2290f2853ac218136", + "0x0d796374c2cf82bfd01a4d1c31a1a3af6803d8fb", + "0xb0c361f6dd99ccb7b756f560e09c76da6610d8cb", + "0x37431e079de17c686a57f6248901bde8c7ce85dc", + "0x574026dba38148b87df2cd1960c2d4d351a0ad0f", + "0xedc495da640e34f9e79c411d1e522fc3b6b76685", + "0x4caac1bf243d3c634ef8ca19dd520f796dbab35b", + "0x04fb30f655700c274ae98a2590f69a3c1299c96c", + "0xcf5e4ca333e6d8269ef9deb4add3b3f27b98aa94", + "0xc8b7dbe4989a3b4c940bc1d666f00bcaec577289", + "0xb4f8216fdf7e2a5069a02f67931fb52d66ab89ee", + "0x516cbe3a0a328a589465d08fc6a8ae124daefa97", + "0x721a0dbc366a52e684daae0341163df46f158ab1", + "0x557f73fb4f179dc253444d87f0d905972a45bbb3", + "0xdb0132c875ea7a00c4a6283da592ae6500205396", + "0xbb5547f8b2cc4ff8d22fc5da655b97e8281abe8b", + "0xc32340dde17b056c0771d23051d9b2c82a7b74d9", + "0xed294acb8364ba3b291d72fd2b4957d13e131d4b", + "0x8995dc6aaa25141b42db1510b4a5106a31ee7f0c", + "0x3a023243b252a827c52834bb2a6ceee3a6cd5812", + "0x7f7ce69e231bbb1f80414b08f06178c25cce7c3e", + "0x73028a505ffbd37213a044b6fa4ca5237210c8bd", + "0x3f3cffa52a63d0eb3f1b0abc552b59366d002f67", + "0x340db75ef624400ccad45659880f9ba10450b9ec", + "0x6a038e38dde450f5752d2d9aa543103bcfc7cb0c", + "0x61f8ed26dde9284e875e8f5158571ea56fd0f7fc", + "0x87afccdfb21e88a3df5e518b9a08dbe620fe93dd", + "0xc36027a93465ec4c43d9a466a2cbf4ae0e79517f", + "0xf126f633ce70569c17283f23f88de5d625e1a01d", + "0x594ae211f2a2fa086f0c3edd2a16ee7ee4b99ed5", + "0xd40085836348cfb20f45ba86e64f2258c396aa99", + "0x6be6c401398f5578e5f3c494008c44db7dfdd29e", + "0x359245dba08cf10634405fecee1ba0de8427d14b", + "0xc7620a25dd06b78f56208eb0894e690d23059f2f", + "0x6c2693f5a936f37ed03cfa8465bf2d8beff19a0f", + "0xfacec1c32ae56097866a6c1dda1124f2c6844f40", + "0x8aee171eda5a4c0a76b6e9faaa8d08b81c0a34d1", + "0xa51da4d3d25c7068a3d05e23cc1f97480225dad5", + "0x4438685bee7629c74a0b16e0bded3c200311b3c0", + "0x9500148707d1dba34957f63a18bbd8a4be8cf418", + "0x6ec9e52a626ca7b4026fae24e2023be749e0e8ee", + "0x95910c0977298c62c2955212fb23cb7879664911", + "0xbe989cf1d69ba976a34aba2b58413b9316c14d07", + "0x76b32f589904e78af65b773561133446c77bb70d", + "0xc5c06479b58e56898a3f70129b941bc166a1f004", + "0xd61b866a73c831d536bc8afa4d48100d580737e8", + "0xe4852a0ec8f682acedb73291783c8c32219eb696", + "0x32d0da6d8139570a2063037e11d0ff3f11435967", + "0xc6f6dcbdf1ae9741c720b61d6195c5641ea91a1a", + "0x84e54a473bd561364220269e38b300213c7df75e", + "0xb62b22ede0502e3af8c768484ac38af3ff3f2e86", + "0xa93a0a420b25667b741652fca8ea93af25136129", + "0x5ea0feb5c98358c68b350f06abae19dc70621244", + "0x94e43b47ae66ee504c9956929b8b70bb7dae0e92", + "0xed072b987b1f4348403d2c9fcdfab53defd0032a", + "0xca02729cebe96da8912a9cab33245759fa4f992f", + "0x06841b8b716d9253846f98c8ff63ef283bff4ae7", + "0x142a3161928404a83d8e2a35807523798865e4dc", + "0xf4243e00e8d5f2a60cbbf675141ae51dd97f7b0d", + "0x07eb12e7463ba546821e3c17a8bc6d087119a1db", + "0xad965a7a3d0c0c820bf91ad33cdee59e83cb971e", + "0x47426f6c3bd0416c916208393d9b830d92f79e05", + "0x4bd78324ba5a88c8b5ec40c44b9ac33edf4bc4e8", + "0x705b107a92eaa0270550f2e69922785b1707473b", + "0xafbff245ef56c9321ee92fb933be2b8b31bdb007", + "0xcb43fb65b1700ba710d37e8a310299a962c6a0c8", + "0x37b59a5f0dd525969c97c1fb5e7a1eb95cf6e27d", + "0xd530fe21d2f0f3c6e3d060219063e98baa58f856", + "0x82340b128d6abf1ca93ac360b39ab2468c99d2b2", + "0x3297f1e44d80fdc8a79abfadac238a4e08bd9a3a", + "0xd57ff510f6f1c0650a22c3cbd24714458a2c1342", + "0xb88991984da5a2d2b31866ec4321fff1af732af8", + "0x3f4de9e1a8ed14a1d8e90fe6af7094d506958ae0", + "0xb18c38d991cc55fafe13180f64fab270a1ede29e", + "0xb15e8f4d0e9ebb6b83bb6152f05a4b9a4ff991cf", + "0x7e0443d269e3f22e6e7993a4455ee01e775570af", + "0x1931270c334bae3856ac6cde70d8354cee7576d2", + "0x0bee899e3e912cc73ede917d46157b4964b202e3", + "0x6201001db93a822a237bda719d00f512e51fffa7", + "0xed2a2928b1c0bf9b53e1fb53abb6b5e281084312", + "0x5864eadd94058d715535704d9ce2dd479ca62bf1", + "0xfed1b842a85b9f8402f716b24c2fb28a5ba42ebc", + "0x30e25eaa01f60acf52470ccfc57cad3e245b43c9", + "0x4642154eaef68de01dd1f37e6598e01ee9b11976", + "0x438bf726050068cfab69375efe127a2940e069c5", + "0x0773e0d35c066482b96234a59df02b220c75d795", + "0x8a527aa6ca239656f866b4667bf1f19239a76c17", + "0xaec88b4e9bd0b2e6b06f58a9d521419fc2a370dc", + "0xbb54128b8f1019923b478e9dc97cdef190764163", + "0x2243170b8362c8d8c4cd388a6ce0de1be9df4fe1", + "0xe32255f48210d17dfa1d3c58dd9994c2b632d5ba", + "0xf8d3f844987ae5fa152212982278a606f74468d4", + "0xa37b795931a8682a86ee77903c61c0a803b22bd1", + "0x5e53dae42323fa9da21ee5d473663de94385b00e", + "0x4d31cac70e168a1dcca81388048fea6e634cbdf2", + "0x96902483fb4bc8600193ca0e861fcb08e42a2d02", + "0x5a3fb7261cebc3caed036febcb246f3365bad5fb", + "0xf0453559047c4b8bfab8bf4cd5fed1a3d4378302", + "0xd64fc04dcc51dd4aac180b9f16dcff6345eb0226", + "0xb0b9e3ca5bbe205f408c320c6e9d08fe91484ffd", + "0x5da68351bd082abda73e42ac981db51d9364fe69", + "0x7af0a086bf7219788fe6a66757b3a92656d6981f", + "0x77bbcffb0042a4c563c503818e278d2c6a776983", + "0x43e64e0289c4692fbf550af14fc0fd1c5b962335", + "0x7e9933a12dc6ae92fe65a5258b93cc0dbb03ea5d", + "0x9cd3889c121a990ee5f93c0cae2def1befdfe9f9", + "0x72f3d8eebdfe67f54249ce825ab4fee90b371229", + "0x07900e50fee89abf81530a57406a5d89724ec0b2", + "0x0431fbf5ecd0336731a540607eaece9e85a82e61", + "0x0a016ebc3fb174d844cae5a7e9b16bb0254299f7", + "0x79327ce26e5fba1a015d3eb76e9584e754a0769d", + "0x4ce3d511712782b0644d0265af601f91174a8ef4", + "0xa08210a8585eb4f8ee2aed44e65629fb8ccd0137", + "0x807e765649c7fde199652869fe81925674e18a81", + "0xb34037e238446b59feb84a12ce6e8cabd853d98e", + "0xe22e90f9c439b8ea43225d2b64a807aa638005a6", + "0x682a4c5869fdf582ac7c3d4806a16c440309a78e", + "0x968e068cf975e31ebeccf395fd8620554c45180f", + "0xeeae38df0c389c626212591303b8cc841f0df450", + "0x31e1c53f8e2dc689ac7199ee6313e3f17e5fba69", + "0x4350d53a388cd7b5fad6e814e4a493757580e5e9", + "0x5e44fa5c42c9a654f741e42902a887644d2923b2", + "0xff01205a60052b2fef9c012c81c0cb6cec6b7c7d", + "0x3dce65531708e3b885a4aecdf0bfcac5cc45eac7", + "0xd34232fc9ffec15002f568372f83e08735b9be88", + "0x441d2e74baeaf29acc20c8fb06e8cbb7444aa446", + "0x2e1f56853fc531b821886e05428aeae21bfe93b1", + "0xa5becf4579ba8b3b2e42d4b6cbb84b32996cb224", + "0xd59d75e3220871af8fc7bf822e726e549cfd2897", + "0xfae51170188eb3dd86889dff1a01c6f3f405cd09", + "0xd74ea4ebd25d595fbdcb1b6589e11ae6c8243c49", + "0xe27c1a4dafe1b7be4b0d163cdae20e9df5b83543", + "0x4a533a2ec1526598347a821f1814d4e25dbb3c92", + "0xbf6e93fb31a9b2f6818004995d89eee73a4cbeac", + "0xdeaf4d5775d37f582ae1a925cb91b312c73c3791", + "0x7182ce67006f440217e496931ed395dfb10143c5", + "0x44539674f7a4fca34b08578761463389bb8a61f6", + "0xd82fe94826e3b1f3bf52a658d884e700b3ee10eb", + "0xfb05731147b028635c66ad27b526b2e5dd61b588", + "0xadd0da7246ed7c9112b0be037d486b4b05229b97", + "0x8c06fbbc24dc482746ccc77bca94aa2221182c71", + "0xb7f721dbc5d524ea7f3f6835a4c03e59311882f5", + "0x05cc46adac73b93eb73194b8ed1445b7ba13cfc6", + "0x372a9b5c9c742d1ededfb15f56731a3c4d8a1fa2", + "0x427f6d0717a011296594259af102b53d307455a9", + "0x6019b6a585bd06c70914c7bb5f5d038953b100e1", + "0x62bc0cecb4e1ecf4ae07d20ced38d256bbec0ddd", + "0xc518a7fbb527d782c150cafd7b981bed4c328465", + "0xf6f34170bbe4aa1649c0cf51550109fba86bcb19", + "0x4bb12cc382e36b4b6faf7bdca7708969aed258ef", + "0x7e3b6f966f3666f77813db84dd352173749d24d8", + "0xffe991b76c4f1ce8396795283a24ae1719bd7709", + "0x8aeaae722f0984cfc49f7c4f054bb595c8f3d10c", + "0x9b705b682a63d3eeadfe87bf4e65348658a4e23a", + "0x4621afe6a54766a734a091b414b11e04d45a3028", + "0x8f8110465efb41f4082e582f8c7a7034a564dad0", + "0x78775b983f4202157119e1aa80e884c0303f073a", + "0x3abbbcada7be4ee11555efde41a18c5a00f5d7c9", + "0x3a9847b0a5ce4a1bf22b1d7e8a0e3a12a2db4053", + "0xb75ce906a270f7680faf1a2f6d70f4f28061b87a", + "0x6c4fba302d1d16b76ce8f7c29012a1e781dd8305", + "0xbdba527f3260b1f47ebaddb318ff713d7b9a2f57", + "0x579647c09d7c08a6a150d58eccdf9ba72959ba8a", + "0xf11e6eec524f55998b46e5c2f34e5916723d7578", + "0x702b2f97c71bd2c9bba010d57005b2ccfe3ee2bf", + "0x2ce673f742ff980abfebc3610977573aecedfef1", + "0x23c2ade7f908f90f7ee0174ca260c2022a6a8057", + "0x32499fbbd06dc26ec674da2c842be57abc3d6466", + "0x02167da070b72bc0e1fccac0ed5aa512d25afa6f", + "0xe2e90185eb8546823dff8fcfe4493e2450ea90c0", + "0x53b1d23ff3553224d07cf060b5c208158ed845dc", + "0xb63e0ae7a6af98d1c5126eed8fc3910704703e66", + "0xc4c441f5bc9c2cb62245613829f37e96a3ae669c", + "0xe429702ee0019ff2d42108226c94d531f0c6084c", + "0x9c8cebb743c6859a2f69f3b98bf259f2d1a72dee", + "0xaf8710c7ae13e92261c8c28735ab81f81498af0c", + "0xd64eb662ec2d435fb119cd5c02a3d3f15a3fb281", + "0x27432fe097d19cda7027cccef5a4f4de8bb41454", + "0xf2f71fcf989e1aca2c7703ff3b6091c8cd4f1a6c", + "0x53d70020fc7ad095d825d0dc39b303daf9fc9e6b", + "0xf58b9fd998af70e84cacfffec292193b27b221a0", + "0xba3956b225e36ce07a409c149ec072239f568a92", + "0xbbf15c96f06f8a8ebaffa496011a040c55760d59", + "0x41354cf8a5092ad0d28488ba3a6bf653073092bb", + "0xa2dadcbf3300e10dd096ddb26758bae5cd0a568b", + "0x8d0ef60b4d6e4f24a131ca04722d1be72d96fdc8", + "0xe55ad55646897569b423dbe8be1ddc6fdae94a23", + "0x2636fbefd004c36159b42f894a4ec57f691f0fc2", + "0x074d9a9d3a75db2e318d63fceee64d9ce5afc2b5", + "0xa8a2775d13fd055d5747ed11fc9b9a9cb5f8f631", + "0xe762051365121f4361bc0cacec7cb48c1a58b288", + "0x825d7c5d5cc761b420b153f7200081bc3caf07e9", + "0xea3961eaeb87a30b38cdac3783970dc13d0e94b2", + "0x92ccc58b27e050683ecfa7796fe1af6653ce1445", + "0x4e15ac6d5f8a6b5c5a84436955c9f38f4195bf61", + "0xffb3468b6861ba7044fcf61a2d976028204efc49", + "0x2585efaf12db46e7c60b334e60d3e45af6966c08", + "0xe9afd79878245f4b6da9d2caa07c3b641352d945", + "0x8413e036fa63007237e5607168e4e1db43c062e2", + "0x995911e2556538ef3374219e668419ad35eef666", + "0xaa99157856d8785c3a0bab85f070766554a1d882", + "0x79e7dacb6ebb4382bd9f3af474127317e6b961cb", + "0x085fe8e11e568f4866a36bbed79ee82a84caf805", + "0x2ae909a8c5ed802159230b51f8a1d0df008fa38d", + "0x5d199e6e185d644446a56765121033b97f604180", + "0x774c9b43df581818e8a5dca5ad0107f4cd73ab9b", + "0xd508ecdfc45b432a41b2e6d2d765fa7b07baaec0", + "0x483c3b08fc31d1b66cb215aab2fca7ebd8241c21", + "0xc0aa65dfc4df91a25c244012ed3daa144ccc3afc", + "0x27ff023bad111f6c89c8ce91ea5d71234d2ece16", + "0x228bc727bafd040eddfdb9ceddd0ee5bfcd31e06", + "0x5f8f28f9e392163d5fc3d5b4bdc1c68e14c38fe0", + "0xcd838b8fffd2b39afd2102d85eafacde897c848f", + "0xdec6ea7c3b7087d567d02bbaa37229eb7383e0a7", + "0xbb354cc53aabe984353f2d04095fc8a794637550", + "0x51977d5cde42fbcf9f153faf5a916740caf78ae1", + "0x72d0c3466a6f00ca24c2f3dc796ef1400b4942b1", + "0x60e71017fc325cdfd60fb9b218e69ac81cec0949", + "0xb60fde5420034a900cca58d568f8df9d0ec7d446", + "0xa8298c6a522ccb9f537b1a31bfb2a71dfa665fbc", + "0xcc2b6c3fe93c3bdcee68e2f1e11f1e518a789d41", + "0x53f4a2b5dcf3e94082d31be50d67a48ee75b5000", + "0x035ce6cb25ef085cec2e447576ee9dddd22c16a5", + "0x0e2e544668312fe372cfa32c03cc15292151cf18", + "0x09ad31043b0b939576d5206b064ca1807c4160fd", + "0x985bae4e78f634696ea87b3833f4870c3b935e7c", + "0x1352738bc431d989e6534c31378636304f16f6db", + "0xfdd094bea79de25d8ab6acedc48b2b2e3a638372", + "0x7c1cac1e95d1df7f6c50d1e271e6de20254a4814", + "0x055f5d85afd4fd1b7872eccc5079db5a308a09b7", + "0x7bbc5d8ac67c85b4342114e82a6158ebdd281013", + "0x9ead8ae5f3268746a84eee0eb2a68019dbf996a9", + "0x437773a7f97c13203f093123918b500f4a32f8b4", + "0xb78c878c654b2cb73291f1d529c423a96fe1557c", + "0x7041ba869243df45dc07b7d828f88ecfe48dcccd", + "0x4292dad7666899b092b04de67b1bdd53c3fb6946", + "0x4a55c02af7e8892718c070701dec50d7fad7d13a", + "0x2dabd1c849b5adc1fb421e043ba53be6bb2aec62", + "0x85e02fed9d5695650a07dc854a2dd522722c635f", + "0x54158f81ff8adda2617ac4c726c3b37afb21f6a2", + "0xfa5eb325f8515b3ca2be1b23aa503b3f9a471739", + "0x52cec54c20b21c094b7a53d1a587252e70d458a6", + "0xe30dc8fdd16b0e46df637569232f3cde6a7f77d7", + "0x4c7133f3b67ce49a35047ac3078fa40adb5562f7", + "0xffd7f10314722c8da404c15be89af1b8f92d883d", + "0xb7410c19867a2a7ddc9f94144f1c5653d5cbf4a4", + "0x969883e485f538ecf8fc03b8916fdb2bbbccac7f", + "0x3db0192445e1e0b2360ba03fd08ae7b7196e82ad", + "0xe8aacbaad4271079161229977c849a2ca286d163", + "0x9b72b7f941804551f04372cc562f6991c790db85", + "0x4a7af4b39f77c2c1787fb17dfd01f517fa265ffc", + "0x915ce96ce33f44a83d68d133c8064476e1cb3ee9", + "0x9c36fde552b864dfe8759f5675e8e8476fd1eecb", + "0x6155dc2218a1ac18c6618431c7724af5cd0f5131", + "0xa84d75e3d101e47aac45cb1a0c1d1cad838e0ef4", + "0x71f054055f48f524d85dbe11605aa1fe736b2d83", + "0xf0b62f88ac4c4ac81e885527c5fde72e83394b64", + "0x1ad14489b2b829de1e9f323cb91f08f8026fae70", + "0x8aafcaf8b23af0a53580a16d21f9547ae3af4a82", + "0x59c64639f7e520110b75904b20a72040e1e73511", + "0xe1cbed71ad29179fb9687eb14909422ff7374c89", + "0x89eb9fa631ddd7c1024201160928c6ad987df52c", + "0x636215c653e41a98dfdc7264de433f33f0a77267", + "0x052b05a14ea75714aec14514c3af0fa26273e269", + "0xe7d699cec76424be0d768121b35fd5adb9660aad", + "0x36ce1e2760136cf7eedf54b46137ec16038354de", + "0xe717301b345c88c142ddc918184f9415ff0a4f36", + "0x72b36a40d2712c604cdf249fa3cf3f7e55a731d9", + "0xdfab6aae227f02d6074af8fc079d2a48e685f12e", + "0x235d59d3d10797aa3b5be4e7be4d155115381b52", + "0x54455d1709ccb3c832c7f71238528a7bb6d36f7f", + "0xc3755c50ef8f5408fd8f22be53743ecff2d2b444", + "0xd3749f0030e7908adf98140b4cd7a6ec480eabef", + "0x211370310a5afa44f6648c5a377c6b895464c91e", + "0xaeff8c94abae640a834e1969f2a2c039d04f77e0", + "0xdb5add91fdbbc6b50e5ff232e47a2840a85523ed", + "0x14b08975dcbdd94e7d254ac93290a02abf585199", + "0x20ddea2811a4f4fd2efc07ac51d03040c070bda7", + "0xaf5a1b864d44a786fb479746c62f935831133f1d", + "0xdf423f56a71ab48861d8fac6fb833674a7a21f3a", + "0x7a0105de2b2521d8bbdc7b124598840c80a831f1", + "0xab5b9cd974e4e37115c3dd045f9c88a0d284a134", + "0x8860b4ce39fbe8beb32e980e9d35d16c77b38a63", + "0x6746812c576c4b9bd570bc419cb004c428eb24a2", + "0x59ab5e03a648f31b943a80a538817731c69703c2", + "0x46755fe91da49a036cf456f109fefcfc1c5e528a", + "0x7a2dd898b124ced7adfe7d3ee4bf4edc1e3d31b7", + "0xf8bc2d0bf82b9404f013ade773f23bd5034ccb41", + "0x6002cbbdcf89a8f4675d0ceb5480276ff57f1e51", + "0x86398ec2b339d3421e10f299524dbe0320b6801d", + "0xc92cc9f0d8afdef6788bebd755b49efb02adaaa7", + "0xd06085e7c53e901a2fac2d8e2cd8d85a277596f0", + "0x575e69cffb77d78ddacd796dd1f53e946df5dc29", + "0xc6384e504443609e56cd46c200d3c665a71e8349", + "0xa4d24c8f628dc27711d31331156af4500138f781", + "0xa710cf44abd11bdb93bf6e3116fc1849d053fc4c", + "0xf43460761df548437b509e148364534d7a7b0d40", + "0x76bb745a21f5b3c5b5caa05ce38848aac99d0c98", + "0x959d149139c21b8c50877615c567bd04d94a2fd4", + "0x8500b1b92667c3207367907439dcc598c03caab2", + "0xd94ceb14f6a3acd4bdeeb8d045909e714e667960", + "0x71e6da3b28f4fa979e55bb1148c6e368cd991811", + "0x2072d5689b1288fd367a44258dfac44080276127", + "0x855713c72820c903651891556d7edda4b4a071c9", + "0x124de3f059afa077b52c449b63862310c396ebe8", + "0xdf1c4f878ee4c00e0219c68de78b5efb360f2859", + "0xe90ed34bbd59b4250b9dec8790fd295abc6bf788", + "0xb1f0a05018a6b42dd46718ea0a4aad146bde42bb", + "0xaa016b421715c4975365d8fb2006708d7d8ad384", + "0x11b307e8a86e055e4928cbbf80fc0ae7cb51c8c2", + "0xb71e0b630836a927140dc59be781ed010064ff80", + "0x7514a2d67d3a3d0647285b0313640b8cb3bf1b6e", + "0x3cd2cc9e6c2aba88aa7feff88e465cb93fe1d232", + "0xac5878477a5e0435f4c801fc62525cd748d7c298", + "0xe38df97c69fb9dac461d25c6b10eaed33ed635bb", + "0xd1decde89eef3683cc0743ba89157a838064b153", + "0xf95041821edd5ff87beacb34bb6474c629660e76", + "0x551018569d03e3d85007ea24ecbde66badcc62f5", + "0xf55105e1f4a6cc6692b3ecfb1254829b227c147b", + "0xb98bacace8068e6b265b7f7529555ca453a8adeb", + "0x8f381d9b2c4e7f4273409114c54cd740fdaefefe", + "0x79b0490d94b119ca20921c66e8209a6d7c65b383", + "0x0ae260b0089b3d4cb3553b9bfdf12a0cffbbe5e2", + "0xf62902ce027894c4cfaba508fce43c16272baad0", + "0xf99ee98167b41e226527b83982acd618678a510c", + "0x7feb8baeec569add3506387d49ef194e9706ec73", + "0x20ed5092e70986992778e6365cefcd778a935821", + "0x1ee7aca9d8c9ea0c12ac641b9386d3c78b9645e7", + "0x7247a1ef38b9ae828aee0a8d4fb90378ce968e47", + "0x5b30cd231a1f8bc447334b955cc9d78c8ffc5cdd", + "0x077ed175e741a0401e16d5f2d723253b9e95fa54", + "0xf7d890331a321ba64408a8e41914cda026250122", + "0xb40f96443a59c3ba6c47a9700c299382db5e7979", + "0x66cfdc119bcc215456f8f46f6b8c6571a5ea51b8", + "0x49a390023ac7fcff8e75935a28c20ef63855c087", + "0xa0a10f2a0de68848edee2185d4bd6f84bc9a0bdf", + "0x55f7eb6c39a6d802cda1f93cc0ea8b3d29b02707", + "0x6e2c8fa48dab2db4b8dc77e015b9338c3c426b2d", + "0x0c91eb7a1aee45e8fe0bf46cff82f4be8fb4ff23", + "0x86fad9ce90b8b4a8293381bfaeb9fb8b00517758", + "0x085eb845afa5d8dda7d0144b663c6ac40e234102", + "0xcdbe68038d9e86a490f59d52efef14e7257c08d5", + "0xd4feb3785739e2f5639ffa44ff97c4541c6bc7a6", + "0xacff0bdb82e1a5b77fa10d024bae19a761fca8a1", + "0x9e0028366af8c4f9b315dd74bb54a6880e949291", + "0xb137af89abeeaa1111a77b459ae051a6be793c0d", + "0x5d0b8a9aa1d787b101cda26c232e6290a13501c0", + "0x80d73c92fb38c2eb29cc211ef3cf96f3f1d94c73", + "0x096eb2ebd3d6908432dc092c38714e1969725f3d", + "0x414ac0132728ea7ef51f26726de06e3ae7cb15dc", + "0x194ac44c56ffa29ac3a6c26261acc48eecc46f05", + "0xfb2c3f06811343bdfef8405f310e2646f4008123", + "0xa917ade2f7530968779e7772e54c82738b74af1a", + "0xf7d0fb25f3108d86cf04d9950163d3798c50b041", + "0xda3b10e0ac5f81fc7aa270f0fe00b7e170f06f55", + "0x6126cbcdf62b2dd507d50a264d702d007629e0c5", + "0x8e4d7dc32ea80d42e08aba844f5377db8223b14c", + "0x1a5cc3b3bf1bc0505a556e239226a1d240285933", + "0xb0136e26193ff8d1a8ff3c764fb54f9f91098d67", + "0xfdbefad774af5b92a0e7f5bcefb05948eadbb283", + "0x2b2b542725ce2260c37a17f29612fe6a382b6c11", + "0x79473c21de2d44d9112ff43699a1bb81dcead31f", + "0x05d3c41cef51693a63d3c5ca55460ff250d48c64", + "0x30e37bde7b7b84d0eedcef10d463d43062eb11d8", + "0x673d8f46286ecd471c0c998655fa104a5e1787e2", + "0xc6c07c3a279676e5fd4274e8e4c0ccb5d057558f", + "0xe9820977f0763de6fd6c0a487b2ee46af2fbe825", + "0xc6cffff925b5cf412672a3ca7f3337160156eac8", + "0xe837689466ad96e71ead121e35fa53b3fd00e199", + "0x339ae60c99a5ebba1a6471eff046ee906ff92396", + "0xd0941d6926550761a2c605d83afcac562258c1d2", + "0xb42d4e2ab15aecf2922892e677b6bac821766331", + "0x58baa68a13641dd4c31306c464da1b61010c0132", + "0x4756e6f1e419158cd5d6fbc72b7850a85d88acdc", + "0x9bb77d01a9b12e04e9db99ec2dd5f564be0265a1", + "0xc6d3d4439ebf7905482e6065145696fdc111641a", + "0x9c3b82c80fc9d9e78442857efa85f94027859c72", + "0xf8a0a025457d10211d2864dca2b577b924f993db", + "0xed73b6c02f9bed7677027ef51d384e8278b3ab5e", + "0xab7f8b4cca74d9da7f2831a7d692c920672fd52e", + "0x0460c625f328cb7f5378fcb032013b5f2abe655e", + "0x740634c5e144ccff1541e4eac01bdf1cc58bd813", + "0xf3758c3a156d29d578cbcf6d1fd1f36bd9bd3a29", + "0x644f9b628ff53410075a900a26cbf9fc3a2612ac", + "0x2cfd92670af1d041d5a6c4e736c1172a3ae5b325", + "0x0491c457dc7d7907470d8e472daf71b6b31fe79c", + "0xb2e680a3b43a96e279c3089f478810d53cfbde41", + "0x16113193ee1f8e0abef2a73ee77f1cda77e2a0cf", + "0x631cc9f2bf469f8c7f0d4841f67e0f4328ef16c3", + "0x2903d3ee57cc8502e5c0113bfe6f334d168b6c72", + "0x6408bd9a36c2becdc6ca985d7081485a07825227", + "0x1823af65a83eb7337277ff11d34203b2a4e34e0e", + "0xe239e35a8838b89c923d8ae61b41194e5950aba6", + "0xedc26d0169593aa52bb51cebe8e7677be469dc3e", + "0xdbdfe55edb0ee57a2b8cbc16143522c1ddee8d1c", + "0xc4ab7feac6b14cef3b6218ec49962f3e9ad92948", + "0x6515968f2e12f42f01498edb8c238ef7fc18243f", + "0x14bc72cd9e41380046f70236410fce5abdfcc40a", + "0xfc027328923037ebe5bb0ebbfa8ad99d5620c141", + "0x98a61ad2f3a2624c52cef30af0a853575fdfc1f6", + "0x68b8b6d9f7d1f976a8268466fa18a4e98583eca4", + "0xf4ad29e7587e48e6f6410ef6854b354853d1ce4a", + "0xf5f6440f827f586324051b65b99136efc99b362e", + "0xf35e3615a2c5005cea72885f6d47451a410ea4f4", + "0xc92fc09658fb97ccf59ffd34d404766c3713c828", + "0x47452097e8968c8a22bc65b8b91c6946bb95fc28", + "0xbaf56f6b6e91359062ae4039841ff3bdc126830e", + "0x1ea0dc1323eb9912f599bd01c78c195046c5f69e", + "0xefd28b191e1cfbd51e0d3e3258a8d1ca4b67744b", + "0x72cfb3777f04a4f1fb615f7878b88828f83042ce", + "0x0c225c50c500106b437b50c748477c1047adc75e", + "0xc8e9c2e85dfc60c847a9b976a60745263beb526a", + "0x591be15b7b2118d8021e2fd7dd7860d22c5f0051", + "0x5d77da83f1222e34cbb946eb81683efac36a4681", + "0x60a9c01bc1c191832322bf239ae1cb96c52963f5", + "0x421fdf2c4539c834fcd026de33ed0175c98403ad", + "0x362c1e8a4d55f18cd4cce3fd405f911747e63e65", + "0x1d5790d42b908f7f2534f0815d743f11e14eba6c", + "0x65553837360794321f77086b8405423ec981ac59", + "0x523d0cd051e272856a2c925c08a5fba8425c4944", + "0xf6bb2468902877d7b8820dff79f6fb1b9b1b902f", + "0x71b5083ed13100539f0c591d9541ada5bca21a02", + "0xd2eb098ecdad325446ec4387fba8a1ea80de3678", + "0x2f55a8af6b9fc5b4ba50b6d18c37a0c607147d86", + "0x891f62630043e63d063c422fe4e010f5ba8172da", + "0xbdf62ede89d58692da0853410dfb18cc9c016f64", + "0xe4a78b7afc2a100fbec57663513a51cf86e40cb1", + "0xceb8bb4146cc0f7c1ce39875189ff4b71802195c", + "0x61dbf373af798bb2eb0127788066ecd6927c58d2", + "0x22827df138fb40f2a80c00245af2177b5eb71f38", + "0x45adff324eb1ac03a6a115dc539052232d4ba980", + "0xd689651ae290d2b02cfab9274f955b0592d46f86", + "0xbc0ef05d288c840044000d9bfed684a623b110aa", + "0x86767a8cee9b201b1edcfefdd9724d5861ffae40", + "0x1493a7fec682a62e703782dc1e6efbcd7fd578ab", + "0x9f985f2363ca31052a939c0d157217d280cb6cb8", + "0xaa6ae5f08cf1de7e6cad91e8ed6fc8ac15392a1c", + "0x3d304c80a1bda09495a609b1ecf2d5dcab088b74", + "0xbe9028d00073a5aacd923006adc5005fb26e9ab0", + "0xbc72aa1f58ad5dfbba2aff09d5c66762cea8638a", + "0x12b2946224aa50cc88cd026b9bdc19631a96564e", + "0x9f9c03114e1e6ab5446b5a95bfe1e138fa6fe04c", + "0x978eeaef3b00aa4cbb20c1638cca9f515725bb16", + "0x246b7fae650bb7e3fdf0ef83498dbb8f76675a32", + "0xe2823b18455d6b81a816bfaeb3277685b9011ff9", + "0x01cbfc92ce874e6e35750213c161e907c1a60c01", + "0x5535c9b116bc33b6904b878560ebb03969fa5c10", + "0xdb10d21f28a34fd04e4425eac777483798f7e217", + "0x2880fcad0499a6bf7f184d84471b0ac5d9741cbb", + "0xe8669c56feec37a0870cfe25f18aaeefb8962925", + "0x96f77bb64656735638653754c97fe9ee01476630", + "0x549b4cb68808970e0ea4ad9d7b0c8ae117d48a2c", + "0xf1fff7666f0d7e720d5a8ea525e556a58f711281", + "0xe9f872da0e2428aab85e58095fd22f5840194624", + "0x3b59d6b33e8f8ddf9734917a40056d07548a4444", + "0x3b30d44df9afffc07a51457e18410c4ca0f90896", + "0xb0ec89b8635bba4c20dc0da913d6ca9921632f20", + "0x1f91703c5db47a4658f0e5c30183f2b9bda60e50", + "0xb27d299263daa1ec3d8d8cfd20d65889659f6bb9", + "0x5d4895d3c92a9fc1abea56d721affd7957740988", + "0xd3729b8bf1ebe662fed28c42899d2ebdf7f2e08a", + "0xd4f7c5b6d41b699b95feadcfcfd3b593f0931ed3", + "0x3c41943e2f92fe316ef7ab82ef6390079ff0fde7", + "0xfa4a25e6d4351997fe0fd3bbb5f48cac3f604bae", + "0x0afc69e27ff125a769db704c045226cceebe1994", + "0x2a0dee0f1a91cf49b75773858ed50953a3d4b18c", + "0x65ce0b4950614055297a07815f70d995b6c19366", + "0x60da4b3b53a3cd1ac993091a4dfd3441a68d4181", + "0x3395a9b552bcd25fcb7447a3811de354e941f367", + "0x3186d3c99ec3b1512338f59224fc2c196b4ce9ed", + "0x7860cf975144a0163c09ca22a5fadb02696fd013", + "0xca64e575083e0a8f9c73ffc214d78027d98fc51b", + "0x3bbd0b51239d7bdb56230167fc90f32fe0866821", + "0x825e63be2775344d27f53cbe37a6721ba8954c4e", + "0xc12de812ae612b6d514b52d529f97f6acb524c8e", + "0x88af543813f95b46085cc38c1742df952102f9eb", + "0x72cf03d162411304dcd5af059d136f536412ef78", + "0x6921352064dc79139dad8b5b7ed2c982ce0fda21", + "0x586634c272dfa3894ee9b99836541dee35660f34", + "0xdd8303187096ee590987feef8ae349feadbd6660", + "0x8245322a57ce026d82185a8bf14b8fe6afec3df1", + "0x377d5bb9f733afeca65d44a1f867f91f8603818e", + "0x11b1785d9ac81480c03210e89f1508c8c115888e", + "0x080af1a9541991dc38f1f7db4ee2dedb1176d98f", + "0x8dd97a2c42d8822e1d4152dcb02e4165c955c661", + "0xe123d24756ba8a8bc8021762c61b19218118ddc9", + "0x2603116772fc3c032bea1cd618b276ba60c4fdba", + "0xb8ad59a528ab2647f68ed2d81f846cf054373217", + "0xdbaed1f2521fac4feaaa652c141087fb7c65535d", + "0x3a137fb6b0808628b6031071df0e9455be5a2163", + "0xc078920cdc0b98262d68c81229605edf919001c2", + "0x92015469f2410b7d81cd917878e7362a2d5cbea0", + "0x93f74fd357e9555d267a04d60a48889ad00d8d0a", + "0xf2eb70e0c90cb9c8720cb374a8690cdc63e1680a", + "0xd1db640f7ee05d8b1956803966979647f716605f", + "0x195151fd0e9faaf1fd4b28cfa571109c15c9165f", + "0x3eeb1a13373b8db2b90f228d834c25961ec0722a", + "0x886f957bec7dee3a194a0e46b971310addf89bf1", + "0x8127d7d3e87bb410b9d8cafb7a2a5a4d2664f4dc", + "0x0ce6a19992cd1cca54e83173bd0b5137f89b0f67", + "0x9d2bc9367319b93714c1701c1f27310b84da3379", + "0x3567680c710f3527492950d5834455bbb097f603", + "0xfa43b63ae72daab9a458a8b275290aef707279db", + "0x64832fa4feb796ecd9c076d645218708d88ce9ee", + "0xa8f2b210bc1d6aa485051c28a67d2f353fcd60e7", + "0xe449a2537a97db70b51798a8c0e632b43285fb7b", + "0x0a8880b10eb737596940a82d02cc31180a782129", + "0x0362ae6dce74bde12f4ae17f430144d4fd27e96c", + "0xe305561dc0dd65d3a355ded690e7d27d89a3ff16", + "0x070222d3e185dfd96dd45e0606410d9f199877f2", + "0xc44f761e953a4fad12658bb21728f4607ec16d42", + "0x4d2ed284cb9ebaab06bc01cc1c7f824e5b161378", + "0x9a53762fa344b28f2d7810711ea4f142968962b7", + "0x501a1817573329b2c65f22c9e8558355f4011053", + "0x747765910d8c36fe876867d5b5526ea86d1dcb2d", + "0x5f55ecf93ca791a62e069fac84ddd86ab84142b3", + "0x1817f4306d4aea9a58f4d564d2fcbf7cc4a64656", + "0x2e5f3c9c5976931b66a114647ff7f85903c32146", + "0x928d33f4052e02b1ac72ce03fc63ca8cc79aa4c6", + "0x8bfd6fea541b402e9cf27e69a90b2763c2348818", + "0x65c2f2e22f1d71d2979908d2b58025f1a5c7c29a", + "0xaa90a5cb621efcfc047e52484a281ce594747803", + "0xf0549a19854a95f702db29badc7ca05d1bf8f378", + "0xfefd269936e3da738beb4e4b4987b2f3cf0610fb", + "0x40556defc42aa25c13b4de3b1479737f4f4d28c8", + "0xd6c01f4b14250bdc31c93eba5219c397156ed32a", + "0xc6272ec59e93ceb0b9236511d39cde0d050db1f6", + "0xe2a23704afbf9b95676985a01f6497d4622244ab", + "0x5b1410b46c1afdba633fc2d2105edf03b2c09493", + "0x95d8bba9e5af3de140917393f4ba911718f88c38", + "0x603f9f25ea89f465e36e2e9a9eb13289f0e7dae8", + "0x2210b85891dc24d844c3e78587a39f7aff15fbf6", + "0x6e6dfbd557bcc90a5f743ab2bcfd24f7454992c9", + "0xa1eb7ca679e79b7c0ffad363b20d6b74e59ab36a", + "0x54d2a179efd9bd364a633fdac407f8e288546bda", + "0x130bb779751e7567b1258d0db3bf54165fef8e48", + "0x00932dc0c424c7628aeea5f89a36f425ed59c7b0", + "0x672a7b6431b8c77bee625963f14fd8c388b682d2", + "0xfb84fa443490f28863a5b4810221da1efc2bbeaa", + "0xdeca9b149317368535a9ba080b4b0486b33984ee", + "0xceb0bcb4772c6fd8414ba0bea84f95d7f958b02e", + "0x4613b2db18e9f3908bda66ed4f9d29d0265527e3", + "0xd83d3c611a1057e30d0dbbf9415266418634c3d3", + "0xfe2e4d5957e3c3b5bcf8aa54335fe00c15741cd2", + "0xead002d71ddd456e70ab019dcadaf13b13b93e1a", + "0x2b4ed8122b752aea8369ff65c7fe457f0cc20836", + "0x393c915a0d21b968699f510034b3f4ea1ef5c691", + "0xd2c6a60a63d81da9de629a10539ca99de7514da3", + "0x16d64c6365951d86cb3c99ab7277ca85cd488f1a", + "0x1563db918f042b49b6dd71ded32f2a6eac38e189", + "0x231be797aceff5f81c354751d567a67938d6d41f", + "0x47dc3d073e69e6abc970ee6c28f71d61aa7474db", + "0xd7ede0be7b753d681efef012839c78451dc8865b", + "0xd3df7d623670fa60aa63f97c877c9af6bd176ca0", + "0x3e63a201c6ea7bfb0ea9f0d6b52bd8c2da5f4be2", + "0x5c71629950833c69397789f1bf40fd3f6d32eaa1", + "0x26dff58da3632a31462e4305ccf5898b744f6718", + "0x23224ba951d743d930120c694bc4c41e7e02c1da", + "0x3ff6525c883a46fc709ba0f3354d7c14c0e97fd8", + "0xa3f8e71c88f507862d0489fe2e8e4b508545bc18", + "0x7d8051c54cac399261dbd7aada931466c701ae01", + "0x7feb6974769e8191bd49627236b4227c3693dc7b", + "0x35affe1cb2fc0b57d33c25492df89da0d5a2b082", + "0x93e4f744d03189239ac0d793200a7d808c80cfe6", + "0x077681ec43dcc19c8766f66160cd9208dab0c4d3", + "0x8466a778988a05a70aef67fa84040ceb9d4b828f", + "0x1e6f5dc49447c9e6972925fb871486c27f9f03c4", + "0xf7ff9b8b80da726792a295bce3a4b5490c8959bd", + "0x5b5e44da9718288244110e66a7ca6c537f36f948", + "0xc2ec0ecd6ef5effdc2aceba1007d7b6c7f9d6e18", + "0x124445343ea4970932718eec52d8aa02576744d7", + "0xe08ce97b21d4d92871c00315fe9a984e879d7cbe", + "0x940d37b4bac7b61f07bea69afefedf29d596a177", + "0xd84b69ac5028f696b47150f772c209fd10fe5aa8", + "0xe996c9ab0967735cdf31718dfbee36f9ed724a2d", + "0x0b863d8ea3b8a7d21d46c0177a1e4ceee9b22192", + "0xb1d574ef227cadc94570951c5b8450ccd08b0493", + "0x2730b5c68c91f343c24fc3b880dca0a3c163ec33", + "0x79dc0e37be835f288ec1826a3ace16ae6df117f5", + "0x165a0142d1d57a5f9811200c9b2a5be5c983e09e", + "0xfb1de9101b0eafedb56d7aedde6d4fbf42d08f8f", + "0x68b1467dac5b77d95b53ecc767045564e97c69c5", + "0x380f84af5a8d0c6cb81239d5c07a6ac8838e20a7", + "0x853f00f69b5b98fa8116af6986399923a1743574", + "0x9ba3db52bc401f4ef8ba23e56268c3ade0290837", + "0x093c2a23bd1f77653cf8a924322642493337b683", + "0xc207b8907b19138c31ab3cd3d0b63bb14424efd7", + "0x3e721ad07b66aba97b61f52fc781ea39c08c1788", + "0x4641224ff581f69416cd6786db575ee512b7c890", + "0xf0c09d91aa30e491e1a3a20c6fd35838257e2648", + "0xfe2f08b65144092514a8f96860edfd250287b02c", + "0x02ad66ee3f34d52c1df84873b1caa0c6937b869a", + "0x786726cec11025559adaaa4ae390d8d7c9287225", + "0xe81ba02bb44d8cea89c5ceaf18b340c1b8666861", + "0x3305c04cadb2f6386a1340704fc43ab7c1ee71dc", + "0x2bf9c0d33e5b72834ca2cc757988da395e683647", + "0x3334814515fa874d8665faea38b9f77320841106", + "0x1165cc27da7a4606692dbdae20bb12d638db7db5", + "0xef5f29d251e7892df6b87ad91dee899ffe06aa96", + "0xac8217c5a7c1b4b42c91dcc4347e539ce556c5c6", + "0xcbef5beac1a5558bd64d3f8503c8a5a8bab1c3e1", + "0xab4fc113f84df957575ca9a91a6e04b6563b7b00", + "0x7fd354aed776bc0dba227e502e37123ca970d79f", + "0x4acb4c9d9fd2b7708e76b2b6a1aec4458d945c6d", + "0xb77809f3ef06e5141210156c45a930c5e4bf7b65", + "0x7b33918967eb8f48983cedcacbe4601cda2681c3", + "0x20fe35ace395c7ba4743b5f173b2f4a110e95d26", + "0x175e64730c4199c09b1a32c8c29ffe848523cb17", + "0x667b35ec8a62b5b4aee06393468f5f3cc14d58cd", + "0xd49b030f927546b742b9f68af41437d5a8389c36", + "0x5dfde03cd97a805a09a770dbf07996a800965737", + "0x6710fad543610cd0aed8e468537c3d5373ccd7da", + "0x57d539ad75e1ae12ece5a405d898916a6fb68faa", + "0x525208dd0b56c27bd10703bd675fca0509a17154", + "0xa503ae746877b587fc6056eddcbc9a56891979dc", + "0x7644ad1ae9ea0f2860e94a41fd9f3a3034fc5eac", + "0x8b047665d9b75cfa54274540c4ee70c9110a4dbf", + "0xc8fe7f624c0236b8b0ee16dca68d444949f0484f", + "0xde380559ebe95b2aedc267dd73280c0613484f58", + "0xd2981edf0ee15d57f61a56ea83b1062af22da0ab", + "0xe15ccd378b95295b0e2dcf6610e0657e77e451c3", + "0xc61d367f030aba7bb66cb72fcdfd46882f7244db", + "0x7d29f6f00b65ac60f73b5c7ad30dfe6a515b98a1", + "0x0cb63719d7fbb807f82423ca42cc3506a5aedc10", + "0x59504b7c186a8e5bb3a8dfaedd22b37027a1cdf4", + "0xeeb89922e560b337c435eef1da595a96859a8adc", + "0xa3e9dfec78e947a095fc75f3cfe4a14f57744eae", + "0x267afbe25085e199871ae54028b54c29b4380123", + "0xe57c83aceefb9fa1d17ff8c96b54fa9d5dfbed39", + "0x7c06055dff750587811f8317cfc831a618aa1b78", + "0x508d92c3629f8832d5ca67df987469993c703d6a", + "0x1e9179892924efd1fdff530918c0fd3b014abebf", + "0x4ec6edb470afe695e8fc6b207084dd624d6e1e54", + "0x2f551e6e6edac20c198955d59478dfadf55877cf", + "0xb533c4da86afb2fa8fc5bf4ec2a854875c09c848", + "0x7ee2523b5cdb72e825d64889ffa19b62c44c9300", + "0xf41ef2d74d65954e5c0fa46b8265cec70ae2f08f", + "0xcf6c71a5cb1e89a69f569ed2d7139b95f89af915", + "0x3651bf217139cf38ca3751e8a4cffc47421d51b1", + "0x5d24f1600ff4dd91992f21d877d14044ecbff059", + "0x39fbd0f137740f9f2878048941d3f4737fd197a3", + "0x8fd3cc4219c73c164c65ad6b441320488ac571d2", + "0x6794ac8e94a8aa96b38fabf66b6b6c5bc6f525a4", + "0x31c4089404a4878ec0be842e227b726e9d62dba7", + "0xc4f36a351ea965fb98cf179390a8856ef81451b3", + "0x3cd06d2aa014b334b43bcf2280a2ca3cdb85930e", + "0xd464206b1df7960939eaa878999fd83c1c2598a6", + "0x8fdad012657e2ca6ea8357c9e153be59b7281385", + "0xacb28d170396e2bde2a5c7fb17458948b5005583", + "0xe3c9b5d16fc22dd86c22415d918b6945f4a5f123", + "0xbedd5665532e89eb93786db831cd6d2aee665df8", + "0x851e5ce9fa409b731f980a5e00fa889b58d9037d", + "0x5f056ff8ea841f3aa283a0eb56a935e25663c207", + "0xfef8c288ef5b0d2dad7b392b46fc4a0c170fea91", + "0x80b5a32e4f032b2a058b4f29ec95eefeeb87adcd", + "0xe66405cddb768e690119040f2c70b10cba30e01c", + "0x843bbc3f23780e8d81b2663ada8e5bd20ea0029d", + "0x70b5d93d519c52a00839fed5f87947d4bc82ef6d", + "0xfc9826bda2d35480c6b01ef25d80519bb9154bc6", + "0x4e2659f3e72a9d50baddfa9c11a0f4f986a1e8fd", + "0x1d9aad0af939dd8226ca38188bcb2669da3d804c", + "0x036ac5df2c7e85656c362cdf8a06427be68512db", + "0x4554c6d234e8dd7873631894fcce7dd3bdfea345", + "0x23aa5790ce72cd4341bf4b138d009a4ab55ddd5d", + "0x771cebf178820fc663a35afadf9e25db7a03bfe6", + "0xd72bc8e7ac9eff65c0b1eb65576e47812fbc21dc", + "0xbe0d68729e0802a4cdab88e0eb2ad80dce107571", + "0x6cbdafab880f564dcf0637d4e9c65a9245d50dd8", + "0x1ad7136b298263e2ebd65ac1ea32e9af91e22778", + "0x25d7804b33d09b324015e797188baa8e868f6c26", + "0x6bc2e194c66f5d0759809bb77c786e26c5337737", + "0xcaa8b2c1c86de1ac7e2c85bf7f7c9dec3c3dd356", + "0x03852d8ce4fdf465bc50eb826d25479cb855c318", + "0x80619a4d7d747ac0868de1dbbe692f255a366066", + "0xed4ad3bff5f35b93e89dbcddcf5999490dc89aa4", + "0x4680794c6d66ae0be94cbf0d18a998743c09237e", + "0xe87ea839adc6d28e1aa30198d21a6e3e41717553", + "0x33b74799a4ddfd155498d1e531f74d9541e0123b", + "0x372a968fc41577a6299862adf83272e563991885", + "0xec4eeacac1538f73832e63bdfde2ff82638afe0f", + "0x3a5ad7f7e8d8c4accbfbf4975fa46fff030233e9", + "0xdf43664aec3b994e1dd159ec59d45ba87927255b", + "0x204bfb4889f6370f4627de4056db557527198e66", + "0xcc6e6382c94f6fed6684a9c481e08ab4edd3cbc8", + "0xed42833b6cb2079153a40df31b2f68b19d3cbb4c", + "0x138217746bd24765ada859ed9cf23182e456ca3d", + "0x14df64a079e1fe9e29f429bd2786d8443c8f2929", + "0x4c7c1ba8c1e1a8a0ac1f49187dd8be1371b6f577", + "0x98a53b6a31ee4fada5cdd33777b67466e2622c53", + "0xe3c0125df5e24845e80f6025e0c9d6d59f256e5b", + "0xe994924091a7034ce33fbcdb082836165f5596d4", + "0x10b9fe14e8bb8258102ac18ac37df078d42ee0dd", + "0x2c299d53ec142366342b0726861798e4eef5020e", + "0x7a3fd40f47077d0e9b712129c1ebdeda6493a012", + "0x2115411031958a9efccd7b6de4097a5c3ecad3a2", + "0xada82e3b0db620e84593c5511401a86a2333f564", + "0x14c9b6b35a40bc408c1f7d7605ca91b62b6f1d0f", + "0x544a40955ba1c7e56e161a59e1319e3313c25251", + "0x9404edca6201a45805c98aaa625c977405ccb308", + "0x779e7c0a6c1b31af775beed455182f3fd1a50097", + "0xd88aded3e831f793fadced2d53c96ea92601513f", + "0xcf6e362ea95a764981f0fbf63a652a3f8bfc8b4f", + "0xc2f468c148d8db50069eaa1dd248c61a4299fd5a", + "0x6c35febb8b17110e628ad084117eef2bc60582fa", + "0x6053cc3bc8c0edc367a6348ae02fb74f4efa4e52", + "0xdb1d9c9f04cd795901b3c61293399628043b3fde", + "0xf6c4519a64bd13f72004455485741d50b2f15a8d", + "0x7911fa8d5bfce62ef68b714d5b51a65a5732b101", + "0xbafd0683334775a2928546352302162f597ccea5", + "0x650bf4beec02524e89a5a36f4d7014386669dac1", + "0xbf0a88a4765aa940f33dd33237bab6f414cdfb8f", + "0x080c9b708588c103034f22898212164f45eec1a8", + "0xdf0980d71ea77fa356d06add1355d1f58575ba2f", + "0x18ec5566ad26e2ac609822395d6d9e98a39c90ef", + "0x2bb5a5bc83103bf188db33f00c4a38659349595f", + "0xd0b99f4aa489776d8e35f26eabb2abeff97b0804", + "0xf5648868058a62ca721e06b4177a46b9f84cc93a", + "0xc45cfd0fb83054fee4453998a1fd914d7b319fb3", + "0x5c21289b0e1a48353e7a439eb5c416b6040ddfb6", + "0xf5e6aef8b6cfde31d485aea061b0fdc427c1d685", + "0x0211eeef2bcc209a796e2bd4ad544fa48ac08b3f", + "0x0cd4bf7ba90ceb1bb50e97a7cacd4fd65d8338ee", + "0x3a8a1b1b83145f21c77d42df686bf948b761cc8a", + "0x42c5d633ac3486115db8f5a23f7dbd4b0d259cc4", + "0x4e812fd9238c24bb99620560924cf4ceac218c88", + "0xca4d146ba7a12b98a6a5af3b3b503b4ad33a2f30", + "0x4a12264dc856e14c5a06460a335d1e4b72b57f1a", + "0x34ff77a853a14579d2120ac08c5e342cee08ad71", + "0x66908cc2f112eb1f837f2ac14cdb68ffe5af2a41", + "0x4028def3502b337c88e920fce94d2cf9dde681c1", + "0x53c2dcfec4a6647b6d19b956befea456d227363e", + "0xec8bebdf0863446d84be4c0e77a96e4823562187", + "0x13a00829c445605cbf84e088e802d2b54db22356", + "0xd6e74ae88f9d375a4870c9116753542090179280", + "0x0f4bb6a992805acdbe6ddf50b26a74f951629f48", + "0x1438ccae8002e82260afce1504071ea7cb0ca7b7", + "0x3379c8497b4395e304e4742759668d7ff21a4c5b", + "0x719e9942f51b8a2bc6b149850b25b85e6e4b0c7c", + "0xe554999126a4558572a9864aacb380d0c163d364", + "0x9be426c8a28ee7ca935b5c27a4bc2395640c9378", + "0xa654d86ac5b4db0c8c9edfb2f858683d3ce160fa", + "0x67bdb0f3c4e863c49d5732b8b8189c0828b075d4", + "0x9436b686c7ca843534d1100cdb68a7839341aef5", + "0xd0dc07b98769f23a7bdbef15a35faa256cb65dcf", + "0x7968653c1e5aefb43ab8a5953e8f613fb0fca505", + "0x17872228097213e66ffee15949afe4afa9ef5f1b", + "0x53b13bc88fcda6633cc2e6638664f425e89db7bc", + "0x322788d5729392ec36fbdc566d5b8fdfb8d64795", + "0x132db8234171cc9d8a65853cf03d5c0f46c8867e", + "0xc279fe84665582169a96cf5621361af086377a79", + "0x75330d021c4105373db58435f4f491fe9be6e16f", + "0xa3733c4105d02ff4a33093f6b4610e64643e3126", + "0x8055a975a69b1bd3a7f71d3f10a2fcf5da211462", + "0x657a38e6994cb578351376dcdb077330d00665d6", + "0x4682d8f4e9d909c1c2314d47dfd2abd194efb5c1", + "0xd881ab293e0f2c5ea50c0afb88e58f7a67481ceb", + "0x0ae0aaa70387f05d7011dd658d487cad4a8b5ae7", + "0xe33ccf2e727c1dd2c8fda36e357c3617c1e7448f", + "0x339983a5873ea117b322709163d9a40e06733781", + "0x803396ca9292a5b36ed9c862cf7b80b0ed0269e4", + "0xba4af131efb62ca22dc6f4ce4a4eb23cd2c3002a", + "0xf90f56afa1dae825db57fc305b2f8f1ccf337531", + "0x8655cf795c829c241e12fc9280de5256680cf1bc", + "0xbe0db09f73d50c704eaef8ffbd7787577e354bde", + "0xb04ccf9ee1a16b37b22a5b95be7185f4221039ae", + "0x5f068fa188e23fb7e258f99af36c6d3ddfdbaa42", + "0x05e7eaf9770bc7290ca5a13e2faf28c09f5676a2", + "0x37b3ce4ee95758e41b0e73ea3088ea9c3fdacd32", + "0x9a010a9f883def165d5589cb9fdfb45326d9431d", + "0x19b0db28d54f7f65468ded24ea3ea281c81b6c12", + "0x1f2d71593150a8e38536b0b078e3ca9c9b26a7c9", + "0xbf31c0fa3cb90dd1199fe348d47449935528c6d6", + "0x617177f958ef80669a6a48f4567376ea8efabbbd", + "0x1f3221f88dd0163b849bba90756582a0997df38b", + "0xa0c0a9141b66237e86ed5ffdd05fe88eb5a88c94", + "0x84702c13b8e8c602a46a2bb1fb5cfd7742798136", + "0x981cac16246d9641be07bba6e19e304b74b173bc", + "0x03a8d9486ed7ea7f812a725c7f0a19f8fdbb09f1", + "0x77569658ab29c89f6a99585ec5c24f84d7e10c68", + "0xc58ac08568423486d14d3c153952d1c051e89bca", + "0xab8cd15328c7e056853501ea1530b76c3b1d311e", + "0x150a8756315244147c3a01ccf5f5a589129a1538", + "0x82d5f8e1fbc73e1e2a8e074b8934bd997c6a17c8", + "0xeaebc5aa6dc6309a91cb8aebb434668b2412b6de", + "0xcec0e2214d43f8245c1302904c02d666fc65e6bc", + "0x00b15c6bf6beaf95e7658bcf9cba66180c03b773", + "0x4167486bed0a059090a56744eb5e892f8b75f2e4", + "0x8de3c3891268502f77db7e876d727257dec0f852", + "0x41f0856c2214ce3b2b21e9f832808a9152052d72", + "0x1c9a60f242fa2821c3235d5d7e2c61d341d7294c", + "0xbb457b514d156f771d87ae15f422a32e2782cf1e", + "0x285e34e1b69b710836bfcd5b34bcee2aa8e16f88", + "0xec7f68e192b8fdfa259cb9dc07d207ad8ff8945d", + "0x8712c3809f29b933e3d0742a277ad0e4ab8dc4f3", + "0xa5efea3ab837add97963fc43a1754dac3ad4cfa5", + "0x4d60f624b3da62af4365f13482ce488c325f8b0a", + "0x200bd1b8fdf680cfd6753ee51a8697873f4f3575", + "0x4aaa5abe30cfdb6682a69fda5067e61030c6fd98", + "0x32458e91c415f7aea429ee259d21bacda53a6448", + "0xe49cb74fa25772f52a2b2d39d1d59d51f228ac15", + "0x028d0ffb68c47008d6a985dc878aa813f07a3468", + "0x6e357e85b6fa59f9b19716efefb5744b6ec0886d", + "0x0f865446511c1f0540339932e4cb79bf31603adb", + "0x10794f61f3e47f70270552b8a757a0a250b8d572", + "0xcd8d86e0722107f342dd394136775ced500042c8", + "0x9a4f7a7a05dae8879065fd84db0788c847b86543", + "0x75496e6ba1908eec8ef32d7fb8f38f791bf86c29", + "0x33ca4b30a47929d6a7b3815c5e9372b1a06c1931", + "0xc29ffb23abae4d7950d7f1e008019caf513f5078", + "0x67a89ed0d75c30bfed817c009e46005369adc757", + "0x580889b3e332ea0ed2c68fc2cc7cbfa3449bf7ad", + "0xf2f341997598bb0e2980e5bf9e19dd7687f48355", + "0xdb04e6d81d018d91b9d996bc2bbc81a568594818", + "0xba8765802198e5c19f2ba8fe9b0da2b225927aaf", + "0xe427bb84eddc20653818d467e4b44f4e35263749", + "0x57b3c8623e43e4fb17d526179d10e0d8a4a81e53", + "0x81ad16bc7d117d9ad6e162947ef2d78ceadcb0e6", + "0x19832507d6e94d0c378c91b110f13372fbd52834", + "0x523559d588d40932310b60efe1fd2389e7f586e9", + "0xdb2f65b5cacfee8037e7af493632840257b82307", + "0x868ab76c5785a8b39894764397994820ebd7aa7a", + "0x37dd692561b7dd71c64865a7175e0726c2b4b206", + "0xe3877bcc0154fc3daaa037fdf51528182d80d43b", + "0x94bed07defd74ea1b9c2e763f4747579c554dee7", + "0x092b3eed5bb64e429b0e01c93c617fd1a8d0befc", + "0xb1544589b80fd26d84e33e470095116428b49dfa", + "0xc06bb1e75556ee33e8e09db1bec9a9c56fa6a5da", + "0x3803e6b6a99510496e8591ab50f8cfd6ebb3e0a3", + "0x57e631edc5e5e3e0c5e752557ebf1238c1527b0a", + "0x5e4016d8c70c3f87f39047ec43d24b48c67769b4", + "0x9770b6ca7555b933abd1ac3edfa4941ccc3ce85c", + "0xcc4c39b22a60c73f604f957cb8f7b572caa58820", + "0x05b985b6dfef61d0f5d5674b61f336ead8961930", + "0xfdcdbd143522352cb85a847fd42bc9da207e4fb1", + "0x03f4a0a7ec4a706263cc45cfd4b4e2109bdd5223", + "0x25bfb4440eabe6316568c1037ca15de16a3b55d0", + "0xef45d2ad5e0e01e4b57a6229b590c7982997ace8", + "0x47aeee64a48ecbae80070a19129ba942c5d8159b", + "0xb8e448911e23e6294779d2886fd00f29359dbe9b", + "0x947c1206890121d9dba303e0cbab2d0727e3c622", + "0x9a387bb2cd93a09d9f05bf05786c3a41c230190d", + "0x0764dc400c280ff2b6d1f0582969c0c668271340", + "0x96644bfd639667b3e182630c5e3bdcb5f7875c87", + "0x059aaf47009cffde5c45308186e4e5a039566120", + "0x491927f92586e39ba2bc1e8df1d0704b306ec890", + "0xa105ca9e4696c6dbf9c4236fd4411a49318c90fe", + "0xc5c1b96d0ab7e93e7cece53250e985f0216839ec", + "0x081426017bf3a62259179bb2840e67e0ec058fda", + "0x49fdfd5421b9e0cb12f6ca943a83f9a93393a385", + "0x2cf5029623ea5f00403591f4b513c3cd8ce33cab", + "0x9e136c1c6d31504f6b0af8cba2cd3f1ea77b2e2b", + "0x126e61f68e6e339333c0fd2a2242b5065fad831c", + "0xe10f1cbab32a12a9a8854b9e70dafc91bfbc0d0f", + "0x74c46217c8f079f8164607cf62b105f3df717904", + "0x8e9d93480ae6e08eb7f2d36d326716c9314dad40", + "0xe2297987f11001abb3226913a3e76d1126f3a186", + "0x20ec6112cab0430ab8420304ad45e1bc145fa1e4", + "0x57511d586ad667b7e5032dfb51acfcf41952e601", + "0x679ca5832144abe6a8facdcc4b7d8b2e81d6d89e", + "0x544e93c8cc446d4fd761d47c0ffcb1495fd86fc4", + "0xb8cf07daf00dbc270fc94928f93e8bf4c23587de", + "0x34cd24e8c8993e172491de9ce88b93f25c2dbb12", + "0x74592470329ff01e5c45b96cd000bcd2c27cd523", + "0xb4318bb6f2437952befcf15c69a41ffeff198a6d", + "0x87460d7ebfbbb8e59159ed81c57124d1b7cee2a4", + "0xfd6bb34b8fb0fa845328074c66a0b81bd90fb6e1", + "0x100ced942fdf6f2f7705a81044ad06d17a8a6079", + "0x7a26d77375d2e61c78cd70f9bbe50d7df72ebbed", + "0x509255b4e74792d8021be5e2754eb6ecc3448d17", + "0x9c99c638d1d7d02da24ddb46af6570455c8d7a1e", + "0x986dc25b8405d9fdc866eb3f0321776232a7fe31", + "0x60dcc76efe3a5c4f2728d92266b5345e76dbf5f0", + "0x2fb1dab80106127370e3742379af9151d764cba0", + "0x1f3db3c8d971209def82ca1a862b44ba43ea2937", + "0xc1efa4ff9acbe21111098c0817f6f42b3a70d61b", + "0xea675cdcf1fc5d4b0ad100a827fba8966c719071", + "0xe2dcfb3621fd1970b4289f1f8251c6d1efb9d0af", + "0x78c470f5e982b17bb9ca044c1c6a43b9c6145057", + "0xcc1e0a566dbd10869c071c811aba436357858f05", + "0xa8d3bb44160bfd79e157f5b00d5b816836823184", + "0x93ce2cfc1dff9c60f8840021ebb88f46ab972132", + "0xc8cd6ef6187ee64e0ad4cecaac938fd03ef3eda8", + "0x793d6260fa382a26ac6ab5fb6f9aa96f1f95b23b", + "0xa401df6ea0d0eb0aa98958662e0bb4bfa2589ce1", + "0xe28cede3b77d79e0405764d16ad8dc009f9727a8", + "0x82f91018eeb8feaec51e8097b8aa79e4efddcfa9", + "0x516d55bd4bfe233bf1d1fad7a521eb4c5fc68e81", + "0x2373812e8a9b47b0d530cb065a930b9eebae4e3f", + "0xac37afacb4a86d6548d734a49eaa085af8b9a475", + "0x9c85c8ef9121b35d0a34f2e5ef927ef6cf14a530", + "0x80f40ed437d2b597c04317badd9238ff7e2bf230", + "0x84dcc39b1559a96798e8f94c35e2445a11ac3627", + "0x8deae0b06687a3ab156f53e693d5d86e76ba0037", + "0x32802d8771a6572ec9ae6fbb932c520ca51b309c", + "0x24165947f458085152fb6794e47abced84486f30", + "0x84e6ff105b00bdc8953e2b19f85a3c104c8764d2", + "0x2455bb453173e71c296a618daf4b3bd7f87d345d", + "0x5a8a860f34dda53bd73cd3bc34554d0a0799505a", + "0xaeeca1f1911ceb3b052b38ee86dad35c543c88a0", + "0x551db350ee9adaa9b43335f1d464f0abdaa9bb24", + "0x1c669f370baa9b0bb3d9a592421f7246d32cba2e", + "0x6ef9bb653d722e76925b7f933099a8e6911327b2", + "0x4548314a5386cc0341f069808dece6e724ea9d07", + "0x17f343182b42d6488fc54b6ae73ac5da5ad4e326", + "0x831bd61e37e7407f9ff0968a7145bd918a1010b1", + "0xf4782e5b784d6e872ef8ed1ff29454c7bfd75190", + "0x27ed097b67db7661b86b8fe2871e041ad4478071", + "0x14e38e92a8f3f39ae41c519c4f124163bb53e18d", + "0xff62cc77a9b4fe4b659d3b0209351bddb1ebe4a7", + "0xa8d7683b90ca44eff978bf24cd49161b0017f41d", + "0x5b701f728241f16e909a43d8c9e5305e284f0a26", + "0xcb25f9c06fb97500e428b9d412a8909b16e27316", + "0xa23cb4244eada574159334bf50e6896aee3c9870", + "0xf66014a47a84f128dea3fbbbeaf985af575bdcc0", + "0x14d15f15f1151d82e0aa5f2443b7da68f981424c", + "0x8839f2ab732e2da43a510a6f032866bc97d7e09a", + "0x3e73b363036bddfedb2e026fbbf9bc77f76994b2", + "0x8a8a1bad1525aa0dcc8569544875bbb8ec34b996", + "0xca8958a3341dacacf62986d095b75c7291b1a1fb", + "0x2d25c7a574b7aaac6cc13c187a1d6c11eaa09c0c", + "0x936355dfc51a55126a3b6d0ede9a364e152f848c", + "0x1fe035948d8cb38fd0ba4babe3da6367ddf01a25", + "0x4b267f1f6c3411c493bc78ca82feafd0fb2e6231", + "0xcc6d66789076c8a0c3144661d683d04ac001a580", + "0x67b9412c53d10ae5e6fe627191fe042d0f54d28d", + "0x3b9547e1f40b73a9dc75f645a84a23a594d9f8f4", + "0x6459ea73a47c4153a608957f46f44645d0aaaf9d", + "0x90ca5825939438d034f7d35127f2b4a96cfa2004", + "0x5ed343945bec504fbfdf33f1a4e333c646ca01cd", + "0x999b0068e753e86011232bcc1f2cbfe71bbcce2d", + "0x57c3a90d0c8db66b9015e4d060655492f50ec925", + "0xf84975c731e88bd46c7017887b66c8e62efce9a3", + "0x7f838bfb647959fd3a0847403f3059f8908c2ab5", + "0xfd729ccb71863f3ff7e2aa92acb6940a21d64911", + "0x8f6fdf44912d910e6fb52aea56505e506d4f9b20", + "0x3ea4dc4faac530f42bb211f70bb8abcf20e1ab90", + "0x8974f73c4bd75db1c96a8fbfc8be59fa45a588d0", + "0xcfa7265c9cbbb11bf57e99994583c83101d9fa4c", + "0x03bd632f0302f3aeef050374247a7ef82d736e6e", + "0x1ff1fb67c332fa4491a71ac37d54a6ef35c2a49f", + "0xb4ad5aabb5bf325f870dc347d79c255dceaa1e88", + "0xf91b20739309040c93ecd70ae8a7dac4728d2fbc", + "0x04462710dc28038d62c8c3aa31280b4d3b4f466a", + "0x5a010c2f9182c03a2247b2daa9fe5033b727a06a", + "0x6e00376951b067cb3fe8525155be0c9757e83bd9", + "0x85c13bc4df3566a3e7981d00b6a7de7b014f0056", + "0x8afa27634e17e75e8f2a18dfd671b2d845ea3cf1", + "0x79ec2d060deff1236bcabe3a1d4b42659aeab3b7", + "0x69510cfe2f49d81cc5c2db5713e4dfe899b11f84", + "0x6ee5d03a3c7cec75383af85fb2c907ee079f2968", + "0x73b22872475566751491b2e0fe279e517253a5d4", + "0x9346f1d460cbc0fca01997f1e5940fd55675173d", + "0x3d07ef8dad32add5691dcd8b7776782dc8533d72", + "0x413a9c69df59288ef9a7ebe78a2033dd2f3e1af3", + "0x3fbc921bd2b54c7831f83cd405717bc0712394d4", + "0x0d083dcdd4c865cec8ebeb04e427bfc47956dad4", + "0x7d7d8baee84bca250fa1a61813ec2322f9f88751", + "0x4e01a50c9d23da444bbcdc7bf80a5cc54784ed3f", + "0x411d209e4874e00dd550de43190224515b28fafe", + "0x5293fd8f4ac3bdc775ab40fdb70c5bd23f8332bc", + "0x867e29c16a1b921676c0c201e1dce6626609cbf6", + "0xc40721151cd2ccce0efe76bfff4b610ef505c6fd", + "0x820f864e64051de7c621c3d33c7b78c576b3d361", + "0xfaeec5a917017beebbf8eb736e43caf34c79f748", + "0x1372fad277a786eb972837c66a8b4011779c7dbc", + "0x84f0df6d33b7df78befb8ddb815ecfa760fcf2c2", + "0x34d7cd49ff438cbcf432105d0138f9ca9b96051d", + "0xdd61dea1a9907719b8b597253a5575faec43c9d4", + "0x9c01b4a6a6ee9939dff9cee404cd2586a0ef99d8", + "0x171c1cf42c8e11589381f5e4846ffe4e2c7f6d95", + "0x07b473437f2d9045d7769b35fcece56c76781a7b", + "0x2f0970dbb18731dbf2240274e6353a8bc6f50a8c", + "0x149fe5da1acbe133eaaedfc0cb3ca5989c54d690", + "0x1c80e438cdadfe387f8558883e8d21995ba7904d", + "0xcafe26c2fbef3731b8eec196c2ead38e42e137e6", + "0x6fec6cb90d4bc025d5249f299d640d66fcbfb6eb", + "0xd2e62f4902a81d203e5ad214596da920b324ba32", + "0x4f695c0fc4d2e65a4f6ee9a053f9a980085622ce", + "0x91628188530f7b93919c81eb4d5dfe9d93ecb5be", + "0xd8b07984cc1c8223c8f5523b371d950aee2f329f", + "0x8c12c11ee42ccb87542cd7f9de428193bb939cb4", + "0xae1bfeacdea6477691ee850bcaeafb7d0c0e4c37", + "0xdb24b411d779fa68c9bda3491fa1fcbfd9964a34", + "0xda85b72091828f7dd6b5091f9d90e2686f4c169e", + "0x96e5058ebb86e367f8c9b9d9822345153cda79a7", + "0xd111886cb7eff60f390e8f4c4f7c288c21988d51", + "0x25b6db4c03f3de1186a7e7d0d910cd1b1eef2135", + "0xffdee5b9f67647037e6050024197af4d138e0ced", + "0xf57439b647b5d2ba7309b5b58eaadefa69238926", + "0x73975f92c0d594a8872bd329c46d0a8476867f96", + "0x892e23688731fa60edbc286994838895780b748d", + "0x0a02c91391298935dbd956c91f14b8272275efeb", + "0x0056ffa884895d41d4f09035dc1a686c372145c9", + "0x16ebd9e251514fde17a817712d73b17942762e7d", + "0xad8f57de223a9109954e20c85d6377016c9ae44b", + "0x7e7e4da5c72f012cf75c17273f366f3c0b4a5520", + "0xc30f9996ccd802ead447f6575af16f394769a091", + "0xe49806f5be7f3101843ac8af91a6aa47ecc0ef36", + "0xed69048310c973d46df3bfc290820f722cb2533b", + "0x097d2e56912f80e5a3e4c87d72f0bc38ca991cd5", + "0x8bbeca4d93ce618407dfe431990e6c0c74a0f71f", + "0x3af30125b7a81c23bd3608645c354cd02223224d", + "0xe9e2b6cbc67aeff885e840db6178cbac6f1578d5", + "0xe5ed87054cb0664ac2ae312a7315864b31125a63", + "0x7e5e83215dfec4ce07de2b6e97659a8992146a62", + "0xe896fd85639555d87b7b1d505a9f010e988a1b45", + "0x8b44ed1590839f28604a63302e593cedd57f6455", + "0x54f207807d7eaa11303eda5a285098d4b3fcb0ba", + "0x9fed6f5538ed3c6ed8810c132fa7c43c93414af2", + "0x52aee854eafea52bea3794c5c566f8890d4f682a", + "0x51e8c43d0ea1631405556d734e02fdaf7341ccf2", + "0x10ba242a091a7111bde8e29adebb2758c4de328d", + "0x3aef8c8c3bcfb75708a69aa9219917030e302cce", + "0xdc4b2051cb106d5de8601b36936a3da99c634c29", + "0x4c27b8943b355a7d7b402685b0c79f21d3b914b6", + "0xd05d9c16b666075649e52c767d0069c9f4f04aac", + "0xa3268edfd84415472d9c30ecdeba487f865ee063", + "0xe15be2c6771713077500d29634eb19d20bbb8bb1", + "0x3e1d268c8b1ba7d042968ab713467c5631831513", + "0x8d24aac6b5931f31a905c8ea08ff4eb5fc19cb93", + "0x6816bf1e88c5e0e8d3c45559f8733712f7a1012d", + "0x5cb42077d4e18354baae3ac0753174b0dbc7da76", + "0xf02f312e9dd016b3e24046b678725531a9a9630c", + "0x633182cfbb064c4cb7de960d37679c1f1c3032e3", + "0x5975d3c8a02c1c42dad4c99249e2965c8f56c0c3", + "0x78f19d646635c757efeb3abd5d99416b3cce8856", + "0x4f6975177e9717f97d20be2c7918f1cb430fc0a7", + "0x5f63a1c81161fa3ce367bef4c9a560b2f1a4b301", + "0x0438bdfbbd0023dbe4341276a3774f2a0eb9a069", + "0xda13c8a13058ca308a52834ba7df4ae8d2e26920", + "0xaa9e12edd2ac7cd6e0b5cbdf310aabf5280f5e6d", + "0x623869ab0ae8d9f718c6f630c57d6e0ceb956aa0", + "0x3f18b8b7ea6a6f6715de3b75434d45051b495b44", + "0x43d80f4b3b0d124a1d05ba783b35aa2afccd19ee", + "0xa00c92b092fa19c59ab1459b91c0c02d46d5e1a9", + "0x17100719622af22f28f1f398ef1221a1fb6d34ec", + "0x6f45d93de1b935e27579f6cc587122a30315660b", + "0xf54c942d5562b0b5e932d5155a9b896859e43ff2", + "0x8e7555228ca094c0220c85aeca0c80492787ae07", + "0x5fd4c806c4a63fb0dc6c8e0ff0481062c03623c4", + "0x2c7f521b0c790c850993a58b67fdde567edb0df7", + "0x8d3649626d2d95f31de3112a5fa48fa5b105db54", + "0xcfcffe706f54910dd3c98f9a7297b76bf663295d", + "0x9b912b3b744d2ae9664def50565e5c35ad8c2f6d", + "0x1359aa48328ad894fe19f88e8919a0c921e43c75", + "0x557ea0ed4275f8a5e5ef4f0699b46ab1c18fb0c4", + "0x305345edf7892b5ef893d2f3a14428578fa19d4f", + "0x0aa47e8155945160cea16c80bac22606eb57239e", + "0xfcf5ff5dcc238b774170608706e610e48686a3d4", + "0x93db7b5fb00a05fa15a1127a38ab6e80452b3f1d", + "0xf3c92723456b33857fe6ed826b84e02407674b8a", + "0xdfe9930e7f858aaefabb088e541c29e78f2cff09", + "0xb2811b953269ddf8c7d02bcbbc50aa3b45cfc0f3", + "0xc989fe4cf6ddb44d09b1f96546ab554d114ac540", + "0x64f88b9f976ae440cf04bea995a0184ef06e61b5", + "0x35734b5264bf2485f2e6bf535c547d6c33507ba3", + "0x1014a66402ff5b51d86a527da1dbe96343bd9d95", + "0x7349468cec28f6d7b18c6f522e02b3a9e67884c8", + "0xd8533d518b4a70d8f8a591ca34797d3cce5e1aff", + "0xe9929c08cd2670c83ed3ad2ef1591f92a3345295", + "0xa60fc40ff26440df345ce397b8e928758ca0c2bf", + "0x89e7bc3a33dd65a79de8ed91be4d917123b0fc10", + "0x164a8379198a8d7155a1f0eab9baa256078d378e", + "0x33cf0e5f716cbdf54f3413e187eb719fb1b67aca", + "0xd2c392084761cb6e44c544b6f39dcc001fde9775", + "0x89567c5aae019f6429ebe272cc149eef3efbb99c", + "0x11cbbaf090c85265c34079719738d481c2c67fd9", + "0xad9020d3518ed42d042b211bd0d03df86da52a94", + "0xf47e38e8824af6592ea5ebffa3e3068c9ac849ef", + "0xac4a02f7e4e587102cd31d264c6bb35146a80e19", + "0x7e926a05710f400b3d87c11e3ceca3e27eb6d744", + "0x0fb7701e8f6bceef29f114873731121b55fb7903", + "0x51f782e15fc62521c75281dd5e38c5ff1cca668f", + "0x0f713f9f7852738357724c0554d1dc6e4ce51351", + "0x10c40d50fee34a75252491447079a568b6ebdaf7", + "0x509bd9f946517531bce1a775c5a9eced3e101ba5", + "0x9e48c94af9806c5332f0cc07e7cd65e9705b68cf", + "0x834d19c0565f0a25dd479907d696c197930427e5", + "0xa8ac7c77179e396cd6f3e3a5d61701bf99055e08", + "0x2a812626c2838dccb53fde027fd4d6fc3f6d7ce7", + "0x2d56596ba7fd1cb4f8e2c1b8cc8c02921db4ccd0", + "0xa178d3e882894410904aafed459dcde9f6e66c95", + "0xe57301660870f6d54cedad78195718546ab144aa", + "0x709c6ddb4e609a39288c632e12cc7f7b98cdfd41", + "0x28c3710b2fff616576b2b5b1a56c5ce994731504", + "0x49952863e5d676e1dba415b1b5fee9f9eaf2c250", + "0x8737fa433ef40809c94b800c34f56d0a52d5c784", + "0xe906780daaa43656bb9abe1378d29d0e79b96f08", + "0x34f9c0b11e67d72ad65c41ff90a6989846f28c22", + "0xf6aa2d75a7c069c69485deb989b09624ffec377c", + "0x273d4c6f62b79ac79f42575a6fe8ef58764e072b", + "0x09598a4de95604ffa149c799f2b15aa1f8a5b0e6", + "0x2600a539b907cc897736c9059f6b2d4941adf37b", + "0xfb0672f48f9b518ca188a3a44b011ed3b7e7aee3", + "0x0dd83567197b6db7d137ca7ae86d5bae7c30c4ec", + "0x17e062e6cdecd51fdb61f99689c86eb8b71f8b40", + "0x301d3e628e4803dd6c6cb38d50b93ce7b8bfc9d3", + "0x8c6d2a0b184c1f4354af7a6ab46cce0ca4e2e0b9", + "0x569daaa3176c82daccbeb26804dfff11ec460f0e", + "0x31923d31c5f5e8e5f77c4b40d35ccaed78f76c55", + "0xc72814f93934eba9fe6c1466cdb281edae87c8dd", + "0x770b67b46ce96452e711c77473b7e2d6193560e2", + "0x9caa59086f7db8f8eec6b326ce578dc09b78fabc", + "0x98ec3de89799be76552f8873907028c01a0eccf0", + "0xdc3cc83eba1958de11b0f33a60460145c56ec88b", + "0x79eaf7465cccd6f314953b6d76c81609d0363f64", + "0x7e9b39b35a1172f8ade4e987d46e920583ca4b82", + "0x77d05444a167ab7bdf35cff5c372362edb3f5db2", + "0x674f357be1c16b6e7e29e1ecf3565fe876d7f5eb", + "0x2521447641fa3454370cafd4d187195eba9dfd5e", + "0x8a7db179f3c451c0e971c13770a1f0a427d02be3", + "0x7ac9c9135de57041095103d2aa8b5be31b9aa415", + "0xf7ee2a3c6b1c7cf041c1b0a22c7ea484936515a4", + "0x08f40c7ca9f1920b2d7d68befd5f22cd2d01ea7e", + "0x042f1026a1c813a347f83e8a54f4ee1183ffb2c0", + "0x02432113d42fe8038844f4090db89305c780e4ea", + "0xeb409076976b1cb820e78f73e4302e78f0eea4fc", + "0xe6d039b7c3da86b4af2e81f63baab77c9d38839f", + "0x6a6dd8d75a8b8c34592b6e4287139616c61ec77e", + "0x6f0944cd838f333cc56ba5f71bb84f487b83dfa5", + "0x49dd7fad85119c754e7ce934fe5b70caae934e8c", + "0x23100eabad671abe4c6e73ce2b338095ece6453e", + "0x00aa9421b0ce8ba6510894296794529e58a3f27d", + "0xce6d969048f64bd13c1aef81e7b95b6fd0dcc192", + "0xec7bcb48321e461a97a1b36558fec05424779d58", + "0xaff5ef3897ac721b30a6d94442cf7989796d8396", + "0xd7be85819bfbfeb16d4e7841ed56dce4dfda15d8", + "0x4e57e6da2afa5d552d5f4241689890501d8dab8c", + "0x4f41ebd5c7ef43d7145c6c3a38926e4773737ac7", + "0x6ea87e3278f7fd4bc0383a87bc5e6a890712aa57", + "0xa1c60eee00404085b4ebbd2f2cc876108988e9ff", + "0x411d10601e0eb66cb09ce85d6962b6e84dff6e5e", + "0x9b8645313c40c59354b34f1c2f76dfaf66da6daa", + "0x7d98834338b935be46b624a8097936c1b5142884", + "0xbb35792372de8559081e3072c45c910504fac720", + "0xbd8f09b3e170c9b5759054509367816cb50ecae0", + "0xa015239d0f3dab85c389c6392d70e5416cdd8812", + "0x34b9b3a88dd51f4c272fcfad63fee859a778ec0f", + "0x6ac871973782aacf21e64f9fef8bc2fb5b922cd5", + "0x074d281b8c34ef7a479212c4cc32449152243d68", + "0xb0e8ceb70e9666fd770dc0b8c4f7644f920a2387", + "0x81b313528a85edde4ae50bdd7482881f38f6450a", + "0x2e65096411c4aabe259bebad8f62667673fd8786", + "0x95c12917332439bc620fe119d1376d14388a5ff7", + "0xec055edf494c234ebc8b5dc23f8367bd2ebda087", + "0x22b908c2fea7a1e6043ffcdbc77d660d4d326961", + "0x308e0ee9ade1859dbe13762ec9f7947ea601bf6f", + "0x552f8c0f13fe0bb9c6b6922626d54c917dc6806d", + "0xab501997f3d9f929f0a5f5278ef7403b50693674", + "0xc3b5bb14a18e3ca32929162f49a1a10f12f686a0", + "0x9ef837b001d46fbed09e9b057f7ba35943d13eaf", + "0x4c5e10b57b3d792a416f0b40c25df84ce82a773a", + "0xc28776ce1711914449e05e122b74fea392d90ef3", + "0xc7297a1f2e86df5bd05fe5a45d3931b07a6daf49", + "0xea24918a807399a819b74e30baa05f0375ecdbbd", + "0xb59e4a54e212fe89c6995a0050de738dd7c2b9ed", + "0xa86b6b036d8f9ae6609d2431f4755bf18fba089b", + "0x9ab53d3b0851b8714c15073fafa3497c4454b2f8", + "0x87634aba2f484b6067cd72f10413a259a6bd4d47", + "0x8767c5124e80d6528bd3d46067f0b68ab8e2dcb3", + "0xe5c46f93e361cc91172d718504a09816f2471dc4", + "0xd7d02f8f278f230beb6de6898a5d8492cf9ccb08", + "0xc5882f70e5e5cfd423f6783db34a0f9c5d12fdf7", + "0xddf931d3b729b27f35500d790f8ed2517c08d684", + "0x634775efe2d77ff787fa843a57e752b9bd515f41", + "0x19ce0e3ca61267f7c159b06e12f51c4dec6552ad", + "0xf52be03c49e503b3358b05ab78151da5b55adf6b", + "0x5f51244b1277970a947ef1d1cf88f35a5b78c8f8", + "0xaf0acc4cfa411f24d93f2c1ab593960699a23fc9", + "0xb256bb94bfe027688c73014add26dda7eaad2be0", + "0x0907b14771f2b04c5a4643e611d23f7e988bd35d", + "0x458fb539612cee4039d73db60ae72b9b34255014", + "0xd1c805676244085838262806ffb92b21421e5b8d", + "0x917f422593bfc677309d7c2146c7ee8b493f17cb", + "0xb7338951d8aaf32ec72e72aff962aa0ee315cc6b", + "0xa1acaddd259649d470b42c95738e5e89c8d8a233", + "0x64163973ecec0b18519d8225c81596d69b1b6cb5", + "0xfca66ffe8bf69bfa4d30244ce03ec59a0bcb6bd9", + "0x1e432b9f0d13cdcf59050aebf59f5ce54fff6ece", + "0x66ef1db60865a9d9effe2149ac2fbc9847e453f7", + "0x18486e63ea8bef057bef7456f577e8bb5f48d197", + "0xfffd1fb19d96197a5a1735f5cc0ef2eb96dad16e", + "0x8d8cef8db5e8d4807948a23b0ae491c6711cd712", + "0xbcfc66560def0c7ae11daf2acdee73fd1f149433", + "0x071507359b59cf78f1a1b2ebbd3b78cea7107b5c", + "0xf37922dea33ad6c9dbbe34b4c347589553dceee8", + "0x732ad9472237b6b9e526b9508ffa3714a977ac44", + "0x7b1fbdc7c90598a502d8d8d5dd726e011d0dc455", + "0x9d08b661592b20e3530eedce909d0a1b4cdc5512", + "0xffa0f764a4e7411298cefd937c6845407138008a", + "0x4671a9dea107bda99c387a8af391da56f7fcd045", + "0x1ff7c05ce92e8826e56d9e172a8f411d9615fbd3", + "0x5ad0d19b7f00544e9c923b71cbe482cb90eddffa", + "0x3588750c9c58864721122d4ad8b9e8a036063b45", + "0xedf0dc791a6e0b2b794b7fccc15be917b9bf9388", + "0x9d9ad3d9f9c747cce91ad2e32770b9ba4e0b1b96", + "0x070e68326e50758b7f7d52ee36b1fdf2b7968d11", + "0x5b51e2376a385e059e4d74aaca03546d55af491a", + "0x235b582e48fa6e58c3b8a0096e5ca6f495b3abab", + "0x7ada2664e7e1b148d198f03ac23dadc252b3617e", + "0x606c82a53bdffe33ad07de2899ab60201dfc8e43", + "0x4c775ac105c060132b9c55533d997bc2a0a54572", + "0xdb2b74662d01a08d7815341bd41a169b750dcb57", + "0x6b6cdfb65881c670851ee46d96545d3c94d4fa3e", + "0xd87b995944ccc90b3a16fa9b5afbd9579f82064d", + "0x1d3da3f89fcb6f8a83334c6380e248d1a2e4a817", + "0x1bdef9dc242a58bdc6dbabeab9a26721c0465521", + "0xe37b5fcf94105b59431adcb5b0d6808c3c4e64c1", + "0xc75e8dc49dc03a669565f2114e404a771fc71661", + "0x9402f3a55c5d47c64c69e5655f4aaa574ad01253", + "0x403ecfa800ce17640bdc169169720b7bf7e06a2b", + "0xbf96bbd55b91dffe38d711ab5fd25d6497b8111b", + "0x2c1279d7514dc44641758467c420ca095753f022", + "0xbc4d92b739b03685c64c9070b28bcfcbedffc87b", + "0x52536568628c48c1dd83e13fa4621db5e38b2829", + "0x4c1cfa3ea3ad8fdd69c9779b741f97c3b21614c4", + "0xe8a39ae1ee58cfdfd2505ebf0e059a04877581b5", + "0x483ca9370064ba03200fade3b37603eb8cf464c6", + "0x94eb4aa7f2341063735b98178be2c54805865c3e", + "0xdbbdda31b445066ad36480fe3a9209b1fd6dbbeb", + "0xc6543f0b6c5988b1567dff41c5beb4c3de934939", + "0x63eb875a75a07bd33de3709ef7c8f46489edf0b9", + "0xa08d36b290cb54f6c2714c8d2413506cc9e353ef", + "0x5e3e00edd28dfd815a1858279203cf294f4ca86d", + "0x5d67198acb9cea356fbe1e0b31a8cf21113b3592", + "0x5930eb7a42a17a81da80700a2dba5b2ba5f1715c", + "0x2bb5963b2eda16d5254d6bde3f5e2c63b07e793a", + "0x213c90cc910d9229144d800f0786332fdb28607b", + "0xad0c79fe127d5c15750ef29d9b0575c49be4afbe", + "0x37c7d702d9766f8bd81a6d717c6e1fb51f8a9753", + "0x33aa887cd070eeba4ee3b60372cbbf8e2f793c82", + "0x391eb5831b849e70883f1bf51f99f47c92b3fb23", + "0x7207bd8b627bb5652bb4d0cf2a1909a1f7e348d3", + "0x2dd4c68737f3a8e5af57143f3d9446a1308589f5", + "0xc4d3a474964fd6967d006a0301ffd1d34c544155", + "0x6be2fdeb238d884ee0f96f9805cde2c3a0851a4a", + "0x37054a47fdc614c688b431cd9664a010f4617b6a", + "0x5b30d3bb3fe0607739122c8c00acaf57b241757f", + "0x0cb006f947a1abe3dc598d011dbc2fa27ce0607e", + "0xbfd58ff411ff48996e0853b01d6c66ffff79d7d1", + "0x019b4e80a319da3916de5b1dfc5b40d2a017fcc2", + "0x21163bd244442b2aa3b0b42f359a6231ce87f28c", + "0xc99585cb22a33c167512b3a0bd874f4dbf3fd1cc", + "0x8e35b44d2ccea5d291f23518f9289f819f49cbcb", + "0xb00ee9943a89124d27408b2efacc81532d1b4b42", + "0x832b66b0e15cd370f6804e3130243b8acf204761", + "0xe4082aacded950c0f21febac03aa6f48d15cd58d", + "0xf7a53fe823305e70380a8a3ef667549d5f5c7075", + "0xfef128d15a07150ec7e6d14a0e79f4f88b7b2126", + "0x0c1897122df1f7dffabc1b6ebd3bfceb8242d1f7", + "0x93d3d54c200220d1929b6353530275209a2a293d", + "0x790d0280e68bd7459f6e4971c0d7c2e469218630", + "0x5c2e5ee1dbf869571f0aeaf4d9fa63a6f8b19ccf", + "0x35f753b12f5cc25579c5ea711c59d7d9363b9053", + "0x7c6c60ea07496ba51292abac22d1818f0126fb5d", + "0x59c473c0e383f5faa34252416f76f5bb877a8e77", + "0xf3f2e7887d8c9163ea170e4d8c986f3dae1fd83a", + "0xdbdcb91d2566012ffca1c757f710475bc04afe85", + "0x60865e95697905e399d5fc7c4f9cd6e11ec72076", + "0x107dc1068648713f2f17099d4e90d294fb898ce0", + "0x9f563a673704439f7776766c840ef6a3b4222e7b", + "0xf86d4b3807bebbb3910c5a36817f4eb2fd769e55", + "0x77446fcae8951b0b09905497ea6e686907dcae93", + "0xd45af12cdae9044f73085a1e5b1e08a8fd10fdfa", + "0x372815b1ca312e5b799674b46f28300fefaf6adf", + "0x1eaad4b39494325057ddf312875d0fa7c4b76087", + "0x5e8d2873ce94013335238132c0ebb5b9f20341a3", + "0xf946cdaecf5a15440e500e61a0c1d179a93652ad", + "0x48cc15e7289e2ed44eb8fd1460064418735e9698", + "0x03563e9cb4d0f7634855e1a02437b9823511f009", + "0x0a0de63a1973957ca4eaa54665313704acbf322a", + "0x1c5f8e79177fa81e08d1f750111e95c543f55f4d", + "0x47d150a76ed636fb42f6a974b60a5d85ccbdd9f0", + "0x612008970f99ba38e34428ff8edc2977c02478be", + "0xafb5f61fefdc9f39ad2c2db32433d1ca550e1ba6", + "0x1dd40bd9289c2cdfabe0b7ba44fd7b886a5b0c12", + "0x40259a6f49b8cdcc20379def06e9fabfc8e15bb1", + "0xae30b1636edfaf2c04af6e27198c5d492667a0f3", + "0xe63ba8c26dd2a36325cf6e218f1025d746f9a3d4", + "0x91b9d441ddbe32c21185c214d8a1b0951562c1af", + "0x5f90e3b398c42a4d9ddb1937d8358c79fd04de8c", + "0x56bd01f48998b08722270c2aeeea1b68ad63cee7", + "0x496a239bdc7fd17260f254130162d4b9f8b41cdd", + "0xb6379ca4cd12fa938250e89446bcf3f7d84a48f4", + "0x9faf2006efaf370fc19881f143db923f45904f17", + "0xefb6afbd3967487a86d8e09330a8f0af91c39a82", + "0xb1945c56460cde971abb853b3bd7c1ab0d09b399", + "0x94825806e2eb0810548d9cf6b5198936561db0df", + "0x97e5e4276fa72aba91fa5fa26771c166680e96d3", + "0xb89701ed7d8bd1cc981791250c8ac336d730b7fb", + "0xee03e747db6cd0e5b1f17c5ed95627203ce9c84e", + "0x88d3e5d794c36e64f805964021ff8f2a7c999f5e", + "0x16d786614466510c0930642f62f1b391e26e9be1", + "0x1202141b5ac1280a448822559de8e11046b92ec6", + "0xe785eb15138c674d59276565da54a0cf2afc2de8", + "0x3179dc11df05e979688b42b5b6cb7b368a4e9e13", + "0xad773aa6de26e9193c953bcfe5f30878bf711a18", + "0x6789d8b05aa37c11c73ccdb351266e6e8cc744a9", + "0x296054cf5caf5abadee75aa043acf75c795b0d33", + "0x27b8925c8d8174cf3849ebcb21572a04134a81fb", + "0x6e8c1c109c34f60a2ff45fbf4422a835888d6ff5", + "0x41ef5dc456827a55331d8243af4edd6f18433c59", + "0x1baa3d15c29fedb2047f836113bf25a1f9aaeccf", + "0x10a29476c63f4541b0369bf3fde5f9041bb708d8", + "0x3db8e41fd1cfe0b1a97534a9f86b03c98db4d93f", + "0xd5fdc7790ca6a881e5067bc0d73406de1e2dc59e", + "0x5f153d9900de9b16f51ed80663e4d1a4adfad5e4", + "0xf61cb2c830e562e6dfdecf3a2b383f456e6fc1e0", + "0x2d73f60d42bf384bfbe1c82f3790b9bdf73608b7", + "0x2fb0d6c0a1ff00472c8d4f244752862a8fedeee0", + "0x9c2d57e116ea5a4fa8e50eacce18dbb3750078d9", + "0xe68a215b8dd829c1fa8096d4dff74ba9972a93e3", + "0x8b6bbe943259e12885529e4d340a0a5822f8d337", + "0x98fe3066939e3c13c6744916218b296f7beeee36", + "0xe4b0ab2d5a6c7af379855669dc2785a2a4a51d2a", + "0x340e3c435c1fb779b76755b9c678105c21498216", + "0xb431d0163b259887320fac713d64e7bfd6341d76", + "0xee992deef1914510169c86daa4c2abcdc7f1a89f", + "0x0a4ba52fab4c8970ce762f4c692a50319c0342cf", + "0xd7fa98eab4ea546f4e462fdf733d486d12eea44f", + "0xcdbc4644009df7b4e2833c40230258c94f3280c5", + "0x8ad784368c467bd35f360a8d9e56f34a22bf5a13", + "0xed0de105df9bc445074f54b509a94afb9e059226", + "0x1e429015c181f6b54020bb0e894113566f57bbd0", + "0xaaadafcb5b5ed438b4c679c157246125f405b588", + "0xaf798d139045d88c5584027bd3c24a7efa3d51a8", + "0x4c792f11d84fa399e23721dcb20a17f042cbcf44", + "0x3d72486987ff62e45b598c5f34d0646452098c21", + "0x6623c3c0b5bb0a38af41427440c516c4d45493c7", + "0x40e64e901284d3ea05d23925878abd0cd42a3ad2", + "0xb7a3e33a76c359349a2aed0a7833dcdb3e2d8337", + "0x848bc0795621f3b29a794b26f80f3058b72e43a7", + "0xc34903f2c89017e2e13ae0437fafceb359de5de2", + "0x5e36c58c28150c49b34a589abda47b77624cbf11", + "0x33c91c428f9e50214bc34592ba9de3c08adedd95", + "0x8bda186a0873ccb110f9c08c2cf288ee5b4c12ce", + "0xbc00ae2c0663eff359a1008ccd60923f67e37625", + "0xc86fd78a9d5ade54f76c5a11fdac1642fa307946", + "0xcd0d4359a2bfd755e0b70103499dd5990c647089", + "0x67b00d6dae6316a8099578b4f13d6c2a214e1b31", + "0xde53532d14a0699d5fbf6fdd260a24de410d8d55", + "0x99645a9761da8586e134af9827cd06ce78e25be3", + "0xfc33d4910860258495f63cd79bb91354bf8bbb96", + "0xf2fed8289112559a8bc0d9cde30e6ebcfbc81757", + "0x1aa28ec10b3122c4c11153e95ec2ddd5b9bff07f", + "0x4e8d2e84140d4dcc3248ccbbcb906747a8c3640b", + "0x88ee8692adfc54798c2190c1e68612f75ab15618", + "0x708cb4d3abf306f0c8ec15750948410d1636fd4b", + "0x5c209b41508a2c31323c14e0c3006dc95ed68a06", + "0x5252407c324b0ded782f57f4b5a6ed819ce98ff9", + "0x6b8ceb151eeaa1a953d2c8fecd05416bb57c49be", + "0x494bd3405cdbb47ae022751ce90ce694c5fdd176", + "0xb1364a47e22d47a49f75c5e5d90b537a016170ab", + "0xbcef923d76c3a4c67218f276824c0f7d494d55f1", + "0x0ddf75192ed4a08789fa3e29d9399639499fc5e4", + "0x4a9913a900866e6c711da9256d5576b24bec584d", + "0x274af61a316678a84aabacc4a6cf6881e9413b3b", + "0xe4969b0ff76547df9c170a24bb27d2bbc7169c03", + "0x29fa57339cfbeb118ba3a90d5888c2d2d6201de6", + "0x9d2a14d803549f2a3fa35e1c4216876b153a00dd", + "0x5f696426b382608e32bcfb0afb3b786242cf4f79", + "0xa94fd4847466b938578c7cd14ced133c63344cf4", + "0x586df9d1f9784aeae671939680e4cc41cb93e45c", + "0xdd3f9005e5c045d7515b3beb4ff92fda1df8cd9b", + "0x254f07a28301c519ab3d34f5265c8e03eefccdb5", + "0xd5588b5c4cd73417ce75e80edd7d016133370d5c", + "0xf9010472cf3f03851900ba9107368287c770e76a", + "0x0146a3824a58ede5cf76a2752111cecbd130d5a9", + "0xc376ecff7b4b82c8b0a53a3043a0bc0b94c61ac3", + "0x46a383b8eb756533f9ec14ea5f80433c43dfdc54", + "0x54303d8fdc4b61d36d16a6c0ac779852e964c3b0", + "0x6bd0d276de9eda6cb49a50a1579ee47a0988fcf1", + "0x56209a886c507f8725c822b2b1f77ef4c9dc853c", + "0x3aa8a03a63b9f9e2e750ff6e1a694ef9e793a284", + "0x816d68773b5ce95278900fb5130bacfa4b95c0d6", + "0x35b0f6fbe08a3c7a1e412a514e9e02f85d01c1a4", + "0x0e36d0e362f7ab27bfe69de39eaee2cb4c0a68ab", + "0xedcbc0444ea5831b2471a4b880bd1c903e9372d0", + "0xb323d1e1e1da6ce5c7e01a018bf2a43a42a9af35", + "0xb86d17f42d9d3e5b6b2dfa08e7757e1a5b7c0aff", + "0xa103c7d43c5049ea8e2c94e54b6df7dba993d150", + "0xfab23321bd4d8a1ef97e2a0354a41f00a22b43a2", + "0x051fcfc4c6a1b0b56a4772def5be8220503e44d6", + "0xcb874315a2137a6a126788759dece0af7daa8dce", + "0x479b3ebd01acf38a0c5da8154bae4fc491070cd9", + "0x9cd73ea40d13fa99a107d9afca588a9ef45e3a64", + "0x288b5a3d1ea6ee60bfe39a568eb2f1973c8878be", + "0x0167767e7ffabd6e9fe1f958535bf296622d4b21", + "0x9d0d47ea738f1067ce8c0250ccb3d173e41bd370", + "0x607d87d91ac54964ae3a8c084e87a33a98fdcfeb", + "0x1b278d0f433d73b52a3fe49755e1cb4a8e306d9a", + "0x040e14eed2f64c7657d855614c7d4beb24a1a1fc", + "0xc4483e6bf74b9be61aa2f5cf19c70fd37582ae1c", + "0xfda5dfbc7d508bd831b7b2d9853349bc4280bf70", + "0x20732dd82900c1b651dec43003faa649c7f4201e", + "0x48d84effbf6d02e17a7621f953c74c32ce3c302f", + "0xed785b92998b1b0fcee87a4e04582b818a27c8b0", + "0x66ddc449890994fe3dafc6f52c0b4f7cc5b8ce68", + "0x2fc9fe89158bf2facca1427c2b13b0cec88aaa5a", + "0xd60e915f4c3fbdc8ba5368dba193b8d4194c442b", + "0xafe764e08a355df56a8014ecb8712cd18ee96684", + "0xd269f289291c9fb3a65093f6103200b1429b73c2", + "0xa20cdaecdca93fb8e355a44604175b62dfe31913", + "0xcebe53129d3c57e738633c861ff0b05a612f06ec", + "0xa040e147db8aaa7fa3f3d38e44d15e9ce847a5b5", + "0x91073348eb2fb632248e72d5b677366ede8c930c", + "0x4c4ba53d5c0428aec26dd1ef7d7c9cb90cc10df9", + "0x05b4ce71ad63198df32cdc3232d3a22af9f0458e", + "0x2ae3d8e5481216ceec056ccd16cb84edda55a822", + "0xf5e03b5a33f5638b8e5a19fdfbde081ddb1f928a", + "0xb6d4c836d329d5f44d4ad2df74aec23156ef85a7", + "0x408d2eb46bd8416cd5d7a422d8779783444e0ab1", + "0x6711f99baa4a8594880b531f0d7940f9940901e1", + "0xc9f5d78878734733b4a4aac413b63864cb889cd1", + "0x5969cd56e37fa5cef0d61b6395a8a7f67305301b", + "0x8fa65ab445ace57b25b3c5f3a3b1f799d59227e2", + "0x583b275f2e8a5418aca34a4ccb1739fdd4789273", + "0xdb2c52aaa060852e6fe6ed628c6e08e46c13bc1f", + "0xefc5ff84594ebf147dceaeb5c41079672cf0d85c", + "0xa04828b3ba04ab731cbb7bce3b83ec8db376a44c", + "0xb43e50096c27905484e2ab1baf0cbe899dbad280", + "0x6ed05c5230a3124056f85470f30269970dbf38c0", + "0x627c97c681bde5494a34ad6c6d84741556791b82", + "0x341b5cffb14b2e782f01617fa2072381b9ee18d3", + "0x2d80ba1ed49818fb6d535c306a0bb50464a5b2b1", + "0x5ea1fc3e280154a4785e76e744140b613f6ea3db", + "0xe40de5b029c1991b9904b6e079f7c5fec8a66ea4", + "0x815486474b5402720e6731d30f2a8790f5af76e3", + "0x61ca13b0560d992902bec7554c096a7f24eccb46", + "0x4f0c7122508db9fcda9a2c81f03364ccf4a54382", + "0x0975419db5281960229c521e07ee89ce5691261f", + "0xc501af47bc462dbf3276e8a8b2d7927ad8e34223", + "0x52239dfae4bee0d12afdf53ee30f2eb512e39cbb", + "0xc43936822e3c86e4ba063b7ea1dbdc45deb295d7", + "0x18f25ecf2d37dab8c7d480cbaa1450e89eaedb9e", + "0xd8d6c7618643fffc7188b37dd6c04f373c230e14", + "0x6d6803fba7ca68914800885604b26af2233158ac", + "0x9db3f35966f046763404eaff6b4de979ae94b481", + "0x4c3914ce2381d1f8cafb4efc363325fd54ee5ee3", + "0x006f28111cdccd261f637e954c76cf45883e15f5", + "0xf7894f08f816ec2741563cb63861da6e63a3d8dd", + "0xfd8f03fd2198aa6adbcd6f7be1d069facc955891", + "0xa5c0f1328ddb891be27789437d6c50cc0bb08129", + "0x50c716d98898bdb512dd7c5ba0aadaf4a70cc672", + "0x4814cfffaf9ed438afd9b1a51558d10ebcd44652", + "0x6062c90dea64db97c5f5e18ca88beedb83f76ebd", + "0xafc413f4e96cfd642b581acb363ccb2c433e066e", + "0x007b12a3b1a8d5a9fd0df47174bba6e89bbdd217", + "0xf4feecbf6c0361baed74277564cabf72822d7e54", + "0x7c8d2d8bcfffcd48dbcb65c5bb7588b66dcd22bb", + "0xb213cb1534a563271e44dc255193a407c161f03f", + "0x5b78f06123ee99dc8b21d4e1ef51afe08059d5ec", + "0x950c1b2359df7f06ba0b8f2d079f71002d47d606", + "0x17c06ba8b4f4d2724e3b46f0c45b7b2e297f3803", + "0xe978df165ff2fa9d3f496615f7bf961771ca4e32", + "0x30a20b0281df39e6337c3cbe5865e6fdcdcce3f1", + "0xf1d60657dfcce27639a1dcbc0005e7453b045c6c", + "0xd6a1e92199ff73b261be8a3e2f66d88188b3b4b3", + "0x6f831aacd23f49148683bba258bbb59f67c6d59e", + "0xdefc97de484ed149190ec18ea181be40ffcef5b1", + "0x39e836ecf51e638f30b7cdf984dd104b1d5dff73", + "0x18fc0099cc649f53825f60fdda5f10f68965ed0f", + "0xa17e7682b8a611045464e6cc282d74851a648a66", + "0xab70471832614f8b181a9eaf519e61e968a0ac3a", + "0x3b1f17e6aac82b535488121980e8ded682b8ac96", + "0xc3e9221e0d693d353b4208132fba0df2824048f8", + "0xc38cef0050eee886ff11ee584f55c1cb94057b97", + "0x96433170c3a1f3a499dd5c1282f965729020e70a", + "0x471d0f69e9beee118b26df912ad5784f49a0985f", + "0xd47b772b418d0b5077ee9a55139f914b0f74e168", + "0xe4211baaa7af8b5c9c59032e94c18902d52cfe59", + "0xe8055f7515df22731e2e0ae347b83abb16303b3b", + "0x6ac89b5f0571f9b0fd83b4129bd21fe0e028802e", + "0xf46d36a35eca074dac347bab4f70d969e8cbce59", + "0x1ab097474fe82108670c7d1309caac874fc98edf", + "0xcaa2d352a4afd32ec09779439011c8bfc6da5d03", + "0xcccd9a8d8ef7e377b2bb6c9399f4960ab1251621", + "0x1b081542303d27a705fcff9512b45c58dd7dc4a9", + "0x733a77d7fadcf46cbdab1a69ab87958524f1395c", + "0xc0b961945c5832253c70bc346683f3be3f566376", + "0x0999ec2f80aae3df224809b88a13fe589340a672", + "0x2167f01a9ee1f8b7b0564b86daf420122549d032", + "0xdbdbb811bd567c1a2ac50159b46583caa494d055", + "0xa817d17b0b449d5ed7946a4645fff3d17eed82cb", + "0xe040369d25e32069145024123554ca98ae84eaae", + "0x8a96d1a56da6dd66c27040c1024234efc75c7cc1", + "0x3dd1b351cb625b5edfc92c4975bed22ef028e942", + "0xa61ab19735e925c980ec31504ea4db88480b515c", + "0xb923d497954e832ff193e1a52e0ff995cc10e41d", + "0x318cd77ceb47ac6d67838ee1ed373c832f3536ed", + "0x7650376ad17592801bb2cc73bc08f4e777dea7f5", + "0x55d8a4abba8ce97a11825e530f03a95d792b7012", + "0x2d445efd48c1cd1a4c3956bc6ebd2017613b71d3", + "0x98b1351f0eaeed57cb462f565044cd6b95a252aa", + "0x0c9075a7e09aae69b9e20839cb082af2dd6101d5", + "0x2d68c7cd9bc0214508e2777c554c4051d9b67345", + "0x94da628b4b562152d9a25a6926a64d55148b83c9", + "0xdd046ca033c773850073c36cce14d0acab9842f7", + "0x7b0062dbe18a9427db8739f6000bd707765ceda9", + "0x4b67864d37b3703cc848213903481448595145d9", + "0xf35db530c0416106b749c301176155c04e3c684d", + "0xa4e3a720d3bc466309a4d485ba7c11e9fd32d8eb", + "0x53b1c065818827969e79d8be0ea0a79e827b3797", + "0x97cfdade0216433df7dd4a1ea324ea65fa31f6f3", + "0x4f50d47d20380172746527bbeaa274940c38efac", + "0x262395ac9f778453b34f98b6ebe742669551eba8", + "0x322b46c1ebf5df2f319ddc7c7d208e94faf56f30", + "0xad51c8d58bf95e1decc0d569172749412442aa72", + "0x71ba0a0bb6d3c80a4610aac49e11b80e638d7baf", + "0xa500ce5be001df63785790aa2deeaf986794de29", + "0x8e4d30edddf2a6d20182089e7d92e03805f58155", + "0xd38cc34bcbcea8b169c18044af8100a411e2dea5", + "0xdf1a7f5a513abdd51f0669c3797261d5a5749523", + "0xcb4b45d5d3ff1910e91116af5c8c4408d0d2a32e", + "0x0a68a5dc0f55acdfda8b2a6dc98c35e1e884757b", + "0x4678b9ff6ee530fe2d0ec25ec2f0f768a9e333b5", + "0xa86ebd2a1d068a653e3aa018cc28877658a24cac", + "0x0b4c6a70f555ba97cf43cacdfde0af2b9c35753e", + "0x8309b36c3a857cd5c8aee529243452b518f17673", + "0x98071fc469cf2fdce21c4a9d06db0bca1a22a07a", + "0xb54cbab367225e0a5f46f06460ce184874c8afa2", + "0xda0057326b6e144c7af4c8d54b796923ff9ed339", + "0x1532ab9dc951b16831481548cfa649358bde69b2", + "0xcaa4f65876ca0962d071c8b97faf7554c71fd53e", + "0xc35aab030e2ccbaefb87363b7abd0aa6549a2aa3", + "0x272568528a7361e61c121033fbcd91f98430c1cd", + "0x109e4fd913a546a0736aa8c6fbe40fdd10268522", + "0x69fb9b3f7b1cab5f3fbe1e8830988f76590ee4e6", + "0x7fda91c2436de3ed05e7b59a6ec22339aecefc20", + "0x140e173819722cfa2751910dfe217bc677df9a5c", + "0x5c00b36f95bb3719a66c2f36faa36b6a4e30965e", + "0x5081f4a75e2042c62773fbaf7f11b2a38ae73e41", + "0xe807c61237467befa164c35eeb50166549f765df", + "0xfb5eff4440d446f84796c0e2c133b78e47d7570e", + "0xc42587d4ca9ffced65115b4c5e25127379c82299", + "0x6a39f2ff79c4e2824fcf30c0cca9cc7e0e3b3e9c", + "0x169dde50fe1b02ddf59eeb199ba4182d0893f42d", + "0x1f2b74ad67b407b6f6866bcb4f1eb308b9a3cacb", + "0x9ef171a8c62eea6455830bde5de99db5a7ca5119", + "0xb2ac172411e9e36806e9933733ab382a7c3a0eeb", + "0xfda1215797d29414e588b2e62fc390ee2949aaaa", + "0xef65dce09faa9c81c1c9f189d288ae34dfe6f736", + "0xd76a9cba16b91f4a5927bd496f20de108ff445a7", + "0x3a645abbc55a6a77e7c424d7e64c289b00b6fa30", + "0xc59a0ca431216f10cd5c11831b9628182fa3ac3e", + "0xb1fedf0a9257bec0fffe0f9ee3f4b0050cb28f3a", + "0xa01c28cebcea47f26877995af0dd8a445f4adad5", + "0x0dd89655c6ee8d660c00667625434b53112bd32e", + "0xf6a5e9a047c0ab0da24e787740a83e26c6e09e2f", + "0x7423a7a87e1a773b25ad6346011d715ddf88b12d", + "0x10a9a1827e9fd404c1eb4043212225e0b24ab878", + "0x0375b252242501969e28cfd04a8ef7abb03a086c", + "0x69d6594841c5d7df2691690b7195c6875a2d2a9e", + "0xaa8f020d41e89257a0f7af411d2b3f9fcd607d7d", + "0x0f194e15f38b2277704ef8f2ac129967dff82ee6", + "0x6e684c88bfbb16dd8087a0231678fe766c557933", + "0x51e4fba5bfdbb385a03dd522450f99d4b1a09663", + "0x8745b967876ddc40c307bfe61028cfd19da84d6e", + "0x135f27b5b3470f0cfe11e942bcced7be4a4a8bc7", + "0xea5d417a92950d9a4c02ce3e46a0fb8c6f6023b3", + "0x185c9f392a87a448c6e88d3e863ef2cbbe29ceb4", + "0xaec0bae8714477df5be12062c6de580894470dbf", + "0x19fb3225b9512090a3b2d35cc516af77249fb650", + "0xa5bb17760256de21f2c399139615e0e748011aa9", + "0xedfc6299b8d9d261a8364b6f7bf88cdeb78cc912", + "0x9c0f498d69df554682e8bd8c0ec1d71fac76ec91", + "0x0fcdcc2985610113e998015b067264fc60328828", + "0x281a61b1a3c681b84ec391a547e01570c50825df", + "0x8530ddd0508148c12595f3bce669918ebe3b1432", + "0x32dde08053cc16e3529460f07cda2b9c5240e559", + "0x9a902f177540a61f74f01c9d4c17aa5373cb15d2", + "0x2f3c59379be8bb5458b1e9a9af610432a0d22e2e", + "0x0c0d535f1683e78dcacf1a7702132853ec9d7d67", + "0x3f3ea894d28162566749cfa4d37ddba3ed1ea422", + "0x14cba0298c152d9cd1cd70008a45dbf3708eaafa", + "0x5e5577032c0aa883d8ea401d64606c07dacaf338", + "0x4cff6ac23f7b51b0569bc6b8abca43f98f74cbfc", + "0xacf4b3626386dc177d98f0d6901626a36154d3c7", + "0x58893e3dbaae65b5dc008e53a94286f481fe2bd2", + "0xcf04f3cb862cd00cdaaaed3738977a4af84688fb", + "0x35088f66ec1f95895331867769085c3bbc06c8eb", + "0xaf06613e7d5e58458e647d9da6780cf481887900", + "0xa46f45731453809c124440caa06e370c60a5adf0", + "0x886435885f29353c5b32583b50ebe4233ada0808", + "0x248d83e5f1a8f02ae78a10ccd1e8f14958ecc6db", + "0x339b8f3bd9868f5f1702114aec927663ca28ab42", + "0xd3f925042d39c23e7126e140ad1423142721c97c", + "0x2fe65fb13b479fb95f91af55176fd4a21cef49e3", + "0xc00c068d8f98997ecb8f2080f427c4c9466b9317", + "0x2bb424743ebf4f025ec6d9d890deaaf9af9112bc", + "0x779c1305d19a61ce5c460eb8e854e27491013a56", + "0x33c9ec616fde955ae573513500f01e6ae39d30ac", + "0x7e5ea44e6098eba895bdd2ef9456f80bcec24859", + "0x61acf782318febc01aafef09f325809d93c114d2", + "0x6f8437345948537cd7285848ffcba8533ff71992", + "0x5ad83a7b37a0f43abc35ae206efa452fc10262ac", + "0x6c799244eb21119f2e129691527d1fe312f31250", + "0x5712d88652995567e480b077a984a8c6ccee1a24", + "0x0c1d72fbb8b8c19440c4d96b3b1b2e8d4aa5dfb4", + "0xbd96147e47b42b61b0904b3b2f68c95861fb3dc0", + "0x85d09f8d1308e9c0903b40234f91e881d7ec5f3b", + "0x08e01f5ff96ef97805f8cef94fccfe2f910a75c4", + "0xcd70974c9c1bc0f5d6423c8b3026a9a4735d24fa", + "0x3ad13be6ab90bf730b29f3ef8b3cd47e69398a62", + "0x822d9195bceca27a9530e0a2a3729a2be0bd1ca0", + "0x512b4e926b24c6ff4b90fb094a3234c4c45b922a", + "0x028f17575aa7f6b98da6661473b9488d6ce9dddb", + "0x8b059afc37cbabaf010c999c93b42a5eb998d05d", + "0x67c301eda4e11cce806cf0cda323aa556004b851", + "0xcaa74debeae8b73de8a894e16ceef7625c69c7ff", + "0x22922f2086edd7b2ee47673409c4c1dd3403a503", + "0xdf286cc54a5139574d112111e1bc7c6fde8e90ac", + "0x50ea3b46c7ac3dc6fb08c26143f57f438e86b834", + "0x53d051fc3fdb970f12c97ad784da8c2e6a653c4a", + "0x8feb6d9bdba2a8084a1174a46e7bbafb37c9778f", + "0xdf5fb94e1fd49b3e1d9bfa2593fe23354d71305d", + "0x2e8cb781f8bc2290428fe7f9c2d818a0bff1cffb", + "0x7199a6b41602d4a2394d30fed7f53cc9d4415275", + "0x7ccde3a8b22858313c1d67db74c4b298adaff18c", + "0x336204b0b03f85807b040688637b1228fa6eae0d", + "0x2a21de2ae2ff1a14f66d523baaa8822a9c9640a5", + "0x6e3596006e4014c74fd0277adcee7ad13a762858", + "0xa7015e48baaa2648d41f4db553b0af3ec565422a", + "0x1233b9af0bf71c50e036ed8ba66f8c7277e3df36", + "0xa9763f7c353486d67f2ef2c9084d41a8f1d148ba", + "0x122c0ce2dd972ea2f73cc3404ca7586b2ef39ad0", + "0x6dc0a4b6b36c885309dd72fc32372ef874f35902", + "0x54353aedc15714c843327102b244dd0f3104348a", + "0xa8c8611c0a2f8e2bd95cf475f2ad58c08d495dd7", + "0x0b0b605c0bcf926b1c545b737e4a6ed80f582558", + "0xd8ced29a897b8bab6d7c702138c4209376c92549", + "0xa4c6aa2bce5ae18e15621435668cbbd07e1ac827", + "0x2c3d5a0aa63da3f3140c8a3d17b015bb8c97ce4d", + "0x3fdfbdc299e4b2bfdb4119be4ba1edad53305298", + "0x320c0bc2d60baa4d7f39579699f469daa1cc4d20", + "0x6b3c58d53643ae7c2dea5f01eb34f68e9858f0cd", + "0xf9b0daaa10664a1b6ad26747225780c129450a19", + "0x9962aa55973f88ba59d57ebd486625dd52e26bea", + "0xfa22001e9b6abcf3907659c96684fe7f500bbd9b", + "0x1a6be5f050a22f5dfd66529ec0226d2ea7b466c5", + "0xa86e428c73832b5b4f2ff2c3010dff81f15740b7", + "0xf5496f4fc9bda4625e1d47bc138dc3898c8a4166", + "0x0776643aebe5e77c4c582eecade2758475ac982c", + "0xdb754d78f0aadbc99d9fa553de43651fcba967cc", + "0x16737008d81b168f4421509f9dc9a0e1747c7dc5", + "0x3b061acca3aac31531cbab53ec3d0f1b309c1104", + "0xb27bf00e49c92263df61a1d305386396d6a222d9", + "0x23b2d63af1d570f37c7fa7f0e90c8461eaab9399", + "0xa3931582ffa1bf2c57f082ff1b4716052e62b116", + "0xc3ab7116458b6f0a21ea0f70388a050c3c42d06e", + "0xf2c988a0381d48a9540ee366eecbbdf542265ab6", + "0x2198d9210bf4333b613b48baec34d5e9d31f155c", + "0x1c2fb74a66d858c83ae25f1425c814fa43b521d3", + "0x4a226b9674974958063d9b8d544c133907afdf46", + "0x4fe1c3f6da0c98da991c89c13a63e97d982dfc81", + "0x2e0553b0f5e6114ab6ec4962a225b43fe32b7e5e", + "0x168824be9ea7606506420029760258be2f8c6752", + "0x6f781bf07eeda3d853eb8edb76dcc874cdc161c7", + "0xf981b7c7580c167aa1bbda78a32fb65df3b86385", + "0x28ca217c8088e4e0195a7286be7ab2a2d0555a56", + "0x77d5f451a8f9a0b89377f7ee8c028a453d3386c3", + "0xec505dc418f902f6826b70fa9166cdf5e0d84c4c", + "0x3ad740f5e141fdb1f77f84450d5e95347cc41025", + "0x341cbda04e1b4329a849427d1d8b0c8413486d89", + "0x18b48ff1680c910cbbe6d231f65a06815ce0dd77", + "0x158502c2623c84012735a18c7b395757db031801", + "0xf1928d1d659e65a2438dd42ee00dec4a5d804467", + "0xeaa8dbc883ff8c4f78aba840d8547eb519b7ec90", + "0x63570e8347336f0c832e754924468a405f0e3481", + "0x6a8ee16b7e98248a14bf26d0a01c4c4bb49d2e9b", + "0x65851145eb7c1103d719e15198a5ab4ce7dc6352", + "0xe53db325115cbafb27e38f519c0e2c2bd1599931", + "0x8f0f311c0d168b2f8ba26fc54e34760b031cac48", + "0x193fd48ee0a70d78c880122f150bf87815f3290f", + "0xc9e7e84e9b5a2f2b9b75212bb360b8d7494b820c", + "0x927febd5152fb1ba84b16d2bb1f483d32c54ca2d", + "0x0f9adaaccd7caecc5019194e15ad19624fed95fa", + "0x931b6d6855194ae24b7f4cb471d0c8537be6275d", + "0x3ab1af76c1c965c513e4e5042c9fa799f122b308", + "0xf4de67bfc24f796ce4519dfe9420bdfcdce9f095", + "0x75cbe0ea9d63e2ff5ffd749fc3d40d4c895fc21a", + "0xd7a9a026887085d86a31a103801ccef2fbca88d4", + "0xf2af4df52b0e0c66fb2dc4e7cf036c85d933b5ed", + "0xd59323dc0b1c2253c77d98e3b513dcb6a60fb75d", + "0x67769dc6a774efc6cc9c89d9ea3494600cbb284c", + "0xe2bcbbad1b644306e4b00067368978b7f45a0b64", + "0xe0568365a57a08cf066fc00e4512cdf7b0fe87e0", + "0x563315a0ab7f319a6293613d3a0d10413beca4e1", + "0xf4013518c4a50111b16fed6391647f714ceabb4c", + "0xc42807d20f5042304426e2e1fbd935ecbf366457", + "0x9bb8a65946ff85dae62361d5c4f323914ca2d956", + "0x54898610e68d5823e708b9f2958643b0ddc70cfe", + "0xa0dfcd873350b8ee0850d6ab1db19ff6207a3ed4", + "0x2896aaab6b6b22584e725e8c12968beeb7f41a2d", + "0xfa27271571524ce659b3fa765e2140bb23eb7a59", + "0x58b54f94624919fab3aca05426d7ad99603f87e7", + "0x1e3712ccb1874da92008cb571012085490fee960", + "0x2785d3fc7db4f3e12959c2afeeb58add3be71fed", + "0x47bd3ce19c97868f9d2cc5540b68c35d0201dc8a", + "0x1f12b79311b65c3ef06f2f1c3689759f1f57da6c", + "0xbdbb117b381b1b35e7e4881b769927b40969a182", + "0xd3da64a4eb1d9906056eab5a33fba03c3b424b16", + "0x81d01cca738c23cd50041ad469c2f256bdba2119", + "0xe1bb30874a0e0c95dc899fce2bc51faea8506fc6", + "0x2c7f67e0597ab55a78619c200f6841de078cc625", + "0xbef8d34930f437123411afaa76fd0cef10a7ab56", + "0x531313191bdd26e9c26f0c31004509eb6f7af0f6", + "0xe892f464c2bb24176242c99fe77cac4456ab405f", + "0xf151a72f8771b74cfd3305664fae65665687456f", + "0x4805bcc6efaaedcf7003626da7b4e10900ac5884", + "0xc6b93ae8f2219c6e86c4ecfb4325da707b690b51", + "0x98e72bafb250e402a792e86fcf2aee8098e64fb4", + "0xc75276a94348e4edc5a8ecc8461e89236f96ced6", + "0x41794b8644ff1c170f843fc697b38e24d7355e24", + "0x0009aeda83031d10d12c006e70baab6fb5d3ea4f", + "0x4a92560c84e522819d9785a13d6adc44cddefac7", + "0x7dccc722fc4e735339e3ba21440db15b22e0c162", + "0xb10e80ecd16274b778522f9e0f603e799649c9f8", + "0xfbefce6921280ace471e575c0f763550deaa2cdd", + "0x69f7cb0494e03512aa3f9174bb9b83d586956fec", + "0x525e3011f77019595bfb954a11876c02c0929b10", + "0xfab3ae8d5fc9e1ca8d7e04415d0bfcdff0c4493f", + "0x4fb2e0afa34fa2033405ffcf6d84fce6b3dd433a", + "0x05dc0570b0c5c24d4971b7a2aa45e276508f5c9d", + "0xf144b018f64b3bf343511362376bebe366de6af7", + "0xbd654d605d149f7a8bdf4d48971d67c3063664d3", + "0x820498afabfa9734b25d4c12a2bf954fe7c11d27", + "0x5c379f83d3d07126d6af369f54e960feadd14c02", + "0x69ccbe7591d191eb875f66b9a2a3260b4f0e4fb9", + "0x6a606a5efd89ebe41e2cb304d2373515f8565cea", + "0x7e94100d7a169cf9c03a5aa99b1b68318adfbe32", + "0x08e8d5a485d25cd9e6f4e09a92fb7e6f02dad4af", + "0x50cc722a55f6699b00477e47b0e34b9c199f6b01", + "0xb4e7494c986ed4bfdb6cb966a4403a6557753985", + "0x6ff56eb310d8f32452b9c42be434fefee2a5e315", + "0x5b86ec47d360bcdb5623856c8bc528717308c596", + "0xc19168ebff0d6af1c77c2a39d8723aa305389f42", + "0xcd1ae66689229afb16aeb67d8aa40f23fd400aec", + "0x61dc9d1e33dce953e11bf33b5c8f98efb007d8e9", + "0xb9155f50aef813ca1adc0f6518bb98c27642522a", + "0x95d24fb39ebd4730e6412972f046db229e925605", + "0x6f7b5ab424eae43be8f751ec7f6358e831ca3fff", + "0x7a5f3e1eef70766351d38ce4eb08d854a8e13a5b", + "0x13089ecddd446b4af44f08f33829df2f854c9c69", + "0x8881898ab018738c7ce955f1e677a924330a5a7e", + "0x86a0e49250d4a1c3b675f5faf77dbd6fd85bbf98", + "0x9345b21e4b04b1b05231565e15748bfe46e1b7d5", + "0x5439927defaa31ac1a3992ae5cab4908b6f751a8", + "0x0d82735e0ea93f1de338e0d913ea4eac944f7b4e", + "0xd6cccc18603aedcc33a95e3754791c025b631659", + "0xdff371e1b813a506ffd64c56f97f2fbd58c8d2c0", + "0x945e6bc0d80420f9eb4a70f7d7b00ea8b0651e9b", + "0xc3aadd74976a6ca763ec21d2c3252ad7cf3eb5a0", + "0xb143f858d6a9b1df49aa3b2151f1cde93b419ae6", + "0x1991a6b734e5275233f4e0c675b7e48254988d57", + "0x605b9b8bb82ccff12946b89e5b416b5a4f6cb42a", + "0x964828786385cbc0443303b3a20c6ab8f51515f3", + "0xc7fe05a0aa0b5553a84e28c6aaf089ed7bf6afe7", + "0x6cfe788cc6421456f8487776587db31eb175a56d", + "0x06bf9f42e7275fc59162c32e22aacb8b0b2531db", + "0x2c28ed87ac8030f6413dbc8ff9ffefa62925cf3f", + "0x51c529ca0a8fadc3f0138c5c4e8cbf1539722716", + "0x861bbc8c3eddf4b3d900df9e2d8e4d10d9acfdd8", + "0xd14ab343e7f750311af62b82aea5481f13480605", + "0xcaba2926977dd0680123620b2745a85bad14b816", + "0xf1e0e48641881d9845d23a52207fa5dd359708db", + "0xbca2621fd7b9c18b3dc3133a0187ba6a11d97c63", + "0x8803ca3934e75208a25c92fade26ca02b5eb18ac", + "0xb9babfbe65146d7661de980be5995bdd1fcf6cbe", + "0xfae879edb88fc045664c363dfabbe4540438805b", + "0xbbdd4849f37fb1c4720f5192477517618d738431", + "0xaad790034f58862a300986d2d859641c62df4ebf", + "0xadc8b15a7bd8d3b4b73708bc839be2fd2e5b05b1", + "0xac3a94da16b99622744d39eabfa8a50787d91cc4", + "0x22bffe416c2f21c7bd901c9e56d4f71c76e41f57", + "0x12676c89f5081ed94e1125e85b82d6b59f36ec18", + "0xae7ee3e3ab06c55179fd529a512f3188b1e4e074", + "0xbd7373b3fd1210adcf2b1b5d2df2a936aa79334e", + "0x35fbb1befa203760e857688fe9221f8150ec3ee1", + "0x56fc062fe2aff42dd7456b0ecf4a2f9ff225c434", + "0x0752fc3c2d0c57e9d8b64740c99d72ff5e38cbb5", + "0xdeeef701c02bbfcc685fcd32c5f29361ea4a3b14", + "0x10d1a68de901955b684fb1d55fcf306ccdc430e9", + "0xcd5561b1be55c1fa4bba4749919a03219497b6ef", + "0xf92ffc1f68f6e092c73db3602fd918ac96b5b41b", + "0xfe77f7efa0f3da316bae80b5ac55b2046d058db5", + "0x382b5fea05feb98ecb8d708026b91514197826fe", + "0x688c7fa4921c889508111610d484e7e51f8c7dc3", + "0xd8c84eac995150662cc052e6ac76ec184fcf1122", + "0xbb6e38d4b912f7e2945090e6dca3dc6dc337d7b0", + "0x3690934a774758c73bbcb99b7704b3a4848fd1bf", + "0x8c84b51cc60af077c1b5b339a43841bffb5a1902", + "0xd3c1292e294f77286735a29e7cdb3ae1845a904f", + "0xfe36fa1294009c6c0abd1f7f1f4e0face79f5891", + "0xd301193a0d39e7c70ae74ac604f1d001698439a5", + "0x365bdad878285b34000d285d0533178f9c51b8e8", + "0x73668ef732b66f1841c8b8ef4fd16bb9570ef038", + "0xf1f007c47d5afb09d327c1edc8c9c63a027f6f66", + "0x75656beebb6213709bab9ecb2a9f5191a781e3e5", + "0xb97ee67e5f3fd3e2c22ded8ed6ca19693181d72d", + "0xbb4d2dcaa5412040c59de4a1ff576289da83f9a3", + "0xc71c9bed735b6e6423624b8c17099e553367a474", + "0xd499b248b8ee592b424fbbeac115b9a5733e2508", + "0x23c1e98ed321b41ab6592ef6f08d2f506d02b1a4", + "0x272c35eed0e96c0bf05d0d4071545e1e92d5206a", + "0x6a31c8b9a783aece03426efb5b29984fea16cb3c", + "0xca282181defb61269dbbfb183c554a7d4a4a204e", + "0x6302f228a9cecbd771d1875060d378cc1797487a", + "0x235177452a2b37d2770c35ff9b669a8fe894accd", + "0x17c949a0b34bc3a7bf61741bf094808dd000444a", + "0xef31007a5adfca8769d8ab4fcf63940798606442", + "0xfee78cb84e811ec4820efe679c0106bb4638d8ec", + "0x2798f2d3661f59d8ce21e8595320372dcc2ca12a", + "0x0b792043406ac25af11f6af7d06555683bd0e375", + "0xd8168ee3c37c36248ab892c28ed104a387a5aea2", + "0xef3ef24f2766dbc6768533531e74d017da7fadc3", + "0x1279206c9705dd06c6ac23fa4622803652bbe75e", + "0xed0c5634cdd468f1831d514724e6394db251f9f2", + "0x53d19237a7973bed1eff2b242ca940abce1c36f3", + "0xdf3e0247e76d90c3fd5aca3464698bd46385bbc2", + "0xecf35b37771f2362f97feb37ccfecd9253df007b", + "0x9ed50f22a1a392f014946319792b09765ac067b1", + "0x034d0266bf0708d8f02fb2a2f92be0dfaab23dc2", + "0x63675c6b100041eb99c8d0472db77c463b78ea0e", + "0xdb561cfba7f207c9af722e4cc65e4b52353b394b", + "0x700278f088115db20c3727790e17fd2a2bfb6fd6", + "0x58addbb787ac7e7cc38358f6f3c2756c0608d876", + "0x807051d3e89a7eca0af16e2330828076c85060b1", + "0x22da864d1333f781caed3ff59a2000c5ba1533b8", + "0xefc236f130330dde3b10bbcf790450060f9fbbe0", + "0x52dda904b261bb4cb2f4b3c6b8aec6e049b29d04", + "0x542cf37c74b0d14016ac38c89ead959487c21d2b", + "0x4f26c2a118c265fe4120b92c2ca097da60ca164e", + "0x11589ec22c36f0e7a378fa4d8673f0663b6b8143", + "0x394c23b891147c1b0b1ff2c97de17f3f60117910", + "0x961639f5aa0a7e23ee8eee007ed365de97bccc5e", + "0xbec9dba14f406675f6f4c0cfa046bd79d3c823ee", + "0x7b3eafdbb00574ca1e8e92bb7db0b1e2414e84bf", + "0x1ff7ac8dfcef62c4fb7cfaf0692893dc41dd2856", + "0xbc41544e6a96ee34658eb63a9312bf242468bb52", + "0xf51d0ed6cdd83312bd5282cfbc7b5f21e36bd33f", + "0xd33aa395dade083db7c017635dad7d5af425c507", + "0x60a6ebd1b9a2f8a04aacf7fea5afcf45a2b75886", + "0x80157ac05d7d1a8e1136222be3d10d52114e9d80", + "0x0c690440720f274d7567efcee42663d93b0b79a7", + "0x6a26b9076271072e58eead064d900919bc36f2e3", + "0xbb58200d12023653b062d483961a91e35dda2bf1", + "0x0044b1e3c03f589fec419218507dc0fa4709c1a9", + "0xbfa79f14ba349bee3edd0fef0d4277fae6c6e865", + "0x9b5fbf37752d8e3a49828123ba144ad4c09c7357", + "0x54f2d5c298c991ed63836671fbcff3102ab8bba1", + "0x5fb0668f35130fd1688fc89b494b535632d4f059", + "0x8562839b30d694c442b146f1d28bb100d2ca0963", + "0xd07810b083597f2d286784de347e4366b83ca134", + "0x488507cd54508d191fd98cbfe8b747e49af32462", + "0xd063b3401932766b0541611b92cc748da8dbdcba", + "0xd0c83c8e00ecea3f676b31037ceef97c3609d04b", + "0xe29384756fc54ddd2a275ab8836bbd35346a1bc2", + "0xdb3de0a35e9562312889d979a8160af72520fe13", + "0xaeac1f8ac5d1073c9c131ff13607e7e80d00dab8", + "0xbfd32d0c787b1c1015ee400fd3bad975736edbb0", + "0xf097d113c8b1474115fc9c95ea2ac0d0745643a2", + "0x1adcf07389b1f6605c44a7683c50a5243829a92c", + "0x0920b97181144c313775cc454b75904c98ee7645", + "0xbb1651d1ca72ea586c64656acf92de6451f146c9", + "0xdb3e98b2714206fc01bbbc99aa9464cd2bb8466c", + "0x024e1e0b63c788e344c1a044547d0fb98e68718a", + "0x083eef848a202f3a60798d8374426d47da1aba3b", + "0x9b138f5f01ed38cfb506d2f0a15f65d53d200ae7", + "0x7c279e31b848b620dcf91196c0b9703e1ff66cd9", + "0x158677285d3a751fc7828d595fb3dd682cae4b60", + "0xbdc80be16ab79785ba8bc1b451359eda45accdbb", + "0x559911156971f5057853a278b05aa870ef3528de", + "0x79a8d023650424927c2f10ec0722e5f938388f4f", + "0x026574ba7c1c59d42df787920dedd1a96fb5a524", + "0x43fc1f21f4c849559c4125cd4252dfc7fe526818", + "0x48fa020c33341cf7139fba1ec283a658a7ba786f", + "0xf309ecc934ee311d11baa10f022f6b4d85cf9f1c", + "0xe1d0f89af41484d56c4c583e54a96c06558cc924", + "0xc07cdba2403b161459384850f21e85ad38a474d3", + "0x2e89ab73f725b0467d0951e1e86fd0b8f45cde30", + "0xb9cf332531766b6eaa3299e05229bca2ff4269c5", + "0x2282b24c89f1d92ffba894bd9f18ab55a2872194", + "0xe272a25b3b30a6c76ab15224f24eaaeed24abed9", + "0xb03aa9957acbbc17568050c244b4b9d532c1f6f8", + "0x81b1e05b70310035f0190b2fadd9ab185ab61925", + "0x3d8f7505857dd43af35dc67682ecab35f405a6eb", + "0x616a02740f5688a3d6ffcdfa4446f4e51e305370", + "0xfdcc14bd5e1c712cd7bda0b11c28b024d9257da4", + "0xcde1026445750ac25d07c1378fff1e81c0848152", + "0x2322ae80d2a6887ae0e265a33877d4d701235fdd", + "0x80ca9f51bdf0c4e82fbaa1d3acc1862905065eae", + "0xcea2a2ca9c2383ee57cf458b985b38c955b94d2c", + "0x9ed28c9a528918c1cf0a9f884edd0686dec06374", + "0x14daa7def2d5b0129d26b54b68dd48f54b1a27f4", + "0xa061e7856e358859183c372f1c6c510d7b387268", + "0x96ed7364c53243bb3d16c0cfd1454e38d506680d", + "0x632769d478aaa18238d8517ea365cb5865934a6a", + "0xedd832310c3381232b43d78718fcb732445b8d62", + "0x936053f4e0c32ec9b4fd9a39279a60413ae15f5a", + "0xd3d2f7704fe3836c7ce3b91e45e727368361d911", + "0x3d6bed68d14253bda1018113ce01d0d9513a95d1", + "0xbcc13edc9da83bbc4bdd41f3e3a791fb2f3b2882", + "0x04048986afc09a8a18b5cc0cd8c4160c4ad7c144", + "0x0238a5787669c0e0155b68dff7e035cd27a25483", + "0xb6d475aa4baec2055c66a1255d5bb9ec394a39b0", + "0x11aa807ba40992765e2544af075a713f8b4a3b42", + "0x02e4e3e08efbb6a934040f8354c8c42906ddc9ef", + "0xe98eedd31a0a6aff02bd304ca2cae44a7bcd6e98", + "0x13c31fad312d3f7d3e52a29032f2c936ae34d93f", + "0x24ca41a2f44c7b35448743ecb5d31ae6147a7d07", + "0x8c567dbdeef7ff087e697d04dbe6f7e8e6bf90ed", + "0x3ddf47806191cda68969679bee7df6f05a58ad76", + "0x33e6e690a77e5d49584a6b91fe3632fb66f8d750", + "0x9105b14e096580b4f3aada24f1e2799370b2d0b9", + "0xc2be160c1dbee67a268d87402c55402fd33e0e2c", + "0xfd8a005082e406215c9e85e712a88167ba691792", + "0xf21205cddcb5fd31aa9962ee57064cf5ccd0b4ca", + "0x2c6fd882e87f0263958015ed36c47d7fa838f8cc", + "0x5701c9c250c2d0f83f558b7a2d5add6c7c430f75", + "0x1141c59a573b52725a219545c456190739fed131", + "0xd4d16fdd50889c1d717e2ca10c8839020724a461", + "0xa9372adce121b60ff8fc7fe36991c81bc8fd8092", + "0x50c9779b3906b2e644c45b858d1c615c4de1735e", + "0xa1b195284871334f58e0717d76dcdea0ebed1089", + "0x0a778f8808c41f4ac71c1a0c708e673dff6b90f0", + "0xec2275eb25f6403619c858fdadc31e0bd76faf3f", + "0xb96d138874ed22a90befbc2d919402f1e9b3a942", + "0x613de6647eb62f65656e2015f395a020f4d98af6", + "0xcdf747f054e25f4dc2e4c431ba845e4d1a7aaaa0", + "0x3615719229d6c3a5d7ec7cc6c3072499d23cd06b", + "0x8338b6515848049d904ecb71ac45c7361c5340b9", + "0xcb7baf1baa65a2dab21800c9ae42748b384025f9", + "0x638e21dc5089b7b0bdbd0d61cbdbe43e781b83c1", + "0xc6117911641959de0dd2ca867b7ebfb987adf02c", + "0x40023deb422ab808a2258f2b4655bc629a86b62f", + "0x886ff9ca67d8fbcad2b75f252c4e26cd610044ce", + "0xf4311c8ac42bd5d9fe7d0de1458749a5932eb92a", + "0x4063cac2d9fe9dab041e0d5407954d2a177d7fb7", + "0x97056b5dedad9da66f1982ebb26e57fb225db7cb", + "0x9b20e577e7ef078d79c25c43eada8f7da18af5f2", + "0xe73998c33b58d0b9b7fc67ea56299886884e1316", + "0x4df2460c239661486af8e2dbdb1d767d1f9b78ae", + "0xdaa914dd16cbb6fefcce34dff7e9a88f8531744a", + "0x22d4a892a740654157c7c3bca1cb8dab39681983", + "0x8e5e7109123bffb990b9a8280b309ca06b37a80f", + "0xd03bddb81f5c0656dc7637a42f40bea765a03cd6", + "0xbbfcd5c87ed4163b62b7033c69f754301ddce1a4", + "0x6ad2ca5afc4703d96eb3d1ecd753566591418ecc", + "0x375fa68c3698dc05cc9882f47c75d418be524aec", + "0x5cba75e03f88d08b8f7c64fd274e5b1cb60b99fa", + "0xd5212cb08b86779f61a5bbf38ee9e36f307b5c03", + "0xfd634a01b4f9262cbeb23eb4c1326826067f481c", + "0x2e7a872698dabdbeac57905a7c81c0cc3902e9f3", + "0x710fd6e84bbd947d000c7300506b46f03b748f45", + "0x8c1c02b422d5011ccd7450cf0b6dafabe1e1a196", + "0x9b1b8a21c32737712ca4d000c66429b4eb70e2f5", + "0xd507e9ae6d884f6850b249c04353cde87472355e", + "0xbe715ce8c2540039fbefecf4f5ab32d49e1cf3be", + "0x37fdf97612fc5c7d1471e80c3a1493f1c645c288", + "0x5c75d91cfffc2a75ab187ef1324f15eeee7faf5b", + "0x878c95c94204dc5d5801f16968edb9e2a91609ba", + "0xc254b302feaf3c9c697b4c1f67aeebb36d7b8f00", + "0x28abd48c0b494d967c5c62d39839cbf9c98bd924", + "0x4fa96d31dd15ce27537130d4b56caee0cb436051", + "0x91705bc893e6a8962fecce677937a005490ac911", + "0xe07850f6769d44bc90d83b3ed88c3a57f84629be", + "0xe0f324d5e4f6343552241652f6bfe73219960c2a", + "0x8c2e4c5f20b0a0cce314aad725a390e254577bd0", + "0x175ea1544bc6ead95840231a6ed4d001b60ad1db", + "0x82a0881606647c75ed5f50fc4d487dc7944fbc27", + "0xbfafd2965668478540a78bb8edd261dcf132ea51", + "0xa830dea7dd905c7e0b1e9a3d0db292406c480180", + "0xbad10a76aced02c71978da944789236b1bed9278", + "0x0cc754de8f487b1f5e2172f9cde6cc256e9d2f20", + "0xf1650051e75dcffa4f2fbf1371452eb399891c68", + "0xec413be767c9af41f8ad515c653731135a41029a", + "0xa277eae71507b94dc3b171696cf0d5e712409edf", + "0xc2569d6354e22e0e957047b0e3c178d86d689d3c", + "0x9e00abe3f59677100ada3a89884431529052d392", + "0xf4acf34677f18e12ef1bcfea77f53a242bda8ad0", + "0x5849ca3cde9d7e8d53d5a24fd5a466b4184e5700", + "0xfcd903e0c689dd15470197d968b81347a8908f01", + "0x866cd2842c13ce72248aab1b7bd45d71261eccd2", + "0x398e1a7ad06250351a8b174ff0e1de9fa8a050c6", + "0xf55bbd9ea04a64fe6dd7a7ee546b11c035ae5276", + "0x7d98e0c9cf39f26154547f2877a42044228598df", + "0x35d47e8c693975a231ad146bc58f801307f45206", + "0x303c3d4393293e10db2b153a9c7ef8fc5aaf226f", + "0xd4d9c2ab83154d82136928db9a98dcaeda262bf6", + "0x146d6311fe6ac773cfde755d87145de732362e77", + "0x510a2f6087f72ee3e1cb15144499a2e9ef599fce", + "0xae93aa85584f5271bd304b0d3e7efc902c91ece8", + "0xb23535557f6c5de6a8da876371340b7733794d00", + "0x10097c6b0766d24ff7993b8534eaff813bbab9d9", + "0xba9eb1d9954c4ddbd26ae95c65b278afd24432f0", + "0xd04533b218fac83ab705c6b9981a424b7a002c6a", + "0xddf959c8f8e32576fe3ba7ad43f55917f891d4e5", + "0xb8da225696af43edf4be05b5489745d455bc1beb", + "0x1c834ec89043aae099ec75c692325fada5717556", + "0xa2e5bcd5253889f3e2a1c5d7bba5f90ed0d929d0", + "0x268c869251a97e7775f6b6b74d2c0c593461f5f6", + "0xda2299c732860d9dc37b71cbfce67c6e38f3b58b", + "0x3cb4dc6fec6b94f0955635858f8cd03552cb4d80", + "0x3d532149c8d18395e1ab9135a32836a8c3bd01d3", + "0x3e1f25906d6a4828f71da2ee8b63feed829a7598", + "0xec7f73eecd6f7dc3eed659d927527dfd2bd329b5", + "0xbfca6f261d37908f1b025319eb116c149a4f7e74", + "0xf51be8615d985515c9f63e48d6d4801dadea4f4d", + "0xb9db40269351dfcfd1dddd0fc4c3397dab754795", + "0x13abf9062237ec43ebd596fb2f475c418fc2b4b7", + "0x7d8432c62752e023f67d21e37fe22c80c350ff1c", + "0x7bec24370a4e612b1c9c895a7726bb54cb162b04", + "0x17d8be034d22303c22a6937a54a0d8a595895111", + "0x71f30adcb6b31dd2983684f2781390f775d91d18", + "0x21c4dcaea2b0ebaba56127006b9c49e6bc8babf3", + "0x29c3f6e61cb145700a097499dd8b338ebd291f51", + "0xd43ccc7f0aeea609a5fd55f68249430d6dde1c6b", + "0xec26ce8bc76b9ab9465939a7b7fc414ac67dbee5", + "0xfee12a0a25e236914b736b76bc51900a48565cb4", + "0x5411581c03b56398ce1d9eb2d54da3c78046c678", + "0xf5c3dbfa53d8131b95a98722cf61392b296298ab", + "0xd5f2a8446e3644f96d7a7da24c63711ff2a4e4c7", + "0x852b2b9ca853ab11c767ad8ea1a14d827e55a010", + "0x3d6061f09f10731d2860004d6b50d22f79a1e77f", + "0x60041a0c089c7c030c425ec232ec98fb70d4a5ed", + "0x14c8f3dc8bff69d56268c55df3dbb39b9b767b79", + "0xa81d5a7aea04e698a652d71241ef6aecfd5728c8", + "0xea82a3b344a9f5c284881472985715dd08e4a4e3", + "0x0a32b23e42a15410be09785f5e607126f326eeff", + "0x79503d512b54b1a80ab5da537ef4b8fe5f313e99", + "0x02d9a002e2154b4903e92e00295a1120dcc33770", + "0x66ed8fd36dec9da16ac5425f4312475f58f3b61a", + "0x838c360244c67195091aafa83bf451b57638c369", + "0x5263276095ecda1d36deed6646a639c999979cfa", + "0x6eeefb3fa4be0a5145bf38b6dff895089c247eb8", + "0x55bb11f30ed23b19ca5c04e41429d013c46d82f1", + "0x9d8bcead34f648927d57168922b3e1480bdca1eb", + "0xbf272b69443efcaa44e26e8062a44c2ab19b11b4", + "0xe6e3af1df4c5f7acb33cca2f8ea72cfde8245a14", + "0xb559e88de961849abb8bde31b651bfc7ecde1671", + "0xca65acec482883e410c3cbe94846cd09e542d24e", + "0x17052f717ac542d321928dda02c2372fc66a8aa5", + "0x9e868534427c5555ad3101c70a18d2f061adde2b", + "0x332f4080b9168016f8e0131a951cc0434ed75a16", + "0x1da48f427be0f89240c40c9d5110b50b4c120b14", + "0x59be6a7a466b5ce674c50f0a0ab52f1a8f854ec6", + "0x213c90afa27c52c28d48a09d7b34fdb90a323afe", + "0x623d8f9197a2bc850371252943ce3ebdc6e895f1", + "0xa52d67ae76ced3f81656b52f7f68d8348e4b36d1", + "0x0b557526149591ff779d8aeb2e7c61988b40c9f3", + "0xa5bc7874c4bb2dd7b1f0f330aed831d89211b83e", + "0x3aaab60964358fca65e3cd888364d50e850b7d40", + "0xcca793546a5ca11955a39621458076307f28bdca", + "0x98cce7ff383106367d447484082c49869f4687d6", + "0xfe75d38b6ef8d1649b7d69a4a044e443c6afe1ce", + "0x1bf8fc89f18334be1a82ce7f6288e67d85aea7ff", + "0x7e796d919323a3f50d062245d8c79f9f4e21888f", + "0x250bff984bc20d14b0afa21b0b49a69da4586d72", + "0xb146844ac6cd89378bbbd4d878c027dd0f4bb165", + "0x89dd4dad90dc88a3222c17240b51be345c2bbbcf", + "0x94172ef86cb242b61147fccadf42a38dd03f7d49", + "0x653683d1ae1f72fecbf4bd00801879c937ffd1e1", + "0xbbcf3985eb53c30a8eea01d9357314d61fe0e727", + "0x2ffb5e5089a6414d3765a6c2c108cb7ca1500232", + "0xf71891fe1086cc4e10cb333541c5b0189735b5e8", + "0x6bb22bd1aa6f8abc9e3cd47032dce8c65eac1eab", + "0xfdf7a39803d33cb7d84f9c2c835e2aa05dd3879f", + "0x0681d7e8e0244675b6f2340f159f80f899ba3377", + "0xad0192751b342199599581489c229ee6b5926bce", + "0x209668e22ad026043a70845f1f4edc3eb9b93837", + "0x1199bb54850508f52c671fceba3c905f8e9f045f", + "0xc37ef27e563ef632e6732efd049e00fc210acaeb", + "0x2a6504ac56be733f0af8679f7428996f40067d32", + "0x523b83d06cbaddd9a847b515e38322c2f5fbc2d2", + "0x5f6102464f614a6a9a317173c1e38e81caf2193d", + "0x7c4f61d1b95eb0258f172ddb4c0e1250941ff7bc", + "0x69021801d836e9aec143758cf8ea3dca677e3a24", + "0xcafceda42882e2eb89ed3e9009d4ecf5e4246e6f", + "0x58c680de4b82f48fe34c0dab769c1c1f9fd96470", + "0x3a1df5cfd6db9698e624fcfacd8ef59b86afc84b", + "0xd72b5087540b20d12a0f09b1f49959ec54b24002", + "0xf7c9daebda0aca249cd6352dbd7dd82435fd527f", + "0xcb177c670523951003eb8eec4265c00ebd116b35", + "0x91a7a6dde501fa512387da824d98a3f62b1d8ee7", + "0x02ed7bed488a73cfba89c440b24d21c9c1da3ad4", + "0x286c0f8c0e02f0f369e74fc7c69387c6cdaa6a28", + "0xc9cb65ab3e5ece4d0b72290760960485dd18d86d", + "0xf5458f96378484ed9bc7fe678c288a8be964390d", + "0xdb67d8f84308cdff5a6f1cab9a1e6d0bcf54884e", + "0x9f125e0ef85df3cf01f8d85847bf939929c49254", + "0x372f9ae432fecd961f053b29baef00360337705c", + "0x904986caaf915854139d1f372ed8b2d9d67786ac", + "0x49a8ddca11a0fa4ce9d7b76c315ffefe8ce28fa0", + "0xf7908b17c5ea2389117a66582c85500fe26225ab", + "0x8bee2be3399bad7bb620e03a3033db80c0429ade", + "0x7d2b0fb6caa056ce425a09d511161f8f3838fca4", + "0x4a915fea6ac531213c2d1f261b5a6d376e84e680", + "0xf4ed8aafc9bcae35db4ca9705c950f190b7d1e92", + "0x94f8a0c456e710e9e331727e1d8372592480ffb0", + "0xaf5164ad6ff7a0f18819fa31cc008b0a29763d78", + "0xded212e1dbbe9913831199150085d8d12e25bc44", + "0xc5ffbc479b28070d6911ea5980b979326776a63d", + "0x279e7f7dbe9e34aa1525699577b87c2c43e9664e", + "0x6bc6e9bff78c939c2ef7af2e248ddfb778b68b52", + "0xd050b7721f6778af8cb62f1f15cea0f2c8109f81", + "0x161c3c998aebbd03b8134d135222e90299899da8", + "0x57c5932738bcc7f1afa50e2b8ed9ad9765e3660f", + "0xf539093018cba8474cc4904d0b11c2ecc22d20d9", + "0x7b2c360ed6f6c0ac4148e72118d8a12b7bcd7439", + "0x55ca2c0cc48726472c6f41a29d9d3ae38e867ad4", + "0xaad9aebbb6563c0fd00ffb85e932f8e4e539097e", + "0x5200ee16afdeb091d556abeca941d09e26f19235", + "0x944a6276fe44f7ab3b01a0e99577d472e28ef03e", + "0x8c7c10e03f195e125af86d9d0ea9448eb8da6173", + "0x3699659760adfbfcf0883d92d31bbab372c7dec3", + "0xc83de6e3c8affa0ab3488a6d8a9ef98d9dda8ef6", + "0xfc2429d8fc16ce82bf7d975686f3eb5f9cb9631b", + "0x057ae7b17823573f7c1bb2423dd678d8eb26cbcf", + "0xb1d0f67d3bc2c805bbb719afc6da02f0d03dea70", + "0xfffbda942c44ff345dabdd0305fd91d8b2e478f7", + "0xee5695f9d22a7b10e948cf1b03a77575f254ca0a", + "0x72a5b96a6d40fa6e54f799a1b94ab99d326de37d", + "0x16544cd394b440dfe4cc5ab2f9cdf479c2fabcb5", + "0x3977b214694b3dcfedceeefac77d05b68b0aab9c", + "0x09beca37c5db4a3a8c57b39dce37acffbb55b26e", + "0x3b8b7b342d65e360b5eb30c1e5c19ee316efad0e", + "0xbfd3f5c350eceb6952ef6acb4e7371453fb42361", + "0x31fb92b9280a5f706151d5eb4e15ab3159c53077", + "0x20c166ca469e833cd05b6760ae3c283cc617c9bb", + "0xaa0c7cf76a0fcc2972e682f15f821db8f54b96a1", + "0xb2f38155a3a6a455c137f4dc83c0b0e32e9e79e0", + "0x4e4b39d28a2ac5fdbd6b86629e51d954987d73ec", + "0x476bec4b7560cab1e6425c5709f39ee8a76a59f6", + "0xebe6ce0bbe92323eb319ec6fabcd44d8a07bdb5b", + "0x093b3d645710f49b6049ecd152b2433bf95a0941", + "0x4f3a53cf74ced06d8397ad289f9c343c71e892d6", + "0xa3e2d68a7257f176700e911840b6fdc45b68142e", + "0xf091bd35600f2f25a4d5ea0aeb651416bc2464e6", + "0xf82ed1d5ba9a8a2701950edaa952c2e207e9ac08", + "0x0639abd48ba1b0ebff2dd8bd6dc75bf0df9f46f9", + "0xcf530d8cea790ef8a1d2ae0bbdc09427ae5b684a", + "0xa5a3d1fc3ecb98de1852ec035397434c7e934833", + "0x6b23134c368994b597b1ade0da37f8265c59dc7c", + "0xf5cd542a348f153535e9f9a1c936fef201d2c120", + "0xa0bf248504742138d0ee79ca7e5909a09250a21f", + "0xb0e05376c9c95241a0229bd9fe1e93d0aacb321f", + "0x17b7f8902a8011c0aff9bb149ddf260c9c78020c", + "0x2fd07c429a6d393d78038279756ef7eef3a403a0", + "0xec1c622a9c2f660a7f598db65c0cdc3838f1fa80", + "0xd605a05e1e9088bbe73a9cb5df79f4be08b656c4", + "0x394aa60f99ccaf9db21da1772f2a78ddaa0c4f6f", + "0xd4fa8c6b7568dcbfe6d67963a2da2d208e273791", + "0x38b2b4816812870a92f56d7a3682203c3a467bd7", + "0x75594d9462f1d43c44cfcc05e28fbb5db7e36a62", + "0xe791ada26d63cd888315c23a496d23d671df153f", + "0x2afb8400eda5dca9cdea9f3f3c747ae8ec0471ea", + "0x22b1adf80042f980920b7237fcc20ea398b8fa75", + "0x4df1d0e931c7ade5d8ce53944fce149ad9084547", + "0x7fcc63271a568df1a262cc4f995b33c09af2545d", + "0x2f0c42b79f96aba17b6087a89c993ae9a3c45524", + "0x77f61a1adc61c11244c2f619c87745489b3c7c5b", + "0x94ea90a94522b583b91746e8e39406a16503fa7b", + } +} diff --git a/app/upgrades/v19/upgrades.go b/app/upgrades/v19/upgrades.go index e28a094bce..85911f84e5 100644 --- a/app/upgrades/v19/upgrades.go +++ b/app/upgrades/v19/upgrades.go @@ -4,15 +4,25 @@ package v19 import ( + "slices" + + errorsmod "cosmossdk.io/errors" + "github.com/cometbft/cometbft/libs/log" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" + upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" "github.com/ethereum/go-ethereum/common" evmostypes "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v18/utils" + erc20keeper "github.com/evmos/evmos/v18/x/erc20/keeper" + erc20types "github.com/evmos/evmos/v18/x/erc20/types" evmkeeper "github.com/evmos/evmos/v18/x/evm/keeper" evmtypes "github.com/evmos/evmos/v18/x/evm/types" + stakingkeeper "github.com/evmos/evmos/v18/x/staking/keeper" ) const ( @@ -25,6 +35,9 @@ func CreateUpgradeHandler( mm *module.Manager, configurator module.Configurator, ak authkeeper.AccountKeeper, + bk bankkeeper.Keeper, + sk stakingkeeper.Keeper, + erc20k erc20keeper.Keeper, ek *evmkeeper.Keeper, ) upgradetypes.UpgradeHandler { return func(ctx sdk.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { @@ -40,8 +53,31 @@ func CreateUpgradeHandler( MigrateEthAccountsToBaseAccounts(ctx, ak, ek) - // Leave modules as-is to avoid running InitGenesis. - return mm.RunMigrations(ctx, configurator, vm) + // run module migrations first. + // so we wont override erc20 params when running strv2 migration, + migrationRes, err := mm.RunMigrations(ctx, configurator, vm) + if err != nil { + return migrationRes, err + } + + bondDenom := sk.BondDenom(ctx) + + var wevmosContract common.Address + switch { + case utils.IsMainnet(ctx.ChainID()): + wevmosContract = common.HexToAddress(erc20types.WEVMOSContractMainnet) + case utils.IsTestnet(ctx.ChainID()): + wevmosContract = common.HexToAddress(erc20types.WEVMOSContractTestnet) + default: + panic("unknown chain id") + } + + ctxCache, writeFn = ctx.CacheContext() + if err = RunSTRv2Migration(ctxCache, logger, ak, bk, erc20k, ek, wevmosContract, bondDenom); err == nil { + writeFn() + } + + return migrationRes, err } } @@ -50,16 +86,102 @@ func RemoveOutpostsFromEvmParams(ctx sdk.Context, ) error { params := evmKeeper.GetParams(ctx) newActivePrecompiles := make([]string, 0) - for _, precompile := range params.ActivePrecompiles { + for _, precompile := range params.ActiveStaticPrecompiles { if precompile != OsmosisOutpostAddress && precompile != StrideOutpostAddress { newActivePrecompiles = append(newActivePrecompiles, precompile) } } - params.ActivePrecompiles = newActivePrecompiles + params.ActiveStaticPrecompiles = newActivePrecompiles return evmKeeper.SetParams(ctx, params) } +// RunSTRv2Migration converts all the registered ERC-20 tokens of Cosmos native token pairs +// back to the native representation and registers the WEVMOS token as an ERC-20 token pair. +func RunSTRv2Migration( + ctx sdk.Context, + logger log.Logger, + accountKeeper authkeeper.AccountKeeper, + bankKeeper bankkeeper.Keeper, + erc20Keeper erc20keeper.Keeper, + evmKeeper *evmkeeper.Keeper, + wrappedContractAddr common.Address, + nativeDenom string, +) error { + // NOTE: it's necessary to register the WEVMOS token as a native token pair before adding + // the dynamic EVM extensions (which is relying on the registered token pairs). + pair := erc20types.NewTokenPair(wrappedContractAddr, nativeDenom, erc20types.OWNER_MODULE) + erc20Keeper.SetToken(ctx, pair) + + // Filter all token pairs for the ones that are for Cosmos native coins. + nativeTokenPairs := getNativeTokenPairs(ctx, erc20Keeper) + + // NOTE (@fedekunze): first we must convert the all the registered tokens. + // If we do it the other way around, the conversion will fail since there won't + // be any contract code due to the selfdestruct. + if err := ConvertERC20Coins( + ctx, + logger, + accountKeeper, + bankKeeper, + *evmKeeper, + wrappedContractAddr, + nativeTokenPairs, + ); err != nil { + return errorsmod.Wrap(err, "failed to convert native coins") + } + + if err := registerERC20Extensions(ctx, wrappedContractAddr, erc20Keeper, evmKeeper); err != nil { + return errorsmod.Wrap(err, "failed to register ERC-20 extensions") + } + + return nil +} + +// registerERC20Extensions registers the ERC20 precompiles with the EVM. +func registerERC20Extensions(ctx sdk.Context, + wrappedContractAddr common.Address, + erc20Keeper erc20keeper.Keeper, + evmKeeper *evmkeeper.Keeper, +) error { + params := erc20Keeper.GetParams(ctx) + + var err error + erc20Keeper.IterateTokenPairs(ctx, func(tokenPair erc20types.TokenPair) bool { + // skip registration if token is native or if it has already been registered + // NOTE: this should handle failure during the selfdestruct + if tokenPair.ContractOwner != erc20types.OWNER_MODULE || + erc20Keeper.IsAvailableERC20Precompile(¶ms, tokenPair.GetERC20Contract()) { + return false + } + + address := tokenPair.GetERC20Contract() + if !slices.Equal(address.Bytes(), wrappedContractAddr.Bytes()) { + // Add to existing EVM extensions - except wrappedEvmos which is on NativePrecompiles + err = erc20Keeper.EnableDynamicPrecompiles(ctx, address) + } + + if err != nil { + return true + } + // try selfdestruct ERC20 contract + + // NOTE(@fedekunze): From now on, the contract address will map to a precompile instead + // of the ERC20MinterBurner contract. We try to force a selfdestruct to remove the unnecessary + // code and storage from the state machine. In any case, the precompiles are handled in the EVM + // before the regular contracts so not removing them doesn't create any issues in the implementation. + err = evmKeeper.DeleteAccount(ctx, address) + if err != nil { + err = errorsmod.Wrapf(err, "failed to selfdestruct account %s", address) + return true + } + + return false + }) + + return err +} + // MigrateEthAccountsToBaseAccounts is used to store the code hash of the associated // smart contracts in the dedicated store in the EVM module and convert the former // EthAccounts to standard Cosmos SDK accounts. diff --git a/app/upgrades/v19/utils.go b/app/upgrades/v19/utils.go new file mode 100644 index 0000000000..91b9d26d8e --- /dev/null +++ b/app/upgrades/v19/utils.go @@ -0,0 +1,64 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package v19 + +import ( + "slices" + + sdk "github.com/cosmos/cosmos-sdk/types" + authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" + "github.com/ethereum/go-ethereum/common" + evmostypes "github.com/evmos/evmos/v18/types" +) + +var ignoredAddresses = []string{ + // XEN Crypto + "0x2AB0e9e4eE70FFf1fB9D67031E44F6410170d00e", + // XEN torrent + "0x4c4CF206465AbFE5cECb3b581fa1b508Ec514692", + // Related to XEN + "0x9Ec1C3DcF667f2035FB4CD2eB42A1566fd54d2B7", + // XENStake -> Symbol = COXENS + "0xAF18644083151cf57F914CCCc23c42A1892C218e", + // DBXen Token on Evmos + "0xc418B123885d732ED042b16e12e259741863F723", + // DBXen NFT + "0xc741C0EC9d5DaD9e6aD481a3BE75295e7D85719B", +} + +func getAccountBytecode(ak authkeeper.AccountKeeper, ctx sdk.Context, hexAddress string) common.Hash { + acc, err := sdk.AccAddressFromHexUnsafe(hexAddress) + if err != nil { + panic(err) + } + account := ak.GetAccount(ctx, acc) + ethAccount, ok := account.(evmostypes.EthAccountI) + if !ok { + return common.Hash{} + } + return ethAccount.GetCodeHash() +} + +func generateFilter(ak authkeeper.AccountKeeper, ctx sdk.Context) []common.Hash { + byteCodesToFilter := []common.Hash{} + byteCodesToFilter = append(byteCodesToFilter, getAccountBytecode(ak, ctx, "37282e677e4905e65e1506635f8ce637957da75e")) + byteCodesToFilter = append(byteCodesToFilter, getAccountBytecode(ak, ctx, "Ff8cBBa9989FD10ba39Cc58aBe499eB9Bca14B4E")) + // Y NOT PROXY + byteCodesToFilter = append(byteCodesToFilter, getAccountBytecode(ak, ctx, "fdea18a83420cbbb9a516fb1da1873c0b2fbf521")) + // COXEN Stake + byteCodesToFilter = append(byteCodesToFilter, getAccountBytecode(ak, ctx, "000436A6B0097deb2c7Fcee1115b2781Bae86f50")) + // 8k random accounts + byteCodesToFilter = append(byteCodesToFilter, getAccountBytecode(ak, ctx, "c441d5e10faA165719520C9838e34A025FE98C21")) + + return byteCodesToFilter +} + +func isAccountValid(addr string, code common.Hash, filter []common.Hash) bool { + // Filter the smart contracts deployed by XEN + if slices.Index(filter, code) != -1 { + return false + } + // filter addresses + return !slices.Contains(ignoredAddresses, addr) +} diff --git a/ibc/utils.go b/ibc/utils.go index bf1fbcdf63..d00f91cd7e 100644 --- a/ibc/utils.go +++ b/ibc/utils.go @@ -80,14 +80,10 @@ func GetReceivedCoin(srcPort, srcChannel, dstPort, dstChannel, rawDenom, rawAmt unprefixedDenom := rawDenom[len(voucherPrefix):] // coin denomination used in sending from the escrow address - denom := unprefixedDenom - // The denomination used to send the coins is either the native denom or the hash of the path // if the denomination is not native. denomTrace := transfertypes.ParseDenomTrace(unprefixedDenom) - if denomTrace.Path != "" { - denom = denomTrace.IBCDenom() - } + denom := denomTrace.IBCDenom() return sdk.Coin{ Denom: denom, @@ -122,6 +118,24 @@ func GetSentCoin(rawDenom, rawAmt string) sdk.Coin { } } +// IsBaseDenomFromSourceChain checks if the given denom has only made a single hop. +// It returns true if the denomination is single-hop, false otherwise. +// This function expects to receive a string representing a token like +// the denom string of the `FungibleTokenPacketData` of a received packet. +// If the coin denom starts with `factory/` then it is a token factory coin, and we should not convert it +// NOTE: Check https://docs.osmosis.zone/osmosis-core/modules/tokenfactory/ for more information +func IsBaseDenomFromSourceChain(rawDenom string) bool { + // Parse the raw denomination to get its DenomTrace + denomTrace := transfertypes.ParseDenomTrace(rawDenom) + + // Split the denom of the DenomTrace into its components + denomComponents := strings.Split(denomTrace.BaseDenom, "/") + + // Each hop in the path is represented by a pair of port and channel ids + // If the number of components in the path is equal to or more than 2, it has hopped multiple chains + return len(denomTrace.Path) == 0 && len(denomComponents) == 1 +} + // GetDenomTrace returns the denomination trace from the corresponding IBC denomination. If the // denomination is not an IBC voucher or the trace is not found, it returns an error. func GetDenomTrace( diff --git a/ibc/utils_test.go b/ibc/utils_test.go index 65d87f4315..c02d79666e 100644 --- a/ibc/utils_test.go +++ b/ibc/utils_test.go @@ -330,3 +330,39 @@ func TestDeriveDecimalsFromDenom(t *testing.T) { require.Equal(t, tc.expDec, dec) } } + +func TestIsBaseDenomFromSourceChain(t *testing.T) { + tests := []struct { + name string + denom string + expected bool + }{ + { + name: "one hop", + denom: "transfer/channel-0/uatom", + expected: false, + }, + { + name: "no hop with factory prefix", + denom: "factory/owner/uatom", + expected: false, + }, + { + name: "multi hop", + denom: "transfer/channel-0/transfer/channel-1/uatom", + expected: false, + }, + { + name: "no hop", + denom: "uatom", + expected: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := IsBaseDenomFromSourceChain(tt.denom) + require.Equal(t, tt.expected, result) + }) + } +} diff --git a/precompiles/bank/integration_test.go b/precompiles/bank/integration_test.go index 4e591c4cea..85c286ca37 100644 --- a/precompiles/bank/integration_test.go +++ b/precompiles/bank/integration_test.go @@ -6,11 +6,11 @@ import ( "github.com/evmos/evmos/v18/precompiles/bank/testdata" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/ethereum/go-ethereum/common" "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + integrationutils "github.com/evmos/evmos/v18/testutil/integration/evmos/utils" "github.com/evmos/evmos/v18/utils" evmtypes "github.com/evmos/evmos/v18/x/evm/types" inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" @@ -49,8 +49,10 @@ type IntegrationTestSuite struct { func (is *IntegrationTestSuite) SetupTest() { keyring := keyring.New(2) + genesis := integrationutils.CreateGenesisWithTokenPairs(keyring) integrationNetwork := network.NewUnitTestNetwork( network.WithPreFundedAccounts(keyring.GetAllAccAddrs()...), + network.WithCustomGenesis(genesis), ) grpcHandler := grpc.NewIntegrationHandler(integrationNetwork) txFactory := factory.New(integrationNetwork, grpcHandler) @@ -67,42 +69,18 @@ func (is *IntegrationTestSuite) SetupTest() { is.keyring = keyring is.network = integrationNetwork - // Register EVMOS - evmosMetadata, found := is.network.App.BankKeeper.GetDenomMetaData(is.network.GetContext(), is.bondDenom) - Expect(found).To(BeTrue(), "failed to get denom metadata") - - tokenPair, err := is.network.App.Erc20Keeper.RegisterCoin(is.network.GetContext(), evmosMetadata) - Expect(err).ToNot(HaveOccurred(), "failed to register coin") - + tokenPairID := is.network.App.Erc20Keeper.GetTokenPairID(is.network.GetContext(), is.bondDenom) + tokenPair, found := is.network.App.Erc20Keeper.GetTokenPair(is.network.GetContext(), tokenPairID) + Expect(found).To(BeTrue(), "failed to register token erc20 extension") is.evmosAddr = common.HexToAddress(tokenPair.Erc20Address) // Mint and register a second coin for testing purposes - err = is.network.App.BankKeeper.MintCoins(is.network.GetContext(), inflationtypes.ModuleName, sdk.Coins{{Denom: is.tokenDenom, Amount: sdk.NewInt(1e18)}}) + err := is.network.App.BankKeeper.MintCoins(is.network.GetContext(), inflationtypes.ModuleName, sdk.Coins{{Denom: is.tokenDenom, Amount: sdk.NewInt(1e18)}}) Expect(err).ToNot(HaveOccurred(), "failed to mint coin") - xmplMetadata := banktypes.Metadata{ - Description: "An exemplary token", - Base: is.tokenDenom, - // NOTE: Denom units MUST be increasing - DenomUnits: []*banktypes.DenomUnit{ - { - Denom: is.tokenDenom, - Exponent: 0, - Aliases: []string{is.tokenDenom}, - }, - { - Denom: is.tokenDenom, - Exponent: 18, - }, - }, - Name: "Exemplary", - Symbol: "XMPL", - Display: is.tokenDenom, - } - - tokenPair, err = is.network.App.Erc20Keeper.RegisterCoin(is.network.GetContext(), xmplMetadata) - Expect(err).ToNot(HaveOccurred(), "failed to register coin") - + tokenPairID = is.network.App.Erc20Keeper.GetTokenPairID(is.network.GetContext(), is.tokenDenom) + tokenPair, found = is.network.App.Erc20Keeper.GetTokenPair(is.network.GetContext(), tokenPairID) + Expect(found).To(BeTrue(), "failed to register token erc20 extension") is.xmplAddr = common.HexToAddress(tokenPair.Erc20Address) is.precompile = is.setupBankPrecompile() } diff --git a/precompiles/bank/setup_test.go b/precompiles/bank/setup_test.go index 8f51132daf..2af0b12b67 100644 --- a/precompiles/bank/setup_test.go +++ b/precompiles/bank/setup_test.go @@ -7,13 +7,13 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/ethereum/go-ethereum/common" "github.com/evmos/evmos/v18/precompiles/bank" "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + integrationutils "github.com/evmos/evmos/v18/testutil/integration/evmos/utils" "github.com/stretchr/testify/suite" ) @@ -44,8 +44,10 @@ func TestPrecompileTestSuite(t *testing.T) { func (s *PrecompileTestSuite) SetupTest() { keyring := testkeyring.New(2) + genesis := integrationutils.CreateGenesisWithTokenPairs(keyring) integrationNetwork := network.NewUnitTestNetwork( network.WithPreFundedAccounts(keyring.GetAllAccAddrs()...), + network.WithCustomGenesis(genesis), ) grpcHandler := grpc.NewIntegrationHandler(integrationNetwork) txFactory := factory.New(integrationNetwork, grpcHandler) @@ -62,43 +64,23 @@ func (s *PrecompileTestSuite) SetupTest() { s.keyring = keyring s.network = integrationNetwork - // Register EVMOS - evmosMetadata, found := s.network.App.BankKeeper.GetDenomMetaData(s.network.GetContext(), s.bondDenom) - s.Require().True(found, "expected evmos denom metadata") - - tokenPair, err := s.network.App.Erc20Keeper.RegisterCoin(s.network.GetContext(), evmosMetadata) - s.Require().NoError(err, "failed to register coin") - + tokenPairID := s.network.App.Erc20Keeper.GetTokenPairID(s.network.GetContext(), s.bondDenom) + tokenPair, found := s.network.App.Erc20Keeper.GetTokenPair(s.network.GetContext(), tokenPairID) + s.Require().True(found) s.evmosAddr = common.HexToAddress(tokenPair.Erc20Address) + s.evmosAddr = tokenPair.GetERC20Contract() + // Mint and register a second coin for testing purposes - err = s.network.App.BankKeeper.MintCoins(s.network.GetContext(), inflationtypes.ModuleName, sdk.Coins{{Denom: "xmpl", Amount: math.NewInt(1e18)}}) + err := s.network.App.BankKeeper.MintCoins(s.network.GetContext(), inflationtypes.ModuleName, sdk.Coins{{Denom: "xmpl", Amount: math.NewInt(1e18)}}) s.Require().NoError(err) - xmplMetadata := banktypes.Metadata{ - Description: "An exemplary token", - Base: s.tokenDenom, - // NOTE: Denom units MUST be increasing - DenomUnits: []*banktypes.DenomUnit{ - { - Denom: s.tokenDenom, - Exponent: 0, - Aliases: []string{s.tokenDenom}, - }, - { - Denom: s.tokenDenom, - Exponent: 18, - }, - }, - Name: "Exemplary", - Symbol: "XMPL", - Display: s.tokenDenom, - } - - tokenPair, err = s.network.App.Erc20Keeper.RegisterCoin(s.network.GetContext(), xmplMetadata) - s.Require().NoError(err, "failed to register coin") - + tokenPairID = s.network.App.Erc20Keeper.GetTokenPairID(s.network.GetContext(), s.tokenDenom) + tokenPair, found = s.network.App.Erc20Keeper.GetTokenPair(s.network.GetContext(), tokenPairID) + s.Require().True(found) s.xmplAddr = common.HexToAddress(tokenPair.Erc20Address) + s.xmplAddr = tokenPair.GetERC20Contract() + s.precompile = s.setupBankPrecompile() } diff --git a/precompiles/distribution/distribution_test.go b/precompiles/distribution/distribution_test.go index 96312af828..efc3b2eb6b 100644 --- a/precompiles/distribution/distribution_test.go +++ b/precompiles/distribution/distribution_test.go @@ -218,13 +218,10 @@ func (s *PrecompileTestSuite) TestRun() { s.ctx, msg, cfg, nil, s.stateDB, ) - params := s.app.EvmKeeper.GetParams(s.ctx) - activePrecompiles := params.GetActivePrecompilesAddrs() - precompileMap := s.app.EvmKeeper.Precompiles(activePrecompiles...) - err = vm.ValidatePrecompiles(precompileMap, activePrecompiles) - s.Require().NoError(err, "invalid precompiles", activePrecompiles) - evm.WithPrecompiles(precompileMap, activePrecompiles) - + precompiles, found, err := s.app.EvmKeeper.GetPrecompileInstance(s.ctx, contractAddr) + s.Require().NoError(err, "failed to instantiate precompile") + s.Require().True(found, "not found precompile") + evm.WithPrecompiles(precompiles.Map, precompiles.Addresses) // Run precompiled contract bz, err := s.precompile.Run(evm, contract, tc.readOnly) diff --git a/precompiles/erc20/IERC20MetadataAllowance.sol b/precompiles/erc20/IERC20MetadataAllowance.sol index 1fe29eff65..4eb31bf70a 100644 --- a/precompiles/erc20/IERC20MetadataAllowance.sol +++ b/precompiles/erc20/IERC20MetadataAllowance.sol @@ -8,7 +8,7 @@ import "./IERC20Metadata.sol"; * @title ERC20 Metadata Allowance Interface * @dev Interface for the optional metadata and allowance functions from the ERC20 standard. */ -interface IERC20MetadataAllowance is IERC20Metadata { +interface IERC20MetadataAllowance is IERC20Metadata { /** @dev Atomically increases the allowance granted to spender by the caller. * This is an alternative to approve that can be used as a mitigation for problems described in * IERC20.approve. diff --git a/precompiles/erc20/erc20.go b/precompiles/erc20/erc20.go index a408d69c9c..36f9d6f6b6 100644 --- a/precompiles/erc20/erc20.go +++ b/precompiles/erc20/erc20.go @@ -170,7 +170,7 @@ func (Precompile) IsTransaction(methodName string) bool { } // HandleMethod handles the execution of each of the ERC-20 methods. -func (p Precompile) HandleMethod( +func (p *Precompile) HandleMethod( ctx sdk.Context, contract *vm.Contract, stateDB vm.StateDB, diff --git a/precompiles/erc20/errors.go b/precompiles/erc20/errors.go index d8ca1240fb..bdc20eb3c3 100644 --- a/precompiles/erc20/errors.go +++ b/precompiles/erc20/errors.go @@ -19,6 +19,8 @@ import ( // Errors that have formatted information are defined here as a string. const ( ErrIntegerOverflow = "amount %s causes integer overflow" + ErrInvalidOwner = "invalid from address: %s" + ErrInvalidReceiver = "invalid to address: %s" ErrNoAllowanceForToken = "allowance for token %s does not exist" ErrSubtractMoreThanAllowance = "subtracted value cannot be greater than existing allowance for denom %s: %s > %s" ) diff --git a/precompiles/erc20/integration_test.go b/precompiles/erc20/integration_test.go index a861f5a539..32a1c6885c 100644 --- a/precompiles/erc20/integration_test.go +++ b/precompiles/erc20/integration_test.go @@ -15,6 +15,7 @@ import ( "github.com/evmos/evmos/v18/precompiles/erc20" "github.com/evmos/evmos/v18/precompiles/erc20/testdata" "github.com/evmos/evmos/v18/precompiles/testutil" + contractutils "github.com/evmos/evmos/v18/precompiles/testutil/contracts" "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" @@ -22,6 +23,7 @@ import ( "github.com/evmos/evmos/v18/testutil/integration/evmos/utils" utiltx "github.com/evmos/evmos/v18/testutil/tx" erc20types "github.com/evmos/evmos/v18/x/erc20/types" + "github.com/evmos/evmos/v18/x/evm/core/vm" evmtypes "github.com/evmos/evmos/v18/x/evm/types" //nolint:revive // dot imports are fine for Ginkgo @@ -83,6 +85,14 @@ func TestIntegrationSuite(t *testing.T) { RunSpecs(t, "ERC20 Extension Suite") } +var ( + defaultCallArgs contractutils.CallArgs + wevmosAddress common.Address + revertContractAddr common.Address + gasLimit uint64 + gasPrice *big.Int +) + var _ = Describe("ERC20 Extension -", func() { var ( // contractsData holds the addresses and ABIs for the different @@ -90,6 +100,7 @@ var _ = Describe("ERC20 Extension -", func() { contractsData ContractsData allowanceCallerContract evmtypes.CompiledContract + revertCallerContract evmtypes.CompiledContract erc20MinterV5Contract evmtypes.CompiledContract execRevertedCheck testutil.LogCheckArgs @@ -107,6 +118,9 @@ var _ = Describe("ERC20 Extension -", func() { erc20MinterV5Contract, err = testdata.LoadERC20MinterV5Contract() Expect(err).ToNot(HaveOccurred(), "failed to load ERC20 minter contract") + revertCallerContract, err = testdata.LoadERC20TestCaller() + Expect(err).ToNot(HaveOccurred(), "failed to load ERC20 allowance caller contract") + sender := is.keyring.GetKey(0) contractAddr, err := is.factory.DeployContract( sender.Priv, @@ -187,11 +201,56 @@ var _ = Describe("ERC20 Extension -", func() { execRevertedCheck = failCheck.WithErrContains("execution reverted") passCheck = failCheck.WithExpPass(true) + erc20Params := is.network.App.Erc20Keeper.GetParams(is.network.GetContext()) + Expect(len(erc20Params.NativePrecompiles)).To(Equal(1)) + + wevmosAddress = common.HexToAddress(erc20Params.NativePrecompiles[0]) + revertContractAddr, err = is.factory.DeployContract( + sender.Priv, + evmtypes.EvmTxArgs{}, // NOTE: passing empty struct to use default values + factory.ContractDeploymentData{ + Contract: revertCallerContract, + // NOTE: we're passing the precompile address to the constructor because that initiates the contract + // to make calls to the correct ERC20 precompile. + ConstructorArgs: []interface{}{common.HexToAddress(erc20Params.NativePrecompiles[0])}, + }, + ) + Expect(err).ToNot(HaveOccurred(), "failed to deploy reverter contract") + + gasLimit = uint64(4991202) + gasPrice = big.NewInt(765625001) + defaultCallArgs = contractutils.CallArgs{ + ContractAddr: revertContractAddr, + ContractABI: revertCallerContract.ABI, + PrivKey: sender.Priv, + GasLimit: gasLimit, + GasPrice: gasPrice, + } + err = is.network.NextBlock() Expect(err).ToNot(HaveOccurred(), "failed to advance block") }) Context("basic functionality -", func() { + When("sending tokens to contract", func() { + It("it should return error", func() { + sender := is.keyring.GetKey(0) + fundCoins := sdk.Coins{sdk.NewInt64Coin(is.tokenDenom, 300)} + + // Fund account with some tokens + is.fundWithTokens(directCall, contractsData, sender.Addr, fundCoins) + + // Taking custom args from the table entry + txArgs := evmtypes.EvmTxArgs{} + txArgs.Amount = big.NewInt(int64(1000)) + precompileAddress := is.precompile.Address() + txArgs.To = &precompileAddress + + _, err := is.factory.ExecuteEthTx(sender.Priv, txArgs) + Expect(err.Error()).To(ContainSubstring(vm.ErrExecutionReverted.Error()), "precompile should not accept transfers") + }, + ) + }) When("transferring tokens", func() { DescribeTable("it should transfer tokens to a non-existing address", func(callType CallType, expGasUsedLowerBound int64, expGasUsedUpperBound int64) { sender := is.keyring.GetKey(0) @@ -312,6 +371,180 @@ var _ = Describe("ERC20 Extension -", func() { // Entry(" - through erc20 v5 contract", erc20V5Call), ) }) + When("calling reverter contract", func() { + Context("in a direct call to the WEVMOS contract", func() { + It("should transfer tokens", func() { + sender := is.keyring.GetKey(0) + receiver := is.keyring.GetAddr(1) + amountToSend := big.NewInt(100) + denomInitialBalance := is.network.App.BankKeeper.GetBalance(is.network.GetContext(), receiver.Bytes(), is.bondDenom) + senderInitialBalance := is.network.App.BankKeeper.GetBalance(is.network.GetContext(), sender.AccAddr, is.bondDenom) + + cArgs := defaultCallArgs. + WithPrivKey(sender.Priv). + WithMethodName("transferWithRevert"). + WithArgs( + receiver, + amountToSend, + false, + false, + ). + WithAmount(amountToSend) + + transferCheck := passCheck.WithExpEvents( + erc20.EventTypeTransfer, + ) + res, _, err := contractutils.CallContractAndCheckLogs(is.network.GetContext(), is.network.App, cArgs, transferCheck) + Expect(err).To(BeNil()) + denomFinalBalance := is.network.App.BankKeeper.GetBalance(is.network.GetContext(), receiver.Bytes(), is.bondDenom) + Expect(denomFinalBalance.Amount).To(Equal(denomInitialBalance.Amount.Add(math.NewInt(amountToSend.Int64())))) + + contractBalance := is.network.App.BankKeeper.GetBalance(is.network.GetContext(), revertContractAddr.Bytes(), is.bondDenom) + Expect(contractBalance.Amount).To(Equal(math.ZeroInt())) + + senderFinalBalance := is.network.App.BankKeeper.GetBalance(is.network.GetContext(), sender.AccAddr, is.bondDenom) + denomSpent := math.NewInt((res.GasUsed*gasPrice.Int64() + amountToSend.Int64())) + Expect(senderFinalBalance.Amount).To(Equal(senderInitialBalance.Amount.Sub(denomSpent))) + }, + ) + DescribeTable("it should revert token transfer from the WEVMOS contract", func(before bool, after bool) { + sender := is.keyring.GetKey(0) + receiver := is.keyring.GetAddr(1) + amountToSend := big.NewInt(100) + denomInitialBalance := is.network.App.BankKeeper.GetBalance(is.network.GetContext(), receiver.Bytes(), is.bondDenom) + senderInitialBalance := is.network.App.BankKeeper.GetBalance(is.network.GetContext(), sender.AccAddr, is.bondDenom) + + cArgs := defaultCallArgs. + WithPrivKey(sender.Priv). + WithMethodName("transferWithRevert"). + WithArgs( + receiver, + amountToSend, + before, + after, + ). + WithAmount(amountToSend) + + res, _, err := contractutils.CallContractAndCheckLogs(is.network.GetContext(), is.network.App, cArgs, execRevertedCheck) + Expect(err).NotTo(BeNil()) + // contract balance should remain unchanged + denomFinalBalance := is.network.App.BankKeeper.GetBalance(is.network.GetContext(), receiver.Bytes(), is.bondDenom) + Expect(denomFinalBalance.Amount).To(Equal(denomInitialBalance.Amount)) + + contractBalance := is.network.App.BankKeeper.GetBalance(is.network.GetContext(), revertContractAddr.Bytes(), is.bondDenom) + Expect(contractBalance.Amount).To(Equal(math.ZeroInt())) + + senderFinalBalance := is.network.App.BankKeeper.GetBalance(is.network.GetContext(), sender.AccAddr, is.bondDenom) + Expect(senderFinalBalance.Amount).To(Equal(senderInitialBalance.Amount.Sub(math.NewInt((res.GasUsed * gasPrice.Int64()))))) + }, + Entry("revert before", true, false), + Entry("revert after", false, true), + ) + It("it should send token transfer and send from WEVMOS contract", func() { + sender := is.keyring.GetKey(0) + receiver := is.keyring.GetAddr(1) + totalToSend := int64(350) + denomInitialBalance := is.network.App.BankKeeper.GetBalance(is.network.GetContext(), receiver.Bytes(), is.bondDenom) + senderInitialBalance := is.network.App.BankKeeper.GetBalance(is.network.GetContext(), sender.AccAddr, is.bondDenom) + + cArgs := defaultCallArgs. + WithPrivKey(sender.Priv). + WithMethodName("testTransferAndSend"). + WithArgs( + receiver, + big.NewInt(100), + big.NewInt(100), + big.NewInt(150), + false, + false, + ). + WithAmount(big.NewInt(totalToSend)) + + transferCheck := passCheck.WithExpEvents( + erc20.EventTypeTransfer, + ) + res, _, err := contractutils.CallContractAndCheckLogs(is.network.GetContext(), is.network.App, cArgs, transferCheck) + Expect(err).To(BeNil()) + // contract balance should remain unchanged + denomFinalBalance := is.network.App.BankKeeper.GetBalance(is.network.GetContext(), receiver.Bytes(), is.bondDenom) + Expect(denomFinalBalance.Amount).To(Equal(denomInitialBalance.Amount.Add(math.NewInt(totalToSend)))) + + contractBalance := is.network.App.BankKeeper.GetBalance(is.network.GetContext(), revertContractAddr.Bytes(), is.bondDenom) + Expect(contractBalance.Amount).To(Equal(math.ZeroInt())) + + senderFinalBalance := is.network.App.BankKeeper.GetBalance(is.network.GetContext(), sender.AccAddr, is.bondDenom) + denomSpent := math.NewInt((res.GasUsed*gasPrice.Int64() + totalToSend)) + Expect(senderFinalBalance.Amount).To(Equal(senderInitialBalance.Amount.Sub(denomSpent))) + }, + ) + DescribeTable("it should revert token transfer and send from WEVMOS contract", func(before bool, after bool) { + sender := is.keyring.GetKey(0) + receiver := is.keyring.GetAddr(1) + denomInitialBalance := is.network.App.BankKeeper.GetBalance(is.network.GetContext(), receiver.Bytes(), is.bondDenom) + senderInitialBalance := is.network.App.BankKeeper.GetBalance(is.network.GetContext(), sender.AccAddr, is.bondDenom) + + cArgs := defaultCallArgs. + WithPrivKey(sender.Priv). + WithMethodName("testTransferAndSend"). + WithArgs( + receiver, + big.NewInt(100), + big.NewInt(100), + big.NewInt(100), + before, + after, + ). + WithAmount(big.NewInt(300)) + + res, _, err := contractutils.CallContractAndCheckLogs(is.network.GetContext(), is.network.App, cArgs, execRevertedCheck) + Expect(err).NotTo(BeNil()) + // contract balance should remain unchanged + denomFinalBalance := is.network.App.BankKeeper.GetBalance(is.network.GetContext(), receiver.Bytes(), is.bondDenom) + Expect(denomFinalBalance.Amount).To(Equal(denomInitialBalance.Amount)) + + contractBalance := is.network.App.BankKeeper.GetBalance(is.network.GetContext(), revertContractAddr.Bytes(), is.bondDenom) + Expect(contractBalance.Amount).To(Equal(math.ZeroInt())) + + senderFinalBalance := is.network.App.BankKeeper.GetBalance(is.network.GetContext(), sender.AccAddr, is.bondDenom) + Expect(senderFinalBalance.Amount).To(Equal(senderInitialBalance.Amount.Sub(math.NewInt((res.GasUsed * gasPrice.Int64()))))) + }, + Entry("revert before", true, false), + Entry("revert after", false, true), + ) + It("revert when transfer with try", func() { + sender := is.keyring.GetKey(0) + receiver := is.keyring.GetAddr(1) + amountToSend := big.NewInt(100) + denomInitialBalance := is.network.App.BankKeeper.GetBalance(is.network.GetContext(), receiver.Bytes(), is.bondDenom) + senderInitialBalance := is.network.App.BankKeeper.GetBalance(is.network.GetContext(), sender.AccAddr, is.bondDenom) + + cArgs := defaultCallArgs. + WithPrivKey(sender.Priv). + WithMethodName("transfersWithTry"). + WithArgs( + receiver, + amountToSend, + amountToSend, + ). + WithAmount(big.NewInt(200)) + + transferCheck := passCheck.WithExpEvents( + erc20.EventTypeTransfer, + ) + res, _, err := contractutils.CallContractAndCheckLogs(is.network.GetContext(), is.network.App, cArgs, transferCheck) + Expect(err).To(BeNil()) + denomFinalBalance := is.network.App.BankKeeper.GetBalance(is.network.GetContext(), receiver.Bytes(), is.bondDenom) + Expect(denomFinalBalance.Amount).To(Equal(denomInitialBalance.Amount.Add(math.NewInt(amountToSend.Int64())))) + + contractBalance := is.network.App.BankKeeper.GetBalance(is.network.GetContext(), revertContractAddr.Bytes(), is.bondDenom) + Expect(contractBalance.Amount.Int64()).To(Equal(amountToSend.Int64())) + + senderFinalBalance := is.network.App.BankKeeper.GetBalance(is.network.GetContext(), sender.AccAddr, is.bondDenom) + denomSpent := math.NewInt((res.GasUsed*gasPrice.Int64() + amountToSend.Int64() + amountToSend.Int64())) + Expect(senderFinalBalance.Amount).To(Equal(senderInitialBalance.Amount.Sub(denomSpent))) + }) + }) + }) When("transferring tokens from another account", func() { Context("in a direct call to the token contract", func() { diff --git a/precompiles/erc20/testdata/ERC20TestCaller.json b/precompiles/erc20/testdata/ERC20TestCaller.json new file mode 100644 index 0000000000..8d91647082 --- /dev/null +++ b/precompiles/erc20/testdata/ERC20TestCaller.json @@ -0,0 +1,149 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ERC20TestCaller", + "sourceName": "solidity/precompiles/erc20/testdata/ERC20TestCaller.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "tokenAddress", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "counter", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "_source", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount_to_transfer", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount_to_send", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount_to_send_after", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "_before", + "type": "bool" + }, + { + "internalType": "bool", + "name": "_after", + "type": "bool" + } + ], + "name": "testTransferAndSend", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "token", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "before", + "type": "bool" + }, + { + "internalType": "bool", + "name": "aft", + "type": "bool" + } + ], + "name": "transferWithRevert", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "_source", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount_to_transfer", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount_to_fail", + "type": "uint256" + } + ], + "name": "transfersWithTry", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b50604051610f46380380610f46833981810160405281019061003291906100e3565b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060018190555050610110565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100b082610085565b9050919050565b6100c0816100a5565b81146100cb57600080fd5b50565b6000815190506100dd816100b7565b92915050565b6000602082840312156100f9576100f8610080565b5b6000610107848285016100ce565b91505092915050565b610e278061011f6000396000f3fe60806040526004361061004a5760003560e01c8063268d070a1461004f57806361bc221a1461006b5780636bc7b7cd14610096578063d0fedf55146100c6578063fc0c546a146100f6575b600080fd5b610069600480360381019061006491906107fc565b610121565b005b34801561007757600080fd5b506100806102bd565b60405161008d919061085e565b60405180910390f35b6100b060048036038101906100ab91906108b1565b6102c3565b6040516100bd919061094d565b60405180910390f35b6100e060048036038101906100db91906109a6565b6105ce565b6040516100ed919061094d565b60405180910390f35b34801561010257600080fd5b5061010b61073f565b6040516101189190610a6c565b60405180910390f35b6001600081548092919061013490610ab6565b919050555060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040518363ffffffff1660e01b8152600401610197929190610b1f565b6020604051808303816000875af11580156101b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101da9190610b5d565b90508061021c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161021390610be7565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1663d0fedf5585846001806040518563ffffffff1660e01b815260040161025c9493929190610c07565b6020604051808303816000875af192505050801561029857506040513d601f19601f820116820180604052508101906102959190610b5d565b60015b1561029f57505b600160008154809291906102b290610ab6565b919050555050505050565b60015481565b6000808773ffffffffffffffffffffffffffffffffffffffff16866040516102ea90610c7d565b60006040518083038185875af1925050503d8060008114610327576040519150601f19603f3d011682016040523d82523d6000602084013e61032c565b606091505b5050905080610370576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161036790610d04565b60405180910390fd5b83156103d0576001600081548092919061038990610ab6565b919050555060006103cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103c690610d70565b60405180910390fd5b5b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8a8a6040518363ffffffff1660e01b815260040161042e929190610b1f565b6020604051808303816000875af115801561044d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104719190610b5d565b9050806104b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104aa90610d04565b60405180910390fd5b831561051357600160008154809291906104cc90610ab6565b91905055506000610512576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161050990610d70565b60405180910390fd5b5b8873ffffffffffffffffffffffffffffffffffffffff168660405161053790610c7d565b60006040518083038185875af1925050503d8060008114610574576040519150601f19603f3d011682016040523d82523d6000602084013e610579565b606091505b505080925050816105bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b690610d04565b60405180910390fd5b81925050509695505050505050565b6000600160008154809291906105e390610ab6565b919050555060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb87876040518363ffffffff1660e01b8152600401610646929190610d9f565b6020604051808303816000875af1158015610665573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106899190610b5d565b905083156106d35760006106d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c990610d70565b60405180910390fd5b5b600160008154809291906106e690610dc8565b91905055508215610733576000610732576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072990610d70565b60405180910390fd5b5b80915050949350505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061079382610768565b9050919050565b6107a381610788565b81146107ae57600080fd5b50565b6000813590506107c08161079a565b92915050565b6000819050919050565b6107d9816107c6565b81146107e457600080fd5b50565b6000813590506107f6816107d0565b92915050565b60008060006060848603121561081557610814610763565b5b6000610823868287016107b1565b9350506020610834868287016107e7565b9250506040610845868287016107e7565b9150509250925092565b610858816107c6565b82525050565b6000602082019050610873600083018461084f565b92915050565b60008115159050919050565b61088e81610879565b811461089957600080fd5b50565b6000813590506108ab81610885565b92915050565b60008060008060008060c087890312156108ce576108cd610763565b5b60006108dc89828a016107b1565b96505060206108ed89828a016107e7565b95505060406108fe89828a016107e7565b945050606061090f89828a016107e7565b935050608061092089828a0161089c565b92505060a061093189828a0161089c565b9150509295509295509295565b61094781610879565b82525050565b6000602082019050610962600083018461093e565b92915050565b600061097382610768565b9050919050565b61098381610968565b811461098e57600080fd5b50565b6000813590506109a08161097a565b92915050565b600080600080608085870312156109c0576109bf610763565b5b60006109ce87828801610991565b94505060206109df878288016107e7565b93505060406109f08782880161089c565b9250506060610a018782880161089c565b91505092959194509250565b6000819050919050565b6000610a32610a2d610a2884610768565b610a0d565b610768565b9050919050565b6000610a4482610a17565b9050919050565b6000610a5682610a39565b9050919050565b610a6681610a4b565b82525050565b6000602082019050610a816000830184610a5d565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610ac1826107c6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610af357610af2610a87565b5b600182019050919050565b6000610b0982610a39565b9050919050565b610b1981610afe565b82525050565b6000604082019050610b346000830185610b10565b610b41602083018461084f565b9392505050565b600081519050610b5781610885565b92915050565b600060208284031215610b7357610b72610763565b5b6000610b8184828501610b48565b91505092915050565b600082825260208201905092915050565b7f6661696c20746f207472616e7366657200000000000000000000000000000000600082015250565b6000610bd1601083610b8a565b9150610bdc82610b9b565b602082019050919050565b60006020820190508181036000830152610c0081610bc4565b9050919050565b6000608082019050610c1c6000830187610b10565b610c29602083018661084f565b610c36604083018561093e565b610c43606083018461093e565b95945050505050565b600081905092915050565b50565b6000610c67600083610c4c565b9150610c7282610c57565b600082019050919050565b6000610c8882610c5a565b9150819050919050565b7f4661696c656420746f2073656e6420457468657220746f2064656c656761746f60008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000610cee602183610b8a565b9150610cf982610c92565b604082019050919050565b60006020820190508181036000830152610d1d81610ce1565b9050919050565b7f7265766572742068657265000000000000000000000000000000000000000000600082015250565b6000610d5a600b83610b8a565b9150610d6582610d24565b602082019050919050565b60006020820190508181036000830152610d8981610d4d565b9050919050565b610d9981610968565b82525050565b6000604082019050610db46000830185610d90565b610dc1602083018461084f565b9392505050565b6000610dd3826107c6565b915060008203610de657610de5610a87565b5b60018203905091905056fea2646970667358221220585fa7c4d4a54121bbfa7152809da68f2c4de484e09def8d1501a0fb7048e3f064736f6c63430008130033", + "deployedBytecode": "0x60806040526004361061004a5760003560e01c8063268d070a1461004f57806361bc221a1461006b5780636bc7b7cd14610096578063d0fedf55146100c6578063fc0c546a146100f6575b600080fd5b610069600480360381019061006491906107fc565b610121565b005b34801561007757600080fd5b506100806102bd565b60405161008d919061085e565b60405180910390f35b6100b060048036038101906100ab91906108b1565b6102c3565b6040516100bd919061094d565b60405180910390f35b6100e060048036038101906100db91906109a6565b6105ce565b6040516100ed919061094d565b60405180910390f35b34801561010257600080fd5b5061010b61073f565b6040516101189190610a6c565b60405180910390f35b6001600081548092919061013490610ab6565b919050555060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040518363ffffffff1660e01b8152600401610197929190610b1f565b6020604051808303816000875af11580156101b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101da9190610b5d565b90508061021c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161021390610be7565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1663d0fedf5585846001806040518563ffffffff1660e01b815260040161025c9493929190610c07565b6020604051808303816000875af192505050801561029857506040513d601f19601f820116820180604052508101906102959190610b5d565b60015b1561029f57505b600160008154809291906102b290610ab6565b919050555050505050565b60015481565b6000808773ffffffffffffffffffffffffffffffffffffffff16866040516102ea90610c7d565b60006040518083038185875af1925050503d8060008114610327576040519150601f19603f3d011682016040523d82523d6000602084013e61032c565b606091505b5050905080610370576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161036790610d04565b60405180910390fd5b83156103d0576001600081548092919061038990610ab6565b919050555060006103cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103c690610d70565b60405180910390fd5b5b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8a8a6040518363ffffffff1660e01b815260040161042e929190610b1f565b6020604051808303816000875af115801561044d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104719190610b5d565b9050806104b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104aa90610d04565b60405180910390fd5b831561051357600160008154809291906104cc90610ab6565b91905055506000610512576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161050990610d70565b60405180910390fd5b5b8873ffffffffffffffffffffffffffffffffffffffff168660405161053790610c7d565b60006040518083038185875af1925050503d8060008114610574576040519150601f19603f3d011682016040523d82523d6000602084013e610579565b606091505b505080925050816105bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b690610d04565b60405180910390fd5b81925050509695505050505050565b6000600160008154809291906105e390610ab6565b919050555060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb87876040518363ffffffff1660e01b8152600401610646929190610d9f565b6020604051808303816000875af1158015610665573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106899190610b5d565b905083156106d35760006106d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c990610d70565b60405180910390fd5b5b600160008154809291906106e690610dc8565b91905055508215610733576000610732576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072990610d70565b60405180910390fd5b5b80915050949350505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061079382610768565b9050919050565b6107a381610788565b81146107ae57600080fd5b50565b6000813590506107c08161079a565b92915050565b6000819050919050565b6107d9816107c6565b81146107e457600080fd5b50565b6000813590506107f6816107d0565b92915050565b60008060006060848603121561081557610814610763565b5b6000610823868287016107b1565b9350506020610834868287016107e7565b9250506040610845868287016107e7565b9150509250925092565b610858816107c6565b82525050565b6000602082019050610873600083018461084f565b92915050565b60008115159050919050565b61088e81610879565b811461089957600080fd5b50565b6000813590506108ab81610885565b92915050565b60008060008060008060c087890312156108ce576108cd610763565b5b60006108dc89828a016107b1565b96505060206108ed89828a016107e7565b95505060406108fe89828a016107e7565b945050606061090f89828a016107e7565b935050608061092089828a0161089c565b92505060a061093189828a0161089c565b9150509295509295509295565b61094781610879565b82525050565b6000602082019050610962600083018461093e565b92915050565b600061097382610768565b9050919050565b61098381610968565b811461098e57600080fd5b50565b6000813590506109a08161097a565b92915050565b600080600080608085870312156109c0576109bf610763565b5b60006109ce87828801610991565b94505060206109df878288016107e7565b93505060406109f08782880161089c565b9250506060610a018782880161089c565b91505092959194509250565b6000819050919050565b6000610a32610a2d610a2884610768565b610a0d565b610768565b9050919050565b6000610a4482610a17565b9050919050565b6000610a5682610a39565b9050919050565b610a6681610a4b565b82525050565b6000602082019050610a816000830184610a5d565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610ac1826107c6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610af357610af2610a87565b5b600182019050919050565b6000610b0982610a39565b9050919050565b610b1981610afe565b82525050565b6000604082019050610b346000830185610b10565b610b41602083018461084f565b9392505050565b600081519050610b5781610885565b92915050565b600060208284031215610b7357610b72610763565b5b6000610b8184828501610b48565b91505092915050565b600082825260208201905092915050565b7f6661696c20746f207472616e7366657200000000000000000000000000000000600082015250565b6000610bd1601083610b8a565b9150610bdc82610b9b565b602082019050919050565b60006020820190508181036000830152610c0081610bc4565b9050919050565b6000608082019050610c1c6000830187610b10565b610c29602083018661084f565b610c36604083018561093e565b610c43606083018461093e565b95945050505050565b600081905092915050565b50565b6000610c67600083610c4c565b9150610c7282610c57565b600082019050919050565b6000610c8882610c5a565b9150819050919050565b7f4661696c656420746f2073656e6420457468657220746f2064656c656761746f60008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000610cee602183610b8a565b9150610cf982610c92565b604082019050919050565b60006020820190508181036000830152610d1d81610ce1565b9050919050565b7f7265766572742068657265000000000000000000000000000000000000000000600082015250565b6000610d5a600b83610b8a565b9150610d6582610d24565b602082019050919050565b60006020820190508181036000830152610d8981610d4d565b9050919050565b610d9981610968565b82525050565b6000604082019050610db46000830185610d90565b610dc1602083018461084f565b9392505050565b6000610dd3826107c6565b915060008203610de657610de5610a87565b5b60018203905091905056fea2646970667358221220585fa7c4d4a54121bbfa7152809da68f2c4de484e09def8d1501a0fb7048e3f064736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/precompiles/erc20/testdata/ERC20TestCaller.sol b/precompiles/erc20/testdata/ERC20TestCaller.sol new file mode 100644 index 0000000000..dabb16e5e1 --- /dev/null +++ b/precompiles/erc20/testdata/ERC20TestCaller.sol @@ -0,0 +1,89 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity >=0.8.17; + +import "../IERC20.sol" as erc20Precompile; + +/// @title ERC20TestCaller +/// @author Evmos Core Team +/// @dev This contract is used to test external contract calls to the ERC20 precompile. +contract ERC20TestCaller { + erc20Precompile.IERC20 public token; + uint256 public counter; + + constructor(address tokenAddress) { + token = erc20Precompile.IERC20(tokenAddress); + counter = 0; + } + + function transferWithRevert( + address to, + uint256 amount, + bool before, + bool aft + ) public payable returns (bool) { + counter++; + + bool res = token.transfer(to, amount); + + if (before) { + require(false, "revert here"); + } + + counter--; + + if (aft) { + require(false, "revert here"); + } + return res; + } + + function testTransferAndSend( + address payable _source, + uint256 amount_to_transfer, + uint256 amount_to_send, + uint256 amount_to_send_after, + bool _before, + bool _after + ) public payable returns (bool) { + (bool sent, ) = _source.call{value: amount_to_send}(""); + require(sent, "Failed to send Ether to delegator"); + + if (_before) { + counter++; + require(false, "revert here"); + } + + bool res = token.transfer(_source, amount_to_transfer); + require(res, "Failed to send Ether to delegator"); + + if (_after) { + counter++; + require(false, "revert here"); + } + + (sent, ) = _source.call{value: amount_to_send_after}(""); + require(sent, "Failed to send Ether to delegator"); + + return sent; + } + + function transfersWithTry( + address payable receiver, + uint256 amount_to_transfer, + uint256 amount_to_fail + ) public payable { + counter++; + bool res = token.transfer(receiver, amount_to_transfer); + require(res, "fail to transfer"); + try + ERC20TestCaller(address(this)) + .transferWithRevert( + receiver, + amount_to_fail, + true, + true + ) + {} catch {} + counter++; + } +} diff --git a/precompiles/werc20/testdata/wevmos.go b/precompiles/erc20/testdata/erc20_test_caller.go similarity index 66% rename from precompiles/werc20/testdata/wevmos.go rename to precompiles/erc20/testdata/erc20_test_caller.go index bccb371e31..0984c461b3 100644 --- a/precompiles/werc20/testdata/wevmos.go +++ b/precompiles/erc20/testdata/erc20_test_caller.go @@ -8,6 +8,6 @@ import ( evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) -func LoadWEVMOSContract() (evmtypes.CompiledContract, error) { - return contractutils.LegacyLoadContractFromJSONFile("WEVMOS.json") +func LoadERC20TestCaller() (evmtypes.CompiledContract, error) { + return contractutils.LoadContractFromJSONFile("ERC20TestCaller.json") } diff --git a/precompiles/erc20/tx.go b/precompiles/erc20/tx.go index 1cd5de725b..68f9b9d69f 100644 --- a/precompiles/erc20/tx.go +++ b/precompiles/erc20/tx.go @@ -13,6 +13,8 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" + cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v18/utils" "github.com/evmos/evmos/v18/x/evm/core/vm" ) @@ -30,7 +32,7 @@ var SendMsgURL = sdk.MsgTypeURL(&banktypes.MsgSend{}) // Transfer executes a direct transfer from the caller address to the // destination address. -func (p Precompile) Transfer( +func (p *Precompile) Transfer( ctx sdk.Context, contract *vm.Contract, stateDB vm.StateDB, @@ -48,7 +50,7 @@ func (p Precompile) Transfer( // TransferFrom executes a transfer on behalf of the specified from address in // the call data to the destination address. -func (p Precompile) TransferFrom( +func (p *Precompile) TransferFrom( ctx sdk.Context, contract *vm.Contract, stateDB vm.StateDB, @@ -66,7 +68,7 @@ func (p Precompile) TransferFrom( // transfer is a common function that handles transfers for the ERC-20 Transfer // and TransferFrom methods. It executes a bank Send message if the spender is // the sender of the transfer, otherwise it executes an authorization. -func (p Precompile) transfer( +func (p *Precompile) transfer( ctx sdk.Context, contract *vm.Contract, stateDB vm.StateDB, @@ -107,6 +109,12 @@ func (p Precompile) transfer( return nil, err } + // TODO: where should we get this + if p.tokenPair.Denom == utils.BaseDenom { + p.SetBalanceChangeEntries(cmn.NewBalanceChangeEntry(from, msg.Amount.AmountOf(utils.BaseDenom).BigInt(), cmn.Sub), + cmn.NewBalanceChangeEntry(to, msg.Amount.AmountOf(utils.BaseDenom).BigInt(), cmn.Add)) + } + if err = p.EmitTransferEvent(ctx, stateDB, from, to, amount); err != nil { return nil, err } diff --git a/precompiles/erc20/utils_test.go b/precompiles/erc20/utils_test.go index c278bf2b1e..e65e87f051 100644 --- a/precompiles/erc20/utils_test.go +++ b/precompiles/erc20/utils_test.go @@ -225,7 +225,7 @@ func (s *PrecompileTestSuite) setupERC20Precompile(denom string) *erc20.Precompi // TODO: refactor func (is *IntegrationTestSuite) setupERC20Precompile(denom string) *erc20.Precompile { tokenPair := erc20types.NewTokenPair(utiltx.GenerateAddress(), denom, erc20types.OWNER_MODULE) - is.network.App.Erc20Keeper.SetTokenPair(is.network.GetContext(), tokenPair) + is.network.App.Erc20Keeper.SetToken(is.network.GetContext(), tokenPair) precompile, err := setupERC20PrecompileForTokenPair(*is.network, tokenPair) Expect(err).ToNot(HaveOccurred(), "failed to set up %q erc20 precompile", tokenPair.Denom) @@ -248,7 +248,10 @@ func setupERC20PrecompileForTokenPair( return nil, errorsmod.Wrapf(err, "failed to create %q erc20 precompile", tokenPair.Denom) } - err = unitNetwork.App.EvmKeeper.AddEVMExtensions(unitNetwork.GetContext(), precompile) + err = unitNetwork.App.Erc20Keeper.EnableDynamicPrecompiles( + unitNetwork.GetContext(), + precompile.Address(), + ) if err != nil { return nil, errorsmod.Wrapf(err, "failed to add %q erc20 precompile to EVM extensions", tokenPair.Denom) } diff --git a/precompiles/p256/integration_test.go b/precompiles/p256/integration_test.go index a533b4351a..081a7267f8 100644 --- a/precompiles/p256/integration_test.go +++ b/precompiles/p256/integration_test.go @@ -114,12 +114,12 @@ var _ = Describe("Calling p256 precompile directly", Label("P256 Precompile"), O params := evmtypes.DefaultParams() addr := s.precompileAddress.String() var activePrecompiles []string - for _, precompile := range params.ActivePrecompiles { + for _, precompile := range params.ActiveStaticPrecompiles { if precompile != addr { activePrecompiles = append(activePrecompiles, precompile) } } - params.ActivePrecompiles = activePrecompiles + params.ActiveStaticPrecompiles = activePrecompiles err := s.network.UpdateEvmParams(params) Expect(err).To(BeNil()) }) @@ -134,8 +134,7 @@ var _ = Describe("Calling p256 precompile directly", Label("P256 Precompile"), O } _, err := s.factory.ExecuteEthTx(senderKey.Priv, args) - Expect(err).To(HaveOccurred(), "expected error while calling the precompile") - Expect(err.Error()).To(ContainSubstring("precompile not enabled")) + Expect(err).To(BeNil(), "expected no error since contract doesnt exists") }, Entry( "valid signature", diff --git a/precompiles/staking/integration_test.go b/precompiles/staking/integration_test.go index 6617c3f7f8..9c2b65fc96 100644 --- a/precompiles/staking/integration_test.go +++ b/precompiles/staking/integration_test.go @@ -83,32 +83,45 @@ var _ = Describe("Calling staking precompile directly", func() { }) Describe("when the precompile is not enabled in the EVM params", func() { - It("should return an error", func() { + It("should succeed but not perform delegation", func() { // disable the precompile params := s.app.EvmKeeper.GetParams(s.ctx) var activePrecompiles []string - for _, precompile := range params.ActivePrecompiles { + for _, precompile := range params.ActiveStaticPrecompiles { if precompile != s.precompile.Address().String() { activePrecompiles = append(activePrecompiles, precompile) } } - params.ActivePrecompiles = activePrecompiles + params.ActiveStaticPrecompiles = activePrecompiles err := s.app.EvmKeeper.SetParams(s.ctx, params) Expect(err).To(BeNil(), "error while setting params") + // get the delegation that is available prior to the test + prevDelegation, _ := s.app.StakingKeeper.GetDelegation(s.ctx, s.address.Bytes(), valAddr) + // try to call the precompile delegateArgs := defaultCallArgs. WithMethodName(staking.DelegateMethod). WithArgs( s.address, valAddr.String(), big.NewInt(2e18), ) + // Contract should not be called but the transaction should be successful + // This is the expected behavior in Ethereum where there is a contract call + // to a non existing contract + expectedCheck := defaultLogCheck. + WithExpEvents([]string{}...). + WithExpPass(true) - failCheck := defaultLogCheck. - WithErrContains("precompile not enabled") + _, _, err = contracts.CallContractAndCheckLogs( + s.ctx, + s.app, + delegateArgs, + expectedCheck, + ) + Expect(err).To(BeNil(), "unexpected error while calling the precompile") - _, _, err = contracts.CallContractAndCheckLogs(s.ctx, s.app, delegateArgs, failCheck) - Expect(err).To(HaveOccurred(), "expected error while calling the precompile") - Expect(err.Error()).To(ContainSubstring("precompile not enabled")) + postDelegation, _ := s.app.StakingKeeper.GetDelegation(s.ctx, s.address.Bytes(), valAddr) + Expect(postDelegation).To(Equal(prevDelegation), "expected delegation to not change") }) }) @@ -1719,12 +1732,12 @@ var _ = Describe("Calling staking precompile via Solidity", func() { // disable the precompile params := s.app.EvmKeeper.GetParams(s.ctx) var activePrecompiles []string - for _, precompile := range params.ActivePrecompiles { + for _, precompile := range params.ActiveStaticPrecompiles { if precompile != s.precompile.Address().String() { activePrecompiles = append(activePrecompiles, precompile) } } - params.ActivePrecompiles = activePrecompiles + params.ActiveStaticPrecompiles = activePrecompiles err := s.app.EvmKeeper.SetParams(s.ctx, params) Expect(err).To(BeNil(), "error while setting params") diff --git a/precompiles/staking/staking_test.go b/precompiles/staking/staking_test.go index 9a13769183..189c8ec7ed 100644 --- a/precompiles/staking/staking_test.go +++ b/precompiles/staking/staking_test.go @@ -449,12 +449,10 @@ func (s *PrecompileTestSuite) TestRun() { s.ctx, msg, cfg, nil, s.stateDB, ) - params := s.app.EvmKeeper.GetParams(s.ctx) - activePrecompiles := params.GetActivePrecompilesAddrs() - precompileMap := s.app.EvmKeeper.Precompiles(activePrecompiles...) - err = vm.ValidatePrecompiles(precompileMap, activePrecompiles) - s.Require().NoError(err, "invalid precompiles", activePrecompiles) - evm.WithPrecompiles(precompileMap, activePrecompiles) + precompiles, found, err := s.app.EvmKeeper.GetPrecompileInstance(s.ctx, contractAddr) + s.Require().NoError(err, "failed to instantiate precompile") + s.Require().True(found, "not found precompile") + evm.WithPrecompiles(precompiles.Map, precompiles.Addresses) // Run precompiled contract bz, err := s.precompile.Run(evm, contract, tc.readOnly) diff --git a/precompiles/testutil/contracts/contracts.go b/precompiles/testutil/contracts/contracts.go index e735739692..4228aadeb2 100644 --- a/precompiles/testutil/contracts/contracts.go +++ b/precompiles/testutil/contracts/contracts.go @@ -84,7 +84,7 @@ func Call(ctx sdk.Context, app *evmosapp.Evmos, args CallArgs) (res abci.Respons res, err = evmosutil.DeliverEthTx(app, args.PrivKey, msg) if err != nil { - return abci.ResponseDeliverTx{}, nil, fmt.Errorf("error during deliver tx: %s", err) + return res, nil, fmt.Errorf("error during deliver tx: %s", err) } if !res.IsOK() { return res, nil, fmt.Errorf("error during deliver tx: %v", res.Log) @@ -103,7 +103,7 @@ func Call(ctx sdk.Context, app *evmosapp.Evmos, args CallArgs) (res abci.Respons func CallContractAndCheckLogs(ctx sdk.Context, app *evmosapp.Evmos, cArgs CallArgs, logCheckArgs testutil.LogCheckArgs) (abci.ResponseDeliverTx, *evmtypes.MsgEthereumTxResponse, error) { res, ethRes, err := Call(ctx, app, cArgs) if err != nil { - return abci.ResponseDeliverTx{}, nil, err + return res, nil, err } logCheckArgs.Res = res diff --git a/precompiles/werc20/IWERC20.sol b/precompiles/werc20/IWERC20.sol deleted file mode 100644 index b571494eaf..0000000000 --- a/precompiles/werc20/IWERC20.sol +++ /dev/null @@ -1,40 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity >=0.8.18; - -import "./../erc20/IERC20MetadataAllowance.sol"; - -/** - * @author Evmos Team - * @title Wrapped ERC20 Interface - * @dev Interface for representing the native EVM token as ERC20 standard. - */ -interface IWERC20 is IERC20MetadataAllowance { - /// @dev Emitted when the native tokens are deposited in exchange for the wrapped ERC20. - /// @param dst The account for which the deposit is made. - /// @param wad The amount of native tokens deposited. - event Deposit(address indexed dst, uint256 wad); - - /// @dev Emitted when the native token is withdrawn. - /// @param src The account for which the withdrawal is made. - /// @param wad The amount of native tokens withdrawn. - event Withdrawal(address indexed src, uint256 wad); - - /// @dev Default fallback payable function. Calls the deposit method. - fallback() external payable; - - /// @dev Default receive payable function. Calls the deposit method. - receive() external payable; - - /// @dev Deposits native tokens in exchange for wrapped ERC20 token. - /// @dev After execution of this function the SetBalance function - /// @dev burns the tokens and increases the contract balance of the ERC20 tokens. - /// @dev Emits a Deposit Event. - function deposit() external payable; - - /// @dev Withdraws native tokens from wrapped ERC20 token. - /// @dev After execution of this function the SetBalance function - /// @dev decreases the contract balance of the ERC20 tokens and mints the tokens. - /// @dev Emits a Withdrawal Event. - /// @param wad The amount of native tokens to be withdrawn. - function withdraw(uint256 wad) external; -} diff --git a/precompiles/werc20/abi.json b/precompiles/werc20/abi.json deleted file mode 100644 index eac5c1280f..0000000000 --- a/precompiles/werc20/abi.json +++ /dev/null @@ -1,347 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "IWERC20", - "sourceName": "solidity/precompiles/werc20/IWERC20.sol", - "abi": [ - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "dst", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "wad", - "type": "uint256" - } - ], - "name": "Deposit", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Transfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "src", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "wad", - "type": "uint256" - } - ], - "name": "Withdrawal", - "type": "event" - }, - { - "stateMutability": "payable", - "type": "fallback" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", - "type": "address" - } - ], - "name": "allowance", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "subtractedValue", - "type": "uint256" - } - ], - "name": "decreaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "approved", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "deposit", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "addedValue", - "type": "uint256" - } - ], - "name": "increaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "approved", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "wad", - "type": "uint256" - } - ], - "name": "withdraw", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "stateMutability": "payable", - "type": "receive" - } - ], - "bytecode": "0x", - "deployedBytecode": "0x", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/precompiles/werc20/integration_test.go b/precompiles/werc20/integration_test.go deleted file mode 100644 index e40ece434f..0000000000 --- a/precompiles/werc20/integration_test.go +++ /dev/null @@ -1,579 +0,0 @@ -package werc20_test - -import ( - "math/big" - - sdk "github.com/cosmos/cosmos-sdk/types" - auth "github.com/evmos/evmos/v18/precompiles/authorization" - "github.com/evmos/evmos/v18/precompiles/erc20" - evmosutiltx "github.com/evmos/evmos/v18/testutil/tx" - - "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/precompiles/testutil" - "github.com/evmos/evmos/v18/precompiles/werc20" - "github.com/evmos/evmos/v18/precompiles/werc20/testdata" - "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" - erc20types "github.com/evmos/evmos/v18/x/erc20/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" - - //nolint:revive // dot imports are fine for Ginkgo - . "github.com/onsi/ginkgo/v2" - //nolint:revive // dot imports are fine for Ginkgo - . "github.com/onsi/gomega" -) - -const ( - // EventTypeDeposit defines the event type for the Deposit transaction. - EventTypeDeposit = "Deposit" - // EventTypeWithdrawal defines the event type for the Withdraw transaction. - EventTypeWithdrawal = "Withdrawal" -) - -var _ = Describe("WEVMOS Extension -", func() { - var ( - WERC20ContractAddr common.Address - WEVMOSOriginalContractAddr common.Address - err error - sender keyring.Key - amount *big.Int - - // contractData is a helper struct to hold the addresses and ABIs for the - // different contract instances that are subject to testing here. - contractData ContractData - contractDataOriginal ContractData - - wevmosContract evmtypes.CompiledContract - - failCheck testutil.LogCheckArgs - passCheck testutil.LogCheckArgs - ) - - BeforeEach(func() { - s.SetupTest() - - sender = s.keyring.GetKey(0) - - wevmosContract, err = testdata.LoadWEVMOSContract() - Expect(err).ToNot(HaveOccurred(), "failed to load WEVMOS contract") - - WERC20ContractAddr, err = s.factory.DeployContract( - sender.Priv, - evmtypes.EvmTxArgs{}, // NOTE: passing empty struct to use default values - factory.ContractDeploymentData{ - Contract: wevmosContract, - ConstructorArgs: []interface{}{}, - }, - ) - Expect(err).ToNot(HaveOccurred(), "failed to deploy contract") - - tokenPair := erc20types.NewTokenPair(WERC20ContractAddr, s.bondDenom, erc20types.OWNER_MODULE) - - precompile, err := werc20.NewPrecompile( - tokenPair, - s.network.App.BankKeeper, - s.network.App.AuthzKeeper, - s.network.App.TransferKeeper, - ) - - Expect(err).ToNot(HaveOccurred(), "failed to create wevmos extension") - s.precompile = precompile - - err = s.network.App.EvmKeeper.AddEVMExtensions(s.network.GetContext(), precompile) - Expect(err).ToNot(HaveOccurred(), "failed to add wevmos extension") - - s.tokenDenom = tokenPair.GetDenom() - - contractData = ContractData{ - ownerPriv: sender.Priv, - erc20Addr: WERC20ContractAddr, - erc20ABI: wevmosContract.ABI, - precompileAddr: s.precompile.Address(), - precompileABI: s.precompile.ABI, - } - - failCheck = testutil.LogCheckArgs{ABIEvents: s.precompile.Events} - passCheck = failCheck.WithExpPass(true) - - err = s.network.NextBlock() - Expect(err).ToNot(HaveOccurred(), "failed to advance block") - - // Default sender and amount - sender = s.keyring.GetKey(0) - amount = big.NewInt(1e18) - }) - - Context("WEVMOS specific functions", func() { - When("calling deposit correctly", func() { - It("should not emit events", func() { - depositCheck := passCheck.WithExpPass(true) - txArgs, callArgs := s.getTxAndCallArgs(erc20Call, contractData, werc20.DepositMethod) - txArgs.Amount = amount - - _, ethRes, err := s.factory.CallContractAndCheckLogs(sender.Priv, txArgs, callArgs, depositCheck) - Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - Expect(ethRes.Logs).To(BeEmpty(), "expected no events") - }) - - It("should spend the correct minimum gas", func() { - depositCheck := passCheck.WithExpPass(true) - txArgs, callArgs := s.getTxAndCallArgs(erc20Call, contractData, werc20.DepositMethod) - txArgs.Amount = amount - - _, ethRes, err := s.factory.CallContractAndCheckLogs(sender.Priv, txArgs, callArgs, depositCheck) - Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - - Expect(ethRes.GasUsed).To(BeNumerically(">=", werc20.DepositRequiredGas), "expected different gas used") - }) - }) - - When("calling withdraw correctly", func() { - It("should not emit events", func() { - depositCheck := passCheck.WithExpPass(true) - txArgs, callArgs := s.getTxAndCallArgs(erc20Call, contractData, werc20.WithdrawMethod, amount) - txArgs.Amount = amount - - _, ethRes, err := s.factory.CallContractAndCheckLogs(sender.Priv, txArgs, callArgs, depositCheck) - Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - Expect(ethRes.Logs).To(BeEmpty(), "expected no events") - }) - - It("should spend the correct minimum gas", func() { - withdrawCheck := passCheck.WithExpPass(true) - txArgs, callArgs := s.getTxAndCallArgs(erc20Call, contractData, werc20.WithdrawMethod, amount) - - _, ethRes, err := s.factory.CallContractAndCheckLogs(sender.Priv, txArgs, callArgs, withdrawCheck) - Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - - Expect(ethRes.GasUsed).To(BeNumerically(">=", werc20.WithdrawRequiredGas), "expected different gas used") - }) - }) - - // TODO: How do we actually check the method types here? We can see the correct ones being populated by printing the line in the cmn.Precompile - When("calling with incomplete data or amount", func() { - It("calls no call data, with amount - should call `receive` ", func() { - txArgs, callArgs := s.getTxAndCallArgs(erc20Call, contractData, "") - txArgs.Amount = amount - - res, err := s.factory.ExecuteContractCall(sender.Priv, txArgs, callArgs) - Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - - depositCheck := passCheck.WithExpPass(true) - depositCheck.Res = res - err = testutil.CheckLogs(depositCheck) - Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - - s.checkBalances(failCheck, sender, contractData) - }) - - It("calls short call data, with amount - should call `fallback` ", func() { - txArgs, _ := s.getTxAndCallArgs(erc20Call, contractData, "") - txArgs.Amount = amount - txArgs.Input = []byte{1, 2, 3} // 3 dummy bytes - - res, err := s.factory.ExecuteEthTx(sender.Priv, txArgs) - Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - - depositCheck := passCheck.WithExpPass(true) - depositCheck.Res = res - err = testutil.CheckLogs(depositCheck) - Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - - s.checkBalances(failCheck, sender, contractData) - }) - - It("calls with non-existing function, with amount - should call `fallback` ", func() { - txArgs, _ := s.getTxAndCallArgs(erc20Call, contractData, "") - txArgs.Input = []byte("nonExistingMethod") - txArgs.Amount = amount - - res, err := s.factory.ExecuteEthTx(sender.Priv, txArgs) - Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - - depositCheck := passCheck.WithExpPass(true) - depositCheck.Res = res - err = testutil.CheckLogs(depositCheck) - Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - - s.checkBalances(failCheck, sender, contractData) - }) - - It("calls non call data, without amount - should call `fallback` ", func() { - txArgs, _ := s.getTxAndCallArgs(erc20Call, contractData, "") - - res, err := s.factory.ExecuteEthTx(sender.Priv, txArgs) - Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - - depositCheck := passCheck.WithExpPass(true) - depositCheck.Res = res - err = testutil.CheckLogs(depositCheck) - Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - - s.checkBalances(failCheck, sender, contractData) - }) - - It("calls short call data, without amount - should call `fallback` ", func() { - txArgs, _ := s.getTxAndCallArgs(erc20Call, contractData, "") - txArgs.Input = []byte{1, 2, 3} // 3 dummy bytes - - res, err := s.factory.ExecuteEthTx(sender.Priv, txArgs) - Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - - depositCheck := passCheck.WithExpPass(true) - depositCheck.Res = res - err = testutil.CheckLogs(depositCheck) - Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - - s.checkBalances(failCheck, sender, contractData) - }) - - It("calls with non-existing function, without amount - should call `fallback` ", func() { - txArgs, _ := s.getTxAndCallArgs(erc20Call, contractData, "") - txArgs.Input = []byte("nonExistingMethod") - - res, err := s.factory.ExecuteEthTx(sender.Priv, txArgs) - Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - - depositCheck := passCheck.WithExpPass(true) - depositCheck.Res = res - err = testutil.CheckLogs(depositCheck) - Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - - s.checkBalances(failCheck, sender, contractData) - }) - }) - }) - - Context("Comparing to original WEVMOS contract", func() { - BeforeEach(func() { - WEVMOSOriginalContractAddr, err = s.factory.DeployContract( - sender.Priv, - evmtypes.EvmTxArgs{}, // NOTE: passing empty struct to use default values - factory.ContractDeploymentData{ - Contract: wevmosContract, - ConstructorArgs: []interface{}{}, - }, - ) - Expect(err).ToNot(HaveOccurred(), "failed to deploy contract") - contractDataOriginal = ContractData{ - ownerPriv: sender.Priv, - erc20Addr: WEVMOSOriginalContractAddr, - erc20ABI: wevmosContract.ABI, - } - }) - - When("calling deposit", func() { - It("should have exact gas consumption", func() { - depositCheck := passCheck.WithExpPass(true) - txArgsPrecompile, callArgsPrecompile := s.getTxAndCallArgs(erc20Call, contractData, werc20.DepositMethod) - txArgsPrecompile.Amount = amount - - _, ethResPrecompile, err := s.factory.CallContractAndCheckLogs(sender.Priv, txArgsPrecompile, callArgsPrecompile, depositCheck) - Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - - txArgsContract, callArgsContract := s.getTxAndCallArgs(erc20Call, contractDataOriginal, werc20.DepositMethod) - txArgsContract.Amount = amount - txArgsContract.GasLimit = 50_000 - - depositCheckContract := passCheck.WithExpPass(true).WithExpEvents(EventTypeDeposit) - _, ethResOriginal, err := s.factory.CallContractAndCheckLogs(sender.Priv, txArgsContract, callArgsContract, depositCheckContract) - Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - - Expect(ethResOriginal.GasUsed).To(Equal(ethResPrecompile.GasUsed), "expected exact gas used") - }) - - It("should return the same error", func() { - depositCheck := passCheck.WithExpPass(true) - txArgsPrecompile, callArgsPrecompile := s.getTxAndCallArgs(erc20Call, contractData, werc20.DepositMethod) - // Increase the amount to 9e18 to trigger the insufficient balance error - txArgsPrecompile.Amount = big.NewInt(9e18) - txArgsPrecompile.GasLimit = 50_000 - - _, _, errPrecompile := s.factory.CallContractAndCheckLogs(sender.Priv, txArgsPrecompile, callArgsPrecompile, depositCheck) - Expect(errPrecompile).To(HaveOccurred(), "unexpected result calling contract") - - txArgsContract, callArgsContract := s.getTxAndCallArgs(erc20Call, contractDataOriginal, werc20.DepositMethod) - // Increase the amount to 9e18 to trigger the insufficient balance error - txArgsContract.Amount = big.NewInt(9e18) - txArgsContract.GasLimit = 50_000 - - _, _, errOriginal := s.factory.CallContractAndCheckLogs(sender.Priv, txArgsContract, callArgsContract, depositCheck) - Expect(errOriginal).To(HaveOccurred(), "unexpected result calling contract") - - Expect(errOriginal.Error()).To(Equal(errPrecompile.Error()), "expected same error") - }) - - It("should reflect the correct balances", func() { - depositCheck := passCheck.WithExpPass(true) - txArgsPrecompile, callArgsPrecompile := s.getTxAndCallArgs(erc20Call, contractData, werc20.DepositMethod) - txArgsPrecompile.Amount = amount - - _, _, errPrecompile := s.factory.CallContractAndCheckLogs(sender.Priv, txArgsPrecompile, callArgsPrecompile, depositCheck) - Expect(errPrecompile).ToNot(HaveOccurred(), "unexpected result calling contract") - - txArgsContract, callArgsContract := s.getTxAndCallArgs(erc20Call, contractDataOriginal, werc20.DepositMethod) - txArgsContract.Amount = amount - txArgsContract.GasLimit = 50_000 - - depositCheckContract := passCheck.WithExpPass(true).WithExpEvents(EventTypeDeposit) - _, _, errOriginal := s.factory.CallContractAndCheckLogs(sender.Priv, txArgsContract, callArgsContract, depositCheckContract) - Expect(errOriginal).ToNot(HaveOccurred(), "unexpected result calling contract") - - // Check balances after calling precompile - s.checkBalances(failCheck, sender, contractData) - - // Check balances after calling original contract - balanceCheck := failCheck.WithExpPass(true) - txArgs, balancesArgs := s.getTxAndCallArgs(erc20Call, contractDataOriginal, erc20.BalanceOfMethod, sender.Addr) - - _, ethRes, err := s.factory.CallContractAndCheckLogs(sender.Priv, txArgs, balancesArgs, balanceCheck) - Expect(err).ToNot(HaveOccurred(), "failed to execute balanceOf") - - // Check the balance in the bank module is the same as calling `balanceOf` on the precompile - var erc20Balance *big.Int - err = s.precompile.UnpackIntoInterface(&erc20Balance, erc20.BalanceOfMethod, ethRes.Ret) - Expect(err).ToNot(HaveOccurred(), "failed to unpack result") - Expect(erc20Balance).To(Equal(amount), "expected different balance") - }) - }) - - When("calling withdraw", func() { - BeforeEach(func() { - // Deposit into the WEVMOS contract to have something to withdraw - depositCheck := passCheck.WithExpPass(true).WithExpEvents(EventTypeDeposit) - txArgsContract, callArgsContract := s.getTxAndCallArgs(erc20Call, contractDataOriginal, werc20.DepositMethod) - txArgsContract.Amount = amount - txArgsContract.GasLimit = 50_000 - - _, _, err := s.factory.CallContractAndCheckLogs(sender.Priv, txArgsContract, callArgsContract, depositCheck) - Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - }) - - It("should have exact gas consumption", func() { - withdrawCheck := passCheck.WithExpPass(true) - txArgsPrecompile, callArgsPrecompile := s.getTxAndCallArgs(erc20Call, contractData, werc20.WithdrawMethod, amount) - - _, ethResPrecompile, err := s.factory.CallContractAndCheckLogs(sender.Priv, txArgsPrecompile, callArgsPrecompile, withdrawCheck) - Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - - txArgsContract, callArgsContract := s.getTxAndCallArgs(erc20Call, contractDataOriginal, werc20.WithdrawMethod, amount) - - withdrawCheckContract := passCheck.WithExpPass(true).WithExpEvents(EventTypeWithdrawal) - _, ethResOriginal, err := s.factory.CallContractAndCheckLogs(sender.Priv, txArgsContract, callArgsContract, withdrawCheckContract) - Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - - Expect(ethResOriginal.GasUsed).To(Equal(ethResPrecompile.GasUsed), "expected exact gas used") - }) - - It("should return the same error", func() { - withdrawCheck := passCheck.WithExpPass(true) - txArgsPrecompile, callArgsPrecompile := s.getTxAndCallArgs(erc20Call, contractData, werc20.WithdrawMethod) - - _, _, errPrecompile := s.factory.CallContractAndCheckLogs(sender.Priv, txArgsPrecompile, callArgsPrecompile, withdrawCheck) - Expect(errPrecompile).To(HaveOccurred(), "unexpected result calling contract") - - txArgsContract, callArgsContract := s.getTxAndCallArgs(erc20Call, contractDataOriginal, werc20.WithdrawMethod) - txArgsContract.GasLimit = 50_000 - - _, _, errOriginal := s.factory.CallContractAndCheckLogs(sender.Priv, txArgsContract, callArgsContract, withdrawCheck) - Expect(errOriginal).To(HaveOccurred(), "unexpected result calling contract") - - Expect(errOriginal.Error()).To(Equal(errPrecompile.Error()), "expected same error") - }) - }) - }) - - Context("ERC20 specific functions", func() { - When("querying name", func() { - It("should return the correct name", func() { - // Query the name - txArgs, nameArgs := s.getTxAndCallArgs(directCall, contractData, erc20.NameMethod) - - _, ethRes, err := s.factory.CallContractAndCheckLogs(sender.Priv, txArgs, nameArgs, passCheck) - Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - - var name string - err = s.precompile.UnpackIntoInterface(&name, erc20.NameMethod, ethRes.Ret) - Expect(err).ToNot(HaveOccurred(), "failed to unpack result") - Expect(name).To(Equal("Evmos"), "expected different name") - }) - }) - - When("querying symbol", func() { - It("should return the correct symbol", func() { - // Query the symbol - txArgs, symbolArgs := s.getTxAndCallArgs(directCall, contractData, erc20.SymbolMethod) - - _, ethRes, err := s.factory.CallContractAndCheckLogs(sender.Priv, txArgs, symbolArgs, passCheck) - Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - - var symbol string - err = s.precompile.UnpackIntoInterface(&symbol, erc20.SymbolMethod, ethRes.Ret) - Expect(err).ToNot(HaveOccurred(), "failed to unpack result") - Expect(symbol).To(Equal("EVMOS"), "expected different symbol") - }) - }) - - When("querying decimals", func() { - It("should return the correct decimals", func() { - // Query the decimals - txArgs, decimalsArgs := s.getTxAndCallArgs(directCall, contractData, erc20.DecimalsMethod) - - _, ethRes, err := s.factory.CallContractAndCheckLogs(sender.Priv, txArgs, decimalsArgs, passCheck) - Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - - var decimals uint8 - err = s.precompile.UnpackIntoInterface(&decimals, erc20.DecimalsMethod, ethRes.Ret) - Expect(err).ToNot(HaveOccurred(), "failed to unpack result") - Expect(decimals).To(Equal(uint8(18)), "expected different decimals") - }) - }) - - When("querying balance", func() { - It("should return an existing balance", func() { - // Query the balance - txArgs, balancesArgs := s.getTxAndCallArgs(directCall, contractData, erc20.BalanceOfMethod, sender.Addr) - - _, ethRes, err := s.factory.CallContractAndCheckLogs(sender.Priv, txArgs, balancesArgs, passCheck) - Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - - expBalance := s.network.App.BankKeeper.GetBalance(s.network.GetContext(), sender.AccAddr, s.bondDenom) - - var balance *big.Int - err = s.precompile.UnpackIntoInterface(&balance, erc20.BalanceOfMethod, ethRes.Ret) - Expect(err).ToNot(HaveOccurred(), "failed to unpack result") - Expect(balance).To(Equal(expBalance.Amount.BigInt()), "expected different balance") - }) - - It("should return a 0 balance new address", func() { - // Query the balance - txArgs, balancesArgs := s.getTxAndCallArgs(directCall, contractData, erc20.BalanceOfMethod, evmosutiltx.GenerateAddress()) - - _, ethRes, err := s.factory.CallContractAndCheckLogs(sender.Priv, txArgs, balancesArgs, passCheck) - Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - - var balance *big.Int - err = s.precompile.UnpackIntoInterface(&balance, erc20.BalanceOfMethod, ethRes.Ret) - Expect(err).ToNot(HaveOccurred(), "failed to unpack result") - Expect(balance.Int64()).To(Equal(int64(0)), "expected different balance") - }) - }) - - When("querying allowance", func() { - It("should return an existing allowance", func() { - grantee := evmosutiltx.GenerateAddress() - granter := sender - authzCoins := sdk.Coins{sdk.NewInt64Coin(s.tokenDenom, 100)} - - s.setupSendAuthzForContract(directCall, grantee, granter.Priv, authzCoins) - - txArgs, allowanceArgs := s.getTxAndCallArgs(directCall, contractData, auth.AllowanceMethod, granter.Addr, grantee) - - _, ethRes, err := s.factory.CallContractAndCheckLogs(granter.Priv, txArgs, allowanceArgs, passCheck) - Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - - var allowance *big.Int - err = s.precompile.UnpackIntoInterface(&allowance, auth.AllowanceMethod, ethRes.Ret) - Expect(err).ToNot(HaveOccurred(), "failed to unpack result") - Expect(allowance).To(Equal(authzCoins[0].Amount.BigInt()), "expected different allowance") - }) - - It("should return zero if no balance exists", func() { - address := evmosutiltx.GenerateAddress() - - // Query the balance - txArgs, balancesArgs := s.getTxAndCallArgs(directCall, contractData, erc20.BalanceOfMethod, address) - - _, ethRes, err := s.factory.CallContractAndCheckLogs(sender.Priv, txArgs, balancesArgs, passCheck) - Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - - var balance *big.Int - err = s.precompile.UnpackIntoInterface(&balance, erc20.BalanceOfMethod, ethRes.Ret) - Expect(err).ToNot(HaveOccurred(), "failed to unpack result") - Expect(balance.Int64()).To(BeZero(), "expected zero balance") - }) - }) - - When("querying total supply", func() { - It("should return the total supply", func() { - expSupply, ok := new(big.Int).SetString("11000000000000000000", 10) - Expect(ok).To(BeTrue(), "failed to parse expected supply") - - // Query the balance - txArgs, supplyArgs := s.getTxAndCallArgs(directCall, contractData, erc20.TotalSupplyMethod) - - _, ethRes, err := s.factory.CallContractAndCheckLogs(sender.Priv, txArgs, supplyArgs, passCheck) - Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - - var supply *big.Int - err = s.precompile.UnpackIntoInterface(&supply, erc20.TotalSupplyMethod, ethRes.Ret) - Expect(err).ToNot(HaveOccurred(), "failed to unpack result") - Expect(supply).To(Equal(expSupply), "expected different supply") - }) - }) - - When("transferring tokens", func() { - It("it should transfer tokens to a receiver using `transfer`", func() { - // Get receiver address - receiver := s.keyring.GetKey(1) - - senderBalance := s.network.App.BankKeeper.GetAllBalances(s.network.GetContext(), sender.AccAddr) - receiverBalance := s.network.App.BankKeeper.GetAllBalances(s.network.GetContext(), receiver.AccAddr) - - // Transfer tokens - txArgs, transferArgs := s.getTxAndCallArgs(directCall, contractData, erc20.TransferMethod, receiver.Addr, amount) - // Prefilling the gas price with the base fee to calculate expected balances after - // the transfer - baseFeeRes, err := s.grpcHandler.GetBaseFee() - Expect(err).ToNot(HaveOccurred(), "unexpected error querying base fee") - txArgs.GasPrice = baseFeeRes.BaseFee.BigInt() - - transferCoins := sdk.Coins{sdk.NewInt64Coin(s.tokenDenom, amount.Int64())} - - transferCheck := passCheck.WithExpEvents(erc20.EventTypeTransfer) - _, ethRes, err := s.factory.CallContractAndCheckLogs(sender.Priv, txArgs, transferArgs, transferCheck) - Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - - gasAmount := ethRes.GasUsed * txArgs.GasPrice.Uint64() - coinsWithGasIncluded := transferCoins.Add(sdk.NewInt64Coin(s.bondDenom, int64(gasAmount))) - s.ExpectBalances( - []ExpectedBalance{ - {address: sender.AccAddr, expCoins: senderBalance.Sub(coinsWithGasIncluded...)}, - {address: receiver.AccAddr, expCoins: receiverBalance.Add(transferCoins...)}, - }, - ) - }) - - It("it should transfer tokens to a receiver using `transferFrom`", func() { - // Get receiver address - receiver := s.keyring.GetKey(1) - - senderBalance := s.network.App.BankKeeper.GetAllBalances(s.network.GetContext(), sender.AccAddr) - receiverBalance := s.network.App.BankKeeper.GetAllBalances(s.network.GetContext(), receiver.AccAddr) - - // Transfer tokens - txArgs, transferArgs := s.getTxAndCallArgs(directCall, contractData, erc20.TransferFromMethod, sender.Addr, receiver.Addr, amount) - // Prefilling the gas price with the base fee to calculate expected balances after - // the transfer - baseFeeRes, err := s.grpcHandler.GetBaseFee() - Expect(err).ToNot(HaveOccurred(), "unexpected error querying base fee") - txArgs.GasPrice = baseFeeRes.BaseFee.BigInt() - - transferCoins := sdk.Coins{sdk.NewInt64Coin(s.tokenDenom, amount.Int64())} - - transferCheck := passCheck.WithExpEvents(erc20.EventTypeTransfer, auth.EventTypeApproval) - _, ethRes, err := s.factory.CallContractAndCheckLogs(sender.Priv, txArgs, transferArgs, transferCheck) - Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - - gasAmount := ethRes.GasUsed * txArgs.GasPrice.Uint64() - coinsWithGasIncluded := transferCoins.Add(sdk.NewInt64Coin(s.bondDenom, int64(gasAmount))) - s.ExpectBalances( - []ExpectedBalance{ - {address: sender.AccAddr, expCoins: senderBalance.Sub(coinsWithGasIncluded...)}, - {address: receiver.AccAddr, expCoins: receiverBalance.Add(transferCoins...)}, - }, - ) - }) - }) - }) -}) diff --git a/precompiles/werc20/setup_test.go b/precompiles/werc20/setup_test.go deleted file mode 100644 index 9c3e8226a0..0000000000 --- a/precompiles/werc20/setup_test.go +++ /dev/null @@ -1,59 +0,0 @@ -package werc20_test - -import ( - "testing" - - "github.com/evmos/evmos/v18/precompiles/werc20" - - "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - "github.com/stretchr/testify/suite" - - //nolint:revive // dot imports are fine for Ginkgo - . "github.com/onsi/ginkgo/v2" - //nolint:revive // dot imports are fine for Ginkgo - . "github.com/onsi/gomega" -) - -var s *PrecompileTestSuite - -// PrecompileTestSuite is the implementation of the TestSuite interface for ERC20 precompile -// unit tests. -type PrecompileTestSuite struct { - suite.Suite - - bondDenom string - network *network.UnitTestNetwork - factory factory.TxFactory - grpcHandler grpc.Handler - keyring testkeyring.Keyring - tokenDenom string - - precompile *werc20.Precompile -} - -func TestPrecompileTestSuite(t *testing.T) { - s = new(PrecompileTestSuite) - suite.Run(t, s) - - // Run Ginkgo integration tests - RegisterFailHandler(Fail) - RunSpecs(t, "WEVMOS Extension Suite") -} - -func (s *PrecompileTestSuite) SetupTest() { - keyring := testkeyring.New(2) - integrationNetwork := network.NewUnitTestNetwork( - network.WithPreFundedAccounts(keyring.GetAllAccAddrs()...), - ) - grpcHandler := grpc.NewIntegrationHandler(integrationNetwork) - txFactory := factory.New(integrationNetwork, grpcHandler) - - s.bondDenom = integrationNetwork.GetDenom() - s.factory = txFactory - s.grpcHandler = grpcHandler - s.keyring = keyring - s.network = integrationNetwork -} diff --git a/precompiles/werc20/testdata/WEVMOS.json b/precompiles/werc20/testdata/WEVMOS.json deleted file mode 100644 index 0ccdbd80a5..0000000000 --- a/precompiles/werc20/testdata/WEVMOS.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "abi": "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"src\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"guy\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"dst\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"Deposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"src\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"dst\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"src\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"Withdrawal\",\"type\":\"event\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"guy\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"dst\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"src\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"dst\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - "bin": "60806040526040518060400160405280600d81526020017f577261707065642045766d6f73000000000000000000000000000000000000008152506000908051906020019061004f9291906100ca565b506040518060400160405280600681526020017f5745564d4f5300000000000000000000000000000000000000000000000000008152506001908051906020019061009b9291906100ca565b506012600260006101000a81548160ff021916908360ff1602179055503480156100c457600080fd5b5061016f565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061010b57805160ff1916838001178555610139565b82800160010185558215610139579182015b8281111561013857825182559160200191906001019061011d565b5b509050610146919061014a565b5090565b61016c91905b80821115610168576000816000905550600101610150565b5090565b90565b610cb18061017e6000396000f3fe60806040526004361061009c5760003560e01c8063313ce56711610064578063313ce567146102a257806370a08231146102d357806395d89b4114610338578063a9059cbb146103c8578063d0e30db01461043b578063dd62ed3e146104455761009c565b806306fdde03146100a6578063095ea7b31461013657806318160ddd146101a957806323b872dd146101d45780632e1a7d4d14610267575b6100a46104ca565b005b3480156100b257600080fd5b506100bb610567565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100fb5780820151818401526020810190506100e0565b50505050905090810190601f1680156101285780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561014257600080fd5b5061018f6004803603604081101561015957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610605565b604051808215151515815260200191505060405180910390f35b3480156101b557600080fd5b506101be6106f7565b6040518082815260200191505060405180910390f35b3480156101e057600080fd5b5061024d600480360360608110156101f757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506106ff565b604051808215151515815260200191505060405180910390f35b34801561027357600080fd5b506102a06004803603602081101561028a57600080fd5b8101908080359060200190929190505050610a48565b005b3480156102ae57600080fd5b506102b7610b79565b604051808260ff1660ff16815260200191505060405180910390f35b3480156102df57600080fd5b50610322600480360360208110156102f657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b8c565b6040518082815260200191505060405180910390f35b34801561034457600080fd5b5061034d610ba4565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561038d578082015181840152602081019050610372565b50505050905090810190601f1680156103ba5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103d457600080fd5b50610421600480360360408110156103eb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c42565b604051808215151515815260200191505060405180910390f35b6104436104ca565b005b34801561045157600080fd5b506104b46004803603604081101561046857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c57565b6040518082815260200191505060405180910390f35b34600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a2565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105fd5780601f106105d2576101008083540402835291602001916105fd565b820191906000526020600020905b8154815290600101906020018083116105e057829003601f168201915b505050505081565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b600047905090565b600081600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561074d57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415801561082557507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b1561093e5781600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156108b357600080fd5b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b81600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610a9457600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610b27573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65826040518082815260200191505060405180910390a250565b600260009054906101000a900460ff1681565b60036020528060005260406000206000915090505481565b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610c3a5780601f10610c0f57610100808354040283529160200191610c3a565b820191906000526020600020905b815481529060010190602001808311610c1d57829003601f168201915b505050505081565b6000610c4f3384846106ff565b905092915050565b600460205281600052604060002060205280600052604060002060009150915050548156fea265627a7a7231582097a4d4c7b547d39e9799336e80c1cddc2df92ceec381f9a5f1df8aed270234bd64736f6c63430005110032" -} \ No newline at end of file diff --git a/precompiles/werc20/testdata/WEVMOS.sol b/precompiles/werc20/testdata/WEVMOS.sol deleted file mode 100644 index abcf4dae4d..0000000000 --- a/precompiles/werc20/testdata/WEVMOS.sol +++ /dev/null @@ -1,762 +0,0 @@ -// Sources flattened with hardhat v2.8.4 https://hardhat.org - -// File contracts/WEVMOS9.sol - -// Copyright (C) 2015, 2016, 2017 Dapphub - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -pragma solidity >=0.4.22 <0.6; - -contract WEVMOS9 { - string public name = "Wrapped Evmos"; - string public symbol = "WEVMOS"; - uint8 public decimals = 18; - - event Approval(address indexed src, address indexed guy, uint wad); - event Transfer(address indexed src, address indexed dst, uint wad); - event Deposit(address indexed dst, uint wad); - event Withdrawal(address indexed src, uint wad); - - mapping (address => uint) public balanceOf; - mapping (address => mapping (address => uint)) public allowance; - - function() external payable { - deposit(); - } - - function deposit() public payable { - balanceOf[msg.sender] += msg.value; - emit Deposit(msg.sender, msg.value); - } - - function withdraw(uint wad) public { - require(balanceOf[msg.sender] >= wad); - balanceOf[msg.sender] -= wad; - msg.sender.transfer(wad); - emit Withdrawal(msg.sender, wad); - } - - function totalSupply() public view returns (uint) { - return address(this).balance; - } - - function approve(address guy, uint wad) public returns (bool) { - allowance[msg.sender][guy] = wad; - emit Approval(msg.sender, guy, wad); - return true; - } - - function transfer(address dst, uint wad) public returns (bool) { - return transferFrom(msg.sender, dst, wad); - } - - function transferFrom(address src, address dst, uint wad) - public - returns (bool) - { - require(balanceOf[src] >= wad); - - if (src != msg.sender && allowance[src][msg.sender] != uint(-1)) { - require(allowance[src][msg.sender] >= wad); - allowance[src][msg.sender] -= wad; - } - - balanceOf[src] -= wad; - balanceOf[dst] += wad; - - emit Transfer(src, dst, wad); - - return true; - } -} - - -/* - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. - -*/ \ No newline at end of file diff --git a/precompiles/werc20/tx.go b/precompiles/werc20/tx.go deleted file mode 100644 index ac595aaa5a..0000000000 --- a/precompiles/werc20/tx.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package werc20 - -const ( - // DepositMethod defines the ABI method name for the IWERC20 deposit - // transaction. - DepositMethod = "deposit" - // WithdrawMethod defines the ABI method name for the IWERC20 withdraw - // transaction. - WithdrawMethod = "withdraw" -) - -// Deposit is a no-op and mock function that provides the same interface as the -// WETH contract to support equality between the native coin and its wrapped -// ERC-20 (eg. EVMOS and WEVMOS). It only emits the Deposit event. -func (p Precompile) Deposit() ([]byte, error) { - return nil, nil -} - -// Withdraw is a no-op and mock function that provides the same interface as the -// WETH contract to support equality between the native coin and its wrapped -// ERC-20 (eg. EVMOS and WEVMOS). It only emits the Withdraw event. -func (p Precompile) Withdraw() ([]byte, error) { - return nil, nil -} diff --git a/precompiles/werc20/utils_test.go b/precompiles/werc20/utils_test.go deleted file mode 100644 index 41c20a1d83..0000000000 --- a/precompiles/werc20/utils_test.go +++ /dev/null @@ -1,161 +0,0 @@ -package werc20_test - -import ( - "math/big" - "time" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/authz" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - commonfactory "github.com/evmos/evmos/v18/testutil/integration/common/factory" - - cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/precompiles/erc20" - "github.com/evmos/evmos/v18/precompiles/testutil" - "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" - - //nolint:revive // dot imports are fine for Gomega - . "github.com/onsi/gomega" -) - -// callType constants to differentiate between direct calls and calls through a contract. -const ( - directCall = iota + 1 - contractCall - erc20Call -) - -// ContractData is a helper struct to hold the addresses and ABIs for the -// different contract instances that are subject to testing here. -type ContractData struct { - ownerPriv cryptotypes.PrivKey - - erc20Addr common.Address - erc20ABI abi.ABI - contractAddr common.Address - contractABI abi.ABI - precompileAddr common.Address - precompileABI abi.ABI -} - -// getCallArgs is a helper function to return the correct call arguments for a given call type. -// -// In case of a direct call to the precompile, the precompile's ABI is used. Otherwise, the -// ERC20CallerContract's ABI is used and the given contract address. -func (s *PrecompileTestSuite) getTxAndCallArgs( - callType int, - contractData ContractData, - methodName string, - args ...interface{}, -) (evmtypes.EvmTxArgs, factory.CallArgs) { - txArgs := evmtypes.EvmTxArgs{} - callArgs := factory.CallArgs{} - - switch callType { - case directCall: - txArgs.To = &contractData.precompileAddr - callArgs.ContractABI = contractData.precompileABI - case contractCall: - txArgs.To = &contractData.contractAddr - callArgs.ContractABI = contractData.contractABI - case erc20Call: - txArgs.To = &contractData.erc20Addr - callArgs.ContractABI = contractData.erc20ABI - } - - callArgs.MethodName = methodName - callArgs.Args = args - - return txArgs, callArgs -} - -// ExpectedBalance is a helper struct to check the balances of accounts. -type ExpectedBalance struct { - address sdk.AccAddress - expCoins sdk.Coins -} - -// ExpectBalances is a helper function to check if the balances of the given accounts are as expected. -func (s *PrecompileTestSuite) ExpectBalances(expBalances []ExpectedBalance) { - for _, expBalance := range expBalances { - for _, expCoin := range expBalance.expCoins { - coinBalance, err := s.grpcHandler.GetBalance(expBalance.address, expCoin.Denom) - Expect(err).ToNot(HaveOccurred(), "expected no error getting balance") - Expect(coinBalance.Balance.Amount.Int64()).To(Equal(expCoin.Amount.Int64()), "expected different balance") - } - } -} - -// checkBalances is a helper function to check the balances of the sender and receiver. -func (s *PrecompileTestSuite) checkBalances(failCheck testutil.LogCheckArgs, sender keyring.Key, contractData ContractData) { - balanceCheck := failCheck.WithExpPass(true) - txArgs, balancesArgs := s.getTxAndCallArgs(erc20Call, contractData, erc20.BalanceOfMethod, sender.Addr) - - _, ethRes, err := s.factory.CallContractAndCheckLogs(sender.Priv, txArgs, balancesArgs, balanceCheck) - Expect(err).ToNot(HaveOccurred(), "failed to execute balanceOf") - - // Check the balance in the bank module is the same as calling `balanceOf` on the precompile - balanceAfter, err := s.grpcHandler.GetBalance(sender.AccAddr, s.tokenDenom) - Expect(err).ToNot(HaveOccurred(), "expected no error getting balance") - - var erc20Balance *big.Int - err = s.precompile.UnpackIntoInterface(&erc20Balance, erc20.BalanceOfMethod, ethRes.Ret) - Expect(err).ToNot(HaveOccurred(), "failed to unpack result") - Expect(erc20Balance).To(Equal(balanceAfter.Balance.Amount.BigInt()), "expected different balance") -} - -// setupSendAuthz is a helper function to set up a SendAuthorization for -// a given grantee and granter combination for a given amount. -// -// NOTE: A default expiration of 1 hour after the current block time is used. -func (s *PrecompileTestSuite) setupSendAuthz( - grantee sdk.AccAddress, granterPriv cryptotypes.PrivKey, amount sdk.Coins, -) { - granter := sdk.AccAddress(granterPriv.PubKey().Address()) - expiration := s.network.GetContext().BlockHeader().Time.Add(time.Hour) - sendAuthz := banktypes.NewSendAuthorization( - amount, - []sdk.AccAddress{}, - ) - - msgGrant, err := authz.NewMsgGrant( - granter, - grantee, - sendAuthz, - &expiration, - ) - s.Require().NoError(err, "failed to create MsgGrant") - - // Create an authorization - txArgs := commonfactory.CosmosTxArgs{Msgs: []sdk.Msg{msgGrant}} - _, err = s.factory.ExecuteCosmosTx(granterPriv, txArgs) - s.Require().NoError(err, "failed to execute MsgGrant") -} - -// setupSendAuthzForContract is a helper function which executes an approval -// for the given contract data. -// -// If: -// - the classic ERC20 contract is used, it calls the `approve` method on the contract. -// - in other cases, it sends a `MsgGrant` to set up the authorization. -// -// TODO: Should we add more cases for WERC20Caller -func (s *PrecompileTestSuite) setupSendAuthzForContract( - callType int, grantee common.Address, granterPriv cryptotypes.PrivKey, amount sdk.Coins, -) { - Expect(amount).To(HaveLen(1), "expected only one coin") - Expect(amount[0].Denom).To(Equal(s.tokenDenom), - "this test utility only works with the token denom in the context of these integration tests", - ) - - switch callType { - case directCall: - s.setupSendAuthz(grantee.Bytes(), granterPriv, amount) - default: - panic("unknown contract call type") - } -} diff --git a/precompiles/werc20/werc20.go b/precompiles/werc20/werc20.go deleted file mode 100644 index 59802c846e..0000000000 --- a/precompiles/werc20/werc20.go +++ /dev/null @@ -1,149 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package werc20 - -import ( - "embed" - - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/x/evm/core/vm" - - authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" - bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - cmn "github.com/evmos/evmos/v18/precompiles/common" - erc20 "github.com/evmos/evmos/v18/precompiles/erc20" - erc20types "github.com/evmos/evmos/v18/x/erc20/types" - transferkeeper "github.com/evmos/evmos/v18/x/ibc/transfer/keeper" -) - -// abiPath defines the path to the WERC-20 precompile ABI JSON file. -const abiPath = "abi.json" - -// Embed abi json file to the executable binary. Needed when importing as dependency. -// -//go:embed abi.json -var f embed.FS - -var _ vm.PrecompiledContract = &Precompile{} - -// Precompile defines the precompiled contract for WERC20. -type Precompile struct { - *erc20.Precompile -} - -const ( - // DepositRequiredGas defines the gas required for the Deposit transaction. - DepositRequiredGas uint64 = 23_878 - // WithdrawRequiredGas defines the gas required for the Withdraw transaction. - WithdrawRequiredGas uint64 = 9207 -) - -// NewPrecompile creates a new WERC20 Precompile instance as a -// PrecompiledContract interface. -func NewPrecompile( - tokenPair erc20types.TokenPair, - bankKeeper bankkeeper.Keeper, - authzKeeper authzkeeper.Keeper, - transferKeeper transferkeeper.Keeper, -) (*Precompile, error) { - newABI, err := cmn.LoadABI(f, abiPath) - if err != nil { - return nil, err - } - - erc20Precompile, err := erc20.NewPrecompile(tokenPair, bankKeeper, authzKeeper, transferKeeper) - if err != nil { - return nil, err - } - - // use the IWERC20 ABI - erc20Precompile.Precompile.ABI = newABI - - return &Precompile{ - Precompile: erc20Precompile, - }, nil -} - -// Address defines the address of the ERC20 precompile contract. -func (p Precompile) Address() common.Address { - return p.Precompile.Address() -} - -// RequiredGas calculates the contract gas use. -func (p Precompile) RequiredGas(input []byte) uint64 { - // TODO: these values were obtained from Remix using the WEVMOS9.sol. - // We should execute the transactions from Evmos testnet - // to ensure parity in the values. - - // If there is no method ID, then it's the fallback or receive case - if len(input) < 4 { - return DepositRequiredGas - } - - methodID := input[:4] - method, err := p.MethodById(methodID) - if err != nil { - return 0 - } - - switch method.Name { - case DepositMethod: - return DepositRequiredGas - case WithdrawMethod: - return WithdrawRequiredGas - } - - return p.Precompile.RequiredGas(input) -} - -// Run executes the precompiled contract WERC20 methods defined in the ABI. -func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, readOnly bool) (bz []byte, err error) { - ctx, stateDB, snapshot, method, initialGas, args, err := p.RunSetup(evm, contract, readOnly, p.IsTransaction) - if err != nil { - return nil, err - } - - // This handles any out of gas errors that may occur during the execution of a precompile tx or query. - // It avoids panics and returns the out of gas error so the EVM can continue gracefully. - defer cmn.HandleGasError(ctx, contract, initialGas, &err)() - - switch { - case method.Type == abi.Fallback, - method.Type == abi.Receive, - method.Name == DepositMethod: - // WERC20 transactions - bz, err = p.Deposit() - case method.Name == WithdrawMethod: - // Withdraw Method - bz, err = p.Withdraw() - default: - // ERC20 transactions and queries - bz, err = p.Precompile.HandleMethod(ctx, contract, stateDB, method, args) - } - - if err != nil { - return nil, err - } - - cost := ctx.GasMeter().GasConsumed() - initialGas - - if !contract.UseGas(cost) { - return nil, vm.ErrOutOfGas - } - if err := p.AddJournalEntries(stateDB, snapshot); err != nil { - return nil, err - } - return bz, nil -} - -// IsTransaction checks if the given method name corresponds to a transaction or query. -func (p Precompile) IsTransaction(methodName string) bool { - switch methodName { - case DepositMethod, WithdrawMethod: - return true - default: - return p.Precompile.IsTransaction(methodName) - } -} diff --git a/proto/ethermint/evm/v1/evm.proto b/proto/ethermint/evm/v1/evm.proto index d0ad1d64c3..4585d2b1fe 100644 --- a/proto/ethermint/evm/v1/evm.proto +++ b/proto/ethermint/evm/v1/evm.proto @@ -21,13 +21,15 @@ message Params { // allow_unprotected_txs defines if replay-protected (i.e non EIP155 // signed) transactions can be executed on the state machine. bool allow_unprotected_txs = 6; - // active_precompiles defines the slice of hex addresses of the precompiled - // contracts that are active - repeated string active_precompiles = 7; + // renamed active_precompiles to active_static_precompiles + reserved 7; // evm_channels is the list of channel identifiers from EVM compatible chains repeated string evm_channels = 8 [(gogoproto.customname) = "EVMChannels"]; // access_control defines the permission policy of the EVM AccessControl access_control = 9 [(gogoproto.customname) = "AccessControl", (gogoproto.nullable) = false]; + // active_static_precompiles defines the slice of hex addresses of the precompiled + // contracts that are active + repeated string active_static_precompiles = 10; } // AccessControl defines the permission policy of the EVM diff --git a/proto/evmos/erc20/v1/genesis.proto b/proto/evmos/erc20/v1/genesis.proto index 2c030a9d5a..fb049bc8e1 100644 --- a/proto/evmos/erc20/v1/genesis.proto +++ b/proto/evmos/erc20/v1/genesis.proto @@ -20,7 +20,12 @@ message GenesisState { message Params { // enable_erc20 is the parameter to enable the conversion of Cosmos coins <--> ERC20 tokens. bool enable_erc20 = 1; - // enable_evm_hook is the parameter to enable the EVM hook that converts an ERC20 token to a Cosmos - // Coin by transferring the Tokens through a MsgEthereumTx to the ModuleAddress Ethereum address. - bool enable_evm_hook = 2 [(gogoproto.customname) = "EnableEVMHook"]; -} \ No newline at end of file + // enable_evm_hook is now depecrated + reserved 2; + // native_precompiles defines the slice of hex addresses of the + // active precompiles that are used to interact with native staking coins as ERC20s + repeated string native_precompiles = 3; + // dynamic_precompiles defines the slice of hex addresses of the + // active precompiles that are used to interact with Bank coins as ERC20s + repeated string dynamic_precompiles = 4; +} diff --git a/proto/evmos/erc20/v1/tx.proto b/proto/evmos/erc20/v1/tx.proto index f3fda57407..87bbce467d 100644 --- a/proto/evmos/erc20/v1/tx.proto +++ b/proto/evmos/erc20/v1/tx.proto @@ -14,11 +14,6 @@ option go_package = "github.com/evmos/evmos/v18/x/erc20/types"; // Msg defines the erc20 Msg service. service Msg { - // ConvertCoin mints a ERC20 representation of the native Cosmos coin denom - // that is registered on the token mapping. - rpc ConvertCoin(MsgConvertCoin) returns (MsgConvertCoinResponse) { - option (google.api.http).get = "/evmos/erc20/v1/tx/convert_coin"; - }; // ConvertERC20 mints a native Cosmos coin representation of the ERC20 token // contract that is registered on the token mapping. rpc ConvertERC20(MsgConvertERC20) returns (MsgConvertERC20Response) { @@ -29,20 +24,6 @@ service Msg { rpc UpdateParams(MsgUpdateParams) returns (MsgUpdateParamsResponse); } -// MsgConvertCoin defines a Msg to convert a native Cosmos coin to a ERC20 token -message MsgConvertCoin { - // coin is a Cosmos coin whose denomination is registered in a token pair. The coin - // amount defines the amount of coins to convert. - cosmos.base.v1beta1.Coin coin = 1 [(gogoproto.nullable) = false]; - // receiver is the hex address to receive ERC20 token - string receiver = 2; - // sender is the cosmos bech32 address from the owner of the given Cosmos coins - string sender = 3; -} - -// MsgConvertCoinResponse returns no fields -message MsgConvertCoinResponse {} - // MsgConvertERC20 defines a Msg to convert a ERC20 token to a native Cosmos // coin. message MsgConvertERC20 { @@ -59,6 +40,20 @@ message MsgConvertERC20 { // MsgConvertERC20Response returns no fields message MsgConvertERC20Response {} +// MsgConvertCoin defines a Msg to convert a native Cosmos coin to a ERC20 token +message MsgConvertCoin { + // coin is a Cosmos coin whose denomination is registered in a token pair. The coin + // amount defines the amount of coins to convert. + cosmos.base.v1beta1.Coin coin = 1 [(gogoproto.nullable) = false]; + // receiver is the hex address to receive ERC20 token + string receiver = 2; + // sender is the cosmos bech32 address from the owner of the given Cosmos coins + string sender = 3; +} + +// MsgConvertCoinResponse returns no fields +message MsgConvertCoinResponse {} + // MsgUpdateParams is the Msg/UpdateParams request type for Erc20 parameters. // Since: cosmos-sdk 0.47 message MsgUpdateParams { @@ -75,4 +70,4 @@ message MsgUpdateParams { // MsgUpdateParamsResponse defines the response structure for executing a // MsgUpdateParams message. // Since: cosmos-sdk 0.47 -message MsgUpdateParamsResponse {} \ No newline at end of file +message MsgUpdateParamsResponse {} diff --git a/tests/nix_tests/configs/str-v2-token-factory.jsonnet b/tests/nix_tests/configs/str-v2-token-factory.jsonnet new file mode 100644 index 0000000000..86fa7bf363 --- /dev/null +++ b/tests/nix_tests/configs/str-v2-token-factory.jsonnet @@ -0,0 +1,166 @@ +local config = import 'default.jsonnet'; + +config { + 'evmos_9000-1'+: { + key_name: 'signer1', + 'app-config'+: { + 'index-events': super['index-events'] + ['message.action'], + grpc: { + 'enable': true, + }, + }, + }, + 'osmosis-1': { + cmd: 'osmosisd', + 'account-prefix': 'osmo', + 'app-config': { + 'minimum-gas-prices': '0.0025uosmo', + }, + validators: [ + { + coins: '2234240000000000000uosmo', + staked: '10000000000000uosmo', + mnemonic: '${VALIDATOR1_MNEMONIC}', + base_port: 26900, + }, + { + coins: '987870000000000000uosmo', + staked: '20000000000000uosmo', + mnemonic: '${VALIDATOR2_MNEMONIC}', + base_port: 26910, + }, + ], + accounts: [ + { + name: 'community', + coins: '10000000000000uosmo', + mnemonic: '${COMMUNITY_MNEMONIC}', + }, + { + name: 'relayer', + coins: '10000000000000uosmo', + mnemonic: '${SIGNER1_MNEMONIC}', + }, + { + name: 'signer2', + coins: '10000000000000uosmo', + mnemonic: '${SIGNER2_MNEMONIC}', + }, + ], + genesis: { + app_state: { + staking: { + params: { + unbonding_time: '1814400s', + bond_denom: 'uosmo', + }, + }, + crisis: { + constant_fee: { + denom: 'uosmo' + } + }, + txfees: { + basedenom: 'uosmo', + }, + gov: { + voting_params: { + voting_period: '1814400s', + }, + deposit_params: { + max_deposit_period: '1814400s', + min_deposit: [ + { + denom: 'uosmo', + amount: '10000000', + }, + ], + min_expedited_deposit: [ + { + denom: 'uosmo', + amount: '50000000', + }, + ], + }, + }, + poolincentives: { + params: { + minted_denom: 'uosmo' + } + }, + mint: { + params: { + mint_denom: 'uosmo', + }, + }, + transfer: { + params: { + receive_enabled: true, + send_enabled: true, + }, + }, + }, + }, +}, + relayer: { + mode: { + clients: { + enabled: true, + refresh: true, + misbehaviour: true, + }, + connections: { + enabled: true, + }, + channels: { + enabled: true, + }, + packets: { + enabled: true, + clear_interval: 100, + clear_on_start: true, + tx_confirmation: true, + }, + }, + rest: { + enabled: true, + host: '127.0.0.1', + port: 3000, + }, + chains: [ + { + id: 'evmos_9000-1', + max_gas: 3000000, + default_gas: 100000, + gas_multiplier: 1.2, + address_type: { + derivation: 'ethermint', + proto_type: { + pk_type: '/ethermint.crypto.v1.ethsecp256k1.PubKey', + }, + }, + gas_price: { + price: 40000000000, + denom: 'aevmos', + }, + extension_options: [{ + type: 'ethermint_dynamic_fee', + value: '1000000', + }], + }, + { + id: 'osmosis-1', + max_gas: 3000000, + gas_multiplier: 1.2, + default_gas: 1000000, + address_type: { + derivation: 'cosmos', + }, + gas_price: { + price: 1000000, + denom: 'uosmo', + }, + }, + ], + }, +} \ No newline at end of file diff --git a/tests/nix_tests/configs/str-v2.jsonnet b/tests/nix_tests/configs/str-v2.jsonnet new file mode 100644 index 0000000000..c86e384cf8 --- /dev/null +++ b/tests/nix_tests/configs/str-v2.jsonnet @@ -0,0 +1,259 @@ +local config = import 'default.jsonnet'; + +config { + 'evmos_9000-1'+: { + key_name: 'signer1', + 'app-config'+: { + 'index-events': super['index-events'] + ['message.action'], + grpc: { + 'enable': true, + }, + }, + }, + 'cosmoshub-1': { + cmd: 'gaiad', + 'account-prefix': 'cosmos', + 'app-config': { + 'minimum-gas-prices': '0.0025uatom', + }, + validators: [ + { + coins: '2234240000000000000uatom', + staked: '10000000000000uatom', + mnemonic: '${VALIDATOR1_MNEMONIC}', + base_port: 26900, + }, + { + coins: '987870000000000000uatom', + staked: '20000000000000uatom', + mnemonic: '${VALIDATOR2_MNEMONIC}', + base_port: 26910, + }, + ], + accounts: [ + { + name: 'community', + coins: '10000000000000uatom', + mnemonic: '${COMMUNITY_MNEMONIC}', + }, + { + name: 'relayer', + coins: '10000000000000uatom', + mnemonic: '${SIGNER1_MNEMONIC}', + }, + { + name: 'signer2', + coins: '10000000000000uatom', + mnemonic: '${SIGNER2_MNEMONIC}', + }, + ], + genesis: { + app_state: { + staking: { + params: { + unbonding_time: '1814400s', + bond_denom: 'uatom', + }, + }, + crisis: { + constant_fee: { + denom: 'uatom' + } + }, + txfees: { + basedenom: 'uatom', + }, + gov: { + voting_params: { + voting_period: '1814400s', + }, + deposit_params: { + max_deposit_period: '1814400s', + min_deposit: [ + { + denom: 'uatom', + amount: '10000000', + }, + ], + }, + }, + poolincentives: { + params: { + minted_denom: 'uatom' + } + }, + mint: { + params: { + mint_denom: 'uatom', + }, + }, + transfer: { + params: { + receive_enabled: true, + send_enabled: true, + }, + }, + }, + }, + }, + 'cosmoshub-2': { + cmd: 'gaiad', + 'account-prefix': 'cosmos', + 'app-config': { + 'minimum-gas-prices': '0.0025uatom', + }, + validators: [ + { + coins: '2234240000000000000uatom', + staked: '10000000000000uatom', + mnemonic: '${VALIDATOR1_MNEMONIC}', + base_port: 26920, + }, + { + coins: '987870000000000000uatom', + staked: '20000000000000uatom', + mnemonic: '${VALIDATOR2_MNEMONIC}', + base_port: 26930, + }, + ], + accounts: [ + { + name: 'community', + coins: '10000000000000uatom', + mnemonic: '${COMMUNITY_MNEMONIC}', + }, + { + name: 'relayer', + coins: '10000000000000uatom', + mnemonic: '${SIGNER1_MNEMONIC}', + }, + { + name: 'signer2', + coins: '10000000000000uatom', + mnemonic: '${SIGNER2_MNEMONIC}', + }, + ], + genesis: { + app_state: { + staking: { + params: { + unbonding_time: '1814400s', + bond_denom: 'uatom', + }, + }, + crisis: { + constant_fee: { + denom: 'uatom' + } + }, + txfees: { + basedenom: 'uatom', + }, + gov: { + voting_params: { + voting_period: '1814400s', + }, + deposit_params: { + max_deposit_period: '1814400s', + min_deposit: [ + { + denom: 'uatom', + amount: '10000000', + }, + ], + }, + }, + poolincentives: { + params: { + minted_denom: 'uatom' + } + }, + mint: { + params: { + mint_denom: 'uatom', + }, + }, + transfer: { + params: { + receive_enabled: true, + send_enabled: true, + }, + }, + }, + }, + }, + relayer: { + mode: { + clients: { + enabled: true, + refresh: true, + misbehaviour: true, + }, + connections: { + enabled: true, + }, + channels: { + enabled: true, + }, + packets: { + enabled: true, + clear_interval: 100, + clear_on_start: true, + tx_confirmation: true, + }, + }, + rest: { + enabled: true, + host: '127.0.0.1', + port: 3000, + }, + chains: [ + { + id: 'evmos_9000-1', + max_gas: 3000000, + default_gas: 100000, + gas_multiplier: 1.2, + address_type: { + derivation: 'ethermint', + proto_type: { + pk_type: '/ethermint.crypto.v1.ethsecp256k1.PubKey', + }, + }, + gas_price: { + price: 40000000000, + denom: 'aevmos', + }, + extension_options: [{ + type: 'ethermint_dynamic_fee', + value: '1000000', + }], + }, + { + id: 'cosmoshub-1', + max_gas: 3000000, + default_gas: 1000000, + gas_multiplier: 1.2, + address_type: { + derivation: 'cosmos', + }, + gas_price: { + price: 1000000, + denom: 'uatom', + }, + }, + { + id: 'cosmoshub-2', + max_gas: 3000000, + default_gas: 1000000, + gas_multiplier: 1.2, + address_type: { + derivation: 'cosmos', + }, + gas_price: { + price: 1000000, + denom: 'uatom', + }, + }, + ], + }, +} diff --git a/tests/nix_tests/cosmoscli.py b/tests/nix_tests/cosmoscli.py index bbe1f1f601..96192de317 100644 --- a/tests/nix_tests/cosmoscli.py +++ b/tests/nix_tests/cosmoscli.py @@ -974,6 +974,25 @@ def evm_params(self, **kwargs): ) ) + # ========================== + # ERC20 Module + # ========================== + + def erc20_params(self, **kwargs): + default_kwargs = { + "node": self.node_rpc, + "output": "json", + } + return json.loads( + self.raw( + "q", + "erc20", + "params", + **(default_kwargs | kwargs), + ) + ) + + # ========================== # FEEMARKET Module # ========================== @@ -1361,3 +1380,62 @@ def gamm_create_pool( **kwargs, ) ) + + + def token_factory_create_denom( + self, + denom, + from_, + **kwargs, + ): + """ + Create Osmosis token factory denom. + """ + return json.loads( + self.raw( + "tx", + "tokenfactory", + "create-denom", + denom, + "-y", + from_=from_, + home=self.data_dir, + node=self.node_rpc, + gas_adjustment=1.3, + gas=2000000, + gas_prices="0.25uosmo", + keyring_backend="test", + chain_id=self.chain_id, + **kwargs, + ) + ) + + def token_factory_mint_denom( + self, + from_, + amount, + denom, + **kwargs, + ): + """ + Mint Osmosis token factory denom with a given amount. + """ + return json.loads( + self.raw( + "tx", + "tokenfactory", + "mint", + f"{amount}{denom}", + from_, + "-y", + from_=from_, + home=self.data_dir, + node=self.node_rpc, + gas_adjustment=1.3, + gas=2000000, + gas_prices="0.25uosmo", + keyring_backend="test", + chain_id=self.chain_id, + **kwargs, + ) + ) diff --git a/tests/nix_tests/ibc_utils.py b/tests/nix_tests/ibc_utils.py index 261b1a5ce3..9bde44399f 100644 --- a/tests/nix_tests/ibc_utils.py +++ b/tests/nix_tests/ibc_utils.py @@ -26,6 +26,8 @@ EVMOS_IBC_DENOM = "ibc/8EAC8061F4499F03D2D1419A3E73D346289AE9DB89CAB1486B72539572B1915E" # uosmo IBC representation on the Evmos chain. OSMO_IBC_DENOM = "ibc/ED07A3391A112B175915CD8FAF43A2DA8E4790EDE12566649D0C2F97716B8518" +# uatom from cosmoshub-1 IBC representation on the Evmos chain and on Cosmos Hub 2 chain. +ATOM_IBC_DENOM = "ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2" RATIO = 10**10 # IBC_CHAINS_META metadata of cosmos chains to setup these for IBC tests @@ -55,11 +57,16 @@ "bin": "osmosisd", "denom": "uosmo", }, - "gaia": { + "cosmoshub-1": { "chain_name": "cosmoshub-1", "bin": "gaiad", "denom": "uatom", }, + "cosmoshub-2": { + "chain_name": "cosmoshub-2", + "bin": "gaiad", + "denom": "uatom", + }, } EVM_CHAINS = ["evmos_9000", "chainmain-1"] diff --git a/tests/nix_tests/test_str_v2.py b/tests/nix_tests/test_str_v2.py new file mode 100644 index 0000000000..e19630ab65 --- /dev/null +++ b/tests/nix_tests/test_str_v2.py @@ -0,0 +1,176 @@ +import pytest +from web3 import Web3 + +from .ibc_utils import ATOM_IBC_DENOM, assert_ready, get_balance, prepare_network +from .network import CosmosChain, Evmos +from .utils import ( + ADDRS, + KEYS, + WEVMOS_ADDRESS, + erc20_balance, + erc20_transfer, + eth_to_bech32, + wait_for_ack, + wait_for_fn, +) + +# uatom from cosmoshub-2 -> cosmoshub-1 IBC representation on the Evmos chain. +ATOM_2_IBC_DENOM_MULTI_HOP = ( + "ibc/D219F3A490310B65BDC312B5A644B0D56FFF1789D894B902A49FBF9D2F560B32" +) +# uatom from cosmoshub-2 -> cosmoshub-1 IBC representation +ATOM_1_IBC_DENOM_ATOM_2 = ( + "ibc/C4CFF46FD6DE35CA4CF4CE031E643C8FDC9BA4B99AE598E9B0ED98FE3A2319F9" +) +# The ERC20 address of ATOM on Evmos +ATOM_1_ERC20_ADDRESS = Web3.toChecksumAddress( + "0xf36e4C1F926001CEaDa9cA97ea622B25f41e5eB2" +) + + +@pytest.fixture(scope="module", params=["evmos"]) +def ibc(request, tmp_path_factory): + """Prepare the network""" + name = "str-v2" + evmos_build = request.param + path = tmp_path_factory.mktemp(name) + # specify the custom_scenario + network = prepare_network(path, name, [evmos_build, "cosmoshub-1", "cosmoshub-2"]) + yield from network + + +def test_str_v2_single_hop(ibc): + """ + Test Single Token Representation v2 with single hop Coin. + It should automatically create an ERC20 precompiled contract. + And register a token pair. + """ + assert_ready(ibc) + + evmos: Evmos = ibc.chains["evmos"] + gaia: CosmosChain = ibc.chains["cosmoshub-1"] + + evmos_cli = evmos.cosmos_cli() + evmos_addr = ADDRS["signer2"] + bech_dst = eth_to_bech32(evmos_addr) + + gaia_cli = gaia.cosmos_cli() + gaia_addr = gaia_cli.address("signer2") + + old_dst_balance = get_balance(evmos, bech_dst, ATOM_IBC_DENOM) + rsp = gaia_cli.ibc_transfer( + gaia_addr, bech_dst, "5000uatom", "channel-0", 1, fees="10000uatom" + ) + assert rsp["code"] == 0 + + wait_for_ack(evmos_cli, "Evmos") + + w3 = evmos.w3 + active_dynamic_precompiles = evmos_cli.erc20_params()["params"][ + "dynamic_precompiles" + ] + new_dest_balance = get_balance(evmos, bech_dst, ATOM_IBC_DENOM) + erc_dest_balance = erc20_balance(w3, ATOM_1_ERC20_ADDRESS, evmos_addr) + + assert len(active_dynamic_precompiles) == 1 + assert old_dst_balance + 5000 == new_dest_balance + assert old_dst_balance + 5000 == erc_dest_balance + + +def test_str_v2_multi_hop(ibc): + """ + Test Single Token Representation v2 with multi hop Coin. + It should NOT create an ERC20 precompiled contract and token pair. + """ + assert_ready(ibc) + + evmos: Evmos = ibc.chains["evmos"] + gaia: CosmosChain = ibc.chains["cosmoshub-1"] + gaia2: CosmosChain = ibc.chains["cosmoshub-2"] + + evmos_cli = evmos.cosmos_cli() + evmos_addr = ADDRS["signer2"] + bech_dst = eth_to_bech32(evmos_addr) + + # The starting balance of the destination address + evmos_old_balance = get_balance(evmos, bech_dst, ATOM_2_IBC_DENOM_MULTI_HOP) + + # Cosmos hub 1 + gaia_cli = gaia.cosmos_cli() + gaia_addr = gaia_cli.address("signer2") + gaia1_old_balance = get_balance(gaia, gaia_addr, ATOM_1_IBC_DENOM_ATOM_2) + + # Cosmos hub 2 + gaia2_cli = gaia2.cosmos_cli() + + rsp = gaia2_cli.ibc_transfer( + gaia_addr, gaia_addr, "50000uatom", "channel-1", 1, fees="10000uatom" + ) + assert rsp["code"] == 0 + + new_dst_balance = 0 + + def check_balance_change(): + nonlocal new_dst_balance + new_dst_balance = get_balance(gaia, gaia_addr, ATOM_1_IBC_DENOM_ATOM_2) + return gaia1_old_balance != new_dst_balance + + wait_for_fn("balance change", check_balance_change) + + new_gaia1_balance = get_balance(gaia, gaia_addr, ATOM_1_IBC_DENOM_ATOM_2) + assert gaia1_old_balance + 50000 == new_gaia1_balance + + rsp = gaia_cli.ibc_transfer( + gaia_addr, + bech_dst, + f"50000{ATOM_1_IBC_DENOM_ATOM_2}", + "channel-0", + 1, + fees="10000uatom", + ) + assert rsp["code"] == 0 + + wait_for_ack(evmos_cli, "Evmos") + + evmos_balance = get_balance(evmos, bech_dst, ATOM_2_IBC_DENOM_MULTI_HOP) + dynamic_precompiles = evmos_cli.erc20_params()["params"][ + "dynamic_precompiles" + ] + token_pairs = evmos_cli.get_token_pairs() + + # Here it's only one from the previous one we've registered in the first test + assert evmos_old_balance + 50000 == evmos_balance + assert len(dynamic_precompiles) == 1 + assert dynamic_precompiles[0] == ATOM_1_ERC20_ADDRESS + assert len(token_pairs) == 2 + + +def test_wevmos_precompile_transfer(ibc): + """ + Test the ERC20 transfer from one signer to another using the now + registered ERC20 precompiled contract for WEVMOS. + """ + assert_ready(ibc) + + evmos: Evmos = ibc.chains["evmos"] + signer1 = ADDRS["signer1"] + signer2 = ADDRS["signer2"] + bech_dst = eth_to_bech32(signer2) + src_denom = "aevmos" + + w3 = evmos.w3 + evmos_balance = get_balance(evmos, bech_dst, src_denom) + signer2_balance = erc20_balance(w3, WEVMOS_ADDRESS, signer2) + + assert evmos_balance == signer2_balance + + receipt = erc20_transfer( + w3, WEVMOS_ADDRESS, signer1, signer2, 1000000, KEYS["signer1"] + ) + assert receipt.status == 1 + + signer_2_balance_after = erc20_balance(w3, WEVMOS_ADDRESS, signer2) + assert signer_2_balance_after == signer2_balance + 1000000 + + evmos_balance_after = get_balance(evmos, bech_dst, src_denom) + assert evmos_balance_after == evmos_balance + 1000000 diff --git a/tests/nix_tests/test_str_v2_token_factory.py b/tests/nix_tests/test_str_v2_token_factory.py new file mode 100644 index 0000000000..e90306496a --- /dev/null +++ b/tests/nix_tests/test_str_v2_token_factory.py @@ -0,0 +1,85 @@ +import pytest + +from .ibc_utils import assert_ready, get_balance, prepare_network +from .network import CosmosChain, Evmos +from .utils import ADDRS, eth_to_bech32, wait_for_ack, wait_for_cosmos_tx_receipt + +# The token factory IBC denom on Evmos +TOKEN_FACTORY_IBC_DENOM = ( + "ibc/19616F5020D74FD2314577BF0B0CB99615C4C959665E308646291AF3B35FA4F2" +) + + +@pytest.fixture(scope="module", params=["evmos"]) +def ibc(request, tmp_path_factory): + """Prepare the network""" + name = "str-v2-token-factory" + evmos_build = request.param + path = tmp_path_factory.mktemp(name) + # specify the custom_scenario + network = prepare_network(path, name, [evmos_build, "osmosis"]) + yield from network + + +def test_str_v2_token_factory(ibc): + """ + Test Single Token Representation v2 with a token factory Coin from Osmosis. + It should not create an ECR20 extension contract for the token factory coin. + """ + assert_ready(ibc) + + evmos: Evmos = ibc.chains["evmos"] + osmosis: CosmosChain = ibc.chains["osmosis"] + + evmos_cli = evmos.cosmos_cli() + evmos_addr = ADDRS["signer2"] + bech_dst = eth_to_bech32(evmos_addr) + + osmosis_cli = osmosis.cosmos_cli() + osmosis_addr = osmosis_cli.address("signer2") + + # create a token factory coin + token_factory_denom = create_token_factory_coin("utest", osmosis_addr, osmosis_cli) + rsp = osmosis_cli.ibc_transfer( + osmosis_addr, + bech_dst, + f"100{token_factory_denom}", + "channel-0", + 1, + fees="100000uosmo", + ) + assert rsp["code"] == 0 + + wait_for_ack(evmos_cli, "Evmos") + + token_pairs = evmos_cli.get_token_pairs() + assert len(token_pairs) == 1 + + active_dynamic_precompiles = evmos_cli.erc20_params()["params"][ + "dynamic_precompiles" + ] + assert len(active_dynamic_precompiles) == 0 + + balance = get_balance(evmos, bech_dst, TOKEN_FACTORY_IBC_DENOM) + assert balance == 100 + + +def create_token_factory_coin(denom, creator_addr, osmosis_cli): + full_denom = f"factory/{creator_addr}/{denom}" + rsp = osmosis_cli.token_factory_create_denom(denom, creator_addr) + assert rsp["code"] == 0 + + # check for tx receipt to confirm tx was successful + receipt = wait_for_cosmos_tx_receipt(osmosis_cli, rsp["txhash"]) + assert receipt["tx_result"]["code"] == 0 + print("Created token factory token", full_denom) + + rsp = osmosis_cli.token_factory_mint_denom(creator_addr, 1000, full_denom) + assert rsp["code"] == 0 + + # check for tx receipt to confirm tx was successful + receipt = wait_for_cosmos_tx_receipt(osmosis_cli, rsp["txhash"]) + assert receipt["tx_result"]["code"] == 0 + print("Minted token factory token", full_denom) + + return full_denom diff --git a/tests/nix_tests/utils.py b/tests/nix_tests/utils.py index 8e76b6c5fa..897ea58d41 100644 --- a/tests/nix_tests/utils.py +++ b/tests/nix_tests/utils.py @@ -33,7 +33,7 @@ ADDRS = {name: account.address for name, account in ACCOUNTS.items()} EVMOS_ADDRESS_PREFIX = "evmos" DEFAULT_DENOM = "aevmos" -WEVMOS_ADDRESS = Web3.toChecksumAddress("0xcc491f589b45d4a3c679016195b3fb87d7848210") +WEVMOS_ADDRESS = Web3.toChecksumAddress("0xD4949664cD82660AaE99bEdc034a0deA8A0bd517") TEST_CONTRACTS = { "TestERC20A": "TestERC20A.sol", "Greeter": "Greeter.sol", @@ -535,3 +535,12 @@ def debug_trace_tx(evmos, tx_hash: str): rsp = requests.post(url, json=params) assert rsp.status_code == 200 return rsp.json()["result"] + + +def erc20_transfer(w3, erc20_contract_addr, from_addr, to_addr, amount, key): + info = json.loads(CONTRACTS["IERC20"].read_text()) + contract = w3.eth.contract(erc20_contract_addr, abi=info["abi"]) + tx = contract.functions.transfer(to_addr, amount).build_transaction( + {"from": from_addr} + ) + return send_transaction(w3, tx, key) diff --git a/testutil/abci.go b/testutil/abci.go index 8e00fbb60f..96997b5042 100644 --- a/testutil/abci.go +++ b/testutil/abci.go @@ -99,12 +99,12 @@ func DeliverEthTx( } res, err := BroadcastTxBytes(appEvmos, txConfig.TxEncoder(), tx) if err != nil { - return abci.ResponseDeliverTx{}, err + return res, err } codec := encoding.MakeConfig(app.ModuleBasics).Codec if _, err := CheckEthTxResponse(res, codec); err != nil { - return abci.ResponseDeliverTx{}, err + return res, err } return res, nil } diff --git a/testutil/integration/evmos/network/setup.go b/testutil/integration/evmos/network/setup.go index 17a3a26696..2594cbb74b 100644 --- a/testutil/integration/evmos/network/setup.go +++ b/testutil/integration/evmos/network/setup.go @@ -29,6 +29,7 @@ import ( govtypesv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" epochstypes "github.com/evmos/evmos/v18/x/epochs/types" + erc20types "github.com/evmos/evmos/v18/x/erc20/types" infltypes "github.com/evmos/evmos/v18/x/inflation/v1/types" evmosutil "github.com/evmos/evmos/v18/utils" @@ -264,10 +265,11 @@ func genStateSetter[T proto.Message](moduleName string) genSetupFn { // genesisSetupFunctions contains the available genesis setup functions // that can be used to customize the network genesis var genesisSetupFunctions = map[string]genSetupFn{ - authtypes.ModuleName: genStateSetter[*authtypes.GenesisState](authtypes.ModuleName), - evmtypes.ModuleName: genStateSetter[*evmtypes.GenesisState](evmtypes.ModuleName), - govtypes.ModuleName: genStateSetter[*govtypesv1.GenesisState](govtypes.ModuleName), - infltypes.ModuleName: genStateSetter[*infltypes.GenesisState](infltypes.ModuleName), + authtypes.ModuleName: genStateSetter[*authtypes.GenesisState](authtypes.ModuleName), + evmtypes.ModuleName: genStateSetter[*evmtypes.GenesisState](evmtypes.ModuleName), + govtypes.ModuleName: genStateSetter[*govtypesv1.GenesisState](govtypes.ModuleName), + infltypes.ModuleName: genStateSetter[*infltypes.GenesisState](infltypes.ModuleName), + erc20types.ModuleName: genStateSetter[*erc20types.GenesisState](erc20types.ModuleName), } // setDefaultAuthGenesisState sets the default auth genesis state @@ -292,6 +294,12 @@ func setDefaultGovGenesisState(evmosApp *app.Evmos, genesisState simapp.GenesisS return genesisState } +func setDefaultErc20GenesisState(evmosApp *app.Evmos, genesisState simapp.GenesisState) simapp.GenesisState { + erc20Gen := erc20types.DefaultGenesisState() + genesisState[erc20types.ModuleName] = evmosApp.AppCodec().MustMarshalJSON(erc20Gen) + return genesisState +} + // defaultAuthGenesisState sets the default genesis state // for the testing setup func newDefaultGenesisState(evmosApp *app.Evmos, params defaultGenesisParams) simapp.GenesisState { @@ -302,6 +310,7 @@ func newDefaultGenesisState(evmosApp *app.Evmos, params defaultGenesisParams) si genesisState = setDefaultBankGenesisState(evmosApp, genesisState, params.bank) genesisState = setDefaultInflationGenesisState(evmosApp, genesisState) genesisState = setDefaultGovGenesisState(evmosApp, genesisState) + genesisState = setDefaultErc20GenesisState(evmosApp, genesisState) return genesisState } @@ -321,7 +330,7 @@ func customizeGenesis( return genesisState, err } } else { - panic("no genesis setup function found for module: " + mod) + panic(fmt.Sprintf("module %s not found in genesis setup functions", mod)) } } return genesisState, err diff --git a/testutil/integration/evmos/utils/genesis.go b/testutil/integration/evmos/utils/genesis.go new file mode 100644 index 0000000000..de3a85efd9 --- /dev/null +++ b/testutil/integration/evmos/utils/genesis.go @@ -0,0 +1,71 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package utils + +import ( + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + "github.com/evmos/evmos/v18/utils" + erc20types "github.com/evmos/evmos/v18/x/erc20/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" +) + +const ( + // erc20TokenPairHex is the string representation of the ERC-20 token pair address. + erc20TokenPairHex = "0x80b5a32E4F032B2a058b4F29EC95EEfEEB87aDcd" //#nosec G101 -- these are not hardcoded credentials #gitleaks:allow + // WEVMOSContractTestnet is the WEVMOS contract address for testnet + WEVMOSContractTestnet = "0xcc491f589b45d4a3c679016195b3fb87d7848210" +) + +func CreateGenesisWithTokenPairs(keyring testkeyring.Keyring) network.CustomGenesisState { + // Add all keys from the keyring to the genesis accounts as well. + // + // NOTE: This is necessary to enable the account to send EVM transactions, + // because the Mono ante handler checks the account balance by querying the + // account from the account keeper first. If these accounts are not in the genesis + // state, the ante handler finds a zero balance because of the missing account. + accs := keyring.GetAllAccAddrs() + genesisAccounts := make([]*authtypes.BaseAccount, len(accs)) + for i, addr := range accs { + genesisAccounts[i] = &authtypes.BaseAccount{ + Address: addr.String(), + PubKey: nil, + AccountNumber: uint64(i + 1), + Sequence: 1, + } + } + + accGenesisState := authtypes.DefaultGenesisState() + for _, genesisAccount := range genesisAccounts { + // NOTE: This type requires to be packed into a *types.Any as seen on SDK tests, + // e.g. https://github.com/evmos/cosmos-sdk/blob/v0.47.5-evmos.2/x/auth/keeper/keeper_test.go#L193-L223 + accGenesisState.Accounts = append(accGenesisState.Accounts, codectypes.UnsafePackAny(genesisAccount)) + } + + // Add token pairs to genesis + erc20GenesisState := erc20types.DefaultGenesisState() + erc20GenesisState.TokenPairs = []erc20types.TokenPair{{ + Erc20Address: erc20TokenPairHex, + Denom: "xmpl", + Enabled: true, + ContractOwner: erc20types.OWNER_MODULE, // NOTE: Owner is the module account since it's a native token and was registered through governance + }, { + Erc20Address: WEVMOSContractTestnet, + Denom: utils.BaseDenom, + Enabled: true, + ContractOwner: erc20types.OWNER_MODULE, // NOTE: Owner is the module account since it's a native token and was registered through governance + }} + + // Add the smart contracts to the EVM genesis + evmGenesisState := evmtypes.DefaultGenesisState() + + // Combine module genesis states + return network.CustomGenesisState{ + authtypes.ModuleName: accGenesisState, + erc20types.ModuleName: erc20GenesisState, + evmtypes.ModuleName: evmGenesisState, + } +} diff --git a/testutil/integration/evmos/utils/unit.go b/testutil/integration/evmos/utils/unit.go index c76bd32c18..7f0fec70a7 100644 --- a/testutil/integration/evmos/utils/unit.go +++ b/testutil/integration/evmos/utils/unit.go @@ -57,7 +57,7 @@ func RegisterEvmosERC20Coins( return erc20types.TokenPair{}, fmt.Errorf("expected evmos denom metadata") } - _, err = network.App.Erc20Keeper.RegisterCoin(network.GetContext(), evmosMetadata) + _, err = network.App.Erc20Keeper.RegisterERC20Extension(network.GetContext(), evmosMetadata.Base) if err != nil { return erc20types.TokenPair{}, err } @@ -121,7 +121,7 @@ func RegisterIBCERC20Coins( return erc20types.TokenPair{}, err } - _, err = network.App.Erc20Keeper.RegisterCoin(network.GetContext(), ibcMetadata) + _, err = network.App.Erc20Keeper.RegisterERC20Extension(network.GetContext(), ibcMetadata.Base) if err != nil { return erc20types.TokenPair{}, err } diff --git a/utils/utils.go b/utils/utils.go index ea89772c2d..bd0caa315d 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -5,6 +5,7 @@ package utils import ( "fmt" + "sort" "strings" ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" @@ -18,6 +19,7 @@ import ( "github.com/cosmos/cosmos-sdk/crypto/types/multisig" sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" + "golang.org/x/exp/constraints" ) const ( @@ -152,7 +154,7 @@ func GetIBCDenomAddress(denom string) (common.Address, error) { } if len(denom) < 5 || strings.TrimSpace(denom[4:]) == "" { - return common.Address{}, ibctransfertypes.ErrInvalidDenomForTransfer.Wrapf("coin %s does not a valid IBC voucher hash", denom) + return common.Address{}, ibctransfertypes.ErrInvalidDenomForTransfer.Wrapf("coin %s is not a valid IBC voucher hash", denom) } // Get the address from the hash of the ICS20's DenomTrace Path @@ -186,3 +188,10 @@ func ComputeIBCDenom( ) string { return ComputeIBCDenomTrace(portID, channelID, denom).IBCDenom() } + +// SortSlice sorts a slice of any ordered type. +func SortSlice[T constraints.Ordered](slice []T) { + sort.Slice(slice, func(i, j int) bool { + return slice[i] < slice[j] + }) +} diff --git a/utils/utils_test.go b/utils/utils_test.go index 70995ab169..fc2d0e7e7e 100644 --- a/utils/utils_test.go +++ b/utils/utils_test.go @@ -248,3 +248,50 @@ func TestAddressConversion(t *testing.T) { require.NoError(t, err) require.Equal(t, hex, gotAddr.Hex()) } + +func TestGetIBCDenomAddress(t *testing.T) { + testCases := []struct { + name string + denom string + expErr bool + expectedRes string + }{ + { + "", + "test", + true, + "does not have 'ibc/' prefix", + }, + { + "", + "ibc/", + true, + "is not a valid IBC voucher hash", + }, + { + "", + "ibc/qqqqaaaaaa", + true, + "invalid denomination for cross-chain transfer", + }, + { + "", + "ibc/DF63978F803A2E27CA5CC9B7631654CCF0BBC788B3B7F0A10200508E37C70992", + false, + "0x631654CCF0BBC788b3b7F0a10200508e37c70992", + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + address, err := GetIBCDenomAddress(tc.denom) + if tc.expErr { + require.Error(t, err, "expected error while get ibc denom address") + require.Contains(t, err.Error(), tc.expectedRes, "expected different error") + } else { + require.NoError(t, err, "expected no error while get ibc denom address") + require.Equal(t, address.Hex(), tc.expectedRes) + } + }) + } +} diff --git a/x/erc20/client/cli/tx.go b/x/erc20/client/cli/tx.go index e93cca9e39..41b87a932e 100644 --- a/x/erc20/client/cli/tx.go +++ b/x/erc20/client/cli/tx.go @@ -35,7 +35,6 @@ func NewTxCmd() *cobra.Command { } txCmd.AddCommand( - NewConvertCoinCmd(), NewConvertERC20Cmd(), ) return txCmd @@ -211,50 +210,3 @@ func NewToggleTokenConversionProposalCmd() *cobra.Command { } return cmd } - -// NewConvertCoinCmd returns a CLI command handler for converting a Cosmos coin -func NewConvertCoinCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "convert-coin COIN [RECEIVER_HEX]", - Short: "Convert a Cosmos coin to ERC20. When the receiver [optional] is omitted, the ERC20 tokens are transferred to the sender.", - Args: cobra.RangeArgs(1, 2), - RunE: func(cmd *cobra.Command, args []string) error { - cliCtx, err := client.GetClientTxContext(cmd) - if err != nil { - return err - } - - coin, err := sdk.ParseCoinNormalized(args[0]) - if err != nil { - return err - } - - var receiver string - sender := cliCtx.GetFromAddress() - - if len(args) == 2 { - receiver = args[1] - if err := evmostypes.ValidateAddress(receiver); err != nil { - return fmt.Errorf("invalid receiver hex address %w", err) - } - } else { - receiver = common.BytesToAddress(sender).Hex() - } - - msg := &types.MsgConvertCoin{ - Coin: coin, - Receiver: receiver, - Sender: sender.String(), - } - - if err := msg.ValidateBasic(); err != nil { - return err - } - - return tx.GenerateOrBroadcastTxCLI(cliCtx, cmd.Flags(), msg) - }, - } - - flags.AddTxFlagsToCmd(cmd) - return cmd -} diff --git a/x/erc20/genesis.go b/x/erc20/genesis.go index 0c8d5d38bf..d64a6026c4 100644 --- a/x/erc20/genesis.go +++ b/x/erc20/genesis.go @@ -32,10 +32,7 @@ func InitGenesis( } for _, pair := range data.TokenPairs { - id := pair.GetID() - k.SetTokenPair(ctx, pair) - k.SetDenomMap(ctx, pair.Denom, id) - k.SetERC20Map(ctx, pair.GetERC20Contract(), id) + k.SetToken(ctx, pair) } } diff --git a/x/erc20/genesis_test.go b/x/erc20/genesis_test.go index c7d5ae8c63..d0214494c1 100644 --- a/x/erc20/genesis_test.go +++ b/x/erc20/genesis_test.go @@ -15,6 +15,7 @@ import ( transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" + "github.com/evmos/evmos/v18/testutil/integration/evmos/network" utiltx "github.com/evmos/evmos/v18/testutil/tx" "github.com/evmos/evmos/v18/utils" feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" @@ -106,18 +107,21 @@ func (suite *GenesisTestSuite) TestERC20InitGenesis() { } for _, tc := range testCases { - suite.Require().NotPanics(func() { - erc20.InitGenesis(suite.ctx, suite.app.Erc20Keeper, suite.app.AccountKeeper, tc.genesisState) - }) + gen := network.CustomGenesisState{ + types.ModuleName: &tc.genesisState, // #nosec G601 + } + nw := network.NewUnitTestNetwork( + network.WithCustomGenesis(gen), + ) - params := suite.app.Erc20Keeper.GetParams(suite.ctx) + params := nw.App.Erc20Keeper.GetParams(nw.GetContext()) - tokenPairs := suite.app.Erc20Keeper.GetTokenPairs(suite.ctx) + tokenPairs := nw.App.Erc20Keeper.GetTokenPairs(nw.GetContext()) suite.Require().Equal(tc.genesisState.Params, params) if len(tokenPairs) > 0 { - suite.Require().Equal(tc.genesisState.TokenPairs, tokenPairs) + suite.Require().Equal(tc.genesisState.TokenPairs, tokenPairs, tc.name) } else { - suite.Require().Len(tc.genesisState.TokenPairs, 0) + suite.Require().Len(tc.genesisState.TokenPairs, 0, tc.name) } } } diff --git a/x/erc20/keeper/dynamic_precompiles.go b/x/erc20/keeper/dynamic_precompiles.go new file mode 100644 index 0000000000..cb753da3a4 --- /dev/null +++ b/x/erc20/keeper/dynamic_precompiles.go @@ -0,0 +1,74 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package keeper + +import ( + "fmt" + "slices" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/common" + "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v18/x/erc20/types" +) + +// RegisterERC20Extension creates and adds an ERC20 precompile interface for an IBC Coin. +// +// It derives the ERC-20 address from the token denomination and registers the +// EVM extension as an active dynamic precompile. +// +// CONTRACT: This must ONLY be called if there is no existing token pair for the given denom. +func (k Keeper) RegisterERC20Extension(ctx sdk.Context, denom string) (*types.TokenPair, error) { + pair, err := k.CreateNewTokenPair(ctx, denom) + if err != nil { + return nil, err + } + // Add to existing EVM extensions + err = k.EnableDynamicPrecompiles(ctx, pair.GetERC20Contract()) + if err != nil { + return nil, err + } + return &pair, err +} + +// EnableDynamicPrecompiles appends the addresses of the given Precompiles to the list +// of active dynamic precompiles. +func (k Keeper) EnableDynamicPrecompiles(ctx sdk.Context, addresses ...common.Address) error { + // Get the current params and append the new precompiles + params := k.GetParams(ctx) + activePrecompiles := params.DynamicPrecompiles + + // Append and sort the new precompiles + updatedPrecompiles, err := appendPrecompiles(activePrecompiles, addresses...) + if err != nil { + return err + } + + // Update params + params.DynamicPrecompiles = updatedPrecompiles + k.Logger(ctx).Info("Added new precompiles", "addresses", addresses) + return k.SetParams(ctx, params) +} + +// appendPrecompiles append addresses to the existingPrecompiles and sort the resulting slice. +// The function returns an error is the two sets are overlapping. +func appendPrecompiles(existingPrecompiles []string, addresses ...common.Address) ([]string, error) { + // check for duplicates + hexAddresses := make([]string, len(addresses)) + for i := range addresses { + addrHex := addresses[i].Hex() + if slices.Contains(existingPrecompiles, addrHex) { + return nil, fmt.Errorf("attempted to register a duplicate precompile address: %s", addrHex) + } + hexAddresses[i] = addrHex + } + + existingLength := len(existingPrecompiles) + updatedPrecompiles := make([]string, existingLength+len(hexAddresses)) + copy(updatedPrecompiles, existingPrecompiles) + copy(updatedPrecompiles[existingLength:], hexAddresses) + + utils.SortSlice(updatedPrecompiles) + return updatedPrecompiles, nil +} diff --git a/x/erc20/keeper/evm.go b/x/erc20/keeper/evm.go index 10ce0979ab..ff6c8dc825 100644 --- a/x/erc20/keeper/evm.go +++ b/x/erc20/keeper/evm.go @@ -36,7 +36,7 @@ func (k Keeper) DeployERC20Contract( decimals, ) if err != nil { - return common.Address{}, errorsmod.Wrapf(evmtypes.ErrABIPack, "coin metadata is invalid %s: %s", coinMetadata.Name, err.Error()) + return common.Address{}, errorsmod.Wrapf(types.ErrABIPack, "coin metadata is invalid %s: %s", coinMetadata.Name, err.Error()) } data := make([]byte, len(contracts.ERC20MinterBurnerDecimalsContract.Bin)+len(ctorArgs)) @@ -78,7 +78,7 @@ func (k Keeper) QueryERC20( if err := erc20.UnpackIntoInterface(&nameRes, "name", res.Ret); err != nil { return types.ERC20Data{}, errorsmod.Wrapf( - evmtypes.ErrABIUnpack, "failed to unpack name: %s", err.Error(), + types.ErrABIUnpack, "failed to unpack name: %s", err.Error(), ) } @@ -90,7 +90,7 @@ func (k Keeper) QueryERC20( if err := erc20.UnpackIntoInterface(&symbolRes, "symbol", res.Ret); err != nil { return types.ERC20Data{}, errorsmod.Wrapf( - evmtypes.ErrABIUnpack, "failed to unpack symbol: %s", err.Error(), + types.ErrABIUnpack, "failed to unpack symbol: %s", err.Error(), ) } @@ -102,7 +102,7 @@ func (k Keeper) QueryERC20( if err := erc20.UnpackIntoInterface(&decimalRes, "decimals", res.Ret); err != nil { return types.ERC20Data{}, errorsmod.Wrapf( - evmtypes.ErrABIUnpack, "failed to unpack decimals: %s", err.Error(), + types.ErrABIUnpack, "failed to unpack decimals: %s", err.Error(), ) } diff --git a/x/erc20/keeper/evm_test.go b/x/erc20/keeper/evm_test.go index 40b578f48e..a54d80b291 100644 --- a/x/erc20/keeper/evm_test.go +++ b/x/erc20/keeper/evm_test.go @@ -42,7 +42,6 @@ func (suite *KeeperTestSuite) TestQueryERC20() { res, err := suite.app.Erc20Keeper.QueryERC20(suite.ctx, contract) if tc.res { - suite.Require().NoError(err) suite.Require().Equal( types.ERC20Data{Name: "coin", Symbol: "token", Decimals: erc20Decimals}, @@ -56,7 +55,6 @@ func (suite *KeeperTestSuite) TestQueryERC20() { func (suite *KeeperTestSuite) TestBalanceOf() { var mockEVMKeeper *erc20mocks.EVMKeeper - contract := utiltx.GenerateAddress() testCases := []struct { name string @@ -67,7 +65,8 @@ func (suite *KeeperTestSuite) TestBalanceOf() { { "Failed to call Evm", func() { - mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced ApplyMessage error")) }, int64(0), false, @@ -75,7 +74,8 @@ func (suite *KeeperTestSuite) TestBalanceOf() { { "Incorrect res", func() { - mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: []uint8{0, 0}}, nil).Once() + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: []uint8{0, 0}}, nil).Once() }, int64(0), false, @@ -85,7 +85,8 @@ func (suite *KeeperTestSuite) TestBalanceOf() { func() { balance := make([]uint8, 32) balance[31] = uint8(10) - mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Once() + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Once() }, int64(10), true, @@ -104,212 +105,13 @@ func (suite *KeeperTestSuite) TestBalanceOf() { tc.malleate() - balance := suite.app.Erc20Keeper.BalanceOf( - suite.ctx, - contracts.ERC20MinterBurnerDecimalsContract.ABI, - contract, - utiltx.GenerateAddress(), - ) + abi := contracts.ERC20MinterBurnerDecimalsContract.ABI + balance := suite.app.Erc20Keeper.BalanceOf(suite.ctx, abi, contract, utiltx.GenerateAddress()) if tc.res { suite.Require().Equal(balance.Int64(), tc.expBalance) } else { suite.Require().Nil(balance) } - - mockEVMKeeper.AssertExpectations(suite.T()) - } -} - -func (suite *KeeperTestSuite) TestCallEVM() { - testCases := []struct { - name string - method string - expPass bool - }{ - { - "unknown method", - "", - false, - }, - { - "pass", - "balanceOf", - true, - }, - } - for _, tc := range testCases { - suite.SetupTest() // reset - - erc20 := contracts.ERC20MinterBurnerDecimalsContract.ABI - contract, err := suite.DeployContract("coin", "token", erc20Decimals) - suite.Require().NoError(err) - account := utiltx.GenerateAddress() - - res, err := suite.app.EvmKeeper.CallEVM(suite.ctx, erc20, types.ModuleAddress, contract, true, tc.method, account) - if tc.expPass { - suite.Require().IsTypef(&evmtypes.MsgEthereumTxResponse{}, res, tc.name) - suite.Require().NoError(err) - } else { - suite.Require().Error(err) - } - } -} - -func (suite *KeeperTestSuite) TestCallEVMWithData() { - erc20 := contracts.ERC20MinterBurnerDecimalsContract.ABI - testCases := []struct { - name string - from common.Address - malleate func() ([]byte, *common.Address) - expPass bool - }{ - { - "unknown method", - types.ModuleAddress, - func() ([]byte, *common.Address) { - contract, err := suite.DeployContract("coin", "token", erc20Decimals) - suite.Require().NoError(err) - account := utiltx.GenerateAddress() - data, _ := erc20.Pack("", account) - return data, &contract - }, - false, - }, - { - "pass", - types.ModuleAddress, - func() ([]byte, *common.Address) { - contract, err := suite.DeployContract("coin", "token", erc20Decimals) - suite.Require().NoError(err) - account := utiltx.GenerateAddress() - data, _ := erc20.Pack("balanceOf", account) - return data, &contract - }, - true, - }, - { - "fail empty data", - types.ModuleAddress, - func() ([]byte, *common.Address) { - contract, err := suite.DeployContract("coin", "token", erc20Decimals) - suite.Require().NoError(err) - return []byte{}, &contract - }, - false, - }, - - { - "fail empty sender", - common.Address{}, - func() ([]byte, *common.Address) { - contract, err := suite.DeployContract("coin", "token", erc20Decimals) - suite.Require().NoError(err) - return []byte{}, &contract - }, - false, - }, - { - "deploy", - types.ModuleAddress, - func() ([]byte, *common.Address) { - ctorArgs, _ := contracts.ERC20MinterBurnerDecimalsContract.ABI.Pack("", "test", "test", uint8(18)) - data := append(contracts.ERC20MinterBurnerDecimalsContract.Bin, ctorArgs...) //nolint:gocritic - return data, nil - }, - true, - }, - { - "fail deploy", - types.ModuleAddress, - func() ([]byte, *common.Address) { - params := suite.app.EvmKeeper.GetParams(suite.ctx) - params.AccessControl.Create.AccessType = evmtypes.AccessTypeRestricted - _ = suite.app.EvmKeeper.SetParams(suite.ctx, params) - ctorArgs, _ := contracts.ERC20MinterBurnerDecimalsContract.ABI.Pack("", "test", "test", uint8(18)) - data := append(contracts.ERC20MinterBurnerDecimalsContract.Bin, ctorArgs...) //nolint:gocritic - return data, nil - }, - false, - }, - } - - for _, tc := range testCases { - suite.Run(fmt.Sprintf("Case %s", tc.name), func() { - suite.SetupTest() // reset - - data, contract := tc.malleate() - - res, err := suite.app.EvmKeeper.CallEVMWithData(suite.ctx, tc.from, contract, data, true) - if tc.expPass { - suite.Require().IsTypef(&evmtypes.MsgEthereumTxResponse{}, res, tc.name) - suite.Require().NoError(err) - } else { - suite.Require().Error(err) - } - }) - } -} - -func (suite *KeeperTestSuite) TestForceFail() { - var mockEVMKeeper *erc20mocks.EVMKeeper - erc20 := contracts.ERC20MinterBurnerDecimalsContract.ABI - testCases := []struct { - name string - malleate func() - commit bool - expPass bool - }{ - { - "Force estimate gas error", - func() { - mockEVMKeeper.On("CallEVMWithData", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVMWithData error")).Once() - mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced EstimateGas error")).Once() - }, - true, - false, - }, - { - "Force ApplyMessage error", - func() { - mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil).Once() - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced ApplyMessage error")).Once() - mockEVMKeeper.On("CallEVMWithData", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVMWithData error")).Once() - }, - true, - false, - }, - { - "Force ApplyMessage failed", - func() { - mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil).Once() - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{VmError: "SomeError"}, nil).Once() - mockEVMKeeper.On("CallEVMWithData", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVMWithData error")).Once() - }, - true, - false, - }, - } - - for _, tc := range testCases { - suite.Run(fmt.Sprintf("Case %s", tc.name), func() { - suite.SetupTest() // reset - mockEVMKeeper = &erc20mocks.EVMKeeper{} - - tc.malleate() - - contract, err := suite.DeployContract("coin", "token", erc20Decimals) - suite.Require().NoError(err) - account := utiltx.GenerateAddress() - data, _ := erc20.Pack("balanceOf", account) - - res, err := mockEVMKeeper.CallEVMWithData(suite.ctx, types.ModuleAddress, &contract, data, tc.commit) - if tc.expPass { - suite.Require().IsTypef(&evmtypes.MsgEthereumTxResponse{}, res, tc.name) - suite.Require().NoError(err) - } else { - suite.Require().Error(err) - } - }) } } @@ -324,16 +126,16 @@ func (suite *KeeperTestSuite) TestQueryERC20ForceFail() { { "Failed to call Evm", func() { - mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced ApplyMessage error")) + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced ApplyMessage error")) }, false, }, { "Incorrect res", func() { - mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: []uint8{0, 0}}, nil).Once() + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: []uint8{0, 0}}, nil).Once() }, false, }, @@ -341,9 +143,9 @@ func (suite *KeeperTestSuite) TestQueryERC20ForceFail() { "Correct res for name - incorrect for symbol", func() { ret := []uint8{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 67, 111, 105, 110, 32, 84, 111, 107, 101, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: ret}, nil).Once() - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{VmError: "Error"}, nil).Once() + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{VmError: "Error"}, nil).Once() }, false, }, @@ -351,9 +153,10 @@ func (suite *KeeperTestSuite) TestQueryERC20ForceFail() { "incorrect symbol res", func() { ret := []uint8{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 67, 111, 105, 110, 32, 84, 111, 107, 101, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: ret}, nil).Once() - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: []uint8{0, 0}}, nil).Once() + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: ret}, nil).Once() + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: []uint8{0, 0}}, nil).Once() }, false, }, @@ -362,10 +165,12 @@ func (suite *KeeperTestSuite) TestQueryERC20ForceFail() { func() { ret := []uint8{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 67, 111, 105, 110, 32, 84, 111, 107, 101, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} retSymbol := []uint8{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 67, 84, 75, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: ret}, nil).Once() - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: retSymbol}, nil).Once() - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{VmError: "Error"}, nil).Once() + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: ret}, nil).Once() + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: retSymbol}, nil).Once() + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{VmError: "Error"}, nil).Once() }, false, }, @@ -374,10 +179,12 @@ func (suite *KeeperTestSuite) TestQueryERC20ForceFail() { func() { ret := []uint8{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 67, 111, 105, 110, 32, 84, 111, 107, 101, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} retSymbol := []uint8{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 67, 84, 75, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: ret}, nil).Once() - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: retSymbol}, nil).Once() - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: []uint8{0, 0}}, nil).Once() + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: ret}, nil).Once() + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: retSymbol}, nil).Once() + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: []uint8{0, 0}}, nil).Once() }, false, }, diff --git a/x/erc20/keeper/grpc_query_test.go b/x/erc20/keeper/grpc_query_test.go index 1082a84e78..af911c3972 100644 --- a/x/erc20/keeper/grpc_query_test.go +++ b/x/erc20/keeper/grpc_query_test.go @@ -25,7 +25,12 @@ func (suite *KeeperTestSuite) TestTokenPairs() { "no pairs registered", func() { req = &types.QueryTokenPairsRequest{} - expRes = &types.QueryTokenPairsResponse{Pagination: &query.PageResponse{}} + expRes = &types.QueryTokenPairsResponse{ + Pagination: &query.PageResponse{ + Total: 1, + }, + TokenPairs: types.DefaultTokenPairs, + } }, true, }, @@ -35,12 +40,14 @@ func (suite *KeeperTestSuite) TestTokenPairs() { req = &types.QueryTokenPairsRequest{ Pagination: &query.PageRequest{Limit: 10, CountTotal: true}, } + pairs := types.DefaultTokenPairs pair := types.NewTokenPair(utiltx.GenerateAddress(), "coin", types.OWNER_MODULE) suite.app.Erc20Keeper.SetTokenPair(suite.ctx, pair) + pairs = append(pairs, pair) expRes = &types.QueryTokenPairsResponse{ - Pagination: &query.PageResponse{Total: 1}, - TokenPairs: []types.TokenPair{pair}, + Pagination: &query.PageResponse{Total: uint64(len(pairs))}, + TokenPairs: pairs, } }, true, @@ -49,14 +56,17 @@ func (suite *KeeperTestSuite) TestTokenPairs() { "2 pairs registered wo/pagination", func() { req = &types.QueryTokenPairsRequest{} + pairs := types.DefaultTokenPairs + pair := types.NewTokenPair(utiltx.GenerateAddress(), "coin", types.OWNER_MODULE) pair2 := types.NewTokenPair(utiltx.GenerateAddress(), "coin2", types.OWNER_MODULE) suite.app.Erc20Keeper.SetTokenPair(suite.ctx, pair) suite.app.Erc20Keeper.SetTokenPair(suite.ctx, pair2) + pairs = append(pairs, pair, pair2) expRes = &types.QueryTokenPairsResponse{ - Pagination: &query.PageResponse{Total: 2}, - TokenPairs: []types.TokenPair{pair, pair2}, + Pagination: &query.PageResponse{Total: uint64(len(pairs))}, + TokenPairs: pairs, } }, true, diff --git a/x/erc20/keeper/ibc_callbacks.go b/x/erc20/keeper/ibc_callbacks.go index a1f0f66dd4..6349d77d38 100644 --- a/x/erc20/keeper/ibc_callbacks.go +++ b/x/erc20/keeper/ibc_callbacks.go @@ -4,17 +4,20 @@ package keeper import ( + "strings" + errorsmod "cosmossdk.io/errors" + "github.com/armon/go-metrics" storetypes "github.com/cosmos/cosmos-sdk/store/types" "github.com/cosmos/cosmos-sdk/telemetry" sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/ethereum/go-ethereum/common" transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" "github.com/cosmos/ibc-go/v7/modules/core/exported" - "github.com/ethereum/go-ethereum/common" "github.com/evmos/evmos/v18/ibc" "github.com/evmos/evmos/v18/x/erc20/types" @@ -37,6 +40,11 @@ func (k Keeper) OnRecvPacket( packet channeltypes.Packet, ack exported.Acknowledgement, ) exported.Acknowledgement { + // If ERC20 module is disabled no-op + if !k.IsERC20Enabled(ctx) { + return ack + } + var data transfertypes.FungibleTokenPacketData if err := transfertypes.ModuleCdc.UnmarshalJSON(packet.GetData(), &data); err != nil { // NOTE: shouldn't happen as the packet has already @@ -50,11 +58,6 @@ func (k Keeper) OnRecvPacket( WithKVGasConfig(storetypes.GasConfig{}). WithTransientKVGasConfig(storetypes.GasConfig{}) - if !k.IsERC20Enabled(ctx) { - return ack - } - - // Get addresses in `evmos1` and the original bech32 format sender, recipient, _, _, err := ibc.GetTransferSenderRecipient(data) if err != nil { return channeltypes.NewErrorAcknowledgement(err) @@ -62,16 +65,21 @@ func (k Keeper) OnRecvPacket( evmParams := k.evmKeeper.GetParams(ctx) - // if sender == recipient, and is not from an EVM Channel recovery was executed + // If we received an IBC message from a non-EVM channel, + // the sender and receiver accounts should be different. + // + // If its the same, users can have their funds stuck since they don't have access + // to the same priv key. Return an error to prevent this from happening. + // + // This is an assumption to prevent possibly wrong transactions. if sender.Equals(recipient) && !evmParams.IsEVMChannel(packet.DestinationChannel) { - // Continue to the next IBC middleware by returning the original ACK. - return ack + return channeltypes.NewErrorAcknowledgement(types.ErrInvalidIBC) } - senderAcc := k.accountKeeper.GetAccount(ctx, sender) + receiverAcc := k.accountKeeper.GetAccount(ctx, recipient) - // return acknoledgement without conversion if sender is a module account - if types.IsModuleAccount(senderAcc) { + // return acknowledgement without conversion if receiver is a module account + if types.IsModuleAccount(receiverAcc) { return ack } @@ -82,42 +90,57 @@ func (k Keeper) OnRecvPacket( data.Denom, data.Amount, ) + // If the coin denom starts with `factory/` then it is a token factory coin, and we should not convert it + // NOTE: Check https://docs.osmosis.zone/osmosis-core/modules/tokenfactory/ for more information + if strings.HasPrefix(data.Denom, "factory/") { + return ack + } + // check if the coin is a native staking token - bondDenom := k.stakingKeeper.BondDenom(ctx) - if coin.Denom == bondDenom { + if coin.Denom == evmParams.EvmDenom { // no-op, received coin is the staking denomination return ack } pairID := k.GetTokenPairID(ctx, coin.Denom) - if len(pairID) == 0 { - // short-circuit: if the denom is not registered, conversion will fail - // so we can continue with the rest of the stack + pair, found := k.GetTokenPair(ctx, pairID) + switch { + // Case 1. token pair is not registered and is a single hop IBC Coin + // by checking the prefix we ensure that only coins not native from this chain are evaluated. + // IsNativeFromSourceChain will check if the coin is native from the source chain. + // If the coin denom starts with `factory/` then it is a token factory coin, and we should not convert it + // NOTE: Check https://docs.osmosis.zone/osmosis-core/modules/tokenfactory/ for more information + case !found && strings.HasPrefix(coin.Denom, "ibc/") && ibc.IsBaseDenomFromSourceChain(data.Denom): + tokenPair, err := k.RegisterERC20Extension(ctx, coin.Denom) + if err != nil { + return channeltypes.NewErrorAcknowledgement(err) + } + + ctx.EventManager().EmitEvents( + sdk.Events{ + sdk.NewEvent( + types.EventTypeRegisterERC20Extension, + sdk.NewAttribute(types.AttributeCoinSourceChannel, packet.SourceChannel), + sdk.NewAttribute(types.AttributeKeyERC20Token, tokenPair.Erc20Address), + sdk.NewAttribute(types.AttributeKeyCosmosCoin, tokenPair.Denom), + ), + }, + ) return ack - } - pair, _ := k.GetTokenPair(ctx, pairID) - if !pair.Enabled { - // no-op: continue with the rest of the stack without conversion - return ack - } + // Case 2. native ERC20 token + case found && pair.IsNativeERC20(): + // Token pair is disabled -> return + if !pair.Enabled { + return ack + } - // Instead of converting just the received coins, convert the whole user balance - // which includes the received coins. - balance := k.bankKeeper.GetBalance(ctx, recipient, coin.Denom) + balance := k.bankKeeper.GetBalance(ctx, recipient, coin.Denom) + if err := k.ConvertCoinNativeERC20(ctx, pair, balance.Amount, common.BytesToAddress(recipient.Bytes()), recipient); err != nil { + return channeltypes.NewErrorAcknowledgement(err) + } - // Build MsgConvertCoin, from recipient to recipient since IBC transfer already occurred - msg := types.NewMsgConvertCoin(balance, common.BytesToAddress(recipient.Bytes()), recipient) - - // NOTE: we don't use ValidateBasic the msg since we've already validated - // the ICS20 packet data - - // Use MsgConvertCoin to convert the Cosmos Coin to an ERC20 - if _, err = k.ConvertCoin(sdk.WrapSDKContext(ctx), msg); err != nil { - return channeltypes.NewErrorAcknowledgement(err) - } - - defer func() { + // For now the only case we are interested in adding telemetry is a successful conversion. telemetry.IncrCounterWithLabels( []string{types.ModuleName, "ibc", "on_recv", "total"}, 1, @@ -127,7 +150,7 @@ func (k Keeper) OnRecvPacket( telemetry.NewLabel("source_port", packet.SourcePort), }, ) - }() + } return ack } @@ -159,52 +182,59 @@ func (k Keeper) OnTimeoutPacket(ctx sdk.Context, _ channeltypes.Packet, data tra } // ConvertCoinToERC20FromPacket converts the IBC coin to ERC20 after refunding the sender +// This function is only executed when IBC timeout or an Error ACK happens. func (k Keeper) ConvertCoinToERC20FromPacket(ctx sdk.Context, data transfertypes.FungibleTokenPacketData) error { sender, err := sdk.AccAddressFromBech32(data.Sender) if err != nil { return err } - // use a zero gas config to avoid extra costs for the relayers - ctx = ctx. - WithKVGasConfig(storetypes.GasConfig{}). - WithTransientKVGasConfig(storetypes.GasConfig{}) - - // assume that all module accounts on Evmos need to have their tokens in the - // IBC representation as opposed to ERC20 - senderAcc := k.accountKeeper.GetAccount(ctx, sender) - if types.IsModuleAccount(senderAcc) { + pairID := k.GetTokenPairID(ctx, data.Denom) + pair, found := k.GetTokenPair(ctx, pairID) + if !found { + // no-op, token pair is not registered return nil } coin := ibc.GetSentCoin(data.Denom, data.Amount) - // check if the coin is a native staking token - bondDenom := k.stakingKeeper.BondDenom(ctx) - if coin.Denom == bondDenom { - // no-op, received coin is the staking denomination - return nil - } + switch { - params := k.GetParams(ctx) - if !params.EnableErc20 || !k.IsDenomRegistered(ctx, coin.Denom) { - // no-op, ERC20s are disabled or the denom is not registered + // Case 1. if pair is native coin -> no-op + case pair.IsNativeCoin(): + // no-op, received coin is a native coin return nil - } - - msg := types.NewMsgConvertCoin(coin, common.BytesToAddress(sender), sender) - - // NOTE: we don't use ValidateBasic the msg since we've already validated the - // fields from the packet data - // convert Coin to ERC20 - if _, err = k.ConvertCoin(sdk.WrapSDKContext(ctx), msg); err != nil { - return err + // Case 2. if pair is native ERC20 -> unescrow + case pair.IsNativeERC20(): + // use a zero gas config to avoid extra costs for the relayers + ctx = ctx. + WithKVGasConfig(storetypes.GasConfig{}). + WithTransientKVGasConfig(storetypes.GasConfig{}) + + params := k.GetParams(ctx) + if !params.EnableErc20 || !k.IsDenomRegistered(ctx, coin.Denom) { + // no-op, ERC20s are disabled or the denom is not registered + return nil + } + + // assume that all module accounts on Evmos need to have their tokens in the + // IBC representation as opposed to ERC20 + senderAcc := k.accountKeeper.GetAccount(ctx, sender) + if types.IsModuleAccount(senderAcc) { + return nil + } + + // Convert from Coin to ERC20 + if err := k.ConvertCoinNativeERC20(ctx, pair, coin.Amount, common.BytesToAddress(sender), sender); err != nil { + // We want to record only the failed attempt to reconvert the coins during IBC. + defer func() { + telemetry.IncrCounter(1, types.ModuleName, "ibc", "error", "total") + }() + + return err + } } - defer func() { - telemetry.IncrCounter(1, types.ModuleName, "ibc", "error", "total") - }() - return nil } diff --git a/x/erc20/keeper/ibc_callbacks_integration_test.go b/x/erc20/keeper/ibc_callbacks_integration_test.go index 6eb83d9de5..88dddfa1da 100644 --- a/x/erc20/keeper/ibc_callbacks_integration_test.go +++ b/x/erc20/keeper/ibc_callbacks_integration_test.go @@ -1,19 +1,13 @@ package keeper_test import ( - "fmt" "math/big" - "strconv" "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/app" "github.com/evmos/evmos/v18/contracts" - ibctesting "github.com/evmos/evmos/v18/ibc/testing" teststypes "github.com/evmos/evmos/v18/types/tests" "github.com/evmos/evmos/v18/utils" "github.com/evmos/evmos/v18/x/erc20/types" @@ -22,7 +16,7 @@ import ( . "github.com/onsi/ginkgo/v2" ) -var _ = Describe("Convert receiving IBC to Erc20", Ordered, func() { +var _ = Describe("Convert native ERC20 receiving from IBC back to Erc20", Ordered, func() { var ( sender, receiver string receiverAcc sdk.AccAddress @@ -32,196 +26,14 @@ var _ = Describe("Convert receiving IBC to Erc20", Ordered, func() { erc20Denomtrace transfertypes.DenomTrace ) - // Metadata to register OSMO with a Token Pair for testing - osmoMeta := banktypes.Metadata{ - Description: "IBC Coin for IBC Osmosis Chain", - Base: teststypes.UosmoIbcdenom, - DenomUnits: []*banktypes.DenomUnit{ - { - Denom: teststypes.UosmoDenomtrace.BaseDenom, - Exponent: 0, - }, - }, - Name: teststypes.UosmoIbcdenom, - Symbol: erc20Symbol, - Display: teststypes.UosmoDenomtrace.BaseDenom, - } - - evmosMeta := banktypes.Metadata{ - Description: "Base Denom for Evmos Chain", - Base: utils.BaseDenom, - DenomUnits: []*banktypes.DenomUnit{ - { - Denom: teststypes.AevmosDenomtrace.BaseDenom, - Exponent: 0, - }, - }, - Name: utils.BaseDenom, - Symbol: erc20Symbol, - Display: teststypes.AevmosDenomtrace.BaseDenom, - } - BeforeEach(func() { s.suiteIBCTesting = true s.SetupTest() s.suiteIBCTesting = false }) - Describe("disabled params", func() { - BeforeEach(func() { - erc20params := types.DefaultParams() - erc20params.EnableErc20 = false - err := s.app.Erc20Keeper.SetParams(s.EvmosChain.GetContext(), erc20params) - s.Require().NoError(err) - - sender = s.IBCOsmosisChain.SenderAccount.GetAddress().String() - receiver = s.EvmosChain.SenderAccount.GetAddress().String() - receiverAcc = sdk.MustAccAddressFromBech32(receiver) - }) - It("should transfer and not convert to erc20", func() { - // register the pair to check that it was not converted to ERC-20 - pair, err := s.app.Erc20Keeper.RegisterCoin(s.EvmosChain.GetContext(), osmoMeta) - s.Require().NoError(err) - - // check balance before transfer is 0 - ibcOsmoBalanceBefore := s.app.BankKeeper.GetBalance(s.EvmosChain.GetContext(), receiverAcc, teststypes.UosmoIbcdenom) - s.Require().Equal(int64(0), ibcOsmoBalanceBefore.Amount.Int64()) - - s.SendAndReceiveMessage(s.pathOsmosisEvmos, s.IBCOsmosisChain, "uosmo", amount, sender, receiver, 1, "") - - // check balance after transfer - ibcOsmoBalanceAfter := s.app.BankKeeper.GetBalance(s.EvmosChain.GetContext(), receiverAcc, teststypes.UosmoIbcdenom) - s.Require().Equal(amount, ibcOsmoBalanceAfter.Amount.Int64()) - - // check ERC20 balance - should be zero (no conversion) - balanceERC20TokenAfter := s.app.Erc20Keeper.BalanceOf(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, pair.GetERC20Contract(), common.BytesToAddress(receiverAcc.Bytes())) - s.Require().Equal(int64(0), balanceERC20TokenAfter.Int64()) - }) - }) - Describe("enabled params and registered uosmo", func() { + Describe("registered native erc20", func() { BeforeEach(func() { - erc20params := types.DefaultParams() - erc20params.EnableErc20 = true - err := s.app.Erc20Keeper.SetParams(s.EvmosChain.GetContext(), erc20params) - s.Require().NoError(err) - - sender = s.IBCOsmosisChain.SenderAccount.GetAddress().String() - receiver = s.EvmosChain.SenderAccount.GetAddress().String() - senderAcc = sdk.MustAccAddressFromBech32(sender) - receiverAcc = sdk.MustAccAddressFromBech32(receiver) - - // Register uosmo pair - pair, err = s.app.Erc20Keeper.RegisterCoin(s.EvmosChain.GetContext(), osmoMeta) - s.Require().NoError(err) - }) - It("should transfer and convert uosmo to tokens", func() { - // Check receiver's balance for IBC and ERC-20 before transfer. Should be zero - balanceTokenBefore := s.app.Erc20Keeper.BalanceOf(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, pair.GetERC20Contract(), common.BytesToAddress(receiverAcc.Bytes())) - s.Require().Equal(int64(0), balanceTokenBefore.Int64()) - - ibcOsmoBalanceBefore := s.app.BankKeeper.GetBalance(s.EvmosChain.GetContext(), receiverAcc, teststypes.UosmoIbcdenom) - s.Require().Equal(int64(0), ibcOsmoBalanceBefore.Amount.Int64()) - - s.EvmosChain.Coordinator.CommitBlock() - // Send coins - s.SendAndReceiveMessage(s.pathOsmosisEvmos, s.IBCOsmosisChain, "uosmo", amount, sender, receiver, 1, "") - - // Check ERC20 balances - balanceTokenAfter := s.app.Erc20Keeper.BalanceOf(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, pair.GetERC20Contract(), common.BytesToAddress(receiverAcc.Bytes())) - s.Require().Equal(amount, balanceTokenAfter.Int64()) - - // Check IBC uosmo coin balance - should be zero - ibcOsmoBalanceAfter := s.app.BankKeeper.GetBalance(s.EvmosChain.GetContext(), receiverAcc, teststypes.UosmoIbcdenom) - s.Require().Equal(int64(0), ibcOsmoBalanceAfter.Amount.Int64()) - }) - It("should transfer and not convert unregistered coin (uatom)", func() { - sender = s.IBCCosmosChain.SenderAccount.GetAddress().String() - - // check balance before transfer is 0 - ibcAtomBalanceBefore := s.app.BankKeeper.GetBalance(s.EvmosChain.GetContext(), receiverAcc, teststypes.UatomIbcdenom) - s.Require().Equal(int64(0), ibcAtomBalanceBefore.Amount.Int64()) - - s.EvmosChain.Coordinator.CommitBlock() - s.SendAndReceiveMessage(s.pathCosmosEvmos, s.IBCCosmosChain, "uatom", amount, sender, receiver, 1, "") - - // check balance after transfer - ibcAtomBalanceAfter := s.app.BankKeeper.GetBalance(s.EvmosChain.GetContext(), receiverAcc, teststypes.UatomIbcdenom) - s.Require().Equal(amount, ibcAtomBalanceAfter.Amount.Int64()) - }) - It("should transfer and not convert aevmos", func() { - // Register 'aevmos' coin in ERC-20 keeper to validate it is not converting the coins when receiving 'aevmos' thru IBC - pair, err := s.app.Erc20Keeper.RegisterCoin(s.EvmosChain.GetContext(), evmosMeta) - s.Require().NoError(err) - - aevmosInitialBalance := s.app.BankKeeper.GetBalance(s.EvmosChain.GetContext(), receiverAcc, utils.BaseDenom) - - // 1. Send aevmos from Evmos to Osmosis - s.SendAndReceiveMessage(s.pathOsmosisEvmos, s.EvmosChain, utils.BaseDenom, amount, receiver, sender, 1, "") - - aevmosAfterBalance := s.app.BankKeeper.GetBalance(s.EvmosChain.GetContext(), receiverAcc, utils.BaseDenom) - s.Require().Equal(aevmosInitialBalance.Amount.Sub(math.NewInt(amount)).Sub(sendAndReceiveMsgFee), aevmosAfterBalance.Amount) - - // check ibc aevmos coins balance on Osmosis - aevmosIBCBalanceBefore := s.IBCOsmosisChain.GetSimApp().BankKeeper.GetBalance(s.IBCOsmosisChain.GetContext(), senderAcc, teststypes.AevmosIbcdenom) - s.Require().Equal(amount, aevmosIBCBalanceBefore.Amount.Int64()) - - // 2. Send aevmos IBC coins from Osmosis to Evmos - ibcCoinMeta := fmt.Sprintf("%s/%s", teststypes.AevmosDenomtrace.Path, teststypes.AevmosDenomtrace.BaseDenom) - s.SendBackCoins(s.pathOsmosisEvmos, s.IBCOsmosisChain, teststypes.AevmosIbcdenom, amount, sender, receiver, 1, ibcCoinMeta) - - // check ibc aevmos coins balance on Osmosis - should be zero - aevmosIBCSenderFinalBalance := s.IBCOsmosisChain.GetSimApp().BankKeeper.GetBalance(s.IBCOsmosisChain.GetContext(), senderAcc, teststypes.AevmosIbcdenom) - s.Require().Equal(int64(0), aevmosIBCSenderFinalBalance.Amount.Int64()) - - // check aevmos balance after transfer - should be equal to initial balance - aevmosFinalBalance := s.app.BankKeeper.GetBalance(s.EvmosChain.GetContext(), receiverAcc, utils.BaseDenom) - - totalFees := sendBackCoinsFee.Add(sendAndReceiveMsgFee) - s.Require().Equal(aevmosInitialBalance.Amount.Sub(totalFees), aevmosFinalBalance.Amount) - - // check IBC Coin balance - should be zero - ibcCoinsBalance := s.app.BankKeeper.GetBalance(s.EvmosChain.GetContext(), receiverAcc, teststypes.AevmosIbcdenom) - s.Require().Equal(int64(0), ibcCoinsBalance.Amount.Int64()) - - // Check ERC20 balances - should be zero - balanceTokenAfter := s.app.Erc20Keeper.BalanceOf(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, pair.GetERC20Contract(), common.BytesToAddress(receiverAcc.Bytes())) - s.Require().Equal(int64(0), balanceTokenAfter.Int64()) - }) - It("should transfer and convert original erc20", func() { - uosmoInitialBalance := s.IBCOsmosisChain.GetSimApp().BankKeeper.GetBalance(s.IBCOsmosisChain.GetContext(), senderAcc, "uosmo") - - // 1. Send 'uosmo' from Osmosis to Evmos - s.SendAndReceiveMessage(s.pathOsmosisEvmos, s.IBCOsmosisChain, "uosmo", amount, sender, receiver, 1, "") - - // validate 'uosmo' was transferred successfully and converted to ERC20 - balanceERC20Token := s.app.Erc20Keeper.BalanceOf(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, pair.GetERC20Contract(), common.BytesToAddress(receiverAcc.Bytes())) - s.Require().Equal(amount, balanceERC20Token.Int64()) - - // 2. Transfer back the erc20 from Evmos to Osmosis - ibcCoinMeta := fmt.Sprintf("%s/%s", teststypes.UosmoDenomtrace.Path, teststypes.UosmoDenomtrace.BaseDenom) - s.SendBackCoins(s.pathOsmosisEvmos, s.EvmosChain, types.ModuleName+"/"+pair.GetERC20Contract().String(), amount, receiver, sender, 1, ibcCoinMeta) - - // after transfer, ERC-20 token balance should be zero - balanceTokenAfter := s.app.Erc20Keeper.BalanceOf(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, pair.GetERC20Contract(), common.BytesToAddress(receiverAcc.Bytes())) - s.Require().Equal(int64(0), balanceTokenAfter.Int64()) - - // check IBC Coin balance - should be zero - ibcCoinsBalance := s.app.BankKeeper.GetBalance(s.EvmosChain.GetContext(), receiverAcc, teststypes.UosmoIbcdenom) - s.Require().Equal(int64(0), ibcCoinsBalance.Amount.Int64()) - - // Final balance on Osmosis should be equal to initial balance - uosmoFinalBalance := s.IBCOsmosisChain.GetSimApp().BankKeeper.GetBalance(s.IBCOsmosisChain.GetContext(), senderAcc, "uosmo") - s.Require().Equal(uosmoInitialBalance.Amount.Int64(), uosmoFinalBalance.Amount.Int64()) - }) - }) - - Describe("registered erc20", func() { - BeforeEach(func() { //nolint:dupl - erc20params := types.DefaultParams() - erc20params.EnableErc20 = true - err := s.app.Erc20Keeper.SetParams(s.EvmosChain.GetContext(), erc20params) - s.Require().NoError(err) - receiver = s.IBCOsmosisChain.SenderAccount.GetAddress().String() sender = s.EvmosChain.SenderAccount.GetAddress().String() receiverAcc = sdk.MustAccAddressFromBech32(receiver) @@ -285,6 +97,7 @@ var _ = Describe("Convert receiving IBC to Erc20", Ordered, func() { balanceToken = s.app.Erc20Keeper.BalanceOf(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, pair.GetERC20Contract(), common.BytesToAddress(senderAcc.Bytes())) s.Require().Equal(amount, balanceToken.Int64()) }) + It("should convert full available balance of erc20 coin to original erc20 token", func() { // Mint tokens and send to receiver _, err := s.app.EvmKeeper.CallEVM(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, common.BytesToAddress(senderAcc.Bytes()), pair.GetERC20Contract(), true, "mint", common.BytesToAddress(senderAcc.Bytes()), big.NewInt(amount)) @@ -334,6 +147,7 @@ var _ = Describe("Convert receiving IBC to Erc20", Ordered, func() { erc20CoinsBalance = s.app.BankKeeper.GetBalance(s.EvmosChain.GetContext(), senderAcc, pair.Denom) s.Require().Equal(int64(0), erc20CoinsBalance.Amount.Int64()) }) + It("send native ERC-20 to osmosis, when sending back IBC coins should convert full balance back to erc20 token", func() { // Mint tokens and send to receiver _, err := s.app.EvmKeeper.CallEVM(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, common.BytesToAddress(senderAcc.Bytes()), pair.GetERC20Contract(), true, "mint", common.BytesToAddress(senderAcc.Bytes()), big.NewInt(amount)) @@ -373,510 +187,89 @@ var _ = Describe("Convert receiving IBC to Erc20", Ordered, func() { }) }) -var _ = Describe("Convert outgoing ERC20 to IBC", Ordered, func() { - var ( - sender, receiver string - receiverAcc sdk.AccAddress - senderAcc sdk.AccAddress - amount int64 = 10 - pair *types.TokenPair - erc20Denomtrace transfertypes.DenomTrace - ) - - // Metadata to register OSMO with a Token Pair for testing - osmoMeta := banktypes.Metadata{ - Description: "IBC Coin for IBC Osmosis Chain", - Base: teststypes.UosmoIbcdenom, - DenomUnits: []*banktypes.DenomUnit{ - { - Denom: teststypes.UosmoDenomtrace.BaseDenom, - Exponent: 0, - }, - }, - Name: teststypes.UosmoIbcdenom, - Symbol: erc20Symbol, - Display: teststypes.UosmoDenomtrace.BaseDenom, - } +var _ = Describe("Native coins from IBC", Ordered, func() { + // amount to be transferred + var amount int64 = 10 BeforeEach(func() { s.suiteIBCTesting = true s.SetupTest() s.suiteIBCTesting = false }) - - Describe("disabled params", func() { - BeforeEach(func() { - erc20params := types.DefaultParams() - erc20params.EnableErc20 = true - err := s.app.Erc20Keeper.SetParams(s.EvmosChain.GetContext(), erc20params) - s.Require().NoError(err) - - receiver = s.IBCOsmosisChain.SenderAccount.GetAddress().String() - sender = s.EvmosChain.SenderAccount.GetAddress().String() - receiverAcc = sdk.MustAccAddressFromBech32(receiver) - senderAcc = sdk.MustAccAddressFromBech32(sender) - - // Register ERC20 pair - addr, err := s.DeployContractToChain("testcoin", "tt", 18) - s.Require().NoError(err) - pair, err = s.app.Erc20Keeper.RegisterERC20(s.EvmosChain.GetContext(), addr) - s.Require().NoError(err) - s.EvmosChain.Coordinator.CommitBlock() - erc20params.EnableErc20 = false - err = s.app.Erc20Keeper.SetParams(s.EvmosChain.GetContext(), erc20params) - s.Require().NoError(err) - }) - It("should fail transfer and not convert to IBC", func() { - // Mint tokens and send to receiver - _, err := s.app.EvmKeeper.CallEVM(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, common.BytesToAddress(senderAcc.Bytes()), pair.GetERC20Contract(), true, "mint", common.BytesToAddress(senderAcc.Bytes()), big.NewInt(amount)) - s.Require().NoError(err) - // Check Balance - balanceToken := s.app.Erc20Keeper.BalanceOf(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, pair.GetERC20Contract(), common.BytesToAddress(senderAcc.Bytes())) - s.Require().Equal(amount, balanceToken.Int64()) - - path := s.pathOsmosisEvmos - originEndpoint := path.EndpointB - destEndpoint := path.EndpointA - originChain := s.EvmosChain - coin := pair.Denom - transfer := transfertypes.NewFungibleTokenPacketData(pair.Denom, strconv.Itoa(int(amount*2)), sender, receiver, "") - transferMsg := transfertypes.NewMsgTransfer(originEndpoint.ChannelConfig.PortID, originEndpoint.ChannelID, sdk.NewCoin(coin, math.NewInt(amount*2)), sender, receiver, timeoutHeight, 0, "") - - originChain.Coordinator.UpdateTimeForChain(originChain) - denom := originChain.App.(*app.Evmos).StakingKeeper.BondDenom(originChain.GetContext()) - fee := sdk.Coins{sdk.NewInt64Coin(denom, ibctesting.DefaultFeeAmt)} - - _, _, err = ibctesting.SignAndDeliver( - originChain.T, - originChain.TxConfig, - originChain.App.GetBaseApp(), - []sdk.Msg{transferMsg}, - fee, - originChain.ChainID, - []uint64{originChain.SenderAccount.GetAccountNumber()}, - []uint64{originChain.SenderAccount.GetSequence()}, - false, originChain.SenderPrivKey, - ) - s.Require().Error(err) - // NextBlock calls app.Commit() - originChain.NextBlock() - - // increment sequence for successful transaction execution - err = originChain.SenderAccount.SetSequence(originChain.SenderAccount.GetSequence() + 1) - s.Require().NoError(err) - originChain.Coordinator.IncrementTime() - - packet := channeltypes.NewPacket(transfer.GetBytes(), 1, originEndpoint.ChannelConfig.PortID, originEndpoint.ChannelID, destEndpoint.ChannelConfig.PortID, destEndpoint.ChannelID, timeoutHeight, 0) - // Receive message on the counterparty side, and send ack - err = path.RelayPacket(packet) - s.Require().Error(err) - - // Check Balance didnt change - balanceToken = s.app.Erc20Keeper.BalanceOf(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, pair.GetERC20Contract(), common.BytesToAddress(senderAcc.Bytes())) - s.Require().Equal(amount, balanceToken.Int64()) - }) - }) - Describe("registered erc20", func() { - BeforeEach(func() { //nolint:dupl - erc20params := types.DefaultParams() - erc20params.EnableErc20 = true - err := s.app.Erc20Keeper.SetParams(s.EvmosChain.GetContext(), erc20params) - s.Require().NoError(err) - - receiver = s.IBCOsmosisChain.SenderAccount.GetAddress().String() - sender = s.EvmosChain.SenderAccount.GetAddress().String() - receiverAcc = sdk.MustAccAddressFromBech32(receiver) - senderAcc = sdk.MustAccAddressFromBech32(sender) - - // Register ERC20 pair - addr, err := s.DeployContractToChain("testcoin", "tt", 18) - s.Require().NoError(err) - pair, err = s.app.Erc20Keeper.RegisterERC20(s.EvmosChain.GetContext(), addr) - s.Require().NoError(err) - - erc20Denomtrace = transfertypes.DenomTrace{ - Path: "transfer/channel-0", - BaseDenom: pair.Denom, - } - - s.EvmosChain.SenderAccount.SetSequence(s.EvmosChain.SenderAccount.GetSequence() + 1) //nolint:errcheck - }) - It("should transfer available balance", func() { - // Mint tokens and send to receiver - _, err := s.app.EvmKeeper.CallEVM(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, common.BytesToAddress(senderAcc.Bytes()), pair.GetERC20Contract(), true, "mint", common.BytesToAddress(senderAcc.Bytes()), big.NewInt(amount*2)) - s.Require().NoError(err) - // Check Balance - balanceToken := s.app.Erc20Keeper.BalanceOf(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, pair.GetERC20Contract(), common.BytesToAddress(senderAcc.Bytes())) - s.Require().Equal(amount*2, balanceToken.Int64()) - - // Convert half of the available tokens - msgConvertERC20 := types.NewMsgConvertERC20( - math.NewInt(amount), - senderAcc, - pair.GetERC20Contract(), - common.BytesToAddress(senderAcc.Bytes()), - ) - - err = msgConvertERC20.ValidateBasic() - s.Require().NoError(err) - // Use MsgConvertERC20 to convert the ERC20 to a Cosmos IBC Coin - _, err = s.app.Erc20Keeper.ConvertERC20(sdk.WrapSDKContext(s.EvmosChain.GetContext()), msgConvertERC20) - s.Require().NoError(err) - - // Check Balance - balanceToken = s.app.Erc20Keeper.BalanceOf(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, pair.GetERC20Contract(), common.BytesToAddress(senderAcc.Bytes())) - s.Require().Equal(amount, balanceToken.Int64()) - - // IBC coin balance should be amount - erc20CoinsBalance := s.app.BankKeeper.GetBalance(s.EvmosChain.GetContext(), senderAcc, pair.Denom) - s.Require().Equal(amount, erc20CoinsBalance.Amount.Int64()) - - s.EvmosChain.Coordinator.CommitBlock() - - // Attempt to send erc20 into ibc, should send without conversion - s.SendBackCoins(s.pathOsmosisEvmos, s.EvmosChain, pair.Denom, amount, sender, receiver, 1, pair.Denom) - s.IBCOsmosisChain.Coordinator.CommitBlock() - - // Check balance on the Osmosis chain - erc20IBCBalance := s.IBCOsmosisChain.GetSimApp().BankKeeper.GetBalance(s.IBCOsmosisChain.GetContext(), receiverAcc, erc20Denomtrace.IBCDenom()) - s.Require().Equal(amount, erc20IBCBalance.Amount.Int64()) - // Check Balance - balanceToken = s.app.Erc20Keeper.BalanceOf(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, pair.GetERC20Contract(), common.BytesToAddress(senderAcc.Bytes())) - s.Require().Equal(amount, balanceToken.Int64()) - }) - It("should convert and transfer if no ibc balance", func() { - // Mint tokens and send to receiver - _, err := s.app.EvmKeeper.CallEVM(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, common.BytesToAddress(senderAcc.Bytes()), pair.GetERC20Contract(), true, "mint", common.BytesToAddress(senderAcc.Bytes()), big.NewInt(amount)) - s.Require().NoError(err) - - // Check Balance - balanceToken := s.app.Erc20Keeper.BalanceOf(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, pair.GetERC20Contract(), common.BytesToAddress(senderAcc.Bytes())) - s.Require().Equal(amount, balanceToken.Int64()) - - // Attempt to send erc20 into ibc, should automatically convert - s.SendBackCoins(s.pathOsmosisEvmos, s.EvmosChain, pair.Denom, amount, sender, receiver, 1, pair.Denom) - - s.EvmosChain.Coordinator.CommitBlock() - // Check balance of erc20 depleted - balanceToken = s.app.Erc20Keeper.BalanceOf(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, pair.GetERC20Contract(), common.BytesToAddress(senderAcc.Bytes())) - s.Require().Equal(int64(0), balanceToken.Int64()) - - // Check balance received on the Osmosis chain - ibcOsmosBalance := s.IBCOsmosisChain.GetSimApp().BankKeeper.GetBalance(s.IBCOsmosisChain.GetContext(), receiverAcc, erc20Denomtrace.IBCDenom()) - s.Require().Equal(amount, ibcOsmosBalance.Amount.Int64()) - }) - It("should fail if balance is not enough", func() { - // Mint tokens and send to receiver - _, err := s.app.EvmKeeper.CallEVM(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, common.BytesToAddress(senderAcc.Bytes()), pair.GetERC20Contract(), true, "mint", common.BytesToAddress(senderAcc.Bytes()), big.NewInt(amount)) - s.Require().NoError(err) - - // Check Balance - balanceToken := s.app.Erc20Keeper.BalanceOf(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, pair.GetERC20Contract(), common.BytesToAddress(senderAcc.Bytes())) - s.Require().Equal(amount, balanceToken.Int64()) - - // Attempt to send that will fail because balance is not enough - path := s.pathOsmosisEvmos - originEndpoint := path.EndpointB - originChain := s.EvmosChain - coin := pair.Denom - transferMsg := transfertypes.NewMsgTransfer(originEndpoint.ChannelConfig.PortID, originEndpoint.ChannelID, sdk.NewCoin(coin, math.NewInt(amount*2)), sender, receiver, timeoutHeight, 0, "") - - originChain.Coordinator.UpdateTimeForChain(originChain) - - denom := originChain.App.(*app.Evmos).StakingKeeper.BondDenom(originChain.GetContext()) - fee := sdk.Coins{sdk.NewInt64Coin(denom, ibctesting.DefaultFeeAmt)} - - _, _, err = ibctesting.SignAndDeliver( - originChain.T, - originChain.TxConfig, - originChain.App.GetBaseApp(), - []sdk.Msg{transferMsg}, - fee, - originChain.ChainID, - []uint64{originChain.SenderAccount.GetAccountNumber()}, - []uint64{originChain.SenderAccount.GetSequence()}, - false, originChain.SenderPrivKey, - ) - - // Require a failing transfer - s.Require().Error(err) - // NextBlock calls app.Commit() - originChain.NextBlock() - originChain.Coordinator.IncrementTime() - - // Check Balance didnt change - ibcOsmosBalance := s.IBCOsmosisChain.GetSimApp().BankKeeper.GetBalance(s.IBCOsmosisChain.GetContext(), receiverAcc, erc20Denomtrace.IBCDenom()) - s.Require().Equal(int64(0), ibcOsmosBalance.Amount.Int64()) - balanceToken = s.app.Erc20Keeper.BalanceOf(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, pair.GetERC20Contract(), common.BytesToAddress(senderAcc.Bytes())) - s.Require().Equal(amount, balanceToken.Int64()) - }) - It("should timeout and reconvert to ERC20", func() { - // Mint tokens and send to receiver - _, err := s.app.EvmKeeper.CallEVM(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, common.BytesToAddress(senderAcc.Bytes()), pair.GetERC20Contract(), true, "mint", common.BytesToAddress(senderAcc.Bytes()), big.NewInt(amount)) - s.Require().NoError(err) - - // Check Balance - balanceToken := s.app.Erc20Keeper.BalanceOf(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, pair.GetERC20Contract(), common.BytesToAddress(senderAcc.Bytes())) - s.Require().Equal(amount, balanceToken.Int64()) - - // Attempt to send erc20 into ibc, should automatically convert - // Send message that will timeout - path := s.pathOsmosisEvmos - originEndpoint := path.EndpointB - destEndpoint := path.EndpointA - originChain := s.EvmosChain - coin := pair.Denom - currentTime := s.EvmosChain.Coordinator.CurrentTime - timeout := uint64(currentTime.Unix() * 1000000000) - transferMsg := transfertypes.NewMsgTransfer(originEndpoint.ChannelConfig.PortID, originEndpoint.ChannelID, - sdk.NewCoin(coin, math.NewInt(amount)), sender, receiver, timeoutHeight, timeout, "") - - originChain.Coordinator.UpdateTimeForChain(originChain) - - denom := originChain.App.(*app.Evmos).StakingKeeper.BondDenom(originChain.GetContext()) - fee := sdk.Coins{sdk.NewInt64Coin(denom, ibctesting.DefaultFeeAmt)} - - _, _, err = ibctesting.SignAndDeliver( - originChain.T, - originChain.TxConfig, - originChain.App.GetBaseApp(), - []sdk.Msg{transferMsg}, - fee, - originChain.ChainID, - []uint64{originChain.SenderAccount.GetAccountNumber()}, - []uint64{originChain.SenderAccount.GetSequence()}, - true, originChain.SenderPrivKey, - ) - s.Require().NoError(err) - - // Check balance of erc20 depleted (converted to IBC coin) - balanceToken = s.app.Erc20Keeper.BalanceOf(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, pair.GetERC20Contract(), common.BytesToAddress(senderAcc.Bytes())) - s.Require().Equal(int64(0), balanceToken.Int64()) - - // NextBlock calls app.Commit() - originChain.NextBlock() - - // increment sequence for successful transaction execution - err = originChain.SenderAccount.SetSequence(originChain.SenderAccount.GetSequence() + 1) - s.Require().NoError(err) - - // Increment time so packet will timeout - originChain.Coordinator.IncrementTime() - s.IBCOsmosisChain.Coordinator.CommitBlock(s.IBCOsmosisChain) - - // Recreate the packet that was sent - transfer := transfertypes.NewFungibleTokenPacketData(pair.Denom, strconv.Itoa(int(amount)), sender, receiver, "") - packet := channeltypes.NewPacket(transfer.GetBytes(), 1, originEndpoint.ChannelConfig.PortID, originEndpoint.ChannelID, destEndpoint.ChannelConfig.PortID, destEndpoint.ChannelID, timeoutHeight, timeout) - - // need to update evmos chain to prove missing ack - err = path.EndpointB.UpdateClient() - s.Require().NoError(err) - // Receive timeout - err = path.EndpointB.TimeoutPacket(packet) - s.Require().NoError(err) - originChain.NextBlock() - - // Check that balance was reconverted to ERC20 and refunded to sender - balanceToken = s.app.Erc20Keeper.BalanceOf(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, pair.GetERC20Contract(), common.BytesToAddress(senderAcc.Bytes())) - s.Require().Equal(amount, balanceToken.Int64()) - }) + It("Is native from source chain - should transfer and register pair and deploy a precompile", func() { + osmosisAddress := s.IBCOsmosisChain.SenderAccount.GetAddress().String() + evmosAddress := s.EvmosChain.SenderAccount.GetAddress().String() + evmosAccount := sdk.MustAccAddressFromBech32(evmosAddress) + + // Precompile should not be available before IBC + uosmoContractAddr, err := utils.GetIBCDenomAddress(teststypes.UosmoIbcdenom) + s.Require().NoError(err) + + params := s.app.EvmKeeper.GetParams(s.EvmosChain.GetContext()) + s.Require().False(s.app.EvmKeeper.IsAvailableStaticPrecompile(¶ms, uosmoContractAddr)) + // Check receiver's balance for IBC before transfer. Should be zero + ibcOsmoBalanceBefore := s.app.BankKeeper.GetBalance(s.EvmosChain.GetContext(), evmosAccount, teststypes.UosmoIbcdenom) + s.Require().Equal(int64(0), ibcOsmoBalanceBefore.Amount.Int64()) + s.EvmosChain.Coordinator.CommitBlock() + + // Send uosmo from osmosis to evmos + s.SendAndReceiveMessage(s.pathOsmosisEvmos, s.IBCOsmosisChain, "uosmo", amount, osmosisAddress, evmosAddress, 1, "") + s.EvmosChain.Coordinator.CommitBlock() + + // Check IBC uosmo coin balance - should be equals to amount sended + ibcOsmoBalanceAfter := s.app.BankKeeper.GetBalance(s.EvmosChain.GetContext(), evmosAccount, teststypes.UosmoIbcdenom) + s.Require().Equal(amount, ibcOsmoBalanceAfter.Amount.Int64()) + + // Pair should be registered now and precompile available + pairID := s.app.Erc20Keeper.GetTokenPairID(s.EvmosChain.GetContext(), teststypes.UosmoIbcdenom) + _, found := s.app.Erc20Keeper.GetTokenPair(s.EvmosChain.GetContext(), pairID) + s.Require().True(found) + activeDynamicPrecompiles := s.app.Erc20Keeper.GetParams(s.EvmosChain.GetContext()).DynamicPrecompiles + s.Require().Contains(activeDynamicPrecompiles, uosmoContractAddr.String()) }) - Describe("registered coin", func() { - BeforeEach(func() { - receiver = s.IBCOsmosisChain.SenderAccount.GetAddress().String() - sender = s.EvmosChain.SenderAccount.GetAddress().String() - receiverAcc = sdk.MustAccAddressFromBech32(receiver) - senderAcc = sdk.MustAccAddressFromBech32(sender) - - erc20params := types.DefaultParams() - erc20params.EnableErc20 = false - err := s.app.Erc20Keeper.SetParams(s.EvmosChain.GetContext(), erc20params) - s.Require().NoError(err) - - // Send from osmosis to Evmos - s.SendAndReceiveMessage(s.pathOsmosisEvmos, s.IBCOsmosisChain, "uosmo", amount, receiver, sender, 1, "") - s.EvmosChain.Coordinator.CommitBlock(s.EvmosChain) - erc20params.EnableErc20 = true - err = s.app.Erc20Keeper.SetParams(s.EvmosChain.GetContext(), erc20params) - s.Require().NoError(err) - - // Register uosmo pair - pair, err = s.app.Erc20Keeper.RegisterCoin(s.EvmosChain.GetContext(), osmoMeta) - s.Require().NoError(err) - }) - It("should convert erc20 to ibc vouched and transfer", func() { - uosmoInitialBalance := s.IBCOsmosisChain.GetSimApp().BankKeeper.GetBalance(s.IBCOsmosisChain.GetContext(), receiverAcc, "uosmo") - - balance := s.app.BankKeeper.GetBalance(s.EvmosChain.GetContext(), senderAcc, teststypes.UosmoIbcdenom) - s.Require().Equal(amount, balance.Amount.Int64()) - - // Convert ibc vouchers to erc20 tokens - msgConvertCoin := types.NewMsgConvertCoin( - sdk.NewCoin(pair.Denom, math.NewInt(amount)), - common.BytesToAddress(senderAcc.Bytes()), - senderAcc, - ) - - err := msgConvertCoin.ValidateBasic() - s.Require().NoError(err) - // Use MsgConvertERC20 to convert the ERC20 to a Cosmos IBC Coin - _, err = s.app.Erc20Keeper.ConvertCoin(sdk.WrapSDKContext(s.EvmosChain.GetContext()), msgConvertCoin) - s.Require().NoError(err) - - s.EvmosChain.Coordinator.CommitBlock() - - // Attempt to send erc20 tokens to osmosis and convert automatically - s.SendBackCoins(s.pathOsmosisEvmos, s.EvmosChain, pair.Denom, amount, sender, receiver, 1, teststypes.UosmoDenomtrace.GetFullDenomPath()) - s.IBCOsmosisChain.Coordinator.CommitBlock() - // Check balance on the Osmosis chain - uosmoBalance := s.IBCOsmosisChain.GetSimApp().BankKeeper.GetBalance(s.IBCOsmosisChain.GetContext(), receiverAcc, "uosmo") - s.Require().Equal(uosmoInitialBalance.Amount.Int64()+amount, uosmoBalance.Amount.Int64()) - }) - It("should transfer available balance", func() { - uosmoInitialBalance := s.IBCOsmosisChain.GetSimApp().BankKeeper.GetBalance(s.IBCOsmosisChain.GetContext(), receiverAcc, "uosmo") - - balance := s.app.BankKeeper.GetBalance(s.EvmosChain.GetContext(), senderAcc, teststypes.UosmoIbcdenom) - s.Require().Equal(amount, balance.Amount.Int64()) - - // Attempt to send erc20 tokens to osmosis and convert automatically - s.SendBackCoins(s.pathOsmosisEvmos, s.EvmosChain, pair.Denom, amount, sender, receiver, 1, teststypes.UosmoDenomtrace.GetFullDenomPath()) - s.IBCOsmosisChain.Coordinator.CommitBlock() - // Check balance on the Osmosis chain - uosmoBalance := s.IBCOsmosisChain.GetSimApp().BankKeeper.GetBalance(s.IBCOsmosisChain.GetContext(), receiverAcc, "uosmo") - s.Require().Equal(uosmoInitialBalance.Amount.Int64()+amount, uosmoBalance.Amount.Int64()) - }) - - It("should timeout and reconvert coins", func() { - balance := s.app.BankKeeper.GetBalance(s.EvmosChain.GetContext(), senderAcc, teststypes.UosmoIbcdenom) - s.Require().Equal(amount, balance.Amount.Int64()) - - // Convert ibc vouchers to erc20 tokens - msgConvertCoin := types.NewMsgConvertCoin( - sdk.NewCoin(pair.Denom, math.NewInt(amount)), - common.BytesToAddress(senderAcc.Bytes()), - senderAcc, - ) - err := msgConvertCoin.ValidateBasic() - s.Require().NoError(err) - - // Use MsgConvertERC20 to convert the ERC20 to a Cosmos IBC Coin - _, err = s.app.Erc20Keeper.ConvertCoin(sdk.WrapSDKContext(s.EvmosChain.GetContext()), msgConvertCoin) - s.Require().NoError(err) - - s.EvmosChain.Coordinator.CommitBlock() - - // Send message that will timeout - path := s.pathOsmosisEvmos - originEndpoint := path.EndpointB - destEndpoint := path.EndpointA - originChain := s.EvmosChain - coin := pair.Denom - currentTime := s.EvmosChain.Coordinator.CurrentTime - timeout := uint64(currentTime.Unix() * 1000000000) - transferMsg := transfertypes.NewMsgTransfer(originEndpoint.ChannelConfig.PortID, originEndpoint.ChannelID, - sdk.NewCoin(coin, math.NewInt(amount)), sender, receiver, timeoutHeight, timeout, "") - - originChain.Coordinator.UpdateTimeForChain(originChain) - - denom := originChain.App.(*app.Evmos).StakingKeeper.BondDenom(originChain.GetContext()) - fee := sdk.Coins{sdk.NewInt64Coin(denom, ibctesting.DefaultFeeAmt)} - - _, _, err = ibctesting.SignAndDeliver( - originChain.T, - originChain.TxConfig, - originChain.App.GetBaseApp(), - []sdk.Msg{transferMsg}, - fee, - originChain.ChainID, - []uint64{originChain.SenderAccount.GetAccountNumber()}, - []uint64{originChain.SenderAccount.GetSequence()}, - true, originChain.SenderPrivKey, - ) - s.Require().NoError(err) - - // check ERC20 balance was converted to ibc and sent - balanceERC20TokenAfter := s.app.Erc20Keeper.BalanceOf(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, pair.GetERC20Contract(), common.BytesToAddress(senderAcc.Bytes())) - s.Require().Equal(int64(0), balanceERC20TokenAfter.Int64()) - - // NextBlock calls app.Commit() - originChain.NextBlock() - - // increment sequence for successful transaction execution - err = originChain.SenderAccount.SetSequence(originChain.SenderAccount.GetSequence() + 1) - s.Require().NoError(err) - - // Increment time so packet will timeout - originChain.Coordinator.IncrementTime() - s.IBCOsmosisChain.Coordinator.CommitBlock(s.IBCOsmosisChain) - - // Recreate the packet that was sent - transfer := transfertypes.NewFungibleTokenPacketData(teststypes.UosmoDenomtrace.GetFullDenomPath(), strconv.Itoa(int(amount)), sender, receiver, "") - packet := channeltypes.NewPacket(transfer.GetBytes(), 1, originEndpoint.ChannelConfig.PortID, originEndpoint.ChannelID, destEndpoint.ChannelConfig.PortID, destEndpoint.ChannelID, timeoutHeight, timeout) - - // need to update evmos chain to prove missing ack - err = path.EndpointB.UpdateClient() - s.Require().NoError(err) - // Receive timeout - err = path.EndpointB.TimeoutPacket(packet) - s.Require().NoError(err) - originChain.NextBlock() - - // Check that balance was reconverted - balance = s.app.BankKeeper.GetBalance(s.EvmosChain.GetContext(), senderAcc, teststypes.UosmoIbcdenom) - s.Require().Equal(int64(0), balance.Amount.Int64()) - - balanceERC20TokenAfter = s.app.Erc20Keeper.BalanceOf(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, pair.GetERC20Contract(), common.BytesToAddress(senderAcc.Bytes())) - s.Require().Equal(amount, balanceERC20TokenAfter.Int64()) - }) - It("should error and reconvert coins", func() { - receiverAcc = s.IBCCosmosChain.GetSimApp().AccountKeeper.GetModuleAddress("distribution") - receiver = receiverAcc.String() - s.IBCOsmosisChain.GetSimApp().BankKeeper.BlockedAddr(receiverAcc) - - balance := s.app.BankKeeper.GetBalance(s.EvmosChain.GetContext(), senderAcc, teststypes.UosmoIbcdenom) - s.Require().Equal(amount, balance.Amount.Int64()) - - // Convert ibc vouchers to erc20 tokens - msgConvertCoin := types.NewMsgConvertCoin( - sdk.NewCoin(pair.Denom, math.NewInt(amount)), - common.BytesToAddress(senderAcc.Bytes()), - senderAcc, - ) - err := msgConvertCoin.ValidateBasic() - s.Require().NoError(err) - - // Use MsgConvertERC20 to convert the ERC20 to a Cosmos IBC Coin - _, err = s.app.Erc20Keeper.ConvertCoin(sdk.WrapSDKContext(s.EvmosChain.GetContext()), msgConvertCoin) - s.Require().NoError(err) - - s.EvmosChain.Coordinator.CommitBlock() - - // Send message that will timeout - path := s.pathOsmosisEvmos - originEndpoint := path.EndpointB - destEndpoint := path.EndpointA - originChain := s.EvmosChain - coin := pair.Denom - timeout := uint64(0) - transferMsg := transfertypes.NewMsgTransfer(originEndpoint.ChannelConfig.PortID, originEndpoint.ChannelID, - sdk.NewCoin(coin, math.NewInt(amount)), sender, receiver, timeoutHeight, timeout, "") - - _, err = ibctesting.SendMsgs(originChain, ibctesting.DefaultFeeAmt, transferMsg) - s.Require().NoError(err) // message committed - - // Recreate the packet that was sent - transfer := transfertypes.NewFungibleTokenPacketData(teststypes.UosmoDenomtrace.GetFullDenomPath(), strconv.Itoa(int(amount)), sender, receiver, "") - packet := channeltypes.NewPacket(transfer.GetBytes(), 1, originEndpoint.ChannelConfig.PortID, originEndpoint.ChannelID, destEndpoint.ChannelConfig.PortID, destEndpoint.ChannelID, timeoutHeight, 0) - - // Receive message on the counterparty side, and send ack - err = path.RelayPacket(packet) - s.Require().NoError(err) - - balance = s.app.BankKeeper.GetBalance(s.EvmosChain.GetContext(), senderAcc, teststypes.UosmoIbcdenom) - s.Require().Equal(int64(0), balance.Amount.Int64()) - - balanceERC20TokenAfter := s.app.Erc20Keeper.BalanceOf(s.EvmosChain.GetContext(), contracts.ERC20MinterBurnerDecimalsContract.ABI, pair.GetERC20Contract(), common.BytesToAddress(senderAcc.Bytes())) - s.Require().Equal(amount, balanceERC20TokenAfter.Int64()) - }) + It("Not native from source chain - should transfer and not register pair or deploy precompile", func() { + // Send from Cosmos to Osmosis + sender := s.IBCCosmosChain.SenderAccount.GetAddress().String() + receiver := s.IBCOsmosisChain.SenderAccount.GetAddress().String() + receiverAcc := sdk.MustAccAddressFromBech32(receiver) + + UatomInOsmosisDenomtrace := transfertypes.DenomTrace{ + Path: "transfer/channel-1", + BaseDenom: "uatom", + } + UatomInOsmosisIbcdenom := UatomInOsmosisDenomtrace.IBCDenom() + uosmoContractAddr, err := utils.GetIBCDenomAddress(UatomInOsmosisIbcdenom) + s.Require().NoError(err) + params := s.app.EvmKeeper.GetParams(s.EvmosChain.GetContext()) + s.Require().False(s.app.EvmKeeper.IsAvailableStaticPrecompile(¶ms, uosmoContractAddr)) + + // check balance before transfer is 0 + ibcAtomBalanceBefore := s.app.BankKeeper.GetBalance(s.EvmosChain.GetContext(), receiverAcc, teststypes.UatomOsmoIbcdenom) + s.Require().Equal(int64(0), ibcAtomBalanceBefore.Amount.Int64()) + + s.EvmosChain.Coordinator.CommitBlock() + s.SendBackCoins(s.pathOsmosisCosmos, s.IBCCosmosChain, "uatom", amount, sender, receiver, 1, "") + + // Balance of atom in Osmosis + ibcOsmoBalanceAfter := s.IBCOsmosisChain.GetSimApp().BankKeeper.GetBalance(s.IBCOsmosisChain.GetContext(), receiverAcc, UatomInOsmosisIbcdenom) + s.Require().Equal(amount, ibcOsmoBalanceAfter.Amount.Int64()) + + // Send ibc atom from osmosis account to our Evmos account + sender = s.IBCOsmosisChain.SenderAccount.GetAddress().String() + receiver = s.EvmosChain.SenderAccount.GetAddress().String() + receiverAcc = sdk.MustAccAddressFromBech32(receiver) + s.SendBackCoins(s.pathOsmosisEvmos, s.IBCOsmosisChain, UatomInOsmosisIbcdenom, amount, sender, receiver, 1, "transfer/channel-1/uatom") + + // check balance of ibc atom on evmos after transfer + ibcAtomBalanceAfter := s.app.BankKeeper.GetBalance(s.EvmosChain.GetContext(), receiverAcc, teststypes.UatomOsmoIbcdenom) + s.Require().Equal(amount, ibcAtomBalanceAfter.Amount.Int64()) + + // Pair should not have been registered since atom is not native from osmosis + // Precompile shouldnt be deployed + pairID := s.app.Erc20Keeper.GetTokenPairID(s.EvmosChain.GetContext(), teststypes.UatomOsmoIbcdenom) + _, found := s.app.Erc20Keeper.GetTokenPair(s.EvmosChain.GetContext(), pairID) + s.Require().False(found) + activeDynamicPrecompiles := s.app.Erc20Keeper.GetParams(s.EvmosChain.GetContext()).DynamicPrecompiles + s.Require().NotContains(activeDynamicPrecompiles, uosmoContractAddr.String()) }) }) diff --git a/x/erc20/keeper/ibc_callbacks_test.go b/x/erc20/keeper/ibc_callbacks_test.go index 4a60ceebdc..a5bc53cdea 100644 --- a/x/erc20/keeper/ibc_callbacks_test.go +++ b/x/erc20/keeper/ibc_callbacks_test.go @@ -28,8 +28,6 @@ import ( "github.com/evmos/evmos/v18/contracts" "github.com/evmos/evmos/v18/x/erc20/types" evmtypes "github.com/evmos/evmos/v18/x/evm/types" - inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" - vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" ) var erc20Denom = "erc20/0xdac17f958d2ee523a2206206994597c13d831ec7" @@ -38,7 +36,6 @@ func (suite *KeeperTestSuite) TestOnRecvPacket() { // secp256k1 account secpPk := secp256k1.GenPrivKey() secpAddr := sdk.AccAddress(secpPk.PubKey().Address()) - secpAddrEvmos := secpAddr.String() secpAddrCosmos := sdk.MustBech32ifyAddressBytes(sdk.Bech32MainPrefix, secpAddr) // ethsecp256k1 account @@ -142,17 +139,17 @@ func (suite *KeeperTestSuite) TestOnRecvPacket() { expCoins: coins, }, { - name: "no-op - sender == receiver, not from Evm channel", + name: "error - sender == receiver, not from Evm channel", malleate: func() { transfer := transfertypes.NewFungibleTokenPacketData(registeredDenom, "100", ethsecpAddrEvmos, ethsecpAddrCosmos, "") bz := transfertypes.ModuleCdc.MustMarshalJSON(&transfer) packet = channeltypes.NewPacket(bz, 1, transfertypes.PortID, sourceChannel, transfertypes.PortID, "channel-100", timeoutHeight, 0) }, - ackSuccess: true, + ackSuccess: false, receiver: secpAddr, expErc20s: big.NewInt(0), expCoins: coins, - checkBalances: true, + checkBalances: false, }, { name: "no-op - receiver is module account", @@ -219,78 +216,6 @@ func (suite *KeeperTestSuite) TestOnRecvPacket() { checkBalances: false, disableTokenPair: true, }, - { - name: "no-op - sender == receiver and is not from evm chain", // getting failed to escrow coins - need to escrow coins - malleate: func() { - transfer := transfertypes.NewFungibleTokenPacketData(registeredDenom, "100", secpAddrCosmos, secpAddrEvmos, "") - bz := transfertypes.ModuleCdc.MustMarshalJSON(&transfer) - packet = channeltypes.NewPacket(bz, 100, transfertypes.PortID, sourceChannel, transfertypes.PortID, evmosChannel, timeoutHeight, 0) - }, - receiver: secpAddr, - ackSuccess: true, - checkBalances: false, - expErc20s: big.NewInt(0), - expCoins: coins, - }, - { - name: "error - invalid denomination", // should fall as unregistered and not transfer any coins, but ack is Success - malleate: func() { - transfer := transfertypes.NewFungibleTokenPacketData("b/d//s/ss/", "100", ethsecpAddrEvmos, ethsecpAddrCosmos, "") - bz := transfertypes.ModuleCdc.MustMarshalJSON(&transfer) - packet = channeltypes.NewPacket(bz, 1, transfertypes.PortID, sourceChannel, transfertypes.PortID, evmosChannel, timeoutHeight, 0) - }, - receiver: secpAddr, - ackSuccess: true, - checkBalances: true, - expErc20s: big.NewInt(0), - expCoins: coins, - }, - { - name: "ibc conversion - sender != receiver", - malleate: func() { - pk1 := secp256k1.GenPrivKey() - sourcePrefix := transfertypes.GetDenomPrefix(transfertypes.PortID, sourceChannel) - prefixedDenom := sourcePrefix + registeredDenom - otherSecpAddrEvmos := sdk.AccAddress(pk1.PubKey().Address()).String() - transfer := transfertypes.NewFungibleTokenPacketData(prefixedDenom, "500", otherSecpAddrEvmos, ethsecpAddrEvmos, "") - bz := transfertypes.ModuleCdc.MustMarshalJSON(&transfer) - packet = channeltypes.NewPacket(bz, 100, transfertypes.PortID, sourceChannel, transfertypes.PortID, evmosChannel, timeoutHeight, 0) - }, - receiver: ethsecpAddr, - ackSuccess: true, - expErc20s: big.NewInt(1000), - checkBalances: true, - expCoins: sdk.NewCoins( - sdk.NewCoin(utils.BaseDenom, math.NewInt(1000)), - sdk.NewCoin(registeredDenom, math.NewInt(0)), - sdk.NewCoin(ibcBase, math.NewInt(1000)), - ), - }, - { - name: "ibc conversion - receiver is a vesting account (eth address)", - malleate: func() { - // Set vesting account - bacc := authtypes.NewBaseAccount(ethsecpAddr, nil, 0, 0) - acc := vestingtypes.NewClawbackVestingAccount(bacc, ethsecpAddr, nil, suite.ctx.BlockTime(), nil, nil) - - suite.app.AccountKeeper.SetAccount(suite.ctx, acc) - sourcePrefix := transfertypes.GetDenomPrefix(transfertypes.PortID, sourceChannel) - prefixedDenom := sourcePrefix + registeredDenom - - transfer := transfertypes.NewFungibleTokenPacketData(prefixedDenom, "1000", secpAddrCosmos, ethsecpAddrEvmos, "") - bz := transfertypes.ModuleCdc.MustMarshalJSON(&transfer) - packet = channeltypes.NewPacket(bz, 100, transfertypes.PortID, sourceChannel, transfertypes.PortID, evmosChannel, timeoutHeight, 0) - }, - receiver: ethsecpAddr, - ackSuccess: true, - checkBalances: true, - expErc20s: big.NewInt(1000), - expCoins: sdk.NewCoins( - sdk.NewCoin(ibcBase, math.NewInt(1000)), - sdk.NewCoin(utils.BaseDenom, math.NewInt(1000)), - sdk.NewCoin(registeredDenom, math.NewInt(0)), - ), - }, } for _, tc := range testCases { suite.Run(fmt.Sprintf("Case %s", tc.name), func() { @@ -336,7 +261,9 @@ func (suite *KeeperTestSuite) TestOnRecvPacket() { suite.Require().NoError(err) // Register Token Pair for testing - pair := suite.setupRegisterCoin(metadataCoin) + contractAddr := suite.setupRegisterERC20Pair(1) + id := suite.app.Erc20Keeper.GetTokenPairID(suite.ctx, contractAddr.String()) + pair, _ := suite.app.Erc20Keeper.GetTokenPair(suite.ctx, id) suite.Require().NotNil(pair) if tc.disableERC20 { @@ -399,7 +326,10 @@ func (suite *KeeperTestSuite) TestConvertCoinToERC20FromPacket() { { name: "pass - erc20 is disabled", malleate: func() transfertypes.FungibleTokenPacketData { - pair := suite.setupRegisterCoin(metadataIbc) + // Register Token Pair for testing + contractAddr := suite.setupRegisterERC20Pair(1) + id := suite.app.Erc20Keeper.GetTokenPairID(suite.ctx, contractAddr.String()) + pair, _ := suite.app.Erc20Keeper.GetTokenPair(suite.ctx, id) suite.Require().NotNil(pair) params := suite.app.Erc20Keeper.GetParams(suite.ctx) @@ -417,35 +347,31 @@ func (suite *KeeperTestSuite) TestConvertCoinToERC20FromPacket() { expPass: true, }, { - name: "pass - denom is registered and has available balance", + name: "pass - erc20 is disabled", malleate: func() transfertypes.FungibleTokenPacketData { - pair := suite.setupRegisterCoin(metadataIbc) + // Register Token Pair for testing + contractAddr := suite.setupRegisterERC20Pair(1) + id := suite.app.Erc20Keeper.GetTokenPairID(suite.ctx, contractAddr.String()) + pair, _ := suite.app.Erc20Keeper.GetTokenPair(suite.ctx, id) suite.Require().NotNil(pair) - sender := sdk.MustAccAddressFromBech32(senderAddr) - - // Mint coins on account to simulate receiving ibc transfer - coinEvmos := sdk.NewCoin(pair.Denom, math.NewInt(10)) - coins := sdk.NewCoins(coinEvmos) - err := suite.app.BankKeeper.MintCoins(suite.ctx, inflationtypes.ModuleName, coins) + err := testutil.FundAccount( + suite.ctx, + suite.app.BankKeeper, + sdk.MustAccAddressFromBech32(senderAddr), + sdk.NewCoins( + sdk.NewCoin(pair.Denom, math.NewInt(100)), + ), + ) suite.Require().NoError(err) - err = suite.app.BankKeeper.SendCoinsFromModuleToAccount(suite.ctx, inflationtypes.ModuleName, sender, coins) + + _, err = suite.app.EvmKeeper.CallEVM(s.ctx, contracts.ERC20MinterBurnerDecimalsContract.ABI, suite.address, contractAddr, true, "mint", types.ModuleAddress, big.NewInt(10)) suite.Require().NoError(err) return transfertypes.NewFungibleTokenPacketData(pair.Denom, "10", senderAddr, "", "") }, expPass: true, }, - { - name: "error - denom is registered but has no available balance", - malleate: func() transfertypes.FungibleTokenPacketData { - pair := suite.setupRegisterCoin(metadataIbc) - suite.Require().NotNil(pair) - - return transfertypes.NewFungibleTokenPacketData(pair.Denom, "10", senderAddr, "", "") - }, - expPass: false, - }, } for _, tc := range testCases { suite.Run(fmt.Sprintf("Case %s", tc.name), func() { @@ -468,7 +394,7 @@ func (suite *KeeperTestSuite) TestOnAcknowledgementPacket() { var ( data transfertypes.FungibleTokenPacketData ack channeltypes.Acknowledgement - pair *types.TokenPair + pair types.TokenPair ) // secp256k1 account @@ -488,7 +414,9 @@ func (suite *KeeperTestSuite) TestOnAcknowledgementPacket() { name: "no-op - ack error sender is module account", malleate: func() { // Register Token Pair for testing - pair = suite.setupRegisterCoin(metadataCoin) + contractAddr := suite.setupRegisterERC20Pair(1) + id := suite.app.Erc20Keeper.GetTokenPairID(suite.ctx, contractAddr.String()) + pair, _ = suite.app.Erc20Keeper.GetTokenPair(suite.ctx, id) suite.Require().NotNil(pair) // for testing purposes we can only fund is not allowed to receive funds @@ -504,44 +432,19 @@ func (suite *KeeperTestSuite) TestOnAcknowledgementPacket() { ) suite.Require().NoError(err) - ack = channeltypes.NewErrorAcknowledgement(errors.New("")) - data = transfertypes.NewFungibleTokenPacketData("", "", sender.String(), "", "") - }, - expPass: true, - expERC20: big.NewInt(0), - }, - { - name: "conversion - convert ibc tokens to erc20 on ack error", - malleate: func() { - // Register Token Pair for testing - pair = suite.setupRegisterCoin(metadataCoin) - suite.Require().NotNil(pair) - - sender = sdk.AccAddress(senderPk.PubKey().Address()) - - // Fund receiver account with EVMOS, ERC20 coins and IBC vouchers - // We do this since we are interested in the conversion portion w/ OnRecvPacket - err := testutil.FundAccount( - suite.ctx, - suite.app.BankKeeper, - sender, - sdk.NewCoins( - sdk.NewCoin(pair.Denom, math.NewInt(100)), - ), - ) - suite.Require().NoError(err) - ack = channeltypes.NewErrorAcknowledgement(errors.New("")) data = transfertypes.NewFungibleTokenPacketData(pair.Denom, "100", sender.String(), receiver.String(), "") }, - expERC20: big.NewInt(100), expPass: true, + expERC20: big.NewInt(0), }, { name: "no-op - positive ack", malleate: func() { // Register Token Pair for testing - pair = suite.setupRegisterCoin(metadataCoin) + contractAddr := suite.setupRegisterERC20Pair(1) + id := suite.app.Erc20Keeper.GetTokenPairID(suite.ctx, contractAddr.String()) + pair, _ = suite.app.Erc20Keeper.GetTokenPair(suite.ctx, id) suite.Require().NotNil(pair) sender = sdk.AccAddress(senderPk.PubKey().Address()) @@ -593,8 +496,6 @@ func (suite *KeeperTestSuite) TestOnAcknowledgementPacket() { } func (suite *KeeperTestSuite) TestOnTimeoutPacket() { - senderAddr := "evmos1x2w87cvt5mqjncav4lxy8yfreynn273xn5335v" - testCases := []struct { name string malleate func() transfertypes.FungibleTokenPacketData @@ -611,26 +512,6 @@ func (suite *KeeperTestSuite) TestOnTimeoutPacket() { }, expPass: true, }, - { - name: "pass - convert coin to erc20", - malleate: func() transfertypes.FungibleTokenPacketData { - pair := suite.setupRegisterCoin(metadataIbc) - suite.Require().NotNil(pair) - - sender := sdk.MustAccAddressFromBech32(senderAddr) - - // Mint coins on account to simulate receiving ibc transfer - coinEvmos := sdk.NewCoin(pair.Denom, math.NewInt(10)) - coins := sdk.NewCoins(coinEvmos) - err := suite.app.BankKeeper.MintCoins(suite.ctx, inflationtypes.ModuleName, coins) - suite.Require().NoError(err) - err = suite.app.BankKeeper.SendCoinsFromModuleToAccount(suite.ctx, inflationtypes.ModuleName, sender, coins) - suite.Require().NoError(err) - - return transfertypes.NewFungibleTokenPacketData(pair.Denom, "10", senderAddr, "", "") - }, - expPass: true, - }, } for _, tc := range testCases { suite.Run(fmt.Sprintf("Case %s", tc.name), func() { diff --git a/x/erc20/keeper/integration_test.go b/x/erc20/keeper/integration_test.go index 7d44bd0772..f4cc7abdb5 100644 --- a/x/erc20/keeper/integration_test.go +++ b/x/erc20/keeper/integration_test.go @@ -24,28 +24,12 @@ import ( var _ = Describe("Performing EVM transactions", Ordered, func() { BeforeEach(func() { s.SetupTest() - params := s.app.Erc20Keeper.GetParams(s.ctx) - params.EnableEVMHook = true params.EnableErc20 = true err := s.app.Erc20Keeper.SetParams(s.ctx, params) Expect(err).To(BeNil()) }) - // Epoch mechanism for triggering allocation and distribution - Context("with the ERC20 module and EVM Hook disabled", func() { - BeforeEach(func() { - params := s.app.Erc20Keeper.GetParams(s.ctx) - params.EnableEVMHook = false - params.EnableErc20 = false - s.app.Erc20Keeper.SetParams(s.ctx, params) //nolint:errcheck - }) - It("should be successful", func() { - _, err := s.DeployContract("coin", "token", erc20Decimals) - Expect(err).To(BeNil()) - }) - }) - Context("with the ERC20 module disabled", func() { BeforeEach(func() { params := s.app.Erc20Keeper.GetParams(s.ctx) @@ -58,18 +42,6 @@ var _ = Describe("Performing EVM transactions", Ordered, func() { }) }) - Context("with the EVMHook disabled", func() { - BeforeEach(func() { - params := s.app.Erc20Keeper.GetParams(s.ctx) - params.EnableEVMHook = false - s.app.Erc20Keeper.SetParams(s.ctx, params) //nolint:errcheck - }) - It("should be successful", func() { - _, err := s.DeployContract("coin", "token", erc20Decimals) - Expect(err).To(BeNil()) - }) - }) - Context("with the ERC20 module and EVM Hook enabled", func() { It("should be successful", func() { _, err := s.DeployContract("coin", "token", erc20Decimals) @@ -88,7 +60,7 @@ var _ = Describe("ERC20:", Ordered, func() { addr := common.BytesToAddress(addrBz) var ( - pair *types.TokenPair + pair types.TokenPair coin sdk.Coin contract common.Address contract2 common.Address @@ -166,8 +138,12 @@ var _ = Describe("ERC20:", Ordered, func() { It("should create a token pairs owned by the contract deployer", func() { tokenPairs := s.app.Erc20Keeper.GetTokenPairs(s.ctx) - s.Require().Equal(1, len(tokenPairs)) - s.Require().Equal(types.OWNER_EXTERNAL, tokenPairs[0].ContractOwner) + s.Require().Equal(2, len(tokenPairs)) + for i, tokenPair := range tokenPairs { + if tokenPair.Erc20Address == contract.Hex() { + s.Require().Equal(types.OWNER_EXTERNAL, tokenPairs[i].ContractOwner) + } + } }) }) @@ -194,75 +170,23 @@ var _ = Describe("ERC20:", Ordered, func() { It("should create a token pairs owned by the contract deployer", func() { tokenPairs := s.app.Erc20Keeper.GetTokenPairs(s.ctx) - s.Require().Equal(2, len(tokenPairs)) - s.Require().Equal(types.OWNER_EXTERNAL, tokenPairs[0].ContractOwner) + s.Require().Equal(3, len(tokenPairs)) + for i, tokenPair := range tokenPairs { + if tokenPair.Erc20Address == contract2.Hex() { + s.Require().Equal(types.OWNER_EXTERNAL, tokenPairs[i].ContractOwner) + } + } }) }) }) }) Describe("Converting", func() { - Context("with a registered coin", func() { - BeforeEach(func() { - pair = s.setupRegisterCoin(metadataCoin) - coin = sdk.NewCoin(pair.Denom, amt) - - err := testutil.FundAccount(s.ctx, s.app.BankKeeper, accAddr, sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, fundsAmt))) - s.Require().NoError(err) - err = testutil.FundAccount(s.ctx, s.app.BankKeeper, accAddr, sdk.NewCoins(coin)) - s.Require().NoError(err) - }) - - Describe("a Cosmos coin into an ERC20 token", func() { - BeforeEach(func() { - convertCoin(s.ctx, s.app, privKey, coin) - }) - - It("should decrease coins on the sender account", func() { - balanceCoin := s.app.BankKeeper.GetBalance(s.ctx, accAddr, pair.Denom) - Expect(balanceCoin.IsZero()).To(BeTrue()) - }) - - It("should escrow coins on the module account", func() { - balanceCoin := s.app.BankKeeper.GetBalance(s.ctx, moduleAcc, pair.Denom) - Expect(balanceCoin).To(Equal(coin)) - }) - - It("should mint tokens and send to receiver", func() { - balanceERC20 := s.BalanceOf(pair.GetERC20Contract(), addr).(*big.Int) - Expect(balanceERC20.Int64()).To(Equal(amt.Int64())) - }) - }) - - Describe("an ERC20 token into a Cosmos coin", func() { - BeforeEach(func() { - convertCoin(s.ctx, s.app, privKey, coin) - s.Commit() - convertERC20(s.ctx, s.app, privKey, amt, pair.GetERC20Contract()) - }) - - It("should increase coins on the sender account", func() { - balanceCoin := s.app.BankKeeper.GetBalance(s.ctx, accAddr, pair.Denom) - Expect(balanceCoin).To(Equal(coin)) - }) - - It("should unescrow coins on the module account", func() { - balanceCoin := s.app.BankKeeper.GetBalance(s.ctx, moduleAcc, pair.Denom) - Expect(balanceCoin.IsZero()).To(BeTrue()) - }) - - It("should burn the receiver's token", func() { - balanceERC20 := s.BalanceOf(pair.GetERC20Contract(), addr).(*big.Int) - Expect(balanceERC20.Int64()).To(Equal(int64(0))) - }) - }) - }) - Context("with a registered ERC20", func() { BeforeEach(func() { contract := s.setupRegisterERC20Pair(contractMinterBurner) id := s.app.Erc20Keeper.GetTokenPairID(s.ctx, contract.String()) - *pair, _ = s.app.Erc20Keeper.GetTokenPair(s.ctx, id) + pair, _ = s.app.Erc20Keeper.GetTokenPair(s.ctx, id) coin = sdk.NewCoin(pair.Denom, amt) err := testutil.FundAccount(s.ctx, s.app.BankKeeper, accAddr, sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, fundsAmt))) @@ -293,30 +217,6 @@ var _ = Describe("ERC20:", Ordered, func() { Expect(balanceCoin).To(Equal(coin)) }) }) - - Describe("a Cosmos coin into an ERC20 token", func() { - BeforeEach(func() { - convertERC20(s.ctx, s.app, privKey, amt, pair.GetERC20Contract()) - s.Commit() - convertCoin(s.ctx, s.app, privKey, coin) - }) - - It("should increase tokens on the sender account", func() { - balanceERC20 := s.BalanceOf(pair.GetERC20Contract(), addr).(*big.Int) - Expect(balanceERC20.Int64()).To(Equal(amt.Int64())) - }) - - It("should unescrow tokens on the module account", func() { - moduleAddr := common.BytesToAddress(moduleAcc.Bytes()) - balanceERC20 := s.BalanceOf(pair.GetERC20Contract(), moduleAddr).(*big.Int) - Expect(balanceERC20.Int64()).To(Equal(int64(0))) - }) - - It("should burn coins to the receiver account", func() { - balanceCoin := s.app.BankKeeper.GetBalance(s.ctx, accAddr, pair.Denom) - Expect(balanceCoin.IsZero()).To(BeTrue()) - }) - }) }) }) }) @@ -326,19 +226,8 @@ func submitRegisterERC20Proposal(ctx sdk.Context, appEvmos *app.Evmos, pk *ethse return testutil.SubmitProposal(ctx, appEvmos, pk, content, 8) } -func convertCoin(ctx sdk.Context, appEvmos *app.Evmos, pk *ethsecp256k1.PrivKey, coin sdk.Coin) { - addrBz := pk.PubKey().Address().Bytes() - - convertCoinMsg := types.NewMsgConvertCoin(coin, common.BytesToAddress(addrBz), sdk.AccAddress(addrBz)) - res, err := testutil.DeliverTx(ctx, appEvmos, pk, nil, convertCoinMsg) - s.Require().NoError(err) - - Expect(res.IsOK()).To(BeTrue(), "failed to convert coin: %s", res.Log) -} - func convertERC20(ctx sdk.Context, appEvmos *app.Evmos, pk *ethsecp256k1.PrivKey, amt math.Int, contract common.Address) { addrBz := pk.PubKey().Address().Bytes() - convertERC20Msg := types.NewMsgConvertERC20(amt, sdk.AccAddress(addrBz), contract, common.BytesToAddress(addrBz)) res, err := testutil.DeliverTx(ctx, appEvmos, pk, nil, convertERC20Msg) s.Require().NoError(err) diff --git a/x/erc20/keeper/migrations.go b/x/erc20/keeper/migrations.go index c860dc8595..4834d468e8 100644 --- a/x/erc20/keeper/migrations.go +++ b/x/erc20/keeper/migrations.go @@ -7,6 +7,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" v3 "github.com/evmos/evmos/v18/x/erc20/migrations/v3" + v4 "github.com/evmos/evmos/v18/x/erc20/migrations/v4" "github.com/evmos/evmos/v18/x/erc20/types" ) @@ -29,3 +30,7 @@ func NewMigrator(keeper Keeper, legacySubspace types.Subspace) Migrator { func (m Migrator) Migrate2to3(ctx sdk.Context) error { return v3.MigrateStore(ctx, m.keeper.storeKey, m.legacySubspace) } + +func (m Migrator) Migrate3to4(ctx sdk.Context) error { + return v4.MigrateStore(ctx, m.keeper.storeKey) +} diff --git a/x/erc20/keeper/msg_server.go b/x/erc20/keeper/msg_server.go index 9902556c95..8149ec878c 100644 --- a/x/erc20/keeper/msg_server.go +++ b/x/erc20/keeper/msg_server.go @@ -7,6 +7,8 @@ import ( "context" "math/big" + "cosmossdk.io/math" + errorsmod "cosmossdk.io/errors" "github.com/armon/go-metrics" "github.com/cosmos/cosmos-sdk/telemetry" @@ -21,48 +23,6 @@ import ( var _ types.MsgServer = &Keeper{} -// ConvertCoin converts native Cosmos coins into ERC20 tokens for both -// Cosmos-native and ERC20 TokenPair Owners -func (k Keeper) ConvertCoin( - goCtx context.Context, - msg *types.MsgConvertCoin, -) (*types.MsgConvertCoinResponse, error) { - ctx := sdk.UnwrapSDKContext(goCtx) - - // Error checked during msg validation - receiver := common.HexToAddress(msg.Receiver) - sender := sdk.MustAccAddressFromBech32(msg.Sender) - - pair, err := k.MintingEnabled(ctx, sender, receiver.Bytes(), msg.Coin.Denom) - if err != nil { - return nil, err - } - - // Remove token pair if contract is suicided - erc20 := common.HexToAddress(pair.Erc20Address) - acc := k.evmKeeper.GetAccountWithoutBalance(ctx, erc20) - - if acc == nil || !acc.IsContract() { - k.DeleteTokenPair(ctx, pair) - k.Logger(ctx).Debug( - "deleting selfdestructed token pair from state", - "contract", pair.Erc20Address, - ) - // NOTE: return nil error to persist the changes from the deletion - return nil, nil - } - - // Check ownership and execute conversion - switch { - case pair.IsNativeCoin(): - return k.convertCoinNativeCoin(ctx, pair, msg, receiver, sender) // case 1.1 - case pair.IsNativeERC20(): - return k.convertCoinNativeERC20(ctx, pair, msg, receiver, sender) // case 2.2 - default: - return nil, types.ErrUndefinedOwner - } -} - // ConvertERC20 converts ERC20 tokens into native Cosmos coins for both // Cosmos-native and ERC20 TokenPair Owners func (k Keeper) ConvertERC20( @@ -80,214 +40,29 @@ func (k Keeper) ConvertERC20( return nil, err } - // Remove token pair if contract is suicided - erc20 := common.HexToAddress(pair.Erc20Address) - acc := k.evmKeeper.GetAccountWithoutBalance(ctx, erc20) - - if acc == nil || !acc.IsContract() { - k.DeleteTokenPair(ctx, pair) - k.Logger(ctx).Debug( - "deleting selfdestructed token pair from state", - "contract", pair.Erc20Address, - ) - // NOTE: return nil error to persist the changes from the deletion - return nil, nil - } - // Check ownership and execute conversion - switch { - case pair.IsNativeCoin(): - return k.convertERC20NativeCoin(ctx, pair, msg, receiver, sender) // case 1.2 - case pair.IsNativeERC20(): - return k.convertERC20NativeToken(ctx, pair, msg, receiver, sender) // case 2.1 - default: - return nil, types.ErrUndefinedOwner - } -} - -// convertCoinNativeCoin handles the coin conversion for a native Cosmos coin -// token pair: -// - escrow coins on module account -// - mint tokens and send to receiver -// - check if token balance increased by amount -func (k Keeper) convertCoinNativeCoin( - ctx sdk.Context, - pair types.TokenPair, - msg *types.MsgConvertCoin, - receiver common.Address, - sender sdk.AccAddress, -) (*types.MsgConvertCoinResponse, error) { - // NOTE: ignore validation from NewCoin constructor - coins := sdk.Coins{msg.Coin} - erc20 := contracts.ERC20MinterBurnerDecimalsContract.ABI - contract := pair.GetERC20Contract() - balanceToken := k.BalanceOf(ctx, erc20, contract, receiver) - if balanceToken == nil { - return nil, errorsmod.Wrap(types.ErrEVMCall, "failed to retrieve balance") - } - - // Escrow coins on module account - err := k.bankKeeper.SendCoinsFromAccountToModule(ctx, sender, types.ModuleName, coins) - if err != nil { - return nil, errorsmod.Wrap(err, "failed to escrow coins") - } - - // Mint tokens and send to receiver - _, err = k.evmKeeper.CallEVM(ctx, erc20, types.ModuleAddress, contract, true, "mint", receiver, msg.Coin.Amount.BigInt()) - if err != nil { - return nil, err - } - - // Check expected receiver balance after transfer - tokens := msg.Coin.Amount.BigInt() - balanceTokenAfter := k.BalanceOf(ctx, erc20, contract, receiver) - if balanceTokenAfter == nil { - return nil, errorsmod.Wrap(types.ErrEVMCall, "failed to retrieve balance") - } - expToken := big.NewInt(0).Add(balanceToken, tokens) - - if r := balanceTokenAfter.Cmp(expToken); r != 0 { - return nil, errorsmod.Wrapf( - types.ErrBalanceInvariance, - "invalid token balance - expected: %v, actual: %v", expToken, balanceTokenAfter, - ) - } - - defer func() { - telemetry.IncrCounterWithLabels( - []string{"tx", "msg", "convert", "coin", "total"}, - 1, - []metrics.Label{ - telemetry.NewLabel("denom", pair.Denom), - }, - ) - - if msg.Coin.Amount.IsInt64() { - telemetry.IncrCounterWithLabels( - []string{"tx", "msg", "convert", "coin", "amount", "total"}, - float32(msg.Coin.Amount.Int64()), - []metrics.Label{ - telemetry.NewLabel("denom", pair.Denom), - }, + if pair.IsNativeERC20() { + // Remove token pair if contract is suicided + acc := k.evmKeeper.GetAccountWithoutBalance(ctx, pair.GetERC20Contract()) + if acc == nil || !acc.IsContract() { + k.DeleteTokenPair(ctx, pair) + k.Logger(ctx).Debug( + "deleting selfdestructed token pair from state", + "contract", pair.Erc20Address, ) + // NOTE: return nil error to persist the changes from the deletion + return nil, nil } - }() - - ctx.EventManager().EmitEvents( - sdk.Events{ - sdk.NewEvent( - types.EventTypeConvertCoin, - sdk.NewAttribute(sdk.AttributeKeySender, msg.Sender), - sdk.NewAttribute(types.AttributeKeyReceiver, msg.Receiver), - sdk.NewAttribute(sdk.AttributeKeyAmount, msg.Coin.Amount.String()), - sdk.NewAttribute(types.AttributeKeyCosmosCoin, msg.Coin.Denom), - sdk.NewAttribute(types.AttributeKeyERC20Token, pair.Erc20Address), - ), - }, - ) - - return &types.MsgConvertCoinResponse{}, nil -} - -// convertERC20NativeCoin handles the erc20 conversion for a native Cosmos coin -// token pair: -// - burn escrowed tokens -// - unescrow coins that have been previously escrowed with ConvertCoin -// - check if coin balance increased by amount -// - check if token balance decreased by amount -func (k Keeper) convertERC20NativeCoin( - ctx sdk.Context, - pair types.TokenPair, - msg *types.MsgConvertERC20, - receiver sdk.AccAddress, - sender common.Address, -) (*types.MsgConvertERC20Response, error) { - // NOTE: coin fields already validated - coins := sdk.Coins{sdk.Coin{Denom: pair.Denom, Amount: msg.Amount}} - erc20 := contracts.ERC20MinterBurnerDecimalsContract.ABI - contract := pair.GetERC20Contract() - balanceCoin := k.bankKeeper.GetBalance(ctx, receiver, pair.Denom) - balanceToken := k.BalanceOf(ctx, erc20, contract, sender) - if balanceToken == nil { - return nil, errorsmod.Wrap(types.ErrEVMCall, "failed to retrieve balance") - } - - // Burn escrowed tokens - _, err := k.evmKeeper.CallEVM(ctx, erc20, types.ModuleAddress, contract, true, "burnCoins", sender, msg.Amount.BigInt()) - if err != nil { - return nil, err - } - // Unescrow coins and send to receiver - err = k.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, receiver, coins) - if err != nil { - return nil, err + return k.convertERC20IntoCoinsForNativeToken(ctx, pair, msg, receiver, sender) // case 2.1 + } else if pair.IsNativeCoin() { + return nil, types.ErrNativeConversionDisabled } - // Check expected receiver balance after transfer - balanceCoinAfter := k.bankKeeper.GetBalance(ctx, receiver, pair.Denom) - expCoin := balanceCoin.Add(coins[0]) - if ok := balanceCoinAfter.IsEqual(expCoin); !ok { - return nil, errorsmod.Wrapf( - types.ErrBalanceInvariance, - "invalid coin balance - expected: %v, actual: %v", - expCoin, balanceCoinAfter, - ) - } - - // Check expected Sender balance after transfer - tokens := coins[0].Amount.BigInt() - balanceTokenAfter := k.BalanceOf(ctx, erc20, contract, sender) - if balanceTokenAfter == nil { - return nil, errorsmod.Wrap(types.ErrEVMCall, "failed to retrieve balance") - } - - expToken := big.NewInt(0).Sub(balanceToken, tokens) - if r := balanceTokenAfter.Cmp(expToken); r != 0 { - return nil, errorsmod.Wrapf( - types.ErrBalanceInvariance, - "invalid token balance - expected: %v, actual: %v", - expToken, balanceTokenAfter, - ) - } - - defer func() { - telemetry.IncrCounterWithLabels( - []string{"tx", "msg", "convert", "erc20", "total"}, - 1, - []metrics.Label{ - telemetry.NewLabel("denom", pair.Denom), - }, - ) - - if msg.Amount.IsInt64() { - telemetry.IncrCounterWithLabels( - []string{"tx", "msg", "convert", "erc20", "amount", "total"}, - float32(msg.Amount.Int64()), - []metrics.Label{ - telemetry.NewLabel("denom", pair.Denom), - }, - ) - } - }() - - ctx.EventManager().EmitEvents( - sdk.Events{ - sdk.NewEvent( - types.EventTypeConvertERC20, - sdk.NewAttribute(sdk.AttributeKeySender, msg.Sender), - sdk.NewAttribute(types.AttributeKeyReceiver, msg.Receiver), - sdk.NewAttribute(sdk.AttributeKeyAmount, msg.Amount.String()), - sdk.NewAttribute(types.AttributeKeyCosmosCoin, pair.Denom), - sdk.NewAttribute(types.AttributeKeyERC20Token, msg.ContractAddress), - ), - }, - ) - - return &types.MsgConvertERC20Response{}, nil + return nil, types.ErrUndefinedOwner } -// convertERC20NativeToken handles the erc20 conversion for a native erc20 token +// convertERC20IntoCoinsForNativeToken handles the erc20 conversion for a native erc20 token // pair: // - escrow tokens on module account // - mint coins on bank module @@ -295,15 +70,13 @@ func (k Keeper) convertERC20NativeCoin( // - check if coin balance increased by amount // - check if token balance decreased by amount // - check for unexpected `Approval` event in logs -func (k Keeper) convertERC20NativeToken( +func (k Keeper) convertERC20IntoCoinsForNativeToken( ctx sdk.Context, pair types.TokenPair, msg *types.MsgConvertERC20, receiver sdk.AccAddress, sender common.Address, ) (*types.MsgConvertERC20Response, error) { - // NOTE: coin fields already validated - coins := sdk.Coins{sdk.Coin{Denom: pair.Denom, Amount: msg.Amount}} erc20 := contracts.ERC20MinterBurnerDecimalsContract.ABI contract := pair.GetERC20Contract() balanceCoin := k.bankKeeper.GetBalance(ctx, receiver, pair.Denom) @@ -334,6 +107,8 @@ func (k Keeper) convertERC20NativeToken( } // Check expected escrow balance after transfer execution + // NOTE: coin fields already validated in the ValidateBasic() of the message + coins := sdk.Coins{sdk.Coin{Denom: pair.Denom, Amount: msg.Amount}} tokens := coins[0].Amount.BigInt() balanceTokenAfter := k.BalanceOf(ctx, erc20, contract, types.ModuleAddress) if balanceTokenAfter == nil { @@ -413,62 +188,64 @@ func (k Keeper) convertERC20NativeToken( return &types.MsgConvertERC20Response{}, nil } -// convertCoinNativeERC20 handles the coin conversion for a native ERC20 token +// ConvertCoinNativeERC20 handles the coin conversion for a native ERC20 token // pair: // - escrow Coins on module account // - unescrow Tokens that have been previously escrowed with ConvertERC20 and send to receiver // - burn escrowed Coins // - check if token balance increased by amount // - check for unexpected `Approval` event in logs -func (k Keeper) convertCoinNativeERC20( +func (k Keeper) ConvertCoinNativeERC20( ctx sdk.Context, pair types.TokenPair, - msg *types.MsgConvertCoin, + amount math.Int, receiver common.Address, sender sdk.AccAddress, -) (*types.MsgConvertCoinResponse, error) { - // NOTE: ignore validation from NewCoin constructor - coins := sdk.Coins{msg.Coin} +) error { + if !amount.IsPositive() { + return nil + } erc20 := contracts.ERC20MinterBurnerDecimalsContract.ABI contract := pair.GetERC20Contract() + balanceToken := k.BalanceOf(ctx, erc20, contract, receiver) if balanceToken == nil { - return nil, errorsmod.Wrap(types.ErrEVMCall, "failed to retrieve balance") + return errorsmod.Wrap(types.ErrEVMCall, "failed to retrieve balance") } // Escrow Coins on module account + coins := sdk.Coins{{Denom: pair.Denom, Amount: amount}} if err := k.bankKeeper.SendCoinsFromAccountToModule(ctx, sender, types.ModuleName, coins); err != nil { - return nil, errorsmod.Wrap(err, "failed to escrow coins") + return errorsmod.Wrap(err, "failed to escrow coins") } // Unescrow Tokens and send to receiver - res, err := k.evmKeeper.CallEVM(ctx, erc20, types.ModuleAddress, contract, true, "transfer", receiver, msg.Coin.Amount.BigInt()) + res, err := k.evmKeeper.CallEVM(ctx, erc20, types.ModuleAddress, contract, true, "transfer", receiver, amount.BigInt()) if err != nil { - return nil, err + return err } // Check unpackedRet execution var unpackedRet types.ERC20BoolResponse if err := erc20.UnpackIntoInterface(&unpackedRet, "transfer", res.Ret); err != nil { - return nil, err + return err } if !unpackedRet.Value { - return nil, errorsmod.Wrap(errortypes.ErrLogic, "failed to execute unescrow tokens from user") + return errorsmod.Wrap(errortypes.ErrLogic, "failed to execute unescrow tokens from user") } // Check expected Receiver balance after transfer execution - tokens := msg.Coin.Amount.BigInt() balanceTokenAfter := k.BalanceOf(ctx, erc20, contract, receiver) if balanceTokenAfter == nil { - return nil, errorsmod.Wrap(types.ErrEVMCall, "failed to retrieve balance") + return errorsmod.Wrap(types.ErrEVMCall, "failed to retrieve balance") } - exp := big.NewInt(0).Add(balanceToken, tokens) + exp := big.NewInt(0).Add(balanceToken, amount.BigInt()) if r := balanceTokenAfter.Cmp(exp); r != 0 { - return nil, errorsmod.Wrapf( + return errorsmod.Wrapf( types.ErrBalanceInvariance, "invalid token balance - expected: %v, actual: %v", exp, balanceTokenAfter, ) @@ -477,47 +254,11 @@ func (k Keeper) convertCoinNativeERC20( // Burn escrowed Coins err = k.bankKeeper.BurnCoins(ctx, types.ModuleName, coins) if err != nil { - return nil, errorsmod.Wrap(err, "failed to burn coins") + return errorsmod.Wrap(err, "failed to burn coins") } // Check for unexpected `Approval` event in logs - if err := k.monitorApprovalEvent(res); err != nil { - return nil, err - } - - defer func() { - telemetry.IncrCounterWithLabels( - []string{"tx", "msg", "convert", "coin", "total"}, - 1, - []metrics.Label{ - telemetry.NewLabel("denom", pair.Denom), - }, - ) - - if msg.Coin.Amount.IsInt64() { - telemetry.IncrCounterWithLabels( - []string{"tx", "msg", "convert", "coin", "amount", "total"}, - float32(msg.Coin.Amount.Int64()), - []metrics.Label{ - telemetry.NewLabel("denom", pair.Denom), - }, - ) - } - }() - - ctx.EventManager().EmitEvents( - sdk.Events{ - sdk.NewEvent( - types.EventTypeConvertCoin, - sdk.NewAttribute(sdk.AttributeKeySender, msg.Sender), - sdk.NewAttribute(types.AttributeKeyReceiver, msg.Receiver), - sdk.NewAttribute(sdk.AttributeKeyAmount, msg.Coin.Amount.String()), - sdk.NewAttribute(types.AttributeKeyCosmosCoin, msg.Coin.Denom), - sdk.NewAttribute(types.AttributeKeyERC20Token, pair.Erc20Address), - ), - }, - ) - return &types.MsgConvertCoinResponse{}, nil + return k.monitorApprovalEvent(res) } // UpdateParams implements the gRPC MsgServer interface. After a successful governance vote diff --git a/x/erc20/keeper/msg_server_test.go b/x/erc20/keeper/msg_server_test.go index bd483c4970..11061abbed 100644 --- a/x/erc20/keeper/msg_server_test.go +++ b/x/erc20/keeper/msg_server_test.go @@ -17,1045 +17,17 @@ import ( "github.com/stretchr/testify/mock" ) -func (suite *KeeperTestSuite) TestConvertCoinNativeCoin() { - testCases := []struct { //nolint:dupl - name string - mint int64 - burn int64 - malleate func(common.Address) - extra func() - expPass bool - selfdestructed bool - }{ - { - "ok - sufficient funds", - 100, - 10, - func(common.Address) {}, - func() {}, - true, - false, - }, - { - "ok - equal funds", - 10, - 10, - func(common.Address) {}, - func() {}, - true, - false, - }, - { - "ok - suicided contract", - 10, - 10, - func(erc20 common.Address) { - stateDB := suite.StateDB() - ok := stateDB.Suicide(erc20) - suite.Require().True(ok) - suite.Require().NoError(stateDB.Commit()) - }, - func() {}, - true, - true, - }, - { - "fail - insufficient funds", - 0, - 10, - func(common.Address) {}, - func() {}, - false, - false, - }, - { - "fail - minting disabled", - 100, - 10, - func(common.Address) { - params := types.DefaultParams() - params.EnableErc20 = false - suite.app.Erc20Keeper.SetParams(suite.ctx, params) //nolint:errcheck - }, - func() {}, - false, - false, - }, - { - "fail - deleted module account - force fail", 100, 10, func(common.Address) {}, - func() { - acc := suite.app.AccountKeeper.GetAccount(suite.ctx, types.ModuleAddress.Bytes()) - suite.app.AccountKeeper.RemoveAccount(suite.ctx, acc) - }, false, false, - }, - { //nolint:dupl - "fail - force evm fail", 100, 10, func(common.Address) {}, - func() { //nolint:dupl - mockEVMKeeper := &erc20mocks.EVMKeeper{} - suite.app.Erc20Keeper = keeper.NewKeeper( - suite.app.GetKey("erc20"), suite.app.AppCodec(), - authtypes.NewModuleAddress(govtypes.ModuleName), suite.app.AccountKeeper, - suite.app.BankKeeper, mockEVMKeeper, suite.app.StakingKeeper, - suite.app.AuthzKeeper, &suite.app.TransferKeeper, - ) - - existingAcc := &statedb.Account{Nonce: uint64(1), Balance: common.Big1} - balance := make([]uint8, 32) - mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil) - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Once() - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced ApplyMessage error")) - mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) - mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) - }, false, false, - }, - { - "fail - force evm balance error", 100, 10, func(common.Address) {}, - func() { //nolint:dupl - mockEVMKeeper := &erc20mocks.EVMKeeper{} - suite.app.Erc20Keeper = keeper.NewKeeper( - suite.app.GetKey("erc20"), suite.app.AppCodec(), - authtypes.NewModuleAddress(govtypes.ModuleName), suite.app.AccountKeeper, - suite.app.BankKeeper, mockEVMKeeper, suite.app.StakingKeeper, - suite.app.AuthzKeeper, &suite.app.TransferKeeper, - ) - - existingAcc := &statedb.Account{Nonce: uint64(1), Balance: common.Big1} - balance := make([]uint8, 32) - mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil) - // first balance of - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Once() - // convert coin - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{}, nil).Once() - // second balance of - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{}, fmt.Errorf("third")).Once() - // Extra call on test - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{}, nil) - mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) - mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) - }, false, false, - }, - { - "fail - force balance error", 100, 10, func(common.Address) {}, - func() { - mockEVMKeeper := &erc20mocks.EVMKeeper{} - suite.app.Erc20Keeper = keeper.NewKeeper( - suite.app.GetKey("erc20"), suite.app.AppCodec(), - authtypes.NewModuleAddress(govtypes.ModuleName), suite.app.AccountKeeper, - suite.app.BankKeeper, mockEVMKeeper, suite.app.StakingKeeper, - suite.app.AuthzKeeper, &suite.app.TransferKeeper, - ) - - existingAcc := &statedb.Account{Nonce: uint64(1), Balance: common.Big1} - balance := make([]uint8, 32) - mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil) - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Times(4) - mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) - mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) - }, false, false, - }, - } - for _, tc := range testCases { - suite.Run(fmt.Sprintf("Case %s", tc.name), func() { - suite.mintFeeCollector = true - suite.SetupTest() - pair := suite.setupRegisterCoin(metadataCoin) - suite.Require().NotNil(metadataCoin) - erc20 := pair.GetERC20Contract() - tc.malleate(erc20) - suite.Commit() - - ctx := sdk.WrapSDKContext(suite.ctx) - coins := sdk.NewCoins(sdk.NewCoin(cosmosTokenBase, math.NewInt(tc.mint))) - sender := sdk.AccAddress(suite.address.Bytes()) - msg := types.NewMsgConvertCoin( - sdk.NewCoin(cosmosTokenBase, math.NewInt(tc.burn)), - suite.address, - sender, - ) - - err := suite.app.BankKeeper.MintCoins(suite.ctx, types.ModuleName, coins) - suite.Require().NoError(err, tc.name) - err = suite.app.BankKeeper.SendCoinsFromModuleToAccount(suite.ctx, types.ModuleName, sender, coins) - suite.Require().NoError(err, tc.name) - - tc.extra() - res, err := suite.app.Erc20Keeper.ConvertCoin(ctx, msg) - expRes := &types.MsgConvertCoinResponse{} - suite.Commit() - balance := suite.BalanceOf(common.HexToAddress(pair.Erc20Address), suite.address) - cosmosBalance := suite.app.BankKeeper.GetBalance(suite.ctx, sender, metadataCoin.Base) - - if tc.expPass { - suite.Require().NoError(err, tc.name) - - acc := suite.app.EvmKeeper.GetAccountWithoutBalance(suite.ctx, erc20) - if tc.selfdestructed { - suite.Require().Nil(acc, "expected contract to be destroyed") - } else { - suite.Require().NotNil(acc) - } - - if tc.selfdestructed || !acc.IsContract() { - id := suite.app.Erc20Keeper.GetTokenPairID(suite.ctx, erc20.String()) - _, found := suite.app.Erc20Keeper.GetTokenPair(suite.ctx, id) - suite.Require().False(found) - } else { - suite.Require().Equal(expRes, res) - suite.Require().Equal(cosmosBalance.Amount.Int64(), math.NewInt(tc.mint-tc.burn).Int64()) - suite.Require().Equal(balance.(*big.Int).Int64(), big.NewInt(tc.burn).Int64()) - } - } else { - suite.Require().Error(err, tc.name) - } - }) - } - suite.mintFeeCollector = false -} - -func (suite *KeeperTestSuite) TestConvertERC20NativeCoin() { - testCases := []struct { - name string - mint int64 - burn int64 - reconvert int64 - malleate func() - expPass bool - }{ - {"ok - sufficient funds", 100, 10, 5, func() {}, true}, - {"ok - equal funds", 10, 10, 10, func() {}, true}, - {"fail - insufficient funds", 10, 1, 5, func() {}, false}, - {"fail ", 10, 1, -5, func() {}, false}, - { - "fail - deleted module account - force fail", 100, 10, 5, - func() { - acc := suite.app.AccountKeeper.GetAccount(suite.ctx, types.ModuleAddress.Bytes()) - suite.app.AccountKeeper.RemoveAccount(suite.ctx, acc) - }, - false, - }, - { //nolint:dupl - "fail - force evm fail", 100, 10, 5, - func() { //nolint:dupl - mockEVMKeeper := &erc20mocks.EVMKeeper{} - suite.app.Erc20Keeper = keeper.NewKeeper( - suite.app.GetKey("erc20"), suite.app.AppCodec(), - authtypes.NewModuleAddress(govtypes.ModuleName), suite.app.AccountKeeper, - suite.app.BankKeeper, mockEVMKeeper, suite.app.StakingKeeper, - suite.app.AuthzKeeper, &suite.app.TransferKeeper, - ) - - existingAcc := &statedb.Account{Nonce: uint64(1), Balance: common.Big1} - balance := make([]uint8, 32) - mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil) - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Once() - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced ApplyMessage error")) - mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) - mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) - }, - false, - }, - { - "fail - force fail second balance", 100, 10, 5, - func() { //nolint:dupl - mockEVMKeeper := &erc20mocks.EVMKeeper{} - suite.app.Erc20Keeper = keeper.NewKeeper( - suite.app.GetKey("erc20"), suite.app.AppCodec(), - authtypes.NewModuleAddress(govtypes.ModuleName), suite.app.AccountKeeper, - suite.app.BankKeeper, mockEVMKeeper, suite.app.StakingKeeper, - suite.app.AuthzKeeper, &suite.app.TransferKeeper, - ) - - existingAcc := &statedb.Account{Nonce: uint64(1), Balance: common.Big1} - balance := make([]uint8, 32) - mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil) - // first balance of - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Once() - // convert coin - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{}, nil).Once() - // second balance of - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{}, fmt.Errorf("third")).Once() - // Extra call on test - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{}, nil) - mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) - mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) - }, - false, - }, - { - "fail - force fail second balance", 100, 10, 5, - func() { - mockEVMKeeper := &erc20mocks.EVMKeeper{} - suite.app.Erc20Keeper = keeper.NewKeeper( - suite.app.GetKey("erc20"), suite.app.AppCodec(), - authtypes.NewModuleAddress(govtypes.ModuleName), suite.app.AccountKeeper, - suite.app.BankKeeper, mockEVMKeeper, suite.app.StakingKeeper, - suite.app.AuthzKeeper, &suite.app.TransferKeeper, - ) - - existingAcc := &statedb.Account{Nonce: uint64(1), Balance: common.Big1} - balance := make([]uint8, 32) - mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil) - // first balance of - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Once() - // convert coin - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{}, nil).Once() - // second balance of - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Once() - // Extra call on test - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{}, nil) - mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) - mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) - }, - false, - }, - { - "fail - force fail unescrow", 100, 10, 5, - func() { - mockBankKeeper := &erc20mocks.BankKeeper{} - suite.app.Erc20Keeper = keeper.NewKeeper( - suite.app.GetKey("erc20"), suite.app.AppCodec(), - authtypes.NewModuleAddress(govtypes.ModuleName), suite.app.AccountKeeper, - mockBankKeeper, suite.app.EvmKeeper, suite.app.StakingKeeper, - suite.app.AuthzKeeper, &suite.app.TransferKeeper, - ) - - mockBankKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(nil) - mockBankKeeper.On("SendCoinsFromModuleToAccount", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("failed to unescrow")) - mockBankKeeper.On("BlockedAddr", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(false) - mockBankKeeper.On("GetBalance", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(sdk.Coin{Denom: "coin", Amount: math.OneInt()}) - }, - false, - }, - { - "fail - force fail balance after transfer", 100, 10, 5, - func() { - mockBankKeeper := &erc20mocks.BankKeeper{} - suite.app.Erc20Keeper = keeper.NewKeeper( - suite.app.GetKey("erc20"), suite.app.AppCodec(), - authtypes.NewModuleAddress(govtypes.ModuleName), suite.app.AccountKeeper, - mockBankKeeper, suite.app.EvmKeeper, suite.app.StakingKeeper, - suite.app.AuthzKeeper, &suite.app.TransferKeeper, - ) - - mockBankKeeper.On("SendCoinsFromModuleToAccount", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - mockBankKeeper.On("BlockedAddr", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(false) - mockBankKeeper.On("GetBalance", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(sdk.Coin{Denom: "acoin", Amount: math.OneInt()}) - }, - false, - }, - } - for _, tc := range testCases { //nolint:dupl - suite.Run(fmt.Sprintf("Case %s", tc.name), func() { - suite.mintFeeCollector = true - suite.SetupTest() - pair := suite.setupRegisterCoin(metadataCoin) - suite.Require().NotNil(metadataCoin) - suite.Require().NotNil(pair) - - // Precondition: Convert Coin to ERC20 - coins := sdk.NewCoins(sdk.NewCoin(cosmosTokenBase, math.NewInt(tc.mint))) - sender := sdk.AccAddress(suite.address.Bytes()) - err := suite.app.BankKeeper.MintCoins(suite.ctx, types.ModuleName, coins) - suite.Require().NoError(err, tc.name) - err = suite.app.BankKeeper.SendCoinsFromModuleToAccount(suite.ctx, types.ModuleName, sender, coins) - suite.Require().NoError(err, tc.name) - msg := types.NewMsgConvertCoin( - sdk.NewCoin(cosmosTokenBase, math.NewInt(tc.burn)), - suite.address, - sender, - ) - - ctx := sdk.WrapSDKContext(suite.ctx) - _, err = suite.app.Erc20Keeper.ConvertCoin(ctx, msg) - suite.Require().NoError(err, tc.name) - suite.Commit() - balance := suite.BalanceOf(common.HexToAddress(pair.Erc20Address), suite.address) - cosmosBalance := suite.app.BankKeeper.GetBalance(suite.ctx, sender, metadataCoin.Base) - suite.Require().Equal(cosmosBalance.Amount.Int64(), math.NewInt(tc.mint-tc.burn).Int64()) - suite.Require().Equal(balance, big.NewInt(tc.burn)) - - // Convert ERC20s back to Coins - ctx = sdk.WrapSDKContext(suite.ctx) - contractAddr := common.HexToAddress(pair.Erc20Address) - msgConvertERC20 := types.NewMsgConvertERC20( - math.NewInt(tc.reconvert), - sender, - contractAddr, - suite.address, - ) - - tc.malleate() - res, err := suite.app.Erc20Keeper.ConvertERC20(ctx, msgConvertERC20) - expRes := &types.MsgConvertERC20Response{} - suite.Commit() - balance = suite.BalanceOf(contractAddr, suite.address) - cosmosBalance = suite.app.BankKeeper.GetBalance(suite.ctx, sender, pair.Denom) - if tc.expPass { - suite.Require().NoError(err, tc.name) - suite.Require().Equal(expRes, res) - suite.Require().Equal(cosmosBalance.Amount.Int64(), math.NewInt(tc.mint-tc.burn+tc.reconvert).Int64()) - suite.Require().Equal(balance.(*big.Int).Int64(), big.NewInt(tc.burn-tc.reconvert).Int64()) - } else { - suite.Require().Error(err, tc.name) - } - }) - } - suite.mintFeeCollector = false -} - -func (suite *KeeperTestSuite) TestConvertERC20NativeERC20() { - var contractAddr common.Address - var coinName string - - testCases := []struct { - name string - mint int64 - transfer int64 - malleate func(common.Address) - extra func() - contractType int - expPass bool - selfdestructed bool - }{ - { - "ok - sufficient funds", - 100, - 10, - func(common.Address) {}, - func() {}, - contractMinterBurner, - true, - false, - }, - { - "ok - equal funds", - 10, - 10, - func(common.Address) {}, - func() {}, - contractMinterBurner, - true, - false, - }, - { - "ok - equal funds", - 10, - 10, - func(common.Address) {}, - func() {}, - contractMinterBurner, - true, - false, - }, - { - "ok - suicided contract", - 10, - 10, - func(erc20 common.Address) { - stateDB := suite.StateDB() - ok := stateDB.Suicide(erc20) - suite.Require().True(ok) - suite.Require().NoError(stateDB.Commit()) - }, - func() {}, - contractMinterBurner, - true, - true, - }, - { - "fail - insufficient funds - callEVM", - 0, - 10, - func(common.Address) {}, - func() {}, - contractMinterBurner, - false, - false, - }, - { - "fail - minting disabled", - 100, - 10, - func(common.Address) { - params := types.DefaultParams() - params.EnableErc20 = false - suite.app.Erc20Keeper.SetParams(suite.ctx, params) //nolint:errcheck - }, - func() {}, - contractMinterBurner, - false, - false, - }, - { - "fail - direct balance manipulation contract", - 100, - 10, - func(common.Address) {}, - func() {}, - contractDirectBalanceManipulation, - false, - false, - }, - { - "fail - delayed malicious contract", - 10, - 10, - func(common.Address) {}, - func() {}, - contractMaliciousDelayed, - false, - false, - }, - { - "fail - negative transfer contract", - 10, - -10, - func(common.Address) {}, - func() {}, - contractMinterBurner, - false, - false, - }, - { - "fail - no module address", - 100, - 10, - func(common.Address) { - }, - func() { - acc := suite.app.AccountKeeper.GetAccount(suite.ctx, types.ModuleAddress.Bytes()) - suite.app.AccountKeeper.RemoveAccount(suite.ctx, acc) - }, - contractMinterBurner, - false, - false, - }, - { - "fail - force evm fail", - 100, - 10, - func(common.Address) {}, - func() { //nolint:dupl - mockEVMKeeper := &erc20mocks.EVMKeeper{} - suite.app.Erc20Keeper = keeper.NewKeeper( - suite.app.GetKey("erc20"), suite.app.AppCodec(), - authtypes.NewModuleAddress(govtypes.ModuleName), suite.app.AccountKeeper, - suite.app.BankKeeper, mockEVMKeeper, suite.app.StakingKeeper, - suite.app.AuthzKeeper, &suite.app.TransferKeeper, - ) - - existingAcc := &statedb.Account{Nonce: uint64(1), Balance: common.Big1} - balance := make([]uint8, 32) - mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil) - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Once() - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced ApplyMessage error")) - mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) - mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) - }, - contractMinterBurner, - false, - false, - }, - { - "fail - force get balance fail", - 100, - 10, - func(common.Address) {}, - func() { - mockEVMKeeper := &erc20mocks.EVMKeeper{} - suite.app.Erc20Keeper = keeper.NewKeeper( - suite.app.GetKey("erc20"), suite.app.AppCodec(), - authtypes.NewModuleAddress(govtypes.ModuleName), suite.app.AccountKeeper, - suite.app.BankKeeper, mockEVMKeeper, suite.app.StakingKeeper, - suite.app.AuthzKeeper, &suite.app.TransferKeeper, - ) - - existingAcc := &statedb.Account{Nonce: uint64(1), Balance: common.Big1} - balance := make([]uint8, 32) - balance[31] = uint8(1) - mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil) - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Twice() - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced balance error")) - mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) - mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) - }, - contractMinterBurner, - false, - false, - }, - { - "fail - force transfer unpack fail", - 100, - 10, - func(common.Address) {}, - func() { - mockEVMKeeper := &erc20mocks.EVMKeeper{} - suite.app.Erc20Keeper = keeper.NewKeeper( - suite.app.GetKey("erc20"), suite.app.AppCodec(), - authtypes.NewModuleAddress(govtypes.ModuleName), suite.app.AccountKeeper, - suite.app.BankKeeper, mockEVMKeeper, suite.app.StakingKeeper, - suite.app.AuthzKeeper, &suite.app.TransferKeeper, - ) - - existingAcc := &statedb.Account{Nonce: uint64(1), Balance: common.Big1} - balance := make([]uint8, 32) - mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil) - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Once() - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{}, nil) - mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) - mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) - }, - contractMinterBurner, - false, - false, - }, - - { - "fail - force invalid transfer fail", - 100, - 10, - func(common.Address) {}, - func() { - mockEVMKeeper := &erc20mocks.EVMKeeper{} - suite.app.Erc20Keeper = keeper.NewKeeper( - suite.app.GetKey("erc20"), suite.app.AppCodec(), - authtypes.NewModuleAddress(govtypes.ModuleName), suite.app.AccountKeeper, - suite.app.BankKeeper, mockEVMKeeper, suite.app.StakingKeeper, - suite.app.AuthzKeeper, &suite.app.TransferKeeper, - ) - - existingAcc := &statedb.Account{Nonce: uint64(1), Balance: common.Big1} - balance := make([]uint8, 32) - mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil) - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Once() - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil) - mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) - mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) - }, - contractMinterBurner, - false, - false, - }, - { - "fail - force mint fail", - 100, - 10, - func(common.Address) {}, - func() { - mockBankKeeper := &erc20mocks.BankKeeper{} - - suite.app.Erc20Keeper = keeper.NewKeeper( - suite.app.GetKey("erc20"), suite.app.AppCodec(), - authtypes.NewModuleAddress(govtypes.ModuleName), suite.app.AccountKeeper, - mockBankKeeper, suite.app.EvmKeeper, suite.app.StakingKeeper, - suite.app.AuthzKeeper, &suite.app.TransferKeeper, - ) - - mockBankKeeper.On("MintCoins", mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("failed to mint")) - mockBankKeeper.On("SendCoinsFromModuleToAccount", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("failed to unescrow")) - mockBankKeeper.On("BlockedAddr", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(false) - mockBankKeeper.On("GetBalance", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(sdk.Coin{Denom: "coin", Amount: math.OneInt()}) - }, - contractMinterBurner, - false, - false, - }, - { - "fail - force send minted fail", - 100, - 10, - func(common.Address) {}, - func() { - mockBankKeeper := &erc20mocks.BankKeeper{} - suite.app.Erc20Keeper = keeper.NewKeeper( - suite.app.GetKey("erc20"), suite.app.AppCodec(), - authtypes.NewModuleAddress(govtypes.ModuleName), suite.app.AccountKeeper, - mockBankKeeper, suite.app.EvmKeeper, suite.app.StakingKeeper, - suite.app.AuthzKeeper, &suite.app.TransferKeeper, - ) - - mockBankKeeper.On("MintCoins", mock.Anything, mock.Anything, mock.Anything).Return(nil) - mockBankKeeper.On("SendCoinsFromModuleToAccount", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("failed to unescrow")) - mockBankKeeper.On("BlockedAddr", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(false) - mockBankKeeper.On("GetBalance", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(sdk.Coin{Denom: "coin", Amount: math.OneInt()}) - }, - contractMinterBurner, - false, - false, - }, - { - "fail - force bank balance fail", - 100, - 10, - func(common.Address) {}, - func() { - mockBankKeeper := &erc20mocks.BankKeeper{} - - suite.app.Erc20Keeper = keeper.NewKeeper( - suite.app.GetKey("erc20"), suite.app.AppCodec(), - authtypes.NewModuleAddress(govtypes.ModuleName), suite.app.AccountKeeper, - mockBankKeeper, suite.app.EvmKeeper, suite.app.StakingKeeper, - suite.app.AuthzKeeper, &suite.app.TransferKeeper, - ) - - mockBankKeeper.On("MintCoins", mock.Anything, mock.Anything, mock.Anything).Return(nil) - mockBankKeeper.On("SendCoinsFromModuleToAccount", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - mockBankKeeper.On("BlockedAddr", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(false) - mockBankKeeper.On("GetBalance", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(sdk.Coin{Denom: coinName, Amount: math.NewInt(int64(10))}) - }, - contractMinterBurner, - false, - false, - }, - } - for _, tc := range testCases { - suite.Run(fmt.Sprintf("Case %s", tc.name), func() { - suite.mintFeeCollector = true - suite.SetupTest() - - contractAddr = suite.setupRegisterERC20Pair(tc.contractType) - - tc.malleate(contractAddr) - suite.Require().NotNil(contractAddr) - suite.Commit() - - coinName = types.CreateDenom(contractAddr.String()) - sender := sdk.AccAddress(suite.address.Bytes()) - msg := types.NewMsgConvertERC20( - math.NewInt(tc.transfer), - sender, - contractAddr, - suite.address, - ) - - suite.MintERC20Token(contractAddr, suite.address, suite.address, big.NewInt(tc.mint)) - suite.Commit() - ctx := sdk.WrapSDKContext(suite.ctx) - - tc.extra() - res, err := suite.app.Erc20Keeper.ConvertERC20(ctx, msg) - - expRes := &types.MsgConvertERC20Response{} - suite.Commit() - balance := suite.BalanceOf(contractAddr, suite.address) - cosmosBalance := suite.app.BankKeeper.GetBalance(suite.ctx, sender, coinName) - if tc.expPass { - suite.Require().NoError(err, tc.name) - - acc := suite.app.EvmKeeper.GetAccountWithoutBalance(suite.ctx, contractAddr) - if tc.selfdestructed { - suite.Require().Nil(acc, "expected contract to be destroyed") - } else { - suite.Require().NotNil(acc) - } - - if tc.selfdestructed || !acc.IsContract() { - id := suite.app.Erc20Keeper.GetTokenPairID(suite.ctx, contractAddr.String()) - _, found := suite.app.Erc20Keeper.GetTokenPair(suite.ctx, id) - suite.Require().False(found) - } else { - suite.Require().Equal(expRes, res) - suite.Require().Equal(cosmosBalance.Amount, math.NewInt(tc.transfer)) - suite.Require().Equal(balance.(*big.Int).Int64(), big.NewInt(tc.mint-tc.transfer).Int64()) - } - } else { - suite.Require().Error(err, tc.name) - } - }) - } - suite.mintFeeCollector = false -} - -func (suite *KeeperTestSuite) TestConvertCoinNativeERC20() { - var contractAddr common.Address - - testCases := []struct { - name string - mint int64 - convert int64 - malleate func(common.Address) - extra func() - contractType int - expPass bool - }{ - { - "ok - sufficient funds", - 100, - 10, - func(common.Address) {}, - func() {}, - contractMinterBurner, - true, - }, - { - "ok - equal funds", - 100, - 100, - func(common.Address) {}, - func() {}, - contractMinterBurner, - true, - }, - { - "fail - insufficient funds", - 100, - 200, - func(common.Address) {}, - func() {}, - contractMinterBurner, - false, - }, - { - "fail - direct balance manipulation contract", - 100, - 10, - func(common.Address) {}, - func() {}, - contractDirectBalanceManipulation, - false, - }, - { - "fail - malicious delayed contract", - 100, - 10, - func(common.Address) {}, - func() {}, - contractMaliciousDelayed, - false, - }, - { - "fail - deleted module address - force fail", - 100, - 10, - func(common.Address) {}, - func() { - acc := suite.app.AccountKeeper.GetAccount(suite.ctx, types.ModuleAddress.Bytes()) - suite.app.AccountKeeper.RemoveAccount(suite.ctx, acc) - }, - contractMinterBurner, - false, - }, - { //nolint:dupl - "fail - force evm fail", - 100, - 10, - func(common.Address) {}, - func() { //nolint:dupl - mockEVMKeeper := &erc20mocks.EVMKeeper{} - suite.app.Erc20Keeper = keeper.NewKeeper( - suite.app.GetKey("erc20"), suite.app.AppCodec(), - authtypes.NewModuleAddress(govtypes.ModuleName), suite.app.AccountKeeper, - suite.app.BankKeeper, mockEVMKeeper, suite.app.StakingKeeper, - suite.app.AuthzKeeper, &suite.app.TransferKeeper, - ) - - existingAcc := &statedb.Account{Nonce: uint64(1), Balance: common.Big1} - balance := make([]uint8, 32) - mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil) - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Once() - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced ApplyMessage error")) - mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) - mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) - }, - contractMinterBurner, - false, - }, - { - "fail - force invalid transfer", - 100, - 10, - func(common.Address) {}, - func() { - mockEVMKeeper := &erc20mocks.EVMKeeper{} - suite.app.Erc20Keeper = keeper.NewKeeper( - suite.app.GetKey("erc20"), suite.app.AppCodec(), - authtypes.NewModuleAddress(govtypes.ModuleName), suite.app.AccountKeeper, - suite.app.BankKeeper, mockEVMKeeper, suite.app.StakingKeeper, - suite.app.AuthzKeeper, &suite.app.TransferKeeper, - ) - - existingAcc := &statedb.Account{Nonce: uint64(1), Balance: common.Big1} - balance := make([]uint8, 32) - mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil) - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Once() - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{}, nil) - mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) - mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) - }, - contractMinterBurner, - false, - }, - { - "fail - force fail second balance", - 100, - 10, - func(common.Address) {}, - func() { - mockEVMKeeper := &erc20mocks.EVMKeeper{} - suite.app.Erc20Keeper = keeper.NewKeeper( - suite.app.GetKey("erc20"), suite.app.AppCodec(), - authtypes.NewModuleAddress(govtypes.ModuleName), suite.app.AccountKeeper, - suite.app.BankKeeper, mockEVMKeeper, suite.app.StakingKeeper, - suite.app.AuthzKeeper, &suite.app.TransferKeeper, - ) - - existingAcc := &statedb.Account{Nonce: uint64(1), Balance: common.Big1} - balance := make([]uint8, 32) - balance[31] = uint8(1) - mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil) - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Twice() - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("fail second balance")) - mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) - mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) - }, - contractMinterBurner, - false, - }, - { - "fail - force fail transfer", - 100, - 10, - func(common.Address) {}, - func() { - mockEVMKeeper := &erc20mocks.EVMKeeper{} - suite.app.Erc20Keeper = keeper.NewKeeper( - suite.app.GetKey("erc20"), suite.app.AppCodec(), - authtypes.NewModuleAddress(govtypes.ModuleName), suite.app.AccountKeeper, - suite.app.BankKeeper, mockEVMKeeper, suite.app.StakingKeeper, - suite.app.AuthzKeeper, &suite.app.TransferKeeper, - ) - - existingAcc := &statedb.Account{Nonce: uint64(1), Balance: common.Big1} - balance := make([]uint8, 32) - mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil) - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil) - mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) - mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) - }, - contractMinterBurner, - false, - }, - } - for _, tc := range testCases { - suite.Run(fmt.Sprintf("Case %s", tc.name), func() { - suite.mintFeeCollector = true - suite.SetupTest() - contractAddr = suite.setupRegisterERC20Pair(tc.contractType) - suite.Require().NotNil(contractAddr) - - id := suite.app.Erc20Keeper.GetTokenPairID(suite.ctx, contractAddr.String()) - pair, _ := suite.app.Erc20Keeper.GetTokenPair(suite.ctx, id) - coins := sdk.NewCoins(sdk.NewCoin(pair.Denom, math.NewInt(tc.mint))) - coinName := types.CreateDenom(contractAddr.String()) - sender := sdk.AccAddress(suite.address.Bytes()) - - // Precondition: Mint Coins to convert on sender account - err := suite.app.BankKeeper.MintCoins(suite.ctx, types.ModuleName, coins) - suite.Require().NoError(err) - err = suite.app.BankKeeper.SendCoinsFromModuleToAccount(suite.ctx, types.ModuleName, sender, coins) - suite.Require().NoError(err) - cosmosBalance := suite.app.BankKeeper.GetBalance(suite.ctx, sender, coinName) - suite.Require().Equal(math.NewInt(tc.mint), cosmosBalance.Amount) - - // Precondition: Mint escrow tokens on module account - suite.GrantERC20Token(contractAddr, suite.address, types.ModuleAddress, "MINTER_ROLE") - suite.MintERC20Token(contractAddr, types.ModuleAddress, types.ModuleAddress, big.NewInt(tc.mint)) - tokenBalance := suite.BalanceOf(contractAddr, types.ModuleAddress) - suite.Require().Equal(big.NewInt(tc.mint), tokenBalance) - - tc.malleate(contractAddr) - suite.Commit() - - // Convert Coins back to ERC20s - receiver := suite.address - ctx := sdk.WrapSDKContext(suite.ctx) - msg := types.NewMsgConvertCoin( - sdk.NewCoin(coinName, math.NewInt(tc.convert)), - receiver, - sender, - ) - - tc.extra() - res, err := suite.app.Erc20Keeper.ConvertCoin(ctx, msg) - - expRes := &types.MsgConvertCoinResponse{} - suite.Commit() - tokenBalance = suite.BalanceOf(contractAddr, suite.address) - cosmosBalance = suite.app.BankKeeper.GetBalance(suite.ctx, sender, coinName) - if tc.expPass { - suite.Require().NoError(err, tc.name) - suite.Require().Equal(expRes, res) - suite.Require().Equal(math.NewInt(tc.mint-tc.convert), cosmosBalance.Amount) - suite.Require().Equal(big.NewInt(tc.convert), tokenBalance.(*big.Int)) - } else { - suite.Require().Error(err, tc.name) - } - }) - } - suite.mintFeeCollector = false -} +func (suite *KeeperTestSuite) TestConvertERC20NativeERC20() { + var contractAddr common.Address + var coinName string -func (suite *KeeperTestSuite) TestWrongPairOwnerERC20NativeCoin() { testCases := []struct { - name string - mint int64 - burn int64 - reconvert int64 - expPass bool - }{ - {"ok - sufficient funds", 100, 10, 5, true}, - } - for _, tc := range testCases { - suite.Run(fmt.Sprintf("Case %s", tc.name), func() { - suite.mintFeeCollector = true - suite.SetupTest() - pair := suite.setupRegisterCoin(metadataCoin) - suite.Require().NotNil(metadataCoin) - suite.Require().NotNil(pair) - - // Precondition: Convert Coin to ERC20 - coins := sdk.NewCoins(sdk.NewCoin(cosmosTokenBase, math.NewInt(tc.mint))) - sender := sdk.AccAddress(suite.address.Bytes()) - err := suite.app.BankKeeper.MintCoins(suite.ctx, types.ModuleName, coins) - suite.Require().NoError(err) - err = suite.app.BankKeeper.SendCoinsFromModuleToAccount(suite.ctx, types.ModuleName, sender, coins) - suite.Require().NoError(err) - msg := types.NewMsgConvertCoin( - sdk.NewCoin(cosmosTokenBase, math.NewInt(tc.burn)), - suite.address, - sender, - ) - - pair.ContractOwner = types.OWNER_UNSPECIFIED - suite.app.Erc20Keeper.SetTokenPair(suite.ctx, *pair) - - ctx := sdk.WrapSDKContext(suite.ctx) - _, err = suite.app.Erc20Keeper.ConvertCoin(ctx, msg) - suite.Require().Error(err, tc.name) - - // Convert ERC20s back to Coins - ctx = sdk.WrapSDKContext(suite.ctx) - contractAddr := common.HexToAddress(pair.Erc20Address) - msgConvertERC20 := types.NewMsgConvertERC20( - math.NewInt(tc.reconvert), - sender, - contractAddr, - suite.address, - ) - - _, err = suite.app.Erc20Keeper.ConvertERC20(ctx, msgConvertERC20) - suite.Require().Error(err, tc.name) - }) - } -} - -func (suite *KeeperTestSuite) TestConvertCoinNativeIBCVoucher() { - testCases := []struct { //nolint:dupl name string mint int64 - burn int64 + transfer int64 malleate func(common.Address) extra func() + contractType int expPass bool selfdestructed bool }{ @@ -1065,6 +37,17 @@ func (suite *KeeperTestSuite) TestConvertCoinNativeIBCVoucher() { 10, func(common.Address) {}, func() {}, + contractMinterBurner, + true, + false, + }, + { + "ok - equal funds", + 10, + 10, + func(common.Address) {}, + func() {}, + contractMinterBurner, true, false, }, @@ -1074,6 +57,7 @@ func (suite *KeeperTestSuite) TestConvertCoinNativeIBCVoucher() { 10, func(common.Address) {}, func() {}, + contractMinterBurner, true, false, }, @@ -1088,15 +72,17 @@ func (suite *KeeperTestSuite) TestConvertCoinNativeIBCVoucher() { suite.Require().NoError(stateDB.Commit()) }, func() {}, + contractMinterBurner, true, true, }, { - "fail - insufficient funds", + "fail - insufficient funds - callEVM", 0, 10, func(common.Address) {}, func() {}, + contractMinterBurner, false, false, }, @@ -1110,39 +96,60 @@ func (suite *KeeperTestSuite) TestConvertCoinNativeIBCVoucher() { suite.app.Erc20Keeper.SetParams(suite.ctx, params) //nolint:errcheck }, func() {}, + contractMinterBurner, + false, + false, + }, + { + "fail - direct balance manipulation contract", + 100, + 10, + func(common.Address) {}, + func() {}, + contractDirectBalanceManipulation, + false, + false, + }, + { + "fail - delayed malicious contract", + 10, + 10, + func(common.Address) {}, + func() {}, + contractMaliciousDelayed, + false, + false, + }, + { + "fail - negative transfer contract", + 10, + -10, + func(common.Address) {}, + func() {}, + contractMinterBurner, false, false, }, { - "fail - deleted module account - force fail", 100, 10, func(common.Address) {}, + "fail - no module address", + 100, + 10, + func(common.Address) { + }, func() { acc := suite.app.AccountKeeper.GetAccount(suite.ctx, types.ModuleAddress.Bytes()) suite.app.AccountKeeper.RemoveAccount(suite.ctx, acc) - }, false, false, - }, - { //nolint:dupl - "fail - force evm fail", 100, 10, func(common.Address) {}, - func() { //nolint:dupl - mockEVMKeeper := &erc20mocks.EVMKeeper{} - suite.app.Erc20Keeper = keeper.NewKeeper( - suite.app.GetKey("erc20"), suite.app.AppCodec(), - authtypes.NewModuleAddress(govtypes.ModuleName), suite.app.AccountKeeper, - suite.app.BankKeeper, mockEVMKeeper, suite.app.StakingKeeper, - suite.app.AuthzKeeper, &suite.app.TransferKeeper, - ) - - existingAcc := &statedb.Account{Nonce: uint64(1), Balance: common.Big1} - balance := make([]uint8, 32) - mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil) - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Once() - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced ApplyMessage error")) - mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) - mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) - }, false, false, + }, + contractMinterBurner, + false, + false, }, { - "fail - force evm balance error", 100, 10, func(common.Address) {}, - func() { //nolint:dupl + "fail - force evm fail", + 100, + 10, + func(common.Address) {}, + func() { mockEVMKeeper := &erc20mocks.EVMKeeper{} suite.app.Erc20Keeper = keeper.NewKeeper( suite.app.GetKey("erc20"), suite.app.AppCodec(), @@ -1154,20 +161,21 @@ func (suite *KeeperTestSuite) TestConvertCoinNativeIBCVoucher() { existingAcc := &statedb.Account{Nonce: uint64(1), Balance: common.Big1} balance := make([]uint8, 32) mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil) - // first balance of - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Once() - // convert coin - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{}, nil).Once() - // second balance of - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{}, fmt.Errorf("third")).Once() - // Extra call on test - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{}, nil) + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Once() + mockEVMKeeper.On("CallEVMWithData", mock.Anything, mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(nil, fmt.Errorf("forced ApplyMessage error")) mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) - mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) - }, false, false, + }, + contractMinterBurner, + false, + false, }, { - "fail - force balance error", 100, 10, func(common.Address) {}, + "fail - force get balance fail", + 100, + 10, + func(common.Address) {}, func() { mockEVMKeeper := &erc20mocks.EVMKeeper{} suite.app.Erc20Keeper = keeper.NewKeeper( @@ -1179,93 +187,22 @@ func (suite *KeeperTestSuite) TestConvertCoinNativeIBCVoucher() { existingAcc := &statedb.Account{Nonce: uint64(1), Balance: common.Big1} balance := make([]uint8, 32) + balance[31] = uint8(1) mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil) - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Times(4) + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Twice() + mockEVMKeeper.On("CallEVMWithData", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced balance error")) mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) - mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) - }, false, false, - }, - } - for _, tc := range testCases { - suite.Run(fmt.Sprintf("Case %s", tc.name), func() { - suite.mintFeeCollector = true - suite.SetupTest() - pair := suite.setupRegisterCoin(metadataIbc) - suite.Require().NotNil(metadataIbc) - erc20 := pair.GetERC20Contract() - tc.malleate(erc20) - suite.Commit() - - ctx := sdk.WrapSDKContext(suite.ctx) - coins := sdk.NewCoins(sdk.NewCoin(ibcBase, math.NewInt(tc.mint))) - sender := sdk.AccAddress(suite.address.Bytes()) - msg := types.NewMsgConvertCoin( - sdk.NewCoin(ibcBase, math.NewInt(tc.burn)), - suite.address, - sender, - ) - - suite.app.BankKeeper.MintCoins(suite.ctx, types.ModuleName, coins) //nolint:errcheck - suite.app.BankKeeper.SendCoinsFromModuleToAccount(suite.ctx, types.ModuleName, sender, coins) - - tc.extra() - res, err := suite.app.Erc20Keeper.ConvertCoin(ctx, msg) - expRes := &types.MsgConvertCoinResponse{} - suite.Commit() - balance := suite.BalanceOf(common.HexToAddress(pair.Erc20Address), suite.address) - cosmosBalance := suite.app.BankKeeper.GetBalance(suite.ctx, sender, metadataIbc.Base) - - if tc.expPass { - suite.Require().NoError(err, tc.name) - - acc := suite.app.EvmKeeper.GetAccountWithoutBalance(suite.ctx, erc20) - if tc.selfdestructed { - suite.Require().Nil(acc, "expected contract to be destroyed") - } else { - suite.Require().NotNil(acc) - } - - if tc.selfdestructed || !acc.IsContract() { - id := suite.app.Erc20Keeper.GetTokenPairID(suite.ctx, erc20.String()) - _, found := suite.app.Erc20Keeper.GetTokenPair(suite.ctx, id) - suite.Require().False(found) - } else { - suite.Require().Equal(expRes, res) - suite.Require().Equal(cosmosBalance.Amount.Int64(), math.NewInt(tc.mint-tc.burn).Int64()) - suite.Require().Equal(balance.(*big.Int).Int64(), big.NewInt(tc.burn).Int64()) - } - } else { - suite.Require().Error(err, tc.name) - } - }) - } - suite.mintFeeCollector = false -} - -func (suite *KeeperTestSuite) TestConvertERC20NativeIBCVoucher() { - testCases := []struct { - name string - mint int64 - burn int64 - reconvert int64 - malleate func() - expPass bool - }{ - {"ok - sufficient funds", 100, 10, 5, func() {}, true}, - {"ok - equal funds", 10, 10, 10, func() {}, true}, - {"fail - insufficient funds", 10, 1, 5, func() {}, false}, - {"fail ", 10, 1, -5, func() {}, false}, - { - "fail - deleted module account - force fail", 100, 10, 5, - func() { - acc := suite.app.AccountKeeper.GetAccount(suite.ctx, types.ModuleAddress.Bytes()) - suite.app.AccountKeeper.RemoveAccount(suite.ctx, acc) }, + contractMinterBurner, + false, false, }, - { //nolint:dupl - "fail - force evm fail", 100, 10, 5, - func() { //nolint:dupl + { + "fail - force transfer unpack fail", + 100, + 10, + func(common.Address) {}, + func() { mockEVMKeeper := &erc20mocks.EVMKeeper{} suite.app.Erc20Keeper = keeper.NewKeeper( suite.app.GetKey("erc20"), suite.app.AppCodec(), @@ -1277,16 +214,22 @@ func (suite *KeeperTestSuite) TestConvertERC20NativeIBCVoucher() { existingAcc := &statedb.Account{Nonce: uint64(1), Balance: common.Big1} balance := make([]uint8, 32) mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil) - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Once() - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced ApplyMessage error")) + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Once() + mockEVMKeeper.On("CallEVMWithData", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{}, nil) mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) - mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) }, + contractMinterBurner, + false, false, }, + { - "fail - force fail second balance", 100, 10, 5, - func() { //nolint:dupl + "fail - force invalid transfer fail", + 100, + 10, + func(common.Address) {}, + func() { mockEVMKeeper := &erc20mocks.EVMKeeper{} suite.app.Erc20Keeper = keeper.NewKeeper( suite.app.GetKey("erc20"), suite.app.AppCodec(), @@ -1298,51 +241,47 @@ func (suite *KeeperTestSuite) TestConvertERC20NativeIBCVoucher() { existingAcc := &statedb.Account{Nonce: uint64(1), Balance: common.Big1} balance := make([]uint8, 32) mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil) - // first balance of - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Once() - // convert coin - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{}, nil).Once() - // second balance of - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{}, fmt.Errorf("third")).Once() - // Extra call on test - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{}, nil) + mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Once() + mockEVMKeeper.On("CallEVMWithData", mock.Anything, mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil) mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) - mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) }, + contractMinterBurner, + false, false, }, { - "fail - force fail second balance", 100, 10, 5, + "fail - force mint fail", + 100, + 10, + func(common.Address) {}, func() { - mockEVMKeeper := &erc20mocks.EVMKeeper{} + mockBankKeeper := &erc20mocks.BankKeeper{} + suite.app.Erc20Keeper = keeper.NewKeeper( suite.app.GetKey("erc20"), suite.app.AppCodec(), authtypes.NewModuleAddress(govtypes.ModuleName), suite.app.AccountKeeper, - suite.app.BankKeeper, mockEVMKeeper, suite.app.StakingKeeper, + mockBankKeeper, suite.app.EvmKeeper, suite.app.StakingKeeper, suite.app.AuthzKeeper, &suite.app.TransferKeeper, ) - existingAcc := &statedb.Account{Nonce: uint64(1), Balance: common.Big1} - balance := make([]uint8, 32) - mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil) - // first balance of - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Once() - // convert coin - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{}, nil).Once() - // second balance of - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Once() - // Extra call on test - mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{}, nil) - mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) - mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) + mockBankKeeper.On("MintCoins", mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("failed to mint")) + mockBankKeeper.On("SendCoinsFromModuleToAccount", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("failed to unescrow")) + mockBankKeeper.On("BlockedAddr", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(false) + mockBankKeeper.On("GetBalance", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(sdk.Coin{Denom: "coin", Amount: math.OneInt()}) }, + contractMinterBurner, + false, false, }, { - "fail - force fail unescrow", 100, 10, 5, + "fail - force send minted fail", + 100, + 10, + func(common.Address) {}, func() { mockBankKeeper := &erc20mocks.BankKeeper{} - suite.app.Erc20Keeper = keeper.NewKeeper( suite.app.GetKey("erc20"), suite.app.AppCodec(), authtypes.NewModuleAddress(govtypes.ModuleName), suite.app.AccountKeeper, @@ -1350,14 +289,20 @@ func (suite *KeeperTestSuite) TestConvertERC20NativeIBCVoucher() { suite.app.AuthzKeeper, &suite.app.TransferKeeper, ) + mockBankKeeper.On("MintCoins", mock.Anything, mock.Anything, mock.Anything).Return(nil) mockBankKeeper.On("SendCoinsFromModuleToAccount", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("failed to unescrow")) mockBankKeeper.On("BlockedAddr", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(false) mockBankKeeper.On("GetBalance", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(sdk.Coin{Denom: "coin", Amount: math.OneInt()}) }, + contractMinterBurner, + false, false, }, { - "fail - force fail balance after transfer", 100, 10, 5, + "fail - force bank balance fail", + 100, + 10, + func(common.Address) {}, func() { mockBankKeeper := &erc20mocks.BankKeeper{} @@ -1368,64 +313,66 @@ func (suite *KeeperTestSuite) TestConvertERC20NativeIBCVoucher() { suite.app.AuthzKeeper, &suite.app.TransferKeeper, ) + mockBankKeeper.On("MintCoins", mock.Anything, mock.Anything, mock.Anything).Return(nil) mockBankKeeper.On("SendCoinsFromModuleToAccount", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) mockBankKeeper.On("BlockedAddr", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(false) - mockBankKeeper.On("GetBalance", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(sdk.Coin{Denom: ibcBase, Amount: math.OneInt()}) + mockBankKeeper.On("GetBalance", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(sdk.Coin{Denom: coinName, Amount: math.NewInt(int64(10))}) }, + contractMinterBurner, + false, false, }, } - for _, tc := range testCases { //nolint:dupl + for _, tc := range testCases { suite.Run(fmt.Sprintf("Case %s", tc.name), func() { suite.mintFeeCollector = true suite.SetupTest() - pair := suite.setupRegisterCoin(metadataIbc) - suite.Require().NotNil(metadataIbc) - suite.Require().NotNil(pair) - // Precondition: Convert Coin to ERC20 - coins := sdk.NewCoins(sdk.NewCoin(ibcBase, math.NewInt(tc.mint))) - sender := sdk.AccAddress(suite.address.Bytes()) - err := suite.app.BankKeeper.MintCoins(suite.ctx, types.ModuleName, coins) - suite.Require().NoError(err, tc.name) - err = suite.app.BankKeeper.SendCoinsFromModuleToAccount(suite.ctx, types.ModuleName, sender, coins) - suite.Require().NoError(err, tc.name) - msg := types.NewMsgConvertCoin( - sdk.NewCoin(ibcBase, math.NewInt(tc.burn)), - suite.address, - sender, - ) + contractAddr = suite.setupRegisterERC20Pair(tc.contractType) - ctx := sdk.WrapSDKContext(suite.ctx) - _, err = suite.app.Erc20Keeper.ConvertCoin(ctx, msg) - suite.Require().NoError(err, tc.name) + tc.malleate(contractAddr) + suite.Require().NotNil(contractAddr) suite.Commit() - balance := suite.BalanceOf(common.HexToAddress(pair.Erc20Address), suite.address) - cosmosBalance := suite.app.BankKeeper.GetBalance(suite.ctx, sender, metadataIbc.Base) - suite.Require().Equal(cosmosBalance.Amount.Int64(), math.NewInt(tc.mint-tc.burn).Int64()) - suite.Require().Equal(balance, big.NewInt(tc.burn)) - // Convert ERC20s back to Coins - ctx = sdk.WrapSDKContext(suite.ctx) - contractAddr := common.HexToAddress(pair.Erc20Address) - msgConvertERC20 := types.NewMsgConvertERC20( - math.NewInt(tc.reconvert), + coinName = types.CreateDenom(contractAddr.String()) + sender := sdk.AccAddress(suite.address.Bytes()) + msg := types.NewMsgConvertERC20( + math.NewInt(tc.transfer), sender, contractAddr, suite.address, ) - tc.malleate() - res, err := suite.app.Erc20Keeper.ConvertERC20(ctx, msgConvertERC20) + suite.MintERC20Token(contractAddr, suite.address, suite.address, big.NewInt(tc.mint)) + suite.Commit() + ctx := sdk.WrapSDKContext(suite.ctx) + + tc.extra() + res, err := suite.app.Erc20Keeper.ConvertERC20(ctx, msg) + expRes := &types.MsgConvertERC20Response{} suite.Commit() - balance = suite.BalanceOf(contractAddr, suite.address) - cosmosBalance = suite.app.BankKeeper.GetBalance(suite.ctx, sender, pair.Denom) + balance := suite.BalanceOf(contractAddr, suite.address) + cosmosBalance := suite.app.BankKeeper.GetBalance(suite.ctx, sender, coinName) if tc.expPass { suite.Require().NoError(err, tc.name) - suite.Require().Equal(expRes, res) - suite.Require().Equal(cosmosBalance.Amount.Int64(), math.NewInt(tc.mint-tc.burn+tc.reconvert).Int64()) - suite.Require().Equal(balance.(*big.Int).Int64(), big.NewInt(tc.burn-tc.reconvert).Int64()) + + acc := suite.app.EvmKeeper.GetAccountWithoutBalance(suite.ctx, contractAddr) + if tc.selfdestructed { + suite.Require().Nil(acc, "expected contract to be destroyed") + } else { + suite.Require().NotNil(acc) + } + + if tc.selfdestructed || !acc.IsContract() { + id := suite.app.Erc20Keeper.GetTokenPairID(suite.ctx, contractAddr.String()) + _, found := suite.app.Erc20Keeper.GetTokenPair(suite.ctx, id) + suite.Require().False(found) + } else { + suite.Require().Equal(expRes, res) + suite.Require().Equal(cosmosBalance.Amount, math.NewInt(tc.transfer)) + suite.Require().Equal(balance.(*big.Int).Int64(), big.NewInt(tc.mint-tc.transfer).Int64()) + } } else { suite.Require().Error(err, tc.name) } diff --git a/x/erc20/keeper/params.go b/x/erc20/keeper/params.go index 91381c4aa8..907dbbe82c 100644 --- a/x/erc20/keeper/params.go +++ b/x/erc20/keeper/params.go @@ -4,29 +4,37 @@ package keeper import ( + "slices" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/evmos/evmos/v18/x/erc20/types" ) var isTrue = []byte("0x01") +const addressLength = 42 + // GetParams returns the total set of erc20 parameters. func (k Keeper) GetParams(ctx sdk.Context) (params types.Params) { enableErc20 := k.IsERC20Enabled(ctx) - enableEvmHook := k.GetEnableEVMHook(ctx) - - return types.NewParams(enableErc20, enableEvmHook) + dynamicPrecompiles := k.getDynamicPrecompiles(ctx) + nativePrecompiles := k.getNativePrecompiles(ctx) + return types.NewParams(enableErc20, nativePrecompiles, dynamicPrecompiles) } // SetParams sets the erc20 parameters to the param space. func (k Keeper) SetParams(ctx sdk.Context, params types.Params) error { + // and keep params equal between different executions + slices.Sort(params.DynamicPrecompiles) + slices.Sort(params.NativePrecompiles) + if err := params.Validate(); err != nil { return err } k.setERC20Enabled(ctx, params.EnableErc20) - k.setEnableEVMHook(ctx, params.EnableEVMHook) - + k.setDynamicPrecompiles(ctx, params.DynamicPrecompiles) + k.setNativePrecompiles(ctx, params.NativePrecompiles) return nil } @@ -36,12 +44,6 @@ func (k Keeper) IsERC20Enabled(ctx sdk.Context) bool { return store.Has(types.ParamStoreKeyEnableErc20) } -// GetEnableEVMHook returns true if the EVM hooks are enabled -func (k Keeper) GetEnableEVMHook(ctx sdk.Context) bool { - store := ctx.KVStore(k.storeKey) - return store.Has(types.ParamStoreKeyEnableEVMHook) -} - // setERC20Enabled sets the EnableERC20 param in the store func (k Keeper) setERC20Enabled(ctx sdk.Context, enable bool) { store := ctx.KVStore(k.storeKey) @@ -52,12 +54,43 @@ func (k Keeper) setERC20Enabled(ctx sdk.Context, enable bool) { store.Delete(types.ParamStoreKeyEnableErc20) } -// setEnableEVMHook sets the EnableEVMHook param in the store -func (k Keeper) setEnableEVMHook(ctx sdk.Context, enable bool) { +// setDynamicPrecompiles sets the DynamicPrecompiles param in the store +func (k Keeper) setDynamicPrecompiles(ctx sdk.Context, dynamicPrecompiles []string) { store := ctx.KVStore(k.storeKey) - if enable { - store.Set(types.ParamStoreKeyEnableEVMHook, isTrue) - return + bz := make([]byte, 0, addressLength*len(dynamicPrecompiles)) + for _, str := range dynamicPrecompiles { + bz = append(bz, []byte(str)...) + } + store.Set(types.ParamStoreKeyDynamicPrecompiles, bz) +} + +// getDynamicPrecompiles returns the DynamicPrecompiles param from the store +func (k Keeper) getDynamicPrecompiles(ctx sdk.Context) (dynamicPrecompiles []string) { + store := ctx.KVStore(k.storeKey) + bz := store.Get(types.ParamStoreKeyDynamicPrecompiles) + + for i := 0; i < len(bz); i += addressLength { + dynamicPrecompiles = append(dynamicPrecompiles, string(bz[i:i+addressLength])) + } + return dynamicPrecompiles +} + +// setNativePrecompiles sets the NativePrecompiles param in the store +func (k Keeper) setNativePrecompiles(ctx sdk.Context, nativePrecompiles []string) { + store := ctx.KVStore(k.storeKey) + bz := make([]byte, 0, addressLength*len(nativePrecompiles)) + for _, str := range nativePrecompiles { + bz = append(bz, []byte(str)...) + } + store.Set(types.ParamStoreKeyNativePrecompiles, bz) +} + +// getNativePrecompiles returns the NativePrecompiles param from the store +func (k Keeper) getNativePrecompiles(ctx sdk.Context) (nativePrecompiles []string) { + store := ctx.KVStore(k.storeKey) + bz := store.Get(types.ParamStoreKeyNativePrecompiles) + for i := 0; i < len(bz); i += addressLength { + nativePrecompiles = append(nativePrecompiles, string(bz[i:i+addressLength])) } - store.Delete(types.ParamStoreKeyEnableEVMHook) + return nativePrecompiles } diff --git a/x/erc20/keeper/params_test.go b/x/erc20/keeper/params_test.go index f819f300e1..a7bd654f5c 100644 --- a/x/erc20/keeper/params_test.go +++ b/x/erc20/keeper/params_test.go @@ -26,6 +26,32 @@ func (suite *KeeperTestSuite) TestParams() { }, true, }, + { + "success - Checks if dynamic precompiles are set correctly", + func() interface{} { + params.DynamicPrecompiles = []string{"0xB5124FA2b2cF92B2D469b249433BA1c96BDF536D", "0xC4CcDf91b810a61cCB48b35ccCc066C63bf94B4F"} + err := suite.app.Erc20Keeper.SetParams(suite.ctx, params) + suite.Require().NoError(err) + return params.DynamicPrecompiles + }, + func() interface{} { + return suite.app.Erc20Keeper.GetParams(suite.ctx).DynamicPrecompiles + }, + true, + }, + { + "success - Checks if native precompiles are set correctly", + func() interface{} { + params.NativePrecompiles = []string{"0x205CF44075E77A3543abC690437F3b2819bc450a", "0x8FA78CEB7F04118Ec6d06AaC37Ca854691d8e963"} + err := suite.app.Erc20Keeper.SetParams(suite.ctx, params) + suite.Require().NoError(err) + return params.NativePrecompiles + }, + func() interface{} { + return suite.app.Erc20Keeper.GetParams(suite.ctx).NativePrecompiles + }, + true, + }, } for _, tc := range testCases { diff --git a/x/erc20/keeper/precompiles.go b/x/erc20/keeper/precompiles.go index c1a243a63f..af304a201c 100644 --- a/x/erc20/keeper/precompiles.go +++ b/x/erc20/keeper/precompiles.go @@ -4,64 +4,52 @@ package keeper import ( + "fmt" + "slices" + errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/common" "github.com/evmos/evmos/v18/precompiles/erc20" - "github.com/evmos/evmos/v18/precompiles/werc20" "github.com/evmos/evmos/v18/x/erc20/types" "github.com/evmos/evmos/v18/x/evm/core/vm" ) -// RegisterERC20Extensions registers the ERC20 precompiles with the EVM. -func (k Keeper) RegisterERC20Extensions(ctx sdk.Context) error { - precompiles := make([]vm.PrecompiledContract, 0) - params := k.evmKeeper.GetParams(ctx) - evmDenom := params.EvmDenom - - var err error - k.IterateTokenPairs(ctx, func(tokenPair types.TokenPair) bool { - // skip registration if token is native or if it has already been registered - // NOTE: this should handle failure during the selfdestruct - if tokenPair.ContractOwner != types.OWNER_MODULE || - k.evmKeeper.IsAvailablePrecompile(tokenPair.GetERC20Contract()) { - return false - } - - var precompile vm.PrecompiledContract - - if tokenPair.Denom == evmDenom { - precompile, err = werc20.NewPrecompile(tokenPair, k.bankKeeper, k.authzKeeper, *k.transferKeeper) - } else { - precompile, err = erc20.NewPrecompile(tokenPair, k.bankKeeper, k.authzKeeper, *k.transferKeeper) - } - - if err != nil { - err = errorsmod.Wrapf(err, "failed to instantiate ERC-20 precompile for denom %s", tokenPair.Denom) - return true - } - - address := tokenPair.GetERC20Contract() +// GetERC20PrecompileInstance returns the precompile instance for the given address. +func (k Keeper) GetERC20PrecompileInstance( + ctx sdk.Context, + address common.Address, +) (contract vm.PrecompiledContract, found bool, err error) { + params := k.GetParams(ctx) - // try selfdestruct ERC20 contract - - // NOTE(@fedekunze): From now on, the contract address will map to a precompile instead - // of the ERC20MinterBurner contract. We try to force a selfdestruct to remove the unnecessary - // code and storage from the state machine. In any case, the precompiles are handled in the EVM - // before the regular contracts so not removing them doesn't create any issues in the implementation. - err = k.evmKeeper.DeleteAccount(ctx, address) + if k.IsAvailableERC20Precompile(¶ms, address) { + precompile, err := k.InstantiateERC20Precompile(ctx, address) if err != nil { - err = errorsmod.Wrapf(err, "failed to selfdestruct account %s", address) - return true + return nil, false, errorsmod.Wrapf(err, "precompiled contract not initialized: %s", address.String()) } + return precompile, true, nil + } + return nil, false, nil +} - precompiles = append(precompiles, precompile) - return false - }) - - if err != nil { - return err +// InstantiateERC20Precompile returns an ERC20 precompile instance for the given contract address +func (k Keeper) InstantiateERC20Precompile(ctx sdk.Context, contractAddr common.Address) (vm.PrecompiledContract, error) { + address := contractAddr.String() + // check if the precompile is an ERC20 contract + id := k.GetTokenPairID(ctx, address) + if len(id) == 0 { + return nil, fmt.Errorf("precompile id not found: %s", address) } + pair, ok := k.GetTokenPair(ctx, id) + if !ok { + return nil, fmt.Errorf("token pair not found: %s", address) + } + return erc20.NewPrecompile(pair, k.bankKeeper, k.authzKeeper, *k.transferKeeper) +} - // add the ERC20s to the EVM active and available precompiles - return k.evmKeeper.AddEVMExtensions(ctx, precompiles...) +// IsAvailableDynamicPrecompile returns true if the given precompile address is contained in the +// EVM keeper's available dynamic precompiles precompiles params. +func (k Keeper) IsAvailableERC20Precompile(params *types.Params, address common.Address) bool { + return slices.Contains(params.NativePrecompiles, address.Hex()) || + slices.Contains(params.DynamicPrecompiles, address.Hex()) } diff --git a/x/erc20/keeper/precompiles_test.go b/x/erc20/keeper/precompiles_test.go index 8e8c951f3f..5167b8b763 100644 --- a/x/erc20/keeper/precompiles_test.go +++ b/x/erc20/keeper/precompiles_test.go @@ -1,149 +1,73 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - package keeper_test import ( - "slices" - - erc20precompile "github.com/evmos/evmos/v18/precompiles/erc20" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/utils" + "github.com/ethereum/go-ethereum/common" "github.com/evmos/evmos/v18/x/erc20/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" ) -func (suite *KeeperTestSuite) TestRegisterERC20Extensions() { - ibcDenom := utils.ComputeIBCDenom("transfer", "channel-0", "uosmo") - ibcTokenPair := types.NewTokenPair(utiltx.GenerateAddress(), ibcDenom, types.OWNER_MODULE) - tokenPair := types.NewTokenPair(utiltx.GenerateAddress(), "test", types.OWNER_MODULE) - otherTokenPair := types.NewTokenPair(utiltx.GenerateAddress(), "other", types.OWNER_MODULE) - externalTokenPair := types.NewTokenPair(utiltx.GenerateAddress(), "uext", types.OWNER_EXTERNAL) - - testcases := []struct { - name string - malleate func() - expPass bool - errContains string - postCheck func() +func (suite *KeeperTestSuite) TestGetERC20PrecompileInstance() { + newTokenHexAddr := "0x205CF44075E77A3543abC690437F3b2819bc450a" //nolint:gosec + nonExistendTokenHexAddr := "0x8FA78CEB7F04118Ec6d06AaC37Ca854691d8e963" //nolint:gosec + newTokenDenom := "test" + params := suite.app.Erc20Keeper.GetParams(suite.ctx) + tokenPair := types.NewTokenPair(common.HexToAddress(newTokenHexAddr), newTokenDenom, types.OWNER_MODULE) + suite.app.Erc20Keeper.SetToken(suite.ctx, tokenPair) + tokenPairs := suite.app.Erc20Keeper.GetTokenPairs(suite.ctx) + suite.Require().True(len(tokenPairs) > 1) + + testCases := []struct { + name string + paramsFun func() + precompile common.Address + expectedFound bool + expectedError bool + err string }{ { - name: "pass - no token pairs in ERC20 keeper", - expPass: true, - postCheck: func() { - s.requireActivePrecompiles(evmtypes.AvailableEVMExtensions) - }, - }, - { - name: "pass - native token pair", - malleate: func() { - suite.app.Erc20Keeper.SetTokenPair(suite.ctx, tokenPair) - }, - expPass: true, - postCheck: func() { - // Check that the precompile was registered - available := suite.app.EvmKeeper.IsAvailablePrecompile(tokenPair.GetERC20Contract()) - suite.Require().True(available, "expected precompile to be registered") - - // Check that the precompile is set as active - suite.requireActivePrecompiles( - append(evmtypes.AvailableEVMExtensions, tokenPair.Erc20Address), - ) - }, - }, - { - name: "pass - IBC token pair", - malleate: func() { - suite.app.Erc20Keeper.SetTokenPair(suite.ctx, ibcTokenPair) - }, - expPass: true, - postCheck: func() { - // Check that the precompile was registered - available := suite.app.EvmKeeper.IsAvailablePrecompile(ibcTokenPair.GetERC20Contract()) - suite.Require().True(available, "expected precompile to be registered") - - // Check that the precompile is set as active - suite.requireActivePrecompiles( - append(evmtypes.AvailableEVMExtensions, ibcTokenPair.Erc20Address), - ) - }, - }, - { - name: "pass - external token pair is skipped", - malleate: func() { - suite.app.Erc20Keeper.SetTokenPair(suite.ctx, externalTokenPair) - suite.app.Erc20Keeper.SetTokenPair(suite.ctx, otherTokenPair) - }, - expPass: true, - postCheck: func() { - // Check that active precompiles are unchanged - suite.requireActivePrecompiles( - append(evmtypes.AvailableEVMExtensions, otherTokenPair.Erc20Address), - ) + "fail - precompile not on params", + func() { + params = types.DefaultParams() + err := suite.app.Erc20Keeper.SetParams(suite.ctx, params) + suite.Require().NoError(err) }, + common.HexToAddress(nonExistendTokenHexAddr), + false, + false, + "", }, { - name: "pass - already registered precompile token pair is skipped", - malleate: func() { - suite.app.Erc20Keeper.SetTokenPair(suite.ctx, tokenPair) - suite.app.Erc20Keeper.SetTokenPair(suite.ctx, otherTokenPair) - - tokenPrecompile, err := erc20precompile.NewPrecompile(tokenPair, suite.app.BankKeeper, suite.app.AuthzKeeper, suite.app.TransferKeeper) - suite.Require().NoError(err, "expected no error creating precompile") - - err = suite.app.EvmKeeper.AddEVMExtensions(suite.ctx, tokenPrecompile) - suite.Require().NoError(err, "expected no error adding precompile to EVM keeper") - }, - expPass: true, - postCheck: func() { - // Check that active precompiles contain the already registered precompile - // as well as the other token pair - expPrecompiles := append(evmtypes.AvailableEVMExtensions, tokenPair.Erc20Address, otherTokenPair.Erc20Address) //nolint:gocritic // Okay not to store to same slice here after appending - slices.Sort(expPrecompiles) // NOTE: the precompiles are sorted so we need to sort the expected slice as well - - suite.requireActivePrecompiles(expPrecompiles) + "fail - precompile on params, but token pair doesn't exist", + func() { + params.NativePrecompiles = []string{newTokenHexAddr, nonExistendTokenHexAddr} + err := suite.app.Erc20Keeper.SetParams(suite.ctx, params) + suite.Require().NoError(err) }, + common.HexToAddress(nonExistendTokenHexAddr), + false, + true, + "precompiled contract not initialized", }, { - name: "pass - evm denomination deploys werc20 contract", - malleate: func() { - params := suite.app.EvmKeeper.GetParams(suite.ctx) - params.EvmDenom = tokenPair.Denom - err := suite.app.EvmKeeper.SetParams(suite.ctx, params) - suite.Require().NoError(err, "expected no error setting EVM params") - - suite.app.Erc20Keeper.SetTokenPair(suite.ctx, tokenPair) - }, - expPass: true, - postCheck: func() { - // Check that the precompile was not registered - available := suite.app.EvmKeeper.IsAvailablePrecompile(tokenPair.GetERC20Contract()) - suite.Require().True(available, "expected precompile to be registered") + "success - precompile on params, and token pair exist", + func() { + params.NativePrecompiles = []string{tokenPairs[0].Erc20Address} + err := suite.app.Erc20Keeper.SetParams(suite.ctx, params) + suite.Require().NoError(err) }, + common.HexToAddress(tokenPairs[0].Erc20Address), + true, + false, + "", }, } - - for _, tc := range testcases { - tc := tc - + for _, tc := range testCases { suite.Run(tc.name, func() { - suite.SetupTest() - - if tc.malleate != nil { - tc.malleate() - } - - err := suite.app.Erc20Keeper.RegisterERC20Extensions(suite.ctx) - - if tc.expPass { - suite.Require().NoError(err, "expected no error registering ERC20 extensions") - } else { - suite.Require().Error(err, "expected an error registering ERC20 extensions") - suite.Require().ErrorContains(err, tc.errContains, "expected different error message") - } + tc.paramsFun() - if tc.postCheck != nil { - tc.postCheck() + _, found, err := suite.app.Erc20Keeper.GetERC20PrecompileInstance(suite.ctx, tc.precompile) + suite.Require().Equal(found, tc.expectedFound) + if tc.expectedError { + suite.Require().ErrorContains(err, tc.err) } }) } diff --git a/x/erc20/keeper/proposals.go b/x/erc20/keeper/proposals.go index 8d40be0a27..b6b7e9b08a 100644 --- a/x/erc20/keeper/proposals.go +++ b/x/erc20/keeper/proposals.go @@ -6,54 +6,12 @@ package keeper import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" - errortypes "github.com/cosmos/cosmos-sdk/types/errors" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/ethereum/go-ethereum/common" "github.com/evmos/evmos/v18/x/erc20/types" ) -// RegisterCoin deploys an erc20 contract and creates the token pair for the -// existing cosmos coin -func (k Keeper) RegisterCoin( - ctx sdk.Context, - coinMetadata banktypes.Metadata, -) (*types.TokenPair, error) { - // Check if denomination is already registered - if k.IsDenomRegistered(ctx, coinMetadata.Name) { - return nil, errorsmod.Wrapf( - types.ErrTokenPairAlreadyExists, "coin denomination already registered: %s", coinMetadata.Name, - ) - } - - // Check if the coin exists by ensuring the supply is set - if !k.bankKeeper.HasSupply(ctx, coinMetadata.Base) { - return nil, errorsmod.Wrapf( - errortypes.ErrInvalidCoins, "base denomination '%s' cannot have a supply of 0", coinMetadata.Base, - ) - } - - if err := k.verifyMetadata(ctx, coinMetadata); err != nil { - return nil, errorsmod.Wrapf( - types.ErrInternalTokenPair, "coin metadata is invalid %s", coinMetadata.Name, - ) - } - - addr, err := k.DeployERC20Contract(ctx, coinMetadata) - if err != nil { - return nil, errorsmod.Wrap( - err, "failed to create wrapped coin denom metadata for ERC20", - ) - } - - pair := types.NewTokenPair(addr, coinMetadata.Base, types.OWNER_MODULE) - k.SetTokenPair(ctx, pair) - k.SetDenomMap(ctx, pair.Denom, pair.GetID()) - k.SetERC20Map(ctx, common.HexToAddress(pair.Erc20Address), pair.GetID()) - - return &pair, nil -} - // RegisterERC20 creates a Cosmos coin and registers the token pair between the // coin and the ERC20 func (k Keeper) RegisterERC20( @@ -75,9 +33,7 @@ func (k Keeper) RegisterERC20( } pair := types.NewTokenPair(contract, metadata.Name, types.OWNER_EXTERNAL) - k.SetTokenPair(ctx, pair) - k.SetDenomMap(ctx, pair.Denom, pair.GetID()) - k.SetERC20Map(ctx, common.HexToAddress(pair.Erc20Address), pair.GetID()) + k.SetToken(ctx, pair) return &pair, nil } @@ -173,23 +129,6 @@ func (k Keeper) ToggleConversion( } pair.Enabled = !pair.Enabled - k.SetTokenPair(ctx, pair) return pair, nil } - -// verifyMetadata verifies if the metadata matches the existing one, if not it -// sets it to the store -func (k Keeper) verifyMetadata( - ctx sdk.Context, - coinMetadata banktypes.Metadata, -) error { - meta, found := k.bankKeeper.GetDenomMetaData(ctx, coinMetadata.Base) - if !found { - k.bankKeeper.SetDenomMetaData(ctx, coinMetadata) - return nil - } - - // If it already existed, check that is equal to what is stored - return types.EqualMetadata(meta, coinMetadata) -} diff --git a/x/erc20/keeper/proposals_test.go b/x/erc20/keeper/proposals_test.go index 4dcea58dc8..0f0e2804e8 100644 --- a/x/erc20/keeper/proposals_test.go +++ b/x/erc20/keeper/proposals_test.go @@ -3,7 +3,6 @@ package keeper_test import ( "fmt" - sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" @@ -12,7 +11,6 @@ import ( "github.com/evmos/evmos/v18/x/erc20/types" erc20mocks "github.com/evmos/evmos/v18/x/erc20/types/mocks" evmtypes "github.com/evmos/evmos/v18/x/evm/types" - inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" "github.com/stretchr/testify/mock" ) @@ -92,18 +90,7 @@ func (suite *KeeperTestSuite) setupRegisterERC20Pair(contractType int) common.Ad return contract } -func (suite *KeeperTestSuite) setupRegisterCoin(metadata banktypes.Metadata) *types.TokenPair { - err := suite.app.BankKeeper.MintCoins(suite.ctx, inflationtypes.ModuleName, sdk.Coins{sdk.NewInt64Coin(metadata.Base, 1)}) - suite.Require().NoError(err) - - // pair := types.NewTokenPair(contractAddr, cosmosTokenBase, true, types.OWNER_MODULE) - pair, err := suite.app.Erc20Keeper.RegisterCoin(suite.ctx, metadata) - suite.Require().NoError(err) - suite.Commit() - return pair -} - -func (suite KeeperTestSuite) TestRegisterERC20() { //nolint:govet // we can copy locks here because it is a test +func (suite *KeeperTestSuite) TestRegisterERC20() { var ( contractAddr common.Address pair types.TokenPair diff --git a/x/erc20/keeper/setup_test.go b/x/erc20/keeper/setup_test.go index e51d825a20..945eb0c4fa 100644 --- a/x/erc20/keeper/setup_test.go +++ b/x/erc20/keeper/setup_test.go @@ -8,7 +8,6 @@ import ( //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/gomega" - "cosmossdk.io/math" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/crypto/keyring" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" @@ -54,16 +53,7 @@ type KeeperTestSuite struct { suiteIBCTesting bool } -var ( - s *KeeperTestSuite - // sendAndReceiveMsgFee corresponds to the fees paid on Evmos chain when calling the SendAndReceive function - // This function makes 3 cosmos txs under the hood - sendAndReceiveMsgFee = math.NewInt(ibctesting.DefaultFeeAmt * 3) - // sendBackCoinsFee corresponds to the fees paid on Evmos chain when calling the SendBackCoins function - // or calling the SendAndReceive from another chain to Evmos - // This function makes 2 cosmos txs under the hood - sendBackCoinsFee = math.NewInt(ibctesting.DefaultFeeAmt * 2) -) +var s *KeeperTestSuite func TestKeeperTestSuite(t *testing.T) { s = new(KeeperTestSuite) diff --git a/x/erc20/keeper/token_pairs.go b/x/erc20/keeper/token_pairs.go index 10201289b0..b8b2fd11e0 100644 --- a/x/erc20/keeper/token_pairs.go +++ b/x/erc20/keeper/token_pairs.go @@ -13,6 +13,23 @@ import ( "github.com/evmos/evmos/v18/x/erc20/types" ) +// CreateNewTokenPair creates a new token pair and stores it in the state. +func (k *Keeper) CreateNewTokenPair(ctx sdk.Context, denom string) (types.TokenPair, error) { + pair, err := types.NewTokenPairSTRv2(denom) + if err != nil { + return types.TokenPair{}, err + } + k.SetToken(ctx, pair) + return pair, nil +} + +// SetToken stores a token pair, denom map and erc20 map. +func (k *Keeper) SetToken(ctx sdk.Context, pair types.TokenPair) { + k.SetTokenPair(ctx, pair) + k.SetDenomMap(ctx, pair.Denom, pair.GetID()) + k.SetERC20Map(ctx, pair.GetERC20Contract(), pair.GetID()) +} + // GetTokenPairs gets all registered token tokenPairs. func (k Keeper) GetTokenPairs(ctx sdk.Context) []types.TokenPair { tokenPairs := []types.TokenPair{} @@ -41,8 +58,8 @@ func (k Keeper) IterateTokenPairs(ctx sdk.Context, cb func(tokenPair types.Token } } -// GetTokenPairID returns the pair id from either of the registered tokens. -// Hex address or Denom can be used as token argument. +// GetTokenPairID returns the pair id for the specified token. Hex address or Denom can be used as token argument. +// If the token is not registered empty bytes are returned. func (k Keeper) GetTokenPairID(ctx sdk.Context, token string) []byte { if common.IsHexAddress(token) { addr := common.HexToAddress(token) diff --git a/x/erc20/keeper/token_pairs_test.go b/x/erc20/keeper/token_pairs_test.go index 2c59c080ef..f9c1f7b066 100644 --- a/x/erc20/keeper/token_pairs_test.go +++ b/x/erc20/keeper/token_pairs_test.go @@ -17,15 +17,15 @@ func (suite *KeeperTestSuite) TestGetTokenPairs() { malleate func() }{ { - "no pair registered", func() { expRes = []types.TokenPair{} }, + "no pair registered", func() { expRes = types.DefaultTokenPairs }, }, { "1 pair registered", func() { pair := types.NewTokenPair(utiltx.GenerateAddress(), "coin", types.OWNER_MODULE) suite.app.Erc20Keeper.SetTokenPair(suite.ctx, pair) - - expRes = []types.TokenPair{pair} + expRes = types.DefaultTokenPairs + expRes = append(expRes, pair) }, }, { @@ -35,8 +35,8 @@ func (suite *KeeperTestSuite) TestGetTokenPairs() { pair2 := types.NewTokenPair(utiltx.GenerateAddress(), "coin2", types.OWNER_MODULE) suite.app.Erc20Keeper.SetTokenPair(suite.ctx, pair) suite.app.Erc20Keeper.SetTokenPair(suite.ctx, pair2) - - expRes = []types.TokenPair{pair, pair2} + expRes = types.DefaultTokenPairs + expRes = append(expRes, []types.TokenPair{pair, pair2}...) }, }, } diff --git a/x/erc20/keeper/utils_test.go b/x/erc20/keeper/utils_test.go index 1d7460bfd3..84fb7475d0 100644 --- a/x/erc20/keeper/utils_test.go +++ b/x/erc20/keeper/utils_test.go @@ -371,15 +371,6 @@ func (suite *KeeperTestSuite) DeployContractToChain(name, symbol string, decimal ) } -func (suite *KeeperTestSuite) requireActivePrecompiles(precompiles []string) { - params := suite.app.EvmKeeper.GetParams(suite.ctx) - suite.Require().Equal( - precompiles, - params.ActivePrecompiles, - "expected different active precompiles", - ) -} - func (suite *KeeperTestSuite) sendAndReceiveMessage( path *ibctesting.Path, originEndpoint *ibctesting.Endpoint, diff --git a/x/erc20/migrations/v3/migration_test.go b/x/erc20/migrations/v3/migration_test.go index 7246cba24e..6744a9f414 100644 --- a/x/erc20/migrations/v3/migration_test.go +++ b/x/erc20/migrations/v3/migration_test.go @@ -54,7 +54,7 @@ func TestMigrate(t *testing.T) { require.NoError(t, v3.MigrateStore(ctx, storeKey, mockSubspace)) // Get all the new parameters from the store - enableEvmHook := store.Has(types.ParamStoreKeyEnableEVMHook) + enableEvmHook := store.Has(v3types.ParamStoreKeyEnableEVMHook) enableErc20 := store.Has(types.ParamStoreKeyEnableErc20) params := v3types.NewParams(enableErc20, enableEvmHook) diff --git a/x/erc20/migrations/v4/migration.go b/x/erc20/migrations/v4/migration.go new file mode 100644 index 0000000000..a6e5fb69ea --- /dev/null +++ b/x/erc20/migrations/v4/migration.go @@ -0,0 +1,42 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package v4 + +import ( + storetypes "github.com/cosmos/cosmos-sdk/store/types" + sdk "github.com/cosmos/cosmos-sdk/types" + v3types "github.com/evmos/evmos/v18/x/erc20/migrations/v3/types" + "github.com/evmos/evmos/v18/x/erc20/types" +) + +const AddressLength = 42 + +var isTrue = []byte{0x01} + +// MigrateStore migrates the x/erc20 module state from the consensus version 3 to +// version 4. Specifically, it takes the parameters that are currently stored +// and managed by the Cosmos SDK params module and stores them directly into the x/erc20 module state. +func MigrateStore( + ctx sdk.Context, + storeKey storetypes.StoreKey, +) error { + store := ctx.KVStore(storeKey) + + store.Delete(v3types.ParamStoreKeyEnableEVMHook) + + store.Get(v3types.ParamStoreKeyEnableErc20) + store.Set(types.ParamStoreKeyEnableErc20, isTrue) + + params := types.DefaultParams() + bz := make([]byte, 0, AddressLength*len(params.NativePrecompiles)) + for _, str := range params.NativePrecompiles { + bz = append(bz, []byte(str)...) + } + store.Set(types.ParamStoreKeyNativePrecompiles, bz) + + bz = make([]byte, 0) + store.Set(types.ParamStoreKeyDynamicPrecompiles, bz) + + return nil +} diff --git a/x/erc20/migrations/v4/migration_test.go b/x/erc20/migrations/v4/migration_test.go new file mode 100644 index 0000000000..8b21c4d2a5 --- /dev/null +++ b/x/erc20/migrations/v4/migration_test.go @@ -0,0 +1,75 @@ +package v4_test + +import ( + "testing" + + storetypes "github.com/cosmos/cosmos-sdk/store/types" + paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" + "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v18/encoding" + "github.com/stretchr/testify/require" + + v3types "github.com/evmos/evmos/v18/x/erc20/migrations/v3/types" + v4 "github.com/evmos/evmos/v18/x/erc20/migrations/v4" + + "github.com/evmos/evmos/v18/x/erc20/types" + + "github.com/cosmos/cosmos-sdk/testutil" + sdk "github.com/cosmos/cosmos-sdk/types" +) + +type mockSubspace struct { + ps v3types.V3Params + storeKey storetypes.StoreKey + transientKey storetypes.StoreKey +} + +func newMockSubspace(ps v3types.V3Params, storeKey, transientKey storetypes.StoreKey) mockSubspace { + return mockSubspace{ps: ps, storeKey: storeKey, transientKey: transientKey} +} + +func (ms mockSubspace) GetParamSet(_ sdk.Context, ps types.LegacyParams) { + *ps.(*v3types.V3Params) = ms.ps +} + +func (ms mockSubspace) WithKeyTable(keyTable paramtypes.KeyTable) paramtypes.Subspace { + encCfg := encoding.MakeConfig(app.ModuleBasics) + cdc := encCfg.Codec + return paramtypes.NewSubspace(cdc, encCfg.Amino, ms.storeKey, ms.transientKey, "test").WithKeyTable(keyTable) +} + +func TestMigrate(t *testing.T) { + storeKey := sdk.NewKVStoreKey(types.ModuleName) + tKey := sdk.NewTransientStoreKey("transient_test") + ctx := testutil.DefaultContext(storeKey, tKey) + store := ctx.KVStore(storeKey) + + inputParams := v3types.DefaultParams() + legacySubspace := newMockSubspace(v3types.DefaultParams(), storeKey, tKey).WithKeyTable(v3types.ParamKeyTable()) + legacySubspace.SetParamSet(ctx, &inputParams) + + require.NoError(t, v4.MigrateStore(ctx, storeKey)) + + // Get all the new parameters from the store + enableEvmHook := store.Has(v3types.ParamStoreKeyEnableEVMHook) + require.False(t, enableEvmHook) + + enableErc20 := store.Has(types.ParamStoreKeyEnableErc20) + require.True(t, enableErc20) + + var dynamicPrecompiles []string + bz := store.Get(types.ParamStoreKeyDynamicPrecompiles) + for i := 0; i < len(bz); i += v4.AddressLength { + dynamicPrecompiles = append(dynamicPrecompiles, string(bz[i:i+v4.AddressLength])) + } + + var nativePrecompiles []string + bz = store.Get(types.ParamStoreKeyNativePrecompiles) + for i := 0; i < len(bz); i += v4.AddressLength { + nativePrecompiles = append(nativePrecompiles, string(bz[i:i+v4.AddressLength])) + } + + params := types.NewParams(enableErc20, nativePrecompiles, dynamicPrecompiles) + defaultParams := types.DefaultParams() + require.Equal(t, params, defaultParams) +} diff --git a/x/erc20/module.go b/x/erc20/module.go index 3669dc7f19..fa5b4cc80f 100644 --- a/x/erc20/module.go +++ b/x/erc20/module.go @@ -26,7 +26,7 @@ import ( ) // consensusVersion defines the current x/erc20 module consensus version. -const consensusVersion = 3 +const consensusVersion = 4 // type check to ensure the interface is properly implemented var ( @@ -131,7 +131,11 @@ func (am AppModule) RegisterServices(cfg module.Configurator) { // register v2 -> v3 migration if err := cfg.RegisterMigration(types.ModuleName, 2, migrator.Migrate2to3); err != nil { - panic(fmt.Errorf("failed to migrate %s to v2: %w", types.ModuleName, err)) + panic(fmt.Errorf("failed to migrate %s to v3: %w", types.ModuleName, err)) + } + + if err := cfg.RegisterMigration(types.ModuleName, 3, migrator.Migrate3to4); err != nil { + panic(fmt.Errorf("failed to migrate %s to v4: %w", types.ModuleName, err)) } } diff --git a/x/erc20/types/codec.go b/x/erc20/types/codec.go index 61c9da0afe..3b51c4e737 100644 --- a/x/erc20/types/codec.go +++ b/x/erc20/types/codec.go @@ -28,7 +28,6 @@ var ( const ( // Amino names convertERC20Name = "evmos/MsgConvertERC20" - convertCoinName = "evmos/MsgConvertCoin" updateParams = "evmos/erc20/MsgUpdateParams" ) @@ -42,13 +41,11 @@ func init() { func RegisterInterfaces(registry codectypes.InterfaceRegistry) { registry.RegisterImplementations( (*sdk.Msg)(nil), - &MsgConvertCoin{}, &MsgConvertERC20{}, &MsgUpdateParams{}, ) registry.RegisterImplementations( (*govv1beta1.Content)(nil), - &RegisterCoinProposal{}, &RegisterERC20Proposal{}, &ToggleTokenConversionProposal{}, ) @@ -62,5 +59,4 @@ func RegisterInterfaces(registry codectypes.InterfaceRegistry) { func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { cdc.RegisterConcrete(&MsgUpdateParams{}, updateParams, nil) cdc.RegisterConcrete(&MsgConvertERC20{}, convertERC20Name, nil) - cdc.RegisterConcrete(&MsgConvertCoin{}, convertCoinName, nil) } diff --git a/x/erc20/types/erc20.pb.go b/x/erc20/types/erc20.pb.go index 12c900eb9b..9351491ff3 100644 --- a/x/erc20/types/erc20.pb.go +++ b/x/erc20/types/erc20.pb.go @@ -5,18 +5,21 @@ package types import ( fmt "fmt" - types "github.com/cosmos/cosmos-sdk/x/bank/types" - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" + + types "github.com/cosmos/cosmos-sdk/x/bank/types" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" ) // Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf +var ( + _ = proto.Marshal + _ = fmt.Errorf + _ = math.Inf +) // This is a compile-time assertion to ensure that this generated file // is compatible with the proto package it is being compiled against. @@ -32,7 +35,7 @@ const ( OWNER_UNSPECIFIED Owner = 0 // OWNER_MODULE - erc20 is owned by the erc20 module account. OWNER_MODULE Owner = 1 - // OWNER_EXTERNAL - erc20 is owned by an external account. + // OWNER_EXTERNAL - erc20 is owned by an external owned account. OWNER_EXTERNAL Owner = 2 ) @@ -65,7 +68,7 @@ type TokenPair struct { Denom string `protobuf:"bytes,2,opt,name=denom,proto3" json:"denom,omitempty"` // enabled defines the token mapping enable status Enabled bool `protobuf:"varint,3,opt,name=enabled,proto3" json:"enabled,omitempty"` - // contract_owner is the an ENUM specifying the type of ERC20 owner (0 invalid, 1 ModuleAccount, 2 external address) + // contract_owner is an enum specifying the type of ERC20 owner (0 invalid, 1 ModuleAccount, 2 external address) ContractOwner Owner `protobuf:"varint,4,opt,name=contract_owner,json=contractOwner,proto3,enum=evmos.erc20.v1.Owner" json:"contract_owner,omitempty"` } @@ -75,9 +78,11 @@ func (*TokenPair) ProtoMessage() {} func (*TokenPair) Descriptor() ([]byte, []int) { return fileDescriptor_668d5dc537f45142, []int{0} } + func (m *TokenPair) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } + func (m *TokenPair) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_TokenPair.Marshal(b, m, deterministic) @@ -90,12 +95,15 @@ func (m *TokenPair) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } + func (m *TokenPair) XXX_Merge(src proto.Message) { xxx_messageInfo_TokenPair.Merge(m, src) } + func (m *TokenPair) XXX_Size() int { return m.Size() } + func (m *TokenPair) XXX_DiscardUnknown() { xxx_messageInfo_TokenPair.DiscardUnknown(m) } @@ -148,9 +156,11 @@ func (*RegisterCoinProposal) ProtoMessage() {} func (*RegisterCoinProposal) Descriptor() ([]byte, []int) { return fileDescriptor_668d5dc537f45142, []int{1} } + func (m *RegisterCoinProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } + func (m *RegisterCoinProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_RegisterCoinProposal.Marshal(b, m, deterministic) @@ -163,12 +173,15 @@ func (m *RegisterCoinProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte return b[:n], nil } } + func (m *RegisterCoinProposal) XXX_Merge(src proto.Message) { xxx_messageInfo_RegisterCoinProposal.Merge(m, src) } + func (m *RegisterCoinProposal) XXX_Size() int { return m.Size() } + func (m *RegisterCoinProposal) XXX_DiscardUnknown() { xxx_messageInfo_RegisterCoinProposal.DiscardUnknown(m) } @@ -210,9 +223,11 @@ func (*ProposalMetadata) ProtoMessage() {} func (*ProposalMetadata) Descriptor() ([]byte, []int) { return fileDescriptor_668d5dc537f45142, []int{2} } + func (m *ProposalMetadata) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } + func (m *ProposalMetadata) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_ProposalMetadata.Marshal(b, m, deterministic) @@ -225,12 +240,15 @@ func (m *ProposalMetadata) XXX_Marshal(b []byte, deterministic bool) ([]byte, er return b[:n], nil } } + func (m *ProposalMetadata) XXX_Merge(src proto.Message) { xxx_messageInfo_ProposalMetadata.Merge(m, src) } + func (m *ProposalMetadata) XXX_Size() int { return m.Size() } + func (m *ProposalMetadata) XXX_DiscardUnknown() { xxx_messageInfo_ProposalMetadata.DiscardUnknown(m) } @@ -261,9 +279,11 @@ func (*RegisterERC20Proposal) ProtoMessage() {} func (*RegisterERC20Proposal) Descriptor() ([]byte, []int) { return fileDescriptor_668d5dc537f45142, []int{3} } + func (m *RegisterERC20Proposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } + func (m *RegisterERC20Proposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_RegisterERC20Proposal.Marshal(b, m, deterministic) @@ -276,12 +296,15 @@ func (m *RegisterERC20Proposal) XXX_Marshal(b []byte, deterministic bool) ([]byt return b[:n], nil } } + func (m *RegisterERC20Proposal) XXX_Merge(src proto.Message) { xxx_messageInfo_RegisterERC20Proposal.Merge(m, src) } + func (m *RegisterERC20Proposal) XXX_Size() int { return m.Size() } + func (m *RegisterERC20Proposal) XXX_DiscardUnknown() { xxx_messageInfo_RegisterERC20Proposal.DiscardUnknown(m) } @@ -327,9 +350,11 @@ func (*ToggleTokenConversionProposal) ProtoMessage() {} func (*ToggleTokenConversionProposal) Descriptor() ([]byte, []int) { return fileDescriptor_668d5dc537f45142, []int{4} } + func (m *ToggleTokenConversionProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } + func (m *ToggleTokenConversionProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_ToggleTokenConversionProposal.Marshal(b, m, deterministic) @@ -342,12 +367,15 @@ func (m *ToggleTokenConversionProposal) XXX_Marshal(b []byte, deterministic bool return b[:n], nil } } + func (m *ToggleTokenConversionProposal) XXX_Merge(src proto.Message) { xxx_messageInfo_ToggleTokenConversionProposal.Merge(m, src) } + func (m *ToggleTokenConversionProposal) XXX_Size() int { return m.Size() } + func (m *ToggleTokenConversionProposal) XXX_DiscardUnknown() { xxx_messageInfo_ToggleTokenConversionProposal.DiscardUnknown(m) } @@ -455,6 +483,7 @@ func (this *TokenPair) Equal(that interface{}) bool { } return true } + func (this *ToggleTokenConversionProposal) Equal(that interface{}) bool { if that == nil { return this == nil @@ -485,6 +514,7 @@ func (this *ToggleTokenConversionProposal) Equal(that interface{}) bool { } return true } + func (m *TokenPair) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -726,6 +756,7 @@ func encodeVarintErc20(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } + func (m *TokenPair) Size() (n int) { if m == nil { return 0 @@ -834,9 +865,11 @@ func (m *ToggleTokenConversionProposal) Size() (n int) { func sovErc20(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } + func sozErc20(x uint64) (n int) { return sovErc20(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } + func (m *TokenPair) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -990,6 +1023,7 @@ func (m *TokenPair) Unmarshal(dAtA []byte) error { } return nil } + func (m *RegisterCoinProposal) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -1138,6 +1172,7 @@ func (m *RegisterCoinProposal) Unmarshal(dAtA []byte) error { } return nil } + func (m *ProposalMetadata) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -1222,6 +1257,7 @@ func (m *ProposalMetadata) Unmarshal(dAtA []byte) error { } return nil } + func (m *RegisterERC20Proposal) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -1368,6 +1404,7 @@ func (m *RegisterERC20Proposal) Unmarshal(dAtA []byte) error { } return nil } + func (m *ToggleTokenConversionProposal) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -1514,6 +1551,7 @@ func (m *ToggleTokenConversionProposal) Unmarshal(dAtA []byte) error { } return nil } + func skipErc20(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/erc20/types/errors.go b/x/erc20/types/errors.go index a70be6dc94..7329ad2f9c 100644 --- a/x/erc20/types/errors.go +++ b/x/erc20/types/errors.go @@ -9,13 +9,19 @@ import ( // errors var ( - ErrERC20Disabled = errorsmod.Register(ModuleName, 2, "erc20 module is disabled") - ErrInternalTokenPair = errorsmod.Register(ModuleName, 3, "internal ethereum token mapping error") - ErrTokenPairNotFound = errorsmod.Register(ModuleName, 4, "token pair not found") - ErrTokenPairAlreadyExists = errorsmod.Register(ModuleName, 5, "token pair already exists") - ErrUndefinedOwner = errorsmod.Register(ModuleName, 6, "undefined owner of contract pair") - ErrBalanceInvariance = errorsmod.Register(ModuleName, 7, "post transfer balance invariant failed") - ErrUnexpectedEvent = errorsmod.Register(ModuleName, 8, "unexpected event") - ErrEVMCall = errorsmod.Register(ModuleName, 12, "EVM call unexpected error") - ErrERC20TokenPairDisabled = errorsmod.Register(ModuleName, 13, "erc20 token pair is disabled") + ErrERC20Disabled = errorsmod.Register(ModuleName, 2, "erc20 module is disabled") + ErrInternalTokenPair = errorsmod.Register(ModuleName, 3, "internal ethereum token mapping error") + ErrTokenPairNotFound = errorsmod.Register(ModuleName, 4, "token pair not found") + ErrTokenPairAlreadyExists = errorsmod.Register(ModuleName, 5, "token pair already exists") + ErrUndefinedOwner = errorsmod.Register(ModuleName, 6, "undefined owner of contract pair") + ErrBalanceInvariance = errorsmod.Register(ModuleName, 7, "post transfer balance invariant failed") + ErrUnexpectedEvent = errorsmod.Register(ModuleName, 8, "unexpected event") + ErrABIPack = errorsmod.Register(ModuleName, 9, "contract ABI pack failed") + ErrABIUnpack = errorsmod.Register(ModuleName, 10, "contract ABI unpack failed") + ErrEVMDenom = errorsmod.Register(ModuleName, 11, "EVM denomination registration") + ErrEVMCall = errorsmod.Register(ModuleName, 12, "EVM call unexpected error") + ErrERC20TokenPairDisabled = errorsmod.Register(ModuleName, 13, "erc20 token pair is disabled") + ErrInvalidIBC = errorsmod.Register(ModuleName, 14, "invalid IBC transaction") + ErrTokenPairOwnedByModule = errorsmod.Register(ModuleName, 15, "token pair owned by module") + ErrNativeConversionDisabled = errorsmod.Register(ModuleName, 16, "native coins manual conversion is disabled") ) diff --git a/x/erc20/types/events.go b/x/erc20/types/events.go index 00d1d97722..67d2c4b456 100644 --- a/x/erc20/types/events.go +++ b/x/erc20/types/events.go @@ -11,19 +11,15 @@ import ( // erc20 events const ( - EventTypeTokenLock = "token_lock" - EventTypeTokenUnlock = "token_unlock" - EventTypeMint = "mint" - EventTypeConvertCoin = "convert_coin" - EventTypeConvertERC20 = "convert_erc20" - EventTypeBurn = "burn" - EventTypeRegisterCoin = "register_coin" - EventTypeRegisterERC20 = "register_erc20" - EventTypeToggleTokenConversion = "toggle_token_conversion" // #nosec + EventTypeConvertERC20 = "convert_erc20" + EventTypeRegisterERC20 = "register_erc20" + EventTypeToggleTokenConversion = "toggle_token_conversion" // #nosec + EventTypeRegisterERC20Extension = "register_erc20_extension" - AttributeKeyCosmosCoin = "cosmos_coin" - AttributeKeyERC20Token = "erc20_token" // #nosec - AttributeKeyReceiver = "receiver" + AttributeCoinSourceChannel = "source_channel" + AttributeKeyCosmosCoin = "cosmos_coin" + AttributeKeyERC20Token = "erc20_token" // #nosec + AttributeKeyReceiver = "receiver" ) // LogTransfer Event type for Transfer(address from, address to, uint256 value) diff --git a/x/erc20/types/genesis.go b/x/erc20/types/genesis.go index d6c55951ae..0b9b3133e1 100644 --- a/x/erc20/types/genesis.go +++ b/x/erc20/types/genesis.go @@ -3,7 +3,20 @@ package types -import "fmt" +import ( + "fmt" + + "github.com/evmos/evmos/v18/utils" +) + +var DefaultTokenPairs = []TokenPair{ + { + Erc20Address: WEVMOSContractMainnet, + Denom: utils.BaseDenom, + Enabled: true, + ContractOwner: OWNER_MODULE, + }, +} // NewGenesisState creates a new genesis state. func NewGenesisState(params Params, pairs []TokenPair) GenesisState { @@ -17,12 +30,14 @@ func NewGenesisState(params Params, pairs []TokenPair) GenesisState { // default params and chain config values. func DefaultGenesisState() *GenesisState { return &GenesisState{ - Params: DefaultParams(), + Params: DefaultParams(), + TokenPairs: DefaultTokenPairs, } } // Validate performs basic genesis state validation returning an error upon any // failure. +// TODO: Validate that the precompiles have a corresponding token pair func (gs GenesisState) Validate() error { seenErc20 := make(map[string]bool) seenDenom := make(map[string]bool) @@ -43,5 +58,37 @@ func (gs GenesisState) Validate() error { seenDenom[b.Denom] = true } - return gs.Params.Validate() + // Check if params are valid + if err := gs.Params.Validate(); err != nil { + return fmt.Errorf("invalid params on genesis: %w", err) + } + + // Check if active precompiles have a corresponding token pair + if err := validatePrecompiles(gs.TokenPairs, gs.Params.DynamicPrecompiles); err != nil { + return fmt.Errorf("invalid dynamic precompiles on genesis: %w", err) + } + + if err := validatePrecompiles(gs.TokenPairs, gs.Params.NativePrecompiles); err != nil { + return fmt.Errorf("invalid native precompiles on genesis: %w", err) + } + return nil +} + +// validatePrecompiles checks if every precompile has a corresponding enabled token pair +func validatePrecompiles(tokenPairs []TokenPair, precompiles []string) error { + for _, precompile := range precompiles { + if !hasActiveTokenPair(tokenPairs, precompile) { + return fmt.Errorf("precompile address '%s' not found in token pairs", precompile) + } + } + return nil +} + +func hasActiveTokenPair(pairs []TokenPair, address string) bool { + for _, p := range pairs { + if p.Erc20Address == address && p.Enabled { + return true + } + } + return false } diff --git a/x/erc20/types/genesis.pb.go b/x/erc20/types/genesis.pb.go index 4f0a801dbc..71e50a7a6f 100644 --- a/x/erc20/types/genesis.pb.go +++ b/x/erc20/types/genesis.pb.go @@ -82,9 +82,12 @@ func (m *GenesisState) GetTokenPairs() []TokenPair { type Params struct { // enable_erc20 is the parameter to enable the conversion of Cosmos coins <--> ERC20 tokens. EnableErc20 bool `protobuf:"varint,1,opt,name=enable_erc20,json=enableErc20,proto3" json:"enable_erc20,omitempty"` - // enable_evm_hook is the parameter to enable the EVM hook that converts an ERC20 token to a Cosmos - // Coin by transferring the Tokens through a MsgEthereumTx to the ModuleAddress Ethereum address. - EnableEVMHook bool `protobuf:"varint,2,opt,name=enable_evm_hook,json=enableEvmHook,proto3" json:"enable_evm_hook,omitempty"` + // native_precompiles defines the slice of hex addresses of the + // active precompiles that are used to interact with native staking coins as ERC20s + NativePrecompiles []string `protobuf:"bytes,3,rep,name=native_precompiles,json=nativePrecompiles,proto3" json:"native_precompiles,omitempty"` + // dynamic_precompiles defines the slice of hex addresses of the + // active precompiles that are used to interact with Bank coins as ERC20s + DynamicPrecompiles []string `protobuf:"bytes,4,rep,name=dynamic_precompiles,json=dynamicPrecompiles,proto3" json:"dynamic_precompiles,omitempty"` } func (m *Params) Reset() { *m = Params{} } @@ -127,11 +130,18 @@ func (m *Params) GetEnableErc20() bool { return false } -func (m *Params) GetEnableEVMHook() bool { +func (m *Params) GetNativePrecompiles() []string { if m != nil { - return m.EnableEVMHook + return m.NativePrecompiles } - return false + return nil +} + +func (m *Params) GetDynamicPrecompiles() []string { + if m != nil { + return m.DynamicPrecompiles + } + return nil } func init() { @@ -142,26 +152,27 @@ func init() { func init() { proto.RegisterFile("evmos/erc20/v1/genesis.proto", fileDescriptor_2f4674601b0d6987) } var fileDescriptor_2f4674601b0d6987 = []byte{ - // 302 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x49, 0x2d, 0xcb, 0xcd, - 0x2f, 0xd6, 0x4f, 0x2d, 0x4a, 0x36, 0x32, 0xd0, 0x2f, 0x33, 0xd4, 0x4f, 0x4f, 0xcd, 0x4b, 0x2d, - 0xce, 0x2c, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x03, 0xcb, 0xea, 0x81, 0x65, 0xf5, - 0xca, 0x0c, 0xa5, 0xa4, 0xd0, 0x54, 0x43, 0x24, 0xc0, 0x6a, 0xa5, 0x44, 0xd2, 0xf3, 0xd3, 0xf3, - 0xc1, 0x4c, 0x7d, 0x10, 0x0b, 0x22, 0xaa, 0xd4, 0xc6, 0xc8, 0xc5, 0xe3, 0x0e, 0x31, 0x33, 0xb8, - 0x24, 0xb1, 0x24, 0x55, 0xc8, 0x84, 0x8b, 0xad, 0x20, 0xb1, 0x28, 0x31, 0xb7, 0x58, 0x82, 0x51, - 0x81, 0x51, 0x83, 0xdb, 0x48, 0x4c, 0x0f, 0xd5, 0x0e, 0xbd, 0x00, 0xb0, 0xac, 0x13, 0xcb, 0x89, - 0x7b, 0xf2, 0x0c, 0x41, 0x50, 0xb5, 0x42, 0x0e, 0x5c, 0xdc, 0x25, 0xf9, 0xd9, 0xa9, 0x79, 0xf1, - 0x05, 0x89, 0x99, 0x45, 0xc5, 0x12, 0x4c, 0x0a, 0xcc, 0x1a, 0xdc, 0x46, 0x92, 0xe8, 0x5a, 0x43, - 0x40, 0x4a, 0x02, 0x12, 0x33, 0x8b, 0xa0, 0xba, 0xb9, 0x4a, 0x60, 0x02, 0xc5, 0x4a, 0x69, 0x5c, - 0x6c, 0x10, 0x93, 0x85, 0x14, 0xb9, 0x78, 0x52, 0xf3, 0x12, 0x93, 0x72, 0x52, 0xe3, 0xc1, 0x1a, - 0xc1, 0xee, 0xe0, 0x08, 0xe2, 0x86, 0x88, 0xb9, 0x82, 0x84, 0x84, 0x2c, 0xb9, 0xf8, 0x61, 0x4a, - 0xca, 0x72, 0xe3, 0x33, 0xf2, 0xf3, 0xb3, 0x25, 0x98, 0x40, 0xaa, 0x9c, 0x04, 0x1f, 0xdd, 0x93, - 0xe7, 0x75, 0x85, 0xa8, 0x0c, 0xf3, 0xf5, 0xc8, 0xcf, 0xcf, 0x0e, 0xe2, 0x85, 0x6a, 0x2c, 0xcb, - 0x05, 0x71, 0x9d, 0x9c, 0x4e, 0x3c, 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, 0x39, - 0xc6, 0x09, 0x8f, 0xe5, 0x18, 0x2e, 0x3c, 0x96, 0x63, 0xb8, 0xf1, 0x58, 0x8e, 0x21, 0x4a, 0x23, - 0x3d, 0xb3, 0x24, 0xa3, 0x34, 0x49, 0x2f, 0x39, 0x3f, 0x57, 0x1f, 0x1a, 0x8e, 0x60, 0xb2, 0xcc, - 0xd0, 0x42, 0xbf, 0x02, 0x1a, 0xa6, 0x25, 0x95, 0x05, 0xa9, 0xc5, 0x49, 0x6c, 0xe0, 0xb0, 0x33, - 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0xee, 0x86, 0xeb, 0x8e, 0x9d, 0x01, 0x00, 0x00, + // 320 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x5c, 0x90, 0x41, 0x4b, 0xc3, 0x30, + 0x14, 0xc7, 0x9b, 0x75, 0x8c, 0x99, 0x0e, 0xd1, 0x28, 0x32, 0x87, 0xd4, 0xb9, 0x53, 0x2f, 0x36, + 0x6e, 0x7a, 0xf0, 0x28, 0x03, 0x11, 0x3c, 0x8d, 0xe9, 0xc9, 0xcb, 0xc8, 0xea, 0xa3, 0x06, 0xd7, + 0x26, 0x24, 0xb1, 0xb8, 0x2f, 0xe0, 0x59, 0xbf, 0xd5, 0x8e, 0x3b, 0x7a, 0x12, 0xd9, 0xbe, 0x88, + 0x2c, 0xa9, 0xe8, 0x76, 0x29, 0x8f, 0xff, 0xef, 0xf7, 0x7f, 0x0d, 0x0f, 0x1f, 0x41, 0x91, 0x09, + 0x4d, 0x41, 0x25, 0xbd, 0x33, 0x5a, 0x74, 0x69, 0x0a, 0x39, 0x68, 0xae, 0x63, 0xa9, 0x84, 0x11, + 0x64, 0xdb, 0xd2, 0xd8, 0xd2, 0xb8, 0xe8, 0xb6, 0x5a, 0x1b, 0xb6, 0x03, 0xd6, 0x6d, 0xed, 0xa7, + 0x22, 0x15, 0x76, 0xa4, 0xab, 0xc9, 0xa5, 0x9d, 0x37, 0x84, 0x1b, 0x37, 0x6e, 0xe7, 0x9d, 0x61, + 0x06, 0xc8, 0x05, 0xae, 0x49, 0xa6, 0x58, 0xa6, 0x9b, 0xa8, 0x8d, 0xa2, 0xa0, 0x77, 0x10, 0xaf, + 0xff, 0x23, 0x1e, 0x58, 0xda, 0xaf, 0xce, 0xbe, 0x8e, 0xbd, 0x61, 0xe9, 0x92, 0x2b, 0x1c, 0x18, + 0xf1, 0x0c, 0xf9, 0x48, 0x32, 0xae, 0x74, 0xb3, 0xd2, 0xf6, 0xa3, 0xa0, 0x77, 0xb8, 0x59, 0xbd, + 0x5f, 0x29, 0x03, 0xc6, 0x55, 0xd9, 0xc6, 0xe6, 0x37, 0xd0, 0x9d, 0x0f, 0x84, 0x6b, 0x6e, 0x35, + 0x39, 0xc1, 0x0d, 0xc8, 0xd9, 0x78, 0x02, 0x23, 0xdb, 0xb4, 0x0f, 0xa9, 0x0f, 0x03, 0x97, 0x5d, + 0xaf, 0x22, 0x72, 0x8a, 0x49, 0xce, 0x0c, 0x2f, 0x60, 0x24, 0x15, 0x24, 0x22, 0x93, 0x7c, 0x02, + 0xba, 0xe9, 0xb7, 0xfd, 0x68, 0x6b, 0xb8, 0xeb, 0xc8, 0xe0, 0x0f, 0x10, 0x8a, 0xf7, 0x1e, 0xa7, + 0x39, 0xcb, 0x78, 0xb2, 0xe6, 0x57, 0xad, 0x4f, 0x4a, 0xf4, 0xaf, 0x70, 0x5b, 0xad, 0x57, 0x76, + 0xfc, 0x7e, 0x7f, 0xb6, 0x08, 0xd1, 0x7c, 0x11, 0xa2, 0xef, 0x45, 0x88, 0xde, 0x97, 0xa1, 0x37, + 0x5f, 0x86, 0xde, 0xe7, 0x32, 0xf4, 0x1e, 0xa2, 0x94, 0x9b, 0xa7, 0x97, 0x71, 0x9c, 0x88, 0x8c, + 0x96, 0x37, 0xb7, 0xdf, 0xa2, 0x7b, 0x49, 0x5f, 0xcb, 0xfb, 0x9b, 0xa9, 0x04, 0x3d, 0xae, 0xd9, + 0x3b, 0x9f, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xa3, 0xe9, 0x91, 0xc9, 0x01, 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { @@ -231,15 +242,23 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if m.EnableEVMHook { - i-- - if m.EnableEVMHook { - dAtA[i] = 1 - } else { - dAtA[i] = 0 + if len(m.DynamicPrecompiles) > 0 { + for iNdEx := len(m.DynamicPrecompiles) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.DynamicPrecompiles[iNdEx]) + copy(dAtA[i:], m.DynamicPrecompiles[iNdEx]) + i = encodeVarintGenesis(dAtA, i, uint64(len(m.DynamicPrecompiles[iNdEx]))) + i-- + dAtA[i] = 0x22 + } + } + if len(m.NativePrecompiles) > 0 { + for iNdEx := len(m.NativePrecompiles) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.NativePrecompiles[iNdEx]) + copy(dAtA[i:], m.NativePrecompiles[iNdEx]) + i = encodeVarintGenesis(dAtA, i, uint64(len(m.NativePrecompiles[iNdEx]))) + i-- + dAtA[i] = 0x1a } - i-- - dAtA[i] = 0x10 } if m.EnableErc20 { i-- @@ -291,8 +310,17 @@ func (m *Params) Size() (n int) { if m.EnableErc20 { n += 2 } - if m.EnableEVMHook { - n += 2 + if len(m.NativePrecompiles) > 0 { + for _, s := range m.NativePrecompiles { + l = len(s) + n += 1 + l + sovGenesis(uint64(l)) + } + } + if len(m.DynamicPrecompiles) > 0 { + for _, s := range m.DynamicPrecompiles { + l = len(s) + n += 1 + l + sovGenesis(uint64(l)) + } } return n } @@ -469,11 +497,11 @@ func (m *Params) Unmarshal(dAtA []byte) error { } } m.EnableErc20 = bool(v != 0) - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field EnableEVMHook", wireType) + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NativePrecompiles", wireType) } - var v int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenesis @@ -483,12 +511,56 @@ func (m *Params) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.NativePrecompiles = append(m.NativePrecompiles, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DynamicPrecompiles", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - m.EnableEVMHook = bool(v != 0) + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DynamicPrecompiles = append(m.DynamicPrecompiles, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenesis(dAtA[iNdEx:]) diff --git a/x/erc20/types/genesis_test.go b/x/erc20/types/genesis_test.go index d1b00061c3..0530c711ac 100644 --- a/x/erc20/types/genesis_test.go +++ b/x/erc20/types/genesis_test.go @@ -3,6 +3,7 @@ package types_test import ( "testing" + "github.com/evmos/evmos/v18/utils" "github.com/evmos/evmos/v18/x/erc20/types" "github.com/stretchr/testify/suite" ) @@ -19,7 +20,7 @@ func TestGenesisTestSuite(t *testing.T) { } func (suite *GenesisTestSuite) TestValidateGenesis() { - newGen := types.NewGenesisState(types.DefaultParams(), []types.TokenPair{}) + newGen := types.NewGenesisState(types.DefaultParams(), types.DefaultTokenPairs) testCases := []struct { name string @@ -40,7 +41,7 @@ func (suite *GenesisTestSuite) TestValidateGenesis() { name: "valid genesis", genState: &types.GenesisState{ Params: types.DefaultParams(), - TokenPairs: []types.TokenPair{}, + TokenPairs: types.DefaultTokenPairs, }, expPass: true, }, @@ -54,6 +55,11 @@ func (suite *GenesisTestSuite) TestValidateGenesis() { Denom: "usdt", Enabled: true, }, + { + Erc20Address: types.WEVMOSContractMainnet, + Denom: utils.BaseDenom, + Enabled: true, + }, }, }, expPass: true, @@ -73,6 +79,11 @@ func (suite *GenesisTestSuite) TestValidateGenesis() { Denom: "usdt", Enabled: true, }, + { + Erc20Address: types.WEVMOSContractMainnet, + Denom: utils.BaseDenom, + Enabled: true, + }, }, }, expPass: false, @@ -92,6 +103,11 @@ func (suite *GenesisTestSuite) TestValidateGenesis() { Denom: "usdt2", Enabled: true, }, + { + Erc20Address: types.WEVMOSContractMainnet, + Denom: utils.BaseDenom, + Enabled: true, + }, }, }, expPass: false, @@ -111,12 +127,36 @@ func (suite *GenesisTestSuite) TestValidateGenesis() { Denom: "usdt", Enabled: true, }, + { + Erc20Address: types.WEVMOSContractMainnet, + Denom: utils.BaseDenom, + Enabled: true, + }, }, }, expPass: false, }, { name: "invalid genesis - invalid token pair", + genState: &types.GenesisState{ + Params: types.DefaultParams(), + TokenPairs: []types.TokenPair{ + { + Erc20Address: "0xinvalidaddress", + Denom: "bad", + Enabled: true, + }, + { + Erc20Address: types.WEVMOSContractMainnet, + Denom: utils.BaseDenom, + Enabled: true, + }, + }, + }, + expPass: false, + }, + { + name: "invalid genesis - missing wevmos token pair", genState: &types.GenesisState{ Params: types.DefaultParams(), TokenPairs: []types.TokenPair{ diff --git a/x/erc20/types/interfaces.go b/x/erc20/types/interfaces.go index 14eb8c866b..c949b3f6c1 100644 --- a/x/erc20/types/interfaces.go +++ b/x/erc20/types/interfaces.go @@ -9,8 +9,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" "github.com/evmos/evmos/v18/x/evm/core/vm" @@ -36,24 +36,10 @@ type EVMKeeper interface { GetAccountWithoutBalance(ctx sdk.Context, addr common.Address) *statedb.Account EstimateGasInternal(c context.Context, req *evmtypes.EthCallRequest, fromType evmtypes.CallType) (*evmtypes.EstimateGasResponse, error) ApplyMessage(ctx sdk.Context, msg core.Message, tracer vm.EVMLogger, commit bool) (*evmtypes.MsgEthereumTxResponse, error) - AddEVMExtensions(ctx sdk.Context, precompiles ...vm.PrecompiledContract) error DeleteAccount(ctx sdk.Context, addr common.Address) error - IsAvailablePrecompile(addr common.Address) bool - CallEVMWithData( - ctx sdk.Context, - from common.Address, - contract *common.Address, - data []byte, - commit bool, - ) (*evmtypes.MsgEthereumTxResponse, error) - CallEVM( - ctx sdk.Context, - abi abi.ABI, - from, contract common.Address, - commit bool, - method string, - args ...interface{}, - ) (*evmtypes.MsgEthereumTxResponse, error) + IsAvailableStaticPrecompile(params *evmtypes.Params, address common.Address) bool + CallEVM(ctx sdk.Context, abi abi.ABI, from, contract common.Address, commit bool, method string, args ...interface{}) (*evmtypes.MsgEthereumTxResponse, error) + CallEVMWithData(ctx sdk.Context, from common.Address, contract *common.Address, data []byte, commit bool) (*evmtypes.MsgEthereumTxResponse, error) } type ( diff --git a/x/erc20/types/mocks/AccountKeeper.go b/x/erc20/types/mocks/AccountKeeper.go new file mode 100644 index 0000000000..a23107d9f5 --- /dev/null +++ b/x/erc20/types/mocks/AccountKeeper.go @@ -0,0 +1,79 @@ +// Code generated by mockery v2.42.1. DO NOT EDIT. + +package mocks + +import ( + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + + mock "github.com/stretchr/testify/mock" + + types "github.com/cosmos/cosmos-sdk/types" +) + +// AccountKeeper is an autogenerated mock type for the AccountKeeper type +type AccountKeeper struct { + mock.Mock +} + +// GetAccount provides a mock function with given fields: _a0, _a1 +func (_m *AccountKeeper) GetAccount(_a0 types.Context, _a1 types.AccAddress) authtypes.AccountI { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for GetAccount") + } + + var r0 authtypes.AccountI + if rf, ok := ret.Get(0).(func(types.Context, types.AccAddress) authtypes.AccountI); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(authtypes.AccountI) + } + } + + return r0 +} + +// GetSequence provides a mock function with given fields: _a0, _a1 +func (_m *AccountKeeper) GetSequence(_a0 types.Context, _a1 types.AccAddress) (uint64, error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for GetSequence") + } + + var r0 uint64 + var r1 error + if rf, ok := ret.Get(0).(func(types.Context, types.AccAddress) (uint64, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(types.Context, types.AccAddress) uint64); ok { + r0 = rf(_a0, _a1) + } else { + r0 = ret.Get(0).(uint64) + } + + if rf, ok := ret.Get(1).(func(types.Context, types.AccAddress) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// NewAccountKeeper creates a new instance of AccountKeeper. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewAccountKeeper(t interface { + mock.TestingT + Cleanup(func()) +}, +) *AccountKeeper { + mock := &AccountKeeper{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/x/erc20/types/mocks/EVMKeeper.go b/x/erc20/types/mocks/EVMKeeper.go index 356055dc3b..b16493e705 100644 --- a/x/erc20/types/mocks/EVMKeeper.go +++ b/x/erc20/types/mocks/EVMKeeper.go @@ -26,31 +26,6 @@ type EVMKeeper struct { mock.Mock } -// AddEVMExtensions provides a mock function with given fields: ctx, precompiles -func (_m *EVMKeeper) AddEVMExtensions(ctx types.Context, precompiles ...vm.PrecompiledContract) error { - _va := make([]interface{}, len(precompiles)) - for _i := range precompiles { - _va[_i] = precompiles[_i] - } - var _ca []interface{} - _ca = append(_ca, ctx) - _ca = append(_ca, _va...) - ret := _m.Called(_ca...) - - if len(ret) == 0 { - panic("no return value specified for AddEVMExtensions") - } - - var r0 error - if rf, ok := ret.Get(0).(func(types.Context, ...vm.PrecompiledContract) error); ok { - r0 = rf(ctx, precompiles...) - } else { - r0 = ret.Error(0) - } - - return r0 -} - // ApplyMessage provides a mock function with given fields: ctx, msg, tracer, commit func (_m *EVMKeeper) ApplyMessage(ctx types.Context, msg core.Message, tracer vm.EVMLogger, commit bool) (*evmtypes.MsgEthereumTxResponse, error) { ret := _m.Called(ctx, msg, tracer, commit) @@ -230,17 +205,17 @@ func (_m *EVMKeeper) GetParams(ctx types.Context) evmtypes.Params { return r0 } -// IsAvailablePrecompile provides a mock function with given fields: addr -func (_m *EVMKeeper) IsAvailablePrecompile(addr common.Address) bool { - ret := _m.Called(addr) +// IsAvailableStaticPrecompile provides a mock function with given fields: params, address +func (_m *EVMKeeper) IsAvailableStaticPrecompile(params *evmtypes.Params, address common.Address) bool { + ret := _m.Called(params, address) if len(ret) == 0 { - panic("no return value specified for IsAvailablePrecompile") + panic("no return value specified for IsAvailableStaticPrecompile") } var r0 bool - if rf, ok := ret.Get(0).(func(common.Address) bool); ok { - r0 = rf(addr) + if rf, ok := ret.Get(0).(func(*evmtypes.Params, common.Address) bool); ok { + r0 = rf(params, address) } else { r0 = ret.Get(0).(bool) } diff --git a/x/erc20/types/mocks/MsgClient.go b/x/erc20/types/mocks/MsgClient.go new file mode 100644 index 0000000000..4a0255dd20 --- /dev/null +++ b/x/erc20/types/mocks/MsgClient.go @@ -0,0 +1,107 @@ +// Code generated by mockery v2.42.1. DO NOT EDIT. + +package mocks + +import ( + context "context" + + grpc "google.golang.org/grpc" + + mock "github.com/stretchr/testify/mock" + + types "github.com/evmos/evmos/v18/x/erc20/types" +) + +// MsgClient is an autogenerated mock type for the MsgClient type +type MsgClient struct { + mock.Mock +} + +// ConvertERC20 provides a mock function with given fields: ctx, in, opts +func (_m *MsgClient) ConvertERC20(ctx context.Context, in *types.MsgConvertERC20, opts ...grpc.CallOption) (*types.MsgConvertERC20Response, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for ConvertERC20") + } + + var r0 *types.MsgConvertERC20Response + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.MsgConvertERC20, ...grpc.CallOption) (*types.MsgConvertERC20Response, error)); ok { + return rf(ctx, in, opts...) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.MsgConvertERC20, ...grpc.CallOption) *types.MsgConvertERC20Response); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.MsgConvertERC20Response) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *types.MsgConvertERC20, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// UpdateParams provides a mock function with given fields: ctx, in, opts +func (_m *MsgClient) UpdateParams(ctx context.Context, in *types.MsgUpdateParams, opts ...grpc.CallOption) (*types.MsgUpdateParamsResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for UpdateParams") + } + + var r0 *types.MsgUpdateParamsResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.MsgUpdateParams, ...grpc.CallOption) (*types.MsgUpdateParamsResponse, error)); ok { + return rf(ctx, in, opts...) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.MsgUpdateParams, ...grpc.CallOption) *types.MsgUpdateParamsResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.MsgUpdateParamsResponse) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *types.MsgUpdateParams, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// NewMsgClient creates a new instance of MsgClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewMsgClient(t interface { + mock.TestingT + Cleanup(func()) +}, +) *MsgClient { + mock := &MsgClient{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/x/erc20/types/mocks/MsgServer.go b/x/erc20/types/mocks/MsgServer.go new file mode 100644 index 0000000000..23706af86f --- /dev/null +++ b/x/erc20/types/mocks/MsgServer.go @@ -0,0 +1,90 @@ +// Code generated by mockery v2.42.1. DO NOT EDIT. + +package mocks + +import ( + context "context" + + types "github.com/evmos/evmos/v18/x/erc20/types" + mock "github.com/stretchr/testify/mock" +) + +// MsgServer is an autogenerated mock type for the MsgServer type +type MsgServer struct { + mock.Mock +} + +// ConvertERC20 provides a mock function with given fields: _a0, _a1 +func (_m *MsgServer) ConvertERC20(_a0 context.Context, _a1 *types.MsgConvertERC20) (*types.MsgConvertERC20Response, error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ConvertERC20") + } + + var r0 *types.MsgConvertERC20Response + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.MsgConvertERC20) (*types.MsgConvertERC20Response, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.MsgConvertERC20) *types.MsgConvertERC20Response); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.MsgConvertERC20Response) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *types.MsgConvertERC20) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// UpdateParams provides a mock function with given fields: _a0, _a1 +func (_m *MsgServer) UpdateParams(_a0 context.Context, _a1 *types.MsgUpdateParams) (*types.MsgUpdateParamsResponse, error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for UpdateParams") + } + + var r0 *types.MsgUpdateParamsResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.MsgUpdateParams) (*types.MsgUpdateParamsResponse, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.MsgUpdateParams) *types.MsgUpdateParamsResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.MsgUpdateParamsResponse) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *types.MsgUpdateParams) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// NewMsgServer creates a new instance of MsgServer. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewMsgServer(t interface { + mock.TestingT + Cleanup(func()) +}, +) *MsgServer { + mock := &MsgServer{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/x/erc20/types/mocks/QueryClient.go b/x/erc20/types/mocks/QueryClient.go new file mode 100644 index 0000000000..e2aa4a0637 --- /dev/null +++ b/x/erc20/types/mocks/QueryClient.go @@ -0,0 +1,144 @@ +// Code generated by mockery v2.42.1. DO NOT EDIT. + +package mocks + +import ( + context "context" + + grpc "google.golang.org/grpc" + + mock "github.com/stretchr/testify/mock" + + types "github.com/evmos/evmos/v18/x/erc20/types" +) + +// QueryClient is an autogenerated mock type for the QueryClient type +type QueryClient struct { + mock.Mock +} + +// Params provides a mock function with given fields: ctx, in, opts +func (_m *QueryClient) Params(ctx context.Context, in *types.QueryParamsRequest, opts ...grpc.CallOption) (*types.QueryParamsResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for Params") + } + + var r0 *types.QueryParamsResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryParamsRequest, ...grpc.CallOption) (*types.QueryParamsResponse, error)); ok { + return rf(ctx, in, opts...) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryParamsRequest, ...grpc.CallOption) *types.QueryParamsResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QueryParamsResponse) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryParamsRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// TokenPair provides a mock function with given fields: ctx, in, opts +func (_m *QueryClient) TokenPair(ctx context.Context, in *types.QueryTokenPairRequest, opts ...grpc.CallOption) (*types.QueryTokenPairResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for TokenPair") + } + + var r0 *types.QueryTokenPairResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryTokenPairRequest, ...grpc.CallOption) (*types.QueryTokenPairResponse, error)); ok { + return rf(ctx, in, opts...) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryTokenPairRequest, ...grpc.CallOption) *types.QueryTokenPairResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QueryTokenPairResponse) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryTokenPairRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// TokenPairs provides a mock function with given fields: ctx, in, opts +func (_m *QueryClient) TokenPairs(ctx context.Context, in *types.QueryTokenPairsRequest, opts ...grpc.CallOption) (*types.QueryTokenPairsResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for TokenPairs") + } + + var r0 *types.QueryTokenPairsResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryTokenPairsRequest, ...grpc.CallOption) (*types.QueryTokenPairsResponse, error)); ok { + return rf(ctx, in, opts...) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryTokenPairsRequest, ...grpc.CallOption) *types.QueryTokenPairsResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QueryTokenPairsResponse) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryTokenPairsRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// NewQueryClient creates a new instance of QueryClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewQueryClient(t interface { + mock.TestingT + Cleanup(func()) +}, +) *QueryClient { + mock := &QueryClient{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/x/erc20/types/mocks/QueryServer.go b/x/erc20/types/mocks/QueryServer.go new file mode 100644 index 0000000000..6ad641c655 --- /dev/null +++ b/x/erc20/types/mocks/QueryServer.go @@ -0,0 +1,120 @@ +// Code generated by mockery v2.42.1. DO NOT EDIT. + +package mocks + +import ( + context "context" + + types "github.com/evmos/evmos/v18/x/erc20/types" + mock "github.com/stretchr/testify/mock" +) + +// QueryServer is an autogenerated mock type for the QueryServer type +type QueryServer struct { + mock.Mock +} + +// Params provides a mock function with given fields: _a0, _a1 +func (_m *QueryServer) Params(_a0 context.Context, _a1 *types.QueryParamsRequest) (*types.QueryParamsResponse, error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for Params") + } + + var r0 *types.QueryParamsResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryParamsRequest) (*types.QueryParamsResponse, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryParamsRequest) *types.QueryParamsResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QueryParamsResponse) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryParamsRequest) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// TokenPair provides a mock function with given fields: _a0, _a1 +func (_m *QueryServer) TokenPair(_a0 context.Context, _a1 *types.QueryTokenPairRequest) (*types.QueryTokenPairResponse, error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for TokenPair") + } + + var r0 *types.QueryTokenPairResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryTokenPairRequest) (*types.QueryTokenPairResponse, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryTokenPairRequest) *types.QueryTokenPairResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QueryTokenPairResponse) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryTokenPairRequest) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// TokenPairs provides a mock function with given fields: _a0, _a1 +func (_m *QueryServer) TokenPairs(_a0 context.Context, _a1 *types.QueryTokenPairsRequest) (*types.QueryTokenPairsResponse, error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for TokenPairs") + } + + var r0 *types.QueryTokenPairsResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryTokenPairsRequest) (*types.QueryTokenPairsResponse, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryTokenPairsRequest) *types.QueryTokenPairsResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QueryTokenPairsResponse) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryTokenPairsRequest) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// NewQueryServer creates a new instance of QueryServer. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewQueryServer(t interface { + mock.TestingT + Cleanup(func()) +}, +) *QueryServer { + mock := &QueryServer{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/x/erc20/types/mocks/StakingKeeper.go b/x/erc20/types/mocks/StakingKeeper.go new file mode 100644 index 0000000000..f72791b9bf --- /dev/null +++ b/x/erc20/types/mocks/StakingKeeper.go @@ -0,0 +1,46 @@ +// Code generated by mockery v2.42.1. DO NOT EDIT. + +package mocks + +import ( + types "github.com/cosmos/cosmos-sdk/types" + mock "github.com/stretchr/testify/mock" +) + +// StakingKeeper is an autogenerated mock type for the StakingKeeper type +type StakingKeeper struct { + mock.Mock +} + +// BondDenom provides a mock function with given fields: ctx +func (_m *StakingKeeper) BondDenom(ctx types.Context) string { + ret := _m.Called(ctx) + + if len(ret) == 0 { + panic("no return value specified for BondDenom") + } + + var r0 string + if rf, ok := ret.Get(0).(func(types.Context) string); ok { + r0 = rf(ctx) + } else { + r0 = ret.Get(0).(string) + } + + return r0 +} + +// NewStakingKeeper creates a new instance of StakingKeeper. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewStakingKeeper(t interface { + mock.TestingT + Cleanup(func()) +}, +) *StakingKeeper { + mock := &StakingKeeper{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/x/erc20/types/mocks/Subspace.go b/x/erc20/types/mocks/Subspace.go new file mode 100644 index 0000000000..4ea2d8895c --- /dev/null +++ b/x/erc20/types/mocks/Subspace.go @@ -0,0 +1,53 @@ +// Code generated by mockery v2.42.1. DO NOT EDIT. + +package mocks + +import ( + paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" + mock "github.com/stretchr/testify/mock" + + types "github.com/cosmos/cosmos-sdk/types" +) + +// Subspace is an autogenerated mock type for the Subspace type +type Subspace struct { + mock.Mock +} + +// GetParamSet provides a mock function with given fields: ctx, ps +func (_m *Subspace) GetParamSet(ctx types.Context, ps paramstypes.ParamSet) { + _m.Called(ctx, ps) +} + +// WithKeyTable provides a mock function with given fields: table +func (_m *Subspace) WithKeyTable(table paramstypes.KeyTable) paramstypes.Subspace { + ret := _m.Called(table) + + if len(ret) == 0 { + panic("no return value specified for WithKeyTable") + } + + var r0 paramstypes.Subspace + if rf, ok := ret.Get(0).(func(paramstypes.KeyTable) paramstypes.Subspace); ok { + r0 = rf(table) + } else { + r0 = ret.Get(0).(paramstypes.Subspace) + } + + return r0 +} + +// NewSubspace creates a new instance of Subspace. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewSubspace(t interface { + mock.TestingT + Cleanup(func()) +}, +) *Subspace { + mock := &Subspace{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/x/erc20/types/msg.go b/x/erc20/types/msg.go index 366efb5c50..8b3f735b87 100644 --- a/x/erc20/types/msg.go +++ b/x/erc20/types/msg.go @@ -9,68 +9,18 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" - ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" "github.com/ethereum/go-ethereum/common" ) var ( - _ sdk.Msg = &MsgConvertCoin{} _ sdk.Msg = &MsgConvertERC20{} _ sdk.Msg = &MsgUpdateParams{} ) const ( - TypeMsgConvertCoin = "convert_coin" TypeMsgConvertERC20 = "convert_ERC20" ) -// NewMsgConvertCoin creates a new instance of MsgConvertCoin -func NewMsgConvertCoin(coin sdk.Coin, receiver common.Address, sender sdk.AccAddress) *MsgConvertCoin { //nolint: interfacer - return &MsgConvertCoin{ - Coin: coin, - Receiver: receiver.Hex(), - Sender: sender.String(), - } -} - -// Route should return the name of the module -func (msg MsgConvertCoin) Route() string { return RouterKey } - -// Type should return the action -func (msg MsgConvertCoin) Type() string { return TypeMsgConvertCoin } - -// ValidateBasic runs stateless checks on the message -func (msg MsgConvertCoin) ValidateBasic() error { - if err := ValidateErc20Denom(msg.Coin.Denom); err != nil { - if err := ibctransfertypes.ValidateIBCDenom(msg.Coin.Denom); err != nil { - return err - } - } - - if !msg.Coin.Amount.IsPositive() { - return errorsmod.Wrapf(errortypes.ErrInvalidCoins, "cannot mint a non-positive amount") - } - _, err := sdk.AccAddressFromBech32(msg.Sender) - if err != nil { - return errorsmod.Wrap(err, "invalid sender address") - } - if !common.IsHexAddress(msg.Receiver) { - return errorsmod.Wrapf(errortypes.ErrInvalidAddress, "invalid receiver hex address %s", msg.Receiver) - } - return nil -} - -// GetSignBytes encodes the message for signing -func (msg MsgConvertCoin) GetSignBytes() []byte { - return sdk.MustSortJSON(AminoCdc.MustMarshalJSON(&msg)) -} - -// GetSigners defines whose signature is required -func (msg MsgConvertCoin) GetSigners() []sdk.AccAddress { - addr := sdk.MustAccAddressFromBech32(msg.Sender) - return []sdk.AccAddress{addr} -} - // NewMsgConvertERC20 creates a new instance of MsgConvertERC20 func NewMsgConvertERC20(amount math.Int, receiver sdk.AccAddress, contract, sender common.Address) *MsgConvertERC20 { //nolint: interfacer return &MsgConvertERC20{ diff --git a/x/erc20/types/msg_test.go b/x/erc20/types/msg_test.go index 6e4b25fe8e..1ed880bb0a 100644 --- a/x/erc20/types/msg_test.go +++ b/x/erc20/types/msg_test.go @@ -24,125 +24,6 @@ func TestMsgsTestSuite(t *testing.T) { suite.Run(t, new(MsgsTestSuite)) } -func (suite *MsgsTestSuite) TestMsgConvertCoinGetters() { - msgInvalid := types.MsgConvertCoin{} - msg := types.NewMsgConvertCoin( - sdk.NewCoin("test", math.NewInt(100)), - utiltx.GenerateAddress(), - sdk.AccAddress(utiltx.GenerateAddress().Bytes()), - ) - suite.Require().Equal(types.RouterKey, msg.Route()) - suite.Require().Equal(types.TypeMsgConvertCoin, msg.Type()) - suite.Require().NotNil(msgInvalid.GetSignBytes()) - suite.Require().NotNil(msg.GetSigners()) -} - -func (suite *MsgsTestSuite) TestMsgConvertCoinNew() { - testCases := []struct { - msg string - coin sdk.Coin - receiver common.Address - sender sdk.AccAddress - expectPass bool - }{ - { - "msg convert coin - pass", - sdk.NewCoin("test", math.NewInt(100)), - utiltx.GenerateAddress(), - sdk.AccAddress(utiltx.GenerateAddress().Bytes()), - true, - }, - } - - for i, tc := range testCases { - tx := types.NewMsgConvertCoin(tc.coin, tc.receiver, tc.sender) - err := tx.ValidateBasic() - - if tc.expectPass { - suite.Require().NoError(err, "valid test %d failed: %s, %v", i, tc.msg) - } else { - suite.Require().Error(err, "invalid test %d passed: %s, %v", i, tc.msg) - } - } -} - -func (suite *MsgsTestSuite) TestMsgConvertCoin() { - testCases := []struct { - msg string - coin sdk.Coin - receiver string - sender string - expectPass bool - }{ - { - "invalid denom", - sdk.Coin{ - Denom: "", - Amount: math.NewInt(100), - }, - "0x0000", - utiltx.GenerateAddress().String(), - false, - }, - { - "negative coin amount", - sdk.Coin{ - Denom: "coin", - Amount: math.NewInt(-100), - }, - "0x0000", - utiltx.GenerateAddress().String(), - false, - }, - { - "msg convert coin - invalid sender", - sdk.NewCoin("coin", math.NewInt(100)), - utiltx.GenerateAddress().String(), - "evmosinvalid", - false, - }, - { - "msg convert coin - invalid receiver", - sdk.NewCoin("coin", math.NewInt(100)), - "0x0000", - sdk.AccAddress(utiltx.GenerateAddress().Bytes()).String(), - false, - }, - { - "msg convert coin - pass", - sdk.NewCoin("coin", math.NewInt(100)), - utiltx.GenerateAddress().String(), - sdk.AccAddress(utiltx.GenerateAddress().Bytes()).String(), - true, - }, - { - "msg convert coin - pass with `erc20/` denom", - sdk.NewCoin("erc20/0xdac17f958d2ee523a2206206994597c13d831ec7", math.NewInt(100)), - utiltx.GenerateAddress().String(), - sdk.AccAddress(utiltx.GenerateAddress().Bytes()).String(), - true, - }, - { - "msg convert coin - pass with `ibc/{hash}` denom", - sdk.NewCoin("ibc/7F1D3FCF4AE79E1554D670D1AD949A9BA4E4A3C76C63093E17E446A46061A7A2", math.NewInt(100)), - utiltx.GenerateAddress().String(), - sdk.AccAddress(utiltx.GenerateAddress().Bytes()).String(), - true, - }, - } - - for i, tc := range testCases { - tx := types.MsgConvertCoin{tc.coin, tc.receiver, tc.sender} - err := tx.ValidateBasic() - - if tc.expectPass { - suite.Require().NoError(err, "valid test %d failed: %s, %v", i, tc.msg) - } else { - suite.Require().Error(err, "invalid test %d passed: %s, %v", i, tc.msg) - } - } -} - func (suite *MsgsTestSuite) TestMsgConvertERC20Getters() { msgInvalid := types.MsgConvertERC20{} msg := types.NewMsgConvertERC20( diff --git a/x/erc20/types/params.go b/x/erc20/types/params.go index 08289494ff..4f34deebeb 100644 --- a/x/erc20/types/params.go +++ b/x/erc20/types/params.go @@ -4,30 +4,51 @@ package types import ( - fmt "fmt" + "fmt" + "slices" + + "github.com/evmos/evmos/v18/types" +) + +const ( + // WEVMOSContractMainnet is the WEVMOS contract address for mainnet + WEVMOSContractMainnet = "0xD4949664cD82660AaE99bEdc034a0deA8A0bd517" + // WEVMOSContractTestnet is the WEVMOS contract address for testnet + WEVMOSContractTestnet = "0xcc491f589b45d4a3c679016195b3fb87d7848210" ) // Parameter store key var ( - ParamStoreKeyEnableErc20 = []byte("EnableErc20") - ParamStoreKeyEnableEVMHook = []byte("EnableEVMHook") + ParamStoreKeyEnableErc20 = []byte("EnableErc20") + ParamStoreKeyDynamicPrecompiles = []byte("DynamicPrecompiles") + ParamStoreKeyNativePrecompiles = []byte("NativePrecompiles") + // DefaultNativePrecompiles defines the default precompiles for the wrapped native coin + // NOTE: If you modify this, make sure you modify it on the local_node genesis script as well + DefaultNativePrecompiles = []string{WEVMOSContractMainnet} + // DefaultDynamicPrecompiles defines the default active dynamic precompiles + DefaultDynamicPrecompiles []string ) // NewParams creates a new Params object func NewParams( enableErc20 bool, - enableEVMHook bool, + nativePrecompiles []string, + dynamicPrecompiles []string, ) Params { + slices.Sort(nativePrecompiles) + slices.Sort(dynamicPrecompiles) return Params{ - EnableErc20: enableErc20, - EnableEVMHook: enableEVMHook, + EnableErc20: enableErc20, + NativePrecompiles: nativePrecompiles, + DynamicPrecompiles: dynamicPrecompiles, } } func DefaultParams() Params { return Params{ - EnableErc20: true, - EnableEVMHook: true, + EnableErc20: true, + NativePrecompiles: DefaultNativePrecompiles, + DynamicPrecompiles: DefaultDynamicPrecompiles, } } @@ -41,9 +62,57 @@ func ValidateBool(i interface{}) error { } func (p Params) Validate() error { - if err := ValidateBool(p.EnableEVMHook); err != nil { + if err := ValidateBool(p.EnableErc20); err != nil { return err } - return ValidateBool(p.EnableErc20) + if err := ValidatePrecompiles(p.NativePrecompiles); err != nil { + return err + } + + if err := ValidatePrecompiles(p.DynamicPrecompiles); err != nil { + return err + } + + combined := p.DynamicPrecompiles + combined = append(combined, p.NativePrecompiles...) + return ValidatePrecompilesUniqueness(combined) +} + +// ValidatePrecompiles checks if the precompile addresses are valid and unique. +func ValidatePrecompiles(i interface{}) error { + precompiles, ok := i.([]string) + if !ok { + return fmt.Errorf("invalid precompile slice type: %T", i) + } + + for _, precompile := range precompiles { + if err := types.ValidateAddress(precompile); err != nil { + return fmt.Errorf("invalid precompile %s", precompile) + } + } + + // NOTE: Check that the precompiles are sorted. This is required + // to ensure determinism + if !slices.IsSorted(precompiles) { + return fmt.Errorf("precompiles need to be sorted: %s", precompiles) + } + return nil +} + +func ValidatePrecompilesUniqueness(i interface{}) error { + precompiles, ok := i.([]string) + if !ok { + return fmt.Errorf("invalid precompile slice type: %T", i) + } + + seenPrecompiles := make(map[string]struct{}) + for _, precompile := range precompiles { + if _, ok := seenPrecompiles[precompile]; ok { + return fmt.Errorf("duplicate precompile %s", precompile) + } + + seenPrecompiles[precompile] = struct{}{} + } + return nil } diff --git a/x/erc20/types/params_test.go b/x/erc20/types/params_test.go index 0eb487c933..9df87667b3 100644 --- a/x/erc20/types/params_test.go +++ b/x/erc20/types/params_test.go @@ -17,28 +17,118 @@ func TestParamsTestSuite(t *testing.T) { func (suite *ParamsTestSuite) TestParamsValidate() { testCases := []struct { - name string - params types.Params - expError bool + name string + malleate func() types.Params + expError bool + errContains string }{ - {"default", types.DefaultParams(), false}, + { + "default", + types.DefaultParams, + false, + "", + }, { "valid", - types.NewParams(true, true), + func() types.Params { return types.NewParams(true, []string{}, []string{}) }, + false, + "", + }, + { + "valid address - dynamic precompile", + func() types.Params { return types.NewParams(true, []string{}, []string{types.WEVMOSContractMainnet}) }, + false, + "", + }, + { + "valid address - native precompile", + func() types.Params { return types.NewParams(true, []string{types.WEVMOSContractMainnet}, []string{}) }, false, + "", + }, + { + "sorted address", + // order of creation shouldn't matter since it should be sorted when defining new param + func() types.Params { + return types.NewParams(true, []string{types.WEVMOSContractTestnet, types.WEVMOSContractMainnet}, []string{}) + }, + false, + "", + }, + { + "unsorted address", + // order of creation shouldn't matter since it should be sorted when defining new param + func() types.Params { + return types.NewParams(true, []string{types.WEVMOSContractMainnet, types.WEVMOSContractTestnet}, []string{}) + }, + false, + "", }, { "empty", - types.Params{}, + func() types.Params { return types.Params{} }, false, + "", + }, + { + "invalid address - native precompile", + func() types.Params { + return types.NewParams(true, []string{"qq"}, []string{}) + }, + true, + "invalid precompile", + }, + { + "invalid address - dynamic precompile", + func() types.Params { + return types.NewParams(true, []string{}, []string{"0xqq"}) + }, + true, + "invalid precompile", + }, + { + "repeated address in different params", + func() types.Params { + return types.NewParams(true, []string{types.WEVMOSContractMainnet}, []string{types.WEVMOSContractMainnet}) + }, + true, + "duplicate precompile", + }, + { + "repeated address - native precompiles", + func() types.Params { + return types.NewParams(true, []string{types.WEVMOSContractMainnet, types.WEVMOSContractMainnet}, []string{}) + }, + true, + "duplicate precompile", + }, + { + "repeated address - dynamic precompiles", + func() types.Params { + return types.NewParams(true, []string{}, []string{types.WEVMOSContractMainnet, types.WEVMOSContractMainnet}) + }, + true, + "duplicate precompile", + }, + { + "unsorted addresses", + func() types.Params { + params := types.DefaultParams() + params.NativePrecompiles = []string{types.WEVMOSContractTestnet, types.WEVMOSContractMainnet} + return params + }, + true, + "precompiles need to be sorted", }, } for _, tc := range testCases { - err := tc.params.Validate() + p := tc.malleate() + err := p.Validate() if tc.expError { suite.Require().Error(err, tc.name) + suite.Require().ErrorContains(err, tc.errContains) } else { suite.Require().NoError(err, tc.name) } diff --git a/x/erc20/types/token_pair.go b/x/erc20/types/token_pair.go index f066253a51..e3e0c1d63e 100644 --- a/x/erc20/types/token_pair.go +++ b/x/erc20/types/token_pair.go @@ -8,8 +8,27 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" evmostypes "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v18/utils" ) +// NewTokenPairSTRv2 creates a new TokenPair instance in the context of the +// Single Token Representation v2. +// +// It derives the ERC-20 address from the hex suffix of the IBC denomination +// (e.g. ibc/DF63978F803A2E27CA5CC9B7631654CCF0BBC788B3B7F0A10200508E37C70992). +func NewTokenPairSTRv2(denom string) (TokenPair, error) { + address, err := utils.GetIBCDenomAddress(denom) + if err != nil { + return TokenPair{}, err + } + return TokenPair{ + Erc20Address: address.String(), + Denom: denom, + Enabled: true, + ContractOwner: OWNER_MODULE, + }, nil +} + // NewTokenPair returns an instance of TokenPair func NewTokenPair(erc20Address common.Address, denom string, contractOwner Owner) TokenPair { return TokenPair{ @@ -46,8 +65,7 @@ func (tp TokenPair) IsNativeCoin() bool { return tp.ContractOwner == OWNER_MODULE } -// IsNativeERC20 returns true if the owner of the ERC20 contract not the -// erc20 module account +// IsNativeERC20 returns true if the owner of the ERC20 contract is an EOA. func (tp TokenPair) IsNativeERC20() bool { return tp.ContractOwner == OWNER_EXTERNAL } diff --git a/x/erc20/types/token_pair_test.go b/x/erc20/types/token_pair_test.go index 37c935b290..7cf6262321 100644 --- a/x/erc20/types/token_pair_test.go +++ b/x/erc20/types/token_pair_test.go @@ -156,3 +156,43 @@ func (suite *TokenPairTestSuite) TestIsNativeERC20() { } } } + +func (suite *TokenPairTestSuite) TestNewTokenPairSTRv2() { + testCases := []struct { + name string + denom string + expectPass bool + expectedError string + expectedPair types.TokenPair + }{ + { + name: "fail to register token pair - invalid denom (not ibc)", + denom: "testcoin", + expectPass: false, + expectedError: "does not have 'ibc/' prefix", + }, + { + name: "register token pair - ibc denom", + denom: "ibc/DF63978F803A2E27CA5CC9B7631654CCF0BBC788B3B7F0A10200508E37C70992", + expectPass: true, + expectedPair: types.TokenPair{ + Denom: "ibc/DF63978F803A2E27CA5CC9B7631654CCF0BBC788B3B7F0A10200508E37C70992", + Erc20Address: "0x631654CCF0BBC788b3b7F0a10200508e37c70992", + Enabled: true, + ContractOwner: types.OWNER_MODULE, + }, + }, + } + + for _, tc := range testCases { + tokenPair, err := types.NewTokenPairSTRv2(tc.denom) + if tc.expectPass { + suite.Require().NoError(err) + suite.Require().Equal(tokenPair, tc.expectedPair) + } else { + suite.Require().Error(err) + suite.Require().ErrorContains(err, tc.expectedError) + } + + } +} diff --git a/x/erc20/types/tx.pb.go b/x/erc20/types/tx.pb.go index dcb0c9aebf..f0b26de6ba 100644 --- a/x/erc20/types/tx.pb.go +++ b/x/erc20/types/tx.pb.go @@ -33,29 +33,31 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package -// MsgConvertCoin defines a Msg to convert a native Cosmos coin to a ERC20 token -type MsgConvertCoin struct { - // coin is a Cosmos coin whose denomination is registered in a token pair. The coin - // amount defines the amount of coins to convert. - Coin types.Coin `protobuf:"bytes,1,opt,name=coin,proto3" json:"coin"` - // receiver is the hex address to receive ERC20 token - Receiver string `protobuf:"bytes,2,opt,name=receiver,proto3" json:"receiver,omitempty"` - // sender is the cosmos bech32 address from the owner of the given Cosmos coins - Sender string `protobuf:"bytes,3,opt,name=sender,proto3" json:"sender,omitempty"` +// MsgConvertERC20 defines a Msg to convert a ERC20 token to a native Cosmos +// coin. +type MsgConvertERC20 struct { + // contract_address of an ERC20 token contract, that is registered in a token pair + ContractAddress string `protobuf:"bytes,1,opt,name=contract_address,json=contractAddress,proto3" json:"contract_address,omitempty"` + // amount of ERC20 tokens to convert + Amount cosmossdk_io_math.Int `protobuf:"bytes,2,opt,name=amount,proto3,customtype=cosmossdk.io/math.Int" json:"amount"` + // receiver is the bech32 address to receive native Cosmos coins + Receiver string `protobuf:"bytes,3,opt,name=receiver,proto3" json:"receiver,omitempty"` + // sender is the hex address from the owner of the given ERC20 tokens + Sender string `protobuf:"bytes,4,opt,name=sender,proto3" json:"sender,omitempty"` } -func (m *MsgConvertCoin) Reset() { *m = MsgConvertCoin{} } -func (m *MsgConvertCoin) String() string { return proto.CompactTextString(m) } -func (*MsgConvertCoin) ProtoMessage() {} -func (*MsgConvertCoin) Descriptor() ([]byte, []int) { +func (m *MsgConvertERC20) Reset() { *m = MsgConvertERC20{} } +func (m *MsgConvertERC20) String() string { return proto.CompactTextString(m) } +func (*MsgConvertERC20) ProtoMessage() {} +func (*MsgConvertERC20) Descriptor() ([]byte, []int) { return fileDescriptor_f8926fc6cb676914, []int{0} } -func (m *MsgConvertCoin) XXX_Unmarshal(b []byte) error { +func (m *MsgConvertERC20) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *MsgConvertCoin) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *MsgConvertERC20) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_MsgConvertCoin.Marshal(b, m, deterministic) + return xxx_messageInfo_MsgConvertERC20.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -65,55 +67,55 @@ func (m *MsgConvertCoin) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return b[:n], nil } } -func (m *MsgConvertCoin) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgConvertCoin.Merge(m, src) +func (m *MsgConvertERC20) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgConvertERC20.Merge(m, src) } -func (m *MsgConvertCoin) XXX_Size() int { +func (m *MsgConvertERC20) XXX_Size() int { return m.Size() } -func (m *MsgConvertCoin) XXX_DiscardUnknown() { - xxx_messageInfo_MsgConvertCoin.DiscardUnknown(m) +func (m *MsgConvertERC20) XXX_DiscardUnknown() { + xxx_messageInfo_MsgConvertERC20.DiscardUnknown(m) } -var xxx_messageInfo_MsgConvertCoin proto.InternalMessageInfo +var xxx_messageInfo_MsgConvertERC20 proto.InternalMessageInfo -func (m *MsgConvertCoin) GetCoin() types.Coin { +func (m *MsgConvertERC20) GetContractAddress() string { if m != nil { - return m.Coin + return m.ContractAddress } - return types.Coin{} + return "" } -func (m *MsgConvertCoin) GetReceiver() string { +func (m *MsgConvertERC20) GetReceiver() string { if m != nil { return m.Receiver } return "" } -func (m *MsgConvertCoin) GetSender() string { +func (m *MsgConvertERC20) GetSender() string { if m != nil { return m.Sender } return "" } -// MsgConvertCoinResponse returns no fields -type MsgConvertCoinResponse struct { +// MsgConvertERC20Response returns no fields +type MsgConvertERC20Response struct { } -func (m *MsgConvertCoinResponse) Reset() { *m = MsgConvertCoinResponse{} } -func (m *MsgConvertCoinResponse) String() string { return proto.CompactTextString(m) } -func (*MsgConvertCoinResponse) ProtoMessage() {} -func (*MsgConvertCoinResponse) Descriptor() ([]byte, []int) { +func (m *MsgConvertERC20Response) Reset() { *m = MsgConvertERC20Response{} } +func (m *MsgConvertERC20Response) String() string { return proto.CompactTextString(m) } +func (*MsgConvertERC20Response) ProtoMessage() {} +func (*MsgConvertERC20Response) Descriptor() ([]byte, []int) { return fileDescriptor_f8926fc6cb676914, []int{1} } -func (m *MsgConvertCoinResponse) XXX_Unmarshal(b []byte) error { +func (m *MsgConvertERC20Response) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *MsgConvertCoinResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *MsgConvertERC20Response) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_MsgConvertCoinResponse.Marshal(b, m, deterministic) + return xxx_messageInfo_MsgConvertERC20Response.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -123,43 +125,41 @@ func (m *MsgConvertCoinResponse) XXX_Marshal(b []byte, deterministic bool) ([]by return b[:n], nil } } -func (m *MsgConvertCoinResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgConvertCoinResponse.Merge(m, src) +func (m *MsgConvertERC20Response) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgConvertERC20Response.Merge(m, src) } -func (m *MsgConvertCoinResponse) XXX_Size() int { +func (m *MsgConvertERC20Response) XXX_Size() int { return m.Size() } -func (m *MsgConvertCoinResponse) XXX_DiscardUnknown() { - xxx_messageInfo_MsgConvertCoinResponse.DiscardUnknown(m) +func (m *MsgConvertERC20Response) XXX_DiscardUnknown() { + xxx_messageInfo_MsgConvertERC20Response.DiscardUnknown(m) } -var xxx_messageInfo_MsgConvertCoinResponse proto.InternalMessageInfo +var xxx_messageInfo_MsgConvertERC20Response proto.InternalMessageInfo -// MsgConvertERC20 defines a Msg to convert a ERC20 token to a native Cosmos -// coin. -type MsgConvertERC20 struct { - // contract_address of an ERC20 token contract, that is registered in a token pair - ContractAddress string `protobuf:"bytes,1,opt,name=contract_address,json=contractAddress,proto3" json:"contract_address,omitempty"` - // amount of ERC20 tokens to convert - Amount cosmossdk_io_math.Int `protobuf:"bytes,2,opt,name=amount,proto3,customtype=cosmossdk.io/math.Int" json:"amount"` - // receiver is the bech32 address to receive native Cosmos coins - Receiver string `protobuf:"bytes,3,opt,name=receiver,proto3" json:"receiver,omitempty"` - // sender is the hex address from the owner of the given ERC20 tokens - Sender string `protobuf:"bytes,4,opt,name=sender,proto3" json:"sender,omitempty"` +// MsgConvertCoin defines a Msg to convert a native Cosmos coin to a ERC20 token +type MsgConvertCoin struct { + // coin is a Cosmos coin whose denomination is registered in a token pair. The coin + // amount defines the amount of coins to convert. + Coin types.Coin `protobuf:"bytes,1,opt,name=coin,proto3" json:"coin"` + // receiver is the hex address to receive ERC20 token + Receiver string `protobuf:"bytes,2,opt,name=receiver,proto3" json:"receiver,omitempty"` + // sender is the cosmos bech32 address from the owner of the given Cosmos coins + Sender string `protobuf:"bytes,3,opt,name=sender,proto3" json:"sender,omitempty"` } -func (m *MsgConvertERC20) Reset() { *m = MsgConvertERC20{} } -func (m *MsgConvertERC20) String() string { return proto.CompactTextString(m) } -func (*MsgConvertERC20) ProtoMessage() {} -func (*MsgConvertERC20) Descriptor() ([]byte, []int) { +func (m *MsgConvertCoin) Reset() { *m = MsgConvertCoin{} } +func (m *MsgConvertCoin) String() string { return proto.CompactTextString(m) } +func (*MsgConvertCoin) ProtoMessage() {} +func (*MsgConvertCoin) Descriptor() ([]byte, []int) { return fileDescriptor_f8926fc6cb676914, []int{2} } -func (m *MsgConvertERC20) XXX_Unmarshal(b []byte) error { +func (m *MsgConvertCoin) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *MsgConvertERC20) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *MsgConvertCoin) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_MsgConvertERC20.Marshal(b, m, deterministic) + return xxx_messageInfo_MsgConvertCoin.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -169,55 +169,55 @@ func (m *MsgConvertERC20) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return b[:n], nil } } -func (m *MsgConvertERC20) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgConvertERC20.Merge(m, src) +func (m *MsgConvertCoin) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgConvertCoin.Merge(m, src) } -func (m *MsgConvertERC20) XXX_Size() int { +func (m *MsgConvertCoin) XXX_Size() int { return m.Size() } -func (m *MsgConvertERC20) XXX_DiscardUnknown() { - xxx_messageInfo_MsgConvertERC20.DiscardUnknown(m) +func (m *MsgConvertCoin) XXX_DiscardUnknown() { + xxx_messageInfo_MsgConvertCoin.DiscardUnknown(m) } -var xxx_messageInfo_MsgConvertERC20 proto.InternalMessageInfo +var xxx_messageInfo_MsgConvertCoin proto.InternalMessageInfo -func (m *MsgConvertERC20) GetContractAddress() string { +func (m *MsgConvertCoin) GetCoin() types.Coin { if m != nil { - return m.ContractAddress + return m.Coin } - return "" + return types.Coin{} } -func (m *MsgConvertERC20) GetReceiver() string { +func (m *MsgConvertCoin) GetReceiver() string { if m != nil { return m.Receiver } return "" } -func (m *MsgConvertERC20) GetSender() string { +func (m *MsgConvertCoin) GetSender() string { if m != nil { return m.Sender } return "" } -// MsgConvertERC20Response returns no fields -type MsgConvertERC20Response struct { +// MsgConvertCoinResponse returns no fields +type MsgConvertCoinResponse struct { } -func (m *MsgConvertERC20Response) Reset() { *m = MsgConvertERC20Response{} } -func (m *MsgConvertERC20Response) String() string { return proto.CompactTextString(m) } -func (*MsgConvertERC20Response) ProtoMessage() {} -func (*MsgConvertERC20Response) Descriptor() ([]byte, []int) { +func (m *MsgConvertCoinResponse) Reset() { *m = MsgConvertCoinResponse{} } +func (m *MsgConvertCoinResponse) String() string { return proto.CompactTextString(m) } +func (*MsgConvertCoinResponse) ProtoMessage() {} +func (*MsgConvertCoinResponse) Descriptor() ([]byte, []int) { return fileDescriptor_f8926fc6cb676914, []int{3} } -func (m *MsgConvertERC20Response) XXX_Unmarshal(b []byte) error { +func (m *MsgConvertCoinResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *MsgConvertERC20Response) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *MsgConvertCoinResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_MsgConvertERC20Response.Marshal(b, m, deterministic) + return xxx_messageInfo_MsgConvertCoinResponse.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -227,17 +227,17 @@ func (m *MsgConvertERC20Response) XXX_Marshal(b []byte, deterministic bool) ([]b return b[:n], nil } } -func (m *MsgConvertERC20Response) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgConvertERC20Response.Merge(m, src) +func (m *MsgConvertCoinResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgConvertCoinResponse.Merge(m, src) } -func (m *MsgConvertERC20Response) XXX_Size() int { +func (m *MsgConvertCoinResponse) XXX_Size() int { return m.Size() } -func (m *MsgConvertERC20Response) XXX_DiscardUnknown() { - xxx_messageInfo_MsgConvertERC20Response.DiscardUnknown(m) +func (m *MsgConvertCoinResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgConvertCoinResponse.DiscardUnknown(m) } -var xxx_messageInfo_MsgConvertERC20Response proto.InternalMessageInfo +var xxx_messageInfo_MsgConvertCoinResponse proto.InternalMessageInfo // MsgUpdateParams is the Msg/UpdateParams request type for Erc20 parameters. // Since: cosmos-sdk 0.47 @@ -336,10 +336,10 @@ func (m *MsgUpdateParamsResponse) XXX_DiscardUnknown() { var xxx_messageInfo_MsgUpdateParamsResponse proto.InternalMessageInfo func init() { - proto.RegisterType((*MsgConvertCoin)(nil), "evmos.erc20.v1.MsgConvertCoin") - proto.RegisterType((*MsgConvertCoinResponse)(nil), "evmos.erc20.v1.MsgConvertCoinResponse") proto.RegisterType((*MsgConvertERC20)(nil), "evmos.erc20.v1.MsgConvertERC20") proto.RegisterType((*MsgConvertERC20Response)(nil), "evmos.erc20.v1.MsgConvertERC20Response") + proto.RegisterType((*MsgConvertCoin)(nil), "evmos.erc20.v1.MsgConvertCoin") + proto.RegisterType((*MsgConvertCoinResponse)(nil), "evmos.erc20.v1.MsgConvertCoinResponse") proto.RegisterType((*MsgUpdateParams)(nil), "evmos.erc20.v1.MsgUpdateParams") proto.RegisterType((*MsgUpdateParamsResponse)(nil), "evmos.erc20.v1.MsgUpdateParamsResponse") } @@ -347,43 +347,41 @@ func init() { func init() { proto.RegisterFile("evmos/erc20/v1/tx.proto", fileDescriptor_f8926fc6cb676914) } var fileDescriptor_f8926fc6cb676914 = []byte{ - // 574 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x93, 0x4f, 0x8b, 0x13, 0x3f, - 0x18, 0xc7, 0x3b, 0xbb, 0xa5, 0xfc, 0x9a, 0x2e, 0xdd, 0x1f, 0x61, 0xed, 0x3f, 0x74, 0x5a, 0x7b, - 0x70, 0xab, 0xe0, 0x64, 0xdb, 0x55, 0x11, 0x6f, 0xb6, 0x78, 0xf0, 0xb0, 0x20, 0x23, 0x82, 0x78, - 0x29, 0xe9, 0x34, 0x4c, 0x07, 0x9d, 0x64, 0x48, 0xd2, 0x61, 0x7b, 0xf1, 0xd0, 0x37, 0xa0, 0xe0, - 0x8b, 0xf0, 0xea, 0xc1, 0x17, 0xb1, 0xc7, 0x45, 0x2f, 0xe2, 0x61, 0x91, 0x76, 0xc1, 0xb7, 0x21, - 0x93, 0xa4, 0x7f, 0xa6, 0x76, 0xd7, 0x4b, 0x69, 0xf2, 0xfd, 0xe6, 0x79, 0x3e, 0xdf, 0x3c, 0x19, - 0x50, 0x26, 0x71, 0xc8, 0x04, 0x22, 0xdc, 0xeb, 0x1c, 0xa1, 0xb8, 0x8d, 0xe4, 0xa9, 0x13, 0x71, - 0x26, 0x19, 0x2c, 0x2a, 0xc1, 0x51, 0x82, 0x13, 0xb7, 0x6b, 0xb6, 0xc7, 0x44, 0xe2, 0x1c, 0x60, - 0x41, 0x50, 0xdc, 0x1e, 0x10, 0x89, 0xdb, 0xc8, 0x63, 0x01, 0xd5, 0xfe, 0x5a, 0xd9, 0xe8, 0xa1, - 0xf0, 0x93, 0x3a, 0xa1, 0xf0, 0x8d, 0x50, 0xd5, 0x42, 0x5f, 0xad, 0x90, 0x5e, 0x18, 0xe9, 0xe6, - 0x46, 0x73, 0x9f, 0x50, 0x22, 0x82, 0x85, 0x7a, 0xe0, 0x33, 0x9f, 0xe9, 0x53, 0xc9, 0xbf, 0xc5, - 0x19, 0x9f, 0x31, 0xff, 0x1d, 0x41, 0x38, 0x0a, 0x10, 0xa6, 0x94, 0x49, 0x2c, 0x03, 0x46, 0xcd, - 0x99, 0xe6, 0x04, 0x14, 0x4f, 0x84, 0xdf, 0x63, 0x34, 0x26, 0x5c, 0xf6, 0x58, 0x40, 0xe1, 0x31, - 0xc8, 0x26, 0x94, 0x15, 0xab, 0x61, 0xb5, 0x0a, 0x9d, 0xaa, 0x63, 0x00, 0x92, 0x18, 0x8e, 0x89, - 0xe1, 0x24, 0xc6, 0x6e, 0xf6, 0xec, 0xa2, 0x9e, 0x71, 0x95, 0x19, 0xd6, 0xc0, 0x7f, 0x9c, 0x78, - 0x24, 0x88, 0x09, 0xaf, 0xec, 0x34, 0xac, 0x56, 0xde, 0x5d, 0xae, 0x61, 0x09, 0xe4, 0x04, 0xa1, - 0x43, 0xc2, 0x2b, 0xbb, 0x4a, 0x31, 0xab, 0x66, 0x05, 0x94, 0xd2, 0xad, 0x5d, 0x22, 0x22, 0x46, - 0x05, 0x69, 0x7e, 0xb6, 0xc0, 0xfe, 0x4a, 0x7a, 0xe6, 0xf6, 0x3a, 0x47, 0xf0, 0x2e, 0xf8, 0xdf, - 0x63, 0x54, 0x72, 0xec, 0xc9, 0x3e, 0x1e, 0x0e, 0x39, 0x11, 0x42, 0x21, 0xe6, 0xdd, 0xfd, 0xc5, - 0xfe, 0x53, 0xbd, 0x0d, 0x1f, 0x82, 0x1c, 0x0e, 0xd9, 0x98, 0x4a, 0x8d, 0xd2, 0xbd, 0x95, 0x80, - 0xfe, 0xbc, 0xa8, 0xdf, 0xd0, 0x51, 0xc4, 0xf0, 0xad, 0x13, 0x30, 0x14, 0x62, 0x39, 0x72, 0x9e, - 0x53, 0xe9, 0x1a, 0x73, 0x2a, 0xc3, 0xee, 0x95, 0x19, 0xb2, 0xa9, 0x0c, 0x55, 0x50, 0xde, 0x00, - 0x5d, 0x86, 0xf8, 0xa0, 0x43, 0xbc, 0x8a, 0x86, 0x58, 0x92, 0x17, 0x98, 0xe3, 0x50, 0xc0, 0x47, - 0x20, 0x8f, 0xc7, 0x72, 0xc4, 0x78, 0x20, 0x27, 0x9a, 0xbe, 0x5b, 0xf9, 0xf6, 0xf5, 0xfe, 0x81, - 0xb9, 0x63, 0x13, 0xe0, 0xa5, 0xe4, 0x01, 0xf5, 0xdd, 0x95, 0x15, 0x3e, 0x00, 0xb9, 0x48, 0x55, - 0x50, 0x89, 0x0a, 0x9d, 0x92, 0x93, 0x7e, 0x6c, 0x8e, 0xae, 0x6f, 0x46, 0x62, 0xbc, 0x4f, 0x8a, - 0xd3, 0xdf, 0x5f, 0xee, 0xad, 0xaa, 0x18, 0xd8, 0x75, 0xa0, 0x05, 0x6c, 0xe7, 0x72, 0x07, 0xec, - 0x9e, 0x08, 0x1f, 0xbe, 0x07, 0x85, 0xf5, 0xb7, 0x60, 0x6f, 0xf6, 0x49, 0x0f, 0xac, 0x76, 0xe7, - 0x7a, 0x7d, 0x79, 0x17, 0x87, 0xd3, 0xef, 0x97, 0x9f, 0x76, 0x6e, 0xc3, 0x3a, 0xfa, 0xeb, 0xeb, - 0x41, 0x9e, 0xf6, 0xf7, 0xd5, 0x3b, 0x9a, 0x5a, 0x60, 0x2f, 0x35, 0xf6, 0xfa, 0xd5, 0x1d, 0x94, - 0xa1, 0x76, 0xf8, 0x0f, 0xc3, 0x92, 0xa1, 0xa5, 0x18, 0x9a, 0xb0, 0x71, 0x0d, 0x83, 0xda, 0x83, - 0xaf, 0xc1, 0x5e, 0x6a, 0x6a, 0xdb, 0x18, 0xd6, 0x0d, 0x5b, 0x19, 0xb6, 0x5d, 0x73, 0xb7, 0x7b, - 0x36, 0xb3, 0xad, 0xf3, 0x99, 0x6d, 0xfd, 0x9a, 0xd9, 0xd6, 0xc7, 0xb9, 0x9d, 0x39, 0x9f, 0xdb, - 0x99, 0x1f, 0x73, 0x3b, 0xf3, 0xa6, 0xe5, 0x07, 0x72, 0x34, 0x1e, 0x38, 0x1e, 0x0b, 0x17, 0x7c, - 0xea, 0x37, 0x6e, 0x3f, 0x46, 0xa7, 0x86, 0x55, 0x4e, 0x22, 0x22, 0x06, 0x39, 0xf5, 0xe1, 0x1e, - 0xff, 0x09, 0x00, 0x00, 0xff, 0xff, 0x7b, 0xc2, 0x86, 0x1c, 0x89, 0x04, 0x00, 0x00, + // 544 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x93, 0xc1, 0x8a, 0x13, 0x31, + 0x18, 0xc7, 0x3b, 0xdb, 0x52, 0xdc, 0xec, 0xd2, 0x95, 0xb0, 0xb6, 0xd3, 0xa2, 0xd3, 0xa5, 0x17, + 0xab, 0x60, 0xb2, 0xed, 0xaa, 0x88, 0x37, 0x5b, 0x3c, 0x78, 0x58, 0x90, 0x11, 0x41, 0xbc, 0x94, + 0x74, 0x1a, 0xd2, 0x41, 0x27, 0x19, 0x92, 0x74, 0xd8, 0x5e, 0xfb, 0x02, 0x0a, 0x3e, 0x84, 0x57, + 0x0f, 0x3e, 0xc4, 0x1e, 0x17, 0xbd, 0x88, 0x87, 0x45, 0xda, 0x05, 0x5f, 0x43, 0x26, 0x93, 0xb6, + 0x3b, 0xb5, 0xe2, 0xa5, 0xf4, 0xcb, 0xff, 0xff, 0x7d, 0xf9, 0xcd, 0x3f, 0x09, 0xa8, 0xd1, 0x24, + 0x12, 0x0a, 0x53, 0x19, 0x74, 0x8f, 0x71, 0xd2, 0xc1, 0xfa, 0x0c, 0xc5, 0x52, 0x68, 0x01, 0x2b, + 0x46, 0x40, 0x46, 0x40, 0x49, 0xa7, 0xe1, 0x05, 0x42, 0xa5, 0xce, 0x21, 0x51, 0x14, 0x27, 0x9d, + 0x21, 0xd5, 0xa4, 0x83, 0x03, 0x11, 0xf2, 0xcc, 0xdf, 0xa8, 0x59, 0x3d, 0x52, 0x2c, 0x9d, 0x13, + 0x29, 0x66, 0x85, 0x7a, 0x26, 0x0c, 0x4c, 0x85, 0xb3, 0xc2, 0x4a, 0xb7, 0x37, 0x36, 0x67, 0x94, + 0x53, 0x15, 0x2e, 0xd5, 0x43, 0x26, 0x98, 0xc8, 0xba, 0xd2, 0x7f, 0xcb, 0x1e, 0x26, 0x04, 0x7b, + 0x4f, 0x31, 0x89, 0x43, 0x4c, 0x38, 0x17, 0x9a, 0xe8, 0x50, 0x70, 0xdb, 0xd3, 0xfa, 0xec, 0x80, + 0x83, 0x53, 0xc5, 0xfa, 0x82, 0x27, 0x54, 0xea, 0xe7, 0x7e, 0xbf, 0x7b, 0x0c, 0xef, 0x81, 0x9b, + 0x81, 0xe0, 0x5a, 0x92, 0x40, 0x0f, 0xc8, 0x68, 0x24, 0xa9, 0x52, 0xae, 0x73, 0xe4, 0xb4, 0x77, + 0xfd, 0x83, 0xe5, 0xfa, 0xb3, 0x6c, 0x19, 0x3e, 0x02, 0x65, 0x12, 0x89, 0x09, 0xd7, 0xee, 0x4e, + 0x6a, 0xe8, 0xdd, 0x39, 0xbf, 0x6c, 0x16, 0x7e, 0x5e, 0x36, 0x6f, 0x65, 0xd8, 0x6a, 0xf4, 0x0e, + 0x85, 0x02, 0x47, 0x44, 0x8f, 0xd1, 0x0b, 0xae, 0x7d, 0x6b, 0x86, 0x0d, 0x70, 0x43, 0xd2, 0x80, + 0x86, 0x09, 0x95, 0x6e, 0xd1, 0x4c, 0x5e, 0xd5, 0xb0, 0x0a, 0xca, 0x8a, 0xf2, 0x11, 0x95, 0x6e, + 0xc9, 0x28, 0xb6, 0x6a, 0xd5, 0x41, 0x6d, 0x03, 0xd4, 0xa7, 0x2a, 0x16, 0x5c, 0xd1, 0xd6, 0x14, + 0x54, 0xd6, 0x52, 0x5f, 0x84, 0x1c, 0x9e, 0x80, 0x52, 0x1a, 0xb5, 0xc1, 0xde, 0xeb, 0xd6, 0x91, + 0x4d, 0x31, 0x3d, 0x0b, 0x64, 0xcf, 0x02, 0xa5, 0xc6, 0x5e, 0x29, 0x05, 0xf6, 0x8d, 0x39, 0x47, + 0xb5, 0xf3, 0x4f, 0xaa, 0x62, 0x8e, 0xca, 0x05, 0xd5, 0xfc, 0xd6, 0x2b, 0xa8, 0x0f, 0x59, 0xb2, + 0xaf, 0xe3, 0x11, 0xd1, 0xf4, 0x25, 0x91, 0x24, 0x52, 0xf0, 0x31, 0xd8, 0x25, 0x13, 0x3d, 0x16, + 0x32, 0xd4, 0xd3, 0x2c, 0xd2, 0x9e, 0xfb, 0xed, 0xeb, 0x83, 0x43, 0x8b, 0x67, 0x53, 0x7d, 0xa5, + 0x65, 0xc8, 0x99, 0xbf, 0xb6, 0xc2, 0x87, 0xa0, 0x1c, 0x9b, 0x09, 0x86, 0x6b, 0xaf, 0x5b, 0x45, + 0xf9, 0xcb, 0x86, 0xb2, 0xf9, 0xf6, 0x6b, 0xac, 0xf7, 0x69, 0x65, 0xf6, 0xfb, 0xcb, 0xfd, 0xf5, + 0x14, 0x9b, 0xe0, 0x75, 0xa0, 0x25, 0x6c, 0xf7, 0xca, 0x01, 0xc5, 0x53, 0xc5, 0xe0, 0xcc, 0x01, + 0xfb, 0xb9, 0xbb, 0xd0, 0xdc, 0xdc, 0x69, 0xe3, 0x0c, 0x1a, 0x77, 0xff, 0x63, 0x58, 0xe5, 0xd1, + 0x9e, 0x7d, 0xbf, 0xfa, 0xb4, 0xd3, 0x82, 0x47, 0xf8, 0xaf, 0x17, 0x84, 0x83, 0xac, 0x61, 0x60, + 0xd6, 0xe0, 0x1b, 0xb0, 0x9f, 0x4b, 0x6d, 0x1b, 0xc3, 0x75, 0xc3, 0x56, 0x86, 0x6d, 0x9f, 0xd9, + 0xeb, 0x9d, 0xcf, 0x3d, 0xe7, 0x62, 0xee, 0x39, 0xbf, 0xe6, 0x9e, 0xf3, 0x71, 0xe1, 0x15, 0x2e, + 0x16, 0x5e, 0xe1, 0xc7, 0xc2, 0x2b, 0xbc, 0x6d, 0xb3, 0x50, 0x8f, 0x27, 0x43, 0x14, 0x88, 0x68, + 0xc9, 0x67, 0x7e, 0x93, 0xce, 0x13, 0x7c, 0x66, 0x59, 0xf5, 0x34, 0xa6, 0x6a, 0x58, 0x36, 0x0f, + 0xe7, 0xe4, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfc, 0x59, 0x1a, 0x04, 0x09, 0x04, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -398,9 +396,6 @@ const _ = grpc.SupportPackageIsVersion4 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type MsgClient interface { - // ConvertCoin mints a ERC20 representation of the native Cosmos coin denom - // that is registered on the token mapping. - ConvertCoin(ctx context.Context, in *MsgConvertCoin, opts ...grpc.CallOption) (*MsgConvertCoinResponse, error) // ConvertERC20 mints a native Cosmos coin representation of the ERC20 token // contract that is registered on the token mapping. ConvertERC20(ctx context.Context, in *MsgConvertERC20, opts ...grpc.CallOption) (*MsgConvertERC20Response, error) @@ -417,15 +412,6 @@ func NewMsgClient(cc grpc1.ClientConn) MsgClient { return &msgClient{cc} } -func (c *msgClient) ConvertCoin(ctx context.Context, in *MsgConvertCoin, opts ...grpc.CallOption) (*MsgConvertCoinResponse, error) { - out := new(MsgConvertCoinResponse) - err := c.cc.Invoke(ctx, "/evmos.erc20.v1.Msg/ConvertCoin", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *msgClient) ConvertERC20(ctx context.Context, in *MsgConvertERC20, opts ...grpc.CallOption) (*MsgConvertERC20Response, error) { out := new(MsgConvertERC20Response) err := c.cc.Invoke(ctx, "/evmos.erc20.v1.Msg/ConvertERC20", in, out, opts...) @@ -446,9 +432,6 @@ func (c *msgClient) UpdateParams(ctx context.Context, in *MsgUpdateParams, opts // MsgServer is the server API for Msg service. type MsgServer interface { - // ConvertCoin mints a ERC20 representation of the native Cosmos coin denom - // that is registered on the token mapping. - ConvertCoin(context.Context, *MsgConvertCoin) (*MsgConvertCoinResponse, error) // ConvertERC20 mints a native Cosmos coin representation of the ERC20 token // contract that is registered on the token mapping. ConvertERC20(context.Context, *MsgConvertERC20) (*MsgConvertERC20Response, error) @@ -461,9 +444,6 @@ type MsgServer interface { type UnimplementedMsgServer struct { } -func (*UnimplementedMsgServer) ConvertCoin(ctx context.Context, req *MsgConvertCoin) (*MsgConvertCoinResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ConvertCoin not implemented") -} func (*UnimplementedMsgServer) ConvertERC20(ctx context.Context, req *MsgConvertERC20) (*MsgConvertERC20Response, error) { return nil, status.Errorf(codes.Unimplemented, "method ConvertERC20 not implemented") } @@ -475,24 +455,6 @@ func RegisterMsgServer(s grpc1.Server, srv MsgServer) { s.RegisterService(&_Msg_serviceDesc, srv) } -func _Msg_ConvertCoin_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MsgConvertCoin) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MsgServer).ConvertCoin(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/evmos.erc20.v1.Msg/ConvertCoin", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).ConvertCoin(ctx, req.(*MsgConvertCoin)) - } - return interceptor(ctx, in, info, handler) -} - func _Msg_ConvertERC20_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(MsgConvertERC20) if err := dec(in); err != nil { @@ -533,10 +495,6 @@ var _Msg_serviceDesc = grpc.ServiceDesc{ ServiceName: "evmos.erc20.v1.Msg", HandlerType: (*MsgServer)(nil), Methods: []grpc.MethodDesc{ - { - MethodName: "ConvertCoin", - Handler: _Msg_ConvertCoin_Handler, - }, { MethodName: "ConvertERC20", Handler: _Msg_ConvertERC20_Handler, @@ -550,7 +508,7 @@ var _Msg_serviceDesc = grpc.ServiceDesc{ Metadata: "evmos/erc20/v1/tx.proto", } -func (m *MsgConvertCoin) Marshal() (dAtA []byte, err error) { +func (m *MsgConvertERC20) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -560,12 +518,12 @@ func (m *MsgConvertCoin) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *MsgConvertCoin) MarshalTo(dAtA []byte) (int, error) { +func (m *MsgConvertERC20) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *MsgConvertCoin) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *MsgConvertERC20) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -575,29 +533,36 @@ func (m *MsgConvertCoin) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.Sender) i = encodeVarintTx(dAtA, i, uint64(len(m.Sender))) i-- - dAtA[i] = 0x1a + dAtA[i] = 0x22 } if len(m.Receiver) > 0 { i -= len(m.Receiver) copy(dAtA[i:], m.Receiver) i = encodeVarintTx(dAtA, i, uint64(len(m.Receiver))) i-- - dAtA[i] = 0x12 + dAtA[i] = 0x1a } { - size, err := m.Coin.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { + size := m.Amount.Size() + i -= size + if _, err := m.Amount.MarshalTo(dAtA[i:]); err != nil { return 0, err } - i -= size i = encodeVarintTx(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0xa + dAtA[i] = 0x12 + if len(m.ContractAddress) > 0 { + i -= len(m.ContractAddress) + copy(dAtA[i:], m.ContractAddress) + i = encodeVarintTx(dAtA, i, uint64(len(m.ContractAddress))) + i-- + dAtA[i] = 0xa + } return len(dAtA) - i, nil } -func (m *MsgConvertCoinResponse) Marshal() (dAtA []byte, err error) { +func (m *MsgConvertERC20Response) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -607,12 +572,12 @@ func (m *MsgConvertCoinResponse) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *MsgConvertCoinResponse) MarshalTo(dAtA []byte) (int, error) { +func (m *MsgConvertERC20Response) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *MsgConvertCoinResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *MsgConvertERC20Response) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -620,7 +585,7 @@ func (m *MsgConvertCoinResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } -func (m *MsgConvertERC20) Marshal() (dAtA []byte, err error) { +func (m *MsgConvertCoin) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -630,12 +595,12 @@ func (m *MsgConvertERC20) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *MsgConvertERC20) MarshalTo(dAtA []byte) (int, error) { +func (m *MsgConvertCoin) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *MsgConvertERC20) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *MsgConvertCoin) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -645,36 +610,29 @@ func (m *MsgConvertERC20) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.Sender) i = encodeVarintTx(dAtA, i, uint64(len(m.Sender))) i-- - dAtA[i] = 0x22 + dAtA[i] = 0x1a } if len(m.Receiver) > 0 { i -= len(m.Receiver) copy(dAtA[i:], m.Receiver) i = encodeVarintTx(dAtA, i, uint64(len(m.Receiver))) i-- - dAtA[i] = 0x1a + dAtA[i] = 0x12 } { - size := m.Amount.Size() - i -= size - if _, err := m.Amount.MarshalTo(dAtA[i:]); err != nil { + size, err := m.Coin.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { return 0, err } + i -= size i = encodeVarintTx(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x12 - if len(m.ContractAddress) > 0 { - i -= len(m.ContractAddress) - copy(dAtA[i:], m.ContractAddress) - i = encodeVarintTx(dAtA, i, uint64(len(m.ContractAddress))) - i-- - dAtA[i] = 0xa - } + dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *MsgConvertERC20Response) Marshal() (dAtA []byte, err error) { +func (m *MsgConvertCoinResponse) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -684,12 +642,12 @@ func (m *MsgConvertERC20Response) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *MsgConvertERC20Response) MarshalTo(dAtA []byte) (int, error) { +func (m *MsgConvertCoinResponse) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *MsgConvertERC20Response) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *MsgConvertCoinResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -771,13 +729,17 @@ func encodeVarintTx(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } -func (m *MsgConvertCoin) Size() (n int) { +func (m *MsgConvertERC20) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = m.Coin.Size() + l = len(m.ContractAddress) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = m.Amount.Size() n += 1 + l + sovTx(uint64(l)) l = len(m.Receiver) if l > 0 { @@ -790,7 +752,7 @@ func (m *MsgConvertCoin) Size() (n int) { return n } -func (m *MsgConvertCoinResponse) Size() (n int) { +func (m *MsgConvertERC20Response) Size() (n int) { if m == nil { return 0 } @@ -799,17 +761,13 @@ func (m *MsgConvertCoinResponse) Size() (n int) { return n } -func (m *MsgConvertERC20) Size() (n int) { +func (m *MsgConvertCoin) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.ContractAddress) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - l = m.Amount.Size() + l = m.Coin.Size() n += 1 + l + sovTx(uint64(l)) l = len(m.Receiver) if l > 0 { @@ -822,7 +780,7 @@ func (m *MsgConvertERC20) Size() (n int) { return n } -func (m *MsgConvertERC20Response) Size() (n int) { +func (m *MsgConvertCoinResponse) Size() (n int) { if m == nil { return 0 } @@ -861,7 +819,7 @@ func sovTx(x uint64) (n int) { func sozTx(x uint64) (n int) { return sovTx(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } -func (m *MsgConvertCoin) Unmarshal(dAtA []byte) error { +func (m *MsgConvertERC20) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -884,17 +842,17 @@ func (m *MsgConvertCoin) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: MsgConvertCoin: wiretype end group for non-group") + return fmt.Errorf("proto: MsgConvertERC20: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: MsgConvertCoin: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: MsgConvertERC20: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Coin", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ContractAddress", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTx @@ -904,26 +862,59 @@ func (m *MsgConvertCoin) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthTx } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthTx } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Coin.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.ContractAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Amount", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Amount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 2: + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Receiver", wireType) } @@ -955,7 +946,7 @@ func (m *MsgConvertCoin) Unmarshal(dAtA []byte) error { } m.Receiver = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: + case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) } @@ -1008,7 +999,7 @@ func (m *MsgConvertCoin) Unmarshal(dAtA []byte) error { } return nil } -func (m *MsgConvertCoinResponse) Unmarshal(dAtA []byte) error { +func (m *MsgConvertERC20Response) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -1031,10 +1022,10 @@ func (m *MsgConvertCoinResponse) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: MsgConvertCoinResponse: wiretype end group for non-group") + return fmt.Errorf("proto: MsgConvertERC20Response: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: MsgConvertCoinResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: MsgConvertERC20Response: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { default: @@ -1058,7 +1049,7 @@ func (m *MsgConvertCoinResponse) Unmarshal(dAtA []byte) error { } return nil } -func (m *MsgConvertERC20) Unmarshal(dAtA []byte) error { +func (m *MsgConvertCoin) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -1081,49 +1072,17 @@ func (m *MsgConvertERC20) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: MsgConvertERC20: wiretype end group for non-group") + return fmt.Errorf("proto: MsgConvertCoin: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: MsgConvertERC20: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: MsgConvertCoin: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ContractAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ContractAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Amount", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Coin", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTx @@ -1133,27 +1092,26 @@ func (m *MsgConvertERC20) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthTx } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTx } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Amount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Coin.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 3: + case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Receiver", wireType) } @@ -1185,7 +1143,7 @@ func (m *MsgConvertERC20) Unmarshal(dAtA []byte) error { } m.Receiver = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 4: + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) } @@ -1238,7 +1196,7 @@ func (m *MsgConvertERC20) Unmarshal(dAtA []byte) error { } return nil } -func (m *MsgConvertERC20Response) Unmarshal(dAtA []byte) error { +func (m *MsgConvertCoinResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -1261,10 +1219,10 @@ func (m *MsgConvertERC20Response) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: MsgConvertERC20Response: wiretype end group for non-group") + return fmt.Errorf("proto: MsgConvertCoinResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: MsgConvertERC20Response: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: MsgConvertCoinResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { default: diff --git a/x/erc20/types/tx.pb.gw.go b/x/erc20/types/tx.pb.gw.go index 0ae973ccc0..22ee71f084 100644 --- a/x/erc20/types/tx.pb.gw.go +++ b/x/erc20/types/tx.pb.gw.go @@ -33,42 +33,6 @@ var _ = utilities.NewDoubleArray var _ = descriptor.ForMessage var _ = metadata.Join -var ( - filter_Msg_ConvertCoin_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - -func request_Msg_ConvertCoin_0(ctx context.Context, marshaler runtime.Marshaler, client MsgClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq MsgConvertCoin - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Msg_ConvertCoin_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.ConvertCoin(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Msg_ConvertCoin_0(ctx context.Context, marshaler runtime.Marshaler, server MsgServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq MsgConvertCoin - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Msg_ConvertCoin_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.ConvertCoin(ctx, &protoReq) - return msg, metadata, err - -} - var ( filter_Msg_ConvertERC20_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) @@ -111,29 +75,6 @@ func local_request_Msg_ConvertERC20_0(ctx context.Context, marshaler runtime.Mar // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterMsgHandlerFromEndpoint instead. func RegisterMsgHandlerServer(ctx context.Context, mux *runtime.ServeMux, server MsgServer) error { - mux.Handle("GET", pattern_Msg_ConvertCoin_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Msg_ConvertCoin_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Msg_ConvertCoin_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - mux.Handle("GET", pattern_Msg_ConvertERC20_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -198,26 +139,6 @@ func RegisterMsgHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.C // "MsgClient" to call the correct interceptors. func RegisterMsgHandlerClient(ctx context.Context, mux *runtime.ServeMux, client MsgClient) error { - mux.Handle("GET", pattern_Msg_ConvertCoin_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Msg_ConvertCoin_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Msg_ConvertCoin_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - mux.Handle("GET", pattern_Msg_ConvertERC20_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -242,13 +163,9 @@ func RegisterMsgHandlerClient(ctx context.Context, mux *runtime.ServeMux, client } var ( - pattern_Msg_ConvertCoin_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"evmos", "erc20", "v1", "tx", "convert_coin"}, "", runtime.AssumeColonVerbOpt(false))) - pattern_Msg_ConvertERC20_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"evmos", "erc20", "v1", "tx", "convert_erc20"}, "", runtime.AssumeColonVerbOpt(false))) ) var ( - forward_Msg_ConvertCoin_0 = runtime.ForwardResponseMessage - forward_Msg_ConvertERC20_0 = runtime.ForwardResponseMessage ) diff --git a/x/evm/keeper/call_evm_test.go b/x/evm/keeper/call_evm_test.go new file mode 100644 index 0000000000..0213edc112 --- /dev/null +++ b/x/evm/keeper/call_evm_test.go @@ -0,0 +1,161 @@ +package keeper_test + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/common" + "github.com/evmos/evmos/v18/contracts" + "github.com/evmos/evmos/v18/testutil" + utiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v18/x/erc20/types" + evmtypes "github.com/evmos/evmos/v18/x/evm/types" +) + +const erc20Decimals = uint8(18) + +// DeployContract deploys the ERC20MinterBurnerDecimalsContract. +func (suite *KeeperTestSuite) DeployContract(name, symbol string, decimals uint8) (common.Address, error) { + suite.Commit() + addr, err := testutil.DeployContract( + suite.ctx, + suite.app, + suite.priv, + suite.queryClient, + contracts.ERC20MinterBurnerDecimalsContract, + name, symbol, decimals, + ) + suite.Commit() + return addr, err +} + +func (suite *KeeperTestSuite) TestCallEVM() { + testCases := []struct { + name string + method string + expPass bool + }{ + { + "unknown method", + "", + false, + }, + { + "pass", + "balanceOf", + true, + }, + } + for _, tc := range testCases { + suite.SetupTest() // reset + + erc20 := contracts.ERC20MinterBurnerDecimalsContract.ABI + contract, err := suite.DeployContract("coin", "token", erc20Decimals) + suite.Require().NoError(err) + account := utiltx.GenerateAddress() + + res, err := suite.app.EvmKeeper.CallEVM(suite.ctx, erc20, types.ModuleAddress, contract, true, tc.method, account) + if tc.expPass { + suite.Require().IsTypef(&evmtypes.MsgEthereumTxResponse{}, res, tc.name) + suite.Require().NoError(err) + } else { + suite.Require().Error(err) + } + } +} + +func (suite *KeeperTestSuite) TestCallEVMWithData() { + erc20 := contracts.ERC20MinterBurnerDecimalsContract.ABI + testCases := []struct { + name string + from common.Address + malleate func() ([]byte, *common.Address) + expPass bool + }{ + { + "unknown method", + types.ModuleAddress, + func() ([]byte, *common.Address) { + contract, err := suite.DeployContract("coin", "token", erc20Decimals) + suite.Require().NoError(err) + account := utiltx.GenerateAddress() + data, _ := erc20.Pack("", account) + return data, &contract + }, + false, + }, + { + "pass", + types.ModuleAddress, + func() ([]byte, *common.Address) { + contract, err := suite.DeployContract("coin", "token", erc20Decimals) + suite.Require().NoError(err) + account := utiltx.GenerateAddress() + data, _ := erc20.Pack("balanceOf", account) + return data, &contract + }, + true, + }, + { + "fail empty data", + types.ModuleAddress, + func() ([]byte, *common.Address) { + contract, err := suite.DeployContract("coin", "token", erc20Decimals) + suite.Require().NoError(err) + return []byte{}, &contract + }, + false, + }, + + { + "fail empty sender", + common.Address{}, + func() ([]byte, *common.Address) { + contract, err := suite.DeployContract("coin", "token", erc20Decimals) + suite.Require().NoError(err) + return []byte{}, &contract + }, + false, + }, + { + "deploy", + types.ModuleAddress, + func() ([]byte, *common.Address) { + ctorArgs, _ := contracts.ERC20MinterBurnerDecimalsContract.ABI.Pack("", "test", "test", uint8(18)) + data := append(contracts.ERC20MinterBurnerDecimalsContract.Bin, ctorArgs...) //nolint:gocritic + return data, nil + }, + true, + }, + { + "fail deploy", + types.ModuleAddress, + func() ([]byte, *common.Address) { + params := suite.app.EvmKeeper.GetParams(suite.ctx) + params.AccessControl.Create = evmtypes.AccessControlType{ + AccessType: evmtypes.AccessTypeRestricted, + } + _ = suite.app.EvmKeeper.SetParams(suite.ctx, params) + ctorArgs, _ := contracts.ERC20MinterBurnerDecimalsContract.ABI.Pack("", "test", "test", uint8(18)) + data := append(contracts.ERC20MinterBurnerDecimalsContract.Bin, ctorArgs...) //nolint:gocritic + return data, nil + }, + false, + }, + } + + for _, tc := range testCases { + suite.Run(fmt.Sprintf("Case %s", tc.name), func() { + suite.SetupTest() // reset + + data, contract := tc.malleate() + + res, err := suite.app.EvmKeeper.CallEVMWithData(suite.ctx, tc.from, contract, data, true) + if tc.expPass { + suite.Require().IsTypef(&evmtypes.MsgEthereumTxResponse{}, res, tc.name) + suite.Require().NoError(err) + } else { + suite.Require().Error(err) + } + }) + } +} diff --git a/x/evm/keeper/keeper.go b/x/evm/keeper/keeper.go index 713d9469ce..a42c0213da 100644 --- a/x/evm/keeper/keeper.go +++ b/x/evm/keeper/keeper.go @@ -40,6 +40,7 @@ type Keeper struct { // the address capable of executing a MsgUpdateParams message. Typically, this should be the x/gov module account. authority sdk.AccAddress + // access to account state accountKeeper types.AccountKeeper // update balance and accounting operations with coins @@ -48,6 +49,8 @@ type Keeper struct { stakingKeeper types.StakingKeeper // fetch EIP1559 base fee and parameters feeMarketKeeper types.FeeMarketKeeper + // erc20Keeper interface needed to instantiate erc20 precompiles + erc20Keeper types.Erc20Keeper // chain ID number obtained from the context's chain id eip155ChainID *big.Int @@ -73,6 +76,7 @@ func NewKeeper( bankKeeper types.BankKeeper, sk types.StakingKeeper, fmk types.FeeMarketKeeper, + erc20Keeper types.Erc20Keeper, tracer string, ss paramstypes.Subspace, ) *Keeper { @@ -97,6 +101,7 @@ func NewKeeper( storeKey: storeKey, transientKey: transientKey, tracer: tracer, + erc20Keeper: erc20Keeper, ss: ss, } } diff --git a/x/evm/keeper/params.go b/x/evm/keeper/params.go index ed6de820cc..e22640e583 100644 --- a/x/evm/keeper/params.go +++ b/x/evm/keeper/params.go @@ -3,11 +3,13 @@ package keeper import ( + "fmt" "slices" "sort" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" + "github.com/evmos/evmos/v18/utils" "github.com/evmos/evmos/v18/x/evm/types" ) @@ -26,7 +28,7 @@ func (k Keeper) GetParams(ctx sdk.Context) (params types.Params) { func (k Keeper) SetParams(ctx sdk.Context, params types.Params) error { // NOTE: We need to sort the precompiles in order to enable searching with binary search // in params.IsActivePrecompile. - slices.Sort(params.ActivePrecompiles) + slices.Sort(params.ActiveStaticPrecompiles) if err := params.Validate(); err != nil { return err @@ -49,23 +51,40 @@ func (k Keeper) GetLegacyParams(ctx sdk.Context) types.Params { return params } -// EnablePrecompiles appends the addresses of the given Precompiles to the list -// of active precompiles. -func (k Keeper) EnablePrecompiles(ctx sdk.Context, addresses ...common.Address) error { +// EnableStaticPrecompiles appends the addresses of the given Precompiles to the list +// of active static precompiles. +func (k Keeper) EnableStaticPrecompiles(ctx sdk.Context, addresses ...common.Address) error { params := k.GetParams(ctx) - activePrecompiles := params.ActivePrecompiles + activePrecompiles := params.ActiveStaticPrecompiles - for _, address := range addresses { - activePrecompiles = append(activePrecompiles, address.String()) + // Append and sort the new precompiles + updatedPrecompiles, err := appendPrecompiles(activePrecompiles, addresses...) + if err != nil { + return err } - sort.Slice(activePrecompiles, func(i, j int) bool { - return activePrecompiles[i] < activePrecompiles[j] - }) + params.ActiveStaticPrecompiles = updatedPrecompiles + return k.SetParams(ctx, params) +} + +func appendPrecompiles(existingPrecompiles []string, addresses ...common.Address) ([]string, error) { + // check for duplicates + hexAddresses := make([]string, len(addresses)) + for i := range addresses { + addrHex := addresses[i].Hex() + if slices.Contains(existingPrecompiles, addrHex) { + return nil, fmt.Errorf("precompile already registered: %s", addrHex) + } + hexAddresses[i] = addrHex + } - params.ActivePrecompiles = activePrecompiles + existingLength := len(existingPrecompiles) + updatedPrecompiles := make([]string, existingLength+len(hexAddresses)) + copy(updatedPrecompiles, existingPrecompiles) + copy(updatedPrecompiles[existingLength:], hexAddresses) - return k.SetParams(ctx, params) + utils.SortSlice(updatedPrecompiles) + return updatedPrecompiles, nil } // EnableEIPs enables the given EIPs in the EVM parameters. diff --git a/x/evm/keeper/params_test.go b/x/evm/keeper/params_test.go index 8ace1f0514..c491b338b5 100644 --- a/x/evm/keeper/params_test.go +++ b/x/evm/keeper/params_test.go @@ -106,7 +106,7 @@ func (suite *KeeperTestSuite) TestParams() { { name: "success - Active precompiles are sorted when setting params", paramsFun: func() interface{} { - params.ActivePrecompiles = []string{ + params.ActiveStaticPrecompiles = []string{ "0x0000000000000000000000000000000000000801", "0x0000000000000000000000000000000000000800", } @@ -121,7 +121,7 @@ func (suite *KeeperTestSuite) TestParams() { }, getFun: func() interface{} { evmParams := suite.app.EvmKeeper.GetParams(suite.ctx) - return evmParams.GetActivePrecompiles() + return evmParams.GetActiveStaticPrecompiles() }, expected: true, }, diff --git a/x/evm/keeper/precompiles.go b/x/evm/keeper/precompiles.go index b6897b90fe..f4a41e96e8 100644 --- a/x/evm/keeper/precompiles.go +++ b/x/evm/keeper/precompiles.go @@ -4,189 +4,62 @@ package keeper import ( - "bytes" - "fmt" - "maps" - "sort" - - "github.com/evmos/evmos/v18/precompiles/bech32" - + sdktypes "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" "github.com/evmos/evmos/v18/x/evm/core/vm" - - sdk "github.com/cosmos/cosmos-sdk/types" - authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" - bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - distributionkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" - channelkeeper "github.com/cosmos/ibc-go/v7/modules/core/04-channel/keeper" - bankprecompile "github.com/evmos/evmos/v18/precompiles/bank" - distprecompile "github.com/evmos/evmos/v18/precompiles/distribution" - ics20precompile "github.com/evmos/evmos/v18/precompiles/ics20" - "github.com/evmos/evmos/v18/precompiles/p256" - stakingprecompile "github.com/evmos/evmos/v18/precompiles/staking" - vestingprecompile "github.com/evmos/evmos/v18/precompiles/vesting" - erc20Keeper "github.com/evmos/evmos/v18/x/erc20/keeper" - transferkeeper "github.com/evmos/evmos/v18/x/ibc/transfer/keeper" - stakingkeeper "github.com/evmos/evmos/v18/x/staking/keeper" - vestingkeeper "github.com/evmos/evmos/v18/x/vesting/keeper" + "github.com/evmos/evmos/v18/x/evm/types" ) -// AvailablePrecompiles returns the list of all available precompiled contracts. -// NOTE: this should only be used during initialization of the Keeper. -func AvailablePrecompiles( - stakingKeeper stakingkeeper.Keeper, - distributionKeeper distributionkeeper.Keeper, - bankKeeper bankkeeper.Keeper, - erc20Keeper erc20Keeper.Keeper, - vestingKeeper any, - authzKeeper authzkeeper.Keeper, - transferKeeper transferkeeper.Keeper, - channelKeeper channelkeeper.Keeper, -) map[common.Address]vm.PrecompiledContract { - // Clone the mapping from the latest EVM fork. - precompiles := maps.Clone(vm.PrecompiledContractsBerlin) - - // secp256r1 precompile as per EIP-7212 - p256Precompile := &p256.Precompile{} - - bech32Precompile, err := bech32.NewPrecompile(6000) - if err != nil { - panic(fmt.Errorf("failed to instantiate bech32 precompile: %w", err)) - } - - stakingPrecompile, err := stakingprecompile.NewPrecompile(stakingKeeper, authzKeeper) - if err != nil { - panic(fmt.Errorf("failed to instantiate staking precompile: %w", err)) - } - - distributionPrecompile, err := distprecompile.NewPrecompile(distributionKeeper, stakingKeeper, authzKeeper) - if err != nil { - panic(fmt.Errorf("failed to instantiate distribution precompile: %w", err)) - } - - ibcTransferPrecompile, err := ics20precompile.NewPrecompile(stakingKeeper, transferKeeper, channelKeeper, authzKeeper) - if err != nil { - panic(fmt.Errorf("failed to instantiate ICS20 precompile: %w", err)) - } - - var vestingPrecompile vm.PrecompiledContract - if r, ok := vestingKeeper.(vestingkeeper.Keeper); ok { - vestingPrecompile, err = vestingprecompile.NewPrecompile(r, authzKeeper) - if err != nil { - panic(fmt.Errorf("failed to instantiate vesting precompile: %w", err)) - } - } - - bankPrecompile, err := bankprecompile.NewPrecompile(bankKeeper, erc20Keeper) - if err != nil { - panic(fmt.Errorf("failed to instantiate bank precompile: %w", err)) - } - - // Stateless precompiles - precompiles[bech32Precompile.Address()] = bech32Precompile - precompiles[p256Precompile.Address()] = p256Precompile - - // Stateful precompiles - precompiles[stakingPrecompile.Address()] = stakingPrecompile - precompiles[distributionPrecompile.Address()] = distributionPrecompile - precompiles[vestingPrecompile.Address()] = vestingPrecompile - precompiles[ibcTransferPrecompile.Address()] = ibcTransferPrecompile - precompiles[bankPrecompile.Address()] = bankPrecompile - - return precompiles +type Precompiles struct { + Map map[common.Address]vm.PrecompiledContract + Addresses []common.Address } -// WithPrecompiles sets the available precompiled contracts. -func (k *Keeper) WithPrecompiles(precompiles map[common.Address]vm.PrecompiledContract) *Keeper { - if k.precompiles != nil { - panic("available precompiles map already set") +// GetPrecompileInstance returns the address and instance of the static or dynamic precompile associated with the +// given address, or return nil if not found. +func (k *Keeper) GetPrecompileInstance( + ctx sdktypes.Context, + address common.Address, +) (*Precompiles, bool, error) { + params := k.GetParams(ctx) + // Get the precompile from the static precompiles + if precompile, found, err := k.GetStaticPrecompileInstance(¶ms, address); err != nil { + return nil, false, err + } else if found { + addressMap := make(map[common.Address]vm.PrecompiledContract) + addressMap[address] = precompile + return &Precompiles{ + Map: addressMap, + Addresses: []common.Address{precompile.Address()}, + }, found, nil } - if len(precompiles) == 0 { - panic("empty precompiled contract map") + // Get the precompile from the dynamic precompiles + precompile, found, err := k.erc20Keeper.GetERC20PrecompileInstance(ctx, address) + if err != nil || !found { + return nil, false, err } - - k.precompiles = precompiles - return k + addressMap := make(map[common.Address]vm.PrecompiledContract) + addressMap[address] = precompile + return &Precompiles{ + Map: addressMap, + Addresses: []common.Address{precompile.Address()}, + }, found, nil } -// Precompiles returns the subset of the available precompiled contracts that -// are active given the current parameters. -func (k Keeper) Precompiles( - activePrecompiles ...common.Address, -) map[common.Address]vm.PrecompiledContract { - activePrecompileMap := make(map[common.Address]vm.PrecompiledContract) - - for _, address := range activePrecompiles { - precompile, ok := k.precompiles[address] - if !ok { - panic(fmt.Sprintf("precompiled contract not initialized: %s", address)) +// GetPrecompilesCallHook returns a closure that can be used to instantiate the EVM with a specific +// precompile instance. +func (k *Keeper) GetPrecompilesCallHook(ctx sdktypes.Context) types.CallHook { + return func(evm *vm.EVM, _ common.Address, recipient common.Address) error { + // Check if the recipient is a precompile contract and if so, load the precompile instance + precompiles, found, err := k.GetPrecompileInstance(ctx, recipient) + if err != nil { + return err } - activePrecompileMap[address] = precompile - } - - return activePrecompileMap -} - -// AddEVMExtensions adds the given precompiles to the list of active precompiles in the EVM parameters -// and to the available precompiles map in the Keeper. This function returns an error if -// the precompiles are invalid or duplicated. -func (k *Keeper) AddEVMExtensions(ctx sdk.Context, precompiles ...vm.PrecompiledContract) error { - params := k.GetParams(ctx) - - addresses := make([]string, len(precompiles)) - precompilesMap := maps.Clone(k.precompiles) - - for i, precompile := range precompiles { - // add to active precompiles - address := precompile.Address() - addresses[i] = address.String() - - // add to available precompiles, but check for duplicates - if _, ok := precompilesMap[address]; ok { - return fmt.Errorf("precompile already registered: %s", address) + if found { + evm.WithPrecompiles(precompiles.Map, precompiles.Addresses) } - precompilesMap[address] = precompile - } - - params.ActivePrecompiles = append(params.ActivePrecompiles, addresses...) - - // NOTE: the active precompiles are sorted and validated before setting them - // in the params - if err := k.SetParams(ctx, params); err != nil { - return err + return nil } - - // update the pointer to the map with the newly added EVM Extensions - k.precompiles = precompilesMap - return nil -} - -// IsAvailablePrecompile returns true if the given precompile address is contained in the -// EVM keeper's available precompiles map. -func (k Keeper) IsAvailablePrecompile(address common.Address) bool { - _, ok := k.precompiles[address] - return ok -} - -// GetAvailablePrecompileAddrs returns the list of available precompile addresses. -// -// NOTE: uses index based approach instead of append because it's supposed to be faster. -// Check https://stackoverflow.com/questions/21362950/getting-a-slice-of-keys-from-a-map. -func (k Keeper) GetAvailablePrecompileAddrs() []common.Address { - addresses := make([]common.Address, len(k.precompiles)) - i := 0 - - //#nosec G705 -- two operations in for loop here are fine - for address := range k.precompiles { - addresses[i] = address - i++ - } - - sort.Slice(addresses, func(i, j int) bool { - return bytes.Compare(addresses[i].Bytes(), addresses[j].Bytes()) == -1 - }) - - return addresses } diff --git a/x/evm/keeper/precompiles_test.go b/x/evm/keeper/precompiles_test.go deleted file mode 100644 index 3e5414cddb..0000000000 --- a/x/evm/keeper/precompiles_test.go +++ /dev/null @@ -1,154 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package keeper_test - -import ( - "github.com/ethereum/go-ethereum/common" - stakingprecompile "github.com/evmos/evmos/v18/precompiles/staking" - "github.com/evmos/evmos/v18/x/evm/core/vm" - "github.com/evmos/evmos/v18/x/evm/types" -) - -func (suite *KeeperTestSuite) TestIsAvailablePrecompile() { - testcases := []struct { - name string - address common.Address - expAvailable bool - }{ - { - name: "pass - available precompile", - address: common.HexToAddress(stakingprecompile.PrecompileAddress), - expAvailable: true, - }, - { - name: "fail - unavailable precompile", - address: common.HexToAddress("0x0000000000000000000000000000000000099999"), - expAvailable: false, - }, - } - - for _, tc := range testcases { - tc := tc - - suite.Run(tc.name, func() { - suite.SetupTest() - - available := suite.app.EvmKeeper.IsAvailablePrecompile(tc.address) - suite.Require().Equal(tc.expAvailable, available) - }) - } -} - -// Check interface is correctly implemented -var ( - _ vm.PrecompiledContract = DummyPrecompile{} -) - -// DummyPrecompile is a dummy precompile implementation for testing purposes. -type DummyPrecompile struct { - vm.PrecompiledContract - - address string -} - -func (d DummyPrecompile) Address() common.Address { - return common.HexToAddress(d.address) -} - -var ( - // dummyPrecompile holds an unused precompile address to check adding EVM extensions. - dummyPrecompile = DummyPrecompile{address: "0x0000000000000000000000000000000000010000"} - // duplicatePrecompile holds the same address as an already existing precompile in the Go-Ethereum - // base implementation of the EVM. - duplicatePrecompile = DummyPrecompile{address: "0x0000000000000000000000000000000000000001"} - // otherPrecompile holds another unused precompile address to check adding multiple extensions at once. - otherPrecompile = DummyPrecompile{address: "0x0000000000000000000000000000000000010001"} -) - -func (suite *KeeperTestSuite) TestAddEVMExtensions() { - testcases := []struct { - name string - malleate func() []vm.PrecompiledContract - expPass bool - errContains string - expPrecompiles []string - }{ - { - name: "fail - already registered precompile", - malleate: func() []vm.PrecompiledContract { - return []vm.PrecompiledContract{duplicatePrecompile} - }, - errContains: "precompile already registered", - }, - { - name: "fail - add multiple precompiles with duplicates", - malleate: func() []vm.PrecompiledContract { - return []vm.PrecompiledContract{dummyPrecompile, dummyPrecompile} - }, - errContains: "precompile already registered", - }, - { - name: "fail - precompile already in active precompiles", - malleate: func() []vm.PrecompiledContract { - // NOTE: we adjust the EVM params here because the default active precompiles - // are all part of the available precompiles on the keeper and would not trigger - // the error on ValidatePrecompiles. - // - // We add the dummy precompile to the active precompiles to trigger the error. - params := suite.app.EvmKeeper.GetParams(suite.ctx) - params.ActivePrecompiles = append(params.ActivePrecompiles, dummyPrecompile.Address().String()) - err := suite.app.EvmKeeper.SetParams(suite.ctx, params) - suite.Require().NoError(err, "expected no error setting params") - - return []vm.PrecompiledContract{dummyPrecompile} - }, - errContains: "duplicate precompile", - }, - { - name: "pass - add precompile", - malleate: func() []vm.PrecompiledContract { - return []vm.PrecompiledContract{dummyPrecompile} - }, - expPass: true, - expPrecompiles: append(types.AvailableEVMExtensions, dummyPrecompile.Address().String()), - }, - { - name: "pass - add multiple precompiles", - malleate: func() []vm.PrecompiledContract { - return []vm.PrecompiledContract{dummyPrecompile, otherPrecompile} - }, - expPass: true, - expPrecompiles: append(types.AvailableEVMExtensions, dummyPrecompile.Address().String(), otherPrecompile.Address().String()), - }, - } - - for _, tc := range testcases { - tc := tc - - suite.Run(tc.name, func() { - suite.SetupTest() - - var extensions []vm.PrecompiledContract - suite.Require().NotNil(tc.malleate, "malleate must be defined") - extensions = tc.malleate() - - err := suite.app.EvmKeeper.AddEVMExtensions(suite.ctx, extensions...) - if tc.expPass { - suite.Require().NoError(err, "expected no error adding extensions") - - activePrecompiles := suite.app.EvmKeeper.GetParams(suite.ctx).ActivePrecompiles - suite.Require().Equal(tc.expPrecompiles, activePrecompiles, "expected different active precompiles") - - availablePrecompiles := suite.app.EvmKeeper.GetAvailablePrecompileAddrs() - for _, expPrecompile := range tc.expPrecompiles { - expPrecompileAddr := common.HexToAddress(expPrecompile) - suite.Require().Contains(availablePrecompiles, expPrecompileAddr, "expected available precompiles to contain: %s", expPrecompile) - } - } else { - suite.Require().Error(err, "expected error adding extensions") - suite.Require().ErrorContains(err, tc.errContains, "expected different error") - } - }) - } -} diff --git a/x/evm/keeper/setup_test.go b/x/evm/keeper/setup_test.go index d45bd51f0a..5bf7e35ae2 100644 --- a/x/evm/keeper/setup_test.go +++ b/x/evm/keeper/setup_test.go @@ -14,6 +14,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/crypto/keyring" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" @@ -39,6 +40,7 @@ type KeeperTestSuite struct { ctx sdk.Context app *app.Evmos + priv cryptotypes.PrivKey queryClient evmtypes.QueryClient address common.Address consAddress sdk.ConsAddress @@ -99,6 +101,7 @@ func (suite *KeeperTestSuite) SetupAppWithT(checkTx bool, t require.TestingT, ch priv := ðsecp256k1.PrivKey{ Key: crypto.FromECDSA(ecdsaPriv), } + suite.priv = priv suite.address = common.BytesToAddress(priv.PubKey().Address().Bytes()) suite.signer = utiltx.NewSigner(priv) diff --git a/x/evm/keeper/state_transition.go b/x/evm/keeper/state_transition.go index 414d184aa2..ddef4c2c90 100644 --- a/x/evm/keeper/state_transition.go +++ b/x/evm/keeper/state_transition.go @@ -4,7 +4,6 @@ package keeper import ( "math/big" - "slices" tmtypes "github.com/cometbft/cometbft/types" @@ -69,6 +68,7 @@ func (k *Keeper) NewEVM( ) evmHooks.AddCallHooks( accessControl.GetCallHook(signer), + k.GetPrecompilesCallHook(ctx), ) return vm.NewEVMWithHooks(evmHooks, blockCtx, txCtx, stateDB, cfg.ChainConfig, vmConfig) } @@ -276,33 +276,6 @@ func (k *Keeper) ApplyMessageWithConfig( stateDB := statedb.New(ctx, k, txConfig) evm := k.NewEVM(ctx, msg, cfg, tracer, stateDB) - // set the custom precompiles to the EVM (if any) - if cfg.Params.HasCustomPrecompiles() { - customPrecompiles := cfg.Params.GetActivePrecompilesAddrs() - - activePrecompiles := make([]common.Address, len(vm.PrecompiledAddressesBerlin)+len(customPrecompiles)) - copy(activePrecompiles[:len(vm.PrecompiledAddressesBerlin)], vm.PrecompiledAddressesBerlin) - copy(activePrecompiles[len(vm.PrecompiledAddressesBerlin):], customPrecompiles) - - // Check if the transaction is sent to an inactive precompile - // - // NOTE: This has to be checked here instead of in the actual evm.Call method - // because evm.WithPrecompiles only populates the EVM with the active precompiles, - // so there's no telling if the To address is an inactive precompile further down the call stack. - toAddr := msg.To() - if toAddr != nil && - slices.Contains(types.AvailableEVMExtensions, toAddr.String()) && - !slices.Contains(activePrecompiles, *toAddr) { - return nil, errorsmod.Wrap(types.ErrInactivePrecompile, "failed to call precompile") - } - - // NOTE: this only adds active precompiles to the EVM. - // This means that evm.Precompile(addr) will return false for inactive precompiles - // even though this is actually a reserved address. - precompileMap := k.Precompiles(activePrecompiles...) - evm.WithPrecompiles(precompileMap, activePrecompiles) - } - leftoverGas := msg.Gas() // Allow the tracer captures the tx level events, mainly the gas consumption. diff --git a/x/evm/keeper/statedb.go b/x/evm/keeper/statedb.go index d3d3770071..5634d6091a 100644 --- a/x/evm/keeper/statedb.go +++ b/x/evm/keeper/statedb.go @@ -33,7 +33,7 @@ func (k *Keeper) GetAccount(ctx sdk.Context, addr common.Address) *statedb.Accou return acct } -// GetState loads contract state from database, implements `statedb.Keeper` interface. +// GetState loads contract state from database. func (k *Keeper) GetState(ctx sdk.Context, addr common.Address, key common.Hash) common.Hash { store := prefix.NewStore(ctx.KVStore(k.storeKey), types.AddressStoragePrefix(addr)) @@ -45,6 +45,13 @@ func (k *Keeper) GetState(ctx sdk.Context, addr common.Address, key common.Hash) return common.BytesToHash(value) } +// GetFastState loads contract state from database. +func (k *Keeper) GetFastState(ctx sdk.Context, addr common.Address, key common.Hash) []byte { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.AddressStoragePrefix(addr)) + + return store.Get(key.Bytes()) +} + // GetCodeHash loads the code hash from the database for the given contract address. func (k *Keeper) GetCodeHash(ctx sdk.Context, addr common.Address) common.Hash { store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefixCodeHash) diff --git a/x/evm/keeper/static_precompiles.go b/x/evm/keeper/static_precompiles.go new file mode 100644 index 0000000000..4f35d2d563 --- /dev/null +++ b/x/evm/keeper/static_precompiles.go @@ -0,0 +1,137 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package keeper + +import ( + "fmt" + "slices" + + authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" + bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" + distributionkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" + channelkeeper "github.com/cosmos/ibc-go/v7/modules/core/04-channel/keeper" + "github.com/ethereum/go-ethereum/common" + bankprecompile "github.com/evmos/evmos/v18/precompiles/bank" + "github.com/evmos/evmos/v18/precompiles/bech32" + distprecompile "github.com/evmos/evmos/v18/precompiles/distribution" + ics20precompile "github.com/evmos/evmos/v18/precompiles/ics20" + "github.com/evmos/evmos/v18/precompiles/p256" + stakingprecompile "github.com/evmos/evmos/v18/precompiles/staking" + vestingprecompile "github.com/evmos/evmos/v18/precompiles/vesting" + erc20Keeper "github.com/evmos/evmos/v18/x/erc20/keeper" + "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v18/x/evm/types" + transferkeeper "github.com/evmos/evmos/v18/x/ibc/transfer/keeper" + stakingkeeper "github.com/evmos/evmos/v18/x/staking/keeper" + vestingkeeper "github.com/evmos/evmos/v18/x/vesting/keeper" + "golang.org/x/exp/maps" +) + +const bech32PrecompileBaseGas = 6_000 + +// AvailableStaticPrecompiles returns the list of all available static precompiled contracts. +// NOTE: this should only be used during initialization of the Keeper. +func NewAvailableStaticPrecompiles( + stakingKeeper stakingkeeper.Keeper, + distributionKeeper distributionkeeper.Keeper, + bankKeeper bankkeeper.Keeper, + erc20Keeper erc20Keeper.Keeper, + vestingKeeper vestingkeeper.Keeper, + authzKeeper authzkeeper.Keeper, + transferKeeper transferkeeper.Keeper, + channelKeeper channelkeeper.Keeper, +) map[common.Address]vm.PrecompiledContract { + // Clone the mapping from the latest EVM fork. + precompiles := maps.Clone(vm.PrecompiledContractsBerlin) + + // secp256r1 precompile as per EIP-7212 + p256Precompile := &p256.Precompile{} + + bech32Precompile, err := bech32.NewPrecompile(bech32PrecompileBaseGas) + if err != nil { + panic(fmt.Errorf("failed to instantiate bech32 precompile: %w", err)) + } + + stakingPrecompile, err := stakingprecompile.NewPrecompile(stakingKeeper, authzKeeper) + if err != nil { + panic(fmt.Errorf("failed to instantiate staking precompile: %w", err)) + } + + distributionPrecompile, err := distprecompile.NewPrecompile( + distributionKeeper, + stakingKeeper, + authzKeeper, + ) + if err != nil { + panic(fmt.Errorf("failed to instantiate distribution precompile: %w", err)) + } + + ibcTransferPrecompile, err := ics20precompile.NewPrecompile( + stakingKeeper, + transferKeeper, + channelKeeper, + authzKeeper, + ) + if err != nil { + panic(fmt.Errorf("failed to instantiate ICS20 precompile: %w", err)) + } + + vestingPrecompile, err := vestingprecompile.NewPrecompile(vestingKeeper, authzKeeper) + if err != nil { + panic(fmt.Errorf("failed to instantiate vesting precompile: %w", err)) + } + + bankPrecompile, err := bankprecompile.NewPrecompile(bankKeeper, erc20Keeper) + if err != nil { + panic(fmt.Errorf("failed to instantiate bank precompile: %w", err)) + } + + // Stateless precompiles + precompiles[bech32Precompile.Address()] = bech32Precompile + precompiles[p256Precompile.Address()] = p256Precompile + + // Stateful precompiles + precompiles[stakingPrecompile.Address()] = stakingPrecompile + precompiles[distributionPrecompile.Address()] = distributionPrecompile + precompiles[ibcTransferPrecompile.Address()] = ibcTransferPrecompile + precompiles[vestingPrecompile.Address()] = vestingPrecompile + precompiles[bankPrecompile.Address()] = bankPrecompile + return precompiles +} + +// WithStaticPrecompiles sets the available static precompiled contracts. +func (k *Keeper) WithStaticPrecompiles(precompiles map[common.Address]vm.PrecompiledContract) *Keeper { + if k.precompiles != nil { + panic("available precompiles map already set") + } + + if len(precompiles) == 0 { + panic("empty precompiled contract map") + } + + k.precompiles = precompiles + return k +} + +// GetStaticPrecompileInstance returns the instance of the given static precompile address. +func (k *Keeper) GetStaticPrecompileInstance(params *types.Params, address common.Address) (vm.PrecompiledContract, bool, error) { + if k.IsAvailableStaticPrecompile(params, address) { + precompile, found := k.precompiles[address] + // If the precompile is within params but not found in the precompiles map it means we have memory + // corruption. + if !found { + panic(fmt.Errorf("precompiled contract not stored in memory: %s", address)) + } + return precompile, true, nil + } + return nil, false, nil +} + +// IsAvailablePrecompile returns true if the given static precompile address is contained in the +// EVM keeper's available precompiles map. +// This function assumes that the Berlin precompiles cannot be disabled. +func (k Keeper) IsAvailableStaticPrecompile(params *types.Params, address common.Address) bool { + return slices.Contains(params.ActiveStaticPrecompiles, address.String()) || + slices.Contains(vm.PrecompiledAddressesBerlin, address) +} diff --git a/x/evm/migrations/v6/migrate.go b/x/evm/migrations/v6/migrate.go index fb0b3d71b7..6db7b37e46 100644 --- a/x/evm/migrations/v6/migrate.go +++ b/x/evm/migrations/v6/migrate.go @@ -53,7 +53,7 @@ func MigrateStore( CancunBlock: paramsV5.ChainConfig.CancunBlock, } params.AllowUnprotectedTxs = paramsV5.AllowUnprotectedTxs - params.ActivePrecompiles = paramsV5.ActivePrecompiles + params.ActiveStaticPrecompiles = paramsV5.ActivePrecompiles params.EVMChannels = types.DefaultEVMChannels // DefaultEVMChannels are for Evmos mainnet diff --git a/x/evm/migrations/v6/migrate_test.go b/x/evm/migrations/v6/migrate_test.go index 20bc913eb4..a646eba565 100644 --- a/x/evm/migrations/v6/migrate_test.go +++ b/x/evm/migrations/v6/migrate_test.go @@ -37,7 +37,7 @@ func TestMigrate(t *testing.T) { ChainConfig: chainCfgV5, ExtraEIPs: types.DefaultExtraEIPs, AllowUnprotectedTxs: types.DefaultAllowUnprotectedTxs, - ActivePrecompiles: types.AvailableEVMExtensions, + ActivePrecompiles: types.DefaultStaticPrecompiles, } // Set the params in the store diff --git a/x/evm/migrations/v7/migrate.go b/x/evm/migrations/v7/migrate.go index be3287a1e8..3c8cccc1e5 100644 --- a/x/evm/migrations/v7/migrate.go +++ b/x/evm/migrations/v7/migrate.go @@ -52,7 +52,7 @@ func MigrateStore( CancunBlock: paramsV6.ChainConfig.CancunBlock, } params.AllowUnprotectedTxs = paramsV6.AllowUnprotectedTxs - params.ActivePrecompiles = paramsV6.ActivePrecompiles + params.ActiveStaticPrecompiles = paramsV6.ActivePrecompiles params.EVMChannels = paramsV6.EVMChannels // set the default access control configuration diff --git a/x/evm/migrations/v7/migrate_test.go b/x/evm/migrations/v7/migrate_test.go index 8e2fa01f7e..aeb01de1b3 100644 --- a/x/evm/migrations/v7/migrate_test.go +++ b/x/evm/migrations/v7/migrate_test.go @@ -12,7 +12,7 @@ import ( "github.com/evmos/evmos/v18/app" "github.com/evmos/evmos/v18/encoding" - "github.com/evmos/evmos/v18/x/evm/migrations/v7" + v7 "github.com/evmos/evmos/v18/x/evm/migrations/v7" v6types "github.com/evmos/evmos/v18/x/evm/migrations/v7/types" "github.com/evmos/evmos/v18/x/evm/types" ) @@ -37,7 +37,7 @@ func TestMigrate(t *testing.T) { ChainConfig: chainCfgV6, ExtraEIPs: types.DefaultExtraEIPs, AllowUnprotectedTxs: types.DefaultAllowUnprotectedTxs, - ActivePrecompiles: types.AvailableEVMExtensions, + ActivePrecompiles: types.DefaultStaticPrecompiles, EVMChannels: types.DefaultEVMChannels, } diff --git a/x/evm/types/evm.pb.go b/x/evm/types/evm.pb.go index 21ea1095f5..500bf5453d 100644 --- a/x/evm/types/evm.pb.go +++ b/x/evm/types/evm.pb.go @@ -68,13 +68,13 @@ type Params struct { // allow_unprotected_txs defines if replay-protected (i.e non EIP155 // signed) transactions can be executed on the state machine. AllowUnprotectedTxs bool `protobuf:"varint,6,opt,name=allow_unprotected_txs,json=allowUnprotectedTxs,proto3" json:"allow_unprotected_txs,omitempty"` - // active_precompiles defines the slice of hex addresses of the precompiled - // contracts that are active - ActivePrecompiles []string `protobuf:"bytes,7,rep,name=active_precompiles,json=activePrecompiles,proto3" json:"active_precompiles,omitempty"` // evm_channels is the list of channel identifiers from EVM compatible chains EVMChannels []string `protobuf:"bytes,8,rep,name=evm_channels,json=evmChannels,proto3" json:"evm_channels,omitempty"` // access_control defines the permission policy of the EVM AccessControl AccessControl `protobuf:"bytes,9,opt,name=access_control,json=accessControl,proto3" json:"access_control"` + // active_static_precompiles defines the slice of hex addresses of the precompiled + // contracts that are active + ActiveStaticPrecompiles []string `protobuf:"bytes,10,rep,name=active_static_precompiles,json=activeStaticPrecompiles,proto3" json:"active_static_precompiles,omitempty"` } func (m *Params) Reset() { *m = Params{} } @@ -138,13 +138,6 @@ func (m *Params) GetAllowUnprotectedTxs() bool { return false } -func (m *Params) GetActivePrecompiles() []string { - if m != nil { - return m.ActivePrecompiles - } - return nil -} - func (m *Params) GetEVMChannels() []string { if m != nil { return m.EVMChannels @@ -159,6 +152,13 @@ func (m *Params) GetAccessControl() AccessControl { return AccessControl{} } +func (m *Params) GetActiveStaticPrecompiles() []string { + if m != nil { + return m.ActiveStaticPrecompiles + } + return nil +} + // AccessControl defines the permission policy of the EVM // for creating and calling contracts type AccessControl struct { @@ -848,125 +848,126 @@ func init() { func init() { proto.RegisterFile("ethermint/evm/v1/evm.proto", fileDescriptor_d21ecc92c8c8583e) } var fileDescriptor_d21ecc92c8c8583e = []byte{ - // 1884 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x58, 0xdd, 0x4f, 0x2b, 0xc7, - 0x15, 0xc7, 0x78, 0x81, 0xf5, 0xd8, 0xd8, 0xcb, 0x60, 0x88, 0xe3, 0xa4, 0x2c, 0xdd, 0x56, 0x15, - 0xad, 0x12, 0xb8, 0x70, 0x43, 0x8b, 0x92, 0x7e, 0x61, 0x70, 0x5a, 0x28, 0xf7, 0x06, 0x8d, 0x49, - 0xab, 0x54, 0x8d, 0x56, 0xe3, 0xdd, 0x89, 0xbd, 0x61, 0x77, 0xc7, 0xda, 0x19, 0xfb, 0xda, 0xfd, - 0x0b, 0xa2, 0xdb, 0x97, 0xf6, 0x0f, 0xb8, 0x52, 0xa4, 0xfe, 0x23, 0x7d, 0x8c, 0xfa, 0x94, 0xc7, - 0xaa, 0x52, 0xb7, 0x95, 0xef, 0x1b, 0x8f, 0xbc, 0x57, 0xaa, 0xe6, 0xc3, 0x9f, 0x10, 0x42, 0x5f, - 0x60, 0xce, 0xd7, 0xef, 0x77, 0xce, 0x99, 0xb3, 0x3b, 0xb3, 0x06, 0x55, 0xc2, 0xdb, 0x24, 0x89, - 0x82, 0x98, 0xef, 0x91, 0x5e, 0xb4, 0xd7, 0xdb, 0x17, 0xff, 0x76, 0x3b, 0x09, 0xe5, 0x14, 0x5a, - 0x63, 0xdb, 0xae, 0x50, 0xf6, 0xf6, 0xab, 0xe5, 0x16, 0x6d, 0x51, 0x69, 0xdc, 0x13, 0x2b, 0xe5, - 0xe7, 0xfc, 0x3b, 0x0b, 0x96, 0x2f, 0x71, 0x82, 0x23, 0x06, 0xf7, 0x41, 0x8e, 0xf4, 0x22, 0xd7, - 0x27, 0x31, 0x8d, 0x2a, 0x99, 0xed, 0xcc, 0x4e, 0xae, 0x56, 0xbe, 0x4d, 0x6d, 0x6b, 0x80, 0xa3, - 0xf0, 0x7d, 0x67, 0x6c, 0x72, 0x90, 0x49, 0x7a, 0xd1, 0xa9, 0x58, 0xc2, 0x63, 0x00, 0x48, 0x9f, - 0x27, 0xd8, 0x25, 0x41, 0x87, 0x55, 0x8c, 0xed, 0xec, 0x4e, 0xb6, 0xe6, 0x0c, 0x53, 0x3b, 0x57, - 0x17, 0xda, 0xfa, 0xd9, 0x25, 0xbb, 0x4d, 0xed, 0x35, 0x0d, 0x30, 0x76, 0x74, 0x50, 0x4e, 0x0a, - 0xf5, 0xa0, 0xc3, 0xe0, 0xa7, 0xa0, 0xe0, 0xb5, 0x71, 0x10, 0xbb, 0x1e, 0x8d, 0x3f, 0x0b, 0x5a, - 0x95, 0xa5, 0xed, 0xcc, 0x4e, 0xfe, 0xe0, 0x3b, 0xbb, 0xf3, 0xf9, 0xef, 0x9e, 0x08, 0xaf, 0x13, - 0xe9, 0x54, 0x7b, 0xeb, 0xab, 0xd4, 0x5e, 0xb8, 0x4d, 0xed, 0x75, 0x05, 0x3d, 0x0d, 0xe0, 0xa0, - 0xbc, 0x37, 0xf1, 0x84, 0x07, 0x60, 0x03, 0x87, 0x21, 0x7d, 0xe1, 0x76, 0x63, 0x51, 0x30, 0xf1, - 0x38, 0xf1, 0x5d, 0xde, 0x67, 0x95, 0xe5, 0xed, 0xcc, 0x8e, 0x89, 0xd6, 0xa5, 0xf1, 0xe3, 0x89, - 0xed, 0xaa, 0xcf, 0xe0, 0xbb, 0x00, 0x62, 0x8f, 0x07, 0x3d, 0xe2, 0x76, 0x12, 0xe2, 0xd1, 0xa8, - 0x13, 0x84, 0x84, 0x55, 0x56, 0xb6, 0xb3, 0x3b, 0x39, 0xb4, 0xa6, 0x2c, 0x97, 0x13, 0x03, 0x3c, - 0x00, 0x05, 0xd1, 0x1c, 0xaf, 0x8d, 0xe3, 0x98, 0x84, 0xac, 0x62, 0x0a, 0xc7, 0x5a, 0x69, 0x98, - 0xda, 0xf9, 0xfa, 0x6f, 0x9f, 0x9d, 0x68, 0x35, 0xca, 0x93, 0x5e, 0x34, 0x12, 0xe0, 0xa7, 0xa0, - 0x88, 0x3d, 0x8f, 0x30, 0x26, 0xb2, 0xe6, 0x09, 0x0d, 0x2b, 0x39, 0x59, 0xb7, 0x7d, 0xb7, 0xee, - 0x63, 0xe9, 0x77, 0xa2, 0xdc, 0x6a, 0x1b, 0xa2, 0xf2, 0x61, 0x6a, 0xaf, 0xce, 0xa8, 0xd1, 0x2a, - 0x9e, 0x16, 0xcf, 0x0d, 0x73, 0xd1, 0xca, 0x9e, 0x1b, 0x66, 0xd6, 0x32, 0x9c, 0xbf, 0x64, 0xc0, - 0xac, 0x33, 0x3c, 0x06, 0xcb, 0x5e, 0x42, 0x30, 0x27, 0x72, 0x97, 0xf3, 0x07, 0xdf, 0xfb, 0x16, - 0xd2, 0xab, 0x41, 0x87, 0xd4, 0x0c, 0x41, 0x8c, 0x74, 0x20, 0xfc, 0x19, 0x30, 0x3c, 0x1c, 0x86, - 0x95, 0xc5, 0xff, 0x17, 0x40, 0x86, 0x39, 0xff, 0xca, 0x80, 0xb5, 0x3b, 0x1e, 0xd0, 0x03, 0x79, - 0xdd, 0x14, 0x3e, 0xe8, 0xa8, 0xe4, 0x8a, 0x07, 0x6f, 0x7f, 0x13, 0xb6, 0x04, 0xfd, 0xfe, 0x30, - 0xb5, 0xc1, 0x44, 0xbe, 0x4d, 0x6d, 0xa8, 0x46, 0x62, 0x0a, 0xc8, 0x41, 0x00, 0x8f, 0x3d, 0xa0, - 0x07, 0xd6, 0x67, 0x3b, 0xef, 0x86, 0x01, 0xe3, 0x95, 0x45, 0xb9, 0x69, 0x4f, 0x87, 0xa9, 0x3d, - 0x9b, 0xd8, 0x45, 0xc0, 0xf8, 0x6d, 0x6a, 0x57, 0x67, 0x50, 0xa7, 0x23, 0x1d, 0x31, 0x12, 0x73, - 0x01, 0xce, 0x7f, 0x8b, 0x20, 0x3f, 0x35, 0xaf, 0xf0, 0x0f, 0xa0, 0xd4, 0xa6, 0x11, 0x61, 0x9c, - 0x60, 0xdf, 0x6d, 0x86, 0xd4, 0xbb, 0xd6, 0x0f, 0xd8, 0xd3, 0x7f, 0xa6, 0xf6, 0x86, 0x47, 0x59, - 0x44, 0x19, 0xf3, 0xaf, 0x77, 0x03, 0xba, 0x17, 0x61, 0xde, 0xde, 0x3d, 0x8b, 0x05, 0xe9, 0xa6, - 0x22, 0x9d, 0x8b, 0x74, 0x50, 0x71, 0xac, 0xa9, 0x09, 0x05, 0x6c, 0x83, 0xa2, 0x8f, 0xa9, 0xfb, - 0x19, 0x4d, 0xae, 0x35, 0xf8, 0xa2, 0x04, 0xaf, 0x7d, 0x23, 0xf8, 0x30, 0xb5, 0x0b, 0xa7, 0xc7, - 0x1f, 0x7d, 0x48, 0x93, 0x6b, 0x09, 0x71, 0x9b, 0xda, 0x1b, 0x8a, 0x6c, 0x16, 0xc8, 0x41, 0x05, - 0x1f, 0xd3, 0xb1, 0x1b, 0xfc, 0x1d, 0xb0, 0xc6, 0x0e, 0xac, 0xdb, 0xe9, 0xd0, 0x84, 0x57, 0xb2, - 0xe2, 0x41, 0xaa, 0xbd, 0x3b, 0x4c, 0xed, 0xa2, 0x86, 0x6c, 0x28, 0xcb, 0x6d, 0x6a, 0xbf, 0x31, - 0x07, 0xaa, 0x63, 0x1c, 0x54, 0xd4, 0xb0, 0xda, 0x15, 0x36, 0x41, 0x81, 0x04, 0x9d, 0xfd, 0xc3, - 0x27, 0xba, 0x00, 0x43, 0x16, 0xf0, 0x8b, 0x87, 0x0a, 0xc8, 0xd7, 0xcf, 0x2e, 0xf7, 0x0f, 0x9f, - 0x8c, 0xf2, 0xd7, 0xaf, 0x82, 0x69, 0x14, 0x07, 0xe5, 0x95, 0xa8, 0x92, 0x3f, 0x03, 0x5a, 0x74, - 0xdb, 0x98, 0xb5, 0xe5, 0x8b, 0x26, 0x57, 0xdb, 0x11, 0x03, 0xa4, 0x90, 0x7e, 0x8d, 0x59, 0x7b, - 0xd2, 0xf5, 0xe6, 0xe0, 0x8f, 0x38, 0xe6, 0x41, 0x37, 0x1a, 0x61, 0x01, 0x15, 0x2c, 0xbc, 0xc6, - 0xe9, 0x1e, 0xea, 0x74, 0x97, 0x1f, 0x9b, 0xee, 0xe1, 0x7d, 0xe9, 0x1e, 0xce, 0xa6, 0xab, 0x7c, - 0xc6, 0x1c, 0x47, 0x9a, 0x63, 0xe5, 0xb1, 0x1c, 0x47, 0xf7, 0x71, 0x1c, 0xcd, 0x72, 0x28, 0x1f, - 0x31, 0x97, 0x73, 0x75, 0x56, 0xcc, 0x47, 0xcf, 0xe5, 0x9d, 0x0e, 0x15, 0xc7, 0x1a, 0x85, 0x7e, - 0x0d, 0xca, 0x1e, 0x8d, 0x19, 0x17, 0xba, 0x98, 0x76, 0x42, 0xa2, 0x29, 0x72, 0x92, 0xe2, 0xe8, - 0x21, 0x8a, 0xb7, 0xf4, 0x8b, 0xfd, 0x9e, 0x70, 0x07, 0xad, 0xcf, 0xaa, 0x15, 0x99, 0x0b, 0xac, - 0x0e, 0xe1, 0x24, 0x61, 0xcd, 0x6e, 0xd2, 0xd2, 0x44, 0x40, 0x12, 0xbd, 0xf7, 0x10, 0x91, 0x9e, - 0xd0, 0xf9, 0x50, 0x07, 0x95, 0x26, 0x2a, 0x45, 0xf0, 0x09, 0x28, 0x06, 0x82, 0xb5, 0xd9, 0x0d, - 0x35, 0x7c, 0x5e, 0xc2, 0x1f, 0x3c, 0x04, 0xaf, 0x9f, 0xaa, 0xd9, 0x40, 0x07, 0xad, 0x8e, 0x14, - 0x0a, 0xda, 0x07, 0x30, 0xea, 0x06, 0x89, 0xdb, 0x0a, 0xb1, 0x17, 0x90, 0x44, 0xc3, 0x17, 0x24, - 0xfc, 0x8f, 0x1f, 0x82, 0x7f, 0x53, 0xc1, 0xdf, 0x0d, 0x76, 0x90, 0x25, 0x94, 0xbf, 0x52, 0x3a, - 0xc5, 0xd2, 0x00, 0x85, 0x26, 0x49, 0xc2, 0x20, 0xd6, 0xf8, 0xab, 0x12, 0xff, 0xc9, 0x43, 0xf8, - 0x7a, 0x82, 0xa6, 0xc3, 0x1c, 0x94, 0x57, 0xe2, 0x18, 0x34, 0xa4, 0xb1, 0x4f, 0x47, 0xa0, 0x6b, - 0x8f, 0x06, 0x9d, 0x0e, 0x73, 0x50, 0x5e, 0x89, 0x0a, 0xb4, 0x05, 0xd6, 0x71, 0x92, 0xd0, 0x17, - 0x73, 0x0d, 0x81, 0x12, 0xfb, 0x27, 0x0f, 0x61, 0x8f, 0xde, 0xd3, 0x77, 0xa3, 0xc5, 0x7b, 0x5a, - 0x68, 0x67, 0x5a, 0xe2, 0x03, 0xd8, 0x4a, 0xf0, 0x60, 0x8e, 0xa7, 0xfc, 0xe8, 0xc6, 0xdf, 0x0d, - 0x76, 0x90, 0x25, 0x94, 0x33, 0x2c, 0x9f, 0x83, 0x72, 0x44, 0x92, 0x16, 0x71, 0x63, 0xc2, 0x59, - 0x27, 0x0c, 0xb8, 0xe6, 0xd9, 0x78, 0xf4, 0x73, 0x70, 0x5f, 0xb8, 0x83, 0xa0, 0x54, 0x3f, 0xd7, - 0xda, 0xf1, 0x94, 0xb2, 0x36, 0x8e, 0x5b, 0x6d, 0x1c, 0x68, 0x96, 0xcd, 0x47, 0x4f, 0xe9, 0x6c, - 0xa0, 0x83, 0x56, 0x47, 0x8a, 0xf1, 0x56, 0x7b, 0x38, 0xf6, 0xba, 0xa3, 0xad, 0x7e, 0xe3, 0xd1, - 0x5b, 0x3d, 0x1d, 0x26, 0xee, 0x67, 0x52, 0x94, 0xa0, 0xe7, 0x86, 0x59, 0xb4, 0x4a, 0xe7, 0x86, - 0x59, 0xb2, 0xac, 0x73, 0xc3, 0xb4, 0xac, 0xb5, 0x73, 0xc3, 0x5c, 0xb7, 0xca, 0x68, 0x75, 0x40, - 0x43, 0xea, 0xf6, 0x9e, 0xaa, 0x20, 0x94, 0x27, 0x2f, 0x30, 0xd3, 0x2f, 0x1a, 0x54, 0xf4, 0x30, - 0xc7, 0xe1, 0x80, 0xe9, 0x46, 0x20, 0x4b, 0xb5, 0x67, 0xea, 0xd8, 0xda, 0x03, 0x4b, 0x0d, 0x2e, - 0xee, 0x29, 0x16, 0xc8, 0x5e, 0x93, 0x81, 0x3a, 0x6c, 0x91, 0x58, 0xc2, 0x32, 0x58, 0xea, 0xe1, - 0xb0, 0x4b, 0xd4, 0x19, 0x89, 0x94, 0xe0, 0x5c, 0x82, 0xd2, 0x55, 0x82, 0x63, 0x26, 0x6e, 0x77, - 0x34, 0xbe, 0xa0, 0x2d, 0x06, 0x21, 0x30, 0xe4, 0x39, 0xa1, 0x62, 0xe5, 0x1a, 0xfe, 0x10, 0x18, - 0x21, 0x6d, 0x31, 0x79, 0x5b, 0xc8, 0x1f, 0x6c, 0xdc, 0xbd, 0x9a, 0x5c, 0xd0, 0x16, 0x92, 0x2e, - 0xce, 0xdf, 0x17, 0x41, 0xf6, 0x82, 0xb6, 0x60, 0x05, 0xac, 0x60, 0xdf, 0x4f, 0x08, 0x63, 0x1a, - 0x69, 0x24, 0xc2, 0x4d, 0xb0, 0xcc, 0x69, 0x27, 0xf0, 0x14, 0x5c, 0x0e, 0x69, 0x49, 0x10, 0xfb, - 0x98, 0x63, 0x79, 0xb0, 0x16, 0x90, 0x5c, 0x8b, 0x3b, 0xa6, 0xac, 0xcc, 0x8d, 0xbb, 0x51, 0x93, - 0x24, 0xf2, 0x7c, 0x34, 0x6a, 0xa5, 0x9b, 0xd4, 0xce, 0x4b, 0xfd, 0x73, 0xa9, 0x46, 0xd3, 0x02, - 0x7c, 0x07, 0xac, 0xf0, 0xfe, 0xf4, 0x59, 0xb7, 0x7e, 0x93, 0xda, 0x25, 0x3e, 0x29, 0x53, 0x1c, - 0x65, 0x68, 0x99, 0xf7, 0xe5, 0x91, 0xb6, 0x07, 0x4c, 0xde, 0x77, 0x83, 0xd8, 0x27, 0x7d, 0x79, - 0x9c, 0x19, 0xb5, 0xf2, 0x4d, 0x6a, 0x5b, 0x53, 0xee, 0x67, 0xc2, 0x86, 0x56, 0x78, 0x5f, 0x2e, - 0xe0, 0x3b, 0x00, 0xa8, 0x94, 0x24, 0x83, 0x3a, 0x9d, 0x56, 0x6f, 0x52, 0x3b, 0x27, 0xb5, 0x12, - 0x7b, 0xb2, 0x84, 0x0e, 0x58, 0x52, 0xd8, 0xa6, 0xc4, 0x2e, 0xdc, 0xa4, 0xb6, 0x19, 0xd2, 0x96, - 0xc2, 0x54, 0x26, 0xd1, 0xaa, 0x84, 0x44, 0xb4, 0x47, 0x7c, 0x79, 0x44, 0x98, 0x68, 0x24, 0x3a, - 0x7f, 0x5a, 0x04, 0xe6, 0x55, 0x1f, 0x11, 0xd6, 0x0d, 0x39, 0xfc, 0x10, 0x58, 0xf2, 0x02, 0x86, - 0x3d, 0xee, 0xce, 0xb4, 0xb6, 0xf6, 0xd6, 0xe4, 0x85, 0x3e, 0xef, 0xe1, 0xa0, 0xd2, 0x48, 0x75, - 0xac, 0xfb, 0x5f, 0x06, 0x4b, 0xcd, 0x90, 0xd2, 0x48, 0x4e, 0x42, 0x01, 0x29, 0x01, 0x22, 0xd9, - 0x35, 0xb9, 0xcb, 0x59, 0x79, 0xb9, 0xfd, 0xee, 0xdd, 0x5d, 0x9e, 0x1b, 0x95, 0xda, 0xa6, 0xfe, - 0x1c, 0x29, 0x2a, 0x6e, 0x1d, 0xef, 0x88, 0xde, 0xca, 0x51, 0xb2, 0x40, 0x36, 0x21, 0x5c, 0x6e, - 0x5a, 0x01, 0x89, 0x25, 0xac, 0x02, 0x33, 0x21, 0x3d, 0x92, 0x70, 0xe2, 0xcb, 0xcd, 0x31, 0xd1, - 0x58, 0x86, 0x6f, 0x02, 0xb3, 0x85, 0x99, 0xdb, 0x65, 0xc4, 0x57, 0x3b, 0x81, 0x56, 0x5a, 0x98, - 0x7d, 0xcc, 0x88, 0xff, 0xbe, 0xf1, 0xc5, 0x97, 0xf6, 0x82, 0x83, 0x41, 0x5e, 0x5f, 0x79, 0xbb, - 0x9d, 0x90, 0x3c, 0x30, 0x61, 0x07, 0xa0, 0xc0, 0x38, 0x4d, 0x70, 0x8b, 0xb8, 0xd7, 0x64, 0xa0, - 0xe7, 0x4c, 0x4d, 0x8d, 0xd6, 0xff, 0x86, 0x0c, 0x18, 0x9a, 0x16, 0x34, 0xc5, 0x97, 0x06, 0xc8, - 0x5f, 0x25, 0xd8, 0x23, 0xfa, 0x02, 0x2b, 0x66, 0x55, 0x88, 0x89, 0xa6, 0xd0, 0x92, 0xe0, 0xe6, - 0x41, 0x44, 0x68, 0x97, 0xeb, 0xe7, 0x69, 0x24, 0x8a, 0x88, 0x84, 0x90, 0x3e, 0xf1, 0x64, 0x1b, - 0x0d, 0xa4, 0x25, 0x78, 0x08, 0x56, 0xfd, 0x80, 0xe1, 0x66, 0x48, 0x5c, 0xc6, 0xb1, 0x77, 0xad, - 0xca, 0xaf, 0x59, 0x37, 0xa9, 0x5d, 0xd0, 0x86, 0x86, 0xd0, 0xa3, 0x19, 0x09, 0x7e, 0x00, 0x4a, - 0x93, 0x30, 0x99, 0xad, 0xfa, 0x82, 0xab, 0xc1, 0x9b, 0xd4, 0x2e, 0x8e, 0x5d, 0xa5, 0x05, 0xcd, - 0xc9, 0x62, 0xa7, 0x7d, 0xd2, 0xec, 0xb6, 0xe4, 0xf0, 0x99, 0x48, 0x09, 0x42, 0x1b, 0x06, 0x51, - 0xc0, 0xe5, 0xb0, 0x2d, 0x21, 0x25, 0xc0, 0x0f, 0x40, 0x8e, 0xf6, 0x48, 0x92, 0x04, 0x3e, 0x61, - 0xf2, 0x02, 0xf1, 0x6d, 0x1f, 0xa3, 0x68, 0xe2, 0x2f, 0x8a, 0x23, 0xb1, 0x4c, 0x32, 0x22, 0x11, - 0x4d, 0x06, 0xf2, 0x8a, 0xa0, 0x8b, 0x53, 0x86, 0x67, 0x52, 0x8f, 0x66, 0x24, 0x58, 0x03, 0x50, - 0x87, 0x25, 0x84, 0x77, 0x93, 0xd8, 0x95, 0xcf, 0x7f, 0x41, 0xc6, 0xca, 0xa7, 0x50, 0x59, 0x91, - 0x34, 0x9e, 0x62, 0x8e, 0xd1, 0x1d, 0x0d, 0xfc, 0x39, 0x80, 0x6a, 0x4f, 0xdc, 0xcf, 0x19, 0x1d, - 0x7f, 0x4d, 0xab, 0x33, 0x5e, 0xf2, 0x2b, 0xab, 0xce, 0xd9, 0x52, 0xd2, 0x39, 0xa3, 0xba, 0x8a, - 0x73, 0xc3, 0x34, 0xac, 0xa5, 0x73, 0xc3, 0x5c, 0xb1, 0xcc, 0x71, 0xff, 0x74, 0x15, 0x68, 0x7d, - 0x24, 0x4f, 0xa5, 0xf7, 0xa3, 0xbf, 0x65, 0xc0, 0xd4, 0x97, 0x17, 0xfc, 0x29, 0xa8, 0x1e, 0x9f, - 0x9c, 0xd4, 0x1b, 0x0d, 0xf7, 0xea, 0x93, 0xcb, 0xba, 0x7b, 0x59, 0x47, 0xcf, 0xce, 0x1a, 0x8d, - 0xb3, 0x8f, 0x9e, 0x5f, 0xd4, 0x1b, 0x0d, 0x6b, 0xa1, 0xfa, 0xf6, 0xcb, 0x57, 0xdb, 0x95, 0x89, - 0xff, 0xa5, 0xe8, 0x27, 0x63, 0x01, 0x8d, 0x43, 0x31, 0xa9, 0xef, 0x81, 0xcd, 0xe9, 0x68, 0x54, - 0x6f, 0x5c, 0xa1, 0xb3, 0x93, 0xab, 0xfa, 0xa9, 0x95, 0xa9, 0x56, 0x5e, 0xbe, 0xda, 0x2e, 0x4f, - 0x22, 0x11, 0x61, 0x3c, 0x09, 0xc4, 0xb7, 0x3a, 0x3c, 0x02, 0x95, 0xfb, 0x39, 0xeb, 0xa7, 0xd6, - 0x62, 0xb5, 0xfa, 0xf2, 0xd5, 0xf6, 0xe6, 0x7d, 0x8c, 0xc4, 0xaf, 0x1a, 0x5f, 0xfc, 0x75, 0x6b, - 0xa1, 0xf6, 0xcb, 0xaf, 0x86, 0x5b, 0x99, 0xaf, 0x87, 0x5b, 0x99, 0xff, 0x0c, 0xb7, 0x32, 0x7f, - 0x7e, 0xbd, 0xb5, 0xf0, 0xf5, 0xeb, 0xad, 0x85, 0x7f, 0xbc, 0xde, 0x5a, 0xf8, 0xfd, 0x0f, 0x5a, - 0x01, 0x6f, 0x77, 0x9b, 0xbb, 0x1e, 0x8d, 0xf6, 0x48, 0x2f, 0xa2, 0x4c, 0xff, 0xed, 0xed, 0x1f, - 0xed, 0xf5, 0xe5, 0xaf, 0x2d, 0xe2, 0xcb, 0x92, 0x35, 0x97, 0xe5, 0xaf, 0x28, 0x4f, 0xff, 0x17, - 0x00, 0x00, 0xff, 0xff, 0x97, 0xcf, 0xe9, 0x62, 0x8b, 0x11, 0x00, 0x00, + // 1893 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x58, 0x5b, 0x4f, 0x23, 0xc9, + 0x15, 0xc6, 0xb8, 0x81, 0x76, 0xd9, 0xd8, 0x3d, 0x85, 0x61, 0x3d, 0x9e, 0x0d, 0x4d, 0x3a, 0x51, + 0x44, 0xa2, 0x0d, 0x0c, 0xcc, 0x92, 0xa0, 0xd9, 0xdc, 0x30, 0x78, 0x13, 0x08, 0x33, 0x8b, 0xca, + 0x6c, 0xa2, 0x8d, 0xb2, 0x6a, 0x95, 0xbb, 0x6b, 0xed, 0x5e, 0xba, 0xbb, 0xac, 0xae, 0xb2, 0xc7, + 0xce, 0x2f, 0x58, 0x4d, 0x5e, 0x92, 0x1f, 0x30, 0xd2, 0x4a, 0xf9, 0x23, 0x79, 0x5c, 0xe5, 0x69, + 0x1f, 0xa3, 0x48, 0x69, 0x45, 0x9e, 0x37, 0x1e, 0x79, 0x8f, 0x14, 0xd5, 0xc5, 0x57, 0x58, 0x96, + 0xbc, 0x40, 0x9f, 0xdb, 0xf7, 0x9d, 0x73, 0xea, 0x74, 0x57, 0x95, 0x41, 0x95, 0xf0, 0x36, 0x49, + 0xa2, 0x20, 0xe6, 0xbb, 0xa4, 0x17, 0xed, 0xf6, 0xf6, 0xc4, 0xbf, 0x9d, 0x4e, 0x42, 0x39, 0x85, + 0xd6, 0xd8, 0xb6, 0x23, 0x94, 0xbd, 0xbd, 0x6a, 0xb9, 0x45, 0x5b, 0x54, 0x1a, 0x77, 0xc5, 0x93, + 0xf2, 0x73, 0x6e, 0xb2, 0x60, 0xf9, 0x02, 0x27, 0x38, 0x62, 0x70, 0x0f, 0xe4, 0x48, 0x2f, 0x72, + 0x7d, 0x12, 0xd3, 0xa8, 0x92, 0xd9, 0xca, 0x6c, 0xe7, 0x6a, 0xe5, 0x9b, 0xd4, 0xb6, 0x06, 0x38, + 0x0a, 0x9f, 0x3b, 0x63, 0x93, 0x83, 0x4c, 0xd2, 0x8b, 0x4e, 0xc4, 0x23, 0x3c, 0x02, 0x80, 0xf4, + 0x79, 0x82, 0x5d, 0x12, 0x74, 0x58, 0xc5, 0xd8, 0xca, 0x6e, 0x67, 0x6b, 0xce, 0x30, 0xb5, 0x73, + 0x75, 0xa1, 0xad, 0x9f, 0x5e, 0xb0, 0x9b, 0xd4, 0x7e, 0xa4, 0x01, 0xc6, 0x8e, 0x0e, 0xca, 0x49, + 0xa1, 0x1e, 0x74, 0x18, 0xfc, 0x14, 0x14, 0xbc, 0x36, 0x0e, 0x62, 0xd7, 0xa3, 0xf1, 0x67, 0x41, + 0xab, 0xb2, 0xb4, 0x95, 0xd9, 0xce, 0xef, 0x7f, 0x67, 0x67, 0x3e, 0xff, 0x9d, 0x63, 0xe1, 0x75, + 0x2c, 0x9d, 0x6a, 0x4f, 0xbe, 0x4a, 0xed, 0x85, 0x9b, 0xd4, 0x5e, 0x53, 0xd0, 0xd3, 0x00, 0x0e, + 0xca, 0x7b, 0x13, 0x4f, 0xb8, 0x0f, 0xd6, 0x71, 0x18, 0xd2, 0x57, 0x6e, 0x37, 0x16, 0x05, 0x13, + 0x8f, 0x13, 0xdf, 0xe5, 0x7d, 0x56, 0x59, 0xde, 0xca, 0x6c, 0x9b, 0x68, 0x4d, 0x1a, 0x3f, 0x9e, + 0xd8, 0x2e, 0xfb, 0x0c, 0xee, 0x83, 0x82, 0xa8, 0xd6, 0x6b, 0xe3, 0x38, 0x26, 0x21, 0xab, 0x98, + 0x5b, 0xd9, 0xed, 0x5c, 0xad, 0x34, 0x4c, 0xed, 0x7c, 0xfd, 0x77, 0x2f, 0x8e, 0xb5, 0x1a, 0xe5, + 0x49, 0x2f, 0x1a, 0x09, 0xf0, 0x53, 0x50, 0xc4, 0x9e, 0x47, 0x18, 0x13, 0x69, 0xf0, 0x84, 0x86, + 0x95, 0x9c, 0x2c, 0xc4, 0xbe, 0x5d, 0xc8, 0x91, 0xf4, 0x3b, 0x56, 0x6e, 0xb5, 0x75, 0x51, 0xca, + 0x30, 0xb5, 0x57, 0x67, 0xd4, 0x68, 0x15, 0x4f, 0x8b, 0xf0, 0x39, 0x78, 0x8c, 0x3d, 0x1e, 0xf4, + 0x88, 0xcb, 0x38, 0xe6, 0x81, 0xe7, 0x76, 0x12, 0xe2, 0xd1, 0xa8, 0x13, 0x84, 0x84, 0x55, 0x80, + 0xc8, 0x0f, 0xbd, 0xa3, 0x1c, 0x1a, 0xd2, 0x7e, 0x31, 0x31, 0x9f, 0x19, 0xe6, 0xa2, 0x95, 0x3d, + 0x33, 0xcc, 0xac, 0x65, 0x9c, 0x19, 0xe6, 0x8a, 0x65, 0x3a, 0x7f, 0xcd, 0x80, 0x59, 0x3a, 0x78, + 0x04, 0x96, 0xbd, 0x84, 0x60, 0x4e, 0xe4, 0xc2, 0xe7, 0xf7, 0xbf, 0xf7, 0x2d, 0x69, 0x5f, 0x0e, + 0x3a, 0xa4, 0x66, 0x88, 0xd4, 0x91, 0x0e, 0x84, 0x3f, 0x07, 0x86, 0x87, 0xc3, 0xb0, 0xb2, 0xf8, + 0xff, 0x02, 0xc8, 0x30, 0xe7, 0xdf, 0x19, 0xf0, 0xe8, 0x96, 0x07, 0xf4, 0x40, 0x5e, 0xb7, 0x95, + 0x0f, 0x3a, 0x2a, 0xb9, 0xe2, 0xfe, 0xbb, 0xdf, 0x84, 0x2d, 0x41, 0xbf, 0x3f, 0x4c, 0x6d, 0x30, + 0x91, 0x6f, 0x52, 0x1b, 0xaa, 0x29, 0x99, 0x02, 0x72, 0x10, 0xc0, 0x63, 0x0f, 0xe8, 0x81, 0xb5, + 0xd9, 0xb5, 0x73, 0xc3, 0x80, 0xf1, 0xca, 0xa2, 0x5c, 0xf6, 0x67, 0xc3, 0xd4, 0x9e, 0x4d, 0xec, + 0x3c, 0x60, 0xfc, 0x26, 0xb5, 0xab, 0x33, 0xa8, 0xd3, 0x91, 0x0e, 0x7a, 0x84, 0xe7, 0x03, 0x9c, + 0xff, 0x16, 0x41, 0x7e, 0x6a, 0x84, 0xe1, 0x1f, 0x41, 0xa9, 0x4d, 0x23, 0xc2, 0x38, 0xc1, 0xbe, + 0xdb, 0x0c, 0xa9, 0x77, 0xa5, 0xdf, 0xb9, 0x67, 0xff, 0x4a, 0xed, 0x75, 0x8f, 0xb2, 0x88, 0x32, + 0xe6, 0x5f, 0xed, 0x04, 0x74, 0x37, 0xc2, 0xbc, 0xbd, 0x73, 0x1a, 0x0b, 0xd2, 0x0d, 0x45, 0x3a, + 0x17, 0xe9, 0xa0, 0xe2, 0x58, 0x53, 0x13, 0x0a, 0xd8, 0x06, 0x45, 0x1f, 0x53, 0xf7, 0x33, 0x9a, + 0x5c, 0x69, 0xf0, 0x45, 0x09, 0x5e, 0xfb, 0x46, 0xf0, 0x61, 0x6a, 0x17, 0x4e, 0x8e, 0x3e, 0xfa, + 0x90, 0x26, 0x57, 0x12, 0xe2, 0x26, 0xb5, 0xd7, 0x15, 0xd9, 0x2c, 0x90, 0x83, 0x0a, 0x3e, 0xa6, + 0x63, 0x37, 0xf8, 0x7b, 0x60, 0x8d, 0x1d, 0x58, 0xb7, 0xd3, 0xa1, 0x09, 0xaf, 0x64, 0xc5, 0xbb, + 0x55, 0xfb, 0xf1, 0x30, 0xb5, 0x8b, 0x1a, 0xb2, 0xa1, 0x2c, 0x37, 0xa9, 0xfd, 0xce, 0x1c, 0xa8, + 0x8e, 0x71, 0x50, 0x51, 0xc3, 0x6a, 0x57, 0xd8, 0x04, 0x05, 0x12, 0x74, 0xf6, 0x0e, 0x9e, 0xea, + 0x02, 0x0c, 0x59, 0xc0, 0x2f, 0xef, 0x2b, 0x20, 0x5f, 0x3f, 0xbd, 0xd8, 0x3b, 0x78, 0x3a, 0xca, + 0x5f, 0x7f, 0x1d, 0xa6, 0x51, 0x1c, 0x94, 0x57, 0xa2, 0x4a, 0xfe, 0x14, 0x68, 0xd1, 0x6d, 0x63, + 0xd6, 0x96, 0xdf, 0x9e, 0x5c, 0x6d, 0x5b, 0x0c, 0x90, 0x42, 0xfa, 0x0d, 0x66, 0xed, 0x49, 0xd7, + 0x9b, 0x83, 0x3f, 0xe1, 0x98, 0x07, 0xdd, 0x68, 0x84, 0x05, 0x54, 0xb0, 0xf0, 0x1a, 0xa7, 0x7b, + 0xa0, 0xd3, 0x5d, 0x7e, 0x68, 0xba, 0x07, 0x77, 0xa5, 0x7b, 0x30, 0x9b, 0xae, 0xf2, 0x19, 0x73, + 0x1c, 0x6a, 0x8e, 0x95, 0x87, 0x72, 0x1c, 0xde, 0xc5, 0x71, 0x38, 0xcb, 0xa1, 0x7c, 0xc4, 0x5c, + 0xce, 0xd5, 0x59, 0x31, 0x1f, 0x3c, 0x97, 0xb7, 0x3a, 0x54, 0x1c, 0x6b, 0x14, 0xfa, 0x15, 0x28, + 0x7b, 0x34, 0x66, 0x5c, 0xe8, 0x62, 0xda, 0x09, 0x89, 0xa6, 0xc8, 0x49, 0x8a, 0xc3, 0xfb, 0x28, + 0x9e, 0xe8, 0x6f, 0xfd, 0x1d, 0xe1, 0x0e, 0x5a, 0x9b, 0x55, 0x2b, 0x32, 0x17, 0x58, 0x1d, 0xc2, + 0x49, 0xc2, 0x9a, 0xdd, 0xa4, 0xa5, 0x89, 0x80, 0x24, 0x7a, 0xff, 0x3e, 0x22, 0x3d, 0xa1, 0xf3, + 0xa1, 0x0e, 0x2a, 0x4d, 0x54, 0x8a, 0xe0, 0x13, 0x50, 0x0c, 0x04, 0x6b, 0xb3, 0x1b, 0x6a, 0xf8, + 0xbc, 0x84, 0xdf, 0xbf, 0x0f, 0x5e, 0xbf, 0x55, 0xb3, 0x81, 0x0e, 0x5a, 0x1d, 0x29, 0x14, 0xb4, + 0x0f, 0x60, 0xd4, 0x0d, 0x12, 0xb7, 0x15, 0x62, 0x2f, 0x20, 0x89, 0x86, 0x2f, 0x48, 0xf8, 0x9f, + 0xdc, 0x07, 0xff, 0x58, 0xc1, 0xdf, 0x0e, 0x76, 0x90, 0x25, 0x94, 0xbf, 0x56, 0x3a, 0xc5, 0xd2, + 0x00, 0x85, 0x26, 0x49, 0xc2, 0x20, 0xd6, 0xf8, 0xab, 0x12, 0xff, 0xe9, 0x7d, 0xf8, 0x7a, 0x82, + 0xa6, 0xc3, 0x1c, 0x94, 0x57, 0xe2, 0x18, 0x34, 0xa4, 0xb1, 0x4f, 0x47, 0xa0, 0x8f, 0x1e, 0x0c, + 0x3a, 0x1d, 0xe6, 0xa0, 0xbc, 0x12, 0x15, 0x68, 0x0b, 0xac, 0xe1, 0x24, 0xa1, 0xaf, 0xe6, 0x1a, + 0x02, 0x25, 0xf6, 0x4f, 0xef, 0xc3, 0x1e, 0x7d, 0xa7, 0x6f, 0x47, 0x8b, 0xef, 0xb4, 0xd0, 0xce, + 0xb4, 0xc4, 0x07, 0xb0, 0x95, 0xe0, 0xc1, 0x1c, 0x4f, 0xf9, 0xc1, 0x8d, 0xbf, 0x1d, 0xec, 0x20, + 0x4b, 0x28, 0x67, 0x58, 0x3e, 0x07, 0xe5, 0x88, 0x24, 0x2d, 0xe2, 0xc6, 0x84, 0xb3, 0x4e, 0x18, + 0x70, 0xcd, 0xb3, 0xfe, 0xe0, 0xf7, 0xe0, 0xae, 0x70, 0x07, 0x41, 0xa9, 0x7e, 0xa9, 0xb5, 0xe3, + 0x29, 0x65, 0x6d, 0x1c, 0xb7, 0xda, 0x38, 0xd0, 0x2c, 0x1b, 0x0f, 0x9e, 0xd2, 0xd9, 0x40, 0x07, + 0xad, 0x8e, 0x14, 0xe3, 0xa5, 0xf6, 0x70, 0xec, 0x75, 0x47, 0x4b, 0xfd, 0xce, 0x83, 0x97, 0x7a, + 0x3a, 0x4c, 0x1c, 0xd9, 0xa4, 0x28, 0x41, 0xcf, 0x0c, 0xb3, 0x68, 0x95, 0xce, 0x0c, 0xb3, 0x64, + 0x59, 0x67, 0x86, 0x69, 0x59, 0x8f, 0xce, 0x0c, 0x73, 0xcd, 0x2a, 0xa3, 0xd5, 0x01, 0x0d, 0xa9, + 0xdb, 0x7b, 0xa6, 0x82, 0x50, 0x9e, 0xbc, 0xc2, 0x4c, 0x7f, 0x68, 0x50, 0xd1, 0xc3, 0x1c, 0x87, + 0x03, 0xa6, 0x1b, 0x81, 0x2c, 0xd5, 0x9e, 0xa9, 0x6d, 0x6b, 0x17, 0x2c, 0x89, 0xa3, 0x11, 0x81, + 0x16, 0xc8, 0x5e, 0x91, 0x81, 0xda, 0x6c, 0x91, 0x78, 0x84, 0x65, 0xb0, 0xd4, 0xc3, 0x61, 0x97, + 0xa8, 0x3d, 0x12, 0x29, 0xc1, 0xb9, 0x00, 0xa5, 0xcb, 0x04, 0xc7, 0x4c, 0x1c, 0xab, 0x68, 0x7c, + 0x4e, 0x5b, 0x0c, 0x42, 0x60, 0xc8, 0x7d, 0x42, 0xc5, 0xca, 0x67, 0xf8, 0x43, 0x60, 0x84, 0xb4, + 0xc5, 0xe4, 0x69, 0x21, 0xbf, 0xbf, 0x7e, 0xfb, 0x68, 0x72, 0x4e, 0x5b, 0x48, 0xba, 0x38, 0xff, + 0x58, 0x04, 0xd9, 0x73, 0xda, 0x82, 0x15, 0xb0, 0x82, 0x7d, 0x3f, 0x21, 0x8c, 0x69, 0xa4, 0x91, + 0x08, 0x37, 0xc0, 0x32, 0xa7, 0x9d, 0xc0, 0x53, 0x70, 0x39, 0xa4, 0x25, 0x41, 0xec, 0x63, 0x8e, + 0xe5, 0xc6, 0x5a, 0x40, 0xf2, 0x59, 0x9c, 0x52, 0x65, 0x65, 0x6e, 0xdc, 0x8d, 0x9a, 0x24, 0x91, + 0xfb, 0xa3, 0x51, 0x2b, 0x5d, 0xa7, 0x76, 0x5e, 0xea, 0x5f, 0x4a, 0x35, 0x9a, 0x16, 0xe0, 0x7b, + 0x60, 0x85, 0xf7, 0xa7, 0xf7, 0xba, 0xb5, 0xeb, 0xd4, 0x2e, 0xf1, 0x49, 0x99, 0x62, 0x2b, 0x43, + 0xcb, 0xbc, 0x2f, 0xb7, 0xb4, 0x5d, 0x60, 0xf2, 0xbe, 0x1b, 0xc4, 0x3e, 0xe9, 0xcb, 0xed, 0xcc, + 0xa8, 0x95, 0xaf, 0x53, 0xdb, 0x9a, 0x72, 0x3f, 0x15, 0x36, 0xb4, 0xc2, 0xfb, 0xf2, 0x01, 0xbe, + 0x07, 0x80, 0x4a, 0x49, 0x32, 0xa8, 0xdd, 0x69, 0xf5, 0x3a, 0xb5, 0x73, 0x52, 0x2b, 0xb1, 0x27, + 0x8f, 0xd0, 0x01, 0x4b, 0x0a, 0xdb, 0x94, 0xd8, 0x85, 0xeb, 0xd4, 0x36, 0x43, 0xda, 0x52, 0x98, + 0xca, 0x24, 0x5a, 0x95, 0x90, 0x88, 0xf6, 0x88, 0x2f, 0xb7, 0x08, 0x13, 0x8d, 0x44, 0xe7, 0xcf, + 0x8b, 0xc0, 0xbc, 0xec, 0x23, 0xc2, 0xba, 0x21, 0x87, 0x1f, 0x02, 0x4b, 0x1e, 0xc0, 0xb0, 0xc7, + 0xdd, 0x99, 0xd6, 0xd6, 0x9e, 0x4c, 0x3e, 0xe8, 0xf3, 0x1e, 0x0e, 0x2a, 0x8d, 0x54, 0x47, 0xba, + 0xff, 0x65, 0xb0, 0xd4, 0x0c, 0x29, 0x8d, 0xe4, 0x24, 0x14, 0x90, 0x12, 0x20, 0x92, 0x5d, 0x93, + 0xab, 0x9c, 0x95, 0x87, 0xdb, 0xef, 0xde, 0x5e, 0xe5, 0xb9, 0x51, 0xa9, 0x6d, 0xe8, 0x1b, 0x4a, + 0x51, 0x71, 0xeb, 0x78, 0x47, 0xf4, 0x56, 0x8e, 0x92, 0x05, 0xb2, 0x09, 0xe1, 0x72, 0xd1, 0x0a, + 0x48, 0x3c, 0xc2, 0x2a, 0x30, 0x13, 0xd2, 0x23, 0x09, 0x27, 0xbe, 0x5c, 0x1c, 0x13, 0x8d, 0x65, + 0xf8, 0x18, 0x98, 0x2d, 0xcc, 0xdc, 0x2e, 0x23, 0xbe, 0x5a, 0x09, 0xb4, 0xd2, 0xc2, 0xec, 0x63, + 0x46, 0xfc, 0xe7, 0xc6, 0x17, 0x5f, 0xda, 0x0b, 0x0e, 0x06, 0x79, 0x7d, 0xe4, 0xed, 0x76, 0x42, + 0x72, 0xcf, 0x84, 0xed, 0x83, 0x02, 0xe3, 0x34, 0xc1, 0x2d, 0xe2, 0x5e, 0x91, 0x81, 0x9e, 0x33, + 0x35, 0x35, 0x5a, 0xff, 0x5b, 0x32, 0x60, 0x68, 0x5a, 0xd0, 0x14, 0x5f, 0x1a, 0x20, 0x7f, 0x99, + 0x60, 0x8f, 0xe8, 0x03, 0xac, 0x98, 0x55, 0x21, 0x26, 0x9a, 0x42, 0x4b, 0x82, 0x9b, 0x07, 0x11, + 0xa1, 0x5d, 0xae, 0xdf, 0xa7, 0x91, 0x28, 0x22, 0x12, 0x42, 0xfa, 0xc4, 0x93, 0x6d, 0x34, 0x90, + 0x96, 0xe0, 0x01, 0x58, 0xf5, 0x03, 0x86, 0x9b, 0xa1, 0xbc, 0xdd, 0x78, 0x57, 0xaa, 0xfc, 0x9a, + 0x75, 0x9d, 0xda, 0x05, 0x6d, 0x68, 0x08, 0x3d, 0x9a, 0x91, 0xe0, 0x07, 0xa0, 0x34, 0x09, 0x93, + 0xd9, 0xaa, 0x4b, 0x5d, 0x0d, 0x5e, 0xa7, 0x76, 0x71, 0xec, 0x2a, 0x2d, 0x68, 0x4e, 0x16, 0x2b, + 0xed, 0x93, 0x66, 0xb7, 0x25, 0x87, 0xcf, 0x44, 0x4a, 0x10, 0xda, 0x30, 0x88, 0x02, 0x2e, 0x87, + 0x6d, 0x09, 0x29, 0x01, 0x7e, 0x00, 0x72, 0xb4, 0x47, 0x92, 0x24, 0xf0, 0xe5, 0x65, 0xeb, 0xdb, + 0xef, 0xa7, 0x68, 0xe2, 0x2f, 0x8a, 0x23, 0xb1, 0x4c, 0x32, 0x22, 0x11, 0x4d, 0x06, 0xf2, 0x88, + 0xa0, 0x8b, 0x53, 0x86, 0x17, 0x52, 0x8f, 0x66, 0x24, 0x58, 0x03, 0x50, 0x87, 0x25, 0x84, 0x77, + 0x93, 0xd8, 0x95, 0xef, 0x7f, 0x41, 0xc6, 0xca, 0xb7, 0x50, 0x59, 0x91, 0x34, 0x9e, 0x60, 0x8e, + 0xd1, 0x2d, 0x0d, 0xfc, 0x05, 0x80, 0x6a, 0x4d, 0xdc, 0xcf, 0x19, 0x1d, 0x5f, 0xb0, 0xd5, 0x1e, + 0x2f, 0xf9, 0x95, 0x55, 0xe7, 0x6c, 0x29, 0xe9, 0x8c, 0x51, 0x5d, 0xc5, 0x99, 0x61, 0x1a, 0xd6, + 0x92, 0xba, 0x32, 0x8e, 0xfb, 0xa7, 0xab, 0x40, 0x6b, 0x23, 0x79, 0x2a, 0xbd, 0x1f, 0xfd, 0x3d, + 0x03, 0xa6, 0x6e, 0x5e, 0xf0, 0x67, 0xa0, 0x7a, 0x74, 0x7c, 0x5c, 0x6f, 0x34, 0xdc, 0xcb, 0x4f, + 0x2e, 0xea, 0xee, 0x45, 0x1d, 0xbd, 0x38, 0x6d, 0x34, 0x4e, 0x3f, 0x7a, 0x79, 0x5e, 0x6f, 0x34, + 0xac, 0x85, 0xea, 0xbb, 0xaf, 0xdf, 0x6c, 0x55, 0x26, 0xfe, 0x17, 0xa2, 0x9f, 0x8c, 0x05, 0x34, + 0x0e, 0xc5, 0xa4, 0xbe, 0x0f, 0x36, 0xa6, 0xa3, 0x51, 0xbd, 0x71, 0x89, 0x4e, 0x8f, 0x2f, 0xeb, + 0x27, 0x56, 0xa6, 0x5a, 0x79, 0xfd, 0x66, 0xab, 0x3c, 0x89, 0x44, 0x84, 0xf1, 0x24, 0x10, 0xd7, + 0x77, 0x78, 0x08, 0x2a, 0x77, 0x73, 0xd6, 0x4f, 0xac, 0xc5, 0x6a, 0xf5, 0xf5, 0x9b, 0xad, 0x8d, + 0xbb, 0x18, 0x89, 0x5f, 0x35, 0xbe, 0xf8, 0xdb, 0xe6, 0x42, 0xed, 0x57, 0x5f, 0x0d, 0x37, 0x33, + 0x5f, 0x0f, 0x37, 0x33, 0xff, 0x19, 0x6e, 0x66, 0xfe, 0xf2, 0x76, 0x73, 0xe1, 0xeb, 0xb7, 0x9b, + 0x0b, 0xff, 0x7c, 0xbb, 0xb9, 0xf0, 0x87, 0x1f, 0xb4, 0x02, 0xde, 0xee, 0x36, 0x77, 0x3c, 0x1a, + 0xed, 0x92, 0x5e, 0x44, 0x99, 0xfe, 0xdb, 0xdb, 0x3b, 0xdc, 0xed, 0xcb, 0x1f, 0x60, 0xc4, 0xcd, + 0x92, 0x35, 0x97, 0xe5, 0x0f, 0x2b, 0xcf, 0xfe, 0x17, 0x00, 0x00, 0xff, 0xff, 0x6c, 0xd3, 0x8d, + 0x17, 0x9e, 0x11, 0x00, 0x00, } func (m *Params) Marshal() (dAtA []byte, err error) { @@ -989,6 +990,15 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.ActiveStaticPrecompiles) > 0 { + for iNdEx := len(m.ActiveStaticPrecompiles) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.ActiveStaticPrecompiles[iNdEx]) + copy(dAtA[i:], m.ActiveStaticPrecompiles[iNdEx]) + i = encodeVarintEvm(dAtA, i, uint64(len(m.ActiveStaticPrecompiles[iNdEx]))) + i-- + dAtA[i] = 0x52 + } + } { size, err := m.AccessControl.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -1008,15 +1018,6 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x42 } } - if len(m.ActivePrecompiles) > 0 { - for iNdEx := len(m.ActivePrecompiles) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.ActivePrecompiles[iNdEx]) - copy(dAtA[i:], m.ActivePrecompiles[iNdEx]) - i = encodeVarintEvm(dAtA, i, uint64(len(m.ActivePrecompiles[iNdEx]))) - i-- - dAtA[i] = 0x3a - } - } if m.AllowUnprotectedTxs { i-- if m.AllowUnprotectedTxs { @@ -1825,12 +1826,6 @@ func (m *Params) Size() (n int) { if m.AllowUnprotectedTxs { n += 2 } - if len(m.ActivePrecompiles) > 0 { - for _, s := range m.ActivePrecompiles { - l = len(s) - n += 1 + l + sovEvm(uint64(l)) - } - } if len(m.EVMChannels) > 0 { for _, s := range m.EVMChannels { l = len(s) @@ -1839,6 +1834,12 @@ func (m *Params) Size() (n int) { } l = m.AccessControl.Size() n += 1 + l + sovEvm(uint64(l)) + if len(m.ActiveStaticPrecompiles) > 0 { + for _, s := range m.ActiveStaticPrecompiles { + l = len(s) + n += 1 + l + sovEvm(uint64(l)) + } + } return n } @@ -2326,9 +2327,9 @@ func (m *Params) Unmarshal(dAtA []byte) error { } } m.AllowUnprotectedTxs = bool(v != 0) - case 7: + case 8: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ActivePrecompiles", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field EVMChannels", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -2356,13 +2357,13 @@ func (m *Params) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ActivePrecompiles = append(m.ActivePrecompiles, string(dAtA[iNdEx:postIndex])) + m.EVMChannels = append(m.EVMChannels, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 8: + case 9: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EVMChannels", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AccessControl", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvm @@ -2372,29 +2373,30 @@ func (m *Params) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvm } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvm } if postIndex > l { return io.ErrUnexpectedEOF } - m.EVMChannels = append(m.EVMChannels, string(dAtA[iNdEx:postIndex])) + if err := m.AccessControl.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 9: + case 10: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AccessControl", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ActiveStaticPrecompiles", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvm @@ -2404,24 +2406,23 @@ func (m *Params) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvm } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvm } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.AccessControl.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.ActiveStaticPrecompiles = append(m.ActiveStaticPrecompiles, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex default: iNdEx = preIndex diff --git a/x/evm/types/interfaces.go b/x/evm/types/interfaces.go index 16c20bfd34..850544c0c2 100644 --- a/x/evm/types/interfaces.go +++ b/x/evm/types/interfaces.go @@ -6,10 +6,12 @@ import ( "math/big" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" + "github.com/ethereum/go-ethereum/common" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + "github.com/evmos/evmos/v18/x/evm/core/vm" feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" ) @@ -47,6 +49,11 @@ type FeeMarketKeeper interface { CalculateBaseFee(ctx sdk.Context) *big.Int } +// Erc20Keeper defines the expected interface needed to instantiate ERC20 precompiles. +type Erc20Keeper interface { + GetERC20PrecompileInstance(ctx sdk.Context, address common.Address) (contract vm.PrecompiledContract, found bool, err error) +} + type ( LegacyParams = paramtypes.ParamSet // Subspace defines an interface that implements the legacy Cosmos SDK x/params Subspace type. diff --git a/x/evm/types/params.go b/x/evm/types/params.go index ed13533a99..315dd85764 100644 --- a/x/evm/types/params.go +++ b/x/evm/types/params.go @@ -6,8 +6,6 @@ import ( "fmt" "math/big" "slices" - "sort" - "strings" errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" @@ -27,8 +25,8 @@ var ( DefaultEVMDenom = utils.BaseDenom // DefaultAllowUnprotectedTxs rejects all unprotected txs (i.e false) DefaultAllowUnprotectedTxs = false - // AvailableEVMExtensions defines the default active precompiles - AvailableEVMExtensions = []string{ + // DefaultStaticPrecompiles defines the default active precompiles + DefaultStaticPrecompiles = []string{ p256.PrecompileAddress, // P256 precompile "0x0000000000000000000000000000000000000400", // Bech32 precompile "0x0000000000000000000000000000000000000800", // Staking precompile @@ -65,34 +63,31 @@ func NewParams( allowUnprotectedTxs bool, config ChainConfig, extraEIPs []int64, - activePrecompiles, + activeStaticPrecompiles, evmChannels []string, accessControl AccessControl, ) Params { return Params{ - EvmDenom: evmDenom, - AllowUnprotectedTxs: allowUnprotectedTxs, - ExtraEIPs: extraEIPs, - ChainConfig: config, - ActivePrecompiles: activePrecompiles, - EVMChannels: evmChannels, - AccessControl: accessControl, + EvmDenom: evmDenom, + AllowUnprotectedTxs: allowUnprotectedTxs, + ExtraEIPs: extraEIPs, + ChainConfig: config, + ActiveStaticPrecompiles: activeStaticPrecompiles, + EVMChannels: evmChannels, + AccessControl: accessControl, } } // DefaultParams returns default evm parameters -// ExtraEIPs is empty to prevent overriding the latest hard fork instruction set -// ActivePrecompiles is empty to prevent overriding the default precompiles -// from the EVM configuration. func DefaultParams() Params { return Params{ - EvmDenom: DefaultEVMDenom, - ChainConfig: DefaultChainConfig(), - ExtraEIPs: DefaultExtraEIPs, - AllowUnprotectedTxs: DefaultAllowUnprotectedTxs, - ActivePrecompiles: AvailableEVMExtensions, - EVMChannels: DefaultEVMChannels, - AccessControl: DefaultAccessControl, + EvmDenom: DefaultEVMDenom, + ChainConfig: DefaultChainConfig(), + ExtraEIPs: DefaultExtraEIPs, + AllowUnprotectedTxs: DefaultAllowUnprotectedTxs, + ActiveStaticPrecompiles: DefaultStaticPrecompiles, + EVMChannels: DefaultEVMChannels, + AccessControl: DefaultAccessControl, } } @@ -132,7 +127,7 @@ func (p Params) Validate() error { return err } - if err := ValidatePrecompiles(p.ActivePrecompiles); err != nil { + if err := ValidatePrecompiles(p.ActiveStaticPrecompiles); err != nil { return err } @@ -152,16 +147,11 @@ func (p Params) EIPs() []int { return eips } -// HasCustomPrecompiles returns true if the ActivePrecompiles slice is not empty. -func (p Params) HasCustomPrecompiles() bool { - return len(p.ActivePrecompiles) > 0 -} - -// GetActivePrecompilesAddrs is a util function that the Active Precompiles +// GetActiveStaticPrecompilesAddrs is a util function that the Active Precompiles // as a slice of addresses. -func (p Params) GetActivePrecompilesAddrs() []common.Address { - precompiles := make([]common.Address, len(p.ActivePrecompiles)) - for i, precompile := range p.ActivePrecompiles { +func (p Params) GetActiveStaticPrecompilesAddrs() []common.Address { + precompiles := make([]common.Address, len(p.ActiveStaticPrecompiles)) + for i, precompile := range p.ActiveStaticPrecompiles { precompiles[i] = common.HexToAddress(precompile) } return precompiles @@ -173,16 +163,6 @@ func (p Params) IsEVMChannel(channel string) bool { return slices.Contains(p.EVMChannels, channel) } -// IsActivePrecompile returns true if the given precompile address is -// registered as an active precompile. -func (p Params) IsActivePrecompile(address string) bool { - _, found := sort.Find(len(p.ActivePrecompiles), func(i int) int { - return strings.Compare(address, p.ActivePrecompiles[i]) - }) - - return found -} - func (ac AccessControl) Validate() error { if err := ac.Create.Validate(); err != nil { return err @@ -206,36 +186,6 @@ func (act AccessControlType) Validate() error { return nil } -// func validateAccessControl(i interface{}) error { -// permissions, ok := i.(AccessControl) -// if !ok { -// return fmt.Errorf("invalid permissions policy type: %T", i) -// } -// -// if err := validatePermissionType(permissions.Create); err != nil { -// return err -// } -// -// return validatePermissionType(permissions.Call) -// } -// -// func validatePermissionType(i interface{}) error { -// permission, ok := i.(AccessControlType) -// if !ok { -// return fmt.Errorf("invalid permission type: %T", i) -// } -// -// if err := validateAccessType(permission.AccessType); err != nil { -// return err -// } -// -// if err := validateAllowlistAddresses(permission.AccessControlList); err != nil { -// return err -// } -// -// return nil -// } - func validateAccessType(i interface{}) error { accessType, ok := i.(AccessType) if !ok { @@ -332,9 +282,8 @@ func ValidatePrecompiles(i interface{}) error { seenPrecompiles[precompile] = struct{}{} } - // NOTE: Check that the precompiles are sorted. This is required for the - // precompiles to be found correctly when using the IsActivePrecompile method, - // because of the use of sort.Find. + // NOTE: Check that the precompiles are sorted. This is required + // to ensure determinism if !slices.IsSorted(precompiles) { return fmt.Errorf("precompiles need to be sorted: %s", precompiles) } diff --git a/x/evm/types/params_test.go b/x/evm/types/params_test.go index ff3431b0a0..ee3ee0eeba 100644 --- a/x/evm/types/params_test.go +++ b/x/evm/types/params_test.go @@ -52,7 +52,7 @@ func TestParamsValidate(t *testing.T) { name: "unsorted precompiles", params: Params{ EvmDenom: DefaultEVMDenom, - ActivePrecompiles: []string{ + ActiveStaticPrecompiles: []string{ "0x0000000000000000000000000000000000000801", "0x0000000000000000000000000000000000000800", }, @@ -163,44 +163,3 @@ func TestIsLondon(t *testing.T) { require.Equal(t, IsLondon(ethConfig, tc.height), tc.result) } } - -func TestIsActivePrecompile(t *testing.T) { - t.Parallel() - - precompileAddr := "0x0000000000000000000000000000000000000800" - - testCases := []struct { - name string - malleate func() (Params, string) - expActive bool - }{ - { - name: "inactive precompile", - malleate: func() (Params, string) { - return Params{}, precompileAddr - }, - expActive: false, - }, - { - name: "active precompile", - malleate: func() (Params, string) { - return Params{ActivePrecompiles: []string{precompileAddr}}, precompileAddr - }, - expActive: true, - }, - } - - for _, tc := range testCases { - tc := tc - - t.Run(tc.name, func(t *testing.T) { - t.Parallel() - - require.NotNil(t, tc.malleate, "test case must provide malleate function") - params, precompile := tc.malleate() - - active := params.IsActivePrecompile(precompile) - require.Equal(t, tc.expActive, active, "expected different active status for precompile: %s", precompile) - }) - } -} diff --git a/x/ibc/transfer/keeper/msg_server.go b/x/ibc/transfer/keeper/msg_server.go index b547406da3..f10568f135 100644 --- a/x/ibc/transfer/keeper/msg_server.go +++ b/x/ibc/transfer/keeper/msg_server.go @@ -20,8 +20,8 @@ import ( var _ types.MsgServer = Keeper{} -// Transfer defines a gRPC msg server method for MsgTransfer. -// This implementation overrides the default ICS20 transfer's by converting +// Transfer defines a gRPC msg server method for the MsgTransfer message. +// This implementation overrides the default ICS20 transfer by converting // the ERC20 tokens to their Cosmos representation if the token pair has been // registered through governance. // If user doesn't have enough balance of coin, it will attempt to convert @@ -29,17 +29,16 @@ var _ types.MsgServer = Keeper{} func (k Keeper) Transfer(goCtx context.Context, msg *types.MsgTransfer) (*types.MsgTransferResponse, error) { ctx := sdk.UnwrapSDKContext(goCtx) - // use a zero gas config to avoid extra costs for the relayers + // Temporarily save the KV and transient KV gas config. To avoid extra costs for relayers + // these two gas config are replaced with empty one and should be restored before exiting this function. kvGasCfg := ctx.KVGasConfig() transientKVGasCfg := ctx.TransientKVGasConfig() - - // use a zero gas config to avoid extra costs for the relayers ctx = ctx. WithKVGasConfig(storetypes.GasConfig{}). WithTransientKVGasConfig(storetypes.GasConfig{}) defer func() { - // return the KV gas config to initial values + // Return the KV gas config to initial values ctx = ctx. WithKVGasConfig(kvGasCfg). WithTransientKVGasConfig(transientKVGasCfg) @@ -70,6 +69,9 @@ func (k Keeper) Transfer(goCtx context.Context, msg *types.MsgTransfer) (*types. // update the msg denom to the token pair denom msg.Token.Denom = pair.Denom + if !pair.IsNativeERC20() { + return k.Keeper.Transfer(sdk.WrapSDKContext(ctx), msg) + } // if the user has enough balance of the Cosmos representation, then we don't need to Convert balance := k.bankKeeper.GetBalance(ctx, sender, pair.Denom) if balance.Amount.GTE(msg.Token.Amount) { @@ -87,6 +89,7 @@ func (k Keeper) Transfer(goCtx context.Context, msg *types.MsgTransfer) (*types. return k.Keeper.Transfer(sdk.WrapSDKContext(ctx), msg) } + // Only convert if the pair is a native ERC20 // only convert the remaining difference difference := msg.Token.Amount.Sub(balance.Amount) diff --git a/x/ibc/transfer/keeper/msg_server_test.go b/x/ibc/transfer/keeper/msg_server_test.go index 7b521c8367..e363ffc707 100644 --- a/x/ibc/transfer/keeper/msg_server_test.go +++ b/x/ibc/transfer/keeper/msg_server_test.go @@ -237,12 +237,13 @@ func (suite *KeeperTestSuite) TestTransfer() { }, // STRV2 + // native coin - perform normal ibc transfer { - "no-op - pair not registered", + "no-op - fail transfer", func() *types.MsgTransfer { senderAcc := sdk.AccAddress(suite.address.Bytes()) - denom := "test" + denom := "ibc/DF63978F803A2E27CA5CC9B7631654CCF0BBC788B3B7F0A10200508E37C70992" coinMetadata := banktypes.Metadata{ Name: "Generic IBC name", Symbol: "IBC", @@ -263,16 +264,8 @@ func (suite *KeeperTestSuite) TestTransfer() { } coin := sdk.NewCoin(denom, math.NewInt(10)) - coins := sdk.NewCoins(coin) - - err := suite.app.BankKeeper.MintCoins(suite.ctx, erc20types.ModuleName, coins) - suite.Require().NoError(err) - err = suite.app.BankKeeper.SendCoinsFromModuleToAccount(suite.ctx, erc20types.ModuleName, senderAcc, coins) - suite.Require().NoError(err) - suite.Commit() - - pair, err := suite.app.Erc20Keeper.RegisterCoin(suite.ctx, coinMetadata) + pair, err := suite.app.Erc20Keeper.RegisterERC20Extension(suite.ctx, coinMetadata.Base) suite.Require().Equal(pair.Denom, denom) suite.Require().NoError(err) @@ -280,7 +273,7 @@ func (suite *KeeperTestSuite) TestTransfer() { return transferMsg }, - true, + false, }, } for _, tc := range testCases { From 56a3353822d2c8645dda21e1d4910bc6485a4b3c Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Wed, 17 Jul 2024 09:34:30 -0300 Subject: [PATCH 324/345] chore(ci): add action to auto-format python files (#2673) * chore(ci): add action to auto-format python files * run make format-python * update action job name * run make format-python * add job to existing yaml * fix linter call order * run make format-python * add line length on black formatter * run make format-python * revert - add line length on black formatter * run make format-python * add pylint config file * run make format-python * fix lint err * run make format-python * fix lint err * keep only changed config param --------- Co-authored-by: GAtom22 Co-authored-by: dev-evmos --- .github/workflows/auto-format.yml | 20 +++++++++ .github/workflows/super-linter.yml | 1 + .pylintrc | 38 ++++++++++++++++ Makefile | 9 ++++ scripts/changelog_checker/test_entry.py | 34 +++++++------- .../compile_smart_contracts.py | 10 ++--- tests/nix_tests/cosmoscli.py | 44 +++++++++---------- tests/nix_tests/test_distr_precompile.py | 1 + tests/nix_tests/test_ics20_precompile.py | 13 ++++-- tests/nix_tests/test_str_v2.py | 4 +- 10 files changed, 124 insertions(+), 50 deletions(-) create mode 100644 .pylintrc diff --git a/.github/workflows/auto-format.yml b/.github/workflows/auto-format.yml index 2718e40cd5..b587fa4a3c 100644 --- a/.github/workflows/auto-format.yml +++ b/.github/workflows/auto-format.yml @@ -26,3 +26,23 @@ jobs: - uses: stefanzweifel/git-auto-commit-action@v5 with: commit_message: run make format + + format-python-code: + runs-on: ubuntu-latest + + permissions: + contents: write + + steps: + - uses: actions/checkout@v4 + with: + token: ${{ secrets.E2E_PAT }} + - uses: actions/setup-python@v5 + with: + python-version: '3.10' + - run: pip install black isort + - run: make format-python + # Commit formatted files if necessary + - uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_message: run make format-python diff --git a/.github/workflows/super-linter.yml b/.github/workflows/super-linter.yml index 2cbacdaaf7..5c2429e753 100644 --- a/.github/workflows/super-linter.yml +++ b/.github/workflows/super-linter.yml @@ -32,6 +32,7 @@ jobs: VALIDATE_OPENAPI: false VALIDATE_JSCPD: false VALIDATE_GO: false + PYTHON_PYLINT_CONFIG_FILE: .pylintrc DEFAULT_BRANCH: "main" GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} FILTER_REGEX_EXCLUDE: .*.jsonnet diff --git a/.pylintrc b/.pylintrc new file mode 100644 index 0000000000..4ff377fa7a --- /dev/null +++ b/.pylintrc @@ -0,0 +1,38 @@ +[MESSAGES CONTROL] + +# Disable the message, report, category or checker with the given id(s). You +# can either give multiple identifiers separated by comma (,) or put this +# option multiple times (only on the command line, not in the configuration +# file where it should appear only once). You can also use "--disable=all" to +# disable everything first and then re-enable specific checks. For example, if +# you want to run only the similarities checker, you can use "--disable=all +# --enable=similarities". If you want to run only the classes checker, but have +# no Warning level messages displayed, use "--disable=all --enable=classes +# --disable=W". +disable=raw-checker-failed, + bad-inline-option, + locally-disabled, + file-ignored, + suppressed-message, + useless-suppression, + deprecated-pragma, + use-symbolic-message-instead, + use-implicit-booleaness-not-comparison-to-string, + use-implicit-booleaness-not-comparison-to-zero, + missing-class-docstring, + missing-module-docstring, + missing-function-docstring, + too-few-public-methods, + too-many-public-methods, + too-many-arguments, + too-many-lines, + too-many-locals, + too-many-branches, + too-many-statements, + duplicate-code, + unspecified-encoding, + redefined-outer-name, + use-implicit-booleaness-not-comparison, + import-error, + use-dict-literal, + fixme diff --git a/Makefile b/Makefile index d3e2250246..02a644f26c 100644 --- a/Makefile +++ b/Makefile @@ -424,6 +424,15 @@ format: .PHONY: format + +format-python: format-isort format-black + +format-black: + find . -name '*.py' -type f -not -path "*/node_modules/*" | xargs black + +format-isort: + find . -name '*.py' -type f -not -path "*/node_modules/*" | xargs isort + ############################################################################### ### Protobuf ### ############################################################################### diff --git a/scripts/changelog_checker/test_entry.py b/scripts/changelog_checker/test_entry.py index d5280e30fa..d1418567aa 100644 --- a/scripts/changelog_checker/test_entry.py +++ b/scripts/changelog_checker/test_entry.py @@ -1,9 +1,9 @@ import re -from entry import ( # type: ignore +from entry import check_category # type: ignore +from entry import ( ALLOWED_SPELLINGS, Entry, - check_category, check_description, check_link, check_spelling, @@ -25,22 +25,24 @@ class TestEntry: def test_pass(self): entry = Entry(self.example) ok = entry.parse() - assert entry.problems == [] + assert not entry.problems assert ok is True assert entry.fixed == self.example def test_pass_includes_link(self): example = ( "- (evm) [#1851](https://github.com/evmos/evmos/pull/1851) " - + "Enable [EIP 3855](https://eips.ethereum.org/EIPS/eip-3855) (`PUSH0` opcode) during upgrade." + + "Enable [EIP 3855](https://eips.ethereum.org/EIPS/eip-3855) " + + "(`PUSH0` opcode) during upgrade." ) entry = Entry(example) ok = entry.parse() assert entry.link == "https://github.com/evmos/evmos/pull/1851" assert entry.description == ( - "Enable [EIP 3855](https://eips.ethereum.org/EIPS/eip-3855) (`PUSH0` opcode) during upgrade." + "Enable [EIP 3855](https://eips.ethereum.org/EIPS/eip-3855) " + + "(`PUSH0` opcode) during upgrade." ) - assert entry.problems == [] + assert not entry.problems assert ok is True assert entry.fixed == example @@ -74,7 +76,8 @@ def test_malformed_entry(self): assert entry.parse() is False assert entry.fixed == malformed_example assert entry.problems == [ - 'Malformed entry: "- (distribution-precompile) [#194tps://github.com/evmos/evmos/pull/1"' + "Malformed entry: " + + '"- (distribution-precompile) [#194tps://github.com/evmos/evmos/pull/1"' ] @@ -82,7 +85,7 @@ class TestCheckCategory: def test_pass(self): fixed, problems = check_category("evm") assert fixed == "evm" - assert problems == [] + assert not problems def test_invalid_category(self): fixed, problems = check_category("invalid") @@ -101,7 +104,7 @@ class TestCheckLink: def test_pass(self): fixed, problems = check_link(self.example, 1949) assert fixed == self.example - assert problems == [] + assert not problems def test_wrong_base_url(self): fixed, problems = check_link("https://github.com/evmds/evmos/pull/1949", 1949) @@ -123,13 +126,14 @@ def test_pass(self): example = "Add `ClaimRewards` custom transaction." fixed, problems = check_description(example) assert fixed == example - assert problems == [] + assert not problems def test_start_with_lowercase(self): fixed, problems = check_description("add `ClaimRewards` custom transaction.") assert fixed == "Add `ClaimRewards` custom transaction." assert problems == [ - 'PR description should start with capital letter: "add `ClaimRewards` custom transaction."' + "PR description should start with capital letter: " + + '"add `ClaimRewards` custom transaction."' ] def test_end_with_dot(self): @@ -144,7 +148,7 @@ def test_start_with_codeblock(self): "```\nAdd `ClaimRewards` custom transaction." ) assert fixed == "```\nAdd `ClaimRewards` custom transaction." - assert problems == [] + assert not problems class TestCheckWhitespace: @@ -169,7 +173,7 @@ def test_pass(self): found, fixed, problems = check_spelling("Fix API.", ALLOWED_SPELLINGS) assert found is True assert fixed == "Fix API." - assert problems == [] + assert not problems def test_spelling(self): found, fixed, problems = check_spelling("Fix APi.", ALLOWED_SPELLINGS) @@ -192,13 +196,13 @@ def test_pass_codeblocks(self): found, fixed, problems = check_spelling("Fix `in evm code`.", ALLOWED_SPELLINGS) assert found is False assert fixed == "Fix `in evm code`." - assert problems == [] + assert not problems def test_fail_in_word(self): found, fixed, problems = check_spelling("FixAbI in word.", ALLOWED_SPELLINGS) assert found is False assert fixed == "FixAbI in word." - assert problems == [] + assert not problems def test_erc_20(self): found, fixed, problems = check_spelling( diff --git a/scripts/compile_smart_contracts/compile_smart_contracts.py b/scripts/compile_smart_contracts/compile_smart_contracts.py index 64b569e77c..3e26ead0f2 100644 --- a/scripts/compile_smart_contracts/compile_smart_contracts.py +++ b/scripts/compile_smart_contracts/compile_smart_contracts.py @@ -106,13 +106,13 @@ def find_solidity_contracts( and added_contract in f"{Path(root) / file}" ): found_added_contract = True - compiledJSONPath = potential_json_path + compiled_json_path = potential_json_path elif os.path.exists(potential_json_path): - compiledJSONPath = potential_json_path + compiled_json_path = potential_json_path elif os.path.exists(potential_abi_json_path): - compiledJSONPath = potential_abi_json_path + compiled_json_path = potential_abi_json_path elif not os.path.exists(potential_json_path): - compiledJSONPath = None + compiled_json_path = None else: raise ValueError( f"Unexpected behavior for '{Path(root) / file}'.", @@ -123,7 +123,7 @@ def find_solidity_contracts( filename=filename, path=Path(os.path.join(root, file)), relative_path=relative_path, - compiled_json_path=compiledJSONPath, + compiled_json_path=compiled_json_path, ) ) diff --git a/tests/nix_tests/cosmoscli.py b/tests/nix_tests/cosmoscli.py index 96192de317..c237c1c2da 100644 --- a/tests/nix_tests/cosmoscli.py +++ b/tests/nix_tests/cosmoscli.py @@ -689,7 +689,7 @@ def gov_legacy_proposal(self, proposer, kind, proposal, **kwargs): **kwargs, ) ) - elif kind == "cancel-software-upgrade": + if kind == "cancel-software-upgrade": return json.loads( self.raw( "tx", @@ -707,7 +707,7 @@ def gov_legacy_proposal(self, proposer, kind, proposal, **kwargs): **kwargs, ) ) - elif kind == "register-erc20": + if kind == "register-erc20": return json.loads( self.raw( "tx", @@ -722,7 +722,7 @@ def gov_legacy_proposal(self, proposer, kind, proposal, **kwargs): **kwargs, ) ) - elif kind == "register-coin": + if kind == "register-coin": return json.loads( self.raw( "tx", @@ -741,24 +741,24 @@ def gov_legacy_proposal(self, proposer, kind, proposal, **kwargs): **kwargs, ) ) - else: - with tempfile.NamedTemporaryFile("w") as fp: - json.dump(proposal, fp) - fp.flush() - return json.loads( - self.raw( - "tx", - "gov", - method, - kind, - fp.name, - "-y", - from_=proposer, - # basic - home=self.data_dir, - **kwargs, - ) + + with tempfile.NamedTemporaryFile("w") as fp: + json.dump(proposal, fp) + fp.flush() + return json.loads( + self.raw( + "tx", + "gov", + method, + kind, + fp.name, + "-y", + from_=proposer, + # basic + home=self.data_dir, + **kwargs, ) + ) def gov_vote(self, voter, proposal_id, option, **kwargs): kwargs.setdefault("gas_prices", DEFAULT_GAS_PRICE) @@ -843,7 +843,7 @@ def ibc_transfer( amount, channel, # src channel target_version, # chain version number of target chain - i=0, + i=0, # pylint: disable=unused-argument fees="0aevmos", ): return json.loads( @@ -992,7 +992,6 @@ def erc20_params(self, **kwargs): ) ) - # ========================== # FEEMARKET Module # ========================== @@ -1381,7 +1380,6 @@ def gamm_create_pool( ) ) - def token_factory_create_denom( self, denom, diff --git a/tests/nix_tests/test_distr_precompile.py b/tests/nix_tests/test_distr_precompile.py index 09eae93a91..69ed1667db 100644 --- a/tests/nix_tests/test_distr_precompile.py +++ b/tests/nix_tests/test_distr_precompile.py @@ -1,4 +1,5 @@ import json + import pytest from .ibc_utils import get_balance diff --git a/tests/nix_tests/test_ics20_precompile.py b/tests/nix_tests/test_ics20_precompile.py index db75b0cc2f..4aedf9b94f 100644 --- a/tests/nix_tests/test_ics20_precompile.py +++ b/tests/nix_tests/test_ics20_precompile.py @@ -1,4 +1,5 @@ import json + import pytest from .ibc_utils import EVMOS_IBC_DENOM, assert_ready, get_balance, prepare_network @@ -239,7 +240,8 @@ def check_dest_balance(): True, ), ( - "IBC transfer with internal transfer to the escrow addr before and after the precompile call", + "IBC transfer with internal transfer to the escrow addr " + + "before and after the precompile call", ADDRS["signer2"], "ESCROW_ADDR", True, @@ -393,10 +395,12 @@ def check_dest_balance(): @pytest.mark.parametrize( - "name, src_addr, ibc_transfer_amt, transfer_before, transfer_between, transfer_after, err_contains", + "name, src_addr, ibc_transfer_amt, transfer_before, " + + "transfer_between, transfer_after, err_contains", [ ( - "Two IBC transfers with internal transfer before, between and after the precompile call", + "Two IBC transfers with internal transfer before, " + + "between and after the precompile call", ADDRS["signer2"], int(1e18), True, @@ -432,7 +436,8 @@ def check_dest_balance(): None, ), ( - "Two IBC transfers with internal transfer before and between, and second IBC transfer fails", + "Two IBC transfers with internal transfer before and between, " + + "and second IBC transfer fails", ADDRS["signer2"], int(35000e18), True, diff --git a/tests/nix_tests/test_str_v2.py b/tests/nix_tests/test_str_v2.py index e19630ab65..5d1bd3cc77 100644 --- a/tests/nix_tests/test_str_v2.py +++ b/tests/nix_tests/test_str_v2.py @@ -133,9 +133,7 @@ def check_balance_change(): wait_for_ack(evmos_cli, "Evmos") evmos_balance = get_balance(evmos, bech_dst, ATOM_2_IBC_DENOM_MULTI_HOP) - dynamic_precompiles = evmos_cli.erc20_params()["params"][ - "dynamic_precompiles" - ] + dynamic_precompiles = evmos_cli.erc20_params()["params"]["dynamic_precompiles"] token_pairs = evmos_cli.get_token_pairs() # Here it's only one from the previous one we've registered in the first test From 39c914dc28f09611f947b06cf68219965ea22cf2 Mon Sep 17 00:00:00 2001 From: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Date: Wed, 17 Jul 2024 15:31:58 +0200 Subject: [PATCH 325/345] imp(changelog): Minor changelog clean ups to fix linter (#2675) clean changelog --- CHANGELOG.md | 2 +- scripts/changelog_checker/config.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a1a12aa9b..9fb2485ed9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -63,7 +63,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (evm) [#2633](https://github.com/evmos/evmos/pull/2633) Remove `EthAccount` type and use `BaseAccount` instead. - (precompiles) [GHSA-68fc-7mhg-6f6c](https://github.com/evmos/evmos/commit/bb2d504eec9078d6eff6981fc0cb214e8a3ca496) Refactor precompiles to use journal entries. - (vesting-precompile) [GHSA-q6hg-6m9x-5g9c](https://github.com/evmos/evmos/commit/0a620e176617a835ac697eea494afea09185dfaf) Update vesting precompile authorization checks. -- (str) [#2607](https://github.com/evmos/evmos/pull/2607) Introduce changes necessary for strv2. +- (erc20) [#2607](https://github.com/evmos/evmos/pull/2607) Implement Single Token Representation v2. ### Bug Fixes diff --git a/scripts/changelog_checker/config.py b/scripts/changelog_checker/config.py index 22125dbeed..3cd80b3ba3 100644 --- a/scripts/changelog_checker/config.py +++ b/scripts/changelog_checker/config.py @@ -75,6 +75,7 @@ def get_allowed_categories() -> List[str]: "revenue", "osmosis-outpost", "stride-outpost", + "werc20-precompile", ] base_path = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) From 10fe9b55135aaa93bd431526cedda6023bc2a9e9 Mon Sep 17 00:00:00 2001 From: Ramiro Carlucho Date: Wed, 17 Jul 2024 15:06:52 -0300 Subject: [PATCH 326/345] chore(app): bump version to v19 (#2674) bump version to v19 --- .github/workflows/consensuswarn.yml | 2 +- app/ante/cosmos.go | 6 +- app/ante/cosmos/authz_test.go | 8 +- app/ante/cosmos/eip712.go | 8 +- app/ante/cosmos/fees.go | 2 +- app/ante/cosmos/fees_benchmark_test.go | 4 +- app/ante/cosmos/fees_test.go | 8 +- app/ante/cosmos/min_price.go | 2 +- app/ante/cosmos/min_price_test.go | 8 +- app/ante/cosmos/reject_msgs.go | 2 +- app/ante/cosmos/setup_test.go | 24 ++--- app/ante/cosmos/utils_test.go | 12 +-- app/ante/evm.go | 2 +- app/ante/evm/01_setup_ctx.go | 2 +- app/ante/evm/02_mempool_fee_test.go | 2 +- app/ante/evm/03_global_fee_test.go | 2 +- app/ante/evm/04_validate.go | 2 +- app/ante/evm/04_validate_test.go | 6 +- app/ante/evm/05_signature_verification.go | 2 +- app/ante/evm/06_account_verification.go | 6 +- app/ante/evm/06_account_verification_test.go | 14 +-- app/ante/evm/07_can_transfer.go | 4 +- app/ante/evm/07_can_transfer_test.go | 12 +-- app/ante/evm/08_vesting.go | 4 +- app/ante/evm/08_vesting_test.go | 10 +- app/ante/evm/09_gas_consume.go | 6 +- app/ante/evm/09_gas_consume_test.go | 8 +- app/ante/evm/10_incremenet_sequence_test.go | 8 +- app/ante/evm/10_increment_sequence.go | 2 +- app/ante/evm/11_gas_wanted.go | 2 +- app/ante/evm/11_gas_wanted_test.go | 10 +- app/ante/evm/12_emit_event.go | 2 +- app/ante/evm/ante_test.go | 4 +- app/ante/evm/eth_benchmark_test.go | 10 +- app/ante/evm/fee_checker.go | 4 +- app/ante/evm/fee_checker_test.go | 6 +- app/ante/evm/fee_market_test.go | 12 +-- app/ante/evm/interfaces.go | 8 +- app/ante/evm/mono.go | 6 +- app/ante/evm/setup_ctx_test.go | 8 +- app/ante/evm/setup_test.go | 14 +-- app/ante/evm/signverify_test.go | 8 +- app/ante/evm/sigs_test.go | 6 +- app/ante/evm/utils_test.go | 10 +- app/ante/evm_benchmark_test.go | 22 ++--- app/ante/handler_options.go | 6 +- app/ante/handler_options_test.go | 10 +- app/ante/integration_test.go | 8 +- app/ante/setup_test.go | 12 +-- app/ante/sigverify.go | 2 +- app/ante/sigverify_test.go | 8 +- app/ante/utils/claim_rewards_test.go | 8 +- app/ante/utils/setup_test.go | 16 ++-- app/ante/utils_test.go | 4 +- app/app.go | 96 +++++++++---------- app/app_test.go | 18 ++-- app/config.go | 6 +- app/eips/README.md | 2 +- app/eips/eips.go | 2 +- app/eips/eips_test.go | 16 ++-- app/eips/testdata/contracts.go | 4 +- app/ethtest_helper.go | 4 +- app/export.go | 2 +- app/keys.go | 12 +-- app/post/burn.go | 2 +- app/post/burn_test.go | 4 +- app/post/post_test.go | 2 +- app/post/setup_test.go | 10 +- app/test_helpers.go | 8 +- app/upgrades/v16/incentives.go | 2 +- app/upgrades/v16/proposals.go | 2 +- app/upgrades/v16/setup_test.go | 10 +- app/upgrades/v16/upgrades.go | 10 +- app/upgrades/v16/upgrades_test.go | 14 +-- app/upgrades/v19/convert.go | 10 +- app/upgrades/v19/upgrades.go | 14 +-- app/upgrades/v19/upgrades_test.go | 12 +-- app/upgrades/v19/utils.go | 2 +- client/config.go | 2 +- client/debug/debug.go | 4 +- client/export.go | 4 +- client/import.go | 4 +- client/keys.go | 4 +- client/keys/add.go | 2 +- client/testnet.go | 12 +-- cmd/config/config.go | 2 +- cmd/evmosd/cmd_test.go | 6 +- cmd/evmosd/genaccounts.go | 6 +- cmd/evmosd/main.go | 4 +- cmd/evmosd/migrate.go | 2 +- cmd/evmosd/root.go | 24 ++--- cmd/evmosd/testnet.go | 18 ++-- cmd/evmosd/versiondb.go | 4 +- contracts/erc20.go | 4 +- contracts/utils/utils.go | 2 +- contracts/wevmos.go | 2 +- crypto/codec/amino.go | 2 +- crypto/codec/codec.go | 2 +- crypto/ethsecp256k1/ethsecp256k1.go | 2 +- crypto/hd/algorithm.go | 2 +- crypto/hd/algorithm_test.go | 6 +- crypto/hd/benchmark_test.go | 2 +- crypto/keyring/options.go | 6 +- encoding/codec/codec.go | 4 +- encoding/config.go | 2 +- encoding/config_test.go | 8 +- ethereum/eip712/eip712_fuzzer_test.go | 2 +- ethereum/eip712/eip712_test.go | 12 +-- ethereum/eip712/encoding.go | 2 +- ethereum/eip712/encoding_legacy.go | 2 +- ethereum/eip712/preprocess.go | 2 +- ethereum/eip712/preprocess_test.go | 14 +-- go.mod | 2 +- ibc/testing/app.go | 6 +- ibc/testing/chain.go | 6 +- ibc/testing/coordinator.go | 2 +- ibc/utils.go | 4 +- ibc/utils_test.go | 2 +- indexer/kv_indexer.go | 6 +- indexer/kv_indexer_test.go | 14 +-- precompiles/authorization/events.go | 4 +- precompiles/authorization/types.go | 2 +- precompiles/authorization/types_test.go | 8 +- precompiles/bank/bank.go | 6 +- precompiles/bank/integration_test.go | 24 ++--- precompiles/bank/query.go | 2 +- precompiles/bank/query_test.go | 4 +- precompiles/bank/setup_test.go | 14 +-- precompiles/bank/testdata/bank.go | 4 +- precompiles/bank/types.go | 2 +- precompiles/bank/utils_test.go | 8 +- precompiles/bech32/bech32.go | 4 +- precompiles/bech32/bech32_test.go | 6 +- precompiles/bech32/methods.go | 2 +- precompiles/bech32/methods_test.go | 6 +- precompiles/bech32/setup_test.go | 6 +- precompiles/common/abi.go | 2 +- precompiles/common/events.go | 2 +- precompiles/common/precompile.go | 4 +- precompiles/common/types.go | 2 +- precompiles/common/types_test.go | 4 +- precompiles/distribution/distribution.go | 6 +- precompiles/distribution/distribution_test.go | 10 +- precompiles/distribution/events.go | 4 +- precompiles/distribution/events_test.go | 10 +- precompiles/distribution/integration_test.go | 18 ++-- precompiles/distribution/query.go | 4 +- precompiles/distribution/query_test.go | 10 +- precompiles/distribution/setup_test.go | 8 +- precompiles/distribution/tx.go | 6 +- precompiles/distribution/tx_test.go | 12 +-- precompiles/distribution/types.go | 6 +- precompiles/distribution/utils_test.go | 20 ++-- precompiles/erc20/approve.go | 6 +- precompiles/erc20/approve_test.go | 10 +- precompiles/erc20/erc20.go | 10 +- precompiles/erc20/erc20_test.go | 4 +- precompiles/erc20/errors.go | 8 +- precompiles/erc20/errors_test.go | 4 +- precompiles/erc20/events.go | 6 +- precompiles/erc20/events_test.go | 8 +- precompiles/erc20/integration_test.go | 30 +++--- precompiles/erc20/query.go | 6 +- precompiles/erc20/query_test.go | 12 +-- precompiles/erc20/setup_test.go | 10 +- .../erc20/testdata/erc20_allowance_caller.go | 4 +- .../erc20/testdata/erc20_no_metadata.go | 4 +- .../erc20/testdata/erc20_test_caller.go | 4 +- .../testdata/erc20minter_openzeppelinv5.go | 4 +- precompiles/erc20/tx.go | 6 +- precompiles/erc20/tx_test.go | 10 +- precompiles/erc20/types_test.go | 4 +- precompiles/erc20/utils_test.go | 20 ++-- precompiles/ics20/approve.go | 4 +- precompiles/ics20/approve_common.go | 6 +- precompiles/ics20/approve_test.go | 8 +- precompiles/ics20/events.go | 4 +- precompiles/ics20/events_test.go | 10 +- precompiles/ics20/ics20.go | 10 +- precompiles/ics20/integration_test.go | 30 +++--- precompiles/ics20/query.go | 6 +- precompiles/ics20/query_test.go | 8 +- precompiles/ics20/setup_test.go | 10 +- precompiles/ics20/tx.go | 6 +- precompiles/ics20/tx_test.go | 12 +-- precompiles/ics20/types.go | 6 +- precompiles/ics20/utils_test.go | 36 +++---- precompiles/p256/integration_test.go | 14 +-- precompiles/p256/p256.go | 4 +- precompiles/p256/p256_test.go | 4 +- precompiles/p256/setup_test.go | 2 +- precompiles/staking/approve.go | 6 +- precompiles/staking/approve_test.go | 14 +-- precompiles/staking/events.go | 6 +- precompiles/staking/events_test.go | 8 +- precompiles/staking/integration_test.go | 30 +++--- precompiles/staking/query.go | 6 +- precompiles/staking/query_test.go | 10 +- precompiles/staking/setup_test.go | 8 +- precompiles/staking/staking.go | 8 +- precompiles/staking/staking_test.go | 12 +-- .../staking/testdata/staking_caller.go | 4 +- .../staking/testdata/staking_caller_two.go | 4 +- precompiles/staking/tx.go | 8 +- precompiles/staking/tx_test.go | 12 +-- precompiles/staking/types.go | 2 +- precompiles/staking/utils_test.go | 32 +++---- precompiles/testutil/contracts/contracts.go | 10 +- precompiles/testutil/contracts/counter.go | 4 +- .../testutil/contracts/distribution_caller.go | 4 +- precompiles/testutil/contracts/flash_loan.go | 4 +- .../testutil/contracts/interchain_sender.go | 4 +- .../contracts/interchain_sender_caller.go | 4 +- precompiles/testutil/contracts/reverter.go | 4 +- .../testutil/contracts/staking_reverter.go | 4 +- precompiles/testutil/errors.go | 2 +- precompiles/testutil/events.go | 2 +- precompiles/testutil/logs.go | 2 +- precompiles/testutil/testing.go | 2 +- precompiles/vesting/approve.go | 6 +- precompiles/vesting/events.go | 8 +- precompiles/vesting/integration_test.go | 16 ++-- precompiles/vesting/query_test.go | 4 +- precompiles/vesting/setup_test.go | 8 +- .../vesting/testdata/vesting_caller.go | 4 +- precompiles/vesting/tx.go | 8 +- precompiles/vesting/tx_test.go | 16 ++-- precompiles/vesting/types.go | 6 +- precompiles/vesting/utils_test.go | 26 ++--- precompiles/vesting/vesting.go | 8 +- .../crypto/v1/ethsecp256k1/keys.proto | 2 +- proto/ethermint/evm/v1/events.proto | 2 +- proto/ethermint/evm/v1/evm.proto | 2 +- proto/ethermint/evm/v1/genesis.proto | 2 +- proto/ethermint/evm/v1/query.proto | 2 +- proto/ethermint/evm/v1/tx.proto | 2 +- proto/ethermint/feemarket/v1/events.proto | 2 +- proto/ethermint/feemarket/v1/feemarket.proto | 2 +- proto/ethermint/feemarket/v1/genesis.proto | 2 +- proto/ethermint/feemarket/v1/query.proto | 2 +- proto/ethermint/feemarket/v1/tx.proto | 2 +- proto/ethermint/types/v1/dynamic_fee.proto | 2 +- proto/ethermint/types/v1/indexer.proto | 2 +- proto/ethermint/types/v1/web3.proto | 2 +- proto/evmos/epochs/v1/genesis.proto | 2 +- proto/evmos/epochs/v1/query.proto | 2 +- proto/evmos/erc20/v1/erc20.proto | 2 +- proto/evmos/erc20/v1/events.proto | 2 +- proto/evmos/erc20/v1/genesis.proto | 2 +- proto/evmos/erc20/v1/query.proto | 2 +- proto/evmos/erc20/v1/tx.proto | 2 +- proto/evmos/incentives/v1/genesis.proto | 2 +- proto/evmos/incentives/v1/incentives.proto | 2 +- proto/evmos/inflation/v1/genesis.proto | 2 +- proto/evmos/inflation/v1/inflation.proto | 2 +- proto/evmos/inflation/v1/query.proto | 2 +- proto/evmos/inflation/v1/tx.proto | 2 +- proto/evmos/vesting/v1/vesting.proto | 2 +- proto/evmos/vesting/v2/events.proto | 2 +- proto/evmos/vesting/v2/query.proto | 2 +- proto/evmos/vesting/v2/tx.proto | 2 +- proto/evmos/vesting/v2/vesting.proto | 2 +- rpc/apis.go | 20 ++-- rpc/backend/account_info.go | 4 +- rpc/backend/account_info_test.go | 8 +- rpc/backend/backend.go | 8 +- rpc/backend/backend_suite_test.go | 18 ++-- rpc/backend/blocks.go | 4 +- rpc/backend/blocks_test.go | 8 +- rpc/backend/call_tx.go | 8 +- rpc/backend/call_tx_test.go | 8 +- rpc/backend/chain_info.go | 8 +- rpc/backend/chain_info_test.go | 10 +- rpc/backend/client_test.go | 6 +- rpc/backend/evm_query_client_test.go | 8 +- rpc/backend/feemarket_query_client_test.go | 6 +- rpc/backend/filters_test.go | 6 +- rpc/backend/mocks/evm_query_client.go | 2 +- rpc/backend/mocks/feemarket_query_client.go | 2 +- rpc/backend/node_info.go | 10 +- rpc/backend/node_info_test.go | 6 +- rpc/backend/sign_tx.go | 2 +- rpc/backend/sign_tx_test.go | 8 +- rpc/backend/tracing.go | 4 +- rpc/backend/tracing_test.go | 8 +- rpc/backend/tx_info.go | 6 +- rpc/backend/tx_info_test.go | 10 +- rpc/backend/utils.go | 4 +- rpc/namespaces/ethereum/debug/api.go | 6 +- rpc/namespaces/ethereum/eth/api.go | 8 +- rpc/namespaces/ethereum/eth/filters/api.go | 4 +- .../ethereum/eth/filters/filter_system.go | 4 +- .../eth/filters/filter_system_test.go | 2 +- .../ethereum/eth/filters/filters.go | 4 +- rpc/namespaces/ethereum/miner/api.go | 2 +- rpc/namespaces/ethereum/net/api.go | 2 +- rpc/namespaces/ethereum/personal/api.go | 8 +- rpc/namespaces/ethereum/txpool/api.go | 2 +- rpc/namespaces/ethereum/web3/api.go | 2 +- rpc/types/block.go | 2 +- rpc/types/events.go | 4 +- rpc/types/events_test.go | 2 +- rpc/types/query_client.go | 4 +- rpc/types/utils.go | 4 +- rpc/websockets.go | 10 +- server/config/config_test.go | 2 +- server/indexer_cmd.go | 2 +- server/indexer_service.go | 2 +- server/json_rpc.go | 6 +- server/start.go | 12 +-- server/util.go | 2 +- tests/e2e/e2e_suite_test.go | 8 +- tests/e2e/tx_test.go | 4 +- tests/e2e/upgrade/balances_test.go | 6 +- tests/e2e/upgrade/manager.go | 4 +- tests/integration/ledger/evmosd_suite_test.go | 16 ++-- tests/integration/ledger/ledger_test.go | 12 +-- testutil/abci.go | 6 +- testutil/ante.go | 4 +- testutil/contract.go | 6 +- testutil/fund.go | 4 +- testutil/integration.go | 4 +- .../integration/common/factory/factory.go | 4 +- testutil/integration/common/grpc/account.go | 4 +- testutil/integration/common/grpc/authz.go | 4 +- testutil/integration/common/grpc/grpc.go | 2 +- .../integration/evmos/factory/broadcast.go | 4 +- testutil/integration/evmos/factory/build.go | 4 +- testutil/integration/evmos/factory/factory.go | 14 +-- testutil/integration/evmos/factory/helpers.go | 6 +- testutil/integration/evmos/factory/sign.go | 4 +- testutil/integration/evmos/factory/types.go | 2 +- testutil/integration/evmos/grpc/evm.go | 2 +- testutil/integration/evmos/grpc/feemarket.go | 2 +- testutil/integration/evmos/grpc/grpc.go | 8 +- testutil/integration/evmos/keyring/keyring.go | 2 +- testutil/integration/evmos/network/clients.go | 12 +-- testutil/integration/evmos/network/config.go | 6 +- .../integration/evmos/network/config_test.go | 8 +- testutil/integration/evmos/network/network.go | 14 +-- testutil/integration/evmos/network/params.go | 6 +- testutil/integration/evmos/network/setup.go | 14 +-- .../integration/evmos/network/unit_network.go | 6 +- testutil/integration/evmos/utils/bank.go | 2 +- testutil/integration/evmos/utils/bank_test.go | 8 +- testutil/integration/evmos/utils/contracts.go | 4 +- testutil/integration/evmos/utils/erc20.go | 6 +- testutil/integration/evmos/utils/evm.go | 6 +- testutil/integration/evmos/utils/evm_test.go | 14 +-- testutil/integration/evmos/utils/genesis.go | 10 +- testutil/integration/evmos/utils/gov.go | 6 +- testutil/integration/evmos/utils/unit.go | 8 +- .../ibc/coordinator/coordinator.go | 6 +- testutil/integration/ibc/coordinator/utils.go | 2 +- testutil/network/network.go | 10 +- testutil/network/network_test.go | 6 +- testutil/network/util.go | 6 +- testutil/staking-rewards.go | 6 +- testutil/statedb.go | 4 +- testutil/tx/cosmos.go | 4 +- testutil/tx/eip712.go | 8 +- testutil/tx/eth.go | 8 +- testutil/tx/signer.go | 2 +- testutil/vesting.go | 2 +- types/validation_test.go | 4 +- utils/utils.go | 2 +- utils/utils_test.go | 2 +- wallets/ledger/ledger.go | 6 +- wallets/ledger/ledger_suite_test.go | 6 +- wallets/ledger/ledger_test.go | 10 +- wallets/ledger/mocks/wallet.go | 2 +- wallets/ledger/wallet_test.go | 6 +- wallets/usbwallet/hub.go | 2 +- wallets/usbwallet/wallet.go | 2 +- x/epochs/client/cli/query.go | 2 +- x/epochs/genesis.go | 4 +- x/epochs/genesis_test.go | 10 +- x/epochs/keeper/abci.go | 2 +- x/epochs/keeper/abci_test.go | 4 +- x/epochs/keeper/epoch_infos.go | 2 +- x/epochs/keeper/epoch_infos_test.go | 2 +- x/epochs/keeper/grpc_query.go | 2 +- x/epochs/keeper/grpc_query_test.go | 2 +- x/epochs/keeper/hooks.go | 2 +- x/epochs/keeper/keeper.go | 2 +- x/epochs/keeper/setup_test.go | 6 +- x/epochs/keeper/utils_test.go | 10 +- x/epochs/module.go | 6 +- x/erc20/client/cli/query.go | 2 +- x/erc20/client/cli/tx.go | 4 +- x/erc20/client/proposal_handler.go | 2 +- x/erc20/genesis.go | 4 +- x/erc20/genesis_test.go | 16 ++-- x/erc20/ibc_middleware.go | 4 +- x/erc20/keeper/dynamic_precompiles.go | 4 +- x/erc20/keeper/erc20_utils_test.go | 6 +- x/erc20/keeper/evm.go | 6 +- x/erc20/keeper/evm_test.go | 12 +-- x/erc20/keeper/grpc_query.go | 4 +- x/erc20/keeper/grpc_query_test.go | 4 +- x/erc20/keeper/ibc_callbacks.go | 4 +- .../keeper/ibc_callbacks_integration_test.go | 8 +- x/erc20/keeper/ibc_callbacks_test.go | 14 +-- x/erc20/keeper/integration_test.go | 10 +- x/erc20/keeper/keeper.go | 4 +- x/erc20/keeper/migrations.go | 6 +- x/erc20/keeper/migrations_test.go | 10 +- x/erc20/keeper/mint.go | 2 +- x/erc20/keeper/mint_test.go | 4 +- x/erc20/keeper/msg_server.go | 4 +- x/erc20/keeper/msg_server_test.go | 10 +- x/erc20/keeper/params.go | 2 +- x/erc20/keeper/params_test.go | 2 +- x/erc20/keeper/precompiles.go | 6 +- x/erc20/keeper/precompiles_test.go | 2 +- x/erc20/keeper/proposals.go | 2 +- x/erc20/keeper/proposals_test.go | 8 +- x/erc20/keeper/setup_test.go | 8 +- .../erc20DirectBalanceManipulation.go | 4 +- .../keeper/testdata/erc20maliciousdelayed.go | 4 +- x/erc20/keeper/token_pairs.go | 4 +- x/erc20/keeper/token_pairs_test.go | 6 +- x/erc20/keeper/utils_test.go | 30 +++--- x/erc20/migrations/v3/migration.go | 4 +- x/erc20/migrations/v3/migration_test.go | 10 +- x/erc20/migrations/v3/types/genesis.pb.go | 2 +- x/erc20/migrations/v3/types/params.go | 2 +- x/erc20/migrations/v4/migration.go | 4 +- x/erc20/migrations/v4/migration_test.go | 10 +- x/erc20/module.go | 6 +- x/erc20/proposal_handler.go | 4 +- x/erc20/types/evm_test.go | 2 +- x/erc20/types/genesis.go | 2 +- x/erc20/types/genesis_test.go | 4 +- x/erc20/types/interfaces.go | 6 +- x/erc20/types/mocks/EVMKeeper.go | 6 +- x/erc20/types/mocks/MsgClient.go | 2 +- x/erc20/types/mocks/MsgServer.go | 2 +- x/erc20/types/mocks/QueryClient.go | 2 +- x/erc20/types/mocks/QueryServer.go | 2 +- x/erc20/types/msg_test.go | 4 +- x/erc20/types/params.go | 2 +- x/erc20/types/params_test.go | 2 +- x/erc20/types/proposal.go | 2 +- x/erc20/types/proposal_test.go | 4 +- x/erc20/types/token_pair.go | 4 +- x/erc20/types/token_pair_test.go | 4 +- x/erc20/types/utils_test.go | 2 +- x/evm/ante/ctx_test.go | 4 +- x/evm/client/cli/query.go | 4 +- x/evm/client/cli/tx.go | 4 +- x/evm/config/configurator.go | 4 +- x/evm/config/configurator_test.go | 6 +- x/evm/core/core/utils.go | 2 +- x/evm/core/logger/access_list_tracer.go | 2 +- x/evm/core/logger/logger.go | 2 +- x/evm/core/logger/logger_json.go | 2 +- x/evm/core/tracers/js/goja.go | 6 +- x/evm/core/tracers/js/tracer_test.go | 4 +- x/evm/core/tracers/native/4byte.go | 4 +- x/evm/core/tracers/native/call.go | 4 +- x/evm/core/tracers/native/noop.go | 4 +- x/evm/core/tracers/native/prestate.go | 4 +- x/evm/core/tracers/native/revertreason.go | 4 +- x/evm/core/tracers/native/tracer.go | 2 +- x/evm/core/tracers/tracers.go | 2 +- x/evm/genesis.go | 4 +- x/evm/genesis_test.go | 18 ++-- x/evm/keeper/abci_test.go | 2 +- x/evm/keeper/benchmark_test.go | 6 +- x/evm/keeper/call_evm.go | 4 +- x/evm/keeper/call_evm_test.go | 10 +- x/evm/keeper/config.go | 6 +- x/evm/keeper/fees.go | 2 +- x/evm/keeper/fees_test.go | 4 +- x/evm/keeper/gas.go | 2 +- x/evm/keeper/grpc_query.go | 14 +-- x/evm/keeper/grpc_query_test.go | 14 +-- x/evm/keeper/integration_test.go | 16 ++-- x/evm/keeper/keeper.go | 8 +- x/evm/keeper/keeper_test.go | 8 +- x/evm/keeper/migrations.go | 10 +- x/evm/keeper/migrations_test.go | 4 +- x/evm/keeper/msg_server.go | 2 +- x/evm/keeper/msg_server_test.go | 4 +- x/evm/keeper/params.go | 4 +- x/evm/keeper/params_benchmark_test.go | 2 +- x/evm/keeper/params_test.go | 2 +- x/evm/keeper/precompiles.go | 4 +- x/evm/keeper/setup_test.go | 16 ++-- x/evm/keeper/state_transition.go | 10 +- .../keeper/state_transition_benchmark_test.go | 2 +- x/evm/keeper/state_transition_test.go | 8 +- x/evm/keeper/statedb.go | 4 +- x/evm/keeper/statedb_benchmark_test.go | 2 +- x/evm/keeper/statedb_test.go | 18 ++-- x/evm/keeper/static_precompiles.go | 26 ++--- x/evm/keeper/testdata/contracts.go | 4 +- x/evm/keeper/utils.go | 2 +- x/evm/keeper/utils_test.go | 10 +- x/evm/migrations/v4/migrate.go | 4 +- x/evm/migrations/v4/migrate_test.go | 10 +- x/evm/migrations/v5/migrate.go | 4 +- x/evm/migrations/v5/migrate_test.go | 10 +- x/evm/migrations/v6/migrate.go | 6 +- x/evm/migrations/v6/migrate_test.go | 10 +- x/evm/migrations/v7/migrate.go | 4 +- x/evm/migrations/v7/migrate_test.go | 10 +- x/evm/module.go | 6 +- x/evm/statedb/config.go | 2 +- x/evm/statedb/integration_test.go | 16 ++-- x/evm/statedb/interfaces.go | 2 +- x/evm/statedb/mock_test.go | 4 +- x/evm/statedb/state_object.go | 2 +- x/evm/statedb/statedb.go | 4 +- x/evm/statedb/statedb_test.go | 4 +- x/evm/types/access_list_test.go | 2 +- x/evm/types/access_list_tx.go | 2 +- x/evm/types/access_list_tx_test.go | 2 +- x/evm/types/compiled_contract_test.go | 2 +- x/evm/types/dynamic_fee_tx.go | 2 +- x/evm/types/dynamic_fee_tx_test.go | 4 +- x/evm/types/genesis.go | 2 +- x/evm/types/genesis_test.go | 2 +- x/evm/types/interfaces.go | 4 +- x/evm/types/legacy_tx.go | 2 +- x/evm/types/legacy_tx_test.go | 2 +- x/evm/types/logs.go | 2 +- x/evm/types/logs_test.go | 4 +- x/evm/types/msg.go | 2 +- x/evm/types/msg_test.go | 10 +- x/evm/types/opcodes_hooks.go | 2 +- x/evm/types/params.go | 8 +- x/evm/types/permissions.go | 2 +- x/evm/types/permissions_test.go | 4 +- x/evm/types/tracer.go | 4 +- x/evm/types/tx.go | 2 +- x/evm/types/tx_args_test.go | 2 +- x/evm/types/utils_test.go | 8 +- x/feemarket/client/cli/query.go | 2 +- x/feemarket/genesis.go | 4 +- x/feemarket/keeper/abci.go | 2 +- x/feemarket/keeper/grpc_query.go | 2 +- x/feemarket/keeper/grpc_query_test.go | 2 +- x/feemarket/keeper/integration_test.go | 8 +- x/feemarket/keeper/keeper.go | 2 +- x/feemarket/keeper/migrations.go | 4 +- x/feemarket/keeper/migrations_test.go | 4 +- x/feemarket/keeper/msg_server.go | 2 +- x/feemarket/keeper/msg_server_test.go | 2 +- x/feemarket/keeper/params.go | 2 +- x/feemarket/keeper/params_test.go | 2 +- x/feemarket/keeper/setup_test.go | 6 +- x/feemarket/keeper/utils_test.go | 16 ++-- x/feemarket/migrations/v4/migrate.go | 2 +- x/feemarket/migrations/v4/migrate_test.go | 8 +- x/feemarket/migrations/v4/types/params.go | 2 +- x/feemarket/module.go | 6 +- x/ibc/transfer/ibc_module.go | 2 +- x/ibc/transfer/keeper/keeper.go | 2 +- x/ibc/transfer/keeper/keeper_test.go | 24 ++--- x/ibc/transfer/keeper/msg_server.go | 2 +- x/ibc/transfer/keeper/msg_server_test.go | 4 +- x/ibc/transfer/module.go | 2 +- x/ibc/transfer/types/interfaces.go | 2 +- x/incentives/module.go | 2 +- x/incentives/types/proposal.go | 2 +- x/inflation/v1/client/cli/query.go | 2 +- x/inflation/v1/genesis.go | 4 +- x/inflation/v1/keeper/epoch_info.go | 2 +- x/inflation/v1/keeper/epoch_info_test.go | 4 +- x/inflation/v1/keeper/grpc_query.go | 2 +- x/inflation/v1/keeper/grpc_query_test.go | 4 +- x/inflation/v1/keeper/hooks.go | 4 +- x/inflation/v1/keeper/hooks_test.go | 4 +- x/inflation/v1/keeper/inflation.go | 6 +- x/inflation/v1/keeper/inflation_test.go | 4 +- x/inflation/v1/keeper/integration_test.go | 4 +- x/inflation/v1/keeper/keeper.go | 2 +- x/inflation/v1/keeper/migrations.go | 6 +- x/inflation/v1/keeper/migrations_test.go | 10 +- x/inflation/v1/keeper/msg_server.go | 2 +- x/inflation/v1/keeper/msg_server_test.go | 2 +- x/inflation/v1/keeper/params.go | 2 +- x/inflation/v1/keeper/params_test.go | 2 +- x/inflation/v1/keeper/periods.go | 2 +- x/inflation/v1/keeper/setup_test.go | 6 +- x/inflation/v1/keeper/utils_test.go | 12 +-- x/inflation/v1/migrations/v2/migrate.go | 4 +- x/inflation/v1/migrations/v2/migrate_test.go | 10 +- x/inflation/v1/migrations/v2/types/params.go | 4 +- x/inflation/v1/migrations/v3/migrate_test.go | 4 +- x/inflation/v1/module.go | 6 +- x/inflation/v1/types/genesis.go | 2 +- x/inflation/v1/types/genesis_test.go | 2 +- x/inflation/v1/types/inflation_calculation.go | 2 +- x/inflation/v1/types/params.go | 2 +- x/staking/keeper/integration_test.go | 16 ++-- x/staking/keeper/msg_server.go | 2 +- x/staking/keeper/msg_server_test.go | 12 +-- x/staking/keeper/util_test.go | 6 +- x/staking/module.go | 2 +- x/vesting/client/cli/query.go | 2 +- x/vesting/client/cli/tx.go | 2 +- x/vesting/client/proposal_handler.go | 2 +- x/vesting/handler.go | 2 +- x/vesting/keeper/gov.go | 2 +- x/vesting/keeper/gov_test.go | 2 +- x/vesting/keeper/grpc_query.go | 2 +- x/vesting/keeper/grpc_query_test.go | 4 +- x/vesting/keeper/hooks.go | 2 +- x/vesting/keeper/integration_test.go | 16 ++-- x/vesting/keeper/keeper.go | 2 +- x/vesting/keeper/keeper_test.go | 8 +- x/vesting/keeper/migrations.go | 4 +- x/vesting/keeper/migrations_test.go | 8 +- x/vesting/keeper/msg_server.go | 4 +- x/vesting/keeper/msg_server_test.go | 10 +- x/vesting/keeper/setup_test.go | 20 ++-- x/vesting/keeper/utils.go | 2 +- x/vesting/keeper/utils_test.go | 8 +- x/vesting/migrations/v2/migrate.go | 4 +- x/vesting/migrations/v3/migrate.go | 2 +- x/vesting/module.go | 6 +- x/vesting/proposal_handler.go | 4 +- x/vesting/proposal_handler_test.go | 8 +- x/vesting/setup_test.go | 2 +- .../types/clawback_vesting_account_test.go | 4 +- x/vesting/types/codec.go | 2 +- x/vesting/types/msg_test.go | 4 +- x/vesting/types/proposal_test.go | 2 +- x/vesting/utils_test.go | 12 +-- 632 files changed, 1895 insertions(+), 1895 deletions(-) diff --git a/.github/workflows/consensuswarn.yml b/.github/workflows/consensuswarn.yml index 9a19ef4a52..c2c736fc07 100644 --- a/.github/workflows/consensuswarn.yml +++ b/.github/workflows/consensuswarn.yml @@ -18,4 +18,4 @@ jobs: - uses: actions/checkout@v4 - uses: orijtech/consensuswarn@main with: - roots: "github.com/evmos/evmos/v18/app.Evmos.DeliverTx,github.com/evmos/evmos/v18/app.Evmos.BeginBlocker,github.com/evmos/evmos/v18/app.Evmos.EndBlocker" + roots: "github.com/evmos/evmos/v19/app.Evmos.DeliverTx,github.com/evmos/evmos/v19/app.Evmos.BeginBlocker,github.com/evmos/evmos/v19/app.Evmos.EndBlocker" diff --git a/app/ante/cosmos.go b/app/ante/cosmos.go index 9ed02fb3e1..ebbc897346 100644 --- a/app/ante/cosmos.go +++ b/app/ante/cosmos.go @@ -8,9 +8,9 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/ante" sdkvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" ibcante "github.com/cosmos/ibc-go/v7/modules/core/ante" - cosmosante "github.com/evmos/evmos/v18/app/ante/cosmos" - evmante "github.com/evmos/evmos/v18/app/ante/evm" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + cosmosante "github.com/evmos/evmos/v19/app/ante/cosmos" + evmante "github.com/evmos/evmos/v19/app/ante/evm" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) // newCosmosAnteHandler creates the default ante handler for Cosmos transactions diff --git a/app/ante/cosmos/authz_test.go b/app/ante/cosmos/authz_test.go index 301457534e..b3c00c1b82 100644 --- a/app/ante/cosmos/authz_test.go +++ b/app/ante/cosmos/authz_test.go @@ -18,10 +18,10 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" ethtypes "github.com/ethereum/go-ethereum/core/types" - cosmosante "github.com/evmos/evmos/v18/app/ante/cosmos" - "github.com/evmos/evmos/v18/testutil" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + cosmosante "github.com/evmos/evmos/v19/app/ante/cosmos" + "github.com/evmos/evmos/v19/testutil" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func TestAuthzLimiterDecorator(t *testing.T) { diff --git a/app/ante/cosmos/eip712.go b/app/ante/cosmos/eip712.go index 00c1c34196..e94e447cab 100644 --- a/app/ante/cosmos/eip712.go +++ b/app/ante/cosmos/eip712.go @@ -19,11 +19,11 @@ import ( ethcrypto "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/crypto/secp256k1" "github.com/ethereum/go-ethereum/signer/core/apitypes" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" - "github.com/evmos/evmos/v18/ethereum/eip712" - "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" + "github.com/evmos/evmos/v19/ethereum/eip712" + "github.com/evmos/evmos/v19/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) var evmosCodec codec.ProtoCodecMarshaler diff --git a/app/ante/cosmos/fees.go b/app/ante/cosmos/fees.go index 33f42d9c3d..d99fa02dad 100644 --- a/app/ante/cosmos/fees.go +++ b/app/ante/cosmos/fees.go @@ -13,7 +13,7 @@ import ( errortypes "github.com/cosmos/cosmos-sdk/types/errors" authante "github.com/cosmos/cosmos-sdk/x/auth/ante" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - anteutils "github.com/evmos/evmos/v18/app/ante/utils" + anteutils "github.com/evmos/evmos/v19/app/ante/utils" ) // DeductFeeDecorator deducts fees from the first signer of the tx. diff --git a/app/ante/cosmos/fees_benchmark_test.go b/app/ante/cosmos/fees_benchmark_test.go index 6199b1a459..df14765802 100644 --- a/app/ante/cosmos/fees_benchmark_test.go +++ b/app/ante/cosmos/fees_benchmark_test.go @@ -6,8 +6,8 @@ import ( "time" sdkmath "cosmossdk.io/math" - "github.com/evmos/evmos/v18/testutil" - testutiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v19/testutil" + testutiltx "github.com/evmos/evmos/v19/testutil/tx" ) // This tests setup contains expensive operations. diff --git a/app/ante/cosmos/fees_test.go b/app/ante/cosmos/fees_test.go index af595d3f3c..16bf422d33 100644 --- a/app/ante/cosmos/fees_test.go +++ b/app/ante/cosmos/fees_test.go @@ -6,10 +6,10 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/feegrant" - cosmosante "github.com/evmos/evmos/v18/app/ante/cosmos" - "github.com/evmos/evmos/v18/testutil" - testutiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/utils" + cosmosante "github.com/evmos/evmos/v19/app/ante/cosmos" + "github.com/evmos/evmos/v19/testutil" + testutiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/utils" ) type deductFeeDecoratorTestCase struct { diff --git a/app/ante/cosmos/min_price.go b/app/ante/cosmos/min_price.go index 7ed58d640b..a17c737221 100644 --- a/app/ante/cosmos/min_price.go +++ b/app/ante/cosmos/min_price.go @@ -9,7 +9,7 @@ import ( errorsmod "cosmossdk.io/errors" "cosmossdk.io/math" - evmante "github.com/evmos/evmos/v18/app/ante/evm" + evmante "github.com/evmos/evmos/v19/app/ante/evm" sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" diff --git a/app/ante/cosmos/min_price_test.go b/app/ante/cosmos/min_price_test.go index f7b9e8b0fd..02f8b02671 100644 --- a/app/ante/cosmos/min_price_test.go +++ b/app/ante/cosmos/min_price_test.go @@ -7,10 +7,10 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - cosmosante "github.com/evmos/evmos/v18/app/ante/cosmos" - "github.com/evmos/evmos/v18/testutil" - testutiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/utils" + cosmosante "github.com/evmos/evmos/v19/app/ante/cosmos" + "github.com/evmos/evmos/v19/testutil" + testutiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/utils" ) var execTypes = []struct { diff --git a/app/ante/cosmos/reject_msgs.go b/app/ante/cosmos/reject_msgs.go index 37f9b877ea..7e6a02c8cb 100644 --- a/app/ante/cosmos/reject_msgs.go +++ b/app/ante/cosmos/reject_msgs.go @@ -6,7 +6,7 @@ import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) // RejectMessagesDecorator prevents invalid msg types from being executed diff --git a/app/ante/cosmos/setup_test.go b/app/ante/cosmos/setup_test.go index 2ee90c579c..935c5e2a9d 100644 --- a/app/ante/cosmos/setup_test.go +++ b/app/ante/cosmos/setup_test.go @@ -20,18 +20,18 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/app/ante" - evmante "github.com/evmos/evmos/v18/app/ante/evm" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" - "github.com/evmos/evmos/v18/encoding" - "github.com/evmos/evmos/v18/ethereum/eip712" - "github.com/evmos/evmos/v18/testutil" - "github.com/evmos/evmos/v18/types" - "github.com/evmos/evmos/v18/utils" - "github.com/evmos/evmos/v18/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/app/ante" + evmante "github.com/evmos/evmos/v19/app/ante/evm" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" + "github.com/evmos/evmos/v19/encoding" + "github.com/evmos/evmos/v19/ethereum/eip712" + "github.com/evmos/evmos/v19/testutil" + "github.com/evmos/evmos/v19/types" + "github.com/evmos/evmos/v19/utils" + "github.com/evmos/evmos/v19/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v19/x/feemarket/types" ) type AnteTestSuite struct { diff --git a/app/ante/cosmos/utils_test.go b/app/ante/cosmos/utils_test.go index c1f4f37792..5002516588 100644 --- a/app/ante/cosmos/utils_test.go +++ b/app/ante/cosmos/utils_test.go @@ -13,12 +13,12 @@ import ( authsigning "github.com/cosmos/cosmos-sdk/x/auth/signing" "github.com/cosmos/cosmos-sdk/x/authz" - "github.com/evmos/evmos/v18/app" - cosmosante "github.com/evmos/evmos/v18/app/ante/cosmos" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" - "github.com/evmos/evmos/v18/encoding" - testutil "github.com/evmos/evmos/v18/testutil" - testutiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v19/app" + cosmosante "github.com/evmos/evmos/v19/app/ante/cosmos" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" + "github.com/evmos/evmos/v19/encoding" + testutil "github.com/evmos/evmos/v19/testutil" + testutiltx "github.com/evmos/evmos/v19/testutil/tx" ) func (suite *AnteTestSuite) CreateTestCosmosTxBuilder(gasPrice sdkmath.Int, denom string, msgs ...sdk.Msg) client.TxBuilder { diff --git a/app/ante/evm.go b/app/ante/evm.go index e2e4b9558d..b93c1620df 100644 --- a/app/ante/evm.go +++ b/app/ante/evm.go @@ -5,7 +5,7 @@ package ante import ( sdk "github.com/cosmos/cosmos-sdk/types" - evmante "github.com/evmos/evmos/v18/app/ante/evm" + evmante "github.com/evmos/evmos/v19/app/ante/evm" ) func newMonoEVMAnteHandler(options HandlerOptions) sdk.AnteHandler { diff --git a/app/ante/evm/01_setup_ctx.go b/app/ante/evm/01_setup_ctx.go index 4f69c7f08e..031da649a8 100644 --- a/app/ante/evm/01_setup_ctx.go +++ b/app/ante/evm/01_setup_ctx.go @@ -8,7 +8,7 @@ import ( sdktypes "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" authante "github.com/cosmos/cosmos-sdk/x/auth/ante" - evmante "github.com/evmos/evmos/v18/x/evm/ante" + evmante "github.com/evmos/evmos/v19/x/evm/ante" ) var _ sdktypes.AnteDecorator = &EthSetupContextDecorator{} diff --git a/app/ante/evm/02_mempool_fee_test.go b/app/ante/evm/02_mempool_fee_test.go index 3c45baa8e7..5c4db8066e 100644 --- a/app/ante/evm/02_mempool_fee_test.go +++ b/app/ante/evm/02_mempool_fee_test.go @@ -5,7 +5,7 @@ package evm_test import ( sdkmath "cosmossdk.io/math" errortypes "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/evmos/evmos/v18/app/ante/evm" + "github.com/evmos/evmos/v19/app/ante/evm" ) func (suite *EvmAnteTestSuite) TestMempoolFee() { diff --git a/app/ante/evm/03_global_fee_test.go b/app/ante/evm/03_global_fee_test.go index 1ab8b1f502..84b27d0764 100644 --- a/app/ante/evm/03_global_fee_test.go +++ b/app/ante/evm/03_global_fee_test.go @@ -5,7 +5,7 @@ package evm_test import ( sdkmath "cosmossdk.io/math" errortypes "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/evmos/evmos/v18/app/ante/evm" + "github.com/evmos/evmos/v19/app/ante/evm" ) func (suite *EvmAnteTestSuite) TestGlobalFee() { diff --git a/app/ante/evm/04_validate.go b/app/ante/evm/04_validate.go index 0d45c1251c..56b250bed1 100644 --- a/app/ante/evm/04_validate.go +++ b/app/ante/evm/04_validate.go @@ -9,7 +9,7 @@ import ( sdktypes "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/types/tx" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) // ValidateMsg validates an Ethereum specific message type and returns an error if invalid diff --git a/app/ante/evm/04_validate_test.go b/app/ante/evm/04_validate_test.go index a6efb8eba0..65c8299060 100644 --- a/app/ante/evm/04_validate_test.go +++ b/app/ante/evm/04_validate_test.go @@ -8,9 +8,9 @@ import ( sdktypes "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/app/ante/evm" - testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/app/ante/evm" + testkeyring "github.com/evmos/evmos/v19/testutil/integration/evmos/keyring" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) type validateMsgParams struct { diff --git a/app/ante/evm/05_signature_verification.go b/app/ante/evm/05_signature_verification.go index b63f2c5371..94b5809672 100644 --- a/app/ante/evm/05_signature_verification.go +++ b/app/ante/evm/05_signature_verification.go @@ -9,7 +9,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" ethtypes "github.com/ethereum/go-ethereum/core/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) // EthSigVerificationDecorator validates an ethereum signatures diff --git a/app/ante/evm/06_account_verification.go b/app/ante/evm/06_account_verification.go index d542f8523e..522a7c7d71 100644 --- a/app/ante/evm/06_account_verification.go +++ b/app/ante/evm/06_account_verification.go @@ -8,9 +8,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/x/evm/keeper" - "github.com/evmos/evmos/v18/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/x/evm/keeper" + "github.com/evmos/evmos/v19/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) // VerifyAccountBalance checks that the account balance is greater than the total transaction cost. diff --git a/app/ante/evm/06_account_verification_test.go b/app/ante/evm/06_account_verification_test.go index c797f9beb5..38093b2401 100644 --- a/app/ante/evm/06_account_verification_test.go +++ b/app/ante/evm/06_account_verification_test.go @@ -7,13 +7,13 @@ import ( "cosmossdk.io/math" errortypes "github.com/cosmos/cosmos-sdk/types/errors" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/app/ante/evm" - "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - "github.com/evmos/evmos/v18/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/app/ante/evm" + "github.com/evmos/evmos/v19/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v19/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v19/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v19/testutil/integration/evmos/network" + "github.com/evmos/evmos/v19/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func (suite *EvmAnteTestSuite) TestVerifyAccountBalance() { diff --git a/app/ante/evm/07_can_transfer.go b/app/ante/evm/07_can_transfer.go index 371ffcad47..05f951a50f 100644 --- a/app/ante/evm/07_can_transfer.go +++ b/app/ante/evm/07_can_transfer.go @@ -11,8 +11,8 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/params" - "github.com/evmos/evmos/v18/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) // CanTransfer checks if the sender is allowed to transfer funds according to the EVM block diff --git a/app/ante/evm/07_can_transfer_test.go b/app/ante/evm/07_can_transfer_test.go index 58be2b2f9d..e679a1a250 100644 --- a/app/ante/evm/07_can_transfer_test.go +++ b/app/ante/evm/07_can_transfer_test.go @@ -9,12 +9,12 @@ import ( "cosmossdk.io/math" errortypes "github.com/cosmos/cosmos-sdk/types/errors" gethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v18/app/ante/evm" - "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/app/ante/evm" + "github.com/evmos/evmos/v19/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v19/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v19/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v19/testutil/integration/evmos/network" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func (suite *EvmAnteTestSuite) TestCanTransfer() { diff --git a/app/ante/evm/08_vesting.go b/app/ante/evm/08_vesting.go index ccd38e55e7..17ee496b48 100644 --- a/app/ante/evm/08_vesting.go +++ b/app/ante/evm/08_vesting.go @@ -10,8 +10,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" - vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" + vestingtypes "github.com/evmos/evmos/v19/x/vesting/types" ) // EthVestingTransactionDecorator validates if clawback vesting accounts are diff --git a/app/ante/evm/08_vesting_test.go b/app/ante/evm/08_vesting_test.go index cecadad5fb..0e5b05f4be 100644 --- a/app/ante/evm/08_vesting_test.go +++ b/app/ante/evm/08_vesting_test.go @@ -11,11 +11,11 @@ import ( errortypes "github.com/cosmos/cosmos-sdk/types/errors" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" sdkvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" - "github.com/evmos/evmos/v18/app/ante/evm" - "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" + "github.com/evmos/evmos/v19/app/ante/evm" + "github.com/evmos/evmos/v19/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v19/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v19/testutil/integration/evmos/network" + vestingtypes "github.com/evmos/evmos/v19/x/vesting/types" ) type AccountExpenses = map[string]*evm.EthVestingExpenseTracker diff --git a/app/ante/evm/09_gas_consume.go b/app/ante/evm/09_gas_consume.go index f3004a7a44..eabefa8bca 100644 --- a/app/ante/evm/09_gas_consume.go +++ b/app/ante/evm/09_gas_consume.go @@ -10,9 +10,9 @@ import ( sdktypes "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" "github.com/ethereum/go-ethereum/common" - anteutils "github.com/evmos/evmos/v18/app/ante/utils" - "github.com/evmos/evmos/v18/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + anteutils "github.com/evmos/evmos/v19/app/ante/utils" + "github.com/evmos/evmos/v19/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) // UpdateCumulativeGasWanted updates the cumulative gas wanted diff --git a/app/ante/evm/09_gas_consume_test.go b/app/ante/evm/09_gas_consume_test.go index a113705df9..69f5fc41a8 100644 --- a/app/ante/evm/09_gas_consume_test.go +++ b/app/ante/evm/09_gas_consume_test.go @@ -5,10 +5,10 @@ package evm_test import ( sdktypes "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - evmante "github.com/evmos/evmos/v18/app/ante/evm" - "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + evmante "github.com/evmos/evmos/v19/app/ante/evm" + "github.com/evmos/evmos/v19/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v19/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v19/testutil/integration/evmos/network" ) func (suite *EvmAnteTestSuite) TestUpdateCumulativeGasWanted() { diff --git a/app/ante/evm/10_incremenet_sequence_test.go b/app/ante/evm/10_incremenet_sequence_test.go index a6f22e60f8..128d15aeae 100644 --- a/app/ante/evm/10_incremenet_sequence_test.go +++ b/app/ante/evm/10_incremenet_sequence_test.go @@ -5,10 +5,10 @@ package evm_test import ( errortypes "github.com/cosmos/cosmos-sdk/types/errors" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/evmos/evmos/v18/app/ante/evm" - "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + "github.com/evmos/evmos/v19/app/ante/evm" + "github.com/evmos/evmos/v19/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v19/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v19/testutil/integration/evmos/network" ) func (suite *EvmAnteTestSuite) TestIncrementSequence() { diff --git a/app/ante/evm/10_increment_sequence.go b/app/ante/evm/10_increment_sequence.go index 10cc529f6e..70d9f677e7 100644 --- a/app/ante/evm/10_increment_sequence.go +++ b/app/ante/evm/10_increment_sequence.go @@ -10,7 +10,7 @@ import ( errortypes "github.com/cosmos/cosmos-sdk/types/errors" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) // IncrementNonce increments the sequence of the account. diff --git a/app/ante/evm/11_gas_wanted.go b/app/ante/evm/11_gas_wanted.go index be9357fa6f..19e66a9e35 100644 --- a/app/ante/evm/11_gas_wanted.go +++ b/app/ante/evm/11_gas_wanted.go @@ -8,7 +8,7 @@ import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v19/types" ) // GasWantedDecorator keeps track of the gasWanted amount on the current block in transient store diff --git a/app/ante/evm/11_gas_wanted_test.go b/app/ante/evm/11_gas_wanted_test.go index 3d872b7b25..9ed20dd2f9 100644 --- a/app/ante/evm/11_gas_wanted_test.go +++ b/app/ante/evm/11_gas_wanted_test.go @@ -6,11 +6,11 @@ import ( errortypes "github.com/cosmos/cosmos-sdk/types/errors" sdktypes "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/app/ante/evm" - "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + "github.com/evmos/evmos/v19/app/ante/evm" + "github.com/evmos/evmos/v19/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v19/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v19/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v19/testutil/integration/evmos/network" ) func (suite *EvmAnteTestSuite) TestCheckGasWanted() { diff --git a/app/ante/evm/12_emit_event.go b/app/ante/evm/12_emit_event.go index 72aef201ae..63a0c9d7d3 100644 --- a/app/ante/evm/12_emit_event.go +++ b/app/ante/evm/12_emit_event.go @@ -9,7 +9,7 @@ import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) // EthEmitEventDecorator emit events in ante handler in case of tx execution failed (out of block gas limit). diff --git a/app/ante/evm/ante_test.go b/app/ante/evm/ante_test.go index 0ef3b24640..f1a1900c71 100644 --- a/app/ante/evm/ante_test.go +++ b/app/ante/evm/ante_test.go @@ -17,8 +17,8 @@ import ( "github.com/ethereum/go-ethereum/core/types" ethparams "github.com/ethereum/go-ethereum/params" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func (suite *AnteTestSuite) TestAnteHandler() { diff --git a/app/ante/evm/eth_benchmark_test.go b/app/ante/evm/eth_benchmark_test.go index c93c22373a..1c7e46d957 100644 --- a/app/ante/evm/eth_benchmark_test.go +++ b/app/ante/evm/eth_benchmark_test.go @@ -8,11 +8,11 @@ import ( sdkmath "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" ethtypes "github.com/ethereum/go-ethereum/core/types" - ethante "github.com/evmos/evmos/v18/app/ante/evm" - "github.com/evmos/evmos/v18/testutil" - testutiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + ethante "github.com/evmos/evmos/v19/app/ante/evm" + "github.com/evmos/evmos/v19/testutil" + testutiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func BenchmarkEthGasConsumeDecorator(b *testing.B) { diff --git a/app/ante/evm/fee_checker.go b/app/ante/evm/fee_checker.go index 6efb9fcfbf..a5a355f5c5 100644 --- a/app/ante/evm/fee_checker.go +++ b/app/ante/evm/fee_checker.go @@ -12,8 +12,8 @@ import ( errortypes "github.com/cosmos/cosmos-sdk/types/errors" authante "github.com/cosmos/cosmos-sdk/x/auth/ante" "github.com/ethereum/go-ethereum/params" - evmostypes "github.com/evmos/evmos/v18/types" - "github.com/evmos/evmos/v18/x/evm/types" + evmostypes "github.com/evmos/evmos/v19/types" + "github.com/evmos/evmos/v19/x/evm/types" ) // NewDynamicFeeChecker returns a `TxFeeChecker` that applies a dynamic fee to diff --git a/app/ante/evm/fee_checker_test.go b/app/ante/evm/fee_checker_test.go index 17513226be..f047586a6f 100644 --- a/app/ante/evm/fee_checker_test.go +++ b/app/ante/evm/fee_checker_test.go @@ -14,9 +14,9 @@ import ( "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/evmos/v18/encoding" - "github.com/evmos/evmos/v18/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/encoding" + "github.com/evmos/evmos/v19/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) var _ DynamicFeeEVMKeeper = MockEVMKeeper{} diff --git a/app/ante/evm/fee_market_test.go b/app/ante/evm/fee_market_test.go index fa1947394e..e5b33bb6bd 100644 --- a/app/ante/evm/fee_market_test.go +++ b/app/ante/evm/fee_market_test.go @@ -8,12 +8,12 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v18/app/ante/evm" - "github.com/evmos/evmos/v18/testutil" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/types" - "github.com/evmos/evmos/v18/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/app/ante/evm" + "github.com/evmos/evmos/v19/testutil" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/types" + "github.com/evmos/evmos/v19/utils" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func (suite *AnteTestSuite) TestGasWantedDecorator() { diff --git a/app/ante/evm/interfaces.go b/app/ante/evm/interfaces.go index 93f8de99fe..9ca8677311 100644 --- a/app/ante/evm/interfaces.go +++ b/app/ante/evm/interfaces.go @@ -10,11 +10,11 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/params" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/core/vm" - "github.com/evmos/evmos/v18/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" + "github.com/evmos/evmos/v19/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v19/x/feemarket/types" ) // EVMKeeper defines the expected keeper interface used on the AnteHandler diff --git a/app/ante/evm/mono.go b/app/ante/evm/mono.go index ba598d9865..24b8ef740c 100644 --- a/app/ante/evm/mono.go +++ b/app/ante/evm/mono.go @@ -14,9 +14,9 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/params" - anteutils "github.com/evmos/evmos/v18/app/ante/utils" - evmkeeper "github.com/evmos/evmos/v18/x/evm/keeper" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + anteutils "github.com/evmos/evmos/v19/app/ante/utils" + evmkeeper "github.com/evmos/evmos/v19/x/evm/keeper" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) var _ sdk.AnteDecorator = &EthSetupContextDecorator{} diff --git a/app/ante/evm/setup_ctx_test.go b/app/ante/evm/setup_ctx_test.go index 67de0f7d09..e6219f7c7b 100644 --- a/app/ante/evm/setup_ctx_test.go +++ b/app/ante/evm/setup_ctx_test.go @@ -3,13 +3,13 @@ package evm_test import ( "math/big" - evmante "github.com/evmos/evmos/v18/app/ante/evm" - "github.com/evmos/evmos/v18/testutil" + evmante "github.com/evmos/evmos/v19/app/ante/evm" + "github.com/evmos/evmos/v19/testutil" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - testutiltx "github.com/evmos/evmos/v18/testutil/tx" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + testutiltx "github.com/evmos/evmos/v19/testutil/tx" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func (suite *AnteTestSuite) TestEthSetupContextDecorator() { diff --git a/app/ante/evm/setup_test.go b/app/ante/evm/setup_test.go index a2b3ba3d95..87aca0df99 100644 --- a/app/ante/evm/setup_test.go +++ b/app/ante/evm/setup_test.go @@ -16,13 +16,13 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v18/app" - ante "github.com/evmos/evmos/v18/app/ante" - "github.com/evmos/evmos/v18/encoding" - "github.com/evmos/evmos/v18/ethereum/eip712" - "github.com/evmos/evmos/v18/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" + "github.com/evmos/evmos/v19/app" + ante "github.com/evmos/evmos/v19/app/ante" + "github.com/evmos/evmos/v19/encoding" + "github.com/evmos/evmos/v19/ethereum/eip712" + "github.com/evmos/evmos/v19/utils" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v19/x/feemarket/types" ) type AnteTestSuite struct { diff --git a/app/ante/evm/signverify_test.go b/app/ante/evm/signverify_test.go index 9fed5b079a..7267759dc0 100644 --- a/app/ante/evm/signverify_test.go +++ b/app/ante/evm/signverify_test.go @@ -5,10 +5,10 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" ethtypes "github.com/ethereum/go-ethereum/core/types" - ethante "github.com/evmos/evmos/v18/app/ante/evm" - "github.com/evmos/evmos/v18/testutil" - testutiltx "github.com/evmos/evmos/v18/testutil/tx" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + ethante "github.com/evmos/evmos/v19/app/ante/evm" + "github.com/evmos/evmos/v19/testutil" + testutiltx "github.com/evmos/evmos/v19/testutil/tx" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func (suite *AnteTestSuite) TestEthSigVerificationDecorator() { diff --git a/app/ante/evm/sigs_test.go b/app/ante/evm/sigs_test.go index c9875c3bbd..74e45ac465 100644 --- a/app/ante/evm/sigs_test.go +++ b/app/ante/evm/sigs_test.go @@ -3,9 +3,9 @@ package evm_test import ( "math/big" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func (suite *AnteTestSuite) TestSignatures() { diff --git a/app/ante/evm/utils_test.go b/app/ante/evm/utils_test.go index 6eacfd9ec9..83618d53d7 100644 --- a/app/ante/evm/utils_test.go +++ b/app/ante/evm/utils_test.go @@ -13,8 +13,8 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/migrations/legacytx" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v18/ethereum/eip712" - "github.com/evmos/evmos/v18/testutil" + "github.com/evmos/evmos/v19/ethereum/eip712" + "github.com/evmos/evmos/v19/testutil" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" @@ -34,15 +34,15 @@ import ( authz "github.com/cosmos/cosmos-sdk/x/authz" ibctypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" ibcclienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" evtypes "github.com/cosmos/cosmos-sdk/x/evidence/types" "github.com/cosmos/cosmos-sdk/x/feegrant" govtypesv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func (suite *AnteTestSuite) BuildTestEthTx( diff --git a/app/ante/evm_benchmark_test.go b/app/ante/evm_benchmark_test.go index 8aa61b5b07..9624e3e19c 100644 --- a/app/ante/evm_benchmark_test.go +++ b/app/ante/evm_benchmark_test.go @@ -9,17 +9,17 @@ import ( sdktypes "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/app/ante" - ethante "github.com/evmos/evmos/v18/app/ante/evm" - "github.com/evmos/evmos/v18/encoding" - cmmnfactory "github.com/evmos/evmos/v18/testutil/integration/common/factory" - "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - evmostypes "github.com/evmos/evmos/v18/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/app/ante" + ethante "github.com/evmos/evmos/v19/app/ante/evm" + "github.com/evmos/evmos/v19/encoding" + cmmnfactory "github.com/evmos/evmos/v19/testutil/integration/common/factory" + "github.com/evmos/evmos/v19/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v19/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v19/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v19/testutil/integration/evmos/network" + evmostypes "github.com/evmos/evmos/v19/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) type benchmarkSuite struct { diff --git a/app/ante/handler_options.go b/app/ante/handler_options.go index 216ca394c0..ff7f2f6a15 100644 --- a/app/ante/handler_options.go +++ b/app/ante/handler_options.go @@ -14,9 +14,9 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" - evmante "github.com/evmos/evmos/v18/app/ante/evm" - anteutils "github.com/evmos/evmos/v18/app/ante/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + evmante "github.com/evmos/evmos/v19/app/ante/evm" + anteutils "github.com/evmos/evmos/v19/app/ante/utils" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) // HandlerOptions defines the list of module keepers required to run the Evmos diff --git a/app/ante/handler_options_test.go b/app/ante/handler_options_test.go index decc6c224e..428a3f9af3 100644 --- a/app/ante/handler_options_test.go +++ b/app/ante/handler_options_test.go @@ -1,12 +1,12 @@ package ante_test import ( - ethante "github.com/evmos/evmos/v18/app/ante/evm" - "github.com/evmos/evmos/v18/encoding" - "github.com/evmos/evmos/v18/types" + ethante "github.com/evmos/evmos/v19/app/ante/evm" + "github.com/evmos/evmos/v19/encoding" + "github.com/evmos/evmos/v19/types" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/app/ante" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/app/ante" ) func (suite *AnteTestSuite) TestValidateHandlerOptions() { diff --git a/app/ante/integration_test.go b/app/ante/integration_test.go index c514817fe3..3b8f64ae38 100644 --- a/app/ante/integration_test.go +++ b/app/ante/integration_test.go @@ -5,7 +5,7 @@ import ( sdkmath "cosmossdk.io/math" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - testutiltx "github.com/evmos/evmos/v18/testutil/tx" + testutiltx "github.com/evmos/evmos/v19/testutil/tx" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" @@ -13,9 +13,9 @@ import ( . "github.com/onsi/gomega" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" - "github.com/evmos/evmos/v18/testutil" - "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" + "github.com/evmos/evmos/v19/testutil" + "github.com/evmos/evmos/v19/utils" ) var _ = Describe("when sending a Cosmos transaction", func() { diff --git a/app/ante/setup_test.go b/app/ante/setup_test.go index 4da2b888bc..51b1426a1c 100644 --- a/app/ante/setup_test.go +++ b/app/ante/setup_test.go @@ -11,12 +11,12 @@ import ( "github.com/cosmos/cosmos-sdk/client" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" - "github.com/evmos/evmos/v18/encoding" - "github.com/evmos/evmos/v18/testutil" - "github.com/evmos/evmos/v18/utils" - feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" + "github.com/evmos/evmos/v19/encoding" + "github.com/evmos/evmos/v19/testutil" + "github.com/evmos/evmos/v19/utils" + feemarkettypes "github.com/evmos/evmos/v19/x/feemarket/types" "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" ) diff --git a/app/ante/sigverify.go b/app/ante/sigverify.go index 7189c0161a..dc48fa8e12 100644 --- a/app/ante/sigverify.go +++ b/app/ante/sigverify.go @@ -15,7 +15,7 @@ import ( authante "github.com/cosmos/cosmos-sdk/x/auth/ante" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" ) var _ authante.SignatureVerificationGasConsumer = SigVerificationGasConsumer diff --git a/app/ante/sigverify_test.go b/app/ante/sigverify_test.go index ff40594d69..9c5fa34e0b 100644 --- a/app/ante/sigverify_test.go +++ b/app/ante/sigverify_test.go @@ -17,10 +17,10 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/migrations/legacytx" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/app/ante" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" - "github.com/evmos/evmos/v18/encoding" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/app/ante" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" + "github.com/evmos/evmos/v19/encoding" ) func TestConsumeSignatureVerificationGas(t *testing.T) { diff --git a/app/ante/utils/claim_rewards_test.go b/app/ante/utils/claim_rewards_test.go index c463b7eabe..277567f950 100644 --- a/app/ante/utils/claim_rewards_test.go +++ b/app/ante/utils/claim_rewards_test.go @@ -5,10 +5,10 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" - anteutils "github.com/evmos/evmos/v18/app/ante/utils" - "github.com/evmos/evmos/v18/testutil" - testutiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/utils" + anteutils "github.com/evmos/evmos/v19/app/ante/utils" + "github.com/evmos/evmos/v19/testutil" + testutiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/utils" ) // TestClaimStakingRewardsIfNecessary tests the ClaimStakingRewardsIfNecessary function diff --git a/app/ante/utils/setup_test.go b/app/ante/utils/setup_test.go index d0897dbcda..45ac794d73 100644 --- a/app/ante/utils/setup_test.go +++ b/app/ante/utils/setup_test.go @@ -16,14 +16,14 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/app/ante" - "github.com/evmos/evmos/v18/encoding" - "github.com/evmos/evmos/v18/ethereum/eip712" - "github.com/evmos/evmos/v18/testutil" - "github.com/evmos/evmos/v18/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/app/ante" + "github.com/evmos/evmos/v19/encoding" + "github.com/evmos/evmos/v19/ethereum/eip712" + "github.com/evmos/evmos/v19/testutil" + "github.com/evmos/evmos/v19/utils" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v19/x/feemarket/types" ) type AnteTestSuite struct { diff --git a/app/ante/utils_test.go b/app/ante/utils_test.go index bd452ff79a..8461c445ff 100644 --- a/app/ante/utils_test.go +++ b/app/ante/utils_test.go @@ -6,8 +6,8 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/evmos/evmos/v18/app/ante" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + "github.com/evmos/evmos/v19/app/ante" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" ) func generatePubKeysAndSignatures(n int, msg []byte, _ bool) (pubkeys []cryptotypes.PubKey, signatures [][]byte) { diff --git a/app/app.go b/app/app.go index f682644c5e..47cac876bd 100644 --- a/app/app.go +++ b/app/app.go @@ -117,62 +117,62 @@ import ( consensusparamkeeper "github.com/cosmos/cosmos-sdk/x/consensus/keeper" consensusparamtypes "github.com/cosmos/cosmos-sdk/x/consensus/types" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/core/vm" // unnamed import of statik for swagger UI support - _ "github.com/evmos/evmos/v18/client/docs/statik" - "github.com/evmos/evmos/v18/utils" - - "github.com/evmos/evmos/v18/app/ante" - ethante "github.com/evmos/evmos/v18/app/ante/evm" - "github.com/evmos/evmos/v18/app/post" - v17 "github.com/evmos/evmos/v18/app/upgrades/v17" - v18 "github.com/evmos/evmos/v18/app/upgrades/v18" - v19 "github.com/evmos/evmos/v18/app/upgrades/v19" - "github.com/evmos/evmos/v18/encoding" - "github.com/evmos/evmos/v18/ethereum/eip712" - bankprecompile "github.com/evmos/evmos/v18/precompiles/bank" - bech32precompile "github.com/evmos/evmos/v18/precompiles/bech32" - distprecompile "github.com/evmos/evmos/v18/precompiles/distribution" - ics20precompile "github.com/evmos/evmos/v18/precompiles/ics20" - p256precompile "github.com/evmos/evmos/v18/precompiles/p256" - stakingprecompile "github.com/evmos/evmos/v18/precompiles/staking" - vestingprecompile "github.com/evmos/evmos/v18/precompiles/vesting" - srvflags "github.com/evmos/evmos/v18/server/flags" - evmostypes "github.com/evmos/evmos/v18/types" - "github.com/evmos/evmos/v18/x/epochs" - epochskeeper "github.com/evmos/evmos/v18/x/epochs/keeper" - epochstypes "github.com/evmos/evmos/v18/x/epochs/types" - "github.com/evmos/evmos/v18/x/erc20" - erc20client "github.com/evmos/evmos/v18/x/erc20/client" - erc20keeper "github.com/evmos/evmos/v18/x/erc20/keeper" - erc20types "github.com/evmos/evmos/v18/x/erc20/types" - "github.com/evmos/evmos/v18/x/evm" - evmkeeper "github.com/evmos/evmos/v18/x/evm/keeper" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" - "github.com/evmos/evmos/v18/x/feemarket" - feemarketkeeper "github.com/evmos/evmos/v18/x/feemarket/keeper" - feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" - "github.com/evmos/evmos/v18/x/incentives" - inflation "github.com/evmos/evmos/v18/x/inflation/v1" - inflationkeeper "github.com/evmos/evmos/v18/x/inflation/v1/keeper" - inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" - "github.com/evmos/evmos/v18/x/staking" - stakingkeeper "github.com/evmos/evmos/v18/x/staking/keeper" - "github.com/evmos/evmos/v18/x/vesting" - vestingclient "github.com/evmos/evmos/v18/x/vesting/client" - vestingkeeper "github.com/evmos/evmos/v18/x/vesting/keeper" - vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" + _ "github.com/evmos/evmos/v19/client/docs/statik" + "github.com/evmos/evmos/v19/utils" + + "github.com/evmos/evmos/v19/app/ante" + ethante "github.com/evmos/evmos/v19/app/ante/evm" + "github.com/evmos/evmos/v19/app/post" + v17 "github.com/evmos/evmos/v19/app/upgrades/v17" + v18 "github.com/evmos/evmos/v19/app/upgrades/v18" + v19 "github.com/evmos/evmos/v19/app/upgrades/v19" + "github.com/evmos/evmos/v19/encoding" + "github.com/evmos/evmos/v19/ethereum/eip712" + bankprecompile "github.com/evmos/evmos/v19/precompiles/bank" + bech32precompile "github.com/evmos/evmos/v19/precompiles/bech32" + distprecompile "github.com/evmos/evmos/v19/precompiles/distribution" + ics20precompile "github.com/evmos/evmos/v19/precompiles/ics20" + p256precompile "github.com/evmos/evmos/v19/precompiles/p256" + stakingprecompile "github.com/evmos/evmos/v19/precompiles/staking" + vestingprecompile "github.com/evmos/evmos/v19/precompiles/vesting" + srvflags "github.com/evmos/evmos/v19/server/flags" + evmostypes "github.com/evmos/evmos/v19/types" + "github.com/evmos/evmos/v19/x/epochs" + epochskeeper "github.com/evmos/evmos/v19/x/epochs/keeper" + epochstypes "github.com/evmos/evmos/v19/x/epochs/types" + "github.com/evmos/evmos/v19/x/erc20" + erc20client "github.com/evmos/evmos/v19/x/erc20/client" + erc20keeper "github.com/evmos/evmos/v19/x/erc20/keeper" + erc20types "github.com/evmos/evmos/v19/x/erc20/types" + "github.com/evmos/evmos/v19/x/evm" + evmkeeper "github.com/evmos/evmos/v19/x/evm/keeper" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" + "github.com/evmos/evmos/v19/x/feemarket" + feemarketkeeper "github.com/evmos/evmos/v19/x/feemarket/keeper" + feemarkettypes "github.com/evmos/evmos/v19/x/feemarket/types" + "github.com/evmos/evmos/v19/x/incentives" + inflation "github.com/evmos/evmos/v19/x/inflation/v1" + inflationkeeper "github.com/evmos/evmos/v19/x/inflation/v1/keeper" + inflationtypes "github.com/evmos/evmos/v19/x/inflation/v1/types" + "github.com/evmos/evmos/v19/x/staking" + stakingkeeper "github.com/evmos/evmos/v19/x/staking/keeper" + "github.com/evmos/evmos/v19/x/vesting" + vestingclient "github.com/evmos/evmos/v19/x/vesting/client" + vestingkeeper "github.com/evmos/evmos/v19/x/vesting/keeper" + vestingtypes "github.com/evmos/evmos/v19/x/vesting/types" // NOTE: override ICS20 keeper to support IBC transfers of ERC20 tokens - "github.com/evmos/evmos/v18/x/ibc/transfer" - transferkeeper "github.com/evmos/evmos/v18/x/ibc/transfer/keeper" + "github.com/evmos/evmos/v19/x/ibc/transfer" + transferkeeper "github.com/evmos/evmos/v19/x/ibc/transfer/keeper" memiavlstore "github.com/crypto-org-chain/cronos/store" // Force-load the tracer engines to trigger registration due to Go-Ethereum v1.10.15 changes - _ "github.com/evmos/evmos/v18/x/evm/core/tracers/js" - _ "github.com/evmos/evmos/v18/x/evm/core/tracers/native" + _ "github.com/evmos/evmos/v19/x/evm/core/tracers/js" + _ "github.com/evmos/evmos/v19/x/evm/core/tracers/native" ) func init() { diff --git a/app/app_test.go b/app/app_test.go index ebc0222f53..85a46c44c5 100644 --- a/app/app_test.go +++ b/app/app_test.go @@ -21,15 +21,15 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/cosmos/ibc-go/v7/testing/mock" ethcommon "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/encoding" - commontestfactory "github.com/evmos/evmos/v18/testutil/integration/common/factory" - testfactory "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" - testnetwork "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - "github.com/evmos/evmos/v18/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/encoding" + commontestfactory "github.com/evmos/evmos/v19/testutil/integration/common/factory" + testfactory "github.com/evmos/evmos/v19/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v19/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v19/testutil/integration/evmos/keyring" + testnetwork "github.com/evmos/evmos/v19/testutil/integration/evmos/network" + "github.com/evmos/evmos/v19/utils" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" "github.com/stretchr/testify/require" ) diff --git a/app/config.go b/app/config.go index 4812bf30a1..8ebc4caaa9 100644 --- a/app/config.go +++ b/app/config.go @@ -4,9 +4,9 @@ package app import ( - "github.com/evmos/evmos/v18/app/eips" - evmconfig "github.com/evmos/evmos/v18/x/evm/config" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/app/eips" + evmconfig "github.com/evmos/evmos/v19/x/evm/config" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) // The init function of the config file allows to setup the global diff --git a/app/eips/README.md b/app/eips/README.md index fc6ee9118c..e931536817 100644 --- a/app/eips/README.md +++ b/app/eips/README.md @@ -19,7 +19,7 @@ defined with the signature: func(jt *vm.JumpTable) {} ``` -where `vm` is the package `"github.com/evmos/evmos/v18/x/evm/core/vm"`. +where `vm` is the package `"github.com/evmos/evmos/v19/x/evm/core/vm"`. Custom EIPs are used to modify the behavior of opcodes, which are described by the `operation` structure: diff --git a/app/eips/eips.go b/app/eips/eips.go index 64ace1f27a..26931b2615 100644 --- a/app/eips/eips.go +++ b/app/eips/eips.go @@ -4,7 +4,7 @@ package eips import ( - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) var ( diff --git a/app/eips/eips_test.go b/app/eips/eips_test.go index 28741685d7..990a60d008 100644 --- a/app/eips/eips_test.go +++ b/app/eips/eips_test.go @@ -10,14 +10,14 @@ import ( "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/app/eips" - "github.com/evmos/evmos/v18/app/eips/testdata" - "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" - "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/app/eips" + "github.com/evmos/evmos/v19/app/eips/testdata" + "github.com/evmos/evmos/v19/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v19/testutil/integration/evmos/grpc" + "github.com/evmos/evmos/v19/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v19/testutil/integration/evmos/network" + + evmtypes "github.com/evmos/evmos/v19/x/evm/types" "github.com/ethereum/go-ethereum/params" diff --git a/app/eips/testdata/contracts.go b/app/eips/testdata/contracts.go index a67137b218..9009766dc2 100644 --- a/app/eips/testdata/contracts.go +++ b/app/eips/testdata/contracts.go @@ -4,8 +4,8 @@ package testdata import ( - contractutils "github.com/evmos/evmos/v18/contracts/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + contractutils "github.com/evmos/evmos/v19/contracts/utils" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func LoadCounterContract() (evmtypes.CompiledContract, error) { diff --git a/app/ethtest_helper.go b/app/ethtest_helper.go index ed631d5591..90263d85df 100644 --- a/app/ethtest_helper.go +++ b/app/ethtest_helper.go @@ -25,8 +25,8 @@ import ( tmtypes "github.com/cometbft/cometbft/proto/tendermint/types" cmtypes "github.com/cometbft/cometbft/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/encoding" - "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v19/encoding" + "github.com/evmos/evmos/v19/utils" ) // EthDefaultConsensusParams defines the default Tendermint consensus params used in diff --git a/app/export.go b/app/export.go index a45dfa5135..016fe406df 100644 --- a/app/export.go +++ b/app/export.go @@ -17,7 +17,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/staking" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v18/encoding" + "github.com/evmos/evmos/v19/encoding" ) // NewDefaultGenesisState generates the default state for the application. diff --git a/app/keys.go b/app/keys.go index 9a23270f05..59917c9d68 100644 --- a/app/keys.go +++ b/app/keys.go @@ -22,12 +22,12 @@ import ( icahosttypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/host/types" ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" ibcexported "github.com/cosmos/ibc-go/v7/modules/core/exported" - epochstypes "github.com/evmos/evmos/v18/x/epochs/types" - erc20types "github.com/evmos/evmos/v18/x/erc20/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" - inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" - vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" + epochstypes "github.com/evmos/evmos/v19/x/epochs/types" + erc20types "github.com/evmos/evmos/v19/x/erc20/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v19/x/feemarket/types" + inflationtypes "github.com/evmos/evmos/v19/x/inflation/v1/types" + vestingtypes "github.com/evmos/evmos/v19/x/vesting/types" ) // StoreKeys returns the application store keys, diff --git a/app/post/burn.go b/app/post/burn.go index 2a7a9708f8..118b3430ba 100644 --- a/app/post/burn.go +++ b/app/post/burn.go @@ -13,7 +13,7 @@ import ( errortypes "github.com/cosmos/cosmos-sdk/types/errors" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) var _ sdk.PostDecorator = &BurnDecorator{} diff --git a/app/post/burn_test.go b/app/post/burn_test.go index 51b7cf9bbb..db8dd73428 100644 --- a/app/post/burn_test.go +++ b/app/post/burn_test.go @@ -6,9 +6,9 @@ package post_test import ( sdkmath "cosmossdk.io/math" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/evmos/evmos/v18/app/post" + "github.com/evmos/evmos/v19/app/post" - // "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" + // "github.com/evmos/evmos/v19/testutil/integration/evmos/factory" sdk "github.com/cosmos/cosmos-sdk/types" ) diff --git a/app/post/post_test.go b/app/post/post_test.go index 313a599f16..acc9267283 100644 --- a/app/post/post_test.go +++ b/app/post/post_test.go @@ -6,7 +6,7 @@ package post_test import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - "github.com/evmos/evmos/v18/app/post" + "github.com/evmos/evmos/v19/app/post" ) func (s *PostTestSuite) TestPostHandlerOptions() { diff --git a/app/post/setup_test.go b/app/post/setup_test.go index 8c49764687..05dfafd8b0 100644 --- a/app/post/setup_test.go +++ b/app/post/setup_test.go @@ -14,11 +14,11 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" - inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" + "github.com/evmos/evmos/v19/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v19/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v19/testutil/integration/evmos/network" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" + inflationtypes "github.com/evmos/evmos/v19/x/inflation/v1/types" "github.com/cosmos/cosmos-sdk/client" "github.com/stretchr/testify/suite" diff --git a/app/test_helpers.go b/app/test_helpers.go index 26dbbecd0b..ce935a06e3 100644 --- a/app/test_helpers.go +++ b/app/test_helpers.go @@ -27,11 +27,11 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v18/encoding" - feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" + "github.com/evmos/evmos/v19/encoding" + feemarkettypes "github.com/evmos/evmos/v19/x/feemarket/types" - "github.com/evmos/evmos/v18/cmd/config" - "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v19/cmd/config" + "github.com/evmos/evmos/v19/utils" ) // DefaultTestingAppInit defines the IBC application used for testing diff --git a/app/upgrades/v16/incentives.go b/app/upgrades/v16/incentives.go index c8fcfc8fe4..bc739b21aa 100644 --- a/app/upgrades/v16/incentives.go +++ b/app/upgrades/v16/incentives.go @@ -8,7 +8,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - inflationkeeper "github.com/evmos/evmos/v18/x/inflation/v1/keeper" + inflationkeeper "github.com/evmos/evmos/v19/x/inflation/v1/keeper" ) // BurnUsageIncentivesPool burns the entirety of the usage incentives pool diff --git a/app/upgrades/v16/proposals.go b/app/upgrades/v16/proposals.go index 17a1cda382..344d4b32af 100644 --- a/app/upgrades/v16/proposals.go +++ b/app/upgrades/v16/proposals.go @@ -9,7 +9,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1" - incentives "github.com/evmos/evmos/v18/x/incentives/types" + incentives "github.com/evmos/evmos/v19/x/incentives/types" ) // DeleteIncentivesProposals deletes the RegisterIncentives & CancelIncentiveProposal proposals from the store diff --git a/app/upgrades/v16/setup_test.go b/app/upgrades/v16/setup_test.go index 0c3310077a..8dc641da68 100644 --- a/app/upgrades/v16/setup_test.go +++ b/app/upgrades/v16/setup_test.go @@ -11,11 +11,11 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/stretchr/testify/suite" - "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" - "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" + "github.com/evmos/evmos/v19/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v19/testutil/integration/evmos/grpc" + "github.com/evmos/evmos/v19/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v19/testutil/integration/evmos/network" + inflationtypes "github.com/evmos/evmos/v19/x/inflation/v1/types" ) type IntegrationTestSuite struct { diff --git a/app/upgrades/v16/upgrades.go b/app/upgrades/v16/upgrades.go index cfffba7467..d383a3e8d6 100644 --- a/app/upgrades/v16/upgrades.go +++ b/app/upgrades/v16/upgrades.go @@ -9,11 +9,11 @@ import ( bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - "github.com/evmos/evmos/v18/precompiles/bech32" - "github.com/evmos/evmos/v18/precompiles/p256" - "github.com/evmos/evmos/v18/utils" - evmkeeper "github.com/evmos/evmos/v18/x/evm/keeper" - inflationkeeper "github.com/evmos/evmos/v18/x/inflation/v1/keeper" + "github.com/evmos/evmos/v19/precompiles/bech32" + "github.com/evmos/evmos/v19/precompiles/p256" + "github.com/evmos/evmos/v19/utils" + evmkeeper "github.com/evmos/evmos/v19/x/evm/keeper" + inflationkeeper "github.com/evmos/evmos/v19/x/inflation/v1/keeper" ) // CreateUpgradeHandler creates an SDK upgrade handler for v16.0.0 diff --git a/app/upgrades/v16/upgrades_test.go b/app/upgrades/v16/upgrades_test.go index 3445a20048..c0f974db29 100644 --- a/app/upgrades/v16/upgrades_test.go +++ b/app/upgrades/v16/upgrades_test.go @@ -13,13 +13,13 @@ import ( govtypesv1beta "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" upgrade "github.com/cosmos/cosmos-sdk/x/upgrade/types" - v16 "github.com/evmos/evmos/v18/app/upgrades/v16" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" - "github.com/evmos/evmos/v18/testutil" - testnetwork "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/utils" - incentives "github.com/evmos/evmos/v18/x/incentives/types" + v16 "github.com/evmos/evmos/v19/app/upgrades/v16" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" + "github.com/evmos/evmos/v19/testutil" + testnetwork "github.com/evmos/evmos/v19/testutil/integration/evmos/network" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/utils" + incentives "github.com/evmos/evmos/v19/x/incentives/types" ) func (its *IntegrationTestSuite) TestFeeCollectorMigration() { diff --git a/app/upgrades/v19/convert.go b/app/upgrades/v19/convert.go index 60ce560c0c..d43c8d4954 100644 --- a/app/upgrades/v19/convert.go +++ b/app/upgrades/v19/convert.go @@ -15,11 +15,11 @@ import ( bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - fixes "github.com/evmos/evmos/v18/app/upgrades/v19/fixes" - evmostypes "github.com/evmos/evmos/v18/types" - erc20keeper "github.com/evmos/evmos/v18/x/erc20/keeper" - erc20types "github.com/evmos/evmos/v18/x/erc20/types" - evmkeeper "github.com/evmos/evmos/v18/x/evm/keeper" + fixes "github.com/evmos/evmos/v19/app/upgrades/v19/fixes" + evmostypes "github.com/evmos/evmos/v19/types" + erc20keeper "github.com/evmos/evmos/v19/x/erc20/keeper" + erc20types "github.com/evmos/evmos/v19/x/erc20/types" + evmkeeper "github.com/evmos/evmos/v19/x/evm/keeper" ) // storeKey contains the slot in which the balance is stored in the evm. diff --git a/app/upgrades/v19/upgrades.go b/app/upgrades/v19/upgrades.go index 85911f84e5..4f7f859787 100644 --- a/app/upgrades/v19/upgrades.go +++ b/app/upgrades/v19/upgrades.go @@ -16,13 +16,13 @@ import ( upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" "github.com/ethereum/go-ethereum/common" - evmostypes "github.com/evmos/evmos/v18/types" - "github.com/evmos/evmos/v18/utils" - erc20keeper "github.com/evmos/evmos/v18/x/erc20/keeper" - erc20types "github.com/evmos/evmos/v18/x/erc20/types" - evmkeeper "github.com/evmos/evmos/v18/x/evm/keeper" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" - stakingkeeper "github.com/evmos/evmos/v18/x/staking/keeper" + evmostypes "github.com/evmos/evmos/v19/types" + "github.com/evmos/evmos/v19/utils" + erc20keeper "github.com/evmos/evmos/v19/x/erc20/keeper" + erc20types "github.com/evmos/evmos/v19/x/erc20/types" + evmkeeper "github.com/evmos/evmos/v19/x/evm/keeper" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" + stakingkeeper "github.com/evmos/evmos/v19/x/staking/keeper" ) const ( diff --git a/app/upgrades/v19/upgrades_test.go b/app/upgrades/v19/upgrades_test.go index a97051426a..604332f83e 100644 --- a/app/upgrades/v19/upgrades_test.go +++ b/app/upgrades/v19/upgrades_test.go @@ -8,12 +8,12 @@ import ( "github.com/ethereum/go-ethereum/crypto" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/evmos/evmos/v18/app/upgrades/v19" - testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" - testnetwork "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - evmostypes "github.com/evmos/evmos/v18/types" - "github.com/evmos/evmos/v18/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/app/upgrades/v19" + testkeyring "github.com/evmos/evmos/v19/testutil/integration/evmos/keyring" + testnetwork "github.com/evmos/evmos/v19/testutil/integration/evmos/network" + evmostypes "github.com/evmos/evmos/v19/types" + "github.com/evmos/evmos/v19/utils" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" "github.com/stretchr/testify/require" ) diff --git a/app/upgrades/v19/utils.go b/app/upgrades/v19/utils.go index 91b9d26d8e..c032c7eea8 100644 --- a/app/upgrades/v19/utils.go +++ b/app/upgrades/v19/utils.go @@ -9,7 +9,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" "github.com/ethereum/go-ethereum/common" - evmostypes "github.com/evmos/evmos/v18/types" + evmostypes "github.com/evmos/evmos/v19/types" ) var ignoredAddresses = []string{ diff --git a/client/config.go b/client/config.go index c73cd70d47..5c9f963560 100644 --- a/client/config.go +++ b/client/config.go @@ -14,7 +14,7 @@ import ( "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v19/types" ) // InitConfig adds the chain-id, encoding and output flags to the persistent flag set. diff --git a/client/debug/debug.go b/client/debug/debug.go index 8d5ede684b..1a836f2461 100644 --- a/client/debug/debug.go +++ b/client/debug/debug.go @@ -9,8 +9,8 @@ import ( "strconv" "strings" - "github.com/evmos/evmos/v18/ethereum/eip712" - evmos "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v19/ethereum/eip712" + evmos "github.com/evmos/evmos/v19/types" "github.com/pkg/errors" "github.com/spf13/cobra" diff --git a/client/export.go b/client/export.go index dd14f6a826..9ba3889908 100644 --- a/client/export.go +++ b/client/export.go @@ -15,8 +15,8 @@ import ( "github.com/spf13/cobra" "github.com/cosmos/cosmos-sdk/crypto/keyring" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" - "github.com/evmos/evmos/v18/crypto/hd" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" + "github.com/evmos/evmos/v19/crypto/hd" ) // UnsafeExportEthKeyCommand exports a key with the given name as a private key in hex format. diff --git a/client/import.go b/client/import.go index e2b1e16566..5d5d76e8b9 100644 --- a/client/import.go +++ b/client/import.go @@ -11,9 +11,9 @@ import ( "github.com/cosmos/cosmos-sdk/client/input" "github.com/cosmos/cosmos-sdk/crypto" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" - "github.com/evmos/evmos/v18/crypto/hd" + "github.com/evmos/evmos/v19/crypto/hd" ) // UnsafeImportKeyCommand imports private keys from a keyfile. diff --git a/client/keys.go b/client/keys.go index 6450721435..12ac8b51c1 100644 --- a/client/keys.go +++ b/client/keys.go @@ -12,8 +12,8 @@ import ( "github.com/spf13/cobra" "github.com/cosmos/cosmos-sdk/crypto/keyring" - clientkeys "github.com/evmos/evmos/v18/client/keys" - "github.com/evmos/evmos/v18/crypto/hd" + clientkeys "github.com/evmos/evmos/v19/client/keys" + "github.com/evmos/evmos/v19/crypto/hd" ) // KeyCommands registers a sub-tree of commands to interact with diff --git a/client/keys/add.go b/client/keys/add.go index fb8a0f166e..93e2d01cc9 100644 --- a/client/keys/add.go +++ b/client/keys/add.go @@ -10,7 +10,7 @@ import ( "fmt" "sort" - cryptohd "github.com/evmos/evmos/v18/crypto/hd" + cryptohd "github.com/evmos/evmos/v19/crypto/hd" bip39 "github.com/cosmos/go-bip39" "github.com/spf13/cobra" diff --git a/client/testnet.go b/client/testnet.go index 6504df609f..ea71b1420f 100644 --- a/client/testnet.go +++ b/client/testnet.go @@ -38,13 +38,13 @@ import ( mintypes "github.com/cosmos/cosmos-sdk/x/mint/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v18/crypto/hd" - "github.com/evmos/evmos/v18/server/config" - srvflags "github.com/evmos/evmos/v18/server/flags" - evmostypes "github.com/evmos/evmos/v18/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/crypto/hd" + "github.com/evmos/evmos/v19/server/config" + srvflags "github.com/evmos/evmos/v19/server/flags" + evmostypes "github.com/evmos/evmos/v19/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" - "github.com/evmos/evmos/v18/testutil/network" + "github.com/evmos/evmos/v19/testutil/network" ) var ( diff --git a/cmd/config/config.go b/cmd/config/config.go index f7be8c59a7..5e88e26d76 100644 --- a/cmd/config/config.go +++ b/cmd/config/config.go @@ -7,7 +7,7 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v19/types" ) const ( diff --git a/cmd/evmosd/cmd_test.go b/cmd/evmosd/cmd_test.go index 5953636889..9f3440824f 100644 --- a/cmd/evmosd/cmd_test.go +++ b/cmd/evmosd/cmd_test.go @@ -9,9 +9,9 @@ import ( "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" "github.com/stretchr/testify/require" - "github.com/evmos/evmos/v18/app" - evmosd "github.com/evmos/evmos/v18/cmd/evmosd" - "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v19/app" + evmosd "github.com/evmos/evmos/v19/cmd/evmosd" + "github.com/evmos/evmos/v19/utils" ) func TestInitCmd(t *testing.T) { diff --git a/cmd/evmosd/genaccounts.go b/cmd/evmosd/genaccounts.go index e6dea10174..8fc7c4ce1d 100644 --- a/cmd/evmosd/genaccounts.go +++ b/cmd/evmosd/genaccounts.go @@ -22,10 +22,10 @@ import ( "github.com/cosmos/cosmos-sdk/x/genutil" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" - evmoskr "github.com/evmos/evmos/v18/crypto/keyring" + evmoskr "github.com/evmos/evmos/v19/crypto/keyring" - vestingcli "github.com/evmos/evmos/v18/x/vesting/client/cli" - vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" + vestingcli "github.com/evmos/evmos/v19/x/vesting/client/cli" + vestingtypes "github.com/evmos/evmos/v19/x/vesting/types" ) const ( diff --git a/cmd/evmosd/main.go b/cmd/evmosd/main.go index 439c1770f8..2996095e3f 100644 --- a/cmd/evmosd/main.go +++ b/cmd/evmosd/main.go @@ -10,8 +10,8 @@ import ( svrcmd "github.com/cosmos/cosmos-sdk/server/cmd" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/app" - cmdcfg "github.com/evmos/evmos/v18/cmd/config" + "github.com/evmos/evmos/v19/app" + cmdcfg "github.com/evmos/evmos/v19/cmd/config" ) func main() { diff --git a/cmd/evmosd/migrate.go b/cmd/evmosd/migrate.go index fe377f5114..7a2e150b82 100644 --- a/cmd/evmosd/migrate.go +++ b/cmd/evmosd/migrate.go @@ -19,7 +19,7 @@ import ( "github.com/cosmos/cosmos-sdk/version" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" - "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v19/utils" ) // FlagGenesisTime defines the genesis time in string format diff --git a/cmd/evmosd/root.go b/cmd/evmosd/root.go index 0eb5b4ae21..56bb66096d 100644 --- a/cmd/evmosd/root.go +++ b/cmd/evmosd/root.go @@ -41,18 +41,18 @@ import ( genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" - evmosclient "github.com/evmos/evmos/v18/client" - "github.com/evmos/evmos/v18/client/block" - "github.com/evmos/evmos/v18/client/debug" - "github.com/evmos/evmos/v18/encoding" - "github.com/evmos/evmos/v18/ethereum/eip712" - evmosserver "github.com/evmos/evmos/v18/server" - servercfg "github.com/evmos/evmos/v18/server/config" - srvflags "github.com/evmos/evmos/v18/server/flags" - - "github.com/evmos/evmos/v18/app" - cmdcfg "github.com/evmos/evmos/v18/cmd/config" - evmoskr "github.com/evmos/evmos/v18/crypto/keyring" + evmosclient "github.com/evmos/evmos/v19/client" + "github.com/evmos/evmos/v19/client/block" + "github.com/evmos/evmos/v19/client/debug" + "github.com/evmos/evmos/v19/encoding" + "github.com/evmos/evmos/v19/ethereum/eip712" + evmosserver "github.com/evmos/evmos/v19/server" + servercfg "github.com/evmos/evmos/v19/server/config" + srvflags "github.com/evmos/evmos/v19/server/flags" + + "github.com/evmos/evmos/v19/app" + cmdcfg "github.com/evmos/evmos/v19/cmd/config" + evmoskr "github.com/evmos/evmos/v19/crypto/keyring" ) const ( diff --git a/cmd/evmosd/testnet.go b/cmd/evmosd/testnet.go index 3257c1cf3d..85af1af0b1 100644 --- a/cmd/evmosd/testnet.go +++ b/cmd/evmosd/testnet.go @@ -41,15 +41,15 @@ import ( govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - cmdcfg "github.com/evmos/evmos/v18/cmd/config" - "github.com/evmos/evmos/v18/crypto/hd" - evmoskr "github.com/evmos/evmos/v18/crypto/keyring" - "github.com/evmos/evmos/v18/server/config" - srvflags "github.com/evmos/evmos/v18/server/flags" - "github.com/evmos/evmos/v18/testutil/network" - evmostypes "github.com/evmos/evmos/v18/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" + cmdcfg "github.com/evmos/evmos/v19/cmd/config" + "github.com/evmos/evmos/v19/crypto/hd" + evmoskr "github.com/evmos/evmos/v19/crypto/keyring" + "github.com/evmos/evmos/v19/server/config" + srvflags "github.com/evmos/evmos/v19/server/flags" + "github.com/evmos/evmos/v19/testutil/network" + evmostypes "github.com/evmos/evmos/v19/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v19/x/feemarket/types" ) var ( diff --git a/cmd/evmosd/versiondb.go b/cmd/evmosd/versiondb.go index 5cd206286d..44bbdb9da5 100644 --- a/cmd/evmosd/versiondb.go +++ b/cmd/evmosd/versiondb.go @@ -13,8 +13,8 @@ import ( "github.com/spf13/cobra" versiondbclient "github.com/crypto-org-chain/cronos/versiondb/client" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/cmd/evmosd/opendb" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/cmd/evmosd/opendb" ) // ChangeSetCmd returns a Cobra command for interacting with change sets. diff --git a/contracts/erc20.go b/contracts/erc20.go index 8b25d3fc0c..017dfc8336 100644 --- a/contracts/erc20.go +++ b/contracts/erc20.go @@ -6,8 +6,8 @@ package contracts import ( _ "embed" - contractutils "github.com/evmos/evmos/v18/contracts/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + contractutils "github.com/evmos/evmos/v19/contracts/utils" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) var ( diff --git a/contracts/utils/utils.go b/contracts/utils/utils.go index b1ac938bfc..cfd68f6ded 100644 --- a/contracts/utils/utils.go +++ b/contracts/utils/utils.go @@ -10,7 +10,7 @@ import ( "path/filepath" "runtime" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) // LoadContractFromJSONFile is a helper method to convert the embedded bytes from a JSON file, diff --git a/contracts/wevmos.go b/contracts/wevmos.go index a7da5911c8..374c83c2f9 100644 --- a/contracts/wevmos.go +++ b/contracts/wevmos.go @@ -7,7 +7,7 @@ import ( _ "embed" // embed compiled smart contract "encoding/json" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) var ( diff --git a/crypto/codec/amino.go b/crypto/codec/amino.go index a1f3c7be21..636f328deb 100644 --- a/crypto/codec/amino.go +++ b/crypto/codec/amino.go @@ -8,7 +8,7 @@ import ( cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" "github.com/cosmos/cosmos-sdk/crypto/keyring" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" ) // RegisterCrypto registers all crypto dependency types with the provided Amino diff --git a/crypto/codec/codec.go b/crypto/codec/codec.go index 8846562242..ec9c92c63e 100644 --- a/crypto/codec/codec.go +++ b/crypto/codec/codec.go @@ -6,7 +6,7 @@ import ( codectypes "github.com/cosmos/cosmos-sdk/codec/types" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" ) // RegisterInterfaces register the Evmos key concrete types. diff --git a/crypto/ethsecp256k1/ethsecp256k1.go b/crypto/ethsecp256k1/ethsecp256k1.go index 17a3104444..1374512b76 100644 --- a/crypto/ethsecp256k1/ethsecp256k1.go +++ b/crypto/ethsecp256k1/ethsecp256k1.go @@ -15,7 +15,7 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v18/ethereum/eip712" + "github.com/evmos/evmos/v19/ethereum/eip712" ) const ( diff --git a/crypto/hd/algorithm.go b/crypto/hd/algorithm.go index e5f6faf549..49d1e2dc8d 100644 --- a/crypto/hd/algorithm.go +++ b/crypto/hd/algorithm.go @@ -14,7 +14,7 @@ import ( "github.com/cosmos/cosmos-sdk/crypto/keyring" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" ) const ( diff --git a/crypto/hd/algorithm_test.go b/crypto/hd/algorithm_test.go index 723453de1d..276512e166 100644 --- a/crypto/hd/algorithm_test.go +++ b/crypto/hd/algorithm_test.go @@ -13,9 +13,9 @@ import ( "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/crypto/keyring" - cryptocodec "github.com/evmos/evmos/v18/crypto/codec" - enccodec "github.com/evmos/evmos/v18/encoding/codec" - evmostypes "github.com/evmos/evmos/v18/types" + cryptocodec "github.com/evmos/evmos/v19/crypto/codec" + enccodec "github.com/evmos/evmos/v19/encoding/codec" + evmostypes "github.com/evmos/evmos/v19/types" ) var TestCodec amino.Codec diff --git a/crypto/hd/benchmark_test.go b/crypto/hd/benchmark_test.go index ef9b37ecf4..bfdd95a64f 100644 --- a/crypto/hd/benchmark_test.go +++ b/crypto/hd/benchmark_test.go @@ -4,7 +4,7 @@ import ( "testing" "github.com/cosmos/cosmos-sdk/crypto/keyring" - "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v19/types" ) func BenchmarkEthSecp256k1Algo_Derive(b *testing.B) { diff --git a/crypto/keyring/options.go b/crypto/keyring/options.go index 1644bd61a5..7c9857641a 100644 --- a/crypto/keyring/options.go +++ b/crypto/keyring/options.go @@ -8,9 +8,9 @@ import ( cosmosLedger "github.com/cosmos/cosmos-sdk/crypto/ledger" "github.com/cosmos/cosmos-sdk/crypto/types" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" - "github.com/evmos/evmos/v18/crypto/hd" - "github.com/evmos/evmos/v18/wallets/ledger" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" + "github.com/evmos/evmos/v19/crypto/hd" + "github.com/evmos/evmos/v19/wallets/ledger" ) // AppName defines the Ledger app used for signing. Evmos uses the Ethereum app diff --git a/encoding/codec/codec.go b/encoding/codec/codec.go index c455277ad0..8d3eaa53cd 100644 --- a/encoding/codec/codec.go +++ b/encoding/codec/codec.go @@ -8,8 +8,8 @@ import ( "github.com/cosmos/cosmos-sdk/std" sdk "github.com/cosmos/cosmos-sdk/types" - cryptocodec "github.com/evmos/evmos/v18/crypto/codec" - "github.com/evmos/evmos/v18/types" + cryptocodec "github.com/evmos/evmos/v19/crypto/codec" + "github.com/evmos/evmos/v19/types" ) // RegisterLegacyAminoCodec registers Interfaces from types, crypto, and SDK std. diff --git a/encoding/config.go b/encoding/config.go index 3551c23318..66600b854f 100644 --- a/encoding/config.go +++ b/encoding/config.go @@ -9,7 +9,7 @@ import ( "github.com/cosmos/cosmos-sdk/types/module" "github.com/cosmos/cosmos-sdk/x/auth/tx" - enccodec "github.com/evmos/evmos/v18/encoding/codec" + enccodec "github.com/evmos/evmos/v19/encoding/codec" ) // MakeConfig creates an EncodingConfig for testing diff --git a/encoding/config_test.go b/encoding/config_test.go index 78067b5725..e096d6452a 100644 --- a/encoding/config_test.go +++ b/encoding/config_test.go @@ -8,10 +8,10 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/encoding" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/encoding" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func TestTxEncoding(t *testing.T) { diff --git a/ethereum/eip712/eip712_fuzzer_test.go b/ethereum/eip712/eip712_fuzzer_test.go index dae4eac648..e70699185d 100644 --- a/ethereum/eip712/eip712_fuzzer_test.go +++ b/ethereum/eip712/eip712_fuzzer_test.go @@ -6,7 +6,7 @@ import ( rand "github.com/cometbft/cometbft/libs/rand" - "github.com/evmos/evmos/v18/ethereum/eip712" + "github.com/evmos/evmos/v19/ethereum/eip712" "github.com/tidwall/gjson" "github.com/tidwall/sjson" ) diff --git a/ethereum/eip712/eip712_test.go b/ethereum/eip712/eip712_test.go index 88474ffc8b..c1221be9e4 100644 --- a/ethereum/eip712/eip712_test.go +++ b/ethereum/eip712/eip712_test.go @@ -11,22 +11,22 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/signer/core/apitypes" - "github.com/evmos/evmos/v18/ethereum/eip712" + "github.com/evmos/evmos/v19/ethereum/eip712" "github.com/tidwall/gjson" "github.com/tidwall/sjson" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" 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/evmos/v18/app" - "github.com/evmos/evmos/v18/cmd/config" - "github.com/evmos/evmos/v18/encoding" - "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/cmd/config" + "github.com/evmos/evmos/v19/encoding" + "github.com/evmos/evmos/v19/utils" distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types" govtypesv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" diff --git a/ethereum/eip712/encoding.go b/ethereum/eip712/encoding.go index 09721bbc2a..1d614f44d9 100644 --- a/ethereum/eip712/encoding.go +++ b/ethereum/eip712/encoding.go @@ -13,7 +13,7 @@ import ( txTypes "github.com/cosmos/cosmos-sdk/types/tx" apitypes "github.com/ethereum/go-ethereum/signer/core/apitypes" - evmostypes "github.com/evmos/evmos/v18/types" + evmostypes "github.com/evmos/evmos/v19/types" "github.com/cosmos/cosmos-sdk/codec" ) diff --git a/ethereum/eip712/encoding_legacy.go b/ethereum/eip712/encoding_legacy.go index b7973ad377..42423c2175 100644 --- a/ethereum/eip712/encoding_legacy.go +++ b/ethereum/eip712/encoding_legacy.go @@ -13,7 +13,7 @@ import ( txTypes "github.com/cosmos/cosmos-sdk/types/tx" apitypes "github.com/ethereum/go-ethereum/signer/core/apitypes" - evmos "github.com/evmos/evmos/v18/types" + evmos "github.com/evmos/evmos/v19/types" ) type aminoMessage struct { diff --git a/ethereum/eip712/preprocess.go b/ethereum/eip712/preprocess.go index 3f9f71e359..598952cbb7 100644 --- a/ethereum/eip712/preprocess.go +++ b/ethereum/eip712/preprocess.go @@ -10,7 +10,7 @@ import ( cosmoskr "github.com/cosmos/cosmos-sdk/crypto/keyring" "github.com/cosmos/cosmos-sdk/types/tx/signing" authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" - "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v19/types" ) // PreprocessLedgerTx reformats Ledger-signed Cosmos transactions to match the fork expected by Ethermint diff --git a/ethereum/eip712/preprocess_test.go b/ethereum/eip712/preprocess_test.go index 930d05b531..886e9da21d 100644 --- a/ethereum/eip712/preprocess_test.go +++ b/ethereum/eip712/preprocess_test.go @@ -14,13 +14,13 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/ante" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/cmd/config" - "github.com/evmos/evmos/v18/encoding" - "github.com/evmos/evmos/v18/ethereum/eip712" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/types" - "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/cmd/config" + "github.com/evmos/evmos/v19/encoding" + "github.com/evmos/evmos/v19/ethereum/eip712" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/types" + "github.com/evmos/evmos/v19/utils" "github.com/stretchr/testify/require" ) diff --git a/go.mod b/go.mod index 699f7bd3f5..da14e56ff6 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/evmos/evmos/v18 +module github.com/evmos/evmos/v19 go 1.22.2 diff --git a/ibc/testing/app.go b/ibc/testing/app.go index 24a8bd6795..59d3a4fa93 100644 --- a/ibc/testing/app.go +++ b/ibc/testing/app.go @@ -23,9 +23,9 @@ import ( ibcgotesting "github.com/cosmos/ibc-go/v7/testing" - evmosapp "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/types" - "github.com/evmos/evmos/v18/utils" + evmosapp "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/types" + "github.com/evmos/evmos/v19/utils" ) // DefaultTestingAppInit is a test helper function used to initialize an App diff --git a/ibc/testing/chain.go b/ibc/testing/chain.go index 0e6d6e2f36..9beecf414d 100644 --- a/ibc/testing/chain.go +++ b/ibc/testing/chain.go @@ -19,9 +19,9 @@ import ( ibcgotesting "github.com/cosmos/ibc-go/v7/testing" "github.com/cosmos/ibc-go/v7/testing/mock" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" - evmostypes "github.com/evmos/evmos/v18/types" - "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" + evmostypes "github.com/evmos/evmos/v19/types" + "github.com/evmos/evmos/v19/utils" ) // ChainIDPrefix defines the default chain ID prefix for Evmos test chains diff --git a/ibc/testing/coordinator.go b/ibc/testing/coordinator.go index 767eeaaa45..f559870afd 100644 --- a/ibc/testing/coordinator.go +++ b/ibc/testing/coordinator.go @@ -14,7 +14,7 @@ import ( simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" sdk "github.com/cosmos/cosmos-sdk/types" ibctesting "github.com/cosmos/ibc-go/v7/testing" - "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v19/app" "github.com/stretchr/testify/require" ) diff --git a/ibc/utils.go b/ibc/utils.go index d00f91cd7e..56564a70bc 100644 --- a/ibc/utils.go +++ b/ibc/utils.go @@ -13,9 +13,9 @@ import ( transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" - transferkeeper "github.com/evmos/evmos/v18/x/ibc/transfer/keeper" + transferkeeper "github.com/evmos/evmos/v19/x/ibc/transfer/keeper" - "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v19/utils" ) // GetTransferSenderRecipient returns the sender and recipient sdk.AccAddresses diff --git a/ibc/utils_test.go b/ibc/utils_test.go index c02d79666e..4776ac2af6 100644 --- a/ibc/utils_test.go +++ b/ibc/utils_test.go @@ -11,7 +11,7 @@ import ( transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" ibctesting "github.com/cosmos/ibc-go/v7/testing" - teststypes "github.com/evmos/evmos/v18/types/tests" + teststypes "github.com/evmos/evmos/v19/types/tests" ) func init() { diff --git a/indexer/kv_indexer.go b/indexer/kv_indexer.go index 33033d60f7..346c1537a5 100644 --- a/indexer/kv_indexer.go +++ b/indexer/kv_indexer.go @@ -15,9 +15,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authante "github.com/cosmos/cosmos-sdk/x/auth/ante" "github.com/ethereum/go-ethereum/common" - rpctypes "github.com/evmos/evmos/v18/rpc/types" - evmostypes "github.com/evmos/evmos/v18/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + rpctypes "github.com/evmos/evmos/v19/rpc/types" + evmostypes "github.com/evmos/evmos/v19/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) const ( diff --git a/indexer/kv_indexer_test.go b/indexer/kv_indexer_test.go index cc568a61b3..348df758c4 100644 --- a/indexer/kv_indexer_test.go +++ b/indexer/kv_indexer_test.go @@ -12,13 +12,13 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" - evmenc "github.com/evmos/evmos/v18/encoding" - "github.com/evmos/evmos/v18/indexer" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/utils" - "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" + evmenc "github.com/evmos/evmos/v19/encoding" + "github.com/evmos/evmos/v19/indexer" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/utils" + "github.com/evmos/evmos/v19/x/evm/types" "github.com/stretchr/testify/require" ) diff --git a/precompiles/authorization/events.go b/precompiles/authorization/events.go index fbef44038c..6876b94250 100644 --- a/precompiles/authorization/events.go +++ b/precompiles/authorization/events.go @@ -11,8 +11,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/x/evm/core/vm" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) const ( diff --git a/precompiles/authorization/types.go b/precompiles/authorization/types.go index ff9f6f27d8..8890a95ea0 100644 --- a/precompiles/authorization/types.go +++ b/precompiles/authorization/types.go @@ -16,7 +16,7 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - cmn "github.com/evmos/evmos/v18/precompiles/common" + cmn "github.com/evmos/evmos/v19/precompiles/common" ) const ( diff --git a/precompiles/authorization/types_test.go b/precompiles/authorization/types_test.go index c9cec375b9..5401fcb0a4 100644 --- a/precompiles/authorization/types_test.go +++ b/precompiles/authorization/types_test.go @@ -5,12 +5,12 @@ import ( "testing" "cosmossdk.io/math" - "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v19/utils" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/precompiles/authorization" - cmn "github.com/evmos/evmos/v18/precompiles/common" - testutiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v19/precompiles/authorization" + cmn "github.com/evmos/evmos/v19/precompiles/common" + testutiltx "github.com/evmos/evmos/v19/testutil/tx" "github.com/stretchr/testify/require" ) diff --git a/precompiles/bank/bank.go b/precompiles/bank/bank.go index d6acf9dc4b..430644b88a 100644 --- a/precompiles/bank/bank.go +++ b/precompiles/bank/bank.go @@ -10,9 +10,9 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" "github.com/ethereum/go-ethereum/common" - cmn "github.com/evmos/evmos/v18/precompiles/common" - erc20keeper "github.com/evmos/evmos/v18/x/erc20/keeper" - "github.com/evmos/evmos/v18/x/evm/core/vm" + cmn "github.com/evmos/evmos/v19/precompiles/common" + erc20keeper "github.com/evmos/evmos/v19/x/erc20/keeper" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) const ( diff --git a/precompiles/bank/integration_test.go b/precompiles/bank/integration_test.go index 85c286ca37..13fd70ef01 100644 --- a/precompiles/bank/integration_test.go +++ b/precompiles/bank/integration_test.go @@ -4,24 +4,24 @@ import ( "math/big" "testing" - "github.com/evmos/evmos/v18/precompiles/bank/testdata" + "github.com/evmos/evmos/v19/precompiles/bank/testdata" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" - "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - integrationutils "github.com/evmos/evmos/v18/testutil/integration/evmos/utils" - "github.com/evmos/evmos/v18/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" - inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" + "github.com/evmos/evmos/v19/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v19/testutil/integration/evmos/grpc" + "github.com/evmos/evmos/v19/testutil/integration/evmos/network" + integrationutils "github.com/evmos/evmos/v19/testutil/integration/evmos/utils" + "github.com/evmos/evmos/v19/utils" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" + inflationtypes "github.com/evmos/evmos/v19/x/inflation/v1/types" - evmosutiltx "github.com/evmos/evmos/v18/testutil/tx" + evmosutiltx "github.com/evmos/evmos/v19/testutil/tx" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/precompiles/bank" + "github.com/evmos/evmos/v19/precompiles/bank" - "github.com/evmos/evmos/v18/precompiles/testutil" - "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v19/precompiles/testutil" + "github.com/evmos/evmos/v19/testutil/integration/evmos/keyring" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" diff --git a/precompiles/bank/query.go b/precompiles/bank/query.go index 916a97f3d7..f34d8fb825 100644 --- a/precompiles/bank/query.go +++ b/precompiles/bank/query.go @@ -8,7 +8,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) const ( diff --git a/precompiles/bank/query_test.go b/precompiles/bank/query_test.go index 66b461f379..eac61c9854 100644 --- a/precompiles/bank/query_test.go +++ b/precompiles/bank/query_test.go @@ -4,8 +4,8 @@ import ( "math/big" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/precompiles/bank" - evmosutiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v19/precompiles/bank" + evmosutiltx "github.com/evmos/evmos/v19/testutil/tx" ) func (s *PrecompileTestSuite) TestBalances() { diff --git a/precompiles/bank/setup_test.go b/precompiles/bank/setup_test.go index 2af0b12b67..6cf47d234e 100644 --- a/precompiles/bank/setup_test.go +++ b/precompiles/bank/setup_test.go @@ -5,15 +5,15 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" - inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" + inflationtypes "github.com/evmos/evmos/v19/x/inflation/v1/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/precompiles/bank" - "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - integrationutils "github.com/evmos/evmos/v18/testutil/integration/evmos/utils" + "github.com/evmos/evmos/v19/precompiles/bank" + "github.com/evmos/evmos/v19/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v19/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v19/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v19/testutil/integration/evmos/network" + integrationutils "github.com/evmos/evmos/v19/testutil/integration/evmos/utils" "github.com/stretchr/testify/suite" ) diff --git a/precompiles/bank/testdata/bank.go b/precompiles/bank/testdata/bank.go index 794664d6c7..03f89685fe 100644 --- a/precompiles/bank/testdata/bank.go +++ b/precompiles/bank/testdata/bank.go @@ -4,8 +4,8 @@ package testdata import ( - contractutils "github.com/evmos/evmos/v18/contracts/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + contractutils "github.com/evmos/evmos/v19/contracts/utils" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func LoadBankCallerContract() (evmtypes.CompiledContract, error) { diff --git a/precompiles/bank/types.go b/precompiles/bank/types.go index caa959df32..636b492b15 100644 --- a/precompiles/bank/types.go +++ b/precompiles/bank/types.go @@ -9,7 +9,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - cmn "github.com/evmos/evmos/v18/precompiles/common" + cmn "github.com/evmos/evmos/v19/precompiles/common" ) // Balance contains the amount for a corresponding ERC-20 contract address diff --git a/precompiles/bank/utils_test.go b/precompiles/bank/utils_test.go index b794c083d7..d86c12d0ba 100644 --- a/precompiles/bank/utils_test.go +++ b/precompiles/bank/utils_test.go @@ -6,10 +6,10 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/precompiles/bank" - "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" - inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" + "github.com/evmos/evmos/v19/precompiles/bank" + "github.com/evmos/evmos/v19/testutil/integration/evmos/factory" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" + inflationtypes "github.com/evmos/evmos/v19/x/inflation/v1/types" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/gomega" diff --git a/precompiles/bech32/bech32.go b/precompiles/bech32/bech32.go index 37563608e1..2086d539b7 100644 --- a/precompiles/bech32/bech32.go +++ b/precompiles/bech32/bech32.go @@ -9,8 +9,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/x/evm/core/vm" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) var _ vm.PrecompiledContract = &Precompile{} diff --git a/precompiles/bech32/bech32_test.go b/precompiles/bech32/bech32_test.go index 06764752eb..2c6d357969 100644 --- a/precompiles/bech32/bech32_test.go +++ b/precompiles/bech32/bech32_test.go @@ -5,9 +5,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/cmd/config" - "github.com/evmos/evmos/v18/precompiles/bech32" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/cmd/config" + "github.com/evmos/evmos/v19/precompiles/bech32" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) func (s *PrecompileTestSuite) TestNewPrecompile() { diff --git a/precompiles/bech32/methods.go b/precompiles/bech32/methods.go index 61fdb20a0d..809ae58b37 100644 --- a/precompiles/bech32/methods.go +++ b/precompiles/bech32/methods.go @@ -10,7 +10,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - cmn "github.com/evmos/evmos/v18/precompiles/common" + cmn "github.com/evmos/evmos/v19/precompiles/common" ) const ( diff --git a/precompiles/bech32/methods_test.go b/precompiles/bech32/methods_test.go index 0a6fc083bf..bd06bb1a39 100644 --- a/precompiles/bech32/methods_test.go +++ b/precompiles/bech32/methods_test.go @@ -5,9 +5,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/cmd/config" - "github.com/evmos/evmos/v18/precompiles/bech32" - cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v19/cmd/config" + "github.com/evmos/evmos/v19/precompiles/bech32" + cmn "github.com/evmos/evmos/v19/precompiles/common" ) func (s *PrecompileTestSuite) TestHexToBech32() { diff --git a/precompiles/bech32/setup_test.go b/precompiles/bech32/setup_test.go index 7ffcbdb859..a01b0c74c1 100644 --- a/precompiles/bech32/setup_test.go +++ b/precompiles/bech32/setup_test.go @@ -3,10 +3,10 @@ package bech32_test import ( "testing" - "github.com/evmos/evmos/v18/precompiles/bech32" + "github.com/evmos/evmos/v19/precompiles/bech32" - testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + testkeyring "github.com/evmos/evmos/v19/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v19/testutil/integration/evmos/network" "github.com/stretchr/testify/suite" ) diff --git a/precompiles/common/abi.go b/precompiles/common/abi.go index 3b4c716b37..8ad70937fe 100644 --- a/precompiles/common/abi.go +++ b/precompiles/common/abi.go @@ -14,7 +14,7 @@ import ( "github.com/ethereum/go-ethereum/common/math" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - contractutils "github.com/evmos/evmos/v18/contracts/utils" + contractutils "github.com/evmos/evmos/v19/contracts/utils" ) // MakeTopic converts a filter query argument into a filter topic. diff --git a/precompiles/common/events.go b/precompiles/common/events.go index c943de1a22..af8b1e4232 100644 --- a/precompiles/common/events.go +++ b/precompiles/common/events.go @@ -7,7 +7,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) // EmitEventArgs are the arguments required to emit an authorization event. diff --git a/precompiles/common/precompile.go b/precompiles/common/precompile.go index e830ae85f1..b18392f764 100644 --- a/precompiles/common/precompile.go +++ b/precompiles/common/precompile.go @@ -12,8 +12,8 @@ import ( authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/x/evm/core/vm" - "github.com/evmos/evmos/v18/x/evm/statedb" + "github.com/evmos/evmos/v19/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/statedb" ) // Precompile is a common struct for all precompiles that holds the common data each diff --git a/precompiles/common/types.go b/precompiles/common/types.go index 3a5a01cc4b..c99e2c93cd 100644 --- a/precompiles/common/types.go +++ b/precompiles/common/types.go @@ -11,7 +11,7 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - evmosutils "github.com/evmos/evmos/v18/utils" + evmosutils "github.com/evmos/evmos/v19/utils" ) var ( diff --git a/precompiles/common/types_test.go b/precompiles/common/types_test.go index 1407994697..bb70f11550 100644 --- a/precompiles/common/types_test.go +++ b/precompiles/common/types_test.go @@ -5,8 +5,8 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/utils" "github.com/stretchr/testify/require" ) diff --git a/precompiles/distribution/distribution.go b/precompiles/distribution/distribution.go index 9543cc5140..7fc7482084 100644 --- a/precompiles/distribution/distribution.go +++ b/precompiles/distribution/distribution.go @@ -11,9 +11,9 @@ import ( authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" distributionkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" "github.com/ethereum/go-ethereum/common" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/x/evm/core/vm" - stakingkeeper "github.com/evmos/evmos/v18/x/staking/keeper" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/x/evm/core/vm" + stakingkeeper "github.com/evmos/evmos/v19/x/staking/keeper" ) // PrecompileAddress of the distribution EVM extension in hex format. diff --git a/precompiles/distribution/distribution_test.go b/precompiles/distribution/distribution_test.go index efc3b2eb6b..67884f1410 100644 --- a/precompiles/distribution/distribution_test.go +++ b/precompiles/distribution/distribution_test.go @@ -8,11 +8,11 @@ import ( "github.com/cosmos/cosmos-sdk/x/distribution/types" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/precompiles/distribution" - "github.com/evmos/evmos/v18/utils" - "github.com/evmos/evmos/v18/x/evm/core/vm" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/precompiles/distribution" + "github.com/evmos/evmos/v19/utils" + "github.com/evmos/evmos/v19/x/evm/core/vm" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func (s *PrecompileTestSuite) TestIsTransaction() { diff --git a/precompiles/distribution/events.go b/precompiles/distribution/events.go index db6681010e..8b70b544a1 100644 --- a/precompiles/distribution/events.go +++ b/precompiles/distribution/events.go @@ -11,8 +11,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/x/evm/core/vm" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) const ( diff --git a/precompiles/distribution/events_test.go b/precompiles/distribution/events_test.go index 7dbb51fb02..49d9c7046d 100644 --- a/precompiles/distribution/events_test.go +++ b/precompiles/distribution/events_test.go @@ -8,11 +8,11 @@ import ( "github.com/cosmos/cosmos-sdk/x/distribution/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v18/cmd/config" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/precompiles/distribution" - "github.com/evmos/evmos/v18/utils" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/cmd/config" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/precompiles/distribution" + "github.com/evmos/evmos/v19/utils" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) func (s *PrecompileTestSuite) TestSetWithdrawAddressEvent() { diff --git a/precompiles/distribution/integration_test.go b/precompiles/distribution/integration_test.go index c3e637fea5..75f151b629 100644 --- a/precompiles/distribution/integration_test.go +++ b/precompiles/distribution/integration_test.go @@ -13,15 +13,15 @@ import ( distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/common" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/precompiles/distribution" - "github.com/evmos/evmos/v18/precompiles/testutil" - "github.com/evmos/evmos/v18/precompiles/testutil/contracts" - evmosutil "github.com/evmos/evmos/v18/testutil" - testutiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/utils" - "github.com/evmos/evmos/v18/x/evm/core/vm" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/precompiles/distribution" + "github.com/evmos/evmos/v19/precompiles/testutil" + "github.com/evmos/evmos/v19/precompiles/testutil/contracts" + evmosutil "github.com/evmos/evmos/v19/testutil" + testutiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/utils" + "github.com/evmos/evmos/v19/x/evm/core/vm" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" diff --git a/precompiles/distribution/query.go b/precompiles/distribution/query.go index 734a076b39..5299989a0e 100644 --- a/precompiles/distribution/query.go +++ b/precompiles/distribution/query.go @@ -7,8 +7,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" distributionkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" "github.com/ethereum/go-ethereum/accounts/abi" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/x/evm/core/vm" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) const ( diff --git a/precompiles/distribution/query_test.go b/precompiles/distribution/query_test.go index bec9fc1b4a..394c1ac6b7 100644 --- a/precompiles/distribution/query_test.go +++ b/precompiles/distribution/query_test.go @@ -10,13 +10,13 @@ import ( "github.com/cosmos/cosmos-sdk/types/query" "github.com/cosmos/cosmos-sdk/x/distribution/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/core/vm" - "github.com/evmos/evmos/v18/testutil" - testutiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v19/testutil" + testutiltx "github.com/evmos/evmos/v19/testutil/tx" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/precompiles/distribution" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/precompiles/distribution" ) var ( diff --git a/precompiles/distribution/setup_test.go b/precompiles/distribution/setup_test.go index 54cff3a8b5..2d891d43f4 100644 --- a/precompiles/distribution/setup_test.go +++ b/precompiles/distribution/setup_test.go @@ -3,8 +3,8 @@ package distribution_test import ( "testing" - "github.com/evmos/evmos/v18/precompiles/distribution" - "github.com/evmos/evmos/v18/x/evm/statedb" + "github.com/evmos/evmos/v19/precompiles/distribution" + "github.com/evmos/evmos/v19/x/evm/statedb" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" @@ -18,8 +18,8 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - evmosapp "github.com/evmos/evmos/v18/app" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + evmosapp "github.com/evmos/evmos/v19/app" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" "github.com/stretchr/testify/suite" ) diff --git a/precompiles/distribution/tx.go b/precompiles/distribution/tx.go index 9cb6b7542d..8fa3b297b7 100644 --- a/precompiles/distribution/tx.go +++ b/precompiles/distribution/tx.go @@ -6,16 +6,16 @@ package distribution import ( "fmt" - "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v19/utils" - cmn "github.com/evmos/evmos/v18/precompiles/common" + cmn "github.com/evmos/evmos/v19/precompiles/common" "github.com/ethereum/go-ethereum/common" sdk "github.com/cosmos/cosmos-sdk/types" distributionkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) const ( diff --git a/precompiles/distribution/tx_test.go b/precompiles/distribution/tx_test.go index 9a5b059df9..f6e1afc76b 100644 --- a/precompiles/distribution/tx_test.go +++ b/precompiles/distribution/tx_test.go @@ -5,17 +5,17 @@ import ( "math/big" "cosmossdk.io/math" - "github.com/evmos/evmos/v18/precompiles/testutil" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/precompiles/testutil" + "github.com/evmos/evmos/v19/x/evm/core/vm" "github.com/ethereum/go-ethereum/common" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/distribution/types" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/precompiles/distribution" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/utils" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/precompiles/distribution" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/utils" ) func (s *PrecompileTestSuite) TestSetWithdrawAddress() { diff --git a/precompiles/distribution/types.go b/precompiles/distribution/types.go index fdbd846e21..6e8fd16f66 100644 --- a/precompiles/distribution/types.go +++ b/precompiles/distribution/types.go @@ -7,7 +7,7 @@ import ( "fmt" "math/big" - "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v19/utils" "cosmossdk.io/math" @@ -16,8 +16,8 @@ import ( distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/cmd/config" - cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v19/cmd/config" + cmn "github.com/evmos/evmos/v19/precompiles/common" ) // EventSetWithdrawAddress defines the event data for the SetWithdrawAddress transaction. diff --git a/precompiles/distribution/utils_test.go b/precompiles/distribution/utils_test.go index 06bc1b2a97..b115978120 100644 --- a/precompiles/distribution/utils_test.go +++ b/precompiles/distribution/utils_test.go @@ -20,16 +20,16 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - evmosapp "github.com/evmos/evmos/v18/app" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/precompiles/distribution" - evmosutil "github.com/evmos/evmos/v18/testutil" - evmosutiltx "github.com/evmos/evmos/v18/testutil/tx" - evmostypes "github.com/evmos/evmos/v18/types" - "github.com/evmos/evmos/v18/utils" - "github.com/evmos/evmos/v18/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" - inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" + evmosapp "github.com/evmos/evmos/v19/app" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/precompiles/distribution" + evmosutil "github.com/evmos/evmos/v19/testutil" + evmosutiltx "github.com/evmos/evmos/v19/testutil/tx" + evmostypes "github.com/evmos/evmos/v19/types" + "github.com/evmos/evmos/v19/utils" + "github.com/evmos/evmos/v19/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" + inflationtypes "github.com/evmos/evmos/v19/x/inflation/v1/types" ) // SetupWithGenesisValSet initializes a new EvmosApp with a validator set and genesis accounts diff --git a/precompiles/erc20/approve.go b/precompiles/erc20/approve.go index 1932cfe5e6..d74b233641 100644 --- a/precompiles/erc20/approve.go +++ b/precompiles/erc20/approve.go @@ -17,9 +17,9 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - auth "github.com/evmos/evmos/v18/precompiles/authorization" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/x/evm/core/vm" + auth "github.com/evmos/evmos/v19/precompiles/authorization" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) // Approve sets the given amount as the allowance of the spender address over diff --git a/precompiles/erc20/approve_test.go b/precompiles/erc20/approve_test.go index d345a576d1..b75593f77b 100644 --- a/precompiles/erc20/approve_test.go +++ b/precompiles/erc20/approve_test.go @@ -9,11 +9,11 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/precompiles/authorization" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/precompiles/erc20" - "github.com/evmos/evmos/v18/precompiles/testutil" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/precompiles/authorization" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/precompiles/erc20" + "github.com/evmos/evmos/v19/precompiles/testutil" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) //nolint:dupl // tests are not duplicate between the functions diff --git a/precompiles/erc20/erc20.go b/precompiles/erc20/erc20.go index 36f9d6f6b6..b378097ab4 100644 --- a/precompiles/erc20/erc20.go +++ b/precompiles/erc20/erc20.go @@ -7,18 +7,18 @@ import ( "embed" "fmt" - cmn "github.com/evmos/evmos/v18/precompiles/common" + cmn "github.com/evmos/evmos/v19/precompiles/common" "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/core/vm" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - auth "github.com/evmos/evmos/v18/precompiles/authorization" - erc20types "github.com/evmos/evmos/v18/x/erc20/types" - transferkeeper "github.com/evmos/evmos/v18/x/ibc/transfer/keeper" + auth "github.com/evmos/evmos/v19/precompiles/authorization" + erc20types "github.com/evmos/evmos/v19/x/erc20/types" + transferkeeper "github.com/evmos/evmos/v19/x/ibc/transfer/keeper" ) const ( diff --git a/precompiles/erc20/erc20_test.go b/precompiles/erc20/erc20_test.go index 908f536057..54396dbeb6 100644 --- a/precompiles/erc20/erc20_test.go +++ b/precompiles/erc20/erc20_test.go @@ -6,8 +6,8 @@ package erc20_test import ( "math/big" - auth "github.com/evmos/evmos/v18/precompiles/authorization" - "github.com/evmos/evmos/v18/precompiles/erc20" + auth "github.com/evmos/evmos/v19/precompiles/authorization" + "github.com/evmos/evmos/v19/precompiles/erc20" ) func (s *PrecompileTestSuite) TestIsTransaction() { diff --git a/precompiles/erc20/errors.go b/precompiles/erc20/errors.go index bdc20eb3c3..66fb7ffb5d 100644 --- a/precompiles/erc20/errors.go +++ b/precompiles/erc20/errors.go @@ -10,10 +10,10 @@ import ( "github.com/cosmos/cosmos-sdk/x/authz" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v18/ibc" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/x/evm/core/vm" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/ibc" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/x/evm/core/vm" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) // Errors that have formatted information are defined here as a string. diff --git a/precompiles/erc20/errors_test.go b/precompiles/erc20/errors_test.go index 431bb8f31b..14218e46f2 100644 --- a/precompiles/erc20/errors_test.go +++ b/precompiles/erc20/errors_test.go @@ -1,8 +1,8 @@ package erc20_test import ( - "github.com/evmos/evmos/v18/precompiles/erc20" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/precompiles/erc20" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) // TODO: This is not yet producing the correct reason bytes so we skip this test for now, diff --git a/precompiles/erc20/events.go b/precompiles/erc20/events.go index 40e70cb9ed..0be677ade7 100644 --- a/precompiles/erc20/events.go +++ b/precompiles/erc20/events.go @@ -11,10 +11,10 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/core/vm" - auth "github.com/evmos/evmos/v18/precompiles/authorization" - cmn "github.com/evmos/evmos/v18/precompiles/common" + auth "github.com/evmos/evmos/v19/precompiles/authorization" + cmn "github.com/evmos/evmos/v19/precompiles/common" ) const ( diff --git a/precompiles/erc20/events_test.go b/precompiles/erc20/events_test.go index ca66cf80f7..8a6fe6b740 100644 --- a/precompiles/erc20/events_test.go +++ b/precompiles/erc20/events_test.go @@ -5,10 +5,10 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v18/precompiles/authorization" - cmn "github.com/evmos/evmos/v18/precompiles/common" - erc20precompile "github.com/evmos/evmos/v18/precompiles/erc20" - utiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v19/precompiles/authorization" + cmn "github.com/evmos/evmos/v19/precompiles/common" + erc20precompile "github.com/evmos/evmos/v19/precompiles/erc20" + utiltx "github.com/evmos/evmos/v19/testutil/tx" ) //nolint:dupl // this is not a duplicate of the approval events test diff --git a/precompiles/erc20/integration_test.go b/precompiles/erc20/integration_test.go index 32a1c6885c..a382027c4a 100644 --- a/precompiles/erc20/integration_test.go +++ b/precompiles/erc20/integration_test.go @@ -10,21 +10,21 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/contracts" - auth "github.com/evmos/evmos/v18/precompiles/authorization" - "github.com/evmos/evmos/v18/precompiles/erc20" - "github.com/evmos/evmos/v18/precompiles/erc20/testdata" - "github.com/evmos/evmos/v18/precompiles/testutil" - contractutils "github.com/evmos/evmos/v18/precompiles/testutil/contracts" - "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" - "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - "github.com/evmos/evmos/v18/testutil/integration/evmos/utils" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - erc20types "github.com/evmos/evmos/v18/x/erc20/types" - "github.com/evmos/evmos/v18/x/evm/core/vm" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/contracts" + auth "github.com/evmos/evmos/v19/precompiles/authorization" + "github.com/evmos/evmos/v19/precompiles/erc20" + "github.com/evmos/evmos/v19/precompiles/erc20/testdata" + "github.com/evmos/evmos/v19/precompiles/testutil" + contractutils "github.com/evmos/evmos/v19/precompiles/testutil/contracts" + "github.com/evmos/evmos/v19/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v19/testutil/integration/evmos/grpc" + "github.com/evmos/evmos/v19/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v19/testutil/integration/evmos/network" + "github.com/evmos/evmos/v19/testutil/integration/evmos/utils" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + erc20types "github.com/evmos/evmos/v19/x/erc20/types" + "github.com/evmos/evmos/v19/x/evm/core/vm" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" diff --git a/precompiles/erc20/query.go b/precompiles/erc20/query.go index 84dd0da3f2..b3055fcac7 100644 --- a/precompiles/erc20/query.go +++ b/precompiles/erc20/query.go @@ -15,12 +15,12 @@ import ( "github.com/cosmos/cosmos-sdk/x/authz" authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/evmos/evmos/v18/ibc" - auth "github.com/evmos/evmos/v18/precompiles/authorization" + "github.com/evmos/evmos/v19/ibc" + auth "github.com/evmos/evmos/v19/precompiles/authorization" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) const ( diff --git a/precompiles/erc20/query_test.go b/precompiles/erc20/query_test.go index 4db43523bc..264fd694d9 100644 --- a/precompiles/erc20/query_test.go +++ b/precompiles/erc20/query_test.go @@ -12,12 +12,12 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/app" - auth "github.com/evmos/evmos/v18/precompiles/authorization" - "github.com/evmos/evmos/v18/precompiles/erc20" - "github.com/evmos/evmos/v18/testutil" - "github.com/evmos/evmos/v18/x/evm/core/vm" - inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" + "github.com/evmos/evmos/v19/app" + auth "github.com/evmos/evmos/v19/precompiles/authorization" + "github.com/evmos/evmos/v19/precompiles/erc20" + "github.com/evmos/evmos/v19/testutil" + "github.com/evmos/evmos/v19/x/evm/core/vm" + inflationtypes "github.com/evmos/evmos/v19/x/inflation/v1/types" ) // Define useful variables for tests here. diff --git a/precompiles/erc20/setup_test.go b/precompiles/erc20/setup_test.go index da83a01240..aa9924317a 100644 --- a/precompiles/erc20/setup_test.go +++ b/precompiles/erc20/setup_test.go @@ -3,11 +3,11 @@ package erc20_test import ( "testing" - erc20precompile "github.com/evmos/evmos/v18/precompiles/erc20" - "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + erc20precompile "github.com/evmos/evmos/v19/precompiles/erc20" + "github.com/evmos/evmos/v19/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v19/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v19/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v19/testutil/integration/evmos/network" "github.com/stretchr/testify/suite" ) diff --git a/precompiles/erc20/testdata/erc20_allowance_caller.go b/precompiles/erc20/testdata/erc20_allowance_caller.go index a0281283cc..46a47ca7d3 100644 --- a/precompiles/erc20/testdata/erc20_allowance_caller.go +++ b/precompiles/erc20/testdata/erc20_allowance_caller.go @@ -4,8 +4,8 @@ package testdata import ( - contractutils "github.com/evmos/evmos/v18/contracts/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + contractutils "github.com/evmos/evmos/v19/contracts/utils" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func LoadERC20AllowanceCaller() (evmtypes.CompiledContract, error) { diff --git a/precompiles/erc20/testdata/erc20_no_metadata.go b/precompiles/erc20/testdata/erc20_no_metadata.go index 0307a1c03f..5b5b7c0d06 100644 --- a/precompiles/erc20/testdata/erc20_no_metadata.go +++ b/precompiles/erc20/testdata/erc20_no_metadata.go @@ -4,8 +4,8 @@ package testdata import ( - contractutils "github.com/evmos/evmos/v18/contracts/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + contractutils "github.com/evmos/evmos/v19/contracts/utils" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func LoadERC20NoMetadataContract() (evmtypes.CompiledContract, error) { diff --git a/precompiles/erc20/testdata/erc20_test_caller.go b/precompiles/erc20/testdata/erc20_test_caller.go index 0984c461b3..58bc5b0178 100644 --- a/precompiles/erc20/testdata/erc20_test_caller.go +++ b/precompiles/erc20/testdata/erc20_test_caller.go @@ -4,8 +4,8 @@ package testdata import ( - contractutils "github.com/evmos/evmos/v18/contracts/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + contractutils "github.com/evmos/evmos/v19/contracts/utils" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func LoadERC20TestCaller() (evmtypes.CompiledContract, error) { diff --git a/precompiles/erc20/testdata/erc20minter_openzeppelinv5.go b/precompiles/erc20/testdata/erc20minter_openzeppelinv5.go index 1905642e05..e3604dbe72 100644 --- a/precompiles/erc20/testdata/erc20minter_openzeppelinv5.go +++ b/precompiles/erc20/testdata/erc20minter_openzeppelinv5.go @@ -4,8 +4,8 @@ package testdata import ( - contractutils "github.com/evmos/evmos/v18/contracts/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + contractutils "github.com/evmos/evmos/v19/contracts/utils" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func LoadERC20MinterV5Contract() (evmtypes.CompiledContract, error) { diff --git a/precompiles/erc20/tx.go b/precompiles/erc20/tx.go index 68f9b9d69f..a4f69840d9 100644 --- a/precompiles/erc20/tx.go +++ b/precompiles/erc20/tx.go @@ -13,9 +13,9 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/utils" - "github.com/evmos/evmos/v18/x/evm/core/vm" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/utils" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) const ( diff --git a/precompiles/erc20/tx_test.go b/precompiles/erc20/tx_test.go index 523557e74b..673292f0bc 100644 --- a/precompiles/erc20/tx_test.go +++ b/precompiles/erc20/tx_test.go @@ -7,11 +7,11 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/evmos/evmos/v18/precompiles/erc20" - "github.com/evmos/evmos/v18/precompiles/testutil" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - erc20types "github.com/evmos/evmos/v18/x/erc20/types" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/precompiles/erc20" + "github.com/evmos/evmos/v19/precompiles/testutil" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + erc20types "github.com/evmos/evmos/v19/x/erc20/types" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) var ( diff --git a/precompiles/erc20/types_test.go b/precompiles/erc20/types_test.go index fb698f6b76..92a63a5849 100644 --- a/precompiles/erc20/types_test.go +++ b/precompiles/erc20/types_test.go @@ -3,8 +3,8 @@ package erc20_test import ( "math/big" - "github.com/evmos/evmos/v18/precompiles/erc20" - utiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v19/precompiles/erc20" + utiltx "github.com/evmos/evmos/v19/testutil/tx" ) //nolint:dupl // these tests are not duplicates diff --git a/precompiles/erc20/utils_test.go b/precompiles/erc20/utils_test.go index e65e87f051..d662f1eb92 100644 --- a/precompiles/erc20/utils_test.go +++ b/precompiles/erc20/utils_test.go @@ -13,16 +13,16 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - auth "github.com/evmos/evmos/v18/precompiles/authorization" - "github.com/evmos/evmos/v18/precompiles/erc20" - "github.com/evmos/evmos/v18/precompiles/testutil" - commonfactory "github.com/evmos/evmos/v18/testutil/integration/common/factory" - commonnetwork "github.com/evmos/evmos/v18/testutil/integration/common/network" - "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" - network "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - erc20types "github.com/evmos/evmos/v18/x/erc20/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + auth "github.com/evmos/evmos/v19/precompiles/authorization" + "github.com/evmos/evmos/v19/precompiles/erc20" + "github.com/evmos/evmos/v19/precompiles/testutil" + commonfactory "github.com/evmos/evmos/v19/testutil/integration/common/factory" + commonnetwork "github.com/evmos/evmos/v19/testutil/integration/common/network" + "github.com/evmos/evmos/v19/testutil/integration/evmos/factory" + network "github.com/evmos/evmos/v19/testutil/integration/evmos/network" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + erc20types "github.com/evmos/evmos/v19/x/erc20/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" //nolint:revive // dot imports are fine for Gomega . "github.com/onsi/gomega" diff --git a/precompiles/ics20/approve.go b/precompiles/ics20/approve.go index ae82ea2d9c..4f5e115b71 100644 --- a/precompiles/ics20/approve.go +++ b/precompiles/ics20/approve.go @@ -7,8 +7,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/precompiles/authorization" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/precompiles/authorization" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) // Approve implements the ICS20 approve transactions. diff --git a/precompiles/ics20/approve_common.go b/precompiles/ics20/approve_common.go index 1f7ed9716c..35489f609a 100644 --- a/precompiles/ics20/approve_common.go +++ b/precompiles/ics20/approve_common.go @@ -9,7 +9,7 @@ import ( "math/big" "time" - "github.com/evmos/evmos/v18/precompiles/authorization" + "github.com/evmos/evmos/v19/precompiles/authorization" errorsmod "cosmossdk.io/errors" "cosmossdk.io/math" @@ -22,8 +22,8 @@ import ( channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/x/evm/core/vm" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) // TransferMsgURL is the ICS20 transfer message URL string. diff --git a/precompiles/ics20/approve_test.go b/precompiles/ics20/approve_test.go index ba261191df..2a1f93b234 100644 --- a/precompiles/ics20/approve_test.go +++ b/precompiles/ics20/approve_test.go @@ -10,10 +10,10 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" - "github.com/evmos/evmos/v18/precompiles/authorization" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/precompiles/ics20" - "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v19/precompiles/authorization" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/precompiles/ics20" + "github.com/evmos/evmos/v19/utils" ) type allowanceTestCase struct { diff --git a/precompiles/ics20/events.go b/precompiles/ics20/events.go index 1fd0163d02..cb135f02a9 100644 --- a/precompiles/ics20/events.go +++ b/precompiles/ics20/events.go @@ -8,8 +8,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/x/evm/core/vm" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) const ( diff --git a/precompiles/ics20/events_test.go b/precompiles/ics20/events_test.go index f8af1ffcc4..63f289e734 100644 --- a/precompiles/ics20/events_test.go +++ b/precompiles/ics20/events_test.go @@ -6,11 +6,11 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v18/precompiles/authorization" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/precompiles/ics20" - "github.com/evmos/evmos/v18/utils" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/precompiles/authorization" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/precompiles/ics20" + "github.com/evmos/evmos/v19/utils" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) func (s *PrecompileTestSuite) TestTransferEvent() { diff --git a/precompiles/ics20/ics20.go b/precompiles/ics20/ics20.go index cc68941dfe..b5a5f670c7 100644 --- a/precompiles/ics20/ics20.go +++ b/precompiles/ics20/ics20.go @@ -11,11 +11,11 @@ import ( authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" channelkeeper "github.com/cosmos/ibc-go/v7/modules/core/04-channel/keeper" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/precompiles/authorization" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/x/evm/core/vm" - transferkeeper "github.com/evmos/evmos/v18/x/ibc/transfer/keeper" - stakingkeeper "github.com/evmos/evmos/v18/x/staking/keeper" + "github.com/evmos/evmos/v19/precompiles/authorization" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/x/evm/core/vm" + transferkeeper "github.com/evmos/evmos/v19/x/ibc/transfer/keeper" + stakingkeeper "github.com/evmos/evmos/v19/x/staking/keeper" ) // PrecompileAddress of the ICS-20 EVM extension in hex format. diff --git a/precompiles/ics20/integration_test.go b/precompiles/ics20/integration_test.go index d756cbbd82..0aa24e087c 100644 --- a/precompiles/ics20/integration_test.go +++ b/precompiles/ics20/integration_test.go @@ -14,21 +14,21 @@ import ( channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" ibctesting "github.com/cosmos/ibc-go/v7/testing" "github.com/ethereum/go-ethereum/common" - evmoscontracts "github.com/evmos/evmos/v18/contracts" - evmostesting "github.com/evmos/evmos/v18/ibc/testing" - "github.com/evmos/evmos/v18/precompiles/authorization" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/precompiles/erc20" - "github.com/evmos/evmos/v18/precompiles/ics20" - "github.com/evmos/evmos/v18/precompiles/testutil" - "github.com/evmos/evmos/v18/precompiles/testutil/contracts" - evmosutil "github.com/evmos/evmos/v18/testutil" - teststypes "github.com/evmos/evmos/v18/types/tests" - "github.com/evmos/evmos/v18/utils" - erc20types "github.com/evmos/evmos/v18/x/erc20/types" - "github.com/evmos/evmos/v18/x/evm/core/vm" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" - inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" + evmoscontracts "github.com/evmos/evmos/v19/contracts" + evmostesting "github.com/evmos/evmos/v19/ibc/testing" + "github.com/evmos/evmos/v19/precompiles/authorization" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/precompiles/erc20" + "github.com/evmos/evmos/v19/precompiles/ics20" + "github.com/evmos/evmos/v19/precompiles/testutil" + "github.com/evmos/evmos/v19/precompiles/testutil/contracts" + evmosutil "github.com/evmos/evmos/v19/testutil" + teststypes "github.com/evmos/evmos/v19/types/tests" + "github.com/evmos/evmos/v19/utils" + erc20types "github.com/evmos/evmos/v19/x/erc20/types" + "github.com/evmos/evmos/v19/x/evm/core/vm" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" + inflationtypes "github.com/evmos/evmos/v19/x/inflation/v1/types" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" diff --git a/precompiles/ics20/query.go b/precompiles/ics20/query.go index c6a8ecc0cc..0854fdcde4 100644 --- a/precompiles/ics20/query.go +++ b/precompiles/ics20/query.go @@ -10,9 +10,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/evmos/evmos/v18/precompiles/authorization" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/precompiles/authorization" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) const ( diff --git a/precompiles/ics20/query_test.go b/precompiles/ics20/query_test.go index 4df1aff901..b99f900fa8 100644 --- a/precompiles/ics20/query_test.go +++ b/precompiles/ics20/query_test.go @@ -6,10 +6,10 @@ import ( "github.com/cosmos/cosmos-sdk/types/query" "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" ibctesting "github.com/cosmos/ibc-go/v7/testing" - "github.com/evmos/evmos/v18/precompiles/authorization" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/precompiles/ics20" - "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v19/precompiles/authorization" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/precompiles/ics20" + "github.com/evmos/evmos/v19/utils" ) func (s *PrecompileTestSuite) TestDenomTrace() { diff --git a/precompiles/ics20/setup_test.go b/precompiles/ics20/setup_test.go index b97df68811..76af00b45b 100644 --- a/precompiles/ics20/setup_test.go +++ b/precompiles/ics20/setup_test.go @@ -14,11 +14,11 @@ import ( ibctesting "github.com/cosmos/ibc-go/v7/testing" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - evmosapp "github.com/evmos/evmos/v18/app" - evmosibc "github.com/evmos/evmos/v18/ibc/testing" - "github.com/evmos/evmos/v18/precompiles/ics20" - "github.com/evmos/evmos/v18/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + evmosapp "github.com/evmos/evmos/v19/app" + evmosibc "github.com/evmos/evmos/v19/ibc/testing" + "github.com/evmos/evmos/v19/precompiles/ics20" + "github.com/evmos/evmos/v19/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" diff --git a/precompiles/ics20/tx.go b/precompiles/ics20/tx.go index 613c4b6c7a..4f9a21b206 100644 --- a/precompiles/ics20/tx.go +++ b/precompiles/ics20/tx.go @@ -14,10 +14,10 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/core/vm" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/utils" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/utils" ) const ( diff --git a/precompiles/ics20/tx_test.go b/precompiles/ics20/tx_test.go index f92182b268..5719e10d4b 100644 --- a/precompiles/ics20/tx_test.go +++ b/precompiles/ics20/tx_test.go @@ -9,12 +9,12 @@ import ( transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" "github.com/ethereum/go-ethereum/common" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/precompiles/ics20" - evmosutil "github.com/evmos/evmos/v18/testutil" - testutiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/utils" - "github.com/evmos/evmos/v18/x/evm/core/vm" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/precompiles/ics20" + evmosutil "github.com/evmos/evmos/v19/testutil" + testutiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/utils" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) var ( diff --git a/precompiles/ics20/types.go b/precompiles/ics20/types.go index 670ced75db..169065f14b 100644 --- a/precompiles/ics20/types.go +++ b/precompiles/ics20/types.go @@ -10,7 +10,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/authz" authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/core/vm" errorsmod "cosmossdk.io/errors" "cosmossdk.io/math" @@ -20,8 +20,8 @@ import ( clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/precompiles/authorization" - cmn "github.com/evmos/evmos/v18/precompiles/common" + "github.com/evmos/evmos/v19/precompiles/authorization" + cmn "github.com/evmos/evmos/v19/precompiles/common" ) const ( diff --git a/precompiles/ics20/utils_test.go b/precompiles/ics20/utils_test.go index c414b13305..636b2ca2b7 100644 --- a/precompiles/ics20/utils_test.go +++ b/precompiles/ics20/utils_test.go @@ -29,24 +29,24 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - evmosapp "github.com/evmos/evmos/v18/app" - evmoscontracts "github.com/evmos/evmos/v18/contracts" - evmosibc "github.com/evmos/evmos/v18/ibc/testing" - "github.com/evmos/evmos/v18/precompiles/authorization" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/precompiles/erc20" - "github.com/evmos/evmos/v18/precompiles/ics20" - "github.com/evmos/evmos/v18/precompiles/testutil" - "github.com/evmos/evmos/v18/precompiles/testutil/contracts" - evmosutil "github.com/evmos/evmos/v18/testutil" - evmosutiltx "github.com/evmos/evmos/v18/testutil/tx" - evmostypes "github.com/evmos/evmos/v18/types" - "github.com/evmos/evmos/v18/utils" - "github.com/evmos/evmos/v18/x/evm/core/vm" - "github.com/evmos/evmos/v18/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" - inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" + evmosapp "github.com/evmos/evmos/v19/app" + evmoscontracts "github.com/evmos/evmos/v19/contracts" + evmosibc "github.com/evmos/evmos/v19/ibc/testing" + "github.com/evmos/evmos/v19/precompiles/authorization" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/precompiles/erc20" + "github.com/evmos/evmos/v19/precompiles/ics20" + "github.com/evmos/evmos/v19/precompiles/testutil" + "github.com/evmos/evmos/v19/precompiles/testutil/contracts" + evmosutil "github.com/evmos/evmos/v19/testutil" + evmosutiltx "github.com/evmos/evmos/v19/testutil/tx" + evmostypes "github.com/evmos/evmos/v19/types" + "github.com/evmos/evmos/v19/utils" + "github.com/evmos/evmos/v19/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v19/x/feemarket/types" + inflationtypes "github.com/evmos/evmos/v19/x/inflation/v1/types" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/gomega" diff --git a/precompiles/p256/integration_test.go b/precompiles/p256/integration_test.go index 081a7267f8..77da6049e5 100644 --- a/precompiles/p256/integration_test.go +++ b/precompiles/p256/integration_test.go @@ -15,13 +15,13 @@ import ( //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/gomega" - "github.com/evmos/evmos/v18/precompiles/p256" - "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - "github.com/evmos/evmos/v18/testutil/integration/evmos/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/precompiles/p256" + "github.com/evmos/evmos/v19/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v19/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v19/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v19/testutil/integration/evmos/network" + "github.com/evmos/evmos/v19/testutil/integration/evmos/utils" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) type IntegrationTestSuite struct { diff --git a/precompiles/p256/p256.go b/precompiles/p256/p256.go index 543f58446c..b7558bef4d 100644 --- a/precompiles/p256/p256.go +++ b/precompiles/p256/p256.go @@ -20,8 +20,8 @@ import ( "math/big" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/crypto/secp256r1" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/crypto/secp256r1" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) var _ vm.PrecompiledContract = &Precompile{} diff --git a/precompiles/p256/p256_test.go b/precompiles/p256/p256_test.go index eeeab30b19..baa3f22209 100644 --- a/precompiles/p256/p256_test.go +++ b/precompiles/p256/p256_test.go @@ -9,8 +9,8 @@ import ( "github.com/cometbft/cometbft/crypto" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/precompiles/p256" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/precompiles/p256" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) var trueValue = common.LeftPadBytes(common.Big1.Bytes(), 32) diff --git a/precompiles/p256/setup_test.go b/precompiles/p256/setup_test.go index a7756328d4..3cc4f021bf 100644 --- a/precompiles/p256/setup_test.go +++ b/precompiles/p256/setup_test.go @@ -15,7 +15,7 @@ import ( . "github.com/onsi/gomega" "github.com/cometbft/cometbft/crypto" - "github.com/evmos/evmos/v18/precompiles/p256" + "github.com/evmos/evmos/v19/precompiles/p256" "github.com/stretchr/testify/suite" "golang.org/x/crypto/cryptobyte" "golang.org/x/crypto/cryptobyte/asn1" diff --git a/precompiles/staking/approve.go b/precompiles/staking/approve.go index 805fe7b98b..618d514a33 100644 --- a/precompiles/staking/approve.go +++ b/precompiles/staking/approve.go @@ -14,9 +14,9 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/precompiles/authorization" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/precompiles/authorization" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) var ( diff --git a/precompiles/staking/approve_test.go b/precompiles/staking/approve_test.go index b1e78944b9..08cfc9aa41 100644 --- a/precompiles/staking/approve_test.go +++ b/precompiles/staking/approve_test.go @@ -7,17 +7,17 @@ import ( "cosmossdk.io/math" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - evmosutiltx "github.com/evmos/evmos/v18/testutil/tx" + evmosutiltx "github.com/evmos/evmos/v19/testutil/tx" sdk "github.com/cosmos/cosmos-sdk/types" sdkauthz "github.com/cosmos/cosmos-sdk/x/authz" "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/evmos/evmos/v18/precompiles/authorization" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/precompiles/staking" - "github.com/evmos/evmos/v18/precompiles/testutil" - evmosutil "github.com/evmos/evmos/v18/testutil" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/precompiles/authorization" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/precompiles/staking" + "github.com/evmos/evmos/v19/precompiles/testutil" + evmosutil "github.com/evmos/evmos/v19/testutil" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) func (s *PrecompileTestSuite) TestApprove() { diff --git a/precompiles/staking/events.go b/precompiles/staking/events.go index b67dffa469..f1c3dfba92 100644 --- a/precompiles/staking/events.go +++ b/precompiles/staking/events.go @@ -8,15 +8,15 @@ import ( "math/big" "reflect" - "github.com/evmos/evmos/v18/precompiles/authorization" + "github.com/evmos/evmos/v19/precompiles/authorization" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/x/evm/core/vm" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) const ( diff --git a/precompiles/staking/events_test.go b/precompiles/staking/events_test.go index 8c9e366fab..1da1e789aa 100644 --- a/precompiles/staking/events_test.go +++ b/precompiles/staking/events_test.go @@ -9,10 +9,10 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v18/precompiles/authorization" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/precompiles/staking" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/precompiles/authorization" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/precompiles/staking" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) func (s *PrecompileTestSuite) TestApprovalEvent() { diff --git a/precompiles/staking/integration_test.go b/precompiles/staking/integration_test.go index 9c2b65fc96..809921fdb4 100644 --- a/precompiles/staking/integration_test.go +++ b/precompiles/staking/integration_test.go @@ -19,21 +19,21 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - compiledcontracts "github.com/evmos/evmos/v18/contracts" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" - "github.com/evmos/evmos/v18/precompiles/authorization" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/precompiles/distribution" - "github.com/evmos/evmos/v18/precompiles/staking" - "github.com/evmos/evmos/v18/precompiles/staking/testdata" - "github.com/evmos/evmos/v18/precompiles/testutil" - "github.com/evmos/evmos/v18/precompiles/testutil/contracts" - evmosutil "github.com/evmos/evmos/v18/testutil" - testutiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/utils" - "github.com/evmos/evmos/v18/x/evm/core/vm" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" - vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" + compiledcontracts "github.com/evmos/evmos/v19/contracts" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" + "github.com/evmos/evmos/v19/precompiles/authorization" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/precompiles/distribution" + "github.com/evmos/evmos/v19/precompiles/staking" + "github.com/evmos/evmos/v19/precompiles/staking/testdata" + "github.com/evmos/evmos/v19/precompiles/testutil" + "github.com/evmos/evmos/v19/precompiles/testutil/contracts" + evmosutil "github.com/evmos/evmos/v19/testutil" + testutiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/utils" + "github.com/evmos/evmos/v19/x/evm/core/vm" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" + vestingtypes "github.com/evmos/evmos/v19/x/vesting/types" ) // General variables used for integration tests diff --git a/precompiles/staking/query.go b/precompiles/staking/query.go index e4eb0d184c..2ad3808b09 100644 --- a/precompiles/staking/query.go +++ b/precompiles/staking/query.go @@ -12,9 +12,9 @@ import ( stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/evmos/evmos/v18/precompiles/authorization" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/precompiles/authorization" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) const ( diff --git a/precompiles/staking/query_test.go b/precompiles/staking/query_test.go index a6ac79b736..782bf14b65 100644 --- a/precompiles/staking/query_test.go +++ b/precompiles/staking/query_test.go @@ -9,11 +9,11 @@ import ( "github.com/cosmos/cosmos-sdk/types/query" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/precompiles/authorization" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/precompiles/staking" - testutiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/precompiles/authorization" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/precompiles/staking" + testutiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) func (s *PrecompileTestSuite) TestDelegation() { diff --git a/precompiles/staking/setup_test.go b/precompiles/staking/setup_test.go index 0bf18fe47e..373108ab0d 100644 --- a/precompiles/staking/setup_test.go +++ b/precompiles/staking/setup_test.go @@ -9,10 +9,10 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - evmosapp "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/precompiles/staking" - "github.com/evmos/evmos/v18/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + evmosapp "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/precompiles/staking" + "github.com/evmos/evmos/v19/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" diff --git a/precompiles/staking/staking.go b/precompiles/staking/staking.go index fc81cd2e16..fedd8f65ff 100644 --- a/precompiles/staking/staking.go +++ b/precompiles/staking/staking.go @@ -13,10 +13,10 @@ import ( authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/precompiles/authorization" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/x/evm/core/vm" - stakingkeeper "github.com/evmos/evmos/v18/x/staking/keeper" + "github.com/evmos/evmos/v19/precompiles/authorization" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/x/evm/core/vm" + stakingkeeper "github.com/evmos/evmos/v19/x/staking/keeper" ) var _ vm.PrecompiledContract = &Precompile{} diff --git a/precompiles/staking/staking_test.go b/precompiles/staking/staking_test.go index 189c8ec7ed..4a90d29071 100644 --- a/precompiles/staking/staking_test.go +++ b/precompiles/staking/staking_test.go @@ -8,15 +8,15 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/core/vm" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/precompiles/authorization" - "github.com/evmos/evmos/v18/precompiles/staking" - "github.com/evmos/evmos/v18/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/precompiles/authorization" + "github.com/evmos/evmos/v19/precompiles/staking" + "github.com/evmos/evmos/v19/utils" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func (s *PrecompileTestSuite) TestIsTransaction() { diff --git a/precompiles/staking/testdata/staking_caller.go b/precompiles/staking/testdata/staking_caller.go index ae9f1c91d0..615015d535 100644 --- a/precompiles/staking/testdata/staking_caller.go +++ b/precompiles/staking/testdata/staking_caller.go @@ -4,8 +4,8 @@ package testdata import ( - contractutils "github.com/evmos/evmos/v18/contracts/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + contractutils "github.com/evmos/evmos/v19/contracts/utils" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func LoadStakingCallerContract() (evmtypes.CompiledContract, error) { diff --git a/precompiles/staking/testdata/staking_caller_two.go b/precompiles/staking/testdata/staking_caller_two.go index 9b28b27934..8aee45a9a1 100644 --- a/precompiles/staking/testdata/staking_caller_two.go +++ b/precompiles/staking/testdata/staking_caller_two.go @@ -4,8 +4,8 @@ package testdata import ( - contractutils "github.com/evmos/evmos/v18/contracts/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + contractutils "github.com/evmos/evmos/v19/contracts/utils" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func LoadStakingCallerTwoContract() (evmtypes.CompiledContract, error) { diff --git a/precompiles/staking/tx.go b/precompiles/staking/tx.go index 11f90f93a2..dc13d4fd91 100644 --- a/precompiles/staking/tx.go +++ b/precompiles/staking/tx.go @@ -11,11 +11,11 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/precompiles/authorization" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/precompiles/authorization" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/x/evm/core/vm" - stakingkeeper "github.com/evmos/evmos/v18/x/staking/keeper" + stakingkeeper "github.com/evmos/evmos/v19/x/staking/keeper" ) const ( diff --git a/precompiles/staking/tx_test.go b/precompiles/staking/tx_test.go index 10e7bf12d6..fa157f4cd1 100644 --- a/precompiles/staking/tx_test.go +++ b/precompiles/staking/tx_test.go @@ -10,12 +10,12 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" geth "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v18/cmd/config" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/precompiles/staking" - "github.com/evmos/evmos/v18/precompiles/testutil" - evmosutiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/cmd/config" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/precompiles/staking" + "github.com/evmos/evmos/v19/precompiles/testutil" + evmosutiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) func (s *PrecompileTestSuite) TestCreateValidator() { diff --git a/precompiles/staking/types.go b/precompiles/staking/types.go index 285c685dc8..22ebf72885 100644 --- a/precompiles/staking/types.go +++ b/precompiles/staking/types.go @@ -19,7 +19,7 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - cmn "github.com/evmos/evmos/v18/precompiles/common" + cmn "github.com/evmos/evmos/v19/precompiles/common" ) const ( diff --git a/precompiles/staking/utils_test.go b/precompiles/staking/utils_test.go index 07ac8dd93a..df169c1f2a 100644 --- a/precompiles/staking/utils_test.go +++ b/precompiles/staking/utils_test.go @@ -29,22 +29,22 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - evmosapp "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" - "github.com/evmos/evmos/v18/precompiles/authorization" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/precompiles/staking" - "github.com/evmos/evmos/v18/precompiles/testutil" - "github.com/evmos/evmos/v18/precompiles/testutil/contracts" - evmosutil "github.com/evmos/evmos/v18/testutil" - testutiltx "github.com/evmos/evmos/v18/testutil/tx" - evmostypes "github.com/evmos/evmos/v18/types" - "github.com/evmos/evmos/v18/utils" - "github.com/evmos/evmos/v18/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" - inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" - stakingkeeper "github.com/evmos/evmos/v18/x/staking/keeper" - vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" + evmosapp "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" + "github.com/evmos/evmos/v19/precompiles/authorization" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/precompiles/staking" + "github.com/evmos/evmos/v19/precompiles/testutil" + "github.com/evmos/evmos/v19/precompiles/testutil/contracts" + evmosutil "github.com/evmos/evmos/v19/testutil" + testutiltx "github.com/evmos/evmos/v19/testutil/tx" + evmostypes "github.com/evmos/evmos/v19/types" + "github.com/evmos/evmos/v19/utils" + "github.com/evmos/evmos/v19/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" + inflationtypes "github.com/evmos/evmos/v19/x/inflation/v1/types" + stakingkeeper "github.com/evmos/evmos/v19/x/staking/keeper" + vestingtypes "github.com/evmos/evmos/v19/x/vesting/types" ) // stipend to pay EVM tx fees diff --git a/precompiles/testutil/contracts/contracts.go b/precompiles/testutil/contracts/contracts.go index 4228aadeb2..89c0469023 100644 --- a/precompiles/testutil/contracts/contracts.go +++ b/precompiles/testutil/contracts/contracts.go @@ -11,11 +11,11 @@ import ( abci "github.com/cometbft/cometbft/abci/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/crypto" - evmosapp "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" - "github.com/evmos/evmos/v18/precompiles/testutil" - evmosutil "github.com/evmos/evmos/v18/testutil" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + evmosapp "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" + "github.com/evmos/evmos/v19/precompiles/testutil" + evmosutil "github.com/evmos/evmos/v19/testutil" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) // Call is a helper function to call any arbitrary smart contract. diff --git a/precompiles/testutil/contracts/counter.go b/precompiles/testutil/contracts/counter.go index cd6252a040..3ae2e9af7f 100644 --- a/precompiles/testutil/contracts/counter.go +++ b/precompiles/testutil/contracts/counter.go @@ -4,8 +4,8 @@ package contracts import ( - contractutils "github.com/evmos/evmos/v18/contracts/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + contractutils "github.com/evmos/evmos/v19/contracts/utils" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func LoadCounterContract() (evmtypes.CompiledContract, error) { diff --git a/precompiles/testutil/contracts/distribution_caller.go b/precompiles/testutil/contracts/distribution_caller.go index 015add2fdc..20693a5522 100644 --- a/precompiles/testutil/contracts/distribution_caller.go +++ b/precompiles/testutil/contracts/distribution_caller.go @@ -4,8 +4,8 @@ package contracts import ( - contractutils "github.com/evmos/evmos/v18/contracts/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + contractutils "github.com/evmos/evmos/v19/contracts/utils" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func LoadDistributionCallerContract() (evmtypes.CompiledContract, error) { diff --git a/precompiles/testutil/contracts/flash_loan.go b/precompiles/testutil/contracts/flash_loan.go index c8ffba1c32..d4f709bb44 100644 --- a/precompiles/testutil/contracts/flash_loan.go +++ b/precompiles/testutil/contracts/flash_loan.go @@ -4,8 +4,8 @@ package contracts import ( - contractutils "github.com/evmos/evmos/v18/contracts/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + contractutils "github.com/evmos/evmos/v19/contracts/utils" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func LoadFlashLoanContract() (evmtypes.CompiledContract, error) { diff --git a/precompiles/testutil/contracts/interchain_sender.go b/precompiles/testutil/contracts/interchain_sender.go index 10fea47582..223c093514 100644 --- a/precompiles/testutil/contracts/interchain_sender.go +++ b/precompiles/testutil/contracts/interchain_sender.go @@ -4,8 +4,8 @@ package contracts import ( - contractutils "github.com/evmos/evmos/v18/contracts/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + contractutils "github.com/evmos/evmos/v19/contracts/utils" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func LoadInterchainSenderContract() (evmtypes.CompiledContract, error) { diff --git a/precompiles/testutil/contracts/interchain_sender_caller.go b/precompiles/testutil/contracts/interchain_sender_caller.go index f2d18b9239..96b0238762 100644 --- a/precompiles/testutil/contracts/interchain_sender_caller.go +++ b/precompiles/testutil/contracts/interchain_sender_caller.go @@ -4,8 +4,8 @@ package contracts import ( - contractutils "github.com/evmos/evmos/v18/contracts/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + contractutils "github.com/evmos/evmos/v19/contracts/utils" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func LoadInterchainSenderCallerContract() (evmtypes.CompiledContract, error) { diff --git a/precompiles/testutil/contracts/reverter.go b/precompiles/testutil/contracts/reverter.go index e09ee7fac5..148172f56b 100644 --- a/precompiles/testutil/contracts/reverter.go +++ b/precompiles/testutil/contracts/reverter.go @@ -4,8 +4,8 @@ package contracts import ( - contractutils "github.com/evmos/evmos/v18/contracts/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + contractutils "github.com/evmos/evmos/v19/contracts/utils" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func LoadReverterContract() (evmtypes.CompiledContract, error) { diff --git a/precompiles/testutil/contracts/staking_reverter.go b/precompiles/testutil/contracts/staking_reverter.go index 47c7eb7bad..82d2c0d54a 100644 --- a/precompiles/testutil/contracts/staking_reverter.go +++ b/precompiles/testutil/contracts/staking_reverter.go @@ -4,8 +4,8 @@ package contracts import ( - contractutils "github.com/evmos/evmos/v18/contracts/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + contractutils "github.com/evmos/evmos/v19/contracts/utils" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func LoadStakingReverterContract() (evmtypes.CompiledContract, error) { diff --git a/precompiles/testutil/errors.go b/precompiles/testutil/errors.go index d6fdfbe381..2cfb6b5cee 100644 --- a/precompiles/testutil/errors.go +++ b/precompiles/testutil/errors.go @@ -8,7 +8,7 @@ import ( "strings" abci "github.com/cometbft/cometbft/abci/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) // CheckVMError is a helper function used to check if the transaction is reverted with the expected error message diff --git a/precompiles/testutil/events.go b/precompiles/testutil/events.go index 4aebc03a0b..a18956219c 100644 --- a/precompiles/testutil/events.go +++ b/precompiles/testutil/events.go @@ -15,7 +15,7 @@ import ( abci "github.com/cometbft/cometbft/abci/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) // CheckAuthorizationEvents is a helper function used in the integration tests and checks if the approval event is emitted. diff --git a/precompiles/testutil/logs.go b/precompiles/testutil/logs.go index 77b3481b17..02f9e5892f 100644 --- a/precompiles/testutil/logs.go +++ b/precompiles/testutil/logs.go @@ -8,7 +8,7 @@ import ( abci "github.com/cometbft/cometbft/abci/types" "github.com/ethereum/go-ethereum/accounts/abi" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) // CheckLogs checks the logs for the given events and whether the transaction was successful or not. diff --git a/precompiles/testutil/testing.go b/precompiles/testutil/testing.go index 2cb57e0408..5219f235e4 100644 --- a/precompiles/testutil/testing.go +++ b/precompiles/testutil/testing.go @@ -8,7 +8,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/core/vm" "github.com/stretchr/testify/require" ) diff --git a/precompiles/vesting/approve.go b/precompiles/vesting/approve.go index a8f90e4351..93585c6974 100644 --- a/precompiles/vesting/approve.go +++ b/precompiles/vesting/approve.go @@ -10,9 +10,9 @@ import ( authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/x/evm/core/vm" - vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/x/evm/core/vm" + vestingtypes "github.com/evmos/evmos/v19/x/vesting/types" ) var ( diff --git a/precompiles/vesting/events.go b/precompiles/vesting/events.go index 6efa156283..f9b6460885 100644 --- a/precompiles/vesting/events.go +++ b/precompiles/vesting/events.go @@ -7,10 +7,10 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v18/precompiles/authorization" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/x/evm/core/vm" - vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" + "github.com/evmos/evmos/v19/precompiles/authorization" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/x/evm/core/vm" + vestingtypes "github.com/evmos/evmos/v19/x/vesting/types" ) const ( diff --git a/precompiles/vesting/integration_test.go b/precompiles/vesting/integration_test.go index 04b78f3c2f..61d232e91f 100644 --- a/precompiles/vesting/integration_test.go +++ b/precompiles/vesting/integration_test.go @@ -11,14 +11,14 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/ethereum/go-ethereum/common" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/precompiles/testutil" - "github.com/evmos/evmos/v18/precompiles/testutil/contracts" - "github.com/evmos/evmos/v18/precompiles/vesting" - evmosutil "github.com/evmos/evmos/v18/testutil" - testutiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/utils" - vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/precompiles/testutil" + "github.com/evmos/evmos/v19/precompiles/testutil/contracts" + "github.com/evmos/evmos/v19/precompiles/vesting" + evmosutil "github.com/evmos/evmos/v19/testutil" + testutiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/utils" + vestingtypes "github.com/evmos/evmos/v19/x/vesting/types" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" diff --git a/precompiles/vesting/query_test.go b/precompiles/vesting/query_test.go index b7c3814c95..d2491e678f 100644 --- a/precompiles/vesting/query_test.go +++ b/precompiles/vesting/query_test.go @@ -5,8 +5,8 @@ package vesting_test import ( "fmt" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/precompiles/vesting" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/precompiles/vesting" ) func (s *PrecompileTestSuite) TestBalances() { diff --git a/precompiles/vesting/setup_test.go b/precompiles/vesting/setup_test.go index c0bcf7fe0f..9936c6254f 100644 --- a/precompiles/vesting/setup_test.go +++ b/precompiles/vesting/setup_test.go @@ -11,10 +11,10 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - evmosapp "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/precompiles/vesting" - "github.com/evmos/evmos/v18/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + evmosapp "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/precompiles/vesting" + "github.com/evmos/evmos/v19/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" "github.com/stretchr/testify/suite" //nolint:revive // dot imports are fine for Ginkgo diff --git a/precompiles/vesting/testdata/vesting_caller.go b/precompiles/vesting/testdata/vesting_caller.go index c4e3f3a7c1..c0542e3e2a 100644 --- a/precompiles/vesting/testdata/vesting_caller.go +++ b/precompiles/vesting/testdata/vesting_caller.go @@ -4,8 +4,8 @@ package testdata import ( - contractutils "github.com/evmos/evmos/v18/contracts/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + contractutils "github.com/evmos/evmos/v19/contracts/utils" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func LoadVestingCallerContract() (evmtypes.CompiledContract, error) { diff --git a/precompiles/vesting/tx.go b/precompiles/vesting/tx.go index 7b7ffc42b3..44d828e222 100644 --- a/precompiles/vesting/tx.go +++ b/precompiles/vesting/tx.go @@ -9,10 +9,10 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/precompiles/authorization" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/utils" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/precompiles/authorization" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/utils" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) const ( diff --git a/precompiles/vesting/tx_test.go b/precompiles/vesting/tx_test.go index a2e74e03c3..2f44f97389 100644 --- a/precompiles/vesting/tx_test.go +++ b/precompiles/vesting/tx_test.go @@ -8,17 +8,17 @@ import ( "time" "cosmossdk.io/math" - "github.com/evmos/evmos/v18/precompiles/testutil" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/precompiles/testutil" + "github.com/evmos/evmos/v19/x/evm/core/vm" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/precompiles/vesting" - evmosutil "github.com/evmos/evmos/v18/testutil" - evmosutiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/utils" - vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/precompiles/vesting" + evmosutil "github.com/evmos/evmos/v19/testutil" + evmosutiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/utils" + vestingtypes "github.com/evmos/evmos/v19/x/vesting/types" ) var ( diff --git a/precompiles/vesting/types.go b/precompiles/vesting/types.go index 6e90227ed0..d530b89e30 100644 --- a/precompiles/vesting/types.go +++ b/precompiles/vesting/types.go @@ -7,7 +7,7 @@ import ( "time" "cosmossdk.io/math" - "github.com/evmos/evmos/v18/precompiles/authorization" + "github.com/evmos/evmos/v19/precompiles/authorization" "github.com/ethereum/go-ethereum/common" @@ -15,8 +15,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" cosmosvestingtypes "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" - cmn "github.com/evmos/evmos/v18/precompiles/common" - vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" + cmn "github.com/evmos/evmos/v19/precompiles/common" + vestingtypes "github.com/evmos/evmos/v19/x/vesting/types" ) // LockupPeriods is a struct used to parse the LockupPeriods parameter diff --git a/precompiles/vesting/utils_test.go b/precompiles/vesting/utils_test.go index 5ea326478c..cd7764563a 100644 --- a/precompiles/vesting/utils_test.go +++ b/precompiles/vesting/utils_test.go @@ -21,19 +21,19 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - evmosapp "github.com/evmos/evmos/v18/app" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/precompiles/testutil/contracts" - "github.com/evmos/evmos/v18/precompiles/vesting" - "github.com/evmos/evmos/v18/precompiles/vesting/testdata" - evmosutil "github.com/evmos/evmos/v18/testutil" - testutiltx "github.com/evmos/evmos/v18/testutil/tx" - evmostypes "github.com/evmos/evmos/v18/types" - "github.com/evmos/evmos/v18/utils" - "github.com/evmos/evmos/v18/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" - inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" - vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" + evmosapp "github.com/evmos/evmos/v19/app" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/precompiles/testutil/contracts" + "github.com/evmos/evmos/v19/precompiles/vesting" + "github.com/evmos/evmos/v19/precompiles/vesting/testdata" + evmosutil "github.com/evmos/evmos/v19/testutil" + testutiltx "github.com/evmos/evmos/v19/testutil/tx" + evmostypes "github.com/evmos/evmos/v19/types" + "github.com/evmos/evmos/v19/utils" + "github.com/evmos/evmos/v19/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" + inflationtypes "github.com/evmos/evmos/v19/x/inflation/v1/types" + vestingtypes "github.com/evmos/evmos/v19/x/vesting/types" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/gomega" diff --git a/precompiles/vesting/vesting.go b/precompiles/vesting/vesting.go index 0113c944cf..08e273f4c8 100644 --- a/precompiles/vesting/vesting.go +++ b/precompiles/vesting/vesting.go @@ -7,7 +7,7 @@ import ( "embed" "fmt" - "github.com/evmos/evmos/v18/precompiles/authorization" + "github.com/evmos/evmos/v19/precompiles/authorization" sdk "github.com/cosmos/cosmos-sdk/types" @@ -15,9 +15,9 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" "github.com/ethereum/go-ethereum/common" - cmn "github.com/evmos/evmos/v18/precompiles/common" - "github.com/evmos/evmos/v18/x/evm/core/vm" - vestingkeeper "github.com/evmos/evmos/v18/x/vesting/keeper" + cmn "github.com/evmos/evmos/v19/precompiles/common" + "github.com/evmos/evmos/v19/x/evm/core/vm" + vestingkeeper "github.com/evmos/evmos/v19/x/vesting/keeper" ) // PrecompileAddress of the vesting EVM extension in hex format. diff --git a/proto/ethermint/crypto/v1/ethsecp256k1/keys.proto b/proto/ethermint/crypto/v1/ethsecp256k1/keys.proto index 29d35ec01b..a1fdd27569 100644 --- a/proto/ethermint/crypto/v1/ethsecp256k1/keys.proto +++ b/proto/ethermint/crypto/v1/ethsecp256k1/keys.proto @@ -5,7 +5,7 @@ package ethermint.crypto.v1.ethsecp256k1; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v18/crypto/ethsecp256k1"; +option go_package = "github.com/evmos/evmos/v19/crypto/ethsecp256k1"; // PubKey defines a type alias for an ecdsa.PublicKey that implements // Tendermint's PubKey interface. It represents the 33-byte compressed public diff --git a/proto/ethermint/evm/v1/events.proto b/proto/ethermint/evm/v1/events.proto index 314cc37d19..0316afc3d8 100644 --- a/proto/ethermint/evm/v1/events.proto +++ b/proto/ethermint/evm/v1/events.proto @@ -3,7 +3,7 @@ syntax = "proto3"; package ethermint.evm.v1; -option go_package = "github.com/evmos/evmos/v18/x/evm/types"; +option go_package = "github.com/evmos/evmos/v19/x/evm/types"; // EventEthereumTx defines the event for an Ethereum transaction message EventEthereumTx { diff --git a/proto/ethermint/evm/v1/evm.proto b/proto/ethermint/evm/v1/evm.proto index 4585d2b1fe..cfaf79a228 100644 --- a/proto/ethermint/evm/v1/evm.proto +++ b/proto/ethermint/evm/v1/evm.proto @@ -5,7 +5,7 @@ package ethermint.evm.v1; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v18/x/evm/types"; +option go_package = "github.com/evmos/evmos/v19/x/evm/types"; // Params defines the EVM module parameters message Params { diff --git a/proto/ethermint/evm/v1/genesis.proto b/proto/ethermint/evm/v1/genesis.proto index 4f90910b4f..df71d553b7 100644 --- a/proto/ethermint/evm/v1/genesis.proto +++ b/proto/ethermint/evm/v1/genesis.proto @@ -6,7 +6,7 @@ package ethermint.evm.v1; import "ethermint/evm/v1/evm.proto"; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v18/x/evm/types"; +option go_package = "github.com/evmos/evmos/v19/x/evm/types"; // GenesisState defines the evm module's genesis state. message GenesisState { diff --git a/proto/ethermint/evm/v1/query.proto b/proto/ethermint/evm/v1/query.proto index 1dfdd4ba6b..b6bede661e 100644 --- a/proto/ethermint/evm/v1/query.proto +++ b/proto/ethermint/evm/v1/query.proto @@ -10,7 +10,7 @@ import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; import "google/protobuf/timestamp.proto"; -option go_package = "github.com/evmos/evmos/v18/x/evm/types"; +option go_package = "github.com/evmos/evmos/v19/x/evm/types"; // Query defines the gRPC querier service. service Query { diff --git a/proto/ethermint/evm/v1/tx.proto b/proto/ethermint/evm/v1/tx.proto index 00c64e00ea..63944ff330 100644 --- a/proto/ethermint/evm/v1/tx.proto +++ b/proto/ethermint/evm/v1/tx.proto @@ -10,7 +10,7 @@ import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; import "google/protobuf/any.proto"; -option go_package = "github.com/evmos/evmos/v18/x/evm/types"; +option go_package = "github.com/evmos/evmos/v19/x/evm/types"; // Msg defines the evm Msg service. service Msg { diff --git a/proto/ethermint/feemarket/v1/events.proto b/proto/ethermint/feemarket/v1/events.proto index 526100f8d8..eca2f7b979 100644 --- a/proto/ethermint/feemarket/v1/events.proto +++ b/proto/ethermint/feemarket/v1/events.proto @@ -3,7 +3,7 @@ syntax = "proto3"; package ethermint.feemarket.v1; -option go_package = "github.com/evmos/evmos/v18/x/feemarket/types"; +option go_package = "github.com/evmos/evmos/v19/x/feemarket/types"; // EventFeeMarket is the event type for the fee market module message EventFeeMarket { diff --git a/proto/ethermint/feemarket/v1/feemarket.proto b/proto/ethermint/feemarket/v1/feemarket.proto index b2458e5f74..f5e675c6a2 100644 --- a/proto/ethermint/feemarket/v1/feemarket.proto +++ b/proto/ethermint/feemarket/v1/feemarket.proto @@ -5,7 +5,7 @@ package ethermint.feemarket.v1; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v18/x/feemarket/types"; +option go_package = "github.com/evmos/evmos/v19/x/feemarket/types"; // Params defines the EVM module parameters message Params { diff --git a/proto/ethermint/feemarket/v1/genesis.proto b/proto/ethermint/feemarket/v1/genesis.proto index 2d359e8660..216d6fc9a9 100644 --- a/proto/ethermint/feemarket/v1/genesis.proto +++ b/proto/ethermint/feemarket/v1/genesis.proto @@ -6,7 +6,7 @@ package ethermint.feemarket.v1; import "ethermint/feemarket/v1/feemarket.proto"; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v18/x/feemarket/types"; +option go_package = "github.com/evmos/evmos/v19/x/feemarket/types"; // GenesisState defines the feemarket module's genesis state. message GenesisState { diff --git a/proto/ethermint/feemarket/v1/query.proto b/proto/ethermint/feemarket/v1/query.proto index c96f560dc2..0fbf91f9ae 100644 --- a/proto/ethermint/feemarket/v1/query.proto +++ b/proto/ethermint/feemarket/v1/query.proto @@ -7,7 +7,7 @@ import "ethermint/feemarket/v1/feemarket.proto"; import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; -option go_package = "github.com/evmos/evmos/v18/x/feemarket/types"; +option go_package = "github.com/evmos/evmos/v19/x/feemarket/types"; // Query defines the gRPC querier service. service Query { diff --git a/proto/ethermint/feemarket/v1/tx.proto b/proto/ethermint/feemarket/v1/tx.proto index 985cd2223c..b1ec0a13fd 100644 --- a/proto/ethermint/feemarket/v1/tx.proto +++ b/proto/ethermint/feemarket/v1/tx.proto @@ -8,7 +8,7 @@ import "cosmos_proto/cosmos.proto"; import "ethermint/feemarket/v1/feemarket.proto"; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v18/x/feemarket/types"; +option go_package = "github.com/evmos/evmos/v19/x/feemarket/types"; // Msg defines the erc20 Msg service. service Msg { diff --git a/proto/ethermint/types/v1/dynamic_fee.proto b/proto/ethermint/types/v1/dynamic_fee.proto index 3d196a1d63..c1240d5f8c 100644 --- a/proto/ethermint/types/v1/dynamic_fee.proto +++ b/proto/ethermint/types/v1/dynamic_fee.proto @@ -5,7 +5,7 @@ package ethermint.types.v1; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v18/types"; +option go_package = "github.com/evmos/evmos/v19/types"; // ExtensionOptionDynamicFeeTx is an extension option that specifies the maxPrioPrice for cosmos tx message ExtensionOptionDynamicFeeTx { diff --git a/proto/ethermint/types/v1/indexer.proto b/proto/ethermint/types/v1/indexer.proto index 34ebe6d07e..6f7d095c5f 100644 --- a/proto/ethermint/types/v1/indexer.proto +++ b/proto/ethermint/types/v1/indexer.proto @@ -5,7 +5,7 @@ package ethermint.types.v1; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v18/types"; +option go_package = "github.com/evmos/evmos/v19/types"; // TxResult is the value stored in eth tx indexer message TxResult { diff --git a/proto/ethermint/types/v1/web3.proto b/proto/ethermint/types/v1/web3.proto index 09d6359f3b..c060c13ab6 100644 --- a/proto/ethermint/types/v1/web3.proto +++ b/proto/ethermint/types/v1/web3.proto @@ -5,7 +5,7 @@ package ethermint.types.v1; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v18/types"; +option go_package = "github.com/evmos/evmos/v19/types"; // ExtensionOptionsWeb3Tx is an extension option that specifies the typed chain id, // the fee payer as well as its signature data. diff --git a/proto/evmos/epochs/v1/genesis.proto b/proto/evmos/epochs/v1/genesis.proto index b82908826d..b6c38ea74d 100644 --- a/proto/evmos/epochs/v1/genesis.proto +++ b/proto/evmos/epochs/v1/genesis.proto @@ -7,7 +7,7 @@ import "gogoproto/gogo.proto"; import "google/protobuf/duration.proto"; import "google/protobuf/timestamp.proto"; -option go_package = "github.com/evmos/evmos/v18/x/epochs/types"; +option go_package = "github.com/evmos/evmos/v19/x/epochs/types"; // EpochInfo defines the message interface containing the relevant informations about // an epoch. diff --git a/proto/evmos/epochs/v1/query.proto b/proto/evmos/epochs/v1/query.proto index fe975a7cba..05a97289aa 100644 --- a/proto/evmos/epochs/v1/query.proto +++ b/proto/evmos/epochs/v1/query.proto @@ -8,7 +8,7 @@ import "evmos/epochs/v1/genesis.proto"; import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; -option go_package = "github.com/evmos/evmos/v18/x/epochs/types"; +option go_package = "github.com/evmos/evmos/v19/x/epochs/types"; // Query defines the gRPC querier service. service Query { diff --git a/proto/evmos/erc20/v1/erc20.proto b/proto/evmos/erc20/v1/erc20.proto index 33fba39d1a..7852f92c3a 100644 --- a/proto/evmos/erc20/v1/erc20.proto +++ b/proto/evmos/erc20/v1/erc20.proto @@ -5,7 +5,7 @@ package evmos.erc20.v1; import "cosmos/bank/v1beta1/bank.proto"; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v18/x/erc20/types"; +option go_package = "github.com/evmos/evmos/v19/x/erc20/types"; // Owner enumerates the ownership of a ERC20 contract. enum Owner { diff --git a/proto/evmos/erc20/v1/events.proto b/proto/evmos/erc20/v1/events.proto index fb7c362bd0..6bc7b0bffc 100644 --- a/proto/evmos/erc20/v1/events.proto +++ b/proto/evmos/erc20/v1/events.proto @@ -3,7 +3,7 @@ syntax = "proto3"; package evmos.erc20.v1; -option go_package = "github.com/evmos/evmos/v18/x/erc20/types"; +option go_package = "github.com/evmos/evmos/v19/x/erc20/types"; // EventRegisterPair is an event emitted when a coin is registered. message EventRegisterPair { diff --git a/proto/evmos/erc20/v1/genesis.proto b/proto/evmos/erc20/v1/genesis.proto index fb049bc8e1..7f7c21625b 100644 --- a/proto/evmos/erc20/v1/genesis.proto +++ b/proto/evmos/erc20/v1/genesis.proto @@ -6,7 +6,7 @@ package evmos.erc20.v1; import "evmos/erc20/v1/erc20.proto"; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v18/x/erc20/types"; +option go_package = "github.com/evmos/evmos/v19/x/erc20/types"; // GenesisState defines the module's genesis state. message GenesisState { diff --git a/proto/evmos/erc20/v1/query.proto b/proto/evmos/erc20/v1/query.proto index 12b6e0aa92..3bef0197d7 100644 --- a/proto/evmos/erc20/v1/query.proto +++ b/proto/evmos/erc20/v1/query.proto @@ -9,7 +9,7 @@ import "evmos/erc20/v1/genesis.proto"; import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; -option go_package = "github.com/evmos/evmos/v18/x/erc20/types"; +option go_package = "github.com/evmos/evmos/v19/x/erc20/types"; // Query defines the gRPC querier service. service Query { diff --git a/proto/evmos/erc20/v1/tx.proto b/proto/evmos/erc20/v1/tx.proto index 87bbce467d..dd24813c55 100644 --- a/proto/evmos/erc20/v1/tx.proto +++ b/proto/evmos/erc20/v1/tx.proto @@ -10,7 +10,7 @@ import "evmos/erc20/v1/genesis.proto"; import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; -option go_package = "github.com/evmos/evmos/v18/x/erc20/types"; +option go_package = "github.com/evmos/evmos/v19/x/erc20/types"; // Msg defines the erc20 Msg service. service Msg { diff --git a/proto/evmos/incentives/v1/genesis.proto b/proto/evmos/incentives/v1/genesis.proto index 9c8a3f405a..7339295d6b 100644 --- a/proto/evmos/incentives/v1/genesis.proto +++ b/proto/evmos/incentives/v1/genesis.proto @@ -6,7 +6,7 @@ import "evmos/incentives/v1/incentives.proto"; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v18/x/incentives/types"; +option go_package = "github.com/evmos/evmos/v19/x/incentives/types"; // GenesisState defines the module's genesis state. message GenesisState { diff --git a/proto/evmos/incentives/v1/incentives.proto b/proto/evmos/incentives/v1/incentives.proto index badebb8fe4..0a0ae019c4 100644 --- a/proto/evmos/incentives/v1/incentives.proto +++ b/proto/evmos/incentives/v1/incentives.proto @@ -6,7 +6,7 @@ package evmos.incentives.v1; import "cosmos/base/v1beta1/coin.proto"; import "gogoproto/gogo.proto"; import "google/protobuf/timestamp.proto"; -option go_package = "github.com/evmos/evmos/v18/x/incentives/types"; +option go_package = "github.com/evmos/evmos/v19/x/incentives/types"; // Incentive defines an instance that organizes distribution conditions for a // given smart contract diff --git a/proto/evmos/inflation/v1/genesis.proto b/proto/evmos/inflation/v1/genesis.proto index 105071d185..efbf200a8b 100644 --- a/proto/evmos/inflation/v1/genesis.proto +++ b/proto/evmos/inflation/v1/genesis.proto @@ -7,7 +7,7 @@ import "gogoproto/gogo.proto"; import "evmos/inflation/v1/inflation.proto"; -option go_package = "github.com/evmos/evmos/v18/x/inflation/v1/types"; +option go_package = "github.com/evmos/evmos/v19/x/inflation/v1/types"; // GenesisState defines the inflation module's genesis state. message GenesisState { diff --git a/proto/evmos/inflation/v1/inflation.proto b/proto/evmos/inflation/v1/inflation.proto index c85b498be5..dec7d62559 100644 --- a/proto/evmos/inflation/v1/inflation.proto +++ b/proto/evmos/inflation/v1/inflation.proto @@ -5,7 +5,7 @@ package evmos.inflation.v1; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v18/x/inflation/v1/types"; +option go_package = "github.com/evmos/evmos/v19/x/inflation/v1/types"; // InflationDistribution defines the distribution in which inflation is // allocated through minting on each epoch (staking, incentives, community). It diff --git a/proto/evmos/inflation/v1/query.proto b/proto/evmos/inflation/v1/query.proto index b6d5e68337..286dc2780d 100644 --- a/proto/evmos/inflation/v1/query.proto +++ b/proto/evmos/inflation/v1/query.proto @@ -8,7 +8,7 @@ import "evmos/inflation/v1/genesis.proto"; import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; -option go_package = "github.com/evmos/evmos/v18/x/inflation/v1/types"; +option go_package = "github.com/evmos/evmos/v19/x/inflation/v1/types"; // Query provides defines the gRPC querier service. service Query { diff --git a/proto/evmos/inflation/v1/tx.proto b/proto/evmos/inflation/v1/tx.proto index 32272b1a0c..f2cfb6afa8 100644 --- a/proto/evmos/inflation/v1/tx.proto +++ b/proto/evmos/inflation/v1/tx.proto @@ -8,7 +8,7 @@ import "cosmos_proto/cosmos.proto"; import "evmos/inflation/v1/genesis.proto"; import "gogoproto/gogo.proto"; -option go_package = "github.com/evmos/evmos/v18/x/inflation/v1/types"; +option go_package = "github.com/evmos/evmos/v19/x/inflation/v1/types"; // Msg defines the evm Msg service. service Msg { diff --git a/proto/evmos/vesting/v1/vesting.proto b/proto/evmos/vesting/v1/vesting.proto index 79eac99116..4439fdd074 100644 --- a/proto/evmos/vesting/v1/vesting.proto +++ b/proto/evmos/vesting/v1/vesting.proto @@ -7,7 +7,7 @@ import "cosmos/vesting/v1beta1/vesting.proto"; import "gogoproto/gogo.proto"; import "google/protobuf/timestamp.proto"; -option go_package = "github.com/evmos/evmos/v18/x/vesting/migrations/types"; +option go_package = "github.com/evmos/evmos/v19/x/vesting/migrations/types"; // ClawbackVestingAccount implements the VestingAccount interface. It provides // an account that can hold contributions subject to "lockup" (like a diff --git a/proto/evmos/vesting/v2/events.proto b/proto/evmos/vesting/v2/events.proto index fa21103ee2..0aa8b1670e 100644 --- a/proto/evmos/vesting/v2/events.proto +++ b/proto/evmos/vesting/v2/events.proto @@ -3,7 +3,7 @@ syntax = "proto3"; package evmos.vesting.v2; -option go_package = "github.com/evmos/evmos/v18/x/vesting/types"; +option go_package = "github.com/evmos/evmos/v19/x/vesting/types"; // EventCreateClawbackVestingAccount defines the event type // for creating a clawback vesting account diff --git a/proto/evmos/vesting/v2/query.proto b/proto/evmos/vesting/v2/query.proto index cab5c1f322..e4ea9d7432 100644 --- a/proto/evmos/vesting/v2/query.proto +++ b/proto/evmos/vesting/v2/query.proto @@ -7,7 +7,7 @@ import "cosmos/base/v1beta1/coin.proto"; import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; -option go_package = "github.com/evmos/evmos/v18/x/vesting/types"; +option go_package = "github.com/evmos/evmos/v19/x/vesting/types"; // Query defines the gRPC querier service. service Query { diff --git a/proto/evmos/vesting/v2/tx.proto b/proto/evmos/vesting/v2/tx.proto index 693f19dd37..cd6b60adb3 100644 --- a/proto/evmos/vesting/v2/tx.proto +++ b/proto/evmos/vesting/v2/tx.proto @@ -10,7 +10,7 @@ import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; import "google/protobuf/timestamp.proto"; -option go_package = "github.com/evmos/evmos/v18/x/vesting/types"; +option go_package = "github.com/evmos/evmos/v19/x/vesting/types"; // Msg defines the vesting Msg service. service Msg { diff --git a/proto/evmos/vesting/v2/vesting.proto b/proto/evmos/vesting/v2/vesting.proto index 0ad4479496..72b625d122 100644 --- a/proto/evmos/vesting/v2/vesting.proto +++ b/proto/evmos/vesting/v2/vesting.proto @@ -7,7 +7,7 @@ import "cosmos/vesting/v1beta1/vesting.proto"; import "gogoproto/gogo.proto"; import "google/protobuf/timestamp.proto"; -option go_package = "github.com/evmos/evmos/v18/x/vesting/types"; +option go_package = "github.com/evmos/evmos/v19/x/vesting/types"; // ClawbackVestingAccount implements the VestingAccount interface. It provides // an account that can hold contributions subject to "lockup" (like a diff --git a/rpc/apis.go b/rpc/apis.go index 2527ef3207..be131d9b74 100644 --- a/rpc/apis.go +++ b/rpc/apis.go @@ -10,16 +10,16 @@ import ( "github.com/ethereum/go-ethereum/rpc" - "github.com/evmos/evmos/v18/rpc/backend" - "github.com/evmos/evmos/v18/rpc/namespaces/ethereum/debug" - "github.com/evmos/evmos/v18/rpc/namespaces/ethereum/eth" - "github.com/evmos/evmos/v18/rpc/namespaces/ethereum/eth/filters" - "github.com/evmos/evmos/v18/rpc/namespaces/ethereum/miner" - "github.com/evmos/evmos/v18/rpc/namespaces/ethereum/net" - "github.com/evmos/evmos/v18/rpc/namespaces/ethereum/personal" - "github.com/evmos/evmos/v18/rpc/namespaces/ethereum/txpool" - "github.com/evmos/evmos/v18/rpc/namespaces/ethereum/web3" - "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v19/rpc/backend" + "github.com/evmos/evmos/v19/rpc/namespaces/ethereum/debug" + "github.com/evmos/evmos/v19/rpc/namespaces/ethereum/eth" + "github.com/evmos/evmos/v19/rpc/namespaces/ethereum/eth/filters" + "github.com/evmos/evmos/v19/rpc/namespaces/ethereum/miner" + "github.com/evmos/evmos/v19/rpc/namespaces/ethereum/net" + "github.com/evmos/evmos/v19/rpc/namespaces/ethereum/personal" + "github.com/evmos/evmos/v19/rpc/namespaces/ethereum/txpool" + "github.com/evmos/evmos/v19/rpc/namespaces/ethereum/web3" + "github.com/evmos/evmos/v19/types" rpcclient "github.com/cometbft/cometbft/rpc/jsonrpc/client" ) diff --git a/rpc/backend/account_info.go b/rpc/backend/account_info.go index 92812de6ac..2711a0e196 100644 --- a/rpc/backend/account_info.go +++ b/rpc/backend/account_info.go @@ -15,8 +15,8 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" - rpctypes "github.com/evmos/evmos/v18/rpc/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + rpctypes "github.com/evmos/evmos/v19/rpc/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" "github.com/pkg/errors" ) diff --git a/rpc/backend/account_info_test.go b/rpc/backend/account_info_test.go index 858cd1e1ec..67e0bcb50d 100644 --- a/rpc/backend/account_info_test.go +++ b/rpc/backend/account_info_test.go @@ -11,10 +11,10 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" "google.golang.org/grpc/metadata" - "github.com/evmos/evmos/v18/rpc/backend/mocks" - rpctypes "github.com/evmos/evmos/v18/rpc/types" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/rpc/backend/mocks" + rpctypes "github.com/evmos/evmos/v19/rpc/types" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func (suite *BackendTestSuite) TestGetCode() { diff --git a/rpc/backend/backend.go b/rpc/backend/backend.go index d5d38867c1..407028114e 100644 --- a/rpc/backend/backend.go +++ b/rpc/backend/backend.go @@ -20,10 +20,10 @@ import ( "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rpc" "github.com/ethereum/go-ethereum/signer/core/apitypes" - rpctypes "github.com/evmos/evmos/v18/rpc/types" - "github.com/evmos/evmos/v18/server/config" - evmostypes "github.com/evmos/evmos/v18/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + rpctypes "github.com/evmos/evmos/v19/rpc/types" + "github.com/evmos/evmos/v19/server/config" + evmostypes "github.com/evmos/evmos/v19/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) // BackendI implements the Cosmos and EVM backend. diff --git a/rpc/backend/backend_suite_test.go b/rpc/backend/backend_suite_test.go index eb3ec77713..f40ed3ddbf 100644 --- a/rpc/backend/backend_suite_test.go +++ b/rpc/backend/backend_suite_test.go @@ -18,15 +18,15 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/stretchr/testify/suite" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/crypto/hd" - "github.com/evmos/evmos/v18/encoding" - "github.com/evmos/evmos/v18/indexer" - "github.com/evmos/evmos/v18/rpc/backend/mocks" - rpctypes "github.com/evmos/evmos/v18/rpc/types" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/crypto/hd" + "github.com/evmos/evmos/v19/encoding" + "github.com/evmos/evmos/v19/indexer" + "github.com/evmos/evmos/v19/rpc/backend/mocks" + rpctypes "github.com/evmos/evmos/v19/rpc/types" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/utils" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) type BackendTestSuite struct { diff --git a/rpc/backend/blocks.go b/rpc/backend/blocks.go index cca4938390..50822a8f10 100644 --- a/rpc/backend/blocks.go +++ b/rpc/backend/blocks.go @@ -16,8 +16,8 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/trie" - rpctypes "github.com/evmos/evmos/v18/rpc/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + rpctypes "github.com/evmos/evmos/v19/rpc/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" "github.com/pkg/errors" "google.golang.org/grpc" "google.golang.org/grpc/metadata" diff --git a/rpc/backend/blocks_test.go b/rpc/backend/blocks_test.go index 44d8b7253d..39aa2de4a8 100644 --- a/rpc/backend/blocks_test.go +++ b/rpc/backend/blocks_test.go @@ -16,10 +16,10 @@ import ( "github.com/ethereum/go-ethereum/trie" "google.golang.org/grpc/metadata" - "github.com/evmos/evmos/v18/rpc/backend/mocks" - ethrpc "github.com/evmos/evmos/v18/rpc/types" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/rpc/backend/mocks" + ethrpc "github.com/evmos/evmos/v19/rpc/types" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func (suite *BackendTestSuite) TestBlockNumber() { diff --git a/rpc/backend/call_tx.go b/rpc/backend/call_tx.go index 9e72396706..19de62d4af 100644 --- a/rpc/backend/call_tx.go +++ b/rpc/backend/call_tx.go @@ -15,10 +15,10 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" - rpctypes "github.com/evmos/evmos/v18/rpc/types" - "github.com/evmos/evmos/v18/types" - "github.com/evmos/evmos/v18/x/evm/core/vm" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + rpctypes "github.com/evmos/evmos/v19/rpc/types" + "github.com/evmos/evmos/v19/types" + "github.com/evmos/evmos/v19/x/evm/core/vm" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" "github.com/pkg/errors" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" diff --git a/rpc/backend/call_tx_test.go b/rpc/backend/call_tx_test.go index 6eb81a6af1..6329ee4098 100644 --- a/rpc/backend/call_tx_test.go +++ b/rpc/backend/call_tx_test.go @@ -10,10 +10,10 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/rlp" - "github.com/evmos/evmos/v18/rpc/backend/mocks" - rpctypes "github.com/evmos/evmos/v18/rpc/types" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/rpc/backend/mocks" + rpctypes "github.com/evmos/evmos/v19/rpc/types" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" "google.golang.org/grpc/metadata" ) diff --git a/rpc/backend/chain_info.go b/rpc/backend/chain_info.go index f294cb7b94..04bea76f1d 100644 --- a/rpc/backend/chain_info.go +++ b/rpc/backend/chain_info.go @@ -15,10 +15,10 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rpc" - rpctypes "github.com/evmos/evmos/v18/rpc/types" - "github.com/evmos/evmos/v18/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" + rpctypes "github.com/evmos/evmos/v19/rpc/types" + "github.com/evmos/evmos/v19/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v19/x/feemarket/types" "github.com/pkg/errors" ) diff --git a/rpc/backend/chain_info_test.go b/rpc/backend/chain_info_test.go index bfb2717f8d..408f1e8ffe 100644 --- a/rpc/backend/chain_info_test.go +++ b/rpc/backend/chain_info_test.go @@ -15,11 +15,11 @@ import ( "github.com/cometbft/cometbft/abci/types" tmrpctypes "github.com/cometbft/cometbft/rpc/core/types" - "github.com/evmos/evmos/v18/rpc/backend/mocks" - rpc "github.com/evmos/evmos/v18/rpc/types" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" + "github.com/evmos/evmos/v19/rpc/backend/mocks" + rpc "github.com/evmos/evmos/v19/rpc/types" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v19/x/feemarket/types" ) func (suite *BackendTestSuite) TestBaseFee() { diff --git a/rpc/backend/client_test.go b/rpc/backend/client_test.go index e31f37b665..cb30fa3ada 100644 --- a/rpc/backend/client_test.go +++ b/rpc/backend/client_test.go @@ -15,9 +15,9 @@ import ( "github.com/cometbft/cometbft/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/rpc/backend/mocks" - rpc "github.com/evmos/evmos/v18/rpc/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/rpc/backend/mocks" + rpc "github.com/evmos/evmos/v19/rpc/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" mock "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" ) diff --git a/rpc/backend/evm_query_client_test.go b/rpc/backend/evm_query_client_test.go index 1d0f9c2942..2f77b28858 100644 --- a/rpc/backend/evm_query_client_test.go +++ b/rpc/backend/evm_query_client_test.go @@ -13,10 +13,10 @@ import ( errortypes "github.com/cosmos/cosmos-sdk/types/errors" grpctypes "github.com/cosmos/cosmos-sdk/types/grpc" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/rpc/backend/mocks" - rpc "github.com/evmos/evmos/v18/rpc/types" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/rpc/backend/mocks" + rpc "github.com/evmos/evmos/v19/rpc/types" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" mock "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" "google.golang.org/grpc" diff --git a/rpc/backend/feemarket_query_client_test.go b/rpc/backend/feemarket_query_client_test.go index 49d5ec2cf8..b81f252b0b 100644 --- a/rpc/backend/feemarket_query_client_test.go +++ b/rpc/backend/feemarket_query_client_test.go @@ -2,9 +2,9 @@ package backend import ( sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/evmos/evmos/v18/rpc/backend/mocks" - rpc "github.com/evmos/evmos/v18/rpc/types" - feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" + "github.com/evmos/evmos/v19/rpc/backend/mocks" + rpc "github.com/evmos/evmos/v19/rpc/types" + feemarkettypes "github.com/evmos/evmos/v19/x/feemarket/types" ) var _ feemarkettypes.QueryClient = &mocks.FeeMarketQueryClient{} diff --git a/rpc/backend/filters_test.go b/rpc/backend/filters_test.go index 5918033cd5..f89b72d7e6 100644 --- a/rpc/backend/filters_test.go +++ b/rpc/backend/filters_test.go @@ -6,9 +6,9 @@ import ( tmtypes "github.com/cometbft/cometbft/types" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v18/rpc/backend/mocks" - ethrpc "github.com/evmos/evmos/v18/rpc/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/rpc/backend/mocks" + ethrpc "github.com/evmos/evmos/v19/rpc/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func (suite *BackendTestSuite) TestGetLogs() { diff --git a/rpc/backend/mocks/evm_query_client.go b/rpc/backend/mocks/evm_query_client.go index f947c5208a..16da392c10 100644 --- a/rpc/backend/mocks/evm_query_client.go +++ b/rpc/backend/mocks/evm_query_client.go @@ -9,7 +9,7 @@ import ( mock "github.com/stretchr/testify/mock" - types "github.com/evmos/evmos/v18/x/evm/types" + types "github.com/evmos/evmos/v19/x/evm/types" ) // EVMQueryClient is an autogenerated mock type for the EVMQueryClient type diff --git a/rpc/backend/mocks/feemarket_query_client.go b/rpc/backend/mocks/feemarket_query_client.go index d6f9517cf4..7920588dbb 100644 --- a/rpc/backend/mocks/feemarket_query_client.go +++ b/rpc/backend/mocks/feemarket_query_client.go @@ -9,7 +9,7 @@ import ( mock "github.com/stretchr/testify/mock" - types "github.com/evmos/evmos/v18/x/feemarket/types" + types "github.com/evmos/evmos/v19/x/feemarket/types" ) // FeeMarketQueryClient is an autogenerated mock type for the QueryClient type diff --git a/rpc/backend/node_info.go b/rpc/backend/node_info.go index 7e6bde3849..610e939e23 100644 --- a/rpc/backend/node_info.go +++ b/rpc/backend/node_info.go @@ -22,11 +22,11 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" - rpctypes "github.com/evmos/evmos/v18/rpc/types" - "github.com/evmos/evmos/v18/server/config" - "github.com/evmos/evmos/v18/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" + rpctypes "github.com/evmos/evmos/v19/rpc/types" + "github.com/evmos/evmos/v19/server/config" + "github.com/evmos/evmos/v19/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) // Accounts returns the list of accounts available to this node. diff --git a/rpc/backend/node_info_test.go b/rpc/backend/node_info_test.go index 85fb583c9e..3e54159e32 100644 --- a/rpc/backend/node_info_test.go +++ b/rpc/backend/node_info_test.go @@ -10,9 +10,9 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" - "github.com/evmos/evmos/v18/rpc/backend/mocks" - "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" + "github.com/evmos/evmos/v19/rpc/backend/mocks" + "github.com/evmos/evmos/v19/types" "github.com/spf13/viper" "google.golang.org/grpc/metadata" ) diff --git a/rpc/backend/sign_tx.go b/rpc/backend/sign_tx.go index 8df2ea9eeb..6d6b7d7455 100644 --- a/rpc/backend/sign_tx.go +++ b/rpc/backend/sign_tx.go @@ -17,7 +17,7 @@ import ( "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/signer/core/apitypes" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) // SendTransaction sends transaction based on received args using Node's key to sign it diff --git a/rpc/backend/sign_tx_test.go b/rpc/backend/sign_tx_test.go index 95cfa807f2..903c829010 100644 --- a/rpc/backend/sign_tx_test.go +++ b/rpc/backend/sign_tx_test.go @@ -14,10 +14,10 @@ import ( "github.com/ethereum/go-ethereum/signer/core/apitypes" "google.golang.org/grpc/metadata" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" - "github.com/evmos/evmos/v18/rpc/backend/mocks" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" + "github.com/evmos/evmos/v19/rpc/backend/mocks" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func (suite *BackendTestSuite) TestSendTransaction() { diff --git a/rpc/backend/tracing.go b/rpc/backend/tracing.go index 89f817d0b2..f84b0c9d35 100644 --- a/rpc/backend/tracing.go +++ b/rpc/backend/tracing.go @@ -11,8 +11,8 @@ import ( tmrpctypes "github.com/cometbft/cometbft/rpc/core/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - rpctypes "github.com/evmos/evmos/v18/rpc/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + rpctypes "github.com/evmos/evmos/v19/rpc/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" "github.com/pkg/errors" ) diff --git a/rpc/backend/tracing_test.go b/rpc/backend/tracing_test.go index e04e2baf45..8faf7694d9 100644 --- a/rpc/backend/tracing_test.go +++ b/rpc/backend/tracing_test.go @@ -11,10 +11,10 @@ import ( "github.com/cosmos/cosmos-sdk/crypto" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" - "github.com/evmos/evmos/v18/indexer" - "github.com/evmos/evmos/v18/rpc/backend/mocks" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" + "github.com/evmos/evmos/v19/indexer" + "github.com/evmos/evmos/v19/rpc/backend/mocks" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func (suite *BackendTestSuite) TestTraceTransaction() { diff --git a/rpc/backend/tx_info.go b/rpc/backend/tx_info.go index 64ececed20..a67b51eb30 100644 --- a/rpc/backend/tx_info.go +++ b/rpc/backend/tx_info.go @@ -16,9 +16,9 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - rpctypes "github.com/evmos/evmos/v18/rpc/types" - "github.com/evmos/evmos/v18/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + rpctypes "github.com/evmos/evmos/v19/rpc/types" + "github.com/evmos/evmos/v19/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" "github.com/pkg/errors" ) diff --git a/rpc/backend/tx_info_test.go b/rpc/backend/tx_info_test.go index bc5cda271b..2f710fd5ac 100644 --- a/rpc/backend/tx_info_test.go +++ b/rpc/backend/tx_info_test.go @@ -12,11 +12,11 @@ import ( "github.com/cometbft/cometbft/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/evmos/evmos/v18/indexer" - "github.com/evmos/evmos/v18/rpc/backend/mocks" - rpctypes "github.com/evmos/evmos/v18/rpc/types" - evmostypes "github.com/evmos/evmos/v18/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/indexer" + "github.com/evmos/evmos/v19/rpc/backend/mocks" + rpctypes "github.com/evmos/evmos/v19/rpc/types" + evmostypes "github.com/evmos/evmos/v19/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" "google.golang.org/grpc/metadata" ) diff --git a/rpc/backend/utils.go b/rpc/backend/utils.go index 57ff78d60d..fb5e8b12d3 100644 --- a/rpc/backend/utils.go +++ b/rpc/backend/utils.go @@ -24,8 +24,8 @@ import ( tmrpctypes "github.com/cometbft/cometbft/rpc/core/types" "github.com/cometbft/cometbft/proto/tendermint/crypto" - "github.com/evmos/evmos/v18/rpc/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/rpc/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) type txGasAndReward struct { diff --git a/rpc/namespaces/ethereum/debug/api.go b/rpc/namespaces/ethereum/debug/api.go index c818716f9f..5b4e877464 100644 --- a/rpc/namespaces/ethereum/debug/api.go +++ b/rpc/namespaces/ethereum/debug/api.go @@ -16,7 +16,7 @@ import ( "github.com/davecgh/go-spew/spew" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" stderrors "github.com/pkg/errors" @@ -28,8 +28,8 @@ import ( "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/rlp" - "github.com/evmos/evmos/v18/rpc/backend" - rpctypes "github.com/evmos/evmos/v18/rpc/types" + "github.com/evmos/evmos/v19/rpc/backend" + rpctypes "github.com/evmos/evmos/v19/rpc/types" ) // HandlerT keeps track of the cpu profiler and trace execution diff --git a/rpc/namespaces/ethereum/eth/api.go b/rpc/namespaces/ethereum/eth/api.go index dc8fdd7a85..b1a62f65fe 100644 --- a/rpc/namespaces/ethereum/eth/api.go +++ b/rpc/namespaces/ethereum/eth/api.go @@ -15,11 +15,11 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v18/rpc/backend" + "github.com/evmos/evmos/v19/rpc/backend" - rpctypes "github.com/evmos/evmos/v18/rpc/types" - "github.com/evmos/evmos/v18/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + rpctypes "github.com/evmos/evmos/v19/rpc/types" + "github.com/evmos/evmos/v19/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) // The Ethereum API allows applications to connect to an Evmos node that is diff --git a/rpc/namespaces/ethereum/eth/filters/api.go b/rpc/namespaces/ethereum/eth/filters/api.go index 95e136b420..681e286432 100644 --- a/rpc/namespaces/ethereum/eth/filters/api.go +++ b/rpc/namespaces/ethereum/eth/filters/api.go @@ -9,7 +9,7 @@ import ( "time" "github.com/cosmos/cosmos-sdk/client" - "github.com/evmos/evmos/v18/rpc/types" + "github.com/evmos/evmos/v19/rpc/types" "github.com/cometbft/cometbft/libs/log" @@ -22,7 +22,7 @@ import ( "github.com/ethereum/go-ethereum/eth/filters" "github.com/ethereum/go-ethereum/rpc" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) // FilterAPI gathers diff --git a/rpc/namespaces/ethereum/eth/filters/filter_system.go b/rpc/namespaces/ethereum/eth/filters/filter_system.go index 12917c9b01..f9ed46edbc 100644 --- a/rpc/namespaces/ethereum/eth/filters/filter_system.go +++ b/rpc/namespaces/ethereum/eth/filters/filter_system.go @@ -24,8 +24,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/rpc/ethereum/pubsub" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/rpc/ethereum/pubsub" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) var ( diff --git a/rpc/namespaces/ethereum/eth/filters/filter_system_test.go b/rpc/namespaces/ethereum/eth/filters/filter_system_test.go index 28fe8c454f..90288a267d 100644 --- a/rpc/namespaces/ethereum/eth/filters/filter_system_test.go +++ b/rpc/namespaces/ethereum/eth/filters/filter_system_test.go @@ -13,7 +13,7 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth/filters" "github.com/ethereum/go-ethereum/rpc" - "github.com/evmos/evmos/v18/rpc/ethereum/pubsub" + "github.com/evmos/evmos/v19/rpc/ethereum/pubsub" ) func makeSubscription(id, event string) *Subscription { diff --git a/rpc/namespaces/ethereum/eth/filters/filters.go b/rpc/namespaces/ethereum/eth/filters/filters.go index 27894e4a5b..f30167c0c3 100644 --- a/rpc/namespaces/ethereum/eth/filters/filters.go +++ b/rpc/namespaces/ethereum/eth/filters/filters.go @@ -8,8 +8,8 @@ import ( "fmt" "math/big" - "github.com/evmos/evmos/v18/rpc/backend" - "github.com/evmos/evmos/v18/rpc/types" + "github.com/evmos/evmos/v19/rpc/backend" + "github.com/evmos/evmos/v19/rpc/types" "github.com/cometbft/cometbft/libs/log" tmrpctypes "github.com/cometbft/cometbft/rpc/core/types" diff --git a/rpc/namespaces/ethereum/miner/api.go b/rpc/namespaces/ethereum/miner/api.go index 066f322e8f..213c0319f7 100644 --- a/rpc/namespaces/ethereum/miner/api.go +++ b/rpc/namespaces/ethereum/miner/api.go @@ -4,7 +4,7 @@ package miner import ( "github.com/cosmos/cosmos-sdk/server" - "github.com/evmos/evmos/v18/rpc/backend" + "github.com/evmos/evmos/v19/rpc/backend" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" diff --git a/rpc/namespaces/ethereum/net/api.go b/rpc/namespaces/ethereum/net/api.go index a0b66e9766..84c6cd494d 100644 --- a/rpc/namespaces/ethereum/net/api.go +++ b/rpc/namespaces/ethereum/net/api.go @@ -8,7 +8,7 @@ import ( rpcclient "github.com/cometbft/cometbft/rpc/client" "github.com/cosmos/cosmos-sdk/client" - "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v19/types" ) // PublicAPI is the eth_ prefixed set of APIs in the Web3 JSON-RPC spec. diff --git a/rpc/namespaces/ethereum/personal/api.go b/rpc/namespaces/ethereum/personal/api.go index 6bfdcff763..9a5a8ae111 100644 --- a/rpc/namespaces/ethereum/personal/api.go +++ b/rpc/namespaces/ethereum/personal/api.go @@ -8,10 +8,10 @@ import ( "os" "time" - "github.com/evmos/evmos/v18/rpc/backend" + "github.com/evmos/evmos/v19/rpc/backend" - "github.com/evmos/evmos/v18/crypto/hd" - "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v19/crypto/hd" + "github.com/evmos/evmos/v19/types" "github.com/cometbft/cometbft/libs/log" @@ -23,7 +23,7 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/crypto" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) // PrivateAccountAPI is the personal_ prefixed set of APIs in the Web3 JSON-RPC spec. diff --git a/rpc/namespaces/ethereum/txpool/api.go b/rpc/namespaces/ethereum/txpool/api.go index b6c19120db..aa63b27892 100644 --- a/rpc/namespaces/ethereum/txpool/api.go +++ b/rpc/namespaces/ethereum/txpool/api.go @@ -7,7 +7,7 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/evmos/evmos/v18/rpc/types" + "github.com/evmos/evmos/v19/rpc/types" ) // PublicAPI offers and API for the transaction pool. It only operates on data that is non-confidential. diff --git a/rpc/namespaces/ethereum/web3/api.go b/rpc/namespaces/ethereum/web3/api.go index c7775992b1..7c600b1d01 100644 --- a/rpc/namespaces/ethereum/web3/api.go +++ b/rpc/namespaces/ethereum/web3/api.go @@ -3,7 +3,7 @@ package web3 import ( - "github.com/evmos/evmos/v18/version" + "github.com/evmos/evmos/v19/version" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/crypto" diff --git a/rpc/types/block.go b/rpc/types/block.go index 3ec852be97..57247bfaa4 100644 --- a/rpc/types/block.go +++ b/rpc/types/block.go @@ -19,7 +19,7 @@ import ( grpctypes "github.com/cosmos/cosmos-sdk/types/grpc" - "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v19/types" ) // BlockNumber represents decoding hex string to block values diff --git a/rpc/types/events.go b/rpc/types/events.go index 8096159a53..5a5210236c 100644 --- a/rpc/types/events.go +++ b/rpc/types/events.go @@ -10,8 +10,8 @@ import ( tmrpctypes "github.com/cometbft/cometbft/rpc/core/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) // EventFormat is the format version of the events. diff --git a/rpc/types/events_test.go b/rpc/types/events_test.go index c410babb22..d1ed6a7c70 100644 --- a/rpc/types/events_test.go +++ b/rpc/types/events_test.go @@ -6,7 +6,7 @@ import ( abci "github.com/cometbft/cometbft/abci/types" "github.com/ethereum/go-ethereum/common" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" "github.com/stretchr/testify/require" ) diff --git a/rpc/types/query_client.go b/rpc/types/query_client.go index 02d883ce26..910028cd7b 100644 --- a/rpc/types/query_client.go +++ b/rpc/types/query_client.go @@ -12,8 +12,8 @@ import ( "github.com/cosmos/cosmos-sdk/client" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v19/x/feemarket/types" ) // QueryClient defines a gRPC Client used for: diff --git a/rpc/types/utils.go b/rpc/types/utils.go index 4fff4da2bd..3bcaf15b88 100644 --- a/rpc/types/utils.go +++ b/rpc/types/utils.go @@ -16,8 +16,8 @@ import ( "github.com/cosmos/cosmos-sdk/client" errortypes "github.com/cosmos/cosmos-sdk/types/errors" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v19/x/feemarket/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" diff --git a/rpc/websockets.go b/rpc/websockets.go index 3859f14920..6afaa545f1 100644 --- a/rpc/websockets.go +++ b/rpc/websockets.go @@ -29,11 +29,11 @@ import ( rpcclient "github.com/cometbft/cometbft/rpc/jsonrpc/client" tmtypes "github.com/cometbft/cometbft/types" - "github.com/evmos/evmos/v18/rpc/ethereum/pubsub" - rpcfilters "github.com/evmos/evmos/v18/rpc/namespaces/ethereum/eth/filters" - "github.com/evmos/evmos/v18/rpc/types" - "github.com/evmos/evmos/v18/server/config" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/rpc/ethereum/pubsub" + rpcfilters "github.com/evmos/evmos/v19/rpc/namespaces/ethereum/eth/filters" + "github.com/evmos/evmos/v19/rpc/types" + "github.com/evmos/evmos/v19/server/config" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) type WebsocketsServer interface { diff --git a/server/config/config_test.go b/server/config/config_test.go index 58432d0642..5be2b63ea7 100644 --- a/server/config/config_test.go +++ b/server/config/config_test.go @@ -8,7 +8,7 @@ import ( "github.com/spf13/viper" "github.com/stretchr/testify/require" - evmostypes "github.com/evmos/evmos/v18/types" + evmostypes "github.com/evmos/evmos/v19/types" ) func TestDefaultConfig(t *testing.T) { diff --git a/server/indexer_cmd.go b/server/indexer_cmd.go index 867f359ee4..38dd760ce4 100644 --- a/server/indexer_cmd.go +++ b/server/indexer_cmd.go @@ -12,7 +12,7 @@ import ( tmstore "github.com/cometbft/cometbft/store" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/server" - "github.com/evmos/evmos/v18/indexer" + "github.com/evmos/evmos/v19/indexer" ) func NewIndexTxCmd() *cobra.Command { diff --git a/server/indexer_service.go b/server/indexer_service.go index dd2806e20d..41279bcb79 100644 --- a/server/indexer_service.go +++ b/server/indexer_service.go @@ -10,7 +10,7 @@ import ( rpcclient "github.com/cometbft/cometbft/rpc/client" "github.com/cometbft/cometbft/types" - evmostypes "github.com/evmos/evmos/v18/types" + evmostypes "github.com/evmos/evmos/v19/types" ) const ( diff --git a/server/json_rpc.go b/server/json_rpc.go index 19e443b3fd..07199b0e12 100644 --- a/server/json_rpc.go +++ b/server/json_rpc.go @@ -14,10 +14,10 @@ import ( "github.com/cosmos/cosmos-sdk/server/types" ethlog "github.com/ethereum/go-ethereum/log" ethrpc "github.com/ethereum/go-ethereum/rpc" - "github.com/evmos/evmos/v18/rpc" + "github.com/evmos/evmos/v19/rpc" - "github.com/evmos/evmos/v18/server/config" - evmostypes "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v19/server/config" + evmostypes "github.com/evmos/evmos/v19/types" ) // StartJSONRPC starts the JSON-RPC server diff --git a/server/start.go b/server/start.go index 9273559060..b7f579766f 100644 --- a/server/start.go +++ b/server/start.go @@ -49,12 +49,12 @@ import ( pruningtypes "github.com/cosmos/cosmos-sdk/store/pruning/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/cmd/evmosd/opendb" - "github.com/evmos/evmos/v18/indexer" - ethdebug "github.com/evmos/evmos/v18/rpc/namespaces/ethereum/debug" - "github.com/evmos/evmos/v18/server/config" - srvflags "github.com/evmos/evmos/v18/server/flags" - evmostypes "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v19/cmd/evmosd/opendb" + "github.com/evmos/evmos/v19/indexer" + ethdebug "github.com/evmos/evmos/v19/rpc/namespaces/ethereum/debug" + "github.com/evmos/evmos/v19/server/config" + srvflags "github.com/evmos/evmos/v19/server/flags" + evmostypes "github.com/evmos/evmos/v19/types" ) // DBOpener is a function to open `application.db`, potentially with customized options. diff --git a/server/util.go b/server/util.go index 818beeffd3..1732fe4bbc 100644 --- a/server/util.go +++ b/server/util.go @@ -8,7 +8,7 @@ import ( "time" // TODO update import to local pkg when rpc pkg is migrated - "github.com/evmos/evmos/v18/server/config" + "github.com/evmos/evmos/v19/server/config" "github.com/gorilla/mux" "github.com/improbable-eng/grpc-web/go/grpcweb" "github.com/spf13/cobra" diff --git a/tests/e2e/e2e_suite_test.go b/tests/e2e/e2e_suite_test.go index 19a2bc2424..5eeddfe56a 100644 --- a/tests/e2e/e2e_suite_test.go +++ b/tests/e2e/e2e_suite_test.go @@ -10,10 +10,10 @@ import ( "github.com/cosmos/cosmos-sdk/codec" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/encoding" - "github.com/evmos/evmos/v18/tests/e2e/upgrade" - "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/encoding" + "github.com/evmos/evmos/v19/tests/e2e/upgrade" + "github.com/evmos/evmos/v19/utils" "github.com/stretchr/testify/suite" ) diff --git a/tests/e2e/tx_test.go b/tests/e2e/tx_test.go index 614144e99a..78253cd6c4 100644 --- a/tests/e2e/tx_test.go +++ b/tests/e2e/tx_test.go @@ -8,8 +8,8 @@ import ( "regexp" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/tests/e2e/upgrade" - "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v19/tests/e2e/upgrade" + "github.com/evmos/evmos/v19/utils" ) // executeTransactions executes some sample transactions to check they are still working after the upgrade. diff --git a/tests/e2e/upgrade/balances_test.go b/tests/e2e/upgrade/balances_test.go index a5aa4dbcf7..ac7da711d4 100644 --- a/tests/e2e/upgrade/balances_test.go +++ b/tests/e2e/upgrade/balances_test.go @@ -6,9 +6,9 @@ import ( "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/encoding" - "github.com/evmos/evmos/v18/tests/e2e/upgrade" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/encoding" + "github.com/evmos/evmos/v19/tests/e2e/upgrade" "github.com/stretchr/testify/require" ) diff --git a/tests/e2e/upgrade/manager.go b/tests/e2e/upgrade/manager.go index e010d4cb08..d9572e2431 100644 --- a/tests/e2e/upgrade/manager.go +++ b/tests/e2e/upgrade/manager.go @@ -19,8 +19,8 @@ import ( errorsmod "cosmossdk.io/errors" "github.com/cosmos/cosmos-sdk/codec" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/encoding" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/encoding" "github.com/ory/dockertest/v3" "github.com/ory/dockertest/v3/docker" ) diff --git a/tests/integration/ledger/evmosd_suite_test.go b/tests/integration/ledger/evmosd_suite_test.go index 628f3cdecc..dd808ada58 100644 --- a/tests/integration/ledger/evmosd_suite_test.go +++ b/tests/integration/ledger/evmosd_suite_test.go @@ -20,11 +20,11 @@ import ( "github.com/cometbft/cometbft/crypto/tmhash" "github.com/cometbft/cometbft/version" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/crypto/hd" - "github.com/evmos/evmos/v18/tests/integration/ledger/mocks" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/crypto/hd" + "github.com/evmos/evmos/v19/tests/integration/ledger/mocks" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/utils" "github.com/stretchr/testify/suite" tmproto "github.com/cometbft/cometbft/proto/tendermint/types" @@ -32,9 +32,9 @@ import ( rpcclientmock "github.com/cometbft/cometbft/rpc/client/mock" cosmosledger "github.com/cosmos/cosmos-sdk/crypto/ledger" sdk "github.com/cosmos/cosmos-sdk/types" - clientkeys "github.com/evmos/evmos/v18/client/keys" - evmoskeyring "github.com/evmos/evmos/v18/crypto/keyring" - feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" + clientkeys "github.com/evmos/evmos/v19/client/keys" + evmoskeyring "github.com/evmos/evmos/v19/crypto/keyring" + feemarkettypes "github.com/evmos/evmos/v19/x/feemarket/types" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" diff --git a/tests/integration/ledger/ledger_test.go b/tests/integration/ledger/ledger_test.go index 56e9fe1048..e138974ba2 100644 --- a/tests/integration/ledger/ledger_test.go +++ b/tests/integration/ledger/ledger_test.go @@ -10,12 +10,12 @@ import ( "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/crypto/keyring" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/crypto/hd" - "github.com/evmos/evmos/v18/encoding" - "github.com/evmos/evmos/v18/tests/integration/ledger/mocks" - "github.com/evmos/evmos/v18/testutil" - utiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/crypto/hd" + "github.com/evmos/evmos/v19/encoding" + "github.com/evmos/evmos/v19/tests/integration/ledger/mocks" + "github.com/evmos/evmos/v19/testutil" + utiltx "github.com/evmos/evmos/v19/testutil/tx" "github.com/spf13/cobra" diff --git a/testutil/abci.go b/testutil/abci.go index 96997b5042..c981bea42a 100644 --- a/testutil/abci.go +++ b/testutil/abci.go @@ -14,9 +14,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/encoding" - "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/encoding" + "github.com/evmos/evmos/v19/testutil/tx" ) // Commit commits a block at a given time. Reminder: At the end of each diff --git a/testutil/ante.go b/testutil/ante.go index 38e37b6c83..8bbeda76ea 100644 --- a/testutil/ante.go +++ b/testutil/ante.go @@ -4,8 +4,8 @@ package testutil import ( sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/encoding" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/encoding" ) // NextFn is a no-op function that returns the context and no error in order to mock diff --git a/testutil/contract.go b/testutil/contract.go index a031a30b89..7eedd7eaee 100644 --- a/testutil/contract.go +++ b/testutil/contract.go @@ -18,9 +18,9 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/testutil/tx" - evm "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/testutil/tx" + evm "github.com/evmos/evmos/v19/x/evm/types" ) // ContractArgs are the params used for calling a smart contract. diff --git a/testutil/fund.go b/testutil/fund.go index fcad22386a..142cecbbdf 100644 --- a/testutil/fund.go +++ b/testutil/fund.go @@ -7,8 +7,8 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - "github.com/evmos/evmos/v18/utils" - inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" + "github.com/evmos/evmos/v19/utils" + inflationtypes "github.com/evmos/evmos/v19/x/inflation/v1/types" ) // FundAccount is a utility function that funds an account by minting and diff --git a/testutil/integration.go b/testutil/integration.go index aa2106c843..05e18cfb29 100644 --- a/testutil/integration.go +++ b/testutil/integration.go @@ -13,8 +13,8 @@ import ( govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" ) // SubmitProposal delivers a submit proposal tx for a given gov content. diff --git a/testutil/integration/common/factory/factory.go b/testutil/integration/common/factory/factory.go index 5efce1f7ff..68fd55eaf5 100644 --- a/testutil/integration/common/factory/factory.go +++ b/testutil/integration/common/factory/factory.go @@ -8,8 +8,8 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" testutiltypes "github.com/cosmos/cosmos-sdk/types/module/testutil" "github.com/cosmos/cosmos-sdk/x/auth/signing" - "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" - "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + "github.com/evmos/evmos/v19/testutil/integration/evmos/grpc" + "github.com/evmos/evmos/v19/testutil/integration/evmos/network" errorsmod "cosmossdk.io/errors" ) diff --git a/testutil/integration/common/grpc/account.go b/testutil/integration/common/grpc/account.go index f5a04c3f9b..b1b95d4fdc 100644 --- a/testutil/integration/common/grpc/account.go +++ b/testutil/integration/common/grpc/account.go @@ -6,8 +6,8 @@ import ( "context" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/encoding" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/encoding" ) // GetAccount returns the account for the given address. diff --git a/testutil/integration/common/grpc/authz.go b/testutil/integration/common/grpc/authz.go index 70313d0589..90a9fe0222 100644 --- a/testutil/integration/common/grpc/authz.go +++ b/testutil/integration/common/grpc/authz.go @@ -7,8 +7,8 @@ import ( "context" "github.com/cosmos/cosmos-sdk/x/authz" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/encoding" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/encoding" ) // GetGrants returns the grants for the given grantee and granter combination. diff --git a/testutil/integration/common/grpc/grpc.go b/testutil/integration/common/grpc/grpc.go index ec050e8bcf..d0856af4e2 100644 --- a/testutil/integration/common/grpc/grpc.go +++ b/testutil/integration/common/grpc/grpc.go @@ -9,7 +9,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/authz" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v18/testutil/integration/common/network" + "github.com/evmos/evmos/v19/testutil/integration/common/network" ) // Handler is an interface that defines the common methods that are used to query diff --git a/testutil/integration/evmos/factory/broadcast.go b/testutil/integration/evmos/factory/broadcast.go index 55c090a7d1..16c71a0675 100644 --- a/testutil/integration/evmos/factory/broadcast.go +++ b/testutil/integration/evmos/factory/broadcast.go @@ -8,8 +8,8 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v18/precompiles/testutil" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/precompiles/testutil" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) // ExecuteEthTx executes an Ethereum transaction - contract call with the provided private key and txArgs diff --git a/testutil/integration/evmos/factory/build.go b/testutil/integration/evmos/factory/build.go index c040f3837d..3e6bb29513 100644 --- a/testutil/integration/evmos/factory/build.go +++ b/testutil/integration/evmos/factory/build.go @@ -14,8 +14,8 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core" gethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v18/server/config" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/server/config" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func (tf *IntegrationTxFactory) GenerateDefaultTxTypeArgs(sender common.Address, txType int) (evmtypes.EvmTxArgs, error) { diff --git a/testutil/integration/evmos/factory/factory.go b/testutil/integration/evmos/factory/factory.go index e588d99714..f0c1d7fd1f 100644 --- a/testutil/integration/evmos/factory/factory.go +++ b/testutil/integration/evmos/factory/factory.go @@ -16,13 +16,13 @@ import ( "github.com/cosmos/gogoproto/proto" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/precompiles/testutil" - commonfactory "github.com/evmos/evmos/v18/testutil/integration/common/factory" - "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" - "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - "github.com/evmos/evmos/v18/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/precompiles/testutil" + commonfactory "github.com/evmos/evmos/v19/testutil/integration/common/factory" + "github.com/evmos/evmos/v19/testutil/integration/evmos/grpc" + "github.com/evmos/evmos/v19/testutil/integration/evmos/network" + "github.com/evmos/evmos/v19/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) // TxFactory defines a struct that can build and broadcast transactions for the Evmos diff --git a/testutil/integration/evmos/factory/helpers.go b/testutil/integration/evmos/factory/helpers.go index 4e377bed5e..6aad307118 100644 --- a/testutil/integration/evmos/factory/helpers.go +++ b/testutil/integration/evmos/factory/helpers.go @@ -6,7 +6,7 @@ import ( "strings" "github.com/ethereum/go-ethereum/common" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" errorsmod "cosmossdk.io/errors" amino "github.com/cosmos/cosmos-sdk/codec" @@ -14,8 +14,8 @@ import ( "github.com/cosmos/cosmos-sdk/types/module" testutiltypes "github.com/cosmos/cosmos-sdk/types/module/testutil" authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" - enccodec "github.com/evmos/evmos/v18/encoding/codec" - "github.com/evmos/evmos/v18/precompiles/testutil" + enccodec "github.com/evmos/evmos/v19/encoding/codec" + "github.com/evmos/evmos/v19/precompiles/testutil" ) // buildMsgEthereumTx builds an Ethereum transaction from the given arguments and populates the From field. diff --git a/testutil/integration/evmos/factory/sign.go b/testutil/integration/evmos/factory/sign.go index 12a136e76f..78936ed3f4 100644 --- a/testutil/integration/evmos/factory/sign.go +++ b/testutil/integration/evmos/factory/sign.go @@ -6,8 +6,8 @@ import ( errorsmod "cosmossdk.io/errors" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" gethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v18/testutil/tx" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/testutil/tx" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) // SignMsgEthereumTx signs a MsgEthereumTx with the provided private key and chainID. diff --git a/testutil/integration/evmos/factory/types.go b/testutil/integration/evmos/factory/types.go index 16ec5a3abf..29d1589fb7 100644 --- a/testutil/integration/evmos/factory/types.go +++ b/testutil/integration/evmos/factory/types.go @@ -6,7 +6,7 @@ import ( sdkmath "cosmossdk.io/math" sdktypes "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/accounts/abi" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) // CosmosTxArgs contains the params to create a cosmos tx diff --git a/testutil/integration/evmos/grpc/evm.go b/testutil/integration/evmos/grpc/evm.go index a3ad332856..ab73c21d3e 100644 --- a/testutil/integration/evmos/grpc/evm.go +++ b/testutil/integration/evmos/grpc/evm.go @@ -6,7 +6,7 @@ import ( "context" "github.com/ethereum/go-ethereum/common" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) // GetEvmAccount returns the EVM account for the given address. diff --git a/testutil/integration/evmos/grpc/feemarket.go b/testutil/integration/evmos/grpc/feemarket.go index 869ffc3fc3..cd8505a804 100644 --- a/testutil/integration/evmos/grpc/feemarket.go +++ b/testutil/integration/evmos/grpc/feemarket.go @@ -5,7 +5,7 @@ package grpc import ( "context" - feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" + feemarkettypes "github.com/evmos/evmos/v19/x/feemarket/types" ) // GetBaseFee returns the base fee from the feemarket module. diff --git a/testutil/integration/evmos/grpc/grpc.go b/testutil/integration/evmos/grpc/grpc.go index 3d1bc58505..d5353a7e97 100644 --- a/testutil/integration/evmos/grpc/grpc.go +++ b/testutil/integration/evmos/grpc/grpc.go @@ -6,10 +6,10 @@ package grpc import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1" "github.com/ethereum/go-ethereum/common" - commongrpc "github.com/evmos/evmos/v18/testutil/integration/common/grpc" - "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" + commongrpc "github.com/evmos/evmos/v19/testutil/integration/common/grpc" + "github.com/evmos/evmos/v19/testutil/integration/evmos/network" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v19/x/feemarket/types" ) // Handler is an interface that defines the methods that are used to query diff --git a/testutil/integration/evmos/keyring/keyring.go b/testutil/integration/evmos/keyring/keyring.go index be8c1fa69d..b2b14b5ca6 100644 --- a/testutil/integration/evmos/keyring/keyring.go +++ b/testutil/integration/evmos/keyring/keyring.go @@ -9,7 +9,7 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdktypes "github.com/cosmos/cosmos-sdk/types" - utiltx "github.com/evmos/evmos/v18/testutil/tx" + utiltx "github.com/evmos/evmos/v19/testutil/tx" ) type Key struct { diff --git a/testutil/integration/evmos/network/clients.go b/testutil/integration/evmos/network/clients.go index 655529d33b..9c89a89518 100644 --- a/testutil/integration/evmos/network/clients.go +++ b/testutil/integration/evmos/network/clients.go @@ -11,12 +11,12 @@ import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/encoding" - erc20types "github.com/evmos/evmos/v18/x/erc20/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" - infltypes "github.com/evmos/evmos/v18/x/inflation/v1/types" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/encoding" + erc20types "github.com/evmos/evmos/v19/x/erc20/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v19/x/feemarket/types" + infltypes "github.com/evmos/evmos/v19/x/inflation/v1/types" ) func getQueryHelper(ctx sdktypes.Context) *baseapp.QueryServiceTestHelper { diff --git a/testutil/integration/evmos/network/config.go b/testutil/integration/evmos/network/config.go index e197fbea45..309e3518fd 100644 --- a/testutil/integration/evmos/network/config.go +++ b/testutil/integration/evmos/network/config.go @@ -9,9 +9,9 @@ import ( sdktypes "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - testtx "github.com/evmos/evmos/v18/testutil/tx" - evmostypes "github.com/evmos/evmos/v18/types" - "github.com/evmos/evmos/v18/utils" + testtx "github.com/evmos/evmos/v19/testutil/tx" + evmostypes "github.com/evmos/evmos/v19/types" + "github.com/evmos/evmos/v19/utils" ) // Config defines the configuration for a chain. diff --git a/testutil/integration/evmos/network/config_test.go b/testutil/integration/evmos/network/config_test.go index 068e307ff1..cc8a8ba439 100644 --- a/testutil/integration/evmos/network/config_test.go +++ b/testutil/integration/evmos/network/config_test.go @@ -8,10 +8,10 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - grpchandler "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - "github.com/evmos/evmos/v18/utils" + grpchandler "github.com/evmos/evmos/v19/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v19/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v19/testutil/integration/evmos/network" + "github.com/evmos/evmos/v19/utils" "github.com/stretchr/testify/require" ) diff --git a/testutil/integration/evmos/network/network.go b/testutil/integration/evmos/network/network.go index fc66d56788..cc085e6397 100644 --- a/testutil/integration/evmos/network/network.go +++ b/testutil/integration/evmos/network/network.go @@ -12,8 +12,8 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" gethparams "github.com/ethereum/go-ethereum/params" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/types" abcitypes "github.com/cometbft/cometbft/abci/types" tmproto "github.com/cometbft/cometbft/proto/tendermint/types" @@ -22,11 +22,11 @@ import ( txtypes "github.com/cosmos/cosmos-sdk/types/tx" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - commonnetwork "github.com/evmos/evmos/v18/testutil/integration/common/network" - erc20types "github.com/evmos/evmos/v18/x/erc20/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" - infltypes "github.com/evmos/evmos/v18/x/inflation/v1/types" + commonnetwork "github.com/evmos/evmos/v19/testutil/integration/common/network" + erc20types "github.com/evmos/evmos/v19/x/erc20/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v19/x/feemarket/types" + infltypes "github.com/evmos/evmos/v19/x/inflation/v1/types" ) // Network is the interface that wraps the methods to interact with integration test network. diff --git a/testutil/integration/evmos/network/params.go b/testutil/integration/evmos/network/params.go index 0101864f9b..8ea2a15fd5 100644 --- a/testutil/integration/evmos/network/params.go +++ b/testutil/integration/evmos/network/params.go @@ -5,9 +5,9 @@ package network import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" - feemarketypes "github.com/evmos/evmos/v18/x/feemarket/types" - infltypes "github.com/evmos/evmos/v18/x/inflation/v1/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" + feemarketypes "github.com/evmos/evmos/v19/x/feemarket/types" + infltypes "github.com/evmos/evmos/v19/x/inflation/v1/types" ) func (n *IntegrationNetwork) UpdateEvmParams(params evmtypes.Params) error { diff --git a/testutil/integration/evmos/network/setup.go b/testutil/integration/evmos/network/setup.go index 2594cbb74b..638aaeb4c4 100644 --- a/testutil/integration/evmos/network/setup.go +++ b/testutil/integration/evmos/network/setup.go @@ -7,8 +7,8 @@ import ( "fmt" "time" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/encoding" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/encoding" "cosmossdk.io/simapp" "github.com/cosmos/cosmos-sdk/baseapp" @@ -28,12 +28,12 @@ import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" govtypesv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - epochstypes "github.com/evmos/evmos/v18/x/epochs/types" - erc20types "github.com/evmos/evmos/v18/x/erc20/types" - infltypes "github.com/evmos/evmos/v18/x/inflation/v1/types" + epochstypes "github.com/evmos/evmos/v19/x/epochs/types" + erc20types "github.com/evmos/evmos/v19/x/erc20/types" + infltypes "github.com/evmos/evmos/v19/x/inflation/v1/types" - evmosutil "github.com/evmos/evmos/v18/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + evmosutil "github.com/evmos/evmos/v19/utils" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) // createValidatorSetAndSigners creates validator set with the amount of validators specified diff --git a/testutil/integration/evmos/network/unit_network.go b/testutil/integration/evmos/network/unit_network.go index 3d919aaa53..47e9e8ca49 100644 --- a/testutil/integration/evmos/network/unit_network.go +++ b/testutil/integration/evmos/network/unit_network.go @@ -5,9 +5,9 @@ package network import ( sdktypes "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/x/evm/statedb" - inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/x/evm/statedb" + inflationtypes "github.com/evmos/evmos/v19/x/inflation/v1/types" ) // UnitTestNetwork is the implementation of the Network interface for unit tests. diff --git a/testutil/integration/evmos/utils/bank.go b/testutil/integration/evmos/utils/bank.go index 42ecf95024..162bf7a9cf 100644 --- a/testutil/integration/evmos/utils/bank.go +++ b/testutil/integration/evmos/utils/bank.go @@ -7,7 +7,7 @@ import ( "fmt" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/evmos/evmos/v18/testutil/integration/common/grpc" + "github.com/evmos/evmos/v19/testutil/integration/common/grpc" ) // CheckBalances checks that the given accounts have the expected balances and diff --git a/testutil/integration/evmos/utils/bank_test.go b/testutil/integration/evmos/utils/bank_test.go index 169d7dea3a..af4503857b 100644 --- a/testutil/integration/evmos/utils/bank_test.go +++ b/testutil/integration/evmos/utils/bank_test.go @@ -6,10 +6,10 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - grpchandler "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - "github.com/evmos/evmos/v18/testutil/integration/evmos/utils" + grpchandler "github.com/evmos/evmos/v19/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v19/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v19/testutil/integration/evmos/network" + "github.com/evmos/evmos/v19/testutil/integration/evmos/utils" "github.com/stretchr/testify/require" ) diff --git a/testutil/integration/evmos/utils/contracts.go b/testutil/integration/evmos/utils/contracts.go index 529e64e9e8..c3067f3e61 100644 --- a/testutil/integration/evmos/utils/contracts.go +++ b/testutil/integration/evmos/utils/contracts.go @@ -6,10 +6,10 @@ import ( "fmt" "slices" - "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v19/testutil/integration/evmos/factory" abcitypes "github.com/cometbft/cometbft/abci/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) // CheckTxTopics checks if all expected topics are present in the transaction response diff --git a/testutil/integration/evmos/utils/erc20.go b/testutil/integration/evmos/utils/erc20.go index 98fabddd94..0385a28d59 100644 --- a/testutil/integration/evmos/utils/erc20.go +++ b/testutil/integration/evmos/utils/erc20.go @@ -10,9 +10,9 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - erc20types "github.com/evmos/evmos/v18/x/erc20/types" + "github.com/evmos/evmos/v19/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v19/testutil/integration/evmos/network" + erc20types "github.com/evmos/evmos/v19/x/erc20/types" ) // ERC20RegistrationData is the necessary data to provide in order to register an ERC20 token. diff --git a/testutil/integration/evmos/utils/evm.go b/testutil/integration/evmos/utils/evm.go index a042adc5c8..6890946301 100644 --- a/testutil/integration/evmos/utils/evm.go +++ b/testutil/integration/evmos/utils/evm.go @@ -9,9 +9,9 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/evmos/evmos/v18/contracts" - "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/contracts" + "github.com/evmos/evmos/v19/testutil/integration/evmos/network" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) // GetERC20Balance returns the token balance of a given account address for diff --git a/testutil/integration/evmos/utils/evm_test.go b/testutil/integration/evmos/utils/evm_test.go index 5a817746bf..f5545c1a85 100644 --- a/testutil/integration/evmos/utils/evm_test.go +++ b/testutil/integration/evmos/utils/evm_test.go @@ -5,13 +5,13 @@ import ( "testing" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/contracts" - testfactory "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" - testhandler "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" - testnetwork "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - "github.com/evmos/evmos/v18/testutil/integration/evmos/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/contracts" + testfactory "github.com/evmos/evmos/v19/testutil/integration/evmos/factory" + testhandler "github.com/evmos/evmos/v19/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v19/testutil/integration/evmos/keyring" + testnetwork "github.com/evmos/evmos/v19/testutil/integration/evmos/network" + "github.com/evmos/evmos/v19/testutil/integration/evmos/utils" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" "github.com/stretchr/testify/require" ) diff --git a/testutil/integration/evmos/utils/genesis.go b/testutil/integration/evmos/utils/genesis.go index de3a85efd9..5f04351512 100644 --- a/testutil/integration/evmos/utils/genesis.go +++ b/testutil/integration/evmos/utils/genesis.go @@ -6,11 +6,11 @@ package utils import ( codectypes "github.com/cosmos/cosmos-sdk/codec/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - "github.com/evmos/evmos/v18/utils" - erc20types "github.com/evmos/evmos/v18/x/erc20/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + testkeyring "github.com/evmos/evmos/v19/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v19/testutil/integration/evmos/network" + "github.com/evmos/evmos/v19/utils" + erc20types "github.com/evmos/evmos/v19/x/erc20/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) const ( diff --git a/testutil/integration/evmos/utils/gov.go b/testutil/integration/evmos/utils/gov.go index 6abdaa6d1f..912f1769a4 100644 --- a/testutil/integration/evmos/utils/gov.go +++ b/testutil/integration/evmos/utils/gov.go @@ -16,9 +16,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" - commonfactory "github.com/evmos/evmos/v18/testutil/integration/common/factory" - "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v18/testutil/integration/evmos/network" + commonfactory "github.com/evmos/evmos/v19/testutil/integration/common/factory" + "github.com/evmos/evmos/v19/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v19/testutil/integration/evmos/network" ) // SubmitProposal is a helper function to submit a governance proposal and diff --git a/testutil/integration/evmos/utils/unit.go b/testutil/integration/evmos/utils/unit.go index 7f0fec70a7..a4f540b2a9 100644 --- a/testutil/integration/evmos/utils/unit.go +++ b/testutil/integration/evmos/utils/unit.go @@ -9,14 +9,14 @@ import ( "fmt" "cosmossdk.io/math" - "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v19/utils" sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - erc20types "github.com/evmos/evmos/v18/x/erc20/types" - inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" + "github.com/evmos/evmos/v19/testutil/integration/evmos/network" + erc20types "github.com/evmos/evmos/v19/x/erc20/types" + inflationtypes "github.com/evmos/evmos/v19/x/inflation/v1/types" ) const ( diff --git a/testutil/integration/ibc/coordinator/coordinator.go b/testutil/integration/ibc/coordinator/coordinator.go index 1af299d2eb..98226f7ec8 100644 --- a/testutil/integration/ibc/coordinator/coordinator.go +++ b/testutil/integration/ibc/coordinator/coordinator.go @@ -9,9 +9,9 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" ibctesting "github.com/cosmos/ibc-go/v7/testing" - evmosibc "github.com/evmos/evmos/v18/ibc/testing" - "github.com/evmos/evmos/v18/testutil/integration/common/network" - ibcchain "github.com/evmos/evmos/v18/testutil/integration/ibc/chain" + evmosibc "github.com/evmos/evmos/v19/ibc/testing" + "github.com/evmos/evmos/v19/testutil/integration/common/network" + ibcchain "github.com/evmos/evmos/v19/testutil/integration/ibc/chain" ) // Coordinator is the interface that defines the methods that are used to diff --git a/testutil/integration/ibc/coordinator/utils.go b/testutil/integration/ibc/coordinator/utils.go index faf57a3f3d..f097053b97 100644 --- a/testutil/integration/ibc/coordinator/utils.go +++ b/testutil/integration/ibc/coordinator/utils.go @@ -7,7 +7,7 @@ import ( "testing" ibctesting "github.com/cosmos/ibc-go/v7/testing" - "github.com/evmos/evmos/v18/testutil/integration/common/network" + "github.com/evmos/evmos/v19/testutil/integration/common/network" ) // getIBCChains returns a map of TestChain's for the given network interface. diff --git a/testutil/network/network.go b/testutil/network/network.go index f63b32f496..4650980f41 100644 --- a/testutil/network/network.go +++ b/testutil/network/network.go @@ -51,12 +51,12 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/cosmos/cosmos-sdk/x/genutil" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/crypto/hd" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/crypto/hd" - "github.com/evmos/evmos/v18/encoding" - "github.com/evmos/evmos/v18/server/config" - evmostypes "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v19/encoding" + "github.com/evmos/evmos/v19/server/config" + evmostypes "github.com/evmos/evmos/v19/types" ) // package-wide network lock to only allow one test network at a time diff --git a/testutil/network/network_test.go b/testutil/network/network_test.go index f9246a9507..e6751beb5b 100644 --- a/testutil/network/network_test.go +++ b/testutil/network/network_test.go @@ -11,10 +11,10 @@ import ( "github.com/stretchr/testify/suite" "github.com/ethereum/go-ethereum/ethclient" - "github.com/evmos/evmos/v18/server/config" - "github.com/evmos/evmos/v18/testutil/network" + "github.com/evmos/evmos/v19/server/config" + "github.com/evmos/evmos/v19/testutil/network" - evmosnetwork "github.com/evmos/evmos/v18/testutil/network" + evmosnetwork "github.com/evmos/evmos/v19/testutil/network" ) type IntegrationTestSuite struct { diff --git a/testutil/network/util.go b/testutil/network/util.go index d52b92b50d..0ccb5b1f7c 100644 --- a/testutil/network/util.go +++ b/testutil/network/util.go @@ -30,10 +30,10 @@ import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" + inflationtypes "github.com/evmos/evmos/v19/x/inflation/v1/types" - "github.com/evmos/evmos/v18/server" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/server" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func startInProcess(cfg Config, val *Validator) error { diff --git a/testutil/staking-rewards.go b/testutil/staking-rewards.go index 4fda9aa5a6..9010d8b8fd 100644 --- a/testutil/staking-rewards.go +++ b/testutil/staking-rewards.go @@ -17,9 +17,9 @@ import ( stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" teststaking "github.com/cosmos/cosmos-sdk/x/staking/testutil" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v18/app" - testutiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v19/app" + testutiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/utils" "github.com/stretchr/testify/require" ) diff --git a/testutil/statedb.go b/testutil/statedb.go index 611a499f01..3b18488281 100644 --- a/testutil/statedb.go +++ b/testutil/statedb.go @@ -6,8 +6,8 @@ package testutil import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/app/ante/evm" - "github.com/evmos/evmos/v18/x/evm/statedb" + "github.com/evmos/evmos/v19/app/ante/evm" + "github.com/evmos/evmos/v19/x/evm/statedb" ) // NewStateDB returns a new StateDB for testing purposes. diff --git a/testutil/tx/cosmos.go b/testutil/tx/cosmos.go index 61a7053fbe..ec4cb9effd 100644 --- a/testutil/tx/cosmos.go +++ b/testutil/tx/cosmos.go @@ -13,8 +13,8 @@ import ( "github.com/cosmos/cosmos-sdk/types/tx/signing" authsigning "github.com/cosmos/cosmos-sdk/x/auth/signing" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/utils" ) var ( diff --git a/testutil/tx/eip712.go b/testutil/tx/eip712.go index 482264f1ab..7e367786c5 100644 --- a/testutil/tx/eip712.go +++ b/testutil/tx/eip712.go @@ -16,10 +16,10 @@ import ( "github.com/ethereum/go-ethereum/signer/core/apitypes" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" - "github.com/evmos/evmos/v18/app" - cryptocodec "github.com/evmos/evmos/v18/crypto/codec" - "github.com/evmos/evmos/v18/ethereum/eip712" - "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v19/app" + cryptocodec "github.com/evmos/evmos/v19/crypto/codec" + "github.com/evmos/evmos/v19/ethereum/eip712" + "github.com/evmos/evmos/v19/types" ) type EIP712TxArgs struct { diff --git a/testutil/tx/eth.go b/testutil/tx/eth.go index 8ab57076c5..6e86be46b4 100644 --- a/testutil/tx/eth.go +++ b/testutil/tx/eth.go @@ -18,10 +18,10 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/server/config" - "github.com/evmos/evmos/v18/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/server/config" + "github.com/evmos/evmos/v19/utils" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) // PrepareEthTx creates an ethereum tx and signs it with the provided messages and private key. diff --git a/testutil/tx/signer.go b/testutil/tx/signer.go index 7b7a940033..4020a9adb8 100644 --- a/testutil/tx/signer.go +++ b/testutil/tx/signer.go @@ -12,7 +12,7 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" ) // NewAddrKey generates an Ethereum address and its corresponding private key. diff --git a/testutil/vesting.go b/testutil/vesting.go index 8f47961411..c0bf93111f 100644 --- a/testutil/vesting.go +++ b/testutil/vesting.go @@ -6,7 +6,7 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" sdkvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" - "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v19/utils" ) type vestingSchedule struct { diff --git a/types/validation_test.go b/types/validation_test.go index cf608e6eaf..f441fb7a19 100644 --- a/types/validation_test.go +++ b/types/validation_test.go @@ -4,8 +4,8 @@ import ( "testing" "github.com/ethereum/go-ethereum/common" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/types" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/types" "github.com/stretchr/testify/require" ) diff --git a/utils/utils.go b/utils/utils.go index bd0caa315d..8603f21e02 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -11,7 +11,7 @@ import ( ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" errorsmod "cosmossdk.io/errors" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" diff --git a/utils/utils_test.go b/utils/utils_test.go index fc2d0e7e7e..5d87bbe403 100644 --- a/utils/utils_test.go +++ b/utils/utils_test.go @@ -10,7 +10,7 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" "github.com/stretchr/testify/require" ) diff --git a/wallets/ledger/ledger.go b/wallets/ledger/ledger.go index b2b92bc93e..f8ef771a15 100644 --- a/wallets/ledger/ledger.go +++ b/wallets/ledger/ledger.go @@ -14,9 +14,9 @@ import ( "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/signer/core/apitypes" - "github.com/evmos/evmos/v18/ethereum/eip712" - "github.com/evmos/evmos/v18/wallets/accounts" - "github.com/evmos/evmos/v18/wallets/usbwallet" + "github.com/evmos/evmos/v19/ethereum/eip712" + "github.com/evmos/evmos/v19/wallets/accounts" + "github.com/evmos/evmos/v19/wallets/usbwallet" ) // Secp256k1DerivationFn defines the derivation function used on the Cosmos SDK Keyring. diff --git a/wallets/ledger/ledger_suite_test.go b/wallets/ledger/ledger_suite_test.go index 40eb9c60dd..3aeb32f707 100644 --- a/wallets/ledger/ledger_suite_test.go +++ b/wallets/ledger/ledger_suite_test.go @@ -21,9 +21,9 @@ import ( auxTx "github.com/cosmos/cosmos-sdk/x/auth/tx" bankTypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/evmos/evmos/v18/wallets/ledger" - "github.com/evmos/evmos/v18/wallets/ledger/mocks" - "github.com/evmos/evmos/v18/wallets/usbwallet" + "github.com/evmos/evmos/v19/wallets/ledger" + "github.com/evmos/evmos/v19/wallets/ledger/mocks" + "github.com/evmos/evmos/v19/wallets/usbwallet" ) type LedgerTestSuite struct { diff --git a/wallets/ledger/ledger_test.go b/wallets/ledger/ledger_test.go index eaf4359c37..753395ec2a 100644 --- a/wallets/ledger/ledger_test.go +++ b/wallets/ledger/ledger_test.go @@ -8,11 +8,11 @@ import ( gethaccounts "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/encoding" - "github.com/evmos/evmos/v18/ethereum/eip712" - "github.com/evmos/evmos/v18/wallets/accounts" - "github.com/evmos/evmos/v18/wallets/ledger" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/encoding" + "github.com/evmos/evmos/v19/ethereum/eip712" + "github.com/evmos/evmos/v19/wallets/accounts" + "github.com/evmos/evmos/v19/wallets/ledger" ) // Test Mnemonic: diff --git a/wallets/ledger/mocks/wallet.go b/wallets/ledger/mocks/wallet.go index 200f6cec67..92ea0fbcfa 100644 --- a/wallets/ledger/mocks/wallet.go +++ b/wallets/ledger/mocks/wallet.go @@ -6,7 +6,7 @@ package mocks import ( apitypes "github.com/ethereum/go-ethereum/signer/core/apitypes" - accounts "github.com/evmos/evmos/v18/wallets/accounts" + accounts "github.com/evmos/evmos/v19/wallets/accounts" big "math/big" diff --git a/wallets/ledger/wallet_test.go b/wallets/ledger/wallet_test.go index a080c64355..82b806d4df 100644 --- a/wallets/ledger/wallet_test.go +++ b/wallets/ledger/wallet_test.go @@ -9,9 +9,9 @@ import ( gethaccounts "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/ethereum/eip712" - "github.com/evmos/evmos/v18/wallets/accounts" - "github.com/evmos/evmos/v18/wallets/ledger/mocks" + "github.com/evmos/evmos/v19/ethereum/eip712" + "github.com/evmos/evmos/v19/wallets/accounts" + "github.com/evmos/evmos/v19/wallets/ledger/mocks" ) func RegisterDerive(mockWallet *mocks.Wallet, addr common.Address, publicKey *ecdsa.PublicKey) { diff --git a/wallets/usbwallet/hub.go b/wallets/usbwallet/hub.go index 19443ffc1e..9c21e71dce 100644 --- a/wallets/usbwallet/hub.go +++ b/wallets/usbwallet/hub.go @@ -14,7 +14,7 @@ import ( "runtime" gethaccounts "github.com/ethereum/go-ethereum/accounts" - "github.com/evmos/evmos/v18/wallets/accounts" + "github.com/evmos/evmos/v19/wallets/accounts" usb "github.com/zondax/hid" ) diff --git a/wallets/usbwallet/wallet.go b/wallets/usbwallet/wallet.go index 741984d954..6cb5262315 100644 --- a/wallets/usbwallet/wallet.go +++ b/wallets/usbwallet/wallet.go @@ -16,7 +16,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/signer/core/apitypes" - "github.com/evmos/evmos/v18/wallets/accounts" + "github.com/evmos/evmos/v19/wallets/accounts" usb "github.com/zondax/hid" ) diff --git a/x/epochs/client/cli/query.go b/x/epochs/client/cli/query.go index 537e587ac2..02b306540a 100644 --- a/x/epochs/client/cli/query.go +++ b/x/epochs/client/cli/query.go @@ -12,7 +12,7 @@ import ( "github.com/cosmos/cosmos-sdk/version" "github.com/spf13/cobra" - "github.com/evmos/evmos/v18/x/epochs/types" + "github.com/evmos/evmos/v19/x/epochs/types" ) // GetQueryCmd returns the cli query commands for this module diff --git a/x/epochs/genesis.go b/x/epochs/genesis.go index 67b04a203c..b6df6a6fdd 100644 --- a/x/epochs/genesis.go +++ b/x/epochs/genesis.go @@ -8,8 +8,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/x/epochs/keeper" - "github.com/evmos/evmos/v18/x/epochs/types" + "github.com/evmos/evmos/v19/x/epochs/keeper" + "github.com/evmos/evmos/v19/x/epochs/types" ) // InitGenesis initializes the epochs module's state from a provided genesis diff --git a/x/epochs/genesis_test.go b/x/epochs/genesis_test.go index da8d6617e6..f281132b08 100644 --- a/x/epochs/genesis_test.go +++ b/x/epochs/genesis_test.go @@ -5,13 +5,13 @@ import ( "time" tmproto "github.com/cometbft/cometbft/proto/tendermint/types" - "github.com/evmos/evmos/v18/utils" - feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" + "github.com/evmos/evmos/v19/utils" + feemarkettypes "github.com/evmos/evmos/v19/x/feemarket/types" "github.com/stretchr/testify/require" - simapp "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/x/epochs" - "github.com/evmos/evmos/v18/x/epochs/types" + simapp "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/x/epochs" + "github.com/evmos/evmos/v19/x/epochs/types" ) func TestEpochsExportGenesis(t *testing.T) { diff --git a/x/epochs/keeper/abci.go b/x/epochs/keeper/abci.go index 9abed6db66..498e084605 100644 --- a/x/epochs/keeper/abci.go +++ b/x/epochs/keeper/abci.go @@ -10,7 +10,7 @@ import ( "github.com/cosmos/cosmos-sdk/telemetry" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/x/epochs/types" + "github.com/evmos/evmos/v19/x/epochs/types" ) // BeginBlocker of epochs module diff --git a/x/epochs/keeper/abci_test.go b/x/epochs/keeper/abci_test.go index f40518f9ec..b87be28776 100644 --- a/x/epochs/keeper/abci_test.go +++ b/x/epochs/keeper/abci_test.go @@ -4,8 +4,8 @@ import ( "fmt" "time" - "github.com/evmos/evmos/v18/x/epochs" - "github.com/evmos/evmos/v18/x/epochs/types" + "github.com/evmos/evmos/v19/x/epochs" + "github.com/evmos/evmos/v19/x/epochs/types" ) func (suite *KeeperTestSuite) TestEpochInfoChangesBeginBlockerAndInitGenesis() { diff --git a/x/epochs/keeper/epoch_infos.go b/x/epochs/keeper/epoch_infos.go index 4b68f9325f..d30d0904b0 100644 --- a/x/epochs/keeper/epoch_infos.go +++ b/x/epochs/keeper/epoch_infos.go @@ -8,7 +8,7 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/x/epochs/types" + "github.com/evmos/evmos/v19/x/epochs/types" ) // GetEpochInfo returns epoch info by identifier diff --git a/x/epochs/keeper/epoch_infos_test.go b/x/epochs/keeper/epoch_infos_test.go index 154dc14362..0450087744 100644 --- a/x/epochs/keeper/epoch_infos_test.go +++ b/x/epochs/keeper/epoch_infos_test.go @@ -3,7 +3,7 @@ package keeper_test import ( "time" - "github.com/evmos/evmos/v18/x/epochs/types" + "github.com/evmos/evmos/v19/x/epochs/types" ) func (suite *KeeperTestSuite) TestEpochLifeCycle() { diff --git a/x/epochs/keeper/grpc_query.go b/x/epochs/keeper/grpc_query.go index e897efa42e..75e104ab48 100644 --- a/x/epochs/keeper/grpc_query.go +++ b/x/epochs/keeper/grpc_query.go @@ -12,7 +12,7 @@ import ( "google.golang.org/grpc/codes" "google.golang.org/grpc/status" - "github.com/evmos/evmos/v18/x/epochs/types" + "github.com/evmos/evmos/v19/x/epochs/types" ) var _ types.QueryServer = Keeper{} diff --git a/x/epochs/keeper/grpc_query_test.go b/x/epochs/keeper/grpc_query_test.go index 2c76b57b7d..f9ff71cfc6 100644 --- a/x/epochs/keeper/grpc_query_test.go +++ b/x/epochs/keeper/grpc_query_test.go @@ -6,7 +6,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/query" - "github.com/evmos/evmos/v18/x/epochs/types" + "github.com/evmos/evmos/v19/x/epochs/types" ) func (suite *KeeperTestSuite) TestEpochInfo() { diff --git a/x/epochs/keeper/hooks.go b/x/epochs/keeper/hooks.go index 8875c339e7..2b85f8bb01 100644 --- a/x/epochs/keeper/hooks.go +++ b/x/epochs/keeper/hooks.go @@ -5,7 +5,7 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/x/epochs/types" + "github.com/evmos/evmos/v19/x/epochs/types" ) var _ types.EpochHooks = MultiEpochHooks{} diff --git a/x/epochs/keeper/keeper.go b/x/epochs/keeper/keeper.go index b1f785b75a..339b7785f9 100644 --- a/x/epochs/keeper/keeper.go +++ b/x/epochs/keeper/keeper.go @@ -11,7 +11,7 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/x/epochs/types" + "github.com/evmos/evmos/v19/x/epochs/types" ) // Keeper of this module maintains collections of epochs and hooks. diff --git a/x/epochs/keeper/setup_test.go b/x/epochs/keeper/setup_test.go index 2bb5251e8a..5ca9672fb4 100644 --- a/x/epochs/keeper/setup_test.go +++ b/x/epochs/keeper/setup_test.go @@ -11,10 +11,10 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/suite" - evm "github.com/evmos/evmos/v18/x/evm/types" + evm "github.com/evmos/evmos/v19/x/evm/types" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/x/epochs/types" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/x/epochs/types" ) type KeeperTestSuite struct { diff --git a/x/epochs/keeper/utils_test.go b/x/epochs/keeper/utils_test.go index caa4fc9d57..61cec1dbb3 100644 --- a/x/epochs/keeper/utils_test.go +++ b/x/epochs/keeper/utils_test.go @@ -4,11 +4,11 @@ import ( "time" "github.com/cosmos/cosmos-sdk/baseapp" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/testutil" - "github.com/evmos/evmos/v18/utils" - "github.com/evmos/evmos/v18/x/epochs/types" - evm "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/testutil" + "github.com/evmos/evmos/v19/utils" + "github.com/evmos/evmos/v19/x/epochs/types" + evm "github.com/evmos/evmos/v19/x/evm/types" ) // Test helpers diff --git a/x/epochs/module.go b/x/epochs/module.go index 2ca4818b7d..1b792222e1 100644 --- a/x/epochs/module.go +++ b/x/epochs/module.go @@ -22,9 +22,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" - "github.com/evmos/evmos/v18/x/epochs/client/cli" - "github.com/evmos/evmos/v18/x/epochs/keeper" - "github.com/evmos/evmos/v18/x/epochs/types" + "github.com/evmos/evmos/v19/x/epochs/client/cli" + "github.com/evmos/evmos/v19/x/epochs/keeper" + "github.com/evmos/evmos/v19/x/epochs/types" ) // consensusVersion defines the current x/epochs module consensus version. diff --git a/x/erc20/client/cli/query.go b/x/erc20/client/cli/query.go index 4e6fc03ec2..f793596ec1 100644 --- a/x/erc20/client/cli/query.go +++ b/x/erc20/client/cli/query.go @@ -10,7 +10,7 @@ import ( "github.com/cosmos/cosmos-sdk/client/flags" "github.com/spf13/cobra" - "github.com/evmos/evmos/v18/x/erc20/types" + "github.com/evmos/evmos/v19/x/erc20/types" ) // GetQueryCmd returns the parent command for all erc20 CLI query commands diff --git a/x/erc20/client/cli/tx.go b/x/erc20/client/cli/tx.go index 41b87a932e..c8eea98046 100644 --- a/x/erc20/client/cli/tx.go +++ b/x/erc20/client/cli/tx.go @@ -19,9 +19,9 @@ import ( "github.com/ethereum/go-ethereum/common" - evmostypes "github.com/evmos/evmos/v18/types" + evmostypes "github.com/evmos/evmos/v19/types" - "github.com/evmos/evmos/v18/x/erc20/types" + "github.com/evmos/evmos/v19/x/erc20/types" ) // NewTxCmd returns a root CLI command handler for erc20 transaction commands diff --git a/x/erc20/client/proposal_handler.go b/x/erc20/client/proposal_handler.go index bd6bdac931..1380878618 100644 --- a/x/erc20/client/proposal_handler.go +++ b/x/erc20/client/proposal_handler.go @@ -6,7 +6,7 @@ package client import ( govclient "github.com/cosmos/cosmos-sdk/x/gov/client" - "github.com/evmos/evmos/v18/x/erc20/client/cli" + "github.com/evmos/evmos/v19/x/erc20/client/cli" ) var ( diff --git a/x/erc20/genesis.go b/x/erc20/genesis.go index d64a6026c4..7a4e1854ee 100644 --- a/x/erc20/genesis.go +++ b/x/erc20/genesis.go @@ -9,8 +9,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" - "github.com/evmos/evmos/v18/x/erc20/keeper" - "github.com/evmos/evmos/v18/x/erc20/types" + "github.com/evmos/evmos/v19/x/erc20/keeper" + "github.com/evmos/evmos/v19/x/erc20/types" ) // InitGenesis import module genesis diff --git a/x/erc20/genesis_test.go b/x/erc20/genesis_test.go index d0214494c1..77510bf571 100644 --- a/x/erc20/genesis_test.go +++ b/x/erc20/genesis_test.go @@ -15,14 +15,14 @@ import ( transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/utils" - feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" - - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/x/erc20" - "github.com/evmos/evmos/v18/x/erc20/types" + "github.com/evmos/evmos/v19/testutil/integration/evmos/network" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/utils" + feemarkettypes "github.com/evmos/evmos/v19/x/feemarket/types" + + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/x/erc20" + "github.com/evmos/evmos/v19/x/erc20/types" ) type GenesisTestSuite struct { diff --git a/x/erc20/ibc_middleware.go b/x/erc20/ibc_middleware.go index 2652ed3669..38cc986425 100644 --- a/x/erc20/ibc_middleware.go +++ b/x/erc20/ibc_middleware.go @@ -13,8 +13,8 @@ import ( "github.com/cosmos/ibc-go/v7/modules/core/exported" errortypes "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/evmos/evmos/v18/ibc" - "github.com/evmos/evmos/v18/x/erc20/keeper" + "github.com/evmos/evmos/v19/ibc" + "github.com/evmos/evmos/v19/x/erc20/keeper" ) var _ porttypes.IBCModule = &IBCMiddleware{} diff --git a/x/erc20/keeper/dynamic_precompiles.go b/x/erc20/keeper/dynamic_precompiles.go index cb753da3a4..3f98394fd0 100644 --- a/x/erc20/keeper/dynamic_precompiles.go +++ b/x/erc20/keeper/dynamic_precompiles.go @@ -9,8 +9,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/utils" - "github.com/evmos/evmos/v18/x/erc20/types" + "github.com/evmos/evmos/v19/utils" + "github.com/evmos/evmos/v19/x/erc20/types" ) // RegisterERC20Extension creates and adds an ERC20 precompile interface for an IBC Coin. diff --git a/x/erc20/keeper/erc20_utils_test.go b/x/erc20/keeper/erc20_utils_test.go index 485c103221..9b5a934ef1 100644 --- a/x/erc20/keeper/erc20_utils_test.go +++ b/x/erc20/keeper/erc20_utils_test.go @@ -6,9 +6,9 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v18/contracts" - "github.com/evmos/evmos/v18/x/erc20/types" - evm "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/contracts" + "github.com/evmos/evmos/v19/x/erc20/types" + evm "github.com/evmos/evmos/v19/x/evm/types" ) func (suite *KeeperTestSuite) MintERC20Token(contractAddr, from, to common.Address, amount *big.Int) *evm.MsgEthereumTx { diff --git a/x/erc20/keeper/evm.go b/x/erc20/keeper/evm.go index ff6c8dc825..f8c51777ad 100644 --- a/x/erc20/keeper/evm.go +++ b/x/erc20/keeper/evm.go @@ -12,10 +12,10 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" - "github.com/evmos/evmos/v18/contracts" - "github.com/evmos/evmos/v18/x/erc20/types" + "github.com/evmos/evmos/v19/contracts" + "github.com/evmos/evmos/v19/x/erc20/types" ) // DeployERC20Contract creates and deploys an ERC20 contract on the EVM with the diff --git a/x/erc20/keeper/evm_test.go b/x/erc20/keeper/evm_test.go index a54d80b291..8e39b5b2bb 100644 --- a/x/erc20/keeper/evm_test.go +++ b/x/erc20/keeper/evm_test.go @@ -7,14 +7,14 @@ import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/ethereum/go-ethereum/common" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" "github.com/stretchr/testify/mock" - "github.com/evmos/evmos/v18/contracts" - "github.com/evmos/evmos/v18/x/erc20/keeper" - "github.com/evmos/evmos/v18/x/erc20/types" - erc20mocks "github.com/evmos/evmos/v18/x/erc20/types/mocks" + "github.com/evmos/evmos/v19/contracts" + "github.com/evmos/evmos/v19/x/erc20/keeper" + "github.com/evmos/evmos/v19/x/erc20/types" + erc20mocks "github.com/evmos/evmos/v19/x/erc20/types/mocks" ) func (suite *KeeperTestSuite) TestQueryERC20() { diff --git a/x/erc20/keeper/grpc_query.go b/x/erc20/keeper/grpc_query.go index 0bc1178359..678538de45 100644 --- a/x/erc20/keeper/grpc_query.go +++ b/x/erc20/keeper/grpc_query.go @@ -12,9 +12,9 @@ import ( "github.com/cosmos/cosmos-sdk/store/prefix" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/query" - evmostypes "github.com/evmos/evmos/v18/types" + evmostypes "github.com/evmos/evmos/v19/types" - "github.com/evmos/evmos/v18/x/erc20/types" + "github.com/evmos/evmos/v19/x/erc20/types" ) var _ types.QueryServer = Keeper{} diff --git a/x/erc20/keeper/grpc_query_test.go b/x/erc20/keeper/grpc_query_test.go index af911c3972..9869e430b7 100644 --- a/x/erc20/keeper/grpc_query_test.go +++ b/x/erc20/keeper/grpc_query_test.go @@ -6,8 +6,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/query" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/x/erc20/types" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/x/erc20/types" ) func (suite *KeeperTestSuite) TestTokenPairs() { diff --git a/x/erc20/keeper/ibc_callbacks.go b/x/erc20/keeper/ibc_callbacks.go index 6349d77d38..6287f4b62a 100644 --- a/x/erc20/keeper/ibc_callbacks.go +++ b/x/erc20/keeper/ibc_callbacks.go @@ -19,8 +19,8 @@ import ( channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" "github.com/cosmos/ibc-go/v7/modules/core/exported" - "github.com/evmos/evmos/v18/ibc" - "github.com/evmos/evmos/v18/x/erc20/types" + "github.com/evmos/evmos/v19/ibc" + "github.com/evmos/evmos/v19/x/erc20/types" ) // OnRecvPacket performs the ICS20 middleware receive callback for automatically diff --git a/x/erc20/keeper/ibc_callbacks_integration_test.go b/x/erc20/keeper/ibc_callbacks_integration_test.go index 88dddfa1da..d34d7af517 100644 --- a/x/erc20/keeper/ibc_callbacks_integration_test.go +++ b/x/erc20/keeper/ibc_callbacks_integration_test.go @@ -7,10 +7,10 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/contracts" - teststypes "github.com/evmos/evmos/v18/types/tests" - "github.com/evmos/evmos/v18/utils" - "github.com/evmos/evmos/v18/x/erc20/types" + "github.com/evmos/evmos/v19/contracts" + teststypes "github.com/evmos/evmos/v19/types/tests" + "github.com/evmos/evmos/v19/utils" + "github.com/evmos/evmos/v19/x/erc20/types" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" diff --git a/x/erc20/keeper/ibc_callbacks_test.go b/x/erc20/keeper/ibc_callbacks_test.go index a5bc53cdea..1189b5e597 100644 --- a/x/erc20/keeper/ibc_callbacks_test.go +++ b/x/erc20/keeper/ibc_callbacks_test.go @@ -6,8 +6,8 @@ import ( "math/big" "cosmossdk.io/math" - "github.com/evmos/evmos/v18/utils" - "github.com/evmos/evmos/v18/x/erc20/keeper" + "github.com/evmos/evmos/v19/utils" + "github.com/evmos/evmos/v19/x/erc20/keeper" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" @@ -16,8 +16,8 @@ import ( "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" - "github.com/evmos/evmos/v18/testutil" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" + "github.com/evmos/evmos/v19/testutil" transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" @@ -25,9 +25,9 @@ import ( ibcgotesting "github.com/cosmos/ibc-go/v7/testing" ibcmock "github.com/cosmos/ibc-go/v7/testing/mock" - "github.com/evmos/evmos/v18/contracts" - "github.com/evmos/evmos/v18/x/erc20/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/contracts" + "github.com/evmos/evmos/v19/x/erc20/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) var erc20Denom = "erc20/0xdac17f958d2ee523a2206206994597c13d831ec7" diff --git a/x/erc20/keeper/integration_test.go b/x/erc20/keeper/integration_test.go index f4cc7abdb5..a56c221530 100644 --- a/x/erc20/keeper/integration_test.go +++ b/x/erc20/keeper/integration_test.go @@ -14,11 +14,11 @@ import ( govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" - "github.com/evmos/evmos/v18/testutil" - "github.com/evmos/evmos/v18/utils" - "github.com/evmos/evmos/v18/x/erc20/types" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" + "github.com/evmos/evmos/v19/testutil" + "github.com/evmos/evmos/v19/utils" + "github.com/evmos/evmos/v19/x/erc20/types" ) var _ = Describe("Performing EVM transactions", Ordered, func() { diff --git a/x/erc20/keeper/keeper.go b/x/erc20/keeper/keeper.go index 9f167acbb8..dbaa35365a 100644 --- a/x/erc20/keeper/keeper.go +++ b/x/erc20/keeper/keeper.go @@ -12,9 +12,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - transferkeeper "github.com/evmos/evmos/v18/x/ibc/transfer/keeper" + transferkeeper "github.com/evmos/evmos/v19/x/ibc/transfer/keeper" - "github.com/evmos/evmos/v18/x/erc20/types" + "github.com/evmos/evmos/v19/x/erc20/types" ) // Keeper of this module maintains collections of erc20. diff --git a/x/erc20/keeper/migrations.go b/x/erc20/keeper/migrations.go index 4834d468e8..41279dca8e 100644 --- a/x/erc20/keeper/migrations.go +++ b/x/erc20/keeper/migrations.go @@ -6,9 +6,9 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" - v3 "github.com/evmos/evmos/v18/x/erc20/migrations/v3" - v4 "github.com/evmos/evmos/v18/x/erc20/migrations/v4" - "github.com/evmos/evmos/v18/x/erc20/types" + v3 "github.com/evmos/evmos/v19/x/erc20/migrations/v3" + v4 "github.com/evmos/evmos/v19/x/erc20/migrations/v4" + "github.com/evmos/evmos/v19/x/erc20/types" ) var _ module.MigrationHandler = Migrator{}.Migrate2to3 diff --git a/x/erc20/keeper/migrations_test.go b/x/erc20/keeper/migrations_test.go index 95b0145dc8..0881acfd1c 100644 --- a/x/erc20/keeper/migrations_test.go +++ b/x/erc20/keeper/migrations_test.go @@ -7,11 +7,11 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/encoding" - erc20keeper "github.com/evmos/evmos/v18/x/erc20/keeper" - v3types "github.com/evmos/evmos/v18/x/erc20/migrations/v3/types" - "github.com/evmos/evmos/v18/x/erc20/types" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/encoding" + erc20keeper "github.com/evmos/evmos/v19/x/erc20/keeper" + v3types "github.com/evmos/evmos/v19/x/erc20/migrations/v3/types" + "github.com/evmos/evmos/v19/x/erc20/types" ) type mockSubspace struct { diff --git a/x/erc20/keeper/mint.go b/x/erc20/keeper/mint.go index f61f095149..c9be8650c1 100644 --- a/x/erc20/keeper/mint.go +++ b/x/erc20/keeper/mint.go @@ -9,7 +9,7 @@ import ( errortypes "github.com/cosmos/cosmos-sdk/types/errors" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/evmos/evmos/v18/x/erc20/types" + "github.com/evmos/evmos/v19/x/erc20/types" ) // MintingEnabled checks that: diff --git a/x/erc20/keeper/mint_test.go b/x/erc20/keeper/mint_test.go index c93995b465..484c8ce65a 100644 --- a/x/erc20/keeper/mint_test.go +++ b/x/erc20/keeper/mint_test.go @@ -6,8 +6,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/x/erc20/types" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/x/erc20/types" ) func (suite *KeeperTestSuite) TestMintingEnabled() { diff --git a/x/erc20/keeper/msg_server.go b/x/erc20/keeper/msg_server.go index 8149ec878c..69b6e969d3 100644 --- a/x/erc20/keeper/msg_server.go +++ b/x/erc20/keeper/msg_server.go @@ -17,8 +17,8 @@ import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/contracts" - "github.com/evmos/evmos/v18/x/erc20/types" + "github.com/evmos/evmos/v19/contracts" + "github.com/evmos/evmos/v19/x/erc20/types" ) var _ types.MsgServer = &Keeper{} diff --git a/x/erc20/keeper/msg_server_test.go b/x/erc20/keeper/msg_server_test.go index 11061abbed..a897d1820c 100644 --- a/x/erc20/keeper/msg_server_test.go +++ b/x/erc20/keeper/msg_server_test.go @@ -9,11 +9,11 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/x/erc20/keeper" - "github.com/evmos/evmos/v18/x/erc20/types" - erc20mocks "github.com/evmos/evmos/v18/x/erc20/types/mocks" - "github.com/evmos/evmos/v18/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/x/erc20/keeper" + "github.com/evmos/evmos/v19/x/erc20/types" + erc20mocks "github.com/evmos/evmos/v19/x/erc20/types/mocks" + "github.com/evmos/evmos/v19/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" "github.com/stretchr/testify/mock" ) diff --git a/x/erc20/keeper/params.go b/x/erc20/keeper/params.go index 907dbbe82c..4e89f553c1 100644 --- a/x/erc20/keeper/params.go +++ b/x/erc20/keeper/params.go @@ -7,7 +7,7 @@ import ( "slices" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/x/erc20/types" + "github.com/evmos/evmos/v19/x/erc20/types" ) var isTrue = []byte("0x01") diff --git a/x/erc20/keeper/params_test.go b/x/erc20/keeper/params_test.go index a7bd654f5c..44b2d1e1e1 100644 --- a/x/erc20/keeper/params_test.go +++ b/x/erc20/keeper/params_test.go @@ -3,7 +3,7 @@ package keeper_test import ( "reflect" - "github.com/evmos/evmos/v18/x/erc20/types" + "github.com/evmos/evmos/v19/x/erc20/types" ) func (suite *KeeperTestSuite) TestParams() { diff --git a/x/erc20/keeper/precompiles.go b/x/erc20/keeper/precompiles.go index af304a201c..e9b4c550c3 100644 --- a/x/erc20/keeper/precompiles.go +++ b/x/erc20/keeper/precompiles.go @@ -10,9 +10,9 @@ import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/precompiles/erc20" - "github.com/evmos/evmos/v18/x/erc20/types" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/precompiles/erc20" + "github.com/evmos/evmos/v19/x/erc20/types" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) // GetERC20PrecompileInstance returns the precompile instance for the given address. diff --git a/x/erc20/keeper/precompiles_test.go b/x/erc20/keeper/precompiles_test.go index 5167b8b763..e5a49c9bac 100644 --- a/x/erc20/keeper/precompiles_test.go +++ b/x/erc20/keeper/precompiles_test.go @@ -2,7 +2,7 @@ package keeper_test import ( "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/x/erc20/types" + "github.com/evmos/evmos/v19/x/erc20/types" ) func (suite *KeeperTestSuite) TestGetERC20PrecompileInstance() { diff --git a/x/erc20/keeper/proposals.go b/x/erc20/keeper/proposals.go index b6b7e9b08a..9f151d6971 100644 --- a/x/erc20/keeper/proposals.go +++ b/x/erc20/keeper/proposals.go @@ -9,7 +9,7 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/x/erc20/types" + "github.com/evmos/evmos/v19/x/erc20/types" ) // RegisterERC20 creates a Cosmos coin and registers the token pair between the diff --git a/x/erc20/keeper/proposals_test.go b/x/erc20/keeper/proposals_test.go index 0f0e2804e8..472e086f68 100644 --- a/x/erc20/keeper/proposals_test.go +++ b/x/erc20/keeper/proposals_test.go @@ -7,10 +7,10 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/x/erc20/keeper" - "github.com/evmos/evmos/v18/x/erc20/types" - erc20mocks "github.com/evmos/evmos/v18/x/erc20/types/mocks" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/x/erc20/keeper" + "github.com/evmos/evmos/v19/x/erc20/types" + erc20mocks "github.com/evmos/evmos/v19/x/erc20/types/mocks" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" "github.com/stretchr/testify/mock" ) diff --git a/x/erc20/keeper/setup_test.go b/x/erc20/keeper/setup_test.go index 945eb0c4fa..ba44f3b5ff 100644 --- a/x/erc20/keeper/setup_test.go +++ b/x/erc20/keeper/setup_test.go @@ -16,10 +16,10 @@ import ( ibcgotesting "github.com/cosmos/ibc-go/v7/testing" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v18/app" - ibctesting "github.com/evmos/evmos/v18/ibc/testing" - "github.com/evmos/evmos/v18/x/erc20/types" - evm "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/app" + ibctesting "github.com/evmos/evmos/v19/ibc/testing" + "github.com/evmos/evmos/v19/x/erc20/types" + evm "github.com/evmos/evmos/v19/x/evm/types" "github.com/stretchr/testify/suite" ) diff --git a/x/erc20/keeper/testdata/erc20DirectBalanceManipulation.go b/x/erc20/keeper/testdata/erc20DirectBalanceManipulation.go index 89e4196c6d..c084744346 100644 --- a/x/erc20/keeper/testdata/erc20DirectBalanceManipulation.go +++ b/x/erc20/keeper/testdata/erc20DirectBalanceManipulation.go @@ -4,8 +4,8 @@ package testdata import ( - contractutils "github.com/evmos/evmos/v18/contracts/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + contractutils "github.com/evmos/evmos/v19/contracts/utils" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) // LoadBalanceManipulationContract loads the ERC20DirectBalanceManipulation contract diff --git a/x/erc20/keeper/testdata/erc20maliciousdelayed.go b/x/erc20/keeper/testdata/erc20maliciousdelayed.go index dc5940a35e..097fef9a4a 100644 --- a/x/erc20/keeper/testdata/erc20maliciousdelayed.go +++ b/x/erc20/keeper/testdata/erc20maliciousdelayed.go @@ -4,8 +4,8 @@ package testdata import ( - contractutils "github.com/evmos/evmos/v18/contracts/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + contractutils "github.com/evmos/evmos/v19/contracts/utils" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) // LoadMaliciousDelayedContract loads the ERC20MaliciousDelayed contract. diff --git a/x/erc20/keeper/token_pairs.go b/x/erc20/keeper/token_pairs.go index b8b2fd11e0..c07e16d1da 100644 --- a/x/erc20/keeper/token_pairs.go +++ b/x/erc20/keeper/token_pairs.go @@ -9,8 +9,8 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/utils" - "github.com/evmos/evmos/v18/x/erc20/types" + "github.com/evmos/evmos/v19/utils" + "github.com/evmos/evmos/v19/x/erc20/types" ) // CreateNewTokenPair creates a new token pair and stores it in the state. diff --git a/x/erc20/keeper/token_pairs_test.go b/x/erc20/keeper/token_pairs_test.go index f9c1f7b066..2c900d91d4 100644 --- a/x/erc20/keeper/token_pairs_test.go +++ b/x/erc20/keeper/token_pairs_test.go @@ -4,9 +4,9 @@ import ( "fmt" "github.com/ethereum/go-ethereum/common" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/x/erc20/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/x/erc20/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func (suite *KeeperTestSuite) TestGetTokenPairs() { diff --git a/x/erc20/keeper/utils_test.go b/x/erc20/keeper/utils_test.go index 84fb7475d0..acf72b6e58 100644 --- a/x/erc20/keeper/utils_test.go +++ b/x/erc20/keeper/utils_test.go @@ -21,21 +21,21 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/contracts" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" - ibctesting "github.com/evmos/evmos/v18/ibc/testing" - "github.com/evmos/evmos/v18/server/config" - "github.com/evmos/evmos/v18/testutil" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - teststypes "github.com/evmos/evmos/v18/types/tests" - "github.com/evmos/evmos/v18/utils" - "github.com/evmos/evmos/v18/x/erc20/keeper/testdata" - "github.com/evmos/evmos/v18/x/erc20/types" - "github.com/evmos/evmos/v18/x/evm/statedb" - evm "github.com/evmos/evmos/v18/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" - inflationtypes "github.com/evmos/evmos/v18/x/inflation/v1/types" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/contracts" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" + ibctesting "github.com/evmos/evmos/v19/ibc/testing" + "github.com/evmos/evmos/v19/server/config" + "github.com/evmos/evmos/v19/testutil" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + teststypes "github.com/evmos/evmos/v19/types/tests" + "github.com/evmos/evmos/v19/utils" + "github.com/evmos/evmos/v19/x/erc20/keeper/testdata" + "github.com/evmos/evmos/v19/x/erc20/types" + "github.com/evmos/evmos/v19/x/evm/statedb" + evm "github.com/evmos/evmos/v19/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v19/x/feemarket/types" + inflationtypes "github.com/evmos/evmos/v19/x/inflation/v1/types" ) func CreatePacket(amount, denom, sender, receiver, srcPort, srcChannel, dstPort, dstChannel string, seq, timeout uint64) channeltypes.Packet { diff --git a/x/erc20/migrations/v3/migration.go b/x/erc20/migrations/v3/migration.go index 80ba8a1fcf..32b8c952ef 100644 --- a/x/erc20/migrations/v3/migration.go +++ b/x/erc20/migrations/v3/migration.go @@ -6,8 +6,8 @@ package v3 import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - v3types "github.com/evmos/evmos/v18/x/erc20/migrations/v3/types" - "github.com/evmos/evmos/v18/x/erc20/types" + v3types "github.com/evmos/evmos/v19/x/erc20/migrations/v3/types" + "github.com/evmos/evmos/v19/x/erc20/types" ) var isTrue = []byte{0x01} diff --git a/x/erc20/migrations/v3/migration_test.go b/x/erc20/migrations/v3/migration_test.go index 6744a9f414..509f415144 100644 --- a/x/erc20/migrations/v3/migration_test.go +++ b/x/erc20/migrations/v3/migration_test.go @@ -5,17 +5,17 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/encoding" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/encoding" - v3types "github.com/evmos/evmos/v18/x/erc20/migrations/v3/types" + v3types "github.com/evmos/evmos/v19/x/erc20/migrations/v3/types" - "github.com/evmos/evmos/v18/x/erc20/types" + "github.com/evmos/evmos/v19/x/erc20/types" "github.com/stretchr/testify/require" "github.com/cosmos/cosmos-sdk/testutil" sdk "github.com/cosmos/cosmos-sdk/types" - v3 "github.com/evmos/evmos/v18/x/erc20/migrations/v3" + v3 "github.com/evmos/evmos/v19/x/erc20/migrations/v3" ) type mockSubspace struct { diff --git a/x/erc20/migrations/v3/types/genesis.pb.go b/x/erc20/migrations/v3/types/genesis.pb.go index d063a8fe1e..e9e24f1bbe 100644 --- a/x/erc20/migrations/v3/types/genesis.pb.go +++ b/x/erc20/migrations/v3/types/genesis.pb.go @@ -11,7 +11,7 @@ import ( _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" - "github.com/evmos/evmos/v18/x/erc20/types" + "github.com/evmos/evmos/v19/x/erc20/types" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/erc20/migrations/v3/types/params.go b/x/erc20/migrations/v3/types/params.go index 5bb7d1adb0..2fa94c0f26 100644 --- a/x/erc20/migrations/v3/types/params.go +++ b/x/erc20/migrations/v3/types/params.go @@ -7,7 +7,7 @@ import ( "fmt" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - "github.com/evmos/evmos/v18/x/erc20/types" + "github.com/evmos/evmos/v19/x/erc20/types" ) var _ types.LegacyParams = &V3Params{} diff --git a/x/erc20/migrations/v4/migration.go b/x/erc20/migrations/v4/migration.go index a6e5fb69ea..7045a89e84 100644 --- a/x/erc20/migrations/v4/migration.go +++ b/x/erc20/migrations/v4/migration.go @@ -6,8 +6,8 @@ package v4 import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - v3types "github.com/evmos/evmos/v18/x/erc20/migrations/v3/types" - "github.com/evmos/evmos/v18/x/erc20/types" + v3types "github.com/evmos/evmos/v19/x/erc20/migrations/v3/types" + "github.com/evmos/evmos/v19/x/erc20/types" ) const AddressLength = 42 diff --git a/x/erc20/migrations/v4/migration_test.go b/x/erc20/migrations/v4/migration_test.go index 8b21c4d2a5..36b01ed41a 100644 --- a/x/erc20/migrations/v4/migration_test.go +++ b/x/erc20/migrations/v4/migration_test.go @@ -5,14 +5,14 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/encoding" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/encoding" "github.com/stretchr/testify/require" - v3types "github.com/evmos/evmos/v18/x/erc20/migrations/v3/types" - v4 "github.com/evmos/evmos/v18/x/erc20/migrations/v4" + v3types "github.com/evmos/evmos/v19/x/erc20/migrations/v3/types" + v4 "github.com/evmos/evmos/v19/x/erc20/migrations/v4" - "github.com/evmos/evmos/v18/x/erc20/types" + "github.com/evmos/evmos/v19/x/erc20/types" "github.com/cosmos/cosmos-sdk/testutil" sdk "github.com/cosmos/cosmos-sdk/types" diff --git a/x/erc20/module.go b/x/erc20/module.go index fa5b4cc80f..921ebbf5a2 100644 --- a/x/erc20/module.go +++ b/x/erc20/module.go @@ -20,9 +20,9 @@ import ( "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" - "github.com/evmos/evmos/v18/x/erc20/client/cli" - "github.com/evmos/evmos/v18/x/erc20/keeper" - "github.com/evmos/evmos/v18/x/erc20/types" + "github.com/evmos/evmos/v19/x/erc20/client/cli" + "github.com/evmos/evmos/v19/x/erc20/keeper" + "github.com/evmos/evmos/v19/x/erc20/types" ) // consensusVersion defines the current x/erc20 module consensus version. diff --git a/x/erc20/proposal_handler.go b/x/erc20/proposal_handler.go index b1293dbee0..dec8ccf1ef 100644 --- a/x/erc20/proposal_handler.go +++ b/x/erc20/proposal_handler.go @@ -10,8 +10,8 @@ import ( govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/x/erc20/keeper" - "github.com/evmos/evmos/v18/x/erc20/types" + "github.com/evmos/evmos/v19/x/erc20/keeper" + "github.com/evmos/evmos/v19/x/erc20/types" ) // NewErc20ProposalHandler creates a governance handler to manage new proposal types. diff --git a/x/erc20/types/evm_test.go b/x/erc20/types/evm_test.go index ec90e0a12e..74d1f5abf9 100644 --- a/x/erc20/types/evm_test.go +++ b/x/erc20/types/evm_test.go @@ -3,7 +3,7 @@ package types_test import ( "testing" - "github.com/evmos/evmos/v18/x/erc20/types" + "github.com/evmos/evmos/v19/x/erc20/types" "github.com/stretchr/testify/require" ) diff --git a/x/erc20/types/genesis.go b/x/erc20/types/genesis.go index 0b9b3133e1..d29317400c 100644 --- a/x/erc20/types/genesis.go +++ b/x/erc20/types/genesis.go @@ -6,7 +6,7 @@ package types import ( "fmt" - "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v19/utils" ) var DefaultTokenPairs = []TokenPair{ diff --git a/x/erc20/types/genesis_test.go b/x/erc20/types/genesis_test.go index 0530c711ac..45404fa6b6 100644 --- a/x/erc20/types/genesis_test.go +++ b/x/erc20/types/genesis_test.go @@ -3,8 +3,8 @@ package types_test import ( "testing" - "github.com/evmos/evmos/v18/utils" - "github.com/evmos/evmos/v18/x/erc20/types" + "github.com/evmos/evmos/v19/utils" + "github.com/evmos/evmos/v19/x/erc20/types" "github.com/stretchr/testify/suite" ) diff --git a/x/erc20/types/interfaces.go b/x/erc20/types/interfaces.go index c949b3f6c1..99990c61f9 100644 --- a/x/erc20/types/interfaces.go +++ b/x/erc20/types/interfaces.go @@ -13,10 +13,10 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/core/vm" - "github.com/evmos/evmos/v18/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) // AccountKeeper defines the expected interface needed to retrieve account info. diff --git a/x/erc20/types/mocks/EVMKeeper.go b/x/erc20/types/mocks/EVMKeeper.go index b16493e705..e1bc1d064e 100644 --- a/x/erc20/types/mocks/EVMKeeper.go +++ b/x/erc20/types/mocks/EVMKeeper.go @@ -10,15 +10,15 @@ import ( core "github.com/ethereum/go-ethereum/core" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" mock "github.com/stretchr/testify/mock" - statedb "github.com/evmos/evmos/v18/x/evm/statedb" + statedb "github.com/evmos/evmos/v19/x/evm/statedb" types "github.com/cosmos/cosmos-sdk/types" - vm "github.com/evmos/evmos/v18/x/evm/core/vm" + vm "github.com/evmos/evmos/v19/x/evm/core/vm" ) // EVMKeeper is an autogenerated mock type for the EVMKeeper type diff --git a/x/erc20/types/mocks/MsgClient.go b/x/erc20/types/mocks/MsgClient.go index 4a0255dd20..122911de54 100644 --- a/x/erc20/types/mocks/MsgClient.go +++ b/x/erc20/types/mocks/MsgClient.go @@ -9,7 +9,7 @@ import ( mock "github.com/stretchr/testify/mock" - types "github.com/evmos/evmos/v18/x/erc20/types" + types "github.com/evmos/evmos/v19/x/erc20/types" ) // MsgClient is an autogenerated mock type for the MsgClient type diff --git a/x/erc20/types/mocks/MsgServer.go b/x/erc20/types/mocks/MsgServer.go index 23706af86f..1595668b42 100644 --- a/x/erc20/types/mocks/MsgServer.go +++ b/x/erc20/types/mocks/MsgServer.go @@ -5,7 +5,7 @@ package mocks import ( context "context" - types "github.com/evmos/evmos/v18/x/erc20/types" + types "github.com/evmos/evmos/v19/x/erc20/types" mock "github.com/stretchr/testify/mock" ) diff --git a/x/erc20/types/mocks/QueryClient.go b/x/erc20/types/mocks/QueryClient.go index e2aa4a0637..ca388d5aef 100644 --- a/x/erc20/types/mocks/QueryClient.go +++ b/x/erc20/types/mocks/QueryClient.go @@ -9,7 +9,7 @@ import ( mock "github.com/stretchr/testify/mock" - types "github.com/evmos/evmos/v18/x/erc20/types" + types "github.com/evmos/evmos/v19/x/erc20/types" ) // QueryClient is an autogenerated mock type for the QueryClient type diff --git a/x/erc20/types/mocks/QueryServer.go b/x/erc20/types/mocks/QueryServer.go index 6ad641c655..47abc3ebfc 100644 --- a/x/erc20/types/mocks/QueryServer.go +++ b/x/erc20/types/mocks/QueryServer.go @@ -5,7 +5,7 @@ package mocks import ( context "context" - types "github.com/evmos/evmos/v18/x/erc20/types" + types "github.com/evmos/evmos/v19/x/erc20/types" mock "github.com/stretchr/testify/mock" ) diff --git a/x/erc20/types/msg_test.go b/x/erc20/types/msg_test.go index 1ed880bb0a..20307999e9 100644 --- a/x/erc20/types/msg_test.go +++ b/x/erc20/types/msg_test.go @@ -10,8 +10,8 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/x/erc20/types" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/x/erc20/types" "github.com/ethereum/go-ethereum/common" ) diff --git a/x/erc20/types/params.go b/x/erc20/types/params.go index 4f34deebeb..0598073b55 100644 --- a/x/erc20/types/params.go +++ b/x/erc20/types/params.go @@ -7,7 +7,7 @@ import ( "fmt" "slices" - "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v19/types" ) const ( diff --git a/x/erc20/types/params_test.go b/x/erc20/types/params_test.go index 9df87667b3..e53aa775c5 100644 --- a/x/erc20/types/params_test.go +++ b/x/erc20/types/params_test.go @@ -3,7 +3,7 @@ package types_test import ( "testing" - "github.com/evmos/evmos/v18/x/erc20/types" + "github.com/evmos/evmos/v19/x/erc20/types" "github.com/stretchr/testify/suite" ) diff --git a/x/erc20/types/proposal.go b/x/erc20/types/proposal.go index b47661f34b..4c1716c5e3 100644 --- a/x/erc20/types/proposal.go +++ b/x/erc20/types/proposal.go @@ -12,7 +12,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" govcdc "github.com/cosmos/cosmos-sdk/x/gov/codec" v1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - evmostypes "github.com/evmos/evmos/v18/types" + evmostypes "github.com/evmos/evmos/v19/types" ) // constants diff --git a/x/erc20/types/proposal_test.go b/x/erc20/types/proposal_test.go index 676442e55d..2b4d44d09e 100644 --- a/x/erc20/types/proposal_test.go +++ b/x/erc20/types/proposal_test.go @@ -8,8 +8,8 @@ import ( length "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/x/erc20/types" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/x/erc20/types" ) type ProposalTestSuite struct { diff --git a/x/erc20/types/token_pair.go b/x/erc20/types/token_pair.go index e3e0c1d63e..5e645d32cc 100644 --- a/x/erc20/types/token_pair.go +++ b/x/erc20/types/token_pair.go @@ -7,8 +7,8 @@ import ( "github.com/cometbft/cometbft/crypto/tmhash" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - evmostypes "github.com/evmos/evmos/v18/types" - "github.com/evmos/evmos/v18/utils" + evmostypes "github.com/evmos/evmos/v19/types" + "github.com/evmos/evmos/v19/utils" ) // NewTokenPairSTRv2 creates a new TokenPair instance in the context of the diff --git a/x/erc20/types/token_pair_test.go b/x/erc20/types/token_pair_test.go index 7cf6262321..50d387331f 100644 --- a/x/erc20/types/token_pair_test.go +++ b/x/erc20/types/token_pair_test.go @@ -6,8 +6,8 @@ import ( "github.com/cometbft/cometbft/crypto/tmhash" "github.com/ethereum/go-ethereum/common" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/x/erc20/types" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/x/erc20/types" "github.com/stretchr/testify/suite" ) diff --git a/x/erc20/types/utils_test.go b/x/erc20/types/utils_test.go index 2cf7904ee5..bf0c1329ce 100644 --- a/x/erc20/types/utils_test.go +++ b/x/erc20/types/utils_test.go @@ -6,7 +6,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/evmos/evmos/v18/x/erc20/types" + "github.com/evmos/evmos/v19/x/erc20/types" "github.com/stretchr/testify/require" ) diff --git a/x/evm/ante/ctx_test.go b/x/evm/ante/ctx_test.go index a0d6b766d7..3ea7d3e397 100644 --- a/x/evm/ante/ctx_test.go +++ b/x/evm/ante/ctx_test.go @@ -5,8 +5,8 @@ package ante_test import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" - "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - evmante "github.com/evmos/evmos/v18/x/evm/ante" + "github.com/evmos/evmos/v19/testutil/integration/evmos/network" + evmante "github.com/evmos/evmos/v19/x/evm/ante" ) func (suite *EvmAnteTestSuite) TestBuildEvmExecutionCtx() { diff --git a/x/evm/client/cli/query.go b/x/evm/client/cli/query.go index 8c2ace1bf0..2b60d184ab 100644 --- a/x/evm/client/cli/query.go +++ b/x/evm/client/cli/query.go @@ -3,13 +3,13 @@ package cli import ( - rpctypes "github.com/evmos/evmos/v18/rpc/types" + rpctypes "github.com/evmos/evmos/v19/rpc/types" "github.com/spf13/cobra" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/x/evm/types" ) // GetQueryCmd returns the parent command for all x/bank CLi query commands. diff --git a/x/evm/client/cli/tx.go b/x/evm/client/cli/tx.go index 331698d6fe..ada021f6b0 100644 --- a/x/evm/client/cli/tx.go +++ b/x/evm/client/cli/tx.go @@ -14,8 +14,8 @@ import ( "github.com/pkg/errors" "github.com/spf13/cobra" - rpctypes "github.com/evmos/evmos/v18/rpc/types" - "github.com/evmos/evmos/v18/x/evm/types" + rpctypes "github.com/evmos/evmos/v19/rpc/types" + "github.com/evmos/evmos/v19/x/evm/types" ) // GetTxCmd returns the transaction commands for this module diff --git a/x/evm/config/configurator.go b/x/evm/config/configurator.go index e7e7d01e74..7f7543ccdd 100644 --- a/x/evm/config/configurator.go +++ b/x/evm/config/configurator.go @@ -11,8 +11,8 @@ import ( "golang.org/x/exp/slices" - "github.com/evmos/evmos/v18/x/evm/core/vm" - "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/types" ) // EVMConfigurator allows to extend x/evm module configurations. The configurator modifies diff --git a/x/evm/config/configurator_test.go b/x/evm/config/configurator_test.go index be51df2895..7ccaf40d59 100644 --- a/x/evm/config/configurator_test.go +++ b/x/evm/config/configurator_test.go @@ -6,11 +6,11 @@ package config_test import ( "testing" - "github.com/evmos/evmos/v18/x/evm/config" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/config" + "github.com/evmos/evmos/v19/x/evm/core/vm" "github.com/stretchr/testify/require" - "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/x/evm/types" ) func TestEVMConfigurator(t *testing.T) { diff --git a/x/evm/core/core/utils.go b/x/evm/core/core/utils.go index 4d9d5601c8..9db7edaed6 100644 --- a/x/evm/core/core/utils.go +++ b/x/evm/core/core/utils.go @@ -5,7 +5,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) // CanTransfer checks whether there are enough funds in the address' account to make a transfer. diff --git a/x/evm/core/logger/access_list_tracer.go b/x/evm/core/logger/access_list_tracer.go index 2d5105233d..b0d34620c2 100644 --- a/x/evm/core/logger/access_list_tracer.go +++ b/x/evm/core/logger/access_list_tracer.go @@ -6,7 +6,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) // accessList is an accumulator for the set of accounts and storage slots an EVM diff --git a/x/evm/core/logger/logger.go b/x/evm/core/logger/logger.go index 3ddb1703f3..bcd1c2a489 100644 --- a/x/evm/core/logger/logger.go +++ b/x/evm/core/logger/logger.go @@ -15,7 +15,7 @@ import ( "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/params" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/core/vm" "github.com/holiman/uint256" ) diff --git a/x/evm/core/logger/logger_json.go b/x/evm/core/logger/logger_json.go index 5616be868c..6b2c96ab0e 100644 --- a/x/evm/core/logger/logger_json.go +++ b/x/evm/core/logger/logger_json.go @@ -8,7 +8,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/math" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) type JSONLogger struct { diff --git a/x/evm/core/tracers/js/goja.go b/x/evm/core/tracers/js/goja.go index 2beaf9ba6d..9f97605c78 100644 --- a/x/evm/core/tracers/js/goja.go +++ b/x/evm/core/tracers/js/goja.go @@ -28,9 +28,9 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v18/x/evm/core/tracers" - jsassets "github.com/evmos/evmos/v18/x/evm/core/tracers/js/internal/tracers" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/core/tracers" + jsassets "github.com/evmos/evmos/v19/x/evm/core/tracers/js/internal/tracers" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) var assetTracers = make(map[string]string) diff --git a/x/evm/core/tracers/js/tracer_test.go b/x/evm/core/tracers/js/tracer_test.go index 5e0cf32413..c769cd6465 100644 --- a/x/evm/core/tracers/js/tracer_test.go +++ b/x/evm/core/tracers/js/tracer_test.go @@ -27,8 +27,8 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/params" - "github.com/evmos/evmos/v18/x/evm/core/tracers" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/core/tracers" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) type account struct{} diff --git a/x/evm/core/tracers/native/4byte.go b/x/evm/core/tracers/native/4byte.go index 2ff3ddb5a1..a9d478523b 100644 --- a/x/evm/core/tracers/native/4byte.go +++ b/x/evm/core/tracers/native/4byte.go @@ -24,8 +24,8 @@ import ( "time" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/x/evm/core/tracers" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/core/tracers" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) func init() { diff --git a/x/evm/core/tracers/native/call.go b/x/evm/core/tracers/native/call.go index 3cde738b04..faccc46b20 100644 --- a/x/evm/core/tracers/native/call.go +++ b/x/evm/core/tracers/native/call.go @@ -26,8 +26,8 @@ import ( "time" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/x/evm/core/tracers" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/core/tracers" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) func init() { diff --git a/x/evm/core/tracers/native/noop.go b/x/evm/core/tracers/native/noop.go index 5e592dd8bb..91dfdbedb2 100644 --- a/x/evm/core/tracers/native/noop.go +++ b/x/evm/core/tracers/native/noop.go @@ -22,8 +22,8 @@ import ( "time" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/x/evm/core/tracers" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/core/tracers" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) func init() { diff --git a/x/evm/core/tracers/native/prestate.go b/x/evm/core/tracers/native/prestate.go index de71f8b898..35a1117e93 100644 --- a/x/evm/core/tracers/native/prestate.go +++ b/x/evm/core/tracers/native/prestate.go @@ -25,8 +25,8 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v18/x/evm/core/tracers" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/core/tracers" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) func init() { diff --git a/x/evm/core/tracers/native/revertreason.go b/x/evm/core/tracers/native/revertreason.go index 391d1031b0..ed2a7ca858 100644 --- a/x/evm/core/tracers/native/revertreason.go +++ b/x/evm/core/tracers/native/revertreason.go @@ -26,8 +26,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v18/x/evm/core/tracers" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/core/tracers" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) func init() { diff --git a/x/evm/core/tracers/native/tracer.go b/x/evm/core/tracers/native/tracer.go index da39d0d96d..bc16a1f975 100644 --- a/x/evm/core/tracers/native/tracer.go +++ b/x/evm/core/tracers/native/tracer.go @@ -40,7 +40,7 @@ import ( "encoding/json" "errors" - "github.com/evmos/evmos/v18/x/evm/core/tracers" + "github.com/evmos/evmos/v19/x/evm/core/tracers" ) // init registers itself this packages as a lookup for tracers. diff --git a/x/evm/core/tracers/tracers.go b/x/evm/core/tracers/tracers.go index a3f5fc89c0..50785b0f21 100644 --- a/x/evm/core/tracers/tracers.go +++ b/x/evm/core/tracers/tracers.go @@ -5,7 +5,7 @@ import ( "errors" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) // Context contains some contextual infos for a transaction execution that is not diff --git a/x/evm/genesis.go b/x/evm/genesis.go index ff39e55b37..54ca4c6194 100644 --- a/x/evm/genesis.go +++ b/x/evm/genesis.go @@ -10,8 +10,8 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v18/x/evm/keeper" - "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/x/evm/keeper" + "github.com/evmos/evmos/v19/x/evm/types" ) // InitGenesis initializes genesis state based on exported genesis diff --git a/x/evm/genesis_test.go b/x/evm/genesis_test.go index 4ffcf5e6d3..f627b800e2 100644 --- a/x/evm/genesis_test.go +++ b/x/evm/genesis_test.go @@ -6,15 +6,15 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v18/contracts" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" - testfactory "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" - testhandler "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" - testnetwork "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - "github.com/evmos/evmos/v18/x/evm" - "github.com/evmos/evmos/v18/x/evm/statedb" - "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/contracts" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" + testfactory "github.com/evmos/evmos/v19/testutil/integration/evmos/factory" + testhandler "github.com/evmos/evmos/v19/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v19/testutil/integration/evmos/keyring" + testnetwork "github.com/evmos/evmos/v19/testutil/integration/evmos/network" + "github.com/evmos/evmos/v19/x/evm" + "github.com/evmos/evmos/v19/x/evm/statedb" + "github.com/evmos/evmos/v19/x/evm/types" "github.com/stretchr/testify/require" ) diff --git a/x/evm/keeper/abci_test.go b/x/evm/keeper/abci_test.go index 0594248feb..e52cfb16be 100644 --- a/x/evm/keeper/abci_test.go +++ b/x/evm/keeper/abci_test.go @@ -2,7 +2,7 @@ package keeper_test import ( "github.com/cometbft/cometbft/abci/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func (suite *KeeperTestSuite) TestEndBlock() { diff --git a/x/evm/keeper/benchmark_test.go b/x/evm/keeper/benchmark_test.go index 2cd118a7a9..eeb276def6 100644 --- a/x/evm/keeper/benchmark_test.go +++ b/x/evm/keeper/benchmark_test.go @@ -4,7 +4,7 @@ import ( "math/big" "testing" - "github.com/evmos/evmos/v18/x/evm/keeper/testdata" + "github.com/evmos/evmos/v19/x/evm/keeper/testdata" sdkmath "cosmossdk.io/math" "github.com/stretchr/testify/require" @@ -14,8 +14,8 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - evmostypes "github.com/evmos/evmos/v18/types" - "github.com/evmos/evmos/v18/x/evm/types" + evmostypes "github.com/evmos/evmos/v19/types" + "github.com/evmos/evmos/v19/x/evm/types" ) func SetupContract(b *testing.B) (*KeeperTestSuite, common.Address) { diff --git a/x/evm/keeper/call_evm.go b/x/evm/keeper/call_evm.go index 0631ec0f6c..24110f7df5 100644 --- a/x/evm/keeper/call_evm.go +++ b/x/evm/keeper/call_evm.go @@ -13,8 +13,8 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v18/server/config" - "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/server/config" + "github.com/evmos/evmos/v19/x/evm/types" ) // CallEVM performs a smart contract method call using given args diff --git a/x/evm/keeper/call_evm_test.go b/x/evm/keeper/call_evm_test.go index 0213edc112..6d8fd7c670 100644 --- a/x/evm/keeper/call_evm_test.go +++ b/x/evm/keeper/call_evm_test.go @@ -4,11 +4,11 @@ import ( "fmt" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/contracts" - "github.com/evmos/evmos/v18/testutil" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/x/erc20/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/contracts" + "github.com/evmos/evmos/v19/testutil" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/x/erc20/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) const erc20Decimals = uint8(18) diff --git a/x/evm/keeper/config.go b/x/evm/keeper/config.go index b7a059e35e..0fd5585579 100644 --- a/x/evm/keeper/config.go +++ b/x/evm/keeper/config.go @@ -9,9 +9,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" - "github.com/evmos/evmos/v18/x/evm/core/vm" - "github.com/evmos/evmos/v18/x/evm/statedb" - "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/statedb" + "github.com/evmos/evmos/v19/x/evm/types" ) // EVMConfig creates the EVMConfig based on current state diff --git a/x/evm/keeper/fees.go b/x/evm/keeper/fees.go index 3dd05a280f..101a3e4cd3 100644 --- a/x/evm/keeper/fees.go +++ b/x/evm/keeper/fees.go @@ -15,7 +15,7 @@ import ( errortypes "github.com/cosmos/cosmos-sdk/types/errors" authante "github.com/cosmos/cosmos-sdk/x/auth/ante" - "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/x/evm/types" ) // CheckSenderBalance validates that the tx cost value is positive and that the diff --git a/x/evm/keeper/fees_test.go b/x/evm/keeper/fees_test.go index ebdd9ffd94..fffaf32092 100644 --- a/x/evm/keeper/fees_test.go +++ b/x/evm/keeper/fees_test.go @@ -8,8 +8,8 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" ethparams "github.com/ethereum/go-ethereum/params" - "github.com/evmos/evmos/v18/x/evm/keeper" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/x/evm/keeper" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func (suite *KeeperTestSuite) TestCheckSenderBalance() { diff --git a/x/evm/keeper/gas.go b/x/evm/keeper/gas.go index adb8c6028d..59cacb9328 100644 --- a/x/evm/keeper/gas.go +++ b/x/evm/keeper/gas.go @@ -14,7 +14,7 @@ import ( errortypes "github.com/cosmos/cosmos-sdk/types/errors" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/x/evm/types" ) // GetEthIntrinsicGas returns the intrinsic gas cost for the transaction diff --git a/x/evm/keeper/grpc_query.go b/x/evm/keeper/grpc_query.go index fdafd5988f..f1dfd13123 100644 --- a/x/evm/keeper/grpc_query.go +++ b/x/evm/keeper/grpc_query.go @@ -10,8 +10,8 @@ import ( "math/big" "time" - "github.com/evmos/evmos/v18/x/evm/core/logger" - "github.com/evmos/evmos/v18/x/evm/core/tracers" + "github.com/evmos/evmos/v19/x/evm/core/logger" + "github.com/evmos/evmos/v19/x/evm/core/tracers" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -25,12 +25,12 @@ import ( "github.com/ethereum/go-ethereum/core" ethtypes "github.com/ethereum/go-ethereum/core/types" ethparams "github.com/ethereum/go-ethereum/params" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/core/vm" - evmostypes "github.com/evmos/evmos/v18/types" - evmante "github.com/evmos/evmos/v18/x/evm/ante" - "github.com/evmos/evmos/v18/x/evm/statedb" - "github.com/evmos/evmos/v18/x/evm/types" + evmostypes "github.com/evmos/evmos/v19/types" + evmante "github.com/evmos/evmos/v19/x/evm/ante" + "github.com/evmos/evmos/v19/x/evm/statedb" + "github.com/evmos/evmos/v19/x/evm/types" ) var _ types.QueryServer = Keeper{} diff --git a/x/evm/keeper/grpc_query_test.go b/x/evm/keeper/grpc_query_test.go index 4ccfb25de6..b9e36ef8fd 100644 --- a/x/evm/keeper/grpc_query_test.go +++ b/x/evm/keeper/grpc_query_test.go @@ -5,7 +5,7 @@ import ( "fmt" "math/big" - "github.com/evmos/evmos/v18/x/evm/keeper/testdata" + "github.com/evmos/evmos/v19/x/evm/keeper/testdata" sdkmath "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" @@ -14,13 +14,13 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/crypto" ethparams "github.com/ethereum/go-ethereum/params" - ethlogger "github.com/evmos/evmos/v18/x/evm/core/logger" - "github.com/evmos/evmos/v18/x/evm/core/vm" + ethlogger "github.com/evmos/evmos/v19/x/evm/core/logger" + "github.com/evmos/evmos/v19/x/evm/core/vm" - "github.com/evmos/evmos/v18/server/config" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/x/evm/statedb" - "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/server/config" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/x/evm/statedb" + "github.com/evmos/evmos/v19/x/evm/types" ) // Not valid Ethereum address diff --git a/x/evm/keeper/integration_test.go b/x/evm/keeper/integration_test.go index 24b9f676b9..9cbbca3a48 100644 --- a/x/evm/keeper/integration_test.go +++ b/x/evm/keeper/integration_test.go @@ -15,14 +15,14 @@ import ( sdktypes "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v18/contracts" - "github.com/evmos/evmos/v18/precompiles/staking" - "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - integrationutils "github.com/evmos/evmos/v18/testutil/integration/evmos/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/contracts" + "github.com/evmos/evmos/v19/precompiles/staking" + "github.com/evmos/evmos/v19/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v19/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v19/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v19/testutil/integration/evmos/network" + integrationutils "github.com/evmos/evmos/v19/testutil/integration/evmos/utils" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) type IntegrationTestSuite struct { diff --git a/x/evm/keeper/keeper.go b/x/evm/keeper/keeper.go index a42c0213da..60a57e7e4f 100644 --- a/x/evm/keeper/keeper.go +++ b/x/evm/keeper/keeper.go @@ -17,11 +17,11 @@ import ( "github.com/ethereum/go-ethereum/core" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/params" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/core/vm" - evmostypes "github.com/evmos/evmos/v18/types" - "github.com/evmos/evmos/v18/x/evm/statedb" - "github.com/evmos/evmos/v18/x/evm/types" + evmostypes "github.com/evmos/evmos/v19/types" + "github.com/evmos/evmos/v19/x/evm/statedb" + "github.com/evmos/evmos/v19/x/evm/types" ) // Keeper grants access to the EVM module state and implements the go-ethereum StateDB interface. diff --git a/x/evm/keeper/keeper_test.go b/x/evm/keeper/keeper_test.go index 077d8bbcd8..8e6d9d47c1 100644 --- a/x/evm/keeper/keeper_test.go +++ b/x/evm/keeper/keeper_test.go @@ -6,10 +6,10 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/evmos/evmos/v18/utils" - "github.com/evmos/evmos/v18/x/evm/keeper" - "github.com/evmos/evmos/v18/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/utils" + "github.com/evmos/evmos/v19/x/evm/keeper" + "github.com/evmos/evmos/v19/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" "github.com/ethereum/go-ethereum/common" diff --git a/x/evm/keeper/migrations.go b/x/evm/keeper/migrations.go index 10dcc20479..9fad29c20b 100644 --- a/x/evm/keeper/migrations.go +++ b/x/evm/keeper/migrations.go @@ -4,11 +4,11 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" - v4 "github.com/evmos/evmos/v18/x/evm/migrations/v4" - v5 "github.com/evmos/evmos/v18/x/evm/migrations/v5" - v6 "github.com/evmos/evmos/v18/x/evm/migrations/v6" - v7 "github.com/evmos/evmos/v18/x/evm/migrations/v7" - "github.com/evmos/evmos/v18/x/evm/types" + v4 "github.com/evmos/evmos/v19/x/evm/migrations/v4" + v5 "github.com/evmos/evmos/v19/x/evm/migrations/v5" + v6 "github.com/evmos/evmos/v19/x/evm/migrations/v6" + v7 "github.com/evmos/evmos/v19/x/evm/migrations/v7" + "github.com/evmos/evmos/v19/x/evm/types" ) // Migrator is a struct for handling in-place store migrations. diff --git a/x/evm/keeper/migrations_test.go b/x/evm/keeper/migrations_test.go index 5ca1e59572..fc8e17de83 100644 --- a/x/evm/keeper/migrations_test.go +++ b/x/evm/keeper/migrations_test.go @@ -2,8 +2,8 @@ package keeper_test import ( sdk "github.com/cosmos/cosmos-sdk/types" - evmkeeper "github.com/evmos/evmos/v18/x/evm/keeper" - "github.com/evmos/evmos/v18/x/evm/types" + evmkeeper "github.com/evmos/evmos/v19/x/evm/keeper" + "github.com/evmos/evmos/v19/x/evm/types" ) type mockSubspace struct { diff --git a/x/evm/keeper/msg_server.go b/x/evm/keeper/msg_server.go index f85acbce10..c3d3001023 100644 --- a/x/evm/keeper/msg_server.go +++ b/x/evm/keeper/msg_server.go @@ -19,7 +19,7 @@ import ( "github.com/cosmos/cosmos-sdk/telemetry" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/x/evm/types" ) var _ types.MsgServer = &Keeper{} diff --git a/x/evm/keeper/msg_server_test.go b/x/evm/keeper/msg_server_test.go index bf89409a71..0311379abd 100644 --- a/x/evm/keeper/msg_server_test.go +++ b/x/evm/keeper/msg_server_test.go @@ -8,8 +8,8 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/params" - "github.com/evmos/evmos/v18/x/evm/statedb" - "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/x/evm/statedb" + "github.com/evmos/evmos/v19/x/evm/types" ) func (suite *KeeperTestSuite) TestEthereumTx() { diff --git a/x/evm/keeper/params.go b/x/evm/keeper/params.go index e22640e583..14ab1bef93 100644 --- a/x/evm/keeper/params.go +++ b/x/evm/keeper/params.go @@ -9,8 +9,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/utils" - "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/utils" + "github.com/evmos/evmos/v19/x/evm/types" ) // GetParams returns the total set of evm parameters. diff --git a/x/evm/keeper/params_benchmark_test.go b/x/evm/keeper/params_benchmark_test.go index 1e9a7f7705..a93fe2a8d6 100644 --- a/x/evm/keeper/params_benchmark_test.go +++ b/x/evm/keeper/params_benchmark_test.go @@ -3,7 +3,7 @@ package keeper_test import ( "testing" - "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/x/evm/types" ) func BenchmarkSetParams(b *testing.B) { diff --git a/x/evm/keeper/params_test.go b/x/evm/keeper/params_test.go index c491b338b5..c894e40a21 100644 --- a/x/evm/keeper/params_test.go +++ b/x/evm/keeper/params_test.go @@ -3,7 +3,7 @@ package keeper_test import ( "reflect" - "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/x/evm/types" ) func (suite *KeeperTestSuite) TestParams() { diff --git a/x/evm/keeper/precompiles.go b/x/evm/keeper/precompiles.go index f4a41e96e8..b47bd9fa77 100644 --- a/x/evm/keeper/precompiles.go +++ b/x/evm/keeper/precompiles.go @@ -6,8 +6,8 @@ package keeper import ( sdktypes "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/x/evm/core/vm" - "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/types" ) type Precompiles struct { diff --git a/x/evm/keeper/setup_test.go b/x/evm/keeper/setup_test.go index 5bf7e35ae2..0541386d85 100644 --- a/x/evm/keeper/setup_test.go +++ b/x/evm/keeper/setup_test.go @@ -23,14 +23,14 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/params" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" - "github.com/evmos/evmos/v18/encoding" - "github.com/evmos/evmos/v18/testutil" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" + "github.com/evmos/evmos/v19/encoding" + "github.com/evmos/evmos/v19/testutil" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/utils" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v19/x/feemarket/types" "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" ) diff --git a/x/evm/keeper/state_transition.go b/x/evm/keeper/state_transition.go index ddef4c2c90..80d0e62b13 100644 --- a/x/evm/keeper/state_transition.go +++ b/x/evm/keeper/state_transition.go @@ -11,16 +11,16 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" - evmostypes "github.com/evmos/evmos/v18/types" - "github.com/evmos/evmos/v18/x/evm/statedb" - "github.com/evmos/evmos/v18/x/evm/types" + evmostypes "github.com/evmos/evmos/v19/types" + "github.com/evmos/evmos/v19/x/evm/statedb" + "github.com/evmos/evmos/v19/x/evm/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/params" - evmoscore "github.com/evmos/evmos/v18/x/evm/core/core" - "github.com/evmos/evmos/v18/x/evm/core/vm" + evmoscore "github.com/evmos/evmos/v19/x/evm/core/core" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) // NewEVM generates a go-ethereum VM from the provided Message fields and the chain parameters diff --git a/x/evm/keeper/state_transition_benchmark_test.go b/x/evm/keeper/state_transition_benchmark_test.go index 356d1abdd2..e67abe19a0 100644 --- a/x/evm/keeper/state_transition_benchmark_test.go +++ b/x/evm/keeper/state_transition_benchmark_test.go @@ -11,7 +11,7 @@ import ( "github.com/ethereum/go-ethereum/core" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/params" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" "github.com/stretchr/testify/require" ) diff --git a/x/evm/keeper/state_transition_test.go b/x/evm/keeper/state_transition_test.go index ba03a59dd5..b9a7975b32 100644 --- a/x/evm/keeper/state_transition_test.go +++ b/x/evm/keeper/state_transition_test.go @@ -17,10 +17,10 @@ import ( "github.com/ethereum/go-ethereum/core" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/params" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/x/evm/keeper" - "github.com/evmos/evmos/v18/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/x/evm/keeper" + "github.com/evmos/evmos/v19/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func (suite *KeeperTestSuite) TestGetHashFn() { diff --git a/x/evm/keeper/statedb.go b/x/evm/keeper/statedb.go index 5634d6091a..891f75d851 100644 --- a/x/evm/keeper/statedb.go +++ b/x/evm/keeper/statedb.go @@ -12,8 +12,8 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/x/evm/statedb" - "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/x/evm/statedb" + "github.com/evmos/evmos/v19/x/evm/types" ) var _ statedb.Keeper = &Keeper{} diff --git a/x/evm/keeper/statedb_benchmark_test.go b/x/evm/keeper/statedb_benchmark_test.go index 626d198f18..28aa7ccdea 100644 --- a/x/evm/keeper/statedb_benchmark_test.go +++ b/x/evm/keeper/statedb_benchmark_test.go @@ -10,7 +10,7 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - utiltx "github.com/evmos/evmos/v18/testutil/tx" + utiltx "github.com/evmos/evmos/v19/testutil/tx" ) func BenchmarkCreateAccountNew(b *testing.B) { diff --git a/x/evm/keeper/statedb_test.go b/x/evm/keeper/statedb_test.go index 4df6be9ef7..10849a1d81 100644 --- a/x/evm/keeper/statedb_test.go +++ b/x/evm/keeper/statedb_test.go @@ -16,15 +16,15 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v18/contracts" - testfactory "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" - testhandler "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" - testnetwork "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/x/evm/core/vm" - "github.com/evmos/evmos/v18/x/evm/statedb" - "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/contracts" + testfactory "github.com/evmos/evmos/v19/testutil/integration/evmos/factory" + testhandler "github.com/evmos/evmos/v19/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v19/testutil/integration/evmos/keyring" + testnetwork "github.com/evmos/evmos/v19/testutil/integration/evmos/network" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/statedb" + "github.com/evmos/evmos/v19/x/evm/types" "github.com/stretchr/testify/require" ) diff --git a/x/evm/keeper/static_precompiles.go b/x/evm/keeper/static_precompiles.go index 4f35d2d563..7da53ee1f5 100644 --- a/x/evm/keeper/static_precompiles.go +++ b/x/evm/keeper/static_precompiles.go @@ -12,19 +12,19 @@ import ( distributionkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" channelkeeper "github.com/cosmos/ibc-go/v7/modules/core/04-channel/keeper" "github.com/ethereum/go-ethereum/common" - bankprecompile "github.com/evmos/evmos/v18/precompiles/bank" - "github.com/evmos/evmos/v18/precompiles/bech32" - distprecompile "github.com/evmos/evmos/v18/precompiles/distribution" - ics20precompile "github.com/evmos/evmos/v18/precompiles/ics20" - "github.com/evmos/evmos/v18/precompiles/p256" - stakingprecompile "github.com/evmos/evmos/v18/precompiles/staking" - vestingprecompile "github.com/evmos/evmos/v18/precompiles/vesting" - erc20Keeper "github.com/evmos/evmos/v18/x/erc20/keeper" - "github.com/evmos/evmos/v18/x/evm/core/vm" - "github.com/evmos/evmos/v18/x/evm/types" - transferkeeper "github.com/evmos/evmos/v18/x/ibc/transfer/keeper" - stakingkeeper "github.com/evmos/evmos/v18/x/staking/keeper" - vestingkeeper "github.com/evmos/evmos/v18/x/vesting/keeper" + bankprecompile "github.com/evmos/evmos/v19/precompiles/bank" + "github.com/evmos/evmos/v19/precompiles/bech32" + distprecompile "github.com/evmos/evmos/v19/precompiles/distribution" + ics20precompile "github.com/evmos/evmos/v19/precompiles/ics20" + "github.com/evmos/evmos/v19/precompiles/p256" + stakingprecompile "github.com/evmos/evmos/v19/precompiles/staking" + vestingprecompile "github.com/evmos/evmos/v19/precompiles/vesting" + erc20Keeper "github.com/evmos/evmos/v19/x/erc20/keeper" + "github.com/evmos/evmos/v19/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/types" + transferkeeper "github.com/evmos/evmos/v19/x/ibc/transfer/keeper" + stakingkeeper "github.com/evmos/evmos/v19/x/staking/keeper" + vestingkeeper "github.com/evmos/evmos/v19/x/vesting/keeper" "golang.org/x/exp/maps" ) diff --git a/x/evm/keeper/testdata/contracts.go b/x/evm/keeper/testdata/contracts.go index 6043a3ccee..e787fa6a84 100644 --- a/x/evm/keeper/testdata/contracts.go +++ b/x/evm/keeper/testdata/contracts.go @@ -4,8 +4,8 @@ package testdata import ( - contractutils "github.com/evmos/evmos/v18/contracts/utils" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + contractutils "github.com/evmos/evmos/v19/contracts/utils" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) func LoadERC20Contract() (evmtypes.CompiledContract, error) { diff --git a/x/evm/keeper/utils.go b/x/evm/keeper/utils.go index 7e1ee342ab..3e2ec9188f 100644 --- a/x/evm/keeper/utils.go +++ b/x/evm/keeper/utils.go @@ -7,7 +7,7 @@ import ( "github.com/cosmos/cosmos-sdk/store/prefix" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/x/evm/types" ) // IsContract determines if the given address is a smart contract. diff --git a/x/evm/keeper/utils_test.go b/x/evm/keeper/utils_test.go index a8ae7949aa..89e42f7a71 100644 --- a/x/evm/keeper/utils_test.go +++ b/x/evm/keeper/utils_test.go @@ -5,7 +5,7 @@ import ( "math/big" "time" - "github.com/evmos/evmos/v18/x/evm/keeper/testdata" + "github.com/evmos/evmos/v19/x/evm/keeper/testdata" "github.com/cosmos/cosmos-sdk/baseapp" sdk "github.com/cosmos/cosmos-sdk/types" @@ -13,10 +13,10 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v18/server/config" - "github.com/evmos/evmos/v18/testutil" - "github.com/evmos/evmos/v18/x/evm/statedb" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/server/config" + "github.com/evmos/evmos/v19/testutil" + "github.com/evmos/evmos/v19/x/evm/statedb" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" "github.com/stretchr/testify/require" ) diff --git a/x/evm/migrations/v4/migrate.go b/x/evm/migrations/v4/migrate.go index 8e5dcd45de..d12a11c9e8 100644 --- a/x/evm/migrations/v4/migrate.go +++ b/x/evm/migrations/v4/migrate.go @@ -7,8 +7,8 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - v4types "github.com/evmos/evmos/v18/x/evm/migrations/v4/types" - "github.com/evmos/evmos/v18/x/evm/types" + v4types "github.com/evmos/evmos/v19/x/evm/migrations/v4/types" + "github.com/evmos/evmos/v19/x/evm/types" ) // MigrateStore migrates the x/evm module state from the consensus version 3 to diff --git a/x/evm/migrations/v4/migrate_test.go b/x/evm/migrations/v4/migrate_test.go index 1ff833927a..4f837fa4ff 100644 --- a/x/evm/migrations/v4/migrate_test.go +++ b/x/evm/migrations/v4/migrate_test.go @@ -20,14 +20,14 @@ import ( "github.com/stretchr/testify/require" - "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/x/evm/types" "github.com/cosmos/cosmos-sdk/testutil" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/encoding" - v4 "github.com/evmos/evmos/v18/x/evm/migrations/v4" - v4types "github.com/evmos/evmos/v18/x/evm/migrations/v4/types" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/encoding" + v4 "github.com/evmos/evmos/v19/x/evm/migrations/v4" + v4types "github.com/evmos/evmos/v19/x/evm/migrations/v4/types" ) type mockSubspace struct { diff --git a/x/evm/migrations/v5/migrate.go b/x/evm/migrations/v5/migrate.go index a81f772739..b2638f765e 100644 --- a/x/evm/migrations/v5/migrate.go +++ b/x/evm/migrations/v5/migrate.go @@ -6,9 +6,9 @@ import ( "github.com/cosmos/cosmos-sdk/codec" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/x/evm/types" - v5types "github.com/evmos/evmos/v18/x/evm/migrations/v5/types" + v5types "github.com/evmos/evmos/v19/x/evm/migrations/v5/types" ) // MigrateStore migrates the x/evm module state from the consensus version 4 to diff --git a/x/evm/migrations/v5/migrate_test.go b/x/evm/migrations/v5/migrate_test.go index c4eda647ac..2161de9412 100644 --- a/x/evm/migrations/v5/migrate_test.go +++ b/x/evm/migrations/v5/migrate_test.go @@ -22,11 +22,11 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/encoding" - v5 "github.com/evmos/evmos/v18/x/evm/migrations/v5" - v5types "github.com/evmos/evmos/v18/x/evm/migrations/v5/types" - "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/encoding" + v5 "github.com/evmos/evmos/v19/x/evm/migrations/v5" + v5types "github.com/evmos/evmos/v19/x/evm/migrations/v5/types" + "github.com/evmos/evmos/v19/x/evm/types" ) // AvailableExtraEIPs define the list of all EIPs that can be enabled by the diff --git a/x/evm/migrations/v6/migrate.go b/x/evm/migrations/v6/migrate.go index 6db7b37e46..92fed0fb40 100644 --- a/x/evm/migrations/v6/migrate.go +++ b/x/evm/migrations/v6/migrate.go @@ -6,10 +6,10 @@ import ( "github.com/cosmos/cosmos-sdk/codec" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/utils" - "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/utils" + "github.com/evmos/evmos/v19/x/evm/types" - v5types "github.com/evmos/evmos/v18/x/evm/migrations/v6/types" + v5types "github.com/evmos/evmos/v19/x/evm/migrations/v6/types" ) // MigrateStore migrates the x/evm module state from the consensus version 5 to diff --git a/x/evm/migrations/v6/migrate_test.go b/x/evm/migrations/v6/migrate_test.go index a646eba565..485a054ecf 100644 --- a/x/evm/migrations/v6/migrate_test.go +++ b/x/evm/migrations/v6/migrate_test.go @@ -10,11 +10,11 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/encoding" - v6 "github.com/evmos/evmos/v18/x/evm/migrations/v6" - v5types "github.com/evmos/evmos/v18/x/evm/migrations/v6/types" - "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/encoding" + v6 "github.com/evmos/evmos/v19/x/evm/migrations/v6" + v5types "github.com/evmos/evmos/v19/x/evm/migrations/v6/types" + "github.com/evmos/evmos/v19/x/evm/types" ) func TestMigrate(t *testing.T) { diff --git a/x/evm/migrations/v7/migrate.go b/x/evm/migrations/v7/migrate.go index 3c8cccc1e5..e2ebdf43fb 100644 --- a/x/evm/migrations/v7/migrate.go +++ b/x/evm/migrations/v7/migrate.go @@ -6,9 +6,9 @@ import ( "github.com/cosmos/cosmos-sdk/codec" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/x/evm/types" - v6types "github.com/evmos/evmos/v18/x/evm/migrations/v7/types" + v6types "github.com/evmos/evmos/v19/x/evm/migrations/v7/types" ) // MigrateStore migrates the x/evm module state from the consensus version 6 to diff --git a/x/evm/migrations/v7/migrate_test.go b/x/evm/migrations/v7/migrate_test.go index aeb01de1b3..fe4c67b02a 100644 --- a/x/evm/migrations/v7/migrate_test.go +++ b/x/evm/migrations/v7/migrate_test.go @@ -10,11 +10,11 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/encoding" - v7 "github.com/evmos/evmos/v18/x/evm/migrations/v7" - v6types "github.com/evmos/evmos/v18/x/evm/migrations/v7/types" - "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/encoding" + v7 "github.com/evmos/evmos/v19/x/evm/migrations/v7" + v6types "github.com/evmos/evmos/v19/x/evm/migrations/v7/types" + "github.com/evmos/evmos/v19/x/evm/types" ) func TestMigrate(t *testing.T) { diff --git a/x/evm/module.go b/x/evm/module.go index cd286f1ef0..36f40fae45 100644 --- a/x/evm/module.go +++ b/x/evm/module.go @@ -20,9 +20,9 @@ import ( "github.com/cosmos/cosmos-sdk/types/module" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" - "github.com/evmos/evmos/v18/x/evm/client/cli" - "github.com/evmos/evmos/v18/x/evm/keeper" - "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/x/evm/client/cli" + "github.com/evmos/evmos/v19/x/evm/keeper" + "github.com/evmos/evmos/v19/x/evm/types" ) // consensusVersion defines the current x/evm module consensus version. diff --git a/x/evm/statedb/config.go b/x/evm/statedb/config.go index ceb62bd1ca..bf8fab23b1 100644 --- a/x/evm/statedb/config.go +++ b/x/evm/statedb/config.go @@ -7,7 +7,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/params" - "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/x/evm/types" ) // TxConfig encapulates the readonly information of current tx for `StateDB`. diff --git a/x/evm/statedb/integration_test.go b/x/evm/statedb/integration_test.go index 2c0829b5e3..443ca55e44 100644 --- a/x/evm/statedb/integration_test.go +++ b/x/evm/statedb/integration_test.go @@ -9,14 +9,14 @@ import ( "cosmossdk.io/math" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/contracts" - stakingprecompile "github.com/evmos/evmos/v18/precompiles/staking" - testcontracts "github.com/evmos/evmos/v18/precompiles/testutil/contracts" - testfactory "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" - testnetwork "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/contracts" + stakingprecompile "github.com/evmos/evmos/v19/precompiles/staking" + testcontracts "github.com/evmos/evmos/v19/precompiles/testutil/contracts" + testfactory "github.com/evmos/evmos/v19/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v19/testutil/integration/evmos/grpc" + testkeyring "github.com/evmos/evmos/v19/testutil/integration/evmos/keyring" + testnetwork "github.com/evmos/evmos/v19/testutil/integration/evmos/network" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" //nolint:revive // okay to use dot imports for Ginkgo . "github.com/onsi/ginkgo/v2" diff --git a/x/evm/statedb/interfaces.go b/x/evm/statedb/interfaces.go index 1f54a1de9b..7839abdda8 100644 --- a/x/evm/statedb/interfaces.go +++ b/x/evm/statedb/interfaces.go @@ -5,7 +5,7 @@ package statedb import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) // ExtStateDB defines an extension to the interface provided by the go-ethereum diff --git a/x/evm/statedb/mock_test.go b/x/evm/statedb/mock_test.go index 80e3d857ad..4f411e6a23 100644 --- a/x/evm/statedb/mock_test.go +++ b/x/evm/statedb/mock_test.go @@ -8,8 +8,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v18/x/evm/statedb" - "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/x/evm/statedb" + "github.com/evmos/evmos/v19/x/evm/types" ) var ( diff --git a/x/evm/statedb/state_object.go b/x/evm/statedb/state_object.go index 9fbd98b864..51a0b258a4 100644 --- a/x/evm/statedb/state_object.go +++ b/x/evm/statedb/state_object.go @@ -9,7 +9,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/x/evm/types" ) // Account is the Ethereum consensus representation of accounts. diff --git a/x/evm/statedb/statedb.go b/x/evm/statedb/statedb.go index 83d0d2b79c..6e46b224c7 100644 --- a/x/evm/statedb/statedb.go +++ b/x/evm/statedb/statedb.go @@ -13,8 +13,8 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v18/x/evm/core/vm" - "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/types" ) // revision is the identifier of a version of state. diff --git a/x/evm/statedb/statedb_test.go b/x/evm/statedb/statedb_test.go index 2c02caf30d..2ad01b5587 100644 --- a/x/evm/statedb/statedb_test.go +++ b/x/evm/statedb/statedb_test.go @@ -8,8 +8,8 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v18/x/evm/core/vm" - "github.com/evmos/evmos/v18/x/evm/statedb" + "github.com/evmos/evmos/v19/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/statedb" "github.com/stretchr/testify/suite" ) diff --git a/x/evm/types/access_list_test.go b/x/evm/types/access_list_test.go index d5cf8ecfe6..b4b57d3a61 100644 --- a/x/evm/types/access_list_test.go +++ b/x/evm/types/access_list_test.go @@ -3,7 +3,7 @@ package types_test import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/x/evm/types" ) func (suite *TxDataTestSuite) TestTestNewAccessList() { diff --git a/x/evm/types/access_list_tx.go b/x/evm/types/access_list_tx.go index c98059dafd..0cd291f57e 100644 --- a/x/evm/types/access_list_tx.go +++ b/x/evm/types/access_list_tx.go @@ -12,7 +12,7 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v19/types" ) func newAccessListTx(tx *ethtypes.Transaction) (*AccessListTx, error) { diff --git a/x/evm/types/access_list_tx_test.go b/x/evm/types/access_list_tx_test.go index bfe445cfdf..1e6c04c4d4 100644 --- a/x/evm/types/access_list_tx_test.go +++ b/x/evm/types/access_list_tx_test.go @@ -4,7 +4,7 @@ import ( "math/big" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/x/evm/types" ) func (suite *TxDataTestSuite) TestAccessListTxCopy() { diff --git a/x/evm/types/compiled_contract_test.go b/x/evm/types/compiled_contract_test.go index f7f3681c92..8f4a2b04bf 100644 --- a/x/evm/types/compiled_contract_test.go +++ b/x/evm/types/compiled_contract_test.go @@ -5,7 +5,7 @@ import ( "os" "testing" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" "github.com/stretchr/testify/require" ) diff --git a/x/evm/types/dynamic_fee_tx.go b/x/evm/types/dynamic_fee_tx.go index 8725ca6fd6..c98cbb951e 100644 --- a/x/evm/types/dynamic_fee_tx.go +++ b/x/evm/types/dynamic_fee_tx.go @@ -12,7 +12,7 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v19/types" ) func NewDynamicFeeTx(tx *ethtypes.Transaction) (*DynamicFeeTx, error) { diff --git a/x/evm/types/dynamic_fee_tx_test.go b/x/evm/types/dynamic_fee_tx_test.go index 05991b7b4b..41767f0ff5 100644 --- a/x/evm/types/dynamic_fee_tx_test.go +++ b/x/evm/types/dynamic_fee_tx_test.go @@ -10,8 +10,8 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/x/evm/types" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/x/evm/types" "github.com/stretchr/testify/suite" ) diff --git a/x/evm/types/genesis.go b/x/evm/types/genesis.go index a9f30fec4c..e81384573a 100644 --- a/x/evm/types/genesis.go +++ b/x/evm/types/genesis.go @@ -5,7 +5,7 @@ package types import ( "fmt" - "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v19/types" ) // Validate performs a basic validation of a GenesisAccount fields. diff --git a/x/evm/types/genesis_test.go b/x/evm/types/genesis_test.go index 2b8e966951..7836836810 100644 --- a/x/evm/types/genesis_test.go +++ b/x/evm/types/genesis_test.go @@ -6,7 +6,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/suite" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" ) type GenesisTestSuite struct { diff --git a/x/evm/types/interfaces.go b/x/evm/types/interfaces.go index 850544c0c2..cece5eca06 100644 --- a/x/evm/types/interfaces.go +++ b/x/evm/types/interfaces.go @@ -11,9 +11,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/core/vm" - feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" + feemarkettypes "github.com/evmos/evmos/v19/x/feemarket/types" ) // AccountKeeper defines the expected account keeper interface diff --git a/x/evm/types/legacy_tx.go b/x/evm/types/legacy_tx.go index 30c9e75b7f..03ce4148b9 100644 --- a/x/evm/types/legacy_tx.go +++ b/x/evm/types/legacy_tx.go @@ -10,7 +10,7 @@ import ( errorsmod "cosmossdk.io/errors" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v19/types" ) func NewLegacyTx(tx *ethtypes.Transaction) (*LegacyTx, error) { diff --git a/x/evm/types/legacy_tx_test.go b/x/evm/types/legacy_tx_test.go index 4bc0287545..92e00fc564 100644 --- a/x/evm/types/legacy_tx_test.go +++ b/x/evm/types/legacy_tx_test.go @@ -6,7 +6,7 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/x/evm/types" ) func (suite *TxDataTestSuite) TestNewLegacyTx() { diff --git a/x/evm/types/logs.go b/x/evm/types/logs.go index c58bf967f9..e5e54df58b 100644 --- a/x/evm/types/logs.go +++ b/x/evm/types/logs.go @@ -9,7 +9,7 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - evmostypes "github.com/evmos/evmos/v18/types" + evmostypes "github.com/evmos/evmos/v19/types" ) // NewTransactionLogs creates a new NewTransactionLogs instance. diff --git a/x/evm/types/logs_test.go b/x/evm/types/logs_test.go index b54b2bb5f7..f1103b1269 100644 --- a/x/evm/types/logs_test.go +++ b/x/evm/types/logs_test.go @@ -5,8 +5,8 @@ import ( "github.com/stretchr/testify/require" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/x/evm/types" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/x/evm/types" "github.com/ethereum/go-ethereum/common" ) diff --git a/x/evm/types/msg.go b/x/evm/types/msg.go index a1ecc02100..28229efeb0 100644 --- a/x/evm/types/msg.go +++ b/x/evm/types/msg.go @@ -19,7 +19,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/signing" authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" - "github.com/evmos/evmos/v18/types" + "github.com/evmos/evmos/v19/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" diff --git a/x/evm/types/msg_test.go b/x/evm/types/msg_test.go index bc088baa33..c9a7b29226 100644 --- a/x/evm/types/msg_test.go +++ b/x/evm/types/msg_test.go @@ -17,12 +17,12 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" - utiltx "github.com/evmos/evmos/v18/testutil/tx" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" + utiltx "github.com/evmos/evmos/v19/testutil/tx" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/encoding" - "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/encoding" + "github.com/evmos/evmos/v19/x/evm/types" ) const invalidAddress = "0x0000" diff --git a/x/evm/types/opcodes_hooks.go b/x/evm/types/opcodes_hooks.go index 98a3df8d76..c2259bda99 100644 --- a/x/evm/types/opcodes_hooks.go +++ b/x/evm/types/opcodes_hooks.go @@ -5,7 +5,7 @@ package types import ( "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) // OpCodeHooks extends the geth OpCodeHooks interface to add custom hooks for EVM operations. diff --git a/x/evm/types/params.go b/x/evm/types/params.go index 315dd85764..9d9b61ac51 100644 --- a/x/evm/types/params.go +++ b/x/evm/types/params.go @@ -14,10 +14,10 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/params" - "github.com/evmos/evmos/v18/precompiles/p256" - "github.com/evmos/evmos/v18/types" - "github.com/evmos/evmos/v18/utils" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/precompiles/p256" + "github.com/evmos/evmos/v19/types" + "github.com/evmos/evmos/v19/utils" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) var ( diff --git a/x/evm/types/permissions.go b/x/evm/types/permissions.go index 76c3b9accf..2cbb26360e 100644 --- a/x/evm/types/permissions.go +++ b/x/evm/types/permissions.go @@ -8,7 +8,7 @@ import ( "slices" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) // PermissionPolicy is the interface that defines the permission policy for contract creation and calls. diff --git a/x/evm/types/permissions_test.go b/x/evm/types/permissions_test.go index 53163732e5..5e7961f8fd 100644 --- a/x/evm/types/permissions_test.go +++ b/x/evm/types/permissions_test.go @@ -7,8 +7,8 @@ import ( "testing" "github.com/ethereum/go-ethereum/common" - testkeyring "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v18/x/evm/types" + testkeyring "github.com/evmos/evmos/v19/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v19/x/evm/types" "github.com/stretchr/testify/suite" ) diff --git a/x/evm/types/tracer.go b/x/evm/types/tracer.go index e2a10d0193..b35334f1b0 100644 --- a/x/evm/types/tracer.go +++ b/x/evm/types/tracer.go @@ -10,8 +10,8 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/params" - "github.com/evmos/evmos/v18/x/evm/core/logger" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/core/logger" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) const ( diff --git a/x/evm/types/tx.go b/x/evm/types/tx.go index 6043a63bbf..26a0fb35e4 100644 --- a/x/evm/types/tx.go +++ b/x/evm/types/tx.go @@ -9,7 +9,7 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/x/evm/core/vm" + "github.com/evmos/evmos/v19/x/evm/core/vm" ) // EvmTxArgs encapsulates all possible params to create all EVM txs types. diff --git a/x/evm/types/tx_args_test.go b/x/evm/types/tx_args_test.go index 1e485e04dc..1a07d7f2e6 100644 --- a/x/evm/types/tx_args_test.go +++ b/x/evm/types/tx_args_test.go @@ -7,7 +7,7 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/x/evm/types" ) func (suite *TxDataTestSuite) TestTxArgsString() { diff --git a/x/evm/types/utils_test.go b/x/evm/types/utils_test.go index eb0d9cdb96..80066670d7 100644 --- a/x/evm/types/utils_test.go +++ b/x/evm/types/utils_test.go @@ -14,10 +14,10 @@ import ( proto "github.com/cosmos/gogoproto/proto" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/encoding" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/encoding" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" "github.com/stretchr/testify/require" ) diff --git a/x/feemarket/client/cli/query.go b/x/feemarket/client/cli/query.go index 0f561eeae3..c245a421e7 100644 --- a/x/feemarket/client/cli/query.go +++ b/x/feemarket/client/cli/query.go @@ -8,7 +8,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/evmos/evmos/v18/x/feemarket/types" + "github.com/evmos/evmos/v19/x/feemarket/types" ) // GetQueryCmd returns the parent command for all x/feemarket CLI query commands. diff --git a/x/feemarket/genesis.go b/x/feemarket/genesis.go index 120da1c68d..b9d0af6fd0 100644 --- a/x/feemarket/genesis.go +++ b/x/feemarket/genesis.go @@ -7,8 +7,8 @@ import ( abci "github.com/cometbft/cometbft/abci/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/x/feemarket/keeper" - "github.com/evmos/evmos/v18/x/feemarket/types" + "github.com/evmos/evmos/v19/x/feemarket/keeper" + "github.com/evmos/evmos/v19/x/feemarket/types" ) // InitGenesis initializes genesis state based on exported genesis diff --git a/x/feemarket/keeper/abci.go b/x/feemarket/keeper/abci.go index 312b9788d3..68735c1ea9 100644 --- a/x/feemarket/keeper/abci.go +++ b/x/feemarket/keeper/abci.go @@ -6,7 +6,7 @@ import ( "fmt" abci "github.com/cometbft/cometbft/abci/types" - "github.com/evmos/evmos/v18/x/feemarket/types" + "github.com/evmos/evmos/v19/x/feemarket/types" "cosmossdk.io/math" "github.com/cosmos/cosmos-sdk/telemetry" diff --git a/x/feemarket/keeper/grpc_query.go b/x/feemarket/keeper/grpc_query.go index 800b09f40f..91451ceba5 100644 --- a/x/feemarket/keeper/grpc_query.go +++ b/x/feemarket/keeper/grpc_query.go @@ -9,7 +9,7 @@ import ( sdkmath "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/x/feemarket/types" + "github.com/evmos/evmos/v19/x/feemarket/types" ) var _ types.QueryServer = Keeper{} diff --git a/x/feemarket/keeper/grpc_query_test.go b/x/feemarket/keeper/grpc_query_test.go index 2ce20c97ac..9c4e9128b9 100644 --- a/x/feemarket/keeper/grpc_query_test.go +++ b/x/feemarket/keeper/grpc_query_test.go @@ -3,7 +3,7 @@ package keeper_test import ( sdkmath "cosmossdk.io/math" ethparams "github.com/ethereum/go-ethereum/params" - "github.com/evmos/evmos/v18/x/feemarket/types" + "github.com/evmos/evmos/v19/x/feemarket/types" ) func (suite *KeeperTestSuite) TestQueryParams() { diff --git a/x/feemarket/keeper/integration_test.go b/x/feemarket/keeper/integration_test.go index f31783bd90..9fb3ce1b31 100644 --- a/x/feemarket/keeper/integration_test.go +++ b/x/feemarket/keeper/integration_test.go @@ -12,10 +12,10 @@ import ( . "github.com/onsi/gomega" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" - "github.com/evmos/evmos/v18/testutil" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" + "github.com/evmos/evmos/v19/testutil" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/utils" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" ) diff --git a/x/feemarket/keeper/keeper.go b/x/feemarket/keeper/keeper.go index fa94abe7ab..0a38f0b7cf 100644 --- a/x/feemarket/keeper/keeper.go +++ b/x/feemarket/keeper/keeper.go @@ -11,7 +11,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" - "github.com/evmos/evmos/v18/x/feemarket/types" + "github.com/evmos/evmos/v19/x/feemarket/types" ) // KeyPrefixBaseFeeV1 TODO: Temporary will be removed with params refactor PR diff --git a/x/feemarket/keeper/migrations.go b/x/feemarket/keeper/migrations.go index 37b9e39bc2..e764970bfd 100644 --- a/x/feemarket/keeper/migrations.go +++ b/x/feemarket/keeper/migrations.go @@ -4,8 +4,8 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" - v4 "github.com/evmos/evmos/v18/x/feemarket/migrations/v4" - "github.com/evmos/evmos/v18/x/feemarket/types" + v4 "github.com/evmos/evmos/v19/x/feemarket/migrations/v4" + "github.com/evmos/evmos/v19/x/feemarket/types" ) // Migrator is a struct for handling in-place store migrations. diff --git a/x/feemarket/keeper/migrations_test.go b/x/feemarket/keeper/migrations_test.go index 0fefd0ddb9..471ab3ccf7 100644 --- a/x/feemarket/keeper/migrations_test.go +++ b/x/feemarket/keeper/migrations_test.go @@ -2,8 +2,8 @@ package keeper_test import ( sdk "github.com/cosmos/cosmos-sdk/types" - feemarketkeeper "github.com/evmos/evmos/v18/x/feemarket/keeper" - "github.com/evmos/evmos/v18/x/feemarket/types" + feemarketkeeper "github.com/evmos/evmos/v19/x/feemarket/keeper" + "github.com/evmos/evmos/v19/x/feemarket/types" ) type mockSubspace struct { diff --git a/x/feemarket/keeper/msg_server.go b/x/feemarket/keeper/msg_server.go index 72c8ff78ce..887892ab1e 100644 --- a/x/feemarket/keeper/msg_server.go +++ b/x/feemarket/keeper/msg_server.go @@ -8,7 +8,7 @@ import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - "github.com/evmos/evmos/v18/x/feemarket/types" + "github.com/evmos/evmos/v19/x/feemarket/types" ) // UpdateParams implements the gRPC MsgServer interface. When an UpdateParams diff --git a/x/feemarket/keeper/msg_server_test.go b/x/feemarket/keeper/msg_server_test.go index 5d1006a6f5..7ed950be07 100644 --- a/x/feemarket/keeper/msg_server_test.go +++ b/x/feemarket/keeper/msg_server_test.go @@ -3,7 +3,7 @@ package keeper_test import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - "github.com/evmos/evmos/v18/x/feemarket/types" + "github.com/evmos/evmos/v19/x/feemarket/types" ) func (suite *KeeperTestSuite) TestUpdateParams() { diff --git a/x/feemarket/keeper/params.go b/x/feemarket/keeper/params.go index a2bd9973c7..441bb9fb00 100644 --- a/x/feemarket/keeper/params.go +++ b/x/feemarket/keeper/params.go @@ -6,7 +6,7 @@ import ( "math/big" "cosmossdk.io/math" - "github.com/evmos/evmos/v18/x/feemarket/types" + "github.com/evmos/evmos/v19/x/feemarket/types" sdk "github.com/cosmos/cosmos-sdk/types" ) diff --git a/x/feemarket/keeper/params_test.go b/x/feemarket/keeper/params_test.go index 0903bfee21..ac6889c55f 100644 --- a/x/feemarket/keeper/params_test.go +++ b/x/feemarket/keeper/params_test.go @@ -3,7 +3,7 @@ package keeper_test import ( "reflect" - "github.com/evmos/evmos/v18/x/feemarket/types" + "github.com/evmos/evmos/v19/x/feemarket/types" ) func (suite *KeeperTestSuite) TestGetParams() { diff --git a/x/feemarket/keeper/setup_test.go b/x/feemarket/keeper/setup_test.go index e1fc1659eb..e0572453cf 100644 --- a/x/feemarket/keeper/setup_test.go +++ b/x/feemarket/keeper/setup_test.go @@ -14,9 +14,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/utils" - "github.com/evmos/evmos/v18/x/feemarket/types" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/utils" + "github.com/evmos/evmos/v19/x/feemarket/types" "github.com/stretchr/testify/suite" ) diff --git a/x/feemarket/keeper/utils_test.go b/x/feemarket/keeper/utils_test.go index b3b22d5fca..514c41d3ea 100644 --- a/x/feemarket/keeper/utils_test.go +++ b/x/feemarket/keeper/utils_test.go @@ -5,7 +5,7 @@ import ( "math/big" "time" - "github.com/evmos/evmos/v18/utils" + "github.com/evmos/evmos/v19/utils" "cosmossdk.io/math" "github.com/cosmos/cosmos-sdk/baseapp" @@ -20,13 +20,13 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" - "github.com/evmos/evmos/v18/encoding" - "github.com/evmos/evmos/v18/testutil" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" - "github.com/evmos/evmos/v18/x/feemarket/types" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" + "github.com/evmos/evmos/v19/encoding" + "github.com/evmos/evmos/v19/testutil" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" + "github.com/evmos/evmos/v19/x/feemarket/types" "github.com/stretchr/testify/require" diff --git a/x/feemarket/migrations/v4/migrate.go b/x/feemarket/migrations/v4/migrate.go index 8804c152a2..8a8e850705 100644 --- a/x/feemarket/migrations/v4/migrate.go +++ b/x/feemarket/migrations/v4/migrate.go @@ -6,7 +6,7 @@ import ( "github.com/cosmos/cosmos-sdk/codec" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/x/feemarket/types" + "github.com/evmos/evmos/v19/x/feemarket/types" ) // MigrateStore migrates the x/evm module state from the consensus version 3 to diff --git a/x/feemarket/migrations/v4/migrate_test.go b/x/feemarket/migrations/v4/migrate_test.go index afee621da4..f6864dd663 100644 --- a/x/feemarket/migrations/v4/migrate_test.go +++ b/x/feemarket/migrations/v4/migrate_test.go @@ -20,10 +20,10 @@ import ( "github.com/cosmos/cosmos-sdk/testutil" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/encoding" - v4 "github.com/evmos/evmos/v18/x/feemarket/migrations/v4" - "github.com/evmos/evmos/v18/x/feemarket/types" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/encoding" + v4 "github.com/evmos/evmos/v19/x/feemarket/migrations/v4" + "github.com/evmos/evmos/v19/x/feemarket/types" "github.com/stretchr/testify/require" ) diff --git a/x/feemarket/migrations/v4/types/params.go b/x/feemarket/migrations/v4/types/params.go index ec714e39f2..bf1aabc755 100644 --- a/x/feemarket/migrations/v4/types/params.go +++ b/x/feemarket/migrations/v4/types/params.go @@ -5,7 +5,7 @@ package types import ( "fmt" - "github.com/evmos/evmos/v18/x/feemarket/types" + "github.com/evmos/evmos/v19/x/feemarket/types" "cosmossdk.io/math" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" diff --git a/x/feemarket/module.go b/x/feemarket/module.go index d234f08ea9..5b6e659282 100644 --- a/x/feemarket/module.go +++ b/x/feemarket/module.go @@ -20,9 +20,9 @@ import ( "github.com/cosmos/cosmos-sdk/types/module" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" - "github.com/evmos/evmos/v18/x/feemarket/client/cli" - "github.com/evmos/evmos/v18/x/feemarket/keeper" - "github.com/evmos/evmos/v18/x/feemarket/types" + "github.com/evmos/evmos/v19/x/feemarket/client/cli" + "github.com/evmos/evmos/v19/x/feemarket/keeper" + "github.com/evmos/evmos/v19/x/feemarket/types" ) // consensusVersion defines the current x/feemarket module consensus version. diff --git a/x/ibc/transfer/ibc_module.go b/x/ibc/transfer/ibc_module.go index 97d10f66af..079fe9506e 100644 --- a/x/ibc/transfer/ibc_module.go +++ b/x/ibc/transfer/ibc_module.go @@ -6,7 +6,7 @@ package transfer import ( ibctransfer "github.com/cosmos/ibc-go/v7/modules/apps/transfer" porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" - "github.com/evmos/evmos/v18/x/ibc/transfer/keeper" + "github.com/evmos/evmos/v19/x/ibc/transfer/keeper" ) var _ porttypes.IBCModule = IBCModule{} diff --git a/x/ibc/transfer/keeper/keeper.go b/x/ibc/transfer/keeper/keeper.go index 9de825295f..209aaf1174 100644 --- a/x/ibc/transfer/keeper/keeper.go +++ b/x/ibc/transfer/keeper/keeper.go @@ -13,7 +13,7 @@ import ( transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" - "github.com/evmos/evmos/v18/x/ibc/transfer/types" + "github.com/evmos/evmos/v19/x/ibc/transfer/types" ) // Keeper defines the modified IBC transfer keeper that embeds the original one. diff --git a/x/ibc/transfer/keeper/keeper_test.go b/x/ibc/transfer/keeper/keeper_test.go index e8b955866b..44d4a20b2b 100644 --- a/x/ibc/transfer/keeper/keeper_test.go +++ b/x/ibc/transfer/keeper/keeper_test.go @@ -28,18 +28,18 @@ import ( stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" - "github.com/evmos/evmos/v18/server/config" - "github.com/evmos/evmos/v18/testutil" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/utils" - "github.com/evmos/evmos/v18/x/evm/statedb" - evm "github.com/evmos/evmos/v18/x/evm/types" - feemarkettypes "github.com/evmos/evmos/v18/x/feemarket/types" - - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/contracts" - "github.com/evmos/evmos/v18/x/erc20/types" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" + "github.com/evmos/evmos/v19/server/config" + "github.com/evmos/evmos/v19/testutil" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/utils" + "github.com/evmos/evmos/v19/x/evm/statedb" + evm "github.com/evmos/evmos/v19/x/evm/types" + feemarkettypes "github.com/evmos/evmos/v19/x/feemarket/types" + + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/contracts" + "github.com/evmos/evmos/v19/x/erc20/types" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" diff --git a/x/ibc/transfer/keeper/msg_server.go b/x/ibc/transfer/keeper/msg_server.go index f10568f135..570e0b5703 100644 --- a/x/ibc/transfer/keeper/msg_server.go +++ b/x/ibc/transfer/keeper/msg_server.go @@ -15,7 +15,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - erc20types "github.com/evmos/evmos/v18/x/erc20/types" + erc20types "github.com/evmos/evmos/v19/x/erc20/types" ) var _ types.MsgServer = Keeper{} diff --git a/x/ibc/transfer/keeper/msg_server_test.go b/x/ibc/transfer/keeper/msg_server_test.go index e363ffc707..e33a00f10b 100644 --- a/x/ibc/transfer/keeper/msg_server_test.go +++ b/x/ibc/transfer/keeper/msg_server_test.go @@ -11,8 +11,8 @@ import ( "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" host "github.com/cosmos/ibc-go/v7/modules/core/24-host" - erc20types "github.com/evmos/evmos/v18/x/erc20/types" - "github.com/evmos/evmos/v18/x/ibc/transfer/keeper" + erc20types "github.com/evmos/evmos/v19/x/erc20/types" + "github.com/evmos/evmos/v19/x/ibc/transfer/keeper" "github.com/stretchr/testify/mock" ) diff --git a/x/ibc/transfer/module.go b/x/ibc/transfer/module.go index eeaeace413..2ad06a8068 100644 --- a/x/ibc/transfer/module.go +++ b/x/ibc/transfer/module.go @@ -11,7 +11,7 @@ import ( ibctransfer "github.com/cosmos/ibc-go/v7/modules/apps/transfer" ibctransferkeeper "github.com/cosmos/ibc-go/v7/modules/apps/transfer/keeper" "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - "github.com/evmos/evmos/v18/x/ibc/transfer/keeper" + "github.com/evmos/evmos/v19/x/ibc/transfer/keeper" ) var ( diff --git a/x/ibc/transfer/types/interfaces.go b/x/ibc/transfer/types/interfaces.go index acb9e5c17f..c9b93a46cc 100644 --- a/x/ibc/transfer/types/interfaces.go +++ b/x/ibc/transfer/types/interfaces.go @@ -10,7 +10,7 @@ import ( transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - erc20types "github.com/evmos/evmos/v18/x/erc20/types" + erc20types "github.com/evmos/evmos/v19/x/erc20/types" ) // AccountKeeper defines the expected interface needed to retrieve account info. diff --git a/x/incentives/module.go b/x/incentives/module.go index 8fce38de5d..806e43b093 100644 --- a/x/incentives/module.go +++ b/x/incentives/module.go @@ -24,7 +24,7 @@ import ( "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" - "github.com/evmos/evmos/v18/x/incentives/types" + "github.com/evmos/evmos/v19/x/incentives/types" ) // consensusVersion defines the current x/incentives module consensus version. diff --git a/x/incentives/types/proposal.go b/x/incentives/types/proposal.go index 3958d54d1e..f8c472dc0d 100644 --- a/x/incentives/types/proposal.go +++ b/x/incentives/types/proposal.go @@ -8,7 +8,7 @@ import ( govcdc "github.com/cosmos/cosmos-sdk/x/gov/codec" govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - evmostypes "github.com/evmos/evmos/v18/types" + evmostypes "github.com/evmos/evmos/v19/types" ) // constants diff --git a/x/inflation/v1/client/cli/query.go b/x/inflation/v1/client/cli/query.go index 5a975cbea7..f159f2634c 100644 --- a/x/inflation/v1/client/cli/query.go +++ b/x/inflation/v1/client/cli/query.go @@ -11,7 +11,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/evmos/evmos/v18/x/inflation/v1/types" + "github.com/evmos/evmos/v19/x/inflation/v1/types" ) // GetQueryCmd returns the cli query commands for the inflation module. diff --git a/x/inflation/v1/genesis.go b/x/inflation/v1/genesis.go index 4d0e0b7cd0..e9d97ba1b7 100644 --- a/x/inflation/v1/genesis.go +++ b/x/inflation/v1/genesis.go @@ -6,8 +6,8 @@ package inflation import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/x/inflation/v1/keeper" - "github.com/evmos/evmos/v18/x/inflation/v1/types" + "github.com/evmos/evmos/v19/x/inflation/v1/keeper" + "github.com/evmos/evmos/v19/x/inflation/v1/types" ) // InitGenesis import module genesis diff --git a/x/inflation/v1/keeper/epoch_info.go b/x/inflation/v1/keeper/epoch_info.go index 6e97d06e1e..2c5b981da5 100644 --- a/x/inflation/v1/keeper/epoch_info.go +++ b/x/inflation/v1/keeper/epoch_info.go @@ -5,7 +5,7 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/x/inflation/v1/types" + "github.com/evmos/evmos/v19/x/inflation/v1/types" ) // GetEpochIdentifier gets the epoch identifier diff --git a/x/inflation/v1/keeper/epoch_info_test.go b/x/inflation/v1/keeper/epoch_info_test.go index ecee3d74d6..a40a875d99 100644 --- a/x/inflation/v1/keeper/epoch_info_test.go +++ b/x/inflation/v1/keeper/epoch_info_test.go @@ -3,8 +3,8 @@ package keeper_test import ( "fmt" - epochstypes "github.com/evmos/evmos/v18/x/epochs/types" - "github.com/evmos/evmos/v18/x/inflation/v1/types" + epochstypes "github.com/evmos/evmos/v19/x/epochs/types" + "github.com/evmos/evmos/v19/x/inflation/v1/types" ) func (suite *KeeperTestSuite) TestSetGetEpochIdentifier() { diff --git a/x/inflation/v1/keeper/grpc_query.go b/x/inflation/v1/keeper/grpc_query.go index d39cce58a2..7d529a77e9 100644 --- a/x/inflation/v1/keeper/grpc_query.go +++ b/x/inflation/v1/keeper/grpc_query.go @@ -7,7 +7,7 @@ import ( "context" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/x/inflation/v1/types" + "github.com/evmos/evmos/v19/x/inflation/v1/types" ) var _ types.QueryServer = Keeper{} diff --git a/x/inflation/v1/keeper/grpc_query_test.go b/x/inflation/v1/keeper/grpc_query_test.go index da32ac0086..a55d37f36d 100644 --- a/x/inflation/v1/keeper/grpc_query_test.go +++ b/x/inflation/v1/keeper/grpc_query_test.go @@ -6,8 +6,8 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" - evmostypes "github.com/evmos/evmos/v18/types" - "github.com/evmos/evmos/v18/x/inflation/v1/types" + evmostypes "github.com/evmos/evmos/v19/types" + "github.com/evmos/evmos/v19/x/inflation/v1/types" ) func (suite *KeeperTestSuite) TestPeriod() { //nolint:dupl diff --git a/x/inflation/v1/keeper/hooks.go b/x/inflation/v1/keeper/hooks.go index c3639aa649..c2f5036126 100644 --- a/x/inflation/v1/keeper/hooks.go +++ b/x/inflation/v1/keeper/hooks.go @@ -10,8 +10,8 @@ import ( "github.com/cosmos/cosmos-sdk/telemetry" sdk "github.com/cosmos/cosmos-sdk/types" - epochstypes "github.com/evmos/evmos/v18/x/epochs/types" - "github.com/evmos/evmos/v18/x/inflation/v1/types" + epochstypes "github.com/evmos/evmos/v19/x/epochs/types" + "github.com/evmos/evmos/v19/x/inflation/v1/types" ) // BeforeEpochStart: noop, We don't need to do anything here diff --git a/x/inflation/v1/keeper/hooks_test.go b/x/inflation/v1/keeper/hooks_test.go index 6da7dd2e5f..5916e421c8 100644 --- a/x/inflation/v1/keeper/hooks_test.go +++ b/x/inflation/v1/keeper/hooks_test.go @@ -4,8 +4,8 @@ import ( "fmt" "time" - epochstypes "github.com/evmos/evmos/v18/x/epochs/types" - "github.com/evmos/evmos/v18/x/inflation/v1/types" + epochstypes "github.com/evmos/evmos/v19/x/epochs/types" + "github.com/evmos/evmos/v19/x/inflation/v1/types" ) func (suite *KeeperTestSuite) TestEpochIdentifierAfterEpochEnd() { diff --git a/x/inflation/v1/keeper/inflation.go b/x/inflation/v1/keeper/inflation.go index 21821d3adf..b48c969d3c 100644 --- a/x/inflation/v1/keeper/inflation.go +++ b/x/inflation/v1/keeper/inflation.go @@ -7,10 +7,10 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" - evmostypes "github.com/evmos/evmos/v18/types" + evmostypes "github.com/evmos/evmos/v19/types" - utils "github.com/evmos/evmos/v18/utils" - "github.com/evmos/evmos/v18/x/inflation/v1/types" + utils "github.com/evmos/evmos/v19/utils" + "github.com/evmos/evmos/v19/x/inflation/v1/types" ) // 200M token at year 4 allocated to the team diff --git a/x/inflation/v1/keeper/inflation_test.go b/x/inflation/v1/keeper/inflation_test.go index 2445af2fee..de19c9d601 100644 --- a/x/inflation/v1/keeper/inflation_test.go +++ b/x/inflation/v1/keeper/inflation_test.go @@ -6,8 +6,8 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - evmostypes "github.com/evmos/evmos/v18/types" - "github.com/evmos/evmos/v18/x/inflation/v1/types" + evmostypes "github.com/evmos/evmos/v19/types" + "github.com/evmos/evmos/v19/x/inflation/v1/types" ) func (suite *KeeperTestSuite) TestMintAndAllocateInflation() { diff --git a/x/inflation/v1/keeper/integration_test.go b/x/inflation/v1/keeper/integration_test.go index 0a51a21c69..5b244d1f65 100644 --- a/x/inflation/v1/keeper/integration_test.go +++ b/x/inflation/v1/keeper/integration_test.go @@ -10,8 +10,8 @@ import ( //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/gomega" - epochstypes "github.com/evmos/evmos/v18/x/epochs/types" - "github.com/evmos/evmos/v18/x/inflation/v1/types" + epochstypes "github.com/evmos/evmos/v19/x/epochs/types" + "github.com/evmos/evmos/v19/x/inflation/v1/types" ) var ( diff --git a/x/inflation/v1/keeper/keeper.go b/x/inflation/v1/keeper/keeper.go index 3ed737111f..6c03dbd022 100644 --- a/x/inflation/v1/keeper/keeper.go +++ b/x/inflation/v1/keeper/keeper.go @@ -9,7 +9,7 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/x/inflation/v1/types" + "github.com/evmos/evmos/v19/x/inflation/v1/types" ) // Keeper of the inflation store diff --git a/x/inflation/v1/keeper/migrations.go b/x/inflation/v1/keeper/migrations.go index 5969e3d556..b0143f6d34 100644 --- a/x/inflation/v1/keeper/migrations.go +++ b/x/inflation/v1/keeper/migrations.go @@ -5,9 +5,9 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" - v2 "github.com/evmos/evmos/v18/x/inflation/v1/migrations/v2" - v3 "github.com/evmos/evmos/v18/x/inflation/v1/migrations/v3" - "github.com/evmos/evmos/v18/x/inflation/v1/types" + v2 "github.com/evmos/evmos/v19/x/inflation/v1/migrations/v2" + v3 "github.com/evmos/evmos/v19/x/inflation/v1/migrations/v3" + "github.com/evmos/evmos/v19/x/inflation/v1/types" ) // Migrator is a struct for handling in-place store migrations. diff --git a/x/inflation/v1/keeper/migrations_test.go b/x/inflation/v1/keeper/migrations_test.go index 1543d7be24..bc26ab7a1c 100644 --- a/x/inflation/v1/keeper/migrations_test.go +++ b/x/inflation/v1/keeper/migrations_test.go @@ -7,11 +7,11 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/encoding" - inflationkeeper "github.com/evmos/evmos/v18/x/inflation/v1/keeper" - v2types "github.com/evmos/evmos/v18/x/inflation/v1/migrations/v2/types" - "github.com/evmos/evmos/v18/x/inflation/v1/types" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/encoding" + inflationkeeper "github.com/evmos/evmos/v19/x/inflation/v1/keeper" + v2types "github.com/evmos/evmos/v19/x/inflation/v1/migrations/v2/types" + "github.com/evmos/evmos/v19/x/inflation/v1/types" ) type mockSubspace struct { diff --git a/x/inflation/v1/keeper/msg_server.go b/x/inflation/v1/keeper/msg_server.go index 00c5604a5b..dd47fe66b8 100644 --- a/x/inflation/v1/keeper/msg_server.go +++ b/x/inflation/v1/keeper/msg_server.go @@ -9,7 +9,7 @@ import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - "github.com/evmos/evmos/v18/x/inflation/v1/types" + "github.com/evmos/evmos/v19/x/inflation/v1/types" ) var _ types.MsgServer = &Keeper{} diff --git a/x/inflation/v1/keeper/msg_server_test.go b/x/inflation/v1/keeper/msg_server_test.go index 2f71d9197f..1883571582 100644 --- a/x/inflation/v1/keeper/msg_server_test.go +++ b/x/inflation/v1/keeper/msg_server_test.go @@ -3,7 +3,7 @@ package keeper_test import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - "github.com/evmos/evmos/v18/x/inflation/v1/types" + "github.com/evmos/evmos/v19/x/inflation/v1/types" ) func (suite *KeeperTestSuite) TestUpdateParams() { diff --git a/x/inflation/v1/keeper/params.go b/x/inflation/v1/keeper/params.go index 1197df6585..4d7bebee5d 100644 --- a/x/inflation/v1/keeper/params.go +++ b/x/inflation/v1/keeper/params.go @@ -5,7 +5,7 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/x/inflation/v1/types" + "github.com/evmos/evmos/v19/x/inflation/v1/types" ) // GetParams returns the total set of inflation parameters. diff --git a/x/inflation/v1/keeper/params_test.go b/x/inflation/v1/keeper/params_test.go index 97a9f67c5b..b8918d63c2 100644 --- a/x/inflation/v1/keeper/params_test.go +++ b/x/inflation/v1/keeper/params_test.go @@ -1,7 +1,7 @@ package keeper_test import ( - "github.com/evmos/evmos/v18/x/inflation/v1/types" + "github.com/evmos/evmos/v19/x/inflation/v1/types" ) func (suite *KeeperTestSuite) TestParams() { diff --git a/x/inflation/v1/keeper/periods.go b/x/inflation/v1/keeper/periods.go index e125b35c9f..497a0dfa7c 100644 --- a/x/inflation/v1/keeper/periods.go +++ b/x/inflation/v1/keeper/periods.go @@ -5,7 +5,7 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/x/inflation/v1/types" + "github.com/evmos/evmos/v19/x/inflation/v1/types" ) // GetPeriod gets current period diff --git a/x/inflation/v1/keeper/setup_test.go b/x/inflation/v1/keeper/setup_test.go index 6e86ecfd68..8bf2cea7c5 100644 --- a/x/inflation/v1/keeper/setup_test.go +++ b/x/inflation/v1/keeper/setup_test.go @@ -11,10 +11,10 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/suite" - evm "github.com/evmos/evmos/v18/x/evm/types" + evm "github.com/evmos/evmos/v19/x/evm/types" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/x/inflation/v1/types" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/x/inflation/v1/types" ) var denomMint = types.DefaultInflationDenom diff --git a/x/inflation/v1/keeper/utils_test.go b/x/inflation/v1/keeper/utils_test.go index 328f5657f6..5bfe408cad 100644 --- a/x/inflation/v1/keeper/utils_test.go +++ b/x/inflation/v1/keeper/utils_test.go @@ -4,12 +4,12 @@ import ( "time" "github.com/cosmos/cosmos-sdk/baseapp" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/testutil" - utils "github.com/evmos/evmos/v18/utils" - epochstypes "github.com/evmos/evmos/v18/x/epochs/types" - evm "github.com/evmos/evmos/v18/x/evm/types" - "github.com/evmos/evmos/v18/x/inflation/v1/types" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/testutil" + utils "github.com/evmos/evmos/v19/utils" + epochstypes "github.com/evmos/evmos/v19/x/epochs/types" + evm "github.com/evmos/evmos/v19/x/evm/types" + "github.com/evmos/evmos/v19/x/inflation/v1/types" ) // Test helpers diff --git a/x/inflation/v1/migrations/v2/migrate.go b/x/inflation/v1/migrations/v2/migrate.go index 430818a913..67a337f47a 100644 --- a/x/inflation/v1/migrations/v2/migrate.go +++ b/x/inflation/v1/migrations/v2/migrate.go @@ -7,8 +7,8 @@ import ( "github.com/cosmos/cosmos-sdk/codec" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - v2types "github.com/evmos/evmos/v18/x/inflation/v1/migrations/v2/types" - "github.com/evmos/evmos/v18/x/inflation/v1/types" + v2types "github.com/evmos/evmos/v19/x/inflation/v1/migrations/v2/types" + "github.com/evmos/evmos/v19/x/inflation/v1/types" ) // MigrateStore migrates the x/inflation module state from the consensus version 1 to diff --git a/x/inflation/v1/migrations/v2/migrate_test.go b/x/inflation/v1/migrations/v2/migrate_test.go index 8f3309b508..8d438c805e 100644 --- a/x/inflation/v1/migrations/v2/migrate_test.go +++ b/x/inflation/v1/migrations/v2/migrate_test.go @@ -6,14 +6,14 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - v2 "github.com/evmos/evmos/v18/x/inflation/v1/migrations/v2" - "github.com/evmos/evmos/v18/x/inflation/v1/types" + v2 "github.com/evmos/evmos/v19/x/inflation/v1/migrations/v2" + "github.com/evmos/evmos/v19/x/inflation/v1/types" "github.com/cosmos/cosmos-sdk/testutil" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/encoding" - v2types "github.com/evmos/evmos/v18/x/inflation/v1/migrations/v2/types" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/encoding" + v2types "github.com/evmos/evmos/v19/x/inflation/v1/migrations/v2/types" "github.com/stretchr/testify/require" ) diff --git a/x/inflation/v1/migrations/v2/types/params.go b/x/inflation/v1/migrations/v2/types/params.go index f4b121d9aa..f0cace8824 100644 --- a/x/inflation/v1/migrations/v2/types/params.go +++ b/x/inflation/v1/migrations/v2/types/params.go @@ -11,8 +11,8 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - evm "github.com/evmos/evmos/v18/x/evm/types" - "github.com/evmos/evmos/v18/x/inflation/v1/types" + evm "github.com/evmos/evmos/v19/x/evm/types" + "github.com/evmos/evmos/v19/x/inflation/v1/types" ) var _ types.LegacyParams = &V2Params{} diff --git a/x/inflation/v1/migrations/v3/migrate_test.go b/x/inflation/v1/migrations/v3/migrate_test.go index d648334e00..89b56ed8d2 100644 --- a/x/inflation/v1/migrations/v3/migrate_test.go +++ b/x/inflation/v1/migrations/v3/migrate_test.go @@ -5,8 +5,8 @@ import ( "github.com/cosmos/cosmos-sdk/testutil" sdk "github.com/cosmos/cosmos-sdk/types" - v3 "github.com/evmos/evmos/v18/x/inflation/v1/migrations/v3" - "github.com/evmos/evmos/v18/x/inflation/v1/types" + v3 "github.com/evmos/evmos/v19/x/inflation/v1/migrations/v3" + "github.com/evmos/evmos/v19/x/inflation/v1/types" "github.com/stretchr/testify/require" ) diff --git a/x/inflation/v1/module.go b/x/inflation/v1/module.go index d9246069a2..702a128f56 100644 --- a/x/inflation/v1/module.go +++ b/x/inflation/v1/module.go @@ -21,9 +21,9 @@ import ( "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" - "github.com/evmos/evmos/v18/x/inflation/v1/client/cli" - "github.com/evmos/evmos/v18/x/inflation/v1/keeper" - "github.com/evmos/evmos/v18/x/inflation/v1/types" + "github.com/evmos/evmos/v19/x/inflation/v1/client/cli" + "github.com/evmos/evmos/v19/x/inflation/v1/keeper" + "github.com/evmos/evmos/v19/x/inflation/v1/types" ) // consensusVersion defines the current x/inflation module consensus version. diff --git a/x/inflation/v1/types/genesis.go b/x/inflation/v1/types/genesis.go index 74b76cbc2f..8da4b787d0 100644 --- a/x/inflation/v1/types/genesis.go +++ b/x/inflation/v1/types/genesis.go @@ -6,7 +6,7 @@ package types import ( fmt "fmt" - epochstypes "github.com/evmos/evmos/v18/x/epochs/types" + epochstypes "github.com/evmos/evmos/v19/x/epochs/types" ) // NewGenesisState creates a new GenesisState object diff --git a/x/inflation/v1/types/genesis_test.go b/x/inflation/v1/types/genesis_test.go index 3db11513bb..3cffa082a3 100644 --- a/x/inflation/v1/types/genesis_test.go +++ b/x/inflation/v1/types/genesis_test.go @@ -3,7 +3,7 @@ package types import ( "testing" - epochstypes "github.com/evmos/evmos/v18/x/epochs/types" + epochstypes "github.com/evmos/evmos/v19/x/epochs/types" "github.com/stretchr/testify/suite" ) diff --git a/x/inflation/v1/types/inflation_calculation.go b/x/inflation/v1/types/inflation_calculation.go index 9d62c17fe8..ee8a01844b 100644 --- a/x/inflation/v1/types/inflation_calculation.go +++ b/x/inflation/v1/types/inflation_calculation.go @@ -6,7 +6,7 @@ package types import ( "cosmossdk.io/math" - evmostypes "github.com/evmos/evmos/v18/types" + evmostypes "github.com/evmos/evmos/v19/types" ) const ( diff --git a/x/inflation/v1/types/params.go b/x/inflation/v1/types/params.go index 2db7a9f0a1..6661ed28bb 100644 --- a/x/inflation/v1/types/params.go +++ b/x/inflation/v1/types/params.go @@ -10,7 +10,7 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" - evm "github.com/evmos/evmos/v18/x/evm/types" + evm "github.com/evmos/evmos/v19/x/evm/types" ) var ParamsKey = []byte("Params") diff --git a/x/staking/keeper/integration_test.go b/x/staking/keeper/integration_test.go index 3fd456f6c5..8d23b18ec1 100644 --- a/x/staking/keeper/integration_test.go +++ b/x/staking/keeper/integration_test.go @@ -12,14 +12,14 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v18/testutil" - "github.com/evmos/evmos/v18/testutil/integration/common/factory" - evmosfactory "github.com/evmos/evmos/v18/testutil/integration/evmos/factory" - "github.com/evmos/evmos/v18/testutil/integration/evmos/grpc" - "github.com/evmos/evmos/v18/testutil/integration/evmos/keyring" - "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - "github.com/evmos/evmos/v18/utils" - vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" + "github.com/evmos/evmos/v19/testutil" + "github.com/evmos/evmos/v19/testutil/integration/common/factory" + evmosfactory "github.com/evmos/evmos/v19/testutil/integration/evmos/factory" + "github.com/evmos/evmos/v19/testutil/integration/evmos/grpc" + "github.com/evmos/evmos/v19/testutil/integration/evmos/keyring" + "github.com/evmos/evmos/v19/testutil/integration/evmos/network" + "github.com/evmos/evmos/v19/utils" + vestingtypes "github.com/evmos/evmos/v19/x/vesting/types" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" diff --git a/x/staking/keeper/msg_server.go b/x/staking/keeper/msg_server.go index 53749ce8f5..eecc8336fa 100644 --- a/x/staking/keeper/msg_server.go +++ b/x/staking/keeper/msg_server.go @@ -13,7 +13,7 @@ import ( sdkstakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" "github.com/cosmos/cosmos-sdk/x/staking/types" - vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" + vestingtypes "github.com/evmos/evmos/v19/x/vesting/types" ) // msgServer is a wrapper around the Cosmos SDK message server. diff --git a/x/staking/keeper/msg_server_test.go b/x/staking/keeper/msg_server_test.go index 31ea7f6179..27c739e594 100644 --- a/x/staking/keeper/msg_server_test.go +++ b/x/staking/keeper/msg_server_test.go @@ -12,12 +12,12 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v18/testutil" - "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/utils" - "github.com/evmos/evmos/v18/x/staking/keeper" - vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" + "github.com/evmos/evmos/v19/testutil" + "github.com/evmos/evmos/v19/testutil/integration/evmos/network" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/utils" + "github.com/evmos/evmos/v19/x/staking/keeper" + vestingtypes "github.com/evmos/evmos/v19/x/vesting/types" "github.com/stretchr/testify/require" ) diff --git a/x/staking/keeper/util_test.go b/x/staking/keeper/util_test.go index 94b98c4d70..b25ed7ce1e 100644 --- a/x/staking/keeper/util_test.go +++ b/x/staking/keeper/util_test.go @@ -8,9 +8,9 @@ import ( "time" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/testutil" - "github.com/evmos/evmos/v18/testutil/integration/evmos/network" - "github.com/evmos/evmos/v18/x/vesting/types" + "github.com/evmos/evmos/v19/testutil" + "github.com/evmos/evmos/v19/testutil/integration/evmos/network" + "github.com/evmos/evmos/v19/x/vesting/types" ) // setupClawbackVestingAccount sets up a clawback vesting account diff --git a/x/staking/module.go b/x/staking/module.go index 455045ca45..5533add536 100644 --- a/x/staking/module.go +++ b/x/staking/module.go @@ -11,7 +11,7 @@ import ( stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/evmos/v18/x/staking/keeper" + "github.com/evmos/evmos/v19/x/staking/keeper" ) var ( diff --git a/x/vesting/client/cli/query.go b/x/vesting/client/cli/query.go index 0f07245eac..c66093e3f9 100644 --- a/x/vesting/client/cli/query.go +++ b/x/vesting/client/cli/query.go @@ -11,7 +11,7 @@ import ( "github.com/cosmos/cosmos-sdk/client/flags" "github.com/spf13/cobra" - "github.com/evmos/evmos/v18/x/vesting/types" + "github.com/evmos/evmos/v19/x/vesting/types" ) // GetQueryCmd returns the parent command for all vesting CLI query commands. diff --git a/x/vesting/client/cli/tx.go b/x/vesting/client/cli/tx.go index 0daf4ade6c..5cc9753b06 100644 --- a/x/vesting/client/cli/tx.go +++ b/x/vesting/client/cli/tx.go @@ -19,7 +19,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/gov/client/cli" govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - "github.com/evmos/evmos/v18/x/vesting/types" + "github.com/evmos/evmos/v19/x/vesting/types" ) // Transaction command flags diff --git a/x/vesting/client/proposal_handler.go b/x/vesting/client/proposal_handler.go index 42a1e883ca..dbac2bf61d 100644 --- a/x/vesting/client/proposal_handler.go +++ b/x/vesting/client/proposal_handler.go @@ -6,7 +6,7 @@ package client import ( govclient "github.com/cosmos/cosmos-sdk/x/gov/client" - "github.com/evmos/evmos/v18/x/vesting/client/cli" + "github.com/evmos/evmos/v19/x/vesting/client/cli" ) var RegisterClawbackProposalHandler = govclient.NewProposalHandler(cli.NewClawbackProposalCmd) diff --git a/x/vesting/handler.go b/x/vesting/handler.go index 2f81dd2a93..87fa96f440 100644 --- a/x/vesting/handler.go +++ b/x/vesting/handler.go @@ -8,7 +8,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/evmos/evmos/v18/x/vesting/types" + "github.com/evmos/evmos/v19/x/vesting/types" ) // NewHandler returns a handler for vesting module message types. diff --git a/x/vesting/keeper/gov.go b/x/vesting/keeper/gov.go index d0a8957483..65a4b5181b 100644 --- a/x/vesting/keeper/gov.go +++ b/x/vesting/keeper/gov.go @@ -5,7 +5,7 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/x/vesting/types" + "github.com/evmos/evmos/v19/x/vesting/types" ) // HasGovClawbackDisabled checks if the given account has governance clawback disabled. diff --git a/x/vesting/keeper/gov_test.go b/x/vesting/keeper/gov_test.go index aed1132aa6..becb2a2c46 100644 --- a/x/vesting/keeper/gov_test.go +++ b/x/vesting/keeper/gov_test.go @@ -2,7 +2,7 @@ package keeper_test import ( sdk "github.com/cosmos/cosmos-sdk/types" - testutiltx "github.com/evmos/evmos/v18/testutil/tx" + testutiltx "github.com/evmos/evmos/v19/testutil/tx" ) func (suite *KeeperTestSuite) TestGovClawbackStore() { diff --git a/x/vesting/keeper/grpc_query.go b/x/vesting/keeper/grpc_query.go index 4076380413..a21caea9b9 100644 --- a/x/vesting/keeper/grpc_query.go +++ b/x/vesting/keeper/grpc_query.go @@ -10,7 +10,7 @@ import ( "google.golang.org/grpc/codes" "google.golang.org/grpc/status" - "github.com/evmos/evmos/v18/x/vesting/types" + "github.com/evmos/evmos/v19/x/vesting/types" ) var _ types.QueryServer = Keeper{} diff --git a/x/vesting/keeper/grpc_query_test.go b/x/vesting/keeper/grpc_query_test.go index a18f8a9dd9..b98c175a24 100644 --- a/x/vesting/keeper/grpc_query_test.go +++ b/x/vesting/keeper/grpc_query_test.go @@ -6,8 +6,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/evmos/evmos/v18/testutil" - "github.com/evmos/evmos/v18/x/vesting/types" + "github.com/evmos/evmos/v19/testutil" + "github.com/evmos/evmos/v19/x/vesting/types" ) func (suite *KeeperTestSuite) TestBalances() { diff --git a/x/vesting/keeper/hooks.go b/x/vesting/keeper/hooks.go index 2e95f40491..72b540f6c5 100644 --- a/x/vesting/keeper/hooks.go +++ b/x/vesting/keeper/hooks.go @@ -9,7 +9,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" - vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" + vestingtypes "github.com/evmos/evmos/v19/x/vesting/types" ) var _ govtypes.GovHooks = Hooks{} diff --git a/x/vesting/keeper/integration_test.go b/x/vesting/keeper/integration_test.go index 21261f640d..20424e6152 100644 --- a/x/vesting/keeper/integration_test.go +++ b/x/vesting/keeper/integration_test.go @@ -25,14 +25,14 @@ import ( stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/contracts" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" - "github.com/evmos/evmos/v18/testutil" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/utils" - erc20types "github.com/evmos/evmos/v18/x/erc20/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" - "github.com/evmos/evmos/v18/x/vesting/types" + "github.com/evmos/evmos/v19/contracts" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" + "github.com/evmos/evmos/v19/testutil" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/utils" + erc20types "github.com/evmos/evmos/v19/x/erc20/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" + "github.com/evmos/evmos/v19/x/vesting/types" ) func TestKeeperIntegrationTestSuite(t *testing.T) { diff --git a/x/vesting/keeper/keeper.go b/x/vesting/keeper/keeper.go index 546abbb92a..a91f6d0e15 100644 --- a/x/vesting/keeper/keeper.go +++ b/x/vesting/keeper/keeper.go @@ -11,7 +11,7 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/x/vesting/types" + "github.com/evmos/evmos/v19/x/vesting/types" ) // Keeper of this module maintains collections of vesting. diff --git a/x/vesting/keeper/keeper_test.go b/x/vesting/keeper/keeper_test.go index 8c9036e799..c1c4a8d137 100644 --- a/x/vesting/keeper/keeper_test.go +++ b/x/vesting/keeper/keeper_test.go @@ -2,10 +2,10 @@ package keeper_test import ( sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/encoding" - "github.com/evmos/evmos/v18/x/vesting/keeper" - vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/encoding" + "github.com/evmos/evmos/v19/x/vesting/keeper" + vestingtypes "github.com/evmos/evmos/v19/x/vesting/types" ) func (suite *KeeperTestSuite) TestNewKeeper() { diff --git a/x/vesting/keeper/migrations.go b/x/vesting/keeper/migrations.go index d6bc69beed..57ecc901a8 100644 --- a/x/vesting/keeper/migrations.go +++ b/x/vesting/keeper/migrations.go @@ -5,8 +5,8 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" - v2 "github.com/evmos/evmos/v18/x/vesting/migrations/v2" - v3 "github.com/evmos/evmos/v18/x/vesting/migrations/v3" + v2 "github.com/evmos/evmos/v19/x/vesting/migrations/v2" + v3 "github.com/evmos/evmos/v19/x/vesting/migrations/v3" ) var ( diff --git a/x/vesting/keeper/migrations_test.go b/x/vesting/keeper/migrations_test.go index b928cf7bf2..5522e27d6e 100644 --- a/x/vesting/keeper/migrations_test.go +++ b/x/vesting/keeper/migrations_test.go @@ -6,10 +6,10 @@ import ( "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" sdkvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" - testutiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/x/vesting/keeper" - v1vestingtypes "github.com/evmos/evmos/v18/x/vesting/migrations/types" - vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" + testutiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/x/vesting/keeper" + v1vestingtypes "github.com/evmos/evmos/v19/x/vesting/migrations/types" + vestingtypes "github.com/evmos/evmos/v19/x/vesting/types" ) func (suite *KeeperTestSuite) TestMigrate1to2() { diff --git a/x/vesting/keeper/msg_server.go b/x/vesting/keeper/msg_server.go index f8d0be6210..13969e9632 100644 --- a/x/vesting/keeper/msg_server.go +++ b/x/vesting/keeper/msg_server.go @@ -14,8 +14,8 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" sdkvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types" - "github.com/evmos/evmos/v18/utils" - "github.com/evmos/evmos/v18/x/vesting/types" + "github.com/evmos/evmos/v19/utils" + "github.com/evmos/evmos/v19/x/vesting/types" ) var _ types.MsgServer = &Keeper{} diff --git a/x/vesting/keeper/msg_server_test.go b/x/vesting/keeper/msg_server_test.go index 0ed4a20881..80ec076405 100644 --- a/x/vesting/keeper/msg_server_test.go +++ b/x/vesting/keeper/msg_server_test.go @@ -8,11 +8,11 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" vestingexported "github.com/cosmos/cosmos-sdk/x/auth/vesting/exported" sdkvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" - "github.com/evmos/evmos/v18/contracts" - "github.com/evmos/evmos/v18/testutil" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/utils" - "github.com/evmos/evmos/v18/x/vesting/types" + "github.com/evmos/evmos/v19/contracts" + "github.com/evmos/evmos/v19/testutil" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/utils" + "github.com/evmos/evmos/v19/x/vesting/types" ) var ( diff --git a/x/vesting/keeper/setup_test.go b/x/vesting/keeper/setup_test.go index 40d1574850..76c622d052 100644 --- a/x/vesting/keeper/setup_test.go +++ b/x/vesting/keeper/setup_test.go @@ -20,16 +20,16 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/evmos/v18/crypto/ethsecp256k1" - "github.com/evmos/evmos/v18/encoding" - "github.com/evmos/evmos/v18/testutil" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/utils" - epochstypes "github.com/evmos/evmos/v18/x/epochs/types" - evmtypes "github.com/evmos/evmos/v18/x/evm/types" - - "github.com/evmos/evmos/v18/app" - "github.com/evmos/evmos/v18/x/vesting/types" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" + "github.com/evmos/evmos/v19/encoding" + "github.com/evmos/evmos/v19/testutil" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/utils" + epochstypes "github.com/evmos/evmos/v19/x/epochs/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" + + "github.com/evmos/evmos/v19/app" + "github.com/evmos/evmos/v19/x/vesting/types" ) var ( diff --git a/x/vesting/keeper/utils.go b/x/vesting/keeper/utils.go index 93c53dce4c..2f8b1b509e 100644 --- a/x/vesting/keeper/utils.go +++ b/x/vesting/keeper/utils.go @@ -8,7 +8,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/evmos/evmos/v18/x/vesting/types" + "github.com/evmos/evmos/v19/x/vesting/types" ) // GetClawbackVestingAccount is a helper function to get the account from the diff --git a/x/vesting/keeper/utils_test.go b/x/vesting/keeper/utils_test.go index d59632e5d2..491b35e943 100644 --- a/x/vesting/keeper/utils_test.go +++ b/x/vesting/keeper/utils_test.go @@ -12,10 +12,10 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/ethereum/go-ethereum/common" - evmante "github.com/evmos/evmos/v18/app/ante/evm" - "github.com/evmos/evmos/v18/contracts" - "github.com/evmos/evmos/v18/testutil" - "github.com/evmos/evmos/v18/x/vesting/types" + evmante "github.com/evmos/evmos/v19/app/ante/evm" + "github.com/evmos/evmos/v19/contracts" + "github.com/evmos/evmos/v19/testutil" + "github.com/evmos/evmos/v19/x/vesting/types" ) // Commit commits and starts a new block with an updated context. diff --git a/x/vesting/migrations/v2/migrate.go b/x/vesting/migrations/v2/migrate.go index 0c8814a859..c2a074e174 100644 --- a/x/vesting/migrations/v2/migrate.go +++ b/x/vesting/migrations/v2/migrate.go @@ -5,8 +5,8 @@ package v2 import ( sdk "github.com/cosmos/cosmos-sdk/types" accounttypes "github.com/cosmos/cosmos-sdk/x/auth/types" - v1vestingtypes "github.com/evmos/evmos/v18/x/vesting/migrations/types" - vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" + v1vestingtypes "github.com/evmos/evmos/v19/x/vesting/migrations/types" + vestingtypes "github.com/evmos/evmos/v19/x/vesting/types" ) // MigrateStore migrates the x/vesting module state from the consensus version 1 to diff --git a/x/vesting/migrations/v3/migrate.go b/x/vesting/migrations/v3/migrate.go index ff7cf7f398..ee5bb277f8 100644 --- a/x/vesting/migrations/v3/migrate.go +++ b/x/vesting/migrations/v3/migrate.go @@ -5,7 +5,7 @@ package v3 import ( sdk "github.com/cosmos/cosmos-sdk/types" accounttypes "github.com/cosmos/cosmos-sdk/x/auth/types" - vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" + vestingtypes "github.com/evmos/evmos/v19/x/vesting/types" ) // MigrateStore migrates the x/vesting module state from the consensus version 2 to diff --git a/x/vesting/module.go b/x/vesting/module.go index 0634a07990..3234e54df5 100644 --- a/x/vesting/module.go +++ b/x/vesting/module.go @@ -22,9 +22,9 @@ import ( bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" - "github.com/evmos/evmos/v18/x/vesting/client/cli" - "github.com/evmos/evmos/v18/x/vesting/keeper" - "github.com/evmos/evmos/v18/x/vesting/types" + "github.com/evmos/evmos/v19/x/vesting/client/cli" + "github.com/evmos/evmos/v19/x/vesting/keeper" + "github.com/evmos/evmos/v19/x/vesting/types" ) // consensusVersion defines the current x/vesting module consensus version. diff --git a/x/vesting/proposal_handler.go b/x/vesting/proposal_handler.go index bfd7884832..d556b43346 100644 --- a/x/vesting/proposal_handler.go +++ b/x/vesting/proposal_handler.go @@ -11,8 +11,8 @@ import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - "github.com/evmos/evmos/v18/x/vesting/keeper" - "github.com/evmos/evmos/v18/x/vesting/types" + "github.com/evmos/evmos/v19/x/vesting/keeper" + "github.com/evmos/evmos/v19/x/vesting/types" ) // NewVestingProposalHandler creates a governance handler to manage new proposal types. diff --git a/x/vesting/proposal_handler_test.go b/x/vesting/proposal_handler_test.go index c5b60fcc67..e46966928c 100644 --- a/x/vesting/proposal_handler_test.go +++ b/x/vesting/proposal_handler_test.go @@ -5,10 +5,10 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" sdkvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" - "github.com/evmos/evmos/v18/testutil" - testutiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/x/vesting" - vestingtypes "github.com/evmos/evmos/v18/x/vesting/types" + "github.com/evmos/evmos/v19/testutil" + testutiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/x/vesting" + vestingtypes "github.com/evmos/evmos/v19/x/vesting/types" ) var ( diff --git a/x/vesting/setup_test.go b/x/vesting/setup_test.go index e6174394b0..a611e5e6cd 100644 --- a/x/vesting/setup_test.go +++ b/x/vesting/setup_test.go @@ -8,7 +8,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v18/app" + "github.com/evmos/evmos/v19/app" "github.com/stretchr/testify/suite" ) diff --git a/x/vesting/types/clawback_vesting_account_test.go b/x/vesting/types/clawback_vesting_account_test.go index c20ef22f1c..dff39e6ba5 100644 --- a/x/vesting/types/clawback_vesting_account_test.go +++ b/x/vesting/types/clawback_vesting_account_test.go @@ -11,8 +11,8 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" sdkvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/x/vesting/types" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/x/vesting/types" ) var ( diff --git a/x/vesting/types/codec.go b/x/vesting/types/codec.go index 34c3f73fc1..8bda323e70 100644 --- a/x/vesting/types/codec.go +++ b/x/vesting/types/codec.go @@ -12,7 +12,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/vesting/exported" sdkvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - migrationtypes "github.com/evmos/evmos/v18/x/vesting/migrations/types" + migrationtypes "github.com/evmos/evmos/v19/x/vesting/migrations/types" ) var ( diff --git a/x/vesting/types/msg_test.go b/x/vesting/types/msg_test.go index dc5e4348a5..fc4c8d231b 100644 --- a/x/vesting/types/msg_test.go +++ b/x/vesting/types/msg_test.go @@ -10,8 +10,8 @@ import ( sdkvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" "github.com/stretchr/testify/suite" - utiltx "github.com/evmos/evmos/v18/testutil/tx" - "github.com/evmos/evmos/v18/x/vesting/types" + utiltx "github.com/evmos/evmos/v19/testutil/tx" + "github.com/evmos/evmos/v19/x/vesting/types" ) type MsgsTestSuite struct { diff --git a/x/vesting/types/proposal_test.go b/x/vesting/types/proposal_test.go index 530af51af3..f2b47fe3be 100644 --- a/x/vesting/types/proposal_test.go +++ b/x/vesting/types/proposal_test.go @@ -3,7 +3,7 @@ package types_test import ( "testing" - "github.com/evmos/evmos/v18/x/vesting/types" + "github.com/evmos/evmos/v19/x/vesting/types" "github.com/stretchr/testify/suite" ) diff --git a/x/vesting/utils_test.go b/x/vesting/utils_test.go index 7fe9ccbd56..3fe671af22 100644 --- a/x/vesting/utils_test.go +++ b/x/vesting/utils_test.go @@ -15,12 +15,12 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - evmosapp "github.com/evmos/evmos/v18/app" - cmn "github.com/evmos/evmos/v18/precompiles/common" - evmosutil "github.com/evmos/evmos/v18/testutil" - testutiltx "github.com/evmos/evmos/v18/testutil/tx" - evmostypes "github.com/evmos/evmos/v18/types" - "github.com/evmos/evmos/v18/utils" + evmosapp "github.com/evmos/evmos/v19/app" + cmn "github.com/evmos/evmos/v19/precompiles/common" + evmosutil "github.com/evmos/evmos/v19/testutil" + testutiltx "github.com/evmos/evmos/v19/testutil/tx" + evmostypes "github.com/evmos/evmos/v19/types" + "github.com/evmos/evmos/v19/utils" ) // SetupWithGenesisValSet initializes a new EvmosApp with a validator set and genesis accounts From 704a520c96808ac369c4d5ac1e6b05b05cf5f4a9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 Jul 2024 07:50:13 +0000 Subject: [PATCH 327/345] build(deps): bump github.com/holiman/uint256 from 1.2.1 to 1.3.0 (#2676) * build(deps): bump github.com/holiman/uint256 from 1.2.1 to 1.3.0 Bumps [github.com/holiman/uint256](https://github.com/holiman/uint256) from 1.2.1 to 1.3.0. - [Release notes](https://github.com/holiman/uint256/releases) - [Commits](https://github.com/holiman/uint256/compare/v1.2.1...v1.3.0) --- updated-dependencies: - dependency-name: github.com/holiman/uint256 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * update gomod2nix.toml file --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- gomod2nix.toml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index da14e56ff6..99661bd130 100644 --- a/go.mod +++ b/go.mod @@ -29,7 +29,7 @@ require ( github.com/gorilla/websocket v1.5.3 github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/hashicorp/go-version v1.7.0 - github.com/holiman/uint256 v1.2.1 + github.com/holiman/uint256 v1.3.0 github.com/improbable-eng/grpc-web v0.15.0 github.com/linxGnu/grocksdb v1.9.2 github.com/onsi/ginkgo/v2 v2.19.0 diff --git a/go.sum b/go.sum index 3b571a7084..be2c37f036 100644 --- a/go.sum +++ b/go.sum @@ -758,8 +758,8 @@ github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7H github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= -github.com/holiman/uint256 v1.2.1 h1:XRtyuda/zw2l+Bq/38n5XUoEF72aSOu/77Thd9pPp2o= -github.com/holiman/uint256 v1.2.1/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= +github.com/holiman/uint256 v1.3.0 h1:4wdcm/tnd0xXdu7iS3ruNvxkWwrb4aeBQv19ayYn8F4= +github.com/holiman/uint256 v1.3.0/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= diff --git a/gomod2nix.toml b/gomod2nix.toml index 7855c78bba..e5535a64b1 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -387,8 +387,8 @@ schema = 3 version = "v2.0.3" hash = "sha256-5VsJMQzJSNd4F7yAl3iF/q6JodWOlE4dUvTQ0UGPe+k=" [mod."github.com/holiman/uint256"] - version = "v1.2.1" - hash = "sha256-1N+MvvzTIegV1UPEGUVyxBZaxczId/Z/BUVcnx7ckHE=" + version = "v1.3.0" + hash = "sha256-IYlU63nnWLOu9RYiTYPatjcpvcWPvlIC7tI2Y/Hf3CI=" [mod."github.com/huandu/skiplist"] version = "v1.2.0" hash = "sha256-/r4QP1SldMlhpkr1ZQFHImSYaeMZEtqBW7R53yN+JtQ=" From aa9d464d518fb3a79966f79e794c0000d8387672 Mon Sep 17 00:00:00 2001 From: Ramiro Carlucho Date: Fri, 19 Jul 2024 10:12:19 -0300 Subject: [PATCH 328/345] chore: revert eth base account changes (#2679) * Revert "imp(evm): Remove EthAccount type and use BaseAccount instead (#2633)" This reverts commit deea200b4d396b8852831e1e32f2e81119dcda01. * fixes * statedb fix * docs fixes * fix types * lint * changelog --- CHANGELOG.md | 1 + app/app.go | 6 +- app/upgrades/v19/upgrades.go | 28 --- app/upgrades/v19/upgrades_test.go | 165 ------------------ client/docs/swagger-ui/swagger.json | 2 +- client/testnet.go | 9 +- cmd/config/config.go | 2 +- cmd/evmosd/genaccounts.go | 11 +- cmd/evmosd/testnet.go | 6 +- ibc/testing/chain.go | 14 +- precompiles/distribution/integration_test.go | 6 - precompiles/distribution/tx.go | 2 +- precompiles/distribution/utils_test.go | 9 +- precompiles/ics20/utils_test.go | 14 +- precompiles/staking/utils_test.go | 9 +- precompiles/vesting/tx_test.go | 11 +- precompiles/vesting/utils_test.go | 9 +- proto/ethermint/evm/v1/query.proto | 2 +- proto/ethermint/types/v1/account.proto | 27 +++ proto/evmos/erc20/v1/erc20.proto | 4 +- testutil/integration/evmos/network/setup.go | 12 +- testutil/integration/evmos/utils/contracts.go | 15 ++ testutil/network/network.go | 7 +- types/account.go | 1 - types/account_test.go | 58 ++++++ utils/utils.go | 27 +-- utils/utils_test.go | 20 +-- x/erc20/keeper/integration_test.go | 20 +-- x/erc20/keeper/setup_test.go | 5 +- x/erc20/keeper/utils_test.go | 18 +- x/evm/genesis.go | 45 +++-- x/evm/genesis_test.go | 134 +++++--------- x/evm/keeper/integration_test.go | 12 +- x/evm/keeper/keeper.go | 10 +- x/evm/keeper/keeper_test.go | 53 ++---- x/evm/keeper/setup_test.go | 16 +- x/evm/keeper/statedb.go | 144 +++++---------- x/evm/keeper/statedb_test.go | 157 ++++------------- x/evm/keeper/utils.go | 17 -- x/evm/migrations/v7/types/evm.pb.go | 2 +- x/evm/module.go | 2 +- x/evm/statedb/interfaces.go | 2 - x/evm/statedb/mock_test.go | 20 +-- x/evm/statedb/state_object.go | 21 +-- x/evm/statedb/statedb.go | 15 +- x/evm/types/evm.pb.go | 2 +- x/evm/types/interfaces.go | 1 + x/evm/types/key.go | 8 +- x/evm/types/query.pb.go | 4 +- x/evm/types/utils.go | 23 +-- x/feemarket/keeper/utils_test.go | 8 +- x/staking/keeper/msg_server_test.go | 4 +- x/vesting/keeper/keeper.go | 3 - x/vesting/keeper/keeper_test.go | 2 - x/vesting/keeper/msg_server.go | 37 ++-- x/vesting/keeper/msg_server_test.go | 61 +++---- x/vesting/keeper/setup_test.go | 8 +- x/vesting/types/interfaces.go | 7 - x/vesting/utils_test.go | 11 +- 59 files changed, 517 insertions(+), 832 deletions(-) delete mode 100644 app/upgrades/v19/upgrades_test.go create mode 100644 proto/ethermint/types/v1/account.proto create mode 100644 types/account_test.go delete mode 100644 x/evm/keeper/utils.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 9fb2485ed9..0d3b18edce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -64,6 +64,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (precompiles) [GHSA-68fc-7mhg-6f6c](https://github.com/evmos/evmos/commit/bb2d504eec9078d6eff6981fc0cb214e8a3ca496) Refactor precompiles to use journal entries. - (vesting-precompile) [GHSA-q6hg-6m9x-5g9c](https://github.com/evmos/evmos/commit/0a620e176617a835ac697eea494afea09185dfaf) Update vesting precompile authorization checks. - (erc20) [#2607](https://github.com/evmos/evmos/pull/2607) Implement Single Token Representation v2. +- (evm) [#2679](https://github.com/evmos/evmos/pull/2679) Reverted PR #2633. Use `EthAccount` type instead of `BaseAccount`. ### Bug Fixes diff --git a/app/app.go b/app/app.go index 47cac876bd..d874619b6b 100644 --- a/app/app.go +++ b/app/app.go @@ -406,7 +406,7 @@ func NewEvmos( // use custom Ethermint account for contracts app.AccountKeeper = authkeeper.NewAccountKeeper( appCodec, keys[authtypes.StoreKey], - authtypes.ProtoBaseAccount, maccPerms, + evmostypes.ProtoAccount, maccPerms, sdk.GetConfig().GetBech32AccountAddrPrefix(), authAddr, ) @@ -493,7 +493,7 @@ func NewEvmos( app.VestingKeeper = vestingkeeper.NewKeeper( keys[vestingtypes.StoreKey], authtypes.NewModuleAddress(govtypes.ModuleName), appCodec, - app.AccountKeeper, app.BankKeeper, app.DistrKeeper, app.EvmKeeper, app.StakingKeeper, govKeeper, // NOTE: app.govKeeper not defined yet, use govKeeper + app.AccountKeeper, app.BankKeeper, app.DistrKeeper, app.StakingKeeper, govKeeper, // NOTE: app.govKeeper not defined yet, use govKeeper ) app.Erc20Keeper = erc20keeper.NewKeeper( @@ -962,7 +962,7 @@ func (app *Evmos) BlockedAddrs() map[string]bool { } for _, precompile := range blockedPrecompilesHex { - blockedAddrs[utils.EthHexToCosmosAddr(precompile).String()] = true + blockedAddrs[utils.EthHexToSDKAddr(precompile).String()] = true } return blockedAddrs diff --git a/app/upgrades/v19/upgrades.go b/app/upgrades/v19/upgrades.go index 4f7f859787..aad8b76588 100644 --- a/app/upgrades/v19/upgrades.go +++ b/app/upgrades/v19/upgrades.go @@ -11,17 +11,14 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" "github.com/ethereum/go-ethereum/common" - evmostypes "github.com/evmos/evmos/v19/types" "github.com/evmos/evmos/v19/utils" erc20keeper "github.com/evmos/evmos/v19/x/erc20/keeper" erc20types "github.com/evmos/evmos/v19/x/erc20/types" evmkeeper "github.com/evmos/evmos/v19/x/evm/keeper" - evmtypes "github.com/evmos/evmos/v19/x/evm/types" stakingkeeper "github.com/evmos/evmos/v19/x/staking/keeper" ) @@ -51,8 +48,6 @@ func CreateUpgradeHandler( writeFn() } - MigrateEthAccountsToBaseAccounts(ctx, ak, ek) - // run module migrations first. // so we wont override erc20 params when running strv2 migration, migrationRes, err := mm.RunMigrations(ctx, configurator, vm) @@ -181,26 +176,3 @@ func registerERC20Extensions(ctx sdk.Context, return err } - -// MigrateEthAccountsToBaseAccounts is used to store the code hash of the associated -// smart contracts in the dedicated store in the EVM module and convert the former -// EthAccounts to standard Cosmos SDK accounts. -func MigrateEthAccountsToBaseAccounts(ctx sdk.Context, ak authkeeper.AccountKeeper, ek *evmkeeper.Keeper) { - ak.IterateAccounts(ctx, func(account authtypes.AccountI) (stop bool) { - ethAcc, ok := account.(*evmostypes.EthAccount) - if !ok { - return false - } - - // NOTE: we only need to add store entries for smart contracts - codeHashBytes := common.HexToHash(ethAcc.CodeHash).Bytes() - if !evmtypes.IsEmptyCodeHash(codeHashBytes) { - ek.SetCodeHash(ctx, ethAcc.EthAddress().Bytes(), codeHashBytes) - } - - // Set the base account in the account keeper instead of the EthAccount - ak.SetAccount(ctx, ethAcc.BaseAccount) - - return false - }) -} diff --git a/app/upgrades/v19/upgrades_test.go b/app/upgrades/v19/upgrades_test.go deleted file mode 100644 index 604332f83e..0000000000 --- a/app/upgrades/v19/upgrades_test.go +++ /dev/null @@ -1,165 +0,0 @@ -package v19_test - -import ( - "testing" - - codectypes "github.com/cosmos/cosmos-sdk/codec/types" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/evmos/evmos/v19/app/upgrades/v19" - testkeyring "github.com/evmos/evmos/v19/testutil/integration/evmos/keyring" - testnetwork "github.com/evmos/evmos/v19/testutil/integration/evmos/network" - evmostypes "github.com/evmos/evmos/v19/types" - "github.com/evmos/evmos/v19/utils" - evmtypes "github.com/evmos/evmos/v19/x/evm/types" - "github.com/stretchr/testify/require" -) - -const ( - // baseAccountAddress is the address of the base account that is set in genesis. - baseAccountAddress = "evmos1k5c2zrqmmyx4rfkfp3l98qxvrpcr3m4kgxd0dp" - // erc20ContractHex is the string representation of the ERC-20 token pair address. - erc20ContractHex = "0x80b5a32E4F032B2a058b4F29EC95EEfEEB87aDcd" - // SmartContractCode is the hex representation of the smart contract code that is set in genesis. - // - // NOTE: This was printed from the working branch and using ExportGenesis -> then printing the genesis account code. - smartContractCode = "608060405234801561000f575f80fd5b50600436106101d8575f3560e01c80635c975abb11610102578063a217fddf116100a0578063d53913931161006f578063d53913931461057a578063d547741f14610598578063dd62ed3e146105b4578063e63ab1e9146105e4576101d8565b8063a217fddf146104cc578063a457c2d7146104ea578063a9059cbb1461051a578063ca15c8731461054a576101d8565b80638456cb59116100dc5780638456cb59146104445780639010d07c1461044e57806391d148541461047e57806395d89b41146104ae576101d8565b80635c975abb146103da57806370a08231146103f857806379cc679014610428576101d8565b8063282c51f31161017a578063395093511161014957806339509351146103685780633f4ba83a1461039857806340c10f19146103a257806342966c68146103be576101d8565b8063282c51f3146102f45780632f2ff15d14610312578063313ce5671461032e57806336568abe1461034c576101d8565b806318160ddd116101b657806318160ddd1461025a5780631cf2c7e21461027857806323b872dd14610294578063248a9ca3146102c4576101d8565b806301ffc9a7146101dc57806306fdde031461020c578063095ea7b31461022a575b5f80fd5b6101f660048036038101906101f19190612005565b610602565b604051610203919061204a565b60405180910390f35b61021461067b565b60405161022191906120ed565b60405180910390f35b610244600480360381019061023f919061219a565b61070b565b604051610251919061204a565b60405180910390f35b61026261072d565b60405161026f91906121e7565b60405180910390f35b610292600480360381019061028d919061219a565b610736565b005b6102ae60048036038101906102a99190612200565b6107b4565b6040516102bb919061204a565b60405180910390f35b6102de60048036038101906102d99190612283565b6107e2565b6040516102eb91906122bd565b60405180910390f35b6102fc6107fe565b60405161030991906122bd565b60405180910390f35b61032c600480360381019061032791906122d6565b610822565b005b610336610843565b604051610343919061232f565b60405180910390f35b610366600480360381019061036191906122d6565b610859565b005b610382600480360381019061037d919061219a565b6108dc565b60405161038f919061204a565b60405180910390f35b6103a0610912565b005b6103bc60048036038101906103b7919061219a565b61098c565b005b6103d860048036038101906103d39190612348565b610a0a565b005b6103e2610a1e565b6040516103ef919061204a565b60405180910390f35b610412600480360381019061040d9190612373565b610a33565b60405161041f91906121e7565b60405180910390f35b610442600480360381019061043d919061219a565b610a79565b005b61044c610a99565b005b6104686004803603810190610463919061239e565b610b13565b60405161047591906123eb565b60405180910390f35b610498600480360381019061049391906122d6565b610b3f565b6040516104a5919061204a565b60405180910390f35b6104b6610ba2565b6040516104c391906120ed565b60405180910390f35b6104d4610c32565b6040516104e191906122bd565b60405180910390f35b61050460048036038101906104ff919061219a565b610c38565b604051610511919061204a565b60405180910390f35b610534600480360381019061052f919061219a565b610cad565b604051610541919061204a565b60405180910390f35b610564600480360381019061055f9190612283565b610ccf565b60405161057191906121e7565b60405180910390f35b610582610cf0565b60405161058f91906122bd565b60405180910390f35b6105b260048036038101906105ad91906122d6565b610d14565b005b6105ce60048036038101906105c99190612404565b610d35565b6040516105db91906121e7565b60405180910390f35b6105ec610db7565b6040516105f991906122bd565b60405180910390f35b5f7f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610674575061067382610ddb565b5b9050919050565b60606005805461068a9061246f565b80601f01602080910402602001604051908101604052809291908181526020018280546106b69061246f565b80156107015780601f106106d857610100808354040283529160200191610701565b820191905f5260205f20905b8154815290600101906020018083116106e457829003601f168201915b5050505050905090565b5f80610715610e54565b9050610722818585610e5b565b600191505092915050565b5f600454905090565b6107677f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a848610762610e54565b610b3f565b6107a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079d9061250f565b60405180910390fd5b6107b0828261101e565b5050565b5f806107be610e54565b90506107cb8582856111e3565b6107d685858561126e565b60019150509392505050565b5f805f8381526020019081526020015f20600101549050919050565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84881565b61082b826107e2565b610834816114dd565b61083e83836114f1565b505050565b5f600760019054906101000a900460ff16905090565b610861610e54565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146108ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c59061259d565b60405180910390fd5b6108d88282611523565b5050565b5f806108e6610e54565b90506109078185856108f88589610d35565b61090291906125e8565b610e5b565b600191505092915050565b6109437f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61093e610e54565b610b3f565b610982576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109799061268b565b60405180910390fd5b61098a611555565b565b6109bd7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66109b8610e54565b610b3f565b6109fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f390612719565b60405180910390fd5b610a0682826115b6565b5050565b610a1b610a15610e54565b8261101e565b50565b5f60075f9054906101000a900460ff16905090565b5f60025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610a8b82610a85610e54565b836111e3565b610a95828261101e565b5050565b610aca7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610ac5610e54565b610b3f565b610b09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b00906127a7565b60405180910390fd5b610b11611705565b565b5f610b378260015f8681526020019081526020015f2061176790919063ffffffff16565b905092915050565b5f805f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b606060068054610bb19061246f565b80601f0160208091040260200160405190810160405280929190818152602001828054610bdd9061246f565b8015610c285780601f10610bff57610100808354040283529160200191610c28565b820191905f5260205f20905b815481529060010190602001808311610c0b57829003601f168201915b5050505050905090565b5f801b81565b5f80610c42610e54565b90505f610c4f8286610d35565b905083811015610c94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8b90612835565b60405180910390fd5b610ca18286868403610e5b565b60019250505092915050565b5f80610cb7610e54565b9050610cc481858561126e565b600191505092915050565b5f610ce960015f8481526020019081526020015f2061177e565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610d1d826107e2565b610d26816114dd565b610d308383611523565b505050565b5f60035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e4d5750610e4c82611791565b5b9050919050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ec9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec0906128c3565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2e90612951565b60405180910390fd5b8060035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161101191906121e7565b60405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361108c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611083906129df565b60405180910390fd5b611097825f836117fa565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508181101561111b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111290612a6d565b60405180910390fd5b81810360025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160045f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516111cb91906121e7565b60405180910390a36111de835f8461180a565b505050565b5f6111ee8484610d35565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611268578181101561125a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125190612ad5565b60405180910390fd5b6112678484848403610e5b565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390612b63565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361134a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134190612bf1565b60405180910390fd5b6113558383836117fa565b5f60025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156113d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d090612c7f565b60405180910390fd5b81810360025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114c491906121e7565b60405180910390a36114d784848461180a565b50505050565b6114ee816114e9610e54565b61180f565b50565b6114fb8282611893565b61151e8160015f8581526020019081526020015f2061196d90919063ffffffff16565b505050565b61152d828261199a565b6115508160015f8581526020019081526020015f20611a7490919063ffffffff16565b505050565b61155d611aa1565b5f60075f6101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61159f610e54565b6040516115ac91906123eb565b60405180910390a1565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161b90612ce7565b60405180910390fd5b61162f5f83836117fa565b8060045f82825461164091906125e8565b925050819055508060025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516116ee91906121e7565b60405180910390a36117015f838361180a565b5050565b61170d611aea565b600160075f6101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611750610e54565b60405161175d91906123eb565b60405180910390a1565b5f611774835f0183611b34565b5f1c905092915050565b5f61178a825f01611b5b565b9050919050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611805838383611b6a565b505050565b505050565b6118198282610b3f565b61188f5761182681611bc2565b611833835f1c6020611bef565b604051602001611844929190612dd3565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188691906120ed565b60405180910390fd5b5050565b61189d8282610b3f565b6119695760015f808481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061190e610e54565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b5f611992835f018373ffffffffffffffffffffffffffffffffffffffff165f1b611e24565b905092915050565b6119a48282610b3f565b15611a70575f805f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550611a15610e54565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b5f611a99835f018373ffffffffffffffffffffffffffffffffffffffff165f1b611e8b565b905092915050565b611aa9610a1e565b611ae8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adf90612e56565b60405180910390fd5b565b611af2610a1e565b15611b32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2990612ebe565b60405180910390fd5b565b5f825f018281548110611b4a57611b49612edc565b5b905f5260205f200154905092915050565b5f815f01805490509050919050565b611b75838383611f87565b611b7d610a1e565b15611bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb490612f79565b60405180910390fd5b505050565b6060611be88273ffffffffffffffffffffffffffffffffffffffff16601460ff16611bef565b9050919050565b60605f6002836002611c019190612f97565b611c0b91906125e8565b67ffffffffffffffff811115611c2457611c23612fd8565b5b6040519080825280601f01601f191660200182016040528015611c565781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110611c8d57611c8c612edc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611cf057611cef612edc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f6001846002611d2e9190612f97565b611d3891906125e8565b90505b6001811115611dd7577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611d7a57611d79612edc565b5b1a60f81b828281518110611d9157611d90612edc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600485901c945080611dd090613005565b9050611d3b565b505f8414611e1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1190613076565b60405180910390fd5b8091505092915050565b5f611e2f8383611f8c565b611e8157825f0182908060018154018082558091505060019003905f5260205f20015f9091909190915055825f0180549050836001015f8481526020019081526020015f208190555060019050611e85565b5f90505b92915050565b5f80836001015f8481526020019081526020015f205490505f8114611f7c575f600182611eb89190613094565b90505f6001865f0180549050611ece9190613094565b9050818114611f34575f865f018281548110611eed57611eec612edc565b5b905f5260205f200154905080875f018481548110611f0e57611f0d612edc565b5b905f5260205f20018190555083876001015f8381526020019081526020015f2081905550505b855f01805480611f4757611f466130c7565b5b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611f81565b5f9150505b92915050565b505050565b5f80836001015f8481526020019081526020015f20541415905092915050565b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611fe481611fb0565b8114611fee575f80fd5b50565b5f81359050611fff81611fdb565b92915050565b5f6020828403121561201a57612019611fac565b5b5f61202784828501611ff1565b91505092915050565b5f8115159050919050565b61204481612030565b82525050565b5f60208201905061205d5f83018461203b565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561209a57808201518184015260208101905061207f565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6120bf82612063565b6120c9818561206d565b93506120d981856020860161207d565b6120e2816120a5565b840191505092915050565b5f6020820190508181035f83015261210581846120b5565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6121368261210d565b9050919050565b6121468161212c565b8114612150575f80fd5b50565b5f813590506121618161213d565b92915050565b5f819050919050565b61217981612167565b8114612183575f80fd5b50565b5f8135905061219481612170565b92915050565b5f80604083850312156121b0576121af611fac565b5b5f6121bd85828601612153565b92505060206121ce85828601612186565b9150509250929050565b6121e181612167565b82525050565b5f6020820190506121fa5f8301846121d8565b92915050565b5f805f6060848603121561221757612216611fac565b5b5f61222486828701612153565b935050602061223586828701612153565b925050604061224686828701612186565b9150509250925092565b5f819050919050565b61226281612250565b811461226c575f80fd5b50565b5f8135905061227d81612259565b92915050565b5f6020828403121561229857612297611fac565b5b5f6122a58482850161226f565b91505092915050565b6122b781612250565b82525050565b5f6020820190506122d05f8301846122ae565b92915050565b5f80604083850312156122ec576122eb611fac565b5b5f6122f98582860161226f565b925050602061230a85828601612153565b9150509250929050565b5f60ff82169050919050565b61232981612314565b82525050565b5f6020820190506123425f830184612320565b92915050565b5f6020828403121561235d5761235c611fac565b5b5f61236a84828501612186565b91505092915050565b5f6020828403121561238857612387611fac565b5b5f61239584828501612153565b91505092915050565b5f80604083850312156123b4576123b3611fac565b5b5f6123c18582860161226f565b92505060206123d285828601612186565b9150509250929050565b6123e58161212c565b82525050565b5f6020820190506123fe5f8301846123dc565b92915050565b5f806040838503121561241a57612419611fac565b5b5f61242785828601612153565b925050602061243885828601612153565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061248657607f821691505b60208210810361249957612498612442565b5b50919050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d757374205f8201527f68617665206275726e657220726f6c6520746f206275726e0000000000000000602082015250565b5f6124f960388361206d565b91506125048261249f565b604082019050919050565b5f6020820190508181035f830152612526816124ed565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e63655f8201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b5f612587602f8361206d565b91506125928261252d565b604082019050919050565b5f6020820190508181035f8301526125b48161257b565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6125f282612167565b91506125fd83612167565b9250828201905080821115612615576126146125bb565b5b92915050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d757374205f8201527f686176652070617573657220726f6c6520746f20756e70617573650000000000602082015250565b5f612675603b8361206d565b91506126808261261b565b604082019050919050565b5f6020820190508181035f8301526126a281612669565b9050919050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d757374205f8201527f68617665206d696e74657220726f6c6520746f206d696e740000000000000000602082015250565b5f61270360388361206d565b915061270e826126a9565b604082019050919050565b5f6020820190508181035f830152612730816126f7565b9050919050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d757374205f8201527f686176652070617573657220726f6c6520746f20706175736500000000000000602082015250565b5f61279160398361206d565b915061279c82612737565b604082019050919050565b5f6020820190508181035f8301526127be81612785565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f61281f60258361206d565b915061282a826127c5565b604082019050919050565b5f6020820190508181035f83015261284c81612813565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f6128ad60248361206d565b91506128b882612853565b604082019050919050565b5f6020820190508181035f8301526128da816128a1565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f61293b60228361206d565b9150612946826128e1565b604082019050919050565b5f6020820190508181035f8301526129688161292f565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f206164647265735f8201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b5f6129c960218361206d565b91506129d48261296f565b604082019050919050565b5f6020820190508181035f8301526129f6816129bd565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f612a5760228361206d565b9150612a62826129fd565b604082019050919050565b5f6020820190508181035f830152612a8481612a4b565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f612abf601d8361206d565b9150612aca82612a8b565b602082019050919050565b5f6020820190508181035f830152612aec81612ab3565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f612b4d60258361206d565b9150612b5882612af3565b604082019050919050565b5f6020820190508181035f830152612b7a81612b41565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f612bdb60238361206d565b9150612be682612b81565b604082019050919050565b5f6020820190508181035f830152612c0881612bcf565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f612c6960268361206d565b9150612c7482612c0f565b604082019050919050565b5f6020820190508181035f830152612c9681612c5d565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f612cd1601f8361206d565b9150612cdc82612c9d565b602082019050919050565b5f6020820190508181035f830152612cfe81612cc5565b9050919050565b5f81905092915050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000005f82015250565b5f612d43601783612d05565b9150612d4e82612d0f565b601782019050919050565b5f612d6382612063565b612d6d8185612d05565b9350612d7d81856020860161207d565b80840191505092915050565b7f206973206d697373696e6720726f6c65200000000000000000000000000000005f82015250565b5f612dbd601183612d05565b9150612dc882612d89565b601182019050919050565b5f612ddd82612d37565b9150612de98285612d59565b9150612df482612db1565b9150612e008284612d59565b91508190509392505050565b7f5061757361626c653a206e6f74207061757365640000000000000000000000005f82015250565b5f612e4060148361206d565b9150612e4b82612e0c565b602082019050919050565b5f6020820190508181035f830152612e6d81612e34565b9050919050565b7f5061757361626c653a20706175736564000000000000000000000000000000005f82015250565b5f612ea860108361206d565b9150612eb382612e74565b602082019050919050565b5f6020820190508181035f830152612ed581612e9c565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f45524332305061757361626c653a20746f6b656e207472616e736665722077685f8201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b5f612f63602a8361206d565b9150612f6e82612f09565b604082019050919050565b5f6020820190508181035f830152612f9081612f57565b9050919050565b5f612fa182612167565b9150612fac83612167565b9250828202612fba81612167565b91508282048414831517612fd157612fd06125bb565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f61300f82612167565b91505f8203613021576130206125bb565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e745f82015250565b5f61306060208361206d565b915061306b8261302c565b602082019050919050565b5f6020820190508181035f83015261308d81613054565b9050919050565b5f61309e82612167565b91506130a983612167565b92508282039050818111156130c1576130c06125bb565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea26469706673582212208e17db436f847258cc8b148f2ec3689c9d1043000f9acacdf5a893071a6136a964736f6c63430008170033" -) - -var ( - // code is the bytecode of the contract. - // - // These conversions are taken from the code hash check in InitGenesis: - // https://github.com/evmos/evmos/blob/ca0f3e4d3e8407fd983b42aa595b052a67c1598b/x/evm/genesis.go#L48-L64 - code = common.Hex2Bytes(smartContractCode) - // codeHash is the hash of the contract code. - codeHash = crypto.Keccak256Hash(code) - - // storage is the genesis storage for the deployed ERC-20 contract - // - // NOTE: This is generated the same way described above with ExportGenesis and iterating of the genesis accounts on the working example - storage = evmtypes.Storage{ - {Key: "0x0000000000000000000000000000000000000000000000000000000000000005", Value: "0x786d706c00000000000000000000000000000000000000000000000000000008"}, //gitleaks:allow - {Key: "0x0000000000000000000000000000000000000000000000000000000000000006", Value: "0x786d706c00000000000000000000000000000000000000000000000000000008"}, //gitleaks:allow - {Key: "0x0000000000000000000000000000000000000000000000000000000000000007", Value: "0x0000000000000000000000000000000000000000000000000000000000000600"}, //gitleaks:allow - {Key: "0x0eb5be412f275a18f6e4d622aee4ff40b21467c926224771b782d4c095d1444b", Value: "0x00000000000000000000000047eeb2eac350e1923b8cbdfa4396a077b36e62a0"}, //gitleaks:allow - {Key: "0x0ef55e0cc676cf0b0dcbdc7d53c3b797e88e44b10ecee85d45144bc7392574c7", Value: "0x0000000000000000000000000000000000000000000000000000000000000001"}, //gitleaks:allow - {Key: "0x26bde78f605f19d1d853933fa781096670ea82ad96c9a3fb49f407e9600b316a", Value: "0x00000000000000000000000047eeb2eac350e1923b8cbdfa4396a077b36e62a0"}, //gitleaks:allow - {Key: "0x28bcb2563cf7895ce732c75018c5f73c44037088fc4505201fc28c3147d1d4a0", Value: "0x0000000000000000000000000000000000000000000000000000000000000001"}, //gitleaks:allow - {Key: "0x2e681a43037a582fb0535432b520e9dc97303bf239f82648091f9be82f4b677e", Value: "0x0000000000000000000000000000000000000000000000000000000000000001"}, //gitleaks:allow - {Key: "0x42aa905ad67e072b45e9dae81c8fa8bc705cc25014d5e9f10fa5114ae9c0dcf1", Value: "0x0000000000000000000000000000000000000000000000000000000000000001"}, //gitleaks:allow - {Key: "0x4796a5437e25bdc491b74d328cf6b437c8587e216f52049c7df56421f51ae30f", Value: "0x0000000000000000000000000000000000000000000000000000000000000001"}, //gitleaks:allow - {Key: "0x64e21244e91af723e1b962171ed4828dcecc0d7b89872e516a5db8266da80000", Value: "0x0000000000000000000000000000000000000000000000000000000000000001"}, //gitleaks:allow - {Key: "0x6d2487ab6e76634bbe98b9d5b39803d625a8f9249da9e03e70c638bf76d9e29b", Value: "0x00000000000000000000000047eeb2eac350e1923b8cbdfa4396a077b36e62a0"}, //gitleaks:allow - {Key: "0x97c12224ac75d13d2d9a9e30dd25212b81a4e2c19743b211209b4bca3db99142", Value: "0x0000000000000000000000000000000000000000000000000000000000000001"}, //gitleaks:allow - {Key: "0xa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49", Value: "0x0000000000000000000000000000000000000000000000000000000000000001"}, //gitleaks:allow - {Key: "0xb009fbc347bffd144efd545cc4b15a37592e1dd7063753564d9ecc6fea764b6f", Value: "0x00000000000000000000000047eeb2eac350e1923b8cbdfa4396a077b36e62a0"}, //gitleaks:allow - {Key: "0xb9cbbae02fe941283ec0eefd7b121e3bc7f89fae077b27bdd75a7fd4cf1543a8", Value: "0x0000000000000000000000000000000000000000000000000000000000000001"}, //gitleaks:allow - {Key: "0xc5724e8640ef1f7915e4839c81ad4b592af3c601230608793acd429a848553e9", Value: "0x0000000000000000000000000000000000000000000000000000000000000001"}, //gitleaks:allow - {Key: "0xfac4953099c6f6272238a038333d99c9cd0475cb85c72b761909fadae4b6cbcd", Value: "0x0000000000000000000000000000000000000000000000000000000000000001"}, //gitleaks:allow - {Key: "0xfd061ffb53f8d83182630fadee503ca39e0bae885f162932fe84d25caddbc888", Value: "0x0000000000000000000000000000000000000000000000000000000000000001"}, //gitleaks:allow - } - - // erc20Addr is the address of the ERC-20 contract. - erc20Addr = common.HexToAddress(erc20ContractHex) - - // smartContractAddress is the bech32 address of the Ethereum smart contract account that is set in genesis. - smartContractAddress = utils.EthToCosmosAddr(erc20Addr).String() -) - -// createGenesisWithERC20 creates a genesis state that contains the state containing an EthAccount that is a smart contract. -func createGenesisWithERC20(keyring testkeyring.Keyring) testnetwork.CustomGenesisState { - genesisAccounts := []authtypes.AccountI{ - &authtypes.BaseAccount{ - Address: baseAccountAddress, - PubKey: nil, - AccountNumber: 0, - Sequence: 1, - }, - &evmostypes.EthAccount{ - BaseAccount: &authtypes.BaseAccount{ - Address: smartContractAddress, - PubKey: nil, - AccountNumber: 9, - Sequence: 1, - }, - CodeHash: codeHash.String(), - }, - } - - // Add all keys from the keyring to the genesis accounts as well. - // - // NOTE: This is necessary to enable the account to send EVM transactions, - // because the Mono ante handler checks the account balance by querying the - // account from the account keeper first. If these accounts are not in the genesis - // state, the ante handler finds a zero balance because of the missing account. - for i, addr := range keyring.GetAllAccAddrs() { - genesisAccounts = append(genesisAccounts, &authtypes.BaseAccount{ - Address: addr.String(), - PubKey: nil, - AccountNumber: uint64(i + 1), - Sequence: 1, - }) - } - - accGenesisState := authtypes.DefaultGenesisState() - for _, genesisAccount := range genesisAccounts { - // NOTE: This type requires to be packed into a *types.Any as seen on SDK tests, - // e.g. https://github.com/evmos/cosmos-sdk/blob/v0.47.5-evmos.2/x/auth/keeper/keeper_test.go#L193-L223 - accGenesisState.Accounts = append(accGenesisState.Accounts, codectypes.UnsafePackAny(genesisAccount)) - } - - // Add the smart contracts to the EVM genesis - evmGenesisState := evmtypes.DefaultGenesisState() - evmGenesisState.Accounts = append(evmGenesisState.Accounts, evmtypes.GenesisAccount{ - Address: erc20ContractHex, - Code: smartContractCode, - Storage: storage, - }) - - // Combine module genesis states - return testnetwork.CustomGenesisState{ - authtypes.ModuleName: accGenesisState, - evmtypes.ModuleName: evmGenesisState, - } -} - -func TestMigrateEthAccountsToBaseAccounts(t *testing.T) { - keyring := testkeyring.New(1) - network := testnetwork.NewUnitTestNetwork( - // NOTE: This genesis was created using pre-EthAccount removal code - // so that the accounts stored are actual EthAccounts. - testnetwork.WithCustomGenesis(createGenesisWithERC20(keyring)), - ) - - require.NoError(t, network.NextBlock(), "failed to advance block") - - // Check the contract is an EthAccount before migration - erc20AddrAsBech32 := utils.EthToCosmosAddr(erc20Addr) - acc := network.App.AccountKeeper.GetAccount(network.GetContext(), erc20AddrAsBech32) - require.NotNil(t, acc, "account not found") - require.IsType(t, &evmostypes.EthAccount{}, acc, "expected account to be an EthAccount") - - // Migrate the accounts - v19.MigrateEthAccountsToBaseAccounts(network.GetContext(), network.App.AccountKeeper, network.App.EvmKeeper) - - // Check the contract is a BaseAccount after migration - acc = network.App.AccountKeeper.GetAccount(network.GetContext(), erc20AddrAsBech32) - require.NotNil(t, acc, "account not found") - require.IsType(t, &authtypes.BaseAccount{}, acc, "account should be a base account") - - // Check that the keeper has the new store entry - require.Equal(t, - codeHash.String(), - network.App.EvmKeeper.GetCodeHash(network.GetContext(), erc20Addr).String(), - "expected different code hash", - ) - - require.Equal(t, - code, - network.App.EvmKeeper.GetCode(network.GetContext(), codeHash), - "expected different code", - ) -} diff --git a/client/docs/swagger-ui/swagger.json b/client/docs/swagger-ui/swagger.json index 7b1cf6b896..4caf78ed6c 100644 --- a/client/docs/swagger-ui/swagger.json +++ b/client/docs/swagger-ui/swagger.json @@ -1140,7 +1140,7 @@ }, "/evmos/evm/v1/balances/{address}": { "get": { - "summary": "Balance queries the balance of a the EVM denomination for a single\naccount.", + "summary": "Balance queries the balance of a the EVM denomination for a single\nEthAccount.", "operationId": "Balance", "responses": { "200": { diff --git a/client/testnet.go b/client/testnet.go index ea71b1420f..ced7058c2d 100644 --- a/client/testnet.go +++ b/client/testnet.go @@ -13,6 +13,8 @@ import ( "path/filepath" "cosmossdk.io/math" + "github.com/ethereum/go-ethereum/common" + tmconfig "github.com/cometbft/cometbft/config" tmrand "github.com/cometbft/cometbft/libs/rand" "github.com/cometbft/cometbft/types" @@ -302,9 +304,10 @@ func initTestnetFiles( } genBalances = append(genBalances, banktypes.Balance{Address: addr.String(), Coins: coins.Sort()}) - genAccounts = append(genAccounts, authtypes.NewBaseAccount( - addr, nil, 0, 0), - ) + genAccounts = append(genAccounts, &evmostypes.EthAccount{ + BaseAccount: authtypes.NewBaseAccount(addr, nil, 0, 0), + CodeHash: common.BytesToHash(evmtypes.EmptyCodeHash).Hex(), + }) valTokens := sdk.TokensFromConsensusPower(100, evmostypes.PowerReduction) createValMsg, err := stakingtypes.NewMsgCreateValidator( diff --git a/cmd/config/config.go b/cmd/config/config.go index 5e88e26d76..4d36e5ee7e 100644 --- a/cmd/config/config.go +++ b/cmd/config/config.go @@ -11,7 +11,7 @@ import ( ) const ( - // Bech32Prefix defines the Bech32 prefix used for accounts on the Evmos blockchain + // Bech32Prefix defines the Bech32 prefix used for EthAccounts Bech32Prefix = "evmos" // Bech32PrefixAccAddr defines the Bech32 prefix of an account's address diff --git a/cmd/evmosd/genaccounts.go b/cmd/evmosd/genaccounts.go index 8fc7c4ce1d..09d6023b0e 100644 --- a/cmd/evmosd/genaccounts.go +++ b/cmd/evmosd/genaccounts.go @@ -9,6 +9,7 @@ import ( "fmt" "time" + "github.com/ethereum/go-ethereum/common" "github.com/spf13/cobra" "github.com/cosmos/cosmos-sdk/client" @@ -23,7 +24,8 @@ import ( genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" evmoskr "github.com/evmos/evmos/v19/crypto/keyring" - + "github.com/evmos/evmos/v19/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" vestingcli "github.com/evmos/evmos/v19/x/vesting/client/cli" vestingtypes "github.com/evmos/evmos/v19/x/vesting/types" ) @@ -103,7 +105,7 @@ contain valid denominations. Accounts may optionally be supplied with vesting pa clawback, _ := cmd.Flags().GetBool(vestingcli.FlagClawback) - // Create ClawbackvestingAccount or standard Evmos account + // Create ClawbackvestingAccount, sdk.VestingAccount or EthAccount switch { case clawback: // ClawbackvestingAccount requires clawback, lockup, vesting, and funder @@ -201,7 +203,10 @@ contain valid denominations. Accounts may optionally be supplied with vesting pa ) default: - genAccount = baseAccount + genAccount = &types.EthAccount{ + BaseAccount: baseAccount, + CodeHash: common.BytesToHash(evmtypes.EmptyCodeHash).Hex(), + } } if err := genAccount.Validate(); err != nil { diff --git a/cmd/evmosd/testnet.go b/cmd/evmosd/testnet.go index 85af1af0b1..c20e3d5a5a 100644 --- a/cmd/evmosd/testnet.go +++ b/cmd/evmosd/testnet.go @@ -14,6 +14,7 @@ import ( "path/filepath" "strconv" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/params" tmconfig "github.com/cometbft/cometbft/config" @@ -328,7 +329,10 @@ func initTestnetFiles( } genBalances = append(genBalances, banktypes.Balance{Address: addr.String(), Coins: coins.Sort()}) - genAccounts = append(genAccounts, authtypes.NewBaseAccount(addr, nil, 0, 0)) + genAccounts = append(genAccounts, &evmostypes.EthAccount{ + BaseAccount: authtypes.NewBaseAccount(addr, nil, 0, 0), + CodeHash: common.BytesToHash(evmtypes.EmptyCodeHash).Hex(), + }) valTokens := sdk.TokensFromConsensusPower(100, evmostypes.PowerReduction) createValMsg, err := stakingtypes.NewMsgCreateValidator( diff --git a/ibc/testing/chain.go b/ibc/testing/chain.go index 9beecf414d..8ce437b275 100644 --- a/ibc/testing/chain.go +++ b/ibc/testing/chain.go @@ -8,6 +8,8 @@ import ( "github.com/stretchr/testify/require" + "github.com/ethereum/go-ethereum/common" + sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" @@ -22,6 +24,7 @@ import ( "github.com/evmos/evmos/v19/crypto/ethsecp256k1" evmostypes "github.com/evmos/evmos/v19/types" "github.com/evmos/evmos/v19/utils" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) // ChainIDPrefix defines the default chain ID prefix for Evmos test chains @@ -63,14 +66,19 @@ func NewTestChain(t *testing.T, coord *ibcgotesting.Coordinator, chainID string) baseAcc := authtypes.NewBaseAccount(senderPrivKey.PubKey().Address().Bytes(), senderPrivKey.PubKey(), 0, 0) + acc := &evmostypes.EthAccount{ + BaseAccount: baseAcc, + CodeHash: common.BytesToHash(evmtypes.EmptyCodeHash).Hex(), + } + amount := sdk.TokensFromConsensusPower(1, evmostypes.PowerReduction) balance := banktypes.Balance{ - Address: baseAcc.GetAddress().String(), + Address: acc.GetAddress().String(), Coins: sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, amount)), } - app := SetupWithGenesisValSet(t, valSet, []authtypes.GenesisAccount{baseAcc}, chainID, balance) + app := SetupWithGenesisValSet(t, valSet, []authtypes.GenesisAccount{acc}, chainID, balance) // create current header and call begin block header := tmproto.Header{ @@ -94,7 +102,7 @@ func NewTestChain(t *testing.T, coord *ibcgotesting.Coordinator, chainID string) Vals: valSet, Signers: signers, SenderPrivKey: senderPrivKey, - SenderAccount: baseAcc, + SenderAccount: acc, NextVals: valSet, } diff --git a/precompiles/distribution/integration_test.go b/precompiles/distribution/integration_test.go index 75f151b629..1a299dcdc2 100644 --- a/precompiles/distribution/integration_test.go +++ b/precompiles/distribution/integration_test.go @@ -54,9 +54,6 @@ var _ = Describe("Calling distribution precompile from EOA", func() { BeforeEach(func() { s.SetupTest() - initialBalance := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) - fmt.Println("Fist Before each: ", initialBalance) - // set the default call arguments defaultCallArgs = contracts.CallArgs{ ContractAddr: s.precompile.Address(), @@ -69,9 +66,6 @@ var _ = Describe("Calling distribution precompile from EOA", func() { } passCheck = defaultLogCheck.WithExpPass(true) outOfGasCheck = defaultLogCheck.WithErrContains(vm.ErrOutOfGas.Error()) - - initialBalance = s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) - fmt.Println("Fist Before each: ", initialBalance) }) // ===================================== diff --git a/precompiles/distribution/tx.go b/precompiles/distribution/tx.go index 8fa3b297b7..d220c50c86 100644 --- a/precompiles/distribution/tx.go +++ b/precompiles/distribution/tx.go @@ -35,7 +35,7 @@ const ( ) // ClaimRewards claims the rewards accumulated by a delegator from multiple or all validators. -func (p Precompile) ClaimRewards( +func (p *Precompile) ClaimRewards( ctx sdk.Context, origin common.Address, contract *vm.Contract, diff --git a/precompiles/distribution/utils_test.go b/precompiles/distribution/utils_test.go index b115978120..b8658c1791 100644 --- a/precompiles/distribution/utils_test.go +++ b/precompiles/distribution/utils_test.go @@ -156,14 +156,19 @@ func (s *PrecompileTestSuite) DoSetupTest() { baseAcc := authtypes.NewBaseAccount(priv.PubKey().Address().Bytes(), priv.PubKey(), 0, 0) + acc := &evmostypes.EthAccount{ + BaseAccount: baseAcc, + CodeHash: common.BytesToHash(evmtypes.EmptyCodeHash).Hex(), + } + amount := sdk.TokensFromConsensusPower(5, evmostypes.PowerReduction) balance := banktypes.Balance{ - Address: baseAcc.GetAddress().String(), + Address: acc.GetAddress().String(), Coins: sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, amount)), } - s.SetupWithGenesisValSet(s.valSet, []authtypes.GenesisAccount{baseAcc}, balance) + s.SetupWithGenesisValSet(s.valSet, []authtypes.GenesisAccount{acc}, balance) // Create StateDB s.stateDB = statedb.New(s.ctx, s.app.EvmKeeper, statedb.NewEmptyTxConfig(common.BytesToHash(s.ctx.HeaderHash().Bytes()))) diff --git a/precompiles/ics20/utils_test.go b/precompiles/ics20/utils_test.go index 636b2ca2b7..a4e1af651d 100644 --- a/precompiles/ics20/utils_test.go +++ b/precompiles/ics20/utils_test.go @@ -232,14 +232,20 @@ func (s *PrecompileTestSuite) NewTestChainWithValSet(coord *ibctesting.Coordinat s.signer = evmosutiltx.NewSigner(priv) baseAcc := authtypes.NewBaseAccount(priv.PubKey().Address().Bytes(), priv.PubKey(), 0, 0) + + acc := &evmostypes.EthAccount{ + BaseAccount: baseAcc, + CodeHash: common.BytesToHash(evmtypes.EmptyCodeHash).Hex(), + } + amount := sdk.TokensFromConsensusPower(5, evmostypes.PowerReduction) balance := banktypes.Balance{ - Address: baseAcc.GetAddress().String(), + Address: acc.GetAddress().String(), Coins: sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, amount)), } - s.SetupWithGenesisValSet(s.valSet, []authtypes.GenesisAccount{baseAcc}, balance) + s.SetupWithGenesisValSet(s.valSet, []authtypes.GenesisAccount{acc}, balance) // create current header and call begin block header := tmproto.Header{ @@ -289,8 +295,8 @@ func (s *PrecompileTestSuite) NewTestChainWithValSet(coord *ibctesting.Coordinat NextVals: valSet, Signers: signers, SenderPrivKey: priv, - SenderAccount: baseAcc, - SenderAccounts: []ibctesting.SenderAccount{{SenderPrivKey: priv, SenderAccount: baseAcc}}, + SenderAccount: acc, + SenderAccounts: []ibctesting.SenderAccount{{SenderPrivKey: priv, SenderAccount: acc}}, } coord.CommitBlock(chain) diff --git a/precompiles/staking/utils_test.go b/precompiles/staking/utils_test.go index df169c1f2a..e4525f2d33 100644 --- a/precompiles/staking/utils_test.go +++ b/precompiles/staking/utils_test.go @@ -174,14 +174,19 @@ func (s *PrecompileTestSuite) DoSetupTest() { baseAcc := authtypes.NewBaseAccount(priv.PubKey().Address().Bytes(), priv.PubKey(), 0, 0) + acc := &evmostypes.EthAccount{ + BaseAccount: baseAcc, + CodeHash: common.BytesToHash(evmtypes.EmptyCodeHash).Hex(), + } + amount := sdk.TokensFromConsensusPower(5, evmostypes.PowerReduction) balance := banktypes.Balance{ - Address: baseAcc.GetAddress().String(), + Address: acc.GetAddress().String(), Coins: sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, amount)), } - s.SetupWithGenesisValSet(valSet, []authtypes.GenesisAccount{baseAcc}, balance) + s.SetupWithGenesisValSet(valSet, []authtypes.GenesisAccount{acc}, balance) // Create StateDB s.stateDB = statedb.New(s.ctx, s.app.EvmKeeper, statedb.NewEmptyTxConfig(common.BytesToHash(s.ctx.HeaderHash().Bytes()))) diff --git a/precompiles/vesting/tx_test.go b/precompiles/vesting/tx_test.go index 2f44f97389..30d33a8be9 100644 --- a/precompiles/vesting/tx_test.go +++ b/precompiles/vesting/tx_test.go @@ -12,11 +12,11 @@ import ( "github.com/evmos/evmos/v19/x/evm/core/vm" sdk "github.com/cosmos/cosmos-sdk/types" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" cmn "github.com/evmos/evmos/v19/precompiles/common" "github.com/evmos/evmos/v19/precompiles/vesting" evmosutil "github.com/evmos/evmos/v19/testutil" evmosutiltx "github.com/evmos/evmos/v19/testutil/tx" + evmostypes "github.com/evmos/evmos/v19/types" "github.com/evmos/evmos/v19/utils" vestingtypes "github.com/evmos/evmos/v19/x/vesting/types" ) @@ -411,13 +411,10 @@ func (s *PrecompileTestSuite) TestConvertVestingAccount() { s.Require().NoError(err) s.Require().Equal(success[0], true) - // Check if the vesting account was converted back to an non-vesting account + // Check if the vesting account was converted back to an EthAccountI account := s.app.AccountKeeper.GetAccount(s.ctx, toAddr.Bytes()) - _, ok := account.(*authtypes.BaseAccount) - s.Require().True(ok, "expected account to be a base account") - - _, ok = account.(*vestingtypes.ClawbackVestingAccount) - s.Require().False(ok, "expected account not to be a vesting account after converting") + _, ok := account.(evmostypes.EthAccountI) + s.Require().True(ok) }, false, "", diff --git a/precompiles/vesting/utils_test.go b/precompiles/vesting/utils_test.go index cd7764563a..23125a79e4 100644 --- a/precompiles/vesting/utils_test.go +++ b/precompiles/vesting/utils_test.go @@ -163,14 +163,19 @@ func (s *PrecompileTestSuite) DoSetupTest() { baseAcc := authtypes.NewBaseAccount(priv.PubKey().Address().Bytes(), priv.PubKey(), 0, 0) + acc := &evmostypes.EthAccount{ + BaseAccount: baseAcc, + CodeHash: common.BytesToHash(evmtypes.EmptyCodeHash).Hex(), + } + amount := sdk.TokensFromConsensusPower(5, evmostypes.PowerReduction) balance := banktypes.Balance{ - Address: baseAcc.GetAddress().String(), + Address: acc.GetAddress().String(), Coins: sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, amount)), } - s.SetupWithGenesisValSet(valSet, []authtypes.GenesisAccount{baseAcc}, balance) + s.SetupWithGenesisValSet(valSet, []authtypes.GenesisAccount{acc}, balance) // Create StateDB s.stateDB = statedb.New(s.ctx, s.app.EvmKeeper, statedb.NewEmptyTxConfig(common.BytesToHash(s.ctx.HeaderHash().Bytes()))) diff --git a/proto/ethermint/evm/v1/query.proto b/proto/ethermint/evm/v1/query.proto index b6bede661e..4cc26f58c0 100644 --- a/proto/ethermint/evm/v1/query.proto +++ b/proto/ethermint/evm/v1/query.proto @@ -31,7 +31,7 @@ service Query { } // Balance queries the balance of a the EVM denomination for a single - // account. + // EthAccount. rpc Balance(QueryBalanceRequest) returns (QueryBalanceResponse) { option (google.api.http).get = "/evmos/evm/v1/balances/{address}"; } diff --git a/proto/ethermint/types/v1/account.proto b/proto/ethermint/types/v1/account.proto new file mode 100644 index 0000000000..940f53aa89 --- /dev/null +++ b/proto/ethermint/types/v1/account.proto @@ -0,0 +1,27 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) +syntax = "proto3"; +package ethermint.types.v1; + +import "cosmos/auth/v1beta1/auth.proto"; +import "cosmos_proto/cosmos.proto"; +import "gogoproto/gogo.proto"; + +option go_package = "github.com/evmos/evmos/v19/types"; + +// EthAccount implements the authtypes.AccountI interface and embeds an +// authtypes.BaseAccount type. It is compatible with the auth AccountKeeper. +message EthAccount { + option (gogoproto.goproto_getters) = false; + option (gogoproto.goproto_stringer) = false; + option (gogoproto.equal) = false; + + option (cosmos_proto.implements_interface) = "github.com/cosmos/cosmos-sdk/x/auth/types.cosmos.auth.v1beta1.AccountI"; + + // base_account is an authtypes.BaseAccount + cosmos.auth.v1beta1.BaseAccount base_account = 1 + [(gogoproto.embed) = true, (gogoproto.moretags) = "yaml:\"base_account\""]; + + // code_hash is the hash calculated from the code contents + string code_hash = 2 [(gogoproto.moretags) = "yaml:\"code_hash\""]; +} diff --git a/proto/evmos/erc20/v1/erc20.proto b/proto/evmos/erc20/v1/erc20.proto index 7852f92c3a..f91674a555 100644 --- a/proto/evmos/erc20/v1/erc20.proto +++ b/proto/evmos/erc20/v1/erc20.proto @@ -14,7 +14,7 @@ enum Owner { OWNER_UNSPECIFIED = 0; // OWNER_MODULE - erc20 is owned by the erc20 module account. OWNER_MODULE = 1; - // OWNER_EXTERNAL - erc20 is owned by an external account. + // OWNER_EXTERNAL - erc20 is owned by an externally owned account. OWNER_EXTERNAL = 2; } @@ -28,7 +28,7 @@ message TokenPair { string denom = 2; // enabled defines the token mapping enable status bool enabled = 3; - // contract_owner is the an ENUM specifying the type of ERC20 owner (0 invalid, 1 ModuleAccount, 2 external address) + // contract_owner is an ENUM specifying the type of ERC20 owner (0 invalid, 1 ModuleAccount, 2 external address) Owner contract_owner = 4; } diff --git a/testutil/integration/evmos/network/setup.go b/testutil/integration/evmos/network/setup.go index 638aaeb4c4..9bbfa8e5a9 100644 --- a/testutil/integration/evmos/network/setup.go +++ b/testutil/integration/evmos/network/setup.go @@ -28,10 +28,12 @@ import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" govtypesv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + "github.com/ethereum/go-ethereum/crypto" epochstypes "github.com/evmos/evmos/v19/x/epochs/types" erc20types "github.com/evmos/evmos/v19/x/erc20/types" infltypes "github.com/evmos/evmos/v19/x/inflation/v1/types" + evmostypes "github.com/evmos/evmos/v19/types" evmosutil "github.com/evmos/evmos/v19/utils" evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) @@ -59,10 +61,14 @@ func createValidatorSetAndSigners(numberOfValidators int) (*tmtypes.ValidatorSet func createGenesisAccounts(accounts []sdktypes.AccAddress) []authtypes.GenesisAccount { numberOfAccounts := len(accounts) genAccounts := make([]authtypes.GenesisAccount, 0, numberOfAccounts) + emptyCodeHash := crypto.Keccak256Hash(nil).String() for _, acc := range accounts { - genAccounts = append(genAccounts, authtypes.NewBaseAccount( - acc, nil, 0, 0), - ) + baseAcc := authtypes.NewBaseAccount(acc, nil, 0, 0) + ethAcc := &evmostypes.EthAccount{ + BaseAccount: baseAcc, + CodeHash: emptyCodeHash, + } + genAccounts = append(genAccounts, ethAcc) } return genAccounts } diff --git a/testutil/integration/evmos/utils/contracts.go b/testutil/integration/evmos/utils/contracts.go index c3067f3e61..eceb1c1047 100644 --- a/testutil/integration/evmos/utils/contracts.go +++ b/testutil/integration/evmos/utils/contracts.go @@ -9,6 +9,8 @@ import ( "github.com/evmos/evmos/v19/testutil/integration/evmos/factory" abcitypes "github.com/cometbft/cometbft/abci/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + evmostypes "github.com/evmos/evmos/v19/types" evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) @@ -34,6 +36,19 @@ func CheckTxTopics(res abcitypes.ResponseDeliverTx, expectedTopics []string) err return nil } +// IsContractAccount checks if the given account is a contract account +func IsContractAccount(acc authtypes.AccountI) error { + contractETHAccount, ok := acc.(evmostypes.EthAccountI) + if !ok { + return fmt.Errorf("account is not an eth account") + } + + if contractETHAccount.Type() != evmostypes.AccountTypeContract { + return fmt.Errorf("account is not a contract account") + } + return nil +} + // DecodeContractCallResponse decodes the response of a contract call query func DecodeContractCallResponse(response interface{}, callArgs factory.CallArgs, res abcitypes.ResponseDeliverTx) error { msgEthResponse, err := DecodeResponseDeliverTx(res) diff --git a/testutil/network/network.go b/testutil/network/network.go index 4650980f41..d13ad3cc66 100644 --- a/testutil/network/network.go +++ b/testutil/network/network.go @@ -26,6 +26,7 @@ import ( tmrand "github.com/cometbft/cometbft/libs/rand" "github.com/cometbft/cometbft/node" tmclient "github.com/cometbft/cometbft/rpc/client" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" "github.com/spf13/cobra" "google.golang.org/grpc" @@ -57,6 +58,7 @@ import ( "github.com/evmos/evmos/v19/encoding" "github.com/evmos/evmos/v19/server/config" evmostypes "github.com/evmos/evmos/v19/types" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" ) // package-wide network lock to only allow one test network at a time @@ -415,7 +417,10 @@ func New(l Logger, baseDir string, cfg Config) (*Network, error) { genFiles = append(genFiles, tmCfg.GenesisFile()) genBalances = append(genBalances, banktypes.Balance{Address: addr.String(), Coins: balances.Sort()}) - genAccounts = append(genAccounts, authtypes.NewBaseAccount(addr, nil, 0, 0)) + genAccounts = append(genAccounts, &evmostypes.EthAccount{ + BaseAccount: authtypes.NewBaseAccount(addr, nil, 0, 0), + CodeHash: common.BytesToHash(evmtypes.EmptyCodeHash).Hex(), + }) commission, err := math.LegacyNewDecFromStr("0.5") if err != nil { diff --git a/types/account.go b/types/account.go index 0bbc32e98f..23d1bb53e7 100644 --- a/types/account.go +++ b/types/account.go @@ -1,6 +1,5 @@ // Copyright Tharsis Labs Ltd.(Evmos) // SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - package types import ( diff --git a/types/account_test.go b/types/account_test.go new file mode 100644 index 0000000000..f248c91139 --- /dev/null +++ b/types/account_test.go @@ -0,0 +1,58 @@ +package types_test + +import ( + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/stretchr/testify/suite" + + "github.com/cosmos/cosmos-sdk/codec" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + sdk "github.com/cosmos/cosmos-sdk/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + + cryptocodec "github.com/evmos/evmos/v19/crypto/codec" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" + encodingcodec "github.com/evmos/evmos/v19/encoding/codec" + "github.com/evmos/evmos/v19/types" +) + +func init() { + amino := codec.NewLegacyAmino() + cryptocodec.RegisterCrypto(amino) +} + +type AccountTestSuite struct { + suite.Suite + + account *types.EthAccount + cdc codec.JSONCodec +} + +func (suite *AccountTestSuite) SetupTest() { + privKey, err := ethsecp256k1.GenerateKey() + suite.Require().NoError(err) + pubKey := privKey.PubKey() + addr := sdk.AccAddress(pubKey.Address()) + baseAcc := authtypes.NewBaseAccount(addr, pubKey, 10, 50) + suite.account = &types.EthAccount{ + BaseAccount: baseAcc, + CodeHash: common.Hash{}.String(), + } + + interfaceRegistry := codectypes.NewInterfaceRegistry() + encodingcodec.RegisterInterfaces(interfaceRegistry) + suite.cdc = codec.NewProtoCodec(interfaceRegistry) +} + +func TestAccountTestSuite(t *testing.T) { + suite.Run(t, new(AccountTestSuite)) +} + +func (suite *AccountTestSuite) TestAccountType() { + suite.account.CodeHash = common.BytesToHash(crypto.Keccak256(nil)).Hex() + suite.Require().Equal(types.AccountTypeEOA, suite.account.Type()) + suite.account.CodeHash = common.BytesToHash(crypto.Keccak256([]byte{1, 2, 3})).Hex() + suite.Require().Equal(types.AccountTypeContract, suite.account.Type()) +} diff --git a/utils/utils.go b/utils/utils.go index 8603f21e02..8ebc512cd0 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -33,34 +33,17 @@ const ( BaseDenom = "aevmos" ) -// EthHexToCosmosAddr takes a given Hex string and derives a Cosmos SDK account address +// EthHexToSDKAddr takes a given Hex string and derives a Cosmos SDK account address // from it. -func EthHexToCosmosAddr(hexAddr string) sdk.AccAddress { - return EthToCosmosAddr(common.HexToAddress(hexAddr)) +func EthHexToSDKAddr(hexAddr string) sdk.AccAddress { + return EthToSDKAddr(common.HexToAddress(hexAddr)) } -// EthToCosmosAddr converts a given Ethereum style address to an SDK address. -func EthToCosmosAddr(addr common.Address) sdk.AccAddress { +// EthToSDKAddr converts a given Ethereum style address to an SDK address. +func EthToSDKAddr(addr common.Address) sdk.AccAddress { return sdk.AccAddress(addr.Bytes()) } -// Bech32ToHexAddr converts a given Bech32 address string and converts it to -// an Ethereum address. -func Bech32ToHexAddr(bech32Addr string) (common.Address, error) { - accAddr, err := sdk.AccAddressFromBech32(bech32Addr) - if err != nil { - return common.Address{}, errorsmod.Wrapf(err, "failed to convert bech32 string to address") - } - - return CosmosToEthAddr(accAddr), nil -} - -// CosmosToEthAddr converts a given SDK account address to -// an Ethereum address. -func CosmosToEthAddr(accAddr sdk.AccAddress) common.Address { - return common.BytesToAddress(accAddr.Bytes()) -} - // IsMainnet returns true if the chain-id has the Evmos mainnet EIP155 chain prefix. func IsMainnet(chainID string) bool { return strings.HasPrefix(chainID, MainnetChainID) diff --git a/utils/utils_test.go b/utils/utils_test.go index 5d87bbe403..044c7704c1 100644 --- a/utils/utils_test.go +++ b/utils/utils_test.go @@ -4,14 +4,14 @@ import ( "fmt" "testing" + "github.com/stretchr/testify/require" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/ethereum/go-ethereum/common" "github.com/evmos/evmos/v19/crypto/ethsecp256k1" - "github.com/stretchr/testify/require" ) func init() { @@ -233,22 +233,6 @@ func TestAccAddressFromBech32(t *testing.T) { } } -func TestAddressConversion(t *testing.T) { - hex := "0x7cB61D4117AE31a12E393a1Cfa3BaC666481D02E" - bech32 := "evmos10jmp6sgh4cc6zt3e8gw05wavvejgr5pwjnpcky" - - hexAddr := common.HexToAddress(hex) - require.Equal(t, bech32, EthToCosmosAddr(hexAddr).String()) - require.Equal(t, bech32, EthHexToCosmosAddr(hex).String()) - - accAddr := sdk.MustAccAddressFromBech32(bech32) - require.Equal(t, hex, CosmosToEthAddr(accAddr).Hex()) - - gotAddr, err := Bech32ToHexAddr(bech32) - require.NoError(t, err) - require.Equal(t, hex, gotAddr.Hex()) -} - func TestGetIBCDenomAddress(t *testing.T) { testCases := []struct { name string diff --git a/x/erc20/keeper/integration_test.go b/x/erc20/keeper/integration_test.go index a56c221530..e2195dfff8 100644 --- a/x/erc20/keeper/integration_test.go +++ b/x/erc20/keeper/integration_test.go @@ -3,17 +3,18 @@ package keeper_test import ( "math/big" + "cosmossdk.io/math" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/common" + //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/gomega" - "cosmossdk.io/math" abci "github.com/cometbft/cometbft/abci/types" - sdk "github.com/cosmos/cosmos-sdk/types" govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/ethereum/go-ethereum/common" "github.com/evmos/evmos/v19/app" "github.com/evmos/evmos/v19/crypto/ethsecp256k1" "github.com/evmos/evmos/v19/testutil" @@ -58,22 +59,18 @@ var _ = Describe("ERC20:", Ordered, func() { addrBz := privKey.PubKey().Address().Bytes() accAddr := sdk.AccAddress(addrBz) addr := common.BytesToAddress(addrBz) + moduleAcc := s.app.AccountKeeper.GetModuleAccount(s.ctx, types.ModuleName).GetAddress() var ( pair types.TokenPair coin sdk.Coin contract common.Address contract2 common.Address - - // moduleAcc is the address of the ERC-20 module account - moduleAcc sdk.AccAddress ) BeforeEach(func() { s.SetupTest() - moduleAcc = s.app.AccountKeeper.GetModuleAccount(s.ctx, types.ModuleName).GetAddress() - govParams := s.app.GovKeeper.GetParams(s.ctx) govParams.Quorum = "0.0000000001" err := s.app.GovKeeper.SetParams(s.ctx, govParams) @@ -91,11 +88,10 @@ var _ = Describe("ERC20:", Ordered, func() { sdk.NewCoin(metadataCoin.Base, math.NewInt(1)), ) err := testutil.FundAccount(s.ctx, s.app.BankKeeper, accAddr, coins) - Expect(err).To(BeNil()) + s.Require().NoError(err) s.Commit() }) }) - Context("with deployed contracts", func() { BeforeEach(func() { var err error @@ -113,7 +109,6 @@ var _ = Describe("ERC20:", Ordered, func() { s.Require().NoError(err) s.Commit() }) - Describe("for a single ERC20 token", func() { BeforeEach(func() { // register with sufficient deposit @@ -135,7 +130,6 @@ var _ = Describe("ERC20:", Ordered, func() { s.app.EndBlocker(s.ctx, abci.RequestEndBlock{Height: s.ctx.BlockHeight()}) s.Commit() }) - It("should create a token pairs owned by the contract deployer", func() { tokenPairs := s.app.Erc20Keeper.GetTokenPairs(s.ctx) s.Require().Equal(2, len(tokenPairs)) @@ -146,7 +140,6 @@ var _ = Describe("ERC20:", Ordered, func() { } }) }) - Describe("for multiple ERC20 tokens", func() { BeforeEach(func() { // register with sufficient deposit @@ -167,7 +160,6 @@ var _ = Describe("ERC20:", Ordered, func() { s.app.EndBlocker(s.ctx, abci.RequestEndBlock{Height: s.ctx.BlockHeight()}) s.Commit() }) - It("should create a token pairs owned by the contract deployer", func() { tokenPairs := s.app.Erc20Keeper.GetTokenPairs(s.ctx) s.Require().Equal(3, len(tokenPairs)) diff --git a/x/erc20/keeper/setup_test.go b/x/erc20/keeper/setup_test.go index ba44f3b5ff..e330d04832 100644 --- a/x/erc20/keeper/setup_test.go +++ b/x/erc20/keeper/setup_test.go @@ -59,10 +59,11 @@ func TestKeeperTestSuite(t *testing.T) { s = new(KeeperTestSuite) suite.Run(t, s) + // Run Ginkgo integration tests RegisterFailHandler(Fail) - RunSpecs(t, "ERC20 Keeper Integration Tests Suite") + RunSpecs(t, "Keeper Suite") } func (suite *KeeperTestSuite) SetupTest() { - suite.DoSetupTest() + suite.DoSetupTest(suite.T()) } diff --git a/x/erc20/keeper/utils_test.go b/x/erc20/keeper/utils_test.go index acf72b6e58..230d33b01e 100644 --- a/x/erc20/keeper/utils_test.go +++ b/x/erc20/keeper/utils_test.go @@ -36,6 +36,7 @@ import ( evm "github.com/evmos/evmos/v19/x/evm/types" feemarkettypes "github.com/evmos/evmos/v19/x/feemarket/types" inflationtypes "github.com/evmos/evmos/v19/x/inflation/v1/types" + "github.com/stretchr/testify/require" ) func CreatePacket(amount, denom, sender, receiver, srcPort, srcChannel, dstPort, dstChannel string, seq, timeout uint64) channeltypes.Packet { @@ -57,18 +58,17 @@ func CreatePacket(amount, denom, sender, receiver, srcPort, srcChannel, dstPort, ) } -func (suite *KeeperTestSuite) DoSetupTest() { +func (suite *KeeperTestSuite) DoSetupTest(t require.TestingT) { // account key priv, err := ethsecp256k1.GenerateKey() - suite.Require().NoError(err) - + require.NoError(t, err) suite.priv = priv suite.address = common.BytesToAddress(priv.PubKey().Address().Bytes()) suite.signer = utiltx.NewSigner(priv) // consensus key privCons, err := ethsecp256k1.GenerateKey() - suite.Require().NoError(err) + require.NoError(t, err) consAddress := sdk.ConsAddress(privCons.PubKey().Address()) suite.consAddress = consAddress @@ -93,22 +93,22 @@ func (suite *KeeperTestSuite) DoSetupTest() { stakingParams := suite.app.StakingKeeper.GetParams(suite.ctx) stakingParams.BondDenom = utils.BaseDenom err = suite.app.StakingKeeper.SetParams(suite.ctx, stakingParams) - suite.Require().NoError(err) + require.NoError(t, err) evmParams := suite.app.EvmKeeper.GetParams(suite.ctx) evmParams.EvmDenom = utils.BaseDenom err = suite.app.EvmKeeper.SetParams(suite.ctx, evmParams) - suite.Require().NoError(err) + require.NoError(t, err) // Set Validator valAddr := sdk.ValAddress(suite.address.Bytes()) validator, err := stakingtypes.NewValidator(valAddr, privCons.PubKey(), stakingtypes.Description{}) - suite.Require().NoError(err) + require.NoError(t, err) validator = stakingkeeper.TestingUpdateValidator(suite.app.StakingKeeper.Keeper, suite.ctx, validator, true) err = suite.app.StakingKeeper.Hooks().AfterValidatorCreated(suite.ctx, validator.GetOperator()) - suite.Require().NoError(err) + require.NoError(t, err) err = suite.app.StakingKeeper.SetValidatorByConsAddr(suite.ctx, validator) - suite.Require().NoError(err) + require.NoError(t, err) // fund signer acc to pay for tx fees amt := sdkmath.NewInt(int64(math.Pow10(18) * 2)) diff --git a/x/evm/genesis.go b/x/evm/genesis.go index 54ca4c6194..2ca39abbe0 100644 --- a/x/evm/genesis.go +++ b/x/evm/genesis.go @@ -3,13 +3,16 @@ package evm import ( + "bytes" "fmt" abci "github.com/cometbft/cometbft/abci/types" sdk "github.com/cosmos/cosmos-sdk/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" + evmostypes "github.com/evmos/evmos/v19/types" "github.com/evmos/evmos/v19/x/evm/keeper" "github.com/evmos/evmos/v19/x/evm/types" ) @@ -36,23 +39,31 @@ func InitGenesis( for _, account := range data.Accounts { address := common.HexToAddress(account.Address) accAddress := sdk.AccAddress(address.Bytes()) - - // check that the account is actually found in the account keeper + // check that the EVM balance the matches the account balance acc := accountKeeper.GetAccount(ctx, accAddress) if acc == nil { panic(fmt.Errorf("account not found for address %s", account.Address)) } + ethAcct, ok := acc.(evmostypes.EthAccountI) + if !ok { + panic( + fmt.Errorf("account %s must be an EthAccount interface, got %T", + account.Address, acc, + ), + ) + } code := common.Hex2Bytes(account.Code) - codeHash := crypto.Keccak256Hash(code).Bytes() + codeHash := crypto.Keccak256Hash(code) - if !types.IsEmptyCodeHash(codeHash) { - k.SetCodeHash(ctx, address.Bytes(), codeHash) + // we ignore the empty Code hash checking, see ethermint PR#1234 + if len(account.Code) != 0 && !bytes.Equal(ethAcct.GetCodeHash().Bytes(), codeHash.Bytes()) { + s := "the evm state code doesn't match with the codehash\n" + panic(fmt.Sprintf("%s account: %s , evm state codehash: %v, ethAccount codehash: %v, evm state code: %s\n", + s, account.Address, codeHash, ethAcct.GetCodeHash(), account.Code)) } - if len(code) != 0 { - k.SetCode(ctx, codeHash, code) - } + k.SetCode(ctx, codeHash.Bytes(), code) for _, storage := range account.Storage { k.SetState(ctx, address, common.HexToHash(storage.Key), common.HexToHash(storage.Value).Bytes()) @@ -63,14 +74,22 @@ func InitGenesis( } // ExportGenesis exports genesis state of the EVM module -func ExportGenesis(ctx sdk.Context, k *keeper.Keeper) *types.GenesisState { +func ExportGenesis(ctx sdk.Context, k *keeper.Keeper, ak types.AccountKeeper) *types.GenesisState { var ethGenAccounts []types.GenesisAccount - k.IterateContracts(ctx, func(address common.Address, codeHash common.Hash) (stop bool) { - storage := k.GetAccountStorage(ctx, address) + ak.IterateAccounts(ctx, func(account authtypes.AccountI) bool { + ethAccount, ok := account.(evmostypes.EthAccountI) + if !ok { + // ignore non EthAccounts + return false + } + + addr := ethAccount.EthAddress() + + storage := k.GetAccountStorage(ctx, addr) genAccount := types.GenesisAccount{ - Address: address.String(), - Code: common.Bytes2Hex(k.GetCode(ctx, codeHash)), + Address: addr.String(), + Code: common.Bytes2Hex(k.GetCode(ctx, ethAccount.GetCodeHash())), Storage: storage, } diff --git a/x/evm/genesis_test.go b/x/evm/genesis_test.go index f627b800e2..2a57b761bd 100644 --- a/x/evm/genesis_test.go +++ b/x/evm/genesis_test.go @@ -4,14 +4,12 @@ import ( "math/big" "testing" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v19/contracts" "github.com/evmos/evmos/v19/crypto/ethsecp256k1" - testfactory "github.com/evmos/evmos/v19/testutil/integration/evmos/factory" - testhandler "github.com/evmos/evmos/v19/testutil/integration/evmos/grpc" testkeyring "github.com/evmos/evmos/v19/testutil/integration/evmos/keyring" testnetwork "github.com/evmos/evmos/v19/testutil/integration/evmos/network" + evmostypes "github.com/evmos/evmos/v19/types" "github.com/evmos/evmos/v19/x/evm" "github.com/evmos/evmos/v19/x/evm/statedb" "github.com/evmos/evmos/v19/x/evm/types" @@ -21,8 +19,6 @@ import ( type GenesisTestSuite struct { keyring testkeyring.Keyring network *testnetwork.UnitTestNetwork - handler testhandler.Handler - factory testfactory.TxFactory } func SetupTest() *GenesisTestSuite { @@ -30,14 +26,9 @@ func SetupTest() *GenesisTestSuite { network := testnetwork.NewUnitTestNetwork( testnetwork.WithPreFundedAccounts(keyring.GetAllAccAddrs()...), ) - handler := testhandler.NewIntegrationHandler(network) - factory := testfactory.New(network, handler) - return &GenesisTestSuite{ keyring: keyring, network: network, - handler: handler, - factory: factory, } } @@ -53,7 +44,6 @@ func TestInitGenesis(t *testing.T) { name string malleate func(*testnetwork.UnitTestNetwork) genState *types.GenesisState - code common.Hash expPanic bool }{ { @@ -94,7 +84,23 @@ func TestInitGenesis(t *testing.T) { expPanic: true, }, { - name: "ignore empty account code checking", + name: "invalid account type", + malleate: func(network *testnetwork.UnitTestNetwork) { + acc := authtypes.NewBaseAccountWithAddress(address.Bytes()) + network.App.AccountKeeper.SetAccount(network.GetContext(), acc) + }, + genState: &types.GenesisState{ + Params: types.DefaultParams(), + Accounts: []types.GenesisAccount{ + { + Address: address.String(), + }, + }, + }, + expPanic: true, + }, + { + name: "invalid code hash", malleate: func(network *testnetwork.UnitTestNetwork) { ctx := network.GetContext() acc := network.App.AccountKeeper.NewAccountWithAddress(ctx, address.Bytes()) @@ -105,14 +111,14 @@ func TestInitGenesis(t *testing.T) { Accounts: []types.GenesisAccount{ { Address: address.String(), - Code: "", + Code: "ffffffff", }, }, }, - expPanic: false, + expPanic: true, }, { - name: "valid account with code", + name: "ignore empty account code checking", malleate: func(network *testnetwork.UnitTestNetwork) { ctx := network.GetContext() acc := network.App.AccountKeeper.NewAccountWithAddress(ctx, address.Bytes()) @@ -123,7 +129,28 @@ func TestInitGenesis(t *testing.T) { Accounts: []types.GenesisAccount{ { Address: address.String(), - Code: "1234", + Code: "", + }, + }, + }, + expPanic: false, + }, + { + name: "ignore empty account code checking with non-empty codehash", + malleate: func(network *testnetwork.UnitTestNetwork) { + ethAcc := &evmostypes.EthAccount{ + BaseAccount: authtypes.NewBaseAccount(address.Bytes(), nil, 0, 0), + CodeHash: common.BytesToHash([]byte{1, 2, 3}).Hex(), + } + + network.App.AccountKeeper.SetAccount(network.GetContext(), ethAcc) + }, + genState: &types.GenesisState{ + Params: types.DefaultParams(), + Accounts: []types.GenesisAccount{ + { + Address: address.String(), + Code: "", }, }, }, @@ -164,80 +191,7 @@ func TestInitGenesis(t *testing.T) { *tc.genState, ) }) - - // If the initialization has not panicked we're checking the state - for _, account := range tc.genState.Accounts { - acc := ts.network.App.AccountKeeper.GetAccount(ctx, common.HexToAddress(account.Address).Bytes()) - require.NotNil(t, acc, "account not found in account keeper") - - expHash := crypto.Keccak256Hash(common.Hex2Bytes(account.Code)) - if account.Code == "" { - expHash = common.BytesToHash(types.EmptyCodeHash) - } - - require.Equal(t, - expHash.String(), - ts.network.App.EvmKeeper.GetCodeHash( - ts.network.GetContext(), - common.HexToAddress(account.Address), - ).String(), - "code hash mismatch", - ) - - require.Equal(t, - account.Code, - common.Bytes2Hex( - ts.network.App.EvmKeeper.GetCode( - ts.network.GetContext(), - expHash, - ), - ), - "code mismatch", - ) - - for _, storage := range account.Storage { - key := common.HexToHash(storage.Key) - value := common.HexToHash(storage.Value) - require.Equal(t, value, vmdb.GetState(common.HexToAddress(account.Address), key), "storage mismatch") - } - } } }) } } - -func TestExportGenesis(t *testing.T) { - ts := SetupTest() - - contractAddr, err := ts.factory.DeployContract( - ts.keyring.GetPrivKey(0), - types.EvmTxArgs{}, - testfactory.ContractDeploymentData{ - Contract: contracts.ERC20MinterBurnerDecimalsContract, - ConstructorArgs: []interface{}{"TestToken", "TTK", uint8(18)}, - }, - ) - require.NoError(t, err, "failed to deploy contract") - require.NoError(t, ts.network.NextBlock(), "failed to advance block") - - contractAddr2, err := ts.factory.DeployContract( - ts.keyring.GetPrivKey(0), - types.EvmTxArgs{}, - testfactory.ContractDeploymentData{ - Contract: contracts.ERC20MinterBurnerDecimalsContract, - ConstructorArgs: []interface{}{"AnotherToken", "ATK", uint8(18)}, - }, - ) - require.NoError(t, err, "failed to deploy contract") - require.NoError(t, ts.network.NextBlock(), "failed to advance block") - - genState := evm.ExportGenesis(ts.network.GetContext(), ts.network.App.EvmKeeper) - require.Len(t, genState.Accounts, 2, "expected only one smart contract in the exported genesis") - - genAddresses := make([]string, 0, len(genState.Accounts)) - for _, acc := range genState.Accounts { - genAddresses = append(genAddresses, acc.Address) - } - require.Contains(t, genAddresses, contractAddr.Hex(), "expected contract 1 address in exported genesis") - require.Contains(t, genAddresses, contractAddr2.Hex(), "expected contract 2 address in exported genesis") -} diff --git a/x/evm/keeper/integration_test.go b/x/evm/keeper/integration_test.go index 9cbbca3a48..7b6a5c04ad 100644 --- a/x/evm/keeper/integration_test.go +++ b/x/evm/keeper/integration_test.go @@ -5,12 +5,13 @@ package keeper_test import ( "math/big" + "cosmossdk.io/math" + //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/gomega" - "cosmossdk.io/math" abcitypes "github.com/cometbft/cometbft/abci/types" sdktypes "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" @@ -158,13 +159,8 @@ var _ = Describe("Handling a MsgEthereumTx message", Label("EVM"), Ordered, func contractBechAddr := sdktypes.AccAddress(contractAddr.Bytes()).String() contractAccount, err := s.grpcHandler.GetAccount(contractBechAddr) Expect(err).To(BeNil()) - Expect(contractAccount).ToNot(BeNil(), "expected account to be retrievable via auth query") - - ethAccountRes, err := s.grpcHandler.GetEvmAccount(contractAddr) - Expect(err).To(BeNil(), "expected no error retrieving account from the state db") - Expect(ethAccountRes.CodeHash).ToNot(Equal(common.BytesToHash(evmtypes.EmptyCodeHash).Hex()), - "expected code hash not to be the empty code hash", - ) + err = integrationutils.IsContractAccount(contractAccount) + Expect(err).To(BeNil()) }, Entry("as a DynamicFeeTx", func() evmtypes.EvmTxArgs { return evmtypes.EvmTxArgs{} }), Entry("as an AccessListTx", diff --git a/x/evm/keeper/keeper.go b/x/evm/keeper/keeper.go index 60a57e7e4f..c5eac4b422 100644 --- a/x/evm/keeper/keeper.go +++ b/x/evm/keeper/keeper.go @@ -247,15 +247,19 @@ func (k *Keeper) GetAccountWithoutBalance(ctx sdk.Context, addr common.Address) return nil } - codeHashBz := k.GetCodeHash(ctx, addr).Bytes() + codeHash := types.EmptyCodeHash + ethAcct, ok := acct.(evmostypes.EthAccountI) + if ok { + codeHash = ethAcct.GetCodeHash().Bytes() + } return &statedb.Account{ Nonce: acct.GetSequence(), - CodeHash: codeHashBz, + CodeHash: codeHash, } } -// GetAccountOrEmpty returns empty account if not exist +// GetAccountOrEmpty returns empty account if not exist, returns error if it's not `EthAccount` func (k *Keeper) GetAccountOrEmpty(ctx sdk.Context, addr common.Address) statedb.Account { acct := k.GetAccount(ctx, addr) if acct != nil { diff --git a/x/evm/keeper/keeper_test.go b/x/evm/keeper/keeper_test.go index 8e6d9d47c1..0513ffb49d 100644 --- a/x/evm/keeper/keeper_test.go +++ b/x/evm/keeper/keeper_test.go @@ -1,12 +1,11 @@ package keeper_test import ( - "fmt" "math/big" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/evmos/evmos/v19/utils" + evmostypes "github.com/evmos/evmos/v19/types" "github.com/evmos/evmos/v19/x/evm/keeper" "github.com/evmos/evmos/v19/x/evm/statedb" evmtypes "github.com/evmos/evmos/v19/x/evm/types" @@ -94,60 +93,40 @@ func (suite *KeeperTestSuite) TestBaseFee() { func (suite *KeeperTestSuite) TestGetAccountStorage() { testCases := []struct { name string - malleate func() common.Address + malleate func() + expRes []int }{ { - name: "Only accounts that are not a contract (no storage)", - malleate: nil, + "Only one account that's not a contract (no storage)", + func() {}, + []int{0}, }, { - name: "One contract (with storage) and other EOAs", - malleate: func() common.Address { + "Two accounts - one contract (with storage), one wallet", + func() { supply := big.NewInt(100) - contractAddr := suite.DeployTestContract(suite.T(), suite.address, supply) - return contractAddr + suite.DeployTestContract(suite.T(), suite.address, supply) }, + []int{2, 0}, }, } for _, tc := range testCases { suite.Run(tc.name, func() { suite.SetupTest() - - var contractAddr common.Address - if tc.malleate != nil { - contractAddr = tc.malleate() - } - + tc.malleate() i := 0 suite.app.AccountKeeper.IterateAccounts(suite.ctx, func(account authtypes.AccountI) bool { - acc, ok := account.(*authtypes.BaseAccount) + ethAccount, ok := account.(evmostypes.EthAccountI) if !ok { - // Ignore e.g. module accounts + // ignore non EthAccounts return false } - address, err := utils.Bech32ToHexAddr(acc.Address) - if err != nil { - // NOTE: we panic in the test to see any potential problems - // instead of skipping to the next account - panic(fmt.Sprintf("failed to convert %s to hex address", err)) - } - - storage := suite.app.EvmKeeper.GetAccountStorage(suite.ctx, address) - - if address == contractAddr { - suite.Require().NotEqual(0, len(storage), - "expected account %d to have non-zero amount of storage slots, got %d", - i, len(storage), - ) - } else { - suite.Require().Len(storage, 0, - "expected account %d to have %d storage slots, got %d", - i, 0, len(storage), - ) - } + addr := ethAccount.EthAddress() + storage := suite.app.EvmKeeper.GetAccountStorage(suite.ctx, addr) + suite.Require().Equal(tc.expRes[i], len(storage)) i++ return false }) diff --git a/x/evm/keeper/setup_test.go b/x/evm/keeper/setup_test.go index 0541386d85..482fcfa319 100644 --- a/x/evm/keeper/setup_test.go +++ b/x/evm/keeper/setup_test.go @@ -5,6 +5,11 @@ import ( "testing" "time" + //nolint:revive // dot imports are fine for Ginkgo + . "github.com/onsi/ginkgo/v2" + //nolint:revive // dot imports are fine for Ginkgo + . "github.com/onsi/gomega" + sdkmath "cosmossdk.io/math" "cosmossdk.io/simapp" abci "github.com/cometbft/cometbft/abci/types" @@ -28,6 +33,7 @@ import ( "github.com/evmos/evmos/v19/encoding" "github.com/evmos/evmos/v19/testutil" utiltx "github.com/evmos/evmos/v19/testutil/tx" + evmostypes "github.com/evmos/evmos/v19/types" "github.com/evmos/evmos/v19/utils" evmtypes "github.com/evmos/evmos/v19/x/evm/types" feemarkettypes "github.com/evmos/evmos/v19/x/feemarket/types" @@ -73,6 +79,10 @@ func TestKeeperTestSuite(t *testing.T) { // Run UnitTestSuite unitTestSuite := new(UnitTestSuite) suite.Run(t, unitTestSuite) + + // Run Ginkgo integration tests + RegisterFailHandler(Fail) + RunSpecs(t, "Keeper Suite") } func (suite *KeeperTestSuite) SetupTest() { @@ -175,7 +185,11 @@ func (suite *KeeperTestSuite) SetupAppWithT(checkTx bool, t require.TestingT, ch evmtypes.RegisterQueryServer(queryHelper, suite.app.EvmKeeper) suite.queryClient = evmtypes.NewQueryClient(queryHelper) - acc := authtypes.NewBaseAccount(sdk.AccAddress(suite.address.Bytes()), nil, 0, 0) + acc := &evmostypes.EthAccount{ + BaseAccount: authtypes.NewBaseAccount(sdk.AccAddress(suite.address.Bytes()), nil, 0, 0), + CodeHash: common.BytesToHash(crypto.Keccak256(nil)).String(), + } + suite.app.AccountKeeper.SetAccount(suite.ctx, acc) valAddr := sdk.ValAddress(suite.address.Bytes()) diff --git a/x/evm/keeper/statedb.go b/x/evm/keeper/statedb.go index 891f75d851..9ec6008fcf 100644 --- a/x/evm/keeper/statedb.go +++ b/x/evm/keeper/statedb.go @@ -1,17 +1,19 @@ // Copyright Tharsis Labs Ltd.(Evmos) // SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - package keeper import ( - "errors" + "fmt" "math/big" sdkmath "cosmossdk.io/math" + + errorsmod "cosmossdk.io/errors" "github.com/cosmos/cosmos-sdk/store/prefix" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" + evmostypes "github.com/evmos/evmos/v19/types" "github.com/evmos/evmos/v19/x/evm/statedb" "github.com/evmos/evmos/v19/x/evm/types" ) @@ -22,7 +24,7 @@ var _ statedb.Keeper = &Keeper{} // StateDB Keeper implementation // ---------------------------------------------------------------------------- -// GetAccount returns nil if account is not exist +// GetAccount returns nil if account is not exist, returns error if it's not `EthAccountI` func (k *Keeper) GetAccount(ctx sdk.Context, addr common.Address) *statedb.Account { acct := k.GetAccountWithoutBalance(ctx, addr) if acct == nil { @@ -52,36 +54,6 @@ func (k *Keeper) GetFastState(ctx sdk.Context, addr common.Address, key common.H return store.Get(key.Bytes()) } -// GetCodeHash loads the code hash from the database for the given contract address. -func (k *Keeper) GetCodeHash(ctx sdk.Context, addr common.Address) common.Hash { - store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefixCodeHash) - bz := store.Get(addr.Bytes()) - if len(bz) == 0 { - return common.BytesToHash(types.EmptyCodeHash) - } - - return common.BytesToHash(bz) -} - -// IterateContracts iterates over all smart contract addresses in the EVM keeper and -// performs a callback function. -// -// The iteration is stopped when the callback function returns true. -func (k Keeper) IterateContracts(ctx sdk.Context, cb func(addr common.Address, codeHash common.Hash) (stop bool)) { - store := ctx.KVStore(k.storeKey) - iterator := sdk.KVStorePrefixIterator(store, types.KeyPrefixCodeHash) - - defer iterator.Close() - for ; iterator.Valid(); iterator.Next() { - addr := common.BytesToAddress(iterator.Key()) - codeHash := common.BytesToHash(iterator.Value()) - - if cb(addr, codeHash) { - break - } - } -} - // GetCode loads contract code from database, implements `statedb.Keeper` interface. func (k *Keeper) GetCode(ctx sdk.Context, codeHash common.Hash) []byte { store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefixCode) @@ -143,20 +115,24 @@ func (k *Keeper) SetBalance(ctx sdk.Context, addr common.Address, amount *big.In // SetAccount updates nonce/balance/codeHash together. func (k *Keeper) SetAccount(ctx sdk.Context, addr common.Address, account statedb.Account) error { // update account - acct := k.accountKeeper.GetAccount(ctx, addr.Bytes()) + cosmosAddr := sdk.AccAddress(addr.Bytes()) + acct := k.accountKeeper.GetAccount(ctx, cosmosAddr) if acct == nil { - acct = k.accountKeeper.NewAccountWithAddress(ctx, addr.Bytes()) + acct = k.accountKeeper.NewAccountWithAddress(ctx, cosmosAddr) } if err := acct.SetSequence(account.Nonce); err != nil { return err } - if types.IsEmptyCodeHash(account.CodeHash) { - k.DeleteCodeHash(ctx, addr) - } else { - k.SetCodeHash(ctx, addr.Bytes(), account.CodeHash) + codeHash := common.BytesToHash(account.CodeHash) + + if ethAcct, ok := acct.(evmostypes.EthAccountI); ok { + if err := ethAcct.SetCodeHash(codeHash); err != nil { + return err + } } + k.accountKeeper.SetAccount(ctx, acct) if err := k.SetBalance(ctx, addr, account.Balance); err != nil { @@ -167,80 +143,43 @@ func (k *Keeper) SetAccount(ctx sdk.Context, addr common.Address, account stated "account updated", "ethereum-address", addr.Hex(), "nonce", account.Nonce, - "codeHash", common.BytesToHash(account.CodeHash).Hex(), + "codeHash", codeHash.Hex(), "balance", account.Balance, ) return nil } -// SetState update contract storage. +// SetState update contract storage, delete if value is empty. func (k *Keeper) SetState(ctx sdk.Context, addr common.Address, key common.Hash, value []byte) { store := prefix.NewStore(ctx.KVStore(k.storeKey), types.AddressStoragePrefix(addr)) - store.Set(key.Bytes(), value) - - k.Logger(ctx).Debug( - "state updated", - "ethereum-address", addr.Hex(), - "key", key.Hex(), - ) -} - -// DeleteState deletes the entry for the given key in the contract storage -// at the defined contract address. -func (k *Keeper) DeleteState(ctx sdk.Context, addr common.Address, key common.Hash) { - store := prefix.NewStore(ctx.KVStore(k.storeKey), types.AddressStoragePrefix(addr)) - store.Delete(key.Bytes()) - + action := "updated" + if len(value) == 0 { + store.Delete(key.Bytes()) + action = "deleted" + } else { + store.Set(key.Bytes(), value) + } k.Logger(ctx).Debug( - "state deleted", + fmt.Sprintf("state %s", action), "ethereum-address", addr.Hex(), "key", key.Hex(), ) } -// SetCodeHash sets the code hash for the given contract address. -func (k *Keeper) SetCodeHash(ctx sdk.Context, addrBytes, hashBytes []byte) { - store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefixCodeHash) - store.Set(addrBytes, hashBytes) - - k.Logger(ctx).Debug( - "code hash updated", - "address", common.BytesToAddress(addrBytes).Hex(), - "code hash", common.BytesToHash(hashBytes).Hex(), - ) -} - -// DeleteCodeHash deletes the code hash for the given contract address from the store. -func (k *Keeper) DeleteCodeHash(ctx sdk.Context, addr common.Address) { - store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefixCodeHash) - store.Delete(addr.Bytes()) - - k.Logger(ctx).Debug( - "code hash deleted", - "address", addr.Hex(), - ) -} - -// SetCode sets the given contract code bytes for the corresponding code hash bytes key -// in the code store. +// SetCode set contract code, delete if code is empty. func (k *Keeper) SetCode(ctx sdk.Context, codeHash, code []byte) { store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefixCode) - store.Set(codeHash, code) - - k.Logger(ctx).Debug( - "code updated", - "code-hash", common.BytesToHash(codeHash).Hex(), - ) -} - -// DeleteCode deletes the contract code for the given code hash bytes in -// the corresponding store. -func (k *Keeper) DeleteCode(ctx sdk.Context, codeHash []byte) { - store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefixCode) - store.Delete(codeHash) + // store or delete code + action := "updated" + if len(code) == 0 { + store.Delete(codeHash) + action = "deleted" + } else { + store.Set(codeHash, code) + } k.Logger(ctx).Debug( - "code deleted", + fmt.Sprintf("code %s", action), "code-hash", common.BytesToHash(codeHash).Hex(), ) } @@ -249,7 +188,6 @@ func (k *Keeper) DeleteCode(ctx sdk.Context, codeHash []byte) { // - clear balance // - remove code // - remove states -// - remove the code hash // - remove auth account func (k *Keeper) DeleteAccount(ctx sdk.Context, addr common.Address) error { cosmosAddr := sdk.AccAddress(addr.Bytes()) @@ -258,9 +196,10 @@ func (k *Keeper) DeleteAccount(ctx sdk.Context, addr common.Address) error { return nil } - // NOTE: only Ethereum contracts can be self-destructed - if !k.IsContract(ctx, addr) { - return errors.New("only smart contracts can be self-destructed") + // NOTE: only Ethereum accounts (contracts) can be selfdestructed + _, ok := acct.(evmostypes.EthAccountI) + if !ok { + return errorsmod.Wrapf(types.ErrInvalidAccount, "type %T, address %s", acct, addr) } // clear balance @@ -270,13 +209,10 @@ func (k *Keeper) DeleteAccount(ctx sdk.Context, addr common.Address) error { // clear storage k.ForEachStorage(ctx, addr, func(key, _ common.Hash) bool { - k.DeleteState(ctx, addr, key) + k.SetState(ctx, addr, key, nil) return true }) - // clear code hash - k.DeleteCodeHash(ctx, addr) - // remove auth account k.accountKeeper.RemoveAccount(ctx, acct) diff --git a/x/evm/keeper/statedb_test.go b/x/evm/keeper/statedb_test.go index 10849a1d81..9e77efe769 100644 --- a/x/evm/keeper/statedb_test.go +++ b/x/evm/keeper/statedb_test.go @@ -3,7 +3,6 @@ package keeper_test import ( "fmt" "math/big" - "testing" codectypes "github.com/cosmos/cosmos-sdk/codec/types" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" @@ -16,16 +15,11 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/evmos/v19/contracts" - testfactory "github.com/evmos/evmos/v19/testutil/integration/evmos/factory" - testhandler "github.com/evmos/evmos/v19/testutil/integration/evmos/grpc" - testkeyring "github.com/evmos/evmos/v19/testutil/integration/evmos/keyring" - testnetwork "github.com/evmos/evmos/v19/testutil/integration/evmos/network" + "github.com/evmos/evmos/v19/crypto/ethsecp256k1" utiltx "github.com/evmos/evmos/v19/testutil/tx" "github.com/evmos/evmos/v19/x/evm/core/vm" "github.com/evmos/evmos/v19/x/evm/statedb" "github.com/evmos/evmos/v19/x/evm/types" - "github.com/stretchr/testify/require" ) func (suite *KeeperTestSuite) TestCreateAccount() { @@ -243,7 +237,7 @@ func (suite *KeeperTestSuite) TestGetCodeHash() { func(vm.StateDB) {}, }, { - "account is not a smart contract", + "account not EthAccount type, EmptyCodeHash", addr, common.BytesToHash(types.EmptyCodeHash), func(vm.StateDB) {}, @@ -287,7 +281,7 @@ func (suite *KeeperTestSuite) TestSetCode() { false, }, { - "account not a smart contract", + "account not EthAccount type", addr, nil, true, @@ -324,7 +318,7 @@ func (suite *KeeperTestSuite) TestSetCode() { } } -func (suite *KeeperTestSuite) TestKeeperSetOrDeleteCode() { +func (suite *KeeperTestSuite) TestKeeperSetCode() { addr := utiltx.GenerateAddress() baseAcc := &authtypes.BaseAccount{Address: sdk.AccAddress(addr.Bytes()).String()} suite.app.AccountKeeper.SetAccount(suite.ctx, baseAcc) @@ -348,11 +342,7 @@ func (suite *KeeperTestSuite) TestKeeperSetOrDeleteCode() { for _, tc := range testCases { suite.Run(tc.name, func() { - if len(tc.code) == 0 { - suite.app.EvmKeeper.DeleteCode(suite.ctx, tc.codeHash) - } else { - suite.app.EvmKeeper.SetCode(suite.ctx, tc.codeHash, tc.code) - } + suite.app.EvmKeeper.SetCode(suite.ctx, tc.codeHash, tc.code) key := suite.app.GetKey(types.StoreKey) store := prefix.NewStore(suite.ctx.KVStore(key), types.KeyPrefixCode) code := store.Get(tc.codeHash) @@ -362,54 +352,6 @@ func (suite *KeeperTestSuite) TestKeeperSetOrDeleteCode() { } } -func TestIterateContracts(t *testing.T) { - keyring := testkeyring.New(1) - network := testnetwork.NewUnitTestNetwork( - testnetwork.WithPreFundedAccounts(keyring.GetAllAccAddrs()...), - ) - handler := testhandler.NewIntegrationHandler(network) - factory := testfactory.New(network, handler) - - contractAddr, err := factory.DeployContract( - keyring.GetPrivKey(0), - types.EvmTxArgs{}, - testfactory.ContractDeploymentData{ - Contract: contracts.ERC20MinterBurnerDecimalsContract, - ConstructorArgs: []interface{}{"TestToken", "TTK", uint8(18)}, - }, - ) - require.NoError(t, err, "failed to deploy contract") - require.NoError(t, network.NextBlock(), "failed to advance block") - - contractAddr2, err := factory.DeployContract( - keyring.GetPrivKey(0), - types.EvmTxArgs{}, - testfactory.ContractDeploymentData{ - Contract: contracts.ERC20MinterBurnerDecimalsContract, - ConstructorArgs: []interface{}{"AnotherToken", "ATK", uint8(18)}, - }, - ) - require.NoError(t, err, "failed to deploy contract") - require.NoError(t, network.NextBlock(), "failed to advance block") - - var ( - foundAddrs []common.Address - foundHashes []common.Hash - ) - - network.App.EvmKeeper.IterateContracts(network.GetContext(), func(addr common.Address, codeHash common.Hash) bool { - foundAddrs = append(foundAddrs, addr) - foundHashes = append(foundHashes, codeHash) - return false - }) - - require.Len(t, foundAddrs, 2, "expected 2 contracts to be found when iterating") - require.Contains(t, foundAddrs, contractAddr, "expected contract 1 to be found when iterating") - require.Contains(t, foundAddrs, contractAddr2, "expected contract 2 to be found when iterating") - require.Equal(t, foundHashes[0], foundHashes[1], "expected both contracts to have the same code hash") - require.NotEqual(t, types.EmptyCodeHash, foundHashes[0], "expected store code hash not to be the keccak256 of empty code") -} - func (suite *KeeperTestSuite) TestRefund() { testCases := []struct { name string @@ -500,69 +442,55 @@ func (suite *KeeperTestSuite) TestCommittedState() { suite.Require().Equal(value2, tmp) } -func (suite *KeeperTestSuite) TestSetAndGetCodeHash() { - suite.SetupTest() -} - func (suite *KeeperTestSuite) TestSuicide() { - suite.SetupTest() - - // Generate addresses for testing - addr1 := utiltx.GenerateAddress() - addr2 := utiltx.GenerateAddress() - - // Set the code in the code storage - code := []byte("code1") - codeHashBz := crypto.Keccak256(code) - suite.app.EvmKeeper.SetCodeHash(s.ctx, addr1.Bytes(), codeHashBz) - suite.app.EvmKeeper.SetCodeHash(s.ctx, addr2.Bytes(), codeHashBz) - - // NOTE: we're instantiating the StateDB here to have the context already contain the + code := []byte("code") db := suite.StateDB() - // Add code to account - db.SetCode(addr1, code) - - suite.Require().Equal(code, db.GetCode(addr1)) + db.SetCode(suite.address, code) + suite.Require().Equal(code, db.GetCode(suite.address)) // Add state to account for i := 0; i < 5; i++ { - db.SetState(addr1, common.BytesToHash([]byte(fmt.Sprintf("key%d", i))), common.BytesToHash([]byte(fmt.Sprintf("value%d", i)))) + db.SetState(suite.address, common.BytesToHash([]byte(fmt.Sprintf("key%d", i))), common.BytesToHash([]byte(fmt.Sprintf("value%d", i)))) } suite.Require().NoError(db.Commit()) db = suite.StateDB() + // Generate 2nd address + privkey, _ := ethsecp256k1.GenerateKey() + key, err := privkey.ToECDSA() + suite.Require().NoError(err) + addr2 := crypto.PubkeyToAddress(key.PublicKey) + // Add code and state to account 2 db.SetCode(addr2, code) suite.Require().Equal(code, db.GetCode(addr2)) - for i := 0; i < 5; i++ { db.SetState(addr2, common.BytesToHash([]byte(fmt.Sprintf("key%d", i))), common.BytesToHash([]byte(fmt.Sprintf("value%d", i)))) } // Call Suicide - suite.Require().Equal(true, db.Suicide(addr1)) + suite.Require().Equal(true, db.Suicide(suite.address)) // Check suicided is marked - suite.Require().Equal(true, db.HasSuicided(addr1)) + suite.Require().Equal(true, db.HasSuicided(suite.address)) // Commit state suite.Require().NoError(db.Commit()) db = suite.StateDB() // Check code is deleted - suite.Require().Nil(db.GetCode(addr1)) - + suite.Require().Nil(db.GetCode(suite.address)) // Check state is deleted var storage types.Storage - suite.app.EvmKeeper.ForEachStorage(suite.ctx, addr1, func(key, value common.Hash) bool { + suite.app.EvmKeeper.ForEachStorage(suite.ctx, suite.address, func(key, value common.Hash) bool { storage = append(storage, types.NewState(key, value)) return true }) suite.Require().Equal(0, len(storage)) // Check account is deleted - suite.Require().Equal(common.Hash{}, db.GetCodeHash(addr1)) + suite.Require().Equal(common.Hash{}, db.GetCodeHash(suite.address)) // Check code is still present in addr2 and suicided is false suite.Require().NotNil(db.GetCode(addr2)) @@ -1008,52 +936,41 @@ func (suite *KeeperTestSuite) TestSetBalance() { } func (suite *KeeperTestSuite) TestDeleteAccount() { - suite.SetupTest() - supply := big.NewInt(100) contractAddr := suite.DeployTestContract(suite.T(), suite.address, supply) testCases := []struct { - name string - addr common.Address - expPass bool - errContains string + name string + addr common.Address + expErr bool }{ { - name: "remove address", - addr: suite.address, - errContains: "only smart contracts can be self-destructed", + "remove address", + suite.address, + false, }, { - name: "remove unexistent address - returns nil error", - addr: common.HexToAddress("unexistent_address"), - expPass: true, + "remove unexistent address - returns nil error", + common.HexToAddress("unexistent_address"), + false, }, { - name: "remove deployed contract", - addr: contractAddr, - expPass: true, + "remove deployed contract", + contractAddr, + false, }, } for _, tc := range testCases { suite.Run(tc.name, func() { suite.SetupTest() - err := suite.app.EvmKeeper.DeleteAccount(suite.ctx, tc.addr) - if tc.expPass { - suite.Require().NoError(err, "expected deleting account to succeed") - - acc := suite.app.EvmKeeper.GetAccount(suite.ctx, tc.addr) - suite.Require().Nil(acc, "expected no account to be found after deleting") - - balance := suite.app.EvmKeeper.GetBalance(suite.ctx, tc.addr) - suite.Require().Equal(new(big.Int), balance, "expected balance to be zero after deleting account") + if tc.expErr { + suite.Require().Error(err) } else { - suite.Require().ErrorContains(err, tc.errContains, "expected error to contain message") - - acc := suite.app.EvmKeeper.GetAccount(suite.ctx, tc.addr) - suite.Require().NotNil(acc, "expected account to still be found after failing to delete") + suite.Require().NoError(err) + balance := suite.app.EvmKeeper.GetBalance(suite.ctx, tc.addr) + suite.Require().Equal(new(big.Int), balance) } }) } diff --git a/x/evm/keeper/utils.go b/x/evm/keeper/utils.go deleted file mode 100644 index 3e2ec9188f..0000000000 --- a/x/evm/keeper/utils.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) - -package keeper - -import ( - "github.com/cosmos/cosmos-sdk/store/prefix" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v19/x/evm/types" -) - -// IsContract determines if the given address is a smart contract. -func (k *Keeper) IsContract(ctx sdk.Context, addr common.Address) bool { - store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefixCodeHash) - return store.Has(addr.Bytes()) -} diff --git a/x/evm/migrations/v7/types/evm.pb.go b/x/evm/migrations/v7/types/evm.pb.go index 825b28faff..d6184e6984 100644 --- a/x/evm/migrations/v7/types/evm.pb.go +++ b/x/evm/migrations/v7/types/evm.pb.go @@ -4172,4 +4172,4 @@ var ( ErrInvalidLengthEvm = fmt.Errorf("proto: negative length found during unmarshaling") ErrIntOverflowEvm = fmt.Errorf("proto: integer overflow") ErrUnexpectedEndOfGroupEvm = fmt.Errorf("proto: unexpected end of group") -) +) \ No newline at end of file diff --git a/x/evm/module.go b/x/evm/module.go index 36f40fae45..6ff3befd82 100644 --- a/x/evm/module.go +++ b/x/evm/module.go @@ -173,7 +173,7 @@ func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, data json. // ExportGenesis returns the exported genesis state as raw bytes for the evm // module. func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.RawMessage { - gs := ExportGenesis(ctx, am.keeper) + gs := ExportGenesis(ctx, am.keeper, am.ak) return cdc.MustMarshalJSON(gs) } diff --git a/x/evm/statedb/interfaces.go b/x/evm/statedb/interfaces.go index 7839abdda8..7ca12c5da4 100644 --- a/x/evm/statedb/interfaces.go +++ b/x/evm/statedb/interfaces.go @@ -29,9 +29,7 @@ type Keeper interface { // Write methods, only called by `StateDB.Commit()` SetAccount(ctx sdk.Context, addr common.Address, account Account) error - DeleteState(ctx sdk.Context, addr common.Address, key common.Hash) SetState(ctx sdk.Context, addr common.Address, key common.Hash, value []byte) - DeleteCode(ctx sdk.Context, codeHash []byte) SetCode(ctx sdk.Context, codeHash []byte, code []byte) DeleteAccount(ctx sdk.Context, addr common.Address) error } diff --git a/x/evm/statedb/mock_test.go b/x/evm/statedb/mock_test.go index 4f411e6a23..03f5360944 100644 --- a/x/evm/statedb/mock_test.go +++ b/x/evm/statedb/mock_test.go @@ -1,6 +1,7 @@ package statedb_test import ( + "bytes" "errors" "maps" "math/big" @@ -9,7 +10,6 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" "github.com/evmos/evmos/v19/x/evm/statedb" - "github.com/evmos/evmos/v19/x/evm/types" ) var ( @@ -78,13 +78,11 @@ func (k MockKeeper) SetAccount(_ sdk.Context, addr common.Address, account state func (k MockKeeper) SetState(_ sdk.Context, addr common.Address, key common.Hash, value []byte) { if acct, ok := k.accounts[addr]; ok { - acct.states[key] = common.BytesToHash(value) - } -} - -func (k MockKeeper) DeleteState(_ sdk.Context, addr common.Address, key common.Hash) { - if acct, ok := k.accounts[addr]; ok { - delete(acct.states, key) + if len(value) == 0 { + delete(acct.states, key) + } else { + acct.states[key] = common.BytesToHash(value) + } } } @@ -92,17 +90,13 @@ func (k MockKeeper) SetCode(_ sdk.Context, codeHash []byte, code []byte) { k.codes[common.BytesToHash(codeHash)] = code } -func (k MockKeeper) DeleteCode(_ sdk.Context, codeHash []byte) { - delete(k.codes, common.BytesToHash(codeHash)) -} - func (k MockKeeper) DeleteAccount(_ sdk.Context, addr common.Address) error { if addr == errAddress { return errors.New("mock db error") } old := k.accounts[addr] delete(k.accounts, addr) - if !types.IsEmptyCodeHash(old.account.CodeHash) { + if !bytes.Equal(old.account.CodeHash, emptyCodeHash) { delete(k.codes, common.BytesToHash(old.account.CodeHash)) } return nil diff --git a/x/evm/statedb/state_object.go b/x/evm/statedb/state_object.go index 51a0b258a4..f9a88dfd79 100644 --- a/x/evm/statedb/state_object.go +++ b/x/evm/statedb/state_object.go @@ -9,9 +9,11 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - "github.com/evmos/evmos/v19/x/evm/types" + "github.com/ethereum/go-ethereum/crypto" ) +var emptyCodeHash = crypto.Keccak256(nil) + // Account is the Ethereum consensus representation of accounts. // These objects are stored in the storage of auth module. type Account struct { @@ -24,13 +26,13 @@ type Account struct { func NewEmptyAccount() *Account { return &Account{ Balance: new(big.Int), - CodeHash: types.EmptyCodeHash, + CodeHash: emptyCodeHash, } } // IsContract returns if the account contains contract code. func (acct Account) IsContract() bool { - return !types.IsEmptyCodeHash(acct.CodeHash) + return !bytes.Equal(acct.CodeHash, emptyCodeHash) } // Storage represents in-memory cache/buffer of contract storage. @@ -71,11 +73,9 @@ func newObject(db *StateDB, address common.Address, account Account) *stateObjec if account.Balance == nil { account.Balance = new(big.Int) } - if account.CodeHash == nil { - account.CodeHash = types.EmptyCodeHash + account.CodeHash = emptyCodeHash } - return &stateObject{ db: db, address: address, @@ -87,9 +87,7 @@ func newObject(db *StateDB, address common.Address, account Account) *stateObjec // empty returns whether the account is considered empty. func (s *stateObject) empty() bool { - return s.account.Nonce == 0 && - s.account.Balance.Sign() == 0 && - types.IsEmptyCodeHash(s.account.CodeHash) + return s.account.Nonce == 0 && s.account.Balance.Sign() == 0 && bytes.Equal(s.account.CodeHash, emptyCodeHash) } func (s *stateObject) markSuicided() { @@ -151,14 +149,11 @@ func (s *stateObject) Code() []byte { if s.code != nil { return s.code } - - if types.IsEmptyCodeHash(s.CodeHash()) { + if bytes.Equal(s.CodeHash(), emptyCodeHash) { return nil } - code := s.db.keeper.GetCode(s.db.ctx, common.BytesToHash(s.CodeHash())) s.code = code - return code } diff --git a/x/evm/statedb/statedb.go b/x/evm/statedb/statedb.go index 6e46b224c7..15955d7165 100644 --- a/x/evm/statedb/statedb.go +++ b/x/evm/statedb/statedb.go @@ -527,27 +527,18 @@ func (s *StateDB) commitWithCtx(ctx sdk.Context) error { obj := s.stateObjects[addr] if obj.suicided { if err := s.keeper.DeleteAccount(ctx, obj.Address()); err != nil { - return errorsmod.Wrapf(err, "failed to delete account %s", obj.Address()) + return errorsmod.Wrap(err, "failed to delete account") } } else { if obj.code != nil && obj.dirtyCode { - if len(obj.code) == 0 { - s.keeper.DeleteCode(ctx, obj.CodeHash()) - } else { - s.keeper.SetCode(ctx, obj.CodeHash(), obj.code) - } + s.keeper.SetCode(ctx, obj.CodeHash(), obj.code) } if err := s.keeper.SetAccount(ctx, obj.Address(), obj.account); err != nil { return errorsmod.Wrap(err, "failed to set account") } - for _, key := range obj.dirtyStorage.SortedKeys() { valueBytes := obj.dirtyStorage[key].Bytes() - if len(valueBytes) == 0 { - s.keeper.DeleteState(ctx, obj.Address(), key) - } else { - s.keeper.SetState(ctx, obj.Address(), key, valueBytes) - } + s.keeper.SetState(ctx, obj.Address(), key, valueBytes) } } } diff --git a/x/evm/types/evm.pb.go b/x/evm/types/evm.pb.go index 500bf5453d..735a12709e 100644 --- a/x/evm/types/evm.pb.go +++ b/x/evm/types/evm.pb.go @@ -219,7 +219,7 @@ func (m *AccessControl) GetCall() AccessControlType { type AccessControlType struct { // access_type defines which type of permission is required for the operation AccessType AccessType `protobuf:"varint,1,opt,name=access_type,json=accessType,proto3,enum=ethermint.evm.v1.AccessType" json:"access_type,omitempty" yaml:"access_type"` - // access_control_list defines defines different things depending on the AccessType: + // allowlist_addresses defines defines different things depending on the AccessType: // - ACCESS_TYPE_PERMISSIONLESS: list of addresses that are blocked from performing the operation // - ACCESS_TYPE_RESTRICTED: ignored // - ACCESS_TYPE_PERMISSIONED: list of addresses that are allowed to perform the operation diff --git a/x/evm/types/interfaces.go b/x/evm/types/interfaces.go index cece5eca06..d1444767cc 100644 --- a/x/evm/types/interfaces.go +++ b/x/evm/types/interfaces.go @@ -20,6 +20,7 @@ import ( type AccountKeeper interface { NewAccountWithAddress(ctx sdk.Context, addr sdk.AccAddress) authtypes.AccountI GetModuleAddress(moduleName string) sdk.AccAddress + IterateAccounts(ctx sdk.Context, cb func(account authtypes.AccountI) bool) GetAccount(ctx sdk.Context, addr sdk.AccAddress) authtypes.AccountI SetAccount(ctx sdk.Context, account authtypes.AccountI) RemoveAccount(ctx sdk.Context, account authtypes.AccountI) diff --git a/x/evm/types/key.go b/x/evm/types/key.go index e9a163f686..2b35d6b71b 100644 --- a/x/evm/types/key.go +++ b/x/evm/types/key.go @@ -28,7 +28,6 @@ const ( prefixCode = iota + 1 prefixStorage prefixParams - prefixCodeHash ) // prefix bytes for the EVM transient store @@ -41,10 +40,9 @@ const ( // KVStore key prefixes var ( - KeyPrefixCode = []byte{prefixCode} - KeyPrefixStorage = []byte{prefixStorage} - KeyPrefixParams = []byte{prefixParams} - KeyPrefixCodeHash = []byte{prefixCodeHash} + KeyPrefixCode = []byte{prefixCode} + KeyPrefixStorage = []byte{prefixStorage} + KeyPrefixParams = []byte{prefixParams} ) // Transient Store key prefixes diff --git a/x/evm/types/query.pb.go b/x/evm/types/query.pb.go index 8a6d471546..4be65d46b1 100644 --- a/x/evm/types/query.pb.go +++ b/x/evm/types/query.pb.go @@ -1448,7 +1448,7 @@ type QueryClient interface { // Address. ValidatorAccount(ctx context.Context, in *QueryValidatorAccountRequest, opts ...grpc.CallOption) (*QueryValidatorAccountResponse, error) // Balance queries the balance of a the EVM denomination for a single - // account. + // EthAccount. Balance(ctx context.Context, in *QueryBalanceRequest, opts ...grpc.CallOption) (*QueryBalanceResponse, error) // Storage queries the balance of all coins for a single account. Storage(ctx context.Context, in *QueryStorageRequest, opts ...grpc.CallOption) (*QueryStorageResponse, error) @@ -1595,7 +1595,7 @@ type QueryServer interface { // Address. ValidatorAccount(context.Context, *QueryValidatorAccountRequest) (*QueryValidatorAccountResponse, error) // Balance queries the balance of a the EVM denomination for a single - // account. + // EthAccount. Balance(context.Context, *QueryBalanceRequest) (*QueryBalanceResponse, error) // Storage queries the balance of all coins for a single account. Storage(context.Context, *QueryStorageRequest) (*QueryStorageResponse, error) diff --git a/x/evm/types/utils.go b/x/evm/types/utils.go index bd01d73edb..5d27b90192 100644 --- a/x/evm/types/utils.go +++ b/x/evm/types/utils.go @@ -4,33 +4,26 @@ package types import ( - "bytes" "fmt" "math/big" + "github.com/cosmos/gogoproto/proto" + errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/cosmos/gogoproto/proto" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/crypto" ) -var ( - // DefaultPriorityReduction is the default amount of price values required for 1 unit of priority. - // Because priority is `int64` while price is `big.Int`, it's necessary to scale down the range to keep it more pratical. - // The default value is the same as the `sdk.DefaultPowerReduction`. - DefaultPriorityReduction = sdk.DefaultPowerReduction +// DefaultPriorityReduction is the default amount of price values required for 1 unit of priority. +// Because priority is `int64` while price is `big.Int`, it's necessary to scale down the range to keep it more pratical. +// The default value is the same as the `sdk.DefaultPowerReduction`. +var DefaultPriorityReduction = sdk.DefaultPowerReduction - // EmptyCodeHash is keccak256 hash of nil to represent empty code. - EmptyCodeHash = crypto.Keccak256(nil) -) - -// IsEmptyCodeHash checks if the given byte slice represents an empty code hash. -func IsEmptyCodeHash(bz []byte) bool { - return bytes.Equal(bz, EmptyCodeHash) -} +var EmptyCodeHash = crypto.Keccak256(nil) // DecodeTxResponse decodes an protobuf-encoded byte slice into TxResponse func DecodeTxResponse(in []byte) (*MsgEthereumTxResponse, error) { diff --git a/x/feemarket/keeper/utils_test.go b/x/feemarket/keeper/utils_test.go index 514c41d3ea..0cf6c26d33 100644 --- a/x/feemarket/keeper/utils_test.go +++ b/x/feemarket/keeper/utils_test.go @@ -19,12 +19,14 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" "github.com/evmos/evmos/v19/app" "github.com/evmos/evmos/v19/crypto/ethsecp256k1" "github.com/evmos/evmos/v19/encoding" "github.com/evmos/evmos/v19/testutil" utiltx "github.com/evmos/evmos/v19/testutil/tx" + evmostypes "github.com/evmos/evmos/v19/types" evmtypes "github.com/evmos/evmos/v19/x/evm/types" "github.com/evmos/evmos/v19/x/feemarket/types" @@ -58,7 +60,11 @@ func (suite *KeeperTestSuite) SetupApp(checkTx bool, chainID string) { types.RegisterQueryServer(queryHelper, suite.app.FeeMarketKeeper) suite.queryClient = types.NewQueryClient(queryHelper) - acc := authtypes.NewBaseAccount(sdk.AccAddress(suite.address.Bytes()), nil, 0, 0) + acc := &evmostypes.EthAccount{ + BaseAccount: authtypes.NewBaseAccount(sdk.AccAddress(suite.address.Bytes()), nil, 0, 0), + CodeHash: common.BytesToHash(crypto.Keccak256(nil)).String(), + } + suite.app.AccountKeeper.SetAccount(suite.ctx, acc) valAddr := sdk.ValAddress(suite.address.Bytes()) diff --git a/x/staking/keeper/msg_server_test.go b/x/staking/keeper/msg_server_test.go index 27c739e594..747ee89688 100644 --- a/x/staking/keeper/msg_server_test.go +++ b/x/staking/keeper/msg_server_test.go @@ -37,7 +37,7 @@ func TestMsgDelegate(t *testing.T) { errMsg string }{ { - name: "can delegate from a common account", + name: "can delegate from a common EthAccount", setup: func() sdk.Coin { // Send some funds to delegator account err := testutil.FundAccountWithBaseDenom(ctx, nw.App.BankKeeper, delegatorAddr, defaultDelCoin.Amount.Int64()) @@ -156,7 +156,7 @@ func TestMsgCreateValidator(t *testing.T) { errMsg string }{ { - name: "can create a validator using a common account", + name: "can create a validator using a common EthAccount", setup: func() sdk.Coin { // Send some funds to delegator account err := testutil.FundAccountWithBaseDenom(ctx, nw.App.BankKeeper, validatorAddr, defaultDelCoin.Amount.Int64()) diff --git a/x/vesting/keeper/keeper.go b/x/vesting/keeper/keeper.go index a91f6d0e15..6f807039e2 100644 --- a/x/vesting/keeper/keeper.go +++ b/x/vesting/keeper/keeper.go @@ -21,7 +21,6 @@ type Keeper struct { accountKeeper types.AccountKeeper bankKeeper types.BankKeeper - evmKeeper types.EVMKeeper stakingKeeper types.StakingKeeper distributionKeeper types.DistributionKeeper govKeeper types.GovKeeper @@ -38,7 +37,6 @@ func NewKeeper( ak types.AccountKeeper, bk types.BankKeeper, dk types.DistributionKeeper, - ek types.EVMKeeper, sk types.StakingKeeper, gk types.GovKeeper, ) Keeper { @@ -54,7 +52,6 @@ func NewKeeper( distributionKeeper: dk, accountKeeper: ak, bankKeeper: bk, - evmKeeper: ek, stakingKeeper: sk, govKeeper: gk, } diff --git a/x/vesting/keeper/keeper_test.go b/x/vesting/keeper/keeper_test.go index c1c4a8d137..e3dc3eab09 100644 --- a/x/vesting/keeper/keeper_test.go +++ b/x/vesting/keeper/keeper_test.go @@ -41,7 +41,6 @@ func (suite *KeeperTestSuite) TestNewKeeper() { suite.app.AccountKeeper, suite.app.BankKeeper, suite.app.DistrKeeper, - suite.app.EvmKeeper, suite.app.StakingKeeper, suite.app.GovKeeper, ) @@ -55,7 +54,6 @@ func (suite *KeeperTestSuite) TestNewKeeper() { suite.app.AccountKeeper, suite.app.BankKeeper, suite.app.DistrKeeper, - suite.app.EvmKeeper, suite.app.StakingKeeper, suite.app.GovKeeper, ) diff --git a/x/vesting/keeper/msg_server.go b/x/vesting/keeper/msg_server.go index 13969e9632..6b30eee866 100644 --- a/x/vesting/keeper/msg_server.go +++ b/x/vesting/keeper/msg_server.go @@ -7,14 +7,17 @@ import ( "context" "time" - errorsmod "cosmossdk.io/errors" + "github.com/ethereum/go-ethereum/crypto" + "github.com/cosmos/cosmos-sdk/telemetry" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + + errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" sdkvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types" - "github.com/evmos/evmos/v19/utils" + evmostypes "github.com/evmos/evmos/v19/types" "github.com/evmos/evmos/v19/x/vesting/types" ) @@ -32,7 +35,6 @@ func (k Keeper) CreateClawbackVestingAccount( ctx := sdk.UnwrapSDKContext(goCtx) ak := k.accountKeeper bk := k.bankKeeper - ek := k.evmKeeper // Error checked during msg validation funderAddress := sdk.MustAccAddressFromBech32(msg.FunderAddress) @@ -60,19 +62,22 @@ func (k Keeper) CreateClawbackVestingAccount( ) } - // Check for contract account (code hash is not empty) - if ek.IsContract(ctx, utils.CosmosToEthAddr(acc.GetAddress())) { + // Initialize the vesting account + ethAcc, ok := acc.(*evmostypes.EthAccount) + if !ok { return nil, errorsmod.Wrapf(errortypes.ErrInvalidRequest, - "account %s is a contract account and cannot be converted in a clawback vesting account", msg.VestingAddress, + "account %s is not an Ethereum account", msg.VestingAddress, ) } - baseAcc, ok := acc.(*authtypes.BaseAccount) - if !ok { + // Check for contract account (code hash is not empty) + if ethAcc.CodeHash != crypto.Keccak256Hash([]byte{}).String() { return nil, errorsmod.Wrapf(errortypes.ErrInvalidRequest, - "account %s could not be converted to a base account", msg.VestingAddress, + "account %s is a contract account and cannot be converted in a clawback vesting account", msg.VestingAddress, ) } + + baseAcc := ethAcc.GetBaseAccount() baseVestingAcc := &sdkvesting.BaseVestingAccount{BaseAccount: baseAcc} vestingAcc := &types.ClawbackVestingAccount{ BaseVestingAccount: baseVestingAcc, @@ -375,8 +380,9 @@ func (k Keeper) ConvertVestingAccount( // if no entry is found for the address, this will no-op k.DeleteGovClawbackDisabled(ctx, address) - baseAcc := vestingAcc.BaseAccount - k.accountKeeper.SetAccount(ctx, baseAcc) + ethAccount := evmostypes.ProtoAccount().(*evmostypes.EthAccount) + ethAccount.BaseAccount = vestingAcc.BaseAccount + k.accountKeeper.SetAccount(ctx, ethAccount) return &types.MsgConvertVestingAccountResponse{}, nil } @@ -445,15 +451,16 @@ func (k Keeper) transferClawback( // Compute clawback amount, unlock unvested tokens and remove future vesting events updatedAcc, toClawBack := vestingAccount.ComputeClawback(ctx.BlockTime().Unix()) - // convert the account back to a normal account + // convert the account back to a normal EthAccount // // NOTE: this is necessary to allow the bank keeper to send the locked coins away to the // destination address. If the account is not converted, the coins will still be seen as locked, // and can therefore not be transferred. - baseAcc := updatedAcc.BaseAccount + ethAccount := evmostypes.ProtoAccount().(*evmostypes.EthAccount) + ethAccount.BaseAccount = updatedAcc.BaseAccount // set the account with the updated values of the vesting schedule - k.accountKeeper.SetAccount(ctx, baseAcc) + k.accountKeeper.SetAccount(ctx, ethAccount) address := updatedAcc.GetAddress() diff --git a/x/vesting/keeper/msg_server_test.go b/x/vesting/keeper/msg_server_test.go index 80ec076405..d8f9f8ef56 100644 --- a/x/vesting/keeper/msg_server_test.go +++ b/x/vesting/keeper/msg_server_test.go @@ -5,13 +5,13 @@ import ( "time" sdk "github.com/cosmos/cosmos-sdk/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" vestingexported "github.com/cosmos/cosmos-sdk/x/auth/vesting/exported" sdkvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" - "github.com/evmos/evmos/v19/contracts" "github.com/evmos/evmos/v19/testutil" utiltx "github.com/evmos/evmos/v19/testutil/tx" - "github.com/evmos/evmos/v19/utils" + evmostypes "github.com/evmos/evmos/v19/types" "github.com/evmos/evmos/v19/x/vesting/types" ) @@ -210,42 +210,34 @@ func (suite *KeeperTestSuite) TestMsgCreateClawbackVestingAccount() { testcases := []struct { name string - malleate func(funder sdk.AccAddress) sdk.AccAddress + malleate func(funder sdk.AccAddress, vestingAddr sdk.AccAddress) funder sdk.AccAddress + vestingAddr sdk.AccAddress expPass bool errContains string }{ { - name: "fail - account does not exist", - malleate: func(sdk.AccAddress) sdk.AccAddress { - return vestingAddr - }, + name: "fail - account does not exist", + malleate: func(sdk.AccAddress, sdk.AccAddress) {}, funder: funderAddr, + vestingAddr: vestingAddr, expPass: false, errContains: fmt.Sprintf("account %s does not exist", vestingAddr), }, { - name: "fail - account is a smart contract", - malleate: func(_ sdk.AccAddress) sdk.AccAddress { - contractAddr, err := testutil.DeployContract( - suite.ctx, - suite.app, - suite.priv, - suite.queryClientEvm, - contracts.ERC20MinterBurnerDecimalsContract, - "TestToken", "TTK", uint8(18), - ) - suite.Require().NoError(err, "failed to deploy example contract") - - return utils.EthToCosmosAddr(contractAddr) + name: "fail - account is not an eth account", + malleate: func(_ sdk.AccAddress, vestingAddr sdk.AccAddress) { + acc := authtypes.NewBaseAccountWithAddress(vestingAddr) + s.app.AccountKeeper.SetAccount(s.ctx, acc) }, funder: funderAddr, + vestingAddr: vestingAddr, expPass: false, - errContains: "is a contract account and cannot be converted in a clawback vesting account", + errContains: fmt.Sprintf("account %s is not an Ethereum account", vestingAddr), }, { name: "fail - vesting account already exists", - malleate: func(funder sdk.AccAddress) sdk.AccAddress { + malleate: func(funder sdk.AccAddress, vestingAddr sdk.AccAddress) { // fund the funder and vesting accounts from Bankkeeper err := testutil.FundAccount(s.ctx, s.app.BankKeeper, funder, balances) suite.Require().NoError(err) @@ -255,39 +247,36 @@ func (suite *KeeperTestSuite) TestMsgCreateClawbackVestingAccount() { msg := types.NewMsgCreateClawbackVestingAccount(funderAddr, vestingAddr, false) _, err = suite.app.VestingKeeper.CreateClawbackVestingAccount(s.ctx, msg) suite.Require().NoError(err, "failed to create vesting account") - - return vestingAddr }, funder: funderAddr, + vestingAddr: vestingAddr, expPass: false, errContains: "is already a clawback vesting account", }, { name: "fail - vesting address is in the blocked addresses list", - malleate: func(funder sdk.AccAddress) sdk.AccAddress { + malleate: func(funder sdk.AccAddress, _ sdk.AccAddress) { // fund the funder and vesting accounts from Bankkeeper err := testutil.FundAccount(s.ctx, s.app.BankKeeper, funder, balances) suite.Require().NoError(err) - - return authtypes.NewModuleAddress("distribution") }, funder: funderAddr, + vestingAddr: authtypes.NewModuleAddress("distribution"), expPass: false, errContains: "is a blocked address and cannot be converted in a clawback vesting account", }, { name: "success", - malleate: func(funder sdk.AccAddress) sdk.AccAddress { + malleate: func(funder sdk.AccAddress, vestingAddr sdk.AccAddress) { // fund the funder and vesting accounts from Bankkeeper err := testutil.FundAccount(s.ctx, s.app.BankKeeper, funder, balances) suite.Require().NoError(err) err = testutil.FundAccount(s.ctx, s.app.BankKeeper, vestingAddr, balances) suite.Require().NoError(err) - - return vestingAddr }, - funder: funderAddr, - expPass: true, + funder: funderAddr, + vestingAddr: vestingAddr, + expPass: true, }, } @@ -297,16 +286,16 @@ func (suite *KeeperTestSuite) TestMsgCreateClawbackVestingAccount() { suite.Require().NoError(suite.SetupTest()) // Reset ctx := sdk.WrapSDKContext(suite.ctx) - vestingAddr := tc.malleate(tc.funder) + tc.malleate(tc.funder, tc.vestingAddr) - msg := types.NewMsgCreateClawbackVestingAccount(tc.funder, vestingAddr, false) + msg := types.NewMsgCreateClawbackVestingAccount(tc.funder, tc.vestingAddr, false) res, err := suite.app.VestingKeeper.CreateClawbackVestingAccount(ctx, msg) if tc.expPass { suite.Require().NoError(err) suite.Require().Equal(&types.MsgCreateClawbackVestingAccountResponse{}, res) - accI := suite.app.AccountKeeper.GetAccount(suite.ctx, vestingAddr) + accI := suite.app.AccountKeeper.GetAccount(suite.ctx, tc.vestingAddr) suite.Require().NotNil(accI, "expected account to be created") suite.Require().IsType(&types.ClawbackVestingAccount{}, accI, "expected account to be a clawback vesting account") } else { @@ -743,7 +732,7 @@ func (suite *KeeperTestSuite) TestConvertVestingAccount() { _, ok := account.(vestingexported.VestingAccount) suite.Require().False(ok) - _, ok = account.(*authtypes.BaseAccount) + _, ok = account.(evmostypes.EthAccountI) suite.Require().True(ok) } else { diff --git a/x/vesting/keeper/setup_test.go b/x/vesting/keeper/setup_test.go index 76c622d052..68800ee848 100644 --- a/x/vesting/keeper/setup_test.go +++ b/x/vesting/keeper/setup_test.go @@ -16,6 +16,7 @@ import ( stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" "github.com/stretchr/testify/suite" ethtypes "github.com/ethereum/go-ethereum/core/types" @@ -24,6 +25,7 @@ import ( "github.com/evmos/evmos/v19/encoding" "github.com/evmos/evmos/v19/testutil" utiltx "github.com/evmos/evmos/v19/testutil/tx" + evmostypes "github.com/evmos/evmos/v19/types" "github.com/evmos/evmos/v19/utils" epochstypes "github.com/evmos/evmos/v19/x/epochs/types" evmtypes "github.com/evmos/evmos/v19/x/evm/types" @@ -119,7 +121,11 @@ func (suite *KeeperTestSuite) SetupTest() error { suite.app.EpochsKeeper.SetEpochInfo(suite.ctx, epoch) } - acc := authtypes.NewBaseAccount(sdk.AccAddress(suite.address.Bytes()), nil, 0, 0) + acc := &evmostypes.EthAccount{ + BaseAccount: authtypes.NewBaseAccount(sdk.AccAddress(suite.address.Bytes()), nil, 0, 0), + CodeHash: common.BytesToHash(crypto.Keccak256(nil)).String(), + } + suite.app.AccountKeeper.SetAccount(suite.ctx, acc) // fund signer acc to pay for tx fees diff --git a/x/vesting/types/interfaces.go b/x/vesting/types/interfaces.go index 5053cc7d6f..5439f37d68 100644 --- a/x/vesting/types/interfaces.go +++ b/x/vesting/types/interfaces.go @@ -8,7 +8,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" v1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" - "github.com/ethereum/go-ethereum/common" ) // AccountKeeper defines the expected interface contract the vesting module @@ -28,12 +27,6 @@ type BankKeeper interface { BlockedAddr(addr sdk.AccAddress) bool } -// EVMKeeper defines the expected interface contract the vesting requires -// for checking if a given account is a smart contract. -type EVMKeeper interface { - IsContract(ctx sdk.Context, addr common.Address) bool -} - // StakingKeeper defines the expected interface contract the vesting module // requires for finding and changing the delegated tokens, used in clawback. type StakingKeeper interface { diff --git a/x/vesting/utils_test.go b/x/vesting/utils_test.go index 3fe671af22..7ccdcf577c 100644 --- a/x/vesting/utils_test.go +++ b/x/vesting/utils_test.go @@ -15,12 +15,14 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + "github.com/ethereum/go-ethereum/common" evmosapp "github.com/evmos/evmos/v19/app" cmn "github.com/evmos/evmos/v19/precompiles/common" evmosutil "github.com/evmos/evmos/v19/testutil" testutiltx "github.com/evmos/evmos/v19/testutil/tx" evmostypes "github.com/evmos/evmos/v19/types" "github.com/evmos/evmos/v19/utils" + "github.com/evmos/evmos/v19/x/evm/types" ) // SetupWithGenesisValSet initializes a new EvmosApp with a validator set and genesis accounts @@ -147,12 +149,17 @@ func (s *VestingTestSuite) DoSetupTest() { baseAcc := authtypes.NewBaseAccount(priv.PubKey().Address().Bytes(), priv.PubKey(), 0, 0) + acc := &evmostypes.EthAccount{ + BaseAccount: baseAcc, + CodeHash: common.BytesToHash(types.EmptyCodeHash).Hex(), + } + amount := sdk.TokensFromConsensusPower(5, evmostypes.PowerReduction) balance := banktypes.Balance{ - Address: baseAcc.GetAddress().String(), + Address: acc.GetAddress().String(), Coins: sdk.NewCoins(sdk.NewCoin(utils.BaseDenom, amount)), } - s.SetupWithGenesisValSet(valSet, []authtypes.GenesisAccount{baseAcc}, balance) + s.SetupWithGenesisValSet(valSet, []authtypes.GenesisAccount{acc}, balance) } From 8aa597866cc8498579618238cdb3753f81f08bdb Mon Sep 17 00:00:00 2001 From: pudongair <744355276@qq.com> Date: Fri, 19 Jul 2024 22:16:00 +0900 Subject: [PATCH 329/345] chore: fix some comments (#2681) Signed-off-by: pudongair <744355276@qq.com> --- ibc/testing/coordinator.go | 2 +- precompiles/bank/utils_test.go | 2 +- precompiles/erc20/utils_test.go | 2 +- testutil/integration/ibc/chain/chain.go | 2 +- x/evm/core/vm/contracts.go | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ibc/testing/coordinator.go b/ibc/testing/coordinator.go index f559870afd..8ec85b4e8d 100644 --- a/ibc/testing/coordinator.go +++ b/ibc/testing/coordinator.go @@ -60,7 +60,7 @@ func SetupPath(coord *ibctesting.Coordinator, path *Path) { CreateChannels(coord, path) } -// SetupClientConnections is a helper function to create clients and the appropriate +// SetupConnections is a helper function to create clients and the appropriate // connections on both the source and counterparty chain. It assumes the caller does not // anticipate any errors. func SetupConnections(coord *ibctesting.Coordinator, path *Path) { diff --git a/precompiles/bank/utils_test.go b/precompiles/bank/utils_test.go index d86c12d0ba..aa260e4bcc 100644 --- a/precompiles/bank/utils_test.go +++ b/precompiles/bank/utils_test.go @@ -74,7 +74,7 @@ type ContractData struct { precompileABI abi.ABI } -// getCallArgs is a helper function to return the correct call arguments for a given call type. +// getTxAndCallArgs is a helper function to return the correct call arguments for a given call type. // In case of a direct call to the precompile, the precompile's ABI is used. Otherwise a caller contract is used. func getTxAndCallArgs( callType int, diff --git a/precompiles/erc20/utils_test.go b/precompiles/erc20/utils_test.go index d662f1eb92..d78872b2fc 100644 --- a/precompiles/erc20/utils_test.go +++ b/precompiles/erc20/utils_test.go @@ -277,7 +277,7 @@ var ( erc20CallTypes = []CallType{erc20Call, erc20CallerCall, erc20V5Call, erc20V5CallerCall} ) -// getCallArgs is a helper function to return the correct call arguments for a given call type. +// getTxAndCallArgs is a helper function to return the correct call arguments for a given call type. // // In case of a direct call to the precompile, the precompile's ABI is used. Otherwise, the // ERC20CallerContract's ABI is used and the given contract address. diff --git a/testutil/integration/ibc/chain/chain.go b/testutil/integration/ibc/chain/chain.go index 3e917725c3..7f75087745 100644 --- a/testutil/integration/ibc/chain/chain.go +++ b/testutil/integration/ibc/chain/chain.go @@ -63,7 +63,7 @@ type Chain interface { // ConstructUpdateTMClientHeader will construct a valid 07-tendermint Header to update the // light client on the source chain. ConstructUpdateTMClientHeader(counterparty *ibctesting.TestChain, clientID string) (*ibctm.Header, error) - // ConstructUpdateTMClientHeader will construct a valid 07-tendermint Header to update the + // ConstructUpdateTMClientHeaderWithTrustedHeight will construct a valid 07-tendermint Header to update the ConstructUpdateTMClientHeaderWithTrustedHeight(counterparty *ibctesting.TestChain, clientID string, trustedHeight clienttypes.Height) (*ibctm.Header, error) // light client on the source chain. // ExpireClient fast forwards the chain's block time by the provided amount of time which will // expire any clients with a trusting period less than or equal to this amount of time. diff --git a/x/evm/core/vm/contracts.go b/x/evm/core/vm/contracts.go index 64b335db74..c9dc17d7ca 100644 --- a/x/evm/core/vm/contracts.go +++ b/x/evm/core/vm/contracts.go @@ -39,7 +39,7 @@ import ( // contract. type PrecompiledContract interface { ContractRef - // RequiredPrice calculates the contract gas used + // RequiredGas calculates the contract gas used RequiredGas(input []byte) uint64 // Run runs the precompiled contract Run(evm *EVM, contract *Contract, readonly bool) ([]byte, error) From b1ed08b02b9b89e3d96f51efeae040dc4b20a0a9 Mon Sep 17 00:00:00 2001 From: stepit <48993133+0xstepit@users.noreply.github.com> Date: Fri, 19 Jul 2024 15:29:36 +0200 Subject: [PATCH 330/345] chore: migration to enable custom eips (#2667) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add eips migration + tests * run make format * Apply suggestions from code review Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Signed-off-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> * Update app/upgrades/v19/upgrades.go Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> Signed-off-by: stepit <48993133+0xstepit@users.noreply.github.com> * Update app/upgrades/v19/upgrades.go Signed-off-by: stepit <48993133+0xstepit@users.noreply.github.com> * Update app/upgrades/v19/upgrades.go Signed-off-by: stepit <48993133+0xstepit@users.noreply.github.com> * review comments * better logging * Update app/upgrades/v19/upgrades_test.go Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Signed-off-by: stepit <48993133+0xstepit@users.noreply.github.com> * apply suggestions * fix * update activators type to use string keys * move proto to v8 and update types name * regenerate new proto * update repo to use new extra eip type * write evm param migration + fix old migrations * remove old migrations * add migration v8 tests * update evm migration * add more validations * fix tests * fix tests * fix * update upgrade order * fix upgrade * Update app/eips/eips_test.go Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Signed-off-by: stepit <48993133+0xstepit@users.noreply.github.com> * Update app/eips/eips_test.go Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Signed-off-by: stepit <48993133+0xstepit@users.noreply.github.com> * Update app/eips/README.md Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Signed-off-by: stepit <48993133+0xstepit@users.noreply.github.com> * Update app/eips/README.md Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Signed-off-by: stepit <48993133+0xstepit@users.noreply.github.com> * Update app/eips/README.md Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Signed-off-by: stepit <48993133+0xstepit@users.noreply.github.com> * update eips tests --------- Signed-off-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> Signed-off-by: stepit <48993133+0xstepit@users.noreply.github.com> Co-authored-by: 0xstepit <0xstepit@users.noreply.github.com> Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com> Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: Guillermo Paoletti --- CHANGELOG.md | 1 + app/config.go | 8 +- app/eips/README.md | 10 +- app/eips/eips_test.go | 90 +- app/upgrades/v19/upgrades.go | 36 +- app/upgrades/v19/upgrades_test.go | 43 + client/docs/swagger-ui/swagger.json | 9 +- proto/ethermint/evm/v1/evm.proto | 2 +- x/evm/config/configurator.go | 16 +- x/evm/config/configurator_test.go | 58 +- x/evm/core/vm/custom_eip.go | 17 +- x/evm/core/vm/custom_eip_test.go | 103 +- x/evm/core/vm/eips.go | 53 +- x/evm/core/vm/gas_table_test.go | 2 +- x/evm/core/vm/interpreter.go | 2 +- x/evm/core/vm/stack.go | 4 +- x/evm/keeper/grpc_query_test.go | 6 +- x/evm/keeper/migrations.go | 22 +- x/evm/keeper/migrations_test.go | 41 - x/evm/keeper/params.go | 2 +- x/evm/migrations/v4/migrate.go | 44 - x/evm/migrations/v4/migrate_test.go | 87 - x/evm/migrations/v4/types/evm.pb.go | 4295 --------------------------- x/evm/migrations/v5/migrate.go | 64 - x/evm/migrations/v5/migrate_test.go | 81 - x/evm/migrations/v5/types/evm.pb.go | 481 --- x/evm/migrations/v6/migrate.go | 73 - x/evm/migrations/v6/migrate_test.go | 60 - x/evm/migrations/v6/types/evm.pb.go | 4118 ------------------------- x/evm/migrations/v7/migrate.go | 19 +- x/evm/migrations/v7/migrate_test.go | 15 +- x/evm/migrations/v7/types/evm.pb.go | 976 ++++-- x/evm/migrations/v7/types/params.go | 6 + x/evm/module.go | 11 - x/evm/types/evm.pb.go | 451 +-- x/evm/types/params.go | 29 +- x/evm/types/params_test.go | 15 +- x/evm/types/query.pb.gw.go | 96 +- 38 files changed, 1432 insertions(+), 10014 deletions(-) delete mode 100644 x/evm/keeper/migrations_test.go delete mode 100644 x/evm/migrations/v4/migrate.go delete mode 100644 x/evm/migrations/v4/migrate_test.go delete mode 100644 x/evm/migrations/v4/types/evm.pb.go delete mode 100644 x/evm/migrations/v5/migrate.go delete mode 100644 x/evm/migrations/v5/migrate_test.go delete mode 100644 x/evm/migrations/v5/types/evm.pb.go delete mode 100644 x/evm/migrations/v6/migrate.go delete mode 100644 x/evm/migrations/v6/migrate_test.go delete mode 100644 x/evm/migrations/v6/types/evm.pb.go create mode 100644 x/evm/migrations/v7/types/params.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 9fb2485ed9..ab360ec83e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -64,6 +64,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (precompiles) [GHSA-68fc-7mhg-6f6c](https://github.com/evmos/evmos/commit/bb2d504eec9078d6eff6981fc0cb214e8a3ca496) Refactor precompiles to use journal entries. - (vesting-precompile) [GHSA-q6hg-6m9x-5g9c](https://github.com/evmos/evmos/commit/0a620e176617a835ac697eea494afea09185dfaf) Update vesting precompile authorization checks. - (erc20) [#2607](https://github.com/evmos/evmos/pull/2607) Implement Single Token Representation v2. +- (evm) [#2667](https://github.com/evmos/evmos/pull/2667) Modify activator maps and default extra EIP to use []string. ### Bug Fixes diff --git a/app/config.go b/app/config.go index 8ebc4caaa9..9cbdeef449 100644 --- a/app/config.go +++ b/app/config.go @@ -22,8 +22,8 @@ func init() { // EvmosActivators defines a map of opcode modifiers associated // with a key defining the corresponding EIP. -var evmosActivators = map[int]func(*vm.JumpTable){ - 0o000: eips.Enable0000, - 0o001: eips.Enable0001, - 0o002: eips.Enable0002, +var evmosActivators = map[string]func(*vm.JumpTable){ + "evmos_0": eips.Enable0000, + "evmos_1": eips.Enable0001, + "evmos_2": eips.Enable0002, } diff --git a/app/eips/README.md b/app/eips/README.md index e931536817..d315712ce4 100644 --- a/app/eips/README.md +++ b/app/eips/README.md @@ -102,9 +102,9 @@ In **evmOS**, custom activators should be defined in a structure with the same d ```go // Activate custom EIPs: 0000, 0001, 0002, etc evmosActivators = map[int]func(*vm.JumpTable){ - 0o000: eips.Enable0000, - 0o001: eips.Enable0001, - 0o002: eips.Enable0002, + "evmos_0": eips.Enable0000, + "evmos_1": eips.Enable0001, + "evmos_2": eips.Enable0002, } ``` @@ -123,11 +123,11 @@ should be defined. An example is reported below: ```go evmosEnabledEIPs = []int64{ - 0o000, + "evmos_0", } ``` -In this way, even though the custom activators defined $3$ new EIPs, we are going to activate only the number `0o000` +In this way, even though the custom activators defined $3$ new EIPs, we are going to activate only the number `evmos_0` ### EVM Configurator diff --git a/app/eips/eips_test.go b/app/eips/eips_test.go index 990a60d008..8f895327cc 100644 --- a/app/eips/eips_test.go +++ b/app/eips/eips_test.go @@ -29,17 +29,17 @@ import ( // Below tests are divided in 3 steps: // 1. Deploy and interact with contracts to compute the gas used BEFORE enabling -// the EIP. -// 2. Activate the EIP under test. +// the IP. +// 2. Activate the IP under test. // 3. Deploy and interact with contracts to compute the gas used AFTER enabling -// the EIP. +// the IP. -func TestEIPs(t *testing.T) { +func TestIPs(t *testing.T) { RegisterFailHandler(Fail) - RunSpecs(t, "EIPs Suite") + RunSpecs(t, "EvmosIPs Suite") } -var _ = Describe("EIP0000 - ", Ordered, func() { +var _ = Describe("Improvement proposal evmos_0 - ", Ordered, func() { var ( in network.Network tf factory.TxFactory @@ -51,12 +51,12 @@ var _ = Describe("EIP0000 - ", Ordered, func() { senderPriv2 types.PrivKey senderAddr2 common.Address - // Gas used before enabling the EIP. + // Gas used before enabling the IP. gasUsedPre int64 ) - // Multiplier used to modify the opcodes associated with EIP 0000. - eipMultiplier := uint64(5) + // Multiplier used to modify the opcodes associated with evmos_0 IP. + ipMultiplier := uint64(5) // The factory counter is used because it will create a new instance of // the counter contract, allowing to test the CREATE opcode. @@ -76,23 +76,23 @@ var _ = Describe("EIP0000 - ", Ordered, func() { gh = grpc.NewIntegrationHandler(in) tf = factory.New(in, gh) - // Account used to deploy the contract before enabling the EIP. + // Account used to deploy the contract before enabling the IP. senderPriv = k.GetPrivKey(0) senderAddr = k.GetAddr(0) - // Account used to deploy the contract after enabling the EIP. A second + // Account used to deploy the contract after enabling the IP. A second // account is used to avoid possible additional gas costs due to the change // in the Nonce. senderPriv2 = k.GetPrivKey(0) senderAddr2 = k.GetAddr(0) - // Set extra EIPs to empty to allow testing a single modifier. + // Set extra IPs to empty to allow testing a single modifier. defaultParams := evmtypes.DefaultParams() - defaultParams.ExtraEIPs = []int64{} + defaultParams.ExtraEIPs = []string{} err = in.UpdateEvmParams(defaultParams) Expect(err).To(BeNil(), "failed during update of evm params") }) - It("should deploy the contract before enabling the EIP", func() { + It("should deploy the contract before enabling the IP", func() { deploymentTxArgs, err := tf.GenerateDeployContractArgs(senderAddr, evmtypes.EvmTxArgs{}, deploymentData) Expect(err).To(BeNil(), "failed to create deployment tx args") @@ -101,22 +101,22 @@ var _ = Describe("EIP0000 - ", Ordered, func() { gasUsedPre = res.GasUsed }) - It("should enable the new EIP", func() { - eips.Multiplier = eipMultiplier - newEIP := 0o000 + It("should enable the new IP", func() { + eips.Multiplier = ipMultiplier + newIP := "evmos_0" qRes, err := gh.GetEvmParams() Expect(err).To(BeNil(), "failed during query to evm params") - qRes.Params.ExtraEIPs = append(qRes.Params.ExtraEIPs, int64(newEIP)) + qRes.Params.ExtraEIPs = append(qRes.Params.ExtraEIPs, newIP) err = in.UpdateEvmParams(qRes.Params) Expect(err).To(BeNil(), "failed during update of evm params") qRes, err = gh.GetEvmParams() Expect(err).To(BeNil(), "failed during query to evm params") - Expect(qRes.Params.ExtraEIPs).To(ContainElement(int64(newEIP)), "expected to have eip 0000 in evm params") + Expect(qRes.Params.ExtraEIPs).To(ContainElement(newIP), "expected to have IP evmos_0 in evm params") }) - It("should change CREATE opcode constant gas after enabling EIP", func() { + It("should change CREATE opcode constant gas after enabling evmos_0 IP", func() { gasCostPre := params.CreateGas deploymentTxArgs, err := tf.GenerateDeployContractArgs(senderAddr2, evmtypes.EvmTxArgs{}, deploymentData) @@ -129,13 +129,13 @@ var _ = Describe("EIP0000 - ", Ordered, func() { // The difference in gas is the new cost of the opcode, minus the cost of the // opcode before enabling the new eip. - gasUsedDiff := eipMultiplier*gasCostPre - gasCostPre + gasUsedDiff := ipMultiplier*gasCostPre - gasCostPre expectedGas := gasUsedPre + int64(gasUsedDiff) Expect(gasUsedPost).To(Equal(expectedGas)) }) }) -var _ = Describe("EIP0001 - ", Ordered, func() { +var _ = Describe("Improvement proposal evmos_1 - ", Ordered, func() { var ( in network.Network tf factory.TxFactory @@ -144,14 +144,14 @@ var _ = Describe("EIP0001 - ", Ordered, func() { senderPriv types.PrivKey - // Gas used before enabling the EIP. + // Gas used before enabling the IP. gasUsedPre int64 // The address of the factory counter. counterFactoryAddr common.Address ) - // Multiplier used to modify the opcodes associated with EIP 0001. + // Multiplier used to modify the opcodes associated with evmos_1. eipMultiplier := uint64(5) initialCounterValue := 1 @@ -170,14 +170,14 @@ var _ = Describe("EIP0001 - ", Ordered, func() { senderPriv = k.GetPrivKey(0) - // Set extra EIPs to empty to allow testing a single modifier. + // Set extra IPs to empty to allow testing a single modifier. defaultParams := evmtypes.DefaultParams() - defaultParams.ExtraEIPs = []int64{} + defaultParams.ExtraEIPs = []string{} err = in.UpdateEvmParams(defaultParams) Expect(err).To(BeNil(), "failed during update of evm params") }) - It("should deploy the contract before enabling the EIP", func() { + It("should deploy the contract before enabling the IP", func() { counterFactoryAddr, err = tf.DeployContract( senderPriv, evmtypes.EvmTxArgs{}, @@ -225,22 +225,22 @@ var _ = Describe("EIP0001 - ", Ordered, func() { Expect(ok).To(BeTrue(), "failed to convert counter to big.Int") Expect(counter.String()).To(Equal(fmt.Sprintf("%d", initialCounterValue+1)), "counter is not correct") }) - It("should enable the new EIP", func() { + It("should enable the new IP", func() { eips.Multiplier = eipMultiplier - newEIP := 0o001 + newIP := "evmos_1" qRes, err := gh.GetEvmParams() Expect(err).To(BeNil(), "failed during query to evm params") - qRes.Params.ExtraEIPs = append(qRes.Params.ExtraEIPs, int64(newEIP)) + qRes.Params.ExtraEIPs = append(qRes.Params.ExtraEIPs, newIP) err = in.UpdateEvmParams(qRes.Params) Expect(err).To(BeNil(), "failed during update of evm params") qRes, err = gh.GetEvmParams() Expect(err).To(BeNil(), "failed during query to evm params") - Expect(qRes.Params.ExtraEIPs).To(ContainElement(int64(newEIP)), "expected to have eip 0001 in evm params") + Expect(qRes.Params.ExtraEIPs).To(ContainElement(newIP), "expected to have ip evmos_1 in evm params") }) - It("should change CALL opcode constant gas after enabling EIP", func() { - // Constant gas cost used before enabling the new EIP. + It("should change CALL opcode constant gas after enabling IP", func() { + // Constant gas cost used before enabling the new IP. gasCostPre := params.WarmStorageReadCostEIP2929 res, err := tf.ExecuteContractCall( @@ -286,7 +286,7 @@ var _ = Describe("EIP0001 - ", Ordered, func() { }) }) -var _ = Describe("EIP0002 - ", Ordered, func() { +var _ = Describe("Improvement proposal evmos_2 - ", Ordered, func() { var ( in network.Network tf factory.TxFactory @@ -299,7 +299,7 @@ var _ = Describe("EIP0002 - ", Ordered, func() { senderAddr2 common.Address gasUsedPre int64 ) - // Constant gas used to modify the opcodes associated with EIP 0002. + // Constant gas used to modify the opcodes associated with evmos_2. constantGas := uint64(500) counterContract, err := testdata.LoadCounterContract() @@ -317,23 +317,23 @@ var _ = Describe("EIP0002 - ", Ordered, func() { gh = grpc.NewIntegrationHandler(in) tf = factory.New(in, gh) - // Account used to deploy the contract before enabling the EIP. + // Account used to deploy the contract before enabling the IP. senderPriv = k.GetPrivKey(0) senderAddr = k.GetAddr(0) - // Account used to deploy the contract after enabling the EIP. A second + // Account used to deploy the contract after enabling the IP. A second // account is used to avoid possible additional gas costs due to the change // in the Nonce. senderPriv2 = k.GetPrivKey(0) senderAddr2 = k.GetAddr(0) - // Set extra EIPs to empty to allow testing a single modifier. + // Set extra IPs to empty to allow testing a single modifier. defaultParams := evmtypes.DefaultParams() - defaultParams.ExtraEIPs = []int64{} + defaultParams.ExtraEIPs = []string{} err = in.UpdateEvmParams(defaultParams) Expect(err).To(BeNil(), "failed during update of evm params") }) - It("should deploy the contract before enabling the EIP", func() { + It("should deploy the contract before enabling the IP", func() { deploymentTxArgs, err := tf.GenerateDeployContractArgs(senderAddr, evmtypes.EvmTxArgs{}, deploymentData) Expect(err).To(BeNil(), "failed to create deployment tx args") @@ -343,22 +343,22 @@ var _ = Describe("EIP0002 - ", Ordered, func() { gasUsedPre = res.GasUsed }) - It("should enable the new EIP", func() { + It("should enable the new IP", func() { eips.SstoreConstantGas = constantGas - newEIP := 0o002 + newIP := "evmos_2" qRes, err := gh.GetEvmParams() Expect(err).To(BeNil(), "failed during query to evm params") - qRes.Params.ExtraEIPs = append(qRes.Params.ExtraEIPs, int64(newEIP)) + qRes.Params.ExtraEIPs = append(qRes.Params.ExtraEIPs, newIP) err = in.UpdateEvmParams(qRes.Params) Expect(err).To(BeNil(), "failed during update of evm params") qRes, err = gh.GetEvmParams() Expect(err).To(BeNil(), "failed during query to evm params") - Expect(qRes.Params.ExtraEIPs).To(ContainElement(int64(newEIP)), "expected to have eip 0002 in evm params") + Expect(qRes.Params.ExtraEIPs).To(ContainElement(newIP), "expected to have ip evmos_2 in evm params") }) - It("should change SSTORE opcode constant gas after enabling EIP", func() { + It("should change SSTORE opcode constant gas after enabling IP", func() { deploymentTxArgs, err := tf.GenerateDeployContractArgs(senderAddr2, evmtypes.EvmTxArgs{}, deploymentData) Expect(err).To(BeNil(), "failed to create deployment tx args") diff --git a/app/upgrades/v19/upgrades.go b/app/upgrades/v19/upgrades.go index 4f7f859787..60267929f0 100644 --- a/app/upgrades/v19/upgrades.go +++ b/app/upgrades/v19/upgrades.go @@ -30,6 +30,8 @@ const ( OsmosisOutpostAddress = "0x0000000000000000000000000000000000000901" ) +var newExtraEIPs = []string{"evmos_0", "evmos_1", "evmos_2"} + // CreateUpgradeHandler creates an SDK upgrade handler for v19 func CreateUpgradeHandler( mm *module.Manager, @@ -46,11 +48,6 @@ func CreateUpgradeHandler( logger.Debug("deleting revenue module from version map...") delete(vm, "revenue") - ctxCache, writeFn := ctx.CacheContext() - if err := RemoveOutpostsFromEvmParams(ctxCache, ek); err == nil { - writeFn() - } - MigrateEthAccountsToBaseAccounts(ctx, ak, ek) // run module migrations first. @@ -60,6 +57,13 @@ func CreateUpgradeHandler( return migrationRes, err } + ctxCache, writeFn := ctx.CacheContext() + if err := RemoveOutpostsFromEvmParams(ctxCache, ek); err == nil { + writeFn() + } else { + logger.Error("error removing outposts", "error", err) + } + bondDenom := sk.BondDenom(ctx) var wevmosContract common.Address @@ -77,6 +81,12 @@ func CreateUpgradeHandler( writeFn() } + ctxCache, writeFn = ctx.CacheContext() + if err := EnableCustomEIPs(ctxCache, logger, ek); err == nil { + writeFn() + } else { + logger.Error("error setting new extra EIPs", "error", err) + } return migrationRes, err } } @@ -204,3 +214,19 @@ func MigrateEthAccountsToBaseAccounts(ctx sdk.Context, ak authkeeper.AccountKeep return false }) } + +func EnableCustomEIPs(ctx sdk.Context, logger log.Logger, ek *evmkeeper.Keeper) error { + params := ek.GetParams(ctx) + extraEIPs := params.ExtraEIPs + + for _, eip := range newExtraEIPs { + if slices.Contains(extraEIPs, eip) { + logger.Debug("skipping duplicate EIP", "eip", eip) + } else { + extraEIPs = append(extraEIPs, eip) + } + } + + params.ExtraEIPs = extraEIPs + return ek.SetParams(ctx, params) +} diff --git a/app/upgrades/v19/upgrades_test.go b/app/upgrades/v19/upgrades_test.go index 604332f83e..47a211fa57 100644 --- a/app/upgrades/v19/upgrades_test.go +++ b/app/upgrades/v19/upgrades_test.go @@ -163,3 +163,46 @@ func TestMigrateEthAccountsToBaseAccounts(t *testing.T) { "expected different code", ) } + +func TestEnableCustomEIPs(t *testing.T) { + upgradeEIPs := []string{"evmos_0", "evmos_1", "evmos_2"} + + testCases := []struct { + name string + activeEIPs []string + expEIPsNum int + }{ + { + name: "repeated EIP - skip", + activeEIPs: []string{"evmos_0"}, + expEIPsNum: 3, + }, + { + name: "all new EIP", + activeEIPs: []string{"ethereum_3855"}, + expEIPsNum: 4, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + network := testnetwork.NewUnitTestNetwork() + + require.NoError(t, network.NextBlock(), "failed to advance block") + + oldParams := network.App.EvmKeeper.GetParams(network.GetContext()) + oldParams.ExtraEIPs = tc.activeEIPs + err := network.UpdateEvmParams(oldParams) + require.NoError(t, err, "failed to update EVM params") + + logger := network.GetContext().Logger() + err = v19.EnableCustomEIPs(network.GetContext(), logger, network.App.EvmKeeper) + require.NoError(t, err) + + params := network.App.EvmKeeper.GetParams(network.GetContext()) + require.Equal(t, tc.expEIPsNum, len(params.ExtraEIPs)) + + require.Subset(t, params.ExtraEIPs, upgradeEIPs, "expected all new EIPs to be present") + }) + } +} diff --git a/client/docs/swagger-ui/swagger.json b/client/docs/swagger-ui/swagger.json index 7b1cf6b896..bbcee36c2b 100644 --- a/client/docs/swagger-ui/swagger.json +++ b/client/docs/swagger-ui/swagger.json @@ -1693,8 +1693,7 @@ "extra_eips": { "type": "array", "items": { - "type": "string", - "format": "int64" + "type": "string" }, "title": "extra_eips defines the additional EIPs for the vm.Config" }, @@ -21706,8 +21705,7 @@ "extra_eips": { "type": "array", "items": { - "type": "string", - "format": "int64" + "type": "string" }, "title": "extra_eips defines the additional EIPs for the vm.Config" }, @@ -21953,8 +21951,7 @@ "extra_eips": { "type": "array", "items": { - "type": "string", - "format": "int64" + "type": "string" }, "title": "extra_eips defines the additional EIPs for the vm.Config" }, diff --git a/proto/ethermint/evm/v1/evm.proto b/proto/ethermint/evm/v1/evm.proto index cfaf79a228..e0234a4a77 100644 --- a/proto/ethermint/evm/v1/evm.proto +++ b/proto/ethermint/evm/v1/evm.proto @@ -15,7 +15,7 @@ message Params { // enable_create and enable call have been deprecated reserved 2, 3; // extra_eips defines the additional EIPs for the vm.Config - repeated int64 extra_eips = 4 [(gogoproto.customname) = "ExtraEIPs", (gogoproto.moretags) = "yaml:\"extra_eips\""]; + repeated string extra_eips = 4 [(gogoproto.customname) = "ExtraEIPs", (gogoproto.moretags) = "yaml:\"extra_eips\""]; // chain_config defines the EVM chain configuration parameters ChainConfig chain_config = 5 [(gogoproto.moretags) = "yaml:\"chain_config\"", (gogoproto.nullable) = false]; // allow_unprotected_txs defines if replay-protected (i.e non EIP155 diff --git a/x/evm/config/configurator.go b/x/evm/config/configurator.go index 7f7543ccdd..23e35a26ce 100644 --- a/x/evm/config/configurator.go +++ b/x/evm/config/configurator.go @@ -19,8 +19,8 @@ import ( // the EVM before starting the node. This means that all init genesis validations will be // applied to each change. type EVMConfigurator struct { - extendedEIPs map[int]func(*vm.JumpTable) - extendedDefaultExtraEIPs []int64 + extendedEIPs map[string]func(*vm.JumpTable) + extendedDefaultExtraEIPs []string sealed bool } @@ -31,14 +31,14 @@ func NewEVMConfigurator() *EVMConfigurator { // WithExtendedEips allows to add to the go-ethereum activators map the provided // EIP activators. -func (ec *EVMConfigurator) WithExtendedEips(extendedEIPs map[int]func(*vm.JumpTable)) *EVMConfigurator { +func (ec *EVMConfigurator) WithExtendedEips(extendedEIPs map[string]func(*vm.JumpTable)) *EVMConfigurator { ec.extendedEIPs = extendedEIPs return ec } // WithExtendedDefaultExtraEIPs update the x/evm DefaultExtraEIPs params // by adding provided EIP numbers. -func (ec *EVMConfigurator) WithExtendedDefaultExtraEIPs(eips ...int64) *EVMConfigurator { +func (ec *EVMConfigurator) WithExtendedDefaultExtraEIPs(eips ...string) *EVMConfigurator { ec.extendedDefaultExtraEIPs = eips return ec } @@ -48,7 +48,7 @@ func (ec *EVMConfigurator) Configure() error { // If Configure method has been already used in the object, return // an error to avoid overriding configuration. if ec.sealed { - return fmt.Errorf("EVMConfigurator has been sealed and cannot be modified") + return fmt.Errorf("error configuring EVMConfigurator: already sealed and cannot be modified") } if err := vm.ExtendActivators(ec.extendedEIPs); err != nil { @@ -57,7 +57,11 @@ func (ec *EVMConfigurator) Configure() error { for _, eip := range ec.extendedDefaultExtraEIPs { if slices.Contains(types.DefaultExtraEIPs, eip) { - return fmt.Errorf("EIP %d is already present in the default list: %v", eip, types.DefaultExtraEIPs) + return fmt.Errorf("error configuring EVMConfigurator: EIP %s is already present in the default list: %v", eip, types.DefaultExtraEIPs) + } + + if err := vm.ValidateEIPName(eip); err != nil { + return fmt.Errorf("error configuring EVMConfigurator: %s", err) } types.DefaultExtraEIPs = append(types.DefaultExtraEIPs, eip) diff --git a/x/evm/config/configurator_test.go b/x/evm/config/configurator_test.go index 7ccaf40d59..18ae698cfe 100644 --- a/x/evm/config/configurator_test.go +++ b/x/evm/config/configurator_test.go @@ -20,7 +20,7 @@ func TestEVMConfigurator(t *testing.T) { err = evmConfigurator.Configure() require.Error(t, err) - require.Contains(t, err.Error(), "has been sealed", "expected different error") + require.Contains(t, err.Error(), "sealed", "expected different error") } func TestExtendedEips(t *testing.T) { @@ -33,8 +33,8 @@ func TestExtendedEips(t *testing.T) { { "fail - eip already present in activators return an error", func() *config.EVMConfigurator { - extendedEIPs := map[int]func(*vm.JumpTable){ - 3855: func(_ *vm.JumpTable) {}, + extendedEIPs := map[string]func(*vm.JumpTable){ + "ethereum_3855": func(_ *vm.JumpTable) {}, } ec := config.NewEVMConfigurator().WithExtendedEips(extendedEIPs) return ec @@ -45,8 +45,8 @@ func TestExtendedEips(t *testing.T) { { "success - new default extra eips without duplication added", func() *config.EVMConfigurator { - extendedEIPs := map[int]func(*vm.JumpTable){ - 0o000: func(_ *vm.JumpTable) {}, + extendedEIPs := map[string]func(*vm.JumpTable){ + "evmos_0": func(_ *vm.JumpTable) {}, } ec := config.NewEVMConfigurator().WithExtendedEips(extendedEIPs) return ec @@ -78,25 +78,39 @@ func TestExtendedDefaultExtraEips(t *testing.T) { expPass bool errContains string }{ + { + "fail - invalid eip name", + func() *config.EVMConfigurator { + extendedDefaultExtraEIPs := []string{"os_1_000"} + ec := config.NewEVMConfigurator().WithExtendedDefaultExtraEIPs(extendedDefaultExtraEIPs...) + return ec + }, + func() { + require.ElementsMatch(t, defaultExtraEIPsSnapshot, types.DefaultExtraEIPs) + types.DefaultExtraEIPs = defaultExtraEIPsSnapshot + }, + false, + "eip name does not conform to structure", + }, { "fail - duplicate default EIP entiries", func() *config.EVMConfigurator { - extendedDefaultExtraEIPs := []int64{1_000} - types.DefaultExtraEIPs = append(types.DefaultExtraEIPs, 1_000) + extendedDefaultExtraEIPs := []string{"os_1000"} + types.DefaultExtraEIPs = append(types.DefaultExtraEIPs, "os_1000") ec := config.NewEVMConfigurator().WithExtendedDefaultExtraEIPs(extendedDefaultExtraEIPs...) return ec }, func() { - require.ElementsMatch(t, append(defaultExtraEIPsSnapshot, 1_000), types.DefaultExtraEIPs) + require.ElementsMatch(t, append(defaultExtraEIPsSnapshot, "os_1000"), types.DefaultExtraEIPs) types.DefaultExtraEIPs = defaultExtraEIPsSnapshot }, false, - "EIP 1000 is already present", + "EIP os_1000 is already present", }, { "success - empty default extra eip", func() *config.EVMConfigurator { - var extendedDefaultExtraEIPs []int64 + var extendedDefaultExtraEIPs []string ec := config.NewEVMConfigurator().WithExtendedDefaultExtraEIPs(extendedDefaultExtraEIPs...) return ec }, @@ -109,12 +123,12 @@ func TestExtendedDefaultExtraEips(t *testing.T) { { "success - extra default eip added", func() *config.EVMConfigurator { - extendedDefaultExtraEIPs := []int64{1_001} + extendedDefaultExtraEIPs := []string{"os_1001"} ec := config.NewEVMConfigurator().WithExtendedDefaultExtraEIPs(extendedDefaultExtraEIPs...) return ec }, func() { - require.ElementsMatch(t, append(defaultExtraEIPsSnapshot, 1_001), types.DefaultExtraEIPs) + require.ElementsMatch(t, append(defaultExtraEIPsSnapshot, "os_1001"), types.DefaultExtraEIPs) types.DefaultExtraEIPs = defaultExtraEIPsSnapshot }, true, @@ -123,16 +137,18 @@ func TestExtendedDefaultExtraEips(t *testing.T) { } for _, tc := range testCases { - ec := tc.malleate() - err := ec.Configure() + t.Run(tc.name, func(t *testing.T) { + ec := tc.malleate() + err := ec.Configure() - if tc.expPass { - require.NoError(t, err) - } else { - require.Error(t, err) - require.Contains(t, err.Error(), tc.errContains, "expected different error") - } + if tc.expPass { + require.NoError(t, err) + } else { + require.Error(t, err) + require.Contains(t, err.Error(), tc.errContains, "expected different error") + } - tc.postCheck() + tc.postCheck() + }) } } diff --git a/x/evm/core/vm/custom_eip.go b/x/evm/core/vm/custom_eip.go index 29eb34ae1e..ed2813f051 100644 --- a/x/evm/core/vm/custom_eip.go +++ b/x/evm/core/vm/custom_eip.go @@ -11,19 +11,19 @@ import ( ) // ExtendActivators allows to merge the go ethereum activators map -// with additional activators. -func ExtendActivators(eips map[int]func(*JumpTable)) error { +// with additional custom activators. +func ExtendActivators(eips map[string]func(*JumpTable)) error { // Catch early duplicated eip. - keys := make([]int, 0, len(eips)) + keys := make([]string, 0, len(eips)) for k := range eips { if ExistsEipActivator(k) { - return fmt.Errorf("duplicate activation: %d is already present in %s", k, ActivateableEips()) + return fmt.Errorf("duplicate activation: %s is already present in %s", k, ActivateableEips()) } keys = append(keys, k) } // Sorting keys to ensure deterministic execution. - sort.Ints(keys) + sort.Strings(keys) for _, k := range keys { activators[k] = eips[k] @@ -31,10 +31,13 @@ func ExtendActivators(eips map[int]func(*JumpTable)) error { return nil } -func GetActivatorsEipNumbers() []int { +// GetActivatorsEipNames returns the name of EIPs registered in +// the activators map. +// Used only in tests. +func GetActivatorsEipNames() []string { keys := maps.Keys(activators) - sort.Ints(keys) + sort.Strings(keys) return keys } diff --git a/x/evm/core/vm/custom_eip_test.go b/x/evm/core/vm/custom_eip_test.go index c40ee6865f..e8a09906ac 100644 --- a/x/evm/core/vm/custom_eip_test.go +++ b/x/evm/core/vm/custom_eip_test.go @@ -9,15 +9,66 @@ import ( "github.com/stretchr/testify/require" ) +func TestValidEIPName(t *testing.T) { + testCases := []struct { + name string + eipName string + expPass bool + errContains string + }{ + { + "fail - invalid number", + "os_OS", + false, + "eip number should be convertible to int", + }, + { + "fail - invalid structure, only chain name", + "os", + false, + "eip name does not conform to structure 'chainName_Number'", + }, + { + "fail - invalid structure, only number", + "0000", + false, + "eip name does not conform to structure 'chainName_Number'", + }, + { + "fail - invalid structure, only delimiter", + "_", + false, + "eip number should be convertible to int", + }, + { + "success - valid eip name", + "os_0000", + true, + "", + }, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + err := ValidateEIPName(tc.eipName) + if tc.expPass { + require.NoError(t, err) + } else { + require.Error(t, err) + require.Contains(t, err.Error(), tc.errContains, "expected different error") + } + }) + } +} + func TestExtendActivators(t *testing.T) { - eips_snapshot := GetActivatorsEipNumbers() + eips_snapshot := GetActivatorsEipNames() testCases := []struct { - name string - new_activators map[int]func(*JumpTable) - expPass bool - errContains string - postCheck func() + name string + newActivators map[string]func(*JumpTable) + expPass bool + errContains string + postCheck func() }{ { "success - nil new activators", @@ -25,67 +76,67 @@ func TestExtendActivators(t *testing.T) { true, "", func() { - eips := GetActivatorsEipNumbers() + eips := GetActivatorsEipNames() require.ElementsMatch(t, eips_snapshot, eips, "expected eips number to be equal") }, }, { "success - single new activator", - map[int]func(*JumpTable){ - 0o000: func(jt *JumpTable) {}, + map[string]func(*JumpTable){ + "evmos_0": func(jt *JumpTable) {}, }, true, "", func() { - eips := GetActivatorsEipNumbers() - require.ElementsMatch(t, append(eips_snapshot, 0o000), eips, "expected eips number to be equal") + eips := GetActivatorsEipNames() + require.ElementsMatch(t, append(eips_snapshot, "evmos_0"), eips, "expected eips number to be equal") }, }, { "success - multiple new activators", - map[int]func(*JumpTable){ - 0o001: func(jt *JumpTable) {}, - 0o002: func(jt *JumpTable) {}, + map[string]func(*JumpTable){ + "evmos_1": func(jt *JumpTable) {}, + "evmos_2": func(jt *JumpTable) {}, }, true, "", func() { - eips := GetActivatorsEipNumbers() + eips := GetActivatorsEipNames() // since we are working with a global function, tests are not independent - require.ElementsMatch(t, append(eips_snapshot, 0o000, 0o001, 0o002), eips, "expected eips number to be equal") + require.ElementsMatch(t, append(eips_snapshot, "evmos_0", "evmos_1", "evmos_2"), eips, "expected eips number to be equal") }, }, { "fail - repeated activator", - map[int]func(*JumpTable){ - 3855: func(jt *JumpTable) {}, + map[string]func(*JumpTable){ + "ethereum_3855": func(jt *JumpTable) {}, }, false, "", func() { - eips := GetActivatorsEipNumbers() + eips := GetActivatorsEipNames() // since we are working with a global function, tests are not independent - require.ElementsMatch(t, append(eips_snapshot, 0o000, 0o001, 0o002), eips, "expected eips number to be equal") + require.ElementsMatch(t, append(eips_snapshot, "evmos_0", "evmos_1", "evmos_2"), eips, "expected eips number to be equal") }, }, { "fail - valid activator is not stored if a repeated is present", - map[int]func(*JumpTable){ - 0o003: func(jt *JumpTable) {}, - 3855: func(jt *JumpTable) {}, + map[string]func(*JumpTable){ + "evmos_3": func(jt *JumpTable) {}, + "ethereum_3855": func(jt *JumpTable) {}, }, false, "", func() { - eips := GetActivatorsEipNumbers() + eips := GetActivatorsEipNames() // since we are working with a global function, tests are not independent - require.ElementsMatch(t, append(eips_snapshot, 0o000, 0o001, 0o002), eips, "expected eips number to be equal") + require.ElementsMatch(t, append(eips_snapshot, "evmos_0", "evmos_1", "evmos_2"), eips, "expected eips number to be equal") }, }, } for _, tc := range testCases { - err := ExtendActivators(tc.new_activators) + err := ExtendActivators(tc.newActivators) if tc.expPass { require.NoError(t, err) } else { diff --git a/x/evm/core/vm/eips.go b/x/evm/core/vm/eips.go index 01f55f22ef..9b399f8166 100644 --- a/x/evm/core/vm/eips.go +++ b/x/evm/core/vm/eips.go @@ -19,50 +19,67 @@ package vm import ( "fmt" "sort" + "strconv" + "strings" "github.com/ethereum/go-ethereum/params" "github.com/holiman/uint256" ) -var activators = map[int]func(*JumpTable){ - 3855: enable3855, - 3529: enable3529, - 3198: enable3198, - 2929: enable2929, - 2200: enable2200, - 1884: enable1884, - 1344: enable1344, +var activators = map[string]func(*JumpTable){ + "ethereum_3855": enable3855, + "ethereum_3529": enable3529, + "ethereum_3198": enable3198, + "ethereum_2929": enable2929, + "ethereum_2200": enable2200, + "ethereum_1884": enable1884, + "ethereum_1344": enable1344, } // EnableEIP enables the given EIP on the config. // This operation writes in-place, and callers need to ensure that the globally // defined jump tables are not polluted. -func EnableEIP(eipNum int, jt *JumpTable) error { - enablerFn, ok := activators[eipNum] +func EnableEIP(eipName string, jt *JumpTable) error { + enablerFn, ok := activators[eipName] if !ok { - return fmt.Errorf("undefined eip %d", eipNum) + return fmt.Errorf("undefined eip %s", eipName) } enablerFn(jt) return nil } +// ValidateEIPName checks if an EIP name is valid or not. The allowed +// name structure is a string that can be represented as "chainName" + "_" + "int". +func ValidateEIPName(eipName string) error { + eipSplit := strings.Split(eipName, "_") + if len(eipSplit) != 2 { + return fmt.Errorf("eip name does not conform to structure 'chainName_Number'") + } + if _, err := strconv.Atoi(eipSplit[1]); err != nil { + return fmt.Errorf("eip number should be convertible to int") + } + return nil +} + // ExistsEipActivator return true if the given EIP -// number is associated with an activator function. +// name is associated with an activator function. // Return false otherwise. -func ExistsEipActivator(eipNum int) bool { - _, ok := activators[eipNum] +func ExistsEipActivator(eipName string) bool { + _, ok := activators[eipName] return ok } +// ActivateableEips returns the sorted slice of EIP names +// that can be activated. func ActivateableEips() []string { - var nums []string + var names []string if len(activators) > 0 { for k := range activators { - nums = append(nums, fmt.Sprintf("%d", k)) + names = append(names, k) } - sort.Strings(nums) + sort.Strings(names) } - return nums + return names } // enable1884 applies EIP-1884 to the given jump table: diff --git a/x/evm/core/vm/gas_table_test.go b/x/evm/core/vm/gas_table_test.go index 6cd126c9b4..efba3cfff5 100644 --- a/x/evm/core/vm/gas_table_test.go +++ b/x/evm/core/vm/gas_table_test.go @@ -91,7 +91,7 @@ func TestEIP2200(t *testing.T) { CanTransfer: func(StateDB, common.Address, *big.Int) bool { return true }, Transfer: func(StateDB, common.Address, common.Address, *big.Int) {}, } - vmenv := NewEVM(vmctx, TxContext{}, statedb, params.AllEthashProtocolChanges, Config{ExtraEips: []int{2200}}) + vmenv := NewEVM(vmctx, TxContext{}, statedb, params.AllEthashProtocolChanges, Config{ExtraEips: []string{"ethereum_2200"}}) _, gas, err := vmenv.Call(AccountRef(common.Address{}), address, nil, tt.gaspool, new(big.Int)) if err != tt.failure { diff --git a/x/evm/core/vm/interpreter.go b/x/evm/core/vm/interpreter.go index d657915124..f4055e423a 100644 --- a/x/evm/core/vm/interpreter.go +++ b/x/evm/core/vm/interpreter.go @@ -33,7 +33,7 @@ type Config struct { JumpTable *JumpTable // EVM instruction table, automatically populated if unset - ExtraEips []int // Additional EIPS that are to be enabled + ExtraEips []string // Additional EIPS that are to be enabled } // ScopeContext contains the things that are per-call, such as stack and memory, diff --git a/x/evm/core/vm/stack.go b/x/evm/core/vm/stack.go index e0c757f1f2..a731b157c1 100644 --- a/x/evm/core/vm/stack.go +++ b/x/evm/core/vm/stack.go @@ -39,7 +39,7 @@ type Stack struct { func NewStack() (*Stack, error) { stack, ok := stackPool.Get().(*Stack) if !ok { - return nil, fmt.Errorf("Type assertion failure: cannot get Stack pointer from stackPool") + return nil, fmt.Errorf("type assertion failure: cannot get Stack pointer from stackPool") } return stack, nil } @@ -125,7 +125,7 @@ type ReturnStack struct { func NewReturnStack() (*ReturnStack, error) { rStack, ok := rStackPool.Get().(*ReturnStack) if !ok { - return nil, fmt.Errorf("Type assertion failure: cannot get ReturnStack pointer from rStackPool") + return nil, fmt.Errorf("type assertion failure: cannot get ReturnStack pointer from rStackPool") } return rStack, nil } diff --git a/x/evm/keeper/grpc_query_test.go b/x/evm/keeper/grpc_query_test.go index b9e36ef8fd..bd4f6d4cc6 100644 --- a/x/evm/keeper/grpc_query_test.go +++ b/x/evm/keeper/grpc_query_test.go @@ -27,10 +27,10 @@ import ( const invalidAddress = "0x0000" // expGasConsumed is the gas consumed in traceTx setup (GetProposerAddr + CalculateBaseFee) -const expGasConsumed = 7442 +const expGasConsumed = 7475 // expGasConsumedWithFeeMkt is the gas consumed in traceTx setup (GetProposerAddr + CalculateBaseFee) with enabled feemarket -const expGasConsumedWithFeeMkt = 7436 +const expGasConsumedWithFeeMkt = 7469 func (suite *KeeperTestSuite) TestQueryAccount() { var ( @@ -954,7 +954,7 @@ func (suite *KeeperTestSuite) TestTraceTx() { }, expPass: true, traceResponse: "{\"gas\":34828,\"failed\":false,\"returnValue\":\"0000000000000000000000000000000000000000000000000000000000000001\",\"structLogs\":[{\"pc\":0,\"op\":\"PUSH1\",\"gas\":", - expFinalGas: 26744, // gas consumed in traceTx setup (GetProposerAddr + CalculateBaseFee) + gas consumed in malleate func + expFinalGas: 27140, // gas consumed in traceTx setup (GetProposerAddr + CalculateBaseFee) + gas consumed in malleate func }, { msg: "invalid chain id", diff --git a/x/evm/keeper/migrations.go b/x/evm/keeper/migrations.go index 9fad29c20b..86ea49a9c0 100644 --- a/x/evm/keeper/migrations.go +++ b/x/evm/keeper/migrations.go @@ -4,9 +4,6 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" - v4 "github.com/evmos/evmos/v19/x/evm/migrations/v4" - v5 "github.com/evmos/evmos/v19/x/evm/migrations/v5" - v6 "github.com/evmos/evmos/v19/x/evm/migrations/v6" v7 "github.com/evmos/evmos/v19/x/evm/migrations/v7" "github.com/evmos/evmos/v19/x/evm/types" ) @@ -17,7 +14,7 @@ type Migrator struct { legacySubspace types.Subspace } -// NewMigrator returns a new Migrator. +// NewMigrator returns a new Migrator instance. func NewMigrator(keeper Keeper, legacySubspace types.Subspace) Migrator { return Migrator{ keeper: keeper, @@ -25,22 +22,7 @@ func NewMigrator(keeper Keeper, legacySubspace types.Subspace) Migrator { } } -// Migrate3to4 migrates the store from consensus version 3 to 4 -func (m Migrator) Migrate3to4(ctx sdk.Context) error { - return v4.MigrateStore(ctx, m.keeper.storeKey, m.legacySubspace, m.keeper.cdc) -} - -// Migrate4to5 migrates the store from consensus version 4 to 5 -func (m Migrator) Migrate4to5(ctx sdk.Context) error { - return v5.MigrateStore(ctx, m.keeper.storeKey, m.keeper.cdc) -} - -// Migrate5to6 migrates the store from consensus version 5 to 6 -func (m Migrator) Migrate5to6(ctx sdk.Context) error { - return v6.MigrateStore(ctx, m.keeper.storeKey, m.keeper.cdc) -} - -// Migrate6to7 migrates the store from consensus version 6 to 7 +// Migrate6to7 migrates the store from consensus version 6 to 7. func (m Migrator) Migrate6to7(ctx sdk.Context) error { return v7.MigrateStore(ctx, m.keeper.storeKey, m.keeper.cdc) } diff --git a/x/evm/keeper/migrations_test.go b/x/evm/keeper/migrations_test.go deleted file mode 100644 index fc8e17de83..0000000000 --- a/x/evm/keeper/migrations_test.go +++ /dev/null @@ -1,41 +0,0 @@ -package keeper_test - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - evmkeeper "github.com/evmos/evmos/v19/x/evm/keeper" - "github.com/evmos/evmos/v19/x/evm/types" -) - -type mockSubspace struct { - ps types.Params -} - -func newMockSubspace(ps types.Params) mockSubspace { - return mockSubspace{ps: ps} -} - -func (ms mockSubspace) GetParamSetIfExists(_ sdk.Context, ps types.LegacyParams) { - *ps.(*types.Params) = ms.ps -} - -func (suite *KeeperTestSuite) TestMigrations() { - legacySubspace := newMockSubspace(types.DefaultParams()) - migrator := evmkeeper.NewMigrator(*suite.app.EvmKeeper, legacySubspace) - - testCases := []struct { - name string - migrateFunc func(ctx sdk.Context) error - }{ - { - "Run Migrate3to4", - migrator.Migrate3to4, - }, - } - - for _, tc := range testCases { - suite.Run(tc.name, func() { - err := tc.migrateFunc(suite.ctx) - suite.Require().NoError(err) - }) - } -} diff --git a/x/evm/keeper/params.go b/x/evm/keeper/params.go index 14ab1bef93..6721c549f8 100644 --- a/x/evm/keeper/params.go +++ b/x/evm/keeper/params.go @@ -88,7 +88,7 @@ func appendPrecompiles(existingPrecompiles []string, addresses ...common.Address } // EnableEIPs enables the given EIPs in the EVM parameters. -func (k Keeper) EnableEIPs(ctx sdk.Context, eips ...int64) error { +func (k Keeper) EnableEIPs(ctx sdk.Context, eips ...string) error { evmParams := k.GetParams(ctx) evmParams.ExtraEIPs = append(evmParams.ExtraEIPs, eips...) diff --git a/x/evm/migrations/v4/migrate.go b/x/evm/migrations/v4/migrate.go deleted file mode 100644 index d12a11c9e8..0000000000 --- a/x/evm/migrations/v4/migrate.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) -package v4 - -import ( - "github.com/cosmos/cosmos-sdk/codec" - storetypes "github.com/cosmos/cosmos-sdk/store/types" - sdk "github.com/cosmos/cosmos-sdk/types" - - v4types "github.com/evmos/evmos/v19/x/evm/migrations/v4/types" - "github.com/evmos/evmos/v19/x/evm/types" -) - -// MigrateStore migrates the x/evm module state from the consensus version 3 to -// version 4. Specifically, it takes the parameters that are currently stored -// and managed by the Cosmos SDK params module and stores them directly into the x/evm module state. -func MigrateStore( - ctx sdk.Context, - storeKey storetypes.StoreKey, - legacySubspace types.Subspace, - cdc codec.BinaryCodec, -) error { - var params types.Params - - legacySubspace.GetParamSetIfExists(ctx, ¶ms) - - if err := params.Validate(); err != nil { - return err - } - - chainCfgBz := cdc.MustMarshal(¶ms.ChainConfig) - extraEIPsBz := cdc.MustMarshal(&v4types.ExtraEIPs{EIPs: params.ExtraEIPs}) - - store := ctx.KVStore(storeKey) - - store.Set(types.ParamStoreKeyEVMDenom, []byte(params.EvmDenom)) - store.Set(types.ParamStoreKeyExtraEIPs, extraEIPsBz) - store.Set(types.ParamStoreKeyChainConfig, chainCfgBz) - - if params.AllowUnprotectedTxs { - store.Set(types.ParamStoreKeyAllowUnprotectedTxs, []byte{0x01}) - } - return nil -} diff --git a/x/evm/migrations/v4/migrate_test.go b/x/evm/migrations/v4/migrate_test.go deleted file mode 100644 index 4f837fa4ff..0000000000 --- a/x/evm/migrations/v4/migrate_test.go +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright 2022 Evmos Foundation -// This file is part of the Evmos Network packages. -// -// Evmos is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The Evmos packages are distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the Evmos packages. If not, see https://github.com/evmos/evmos/blob/main/LICENSE -package v4_test - -import ( - "testing" - - "github.com/stretchr/testify/require" - - "github.com/evmos/evmos/v19/x/evm/types" - - "github.com/cosmos/cosmos-sdk/testutil" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v19/app" - "github.com/evmos/evmos/v19/encoding" - v4 "github.com/evmos/evmos/v19/x/evm/migrations/v4" - v4types "github.com/evmos/evmos/v19/x/evm/migrations/v4/types" -) - -type mockSubspace struct { - ps types.Params -} - -func newMockSubspace(ps types.Params) mockSubspace { - return mockSubspace{ps: ps} -} - -func (ms mockSubspace) GetParamSetIfExists(_ sdk.Context, ps types.LegacyParams) { - *ps.(*types.Params) = ms.ps -} - -func TestMigrate(t *testing.T) { - encCfg := encoding.MakeConfig(app.ModuleBasics) - cdc := encCfg.Codec - - storeKey := sdk.NewKVStoreKey(types.ModuleName) - tKey := sdk.NewTransientStoreKey(types.TransientKey) - ctx := testutil.DefaultContext(storeKey, tKey) - kvStore := ctx.KVStore(storeKey) - - legacySubspace := newMockSubspace(types.DefaultParams()) - require.NoError(t, v4.MigrateStore(ctx, storeKey, legacySubspace, cdc)) - - // Get all the new parameters from the kvStore - var evmDenom string - bz := kvStore.Get(types.ParamStoreKeyEVMDenom) - evmDenom = string(bz) - - allowUnprotectedTx := kvStore.Has(types.ParamStoreKeyAllowUnprotectedTxs) - enableCreate := kvStore.Has(types.ParamStoreKeyEnableCreate) - enableCall := kvStore.Has(types.ParamStoreKeyEnableCall) - - var chainCfg v4types.V4ChainConfig - bz = kvStore.Get(types.ParamStoreKeyChainConfig) - cdc.MustUnmarshal(bz, &chainCfg) - - var extraEIPs v4types.ExtraEIPs - bz = kvStore.Get(types.ParamStoreKeyExtraEIPs) - cdc.MustUnmarshal(bz, &extraEIPs) - require.Equal(t, types.DefaultExtraEIPs, extraEIPs.EIPs) - - params := v4types.V4Params{ - EvmDenom: evmDenom, - AllowUnprotectedTxs: allowUnprotectedTx, - EnableCreate: enableCreate, - EnableCall: enableCall, - V4ChainConfig: chainCfg, - ExtraEIPs: extraEIPs, - } - - require.Equal(t, legacySubspace.ps.AllowUnprotectedTxs, params.AllowUnprotectedTxs) - require.Equal(t, legacySubspace.ps.ExtraEIPs, params.ExtraEIPs.EIPs) - require.EqualValues(t, legacySubspace.ps.ChainConfig, params.V4ChainConfig) -} diff --git a/x/evm/migrations/v4/types/evm.pb.go b/x/evm/migrations/v4/types/evm.pb.go deleted file mode 100644 index 8205b8e036..0000000000 --- a/x/evm/migrations/v4/types/evm.pb.go +++ /dev/null @@ -1,4295 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: ethermint/evm/v1/evm.proto - -package types - -import ( - fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - - github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" -) - -// Reference imports to suppress errors if they are not otherwise used. -var ( - _ = proto.Marshal - _ = fmt.Errorf - _ = math.Inf -) - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// V4Params defines the EVM module parameters -type V4Params struct { - // evm_denom represents the token denomination used to run the EVM V4State - // transitions. - EvmDenom string `protobuf:"bytes,1,opt,name=evm_denom,json=evmDenom,proto3" json:"evm_denom,omitempty" yaml:"evm_denom"` - // enable_create toggles V4State transitions that use the vm.Create function - EnableCreate bool `protobuf:"varint,2,opt,name=enable_create,json=enableCreate,proto3" json:"enable_create,omitempty" yaml:"enable_create"` - // enable_call toggles V4State transitions that use the vm.Call function - EnableCall bool `protobuf:"varint,3,opt,name=enable_call,json=enableCall,proto3" json:"enable_call,omitempty" yaml:"enable_call"` - // extra_eips defines the additional EIPs for the vm.Config - ExtraEIPs ExtraEIPs `protobuf:"bytes,4,opt,name=extra_eips,json=extraEips,proto3" json:"extra_eips" yaml:"extra_eips"` - // chain_config defines the EVM chain configuration parameters - V4ChainConfig V4ChainConfig `protobuf:"bytes,5,opt,name=chain_config,json=V4ChainConfig,proto3" json:"chain_config" yaml:"chain_config"` - // allow_unprotected_txs defines if replay-protected (i.e non EIP155 - // signed) transactions can be executed on the V4State machine. - AllowUnprotectedTxs bool `protobuf:"varint,6,opt,name=allow_unprotected_txs,json=allowUnprotectedTxs,proto3" json:"allow_unprotected_txs,omitempty"` -} - -func (m *V4Params) Reset() { *m = V4Params{} } -func (m *V4Params) String() string { return proto.CompactTextString(m) } -func (*V4Params) ProtoMessage() {} -func (*V4Params) Descriptor() ([]byte, []int) { - return fileDescriptor_d21ecc92c8c8583e, []int{0} -} - -func (m *V4Params) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *V4Params) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_V4Params.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} - -func (m *V4Params) XXX_Merge(src proto.Message) { - xxx_messageInfo_V4Params.Merge(m, src) -} - -func (m *V4Params) XXX_Size() int { - return m.Size() -} - -func (m *V4Params) XXX_DiscardUnknown() { - xxx_messageInfo_V4Params.DiscardUnknown(m) -} - -var xxx_messageInfo_V4Params proto.InternalMessageInfo - -func (m *V4Params) GetEvmDenom() string { - if m != nil { - return m.EvmDenom - } - return "" -} - -func (m *V4Params) GetEnableCreate() bool { - if m != nil { - return m.EnableCreate - } - return false -} - -func (m *V4Params) GetEnableCall() bool { - if m != nil { - return m.EnableCall - } - return false -} - -func (m *V4Params) GetExtraEIPs() ExtraEIPs { - if m != nil { - return m.ExtraEIPs - } - return ExtraEIPs{} -} - -func (m *V4Params) GetV4ChainConfig() V4ChainConfig { - if m != nil { - return m.V4ChainConfig - } - return V4ChainConfig{} -} - -func (m *V4Params) GetAllowUnprotectedTxs() bool { - if m != nil { - return m.AllowUnprotectedTxs - } - return false -} - -// ExtraEIPs represents extra EIPs for the vm.Config -type ExtraEIPs struct { - // eips defines the additional EIPs for the vm.Config - EIPs []int64 `protobuf:"varint,1,rep,packed,name=eips,proto3" json:"eips,omitempty" yaml:"eips"` -} - -func (m *ExtraEIPs) Reset() { *m = ExtraEIPs{} } -func (m *ExtraEIPs) String() string { return proto.CompactTextString(m) } -func (*ExtraEIPs) ProtoMessage() {} -func (*ExtraEIPs) Descriptor() ([]byte, []int) { - return fileDescriptor_d21ecc92c8c8583e, []int{1} -} - -func (m *ExtraEIPs) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *ExtraEIPs) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ExtraEIPs.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} - -func (m *ExtraEIPs) XXX_Merge(src proto.Message) { - xxx_messageInfo_ExtraEIPs.Merge(m, src) -} - -func (m *ExtraEIPs) XXX_Size() int { - return m.Size() -} - -func (m *ExtraEIPs) XXX_DiscardUnknown() { - xxx_messageInfo_ExtraEIPs.DiscardUnknown(m) -} - -var xxx_messageInfo_ExtraEIPs proto.InternalMessageInfo - -func (m *ExtraEIPs) GetEIPs() []int64 { - if m != nil { - return m.EIPs - } - return nil -} - -// V4ChainConfig defines the Ethereum V4ChainConfig parameters using *sdkmath.Int values -// instead of *big.Int. -type V4ChainConfig struct { - // homestead_block switch (nil no fork, 0 = already homestead) - HomesteadBlock *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,1,opt,name=homestead_block,json=homesteadBlock,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"homestead_block,omitempty" yaml:"homestead_block"` - // dao_fork_block corresponds to TheDAO hard-fork switch block (nil no fork) - DAOForkBlock *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,2,opt,name=dao_fork_block,json=daoForkBlock,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"dao_fork_block,omitempty" yaml:"dao_fork_block"` - // dao_fork_support defines whether the nodes supports or opposes the DAO hard-fork - DAOForkSupport bool `protobuf:"varint,3,opt,name=dao_fork_support,json=daoForkSupport,proto3" json:"dao_fork_support,omitempty" yaml:"dao_fork_support"` - // eip150_block: EIP150 implements the Gas price changes - // (https://github.com/ethereum/EIPs/issues/150) EIP150 HF block (nil no fork) - EIP150Block *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,4,opt,name=eip150_block,json=eip150Block,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"eip150_block,omitempty" yaml:"eip150_block"` - // eip150_hash: EIP150 HF hash (needed for header only clients as only gas pricing changed) - EIP150Hash string `protobuf:"bytes,5,opt,name=eip150_hash,json=eip150Hash,proto3" json:"eip150_hash,omitempty" yaml:"byzantium_block"` - // eip155_block: EIP155Block HF block - EIP155Block *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,6,opt,name=eip155_block,json=eip155Block,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"eip155_block,omitempty" yaml:"eip155_block"` - // eip158_block: EIP158 HF block - EIP158Block *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,7,opt,name=eip158_block,json=eip158Block,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"eip158_block,omitempty" yaml:"eip158_block"` - // byzantium_block: Byzantium switch block (nil no fork, 0 = already on byzantium) - ByzantiumBlock *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,8,opt,name=byzantium_block,json=byzantiumBlock,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"byzantium_block,omitempty" yaml:"byzantium_block"` - // constantinople_block: Constantinople switch block (nil no fork, 0 = already activated) - ConstantinopleBlock *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,9,opt,name=constantinople_block,json=constantinopleBlock,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"constantinople_block,omitempty" yaml:"constantinople_block"` - // petersburg_block: Petersburg switch block (nil same as Constantinople) - PetersburgBlock *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,10,opt,name=petersburg_block,json=petersburgBlock,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"petersburg_block,omitempty" yaml:"petersburg_block"` - // istanbul_block: Istanbul switch block (nil no fork, 0 = already on istanbul) - IstanbulBlock *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,11,opt,name=istanbul_block,json=istanbulBlock,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"istanbul_block,omitempty" yaml:"istanbul_block"` - // muir_glacier_block: Eip-2384 (bomb delay) switch block (nil no fork, 0 = already activated) - MuirGlacierBlock *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,12,opt,name=muir_glacier_block,json=muirGlacierBlock,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"muir_glacier_block,omitempty" yaml:"muir_glacier_block"` - // berlin_block: Berlin switch block (nil = no fork, 0 = already on berlin) - BerlinBlock *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,13,opt,name=berlin_block,json=berlinBlock,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"berlin_block,omitempty" yaml:"berlin_block"` - // london_block: London switch block (nil = no fork, 0 = already on london) - LondonBlock *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,17,opt,name=london_block,json=londonBlock,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"london_block,omitempty" yaml:"london_block"` - // arrow_glacier_block: Eip-4345 (bomb delay) switch block (nil = no fork, 0 = already activated) - ArrowGlacierBlock *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,18,opt,name=arrow_glacier_block,json=arrowGlacierBlock,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"arrow_glacier_block,omitempty" yaml:"arrow_glacier_block"` - // gray_glacier_block: EIP-5133 (bomb delay) switch block (nil = no fork, 0 = already activated) - GrayGlacierBlock *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,20,opt,name=gray_glacier_block,json=grayGlacierBlock,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"gray_glacier_block,omitempty" yaml:"gray_glacier_block"` - // merge_netsplit_block: Virtual fork after The Merge to use as a network splitter - MergeNetsplitBlock *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,21,opt,name=merge_netsplit_block,json=mergeNetsplitBlock,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"merge_netsplit_block,omitempty" yaml:"merge_netsplit_block"` - // shanghai_block switch block (nil = no fork, 0 = already on shanghai) - ShanghaiBlock *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,22,opt,name=shanghai_block,json=shanghaiBlock,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"shanghai_block,omitempty" yaml:"shanghai_block"` - // cancun_block switch block (nil = no fork, 0 = already on cancun) - CancunBlock *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,23,opt,name=cancun_block,json=cancunBlock,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"cancun_block,omitempty" yaml:"cancun_block"` -} - -func (m *V4ChainConfig) Reset() { *m = V4ChainConfig{} } -func (m *V4ChainConfig) String() string { return proto.CompactTextString(m) } -func (*V4ChainConfig) ProtoMessage() {} -func (*V4ChainConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_d21ecc92c8c8583e, []int{2} -} - -func (m *V4ChainConfig) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *V4ChainConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_V4ChainConfig.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} - -func (m *V4ChainConfig) XXX_Merge(src proto.Message) { - xxx_messageInfo_V4ChainConfig.Merge(m, src) -} - -func (m *V4ChainConfig) XXX_Size() int { - return m.Size() -} - -func (m *V4ChainConfig) XXX_DiscardUnknown() { - xxx_messageInfo_V4ChainConfig.DiscardUnknown(m) -} - -var xxx_messageInfo_V4ChainConfig proto.InternalMessageInfo - -func (m *V4ChainConfig) GetDAOForkSupport() bool { - if m != nil { - return m.DAOForkSupport - } - return false -} - -func (m *V4ChainConfig) GetEIP150Hash() string { - if m != nil { - return m.EIP150Hash - } - return "" -} - -// V4State represents a single Storage key value pair item. -type V4State struct { - // key is the stored key - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` - // value is the stored value for the given key - Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` -} - -func (m *V4State) Reset() { *m = V4State{} } -func (m *V4State) String() string { return proto.CompactTextString(m) } -func (*V4State) ProtoMessage() {} -func (*V4State) Descriptor() ([]byte, []int) { - return fileDescriptor_d21ecc92c8c8583e, []int{3} -} - -func (m *V4State) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *V4State) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_V4State.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} - -func (m *V4State) XXX_Merge(src proto.Message) { - xxx_messageInfo_V4State.Merge(m, src) -} - -func (m *V4State) XXX_Size() int { - return m.Size() -} - -func (m *V4State) XXX_DiscardUnknown() { - xxx_messageInfo_V4State.DiscardUnknown(m) -} - -var xxx_messageInfo_V4State proto.InternalMessageInfo - -func (m *V4State) GetKey() string { - if m != nil { - return m.Key - } - return "" -} - -func (m *V4State) GetValue() string { - if m != nil { - return m.Value - } - return "" -} - -// TransactionV4Logs define the V4Logs generated from a transaction execution -// with a given hash. It it used for import/export data as transactions are not -// persisted on blockchain V4State after an upgrade. -type TransactionV4Logs struct { - // hash of the transaction - Hash string `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` - // V4Logs is an array of V4Logs for the given transaction hash - V4Logs []*V4Log `protobuf:"bytes,2,rep,name=V4Logs,proto3" json:"V4Logs,omitempty"` -} - -func (m *TransactionV4Logs) Reset() { *m = TransactionV4Logs{} } -func (m *TransactionV4Logs) String() string { return proto.CompactTextString(m) } -func (*TransactionV4Logs) ProtoMessage() {} -func (*TransactionV4Logs) Descriptor() ([]byte, []int) { - return fileDescriptor_d21ecc92c8c8583e, []int{4} -} - -func (m *TransactionV4Logs) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *TransactionV4Logs) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_TransactionV4Logs.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} - -func (m *TransactionV4Logs) XXX_Merge(src proto.Message) { - xxx_messageInfo_TransactionV4Logs.Merge(m, src) -} - -func (m *TransactionV4Logs) XXX_Size() int { - return m.Size() -} - -func (m *TransactionV4Logs) XXX_DiscardUnknown() { - xxx_messageInfo_TransactionV4Logs.DiscardUnknown(m) -} - -var xxx_messageInfo_TransactionV4Logs proto.InternalMessageInfo - -func (m *TransactionV4Logs) GetHash() string { - if m != nil { - return m.Hash - } - return "" -} - -func (m *TransactionV4Logs) GetV4Logs() []*V4Log { - if m != nil { - return m.V4Logs - } - return nil -} - -// V4Log represents an protobuf compatible Ethereum V4Log that defines a contract -// V4Log event. These events are generated by the V4Log opcode and stored/indexed by -// the node. -// -// NOTE: address, topics and data are consensus fields. The rest of the fields -// are derived, i.e. filled in by the nodes, but not secured by consensus. -type V4Log struct { - // address of the contract that generated the event - Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` - // topics is a list of topics provided by the contract. - Topics []string `protobuf:"bytes,2,rep,name=topics,proto3" json:"topics,omitempty"` - // data which is supplied by the contract, usually ABI-encoded - Data []byte `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` - // block_number of the block in which the transaction was included - BlockNumber uint64 `protobuf:"varint,4,opt,name=block_number,json=blockNumber,proto3" json:"blockNumber"` - // tx_hash is the transaction hash - TxHash string `protobuf:"bytes,5,opt,name=tx_hash,json=txHash,proto3" json:"transactionHash"` - // tx_index of the transaction in the block - TxIndex uint64 `protobuf:"varint,6,opt,name=tx_index,json=txIndex,proto3" json:"transactionIndex"` - // block_hash of the block in which the transaction was included - BlockHash string `protobuf:"bytes,7,opt,name=block_hash,json=blockHash,proto3" json:"blockHash"` - // index of the V4Log in the block - Index uint64 `protobuf:"varint,8,opt,name=index,proto3" json:"V4LogIndex"` - // removed is true if this V4Log was reverted due to a chain - // reorganisation. You must pay attention to this field if you receive V4Logs - // through a filter query. - Removed bool `protobuf:"varint,9,opt,name=removed,proto3" json:"removed,omitempty"` -} - -func (m *V4Log) Reset() { *m = V4Log{} } -func (m *V4Log) String() string { return proto.CompactTextString(m) } -func (*V4Log) ProtoMessage() {} -func (*V4Log) Descriptor() ([]byte, []int) { - return fileDescriptor_d21ecc92c8c8583e, []int{5} -} - -func (m *V4Log) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *V4Log) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_V4Log.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} - -func (m *V4Log) XXX_Merge(src proto.Message) { - xxx_messageInfo_V4Log.Merge(m, src) -} - -func (m *V4Log) XXX_Size() int { - return m.Size() -} - -func (m *V4Log) XXX_DiscardUnknown() { - xxx_messageInfo_V4Log.DiscardUnknown(m) -} - -var xxx_messageInfo_V4Log proto.InternalMessageInfo - -func (m *V4Log) GetAddress() string { - if m != nil { - return m.Address - } - return "" -} - -func (m *V4Log) GetTopics() []string { - if m != nil { - return m.Topics - } - return nil -} - -func (m *V4Log) GetData() []byte { - if m != nil { - return m.Data - } - return nil -} - -func (m *V4Log) GetBlockNumber() uint64 { - if m != nil { - return m.BlockNumber - } - return 0 -} - -func (m *V4Log) GetTxHash() string { - if m != nil { - return m.TxHash - } - return "" -} - -func (m *V4Log) GetTxIndex() uint64 { - if m != nil { - return m.TxIndex - } - return 0 -} - -func (m *V4Log) GetBlockHash() string { - if m != nil { - return m.BlockHash - } - return "" -} - -func (m *V4Log) GetIndex() uint64 { - if m != nil { - return m.Index - } - return 0 -} - -func (m *V4Log) GetRemoved() bool { - if m != nil { - return m.Removed - } - return false -} - -// V4TxResult stores results of Tx execution. -type V4TxResult struct { - // contract_address contains the ethereum address of the created contract (if - // any). If the V4State transition is an evm.Call, the contract address will be - // empty. - ContractAddress string `protobuf:"bytes,1,opt,name=contract_address,json=contractAddress,proto3" json:"contract_address,omitempty" yaml:"contract_address"` - // bloom represents the bloom filter bytes - Bloom []byte `protobuf:"bytes,2,opt,name=bloom,proto3" json:"bloom,omitempty"` - // tx_V4Logs contains the transaction hash and the proto-compatible ethereum - // V4Logs. - TxV4Logs TransactionV4Logs `protobuf:"bytes,3,opt,name=tx_V4Logs,json=txV4Logs,proto3" json:"tx_V4Logs" yaml:"tx_V4Logs"` - // ret defines the bytes from the execution. - Ret []byte `protobuf:"bytes,4,opt,name=ret,proto3" json:"ret,omitempty"` - // reverted flag is set to true when the call has been reverted - Reverted bool `protobuf:"varint,5,opt,name=reverted,proto3" json:"reverted,omitempty"` - // gas_used notes the amount of gas consumed while execution - GasUsed uint64 `protobuf:"varint,6,opt,name=gas_used,json=gasUsed,proto3" json:"gas_used,omitempty"` -} - -func (m *V4TxResult) Reset() { *m = V4TxResult{} } -func (m *V4TxResult) String() string { return proto.CompactTextString(m) } -func (*V4TxResult) ProtoMessage() {} -func (*V4TxResult) Descriptor() ([]byte, []int) { - return fileDescriptor_d21ecc92c8c8583e, []int{6} -} - -func (m *V4TxResult) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *V4TxResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_V4TxResult.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} - -func (m *V4TxResult) XXX_Merge(src proto.Message) { - xxx_messageInfo_V4TxResult.Merge(m, src) -} - -func (m *V4TxResult) XXX_Size() int { - return m.Size() -} - -func (m *V4TxResult) XXX_DiscardUnknown() { - xxx_messageInfo_V4TxResult.DiscardUnknown(m) -} - -var xxx_messageInfo_V4TxResult proto.InternalMessageInfo - -// V4AccessTuple is the element type of an access list. -type V4AccessTuple struct { - // address is a hex formatted ethereum address - Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` - // storage_keys are hex formatted hashes of the storage keys - StorageKeys []string `protobuf:"bytes,2,rep,name=storage_keys,json=storageKeys,proto3" json:"storageKeys"` -} - -func (m *V4AccessTuple) Reset() { *m = V4AccessTuple{} } -func (m *V4AccessTuple) String() string { return proto.CompactTextString(m) } -func (*V4AccessTuple) ProtoMessage() {} -func (*V4AccessTuple) Descriptor() ([]byte, []int) { - return fileDescriptor_d21ecc92c8c8583e, []int{7} -} - -func (m *V4AccessTuple) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *V4AccessTuple) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_V4AccessTuple.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} - -func (m *V4AccessTuple) XXX_Merge(src proto.Message) { - xxx_messageInfo_V4AccessTuple.Merge(m, src) -} - -func (m *V4AccessTuple) XXX_Size() int { - return m.Size() -} - -func (m *V4AccessTuple) XXX_DiscardUnknown() { - xxx_messageInfo_V4AccessTuple.DiscardUnknown(m) -} - -var xxx_messageInfo_V4AccessTuple proto.InternalMessageInfo - -// V4TraceConfig holds extra parameters to trace functions. -type V4TraceConfig struct { - // tracer is a custom javascript tracer - Tracer string `protobuf:"bytes,1,opt,name=tracer,proto3" json:"tracer,omitempty"` - // timeout overrides the default timeout of 5 seconds for JavaScript-based tracing - // calls - Timeout string `protobuf:"bytes,2,opt,name=timeout,proto3" json:"timeout,omitempty"` - // reexec defines the number of blocks the tracer is willing to go back - Reexec uint64 `protobuf:"varint,3,opt,name=reexec,proto3" json:"reexec,omitempty"` - // disable_stack switches stack capture - DisableStack bool `protobuf:"varint,5,opt,name=disable_stack,json=disableStack,proto3" json:"disableStack"` - // disable_storage switches storage capture - DisableStorage bool `protobuf:"varint,6,opt,name=disable_storage,json=disableStorage,proto3" json:"disableStorage"` - // debug can be used to print output during capture end - Debug bool `protobuf:"varint,8,opt,name=debug,proto3" json:"debug,omitempty"` - // limit defines the maximum length of output, but zero means unlimited - Limit int32 `protobuf:"varint,9,opt,name=limit,proto3" json:"limit,omitempty"` - // overrides can be used to execute a trace using future fork rules - Overrides *V4ChainConfig `protobuf:"bytes,10,opt,name=overrides,proto3" json:"overrides,omitempty"` - // enable_memory switches memory capture - EnableMemory bool `protobuf:"varint,11,opt,name=enable_memory,json=enableMemory,proto3" json:"enableMemory"` - // enable_return_data switches the capture of return data - EnableReturnData bool `protobuf:"varint,12,opt,name=enable_return_data,json=enableReturnData,proto3" json:"enableReturnData"` - // tracer_json_config configures the tracer using a JSON string - TracerJsonConfig string `protobuf:"bytes,13,opt,name=tracer_json_config,json=tracerJsonConfig,proto3" json:"tracerConfig"` -} - -func (m *V4TraceConfig) Reset() { *m = V4TraceConfig{} } -func (m *V4TraceConfig) String() string { return proto.CompactTextString(m) } -func (*V4TraceConfig) ProtoMessage() {} -func (*V4TraceConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_d21ecc92c8c8583e, []int{8} -} - -func (m *V4TraceConfig) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *V4TraceConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_V4TraceConfig.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} - -func (m *V4TraceConfig) XXX_Merge(src proto.Message) { - xxx_messageInfo_V4TraceConfig.Merge(m, src) -} - -func (m *V4TraceConfig) XXX_Size() int { - return m.Size() -} - -func (m *V4TraceConfig) XXX_DiscardUnknown() { - xxx_messageInfo_V4TraceConfig.DiscardUnknown(m) -} - -var xxx_messageInfo_V4TraceConfig proto.InternalMessageInfo - -func (m *V4TraceConfig) GetTracer() string { - if m != nil { - return m.Tracer - } - return "" -} - -func (m *V4TraceConfig) GetTimeout() string { - if m != nil { - return m.Timeout - } - return "" -} - -func (m *V4TraceConfig) GetReexec() uint64 { - if m != nil { - return m.Reexec - } - return 0 -} - -func (m *V4TraceConfig) GetDisableStack() bool { - if m != nil { - return m.DisableStack - } - return false -} - -func (m *V4TraceConfig) GetDisableStorage() bool { - if m != nil { - return m.DisableStorage - } - return false -} - -func (m *V4TraceConfig) GetDebug() bool { - if m != nil { - return m.Debug - } - return false -} - -func (m *V4TraceConfig) GetLimit() int32 { - if m != nil { - return m.Limit - } - return 0 -} - -func (m *V4TraceConfig) GetOverrides() *V4ChainConfig { - if m != nil { - return m.Overrides - } - return nil -} - -func (m *V4TraceConfig) GetEnableMemory() bool { - if m != nil { - return m.EnableMemory - } - return false -} - -func (m *V4TraceConfig) GetEnableReturnData() bool { - if m != nil { - return m.EnableReturnData - } - return false -} - -func (m *V4TraceConfig) GetTracerJsonConfig() string { - if m != nil { - return m.TracerJsonConfig - } - return "" -} - -func init() { - proto.RegisterType((*V4Params)(nil), "ethermint.evm.v1.V4Params") - proto.RegisterType((*ExtraEIPs)(nil), "ethermint.evm.v1.ExtraEIPs") - proto.RegisterType((*V4ChainConfig)(nil), "ethermint.evm.v1.V4ChainConfig") - proto.RegisterType((*V4State)(nil), "ethermint.evm.v1.V4State") - proto.RegisterType((*TransactionV4Logs)(nil), "ethermint.evm.v1.TransactionV4Logs") - proto.RegisterType((*V4Log)(nil), "ethermint.evm.v1.V4Log") - proto.RegisterType((*V4TxResult)(nil), "ethermint.evm.v1.V4TxResult") - proto.RegisterType((*V4AccessTuple)(nil), "ethermint.evm.v1.V4AccessTuple") - proto.RegisterType((*V4TraceConfig)(nil), "ethermint.evm.v1.V4TraceConfig") -} - -func init() { proto.RegisterFile("ethermint/evm/v1/evm.proto", fileDescriptor_d21ecc92c8c8583e) } - -var fileDescriptor_d21ecc92c8c8583e = []byte{ - // 1644 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x58, 0x4f, 0x6f, 0xe3, 0xc6, - 0x15, 0xb7, 0x2d, 0xda, 0xa6, 0x46, 0xb2, 0x44, 0x8f, 0xb5, 0x5e, 0x65, 0x17, 0x35, 0x5d, 0x1e, - 0x02, 0x17, 0x4d, 0xec, 0xd8, 0x81, 0xd1, 0x45, 0x82, 0x16, 0x5d, 0xed, 0x3a, 0x89, 0xdd, 0x6d, - 0x6a, 0x8c, 0x1d, 0x14, 0x28, 0x50, 0x10, 0x23, 0x72, 0x42, 0x31, 0x26, 0x39, 0xc2, 0xcc, 0x50, - 0x2b, 0xb5, 0xfd, 0x00, 0x05, 0x7a, 0xe9, 0x27, 0x28, 0x72, 0xee, 0x27, 0x09, 0x7a, 0xda, 0x63, - 0xd1, 0x03, 0x51, 0x78, 0x6f, 0x3e, 0xea, 0x13, 0x14, 0xf3, 0x47, 0xd4, 0x1f, 0x1b, 0x6d, 0xad, - 0x93, 0xe7, 0xf7, 0xde, 0x9b, 0xdf, 0x6f, 0xde, 0x9b, 0x37, 0x9e, 0xa1, 0xc0, 0x33, 0x22, 0x7a, - 0x84, 0xa5, 0x71, 0x26, 0x8e, 0xc8, 0x20, 0x3d, 0x1a, 0x1c, 0xcb, 0x3f, 0x87, 0x7d, 0x46, 0x05, - 0x85, 0x4e, 0xe9, 0x3b, 0x94, 0xc6, 0xc1, 0xf1, 0xb3, 0x56, 0x44, 0x23, 0xaa, 0x9c, 0x47, 0x72, - 0xa4, 0xe3, 0xbc, 0xbf, 0x57, 0xc0, 0xc6, 0x25, 0x66, 0x38, 0xe5, 0xf0, 0x18, 0x54, 0xc9, 0x20, - 0xf5, 0x43, 0x92, 0xd1, 0xb4, 0xbd, 0xba, 0xbf, 0x7a, 0x50, 0xed, 0xb4, 0xc6, 0x85, 0xeb, 0x8c, - 0x70, 0x9a, 0x7c, 0xe6, 0x95, 0x2e, 0x0f, 0xd9, 0x64, 0x90, 0xbe, 0x96, 0x43, 0xf8, 0x73, 0xb0, - 0x45, 0x32, 0xdc, 0x4d, 0x88, 0x1f, 0x30, 0x82, 0x05, 0x69, 0xaf, 0xed, 0xaf, 0x1e, 0xd8, 0x9d, - 0xf6, 0xb8, 0x70, 0x5b, 0x66, 0xda, 0xac, 0xdb, 0x43, 0x75, 0x8d, 0x5f, 0x29, 0x08, 0x7f, 0x06, - 0x6a, 0x13, 0x3f, 0x4e, 0x92, 0x76, 0x45, 0x4d, 0xde, 0x1d, 0x17, 0x2e, 0x9c, 0x9f, 0x8c, 0x93, - 0xc4, 0x43, 0xc0, 0x4c, 0xc5, 0x49, 0x02, 0xbb, 0x00, 0x90, 0xa1, 0x60, 0xd8, 0x27, 0x71, 0x9f, - 0xb7, 0xad, 0xfd, 0xd5, 0x83, 0xda, 0xc9, 0xf3, 0xc3, 0xc5, 0x94, 0x0f, 0xcf, 0x64, 0xcc, 0xd9, - 0xf9, 0x25, 0xef, 0x7c, 0xf8, 0x43, 0xe1, 0xae, 0xdc, 0x16, 0x6e, 0xb5, 0x34, 0x8d, 0x0b, 0x77, - 0xdb, 0xa8, 0x94, 0x4c, 0x1e, 0xaa, 0x2a, 0x70, 0x16, 0xf7, 0x39, 0xfc, 0x3d, 0xa8, 0x07, 0x3d, - 0x1c, 0x67, 0x7e, 0x40, 0xb3, 0x6f, 0xe3, 0xa8, 0xbd, 0xae, 0x54, 0x7e, 0x74, 0x5f, 0xe5, 0x95, - 0x8c, 0x7a, 0xa5, 0x82, 0x3a, 0xcf, 0xa5, 0xce, 0xb8, 0x70, 0x77, 0x34, 0xf5, 0x2c, 0x81, 0x87, - 0x6a, 0xc1, 0x34, 0x12, 0x9e, 0x80, 0x27, 0x38, 0x49, 0xe8, 0x5b, 0x3f, 0xcf, 0xe4, 0x4e, 0x90, - 0x40, 0x90, 0xd0, 0x17, 0x43, 0xde, 0xde, 0x90, 0x55, 0x40, 0x3b, 0xca, 0xf9, 0xcd, 0xd4, 0x77, - 0x3d, 0xe4, 0xde, 0x0b, 0x30, 0x5d, 0x3f, 0xfc, 0x29, 0xb0, 0x54, 0xf6, 0xab, 0xfb, 0x95, 0x83, - 0x4a, 0xe7, 0xe9, 0x6d, 0xe1, 0x5a, 0x26, 0xaf, 0x9a, 0xc9, 0x4b, 0x65, 0xa4, 0x82, 0xbc, 0xbf, - 0x6d, 0x83, 0xda, 0xcc, 0x3a, 0x61, 0x0a, 0x9a, 0x3d, 0x9a, 0x12, 0x2e, 0x08, 0x0e, 0xfd, 0x6e, - 0x42, 0x83, 0x1b, 0xb3, 0xe3, 0xaf, 0xff, 0x55, 0xb8, 0x1f, 0x46, 0xb1, 0xe8, 0xe5, 0xdd, 0xc3, - 0x80, 0xa6, 0x47, 0x01, 0xe5, 0x29, 0xe5, 0xe6, 0xcf, 0xc7, 0x3c, 0xbc, 0x39, 0x12, 0xa3, 0x3e, - 0xe1, 0x87, 0xe7, 0x99, 0x18, 0x17, 0xee, 0xae, 0x56, 0x5a, 0xa0, 0xf2, 0x50, 0xa3, 0xb4, 0x74, - 0xa4, 0x01, 0x8e, 0x40, 0x23, 0xc4, 0xd4, 0xff, 0x96, 0xb2, 0x1b, 0xa3, 0xb6, 0xa6, 0xd4, 0xae, - 0xfe, 0x7f, 0xb5, 0xdb, 0xc2, 0xad, 0xbf, 0x7e, 0xf9, 0x9b, 0x2f, 0x28, 0xbb, 0x51, 0x9c, 0xe3, - 0xc2, 0x7d, 0xa2, 0xd5, 0xe7, 0x99, 0x3d, 0x54, 0x0f, 0x31, 0x2d, 0xc3, 0xe0, 0x6f, 0x81, 0x53, - 0x06, 0xf0, 0xbc, 0xdf, 0xa7, 0x4c, 0x98, 0x46, 0xfb, 0xf8, 0xb6, 0x70, 0x1b, 0x86, 0xf2, 0x4a, - 0x7b, 0xc6, 0x85, 0xfb, 0x74, 0x81, 0xd4, 0xcc, 0xf1, 0x50, 0xc3, 0xd0, 0x9a, 0x50, 0xc8, 0x41, - 0x9d, 0xc4, 0xfd, 0xe3, 0xd3, 0x4f, 0x4c, 0x46, 0x96, 0xca, 0xe8, 0xf2, 0x51, 0x19, 0xd5, 0xce, - 0xce, 0x2f, 0x8f, 0x4f, 0x3f, 0x99, 0x24, 0xb4, 0x53, 0x6e, 0x5c, 0x49, 0xeb, 0xa1, 0x9a, 0x86, - 0x3a, 0x9b, 0x73, 0x60, 0xa0, 0xdf, 0xc3, 0xbc, 0xa7, 0x7a, 0xb2, 0xda, 0x39, 0xb8, 0x2d, 0x5c, - 0xa0, 0x99, 0xbe, 0xc2, 0xbc, 0x37, 0xdd, 0x97, 0xee, 0xe8, 0x0f, 0x38, 0x13, 0x71, 0x9e, 0x4e, - 0xb8, 0x80, 0x9e, 0x2c, 0xa3, 0xca, 0xf5, 0x9f, 0x9a, 0xf5, 0x6f, 0x2c, 0xbd, 0xfe, 0xd3, 0x87, - 0xd6, 0x7f, 0x3a, 0xbf, 0x7e, 0x1d, 0x53, 0x8a, 0xbe, 0x30, 0xa2, 0x9b, 0x4b, 0x8b, 0xbe, 0x78, - 0x48, 0xf4, 0xc5, 0xbc, 0xa8, 0x8e, 0x91, 0xcd, 0xbe, 0x50, 0x89, 0xb6, 0xbd, 0x7c, 0xb3, 0xdf, - 0x2b, 0x6a, 0xa3, 0xb4, 0x68, 0xb9, 0x3f, 0x81, 0x56, 0x40, 0x33, 0x2e, 0xa4, 0x2d, 0xa3, 0xfd, - 0x84, 0x18, 0xcd, 0xaa, 0xd2, 0x3c, 0x7f, 0x94, 0xe6, 0x73, 0xf3, 0x7f, 0xe4, 0x01, 0x3e, 0x0f, - 0xed, 0xcc, 0x9b, 0xb5, 0x7a, 0x1f, 0x38, 0x7d, 0x22, 0x08, 0xe3, 0xdd, 0x9c, 0x45, 0x46, 0x19, - 0x28, 0xe5, 0xb3, 0x47, 0x29, 0x9b, 0x73, 0xb0, 0xc8, 0xe5, 0xa1, 0xe6, 0xd4, 0xa4, 0x15, 0xbf, - 0x03, 0x8d, 0x58, 0x2e, 0xa3, 0x9b, 0x27, 0x46, 0xaf, 0xa6, 0xf4, 0x5e, 0x3d, 0x4a, 0xcf, 0x1c, - 0xe6, 0x79, 0x26, 0x0f, 0x6d, 0x4d, 0x0c, 0x5a, 0x2b, 0x07, 0x30, 0xcd, 0x63, 0xe6, 0x47, 0x09, - 0x0e, 0x62, 0xc2, 0x8c, 0x5e, 0x5d, 0xe9, 0x7d, 0xf9, 0x28, 0xbd, 0x0f, 0xb4, 0xde, 0x7d, 0x36, - 0x0f, 0x39, 0xd2, 0xf8, 0xa5, 0xb6, 0x69, 0xd9, 0x10, 0xd4, 0xbb, 0x84, 0x25, 0x71, 0x66, 0x04, - 0xb7, 0x94, 0xe0, 0xcb, 0x47, 0x09, 0x9a, 0x3e, 0x9d, 0xe5, 0xf1, 0x50, 0x4d, 0xc3, 0x52, 0x25, - 0xa1, 0x59, 0x48, 0x27, 0x2a, 0xdb, 0xcb, 0xab, 0xcc, 0xf2, 0x78, 0xa8, 0xa6, 0xa1, 0x56, 0x19, - 0x82, 0x1d, 0xcc, 0x18, 0x7d, 0xbb, 0x50, 0x43, 0xa8, 0xc4, 0xbe, 0x7a, 0x94, 0xd8, 0x33, 0x2d, - 0xf6, 0x00, 0x9d, 0x87, 0xb6, 0x95, 0x75, 0xae, 0x8a, 0x39, 0x80, 0x11, 0xc3, 0xa3, 0x05, 0xe1, - 0xd6, 0xf2, 0x9b, 0x77, 0x9f, 0xcd, 0x43, 0x8e, 0x34, 0xce, 0xc9, 0xfe, 0x11, 0xb4, 0x52, 0xc2, - 0x22, 0xe2, 0x67, 0x44, 0xf0, 0x7e, 0x12, 0x0b, 0x23, 0xfc, 0x64, 0xf9, 0xf3, 0xf8, 0x10, 0x9f, - 0x87, 0xa0, 0x32, 0x7f, 0x6d, 0xac, 0xe5, 0xe1, 0xe0, 0x3d, 0x9c, 0x45, 0x3d, 0x1c, 0x1b, 0xd9, - 0xdd, 0xe5, 0x0f, 0xc7, 0x3c, 0x93, 0x87, 0xb6, 0x26, 0x86, 0xb2, 0x7f, 0x02, 0x9c, 0x05, 0xf9, - 0xa4, 0x7f, 0x9e, 0x2e, 0xdf, 0x3f, 0xb3, 0x3c, 0xf2, 0xe1, 0xa2, 0xa0, 0x52, 0xb9, 0xb0, 0xec, - 0x86, 0xd3, 0xbc, 0xb0, 0xec, 0xa6, 0xe3, 0x5c, 0x58, 0xb6, 0xe3, 0x6c, 0x5f, 0x58, 0xf6, 0x8e, - 0xd3, 0x42, 0x5b, 0x23, 0x9a, 0x50, 0x7f, 0xf0, 0xa9, 0x9e, 0x84, 0x6a, 0xe4, 0x2d, 0xe6, 0xe6, - 0x7f, 0x24, 0x6a, 0x04, 0x58, 0xe0, 0x64, 0xc4, 0x4d, 0xa9, 0x90, 0xa3, 0x0b, 0x38, 0x73, 0x6b, - 0x1f, 0x81, 0xf5, 0x2b, 0x21, 0xdf, 0x84, 0x0e, 0xa8, 0xdc, 0x90, 0x91, 0x7e, 0x8d, 0x20, 0x39, - 0x84, 0x2d, 0xb0, 0x3e, 0xc0, 0x49, 0xae, 0x1f, 0x97, 0x55, 0xa4, 0x81, 0x77, 0x09, 0x9a, 0xd7, - 0x0c, 0x67, 0x1c, 0x07, 0x22, 0xa6, 0xd9, 0x1b, 0x1a, 0x71, 0x08, 0x81, 0xa5, 0x6e, 0x45, 0x3d, - 0x57, 0x8d, 0xe1, 0x4f, 0x80, 0x95, 0xd0, 0x88, 0xb7, 0xd7, 0xf6, 0x2b, 0x07, 0xb5, 0x93, 0x27, - 0xf7, 0x5f, 0x6f, 0x6f, 0x68, 0x84, 0x54, 0x88, 0xf7, 0x8f, 0x35, 0x50, 0x79, 0x43, 0x23, 0xd8, - 0x06, 0x9b, 0x38, 0x0c, 0x19, 0xe1, 0xdc, 0x30, 0x4d, 0x20, 0xdc, 0x05, 0x1b, 0x82, 0xf6, 0xe3, - 0x40, 0xd3, 0x55, 0x91, 0x41, 0x52, 0x38, 0xc4, 0x02, 0xab, 0x77, 0x45, 0x1d, 0xa9, 0x31, 0x3c, - 0x01, 0x75, 0x95, 0x99, 0x9f, 0xe5, 0x69, 0x97, 0x30, 0xf5, 0x3c, 0xb0, 0x3a, 0xcd, 0xbb, 0xc2, - 0xad, 0x29, 0xfb, 0xd7, 0xca, 0x8c, 0x66, 0x01, 0xfc, 0x08, 0x6c, 0x8a, 0xe1, 0xec, 0xcd, 0xbe, - 0x73, 0x57, 0xb8, 0x4d, 0x31, 0x4d, 0x53, 0x5e, 0xdc, 0x68, 0x43, 0x0c, 0xd5, 0x05, 0x7e, 0x04, - 0x6c, 0x31, 0xf4, 0xe3, 0x2c, 0x24, 0x43, 0x75, 0x79, 0x5b, 0x9d, 0xd6, 0x5d, 0xe1, 0x3a, 0x33, - 0xe1, 0xe7, 0xd2, 0x87, 0x36, 0xc5, 0x50, 0x0d, 0xe0, 0x47, 0x00, 0xe8, 0x25, 0x29, 0x05, 0x7d, - 0xf5, 0x6e, 0xdd, 0x15, 0x6e, 0x55, 0x59, 0x15, 0xf7, 0x74, 0x08, 0x3d, 0xb0, 0xae, 0xb9, 0x6d, - 0xc5, 0x5d, 0xbf, 0x2b, 0x5c, 0x3b, 0xa1, 0x91, 0xe6, 0xd4, 0x2e, 0x59, 0x2a, 0x46, 0x52, 0x3a, - 0x20, 0xa1, 0xba, 0xdd, 0x6c, 0x34, 0x81, 0xde, 0x5f, 0xd6, 0x80, 0x7d, 0x3d, 0x44, 0x84, 0xe7, - 0x89, 0x80, 0x5f, 0x00, 0x27, 0xa0, 0x99, 0x60, 0x38, 0x10, 0xfe, 0x5c, 0x69, 0x3b, 0xcf, 0xa7, - 0x37, 0xcd, 0x62, 0x84, 0x87, 0x9a, 0x13, 0xd3, 0x4b, 0x53, 0xff, 0x16, 0x58, 0xef, 0x26, 0x94, - 0xa6, 0xaa, 0x13, 0xea, 0x48, 0x03, 0x88, 0x54, 0xd5, 0xd4, 0x2e, 0x57, 0xd4, 0x1b, 0xfd, 0xc7, - 0xf7, 0x77, 0x79, 0xa1, 0x55, 0x3a, 0xbb, 0xe6, 0x9d, 0xde, 0xd0, 0xda, 0x66, 0xbe, 0x27, 0x6b, - 0xab, 0x5a, 0xc9, 0x01, 0x15, 0x46, 0x84, 0xda, 0xb4, 0x3a, 0x92, 0x43, 0xf8, 0x0c, 0xd8, 0x8c, - 0x0c, 0x08, 0x13, 0x24, 0x54, 0x9b, 0x63, 0xa3, 0x12, 0xc3, 0x0f, 0x80, 0x1d, 0x61, 0xee, 0xe7, - 0x9c, 0x84, 0x7a, 0x27, 0xd0, 0x66, 0x84, 0xf9, 0x37, 0x9c, 0x84, 0x9f, 0x59, 0x7f, 0xfe, 0xde, - 0x5d, 0xf1, 0x30, 0xa8, 0xbd, 0x0c, 0x02, 0xc2, 0xf9, 0x75, 0xde, 0x4f, 0xc8, 0x7f, 0xe9, 0xb0, - 0x13, 0x50, 0xe7, 0x82, 0x32, 0x1c, 0x11, 0xff, 0x86, 0x8c, 0x4c, 0x9f, 0xe9, 0xae, 0x31, 0xf6, - 0x5f, 0x91, 0x11, 0x47, 0xb3, 0xc0, 0x48, 0x7c, 0x6f, 0x81, 0xda, 0x35, 0xc3, 0x01, 0x31, 0x2f, - 0x7c, 0xd9, 0xab, 0x12, 0x32, 0x23, 0x61, 0x90, 0xd4, 0x16, 0x71, 0x4a, 0x68, 0x2e, 0xcc, 0x79, - 0x9a, 0x40, 0x39, 0x83, 0x11, 0x32, 0x24, 0x81, 0x2a, 0xa3, 0x85, 0x0c, 0x82, 0xa7, 0x60, 0x2b, - 0x8c, 0xb9, 0xfa, 0x12, 0xe3, 0x02, 0x07, 0x37, 0x3a, 0xfd, 0x8e, 0x73, 0x57, 0xb8, 0x75, 0xe3, - 0xb8, 0x92, 0x76, 0x34, 0x87, 0xe0, 0xe7, 0xa0, 0x39, 0x9d, 0xa6, 0x56, 0xab, 0x3f, 0x6d, 0x3a, - 0xf0, 0xae, 0x70, 0x1b, 0x65, 0xa8, 0xf2, 0xa0, 0x05, 0x2c, 0x77, 0x3a, 0x24, 0xdd, 0x3c, 0x52, - 0xcd, 0x67, 0x23, 0x0d, 0xa4, 0x35, 0x89, 0xd3, 0x58, 0xa8, 0x66, 0x5b, 0x47, 0x1a, 0xc0, 0xcf, - 0x41, 0x95, 0x0e, 0x08, 0x63, 0x71, 0x48, 0xb8, 0x7a, 0xea, 0xfc, 0xaf, 0xaf, 0x34, 0x34, 0x8d, - 0x97, 0xc9, 0x99, 0xaf, 0xcc, 0x94, 0xa4, 0x94, 0x8d, 0xd4, 0xdb, 0xc5, 0x24, 0xa7, 0x1d, 0xbf, - 0x56, 0x76, 0x34, 0x87, 0x60, 0x07, 0x40, 0x33, 0x8d, 0x11, 0x91, 0xb3, 0xcc, 0x57, 0xe7, 0xbf, - 0xae, 0xe6, 0xaa, 0x53, 0xa8, 0xbd, 0x48, 0x39, 0x5f, 0x63, 0x81, 0xd1, 0x3d, 0x0b, 0xfc, 0x05, - 0x80, 0x7a, 0x4f, 0xfc, 0xef, 0x38, 0x2d, 0x3f, 0x33, 0xf5, 0xd3, 0x42, 0xe9, 0x6b, 0xaf, 0x59, - 0xb3, 0xa3, 0xd1, 0x05, 0xa7, 0x26, 0x8b, 0x0b, 0xcb, 0xb6, 0x9c, 0xf5, 0x0b, 0xcb, 0xde, 0x74, - 0xec, 0xb2, 0x7e, 0x26, 0x0b, 0xb4, 0x33, 0xc1, 0x33, 0xcb, 0xeb, 0xfc, 0xf2, 0x87, 0xdb, 0xbd, - 0xd5, 0x77, 0xb7, 0x7b, 0xab, 0xff, 0xbe, 0xdd, 0x5b, 0xfd, 0xeb, 0xfb, 0xbd, 0x95, 0x77, 0xef, - 0xf7, 0x56, 0xfe, 0xf9, 0x7e, 0x6f, 0xe5, 0x77, 0xb3, 0xf7, 0x03, 0x19, 0xc8, 0xeb, 0x61, 0xfa, - 0xd3, 0xc2, 0x50, 0xfd, 0xb8, 0xa0, 0xee, 0x88, 0xee, 0x86, 0xfa, 0xd1, 0xe0, 0xd3, 0xff, 0x04, - 0x00, 0x00, 0xff, 0xff, 0x68, 0xce, 0x8e, 0x23, 0x7a, 0x10, 0x00, 0x00, -} - -func (m *V4Params) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *V4Params) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *V4Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.AllowUnprotectedTxs { - i-- - if m.AllowUnprotectedTxs { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x30 - } - { - size, err := m.V4ChainConfig.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - { - size, err := m.ExtraEIPs.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - if m.EnableCall { - i-- - if m.EnableCall { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x18 - } - if m.EnableCreate { - i-- - if m.EnableCreate { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 - } - if len(m.EvmDenom) > 0 { - i -= len(m.EvmDenom) - copy(dAtA[i:], m.EvmDenom) - i = encodeVarintEvm(dAtA, i, uint64(len(m.EvmDenom))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ExtraEIPs) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ExtraEIPs) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ExtraEIPs) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.EIPs) > 0 { - dAtA4 := make([]byte, len(m.EIPs)*10) - var j3 int - for _, num1 := range m.EIPs { - num := uint64(num1) - for num >= 1<<7 { - dAtA4[j3] = uint8(uint64(num)&0x7f | 0x80) - num >>= 7 - j3++ - } - dAtA4[j3] = uint8(num) - j3++ - } - i -= j3 - copy(dAtA[i:], dAtA4[:j3]) - i = encodeVarintEvm(dAtA, i, uint64(j3)) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *V4ChainConfig) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *V4ChainConfig) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *V4ChainConfig) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.CancunBlock != nil { - { - size := m.CancunBlock.Size() - i -= size - if _, err := m.CancunBlock.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0xba - } - if m.ShanghaiBlock != nil { - { - size := m.ShanghaiBlock.Size() - i -= size - if _, err := m.ShanghaiBlock.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0xb2 - } - if m.MergeNetsplitBlock != nil { - { - size := m.MergeNetsplitBlock.Size() - i -= size - if _, err := m.MergeNetsplitBlock.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0xaa - } - if m.GrayGlacierBlock != nil { - { - size := m.GrayGlacierBlock.Size() - i -= size - if _, err := m.GrayGlacierBlock.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0xa2 - } - if m.ArrowGlacierBlock != nil { - { - size := m.ArrowGlacierBlock.Size() - i -= size - if _, err := m.ArrowGlacierBlock.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0x92 - } - if m.LondonBlock != nil { - { - size := m.LondonBlock.Size() - i -= size - if _, err := m.LondonBlock.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0x8a - } - if m.BerlinBlock != nil { - { - size := m.BerlinBlock.Size() - i -= size - if _, err := m.BerlinBlock.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x6a - } - if m.MuirGlacierBlock != nil { - { - size := m.MuirGlacierBlock.Size() - i -= size - if _, err := m.MuirGlacierBlock.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x62 - } - if m.IstanbulBlock != nil { - { - size := m.IstanbulBlock.Size() - i -= size - if _, err := m.IstanbulBlock.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x5a - } - if m.PetersburgBlock != nil { - { - size := m.PetersburgBlock.Size() - i -= size - if _, err := m.PetersburgBlock.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x52 - } - if m.ConstantinopleBlock != nil { - { - size := m.ConstantinopleBlock.Size() - i -= size - if _, err := m.ConstantinopleBlock.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x4a - } - if m.ByzantiumBlock != nil { - { - size := m.ByzantiumBlock.Size() - i -= size - if _, err := m.ByzantiumBlock.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x42 - } - if m.EIP158Block != nil { - { - size := m.EIP158Block.Size() - i -= size - if _, err := m.EIP158Block.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a - } - if m.EIP155Block != nil { - { - size := m.EIP155Block.Size() - i -= size - if _, err := m.EIP155Block.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - } - if len(m.EIP150Hash) > 0 { - i -= len(m.EIP150Hash) - copy(dAtA[i:], m.EIP150Hash) - i = encodeVarintEvm(dAtA, i, uint64(len(m.EIP150Hash))) - i-- - dAtA[i] = 0x2a - } - if m.EIP150Block != nil { - { - size := m.EIP150Block.Size() - i -= size - if _, err := m.EIP150Block.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - if m.DAOForkSupport { - i-- - if m.DAOForkSupport { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x18 - } - if m.DAOForkBlock != nil { - { - size := m.DAOForkBlock.Size() - i -= size - if _, err := m.DAOForkBlock.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if m.HomesteadBlock != nil { - { - size := m.HomesteadBlock.Size() - i -= size - if _, err := m.HomesteadBlock.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *V4State) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *V4State) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *V4State) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Value) > 0 { - i -= len(m.Value) - copy(dAtA[i:], m.Value) - i = encodeVarintEvm(dAtA, i, uint64(len(m.Value))) - i-- - dAtA[i] = 0x12 - } - if len(m.Key) > 0 { - i -= len(m.Key) - copy(dAtA[i:], m.Key) - i = encodeVarintEvm(dAtA, i, uint64(len(m.Key))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *TransactionV4Logs) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *TransactionV4Logs) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TransactionV4Logs) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.V4Logs) > 0 { - for iNdEx := len(m.V4Logs) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.V4Logs[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.Hash) > 0 { - i -= len(m.Hash) - copy(dAtA[i:], m.Hash) - i = encodeVarintEvm(dAtA, i, uint64(len(m.Hash))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *V4Log) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *V4Log) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *V4Log) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Removed { - i-- - if m.Removed { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x48 - } - if m.Index != 0 { - i = encodeVarintEvm(dAtA, i, uint64(m.Index)) - i-- - dAtA[i] = 0x40 - } - if len(m.BlockHash) > 0 { - i -= len(m.BlockHash) - copy(dAtA[i:], m.BlockHash) - i = encodeVarintEvm(dAtA, i, uint64(len(m.BlockHash))) - i-- - dAtA[i] = 0x3a - } - if m.TxIndex != 0 { - i = encodeVarintEvm(dAtA, i, uint64(m.TxIndex)) - i-- - dAtA[i] = 0x30 - } - if len(m.TxHash) > 0 { - i -= len(m.TxHash) - copy(dAtA[i:], m.TxHash) - i = encodeVarintEvm(dAtA, i, uint64(len(m.TxHash))) - i-- - dAtA[i] = 0x2a - } - if m.BlockNumber != 0 { - i = encodeVarintEvm(dAtA, i, uint64(m.BlockNumber)) - i-- - dAtA[i] = 0x20 - } - if len(m.Data) > 0 { - i -= len(m.Data) - copy(dAtA[i:], m.Data) - i = encodeVarintEvm(dAtA, i, uint64(len(m.Data))) - i-- - dAtA[i] = 0x1a - } - if len(m.Topics) > 0 { - for iNdEx := len(m.Topics) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Topics[iNdEx]) - copy(dAtA[i:], m.Topics[iNdEx]) - i = encodeVarintEvm(dAtA, i, uint64(len(m.Topics[iNdEx]))) - i-- - dAtA[i] = 0x12 - } - } - if len(m.Address) > 0 { - i -= len(m.Address) - copy(dAtA[i:], m.Address) - i = encodeVarintEvm(dAtA, i, uint64(len(m.Address))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *V4TxResult) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *V4TxResult) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *V4TxResult) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.GasUsed != 0 { - i = encodeVarintEvm(dAtA, i, uint64(m.GasUsed)) - i-- - dAtA[i] = 0x30 - } - if m.Reverted { - i-- - if m.Reverted { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x28 - } - if len(m.Ret) > 0 { - i -= len(m.Ret) - copy(dAtA[i:], m.Ret) - i = encodeVarintEvm(dAtA, i, uint64(len(m.Ret))) - i-- - dAtA[i] = 0x22 - } - { - size, err := m.TxV4Logs.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - if len(m.Bloom) > 0 { - i -= len(m.Bloom) - copy(dAtA[i:], m.Bloom) - i = encodeVarintEvm(dAtA, i, uint64(len(m.Bloom))) - i-- - dAtA[i] = 0x12 - } - if len(m.ContractAddress) > 0 { - i -= len(m.ContractAddress) - copy(dAtA[i:], m.ContractAddress) - i = encodeVarintEvm(dAtA, i, uint64(len(m.ContractAddress))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *V4AccessTuple) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *V4AccessTuple) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *V4AccessTuple) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.StorageKeys) > 0 { - for iNdEx := len(m.StorageKeys) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.StorageKeys[iNdEx]) - copy(dAtA[i:], m.StorageKeys[iNdEx]) - i = encodeVarintEvm(dAtA, i, uint64(len(m.StorageKeys[iNdEx]))) - i-- - dAtA[i] = 0x12 - } - } - if len(m.Address) > 0 { - i -= len(m.Address) - copy(dAtA[i:], m.Address) - i = encodeVarintEvm(dAtA, i, uint64(len(m.Address))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *V4TraceConfig) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *V4TraceConfig) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *V4TraceConfig) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.TracerJsonConfig) > 0 { - i -= len(m.TracerJsonConfig) - copy(dAtA[i:], m.TracerJsonConfig) - i = encodeVarintEvm(dAtA, i, uint64(len(m.TracerJsonConfig))) - i-- - dAtA[i] = 0x6a - } - if m.EnableReturnData { - i-- - if m.EnableReturnData { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x60 - } - if m.EnableMemory { - i-- - if m.EnableMemory { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x58 - } - if m.Overrides != nil { - { - size, err := m.Overrides.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x52 - } - if m.Limit != 0 { - i = encodeVarintEvm(dAtA, i, uint64(m.Limit)) - i-- - dAtA[i] = 0x48 - } - if m.Debug { - i-- - if m.Debug { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x40 - } - if m.DisableStorage { - i-- - if m.DisableStorage { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x30 - } - if m.DisableStack { - i-- - if m.DisableStack { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x28 - } - if m.Reexec != 0 { - i = encodeVarintEvm(dAtA, i, uint64(m.Reexec)) - i-- - dAtA[i] = 0x18 - } - if len(m.Timeout) > 0 { - i -= len(m.Timeout) - copy(dAtA[i:], m.Timeout) - i = encodeVarintEvm(dAtA, i, uint64(len(m.Timeout))) - i-- - dAtA[i] = 0x12 - } - if len(m.Tracer) > 0 { - i -= len(m.Tracer) - copy(dAtA[i:], m.Tracer) - i = encodeVarintEvm(dAtA, i, uint64(len(m.Tracer))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func encodeVarintEvm(dAtA []byte, offset int, v uint64) int { - offset -= sovEvm(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} - -func (m *V4Params) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.EvmDenom) - if l > 0 { - n += 1 + l + sovEvm(uint64(l)) - } - if m.EnableCreate { - n += 2 - } - if m.EnableCall { - n += 2 - } - l = m.ExtraEIPs.Size() - n += 1 + l + sovEvm(uint64(l)) - l = m.V4ChainConfig.Size() - n += 1 + l + sovEvm(uint64(l)) - if m.AllowUnprotectedTxs { - n += 2 - } - return n -} - -func (m *ExtraEIPs) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.EIPs) > 0 { - l = 0 - for _, e := range m.EIPs { - l += sovEvm(uint64(e)) - } - n += 1 + sovEvm(uint64(l)) + l - } - return n -} - -func (m *V4ChainConfig) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.HomesteadBlock != nil { - l = m.HomesteadBlock.Size() - n += 1 + l + sovEvm(uint64(l)) - } - if m.DAOForkBlock != nil { - l = m.DAOForkBlock.Size() - n += 1 + l + sovEvm(uint64(l)) - } - if m.DAOForkSupport { - n += 2 - } - if m.EIP150Block != nil { - l = m.EIP150Block.Size() - n += 1 + l + sovEvm(uint64(l)) - } - l = len(m.EIP150Hash) - if l > 0 { - n += 1 + l + sovEvm(uint64(l)) - } - if m.EIP155Block != nil { - l = m.EIP155Block.Size() - n += 1 + l + sovEvm(uint64(l)) - } - if m.EIP158Block != nil { - l = m.EIP158Block.Size() - n += 1 + l + sovEvm(uint64(l)) - } - if m.ByzantiumBlock != nil { - l = m.ByzantiumBlock.Size() - n += 1 + l + sovEvm(uint64(l)) - } - if m.ConstantinopleBlock != nil { - l = m.ConstantinopleBlock.Size() - n += 1 + l + sovEvm(uint64(l)) - } - if m.PetersburgBlock != nil { - l = m.PetersburgBlock.Size() - n += 1 + l + sovEvm(uint64(l)) - } - if m.IstanbulBlock != nil { - l = m.IstanbulBlock.Size() - n += 1 + l + sovEvm(uint64(l)) - } - if m.MuirGlacierBlock != nil { - l = m.MuirGlacierBlock.Size() - n += 1 + l + sovEvm(uint64(l)) - } - if m.BerlinBlock != nil { - l = m.BerlinBlock.Size() - n += 1 + l + sovEvm(uint64(l)) - } - if m.LondonBlock != nil { - l = m.LondonBlock.Size() - n += 2 + l + sovEvm(uint64(l)) - } - if m.ArrowGlacierBlock != nil { - l = m.ArrowGlacierBlock.Size() - n += 2 + l + sovEvm(uint64(l)) - } - if m.GrayGlacierBlock != nil { - l = m.GrayGlacierBlock.Size() - n += 2 + l + sovEvm(uint64(l)) - } - if m.MergeNetsplitBlock != nil { - l = m.MergeNetsplitBlock.Size() - n += 2 + l + sovEvm(uint64(l)) - } - if m.ShanghaiBlock != nil { - l = m.ShanghaiBlock.Size() - n += 2 + l + sovEvm(uint64(l)) - } - if m.CancunBlock != nil { - l = m.CancunBlock.Size() - n += 2 + l + sovEvm(uint64(l)) - } - return n -} - -func (m *V4State) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Key) - if l > 0 { - n += 1 + l + sovEvm(uint64(l)) - } - l = len(m.Value) - if l > 0 { - n += 1 + l + sovEvm(uint64(l)) - } - return n -} - -func (m *TransactionV4Logs) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Hash) - if l > 0 { - n += 1 + l + sovEvm(uint64(l)) - } - if len(m.V4Logs) > 0 { - for _, e := range m.V4Logs { - l = e.Size() - n += 1 + l + sovEvm(uint64(l)) - } - } - return n -} - -func (m *V4Log) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Address) - if l > 0 { - n += 1 + l + sovEvm(uint64(l)) - } - if len(m.Topics) > 0 { - for _, s := range m.Topics { - l = len(s) - n += 1 + l + sovEvm(uint64(l)) - } - } - l = len(m.Data) - if l > 0 { - n += 1 + l + sovEvm(uint64(l)) - } - if m.BlockNumber != 0 { - n += 1 + sovEvm(uint64(m.BlockNumber)) - } - l = len(m.TxHash) - if l > 0 { - n += 1 + l + sovEvm(uint64(l)) - } - if m.TxIndex != 0 { - n += 1 + sovEvm(uint64(m.TxIndex)) - } - l = len(m.BlockHash) - if l > 0 { - n += 1 + l + sovEvm(uint64(l)) - } - if m.Index != 0 { - n += 1 + sovEvm(uint64(m.Index)) - } - if m.Removed { - n += 2 - } - return n -} - -func (m *V4TxResult) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.ContractAddress) - if l > 0 { - n += 1 + l + sovEvm(uint64(l)) - } - l = len(m.Bloom) - if l > 0 { - n += 1 + l + sovEvm(uint64(l)) - } - l = m.TxV4Logs.Size() - n += 1 + l + sovEvm(uint64(l)) - l = len(m.Ret) - if l > 0 { - n += 1 + l + sovEvm(uint64(l)) - } - if m.Reverted { - n += 2 - } - if m.GasUsed != 0 { - n += 1 + sovEvm(uint64(m.GasUsed)) - } - return n -} - -func (m *V4AccessTuple) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Address) - if l > 0 { - n += 1 + l + sovEvm(uint64(l)) - } - if len(m.StorageKeys) > 0 { - for _, s := range m.StorageKeys { - l = len(s) - n += 1 + l + sovEvm(uint64(l)) - } - } - return n -} - -func (m *V4TraceConfig) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Tracer) - if l > 0 { - n += 1 + l + sovEvm(uint64(l)) - } - l = len(m.Timeout) - if l > 0 { - n += 1 + l + sovEvm(uint64(l)) - } - if m.Reexec != 0 { - n += 1 + sovEvm(uint64(m.Reexec)) - } - if m.DisableStack { - n += 2 - } - if m.DisableStorage { - n += 2 - } - if m.Debug { - n += 2 - } - if m.Limit != 0 { - n += 1 + sovEvm(uint64(m.Limit)) - } - if m.Overrides != nil { - l = m.Overrides.Size() - n += 1 + l + sovEvm(uint64(l)) - } - if m.EnableMemory { - n += 2 - } - if m.EnableReturnData { - n += 2 - } - l = len(m.TracerJsonConfig) - if l > 0 { - n += 1 + l + sovEvm(uint64(l)) - } - return n -} - -func sovEvm(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} - -func sozEvm(x uint64) (n int) { - return sovEvm(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} - -func (m *V4Params) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: V4Params: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: V4Params: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EvmDenom", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.EvmDenom = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field EnableCreate", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.EnableCreate = bool(v != 0) - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field EnableCall", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.EnableCall = bool(v != 0) - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ExtraEIPs", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ExtraEIPs.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field V4ChainConfig", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.V4ChainConfig.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field AllowUnprotectedTxs", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.AllowUnprotectedTxs = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipEvm(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvm - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *ExtraEIPs) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ExtraEIPs: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ExtraEIPs: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType == 0 { - var v int64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.EIPs = append(m.EIPs, v) - } else if wireType == 2 { - var packedLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - packedLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if packedLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + packedLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var elementCount int - var count int - for _, integer := range dAtA[iNdEx:postIndex] { - if integer < 128 { - count++ - } - } - elementCount = count - if elementCount != 0 && len(m.EIPs) == 0 { - m.EIPs = make([]int64, 0, elementCount) - } - for iNdEx < postIndex { - var v int64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.EIPs = append(m.EIPs, v) - } - } else { - return fmt.Errorf("proto: wrong wireType = %d for field EIPs", wireType) - } - default: - iNdEx = preIndex - skippy, err := skipEvm(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvm - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *V4ChainConfig) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: V4ChainConfig: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: V4ChainConfig: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field HomesteadBlock", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var v github_com_cosmos_cosmos_sdk_types.Int - m.HomesteadBlock = &v - if err := m.HomesteadBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DAOForkBlock", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var v github_com_cosmos_cosmos_sdk_types.Int - m.DAOForkBlock = &v - if err := m.DAOForkBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field DAOForkSupport", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.DAOForkSupport = bool(v != 0) - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EIP150Block", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var v github_com_cosmos_cosmos_sdk_types.Int - m.EIP150Block = &v - if err := m.EIP150Block.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EIP150Hash", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.EIP150Hash = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EIP155Block", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var v github_com_cosmos_cosmos_sdk_types.Int - m.EIP155Block = &v - if err := m.EIP155Block.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EIP158Block", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var v github_com_cosmos_cosmos_sdk_types.Int - m.EIP158Block = &v - if err := m.EIP158Block.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ByzantiumBlock", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var v github_com_cosmos_cosmos_sdk_types.Int - m.ByzantiumBlock = &v - if err := m.ByzantiumBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConstantinopleBlock", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var v github_com_cosmos_cosmos_sdk_types.Int - m.ConstantinopleBlock = &v - if err := m.ConstantinopleBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 10: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PetersburgBlock", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var v github_com_cosmos_cosmos_sdk_types.Int - m.PetersburgBlock = &v - if err := m.PetersburgBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 11: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field IstanbulBlock", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var v github_com_cosmos_cosmos_sdk_types.Int - m.IstanbulBlock = &v - if err := m.IstanbulBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 12: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MuirGlacierBlock", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var v github_com_cosmos_cosmos_sdk_types.Int - m.MuirGlacierBlock = &v - if err := m.MuirGlacierBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 13: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BerlinBlock", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var v github_com_cosmos_cosmos_sdk_types.Int - m.BerlinBlock = &v - if err := m.BerlinBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 17: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LondonBlock", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var v github_com_cosmos_cosmos_sdk_types.Int - m.LondonBlock = &v - if err := m.LondonBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 18: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ArrowGlacierBlock", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var v github_com_cosmos_cosmos_sdk_types.Int - m.ArrowGlacierBlock = &v - if err := m.ArrowGlacierBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 20: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field GrayGlacierBlock", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var v github_com_cosmos_cosmos_sdk_types.Int - m.GrayGlacierBlock = &v - if err := m.GrayGlacierBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 21: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MergeNetsplitBlock", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var v github_com_cosmos_cosmos_sdk_types.Int - m.MergeNetsplitBlock = &v - if err := m.MergeNetsplitBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 22: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ShanghaiBlock", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var v github_com_cosmos_cosmos_sdk_types.Int - m.ShanghaiBlock = &v - if err := m.ShanghaiBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 23: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CancunBlock", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var v github_com_cosmos_cosmos_sdk_types.Int - m.CancunBlock = &v - if err := m.CancunBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvm(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvm - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *V4State) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: V4State: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: V4State: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Key = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Value = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvm(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvm - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *TransactionV4Logs) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: TransactionV4Logs: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TransactionV4Logs: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Hash", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Hash = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field V4Logs", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.V4Logs = append(m.V4Logs, &V4Log{}) - if err := m.V4Logs[len(m.V4Logs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvm(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvm - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *V4Log) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: V4Log: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: V4Log: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Address = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Topics", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Topics = append(m.Topics, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) - if m.Data == nil { - m.Data = []byte{} - } - iNdEx = postIndex - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field BlockNumber", wireType) - } - m.BlockNumber = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.BlockNumber |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TxHash", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TxHash = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 6: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TxIndex", wireType) - } - m.TxIndex = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.TxIndex |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BlockHash", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.BlockHash = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 8: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) - } - m.Index = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Index |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 9: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Removed", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Removed = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipEvm(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvm - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *V4TxResult) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: V4TxResult: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: V4TxResult: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ContractAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ContractAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Bloom", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Bloom = append(m.Bloom[:0], dAtA[iNdEx:postIndex]...) - if m.Bloom == nil { - m.Bloom = []byte{} - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TxV4Logs", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.TxV4Logs.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Ret", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Ret = append(m.Ret[:0], dAtA[iNdEx:postIndex]...) - if m.Ret == nil { - m.Ret = []byte{} - } - iNdEx = postIndex - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Reverted", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Reverted = bool(v != 0) - case 6: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field GasUsed", wireType) - } - m.GasUsed = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.GasUsed |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipEvm(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvm - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *V4AccessTuple) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: V4AccessTuple: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: V4AccessTuple: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Address = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field StorageKeys", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.StorageKeys = append(m.StorageKeys, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvm(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvm - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *V4TraceConfig) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: V4TraceConfig: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: V4TraceConfig: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Tracer", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Tracer = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Timeout", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Timeout = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Reexec", wireType) - } - m.Reexec = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Reexec |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field DisableStack", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.DisableStack = bool(v != 0) - case 6: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field DisableStorage", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.DisableStorage = bool(v != 0) - case 8: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Debug", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Debug = bool(v != 0) - case 9: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Limit", wireType) - } - m.Limit = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Limit |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 10: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Overrides", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Overrides == nil { - m.Overrides = &V4ChainConfig{} - } - if err := m.Overrides.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 11: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field EnableMemory", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.EnableMemory = bool(v != 0) - case 12: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field EnableReturnData", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.EnableReturnData = bool(v != 0) - case 13: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TracerJsonConfig", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TracerJsonConfig = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvm(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvm - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func skipEvm(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowEvm - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowEvm - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowEvm - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthEvm - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupEvm - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthEvm - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthEvm = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowEvm = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupEvm = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/evm/migrations/v5/migrate.go b/x/evm/migrations/v5/migrate.go deleted file mode 100644 index b2638f765e..0000000000 --- a/x/evm/migrations/v5/migrate.go +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) -package v5 - -import ( - "github.com/cosmos/cosmos-sdk/codec" - storetypes "github.com/cosmos/cosmos-sdk/store/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v19/x/evm/types" - - v5types "github.com/evmos/evmos/v19/x/evm/migrations/v5/types" -) - -// MigrateStore migrates the x/evm module state from the consensus version 4 to -// version 5. Specifically, it takes the parameters that are currently stored -// in separate keys and stores them directly into the x/evm module state using -// a single params key. -func MigrateStore( - ctx sdk.Context, - storeKey storetypes.StoreKey, - cdc codec.BinaryCodec, -) error { - var ( - extraEIPs v5types.V5ExtraEIPs - chainConfig types.ChainConfig - params types.Params - ) - - store := ctx.KVStore(storeKey) - - denom := string(store.Get(types.ParamStoreKeyEVMDenom)) - - extraEIPsBz := store.Get(types.ParamStoreKeyExtraEIPs) - cdc.MustUnmarshal(extraEIPsBz, &extraEIPs) - - // revert ExtraEIP change for Evmos testnet - if ctx.ChainID() == "evmos_9000-4" { - extraEIPs.EIPs = []int64{} - } - - chainCfgBz := store.Get(types.ParamStoreKeyChainConfig) - cdc.MustUnmarshal(chainCfgBz, &chainConfig) - - params.EvmDenom = denom - params.ExtraEIPs = extraEIPs.EIPs - params.ChainConfig = chainConfig - params.AllowUnprotectedTxs = store.Has(types.ParamStoreKeyAllowUnprotectedTxs) - - store.Delete(types.ParamStoreKeyChainConfig) - store.Delete(types.ParamStoreKeyExtraEIPs) - store.Delete(types.ParamStoreKeyEVMDenom) - store.Delete(types.ParamStoreKeyEnableCreate) - store.Delete(types.ParamStoreKeyEnableCall) - store.Delete(types.ParamStoreKeyAllowUnprotectedTxs) - - if err := params.Validate(); err != nil { - return err - } - - bz := cdc.MustMarshal(¶ms) - - store.Set(types.KeyPrefixParams, bz) - return nil -} diff --git a/x/evm/migrations/v5/migrate_test.go b/x/evm/migrations/v5/migrate_test.go deleted file mode 100644 index 2161de9412..0000000000 --- a/x/evm/migrations/v5/migrate_test.go +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2022 Evmos Foundation -// This file is part of the Evmos Network packages. -// -// Evmos is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The Evmos packages are distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the Evmos packages. If not, see https://github.com/evmos/evmos/blob/main/LICENSE -package v5_test - -import ( - "testing" - - "github.com/cosmos/cosmos-sdk/testutil" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" - - "github.com/evmos/evmos/v19/app" - "github.com/evmos/evmos/v19/encoding" - v5 "github.com/evmos/evmos/v19/x/evm/migrations/v5" - v5types "github.com/evmos/evmos/v19/x/evm/migrations/v5/types" - "github.com/evmos/evmos/v19/x/evm/types" -) - -// AvailableExtraEIPs define the list of all EIPs that can be enabled by the -// EVM interpreter. These EIPs are applied in order and can override the -// instruction sets from the latest hard fork enabled by the ChainConfig. For -// more info check: -// https://github.com/ethereum/go-ethereum/blob/master/core/vm/interpreter.go#L97 -var AvailableExtraEIPs = []int64{1344, 1884, 2200, 2929, 3198, 3529} - -func TestMigrate(t *testing.T) { - encCfg := encoding.MakeConfig(app.ModuleBasics) - cdc := encCfg.Codec - - storeKey := sdk.NewKVStoreKey(types.ModuleName) - tKey := sdk.NewTransientStoreKey("transient_test") - ctx := testutil.DefaultContext(storeKey, tKey) - kvStore := ctx.KVStore(storeKey) - - extraEIPs := v5types.V5ExtraEIPs{EIPs: AvailableExtraEIPs} - extraEIPsBz := cdc.MustMarshal(&extraEIPs) - chainConfig := types.DefaultChainConfig() - chainConfigBz := cdc.MustMarshal(&chainConfig) - - // Set the params in the store - kvStore.Set(types.ParamStoreKeyEVMDenom, []byte(types.DefaultEVMDenom)) - kvStore.Set(types.ParamStoreKeyEnableCreate, []byte{0x01}) - kvStore.Set(types.ParamStoreKeyEnableCall, []byte{0x01}) - kvStore.Set(types.ParamStoreKeyAllowUnprotectedTxs, []byte{0x01}) - kvStore.Set(types.ParamStoreKeyExtraEIPs, extraEIPsBz) - kvStore.Set(types.ParamStoreKeyChainConfig, chainConfigBz) - - err := v5.MigrateStore(ctx, storeKey, cdc) - require.NoError(t, err) - - paramsBz := kvStore.Get(types.KeyPrefixParams) - var params types.Params - cdc.MustUnmarshal(paramsBz, ¶ms) - - // test that the params have been migrated correctly - require.Equal(t, types.DefaultEVMDenom, params.EvmDenom) - require.True(t, params.AllowUnprotectedTxs) - require.Equal(t, chainConfig, params.ChainConfig) - require.Equal(t, extraEIPs.EIPs, params.ExtraEIPs) - - // check that the keys are deleted - require.False(t, kvStore.Has(types.ParamStoreKeyEVMDenom)) - require.False(t, kvStore.Has(types.ParamStoreKeyEnableCreate)) - require.False(t, kvStore.Has(types.ParamStoreKeyEnableCall)) - require.False(t, kvStore.Has(types.ParamStoreKeyAllowUnprotectedTxs)) - require.False(t, kvStore.Has(types.ParamStoreKeyExtraEIPs)) - require.False(t, kvStore.Has(types.ParamStoreKeyChainConfig)) -} diff --git a/x/evm/migrations/v5/types/evm.pb.go b/x/evm/migrations/v5/types/evm.pb.go deleted file mode 100644 index a8d8dc62fd..0000000000 --- a/x/evm/migrations/v5/types/evm.pb.go +++ /dev/null @@ -1,481 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: ethermint/evm/v1/evm.proto - -package types - -import ( - fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" -) - -// Reference imports to suppress errors if they are not otherwise used. -var ( - _ = proto.Marshal - _ = fmt.Errorf - _ = math.Inf -) - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// V5ExtraEIPs represents extra EIPs for the vm.Config -type V5ExtraEIPs struct { - // eips defines the additional EIPs for the vm.Config - EIPs []int64 `protobuf:"varint,1,rep,packed,name=eips,proto3" json:"eips,omitempty" yaml:"eips"` -} - -func (m *V5ExtraEIPs) Reset() { *m = V5ExtraEIPs{} } -func (m *V5ExtraEIPs) String() string { return proto.CompactTextString(m) } -func (*V5ExtraEIPs) ProtoMessage() {} -func (*V5ExtraEIPs) Descriptor() ([]byte, []int) { - return fileDescriptor_d21ecc92c8c8583e, []int{1} -} - -func (m *V5ExtraEIPs) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *V5ExtraEIPs) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_V5ExtraEIPs.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} - -func (m *V5ExtraEIPs) XXX_Merge(src proto.Message) { - xxx_messageInfo_V5ExtraEIPs.Merge(m, src) -} - -func (m *V5ExtraEIPs) XXX_Size() int { - return m.Size() -} - -func (m *V5ExtraEIPs) XXX_DiscardUnknown() { - xxx_messageInfo_V5ExtraEIPs.DiscardUnknown(m) -} - -var xxx_messageInfo_V5ExtraEIPs proto.InternalMessageInfo - -func (m *V5ExtraEIPs) GetEIPs() []int64 { - if m != nil { - return m.EIPs - } - return nil -} - -func init() { - proto.RegisterType((*V5ExtraEIPs)(nil), "ethermint.evm.v1.V5ExtraEIPs") -} - -func init() { proto.RegisterFile("ethermint/evm/v1/evm.proto", fileDescriptor_d21ecc92c8c8583e) } - -var fileDescriptor_d21ecc92c8c8583e = []byte{ - // 1644 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x58, 0x4f, 0x6f, 0xe3, 0xc6, - 0x15, 0xb7, 0x2d, 0xda, 0xa6, 0x46, 0xb2, 0x44, 0x8f, 0xb5, 0x5e, 0x65, 0x17, 0x35, 0x5d, 0x1e, - 0x02, 0x17, 0x4d, 0xec, 0xd8, 0x81, 0xd1, 0x45, 0x82, 0x16, 0x5d, 0xed, 0x3a, 0x89, 0xdd, 0x6d, - 0x6a, 0x8c, 0x1d, 0x14, 0x28, 0x50, 0x10, 0x23, 0x72, 0x42, 0x31, 0x26, 0x39, 0xc2, 0xcc, 0x50, - 0x2b, 0xb5, 0xfd, 0x00, 0x05, 0x7a, 0xe9, 0x27, 0x28, 0x72, 0xee, 0x27, 0x09, 0x7a, 0xda, 0x63, - 0xd1, 0x03, 0x51, 0x78, 0x6f, 0x3e, 0xea, 0x13, 0x14, 0xf3, 0x47, 0xd4, 0x1f, 0x1b, 0x6d, 0xad, - 0x93, 0xe7, 0xf7, 0xde, 0x9b, 0xdf, 0x6f, 0xde, 0x9b, 0x37, 0x9e, 0xa1, 0xc0, 0x33, 0x22, 0x7a, - 0x84, 0xa5, 0x71, 0x26, 0x8e, 0xc8, 0x20, 0x3d, 0x1a, 0x1c, 0xcb, 0x3f, 0x87, 0x7d, 0x46, 0x05, - 0x85, 0x4e, 0xe9, 0x3b, 0x94, 0xc6, 0xc1, 0xf1, 0xb3, 0x56, 0x44, 0x23, 0xaa, 0x9c, 0x47, 0x72, - 0xa4, 0xe3, 0xbc, 0xbf, 0x57, 0xc0, 0xc6, 0x25, 0x66, 0x38, 0xe5, 0xf0, 0x18, 0x54, 0xc9, 0x20, - 0xf5, 0x43, 0x92, 0xd1, 0xb4, 0xbd, 0xba, 0xbf, 0x7a, 0x50, 0xed, 0xb4, 0xc6, 0x85, 0xeb, 0x8c, - 0x70, 0x9a, 0x7c, 0xe6, 0x95, 0x2e, 0x0f, 0xd9, 0x64, 0x90, 0xbe, 0x96, 0x43, 0xf8, 0x73, 0xb0, - 0x45, 0x32, 0xdc, 0x4d, 0x88, 0x1f, 0x30, 0x82, 0x05, 0x69, 0xaf, 0xed, 0xaf, 0x1e, 0xd8, 0x9d, - 0xf6, 0xb8, 0x70, 0x5b, 0x66, 0xda, 0xac, 0xdb, 0x43, 0x75, 0x8d, 0x5f, 0x29, 0x08, 0x7f, 0x06, - 0x6a, 0x13, 0x3f, 0x4e, 0x92, 0x76, 0x45, 0x4d, 0xde, 0x1d, 0x17, 0x2e, 0x9c, 0x9f, 0x8c, 0x93, - 0xc4, 0x43, 0xc0, 0x4c, 0xc5, 0x49, 0x02, 0xbb, 0x00, 0x90, 0xa1, 0x60, 0xd8, 0x27, 0x71, 0x9f, - 0xb7, 0xad, 0xfd, 0xd5, 0x83, 0xda, 0xc9, 0xf3, 0xc3, 0xc5, 0x94, 0x0f, 0xcf, 0x64, 0xcc, 0xd9, - 0xf9, 0x25, 0xef, 0x7c, 0xf8, 0x43, 0xe1, 0xae, 0xdc, 0x16, 0x6e, 0xb5, 0x34, 0x8d, 0x0b, 0x77, - 0xdb, 0xa8, 0x94, 0x4c, 0x1e, 0xaa, 0x2a, 0x70, 0x16, 0xf7, 0x39, 0xfc, 0x3d, 0xa8, 0x07, 0x3d, - 0x1c, 0x67, 0x7e, 0x40, 0xb3, 0x6f, 0xe3, 0xa8, 0xbd, 0xae, 0x54, 0x7e, 0x74, 0x5f, 0xe5, 0x95, - 0x8c, 0x7a, 0xa5, 0x82, 0x3a, 0xcf, 0xa5, 0xce, 0xb8, 0x70, 0x77, 0x34, 0xf5, 0x2c, 0x81, 0x87, - 0x6a, 0xc1, 0x34, 0x12, 0x9e, 0x80, 0x27, 0x38, 0x49, 0xe8, 0x5b, 0x3f, 0xcf, 0xe4, 0x4e, 0x90, - 0x40, 0x90, 0xd0, 0x17, 0x43, 0xde, 0xde, 0x90, 0x55, 0x40, 0x3b, 0xca, 0xf9, 0xcd, 0xd4, 0x77, - 0x3d, 0xe4, 0xde, 0x0b, 0x30, 0x5d, 0x3f, 0xfc, 0x29, 0xb0, 0x54, 0xf6, 0xab, 0xfb, 0x95, 0x83, - 0x4a, 0xe7, 0xe9, 0x6d, 0xe1, 0x5a, 0x26, 0xaf, 0x9a, 0xc9, 0x4b, 0x65, 0xa4, 0x82, 0xbc, 0xbf, - 0x6d, 0x83, 0xda, 0xcc, 0x3a, 0x61, 0x0a, 0x9a, 0x3d, 0x9a, 0x12, 0x2e, 0x08, 0x0e, 0xfd, 0x6e, - 0x42, 0x83, 0x1b, 0xb3, 0xe3, 0xaf, 0xff, 0x55, 0xb8, 0x1f, 0x46, 0xb1, 0xe8, 0xe5, 0xdd, 0xc3, - 0x80, 0xa6, 0x47, 0x01, 0xe5, 0x29, 0xe5, 0xe6, 0xcf, 0xc7, 0x3c, 0xbc, 0x39, 0x12, 0xa3, 0x3e, - 0xe1, 0x87, 0xe7, 0x99, 0x18, 0x17, 0xee, 0xae, 0x56, 0x5a, 0xa0, 0xf2, 0x50, 0xa3, 0xb4, 0x74, - 0xa4, 0x01, 0x8e, 0x40, 0x23, 0xc4, 0xd4, 0xff, 0x96, 0xb2, 0x1b, 0xa3, 0xb6, 0xa6, 0xd4, 0xae, - 0xfe, 0x7f, 0xb5, 0xdb, 0xc2, 0xad, 0xbf, 0x7e, 0xf9, 0x9b, 0x2f, 0x28, 0xbb, 0x51, 0x9c, 0xe3, - 0xc2, 0x7d, 0xa2, 0xd5, 0xe7, 0x99, 0x3d, 0x54, 0x0f, 0x31, 0x2d, 0xc3, 0xe0, 0x6f, 0x81, 0x53, - 0x06, 0xf0, 0xbc, 0xdf, 0xa7, 0x4c, 0x98, 0x46, 0xfb, 0xf8, 0xb6, 0x70, 0x1b, 0x86, 0xf2, 0x4a, - 0x7b, 0xc6, 0x85, 0xfb, 0x74, 0x81, 0xd4, 0xcc, 0xf1, 0x50, 0xc3, 0xd0, 0x9a, 0x50, 0xc8, 0x41, - 0x9d, 0xc4, 0xfd, 0xe3, 0xd3, 0x4f, 0x4c, 0x46, 0x96, 0xca, 0xe8, 0xf2, 0x51, 0x19, 0xd5, 0xce, - 0xce, 0x2f, 0x8f, 0x4f, 0x3f, 0x99, 0x24, 0xb4, 0x53, 0x6e, 0x5c, 0x49, 0xeb, 0xa1, 0x9a, 0x86, - 0x3a, 0x9b, 0x73, 0x60, 0xa0, 0xdf, 0xc3, 0xbc, 0xa7, 0x7a, 0xb2, 0xda, 0x39, 0xb8, 0x2d, 0x5c, - 0xa0, 0x99, 0xbe, 0xc2, 0xbc, 0x37, 0xdd, 0x97, 0xee, 0xe8, 0x0f, 0x38, 0x13, 0x71, 0x9e, 0x4e, - 0xb8, 0x80, 0x9e, 0x2c, 0xa3, 0xca, 0xf5, 0x9f, 0x9a, 0xf5, 0x6f, 0x2c, 0xbd, 0xfe, 0xd3, 0x87, - 0xd6, 0x7f, 0x3a, 0xbf, 0x7e, 0x1d, 0x53, 0x8a, 0xbe, 0x30, 0xa2, 0x9b, 0x4b, 0x8b, 0xbe, 0x78, - 0x48, 0xf4, 0xc5, 0xbc, 0xa8, 0x8e, 0x91, 0xcd, 0xbe, 0x50, 0x89, 0xb6, 0xbd, 0x7c, 0xb3, 0xdf, - 0x2b, 0x6a, 0xa3, 0xb4, 0x68, 0xb9, 0x3f, 0x81, 0x56, 0x40, 0x33, 0x2e, 0xa4, 0x2d, 0xa3, 0xfd, - 0x84, 0x18, 0xcd, 0xaa, 0xd2, 0x3c, 0x7f, 0x94, 0xe6, 0x73, 0xf3, 0x7f, 0xe4, 0x01, 0x3e, 0x0f, - 0xed, 0xcc, 0x9b, 0xb5, 0x7a, 0x1f, 0x38, 0x7d, 0x22, 0x08, 0xe3, 0xdd, 0x9c, 0x45, 0x46, 0x19, - 0x28, 0xe5, 0xb3, 0x47, 0x29, 0x9b, 0x73, 0xb0, 0xc8, 0xe5, 0xa1, 0xe6, 0xd4, 0xa4, 0x15, 0xbf, - 0x03, 0x8d, 0x58, 0x2e, 0xa3, 0x9b, 0x27, 0x46, 0xaf, 0xa6, 0xf4, 0x5e, 0x3d, 0x4a, 0xcf, 0x1c, - 0xe6, 0x79, 0x26, 0x0f, 0x6d, 0x4d, 0x0c, 0x5a, 0x2b, 0x07, 0x30, 0xcd, 0x63, 0xe6, 0x47, 0x09, - 0x0e, 0x62, 0xc2, 0x8c, 0x5e, 0x5d, 0xe9, 0x7d, 0xf9, 0x28, 0xbd, 0x0f, 0xb4, 0xde, 0x7d, 0x36, - 0x0f, 0x39, 0xd2, 0xf8, 0xa5, 0xb6, 0x69, 0xd9, 0x10, 0xd4, 0xbb, 0x84, 0x25, 0x71, 0x66, 0x04, - 0xb7, 0x94, 0xe0, 0xcb, 0x47, 0x09, 0x9a, 0x3e, 0x9d, 0xe5, 0xf1, 0x50, 0x4d, 0xc3, 0x52, 0x25, - 0xa1, 0x59, 0x48, 0x27, 0x2a, 0xdb, 0xcb, 0xab, 0xcc, 0xf2, 0x78, 0xa8, 0xa6, 0xa1, 0x56, 0x19, - 0x82, 0x1d, 0xcc, 0x18, 0x7d, 0xbb, 0x50, 0x43, 0xa8, 0xc4, 0xbe, 0x7a, 0x94, 0xd8, 0x33, 0x2d, - 0xf6, 0x00, 0x9d, 0x87, 0xb6, 0x95, 0x75, 0xae, 0x8a, 0x39, 0x80, 0x11, 0xc3, 0xa3, 0x05, 0xe1, - 0xd6, 0xf2, 0x9b, 0x77, 0x9f, 0xcd, 0x43, 0x8e, 0x34, 0xce, 0xc9, 0xfe, 0x11, 0xb4, 0x52, 0xc2, - 0x22, 0xe2, 0x67, 0x44, 0xf0, 0x7e, 0x12, 0x0b, 0x23, 0xfc, 0x64, 0xf9, 0xf3, 0xf8, 0x10, 0x9f, - 0x87, 0xa0, 0x32, 0x7f, 0x6d, 0xac, 0xe5, 0xe1, 0xe0, 0x3d, 0x9c, 0x45, 0x3d, 0x1c, 0x1b, 0xd9, - 0xdd, 0xe5, 0x0f, 0xc7, 0x3c, 0x93, 0x87, 0xb6, 0x26, 0x86, 0xb2, 0x7f, 0x02, 0x9c, 0x05, 0xf9, - 0xa4, 0x7f, 0x9e, 0x2e, 0xdf, 0x3f, 0xb3, 0x3c, 0xf2, 0xe1, 0xa2, 0xa0, 0x52, 0xb9, 0xb0, 0xec, - 0x86, 0xd3, 0xbc, 0xb0, 0xec, 0xa6, 0xe3, 0x5c, 0x58, 0xb6, 0xe3, 0x6c, 0x5f, 0x58, 0xf6, 0x8e, - 0xd3, 0x42, 0x5b, 0x23, 0x9a, 0x50, 0x7f, 0xf0, 0xa9, 0x9e, 0x84, 0x6a, 0xe4, 0x2d, 0xe6, 0xe6, - 0x7f, 0x24, 0x6a, 0x04, 0x58, 0xe0, 0x64, 0xc4, 0x4d, 0xa9, 0x90, 0xa3, 0x0b, 0x38, 0x73, 0x6b, - 0x1f, 0x81, 0xf5, 0x2b, 0x21, 0xdf, 0x84, 0x0e, 0xa8, 0xdc, 0x90, 0x91, 0x7e, 0x8d, 0x20, 0x39, - 0x84, 0x2d, 0xb0, 0x3e, 0xc0, 0x49, 0xae, 0x1f, 0x97, 0x55, 0xa4, 0x81, 0x77, 0x09, 0x9a, 0xd7, - 0x0c, 0x67, 0x1c, 0x07, 0x22, 0xa6, 0xd9, 0x1b, 0x1a, 0x71, 0x08, 0x81, 0xa5, 0x6e, 0x45, 0x3d, - 0x57, 0x8d, 0xe1, 0x4f, 0x80, 0x95, 0xd0, 0x88, 0xb7, 0xd7, 0xf6, 0x2b, 0x07, 0xb5, 0x93, 0x27, - 0xf7, 0x5f, 0x6f, 0x6f, 0x68, 0x84, 0x54, 0x88, 0xf7, 0x8f, 0x35, 0x50, 0x79, 0x43, 0x23, 0xd8, - 0x06, 0x9b, 0x38, 0x0c, 0x19, 0xe1, 0xdc, 0x30, 0x4d, 0x20, 0xdc, 0x05, 0x1b, 0x82, 0xf6, 0xe3, - 0x40, 0xd3, 0x55, 0x91, 0x41, 0x52, 0x38, 0xc4, 0x02, 0xab, 0x77, 0x45, 0x1d, 0xa9, 0x31, 0x3c, - 0x01, 0x75, 0x95, 0x99, 0x9f, 0xe5, 0x69, 0x97, 0x30, 0xf5, 0x3c, 0xb0, 0x3a, 0xcd, 0xbb, 0xc2, - 0xad, 0x29, 0xfb, 0xd7, 0xca, 0x8c, 0x66, 0x01, 0xfc, 0x08, 0x6c, 0x8a, 0xe1, 0xec, 0xcd, 0xbe, - 0x73, 0x57, 0xb8, 0x4d, 0x31, 0x4d, 0x53, 0x5e, 0xdc, 0x68, 0x43, 0x0c, 0xd5, 0x05, 0x7e, 0x04, - 0x6c, 0x31, 0xf4, 0xe3, 0x2c, 0x24, 0x43, 0x75, 0x79, 0x5b, 0x9d, 0xd6, 0x5d, 0xe1, 0x3a, 0x33, - 0xe1, 0xe7, 0xd2, 0x87, 0x36, 0xc5, 0x50, 0x0d, 0xe0, 0x47, 0x00, 0xe8, 0x25, 0x29, 0x05, 0x7d, - 0xf5, 0x6e, 0xdd, 0x15, 0x6e, 0x55, 0x59, 0x15, 0xf7, 0x74, 0x08, 0x3d, 0xb0, 0xae, 0xb9, 0x6d, - 0xc5, 0x5d, 0xbf, 0x2b, 0x5c, 0x3b, 0xa1, 0x91, 0xe6, 0xd4, 0x2e, 0x59, 0x2a, 0x46, 0x52, 0x3a, - 0x20, 0xa1, 0xba, 0xdd, 0x6c, 0x34, 0x81, 0xde, 0x5f, 0xd6, 0x80, 0x7d, 0x3d, 0x44, 0x84, 0xe7, - 0x89, 0x80, 0x5f, 0x00, 0x27, 0xa0, 0x99, 0x60, 0x38, 0x10, 0xfe, 0x5c, 0x69, 0x3b, 0xcf, 0xa7, - 0x37, 0xcd, 0x62, 0x84, 0x87, 0x9a, 0x13, 0xd3, 0x4b, 0x53, 0xff, 0x16, 0x58, 0xef, 0x26, 0x94, - 0xa6, 0xaa, 0x13, 0xea, 0x48, 0x03, 0x88, 0x54, 0xd5, 0xd4, 0x2e, 0x57, 0xd4, 0x1b, 0xfd, 0xc7, - 0xf7, 0x77, 0x79, 0xa1, 0x55, 0x3a, 0xbb, 0xe6, 0x9d, 0xde, 0xd0, 0xda, 0x66, 0xbe, 0x27, 0x6b, - 0xab, 0x5a, 0xc9, 0x01, 0x15, 0x46, 0x84, 0xda, 0xb4, 0x3a, 0x92, 0x43, 0xf8, 0x0c, 0xd8, 0x8c, - 0x0c, 0x08, 0x13, 0x24, 0x54, 0x9b, 0x63, 0xa3, 0x12, 0xc3, 0x0f, 0x80, 0x1d, 0x61, 0xee, 0xe7, - 0x9c, 0x84, 0x7a, 0x27, 0xd0, 0x66, 0x84, 0xf9, 0x37, 0x9c, 0x84, 0x9f, 0x59, 0x7f, 0xfe, 0xde, - 0x5d, 0xf1, 0x30, 0xa8, 0xbd, 0x0c, 0x02, 0xc2, 0xf9, 0x75, 0xde, 0x4f, 0xc8, 0x7f, 0xe9, 0xb0, - 0x13, 0x50, 0xe7, 0x82, 0x32, 0x1c, 0x11, 0xff, 0x86, 0x8c, 0x4c, 0x9f, 0xe9, 0xae, 0x31, 0xf6, - 0x5f, 0x91, 0x11, 0x47, 0xb3, 0xc0, 0x48, 0x7c, 0x6f, 0x81, 0xda, 0x35, 0xc3, 0x01, 0x31, 0x2f, - 0x7c, 0xd9, 0xab, 0x12, 0x32, 0x23, 0x61, 0x90, 0xd4, 0x16, 0x71, 0x4a, 0x68, 0x2e, 0xcc, 0x79, - 0x9a, 0x40, 0x39, 0x83, 0x11, 0x32, 0x24, 0x81, 0x2a, 0xa3, 0x85, 0x0c, 0x82, 0xa7, 0x60, 0x2b, - 0x8c, 0xb9, 0xfa, 0x12, 0xe3, 0x02, 0x07, 0x37, 0x3a, 0xfd, 0x8e, 0x73, 0x57, 0xb8, 0x75, 0xe3, - 0xb8, 0x92, 0x76, 0x34, 0x87, 0xe0, 0xe7, 0xa0, 0x39, 0x9d, 0xa6, 0x56, 0xab, 0x3f, 0x6d, 0x3a, - 0xf0, 0xae, 0x70, 0x1b, 0x65, 0xa8, 0xf2, 0xa0, 0x05, 0x2c, 0x77, 0x3a, 0x24, 0xdd, 0x3c, 0x52, - 0xcd, 0x67, 0x23, 0x0d, 0xa4, 0x35, 0x89, 0xd3, 0x58, 0xa8, 0x66, 0x5b, 0x47, 0x1a, 0xc0, 0xcf, - 0x41, 0x95, 0x0e, 0x08, 0x63, 0x71, 0x48, 0xb8, 0x7a, 0xea, 0xfc, 0xaf, 0xaf, 0x34, 0x34, 0x8d, - 0x97, 0xc9, 0x99, 0xaf, 0xcc, 0x94, 0xa4, 0x94, 0x8d, 0xd4, 0xdb, 0xc5, 0x24, 0xa7, 0x1d, 0xbf, - 0x56, 0x76, 0x34, 0x87, 0x60, 0x07, 0x40, 0x33, 0x8d, 0x11, 0x91, 0xb3, 0xcc, 0x57, 0xe7, 0xbf, - 0xae, 0xe6, 0xaa, 0x53, 0xa8, 0xbd, 0x48, 0x39, 0x5f, 0x63, 0x81, 0xd1, 0x3d, 0x0b, 0xfc, 0x05, - 0x80, 0x7a, 0x4f, 0xfc, 0xef, 0x38, 0x2d, 0x3f, 0x33, 0xf5, 0xd3, 0x42, 0xe9, 0x6b, 0xaf, 0x59, - 0xb3, 0xa3, 0xd1, 0x05, 0xa7, 0x26, 0x8b, 0x0b, 0xcb, 0xb6, 0x9c, 0xf5, 0x0b, 0xcb, 0xde, 0x74, - 0xec, 0xb2, 0x7e, 0x26, 0x0b, 0xb4, 0x33, 0xc1, 0x33, 0xcb, 0xeb, 0xfc, 0xf2, 0x87, 0xdb, 0xbd, - 0xd5, 0x77, 0xb7, 0x7b, 0xab, 0xff, 0xbe, 0xdd, 0x5b, 0xfd, 0xeb, 0xfb, 0xbd, 0x95, 0x77, 0xef, - 0xf7, 0x56, 0xfe, 0xf9, 0x7e, 0x6f, 0xe5, 0x77, 0xb3, 0xf7, 0x03, 0x19, 0xc8, 0xeb, 0x61, 0xfa, - 0xd3, 0xc2, 0x50, 0xfd, 0xb8, 0xa0, 0xee, 0x88, 0xee, 0x86, 0xfa, 0xd1, 0xe0, 0xd3, 0xff, 0x04, - 0x00, 0x00, 0xff, 0xff, 0x68, 0xce, 0x8e, 0x23, 0x7a, 0x10, 0x00, 0x00, -} - -func (m *V5ExtraEIPs) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *V5ExtraEIPs) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *V5ExtraEIPs) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.EIPs) > 0 { - dAtA4 := make([]byte, len(m.EIPs)*10) - var j3 int - for _, num1 := range m.EIPs { - num := uint64(num1) - for num >= 1<<7 { - dAtA4[j3] = uint8(uint64(num)&0x7f | 0x80) - num >>= 7 - j3++ - } - dAtA4[j3] = uint8(num) - j3++ - } - i -= j3 - copy(dAtA[i:], dAtA4[:j3]) - i = encodeVarintEvm(dAtA, i, uint64(j3)) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func encodeVarintEvm(dAtA []byte, offset int, v uint64) int { - offset -= sovEvm(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} - -func (m *V5ExtraEIPs) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.EIPs) > 0 { - l = 0 - for _, e := range m.EIPs { - l += sovEvm(uint64(e)) - } - n += 1 + sovEvm(uint64(l)) + l - } - return n -} - -func sovEvm(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} - -func sozEvm(x uint64) (n int) { - return sovEvm(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} - -func (m *V5ExtraEIPs) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: V5ExtraEIPs: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: V5ExtraEIPs: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType == 0 { - var v int64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.EIPs = append(m.EIPs, v) - } else if wireType == 2 { - var packedLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - packedLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if packedLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + packedLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var elementCount int - var count int - for _, integer := range dAtA[iNdEx:postIndex] { - if integer < 128 { - count++ - } - } - elementCount = count - if elementCount != 0 && len(m.EIPs) == 0 { - m.EIPs = make([]int64, 0, elementCount) - } - for iNdEx < postIndex { - var v int64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.EIPs = append(m.EIPs, v) - } - } else { - return fmt.Errorf("proto: wrong wireType = %d for field EIPs", wireType) - } - default: - iNdEx = preIndex - skippy, err := skipEvm(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvm - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func skipEvm(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowEvm - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowEvm - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowEvm - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthEvm - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupEvm - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthEvm - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthEvm = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowEvm = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupEvm = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/evm/migrations/v6/migrate.go b/x/evm/migrations/v6/migrate.go deleted file mode 100644 index 92fed0fb40..0000000000 --- a/x/evm/migrations/v6/migrate.go +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) -package v6 - -import ( - "github.com/cosmos/cosmos-sdk/codec" - storetypes "github.com/cosmos/cosmos-sdk/store/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v19/utils" - "github.com/evmos/evmos/v19/x/evm/types" - - v5types "github.com/evmos/evmos/v19/x/evm/migrations/v6/types" -) - -// MigrateStore migrates the x/evm module state from the consensus version 5 to -// version 6. Specifically, it adds the new EVMChannels param. -func MigrateStore( - ctx sdk.Context, - storeKey storetypes.StoreKey, - cdc codec.BinaryCodec, -) error { - var ( - paramsV5 v5types.V5Params - params types.Params - ) - - store := ctx.KVStore(storeKey) - - paramsV5Bz := store.Get(types.KeyPrefixParams) - cdc.MustUnmarshal(paramsV5Bz, ¶msV5) - - params.EvmDenom = paramsV5.EvmDenom - params.ExtraEIPs = paramsV5.ExtraEIPs - params.ChainConfig = types.ChainConfig{ - HomesteadBlock: paramsV5.ChainConfig.HomesteadBlock, - DAOForkBlock: paramsV5.ChainConfig.DAOForkBlock, - DAOForkSupport: paramsV5.ChainConfig.DAOForkSupport, - EIP150Block: paramsV5.ChainConfig.EIP150Block, - EIP150Hash: paramsV5.ChainConfig.EIP150Hash, - EIP155Block: paramsV5.ChainConfig.EIP155Block, - EIP158Block: paramsV5.ChainConfig.EIP158Block, - ByzantiumBlock: paramsV5.ChainConfig.ByzantiumBlock, - ConstantinopleBlock: paramsV5.ChainConfig.ConstantinopleBlock, - PetersburgBlock: paramsV5.ChainConfig.PetersburgBlock, - IstanbulBlock: paramsV5.ChainConfig.IstanbulBlock, - MuirGlacierBlock: paramsV5.ChainConfig.MuirGlacierBlock, - BerlinBlock: paramsV5.ChainConfig.BerlinBlock, - LondonBlock: paramsV5.ChainConfig.LondonBlock, - ArrowGlacierBlock: paramsV5.ChainConfig.ArrowGlacierBlock, - GrayGlacierBlock: paramsV5.ChainConfig.GrayGlacierBlock, - MergeNetsplitBlock: paramsV5.ChainConfig.MergeNetsplitBlock, - ShanghaiBlock: paramsV5.ChainConfig.ShanghaiBlock, - CancunBlock: paramsV5.ChainConfig.CancunBlock, - } - params.AllowUnprotectedTxs = paramsV5.AllowUnprotectedTxs - params.ActiveStaticPrecompiles = paramsV5.ActivePrecompiles - params.EVMChannels = types.DefaultEVMChannels - - // DefaultEVMChannels are for Evmos mainnet - // leave empty for testnet - if ctx.ChainID() == utils.TestnetChainID+"-4" { - params.EVMChannels = []string{} - } - - if err := params.Validate(); err != nil { - return err - } - - bz := cdc.MustMarshal(¶ms) - - store.Set(types.KeyPrefixParams, bz) - return nil -} diff --git a/x/evm/migrations/v6/migrate_test.go b/x/evm/migrations/v6/migrate_test.go deleted file mode 100644 index 485a054ecf..0000000000 --- a/x/evm/migrations/v6/migrate_test.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright Tharsis Labs Ltd.(Evmos) -// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) -package v6_test - -import ( - "encoding/json" - "testing" - - "github.com/cosmos/cosmos-sdk/testutil" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" - - "github.com/evmos/evmos/v19/app" - "github.com/evmos/evmos/v19/encoding" - v6 "github.com/evmos/evmos/v19/x/evm/migrations/v6" - v5types "github.com/evmos/evmos/v19/x/evm/migrations/v6/types" - "github.com/evmos/evmos/v19/x/evm/types" -) - -func TestMigrate(t *testing.T) { - encCfg := encoding.MakeConfig(app.ModuleBasics) - cdc := encCfg.Codec - - storeKey := sdk.NewKVStoreKey(types.ModuleName) - tKey := sdk.NewTransientStoreKey("transient_test") - ctx := testutil.DefaultContext(storeKey, tKey) - kvStore := ctx.KVStore(storeKey) - - chainConfig := types.DefaultChainConfig() - bz, err := json.Marshal(chainConfig) - require.NoError(t, err) - var chainCfgV5 v5types.V5ChainConfig - err = json.Unmarshal(bz, &chainCfgV5) - require.NoError(t, err) - v5Params := v5types.V5Params{ - EvmDenom: types.DefaultEVMDenom, - ChainConfig: chainCfgV5, - ExtraEIPs: types.DefaultExtraEIPs, - AllowUnprotectedTxs: types.DefaultAllowUnprotectedTxs, - ActivePrecompiles: types.DefaultStaticPrecompiles, - } - - // Set the params in the store - paramsV5Bz := cdc.MustMarshal(&v5Params) - kvStore.Set(types.KeyPrefixParams, paramsV5Bz) - - err = v6.MigrateStore(ctx, storeKey, cdc) - require.NoError(t, err) - - paramsBz := kvStore.Get(types.KeyPrefixParams) - var params types.Params - cdc.MustUnmarshal(paramsBz, ¶ms) - - // test that the params have been migrated correctly - require.Equal(t, types.DefaultEVMDenom, params.EvmDenom) - require.False(t, params.AllowUnprotectedTxs) - require.Equal(t, chainConfig, params.ChainConfig) - require.Equal(t, types.DefaultExtraEIPs, params.ExtraEIPs) - require.Equal(t, types.DefaultEVMChannels, params.EVMChannels) -} diff --git a/x/evm/migrations/v6/types/evm.pb.go b/x/evm/migrations/v6/types/evm.pb.go deleted file mode 100644 index ceecb7d269..0000000000 --- a/x/evm/migrations/v6/types/evm.pb.go +++ /dev/null @@ -1,4118 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: ethermint/evm/v1/evm.proto - -package types - -import ( - fmt "fmt" - github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// V5Params defines the EVM module parameters -type V5Params struct { - // evm_denom represents the token denomination used to run the EVM state - // transitions. - EvmDenom string `protobuf:"bytes,1,opt,name=evm_denom,json=evmDenom,proto3" json:"evm_denom,omitempty" yaml:"evm_denom"` - // enable_create toggles state transitions that use the vm.Create function - EnableCreate bool `protobuf:"varint,2,opt,name=enable_create,json=enableCreate,proto3" json:"enable_create,omitempty" yaml:"enable_create"` - // enable_call toggles state transitions that use the vm.Call function - EnableCall bool `protobuf:"varint,3,opt,name=enable_call,json=enableCall,proto3" json:"enable_call,omitempty" yaml:"enable_call"` - // extra_eips defines the additional EIPs for the vm.Config - ExtraEIPs []int64 `protobuf:"varint,4,rep,packed,name=extra_eips,json=extraEips,proto3" json:"extra_eips,omitempty" yaml:"extra_eips"` - // chain_config defines the EVM chain configuration parameters - ChainConfig V5ChainConfig `protobuf:"bytes,5,opt,name=chain_config,json=chainConfig,proto3" json:"chain_config" yaml:"chain_config"` - // allow_unprotected_txs defines if replay-protected (i.e non EIP155 - // signed) transactions can be executed on the state machine. - AllowUnprotectedTxs bool `protobuf:"varint,6,opt,name=allow_unprotected_txs,json=allowUnprotectedTxs,proto3" json:"allow_unprotected_txs,omitempty"` - // active_precompiles defines the slice of hex addresses of the precompiled - // contracts that are active - ActivePrecompiles []string `protobuf:"bytes,7,rep,name=active_precompiles,json=activePrecompiles,proto3" json:"active_precompiles,omitempty"` -} - -func (m *V5Params) Reset() { *m = V5Params{} } -func (m *V5Params) String() string { return proto.CompactTextString(m) } -func (*V5Params) ProtoMessage() {} -func (*V5Params) Descriptor() ([]byte, []int) { - return fileDescriptor_d21ecc92c8c8583e, []int{0} -} -func (m *V5Params) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *V5Params) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Params.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *V5Params) XXX_Merge(src proto.Message) { - xxx_messageInfo_Params.Merge(m, src) -} -func (m *V5Params) XXX_Size() int { - return m.Size() -} -func (m *V5Params) XXX_DiscardUnknown() { - xxx_messageInfo_Params.DiscardUnknown(m) -} - -var xxx_messageInfo_Params proto.InternalMessageInfo - -func (m *V5Params) GetEvmDenom() string { - if m != nil { - return m.EvmDenom - } - return "" -} - -func (m *V5Params) GetEnableCreate() bool { - if m != nil { - return m.EnableCreate - } - return false -} - -func (m *V5Params) GetEnableCall() bool { - if m != nil { - return m.EnableCall - } - return false -} - -func (m *V5Params) GetExtraEIPs() []int64 { - if m != nil { - return m.ExtraEIPs - } - return nil -} - -func (m *V5Params) GetChainConfig() V5ChainConfig { - if m != nil { - return m.ChainConfig - } - return V5ChainConfig{} -} - -func (m *V5Params) GetAllowUnprotectedTxs() bool { - if m != nil { - return m.AllowUnprotectedTxs - } - return false -} - -func (m *V5Params) GetActivePrecompiles() []string { - if m != nil { - return m.ActivePrecompiles - } - return nil -} - -// ChainConfig defines the Ethereum ChainConfig parameters using *sdkmath.Int values -// instead of *big.Int. -type V5ChainConfig struct { - // homestead_block switch (nil no fork, 0 = already homestead) - HomesteadBlock *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,1,opt,name=homestead_block,json=homesteadBlock,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"homestead_block,omitempty" yaml:"homestead_block"` - // dao_fork_block corresponds to TheDAO hard-fork switch block (nil no fork) - DAOForkBlock *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,2,opt,name=dao_fork_block,json=daoForkBlock,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"dao_fork_block,omitempty" yaml:"dao_fork_block"` - // dao_fork_support defines whether the nodes supports or opposes the DAO hard-fork - DAOForkSupport bool `protobuf:"varint,3,opt,name=dao_fork_support,json=daoForkSupport,proto3" json:"dao_fork_support,omitempty" yaml:"dao_fork_support"` - // eip150_block: EIP150 implements the Gas price changes - // (https://github.com/ethereum/EIPs/issues/150) EIP150 HF block (nil no fork) - EIP150Block *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,4,opt,name=eip150_block,json=eip150Block,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"eip150_block,omitempty" yaml:"eip150_block"` - // eip150_hash: EIP150 HF hash (needed for header only clients as only gas pricing changed) - EIP150Hash string `protobuf:"bytes,5,opt,name=eip150_hash,json=eip150Hash,proto3" json:"eip150_hash,omitempty" yaml:"byzantium_block"` - // eip155_block: EIP155Block HF block - EIP155Block *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,6,opt,name=eip155_block,json=eip155Block,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"eip155_block,omitempty" yaml:"eip155_block"` - // eip158_block: EIP158 HF block - EIP158Block *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,7,opt,name=eip158_block,json=eip158Block,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"eip158_block,omitempty" yaml:"eip158_block"` - // byzantium_block: Byzantium switch block (nil no fork, 0 = already on byzantium) - ByzantiumBlock *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,8,opt,name=byzantium_block,json=byzantiumBlock,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"byzantium_block,omitempty" yaml:"byzantium_block"` - // constantinople_block: Constantinople switch block (nil no fork, 0 = already activated) - ConstantinopleBlock *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,9,opt,name=constantinople_block,json=constantinopleBlock,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"constantinople_block,omitempty" yaml:"constantinople_block"` - // petersburg_block: Petersburg switch block (nil same as Constantinople) - PetersburgBlock *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,10,opt,name=petersburg_block,json=petersburgBlock,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"petersburg_block,omitempty" yaml:"petersburg_block"` - // istanbul_block: Istanbul switch block (nil no fork, 0 = already on istanbul) - IstanbulBlock *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,11,opt,name=istanbul_block,json=istanbulBlock,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"istanbul_block,omitempty" yaml:"istanbul_block"` - // muir_glacier_block: Eip-2384 (bomb delay) switch block (nil no fork, 0 = already activated) - MuirGlacierBlock *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,12,opt,name=muir_glacier_block,json=muirGlacierBlock,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"muir_glacier_block,omitempty" yaml:"muir_glacier_block"` - // berlin_block: Berlin switch block (nil = no fork, 0 = already on berlin) - BerlinBlock *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,13,opt,name=berlin_block,json=berlinBlock,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"berlin_block,omitempty" yaml:"berlin_block"` - // london_block: London switch block (nil = no fork, 0 = already on london) - LondonBlock *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,17,opt,name=london_block,json=londonBlock,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"london_block,omitempty" yaml:"london_block"` - // arrow_glacier_block: Eip-4345 (bomb delay) switch block (nil = no fork, 0 = already activated) - ArrowGlacierBlock *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,18,opt,name=arrow_glacier_block,json=arrowGlacierBlock,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"arrow_glacier_block,omitempty" yaml:"arrow_glacier_block"` - // gray_glacier_block: EIP-5133 (bomb delay) switch block (nil = no fork, 0 = already activated) - GrayGlacierBlock *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,20,opt,name=gray_glacier_block,json=grayGlacierBlock,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"gray_glacier_block,omitempty" yaml:"gray_glacier_block"` - // merge_netsplit_block: Virtual fork after The Merge to use as a network splitter - MergeNetsplitBlock *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,21,opt,name=merge_netsplit_block,json=mergeNetsplitBlock,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"merge_netsplit_block,omitempty" yaml:"merge_netsplit_block"` - // shanghai_block switch block (nil = no fork, 0 = already on shanghai) - ShanghaiBlock *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,22,opt,name=shanghai_block,json=shanghaiBlock,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"shanghai_block,omitempty" yaml:"shanghai_block"` - // cancun_block switch block (nil = no fork, 0 = already on cancun) - CancunBlock *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,23,opt,name=cancun_block,json=cancunBlock,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"cancun_block,omitempty" yaml:"cancun_block"` -} - -func (m *V5ChainConfig) Reset() { *m = V5ChainConfig{} } -func (m *V5ChainConfig) String() string { return proto.CompactTextString(m) } -func (*V5ChainConfig) ProtoMessage() {} -func (*V5ChainConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_d21ecc92c8c8583e, []int{1} -} -func (m *V5ChainConfig) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *V5ChainConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ChainConfig.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *V5ChainConfig) XXX_Merge(src proto.Message) { - xxx_messageInfo_ChainConfig.Merge(m, src) -} -func (m *V5ChainConfig) XXX_Size() int { - return m.Size() -} -func (m *V5ChainConfig) XXX_DiscardUnknown() { - xxx_messageInfo_ChainConfig.DiscardUnknown(m) -} - -var xxx_messageInfo_ChainConfig proto.InternalMessageInfo - -func (m *V5ChainConfig) GetDAOForkSupport() bool { - if m != nil { - return m.DAOForkSupport - } - return false -} - -func (m *V5ChainConfig) GetEIP150Hash() string { - if m != nil { - return m.EIP150Hash - } - return "" -} - -// State represents a single Storage key value pair item. -type V5State struct { - // key is the stored key - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` - // value is the stored value for the given key - Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` -} - -func (m *V5State) Reset() { *m = V5State{} } -func (m *V5State) String() string { return proto.CompactTextString(m) } -func (*V5State) ProtoMessage() {} -func (*V5State) Descriptor() ([]byte, []int) { - return fileDescriptor_d21ecc92c8c8583e, []int{2} -} -func (m *V5State) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *V5State) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_State.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *V5State) XXX_Merge(src proto.Message) { - xxx_messageInfo_State.Merge(m, src) -} -func (m *V5State) XXX_Size() int { - return m.Size() -} -func (m *V5State) XXX_DiscardUnknown() { - xxx_messageInfo_State.DiscardUnknown(m) -} - -var xxx_messageInfo_State proto.InternalMessageInfo - -func (m *V5State) GetKey() string { - if m != nil { - return m.Key - } - return "" -} - -func (m *V5State) GetValue() string { - if m != nil { - return m.Value - } - return "" -} - -// TransactionLogs define the logs generated from a transaction execution -// with a given hash. It it used for import/export data as transactions are not -// persisted on blockchain state after an upgrade. -type V5TransactionLogs struct { - // hash of the transaction - Hash string `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` - // logs is an array of Logs for the given transaction hash - Logs []*V5Log `protobuf:"bytes,2,rep,name=logs,proto3" json:"logs,omitempty"` -} - -func (m *V5TransactionLogs) Reset() { *m = V5TransactionLogs{} } -func (m *V5TransactionLogs) String() string { return proto.CompactTextString(m) } -func (*V5TransactionLogs) ProtoMessage() {} -func (*V5TransactionLogs) Descriptor() ([]byte, []int) { - return fileDescriptor_d21ecc92c8c8583e, []int{3} -} -func (m *V5TransactionLogs) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *V5TransactionLogs) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_TransactionLogs.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *V5TransactionLogs) XXX_Merge(src proto.Message) { - xxx_messageInfo_TransactionLogs.Merge(m, src) -} -func (m *V5TransactionLogs) XXX_Size() int { - return m.Size() -} -func (m *V5TransactionLogs) XXX_DiscardUnknown() { - xxx_messageInfo_TransactionLogs.DiscardUnknown(m) -} - -var xxx_messageInfo_TransactionLogs proto.InternalMessageInfo - -func (m *V5TransactionLogs) GetHash() string { - if m != nil { - return m.Hash - } - return "" -} - -func (m *V5TransactionLogs) GetLogs() []*V5Log { - if m != nil { - return m.Logs - } - return nil -} - -// Log represents an protobuf compatible Ethereum Log that defines a contract -// log event. These events are generated by the LOG opcode and stored/indexed by -// the node. -// -// NOTE: address, topics and data are consensus fields. The rest of the fields -// are derived, i.e. filled in by the nodes, but not secured by consensus. -type V5Log struct { - // address of the contract that generated the event - Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` - // topics is a list of topics provided by the contract. - Topics []string `protobuf:"bytes,2,rep,name=topics,proto3" json:"topics,omitempty"` - // data which is supplied by the contract, usually ABI-encoded - Data []byte `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` - // block_number of the block in which the transaction was included - BlockNumber uint64 `protobuf:"varint,4,opt,name=block_number,json=blockNumber,proto3" json:"blockNumber"` - // tx_hash is the transaction hash - TxHash string `protobuf:"bytes,5,opt,name=tx_hash,json=txHash,proto3" json:"transactionHash"` - // tx_index of the transaction in the block - TxIndex uint64 `protobuf:"varint,6,opt,name=tx_index,json=txIndex,proto3" json:"transactionIndex"` - // block_hash of the block in which the transaction was included - BlockHash string `protobuf:"bytes,7,opt,name=block_hash,json=blockHash,proto3" json:"blockHash"` - // index of the log in the block - Index uint64 `protobuf:"varint,8,opt,name=index,proto3" json:"logIndex"` - // removed is true if this log was reverted due to a chain - // reorganisation. You must pay attention to this field if you receive logs - // through a filter query. - Removed bool `protobuf:"varint,9,opt,name=removed,proto3" json:"removed,omitempty"` -} - -func (m *V5Log) Reset() { *m = V5Log{} } -func (m *V5Log) String() string { return proto.CompactTextString(m) } -func (*V5Log) ProtoMessage() {} -func (*V5Log) Descriptor() ([]byte, []int) { - return fileDescriptor_d21ecc92c8c8583e, []int{4} -} -func (m *V5Log) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *V5Log) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Log.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *V5Log) XXX_Merge(src proto.Message) { - xxx_messageInfo_Log.Merge(m, src) -} -func (m *V5Log) XXX_Size() int { - return m.Size() -} -func (m *V5Log) XXX_DiscardUnknown() { - xxx_messageInfo_Log.DiscardUnknown(m) -} - -var xxx_messageInfo_Log proto.InternalMessageInfo - -func (m *V5Log) GetAddress() string { - if m != nil { - return m.Address - } - return "" -} - -func (m *V5Log) GetTopics() []string { - if m != nil { - return m.Topics - } - return nil -} - -func (m *V5Log) GetData() []byte { - if m != nil { - return m.Data - } - return nil -} - -func (m *V5Log) GetBlockNumber() uint64 { - if m != nil { - return m.BlockNumber - } - return 0 -} - -func (m *V5Log) GetTxHash() string { - if m != nil { - return m.TxHash - } - return "" -} - -func (m *V5Log) GetTxIndex() uint64 { - if m != nil { - return m.TxIndex - } - return 0 -} - -func (m *V5Log) GetBlockHash() string { - if m != nil { - return m.BlockHash - } - return "" -} - -func (m *V5Log) GetIndex() uint64 { - if m != nil { - return m.Index - } - return 0 -} - -func (m *V5Log) GetRemoved() bool { - if m != nil { - return m.Removed - } - return false -} - -// TxResult stores results of Tx execution. -type V5TxResult struct { - // contract_address contains the ethereum address of the created contract (if - // any). If the state transition is an evm.Call, the contract address will be - // empty. - ContractAddress string `protobuf:"bytes,1,opt,name=contract_address,json=contractAddress,proto3" json:"contract_address,omitempty" yaml:"contract_address"` - // bloom represents the bloom filter bytes - Bloom []byte `protobuf:"bytes,2,opt,name=bloom,proto3" json:"bloom,omitempty"` - // tx_logs contains the transaction hash and the proto-compatible ethereum - // logs. - TxLogs V5TransactionLogs `protobuf:"bytes,3,opt,name=tx_logs,json=txLogs,proto3" json:"tx_logs" yaml:"tx_logs"` - // ret defines the bytes from the execution. - Ret []byte `protobuf:"bytes,4,opt,name=ret,proto3" json:"ret,omitempty"` - // reverted flag is set to true when the call has been reverted - Reverted bool `protobuf:"varint,5,opt,name=reverted,proto3" json:"reverted,omitempty"` - // gas_used notes the amount of gas consumed while execution - GasUsed uint64 `protobuf:"varint,6,opt,name=gas_used,json=gasUsed,proto3" json:"gas_used,omitempty"` -} - -func (m *V5TxResult) Reset() { *m = V5TxResult{} } -func (m *V5TxResult) String() string { return proto.CompactTextString(m) } -func (*V5TxResult) ProtoMessage() {} -func (*V5TxResult) Descriptor() ([]byte, []int) { - return fileDescriptor_d21ecc92c8c8583e, []int{5} -} -func (m *V5TxResult) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *V5TxResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_TxResult.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *V5TxResult) XXX_Merge(src proto.Message) { - xxx_messageInfo_TxResult.Merge(m, src) -} -func (m *V5TxResult) XXX_Size() int { - return m.Size() -} -func (m *V5TxResult) XXX_DiscardUnknown() { - xxx_messageInfo_TxResult.DiscardUnknown(m) -} - -var xxx_messageInfo_TxResult proto.InternalMessageInfo - -// AccessTuple is the element type of an access list. -type V5AccessTuple struct { - // address is a hex formatted ethereum address - Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` - // storage_keys are hex formatted hashes of the storage keys - StorageKeys []string `protobuf:"bytes,2,rep,name=storage_keys,json=storageKeys,proto3" json:"storageKeys"` -} - -func (m *V5AccessTuple) Reset() { *m = V5AccessTuple{} } -func (m *V5AccessTuple) String() string { return proto.CompactTextString(m) } -func (*V5AccessTuple) ProtoMessage() {} -func (*V5AccessTuple) Descriptor() ([]byte, []int) { - return fileDescriptor_d21ecc92c8c8583e, []int{6} -} -func (m *V5AccessTuple) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *V5AccessTuple) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_AccessTuple.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *V5AccessTuple) XXX_Merge(src proto.Message) { - xxx_messageInfo_AccessTuple.Merge(m, src) -} -func (m *V5AccessTuple) XXX_Size() int { - return m.Size() -} -func (m *V5AccessTuple) XXX_DiscardUnknown() { - xxx_messageInfo_AccessTuple.DiscardUnknown(m) -} - -var xxx_messageInfo_AccessTuple proto.InternalMessageInfo - -// TraceConfig holds extra parameters to trace functions. -type V5TraceConfig struct { - // tracer is a custom javascript tracer - Tracer string `protobuf:"bytes,1,opt,name=tracer,proto3" json:"tracer,omitempty"` - // timeout overrides the default timeout of 5 seconds for JavaScript-based tracing - // calls - Timeout string `protobuf:"bytes,2,opt,name=timeout,proto3" json:"timeout,omitempty"` - // reexec defines the number of blocks the tracer is willing to go back - Reexec uint64 `protobuf:"varint,3,opt,name=reexec,proto3" json:"reexec,omitempty"` - // disable_stack switches stack capture - DisableStack bool `protobuf:"varint,5,opt,name=disable_stack,json=disableStack,proto3" json:"disableStack"` - // disable_storage switches storage capture - DisableStorage bool `protobuf:"varint,6,opt,name=disable_storage,json=disableStorage,proto3" json:"disableStorage"` - // debug can be used to print output during capture end - Debug bool `protobuf:"varint,8,opt,name=debug,proto3" json:"debug,omitempty"` - // limit defines the maximum length of output, but zero means unlimited - Limit int32 `protobuf:"varint,9,opt,name=limit,proto3" json:"limit,omitempty"` - // overrides can be used to execute a trace using future fork rules - Overrides *V5ChainConfig `protobuf:"bytes,10,opt,name=overrides,proto3" json:"overrides,omitempty"` - // enable_memory switches memory capture - EnableMemory bool `protobuf:"varint,11,opt,name=enable_memory,json=enableMemory,proto3" json:"enableMemory"` - // enable_return_data switches the capture of return data - EnableReturnData bool `protobuf:"varint,12,opt,name=enable_return_data,json=enableReturnData,proto3" json:"enableReturnData"` - // tracer_json_config configures the tracer using a JSON string - TracerJsonConfig string `protobuf:"bytes,13,opt,name=tracer_json_config,json=tracerJsonConfig,proto3" json:"tracerConfig"` -} - -func (m *V5TraceConfig) Reset() { *m = V5TraceConfig{} } -func (m *V5TraceConfig) String() string { return proto.CompactTextString(m) } -func (*V5TraceConfig) ProtoMessage() {} -func (*V5TraceConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_d21ecc92c8c8583e, []int{7} -} -func (m *V5TraceConfig) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *V5TraceConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_TraceConfig.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *V5TraceConfig) XXX_Merge(src proto.Message) { - xxx_messageInfo_TraceConfig.Merge(m, src) -} -func (m *V5TraceConfig) XXX_Size() int { - return m.Size() -} -func (m *V5TraceConfig) XXX_DiscardUnknown() { - xxx_messageInfo_TraceConfig.DiscardUnknown(m) -} - -var xxx_messageInfo_TraceConfig proto.InternalMessageInfo - -func (m *V5TraceConfig) GetTracer() string { - if m != nil { - return m.Tracer - } - return "" -} - -func (m *V5TraceConfig) GetTimeout() string { - if m != nil { - return m.Timeout - } - return "" -} - -func (m *V5TraceConfig) GetReexec() uint64 { - if m != nil { - return m.Reexec - } - return 0 -} - -func (m *V5TraceConfig) GetDisableStack() bool { - if m != nil { - return m.DisableStack - } - return false -} - -func (m *V5TraceConfig) GetDisableStorage() bool { - if m != nil { - return m.DisableStorage - } - return false -} - -func (m *V5TraceConfig) GetDebug() bool { - if m != nil { - return m.Debug - } - return false -} - -func (m *V5TraceConfig) GetLimit() int32 { - if m != nil { - return m.Limit - } - return 0 -} - -func (m *V5TraceConfig) GetOverrides() *V5ChainConfig { - if m != nil { - return m.Overrides - } - return nil -} - -func (m *V5TraceConfig) GetEnableMemory() bool { - if m != nil { - return m.EnableMemory - } - return false -} - -func (m *V5TraceConfig) GetEnableReturnData() bool { - if m != nil { - return m.EnableReturnData - } - return false -} - -func (m *V5TraceConfig) GetTracerJsonConfig() string { - if m != nil { - return m.TracerJsonConfig - } - return "" -} - -func init() { - proto.RegisterType((*V5Params)(nil), "ethermint.evm.v1.V5Params") - proto.RegisterType((*V5ChainConfig)(nil), "ethermint.evm.v1.V5ChainConfig") - proto.RegisterType((*V5State)(nil), "ethermint.evm.v1.V5State") - proto.RegisterType((*V5TransactionLogs)(nil), "ethermint.evm.v1.V5TransactionLogs") - proto.RegisterType((*V5Log)(nil), "ethermint.evm.v1.V5Log") - proto.RegisterType((*V5TxResult)(nil), "ethermint.evm.v1.V5TxResult") - proto.RegisterType((*V5AccessTuple)(nil), "ethermint.evm.v1.V5AccessTuple") - proto.RegisterType((*V5TraceConfig)(nil), "ethermint.evm.v1.V5TraceConfig") -} - -func init() { proto.RegisterFile("ethermint/evm/v1/evm.proto", fileDescriptor_d21ecc92c8c8583e) } - -var fileDescriptor_d21ecc92c8c8583e = []byte{ - // 1641 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x58, 0xdd, 0x4e, 0x23, 0xc9, - 0x15, 0x06, 0xdc, 0x40, 0xbb, 0x6c, 0xec, 0xa6, 0xf0, 0xb0, 0xde, 0x19, 0x85, 0x26, 0x7d, 0x11, - 0x11, 0x69, 0x07, 0x16, 0x56, 0x28, 0xa3, 0x5d, 0x25, 0x0a, 0x9e, 0x61, 0x77, 0x21, 0x93, 0x0d, - 0x2a, 0x58, 0x45, 0x8a, 0x14, 0xb5, 0xca, 0xdd, 0xb5, 0xed, 0x5e, 0xba, 0xbb, 0xac, 0xaa, 0x6a, - 0x8f, 0x9d, 0xe4, 0x01, 0x22, 0xe5, 0x26, 0x4f, 0x10, 0xed, 0x63, 0xe4, 0x11, 0x56, 0xb9, 0xda, - 0xcb, 0x28, 0x17, 0xad, 0x88, 0xb9, 0xe3, 0xd2, 0x4f, 0x10, 0xd5, 0x8f, 0xdb, 0x3f, 0xa0, 0x24, - 0xf8, 0x06, 0xea, 0x3b, 0xe7, 0xd4, 0xf7, 0x55, 0x9d, 0x3a, 0x45, 0x9d, 0x06, 0x3c, 0x27, 0xa2, - 0x47, 0x58, 0x1a, 0x67, 0xe2, 0x88, 0x0c, 0xd2, 0xa3, 0xc1, 0xb1, 0xfc, 0x75, 0xd8, 0x67, 0x54, - 0x50, 0xe8, 0x94, 0xbe, 0x43, 0x69, 0x1c, 0x1c, 0x3f, 0x6f, 0x45, 0x34, 0xa2, 0xca, 0x79, 0x24, - 0x47, 0x3a, 0xce, 0xfb, 0x7b, 0x05, 0x6c, 0x5c, 0x61, 0x86, 0x53, 0x0e, 0x8f, 0x41, 0x95, 0x0c, - 0x52, 0x3f, 0x24, 0x19, 0x4d, 0xdb, 0xab, 0xfb, 0xab, 0x07, 0xd5, 0x4e, 0x6b, 0x5c, 0xb8, 0xce, - 0x08, 0xa7, 0xc9, 0xa7, 0x5e, 0xe9, 0xf2, 0x90, 0x4d, 0x06, 0xe9, 0x1b, 0x39, 0x84, 0x3f, 0x07, - 0x5b, 0x24, 0xc3, 0xdd, 0x84, 0xf8, 0x01, 0x23, 0x58, 0x90, 0xf6, 0xda, 0xfe, 0xea, 0x81, 0xdd, - 0x69, 0x8f, 0x0b, 0xb7, 0x65, 0xa6, 0xcd, 0xba, 0x3d, 0x54, 0xd7, 0xf8, 0xb5, 0x82, 0xf0, 0x67, - 0xa0, 0x36, 0xf1, 0xe3, 0x24, 0x69, 0x57, 0xd4, 0xe4, 0xdd, 0x71, 0xe1, 0xc2, 0xf9, 0xc9, 0x38, - 0x49, 0x3c, 0x04, 0xcc, 0x54, 0x9c, 0x24, 0xf0, 0x0c, 0x00, 0x32, 0x14, 0x0c, 0xfb, 0x24, 0xee, - 0xf3, 0xb6, 0xb5, 0x5f, 0x39, 0xa8, 0x74, 0xbc, 0xbb, 0xc2, 0xad, 0x9e, 0x4b, 0xeb, 0xf9, 0xc5, - 0x15, 0x1f, 0x17, 0xee, 0xb6, 0x21, 0x29, 0x03, 0x3d, 0x54, 0x55, 0xe0, 0x3c, 0xee, 0x73, 0xf8, - 0x7b, 0x50, 0x0f, 0x7a, 0x38, 0xce, 0xfc, 0x80, 0x66, 0xdf, 0xc4, 0x51, 0x7b, 0x7d, 0x7f, 0xf5, - 0xa0, 0x76, 0xf2, 0xa3, 0xc3, 0xc5, 0xbc, 0x1d, 0xbe, 0x96, 0x51, 0xaf, 0x55, 0x50, 0xe7, 0xc5, - 0xf7, 0x85, 0xbb, 0x32, 0x2e, 0xdc, 0x1d, 0x4d, 0x3d, 0x4b, 0xe0, 0xa1, 0x5a, 0x30, 0x8d, 0x84, - 0x27, 0xe0, 0x19, 0x4e, 0x12, 0xfa, 0xce, 0xcf, 0x33, 0x99, 0x68, 0x12, 0x08, 0x12, 0xfa, 0x62, - 0xc8, 0xdb, 0x1b, 0x72, 0x93, 0x68, 0x47, 0x39, 0xbf, 0x9e, 0xfa, 0x6e, 0x86, 0x1c, 0xbe, 0x04, - 0x10, 0x07, 0x22, 0x1e, 0x10, 0xbf, 0xcf, 0x48, 0x40, 0xd3, 0x7e, 0x9c, 0x10, 0xde, 0xde, 0xdc, - 0xaf, 0x1c, 0x54, 0xd1, 0xb6, 0xf6, 0x5c, 0x4d, 0x1d, 0xde, 0xdf, 0xb6, 0x41, 0x6d, 0x66, 0x71, - 0x30, 0x05, 0xcd, 0x1e, 0x4d, 0x09, 0x17, 0x04, 0x87, 0x7e, 0x37, 0xa1, 0xc1, 0xad, 0x39, 0xc5, - 0x37, 0xff, 0x2a, 0xdc, 0x9f, 0x44, 0xb1, 0xe8, 0xe5, 0xdd, 0xc3, 0x80, 0xa6, 0x47, 0x01, 0xe5, - 0x29, 0xe5, 0xe6, 0xd7, 0x4b, 0x1e, 0xde, 0x1e, 0x89, 0x51, 0x9f, 0xf0, 0xc3, 0x8b, 0x4c, 0x8c, - 0x0b, 0x77, 0x57, 0xef, 0x6d, 0x81, 0xca, 0x43, 0x8d, 0xd2, 0xd2, 0x91, 0x06, 0x38, 0x02, 0x8d, - 0x10, 0x53, 0xff, 0x1b, 0xca, 0x6e, 0x8d, 0xda, 0x9a, 0x52, 0xbb, 0xfe, 0xff, 0xd5, 0xee, 0x0a, - 0xb7, 0xfe, 0xe6, 0xec, 0x37, 0x9f, 0x53, 0x76, 0xab, 0x38, 0xc7, 0x85, 0xfb, 0x4c, 0xab, 0xcf, - 0x33, 0x7b, 0xa8, 0x1e, 0x62, 0x5a, 0x86, 0xc1, 0xdf, 0x02, 0xa7, 0x0c, 0xe0, 0x79, 0xbf, 0x4f, - 0x99, 0x30, 0xc5, 0xf3, 0xf2, 0xae, 0x70, 0x1b, 0x86, 0xf2, 0x5a, 0x7b, 0xc6, 0x85, 0xfb, 0xc1, - 0x02, 0xa9, 0x99, 0xe3, 0xa1, 0x86, 0xa1, 0x35, 0xa1, 0x90, 0x83, 0x3a, 0x89, 0xfb, 0xc7, 0xa7, - 0x1f, 0x9b, 0x1d, 0x59, 0x6a, 0x47, 0x57, 0x4f, 0xda, 0x51, 0xed, 0xfc, 0xe2, 0xea, 0xf8, 0xf4, - 0xe3, 0xc9, 0x86, 0x4c, 0xa9, 0xcc, 0xd2, 0x7a, 0xa8, 0xa6, 0xa1, 0xde, 0xcd, 0x05, 0x30, 0xd0, - 0xef, 0x61, 0xde, 0x53, 0x85, 0x58, 0xed, 0x1c, 0xdc, 0x15, 0x2e, 0xd0, 0x4c, 0x5f, 0x62, 0xde, - 0x9b, 0x9e, 0x4b, 0x77, 0xf4, 0x07, 0x9c, 0x89, 0x38, 0x4f, 0x27, 0x5c, 0x40, 0x4f, 0x96, 0x51, - 0xe5, 0xfa, 0x4f, 0xcd, 0xfa, 0x37, 0x96, 0x5e, 0xff, 0xe9, 0x63, 0xeb, 0x3f, 0x9d, 0x5f, 0xbf, - 0x8e, 0x29, 0x45, 0x5f, 0x19, 0xd1, 0xcd, 0xa5, 0x45, 0x5f, 0x3d, 0x26, 0xfa, 0x6a, 0x5e, 0x54, - 0xc7, 0xc8, 0x62, 0x5f, 0xc8, 0x44, 0xdb, 0x5e, 0xbe, 0xd8, 0x1f, 0x24, 0xb5, 0x51, 0x5a, 0xb4, - 0xdc, 0x9f, 0x40, 0x2b, 0xa0, 0x19, 0x17, 0xd2, 0x96, 0xd1, 0x7e, 0x42, 0x8c, 0x66, 0x55, 0x69, - 0x5e, 0x3c, 0x49, 0xf3, 0x85, 0xf9, 0xe3, 0xf1, 0x08, 0x9f, 0x87, 0x76, 0xe6, 0xcd, 0x5a, 0xbd, - 0x0f, 0x9c, 0x3e, 0x11, 0x84, 0xf1, 0x6e, 0xce, 0x22, 0xa3, 0x0c, 0x94, 0xf2, 0xf9, 0x93, 0x94, - 0xcd, 0x3d, 0x58, 0xe4, 0xf2, 0x50, 0x73, 0x6a, 0xd2, 0x8a, 0xdf, 0x82, 0x46, 0x2c, 0x97, 0xd1, - 0xcd, 0x13, 0xa3, 0x57, 0x53, 0x7a, 0xaf, 0x9f, 0xa4, 0x67, 0x2e, 0xf3, 0x3c, 0x93, 0x87, 0xb6, - 0x26, 0x06, 0xad, 0x95, 0x03, 0x98, 0xe6, 0x31, 0xf3, 0xa3, 0x04, 0x07, 0x31, 0x61, 0x46, 0xaf, - 0xae, 0xf4, 0xbe, 0x78, 0x92, 0xde, 0x87, 0x5a, 0xef, 0x21, 0x9b, 0x87, 0x1c, 0x69, 0xfc, 0x42, - 0xdb, 0xb4, 0x6c, 0x08, 0xea, 0x5d, 0xc2, 0x92, 0x38, 0x33, 0x82, 0x5b, 0x4a, 0xf0, 0xec, 0x49, - 0x82, 0xa6, 0x4e, 0x67, 0x79, 0x3c, 0x54, 0xd3, 0xb0, 0x54, 0x49, 0x68, 0x16, 0xd2, 0x89, 0xca, - 0xf6, 0xf2, 0x2a, 0xb3, 0x3c, 0x1e, 0xaa, 0x69, 0xa8, 0x55, 0x86, 0x60, 0x07, 0x33, 0x46, 0xdf, - 0x2d, 0xe4, 0x10, 0x2a, 0xb1, 0x2f, 0x9f, 0x24, 0xf6, 0x5c, 0x8b, 0x3d, 0x42, 0xe7, 0xa1, 0x6d, - 0x65, 0x9d, 0xcb, 0x62, 0x0e, 0x60, 0xc4, 0xf0, 0x68, 0x41, 0xb8, 0xb5, 0xfc, 0xe1, 0x3d, 0x64, - 0xf3, 0x90, 0x23, 0x8d, 0x73, 0xb2, 0x7f, 0x04, 0xad, 0x94, 0xb0, 0x88, 0xf8, 0x19, 0x11, 0xbc, - 0x9f, 0xc4, 0xc2, 0x08, 0x3f, 0x5b, 0xfe, 0x3e, 0x3e, 0xc6, 0xe7, 0x21, 0xa8, 0xcc, 0x5f, 0x19, - 0x6b, 0x79, 0x39, 0x78, 0x0f, 0x67, 0x51, 0x0f, 0xc7, 0x46, 0x76, 0x77, 0xf9, 0xcb, 0x31, 0xcf, - 0xe4, 0xa1, 0xad, 0x89, 0xa1, 0xac, 0x9f, 0x00, 0x67, 0x41, 0x3e, 0xa9, 0x9f, 0x0f, 0x96, 0xaf, - 0x9f, 0x59, 0x1e, 0xd9, 0xad, 0x28, 0xa8, 0x54, 0x2e, 0x2d, 0xbb, 0xe1, 0x34, 0x2f, 0x2d, 0xbb, - 0xe9, 0x38, 0x97, 0x96, 0xed, 0x38, 0xdb, 0x97, 0x96, 0xbd, 0xe3, 0xb4, 0xd0, 0xd6, 0x88, 0x26, - 0xd4, 0x1f, 0x7c, 0xa2, 0x27, 0xa1, 0x1a, 0x79, 0x87, 0xb9, 0xf9, 0x1b, 0x89, 0x1a, 0x01, 0x16, - 0x38, 0x19, 0x71, 0x93, 0x2a, 0xe4, 0xe8, 0x04, 0xce, 0xbc, 0xda, 0x47, 0x60, 0xfd, 0x5a, 0xc8, - 0x3e, 0xcf, 0x01, 0x95, 0x5b, 0x32, 0xd2, 0xdd, 0x08, 0x92, 0x43, 0xd8, 0x02, 0xeb, 0x03, 0x9c, - 0xe4, 0xba, 0x61, 0xac, 0x22, 0x0d, 0xbc, 0x2b, 0xd0, 0xbc, 0x61, 0x38, 0xe3, 0xb2, 0xd7, 0xa1, - 0xd9, 0x5b, 0x1a, 0x71, 0x08, 0x81, 0xa5, 0x5e, 0x45, 0x3d, 0x57, 0x8d, 0xe1, 0x4f, 0x81, 0x95, - 0xd0, 0x88, 0xb7, 0xd7, 0xf6, 0x2b, 0x07, 0xb5, 0x93, 0x67, 0x0f, 0x5b, 0xb6, 0xb7, 0x34, 0x42, - 0x2a, 0xc4, 0xfb, 0xc7, 0x1a, 0xa8, 0xbc, 0xa5, 0x11, 0x6c, 0x83, 0x4d, 0x1c, 0x86, 0x8c, 0x70, - 0x6e, 0x98, 0x26, 0x10, 0xee, 0x82, 0x0d, 0x41, 0xfb, 0x71, 0xa0, 0xe9, 0xaa, 0xc8, 0x20, 0x29, - 0x1c, 0x62, 0x81, 0x55, 0x5f, 0x51, 0x47, 0x6a, 0x0c, 0x4f, 0x40, 0x5d, 0xed, 0xcc, 0xcf, 0xf2, - 0xb4, 0x4b, 0x98, 0x6a, 0x0f, 0xac, 0x4e, 0xf3, 0xbe, 0x70, 0x6b, 0xca, 0xfe, 0x95, 0x32, 0xa3, - 0x59, 0x00, 0x3f, 0x02, 0x9b, 0x62, 0x38, 0xfb, 0xb2, 0xef, 0xdc, 0x17, 0x6e, 0x53, 0x4c, 0xb7, - 0x29, 0x1f, 0x6e, 0xb4, 0x21, 0x86, 0xea, 0x01, 0x3f, 0x02, 0xb6, 0x18, 0xfa, 0x71, 0x16, 0x92, - 0xa1, 0x7a, 0xbc, 0xad, 0x4e, 0xeb, 0xbe, 0x70, 0x9d, 0x99, 0xf0, 0x0b, 0xe9, 0x43, 0x9b, 0x62, - 0xa8, 0x06, 0xf0, 0x23, 0x00, 0xf4, 0x92, 0x94, 0x82, 0x7e, 0x7a, 0xb7, 0xee, 0x0b, 0xb7, 0xaa, - 0xac, 0x8a, 0x7b, 0x3a, 0x84, 0x1e, 0x58, 0xd7, 0xdc, 0xb6, 0xe2, 0xae, 0xdf, 0x17, 0xae, 0x9d, - 0xd0, 0x48, 0x73, 0x6a, 0x97, 0x4c, 0x15, 0x23, 0x29, 0x1d, 0x90, 0x50, 0xbd, 0x6e, 0x36, 0x9a, - 0x40, 0xef, 0x2f, 0x6b, 0xc0, 0xbe, 0x19, 0x22, 0xc2, 0xf3, 0x44, 0xc0, 0xcf, 0x81, 0x13, 0xd0, - 0x4c, 0x30, 0x1c, 0x08, 0x7f, 0x2e, 0xb5, 0x9d, 0x17, 0xd3, 0x97, 0x66, 0x31, 0xc2, 0x43, 0xcd, - 0x89, 0xe9, 0xcc, 0xe4, 0xbf, 0x05, 0xd6, 0xbb, 0x09, 0xa5, 0xa9, 0xaa, 0x84, 0x3a, 0xd2, 0x00, - 0x22, 0x95, 0x35, 0x75, 0xca, 0x15, 0xd5, 0x98, 0xff, 0xf8, 0xe1, 0x29, 0x2f, 0x94, 0x4a, 0x67, - 0xd7, 0x34, 0xe7, 0x0d, 0xad, 0x6d, 0xe6, 0x7b, 0x32, 0xb7, 0xaa, 0x94, 0x1c, 0x50, 0x61, 0x44, - 0xa8, 0x43, 0xab, 0x23, 0x39, 0x84, 0xcf, 0x81, 0xcd, 0xc8, 0x80, 0x30, 0x41, 0x42, 0x75, 0x38, - 0x36, 0x2a, 0x31, 0xfc, 0x10, 0xd8, 0x11, 0xe6, 0x7e, 0xce, 0x49, 0xa8, 0x4f, 0x02, 0x6d, 0x46, - 0x98, 0x7f, 0xcd, 0x49, 0xf8, 0xa9, 0xf5, 0xe7, 0xef, 0xdc, 0x15, 0x0f, 0x83, 0xda, 0x59, 0x10, - 0x10, 0xce, 0x6f, 0xf2, 0x7e, 0x42, 0xfe, 0x4b, 0x85, 0x9d, 0x80, 0x3a, 0x17, 0x94, 0xe1, 0x88, - 0xf8, 0xb7, 0x64, 0x64, 0xea, 0x4c, 0x57, 0x8d, 0xb1, 0xff, 0x8a, 0x8c, 0x38, 0x9a, 0x05, 0x46, - 0xe2, 0x3b, 0x0b, 0xd4, 0x6e, 0x18, 0x0e, 0x88, 0xe9, 0xf0, 0x65, 0xad, 0x4a, 0xc8, 0x8c, 0x84, - 0x41, 0x52, 0x5b, 0xc4, 0x29, 0xa1, 0xb9, 0x30, 0xf7, 0x69, 0x02, 0xe5, 0x0c, 0x46, 0xc8, 0x90, - 0x04, 0x2a, 0x8d, 0x16, 0x32, 0x08, 0x9e, 0x82, 0xad, 0x30, 0xe6, 0xea, 0xeb, 0x8a, 0x0b, 0x1c, - 0xdc, 0xea, 0xed, 0x77, 0x9c, 0xfb, 0xc2, 0xad, 0x1b, 0xc7, 0xb5, 0xb4, 0xa3, 0x39, 0x04, 0x3f, - 0x03, 0xcd, 0xe9, 0x34, 0xb5, 0x5a, 0xfd, 0x3d, 0xd3, 0x81, 0xf7, 0x85, 0xdb, 0x28, 0x43, 0x95, - 0x07, 0x2d, 0x60, 0x79, 0xd2, 0x21, 0xe9, 0xe6, 0x91, 0x2a, 0x3e, 0x1b, 0x69, 0x20, 0xad, 0x49, - 0x9c, 0xc6, 0x42, 0x15, 0xdb, 0x3a, 0xd2, 0x00, 0x7e, 0x06, 0xaa, 0x74, 0x40, 0x18, 0x8b, 0x43, - 0xc2, 0x55, 0xab, 0xf3, 0xbf, 0x3e, 0xcd, 0xd0, 0x34, 0x5e, 0x6e, 0xce, 0x7c, 0x39, 0xa6, 0x24, - 0xa5, 0x6c, 0xa4, 0x7a, 0x17, 0xb3, 0x39, 0xed, 0xf8, 0xb5, 0xb2, 0xa3, 0x39, 0x04, 0x3b, 0x00, - 0x9a, 0x69, 0x8c, 0x88, 0x9c, 0x65, 0xbe, 0xba, 0xff, 0x75, 0x35, 0x57, 0xdd, 0x42, 0xed, 0x45, - 0xca, 0xf9, 0x06, 0x0b, 0x8c, 0x1e, 0x58, 0xe0, 0x2f, 0x00, 0xd4, 0x67, 0xe2, 0x7f, 0xcb, 0x69, - 0xf9, 0x6d, 0xa9, 0x5b, 0x0b, 0xa5, 0xaf, 0xbd, 0x66, 0xcd, 0x8e, 0x46, 0x97, 0x9c, 0x9a, 0x5d, - 0x5c, 0x5a, 0xb6, 0xe5, 0xac, 0x5f, 0x5a, 0xf6, 0xa6, 0x63, 0x97, 0xf9, 0x33, 0xbb, 0x40, 0x3b, - 0x13, 0x3c, 0xb3, 0xbc, 0xce, 0x2f, 0xbf, 0xbf, 0xdb, 0x5b, 0xfd, 0xe1, 0x6e, 0x6f, 0xf5, 0xdf, - 0x77, 0x7b, 0xab, 0x7f, 0x7d, 0xbf, 0xb7, 0xf2, 0xc3, 0xfb, 0xbd, 0x95, 0x7f, 0xbe, 0xdf, 0x5b, - 0xf9, 0xdd, 0xec, 0xfb, 0x40, 0x06, 0xf2, 0x79, 0xd0, 0x3f, 0x07, 0xc7, 0xa7, 0x47, 0x43, 0xf5, - 0x0f, 0x03, 0xf5, 0x46, 0x74, 0x37, 0xd4, 0x3f, 0x02, 0x3e, 0xf9, 0x4f, 0x00, 0x00, 0x00, 0xff, - 0xff, 0x36, 0x0e, 0xa8, 0xa0, 0x4e, 0x10, 0x00, 0x00, -} - -func (m *V5Params) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *V5Params) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *V5Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.ActivePrecompiles) > 0 { - for iNdEx := len(m.ActivePrecompiles) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.ActivePrecompiles[iNdEx]) - copy(dAtA[i:], m.ActivePrecompiles[iNdEx]) - i = encodeVarintEvm(dAtA, i, uint64(len(m.ActivePrecompiles[iNdEx]))) - i-- - dAtA[i] = 0x3a - } - } - if m.AllowUnprotectedTxs { - i-- - if m.AllowUnprotectedTxs { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x30 - } - { - size, err := m.ChainConfig.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - if len(m.ExtraEIPs) > 0 { - dAtA3 := make([]byte, len(m.ExtraEIPs)*10) - var j2 int - for _, num1 := range m.ExtraEIPs { - num := uint64(num1) - for num >= 1<<7 { - dAtA3[j2] = uint8(uint64(num)&0x7f | 0x80) - num >>= 7 - j2++ - } - dAtA3[j2] = uint8(num) - j2++ - } - i -= j2 - copy(dAtA[i:], dAtA3[:j2]) - i = encodeVarintEvm(dAtA, i, uint64(j2)) - i-- - dAtA[i] = 0x22 - } - if m.EnableCall { - i-- - if m.EnableCall { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x18 - } - if m.EnableCreate { - i-- - if m.EnableCreate { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 - } - if len(m.EvmDenom) > 0 { - i -= len(m.EvmDenom) - copy(dAtA[i:], m.EvmDenom) - i = encodeVarintEvm(dAtA, i, uint64(len(m.EvmDenom))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *V5ChainConfig) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *V5ChainConfig) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *V5ChainConfig) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.CancunBlock != nil { - { - size := m.CancunBlock.Size() - i -= size - if _, err := m.CancunBlock.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0xba - } - if m.ShanghaiBlock != nil { - { - size := m.ShanghaiBlock.Size() - i -= size - if _, err := m.ShanghaiBlock.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0xb2 - } - if m.MergeNetsplitBlock != nil { - { - size := m.MergeNetsplitBlock.Size() - i -= size - if _, err := m.MergeNetsplitBlock.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0xaa - } - if m.GrayGlacierBlock != nil { - { - size := m.GrayGlacierBlock.Size() - i -= size - if _, err := m.GrayGlacierBlock.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0xa2 - } - if m.ArrowGlacierBlock != nil { - { - size := m.ArrowGlacierBlock.Size() - i -= size - if _, err := m.ArrowGlacierBlock.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0x92 - } - if m.LondonBlock != nil { - { - size := m.LondonBlock.Size() - i -= size - if _, err := m.LondonBlock.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0x8a - } - if m.BerlinBlock != nil { - { - size := m.BerlinBlock.Size() - i -= size - if _, err := m.BerlinBlock.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x6a - } - if m.MuirGlacierBlock != nil { - { - size := m.MuirGlacierBlock.Size() - i -= size - if _, err := m.MuirGlacierBlock.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x62 - } - if m.IstanbulBlock != nil { - { - size := m.IstanbulBlock.Size() - i -= size - if _, err := m.IstanbulBlock.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x5a - } - if m.PetersburgBlock != nil { - { - size := m.PetersburgBlock.Size() - i -= size - if _, err := m.PetersburgBlock.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x52 - } - if m.ConstantinopleBlock != nil { - { - size := m.ConstantinopleBlock.Size() - i -= size - if _, err := m.ConstantinopleBlock.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x4a - } - if m.ByzantiumBlock != nil { - { - size := m.ByzantiumBlock.Size() - i -= size - if _, err := m.ByzantiumBlock.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x42 - } - if m.EIP158Block != nil { - { - size := m.EIP158Block.Size() - i -= size - if _, err := m.EIP158Block.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a - } - if m.EIP155Block != nil { - { - size := m.EIP155Block.Size() - i -= size - if _, err := m.EIP155Block.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - } - if len(m.EIP150Hash) > 0 { - i -= len(m.EIP150Hash) - copy(dAtA[i:], m.EIP150Hash) - i = encodeVarintEvm(dAtA, i, uint64(len(m.EIP150Hash))) - i-- - dAtA[i] = 0x2a - } - if m.EIP150Block != nil { - { - size := m.EIP150Block.Size() - i -= size - if _, err := m.EIP150Block.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - if m.DAOForkSupport { - i-- - if m.DAOForkSupport { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x18 - } - if m.DAOForkBlock != nil { - { - size := m.DAOForkBlock.Size() - i -= size - if _, err := m.DAOForkBlock.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if m.HomesteadBlock != nil { - { - size := m.HomesteadBlock.Size() - i -= size - if _, err := m.HomesteadBlock.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *V5State) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *V5State) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *V5State) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Value) > 0 { - i -= len(m.Value) - copy(dAtA[i:], m.Value) - i = encodeVarintEvm(dAtA, i, uint64(len(m.Value))) - i-- - dAtA[i] = 0x12 - } - if len(m.Key) > 0 { - i -= len(m.Key) - copy(dAtA[i:], m.Key) - i = encodeVarintEvm(dAtA, i, uint64(len(m.Key))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *V5TransactionLogs) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *V5TransactionLogs) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *V5TransactionLogs) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Logs) > 0 { - for iNdEx := len(m.Logs) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Logs[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.Hash) > 0 { - i -= len(m.Hash) - copy(dAtA[i:], m.Hash) - i = encodeVarintEvm(dAtA, i, uint64(len(m.Hash))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *V5Log) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *V5Log) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *V5Log) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Removed { - i-- - if m.Removed { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x48 - } - if m.Index != 0 { - i = encodeVarintEvm(dAtA, i, uint64(m.Index)) - i-- - dAtA[i] = 0x40 - } - if len(m.BlockHash) > 0 { - i -= len(m.BlockHash) - copy(dAtA[i:], m.BlockHash) - i = encodeVarintEvm(dAtA, i, uint64(len(m.BlockHash))) - i-- - dAtA[i] = 0x3a - } - if m.TxIndex != 0 { - i = encodeVarintEvm(dAtA, i, uint64(m.TxIndex)) - i-- - dAtA[i] = 0x30 - } - if len(m.TxHash) > 0 { - i -= len(m.TxHash) - copy(dAtA[i:], m.TxHash) - i = encodeVarintEvm(dAtA, i, uint64(len(m.TxHash))) - i-- - dAtA[i] = 0x2a - } - if m.BlockNumber != 0 { - i = encodeVarintEvm(dAtA, i, uint64(m.BlockNumber)) - i-- - dAtA[i] = 0x20 - } - if len(m.Data) > 0 { - i -= len(m.Data) - copy(dAtA[i:], m.Data) - i = encodeVarintEvm(dAtA, i, uint64(len(m.Data))) - i-- - dAtA[i] = 0x1a - } - if len(m.Topics) > 0 { - for iNdEx := len(m.Topics) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Topics[iNdEx]) - copy(dAtA[i:], m.Topics[iNdEx]) - i = encodeVarintEvm(dAtA, i, uint64(len(m.Topics[iNdEx]))) - i-- - dAtA[i] = 0x12 - } - } - if len(m.Address) > 0 { - i -= len(m.Address) - copy(dAtA[i:], m.Address) - i = encodeVarintEvm(dAtA, i, uint64(len(m.Address))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *V5TxResult) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *V5TxResult) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *V5TxResult) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.GasUsed != 0 { - i = encodeVarintEvm(dAtA, i, uint64(m.GasUsed)) - i-- - dAtA[i] = 0x30 - } - if m.Reverted { - i-- - if m.Reverted { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x28 - } - if len(m.Ret) > 0 { - i -= len(m.Ret) - copy(dAtA[i:], m.Ret) - i = encodeVarintEvm(dAtA, i, uint64(len(m.Ret))) - i-- - dAtA[i] = 0x22 - } - { - size, err := m.TxLogs.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - if len(m.Bloom) > 0 { - i -= len(m.Bloom) - copy(dAtA[i:], m.Bloom) - i = encodeVarintEvm(dAtA, i, uint64(len(m.Bloom))) - i-- - dAtA[i] = 0x12 - } - if len(m.ContractAddress) > 0 { - i -= len(m.ContractAddress) - copy(dAtA[i:], m.ContractAddress) - i = encodeVarintEvm(dAtA, i, uint64(len(m.ContractAddress))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *V5AccessTuple) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *V5AccessTuple) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *V5AccessTuple) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.StorageKeys) > 0 { - for iNdEx := len(m.StorageKeys) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.StorageKeys[iNdEx]) - copy(dAtA[i:], m.StorageKeys[iNdEx]) - i = encodeVarintEvm(dAtA, i, uint64(len(m.StorageKeys[iNdEx]))) - i-- - dAtA[i] = 0x12 - } - } - if len(m.Address) > 0 { - i -= len(m.Address) - copy(dAtA[i:], m.Address) - i = encodeVarintEvm(dAtA, i, uint64(len(m.Address))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *V5TraceConfig) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *V5TraceConfig) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *V5TraceConfig) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.TracerJsonConfig) > 0 { - i -= len(m.TracerJsonConfig) - copy(dAtA[i:], m.TracerJsonConfig) - i = encodeVarintEvm(dAtA, i, uint64(len(m.TracerJsonConfig))) - i-- - dAtA[i] = 0x6a - } - if m.EnableReturnData { - i-- - if m.EnableReturnData { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x60 - } - if m.EnableMemory { - i-- - if m.EnableMemory { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x58 - } - if m.Overrides != nil { - { - size, err := m.Overrides.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvm(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x52 - } - if m.Limit != 0 { - i = encodeVarintEvm(dAtA, i, uint64(m.Limit)) - i-- - dAtA[i] = 0x48 - } - if m.Debug { - i-- - if m.Debug { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x40 - } - if m.DisableStorage { - i-- - if m.DisableStorage { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x30 - } - if m.DisableStack { - i-- - if m.DisableStack { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x28 - } - if m.Reexec != 0 { - i = encodeVarintEvm(dAtA, i, uint64(m.Reexec)) - i-- - dAtA[i] = 0x18 - } - if len(m.Timeout) > 0 { - i -= len(m.Timeout) - copy(dAtA[i:], m.Timeout) - i = encodeVarintEvm(dAtA, i, uint64(len(m.Timeout))) - i-- - dAtA[i] = 0x12 - } - if len(m.Tracer) > 0 { - i -= len(m.Tracer) - copy(dAtA[i:], m.Tracer) - i = encodeVarintEvm(dAtA, i, uint64(len(m.Tracer))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func encodeVarintEvm(dAtA []byte, offset int, v uint64) int { - offset -= sovEvm(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *V5Params) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.EvmDenom) - if l > 0 { - n += 1 + l + sovEvm(uint64(l)) - } - if m.EnableCreate { - n += 2 - } - if m.EnableCall { - n += 2 - } - if len(m.ExtraEIPs) > 0 { - l = 0 - for _, e := range m.ExtraEIPs { - l += sovEvm(uint64(e)) - } - n += 1 + sovEvm(uint64(l)) + l - } - l = m.ChainConfig.Size() - n += 1 + l + sovEvm(uint64(l)) - if m.AllowUnprotectedTxs { - n += 2 - } - if len(m.ActivePrecompiles) > 0 { - for _, s := range m.ActivePrecompiles { - l = len(s) - n += 1 + l + sovEvm(uint64(l)) - } - } - return n -} - -func (m *V5ChainConfig) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.HomesteadBlock != nil { - l = m.HomesteadBlock.Size() - n += 1 + l + sovEvm(uint64(l)) - } - if m.DAOForkBlock != nil { - l = m.DAOForkBlock.Size() - n += 1 + l + sovEvm(uint64(l)) - } - if m.DAOForkSupport { - n += 2 - } - if m.EIP150Block != nil { - l = m.EIP150Block.Size() - n += 1 + l + sovEvm(uint64(l)) - } - l = len(m.EIP150Hash) - if l > 0 { - n += 1 + l + sovEvm(uint64(l)) - } - if m.EIP155Block != nil { - l = m.EIP155Block.Size() - n += 1 + l + sovEvm(uint64(l)) - } - if m.EIP158Block != nil { - l = m.EIP158Block.Size() - n += 1 + l + sovEvm(uint64(l)) - } - if m.ByzantiumBlock != nil { - l = m.ByzantiumBlock.Size() - n += 1 + l + sovEvm(uint64(l)) - } - if m.ConstantinopleBlock != nil { - l = m.ConstantinopleBlock.Size() - n += 1 + l + sovEvm(uint64(l)) - } - if m.PetersburgBlock != nil { - l = m.PetersburgBlock.Size() - n += 1 + l + sovEvm(uint64(l)) - } - if m.IstanbulBlock != nil { - l = m.IstanbulBlock.Size() - n += 1 + l + sovEvm(uint64(l)) - } - if m.MuirGlacierBlock != nil { - l = m.MuirGlacierBlock.Size() - n += 1 + l + sovEvm(uint64(l)) - } - if m.BerlinBlock != nil { - l = m.BerlinBlock.Size() - n += 1 + l + sovEvm(uint64(l)) - } - if m.LondonBlock != nil { - l = m.LondonBlock.Size() - n += 2 + l + sovEvm(uint64(l)) - } - if m.ArrowGlacierBlock != nil { - l = m.ArrowGlacierBlock.Size() - n += 2 + l + sovEvm(uint64(l)) - } - if m.GrayGlacierBlock != nil { - l = m.GrayGlacierBlock.Size() - n += 2 + l + sovEvm(uint64(l)) - } - if m.MergeNetsplitBlock != nil { - l = m.MergeNetsplitBlock.Size() - n += 2 + l + sovEvm(uint64(l)) - } - if m.ShanghaiBlock != nil { - l = m.ShanghaiBlock.Size() - n += 2 + l + sovEvm(uint64(l)) - } - if m.CancunBlock != nil { - l = m.CancunBlock.Size() - n += 2 + l + sovEvm(uint64(l)) - } - return n -} - -func (m *V5State) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Key) - if l > 0 { - n += 1 + l + sovEvm(uint64(l)) - } - l = len(m.Value) - if l > 0 { - n += 1 + l + sovEvm(uint64(l)) - } - return n -} - -func (m *V5TransactionLogs) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Hash) - if l > 0 { - n += 1 + l + sovEvm(uint64(l)) - } - if len(m.Logs) > 0 { - for _, e := range m.Logs { - l = e.Size() - n += 1 + l + sovEvm(uint64(l)) - } - } - return n -} - -func (m *V5Log) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Address) - if l > 0 { - n += 1 + l + sovEvm(uint64(l)) - } - if len(m.Topics) > 0 { - for _, s := range m.Topics { - l = len(s) - n += 1 + l + sovEvm(uint64(l)) - } - } - l = len(m.Data) - if l > 0 { - n += 1 + l + sovEvm(uint64(l)) - } - if m.BlockNumber != 0 { - n += 1 + sovEvm(uint64(m.BlockNumber)) - } - l = len(m.TxHash) - if l > 0 { - n += 1 + l + sovEvm(uint64(l)) - } - if m.TxIndex != 0 { - n += 1 + sovEvm(uint64(m.TxIndex)) - } - l = len(m.BlockHash) - if l > 0 { - n += 1 + l + sovEvm(uint64(l)) - } - if m.Index != 0 { - n += 1 + sovEvm(uint64(m.Index)) - } - if m.Removed { - n += 2 - } - return n -} - -func (m *V5TxResult) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.ContractAddress) - if l > 0 { - n += 1 + l + sovEvm(uint64(l)) - } - l = len(m.Bloom) - if l > 0 { - n += 1 + l + sovEvm(uint64(l)) - } - l = m.TxLogs.Size() - n += 1 + l + sovEvm(uint64(l)) - l = len(m.Ret) - if l > 0 { - n += 1 + l + sovEvm(uint64(l)) - } - if m.Reverted { - n += 2 - } - if m.GasUsed != 0 { - n += 1 + sovEvm(uint64(m.GasUsed)) - } - return n -} - -func (m *V5AccessTuple) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Address) - if l > 0 { - n += 1 + l + sovEvm(uint64(l)) - } - if len(m.StorageKeys) > 0 { - for _, s := range m.StorageKeys { - l = len(s) - n += 1 + l + sovEvm(uint64(l)) - } - } - return n -} - -func (m *V5TraceConfig) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Tracer) - if l > 0 { - n += 1 + l + sovEvm(uint64(l)) - } - l = len(m.Timeout) - if l > 0 { - n += 1 + l + sovEvm(uint64(l)) - } - if m.Reexec != 0 { - n += 1 + sovEvm(uint64(m.Reexec)) - } - if m.DisableStack { - n += 2 - } - if m.DisableStorage { - n += 2 - } - if m.Debug { - n += 2 - } - if m.Limit != 0 { - n += 1 + sovEvm(uint64(m.Limit)) - } - if m.Overrides != nil { - l = m.Overrides.Size() - n += 1 + l + sovEvm(uint64(l)) - } - if m.EnableMemory { - n += 2 - } - if m.EnableReturnData { - n += 2 - } - l = len(m.TracerJsonConfig) - if l > 0 { - n += 1 + l + sovEvm(uint64(l)) - } - return n -} - -func sovEvm(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozEvm(x uint64) (n int) { - return sovEvm(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *V5Params) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Params: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Params: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EvmDenom", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.EvmDenom = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field EnableCreate", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.EnableCreate = bool(v != 0) - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field EnableCall", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.EnableCall = bool(v != 0) - case 4: - if wireType == 0 { - var v int64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.ExtraEIPs = append(m.ExtraEIPs, v) - } else if wireType == 2 { - var packedLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - packedLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if packedLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + packedLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var elementCount int - var count int - for _, integer := range dAtA[iNdEx:postIndex] { - if integer < 128 { - count++ - } - } - elementCount = count - if elementCount != 0 && len(m.ExtraEIPs) == 0 { - m.ExtraEIPs = make([]int64, 0, elementCount) - } - for iNdEx < postIndex { - var v int64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.ExtraEIPs = append(m.ExtraEIPs, v) - } - } else { - return fmt.Errorf("proto: wrong wireType = %d for field ExtraEIPs", wireType) - } - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainConfig", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ChainConfig.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field AllowUnprotectedTxs", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.AllowUnprotectedTxs = bool(v != 0) - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ActivePrecompiles", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ActivePrecompiles = append(m.ActivePrecompiles, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvm(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvm - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *V5ChainConfig) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ChainConfig: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ChainConfig: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field HomesteadBlock", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var v github_com_cosmos_cosmos_sdk_types.Int - m.HomesteadBlock = &v - if err := m.HomesteadBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DAOForkBlock", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var v github_com_cosmos_cosmos_sdk_types.Int - m.DAOForkBlock = &v - if err := m.DAOForkBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field DAOForkSupport", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.DAOForkSupport = bool(v != 0) - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EIP150Block", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var v github_com_cosmos_cosmos_sdk_types.Int - m.EIP150Block = &v - if err := m.EIP150Block.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EIP150Hash", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.EIP150Hash = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EIP155Block", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var v github_com_cosmos_cosmos_sdk_types.Int - m.EIP155Block = &v - if err := m.EIP155Block.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EIP158Block", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var v github_com_cosmos_cosmos_sdk_types.Int - m.EIP158Block = &v - if err := m.EIP158Block.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ByzantiumBlock", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var v github_com_cosmos_cosmos_sdk_types.Int - m.ByzantiumBlock = &v - if err := m.ByzantiumBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConstantinopleBlock", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var v github_com_cosmos_cosmos_sdk_types.Int - m.ConstantinopleBlock = &v - if err := m.ConstantinopleBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 10: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PetersburgBlock", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var v github_com_cosmos_cosmos_sdk_types.Int - m.PetersburgBlock = &v - if err := m.PetersburgBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 11: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field IstanbulBlock", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var v github_com_cosmos_cosmos_sdk_types.Int - m.IstanbulBlock = &v - if err := m.IstanbulBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 12: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MuirGlacierBlock", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var v github_com_cosmos_cosmos_sdk_types.Int - m.MuirGlacierBlock = &v - if err := m.MuirGlacierBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 13: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BerlinBlock", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var v github_com_cosmos_cosmos_sdk_types.Int - m.BerlinBlock = &v - if err := m.BerlinBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 17: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LondonBlock", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var v github_com_cosmos_cosmos_sdk_types.Int - m.LondonBlock = &v - if err := m.LondonBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 18: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ArrowGlacierBlock", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var v github_com_cosmos_cosmos_sdk_types.Int - m.ArrowGlacierBlock = &v - if err := m.ArrowGlacierBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 20: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field GrayGlacierBlock", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var v github_com_cosmos_cosmos_sdk_types.Int - m.GrayGlacierBlock = &v - if err := m.GrayGlacierBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 21: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MergeNetsplitBlock", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var v github_com_cosmos_cosmos_sdk_types.Int - m.MergeNetsplitBlock = &v - if err := m.MergeNetsplitBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 22: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ShanghaiBlock", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var v github_com_cosmos_cosmos_sdk_types.Int - m.ShanghaiBlock = &v - if err := m.ShanghaiBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 23: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CancunBlock", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var v github_com_cosmos_cosmos_sdk_types.Int - m.CancunBlock = &v - if err := m.CancunBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvm(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvm - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *V5State) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: State: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: State: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Key = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Value = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvm(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvm - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *V5TransactionLogs) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: TransactionLogs: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TransactionLogs: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Hash", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Hash = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Logs", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Logs = append(m.Logs, &V5Log{}) - if err := m.Logs[len(m.Logs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvm(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvm - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *V5Log) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Log: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Log: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Address = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Topics", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Topics = append(m.Topics, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) - if m.Data == nil { - m.Data = []byte{} - } - iNdEx = postIndex - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field BlockNumber", wireType) - } - m.BlockNumber = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.BlockNumber |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TxHash", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TxHash = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 6: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TxIndex", wireType) - } - m.TxIndex = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.TxIndex |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BlockHash", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.BlockHash = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 8: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) - } - m.Index = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Index |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 9: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Removed", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Removed = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipEvm(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvm - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *V5TxResult) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: TxResult: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TxResult: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ContractAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ContractAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Bloom", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Bloom = append(m.Bloom[:0], dAtA[iNdEx:postIndex]...) - if m.Bloom == nil { - m.Bloom = []byte{} - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TxLogs", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.TxLogs.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Ret", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Ret = append(m.Ret[:0], dAtA[iNdEx:postIndex]...) - if m.Ret == nil { - m.Ret = []byte{} - } - iNdEx = postIndex - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Reverted", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Reverted = bool(v != 0) - case 6: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field GasUsed", wireType) - } - m.GasUsed = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.GasUsed |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipEvm(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvm - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *V5AccessTuple) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: AccessTuple: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: AccessTuple: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Address = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field StorageKeys", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.StorageKeys = append(m.StorageKeys, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvm(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvm - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *V5TraceConfig) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: TraceConfig: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TraceConfig: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Tracer", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Tracer = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Timeout", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Timeout = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Reexec", wireType) - } - m.Reexec = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Reexec |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field DisableStack", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.DisableStack = bool(v != 0) - case 6: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field DisableStorage", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.DisableStorage = bool(v != 0) - case 8: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Debug", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Debug = bool(v != 0) - case 9: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Limit", wireType) - } - m.Limit = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Limit |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 10: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Overrides", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Overrides == nil { - m.Overrides = &V5ChainConfig{} - } - if err := m.Overrides.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 11: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field EnableMemory", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.EnableMemory = bool(v != 0) - case 12: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field EnableReturnData", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.EnableReturnData = bool(v != 0) - case 13: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TracerJsonConfig", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TracerJsonConfig = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvm(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvm - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipEvm(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowEvm - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowEvm - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowEvm - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthEvm - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupEvm - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthEvm - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthEvm = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowEvm = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupEvm = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/evm/migrations/v7/migrate.go b/x/evm/migrations/v7/migrate.go index e2ebdf43fb..9f6bc9ed09 100644 --- a/x/evm/migrations/v7/migrate.go +++ b/x/evm/migrations/v7/migrate.go @@ -1,18 +1,22 @@ // Copyright Tharsis Labs Ltd.(Evmos) // SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + package v7 import ( + "fmt" + "github.com/cosmos/cosmos-sdk/codec" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/evmos/v19/x/evm/types" v6types "github.com/evmos/evmos/v19/x/evm/migrations/v7/types" + "github.com/evmos/evmos/v19/x/evm/types" ) // MigrateStore migrates the x/evm module state from the consensus version 6 to -// version 7. Specifically, it adds the new AccessControl policy. +// version 7. Specifically, it changes the type of the Params ExtraEIPs from +// []int64 to []string and introduces the access control. func MigrateStore( ctx sdk.Context, storeKey storetypes.StoreKey, @@ -29,7 +33,6 @@ func MigrateStore( cdc.MustUnmarshal(paramsV6Bz, ¶msV6) params.EvmDenom = paramsV6.EvmDenom - params.ExtraEIPs = paramsV6.ExtraEIPs params.ChainConfig = types.ChainConfig{ HomesteadBlock: paramsV6.ChainConfig.HomesteadBlock, DAOForkBlock: paramsV6.ChainConfig.DAOForkBlock, @@ -58,6 +61,15 @@ func MigrateStore( // set the default access control configuration params.AccessControl = types.DefaultAccessControl + // Migrate old ExtraEIPs from int64 to string. Since no Evmos EIPs have been + // created before and activators contains only `ethereum_XXXX` activations, + // all values will be prefixed with `ethereum_`. + params.ExtraEIPs = make([]string, 0, len(paramsV6.ExtraEIPs)) + for _, eip := range paramsV6.ExtraEIPs { + eipName := fmt.Sprintf("ethereum_%d", eip) + params.ExtraEIPs = append(params.ExtraEIPs, eipName) + } + if err := params.Validate(); err != nil { return err } @@ -65,5 +77,6 @@ func MigrateStore( bz := cdc.MustMarshal(¶ms) store.Set(types.KeyPrefixParams, bz) + return nil } diff --git a/x/evm/migrations/v7/migrate_test.go b/x/evm/migrations/v7/migrate_test.go index fe4c67b02a..e191ea26d9 100644 --- a/x/evm/migrations/v7/migrate_test.go +++ b/x/evm/migrations/v7/migrate_test.go @@ -1,5 +1,6 @@ // Copyright Tharsis Labs Ltd.(Evmos) // SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + package v7_test import ( @@ -21,8 +22,9 @@ func TestMigrate(t *testing.T) { encCfg := encoding.MakeConfig(app.ModuleBasics) cdc := encCfg.Codec + // Initialize the store storeKey := sdk.NewKVStoreKey(types.ModuleName) - tKey := sdk.NewTransientStoreKey("transient_test") + tKey := sdk.NewTransientStoreKey("transient_storekey") ctx := testutil.DefaultContext(storeKey, tKey) kvStore := ctx.KVStore(storeKey) @@ -32,17 +34,17 @@ func TestMigrate(t *testing.T) { var chainCfgV6 v6types.V6ChainConfig err = json.Unmarshal(bz, &chainCfgV6) require.NoError(t, err) - v6Params := v6types.V6Params{ + + // Create a pre migration environment with default params. + paramsV6 := v6types.V6Params{ EvmDenom: types.DefaultEVMDenom, ChainConfig: chainCfgV6, - ExtraEIPs: types.DefaultExtraEIPs, + ExtraEIPs: v6types.DefaultExtraEIPs, AllowUnprotectedTxs: types.DefaultAllowUnprotectedTxs, ActivePrecompiles: types.DefaultStaticPrecompiles, EVMChannels: types.DefaultEVMChannels, } - - // Set the params in the store - paramsV6Bz := cdc.MustMarshal(&v6Params) + paramsV6Bz := cdc.MustMarshal(¶msV6) kvStore.Set(types.KeyPrefixParams, paramsV6Bz) err = v7.MigrateStore(ctx, storeKey, cdc) @@ -52,7 +54,6 @@ func TestMigrate(t *testing.T) { var params types.Params cdc.MustUnmarshal(paramsBz, ¶ms) - // test that the params have been migrated correctly require.Equal(t, types.DefaultEVMDenom, params.EvmDenom) require.False(t, params.AllowUnprotectedTxs) require.Equal(t, chainConfig, params.ChainConfig) diff --git a/x/evm/migrations/v7/types/evm.pb.go b/x/evm/migrations/v7/types/evm.pb.go index 825b28faff..b8bd3cbc50 100644 --- a/x/evm/migrations/v7/types/evm.pb.go +++ b/x/evm/migrations/v7/types/evm.pb.go @@ -4,19 +4,23 @@ package types import ( - cosmossdk_io_math "cosmossdk.io/math" fmt "fmt" - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" + + cosmossdk_io_math "cosmossdk.io/math" + + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" ) // Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf +var ( + _ = proto.Marshal + _ = fmt.Errorf + _ = math.Inf +) // This is a compile-time assertion to ensure that this generated file // is compatible with the proto package it is being compiled against. @@ -24,15 +28,43 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package +// V6AccessType defines the types of permissions for the operations +type V6AccessType int32 + +const ( + // ACCESS_TYPE_PERMISSIONLESS does not restrict the operation to anyone + AccessTypePermissionless V6AccessType = 0 + // ACCESS_TYPE_RESTRICTED restrict the operation to anyone + AccessTypeRestricted V6AccessType = 1 + // ACCESS_TYPE_PERMISSIONED only allows the operation for specific addresses + AccessTypePermissioned V6AccessType = 2 +) + +var V6AccessType_name = map[int32]string{ + 0: "ACCESS_TYPE_PERMISSIONLESS", + 1: "ACCESS_TYPE_RESTRICTED", + 2: "ACCESS_TYPE_PERMISSIONED", +} + +var V6AccessType_value = map[string]int32{ + "ACCESS_TYPE_PERMISSIONLESS": 0, + "ACCESS_TYPE_RESTRICTED": 1, + "ACCESS_TYPE_PERMISSIONED": 2, +} + +func (x V6AccessType) String() string { + return proto.EnumName(V6AccessType_name, int32(x)) +} + +func (V6AccessType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_d21ecc92c8c8583e, []int{0} +} + // V6Params defines the EVM module parameters type V6Params struct { // evm_denom represents the token denomination used to run the EVM state // transitions. EvmDenom string `protobuf:"bytes,1,opt,name=evm_denom,json=evmDenom,proto3" json:"evm_denom,omitempty" yaml:"evm_denom"` - // enable_create toggles state transitions that use the vm.Create function - EnableCreate bool `protobuf:"varint,2,opt,name=enable_create,json=enableCreate,proto3" json:"enable_create,omitempty" yaml:"enable_create"` - // enable_call toggles state transitions that use the vm.Call function - EnableCall bool `protobuf:"varint,3,opt,name=enable_call,json=enableCall,proto3" json:"enable_call,omitempty" yaml:"enable_call"` // extra_eips defines the additional EIPs for the vm.Config ExtraEIPs []int64 `protobuf:"varint,4,rep,packed,name=extra_eips,json=extraEips,proto3" json:"extra_eips,omitempty" yaml:"extra_eips"` // chain_config defines the EVM chain configuration parameters @@ -45,6 +77,8 @@ type V6Params struct { ActivePrecompiles []string `protobuf:"bytes,7,rep,name=active_precompiles,json=activePrecompiles,proto3" json:"active_precompiles,omitempty"` // evm_channels is the list of channel identifiers from EVM compatible chains EVMChannels []string `protobuf:"bytes,8,rep,name=evm_channels,json=evmChannels,proto3" json:"evm_channels,omitempty"` + // access_control defines the permission policy of the EVM + AccessControl V6AccessControl `protobuf:"bytes,9,opt,name=access_control,json=accessControl,proto3" json:"access_control"` } func (m *V6Params) Reset() { *m = V6Params{} } @@ -53,9 +87,11 @@ func (*V6Params) ProtoMessage() {} func (*V6Params) Descriptor() ([]byte, []int) { return fileDescriptor_d21ecc92c8c8583e, []int{0} } + func (m *V6Params) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } + func (m *V6Params) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_Params.Marshal(b, m, deterministic) @@ -68,12 +104,15 @@ func (m *V6Params) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } + func (m *V6Params) XXX_Merge(src proto.Message) { xxx_messageInfo_Params.Merge(m, src) } + func (m *V6Params) XXX_Size() int { return m.Size() } + func (m *V6Params) XXX_DiscardUnknown() { xxx_messageInfo_Params.DiscardUnknown(m) } @@ -87,20 +126,6 @@ func (m *V6Params) GetEvmDenom() string { return "" } -func (m *V6Params) GetEnableCreate() bool { - if m != nil { - return m.EnableCreate - } - return false -} - -func (m *V6Params) GetEnableCall() bool { - if m != nil { - return m.EnableCall - } - return false -} - func (m *V6Params) GetExtraEIPs() []int64 { if m != nil { return m.ExtraEIPs @@ -136,6 +161,137 @@ func (m *V6Params) GetEVMChannels() []string { return nil } +func (m *V6Params) GetAccessControl() V6AccessControl { + if m != nil { + return m.AccessControl + } + return V6AccessControl{} +} + +// V6AccessControl defines the permission policy of the EVM +// for creating and calling contracts +type V6AccessControl struct { + // create defines the permission policy for creating contracts + Create V6AccessControlType `protobuf:"bytes,1,opt,name=create,proto3" json:"create"` + // call defines the permission policy for calling contracts + Call V6AccessControlType `protobuf:"bytes,2,opt,name=call,proto3" json:"call"` +} + +func (m *V6AccessControl) Reset() { *m = V6AccessControl{} } +func (m *V6AccessControl) String() string { return proto.CompactTextString(m) } +func (*V6AccessControl) ProtoMessage() {} +func (*V6AccessControl) Descriptor() ([]byte, []int) { + return fileDescriptor_d21ecc92c8c8583e, []int{1} +} + +func (m *V6AccessControl) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} + +func (m *V6AccessControl) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_AccessControl.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} + +func (m *V6AccessControl) XXX_Merge(src proto.Message) { + xxx_messageInfo_AccessControl.Merge(m, src) +} + +func (m *V6AccessControl) XXX_Size() int { + return m.Size() +} + +func (m *V6AccessControl) XXX_DiscardUnknown() { + xxx_messageInfo_AccessControl.DiscardUnknown(m) +} + +var xxx_messageInfo_AccessControl proto.InternalMessageInfo + +func (m *V6AccessControl) GetCreate() V6AccessControlType { + if m != nil { + return m.Create + } + return V6AccessControlType{} +} + +func (m *V6AccessControl) GetCall() V6AccessControlType { + if m != nil { + return m.Call + } + return V6AccessControlType{} +} + +// V6AccessControlType defines the permission type for policies +type V6AccessControlType struct { + // access_type defines which type of permission is required for the operation + AccessType V6AccessType `protobuf:"varint,1,opt,name=access_type,json=accessType,proto3,enum=ethermint.evm.v1.AccessType" json:"access_type,omitempty" yaml:"access_type"` + // access_control_list defines defines different things depending on the AccessType: + // - ACCESS_TYPE_PERMISSIONLESS: list of addresses that are blocked from performing the operation + // - ACCESS_TYPE_RESTRICTED: ignored + // - ACCESS_TYPE_PERMISSIONED: list of addresses that are allowed to perform the operation + AccessControlList []string `protobuf:"bytes,2,rep,name=access_control_list,json=accessControlList,proto3" json:"access_control_list,omitempty" yaml:"access_control_list"` +} + +func (m *V6AccessControlType) Reset() { *m = V6AccessControlType{} } +func (m *V6AccessControlType) String() string { return proto.CompactTextString(m) } +func (*V6AccessControlType) ProtoMessage() {} +func (*V6AccessControlType) Descriptor() ([]byte, []int) { + return fileDescriptor_d21ecc92c8c8583e, []int{2} +} + +func (m *V6AccessControlType) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} + +func (m *V6AccessControlType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_AccessControlType.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} + +func (m *V6AccessControlType) XXX_Merge(src proto.Message) { + xxx_messageInfo_AccessControlType.Merge(m, src) +} + +func (m *V6AccessControlType) XXX_Size() int { + return m.Size() +} + +func (m *V6AccessControlType) XXX_DiscardUnknown() { + xxx_messageInfo_AccessControlType.DiscardUnknown(m) +} + +var xxx_messageInfo_AccessControlType proto.InternalMessageInfo + +func (m *V6AccessControlType) GetAccessType() V6AccessType { + if m != nil { + return m.AccessType + } + return AccessTypePermissionless +} + +func (m *V6AccessControlType) GetAccessControlList() []string { + if m != nil { + return m.AccessControlList + } + return nil +} + // V6ChainConfig defines the Ethereum V6ChainConfig parameters using *sdk.Int values // instead of *big.Int. type V6ChainConfig struct { @@ -184,11 +340,13 @@ func (m *V6ChainConfig) Reset() { *m = V6ChainConfig{} } func (m *V6ChainConfig) String() string { return proto.CompactTextString(m) } func (*V6ChainConfig) ProtoMessage() {} func (*V6ChainConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_d21ecc92c8c8583e, []int{1} + return fileDescriptor_d21ecc92c8c8583e, []int{3} } + func (m *V6ChainConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } + func (m *V6ChainConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_ChainConfig.Marshal(b, m, deterministic) @@ -201,12 +359,15 @@ func (m *V6ChainConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return b[:n], nil } } + func (m *V6ChainConfig) XXX_Merge(src proto.Message) { xxx_messageInfo_ChainConfig.Merge(m, src) } + func (m *V6ChainConfig) XXX_Size() int { return m.Size() } + func (m *V6ChainConfig) XXX_DiscardUnknown() { xxx_messageInfo_ChainConfig.DiscardUnknown(m) } @@ -239,11 +400,13 @@ func (m *V6State) Reset() { *m = V6State{} } func (m *V6State) String() string { return proto.CompactTextString(m) } func (*V6State) ProtoMessage() {} func (*V6State) Descriptor() ([]byte, []int) { - return fileDescriptor_d21ecc92c8c8583e, []int{2} + return fileDescriptor_d21ecc92c8c8583e, []int{4} } + func (m *V6State) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } + func (m *V6State) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_State.Marshal(b, m, deterministic) @@ -256,12 +419,15 @@ func (m *V6State) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } + func (m *V6State) XXX_Merge(src proto.Message) { xxx_messageInfo_State.Merge(m, src) } + func (m *V6State) XXX_Size() int { return m.Size() } + func (m *V6State) XXX_DiscardUnknown() { xxx_messageInfo_State.DiscardUnknown(m) } @@ -296,11 +462,13 @@ func (m *V6TransactionLogs) Reset() { *m = V6TransactionLogs{} } func (m *V6TransactionLogs) String() string { return proto.CompactTextString(m) } func (*V6TransactionLogs) ProtoMessage() {} func (*V6TransactionLogs) Descriptor() ([]byte, []int) { - return fileDescriptor_d21ecc92c8c8583e, []int{3} + return fileDescriptor_d21ecc92c8c8583e, []int{5} } + func (m *V6TransactionLogs) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } + func (m *V6TransactionLogs) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_TransactionLogs.Marshal(b, m, deterministic) @@ -313,12 +481,15 @@ func (m *V6TransactionLogs) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return b[:n], nil } } + func (m *V6TransactionLogs) XXX_Merge(src proto.Message) { xxx_messageInfo_TransactionLogs.Merge(m, src) } + func (m *V6TransactionLogs) XXX_Size() int { return m.Size() } + func (m *V6TransactionLogs) XXX_DiscardUnknown() { xxx_messageInfo_TransactionLogs.DiscardUnknown(m) } @@ -372,11 +543,13 @@ func (m *V6Log) Reset() { *m = V6Log{} } func (m *V6Log) String() string { return proto.CompactTextString(m) } func (*V6Log) ProtoMessage() {} func (*V6Log) Descriptor() ([]byte, []int) { - return fileDescriptor_d21ecc92c8c8583e, []int{4} + return fileDescriptor_d21ecc92c8c8583e, []int{6} } + func (m *V6Log) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } + func (m *V6Log) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_Log.Marshal(b, m, deterministic) @@ -389,12 +562,15 @@ func (m *V6Log) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } + func (m *V6Log) XXX_Merge(src proto.Message) { xxx_messageInfo_Log.Merge(m, src) } + func (m *V6Log) XXX_Size() int { return m.Size() } + func (m *V6Log) XXX_DiscardUnknown() { xxx_messageInfo_Log.DiscardUnknown(m) } @@ -487,11 +663,13 @@ func (m *V6TxResult) Reset() { *m = V6TxResult{} } func (m *V6TxResult) String() string { return proto.CompactTextString(m) } func (*V6TxResult) ProtoMessage() {} func (*V6TxResult) Descriptor() ([]byte, []int) { - return fileDescriptor_d21ecc92c8c8583e, []int{5} + return fileDescriptor_d21ecc92c8c8583e, []int{7} } + func (m *V6TxResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } + func (m *V6TxResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_TxResult.Marshal(b, m, deterministic) @@ -504,12 +682,15 @@ func (m *V6TxResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } + func (m *V6TxResult) XXX_Merge(src proto.Message) { xxx_messageInfo_TxResult.Merge(m, src) } + func (m *V6TxResult) XXX_Size() int { return m.Size() } + func (m *V6TxResult) XXX_DiscardUnknown() { xxx_messageInfo_TxResult.DiscardUnknown(m) } @@ -528,11 +709,13 @@ func (m *V6AccessTuple) Reset() { *m = V6AccessTuple{} } func (m *V6AccessTuple) String() string { return proto.CompactTextString(m) } func (*V6AccessTuple) ProtoMessage() {} func (*V6AccessTuple) Descriptor() ([]byte, []int) { - return fileDescriptor_d21ecc92c8c8583e, []int{6} + return fileDescriptor_d21ecc92c8c8583e, []int{8} } + func (m *V6AccessTuple) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } + func (m *V6AccessTuple) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_AccessTuple.Marshal(b, m, deterministic) @@ -545,12 +728,15 @@ func (m *V6AccessTuple) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return b[:n], nil } } + func (m *V6AccessTuple) XXX_Merge(src proto.Message) { xxx_messageInfo_AccessTuple.Merge(m, src) } + func (m *V6AccessTuple) XXX_Size() int { return m.Size() } + func (m *V6AccessTuple) XXX_DiscardUnknown() { xxx_messageInfo_AccessTuple.DiscardUnknown(m) } @@ -588,11 +774,13 @@ func (m *V6TraceConfig) Reset() { *m = V6TraceConfig{} } func (m *V6TraceConfig) String() string { return proto.CompactTextString(m) } func (*V6TraceConfig) ProtoMessage() {} func (*V6TraceConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_d21ecc92c8c8583e, []int{7} + return fileDescriptor_d21ecc92c8c8583e, []int{9} } + func (m *V6TraceConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } + func (m *V6TraceConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_TraceConfig.Marshal(b, m, deterministic) @@ -605,12 +793,15 @@ func (m *V6TraceConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return b[:n], nil } } + func (m *V6TraceConfig) XXX_Merge(src proto.Message) { xxx_messageInfo_TraceConfig.Merge(m, src) } + func (m *V6TraceConfig) XXX_Size() int { return m.Size() } + func (m *V6TraceConfig) XXX_DiscardUnknown() { xxx_messageInfo_TraceConfig.DiscardUnknown(m) } @@ -695,7 +886,10 @@ func (m *V6TraceConfig) GetTracerJsonConfig() string { } func init() { + proto.RegisterEnum("ethermint.evm.v1.V6AccessType", V6AccessType_name, V6AccessType_value) proto.RegisterType((*V6Params)(nil), "ethermint.evm.v1.V6Params") + proto.RegisterType((*V6AccessControl)(nil), "ethermint.evm.v1.V6AccessControl") + proto.RegisterType((*V6AccessControlType)(nil), "ethermint.evm.v1.V6AccessControlType") proto.RegisterType((*V6ChainConfig)(nil), "ethermint.evm.v1.V6ChainConfig") proto.RegisterType((*V6State)(nil), "ethermint.evm.v1.V6State") proto.RegisterType((*V6TransactionLogs)(nil), "ethermint.evm.v1.V6TransactionLogs") @@ -708,111 +902,125 @@ func init() { func init() { proto.RegisterFile("ethermint/evm/v1/evm.proto", fileDescriptor_d21ecc92c8c8583e) } var fileDescriptor_d21ecc92c8c8583e = []byte{ - // 1661 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x57, 0xcd, 0x4f, 0x23, 0xc9, - 0x15, 0x07, 0x6c, 0xa0, 0x5d, 0x36, 0x76, 0x53, 0x18, 0xd6, 0x3b, 0xa3, 0xd0, 0xa4, 0x0f, 0x11, - 0x91, 0x76, 0x61, 0x60, 0x42, 0x16, 0xed, 0x2a, 0x1f, 0xd3, 0x33, 0x6c, 0x02, 0x99, 0xdd, 0xa0, - 0x1a, 0x36, 0x51, 0xa2, 0x44, 0xad, 0x72, 0x77, 0x6d, 0xbb, 0x97, 0xee, 0x2e, 0xab, 0xaa, 0xda, - 0x63, 0xe7, 0x2f, 0x88, 0x94, 0x4b, 0xfe, 0x84, 0xfd, 0x73, 0x56, 0x39, 0xcd, 0x31, 0xca, 0xa1, - 0x15, 0x31, 0x37, 0x94, 0x13, 0xf7, 0x48, 0x51, 0x7d, 0xb8, 0xfd, 0x01, 0x61, 0x7d, 0x81, 0xfa, - 0xbd, 0x8f, 0xdf, 0xab, 0xf7, 0xea, 0xb5, 0x5f, 0x15, 0x78, 0x42, 0x44, 0x8f, 0xb0, 0x34, 0xce, - 0xc4, 0x21, 0x19, 0xa4, 0x87, 0x83, 0x23, 0xf9, 0xef, 0xa0, 0xcf, 0xa8, 0xa0, 0xd0, 0x2e, 0x75, - 0x07, 0x52, 0x38, 0x38, 0x7a, 0xd2, 0x8e, 0x68, 0x44, 0x95, 0xf2, 0x50, 0xae, 0xb4, 0x9d, 0xfb, - 0x9f, 0x0a, 0x58, 0xbb, 0xc4, 0x0c, 0xa7, 0x1c, 0x1e, 0x81, 0x1a, 0x19, 0xa4, 0x7e, 0x48, 0x32, - 0x9a, 0x76, 0x96, 0xf7, 0x96, 0xf7, 0x6b, 0x5e, 0xfb, 0xae, 0x70, 0xec, 0x11, 0x4e, 0x93, 0x4f, - 0xdd, 0x52, 0xe5, 0x22, 0x8b, 0x0c, 0xd2, 0x57, 0x72, 0x09, 0x7f, 0x06, 0x36, 0x48, 0x86, 0xbb, - 0x09, 0xf1, 0x03, 0x46, 0xb0, 0x20, 0x9d, 0x95, 0xbd, 0xe5, 0x7d, 0xcb, 0xeb, 0xdc, 0x15, 0x4e, - 0xdb, 0xb8, 0x4d, 0xab, 0x5d, 0xd4, 0xd0, 0xf8, 0xa5, 0x82, 0xf0, 0x13, 0x50, 0x1f, 0xeb, 0x71, - 0x92, 0x74, 0x2a, 0xca, 0x79, 0xe7, 0xae, 0x70, 0xe0, 0xac, 0x33, 0x4e, 0x12, 0x17, 0x01, 0xe3, - 0x8a, 0x93, 0x04, 0xbe, 0x00, 0x80, 0x0c, 0x05, 0xc3, 0x3e, 0x89, 0xfb, 0xbc, 0x53, 0xdd, 0xab, - 0xec, 0x57, 0x3c, 0xf7, 0xa6, 0x70, 0x6a, 0x67, 0x52, 0x7a, 0x76, 0x7e, 0xc9, 0xef, 0x0a, 0x67, - 0xd3, 0x90, 0x94, 0x86, 0x2e, 0xaa, 0x29, 0x70, 0x16, 0xf7, 0x39, 0xfc, 0x33, 0x68, 0x04, 0x3d, - 0x1c, 0x67, 0x7e, 0x40, 0xb3, 0xaf, 0xe3, 0xa8, 0xb3, 0xba, 0xb7, 0xbc, 0x5f, 0x3f, 0xfe, 0xc1, - 0xc1, 0x7c, 0xdd, 0x0e, 0x5e, 0x4a, 0xab, 0x97, 0xca, 0xc8, 0x7b, 0xfa, 0x5d, 0xe1, 0x2c, 0xdd, - 0x15, 0xce, 0x96, 0xa6, 0x9e, 0x26, 0x70, 0x51, 0x3d, 0x98, 0x58, 0xc2, 0x63, 0xb0, 0x8d, 0x93, - 0x84, 0xbe, 0xf5, 0xf3, 0x4c, 0x16, 0x9a, 0x04, 0x82, 0x84, 0xbe, 0x18, 0xf2, 0xce, 0x9a, 0x4c, - 0x12, 0x6d, 0x29, 0xe5, 0x57, 0x13, 0xdd, 0xd5, 0x90, 0xc3, 0x8f, 0x01, 0xc4, 0x81, 0x88, 0x07, - 0xc4, 0xef, 0x33, 0x12, 0xd0, 0xb4, 0x1f, 0x27, 0x84, 0x77, 0xd6, 0xf7, 0x2a, 0xfb, 0x35, 0xb4, - 0xa9, 0x35, 0x97, 0x13, 0x05, 0x3c, 0x06, 0x0d, 0x79, 0x28, 0x41, 0x0f, 0x67, 0x19, 0x49, 0x78, - 0xc7, 0x92, 0x86, 0x5e, 0xeb, 0xa6, 0x70, 0xea, 0x67, 0xbf, 0xfb, 0xe2, 0xa5, 0x11, 0xa3, 0x3a, - 0x19, 0xa4, 0x63, 0xe0, 0xfe, 0xb7, 0x09, 0xea, 0x53, 0x09, 0xc1, 0x3f, 0x81, 0x56, 0x8f, 0xa6, - 0x84, 0x0b, 0x82, 0x43, 0xbf, 0x9b, 0xd0, 0xe0, 0xda, 0x9c, 0xfc, 0xf3, 0x7f, 0x15, 0xce, 0x76, - 0x40, 0x79, 0x4a, 0x39, 0x0f, 0xaf, 0x0f, 0x62, 0x7a, 0x98, 0x62, 0xd1, 0x3b, 0x38, 0xcf, 0xc4, - 0x5d, 0xe1, 0xec, 0xe8, 0xf4, 0xe7, 0x3c, 0x5d, 0xd4, 0x2c, 0x25, 0x9e, 0x14, 0xc0, 0x1e, 0x68, - 0x86, 0x98, 0xfa, 0x5f, 0x53, 0x76, 0x6d, 0xc8, 0x57, 0x14, 0xb9, 0xf7, 0x7f, 0xc9, 0x6f, 0x0a, - 0xa7, 0xf1, 0xea, 0xc5, 0x6f, 0x3f, 0xa7, 0xec, 0x5a, 0x51, 0xdc, 0x15, 0xce, 0xb6, 0x0e, 0x36, - 0x4b, 0xe4, 0xa2, 0x46, 0x88, 0x69, 0x69, 0x06, 0x7f, 0x0f, 0xec, 0xd2, 0x80, 0xe7, 0xfd, 0x3e, - 0x65, 0xc2, 0xb4, 0xd3, 0xc7, 0x37, 0x85, 0xd3, 0x34, 0x94, 0x6f, 0xb4, 0xe6, 0xae, 0x70, 0x3e, - 0x98, 0x23, 0x35, 0x3e, 0x2e, 0x6a, 0x1a, 0x5a, 0x63, 0x0a, 0xbb, 0xa0, 0x41, 0xe2, 0xfe, 0xd1, - 0xc9, 0x33, 0x93, 0x40, 0x55, 0x25, 0xf0, 0x8b, 0xc7, 0x12, 0xa8, 0x9f, 0x9d, 0x5f, 0x1e, 0x9d, - 0x3c, 0x1b, 0xef, 0xdf, 0xf4, 0xca, 0x34, 0x8b, 0x8b, 0xea, 0x1a, 0xea, 0xcd, 0x9f, 0x03, 0x03, - 0xfd, 0x1e, 0xe6, 0x3d, 0xd5, 0x89, 0x35, 0x6f, 0xff, 0xa6, 0x70, 0x80, 0x66, 0xfa, 0x35, 0xe6, - 0xbd, 0x49, 0xd5, 0xbb, 0xa3, 0xbf, 0xe0, 0x4c, 0xc4, 0x79, 0x3a, 0xe6, 0x02, 0xda, 0x59, 0x5a, - 0x95, 0xdb, 0x3d, 0x31, 0xdb, 0x5d, 0x5b, 0x74, 0xbb, 0x27, 0x0f, 0x6d, 0xf7, 0x64, 0x76, 0xbb, - 0xda, 0xa6, 0x8c, 0x71, 0x6a, 0x62, 0xac, 0x2f, 0x1a, 0xe3, 0xf4, 0xa1, 0x18, 0xa7, 0xb3, 0x31, - 0xb4, 0x8d, 0xec, 0xcb, 0xb9, 0x3c, 0x3b, 0xd6, 0xc2, 0x7d, 0x79, 0xaf, 0x42, 0xcd, 0x52, 0xa2, - 0xd9, 0xaf, 0x41, 0x3b, 0xa0, 0x19, 0x17, 0x52, 0x96, 0xd1, 0x7e, 0x42, 0x4c, 0x88, 0x9a, 0x0a, - 0x71, 0xfa, 0x58, 0x88, 0xa7, 0xe6, 0xcb, 0x7f, 0xc0, 0xdd, 0x45, 0x5b, 0xb3, 0x62, 0x1d, 0xcc, - 0x07, 0x76, 0x9f, 0x08, 0xc2, 0x78, 0x37, 0x67, 0x91, 0x09, 0x04, 0x54, 0xa0, 0x9f, 0x3c, 0x16, - 0xc8, 0x74, 0xe8, 0xbc, 0xab, 0x8b, 0x5a, 0x13, 0x91, 0x0e, 0xf0, 0x07, 0xd0, 0x8c, 0x65, 0xd4, - 0x6e, 0x9e, 0x18, 0xfa, 0xba, 0xa2, 0x3f, 0x7e, 0x8c, 0xde, 0x7c, 0x55, 0xb3, 0x8e, 0x2e, 0xda, - 0x18, 0x0b, 0x34, 0x75, 0x08, 0x60, 0x9a, 0xc7, 0xcc, 0x8f, 0x12, 0x1c, 0xc4, 0x84, 0x19, 0xfa, - 0x86, 0xa2, 0xff, 0xe9, 0x63, 0xf4, 0x1f, 0x6a, 0xfa, 0xfb, 0xce, 0x2e, 0xb2, 0xa5, 0xf0, 0x57, - 0x5a, 0xa6, 0xa3, 0xbc, 0x01, 0x8d, 0x2e, 0x61, 0x49, 0x9c, 0x19, 0xfe, 0x0d, 0xc5, 0xff, 0xec, - 0x31, 0x7e, 0xd3, 0x41, 0xd3, 0x6e, 0x2e, 0xaa, 0x6b, 0x58, 0x92, 0x26, 0x34, 0x0b, 0xe9, 0x98, - 0x74, 0x73, 0x61, 0xd2, 0x69, 0x37, 0x17, 0xd5, 0x35, 0xd4, 0xa4, 0x11, 0xd8, 0xc2, 0x8c, 0xd1, - 0xb7, 0x73, 0x05, 0x81, 0x8a, 0xfb, 0x93, 0xc7, 0xb8, 0x9f, 0x68, 0xee, 0x07, 0xbc, 0x5d, 0xb4, - 0xa9, 0xa4, 0x33, 0x25, 0x09, 0x01, 0x8c, 0x18, 0x1e, 0xcd, 0xc5, 0x69, 0x2f, 0x5c, 0xf8, 0xfb, - 0xce, 0x2e, 0xb2, 0xa5, 0x70, 0x26, 0xca, 0x37, 0xa0, 0x9d, 0x12, 0x16, 0x11, 0x3f, 0x23, 0x82, - 0xf7, 0x93, 0x58, 0x98, 0x38, 0xdb, 0x0b, 0x7f, 0x07, 0x0f, 0xb9, 0xbb, 0x08, 0x2a, 0xf1, 0x97, - 0x46, 0x5a, 0x76, 0x29, 0xef, 0xe1, 0x2c, 0xea, 0xe1, 0xd8, 0x44, 0xd9, 0x59, 0xb8, 0x4b, 0x67, - 0x1d, 0x5d, 0xb4, 0x31, 0x16, 0x94, 0x47, 0x1d, 0xe0, 0x2c, 0xc8, 0xc7, 0x47, 0xfd, 0xc1, 0xc2, - 0x47, 0x3d, 0xed, 0x26, 0x07, 0xb8, 0x82, 0x8a, 0xf4, 0xa2, 0x6a, 0x35, 0xed, 0xd6, 0x45, 0xd5, - 0x6a, 0xd9, 0xf6, 0x45, 0xd5, 0xb2, 0xed, 0xcd, 0x8b, 0xaa, 0xb5, 0x65, 0xb7, 0xd1, 0xc6, 0x88, - 0x26, 0xd4, 0x1f, 0x3c, 0xd7, 0x4e, 0xa8, 0x4e, 0xde, 0x62, 0x6e, 0x7e, 0x68, 0x50, 0x33, 0xc0, - 0x02, 0x27, 0x23, 0x6e, 0x0a, 0x81, 0x6c, 0x5d, 0x9e, 0xa9, 0xb1, 0x75, 0x08, 0x56, 0xdf, 0x08, - 0x79, 0xf5, 0xb1, 0x41, 0xe5, 0x9a, 0x8c, 0xf4, 0xb0, 0x45, 0x72, 0x09, 0xdb, 0x60, 0x75, 0x80, - 0x93, 0x5c, 0xdf, 0xa1, 0x6a, 0x48, 0x03, 0xf7, 0x12, 0xb4, 0xae, 0x18, 0xce, 0xb8, 0x1c, 0xff, - 0x34, 0x7b, 0x4d, 0x23, 0x0e, 0x21, 0xa8, 0xaa, 0x39, 0xa1, 0x7d, 0xd5, 0x1a, 0xfe, 0x18, 0x54, - 0x13, 0x1a, 0xf1, 0xce, 0xca, 0x5e, 0x65, 0xbf, 0x7e, 0xbc, 0x7d, 0xff, 0x16, 0xf3, 0x9a, 0x46, - 0x48, 0x99, 0xb8, 0xff, 0x58, 0x01, 0x95, 0xd7, 0x34, 0x82, 0x1d, 0xb0, 0x8e, 0xc3, 0x90, 0x11, - 0xce, 0x0d, 0xd3, 0x18, 0xc2, 0x1d, 0xb0, 0x26, 0x68, 0x3f, 0x0e, 0x34, 0x5d, 0x0d, 0x19, 0x24, - 0x03, 0x87, 0x58, 0x60, 0x35, 0x58, 0x1b, 0x48, 0xad, 0xe5, 0x25, 0x44, 0x65, 0xe6, 0x67, 0x79, - 0xda, 0x25, 0x4c, 0xcd, 0xc7, 0xaa, 0xd7, 0xba, 0x2d, 0x9c, 0xba, 0x92, 0x7f, 0xa9, 0xc4, 0x68, - 0x1a, 0xc0, 0x8f, 0xc0, 0xba, 0x18, 0x4e, 0xcf, 0xba, 0xad, 0xdb, 0xc2, 0x69, 0x89, 0x49, 0x9a, - 0x72, 0x94, 0xa1, 0x35, 0x31, 0x54, 0x23, 0xed, 0x10, 0x58, 0x62, 0xe8, 0xc7, 0x59, 0x48, 0x86, - 0x6a, 0x9c, 0x55, 0xbd, 0xf6, 0x6d, 0xe1, 0xd8, 0x53, 0xe6, 0xe7, 0x52, 0x87, 0xd6, 0xc5, 0x50, - 0x2d, 0xe0, 0x47, 0x00, 0xe8, 0x2d, 0xa9, 0x08, 0x7a, 0x3a, 0x6d, 0xdc, 0x16, 0x4e, 0x4d, 0x49, - 0x15, 0xf7, 0x64, 0x09, 0x5d, 0xb0, 0xaa, 0xb9, 0x2d, 0xc5, 0xdd, 0xb8, 0x2d, 0x1c, 0x2b, 0xa1, - 0x91, 0xe6, 0xd4, 0x2a, 0x59, 0x2a, 0x46, 0x52, 0x3a, 0x20, 0xa1, 0x1a, 0x11, 0x16, 0x1a, 0x43, - 0xf7, 0x6f, 0x2b, 0xc0, 0xba, 0x1a, 0x22, 0xc2, 0xf3, 0x44, 0xc0, 0xcf, 0x81, 0x1d, 0xd0, 0x4c, - 0x30, 0x1c, 0x08, 0x7f, 0xa6, 0xb4, 0xde, 0xd3, 0xc9, 0x0f, 0xfa, 0xbc, 0x85, 0x8b, 0x5a, 0x63, - 0xd1, 0x0b, 0x53, 0xff, 0x36, 0x58, 0xed, 0x26, 0x94, 0xa6, 0xaa, 0x13, 0x1a, 0x48, 0x03, 0x88, - 0x54, 0xd5, 0xd4, 0x29, 0x57, 0xd4, 0x5d, 0xf5, 0x87, 0xf7, 0x4f, 0x79, 0xae, 0x55, 0xbc, 0x1d, - 0x73, 0x5f, 0x6d, 0xea, 0xd8, 0xc6, 0xdf, 0x95, 0xb5, 0x55, 0xad, 0x64, 0x83, 0x0a, 0x23, 0x42, - 0x1d, 0x5a, 0x03, 0xc9, 0x25, 0x7c, 0x02, 0x2c, 0x46, 0x06, 0x84, 0x09, 0x12, 0xaa, 0xc3, 0xb1, - 0x50, 0x89, 0xe1, 0x87, 0xc0, 0x8a, 0x30, 0xf7, 0x73, 0x4e, 0x42, 0x7d, 0x12, 0x68, 0x3d, 0xc2, - 0xfc, 0x2b, 0x4e, 0xc2, 0x4f, 0xab, 0x7f, 0xfd, 0xd6, 0x59, 0x72, 0x31, 0xa8, 0xbf, 0x08, 0x02, - 0xc2, 0xf9, 0x55, 0xde, 0x4f, 0xc8, 0x23, 0x1d, 0x76, 0x0c, 0x1a, 0x5c, 0x50, 0x86, 0x23, 0xe2, - 0x5f, 0x93, 0x91, 0xe9, 0x33, 0xdd, 0x35, 0x46, 0xfe, 0x1b, 0x32, 0xe2, 0x68, 0x1a, 0x98, 0x10, - 0xdf, 0x56, 0x41, 0xfd, 0x8a, 0xe1, 0x80, 0x98, 0x0b, 0xac, 0xec, 0x55, 0x09, 0x99, 0x09, 0x61, - 0x90, 0x8c, 0x2d, 0xe2, 0x94, 0xd0, 0x5c, 0x98, 0xef, 0x69, 0x0c, 0xa5, 0x07, 0x23, 0x64, 0x48, - 0x02, 0x55, 0xc6, 0x2a, 0x32, 0x08, 0x9e, 0x80, 0x8d, 0x30, 0xe6, 0xea, 0xc1, 0xc1, 0x05, 0x0e, - 0xae, 0x75, 0xfa, 0x9e, 0x7d, 0x5b, 0x38, 0x0d, 0xa3, 0x78, 0x23, 0xe5, 0x68, 0x06, 0xc1, 0xcf, - 0x40, 0x6b, 0xe2, 0xa6, 0x76, 0xab, 0xaf, 0xf8, 0x1e, 0xbc, 0x2d, 0x9c, 0x66, 0x69, 0xaa, 0x34, - 0x68, 0x0e, 0xcb, 0x93, 0x0e, 0x49, 0x37, 0x8f, 0x54, 0xf3, 0x59, 0x48, 0x03, 0x29, 0x4d, 0xe2, - 0x34, 0x16, 0xaa, 0xd9, 0x56, 0x91, 0x06, 0xf0, 0x33, 0x50, 0xa3, 0x03, 0xc2, 0x58, 0x1c, 0x12, - 0xae, 0x2e, 0x10, 0xdf, 0xf7, 0x5a, 0x41, 0x13, 0x7b, 0x99, 0x9c, 0x79, 0x4c, 0xa5, 0x24, 0xa5, - 0x6c, 0xa4, 0xae, 0x08, 0x26, 0x39, 0xad, 0xf8, 0x42, 0xc9, 0xd1, 0x0c, 0x82, 0x1e, 0x80, 0xc6, - 0x8d, 0x11, 0x91, 0xb3, 0xcc, 0x57, 0xdf, 0x7f, 0x43, 0xf9, 0xaa, 0xaf, 0x50, 0x6b, 0x91, 0x52, - 0xbe, 0xc2, 0x02, 0xa3, 0x7b, 0x12, 0xf8, 0x73, 0x00, 0xf5, 0x99, 0xf8, 0xdf, 0x70, 0x5a, 0x3e, - 0xb7, 0xf4, 0x8c, 0x57, 0xf1, 0xb5, 0xd6, 0xec, 0xd9, 0xd6, 0xe8, 0x82, 0x53, 0x93, 0xc5, 0x45, - 0xd5, 0xaa, 0xda, 0xab, 0x17, 0x55, 0x6b, 0xdd, 0xb6, 0xca, 0xfa, 0x99, 0x2c, 0xd0, 0xd6, 0x18, - 0x4f, 0x6d, 0xcf, 0xfb, 0xe5, 0x77, 0x37, 0xbb, 0xcb, 0xef, 0x6e, 0x76, 0x97, 0xff, 0x7d, 0xb3, - 0xbb, 0xfc, 0xf7, 0xf7, 0xbb, 0x4b, 0xef, 0xde, 0xef, 0x2e, 0xfd, 0xf3, 0xfd, 0xee, 0xd2, 0x1f, - 0x7f, 0x14, 0xc5, 0xa2, 0x97, 0x77, 0x0f, 0x02, 0x9a, 0xca, 0xa7, 0x32, 0xe5, 0xe6, 0xef, 0xe0, - 0xe8, 0xf4, 0x70, 0xa8, 0xde, 0xd0, 0x62, 0xd4, 0x27, 0xbc, 0xbb, 0xa6, 0xde, 0xc6, 0xcf, 0xff, - 0x17, 0x00, 0x00, 0xff, 0xff, 0xc3, 0x00, 0x49, 0xb2, 0x61, 0x0f, 0x00, 0x00, + // 1884 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x58, 0xdd, 0x4f, 0x2b, 0xc7, + 0x15, 0xc7, 0x78, 0x81, 0xf5, 0xd8, 0xd8, 0xcb, 0x60, 0x88, 0xe3, 0xa4, 0x2c, 0xdd, 0x56, 0x15, + 0xad, 0x12, 0xb8, 0x70, 0x43, 0x8b, 0x92, 0x7e, 0x61, 0x70, 0x5a, 0x28, 0xf7, 0x06, 0x8d, 0x49, + 0xab, 0x54, 0x8d, 0x56, 0xe3, 0xdd, 0x89, 0xbd, 0x61, 0x77, 0xc7, 0xda, 0x19, 0xfb, 0xda, 0xfd, + 0x0b, 0xa2, 0xdb, 0x97, 0xf6, 0x0f, 0xb8, 0x52, 0xa4, 0xfe, 0x23, 0x7d, 0x8c, 0xfa, 0x94, 0xc7, + 0xaa, 0x52, 0xb7, 0x95, 0xef, 0x1b, 0x8f, 0xbc, 0x57, 0xaa, 0xe6, 0xc3, 0x9f, 0x10, 0x42, 0x5f, + 0x60, 0xce, 0xd7, 0xef, 0x77, 0xce, 0x99, 0xb3, 0x3b, 0xb3, 0x06, 0x55, 0xc2, 0xdb, 0x24, 0x89, + 0x82, 0x98, 0xef, 0x91, 0x5e, 0xb4, 0xd7, 0xdb, 0x17, 0xff, 0x76, 0x3b, 0x09, 0xe5, 0x14, 0x5a, + 0x63, 0xdb, 0xae, 0x50, 0xf6, 0xf6, 0xab, 0xe5, 0x16, 0x6d, 0x51, 0x69, 0xdc, 0x13, 0x2b, 0xe5, + 0xe7, 0xfc, 0x3b, 0x0b, 0x96, 0x2f, 0x71, 0x82, 0x23, 0x06, 0xf7, 0x41, 0x8e, 0xf4, 0x22, 0xd7, + 0x27, 0x31, 0x8d, 0x2a, 0x99, 0xed, 0xcc, 0x4e, 0xae, 0x56, 0xbe, 0x4d, 0x6d, 0x6b, 0x80, 0xa3, + 0xf0, 0x7d, 0x67, 0x6c, 0x72, 0x90, 0x49, 0x7a, 0xd1, 0xa9, 0x58, 0xc2, 0x63, 0x00, 0x48, 0x9f, + 0x27, 0xd8, 0x25, 0x41, 0x87, 0x55, 0x8c, 0xed, 0xec, 0x4e, 0xb6, 0xe6, 0x0c, 0x53, 0x3b, 0x57, + 0x17, 0xda, 0xfa, 0xd9, 0x25, 0xbb, 0x4d, 0xed, 0x35, 0x0d, 0x30, 0x76, 0x74, 0x50, 0x4e, 0x0a, + 0xf5, 0xa0, 0xc3, 0xe0, 0xa7, 0xa0, 0xe0, 0xb5, 0x71, 0x10, 0xbb, 0x1e, 0x8d, 0x3f, 0x0b, 0x5a, + 0x95, 0xa5, 0xed, 0xcc, 0x4e, 0xfe, 0xe0, 0x3b, 0xbb, 0xf3, 0xf9, 0xef, 0x9e, 0x08, 0xaf, 0x13, + 0xe9, 0x54, 0x7b, 0xeb, 0xab, 0xd4, 0x5e, 0xb8, 0x4d, 0xed, 0x75, 0x05, 0x3d, 0x0d, 0xe0, 0xa0, + 0xbc, 0x37, 0xf1, 0x84, 0x07, 0x60, 0x03, 0x87, 0x21, 0x7d, 0xe1, 0x76, 0x63, 0x51, 0x30, 0xf1, + 0x38, 0xf1, 0x5d, 0xde, 0x67, 0x95, 0xe5, 0xed, 0xcc, 0x8e, 0x89, 0xd6, 0xa5, 0xf1, 0xe3, 0x89, + 0xed, 0xaa, 0xcf, 0xe0, 0xbb, 0x00, 0x62, 0x8f, 0x07, 0x3d, 0xe2, 0x76, 0x12, 0xe2, 0xd1, 0xa8, + 0x13, 0x84, 0x84, 0x55, 0x56, 0xb6, 0xb3, 0x3b, 0x39, 0xb4, 0xa6, 0x2c, 0x97, 0x13, 0x03, 0x3c, + 0x00, 0x05, 0xd1, 0x1c, 0xaf, 0x8d, 0xe3, 0x98, 0x84, 0xac, 0x62, 0x0a, 0xc7, 0x5a, 0x69, 0x98, + 0xda, 0xf9, 0xfa, 0x6f, 0x9f, 0x9d, 0x68, 0x35, 0xca, 0x93, 0x5e, 0x34, 0x12, 0xe0, 0xa7, 0xa0, + 0x88, 0x3d, 0x8f, 0x30, 0x26, 0xb2, 0xe6, 0x09, 0x0d, 0x2b, 0x39, 0x59, 0xb7, 0x7d, 0xb7, 0xee, + 0x63, 0xe9, 0x77, 0xa2, 0xdc, 0x6a, 0x1b, 0xa2, 0xf2, 0x61, 0x6a, 0xaf, 0xce, 0xa8, 0xd1, 0x2a, + 0x9e, 0x16, 0xcf, 0x0d, 0x73, 0xd1, 0xca, 0x9e, 0x1b, 0x66, 0xd6, 0x32, 0x9c, 0xbf, 0x64, 0xc0, + 0xac, 0x33, 0x3c, 0x06, 0xcb, 0x5e, 0x42, 0x30, 0x27, 0x72, 0x97, 0xf3, 0x07, 0xdf, 0xfb, 0x16, + 0xd2, 0xab, 0x41, 0x87, 0xd4, 0x0c, 0x41, 0x8c, 0x74, 0x20, 0xfc, 0x19, 0x30, 0x3c, 0x1c, 0x86, + 0x95, 0xc5, 0xff, 0x17, 0x40, 0x86, 0x39, 0xff, 0xca, 0x80, 0xb5, 0x3b, 0x1e, 0xd0, 0x03, 0x79, + 0xdd, 0x14, 0x3e, 0xe8, 0xa8, 0xe4, 0x8a, 0x07, 0x6f, 0x7f, 0x13, 0xb6, 0x04, 0xfd, 0xfe, 0x30, + 0xb5, 0xc1, 0x44, 0xbe, 0x4d, 0x6d, 0xa8, 0x46, 0x62, 0x0a, 0xc8, 0x41, 0x00, 0x8f, 0x3d, 0xa0, + 0x07, 0xd6, 0x67, 0x3b, 0xef, 0x86, 0x01, 0xe3, 0x95, 0x45, 0xb9, 0x69, 0x4f, 0x87, 0xa9, 0x3d, + 0x9b, 0xd8, 0x45, 0xc0, 0xf8, 0x6d, 0x6a, 0x57, 0x67, 0x50, 0xa7, 0x23, 0x1d, 0x31, 0x12, 0x73, + 0x01, 0xce, 0x7f, 0x8b, 0x20, 0x3f, 0x35, 0xaf, 0xf0, 0x0f, 0xa0, 0xd4, 0xa6, 0x11, 0x61, 0x9c, + 0x60, 0xdf, 0x6d, 0x86, 0xd4, 0xbb, 0xd6, 0x0f, 0xd8, 0xd3, 0x7f, 0xa6, 0xf6, 0x86, 0x47, 0x59, + 0x44, 0x19, 0xf3, 0xaf, 0x77, 0x03, 0xba, 0x17, 0x61, 0xde, 0xde, 0x3d, 0x8b, 0x05, 0xe9, 0xa6, + 0x22, 0x9d, 0x8b, 0x74, 0x50, 0x71, 0xac, 0xa9, 0x09, 0x05, 0x6c, 0x83, 0xa2, 0x8f, 0xa9, 0xfb, + 0x19, 0x4d, 0xae, 0x35, 0xf8, 0xa2, 0x04, 0xaf, 0x7d, 0x23, 0xf8, 0x30, 0xb5, 0x0b, 0xa7, 0xc7, + 0x1f, 0x7d, 0x48, 0x93, 0x6b, 0x09, 0x71, 0x9b, 0xda, 0x1b, 0x8a, 0x6c, 0x16, 0xc8, 0x41, 0x05, + 0x1f, 0xd3, 0xb1, 0x1b, 0xfc, 0x1d, 0xb0, 0xc6, 0x0e, 0xac, 0xdb, 0xe9, 0xd0, 0x84, 0x57, 0xb2, + 0xe2, 0x41, 0xaa, 0xbd, 0x3b, 0x4c, 0xed, 0xa2, 0x86, 0x6c, 0x28, 0xcb, 0x6d, 0x6a, 0xbf, 0x31, + 0x07, 0xaa, 0x63, 0x1c, 0x54, 0xd4, 0xb0, 0xda, 0x15, 0x36, 0x41, 0x81, 0x04, 0x9d, 0xfd, 0xc3, + 0x27, 0xba, 0x00, 0x43, 0x16, 0xf0, 0x8b, 0x87, 0x0a, 0xc8, 0xd7, 0xcf, 0x2e, 0xf7, 0x0f, 0x9f, + 0x8c, 0xf2, 0xd7, 0xaf, 0x82, 0x69, 0x14, 0x07, 0xe5, 0x95, 0xa8, 0x92, 0x3f, 0x03, 0x5a, 0x74, + 0xdb, 0x98, 0xb5, 0xe5, 0x8b, 0x26, 0x57, 0xdb, 0x11, 0x03, 0xa4, 0x90, 0x7e, 0x8d, 0x59, 0x7b, + 0xd2, 0xf5, 0xe6, 0xe0, 0x8f, 0x38, 0xe6, 0x41, 0x37, 0x1a, 0x61, 0x01, 0x15, 0x2c, 0xbc, 0xc6, + 0xe9, 0x1e, 0xea, 0x74, 0x97, 0x1f, 0x9b, 0xee, 0xe1, 0x7d, 0xe9, 0x1e, 0xce, 0xa6, 0xab, 0x7c, + 0xc6, 0x1c, 0x47, 0x9a, 0x63, 0xe5, 0xb1, 0x1c, 0x47, 0xf7, 0x71, 0x1c, 0xcd, 0x72, 0x28, 0x1f, + 0x31, 0x97, 0x73, 0x75, 0x56, 0xcc, 0x47, 0xcf, 0xe5, 0x9d, 0x0e, 0x15, 0xc7, 0x1a, 0x85, 0x7e, + 0x0d, 0xca, 0x1e, 0x8d, 0x19, 0x17, 0xba, 0x98, 0x76, 0x42, 0xa2, 0x29, 0x72, 0x92, 0xe2, 0xe8, + 0x21, 0x8a, 0xb7, 0xf4, 0x8b, 0xfd, 0x9e, 0x70, 0x07, 0xad, 0xcf, 0xaa, 0x15, 0x99, 0x0b, 0xac, + 0x0e, 0xe1, 0x24, 0x61, 0xcd, 0x6e, 0xd2, 0xd2, 0x44, 0x40, 0x12, 0xbd, 0xf7, 0x10, 0x91, 0x9e, + 0xd0, 0xf9, 0x50, 0x07, 0x95, 0x26, 0x2a, 0x45, 0xf0, 0x09, 0x28, 0x06, 0x82, 0xb5, 0xd9, 0x0d, + 0x35, 0x7c, 0x5e, 0xc2, 0x1f, 0x3c, 0x04, 0xaf, 0x9f, 0xaa, 0xd9, 0x40, 0x07, 0xad, 0x8e, 0x14, + 0x0a, 0xda, 0x07, 0x30, 0xea, 0x06, 0x89, 0xdb, 0x0a, 0xb1, 0x17, 0x90, 0x44, 0xc3, 0x17, 0x24, + 0xfc, 0x8f, 0x1f, 0x82, 0x7f, 0x53, 0xc1, 0xdf, 0x0d, 0x76, 0x90, 0x25, 0x94, 0xbf, 0x52, 0x3a, + 0xc5, 0xd2, 0x00, 0x85, 0x26, 0x49, 0xc2, 0x20, 0xd6, 0xf8, 0xab, 0x12, 0xff, 0xc9, 0x43, 0xf8, + 0x7a, 0x82, 0xa6, 0xc3, 0x1c, 0x94, 0x57, 0xe2, 0x18, 0x34, 0xa4, 0xb1, 0x4f, 0x47, 0xa0, 0x6b, + 0x8f, 0x06, 0x9d, 0x0e, 0x73, 0x50, 0x5e, 0x89, 0x0a, 0xb4, 0x05, 0xd6, 0x71, 0x92, 0xd0, 0x17, + 0x73, 0x0d, 0x81, 0x12, 0xfb, 0x27, 0x0f, 0x61, 0x8f, 0xde, 0xd3, 0x77, 0xa3, 0xc5, 0x7b, 0x5a, + 0x68, 0x67, 0x5a, 0xe2, 0x03, 0xd8, 0x4a, 0xf0, 0x60, 0x8e, 0xa7, 0xfc, 0xe8, 0xc6, 0xdf, 0x0d, + 0x76, 0x90, 0x25, 0x94, 0x33, 0x2c, 0x9f, 0x83, 0x72, 0x44, 0x92, 0x16, 0x71, 0x63, 0xc2, 0x59, + 0x27, 0x0c, 0xb8, 0xe6, 0xd9, 0x78, 0xf4, 0x73, 0x70, 0x5f, 0xb8, 0x83, 0xa0, 0x54, 0x3f, 0xd7, + 0xda, 0xf1, 0x94, 0xb2, 0x36, 0x8e, 0x5b, 0x6d, 0x1c, 0x68, 0x96, 0xcd, 0x47, 0x4f, 0xe9, 0x6c, + 0xa0, 0x83, 0x56, 0x47, 0x8a, 0xf1, 0x56, 0x7b, 0x38, 0xf6, 0xba, 0xa3, 0xad, 0x7e, 0xe3, 0xd1, + 0x5b, 0x3d, 0x1d, 0x26, 0xee, 0x67, 0x52, 0x94, 0xa0, 0xe7, 0x86, 0x59, 0xb4, 0x4a, 0xe7, 0x86, + 0x59, 0xb2, 0xac, 0x73, 0xc3, 0xb4, 0xac, 0xb5, 0x73, 0xc3, 0x5c, 0xb7, 0xca, 0x68, 0x75, 0x40, + 0x43, 0xea, 0xf6, 0x9e, 0xaa, 0x20, 0x94, 0x27, 0x2f, 0x30, 0xd3, 0x2f, 0x1a, 0x54, 0xf4, 0x30, + 0xc7, 0xe1, 0x80, 0xe9, 0x46, 0x20, 0x4b, 0xb5, 0x67, 0xea, 0xd8, 0xda, 0x03, 0x4b, 0x0d, 0x2e, + 0xee, 0x29, 0x16, 0xc8, 0x5e, 0x93, 0x81, 0x3a, 0x6c, 0x91, 0x58, 0xc2, 0x32, 0x58, 0xea, 0xe1, + 0xb0, 0x4b, 0xd4, 0x19, 0x89, 0x94, 0xe0, 0x5c, 0x82, 0xd2, 0x55, 0x82, 0x63, 0x26, 0x6e, 0x77, + 0x34, 0xbe, 0xa0, 0x2d, 0x06, 0x21, 0x30, 0xe4, 0x39, 0xa1, 0x62, 0xe5, 0x1a, 0xfe, 0x10, 0x18, + 0x21, 0x6d, 0x31, 0x79, 0x5b, 0xc8, 0x1f, 0x6c, 0xdc, 0xbd, 0x9a, 0x5c, 0xd0, 0x16, 0x92, 0x2e, + 0xce, 0xdf, 0x17, 0x41, 0xf6, 0x82, 0xb6, 0x60, 0x05, 0xac, 0x60, 0xdf, 0x4f, 0x08, 0x63, 0x1a, + 0x69, 0x24, 0xc2, 0x4d, 0xb0, 0xcc, 0x69, 0x27, 0xf0, 0x14, 0x5c, 0x0e, 0x69, 0x49, 0x10, 0xfb, + 0x98, 0x63, 0x79, 0xb0, 0x16, 0x90, 0x5c, 0x8b, 0x3b, 0xa6, 0xac, 0xcc, 0x8d, 0xbb, 0x51, 0x93, + 0x24, 0xf2, 0x7c, 0x34, 0x6a, 0xa5, 0x9b, 0xd4, 0xce, 0x4b, 0xfd, 0x73, 0xa9, 0x46, 0xd3, 0x02, + 0x7c, 0x07, 0xac, 0xf0, 0xfe, 0xf4, 0x59, 0xb7, 0x7e, 0x93, 0xda, 0x25, 0x3e, 0x29, 0x53, 0x1c, + 0x65, 0x68, 0x99, 0xf7, 0xe5, 0x91, 0xb6, 0x07, 0x4c, 0xde, 0x77, 0x83, 0xd8, 0x27, 0x7d, 0x79, + 0x9c, 0x19, 0xb5, 0xf2, 0x4d, 0x6a, 0x5b, 0x53, 0xee, 0x67, 0xc2, 0x86, 0x56, 0x78, 0x5f, 0x2e, + 0xe0, 0x3b, 0x00, 0xa8, 0x94, 0x24, 0x83, 0x3a, 0x9d, 0x56, 0x6f, 0x52, 0x3b, 0x27, 0xb5, 0x12, + 0x7b, 0xb2, 0x84, 0x0e, 0x58, 0x52, 0xd8, 0xa6, 0xc4, 0x2e, 0xdc, 0xa4, 0xb6, 0x19, 0xd2, 0x96, + 0xc2, 0x54, 0x26, 0xd1, 0xaa, 0x84, 0x44, 0xb4, 0x47, 0x7c, 0x79, 0x44, 0x98, 0x68, 0x24, 0x3a, + 0x7f, 0x5a, 0x04, 0xe6, 0x55, 0x1f, 0x11, 0xd6, 0x0d, 0x39, 0xfc, 0x10, 0x58, 0xf2, 0x02, 0x86, + 0x3d, 0xee, 0xce, 0xb4, 0xb6, 0xf6, 0xd6, 0xe4, 0x85, 0x3e, 0xef, 0xe1, 0xa0, 0xd2, 0x48, 0x75, + 0xac, 0xfb, 0x5f, 0x06, 0x4b, 0xcd, 0x90, 0xd2, 0x48, 0x4e, 0x42, 0x01, 0x29, 0x01, 0x22, 0xd9, + 0x35, 0xb9, 0xcb, 0x59, 0x79, 0xb9, 0xfd, 0xee, 0xdd, 0x5d, 0x9e, 0x1b, 0x95, 0xda, 0xa6, 0xfe, + 0x1c, 0x29, 0x2a, 0x6e, 0x1d, 0xef, 0x88, 0xde, 0xca, 0x51, 0xb2, 0x40, 0x36, 0x21, 0x5c, 0x6e, + 0x5a, 0x01, 0x89, 0x25, 0xac, 0x02, 0x33, 0x21, 0x3d, 0x92, 0x70, 0xe2, 0xcb, 0xcd, 0x31, 0xd1, + 0x58, 0x86, 0x6f, 0x02, 0xb3, 0x85, 0x99, 0xdb, 0x65, 0xc4, 0x57, 0x3b, 0x81, 0x56, 0x5a, 0x98, + 0x7d, 0xcc, 0x88, 0xff, 0xbe, 0xf1, 0xc5, 0x97, 0xf6, 0x82, 0x83, 0x41, 0x5e, 0x5f, 0x79, 0xbb, + 0x9d, 0x90, 0x3c, 0x30, 0x61, 0x07, 0xa0, 0xc0, 0x38, 0x4d, 0x70, 0x8b, 0xb8, 0xd7, 0x64, 0xa0, + 0xe7, 0x4c, 0x4d, 0x8d, 0xd6, 0xff, 0x86, 0x0c, 0x18, 0x9a, 0x16, 0x34, 0xc5, 0x97, 0x06, 0xc8, + 0x5f, 0x25, 0xd8, 0x23, 0xfa, 0x02, 0x2b, 0x66, 0x55, 0x88, 0x89, 0xa6, 0xd0, 0x92, 0xe0, 0xe6, + 0x41, 0x44, 0x68, 0x97, 0xeb, 0xe7, 0x69, 0x24, 0x8a, 0x88, 0x84, 0x90, 0x3e, 0xf1, 0x64, 0x1b, + 0x0d, 0xa4, 0x25, 0x78, 0x08, 0x56, 0xfd, 0x80, 0xe1, 0x66, 0x48, 0x5c, 0xc6, 0xb1, 0x77, 0xad, + 0xca, 0xaf, 0x59, 0x37, 0xa9, 0x5d, 0xd0, 0x86, 0x86, 0xd0, 0xa3, 0x19, 0x09, 0x7e, 0x00, 0x4a, + 0x93, 0x30, 0x99, 0xad, 0xfa, 0x82, 0xab, 0xc1, 0x9b, 0xd4, 0x2e, 0x8e, 0x5d, 0xa5, 0x05, 0xcd, + 0xc9, 0x62, 0xa7, 0x7d, 0xd2, 0xec, 0xb6, 0xe4, 0xf0, 0x99, 0x48, 0x09, 0x42, 0x1b, 0x06, 0x51, + 0xc0, 0xe5, 0xb0, 0x2d, 0x21, 0x25, 0xc0, 0x0f, 0x40, 0x8e, 0xf6, 0x48, 0x92, 0x04, 0x3e, 0x61, + 0xf2, 0x02, 0xf1, 0x6d, 0x1f, 0xa3, 0x68, 0xe2, 0x2f, 0x8a, 0x23, 0xb1, 0x4c, 0x32, 0x22, 0x11, + 0x4d, 0x06, 0xf2, 0x8a, 0xa0, 0x8b, 0x53, 0x86, 0x67, 0x52, 0x8f, 0x66, 0x24, 0x58, 0x03, 0x50, + 0x87, 0x25, 0x84, 0x77, 0x93, 0xd8, 0x95, 0xcf, 0x7f, 0x41, 0xc6, 0xca, 0xa7, 0x50, 0x59, 0x91, + 0x34, 0x9e, 0x62, 0x8e, 0xd1, 0x1d, 0x0d, 0xfc, 0x39, 0x80, 0x6a, 0x4f, 0xdc, 0xcf, 0x19, 0x1d, + 0x7f, 0x4d, 0xab, 0x33, 0x5e, 0xf2, 0x2b, 0xab, 0xce, 0xd9, 0x52, 0xd2, 0x39, 0xa3, 0xba, 0x8a, + 0x73, 0xc3, 0x34, 0xac, 0xa5, 0x73, 0xc3, 0x5c, 0xb1, 0xcc, 0x71, 0xff, 0x74, 0x15, 0x68, 0x7d, + 0x24, 0x4f, 0xa5, 0xf7, 0xa3, 0xbf, 0x65, 0xc0, 0xd4, 0x97, 0x17, 0xfc, 0x29, 0xa8, 0x1e, 0x9f, + 0x9c, 0xd4, 0x1b, 0x0d, 0xf7, 0xea, 0x93, 0xcb, 0xba, 0x7b, 0x59, 0x47, 0xcf, 0xce, 0x1a, 0x8d, + 0xb3, 0x8f, 0x9e, 0x5f, 0xd4, 0x1b, 0x0d, 0x6b, 0xa1, 0xfa, 0xf6, 0xcb, 0x57, 0xdb, 0x95, 0x89, + 0xff, 0xa5, 0xe8, 0x27, 0x63, 0x01, 0x8d, 0x43, 0x31, 0xa9, 0xef, 0x81, 0xcd, 0xe9, 0x68, 0x54, + 0x6f, 0x5c, 0xa1, 0xb3, 0x93, 0xab, 0xfa, 0xa9, 0x95, 0xa9, 0x56, 0x5e, 0xbe, 0xda, 0x2e, 0x4f, + 0x22, 0x11, 0x61, 0x3c, 0x09, 0xc4, 0xb7, 0x3a, 0x3c, 0x02, 0x95, 0xfb, 0x39, 0xeb, 0xa7, 0xd6, + 0x62, 0xb5, 0xfa, 0xf2, 0xd5, 0xf6, 0xe6, 0x7d, 0x8c, 0xc4, 0xaf, 0x1a, 0x5f, 0xfc, 0x75, 0x6b, + 0xa1, 0xf6, 0xcb, 0xaf, 0x86, 0x5b, 0x99, 0xaf, 0x87, 0x5b, 0x99, 0xff, 0x0c, 0xb7, 0x32, 0x7f, + 0x7e, 0xbd, 0xb5, 0xf0, 0xf5, 0xeb, 0xad, 0x85, 0x7f, 0xbc, 0xde, 0x5a, 0xf8, 0xfd, 0x0f, 0x5a, + 0x01, 0x6f, 0x77, 0x9b, 0xbb, 0x1e, 0x8d, 0xf6, 0x48, 0x2f, 0xa2, 0x4c, 0xff, 0xed, 0xed, 0x1f, + 0xed, 0xf5, 0xe5, 0xaf, 0x2d, 0xe2, 0xcb, 0x92, 0x35, 0x97, 0xe5, 0xaf, 0x28, 0x4f, 0xff, 0x17, + 0x00, 0x00, 0xff, 0xff, 0x97, 0xcf, 0xe9, 0x62, 0x8b, 0x11, 0x00, 0x00, } func (m *V6Params) Marshal() (dAtA []byte, err error) { @@ -835,6 +1043,16 @@ func (m *V6Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + { + size, err := m.AccessControl.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvm(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x4a if len(m.EVMChannels) > 0 { for iNdEx := len(m.EVMChannels) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.EVMChannels[iNdEx]) @@ -874,44 +1092,24 @@ func (m *V6Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x2a if len(m.ExtraEIPs) > 0 { - dAtA3 := make([]byte, len(m.ExtraEIPs)*10) - var j2 int + dAtA4 := make([]byte, len(m.ExtraEIPs)*10) + var j3 int for _, num1 := range m.ExtraEIPs { num := uint64(num1) for num >= 1<<7 { - dAtA3[j2] = uint8(uint64(num)&0x7f | 0x80) + dAtA4[j3] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j2++ + j3++ } - dAtA3[j2] = uint8(num) - j2++ + dAtA4[j3] = uint8(num) + j3++ } - i -= j2 - copy(dAtA[i:], dAtA3[:j2]) - i = encodeVarintEvm(dAtA, i, uint64(j2)) + i -= j3 + copy(dAtA[i:], dAtA4[:j3]) + i = encodeVarintEvm(dAtA, i, uint64(j3)) i-- dAtA[i] = 0x22 } - if m.EnableCall { - i-- - if m.EnableCall { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x18 - } - if m.EnableCreate { - i-- - if m.EnableCreate { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 - } if len(m.EvmDenom) > 0 { i -= len(m.EvmDenom) copy(dAtA[i:], m.EvmDenom) @@ -922,6 +1120,86 @@ func (m *V6Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *V6AccessControl) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *V6AccessControl) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *V6AccessControl) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Call.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvm(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.Create.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvm(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *V6AccessControlType) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *V6AccessControlType) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *V6AccessControlType) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.AccessControlList) > 0 { + for iNdEx := len(m.AccessControlList) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.AccessControlList[iNdEx]) + copy(dAtA[i:], m.AccessControlList[iNdEx]) + i = encodeVarintEvm(dAtA, i, uint64(len(m.AccessControlList[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if m.AccessType != 0 { + i = encodeVarintEvm(dAtA, i, uint64(m.AccessType)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func (m *V6ChainConfig) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1579,6 +1857,7 @@ func encodeVarintEvm(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } + func (m *V6Params) Size() (n int) { if m == nil { return 0 @@ -1589,12 +1868,6 @@ func (m *V6Params) Size() (n int) { if l > 0 { n += 1 + l + sovEvm(uint64(l)) } - if m.EnableCreate { - n += 2 - } - if m.EnableCall { - n += 2 - } if len(m.ExtraEIPs) > 0 { l = 0 for _, e := range m.ExtraEIPs { @@ -1619,6 +1892,39 @@ func (m *V6Params) Size() (n int) { n += 1 + l + sovEvm(uint64(l)) } } + l = m.AccessControl.Size() + n += 1 + l + sovEvm(uint64(l)) + return n +} + +func (m *V6AccessControl) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Create.Size() + n += 1 + l + sovEvm(uint64(l)) + l = m.Call.Size() + n += 1 + l + sovEvm(uint64(l)) + return n +} + +func (m *V6AccessControlType) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.AccessType != 0 { + n += 1 + sovEvm(uint64(m.AccessType)) + } + if len(m.AccessControlList) > 0 { + for _, s := range m.AccessControlList { + l = len(s) + n += 1 + l + sovEvm(uint64(l)) + } + } return n } @@ -1882,9 +2188,11 @@ func (m *V6TraceConfig) Size() (n int) { func sovEvm(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } + func sozEvm(x uint64) (n int) { return sovEvm(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } + func (m *V6Params) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -1933,59 +2241,19 @@ func (m *V6Params) Unmarshal(dAtA []byte) error { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.EvmDenom = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field EnableCreate", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.EnableCreate = bool(v != 0) - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field EnableCall", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.EnableCall = bool(v != 0) + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.EvmDenom = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex case 4: if wireType == 0 { var v int64 @@ -2179,6 +2447,258 @@ func (m *V6Params) Unmarshal(dAtA []byte) error { } m.EVMChannels = append(m.EVMChannels, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AccessControl", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.AccessControl.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvm(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvm + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} + +func (m *V6AccessControl) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AccessControl: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AccessControl: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Create", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Create.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Call", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Call.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvm(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvm + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} + +func (m *V6AccessControlType) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AccessControlType: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AccessControlType: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AccessType", wireType) + } + m.AccessType = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.AccessType |= V6AccessType(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AccessControlList", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AccessControlList = append(m.AccessControlList, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvm(dAtA[iNdEx:]) @@ -2200,6 +2720,7 @@ func (m *V6Params) Unmarshal(dAtA []byte) error { } return nil } + func (m *V6ChainConfig) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -2914,6 +3435,7 @@ func (m *V6ChainConfig) Unmarshal(dAtA []byte) error { } return nil } + func (m *V6State) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -3028,6 +3550,7 @@ func (m *V6State) Unmarshal(dAtA []byte) error { } return nil } + func (m *V6TransactionLogs) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -3144,6 +3667,7 @@ func (m *V6TransactionLogs) Unmarshal(dAtA []byte) error { } return nil } + func (m *V6Log) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -3433,6 +3957,7 @@ func (m *V6Log) Unmarshal(dAtA []byte) error { } return nil } + func (m *V6TxResult) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -3655,6 +4180,7 @@ func (m *V6TxResult) Unmarshal(dAtA []byte) error { } return nil } + func (m *V6AccessTuple) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -3769,6 +4295,7 @@ func (m *V6AccessTuple) Unmarshal(dAtA []byte) error { } return nil } + func (m *V6TraceConfig) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -4089,6 +4616,7 @@ func (m *V6TraceConfig) Unmarshal(dAtA []byte) error { } return nil } + func skipEvm(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/evm/migrations/v7/types/params.go b/x/evm/migrations/v7/types/params.go new file mode 100644 index 0000000000..32c262300b --- /dev/null +++ b/x/evm/migrations/v7/types/params.go @@ -0,0 +1,6 @@ +// Copyright Tharsis Labs Ltd.(Evmos) +// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE) + +package types + +var DefaultExtraEIPs = []int64{3855} diff --git a/x/evm/module.go b/x/evm/module.go index 36f40fae45..b5a0000168 100644 --- a/x/evm/module.go +++ b/x/evm/module.go @@ -133,17 +133,6 @@ func (am AppModule) RegisterServices(cfg module.Configurator) { types.RegisterQueryServer(cfg.QueryServer(), am.keeper) m := keeper.NewMigrator(*am.keeper, am.legacySubspace) - if err := cfg.RegisterMigration(types.ModuleName, 3, m.Migrate3to4); err != nil { - panic(err) - } - - if err := cfg.RegisterMigration(types.ModuleName, 4, m.Migrate4to5); err != nil { - panic(err) - } - - if err := cfg.RegisterMigration(types.ModuleName, 5, m.Migrate5to6); err != nil { - panic(err) - } if err := cfg.RegisterMigration(types.ModuleName, 6, m.Migrate6to7); err != nil { panic(err) diff --git a/x/evm/types/evm.pb.go b/x/evm/types/evm.pb.go index 500bf5453d..c471795343 100644 --- a/x/evm/types/evm.pb.go +++ b/x/evm/types/evm.pb.go @@ -4,19 +4,23 @@ package types import ( - cosmossdk_io_math "cosmossdk.io/math" fmt "fmt" - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" + + cosmossdk_io_math "cosmossdk.io/math" + + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" ) // Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf +var ( + _ = proto.Marshal + _ = fmt.Errorf + _ = math.Inf +) // This is a compile-time assertion to ensure that this generated file // is compatible with the proto package it is being compiled against. @@ -62,7 +66,7 @@ type Params struct { // transitions. EvmDenom string `protobuf:"bytes,1,opt,name=evm_denom,json=evmDenom,proto3" json:"evm_denom,omitempty" yaml:"evm_denom"` // extra_eips defines the additional EIPs for the vm.Config - ExtraEIPs []int64 `protobuf:"varint,4,rep,packed,name=extra_eips,json=extraEips,proto3" json:"extra_eips,omitempty" yaml:"extra_eips"` + ExtraEIPs []string `protobuf:"bytes,4,rep,name=extra_eips,json=extraEips,proto3" json:"extra_eips,omitempty" yaml:"extra_eips"` // chain_config defines the EVM chain configuration parameters ChainConfig ChainConfig `protobuf:"bytes,5,opt,name=chain_config,json=chainConfig,proto3" json:"chain_config" yaml:"chain_config"` // allow_unprotected_txs defines if replay-protected (i.e non EIP155 @@ -83,9 +87,11 @@ func (*Params) ProtoMessage() {} func (*Params) Descriptor() ([]byte, []int) { return fileDescriptor_d21ecc92c8c8583e, []int{0} } + func (m *Params) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } + func (m *Params) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_Params.Marshal(b, m, deterministic) @@ -98,12 +104,15 @@ func (m *Params) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } + func (m *Params) XXX_Merge(src proto.Message) { xxx_messageInfo_Params.Merge(m, src) } + func (m *Params) XXX_Size() int { return m.Size() } + func (m *Params) XXX_DiscardUnknown() { xxx_messageInfo_Params.DiscardUnknown(m) } @@ -117,7 +126,7 @@ func (m *Params) GetEvmDenom() string { return "" } -func (m *Params) GetExtraEIPs() []int64 { +func (m *Params) GetExtraEIPs() []string { if m != nil { return m.ExtraEIPs } @@ -174,9 +183,11 @@ func (*AccessControl) ProtoMessage() {} func (*AccessControl) Descriptor() ([]byte, []int) { return fileDescriptor_d21ecc92c8c8583e, []int{1} } + func (m *AccessControl) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } + func (m *AccessControl) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_AccessControl.Marshal(b, m, deterministic) @@ -189,12 +200,15 @@ func (m *AccessControl) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return b[:n], nil } } + func (m *AccessControl) XXX_Merge(src proto.Message) { xxx_messageInfo_AccessControl.Merge(m, src) } + func (m *AccessControl) XXX_Size() int { return m.Size() } + func (m *AccessControl) XXX_DiscardUnknown() { xxx_messageInfo_AccessControl.DiscardUnknown(m) } @@ -232,9 +246,11 @@ func (*AccessControlType) ProtoMessage() {} func (*AccessControlType) Descriptor() ([]byte, []int) { return fileDescriptor_d21ecc92c8c8583e, []int{2} } + func (m *AccessControlType) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } + func (m *AccessControlType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_AccessControlType.Marshal(b, m, deterministic) @@ -247,12 +263,15 @@ func (m *AccessControlType) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return b[:n], nil } } + func (m *AccessControlType) XXX_Merge(src proto.Message) { xxx_messageInfo_AccessControlType.Merge(m, src) } + func (m *AccessControlType) XXX_Size() int { return m.Size() } + func (m *AccessControlType) XXX_DiscardUnknown() { xxx_messageInfo_AccessControlType.DiscardUnknown(m) } @@ -323,9 +342,11 @@ func (*ChainConfig) ProtoMessage() {} func (*ChainConfig) Descriptor() ([]byte, []int) { return fileDescriptor_d21ecc92c8c8583e, []int{3} } + func (m *ChainConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } + func (m *ChainConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_ChainConfig.Marshal(b, m, deterministic) @@ -338,12 +359,15 @@ func (m *ChainConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return b[:n], nil } } + func (m *ChainConfig) XXX_Merge(src proto.Message) { xxx_messageInfo_ChainConfig.Merge(m, src) } + func (m *ChainConfig) XXX_Size() int { return m.Size() } + func (m *ChainConfig) XXX_DiscardUnknown() { xxx_messageInfo_ChainConfig.DiscardUnknown(m) } @@ -378,9 +402,11 @@ func (*State) ProtoMessage() {} func (*State) Descriptor() ([]byte, []int) { return fileDescriptor_d21ecc92c8c8583e, []int{4} } + func (m *State) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } + func (m *State) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_State.Marshal(b, m, deterministic) @@ -393,12 +419,15 @@ func (m *State) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } + func (m *State) XXX_Merge(src proto.Message) { xxx_messageInfo_State.Merge(m, src) } + func (m *State) XXX_Size() int { return m.Size() } + func (m *State) XXX_DiscardUnknown() { xxx_messageInfo_State.DiscardUnknown(m) } @@ -435,9 +464,11 @@ func (*TransactionLogs) ProtoMessage() {} func (*TransactionLogs) Descriptor() ([]byte, []int) { return fileDescriptor_d21ecc92c8c8583e, []int{5} } + func (m *TransactionLogs) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } + func (m *TransactionLogs) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_TransactionLogs.Marshal(b, m, deterministic) @@ -450,12 +481,15 @@ func (m *TransactionLogs) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return b[:n], nil } } + func (m *TransactionLogs) XXX_Merge(src proto.Message) { xxx_messageInfo_TransactionLogs.Merge(m, src) } + func (m *TransactionLogs) XXX_Size() int { return m.Size() } + func (m *TransactionLogs) XXX_DiscardUnknown() { xxx_messageInfo_TransactionLogs.DiscardUnknown(m) } @@ -511,9 +545,11 @@ func (*Log) ProtoMessage() {} func (*Log) Descriptor() ([]byte, []int) { return fileDescriptor_d21ecc92c8c8583e, []int{6} } + func (m *Log) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } + func (m *Log) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_Log.Marshal(b, m, deterministic) @@ -526,12 +562,15 @@ func (m *Log) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } + func (m *Log) XXX_Merge(src proto.Message) { xxx_messageInfo_Log.Merge(m, src) } + func (m *Log) XXX_Size() int { return m.Size() } + func (m *Log) XXX_DiscardUnknown() { xxx_messageInfo_Log.DiscardUnknown(m) } @@ -626,9 +665,11 @@ func (*TxResult) ProtoMessage() {} func (*TxResult) Descriptor() ([]byte, []int) { return fileDescriptor_d21ecc92c8c8583e, []int{7} } + func (m *TxResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } + func (m *TxResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_TxResult.Marshal(b, m, deterministic) @@ -641,12 +682,15 @@ func (m *TxResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } + func (m *TxResult) XXX_Merge(src proto.Message) { xxx_messageInfo_TxResult.Merge(m, src) } + func (m *TxResult) XXX_Size() int { return m.Size() } + func (m *TxResult) XXX_DiscardUnknown() { xxx_messageInfo_TxResult.DiscardUnknown(m) } @@ -667,9 +711,11 @@ func (*AccessTuple) ProtoMessage() {} func (*AccessTuple) Descriptor() ([]byte, []int) { return fileDescriptor_d21ecc92c8c8583e, []int{8} } + func (m *AccessTuple) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } + func (m *AccessTuple) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_AccessTuple.Marshal(b, m, deterministic) @@ -682,12 +728,15 @@ func (m *AccessTuple) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return b[:n], nil } } + func (m *AccessTuple) XXX_Merge(src proto.Message) { xxx_messageInfo_AccessTuple.Merge(m, src) } + func (m *AccessTuple) XXX_Size() int { return m.Size() } + func (m *AccessTuple) XXX_DiscardUnknown() { xxx_messageInfo_AccessTuple.DiscardUnknown(m) } @@ -727,9 +776,11 @@ func (*TraceConfig) ProtoMessage() {} func (*TraceConfig) Descriptor() ([]byte, []int) { return fileDescriptor_d21ecc92c8c8583e, []int{9} } + func (m *TraceConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } + func (m *TraceConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_TraceConfig.Marshal(b, m, deterministic) @@ -742,12 +793,15 @@ func (m *TraceConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return b[:n], nil } } + func (m *TraceConfig) XXX_Merge(src proto.Message) { xxx_messageInfo_TraceConfig.Merge(m, src) } + func (m *TraceConfig) XXX_Size() int { return m.Size() } + func (m *TraceConfig) XXX_DiscardUnknown() { xxx_messageInfo_TraceConfig.DiscardUnknown(m) } @@ -848,126 +902,125 @@ func init() { func init() { proto.RegisterFile("ethermint/evm/v1/evm.proto", fileDescriptor_d21ecc92c8c8583e) } var fileDescriptor_d21ecc92c8c8583e = []byte{ - // 1893 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x58, 0x5b, 0x4f, 0x23, 0xc9, - 0x15, 0xc6, 0xb8, 0x81, 0x76, 0xd9, 0xd8, 0x3d, 0x85, 0x61, 0x3d, 0x9e, 0x0d, 0x4d, 0x3a, 0x51, - 0x44, 0xa2, 0x0d, 0x0c, 0xcc, 0x92, 0xa0, 0xd9, 0xdc, 0x30, 0x78, 0x13, 0x08, 0x33, 0x8b, 0xca, - 0x6c, 0xa2, 0x8d, 0xb2, 0x6a, 0x95, 0xbb, 0x6b, 0xed, 0x5e, 0xba, 0xbb, 0xac, 0xae, 0xb2, 0xc7, - 0xce, 0x2f, 0x58, 0x4d, 0x5e, 0x92, 0x1f, 0x30, 0xd2, 0x4a, 0xf9, 0x23, 0x79, 0x5c, 0xe5, 0x69, - 0x1f, 0xa3, 0x48, 0x69, 0x45, 0x9e, 0x37, 0x1e, 0x79, 0x8f, 0x14, 0xd5, 0xc5, 0x57, 0x58, 0x96, - 0xbc, 0x40, 0x9f, 0xdb, 0xf7, 0x9d, 0x73, 0xea, 0x74, 0x57, 0x95, 0x41, 0x95, 0xf0, 0x36, 0x49, - 0xa2, 0x20, 0xe6, 0xbb, 0xa4, 0x17, 0xed, 0xf6, 0xf6, 0xc4, 0xbf, 0x9d, 0x4e, 0x42, 0x39, 0x85, - 0xd6, 0xd8, 0xb6, 0x23, 0x94, 0xbd, 0xbd, 0x6a, 0xb9, 0x45, 0x5b, 0x54, 0x1a, 0x77, 0xc5, 0x93, - 0xf2, 0x73, 0x6e, 0xb2, 0x60, 0xf9, 0x02, 0x27, 0x38, 0x62, 0x70, 0x0f, 0xe4, 0x48, 0x2f, 0x72, - 0x7d, 0x12, 0xd3, 0xa8, 0x92, 0xd9, 0xca, 0x6c, 0xe7, 0x6a, 0xe5, 0x9b, 0xd4, 0xb6, 0x06, 0x38, - 0x0a, 0x9f, 0x3b, 0x63, 0x93, 0x83, 0x4c, 0xd2, 0x8b, 0x4e, 0xc4, 0x23, 0x3c, 0x02, 0x80, 0xf4, - 0x79, 0x82, 0x5d, 0x12, 0x74, 0x58, 0xc5, 0xd8, 0xca, 0x6e, 0x67, 0x6b, 0xce, 0x30, 0xb5, 0x73, - 0x75, 0xa1, 0xad, 0x9f, 0x5e, 0xb0, 0x9b, 0xd4, 0x7e, 0xa4, 0x01, 0xc6, 0x8e, 0x0e, 0xca, 0x49, - 0xa1, 0x1e, 0x74, 0x18, 0xfc, 0x14, 0x14, 0xbc, 0x36, 0x0e, 0x62, 0xd7, 0xa3, 0xf1, 0x67, 0x41, - 0xab, 0xb2, 0xb4, 0x95, 0xd9, 0xce, 0xef, 0x7f, 0x67, 0x67, 0x3e, 0xff, 0x9d, 0x63, 0xe1, 0x75, - 0x2c, 0x9d, 0x6a, 0x4f, 0xbe, 0x4a, 0xed, 0x85, 0x9b, 0xd4, 0x5e, 0x53, 0xd0, 0xd3, 0x00, 0x0e, - 0xca, 0x7b, 0x13, 0x4f, 0xb8, 0x0f, 0xd6, 0x71, 0x18, 0xd2, 0x57, 0x6e, 0x37, 0x16, 0x05, 0x13, - 0x8f, 0x13, 0xdf, 0xe5, 0x7d, 0x56, 0x59, 0xde, 0xca, 0x6c, 0x9b, 0x68, 0x4d, 0x1a, 0x3f, 0x9e, - 0xd8, 0x2e, 0xfb, 0x0c, 0xee, 0x83, 0x82, 0xa8, 0xd6, 0x6b, 0xe3, 0x38, 0x26, 0x21, 0xab, 0x98, - 0x5b, 0xd9, 0xed, 0x5c, 0xad, 0x34, 0x4c, 0xed, 0x7c, 0xfd, 0x77, 0x2f, 0x8e, 0xb5, 0x1a, 0xe5, - 0x49, 0x2f, 0x1a, 0x09, 0xf0, 0x53, 0x50, 0xc4, 0x9e, 0x47, 0x18, 0x13, 0x69, 0xf0, 0x84, 0x86, - 0x95, 0x9c, 0x2c, 0xc4, 0xbe, 0x5d, 0xc8, 0x91, 0xf4, 0x3b, 0x56, 0x6e, 0xb5, 0x75, 0x51, 0xca, - 0x30, 0xb5, 0x57, 0x67, 0xd4, 0x68, 0x15, 0x4f, 0x8b, 0xf0, 0x39, 0x78, 0x8c, 0x3d, 0x1e, 0xf4, - 0x88, 0xcb, 0x38, 0xe6, 0x81, 0xe7, 0x76, 0x12, 0xe2, 0xd1, 0xa8, 0x13, 0x84, 0x84, 0x55, 0x80, - 0xc8, 0x0f, 0xbd, 0xa3, 0x1c, 0x1a, 0xd2, 0x7e, 0x31, 0x31, 0x9f, 0x19, 0xe6, 0xa2, 0x95, 0x3d, - 0x33, 0xcc, 0xac, 0x65, 0x9c, 0x19, 0xe6, 0x8a, 0x65, 0x3a, 0x7f, 0xcd, 0x80, 0x59, 0x3a, 0x78, - 0x04, 0x96, 0xbd, 0x84, 0x60, 0x4e, 0xe4, 0xc2, 0xe7, 0xf7, 0xbf, 0xf7, 0x2d, 0x69, 0x5f, 0x0e, - 0x3a, 0xa4, 0x66, 0x88, 0xd4, 0x91, 0x0e, 0x84, 0x3f, 0x07, 0x86, 0x87, 0xc3, 0xb0, 0xb2, 0xf8, - 0xff, 0x02, 0xc8, 0x30, 0xe7, 0xdf, 0x19, 0xf0, 0xe8, 0x96, 0x07, 0xf4, 0x40, 0x5e, 0xb7, 0x95, - 0x0f, 0x3a, 0x2a, 0xb9, 0xe2, 0xfe, 0xbb, 0xdf, 0x84, 0x2d, 0x41, 0xbf, 0x3f, 0x4c, 0x6d, 0x30, - 0x91, 0x6f, 0x52, 0x1b, 0xaa, 0x29, 0x99, 0x02, 0x72, 0x10, 0xc0, 0x63, 0x0f, 0xe8, 0x81, 0xb5, - 0xd9, 0xb5, 0x73, 0xc3, 0x80, 0xf1, 0xca, 0xa2, 0x5c, 0xf6, 0x67, 0xc3, 0xd4, 0x9e, 0x4d, 0xec, - 0x3c, 0x60, 0xfc, 0x26, 0xb5, 0xab, 0x33, 0xa8, 0xd3, 0x91, 0x0e, 0x7a, 0x84, 0xe7, 0x03, 0x9c, - 0xff, 0x16, 0x41, 0x7e, 0x6a, 0x84, 0xe1, 0x1f, 0x41, 0xa9, 0x4d, 0x23, 0xc2, 0x38, 0xc1, 0xbe, - 0xdb, 0x0c, 0xa9, 0x77, 0xa5, 0xdf, 0xb9, 0x67, 0xff, 0x4a, 0xed, 0x75, 0x8f, 0xb2, 0x88, 0x32, - 0xe6, 0x5f, 0xed, 0x04, 0x74, 0x37, 0xc2, 0xbc, 0xbd, 0x73, 0x1a, 0x0b, 0xd2, 0x0d, 0x45, 0x3a, - 0x17, 0xe9, 0xa0, 0xe2, 0x58, 0x53, 0x13, 0x0a, 0xd8, 0x06, 0x45, 0x1f, 0x53, 0xf7, 0x33, 0x9a, - 0x5c, 0x69, 0xf0, 0x45, 0x09, 0x5e, 0xfb, 0x46, 0xf0, 0x61, 0x6a, 0x17, 0x4e, 0x8e, 0x3e, 0xfa, - 0x90, 0x26, 0x57, 0x12, 0xe2, 0x26, 0xb5, 0xd7, 0x15, 0xd9, 0x2c, 0x90, 0x83, 0x0a, 0x3e, 0xa6, - 0x63, 0x37, 0xf8, 0x7b, 0x60, 0x8d, 0x1d, 0x58, 0xb7, 0xd3, 0xa1, 0x09, 0xaf, 0x64, 0xc5, 0xbb, - 0x55, 0xfb, 0xf1, 0x30, 0xb5, 0x8b, 0x1a, 0xb2, 0xa1, 0x2c, 0x37, 0xa9, 0xfd, 0xce, 0x1c, 0xa8, - 0x8e, 0x71, 0x50, 0x51, 0xc3, 0x6a, 0x57, 0xd8, 0x04, 0x05, 0x12, 0x74, 0xf6, 0x0e, 0x9e, 0xea, - 0x02, 0x0c, 0x59, 0xc0, 0x2f, 0xef, 0x2b, 0x20, 0x5f, 0x3f, 0xbd, 0xd8, 0x3b, 0x78, 0x3a, 0xca, - 0x5f, 0x7f, 0x1d, 0xa6, 0x51, 0x1c, 0x94, 0x57, 0xa2, 0x4a, 0xfe, 0x14, 0x68, 0xd1, 0x6d, 0x63, - 0xd6, 0x96, 0xdf, 0x9e, 0x5c, 0x6d, 0x5b, 0x0c, 0x90, 0x42, 0xfa, 0x0d, 0x66, 0xed, 0x49, 0xd7, - 0x9b, 0x83, 0x3f, 0xe1, 0x98, 0x07, 0xdd, 0x68, 0x84, 0x05, 0x54, 0xb0, 0xf0, 0x1a, 0xa7, 0x7b, - 0xa0, 0xd3, 0x5d, 0x7e, 0x68, 0xba, 0x07, 0x77, 0xa5, 0x7b, 0x30, 0x9b, 0xae, 0xf2, 0x19, 0x73, - 0x1c, 0x6a, 0x8e, 0x95, 0x87, 0x72, 0x1c, 0xde, 0xc5, 0x71, 0x38, 0xcb, 0xa1, 0x7c, 0xc4, 0x5c, - 0xce, 0xd5, 0x59, 0x31, 0x1f, 0x3c, 0x97, 0xb7, 0x3a, 0x54, 0x1c, 0x6b, 0x14, 0xfa, 0x15, 0x28, - 0x7b, 0x34, 0x66, 0x5c, 0xe8, 0x62, 0xda, 0x09, 0x89, 0xa6, 0xc8, 0x49, 0x8a, 0xc3, 0xfb, 0x28, - 0x9e, 0xe8, 0x6f, 0xfd, 0x1d, 0xe1, 0x0e, 0x5a, 0x9b, 0x55, 0x2b, 0x32, 0x17, 0x58, 0x1d, 0xc2, - 0x49, 0xc2, 0x9a, 0xdd, 0xa4, 0xa5, 0x89, 0x80, 0x24, 0x7a, 0xff, 0x3e, 0x22, 0x3d, 0xa1, 0xf3, - 0xa1, 0x0e, 0x2a, 0x4d, 0x54, 0x8a, 0xe0, 0x13, 0x50, 0x0c, 0x04, 0x6b, 0xb3, 0x1b, 0x6a, 0xf8, - 0xbc, 0x84, 0xdf, 0xbf, 0x0f, 0x5e, 0xbf, 0x55, 0xb3, 0x81, 0x0e, 0x5a, 0x1d, 0x29, 0x14, 0xb4, - 0x0f, 0x60, 0xd4, 0x0d, 0x12, 0xb7, 0x15, 0x62, 0x2f, 0x20, 0x89, 0x86, 0x2f, 0x48, 0xf8, 0x9f, - 0xdc, 0x07, 0xff, 0x58, 0xc1, 0xdf, 0x0e, 0x76, 0x90, 0x25, 0x94, 0xbf, 0x56, 0x3a, 0xc5, 0xd2, - 0x00, 0x85, 0x26, 0x49, 0xc2, 0x20, 0xd6, 0xf8, 0xab, 0x12, 0xff, 0xe9, 0x7d, 0xf8, 0x7a, 0x82, - 0xa6, 0xc3, 0x1c, 0x94, 0x57, 0xe2, 0x18, 0x34, 0xa4, 0xb1, 0x4f, 0x47, 0xa0, 0x8f, 0x1e, 0x0c, - 0x3a, 0x1d, 0xe6, 0xa0, 0xbc, 0x12, 0x15, 0x68, 0x0b, 0xac, 0xe1, 0x24, 0xa1, 0xaf, 0xe6, 0x1a, - 0x02, 0x25, 0xf6, 0x4f, 0xef, 0xc3, 0x1e, 0x7d, 0xa7, 0x6f, 0x47, 0x8b, 0xef, 0xb4, 0xd0, 0xce, - 0xb4, 0xc4, 0x07, 0xb0, 0x95, 0xe0, 0xc1, 0x1c, 0x4f, 0xf9, 0xc1, 0x8d, 0xbf, 0x1d, 0xec, 0x20, - 0x4b, 0x28, 0x67, 0x58, 0x3e, 0x07, 0xe5, 0x88, 0x24, 0x2d, 0xe2, 0xc6, 0x84, 0xb3, 0x4e, 0x18, - 0x70, 0xcd, 0xb3, 0xfe, 0xe0, 0xf7, 0xe0, 0xae, 0x70, 0x07, 0x41, 0xa9, 0x7e, 0xa9, 0xb5, 0xe3, - 0x29, 0x65, 0x6d, 0x1c, 0xb7, 0xda, 0x38, 0xd0, 0x2c, 0x1b, 0x0f, 0x9e, 0xd2, 0xd9, 0x40, 0x07, - 0xad, 0x8e, 0x14, 0xe3, 0xa5, 0xf6, 0x70, 0xec, 0x75, 0x47, 0x4b, 0xfd, 0xce, 0x83, 0x97, 0x7a, - 0x3a, 0x4c, 0x1c, 0xd9, 0xa4, 0x28, 0x41, 0xcf, 0x0c, 0xb3, 0x68, 0x95, 0xce, 0x0c, 0xb3, 0x64, - 0x59, 0x67, 0x86, 0x69, 0x59, 0x8f, 0xce, 0x0c, 0x73, 0xcd, 0x2a, 0xa3, 0xd5, 0x01, 0x0d, 0xa9, - 0xdb, 0x7b, 0xa6, 0x82, 0x50, 0x9e, 0xbc, 0xc2, 0x4c, 0x7f, 0x68, 0x50, 0xd1, 0xc3, 0x1c, 0x87, - 0x03, 0xa6, 0x1b, 0x81, 0x2c, 0xd5, 0x9e, 0xa9, 0x6d, 0x6b, 0x17, 0x2c, 0x89, 0xa3, 0x11, 0x81, - 0x16, 0xc8, 0x5e, 0x91, 0x81, 0xda, 0x6c, 0x91, 0x78, 0x84, 0x65, 0xb0, 0xd4, 0xc3, 0x61, 0x97, - 0xa8, 0x3d, 0x12, 0x29, 0xc1, 0xb9, 0x00, 0xa5, 0xcb, 0x04, 0xc7, 0x4c, 0x1c, 0xab, 0x68, 0x7c, - 0x4e, 0x5b, 0x0c, 0x42, 0x60, 0xc8, 0x7d, 0x42, 0xc5, 0xca, 0x67, 0xf8, 0x43, 0x60, 0x84, 0xb4, - 0xc5, 0xe4, 0x69, 0x21, 0xbf, 0xbf, 0x7e, 0xfb, 0x68, 0x72, 0x4e, 0x5b, 0x48, 0xba, 0x38, 0xff, - 0x58, 0x04, 0xd9, 0x73, 0xda, 0x82, 0x15, 0xb0, 0x82, 0x7d, 0x3f, 0x21, 0x8c, 0x69, 0xa4, 0x91, - 0x08, 0x37, 0xc0, 0x32, 0xa7, 0x9d, 0xc0, 0x53, 0x70, 0x39, 0xa4, 0x25, 0x41, 0xec, 0x63, 0x8e, - 0xe5, 0xc6, 0x5a, 0x40, 0xf2, 0x59, 0x9c, 0x52, 0x65, 0x65, 0x6e, 0xdc, 0x8d, 0x9a, 0x24, 0x91, - 0xfb, 0xa3, 0x51, 0x2b, 0x5d, 0xa7, 0x76, 0x5e, 0xea, 0x5f, 0x4a, 0x35, 0x9a, 0x16, 0xe0, 0x7b, - 0x60, 0x85, 0xf7, 0xa7, 0xf7, 0xba, 0xb5, 0xeb, 0xd4, 0x2e, 0xf1, 0x49, 0x99, 0x62, 0x2b, 0x43, - 0xcb, 0xbc, 0x2f, 0xb7, 0xb4, 0x5d, 0x60, 0xf2, 0xbe, 0x1b, 0xc4, 0x3e, 0xe9, 0xcb, 0xed, 0xcc, - 0xa8, 0x95, 0xaf, 0x53, 0xdb, 0x9a, 0x72, 0x3f, 0x15, 0x36, 0xb4, 0xc2, 0xfb, 0xf2, 0x01, 0xbe, - 0x07, 0x80, 0x4a, 0x49, 0x32, 0xa8, 0xdd, 0x69, 0xf5, 0x3a, 0xb5, 0x73, 0x52, 0x2b, 0xb1, 0x27, - 0x8f, 0xd0, 0x01, 0x4b, 0x0a, 0xdb, 0x94, 0xd8, 0x85, 0xeb, 0xd4, 0x36, 0x43, 0xda, 0x52, 0x98, - 0xca, 0x24, 0x5a, 0x95, 0x90, 0x88, 0xf6, 0x88, 0x2f, 0xb7, 0x08, 0x13, 0x8d, 0x44, 0xe7, 0xcf, - 0x8b, 0xc0, 0xbc, 0xec, 0x23, 0xc2, 0xba, 0x21, 0x87, 0x1f, 0x02, 0x4b, 0x1e, 0xc0, 0xb0, 0xc7, - 0xdd, 0x99, 0xd6, 0xd6, 0x9e, 0x4c, 0x3e, 0xe8, 0xf3, 0x1e, 0x0e, 0x2a, 0x8d, 0x54, 0x47, 0xba, - 0xff, 0x65, 0xb0, 0xd4, 0x0c, 0x29, 0x8d, 0xe4, 0x24, 0x14, 0x90, 0x12, 0x20, 0x92, 0x5d, 0x93, - 0xab, 0x9c, 0x95, 0x87, 0xdb, 0xef, 0xde, 0x5e, 0xe5, 0xb9, 0x51, 0xa9, 0x6d, 0xe8, 0x1b, 0x4a, - 0x51, 0x71, 0xeb, 0x78, 0x47, 0xf4, 0x56, 0x8e, 0x92, 0x05, 0xb2, 0x09, 0xe1, 0x72, 0xd1, 0x0a, - 0x48, 0x3c, 0xc2, 0x2a, 0x30, 0x13, 0xd2, 0x23, 0x09, 0x27, 0xbe, 0x5c, 0x1c, 0x13, 0x8d, 0x65, - 0xf8, 0x18, 0x98, 0x2d, 0xcc, 0xdc, 0x2e, 0x23, 0xbe, 0x5a, 0x09, 0xb4, 0xd2, 0xc2, 0xec, 0x63, - 0x46, 0xfc, 0xe7, 0xc6, 0x17, 0x5f, 0xda, 0x0b, 0x0e, 0x06, 0x79, 0x7d, 0xe4, 0xed, 0x76, 0x42, - 0x72, 0xcf, 0x84, 0xed, 0x83, 0x02, 0xe3, 0x34, 0xc1, 0x2d, 0xe2, 0x5e, 0x91, 0x81, 0x9e, 0x33, - 0x35, 0x35, 0x5a, 0xff, 0x5b, 0x32, 0x60, 0x68, 0x5a, 0xd0, 0x14, 0x5f, 0x1a, 0x20, 0x7f, 0x99, - 0x60, 0x8f, 0xe8, 0x03, 0xac, 0x98, 0x55, 0x21, 0x26, 0x9a, 0x42, 0x4b, 0x82, 0x9b, 0x07, 0x11, - 0xa1, 0x5d, 0xae, 0xdf, 0xa7, 0x91, 0x28, 0x22, 0x12, 0x42, 0xfa, 0xc4, 0x93, 0x6d, 0x34, 0x90, - 0x96, 0xe0, 0x01, 0x58, 0xf5, 0x03, 0x86, 0x9b, 0xa1, 0xbc, 0xdd, 0x78, 0x57, 0xaa, 0xfc, 0x9a, - 0x75, 0x9d, 0xda, 0x05, 0x6d, 0x68, 0x08, 0x3d, 0x9a, 0x91, 0xe0, 0x07, 0xa0, 0x34, 0x09, 0x93, - 0xd9, 0xaa, 0x4b, 0x5d, 0x0d, 0x5e, 0xa7, 0x76, 0x71, 0xec, 0x2a, 0x2d, 0x68, 0x4e, 0x16, 0x2b, - 0xed, 0x93, 0x66, 0xb7, 0x25, 0x87, 0xcf, 0x44, 0x4a, 0x10, 0xda, 0x30, 0x88, 0x02, 0x2e, 0x87, - 0x6d, 0x09, 0x29, 0x01, 0x7e, 0x00, 0x72, 0xb4, 0x47, 0x92, 0x24, 0xf0, 0xe5, 0x65, 0xeb, 0xdb, - 0xef, 0xa7, 0x68, 0xe2, 0x2f, 0x8a, 0x23, 0xb1, 0x4c, 0x32, 0x22, 0x11, 0x4d, 0x06, 0xf2, 0x88, - 0xa0, 0x8b, 0x53, 0x86, 0x17, 0x52, 0x8f, 0x66, 0x24, 0x58, 0x03, 0x50, 0x87, 0x25, 0x84, 0x77, - 0x93, 0xd8, 0x95, 0xef, 0x7f, 0x41, 0xc6, 0xca, 0xb7, 0x50, 0x59, 0x91, 0x34, 0x9e, 0x60, 0x8e, - 0xd1, 0x2d, 0x0d, 0xfc, 0x05, 0x80, 0x6a, 0x4d, 0xdc, 0xcf, 0x19, 0x1d, 0x5f, 0xb0, 0xd5, 0x1e, - 0x2f, 0xf9, 0x95, 0x55, 0xe7, 0x6c, 0x29, 0xe9, 0x8c, 0x51, 0x5d, 0xc5, 0x99, 0x61, 0x1a, 0xd6, - 0x92, 0xba, 0x32, 0x8e, 0xfb, 0xa7, 0xab, 0x40, 0x6b, 0x23, 0x79, 0x2a, 0xbd, 0x1f, 0xfd, 0x3d, - 0x03, 0xa6, 0x6e, 0x5e, 0xf0, 0x67, 0xa0, 0x7a, 0x74, 0x7c, 0x5c, 0x6f, 0x34, 0xdc, 0xcb, 0x4f, - 0x2e, 0xea, 0xee, 0x45, 0x1d, 0xbd, 0x38, 0x6d, 0x34, 0x4e, 0x3f, 0x7a, 0x79, 0x5e, 0x6f, 0x34, - 0xac, 0x85, 0xea, 0xbb, 0xaf, 0xdf, 0x6c, 0x55, 0x26, 0xfe, 0x17, 0xa2, 0x9f, 0x8c, 0x05, 0x34, - 0x0e, 0xc5, 0xa4, 0xbe, 0x0f, 0x36, 0xa6, 0xa3, 0x51, 0xbd, 0x71, 0x89, 0x4e, 0x8f, 0x2f, 0xeb, - 0x27, 0x56, 0xa6, 0x5a, 0x79, 0xfd, 0x66, 0xab, 0x3c, 0x89, 0x44, 0x84, 0xf1, 0x24, 0x10, 0xd7, - 0x77, 0x78, 0x08, 0x2a, 0x77, 0x73, 0xd6, 0x4f, 0xac, 0xc5, 0x6a, 0xf5, 0xf5, 0x9b, 0xad, 0x8d, - 0xbb, 0x18, 0x89, 0x5f, 0x35, 0xbe, 0xf8, 0xdb, 0xe6, 0x42, 0xed, 0x57, 0x5f, 0x0d, 0x37, 0x33, - 0x5f, 0x0f, 0x37, 0x33, 0xff, 0x19, 0x6e, 0x66, 0xfe, 0xf2, 0x76, 0x73, 0xe1, 0xeb, 0xb7, 0x9b, - 0x0b, 0xff, 0x7c, 0xbb, 0xb9, 0xf0, 0x87, 0x1f, 0xb4, 0x02, 0xde, 0xee, 0x36, 0x77, 0x3c, 0x1a, - 0xed, 0x92, 0x5e, 0x44, 0x99, 0xfe, 0xdb, 0xdb, 0x3b, 0xdc, 0xed, 0xcb, 0x1f, 0x60, 0xc4, 0xcd, - 0x92, 0x35, 0x97, 0xe5, 0x0f, 0x2b, 0xcf, 0xfe, 0x17, 0x00, 0x00, 0xff, 0xff, 0x6c, 0xd3, 0x8d, - 0x17, 0x9e, 0x11, 0x00, 0x00, + // 1882 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x58, 0x5b, 0x6f, 0xe3, 0xc6, + 0x15, 0xb6, 0x6c, 0xda, 0xa6, 0x46, 0xb2, 0xc4, 0x1d, 0xcb, 0x8e, 0xa2, 0xa4, 0xa6, 0xcb, 0x16, + 0xc5, 0xb6, 0x48, 0xec, 0xb5, 0x37, 0x6e, 0x8d, 0xa4, 0x37, 0xcb, 0x56, 0x5a, 0xbb, 0xde, 0x8d, + 0x31, 0x72, 0x5a, 0xa4, 0x68, 0x40, 0x8c, 0xc8, 0x09, 0xc5, 0x98, 0xe4, 0x08, 0x9c, 0x91, 0x56, + 0xea, 0x2f, 0x08, 0xb6, 0x2f, 0xed, 0x0f, 0x58, 0x20, 0x40, 0xff, 0x48, 0x1f, 0x83, 0x3e, 0xe5, + 0xb1, 0x28, 0x50, 0xb6, 0xd0, 0xbe, 0xf9, 0xd1, 0xef, 0x05, 0x8a, 0xb9, 0xe8, 0x6a, 0xc7, 0x71, + 0x5f, 0xec, 0x39, 0xb7, 0xef, 0x3b, 0xe7, 0xcc, 0x21, 0x67, 0x28, 0x50, 0x23, 0xbc, 0x4d, 0xd2, + 0x38, 0x4c, 0xf8, 0x2e, 0xe9, 0xc5, 0xbb, 0xbd, 0x3d, 0xf1, 0x6f, 0xa7, 0x93, 0x52, 0x4e, 0xa1, + 0x35, 0xb6, 0xed, 0x08, 0x65, 0x6f, 0xaf, 0x56, 0x09, 0x68, 0x40, 0xa5, 0x71, 0x57, 0xac, 0x94, + 0x9f, 0xf3, 0xef, 0x25, 0xb0, 0x72, 0x81, 0x53, 0x1c, 0x33, 0xb8, 0x07, 0xf2, 0xa4, 0x17, 0xbb, + 0x3e, 0x49, 0x68, 0x5c, 0xcd, 0x6d, 0xe7, 0x1e, 0xe7, 0xeb, 0x95, 0x9b, 0xcc, 0xb6, 0x06, 0x38, + 0x8e, 0xde, 0x77, 0xc6, 0x26, 0x07, 0x99, 0xa4, 0x17, 0x9f, 0x88, 0x25, 0x3c, 0x02, 0x80, 0xf4, + 0x79, 0x8a, 0x5d, 0x12, 0x76, 0x58, 0xd5, 0xd8, 0x5e, 0x7a, 0x9c, 0xaf, 0x3b, 0xc3, 0xcc, 0xce, + 0x37, 0x84, 0xb6, 0x71, 0x7a, 0xc1, 0x6e, 0x32, 0xfb, 0x91, 0x06, 0x18, 0x3b, 0x3a, 0x28, 0x2f, + 0x85, 0x46, 0xd8, 0x61, 0xf0, 0x53, 0x50, 0xf4, 0xda, 0x38, 0x4c, 0x5c, 0x8f, 0x26, 0x9f, 0x85, + 0x41, 0x75, 0x79, 0x3b, 0xf7, 0xb8, 0xb0, 0xff, 0x9d, 0x9d, 0xf9, 0xfc, 0x77, 0x8e, 0x85, 0xd7, + 0xb1, 0x74, 0xaa, 0xbf, 0xf5, 0x55, 0x66, 0x2f, 0xdc, 0x64, 0xf6, 0xba, 0x82, 0x9e, 0x06, 0x70, + 0x50, 0xc1, 0x9b, 0x78, 0xc2, 0x7d, 0xb0, 0x81, 0xa3, 0x88, 0xbe, 0x70, 0xbb, 0x89, 0x28, 0x98, + 0x78, 0x9c, 0xf8, 0x2e, 0xef, 0xb3, 0xea, 0xca, 0x76, 0xee, 0xb1, 0x89, 0xd6, 0xa5, 0xf1, 0xe3, + 0x89, 0xed, 0xb2, 0xcf, 0xe0, 0xbb, 0x00, 0x62, 0x8f, 0x87, 0x3d, 0xe2, 0x76, 0x52, 0xe2, 0xd1, + 0xb8, 0x13, 0x46, 0x84, 0x55, 0x57, 0x45, 0x75, 0xe8, 0x91, 0xb2, 0x5c, 0x4c, 0x0c, 0x70, 0x1f, + 0x14, 0x45, 0x73, 0xbc, 0x36, 0x4e, 0x12, 0x12, 0xb1, 0xaa, 0x29, 0xdb, 0x50, 0x1e, 0x66, 0x76, + 0xa1, 0xf1, 0xdb, 0x67, 0xc7, 0x5a, 0x8d, 0x0a, 0xa4, 0x17, 0x8f, 0x04, 0xf8, 0x29, 0x28, 0x61, + 0xcf, 0x23, 0x8c, 0x89, 0xac, 0x79, 0x4a, 0xa3, 0x6a, 0x5e, 0xd6, 0x6d, 0xdf, 0xae, 0xfb, 0x48, + 0xfa, 0x1d, 0x2b, 0xb7, 0xfa, 0x86, 0xa8, 0x7c, 0x98, 0xd9, 0x6b, 0x33, 0x6a, 0xb4, 0x86, 0xa7, + 0xc5, 0x33, 0xc3, 0x5c, 0xb4, 0x96, 0xce, 0x0c, 0x73, 0xc9, 0x32, 0x9c, 0xbf, 0xe4, 0xc0, 0xac, + 0x33, 0x3c, 0x02, 0x2b, 0x5e, 0x4a, 0x30, 0x27, 0x72, 0x97, 0x0b, 0xfb, 0xdf, 0xfb, 0x16, 0xd2, + 0xcb, 0x41, 0x87, 0xd4, 0x0d, 0x41, 0x8c, 0x74, 0x20, 0xfc, 0x19, 0x30, 0x3c, 0x1c, 0x45, 0xd5, + 0xc5, 0xff, 0x17, 0x40, 0x86, 0x39, 0xff, 0xca, 0x81, 0x47, 0xb7, 0x3c, 0xa0, 0x07, 0x0a, 0xba, + 0x29, 0x7c, 0xd0, 0x51, 0xc9, 0x95, 0xf6, 0xdf, 0xfe, 0x26, 0x6c, 0x09, 0xfa, 0xfd, 0x61, 0x66, + 0x83, 0x89, 0x7c, 0x93, 0xd9, 0x50, 0x8d, 0xc4, 0x14, 0x90, 0x83, 0x00, 0x1e, 0x7b, 0x40, 0x0f, + 0xac, 0xcf, 0x76, 0xde, 0x8d, 0x42, 0xc6, 0xab, 0x8b, 0x72, 0xd3, 0x9e, 0x0e, 0x33, 0x7b, 0x36, + 0xb1, 0xf3, 0x90, 0xf1, 0x9b, 0xcc, 0xae, 0xcd, 0xa0, 0x4e, 0x47, 0x3a, 0x62, 0x24, 0xe6, 0x02, + 0x9c, 0xff, 0x96, 0x40, 0x61, 0x6a, 0x5e, 0xe1, 0x1f, 0x40, 0xb9, 0x4d, 0x63, 0xc2, 0x38, 0xc1, + 0xbe, 0xdb, 0x8a, 0xa8, 0x77, 0xa5, 0x1f, 0xb0, 0xa7, 0xff, 0xcc, 0xec, 0x0d, 0x8f, 0xb2, 0x98, + 0x32, 0xe6, 0x5f, 0xed, 0x84, 0x74, 0x37, 0xc6, 0xbc, 0xbd, 0x73, 0x9a, 0x08, 0xd2, 0x4d, 0x45, + 0x3a, 0x17, 0xe9, 0xa0, 0xd2, 0x58, 0x53, 0x17, 0x0a, 0xd8, 0x06, 0x25, 0x1f, 0x53, 0xf7, 0x33, + 0x9a, 0x5e, 0x69, 0xf0, 0x45, 0x09, 0x5e, 0xff, 0x46, 0xf0, 0x61, 0x66, 0x17, 0x4f, 0x8e, 0x3e, + 0xfa, 0x90, 0xa6, 0x57, 0x12, 0xe2, 0x26, 0xb3, 0x37, 0x14, 0xd9, 0x2c, 0x90, 0x83, 0x8a, 0x3e, + 0xa6, 0x63, 0x37, 0xf8, 0x3b, 0x60, 0x8d, 0x1d, 0x58, 0xb7, 0xd3, 0xa1, 0x29, 0xaf, 0x2e, 0x89, + 0x07, 0xa9, 0xfe, 0xee, 0x30, 0xb3, 0x4b, 0x1a, 0xb2, 0xa9, 0x2c, 0x37, 0x99, 0xfd, 0xc6, 0x1c, + 0xa8, 0x8e, 0x71, 0x50, 0x49, 0xc3, 0x6a, 0x57, 0xd8, 0x02, 0x45, 0x12, 0x76, 0xf6, 0x0e, 0x9e, + 0xe8, 0x02, 0x0c, 0x59, 0xc0, 0x2f, 0xee, 0x2b, 0xa0, 0xd0, 0x38, 0xbd, 0xd8, 0x3b, 0x78, 0x32, + 0xca, 0x5f, 0xbf, 0x0a, 0xa6, 0x51, 0x1c, 0x54, 0x50, 0xa2, 0x4a, 0xfe, 0x14, 0x68, 0xd1, 0x6d, + 0x63, 0xd6, 0x96, 0x2f, 0x9a, 0x7c, 0xfd, 0xb1, 0x18, 0x20, 0x85, 0xf4, 0x6b, 0xcc, 0xda, 0x93, + 0xae, 0xb7, 0x06, 0x7f, 0xc4, 0x09, 0x0f, 0xbb, 0xf1, 0x08, 0x0b, 0xa8, 0x60, 0xe1, 0x35, 0x4e, + 0xf7, 0x40, 0xa7, 0xbb, 0xf2, 0xd0, 0x74, 0x0f, 0xee, 0x4a, 0xf7, 0x60, 0x36, 0x5d, 0xe5, 0x33, + 0xe6, 0x38, 0xd4, 0x1c, 0xab, 0x0f, 0xe5, 0x38, 0xbc, 0x8b, 0xe3, 0x70, 0x96, 0x43, 0xf9, 0x88, + 0xb9, 0x9c, 0xab, 0xb3, 0x6a, 0x3e, 0x78, 0x2e, 0x6f, 0x75, 0xa8, 0x34, 0xd6, 0x28, 0xf4, 0x2b, + 0x50, 0xf1, 0x68, 0xc2, 0xb8, 0xd0, 0x25, 0xb4, 0x13, 0x11, 0x4d, 0x91, 0x97, 0x14, 0x87, 0xf7, + 0x51, 0xbc, 0xa5, 0x5f, 0xec, 0x77, 0x84, 0x3b, 0x68, 0x7d, 0x56, 0xad, 0xc8, 0x5c, 0x60, 0x75, + 0x08, 0x27, 0x29, 0x6b, 0x75, 0xd3, 0x40, 0x13, 0x01, 0x49, 0xf4, 0xde, 0x7d, 0x44, 0x7a, 0x42, + 0xe7, 0x43, 0x1d, 0x54, 0x9e, 0xa8, 0x14, 0xc1, 0x27, 0xa0, 0x14, 0x0a, 0xd6, 0x56, 0x37, 0xd2, + 0xf0, 0x05, 0x09, 0xbf, 0x7f, 0x1f, 0xbc, 0x7e, 0xaa, 0x66, 0x03, 0x1d, 0xb4, 0x36, 0x52, 0x28, + 0x68, 0x1f, 0xc0, 0xb8, 0x1b, 0xa6, 0x6e, 0x10, 0x61, 0x2f, 0x24, 0xa9, 0x86, 0x2f, 0x4a, 0xf8, + 0x1f, 0xdf, 0x07, 0xff, 0xa6, 0x82, 0xbf, 0x1d, 0xec, 0x20, 0x4b, 0x28, 0x7f, 0xa5, 0x74, 0x8a, + 0xa5, 0x09, 0x8a, 0x2d, 0x92, 0x46, 0x61, 0xa2, 0xf1, 0xd7, 0x24, 0xfe, 0x93, 0xfb, 0xf0, 0xf5, + 0x04, 0x4d, 0x87, 0x39, 0xa8, 0xa0, 0xc4, 0x31, 0x68, 0x44, 0x13, 0x9f, 0x8e, 0x40, 0x1f, 0x3d, + 0x18, 0x74, 0x3a, 0xcc, 0x41, 0x05, 0x25, 0x2a, 0xd0, 0x00, 0xac, 0xe3, 0x34, 0xa5, 0x2f, 0xe6, + 0x1a, 0x02, 0x25, 0xf6, 0x4f, 0xee, 0xc3, 0x1e, 0xbd, 0xa7, 0x6f, 0x47, 0x8b, 0xf7, 0xb4, 0xd0, + 0xce, 0xb4, 0xc4, 0x07, 0x30, 0x48, 0xf1, 0x60, 0x8e, 0xa7, 0xf2, 0xe0, 0xc6, 0xdf, 0x0e, 0x76, + 0x90, 0x25, 0x94, 0x33, 0x2c, 0x9f, 0x83, 0x4a, 0x4c, 0xd2, 0x80, 0xb8, 0x09, 0xe1, 0xac, 0x13, + 0x85, 0x5c, 0xf3, 0x6c, 0x3c, 0xf8, 0x39, 0xb8, 0x2b, 0xdc, 0x41, 0x50, 0xaa, 0x9f, 0x6b, 0xed, + 0x78, 0x4a, 0x59, 0x1b, 0x27, 0x41, 0x1b, 0x87, 0x9a, 0x65, 0xf3, 0xc1, 0x53, 0x3a, 0x1b, 0xe8, + 0xa0, 0xb5, 0x91, 0x62, 0xbc, 0xd5, 0x1e, 0x4e, 0xbc, 0xee, 0x68, 0xab, 0xdf, 0x78, 0xf0, 0x56, + 0x4f, 0x87, 0x89, 0xfb, 0x99, 0x14, 0x25, 0xe8, 0x99, 0x61, 0x96, 0xac, 0xf2, 0x99, 0x61, 0x96, + 0x2d, 0xeb, 0xcc, 0x30, 0x2d, 0xeb, 0xd1, 0x99, 0x61, 0xae, 0x5b, 0x15, 0xb4, 0x36, 0xa0, 0x11, + 0x75, 0x7b, 0x4f, 0x55, 0x10, 0x2a, 0x90, 0x17, 0x98, 0xe9, 0x17, 0x0d, 0x2a, 0x79, 0x98, 0xe3, + 0x68, 0xc0, 0x74, 0x23, 0x90, 0xa5, 0xda, 0x33, 0x75, 0x6c, 0xed, 0x82, 0xe5, 0x26, 0x17, 0xf7, + 0x14, 0x0b, 0x2c, 0x5d, 0x91, 0x81, 0x3a, 0x6c, 0x91, 0x58, 0xc2, 0x0a, 0x58, 0xee, 0xe1, 0xa8, + 0x4b, 0xd4, 0x19, 0x89, 0x94, 0xe0, 0x5c, 0x80, 0xf2, 0x65, 0x8a, 0x13, 0x26, 0x6e, 0x77, 0x34, + 0x39, 0xa7, 0x01, 0x83, 0x10, 0x18, 0xf2, 0x9c, 0x50, 0xb1, 0x72, 0x0d, 0x7f, 0x08, 0x8c, 0x88, + 0x06, 0x4c, 0xde, 0x16, 0x0a, 0xfb, 0x1b, 0xb7, 0xaf, 0x26, 0xe7, 0x34, 0x40, 0xd2, 0xc5, 0xf9, + 0xfb, 0x22, 0x58, 0x3a, 0xa7, 0x01, 0xac, 0x82, 0x55, 0xec, 0xfb, 0x29, 0x61, 0x4c, 0x23, 0x8d, + 0x44, 0xb8, 0x09, 0x56, 0x38, 0xed, 0x84, 0x9e, 0x82, 0xcb, 0x23, 0x2d, 0x09, 0x62, 0x1f, 0x73, + 0x2c, 0x0f, 0xd6, 0x22, 0x92, 0x6b, 0x71, 0xc7, 0x94, 0x95, 0xb9, 0x49, 0x37, 0x6e, 0x91, 0x54, + 0x9e, 0x8f, 0x46, 0xbd, 0x7c, 0x9d, 0xd9, 0x05, 0xa9, 0x7f, 0x2e, 0xd5, 0x68, 0x5a, 0x80, 0xef, + 0x80, 0x55, 0xde, 0x9f, 0x3e, 0xeb, 0xd6, 0xaf, 0x33, 0xbb, 0xcc, 0x27, 0x65, 0x8a, 0xa3, 0x0c, + 0xad, 0xf0, 0xbe, 0x3c, 0xd2, 0x76, 0x81, 0xc9, 0xfb, 0x6e, 0x98, 0xf8, 0xa4, 0x2f, 0x8f, 0x33, + 0xa3, 0x5e, 0xb9, 0xce, 0x6c, 0x6b, 0xca, 0xfd, 0x54, 0xd8, 0xd0, 0x2a, 0xef, 0xcb, 0x05, 0x7c, + 0x07, 0x00, 0x95, 0x92, 0x64, 0x50, 0xa7, 0xd3, 0xda, 0x75, 0x66, 0xe7, 0xa5, 0x56, 0x62, 0x4f, + 0x96, 0xd0, 0x01, 0xcb, 0x0a, 0xdb, 0x94, 0xd8, 0xc5, 0xeb, 0xcc, 0x36, 0x23, 0x1a, 0x28, 0x4c, + 0x65, 0x12, 0xad, 0x4a, 0x49, 0x4c, 0x7b, 0xc4, 0x97, 0x47, 0x84, 0x89, 0x46, 0xa2, 0xf3, 0xa7, + 0x45, 0x60, 0x5e, 0xf6, 0x11, 0x61, 0xdd, 0x88, 0xc3, 0x0f, 0x81, 0x25, 0x2f, 0x60, 0xd8, 0xe3, + 0xee, 0x4c, 0x6b, 0xeb, 0x6f, 0x4d, 0x5e, 0xe8, 0xf3, 0x1e, 0x0e, 0x2a, 0x8f, 0x54, 0x47, 0xba, + 0xff, 0x15, 0xb0, 0xdc, 0x8a, 0x28, 0x8d, 0xe5, 0x24, 0x14, 0x91, 0x12, 0x20, 0x92, 0x5d, 0x93, + 0xbb, 0xbc, 0x24, 0x2f, 0xb7, 0xdf, 0xbd, 0xbd, 0xcb, 0x73, 0xa3, 0x52, 0xdf, 0xd4, 0x9f, 0x23, + 0x25, 0xc5, 0xad, 0xe3, 0x1d, 0xd1, 0x5b, 0x39, 0x4a, 0x16, 0x58, 0x4a, 0x09, 0x97, 0x9b, 0x56, + 0x44, 0x62, 0x09, 0x6b, 0xc0, 0x4c, 0x49, 0x8f, 0xa4, 0x9c, 0xf8, 0x72, 0x73, 0x4c, 0x34, 0x96, + 0xe1, 0x9b, 0xc0, 0x0c, 0x30, 0x73, 0xbb, 0x8c, 0xf8, 0x6a, 0x27, 0xd0, 0x6a, 0x80, 0xd9, 0xc7, + 0x8c, 0xf8, 0xef, 0x1b, 0x5f, 0x7c, 0x69, 0x2f, 0x38, 0x18, 0x14, 0xf4, 0x95, 0xb7, 0xdb, 0x89, + 0xc8, 0x3d, 0x13, 0xb6, 0x0f, 0x8a, 0x8c, 0xd3, 0x14, 0x07, 0xc4, 0xbd, 0x22, 0x03, 0x3d, 0x67, + 0x6a, 0x6a, 0xb4, 0xfe, 0x37, 0x64, 0xc0, 0xd0, 0xb4, 0xa0, 0x29, 0xbe, 0x34, 0x40, 0xe1, 0x32, + 0xc5, 0x1e, 0xd1, 0x17, 0x58, 0x31, 0xab, 0x42, 0x4c, 0x35, 0x85, 0x96, 0x04, 0x37, 0x0f, 0x63, + 0x42, 0xbb, 0x5c, 0x3f, 0x4f, 0x23, 0x51, 0x44, 0xa4, 0x84, 0xf4, 0x89, 0x27, 0xdb, 0x68, 0x20, + 0x2d, 0xc1, 0x03, 0xb0, 0xe6, 0x87, 0x0c, 0xb7, 0x22, 0xe2, 0x32, 0x8e, 0xbd, 0x2b, 0x55, 0x7e, + 0xdd, 0xba, 0xce, 0xec, 0xa2, 0x36, 0x34, 0x85, 0x1e, 0xcd, 0x48, 0xf0, 0x03, 0x50, 0x9e, 0x84, + 0xc9, 0x6c, 0xd5, 0x17, 0x5c, 0x1d, 0x5e, 0x67, 0x76, 0x69, 0xec, 0x2a, 0x2d, 0x68, 0x4e, 0x16, + 0x3b, 0xed, 0x93, 0x56, 0x37, 0x90, 0xc3, 0x67, 0x22, 0x25, 0x08, 0x6d, 0x14, 0xc6, 0x21, 0x97, + 0xc3, 0xb6, 0x8c, 0x94, 0x00, 0x3f, 0x00, 0x79, 0xda, 0x23, 0x69, 0x1a, 0xfa, 0x84, 0xc9, 0x0b, + 0xc4, 0xb7, 0x7d, 0x8c, 0xa2, 0x89, 0xbf, 0x28, 0x8e, 0x24, 0x32, 0xc9, 0x98, 0xc4, 0x34, 0x1d, + 0xc8, 0x2b, 0x82, 0x2e, 0x4e, 0x19, 0x9e, 0x49, 0x3d, 0x9a, 0x91, 0x60, 0x1d, 0x40, 0x1d, 0x96, + 0x12, 0xde, 0x4d, 0x13, 0x57, 0x3e, 0xff, 0x45, 0x19, 0x2b, 0x9f, 0x42, 0x65, 0x45, 0xd2, 0x78, + 0x82, 0x39, 0x46, 0xb7, 0x34, 0xf0, 0xe7, 0x00, 0xaa, 0x3d, 0x71, 0x3f, 0x67, 0x74, 0xfc, 0x35, + 0xad, 0xce, 0x78, 0xc9, 0xaf, 0xac, 0x3a, 0x67, 0x4b, 0x49, 0x67, 0x8c, 0xea, 0x2a, 0xce, 0x0c, + 0xd3, 0xb0, 0x96, 0xcf, 0x0c, 0x73, 0xd5, 0x32, 0xc7, 0xfd, 0xd3, 0x55, 0xa0, 0xf5, 0x91, 0x3c, + 0x95, 0xde, 0x8f, 0xfe, 0x96, 0x03, 0x53, 0x5f, 0x5e, 0xf0, 0xa7, 0xa0, 0x76, 0x74, 0x7c, 0xdc, + 0x68, 0x36, 0xdd, 0xcb, 0x4f, 0x2e, 0x1a, 0xee, 0x45, 0x03, 0x3d, 0x3b, 0x6d, 0x36, 0x4f, 0x3f, + 0x7a, 0x7e, 0xde, 0x68, 0x36, 0xad, 0x85, 0xda, 0xdb, 0x2f, 0x5f, 0x6d, 0x57, 0x27, 0xfe, 0x17, + 0xa2, 0x9f, 0x8c, 0x85, 0x34, 0x89, 0xc4, 0xa4, 0xbe, 0x07, 0x36, 0xa7, 0xa3, 0x51, 0xa3, 0x79, + 0x89, 0x4e, 0x8f, 0x2f, 0x1b, 0x27, 0x56, 0xae, 0x56, 0x7d, 0xf9, 0x6a, 0xbb, 0x32, 0x89, 0x44, + 0x84, 0xf1, 0x34, 0x14, 0xdf, 0xea, 0xf0, 0x10, 0x54, 0xef, 0xe6, 0x6c, 0x9c, 0x58, 0x8b, 0xb5, + 0xda, 0xcb, 0x57, 0xdb, 0x9b, 0x77, 0x31, 0x12, 0xbf, 0x66, 0x7c, 0xf1, 0xd7, 0xad, 0x85, 0xfa, + 0x2f, 0xbf, 0x1a, 0x6e, 0xe5, 0xbe, 0x1e, 0x6e, 0xe5, 0xfe, 0x33, 0xdc, 0xca, 0xfd, 0xf9, 0xf5, + 0xd6, 0xc2, 0xd7, 0xaf, 0xb7, 0x16, 0xfe, 0xf1, 0x7a, 0x6b, 0xe1, 0xf7, 0x3f, 0x08, 0x42, 0xde, + 0xee, 0xb6, 0x76, 0x3c, 0x1a, 0xef, 0x92, 0x5e, 0x4c, 0x99, 0xfe, 0xdb, 0xdb, 0x3b, 0xdc, 0xed, + 0xcb, 0x5f, 0x5b, 0xc4, 0x97, 0x25, 0x6b, 0xad, 0xc8, 0x5f, 0x51, 0x9e, 0xfe, 0x2f, 0x00, 0x00, + 0xff, 0xff, 0x92, 0x17, 0x5a, 0x71, 0x8b, 0x11, 0x00, 0x00, } func (m *Params) Marshal() (dAtA []byte, err error) { @@ -1039,23 +1092,13 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x2a if len(m.ExtraEIPs) > 0 { - dAtA4 := make([]byte, len(m.ExtraEIPs)*10) - var j3 int - for _, num1 := range m.ExtraEIPs { - num := uint64(num1) - for num >= 1<<7 { - dAtA4[j3] = uint8(uint64(num)&0x7f | 0x80) - num >>= 7 - j3++ - } - dAtA4[j3] = uint8(num) - j3++ + for iNdEx := len(m.ExtraEIPs) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.ExtraEIPs[iNdEx]) + copy(dAtA[i:], m.ExtraEIPs[iNdEx]) + i = encodeVarintEvm(dAtA, i, uint64(len(m.ExtraEIPs[iNdEx]))) + i-- + dAtA[i] = 0x22 } - i -= j3 - copy(dAtA[i:], dAtA4[:j3]) - i = encodeVarintEvm(dAtA, i, uint64(j3)) - i-- - dAtA[i] = 0x22 } if len(m.EvmDenom) > 0 { i -= len(m.EvmDenom) @@ -1804,6 +1847,7 @@ func encodeVarintEvm(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } + func (m *Params) Size() (n int) { if m == nil { return 0 @@ -1815,11 +1859,10 @@ func (m *Params) Size() (n int) { n += 1 + l + sovEvm(uint64(l)) } if len(m.ExtraEIPs) > 0 { - l = 0 - for _, e := range m.ExtraEIPs { - l += sovEvm(uint64(e)) + for _, s := range m.ExtraEIPs { + l = len(s) + n += 1 + l + sovEvm(uint64(l)) } - n += 1 + sovEvm(uint64(l)) + l } l = m.ChainConfig.Size() n += 1 + l + sovEvm(uint64(l)) @@ -2134,9 +2177,11 @@ func (m *TraceConfig) Size() (n int) { func sovEvm(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } + func sozEvm(x uint64) (n int) { return sovEvm(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } + func (m *Params) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -2199,81 +2244,37 @@ func (m *Params) Unmarshal(dAtA []byte) error { m.EvmDenom = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 4: - if wireType == 0 { - var v int64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.ExtraEIPs = append(m.ExtraEIPs, v) - } else if wireType == 2 { - var packedLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - packedLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if packedLen < 0 { - return ErrInvalidLengthEvm - } - postIndex := iNdEx + packedLen - if postIndex < 0 { - return ErrInvalidLengthEvm - } - if postIndex > l { + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExtraEIPs", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvm + } + if iNdEx >= l { return io.ErrUnexpectedEOF } - var elementCount int - var count int - for _, integer := range dAtA[iNdEx:postIndex] { - if integer < 128 { - count++ - } - } - elementCount = count - if elementCount != 0 && len(m.ExtraEIPs) == 0 { - m.ExtraEIPs = make([]int64, 0, elementCount) - } - for iNdEx < postIndex { - var v int64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvm - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.ExtraEIPs = append(m.ExtraEIPs, v) - } - } else { - return fmt.Errorf("proto: wrong wireType = %d for field ExtraEIPs", wireType) + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvm + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvm + } + if postIndex > l { + return io.ErrUnexpectedEOF } + m.ExtraEIPs = append(m.ExtraEIPs, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex case 5: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ChainConfig", wireType) @@ -2445,6 +2446,7 @@ func (m *Params) Unmarshal(dAtA []byte) error { } return nil } + func (m *AccessControl) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -2561,6 +2563,7 @@ func (m *AccessControl) Unmarshal(dAtA []byte) error { } return nil } + func (m *AccessControlType) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -2662,6 +2665,7 @@ func (m *AccessControlType) Unmarshal(dAtA []byte) error { } return nil } + func (m *ChainConfig) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -3376,6 +3380,7 @@ func (m *ChainConfig) Unmarshal(dAtA []byte) error { } return nil } + func (m *State) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -3490,6 +3495,7 @@ func (m *State) Unmarshal(dAtA []byte) error { } return nil } + func (m *TransactionLogs) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -3606,6 +3612,7 @@ func (m *TransactionLogs) Unmarshal(dAtA []byte) error { } return nil } + func (m *Log) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -3895,6 +3902,7 @@ func (m *Log) Unmarshal(dAtA []byte) error { } return nil } + func (m *TxResult) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -4117,6 +4125,7 @@ func (m *TxResult) Unmarshal(dAtA []byte) error { } return nil } + func (m *AccessTuple) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -4231,6 +4240,7 @@ func (m *AccessTuple) Unmarshal(dAtA []byte) error { } return nil } + func (m *TraceConfig) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -4551,6 +4561,7 @@ func (m *TraceConfig) Unmarshal(dAtA []byte) error { } return nil } + func skipEvm(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/evm/types/params.go b/x/evm/types/params.go index 9d9b61ac51..82060e4161 100644 --- a/x/evm/types/params.go +++ b/x/evm/types/params.go @@ -37,7 +37,7 @@ var ( } // DefaultExtraEIPs defines the default extra EIPs to be included // On v15, EIP 3855 was enabled - DefaultExtraEIPs = []int64{3855} + DefaultExtraEIPs = []string{"ethereum_3855"} DefaultEVMChannels = []string{ "channel-10", // Injective "channel-31", // Cronos @@ -62,7 +62,7 @@ func NewParams( evmDenom string, allowUnprotectedTxs bool, config ChainConfig, - extraEIPs []int64, + extraEIPs []string, activeStaticPrecompiles, evmChannels []string, accessControl AccessControl, @@ -138,12 +138,10 @@ func (p Params) Validate() error { return validateChannels(p.EVMChannels) } -// EIPs returns the ExtraEIPS as a int slice -func (p Params) EIPs() []int { - eips := make([]int, len(p.ExtraEIPs)) - for i, eip := range p.ExtraEIPs { - eips[i] = int(eip) - } +// EIPs returns the ExtraEIPS as a slice. +func (p Params) EIPs() []string { + eips := make([]string, len(p.ExtraEIPs)) + copy(eips, p.ExtraEIPs) return eips } @@ -232,22 +230,27 @@ func validateBool(i interface{}) error { } func validateEIPs(i interface{}) error { - eips, ok := i.([]int64) + eips, ok := i.([]string) if !ok { return fmt.Errorf("invalid EIP slice type: %T", i) } - uniqueEIPs := make(map[int64]struct{}) + uniqueEIPs := make(map[string]struct{}) for _, eip := range eips { - if !vm.ExistsEipActivator(int(eip)) { - return fmt.Errorf("EIP %d is not activateable, valid EIPs are: %s", eip, vm.ActivateableEips()) + if !vm.ExistsEipActivator(eip) { + return fmt.Errorf("EIP %s is not activateable, valid EIPs are: %s", eip, vm.ActivateableEips()) + } + + if err := vm.ValidateEIPName(eip); err != nil { + return fmt.Errorf("EIP %s name is not valid", eip) } if _, ok := uniqueEIPs[eip]; ok { - return fmt.Errorf("found duplicate EIP: %d", eip) + return fmt.Errorf("found duplicate EIP: %s", eip) } uniqueEIPs[eip] = struct{}{} + } return nil diff --git a/x/evm/types/params_test.go b/x/evm/types/params_test.go index ee3ee0eeba..52045cf4bf 100644 --- a/x/evm/types/params_test.go +++ b/x/evm/types/params_test.go @@ -11,7 +11,7 @@ import ( func TestParamsValidate(t *testing.T) { t.Parallel() - extraEips := []int64{2929, 1884, 1344} + extraEips := []string{"ethereum_2929", "ethereum_1884", "ethereum_1344"} testCases := []struct { name string params Params @@ -44,9 +44,9 @@ func TestParamsValidate(t *testing.T) { name: "invalid eip", params: Params{ EvmDenom: DefaultEVMDenom, - ExtraEIPs: []int64{10000}, + ExtraEIPs: []string{"os_1000000"}, }, - errContains: "EIP 10000 is not activateable, valid EIPs are", + errContains: "EIP os_1000000 is not activateable, valid EIPs are", }, { name: "unsorted precompiles", @@ -86,11 +86,11 @@ func TestParamsValidate(t *testing.T) { } func TestParamsEIPs(t *testing.T) { - extraEips := []int64{2929, 1884, 1344} + extraEips := []string{"ethereum_2929", "ethereum_1884", "ethereum_1344"} params := NewParams("ara", false, DefaultChainConfig(), extraEips, nil, nil, DefaultAccessControl) actual := params.EIPs() - require.Equal(t, []int{2929, 1884, 1344}, actual) + require.Equal(t, []string{"ethereum_2929", "ethereum_1884", "ethereum_1344"}, actual) } func TestParamsValidatePriv(t *testing.T) { @@ -99,8 +99,9 @@ func TestParamsValidatePriv(t *testing.T) { require.Error(t, validateBool("")) require.NoError(t, validateBool(true)) require.Error(t, validateEIPs("")) - require.NoError(t, validateEIPs([]int64{1884})) - require.ErrorContains(t, validateEIPs([]int64{1884, 1884, 1885, 1886}), "duplicate EIP: 1884") + require.Error(t, validateEIPs([]int64{1884})) + require.NoError(t, validateEIPs([]string{"ethereum_1884"})) + require.ErrorContains(t, validateEIPs([]string{"ethereum_1884", "ethereum_1884", "ethereum_1885"}), "duplicate EIP: ethereum_1884") require.NoError(t, validateChannels([]string{"channel-0"})) require.Error(t, validateChannels(false)) require.Error(t, validateChannels(int64(123))) diff --git a/x/evm/types/query.pb.gw.go b/x/evm/types/query.pb.gw.go index c93ebed7ed..a7ba3846af 100644 --- a/x/evm/types/query.pb.gw.go +++ b/x/evm/types/query.pb.gw.go @@ -25,15 +25,13 @@ import ( ) // Suppress "imported and not used" errors -var ( - _ codes.Code - _ io.Reader - _ status.Status - _ = runtime.String - _ = utilities.NewDoubleArray - _ = descriptor.ForMessage - _ = metadata.Join -) +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage +var _ = metadata.Join func request_Query_Account_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryAccountRequest @@ -52,12 +50,14 @@ func request_Query_Account_0(ctx context.Context, marshaler runtime.Marshaler, c } protoReq.Address, err = runtime.String(val) + if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) } msg, err := client.Account(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err + } func local_request_Query_Account_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -77,12 +77,14 @@ func local_request_Query_Account_0(ctx context.Context, marshaler runtime.Marsha } protoReq.Address, err = runtime.String(val) + if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) } msg, err := server.Account(ctx, &protoReq) return msg, metadata, err + } func request_Query_CosmosAccount_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -102,12 +104,14 @@ func request_Query_CosmosAccount_0(ctx context.Context, marshaler runtime.Marsha } protoReq.Address, err = runtime.String(val) + if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) } msg, err := client.CosmosAccount(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err + } func local_request_Query_CosmosAccount_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -127,12 +131,14 @@ func local_request_Query_CosmosAccount_0(ctx context.Context, marshaler runtime. } protoReq.Address, err = runtime.String(val) + if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) } msg, err := server.CosmosAccount(ctx, &protoReq) return msg, metadata, err + } func request_Query_ValidatorAccount_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -152,12 +158,14 @@ func request_Query_ValidatorAccount_0(ctx context.Context, marshaler runtime.Mar } protoReq.ConsAddress, err = runtime.String(val) + if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "cons_address", err) } msg, err := client.ValidatorAccount(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err + } func local_request_Query_ValidatorAccount_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -177,12 +185,14 @@ func local_request_Query_ValidatorAccount_0(ctx context.Context, marshaler runti } protoReq.ConsAddress, err = runtime.String(val) + if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "cons_address", err) } msg, err := server.ValidatorAccount(ctx, &protoReq) return msg, metadata, err + } func request_Query_Balance_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -202,12 +212,14 @@ func request_Query_Balance_0(ctx context.Context, marshaler runtime.Marshaler, c } protoReq.Address, err = runtime.String(val) + if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) } msg, err := client.Balance(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err + } func local_request_Query_Balance_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -227,12 +239,14 @@ func local_request_Query_Balance_0(ctx context.Context, marshaler runtime.Marsha } protoReq.Address, err = runtime.String(val) + if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) } msg, err := server.Balance(ctx, &protoReq) return msg, metadata, err + } func request_Query_Storage_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -252,6 +266,7 @@ func request_Query_Storage_0(ctx context.Context, marshaler runtime.Marshaler, c } protoReq.Address, err = runtime.String(val) + if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) } @@ -262,12 +277,14 @@ func request_Query_Storage_0(ctx context.Context, marshaler runtime.Marshaler, c } protoReq.Key, err = runtime.String(val) + if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "key", err) } msg, err := client.Storage(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err + } func local_request_Query_Storage_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -287,6 +304,7 @@ func local_request_Query_Storage_0(ctx context.Context, marshaler runtime.Marsha } protoReq.Address, err = runtime.String(val) + if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) } @@ -297,12 +315,14 @@ func local_request_Query_Storage_0(ctx context.Context, marshaler runtime.Marsha } protoReq.Key, err = runtime.String(val) + if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "key", err) } msg, err := server.Storage(ctx, &protoReq) return msg, metadata, err + } func request_Query_Code_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -322,12 +342,14 @@ func request_Query_Code_0(ctx context.Context, marshaler runtime.Marshaler, clie } protoReq.Address, err = runtime.String(val) + if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) } msg, err := client.Code(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err + } func local_request_Query_Code_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -347,12 +369,14 @@ func local_request_Query_Code_0(ctx context.Context, marshaler runtime.Marshaler } protoReq.Address, err = runtime.String(val) + if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) } msg, err := server.Code(ctx, &protoReq) return msg, metadata, err + } func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -361,6 +385,7 @@ func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, cl msg, err := client.Params(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err + } func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -369,9 +394,12 @@ func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshal msg, err := server.Params(ctx, &protoReq) return msg, metadata, err + } -var filter_Query_EthCall_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +var ( + filter_Query_EthCall_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) func request_Query_EthCall_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq EthCallRequest @@ -386,6 +414,7 @@ func request_Query_EthCall_0(ctx context.Context, marshaler runtime.Marshaler, c msg, err := client.EthCall(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err + } func local_request_Query_EthCall_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -401,9 +430,12 @@ func local_request_Query_EthCall_0(ctx context.Context, marshaler runtime.Marsha msg, err := server.EthCall(ctx, &protoReq) return msg, metadata, err + } -var filter_Query_EstimateGas_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +var ( + filter_Query_EstimateGas_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) func request_Query_EstimateGas_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq EthCallRequest @@ -418,6 +450,7 @@ func request_Query_EstimateGas_0(ctx context.Context, marshaler runtime.Marshale msg, err := client.EstimateGas(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err + } func local_request_Query_EstimateGas_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -433,9 +466,12 @@ func local_request_Query_EstimateGas_0(ctx context.Context, marshaler runtime.Ma msg, err := server.EstimateGas(ctx, &protoReq) return msg, metadata, err + } -var filter_Query_TraceTx_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +var ( + filter_Query_TraceTx_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) func request_Query_TraceTx_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryTraceTxRequest @@ -450,6 +486,7 @@ func request_Query_TraceTx_0(ctx context.Context, marshaler runtime.Marshaler, c msg, err := client.TraceTx(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err + } func local_request_Query_TraceTx_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -465,9 +502,12 @@ func local_request_Query_TraceTx_0(ctx context.Context, marshaler runtime.Marsha msg, err := server.TraceTx(ctx, &protoReq) return msg, metadata, err + } -var filter_Query_TraceBlock_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +var ( + filter_Query_TraceBlock_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) func request_Query_TraceBlock_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryTraceBlockRequest @@ -482,6 +522,7 @@ func request_Query_TraceBlock_0(ctx context.Context, marshaler runtime.Marshaler msg, err := client.TraceBlock(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err + } func local_request_Query_TraceBlock_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -497,6 +538,7 @@ func local_request_Query_TraceBlock_0(ctx context.Context, marshaler runtime.Mar msg, err := server.TraceBlock(ctx, &protoReq) return msg, metadata, err + } func request_Query_BaseFee_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -505,6 +547,7 @@ func request_Query_BaseFee_0(ctx context.Context, marshaler runtime.Marshaler, c msg, err := client.BaseFee(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err + } func local_request_Query_BaseFee_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -513,6 +556,7 @@ func local_request_Query_BaseFee_0(ctx context.Context, marshaler runtime.Marsha msg, err := server.BaseFee(ctx, &protoReq) return msg, metadata, err + } // RegisterQueryHandlerServer registers the http handlers for service Query to "mux". @@ -520,6 +564,7 @@ func local_request_Query_BaseFee_0(ctx context.Context, marshaler runtime.Marsha // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { + mux.Handle("GET", pattern_Query_Account_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -540,6 +585,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv } forward_Query_Account_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle("GET", pattern_Query_CosmosAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -562,6 +608,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv } forward_Query_CosmosAccount_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle("GET", pattern_Query_ValidatorAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -584,6 +631,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv } forward_Query_ValidatorAccount_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle("GET", pattern_Query_Balance_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -606,6 +654,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv } forward_Query_Balance_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle("GET", pattern_Query_Storage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -628,6 +677,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv } forward_Query_Storage_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle("GET", pattern_Query_Code_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -650,6 +700,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv } forward_Query_Code_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -672,6 +723,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv } forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle("GET", pattern_Query_EthCall_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -694,6 +746,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv } forward_Query_EthCall_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle("GET", pattern_Query_EstimateGas_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -716,6 +769,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv } forward_Query_EstimateGas_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle("GET", pattern_Query_TraceTx_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -738,6 +792,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv } forward_Query_TraceTx_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle("GET", pattern_Query_TraceBlock_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -760,6 +815,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv } forward_Query_TraceBlock_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle("GET", pattern_Query_BaseFee_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -782,6 +838,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv } forward_Query_BaseFee_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) return nil @@ -824,6 +881,7 @@ func RegisterQueryHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc // doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in // "QueryClient" to call the correct interceptors. func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, client QueryClient) error { + mux.Handle("GET", pattern_Query_Account_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -841,6 +899,7 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } forward_Query_Account_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle("GET", pattern_Query_CosmosAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -860,6 +919,7 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } forward_Query_CosmosAccount_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle("GET", pattern_Query_ValidatorAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -879,6 +939,7 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } forward_Query_ValidatorAccount_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle("GET", pattern_Query_Balance_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -898,6 +959,7 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } forward_Query_Balance_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle("GET", pattern_Query_Storage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -917,6 +979,7 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } forward_Query_Storage_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle("GET", pattern_Query_Code_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -936,6 +999,7 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } forward_Query_Code_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -955,6 +1019,7 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle("GET", pattern_Query_EthCall_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -974,6 +1039,7 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } forward_Query_EthCall_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle("GET", pattern_Query_EstimateGas_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -993,6 +1059,7 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } forward_Query_EstimateGas_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle("GET", pattern_Query_TraceTx_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -1012,6 +1079,7 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } forward_Query_TraceTx_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle("GET", pattern_Query_TraceBlock_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -1031,6 +1099,7 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } forward_Query_TraceBlock_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle("GET", pattern_Query_BaseFee_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -1050,6 +1119,7 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } forward_Query_BaseFee_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) return nil From 2c80c38eef80524130ab7e4425b7aebba11a4094 Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Fri, 19 Jul 2024 11:03:56 -0300 Subject: [PATCH 331/345] fix(distr-precompile): update claimRewards func (#2682) * fix(distr-precompile): update claimRewards func * run make format * add changelog entry * update test comt * update test comt --------- Signed-off-by: Tom <54514587+GAtom22@users.noreply.github.com> Co-authored-by: GAtom22 --- CHANGELOG.md | 1 + precompiles/distribution/integration_test.go | 68 ++++++++++++++++++++ precompiles/distribution/tx.go | 2 +- 3 files changed, 70 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ab360ec83e..a89dadeccd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -64,6 +64,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (precompiles) [GHSA-68fc-7mhg-6f6c](https://github.com/evmos/evmos/commit/bb2d504eec9078d6eff6981fc0cb214e8a3ca496) Refactor precompiles to use journal entries. - (vesting-precompile) [GHSA-q6hg-6m9x-5g9c](https://github.com/evmos/evmos/commit/0a620e176617a835ac697eea494afea09185dfaf) Update vesting precompile authorization checks. - (erc20) [#2607](https://github.com/evmos/evmos/pull/2607) Implement Single Token Representation v2. +- (distribution-precompile) [#2682](https://github.com/evmos/evmos/pull/2682) Fix `claimRewards` bug and add new test cases. - (evm) [#2667](https://github.com/evmos/evmos/pull/2667) Modify activator maps and default extra EIP to use []string. ### Bug Fixes diff --git a/precompiles/distribution/integration_test.go b/precompiles/distribution/integration_test.go index 75f151b629..e4e7d4d427 100644 --- a/precompiles/distribution/integration_test.go +++ b/precompiles/distribution/integration_test.go @@ -1442,6 +1442,74 @@ var _ = Describe("Calling distribution precompile from another contract", func() finalBalance := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) Expect(finalBalance.Amount.GT(initialBalance.Amount)).To(BeTrue(), "expected final balance to be greater than initial balance after claiming rewards") }) + + Context("Table driven tests", func() { + var ( + args contracts.CallArgs + contractInitialBalance = math.NewInt(100) + ) + BeforeEach(func() { + args = defaultClaimRewardsArgs. + WithMethodName("testClaimRewardsWithTransfer"). + WithGasPrice(gasPrice) + + // send some funds to the contract + err := evmosutil.FundAccountWithBaseDenom(s.ctx, s.app.BankKeeper, contractAddr.Bytes(), contractInitialBalance.Int64()) + Expect(err).To(BeNil()) + }) + + DescribeTable("claimRewards with transfer to withdrawer", func(tc testCase) { + // get the pending rewards to claim + qr := distrkeeper.Querier{Keeper: s.app.DistrKeeper} + qRes, err := qr.DelegationTotalRewards(s.ctx, &distrtypes.QueryDelegationTotalRewardsRequest{DelegatorAddress: sdk.AccAddress(s.address.Bytes()).String()}) + Expect(err).To(BeNil()) + expRewards := qRes.Total.AmountOf(s.bondDenom).TruncateInt() + + claimRewardsArgs := args.WithArgs( + s.address, uint32(2), tc.before, tc.after, + ) + + logCheckArgs := passCheck. + WithExpEvents(distribution.EventTypeClaimRewards) + + res, _, err := contracts.CallContractAndCheckLogs(s.ctx, s.app, claimRewardsArgs, logCheckArgs) + Expect(err).To(BeNil(), "error while calling the smart contract: %v", err) + fees := math.NewIntFromBigInt(gasPrice).MulRaw(res.GasUsed) + + // calculate the transferred amt during the call + contractTransferredAmt := math.ZeroInt() + for _, transferred := range []bool{tc.before, tc.after} { + if transferred { + contractTransferredAmt = contractTransferredAmt.AddRaw(15) + } + } + + // check balances + expContractFinalBalance := contractInitialBalance.Sub(contractTransferredAmt) + expDelFinalBalance := initialBalance.Amount.Sub(fees).Add(contractTransferredAmt).Add(expRewards) + + // contract balance be updated according to the transferred amount + contractFinalBalance := s.app.BankKeeper.GetBalance(s.ctx, contractAddr.Bytes(), s.bondDenom) + Expect(contractFinalBalance.Amount).To(Equal(expContractFinalBalance)) + + // delegator (and withdrawer) balance should be updated + finalBalance := s.app.BankKeeper.GetBalance(s.ctx, s.address.Bytes(), s.bondDenom) + Expect(finalBalance.Amount).To(Equal(expDelFinalBalance), "expected final balance to be greater than initial balance after claiming rewards") + }, + Entry("claim rewards with transfer to withdrawer before and after precompile call", testCase{ + before: true, + after: true, + }), + Entry("claim rewards with transfer to withdrawer before precompile call", testCase{ + before: true, + after: false, + }), + Entry("claim rewards with transfer to withdrawer after precompile call", testCase{ + before: false, + after: true, + }), + ) + }) }) Context("claimRewards with contract as delegator", func() { diff --git a/precompiles/distribution/tx.go b/precompiles/distribution/tx.go index 8fa3b297b7..d220c50c86 100644 --- a/precompiles/distribution/tx.go +++ b/precompiles/distribution/tx.go @@ -35,7 +35,7 @@ const ( ) // ClaimRewards claims the rewards accumulated by a delegator from multiple or all validators. -func (p Precompile) ClaimRewards( +func (p *Precompile) ClaimRewards( ctx sdk.Context, origin common.Address, contract *vm.Contract, From 052a94b94acbaf6b986d10ff103fd37e38fddfe8 Mon Sep 17 00:00:00 2001 From: stepit <48993133+0xstepit@users.noreply.github.com> Date: Fri, 19 Jul 2024 16:43:24 +0200 Subject: [PATCH 332/345] feat: custom operations (#2672) * add operation constructor * add feature to create a new operation * create wrapper struct. * add changelog entry * make changelog happy --- CHANGELOG.md | 1 + x/evm/core/vm/custom_eip.go | 77 ++++++++++++++++++++++++++ x/evm/core/vm/custom_eip_test.go | 94 ++++++++++++++++++++++++++++++++ 3 files changed, 172 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a89dadeccd..bbb8d32466 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -120,6 +120,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (app) [#2644](https://github.com/evmos/evmos/pull/2644) Split full chain configuration template into EVM and MemIAVL templates. - (ante) [#2648](https://github.com/evmos/evmos/pull/2648) Decouple EVM mono decorator utilities from concrete decorator implementation. - (contracts) [#2650](https://github.com/evmos/evmos/pull/2650) Adjust contract compilation util to include `abi.json` files. +- (evm) [#2672](https://github.com/evmos/evmos/pull/2672) Add setter for custom operations in the EVM. ## [v18.1.0](https://github.com/evmos/evmos/releases/tag/v18.1.0) - 2024-05-31 diff --git a/x/evm/core/vm/custom_eip.go b/x/evm/core/vm/custom_eip.go index ed2813f051..058ab75c17 100644 --- a/x/evm/core/vm/custom_eip.go +++ b/x/evm/core/vm/custom_eip.go @@ -6,10 +6,23 @@ package vm import ( "fmt" "sort" + "strings" "golang.org/x/exp/maps" ) +// OpCodeInfo contains information required to identify an EVM operation. +type OpCodeInfo struct { + Number OpCode + Name string +} + +// Operation is an utility struct that wraps the private type +// operation. +type Operation struct { + Op *operation +} + // ExtendActivators allows to merge the go ethereum activators map // with additional custom activators. func ExtendActivators(eips map[string]func(*JumpTable)) error { @@ -31,6 +44,30 @@ func ExtendActivators(eips map[string]func(*JumpTable)) error { return nil } +// ExtendOperations returns an instance of the new operation and register it in the list +// of available ones. +// Return an error if an operation with the same name is already present. +// This function is used to prevent the overwrite of an already existent operation. +func ExtendOperations( + opInfo OpCodeInfo, + execute executionFunc, + constantGas uint64, + dynamicGas gasFunc, + minStack int, + maxStack int, + memorySize memorySizeFunc, +) (*Operation, error) { + opName := strings.ToUpper(strings.TrimSpace(opInfo.Name)) + if err := extendOpCodeStringLists(opInfo.Number, opName); err != nil { + return nil, err + } + + operation := newOperation(execute, constantGas, dynamicGas, minStack, maxStack, memorySize) + op := &Operation{operation} + + return op, nil +} + // GetActivatorsEipNames returns the name of EIPs registered in // the activators map. // Used only in tests. @@ -41,6 +78,25 @@ func GetActivatorsEipNames() []string { return keys } +// newOperation returns an instance of a new EVM operation. +func newOperation( + execute executionFunc, + constantGas uint64, + dynamicGas gasFunc, + minStack int, + maxStack int, + memorySize memorySizeFunc, +) *operation { + return &operation{ + execute: execute, + constantGas: constantGas, + dynamicGas: dynamicGas, + minStack: minStack, + maxStack: maxStack, + memorySize: memorySize, + } +} + // GetConstantGas return the constant gas used by the operation. func (o *operation) GetConstantGas() uint64 { return o.constantGas @@ -75,3 +131,24 @@ func (o *operation) SetMaxStack(maxStack int) { func (o *operation) SetMemorySize(msf memorySizeFunc) { o.memorySize = msf } + +// extendOpCodeStringLists updates the lists mapping opcode number to the name +// and viceversa. Return an error if the key is already set. +// +// ASSUMPTION: no opcode is registered as an empty string. +func extendOpCodeStringLists(newOpCode OpCode, newOpName string) error { + opName := opCodeToString[newOpCode] + if opName != "" { + return fmt.Errorf("opcode %d already exists: %s", newOpCode, opName) + } + opNumber := stringToOp[newOpName] + // We need to check against the STOP opcode name because we have to discriminate + // between 0x00 of this opcode and the default value of an empty key. + stopName := opCodeToString[STOP] + if opNumber != 0x00 || newOpName == stopName { + return fmt.Errorf("opcode with name %s already exists", newOpName) + } + opCodeToString[newOpCode] = newOpName + stringToOp[newOpName] = newOpCode + return nil +} diff --git a/x/evm/core/vm/custom_eip_test.go b/x/evm/core/vm/custom_eip_test.go index e8a09906ac..c57d282c7b 100644 --- a/x/evm/core/vm/custom_eip_test.go +++ b/x/evm/core/vm/custom_eip_test.go @@ -147,3 +147,97 @@ func TestExtendActivators(t *testing.T) { tc.postCheck() } } + +func TestAddOperation(t *testing.T) { + // Functions used to create an operation. + customExecute := func(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + // no - op + return nil, nil + } + customDynamicGas := func(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { + // no-op + return 0, nil + } + customMemorySize := func(stack *Stack) (uint64, bool) { + // no-op + return 0, false + } + + const ( + EXISTENT OpCode = STOP + NEW OpCode = 0xf + ) + + testCases := []struct { + name string + opName string + opNumber OpCode + expPass bool + errContains string + postCheck func() + }{ + { + "fail - operation with same number already exists", + "TEST", + EXISTENT, + false, + "already exists", + func() { + name := EXISTENT.String() + require.Equal(t, "STOP", name) + }, + }, + { + "fail - operation with same name already exists", + "CREATE", + NEW, + false, + "already exists", + func() { + name := NEW.String() + require.Contains(t, name, "not defined") + }, + }, + { + "fail - operation with same name of STOP", + "STOP", + NEW, + false, + "already exists", + func() { + name := NEW.String() + require.Contains(t, name, "not defined") + }, + }, + { + "pass - new operation added to the list", + "TEST", + NEW, + true, + "", + func() { + name := NEW.String() + require.Equal(t, "TEST", name) + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + opInfo := OpCodeInfo{ + Number: tc.opNumber, + Name: tc.opName, + } + _, err := ExtendOperations(opInfo, customExecute, 0, customDynamicGas, 0, 0, customMemorySize) + + if tc.expPass { + require.NoError(t, err) + } else { + require.Error(t, err) + require.Contains(t, err.Error(), tc.errContains, "expected different error") + } + + tc.postCheck() + }) + } +} From f685a98dd24a2cd6fdfeeb02509cfe3372c20730 Mon Sep 17 00:00:00 2001 From: Ramiro Carlucho Date: Fri, 19 Jul 2024 12:45:26 -0300 Subject: [PATCH 333/345] reactivate static precompiles --- app/upgrades/v19/upgrades.go | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/app/upgrades/v19/upgrades.go b/app/upgrades/v19/upgrades.go index 38aa22e616..262e2392ce 100644 --- a/app/upgrades/v19/upgrades.go +++ b/app/upgrades/v19/upgrades.go @@ -19,14 +19,10 @@ import ( erc20keeper "github.com/evmos/evmos/v19/x/erc20/keeper" erc20types "github.com/evmos/evmos/v19/x/erc20/types" evmkeeper "github.com/evmos/evmos/v19/x/evm/keeper" + evmtypes "github.com/evmos/evmos/v19/x/evm/types" stakingkeeper "github.com/evmos/evmos/v19/x/staking/keeper" ) -const ( - StrideOutpostAddress = "0x0000000000000000000000000000000000000900" - OsmosisOutpostAddress = "0x0000000000000000000000000000000000000901" -) - var newExtraEIPs = []string{"evmos_0", "evmos_1", "evmos_2"} // CreateUpgradeHandler creates an SDK upgrade handler for v19 @@ -53,7 +49,7 @@ func CreateUpgradeHandler( } ctxCache, writeFn := ctx.CacheContext() - if err := RemoveOutpostsFromEvmParams(ctxCache, ek); err == nil { + if err := ReactivateStaticPrecompiles(ctxCache, ek); err == nil { writeFn() } else { logger.Error("error removing outposts", "error", err) @@ -74,6 +70,8 @@ func CreateUpgradeHandler( ctxCache, writeFn = ctx.CacheContext() if err = RunSTRv2Migration(ctxCache, logger, ak, bk, erc20k, ek, wevmosContract, bondDenom); err == nil { writeFn() + } else { + logger.Error("error running strv2 migration", "error", err) } ctxCache, writeFn = ctx.CacheContext() @@ -86,18 +84,12 @@ func CreateUpgradeHandler( } } -func RemoveOutpostsFromEvmParams(ctx sdk.Context, +// ReactivateStaticPrecompiles sets ActiveStaticPrecompiles param on the evm +func ReactivateStaticPrecompiles(ctx sdk.Context, evmKeeper *evmkeeper.Keeper, ) error { params := evmKeeper.GetParams(ctx) - newActivePrecompiles := make([]string, 0) - for _, precompile := range params.ActiveStaticPrecompiles { - if precompile != OsmosisOutpostAddress && - precompile != StrideOutpostAddress { - newActivePrecompiles = append(newActivePrecompiles, precompile) - } - } - params.ActiveStaticPrecompiles = newActivePrecompiles + params.ActiveStaticPrecompiles = evmtypes.DefaultStaticPrecompiles return evmKeeper.SetParams(ctx, params) } From 1a2ca87b66eeaad01ef275da286ae1b58a397b29 Mon Sep 17 00:00:00 2001 From: Ramiro Carlucho Date: Fri, 19 Jul 2024 13:08:03 -0300 Subject: [PATCH 334/345] add testnet wevmos contract change --- app/upgrades/v19/upgrades.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/app/upgrades/v19/upgrades.go b/app/upgrades/v19/upgrades.go index 262e2392ce..c862506247 100644 --- a/app/upgrades/v19/upgrades.go +++ b/app/upgrades/v19/upgrades.go @@ -80,6 +80,16 @@ func CreateUpgradeHandler( } else { logger.Error("error setting new extra EIPs", "error", err) } + + if utils.IsTestnet(ctx.ChainID()) { + ctxCache, writeFn = ctx.CacheContext() + if err := ReplaceTestnetWevmosContract(ctxCache, erc20k); err == nil { + writeFn() + } else { + logger.Error("error setting wevmos testnet contract", "error", err) + } + } + return migrationRes, err } } @@ -194,3 +204,9 @@ func EnableCustomEIPs(ctx sdk.Context, logger log.Logger, ek *evmkeeper.Keeper) params.ExtraEIPs = extraEIPs return ek.SetParams(ctx, params) } + +func ReplaceTestnetWevmosContract(ctx sdk.Context, erc erc20keeper.Keeper) error { + erc20params := erc.GetParams(ctx) + erc20params.NativePrecompiles = []string{erc20types.WEVMOSContractTestnet} + return erc.SetParams(ctx, erc20params) +} From 1c7074bf0bbc7d180b65b756f707cbb2aca3a1e9 Mon Sep 17 00:00:00 2001 From: Ramiro Carlucho Date: Fri, 19 Jul 2024 13:13:49 -0300 Subject: [PATCH 335/345] increase max precompile calls --- precompiles/staking/integration_test.go | 2 +- x/evm/types/call.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/precompiles/staking/integration_test.go b/precompiles/staking/integration_test.go index 809921fdb4..12830aafac 100644 --- a/precompiles/staking/integration_test.go +++ b/precompiles/staking/integration_test.go @@ -2249,7 +2249,7 @@ var _ = Describe("Calling staking precompile via Solidity", func() { PrivKey: s.privKey, MethodName: "run", Args: []interface{}{ - big.NewInt(7), s.validators[0].GetOperator().String(), + big.NewInt(21), s.validators[0].GetOperator().String(), }, GasPrice: gasPrice.BigInt(), } diff --git a/x/evm/types/call.go b/x/evm/types/call.go index 53fa089603..08ad89f961 100644 --- a/x/evm/types/call.go +++ b/x/evm/types/call.go @@ -14,4 +14,4 @@ const ( // MaxPrecompileCalls is the maximum number of precompile // calls within a transaction. We want to limit this because // for each precompile tx we're creating a cached context -const MaxPrecompileCalls uint8 = 7 +const MaxPrecompileCalls uint8 = 21 From cfce2b0ccdeeca04f3a227832ecf0af93acee4cd Mon Sep 17 00:00:00 2001 From: Ramiro Carlucho Date: Fri, 19 Jul 2024 13:18:11 -0300 Subject: [PATCH 336/345] update base fee --- app/app.go | 1 + app/upgrades/v19/upgrades.go | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/app/app.go b/app/app.go index d874619b6b..4f5ac245e8 100644 --- a/app/app.go +++ b/app/app.go @@ -1165,6 +1165,7 @@ func (app *Evmos) setupUpgradeHandlers() { app.StakingKeeper, app.Erc20Keeper, app.EvmKeeper, + app.FeeMarketKeeper, ), ) diff --git a/app/upgrades/v19/upgrades.go b/app/upgrades/v19/upgrades.go index c862506247..07757e4c01 100644 --- a/app/upgrades/v19/upgrades.go +++ b/app/upgrades/v19/upgrades.go @@ -7,6 +7,7 @@ import ( "slices" errorsmod "cosmossdk.io/errors" + "cosmossdk.io/math" "github.com/cometbft/cometbft/libs/log" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" @@ -20,6 +21,7 @@ import ( erc20types "github.com/evmos/evmos/v19/x/erc20/types" evmkeeper "github.com/evmos/evmos/v19/x/evm/keeper" evmtypes "github.com/evmos/evmos/v19/x/evm/types" + feemarketkeeper "github.com/evmos/evmos/v19/x/feemarket/keeper" stakingkeeper "github.com/evmos/evmos/v19/x/staking/keeper" ) @@ -34,6 +36,7 @@ func CreateUpgradeHandler( sk stakingkeeper.Keeper, erc20k erc20keeper.Keeper, ek *evmkeeper.Keeper, + fee feemarketkeeper.Keeper, ) upgradetypes.UpgradeHandler { return func(ctx sdk.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { logger := ctx.Logger().With("upgrade", UpgradeName) @@ -90,6 +93,13 @@ func CreateUpgradeHandler( } } + ctxCache, writeFn = ctx.CacheContext() + if err := UpdateBaseFee(ctxCache, fee); err == nil { + writeFn() + } else { + logger.Error("error setting new base fee", "error", err) + } + return migrationRes, err } } @@ -210,3 +220,9 @@ func ReplaceTestnetWevmosContract(ctx sdk.Context, erc erc20keeper.Keeper) error erc20params.NativePrecompiles = []string{erc20types.WEVMOSContractTestnet} return erc.SetParams(ctx, erc20params) } + +func UpdateBaseFee(ctx sdk.Context, fee feemarketkeeper.Keeper) error { + feeparams := fee.GetParams(ctx) + feeparams.BaseFee = feeparams.BaseFee.Mul(math.NewInt(100)) + return fee.SetParams(ctx, feeparams) +} From 18ba98582c2098a32d0be9aeb88f68686ae8f269 Mon Sep 17 00:00:00 2001 From: stepit <48993133+0xstepit@users.noreply.github.com> Date: Mon, 22 Jul 2024 17:28:39 +0200 Subject: [PATCH 337/345] remove eip 0001, 0002 and base fee from migration (#2685) * remove eip 0001, 0002 and base fee from migration * fix * fix upgrade --- app/app.go | 1 - app/upgrades/v19/upgrades.go | 18 +----------------- app/upgrades/v19/upgrades_test.go | 6 +++--- 3 files changed, 4 insertions(+), 21 deletions(-) diff --git a/app/app.go b/app/app.go index 4f5ac245e8..d874619b6b 100644 --- a/app/app.go +++ b/app/app.go @@ -1165,7 +1165,6 @@ func (app *Evmos) setupUpgradeHandlers() { app.StakingKeeper, app.Erc20Keeper, app.EvmKeeper, - app.FeeMarketKeeper, ), ) diff --git a/app/upgrades/v19/upgrades.go b/app/upgrades/v19/upgrades.go index 07757e4c01..dc75daeaaf 100644 --- a/app/upgrades/v19/upgrades.go +++ b/app/upgrades/v19/upgrades.go @@ -7,7 +7,6 @@ import ( "slices" errorsmod "cosmossdk.io/errors" - "cosmossdk.io/math" "github.com/cometbft/cometbft/libs/log" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" @@ -21,11 +20,10 @@ import ( erc20types "github.com/evmos/evmos/v19/x/erc20/types" evmkeeper "github.com/evmos/evmos/v19/x/evm/keeper" evmtypes "github.com/evmos/evmos/v19/x/evm/types" - feemarketkeeper "github.com/evmos/evmos/v19/x/feemarket/keeper" stakingkeeper "github.com/evmos/evmos/v19/x/staking/keeper" ) -var newExtraEIPs = []string{"evmos_0", "evmos_1", "evmos_2"} +var newExtraEIPs = []string{"evmos_0"} // CreateUpgradeHandler creates an SDK upgrade handler for v19 func CreateUpgradeHandler( @@ -36,7 +34,6 @@ func CreateUpgradeHandler( sk stakingkeeper.Keeper, erc20k erc20keeper.Keeper, ek *evmkeeper.Keeper, - fee feemarketkeeper.Keeper, ) upgradetypes.UpgradeHandler { return func(ctx sdk.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { logger := ctx.Logger().With("upgrade", UpgradeName) @@ -93,13 +90,6 @@ func CreateUpgradeHandler( } } - ctxCache, writeFn = ctx.CacheContext() - if err := UpdateBaseFee(ctxCache, fee); err == nil { - writeFn() - } else { - logger.Error("error setting new base fee", "error", err) - } - return migrationRes, err } } @@ -220,9 +210,3 @@ func ReplaceTestnetWevmosContract(ctx sdk.Context, erc erc20keeper.Keeper) error erc20params.NativePrecompiles = []string{erc20types.WEVMOSContractTestnet} return erc.SetParams(ctx, erc20params) } - -func UpdateBaseFee(ctx sdk.Context, fee feemarketkeeper.Keeper) error { - feeparams := fee.GetParams(ctx) - feeparams.BaseFee = feeparams.BaseFee.Mul(math.NewInt(100)) - return fee.SetParams(ctx, feeparams) -} diff --git a/app/upgrades/v19/upgrades_test.go b/app/upgrades/v19/upgrades_test.go index 2004ed02a8..5af2351990 100644 --- a/app/upgrades/v19/upgrades_test.go +++ b/app/upgrades/v19/upgrades_test.go @@ -9,7 +9,7 @@ import ( ) func TestEnableCustomEIPs(t *testing.T) { - upgradeEIPs := []string{"evmos_0", "evmos_1", "evmos_2"} + upgradeEIPs := []string{"evmos_0"} testCases := []struct { name string @@ -19,12 +19,12 @@ func TestEnableCustomEIPs(t *testing.T) { { name: "repeated EIP - skip", activeEIPs: []string{"evmos_0"}, - expEIPsNum: 3, + expEIPsNum: 1, }, { name: "all new EIP", activeEIPs: []string{"ethereum_3855"}, - expEIPsNum: 4, + expEIPsNum: 2, }, } From dc76d5db7f95905225bede34614e350971ed1490 Mon Sep 17 00:00:00 2001 From: Ramiro Carlucho Date: Mon, 22 Jul 2024 12:31:40 -0300 Subject: [PATCH 338/345] increase max precompile calls --- precompiles/staking/integration_test.go | 2 +- x/evm/types/call.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/precompiles/staking/integration_test.go b/precompiles/staking/integration_test.go index 12830aafac..ab4e0a711d 100644 --- a/precompiles/staking/integration_test.go +++ b/precompiles/staking/integration_test.go @@ -2249,7 +2249,7 @@ var _ = Describe("Calling staking precompile via Solidity", func() { PrivKey: s.privKey, MethodName: "run", Args: []interface{}{ - big.NewInt(21), s.validators[0].GetOperator().String(), + big.NewInt(100), s.validators[0].GetOperator().String(), }, GasPrice: gasPrice.BigInt(), } diff --git a/x/evm/types/call.go b/x/evm/types/call.go index 08ad89f961..71ca8be8ee 100644 --- a/x/evm/types/call.go +++ b/x/evm/types/call.go @@ -14,4 +14,4 @@ const ( // MaxPrecompileCalls is the maximum number of precompile // calls within a transaction. We want to limit this because // for each precompile tx we're creating a cached context -const MaxPrecompileCalls uint8 = 21 +const MaxPrecompileCalls uint8 = 100 From 15a690527c95936803be0325d5c84497ab11a24d Mon Sep 17 00:00:00 2001 From: Ramiro Carlucho Date: Tue, 23 Jul 2024 12:23:11 -0300 Subject: [PATCH 339/345] chore: v19 changelog update (#2689) * changelog update * fix --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aab0882a7a..c4b4b3869c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,7 +35,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ # Changelog -## Unreleased +## [v19.0.0] - 2024-07-23 ### State Machine Breaking From a90d33d86b323bb786605bc8489e5b77e5cb811b Mon Sep 17 00:00:00 2001 From: Guillermo Paoletti Date: Tue, 23 Jul 2024 18:21:41 +0200 Subject: [PATCH 340/345] fix: update goreleaser flags (#2690) fix: goreleaser ci --- .github/workflows/go-releaser-dry-run.yml | 25 +++++++++++++++++++++++ Makefile | 6 +++--- 2 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/go-releaser-dry-run.yml diff --git a/.github/workflows/go-releaser-dry-run.yml b/.github/workflows/go-releaser-dry-run.yml new file mode 100644 index 0000000000..fe44542246 --- /dev/null +++ b/.github/workflows/go-releaser-dry-run.yml @@ -0,0 +1,25 @@ +name: goreleaser-dry-run + +on: + pull_request: + branches: + - main + - release/** + +permissions: read-all + +jobs: + goreleaser: + runs-on: ubuntu-latest + environment: release + steps: + - uses: actions/checkout@v4 + with: + submodules: true + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version: "1.22" + check-latest: true + - name: release dry run + run: make release-dry-run diff --git a/Makefile b/Makefile index 02a644f26c..c5c9537b35 100644 --- a/Makefile +++ b/Makefile @@ -467,7 +467,7 @@ proto-format: proto-lint: @echo "Linting Protobuf files" - @$(protoImage) buf lint --error-format=json + @$(protoImage) buf lint --error-format=json @$(protoLinter) lint ./proto proto-check-breaking: @@ -541,7 +541,7 @@ release-dry-run: -v ${GOPATH}/pkg:/go/pkg \ -w /go/src/$(PACKAGE_NAME) \ ghcr.io/goreleaser/goreleaser-cross:${GOLANG_CROSS_VERSION} \ - --clean --skip-validate --skip-publish --snapshot + --clean --skip validate --skip publish --snapshot release: @if [ ! -f ".release-env" ]; then \ @@ -557,7 +557,7 @@ release: -v `pwd`:/go/src/$(PACKAGE_NAME) \ -w /go/src/$(PACKAGE_NAME) \ ghcr.io/goreleaser/goreleaser-cross:${GOLANG_CROSS_VERSION} \ - release --clean --skip-validate + release --clean --skip validate .PHONY: release-dry-run release From d96eaea9abfd08980cb57a5b5692b400580db7c6 Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Tue, 23 Jul 2024 13:32:52 -0300 Subject: [PATCH 341/345] update docker dep (#2691) Co-authored-by: Ramiro Carlucho --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index f3de4a83e5..35ddcbbe75 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,7 +7,7 @@ WORKDIR /go/src/github.com/evmos/evmos COPY go.mod go.sum ./ -RUN set -eux; apk add --no-cache ca-certificates=20240226-r0 build-base=0.5-r3 git=2.45.2-r0 linux-headers=6.6-r0 bash=5.2.26-r0 +RUN set -eux; apk add --no-cache ca-certificates=20240705-r0 build-base=0.5-r3 git=2.45.2-r0 linux-headers=6.6-r0 bash=5.2.26-r0 RUN --mount=type=bind,target=. --mount=type=secret,id=GITHUB_TOKEN \ git config --global url."https://$(cat /run/secrets/GITHUB_TOKEN)@github.com/".insteadOf "https://github.com/"; \ From 6e53124887ae15efb4c33320349f85cabd679e88 Mon Sep 17 00:00:00 2001 From: Ramiro Carlucho Date: Tue, 23 Jul 2024 16:51:55 -0300 Subject: [PATCH 342/345] chore: add write permission to goreleaser (#2694) add write permission to goreleaser --- .github/workflows/go-releaser.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/go-releaser.yml b/.github/workflows/go-releaser.yml index 500f09a729..d6878e5fc8 100644 --- a/.github/workflows/go-releaser.yml +++ b/.github/workflows/go-releaser.yml @@ -10,6 +10,8 @@ jobs: goreleaser: runs-on: ubuntu-latest environment: release + permissions: + contents: write steps: - uses: actions/checkout@v4 with: From 649dec15fdb97faf09382308964abd6c88f09b1c Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 24 Jul 2024 16:00:57 +0000 Subject: [PATCH 343/345] fix(erc20): validation considering EIP-55 (backport #2696) (#2697) fix(erc20): validation considering EIP-55 (#2696) * fix(erc20): validation considering EIP-55 * add changelog entry * fix chlog * update var name (cherry picked from commit a50a548506535ce44fbfc661522695bb9a72b580) Co-authored-by: Tom <54514587+GAtom22@users.noreply.github.com> --- CHANGELOG.md | 1 + x/erc20/keeper/precompiles.go | 5 +- x/erc20/types/params.go | 62 ++++++++++++---- x/erc20/types/params_test.go | 132 ++++++++++++++++++++++++++++++++++ 4 files changed, 182 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c4b4b3869c..e86d303e2a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -67,6 +67,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (evm) [#2679](https://github.com/evmos/evmos/pull/2679) Reverted PR #2633. Use `EthAccount` type instead of `BaseAccount`. - (distribution-precompile) [#2682](https://github.com/evmos/evmos/pull/2682) Fix `claimRewards` bug and add new test cases. - (evm) [#2667](https://github.com/evmos/evmos/pull/2667) Modify activator maps and default extra EIP to use []string. +- (erc20) [#2696](https://github.com/evmos/evmos/pull/2696) Consider EIP-55 in dynamic and native precompiles validations. ### Bug Fixes diff --git a/x/erc20/keeper/precompiles.go b/x/erc20/keeper/precompiles.go index e9b4c550c3..969c5b0d36 100644 --- a/x/erc20/keeper/precompiles.go +++ b/x/erc20/keeper/precompiles.go @@ -5,7 +5,6 @@ package keeper import ( "fmt" - "slices" errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" @@ -50,6 +49,6 @@ func (k Keeper) InstantiateERC20Precompile(ctx sdk.Context, contractAddr common. // IsAvailableDynamicPrecompile returns true if the given precompile address is contained in the // EVM keeper's available dynamic precompiles precompiles params. func (k Keeper) IsAvailableERC20Precompile(params *types.Params, address common.Address) bool { - return slices.Contains(params.NativePrecompiles, address.Hex()) || - slices.Contains(params.DynamicPrecompiles, address.Hex()) + return params.IsNativePrecompile(address) || + params.IsDynamicPrecompile(address) } diff --git a/x/erc20/types/params.go b/x/erc20/types/params.go index 0598073b55..0e79ff4852 100644 --- a/x/erc20/types/params.go +++ b/x/erc20/types/params.go @@ -4,9 +4,11 @@ package types import ( + "bytes" "fmt" "slices" + "github.com/ethereum/go-ethereum/common" "github.com/evmos/evmos/v19/types" ) @@ -66,53 +68,83 @@ func (p Params) Validate() error { return err } - if err := ValidatePrecompiles(p.NativePrecompiles); err != nil { + npAddrs, err := ValidatePrecompiles(p.NativePrecompiles) + if err != nil { return err } - if err := ValidatePrecompiles(p.DynamicPrecompiles); err != nil { + dpAddrs, err := ValidatePrecompiles(p.DynamicPrecompiles) + if err != nil { return err } - combined := p.DynamicPrecompiles - combined = append(combined, p.NativePrecompiles...) - return ValidatePrecompilesUniqueness(combined) + combined := dpAddrs + combined = append(combined, npAddrs...) + return validatePrecompilesUniqueness(combined) } // ValidatePrecompiles checks if the precompile addresses are valid and unique. -func ValidatePrecompiles(i interface{}) error { +func ValidatePrecompiles(i interface{}) ([]common.Address, error) { precompiles, ok := i.([]string) if !ok { - return fmt.Errorf("invalid precompile slice type: %T", i) + return nil, fmt.Errorf("invalid precompile slice type: %T", i) } + precAddrs := make([]common.Address, 0, len(precompiles)) for _, precompile := range precompiles { - if err := types.ValidateAddress(precompile); err != nil { - return fmt.Errorf("invalid precompile %s", precompile) + err := types.ValidateAddress(precompile) + if err != nil { + return nil, fmt.Errorf("invalid precompile %s", precompile) } + precAddrs = append(precAddrs, common.HexToAddress(precompile)) } // NOTE: Check that the precompiles are sorted. This is required // to ensure determinism if !slices.IsSorted(precompiles) { - return fmt.Errorf("precompiles need to be sorted: %s", precompiles) + return nil, fmt.Errorf("precompiles need to be sorted: %s", precompiles) } - return nil + return precAddrs, nil } -func ValidatePrecompilesUniqueness(i interface{}) error { - precompiles, ok := i.([]string) +func validatePrecompilesUniqueness(i interface{}) error { + precompiles, ok := i.([]common.Address) if !ok { return fmt.Errorf("invalid precompile slice type: %T", i) } seenPrecompiles := make(map[string]struct{}) for _, precompile := range precompiles { - if _, ok := seenPrecompiles[precompile]; ok { + // use address.Hex() to make sure all addresses are using EIP-55 + if _, ok := seenPrecompiles[precompile.Hex()]; ok { return fmt.Errorf("duplicate precompile %s", precompile) } - seenPrecompiles[precompile] = struct{}{} + seenPrecompiles[precompile.Hex()] = struct{}{} } return nil } + +// IsNativePrecompile checks if the provided address is within the native precompiles +func (p Params) IsNativePrecompile(addr common.Address) bool { + return isAddrIncluded(addr, p.NativePrecompiles) +} + +// IsDynamicPrecompile checks if the provided address is within the dynamic precompiles +func (p Params) IsDynamicPrecompile(addr common.Address) bool { + return isAddrIncluded(addr, p.DynamicPrecompiles) +} + +// isAddrIncluded checks if the provided common.Address is within a slice +// of hex string addresses +func isAddrIncluded(addr common.Address, strAddrs []string) bool { + for _, sa := range strAddrs { + // check address bytes instead of the string due to possible differences + // on the address string related to EIP-55 + cmnAddr := common.HexToAddress(sa) + if bytes.Equal(addr.Bytes(), cmnAddr.Bytes()) { + return true + } + } + return false +} diff --git a/x/erc20/types/params_test.go b/x/erc20/types/params_test.go index e53aa775c5..b1e83f3630 100644 --- a/x/erc20/types/params_test.go +++ b/x/erc20/types/params_test.go @@ -1,9 +1,12 @@ package types_test import ( + "slices" "testing" + "github.com/ethereum/go-ethereum/common" "github.com/evmos/evmos/v19/x/erc20/types" + "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" ) @@ -110,6 +113,14 @@ func (suite *ParamsTestSuite) TestParamsValidate() { true, "duplicate precompile", }, + { + "repeated address - one EIP-55 other not", + func() types.Params { + return types.NewParams(true, []string{}, []string{"0xcc491f589b45d4a3c679016195b3fb87d7848210", "0xcc491f589B45d4a3C679016195B3FB87D7848210"}) + }, + true, + "duplicate precompile", + }, { "unsorted addresses", func() types.Params { @@ -135,7 +146,128 @@ func (suite *ParamsTestSuite) TestParamsValidate() { } } +func (suite *ParamsTestSuite) TestIsNativePrecompile() { + testCases := []struct { + name string + malleate func() types.Params + addr common.Address + expRes bool + }{ + { + "default", + types.DefaultParams, + common.HexToAddress(types.WEVMOSContractMainnet), + true, + }, + { + "not native precompile", + func() types.Params { return types.NewParams(true, nil, nil) }, + common.HexToAddress(types.WEVMOSContractMainnet), + false, + }, + { + "EIP-55 address - is native precompile", + func() types.Params { + return types.NewParams(true, []string{"0xcc491f589B45d4a3C679016195B3FB87D7848210"}, nil) + }, + common.HexToAddress(types.WEVMOSContractTestnet), + true, + }, + { + "NOT EIP-55 address - is native precompile", + func() types.Params { + return types.NewParams(true, []string{"0xcc491f589b45d4a3c679016195b3fb87d7848210"}, nil) + }, + common.HexToAddress(types.WEVMOSContractTestnet), + true, + }, + } + + for _, tc := range testCases { + p := tc.malleate() + suite.Require().Equal(tc.expRes, p.IsNativePrecompile(tc.addr), tc.name) + } +} + +func (suite *ParamsTestSuite) TestIsDynamicPrecompile() { + testCases := []struct { + name string + malleate func() types.Params + addr common.Address + expRes bool + }{ + { + "default - not dynamic precompile", + types.DefaultParams, + common.HexToAddress(types.WEVMOSContractMainnet), + false, + }, + { + "no dynamic precompiles", + func() types.Params { return types.NewParams(true, nil, nil) }, + common.HexToAddress(types.WEVMOSContractMainnet), + false, + }, + { + "EIP-55 address - is dynamic precompile", + func() types.Params { + return types.NewParams(true, nil, []string{"0xcc491f589B45d4a3C679016195B3FB87D7848210"}) + }, + common.HexToAddress(types.WEVMOSContractTestnet), + true, + }, + { + "NOT EIP-55 address - is dynamic precompile", + func() types.Params { + return types.NewParams(true, nil, []string{"0xcc491f589b45d4a3c679016195b3fb87d7848210"}) + }, + common.HexToAddress(types.WEVMOSContractTestnet), + true, + }, + } + + for _, tc := range testCases { + p := tc.malleate() + suite.Require().Equal(tc.expRes, p.IsDynamicPrecompile(tc.addr), tc.name) + } +} + func (suite *ParamsTestSuite) TestParamsValidatePriv() { suite.Require().Error(types.ValidateBool(1)) suite.Require().NoError(types.ValidateBool(true)) } + +func TestValidatePrecompiles(t *testing.T) { + testCases := []struct { + name string + precompiles []string + expError bool + errContains string + }{ + { + "invalid precompile address", + []string{"0xct491f589b45d4a3c679016195b3fb87d7848210", "0xcc491f589B45d4a3C679016195B3FB87D7848210"}, + true, + "invalid precompile", + }, + { + "same address but one EIP-55 and other don't", + []string{"0xcc491f589b45d4a3c679016195b3fb87d7848210", "0xcc491f589B45d4a3C679016195B3FB87D7848210"}, + false, + "", + }, + } + for _, tc := range testCases { + + slices.Sort(tc.precompiles) + addrs, err := types.ValidatePrecompiles(tc.precompiles) + + if tc.expError { + require.Error(t, err, tc.name) + require.ErrorContains(t, err, tc.errContains) + } else { + require.NoError(t, err, tc.name) + require.Equal(t, len(tc.precompiles), len(addrs), tc.name) + } + } +} From 98c3840e07ec627f1287d5365f7030c3620be464 Mon Sep 17 00:00:00 2001 From: hanchon Date: Wed, 24 Jul 2024 22:03:39 +0200 Subject: [PATCH 344/345] chore: update curl version dockerfile --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 35ddcbbe75..9b6e695a0c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -41,7 +41,7 @@ COPY --from=build-env /target/usr/lib /usr/lib COPY --from=build-env /target/usr/local/lib /usr/local/lib COPY --from=build-env /target/usr/include /usr/include -RUN apk add --no-cache ca-certificates=20240705-r0 jq=1.7.1-r0 curl=8.8.0-r0 bash=5.2.26-r0 vim=9.1.0414-r0 lz4=1.9.4-r5 rclone=1.66.0-r4 \ +RUN apk add --no-cache ca-certificates=20240705-r0 jq=1.7.1-r0 curl=8.9.0-r0 bash=5.2.26-r0 vim=9.1.0414-r0 lz4=1.9.4-r5 rclone=1.66.0-r4 \ && addgroup -g 1000 evmos \ && adduser -S -h /home/evmos -D evmos -u 1000 -G evmos From 2228348af5c66c2085156e135e727084599b0a3c Mon Sep 17 00:00:00 2001 From: Ramiro Carlucho Date: Wed, 24 Jul 2024 17:40:34 -0300 Subject: [PATCH 345/345] fix: add missing wallets (#2698) add missing wallets --- app/upgrades/v19/fixes/missingWallets.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/upgrades/v19/fixes/missingWallets.go b/app/upgrades/v19/fixes/missingWallets.go index 55466ee4b6..1933de1f77 100644 --- a/app/upgrades/v19/fixes/missingWallets.go +++ b/app/upgrades/v19/fixes/missingWallets.go @@ -8369,5 +8369,7 @@ func GetAllMissingWallets() []string { "0x2f0c42b79f96aba17b6087a89c993ae9a3c45524", "0x77f61a1adc61c11244c2f619c87745489b3c7c5b", "0x94ea90a94522b583b91746e8e39406a16503fa7b", + "0x6c554140eE0Ec09df91Fcf07685d7392A3B11E85", + "0x0817cfaa3a12d2c8c3b59187d4d92eccb22c523b", } }

8b#}hP5I$a0^ ze;=oG^Y_x^E_6yRBnNv}M`!RlhlV6A*{N%vC94T%Vsv%(NfjyERf_0{l>{=&CPei(crB@AjE1cc(~M z+NTB7HCqU@&0Xas)+oA4E^?S(ETVTu_!3BP(jC28PnNr**XsUEcSQ1ga!z(fcdGns zcl0`1eoj7KmE+Cl??c{%&deCnpUW4r(cL03`Bl&5EF2&q5mXMJq393udYM0pqCTxX z0XWyeLO(A)E%XI)6w%7re7so;{RHjS^vg?U+<=zo2u;m#IcjNY^eVo42tV;_xGHAz zMy}+d9qrJ4|KR9Wu1`_^O0Ivx{r7YIG|%tK4|M7I3;wI32I9(J&L!3oe%9<9mpk-T z^LaTVv2J~g|Re8!)c>*?~G57;o_-bB-3;3JV7ciK<5bFuN z$;wMzgbNJRC&C2=XlPtHkP1F!XRq61?AnhUAj6TJA6nnf@*L(x&+f>w@-NQl`~ljw zfSxNqu9&)kPhLQ~nnhD%PL*RkwuVvPWF<50N~G7#OjaRPD4(UXIKI+mWg2@`z#KE; zz2oaVH#23IURP6F%&e!2C`qPUM!n=w$LQV!_lF50WxK89I3|4^x%CVzQmWLsz7{|C zJqrJCYN7u%lw`&#E4e3_PI+>hn9q!`CYEk9eWG~JS;u?s$TIb7wvPAI=`!mfA7Y?9 zPqWnu>F91&2)goSZjSiQeX6GjiYx9O?bj!ijK;I9Ja}m~70yM3XSz$XkCA(KvoZ_0 zJHiu^QH19{I#e&r-d*hT!mO~3#QVHxM@-0W!hELYb_)Tp*z4~XtI_sG3cMfsjlJ22 z^NN4@o2p^>*S3a#L6+uU;HUXlmS%Ka#lJXzz-=;QEfWTBpg%oFmS=Q!P+mM*u`BT~ zZ!jI~2Gh^~_V0gk0567zDby7nrbzdihqWugJJ+s6K+7hpNIVRup?H{`88o&l04?6e zVFK?R56#DllG9>3MX^5bPF3I>;b~VrSFSdh#bM!|XTxtnGsnHhZt)wQ`#@-NJ zJrgRzv>HUAlYuX*c2H5N{EnJ@V9NAgkT_Nid$Ygjlz*fY8_?Zg?q*r`vRZp|d@#q^ zMQIAc(Z)#EDED@@cPXn4jsQkyp0-Sd%dKm*LDAp zfJr8lhBikK$7GjW6_S?4scfeXTdNnWol-T$I|y7fBa_7o0{$QrRhr z0L3y}yMh<6fW0?6<)Kn#Hp=)(d2)02$RHwsITVGRTH3Se=2 zrLe54DclOn?NV5-51`-%uV{i5=iD9fC`J2=i;r8`cCU}w^T47OqBctp4Th0F}VxN-25-N*n`?S&+S)6U>Fbc+W`Cr(= z;Jsr@AXf4l^`@AgP;RbosNY*{2;nYvBnRJ(T1wp!YhJQ%u`s>+g%y_!R_pxHYd*3I< zGfEOPwV>LnU^{ij{SI0G2^x`nYBQcqir+?lR{hI@@hnzcf>Em$zl98Km``1t+Q;ms zE5U$1K#&>MCM8VH`^Pr~`!PpTRGLUtzSk_(&2An#{T?8IKUVxb9`x5#LZoa2OtuD0 zw#vW(HWm(6I6Bgi@Zw`X4MO4YGg{TwHq^cw0%VGNP~X)0kJCDrcd2_~O3}oiQaQ9X zCp&5jyt-q}%!`fH*FTy@#ilGnD^#~1s}v4@ks1|7-;nqZcx*)jJO)XO$Ecn{_3@tI zKU=}3J#LX+`$|iW-VQi`Hj*e#3zDTwMLah$kn=mQ=L)4IM?Wg z-7IwDw$u$a%()x=_WNdo>NeqzvxN*VD%4tw_%pSht(IjZMA>Ks7HuL6idYngSb=eu zssx^psEHu78>wa zXaF|h2CQLb#in~j55;Y%6%IXiD?rJufC@+8l8SfNNy4^ZbTYEL#7lmeF8XC;5-)?R z8yKsE{z$utXbyW_LV$VX23wOB?Yc1KVS}=-g=cY8F=4Img92}&Al7RJz-DXgE$|K= zfP#kAD`vxPe-d1pB^ZgqCt=~bp6-pvJvK(KQb5u`gWE#<1>GKUq1SU<==3xf`mERt z#m<0Ln*asc7@>e6Otg4wAtFZg*5Ft7!+1CVRva4j@GA3fECmOc_ZHXt;iyI1n0@RJ z>_$t$9#dcg!^ng?I~Cl^UW$27E%2GVr*vhgk8m{_-rS&}3?QMQ{ULW%z7R%XU&!5>W&jC5 z6>2-Y)wUTq3VLI}MgmahT*PHdm->NoOJ3VsC!{qAAMcHO$W$R70D65kQ)KEBVKfC@ z#@V4BPjjKeFmm-XgP(KgriLe!q4UUOqo9l^1slqCQrAjNafEr#Z)X0I?HC%Hu|XQ! zo91D%w`xd{^841{OZ9TG{Y?|DLlY_E&QSErDOd_R%heEDTn8CrCS*>)RGSkps|_d6 zJ~+tj-r^>wwu?J2o3Sjr>0Yd8uQkUKA<#WKV2`(iw1q2^ z9-*%gcn1Wrs;L;T${2i$@HF;UYWw$$Mz;sd9^Gx`E`q6i2)okwjMyzcYOT zMf`-oaT6hdcL}x-#Og0+lGOo-kU?m@cV|UPN85YP=XV8j%0GHhGn!wQ`V1`c*!zs$UhlSo#6ZEN6UT z+#Gr7p$bL{oq45+%OFDu9=;N{7YH6J&U|pL%HtsLt@KCtsFr8?qg&Krt3_sJEaN0?;AzvrS*Xu)0ySqsbP*u<3}8lN8NDHimxI<+ zR{_0c;ngd4IvA$Y4u(Nwe5+r4|Afdm-yd0I036dklK|&rE#7AUdN$bv9@JxyWtF~!1jTfI~30GSs z_c7qsCF zuYJ1@>?LBrtv-;KOYONYAmB@C_oiqUm#%kZx?MBsCs=?+HxWcnvVy!h!pghllaxb@ zDrc+xc$=8MZcbC~>ZdFqyraaV15LM!90+VbQnA8XN=Mf0i_pDUw8CoHSiWdyZQvPftKn4wOepdfx0 zuOl}AtrmBp!svPjvP{?4vh1$wt6^-q?jltKu|Md1*opreHe=Xo|qDRJ_j3;B4RN{FFABicP4XgiKD zMl&v4U+NwdE-BVxv`3;e{rh13t17Ad($#%WZ)dPn&Zp;y3s@AF?X3TE*@B;u%aDO^nHv?lOpiFnxU7y)RL~5^YyZR-mQ{zW z0|iQ#-}(G?12mVX#dpi6x?Rz@>srLOxn;UlXzw~!wX;x5IHtQ%>p5J+D^%|a%%Fccy~!8 z#`SPbeBKF&^^}*3t+J!MC%k8TiAddni-g*uP0#_9EvBbipPEbn97WUB%cT~enwVX! zW>q0Hd9jb&CLIw7lu8H?vFr8pZUDVR037-L=3*y*-ZQ>=Vs58mZdqmO7aL02|7$|F zcW2o?=5|AQvA!v{jE3Gucu`dEIL)YZ2}7OMN;hl1e2h^!i?k9H;M&M z7rykkn73^NjYnIk_$=v+rU<}daIed#yx0gOji)6Wx0J*N54rHgbg{)uNEkvxhayy0 zeQEybfedK4-hDVh>W*P-ROgzKe_KopYEwJem?KYREprU~b;VS1gA}Old&UIy4(i+Y zjY)?-RSaU^{dDR4hwkmoN&qf5*ZShR+p~;(Vt+wy$!ypx_U zOnt1l=b`4U+;4H}hu_Mpx7JU-)%9EUqEc74dTZYRxN-8WzTfJn zw}6&9J8q?PmvFEKS4g}eQ+HuUvy0$2IAJ#kD&}5 zNo3z(mWv1rTIV8Kx6WJ9v9?M<$6^OPE^I@~xXc-Y zHtx-CL{XE!k7?H$t0tNlHqCDn{=tHc`RCT)zgyK#uh<%MqFIv*hpU98*y`3|;~m+~ z*Jm5~aPvVJ<;~R&WM0}1(etVJ@m9^;92c|oy4qmtt~Qu!AOzF2OF^23z4jg)CtgEn zW&t}!#>iutKw{}m2_jgo7O53TN{o1kcgkC;=)=Dv(zOc87KLLHX?!Ovk}_0r#x;^I*fIbi%uJX0VP-%1=*?_DPm1E=dv*N9(=wBxlpJBdn^N zb_54Xh$KALRILCg(n8u_T|mIYxI+=UusFS%AX^PAl!6l-=J4)E$J%|HmrwE{s$`~& zN@v~;?8yWHOOb3NQB`701fYeJ;<|xLeCa0o)rJ6GaqPaT3vV~XC^YR2?%+e;*nzpp9@Q8<;tF9Tz4`6}P z#Cabp=n093!~e!$?h6tq9(}BIRvKK(Q90GSN2f4r|Azl8W7zkoeFNS1@i_A56zJr9m&@}+y*TWOefNul2G}jE zBCWZ37;*l|_POwIJp(*>mhSOMAX^|Fio4WbmxFTniu4AGm65$dzoE~ATVwR@gY;dZ z9AUVI1ingRIv)e|aYrf=y9<~RctB`p*{)2Q5DUGakd|c2cmYPyc@PHG?{7p`G7m#=#!YGsX8bKDm^5lhFuw z)gg8KL4a7ocjow5$>sDc(^2)R?ZYm}0*PYYsSDV{7RvM4@V^#Zlw|G-v~~O!>zRdB zI?IUXt!62nS=#{2_o~^XJ=e=TBMct>!ZKh1y0)e<)&MOt2@9Dt*Y?(`sZo*KEL{e2 z%fa$1A8nawm~D@>?=jmRY2RbEJ>0%$xX0S}N1B^_;c;f+EcTKy6aWf?Ww2d{Gj|$; z?PzcK1JUg#g%uDt-W0f9z1;xL?GgiB<{5mTGI2U}{lvyj7w- z7ff7JB3`1cJ5@K&+HP6n1@S`BW2sS>d%3|C;azDA_F-1VMNuM<%1V?)N&oSgnK`1F z^TtEn5%qA&X+FAJ_m}c8haT>ZrR`91yoqnu3qeFC2Pr<$rWxCX1^1CZe7wvQXFPXwvV_5{7iqaO{O|P28N7Hx?+XYHx;dHF|0&W+NIoRXT{T8p zCcI3ZV!o;+4M1HPgaz#>{;H;UPqZ1i{W17^IF~ z*HqgtwOwxE8G%aT5=co-64Y*J&Xl_tQk318!0JQgF}F!TI@70aA2uDQmhFy177W+e&Un9v|iK57)%9w-yx*7JRhJ&10(17=0% zwDe1to{nAVI!7qHpXw$W5`YsCs=wjjdYZ*Kl|3_%Hl}AHKoPCb*pY=A5G0jY#qc{S zCqPkbv9h6&6Q)^r~(~Y5+Tsh=meiNopkz6^m`GM8{yr$5R!ML&cx)VZ8 z!WOa51k1NK>OluSrV6YV=h?Zj4u)-QfKIr z1l6%q*6;A3jk92YD{#te_+`)B%Cu%s^K+iQoMXnQ{=#%vR?mn_>1{lS$m}m^U#F-8 z-Z><>`R<&rX|VOmZ-0bW=pn0k{(GW7+>&0DYqF{9fBp$xT&G7GAXw78r~x)FenXmy z5lIli_-S4g3NBG>vkqve7g!pm74le4 z4|SFrQeoOc;bDJ$dh+Wh`TCf?E;}Gk_)x$HTkThGP#W`9dn5(msxO#7U2RO@?p15h z<5R+hcnwx$d=vwGYMRV>2KKUH2h~>D48RHL&h@*zhhP+fNPGSB!vJ5p4D%6!?&vg{ zu+IRjc-Rsj)I98jP0dgOF4^t{&{RJ*4`TxM0ASfv7pGu*Bxq`QoArg6f}Yg8%?cH1 zHJG+XtP2YNg4<#$rjm-)GN@E?tz0fRpqU)N17#CWJP|x`$dPF*%tDLpfz*&{2Esu) ztnzh2=Uxh^O60pYH>kh57-}cW1?e3@Qb`-F zc1rmN-(~HW9}!^<%1`LBnY1do^a=d^xpQ=Il?Ed#t~z8fPu!I!%VYue%7#STB%rPr@&-8SpLrNC6@|L<%&yAv`Q|x z1HceN>j!WiSFc3?p=*fK<{gu!&p( zr0SBBE&)S7pgSFAlon) z09*}@OEw_@TwStg00FqVKM)F|`K=6UoFTEMX$hqhRA2b3 zZ+z;DKl^)s{A+*Z6xUdjvhe6lg zoD*_KR`!gZIYJ?)>&e=Z$H^Y5##tZ(iy?A}C1zP$g6D-?N;&a2au=joL+B(#t0c7e zb}}XG1GY!jBC2-L>dt&+6|8Z_vXav=W+iwT*n}XwAh79h90n<_kB3lZ~}E`%y)z zc@L-SO)-Bnve05vqz`<+3$2};S~V+`eSy3U?8&Qog3g~Rt~#!o6?!jpWF5xJR2bPT39-yJE7zB|Ul{ka?8ba)?}Z&* z+KnMNF__WT?tuzI2{i)O${AMlgm3u6wSzU`nu4J#TvISK)!vtoSX+Ks$q4-FR2$Kv zk~gz!FdKD@ZoHE#F2AbgfV;&ZP=x3=7=^nkHF*V$+Nfc#!l?O<&?b~p!E2+?qrsLy zqm2!>q=pJ_)&&&Qiv~Ny>J%YsRk%Eho=T?DB93@jYo2tp-(~Z(?n?6{n_+uh`!}oF zouqE9+GXxuRy%mU7A}ppi>&uQs_2fq{w}bJAsaV2O=cB_Zz#52hTYo3#-VM+>=JUd;O|{}^0dR_=b@YRTlGZ8}Z()r9J-^nj5tYkC zXH**W8PtrHRU@AmiZhV`+PDiKzRQ~ATg}UVHkE?Ca|L^UeTrajVgN{7_jR!po}!aG z2M9F9<~5dJ17{o(E+hxvN*KC+3Rbvuyplomkk{gHSIZw$^k1L-pT7EdqJI_RAWxwd z;~69XNzo%M&x2G4I}pO607-}g)`C+5mssm0*358m?tZ#++UuB?|0+)ts!rX(l!zPek)BM3K*TYZ{0X9@-7yFuog4vLuGIuYIlBRL!=ih7G{6kdl0ZxCzJXFAOt7 zjzYUXFrO%ATSJuF?uKB;tOp3<7$STWH_n5l2Z}K8+KM^F>EyXsj`84{L^o=p|B}6N z!g#UD1th(4-KgKiON#2;m+IU{0Y!CYej{L?eZd+CNJh9 zz0qV{(EUCl!he9}cK!STFUIE|q>{5b4S~gDvcqM&vLahp{J(ZB@b}nXKGR*$5shN@ z#8cf*!^-+KzS|@Dz<7Ug_uHi^pd9nve$co)`Ma>BQF-o9mb2lvVe946847MJFH{Aw z;#IDM-`@y&jyT|u3N!>Rkff$xZVYb(d>AJB2r(W+;Qs={OY2D=Gvp5U#dI|zIQ26; z8$YK>;HYJm3yH0bIpMszpPSy7eVH!=9b6Sah?h*;yD3-LB#%gk!!bFp%Z%><#_TUB z=hcVPiJqcQcfbN79W%n=I#aP>kEd~{o{S0J#29g}KFuv#_K0Jk5F8%9(+m1>Q+D1v z?zp%9s#C&z6&I|J)L(fw6qlg7Kg|hyKNtE7ACvjeZ~mO0mOmf2yey@z@7??x0*XT5 zy!=Isb$|rNb7embTW>p$SOX|Y_#@wY7`?E&^0z-0} zes367kaTogxkSXh4h>SC7d@?WKG}3i@C+DsMfN@j!w<8{T0)ZAI8! zLQ*Exx~~qe4i;*>2AgXS9Ilpf!@=^?zgh!O@}oS=eS%?DE;cs~F=>U@8 zkcxF^o37^C?rkz%p@4CPUPMH8?nRAvKG|3}wB=d(J7(lf&}w1DH8kqsJMB1F_-W?! zBz{cUrz~)JT4qW(WaR`#V&Q5)K`AdivP@`sc^2w4u?sL^0DBR2O606%RmjWiggRmo&V@x{}2Du zAJ&eUK#vnl>ufBO?`Brz@BoImkr;6-gWcKK7rQOI1VF@f`8@8N?eQrt7Fe9$=K;yK z@x8?Q5jAd)B_y!}=-0N2Jk9#GKZP@!n~Dp|*8>xt1|@*!E?6wyo*TK_t)1WS$AjgC z-vx+>SRqLJSrJG~_oVT90XFzfvQ;Zay>tV;aPg7X0k2991 zlV<0<-mqr2t0UQvB&i%@VNX7^3rHQ3ZmAwElR%4s0`JNd%|Px_jNT3jkI=6>9pA&o%n+w)7qxRdNIevX zqCdg<3}e;)1k<`c=7vs=2_aV|czPV65XkN#zV8f12Ord1~f;hRalQJeU=FQ5);uy>W65C+zgRFAe??B` zs{~F8%;)ol0MS{~0+j3}`!E zW%#6+kUgT{iY9?swhO!EL7$jGGyC=`LwL|nwB|HC=$EZBfOXYG%RvdMdX-^`8ZTRA zkR0|(=&%aW*-!^|X#^{Tb409;gbDKkKb#)^fUZw!$(yffj=yV!D?xmr%OCmZaxC$Q z@7)x}(kY9+Q%w|9x$Kg53>G7!hLf##7(FFmkQtY#0SM`DtAuHx1m;)216;>?ca1(u zLt!Xn4m$iBI+4!KKIy1l(9ML*z%fN@$ykV=so`sYqr6e;G@|p+Jy%>WHNHE5*{n2ArpNmnjqw6>pufT@zx1 zcs*>$dUdWm%^Ta>ZRCtCQBTCGV`Pm{7Xsr-()qfBibPS9k|dAl_jWrjp5$kFLP5R} zZ34SsI=`If2daOE0GBf|kYc&>DN(RKqSq*1TB_a@pv&`K(|Le_bfwy*Y<`WScU9lopgy*GyU zN)Gh2giF=%tQxgwxI`NsEw+dnhEdZ}t_1@WC=wuGss(}u3{WIUvG4PpbM5`xzjJ;k zNlQ^2x2O5-z1LoQt-0o!YtFgmnrkk}K6fZN)`ooQ`A)tTlAlz0_X+@bQavvf4a+p` zX`gWbijg!MRyTBDv37u)dND$Kl~;9{Hx4LPrq{(1Az!9u>JBOUyfL(cDOwucMtEfk zp}b5qPdHvWo$SYSVW*p%zXVyN&Rd1KBb*NgGb5cZgZZJHFN00=wJL9;px#WF8 zLFKdanzcEcHma_z{6?pP`s(lr%X8RQRL!jOu%#TVrMR%h+!J|^4MQyyJ9ccuGlOLB zq_#l~HKfhXGNG{?*Y8a`!aN@7h#c+y?J$uD=YFqJl5_xJI9q>)iJq=MGdNGxpHB=Q z?C4F~+1+5a)YFU!m7P7BHuaEhkMF+J_Nff60ItwWn2oWk2%HWi9wxCr{B*edm0{xL z;k`^VT6@re=)FlzC)4ZI$<1)m^Gk|gAsCyVc?kY}%1=G``stv`#`V2K_4;4Y+>~t{ zOrr(?rcDH!;Xy0d08f=lT~`@sGM}}y*K$l{?6YbV{p)2#kTmNN40BvI=5bi?ESsEF z&}z~f;AQ-c%?`wXeLbslhAKHMc1gOC8k$;T6vBF}^(AJ2mXsP_E$OPbdws9vC6$$X zNsoI;T`NgrS0yok$F#F$0H_IM5#XBe-Oy{4=u|B2ZL`^bV2g)Pr$q=Iw4Pa)*)F8n zbm3?33NIe*Ty3am`fT>4jlCgh^0Y}5J~lUaP;-{zYzK6rqFNwIsE&XErnWr4bg(Lx zjZ9mnVCbyxNMYev=w-8`S`v{mzVqqQNSPo7G7xak0!U_4Dt$GHj~Gx9Zjk>FcvzWS zTY&#)6lZJ09gLsw-DF|l9nt+m{I~+QU&3ue*#8z1%zPOW&c3Nkuy_d96_b3E*q@h! zdBYPnr3;EOhTubQm_Ubwllxd38dU89v0t zCRrXu&@Jhpw3x1S2Hp{gdV@{K5LAKPCH7K}UV^)9%6~csjHNkoqvqwDh&>eyD-Rm6)d2{ zC|krfXHzm)NYN$P&PtYE*6jZjkG2PN*o}|8y&P7tUr&|etnj(2uhPuEm1zQT9~3Ol zEhW05q}XB3gru8C6U97YGd-=*GosK!9&EeyTZ&{uvj|(hhq|~yfHy*Wx0EUrdnn%a zF`F(lNVM959e_!Rv>~b8(OJiw4~>f`!91`~BdP?ZBbhXfDq)inP)4c*;UqqkK4cIF z@SH8ziL^)QKk?N`n@HFq93Io!lB&pOr329crq%+%YCLFjM_ZcG$}A(z_jJmlVyzI{ z8SBjZZPdb`e)&aeKal)|ZQ0|eiWOZn#c?esdlULdu7$M_*J4sQnP;WIZk`ZwaK=H+ z-CU}<>b1E3y-_9FdH@P1Yk)7JyQHas3vDyey%t@~kZvlY&wtlmGsAvDv1!LWC$p`+ zh9yml_qWy-*m~Cx2up@^9XA(uo@n8NE+o9t+S^1PtU+#@-L!AvF0EHuysJK_~GP16?kfhJ>xfnyKIiifv#{V*{dR8y0s8_Eg#|um{*G zgGh69sChGOq;+YJL4$g2!%*)6YYNDe2;Y%7JVnh|rQ-{}!~RE_7BN}E)UA#q(~6XK z!SKYSUaAgssHX>GF);Fo1?PKkB@0AT_N`m#d1S(f13-?>E3`ar{%Pn97!-b*9 ztZ{}S`^r${XdBtw_SAZhu3M*Qnd7={b9I{LW*B6Nu+1J70X%LlPt#-tvEvZ|!ku?O z-rHyln;I4!vzBcKr;1glli`S=#gvPX$W@RY;;@l2jNCQPQyIDIyQ-*NioS)7UyK*b zS#&HNSasSaAq40eDdKdkh&-I)X&C&Auv&-t@B|^YG`G5&@LHN&l`&ig6t0l0!8gtqTAh--;Ds_TSav9@=oi@7dmK@HqTp|bu^X{9Vw3!{jbogvnCLV?i7lP zSF*Yuwh|wavN{?N-CV3X1+pZ79BvSlLQqG=gzcg&@N`EEc}yg`7?E=yzRasV0(SkS zf2v*L-ZzAfv;%C^dIkxfcp%ur86IcqHjZ4#%)>1UUDQF@AIyP49z3%ARtZP}PMokf zwLST`={y^$QPSwUNQNdHn}Z(!UK_eBnkS)YSr^T<0}qk<#;LsN1}o84x@IC28Of7 z(%6GGu&n!tl(Pp!w>+X=Wk ziLx}V<5Ef&#_3rdbfTzyZcp~X1L=sQ&ywoFF?$M*X^906{0t+tTzYOv@e>d;<*`DI zS1^F+_2YbA3;wuKYIt5u{k!B#8tq@I#G?9-J#SW67k0_^?HB ztWv~_E#709qA-U~iy!+zu_cSV7>@is#dE>%7Ngp&+Kl@=Va^YV{pW|C`kxZ;bjNby z1fq)KM8tZKg=z1U?=89eLEC(0hu87y?&_FmmtGtbP4r%kH4~NNGPt-zmQ)ADx{$LI zTK2V~C7D_g9plc(%TKAbIE?jwF`G%U?E?6;=-mOegJNxzLY-n2MxNGD5KBvL20F=^ z+(ZQB_n>c?ks_ejq5K}Gr9hmdDC%lWSs?0aelRar{tQdu=o_HmM}C3%tK2b46($e! zi2p~V&)lnHQ|(>Kf}4!<-T$1X!&6vc_Ds>y1gXh9>%zfmW6~VOjq3Ze=YYJRXn@&qbUd){^`rP>28uX8f;hLzZ`}kXS3RVCIw)$q_3R# zom*b__7lJVndCfWz>@zz_u_O?&H>vPG?k`4~(J5|a!NdLYLsZ$T|Hs_`%@~oLQ zlV-EQbT*AkgaWxnA0^0E?fc&IwvQeE9uQTi$Ss)WV5W_`lwOTz?aPWmwEKVZF`^zTRX z-q%iBd&^BMLI$X?jBp_`4po<+SLb%-$Oo=caL{|Da zEO1cxjvaI1XLg31$kaSGZ&+XCH}-N4W6iZ$H-6KcEAkuG$1(x#6Pa@NKY$xu|6?^* zS%WR@f5;C#FPb;fD~)jbJ01{QQBcN4*jGNFANN0)Sr}}}X%(yj!C0;*feSG-S!tQ) z5o2!uPb|KK>OH?Si9vg`Fm+qW8UN~IH`1173Fi#f;aSPazzcfg*)x%((YKV%871|9jH zpV>(nY}K-!0KG;lnRNj`XZ;W3q*XM_%TatTdlS+K#qN2R_Bx`Hc?V2rz({$0ubFMH ziUg^HhGIZM3w)wU3;%3;nkx7hJx+(v=lJV+g?j!dbB6+Vv_^O}5Hi2@ffD+RT z0)EKCfND?IRdR8p0GY}qfTs|^h25=jQB2xeIWr0~Sy)oi*{4wwjM_>{WN)ruI`qfK zfI=`G`Xk*H!m`)xqTf6zlkRKtti3mXb++BdCAfk_WP##3B}=D@1ons@*{B#uVeRg) z_Ww~lS2B`A?weG;B}v1JIdKh~UA|MHe!2Op)EDboyNkxI8BZXfhYpiGAnce!J~u44rIN$Ks^4%(^*GnG2?iQ&a6l1ac-~s$>739!qvS zA6#^q$IMKqw!rf3Y{AwB&OBzSe~%2flMBVf0v!_)wr&;^1l7MwYc}wx7bYneVgo1L zKYVt!a&P)-_nMtR^PGU`%uMlomgvR}5*W*BLC!yLRqU8y0d+u7(voPAN=%P_j)NFr zl|@S!?+Avu(B_m;us-0wI>MMXaG`XI+r_8<4%$lNtYYR~8(6;jJKrcOjBYarWg+Oz)f;>Y=HLU>B z6N_b!7 zCsbB{48`(KHLw;XT7=HEI}`^CE%G%4$Mqz-QvDb1`#e{A0Ruq&f50kouCCd8{Z?R zBwon3UA`F^m{5zG@O#TAMOfu5$+x1)M`;bu1qT#{y44TGx~#xu2bu3iI@;Fk-wk6) z?Bz@oWgYzv&VgV6yX7|tVD#@%K4NpQtsrfv2pGT53A#dyt+4khv_L2jz+AK7CY6^@ zzQf{cr-qtoHUO(pq6zTf?PXlSAwigRAf`d12`JCRDi@=Prf6bvm*sStAg9s9q|t=( z8%<0CzND#&begCMQob>ouy1x%$dTS7n#c`DMyAW-NDcvx(+WQz?}M+?Hk~$lgns%1 zq>&~IaLDk%TbI0&mlZ>bAx6zv|Bs06r?}Njdbz^p8K63ZLOO!9jlL+NjiZ3!5^^Km z98kiOtR?CPnJ>l~_5xhG$2nKNI~@AU``wocY+MU%GM%E)9@H1Bw9%RP+LK5Jsc;DGyc_=epBziVrf`;vZ}kE~InfU~VaCPBr<3b@lbou{puv3t z89BKg(MCgUO?erql`%|9fYoGRw=IE8{B(AJUAA&TKfgldwqKZB#UqOg$WGjQRzW~N z%v}SwL4|48-S={L9ar2l8pJ>7zX|ndhMDb_WNj3^+&*h&C_LpJgNhsA;80buusT32?_*!oBvBX|F+nHHoOaGiE zx`tvjyka))rnFV&3Q^Ehv1Xf&$`aD1P_qpDDNKf3JGJ3dw3%sW&cw)u+^&IKK|8BUh=?xgowPhx_JBg3L{@lPF=eE16%&fbDt`xV)*>&stYHo`flJd2@lEusc>66x1d=gByQlmrwsGKt`}k7swgRaF}^~*fEHEOU_vor%isB7Vj-u33Es^J9EAyD zox^ieYSaXNr2P0vmYVPbJjlaQt6<7OF&i-p$lfslU!e(2=%3V0YB1NrfM&oc;O9CM zS7tsE0|A>%X)0`jljiPl3YVIE=PTKM{f^&z>nHP9B2%*PEa`sf&h?~z;m!x%k$Gxn z3IF)}3tvq=pUVR&^mS_?aOWX0VXJQDJd|KDt7v$x{!gUkwMf6kN0IBZs;t?HYOnnFOXwc9kgVT z$oS5ey6`y#`!eVn;u#QpK|=-1Rk^5UaV|7{R={^ZMK!I+YEq74iwB3GCy{c04bY;WHoD2R9k*qj?Yv z3Fr;*e8!M2sh;h|o!{JiW-_Xh-=PK!P2~>TD{Jo7-o|$76Pd}By0nd*(7yOKG7l`r zBz>gWvQX^%qSPDC7o`jg06KEE(?pc}Obx_k(0T6{P(`Ievk<`Q7s7$*lW*%NIn>Z)EY4 z-zqQ20*QZ3^5H#b^hmL_Vn9aWUb%XrYBL8`A zlOL~RuimaGW%C9Pm&2BlZfO}<8tSYj|IH)Xl*RtFj zv)BnB;!U3ASS`!p2n(ub9hP@1ON8a2SPD|A4$FyJDJNqVCJA*|&eXD;jah6%>JXOs zcMn^1B*LN~O|=$1R72hIm_@ovEz2z`Maw7<&&ilY3R74R1hy`$-Db5f_UT3Z;k zCb3D@v)rjdB^HMiDalgL@{6?w9*U)y1~TlAH`cPeGiHJR*GoC02EsyB(c=#N$jbCi zH_@{Kgo!>%n>p+dN)F_dpuU=txNy8Nz$Vv9eY?^#Z1oIRc!o_p@opne%pr0X z68Z<3^=X!!NPbEKP4igjbzZ`ckdJA|OvCNWNqHO}$pU^$f>bQWyv*ye9_q@uzmhDN ztT;C+G2ypNhX_-sqFYjN1-NBp7qc=?;<@(E2k1TzE3c$Yse@` zQiG(qPNRDfvJ@}Kk%hy1L>703EUu0$VohuU9TXoi1vOj@rk3ybhw0!k{eGhAcf;_4 z`rWV{F-(D2C|v);@(td)Gp1v6%@`pi z@keTJ^(fD%-8Z3x+r|)~X5N$|Cn1AM8&+x*F1kMOcC{30j1-OvFAeG-$wuKb303fYb2_Ng!hX6OAKtcnE51L4k<_)Cdh1vCcXS~+P;AbxBc3gF#JXDf z@yQHd4z0(XauHCn#cX?i0i{Sehl3&93cD$NbMrGv(KX{F-E1e#*~>`SWXgy_jDUH1g;|{uO0@RDMN}jW9O|CK~fA zE&(gZx=g&R$4X-{@uR>q-3`rQ{^qs4Zp_cJnabBCy^eUU5gy*lhdP$ux)yt(xA(aY zzb@n#=QjAKx}iPH-@djtF$VtYPz+=KE>1ba{8&Ue_SEoMhyQ)Q9Yx(?{)uaQ z?J?!cNhX#*(G63>{FB!b+|1?^CP7`yh~bbM8EC9WU*atBPNs^wox?ypNOY_(Ki6Si zkZ}%9IqVIK!eLO@D`jPY>DpKN;-RG}v}}r~lB)@y&ZJhtjI3KYd<@~6mf2gPPmqB1 zc!%>3TZ#v5op`G$dA$h6x=*X&p^l0+enjLK^`QvRg#J5(QAWJ%SPJ;T_|M3Ty_2wBr5q?w_!p-`zjsaIq`krQ|VmUmZ+ zQIKNV86F=8OYKY(cvsJOixDqp&uM(yaVrS`3u$Ds4YQc}-jSkP3Re>N7;}V6sSt*~ z6oac87z+xrsPJtfGJ)T$8sfE&t^Zr5JQi(;-S?+Sww<0!L3O4j^Hh&opo1(#iILV) zQx`<sZ2_s2z}Z4;a(@ zH8|ptYv^#qV*{6raQU7YP*7wx3V}$Qq9}T;h@SSz|`w9w~98q5m?Kg8%)A{Fg5~Mo9NigECBoE zTH#lLxfSUJXBeO9U7dYAH{EQ?;9+J^XCN&R04_QjZ)`15_p-?ayuepA529Ydqm}cv zpaB9wqwTgp(qdvV8P))eV#|mdAN=o7@`iAfON@r<3C9;FoLro6rc5Zo2Jq+wGNFD# za~?T!o%Se5(}cWXVY#e4h@v=nQVVH)2|PEO$nOE<3g^NvZlCjwn|unG%&@$|454Vx z1#|V%p_MXVY6+JYQ#4V>v1!ePZqNc&XE#6d|CH~<<6@T8wLP zJsbv@m?i~85kmrWY+eip?8slz>n|?L~wv zMlDoeeO_XBs0K*%J8Erm8BrVW4Yl#!P#f;8vt{q)aUXwcdFzxMUh z$A9@99}4VJ?f&RunW^C_Wyr_zH~s<6G96z3H7+d>zF#*_ewCkSem+RTBEk8e&R^t1 zU*_vx_^2+Zyx4leDczsdkA(BWNp8;hlZ12sS4ZUX1uW)|e1NZOyIZ^+CoB~@M%JI< zezC>;r|U3B>-|9T3Z8-@p^14K9uqQT=w)7hntRzn;gP(r6peGr5{=F$$JBEHbRW>? z&G06#D5B!G^@NNO?00j2ap>;H9-RLQUtbmue~F8ff&+SfWBEi&Ea9+H-K@F@-OomH zn&j3nK!LlL4i`@kxzwLGq@#!{S*3kp2-MKY89LBn8jk!O)vVOkBV=b9-mAw;^=Oj) zuk^S^kBhMS6}^}Y-?WP(V&54MamVPcq?Hgmkm(2IM9Yfr7I>C8lc5PW6i(X@MChE6tYgsjZ8g7;VNaPDTB-jyWGe_T9mD|cuALU&iW9gyd(@*&5GG=rRN z*Fi+>S9ZPp2p1NYuY=DN+bBLU z_YH2Z;sxab4L4h%#=`D4amQ4Ow7$Wl@x%;KVz;ugk7?TNi<@ReShJv(kQytE_OZ14 z;yP7ofYMZF1doW&SBB5%64xtioN}tNx+d!WPsfP0_T}S^SjXuKH)0WCpTQK?p2vuF z0se4QtY9MCq6_-8v&!1o4c3;?dCYHQBVzzp7~}hqzZC&YQJ<3)=5g*V z#WdEn9n=^{))hu(%SMHELNUvE z+Wp_1PQZy)i-vTPVdRy!jmo4tJe;agkcAIZ-4$fca6_>j6WmE&ZUQZ$AcdaRhgL_@ zeOG>7{5uz_dSS?e#vth+jAglwfK840;>dZvfRl~;;yhhv%K}T*X3p2yeyO}`nXm*0sZ zbvtWpV)JE1gt288v=f#Ut=mmI%3JG8t^QekSMd&4Q#Qthd(ot%VRD8n*Fx`&T(33~ z-T>hOD{rsn&cT$A<3>xnlDiE?)+~EQFt^VMs_qasI7uvHr5WoT@!Z9{*^z~EbLcOQ z!5{ly$qccP6{E|hBz`pQ9%%S{9>lo(qdCYYjngS>{Qy;1N>Yq*kHB{v2Ajjl?Qack zb*KM77K`vC^aaQP9)E$4k0I?24raOuo~=?X7l5?{%BNw!^8P7SpCwizB5V5|ZQ7Inx~w#A`3 z3J88;#Y@M}0Z36@xZA|sNkwk5BF&b@L;#|R9#WLQG9^2n9z)IlRz9#Z1cq~iTNhp` zQ{yNY_-VUUO4clg3}KsSE}P-=DhrXD3*PhgXw8CL*C5Qfa8jTyShB;E&tqh<5;2)J z?b9AA5O&kP{vD(7!i0IX(Rq~5QbBb(!HY4|z3*7b@}r+~J?)oi@{qY%^#vQfuW-tFrjQY-pC~rMOdEj5Q~JX=857XNYUru~-LD zfTquYB@+};cj$d1I$fKw@QtcD^_BGjXzsa4X{lwCJk8PIf`By$06y0fCs^U15O zx4g2QbFU=GbC`-2!n9k;mU~l*8aB9CR@oVgw+SQHEz3_YF+ESo|jN1ylN(0XrrbjDsGbKIdkp zC}T1x9x8a4+LEy1jrN;`jy6n~w?8C_h4f80y=k~&$)RkUG03_KZN{A#x>1xAXc|XK z(|n^#rHC4Hv-u#yw&iBYXxftC1sc+Gaeatlm@Nf zrlD=d$RcDtqJr^ln#U6WM9KVY6%Q~$hp5OlZOd(UGMmXshF?fMutQTY`2y>e5Tc4; zp^748LI*FF73QSZ&^k``K*VK}S|kEDgT5_K*m8+`FWccqWqcseXfj>qesp{X*wz3# zJRvG%?84Fvzs{n3;O5F5J`c{MtE0k%+f9c>?8XU;Il zyizG5XWI{Y2ke$efsYj*TZ)ho0ILt1v#Yn|1?fvmWBFmEG^oCqpgZo(XfZk({6+|Q5BA5+ukYhVIRAZ`jfU5LZrc`d;uz`aL;ZJDY_&8`SkRkK@ z#ZwH!gjnBlvyAIBN4Ne+216L~2!mv034@eA!N49Bs*M1^S_J@9ShGQj`(lIaLZ&5+ z{!djkv6WAwhM~;@GKakADx+0lT+V53x5zaeT|>gz_lvJ-PtQlWUcm=Bqh1uEJIz*P zIuYXfpM`yy)uQ{QG|h)&NuxsIL6kQ7CxO!-7JMq*6eo;yCX>7}wu@Q z)?*&?g`x%$TF4B2&q}r}i`%EBOKQ<^xNnZ?ZPAgUR3MbCemCU@N*}h}#Ifj)i4oB* z!Ejh3Mx;3*5LgrR>_oDnT7pWAmY*V8@4&eKl+k)?>V%2tZqj!QX~B=rjQXyrzJn2x zuDPbgl;uD>^&;`sV|C5gi;Q47|Dwie-l<(Z<@8b~8)ycqw6b^E$!@*N{%Gb@-Ph+? z?m7fq#|&TM;%WcjNdHQ7vj^8skQK*Kj{gSl@m+z^F}R)Jgl8$UesZ~$@@Der%QPO1 zO|#V3WcL|2ssr!W*v^}5JNpE!^G*ANjgOq<7&{(u%381#FYEZ+dlaOpZv~g##Z4s^ zfJshErZ$KOVr(w)i|P~5rr=6sLfi2zQlb*g`~kKqFOg=QxPLavzkePN6lNWjSDa*P zVc%2?Gc(FVeN?Z~jlMRgN^1+APHog=!hI3D_|3fgipBnuvPg*I%uu!uBX?Yfj+Zkz zAN>oI7W13D2$S<`r?ZJs|MgsgT%A2S*cU%(f}^9K8^#p$^n5bPo&}B zq|(s0Bng1|1XgyiM4LmF>qj<)h$UEy^{MZwwNh4!ycwTX1%rn>$QvzgyOXy?1^r=T zU=%Mx(-sqRn|J;esSgS!dIxWrg;V;{3+#47kHLu&j-J#mEn8qh2VB zO4p)%lWzl`lur3Rddb?RyI{ZOtDu4DdypX+?LqG3-bM0LB)m(wLg5-(!XslB2b3UI z+=740s|B)dSHoGwstm&k16AHCWFTeb4D!|rR5`p_Z9Wi2*c5Pv@vf;;D;`<7xW^)u~&pQz>~%^8D}(I+aye%4^G;ywl$ z2*RIQYupn~xKd*_Wmi*nOTnGc%J*~!EfF$)W+G%fphU=6fwWU$!i}U8BIMSPkj)T3 zB;?7Gkbi3|Aw#348J(AqW$+7%1}u7s3=Jw-j&sVZ*d-vepg}T2f;iQWxCHFhB%p-t zGJ@1(tO-((ab6%Lfu&V0SCXb54iMdU!ICs;ZAV4-mzQcpQQui2^ypntwhus4e^MXZ znadC-R0__!!CvSbg5qKyTDOm)2DO{5*<{lqbic#`O6W8xqeiz9b=K2I?^c`XwO(zI9UC^mv64OhTO$ZwImq7tpcB(QN1g8tCbE$QySi`{Hv8;dUwnp!>A?&@;*GM z94%;|4vmq(zeHbtsn(ZY`Zo6E7tnJxS&n;uAn(yBxl~Im1z%0G?c$C7&@=r)3^UF= zA}&q2C?_Doxozt!=ksV9KTOIYbA+KJn+a;q0b#BarhM8~;1hawATWa*Xf{t=8cu1? zW#EHLeMYy;i4BgcASl4OQr1~f|K@CaWtlS#)|?4>p~>U-2$)my$?wV`4D|PP8>z<_Z=u0y5I3 z>6h|e<3uArUpYiizyix|V+u`hl>6Z5EfX*Jpb|{&Hk< zN@&A&XlQ+@vB>hkO99z4%Y#L6Es(~X1+f89PUC!)T&~3Ut%e7Gfd$;}50CsJTlT&w z8+AM6M5w!Gw)N^kUol%4hW)#=#0ST0%lxPVWdlZUS(k`RvH?gGzC@cm33zC)WGHU* z@5@;T!oN3jt}U!&bC!|1h&yi^q8IA^6IM z@Wh8m&~bU_pz8=*b3>2tS2RFjYw6Y|de@*~F*aASWAWx*pR%!*V@@5uS;ZTLB3HUc zmhvxF*V1E?tfV!y^hT|mOKRzM%yX>y(ptLVBBozP`ps;CQ@!n4Ict?4W}cHuG!Pw_ z5}LYWpP#H|+^x}FuDjK`%XDWauPB;^cKUS`ByO6M+poN>SULN`+ZG0^iq*5v<+{39 zGrQ@wh2oOg0Z(g+OJ_H5y`;Eo_EJ*U&h~j)$)O7D72Tw7=jWej-=YJjbUS};#Vy1t zUC`&9eKCOo*Xo{p3ska+d%mXbtM)A{ENn}Xi1SXZjp~gO=M%N`dS6V|((8TEt)dyLS zQg_xrTG#geVH1S)&vYQ>)^}9z^lPoI_s+^%dcAj6)za&|v$~dE@0~TZ^m^}HQcJJ* z&ZV{Vdhc9TOCR>mWx}iV&ZWAu-nm3~);sJ}h`qB~ch)FS%Cu^K6TT`gUGb2HpT>FaCh>YJN2jV66VEnR(cGg3+E z&#tAbZ*E2{RQh+-(w&R3;!FDFwRGznxaxFRHG<2Pkq@mJ;X|thNP7Q^f9$!Q@a@8ud|1n>K(3 zLenlIN+*{QrNn8h5y_B2;DJ#~A2NtZMBlLbA%h^)Xf1unASTC%(l&T7QHo$}JN}6s z)OMjtSEK2vPv~m2Gu_eE+DztcY|}#Sw5QH>jx$wfO3K#x#J?zQ%Vez1g`{zQ7lAi1 zCpL>|Z8z)4M2gCHyriD8F-ObBlnE!x1i58}C-n3W(ytWL(4I{FigbPZM@qWZk_0>E zskyL2rEgq6gP)3mgij7Ba=E*FyMgSd&uT>*KEp*OWXy#8Go_BJTwgN&v8+1N=HDd$ zQWU0@Y<&Q11$5ZKJO6Ls&)`59IrwA@8O_ zz2fI3)FD--1M!&U$tGp?`KXlTFaXFhpQ*M)ZC^=l%AO7{e0g}$&Uh!dOK{yIS*~pcQlX_4rtp=y;WtVJF85F{01$R0Jn2qSxbC29w1bO?lSn9Tr}4 zj!xiIl9l%LI0nK%xv{6v+TsVpuS-5c$h#YRm)Ps2nz;@ZfGZjb*Oe$d@oA^(NGI>D zDc>9^-;@bQtL~Q+fv%WYir9u4kjw14#CCb@(wdp*P%PVL*CBcnQ54JhS5Q|33W zc3e-!)vzIl6CdR1?^G5`&Ea(Q#6S$^swZY&VV^qAa?+-7pn7VuUGH%9)C#R|qY-FTk3&sd5ZiNfKsWmkznkUBgMS}s81wYGwGc!l#5ZxbMq4Vr}G z8YrI^`Tx*NL%g1PShNM$o>>L`NRo!ff5H-gc&7Itsl%UPv1wAGI^LT8Im6^!4Nf&rY`?1t{N%y`^ceqDYUqGx+8M3>p@-7-O ziSyJKqw$<_gC3X7S%C(jeOaK)wrI$&lU`*1hESh~zUWM~Sac`n22qEtV-0spOoR_E z@t1tx>TCrk_c-CmlT>EhnO=aKm_>EanMwU6o`}Gf|K9_wO}p{x*CA%i!{&ePdf0US z@U5&#W{mBcVWK4Yq&Ac-hzf1T{CWU zPLoIV;50H0UV_iSFG;_Tk(drRf|O1591R)^YOuZav1szlNY@;v6V}@eBZ1?cZ@_YE!eReDOt~AvAtl&Uj!Bm+>KH;L zF1wpeFTCou!K&F8?z>A$g{-m)cR`k#@ocbqc2Iv0_sfb^%HcLQOm(wY?z;<*(qS2} zzL=++1+QLEzUMB=2k#>vOmg&d#doKIp^#o#6VfXyA?-8e!OFWhRQXbQxeftfnK@$u z&>u~OIZ|%1YGHQ6q8ed(SwYOL9m`>bARZTN^<9E6L-%hF~}tB7&$9@Wrx^urjqQR#uiEore}MrvmMd`(zcwJcVir3@DsAsGLkGFH~xH%qXxLCK3~<=JKN zPoGx4OGQ8{-Nj?;a=jo@Onq#L7omvbJPz9*N^H&U}<_73o zVqWb2g5|>9G=*c%FsXH@$h;o;uO;*17$)a?(yrmtu9FnZsSug)y@j%h^3%twPqo6t z+Ct=eI5Z^#&av53GK*;{)yp`k>(}_mG->wAmtQ1GihgMA*)@{K7~%>dKvG6y|qqrZ@%^ouMpDNe{Cge)x(&f(jF9$QrfJsLIm)*3%H zG7C?n1SG*t*ihASzQa}pZ1H1Y8i5ht4XHll$Ai!Fv#hi`Ts`Eb2nG6u=vl0U*$GG> zT-g_a#b*^*a;FeriiJ~^+Snbo4ojt81?i*e@SyNvI-yW?F@9>&5XT^fua-tcCXCnL%vJv8? zQRoet0&rFu3IoZ~*fLM#5))aDPG@9TRq!W_wdQ;w0QU)a&HMnq84jTh`i$%V>EV0A zgL-Z2t}XfUvKra{Iwox2hQpqgzLvW9@9gEb*tOvNVe|Dc?YImy=6hF6Us=&b9qL=W z1T?J&KPJ6#1^$0`UX{HnR zcuE7Eu$Sxu>avqJ(PkvmQPEwypUc_f>PU(^Tztr~H6U&s)j($h(@fj=n0AwC5US^C zx&>gv(1h`Z)#f&40f6N|jwkaQbRw_DX~vMF{qRGmOwri_Zg`q>=F%)1mCpgsww%wF zGiG4!LTFtI)e1vsg3?(tnlC)&yD_fdX*-Ta_D5EhLiEnkqJDT|BRnLe5?VMjszjr({Dj?Q6MMC`hFUae+>+R$Sgt)mff z->0B4jrwv*dWan)o^Y=(aGX0C6G~FfZ588m>}WO>G@1F)8FYtSHJC<-m)SG$vFCs$ z3wMK-9URDBXU_VpTEcCKXx{AMu+Fwj4SXQ;CuUU-_sJYX#)BEi+x%xc@?MD3>f>b_ zgk=KFDg3P15i@XQm#axG@7Qb+f$&oP9=L1MOUfl>+V=QxR7d0$Z~#qeMBmW~#oUbH z6yy~`Z66!-N_}lRAQ)z)2{(%mO-*lYDhd}=hd0AJ0ac|n<6gx+ckqp)YJsNaj2uRJ zqWOB<;owuMq?#WS&qmW>Rjh*zHtCLW&xiDcg^(~x2qZF9){IdC=Ga~LlR#7WtS|$C zcKK+(3B%XmCDREq85CttXV%j{3-|H<&9)cv1Olh#B$f!D>2Sa$j!$;(&^PaSyT=Hq zg#(B_Lhwp~EQDMA_>YwpdR#|LZobq1EvauzqGfPg)lM(U=VhRcM!Lh^RM;85a+u4E zg}J>0^pCLw_*PLdYmaRs41xaPR?#uv_*T&+-&9*g|1{0g%5f1etCnZm%eLFRx8yq3 zBd`HbPm3D;l*Xu8>aj$83}#F?2dxa?UI+)VcG1mohY8=q73HP~@J?wJ!p61vLh%22 z>JDun8M?D!3%pe;$~M@}U0^Zl)dl`(w7DcFN`mw-B%FGhiw!_gn)X)kN}wzHfYG9j z6b&LDDbSEcN)pcewU3lC3{jsny6VJZaimmju5Mm5M12XgQEN#}pwOVVi@B2trlju_ z)cu(7fSgF3)+HF0G!2`Cyp`wzo$F~m*|wgfL&ju}m_W`56DDp9A@mEZDD{hN%i^6zFL(^A zLE7&Sj(+A?vN=h%C3^1f2=A;v)6aL;pAS_Jn4c?TA^nB|9@+w5zEe=PPsg1pE{4Sl z1T)>5lP^O}o7lxmpk)m;934cK^bAL@aWSYb8RGNYFu@z z-H9z1q{tH#W2sy+W6SBx&AA706o~QI2kT@6r}`O=W*zLmDIT3BtgFtY9`_+Yq}dIH z0N&8vDe%h8?Io83EZ_(g$NIBI$+6g)xI8g{-^HYWS~7+dsvZf)q6mO{4HdDHl)y8c zGVYNBexgP_nF`GMXq*zD zB>_QW7bc*3F9Ot4>BU3P&9}7|E8)I$@PA@aFFu{o|Cy|k_w}(~;u$ssUNN7G8*8j^!njb?vpno;SBdx5;!z_J~4JWiKC?h#1OG2rVO111cJ~}>h>9)(0x^#besyKLylFlu5p!rI~4n0%KtSC z6!t@Ydj`tGpBp<+PLS*aWeg1*vamW!2G`vrmxJqD7*Y!j?-18oAOl-}%lqFLN(*UF zvYxp4pc*^I(@f)T6NVJ#nQWX$v4NVZ+wM%Jje7It2-R{EXK7aqC+6PJsO=2e^4e}SZBGGS;U%&Fd8wDen_Mo~`tC@q|HUXA#Vzv68L#}@xX5LRNmVoSok6~ ztRc3vBhSI7S%%RzyU1(rHRoM|gYoT@XUAC7Fw4MDOZzwwsuEqSzBPCFbdB9+FUXz{ znq7FE)2)xi`Pelz!_?RheWEw+!)mTKLeiBP&r>yl=5&h&no1%IXgCmY5BC8*2Mqg| z0vhJW=8j!kl3$PAV0fnMBcAu$w?weuOTuf@Ct)8+pk{wQn1sknNR(k;Su{K412YBw z*-m0!y*`Jwm}&1c$KEW56^{9%B~CQM_!b@k!D3YOGK+#>Hb9~VP=|#gvUjvc(Gc(m zpHz?r4ADR-_ypH$R5{mqgU?nREFeM)it`WAt*D4I&sI~24@ee1%kR%+8o-7!wJWt8 zTavG5{=MQL@J+1vAx83~0wI8-N2F?TeON{auE%BAHC?uj#mW zn2n9l*cER5(lJ!v{^xL6x~4a+Hh3%uL@;$)v82$)7Lh2Dd0D2KI z1B~Be4GX1PR(OO8pJ+%}(l9N!R~a83&G=B2(I6^Y{u!%f94xVy;K5qigy^ZB?U}k2 zB=|+?cAi_46lfJ1^_s1)U*B+ZN3#qtLhy$dCa1&){)RUbEQiR?2xrO{z)az&0D~_c-Ysxw)j?f>`A%g7 z<^y^Lz(acGB=d^rpVklpyh}89VK7{Bmk-I$XNp9^i;~|MEO#%4#cIv>QR=4bpiHYx zcKp~d3QM>9@CGS-wTp#jw z(0W5W6$})8rf(pK*{+A#rc>+7j$u)eNA_bd%4@|P^J3UIy(PK7Vz`zuRt^DBxieg7 z!_az9nu>U%7v~%=elF|xc*{yO6(8~tr}c*K2C%~L_IOo zW|nkDBz9&Pn$F~u)~abUvRP@RAEtBrSJ5>TsDyJgZJjx=+^pB8&@6gQ3$Gcc(`1!S zLv2Dmy{~?dq4=_wnqqQ}c-*KqvAWNtLp5e1P6im8HX&l5UO;rVmwr!awM1RP$uz582u3z)zD z%q6*4&p90ICJ2o;o6cOOlFpTFzGUW76XEEh>40^+uvGymVrnz|pq$U*Q|!-E6m`jL zGCMh&^#4GLL4KO;ct46^klRz~;4;99mH(V#4E#r!lvVM(ygp|nblF{|ctL<=XG&WuYb;r;X=koJQkPV- zOJxMTc-8FEZMn_Mq?%od!!-s|be#bqaVSOgm8zM1E=(mOZK#D6m)Fl0BHE>t$q@f>=;eH(3{*5?o)4|If}FN%4KYzQLokX9CnU=xOg%#oSIuWoTetRIM3Soo5Sh3O_RFO77Db2 zQ!Mp0CSp)i4MuTluOxC>O(aAx*Y;L2J-668=${0hE5CmgeeI@DO&*#?6m4r6Jm=j{CM6#t&t zFTd~ow|wpWpM2M6P-c^WH!-RK{h|Z8D@(^nQCTgnCPhh;$i@^T(`(jcPHmechPDGk zJCb1+TDNx+=M53ehkYwK0@;mCY&D@p7^U3~+8xe7%&;hP!}$%Vn4*}0phs)ztg_oi z95A`56c|8<)gufB&|+R62d$=eE2R(1$eR=^ z<-uh}k;+Wru-YX5i1qwg>uKryiqH%s4>pMQ!Sz@){vOq&q4q)D=quBJ>GR7OeQ60X zkqZu)xG2-F>4=(4MC4V1sl*XVU^$N%nOvBmP=ReDJT=7r$9YYf8?!!#F;de@EdDluA7gc9 zZg5I70Znb1mDQOF_S05bpJh=}(ff3ziOX7}X`#tVG~jQiHQM_8=~|;{?Lk^wTB9o~ zG_Xr%hSM;ya{lvQ#*51T^Xbig(y@|KlaOU-*T$KN$g?%hior$<`V~=_wuWZv+O&q& zh!8~+PKa7-!Az|p31?7DnW@^J%v?R8pxZ@$%`OYP?W^x&ra&UUr)$DCj&Z7n-k+*u zgiBZT>z3p{*QP(Dl(ua9&V}nwXnv?&@ERRIR*6=9{L)yYL=HwXQf~gX2viKD%L-JY zj= zN0^4MKaNPSkizGcqp^^2Vsx~KXF!6Q>gno4wG{abNzhu+PfvnIbeRNIgqLWaUJC7Z zoCIZ#{hcd8BU-<05)^Gu64cJ->&WstZr%2olc21r{&PrBv%ft<5>z{vMrNB^hXQmf zd~3{H^Z8FtfGX6EarJUB*P3x50cw4A)o^C=gU*O`nvEu-$WJ#w`}EaUoVx5}ZfV6K zW2Hhirmz58ZG`IH<%1YCjb8fq~_QX#n~ZJ85um_XH>;iLhaqfg}GCN;o48(u94vMGf*(d!P!=c0rKid@};}n{D3f&C;nT zrgt%k(z31eI^8xk_f_kkXbcoti-(pb-6Q@q7yKIwL!>G1a6lvMoQIgJce2&~d1%74sn}R#|u0 zJ`$dQj()K1fIefRtvY}~Cx%n+!KQE5=g1X5ORhX4)hJ-m5$T`mxP!b0iYTpFrNOa& z)!u1F#N70h@3CojCMLU6+JHfDi87!BZ6R(%xciJY0_cR`6I`Kbz||hdHQYf(g)Z#h z74#{0oD#g>A_$Ku>UdSu$1lDpq}Z6E9;=G_$i)|hDQHYl3tuQ3_!NqQDcAv{pP+U| zlh9_zISM;Ei4o6mZFdy{@2$#LW=Ei+^esW4HYaE|>?kTxU&a9aNLA=l09yW!OFMYs zi%+BdFx`4lv8e~1PEoLHL!}zB7?mQl8Y&+gQ~pyxrM&bM_uwLGI`gg7gbq?iPaI17 z{=UTYCo4+0;82pid1K35;hQt%6W6@@oYR`MYi3yxWkZqBXAW9zyQ=a zzGVo5tlG1OZ+&e;Gg->`0o6CF06c;0>hLGU=UFBR6{y>)w=^*)-?jP1q1pEZ|{a-N`w0b3{ zm1R6Q;yM&2LRTeUR?hBNaKuz+YHE3%&k9#HcoF`&VjmcWh)5^JO zlmI-Zk41&=VGONfP!);PS^|*W`?X_sNM*?Tzm#`>yiU4S_Eg0DLtm!sUihdk6NSQ# zhEuvfs~`2Z;q070iK63jZx5}M(Cx~MfqHOKW7spb*xp_+PW z|69E@=4Vn#P=xthOd}1Cd0{rxPwVqvv*p)1vd$?>o%nw(AHkBMSW&82i+%vi+}0WD zoV`1tXC21ncUrmWeld5TF04V-wJF_OMbfC&)HSN!^ostwx_`S#>wH=G zz4*9ImWwQWHa`Aao$HW=U-(DQe3k42S$I$NXxh;?VtlSa`>D0e69-YE0L8x5DL_C`cszS47H2rFk; zqI!i(bXI5gc$PL<@*n;4%Gfon%JQl*9T>YE9K<;JR5!gbNg56QU;JM^sRf@Cx_|(Y zEp+BFu2^}dr*Hy@@o;Qg*Wp}X?R|iG@y@7HpKH<@j}N3o3LAOjNh<%Q9*7x%6mJGY zOlyc3JPwvZg}G-*A1p~=CiN*?6$CT0FoEZAc0ZD)jT$zW!DA!h(T^i&K67|2DGXH6ao7d0 z50RY1(^xSSF~|l(j5OBXIG~$24LX8NunL)zBF*=v(0;aEe;0#Dq4E1Jf*eOlHHVpu zAp-%C=ulk*&|>0rN*+gw2rVOrB`ExAKkX`xVH5<`CU05UHbX5|w`#Cqmec4qe;lG) zSp3lmTcE>)b5fYXj75Y6Fe#4L#vnCAZ1tElm@FoGsYX7iRDd{lR>x?haCn+l8}hX& zd`^)r33sv<1DGV50-kITTTEuLCM0I|rJCd7NdG{$=o=Nn1&cN{(!(=4W5tv>6-b=a z}DRHRcPa-G@kY_F>>i9Nrz>?s!4y5g&XFjV$P13lmp#(KbZEZ24+t3Ist^iA< zXs@7A2k~P{Y}T(xeQ)*zS2#xlyj|O)`@Bpy#BX(H_(={R;ow3nQ{jG2q5n4%_TQz; z{ukeODU8^6c#l#j-*PDZ%hF3~|BXD<(#PI<=8SiFeBa>Oyrk9D8Zd3vM+g7zXZhmJ~?7`~XyQ_Adh zje&X;j4-LpQg<(=WI1Y^e7~5?Y#S8uYP{f^WkV1Pwgt@8gb#`|gsDSi*(MUEcEoZV zreIkE)iHR@y(&N}7zafswvVEv(a;EwR*yY)ON5UlbC^C6VU4hjJ7bP=V_~zz97Ssb zhLzJCEvGqJPSeVfHyLA?a%_tNQ8!~b6Hl$2iK-kO01aeoV>x!z_{GDcQ$8IYXn-)Q zyBTRyyKzZ_sSwPcJ44hi_&Qz9C>8X#OoyFy;XIWKdsec0yr>J&nPdMct=6nd~ zUE7sxAU*jw(ypGOXbqQb|WNeX4ka_ive4UqAG0g5Gg|P(2liBOx2LtMiUGy6}pQ|ZD0{V!HBH>>Shy}lv4^ziT{kb!1M6|EpD4- z4Pd^wSuzHawRj}zbxKuzQ(TyRFeUb2RknB%<3EkW79&5H~eoGJC0 z1sR|s#2HUS=QS-%IPuzrLMfmWhF+`BZ|yOAL9gn=QZZ!cE11x*sAgFdU15IEjIyef z=8iC+5Jr-;5b$I%d4SA9H#6nRu0Y$!(PijU-!I!VEEqj(Ni-gfv@Rzm1Q~u31_Hlp z?JnB8NWfq(Nh3`-BPW#DB7lcT@fG50Ivfn1X&H0N*bJ+7GwRPKJM~RoedBo;FlfxR z;JMj$|D&AF-1K@vapHS!!b6mlYTG> z42hmE@pchkD8FX(&wTmTUsgO8f@i+?zqSTj`68HS96gT@%Xc(i1Tv+zUM%{*I4oat z?q?kS&koCHY(Dele|cEGDNIcc4R@kVb_M&8)8~I zySG#^rtPWJsW@qXcQuuy7ff!{zwi^xQA$iBS@K0yU|B;in1)p^LdQH>HKqYh1-3{i zioavU)DX~3_^*{p>gXJLt`G(4J(fRSpn)g@+J`YT=A16dmcwfz;ZWkS5*;wdC^}@z z?*2wv3sQ-XnmZ_<`Ef{>`>s%eEn4|HeX0Pucf98QWV6RCPEjPn?e%AD=?nE|Vj4d& zU(3%@%H#FtGs6eX;b-raLPFf(qMW|0xZ|?yD7uOFbPGh{31| z(Qu2EX%enNNavIVQdBW0)re@ys7paKMRJU2AW|Xy%h(xS5@tAGE74(355#OJ2qRX`?yd@Po=0*2q5N20TYxGmaX0Z^cpL zvJWj)Qv}%&6ktRHry2}oHeBQou7#A2Q-gbNiDv8TWZ_PObg zpEUZpIf7Zz&$m+IH>|{8XCGG8y-nf)vL(!6ZWunih7oPcL{`;!Sc{b;t`?h}p;khT zGPPRkmo14*bXIub#d7|LE|*Y(U=f~5SeTzh69jfc)K)E_xNj27m-X&J+m06$hjmka z(Pjx;-C10ur$0| zkC*6?)i92xs2*7jOT!oRxJGZ8>!;y0xANH2BeSkF{GuN1TPF5tc#9q{)mv7>((o=l z+PAERrQ!X0G%%Q4rr|SsT&c`bx5GbFkD9rL*WJcjtBBRGG~7`=N_P%#)?-)SO4ki{ z>+v!@YIufs>#?s#$+++lJ+9KD6uQQ=H_?jNABF#tW<#O?S;dQ)-YpS<%&!Xta zisz+_KJ~RPcS@hMwa#ZlI8KmEEs}8fx9(@WRf}6c8JV)YEK?Jo8EngmSFvB-^Y#a{ z)Vz)rb~~Pc9ggUBnkZ9z^y*kt=8CQb8+VTS!3K*gV~yzomUAJe^E{QIItv>)49Mop zLHm^82JWJA=C=i~e9#>9LiM_<8Lo@AT1cDaQq?S12w4S?^VK`6FMo-$BuSie6?P}L zHETmG3vWFb&y1APe785e^meoFy+1&IOGy2I2gy+ z=K*BUKp2><0~9UW#Qm{}>U}kA*w_kP82x40MQ{b>hPA3dcU@B`5aH~2*+9!8oH?)yPy=qBONJ04KGuIbJoRG@gHMccirChCnWFR~|fKa#o2l5;{s z$4rv>S`R^*Qt8~8Mvj~zFoSA*U>PtKTw|(KkliXcRKfLbkqWMM*1lL_PqjQ%5oMV@ z%Tco&;)^ANJk23AzO_m+47?$Cl_*q7cX91VDA00(gss`}Yn6M^R6bPRX_yrmi#J__ z@4?f`Vd1ezxsdR}6cIklr7$?{A!d{A^Fg~4g3c{+A~V9`voL?~ej)!W8G|u{TFH@g zKOsf}>}mgF1lj`s{1r+6;Y>;gl`>coPLegbE2|Ko(rRMe;d1PqElkL68n7<2sGWs* z(n}c#9ryn-Lx$vGK2w(_{XemQGtmiQ;KP!N22Hcg$VkXeU3os+fmG-2dmst=Axn5Q z#pHW_W+#J8RwcEccFg$tNB@K3uheW+g7<8DxZOc4GL@ZG5JO8@{{tCaiM2JQ!6kH= zpfgLS%Xh}R)9t`ZD52A`JNXQ-anOkx(*8&3fU?eOd(=@PMuud8CN7AJ5O?;YKE}*p zJcPTD?h<>b6~O>dUi(Vew>umrbnj)^d;Kgb3s_ckO_axO0K7j{zog++SjT_wfrPba zd=Vq22aqza@;$o;w%JG~?y|i?JAgq$jB?SK*ifnqOi7|k7jez*AIq;oRJ7J(G?322 zlntG*CNOkZa~epB4jSuCpW-BE__KM-lT#Y0J`hIW0_N=C{Vrd#qOsm&iNX$MEVfXT zMmaBlmWd5-c~mu7S-2Sig*~nO$kNHhVA>#`uTyUa3j=*DYGES6M1kP_fcX**Keb*- zJ<=)l2mvY44xSKw>W9yuPc9pbK80F|bG+0kVql_Q4FDQ_ycP-pVgc$rQLAr)40!By z_br(XObJ9Fpld`C^BK!->%!&Sa)Mv`20um`<(gHspB`j$dsyU!WYgVq;YGfq(d^(goyl6AXmkz#;3BUDmBRBgI6!=W>`1D)eblzomP{LSGg(0vl(_C&mNl>>AN$5H zYO)5l(dl+?9b_xq=zvDq-AL=pKalrTsgotnTV*#A(9XLNoY%V%6^3qPtqcoK)r~0$ z*$wLpxg|BT*a-e#%pOCqH>0{SAde4UGpQ99LZ^#8|l0`S0p#AFB@O#3o@VNdj`p#L53b^ zyC$=Me*@wOnTpo7dw?1zHA8jjgic)n#dVK?iCpX7*s(QrLu#MNR0#tW)&B^ly#B`} zm#_mkx1hKidwJRAx?1RkvUen9Cn5CX*?$?uvt*Jw4P5^J}b;r?^X?33+1>6<+CEr{YFQvxp)&Dk>wrEYjUT zmlvXog|2{5^n}Nzu&Os58w->9foNw`5llu(Yi*)TC4|iag;YXE+CmZ@5;ZNtF=|0l zmJ@!**UEDuZE)~wEQ$a*6)FrE=omvK{%EUc!7tIO7(WgEkyb-dAiqQ_Sq%U8Ed}A> zVg$u#F8ltO)?NPSFqiB5LNik<8r(7ZK7?;|K4TUeH@Kj(G`K9Bpm#gCJQ@UofbvPn zv@FfnI!AZpa&kGE9HTs%IzlEL@f``f7(y5}QnR~VdMf8?Sv*Kh)X@e9Dv>yZ#;;ym z=b*t!`-d*MB|cEn3DPo*=}5P@qKuKesH&~X+(7$!PT{kuXIP0{gk^3dW&RPf()=f! zt-92uNZwMPmA4w`8f0urKloA-vC>3tj(WI;8d7H$I8l%BGZMQs|KtT##*^Cc#Hijn z_Z(K{rY1HY+_U2ub^p&)#wS0trKOt=!iuiRcqLAtFgm^X#+bCL4k5PFbsS&f(6O@m81~m&kr?w`TL~CZ{L9&&0 zCI$NOwajyfIP+r_nP>D=Dd>bx^K%ELye|84L@F45={Gc`-`s;(!In0ekmcMB6I8F| zQUIa=rzFmlgX1S;Nujiz(R#y-hKkEr==d33#;#v#MjOv`b8x*%zl*LJP4!~eqEZOJ zNI&y~4Gbc)2s#tUW;{TcbYl=dIy$xVSGerOfz)?z^DKv zV~2h?MNP@7#F{bbfiZDVw&O?bNHCnpjwH-jrNR}lGnDEEW2$aUwA94mb)k^dPB<$= z*s8`uKmTPwGCv|_C@W%6FeR(eCTYtqITE5_-79ZNkWN9C8gngLqMk`Zqv}u_hAY`` z^%mjm*($hBPGU&NjtCQwRNdJ~7h409q_i*^UENU3n3~4cM=!)E4BbilD<8O0hYY(2 zZDfpyqY*64**cM2t#5k5(8Ek`(O%DjbMZoYYj7g zY5|<>ijjE)~03i5tQk#ie4mDsfYoqqtP;P9+Y6If_fgKB>eV zVUFTbvHO*{H_TC7Dt2Fa&O=J*O^e47$MVD@O6ZMp9xhKju7utw=dtp{Q%dNKa-J+t zJfno(DCb~#;yESsMmf)xCtgrOZ+;<;!?32 zmAEd%Dl(;Cm-|XcW%P;cF{=lda zLkqHnNx+oy=lDn0LIBu@^S*qAFa=2&G65Enc3yQIsue9e72 zN}A3*V&AiH(37$3Vfx{m*qHLz0-r1u)KliUA3R_f+vDMDFQX>|o-9_{-Y{+lJOMIh zoy#>RAWrFr7C*2+XykUCAt884fPCPM&^teEl;il z0WD~VG~6D8ZTDV%_Fid22M_J`h(?!!3%#H&A@3n`PnXfHP>x$QsOU_X&rAkQ8EOy> zn5Wo68fWiE4aQ0yB~(aV5LDz?0t+bpSSCDeq3=*L9bvVkpQcuw2#gPDK%@nSbrA`!E{Q{c^wzUM$_GH{v@m+GBxZcY4HHOCB|*FC5d$n6f4yCn{0LGxrB?TkA_!q!NpNSHwG%a*ci0G6DQPHbrns^V#mxv;nb`=M zX#j!=Cl!bIC=}HV69ya|fwwRl-|iSw%Hcnq<7XL78ThW-yDL3eIC5p4Wm>SylF(9s`4s42}~^$$|TLF zJJUAqH8Io~#=Yqoa+-vl*3@a2)@20jZf-j4Ulo?`(Z}5e2O11M;SkF+A}u|$*h2`g zVF9ZKR_px(?`NDcZ+YlJ-6`TSxhROKY6`_!K4%!FY6^4SNVan3i@bo~qwm%SVi_-f z8JX}KFLR5n!I6xSa_Lv_--SqptN^U-7F~9 zNw-_kYNeXN_Bi2k--pG)go+n$)l(>39^kc+kC%vL*z4`wOk6uAuH6r(L4M`H^IREy zGs#{AA+AvzdzAK&fxnq#yjFriQ&R-P90t^gU8UdRyGi-o09~wH=6dbI4R=+95=QJ= z`y;h7XE4}0EeQz-p9$EcktA1?eniNyXEDWIMuoU0jHjEJ9mbuyKfp)K@S)DPW1ooI z?e!$g852hl6N?0v@3-5^Jo^QHa2#}y4wkgr7_bQ1;3H4m1`9V(uOU&hUT4NV?FZ3) zyfcj3SOl{zJj#bDC*N=F`fEweAmC{&Tp`(nIr;SE|fu46;CHpwv$kU2~nHv0E6T(lm<(esT#Qdw*aL&DmKj5y?!&9n4N{JEN)V zCUj@BwM31^F2$&TRv7bjx6;XLHLY<+&?qw~Y}}#jc3$9l+-*UV46x2jznx8AC;es5_5&ggoyRmzaFdVP>EvZ@ zrBVw$o^42WA!VxVxht|aJ*pD|jK7O`mWaU(7&?9DT7w8X4ItBgC%z}0%6b6_(rDPs zZ3c!-Px2fW8;uW*Fj`$!y z&w~AdBfh0u|sh!Q~C1Jy)}V9q8J)-ws{HOYBM|VRr1W zFvWeHO-1)SBKO-+=YO|2-HlJ;yWCC%AXE`{YNs>++Q zsTES3c%dpMoK58$b2im{V-K%$Y8^wZ1~grVCdXn?3k4l(*I84$>tZ0M1A;pa+%(a# zzQDhO>&;I@m^+O}Pryd4gb?afEsw_a703z&Q@1v6439I*7;K#O2*0rzhmJ5(8`yN* zNwb-D*gJAg4y$H)KT9)*T%Vn7en(xim7(Dp4bTqXk+qbOsdo4N!Z+NuuE`Kne7 z+UQ|40Dfv93!y3Seg0&hWa zlj%f0{k6=?@}3ja1JDL%(i-62yR9z=c)2-ztob)DEt#_1Lzp4-ZuQe6ZmD_JP#_?- z-k>({EWsP@i>4N_Y(Ss_F+}(H7^*w zgyB7Go2`GHCbgr_rig3Q3lR~|7*4?5zk<7Q$v4K`N}&={h^3`@(P}-zT4XU46Br7T zM3qP*3V2C`AFZM)dqt6?c1>NS))%3`mkR~cLz)w#fZnQE21bpoile+n7)aLFI(|Dj z_F`yVGl9?#G$-hWp6A)=z&5$j|7ce3^0qva5(X{1hiSx|Nzra^U7S%eyv-_-)*%-) zs#q%wSSUCd5CM_0R}77X#T^3+>~s_ssV;D_N*VZStfs1I=A!U3n+)Pe80I3p$;PLi zBG=3nO|g(;32@#64@}F06?1P-ksFTcs$kcdyNstUkA{HoX>kqfvKN)ZUX1!>@gQrj z{xcXFt&U~5sZOeYSRIe1I(FQ+*-71?9`Ob?jHkj=<#R2N{G!$0LUdDsaIM*3kc=w` z6F6F$FpOM~CeIHub{bWdBC5g+BmayUNiD$`oQ$ibrEgEGxal9oS#U|oM;a|MVo*dd zyDr7DTTV5V0p5E?576t{RAvdUBp>)SIeLzX$o!C=U3>9@#g!x-qEM2~Tv_B>NoSuW z=_*XQaLpFJM#@z&PA*gl{c?7^E*%M^0GLa1j6|7)OQTRk#po3qhLUjnShv*v3Q0Is zW$u>4H=(R#csoo5qgGd8O0!hkX)Z(pIN{GOaaWqwDgP+n8nx3YtAdu zW5)HR%d(RqXD_O*F|(o3EUXcp^xJ$ZLswv%gJoj~sH-Szj;+u{uV#+xwF^fA+#GdF zWg3Huv69l%$8QxdSICi=6iW`cIg9!OtW-6^v?i)5)i@d|mLz9pF)e(@b<{mp?4cTh znQnKjy~#>X<_w{LfikTyPuiXt$Pwn_fRq;lZf@n`+;$oWN+@*zPB2r@!0ZT0^)*Ov z&>^E+Yk5sG`TkG}Mr$-~ zX43RVQ?MQ78!qbnmHAxk)6^yA?-|j`(sKOL0(R|)OTDax%L_+R{@>${N@2+kr@>|J zfhh+}(N39Y^(0zjy6FLlE72;JCrEjTR7GeqS0z^^t2nM9xvHr2_<`x`3wnRmuFU(NuUyO1 z2j9o*NxbF!ubb)El{xs$O08U_Ol6+>G&<|z%qQ<7ddSVZ_!;6a`85aR9t-;1%x8a5 z*_)B~nuSaEwmpAsalIBm%Kbd$7i8Y_1)>jlnU6d`e2=HkCE(MBIxVw-0L{5cT9r9O z)^1H$h)^qWU3oRxXit-OWe$KQt3ypPuekAL%-d@7HZ|^Tm3hm7(J^JE-JqY1ds}JV zP967FMtQfeJ>%`pc*wI%S{L*987@yW4CyJrYH+wY6{dyQ&-{=ygKv0Q;4gF&t>j2I z;+si3;e;y5eXng|YC1GpscHNF-_9F?smwg0Nnn;CZl*kit_JT;AB=lk>~@vML^B!_ zmis!$glXq*G?xUSWMPG1>k9Rcg}-l@6Z6&=$-pqC7cx4n@&wL^P06Iqn*i+Aa`oVg8eB&e-44>i&r`44c% z{|D39|96&-p(ZIY9!{OA2WG($5^t45C9DPTGSuU^tO{-sKkRGWpAg!7Ft}7F%w=Tu zMa0cA2T{l3V#1kfcyX1dUu}a3W19R2t`2|rE0*~H-y3gzOle4J7GzaoH3{*K0Z#n# z0cIt0)scC!7WVSC)M;9I9xW~II*ubAoXAYJm3e2Yf^!Q|4g4^xX{3>15KD|@-Ua|X z$Rz547P!7ah%SLB>!L7KK@p8w;B6EaE9Gvej@uDAD47@zj)uv8qFVI{Chf9MqJj@# zS1ygC<|u=3*Z!blzx|;h87)xYWHJg3V}XwgNk~Cb-_4$ipl49cz271g(xMtO=Zy(k z93k9TlJ=Fp-uL2m_q`oa$`&+N41-2^2{#ugiql;bMr@#V?PK@sNKDNf`WOuMcl;An z%*wFkLFd8@NMQ1eLgOO3z)TUU&Y$4HmPx`&}=cS?YooWi+Ix+rD9ct8W9eGUR;ZxckpT>Aj*`s-Ta*k~>Wl+!en`0g?H z%e$vybc?1>c?Y4BB%mR zfaHz@Q8Y&e!u2tX1EYov^~^Aq@l;xY353L%#+8K~Yq!_-5kml1rLqcVD+n$E&|xL0 zi>6g>AF57YuH9ZSMNuJ4QC!Kxxq+j@ZY>-^X)`=!ehu_WT=ETe{_`CAFVvx>LBv{; zD}RE2LoLwrtqQs6hrH+(Gq`|R)rvalmtC(faZ*x-X`1VJ#Gu*7Fjglhw8Wy{2n0b~ zESg0DE8ejjRCm`Smn_p2%T?znX}*7x1%AROYD=aL-*R2Qoa-`tA=eeFuw2)?GhEj= zl%dhcYPf=knhe+FX^G{!470edKGx1N7wG|^FU}eQsUBn3E3sCdL)OYjVrF3u8W$!$ z3i;~S#$k~`)9fvmawe^*qpn40)Mak)5b$lVVFVroS&l#oh^{TtqJnP`+CX7>L8&kn zYo@~g3e1hi8)!T%+Bp7eW=x3;%#F$#T1_Bs`@~vmP?=te$q4XWgSyZu$?zKy+X36_ zF`Gu|^t%&i7)B}8B2%VV^x~<~?VMGI4qf|)+kW`;lvmr-gHJSE0Gi^46Tx2)U~H&J zsDaC!fa0K3?KfYH)Qvu0b!ARw{7Ax15n9b00_@GgA*I5G6f#K=fDX^Dly5F zIB?^K-*Oy9%ys97sVNnx3s+rvJ9Ni^2PkcJ<{@oG$yoqQnf-H~l}U4xw!U#6rLQ3SP%aGIpG!upc5Q7y6s72t3}87GHJRb;$AfD)03) zd)jsTH45IUC9enWqp#b)>hmAG=0k7&SZpM%`swh&dq4ewPv89Os2>aEzkCI4{Dl5+ z_RZZ{^EWc7xMpKEgHV(xyxy&IH30iJ8QGZm-`Y{7)YRUZj|;%57OgZuyPn#uig7K)*9HAFF{Z#d>jru@t-MpS#v1 z58E^DQD#FEzNanBa9jaPQ0*`Bnb)gzLl1AeB}B=Ur}= zW|dT{zJ!iu^<(?0WlfdoDQBoqSjPKpYHft@U_xpAmHv;hs8W`x+|=^_D8^p$=C#8j ztwj@PtbXf`Cp8j)W$7J;ELDN;!e4ahi<{;~C=f^UjC?Sh8+%<6>o5ARr~ zATIRG1~Hzd8K>5zFlb+^JwqO~Si_2)(T{aNKEA0*y1)FAtapx&mR6Q1+q;x`CCaIl z8pU_IND*@YP11_)($Gr6cuhbMWraPhEtvd7p^qcFy zaeWIr#!0EwaCl87?M8dWoo4SHOx3zn#SD~gWNtJ`?q(t+b{EY0Zdb{>;7FO_MJFIU zGx1A%$=u_ zx0i>#vFlSeghCf2hVat>G7xNPslh~zVa~RomK72hh*VRGGAXl!Rd={IHL8eZA`H}m zH5;qz;h++F?Zq|{z8Z-bLx6h*gczaUjXcLZ@GeTiH0MS%MA8W8(_}1{yw7`BePjmF<}6* ztSV^3(YA;d0G?T|ies>s>6W;5QaZ|E;i%QcKYUyr;9jW{1Z;te&m?7iR8LrD>zn`{ z2%Hjtb!eN+M>0%$zWD(&X;9CeJasA~soEH7x1n%o1DCHxEsf-)9*9HB(l2tc;=x&b`w=h}`lLRC5wi&fprK1C-hr?6&c-wI&i<|Ewy zXt1u|S<`JH06w#h9xicaZ8WxDOoyxoXTn=5H&&}sZWT?-4r+7+Mo(*6Xq-kEe#X+r z$HV95bhP9^V-Mk)yVELd-SQEr#6`fi0hn47B>6FuN~9b={U}EP7B{q7$F2k1HAu7j zX4_?0X^l3xX9);O)u-9fGnPh%ieHOkB6$ptRvtVuSW4g?Fbe}1T9@pnm`P+ChsoDy zU*AWqpo5u%Uyj@&AWoW&XKwyDZ{DjrpF@9dX+~gv>=;55(HMU5>J8PHoyq6;l(1k% z$SoTl%@84`7MrbaosO!}0&I)ij2N}}vy^qnc^-|{avc`yVlXJbC~N{Evrm_J(Df1K z&|+uAsDSG9Ay?@`Mo(1w4<`MGQu_C9T0U_ldV<(w>eNmRV_B1lqb=|M`v>JbX7FY7 z@Gwu_#n!hSkTYnOur-4rbW~~Wrl#ov(Eb;=Y~C`^*!8TdGXsqOFYtS7ly{DC_>b^s zz4CoKO!PEh7&u6UUIbD2WgFXC0vjr^bz#&&D+7y3*4)~zW@7?@&h)6O2z4B)K#4|o z)O-gBm9LQ5Bht)G0mdyXz}X5Fz<@HQfIq$fP>m@d_0%?DYDjXZ&RC)4peT0+?nk8a zpu^5@wn4-BUDDg+wJUl+-5Eu$=0%b#w-!K_PqB8_2AY`p<7LkrrrE#%Xa}vud$oDe z?%F2vq#vzbM_!}$HXi#FCONdjjDCmEXG2WREi{nXk9&*#W!HG-nX;zI9O!O27F}1fJB6ju{iczi}|GkUYNy>H_HDhZjQ8= z;)Ob^`)V(T-a(O6N^>Pf!{aEUQCTq>Nm&`t7%K)+catxsyU&%Ob3AJAEgQ{`htFeh zyQ73#i)D?b#j40`0!=Ap~6uQkH1nBPt% zK97`<4MNis!#RJgLs}klMk6b^DMBm3QYhPFin+bT~!kdTcQmkUpT$EeB z2P;SGutZWNk`qd3J08oaZe?MMQGy7c;il z8CxWnkR@iEiCgT{QR~r&L#>)H;Q^CYu=ro;1S|6$_Tvl`qeDAC(OjTY#$^d{#V|r8 znA~@22R<|M2MqqH-RLrg-_%wMB~m`MmK3L|GZe)D(Y?CxHnz0RzGxqpg^N*lpm9-* z7CI6L(4Kzb0ak3+=(K7iom>l44_}50^<+>jiwIb&kQT}JnMX>@o2_Y^dJc4twilXE z)Dz^i>?45AzJ)OdXwYgMKw-fl8;|u1i&;%v*Y7e97#z_6C1mo#Bb49!g@rQU^i?H7 z7L&POpoE(}P(GT1j#DFVhvb?BC5fz*-o@n_<9wpkO>ZJKJi(0qFC~X}dmej&p;xqY zFs(W5HoBIsj6*nh8bI)-@yRTb>zd~xE}#@t109F6BPRUu4*tW4^E3tJ4U#b>nBMGs zRNAc&Q%|GJm)tW6t`_>KRnB>Gfd9Ev(*9RO)t`{Ab;~MJZT-q(TMPi0Qp} zN7U*|>}Jv*Jgh_xV`@OqjM??n#PT)Sq9*uxcI{$H&5w57A~Yb!{cuZ5sxZXsP83H+ zIF#{UEsowbo-rb^YaND^wZN!|{4aMzd!Nghb3=I}!nx)@1a7nu0S70EfP-VlZWqgD z(a$j!&ulHjU3x_%t7^8u#A2&r*FiQCu3}#}zft%Von*QBPX@2`{{nQgAvoFYu6xL+ z=OuO89CmsKaw8NsI_(558Sy%-F*?p>zk41VMMjdK+zxIJ27*)w1HPk$A(XFXUN}r~ z*(u4Eozk-=SR!d>+9}|l8}3AOW2rqZ|_7bO-|LnH3 z$}AmOHoXMCGQU!RJDQX-tKT5fNu^lk_*$QU5ylr5byA5T+>J#RXgKt9Kg6l!0fn^$ zI8%a9ixzuQ$+t^pdq;yksU)gn^)9lKI6y@~i3KLZmzBdvnX$^$8LJ14&{C-xb5hC8 z)aj(s&lA8_tNyr|`(iARScaV@o}mP{Hw0i zkmEWtGE#G~MjG$FLx(0`ix>)CPb$F8#%25|%_mn~$y>b;Me{1g=hUX6vHh5jdAg3n z549DmkbW|tg`c9#tE85~dgF~Si9Eeo#adD*k8M(gTP(*~Pa0GDykun|T*R2g#wvd|)8n$pm&?RUhNYdPX7LlHs zMQ1gwn`@7Z7Nwn-%;|x@_jazP@%WcxbM3vH^Qc-oi%ppa90Rj%M_J_rm28vTRhIx8 z%tj8qk)m#$Tu!{+!lPXp-oCyT&}9ao>$=~N6)76;Di**tHx_8`Qc6T3NGnR3z60J7 z`VK!T@4GRHgrjztzJu{GeUGWr06E%sX18m8wU+A^fzLRZ7)Y@IOE*s&Lw&l{DbH7&4=yPh;w@KGmI{?xGU}e;t%0tiqjhACKu-yD>>$V~@Wm3w2P*1GW}FR7Yf?oTozBi6&lJVo z2U(M$FTHxp2uo*306E5vpaS_OMTTWs(fo`D{uWwI+w0;avCK}DtsQI`iNJXlz7c*7 zQyMZhz8hLF8u6!#IHVF7w;Q-i*hfT^8VdX9+dew!cbdB!tP%tEgx=^!>+PukDw17R zc&#?~rE<%HPxmx9b)5X?5HSs6h|x)bT8Dnp1S4+rosb}SFFH8e;1z1)#sKgHvRJoa zLI7~Yy1{BpSd}Hm{PGU?OY%%Xwmq@T(=23XaGerX)f!ro)?CbyqD3u+%iR%b`9=*J ztcvB?F~k0gzQk{pSobUK^Q+0O_^CM$s$)bdx;El$Q~MZ@N}kak%+4*EQyrSrmzmW3|XdEOWURt>oE#T zafUKgxGpX$uOm{{WQZslatk#*;n!?%aqVE@Dr)pY;fnN&J212@SJ;~0Gmt9`?dTaC z$n6Oex#HFW73F#cR9AOyAWwCsUh_Pd&-d8^Lx5!qb>({oB9Lh3V%j^3c$m0?_yZvv z`9jb3o`Gy1y%^}u6^i-ZoPpUkVxfMFvXlAdM`8R6;sj~^WsAjJ|6nmF=7Vf^cd)0Y zxFg8#&K0)x<@am`n2hQ7`hoKVzJar+dwpkDS%15BWCsRveOr6Fi}|h8QOFGq6?^(~ zd?1*%4raT0bH(m#G27LbAIfbF%Tvh~TdK1!-_@%xhKkw#!O{1t^uCbW-80maAJ~!W z*}kK=8l)JEb>)Zp_hg6qw+5Y@bDI9J$9L49oow$RpQGE~8N zxuL=Q08}-h6;tG#p6vx{=Ie7VBw^v6PWrcg)#@!F{Y|XZG`oI) z@&m=5BQ+AV!|MFNww}ZE$5c8xMZ&?@ode?&Ts^n+x^ep8|mCc7!M)xH`1jB$gCPC3G7 zls2O(y0TBFO&I;ro=)tULB;A4NsJ+sd;!|a4;BHst!<-;Px23J58}F@%QUp+W=GJKNXLl`U+~HxzQ) zdzk5a8-@y94W{<`F3q)}`kwrfmTgU~-Ak8tc4nKFH#RnHYlv{L1Rk=aseWmFqxmj( z`Cz_K9I7u2Jrb{RI%wzZgqegW{gE&|jaYv!;aI|S!VH4SmgmhPJ)3YGVGdy~At2Ne z>Img!k0%|qGsJUwyAO^_|6*MF$uNC}kkHdPtdU?g4OGryY}cIOcth5TTC2szc$y^0DASOeXi!-athDM~VD1!;)_MI-$~$hH#O%621< zyYk&R>gdaM=KA_ACzY5DUk?ugdyY=3WM3{@u#cN9;ItBUHwP8kj^_%w=n10PTIzoH zP;oSI0UfZ@a&K;EAfN37rk;U;yg}>M-ML~Ov0EtQ3yyPPs>bmchl_~g#JSz55<{DZ zJ88V9dwX_hYhO=)Pti_F!`(L`z4v7I4h;==b-~aE_@ZFu=o)=0#3G~3aOQ?G(Nk}3 zZ^VXP=`7d-{pSma%q4?;!$VAj#`-2R5eBox9n1p9`3`;Qpf3vv({K)Y2b$FFEoGVm zV%MPx6BZD%0dr=sFS|GB>8G83 zsehV1K_OR!MBz_xA~V9l@Bj=V*Hz4Q_w5}6gRs+3V4`$2bal0~WV@SNR;*mUytSz{ z+qrUSOJieKYinb7c12fHOJh^EdE2&S%NqK6It#GS2E*(P(ygK*w0Bq5IA>Gm%^*xT zJc%H<6&4Zjdy@V==Do^A4Am0sc!nBuoSPrWg$y-2G=$2ies0V5z=hj_p6<(oQ-al* zO_|l}w_NnfyVI42yBm=()Bug-at#AaU_({Q`00d8fcF5?MKm!Hm|XYvT)kENf>Tco zhH`z|qU4gGDf<5ABYw|>uJ6kYELfC+SZw9gAzES!q((_3FRgjR~ z-6OUsM69T)akkRVMf9VQI7%N&n)AP<^w)S6y+-*T!>oG0nWYls8Hp~kakz%bK*g_ITFZ9!x74)ztj zbM{wT-tY?f7y@RfxCGwSRNrFdxMT$o(h2&*!i=fQ3P}r_0&6zI9RkCQndRB89l7q& zsU5Iz3AUrz4+{JU>fKou5ydFAr>Bq$#Gc!NU_rzaf`!hyNwzq&SbkPoJ=hE zh6j2FSh|+-7YD^1NXH;c7|7e#(n$D)PqUhAAQlhqSR9mkALYH8Jn`8GSIolgEG)}P zI!-aH=UQUnsT&U8)5WBSAmH5r^0dkx52Hqc#SFa|2W6NcI3EhX{VuUIvnU?Yz8W;+pVTL%ldZ9SLg!bN{SMixqkmWU8;$1Kp`l=9ds*u+LnNY(z$Bux+&k=N)bP-IX7P zzX&JLD*YlqTsa5M4$5dXL=7@B?d{JMcjQ?a79*=rIAGy;6>?j1142-kwu?&@Hxz-^ zZwY!w%K5$_LzGJKsy_0L0*+_`g{Uhi@47IrJ~%U9BLooR@(`t-$!Lke{ zww+(O%USjgQKFH2@!T-KJD(de)NTrpziDi~nFt{pGW8FJ_1iUd#1$Op2HvYr>Z7fD zeP`EdS)FqQNT;}WoiTw%2GOkp!~LBsNkaSRR;wpRh&TfI&{=pVOVKT%v2Z9qjIn#G zv3S_WaE=>8a!AQx-BC(0oTPuyaee~KCjhf#nRs})Y+N=j-8?S6oOEcxgC|;DE$CTmQ+-)q%O0b(^H6Tr zFm2~BRluY31;bq<9EO;XE-`z$U5Cyi7VR{J>9vLfo{{SlJKUQw3!U!#R>ph>yx5qg zV5DU%hi`ZAZ6$Gm_-Nu#cpARdeSbbbu+`23_601krM352d@KA$YwZ{KRxnGRE31SWP*#9i?S< ziSV{*hK0|XVk}ec4&Q}+5*v3e=bhk|ap!uTHKwZ%YZJv<7;U;(Hq8cy9V>=gj9pPk zk&g2)bqTgdqx!pgOYlymAL`$8Y6iAX zon2%2(`m$7Lrg3+gk&r_QMqo)Np`eF^_!Z;mbsoX;tLpKLRE8g1rgPAFJ)v64`tg+ z!5>v(mwm?@{V;rXoX4q0xE5{D1`G7KKP_~x%71DAi z8z;+_V$fI_nq!fMP%tF;C#@#XPk`eB;CM4g627AJJkRb_$hGa|{7pVoIpvtCGv_4Z z;aA5UnqEDlB6aMcqo&QBb@UW8R-hdObCif4@%e#(lqD?^>Ge?)$hp&LVwoZjX!wW9m73Tsf^_^rtxw2^(21 z+L26??2t^CtdvZWuB7=YeR?uMx{>(3^qDng56N()0xAVoyl&?l-m5N!a|tE$CeP)0 z8%bYav=jT8G@3)lwE|f>y`ENd{I#sWlHaUcQ#UD~_)*_ME6r@i5i#=T71- z*uAkGF*b#UYGEE^Y5$|Cgfy==7J(e+>)_5L$ zo&B=fvg(hpU6#351s~s8RW|=7K<9S05w;V`-|rZg?jap%H|#%P)vk*WnE7&V0K-jLJmD|8m26$?QcP^TP7WiG|}xpp}o$PTrTNdr7}S z=4EZ_+SOSWYC%>{H%PkzST3fGf25OhiKFz7#-*Pfm;U9r^l!$ceWXiyeO2Sq$Bau) zCoS5D+Mhfwofwz?J?)j3e_>qu=i|~p4%4>l-4VBhM7oCi>^61eu~&kj06Y>d5lofT z(K;@zIUVJv$!{o2FCZ;OALTcZE-$b2tg?K~kMew_7mUl75*pRlMt*ty_mQqB%fE-T zaJ0T3uMsTPeeALs+mMkYJF=_@8YMYaut>tCGBCTCJO_PQRt{Y|py$PwX|i<{F$pVX zhVEZj<7}bsKUI}(3s9I(vI~<4{#$`h%0-lZJ88KjMd^2umavG@ZzNsb->XTN(?CDz za{O&2txc=w`?E>2_8F5d&p(&^a{R3$twrQUR$1EdWZA{?sYEjD6IlP#Alw?Ys2Q#Q zeS9nW5stRAbs7=a#CpOClU}bxt#J+PBp&Q@yuu7 z)ozYQn}#>?USGXJ6du8)tshUG2H1yo4z0Y&)0S`}oDCB0q?Y_>INn7NA5`cdNN%aWS{VIx z@Qlx|dKaqHQ|oJt9wrw)jcs{ai^pvjRVLuz^`gz)x4JV&*URz*?-Y{y7 zE{1&LbP5L!Hd`k%T&;6tz_NLVgCWeCjp3nSZ+@7kfnb;|vQkl&VK5#_(wl5|eXs$O zo7u?Q+ZLReD;o2WZNO~Z4u$3_+fsn3MnLSz_4P$-4>@w->%JpL({l2v547ViT4p6j zJE3jGJZv)y6kt*%-97Rk;S2ds)34&59Q-s(0|QIU#*Yk3+6&gUE!`-Csy;YRd#4oL zvpDLesx0Kt>v6pjG@Us_T904=l(KJ!>Vqw89AcD&KFr6)&Q@e`iAY4)0WftS>eyH; z<_80LY^YO(!d_$PQ{{4+#M(B{qn(c0;KE$61Aw%s$n|07&Y60VrG^6JHmb=R$p2HW znTvyd0u!o=xkI0{tNgK+b|}jX{RQXLFXnq0ha#M$V8G(jQTl{1ZN-6c3s{Q5 zme~&PgFtg7dJ9nYmmj$y>b#z|GG%q27StMLCzsWE z`Z)MsGcGOtO#M3#k8|cQ+o8COi?Pzhq{Te`#}#ar^%3(4uzs3VSsf_S24R z0Fu>`Eg@VXAchqJnB%-axoPA_FLAF1v5^6J*8u#!q^Ye1*zW_IgZSpwN2!@SMZ?PLIVQs z1e()KzVLTujx%08U8RgIyf1?}SY@2SpbK;CC~*47KX$ZFb{9!H^Qeo_sca+^hqHaB zUQb!+W_J)vuZ-}!BX@bJ!UxEc&bvAkPjntn8)?I(r4T&4)V%W)bN3o z=Zv1+JpkLeH+XHXfIG(xyqA82!odK_X}g40=MM5T&&tONIIY_P@5_1aUee*XZ8F0~ z!Sejqk{^y6Ic&Oyh_z!CCeFZRXEWmx89(^ubp(xr!W9HNOk>-=lJ{W^>vETePv;l6 ztvEMd#7aES&B2LoDXlr0)|m->n1r#-kt?tTkRevDV!=;V1+GE!>^Qc*xlkQDJJ#u2*%m#rZ^7!TAAX+mYap4c0sG|@mACPVTKaMaBrP9m3| z`sls2J(QB-pi$N^nz3Y{`N!xz^&5@Du9-05S}+@psNu=9jS~mWL?gjEYDW(f6O9?q zUkFAtWx&&dmABF*wWu{)h}~Ky8OMcsQwH71tOu!s-B;~z$+57fPtvh8j3|lQM6y~k z8HP9dZ5G)3`?F;Q`ee*Br345-WeWwn;=+Tu{uSz!2=DIP61h1q(P=%5?90O=Al+E< z2J8?>w|w%n8nYL30&`C`P8f!ksOmi|ZS2-mRCXEVWbe{nS^2~7e6g9ZM9NKO^Xm2M zM^R;`wd34!y49hhy8j1tN*4Sz`yX!qI8V}cCvD9m$o>+gCG(`aM(HbgUQ95AU>(IH zx{EfMg)hSnER!+{(_e248QlgE3FCKjyWPAMpH?5DwD73(DtkJHDIynWbi|C6wSP7I z8raPKn&B8LXs-)69th!y(*HCr{m-ODgC#SK5wb^isE_LTk8$;!jIyGBhjL_fBu3T` zY&Popn*6p4<)kEajk&u4J}~Z;Wh~=f9`@r4WDAYt!|FWjCQ7Ws2D3S0Jkd+FwOUMI zV*%fR(pz-3@g*$?6U)k;wH{ZRV)U_I7$`zUxyG>8FmbN&Ar2E;M!6||BI2W~37fQ* zJv+BoE?KK`8QV*Y1Gy4NhL>&$Ib8{xL!~$B&uYHTW1PPpyvM@u7UG^zx6%IX&8z?N z`?vQ}=h?Iq?cefP&W|SWuUAO(6Zb1ew=kT=XV^WAcL2i@0w*!B`&A&>Fi2{!{sZ)}ROZM)ty} zy_4vV*7H$1;tk=HFpKE`jb__6nXT)c=CxKQ&kzgmXAx6H=v0J8fWvj9D41Q!Y|yf# zvq#q65bAoTn{P~?LfSV{erRuhCpzs-+B8ZoV#(;tIpfJ<@^gSeDy^aXFI#PbKAD> z=-JuZ*FTUS+*KGV4)5M``QFzyHZ5J&yu77##mYquuk8CJTk9J}Yx{HRs(*zL{5fro zLcC~kZQb$nPB?M?f`un7TD)X5qkU|>AzH!eB^?H@7OUX&WjJ!4M%mLX-rG(-<<#&? z$MyVJJdsRQRHmz{Crz%Ia@5gNkC}Gt^cl9m%vrOKn=>~U1E)p$%V_$)Nl`HHGW&n} zq5qfqf2e%0!!a2<=H;H496AM83X>2sDI`xTk(;ozj^t~ zY52cGSu%h4qB92xk*E5YDMFR~kjOSLvhgB)pvvy}Oa;j@;!sREP31 z$aZ1ZE7T{fxxw5nv)mpJ$IK8dvz;?HT7BX<0Fb?Z1!?J3Q7lVW&@q~Rhn<2^jzM35d`zV?{D=`X+bSWKPeYmb-X(`h#L%%Spd ze~Qk9J3IEw5AgpT^-I@(n7Eoax=e=atc<_2@w>$U@GSY-yV(LlrL%^1EO6hmZLcvz zneh#FaEp=kpvc-0*JV%S%R!~)RW(lYVcIZXsvPZXpp5pdWZzXgQTkO3!rZd-d8BnX z|Gk9B4*a(~Yn&qbyLnvteWc${_y9pxV2$Si!Yzak67(l}`4Hh&LNwkV=J__l?c?6x zLHZT@g^l_Nmy?pyb)KcA>BQyZAC1qbKeR67;xasNhq*J$Ov9TZTn-9ezL&4tb;QE! zH1HND&W8K1#{ESWM$D9d-I|6QDQh#(aoOwyzchHvT z{O!crTPzZ*AH&4L%QA>Y^lyAXjZJ7Q4SbZmwHz|jb{u;Wx~0qc7$Ks)J9&N?b2FSi z)(Eb(r~D(0TaIoKmX#X9aj)+s zOYMmesy$T^h%rT*gskKXBY0$Jp}+C-EsaLQbQs_F`g+Q>QVvpZ=54WiFKw5MK5rmT z;}FG`7g!goHWr1SAWwfP^LGS0sQ8_VQ+I01hU4_IgNpzdf8!OVv@OURXrDHSoI8jm z7qo_tV0k2j?UTHZ#`5oZmQ6u+gg}3j9)>7YLaoRcD z(}&GMu7QJ;3n=ILmTt#1Z+G@+Uu|2{e`k)DURENzdbphlR}Nc` zxz$xnofDV3h(uj-oM*??b5mGP6#0ptkqw7c}e(BFt>&BsP=Q*2z?xU8|cad~4) zV{7Az#+6NtO-)Tpo0c^-H!W{!X=-g+(X?`DuwtQL3vesoQmaS}VY;I~^+Pti}xp{eWOLJ@UisqHe8<#gNU%GtR^5*5s zm$xi$UA|)Z%9h5Krk15G%UYUSmbbLDw6?5hS=rjieQQfwm$f#xE^lpVZEaoAx^hM1 zil!AyS1eo6ykhx^mKCilR;*aL5)fC?{7R}`$!9BhHSwyelXPY^I4z)P*yn$Rn8kzd zB9zn7XGnjR@HxV4=yDcuWOFn|Ztank<;_As&MZq$C0$2)0_M2_xC=cg*Wa~6eD}^* zTiQ|keBwlD>28v#Tkq_&!IsqFTU$fp zMRu<{%D3O!yivy|Gkf{SctJUv_(pcMZN%cu?*HXKC-c=$KIo*E@sn*Y@#l~Gi|NlX zzjd4b;@(T@>+3I*kO}b;Ihbb6mX+mbT;_K&GgVo5t;)?MSYXd4EEL8&I>5ynFSh&r zHxi#n`m@B+d%i?0o%Ug3@yt$q%LXJMH53cN z>JT7fIIe+W6owU)*EmJxC(<9j@1d5ygR-J)AK(@fPbeF1!8Q!)puFyTu>9gizB_^P zqW2a;l$PC4c2Fnby1pCp;>o0!N>zB3@w7K7R^v|bj*1^WWvY9OcdR#~dUpJ{)LeI- zyEE47-Q$1UyWe}%`?mLZ)pskt=RM(l-#r+A+WTqjS??FY^RXAb-}t|EtLC44+PNFw z_Wt*O;B{|)=es}niO;_Nr#<#vd zRy}FTQ45=z+t#dIf7ZDhyK|R*>eI7kCsUQ_smHdgY`fzlPyS;?>kV(eBUyR!Y1?|< z_Kqp}tzZ1bzhB(>!tV}k-tykRt#6pW;QaR;xaC8)-hRhjpS}N~M7rvjqxanVz+-pcGm!tnJ6}`xy0{-(;&1cahWe3fj`N!)&yLNjm=j+VKO;8jq>+y% z=Edg47NnZf=dRw@S~0CMHT~o@EB&riMdP%1tv@U7wy%ht9dC$LCM%Nd!TeZNMT_4S zpP7tRB{!{aT~@s;S)Z!hcj9?xFG`&>ZRUxyryg5zE)ASfJtJ9}SeKe#F`Qm?+DVC% zr$Jm z*C#7S{&Q{RasHX>Tm4C?%EZcK<-V2~$&>xr7r2v`R$u$K+lJF454~waSM~nJnrUzQ z=rw2F@|kN^CQpi8nmDm?ZRLXa(bwF2N$%{}%H))Gk;HpmOzr>PNfjUb>Aq!?-QyCI zVyS)CzcJPuul6gFHSg#+v!Zy)$bVK2r3Q~#``W2hQ>!klm@)E(eP{ZAvug4&`!~%^ zBu2iwD1KV4JGjK38T0nF&z;g1clSMZ(l!4w^1l{th*ieCYp0yC;na~Yosw{4=f`I? zd;2CWj&)aEP&sn$7pf^Ka) z`PB7iUAF(NWPb9qpZn@ReCyF?e&UqK{bbSmYr1p$-~PAn`}(&Yt)8;5?c_D9* zx|=@#&98pz(e>wUyzrveY<=Tf-}doOefocFx?jXP&!J^ncaWfB%)ozx&klzx;J!=xxQ}cb{0_aQi)< z{^Hjjed0&&ZGX>Ajc=R#oyWg*=-iDLUy@8su9@HPi+>-;x1M_Xsx>#fee?F=hrj;V zx1apSpZ?*H6Kt)!=0~w>&PdIQC8q4VbJEDi;&UtZ&GKiY+*m`bIhOR@WFk4Ga?|9a zlIJJ=*zC#*KjkO+%}U>|ipBkO!ku(X{M_WM}g73a#dUGxD&Pp z{jr@Vj658_=3akh;+o(47bT}vOs^2Z?MzfAW+pC5E{d2xPDW5acpKH?T_3^ zRzuS{{>ZJVQ~b&PDajS7Me%D6O_`o*n6kvLom@M44e^tqwCNQi zU#KfqjeKurRea=7eB?(}|M5P*wPN3;Q%CMgjeH|sIsIh6GO;4HHdU1lzF#NZ;G_h(Z;6e3!Jp+%u0A3U z4|(}kd5^)yU!Ap=?QMcxFCaweOL><37~Qh4`#lrt9d##h?xilt0@)MNgiD8CS9;e; z`glTgzO-D&x}W!E{Z?AYp&#SxH$1qtm^bUbt!Ol3^|H_N&AlvOE<5^wchs>#-RI|a z)LpSSXpA>@G#_)|;PMx5?P#sK?Lh0C-yUpr{%~;h@7?SfBgxuzZspVK=2hRa{$rDB z&u*BWJ^SPt*^3%yKYh`!=43BxY_82dzcbspG5>Vu^Y`4+^}hRW>2@B?=C*(P>74WZ z>^A4%E!*$@ac$4fpQ-JA?Acp-fBUPadtGOs?|Ju&ee>Ofn|6;!8#>dC@o&uaJm-O! z7jr8-*ZpnsQ8(^3Eg{3>KXm!#X$eCtl1zQ|wf zLa3>QZLO*=1=S@h`O%HZZkrp6rQE6BOxjq9e2sa~xI4%5`Rx?aahF!7dee};ZEB3N zNiXfqaZlxUYnLLCsn3r?`FeYtDT4s;rh2ozm7cBnICq`Pd~z>#y=1zg)AcGUTsOJi zn*}7U+d7HPc=5D5ufp9HqvL2^GrX8z6RYMi0fczf`;LE{H;4b)`Jtec>!p1@S`uHz zFD2KxyZx9~;U@eacpmM$N!9A55|y4i-%ZVJiZ!|v=Klr!Y*s+`Tz>@x0LX7kd0uh3ujfrc zds&r`%30;67{|1`3<&sbRuDeRon+$fc!j?gIAXN-&M8if?^e~+k^TrBj;N)ANQ+{rHztLf*0N7HEQE-Y;Sa{+;EWpHlgq!ag}U zAHs<{6|U!qY}^}YC*}r~3lbhQRFUxfdIs1L@a}ojyrfY4+5{Cd!mhhcO}Gv;)eL5N zg0VUCE{VBUMk&Ixzj|+3f?_qkVOa2eT(QKdU{l@t4^X z-}K8*oS2!JnAreULBg@_T=&aNv&YAn?^T(Wocg2Y?B51)oGe;%tV) zi)n~mV-&{PC^6K9Zs@f0-}$gA=*aY|ikgyc2I7EOxU+=<;7Kx^Gu#>AVr)n`mG0C; z!a2=3L+#O`xwYlmSm3-p-XWgsz?0`z1s!w$eer=sCp89(^S2#b?A_6^WX^9p>YYCX zE$=_n(eiuu=@z%Lwsl_h)2$zylwH{{{g#!Dv$N}dHRqNM?akRu&+okDRU7lQ=fQ{1 zgAZ@cefyTp&i8A#I0v6T|Lz}WFMRHq+Kb@B7X{8QE_&X*`eF{eCY=(GU6*bYZ-s?w zvK()DD|~D^ESWKkFY-@GoiyDI%DJn!A>=G-cPsxS{tAA@U;Rq>>&bju#g_{X%VS|; za9QzO@!8Q<#A_LCs4C^Y3VvIa>V)5>Uk10G$ZIQHG#hvLB{^-Q_$(B8BrbbX8IS#H zyW@Vj*74s0_jD3Hn#uf3;3f|p7}yWbA?LfROZ>5+j60qLiTy%ogDW~UH8Mk5-uEYP zy`+2UALV!qf;-KfRL1qdDicd6cfFr8x-ZT9e$B}L1-PGUxgWeQ_9~{4;do4`SUi<_ zDX!P;9!MIV7lY>|9mDS)V0s-SJV<}Bm9)` zFyUFk*9ku(`~%@%3Ev?6obU+YIl?yy|3>&0;TMEQ3I9%bi~!qpzD@Wg;X8!?ApB3l zuLzG5ULbsz@N2^N2>(fVlJFwo9|`}P@O{E>2tOeFmhcqecZ7c;$bamIgg+2uBtd>4 zD6CBaN^#Q{58;CC< zemn6y2=63xkiL<)i}>Bd@G|E;#5;&@BK{wQn+bW+?;|b{e}H(H_yF-OgbxxvM7Wjk zVZv>M5%O;*zJu@)!nLIDB)*GqH{m+c_YmJp_&DKBq(4FYX5zmi{v_e=37;Z-n(z+Z z-$(oz!u^EL6CNUbmGG4?{u=Su2@i+yKM+4c_(m9illWVNM+uJ+zD@WJ;eQeyCw!Oi zJ;D=&Ckg*Z_&(tWgr^8UB>aeQknl9&$Ao_-JVW>i;a>|Mq995tDcvRA-Q6H2-QC^Y-QC^Y-QAs{AfbYt|7)M~ytvK>=Ebs1otgRGdoRy< z!AoB813&SG*Z<$2^%s6+D!;Lx-}!?-`HR2#hkyBx2-k_%j}hKkMR-*d5tV2}o`)wo zkw2gQE-{EnCJmFiu<0;Shp69&a zC9n8_pNahc|Hkk9!E65HFaDu7|I&y5=u70dSsm{*B5Lp!HHktkOd1ijiAEjXrY_N` z$2)wAcVrRuiNR;YJBsHZ-Lut}dhIEuAJ>|$ic`{OgOjIN@ zmB>P6vQmX?R3$srXh1_6(U>MQr5Vj>K}%ZEnl`kh9qs8rM>^4&E_9_E-RVJ3deNIc z^ravD8NfhBF`6-qWgO#~z(gi7nJG+V8q=AS|UJKW_S_j$lW9`TrOc*3`Q$5Wp1JiAh3IlJPOgNkK|dk(xB5B^~L>Kt?i=nJi=_8`;T0LvqrHTr?&(O~^x2^3sfa zG$%hTC_qaJ(uzW~rZ8N;bSLr`1@)i; zJ*h}9D$$$D^q~rUsY*Yp(VyxJpauh}$slSmnA!}X4nwKSFd{$4ipc6Qr$HC#Te?`I z=n{>pOEsD<)5zbSzFed03Vlac>bts1W9Vv)scZB-U8}KloxZQ@^#k3Yv2~-y(M=jx zH)}lIqVaXBCeUsAp>EfYbcZI?otj8@X=2^2Npz1U)xDZb_vy#FUz6(rO`!)hr5@5$ zdRSBI5ly2VkM~_tmaH?Wl{ilP=cIx3TwE=t-Ta zr*xK{*4cVS=jd6TtLJo{p4a($K^N#nU8t9IkzUrtdPSG$Rb8srbeUe)<$6O`=uKUz zw{(@>*427P*XUhctM_!B-q-c|KsV?^-KdXrlRnnX`i*YUC%RR?)ouEnZr7)}L!aqR z{a$zJbKR{kbdSE&z4}V`=?}VJf7IXki9dMFpSb)C8IPSlG!NiXSS zy{uF8icZz5I!&+XbiJ-K^oGvVn>tHx>1@5NbM%hR)w?=R@9BKKuM6~nF4Tv*NFV89 zeXL9L8(peTbeVpu%k?{5p-*+CKGRkDy{^{hx<+57Tk+|IvN=ukP3XH1fcyz*|HiD$#hG=)A+b z#2_Z`5sUZvfY`(#F7b#@0zTv;5|W6-Bq1ru_?YCRASJ0tO&ZdYj`U<8Bbmrd7P69! z?0iBFa*~VODP6JlYEp~Z z)S)i*_>}s5#^-#&mwd(7G@v1kXiO8D(v0S`pe3znO&i+Mj`nn*Bc13>7rN4o?)0E1 zz35FJ`qGd73}7IG7|alcGK}GjU?ig$%^1cqj`2)jB9oZR6s9td`|e%~bRmma%o3Ke zjODCgC97D?8rHIo^=x1xo7l`2wz7@w>|iIm*v%gHvXA{7;2?)M%n^=qjN_c(B&Rsd z8P0N!^IYH}m$=Lou5yj*+~6j+xXm5za*z8w;31EA%r`vYTfXBd&-k9_yx=9T_<Bvrc^79D=$U#AJQixm>CO1XMLs9Zl zjC_=*I29;CMM_eMQdFiiRVYJ!YVbL=_>ww&O+8xBfR;3*6^&?3W7^P!wlt+3&1g?^ zMlgVp3}h687|meDFodxTWgNp8&v0fiftgHX7L%CGWaco1xlCmq)0oe6RJAgi0i(GRdgI$5bUb)kr~g zQc{Cd)Fd^vNJDMXQipWZB|Y`Xz^7!SKAHH8%zRE3z91`Kl8vv(&et@cA&qG5^X1lMn8(VyuTLL0XmRD3}y&J z8OCr%Fp^P>W(;E)$9N_%kx5Ku3R9WJbY?J-EM^HyS;lf!u##1* zW({ju$9gufkxgu73tQR7c6P9nUF>ELd)dc+4seh|9Oei|ImU5LaFSD;<_u>!$9XPr zkxN|W3Rk(tb#8EzTioUjce%%X9`KMyJmxtsc*!eX^M>NfJT53nDN0j@vXrAd6{tuh zDpQ53RHHgIs7WnqQ-`|L<5TMM8K3h7U-A`S(}0FFqA^WqN;8_%f|j(RHEn3i00uIM z!3<$2!x+v8Mly=gjA1O}7|#SIGKtAdVJg#@&J1QUi`k@F?lDUm(vpt!WFRA%$V?Wp zl8x--Bp12KLtgTcp8^!55QQm1QHoKV5|pGAr71&M%2A#QRHPD>sX|q%QJospq!zWQ zLtX0eDfRh`&-sEc`HHV;KtmeQm?ku(8O>=yOIp#IHngQ3?deG`deeu#^z^*bPx~`~ zfed0WLm0|1hBKNmjHRjPlLP}gc3U8k*dgU-{9I$SsDT-~g-e9o~&x3Z1x>|iIm*v%gHvXA{7;2?)M z%n_z=ltI4kF&*c6JFX`<$tf;yk!xJ%1~>VIUrG6&`wyuoNoq=whSH>^4CyFKddiW3 z@?@j}nW#u+Dv^cCWTgt(s7iLK@d?$*K@DjhdtR`|1$$nw#|3*{u*U^^Ua-dn zdtR`|1$$nw#|3*{u*U^^Ua-eG_=^0*p#X6yNIVJ=pTZ=d2p>|Ek0^#C>FjaAo)_$K z!JZfFalxJ!>~X=K7wmDto)_$K!JZfFalxJ!>~X=K7wmDto)_$K!JZfFalxJ!>~X=K z7wmDto)_$K!JZfFalxJ!>~X=~6l^-d<`nEY!R{1nJHhr8>^s5!6l^@f1{Lf)!44H{ zJ;4?g>^;FA6>L7iCKc>H!7deSKfyK?>_5Ri6>LDkMiuNp!A=!yLBUoP>_Nd^6>LJm zUKQ*@!Dba~L&0tp>_fqJ6>LPoeiiIQ!G;xVMZu00>_x$r6>LVqo)zpy!KM{#N5QTY z>_@@26>Lbsz7_09!NwJANx?=I>`B4i6>Lhu<`wKp!R{4oOTqRP>`TEW5+bJ4kr{Mi zCY_l@7iQCyIdo$#-I+%Z=F^h}^kN}>SWI7*(2u3`XBh)n&OlZ$h?NXx6+>9fP}VSv zwG3w+BUsN!HZY2fjA1il*}^!sGM;TrU^^4p!6bGvh22bL4+GwF+cA)X4B`-jIm{4_ zFqESV;~2v^&InF0l9P<$6r(xK7|t-3vy9^$<2la+E-;acOyUxgxy%%jR?CpPh#1qt0QEaV`IIK*NOvxFloo~`H&a;6FY~&)FxWr~IvxO^c)O zJM85y`?$w`?o+&7h-g3w8d8!*l%g@EX+jyAQkG_vqdDbiK?Pb;kyccqHI->Y71~mj zc2uK1)#*SDI#QEP)S@%B=|Ua4QkQPjqdT9{gZlL3GkWnkz4?MZd`Vxvq90$=pU8vA zQV~eaTcjZhX^BcYqLH4r$v|{6@(!7Jm(0W<3o*&cdt@UP*?FH&_<$V5CMR*oMO<b`dOZC%MNBiX{Pd*flc6Zc>;#uB#1sCq2FEU=i2ch-}ScWi+* zV@txwLU_%72ySBmA{ZjT0g*U~lX1pQVrI>Ln2D1mK_s3m3k*>b6AW<@W#WJn3}}Kv zl!S!+{+{Pl-MXz-OR`Dkk68=4>Q>cxd(QKIp7We!+Z$h>CP|WhJw5-XaMxYwUHY5c zl-*_bx+FKH{J+7S-SS0K_xxztm765FspI#0?63LG%5cr@dh1)0o7(XUKId8a%c^@T z|HU@n>c#mP?$V#PQeoq+x5nnG4|x?^SN-;Svg`p@9!}SO`V)P|3u>d%@MB?Bw*9s{ zn%iFchCO?ehVI)pzxKvG+qd1EwDhaPum63|t$Vj8seX3t0uQd%b9H+s!xcx$%x|yKcRC8|AIK)%J`6Z@BH&*YW26*q$UR>EGV+rq^$~t$Nmf z{{EL$_H@@zcZMWV=f8UM zxTf4Tn_L=M+DIGinY5W^?TiO0k3k>)YxsZMg(Ni7wB2qd`hc&pP8Nbbo8teiB%NB@ zJexcIYw&+wG--_g?9qvTXtvQvnFaoPL6WL|>TL75s#ouL=Y@OR^s=?a&<+WmNRvKaztCGw zR)=t2Slwu+yVFnd57;NGTkEsC(qeJ(P%?Q}Qr!3HPuleXUE2?*Q?1u;fBhTwyg4M3 zx8C-~z1wcvd#iBohW7S5x4-U9-2HD&o8#oh=AP}lcfA>s-L`Aj8(yc6KAle7yuJGM znRNA@?YF<_);-(bcq0|<`M3JyaP1*9v1i-fH|*izS-0NCkAJi6b=!qnZ@l#lx81mj z#}hZ+2*!fn@lGJVnSr={mt~hq@PQFEB)>CchV=)&!@keej$A_{bKs^|LMwq z_O9&mtG8bD<~v^htLf#h+kW$%m%rimH|~A;oA&Jf(RA~Vr0-7OpI-KwPoy7BU-sGX zzVrj>ed&Sp@?T0HOJDx;>CdGfN-uvn{n_-P^d0GY(oOG5U;gW1G5xXh57UF`htq3* zJpH5er_#HAGJPQ3eNTFKdie*_n}0aHH+_40`5&bF(s!o&)3>Gfr;n!ZO)vYe>1AIC zf1O@-`M1-*Nf*=o*=sKQvG7yj^7n;%!+~)1yTgx!_lNg{_lCuA`R{~xg`Ws_hkfBE z!#&~c;pKlviGLR!4Ew`Rho1@G@lJg_yzcVJeb)a`o_VdlqxGR0@_aw!Z9mCEANuJJzWY7v*@^l`O+>*Cu zLub&QN+<1Z*wv+RrC#LSe&1hrd6{>MbjPrLN$BWVl6Q9$7hakqlX+SsmnID>mbblN zyDZqYT9drJqZslrwX~~RvRGv2E3C10p7mFIbE8su;OTp_b10ZmN!5HKZ|^M9S9!rA zoLI2H(36V|GR>{MBoD=R z(%bcc05oh{XO|hB4X6SN<8+`{YXGIc#v1B{LM=3l^h&C36#0%p#;@kyBHuYkv**-^ zj|eE1ZDe`o6{plXOnb@XB(1h{Cd@}uBvVbax%UD9Z?EG%lusXS#M64R{rbnH~LCn~s2HXD?SZe=Q`NNZZ2Lt(k(=^0^WaU8gJwtiL zXee}U@36u1G;h>~(x?q3&=ESQp=3UktUi=14kh!UH2BDdlKD`$#GwF;m4}j@Fcjeu zL-}h2&uAz#(BF}V{&C<8q-mfpSb=%7VMbIS99$=Qx-^;ckJYzgA2O+Eiud$^<2r-d z3#>TMv^sqV{TEhs0)M)nXYIC7X!6 zQ^oR@xJwgqjs;s*D?BsuPF_{Dz&xyo@lIYC@3iJdr7GUpWL8?E=4mPNPSq&hxujsp zJMFdc&USIZj=a(Tl@x9V(KPe+Y`6g0<8opDs9k62eA@qzO#zQPjl1|Z-@%`m5kqL_ z?YS^D>~74~jWL8SlUk(BBAFC7Xv3+&yx&E+ikSC5H0%L)qkk*~ZGmfIaD~yf>x|am z3U6G>Xd6r5YFPctlVEj_MzEOf95za{&PHf0!W%S&*18*lT@kG%Z2Ib$e~N-YA|-c0fqvV@L6a{5GBqYm{2@d;kc5z?0?*T#<<#b=Wp#c_IzI?(CQSTQ7sSLJUP@8KLC3_!RTJ9O%_?3=Z!Dx6H7P;_s3*?u`wk`j zKMSTxK}O#Rn%~)Q?LZ$0pKK<#s0TtQZ^igW<0gilH&HsIBgiO*IV2|Dusz}6gy)etdZ+C=suBL@lr zAp|s;I7rGfHAzYhq~rSEm;QffN87mq?spBgN2bCm_e&g2%-n1XHbN7&|MwQ|Lwf9yPXHml{7nxPz zejGz%(6({t{d}_83r~B2*dz)H#h#_j*|2NS(B&32JsWP;cxS^+!+x>Wh5^Xb-Bpte zRJNjz9e&f?IUSPJI_bt+|3KEmTp5U6($ROxqHF0P#uyL7B*2!^BADr4y^c;XR)+y< zyaoyuVUoUPGOat}=Cp;mB;dk2_Y9kH8nP>UQ2I3fVkq4pIA|6CWok+Q^Pzv$hJF)X zfwfomBubtFBB6M;(z19q7jE8&48p;5Nw`*Hnh<^=VamR)KS_;(+f*!{K-KG~ZBu<2B9*uLb4HIWWc+2BMK6>?W%zchlyd6 zX*2Mb;KTVM?6a{}*av|M`x>fS-%D-kNx*q4Ku)(?cDmFvC(dT@V1kxtrCYTTp%mM& zq1-aCq1-$$AXjZnY(;VKhNedinVo43b?u?NMVp0t6Nr!xg(=Nm&PP{s;fpJ{(9JDe z=;G!a2jK*jqGhE0KQ&z2gjQ`7g=Pvq%!SQ@RASx|0T6klh7u`0T;x;&*O_!RHlsrDd=<$?53~7dn7mpbkuNp#%89O0SgEf~mRK{|<+lP(*la1 z%)46wz@8o~z$DJ_8eS8Ri~Knr8CHMVOehfGzr-Pr9({k?g{imPR(+H~cYPW$rAX65LPbjC*D% zeJ5-IBFG9cTwn}4zPi^e?*5HW%6dCTW@djIANH6cu#3vyn^C;xdbR#J27<_f*;?Td z-=kxW9xN>)x)hf(G--0Nc})u3-G(9XnWPYT3743r8N>?nJ{vYT>NahDN>8e}N{f{4 z$#Kd!%`LGw9l8$8!zctcWlmrxDg?mjIn8=o`CpS~(H;49Z2D^cxa$rYIP1{`uH?_}Cs*#_^0!=iZAODWBA9y_rbtB* zj-oTc$AE~`J{b_F)vBSy*Q`|&_&uvdQoe`#)S3``G_=8l+~R0s9-1rglY?b(O071x zfar-oL}%{xC<~iGs$^1?gskdkPCvmL-41}=Rn>rGvzUUF(Js?UqwA!p%qJTtGHBpN zg2Hgu8@^(8qjjZPMPVvHc-M7!Deb3|@s#Hs6Xh+}s9J&}h~F5r3bc#7g_hCAsR~ZD zU4sH9s#bN3lpyRfwfiQ@@?p!Fb9iy`k9hNs<-aNVd-u4k zxKK(WDx-9x`Q!rEaEz48(dc>CUmN30(O{(b8Sy}f&AfYA(v)9R_>Q~RJiU2C>tc9O zMR54CcCdujzr)tdr0a?)X$BF7SM|h_Y+j#XI^w*_aTaHj>Ei3TaD_8E7+@w>NGVmE zvJf3&Ox2u9XWpusOQpHXDQw-u4=)}R4EqR zE^rT79c5{fv4Y6>*as8i2%0ZNWE)mBW;_Q1Ud4N?W56dcT$GKjv-ICJnp(q))gMNMtH1+yBZ!(7^Z+{s71@*v1vD_!eir>($Iu1 zkpMuFlkrXHKMEgEL3Iy|SaA2b@R_U$9|=0CI?Ko~6K^KNB+XVLHVMB7 z^qsOM5iNGYnJX;&?>l3K<#)1jK}#~W$;??az*5(L>3cq<>mNwKUf@E@yZ)muyixkX z0jzzD$JwF*f z59*&-+sO6LYjgd>Aub6QC5 zXFIMa+A>a%qR9I7Z$w2gn4*Xk1FE7{&|MTou`23Y2_}P zNpV6g=PsDVfZ&$`ofe<{rZ97gy90lwyBRe?HT|y#Q(I-jbiAPH;8j8YTm}DzVzcxt zW#v&7=WAXUsPFE88^yy65JcU0x2Qvri0(fOtU-5XK6^X z1OvFolnoPkA-F?fqLfW$0||IRvdS0w3&Bj$nSlMc@Yx! z|2TaPV>de#n{_nyV&)o+9ZLZ~lwf#n5cuVP8qT?^rIp45S*g;08-i~!iJ|`|(nOA@ z?jAFgMNv5pE<{&dKxW&@5s&{$7=a>z#P&yp>ItsR9HovRA0QtdO9`{dif4Gl^c_uy z(gRA}q-^AwvXL-YBZQ>fpQaFVkP@_p;>W^{fg&#UWjh9hDHKoedmZA_)LPY2{&R&k z{&EdSF2mHcm1)<3rlStDMh~S2Np_qYorVp}Dzq7Ym!9LAP*xnF|E9svwLePf8rLJ% zYmuy1pGp}D6i(GZFFB_;Ym(ldJD8SN(!Lo?1H(0PMrOs6wJM)10l-_7m}&cBKKUY5 zI*_f5sYM8<5cMJe`V>As0rttDKFx+F0)8Z}hr@752pO-CgUpjK|kbK}%D0F*|VPfrt0>L#N@ z3g@Fk1dosmo2d_*d%dAMpJ8RYzb7)c?T0VM(~xr#VU8y$9?IJ%KIR+q$qukUJv4-vt)_O8E)>0ioXAY>98)yEbGmU(lE?woDPFQu z=vQ=KZ4yQwJC+f}x$`3n-%0NooR8ZllS?7s-&sfpx$4Qi{`~yGc}AxAPKF)Kz>BV- zH}PSkc$wl`G#Wg}7>LEmVp8Pz+hs@ct1pIQr8_Y0OMG6iXxeWAF z9s@JAr{T5cSHRErm*Qop+J7O*+%V^}lVY7Nm=1Gjm`e&Gq2ER%)_}-lXd#JNag=FK z^U3~2pcwV)XGcGs_1X%MiXIJKAN*)8J01ovWN1TkU)jhlUT|L~OVQaUJh=Flq)Dg0 zKJWF`pA7fpl|aPL(IdHmH^?(Oj)jhSSeM?p&}V+sAIUj*?`-&X7}z6v)zj}|VX#V2 zDZf9r{Qk-w-Gf;hq8|^oj*=yg=tslG>~NS`D+GsmiOh}NmlV5x>MWk9rhCzvzb%r8 zojw*n2Kwd4HXz3bBMkbgbruRcd&Iq%ZfN6ZS=mIq1OA%M`=Yn6OU)E+Y zW?oOI?S&_=%_bv1=aTS@nkhe|d788NRy%Q?Xvg@e@l|?nz@)>g^gQB|kW#$hDOJZx zh>c>^B}h?zV?a{vjNrs4C$^Zc+S(Ho=dx#lC^xD!?xH|-iAy&S*ypLP_(G@%3>H5p zWd{(aOOLS>W%K%rr-;KXb}3h@;D$ zrN$Ya#q`y5IRT`X=FZMD!6Uwku?KgP4V)P>=q%l5${(FLy_c^vkIKc0fcDa_$3*IocytRi9`dfQ1 z$fq;|FQ9kDLF%V%;qHCh_Wkw%x3=DAC~!i)^t5|}X;Zbae8rKq!W~=oqwDwbb&}hN$(8*zHD{&&#i+IF%F61)h>reT{Eaw+~=M7xIf8uEK^JT45_|l}qg)nTaSzL7b zf4J&gYqyw$*}Bt?cP|88FDDotrsL97esZHV@eAWX0wr^om21AnbrxZjfC7A+GK`9< zYDB8_nweD&D6kb((;c9t+7m!RvlPsks`)xxGf56hqg1W)$#0E}y{49!qt5y%``UHZ z&!)oJ;t-Fh^HXW5waO*SBHw&+NYzQLD+3nhlTS(^lS6sX8#CJ=5gCZ6G>Y?B;<)Zr zdg-J_X3kzb$wB&(y)(UZQZR|K{W1Df(&aCyNqX~`^~Ss{)<~tA%Jz|JI)!RF>4Nsr zTKPxIQ8We`nTz821=}LE94%`jOd9z%o*6lc7%tQtE53 zXp8VW#ebE)*hVE~&j{SamS*j>l!l2VuTi0-9oi}_-RwD-(Bk(XyB(-OsvF+E+o^pD zImhH3h4^AKhB`fsf8@%a)WU$X>HsEXqxtbtLM1*HA3^4t~lC{ zs;aG!uh!s=9Z|sa8xs)6qkuRTL|dkk86-`PJEd2m)K)F1cC07%8x&0QKG-AH4YfeP zsmYfWI5=DnKB0vN=fGlUbjmX-UWli>o7KV0K$d}@y) zZ#!T$IB&a;(Q6^%5`*Z)@w%M=Pg&lPhi|O2`eyes~c8#_K4L<;<&ax$j>&s%4ale$&nIW zjJ3n#tXSka`o_!$FJ`>L`AMB$8b`C?7;4EOEDmt?NAiJ1UG2VS-_UrC5zmp@Ja2P4 zyoqU$P%wOqtU*d#txjmP_H)wJY=~!Ia#G8^b=hEs3E*_TV3JPy;K1Xh4seSqE>Q2O z^JiJU6@N`(_Mk=LU4vV#G15K_3(KWdX{fHh6tl~v)L~s4mzj+QQ&A+v7u=Xsgq#_M ztD|9vz_3z`>oDD4wH33?WSbij(a@Wxe2fBNc7evo$^%%3!$43oqu_<3kz?*KtFnpS zM}LYB0F04Mgz9mxv58e~5MWN)j8fHT?>t)&^Q)nyGV)XlP zmzbvtat>~YNCj+%n< zJ6oNfd^Ys}(IaKJ;gSeZ;V#1K<0+7WAM}f!BrTIwZ9Ev57v=n~NPx z>dY4RIGF#EfWK%LS)}TV#K4dkAkQC9l=K|;TbK|R5N%Lt8B1%iVf?9n=X3%5t9~mU zkY)Aix4;BstKam4E&1`cL( z7HEaJK$%nk0dSQ88sB4K5Eh`I@h$zww;i+%23@2(r@JXD70p(=(={dN;y7h!weq>7 z#r_{x@B&c?3f=6041`EAPZw|}G`u9>tL9Dt3h2Y!&02&5JS$})YcUb3?Eb1U1z4-> zs04ytm8(iBSJ_cmgvvfvm4#N-k(HWo~^1laV&7Z6`S98e+ksn z7z>;-)s76?1E-D@7E397TQIkM+0+JWv=0DtO2qJz$E_)GVoCu=K%6^>c{I!26wiGA zHrbut`kZdyZq{a~VRMQ)Ri77}d776;exe);4LE|tIppQZ5d@aMOl8kJx5{8QB@mXy zo&7&q_VLv4o+Ma2wJ?{Qy*{~ZaIiRj2*$Tj1_{3{!>0Kr;kK^Q5a%=sz(0}Z*zgLi zbwbt=wLxpr3#f7{%P2%3nkyHq)zkiqJb*L4CyX(^2d%17wxP*NfgjaV7(x72R)n_z zYl{!{$XK)lFVEJ&KP7vs;tV$yH?bEx0Jrj|`qH))jAF4A!@Fcp=+7#G=w$y)x=l|_ zOr&9A#CH^;WU%O#(oQ{the#*07oD+RZRyd~yOwRvD8Do(Q1wosCFPgm@u&wbG+d}| z?PaI>!2AKRzGZ7jsox+)#TMCK1r3$0>8UsDcYSr?TMJ>@GY}jNW$ZZ7Vc$g3>Ys`B z;j~ZQj5s{fSF$$<<1(TNc`!53G&4DQwu2A{bk{;oGKtC*;+^5+Bk0*GQv9|nVn-#( zDRLypL{}ZBQ}?A*y==8)2=LlOD!O|*4Bc6wh}5x@#7BDmrD$e zRGtufE$a^3xwhdOQ#vLJFpMThlsccaD3VBxO3Q(;QvaY!+V5}7v}LJJ{GwVb_vv_{ z+K1Y_W!R7CHK@{OF-qH;+<&P?v(6j`yal$qti#VKl|%bg8b5yBP8op-Rx)6C#*T%r zefq!r_=leT;{Wwc+kkFgJ)aHdbXIeo#UxKYJ2uyGDzsNkI8ewH=re|ez((Ol(cY`| z#;w|IQ#?($7p%#`zNB?L&hIYDC#WSWXHs*B<2248!(k5fP$lk9 z;{J}|6q7XUFEoB=xcZ@d^+M|h&y~iBMT*La1UxBV=)KsNaR?38SzE-1ta!hcWg3by zw&`b0g_;OCu?o!*h*cRGiXe7Eb;iw_@D1i|==PtHO!4{mTFrk|)-01S;wG!7k-uFM z_H!3;Q>%XuzKv4snRFq>HCM&`7sT#SN$ulzq4*X=8S~kN_L*&fjY#ZkGK7j)v-gJn zpQlsjPFg&RRgo26T+%}tIgK91Mwj-mY`V8jtH?ns!I1IA=A=3q(w+cJ6Fb%1Jgm9N zMss76a;9_Rc$fDV!VeAmL_D#6^B{%EEKBhka{PS#u)9N z<#>Mvr;7R9@c#{$&kE_w%>48MW&IBZ;j?%3$O5WOI$JI%Drr4V2 zNHo8&grPkTqKTvvDP8QgAp^fgF;9zwv@5W&4pBj71s-<~!lmc|5wjn-8uKi1MU~We zoFtRU0DJ)v8>sJhEjVo@>mA|SUk8r<-lrQIUg&u!PrPRcD zkI#-=St^dI4~l0g{>Fg9$LNit|isIO*)NwxI6)ZZnhR=9U$US zU)Sah7@P(aPBCv(Q5)ZT)r7(iHjM#c{G(-nu(dbs3X{**hgHqg2*Z%3&%dWsQtN3o zxw8>}E~;~A@(8%k&HMASHmp&9%u;ZTa|Qfa8FJ)4U{UmB%z(aPkr0kYw2YVtY8g=j zB1(|U1I?CK2~Qzi|C7*E(pCCa>gpvc(&g?qz94=kT6-A(Ck3y30l`*~qViq( zWhD7!{-Hm0CH&1S?8*{Mq(q&(Leu6QTkaP#mPS#+m=&lBe_2rDpQ{Zl#g!;|7#8w# z0*Z3AEGs)yNyJ}${84=@(!ZeMkgNz3v{+%3^}lXg2%`>}GXl#E#&wdR6OMSo&`nw& zIC+`nz-5B=4BJ5jx)KS51RX_-qQdfYmadDR5%DQJaB~PPxWoj8ZnIx*isV%tEo@U{ zCUZzH8kj?T4SJ1Aed`Z?>la$eg=il{)5n|IS>{Og4UkJqRymU621u8n`b%UH@-stz zR^qc&{IZxy*8i3zWA!O*6~Cf~K@ZKJAVg{vpU}g$9-1@FAO40OPVvxyazvC8ipNeq zHRx=n#u_Gf9Fwg&u!uGiz$@q;4q9eEGb`wCWh#1xCC#&%fdETVB5ARa(sKBO7b`4h zsxTkRK6lRzZP3%YX=A|BK$bkO1~~rQKz7*tR?lgu#x(@%lMEGDpFlcRCU%kcp!CPg zDyt8v{#-+v4dR4iALG1`VF~%pm=_AF%oPmT5n3kh8PbkzC>CjGL-7&{7)}(j4`&n0 zB|3r6zP_Q@3OyfsqVqz1DHS9PSR=5MlB?v1SX~6fMg8A=?h)d$%mhQ(!3OaYgsV~Nb>m~hRC59-Tt;hGgcp@;f1g4IC32(U{hZnh{(!^kU$%2`ip$`ha*6JnTPy7@$AJ69_!f8T7RTqCc%eY*$j>D@d z^cqVuUm_WqtSWU(wazCGrV*Xd7nMNMLZ-Djj>NG4)}J|HlvLjANt zeIfM?7?GCCg)>o(NhVcPz4_ z4;+hedfDa>kV;$UqPzbIOgx&l^>v;{<3{@emhu=2>8h=$Nq;*a8bA-&?AATn;)wfh zVh;&5p4L*enKe`um%zbt%dSQG)0!ZtwY`xj*|^+yvJW1QAFNP=fTX=y)(n8IBn@?r zBn{EpjPy_(>Ei}}ZE;{Faco6<96pa*sl^IDrU^e%1MApm9*p*;ZNZYlRqKrkje7HV zYI<|5_d!WbDIxsjyIQI7-aKffcE`z58J0)*%U88BV{7u8)z0-^f`oab^hPskij$(i zTb7zeo+zv>;X-tS&Z40%e!G~uNRNEAZq)k?s&v*1*i+VsJOIbP(Wxw;BWM%%+Gwv8 zF@PWGgf?*(ipWsDb1ocg)Yy`33DrOOu3?Dnz0iairc~+??Y6rM&W#-U|2P z^(*xysZXluDmzdubwpS(Xnnsy-y@jgQ}2TwT3;`;#th!&ql*P@lEOU~SYzc{Pg!(U zvzahmeHc1#^hq?lEL;0~=>UUL`!>QW9Lgm;#p_N23Inj?o;nXhIO&H8uSP)gGkJ2h zO2|h&dj%BL!J)j7TK5 z(f=N*IP zs>Y6}tqKSYB^?V@dFh6fBk35Ff~LVNS$5iJ9*{syVVy&1Lh|w`7K!NVp-^aMpoyb? zkL+Rs;xaey$iyx6jp7)qM8)VrfS6K@@oM26i;Ig#SQ1CG^*o#kXQT2mKpDuD(Z{}W zE=cme7Vum~FPHC$P9}Gomf48~B(`*P{8vFFru}+nGwmuRTa|k_C49MpL@|TDvkjnY z-&-+LX2B&}C~Cf7&{)t(W5&|yw~IK%h%2TfUD))FJY87)yX>BY*>~*I?c%rF_bjZl zr;CfnSKYJFdB;Az=AQU8Ys>tGX&1s^C(nwJt~e248wszIoOv9UkrLN4$8 zkj12eeQmvL86XB7QC+L}@@GH%PhSCRZ51=SXcHXD_|So6-;BEDJ!0=MTc#w?+O`>w zlH?9TP4`Y3y;*3G@KdSbtdr`UB`+5KC`nv}5dk`&sL3sc$N*3f**Ylt);3EKh*awt zVO^|()r%%D@~C$?Sy+1I52&MaDL7M6FNYG2l8}x5Ta^9O)7TFJpsDSG*}3I&6W%aFV%>zAI`C-M?=9i7;hLF(keWT1Uz66Pu|HRj|l9J9uw z&dHm=-!!R6CpKOSo>B+8BZMUMjBy*CU^a_R=q-rJ@dQFcK>tIqJ{^yw>6TlOmtuf? zXQa>;orHn}C*o_r{z1`62N=m?G|Ze%JUeGaC%|GCZALn=^x(?Q!>-o5f1}C^F3KgB zq0xyBge0|lxJraBQel|hPx?qjVnYgFFS(p`uzU=um^ajkNP>`}ig;rnQ;Y#piJ}mt z&PW9k5-`<8tC{H&JE=%TgveMyOgM(27;J}T zF4r)FRc7JMT-dm|iOa+#;bJcAq9El-2{ao`pJZ^R+1)YwpUFbMmmdEz*__%{;G^M_!(qYpXqsudxj1DP_K#Qk>v0ZlC6MK6xeJgGXFV zl8Yd&bWO(4+h>%2dbJQC^UzF%m}%RtZ>iBiF4^%2l{G-0drMi_^R8{;_zc=q)ny(#EG9O6w`_HjJa&pn zwn}U1(Fx7a<^?Odkg%zm;>!Hx{H3Lo06ejSc4&Q?%6Jl6M5OhWJ#S}9V-Et)e3Hk? z=r|p=EekvyAYjl2JkPjNhOhK*lqs;|z^GD*3qk;*OHMrUw6!gFLB~(uu}#Tzxz9T? zrcF7JAYpY*9a}FMS7xOLhdpsY!_y5=iU&%^vW|2tU5`CQ+batzcZ`FmYopS>$l3`! zRvp-2%g!HL0^XW2Gk$bgXl_(lKsaGT!LSia37*Ss) zf@9ob-*zTXXAg2-*b4AaGR+8|+98HR#oGMQ2e7Y6TxR`#b*+-H8AkD0?o zY=mcXK!+Sdd@4PDzb$>vJfy^b%-hn6bh?iSEIzkmb^xwvF|@;L<<+NAAkPsomQllA zek|?3EyEAO?Cs|}qtZFNaN@(}w0#%biGQ3I zK>Gd91aIyBlrSeo@<2K{Set7bi`kAuHjCHWGXaFc}Jzp-jDKgms71D{603zkc zYCSrT`k_SkV(Znvw^J1K{gplGNX0R8dy%xHRHoJZet@(~VJ+9AOknY$i> ztlCx9=TQ76h_K{bz&NLh|61D74JHOw0-so~Ca~l=va&!^?XQ<=sFT`hUgu-*CAM^$ zcPv3=-u}o!{*Ih98{hfPcQ6NK0ykdL6fqXM63?Cz&v$=Fs+WF(KbRPF`K~hp4#2FHCXgD=qtW z`P>wDw#H0B1lltr;+vKNKo4ZJo7Rwxj@q{K!1(k8#eK3;+^-)1wApae0Elypm$?J7 zd`5>VvS=w)8mFc$9^`A;fDDI(5Bu0@_a^R385%`5p9tD8JB#82qpmlEc?js+Msil< zaGx$c1&0}lNdj!KMQFTMdcN^8;V;A6Wjw|(z_zjmX+lDAa9f|C5be^$lC#1RRya1& zgWV^h?43?Jm{e4{kPKk9;AcBOTbMcnrh+ey9Cfr1X_!i42cDU&zOw#Dl;Y0egz0~+ zxam$_PIs~ylSOS6?49D$K1-&wUXr!A2A`w8xxzczG!O7=x}&L-B^#4d+`Qoi zUZ=E~;dI)aMroykNH2ljx-rECcuNbPxg5kpxX~32fc;kZ$$xm#-8VWPd2|p_aTIf` zU|3Q67X{V-NpapZoCKjq*1)>b7)a6n52F1mIoJ~IA052Eqxi*lRKXb1$&3H9{`;Zo zhq#L61;AF|ZZ>T3JnCq3oYRXP_an(aPhi&t#to^E@k@n`}&^E-H_GSfQ z^X##s*t6zYcnf?Fc-#rk;DX0Om))i2COK(KI%aoE_vm_-saA0x8?TATSdwLm*P@1W z$!qwhbgVMJvb;&AW0mI~nzbHbEEQT@)9^ZzaZ^^dUU~Q?9YuT$C|%ZF6Wy9__TcdM z+qS46^0T~-dpCxgxx*s8$<@HJupjeaqgAgn?LGuDmi6{6g9!(W#Utz;+8VM0rk9?h zorfK1PN}2RPG_DPGZ2h3alA zs0k5-p^qAVl5<=}x*8eHr5DC0z?WxG*m&@WOEY2cYjIAo=hDKb${V~7*E@||r*n&K zLf_)BxYJ>=mkZA9-INtSE7tkQWZ`rCAybNvLRYu!vw~0~c=4yR5Ihf&^0YLu=e2u~ z(_OzQztdsRqE#K$ZY+oeglk0}gqQ;9L3^dL%)FvF_;a!5x~lj>7AGW`?6?__ zCaxw|?>BGEaVghFzC3YL&T_~Y#=Xg(Cegcfh4vb9p!3M zG|gOoHT8@;)d7FP2YLOVI@*+yn8IGL%|LCGUQHvdo) z@N+;|a@b-*oU8qFVJ-)ZA2b5NNsKq;8sWM|&KHqF#{@a+9`N9TGfZIn@Ey}Cw(R8Y zYm8AYFS~59rlFA)4lkL`JNOLHaQyHRP88s15>t4fxw5{}&&50R5&N80s`DDGz*tsI zm*ZIF7T$C)Rexp!Ca(#0@@qyfj5o%pyWpLJf-&nHH}aTPB6)(i6(QuJ@GA zWwovo#ER`(e`87kP`0e?Ko{(t4F^-g&#HdFgjh@gwI%0g@u)2QSk5N=QlPcj{~W}_ zt%)5Mf;tq=`??FLSk`43q2Ap%6HB@qTUVM*`w~T2m;}VY8mY>9Di!(nIE6CB*=b3Z z%T$W-oP&r@vnq=pnC~wf*e?57b8u=w3P!x2H#mdkgvg{uH${W!gt&MyLFZkQ)|P## z -P?lX?y)E6nEI%wRF#l%s>C;hxZ=h}1*CAsM|CLSDV%(P>)XmytlXkfjP7aAE= ze&2=?H#mAU``^zU;b{tICu60YUpnYWA-uy0vE3J#)UV`2uMk9KeWeI~9}_!Zf-Wf;KcM3Zx*ATmpyPMSF+%f%v!jnsZsZ59VfA zT{QQ?#yAjVaWTJ!MWVr4=4p!VU=qpAK<;Qh(fXh*Zvb;!AA}su%^<@m$C<|G=4McM z0QGS(QPPlyh#uIIx@a$q+zb|@qJm4;2UBJerGp_ZrkY0i%?6a!`dm{BRr%Sn=*ZwI zNtovAHfHK4QbUK9p*&%CNIl|n0l~3Ec1byRtHqD}q)U{D7On#Wr)$@=*)nz1s0At( zN%<>CtmO(b5C<i_^e-bF%OV_obVlxr=A(n9_67|=J2~t~@e<1@sohlPk}_$_ zv`gADeY9jJDzk)2(ckqHB|H+WIEqv0#3W6%s)iz+mJOXSC=HT^ER!_a;8wxMgY&!z z@dQ&!y)|>An6kY~=i3qrEY%lZjA{7NJ^4bqCoE+*7dpC2Ix=%d6FC%?1dB}QFy5dbQuMdW4=*|E~^dHHB<$4ZPu8@uB~)(X6ab>R_>hK zOm@a=-o>ivFm2}IIt@e=enIjn-VOCvWP%|m+7RM0S0$NXEOM(%uz36+4=cnNE5xe7 za>dT7ps>nU!J+M~Pz?%%9i3iUQxGNyfHq(_X#L{1V5ENO*3_Y0rg%yy@qapF$Ii># zb6gV++Gxx)v=PLBD!ekF6nUB%mB#(3S#N(n8TzgS%a`V>u}I*hi?MQXM_J6BEj(ft zn};eWh^Ab9y%5tSNVH<7%whwYeCA$d9G9)y&@4{8&~X_JWa84E+~y-Hd_8 z)iY~fuqtM<-SBQnYZP$I< zb=|jCM>bxEy27=Fke`E&(Lzy53{AZZx(f5n_EVV?rVdS(q}7; z_`8_prz@|Qtu)@S5wYODd9!AqF=ad~ySd)Z^boexYK%v_fktzI@`xufr17fZjk|rF zN5Zh>i*38b*(TJjx1dFExf7j^%U;%#a5t@a$QC%gfOo(0F|NudqX=K6#?&I@D&}FG zzrk=l_VZuZz=@t)EzM4=g4s=jnT3>~0hEGZ;<<&YK+E)qRaHI2ShMK&=vp)2?B1Ad z5^D8rrKh6+K0XrZL`<;NyqkS2H#s)lATktEO{i*h4`;v?T=1>~TQQE!T#zf9gyd`F zZRu>aND5UPv5AV!17kpaX-F=&fjYcZTrDVSgoPp8q!L=95H0s?;zEnpaye@wvXA94 z=zcD{)}k#iA?;LZ%5RcUWD-{MxYesQ0cMc2qFXUCTY-yXmP;ng#fnbSCaVnqMwkH-uRM}cWUX% z6LVYkw3A*CU>$L_)PWv1Z~&#z^73|mh3pD7QhPXxC&JP`rjDf}nQ;3yrW@+k0NM*GjW z63aG92MLdZOO@#$MO+H59#5jSTU*6cuQ9|?z00MUT#^bh8VeTK?WASZ|K2@t#WGvX zZtOk7S*(^@bSH&iUY^KZ+MLGd{cQpvzd zvR|R67EXfQD>##^O@#m5L5Z>4Z8m4m2_+n}Z5D;M?vW{{8O-~|G1S=FTfNetEj}d9 zJY|1XWy_pjr#UZ*l{k%g@os@pCRw<;5o~c0yJfAM#?%n^Q5)!I#s+$NNTeE0qq8wb zUEDT6XKhDAB$m@}sYX(#7``I?PDue6PTwU|9LtFI_lJsqrx|L-^hc+OPKp~mjTwsR zqn4tRGpf^@A&XEPamSc=%iKDaRSm3^1Ll;|qGQ=cB=muOj5#~AF{_4um@(J-Dv9tx z>n!+SRBGLklHHWc2`_1h z2(NXfOvS!R{~O6yi8sd}bovK{?MT)W#jD}t=`=E`?9ki1GT3A_Ge~*DuK9DK^s2gQ zYThYPR-EM2aPvGwHOXG?x}_7Qu>uODyfU?44Oqy}zQKazY{j(f-S!di#9Y7>qw&dZUWB861zs$&o33R(J)M_O&wq)9-Voj20i(oz>xQR#xX zHOoEGc;a`Ur<=*FK$8O7-vNzUv@9St3wYN@;9=iprQ$x`%~SOq8#C&BB^WlzHhLc2 z#~yf2-CwS!-yMM3RGm3MjsRf!(x(J5~{N0F%keH`^aY0_`%nJw8E> zwX$M)OOr$nfwCY{&psx-yd|nqdVyLk?E2YRbYJCViV3oLSaYLN_-Y;{5zL$?s*+M! zJjU<1(O9)jjQV7?Sy~*uP;QVVwUxO+>@@;`Jy9kSoAJy5k*?M#Erh5chZoc_u+>K5 znj&FaOtLMm3Z>KnS@yXY)1c=1&~3C8#A1$pIZq{2n@WkJ)}U{eaESjLw#sTem?HXJJ{7l-QduVQvhu{(&$lf}djsaE2YLR1`Mm-w-X>`oeCrd<|P z&5hFG;4Rknua^91&c8+j6j#(kMFVRA!3mHj#uY7p+0yaR%hMYl8Tvq9Dlf;!irtCh zYdQG<+_53*h~Z_2*y77|ph?`P&w!QO4{xgY1WOk&8xG*;^z0OshN)nj7NmSfQ|9B2w%NpyB-7YBL^gjcgvW>ui?( z5O09GuEj?Fc%p&PS5x{57iEqA^F17M0DVO+(U2wt?|o;Qlp!mSKqy)}r&lFenvMPo z&XwWW?;dHY4M-*>5NCq zWb*en6cSnf( zm1RC-aqckz_@O9G>fAz|IvU3jT7q6f9((AG zyB{_l7vzs-OrzoZob}0=z9D)e+0~gsy2~#ALe@s^WzLlZ%f&jx*lmRG0~O$dp+&Fb3lc%V)cwdwg4E%9zr&TmbC;E#2zXsP|G70I zYjn$C?PIz?9iweD0|q$ivLlecs$-D3yc`NT$ZB%(=>Te%^A+J#y3I?fwxLz1Y3j#T zoZo`G7*fPQ)#?+hin+I(&TJj$c4mikgj0Ojun%?kO$l2Ya5Zb*?IkFJ&K>4>kz8U*EOLl6DB@|+@> z{A?gU3LC1NpU}RCOfIIcrqQ7FBP`HjvCnD9x-K@Z(Q|HJetWT)?zuE!QzE~n?kJAv z7p#b1tvjmMy&`i>eN+Nh?D#iT6=j`xEBRv09Yy>0;;26xFcc%6;f2i3sW!X-)q5oSvHDEJEz)9q3~e zh%F9>IxLtCk^@%cqY-4s-Z%mAQe+vwb|Tg@5wo;~=XbO$M`uZ%5VY5^puHx;6W?mLn<)=^ZW>i%cblm2BH0Vt zy{DLZRfq@mRb0&Yzh{NMkF`DOPwf7K7Uy5<{waE~LMM(+l*Y1-$(6Beb`{*ROq(jy zF(XQ_G}B~0NeFNhbTtlgFoqx!37k?3d*GcRaq0Ek9n2THPtnOQET+MQC z$a1$(Ow4yLxLnHRm|`0ISdxOaCCgpAR@yLI?@i=oB(!Z8+Mqp~Sax;dr0|%Hep{g> zwVhc)Tl%i}l7^6(WFoSXi8fbylxlB29vjRBLU;A1Q!HF5spk{cu7D|MmlWOdh3MsB3gxDsYYVlX@00$RC2-W~- z#9k{Bh#6xlK_*sdgm}#n;u%7ySe~hO@_faDVq6hR4I$(!sMSJ&orNKUUI-zqxlt)% zdTR*5#*s0EutK9gS#5?8dLdc9q_)zPW3MI3nT`_?f>|C%h)f89OcFxqB?w`^HWP-< zLqiB{e=_x4PcF2H7WBsu0xl+4EWwHBR-o7toKVhTc)Yw2A8t_Sx%E$e%@+WY9em9IkbOutm;QS&=2(Y`R#*`3jLhb4Om zS{EcPtl_H2SMp37au=WHAp2K9*dnfBX6lt*YUkQWWkSjF#8<*WJ|qs*!hmsZS<<6s z-c`y8GM#GgWt-{g?9i?+c;Sv=C!bJwlTOUwqy;~VyaNX?S5o{f&n#@kDO=P~+0>G} z9b_CA#;hB?oU8!Gu&F1Hf>VTKP{mt##uPYwl{LssLLK_N^jB_ z;MupJHVbz&^H4gJ8*k!87A7NUl)(Pd{{Jdep;x+9BprkxYYQ+XiZtu8Tm5eIxkI+s zmIIGGRh}u6_TmT$4J~aI>jE`@&oo^e|Ls% z(P9L5F?1k_JA?@W3hao4w@rm6k$S>KWK?nN>uw3$o(%8}H_d2i@uw)0^SGgi%OpC6mzr}qIFhQDfImb9y zWAqbXYFco3>zU{bPBDfRLo)X7-JWIuQqD`=Tyjno@qQ#z^S%sOC6#AhK+Xg zUz8V`a4IMflv~zolxQ#tR3$j&cfb0rI&G;VQ~Z93y+qj*zJEq0>_t?YO{o!1863df!Hn00Rmjf9xEN&($$!W*ex~nxag{4 zdE4y>*?eBF)oOO0Y3fSaR@UOCXx=tw9WM|I@n9^3jy2JiN}QRW3=&|Ow`!i2;@JzT zQA+vJ=BhL0lnYcU5NbL0cB_9a_@SdbIBi`AZSbeI0?ua&FhJoNU(cQZh*yF>`X^gkxA-sxVG=Ya>8SHs2q`0{Rb+6Z|gH|Esqf0 zkg+19uZZdtL>CG7qT<>oqmKJ{qs$-6*}mFtT2>v_1w0d@q}YOswYatNat!#9?ZRPUxW! z;ZwC|v}rtoGgHd%1g6Krke$B!+3))heK$W31aC`#j!eY&n?Yf}RD!&C*=~*Yfz&q; zKbW%Tg%|9hwmsM6!Xx#WrJ!T;JWZt9TWv=p@|4tLdU;d-B_-rmzB*h@$312P)u2qo zQs=YwL_>;CXpdRg7@pP)lG5dfB|-H4m&?uvBL}|B$0sx&IX_4#*gs#b9!X=K5q1|^ zmH{IsIw3^IJH&c~-3mkLh@P(H_8GrjqbiKOPByM@X zI&SuB4D6^`G@@&Yzfpb)w($ECucgXIk;I+*R}3`Mk~*_t%P{WIhY5}{sFK$QW8L-@ z!4YnEf3ZGz*)Z{~fQfQW$<)GG%w`??T7iwU?)&vwlgHKRZ6naiz1}ZT+rHINo8d86 z*-K}o*)Wt?GR&G}c#T%aHwZ&YO0j47-h4{BED zkYYq|{dgD{_W_l)uU4p%!`|*=W)(PeKv&q*y{V})Fet_)oTG>4A|!LC3=J`;=oVL2 zNh!$p>v`J$pPf3p3kmLv?dq% ztI19+;i3Z<=~d3?dY{o+0)|}MBk_wQHZ5FKn*1nC4^O4qRE2FTC-x;BSv{IWg#OBt zI1wk&Htd#=K#oXMvFWnD^}>N^?WbIR7A2ZB|6{Xgv&Qc2fC66UB2*>!pbXDFa- z-~8LlP=Pta0U&9(m?EbF31(3Nhre2ivio#}8V*DneAomP{H+uU#RK*P-c~(vVFq6- zpNOl=Wn#h%QhN-%mDl>wh`%O$V0x9`+Q0{|`%=orDC5HdT~@l^OgcWAZG@D0t_pRP zV0@85xguw@5F=-FWysl(fHW{_ZjQ2OJWMXYv=-pUrpw4zCAuX+h>Z+EC}|;0NyQ}2 z00#C-R{RKZ02_ig@*2Gd_ljaVvlnygZ|4(ifW3P}Y;*KvuwHWoDaO6R^5v0gS!MF| z8#9A>`_jZ$mJY1Iis9lTx9hW8_B4OrM(8-cxdPoe!e!%9?Q>oo=$4Loo)PD&X z$E2Wqm{F=qG{lq-KK;f7X9G9_E*hsaCIY8y3wLQWx=!j9e1$%IzBe0IiG9P!CJ4Aa#=`sE^f? zMLy?fdZ|BN=s2H5vOEj2q@&6(^Ni4fj2utviX-5NuBfF?>WUV}S?!s&LLb%@-otKg zVUTJ%%2mvExN0C81&xIA#r{lZo@B)XT&0mrVPDDmPl(O9`#0h_5@>J%zc_{m3ao6o zdVVoUlCXudZM4dbnKCM-lT?Z)eymyv)T&wWS$@xXOfP|s)sKR8DaxD9phJaSliOw0zNu3K{Yyi4nW{J0(@RfY(5 za+$xMo2K2YSRG2yO09v=3Cr>P87<0KUsxZq@QTEiLnXZFa=o)RXlp#(((*Bv=-&{K z;*l#;BEk7Nyyf#D*9-W>N4M3To|m^+*8we&srchSOBGp{)_$l(yN6nY|a7R z=jGi3p&7F*lCVaCYhWWLeWJ`?>`Sm(i{A%Pi?64A3x@GzGW1OrylGA1S=!wv z44RQBPPG<^g;7pdsvTtsf1 z>bw?eASXfjn;Ol7p%pA=U)CjfhrXtM^RkWAuemF0wdsnrjwVtb$rtdAx*OMotkxI! zD5=$4_+zz_7u8{-S!9xBPA&0p@Ouh*9K+hhWAH(pGN}*#BLX>0h6KK*c9l~L7F6QD zwT>6t<*Cg8U*VXUwGYJ$@jT(jTGjtY64|%#_H28_4`svlP+WdotHm^htfFnX!iBB~ zV|}>B<xW*_xetKe=BIdL7 z0nz)L>to{g_2qAdmDsQ(XAvL#l?L*U&3@p+{fd6#A=(#z?=zF$B$yPxdr@`oGnzMR zf7uUwq%s=*YX706_#=%^-8)a*+=ruRzaT}=`oEVBl0aXinpvOJ z(OF?_Rv?2Zr?K$*nIMCD}9&C@P^7pgjXuqWYk!H=mw!c~V*Y>wm>Qj^|{cDT%=4W(n`Q7fJiM9TiC z#FH#FO97e*fwmtj~GE8Y3X#k*PdvcHK*G_wrcG|{g=~i(PA2G8hEhGBmoZeM6{vG z>Gq^1Nv$rrSQBy|G&Oo4K+_5EeDE@E5BTk6+|m&}#pzh=_uESiEDiHF9xI)0(jI5S zQ!z;`)B^^7jaugu{IzmB;hmgMektG$Gmje*Whlqn1b(V>ts}z8g8KUZivz|ir0AME zcTxxI*z4h1_orwg)-L&0P2Atc2Jm@W8y!EOhb7Hk=g_BV%d^qc(!066*PiGfM4e4^ zR1h`ReS|!T?c*I^yR3JxPh|xmohn-9oyCr{3dyZP`cv&*~c3_3>EjIckro}n&m9(mb}ul;fa=j&KcJ&Qq4y1AeQL2v7%*K9M=`j zd#pu$ngor@u5DjIO^SnB;`S9(W4cFajispKK|QZ~2alpN_oNa^;EO@WDth%Qkki;5 zRMD$d!86F+d)Q-KEPmLKz6v0%>q_HDQbRAZy4L%fjv*wAL%{U`NS%mY+mEv`MtdWD?Dv9w$*pXfji4B%^11n%Z?3n`1~Y zZu7b}O;#!vSW_=h&Fh-+0*nB|SM$p01SH5R)rWGb=)E#4B2J0kh2J=(4lO zKy3cUW|38blg=V$MG3>MPeAkzo{dt82{P%9*hS=e$t@Nk^LVzGQ=I(m^U2+5ZB2nk zkzdGGDjCLG%xuOoQitvwcAaCqNTqkjIz!BwJD=PR)&-u5(u!j(@(~KD#{SiI@r<5h z&JZQIboHU9hwzwW&;tc01VMW=Nc1T38++V!vVVqNs)Op>ts;Q=DXA$G1QrvH^P~)K21;7D!RUc+(eOR*@IgDRq4&1(85J*T@>0KF&$$vFr5-#jUK^Q zlE+;oha0$B0svMwv2!{LiGp(4#UtV)lUg3tT(xx~RJ-^^J)F`*aqPA-nYN2x*TV^4 zNX5zKiL4#ZSw7awjKvBCbm?Cnn@JNqg`HZBbkWh8Du*vY2+q$URENPA%*hi!0kS zk2aj!R>x|b8zyG#k5Cd{n|uV(dba7wQoh8%fxA=;H~Xyd2ig)1XGxL)gqfk|1ZKKQ z5R|Q55Lt{(9W17tGCR3T^{TZCMy6IC{3D;o@pQJX+A z905003pY~4Vn3gR!F2~F9MC;kBkg;;sHQ_~ME`N3{(1l;q{)%aSsb({Pu8A1U{8*W zp2&muaUp?p-I-GNETjvUfuWhk{V~4LY(A(UDnjASJ|51(jL%d)} z5lG~9#HI0o-~+r4>IyXP(^ZQeTm>q(Zj4=j&Dh>ea4QL*`DB}fH@A_eFH$>V$woA4 zyf}{T9!5SYB#}L+4d5AjP#fYAdr$+yllEW)CV~{z_rr~a#$aLUyveBzqHdX8Tc+kF zIr&Qm(`_BRD3_z#&$I3O@qaD|rTSIO%Or8hX>gMsD`juBID+i8gq)(47bkxKXDR-& zRiekFMA4k|AOi||kaNj-DjE_qRGxm&ucUS))%9@Mwa!qTv41s%c~sm-3o5iXhdL>z zj~@V6Jk^o`;&{d7Xv?i~apZ1)UZq_}1Mf__n;}BqOqZc=eMQBYamC-`tubTvXbW_p z$KER)neAFe6b$Q)*P4RS#g=%UeYL|5#`|i_k-nN{LSJWmO+rLJUDHPtAJxb=9A?frxa)~fes4rdb}4(D3m!3Be}i4pp4`R(bu1raH%-_#i?6A;X6 zTw}P_GzOh=F=2~z0}rAAs@_$FGV+$_!p2IUzIw@g6aL@j?{QiSCQO{V1v*g zzaGWVl|Crcm`@%Jm0lCjGA!7g#~%$fjS$+4+yj46r4c@2;T66t%)yqJ$*vPlMJbQ^%7QD(6lt@!&{9SC+ z6hjO;Gf;Jut|vw=706&VjHTD)kr}C|U~aJL5Z5Fc>NQ`$ht*lea!?(P_G%CA5v@XR zFt`%wK`l}ukq($Tm;pe)R@r`4g2u-JvJB)vn?4Qi@)`*0(Q&qAKg4m8kt)etn(1Tg z;)!U|p)SaN?J2^p=gvvtzmCTG*CV!rQQ803zG1I7Zma+xdU*oFq;E6Qk%{w+E1-5jsWa~+Ix^tOf$qVkR_EUv9Yd?N7XQ8cshA{s%;A<2fts4cn7>~` zJpxDH+LK-MBs?%n23Lt-4z~tZ==w}cx&^UR(6Q9u5$mp4Az9tZ3cqR^1i*^D0nJLL zt)B2*ooUk_n6|M80W+x^))vEtVQmZ$W?}}ZF>StISjc{$V#$9lsC4?4VSCgMO}Htq z^u(Q(i!}^c48jmGNX#-Vxx4ErB3Pz4%*SHS96PRywMiAWmRTo_UuarC-?}XM6=~U7 z@dcBHmnNUEpL2LZHfD$Hem;4kb!qZ(-NQ2|4d5avRE_AHK}V>twEO-^9l*X$|2ZHx zY86%%`;&f_hP*mQ&=o#p0!P+9hJe>X4RKU-_i=R_CC-M@iNjDVfeo#o@_DVRe!@m& z2Bva0mhqng3_E!&gl#f1X+Fgd z%b~714lqQtU){uNV#ibtK_z+dK*2ip<=FHU~8ZIdAzCMzB?!(#}#sgh{4R2EINck+Ms(6BUa z7EWrDx0VRUWo(`~z7g80SPc$u@gV7D~?G%|c<>%Ty16m9?&l(Y?V*94 z=$z{g&K7X&r|DDnv*-HMlk~^Vo~9RHRLlP#aqk~&*LBr-o^$Sxci+43Jzf2lELl4D zShk;RKU+>LOa3XHmngBz{BWo)%E|DDsiK-7rKS?&3hpWszl@cjR1~5#Dq0NgnHO3? z0&Eb2VZ_8tKX*(JAiBkjY1ECG*7S%$fRYxCD8wM}e7@hk&$;(KJV@h@ulR$eN&S11YTB-e$3Ko6#fE=)`T5aaNR*`zG5-#(ybtQKvj5SKmqN z+q5cn%73qfl_U_F*~9>U>*OoSi%QQ>v*~OUoHW+d;=h#LTsEi)e`bwnHmJ(}y=-m| zh(DouJ2)aonr43un#NEa70w(}f4w(KqEjE-*Rr3sQ)f&DU$fwFCXBQR>36j#z0WP6 z^nl^pi~xG7=21qK=fM`vU|xf~&`27Rgml^4TG*tvtoI@^=;C{e732>B#lZ2A#la(j zppZD9oF*l0ELw7?0&3%5_FWtLGf~pW%P5UJ#8qq$24Uo(hr=rV(9G0l3;zQ03P2tb`vyve6ZU@)O^)=5-bNqL3N$=Il`g^P2E>Ex8i~eK&0T6aFd~Yn zMB~qCSUz8?n!2bgX!TIkH60v*deKHeiU)O9G0WRALLzvukXtJ>`}zxb2f$2NHrA3K zgb!M)Wx@GKmKzafo@|u1fq=CWK0BY@h zaIiH1HN6im>i;E+LtV+-k7$WxvXnDve}=es)ef6ITiE&k4SfWONf_q8j*)PtxF&2{0v!`Z`Q;cqpVmQO3J+ZJZ9L>ag4sBEeWKQs|)&Oz|BRqjvKu7=!3dOlpfen?IcInVJ2&H{V?L{QmvY z#91NDh%+%CRukP~%S(vriS+3Rl+`#UVI02@7o|f&5Pi{-8DcUpNM%5XsD|NZ+m>br-U#N$z;EhPMN#vnwJ=l`Sb_`b=Vo;t0aUcJjpU=j|=F`ZZr zg|hz}?(w8bX5|stN+-U1riDn;?PI%tPn_=WVY;K9XnjD;gZ-X0h^H`Yp?PT4di!$T zDHzQvokMxjDOkgc?QQn`=^B?JkhC)t}U%^;F@DZ#>fLXvRd0w zXPdIw85f*@QO(Uo7ExSF#iHwel&739WG+18gdv0CStkrxM9(>4V3ZUtzC_QC$r&MPq1)YPq1)QPjOQ{!Gi55v)1m)igG52p$Ny&fOa|TpK zI8cB^ty#YA-s}RrIe*`d#wk5_qCM1eJK94%Sz1o&c~7*)KNzj?kjc4>j_Vt>p5bXj z(gTtuR6~_%z+JC&$ z(KdO5*Jc$v!_uo~$M);o8J&JhDXalfPhmCOe675l&R7Gky zwi%m?E$#RD!wm`*GYLA1>HPNadune{;3g0KjYsD{&h46nQw={ zQy-6}VyCvW72K`3r+Ko1G%r+D0+9SjKpy8m2ycHMH5-Zj`>6)6b@r~U@@l%be=ARP z2K_sEqFIp%?lyiR?&;@h^}C0^Y)ioh`u8A+tYr9+q^na>Rm1P(S>EZ>PASl(qcsWNzr4vL})ck*ur$VqC*YgS@ zajRrw)q6Jt!s&@CHpkwU-zq_xYHU%uwH__)Bw99<4$`RBxpf#c48T9vd4R8S_(JD7 zIS)X+Xt_Ac!vy2^8AVZW&YV%1%1)=;EYI`xG`~L{{|P0+#T3eb(x+v`;+-`pG<&C| z{R`@d{M#TdI`U<`zU=cB)bfNX{vHJ*fJVq;%SVe)oLbFoy_9lu6&`79J&C)D(Oh;a zd`@E}Qu_g`i=O8v*D&;zvU{Iuex$e|s3pa1=D-Rt>J)vu>$p!Y!I$3#gt+bi~owt|>eoESSDGMkA!THJ!-Eo1XA%YxxHXP#}_% zcF}Pp@BwY|ism`uH5Xa~$!!tI>Cyl#ZaKih6Xuw0I85o-yKkH6iV%rcLM^0BCw5^* z8^TXHHJbvrQ(Q;B2@w`(G15sLB;yYOtC?@NqJKN`WjVq)X6&+YpX>&r<1Cn(QoX&J zNF1e-l;t`XZMrI{ifUHI^6dKqmbyL9`2#wqO_v}TUrhs{0JRBaT-#lK&ffc`++10^g|eOEsc&W~QiBWwbh+24Eq9BQ`9|h-!L*2CBwsm;AsDlC5HvgFS=o zb14j2bqtWCaDPBoi7~j74)2X1JOoOtj)+s=3p()?j&%Wt{fIS8)s%v{dv@fxZmJK1 zUV&^1pkKtp7PSl!Qc9ip8DAH?w*?MO#0cvJhA#1O#vu^BcoO5M?I0SG4qLE=0CxJR z2VcP*=mrL?C?+G3IOXh6iu@(+tiCghjZ>T;yaF{SCK}WXqx$ST!=Onn3E-%bWc<*u zc!dfS$!`W+()Y_QDqkYU7LRrWc9 zC0q-!`}GMr9|mhSAep5iqE*w;h_2DftV2kOXr1#>MG0RuusYzU>v(~A-T`%3cE!3@ zG2`KCqO0pqI&|SJx%hfs0-xt4_J7Yy{P^aXSMv1bfbX}6<`dI=fEa$OxhUXup4$@? zgdvedmUSw!tk>w25HDH4WGS;A`Kqbv7pAH!W2%B#^SM>uBCx}aH32ZU0bp(e!0gsJ z3>qqg0cghBs(gjGTHoh?`SuS8smCgW%n0ZNTn(_v8L}q$OG^%#CTR@z2OQqZSwy2+ znM{}R;Z#;=!u&$JozH)2J}G}&b3PS~|SkN>kDfq~fSy=D@~~ z(9Kg1#l=`*Uxcc|skdV*#lPjsOju?~g+}9(VN5^VABWqfIot6SK}65TCAO`A(d1B$ zt;`TJ1FkJ(N=se)6t&9zS$(+ybHQ`-m7fsPbH6}=b}aI&Ij*On4LHzdFZR_l8x)99 zh>2pG0d6)LNxoiZ#9Bi!JJth$iq&B~)~gHwH+uPcEqUWS9@1uOeMx*5ujDJ~5`rv- zeC=9MJgj7k>dkFh^?E$^dbxT%u3odlcdwD*7xbF8)n#*zR{1*P<})7V8Sedoy7%h! z8G0?wbUO5&K1T{*ZAtijO5cwUV`9BnB^_6{j(gjiD!*ytkP*Y0|xZ{X|oTj4HE z7%@OPS<<1^J4VcA-D6{_(aYg%ctUA`q>EvKEt6sZ%zqz+L+F>Cd|{P~?TTYFt~(k} z{(YNQh_e_Jpo5O!J`+^7TaACXNb_k1C{pv2MWWXPC#;kKfyCFBXx2>Wf-`hlx(2Ad z);)}9$lnq{OauugH7Y3P;0DGYjX9u$89p*}rDrG+$%&K#yUz0UGe_8$&!S}R1gaCc zdDygZFV7RiF{%}$Dket*4w@eEfV==GCs+ug_p-9R?}#=8;3vCxfxJJ-!ppP^Im z#;jZy1cgecB*ATxdq?uyLA;PVsb9>dZT#Bcv^&Bt(xjrg$d1|?s@tWXc^cI7_y}Bh zvb4TQVPYopsr*L9=W%`Wd6r4dW5!b|G*_>NCZz&tJflnpv#Q$VM&LxxL7n4#JM5#s%G;pU|r)=--->t`PhM&iSY*S%s zqncho@t}kO;?Su)@o8hbqvaMQ5cMVMR7MqMV^Yy@>I7nnOe)rModA}oO6;g()mr~X zE86-~YR_5uOJJ~}zR_uJ)zE_d4-1bB-jnD*Xc{cso#UTvTzFXM1L^se5IzRWKQT_U zSqPI1lzo%|3iK7DwMpp8Cb6)>J#Hoppx<;lG>T2(VL{K?!XBt<9G= ziV@sso`@P$j35LdVFu_$6TuURd7yV5;k_3wPU=PFuv!!Eee2d7Vr!_iURaP+&J9e; z9e^3i2yKuOSa$_SD&8RNPR5`59SjYflagY)k?&~aY@B+Orm36xzI$Ik$-|k45tNei zMB{I7Nru!|yBGa_E>DY9^sBg|KL$Hi6dAf(+!!usBaqV5%<-EU1X9`V-YnfLY?iDm z(9t+qE9hA0S)St36N6Tc38pb%Qjl>Qr%{g4oBU?}e25Z0uZ0iC&GFYmAIcxfAO64w zbP`bsG=e(l6LzmH-W!}}6xf*J{ZgqtTs(Mm`nw1srFblr+TL!x?NXsVDy{vL2&Wyi z_Q>N1Ab#l-JG_bTOS9POor7PJf^GE)vX!$Kfo`UMS}WTXv~2tQ=HVgaS6kyZq$Y1m z)0^yQY~u?uKz|c{oHkOS$d*R}ix>Yg>Dn11UxS1c(?ILn);XC1k)+9Vm1M$*Hp~53 z<=T)#@vg|Qn>oKAd+cpZzF^)diZC7sWew6;S~#(Jg`eeF5Rou8&GHH%BksrxK}#VsZ;^|^OYurUJ)M9x414z!=k`%8RZ z@$0CmSsn?s(-2W$QVwG@;W~|Z0D#{d`ttww?_at!fmuo&#IR7@14F3o6@(Xcb;w;! zh^Z;5s^1+_*yAO1Xk-4~V;k^2nmznyZ#3xJ7a9;aF;F`6z~B_6UXx8$$~ zTA$^Ni4ah|m2BgJ9c4Seyo~mDQs!!7Z~xsqUuf>_PxHjeNswdiRchFbvWA~0QJP{= zS+Adb-NKW|dj0!&5E9`8ljVg+2RlrspGfb>*9#z(#Vx?0i9~2G zT_@i-Cu9WSiZVr4szBBl6kqwh<+}ggobj$&V!aE3HQ&2SWe5UR31m{h2)#^XfN>;G z8nFg<)I_cp*>thPXy&`{l-EcjeZ9d&GUZi^-)H$L8U4JH@c1M0OS5F6dn%aj9mG$m zmn@QN+JG(n_8gJf*fT}S0;vCVgPqc9{W{fvKzW{N?LeazKnLD{i5c{zSW2PzMW#5C4@l`#afi{z{c#;+PU^E zYFis?o01FXXuf=J(R~cr22h~2$BWVCb7j)fOQ+cNczD^hB=`b8=tv>ir(V3ae`S&< z8^p)-ePPG;(tVg7ps4NTYHr=*MK`w1V41DFZSzy^_cz--T~BCUWCV!GcYw<a{VI1ANE853k z!1EhQd~d$CPE^$7vT0OTs0`me0&4V)VF;+;>8{qFw*UpKCPPStsgrDGC?>R-YXu+% z(FGuwv22z^TBp6&X*W@E*ae;VBA{<9&j@%iY9{2*vZ~HpO*K@Yn z-=^o)hVUioDioZB9*(&+`ah!CkplPaMU7B)}yEM&AnB1>+>AFxU5`ZT8zu` zT0<<$>vTOQrWei$=pXgXk)}BHQiavsw=c{{c)EZ?q)_Zy3amfDJi&FW*>}=hv!Cnz zg(fQlDy}O3hAO{LRWPxbo}Q$h9#FKd+B*Gv;=G6% z%v`6O9ZJC`P8;X&UE}S15mSvlRn}`bjkSugh(VsrnCzv3DtxPej&>(NsezW=DF6z?dV8Q{cQW?|IEuj| zIcSRIh2NnwuViout_n!Y+k!eQ5W^BobDlD?=}CO7Oi%n2WR@&tdK!XkHv9&KY#>z> zH1Zep*2sjwShFHB=WK*EmyXB;+SkxRjtT5}1>zO&xjwCm#Pi!D&25V`hk|54a}e_$ zCay!d2P1-OXaC_SKfIidWPK`<^=r%>wF~6@1?w^lkq^!!GH0p|fBWO%Z@P7voJ^SQw6uAxf3KiEooWq+f-o}W zSXx5QwJ{H4SWSg|y_v}IEFY@R#@I@YNjFgIW9>g6cpxcnS`Pn@vY1Hb7fE^3BAWpu zMkcl*^=1VdG$Si23`4?JK5kIpKyibj!4a^t&3y6R#9Mzpsc}Vl?fp7K#$l$64U3ce z%eCC<_dp4N^JuXa27^@w*w1C0#M*TXbVU-@w`RQd`*226dJr0><)!~1;LuJ4j^ z15I0teM3u`@gz}Mu94P82S1X0k9eHD!3tCge$nIckmHe%Lwg*Ai(-5z$4B`@jUVPg zjZeyGVUx=4ef(sF?tL+}$c9N})~AR_MuCQ%TwB@5Jncb+?+Hnj%AqAS4#sBp!0^Z_ zqZ=7=l2I}T7>0ob%3&>ppam92q=n$gpWXX<{|ZG;t<}IWjzwSqg9H?NKUPqw#aY{2 zREIkA8l92NVAkG#D$4NTCK4dS0fya)P|60%no!L$_X{#*nQFyw!E%hzcd#a^dy=;b zQd%j`qQ~g{sf?CM@6{9ofl$W2KRAJQsY?vYCZQ(-K1fjSsSEJxx_0jyR3*S-ZEV7- zD$2|5bCA`mN*lQcQWhs-4SXbD4#kB_2;9>rW#VJssO%fj$SdfZexVdLMuk0pvgr(@ zh6Eu3olsD+8b(wiq*a7cq`jZg=-{GSYv;oV8Ea8QFbc?n2ER%XoM`YHPZHavyd)LS z4l?{Z%!9{&nV0>)0y4Ej3R6oqq-J?BXxCtUa?sY`SnOkld3wHqh|DKceZktu#luJ; z4!h=M&5O~?<{ajRd>Q5#On-3?_A6K+11C8t^~Nd9Q8*`mZnvE>QddgZ-zBS9TaLRsp7Dh=XWDtBZYayY>Ia8 zMJ`dBBONPZPgu4Y%MjKLta@31|6PI}7(uD3q}~zIEt0Tq@D>%RHes;oBaRHKLNDLM zuDT8ju}M5bsxVhn;-V5v9`tvs6teI<)*7?kBN;^@_E?`y;G0U0N(Y*|D$^Ql{Yo%3 zpp|<+3EzlTuAARVi4f%sT{F^2!#ZaPCtB;p_j@Sm!qQ3aDyoHmWdRp0S4z4!Y9(F% zuAsA44zKM9d7@@AGmK%~(+U{tXEooXT10xF3{h8fr+!=I899mo4FoMfd6911yZ<8S z3nYJt{RnoLju}iTaZo{UgNF_EZIVCSE@PMXP}U;@6AwRmzPdS$l1-Wb8thg6)II;A-VVKB2xpS z307kzu;UI1gBw7)2CJ(@BQoEv9lX0TN>?d>mVFR($qSe zQQfZnkJH9`_dotr^Aj^kE7IQ>^fv|oVRXmz*hZINp;J5{!ko{dz9^MA$K!kgmPdF1 zhV&?mJAa|Rv6}kED(aIlj&xC9MGUg&ktFJ?C_?r=k_OZ_CWD@-Z&B03G)LP48Au}O zQA!X%dg@gjCud9+&q3=*Yhy#S=cb-iUxf@P*D}$Vs838P0-|e491+0R$h$)(fkczO zQ+_ggAVnE66)q?k6Gidcd}1unhVmIsQDu#-K$U8EK$T;rO4ku-aLiOWHbj*II#4C& zcstXHbd@|Xr4jqB+_E>!7krWL&G2Y0_y2}w$vS?8`I7Ssjq6dUG0YeBN;LG4&7NJ6 zS|-v~x3>i)C%>+#_vmjfS?}Sx-lhf?lAVH#ZE?174=kHt^<^DxdTn~wU^Vx`^)7Wj z6RU@UFyBVAV8{8PAYDxqh5!a`P&Wl{9+sxlb~WI~sjx;d8=Le(H{PB~(M*lKpB1Mq zxxFnD6hozTpv~L4$N+PG$BQocz(GYBVz|Y~pEZ_kV~V3}*i}JIgyoE^tN>@zZ11aj zqmd=7x74p{x$_qc(GB&Ecg^Q$YbF?5G%@$5Y+c6hjALJ&{ti8w{jGY)a^4Q}zYAj8 za+wLSr`n>ZJQ}AlSIr7eOw!Nrz!?2B56sXXr3hwA+uTZ;pt|7 zI-)AUJW7$axP@)nrw}aE=^Ce?7N1r3HkW5QUomE}37#NVzXK~e!BRM`(J`A~dn^02 zcDelo!z7z10f{6Oy#h2;<2e)5r{r*#9OpZ^3aw#o_Kal5Zp!1@#LUK~3#G&5>fo1S2p9iaJEC#(Lw!b}9&yJ(Aoy1Of=3OXVYYE%jB8;e zMayWIDh62_ypNKci}MqKx~`4>a2F*=Ga22z=HO2y`mA;%1> zU|mRb4U5uQ1KaW|^%yIGy=l9AV<gPL=QC;VHX-7T1`7bs*Bfl+8Dx-=$SKlH5wzjE zz}FKQt`XG1UDPl=&dj%UTfHJd$%#h@29Io?F3&-VAVe#n{+>y>BhTd}?(pLP8q>T@ z;3w^NkZ3ynl{#ysUyvk^rp-YdxWlfc&pJTJsXS;1?HHY4e7a5l&)pSdR0FO7sppG z*bh-PjK5m7HT?3E3zX9ni*QvvF%!?2p179>4+BJ`a5^cl0+4J#SO{$=2F4rgv<8qw z`;kQ8dnBQ4%LvHpfh0_efX<*Jw>vG+=edx!E2LfZ2nG3qUR7N@lQQ+06953buG8?k zCU?)}-7lBwi7G32HG#P1!zhJv!M{+7Vf6Zg;?4xp(Rk-8!-%h}Mx0}k9_5vL%R;)c z5gg)&hMxla$`QF$=tHNsJkZIY)XZOe{Zr5X)zAIGul{keBNp!rsK>?As(5y7@$#oG zClADOQetaXiNHsg3UO&45VUARGh$9N!gJrV;^<&j%rPr|O14eU9?w2lq;M4{2Gm&1 zAmu$C^Ga3}tydys??Vgb5k^DG5o=TP2zJ9nk;|@r6+86sJWBH&VAY>@@G;*ZL?W)S zcUIjy;ygkt5(K&>=h4&Bnq2ogmWu0suSOiS2(o;cMm+T#H*Cyt!^6Dxi1TR}PzuBm z*9VRGqEa)L|F4&R?*IMT@4x(YkGOLU`sv~xaedH;FDhP*xIb&eGqWlV6(#0cUTo6d zU&eVTVn|I4LnBfV0@k%*LU?6B2qzib{j(4PdTP)W4l67{1j_drPwpBX!jL3@=hjRNTxQ@dc3@GQbgsTxyr^B%{af9c1hVq#d!Uf0&?u zMFhQyhQo%39|#!3eend)cH%9l&(x*ZFb0^CK?(~LH|XFC;$@BF!aqFf>A*8BG;k)@ zC^{+>X`nueYXNIIyc1{En0AHxVMq*&k{il~ad#2z-DMxaMn*CqVLx2~q9tem$kT#@ zFf)eZs^`uHt*X>c#^HLeVgNsfbbvV0U`Ft~7>s=8B(=Be*IS@V*b@Kar@-kJ zDufns#8CyA_8Mq{H5HLsXof8whn91%?w2{_9D2uxd~5ACpXMvQ9M)^$A=3^bk)#Mo zV`^LHM-CWsS2K2oGI*CPfRKb;=p%K_abF!u}FTuuhqG9xKU$bc%dO#kIq`5wuNXQ~N)b!OIbEl#ER_ zZjOIMSE8Haa>Rl14|(63m{%>A0RMZ#@3=Ys&hR^Kj=w(q{%iFMjxl}yZDo^-o8vn6 zxa%bBtjgDESEzj}3=4N-FXlGNj2B~e^-gJF1#^3C z5KM~EB73QLnBY&i7{}!hvrL247~w}$rvfb6Ah3vGM3(eT>?h(F;uhpLXHA!ckEKdm z$Ihb@_-tqktk=iDY^wjSDME)HWADSUIF(xQC}9Sw^WexT$Wm1RxRiS&3($iq>N_X! zuKpslw6Q#Yj9rwSp<}}Ai;EI2FV6AuPgOY%{WNv-2X$BtkmP*@>Fz%o+!!OuK=2m3 z9n<-~Sk+o6O4!Skz?*NHEi`YI>ZJ!R4jX8ZU5sc$*B~Qi+p5teTc7{88hg~a1n!1w z%^00bA{L;tJ(9e%7SaX8Vx^r}b^1fH9AnahF&R#-Wm!Z!gUMbUS*RgW;xu@8p zEd!eZ`~7Tn6Yd=bg%NU@Wz~T$O98XQ!0V`NZjeL5`LS2%_ zmZ*q18j>vrGpX6Hg92Z{hSGGILIcsalCbkMi>vZ75Dqn0!&FZmFoEa%7$Jq%?JHKe zVI0vxrC1hGsxWa8h)R|&i>;%gWky5EeU^W}L%13Z(vpHb@7|dk!f0d=<`!Q*k0U?* zU>CInK@$H(yZn(yCvcVPL|(Rn>?__PJN$zVD|?*AkylV8AucLduSSOZXv4^iGJ5KQ zMkZ|mb)YFhOyAX+F5XCtj5~r_K90=8VPq8FnUSGtBPi6Rky)Z5(WsL>G7uztOpQ#} z?$8zf2h#)w3KUqvMl~hqH)BT1I1++Vn8qYEHFegZTBxSZI8!qCFzeVc$+ZvjT9)v2 z@Ph>o%7-dm$;yKqRXZt5ioouE1^vPd!A+$EvEsvun(~}t%-taIU@m1w@_fO;Rl;(g z_P#BAQjht@c04Udo@OkO7?4jg0cM>qYNJq*_VbLL=76MMeCO^@p2;)TL^PME#Dn@J z?$)i3md=HoaX*iatxjO?jx08mz&5!pQ)``r=6zy{@;X>|2UGs7&+~GWCe4Qq)~yN* zLgkRabW5Wzn%@JX28 z+K_sa zT9y@-nu??kAFDY3D>|)oJHveNH~8_gj6zx>b?(Pya@xi(%>3g_u?=W73;ZI)-E=yuz^8-5q39uttoH&eOPH<> z>k%x0y7J{#(y!Am@ijC&z3{uKvw5mjTD*djpi%`hoasOV$fULgFlW`I6jMyG^~5~3 z;rTpfc0l7S%W`bepN=#yQ4r zOaVU#kYbajc0Z6!0=DJgwp;VehjoQM4V5){iH2&lGDj$jq0w#+#iCk^*($xi8?~Fu zf<`6oDT3bOzM!v;0~Py%0j36@+81_?M#k!|9$r`-1BDv_OAxpheR#s5?HEUHsE){X z_@=4xHphRl?qcZ=D^bm*!Um6Nk}xZ4cC~1N*K<3`CpdRz7&eFmm~;>35A<$!jBd%S z4b;w|N`9S=DW~d``OJ4&P2u3B5h9FDb(07SmhV0*62iR3n*?nvTX?MxUbMP#xQgz* zWZZ7au)gdrh7o$t)Us8n9wKcAEvC`!Ck-9lf6Oa4yQ>IA+xI`xU6lyJ!( zwyLU{mShEVzTV3)ui<<1p7hw8$ewr+DUGj$xCt#hVTGyfq zDZJDjfBF58;kqzQ`1Qcs&kMwgDy-OjI->G`3*STG2mNcOILda>EBhn3mP7yYm#ExT z|9o14yB>y8bXtPgvV#=ifN+`(_Zb|_(Fx(;2v3D#7Uj!cH-rN)5^x}dC@4JWuk~2Q z!8P|BQlxhaFv^Sioy|v@jq_1mV=x2;gMF)|WL4DCo~ThC_NVi$il-TXH#o9(uq6iQ z@!{{a8A6xoV)@qxpr-#@9Tl9L)bfE=RB|=Sb8diUBGYsO2SJ%{!3DD3AEf<+wUc5; zMhuexoeHhb`6dhvAfI0d_E*CFcEqF-^wAz3{zAa@urWNO92rUpFhIan9u3<8!%$xQ zEYROh0YE8_9OUJ|=c0^KM(ZsNLd6Tsw+B;TuKt&JyKl0UHPS``Ev3~BW4hrw=U_uv z__+V3DHVEkL6QO)*j+G1$u#p9XTS9PkNo`EU;3luyXb9Q2%%VokdtZTs_xz6#%m>1 zwPK-ZcK_&}Y~^!}Parm(X`ngTlJw@JXgG@MH0iyeqReEp;o&Emv5a#~4J>&)U&Q~U z>IlO?3Oce(5=>SeP}UL^wU#iJQpHM^in=kY>XE?9E1w3Wb-c`?;`C{WO#U$>oU0>3 zXWmATK9quXkUVJi;*eyL)=5FLSEnG*Gk^Fplt!EEJ~Ekat9&x7p2&(dXqD4^%`spH zftk&Pm8)wOYy-n32!+(ZMTG9or-ZoR`C5uIJ9V8(`)l-mCY35mfoM^pl72QNP%Y3{ zNlf~Q2Deu8JlW9k#!SX%u>G~PLS~*#C(rmSU?RLuC;yCXWw`Y)2}k(G`c0`M-Q*^q#0%y5{-Z;*x-Rk=% z=)BJmbabqdtU6A~g37Ot^~LHr*C*Z~qYKLs*X;o#SJ$`np}t(TsZUCd5F@g66uy*N zwx}|88fr5yTCo)eDAk6S+HhxM15TsrhKj5&8YoMA_i4EGiD`v;Ym~g}$vZ&+;eZ&# z$Ew2R>R^aU>f5-QT;1;a+yjQfR~pg~cMq)xAa;l!;_vVusLHE0@Y8tD$`@3gO+4C4w0Kv&N6KhF4clvgjCk(Qo3}dDu$o# zIrZvfy55)Py7Yzbko35dA``3qTxjbVP+t=rRxb z^J2>Ifai(?{)EgG;k{p=8tO(#ELF;>;XZz-5PQ~dX;|4-#DUXD?U{fD;CTp6b=I|O zh(!T`N<<-y(;^B{Qlt*Kl2qjJ5t9d^tD5_8(T>eLsb)+cDHS(Epxj{^`QC*zB5!-- z&x9g`l#x{04kRLXma5VZ1{(1hNsWA{n!MHIEO?Pclb>VdA1Go_ixY$sQ zj~g3pVdDcK+a%Q>aK_d}0PRRQFQ?2WI?0$os&L{okPD-jhI6_clHt%eqn$SxV?7z` zqnYZ1yK^pTyb9u=j%M+H5Z$fr{Z59~BGH4yLh8|FY}Di3RJ^O&vCsw?SXank#xn=C zb26tqIR|-i6CBI#kToi_I^1SsxXmD3)otMAFW6P3f_M+Ar2lg=jxm$QguSEeD%^U& zSYT0LrlA~6NmtS4w5|&((YWODX0BjnCUCvAo=3AjZd{=sOVvc7YinZo7>$g8C!r?S zOih>}yPn)wo@yF;BoZd%0P{*kn1KH%aylsu_@w!ksEMCC0Zvq35n4V{v?sbZ=pbgK zjotg|N=s3~bh10vZC^+xtSHk|<*ME{f!c@`NmXd4y6{fZAk&sW-~$>&p}I5;n)aYU zY6&!0(Nr8+;ULw>NG1^1kLe9lS&~9T-Lf8FrX4MH2P8n;+-k%nuT>+?Q5e-jifA=S zA&X>C3uF?AGhTTNai(-~A@z!qG%-9uQ2q=}5G159u41-zlcuMt4ih+#O1KO=a5`F% zAjNAElvyBC4Ed^0>+`XRHDwADG6VgF$?7c#RKjm)r@B2}rwzjD(2i?#H36W|Ysr=o zzdqTbkP_z;nW}$x2O`@Bxu8IR*Kun%L~FiDobRnLBx&8OR0goxlg>z=W7xgm2||Ri zpqur=G>2E$%di*_#5nx@Ytq^EtUSg5FlNjP-MaXtOzfI;?s^hG<7>6f!5p?~{(GHc z);0pWWSA=YBBD3TTN>s!ln*vc`JVTnIIQQOVx&x2%koiHV~;~c0aXPaNh&a_fqjpv zqA*6RgOovZ4YxoARH3#L{IX4RE{UHaUt%=lsXofku--FwLMeg_DJ!yfaIy@gbp9%= z0xzS`P=E{LM)F8UXQ^pE2#;^KhUcSP^XYKAY8D%qUPlFiEP+y?X?gxp_q@+6R&e|?Gu3KM9>AD#iH)w{nc}SSGbldymYdbJ3cX-q!w_YFiBLkct=4ZtD zA$|s&+d(s;R~sCu-N7lS-LKvwZ)v@tQx?rN0IM|(!T>Z(fqC;$D903CAzCym!+)AepqOf}E01GRaOoGUFU|yHhlphhC^~Xl#xyO5 zWzrLdAaMqr-@^h46Td(CHl;~}UmpIS=H-dkVl%YX`2~cm2mCbvLKXk}+M5UENSsI# zqGoF2au#`w@q)ImAq_Gw9JkT2Sj8_UuaDhGv!NPTF`U~rrBt)NNrIz3GgVqaz0Sl0 zA5B<25A}{m2iZwD!6irdarXsdYha0`YdWilDd=9j;W^MGvkjPJc@)G%O%yhaM^FM7 z-xQp=tOkM8!Xq2GBYjx1dP|h~D^`w#Qyf50XghGg@kk!a{G#JhD&wqse^!dSnZgPjB8dT$%q1lF> zLU?b5(k5R;!rGrGPjKd2Oq+@VOXm8do9vLh`}`5K3uyw~JBU!tZ3l$Qu&roZCA=st zpqN&m7-Wh@FmaQuF=P~ORQ6!>K*44t`9l^rjF{g5@-#~pBk!!#$bD-0M@Ak84cOco z7jM&P_7at$Ol%V!G<5FO4~fzIFDyl4v3KIb$P{rIqQi4>L;Vl4NQ${%yGW)ow|s+( zBmxEUv0O#NHLJWG*IT$=)p}*mc~Li=M0RdSDXUyTZ!E=gic7mcSxlF{IY$Ej8;S79 zM68(11-X6@6VHnge<@b}AD@Q|vfd@vcfz-OhXyFIuz{p*fGNN?8eqk^KL}{FQPqtP zhU!LE`8A=4buTofGKUcM^*oZs77wTNv)&GV6Yc+P*rPzl0RZGkUm9TfgocAmSFP~~ z7u6aMt)M4d&FM%GqQz%Fq6=j$g<_f;lnnx_#n>pj)@2Ep6Uzq8qGVxO9uhMSIRy%= zMG?ush$w>;i4P|bA7&*sK(?o-^lij3gbT0+rD-tVnK(uf8MQ#ZDUIie;8o49C8&*@ z5@Gl&;v&ycK}S81+x5u0j3$V$>T18dx|O zvQ?Zwru-}b+#cEwrmEQ=osXvpD;aZmmkw31gSQlDkY#A2^l{@uC=wFQ_|RcCqDieX zdVy{FywK?NpO2;4yPs=+B6|+GajrdNX|k*u%u7hcm8A*mpc=uGjK5cKuhHmugm}kB z7_CgR+$E0Wjd^a!$|Muv74a=B&I2pc73_u4$^^uGJy{#|stI;tCib2 z!F90b3>ggFrmai^lcCAsK&#lk1Dkigy|yx8+pX7ab~(INF$P@1_HpKftVBdW=J`sa zf0syWzCom9-cL39+w>$LFv0UVveqDSGT3kkP13I#dHbV{=`6^VjcF$7Zx4u^PKc}( zRO3y!1%d?o^#736hM15P>I(|+Gp-}pVqUi@s5E6_@yd!`&<~9dMrt}a>@vLlE z;mO}T#M2D=)V#9aOk;2G&4{ZUsIy%*5J`x(Ijy64z0hM#Gj&WIc-4yG>0~~1N~#Y> zs%(@oOlQMN+7PC5JYR+S2s=dx)7fCtJg(O;+o~#04hBHiN4fwl{c2VzUtK1`0tEw0 zFdgl0_uCr#SzRTrv2F!Jz?GI&P+E!H9(`9}*nlV;8#9c}NtR_&y^h_LB;}u+;tCyf z%Kf(3{#g0^Avi_b*PF10wBb+a{MrylrP^Io30^3JO2o|?3#*XMfEaddsfmz+#4~7Y znlrHu_t}1`SQU}jK=D)!Xx^9vL@my8tDx6^#t6U&+&kSY$fns7bbosRhrWvY!9^`( zFyadu&V1*w35wRWfR8~v=Jn{SOu6#l1@+QcfiQ+E!B|yJ^b-|9e^s>0>3x&U8h6Z48@E z`bE1S#K@yS6BEbE`yLy-#nDHQ-#(MfjLj$ryr%oQ8SMQSG1%@EI{_#*`)sj2-}xbF zWkqdwC4VbU$n0SQWm_J-#8;+GXepq9Y&K)uG~|L1=5X)$8hpZy8o6jRpQ^@l{rJWu z#zSFYJsuK{Dzaw930P#83ns_V4y(0a)J2RoW0zxKJAue2P_@Rv>Bo_w#$dl50}|=6 z7mz=>4ED%^+;t^2ofxiF>}}9eO^~^qi||2xyiO-`6^w#U+Vbh-iv!*_Mz*Ff5gV5@ z)QeW=7t9Bwml6y|@E-`A&vhKCs!jTvsDm@;oPU;0VLJJOIOdob;O6*cQwGI1YO2@U z+x#zPmU_apgHgLJp2KKu7Bl1CvD zlLLlY_q~S7H8i0hqa@4I6uQms_!RxHC{>l8t$N$+Yg(^#4&pFp75{RX*sx~unrr!& zjl&RP5=S%|Fm<{O%Mvxx{6)O8HnE>7Ko7rm1 zGOrs{$Iue@g~@=Bnq;vZ1l9jLVQnyL?cKeQRvlPBzGaDOJJk%mfRw3$3k>aomSWW~ zo%~5!UnAQY*KKd=4Wx^UBryalx;f|KVevnoLdp>TxwKz^3e7J#?mT>1PQRR24X!+e zCPv!tP!n7Tc|&dPnZP)Tpdnqi-ut&vLp#g@G~zOucLHs9boVPryA2x$d2W-4Qbb7v zU{t$mI^$X)*97CJU=DWF-=zTsgQLRw4%v>(^4`_Bv`VOkQ&kNrtsF=zX)OmiDYnb* zhmrvac>S;j2Q9UHfr_>2uC2(^$;qlpHgPmF$-kxywp9JALLSF-Ki0oBen~>_v+K|P zfjAQ;X^o}80dB3tnGw(bP9@IVDsg6QK%4aEf>L1oqQ`JLIblc#b3d)b8Tn)|g&cK! zA|C;Mh`~*pt51yIC|t6?sjFmDQ>~s8?yz!9CqF}#VkeV*mx-{5`qvKFf!P4-60ljE zfrh-`k3znX>8Q&>y3K(&16}Q#9FaH^1e#RS_VRyy_2-!RVh0_GG--K4BF$JO(sY7I zBY)mnq*+{1b74hd2^=6Ct|qdCcqx^XrQ(0Lvffy%={!}0i?f^MK&;7|3xt}r1EEG1 za`wM@z9AYzbLr_e@TcBVvR%Jom#;~XaZCB4fNA#DYq|zTvamX#?Cq=b0A9hXbZzj4 zxZ>F5Hc{?x^|xpQW?OP?V?>($Njnj^`G||9n_n%4gNRbjMbco@pn^FO2c`M>#R0=v z9Xu1naO9r6T9Y>t$PpJ0bM1x5aE_$?n?Q6z?J%74k>R`{h9hOoO@ZO8t{BdtK-(CS zS$<(ef#KXv4RQd#BP_lwBVszM1JhY;rqjr8-!nnTw*Kv6Iyc3YGq#}G4pgKLForv< z@t>g)txLm9XSJf!ds7_XO9IoGt!kjx>XLI+cNloK)XA}Zxe4ABna{Jb7~9#7!Fi^* zF|Zy_YK_iuH#0fbBjnzTW z@HbkOTM6RcjR9qH&k}5E{Rd>39J=HnG|{O<4NkC`;jFS5)&2`|<*G_QS+f>R?Ien9 z-&=8(R0*+BQS^-!XKBfrZ#rfPG98=KTxk~lz*#y_Qy-vLNzl-F&&>aG8E*qYBk@+L zRsQ&XCR{^IM9r@jXK9tc_@gAYD$cSxaF*4>oMpI@&caH>RXPi+h+Kt>mL+KTYz>XI z0;0Q|!dd+k5_BL|M2&X7dNRuz5U5dULJVF+Wk5j`Et)K-7A>aoJTe$vMwg4r)C>mm z?FE}{B>QiuKwa;}bcyQ3VBWquJJVe7aM<1If*FjRqb@hO(1`)L)C|6|7n=k)VZ$b$ znGF?M*5@}&ESCfkJe3ypDlQGz0|UD~y|NXqqL>`xadu;ml-mWxp!6X73P2iv! z2CR~3ss^AlE0j#6LmRS|h@bmS_lRs|jJ~2;!Khn-X50!mMe{PUXJT`1+pz=_WpZXR zIWwSHJp-r|!hVJiNY3?1A1@{!NPb5{@b4I4d}TjgtP9o{logj7=uWdUe9gDqpKy_h zyLd`ZfH|utU44zG$*>rZp|(CELu*0qnNETRgkD$!g6h9gC6upm{^Ta_%8=xn#FhsY zulT4s0zM#(2AZ2^Mq#iQVR{OmY!(~?H{pSx2a?g;*7{XE0C}7T5O;Xcal9D>X973x za@0B)vosr7kxhd0>cQ@P^}eQLg9L=TMS&|BziQVAIBR?6OOn^#HvyBqMP0gLzU0g4 zkT!x&JhNho&I~CG>+zM#(gjDqXgG#e6Z}9sa4MjzphJf6UITQ=#mIbsxk8XSt&OnI#%?nB z2pB`G=u&Ph-Z@=#lo+h!G2OQTGTpg&)P`)3a!$u610%A~%87jOl1iYy;4u#DO!9d^ zqs0i=*kB&EsfFRWEdNV?nNS>;zk0Qa`& z>;~+^wlz7>;9b>&R7B--h@glKXP@{T#vWI+5~ z$)7j!cQ05gE;ssKD?pAXJ%gZQ6j~{y0aAdrJ~ZJSzoZt})yM)i)w_x0CHT)P1O5}W zbR()L@Sin3_|JB`YffS|3^<0!oRjO#``iuCw?zrZri%LS3-eum{LJ@!BPv;F8~R6?Rb2Rok5~JhV)=T zxDq@w)?<=jGGLN{w9IH3XdapPK+kDhU!7*1v$yrlSuq;e0 zF|%mDqDB{DA#6t`Bf4ji3c zm8}KRQvS92V<2n{gvHo5LkJtuchgg64*}Sonz+%sIWb41>y37x3g#3Wx(!2cVIG1Z zwg=D$TM*zk)$XRyt`v8B0Kx~uto3;rCIkZ)MuQn!GBGc&kj|vkPYm8jH_S}EyheKT ze8x16iQ8dFvix3rZ{c`4>pZYu>zuPL0SYHSeUP{EP;&_m@Mh)fjMl&h_B3w;AK2G; zJMy`C23T!t$oX5JAIBfoDOk|!HqJO@PPXq*=oAUzXMR61#%VFX8z*Z$x3Pffc^|Or zc^6Dg&pYw6(i4-~fp9wAjBj2WuY`ZPa&{H}S~E$12hSD!lQ!T6{>j)QvyKEcDYS3r z-+KP#{44k;1#p{xGA!M}zgzg%?6Rd2H`Bl*C1N!jq}YJeoP0HL#_)HfzapqWKV)o+(-F! zvQbRvIgjX$hng-B)&_hc@WOJg!Ijih43+k`Fm=~}@0s+w$kCl)aC079Pq;3;^?1an ze#Fb@66=H7bPs87M$Dex$Wp*V+tNmPItw9+IX{g>ibITeG8nqo9VbcwPqfxA`F~J_ z$8RcmHY=uJ0)q&BTZk|9y@dCiNa1Hh{*mwdz#|nu$>nAZ=|R~O zfkiTG3~E4zb~@3XQ%!($oy;KRgB)<%XS`kjrzunepc6V^;Ex)F6Kq7V5L}inh7_v!>vj&a`+s@P1xrA}aMGVnUg%W)OrsZKV;tU+J ztE4%Xh;UqlWo(q*5Zqp2J=F7ZO8}v!Y6YBMY!$UdLS>m0I-nb<6w=}}e8Zgx;DxB7ulDxP3x;Jl&18zSBv2LgPr2>35N4k0^sog4B5nHKpn4AP>^ z>U6{5H#TV*Fzc*lr$TUW{DD**tlHlMB`ZWeI@b~4{fRHmgL14Y3*a3#^u6k9H|Q_ZDX9j4~nJ~5bnc0n zp`&*b*B=pQk$&5(5~HNR)G@rO|a{5<4V8}T^uY(0{g{w(VA?gS)+-# z%}Q&4!_)y_3$kL)FOv?Bt-X~zbzW(+yP{nY=<#-?{5I>25yc@zB-N#=m6QrwW-m`A zM5fb@dSL^hQlnfLS&oU%y%rAF=;zCA)Wkeb$d`=gi);;~iInOj01-l!0|d@Ze;**U z{CHTF_gF%NdI3SAfiQmsh_MJnN6Xc%H4s1l$v7zy^antML60bQUQXpybhR$dB=jeY z-*}!=Bf|#YAs|Fl2`r#6R06;fYQr(TwCiKl7^`LYrgJfn%CEKa>1uztQr}LuQ6=*{ z)$ZS>C&ZcS32_!`@|8BuB1so@^=7eM1+{03csor0Rx~zv1!xOJ#jlD6zcQdfOK4Q) zN~nx@OQQ2Y`KQ_{)vwVMqHy=tQ!8tHf1H2T{Z+jfrpb3oJmRu(+=ht9!~*f$B5)Wt z=-b58mw!W*pBPbLoZqK-oCp#etTm;s4U~GK+Lp;!DBHkju^eGdE1KuVJeg0>Qs}aT zde0O>+aGVkS5O?T3L+9Su9_@JLq@(~1z*cTVGP)$SF}Fi*Ssc}>L8F|Wne3p1e(c#@RfD(025GLNun>4gsBrX44Sc548{G)Nj-teVi2^% z=CYD@{-hG3kaaZcnB{-2uYWOc$b@*XakS9y!731Ypx*KX&g$=xV@8B42vRN38R<>(|S1V~kFg3V|hJs#2;g!wKa>+a^gzg0* zEGniw6UcFzlon=>Kn7a}lL9tPf`%WO@CcW>fI-1z>jc@oL=1Jpyc33|2(*4sgAa^S zO5|Iem75V7F)rtvejDNrCA#ulfxv-qE&bM1t$!RiHG=VdQ+_!URhzeo`kSm%Z0F9?L0h6^i^D1iUHO$ z@m7|(&%m?F&yqC2Nl+IcR2!34F9crfTKHPk5}0*P7=ZmKLY7;xGajV5(`aAcBMeFv zpO5c>X&ZWlkpP~%>UJyW#nB-pCZ#$cAo&txSs04?pjGcvf)@TWwCd3-X?^qM_b2Ac zz-K)%zRT6UGM>RbTr^;0ZxAjk$wL%hUeClhp{K+7zV!?g@`w*a!mH~@J}e-lY349n z#W;d6LYkK0(?e;vaiR%jZ#tBQCu1>28ZPNkgAYXHQ)jTi)@cVwldky6AWf9~3TG3E zz^IAUILGggl10Zcd>^m}L+3SYfbg5ne)w>m-#EpXS7$X@RCpUxgZ{=DTiq%f-(KU5 zaM9r{U(cwD8PX^rGO`2l_ea^pXFR^P!r0Eu+RWk)A2jmW>rJW`t3oU&8VNdXcEj7&2kncw>&S37S*zR z^e|I7h(a6sS3pLM~rCQ6Lu+y)WaYuiKFbTCVG@Xzp1qIAG{?`)wO6ayxQ`tLqgDzDl6W+Oii>u@Dl%Zi8p(g3!Zib2uruoSIEE=3s zxIY;)(9gk1(Mpt=WEobKy)(oeAS02{OSW+O1%@~BxbmfWaDe-s((j=vi52%|xqprE zYo~v8`L&I23?i4RK+Uo`jr9Jh2Ezd=)`JbmW}Vub$~HQEYa{32+WN5XEJj`uCa}9{ zXbF=dkE{`)VT{MvqZ^79k8%YE--*JrTp2n<&pJFrU_U z&2Vp#ZgwHZzQUIZtal^2)W~bdD*C{uF&?WPqq|-LjXY}Z{a(hxzQQ=fNKzg>22tDv zQ2>`wCYO)TGFWA=_x-xTF{BFnyZ1o@E7YeI4Ez4$Ou4TjL=;$u(X6*+?R^5e!Ingq z3rvE#Lx+c4;lj*s1;#>M@Memk0d@w?Fs4t_Z>S<4WrRc>&2Qg;wWRrUpCm$*&dy_Z z$)4^{g5fb^j+z`y~i{x<5VbgYm|r|Cf_2;wp52>$4=Kl) z!U4-H%pBY#=^omC(!X+k-9rj@Qm978L6ax#{ZrbZZ?yOf##0_o3-|b3O=ZtA(>W?9 z&{l>JF)NvR_HmV_krhmcK?Gb1m=jRITLLrn*1!Z%gkHfSj$4~v=?5)Nm4qnezAaf{ z*@{9$FoNw|D|-d2;w&XpSG-Sfs^`H4n%1Xcj4BpO(oZIOl%y ztFI==MmO-T=1}t^d_ha#?MEBtgBJZdq*3M1?tL0SAbtjTD_p4>OqA_# z`GkSdtu@@-v0F7`h}W_@uAV@@Ac}tLXK*Rula@LjaX$(A^OZ9%XoBIk(19A@A)*F5 za&V2`R^52fBLN+`oA$J09&mkws^SrPURcFrGe5y1U9~n37QJ&)graogQT4^>D-6IAhk4Y zv~>>Hfr4l}C-f4wRE<#@BKO2@jyXV6-juj_fVgf?=%<7!1NbDnn{b($r)dYwtJ}f= zLK99oui~_KiTX`$pg~I1H?|-AW#3SJ7ok(FuBl4p0n^I`7zhT= zt&IQIw_J^odY{m*_0~oXtgW$1o||aB-ewV!Gux*wC{m8(I|l{a;RWGIMAD@Kl}oxI3Rg{AWe$% zATm(*ku1!Y0~r%$i6(%+6UB{L*pDF{iY_bFzT)b zl6=0{%`Bk&kDsBxjJ@cAcy$zn@mDu@xG6<^=Q8Jiba>`{Nc!Ob|eOgEf*R0D5<37`N2yV8S(4ipuU+yVoe?u zPzp)GLz*!-GTUAC4Jn(X7X=XqPC$zSy_Dm$PC|(oM1>Nwaxo7lK%rsIgal$t zn%%veLhPPC^j1A5bEJL{QYV<9gR?rp)q&VLK}=q_uM$KVb8<}-orN0Fj(7q$9g(Uc z0$qu?#2k)bk91hH1V%Kny&{W~ygsiUZLZ0<;pGg2v3UghlZ?YXV>y zP83yL3P z#vJT-wysnN8%9$jrx+SRsaL26rC>lR=(Tz=5|J@)%~PGQMLEz-)d_bfVXii{1Siif zC%JsPA*kIF1Rf8-mJs?;sZ|g}dfJu_XG`AYwlF-aXMMXgX9!|cF|BMq9j3*OTEaPZ zot)?mA1iVEdR;^`beJT!pSKR0;2e%|h1xlLp)*_EelxnlS7$TgiJ2?Z&X^y#%zjMz`7>E?uqwO#F?)&I`A#H2n3+KW+jo2` ze2%QCLpzExLt0Djb7<%D5!4x6Q3CLCy7p-sHpnjmzUcqBp2+q`3F;gR`BaY65iXAE z`^_jvHf_)ygf0g8Pz@W3cE017Zl&>Ax!&NcoO;F(8Cz^Id4h_zp0jPB(RQoVPf&g= zeMCU!t*|}eX2Fkx=;-(kpc+2bu?%_DCoXQE1@EsYeiUM+KAWTD zv!hBi4TsKXU~6~z2a+$e`1)gf<+kJ)?i{wn3SOFMz+^Pa=%0U*v zWyY*E&F`2NBN3*72*H#!LLq#u+h83lwl6&9A?(1%Iq3nSIeEc08SQNPJj&S4r)OsW z4mIub`OcaA)BE@Lw~HbG^Dtc$%RQ(kox{Td7SY&S{@te#l(zDM2fYHGm$D0FB}XW< zf+FTJ4`FIPY*D9hE{+tAWmG9Tk#L-?{RKJsQ~ha1S9<8zcxoOOst3#WP?U2YG9#>} zcF_T`S&0dXjs>K0s^m5JzW`Q^2ADF0Ilqe%cbW?CmWF8?KN%@0kpA(Zr~PjTcwl_1 zwFDH!wL~4^U;}?OD7V6nK+#k-*9f>Gq#U0xqYvXs!8kc&r@5wMi%Vt*!^3dY_u6GT z+=qNj?N=)4m^7A-th_dIUE`d3dk%>@-fKs(1ETi;sPDBi(E^xQ1)mQFmP>!UoLc{B zTB6J$JnSkOgO*gwPzuCJiVjD`JfblUM>Xc~TKOzQdpn=OQiv9M=ttSuoJDgwi1Eql zzbM9McY}-%+^zMUz?`y9{DgNON$&^~{TD~l_Hzr*aE6S`A2JprauY_CTB3RA{dCsn zGSl!QL)vyqvqYcmpXiVgx=<)TD>*vP_U_$R{?NxttX?Uvt;aCPe>-YHoo)cgSf;fv zZ#;%~m?~$E_I?FT6&vcGW#7{KrL5l+8C3t1{!(UY$Xnm8t#*0wH(!;>P%$^yR#z`5 zWO_fBaW<~0de9rniHxh>M~N|z?PDEBpT;X9d+)H8XZz4rcOE4LzR>*k zkI|U)dTa*-`Ccu+<>tL~wJEqkL4jCA3ZNnLPdkFNZqC1#0cM~S7tZ+ zG(h$rDyLX`A3Os_P+nEK{-{y73;%;9eYvbJ`lBx(jQ_Jo^+jGzF@`_te(8ObgFDd? zx~2Km^~VS+zA*KyD$yUZl%D_{jgSA($EbtNx<>-^npQFo0YGQHpJ!8)x2ngFA=pfe zYULFV=UY0_5tW<^bqWn|FpMeL?z&2lS~O*uffgvDMUsD>ylUW=7;y%KF=zJ{8r1tQ zvb0;XTz&!wk*qYz-fg(CaCARKQ=u545%|y&Q!&)bfDcs&u&VdRWRjR@Nu_#z0nm>H zZ`TnJD^oWA9^GJbk#-Mo+^SNOc*KVqMA&3)Mk^rrr1~&%R`5}-!Gsf;@Ktp~a^*AS zv!>|{qMAWl2oq{7x7+QAxSI$cJ$mn#nX+F_)5deQl=oH5fANeU+O?lb`TcBJ7d@_Q zrwxR8>EJEiKtp@WH_@|iD|bMK%X9}CMmtE_G652gW*~`8#rNP6lQE9zTTOPDjIqh1UT~vuunF+@8S)j=j=)>r%kCd*YqMMz)I2aRn}~u&60~}& zB1q8`_2uq;@qU9ZzMC+ zj$x6;%A+#XjSvAU`PfTwyM*3n2A zGIw2`J2@AYmvci^zEPEz_Q~ZZ7ndha(!%o1q4LeDe4{GAdU5&Y;_|TEy8TvFo;V<( z{f&#uw-%S@uxDMqU6pTD#T-&tIKbg2AjRURk#(EiTFXDJPTp1fN<7#Id$|*rx`aiO2 zQTNY%o-HcYj8l{^5wKRQXaQhMVwa_ovCv+7Nx-UnYK`D`YGGt)!0MdJI;o7Eq8Z{B z!*nVzXGGS|GA%)lN;K|HMvKvz^tGLnRXP;U>|ba)cyR*f(SiWJZ;(Y6l%Lw+u$EqhRVgFZ~!9cuC>$ zAulQ0hC4H@??&Ed%O1LucaFIi%_Qw)h-(>8GG+}PNMXcqkaX2VD;W;eH^n}-kZ}B{ zEXFy%F!?{I_Oa07%AjAe8#h_Z3kfW_?ZpXR84bv<c%Ye0d zKTzntQ}jqnwilc)mTnL6qiT{dR+ETE;Xb8oc+fn)NG!w_^?jNd`>3>^fsCYli$WH|>dhYA<6wpZmO2O<|dLQR#$LqvwmgCqdvph+sivw|gEG76qC zdNg@R90j>{vMEW8!jTaLoq(gP?0hHg83RW)p9lY6M4RhOn@vIrSUDQ$4xwRtmOKG4 zl}D4uPecfR0?!B-NjX%3pjVf$eIF}eYJdUAVgyZo@hQp83q&s(7P~}A3-?nm-X(w=bn2$_St8DoqhI+X6E9%HOqU7=mfq;54*X0cX?I8io6X^wxnsb zhf+~ktnf}wMWJA17}h={KSxZ0=+zpynW2Te)q{hY`H()A4NQs#7De^EK4IdT)JF_vHk1L2cOC94)5@c=WC{gFqt=9O zX##e4K$il-YW{_pP#b;f5k6Ij>8s5fJ7&6uPltOV00ln9S4MNqEh++^XlOa`1**p$ z)tQyTCyHJf)r*2Ej4weDYm#>U9nsI==-7D@X}Ow|AdN5@P)MtayMGPJ*+fW0i;?-f zvNgKHoq!8;KTk4^BtIktb=^}8@^t@93Uq?4NhNn)*H@DY5#e*6dmr?9qWhPUhOKyZ zLj6~gM1pbiCE|uWN&g75oiZ5jlJ5I8ea0?acf`N${%K!jznJ*i@Fx%bf+YJA!Kcj$ zXN3GR1#s_I6LE=~NH`=*=pkW;nsELa=0cn3ge>ud52QXZ&yAXPd}xJq&tTTjGd`Ls zRL>YIF2!fu z72ckIq`+J3pww(GZ7bpJYx^opKmfzreZrrP@HTb7VE4XH5~bWB;lUqaF4qefi(B*w zOR%&XF>Ek*Ne|L9JKO1fH5-NRG9w7zPg)i3GrEAJ?yPPu=!XSWRXO)7RQXqZli<0O zYNj)++AyYba^t$v-BTUB6cMf!pP!0=XVds1>Mjg8fJAp)N= z_&T`>jfW_O^owRm1SJp)nwWf+)gB3XLuw5zP-}((5iL=4(-F6p*4&EeI!4Di|0r0z z(d~Ud2>eMI@I%6Zr3r_ZCLApiie}SrMZ$Ek-(1mJqH53|R1KWLXtFKYYZw*LnML9< zqO;ttEdE|$vt*@Zu7PGD0vq+ro2Q!%&AM1U)Mg;OEt2lPmv_%79ptjsYZ=4He=K+N zGxzuDPJ9=3y*R=NNZD;K##&%SZWSiGv@eP%omP~Up(3?EWk&{FO`@Z%JZdM$T5tkd z6lWtuDg`BF2lWFglBeP05RnQnfQFf=;Y4>$!q7308akdBIw7dYn^4O73_i(P!B9Vw zovyFcm5q{7ph+)6{a~%AH7(Jah(8P^-VyMQSKRv^_b!eFn>dBAcn zVA_NZ_XgN-Z-5Q=23UVDz(#$H>j$a7B=M}TY8fLeJ*@SBN}QcR8U=4<<9SB$DbiLn z8lB+?#ZG!xC7{oKdjy6@y$KldiHz0ExS&2ODM@s1Dtp2KL<`RTaMDXX3vkF&*Nf30Fig8%BDepTD9<+T&d?D|h{?S!&NSX^ za``GssPr395`&i7NK<JfOfAB{y=Rv`zj(5D~Xvg?4>{^eSPK45KvqmgtAL z;7#@ls6loUrAM|1z^x88r&t=pjo&G%JMEfce*|}3Ymz{NYAVK9s-^>a_R!LvRlSl} zLx2JmX@_gG%(?;+tJ#v&Pn})l;BEIsU55D#GJRh6b3)rT35IqH{%HUbUk7H`c)-FD z+}%Y6P;{FkVvyFg#@nYM@W$7BRwYijZ|LHcXFuLwe=1YtjOIqueNmSr3vK<9o)8m7 zt1fWAgjU^MZ&DpoB?8Cp7?TQqP*PXl+T)h$%RH@Vw*)Om8BV$e**KAO{uf^ZqHw9q zgH=G*TiFw#0?XO%3Hq+$6ZcY~5FHT82?;haI9m5kFwNT*8SWq-U-hsN-^D_4B&D8e zDp1|k5nYXOZLSEJAN`VVNikOt)=0G)MVAMBar`o0K)MHgaeC!CWQbqhs&kk50tPVP zizhGBD#XPBUmSv&Y77ST9QJBo$g7__D1l(LSbp&XHt`u6F<@u~Fa5yjt{AugMn5NQ z_RV-nvPci!3X8a!a}9F^|C@`R6?9t4WR z?xS)}JqG>zbIExgg3c5-Emy9^_u0qDkpz#`pRb~Qvr%AbhI zj{9gO^uLwjEi_4`7QA)-PT39nn}K7VH$%yKG3!6;X^7;fXj>POm}-(hW;Jm`7Ximwuj;D@Ca?yB2hSP}%Zq7LnUn;^RH@5OoG9~o zVAxs+YjHA7&^OOpg=F}6ksK5e7X4XrK!wr^Yx|&VL65G4G0DztyE~iuk#y2Nqp}bjrbf+vQ!QN zDr{NKfg{Fg^Ttfn{aK;w^sL^r^EPkFM4h8RYBwLQr=IbtlXxG1atlleu0(}lPs9FML`2?Yqs_ZKVZ|weZ*h1W2&Y7jPuj&hekoE^1{bgq5mXMI5blDi}~J2%kEvqtKOwzT;2-*D3 zXWBBV2DS8-P7ebb8b&M1n$O2J41NbRpHHY*{7vZ+AGYuIJ>eWHEB2hP9p0cyheNRq znivWUVFdYpgo1?lj4D~16!a!_*1C)E3kedfTq}WCIzYC@-!W-cb2k(BaB3xbvQkqf zt0wO^WAoi%^2$1AlUK8QQDp)~Gkr_4 z(bux9EDd3;EV&yl!beEeHhxNwM;eb-M&4485~QD7A_d`N$b#8W)GX8nhI*xkEerlr zZ%tdJGs@~0$0EsDE{^8HkY_;nQ5w>!&Q*gd%j#ZYd;)1j(dODM{1Q1ZjG zqPfyoe(GV?kr(Y~ibd$>tTu*&2HEZY_kc>!Mm1%!bk!fyubX+<{nSM|hp9-M6hH)h z<2CIb(S6h!MInbOd46(THpSoMT+Yv%-;@F4?p|>r1+fB^UXu&G;WMg5FO5Z^XRfy+ zD$-ZfKG|$v+??x3A&YZVeE`~S;1demT>Ah7C1sMRL*kOP8e~ZJVBs)kNih+kO-O+F z7q6H;k}s~aS)HvHXgF_JWwu$f$^-!eC*Z>Wv0Z?%n@t)RNw5tJq-$3b10;Y=`nOuB zii#@Dyr|N_fFiA3+!;`*j<-NSDib}iwn+b$0#`l*Hz`T}Sv3#}*$_aJS#r-MA;4pp zc!_GRTW{!}L+BG)xCdqY)pDcT$HJpq?-M>rf+nI(#*TZLMd2+v4xU)Yb0URB46;xH z@_5~w^7RY%|_^cQvsrpsR-g_nKKSy%1chm|8}9i#!_9i$rc=YSBG*kubrt4x$%*Wk&-D9Wxi1 zDcG=f3%W#N=N8>}ChAS`Z@re*m8XCPd9n=)ObFqCxxG&nS?GlUEM%FoEJ(L1J7WyI zIKjt?Wa!TPHskP|Y8g?8AiRwa`UFb=Nh@51E95_z&=DduquRJsE*RX)&BZ7k`*Ve?pR>G`;q>v}HkJxA9waSy(_g|Y5Emk&--^aPTac1F3@?H2HIF1ej37i=-SooM}t zIJ1teqU(B?=;S)2KZ*1D%i=6XsAyq>Q9~2geC1d?b1&l~kmZ_TG3wnJVg$D%kjHo;Kb!1rBbwQ`od&hJrSbNW~2GtIdSh zQJ5{0yt$E^Y#P#CbT9Wqpq)bU~?Da^Q^C{0$%1`vZhZGbMb)Vz&3{g11W7tqfT!0{6 zalR4St=;D9vyFEHEm?auAPs|F?R*P;zW$#4dV7h$xZZpd)@Rq>P0E&6??U*EjVgsN zy0EWI-$<^#KI>^_G{bjLsLWuyK71#8QTT3>@1CdcB$ZyDeNX+n$)(@PrWC%*=*8yZ zyNy=Wq*xJ2bcQcqy{jYWZMbs`xd(WnVrQ+}rx;dD1S1k+kiF$p#MT78V2*Jf*foGd zkT6O$=}lu1;=d^OC_CQ?T=BA>BkJbBs+lrlA)}G-m=aFchbPqCr)~JvO5UR9}^8hGrv=%*6NKLrXZ(%+sA& zssIz=+{o|7!-z333&r7#BpqopuFJR%%#eQ^S_@VqW1=>r8^!$onCACb@pPOgQBKUU zwag&rz67+mPUM}3g#^Ul!SJ6DX*cM>a2QI;?NrvGjY8?f^V{nl$TrOLt;lV*exAI1 z@<28Q}9v`Y)KWx`K}T!GwRor@$S) z12dmjf|kWNv;@(KMJYD2m46Wa)vNfI+oyz$Rlf*dDG(%U2}&x(M_Kme7-vvPrh~SV$b9tcgSkx@IIfg5h z1dS4OO5LdCzP3y^8s|$&z+m*A*hQWH(1@GCs*ZvP^SPHE#?U`$8mRyy--NlYd_=j< zHEvfrw=dgCrd_v0DA_!X?m@HQ2{Qyw?1?B|k2%}zRsRC}Lw}yKi1H)Lv3idi+KJ?) zVx9Nsm3_;WT(s+n(ZwLvuvUvnA|%Ns=1`R}D5GZJt&2sFza|8UtCP2GGkEJt8feiM zB2UPqjb@@nD_h8+)8?()Q1?M?3nWS@+?cm6n(QcqgG=z%4YomPs1nDL%3Ieqs*{xg z2k13#-3FQi)-+n$4(43iZ+k2>I1mPg-U_Qj4pGEIZqWk;lRl$j-L;bP#2iBTp5guX zRpFsXE#C3MTnYJ1JKc@>n(g=nOP4G8$XjezTCu!M%S<*JQ7(x4CZwSWS|$likV>K^ zumz1;L;Xl_svi{W2$uso&Xi?7?c)At-x0hp%;F)tfnlY9EAxbAIc<^ehfe=Fb3|H; z0<%2M^+q5pvxsm(cUt4zO!Krn**z?xEzg0@`ItBq;2(>-swAv&^}wnAKN&KXZ-b0Y zKVszszRkd9ffkKPbERTgD)ty%Tw^>>- zxC-Q~!EM?~Y-ho5K=kCr*6u~FA=#&m+~Zc`ZCselS~r2rJ>e)ACQ?etxHM)OQvn#4`XlZV>a%srQ?phU;CXk+)ORj zM&uhHm@%!aS#~E#XvjGUFVg;Kw6Q8-=_lk>;3G1z9JAKr3T1}2mgULGnopw_N7|}l z3sJa`5d}r0%RGs6JiB2z#US2M9_w2gR7Tf|wRVE^{m4d5w)*f?_Ux?WJb6@$=%0s7 z0p4E3RK1+@WG3<>S{1lV|1P3$C7rj7C&PXPtTL&}I>OK=OXhz6vzBgew&;RN*VFf- z8Ga_39e)n)9w7e8|21QI=r&wFJKjm6;y-!4hn1hNLYI8xJMm_)uGdImZ0^RF^Yhv0 z<-53W>g_H}gs~l+%f){q8zmn^G|Vr!%b6z90dy-3D{&D-3$4fcl(@4XyOlB_WM{To z6}B7{j>(<&$d1spIr%}OW)yFTXr&=;d1B`i6`5s>QdpGJi9%pPSy^V4QO?$=2kdSu zJ0w{$wv&vhS9%01UOfz=+7E{w(qJyb5ByvvtByQpQrRvCO;bCZ6uFJWsY}H~xlMZp&jFv!&n*#gL3@^H)^kM&6 zG$<_aaSE8m6fVQ5BbutH#h$K0L!ql#+<2k-(B#~&0zS`R~;rSmxUAKTyl*bG9sH?nhLzRe55D9HH!9=KoAb4=D1_HHH3Rp$uFPcb4aee z?4io>Xl_Me=v0F73`3cw@XOwN_CX@Y6euB759o$8vA~6!HQ42f_cml(#t7uRm7t=# zWOC8cw)g%Z^6#4oq_Io;;OV*f07xqv3T#c~_yPnioF@5sNg)zQ{pBc#WRtKc(TuEc z)()9dvM_W+mkL9dVY2m$kH13maf0#CE2)pQ3;?lKBRPme?S(HAYBnb?p={3eHDP>D zCvORn*`6juX6uv?8Lt%~GI8sLY{Nq2R)xquq(X_vBLyOVc_1R=l5u53mV=V(sEOc9 zAZTF8N|X}{z;+I02NyI+dL(ET{g7vfof<@X zu2_;tF{}9qzwcNs9|h^h&#mgWz-&JOO&E&(P^22nUbU+DoM1A5u~B|*L5>@)`dmU({qxJn zIg+LPuxd_UUd~Z5lF!{q7DU+l_shZMB2qRH_ zjIM7`p3$N3&FcQDw)6TPaj%Bsn4^YYEz(^cT%Od>x39)gg;O?;M3kHzA4{727dM+} z#O6d`OFWkU4qUq+02mj$UnriCO3LwMxw&ETO>KO6j@|o|dsN6%8-4bYD0l3BO>c+v zR-$D1Rs_f1Uiu<$SMe6QDjFHP-%|cH$}b!Y`3aU{b!RcC{)BS0z=3*e3E{wHu@M}NlWEb$u0OfQs8dix0xV5wHF6;`2h2^>D3p67 zjUOcC=rO6Glw^A0kC;l&60&v%725r4c=h9IAbIlEU*sx$E*diXWQe_ z*TMQ@mfMD0L&nF(5-SHUajhORD+jz@F8(+f$#yp^&~3u>0a>6#_C&i2f5YVZXKwxy z%HN;JO3tFtp1kwOOzX{gSFzQZ6|3cRGAPKx{WEu?N+I2}3hLP~u>YxQr!1L`4gG7SnSYmr7wk zzI*A*;eUvMraycehhN;6dR>Vfd^X!##b>D>h5B!*QPQl)!l7&P2j|V-4By0-7^HfV{iLSdQbJPX4Igtme(DfV|S} zpdbR@=!-SA^w1?sUt3GJlV?Nzb+vRm!#<>6Q%g5kg!F4kziVuj)jL#c&!qChDpIhB zfL?Y8c2jrjG@l8hkot4WQ{Cx6c&!enqa65&Mebi_aFdwd^*T-U{ zmR=u=PA$DY7NfQF`dEzB((7X}UQ5?l6zy46OZQ_Tm!?&MtcA=N*WI;(_L%N$d`5L= zGjdMrj}kGooj39)#zL+xZ3DkqdOa&b-J_BA%sF0oi)0%(OIoK8=VQ=+3aB* zHjEBj{n;@(Mja+=efD&WWkIOb`dYfi<}UL^YC;Js>ZY-|3u>bLQ?+!B&0SK`N#9sY z*Vxb0?fs*bzWeXyJebZB)S9a%#|rvtUyx6Q5Uv zB{>4?a?f$6#la*R6sG5f$xQCS$9esHcZ`dd96W<_dsUQJpm-*Xl(?G61iG2c$B7nR zvC>om4ekj@1X?v^;ZWjCn+C9#L*Y0BpOxR4q#q8ZQ2^eCxTtYz#uT=Te?v8@hJEB6 zq7Q(fMZJSr>BtJK6vw6-l2inO{V28cia?CuoK#g`5r`4GQKeS|Vg#mHr56NZ$g@%y zdVl zHhu}gInoB9aa>_=+F&XsLU**lom~O#BLXeW}XK zg3l0As>8=n^>3f*c`ugUNQIFr-GQlUa^8`xP|M`d87?wVV}#_N33Xg$LrnO`a&2#j ze6dP3T$N`S47d!VswvwZW+>m4VVC z-9%Z^LuE-i^_TDHAV(e0w^xp>E~x-AC zYA*qs0e`Z1d9L=-VoLJmwZ+SewU_8K_T@Fj%Y{<;k>cWCt}9;due}6y(y_J0n?uE$ zBH@X0_{BxQt5n)Uqej_0&#rT9&#yhVMw6|Sfo_cncS|PRH75K6Q3OrF#Q+y_Q#8cO zgLzAa76}MOGwtvYL2_`FVHpt`(ak0vxYNj{ zIc28Vs5xsve=xin4mC3k{7Y;sQBB!*A_|X5Nrp0D|4InGlyS0c3)!IIIw5aBwnW)B zhivd^3?_rJ;oT$4imw#L&L*ot*@T6ls?P?;z#Kj(8zGFlGu@C)q8pZ#e=d^`Mi~)F z`Hw!L6VLK)hE1rsA&X=Tl8XZu3{zSd)ov&)Icd#v92=jctyurWr_-4PqX?X{kQILm zM5;4`14V-I;Jtbho?$7Hr_frib6_`KE?BxSy2rSz49hhTY_<)gva+c?k6A97#A`*Y zYLkXf6>lS2BI`W~M>SDwi^NNN4bgh)VM&FsP2&o@wpQdUzePY{Jc-pMSU46(YmhC>-4fv{fV107IMnsVA|wP3 zv0AN)-KB4->)LAncU(77g1Vx9b0?oEB`8u|##qT)m#`XI(6Ca?RLUUuq89(ADC+bD zgJh z+$V$~wo+EbbQm76N$vk#ldR&@9FIJ5Q8h#Gn1iC2Q8jP(V*e5sN7|PDZ#fpH-NZSN zQ#C|;?w;Er)#>Xj+&ud;LK-N8*E!TaAKotWAyh+JBFA7!=`^fs7}f;>rw!D6!=;fc z-b2Iet_e3fw8@<2V~!@{6ebiNXeQ~{KpB@D_vBOr6bVg#S%bh{4+gtuLb?>4wwtoR z3vPqS7N%919p!C#_9BzQIK<*N7Ukaigc8i` zh~_1uy}aDunVl`z4N*8B;LP<~79N&da!aJvLTwT=rUe#f=wHZF@XR&y%J=*w`5=JggHrZ?uCx27pyJdMHBLQIa%!(G=MxX-qwX5{ z&sGg!C7UBBSu&ETdP-4`T zpt8okSq2qtXYG#W%Y_sS+5LNm?5kHJY}d%**D9e z!V%lcpmJSN{L{yk>s17}(pfsUZqN(D*w*KkXc5x5wvQ7TCWRWoxny0UpKW)nAWEWc zJg2YEM^T|O+fznB9B3}oO?n)P!-y860`ZzJi5I)QJ>8Rt4WageNrqwt*M#mpR#Z`Z z`cV0)mYG;!2y_phsVHB?>RCZ7#;H^|P3Q z1bOKcJHVs|XgjebOK3}cBA1XTsjVmLDnWiSEVky~p#~oLYr10UobdPwBtox<9VgxW z6L&$cZSl1wk7Sl4yMKrs+eap0w@g>-UHo_chWqWBy^2$KGUN*rk%ND-d=(=cxg;jr z(T=#>Ml99(POt3^%qMaU7)Bpr-R;^v! z{UxNee)}&X(!@FY12bBXm&_x_0@B zo5I zs*KnceI~8HZ>MNV5T>w5UQWLAnsn$0^l>?PS zv4_>c*aM5;E(R_3fEu{QG&|pauN+G8S(vp&{8G!bU3@nE!9UvvB5YJJE`_n+OMiZ- zR3+`nph2L2>Qza$zu`Bg`H+Sk_V6Df87W|)B>i9~ud1+p$eJt~K`^M>lT2JzOUkHZ zXvGEM&{7bVY<8Rm$l@I)D;0)K>r2CIJk(0s9`6o= z&X3JlkOtwog-ysA7NR3*Z{=jppls#^vg=qj+V=_jkYUlhv+d+>g6Z%wVC(?oG)&_bT@u`{+^x5qeSbZ|vbo zxgY%quW@_l_X*ymayw!aUcqj3E{Vik~C6Zvk?gw3bWFJeCOW;0l+Ere9H zIeCpnRyTJ;cewlradRQ~8c-kU3gvRGdp@IYn@m83i6|ONQ$Qs}Eo*Sx8oU5XEAug< z*rC7+iM~TsVQe5ZRudlApM>{Y&0gqSdnJK*8OcYnZVG; zKqp}`!N<%(V-8%n4+-aPPE1>7lu=Qismku-g8px6VV!JR2f@i9^Q0I$iSHfX>HwqfpL0dQBdGKyJqW@z3rG8Qxc0Rp;s=xzQ>P+j}A>5F^s z2|)sWDu?^f&(0TCaUx<{f=`I^1c8iS93P{Ra*tf(Dhhp+t5N1NY&v@^ynHmgJRF`6 z=?W%2r1a;%C^@L>ex#37Gr9X;;%e6FPTrs}d|8t%3XA}=IXMt_?@#^ftoE~W0zwEG#lzG|DmdNWV;lr8!$i% zuc2F17lqx?EuG&?uUN6cJW4kR+bBNJ+~L0R@x=%$7tU@xpQ|1OdN0Yaf5)8C5pQSS z4sxAjI%rn-J=>o73tvt2Gkp-3Gk2DvHb>EmDA&}6&sIgp?hmU6>tFYIhVg~)_zr4$ zw3vI|EX-hpZ669b0+dXmEig;HljcTCN909-QzwfSHMHW?Dey{|^sK@u_Erg}G#CmO z<=%<}6$ZnA_IDMWV)u>eVGz*v1GG5{$^gXsf!1)VwQy4)D&a8^oCo7hCFi?OSO-!h13T!Mx-E-T4XRpLWtCiC`+<4 zkEa+0D)}*#R_=#p_Wd`$r5sMG7g|aq&>7PtTLIwp{NKOlbDu|_{hdGlKJulvPmv#K z&58x}(dVjS?+nF?qos~%>=~KOS)02@OcXt*>7$_Bdo}sJc)H-}17W9Ll$_Ul#rE;= zT(ntoJnqF{HxBA20;1QUiTl$-M;0UZz3u?R;a9tuRNnIm*{~oC)3fSdHe7%QSrzbj zpiJwKs#N5A6nFu~GU_HIB9n}75Z#6#U%e;ms}#fYRh)1Rx8Y`&ZZ`WH#A=FHEKIQ@ zelmhDj%UMn@3L_}NBAluA!r6_SJ!CtL8FGmA%jAQCm4S43nj5|;YuO47r#KbNTF~D zi2_NvqgtWlyQUzfChWfDGuBiL_XMCsruU05kcJaH*Ga>%`t#B9 zL5Q^&LcGLoy`kg!2z(Yj@lu2y>@Mmo#9p#4w_;1;0e>X%Xmts+V69k_YjCVf14IKI z3LEWZqDlJcw6V6|V^f85kOFonolOa)?hQ{3Z&UHof~~tt>d{J+w7cF=I!yz$<|f0Y ztZA5&?6^HVc+i|sy@v3&fM9%^|I#~jy0vVd&?TZW%Ep{f0Ib5Xdr~FS%~y;y$}!?O za7b3R#ZMao12M*=3E)}g`JS;y%1n3TwnmH8JeriFChW08=Xf`{M;niAQBn%HqMd;K zEer2q&Lnh)%@Rr%ja5t(YGW1A@0noPi_a|Bhb&z3%~3mW>7K>G2t2nkFf#ixMx}&? zkKyfXLRJ%`jk6lV8F;&Q?GiH<^~I#eUS%ypMR2IgB!k{mo*O1t1PCaxxBk!B6@u8izqH zZ|y*eU`qx)VFzyL3AY89d9!ENu6zjoqz~j&hO-)BFc~}aTZACO!!Xn>p4-|J5}XxI z7cCT!73Pdn#l;#hHz_+BQ zhMP<;IVQ7+L*Oda4c$Jalx8r`a)Zx+nXIrXtEi?sMoU#%GnlNp++l}3p$>c$TFb1# zY8pvZ4lyeH8g;}TWaECSP+V{m8N8~rS$9}c`IMoM-AQVkmY2={K#TD7&7J>$9w&j$ z@LH}3vH)WOwLT=)ViFeK{kU&OG1Q3-^-n@s{1i^6&3pz>eUNYgv_{|~11Paq7@Lw# zmZw03ZC%u?1`FU;J6ryW>U>Nf{FwX!5ATkBU>WaEqPiJGACN-gGz;iHkO>t6pv+Y|V!XygOF@zKbaeN#pw|IL`7;1&knH?!<`G93=UFh7EV z;@EIN0~iZB)ab^!c_T#{F0T@b^l0m(ltajeb&D|$Awu{bf~bw9Wlu|Zky2nBnvJIl zS8D!8W4|ws#)Eb?X=!iSiO>ZL4Np@HcXd&W1Zs$uW<>tgqL!^%*u^Fv8I`}wD>YoF zTNoOO5OGs98uYOl=Po_rr%6B%-LcF73``@i%CSfnlcj#+z4uer85bHgOGmt^f>JS` ziz}>TPVqGhoR!_HWRo?d1@&5a6D22=_H3~UTvkl`CX&!WB%wL%6e5|1DD3T4cg$3G z;*U$oCy|nLtp3ahAFV$>Rz6^!Dj`KfOP(%K022&>euPgfs~O;gE8(tafqB8%Zft~v zrZIOJNSm5r>=_Y0GAcLOXj!A<(xPTF=|-m3VVYyUTuv)joA^Ma##;|1GH5kRnjb${ z)fUwv>o_BcAYTRn2}WldVYnqjD^_Qt>wjZ2Th&LFdW;S`_?X>L1qQ#$aZJrCPE9Ci z8@4st;YvF78;ycaVS8N}6PDwF){qSC?V>>3>Q*@(ZqZYHNLD3y1uO!c8KId)S}L)} zMu(d&dtI1K*fWjNF^}q$PNPS7!U+5^ybD6OjUIeuQytkJ0@oG?B3s5Oqo+!Xm669( zgD`|N>8T9iV<5$Mb=H^6JRE#g((~ATddUzzooWAPNy*>qlRkhM@&i~=55=hLf{eXn zetY?isSFJlE0a)e91S(7j}Z8b&;cf{Tm&dj7XWVIlnPE$T~!qnZI}(<9b58gMf^7e zlSH>MCg&t=Yp*s7VxpKJ3{fLw5G)fEBtnL)0kY2p8@pwq+a;1s+NKbZGA(|1XH_jU zBULMnNl#_mG5IyuC0t@`(X0;wW;L~bD=kRtG7(Un4X`#Y?jhYLKva~pgmgR*(iPxz zhae$sS%Sm}_GotT=jr%R9IvNJzg;h ziA=JQcq2ir+@Y#A#nu9tE7L+ zL_$Bdo9TYJ+$xdqL^)0a#7IB3%f2~XeseiWDH%=B$V!F9%SpIfkm3(Dw24n1Nxq_| zA~BxzRRr~EYI9?mowxY0f0<19y#xoFcvD